pax_global_header00006660000000000000000000000064147732601150014520gustar00rootroot0000000000000052 comment=d3243638e7dee5208cb4ea643610fa9bdb74123b hypre-2.33.0/000077500000000000000000000000001477326011500127345ustar00rootroot00000000000000hypre-2.33.0/.gitignore000066400000000000000000000022471477326011500147310ustar00rootroot00000000000000*.o *.obj *.a *.so *.out.* *.err.* *.err *.out *.perf *.btr *.patch .gdbinit build.sh update.sh make.log config.log config.status Makefile.config HYPRE_config.h autom4te.cache src/TAGS hypre/ install/ AUTOTEST/*.dir out/ .vscode .vs ############### # Documentation ############### src/docs/ref-manual/html/ src/docs/ref-manual-html/ src/docs/ref-manual.pdf src/docs/ref-manual/latex/ src/docs/ref-manual/xml/ src/docs/usr-manual-html/ src/docs/usr-manual/html/ src/docs/usr-manual.pdf src/docs/usr-manual/_build/ ############### # Executables ############### src/test/ams_driver src/test/ams_driver.exe src/test/ij src/test/ij.exe src/test/ij_assembly src/test/ij_assembly.exe src/test/ij_mv src/test/ij_mv.exe src/test/ij_mm src/test/ij_mm.exe src/test/maxwell_unscaled src/test/maxwell_unscaled.exe src/test/sstruct src/test/sstruct.exe src/test/sstruct_fac src/test/sstruct_fac.exe src/test/struct src/test/struct.exe src/test/struct_migrate src/test/struct_migrate.exe src/test/zboxloop src/test/zboxloop.exe src/examples/ex[0-9] src/examples/ex[0-9].exe src/examples/ex1[0-8] src/examples/ex1[0-8].exe src/examples/ex5f src/examples/ex5f.exe src/examples/ex12f src/examples/ex12f.exe hypre-2.33.0/.readthedocs.yml000066400000000000000000000014661477326011500160310ustar00rootroot00000000000000# Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) # .readthedocs.yml # Read the Docs configuration file # See https://docs.readthedocs.io/en/stable/config-file/v2.html for details # Required version: 2 # Set the version of Python and other tools you might need build: os: ubuntu-22.04 tools: python: "3.11" # Build documentation in the docs/ directory with Sphinx sphinx: configuration: src/docs/usr-manual/conf.py # Optionally build your docs in additional formats such as PDF and ePub formats: all # Optionally set the version of Python and requirements required to build your docs python: install: - requirements: src/docs/usr-manual/requirements.txt hypre-2.33.0/AUTOTEST/000077500000000000000000000000001477326011500142045ustar00rootroot00000000000000hypre-2.33.0/AUTOTEST/README.txt000066400000000000000000000042471477326011500157110ustar00rootroot00000000000000# Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) This directory contains scripts for running various tests on the hypre library. The scripts augment the 'runtest.sh' runtime tests in 'test/TEST_*'. Every test in this directory may be run manually by developers. Many of the scripts are also run as part of the nightly regression testing, currently developed and maintained in a separate git repository called 'hypre/autotest'. ===================== Organization: This directory mainly consists of a number of simple Bourne-shell scripts (the files with a '.sh' extension). Except for a few "special scripts" (below), each represents an individual test written by a hypre developer. The special scripts are as follows (note that they are the only scripts with "test" in their names): 1. 'test.sh' - Used to run individual tests. 2. 'cleantest.sh' - Used to clean up the output from a test (or tests). 3. 'renametest.sh' - Used to rename the output from a test. Usage information for every script (special or individual test) can be obtained by running it with the '-h' option (e.g., 'test.sh -h' or 'make.sh -h'). ===================== Writing tests: The rules for writing tests are given in the 'test.sh -h' usage information. When writing tests, keep in mind the design goals below, especially with respect to simplicity, flexibility, and portability. To write a new test, just use an existing test (e.g., 'default.sh') as a template and make the appropriate modifications. Try not to use the word "test" in the name of the script so that we can keep the convention of only the special scripts having this in their names. Try not to use absolute directory paths in the script. ===================== Design goals: - Minimal limitations on the types of tests that are possible. - Developers should be able to run the tests manually. - Minimal dependence on operating system and software tools (for portability). - Developers should be able to easily add new tests. - Simplicity and flexibility. hypre-2.33.0/AUTOTEST/basic.sh000077500000000000000000000040641477326011500156300ustar00rootroot00000000000000#!/bin/bash # Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) testname=`basename $0 .sh` # Echo usage information case $1 in -h|-help) cat < options for configure script -mo: options for make script -ro: call the run script with these options -eo: call the examples script with these options -h|-help prints this usage information and exits This script configures and compiles the source in {src_dir}, then optionally runs driver and example tests. Example usage: $0 ../src -ro: -ij -sstruct EOF exit ;; esac # Set src_dir src_dir=`cd $1; pwd` shift # Parse the rest of the command line copts="" mopts="" ropts="" eopts="" while [ "$*" ] do case $1 in -co:) opvar="copts"; shift ;; -mo:) opvar="mopts"; shift ;; -ro:) opvar="ropts"; rset="yes"; shift ;; -eo:) opvar="eopts"; eset="yes"; shift ;; *) eval $opvar=\"\$$opvar $1\" shift ;; esac done # Setup test_dir=`pwd` output_dir=`pwd`/$testname.dir rm -fr $output_dir mkdir -p $output_dir # Configure # NOTE: The use of 'eval' is needed to deal properly with nested quotes in argument lists eval ./test.sh configure.sh $src_dir $copts mv -f configure.??? $output_dir # Make ./test.sh make.sh $src_dir $mopts mv -f make.??? $output_dir # Run if [ -n "$rset" ]; then ./test.sh run.sh $src_dir $ropts mv -f run.??? $output_dir fi # Examples if [ -n "$eset" ]; then ./test.sh examples.sh $src_dir $eopts mv -f examples.??? $output_dir fi # Echo to stderr all nonempty error files in $output_dir for errfile in $( find $output_dir ! -size 0 -name "*.err" ) do echo $errfile >&2 done # Clean up ( cd $src_dir; make distclean ) hypre-2.33.0/AUTOTEST/check-case.sh000077500000000000000000000012261477326011500165320ustar00rootroot00000000000000#!/bin/bash # Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) testname=`basename $0 .sh` # Echo usage information case $1 in -h|-help) cat <&2 hypre-2.33.0/AUTOTEST/check-double.filters000066400000000000000000000001421477326011500201200ustar00rootroot00000000000000/_hypre_utilities.h: /HYPRE_utilities.h: /utilities/general.h: /utilities/mpistubs.c double-check hypre-2.33.0/AUTOTEST/check-double.sh000077500000000000000000000016141477326011500170720ustar00rootroot00000000000000#!/bin/bash # Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) testname=`basename $0 .sh` # Echo usage information case $1 in -h|-help) cat < check-double.files egrep '(^|[^[:alnum:]_-]+)double([^[:alnum:]_-]+|$)' `cat check-double.files` >&2 rm -f check-double.files hypre-2.33.0/AUTOTEST/check-glob-symb.filters000066400000000000000000000000231477326011500205370ustar00rootroot00000000000000FEI_mv/SuperLU/SRC hypre-2.33.0/AUTOTEST/check-glob-symb.sh000077500000000000000000000024331477326011500175130ustar00rootroot00000000000000#!/bin/bash # Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) testname=`basename $0 .sh` # Echo usage information case $1 in -h|-help) cat < check-glob-symb.temp else echo "check-glob-symb.sh can't find lib/libHYPRE.a" fi # find the '.o' file directories and add them to the output for filtering while read line do sym=`echo $line | awk -F: '{print $2}'` for dir in `find . -name $sym` do echo $line | awk -v dir=$dir -F: 'BEGIN {OFS=FS} {print $1,dir,$3}' done done < check-glob-symb.temp >&2 rm -f check-glob-symb.temp hypre-2.33.0/AUTOTEST/check-headers.filters000066400000000000000000000002361477326011500202650ustar00rootroot00000000000000mpicc mpif77 include/fortran_matrix.h include/multivector.h include/interpreter.h include/temp_multivector.h fatal: No names found, cannot describe anything. hypre-2.33.0/AUTOTEST/check-headers.sh000077500000000000000000000014501477326011500172310ustar00rootroot00000000000000#!/bin/bash # Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) testname=`basename $0 .sh` # Echo usage information case $1 in -h|-help) cat <&2 hypre-2.33.0/AUTOTEST/check-int.filters000066400000000000000000000004531477326011500174450ustar00rootroot00000000000000/f2c.h: /HYPRE_config.h: /printf.c: /_hypre_utilities.h: /HYPRE_utilities.h: /utilities/general.h: /utilities/mpistubs.c as long as too long long range interpolation long-range interpolation monstrously long get a long msg long rows return _InterlockedCompareExchange return _InterlockedExchangeAdd hypre-2.33.0/AUTOTEST/check-int.sh000077500000000000000000000017271477326011500164170ustar00rootroot00000000000000#!/bin/bash # Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) testname=`basename $0 .sh` # Echo usage information case $1 in -h|-help) cat < check-int.files egrep '(^|[^[:alnum:]_]+)int([^[:alnum:]_]+|$)' `cat check-int.files` >&2 egrep '(^|[^[:alnum:]_]+)long([^[:alnum:]_]+|$)' `cat check-int.files` >&2 rm -f check-int.files hypre-2.33.0/AUTOTEST/check-license.filters000066400000000000000000000005361477326011500202770ustar00rootroot00000000000000./AUTOTEST/.*.out ./AUTOTEST/.*.fil ./AUTOTEST/.*.err ./AUTOTEST/.*.log ./AUTOTEST/runtests-.* ./src/test/struct_migrate ./src/test/maxwell_unscaled ./src/test/sstruct_fac ./src/test/ams_driver ./src/test/zboxloop ./src/test/ij ./src/test/struct ./src/test/sstruct ./src/zerr ./src/config.log ./src/config.status .gitignore TVD.v3breakpoints .vscode hypre-2.33.0/AUTOTEST/check-license.sh000077500000000000000000000045671477326011500172540ustar00rootroot00000000000000#!/bin/bash # Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) testname=`basename $0 .sh` # Echo usage information case $1 in -h|-help) cat < check-license.files # Add these file back to the list egrep -LR "$LicStr" ./src/test/TEST_* | egrep '[.](sh|jobs)$' >> check-license.files egrep -LR "$LicStr" ./src/test/TEST_* | egrep 'TEST_.*/.*[.]in($|[.].*$)' >> check-license.files # Remove these individual files from the list and echo the result cat > check-license.remove <&2 rm -f check-license.remove check-license.files ### Next check for files that should not have the license, but do # blas and lapack '.c' files should not have an LLNL license egrep -lR "$LicStr" ./src/blas ./src/lapack | egrep '[.]/src/(blas|lapack)/.*[.]c' >&2 hypre-2.33.0/AUTOTEST/check-mem.sh000077500000000000000000000023631477326011500164000ustar00rootroot00000000000000#!/bin/bash # Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) testname=`basename $0 .sh` # Echo usage information case $1 in -h|-help) cat < check-mem.files egrep '(^|[^[:alnum:]_]+)malloc[[:space:]]*\(' `cat check-mem.files` >&2 egrep '(^|[^[:alnum:]_]+)calloc[[:space:]]*\(' `cat check-mem.files` >&2 egrep '(^|[^[:alnum:]_]+)realloc[[:space:]]*\(' `cat check-mem.files` >&2 egrep '(^|[^[:alnum:]_]+)free[[:space:]]*\(' `cat check-mem.files` >&2 rm -f check-mem.files hypre-2.33.0/AUTOTEST/check-mpi.filters000066400000000000000000000004551477326011500174420ustar00rootroot00000000000000/HYPRE_config.h: /_hypre_utilities.h: /HYPRE_utilities.h: /utilities/gpuMem.c: /utilities/mpistubs.c: /utilities/mpistubs.h: /parcsr_mv/par_csr_matvec.c:.*MPI_PACK /parcsr_mv/par_csr_matvec.c:.*MPI_HALO_EXC_SEND /parcsr_mv/par_csr_matvec.c:.*MPI_HALO_EXC_RECV /parcsr_mv/par_csr_matvec.c:.*MPI_UNPACK hypre-2.33.0/AUTOTEST/check-mpi.sh000077500000000000000000000016231477326011500164050ustar00rootroot00000000000000#!/bin/bash # Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) testname=`basename $0 .sh` # Echo usage information case $1 in -h|-help) cat < check-mpi.files egrep '(^|[^[:alnum:]_]+)MPI_' `cat check-mpi.files` | egrep -v 'MPI_Comm([^_]|$)' >&2 rm -f check-mpi.files hypre-2.33.0/AUTOTEST/cleantest.sh000077500000000000000000000023341477326011500165270ustar00rootroot00000000000000#!/bin/bash # Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) # Echo usage information case $1 in -h|-help) cat < %outdir%\lib-cmake.out rem build release version cd %srcdir%\cmbuild %MSBUILD% HYPRE.vcxproj /t:Rebuild /p:Configuration=Release > %outdir%\lib-release.out %MSBUILD% INSTALL.vcxproj /p:Configuration=Release >> %outdir%\lib-release.out rem build debug version cd %srcdir%\cmbuild %MSBUILD% HYPRE.vcxproj /t:Rebuild /p:Configuration=Debug > %outdir%\lib-debug.out %MSBUILD% INSTALL.vcxproj /p:Configuration=Debug >> %outdir%\lib-debug.out rem create error file - inspect output file lines with "Error(s)" substring cd %rundir% type NUL > cmake.err for %%f in (%outdir%\*.out) do ( set sum=0 for /f "tokens=1" %%i in ('findstr "Error(s)" %%f') do set /a sum+=%%i if %sum% gtr 0 @echo %%f >> cmake.err ) cd %rundir% endlocal hypre-2.33.0/AUTOTEST/cmake.filters000066400000000000000000000003671477326011500166640ustar00rootroot00000000000000fatal: No names found, cannot describe anything. Additional optimization may be attained by recompiling and specifying MAXMEM option with a value greater than 8192. warning: 1501-264 The options qsmp and O0 are incompatible. Option O0 is ignored. hypre-2.33.0/AUTOTEST/cmake.sh000077500000000000000000000044541477326011500156320ustar00rootroot00000000000000#!/bin/bash # Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) testname=`basename $0 .sh` drivers="ij sstruct struct ams_driver maxwell_unscaled sstruct_fac struct_migrate ij_assembly" # Echo usage information case $1 in -h|-help) cat < configuration options -mo: make options -ro: call the run script with these options -eo: call the examples script with these options -h|-help prints this usage information and exits This script uses cmake to configure and compile the source in {root_dir}/src, then optionally runs driver and example tests. Example usage: $0 .. -co -DCMAKE_BUILD_TYPE=Debug -ro: -ij EOF exit ;; esac # Set root_dir root_dir=`cd $1; pwd` shift # Parse the rest of the command line copts="-DHYPRE_BUILD_TESTS=ON" mopts="" ropts="" eopts="" while [ "$*" ] do case $1 in -co:) opvar="copts"; shift ;; -mo:) opvar="mopts"; shift ;; -ro:) opvar="ropts"; rset="yes"; shift ;; -eo:) opvar="eopts"; eset="yes"; shift ;; *) eval $opvar=\"\$$opvar $1\" shift ;; esac done # Setup test_dir=`pwd` output_dir=`pwd`/$testname.dir rm -fr $output_dir mkdir -p $output_dir cd $root_dir root_dir=`pwd` # Clean up the build directories (do it from root_dir as a precaution) cd $root_dir rm -fr build/* # Clean up the previous install cd $root_dir rm -fr src/hypre # Configure cd $root_dir/build eval cmake $copts ../src make $mopts install cd $test_dir # Run if [ -n "$rset" ]; then ./test.sh run.sh $root_dir/src $ropts mv -f run.??? $output_dir fi # Examples if [ -n "$eset" ]; then ./test.sh examples.sh $root_dir/src $eopts mv -f examples.??? $output_dir fi # Echo to stderr all nonempty error files in $output_dir for errfile in $( find $output_dir ! -size 0 -name "*.err" ) do echo $errfile >&2 done # Clean up cd $root_dir rm -fr build/* rm -fr src/hypre ( cd $root_dir/src/test; rm -f $drivers; ./cleantest.sh ) hypre-2.33.0/AUTOTEST/configure.filters000066400000000000000000000001371477326011500175600ustar00rootroot00000000000000fatal: No names found, cannot describe anything. WARNING: unknown Fortran name-mangling scheme hypre-2.33.0/AUTOTEST/configure.sh000077500000000000000000000021171477326011500165250ustar00rootroot00000000000000#!/bin/bash # Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) testname=`basename $0 .sh` # Echo usage information case $1 in -h|-help) cat < $output_dir/sh.env hypre-2.33.0/AUTOTEST/docs.sh000077500000000000000000000015051477326011500154740ustar00rootroot00000000000000#!/bin/bash # Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) testname=`basename $0 .sh` # Echo usage information case $1 in -h|-help) cat < /dev/null 2>&1 # Test documentation build in docs/ cd docs make clean make # Test documentation build in examples/docs/ cd ../examples/docs make distclean make hypre-2.33.0/AUTOTEST/examples.sh000077500000000000000000000041241477326011500163620ustar00rootroot00000000000000#!/bin/bash # Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) testname=`basename $0 .sh` tests="" # Echo usage information case $1 in -h|-help) cat <] where: {src_dir} is the hypre source directory - run (test = default, bigint, maxdim, complex) -spack compile and link drivers to spack build -h|-help prints this usage information and exits This script builds the hypre example codes in {src_dir}/examples and runs the example regression tests in test/TEST_examples. Example usage: $0 ../src -maxdim EOF exit ;; esac # Set src_dir src_dir=`cd $1; pwd` shift # Parse the rest of the command line while [ "$*" ] do case $1 in -rt) shift break ;; -spack) shift; spackdir="$1"; shift ;; -*) tname=`echo $1 | sed 's/-//'` tests="$tests $tname" shift ;; esac done # If no tests were specified, run default if [ "$tests" = "" ]; then tests="default" fi # Setup output_dir=`pwd`/$testname.dir rm -fr $output_dir mkdir -p $output_dir # Run make in the examples directory cd $src_dir/examples make clean mopt="" if [ -n "$spackdir" ]; then mopt="HYPRE_DIR=$spackdir" fi for tname in $tests do if [ "$tname" = "gpu" ]; then make -j "use_cuda=1" $mopt $tname else make $mopt $tname fi done # Run the examples regression test cd $src_dir/test for tname in $tests do ./runtest.sh $@ TEST_examples/$tname.sh done # Collect all error files from the tests for errfile in $( find TEST_examples -name "*.err" -o -name "*.fil" -o -name "*.out*" ) do mkdir -p $output_dir/`dirname $errfile` mv -f $errfile $output_dir/$errfile done # Echo to stderr all nonempty error files in $output_dir for errfile in $( find $output_dir ! -size 0 -name "*.err" ) do echo $errfile >&2 done hypre-2.33.0/AUTOTEST/klocwork.filters000066400000000000000000000000511477326011500174250ustar00rootroot00000000000000icc: command line warning .*: overriding hypre-2.33.0/AUTOTEST/klocwork.sh000077500000000000000000000041501477326011500163760ustar00rootroot00000000000000#!/bin/bash # Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) testname=`basename $0 .sh` # Echo usage information case $1 in -h|-help) cat <&2 done cd $src_dir # do the static analysis kwinject -T hypre.trace make kwinject -t hypre.trace -o hypre.out mkdir tables kwbuildproject --license-host swordfish --host rzcereal3 --port 8066 -j 4 --project hypre -o tables hypre.out # save and check tables/build.log and tables/parse_errors.log files cp tables/build.log tables/parse_errors.log $output_dir cat tables/parse_errors.log >&2 # upload the results to the host kwadmin --host rzcereal3 --port 8066 load hypre tables # get the list of build names (this assumes that the command 'list-builds' # returns a reverse chronological listing) build_list=`kwadmin list-builds hypre` # # The following explicitly sorts the list, assuming the prefix is 'build_' # kwadmin list-builds hypre | awk 'BEGIN {FS="_"}; {print $2}' | sort -n -r | awk '{print "build_" $1}' # generate the list of new issues build_name=`echo $build_list | awk '{print $1}'` kwinspectreport --license-host swordfish --host rzcereal3 --port 8066 --text hyprenew.txt --state new --project hypre --build $build_name cat hyprenew.txt >&2 # Delete all but the most recent 5 builds count=0 for build in $build_list do count=`expr $count + 1` if [ $count -gt 5 ]; then kwadmin delete-build hypre $build fi done hypre-2.33.0/AUTOTEST/link.filters000066400000000000000000000004631477326011500165360ustar00rootroot00000000000000End of Compilation Compilation successful for file Additional optimization may be attained by recompiling and specifying MAXMEM option with a value greater than 8192. The device linker only supports static linking. Any device code placed into a shared library by the qmkshrobj option will be inaccessible. hypre-2.33.0/AUTOTEST/link.sh000077500000000000000000000012661477326011500155050ustar00rootroot00000000000000#!/bin/bash # Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) testname=`basename $0 .sh` # Echo usage information case $1 in -h|-help) cat <&2 done hypre-2.33.0/AUTOTEST/machine-lassen-cuda.sh000077500000000000000000000150041477326011500203440ustar00rootroot00000000000000#!/bin/sh # Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) testname=`basename $0 .sh` # Echo usage information case $1 in -h|-help) cat <&2 done hypre-2.33.0/AUTOTEST/machine-mac.sh000077500000000000000000000022741477326011500167120ustar00rootroot00000000000000#!/bin/bash # Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) testname=`basename $0 .sh` # Echo usage information case $1 in -h|-help) cat <&2 done hypre-2.33.0/AUTOTEST/machine-rzhound.sh000077500000000000000000000037571477326011500176520ustar00rootroot00000000000000#!/bin/bash # Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) testname=`basename $0 .sh` # Echo usage information case $1 in -h|-help) cat <&2 done hypre-2.33.0/AUTOTEST/machine-syrah.sh000077500000000000000000000040351477326011500172750ustar00rootroot00000000000000#!/bin/bash # Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) testname=`basename $0 .sh` # Echo usage information case $1 in -h|-help) cat <&2 done hypre-2.33.0/AUTOTEST/machine-tioga.sh000077500000000000000000000066331477326011500172600ustar00rootroot00000000000000#!/bin/bash # Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) testname=`basename $0 .sh` # Echo usage information case $1 in -h|-help) cat <&2 done hypre-2.33.0/AUTOTEST/machine-tux-compilers.sh000077500000000000000000000045031477326011500207620ustar00rootroot00000000000000#!/bin/bash # Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) testname=`basename $0 .sh` # Echo usage information case $1 in -h|-help) cat <&2 done hypre-2.33.0/AUTOTEST/machine-tux-exlibs.sh000077500000000000000000000037631477326011500202620ustar00rootroot00000000000000#!/bin/bash # Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) testname=`basename $0 .sh` # Echo usage information case $1 in -h|-help) cat <&2 done hypre-2.33.0/AUTOTEST/machine-tux-spack.filters000066400000000000000000000000151477326011500211130ustar00rootroot00000000000000==> Warning: hypre-2.33.0/AUTOTEST/machine-tux-spack.sh000077500000000000000000000044241477326011500200700ustar00rootroot00000000000000#!/bin/bash # Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) testname=`basename $0 .sh` # Echo usage information case $1 in -h|-help) cat < test.yaml # grep ' hash:' test.yaml | sed -e 's/^.*: /\//' | xargs spack mark -e # spack gc -y # grep ' hash:' test.yaml | sed -e 's/^.*: /\//' | xargs spack mark -i # rm -f test.yaml # spack clean --all spack uninstall -yR $superludistspec # Echo to stderr all nonempty error files in $output_dir for errfile in $( find $output_dir ! -size 0 -name "*.err" ) do echo $errfile >&2 done hypre-2.33.0/AUTOTEST/machine-tux.sh000077500000000000000000000131111477326011500167620ustar00rootroot00000000000000#!/bin/bash # Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) testname=`basename $0 .sh` # Echo usage information case $1 in -h|-help) cat < basic.tmp mv basic.tmp basic.err ./renametest.sh basic $output_dir/basic--enable-complex co="--with-openmp" RO="-ams -ij -sstruct -struct -lobpcg -rt -D HYPRE_NO_SAVED -nthreads 2" ./test.sh basic.sh $src_dir -co: $co -mo: $mo -ro: $RO ./renametest.sh basic $output_dir/basic--with-openmp co="--with-openmp --enable-hopscotch" RO="-ij -sstruct -struct -lobpcg -rt -D HYPRE_NO_SAVED -nthreads 2" ./test.sh basic.sh $src_dir -co: $co -mo: $mo -ro: $RO ./renametest.sh basic $output_dir/basic--with-concurrent-hopscotch co="--enable-single --enable-debug" ./test.sh basic.sh $src_dir -co: $co -mo: $mo -ro: -single ./renametest.sh basic $output_dir/basic--enable-single co="--enable-longdouble --enable-debug" ./test.sh basic.sh $src_dir -co: $co -mo: $mo -ro: -longdouble ./renametest.sh basic $output_dir/basic--enable-longdouble co="--enable-debug CC=mpiCC" ./test.sh basic.sh $src_dir -co: $co -mo: $mo -ro: $ro -eo: $eo ./renametest.sh basic $output_dir/basic-debug-cpp co="--enable-bigint --enable-debug" ./test.sh basic.sh $src_dir -co: $co -mo: $mo -ro: $ro -eo: -bigint ./renametest.sh basic $output_dir/basic--enable-bigint co="--enable-mixedint --enable-debug" RO="-ams -ij-mixed -sstruct-mixed -struct -lobpcg-mixed" ./test.sh basic.sh $src_dir -co: $co -mo: $mo -ro: $RO ./renametest.sh basic $output_dir/basic--enable-mixedint co="--enable-debug --with-print-errors" ./test.sh basic.sh $src_dir -co: $co -mo: $mo -ro: $ro -error -rt -valgrind ./renametest.sh basic $output_dir/basic--valgrind # CMake build and run tests mo="-j" ro="-ams -ij -sstruct -struct -lobpcg" eo="" co="" ./test.sh cmake.sh $root_dir -co: $co -mo: $mo ./renametest.sh cmake $output_dir/cmake-default co="-DHYPRE_SEQUENTIAL=ON" ./test.sh cmake.sh $root_dir -co: $co -mo: $mo ./renametest.sh cmake $output_dir/cmake-sequential co="-DHYPRE_SHARED=ON" ./test.sh cmake.sh $root_dir -co: $co -mo: $mo ./renametest.sh cmake $output_dir/cmake-shared co="-DHYPRE_SINGLE=ON" ./test.sh cmake.sh $root_dir -co: $co -mo: $mo -ro: -single ./renametest.sh cmake $output_dir/cmake-single co="-DHYPRE_LONG_DOUBLE=ON" ./test.sh cmake.sh $root_dir -co: $co -mo: $mo -ro: -longdouble ./renametest.sh cmake $output_dir/cmake-longdouble co="-DCMAKE_BUILD_TYPE=Debug" ./test.sh cmake.sh $root_dir -co: $co -mo: $mo -ro: $ro ./renametest.sh cmake $output_dir/cmake-debug co="-DHYPRE_BIGINT=ON" ./test.sh cmake.sh $root_dir -co: $co -mo: $mo -ro: $ro ./renametest.sh cmake $output_dir/cmake-bigint # cmake build doesn't currently support maxdim # cmake build doesn't currently support complex # Echo to stderr all nonempty error files in $output_dir for errfile in $( find $output_dir ! -size 0 -name "*.err" ) do echo $errfile >&2 done hypre-2.33.0/AUTOTEST/machine-vs-pro.bat000077500000000000000000000033001477326011500175230ustar00rootroot00000000000000@echo off rem Copyright (c) 1998 Lawrence Livermore National Security, LLC and other rem HYPRE Project Developers. See the top-level COPYRIGHT file for details. rem rem SPDX-License-Identifier: (Apache-2.0 OR MIT) setlocal rem This script can be run from anywhere, but must live in the same directory rem (e.g., AUTOTEST) as supporting batch scripts like 'cmake.bat' rem directory where script is being run set rundir=%cd% rem directory where script is located cd %~dp0 set scriptdir=%cd% rem source directory passed in as argument 1 cd %rundir% cd %1 set srcdir=%cd% rem output directory is a subdirectory of rundir set outdir=%rundir%\machine-vs-pro.dir rem create clean output directory if exist %outdir% rmdir /s /q %outdir% mkdir %outdir% rem run the cmake.bat script from rundir in a subshell to avoid overwriting variables rem (i.e., use 'cmd /c') cd %rundir% cmd /c %scriptdir%\cmake.bat %srcdir% " " move %rundir%\cmake.dir %outdir%\cmake-default.dir move %rundir%\cmake.err %outdir%\cmake-default.err cmd /c %scriptdir%\cmake.bat %srcdir% "-DHYPRE_USING_OPENMP=ON" move %rundir%\cmake.dir %outdir%\cmake-openmp.dir move %rundir%\cmake.err %outdir%\cmake-openmp.err cmd /c %scriptdir%\cmake.bat %srcdir% "-DHYPRE_SEQUENTIAL=ON" move %rundir%\cmake.dir %outdir%\cmake-sequential.dir move %rundir%\cmake.err %outdir%\cmake-sequential.err cmd /c %scriptdir%\cmake.bat %srcdir% "-DHYPRE_BIGINT=ON" move %rundir%\cmake.dir %outdir%\cmake-bigint.dir move %rundir%\cmake.err %outdir%\cmake-bigint.err rem create error file - check file size of cmake error files cd %rundir% type NUL > machine-vs-pro.err for %%f in (%outdir%\*.err) do ( if %%~zf gtr 0 @echo %%f >> machine-vs-pro.err ) cd %rundir% endlocal hypre-2.33.0/AUTOTEST/make.filters000066400000000000000000000017011477326011500165120ustar00rootroot00000000000000slu_util.c: autoconf has been disabled automake has been disabled autoheader has been disabled warning: \[options\] bootstrap class path not set in conjunction with 1 warning warning: warning: feupdateenv is not implemented and will always fail ranlib: file: lib.*\(.*\) has no symbols /tmp/.*: Assembler messages: /tmp/.*: Warning: Additional NOP may be necessary to workaround Itanium processor A/B step errata ltdl.c:.*: warning: function declaration isn't a prototype ltdl.c:* Additional optimization may be attained by recompiling and specifying MAXMEM option with a value greater than 8192. WARNING in dReadValues: Infinite loop. Program may not stop. WARNING in dReadVector: Infinite loop. Program may not stop. icc: command line warning .*: overriding WARNING: no debugging flags detected The device linker only supports static linking. Any device code placed into a shared library by the qmkshrobj option will be inaccessible. tcmalloc: large alloc hypre-2.33.0/AUTOTEST/make.sh000077500000000000000000000020271477326011500154610ustar00rootroot00000000000000#!/bin/bash # Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) testname=`basename $0 .sh` # Echo usage information case $1 in -h|-help) cat < compile and link drivers to spack build -h|-help prints this usage information and exits This script runs make clean; make [options] in {src_dir}. Example usage: $0 ../src test EOF exit ;; esac # Setup src_dir=`cd $1; pwd` shift # Parse the rest of the command line mopts="" while [ "$*" ] do case $1 in -spack) shift; spackdir="$1"; shift ;; *) mopts="$mopts $1"; shift ;; esac done # Run make cd $src_dir make clean if [ -n "$spackdir" ]; then cd $src_dir/test make HYPRE_BUILD_DIR="$spackdir" $mopts else make $mopts fi hypre-2.33.0/AUTOTEST/renametest.sh000077500000000000000000000017451477326011500167210ustar00rootroot00000000000000#!/bin/bash # Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) # Echo usage information case $1 in -h|-help) cat <] where: {src_dir} is the hypre source directory - run (test = ams, fac, ij, sstruct, struct) -all run all tests (default behavior) -h|-help prints this usage information and exits This script runs runtest.sh in {src_dir}/test with optional parameters. Example usage: $0 ../src -rt -D HYPRE_NO_SAVED EOF exit ;; esac # Set src_dir src_dir=$1; shift # Parse the rest of the command line while [ "$*" ] do case $1 in -all) shift ;; -rt) shift break ;; -*) tests="$tests $1" shift ;; esac done # If no tests were specified, run all tests if [ "$tests" = "" ]; then tests="-ams -fac -ij -sstruct -struct" fi # Setup test_dir=`pwd` output_dir=`pwd`/$testname.dir rm -fr $output_dir mkdir -p $output_dir # Run the test drivers cd $src_dir/test ./cleantest.sh for tname in $tests do rtests=`cat $test_dir/runtests$tname` ./runtest.sh $@ `echo $rtests` done # Collect all error files from the tests for errfile in $( find TEST* -name "*.err" -o -name "*.fil" -o -name "*.out*" ) do mkdir -p $output_dir/`dirname $errfile` mv -f $errfile $output_dir/$errfile done # Echo to stderr all nonempty error files in $output_dir for errfile in $( find $output_dir ! -size 0 -name "*.err" ) do echo $errfile >&2 done hypre-2.33.0/AUTOTEST/runtests-ams000066400000000000000000000000171477326011500165720ustar00rootroot00000000000000TEST_ams/*.sh hypre-2.33.0/AUTOTEST/runtests-bench000066400000000000000000000000201477326011500170630ustar00rootroot00000000000000TEST_bench/*.sh hypre-2.33.0/AUTOTEST/runtests-error000066400000000000000000000000201477326011500171350ustar00rootroot00000000000000TEST_error/*.sh hypre-2.33.0/AUTOTEST/runtests-fac000066400000000000000000000000171477326011500165430ustar00rootroot00000000000000TEST_fac/*.sh hypre-2.33.0/AUTOTEST/runtests-gpumemcheck000066400000000000000000000000271477326011500203030ustar00rootroot00000000000000TEST_gpumemcheck/*.sh hypre-2.33.0/AUTOTEST/runtests-ij000066400000000000000000000000161477326011500164130ustar00rootroot00000000000000TEST_ij/*.sh hypre-2.33.0/AUTOTEST/runtests-ij-gpu000066400000000000000000000000211477326011500172000ustar00rootroot00000000000000TEST_ij/[^f]*.sh hypre-2.33.0/AUTOTEST/runtests-ij-mixed000066400000000000000000000000221477326011500175140ustar00rootroot00000000000000TEST_ij/[^n]*.sh hypre-2.33.0/AUTOTEST/runtests-ij-noilu000066400000000000000000000000441477326011500175400ustar00rootroot00000000000000TEST_ij/[^i]*.sh TEST_ij/interp.sh hypre-2.33.0/AUTOTEST/runtests-lobpcg000066400000000000000000000000221477326011500172540ustar00rootroot00000000000000TEST_lobpcg/*.sh hypre-2.33.0/AUTOTEST/runtests-lobpcg-mixed000066400000000000000000000000261477326011500203640ustar00rootroot00000000000000TEST_lobpcg/[^n]*.sh hypre-2.33.0/AUTOTEST/runtests-longdouble000066400000000000000000000000261477326011500201440ustar00rootroot00000000000000TEST_longdouble/*.sh hypre-2.33.0/AUTOTEST/runtests-single000066400000000000000000000000221477326011500172670ustar00rootroot00000000000000TEST_single/*.sh hypre-2.33.0/AUTOTEST/runtests-sstruct000066400000000000000000000000231477326011500175160ustar00rootroot00000000000000TEST_sstruct/*.sh hypre-2.33.0/AUTOTEST/runtests-sstruct-mixed000066400000000000000000000001141477326011500206230ustar00rootroot00000000000000TEST_sstruct/[^n]*.sh TEST_sstruct/neighborpart.sh TEST_sstruct/neumann.sh hypre-2.33.0/AUTOTEST/runtests-struct000066400000000000000000000000211477326011500173310ustar00rootroot00000000000000TEST_struct/*.sh hypre-2.33.0/AUTOTEST/runtests-superlu000066400000000000000000000000231477326011500175060ustar00rootroot00000000000000TEST_superlu/*.sh hypre-2.33.0/AUTOTEST/test.sh000077500000000000000000000041541477326011500155260ustar00rootroot00000000000000#!/bin/bash # Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) while [ "$*" ] do case $1 in -h|-help) cat <"$testname.out" 2>"$testname.err" # Filter misleading error messages if [ -e $testname.filters ]; then if (egrep -f $testname.filters $testname.err > /dev/null) ; then echo "This file contains the original $testname.err before filtering" \ > $testname.fil cat $testname.err >> $testname.fil mv $testname.err $testname.tmp egrep -v -f $testname.filters $testname.tmp > $testname.err rm -f $testname.tmp fi fi hypre-2.33.0/CHANGELOG000066400000000000000000001356221477326011500141570ustar00rootroot00000000000000# Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) #============================================================================= # This file chronicles user-level changes, beginning with the most recent. # ============================================================================= Version 2.33.0 released 2025/04/03 - Added verbosity control to error printing - Updated cmake to provide full build support (matches autotools) - Added early assembly feature to IJ to minimize memory use - Added new IJ matrix and vector APIs - Various bug fixes #==================================== Version 2.32.0 released 2024/10/08 - New MGR features and updates - New filtering option to AMG for block-diagonal preconditioning - New memory usage monitoring functions - Added non-UVM support for ILUT and HMIS coarsening - Various bug fixes #==================================== Version 2.31.0 released 2024/02/14 - Added iterative ILU0 option - Refactored MGR interpolation, added column-sum restriction, improved robustness - Added new print level options for MGR - Updated IJ vector I/O functions - Updated default compiler list for configure - Added a feature to avoid GPU device initialization for CPU runs - Improved FSAI performance on GPUs - Added MGR function to set the F-relaxation solver on a specific level - Various bug fixes #==================================== Version 2.30.0 released 2023/11/06 - Added FSAI support with CUDA and HIP - Added MAGMA option to FSAI - Added Binary I/O functions for IJ matrices and vectors - Added a convergent l1-hybrid symmetric Gauss-Seidel smoother to BoomerAMG - Added CUDA support to dense direct solver options in BoomerAMG and MGR - Added SYCL support for triangular solves (enabling Gauss-Seidel, ILU, etc.) and Chebyshev relaxation - Improved MGR statistics and data printing - Added CG options to ignore errors, and added a flexible CG version - Added superlu_dist support on GPUs - Various bug fixes #==================================== Version 2.29.0 released 2023/06/22 - Added ILU support for AMD GPUs - Added new error handling feature to print messages to a memory buffer - Enabled more support with SYCL: MGR, AMS/ADS/ADE, AIR, ... - Added MAGMA support - Added support for CUDA 12 - Added HYPRE_Initialized/HYPRE_Finalized functions - Ported MGR features to CUDA and HIP: Non-Galerkin options, block diagonal interpolation, and block Jacobi relaxation - Added non-UVM device support for ILU and MGR - Added cuSOLVER and rocSOLVER support - Various bug fixes #==================================== Version 2.28.0 released 2023/03/17 - Added new Gaussian elimination options for F-relaxation in MGR. - Switched to read-the-docs theme for documentation. - Using autoconf 2.71 now to generate 'configure' script. - Improved error handling for multi-component vectors. - Various bug fixes #==================================== Version 2.27.0 released 2022/12/20 - New SStructMatrix and SStructVector AddFEMBoxValues() routines to set finite element stiffness matrices a box at a time for better performance. - Added environment variable HYPRE_BRANCH_NAME. - Added HIP support to the MGR solver. - Added Jacobi iterative solver approach for ILU smoothing/preconditioning. - Various optimizations for IJ solvers - Various CMake build system updates - Various bug fixes #==================================== Version 2.26.0 released 2022/10/14 - Added a new feature of BoomerAMG (L1-Jacobi and Chebyshev smoothers) and Krylov subspace solvers with multiple right-hand-side vectors; - Optimized parallel sparse matrix/multi-component vector multiplication on CPUs and GPUs. - Added SYCL support for the IJ interface and various AMG operators; - Added a runtime switch feature between CPU and GPU; - Added CMAKE support for CUDA; - Optimized the performance of AMG interpolation truncation routines with CUDA/HIP; - Optimized the performance of hypre's SpGEMM kernels on NVIDIA/AMD GPUs; - Various bug fixes #==================================== Version 2.25.0 released 2022/06/15 - New features in MGR: multilevel assignment of solver options, block Jacobi for smoothers and inter-grid transfer, CPR, non-Galerkin. - New factorized sparse approximate inverse (FSAI) solver/preconditioner. Can also be used as a smoother in BoomerAMG. - Added various optimizations for Nvidia and AMD GPUs by removing synchronizations, reducing memory transfers, and adding faster custom kernels. - Ported parallel matrix matrix multiplicaton to SYCL. - Infrastructure changes to unify GPU implementations across CUDA/HIP/SYCL. - Added SStruct I/O routines. - Various bug fixes. #==================================== Version 2.24.0 released 2022/02/11 - Added SYCL support for the structured interface and solvers - Added SYCL support for AMG solve phase. - Enabled GPU setup for the MGR solver. - Enabled new interpolation options for MGR (L1-Jacobi, MM-ext, MM-ext+i, MM-ext+e) for both CPU and GPU. - Added GPU examples for Fortran users ('ex5f.f' and 'ex12f.f'). - Added source file indentation with Artistic Style (astyle). - Various bug fixes. #==================================== Version 2.23.0 released 2021/10/01 - Added GPU support for multipass interpolation. - Added new header file variables (HYPRE_DEVELOP_STRING, HYPRE_DEVELOP_NUMBER, HYPRE_DEVELOP_BRANCH) to help users working with the development branch. - Added rocsparse triangular solve required for Gauss-Seidel relaxation when using hip and rocsparse on AMD GPUs. - Various bug fixes. #==================================== Version 2.22.1 released 2021/08/20 - Ported Neumann version of AIR to the GPU. - Re-implemented ParCSR eigenvalue estimation used in Chebyshev relaxation. - Added IJMatrix Add, Norm, and Transpose functions. - Simplified the ParCSRMatrix/Vector code by removing ownership info. - Added GPU support for Chebyshev relaxation. - Various bug fixes. #==================================== Version 2.22.0 released 2021/06/22 - Added GPU support for AMS, ADS, and AME solvers. - Added mixedint support for GPUs. - Fixed GPU issues with AMG-DD solver. - Various bug fixes. #==================================== Version 2.21.0 released 2021/05/25 - Changed GPU defaults and changed default CUDA arch to 70. - Added new interfaces: HYPRE_SetSpGemmUseCusparse(1) to select cuSPARSE SpGeMM or hypre's MM (if 0); HYPRE_SetUseGpuRand(1) to use cuRand for PMIS or CPU RNG (if 0); HYPRE_SetMemoryLocation to select default memory location; HYPRE_SetExecutionPolicy to select default execution policy. - Changed configure option: --enable-cub --> --enable-device-memory-pool; --enable-nvtx --> --enable-gpu-profiling - Added new configure options: --with-cuda-home=DIR; --with-gpu-arch=ARG - Added GPU build options to CMake. - Added a new HYPRE_RELEASE_NUMBER macro. - Improved support for ParCSR matrices with many zero rows. - Improved BoomerAMG setup efficiency when there are many off-diagonal coefficients. - Fixed a bug in the strength matrix generation for nodal AMG. - Removed unified virtual memory (UVM) requirement from GPU implementation. - Removed --enable-global-partition option. - Added UMPIRE support for memory pooling on GPUs. - Added HIP/AMD support. - New CUDA based triangular smoothers. - New parallel ILU solver features and GPU support. - Added CUDA 11 support. - Various bug fixes. #==================================== Version 2.20.0 released 2020/09/24 - New matrix-based interpolation routines for AMG (CPU and GPU) - Added GPU support for aggressive coarsening in AMG - New AMG-DD solver - Improved distributed sparse matrix-matrix and triple-matrix product performance on GPUs - IJMatrix/Vector assembly on GPUs (with pointers to GPU memory) - Updated caliper usage - Separated C and C++ headers - Various bug fixes. #==================================== Version 2.19.0 released 2020/05/26 - Updated to support superlu-dist version to 6.3.1 - Moved reference manual API to online documentation - New AMG features to keep specified F-points and/or C-points. - Added GPU support for AMG setup and several interpolation approaches. - New parallel ILU solvers and smoothers. - New MGR features. - Added several interpolation routines based on matrix-matrix interpolations. - Various bug fixes. #==================================== Version 2.18.2 released 2019/10/28 - Fixed mixedint bugs. #==================================== Version 2.18.1 released 2019/10/15 - Various bug fixes. #==================================== Version 2.18.0 released 2019/09/27 - Ported BoomerAMG setup to run on GPUs. Only a subset of setup phase features are currently available. - Updated CMake to support more of the features available in configure/make. - Added RecomputeResidual options to several hybrid solvers. - Various bug fixes. #==================================== Version 2.17.0 released 2019/07/10 - Changed open source license to dual MIT/Apache-2.0 - Removed FEI_mv/ml subdirectory and several FEI header files - Various bug fixes. #==================================== Version 2.16.0 released 2019/03/20 - Added new '--enable-mixedint' configure option. This introduces a HYPRE_BigInt type that is set to 'long long int' (when configured with this option) to enable the solution of linear systems that have more than 2 billion unknowns, while reducing the memory use and computational costs needed with the previous option '--enable-bigint' (still available). Note that this option currently disables Euclid, ParaSails, pilut, and CGC coarsening in BoomerAMG. - Various GPU optimizations. - Changed documentation to use Sphinx and Doxygen. The User Manual is available online through the hypre GitHub repo. The Reference Manual is not yet online. - Various bug fixes. #==================================== Version 2.15.1 released 2018/10/19 - Added hypre version functions: HYPRE_Version(), HYPRE_VersionNumber() - Various bug fixes. #==================================== Version 2.15.0 released 2018/09/21 - Added new system interface routines to reduce copies and improve threading: SetBoxValues2() for Struct/SStruct and IJSetValues2(). - GPU-related changes: improved build process; fixed Raja and Kokkos ports of Struct/SStruct; new boxloop reduction implementation without unified memory. - Added a new GMRES variant COGMRES, with reduced communication, which is based on classical Gram-Schmidt with a reorthogonalization option. - Added functions HYPRE_ParVectorGetValues, HYPRE_ParCSRPCGGetResidual, HYPRE_ParCSRGMRESGetResidual, HYPRE_ParCSRBiCGSTABGetResidual, and more. - Various bug fixes. #==================================== Version 2.14.0 released 2018/03/16 - New GPU release uses CUDA or OpenMP4.5. AMG setup phase is not yet ported. - New AIR AMG solver. - Added SuperLU_Dist as a coarse grid solver option. - Various bug fixes. #==================================== Version 2.13.0 released 2017/10/20 - Added new multigrid reduction (MGR) solver - Added BoomerAMG feature SetCpointsToKeep() to force specific points to keep on all coarse grids, up to a specified coarse level. - Changed defaults in AMG Hybrid solver to match BoomerAMG defaults - Updated hypre blas/lapack implementation - Removed SuperLU/DSuperLU from the distribution and updated the FEI code to work with external installations of SuperLU/SuperLU_DIST (version 5.2.1) - Fixed a bug in Euclid - Fixed Windows Visual Studio compile (version 2017) #==================================== Version 2.12.1 released 2017/09/29 - Added support for single and quad precision floating point numbers - Added weighted Jacobi (relax_type 7) to be usable on GPU in BoomerAMG - Various bug fixes #==================================== Version 2.12.0 released 2017/05/02 - Added GPU support to hypre. The Struct and SStruct code can use CUDA, RAJA, or KOKKOS. The ParCSR code uses CUDA. The BoomerAMG setup phase is not yet ported to the GPU. This release uses unified memory. #==================================== Version 2.11.2 released 2017/03/13 - Changed the defaults in hypre to HMIS with ext+i(4) interpolation - Added a routine HYPRE_BoomerAMGSetOldDefault to easily get old defaults - Added Caliper instrumentation - Various bug fixes #==================================== Version 2.11.1 released 2016/06/09 - Fixed one more bug related to SStructSetSharedPart and SetNeighborPart - Fixed a bug in PFMG red/black relaxation for 2D problems - Fixed various other bugs in ParCSR and the FEI - Fixed configure option --without-MLI and removed option --with-examples - Modified code to enable compilation with a C++ compiler. - Added several missing Fortran interface routines in Struct and BoomerAMG - Updated the AME and LOBPCG interfaces to work correctly with both absolute and relative tolerances. #==================================== Version 2.11.0 released 2016/03/28 - Added a new function hypre_BoomerAMGSetKeepTranspose, which will store the transposes of the interpolation operators and then replace the multiplication of the transpose of P with a more efficient matvec. - Added a new function hypre_BoomerAMGSetRAP2, which will replace the triple matrix product R*A*P by two matrix-matrix products. This has shown to be faster on BG/Q. Note that setting this function will prevent the keeping of transposes. - Added various changes that can improve performance on certain architectures, particularly in the BoomerAMG Setup when using threading. While some of them will be in effect automatically, using the configure options --with-openmp --enable-hopscotch can lead to additional improvements if atomic operations are available. The configure option --enable-persistent allows the use of persistent communication if available. (Many of these changes are described in "High-Performance Algebraic Multigrid Solver Optimized for Multi-Core Based Distributed Parallel Systems" by J. Park, M. Smelyanskiy, U.M. Yang, D. Mudigere, P. Dubey, published in Proceedings of SC15.) - Modified configure to conform to xSDK standards in IDEAS project (https://ideas-productivity.org/focus-areas/xsdk/) - Fixed a bug related to SStructSetSharedPart and SetNeighborPart - Fixed a bug in elasticity interpolation for BoomerAMG - Fixed an MPI bug that was causing Parasails to hang occasionally - Removed Babel from the release #==================================== Version 2.10.1 released 2015/09/11 - Fixed various bugs in AMG and the IJ interface. - Changed function names to set interpolation truncation parameters for mult-additive versions as follows: HYPRE_BoomerAMGSetAddTruncFactor to HYPRE_BoomerAMGSetMultAddTruncFactor HYPRE_BoomerAMGSetAddPMaxElmts to HYPRE_BoomerAMGSetMultAddPMAxElmts - Replaced the function HYPRE_BoomerAMGSetNonGalerkTol, which sets parameters for the nonGalerkin version, with HYPRE_BoomerAMGSetNonGalerkinTol and HYPRE_BommerAMGSetLevelNonGalerkinTol #==================================== Version 2.10.0b released 2015/01/22 - Added new interpolation that allows the incorporation of near null-space vectors for systems problems. - Added additive V-cycle and new mult-additive and simplified mult-additive V-cycle. - Fixed several bugs in BoomerAMG and removed some inefficiencies. - Fixed potential bug and memory leaks in the AMS and ADS solvers. - Added threading to the IJ interface and some AMG setup routines. - Added new non-Galerkin coarse grid construction scheme to reduce communication and complexity. - Extended GLVis visualization to all 2D and 3D example codes. - Changed the configure settings to use --disable-global-partition by default. The equivalent old option --with-no-global-partition is still available, but users should migrate to the new one. #==================================== Version 2.9.4a released 2013/11/21 - Minor bug fix in AMS and other minor changes. #==================================== Version 2.9.3a released 2013/10/15 - Extended AMS to work for AMR problems on quad/hex meshes by removing an assumption that the discrete gradient G only has +-1 entries. Also changed default smoother in AMS to l1-GS. - Added a hi-D capability to Struct and SStruct. Use the --enable-maxdim option to configure the library for higher-than-3D usage. - Added complex system support to a subset of the library, including most of the matrix-vector class functions and the Krylov solvers. Currently does not support the FEI or babel components. Use the --enable-complex option to set. #==================================== Version 2.9.2a released 2013/02/15 - Added HYPRE_AMSSet*AMGCoarseRelaxType for specifying the coarsest level relaxation for the AMG subspace solvers in AMS. Since the subspace matrices are often singular, the default value uses l1-GS on the coarsest level, which is different from BoomerAMG's default (exact solve). - Fixed a bug in the IJ interface related to setting off-processor values when hypre is configured to use the assumed partition. - Fixed a bug in BoomerAMG when using C-F L1-Jacobi on coarsest grid, and fixed a memory bug related to interpolation. #==================================== Version 2.9.1a released 2013/01/16 - Added a HYPRE_BoomerAMGSetRedundant() switch to allow for an agglomeration approach for solving the coarsest grid system. - Changed how BoomerAMG handles zero diagonal entries. - Made a few minor bug fixes in BoomerAMG. - Fixed a configuration problem with external blas and lapack. #==================================== Version 2.9.0b released 2012/10/30 - Changed the behavior of the BoomerAMG interpolation routines when a zero diagonal is encountered to avoid divide-by-zero issues. #==================================== Version 2.8.3a released 2012/09/28 - Fixed some memory allocation problems in SStruct, including code related to the SetPeriodic() routine. - Updated the CMake build system to build the FEI component of hypre also. - Flattened the directory structure for the FEI code. #==================================== Version 2.8.2a released 2012/05/10 - Added threading to multipass interpolation in BoomerAMG. - Fixed a coarsening problem in PFMG when the diagonal is negative. - Added a new option to BoomerAMG to specify a minimum coarse grid size. #==================================== Version 2.8.1a released 2012/03/19 - For non-cell data, fixed a memory problem with SStructGraphAddEntries() and an accumulation problem with SStructMatrixAddValues(). - Improved the penalty scaling factor for AMS's discrete divergence term (which is added to the matrix to robustly handle problems with pure void regions). - Added threading to various routines in BoomerAMG. - Fixed the SStructGridSetPeriodic() routine to work for all object types, including HYPRE_PARCSR which previously did not work. - Made two changes to GMRES: 1) Added GMRESSetSkipRealResidualCheck to skip the evaluation and check of the final residual in GMRES. This can be useful in situations where restart is not expected to be beneficial. 2) Independent of the above, added a check to see if consecutive real GMRES residuals decrease (in the "false convergence" case). If not, we conclude that restart leads to pollution from round-off errors and exit GMRES. - Implemented a CMake build system for the library and the test drivers. #==================================== Version 2.8.0b released 2011/11/14 - Added the new Auxiliary-space Divergence Solver (ADS) which targets div-div problems discretized with lowest order Raviart-Thomas "face" finite elements. ADS is very similar to AMS, and in general its relationship to AMS is analogous to the relationship between AMS and AMG. - Added a redundant coarse-grid solve option to BoomerAMG, which can improve solution times on machines with high communication latencies. - Extended the AMS and ADS solvers to support (arbitrary) high-order H(curl) and H(div) discretization methods. The high-order interface allows the users to set directly the Nedelec and Raviart-Thomas interpolation matrices, which can be used to precondition other types of discretizations (e.g. ones based on the second family of Nedelec elements). - Added a Euclid preconditioner option to the Fortran interfaces for the ParCSR Krylov solvers. - Fixed a bug with periodic problems in the SStruct interface. - Fixed a bug in CGNR. - Added a new higher order FEM example (ex16). - Added visualization capabilities to the examples based on the GLVis package. #==================================== Version 2.7.1a released 2011/03/18 - Fixed a long-standing O(P) memory allocation problem in the communication setup routines for Struct. - Fixed some OpenMP threading problems in Struct. - Made some optimizations to the constant coefficient version of PFMG. - Added a 64-bit version of Example 15 (file 'ex15big.c' in examples/) #==================================== Version 2.7.0b released 2011/01/27 - Added a new --enable-bigint feature that, when turned on, requires the user to pass integers of size 'long long int' to hypre and enables ParCSR matrices with more than 2 billion unknowns (previously a limitation due to 32-bit integers). This feature is currently not available in the FEI or babel sections of hypre. Added example 'ex5big.c' as an illustration of how to use this new feature. - Changed the Fortran interface to use a Fortran MPI communicator. Previously, users were required to call HYPRE_MPI_Comm_f2c() to convert their Fortran communicator to a C communicator. Fortran users will need to remove this call from their code to use the new release. - Added a new version of the l1-SGS smoother in BoomerAMG as a replacement for relax type 8. This smoother behaves similarly to relax type 6 on matrices with relatively small off-processor entries, but is guaranteed to always be convergent. The new smoother is also available in AMS as relax type 4. - Fixed some bugs in the coarsening routines for BoomerAMG. - Relaxed the power-of-two restrictions for the PFMG and SysPFMG solvers. See the reference manual for more details. SMG still requires a power-of-two. - Fixed the constant-coefficient PFMG solvers. Also changed the non-Galerkin scheme slightly for the constant-coefficient variable-diagonal PFMG solver to simplify the code and enable easier threading. - Fixed a bug in the Struct multigrid solvers for periodic problems when the period is larger than the grid. - Fixed some OpenMP problems in the Struct and SStruct code. #==================================== Version 2.6.1a released 2010/03/30 - Made several bug fixes related to the new SetSharedPart() and FEM() routines: Fixed a memory leak. Fixed to allow SetSharedPart() or SetNeighborPart() calls from any processor, even if the processor doesn't own data on 'part'. - Fixed a bug in the void-zone version of AMS, which sometimes produced a non-symmetric preconditioner. - Added new smoothers to BoomerAMG (Chebyshev, FCF-Jacobi, and CG) and AMS (Chebyshev). - Made some performance improvements to the implementation of the assumed partition algorithm used in SStruct. #==================================== Version 2.6.0b released 2010/02/04 - Added a new interface routine to SStruct called GridSetSharedPart() which is used to describe how regions inside a part are shared with regions in other parts in a block-structured grid setting. The routine is similar to SetNeighborPart(), but allows more flexibility in finite-element settings. - Added new finite element routines to the SStruct interface as an alternative to using stencils: GridSetFEMOrdering(), GraphSetFEM(), GraphSetFEMSparsity(), MatrixAddFEMValues(), and VectorAddFEMValues(). - Added new examples, ex13.c, ex14.c, and ex15.c, to illustrate the use of the new SetSharedPart and FEM routines, the new rectangular matrix feature in SStruct, and the use of the AMS solver through the SStruct interface. - Removed support for SetNeighborBox() in the SStruct interface. This was replaced by SetNeighborPart() in release 2.4.0b. - Added the assumed partition algorithm to the implementation of the SStruct interface to improve scaling at huge processor counts. - Changed the behavior of IJMatrixSetValues so that it is deterministic and consistent with the behavior of SStructMatrixSetValues when setting values owned by other processors (a similar change was made to IJVectorSetValues). - Added user documentation for building hypre under Windows. - Added user and reference documentation for the LOBPCG eigensolver. - Did some cleaning up in the 'configure' script. - Changed to install only one hypre library now: libHYPRE.a (or libHYPRE.so). - Added the release number to the hypre shared library soname and changed to resolve all symbols in the shared library. - Updated the non-babel fortran interface. - Added configure options to explicitly set the mangling scheme for Fortran. - Added a configure option to --disable-fortran for users who do not have a working fortran compiler. This is most useful for Mac users. - Improved threading for BoomerAMG. #==================================== Version 2.5.0a released, 2009/10/12. - Added new 2-stage interpolation operators to be used with aggressive coarsening. - Added a new routine HYPRE_BoomerAMGSetMaxCoarseSize that allows to set the maximal system size on the coarsest level. - Added a "recompute residual" option to PCG which makes it behave like a "restarted CG". This, can be useful in high-accuracy computation where the CG residuals drift from r = b - Ax. - Added a residual-based stopping criteria in PCG for high-accuracy computations. - Added a Fortran interface for AMS. - Initial release of a more robust version of AMS for singular problems with zero-conductivity regions. This requires a list of the interior nodes in the zero conductivity regions and uses a periodic projection onto a compatible subspace. - Added Distributed SuperLU in the FEI. - Added support for multiple right-hand-sides in the FEI. - Added C and Fortran nodal versions of Example 1: ex12.c and ex12f.f. - Added a LOBPCG example: /examples/ex11.c. - Removed the make uninstall option. - The HTML version of the reference manual is no longer part of the hypre distribution. However, it can still be generated by typing make in the docs/ directory (requires doc++). #==================================== Version 2.4.0b released 2008/08/08 - Fixed some Fortran interface bugs. - Added two additional Krylov solvers: Flexible GMRES and LGMRES - Added a fortran example: /examples/ex5f.f - Updated SuperLU to version 3.0 - Improved relaxation options in AMS. - Changed 'make clean' to erase the hypre/ directory. - Fixed a bug in preconditioned BiCGStab. #==================================== Version 2.3.2a released, 2008/05/08. - Fixed a couple of bugs associated with SStructGridSetNeighborPart. - Added absolute convergence tolerance stopping criteria to GMRES, CG, and BiCGStab (See HYPRE_GMRESSetAbsoluteTolerance, HYPRE_PCGSetAbsoluteTolerance, or HYPRE_BiCGSTABSetAbsoluteTolerance in the reference manual for details). - Updated error checking for CG and BiCGStab. - Fixed a bug in AMG when the maximum number of levels is set to 1. - Added two new solver types to AMS: a Hiptmair-like smoother (type 0), and one based on a block 4x4 coarse-grid matrix (type 20). #==================================== Version 2.3.1a released, 2008/01/31. - A bug fix (uninitialized variables introduced when AMS was added to the FEI preconditioner list). - Fixed a memory allocation bug in new SStruct SetNeighborPart feature. - Added a new option for the Schwarz smoothers (HYPRE_BoomerAMGSetSchwarzUseNonSymm and HYPRE_SchwarzSetNonSymm) to use LU instead of Cholesky LAPACK functions to invert the matrix blocks. - Fixed a bug with the Schwarz smoothers and the ESSL compile. #==================================== Version 2.3.0a released, 2008/01/28. - Completed the implementation of SStructGridSetNeighborBox to work for all variable types (not just cell-centered). In the process, we discovered that the interface design for this routine can result in ambiguous coordinate transformations between parts, so the new SetNeighborPart routine (below) should be used instead. - Introduced the SStructGridSetNeighborPart routine. Users migrating from SetNeighborBox to this new routine only need to change the name ("Box" to "Part") and append an additional argument 'index_dir'. See the reference manual for details. - The SStructSplit solver can now be used as a standalone solver (before, it could only be used as a preconditioner). Added HYPRE_Jacobi as an option to SetStructSolver. - Added Get(Box)Values routines for Struct/SStruct Matrix. - Added nodal interpolation schemes to BoomerAMG for systems problems. - Added capability to change Euclid runtime parameters using individual functions. - Improved use of Euclid as smoother in BoomerAMG. - Fixed two potential bugs in BoomerAMG. - Fixed a major bug with the OpenMP code in hypre (beginning with v1.7.5b, OpenMP support was effectively disabled in the code). Also made several additional OpenMP changes/fixes. #==================================== Version 2.2.0b released, 2007/09/20. - Renovate the FEI block preconditioner which will be useful for ALE3D simulation of mixed variable type problem #==================================== Version 2.1.0a released, 2007/06/25. - Added the CGC and CGC-E coarsening algorithms, which have been developed and implemented by Michael Griebel, Bram Metsch and Alex Schweitzer of the University of Bonn. - Added several new solver types to AMS and improved the AMS/FEI integration. - Better handling of the relative change test in GMRES. - Improved weights for Struct and SStruct weighted Jacobi. - Added a 'make check' target that does a simple code verification test. - Added truncation for interpolation according to the number of elements to the ParCSR Hybrid AMG Solver. - Renovated the hypre fei implementation for use in ARES. #==================================== Version 2.0.0 released, 2006/12/15. - Minor documentation updates. #==================================== Version 1.14.0b released, 2006/11/30. - Added python support to Babel interface. - Changed the name of several internal header files to use the '_hypre_' prefix. This should not affect most users, since these are internal headers. - Added AME, a new Maxwell eigensolver based on AMS and LOBPCG. - Changes to Struct code to hopefully improve efficiency of MG solver setup. - Efficiency improvements for new long-range interpolation algorithms in BoomerAMG, including: * extended interpolation is now like modified, i.e no absolute values * added an extended interpolation which only extends when there are no common coarse neighbors * changed standard interpolation to only extend at strong F neighbors (instead of all neighbors) for better efficiency #==================================== Version 1.13.0b released, 2006/10/03. - Babel-based interface updated to Babel version 1.0.0, plus various improvements, such as an interface to the hypre error handler. Pre-built interfaces are included for C, Fortran, and C++. - Various modifications to BoomerAMG: * Eliminated the possibility to set relaxation on the finest grid * Added various new long-range interpolation algorithms: standard (with and without weight separation), extended, and F-F interpolation. These routines will improve convergence for the low complexity coarsening algorithms PMIS and HMIS. * Added the possibility to set a maximal number of weights per row when truncating the interpolation operator. When this option is used, only the absolutely largest weights per row are kept. - Modifications to the fac user interface to permit easier problem set up. - Shared libraries can be built by using the --enable-shared option when configuring. NOTE: the directory where the shared libraries reside MUST be defined in the LD_LIBRARY_PATH variable. - Incorporated the GNU Lesser General Public License. - Now using Roundup for issue tracking; send email to hypre-support@llnl.gov #==================================== Version 1.12.0a released, 2006/07/26. - First release of AMS, a new solver for (semi)definite Maxwell problems. - First release of Maxwell, a semi-structured Maxwell solver. - Modifications to the fac user interface to permit easier set up of the problem. #==================================== Version 1.11.1b released, 2006/05/30. - Corrected FEI build to allow user to specify a system FEI and build internal HYPRE routines. #==================================== Version 1.11.0b released, 2006/04/24. - Added configure option --without-FEI to disable build of internal FEI routines. - Added a new system for handling error codes in hypre. - Added configure option --print-errors to enable printing of HYPRE error messages. - Modified configure to only depend on having a C compiler available. - Added compatible relaxation on one processor. - Updated all F90_HYPRE_* files to be consistent with HYPRE_* files. - Updated ex5.c to include: * an option to print the system matrix and rhs * a description of how to read in a matrix and rhs in IJ format. - Corrected error that occurred when more than one Euclid solver object is used at the same time - Added Maxwell capabilities via Sandia's ML solvers; see details in FEI_mv/fei-hypre/CHANGELOG. - Replaced PILUT with Euclid in test code sstruct.c. #==================================== Version 1.10.0b released, 2005/12/19. - configure updates * always runs --without-blas --without-lapack unless otherwise specified * cross-compiling enabled * added --with-no-global-partition option - makefile updates * changed eigensolvers subdirectory to multivector - Added a set of simple example codes covering the Struct, SStruct and IJ interfaces. See README.html in the examples subdirectory for more details. - The --with-no-global-partition option was added to reduce storage and improve run times on very large numbers of processors (such as BlueGene/L). Currently only the IJ interface solvers have been optimized. For small or modest numbers of processors (typically < 1000-5000 depending on the machine), this option is not needed (and will likely be slower). - Added aggressive coarsening, which can be applied to all available coarsening schemes (via HYPRE_BoomerAMGSetNumAggLevels and HYPRE_BoomerAMGSetNumPaths) - Added multipass interpolation and direct interpolation. - Added the capability of nodal coarsening for systems AMG. - expanded coverage of Babel-based interface #==================================== Version 1.9.0b released, 2005/02/10. - Added updated LOBPCG source code and test files. - Added a vector Laplace problem for testing systems AMG. - Added FAC to semi-struct #==================================== Version 1.9.0a released, 2005/01/18. - NOTE: Link lines may need to be changed depending on configure options used. - The build system introduced in v1.8.3a was too difficult to maintain, so we have reverted to a system similar to the previous one. In particular, all of the new automake and libtool stuff was removed. In the new system, each directory (except 'config') has ONLY a 'Makefile' (no more 'Makefile.in' or 'Makefile.am' files). When the 'configure' script is run, the single file 'config/Makefile.config' is created. This file is included in all Makefiles in all sub-directories. Shared libraries CANNOT be created with this system. - The makefile targets are now more inline with GNU standards. To get details, type 'make help'. - The makefile target 'nofei' has been removed and is now run by default. - The library files 'libHYPRE_blas.a' and 'libHYPRE_lapack.a' are no longer created when 'configure' is run '--without-blas' and/or '--without-lapack'. This created confusion before and really didn't make sense anyway. These options are now consistent with the '--without-MPI' option. Also, there is no longer any danger of name conflicts with external blas or lapack libraries as was the case before. - Added new parallel coarsening schemes PMIS and HMIS with reduced complexities as well as the option of using one pass of Ruge-Stueben only. - Added the capability to set values from any processor through the IJ matrix and vector interfaces. - Added support to the PFMG solver for matrices with constant coefficients. - Reverted back to the first approach for setting periodic conditions. The periodic flag now contains the periodicity value, and is not just a boolean. #==================================== Version 1.8.3a released, 2004/01/21. - The build system has been revamped to enable the building of shared libraries (in addition to static libraries, as before). The new system more closely follows GNU standards, and will hopefully show improved flexibility and platform support. Users can build hypre as before by typing 'configure' followed by 'make'. A few makefile target changes to note are: * 'make clean' replaces 'make veryclean' * 'make all' no longer builds the drivers in the 'test' directory. If needed, build them from within the 'test' directory or use the 'make test' target. Technical notes: We are now using GNU automake-1.8.2 to support Makefile.in generation; autoconf-2.59 to generate configure; and libtool-1.5 to provide shared library support. The GNU tools, autoheader, libtoolize, and aclocal are also used. These tools are only used by hypre developers and are *not* needed to build hypre. - Separated the lapack and blas routines into two libraries. Blas and lapack support (whether to use the routines distributed with hypre or use already installed libraries) is determined by configure, and can be overridden with '--with-blas=' and '--with-lapack='. NOTE: This change affects your link line! - A new directory 'lib' contains a new Hypre library, 'libHYPRE.a' (and 'libHYPRE.so' if configured for shared libraries) which contain all of the libHYPRE_*.a objects with in a single library. - Fixed the PFMG and SMG solvers to work in the case of pure Neumann boundary conditions. #==================================== Version 1.8.2b released, 2003/10/22. - Performance improvements for Struct solvers when there are many boxes per processor in the grid. For 125 boxes or more in 3D, the speedup in the setup phases of PFMG and SMG can be significant (we have seen as much as a factor of 30). - New non-Galerkin option in PFMG can improve convergence and memory usage. This option maintains either a 5-pt stencil in 2D or a 7-pt stencil in 3D on all grid levels. - New non-symmetric red/black smoother in PFMG can improve convergence on some problems. - New optimizations in the smoothers in PFMG lead to as much as 30% faster times. - Added a new interpolation option to AMG that is useful for solving hyperbolic equations. It treats fine weak connections like fine strong connections. #==================================== Version 1.8.1b released, 2003/05/21. - Minor bug fixes and performance improvements. #==================================== Version 1.8.0b released, 2003/04/08. - New Babelized HYPRE interface introduced. Babel is a tool that provides language interoperability. HYPRE will eventually migrate to using Babel exclusively. See 'docs/babel_transition_info.txt' for information on how to use the new interface. - PFMG: bug fix for red/black relaxation. - Eigenvalue solver LOBPCG has been added. See 'docs/lobpcg_info.txt' for documentation. #==================================== Version 1.7.11a released, 2003/03/14. - BiCGSTAB has been added to struct and sstruct interface - added automatic determination of relaxation parameters for use with symmetric smoothers in BoomerAMG #==================================== Version 1.7.10b released, 2002/12/02. - New Hybrid solvers available for ParCSR and Struct. - IJ: Modified the 'GetValues' part of the matrix interface to make it possible to get matrix values without knowing the nonzero structure. In particular, added a new option to IJMatrixGetValues, and added new routines IJMatrixGetRowCounts, IJMatrixGetLocalRange, and IJVectorGetLocalRange. - SStruct: Fixed a bug when connecting a part to itself with SetNeighborBox. - FEI: Added a few more smoothers and amg methods in mli, fixed a few memory leaks uncovered by running ale3d, added new aggregation coarsening for handling multiple materials. For more details, see FEI_mv/fei-hypre/CHANGELOG. #==================================== Version 1.7.9b released, 2002/10/18. - SStruct: Added an if around sorting and eliminating duplicate iUventries so that its only executed when there are at least 2 such entries. #==================================== Version 1.7.8b released, 2002/09/25. - SStruct: Changed the MatrixSetSymmetric interface (this was actually not implemented before anyway). The new interface allows much more flexibility in controlling which parts of the matrix are symmetric. #==================================== Version 1.7.7b released, 2002/08/08. - limited release SStruct optimizations testing - the krylov library has been renamed to HYPRE_krylov #==================================== Version 1.7.6b released, 2002/03/27. - SStruct: Changed SetNeighborBox function to allow the case where the NeighborBox does not even intersect the grid. This functionality is convenient in some application situations. - SStruct: Made additional changes to the SetNeighborBox function to allow NeighborBox information to be redundantly declared by users. This functionality is also convenient in some application situations. - SStruct: Optimized the implementation of MatrixSetBoxValues. #==================================== Version 1.7.5b released, 2002/01/16. - SStruct: Modified SetNeighborBox boxes to reach off of the global grid. - krylov solvers (PCG, GMRES, BiCGSTAB and CGNR ) are the first solvers to use the new definitions for logging, which are logging = 0: no printout, no storing of norms or rel. res. norms logging = 1: no printout, norms (and relative residual norms for PCG) are stored logging > 1: norms (and relative residual norms for PCG) are stored and printed out to standard output during each iteration step. #==================================== Version 1.7.0b released, 2001/11/12. - Bug fixes: SStruct interface under threads was producing incorrect results. That is now fixed. #==================================== Version 1.6.0 released, 2001/07/27. - The Euclid PILU preconditioning library has been added to the release. See Section 7.7.5 of the user manual and Section 6.6.4 of the reference manual for details. #==================================== Version 1.5.0b released, 2001/07/18. - New draft of the IJ interface: This new draft is not backward compatible with the previous draft. See the file `docs/V1.5.0b.IJ_transition_info' for details on transitioning to the new interface. See the User's Manual and Reference Manual for usage information. - Added SetRelChange option to GMRES solver. #==================================== Version 1.4.0b released, 2001/01/10. - Changed SStruct interface: The SStructGraphAddEntries routine now only sets one graph entry at a time. See the reference manual for details on the new prototype and usage. - Both PCG and GMRES are available now when using the Struct or SStruct matrix classes (only one or the other was previously available). #==================================== - First working multiprocessor version of SStruct interface. - Fixed a bug in PILUT that effected multiprocessor runs. - Additional interface for Krylov solvers: most function calls are available with more generic naming, e.g. HYPRE_PCGSetPrecond may be called instead of HYPRE_ParCSRPCGSetPrecond or HYPRE_StructPCGSetPrecond. #==================================== Version 1.3.1b released, 2000/10/12. #==================================== Version 1.3.0b released, 2000/10/11. - The number of threads to use in an OpenMP run can now be specified via either the OMP_NUM_THREADS environment variable, or by the routine omp_set_num_threads(). - Added fortran interface support for compilers that mangle names with all capitals (e.g., Cray fortran compilers). To use, specify the '--with-CFLAGS=-DHYPRE_CRAY' option on the 'configure' line. #==================================== Version 1.2.0 released, 2000/09/22. #==================================== Version 1.1.0 released, 2000/09/07. - Setup time for PILUT has been dramatically reduced in the case of very small drop tolerances, and memory problems that were causing coredumps on >2 processors have been fixed. - Changed Struct interface include file names to be consistent with the rest of the library. They are now: HYPRE_struct_mv.h HYPRE_struct_ls.h The Struct library names have also changed similarly. - Removed the `stencil' argument from `HYPRE_StructVectorCreate'. - Added a new interface for semi-structured grids. This is still very much a beta implementation, and should be used with extreme caution until further notice. - The main header files have been restructured to be more readable. They will soon include full documentation for their interfaces. #==================================== New internal installation: V1.0.0, 2000/07/06 - Now installing both optimized and debugging versions of the library. The optimized library is in the usual place; the debugging library is in the subdirectory 'debug'. - Added support for the FEI v1.4, with additional capabilities for handling parallel slide surface reduction and general Schur complement reduction. - Using a new version numbering scheme. The C macro HYPRE_Version() may be used to retrieve version information. #==================================== New internal installation: V2000-05-31 - OpenMP threading added to BoomerAMG. to convert code to use the new names. - Changed default coarsening type for BoomerAMG. This version does Ruge/Stueben coarsening on the interior of each processor to generate an initial independent set for the CLJP coarsening algorithm. - Various BoomerAMG optimizations. #==================================== New internal installation: V2000-03-30 - New AddToValues and AddToBoxValues routines for Struct interface. - Fairly extensive changes to SMG/PFMG codes to fix setup phase scalability problems. These changes should result in slightly slower setup phase times for small-scale problems, but much improved setup phase times for very large-scale (greater than 1000 processors) problems. - AMG and GMRES solvers have minor fixes for reproducibility under restart. - A subtle coarse grid operator bug in AMG was removed. AMG no longer frees from an uninitialized pointer to an empty domain coarse grid operator. - Minimum iteration count controls have been installed for AMG, GMRES, and CGNR. - Fortran interface wrappers have been made for ParCSRMatrixMatvec and ParCSRMatrixMatvecT calls #==================================== New internal installation: V2000-01-14 hypre-2.33.0/COPYRIGHT000066400000000000000000000023471477326011500142350ustar00rootroot00000000000000 Intellectual Property Notice ---------------------------- HYPRE is licensed under the Apache License, Version 2.0 (see LICENSE-APACHE or http://www.apache.org/licenses/LICENSE-2.0) or the MIT license (see LICENSE-MIT or http://opensource.org/licenses/MIT), at your option. Copyrights and patents in the HYPRE project are retained by contributors. No copyright assignment is required to contribute to HYPRE. HYPRE's original open source license was LGPL-2.1. Consent from contributors was received and documented before relicensing to Apache-2.0/MIT. SPDX usage ---------- Individual files contain SPDX tags instead of the full license text. This enables machine processing of license information based on the SPDX License Identifiers that are available here: https://spdx.org/licenses/ Files that are dual-licensed as Apache-2.0 OR MIT contain the following text in the license header: SPDX-License-Identifier: (Apache-2.0 OR MIT) External Software ----------------- External software in hypre is covered by various permissive licenses. A summary listing follows. See the license included with the software for full details. Directory: src/blas License: University of Tennessee Directory: src/lapack License: University of Tennessee hypre-2.33.0/INSTALL.md000066400000000000000000000074121477326011500143700ustar00rootroot00000000000000 HYPRE Installation Information for Unix-based systems ===================================================== The simplest way to build HYPRE is: 1. From within the `src` directory, type `configure` to configure the package for your system. While configure runs, it prints messages indicating which features it is checking for. Two output files are created: config.status and config.log. The config.status file can be run to recreate the current configuration, and config.log is useful for debugging configure. Upon successful completion, the file `config/Makefile.config` is created from its template `Makefile.config.in` and HYPRE is ready to be made. 2. Type `make install` to compile and install HYPRE. 3. You can remove the program binaries and object files from the source code by typing `make clean`. To remove additional files created by configure, type `make distclean`. Optional Features: Configure has many options to allow the user to override and refine the defaults of any system. To display the available options, type `configure --help`. The make step in building HYPRE is where the compiling, loading and creation of libraries occurs. Make has several options called targets, which can be listed by running `make help`. When building HYPRE without the install target, the libraries and include files are copied into the directories, `src/hypre/lib` and `src/hypre/include`. When building with the install target, the libraries and files are copied into the directories specified by the configure option, --prefix=/usr/apps. If none were specified, the default directories are used, hypre/lib and hypre/include. HYPRE Installation Information using CMake ========================================== CMake is another way to build HYPRE that is particularly useful for building the code on Windows machines. CMake provides a uniform interface for setting configuration options on different platforms. It does not actually build the code, but generates input for other "native" build systems such as Make (Unix platforms) or Visual Studio (Windows). Here are the basic steps: 1. First, ensure that CMake version 3.13.0 or later is installed on the system. 2. To build the library, run CMake on the top-level HYPRE source directory to generate files appropriate for the native build system. To prevent writing over the Makefiles in HYPRE's configure/make system above, only out-of-source builds are currently allowed with CMake. The directory `build` is provided in the release for convenience, but alternative build directories may be created by the user: - Unix: From the `build` directory, type `cmake ../src`. - Windows: Set the source and build directories to `src` and `build`, then click on 'Configure' following by 'Generate'. 3. To complete the build of the library, compile with the native build system: - Unix: From the `build` directory, type `make install`. - Windows Visual Studio: Open the 'hypre' VS solution file generated by CMake and build the 'ALL_BUILD' target, then the 'INSTALL' target. Optional Features: Various configuration options can be set from within CMake. Change these as appropriate, then reconfigure/generate: - Unix: From the `build` directory, type `ccmake ../src`, change options, then type `c` then `q`. - Windows VS: Change options, then click on 'Configure' then 'Generate'. ABI Compatibility ================= The hypre team currently does nothing to ensure application binary interface (ABI) compatibility. As a result, all releases (major, minor, or patch) should be treated as incompatible. hypre-2.33.0/LICENSE-APACHE000066400000000000000000000261361477326011500146700ustar00rootroot00000000000000 Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and (b) You must cause any modified files to carry prominent notices stating that You changed the files; and (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS APPENDIX: How to apply the Apache License to your work. To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. Copyright [yyyy] [name of copyright owner] Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. hypre-2.33.0/LICENSE-MIT000066400000000000000000000022171477326011500143720ustar00rootroot00000000000000Copyright (c) 1998 Lawrence Livermore National Security, LLC and other HYPRE Project Developers. See the top-level COPYRIGHT file for details. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. hypre-2.33.0/NOTICE000066400000000000000000000022171477326011500136420ustar00rootroot00000000000000This work was produced under the auspices of the U.S. Department of Energy by Lawrence Livermore National Laboratory under Contract DE-AC52-07NA27344. This work was prepared as an account of work sponsored by an agency of the United States Government. Neither the United States Government nor Lawrence Livermore National Security, LLC, nor any of their employees makes any warranty, expressed or implied, or assumes any legal liability or responsibility for the accuracy, completeness, or usefulness of any information, apparatus, product, or process disclosed, or represents that its use would not infringe privately owned rights. Reference herein to any specific commercial product, process, or service by trade name, trademark, manufacturer, or otherwise does not necessarily constitute or imply its endorsement, recommendation, or favoring by the United States Government or Lawrence Livermore National Security, LLC. The views and opinions of authors expressed herein do not necessarily state or reflect those of the United States Government or Lawrence Livermore National Security, LLC, and shall not be used for advertising or product endorsement purposes. hypre-2.33.0/README.md000066400000000000000000000026001477326011500142110ustar00rootroot00000000000000 ![](src/docs/hypre-wwords.png) [HYPRE](http://www.llnl.gov/casc/hypre/) is a library of high performance preconditioners and solvers featuring multigrid methods for the solution of large, sparse linear systems of equations on massively parallel computers. For documentation, see our [readthedocs page](https://hypre.readthedocs.io/en/latest/). For information on code development, build requirements, publications, and more, see our [Wiki page](https://github.com/hypre-space/hypre/wiki). To install HYPRE, please see either the documentation or the file [INSTALL.md](./INSTALL.md). An overview of the HYPRE release history can be found in the file [CHANGELOG](./CHANGELOG). Support information can be found in the file [SUPPORT.md](./SUPPORT.md). License ---------------- HYPRE is distributed under the terms of both the MIT license and the Apache License (Version 2.0). Users may choose either license, at their option. All new contributions must be made under both the MIT and Apache-2.0 licenses. See [LICENSE-MIT](./LICENSE-MIT), [LICENSE-APACHE](./LICENSE-APACHE), [COPYRIGHT](./COPYRIGHT), and [NOTICE](./NOTICE) for details. SPDX-License-Identifier: (Apache-2.0 OR MIT) LLNL-CODE-778117 hypre-2.33.0/SUPPORT.md000066400000000000000000000006321477326011500144330ustar00rootroot00000000000000 HYPRE Support Information ========================= We appreciate feedback from users. Please submit comments, suggestions, and report issues on our [issues page](https://github.com/hypre-space/hypre/issues). hypre-2.33.0/build/000077500000000000000000000000001477326011500140335ustar00rootroot00000000000000hypre-2.33.0/build/.gitignore000066400000000000000000000001071477326011500160210ustar00rootroot00000000000000# Ignore everything in this directory * # Except this file !.gitignore hypre-2.33.0/src/000077500000000000000000000000001477326011500135235ustar00rootroot00000000000000hypre-2.33.0/src/CMakeLists.txt000066400000000000000000000617361477326011500163000ustar00rootroot00000000000000# Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) cmake_minimum_required(VERSION 3.21) message(STATUS "CMake Executable: ${CMAKE_COMMAND}") message(STATUS "CMake Version: ${CMAKE_VERSION}") # Include hypre's CMake utilities include("${CMAKE_CURRENT_SOURCE_DIR}/config/cmake/HYPRE_CMakeUtilities.cmake") # Set cmake policies if(POLICY CMP0146) cmake_policy(SET CMP0146 NEW) # Ensure CUDA toolkit is found endif() if(POLICY CMP0104) cmake_policy(SET CMP0104 NEW) # CUDA_ARCHITECTURES is allowed to be set in cache endif() # The version number. set(HYPRE_VERSION 2.33.0) set(HYPRE_NUMBER 23300) set(HYPRE_DATE 2025/04/03) set(HYPRE_TIME 00:00:00) set(HYPRE_BUGS https://github.com/hypre-space/hypre/issues) set(HYPRE_SRCDIR "${PROJECT_SOURCE_DIR}") # Display the hypre version setup_git_version_info("${CMAKE_CURRENT_SOURCE_DIR}/../.git") if (GIT_VERSION_FOUND) message(STATUS "Hypre Version: ${HYPRE_DEVELOP_STRING} (${HYPRE_BRANCH_NAME})") else() message(STATUS "NOTE: Could not find .git directory") message(STATUS "Hypre Version: ${HYPRE_VERSION}") endif() # Set the project name set(PROJECT_NAME HYPRE) project(${PROJECT_NAME} VERSION ${HYPRE_VERSION} LANGUAGES C) # Create the HYPRE library object add_library(${PROJECT_NAME}) # We use C99 by default, but users are free to specify any newer standard version if (NOT CMAKE_C_STANDARD) set(CMAKE_C_STANDARD 99 CACHE STRING "Standard to use for the C compiler") set(CMAKE_C_STANDARD_REQUIRED ON) endif () # Raise an error if the source and binary directories are the same if (${HYPRE_SOURCE_DIR} STREQUAL ${HYPRE_BINARY_DIR}) message(FATAL_ERROR "In-place build not allowed! Please use a separate build directory. See the Users Manual or INSTALL file for details.") endif () # Set default installation directory, but provide a means for users to change if (NOT CMAKE_INSTALL_PREFIX OR CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT) set(CMAKE_INSTALL_PREFIX "${HYPRE_SOURCE_DIR}/hypre" CACHE PATH "Installation directory for HYPRE" FORCE) endif () # Ensure RPATH/RUNPATH is set properly during the build set(CMAKE_SKIP_BUILD_RPATH FALSE CACHE BOOL "Include rpath in the binaries being built") set(CMAKE_BUILD_WITH_INSTALL_RPATH FALSE CACHE BOOL "Use different paths for build and install") set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE CACHE BOOL "Use link-time paths for install rpath") set(CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/lib" CACHE STRING "Where binaries look for shared libraries") # Build static library by default option(BUILD_SHARED_LIBS "Build shared libraries" OFF) # Set cmake module path set(CMAKE_MODULE_PATH "${HYPRE_SOURCE_DIR}/config/cmake" "${CMAKE_MODULE_PATH}") # Set CMAKE_BUILD_TYPE to default to Release if not already specified if (NOT CMAKE_BUILD_TYPE) set(CMAKE_BUILD_TYPE "Release" CACHE STRING "Build type options: Debug, Release, RelWithDebInfo, or MinSizeRel." FORCE) endif() # Set the possible values of build type for ccmake/cmake-gui set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS "Debug" "Release" "MinSizeRel" "RelWithDebInfo") # Set debug flags based on compiler if(CMAKE_BUILD_TYPE STREQUAL "Debug") if(CMAKE_C_COMPILER_ID MATCHES "Intel") target_compile_options(${PROJECT_NAME} PRIVATE $<$:-O0 -Wall -Wremarks> $<$: -O0 -Wall -Wremarks -Wno-unused-lambda-capture -Wno-unused-local-typedef -Wno-unused-variable -Wno-unused-parameter -Wno-unused-function >) elseif(CMAKE_C_COMPILER_ID MATCHES "GNU|Clang") target_compile_options(${PROJECT_NAME} PRIVATE $<$:-O0 -Wall> $<$:-O0 -Wall> $<$:-O0 -Xcompiler=-Wall> $<$:-O0 -Wall>) elseif(CMAKE_C_COMPILER_ID MATCHES "MSVC") target_compile_options(${PROJECT_NAME} PRIVATE $<$:/Od /Zi /W4> $<$:/Od /Zi /W4>) elseif(CMAKE_C_COMPILER_ID MATCHES "PGI|NVHPC") target_compile_options(${PROJECT_NAME} PRIVATE $<$:-O0 -Minform=warn> $<$:-O0 -Minform=warn> $<$:-O0 -g -Minform=warn>) elseif(CMAKE_C_COMPILER_ID MATCHES "XL|XLClang") target_compile_options(${PROJECT_NAME} PRIVATE $<$:-O0-qinfo=all> $<$:-O0 -qinfo=all>) else() message(WARNING "Unknown C compiler '${CMAKE_C_COMPILER_ID}', using default debug flags") target_compile_options(${PROJECT_NAME} PRIVATE $<$:-O0> $<$:-O0>) endif() endif() # Print the configuration message(STATUS "Build type: ${CMAKE_BUILD_TYPE}") message(STATUS "Shared library: ${BUILD_SHARED_LIBS}") message(STATUS "Installation directory: ${CMAKE_INSTALL_PREFIX}") message(STATUS "Using C standard: ${CMAKE_C_STANDARD}") # Base boolean configuration options set_hypre_option(BASE HYPRE_ENABLE_BIGINT "Use long long int for HYPRE_Int and HYPRE_BigInt" OFF) set_hypre_option(BASE HYPRE_ENABLE_MIXEDINT "Use long long int for HYPRE_BigInt, int for HYPRE_Int" OFF) set_hypre_option(BASE HYPRE_ENABLE_SINGLE "Use float for HYPRE_Real" OFF) set_hypre_option(BASE HYPRE_ENABLE_LONG_DOUBLE "Use long double for HYPRE_Real" OFF) set_hypre_option(BASE HYPRE_ENABLE_COMPLEX "Use complex values" OFF) set_hypre_option(BASE HYPRE_ENABLE_HYPRE_BLAS "Use internal BLAS library" ON) set_hypre_option(BASE HYPRE_ENABLE_HYPRE_LAPACK "Use internal LAPACK library" ON) set_hypre_option(BASE HYPRE_ENABLE_PERSISTENT_COMM "Use persistent communication" OFF) set_hypre_option(BASE HYPRE_ENABLE_FEI "Use FEI" OFF) # TODO: Add this cmake feature set_hypre_option(BASE HYPRE_ENABLE_HOPSCOTCH "Use hopscotch hashing with OpenMP" OFF) set_hypre_option(BASE HYPRE_ENABLE_OPENMP "Use OpenMP" OFF) set_hypre_option(BASE HYPRE_ENABLE_MPI "Use MPI" ON) set_hypre_option(BASE HYPRE_ENABLE_LTO "Use Link-Time Optimization (LTO)" OFF) set_hypre_option(BASE HYPRE_ENABLE_PRINT_ERRORS "Print HYPRE errors" OFF) set_hypre_option(SKIP HYPRE_ENABLE_TIMING "Use HYPRE timing routines" OFF) set_hypre_option(SKIP HYPRE_ENABLE_STRICT_CHECKING "Use strict error checking (Sequential only)" OFF) set_hypre_option(BASE HYPRE_ENABLE_TEST_USING_HOST "Execute tests on host (CPU)" OFF) set_hypre_option(BASE HYPRE_ENABLE_HOST_MEMORY "Use host memory" ON) set_hypre_option(BASE HYPRE_BUILD_EXAMPLES "Build examples" OFF) set_hypre_option(BASE HYPRE_BUILD_TESTS "Build tests" OFF) # GPU options set_hypre_option(GPU HYPRE_ENABLE_CUDA "Use CUDA. Require cuda-10.0 or higher" OFF) set_hypre_option(GPU HYPRE_ENABLE_HIP "Use HIP" OFF) set_hypre_option(GPU HYPRE_ENABLE_SYCL "Use SYCL" OFF) set_hypre_option(GPU HYPRE_ENABLE_GPU_AWARE_MPI "Use device aware MPI support" OFF) set_hypre_option(GPU HYPRE_ENABLE_UNIFIED_MEMORY "Use unified memory for allocating the memory" OFF) set_hypre_option(GPU HYPRE_ENABLE_DEVICE_MALLOC_ASYNC "Use device async malloc" OFF) set_hypre_option(GPU HYPRE_ENABLE_THRUST_ASYNC "Use Thrust par_nosync policy" OFF) set_hypre_option(GPU HYPRE_ENABLE_GPU_PROFILING "Use NVTX on CUDA or rocTX on HIP" OFF) # CUDA options set_hypre_option(CUDA HYPRE_ENABLE_CUDA_STREAMS "Use CUDA streams" ON) set_hypre_option(CUDA HYPRE_ENABLE_CUSPARSE "Use cuSPARSE" ON) set_hypre_option(CUDA HYPRE_ENABLE_CUSOLVER "Use cuSOLVER" ON) set_hypre_option(CUDA HYPRE_ENABLE_CUBLAS "Use cuBLAS" ON) set_hypre_option(CUDA HYPRE_ENABLE_CURAND "Use cuRAND" ON) set_hypre_option(CUDA HYPRE_ENABLE_DEVICE_POOL "Use CUB's device memory pool" OFF) # HIP options set_hypre_option(HIP HYPRE_ENABLE_ROCBLAS "Use rocBLAS" ON) set_hypre_option(HIP HYPRE_ENABLE_ROCSPARSE "Use rocSPARSE" ON) set_hypre_option(HIP HYPRE_ENABLE_ROCRAND "Use rocRAND" ON) set_hypre_option(HIP HYPRE_ENABLE_ROCSOLVER "Use rocSOLVER" ON) # oneAPI options set_hypre_option(SYCL HYPRE_ENABLE_ONEMKLSPARSE "Use oneMKL sparse" ON) set_hypre_option(SYCL HYPRE_ENABLE_ONEMKLBLAS "Use oneMKL blas" ON) set_hypre_option(SYCL HYPRE_ENABLE_ONEMKLRAND "Use oneMKL rand" ON) # TPL options set_hypre_option(TPL HYPRE_ENABLE_UMPIRE "Use Umpire Allocator for device and unified memory" OFF) set_hypre_option(TPL HYPRE_ENABLE_UMPIRE_HOST "Use Umpire Allocator for host memory" OFF) set_hypre_option(TPL HYPRE_ENABLE_UMPIRE_PINNED "Use Umpire Allocator for pinned memory" OFF) set_hypre_option(TPL HYPRE_ENABLE_UMPIRE_DEVICE "Use Umpire Allocator for device memory" OFF) set_hypre_option(TPL HYPRE_ENABLE_UMPIRE_UM "Use Umpire Allocator for unified memory" OFF) set_hypre_option(TPL HYPRE_ENABLE_SUPERLU "Use TPL SuperLU" OFF) set_hypre_option(TPL HYPRE_ENABLE_DSUPERLU "Use TPL SuperLU_Dist" OFF) set_hypre_option(TPL HYPRE_ENABLE_MAGMA "Use TPL MAGMA" OFF) set_hypre_option(TPL HYPRE_ENABLE_CALIPER "Use TPL Caliper" OFF) set_hypre_option(SKIP TPL_UMPIRE_LIBRARIES "Absolute paths to Umpire link libraries [Optional]." "") set_hypre_option(SKIP TPL_UMPIRE_INCLUDE_DIRS "Absolute paths to Umpire include directories [Optional]." "") set_hypre_option(SKIP TPL_SUPERLU_LIBRARIES "Absolute paths to SuperLU link libraries [Optional]." "") set_hypre_option(SKIP TPL_SUPERLU_INCLUDE_DIRS "Absolute paths to SuperLU include directories [Optional]." "") set_hypre_option(SKIP TPL_DSUPERLU_LIBRARIES "Absolute paths to SuperLU_Dist link libraries [Optional]." "") set_hypre_option(SKIP TPL_DSUPERLU_INCLUDE_DIRS "Absolute paths to SuperLU_Dist include directories [Optional]." "") set_hypre_option(SKIP TPL_MAGMA_LIBRARIES "Absolute paths to MAGMA link libraries [Optional]." "") set_hypre_option(SKIP TPL_MAGMA_INCLUDE_DIRS "Absolute paths to MAGMA include directories [Optional]." "") set_hypre_option(SKIP TPL_CALIPER_LIBRARIES "Absolute paths to Caliper link libraries [Optional]." "") set_hypre_option(SKIP TPL_CALIPER_INCLUDE_DIRS "Absolute paths to Caliper include directories [Optional]." "") set_hypre_option(SKIP TPL_BLAS_LIBRARIES "Absolute paths to BLAS link libraries [Optional]." "") set_hypre_option(SKIP TPL_LAPACK_LIBRARIES "Absolute paths to LAPACK link libraries [Optional]." "") set_hypre_option(SKIP TPL_FEI_INCLUDE_DIRS "Absolute paths to FEI include directories [Optional]." "") # Extra flags set(HYPRE_WITH_EXTRA_CFLAGS "" CACHE STRING "Define extra C compile flags") set(HYPRE_WITH_EXTRA_CXXFLAGS "" CACHE STRING "Define extra CXX compile flags") set(HYPRE_SYCL_TARGET "" CACHE STRING "Target SYCL architecture, e.g. 'spir64_gen'.") set(HYPRE_SYCL_TARGET_BACKEND "" CACHE STRING "Additional SYCL backend options, e.g. '-device 12.1.0,12.4.0'.") # Set possible values for the Fortran name mangling schemes set(HYPRE_ENABLE_FMANGLE "UNSPECIFIED" CACHE STRING "Set the Fortran name mangling scheme") set(HYPRE_ENABLE_FMANGLE_BLAS "UNSPECIFIED" CACHE STRING "Set the Fortran BLAS name mangling scheme") set(HYPRE_ENABLE_FMANGLE_LAPACK "UNSPECIFIED" CACHE STRING "Set the Fortran LAPACK name mangling scheme") foreach(VARNAME IN ITEMS FMANGLE FMANGLE_BLAS FMANGLE_LAPACK) set_property(CACHE HYPRE_ENABLE_${VARNAME} PROPERTY STRINGS UNSPECIFIED NONE ONE_UNDERSCORE TWO_UNDERSCORES CAPS PRE_POST_UNDERSCORE 0 1 2 3 4 5) endforeach() # Set internal hypre variable for each Fortran mangling scheme process_fmangling_scheme(FMANGLE "name") process_fmangling_scheme(FMANGLE_BLAS "BLAS") process_fmangling_scheme(FMANGLE_LAPACK "LAPACK") # Set config name values set_internal_hypre_option("" BIGINT) set_internal_hypre_option("" MIXEDINT) set_internal_hypre_option("" SINGLE) set_internal_hypre_option("" LONG_DOUBLE) set_internal_hypre_option("" COMPLEX) set_internal_hypre_option("" TEST_USING_HOST) set_internal_hypre_option(USING HYPRE_BLAS) set_internal_hypre_option(USING HYPRE_LAPACK) set_internal_hypre_option(USING HOPSCOTCH) set_internal_hypre_option(USING GPU_AWARE_MPI) set_internal_hypre_option(USING GPU_STREAMS) set_internal_hypre_option(USING DEVICE_POOL) set_internal_hypre_option(USING OPENMP) set_internal_hypre_option(USING CUDA) set_internal_hypre_option(USING HIP) set_internal_hypre_option(USING SYCL) set_internal_hypre_option(USING MAGMA) set_internal_hypre_option(USING CALIPER) # Check for conflicting options ensure_options_differ(HYPRE_ENABLE_SINGLE HYPRE_ENABLE_LONG_DOUBLE) ensure_options_differ(HYPRE_ENABLE_CUDA HYPRE_ENABLE_HIP) ensure_options_differ(HYPRE_ENABLE_CUDA HYPRE_ENABLE_SYCL) ensure_options_differ(HYPRE_ENABLE_CUDA HYPRE_ENABLE_BIGINT) ensure_options_differ(HYPRE_ENABLE_CUDA HYPRE_ENABLE_LONG_DOUBLE) ensure_options_differ(HYPRE_ENABLE_SYCL HYPRE_ENABLE_HIP ) ensure_options_differ(HYPRE_ENABLE_SYCL HYPRE_ENABLE_BIGINT) ensure_options_differ(HYPRE_ENABLE_SYCL HYPRE_ENABLE_LONG_DOUBLE) ensure_options_differ(HYPRE_ENABLE_HIP HYPRE_ENABLE_BIGINT) ensure_options_differ(HYPRE_ENABLE_HIP HYPRE_ENABLE_LONG_DOUBLE) ensure_options_differ(HYPRE_ENABLE_LTO HYPRE_ENABLE_SYCL) # TODO: allow LTO with SYCL # Enable CTest support if tests are being built if (HYPRE_BUILD_TESTS) include(CTest) enable_testing() endif() if (BUILD_SHARED_LIBS) set(HYPRE_SHARED ON CACHE INTERNAL "") endif () if (HYPRE_ENABLE_MPI) set(HYPRE_HAVE_MPI ON CACHE INTERNAL "") set(HYPRE_SEQUENTIAL OFF CACHE INTERNAL "") else () set(HYPRE_SEQUENTIAL ON CACHE INTERNAL "") endif () # Add strict checking option if (HYPRE_ENABLE_STRICT_CHECKING) set(HYPRE_ENABLE_MPI OFF CACHE INTERNAL "") set(HYPRE_HAVE_MPI OFF CACHE INTERNAL "") set(HYPRE_SEQUENTIAL ON CACHE INTERNAL "") set(CMAKE_BUILD_TYPE "Debug" CACHE STRING "" FORCE) if(CMAKE_C_COMPILER_ID MATCHES "GNU|Clang") target_compile_options(${PROJECT_NAME} PRIVATE $<$:-O0 -Wall -Wextra -pedantic -Wfloat-conversion -fsingle-precision-constant -Werror> $<$:-Wall -Wshadow -fno-implicit-templates -Woverloaded-virtual -ansi -pedantic>) elseif(CMAKE_C_COMPILER_ID MATCHES "Intel") target_compile_options(${PROJECT_NAME} PRIVATE $<$:-O0 -Wall -Werror> $<$:-O0 -Wall -Werror>) elseif(CMAKE_C_COMPILER_ID MATCHES "XL|XLClang") target_compile_options(${PROJECT_NAME} PRIVATE $<$:-O0 -qinfo=all> $<$:-O0 -qinfo=all>) else() message(WARNING "Unknown C compiler '${CMAKE_C_COMPILER_ID}', using default debug flags") target_compile_options(${PROJECT_NAME} PRIVATE $<$:-O0> $<$:-O0>) endif() message(STATUS "Enabled strict error checking") endif() if (HYPRE_ENABLE_SUPERLU) set(HYPRE_USING_SUPERLU ON CACHE INTERNAL "") add_compile_definitions(HAVE_SUPERLU) endif () if (HYPRE_ENABLE_DSUPERLU) set(HYPRE_USING_DSUPERLU ON CACHE INTERNAL "") set(HYPRE_USING_HYPRE_BLAS OFF CACHE INTERNAL "") set(HYPRE_USING_HYPRE_LAPACK OFF CACHE INTERNAL "") endif () if (HYPRE_ENABLE_FEI) set(HYPRE_USING_FEI ON CACHE INTERNAL "") message(WARNING "CMake support for FEI is not complete!") endif () # FEI doesn't currently compile with shared if (HYPRE_SHARED OR HYPRE_BIGINT OR HYPRE_SINGLE OR HYPRE_LONG_DOUBLE) set(HYPRE_USING_FEI OFF CACHE INTERNAL "") set(HYPRE_ENABLE_FEI OFF CACHE BOOL "Add FEI support" FORCE) endif () if (HYPRE_SEQUENTIAL) set(HYPRE_BUILD_EXAMPLES OFF CACHE BOOL "Build examples" FORCE) endif () if (HYPRE_ENABLE_UMPIRE) set(HYPRE_USING_UMPIRE ON CACHE INTERNAL "") set(HYPRE_USING_UMPIRE_DEVICE ON CACHE INTERNAL "") set(HYPRE_USING_UMPIRE_UM ON CACHE INTERNAL "") endif () if (HYPRE_ENABLE_UMPIRE_HOST) set(HYPRE_ENABLE_UMPIRE ON CACHE INTERNAL "") set(HYPRE_USING_UMPIRE ON CACHE INTERNAL "") set(HYPRE_USING_UMPIRE_HOST ON CACHE INTERNAL "") endif () if (HYPRE_ENABLE_UMPIRE_DEVICE) set(HYPRE_ENABLE_UMPIRE ON CACHE INTERNAL "") set(HYPRE_USING_UMPIRE ON CACHE INTERNAL "") set(HYPRE_USING_UMPIRE_DEVICE ON CACHE INTERNAL "") endif () if (HYPRE_ENABLE_UMPIRE_UM) set(HYPRE_ENABLE_UMPIRE ON CACHE INTERNAL "") set(HYPRE_USING_UMPIRE ON CACHE INTERNAL "") set(HYPRE_USING_UMPIRE_UM ON CACHE INTERNAL "") endif () if (HYPRE_ENABLE_UMPIRE_PINNED) set(HYPRE_ENABLE_UMPIRE ON CACHE INTERNAL "") set(HYPRE_USING_UMPIRE ON CACHE INTERNAL "") set(HYPRE_USING_UMPIRE_PINNED ON CACHE INTERNAL "") endif () # Set MPI compile flags if (HYPRE_ENABLE_MPI) configure_mpi_target() endif () # Set OpenMP compile flags if (HYPRE_ENABLE_OPENMP) find_package(OpenMP REQUIRED) target_link_libraries(${PROJECT_NAME} PUBLIC OpenMP::OpenMP_C) endif () # Add LTO-related flags to hypre if requested if (HYPRE_ENABLE_LTO) # Additional checks before enabling LTO include(CheckIPOSupported) check_ipo_supported(RESULT LTO_SUPPORTED OUTPUT LTO_ERROR) if (LTO_SUPPORTED) message(STATUS "Link-Time Optimization (LTO) enabled for Hypre") else () message(WARNING "Link-Time Optimization (LTO) requested but not supported: ${LTO_ERROR}. Turning it off...") set(HYPRE_ENABLE_LTO OFF) endif () set_target_properties(${PROJECT_NAME} PROPERTIES INTERPROCEDURAL_OPTIMIZATION TRUE) else () set_target_properties(${PROJECT_NAME} PROPERTIES INTERPROCEDURAL_OPTIMIZATION FALSE) message(STATUS "Link-Time Optimization (LTO) disabled") endif () # Setup GPU build options: CUDA, HIP, SYCL are mutually exclusive if (HYPRE_ENABLE_CUDA OR HYPRE_ENABLE_HIP OR HYPRE_ENABLE_SYCL) include(HYPRE_SetupGPUToolkit) else () message(STATUS "GPU support not enabled") set(HYPRE_USING_HOST_MEMORY ON CACHE INTERNAL "") endif () # Add any extra C compiler flags HYPRE_WITH_EXTRA_CFLAGS if (NOT HYPRE_WITH_EXTRA_CFLAGS STREQUAL "") string(REPLACE " " ";" HYPRE_WITH_EXTRA_CFLAGS_LIST ${HYPRE_WITH_EXTRA_CFLAGS}) target_compile_options(${PROJECT_NAME} PRIVATE $<$:${HYPRE_WITH_EXTRA_CFLAGS_LIST}>) endif () # Set output directory for the library set_target_properties(${PROJECT_NAME} PROPERTIES VERSION "${HYPRE_VERSION}" SOVERSION "${HYPRE_VERSION_MAJOR}${HYPRE_VERSION_MINOR}" ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/lib" LIBRARY_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/lib" RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin" ) # Set headers set(HYPRE_MAIN_HEADERS ${CMAKE_CURRENT_BINARY_DIR}/HYPRE_config.h HYPREf.h HYPRE.h ) list(APPEND HYPRE_HEADERS ${HYPRE_MAIN_HEADERS}) # TPL variables set(HYPRE_DEPENDENCY_DIRS "" CACHE INTERNAL "List of absolute paths to third-party libraries (TPLs) directories") set(HYPRE_NEEDS_CXX OFF CACHE INTERNAL "Flag to indicate if C++ is needed for TPLs") # Setup third-party libraries (TPLs) setup_fei() setup_tpl_or_internal(blas) setup_tpl_or_internal(lapack) setup_tpl(superlu) setup_tpl(dsuperlu) setup_tpl(magma) setup_tpl(caliper) setup_tpl(umpire) # Some TPLs need C++ to be enabled (GPU already enables C++ by default) if(HYPRE_NEEDS_CXX AND NOT HYPRE_USING_GPU) enable_language(CXX) endif() # Print the directories used to hint the user about the active TPLs if (HYPRE_DEPENDENCY_DIRS) message(STATUS "Dependency directories: ${HYPRE_DEPENDENCY_DIRS}") endif() # Configure a header file to pass CMake settings to the source code configure_file( "${CMAKE_CURRENT_SOURCE_DIR}/config/HYPRE_config.h.cmake.in" "${CMAKE_CURRENT_BINARY_DIR}/HYPRE_config.h" ) # Headers and sources: remaining subdirectories set(HYPRE_DIRS utilities multivector krylov seq_mv seq_block_mv parcsr_mv parcsr_block_mv distributed_matrix IJ_mv matrix_matrix distributed_ls parcsr_ls struct_mv struct_ls sstruct_mv sstruct_ls) foreach (DIR IN LISTS HYPRE_DIRS) add_subdirectory(${DIR}) target_include_directories(${PROJECT_NAME} PUBLIC $) endforeach () # Set the language for GPU sources (has to be done after the subdirectories are added) if (HYPRE_ENABLE_CUDA) set_source_files_properties(${HYPRE_GPU_SOURCES} PROPERTIES LANGUAGE CUDA) elseif (HYPRE_ENABLE_HIP) set_source_files_properties(${HYPRE_GPU_SOURCES} PROPERTIES LANGUAGE HIP) elseif (HYPRE_ENABLE_SYCL) set_source_files_properties(${HYPRE_GPU_SOURCES} PROPERTIES LANGUAGE CXX) endif() # Include directories target_include_directories(${PROJECT_NAME} PUBLIC $ $ $ $ $ ) # Set file properties for MSVC if (MSVC) target_compile_definitions(${PROJECT_NAME} PRIVATE _CRT_SECURE_NO_WARNINGS) if (MSVC_VERSION LESS 1928) # Visual Studio 2019 version 16.8 claims full C11 support # Use the C++ compiler to compile these files to get around lack of C99 support set_source_files_properties(utilities/hopscotch_hash.c PROPERTIES COMPILE_FLAGS /TP) set_source_files_properties(utilities/merge_sort.c PROPERTIES COMPILE_FLAGS /TP) set_source_files_properties(seq_mv/csr_matop.c PROPERTIES COMPILE_FLAGS /TP) set_source_files_properties(parcsr_mv/par_csr_matop.c PROPERTIES COMPILE_FLAGS /TP) set_source_files_properties(parcsr_mv/par_csr_matvec.c PROPERTIES COMPILE_FLAGS /TP) set_source_files_properties(parcsr_ls/ams.c PROPERTIES COMPILE_FLAGS /TP) set_source_files_properties(parcsr_ls/aux_interp.c PROPERTIES COMPILE_FLAGS /TP) set_source_files_properties(parcsr_ls/par_add_cycle.c PROPERTIES COMPILE_FLAGS /TP) set_source_files_properties(parcsr_ls/par_amg_setup.c PROPERTIES COMPILE_FLAGS /TP) set_source_files_properties(parcsr_ls/par_coarsen.c PROPERTIES COMPILE_FLAGS /TP) set_source_files_properties(parcsr_ls/par_cgc_coarsen.c PROPERTIES COMPILE_FLAGS /TP) set_source_files_properties(parcsr_ls/par_jacobi_interp.c PROPERTIES COMPILE_FLAGS /TP) set_source_files_properties(parcsr_ls/par_mgr_setup.c PROPERTIES COMPILE_FLAGS /TP) set_source_files_properties(parcsr_ls/par_rap.c PROPERTIES COMPILE_FLAGS /TP) set_source_files_properties(parcsr_ls/par_relax.c PROPERTIES COMPILE_FLAGS /TP) set_source_files_properties(parcsr_ls/par_strength.c PROPERTIES COMPILE_FLAGS /TP) endif() if (MSVC_VERSION LESS 1900) #1900 is studio 2015, next older is 1800 which is studio 2013 #Fix issue with visual studio 2013 set_source_files_properties(struct_ls/pfmg3_setup_rap.c PROPERTIES COMPILE_FLAGS /Od) endif() endif () # Build FEI, if requested (to be phased out) if (HYPRE_USING_FEI) add_subdirectory(FEI_mv) endif () # Build the examples directory, if requested if (HYPRE_BUILD_EXAMPLES) add_subdirectory(examples) endif () # Build the test directory, if requested if (HYPRE_BUILD_TESTS) add_subdirectory(test) endif () # Add targets for tags, distclean, and uninstall add_hypre_target_tags() add_hypre_target_distclean() add_hypre_target_uninstall() # Installation include(GNUInstallDirs) install(TARGETS ${PROJECT_NAME} EXPORT HYPRETargets LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} INCLUDES DESTINATION ${CMAKE_INSTALL_INCLUDEDIR} ) install(FILES ${HYPRE_HEADERS} DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}") # Export the package include(CMakePackageConfigHelpers) write_basic_package_version_file( "${CMAKE_CURRENT_BINARY_DIR}/HYPREConfigVersion.cmake" VERSION ${PACKAGE_VERSION} COMPATIBILITY SameMajorVersion ) configure_package_config_file( "${CMAKE_CURRENT_SOURCE_DIR}/config/HYPREConfig.cmake.in" "${CMAKE_CURRENT_BINARY_DIR}/HYPREConfig.cmake" INSTALL_DESTINATION "${CMAKE_CURRENT_BINARY_DIR}/HYPREConfig.cmake" ) install(FILES "${CMAKE_CURRENT_BINARY_DIR}/HYPREConfig.cmake" "${CMAKE_CURRENT_BINARY_DIR}/HYPREConfigVersion.cmake" DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/HYPRE" ) # Install the CMake export file install(EXPORT HYPRETargets FILE HYPRETargets.cmake NAMESPACE HYPRE:: DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/HYPRE" ) # Export from build tree export(EXPORT HYPRETargets FILE "${CMAKE_CURRENT_BINARY_DIR}/HYPRETargets.cmake" NAMESPACE HYPRE:: ) # Declare an alias so that consumers can depend on HYPRE::HYPRE target # also when using HYPRE via add_directory or FetchContent add_library(HYPRE::${PROJECT_NAME} ALIAS ${PROJECT_NAME}) # Ensure the C standard is set on the target set_target_properties(${PROJECT_NAME} PROPERTIES C_STANDARD ${CMAKE_C_STANDARD} C_STANDARD_REQUIRED ON) # Export the package export(PACKAGE ${PROJECT_NAME}) # Print status of the build options print_option_status(${BASE_OPTIONS} ${GPU_OPTIONS} ${TPL_OPTIONS}) hypre-2.33.0/src/FEI_mv/000077500000000000000000000000001477326011500146305ustar00rootroot00000000000000hypre-2.33.0/src/FEI_mv/CMakeLists.txt000066400000000000000000000014771477326011500174010ustar00rootroot00000000000000# Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) include_directories(fei-hypre) # option(HYPRE_USING_SUPERLU "Use internal SuperLU routines" ON) # option(HYPRE_USING_MLI "Use MLI" ON) # # if(HYPRE_USING_SUPERLU) # include_directories(SuperLU/SRC) # add_definitions(-DHAVE_SUPERLU) # add_subdirectory(SuperLU) # set(FEI_LIBS ${FEI_LIBS} $) # endif() # # if(HYPRE_USING_MLI) # include_directories(femli) # add_definitions(-DHAVE_MLI) # if(HYPRE_USING_SUPERLU) # add_definitions(-DMLI_SUPERLU) # endif() # add_subdirectory(femli) # set(FEI_LIBS ${FEI_LIBS} $) # endif() add_subdirectory(fei-hypre) hypre-2.33.0/src/FEI_mv/Makefile000066400000000000000000000015241477326011500162720ustar00rootroot00000000000000# Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) include ../config/Makefile.config all: @ \ for i in ${HYPRE_FEI_SUBDIRS}; \ do \ if [ -d $$i ]; \ then \ echo "Making $$i ..."; \ (cd $$i && $(MAKE) $@) || exit 1; \ fi; \ done install: @ \ for i in ${HYPRE_FEI_SUBDIRS}; \ do \ if [ -d $$i ]; \ then \ echo "Making $$i ..."; \ (cd $$i && $(MAKE) $@) || exit 1; \ fi; \ done clean: @ \ for i in ${HYPRE_FEI_SUBDIRS}; \ do \ if [ -d $$i ]; \ then \ (cd $$i && $(MAKE) $@) || exit 1; \ fi; \ done distclean: @ \ for i in ${HYPRE_FEI_SUBDIRS}; \ do \ if [ -d $$i ]; \ then \ (cd $$i && $(MAKE) $@) || exit 1; \ fi; \ done hypre-2.33.0/src/FEI_mv/fei-hypre/000077500000000000000000000000001477326011500165205ustar00rootroot00000000000000hypre-2.33.0/src/FEI_mv/fei-hypre/CHANGELOG000066400000000000000000000256261477326011500177450ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ *********************************************************************** * This file records the changes made to this directory */ *********************************************************************** 02/07/01 Version 1.5.0R1 02/13/01 version 1.5.0R2 - modify the matrixLoadComplete function to output matrix to a file even when it has been previously assembled (per Tim Dunn's request) 02/15/01 version 1.5.0R3 - correct an error in MPI_Allreduce in buildSchurRHS. - take out a duplicate destroy(f1) in buildSchurRHS - in matrixLoadComplete, change to print original matrix - fix the SuperLU nrows for Schur reduced systems - in BuildSchurReducedRHS, set currX and currB - in BuildSchurReducedRHS, multiply ddata instead of divide 02/20/01 still version 1.5.0R3 - fix memory leaks with reusing selectedList_ - change isis option to hypre in cfei-hypre.h 02/21/01 still version 1.5.0R4 - major debug for minResProjection, interface change also 02/22/01 version 1.5.0R5 - add in debug versions of A-Conjugate and MinRes projections - change Schur reduction to look for Schur rows from top 02/23/01 still version 1.5.0R5 - debug Schur reduction when a pressure BC is imposed (not SPD) 02/26/01 still version 1.5.0R5 - fix a bug in buildRHS (multiply inv(M) instead of divide) - fix the printMat option (print HYb_ instead of currB_) in matrixLoadComplete 02/28/01 version 2.0.0R6 - remove extra zeros in rows that at BC's 03/06/01 version 1.5.0R6 and 2.0.0R6 - fix a bug in buildReducedRHS (ProcNRows) 04/10/01 2.0.0R7 - fix a bug in BC handling (reset values, not take out columns) - optimize by taking out zeros in loading matrix to parcsr - revert Schur complement reduction to old ways 04/12/01 - convert totally to 2.0 04/24/01 2.0.0R8 - add Euclid preconditioner - create an amgDebug flag for boomeramg diagnostics 04/25/01 2.0.0R8 - make preconditioner reuse more usable - make A-conjugate projection restart instead of truncation 04/26/01 2.0.0R9 - split HYPRE_LinSysCore.C into 2 files and shorten subroutines - add system AMG 05/02/01 2.0.0R9 - take out iostream.h because it creates problem on solaris 05/10/01 2.0.0R10 - re-work launchSolver parameter setting for preconditioners. - add diagnostic information to SuperLUX 06/14/01 2.0.0R11 - re-work hypre_slide_reduce.C to give smaller subroutines - output matrices to file in longer precision 06/25/01 2.0.1R1 - change to the new IJ interface - add timings for non-MPI version 07/17/01 2.0.1R2 - improve the projection methods - add amgMaxIter 07/19/01 2.0.1R3 - fix a bug in the lower and upper bounds of MatrixCreate - fix problems with the projection methods 07/30/01 2.0.1R4 - this should couple with the bug fix in the new IJMatrix - include automatically SuperLU - a few more changes to new IJMatrix/Vectors in SuperLU/AMGe part of the code 09/14/01 2.0.1R5 - get rid of the HYPRE_LSI_Sort function - add identity preconditioner - add incompressible flow block preconditioners 09/21/01 2.0.1R6 - add Symmetric QMR 10/17/01 2.0.1R7 - add flexible GMRES - fix SuperLU problems for HP machines 10/25/01 2.0.1R8 - major reorganization of the block preconditioning module 12/05/01 2.0.1R9 - fix several memory leaks 12/19/01 2.0.1R10 - add links to MLI 01/02/02 2.0.1R11 - add functions to get element matrices from FEI - renovate the parameters function - get rid of FEGridInfo module. 01/08/02 2.0.1R12 - add functions to directly transfer element information from FEI - fix a bug in mli_fedata.C 03/18/02 2.0.1R13 - debug the schurReduction version 2 - update with respect to FEI 2.x.12 03/26/02 2.0.1R14 - optimize the matrix loading phase - get rid of the old matrix stuff 04/26/02 2.0.1R15 - add new slide reduction capability 05/17/02 2.0.1R16 - add Uzawa algorithm - debug/improve slide reduction capability - debug problems on blue (abs function) 05/30/02 2.0.1R17 - add distribute SuperLU (not working yet) - problem probably in DSuperLU 07/02/02 2.0.1R18 - add hybrid CG diag/AMG solver - fix ddilut problems - take out MLI compiler complaints 07/26/02 2.0.1R19 - improve on MLI's SGS and BSGS smoothers - add LSICG - consolidate setupPrecon and correct a few include problems 09/18/02 2.0.0R20 - take out iostream.h again because it creates problem on solaris - improve slideReduction for intersecting slide surfaces - fix resetInitialGuess for Schur reduction - take out diagnostic messages in SuperLU 10/22/02 2.0.0R21 - fix a bug in HYPRE_SlideReduction.C - implement null space correction in slide reduction - incorporate LOBPCG for null space correction - take out the last iostream.h from fei-base - major revision of femli 10/30/02 2.0.0R22 - add normal equation approach - fix a few memory leaks in SuperLU - change Pweight default to 0.0 - add ESSL to block smoothers 11/21/02 2.0.0R23 - add material coarsening - add polynomial null vectors 11/27/02 2.0.0R24 - add nonsymmetric AMG - correct bug in matrix_mult : put diag in front - add better matrix transpose function 12/03/02 2.0.0R25 - add variable tolerance for block preconditioning - fix autotest bug (unused variables) in mli_method_amgrs.C 12/18/02 2.0.0R26 - add Kaczmarz smoother - correct a bug in mli_solver_gs.C 12/19/02 2.5.0R1 - change major revision number to reflect use of fei-2.5.0 - fix a bug with fgmres variable preconditioning - change normal equation to construct it in launch stage - put null detection in gmres 01/08/03 2.5.0R2 - take out strings.h include file from fei-hypre and femli - move HYPRE_LSI_Uzawa.h to HYPRE_LSI_Uzawa_c.h to avoid compile problems on Microsoft windows. - fix SGS problem with relaxation parameter - add diagnostics (print rnorm) tool to SGS - add window option for strcasecmp in fei-hypre and femli 01/14/03 2.5.0R3 - add scale matrix function (not done yet) - fix nodal coordinate passing - mli works now even local_nrows =0 for some processors - amgrs not work perfectly since matrixTranspose not working right. - add diagnostics to SGS smoother - change mli test driver to run nonsymmetric problems. 04/29/03 2.5.1R1 - modify putIntoSystemMatrix to support fei-lite - add a few more diagnostics messages (per Kull's problem) 06/09/03 2.5.1R2 - correct an error with gmres (convergence check) 08/21/03 2.5.1R3 - put in an additional fe class for multiple domain per proc - take out compiler warnings - take out a few memory leaks 09/12/03 2.5.1R4 - put in ARPACK and eigenvector nullspace for aggregation - add scalar variable to aggregation - change error threshold for QR - add amgMaxLevels 09/19/03 2.5.2R1 - add slide reduction option 4 to handle ALE3D's constraint problems - clean up a little bit for HYPRE_SlideReduction 10/30/03 2.5.2R2 - add compatible relaxation to femli/amgrs - clean up some compiler complaints 11/07/03 2.5.2R3 - clean up a lot compiler complaints - improve on the AMGSAe capabilities. 11/18/03 2.5.2R4 - clean up a few compiler complaints - a few adjustments for mli - re-do the outputlevel stuff 11/19/03 2.5.3R1 - fix the vendor blas/lapack problem in superlu 12/04/03 2.5.4R1 - change the blas/lapack problem in superlu one more time - add gmres smoother - add one more coarsening in AMGSA 12/17/03 2.5.4R2 - add a few more options in HYPRE_LSI_mli.cxx - perfect the global coarsening in AMGSA - smooth vector AMGSA capability by Edmond 04/21/04 2.5.4R3 - take out MPI functions from FEI_HYPRE_Impl.cxx - take out MPI reference from FEI_HYPRE_include.h - add Edmond's smooth vector capabilites via the FEI - MLI now default (HYPRE_LinSycCore.cxx, HYPRE_LSC_aux.cxx, etc.) 04/27/04 2.5.5R1 - correct autotest complaints - add new fei implementation 07/01/04 2.5.5R2 - separate superlu and blas and lapack from HYPRE_LSI - better amgsa coarsening - deal with lsame and xerbla multiply defined problems 07/31/04 2.5.5R3 - add error flag return to satisfy Al Nichols' need (include changes to krylov, fei-hypre, and ParaSails) 10/11/04 2.6.1R1 - change semantics for with-blas and with-lapack - add domain decomposition algorithm, mli smoothing - add tolerance for arpack 11/30/04 2.6.2R1 - add hybrid SA/GSA preconditioner to CG and GMRES - major revision to configure/makefile - add up to 24 null space vector to AMGSA 03/30/06 2.7.1R1 - add ML Maxwell - to use: turn on define in HYPRE_MLMaxwell.h, compile hypre and ml, copy libml.a to hypre/lib, copy ml_maxwell.cxx to test directory, modify Makefile in test directory to compile ml_maxwell.cxx (link with ml), and run with Gradient and EdgeStiff files (first line nnz, number of rows, number of columns, then entries with 0-based.) hypre-2.33.0/src/FEI_mv/fei-hypre/CMakeLists.txt000066400000000000000000000025721477326011500212660ustar00rootroot00000000000000# Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) set(HYPRE_fei_HEADERS cfei-hypre.h cfei_hypre.h hypre_cfei.h HYPRE_LinSysCore.h HYPRE_FEI_includes.h LLNL_FEI_Fei.h LLNL_FEI_Impl.h LLNL_FEI_LSCore.h LLNL_FEI_Matrix.h LLNL_FEI_Solver.h ) set(HYPRE_fei_SRCS HYPRE_LSI_Dsuperlu.c HYPRE_LSI_ddict.c HYPRE_LSI_ddilut.c HYPRE_LSI_ml.c HYPRE_LSI_mlmaxwell.c HYPRE_LSI_poly.c HYPRE_LSI_schwarz.c HYPRE_parcsr_TFQmr.c HYPRE_parcsr_bicgs.c HYPRE_parcsr_bicgstabl.c HYPRE_parcsr_fgmres.c HYPRE_parcsr_lsicg.c HYPRE_parcsr_symqmr.c HYPRE_parcsr_maxwell.c SymQMR.c TFQmr.c bicgs.c bicgstabl.c fgmres.c hypre_lsi_amge.c hypre_lsi_ddamg.c hypre_lsi_misc.c lsicg.c FEI_HYPRE_Impl.cxx LLNL_FEI_Impl.cxx LLNL_FEI_Fei.cxx LLNL_FEI_LSCore.cxx LLNL_FEI_Solver.cxx LLNL_FEI_Matrix.cxx HYPRE_LSC_aux.cxx HYPRE_LSI_UZAWA.cxx HYPRE_LSI_blkprec.cxx HYPRE_LSI_mli.cxx HYPRE_LinSysCore.cxx HYPRE_SlideReduction.cxx cfei_hypre.cxx hypre_cfei.cxx hypre_schur_reduce.cxx hypre_slide_reduce.cxx HYPRE_fei_mesh.cxx HYPRE_fei_matrix.cxx HYPRE_fei_vector.cxx ) install (FILES ${HYPRE_fei_HEADERS} DESTINATION include) target_sources(${PROJECT_NAME} PRIVATE ${HYPRE_fei_SRCS} ) hypre-2.33.0/src/FEI_mv/fei-hypre/FEI_HYPRE_Impl.cxx000066400000000000000000004162311477326011500216060ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /************************************************************************** Module: FEI_HYPRE_Impl.cpp Purpose: custom (local) implementation of the FEI/LSC **************************************************************************/ #include #include #include #include /*------------------------------------------------------------------------- MPI definitions -------------------------------------------------------------------------*/ #include "FEI_HYPRE_include.h" #include "_hypre_utilities.h" #include "HYPRE.h" /*------------------------------------------------------------------------- local defines and external functions -------------------------------------------------------------------------*/ #include "FEI_HYPRE_Impl.h" #ifdef HAVE_SUPERLU_20 #include "dsp_defs.h" #include "superlu_util.h" #endif #ifdef HAVE_SUPERLU #include "slu_ddefs.h" #include "slu_util.h" #endif extern "C" { int HYPRE_LSI_Search(int *, int, int); } #define habs(x) ((x > 0) ? x : -(x)) /************************************************************************** ************************************************************************** Each element block contains a number of elements of the same type (e.g. hex or tet element). For this implementation, all element block should have the same number of degree of freedom per node. **************************************************************************/ /************************************************************************** Constructor -------------------------------------------------------------------------*/ FEI_HYPRE_Elem_Block::FEI_HYPRE_Elem_Block( int blockID ) { blockID_ = blockID; currElem_ = 0; numElems_ = 0; nodesPerElem_ = 0; nodeDOF_ = 0; elemIDs_ = NULL; elemNodeLists_ = NULL; elemMatrices_ = NULL; rhsVectors_ = NULL; solnVectors_ = NULL; tempX_ = NULL; tempY_ = NULL; sortedIDs_ = NULL; sortedIDAux_ = NULL; } /************************************************************************** destructor -------------------------------------------------------------------------*/ FEI_HYPRE_Elem_Block::~FEI_HYPRE_Elem_Block() { int iE; if ( elemIDs_ != NULL ) delete [] elemIDs_; if ( elemNodeLists_ != NULL ) { for ( iE = 0; iE < numElems_; iE++ ) if ( elemNodeLists_[iE] != NULL ) delete [] elemNodeLists_[iE]; delete [] elemNodeLists_; } if ( elemMatrices_ != NULL ) { for ( iE = 0; iE < numElems_; iE++ ) if ( elemMatrices_[iE] != NULL ) delete [] elemMatrices_[iE]; delete [] elemMatrices_; } if ( rhsVectors_ != NULL ) { for ( iE = 0; iE < numElems_; iE++ ) if ( rhsVectors_[iE] != NULL ) delete [] rhsVectors_[iE]; delete [] rhsVectors_; } if ( solnVectors_ != NULL ) { for ( iE = 0; iE < numElems_; iE++ ) if ( solnVectors_[iE] != NULL ) delete [] solnVectors_[iE]; delete [] solnVectors_; } if ( sortedIDs_ != NULL ) delete [] sortedIDs_; if ( sortedIDAux_ != NULL ) delete [] sortedIDAux_; if ( tempX_ != NULL ) delete [] tempX_; if ( tempY_ != NULL ) delete [] tempY_; } /************************************************************************** initialization -------------------------------------------------------------------------*/ int FEI_HYPRE_Elem_Block::initialize(int numElements, int numNodesPerElement, int dofPerNode) { int iE; if ( elemIDs_ != NULL ) delete [] elemIDs_; if ( elemNodeLists_ != NULL ) { for ( iE = 0; iE < numElems_; iE++ ) if ( elemNodeLists_[iE] != NULL ) delete [] elemNodeLists_[iE]; delete [] elemNodeLists_; } if ( elemMatrices_ != NULL ) { for ( iE = 0; iE < numElems_; iE++ ) if ( elemMatrices_[iE] != NULL ) delete [] elemMatrices_[iE]; delete [] elemMatrices_; } if ( rhsVectors_ != NULL ) { for ( iE = 0; iE < numElems_; iE++ ) if ( rhsVectors_[iE] != NULL ) delete [] rhsVectors_[iE]; delete [] rhsVectors_; } if ( solnVectors_ != NULL ) { for ( iE = 0; iE < numElems_; iE++ ) if ( solnVectors_[iE] != NULL ) delete [] solnVectors_[iE]; delete [] solnVectors_; } numElems_ = numElements; nodesPerElem_ = numNodesPerElement; nodeDOF_ = dofPerNode; currElem_ = 0; elemIDs_ = new int[numElems_]; elemNodeLists_ = new int*[numElems_]; for ( iE = 0; iE < numElems_; iE++ ) elemNodeLists_[iE] = NULL; elemMatrices_ = new double*[numElems_]; for ( iE = 0; iE < numElems_; iE++ ) elemMatrices_[iE] = NULL; rhsVectors_ = new double*[numElems_]; for ( iE = 0; iE < numElems_; iE++ ) rhsVectors_[iE] = NULL; solnVectors_ = new double*[numElems_]; for ( iE = 0; iE < numElems_; iE++ ) solnVectors_[iE] = NULL; return 0; } /************************************************************************** reset the system for reloading (no reinitialization needed) -------------------------------------------------------------------------*/ int FEI_HYPRE_Elem_Block::reset() { if ( elemNodeLists_ != NULL ) { for ( int iE = 0; iE < numElems_; iE++ ) { if ( elemNodeLists_[iE] != NULL ) delete [] elemNodeLists_[iE]; elemNodeLists_[iE] = NULL; } } if ( elemMatrices_ != NULL ) { for ( int iE = 0; iE < numElems_; iE++ ) { if ( elemMatrices_[iE] != NULL ) delete [] elemMatrices_[iE]; elemMatrices_[iE] = NULL; } } if ( rhsVectors_ != NULL ) { for ( int iE = 0; iE < numElems_; iE++ ) { if ( rhsVectors_[iE] != NULL ) delete [] rhsVectors_[iE]; rhsVectors_[iE] = NULL; } } currElem_ = 0; return 0; } /************************************************************************** reset the element load vectors -------------------------------------------------------------------------*/ int FEI_HYPRE_Elem_Block::resetRHSVectors(double s) { int iE, iD, matDim=nodesPerElem_*nodeDOF_; if ( rhsVectors_ != NULL ) { for ( iE = 0; iE < numElems_; iE++ ) for ( iD = 0; iD < matDim; iD++ ) rhsVectors_[iE][iD] = s; } currElem_ = 0; return 0; } /************************************************************************** reset the element solution vectors -------------------------------------------------------------------------*/ int FEI_HYPRE_Elem_Block::resetSolnVectors(double s) { int iE, iD, matDim=nodesPerElem_*nodeDOF_; if ( solnVectors_ != NULL ) { for ( iE = 0; iE < numElems_; iE++ ) for ( iD = 0; iD < matDim; iD++ ) solnVectors_[iE][iD] = s; } currElem_ = 0; return 0; } /************************************************************************** load individual element information -------------------------------------------------------------------------*/ int FEI_HYPRE_Elem_Block::loadElemInfo(int elemID, int *elemConn, double **elemStiff, double *elemLoad) { if ( currElem_ >= numElems_ ) { printf("FEI_HYPRE_Elem_Block::loadElemInfo ERROR : too many elements.\n"); exit(1); } #if 0 printf("Loading element %d : ", elemID); for ( int iN2 = 0; iN2 < nodesPerElem_; iN2++ ) printf("%d ", elemConn[iN2]); printf("\n"); #endif elemNodeLists_[currElem_] = new int[nodesPerElem_]; int matDim = nodesPerElem_ * nodeDOF_; elemMatrices_[currElem_] = new double[matDim*matDim]; rhsVectors_[currElem_] = new double[matDim]; if ( solnVectors_[currElem_] != NULL ) delete [] solnVectors_[currElem_]; solnVectors_[currElem_] = new double[matDim]; elemIDs_[currElem_] = elemID; for ( int iN = 0; iN < nodesPerElem_; iN++ ) elemNodeLists_[currElem_][iN] = elemConn[iN]; for ( int iM = 0; iM < matDim; iM++ ) rhsVectors_[currElem_][iM] = elemLoad[iM]; for ( int iM2 = 0; iM2 < matDim; iM2++ ) solnVectors_[currElem_][iM2] = 0.0; for ( int iM3 = 0; iM3 < matDim; iM3++ ) for ( int jM = 0; jM < matDim; jM++ ) elemMatrices_[currElem_][jM*matDim+iM3] = elemStiff[iM3][jM]; currElem_++; return 0; } /************************************************************************** load individual element matrix only -------------------------------------------------------------------------*/ int FEI_HYPRE_Elem_Block::loadElemMatrix(int elemID, int *elemConn, double **elemStiff) { if ( currElem_ >= numElems_ ) { printf("FEI_HYPRE_Elem_Block::loadElemMatrix ERROR:too many elements.\n"); exit(1); } #if 0 printf("Loading element %d : ", elemID); for ( int iN = 0; iN < nodesPerElem_; iN++ ) printf("%d ", elemConn[iN]); printf("\n"); #endif elemNodeLists_[currElem_] = new int[nodesPerElem_]; int matDim = nodesPerElem_ * nodeDOF_; elemMatrices_[currElem_] = new double[matDim*matDim]; if ( solnVectors_[currElem_] != NULL ) delete [] solnVectors_[currElem_]; solnVectors_[currElem_] = new double[matDim]; elemIDs_[currElem_] = elemID; for ( int iN = 0; iN < nodesPerElem_; iN++ ) elemNodeLists_[currElem_][iN] = elemConn[iN]; for ( int iM2 = 0; iM2 < matDim; iM2++ ) solnVectors_[currElem_][iM2] = 0.0; for ( int iM3 = 0; iM3 < matDim; iM3++ ) for ( int jM = 0; jM < matDim; jM++ ) elemMatrices_[currElem_][jM*matDim+iM3] = elemStiff[iM3][jM]; currElem_++; return 0; } /************************************************************************** load individual load information -------------------------------------------------------------------------*/ int FEI_HYPRE_Elem_Block::loadElemRHS(int elemID, double *elemLoad) { int iD, iE, matDim=nodesPerElem_*nodeDOF_; if ( currElem_ >= numElems_ ) currElem_ = 0; if ( numElems_ > 0 && elemID != elemIDs_[currElem_] ) { if ( sortedIDs_ == NULL ) { sortedIDs_ = new int[numElems_]; sortedIDAux_ = new int[numElems_]; for ( iE = 0; iE < numElems_; iE++ ) sortedIDs_[iE] = elemIDs_[iE]; for ( iE = 0; iE < numElems_; iE++ ) sortedIDAux_[iE] = iE; FEI_HYPRE_Impl::IntSort2(sortedIDs_, sortedIDAux_, 0, numElems_-1); } currElem_ = HYPRE_LSI_Search(sortedIDs_, elemID, numElems_); } if ( rhsVectors_ == NULL ) { rhsVectors_ = new double*[numElems_]; for ( iE = 0; iE < numElems_; iE++ ) rhsVectors_[iE] = NULL; } if ( rhsVectors_[currElem_] == NULL ) rhsVectors_[currElem_] = new double[matDim]; for ( iD = 0; iD < matDim; iD++ ) rhsVectors_[currElem_][iD] = elemLoad[iD]; currElem_++; return 0; } /************************************************************************** check to see if all element information has been loaded -------------------------------------------------------------------------*/ int FEI_HYPRE_Elem_Block::checkLoadComplete() { if ( currElem_ != numElems_ ) return 1; else { if ( tempX_ != NULL ) delete [] tempX_; if ( tempY_ != NULL ) delete [] tempY_; tempX_ = new double[nodesPerElem_*nodeDOF_]; tempY_ = new double[nodesPerElem_*nodeDOF_]; } return 0; } /************************************************************************** FEI_HYPRE_Impl is the core linear system interface. Each instantiation supports multiple elememt blocks. **************************************************************************/ /************************************************************************** Constructor -------------------------------------------------------------------------*/ FEI_HYPRE_Impl::FEI_HYPRE_Impl( MPI_Comm comm ) { mpiComm_ = comm; MPI_Comm_rank( comm, &mypid_ ); numBlocks_ = 0; elemBlocks_ = NULL; outputLevel_ = 0; /* ----------------------------------------------------------------- * node information * ----------------------------------------------------------------*/ numLocalNodes_ = 0; numExtNodes_ = 0; nodeDOF_ = 1; nodeGlobalIDs_ = NULL; nodeExtNewGlobalIDs_ = NULL; globalNodeOffsets_ = NULL; numSharedNodes_ = 0; sharedNodeIDs_ = NULL; sharedNodeNProcs_ = NULL; sharedNodeProcs_ = NULL; /* ----------------------------------------------------------------- * communication information * ----------------------------------------------------------------*/ nRecvs_ = 0; recvLengs_ = NULL; recvProcs_ = NULL; recvProcIndices_ = NULL; nSends_ = 0; sendLengs_ = NULL; sendProcs_ = NULL; sendProcIndices_ = NULL; /* ----------------------------------------------------------------- * solver information * ----------------------------------------------------------------*/ solverID_ = 0; krylovMaxIterations_ = 1000; krylovAbsRel_ = 0; /* 0 - relative norm */ krylovTolerance_ = 1.0e-6; krylovIterations_ = 0; krylovResidualNorm_ = 0.0; gmresDim_ = 20; /* ----------------------------------------------------------------- * matrix and vector information * ----------------------------------------------------------------*/ diagIA_ = NULL; diagJA_ = NULL; diagAA_ = NULL; offdIA_ = NULL; offdJA_ = NULL; offdAA_ = NULL; diagonal_ = NULL; solnVector_ = NULL; rhsVector_ = NULL; /* ----------------------------------------------------------------- * node boundary condition information * ----------------------------------------------------------------*/ numBCNodes_ = 0; BCNodeIDs_ = NULL; BCNodeAlpha_ = NULL; BCNodeBeta_ = NULL; BCNodeGamma_ = NULL; /* ----------------------------------------------------------------- * others * ----------------------------------------------------------------*/ FLAG_PrintMatrix_ = 0; FLAG_LoadComplete_ = 0; TimerLoad_ = 0.0; TimerLoadStart_ = 0.0; TimerSolve_ = 0.0; TimerSolveStart_ = 0.0; } /************************************************************************** destructor -------------------------------------------------------------------------*/ FEI_HYPRE_Impl::~FEI_HYPRE_Impl() { if ( outputLevel_ > 0 ) printf("%4d : FEI_HYPRE_Impl destructor\n", mypid_); for ( int iB = 0; iB < numBlocks_; iB++ ) if ( elemBlocks_[iB] != NULL ) delete elemBlocks_[iB]; if ( nodeGlobalIDs_ != NULL ) delete [] nodeGlobalIDs_; if ( nodeExtNewGlobalIDs_ != NULL ) delete [] nodeExtNewGlobalIDs_; if ( globalNodeOffsets_ != NULL ) delete [] globalNodeOffsets_; if ( recvLengs_ != NULL ) delete [] recvLengs_; if ( recvProcs_ != NULL ) delete [] recvProcs_; if ( recvProcIndices_ != NULL ) { for (int iP = 0; iP < nRecvs_; iP++) delete [] recvProcIndices_[iP]; delete [] recvProcIndices_; } if ( sendLengs_ != NULL ) delete [] sendLengs_; if ( sendProcs_ != NULL ) delete [] sendProcs_; if ( sendProcIndices_ != NULL ) { for (int iP = 0; iP < nSends_; iP++) delete [] sendProcIndices_[iP]; delete [] sendProcIndices_; } if ( diagIA_ != NULL ) delete [] diagIA_; if ( diagJA_ != NULL ) delete [] diagJA_; if ( diagAA_ != NULL ) delete [] diagAA_; if ( offdIA_ != NULL ) delete [] offdIA_; if ( offdJA_ != NULL ) delete [] offdJA_; if ( offdAA_ != NULL ) delete [] offdAA_; if ( diagonal_ != NULL ) delete [] diagonal_; if ( solnVector_ != NULL ) delete [] solnVector_; if ( rhsVector_ != NULL ) delete [] rhsVector_; if ( BCNodeIDs_ != NULL ) delete [] BCNodeIDs_; if ( BCNodeAlpha_ != NULL ) { for ( int iD = 0; iD < numBCNodes_; iD++ ) delete [] BCNodeAlpha_[iD]; delete [] BCNodeAlpha_; } if ( BCNodeBeta_ != NULL ) { for ( int iD = 0; iD < numBCNodes_; iD++ ) delete [] BCNodeBeta_[iD]; delete [] BCNodeBeta_; } if ( BCNodeGamma_ != NULL ) { for ( int iD = 0; iD < numBCNodes_; iD++ ) delete [] BCNodeGamma_[iD]; delete [] BCNodeGamma_; } } /************************************************************************** parameters function -------------------------------------------------------------------------*/ int FEI_HYPRE_Impl::parameters(int numParams, char **paramString) { int i, olevel; char param[256], param1[256]; #ifdef HAVE_SUPERLU int nprocs; #endif for ( i = 0; i < numParams; i++ ) { sscanf(paramString[i],"%s", param1); if ( ! strcmp(param1, "outputLevel") ) { sscanf(paramString[i],"%s %d", param1, &olevel); outputLevel_ = olevel; if ( olevel < 0 ) outputLevel_ = 0; if ( olevel > 4 ) outputLevel_ = 4; } else if ( ! strcmp(param1, "setDebug") ) { sscanf(paramString[i],"%s %s", param1, param); if ( ! strcmp(param, "printMat") ) FLAG_PrintMatrix_ = 1; } else if ( ! strcmp(param1, "gmresDim") ) { sscanf(paramString[i],"%s %d", param1, &gmresDim_); if ( gmresDim_ < 0 ) gmresDim_ = 10; } else if ( ! strcmp(param1, "maxIterations") ) { sscanf(paramString[i],"%s %d", param1, &krylovMaxIterations_); if ( krylovMaxIterations_ <= 0 ) krylovMaxIterations_ = 1; } else if ( ! strcmp(param1, "tolerance") ) { sscanf(paramString[i],"%s %lg", param1, &krylovTolerance_); if ( krylovTolerance_ >= 1.0 || krylovTolerance_ <= 0.0 ) krylovTolerance_ = 1.0e-6; } else if ( ! strcmp(param1, "stopCrit") ) { sscanf(paramString[i],"%s %s", param1, param); if ( ! strcmp(param, "absolute") ) krylovAbsRel_ = 1; else if ( ! strcmp(param, "relative") ) krylovAbsRel_ = 0; else krylovAbsRel_ = 0; } else if ( ! strcmp(param1, "solver") ) { sscanf(paramString[i],"%s %s", param1, param); if ( ! strcmp(param, "cg") ) solverID_ = 0; else if ( ! strcmp(param, "gmres") ) solverID_ = 1; else if ( ! strcmp(param, "cgs") ) solverID_ = 2; else if ( ! strcmp(param, "bicgstab")) solverID_ = 3; #ifdef HAVE_SUPERLU else if ( ! strcmp(param, "superlu") ) { MPI_Comm_size( mpiComm_, &nprocs ); if ( nprocs == 1 ) solverID_ = 4; else { printf("FEI_HYPRE_Impl WARNING : SuperLU not supported on "); printf("more than 1 proc. Use GMRES instead.\n"); solverID_ = 1; } } #endif else solverID_ = 1; } else if ( ! strcmp(param1, "preconditioner") ) { sscanf(paramString[i],"%s %s", param1, param); if ( (! ! strcmp(param, "diag")) && (! ! strcmp(param, "diagonal")) ) printf("FEI_HYPRE_Impl::parameters - invalid preconditioner.\n"); } } return 0; } /************************************************************************** initialize nodal degree of freedom -------------------------------------------------------------------------*/ int FEI_HYPRE_Impl::initFields(int numFields, int *fieldSizes, int *fieldIDs) { (void) fieldIDs; if ( numFields != 1 ) { printf("%4d : FEI_HYPRE_Impl::initFields WARNING - numFields != 1.", mypid_); printf(" Take field 0.\n"); nodeDOF_ = fieldSizes[0]; return -1; } nodeDOF_ = fieldSizes[0]; return 0; } /************************************************************************** set element and node information -------------------------------------------------------------------------*/ int FEI_HYPRE_Impl::initElemBlock(int elemBlockID, int numElements, int numNodesPerElement, int *numFieldsPerNode, int **nodalFieldIDs, int numElemDOFFieldsPerElement, int *elemDOFFieldIDs, int interleaveStrategy) { (void) numFieldsPerNode; (void) nodalFieldIDs; (void) numElemDOFFieldsPerElement; (void) elemDOFFieldIDs; (void) interleaveStrategy; if ( outputLevel_ >= 2 ) { printf("%4d : FEI_HYPRE_Impl::initElemBlock begins... \n", mypid_); printf(" elemBlockID = %d \n", elemBlockID); printf(" numElements = %d \n", numElements); printf(" nodesPerElem = %d \n", numNodesPerElement); for ( int iN = 0; iN < numNodesPerElement; iN++ ) { printf(" Node %d has fields : ", iN); for ( int iF = 0; iF < numFieldsPerNode[iN]; iF++ ) printf("%d ", nodalFieldIDs[iN][iF]); printf("\n"); } for ( int iE = 0; iE < numElemDOFFieldsPerElement; iE++ ) printf(" Element field IDs %d = %d\n", iE, elemDOFFieldIDs[iE]); } if ( numBlocks_ == 0 ) { elemBlocks_ = new FEI_HYPRE_Elem_Block*[1]; elemBlocks_[0] = new FEI_HYPRE_Elem_Block(elemBlockID); numBlocks_ = 1; } else { for ( int iB = 0; iB < numBlocks_; iB++ ) { if ( elemBlocks_[iB]->getElemBlockID() == elemBlockID ) { printf("%4d : FEI_HYPRE_Impl::initElemBlock ERROR - ",mypid_); printf("repeated blockID\n"); exit(1); } } FEI_HYPRE_Elem_Block **tempBlocks = elemBlocks_; numBlocks_++; elemBlocks_ = new FEI_HYPRE_Elem_Block*[numBlocks_]; for ( int iB2 = 0; iB2 < numBlocks_-1; iB2++ ) elemBlocks_[iB2] = tempBlocks[iB2]; elemBlocks_[numBlocks_-1] = new FEI_HYPRE_Elem_Block(elemBlockID); } elemBlocks_[numBlocks_-1]->initialize(numElements, numNodesPerElement, nodeDOF_); FLAG_LoadComplete_= 0; if ( outputLevel_ >= 2 ) printf("%4d : FEI_HYPRE_Impl::initElemBlock ends.\n", mypid_); return 0; } /************************************************************************** initialize shared node information -------------------------------------------------------------------------*/ int FEI_HYPRE_Impl::initSharedNodes(int nShared, int *sharedIDs, int *sharedNProcs, int **sharedProcs) { int iN, iP, newNumShared, *oldSharedIDs, *oldSharedNProcs; int **oldSharedProcs; if ( outputLevel_ >= 2 ) printf("%4d : FEI_HYPRE_Impl::initSharedNodes begins... \n", mypid_); TimerLoadStart_ = MPI_Wtime(); if ( numSharedNodes_ > 0 ) { newNumShared = numSharedNodes_ + nShared; oldSharedIDs = sharedNodeIDs_; sharedNodeIDs_ = new int[newNumShared]; for ( iN = 0; iN < numSharedNodes_; iN++ ) sharedNodeIDs_[iN] = oldSharedIDs[iN]; for ( iN = 0; iN < nShared; iN++ ) sharedNodeIDs_[iN+numSharedNodes_] = sharedIDs[iN]; oldSharedNProcs = sharedNodeNProcs_; sharedNodeNProcs_ = new int[newNumShared]; for ( iN = 0; iN < numSharedNodes_; iN++ ) sharedNodeNProcs_[iN] = oldSharedNProcs[iN]; for ( iN = 0; iN < nShared; iN++ ) sharedNodeNProcs_[iN+numSharedNodes_] = sharedNProcs[iN]; oldSharedProcs = sharedNodeProcs_; sharedNodeProcs_ = new int*[newNumShared]; for ( iN = 0; iN < numSharedNodes_; iN++ ) sharedNodeProcs_[iN] = oldSharedProcs[iN]; for ( iN = 0; iN < nShared; iN++ ) { sharedNodeProcs_[iN+numSharedNodes_] = new int[sharedNProcs[iN]]; for ( iP = 0; iP < sharedNProcs[iN]; iP++ ) sharedNodeProcs_[iN+numSharedNodes_][iP] = sharedProcs[iN][iP]; } numSharedNodes_ = newNumShared; delete [] oldSharedProcs; delete [] oldSharedNProcs; delete [] oldSharedIDs; } else { numSharedNodes_ = nShared; sharedNodeIDs_ = new int[nShared]; for ( iN = 0; iN < nShared; iN++ ) sharedNodeIDs_[iN] = sharedIDs[iN]; sharedNodeNProcs_ = new int[nShared]; for ( iN = 0; iN < nShared; iN++ ) sharedNodeNProcs_[iN] = sharedNProcs[iN]; sharedNodeProcs_ = new int*[nShared]; for ( iN = 0; iN < nShared; iN++ ) { sharedNodeProcs_[iN] = new int[sharedNProcs[iN]]; for ( iP = 0; iP < sharedNProcs[iN]; iP++ ) sharedNodeProcs_[iN][iP] = sharedProcs[iN][iP]; } } TimerLoad_ += MPI_Wtime() - TimerLoadStart_; if ( outputLevel_ >= 2 ) printf("%4d : FEI_HYPRE_Impl::initSharedNodes ends. \n", mypid_); return 0; } /************************************************************************** reset the system -------------------------------------------------------------------------*/ int FEI_HYPRE_Impl::resetSystem(double s) { (void) s; if ( outputLevel_ >= 2 ) printf("%4d : FEI_HYPRE_Impl::resetSystem begins...\n", mypid_); for ( int iB = 0; iB < numBlocks_; iB++ ) elemBlocks_[iB]->reset(); numLocalNodes_ = 0; numExtNodes_ = 0; if ( nodeGlobalIDs_ != NULL ) delete [] nodeGlobalIDs_; if ( nodeExtNewGlobalIDs_ != NULL ) delete [] nodeExtNewGlobalIDs_; if ( globalNodeOffsets_ != NULL ) delete [] globalNodeOffsets_; if ( recvLengs_ != NULL ) delete [] recvLengs_; if ( recvProcs_ != NULL ) delete [] recvProcs_; if ( recvProcIndices_ != NULL ) { for (int iP = 0; iP < nRecvs_; iP++) delete [] recvProcIndices_[iP]; delete [] recvProcIndices_; } if ( sendLengs_ != NULL ) delete [] sendLengs_; if ( sendProcs_ != NULL ) delete [] sendProcs_; if ( sendProcIndices_ != NULL ) { for (int iP = 0; iP < nSends_; iP++) delete [] sendProcIndices_[iP]; delete [] sendProcIndices_; } if ( diagIA_ != NULL ) delete [] diagIA_; if ( diagJA_ != NULL ) delete [] diagJA_; if ( diagAA_ != NULL ) delete [] diagAA_; if ( offdIA_ != NULL ) delete [] offdIA_; if ( offdJA_ != NULL ) delete [] offdJA_; if ( offdAA_ != NULL ) delete [] offdAA_; if ( diagonal_ != NULL ) delete [] diagonal_; if ( BCNodeAlpha_ != NULL ) { for ( int iD = 0; iD < numBCNodes_; iD++ ) delete [] BCNodeAlpha_[iD]; delete [] BCNodeAlpha_; } if ( BCNodeBeta_ != NULL ) { for ( int iD = 0; iD < numBCNodes_; iD++ ) delete [] BCNodeBeta_[iD]; delete [] BCNodeBeta_; } if ( BCNodeGamma_ != NULL ) { for ( int iD = 0; iD < numBCNodes_; iD++ ) delete [] BCNodeGamma_[iD]; delete [] BCNodeGamma_; } if ( BCNodeIDs_ != NULL ) delete [] BCNodeIDs_; if ( rhsVector_ != NULL ) delete [] rhsVector_; nSends_ = 0; nRecvs_ = 0; nodeGlobalIDs_ = NULL; nodeExtNewGlobalIDs_ = NULL; globalNodeOffsets_ = NULL; recvLengs_ = NULL; recvProcs_ = NULL; recvProcIndices_ = NULL; sendLengs_ = NULL; sendProcs_ = NULL; sendProcIndices_ = NULL; diagIA_ = NULL; diagJA_ = NULL; diagAA_ = NULL; offdIA_ = NULL; offdJA_ = NULL; offdAA_ = NULL; diagonal_ = NULL; BCNodeIDs_ = NULL; BCNodeAlpha_ = NULL; BCNodeBeta_ = NULL; BCNodeGamma_ = NULL; rhsVector_ = NULL; numBCNodes_ = 0; TimerLoad_ = 0.0; TimerLoadStart_ = 0.0; TimerSolve_ = 0.0; TimerSolveStart_ = 0.0; FLAG_LoadComplete_ = 0; if ( outputLevel_ >= 2 ) printf("%4d : FEI_HYPRE_Impl::resetSystem ends.\n", mypid_); return 0; } /************************************************************************** reset the matrix -------------------------------------------------------------------------*/ int FEI_HYPRE_Impl::resetMatrix(double s) { (void) s; if ( outputLevel_ >= 2 ) printf("%4d : FEI_HYPRE_Impl::resetMatrix begins...\n", mypid_); for ( int iB = 0; iB < numBlocks_; iB++ ) elemBlocks_[iB]->reset(); numLocalNodes_ = 0; numExtNodes_ = 0; if ( nodeGlobalIDs_ != NULL ) delete [] nodeGlobalIDs_; if ( nodeExtNewGlobalIDs_ != NULL ) delete [] nodeExtNewGlobalIDs_; if ( globalNodeOffsets_ != NULL ) delete [] globalNodeOffsets_; if ( recvLengs_ != NULL ) delete [] recvLengs_; if ( recvProcs_ != NULL ) delete [] recvProcs_; if ( recvProcIndices_ != NULL ) { for (int iP = 0; iP < nRecvs_; iP++) delete [] recvProcIndices_[iP]; delete [] recvProcIndices_; } if ( sendLengs_ != NULL ) delete [] sendLengs_; if ( sendProcs_ != NULL ) delete [] sendProcs_; if ( sendProcIndices_ != NULL ) { for (int iP = 0; iP < nSends_; iP++) delete [] sendProcIndices_[iP]; delete [] sendProcIndices_; } if ( diagIA_ != NULL ) delete [] diagIA_; if ( diagJA_ != NULL ) delete [] diagJA_; if ( diagAA_ != NULL ) delete [] diagAA_; if ( offdIA_ != NULL ) delete [] offdIA_; if ( offdJA_ != NULL ) delete [] offdJA_; if ( offdAA_ != NULL ) delete [] offdAA_; if ( diagonal_ != NULL ) delete [] diagonal_; if ( BCNodeAlpha_ != NULL ) { for ( int iD = 0; iD < numBCNodes_; iD++ ) delete [] BCNodeAlpha_[iD]; delete [] BCNodeAlpha_; } if ( BCNodeBeta_ != NULL ) { for ( int iD = 0; iD < numBCNodes_; iD++ ) delete [] BCNodeBeta_[iD]; delete [] BCNodeBeta_; } if ( BCNodeGamma_ != NULL ) { for ( int iD = 0; iD < numBCNodes_; iD++ ) delete [] BCNodeGamma_[iD]; delete [] BCNodeGamma_; } if ( BCNodeIDs_ != NULL ) delete [] BCNodeIDs_; nSends_ = 0; nRecvs_ = 0; nodeGlobalIDs_ = NULL; nodeExtNewGlobalIDs_ = NULL; globalNodeOffsets_ = NULL; recvLengs_ = NULL; recvProcs_ = NULL; recvProcIndices_ = NULL; sendLengs_ = NULL; sendProcs_ = NULL; sendProcIndices_ = NULL; diagIA_ = NULL; diagJA_ = NULL; diagAA_ = NULL; offdIA_ = NULL; offdJA_ = NULL; offdAA_ = NULL; diagonal_ = NULL; BCNodeIDs_ = NULL; BCNodeAlpha_ = NULL; BCNodeBeta_ = NULL; BCNodeGamma_ = NULL; numBCNodes_ = 0; TimerLoad_ = 0.0; TimerLoadStart_ = 0.0; TimerSolve_ = 0.0; TimerSolveStart_ = 0.0; FLAG_LoadComplete_ = 0; if ( outputLevel_ >= 2 ) printf("%4d : FEI_HYPRE_Impl::resetMatrix ends.\n", mypid_); return 0; } /************************************************************************** reset the rhs vector -------------------------------------------------------------------------*/ int FEI_HYPRE_Impl::resetRHSVector(double s) { (void) s; if ( outputLevel_ >= 2 ) printf("%4d : FEI_HYPRE_Impl::resetRHSVector begins...\n", mypid_); for ( int iB = 0; iB < numBlocks_; iB++ ) elemBlocks_[iB]->resetRHSVectors(s); if ( outputLevel_ >= 2 ) printf("%4d : FEI_HYPRE_Impl::resetRHSVector ends.\n", mypid_); return 0; } /************************************************************************** reset the solution vector -------------------------------------------------------------------------*/ int FEI_HYPRE_Impl::resetInitialGuess(double s) { (void) s; if ( outputLevel_ >= 2 ) printf("%4d : FEI_HYPRE_Impl::resetInitialGuess begins...\n", mypid_); for ( int iB = 0; iB < numBlocks_; iB++ ) elemBlocks_[iB]->resetSolnVectors(s); if ( outputLevel_ >= 2 ) printf("%4d : FEI_HYPRE_Impl::resetInitialGuess ends (%e).\n", mypid_, s); return 0; } /************************************************************************** load node boundary conditions -------------------------------------------------------------------------*/ int FEI_HYPRE_Impl::loadNodeBCs(int numNodes, int *nodeIDs, int fieldID, double **alpha, double **beta, double **gamma1) { int iN, iD, oldNumBCNodes, *oldBCNodeIDs; double **oldBCAlpha, **oldBCBeta, **oldBCGamma; (void) fieldID; if ( outputLevel_ >= 2 ) printf("%4d : FEI_HYPRE_Impl::loadNodeBCs begins...(%d)\n",mypid_,numNodes); TimerLoadStart_ = MPI_Wtime(); if ( numNodes > 0 ) { if ( numBCNodes_ == 0 ) { numBCNodes_ = numNodes; BCNodeIDs_ = new int[numBCNodes_]; BCNodeAlpha_ = new double*[numBCNodes_]; BCNodeBeta_ = new double*[numBCNodes_]; BCNodeGamma_ = new double*[numBCNodes_]; for ( iN = 0; iN < numNodes; iN++ ) { BCNodeIDs_[iN] = nodeIDs[iN]; BCNodeAlpha_[iN] = new double[nodeDOF_]; BCNodeBeta_[iN] = new double[nodeDOF_]; BCNodeGamma_[iN] = new double[nodeDOF_]; for ( iD = 0; iD < nodeDOF_; iD++ ) { BCNodeAlpha_[iN][iD] = alpha[iN][iD]; BCNodeBeta_[iN][iD] = beta[iN][iD]; BCNodeGamma_[iN][iD] = gamma1[iN][iD]; } } } else { oldNumBCNodes = numBCNodes_; oldBCNodeIDs = BCNodeIDs_; oldBCAlpha = BCNodeAlpha_; oldBCBeta = BCNodeBeta_; oldBCGamma = BCNodeGamma_; numBCNodes_ += numNodes; BCNodeIDs_ = new int[numBCNodes_]; BCNodeAlpha_ = new double*[numBCNodes_]; BCNodeBeta_ = new double*[numBCNodes_]; BCNodeGamma_ = new double*[numBCNodes_]; for ( iN = 0; iN < oldNumBCNodes; iN++ ) { BCNodeIDs_[iN] = oldBCNodeIDs[iN]; BCNodeAlpha_[iN] = oldBCAlpha[iN]; BCNodeBeta_[iN] = oldBCBeta[iN]; BCNodeGamma_[iN] = oldBCGamma[iN]; } delete [] oldBCNodeIDs; delete [] oldBCAlpha; delete [] oldBCBeta; delete [] oldBCGamma; for ( iN = 0; iN < numNodes; iN++ ) { BCNodeIDs_[oldNumBCNodes+iN] = nodeIDs[iN]; BCNodeAlpha_[oldNumBCNodes+iN] = new double[nodeDOF_]; BCNodeBeta_[oldNumBCNodes+iN] = new double[nodeDOF_]; BCNodeGamma_[oldNumBCNodes+iN] = new double[nodeDOF_]; for ( iD = 0; iD < nodeDOF_; iD++ ) { BCNodeAlpha_[oldNumBCNodes+iN][iD] = alpha[iN][iD]; BCNodeBeta_[oldNumBCNodes+iN][iD] = beta[iN][iD]; BCNodeGamma_[oldNumBCNodes+iN][iD] = gamma1[iN][iD]; } } } } TimerLoad_ += MPI_Wtime() - TimerLoadStart_; if ( outputLevel_ >= 2 ) printf("%4d : FEI_HYPRE_Impl::loadNodeBCs ends.\n", mypid_); return 0; } /************************************************************************** load element connectivities, stiffness matrices, and element load -------------------------------------------------------------------------*/ int FEI_HYPRE_Impl::sumInElem(int elemBlockID, int elemID, int *elemConn, double **elemStiff, double *elemLoad, int elemFormat) { int iB=0; (void) elemFormat; if ( numBlocks_ > 1 ) { for ( iB = 0; iB < numBlocks_; iB++ ) if ( elemBlocks_[iB]->getElemBlockID() == elemBlockID ) break; } #ifdef HAVE_DEBUG if ( iB == numBlocks_ ) { printf("%4d : FEI_HYPRE_Impl::sumInElem ERROR - ", mypid_); printf("blockID invalid (%d).\n", iB); exit(1); } #endif #ifdef HAVE_DEBUG if ( outputLevel_ > 0 && elemBlocks_[iB]->getCurrentElem()==0 ) printf("%4d : FEI_HYPRE_Impl::sumInElem begins... \n", mypid_); #endif if ( elemBlocks_[iB]->getCurrentElem()==0 ) TimerLoadStart_ = MPI_Wtime(); elemBlocks_[iB]->loadElemInfo(elemID, elemConn, elemStiff, elemLoad); if ( elemBlocks_[iB]->getCurrentElem()==elemBlocks_[iB]->getNumElems() ) TimerLoad_ += MPI_Wtime() - TimerLoadStart_; #ifdef HAVE_DEBUG if ( outputLevel_ > 0 && elemBlocks_[iB]->getCurrentElem()==elemBlocks_[iB]->getNumElems() ) printf("%4d : FEI_HYPRE_Impl::sumInElem ends. \n", mypid_); #endif return 0; } /************************************************************************** load element connectivities and stiffness matrices -------------------------------------------------------------------------*/ int FEI_HYPRE_Impl::sumInElemMatrix(int elemBlockID, int elemID, int *elemConn, double **elemStiff, int elemFormat) { int iB=0; (void) elemFormat; if ( numBlocks_ > 1 ) { for ( iB = 0; iB < numBlocks_; iB++ ) if ( elemBlocks_[iB]->getElemBlockID() == elemBlockID ) break; } #ifdef HAVE_DEBUG if ( iB == numBlocks_ ) { printf("%4d : FEI_HYPRE_Impl::sumInElemMatrix ERROR - ", mypid_); printf("blockID invalid (%d).\n", iB); exit(1); } #endif #ifdef HAVE_DEBUG if ( outputLevel_ > 0 && elemBlocks_[iB]->getCurrentElem()==0 ) printf("%4d : FEI_HYPRE_Impl::sumInElemMatrix begins... \n", mypid_); #endif if ( elemBlocks_[iB]->getCurrentElem()==0 ) TimerLoadStart_ = MPI_Wtime(); elemBlocks_[iB]->loadElemMatrix(elemID, elemConn, elemStiff); if ( elemBlocks_[iB]->getCurrentElem()==elemBlocks_[iB]->getNumElems() ) TimerLoad_ += MPI_Wtime() - TimerLoadStart_; #ifdef HAVE_DEBUG if ( outputLevel_ > 0 && elemBlocks_[iB]->getCurrentElem()==elemBlocks_[iB]->getNumElems() ) printf("%4d : FEI_HYPRE_Impl::sumInElemMatrix ends. \n", mypid_); #endif return 0; } /************************************************************************** load element load -------------------------------------------------------------------------*/ int FEI_HYPRE_Impl::sumInElemRHS(int elemBlockID, int elemID, int *elemConn, double *elemLoad) { int iB=0; (void) elemConn; if ( numBlocks_ > 1 ) { for ( iB = 0; iB < numBlocks_; iB++ ) if ( elemBlocks_[iB]->getElemBlockID() == elemBlockID ) break; } #ifdef HAVE_DEBUG if ( iB == numBlocks_ ) { printf("%4d : FEI_HYPRE_Impl::sumInElemRHS ERROR - ", mypid_); printf("blockID invalid (%d).\n", iB); exit(1); } #endif elemBlocks_[iB]->loadElemRHS(elemID, elemLoad); return 0; } /************************************************************************** assemble matrix information -------------------------------------------------------------------------*/ int FEI_HYPRE_Impl::loadComplete() { int nprocs, iB, iP, iN, iN2, iE, ierr, index, index2, nodeRegister; int totalNNodes, nElems, elemNNodes, **elemNodeList, nodeNumber; int *nodeIDs, *nodeIDAux, localNNodes, minProc; int *ownerProcs, *nodeIDAux2, *sndrcvReg, *pArrayAux, pnum, pCounts; int nRecv, *recvLengs, *recvProcs, **recvBuf; int nSend, *sendLengs, *sendProcs, **sendBuf, nodeOffset; int **sharedNodeProcAux; MPI_Request *request; MPI_Status status; /* ----------------------------------------------------------------- * get machine information * ----------------------------------------------------------------*/ if ( outputLevel_ >= 2 ) printf("%4d : FEI_HYPRE_Impl::loadComplete begins.... \n", mypid_); TimerLoadStart_ = MPI_Wtime(); MPI_Comm_size( mpiComm_, &nprocs ); /* ----------------------------------------------------------------- * check that element stiffness matrices, connectivities, and rhs * have been loaded, and create solution vectors. * ----------------------------------------------------------------*/ for ( iB = 0; iB < numBlocks_; iB++ ) { ierr = elemBlocks_[iB]->checkLoadComplete(); hypre_assert( !ierr ); } /* ----------------------------------------------------------------- * sort the shared nodes * ----------------------------------------------------------------*/ if ( numSharedNodes_ > 0 ) { nodeIDs = new int[numSharedNodes_]; nodeIDAux = new int[numSharedNodes_]; sharedNodeProcAux = new int*[numSharedNodes_]; for ( iN = 0; iN < numSharedNodes_; iN++ ) nodeIDs[iN] = iN; IntSort2(sharedNodeIDs_, nodeIDs, 0, numSharedNodes_-1); for ( iN = 0; iN < numSharedNodes_; iN++ ) { sharedNodeProcAux[iN] = sharedNodeProcs_[iN]; nodeIDAux[iN] = sharedNodeNProcs_[iN]; } for ( iN = 0; iN < numSharedNodes_; iN++ ) { index = nodeIDs[iN]; sharedNodeProcs_[iN] = sharedNodeProcAux[index]; sharedNodeNProcs_[iN] = nodeIDAux[index]; } delete [] sharedNodeProcAux; delete [] nodeIDAux; delete [] nodeIDs; index = 0; for ( iN = 1; iN < numSharedNodes_; iN++ ) { if ( sharedNodeIDs_[iN] == sharedNodeIDs_[index] ) { nodeIDAux = sharedNodeProcs_[index]; sharedNodeProcs_[index] = new int[sharedNodeNProcs_[index]+sharedNodeNProcs_[iN]]; for ( iP = 0; iP < sharedNodeNProcs_[index]; iP++ ) sharedNodeProcs_[index][iP] = nodeIDAux[iP]; for ( iP = 0; iP < sharedNodeNProcs_[iN]; iP++ ) sharedNodeProcs_[index][sharedNodeNProcs_[index]+iP] = sharedNodeProcs_[iN][iP]; sharedNodeNProcs_[index] += sharedNodeNProcs_[iN]; delete [] nodeIDAux; delete [] sharedNodeProcs_[iN]; } else { index++; sharedNodeIDs_[index] = sharedNodeIDs_[iN]; sharedNodeProcs_[index] = sharedNodeProcs_[iN]; sharedNodeNProcs_[index] = sharedNodeNProcs_[iN]; } } if ( numSharedNodes_ > 0 ) numSharedNodes_ = index + 1; for ( iN = 0; iN < numSharedNodes_; iN++ ) { IntSort(sharedNodeProcs_[iN], 0, sharedNodeNProcs_[iN]-1); index = 0; for ( iP = 1; iP < sharedNodeNProcs_[iN]; iP++ ) if (sharedNodeProcs_[iN][iP] != sharedNodeProcs_[iN][index]) sharedNodeProcs_[iN][++index] = sharedNodeProcs_[iN][iP]; sharedNodeNProcs_[iN] = index + 1; } } /* ----------------------------------------------------------------- * obtain an ordered array of distinct node IDs * (nodeGlobalIDs_, numLocalNodes_, numExtNodes_) * ----------------------------------------------------------------*/ /* -- count the total number of nodes (can be repeated) -- */ totalNNodes = 0; for ( iB = 0; iB < numBlocks_; iB++ ) { nElems = elemBlocks_[iB]->getNumElems(); elemNNodes = elemBlocks_[iB]->getElemNumNodes(); totalNNodes += nElems * elemNNodes; } /* -- allocate space and fetch the global node numbers -- */ if ( totalNNodes > 0 ) nodeIDs = new int[totalNNodes]; totalNNodes = 0; for ( iB = 0; iB < numBlocks_; iB++ ) { nElems = elemBlocks_[iB]->getNumElems(); elemNNodes = elemBlocks_[iB]->getElemNumNodes(); elemNodeList = elemBlocks_[iB]->getElemNodeLists(); for ( iE = 0; iE < nElems; iE++ ) for ( iN = 0; iN < elemNNodes; iN++ ) nodeIDs[totalNNodes++] = elemNodeList[iE][iN]; } /* -- sort the global node numbers (ordering in nodeIDAux) -- */ if ( totalNNodes > 0 ) nodeIDAux = new int[totalNNodes]; for ( iN = 0; iN < totalNNodes; iN++ ) nodeIDAux[iN] = iN; IntSort2(nodeIDs, nodeIDAux, 0, totalNNodes-1); /* -- identify the external nodes (nodeIDAux) -- */ for ( iN = 0; iN < numSharedNodes_; iN++ ) { minProc = mypid_; for ( iP = 0; iP < sharedNodeNProcs_[iN]; iP++ ) if ( sharedNodeProcs_[iN][iP] < minProc ) minProc = sharedNodeProcs_[iN][iP]; if ( minProc >= mypid_ ) continue; index = HYPRE_LSI_Search(nodeIDs,sharedNodeIDs_[iN],totalNNodes); if ( nodeIDAux[index] >= 0 ) { for ( iN2 = index-1; iN2 >= 0; iN2-- ) { if ( nodeIDs[iN2] == nodeIDs[index] ) nodeIDAux[iN2] = - nodeIDAux[iN2] - 1; else break; } for ( iN2 = index+1; iN2 < totalNNodes; iN2++ ) { if ( nodeIDs[iN2] == nodeIDs[index] ) nodeIDAux[iN2] = - nodeIDAux[iN2] - 1; else break; } nodeIDAux[index] = - nodeIDAux[index] - 1; } } /* -- tally the number of local nodes (internal and external) -- */ localNNodes = numLocalNodes_ = 0; for ( iN = 1; iN < totalNNodes; iN++ ) { if ( nodeIDs[iN] != nodeIDs[iN-1] ) { localNNodes++; if ( nodeIDAux[iN] >= 0 ) numLocalNodes_++; } } if ( totalNNodes > 0 ) localNNodes++; if ( totalNNodes > 0 && nodeIDAux[0] >= 0 ) numLocalNodes_++; if ( outputLevel_ >= 2 ) { printf("%4d : FEI_HYPRE_Impl::loadComplete - nLocalNodes = %d\n", mypid_, numLocalNodes_); printf("%4d : FEI_HYPRE_Impl::loadComplete - numExtNodes = %d\n", mypid_, localNNodes-numLocalNodes_); } /* -- construct global node list, starting with nodes -- */ /* -- that belongs to local processor -- */ numExtNodes_ = localNNodes - numLocalNodes_; nodeGlobalIDs_ = new int[localNNodes]; nodeNumber = 0; nodeRegister = -1; for ( iN = 0; iN < totalNNodes; iN++ ) { if ( nodeIDAux[iN] >= 0 && nodeIDs[iN] != nodeRegister ) { nodeRegister = nodeIDs[iN]; nodeGlobalIDs_[nodeNumber++] = nodeIDs[iN]; nodeIDs[iN] = nodeNumber - 1; } else if ( nodeIDAux[iN] >= 0 ) nodeIDs[iN] = nodeNumber - 1; } nodeRegister = -1; for ( iN = 0; iN < totalNNodes; iN++ ) { if ( nodeIDAux[iN] < 0 && nodeIDs[iN] != nodeRegister ) { nodeRegister = nodeIDs[iN]; nodeGlobalIDs_[nodeNumber++] = nodeIDs[iN]; nodeIDs[iN] = nodeNumber - 1; } else if ( nodeIDAux[iN] < 0 ) nodeIDs[iN] = nodeNumber - 1; } /* ----------------------------------------------------------------- * rewrite the element connectivities with local node numbers * ----------------------------------------------------------------*/ if ( totalNNodes > 0 ) nodeIDAux2 = new int[totalNNodes]; for ( iN = 0; iN < totalNNodes; iN++ ) if ( nodeIDAux[iN] < 0 ) nodeIDAux[iN] = - nodeIDAux[iN] - 1; for ( iN = 0; iN < totalNNodes; iN++ ) nodeIDAux2[nodeIDAux[iN]] = nodeIDs[iN]; totalNNodes = 0; for ( iB = 0; iB < numBlocks_; iB++ ) { nElems = elemBlocks_[iB]->getNumElems(); elemNNodes = elemBlocks_[iB]->getElemNumNodes(); elemNodeList = elemBlocks_[iB]->getElemNodeLists(); for ( iE = 0; iE < nElems; iE++ ) { for ( iN = 0; iN < elemNNodes; iN++ ) elemNodeList[iE][iN] = nodeIDAux2[totalNNodes++]; } } if ( totalNNodes > 0 ) { delete [] nodeIDAux; delete [] nodeIDAux2; delete [] nodeIDs; } /* ----------------------------------------------------------------- * get global node offset information (globalNodeOffsets_) * ----------------------------------------------------------------*/ globalNodeOffsets_ = new int[nprocs+1]; MPI_Allgather(&numLocalNodes_, 1, MPI_INT, globalNodeOffsets_, 1, MPI_INT, mpiComm_); for ( iP = nprocs; iP > 0; iP-- ) globalNodeOffsets_[iP] = globalNodeOffsets_[iP-1]; globalNodeOffsets_[0] = 0; for ( iP = 1; iP <= nprocs; iP++ ) globalNodeOffsets_[iP] += globalNodeOffsets_[iP-1]; nodeOffset = globalNodeOffsets_[mypid_]; /* ----------------------------------------------------------------- * next construct communication pattern * ----------------------------------------------------------------*/ /* -- create an aux array for holding mapped external node IDs -- */ ownerProcs = NULL; pArrayAux = NULL; sndrcvReg = NULL; if ( numExtNodes_ > 0 ) ownerProcs = new int[numExtNodes_]; if ( numExtNodes_ > 0 ) pArrayAux = new int[numExtNodes_]; if ( numSharedNodes_ > 0 ) sndrcvReg = new int[numSharedNodes_]; /* -- for all shared nodes, see if they are recv or send nodes -- */ /* -- ( sndrcvReg[numSharedNodes]; and pArrayAux and -- */ /* -- ownerProcs[numExtNodes]) -- */ localNNodes = numLocalNodes_; for ( iN = 0; iN < numSharedNodes_; iN++ ) { index = HYPRE_LSI_Search(&(nodeGlobalIDs_[numLocalNodes_]), sharedNodeIDs_[iN], numExtNodes_); if ( index >= 0 ) { sndrcvReg[iN] = 1; // recv pnum = mypid_; for ( iP = 0; iP < sharedNodeNProcs_[iN]; iP++ ) if (sharedNodeProcs_[iN][iP] < pnum) pnum = sharedNodeProcs_[iN][iP]; ownerProcs[index] = pnum; pArrayAux[index] = pnum; } else sndrcvReg[iN] = 0; // send } /* -- based on the pArrayAux and ownerProcs arrays, compose -- */ /* -- receive information (nRecv, recvLengs, recvProcs) -- */ nRecv = 0; recvProcs = NULL; recvLengs = NULL; recvBuf = NULL; if (numExtNodes_ > 0) IntSort(pArrayAux, 0, numExtNodes_-1); if ( numExtNodes_ > 0 ) nRecv = 1; for ( iN = 1; iN < numExtNodes_; iN++ ) if ( pArrayAux[iN] != pArrayAux[nRecv-1] ) pArrayAux[nRecv++] = pArrayAux[iN]; if ( nRecv > 0 ) { recvProcs = new int[nRecv]; for ( iP = 0; iP < nRecv; iP++ ) recvProcs[iP] = pArrayAux[iP]; recvLengs = new int[nRecv]; for ( iP = 0; iP < nRecv; iP++ ) recvLengs[iP] = 0; for ( iN = 0; iN < numSharedNodes_; iN++ ) { if ( sndrcvReg[iN] == 1 ) { index = HYPRE_LSI_Search(&(nodeGlobalIDs_[numLocalNodes_]), sharedNodeIDs_[iN], numExtNodes_); index = HYPRE_LSI_Search(recvProcs,ownerProcs[index],nRecv); recvLengs[index]++; } } recvBuf = new int*[nRecv]; for ( iP = 0; iP < nRecv; iP++ ) recvBuf[iP] = new int[recvLengs[iP]]; } delete [] pArrayAux; /* -- compose send information (nSend, sendLengs, sendProcs) -- */ pCounts = 0; for ( iN = 0; iN < numSharedNodes_; iN++ ) if ( sndrcvReg[iN] == 0 ) pCounts += sharedNodeNProcs_[iN]; if ( pCounts > 0 ) pArrayAux = new int[pCounts]; pCounts = 0; for ( iN = 0; iN < numSharedNodes_; iN++ ) { if ( sndrcvReg[iN] == 0 ) { for ( iP = 0; iP < sharedNodeNProcs_[iN]; iP++ ) if ( sharedNodeProcs_[iN][iP] != mypid_ ) pArrayAux[pCounts++] = sharedNodeProcs_[iN][iP]; } } nSend = 0; sendProcs = NULL; sendLengs = NULL; if ( pCounts > 0 ) { IntSort( pArrayAux, 0, pCounts-1 ); nSend = 1; for ( iP = 1; iP < pCounts; iP++ ) if ( pArrayAux[iP] != pArrayAux[nSend-1] ) pArrayAux[nSend++] = pArrayAux[iP]; if ( nSend > 0 ) sendProcs = new int[nSend]; for ( iP = 0; iP < nSend; iP++ ) sendProcs[iP] = pArrayAux[iP]; sendLengs = new int[nSend]; for ( iP = 0; iP < nSend; iP++ ) sendLengs[iP] = 0; for ( iN = 0; iN < numSharedNodes_; iN++ ) { if ( sndrcvReg[iN] == 0 ) { for ( iP = 0; iP < sharedNodeNProcs_[iN]; iP++ ) { if ( sharedNodeProcs_[iN][iP] != mypid_ ) { index = sharedNodeProcs_[iN][iP]; index = HYPRE_LSI_Search(sendProcs,index,nSend); sendLengs[index]++; } } } } if ( nSend > 0 ) sendBuf = new int*[nSend]; for ( iP = 0; iP < nSend; iP++ ) { sendBuf[iP] = new int[sendLengs[iP]]; sendLengs[iP] = 0; } for ( iN = 0; iN < numSharedNodes_; iN++ ) { if ( sndrcvReg[iN] == 0 ) { for ( iP = 0; iP < sharedNodeNProcs_[iN]; iP++ ) { if ( sharedNodeProcs_[iN][iP] != mypid_ ) { index = HYPRE_LSI_Search(sendProcs, sharedNodeProcs_[iN][iP], nSend); index2 = HYPRE_LSI_Search(nodeGlobalIDs_, sharedNodeIDs_[iN], numLocalNodes_); sendBuf[index][sendLengs[index]++] = nodeOffset + index2; } } } } } if ( pCounts > 0 ) delete [] pArrayAux; /* -- exchange the (NEW) global node indices -- */ if ( nRecv > 0 ) request = new MPI_Request[nRecv]; for ( iP = 0; iP < nRecv; iP++ ) MPI_Irecv( recvBuf[iP], recvLengs[iP], MPI_INT, recvProcs[iP], 183, mpiComm_, &request[iP]); for ( iP = 0; iP < nSend; iP++ ) MPI_Send( sendBuf[iP], sendLengs[iP], MPI_INT, sendProcs[iP], 183, mpiComm_); for ( iP = 0; iP < nRecv; iP++ ) MPI_Wait( &request[iP], &status ); if ( nRecv > 0 ) delete [] request; /* -- fix the send index array -- */ for (iP = 0; iP < nSend; iP++) for ( iN = 0; iN < sendLengs[iP]; iN++ ) sendBuf[iP][iN] -= nodeOffset; /* -- based on the recv information, construct recv index array -- */ if ( numExtNodes_ > 0 ) nodeExtNewGlobalIDs_ = new int[numExtNodes_]; for ( iP = 0; iP < nRecv; iP++ ) recvLengs[iP] = 0; for ( iN = 0; iN < numExtNodes_; iN++ ) { index = HYPRE_LSI_Search(recvProcs, ownerProcs[iN], nRecv); iN2 = recvBuf[index][recvLengs[index]]; nodeExtNewGlobalIDs_[iN] = iN2; recvBuf[index][recvLengs[index]++] = iN + numLocalNodes_; } if ( numSharedNodes_ > 0 ) delete [] sndrcvReg; if ( numExtNodes_ > 0 ) delete [] ownerProcs; /* -- construct the receive communication pattern -- */ nRecvs_ = nRecv; if ( nRecv > 0 ) { recvProcs_ = recvProcs; recvLengs_ = recvLengs; } else recvProcs_ = recvLengs_ = NULL; if ( nRecv > 0 ) recvProcIndices_ = recvBuf; else recvProcIndices_ = NULL; /* -- construct the send communication pattern -- */ nSends_ = nSend; if ( nSend > 0 ) { sendLengs_ = sendLengs; sendProcs_ = sendProcs; } else sendLengs_ = sendProcs_ = NULL; if ( nSend > 0 ) sendProcIndices_ = sendBuf; else sendProcIndices_ = NULL; /* ----------------------------------------------------------------- * construct the global matrix and diagonal * ----------------------------------------------------------------*/ buildGlobalMatrixVector(); TimerLoad_ += MPI_Wtime() - TimerLoadStart_; if ( FLAG_PrintMatrix_ > 0 ) printLinearSystem(); FLAG_LoadComplete_ = 1; if ( outputLevel_ >= 2 ) printf("%4d : FEI_HYPRE_Impl::loadComplete ends. \n", mypid_); return 0; } /************************************************************************** solve the linear system -------------------------------------------------------------------------*/ int FEI_HYPRE_Impl::solve(int *status) { int nprocs; double dArray[2], dArray2[2]; if ( FLAG_LoadComplete_ == 0 ) loadComplete(); MPI_Comm_size( mpiComm_, &nprocs ); if ( outputLevel_ >= 1 && mypid_ == 0 ) printf("\t**************************************************\n"); switch (solverID_) { case 0 : TimerSolveStart_ = MPI_Wtime(); if ( outputLevel_ >= 1 && mypid_ == 0 ) { printf("\tFEI_HYPRE CG with diagonal preconditioning\n"); printf("\tmaxIterations = %d\n",krylovMaxIterations_); printf("\ttolerance = %e\n",krylovTolerance_); } (*status) = solveUsingCG(); break; case 1 : TimerSolveStart_ = MPI_Wtime(); if ( outputLevel_ >= 1 && mypid_ == 0 ) { printf("\tFEI_HYPRE GMRES with diagonal preconditioning\n"); printf("\t\tGMRES dimension = %d\n", gmresDim_); printf("\tmaxIterations = %d\n",krylovMaxIterations_); printf("\ttolerance = %e\n",krylovTolerance_); } (*status) = solveUsingGMRES(); break; case 2 : TimerSolveStart_ = MPI_Wtime(); if ( outputLevel_ >= 1 && mypid_ == 0 ) { printf("\tFEI_HYPRE CGS with diagonal preconditioning\n"); printf("\tmaxIterations = %d\n",krylovMaxIterations_); printf("\ttolerance = %e\n",krylovTolerance_); } (*status) = solveUsingCGS(); break; case 3 : TimerSolveStart_ = MPI_Wtime(); if ( outputLevel_ >= 1 && mypid_ == 0 ) { printf("\tFEI_HYPRE Bicgstab with diagonal preconditioning\n"); printf("\tmaxIterations = %d\n",krylovMaxIterations_); printf("\ttolerance = %e\n",krylovTolerance_); } (*status) = solveUsingBicgstab(); break; case 4 : TimerSolveStart_ = MPI_Wtime(); if ( outputLevel_ >= 1 && mypid_ == 0 ) { printf("\tFEI_HYPRE direct link to SuperLU \n"); } (*status) = solveUsingSuperLU(); break; } TimerSolve_ = MPI_Wtime() - TimerSolveStart_; dArray[0] = TimerLoad_; dArray[1] = TimerSolve_; MPI_Allreduce(dArray,dArray2,2,MPI_DOUBLE,MPI_SUM,mpiComm_); if ( outputLevel_ >= 1 && mypid_ == 0 ) { printf("\tFEI_HYPRE local solver : number of iterations = %d\n", krylovIterations_); printf("\tFEI_HYPRE local solver : final residual norm = %e\n", krylovResidualNorm_); printf("\tFEI_HYPRE local FEI : average load time = %e\n", dArray2[0]/(double) nprocs); printf("\tFEI_HYPRE local FEI : average solve time = %e\n", dArray2[1]/(double) nprocs); printf("\t**************************************************\n"); } return (*status); } /************************************************************************** form residual norm -------------------------------------------------------------------------*/ int FEI_HYPRE_Impl::residualNorm(int whichNorm, int numFields, int* fieldIDs, double* norms) { int localNRows, extNRows, totalNRows, irow; double *rVec, rnorm, dtemp; (void) numFields; (void) fieldIDs; if ( solnVector_ == NULL || rhsVector_ == NULL ) return 1; if (whichNorm < 0 || whichNorm > 2) return(-1); if ( FLAG_LoadComplete_ == 0 ) loadComplete(); localNRows = numLocalNodes_ * nodeDOF_; extNRows = numExtNodes_ * nodeDOF_; totalNRows = localNRows + extNRows; rVec = new double[totalNRows]; matvec( solnVector_, rVec ); for ( irow = 0; irow < localNRows; irow++ ) rVec[irow] = rhsVector_[irow] - rVec[irow]; switch(whichNorm) { case 0: rnorm = 0.0; for ( irow = 0; irow < localNRows; irow++ ) { dtemp = fabs( rVec[irow] ); if ( dtemp > rnorm ) rnorm = dtemp; } MPI_Allreduce(&rnorm, &dtemp, 1, MPI_DOUBLE, MPI_MAX, mpiComm_); (*norms) = dtemp; break; case 1: rnorm = 0.0; for ( irow = 0; irow < localNRows; irow++ ) rnorm += fabs( rVec[irow] ); MPI_Allreduce(&rnorm, &dtemp, 1, MPI_DOUBLE, MPI_SUM, mpiComm_); (*norms) = dtemp; break; case 2: rnorm = 0.0; for ( irow = 0; irow < localNRows; irow++ ) rnorm += rVec[irow] * rVec[irow]; MPI_Allreduce(&rnorm, &dtemp, 1, MPI_DOUBLE, MPI_SUM, mpiComm_); (*norms) = sqrt(dtemp); break; } delete [] rVec; return 0; } /************************************************************************** get number of distinct node in a given block -------------------------------------------------------------------------*/ int FEI_HYPRE_Impl::getNumBlockActNodes(int blockID, int *numNodes) { int localNNodes, iB, iE, iN, totalNNodes, nElems; int elemNNodes, **elemNodeLists, *nodeIDs; if ( numBlocks_ == 1 ) { (*numNodes) = numLocalNodes_ + numExtNodes_; if ( outputLevel_ >= 2 ) { printf("%4d : FEI_HYPRE_Impl::getNumBlockActNodes blockID = %d.\n", mypid_, blockID); printf("%4d : FEI_HYPRE_Impl::getNumBlockActNodes numNodes = %d\n", mypid_, (*numNodes)); } return 0; } else { for ( iB = 0; iB < numBlocks_; iB++ ) if ( elemBlocks_[iB]->getElemBlockID() == blockID ) break; if ( iB >= numBlocks_ ) { printf("%4d : FEI_HYPRE_Impl::getNumBlockActNodes ERROR -",mypid_); printf(" invalid blockID\n"); exit(1); } totalNNodes = numLocalNodes_ + numExtNodes_; nodeIDs = new int[totalNNodes]; for ( iN = 0; iN < totalNNodes; iN++ ) nodeIDs[iN] = 0; nElems = elemBlocks_[iB]->getNumElems(); elemNNodes = elemBlocks_[iB]->getElemNumNodes(); elemNodeLists = elemBlocks_[iB]->getElemNodeLists(); for ( iE = 0; iE < nElems; iE++ ) for ( iN = 0; iN < elemNNodes; iN++ ) nodeIDs[elemNodeLists[iE][iN]] = 1; localNNodes = 0; for ( iN = 0; iN < totalNNodes; iN++ ) if ( nodeIDs[iN] == 1 ) localNNodes++; delete [] nodeIDs; (*numNodes) = localNNodes; if ( outputLevel_ >= 2 ) { printf("%4d : FEI_HYPRE_Impl::getNumBlockActNodes blockID = %d.\n", mypid_, blockID); printf("%4d : FEI_HYPRE_Impl::getNumBlockActNodes numNodes = %d\n", mypid_, (*numNodes)); } } return 0; } /************************************************************************** get number of distinct equations in a given block -------------------------------------------------------------------------*/ int FEI_HYPRE_Impl::getNumBlockActEqns(int blockID, int *numEqns) { int numNodes; getNumBlockActNodes(blockID, &numNodes); (*numEqns) = numNodes * nodeDOF_; if ( outputLevel_ >= 2 ) { printf("%4d : FEI_HYPRE_Impl::getNumBlockActEqns blockID = %d\n", mypid_, blockID); printf("%4d : FEI_HYPRE_Impl::getNumBlockActEqns numEqns = %d\n", mypid_, (*numEqns)); } return 0; } /************************************************************************** get a node list in a given block -------------------------------------------------------------------------*/ int FEI_HYPRE_Impl::getBlockNodeIDList(int blockID,int numNodes,int *nodeList) { int localNNodes, iB, iE, iN, totalNNodes, nElems; int elemNNodes, **elemNodeLists, *nodeIDs; if ( outputLevel_ >= 2 ) { printf("%4d : FEI_HYPRE_Impl::getBlockNodeIDList blockID = %d\n", mypid_, blockID); printf("%4d : FEI_HYPRE_Impl::getBlockNodeIDList numNodes = %d\n", mypid_, numNodes); } if ( numBlocks_ == 1 ) { localNNodes = numLocalNodes_ + numExtNodes_; if ( localNNodes != numNodes ) { printf("%4d : FEI_HYPRE_Impl::getBlockNodeIDList ERROR - nNodes",mypid_); printf(" mismatch.\n"); exit(1); } for ( iN = 0; iN < localNNodes; iN++ ) nodeList[iN] = nodeGlobalIDs_[iN]; return 0; } else { for ( iB = 0; iB < numBlocks_; iB++ ) if ( elemBlocks_[iB]->getElemBlockID() == blockID ) break; if ( iB >= numBlocks_ ) { printf("%4d : FEI_HYPRE_Impl::getBlockNodeIDList ERROR -",mypid_); printf(" invalid blockID.\n"); exit(1); } totalNNodes = numLocalNodes_ + numExtNodes_; nodeIDs = new int[totalNNodes]; for ( iN = 0; iN < totalNNodes; iN++ ) nodeIDs[iN] = 0; nElems = elemBlocks_[iB]->getNumElems(); elemNNodes = elemBlocks_[iB]->getElemNumNodes(); elemNodeLists = elemBlocks_[iB]->getElemNodeLists(); for ( iE = 0; iE < nElems; iE++ ) for ( iN = 0; iN < elemNNodes; iN++ ) nodeIDs[elemNodeLists[iE][iN]] = 1; localNNodes = 0; for ( iN = 0; iN < totalNNodes; iN++ ) if ( nodeIDs[iN] == 1 ) nodeList[localNNodes++] = nodeGlobalIDs_[iN]; if ( localNNodes != numNodes ) { printf("%4d : FEI_HYPRE_Impl::getBlockNodeIDList ERROR -",mypid_); printf(" nNodes mismatch (%d,%d).\n", localNNodes, numNodes); exit(1); } delete [] nodeIDs; } return 0; } /************************************************************************** get solution -------------------------------------------------------------------------*/ int FEI_HYPRE_Impl::getBlockNodeSolution(int blockID,int numNodes, int *nodeList, int *nodeOffsets, double *solnValues) { int iB, iE, iN, iD, totalNNodes, *nodeIDs; int nElems, elemNNodes, **elemNodeLists, nodeID, localNNodes; double *dataBuf, **solnVecs; (void) nodeList; if ( outputLevel_ >= 2 ) { printf("%4d : FEI_HYPRE_Impl::getBlockNodeSolution blockID = %d\n", mypid_, blockID); printf("%4d : FEI_HYPRE_Impl::getBlockNodeSolution numNodes = %d\n", mypid_, numNodes); } if ( numBlocks_ == 1 ) { for ( iN = 0; iN < numNodes; iN++ ) { nodeOffsets[iN] = iN * nodeDOF_; for ( iD = 0; iD < nodeDOF_; iD++ ) solnValues[iN*nodeDOF_+iD] = solnVector_[iN*nodeDOF_+iD]; } } else { for ( iB = 0; iB < numBlocks_; iB++ ) if ( elemBlocks_[iB]->getElemBlockID() == blockID ) break; if ( iB >= numBlocks_ ) { printf("%4d : FEI_HYPRE_Impl::getBlockNodeSolution ERROR -",mypid_); printf(" invalid blockID.\n"); exit(1); } totalNNodes = numLocalNodes_ + numExtNodes_; nodeIDs = new int[totalNNodes]; dataBuf = new double[totalNNodes*nodeDOF_]; for ( iN = 0; iN < totalNNodes; iN++ ) nodeIDs[iN] = 0; nElems = elemBlocks_[iB]->getNumElems(); elemNNodes = elemBlocks_[iB]->getElemNumNodes(); elemNodeLists = elemBlocks_[iB]->getElemNodeLists(); solnVecs = elemBlocks_[iB]->getSolnVectors(); for ( iE = 0; iE < nElems; iE++ ) { for ( iN = 0; iN < elemNNodes; iN++ ) { nodeID = elemNodeLists[iE][iN]; nodeIDs[nodeID] = 1; for ( iD = 0; iD < nodeDOF_; iD++ ) dataBuf[nodeID*nodeDOF_+iD] = solnVecs[iE][iN*nodeDOF_+iD]; } } localNNodes = 0; for ( iN = 0; iN < totalNNodes; iN++ ) { nodeID = nodeIDs[iN]; if ( nodeID == 1 ) { nodeOffsets[localNNodes] = localNNodes * nodeDOF_; for ( iD = 0; iD < nodeDOF_; iD++ ) solnValues[localNNodes*nodeDOF_+iD] = dataBuf[iN*nodeDOF_+iD]; localNNodes++; } } delete [] nodeIDs; delete [] dataBuf; } return 0; } /************************************************************************** build global stiffness matrix -------------------------------------------------------------------------*/ void FEI_HYPRE_Impl::buildGlobalMatrixVector() { int matDim, *diagCounts=NULL, nElems, elemNNodes, **elemNodeLists=NULL; int iB, iD, iE, iN, offset, iD2, iD3, iN2, *elemNodeList=NULL, diagNNZ; int offdNNZ, *offdCounts=NULL, rowIndBase, rowInd, colIndBase, colInd; int bound, iCount, index, iBegin, *TdiagIA=NULL, *TdiagJA=NULL; int *ToffdIA=NULL, *ToffdJA=NULL, elemNExt, elemNLocal, nodeID; int diagOffset, offdOffset; double **elemMats=NULL, *elemMat=NULL, *TdiagAA=NULL, *ToffdAA=NULL; double alpha, beta, gamma1; if ( outputLevel_ >= 2 ) printf("%4d : FEI_HYPRE_Impl::buildGlobalMatrixVector begins..\n",mypid_); /* ----------------------------------------------------------------- * assemble the right hand side vector * -----------------------------------------------------------------*/ assembleRHSVector(); /* ----------------------------------------------------------------- * count the number of nonzeros per row (diagCounts, offdCounts) * -----------------------------------------------------------------*/ matDim = ( numLocalNodes_ + numExtNodes_) * nodeDOF_; if ( matDim > 0 ) { diagCounts = new int[matDim]; offdCounts = new int[matDim]; } for ( iD = 0; iD < matDim; iD++ ) diagCounts[iD] = offdCounts[iD] = 0; for ( iB = 0; iB < numBlocks_; iB++ ) { nElems = elemBlocks_[iB]->getNumElems(); elemNNodes = elemBlocks_[iB]->getElemNumNodes(); elemNodeLists = elemBlocks_[iB]->getElemNodeLists(); elemMats = elemBlocks_[iB]->getElemMatrices(); for ( iE = 0; iE < nElems; iE++ ) { elemMat = elemMats[iE]; elemNodeList = elemNodeLists[iE]; elemNExt = elemNLocal = 0; for ( iN = 0; iN < elemNNodes; iN++ ) { if ( elemNodeList[iN] < numLocalNodes_ ) elemNLocal++; else elemNExt++; } for ( iN = 0; iN < elemNNodes; iN++ ) { rowInd = elemNodeList[iN] * nodeDOF_; for ( iD = 0; iD < nodeDOF_; iD++ ) { diagCounts[rowInd+iD] += elemNLocal * nodeDOF_; offdCounts[rowInd+iD] += elemNExt * nodeDOF_; } } } } /* ----------------------------------------------------------------- * allocate the CSR matrix storage space * -----------------------------------------------------------------*/ diagNNZ = offdNNZ = 0; for ( iD = 0; iD < matDim; iD++ ) { diagNNZ += diagCounts[iD]; offdNNZ += offdCounts[iD]; } if ( diagNNZ > 0 ) { TdiagIA = new int[matDim+1]; TdiagJA = new int[diagNNZ]; TdiagAA = new double[diagNNZ]; } if ( offdNNZ > 0 ) { ToffdIA = new int[matDim+1]; ToffdJA = new int[offdNNZ]; ToffdAA = new double[offdNNZ]; } /* ----------------------------------------------------------------- * get ready for loading up the CSR matrix * -----------------------------------------------------------------*/ offset = 0; for ( iD = 0; iD < matDim; iD++ ) { TdiagIA[iD] = offset; offset += diagCounts[iD]; } offset = 0; if ( offdNNZ > 0 ) { for ( iD = 0; iD < matDim; iD++ ) { ToffdIA[iD] = offset; offset += offdCounts[iD]; } } /* ----------------------------------------------------------------- * load the CSR matrix * -----------------------------------------------------------------*/ bound = numLocalNodes_ * nodeDOF_; for ( iB = 0; iB < numBlocks_; iB++ ) { nElems = elemBlocks_[iB]->getNumElems(); elemNNodes = elemBlocks_[iB]->getElemNumNodes(); elemNodeLists = elemBlocks_[iB]->getElemNodeLists(); elemMats = elemBlocks_[iB]->getElemMatrices(); if ( nodeDOF_ == 1 ) { for ( iE = 0; iE < nElems; iE++ ) { elemMat = elemMats[iE]; elemNodeList = elemNodeLists[iE]; offset = 0; for ( iN = 0; iN < elemNNodes; iN++ ) { colInd = elemNodeList[iN]; if ( colInd >= bound ) { for ( iN2 = 0; iN2 < elemNNodes; iN2++ ) { rowInd = elemNodeList[iN2]; if ( *elemMat != 0.0 ) { index = ToffdIA[rowInd]++; ToffdJA[index] = colInd; ToffdAA[index] = *elemMat; } elemMat++; } } else { for ( iN2 = 0; iN2 < elemNNodes; iN2++ ) { rowInd = elemNodeList[iN2]; if ( *elemMat != 0.0 ) { index = TdiagIA[rowInd]++; TdiagJA[index] = colInd; TdiagAA[index] = *elemMat; } elemMat++; } } } delete [] elemMats[iE]; elemMats[iE] = NULL; } } else { for ( iE = 0; iE < nElems; iE++ ) { elemMat = elemMats[iE]; elemNodeList = elemNodeLists[iE]; offset = 0; for ( iN = 0; iN < elemNNodes; iN++ ) { colIndBase = elemNodeList[iN] * nodeDOF_; for ( iD = 0; iD < nodeDOF_; iD++ ) { colInd = colIndBase + iD; for ( iN2 = 0; iN2 < elemNNodes; iN2++ ) { rowIndBase = elemNodeList[iN2] * nodeDOF_; for ( iD2 = 0; iD2 < nodeDOF_; iD2++ ) { rowInd = rowIndBase + iD2; if ( elemMat[offset] != 0.0 ) { if ( colInd >= bound ) { index = ToffdIA[rowInd]++; ToffdJA[index] = colInd; ToffdAA[index] = elemMat[offset]; } else { index = TdiagIA[rowInd]++; TdiagJA[index] = colInd; TdiagAA[index] = elemMat[offset]; } } offset++; } } } } delete [] elemMats[iE]; elemMats[iE] = NULL; } } } /* ----------------------------------------------------------------- * compress the matrix (take out redundant columns) * -----------------------------------------------------------------*/ if ( outputLevel_ >= 2 ) printf("%4d : FEI_HYPRE_Impl::buildGlobalMatrixVector mid phase\n",mypid_); offset = 0; for ( iD = 0; iD < matDim; iD++ ) { iCount = TdiagIA[iD] - offset; TdiagIA[iD] = offset; offset += diagCounts[iD]; diagCounts[iD] = iCount; } if ( offdNNZ > 0 ) { offset = 0; for ( iD = 0; iD < matDim; iD++ ) { iCount = ToffdIA[iD] - offset; ToffdIA[iD] = offset; offset += offdCounts[iD]; offdCounts[iD] = iCount; } } for ( iD = 0; iD < matDim; iD++ ) { if ( diagCounts[iD] > 0 ) { iBegin = TdiagIA[iD]; iCount = diagCounts[iD]; index = iBegin; if ( iCount > 0 ) IntSort2a(&(TdiagJA[iBegin]),&(TdiagAA[iBegin]),0,iCount-1); for ( iD2 = iBegin+1; iD2 < iBegin+iCount; iD2++ ) { if ( TdiagJA[iD2] == TdiagJA[index] ) TdiagAA[index] += TdiagAA[iD2]; else { if (TdiagAA[index] != 0.0 ) index++; TdiagJA[index] = TdiagJA[iD2]; TdiagAA[index] = TdiagAA[iD2]; } } if ( iCount > 0 && TdiagAA[index] != 0.0 ) index++; diagCounts[iD] = index - iBegin; } if ( offdCounts[iD] > 0 ) { iBegin = ToffdIA[iD]; iCount = offdCounts[iD]; index = iBegin; if ( iCount > 0 ) IntSort2a(&(ToffdJA[iBegin]),&(ToffdAA[iBegin]),0,iCount-1); for ( iD2 = iBegin+1; iD2 < iBegin+iCount; iD2++ ) { if ( ToffdJA[iD2] == ToffdJA[index] ) ToffdAA[index] += ToffdAA[iD2]; else { if (ToffdAA[index] != 0.0 ) index++; ToffdJA[index] = ToffdJA[iD2]; ToffdAA[index] = ToffdAA[iD2]; } } if ( iCount > 0 && ToffdAA[index] != 0.0 ) index++; offdCounts[iD] = index - iBegin; } } /* ----------------------------------------------------------------- * impose boundary conditions * -----------------------------------------------------------------*/ for ( iD = bound; iD < matDim; iD++ ) rhsVector_[iD] = 0.0; for ( iN = 0; iN < numBCNodes_; iN++ ) { nodeID = BCNodeIDs_[iN]; index = HYPRE_LSI_Search(nodeGlobalIDs_, nodeID, numLocalNodes_); if ( index >= 0 ) { for ( iD = index*nodeDOF_; iD < (index+1)*nodeDOF_; iD++ ) { alpha = BCNodeAlpha_[iN][iD%nodeDOF_]; beta = BCNodeBeta_[iN][iD%nodeDOF_]; gamma1= BCNodeGamma_[iN][iD%nodeDOF_]; if ( beta == 0.0 && alpha != 0.0 ) { for (iD2=TdiagIA[iD]; iD2= 0 ) { for (iD3 = TdiagIA[rowInd]; iD3= 0 ) { for (iD3 = TdiagIA[rowInd]; iD3 0 ) { for (iD2=TdiagIA[iD]; iD2= 0 ) { for (iD3 = ToffdIA[rowInd]; iD3= 0 ) { for (iD3 = ToffdIA[rowInd]; iD3 0 ) { offdNNZ = 0; for ( iD = 0; iD < matDim; iD++ ) for ( iD2 = ToffdIA[iD]; iD2 < ToffdIA[iD]+offdCounts[iD]; iD2++ ) if ( ToffdAA[iD2] != 0.0 ) offdNNZ++; } if ( diagNNZ > 0 ) { diagIA_ = new int[matDim+1]; diagJA_ = new int[diagNNZ]; diagAA_ = new double[diagNNZ]; diagonal_ = new double[matDim]; diagIA_[0] = 0; } if ( offdNNZ > 0 ) { offdIA_ = new int[matDim+1]; offdJA_ = new int[offdNNZ]; offdAA_ = new double[offdNNZ]; offdIA_[0] = 0; } diagOffset = offdOffset = 0; for ( iD = 0; iD < matDim; iD++ ) { iCount = diagCounts[iD]; index = TdiagIA[iD]; diagonal_[iD] = 0.0; for ( iD2 = 0; iD2 < iCount; iD2++ ) { if ( TdiagJA[index] == iD ) { if ( TdiagAA[index] != 0.0 ) diagonal_[iD] = TdiagAA[index]; } if ( TdiagJA[index] >= 0 && TdiagAA[index] != 0.0 ) { diagJA_[diagOffset] = TdiagJA[index]; diagAA_[diagOffset++] = TdiagAA[index]; } index++; } diagIA_[iD+1] = diagOffset; if ( offdNNZ > 0 ) { iCount = offdCounts[iD]; index = ToffdIA[iD]; for ( iD2 = 0; iD2 < iCount; iD2++ ) { if ( ToffdJA[index] == iD ) { if ( ToffdAA[index] != 0.0 ) diagonal_[iD] = ToffdAA[index]; } if ( ToffdJA[index] >= 0 && ToffdAA[index] != 0.0 ) { offdJA_[offdOffset] = ToffdJA[index]; offdAA_[offdOffset++] = ToffdAA[index]; } index++; } offdIA_[iD+1] = offdOffset; } } /* ----------------------------------------------------------------- * fix up diagonal entries in light of parallel processing * -----------------------------------------------------------------*/ PVectorReverseChange( diagonal_ ); for ( iD = 0; iD < numLocalNodes_*nodeDOF_; iD++ ) { if ( diagonal_[iD] == 0.0 ) diagonal_[iD] = 1.0; else diagonal_[iD] = 1.0 / diagonal_[iD]; } /* ----------------------------------------------------------------- * clean up * -----------------------------------------------------------------*/ if ( matDim > 0 ) { delete [] diagCounts; delete [] offdCounts; } if ( diagNNZ > 0 ) { delete [] TdiagIA; delete [] TdiagJA; delete [] TdiagAA; } if ( offdNNZ > 0 ) { delete [] ToffdIA; delete [] ToffdJA; delete [] ToffdAA; } if ( outputLevel_ >= 2 ) printf("%4d : FEI_HYPRE_Impl::buildGlobalMatrixVector ends. \n",mypid_); } /************************************************************************** solve linear system using conjugate gradient -------------------------------------------------------------------------*/ int FEI_HYPRE_Impl::solveUsingCG() { int irow, iter, converged=0, localNRows, extNRows, totalNRows; int numTrials, innerIteration; double alpha, beta, rho=0.0, rhom1, rnorm0, rnorm, sigma, eps1; double *rVec, *pVec, *apVec, *zVec, dArray[2], dArray2[2]; /* ----------------------------------------------------------------- * compute matrix information and allocate Krylov vectors * -----------------------------------------------------------------*/ localNRows = numLocalNodes_ * nodeDOF_; extNRows = numExtNodes_ * nodeDOF_; totalNRows = localNRows + extNRows; rVec = new double[totalNRows]; /* ----------------------------------------------------------------- * assemble the initial guess vector * -----------------------------------------------------------------*/ assembleSolnVector(); /* ----------------------------------------------------------------- * compute initial residual vector and norm * -----------------------------------------------------------------*/ matvec( solnVector_, rVec ); for ( irow = 0; irow < localNRows; irow++ ) rVec[irow] = rhsVector_[irow] - rVec[irow]; rnorm0 = rnorm = 0.0; for ( irow = 0; irow < localNRows; irow++ ) { rnorm0 += (rVec[irow] * rVec[irow]); rnorm += (rhsVector_[irow] * rhsVector_[irow]); } dArray[0] = rnorm0; dArray[1] = rnorm; MPI_Allreduce(dArray, dArray2, 2, MPI_DOUBLE, MPI_SUM, mpiComm_); rnorm0 = sqrt(dArray2[1]); rnorm = sqrt(dArray2[0]); if ( outputLevel_ >= 2 && mypid_ == 0 ) printf("\tFEI_HYPRE_Impl initial rnorm = %e (%e)\n",rnorm,rnorm0); if ( rnorm0 == 0.0 ) { delete [] rVec; return 0; } /* ----------------------------------------------------------------- * initialization * -----------------------------------------------------------------*/ iter = 0; numTrials = 0; pVec = new double[totalNRows]; apVec = new double[totalNRows]; zVec = new double[totalNRows]; for ( irow = 0; irow < localNRows; irow++ ) pVec[irow] = 0.0; if ( krylovAbsRel_ == 0 ) eps1 = krylovTolerance_ * rnorm0; else eps1 = krylovTolerance_; if ( rnorm < eps1 ) converged = 1; /* ----------------------------------------------------------------- * loop until convergence is achieved * -----------------------------------------------------------------*/ while ( converged == 0 && numTrials < 2 ) { innerIteration = 0; while ( rnorm >= eps1 && iter < krylovMaxIterations_ ) { iter++; innerIteration++; if ( innerIteration == 1 ) { if ( diagonal_ != NULL ) for (irow = 0; irow < localNRows; irow++) zVec[irow] = rVec[irow] * diagonal_[irow]; else for (irow = 0; irow < localNRows; irow++) zVec[irow] = rVec[irow]; rhom1 = rho; rho = 0.0; for ( irow = 0; irow < localNRows; irow++ ) rho += rVec[irow] * zVec[irow]; dArray[0] = rho; MPI_Allreduce(dArray, dArray2, 1, MPI_DOUBLE, MPI_SUM, mpiComm_); rho = dArray2[0]; beta = 0.0; } else beta = rho / rhom1; for ( irow = 0; irow < localNRows; irow++ ) pVec[irow] = zVec[irow] + beta * pVec[irow]; matvec( pVec, apVec ); sigma = 0.0; for ( irow = 0; irow < localNRows; irow++ ) sigma += pVec[irow] * apVec[irow]; dArray[0] = sigma; MPI_Allreduce(dArray, dArray2, 1, MPI_DOUBLE, MPI_SUM, mpiComm_); sigma = dArray2[0]; alpha = rho / sigma; for ( irow = 0; irow < localNRows; irow++ ) { solnVector_[irow] += alpha * pVec[irow]; rVec[irow] -= alpha * apVec[irow]; } rnorm = 0.0; for ( irow = 0; irow < localNRows; irow++ ) rnorm += rVec[irow] * rVec[irow]; dArray[0] = rnorm; if ( diagonal_ != NULL ) for (irow = 0; irow < localNRows; irow++) zVec[irow] = rVec[irow] * diagonal_[irow]; else for (irow = 0; irow < localNRows; irow++) zVec[irow] = rVec[irow]; rhom1 = rho; rho = 0.0; for ( irow = 0; irow < localNRows; irow++ ) rho += rVec[irow] * zVec[irow]; dArray[1] = rho; MPI_Allreduce(dArray, dArray2, 2, MPI_DOUBLE, MPI_SUM, mpiComm_); rho = dArray2[1]; rnorm = sqrt( dArray2[0] ); if ( outputLevel_ >= 2 && iter % 1 == 0 && mypid_ == 0 ) printf("\tFEI_HYPRE_Impl : iteration %d - rnorm = %e (%e)\n", iter, rnorm, eps1); } matvec( solnVector_, rVec ); for ( irow = 0; irow < localNRows; irow++ ) rVec[irow] = rhsVector_[irow] - rVec[irow]; rnorm = 0.0; for ( irow = 0; irow < localNRows; irow++ ) rnorm += rVec[irow] * rVec[irow]; dArray[0] = rnorm; MPI_Allreduce(dArray, dArray2, 1, MPI_DOUBLE, MPI_SUM, mpiComm_); rnorm = sqrt( dArray2[0] ); if ( outputLevel_ >= 2 && mypid_ == 0 ) printf("\tFEI_HYPRE_Impl actual rnorm = %e \n",rnorm); if ( (rnorm < eps1 || rnorm < 1.0e-16) || iter >= krylovMaxIterations_ ) converged = 1; numTrials++; } disassembleSolnVector(); krylovIterations_ = iter; krylovResidualNorm_ = rnorm; /* ----------------------------------------------------------------- * clean up * -----------------------------------------------------------------*/ delete [] rVec; delete [] pVec; delete [] apVec; delete [] zVec; return (1-converged); } /************************************************************************** solve linear system using GMRES -------------------------------------------------------------------------*/ int FEI_HYPRE_Impl::solveUsingGMRES() { int irow, iter, converged=0, localNRows, extNRows, totalNRows; int innerIterations, iV, iV2, kStep, kp1, jV; double rnorm0, rnorm, eps1, epsmac=1.0e-16, gam; double **kVectors, **HH, *RS, *C, *S, *dArray, *dArray2; double *tVector, *tVector2, *v1, *v2, dtemp; /* ----------------------------------------------------------------- * compute matrix information and allocate Krylov vectors * -----------------------------------------------------------------*/ localNRows = numLocalNodes_ * nodeDOF_; extNRows = numExtNodes_ * nodeDOF_; totalNRows = localNRows + extNRows; kVectors = new double*[gmresDim_+2]; for (iV = 0; iV <= gmresDim_+1; iV++) kVectors[iV] = new double[totalNRows]; dArray = new double[gmresDim_+1]; dArray2 = new double[gmresDim_+1]; /* ----------------------------------------------------------------- * assemble the initial guess vector * -----------------------------------------------------------------*/ assembleSolnVector(); /* ----------------------------------------------------------------- * compute initial residual vector and norm * -----------------------------------------------------------------*/ tVector = kVectors[1]; matvec( solnVector_, tVector ); for ( irow = 0; irow < localNRows; irow++ ) tVector[irow] = rhsVector_[irow] - tVector[irow]; rnorm0 = rnorm = 0.0; for ( irow = 0; irow < localNRows; irow++ ) { rnorm0 += (tVector[irow] * tVector[irow]); rnorm += (rhsVector_[irow] * rhsVector_[irow]); } dArray[0] = rnorm0; dArray[1] = rnorm; MPI_Allreduce(dArray, dArray2, 2, MPI_DOUBLE, MPI_SUM, mpiComm_); rnorm0 = sqrt(dArray2[0]); rnorm = sqrt(dArray2[1]); if ( outputLevel_ >= 2 && mypid_ == 0 ) printf("\tFEI_HYPRE_Impl initial rnorm = %e (%e)\n", rnorm, rnorm0); if ( rnorm0 < 1.0e-20 ) { for (iV = 0; iV <= gmresDim_+1; iV++) delete [] kVectors[iV]; delete [] kVectors; delete [] dArray; delete [] dArray2; return 0; } /* ----------------------------------------------------------------- * initialization * -----------------------------------------------------------------*/ if ( krylovAbsRel_ == 0 ) eps1 = krylovTolerance_ * rnorm0; else eps1 = krylovTolerance_; HH = new double*[gmresDim_+2]; for (iV=1; iV<=gmresDim_+1; iV++) HH[iV] = new double[gmresDim_+2]; RS = new double[gmresDim_+2]; S = new double[gmresDim_+1]; C = new double[gmresDim_+1]; /* ----------------------------------------------------------------- * loop until convergence is achieved * -----------------------------------------------------------------*/ iter = 0; while ( rnorm >= eps1 && iter < krylovMaxIterations_ ) { dtemp = 1.0 / rnorm; tVector = kVectors[1]; for (irow = 0; irow < localNRows; irow++) tVector[irow] *= dtemp; RS[1] = rnorm; innerIterations = 0; while ( innerIterations < gmresDim_ && rnorm >= eps1 && iter < krylovMaxIterations_ ) { innerIterations++; iter++; kStep = innerIterations; kp1 = innerIterations + 1; v1 = kVectors[kStep]; v2 = kVectors[0]; if ( diagonal_ != NULL ) for (irow = 0; irow < localNRows; irow++) v2[irow] = v1[irow] * diagonal_[irow]; else for (irow = 0; irow < localNRows; irow++) v2[irow] = v1[irow]; matvec( kVectors[0], kVectors[kp1] ); #if 0 tVector = kVectors[kp1]; for ( iV = 1; iV <= kStep; iV++ ) { dtemp = 0.0; tVector2 = kVectors[iV]; for ( irow = 0; irow < localNRows; irow++ ) dtemp += tVector2[irow] * tVector[irow]; dArray[iV-1] = dtemp; } MPI_Allreduce(dArray, dArray2, kStep, MPI_DOUBLE, MPI_SUM, mpiComm_); tVector = kVectors[kp1]; for ( iV = 1; iV <= kStep; iV++ ) { dtemp = dArray2[iV-1]; HH[iV][kStep] = dtemp; tVector2 = kVectors[iV]; for ( irow = 0; irow < localNRows; irow++ ) tVector[irow] -= dtemp * tVector2[irow]; } #else tVector = kVectors[kp1]; for ( iV = 1; iV <= kStep; iV++ ) { dtemp = 0.0; tVector2 = kVectors[iV]; for ( irow = 0; irow < localNRows; irow++ ) dtemp += tVector2[irow] * tVector[irow]; dArray[0] = dtemp; MPI_Allreduce(dArray, dArray2, 1, MPI_DOUBLE, MPI_SUM, mpiComm_); dtemp = dArray2[0]; HH[iV][kStep] = dtemp; for ( irow = 0; irow < localNRows; irow++ ) tVector[irow] -= dtemp * tVector2[irow]; } #endif dtemp = 0.0; for ( irow = 0; irow < localNRows; irow++ ) dtemp += tVector[irow] * tVector[irow]; MPI_Allreduce(&dtemp, dArray2, 1, MPI_DOUBLE, MPI_SUM, mpiComm_); dtemp = sqrt(dArray2[0]); HH[kp1][kStep] = dtemp; if ( dtemp != 0.0 ) { dtemp = 1.0 / dtemp; for (irow = 0; irow < localNRows; irow++) tVector[irow] *= dtemp; } for ( iV = 2; iV <= kStep; iV++ ) { dtemp = HH[iV-1][kStep]; HH[iV-1][kStep] = C[iV-1] * dtemp + S[iV-1] * HH[iV][kStep]; HH[iV][kStep] = -S[iV-1] * dtemp + C[iV-1] * HH[iV][kStep]; } gam = sqrt(HH[kStep][kStep]*HH[kStep][kStep]+ HH[kp1][kStep]*HH[kp1][kStep]); if ( gam == 0.0 ) gam = epsmac; C[kStep] = HH[kStep][kStep] / gam; S[kStep] = HH[kp1][kStep] / gam; RS[kp1] = -S[kStep] * RS[kStep]; RS[kStep] = C[kStep] * RS[kStep]; HH[kStep][kStep] = C[kStep] * HH[kStep][kStep] + S[kStep] * HH[kp1][kStep]; rnorm = habs(RS[kp1]); if ( outputLevel_ >= 2 && mypid_ == 0 ) printf("\tFEI_HYPRE_Impl : iteration %d - rnorm = %e\n", iter, rnorm); } RS[kStep] = RS[kStep] / HH[kStep][kStep]; for ( iV = 2; iV <= kStep; iV++ ) { iV2 = kStep - iV + 1; dtemp = RS[iV2]; for ( jV = iV2+1; jV <= kStep; jV++ ) dtemp = dtemp - HH[iV2][jV] * RS[jV]; RS[iV2] = dtemp / HH[iV2][iV2]; } tVector = kVectors[1]; dtemp = RS[1]; for ( irow = 0; irow < localNRows; irow++ ) tVector[irow] *= dtemp; for ( iV = 2; iV <= kStep; iV++ ) { dtemp = RS[iV]; tVector2 = kVectors[iV]; for ( irow = 0; irow < localNRows; irow++ ) tVector[irow] += dtemp * tVector2[irow]; } tVector = kVectors[1]; if ( diagonal_ != NULL ) { for (irow = 0; irow < localNRows; irow++) tVector[irow] *= diagonal_[irow]; } for (irow = 0; irow < localNRows; irow++) solnVector_[irow] += tVector[irow]; matvec( solnVector_, tVector ); for ( irow = 0; irow < localNRows; irow++ ) tVector[irow] = rhsVector_[irow] - tVector[irow]; rnorm = 0.0; for ( irow = 0; irow < localNRows; irow++ ) rnorm += (tVector[irow] * tVector[irow]); MPI_Allreduce(&rnorm, dArray2, 1, MPI_DOUBLE, MPI_SUM, mpiComm_); rnorm = sqrt(dArray2[0]); } if ( rnorm < eps1 ) converged = 1; if ( outputLevel_ >= 2 && mypid_ == 0 ) printf("\tFEI_HYPRE_Impl : final rnorm = %e\n", rnorm); disassembleSolnVector(); krylovIterations_ = iter; krylovResidualNorm_ = rnorm; /* ----------------------------------------------------------------- * clean up * -----------------------------------------------------------------*/ for (iV = 0; iV <= gmresDim_+1; iV++) delete [] kVectors[iV]; delete [] kVectors; for ( iV =1; iV <= gmresDim_+1; iV++ ) delete [] HH[iV]; delete [] HH; delete [] RS; delete [] S; delete [] C; delete [] dArray; delete [] dArray2; return (1-converged); } /************************************************************************** solve linear system using CGS -------------------------------------------------------------------------*/ int FEI_HYPRE_Impl::solveUsingCGS() { int irow, iter, converged=0, localNRows, extNRows, totalNRows; int numTrials, innerIteration; double *rVec, *rhVec, *vVec, *pVec, *qVec, *uVec, *tVec; double rho1, rho2, sigma, alpha, dtemp, dtemp2, rnorm, rnorm0; double beta, beta2, eps1, dArray[2], dArray2[2]; /* ----------------------------------------------------------------- * compute matrix information and allocate Krylov vectors * -----------------------------------------------------------------*/ localNRows = numLocalNodes_ * nodeDOF_; extNRows = numExtNodes_ * nodeDOF_; totalNRows = localNRows + extNRows; rVec = new double[totalNRows]; /* ----------------------------------------------------------------- * assemble the initial guess vector * -----------------------------------------------------------------*/ assembleSolnVector(); /* ----------------------------------------------------------------- * compute initial residual vector and norm * -----------------------------------------------------------------*/ matvec( solnVector_, rVec ); for ( irow = 0; irow < localNRows; irow++ ) rVec[irow] = rhsVector_[irow] - rVec[irow]; rnorm0 = rnorm = 0.0; for ( irow = 0; irow < localNRows; irow++ ) { rnorm0 += (rVec[irow] * rVec[irow]); rnorm += (rhsVector_[irow] * rhsVector_[irow]); } dArray[0] = rnorm0; dArray[1] = rnorm; MPI_Allreduce(dArray, dArray2, 2, MPI_DOUBLE, MPI_SUM, mpiComm_); rnorm0 = sqrt(dArray2[1]); rnorm = sqrt(dArray2[0]); if ( outputLevel_ >= 1 && mypid_ == 0 ) printf("\tFEI_HYPRE_Impl initial rnorm = %e (%e)\n",rnorm,rnorm0); if ( rnorm0 == 0.0 ) { delete [] rVec; return 0; } /* ----------------------------------------------------------------- * initialization * -----------------------------------------------------------------*/ rhVec = new double[totalNRows]; vVec = new double[totalNRows]; pVec = new double[totalNRows]; qVec = new double[totalNRows]; uVec = new double[totalNRows]; tVec = new double[totalNRows]; for (irow = 0; irow < localNRows; irow++) rhVec[irow] = rVec[irow]; for (irow = 0; irow < totalNRows; irow++) pVec[irow] = qVec[irow] = 0.0; rho2 = rnorm * rnorm; beta = rho2; iter = 0; numTrials = 0; if ( krylovAbsRel_ == 0 ) eps1 = krylovTolerance_ * rnorm0; else eps1 = krylovTolerance_; if ( rnorm < eps1 ) converged = 1; /* ----------------------------------------------------------------- * loop until convergence is achieved * -----------------------------------------------------------------*/ while ( converged == 0 && numTrials < 2 ) { innerIteration = 0; while ( rnorm >= eps1 && iter < krylovMaxIterations_ ) { iter++; innerIteration++; rho1 = rho2; beta2 = beta * beta; for (irow = 0; irow < totalNRows; irow++) { tVec[irow] = beta * qVec[irow]; uVec[irow] = rVec[irow] + tVec[irow]; pVec[irow] = uVec[irow] + tVec[irow] + beta2 * pVec[irow]; } if ( diagonal_ != NULL ) { for (irow = 0; irow < localNRows; irow++) tVec[irow] = pVec[irow] * diagonal_[irow]; } else for (irow = 0; irow < localNRows; irow++) tVec[irow] = pVec[irow]; matvec( tVec, vVec ); sigma = 0.0; for ( irow = 0; irow < localNRows; irow++ ) sigma += (rhVec[irow] * vVec[irow]); MPI_Allreduce(&sigma, dArray, 1, MPI_DOUBLE, MPI_SUM, mpiComm_); sigma = dArray[0]; alpha = rho1 / sigma; for (irow = 0; irow < totalNRows; irow++) { qVec[irow] = uVec[irow] - alpha * vVec[irow]; uVec[irow] += qVec[irow]; } if ( diagonal_ != NULL ) { for (irow = 0; irow < localNRows; irow++) { tVec[irow] = uVec[irow] * diagonal_[irow]; solnVector_[irow] += alpha * uVec[irow] * diagonal_[irow]; } } else { for (irow = 0; irow < localNRows; irow++) { tVec[irow] = uVec[irow]; solnVector_[irow] += alpha * uVec[irow]; } } matvec( tVec, vVec ); for (irow = 0; irow < totalNRows; irow++) rVec[irow] -= alpha * vVec[irow]; dtemp = dtemp2 = 0.0; for ( irow = 0; irow < localNRows; irow++ ) { dtemp += (rVec[irow] * rhVec[irow]); dtemp2 += (rVec[irow] * rVec[irow]); } dArray[0] = dtemp; dArray[1] = dtemp2; MPI_Allreduce(dArray, dArray2, 2, MPI_DOUBLE, MPI_SUM, mpiComm_); rho2 = dArray2[0]; beta = rho2 / rho1; rnorm = sqrt(dArray2[1]); if ( outputLevel_ >= 1 && iter % 1 == 0 && mypid_ == 0 ) printf("\tFEI_HYPRE_Impl : iteration %d - rnorm = %e (%e)\n", iter, rnorm, eps1); } matvec( solnVector_, rVec ); for ( irow = 0; irow < localNRows; irow++ ) rVec[irow] = rhsVector_[irow] - rVec[irow]; rnorm = 0.0; for ( irow = 0; irow < localNRows; irow++ ) rnorm += rVec[irow] * rVec[irow]; MPI_Allreduce(&rnorm, dArray, 1, MPI_DOUBLE, MPI_SUM, mpiComm_); rnorm = sqrt( dArray[0] ); if ( outputLevel_ >= 2 && mypid_ == 0 ) printf("\tFEI_HYPRE_Impl actual rnorm = %e \n",rnorm); if ( rnorm < eps1 || iter >= krylovMaxIterations_ ) break; numTrials++; } if ( rnorm < eps1 ) converged = 1; disassembleSolnVector(); krylovIterations_ = iter; krylovResidualNorm_ = rnorm; /* ----------------------------------------------------------------- * clean up * -----------------------------------------------------------------*/ delete [] rVec; delete [] rhVec; delete [] pVec; delete [] qVec; delete [] uVec; delete [] tVec; return (1-converged); } /************************************************************************** solve linear system using Bicgstab -------------------------------------------------------------------------*/ int FEI_HYPRE_Impl::solveUsingBicgstab() { int irow, iter, converged=0, localNRows, extNRows, totalNRows; int iM, jM, numTrials, innerIteration, blen=2, vecByteSize; double *rVec, *rhVec, *xhVec, *tVec, **utVec, **rtVec; double rho, rho1, alpha, dtemp, dtemp2, rnorm, rnorm0; double beta, omega, gamma1, eps1, dArray[2], dArray2[2]; double *sigma, *gammap, *gammanp, *gammapp, **mat, **tau; /* ----------------------------------------------------------------- * compute matrix information and allocate Krylov vectors * -----------------------------------------------------------------*/ localNRows = numLocalNodes_ * nodeDOF_; extNRows = numExtNodes_ * nodeDOF_; totalNRows = localNRows + extNRows; rVec = new double[totalNRows]; vecByteSize = localNRows * sizeof(double); /* ----------------------------------------------------------------- * assemble the initial guess vector * -----------------------------------------------------------------*/ assembleSolnVector(); /* ----------------------------------------------------------------- * compute initial residual vector and norm * -----------------------------------------------------------------*/ matvec( solnVector_, rVec ); for ( irow = 0; irow < localNRows; irow++ ) rVec[irow] = rhsVector_[irow] - rVec[irow]; rnorm0 = rnorm = 0.0; for ( irow = 0; irow < localNRows; irow++ ) { rnorm0 += (rVec[irow] * rVec[irow]); rnorm += (rhsVector_[irow] * rhsVector_[irow]); } dArray[0] = rnorm0; dArray[1] = rnorm; MPI_Allreduce(dArray, dArray2, 2, MPI_DOUBLE, MPI_SUM, mpiComm_); rnorm0 = sqrt(dArray2[1]); rnorm = sqrt(dArray2[0]); if ( outputLevel_ >= 1 && mypid_ == 0 ) printf("\tFEI_HYPRE_Impl initial rnorm = %e (%e)\n",rnorm,rnorm0); if ( rnorm0 == 0.0 ) { delete [] rVec; return 0; } /* ----------------------------------------------------------------- * initialization * -----------------------------------------------------------------*/ if ( krylovAbsRel_ == 0 ) eps1 = krylovTolerance_ * rnorm0; else eps1 = krylovTolerance_; if ( rnorm < eps1 ) converged = 1; sigma = new double[blen+1]; gammap = new double[blen+1]; gammanp = new double[blen+1]; gammapp = new double[blen+1]; mat = new double*[blen+1]; tau = new double*[blen+1]; for ( iM = 1; iM <= blen; iM++ ) { mat[iM] = new double[blen+1]; tau[iM] = new double[blen+1]; } rhVec = new double[totalNRows]; xhVec = new double[totalNRows]; tVec = new double[totalNRows]; utVec = new double*[blen+2]; rtVec = new double*[blen+2]; for ( iM = 0; iM < blen+2; iM++ ) { utVec[iM] = new double[totalNRows]; rtVec[iM] = new double[totalNRows]; } iter = 0; numTrials = 0; /* ----------------------------------------------------------------- * loop until convergence is achieved * -----------------------------------------------------------------*/ while ( converged == 0 && numTrials < 2 ) { innerIteration = 0; memcpy( rhVec, rVec, vecByteSize ); memcpy( rtVec[0], rVec, vecByteSize ); memcpy( xhVec, solnVector_, vecByteSize ); memset( utVec[0], 0, vecByteSize ); omega = rho = 1.0; alpha = 0.0; while ( rnorm >= eps1 && iter < krylovMaxIterations_ ) { iter += blen; innerIteration += blen; memcpy( utVec[1], utVec[0], vecByteSize ); memcpy( rtVec[1], rtVec[0], vecByteSize ); rho = -omega * rho; for ( iM = 0; iM < blen; iM++ ) { dtemp = 0.0; for ( irow = 0; irow < localNRows; irow++ ) dtemp += (rhVec[irow] * rtVec[iM+1][irow]); MPI_Allreduce(&dtemp, &rho1, 1, MPI_DOUBLE, MPI_SUM, mpiComm_); beta = alpha * rho1 / rho; rho = rho1; dtemp = -beta; for ( jM = 0; jM <= iM; jM++ ) for ( irow = 0; irow < localNRows; irow++ ) utVec[jM+1][irow] = dtemp * utVec[jM+1][irow] + rtVec[jM+1][irow]; if ( diagonal_ != NULL ) { for (irow = 0; irow < localNRows; irow++) tVec[irow] = utVec[iM+1][irow] * diagonal_[irow]; } else { memcpy( tVec, utVec[iM+1], vecByteSize ); } matvec( tVec, utVec[iM+2] ); dtemp = 0.0; for ( irow = 0; irow < localNRows; irow++ ) dtemp += (rhVec[irow] * utVec[iM+2][irow]); MPI_Allreduce(&dtemp, &gamma1, 1, MPI_DOUBLE, MPI_SUM, mpiComm_); alpha = rho / gamma1; for ( jM = 0; jM <= iM; jM++ ) for ( irow = 0; irow < localNRows; irow++ ) rtVec[jM+1][irow] -= alpha * utVec[jM+2][irow]; if ( diagonal_ != NULL ) { for (irow = 0; irow < localNRows; irow++) tVec[irow] = rtVec[iM+1][irow] * diagonal_[irow]; } else { memcpy( tVec, rtVec[iM+1], vecByteSize ); } matvec( tVec, rtVec[iM+2] ); for (irow = 0; irow < localNRows; irow++) xhVec[irow] += alpha * utVec[1][irow]; } for ( iM = 1; iM <= blen; iM++ ) for ( jM = 1; jM <= blen; jM++ ) mat[iM][jM] = 0.0; for ( iM = 1; iM <= blen; iM++ ) { for ( jM = 1; jM <= iM-1; jM++ ) { dtemp = 0.0; for ( irow = 0; irow < localNRows; irow++ ) dtemp += (rtVec[jM+1][irow] * rtVec[iM+1][irow]); MPI_Allreduce(&dtemp, &dtemp2, 1, MPI_DOUBLE, MPI_SUM, mpiComm_); tau[jM][iM] = dtemp2 / sigma[jM]; mat[jM][iM] = tau[jM][iM] * sigma[jM]; dtemp = -tau[jM][iM]; for (irow = 0; irow < localNRows; irow++) rtVec[iM+1][irow] += dtemp * rtVec[jM+1][irow]; } dtemp = 0.0; for ( irow = 0; irow < localNRows; irow++ ) dtemp += (rtVec[iM+1][irow] * rtVec[iM+1][irow]); dArray[0] = dtemp; dtemp = 0.0; for ( irow = 0; irow < localNRows; irow++ ) dtemp += (rtVec[1][irow] * rtVec[iM+1][irow]); dArray[1] = dtemp; MPI_Allreduce(dArray, dArray2, 2, MPI_DOUBLE, MPI_SUM, mpiComm_); sigma[iM] = dArray2[0]; mat[iM][iM] = sigma[iM]; gammap[iM] = dArray2[1] / sigma[iM]; } gammanp[blen] = gammap[blen]; omega = gammanp[blen]; for ( iM = blen-1; iM >= 1; iM-- ) { gammanp[iM] = gammap[iM]; for (jM=iM+1; jM<=blen; jM++) gammanp[iM] = gammanp[iM] - tau[iM][jM] * gammanp[jM]; } for (iM=1; iM<=blen-1; iM++) { gammapp[iM] = gammanp[iM+1]; for (jM=iM+1; jM<=blen-1; jM++) gammapp[iM] = gammapp[iM] + tau[iM][jM] * gammanp[jM+1]; } dtemp = gammanp[1]; for (irow = 0; irow < localNRows; irow++) xhVec[irow] += dtemp * rtVec[1][irow]; dtemp = - gammap[blen]; for (irow = 0; irow < localNRows; irow++) rtVec[1][irow] += dtemp * rtVec[blen+1][irow]; dtemp = - gammanp[blen]; for (irow = 0; irow < localNRows; irow++) utVec[1][irow] += dtemp * utVec[blen+1][irow]; for (iM=1; iM<=blen-1; iM++) { dtemp = - gammanp[iM]; for (irow = 0; irow < localNRows; irow++) utVec[1][irow] += dtemp * utVec[iM+1][irow]; dtemp = gammapp[iM]; for (irow = 0; irow < localNRows; irow++) xhVec[irow] += dtemp * rtVec[iM+1][irow]; dtemp = - gammap[iM]; for (irow = 0; irow < localNRows; irow++) rtVec[1][irow] += dtemp * rtVec[iM+1][irow]; } memcpy( utVec[0], utVec[1], vecByteSize ); memcpy( rtVec[0], rtVec[1], vecByteSize ); memcpy( solnVector_, xhVec, vecByteSize ); dtemp = 0.0; for ( irow = 0; irow < localNRows; irow++ ) dtemp += (rtVec[1][irow] * rtVec[1][irow]); MPI_Allreduce(&dtemp, &rnorm, 1, MPI_DOUBLE, MPI_SUM, mpiComm_); rnorm = sqrt( rnorm ); if ( outputLevel_ >= 1 && iter % 1 == 0 && mypid_ == 0 ) printf("\tFEI_HYPRE_Impl : iteration %d - rnorm = %e (%e)\n", iter, rnorm, eps1); } if ( diagonal_ != NULL ) { for (irow = 0; irow < localNRows; irow++) solnVector_[irow] *= diagonal_[irow]; } matvec( solnVector_, rVec ); for ( irow = 0; irow < localNRows; irow++ ) rVec[irow] = rhsVector_[irow] - rVec[irow]; rnorm = 0.0; for ( irow = 0; irow < localNRows; irow++ ) rnorm += rVec[irow] * rVec[irow]; MPI_Allreduce(&rnorm, dArray, 1, MPI_DOUBLE, MPI_SUM, mpiComm_); rnorm = sqrt( dArray[0] ); if ( outputLevel_ >= 2 && mypid_ == 0 ) printf("\tFEI_HYPRE_Impl actual rnorm = %e \n",rnorm); if ( rnorm < eps1 || iter >= krylovMaxIterations_ ) break; numTrials++; } if ( rnorm < eps1 ) converged = 1; disassembleSolnVector(); krylovIterations_ = iter; krylovResidualNorm_ = rnorm; /* ----------------------------------------------------------------- * clean up * -----------------------------------------------------------------*/ delete [] sigma; delete [] gammap; delete [] gammanp; delete [] gammapp; for ( iM = 1; iM <= blen; iM++ ) { delete [] mat[iM]; delete [] tau[iM]; } delete [] mat; delete [] tau; delete [] rVec; delete [] rhVec; delete [] xhVec; delete [] tVec; for ( iM = 0; iM < blen+2; iM++ ) { delete [] utVec[iM]; delete [] rtVec[iM]; } delete [] utVec; delete [] rtVec; return (1-converged); } /************************************************************************** solve linear system using SuperLU -------------------------------------------------------------------------*/ int FEI_HYPRE_Impl::solveUsingSuperLU() { #ifdef HAVE_SUPERLU int localNRows, localNnz, *countArray, irow, jcol, *cscIA, *cscJA; int colNum, index, *etree, permcSpec, lwork, panelSize, relax, info; int *permC, *permR; double *cscAA, diagPivotThresh, *rVec, rnorm; superlu_options_t slu_options; SuperLUStat_t slu_stat; GlobalLU_t Glu; trans_t trans; SuperMatrix superLU_Amat; SuperMatrix superLU_Lmat; SuperMatrix superLU_Umat; SuperMatrix AC; SuperMatrix B; /* --------------------------------------------------------------- * conversion from CSR to CSC * -------------------------------------------------------------*/ localNRows = numLocalNodes_ * nodeDOF_; countArray = new int[localNRows]; for ( irow = 0; irow < localNRows; irow++ ) countArray[irow] = 0; for ( irow = 0; irow < localNRows; irow++ ) for ( jcol = diagIA_[irow]; jcol < diagIA_[irow+1]; jcol++ ) countArray[diagJA_[jcol]]++; localNnz = diagIA_[localNRows]; cscJA = hypre_TAlloc(int, (localNRows+1) , HYPRE_MEMORY_HOST); cscIA = hypre_TAlloc(int, localNnz , HYPRE_MEMORY_HOST); cscAA = hypre_TAlloc(double, localNnz , HYPRE_MEMORY_HOST); cscJA[0] = 0; localNnz = 0; for ( jcol = 1; jcol <= localNRows; jcol++ ) { localNnz += countArray[jcol-1]; cscJA[jcol] = localNnz; } for ( irow = 0; irow < localNRows; irow++ ) { for ( jcol = diagIA_[irow]; jcol < diagIA_[irow+1]; jcol++ ) { colNum = diagJA_[jcol]; index = cscJA[colNum]++; cscIA[index] = irow; cscAA[index] = diagAA_[jcol]; } } cscJA[0] = 0; localNnz = 0; for ( jcol = 1; jcol <= localNRows; jcol++ ) { localNnz += countArray[jcol-1]; cscJA[jcol] = localNnz; } delete [] countArray; /* --------------------------------------------------------------- * make SuperMatrix * -------------------------------------------------------------*/ dCreate_CompCol_Matrix(&superLU_Amat, localNRows, localNRows, cscJA[localNRows], cscAA, cscIA, cscJA, SLU_NC, SLU_D, SLU_GE); etree = new int[localNRows]; permC = new int[localNRows]; permR = new int[localNRows]; permcSpec = 0; get_perm_c(permcSpec, &superLU_Amat, permC); slu_options.Fact = DOFACT; slu_options.SymmetricMode = NO; sp_preorder(&slu_options, &superLU_Amat, permC, etree, &AC); diagPivotThresh = 1.0; panelSize = sp_ienv(1); relax = sp_ienv(2); StatInit(&slu_stat); lwork = 0; slu_options.ColPerm = MY_PERMC; slu_options.Fact = DOFACT; slu_options.DiagPivotThresh = diagPivotThresh; // dgstrf(&slu_options, &AC, dropTol, relax, panelSize, // etree, NULL, lwork, permC, permR, &superLU_Lmat, // &superLU_Umat, &slu_stat, &info); dgstrf(&slu_options, &AC, relax, panelSize, etree, NULL, lwork, permC, permR, &superLU_Lmat, &superLU_Umat, &Glu, &slu_stat, &info); Destroy_CompCol_Permuted(&AC); Destroy_CompCol_Matrix(&superLU_Amat); delete [] etree; /* ------------------------------------------------------------- * create a SuperLU dense matrix from right hand side * -----------------------------------------------------------*/ solnVector_ = new double[localNRows]; for ( irow = 0; irow < localNRows; irow++ ) solnVector_[irow] = rhsVector_[irow]; dCreate_Dense_Matrix(&B, localNRows, 1, solnVector_, localNRows, SLU_DN, SLU_D, SLU_GE); /* ------------------------------------------------------------- * solve the problem * -----------------------------------------------------------*/ trans = NOTRANS; dgstrs (trans, &superLU_Lmat, &superLU_Umat, permC, permR, &B, &slu_stat, &info); rVec = new double[localNRows]; matvec( solnVector_, rVec ); for ( irow = 0; irow < localNRows; irow++ ) rVec[irow] = rhsVector_[irow] - rVec[irow]; rnorm = 0.0; for ( irow = 0; irow < localNRows; irow++ ) rnorm += rVec[irow] * rVec[irow]; rnorm = sqrt( rnorm ); if ( outputLevel_ >= 2 && mypid_ == 0 ) printf("\tFEI_HYPRE_Impl rnorm = %e \n",rnorm); disassembleSolnVector(); krylovIterations_ = 1; krylovResidualNorm_ = rnorm; /* ------------------------------------------------------------- * clean up * -----------------------------------------------------------*/ Destroy_SuperMatrix_Store(&B); delete [] rVec; if ( permR != NULL ) { Destroy_SuperNode_Matrix(&superLU_Lmat); Destroy_CompCol_Matrix(&superLU_Umat); } delete [] permR; delete [] permC; StatFree(&slu_stat); return (info); #else return (1); #endif } /************************************************************************** matrix vector multiply -------------------------------------------------------------------------*/ void FEI_HYPRE_Impl::matvec(double *xvec, double *yvec) { /* ----------------------------------------------------------------- * exchange vector information between processors * -----------------------------------------------------------------*/ PVectorInterChange( xvec ); /* ----------------------------------------------------------------- * in case global stiffness matrix has been composed, use it * -----------------------------------------------------------------*/ if ( diagIA_ != NULL ) { int matDim = ( numLocalNodes_ + numExtNodes_ ) * nodeDOF_; double ddata; for ( int iD = 0; iD < matDim; iD++ ) { ddata = 0.0; for ( int iD2 = diagIA_[iD]; iD2 < diagIA_[iD+1]; iD2++ ) ddata += diagAA_[iD2] * xvec[diagJA_[iD2]]; yvec[iD] = ddata; } } /* ----------------------------------------------------------------- * in case global stiffness matrix has been composed, use it * -----------------------------------------------------------------*/ if ( offdIA_ != NULL ) { int matDim = ( numLocalNodes_ + numExtNodes_ ) * nodeDOF_; double ddata; for ( int iD = 0; iD < matDim; iD++ ) { ddata = 0.0; for ( int iD2 = offdIA_[iD]; iD2 < offdIA_[iD+1]; iD2++ ) ddata += offdAA_[iD2] * xvec[offdJA_[iD2]]; yvec[iD] += ddata; } } /* ----------------------------------------------------------------- * exchange vector information between processors * -----------------------------------------------------------------*/ PVectorReverseChange( yvec ); } /************************************************************************** form right hand side vector from element load vectors -------------------------------------------------------------------------*/ void FEI_HYPRE_Impl::assembleRHSVector() { int iB, iE, iN, iD, **elemNodeLists, numElems, elemNumNodes; int eqnIndex1, eqnIndex2, matDim; double **rhsVectors; if ( rhsVector_ != NULL ) delete [] rhsVector_; matDim = (numLocalNodes_ + numExtNodes_) * nodeDOF_; rhsVector_ = new double[matDim]; for ( iD = 0; iD < matDim; iD++ ) rhsVector_[iD] = 0.0; for ( iB = 0; iB < numBlocks_; iB++ ) { elemNodeLists = elemBlocks_[iB]->getElemNodeLists(); rhsVectors = elemBlocks_[iB]->getRHSVectors(); numElems = elemBlocks_[iB]->getNumElems(); elemNumNodes = elemBlocks_[iB]->getElemNumNodes(); for ( iE = 0; iE < numElems; iE++ ) { for ( iN = 0; iN < elemNumNodes; iN++ ) { eqnIndex1 = elemNodeLists[iE][iN] * nodeDOF_; eqnIndex2 = iN * nodeDOF_; for ( iD = 0; iD < nodeDOF_; iD++ ) rhsVector_[eqnIndex1+iD] += rhsVectors[iE][eqnIndex2+iD]; } } } PVectorReverseChange( rhsVector_ ); PVectorInterChange( rhsVector_ ); } /************************************************************************** form solution vector -------------------------------------------------------------------------*/ void FEI_HYPRE_Impl::assembleSolnVector() { int iB, iE, iN, iD, **elemNodeLists, numElems, elemNumNodes; int eqnIndex1, eqnIndex2, matDim; double **solnVectors; matDim = (numLocalNodes_ + numExtNodes_) * nodeDOF_; if ( solnVector_ == NULL ) solnVector_ = new double[matDim]; for ( iD = 0; iD < matDim; iD++ ) solnVector_[iD] = 0.0; for ( iB = 0; iB < numBlocks_; iB++ ) { elemNodeLists = elemBlocks_[iB]->getElemNodeLists(); solnVectors = elemBlocks_[iB]->getSolnVectors(); numElems = elemBlocks_[iB]->getNumElems(); elemNumNodes = elemBlocks_[iB]->getElemNumNodes(); for ( iE = 0; iE < numElems; iE++ ) { for ( iN = 0; iN < elemNumNodes; iN++ ) { eqnIndex1 = elemNodeLists[iE][iN] * nodeDOF_; eqnIndex2 = iN * nodeDOF_; for ( iD = 0; iD < nodeDOF_; iD++ ) solnVector_[eqnIndex1+iD] += solnVectors[iE][eqnIndex2+iD]; } } } PVectorReverseChange( solnVector_ ); PVectorInterChange( solnVector_ ); } /************************************************************************** distribute solution vector to element solution vectors -------------------------------------------------------------------------*/ void FEI_HYPRE_Impl::disassembleSolnVector() { int iB, iE, iN, iD, **elemNodeLists, numElems, elemNumNodes; int eqnIndex1, eqnIndex2; double **solnVectors; for ( iB = 0; iB < numBlocks_; iB++ ) { elemNodeLists = elemBlocks_[iB]->getElemNodeLists(); solnVectors = elemBlocks_[iB]->getSolnVectors(); numElems = elemBlocks_[iB]->getNumElems(); elemNumNodes = elemBlocks_[iB]->getElemNumNodes(); for ( iE = 0; iE < numElems; iE++ ) { for ( iN = 0; iN < elemNumNodes; iN++ ) { eqnIndex1 = elemNodeLists[iE][iN] * nodeDOF_; eqnIndex2 = iN * nodeDOF_; for ( iD = 0; iD < nodeDOF_; iD++ ) solnVectors[iE][eqnIndex2+iD] = solnVector_[eqnIndex1+iD]; } } } } /************************************************************************** sort an integer array -------------------------------------------------------------------------*/ void FEI_HYPRE_Impl::IntSort(int *ilist, int left, int right) { int i, last, mid, itemp; if (left >= right) return; mid = (left + right) / 2; itemp = ilist[left]; ilist[left] = ilist[mid]; ilist[mid] = itemp; last = left; for (i = left+1; i <= right; i++) { if (ilist[i] < ilist[left]) { last++; itemp = ilist[last]; ilist[last] = ilist[i]; ilist[i] = itemp; } } itemp = ilist[left]; ilist[left] = ilist[last]; ilist[last] = itemp; IntSort(ilist, left, last-1); IntSort(ilist, last+1, right); } /************************************************************************** sort an integer array and an auxiliary array -------------------------------------------------------------------------*/ void FEI_HYPRE_Impl::IntSort2(int *ilist, int *ilist2, int left, int right) { int i, last, mid, itemp; if (left >= right) return; mid = (left + right) / 2; itemp = ilist[left]; ilist[left] = ilist[mid]; ilist[mid] = itemp; itemp = ilist2[left]; ilist2[left] = ilist2[mid]; ilist2[mid] = itemp; last = left; for (i = left+1; i <= right; i++) { if (ilist[i] < ilist[left]) { last++; itemp = ilist[last]; ilist[last] = ilist[i]; ilist[i] = itemp; itemp = ilist2[last]; ilist2[last] = ilist2[i]; ilist2[i] = itemp; } } itemp = ilist[left]; ilist[left] = ilist[last]; ilist[last] = itemp; itemp = ilist2[left]; ilist2[left] = ilist2[last]; ilist2[last] = itemp; IntSort2(ilist, ilist2, left, last-1); IntSort2(ilist, ilist2, last+1, right); } /************************************************************************** sort an integer array with an auxiliary double array -------------------------------------------------------------------------*/ void FEI_HYPRE_Impl::IntSort2a(int *ilist,double *dlist,int left,int right) { int mid, i, itemp, last, end2, isort, *ilist2, *ilist3; double dtemp, *dlist2, *dlist3; if (left >= right) return; mid = (left + right) / 2; itemp = ilist[left]; ilist[left] = ilist[mid]; ilist[mid] = itemp; dtemp = dlist[left]; dlist[left] = dlist[mid]; dlist[mid] = dtemp; last = left; isort = ilist[left]; ilist2 = &(ilist[last]); dlist2 = &(dlist[last]); ilist3 = &(ilist[left+1]); dlist3 = &(dlist[left+1]); end2 = right + 1; for (i = left+1; i < end2; i++) { if ( *ilist3 < isort ) { last++; ilist2++; dlist2++; itemp = *ilist2; *ilist2 = *ilist3; *ilist3 = itemp; dtemp = *dlist2; *dlist2 = *dlist3; *dlist3 = dtemp; } ilist3++; dlist3++; } itemp = ilist[left]; ilist[left] = ilist[last]; ilist[last] = itemp; dtemp = dlist[left]; dlist[left] = dlist[last]; dlist[last] = dtemp; IntSort2a(ilist, dlist, left, last-1); IntSort2a(ilist, dlist, last+1, right); } /************************************************************************** exchange extended vectors between processors -------------------------------------------------------------------------*/ void FEI_HYPRE_Impl::PVectorInterChange( double *dvec ) { int iD, iD2, iP, ind1, ind2; double **dRecvBufs, **dSendBufs; MPI_Request *requests; MPI_Status status; if ( nRecvs_ > 0 ) { dRecvBufs = new double*[nRecvs_]; requests = new MPI_Request[nRecvs_]; for ( iP = 0; iP < nRecvs_; iP++ ) dRecvBufs[iP] = new double[recvLengs_[iP]*nodeDOF_]; } if ( nSends_ > 0 ) { dSendBufs = new double*[nSends_]; for ( iP = 0; iP < nSends_; iP++ ) { dSendBufs[iP] = new double[sendLengs_[iP]*nodeDOF_]; for ( iD = 0; iD < sendLengs_[iP]; iD++ ) { ind1 = sendProcIndices_[iP][iD] * nodeDOF_; ind2 = iD * nodeDOF_; for ( iD2 = 0; iD2 < nodeDOF_; iD2++ ) dSendBufs[iP][ind2+iD2] = dvec[ind1+iD2]; } } } for ( iP = 0; iP < nRecvs_; iP++ ) MPI_Irecv( dRecvBufs[iP], recvLengs_[iP]*nodeDOF_, MPI_DOUBLE, recvProcs_[iP], 40343, mpiComm_, &requests[iP]); for ( iP = 0; iP < nSends_; iP++ ) MPI_Send( dSendBufs[iP], sendLengs_[iP]*nodeDOF_, MPI_DOUBLE, sendProcs_[iP], 40343, mpiComm_); for ( iP = 0; iP < nRecvs_; iP++ ) MPI_Wait( &requests[iP], &status ); if ( nRecvs_ > 0 ) delete [] requests; for ( iP = 0; iP < nRecvs_; iP++ ) { for ( iD = 0; iD < recvLengs_[iP]; iD++ ) { ind1 = recvProcIndices_[iP][iD] * nodeDOF_; ind2 = iD * nodeDOF_; for ( iD2 = 0; iD2 < nodeDOF_; iD2++ ) dvec[ind1+iD2] = dRecvBufs[iP][ind2+iD2]; } delete [] dRecvBufs[iP]; } if ( nRecvs_ > 0 ) delete [] dRecvBufs; if ( nSends_ > 0 ) { for ( iP = 0; iP < nSends_; iP++ ) delete [] dSendBufs[iP]; delete [] dSendBufs; } } /************************************************************************** compress overlapped vector -------------------------------------------------------------------------*/ void FEI_HYPRE_Impl::PVectorReverseChange( double *dvec ) { int iD, iD2, iP, ind1, ind2; double **dRecvBufs, **dSendBufs; MPI_Request *requests; MPI_Status status; if ( nSends_ > 0 ) { dRecvBufs = new double*[nSends_]; requests = new MPI_Request[nSends_]; for ( iP = 0; iP < nSends_; iP++ ) dRecvBufs[iP] = new double[sendLengs_[iP]*nodeDOF_]; } if ( nRecvs_ > 0 ) { dSendBufs = new double*[nRecvs_]; for ( iP = 0; iP < nRecvs_; iP++ ) { dSendBufs[iP] = new double[recvLengs_[iP]*nodeDOF_]; for ( iD = 0; iD < recvLengs_[iP]; iD++ ) { ind1 = recvProcIndices_[iP][iD] * nodeDOF_; ind2 = iD * nodeDOF_; for ( iD2 = 0; iD2 < nodeDOF_; iD2++ ) dSendBufs[iP][ind2+iD2] = dvec[ind1+iD2]; } } } for ( iP = 0; iP < nSends_; iP++ ) MPI_Irecv( dRecvBufs[iP], sendLengs_[iP]*nodeDOF_, MPI_DOUBLE, sendProcs_[iP], 40342, mpiComm_, &requests[iP]); for ( iP = 0; iP < nRecvs_; iP++ ) MPI_Send( dSendBufs[iP], recvLengs_[iP]*nodeDOF_, MPI_DOUBLE, recvProcs_[iP], 40342, mpiComm_); for ( iP = 0; iP < nSends_; iP++ ) MPI_Wait( &requests[iP], &status ); if ( nSends_ > 0 ) delete [] requests; for ( iP = 0; iP < nSends_; iP++ ) { for ( iD = 0; iD < sendLengs_[iP]; iD++ ) { ind1 = sendProcIndices_[iP][iD] * nodeDOF_; ind2 = iD * nodeDOF_; for ( iD2 = 0; iD2 < nodeDOF_; iD2++ ) dvec[ind1+iD2] += dRecvBufs[iP][ind2+iD2]; } delete [] dRecvBufs[iP]; } if ( nSends_ > 0 ) delete [] dRecvBufs; if ( nRecvs_ > 0 ) { for ( iP = 0; iP < nRecvs_; iP++ ) delete [] dSendBufs[iP]; delete [] dSendBufs; } } /************************************************************************** print matrix and right hand side vector to a file -------------------------------------------------------------------------*/ void FEI_HYPRE_Impl::printLinearSystem() { int iD, iD2, offset, iBegin, iEnd, totalNNZ; char filename[20]; FILE *fp; sprintf(filename, "mat.%d", mypid_); fp = fopen(filename, "w"); offset = globalNodeOffsets_[mypid_]; iEnd = numLocalNodes_ * nodeDOF_; totalNNZ = diagIA_[iEnd]; if ( offdIA_ != NULL ) totalNNZ += offdIA_[iEnd]; fprintf(fp, "%6d %7d \n", iEnd, totalNNZ); for ( iD = 0; iD < iEnd; iD++ ) { for ( iD2 = diagIA_[iD]; iD2 < diagIA_[iD+1]; iD2++ ) if ( diagJA_[iD2] == iD ) fprintf(fp,"%6d %6d %25.16e \n", iD+1+offset, diagJA_[iD2]+1+offset, diagAA_[iD2]); for ( iD2 = diagIA_[iD]; iD2 < diagIA_[iD+1]; iD2++ ) if ( diagJA_[iD2] != iD ) fprintf(fp,"%6d %6d %25.16e \n", iD+1+offset, diagJA_[iD2]+1+offset, diagAA_[iD2]); if ( offdIA_ != NULL ) { for ( iD2 = offdIA_[iD]; iD2 < offdIA_[iD+1]; iD2++ ) fprintf(fp,"%6d %6d %25.16e \n", iD+1+offset, nodeExtNewGlobalIDs_[offdJA_[iD2]-iEnd]+1,offdAA_[iD2]); } } iBegin = numLocalNodes_ * nodeDOF_; iEnd = (numLocalNodes_ + numExtNodes_ ) * nodeDOF_; for ( iD = iBegin; iD < iEnd; iD++ ) { for ( iD2 = diagIA_[iD]; iD2 < diagIA_[iD+1]; iD2++ ) if ( diagJA_[iD2] == iD ) fprintf(fp,"%6d %6d %25.16e \n",nodeExtNewGlobalIDs_[iD-iBegin]+1, diagJA_[iD2]+1+offset, diagAA_[iD]); for ( iD2 = diagIA_[iD]; iD2 < diagIA_[iD+1]; iD2++ ) if ( diagJA_[iD2] != iD ) fprintf(fp,"%6d %6d %25.16e \n",nodeExtNewGlobalIDs_[iD-iBegin]+1, diagJA_[iD2]+1+offset, diagAA_[iD]); if ( offdIA_ != NULL ) { for ( iD2 = offdIA_[iD]; iD2 < offdIA_[iD+1]; iD2++ ) fprintf(fp,"%6d %6d %25.16e \n",nodeExtNewGlobalIDs_[iD-iBegin]+1, nodeExtNewGlobalIDs_[offdJA_[iD2]-iBegin]+1, offdAA_[iD2]); } } fclose(fp); sprintf(filename, "rhs.%d", mypid_); fp = fopen(filename, "w"); iEnd = numLocalNodes_ * nodeDOF_; fprintf(fp, "%6d \n", iEnd); for ( iD = 0; iD < iEnd; iD++ ) { fprintf(fp,"%6d %25.16e \n", iD+1+offset, rhsVector_[iD]); } iBegin = numLocalNodes_ * nodeDOF_; iEnd = (numLocalNodes_ + numExtNodes_ ) * nodeDOF_; for ( iD = iBegin; iD < iEnd; iD++ ) { fprintf(fp,"%8d %25.16e\n",nodeExtNewGlobalIDs_[iD-iBegin]+1, rhsVector_[iD]); } fclose(fp); } hypre-2.33.0/src/FEI_mv/fei-hypre/FEI_HYPRE_Impl.h000066400000000000000000000142621477326011500212310ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /*************************************************************************** Module: FEI_HYPRE_impl.h Purpose: local implementation of the FEI/LSC ***************************************************************************/ #ifndef __FEI_HYPRE_IMPL_H__ #define __FEI_HYPRE_IMPL_H__ /************************************************************************** definition of the class to capture the FEI information ---------------------------------------------------------------------------*/ class FEI_HYPRE_Elem_Block { int blockID_; int numElems_; int nodeDOF_; int *elemIDs_; int **elemNodeLists_; int *sortedIDs_; int *sortedIDAux_; double **elemMatrices_; double **rhsVectors_; double **solnVectors_; int nodesPerElem_; int currElem_; double *tempX_; double *tempY_; public : FEI_HYPRE_Elem_Block(int blockID); ~FEI_HYPRE_Elem_Block(); int getElemBlockID() {return blockID_;} int getNumElems() {return numElems_;} int getElemNumNodes() {return nodesPerElem_;} int getCurrentElem() {return currElem_;} int **getElemNodeLists() {return elemNodeLists_;} double **getElemMatrices() {return elemMatrices_;} double **getRHSVectors() {return rhsVectors_;} double **getSolnVectors() {return solnVectors_;} int initialize(int numElems, int nNodesPerElem, int nodeDOF); int reset(); int resetRHSVectors(double s); int resetSolnVectors(double s); int loadElemInfo(int elemID, int *elemNodeList, double **elemStiff, double *elemRHS); int loadElemMatrix(int elemID, int *elemNodeList, double **elemStiff); int loadElemRHS(int elemID, double *elemRHS); int checkLoadComplete(); }; /************************************************************************** definition of the class to capture the FEI information ---------------------------------------------------------------------------*/ class FEI_HYPRE_Impl { MPI_Comm mpiComm_; int mypid_; int outputLevel_; int numBlocks_; FEI_HYPRE_Elem_Block **elemBlocks_; int numLocalNodes_; int numExtNodes_; int nodeDOF_; int *nodeGlobalIDs_; int *nodeExtNewGlobalIDs_; int *globalNodeOffsets_; int numSharedNodes_; int *sharedNodeIDs_; int *sharedNodeNProcs_; int **sharedNodeProcs_; int nRecvs_; int *recvLengs_; int *recvProcs_; int **recvProcIndices_; int nSends_; int *sendLengs_; int *sendProcs_; int **sendProcIndices_; int solverID_; int krylovMaxIterations_; double krylovTolerance_; int krylovAbsRel_; int krylovIterations_; double krylovResidualNorm_; int gmresDim_; int *diagIA_; int *diagJA_; double *diagAA_; int *offdIA_; int *offdJA_; double *offdAA_; double *diagonal_; int numBCNodes_; int *BCNodeIDs_; double **BCNodeAlpha_; double **BCNodeBeta_; double **BCNodeGamma_; double *solnVector_; double *rhsVector_; int FLAG_PrintMatrix_; int FLAG_LoadComplete_; double TimerLoad_; double TimerLoadStart_; double TimerSolve_; double TimerSolveStart_; public : FEI_HYPRE_Impl(MPI_Comm comm); ~FEI_HYPRE_Impl(); int parameters(int numParams, char **paramString); int setSolveType(int solveType) {(void) solveType; return 0;} int initFields(int numFields, int *fieldSizes, int *fieldIDs); int initElemBlock(int elemBlockID, int numElements, int numNodesPerElement, int *numFieldsPerNode, int **nodalFieldIDs, int numElemDOFFieldsPerElement, int *elemDOFFieldIDs, int interleaveStrategy); int initElem(int elemBlockID, int elemID, int *elemConn) {(void) elemBlockID; (void) elemID; (void) elemConn; return 0;} int initSharedNodes(int nShared, int *sharedIDs, int *sharedLeng, int **sharedProcs); int initComplete() {return 0;} int resetSystem(double s); int resetMatrix(double s); int resetRHSVector(double s); int resetInitialGuess(double s); int loadNodeBCs(int nNodes, int *nodeIDs, int fieldID, double **alpha, double **beta, double **gamma); int sumInElem(int elemBlock, int elemID, int *elemConn, double **elemStiff, double *elemLoad, int elemFormat); int sumInElemMatrix(int elemBlock, int elemID, int* elemConn, double **elemStiffness, int elemFormat); int sumInElemRHS(int elemBlock, int elemID, int *elemConn, double *elemLoad); int loadComplete(); int solve(int *status); int iterations(int *iterTaken) {*iterTaken = krylovIterations_; return 0;} int residualNorm(int whichNorm, int numFields, int* fieldIDs, double* norms); int getNumBlockActNodes(int blockID, int *nNodes); int getNumBlockActEqns(int blockID, int *nEqns); int getBlockNodeIDList(int blockID, int numNodes, int *nodeIDList); int getBlockNodeSolution(int blockID, int numNodes, int *nodeIDList, int *solnOffsets, double *solnValues); private: void assembleRHSVector(); void assembleSolnVector(); void disassembleSolnVector(); void buildGlobalMatrixVector(); void matvec(double *x, double *y); int solveUsingCG(); int solveUsingGMRES(); int solveUsingCGS(); int solveUsingBicgstab(); int solveUsingSuperLU(); void IntSort(int *, int, int); void IntSort2a(int *, double *, int, int); void PVectorInterChange(double *x); void PVectorReverseChange(double *x); void printLinearSystem(); public: static void IntSort2(int *, int *, int, int); }; #endif /* endif for __FEI_HYPRE_IMPL_H__ */ hypre-2.33.0/src/FEI_mv/fei-hypre/FEI_HYPRE_include.h000066400000000000000000000014641477326011500217530ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #ifndef __ALE_FEI_INCLUDE_H__ #define __ALE_FEI_INCLUDE_H__ #ifdef EIGHT_BYTE_GLOBAL_ID typedef long long GlobalID; #else typedef int GlobalID; #endif #define FEI_FATAL_ERROR -1 #define FEI_LOCAL_TIMES 0 #define FEI_MAX_TIMES 1 #define FEI_MIN_TIMES 2 #if HAVE_FEI # define FEI_NOT_USING_ESI # ifdef AIX # define BOOL_NOT_SUPPORTED # endif # if PARALLEL # define FEI_PAR # else # define FEI_SER # endif #endif #endif hypre-2.33.0/src/FEI_mv/fei-hypre/HYPRE_Builder.h000066400000000000000000000021341477326011500212260ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ // ************************************************************************* // Link to build an FEI_Implementation based on HYPRE // ************************************************************************* #ifndef _HYPRE_Builder_h_ #define _HYPRE_Builder_h_ #include "utilities/_hypre_utilities.h" #include "HYPRE.h" #include "../../IJ_mv/HYPRE_IJ_mv.h" #include "../../parcsr_mv/HYPRE_parcsr_mv.h" #include "../../parcsr_ls/HYPRE_parcsr_ls.h" #include "HYPRE_LinSysCore.h" #include "FEI_Implementation.h" class HYPRE_Builder { public: static FEI* FEIBuilder(MPI_Comm comm, int masterProc) { HYPRE_LinSysCore* linSysCore = new HYPRE_LinSysCore(comm); return(new FEI_Implementation(linSysCore, comm, masterProc)); } }; #endif hypre-2.33.0/src/FEI_mv/fei-hypre/HYPRE_FEI.doc000066400000000000000000000623211477326011500205650ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "utilities.h" #include "LinearSystemCore.h" #include "LLNL_FEI_Impl.h" #ifndef hypre_FE_MV_HEADER #define hypre_FE_MV_HEADER #include "HYPRE.h" #ifdef __cplusplus extern "C" { #endif /****************************************************************************** * * Header info for the hypre_FEMesh structures * *****************************************************************************/ #ifndef hypre_FE_MESH_HEADER #define hypre_FE_MESH_HEADER /*-------------------------------------------------------------------------- * hypre_FEMesh: *--------------------------------------------------------------------------*/ typedef struct hypre_FEMesh_struct { MPI_Comm comm_; void *linSys_; void *feiPtr_; int objectType_; } hypre_FEMesh; typedef struct hypre_FEMesh_struct *HYPRE_FEMesh; #endif /****************************************************************************** * * Header info for the hypre_FEMatrix structures * *****************************************************************************/ #ifndef hypre_FE_MATRIX_HEADER #define hypre_FE_MATRIX_HEADER /*-------------------------------------------------------------------------- * hypre_FEMatrix: *--------------------------------------------------------------------------*/ typedef struct hypre_FEMatrix_struct { MPI_Comm comm_; hypre_FEMesh *mesh_; } hypre_FEMatrix; typedef struct hypre_FEMatrix_struct *HYPRE_FEMatrix; #endif /****************************************************************************** * * Header info for the hypre_FEVector structures * *****************************************************************************/ #ifndef hypre_FE_VECTOR_HEADER #define hypre_FE_VECTOR_HEADER /*-------------------------------------------------------------------------- * hypre_FEVector: *--------------------------------------------------------------------------*/ typedef struct hypre_FEVector_struct { MPI_Comm comm_; hypre_FEMesh* mesh_; } hypre_FEVector; typedef struct hypre_FEVector_struct *HYPRE_FEVector; #endif /** * @name HYPRE's Finite Element Interface * * @memo A finite element-based conceptual interface **/ /*@{*/ /** * @name HYPRE FEI functions **/ /*@{*/ /*-------------------------------------------------------------------------- * HYPRE_fei_mesh.cxx *--------------------------------------------------------------------------*/ /** * Finite element interface constructor: this function creates an * instantiation of the HYPRE fei class. * @param comm - an MPI communicator * @param mesh - upon return, contains a pointer to the finite element mesh **/ int HYPRE_FEMeshCreate( MPI_Comm comm, HYPRE_FEMesh *mesh ); /** * Finite element interface destructor: this function destroys * the object as well as its internal memory allocations. * @param mesh - a pointer to the finite element mesh **/ int HYPRE_FEMeshDestroy( HYPRE_FEMesh mesh ); /** * This function passes the externally-built FEI object (for example, * Sandia's implementation of the FEI) as well as corresponding * LinearSystemCore object. * @param mesh - a pointer to the finite element mesh * @param externFEI - a pointer to the externally built finite element object * @param linSys - a pointer to the HYPRE linear system solver object built * using the HYPRE\_base\_create function. **/ int HYPRE_FEMeshSetFEObject(HYPRE_FEMesh mesh, void *externFEI, void *linSys); /** * The parameters function is the single most important function * to pass solver information (which solver, which preconditioner, * tolerance, other solver parameters) to the underlying solver. * @param mesh - a pointer to the finite element mesh * @param numParams - number of command strings * @param paramStrings - the command strings **/ int HYPRE_FEMeshParameters(HYPRE_FEMesh mesh, int numParams, char **paramStrings); /** * Each node or element variable has one or more fields. The field * information can be set up using this function. * @param mesh - a pointer to the finite element mesh * @param numFields - total number of fields for all variable types * @param fieldSizes - degree of freedom for each field type * @param fieldIDs - a list of field identifiers **/ int HYPRE_FEMeshInitFields( HYPRE_FEMesh mesh, int numFields, int *fieldSizes, int *fieldIDs ); /** * The whole finite element mesh can be broken down into a number of * element blocks. The attributes for each element block are: an * identifier, number of elements, number of nodes per elements, * the number of fields in each element node, etc. * @param mesh - a pointer to the finite element mesh * @param blockID - element block identifier * @param nElements - number of element in this block * @param numNodesPerElement - number of nodes per element in this block * @param numFieldsPerNode - number of fields for each node * @param nodalFieldIDs - field identifiers for the nodal unknowns * @param numElemDOFFieldsPerElement - number of fields for the element * @param elemDOFFieldIDs - field identifier for the element unknowns * @param interleaveStratety - indicates how unknowns are ordered */ int HYPRE_FEMeshInitElemBlock( HYPRE_FEMesh mesh, int blockID, int nElements, int numNodesPerElement, int *numFieldsPerNode, int **nodalFieldIDs, int numElemDOFFieldsPerElement, int *elemDOFFieldIDs, int interleaveStrategy ); /** * This function initializes element connectivity (that is, the node * identifiers associated with the current element) given an element * block identifier and the element identifier with the element block. * @param mesh - a pointer to the finite element mesh * @param blockID - element block identifier * @param elemID - element identifier * @param elemConn - a list of node identifiers for this element **/ int HYPRE_FEMeshInitElem( HYPRE_FEMesh mesh, int blockID, int elemID, int *elemConn ); /** * This function initializes the nodes that are shared between the * current processor and its neighbors. The FEI will decide a unique * processor each shared node will be assigned to. * @param mesh - a pointer to the finite element mesh * @param nShared - number of shared nodes * @param sharedIDs - shared node identifiers * @param sharedLengs - the number of processors each node shares with * @param sharedProcs - the processor identifiers each node shares with **/ int HYPRE_FEMeshInitSharedNodes( HYPRE_FEMesh mesh, int nShared, int *sharedIDs, int *sharedLeng, int **sharedProcs ); /** * This function signals to the FEI that the initialization step has * been completed. The loading step will follow. * @param mesh - a pointer to the finite element mesh **/ int HYPRE_FEMeshInitComplete( HYPRE_FEMesh mesh ); /** * This function loads the nodal boundary conditions. The boundary conditions * @param mesh - a pointer to the finite element mesh * @param nNodes - number of nodes boundary conditions are imposed * @param nodeIDs - nodal identifiers * @param fieldID - field identifier with nodes where BC are imposed * @param alpha - the multipliers for the field * @param beta - the multipliers for the normal derivative of the field * @param gamma - the boundary values on the right hand side of the equations **/ int HYPRE_FEMeshLoadNodeBCs( HYPRE_FEMesh mesh, int numNodes, int *nodeIDs, int fieldID, double **alpha, double **beta, double **gamma ); /** * This function adds the element contribution to the global stiffness matrix * and also the element load to the right hand side vector * @param mesh - a pointer to the finite element mesh * @param BlockID - element block identifier * @param elemID - element identifier * @param elemConn - a list of node identifiers for this element * @param elemStiff - element stiffness matrix * @param elemLoad - right hand side (load) for this element * @param elemFormat - the format the unknowns are passed in **/ int HYPRE_FEMeshSumInElem( HYPRE_FEMesh mesh, int blockID, int elemID, int* elemConn, double** elemStiffness, double *elemLoad, int elemFormat ); /** * This function differs from the sumInElem function in that the right hand * load vector is not passed. * @param mesh - a pointer to the finite element mesh * @param blockID - element block identifier * @param elemID - element identifier * @param elemConn - a list of node identifiers for this element * @param elemStiff - element stiffness matrix * @param elemFormat - the format the unknowns are passed in **/ int HYPRE_FEMeshSumInElemMatrix( HYPRE_FEMesh mesh, int blockID, int elemID, int* elemConn, double** elemStiffness, int elemFormat ); /** * This function adds the element load to the right hand side vector * @param mesh - a pointer to the finite element mesh * @param blockID - element block identifier * @param elemID - element identifier * @param elemConn - a list of node identifiers for this element * @param elemLoad - right hand side (load) for this element **/ int HYPRE_FEMeshSumInElemRHS( HYPRE_FEMesh mesh, int blockID, int elemID, int* elemConn, double* elemLoad ); /** * This function signals to the FEI that the loading phase has * been completed. * @param mesh - a pointer to the finite element mesh **/ int HYPRE_FEMeshLoadComplete( HYPRE_FEMesh mesh ); /** * This function tells the FEI to solve the linear system * @param mesh - a pointer to the finite element mesh **/ int HYPRE_FEMeshSolve( HYPRE_FEMesh mesh ); /** * This function returns the node identifiers given the element block. * @param mesh - a pointer to the finite element mesh * @param blockID - element block identifier * @param numNodes - the number of nodes * @param nodeIDList - the node identifiers **/ int HYPRE_FEMeshGetBlockNodeIDList( HYPRE_FEMesh mesh, int blockID, int numNodes, int *nodeIDList ); /** * This function returns the nodal solutions given the element block number. * @param mesh - a pointer to the finite element mesh * @param blockID - element block identifier * @param numNodes - the number of nodes * @param nodeIDList - the node identifiers * @param solnOffsets - the equation number for each nodal solution * @param solnValues - the nodal solution values **/ int HYPRE_FEMeshGetBlockNodeSolution( HYPRE_FEMesh mesh, int blockID, int numNodes, int *nodeIDList, int *solnOffsets, double *solnValues ); /*@}*/ /** * @name HYPRE FEI Matrix functions **/ /*@{*/ /*-------------------------------------------------------------------------- * HYPRE_fei_matrix.cxx *--------------------------------------------------------------------------*/ /** * Finite element matrix constructor * @param comm - an MPI communicator * @param mesh - a pointer to the finite element mesh * @param matrix - upon return, contains a pointer to the FE matrix **/ int HYPRE_FEMatrixCreate( MPI_Comm comm, HYPRE_FEMesh mesh, HYPRE_FEMatrix *matrix ); /** * Finite element matrix destructor * @param matrix - a pointer to the FE matrix **/ int HYPRE_FEMatrixDestroy( HYPRE_FEMatrix matrix ); /** * This function gets the underlying HYPRE parcsr matrix from the FE mesh * @param matrix - a pointer to the FE matrix * @param object - a pointer to the HYPRE parcsr matrix **/ int HYPRE_FEMatrixGetObject( HYPRE_FEMatrix matrix, void **object ); /*@}*/ /** * @name HYPRE FEI Vector functions **/ /*@{*/ /*-------------------------------------------------------------------------- * HYPRE_fei_vector.cxx *--------------------------------------------------------------------------*/ /** * Finite element vector constructor * @param comm - an MPI communicator * @param mesh - a pointer to the finite element mesh * @param vector - upon return, contains a pointer to the FE vector **/ int HYPRE_FEVectorCreate( MPI_Comm comm , HYPRE_FEMesh mesh, HYPRE_FEVector *vector); /** * Finite element vector destructor * @param vector - a pointer to the FE vector **/ int HYPRE_FEVectorDestroy( HYPRE_FEVector vector ); /** * This function gets the underlying RHS vector from the FE mesh * @param vector - a pointer to the FE vector * @param object - upon return, points to the RHS vector **/ int HYPRE_FEVectorGetRHS( HYPRE_FEVector vector, void **object ); /** * This function gives the solution vector to the FE mesh * @param vector - a pointer to the FE vector * @param object - points to the solution vector **/ int HYPRE_FEVectorSetSol( HYPRE_FEVector vector, void *object ); /*@}*/ /** * @name Solver parameters **/ /*@{*/ /** * Here the various options for solvers and preconditioners * are defined. * *\begin{description} *\item[solver xxx] where xxx specifies one of {\sf cg}, {\sf gmres}, * {\sf fgmres}, {\sf bicgs}, {\sf bicgstab}, {\sf tfqmr}, * {\sf symqmr}, {\sf superlu}, or {\sf superlux}. The * default is {\sf gmres}. * The solver type can be followed by {\sf override} to * specify its priority when multiple solvers are declared * at random order. *\item[preconditioner xxx] where xxx is one of {\sf diagonal}, {\sf pilut}, * {\sf euclid}, {\sf parasails}, {\sf boomeramg}, {\sf poly}, or * {\sf mli}. The default is {\sf diagonal}. Another option for * xxx is {\sf reuse} which allows the preconditioner to be reused * (this should only be set after a preconditioner has been set * up already). * The preconditioner type can be followed by {\sf override} to * specify its priority when multiple preconditioners are declared * at random order. *\item[maxIterations xxx] where xxx is an integer specifying the maximum * number of iterations permitted for the iterative solvers. * The default value is 1000. *\item[tolerance xxx] where xxx is a floating point number specifying the * termination criterion for the iterative solvers. The default * value is 1.0E-6. *\item[gmresDim xxx] where xxx is an integer specifying the value of m in * restarted GMRES(m). The default value is 100. *\item[stopCrit xxx] where xxx is one of {\sf absolute} or {\sf relative} * stopping criterion. *\item[superluOrdering xxx] - where xxx specifies one of {\sf natural} or * {\sf mmd} (minimum degree ordering). This ordering * is used to minimize the number of nonzeros generated * in the LU decomposition. The default is natural ordering. *\item[superluScale xxx] where xxx specifies one of {\sf y} (perform row * and column scalings before decomposition) or {\sf n}. * The default is no scaling. *\end{description} **/ Preconditioners and Solvers /** * Parameter options for the algebraic multigrid preconditioner BoomerAMG. * *\begin{description} *\item[amgMaxLevels xxx] where xxx is an integer specifying the maximum * number of levels to be used for the grid hierarchy. *\item[amgCoarsenType xxx] where xxx specifies one of {\sf falgout} or * {\sf ruge}, or {\sf default (CLJP)} coarsening for BOOMERAMG. *\item[amgMeasureType xxx] where xxx specifies one of {\sf local} or * or {\sf global}. This parameter affects how coarsening is * performed in parallel. *\item[amgRelaxType xxx] where xxx is one of {\sf jacobi} (Damped Jacobi), * {\sf gs-slow} (sequential Gauss-Seidel), {\sf gs-fast} * (Gauss-Seidel on interior nodes), or {\sf hybrid}. * The default is {\sf hybrid}. *\item[amgNumSweeps xxx] where xxx is an integer specifying the number of * pre- and post-smoothing at each level of BOOMERAMG. * The default is two pre- and two post-smoothings. *\item[amgRelaxWeight xxx] where xxx is a floating point number between * 0 and 1 specifying the damping factor for BOOMERAMG's damped * Jacobi and GS smoothers. The default value is 1.0. *\item[amgRelaxOmega xxx] where xxx is a floating point number between * 0 and 1 specifying the damping factor for BOOMERAMG's hybrid * smoother for multiple processors. The default value is 1.0. *\item[amgStrongThreshold xxx] where xxx is a floating point number between 0 * and 1 specifying the threshold used to determine * strong coupling in BOOMERAMG's coasening. The default * value is 0.25. *\item[amgSystemSize xxx] where xxx is the degree of freedom per node. *\item[amgMaxLevels xxx] where xxx is an integer specifying the maximum * number of iterations to be used during the solve phase. *\item[amgUseGSMG] - tells BOOMERAMG to use a different coarsening called * GSMG. *\item[amgGSMGNumSamples] where xxx is the number of samples to generate * to determine how to coarsen for GSMG. *\end{description} **/ BoomerAMG /** * Parameter options for the smoothed aggregation preconditioner MLI. * *\begin{description} *\item[outputLevel xxx] where xxx is the output level for diagnostics. *\item[method xxx] where xxx is either {\sf AMGSA} (default), {\sf AMGSAe}, * to indicate which MLI algorithm is to be used. *\item[numLevels xxx] where xxx is the maximum number of levels (default=30) * used. *\item[maxIterations xxx] where xxx is the maximum number of iterations * (default = 1 as preconditioner). *\item[cycleType xxx] where xxx is either 'V' or 'W' cycle (default = 'V'). *\item[strengthThreshold xxx] strength threshold for coarsening (default = 0). *\item[smoother xxx] where xxx is either {\sf Jacobi}, {\sf BJacobi}, {\sf GS}, * {\sf SGS}, {\sf HSGS} (SSOR,default), {\sf BSGS}, {\sf ParaSails}, * {\sf MLS}, {\sf CGJacobi}, {\sf CGBJacobi}, or {\sf Chebyshev}. *\item[numSweeps xxx] where xxx is the number of smoother sweeps (default = 2). *\item[coarseSolver xxx] where xxx is one of those in 'smoother' or * {\sf SuperLU} (default). *\item[minCoarseSize xxx] where xxx is the minimum coarse grid size to * control the number of levels used (default = 3000). *\item[Pweight xxx] where xxx is the relaxation parameter for the prolongation * smoother (default 0.0). *\item[nodeDOF xxx] where xxx is the degree of freedom for each node * (default = 1). *\item[nullSpaceDim xxx] where xxx is the dimension of the null space for * the coarse grid (default = 1). *\item[useNodalCoord xxx] where xxx is either 'on' or 'off' (default) * to indicate whether the nodal coordinates are used to generate the * initial null space. *\item[saAMGCalibrationSize xxx] where xxx is the additional null space * vectors to be generated via calibration (default = 0). *\item[numSmoothVecs xxx] where xxx is the number of near null space * vectors used to create the prolongation operator (default = 0). *\item[smoothVecSteps xxx] where xxx is the number of smoothing steps * used to generate the smooth vectors (default = 0). *\end{description} * *In addition, to use 'AMGSAe', the parameter 'haveSFEI' has to be sent into *the FEI using the parameters function (this option is valid only for the *Sandia FEI implementation). **/ MLI /** * Parameter options for ILUT, ParaSails and polynomial preconditioners * are defined. * *\begin{description} *\item[euclidNlevels xxx] where xxx is an non-negative integer specifying * the desired sparsity of the incomplete factors. The * default value is 0. *\item[euclidThreshold xxx] where xxx is a floating point number specifying * the threshold used to sparsify the incomplete factors. The default * value is 0.0. *\item[parasailsThreshold xxx] where xxx is a floating point number between 0 * and 1 specifying the threshold used to prune small entries * in setting up the sparse approximate inverse. The default * value is 0.0. *\item[parasailsNlevels xxx] where xxx is an integer larger than 0 specifying * the desired sparsity of the approximate inverse. The * default value is 1. *\item[parasailsFilter xxx] where xxx is a floating point number between 0 * and 1 specifying the threshold used to prune small entries * in $A$. The default value is 0.0. *\item[parasailsLoadbal xxx] where xxx is a floating point number between 0 * and 1 specifying how load balancing has to be done * (Edmond, explain please). The default value is 0.0. *\item[parasailsSymmetric] sets Parasails to take $A$ as symmetric. *\item[parasailsUnSymmetric] sets Parasails to take $A$ as nonsymmetric * (default). *\item[parasailsReuse] sets Parasails to reuse the sparsity pattern of $A$. *\item[polyorder xxx] where xxx is the order of the least-squares polynomial * preconditioner. *\end{description} **/ Various /** * Parameters which define different reduction modes. * *\begin{description} *\item[schurReduction] turns on the Schur reduction mode. *\item[slideReduction] turns on the slide reduction mode. *\item[slideReduction2] turns on the slide reduction mode version 2 *(see section 2). *\item[slideReduction3] turns on the slide reduction mode version 3 *(see section 2). *\end{description} **/ Matrix Reduction /** * Parameters control diagnostic information, memory use, etc. * *\begin{description} *\item[outputLevel xxx] where xxx is an integer specifying the output * level. An output level of $1$ prints only the solver * information such as number of iterations and timings. * An output level of $2$ prints debug information such as * the functions visited and preconditioner information. * An output level of $3$ or higher prints more debug information * such as the matrix and right hand side loaded via the * LinearSystemCore functions to the standard output. *\item[setDebug xxx] where xxx is one of {\sf slideReduction1}, * {\sf slideReduction2}, * {\sf slideReduction3} (level 1,2,3 diagnostics in the slide surface * reduction code), {\sf printMat} (print the original matrix * into a file), {\sf printReducedMat} (print the reduced matrix * into a file), {\sf printSol} (print the solution into a file), * {\sf ddilut} (output diagnostic information for DDIlut * preconditioner setup), and {\sf amgDebug} (output diagnostic * information for AMG). *\item[optimizeMemory] cleans up the matrix sparsity pattern after the matrix * has been loaded. (It has been kept to allow matrix reuse.) *\item[imposeNoBC] turns off the boundary condition to allow diagnosing the * matrix (for example, checking the null space.) *\end{description} **/ Performance Tuning and Diagnostics /** * Parameters that are helpful for finite element information. * *\begin{description} *\item[AConjugateProjection xxx] where xxx specifies the number of previous * solution vectors to keep for the A-conjugate projection. * The default is 0 (the projection is off). *\item[minResProjection xxx] where xxx specifies the number of previous * solution vectors to keep for projection. * The default is 0 (the projection is off). *\item[haveFEData] indicates that additional finite element information are * available to assist in building more efficient solvers. *\item[haveSFEI] indicates that the simplified finite element information are * available to assist in building more efficient solvers. *\end{description} **/ Miscellaneous /*@}*/ /*@}*/ #ifdef __cplusplus } #endif #endif hypre-2.33.0/src/FEI_mv/fei-hypre/HYPRE_FEI.h000066400000000000000000000352221477326011500202470ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #ifndef __HYPRE_FEI__ #define __HYPRE_FEI__ #include "HYPRE.h" #include "IJ_mv/HYPRE_IJ_mv.h" #include "parcsr_mv/HYPRE_parcsr_mv.h" #include "parcsr_mv/_hypre_parcsr_mv.h" #include "parcsr_ls/_hypre_parcsr_ls.h" #include "parcsr_ls/HYPRE_parcsr_ls.h" #ifdef __cplusplus extern "C" { #endif #include "HYPRE_MHMatrix.h" typedef struct HYPRE_LSI_DDIlut_Struct { MPI_Comm comm; MH_Matrix *mh_mat; double thresh; double fillin; int overlap; int Nrows; int extNrows; int *mat_ia; int *mat_ja; double *mat_aa; int outputLevel; int reorder; int *order_array; int *reorder_array; } HYPRE_LSI_DDIlut; /* HYPRE_LSI_ddict.c */ int HYPRE_LSI_DDICTCreate( MPI_Comm comm, HYPRE_Solver *solver ); int HYPRE_LSI_DDICTDestroy( HYPRE_Solver solver ); int HYPRE_LSI_DDICTSetFillin( HYPRE_Solver solver, double fillin); int HYPRE_LSI_DDICTSetOutputLevel( HYPRE_Solver solver, int level); int HYPRE_LSI_DDICTSetDropTolerance( HYPRE_Solver solver, double thresh); int HYPRE_LSI_DDICTSolve( HYPRE_Solver solver, HYPRE_ParCSRMatrix A, HYPRE_ParVector b, HYPRE_ParVector x ); int HYPRE_LSI_DDICTSetup( HYPRE_Solver solver, HYPRE_ParCSRMatrix A, HYPRE_ParVector b, HYPRE_ParVector x ); /* HYPRE_LSI_ddilut.c */ int HYPRE_LSI_DDIlutCreate( MPI_Comm comm, HYPRE_Solver *solver ); int HYPRE_LSI_DDIlutDestroy( HYPRE_Solver solver ); int HYPRE_LSI_DDIlutSetFillin( HYPRE_Solver solver, double fillin); int HYPRE_LSI_DDIlutSetDropTolerance( HYPRE_Solver solver, double thresh); int HYPRE_LSI_DDIlutSetOverlap( HYPRE_Solver solver ); int HYPRE_LSI_DDIlutSetReorder( HYPRE_Solver solver ); int HYPRE_LSI_DDIlutSetOutputLevel( HYPRE_Solver solver, int level); int HYPRE_LSI_DDIlutSolve( HYPRE_Solver solver, HYPRE_ParCSRMatrix A, HYPRE_ParVector b, HYPRE_ParVector x ); int HYPRE_LSI_DDIlutSetup( HYPRE_Solver solver, HYPRE_ParCSRMatrix A, HYPRE_ParVector b, HYPRE_ParVector x ); int HYPRE_LSI_DDIlutGetRowLengths(MH_Matrix *Amat, int *leng, int **recv_leng, MPI_Comm mpi_comm); int HYPRE_LSI_DDIlutGetOffProcRows(MH_Matrix *Amat, int leng, int *recv_leng, int Noffset, int *map, int *map2, int **int_buf, double **dble_buf, MPI_Comm mpi_comm); int HYPRE_LSI_DDIlutComposeOverlappedMatrix(MH_Matrix *mh_mat, int *total_recv_leng, int **recv_lengths, int **int_buf, double **dble_buf, int **sindex_array, int **sindex_array2, int *offset, MPI_Comm mpi_comm); int HYPRE_LSI_DDIlutDecompose(HYPRE_LSI_DDIlut *ilut_ptr,MH_Matrix *Amat, int total_recv_leng, int *recv_lengths, int *ext_ja, double *ext_aa, int *map, int *map2, int Noffset); int HYPRE_LSI_DDIlutDecompose2(HYPRE_LSI_DDIlut *ilut_ptr,MH_Matrix *Amat, int total_recv_leng, int *recv_lengths, int *ext_ja, double *ext_aa, int *map, int *map2, int Noffset); int HYPRE_LSI_DDIlutDecomposeNew(HYPRE_LSI_DDIlut *ilut_ptr,MH_Matrix *Amat, int total_recv_leng, int *recv_lengths, int *ext_ja, double *ext_aa, int *map, int *map2, int Noffset); /* hypre_lsi_misc.c */ void HYPRE_LSI_Get_IJAMatrixFromFile(double **val, int **ia, int **ja, int *N, double **rhs, char *matfile, char *rhsfile); int HYPRE_LSI_Search(int *list,int value,int list_length); int HYPRE_LSI_Search2(int key, int nlist, int *list); int HYPRE_LSI_GetParCSRMatrix(HYPRE_IJMatrix Amat, int nrows, int nnz, int *ia_ptr, int *ja_ptr, double *a_ptr) ; void HYPRE_LSI_qsort1a( int *ilist, int *ilist2, int left, int right); int HYPRE_LSI_SplitDSort2(double *dlist, int nlist, int *ilist, int limit); int HYPRE_LSI_SplitDSort(double *dlist, int nlist, int *ilist, int limit); int HYPRE_LSI_SolveIdentity(HYPRE_Solver solver, HYPRE_ParCSRMatrix Amat, HYPRE_ParVector b, HYPRE_ParVector x); int HYPRE_LSI_Cuthill(int n, int *ia, int *ja, double *aa, int *order_array, int *reorder_array); int HYPRE_LSI_MatrixInverse( double **Amat, int ndim, double ***Cmat ); int HYPRE_LSI_PartitionMatrix( int nRows, int startRow, int *rowLengths, int **colIndices, double **colValues, int *nLabels, int **labels); /* HYPRE_LSI_poly.c */ int HYPRE_LSI_PolyCreate( MPI_Comm comm, HYPRE_Solver *solver ); int HYPRE_LSI_PolyDestroy( HYPRE_Solver solver ); int HYPRE_LSI_PolySetOrder( HYPRE_Solver solver, int order); int HYPRE_LSI_PolySetOutputLevel( HYPRE_Solver solver, int level); int HYPRE_LSI_PolySolve( HYPRE_Solver solver, HYPRE_ParCSRMatrix A, HYPRE_ParVector b, HYPRE_ParVector x ); int HYPRE_LSI_PolySetup( HYPRE_Solver solver, HYPRE_ParCSRMatrix A, HYPRE_ParVector b, HYPRE_ParVector x ); /* HYPRE_LSI_schwarz.c */ int HYPRE_LSI_SchwarzCreate( MPI_Comm comm, HYPRE_Solver *solver ); int HYPRE_LSI_SchwarzDestroy( HYPRE_Solver solver ); int HYPRE_LSI_SchwarzSetBlockSize( HYPRE_Solver solver, int blksize); int HYPRE_LSI_SchwarzSetNBlocks( HYPRE_Solver solver, int nblks); int HYPRE_LSI_SchwarzSetILUTFillin( HYPRE_Solver solver, double fillin); int HYPRE_LSI_SchwarzSetOutputLevel( HYPRE_Solver solver, int level); int HYPRE_LSI_SchwarzSolve( HYPRE_Solver solver, HYPRE_ParCSRMatrix A, HYPRE_ParVector b, HYPRE_ParVector x ); int HYPRE_LSI_SchwarzSetup( HYPRE_Solver solver, HYPRE_ParCSRMatrix A, HYPRE_ParVector b, HYPRE_ParVector x ); /* HYPRE_parcsr_bicgs.c */ int HYPRE_ParCSRBiCGSCreate( MPI_Comm comm, HYPRE_Solver *solver ); int HYPRE_ParCSRBiCGSDestroy( HYPRE_Solver solver ); int HYPRE_ParCSRBiCGSSetup(HYPRE_Solver solver,HYPRE_ParCSRMatrix A, HYPRE_ParVector b, HYPRE_ParVector x ); int HYPRE_ParCSRBiCGSSolve(HYPRE_Solver solver,HYPRE_ParCSRMatrix A, HYPRE_ParVector b, HYPRE_ParVector x ); int HYPRE_ParCSRBiCGSSetTol( HYPRE_Solver solver, double tol ); int HYPRE_ParCSRBiCGSSetMaxIter( HYPRE_Solver solver, int max_iter ); int HYPRE_ParCSRBiCGSSetStopCrit( HYPRE_Solver solver, int stop_crit ); int HYPRE_ParCSRBiCGSSetPrecond( HYPRE_Solver solver, int (*precond) (HYPRE_Solver sol, HYPRE_ParCSRMatrix matrix, HYPRE_ParVector b, HYPRE_ParVector x), int (*precond_setup)(HYPRE_Solver sol, HYPRE_ParCSRMatrix matrix, HYPRE_ParVector b, HYPRE_ParVector x), void *precond_data ); int HYPRE_ParCSRBiCGSSetLogging( HYPRE_Solver solver, int logging); int HYPRE_ParCSRBiCGSGetNumIterations(HYPRE_Solver solver, int *num_iterations); int HYPRE_ParCSRBiCGSGetFinalRelativeResidualNorm(HYPRE_Solver solver, double *norm ); /* HYPRE_parcsr_bicgs.c */ int HYPRE_ParCSRBiCGSTABLCreate( MPI_Comm comm, HYPRE_Solver *solver ); int HYPRE_ParCSRBiCGSTABLDestroy( HYPRE_Solver solver ); int HYPRE_ParCSRBiCGSTABLSetup(HYPRE_Solver solver,HYPRE_ParCSRMatrix A, HYPRE_ParVector b, HYPRE_ParVector x ); int HYPRE_ParCSRBiCGSTABLSolve(HYPRE_Solver solver,HYPRE_ParCSRMatrix A, HYPRE_ParVector b, HYPRE_ParVector x ); int HYPRE_ParCSRBiCGSTABLSetTol( HYPRE_Solver solver, double tol ); int HYPRE_ParCSRBiCGSTABLSetSize( HYPRE_Solver solver, int size ); int HYPRE_ParCSRBiCGSTABLSetMaxIter( HYPRE_Solver solver, int max_iter ); int HYPRE_ParCSRBiCGSTABLSetStopCrit( HYPRE_Solver solver, int stop_crit ); int HYPRE_ParCSRBiCGSTABLSetPrecond( HYPRE_Solver solver, int (*precond) (HYPRE_Solver sol, HYPRE_ParCSRMatrix matrix, HYPRE_ParVector b, HYPRE_ParVector x), int (*precond_setup)(HYPRE_Solver sol, HYPRE_ParCSRMatrix matrix, HYPRE_ParVector b, HYPRE_ParVector x), void *precond_data ); int HYPRE_ParCSRBiCGSTABLSetLogging( HYPRE_Solver solver, int logging); int HYPRE_ParCSRBiCGSTABLGetNumIterations(HYPRE_Solver solver, int *num_iterations); int HYPRE_ParCSRBiCGSTABLGetFinalRelativeResidualNorm(HYPRE_Solver solver, double *norm ); /* HYPRE_parcsr_fgmres.h */ int HYPRE_ParCSRFGMRESCreate( MPI_Comm comm, HYPRE_Solver *solver ); int HYPRE_ParCSRFGMRESDestroy( HYPRE_Solver solver ); int HYPRE_ParCSRFGMRESSetup(HYPRE_Solver solver,HYPRE_ParCSRMatrix A, HYPRE_ParVector b, HYPRE_ParVector x ); int HYPRE_ParCSRFGMRESSolve(HYPRE_Solver solver,HYPRE_ParCSRMatrix A, HYPRE_ParVector b, HYPRE_ParVector x ); int HYPRE_ParCSRFGMRESSetKDim(HYPRE_Solver solver, int kdim); int HYPRE_ParCSRFGMRESSetTol(HYPRE_Solver solver, double tol); int HYPRE_ParCSRFGMRESSetMaxIter(HYPRE_Solver solver, int max_iter); int HYPRE_ParCSRFGMRESSetStopCrit(HYPRE_Solver solver, int stop_crit); int HYPRE_ParCSRFGMRESSetPrecond(HYPRE_Solver solver, int (*precond)(HYPRE_Solver sol, HYPRE_ParCSRMatrix matrix, HYPRE_ParVector b, HYPRE_ParVector x), int (*precond_setup)(HYPRE_Solver sol, HYPRE_ParCSRMatrix matrix, HYPRE_ParVector b, HYPRE_ParVector x), void *precond_data); int HYPRE_ParCSRFGMRESSetLogging(HYPRE_Solver solver, int logging); int HYPRE_ParCSRFGMRESGetNumIterations(HYPRE_Solver solver, int *num_iterations); int HYPRE_ParCSRFGMRESGetFinalRelativeResidualNorm(HYPRE_Solver solver, double *norm ); int HYPRE_ParCSRFGMRESUpdatePrecondTolerance(HYPRE_Solver solver, int (*set_tolerance)(HYPRE_Solver sol, double)); /* HYPRE_parcsr_lsicg.c */ int HYPRE_ParCSRLSICGCreate(MPI_Comm comm, HYPRE_Solver *solver); int HYPRE_ParCSRLSICGDestroy(HYPRE_Solver solver); int HYPRE_ParCSRLSICGSetup(HYPRE_Solver solver,HYPRE_ParCSRMatrix A, HYPRE_ParVector b, HYPRE_ParVector x ); int HYPRE_ParCSRLSICGSolve(HYPRE_Solver solver,HYPRE_ParCSRMatrix A, HYPRE_ParVector b, HYPRE_ParVector x ); int HYPRE_ParCSRLSICGSetTol(HYPRE_Solver solver, double tol); int HYPRE_ParCSRLSICGSetMaxIter(HYPRE_Solver solver, int max_iter); int HYPRE_ParCSRLSICGSetStopCrit(HYPRE_Solver solver, int stop_crit); int HYPRE_ParCSRLSICGSetPrecond(HYPRE_Solver solver, int (*precond) (HYPRE_Solver sol, HYPRE_ParCSRMatrix matrix, HYPRE_ParVector b, HYPRE_ParVector x), int (*precond_setup)(HYPRE_Solver sol, HYPRE_ParCSRMatrix matrix, HYPRE_ParVector b, HYPRE_ParVector x), void *precond_data ); int HYPRE_ParCSRLSICGSetLogging(HYPRE_Solver solver, int logging); int HYPRE_ParCSRLSICGGetNumIterations(HYPRE_Solver solver, int *num_iterations); int HYPRE_ParCSRLSICGGetFinalRelativeResidualNorm(HYPRE_Solver solver, double *norm ); /* HYPRE_parcsr_maxwell.c */ int HYPRE_ParCSRCotreeCreate(MPI_Comm comm, HYPRE_Solver *solver); int HYPRE_ParCSRCotreeDestroy(HYPRE_Solver solver); int HYPRE_ParCSRCotreeSetup(HYPRE_Solver solver, HYPRE_ParCSRMatrix A, HYPRE_ParVector b, HYPRE_ParVector x); int HYPRE_ParCSRCotreeSolve(HYPRE_Solver solver, HYPRE_ParCSRMatrix A, HYPRE_ParVector b, HYPRE_ParVector x); int HYPRE_ParCSRCotreeSetTol(HYPRE_Solver solver, double tol); int HYPRE_ParCSRCotreeSetMaxIter(HYPRE_Solver solver, int max_iter); /* HYPRE_parcsr_superlu.c */ int HYPRE_ParCSR_SuperLUCreate(MPI_Comm comm, HYPRE_Solver *solver); int HYPRE_ParCSR_SuperLUDestroy(HYPRE_Solver solver); int HYPRE_ParCSR_SuperLUSetOutputLevel(HYPRE_Solver solver, int); int HYPRE_ParCSR_SuperLUSetup(HYPRE_Solver solver,HYPRE_ParCSRMatrix A, HYPRE_ParVector b,HYPRE_ParVector x); int HYPRE_ParCSR_SuperLUSolve(HYPRE_Solver solver,HYPRE_ParCSRMatrix A, HYPRE_ParVector b, HYPRE_ParVector x); /* HYPRE_parcsr_symqmr.c */ int HYPRE_ParCSRSymQMRCreate( MPI_Comm comm, HYPRE_Solver *solver ); int HYPRE_ParCSRSymQMRDestroy( HYPRE_Solver solver ); int HYPRE_ParCSRSymQMRSetup(HYPRE_Solver solver,HYPRE_ParCSRMatrix A, HYPRE_ParVector b, HYPRE_ParVector x ); int HYPRE_ParCSRSymQMRSolve(HYPRE_Solver solver,HYPRE_ParCSRMatrix A, HYPRE_ParVector b, HYPRE_ParVector x ); int HYPRE_ParCSRSymQMRSetTol( HYPRE_Solver solver, double tol ); int HYPRE_ParCSRSymQMRSetMaxIter( HYPRE_Solver solver, int max_iter ); int HYPRE_ParCSRSymQMRSetStopCrit( HYPRE_Solver solver, int stop_crit ); int HYPRE_ParCSRSymQMRSetPrecond( HYPRE_Solver solver, int (*precond) (HYPRE_Solver sol, HYPRE_ParCSRMatrix matrix, HYPRE_ParVector b, HYPRE_ParVector x), int (*precond_setup)(HYPRE_Solver sol, HYPRE_ParCSRMatrix matrix, HYPRE_ParVector b, HYPRE_ParVector x), void *precond_data ); int HYPRE_ParCSRSymQMRSetLogging( HYPRE_Solver solver, int logging); int HYPRE_ParCSRSymQMRGetNumIterations(HYPRE_Solver solver, int *num_iterations); int HYPRE_ParCSRSymQMRGetFinalRelativeResidualNorm(HYPRE_Solver solver, double *norm ); /* HYPRE_parcsr_TFQmr.c */ int HYPRE_ParCSRTFQmrCreate( MPI_Comm comm, HYPRE_Solver *solver ); int HYPRE_ParCSRTFQmrDestroy( HYPRE_Solver solver ); int HYPRE_ParCSRTFQmrSetup(HYPRE_Solver solver,HYPRE_ParCSRMatrix A, HYPRE_ParVector b, HYPRE_ParVector x ); int HYPRE_ParCSRTFQmrSolve(HYPRE_Solver solver,HYPRE_ParCSRMatrix A, HYPRE_ParVector b, HYPRE_ParVector x ); int HYPRE_ParCSRTFQmrSetTol( HYPRE_Solver solver, double tol ); int HYPRE_ParCSRTFQmrSetMaxIter( HYPRE_Solver solver, int max_iter ); int HYPRE_ParCSRTFQmrSetStopCrit( HYPRE_Solver solver, int stop_crit ); int HYPRE_ParCSRTFQmrSetPrecond( HYPRE_Solver solver, int (*precond) (HYPRE_Solver sol, HYPRE_ParCSRMatrix matrix, HYPRE_ParVector b, HYPRE_ParVector x), int (*precond_setup)(HYPRE_Solver sol, HYPRE_ParCSRMatrix matrix, HYPRE_ParVector b, HYPRE_ParVector x), void *precond_data ); int HYPRE_ParCSRTFQmrSetLogging( HYPRE_Solver solver, int logging); int HYPRE_ParCSRTFQmrGetNumIterations(HYPRE_Solver solver, int *num_iterations); int HYPRE_ParCSRTFQmrGetFinalRelativeResidualNorm(HYPRE_Solver solver, double *norm ); #ifdef __cplusplus } #endif #endif hypre-2.33.0/src/FEI_mv/fei-hypre/HYPRE_FEI_includes.h000066400000000000000000000037601477326011500221370ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ // ************************************************************************* // Different definitions for FEI and NOFEI options // ************************************************************************* #ifndef __HYPRE_FEI_INCLUDES__ #define __HYPRE_FEI_INCLUDES__ #ifndef NOFEI #ifdef FEI2_1 #include "fei_defs.h" #include "base/Data.h" #include "base/Lookup.h" #include "base/LinearSystemCore.h" #else //New FEI 2.23.02 #include "fei_defs.h" #include "fei_Data.hpp" #include "fei_Lookup.hpp" #include "fei_LinearSystemCore.hpp" #endif #else #define GlobalID int class Lookup { public: Lookup() {} ~Lookup() {} int getNumFields() {return -1;} int getFieldSize(int) {return -1;} int* getFieldIDsPtr() {return NULL;} int* getFieldSizesPtr() {return NULL;} int getNumElemBlocks() {return -1;} int* getElemBlockIDs() {return NULL;} void getElemBlockInfo(int,int&,int&,int&,int&,int&,int&){return;} int *getNumFieldsPerNode(int) {return NULL;} int**getFieldIDsTable(int) {return NULL;} int getEqnNumber(int, int) {return -1;} int getAssociatedNodeNumber(int) {return -1;} int getAssociatedFieldID(int) {return -1;} int isInLocalElement(int) {return -1;} int getNumSubdomains(int) {return -1;} int *getSubdomainList(int) {return NULL;} int getNumSharedNodes() {return -1;} int *getSharedNodeNumbers() {return NULL;} int *getSharedNodeProcs(int) {return NULL;} int getNumSharingProcs(int) {return -1;} int isExactlyBlkEqn(int) {return -1;} int ptEqnToBlkEqn(int) {return -1;} int getOffsetIntoBlkEqn(int, int) {return -1;} int getBlkEqnSize(int) {return -1;} }; #endif #endif hypre-2.33.0/src/FEI_mv/fei-hypre/HYPRE_LSC_aux.cxx000066400000000000000000007503071477326011500215250ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ //*************************************************************************** // This file holds the other functions for HYPRE_LinSysCore //*************************************************************************** //*************************************************************************** // include files //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- // system include files //--------------------------------------------------------------------------- #include #include #include #include #if 0 /* RDF: Not sure this is really needed */ #ifdef WIN32 #define strcmp _stricmp #endif #endif //#define HAVE_SYSPDE //--------------------------------------------------------------------------- // HYPRE include files //--------------------------------------------------------------------------- #include "HYPRE.h" #include "utilities/_hypre_utilities.h" #include "IJ_mv/HYPRE_IJ_mv.h" #include "parcsr_mv/HYPRE_parcsr_mv.h" #include "parcsr_mv/_hypre_parcsr_mv.h" #include "parcsr_ls/HYPRE_parcsr_ls.h" #include "HYPRE_parcsr_bicgstabl.h" #include "HYPRE_parcsr_lsicg.h" #include "HYPRE_parcsr_TFQmr.h" #include "HYPRE_parcsr_bicgs.h" #include "HYPRE_parcsr_symqmr.h" #include "HYPRE_parcsr_fgmres.h" #include "HYPRE_LinSysCore.h" #include "parcsr_mv/_hypre_parcsr_mv.h" #include "HYPRE_LSI_schwarz.h" #include "HYPRE_LSI_ddilut.h" #include "HYPRE_LSI_ddict.h" #include "HYPRE_LSI_poly.h" #include "HYPRE_LSI_block.h" #include "HYPRE_LSI_Uzawa_c.h" #include "HYPRE_LSI_Dsuperlu.h" #include "HYPRE_MLMaxwell.h" #include "HYPRE_FEI.h" //--------------------------------------------------------------------------- // SUPERLU include files //--------------------------------------------------------------------------- #ifdef HAVE_SUPERLU #include "slu_ddefs.h" #include "slu_util.h" #endif //--------------------------------------------------------------------------- // MLI include files //--------------------------------------------------------------------------- #ifdef HAVE_MLI #include "HYPRE_LSI_mli.h" #endif //*************************************************************************** // external functions needed here //--------------------------------------------------------------------------- extern "C" { /*-------------------------------------------------------------------------* * ML functions *-------------------------------------------------------------------------*/ #ifdef HAVE_ML int HYPRE_LSI_MLCreate( MPI_Comm, HYPRE_Solver *); int HYPRE_LSI_MLDestroy( HYPRE_Solver ); int HYPRE_LSI_MLSetup( HYPRE_Solver, HYPRE_ParCSRMatrix, HYPRE_ParVector, HYPRE_ParVector ); int HYPRE_LSI_MLSolve( HYPRE_Solver, HYPRE_ParCSRMatrix, HYPRE_ParVector, HYPRE_ParVector ); int HYPRE_LSI_MLSetStrongThreshold( HYPRE_Solver, double ); int HYPRE_LSI_MLSetNumPreSmoothings( HYPRE_Solver, int ); int HYPRE_LSI_MLSetNumPostSmoothings( HYPRE_Solver, int ); int HYPRE_LSI_MLSetPreSmoother( HYPRE_Solver, int ); int HYPRE_LSI_MLSetPostSmoother( HYPRE_Solver, int ); int HYPRE_LSI_MLSetDampingFactor( HYPRE_Solver, double ); int HYPRE_LSI_MLSetMethod( HYPRE_Solver, int ); int HYPRE_LSI_MLSetCoarsenScheme( HYPRE_Solver , int ); int HYPRE_LSI_MLSetCoarseSolver( HYPRE_Solver, int ); int HYPRE_LSI_MLSetNumPDEs( HYPRE_Solver, int ); #endif /*-------------------------------------------------------------------------* * MLMaxwell functions *-------------------------------------------------------------------------*/ #ifdef HAVE_MLMAXWELL int HYPRE_LSI_MLMaxwellCreate(MPI_Comm, HYPRE_Solver *); int HYPRE_LSI_MLMaxwellDestroy(HYPRE_Solver); int HYPRE_LSI_MLMaxwellSetup(HYPRE_Solver, HYPRE_ParCSRMatrix, HYPRE_ParVector, HYPRE_ParVector); int HYPRE_LSI_MLMaxwellSolve(HYPRE_Solver, HYPRE_ParCSRMatrix, HYPRE_ParVector, HYPRE_ParVector); int HYPRE_LSI_MLMaxwellSetGMatrix(HYPRE_Solver, HYPRE_ParCSRMatrix); int HYPRE_LSI_MLMaxwellSetANNMatrix(HYPRE_Solver, HYPRE_ParCSRMatrix); int HYPRE_LSI_MLMaxwellSetStrongThreshold(HYPRE_Solver, double); #endif /*-------------------------------------------------------------------------* * other functions *-------------------------------------------------------------------------*/ void hypre_qsort1(int *, double *, int, int); int HYPRE_DummyFunction(HYPRE_Solver, HYPRE_ParCSRMatrix, HYPRE_ParVector, HYPRE_ParVector) {return 0;} int HYPRE_LSI_Search(int*, int, int); int HYPRE_LSI_SolveIdentity(HYPRE_Solver, HYPRE_ParCSRMatrix, HYPRE_ParVector , HYPRE_ParVector); int HYPRE_LSI_GetParCSRMatrix(HYPRE_IJMatrix,int nrows,int nnz,int*, int*,double*); /*-------------------------------------------------------------------------* * Y12 functions (obsolete) *-------------------------------------------------------------------------*/ #ifdef Y12M void y12maf_(int*,int*,double*,int*,int*,int*,int*,double*, int*,int*, double*,int*,double*,int*); #endif } //*************************************************************************** // this function takes parameters for setting internal things like solver // and preconditioner choice, etc. //--------------------------------------------------------------------------- int HYPRE_LinSysCore::parameters(int numParams, char **params) { int i, k, nsweeps, rtype, olevel, reuse=0, precon_override=0; int solver_override=0, solver_index=-1, precon_index=-1; double weight, dtemp; char param[256], param1[256], param2[80], param3[80]; int recognized; if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 3 ) { printf("%4d : HYPRE_LSC::entering parameters function.\n",mypid_); if ( mypid_ == 0 ) { printf("%4d : HYPRE_LSC::parameters - numParams = %d\n", mypid_, numParams); for ( i = 0; i < numParams; i++ ) printf(" param %d = %s \n", i, params[i]); } } if ( numParams <= 0 ) return (0); //------------------------------------------------------------------- // process the solver and preconditioner selection first //------------------------------------------------------------------- for ( i = 0; i < numParams; i++ ) { sscanf(params[i],"%s", param1); strcpy(param3, "invalid"); if ( !strcmp(param1, "solver") && (!solver_override) ) { sscanf(params[i],"%s %s %s", param, param2, param3); solver_index = i; if (!strcmp(param3, "override")) solver_override = 1; } if ( !strcmp(param1, "preconditioner") && (!precon_override) ) { sscanf(params[i],"%s %s %s", param, param2, param3); if ( strcmp(param2, "reuse") ) { precon_index = i; if (!strcmp(param3, "override")) precon_override = 1; } } } //------------------------------------------------------------------- // select solver : cg, gmres, superlu, superlux, y12m //------------------------------------------------------------------- if ( solver_index >= 0 ) { sscanf(params[solver_index],"%s %s", param, HYSolverName_); selectSolver(HYSolverName_); if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 4 && mypid_ == 0 ) printf(" HYPRE_LSC::parameters solver = %s\n",HYSolverName_); } //------------------------------------------------------------------- // select preconditioner : diagonal, pilut, boomeramg, parasails //------------------------------------------------------------------- if ( precon_index >= 0 ) { sscanf(params[precon_index],"%s %s", param, param1); selectPreconditioner(param1); if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 4 && mypid_ == 0 ) printf(" HYPRE_LSC::parameters preconditioner = %s\n", param1); } //------------------------------------------------------------------- // parse all parameters //------------------------------------------------------------------- for ( i = 0; i < numParams; i++ ) { sscanf(params[i],"%s", param1); //---------------------------------------------------------------- // help menu //---------------------------------------------------------------- recognized = 1; if ( !strcmp(param1, "help") ) { printf("%4d : HYPRE_LinSysCore::parameters - available ones : \n", mypid_); printf(" - outputLevel \n"); printf(" - optimizeMemory \n"); printf(" - setDebug \n"); printf(" - haveFEData <0,1>\n"); printf(" - schurReduction\n"); printf(" - slideReduction, slideReduction2, slideReduction3\n"); printf(" - slideReductionMinNorm \n"); printf(" - matrixPartition\n"); printf(" - AConjugateProjection \n"); printf(" - minResProjection \n"); printf(" - solver \n"); printf(" - maxIterations \n"); printf(" - tolerance \n"); printf(" - gmresDim \n"); printf(" - stopCrit \n"); printf(" - pcgRecomputeResiudal\n"); printf(" - preconditioner \n"); printf(" - pilutFillin or pilutRowSize \n"); printf(" - pilutDropTol \n"); printf(" - ddilutFillin \n"); printf(" - ddilutDropTol (f*sparsity(A))\n"); printf(" - ddilutOverlap\n"); printf(" - ddilutReorder\n"); printf(" - ddictFillin \n"); printf(" - ddictDropTol (f*sparsity(A))\n"); printf(" - schwarzNBlocks \n"); printf(" - schwarzBlockSize \n"); printf(" - polyorder \n"); printf(" - superluOrdering \n"); printf(" - superluScale \n"); printf(" - amgMaxLevels \n"); printf(" - amgCoarsenType \n"); printf(" - amgMeasureType \n"); printf(" - amgRelaxType \n"); printf(" - amgNumSweeps \n"); printf(" - amgRelaxWeight \n"); printf(" - amgRelaxOmega \n"); printf(" - amgStrongThreshold \n"); printf(" - amgSystemSize \n"); printf(" - amgMaxIterations \n"); printf(" - amgSmoothType \n"); printf(" - amgSmoothNumLevels \n"); printf(" - amgSmoothNumSweeps \n"); printf(" - amgSchwarzRelaxWt \n"); printf(" - amgSchwarzVariant \n"); printf(" - amgSchwarzOverlap \n"); printf(" - amgSchwarzDomainType \n"); printf(" - amgUseGSMG\n"); printf(" - amgGSMGNumSamples\n"); printf(" - amgAggLevels \n"); printf(" - amgInterpType \n"); printf(" - amgPmax \n"); printf(" - parasailsThreshold \n"); printf(" - parasailsNlevels \n"); printf(" - parasailsFilter \n"); printf(" - parasailsLoadbal \n"); printf(" - parasailsSymmetric\n"); printf(" - parasailsUnSymmetric\n"); printf(" - parasailsReuse <0,1>\n"); printf(" - euclidNlevels \n"); printf(" - euclidThreshold \n"); printf(" - blockP help (to get blockP options) \n"); printf(" - amsNumPDEs \n"); printf(" - MLI help (to get MLI options) \n"); printf(" - syspdeNVars \n"); #ifdef HAVE_ML printf(" - mlNumSweeps \n"); printf(" - mlRelaxType \n"); printf(" - mlRelaxWeight \n"); printf(" - mlStrongThreshold \n"); printf(" - mlMethod \n"); printf(" - mlCoarseSolver \n"); printf(" - mlCoarsenScheme \n"); printf(" - mlNumPDEs \n"); #endif } //---------------------------------------------------------------- // output level //---------------------------------------------------------------- else if ( !strcmp(param1, "outputLevel") ) { sscanf(params[i],"%s %d", param, &olevel); if ( olevel < 0 ) olevel = 0; if ( olevel > 7 ) olevel = 7; HYOutputLevel_ = ( HYOutputLevel_ & HYFEI_HIGHMASK ) + olevel; if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 3 && mypid_ == 0 ) printf(" HYPRE_LSC::parameters outputLevel = %d\n", HYOutputLevel_); } //---------------------------------------------------------------- // turn on memory optimizer //---------------------------------------------------------------- else if ( !strcmp(param1, "optimizeMemory") ) { memOptimizerFlag_ = 1; if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 3 && mypid_ == 0 ) printf(" HYPRE_LSC::parameters optimizeMemory on\n"); } //---------------------------------------------------------------- // put no boundary condition on the matrix (for diagnostics only) //---------------------------------------------------------------- else if ( !strcmp(param1, "imposeNoBC") ) { HYOutputLevel_ |= HYFEI_IMPOSENOBC; if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 3 && mypid_ == 0 ) printf(" HYPRE_LSC::parameters imposeNoBC on\n"); } //---------------------------------------------------------------- // turn on multiple right hand side //---------------------------------------------------------------- else if ( !strcmp(param1, "mRHS") ) { mRHSFlag_ = 1; if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 3 && mypid_ == 0 ) printf(" HYPRE_LSC::parameters multiple rhs on\n"); } //---------------------------------------------------------------- // set matrix trunction threshold //---------------------------------------------------------------- else if ( !strcmp(param1, "setTruncationThreshold") ) { sscanf(params[i],"%s %lg", param, &truncThresh_); if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 3 && mypid_ == 0 ) printf(" HYPRE_LSC::parameters truncThresh = %e\n", truncThresh_); } //---------------------------------------------------------------- // turn on fetching diagonal //---------------------------------------------------------------- else if ( !strcmp(param1, "set_mixed_diag") ) { FEI_mixedDiagFlag_ = 1; if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 3 && mypid_ == 0 ) printf(" HYPRE_LSC::parameters set mixed diagonal\n"); } //---------------------------------------------------------------- // scale the matrix //---------------------------------------------------------------- else if ( !strcmp(param1, "slideReductionScaleMatrix") ) { slideReductionScaleMatrix_ = 1; if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 3 && mypid_ == 0 ) printf(" HYPRE_LSC::parameters slideReduction scaleMat\n"); } //---------------------------------------------------------------- // special output level //---------------------------------------------------------------- else if ( !strcmp(param1, "setDebug") ) { sscanf(params[i],"%s %s", param, param2); if (!strcmp(param2, "slideReduction1")) HYOutputLevel_ |= HYFEI_SLIDEREDUCE1; else if (!strcmp(param2, "slideReduction2")) HYOutputLevel_ |= HYFEI_SLIDEREDUCE2; else if (!strcmp(param2, "slideReduction3")) HYOutputLevel_ |= HYFEI_SLIDEREDUCE3; else if (!strcmp(param2, "schurReduction1")) HYOutputLevel_ |= HYFEI_SCHURREDUCE1; else if (!strcmp(param2, "schurReduction2")) HYOutputLevel_ |= HYFEI_SCHURREDUCE2; else if (!strcmp(param2, "schurReduction3")) HYOutputLevel_ |= HYFEI_SCHURREDUCE3; else if (!strcmp(param2, "amgDebug")) HYOutputLevel_ |= HYFEI_AMGDEBUG; else if (!strcmp(param2, "printMat")) HYOutputLevel_ |= HYFEI_PRINTMAT; else if (!strcmp(param2, "printSol")) HYOutputLevel_ |= HYFEI_PRINTSOL; else if (!strcmp(param2, "printReducedMat")) HYOutputLevel_ |= HYFEI_PRINTREDMAT; else if (!strcmp(param2, "printParCSRMat")) HYOutputLevel_ |= HYFEI_PRINTPARCSRMAT; else if (!strcmp(param2, "printFEInfo")) HYOutputLevel_ |= HYFEI_PRINTFEINFO; else if (!strcmp(param2, "ddilut")) HYOutputLevel_ |= HYFEI_DDILUT; else if (!strcmp(param2, "stopAfterPrint")) HYOutputLevel_ |= HYFEI_STOPAFTERPRINT; else if (!strcmp(param2, "off")) HYOutputLevel_ = 0; if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 3 && mypid_ == 0 ) printf(" HYPRE_LSC::parameters setDebug %s.\n", param2); } //---------------------------------------------------------------- // turn on MLI's FEData module //---------------------------------------------------------------- else if ( !strcmp(param1, "haveFEData") ) { sscanf(params[i],"%s %d", param, &haveFEData_); if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 3 && mypid_ == 0 ) printf(" HYPRE_LSC::parameters haveFEData = %d\n", haveFEData_); } else if ( !strcmp(param1, "haveSFEI") ) { haveFEData_ = 2; if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 3 && mypid_ == 0 ) printf(" HYPRE_LSC::parameters haveSFEI\n"); } //---------------------------------------------------------------- // turn on normal equation option //---------------------------------------------------------------- else if ( !strcmp(param1, "normalEquation") ) { normalEqnFlag_ = 1; if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 3 && mypid_ == 0 ) printf(" HYPRE_LSC::parameters - normal equation on.\n"); } //---------------------------------------------------------------- // perform Schur complement reduction //---------------------------------------------------------------- else if ( !strcmp(param1, "schurReduction") ) { schurReduction_ = 1; if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 3 && mypid_ == 0 ) printf(" HYPRE_LSC::parameters - schur reduction.\n"); } //---------------------------------------------------------------- // perform slide reduction //---------------------------------------------------------------- else if ( !strcmp(param1, "slideReduction") ) { slideReduction_ = 1; if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 3 && mypid_ == 0 ) printf(" HYPRE_LSC::parameters - slideReduction.\n"); } else if ( !strcmp(param1, "slideReduction2") ) { slideReduction_ = 2; if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 3 && mypid_ == 0 ) printf(" HYPRE_LSC::parameters - slideReduction2.\n"); } else if ( !strcmp(param1, "slideReduction3") ) { slideReduction_ = 3; if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 3 && mypid_ == 0 ) printf(" HYPRE_LSC::parameters - slideReduction3.\n"); } else if ( !strcmp(param1, "slideReduction4") ) { slideReduction_ = 4; if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 3 && mypid_ == 0 ) printf(" HYPRE_LSC::parameters - slideReduction4.\n"); } else if ( !strcmp(param1, "slideReductionMinNorm") ) { sscanf(params[i],"%s %lg", param, &slideReductionMinNorm_); if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 3 && mypid_ == 0 ) printf(" HYPRE_LSC::parameters - slideReductionMinNorm.\n"); } else if ( !strcmp(param1, "matrixPartition") ) { matrixPartition_ = 1; if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 3 && mypid_ == 0 ) printf(" HYPRE_LSC::parameters - matrixPartition.\n"); } //---------------------------------------------------------------- // perform A-conjugate projection //---------------------------------------------------------------- else if ( !strcmp(param1, "AConjugateProjection") ) { if ( HYpbs_ != NULL ) { for ( k = 0; k <= projectSize_; k++ ) if ( HYpbs_[k] != NULL ) HYPRE_IJVectorDestroy(HYpbs_[k]); delete [] HYpbs_; HYpbs_ = NULL; } if ( HYpxs_ != NULL ) { for ( k = 0; k <= projectSize_; k++ ) if ( HYpxs_[k] != NULL ) HYPRE_IJVectorDestroy(HYpxs_[k]); delete [] HYpxs_; HYpxs_ = NULL; } sscanf(params[i],"%s %d", param, &k); if ( k > 0 && k < 100 ) projectSize_ = k; else projectSize_ = 10; if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 3 && mypid_ == 0 ) printf(" HYPRE_LSC::parameters AConjugateProjection = %d\n", projectSize_); projectionScheme_ = 1; } //---------------------------------------------------------------- // perform minimal residual projection //---------------------------------------------------------------- else if ( !strcmp(param1, "minResProjection") ) { if ( HYpbs_ != NULL ) { for ( k = 0; k <= projectSize_; k++ ) if ( HYpbs_[k] != NULL ) HYPRE_IJVectorDestroy(HYpbs_[k]); delete [] HYpbs_; HYpbs_ = NULL; } if ( HYpxs_ != NULL ) { for ( k = 0; k <= projectSize_; k++ ) if ( HYpxs_[k] != NULL ) HYPRE_IJVectorDestroy(HYpxs_[k]); delete [] HYpxs_; HYpxs_ = NULL; } sscanf(params[i],"%s %d", param, &k); if ( k > 0 && k < 100 ) projectSize_ = k; else projectSize_ = 10; if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 3 && mypid_ == 0 ) printf(" HYPRE_LSC::parameters minResProjection = %d\n", projectSize_); projectionScheme_ = 2; } //---------------------------------------------------------------- // which solver to pick : cg, gmres, superlu, superlux, y12m //---------------------------------------------------------------- else if ( !strcmp(param1, "solver") ) { solver_override = 0; } //---------------------------------------------------------------- // for GMRES, the restart size //---------------------------------------------------------------- else if ( !strcmp(param1, "gmresDim") ) { sscanf(params[i],"%s %d", param, &gmresDim_); if ( gmresDim_ < 1 ) gmresDim_ = 100; if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 3 && mypid_ == 0 ) printf(" HYPRE_LSC::parameters gmresDim = %d\n", gmresDim_); } //---------------------------------------------------------------- // for FGMRES, tell it to update the convergence criterion of its // preconditioner, if it is Block preconditioning //---------------------------------------------------------------- else if ( !strcmp(param1, "fgmresUpdateTol") ) { fgmresUpdateTol_ = 1; if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 3 && mypid_ == 0 ) printf(" HYPRE_LSC::parameters fgmresUpdateTol on\n"); } //---------------------------------------------------------------- // for GMRES, the convergence criterion //---------------------------------------------------------------- else if ( !strcmp(param1, "gmresStopCrit") ) { sscanf(params[i],"%s %s", param, param2); if ( !strcmp(param2, "absolute" ) ) normAbsRel_ = 1; else if ( !strcmp(param2, "relative" ) ) normAbsRel_ = 0; else normAbsRel_ = 0; if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 3 && mypid_ == 0 ) printf(" HYPRE_LSC::parameters gmresStopCrit = %s\n", param2); } else if ( !strcmp(param1, "stopCrit") ) { sscanf(params[i],"%s %s", param, param2); if ( !strcmp(param2, "absolute") ) normAbsRel_ = 1; else if ( !strcmp(param2, "relative") ) normAbsRel_ = 0; else normAbsRel_ = 0; if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 3 && mypid_ == 0 ) printf(" HYPRE_LSC::parameters stopCrit = %s\n", param2); } //---------------------------------------------------------------- // for PCG only //---------------------------------------------------------------- else if ( !strcmp(param1, "pcgRecomputeResidual") ) { pcgRecomputeRes_ = 1; if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 3 && mypid_ == 0 ) printf(" HYPRE_LSC::parameters pcgRecomputeResidual\n"); } //---------------------------------------------------------------- // preconditioner reuse //---------------------------------------------------------------- else if ( !strcmp(param1, "precond_reuse") ) { sscanf(params[i],"%s %s", param, param2); if ( !strcmp(param2, "on") ) HYPreconReuse_ = reuse = 1; else HYPreconReuse_ = 0; if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 3 && mypid_ == 0 ) printf(" HYPRE_LSC::parameters precond_reuse = %s\n", param2); } //---------------------------------------------------------------- // which preconditioner : diagonal, pilut, boomeramg, parasails //---------------------------------------------------------------- else if ( !strcmp(param1, "preconditioner") ) { sscanf(params[i],"%s %s", param, param2); if ( !strcmp(param2, "reuse") ) HYPreconReuse_ = reuse = 1; else if ( !strcmp(param2, "parasails_reuse") ) parasailsReuse_ = 1; } //---------------------------------------------------------------- // maximum number of iterations for pcg or gmres //---------------------------------------------------------------- else if ( !strcmp(param1, "maxIterations") ) { sscanf(params[i],"%s %d", param, &maxIterations_); if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 3 && mypid_ == 0 ) printf(" HYPRE_LSC::parameters maxIterations = %d\n", maxIterations_); } //---------------------------------------------------------------- // tolerance as termination criterion //---------------------------------------------------------------- else if ( !strcmp(param1, "tolerance") ) { sscanf(params[i],"%s %lg", param, &tolerance_); if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 3 && mypid_ == 0 ) printf(" HYPRE_LSC::parameters tolerance = %e\n", tolerance_); } //---------------------------------------------------------------- // pilut preconditioner : max number of nonzeros to keep per row //---------------------------------------------------------------- else if ( !strcmp(param1, "pilutFillin") ) { sscanf(params[i],"%s %d", param, &pilutFillin_); if ( pilutFillin_ < 1 ) pilutFillin_ = 50; if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 3 && mypid_ == 0 ) printf(" HYPRE_LSC::parameters pilutFillin_ = %d\n", pilutFillin_); } else if ( !strcmp(param1, "pilutRowSize") ) { sscanf(params[i],"%s %d", param, &pilutFillin_); if ( pilutFillin_ < 1 ) pilutFillin_ = 50; if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 3 && mypid_ == 0 ) printf(" HYPRE_LSC::parameters pilutFillin_ = %d\n", pilutFillin_); } //---------------------------------------------------------------- // pilut preconditioner : threshold to drop small nonzeros //---------------------------------------------------------------- else if ( !strcmp(param1, "pilutDropTol") ) { sscanf(params[i],"%s %lg", param, &pilutDropTol_); if (pilutDropTol_<0.0 || pilutDropTol_ >=1.0) pilutDropTol_ = 0.0; if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 3 && mypid_ == 0 ) printf(" HYPRE_LSC::parameters pilutDropTol = %e\n", pilutDropTol_); } //---------------------------------------------------------------- // DDILUT preconditioner : amount of fillin (0 == same as A) //---------------------------------------------------------------- else if ( !strcmp(param1, "ddilutFillin") ) { sscanf(params[i],"%s %lg", param, &ddilutFillin_); if ( ddilutFillin_ < 0.0 ) ddilutFillin_ = 0.0; if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 3 && mypid_ == 0 ) printf(" HYPRE_LSC::parameters ddilutFillin = %e\n", ddilutFillin_); } //---------------------------------------------------------------- // DDILUT preconditioner : threshold to drop small nonzeros //---------------------------------------------------------------- else if ( !strcmp(param1, "ddilutDropTol") ) { sscanf(params[i],"%s %lg", param, &ddilutDropTol_); if (ddilutDropTol_<0.0 || ddilutDropTol_ >=1.0) ddilutDropTol_ = 0.0; if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 3 && mypid_ == 0 ) printf(" HYPRE_LSC::parameters ddilutDropTol = %e\n", ddilutDropTol_); } //---------------------------------------------------------------- // DDILUT preconditioner : turn on processor overlap //---------------------------------------------------------------- else if ( !strcmp(param1, "ddilutOverlap") ) { ddilutOverlap_ = 1; if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 3 && mypid_ == 0 ) printf(" HYPRE_LSC::parameters ddilutOverlap = on\n"); } //---------------------------------------------------------------- // DDILUT preconditioner : reorder based on Cuthill McKee //---------------------------------------------------------------- else if ( !strcmp(param1, "ddilutReorder") ) { ddilutReorder_ = 1; if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 3 && mypid_ == 0 ) printf(" HYPRE_LSC::parameters ddilutReorder = on\n"); } //---------------------------------------------------------------- // DDICT preconditioner : amount of fillin (0 == same as A) //---------------------------------------------------------------- else if ( !strcmp(param1, "ddictFillin") ) { sscanf(params[i],"%s %lg", param, &ddictFillin_); if ( ddictFillin_ < 0.0 ) ddictFillin_ = 0.0; if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 3 && mypid_ == 0 ) printf(" HYPRE_LSC::parameters ddictFillin = %e\n", ddictFillin_); } //---------------------------------------------------------------- // DDICT preconditioner : threshold to drop small nonzeros //---------------------------------------------------------------- else if ( !strcmp(param1, "ddictDropTol") ) { sscanf(params[i],"%s %lg", param, &ddictDropTol_); if (ddictDropTol_<0.0 || ddictDropTol_ >=1.0) ddictDropTol_ = 0.0; if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 3 && mypid_ == 0 ) printf(" HYPRE_LSC::parameters ddictDropTol = %e\n", ddictDropTol_); } //---------------------------------------------------------------- // Schwarz preconditioner : Fillin //---------------------------------------------------------------- else if ( !strcmp(param1, "schwarzFillin") ) { sscanf(params[i],"%s %lg", param, &schwarzFillin_); if ( schwarzFillin_ < 0.0 ) schwarzFillin_ = 0.0; if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 3 && mypid_ == 0 ) printf(" HYPRE_LSC::parameters schwarzFillin = %e\n", schwarzFillin_); } //---------------------------------------------------------------- // Schwarz preconditioner : block size //---------------------------------------------------------------- else if ( !strcmp(param1, "schwarzNBlocks") ) { sscanf(params[i],"%s %d", param, &schwarzNblocks_); if ( schwarzNblocks_ <= 0 ) schwarzNblocks_ = 1; if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 3 && mypid_ == 0 ) printf(" HYPRE_LSC::parameters schwarzNblocks = %d\n", schwarzNblocks_); } //---------------------------------------------------------------- // Schwarz preconditioner : block size //---------------------------------------------------------------- else if ( !strcmp(param1, "schwarzBlockSize") ) { sscanf(params[i],"%s %d", param, &schwarzBlksize_); if ( schwarzBlksize_ <= 0 ) schwarzBlksize_ = 1000; if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 3 && mypid_ == 0 ) printf(" HYPRE_LSC::parameters schwarzBlockSize = %d\n", schwarzBlksize_); } //---------------------------------------------------------------- // Polynomial preconditioner : order //---------------------------------------------------------------- else if ( !strcmp(param1, "polyOrder") ) { sscanf(params[i],"%s %d", param, &polyOrder_); if ( polyOrder_ < 0 ) polyOrder_ = 0; if ( polyOrder_ > 8 ) polyOrder_ = 8; if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 3 && mypid_ == 0 ) printf(" HYPRE_LSC::parameters polyOrder = %d\n", polyOrder_); } //---------------------------------------------------------------- // superlu : ordering to use (natural, mmd) //---------------------------------------------------------------- else if ( !strcmp(param1, "superluOrdering") ) { sscanf(params[i],"%s %s", param, param2); if ( !strcmp(param2, "natural" ) ) superluOrdering_ = 0; else if ( !strcmp(param2, "mmd") ) superluOrdering_ = 2; else superluOrdering_ = 0; if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 3 && mypid_ == 0 ) printf(" HYPRE_LSC::parameters superluOrdering = %s\n", param2); } //---------------------------------------------------------------- // superlu : scaling none ('N') or both col/row ('B') //---------------------------------------------------------------- else if ( !strcmp(param1, "superluScale") ) { sscanf(params[i],"%s %s", param, param2); if ( !strcmp(param2, "y" ) ) superluScale_[0] = 'B'; else superluScale_[0] = 'N'; if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 3 && mypid_ == 0 ) printf(" HYPRE_LSC::parameters superluScale = %s\n", param2); } else recognized = 0; //---------------------------------------------------------------- // amg preconditoner : coarsening type //---------------------------------------------------------------- if (!recognized) { recognized = 1; if ( !strcmp(param1, "amgMaxLevels") ) { sscanf(params[i],"%s %d", param, &amgMaxLevels_); if ( amgMaxLevels_ <= 0 ) amgMaxLevels_ = 30; if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 3 && mypid_ == 0 ) printf(" HYPRE_LSC::parameters amgMaxLevels = %d\n", amgMaxLevels_); } //---------------------------------------------------------------- // amg preconditoner : coarsening type //---------------------------------------------------------------- else if ( !strcmp(param1, "amgCoarsenType") ) { sscanf(params[i],"%s %s", param, param2); if ( !strcmp(param2, "cljp" ) ) amgCoarsenType_ = 0; else if ( !strcmp(param2, "ruge" ) ) amgCoarsenType_ = 1; else if ( !strcmp(param2, "ruge3c" ) ) amgCoarsenType_ = 4; else if ( !strcmp(param2, "falgout" ) ) amgCoarsenType_ = 6; else if ( !strcmp(param2, "pmis" ) ) amgCoarsenType_ = 8; else if ( !strcmp(param2, "hmis" ) ) amgCoarsenType_ = 10; else amgCoarsenType_ = 0; if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 3 && mypid_ == 0 ) printf(" HYPRE_LSC::parameters amgCoarsenType = %s\n", param2); } //---------------------------------------------------------------- // amg preconditoner : measure //---------------------------------------------------------------- else if ( !strcmp(param1, "amgMeasureType") ) { sscanf(params[i],"%s %s", param, param2); if ( !strcmp(param2, "local" ) ) amgMeasureType_ = 0; else if ( !strcmp(param2, "global" ) ) amgMeasureType_ = 1; else amgMeasureType_ = 0; if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 3 && mypid_ == 0 ) printf(" HYPRE_LSC::parameters amgCoarsenType = %s\n", param2); } //---------------------------------------------------------------- // amg preconditoner : no of relaxation sweeps per level //---------------------------------------------------------------- else if ( !strcmp(param1, "amgNumSweeps") ) { sscanf(params[i],"%s %d", param, &nsweeps); if ( nsweeps < 1 ) nsweeps = 1; for ( k = 0; k < 4; k++ ) amgNumSweeps_[k] = nsweeps; if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 3 && mypid_ == 0 ) printf(" HYPRE_LSC::parameters amgNumSweeps = %d\n", nsweeps); } //--------------------------------------------------------------- // amg preconditoner : which smoother to use //---------------------------------------------------------------- else if ( !strcmp(param1, "amgRelaxType") ) { sscanf(params[i],"%s %s", param, param2); if ( !strcmp(param2, "jacobi" ) ) rtype = 0; else if ( !strcmp(param2, "CFjacobi" ) ) {rtype = 0; amgGridRlxType_ = 1;} else if ( !strcmp(param2, "gsSlow") ) rtype = 1; else if ( !strcmp(param2, "gsFast") ) rtype = 4; else if ( !strcmp(param2, "hybrid" ) ) rtype = 3; else if ( !strcmp(param2, "CFhybrid" ) ) {rtype = 3; amgGridRlxType_ = 1;} else if ( !strcmp(param2, "hybridsym" ) ) rtype = 6; else if ( !strcmp(param2, "l1gs" ) ) rtype = 8; else if ( !strcmp(param2, "CFhybridsym" ) ) {rtype = 6; amgGridRlxType_ = 1;} else rtype = 4; for ( k = 0; k < 3; k++ ) amgRelaxType_[k] = rtype; if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 3 && mypid_ == 0 ) printf(" HYPRE_LSC::parameters amgRelaxType = %s\n", param2); } //--------------------------------------------------------------- // amg preconditoner : damping factor for Jacobi smoother //--------------------------------------------------------------- else if ( !strcmp(param1, "amgRelaxWeight") ) { sscanf(params[i],"%s %lg", param, &weight); for ( k = 0; k < 25; k++ ) amgRelaxWeight_[k] = weight; if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 3 && mypid_ == 0 ) printf(" HYPRE_LSC::parameters amgRelaxWeight = %e\n", weight); } //--------------------------------------------------------------- // amg preconditoner : relaxation factor for hybrid smoother //--------------------------------------------------------------- else if ( !strcmp(param1, "amgRelaxOmega") ) { sscanf(params[i],"%s %lg", param, &weight); for ( k = 0; k < 25; k++ ) amgRelaxOmega_[k] = weight; if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 3 && mypid_ == 0 ) printf(" HYPRE_LSC::parameters amgRelaxOmega = %e\n", weight); } //--------------------------------------------------------------- // amg preconditoner : threshold to determine strong coupling //--------------------------------------------------------------- else if ( !strcmp(param1, "amgStrongThreshold") ) { sscanf(params[i],"%s %lg", param, &amgStrongThreshold_); if ( amgStrongThreshold_ < 0.0 || amgStrongThreshold_ > 1.0 ) amgStrongThreshold_ = 0.25; if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 3 && mypid_ == 0 ) printf(" HYPRE_LSC::parameters amgStrongThreshold = %e\n", amgStrongThreshold_); } else if ( !strcmp(param1, "amgStrengthThreshold") ) { sscanf(params[i],"%s %lg", param, &amgStrongThreshold_); if ( amgStrongThreshold_ < 0.0 || amgStrongThreshold_ > 1.0 ) amgStrongThreshold_ = 0.25; if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 3 && mypid_ == 0 ) printf(" HYPRE_LSC::parameters amgStrengthThreshold = %e\n", amgStrongThreshold_); } //--------------------------------------------------------------- // amg preconditoner : choose system size //--------------------------------------------------------------- else if ( !strcmp(param1, "amgSystemSize") ) { sscanf(params[i],"%s %d", param, &amgSystemSize_); if ( amgSystemSize_ <= 0 ) amgSystemSize_ = 1; if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 3 && mypid_ == 0 ) printf(" HYPRE_LSC::parameters amgSystemSize = %d\n", amgSystemSize_); } //--------------------------------------------------------------- // amg preconditoner : choose max iterations //--------------------------------------------------------------- else if ( !strcmp(param1, "amgMaxIterations") ) { sscanf(params[i],"%s %d", param, &amgMaxIter_); if ( amgMaxIter_ <= 0 ) amgMaxIter_ = 1; if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 3 && mypid_ == 0 ) printf(" HYPRE_LSC::parameters amgMaxIter = %d\n", amgMaxIter_); } //--------------------------------------------------------------- // amg preconditoner : choose more complex smoother //--------------------------------------------------------------- else if ( !strcmp(param1, "amgSmoothType") ) { sscanf(params[i],"%s %d", param, &amgSmoothType_); if ( amgSmoothType_ < 0 ) amgSmoothType_ = 0; if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 3 && mypid_ == 0 ) printf(" HYPRE_LSC::parameters amgSmoothType = %d\n", amgSmoothType_); } //--------------------------------------------------------------- // amg preconditoner : choose no. of levels for complex smoother //--------------------------------------------------------------- else if ( !strcmp(param1, "amgSmoothNumLevels") ) { sscanf(params[i],"%s %d", param, &amgSmoothNumLevels_); if ( amgSmoothNumLevels_ < 0 ) amgSmoothNumLevels_ = 0; if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 3 && mypid_ == 0 ) printf(" HYPRE_LSC::parameters amgSmoothNumLevels = %d\n", amgSmoothNumLevels_); } //--------------------------------------------------------------- // amg preconditoner : choose no. of sweeps for complex smoother //--------------------------------------------------------------- else if ( !strcmp(param1, "amgSmoothNumSweeps") ) { sscanf(params[i],"%s %d", param, &amgSmoothNumSweeps_); if ( amgSmoothNumSweeps_ < 0 ) amgSmoothNumSweeps_ = 1; if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 3 && mypid_ == 0 ) printf(" HYPRE_LSC::parameters amgSmoothNumSweeps = %d\n", amgSmoothNumSweeps_); } //--------------------------------------------------------------- // amg preconditoner : choose relaxation weight for Schwarz smoother //--------------------------------------------------------------- else if ( !strcmp(param1, "amgSchwarzRelaxWt") ) { sscanf(params[i],"%s %lg", param, &amgSchwarzRelaxWt_); if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 3 && mypid_ == 0 ) printf(" HYPRE_LSC::parameters amgSchwarzRelaxWt = %e\n", amgSchwarzRelaxWt_); } //--------------------------------------------------------------- // amg preconditoner : choose Schwarz smoother variant //--------------------------------------------------------------- else if ( !strcmp(param1, "amgSchwarzVariant") ) { sscanf(params[i],"%s %d", param, &amgSchwarzVariant_); if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 3 && mypid_ == 0 ) printf(" HYPRE_LSC::parameters amgSchwarzVariant = %d\n", amgSchwarzVariant_); } //--------------------------------------------------------------- // amg preconditoner : choose Schwarz smoother overlap //--------------------------------------------------------------- else if ( !strcmp(param1, "amgSchwarzOverlap") ) { sscanf(params[i],"%s %d", param, &amgSchwarzOverlap_); if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 3 && mypid_ == 0 ) printf(" HYPRE_LSC::parameters amgSchwarzOverlap = %d\n", amgSchwarzOverlap_); } //---------------------------------------------------------------- //--------------------------------------------------------------- // amg preconditoner : choose Schwarz smoother domain type //--------------------------------------------------------------- else if ( !strcmp(param1, "amgSchwarzDomainType") ) { sscanf(params[i],"%s %d", param, &amgSchwarzDomainType_); if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 3 && mypid_ == 0 ) printf(" HYPRE_LSC::parameters amgSchwarzDomainType = %d\n", amgSchwarzDomainType_); } //---------------------------------------------------------------- //---------------------------------------------------------------- // amg preconditoner : use gsmg //---------------------------------------------------------------- else if ( !strcmp(param1, "amgUseGSMG") ) { amgUseGSMG_ = 1; if ( amgGSMGNSamples_ == 0 ) amgGSMGNSamples_ = 5; if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 3 && mypid_ == 0 ) printf(" HYPRE_LSC::parameters amgUseGSMG.\n"); } //---------------------------------------------------------------- // amg preconditoner : levels of aggresive coarsening //---------------------------------------------------------------- else if ( !strcmp(param1, "amgAggLevels") ) { sscanf(params[i],"%s %d", param, &amgAggLevels_); if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 3 && mypid_ == 0 ) printf(" HYPRE_LSC::parameters %s = %d\n", param1, amgAggLevels_); } //---------------------------------------------------------------- // amg preconditoner : interpolation type //---------------------------------------------------------------- else if ( !strcmp(param1, "amgInterpType") ) { sscanf(params[i],"%s %d", param, &amgInterpType_); if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 3 && mypid_ == 0 ) printf(" HYPRE_LSC::parameters %s = %d\n", param1, amgInterpType_); } //---------------------------------------------------------------- // amg preconditoner : interpolation truncation //---------------------------------------------------------------- else if ( !strcmp(param1, "amgPmax") ) { sscanf(params[i],"%s %d", param, &amgPmax_); if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 3 && mypid_ == 0 ) printf(" HYPRE_LSC::parameters %s = %d\n", param1, amgPmax_); } //--------------------------------------------------------------- // parasails preconditoner : gsmg number of samples //--------------------------------------------------------------- else if ( !strcmp(param1, "amgGSMGNumSamples") ) { sscanf(params[i],"%s %d", param, &amgGSMGNSamples_); if ( amgGSMGNSamples_ < 0 ) amgGSMGNSamples_ = 5; if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 3 && mypid_ == 0 ) printf(" HYPRE_LSC::parameters amgGSMGNumSamples = %d\n", amgGSMGNSamples_); } else recognized = 0; } //--------------------------------------------------------------- // parasails preconditoner : threshold ( >= 0.0 ) //--------------------------------------------------------------- if (!recognized) { recognized = 1; if ( !strcmp(param1, "parasailsThreshold") ) { sscanf(params[i],"%s %lg", param, ¶sailsThreshold_); if ( parasailsThreshold_ < 0.0 ) parasailsThreshold_ = 0.1; if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 3 && mypid_ == 0 ) printf(" HYPRE_LSC::parameters parasailsThreshold = %e\n", parasailsThreshold_); } //--------------------------------------------------------------- // parasails preconditoner : nlevels ( >= 0) //--------------------------------------------------------------- else if ( !strcmp(param1, "parasailsNlevels") ) { sscanf(params[i],"%s %d", param, ¶sailsNlevels_); if ( parasailsNlevels_ < 0 ) parasailsNlevels_ = 1; if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 3 && mypid_ == 0 ) printf(" HYPRE_LSC::parameters parasailsNlevels = %d\n", parasailsNlevels_); } //--------------------------------------------------------------- // parasails preconditoner : filter //--------------------------------------------------------------- else if ( !strcmp(param1, "parasailsFilter") ) { sscanf(params[i],"%s %lg", param, ¶sailsFilter_); if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 3 && mypid_ == 0 ) printf(" HYPRE_LSC::parameters parasailsFilter = %e\n", parasailsFilter_); } //--------------------------------------------------------------- // parasails preconditoner : loadbal //--------------------------------------------------------------- else if ( !strcmp(param1, "parasailsLoadbal") ) { sscanf(params[i],"%s %lg", param, ¶sailsLoadbal_); if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 3 && mypid_ == 0 ) printf(" HYPRE_LSC::parameters parasailsLoadbal = %e\n", parasailsLoadbal_); } //--------------------------------------------------------------- // parasails preconditoner : symmetry flag (1 - symm, 0 - nonsym) //--------------------------------------------------------------- else if ( !strcmp(param1, "parasailsSymmetric") ) { parasailsSym_ = 1; if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 3 && mypid_ == 0 ) printf(" HYPRE_LSC::parameters parasailsSym = sym\n"); } else if ( !strcmp(param1, "parasailsUnSymmetric") ) { parasailsSym_ = 0; if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 3 && mypid_ == 0 ) printf(" HYPRE_LSC::parameters parasailsSym = nonsym\n"); } //--------------------------------------------------------------- // parasails preconditoner : reuse flag //--------------------------------------------------------------- else if ( !strcmp(param1, "parasailsReuse") ) { sscanf(params[i],"%s %d", param, ¶sailsReuse_); if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 3 && mypid_ == 0 ) printf(" HYPRE_LSC::parameters parasailsReuse = %d\n", parasailsReuse_); } else recognized = 0; } //--------------------------------------------------------------- // Euclid preconditoner : fill-in //--------------------------------------------------------------- if (!recognized) { recognized = 1; if ( !strcmp(param1, "euclidNlevels") ) { sscanf(params[i],"%s %d", param, &olevel); if ( olevel < 0 ) olevel = 0; sprintf( euclidargv_[1], "%d", olevel); if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 3 && mypid_ == 0 ) printf(" HYPRE_LSC::parameters euclidNlevels = %d\n", olevel); } //--------------------------------------------------------------- // Euclid preconditoner : threshold //--------------------------------------------------------------- else if ( !strcmp(param1, "euclidThreshold") ) { sscanf(params[i],"%s %lg", param, &dtemp); if ( dtemp < 0.0 ) dtemp = 0.0; sprintf( euclidargv_[3], "%e", dtemp); if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 3 && mypid_ == 0 ) printf(" HYPRE_LSC::parameters euclidThreshold = %e\n", dtemp); } //--------------------------------------------------------------- // block preconditoner (hold this until this end) //--------------------------------------------------------------- else if ( !strcmp(param1, "blockP") ) { if ( HYPreconID_ == HYBLOCK ) HYPRE_LSI_BlockPrecondSetParams(HYPrecon_, params[i]); } //--------------------------------------------------------------- // MLI preconditoners (hold this until the end) //--------------------------------------------------------------- else if ( !strcmp(param1, "MLI_Hybrid") ) { MLI_Hybrid_GSA_ = 1; } else if ( !strcmp(param1, "MLI_Hybrid_NSIncr") ) { sscanf(params[i],"%s %d", param, &MLI_Hybrid_NSIncr_); if ( MLI_Hybrid_NSIncr_ <= 0 ) MLI_Hybrid_NSIncr_ = 1; if ( MLI_Hybrid_NSIncr_ > 10 ) MLI_Hybrid_NSIncr_ = 10; } else if ( !strcmp(param1, "MLI_Hybrid_MaxIter") ) { sscanf(params[i],"%s %d", param, &MLI_Hybrid_MaxIter_); if ( MLI_Hybrid_MaxIter_ <= 0 ) MLI_Hybrid_MaxIter_ = 10; } else if ( !strcmp(param1, "MLI_Hybrid_NTrials") ) { sscanf(params[i],"%s %d", param, &MLI_Hybrid_NTrials_); if ( MLI_Hybrid_NTrials_ <= 0 ) MLI_Hybrid_NTrials_ = 1; } else if ( !strcmp(param1, "MLI_Hybrid_ConvRate") ) { sscanf(params[i],"%s %lg", param, &MLI_Hybrid_ConvRate_); if ( MLI_Hybrid_ConvRate_ >= 1.0 ) MLI_Hybrid_ConvRate_ = 1.0; if ( MLI_Hybrid_ConvRate_ <= 0.0 ) MLI_Hybrid_ConvRate_ = 0.0; } else if ( !strcmp(param1, "MLI") ) { #ifdef HAVE_MLI if ( HYPreconID_ == HYMLI ) HYPRE_LSI_MLISetParams(HYPrecon_, params[i]); #else // if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 2 && mypid_ == 0 ) // printf(" HYPRE_LSC::MLI SetParams - MLI unavailable.\n"); #endif } //---------------------------------------------------------------- // for Uzawa, the various parameters //---------------------------------------------------------------- else if ( !strcmp(param1, "Uzawa") ) { if ( HYPreconID_ == HYUZAWA ) HYPRE_LSI_UzawaSetParams(HYPrecon_, params[i]); } else recognized = 0; } //--------------------------------------------------------------- // mlpack preconditoner : no of relaxation sweeps per level //--------------------------------------------------------------- if (!recognized) { recognized = 1; if ( !strcmp(param1, "mlNumPresweeps") ) { sscanf(params[i],"%s %d", param, &nsweeps); if ( nsweeps < 1 ) nsweeps = 1; mlNumPreSweeps_ = nsweeps; if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 3 && mypid_ == 0 ) printf(" HYPRE_LSC::parameters mlNumPresweeps = %d\n", nsweeps); } else if ( !strcmp(param1, "mlNumPostsweeps") ) { sscanf(params[i],"%s %d", param, &nsweeps); if ( nsweeps < 1 ) nsweeps = 1; mlNumPostSweeps_ = nsweeps; if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 3 && mypid_ == 0 ) printf(" HYPRE_LSC::parameters mlNumPostsweeps = %d\n", nsweeps); } else if ( !strcmp(param1, "mlNumSweeps") ) { sscanf(params[i],"%s %d", param, &nsweeps); if ( nsweeps < 1 ) nsweeps = 1; mlNumPreSweeps_ = nsweeps; mlNumPostSweeps_ = nsweeps; if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 3 && mypid_ == 0 ) printf(" HYPRE_LSC::parameters mlNumSweeps = %d\n", nsweeps); } //--------------------------------------------------------------- // mlpack preconditoner : which smoother to use //--------------------------------------------------------------- else if ( !strcmp(param1, "mlPresmootherType") ) { sscanf(params[i],"%s %s", param, param2); rtype = 1; if ( !strcmp(param2, "jacobi" ) ) rtype = 0; else if ( !strcmp(param2, "sgs") ) rtype = 1; else if ( !strcmp(param2, "sgsseq") ) rtype = 2; else if ( !strcmp(param2, "vbjacobi")) rtype = 3; else if ( !strcmp(param2, "vbsgs") ) rtype = 4; else if ( !strcmp(param2, "vbsgsseq")) rtype = 5; else if ( !strcmp(param2, "ilut") ) rtype = 6; else if ( !strcmp(param2, "aSchwarz") ) rtype = 7; else if ( !strcmp(param2, "mSchwarz") ) rtype = 8; mlPresmootherType_ = rtype; if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 3 && mypid_ == 0 ) printf(" HYPRE_LSC::parameters mlPresmootherType = %s\n", param2); } else if ( !strcmp(param1, "mlPostsmootherType") ) { sscanf(params[i],"%s %s", param, param2); rtype = 1; if ( !strcmp(param2, "jacobi" ) ) rtype = 0; else if ( !strcmp(param2, "sgs") ) rtype = 1; else if ( !strcmp(param2, "sgsseq") ) rtype = 2; else if ( !strcmp(param2, "vbjacobi")) rtype = 3; else if ( !strcmp(param2, "vbsgs") ) rtype = 4; else if ( !strcmp(param2, "vbsgsseq")) rtype = 5; mlPostsmootherType_ = rtype; if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 3 && mypid_ == 0 ) printf(" HYPRE_LSC::parameters mlPostsmootherType = %s\n", param2); } else if ( !strcmp(param1, "mlRelaxType") ) { sscanf(params[i],"%s %s", param, param2); rtype = 1; if ( !strcmp(param2, "jacobi" ) ) rtype = 0; else if ( !strcmp(param2, "sgs") ) rtype = 1; else if ( !strcmp(param2, "sgsseq") ) rtype = 2; else if ( !strcmp(param2, "vbjacobi")) rtype = 3; else if ( !strcmp(param2, "vbsgs") ) rtype = 4; else if ( !strcmp(param2, "vbsgsseq")) rtype = 5; mlPresmootherType_ = rtype; mlPostsmootherType_ = rtype; if ( rtype == 6 ) mlPostsmootherType_ = 1; if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 3 && mypid_ == 0 ) printf(" HYPRE_LSC::parameters mlRelaxType = %s\n", param2); } //--------------------------------------------------------------- // mlpack preconditoner : damping factor for Jacobi smoother //--------------------------------------------------------------- else if ( !strcmp(param1, "mlRelaxWeight") ) { sscanf(params[i],"%s %lg", param, &weight); if ( weight < 0.0 || weight > 1.0 ) weight = 0.5; mlRelaxWeight_ = weight; if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 3 && mypid_ == 0 ) printf(" HYPRE_LSC::parameters mlRelaxWeight = %e\n", weight); } //--------------------------------------------------------------- // mlpack preconditoner : threshold to determine strong coupling //--------------------------------------------------------------- else if ( !strcmp(param1, "mlStrongThreshold") ) { sscanf(params[i],"%s %lg", param, &mlStrongThreshold_); if ( mlStrongThreshold_ < 0.0 || mlStrongThreshold_ > 1.0 ) mlStrongThreshold_ = 0.08; if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 3 && mypid_ == 0 ) printf(" HYPRE_LSC::parameters mlStrongThreshold = %e\n", mlStrongThreshold_); } //--------------------------------------------------------------- // mlpack preconditoner : method to use //--------------------------------------------------------------- else if ( !strcmp(param1, "mlMethod") ) { sscanf(params[i],"%s %s", param, param2); if ( !strcmp(param2, "amg" ) ) mlMethod_ = 0; else mlMethod_ = 1; if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 3 && mypid_ == 0 ) printf(" HYPRE_LSC::parameters mlMethod = %d\n",mlMethod_); } //--------------------------------------------------------------- // mlpack preconditoner : coarse solver to use //--------------------------------------------------------------- else if ( !strcmp(param1, "mlCoarseSolver") ) { sscanf(params[i],"%s %s", param, param2); if ( !strcmp(param2, "superlu" ) ) mlCoarseSolver_ = 0; else if ( !strcmp(param2, "aggregation" ) ) mlCoarseSolver_ = 1; else if ( !strcmp(param2, "GS" ) ) mlCoarseSolver_ = 2; else mlCoarseSolver_ = 1; if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 3 && mypid_ == 0 ) printf(" HYPRE_LSC::parameters mlCoarseSolver = %d\n", mlCoarseSolver_); } //--------------------------------------------------------------- // mlpack preconditoner : coarsening scheme to use //--------------------------------------------------------------- else if ( !strcmp(param1, "mlCoarsenScheme") ) { sscanf(params[i],"%s %s", param, param2); if ( !strcmp(param2, "uncoupled" ) ) mlCoarsenScheme_ = 1; else if ( !strcmp(param2, "coupled" ) ) mlCoarsenScheme_ = 2; else if ( !strcmp(param2, "mis" ) ) mlCoarsenScheme_ = 3; else if ( !strcmp(param2, "hybridum" ) ) mlCoarsenScheme_ = 5; else if ( !strcmp(param2, "hybriduc" ) ) mlCoarsenScheme_ = 6; else mlCoarsenScheme_ = 1; if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 3 && mypid_ == 0 ) printf(" HYPRE_LSC::parameters mlCoarsenScheme = %d\n", mlCoarsenScheme_); } //--------------------------------------------------------------- // mlpack preconditoner : no of PDEs (block size) //--------------------------------------------------------------- else if ( !strcmp(param1, "mlNumPDEs") ) { sscanf(params[i],"%s %d", param, &mlNumPDEs_); if ( mlNumPDEs_ < 1 ) mlNumPDEs_ = 1; if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 3 && mypid_ == 0 ) printf(" HYPRE_LSC::parameters mlNumPDEs = %d\n", mlNumPDEs_); } else recognized = 0; } //--------------------------------------------------------------- // ams preconditoner : no of PDEs (block size) //--------------------------------------------------------------- if (!recognized) { recognized = 1; if ( !strcmp(param1, "amsNumPDEs") ) { sscanf(params[i],"%s %d", param, &amsNumPDEs_); if ( amsNumPDEs_ < 1 ) amsNumPDEs_ = 1; if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 3 && mypid_ == 0 ) printf(" HYPRE_LSC::parameters amsNumPDEs = %d\n", amsNumPDEs_); } //--------------------------------------------------------------- // ams preconditoner : which smoother to use //---------------------------------------------------------------- else if ( !strcmp(param1, "amsRelaxType") ) { sscanf(params[i],"%s %s", param, param2); if (!strcmp(param2, "jacobi")) amsRelaxType_ = 0; else if (!strcmp(param2, "scjacobi")) amsRelaxType_ = 1; else if (!strcmp(param2, "scgs")) amsRelaxType_ = 2; else if (!strcmp(param2, "kaczmarz")) amsRelaxType_ = 3; else if (!strcmp(param2, "l1gs*")) amsRelaxType_ = 4; else if (!strcmp(param2, "hybridsym")) amsRelaxType_ = 6; else if (!strcmp(param2, "cheby")) amsRelaxType_ = 16; else amsRelaxType_ = 2; if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 3 && mypid_ == 0 ) printf(" HYPRE_LSC::parameters amsRelaxType = %s\n", param2); } //---------------------------------------------------------------- // ams preconditoner : no of relaxation sweeps per level //---------------------------------------------------------------- else if (!strcmp(param1, "amsRelaxTimes")) { sscanf(params[i],"%s %d", param, &amsRelaxTimes_); if (amsRelaxTimes_ < 1) amsRelaxTimes_ = 1; if ((HYOutputLevel_ & HYFEI_SPECIALMASK) >= 3 && mypid_ == 0 ) printf(" HYPRE_LSC::parameters amgRelaxTimes = %d\n", amsRelaxTimes_); } //--------------------------------------------------------------- // ams preconditoner : damping factor for Jacobi smoother //--------------------------------------------------------------- else if (!strcmp(param1, "amsRelaxWeight")) { sscanf(params[i],"%s %lg", param, &amsRelaxWt_); if ((HYOutputLevel_ & HYFEI_SPECIALMASK) >= 3 && mypid_ == 0) printf(" HYPRE_LSC::parameters amgRelaxWeight = %e\n", amsRelaxWt_); } //--------------------------------------------------------------- // ams preconditoner : omega //--------------------------------------------------------------- else if (!strcmp(param1, "amsRelaxOmega")) { sscanf(params[i],"%s %lg", param, &amsRelaxOmega_); if ((HYOutputLevel_ & HYFEI_SPECIALMASK) >= 3 && mypid_ == 0) printf(" HYPRE_LSC::parameters amgRelaxWeight = %e\n", amsRelaxOmega_); } //--------------------------------------------------------------- // ams preconditoner : cycle type //--------------------------------------------------------------- else if (!strcmp(param1, "amsCycleType")) { sscanf(params[i],"%s %d", param, &amsCycleType_); if (amsCycleType_ < 1) amsCycleType_ = 1; if ((HYOutputLevel_ & HYFEI_SPECIALMASK) >= 3 && mypid_ == 0) printf(" HYPRE_LSC::parameters amgCycleType = %s\n", param2); } //--------------------------------------------------------------- // ams preconditoner : max iterations //--------------------------------------------------------------- else if (!strcmp(param1, "amsMaxIterations")) { sscanf(params[i],"%s %d", param, &amsMaxIter_); if (amsMaxIter_ < 1) amsMaxIter_ = 1; if ((HYOutputLevel_ & HYFEI_SPECIALMASK) >= 3 && mypid_ == 0) printf(" HYPRE_LSC::parameters amsMaxIterations = %d\n", amsMaxIter_); } //--------------------------------------------------------------- // ams preconditoner : tolerance //--------------------------------------------------------------- else if (!strcmp(param1, "amsTolerance")) { sscanf(params[i],"%s %lg", param, &amsTol_); if (amsTol_ < 0.0) amsTol_ = 0.0; if ((HYOutputLevel_ & HYFEI_SPECIALMASK) >= 3 && mypid_ == 0) printf(" HYPRE_LSC::parameters amsTolerance = %e\n", amsTol_); } //--------------------------------------------------------------- // ams preconditoner : print level //--------------------------------------------------------------- else if (!strcmp(param1, "amsPrintLevel")) { sscanf(params[i],"%s %d", param, &amsPrintLevel_); if (amsPrintLevel_ < 0) amsPrintLevel_ = 0; if ((HYOutputLevel_ & HYFEI_SPECIALMASK) >= 3 && mypid_ == 0) printf(" HYPRE_LSC::parameters amsPrintLevel = %d\n", amsPrintLevel_); } //---------------------------------------------------------------- // amg preconditoner : alpha coarsening type //---------------------------------------------------------------- else if ( !strcmp(param1, "amsAlphaCoarsenType") ) { sscanf(params[i],"%s %s", param, param2); if (!strcmp(param2, "cljp")) amsAlphaCoarsenType_ = 0; else if (!strcmp(param2, "ruge")) amsAlphaCoarsenType_ = 1; else if (!strcmp(param2, "ruge3c")) amsAlphaCoarsenType_ = 4; else if (!strcmp(param2, "falgout")) amsAlphaCoarsenType_ = 6; else if (!strcmp(param2, "pmis")) amsAlphaCoarsenType_ = 8; else if (!strcmp(param2, "hmis")) amsAlphaCoarsenType_ = 10; else amsAlphaCoarsenType_ = 0; if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 3 && mypid_ == 0 ) printf(" HYPRE_LSC::parameters amsAlphaCoarsenType = %s\n", param2); } //---------------------------------------------------------------- // amg preconditoner : coarsening type //---------------------------------------------------------------- else if ( !strcmp(param1, "amsBetaCoarsenType") ) { sscanf(params[i],"%s %s", param, param2); if (!strcmp(param2, "cljp")) amsBetaCoarsenType_ = 0; else if (!strcmp(param2, "ruge")) amsBetaCoarsenType_ = 1; else if (!strcmp(param2, "ruge3c")) amsBetaCoarsenType_ = 4; else if (!strcmp(param2, "falgout")) amsBetaCoarsenType_ = 6; else if (!strcmp(param2, "pmis")) amsBetaCoarsenType_ = 8; else if (!strcmp(param2, "hmis")) amsBetaCoarsenType_ = 10; else amsBetaCoarsenType_ = 0; if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 3 && mypid_ == 0 ) printf(" HYPRE_LSC::parameters amsBetaCoarsenType = %s\n", param2); } //--------------------------------------------------------------- // ams preconditoner : levels of aggresive coarseinig //--------------------------------------------------------------- else if (!strcmp(param1, "amsAlphaAggLevels")) { sscanf(params[i],"%s %d", param, &amsAlphaAggLevels_); if ((HYOutputLevel_ & HYFEI_SPECIALMASK) >= 3 && mypid_ == 0) printf(" HYPRE_LSC::parameters amsAlphaAggLevels = %d\n", amsAlphaAggLevels_); } //---------------------------------------------------------------- // ams preconditoner : interpolation type //---------------------------------------------------------------- else if ( !strcmp(param1, "amsAlphaInterpType") ) { sscanf(params[i],"%s %d", param, &amsAlphaInterpType_); if ((HYOutputLevel_ & HYFEI_SPECIALMASK) >= 3 && mypid_ == 0) printf(" HYPRE_LSC::parameters amsAlphaInterpType = %d\n", amsAlphaInterpType_); } //---------------------------------------------------------------- // ams preconditoner : interpolation truncation //---------------------------------------------------------------- else if ( !strcmp(param1, "amsAlphaPmax") ) { sscanf(params[i],"%s %d", param, &amsAlphaPmax_); if ((HYOutputLevel_ & HYFEI_SPECIALMASK) >= 3 && mypid_ == 0) printf(" HYPRE_LSC::parameters amsAlphaPmax = %d\n", amsAlphaPmax_); } //--------------------------------------------------------------- // ams preconditoner : levels of aggresive coarseinig //--------------------------------------------------------------- else if (!strcmp(param1, "amsBetaAggLevels")) { sscanf(params[i],"%s %d", param, &amsBetaAggLevels_); if ((HYOutputLevel_ & HYFEI_SPECIALMASK) >= 3 && mypid_ == 0) printf(" HYPRE_LSC::parameters amsBetaAggLevels = %d\n", amsAlphaAggLevels_); } //---------------------------------------------------------------- // ams preconditoner : interpolation type //---------------------------------------------------------------- else if ( !strcmp(param1, "amsBetaInterpType") ) { sscanf(params[i],"%s %d", param, &amsBetaInterpType_); if ((HYOutputLevel_ & HYFEI_SPECIALMASK) >= 3 && mypid_ == 0) printf(" HYPRE_LSC::parameters amsBetaInterpType = %d\n", amsBetaInterpType_); } //---------------------------------------------------------------- // ams preconditoner : interpolation truncation //---------------------------------------------------------------- else if ( !strcmp(param1, "amsBetaPmax") ) { sscanf(params[i],"%s %d", param, &amsBetaPmax_); if ((HYOutputLevel_ & HYFEI_SPECIALMASK) >= 3 && mypid_ == 0) printf(" HYPRE_LSC::parameters amsBetaPmax = %d\n", amsBetaPmax_); } //--------------------------------------------------------------- // ams preconditoner : which smoother to use //---------------------------------------------------------------- else if ( !strcmp(param1, "amsAlphaRelaxType") ) { sscanf(params[i],"%s %s", param, param2); if (!strcmp(param2, "jacobi")) amsAlphaRelaxType_ = 0; else if (!strcmp(param2, "gsSlow")) amsAlphaRelaxType_ = 1; else if (!strcmp(param2, "gsFast")) amsAlphaRelaxType_ = 4; else if (!strcmp(param2, "hybrid")) amsAlphaRelaxType_ = 3; else if (!strcmp(param2, "hybridsym")) amsAlphaRelaxType_ = 6; else if (!strcmp(param2, "l1gs" ) ) amsAlphaRelaxType_ = 8; else amsAlphaRelaxType_ = 4; if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 3 && mypid_ == 0 ) printf(" HYPRE_LSC::parameters amsAlphaRelaxType = %s\n", param2); } //--------------------------------------------------------------- // ams preconditoner : which smoother to use //---------------------------------------------------------------- else if ( !strcmp(param1, "amsBetaRelaxType") ) { sscanf(params[i],"%s %s", param, param2); if (!strcmp(param2, "jacobi")) amsBetaRelaxType_ = 0; else if (!strcmp(param2, "gsSlow")) amsBetaRelaxType_ = 1; else if (!strcmp(param2, "gsFast")) amsBetaRelaxType_ = 4; else if (!strcmp(param2, "hybrid")) amsBetaRelaxType_ = 3; else if (!strcmp(param2, "hybridsym")) amsBetaRelaxType_ = 6; else if (!strcmp(param2, "l1gs" ) ) amsBetaRelaxType_ = 8; else amsBetaRelaxType_ = 4; if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 3 && mypid_ == 0 ) printf(" HYPRE_LSC::parameters amsBetaRelaxType = %s\n", param2); } //--------------------------------------------------------------- // amg preconditoner : threshold to determine strong coupling //--------------------------------------------------------------- else if ( !strcmp(param1, "amsAlphaStrengthThreshold") ) { sscanf(params[i],"%s %lg", param, &amsAlphaStrengthThresh_); if (amsAlphaStrengthThresh_<0.0 || amsAlphaStrengthThresh_>1.0) amsAlphaStrengthThresh_ = 0.25; if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 3 && mypid_ == 0 ) printf(" HYPRE_LSC::parameters amsAlphaStrengthThresh = %e\n", amsAlphaStrengthThresh_); } //--------------------------------------------------------------- // amg preconditoner : threshold to determine strong coupling //--------------------------------------------------------------- else if ( !strcmp(param1, "amsBetaStrengthThreshold") ) { sscanf(params[i],"%s %lg", param, &amsBetaStrengthThresh_); if (amsBetaStrengthThresh_<0.0 || amsBetaStrengthThresh_>1.0) amsBetaStrengthThresh_ = 0.25; if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 3 && mypid_ == 0 ) printf(" HYPRE_LSC::parameters amsBetaStrengthThresh = %e\n", amsBetaStrengthThresh_); } //--------------------------------------------------------------- // syspde preconditoner : nvars //--------------------------------------------------------------- else if ( !strcmp(param1, "syspdeNVars") ) { sscanf(params[i],"%s %d", param, &sysPDENVars_); if (sysPDENVars_<0 || sysPDENVars_>10) sysPDENVars_ = 1; if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 3 && mypid_ == 0 ) printf(" HYPRE_LSC::parameters syspdeNVars = %d\n", sysPDENVars_); } else recognized = 0; } //--------------------------------------------------------------- // error //--------------------------------------------------------------- if (!recognized) { if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 2 && mypid_ == 0 ) printf("HYPRE_LSC::parameters WARNING : %s not recognized\n", params[i]); } } //------------------------------------------------------------------- // if reuse is requested, set preconditioner reuse flag //------------------------------------------------------------------- if ( reuse == 1 ) HYPreconReuse_ = 1; if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 3 ) printf("%4d : HYPRE_LSC::leaving parameters function.\n",mypid_); return(0); } //*************************************************************************** // set up preconditioners for PCG //--------------------------------------------------------------------------- void HYPRE_LinSysCore::setupPCGPrecon() { //------------------------------------------------------------------- // if matrix has been reloaded, reset preconditioner //------------------------------------------------------------------- if ( HYPreconReuse_ == 0 && HYPreconSetup_ == 1 ) selectPreconditioner( HYPreconName_ ); //------------------------------------------------------------------- // set up preconditioners //------------------------------------------------------------------- switch ( HYPreconID_ ) { case HYIDENTITY : if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 1 && mypid_ == 0 ) printf("No preconditioning \n"); HYPRE_ParCSRPCGSetPrecond(HYSolver_, HYPRE_LSI_SolveIdentity, HYPRE_DummyFunction, HYPrecon_); break; case HYDIAGONAL : if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 1 && mypid_ == 0 ) printf("Diagonal preconditioning \n"); if ( HYPreconReuse_ == 1 && HYPreconSetup_ == 1 ) HYPRE_ParCSRPCGSetPrecond(HYSolver_, HYPRE_ParCSRDiagScale, HYPRE_DummyFunction, HYPrecon_); else { HYPRE_ParCSRPCGSetPrecond(HYSolver_, HYPRE_ParCSRDiagScale, HYPRE_ParCSRDiagScaleSetup,HYPrecon_); HYPreconSetup_ = 1; } break; case HYPILUT : if ( mypid_ == 0 ) printf("HYPRE_LSI : PCG does not work with pilut.\n"); exit(1); break; case HYDDILUT : if ( mypid_ == 0 ) printf("HYPRE_LSI : PCG does not work with ddilut.\n"); exit(1); break; case HYDDICT : if ( HYPreconReuse_ == 1 && HYPreconSetup_ == 1 ) HYPRE_ParCSRPCGSetPrecond(HYSolver_, HYPRE_LSI_DDICTSolve, HYPRE_DummyFunction, HYPrecon_); else { setupPreconDDICT(); HYPRE_ParCSRPCGSetPrecond(HYSolver_, HYPRE_LSI_DDICTSolve, HYPRE_LSI_DDICTSetup, HYPrecon_); HYPreconSetup_ = 1; } break; case HYSCHWARZ : if ( HYPreconReuse_ == 1 && HYPreconSetup_ == 1 ) HYPRE_ParCSRPCGSetPrecond(HYSolver_, HYPRE_LSI_SchwarzSolve, HYPRE_DummyFunction, HYPrecon_); else { setupPreconSchwarz(); HYPRE_ParCSRPCGSetPrecond(HYSolver_, HYPRE_LSI_SchwarzSolve, HYPRE_LSI_SchwarzSetup, HYPrecon_); HYPreconSetup_ = 1; } break; case HYPOLY : if ( HYPreconReuse_ == 1 && HYPreconSetup_ == 1 ) HYPRE_ParCSRPCGSetPrecond(HYSolver_, HYPRE_LSI_PolySolve, HYPRE_DummyFunction, HYPrecon_); else { setupPreconPoly(); HYPRE_ParCSRPCGSetPrecond(HYSolver_, HYPRE_LSI_PolySolve, HYPRE_LSI_PolySetup, HYPrecon_); HYPreconSetup_ = 1; } break; case HYPARASAILS : if ( HYPreconReuse_ == 1 && HYPreconSetup_ == 1 ) HYPRE_ParCSRPCGSetPrecond(HYSolver_, HYPRE_ParCSRParaSailsSolve, HYPRE_DummyFunction, HYPrecon_); else { setupPreconParaSails(); HYPRE_ParCSRPCGSetPrecond(HYSolver_, HYPRE_ParCSRParaSailsSolve, HYPRE_ParCSRParaSailsSetup, HYPrecon_); HYPreconSetup_ = 1; } break; case HYBOOMERAMG : if ( HYPreconReuse_ == 1 && HYPreconSetup_ == 1 ) HYPRE_ParCSRPCGSetPrecond(HYSolver_, HYPRE_BoomerAMGSolve, HYPRE_DummyFunction, HYPrecon_); else { setupPreconBoomerAMG(); HYPRE_ParCSRPCGSetPrecond(HYSolver_, HYPRE_BoomerAMGSolve, HYPRE_BoomerAMGSetup, HYPrecon_); HYPreconSetup_ = 1; } break; case HYEUCLID : if ( HYPreconReuse_ == 1 && HYPreconSetup_ == 1 ) HYPRE_ParCSRPCGSetPrecond(HYSolver_, HYPRE_EuclidSolve, HYPRE_DummyFunction, HYPrecon_); else { setupPreconEuclid(); HYPRE_ParCSRPCGSetPrecond(HYSolver_, HYPRE_EuclidSolve, HYPRE_EuclidSetup, HYPrecon_); HYPreconSetup_ = 1; } break; case HYBLOCK : printf("PCG : block preconditioning not available.\n"); exit(1); break; case HYML : #ifdef HAVE_ML if ( HYPreconReuse_ == 1 && HYPreconSetup_ == 1 ) HYPRE_ParCSRPCGSetPrecond(HYSolver_, HYPRE_LSI_MLSolve, HYPRE_DummyFunction, HYPrecon_); else { setupPreconML(); HYPRE_ParCSRPCGSetPrecond(HYSolver_, HYPRE_LSI_MLSolve, HYPRE_LSI_MLSetup, HYPrecon_); HYPreconSetup_ = 1; } #else printf("PCG : ML preconditioning not available.\n"); #endif break; case HYMLMAXWELL : #ifdef HAVE_MLMAXWELL if ( HYPreconReuse_ == 1 && HYPreconSetup_ == 1 ) HYPRE_ParCSRPCGSetPrecond(HYSolver_, HYPRE_LSI_MLMaxwellSolve, HYPRE_DummyFunction, HYPrecon_); else { setupPreconMLMaxwell(); HYPRE_ParCSRPCGSetPrecond(HYSolver_, HYPRE_LSI_MLMaxwellSolve, HYPRE_LSI_MLMaxwellSetup, HYPrecon_); HYPreconSetup_ = 1; } #else printf("PCG : ML preconditioning not available.\n"); #endif break; case HYMLI : #ifdef HAVE_MLI if ((HYOutputLevel_ & HYFEI_SPECIALMASK) >= 1 && mypid_ == 0) printf("MLI preconditioning\n"); if ( HYPreconReuse_ == 1 && HYPreconSetup_ == 1 ) HYPRE_ParCSRPCGSetPrecond(HYSolver_, HYPRE_LSI_MLISolve, HYPRE_DummyFunction, HYPrecon_); else { HYPRE_ParCSRPCGSetPrecond(HYSolver_,HYPRE_LSI_MLISolve, HYPRE_LSI_MLISetup, HYPrecon_); HYPreconSetup_ = 1; } #else printf("PCG : MLI preconditioning not available.\n"); #endif break; case HYAMS : if ((HYOutputLevel_ & HYFEI_SPECIALMASK) >= 1 && mypid_ == 0) printf("AMS preconditioning\n"); if ( HYPreconReuse_ == 1 && HYPreconSetup_ == 1 ) HYPRE_ParCSRPCGSetPrecond(HYSolver_, HYPRE_AMSSolve, HYPRE_DummyFunction, HYPrecon_); else { setupPreconAMS(); HYPRE_ParCSRPCGSetPrecond(HYSolver_,HYPRE_AMSSolve, HYPRE_AMSSetup, HYPrecon_); HYPreconSetup_ = 1; } break; case HYUZAWA : printf("PCG : Uzawa preconditioning not available.\n"); exit(1); break; case HYSYSPDE : #ifdef HAVE_SYSPDE if ((HYOutputLevel_ & HYFEI_SPECIALMASK) >= 1 && mypid_ == 0) printf("SysPDe preconditioning\n"); if ( HYPreconReuse_ == 1 && HYPreconSetup_ == 1 ) HYPRE_ParCSRPCGSetPrecond(HYSolver_, HYPRE_ParCSRSysPDESolve, HYPRE_DummyFunction, HYPrecon_); else { setupPreconSysPDE(); HYPRE_ParCSRPCGSetPrecond(HYSolver_, HYPRE_ParCSRSysPDESolve, HYPRE_ParCSRSysPDESetup, HYPrecon_); HYPreconSetup_ = 1; } #else printf("PCG : SysPDE preconditioning not available.\n"); #endif break; case HYDSLU : #ifdef HYPRE_USING_DSUPERLU if ((HYOutputLevel_ & HYFEI_SPECIALMASK) >= 1 && mypid_ == 0) printf("DSuperLU preconditioning\n"); if ( HYPreconReuse_ == 1 && HYPreconSetup_ == 1 ) HYPRE_ParCSRPCGSetPrecond(HYSolver_, HYPRE_LSI_DSuperLUSolve, HYPRE_DummyFunction, HYPrecon_); else { HYPRE_LSI_DSuperLUSetOutputLevel(HYPrecon_, HYOutputLevel_); HYPRE_ParCSRPCGSetPrecond(HYSolver_, HYPRE_LSI_DSuperLUSolve, HYPRE_LSI_DSuperLUSetup, HYPrecon_); HYPreconSetup_ = 1; } #else printf("PCG : DSuperLU preconditioning not available.\n"); #endif } return; } //*************************************************************************** // set up preconditioners for LSICG //--------------------------------------------------------------------------- void HYPRE_LinSysCore::setupLSICGPrecon() { //------------------------------------------------------------------- // if matrix has been reloaded, reset preconditioner //------------------------------------------------------------------- if ( HYPreconReuse_ == 0 && HYPreconSetup_ == 1 ) selectPreconditioner( HYPreconName_ ); //------------------------------------------------------------------- // set up preconditioners //------------------------------------------------------------------- switch ( HYPreconID_ ) { case HYIDENTITY : if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 1 && mypid_ == 0 ) printf("No preconditioning \n"); HYPRE_ParCSRLSICGSetPrecond(HYSolver_, HYPRE_LSI_SolveIdentity, HYPRE_DummyFunction, HYPrecon_); break; case HYDIAGONAL : if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 1 && mypid_ == 0 ) printf("Diagonal preconditioning \n"); if ( HYPreconReuse_ == 1 && HYPreconSetup_ == 1 ) HYPRE_ParCSRLSICGSetPrecond(HYSolver_, HYPRE_ParCSRDiagScale, HYPRE_DummyFunction, HYPrecon_); else { HYPRE_ParCSRLSICGSetPrecond(HYSolver_, HYPRE_ParCSRDiagScale, HYPRE_ParCSRDiagScaleSetup,HYPrecon_); HYPreconSetup_ = 1; } break; case HYPILUT : if ( mypid_ == 0 ) printf("HYPRE_LSI : LSICG does not work with pilut.\n"); exit(1); break; case HYDDILUT : if ( mypid_ == 0 ) printf("HYPRE_LSI : LSICG does not work with ddilut.\n"); exit(1); break; case HYDDICT : if ( HYPreconReuse_ == 1 && HYPreconSetup_ == 1 ) HYPRE_ParCSRLSICGSetPrecond(HYSolver_, HYPRE_LSI_DDICTSolve, HYPRE_DummyFunction, HYPrecon_); else { setupPreconDDICT(); HYPRE_ParCSRLSICGSetPrecond(HYSolver_, HYPRE_LSI_DDICTSolve, HYPRE_LSI_DDICTSetup, HYPrecon_); HYPreconSetup_ = 1; } break; case HYSCHWARZ : if ( mypid_ == 0 ) printf("HYPRE_LSI : LSICG does not work with Schwarz.\n"); exit(1); break; case HYPOLY : if ( HYPreconReuse_ == 1 && HYPreconSetup_ == 1 ) HYPRE_ParCSRLSICGSetPrecond(HYSolver_, HYPRE_LSI_PolySolve, HYPRE_DummyFunction, HYPrecon_); else { setupPreconPoly(); HYPRE_ParCSRLSICGSetPrecond(HYSolver_, HYPRE_LSI_PolySolve, HYPRE_LSI_PolySetup, HYPrecon_); HYPreconSetup_ = 1; } break; case HYPARASAILS : if ( HYPreconReuse_ == 1 && HYPreconSetup_ == 1 ) HYPRE_ParCSRLSICGSetPrecond(HYSolver_,HYPRE_ParCSRParaSailsSolve, HYPRE_DummyFunction, HYPrecon_); else { setupPreconParaSails(); HYPRE_ParCSRLSICGSetPrecond(HYSolver_, HYPRE_ParCSRParaSailsSolve, HYPRE_ParCSRParaSailsSetup,HYPrecon_); HYPreconSetup_ = 1; } break; case HYBOOMERAMG : if ( HYPreconReuse_ == 1 && HYPreconSetup_ == 1 ) HYPRE_ParCSRLSICGSetPrecond(HYSolver_, HYPRE_BoomerAMGSolve, HYPRE_DummyFunction, HYPrecon_); else { setupPreconBoomerAMG(); HYPRE_ParCSRLSICGSetPrecond(HYSolver_, HYPRE_BoomerAMGSolve, HYPRE_BoomerAMGSetup, HYPrecon_); HYPreconSetup_ = 1; } break; case HYEUCLID : if ( mypid_ == 0 ) printf("HYPRE_LSI : LSICG does not work with Euclid.\n"); exit(1); break; case HYBLOCK : if ( mypid_ == 0 ) printf("HYPRE_LSI : LSICG does not work with blkprec.\n"); exit(1); break; case HYML : printf("HYPRE_LSI : LSICG - MLI preconditioning not available.\n"); break; case HYMLMAXWELL : printf("HYPRE_LSI : LSICG - MLMAXWELL not available.\n"); break; case HYMLI : #ifdef HAVE_MLI if ((HYOutputLevel_ & HYFEI_SPECIALMASK) >= 1 && mypid_ == 0) printf("MLI preconditioning\n"); if ( HYPreconReuse_ == 1 && HYPreconSetup_ == 1 ) HYPRE_ParCSRLSICGSetPrecond(HYSolver_, HYPRE_LSI_MLISolve, HYPRE_DummyFunction, HYPrecon_); else { HYPRE_ParCSRLSICGSetPrecond(HYSolver_,HYPRE_LSI_MLISolve, HYPRE_LSI_MLISetup, HYPrecon_); HYPreconSetup_ = 1; } #else printf("HYPRE_LSI LSICG : MLI preconditioning not available.\n"); #endif break; case HYUZAWA : if ( mypid_ == 0 ) printf("HYPRE_LSI : LSICG does not work with Uzawa.\n"); exit(1); break; default : printf("CG : preconditioner unknown.\n"); exit(1); break; } return; } //*************************************************************************** // set up preconditioners for GMRES //--------------------------------------------------------------------------- void HYPRE_LinSysCore::setupGMRESPrecon() { //------------------------------------------------------------------- // if matrix has been reloaded, reset preconditioner //------------------------------------------------------------------- if ( HYPreconReuse_ == 0 && HYPreconSetup_ == 1 ) selectPreconditioner( HYPreconName_ ); //------------------------------------------------------------------- // set up preconditioners //------------------------------------------------------------------- switch ( HYPreconID_ ) { case HYIDENTITY : if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 1 && mypid_ == 0 ) printf("No preconditioning \n"); HYPRE_ParCSRGMRESSetPrecond(HYSolver_, HYPRE_LSI_SolveIdentity, HYPRE_DummyFunction, HYPrecon_); break; case HYDIAGONAL : if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 1 && mypid_ == 0 ) printf("Diagonal preconditioning \n"); if ( HYPreconReuse_ == 1 && HYPreconSetup_ == 1 ) HYPRE_ParCSRGMRESSetPrecond(HYSolver_, HYPRE_ParCSRDiagScale, HYPRE_DummyFunction, HYPrecon_); else { HYPRE_ParCSRGMRESSetPrecond(HYSolver_, HYPRE_ParCSRDiagScale, HYPRE_ParCSRDiagScaleSetup,HYPrecon_); HYPreconSetup_ = 1; } break; case HYPILUT : if ( HYPreconReuse_ == 1 && HYPreconSetup_ == 1 ) HYPRE_ParCSRGMRESSetPrecond(HYSolver_, HYPRE_ParCSRPilutSolve, HYPRE_DummyFunction, HYPrecon_); else { setupPreconPILUT(); HYPRE_ParCSRGMRESSetPrecond(HYSolver_, HYPRE_ParCSRPilutSolve, HYPRE_ParCSRPilutSetup, HYPrecon_); HYPreconSetup_ = 1; } break; case HYDDILUT : if ( HYPreconReuse_ == 1 && HYPreconSetup_ == 1 ) HYPRE_ParCSRGMRESSetPrecond(HYSolver_, HYPRE_LSI_DDIlutSolve, HYPRE_DummyFunction, HYPrecon_); else { setupPreconDDILUT(); HYPRE_ParCSRGMRESSetPrecond(HYSolver_, HYPRE_LSI_DDIlutSolve, HYPRE_LSI_DDIlutSetup, HYPrecon_); HYPreconSetup_ = 1; } break; case HYDDICT : if ( HYPreconReuse_ == 1 && HYPreconSetup_ == 1 ) HYPRE_ParCSRGMRESSetPrecond(HYSolver_, HYPRE_LSI_DDICTSolve, HYPRE_DummyFunction, HYPrecon_); else { setupPreconDDICT(); HYPRE_ParCSRGMRESSetPrecond(HYSolver_, HYPRE_LSI_DDICTSolve, HYPRE_LSI_DDICTSetup, HYPrecon_); HYPreconSetup_ = 1; } break; case HYSCHWARZ : if ( HYPreconReuse_ == 1 && HYPreconSetup_ == 1 ) HYPRE_ParCSRGMRESSetPrecond(HYSolver_, HYPRE_LSI_SchwarzSolve, HYPRE_DummyFunction, HYPrecon_); else { setupPreconSchwarz(); HYPRE_ParCSRGMRESSetPrecond(HYSolver_, HYPRE_LSI_SchwarzSolve, HYPRE_LSI_SchwarzSetup, HYPrecon_); HYPreconSetup_ = 1; } break; case HYPOLY : if ( HYPreconReuse_ == 1 && HYPreconSetup_ == 1 ) HYPRE_ParCSRGMRESSetPrecond(HYSolver_, HYPRE_LSI_PolySolve, HYPRE_DummyFunction, HYPrecon_); else { setupPreconPoly(); HYPRE_ParCSRGMRESSetPrecond(HYSolver_, HYPRE_LSI_PolySolve, HYPRE_LSI_PolySetup, HYPrecon_); HYPreconSetup_ = 1; } break; case HYPARASAILS : if ( HYPreconReuse_ == 1 && HYPreconSetup_ == 1 ) HYPRE_ParCSRGMRESSetPrecond(HYSolver_,HYPRE_ParCSRParaSailsSolve, HYPRE_DummyFunction, HYPrecon_); else { setupPreconParaSails(); HYPRE_ParCSRGMRESSetPrecond(HYSolver_,HYPRE_ParCSRParaSailsSolve, HYPRE_ParCSRParaSailsSetup,HYPrecon_); HYPreconSetup_ = 1; } break; case HYBOOMERAMG : if ( HYPreconReuse_ == 1 && HYPreconSetup_ == 1 ) HYPRE_ParCSRGMRESSetPrecond(HYSolver_,HYPRE_BoomerAMGSolve, HYPRE_DummyFunction, HYPrecon_); else { setupPreconBoomerAMG(); HYPRE_ParCSRGMRESSetPrecond(HYSolver_, HYPRE_BoomerAMGSolve, HYPRE_BoomerAMGSetup, HYPrecon_); HYPreconSetup_ = 1; } break; case HYEUCLID : if ( HYPreconReuse_ == 1 && HYPreconSetup_ == 1 ) HYPRE_ParCSRGMRESSetPrecond(HYSolver_, HYPRE_EuclidSolve, HYPRE_DummyFunction, HYPrecon_); else { setupPreconEuclid(); HYPRE_ParCSRGMRESSetPrecond(HYSolver_, HYPRE_EuclidSolve, HYPRE_EuclidSetup, HYPrecon_); HYPreconSetup_ = 1; } break; case HYBLOCK : printf("GMRES : block preconditioning not available.\n"); exit(1); break; case HYML : #ifdef HAVE_ML if ( HYPreconReuse_ == 1 && HYPreconSetup_ == 1 ) HYPRE_ParCSRGMRESSetPrecond(HYSolver_, HYPRE_LSI_MLSolve, HYPRE_DummyFunction, HYPrecon_); else { setupPreconML(); HYPRE_ParCSRGMRESSetPrecond(HYSolver_,HYPRE_LSI_MLSolve, HYPRE_LSI_MLSetup, HYPrecon_); HYPreconSetup_ = 1; } #else printf("GMRES : ML preconditioning not available.\n"); #endif break; case HYMLMAXWELL : #ifdef HAVE_MLMAXWELL if ( HYPreconReuse_ == 1 && HYPreconSetup_ == 1 ) HYPRE_ParCSRGMRESSetPrecond(HYSolver_, HYPRE_LSI_MLMaxwellSolve, HYPRE_DummyFunction, HYPrecon_); else { setupPreconMLMaxwell(); HYPRE_ParCSRGMRESSetPrecond(HYSolver_,HYPRE_LSI_MLMaxwellSolve, HYPRE_LSI_MLMaxwellSetup, HYPrecon_); HYPreconSetup_ = 1; } #else printf("GMRES : ML preconditioning not available.\n"); #endif break; case HYMLI : #ifdef HAVE_MLI if ((HYOutputLevel_ & HYFEI_SPECIALMASK) >= 1 && mypid_ == 0) printf("MLI preconditioning \n"); if ( HYPreconReuse_ == 1 && HYPreconSetup_ == 1 ) HYPRE_ParCSRGMRESSetPrecond(HYSolver_, HYPRE_LSI_MLISolve, HYPRE_DummyFunction, HYPrecon_); else { HYPRE_ParCSRGMRESSetPrecond(HYSolver_,HYPRE_LSI_MLISolve, HYPRE_LSI_MLISetup, HYPrecon_); HYPreconSetup_ = 1; } #else printf("GMRES : MLI preconditioning not available.\n"); #endif break; case HYUZAWA : printf("GMRES : Uzawa preconditioning not available.\n"); exit(1); break; case HYAMS : if ((HYOutputLevel_ & HYFEI_SPECIALMASK) >= 1 && mypid_ == 0) printf("AMS preconditioning\n"); if ( HYPreconReuse_ == 1 && HYPreconSetup_ == 1 ) HYPRE_ParCSRGMRESSetPrecond(HYSolver_,HYPRE_AMSSolve, HYPRE_DummyFunction, HYPrecon_); else { setupPreconAMS(); HYPRE_ParCSRGMRESSetPrecond(HYSolver_, HYPRE_AMSSolve, HYPRE_AMSSetup, HYPrecon_); HYPreconSetup_ = 1; } break; case HYSYSPDE : #ifdef HY_SYSPDE if ((HYOutputLevel_ & HYFEI_SPECIALMASK) >= 1 && mypid_ == 0) printf("SysPDe preconditioning\n"); if ( HYPreconReuse_ == 1 && HYPreconSetup_ == 1 ) HYPRE_ParCSRGMRESSetPrecond(HYSolver_, HYPRE_ParCSRSysPDESolve, HYPRE_DummyFunction, HYPrecon_); else { setupPreconSysPDE(); HYPRE_ParCSRGMRESSetPrecond(HYSolver_, HYPRE_ParCSRSysPDESolve, HYPRE_ParCSRSysPDESetup, HYPrecon_); HYPreconSetup_ = 1; } #else printf("GMRES : SysPDe preconditioning not available.\n"); #endif break; case HYDSLU : #ifdef HYPRE_USING_DSUPERLU if ((HYOutputLevel_ & HYFEI_SPECIALMASK) >= 1 && mypid_ == 0) printf("DSuperLU preconditioning\n"); if ( HYPreconReuse_ == 1 && HYPreconSetup_ == 1 ) HYPRE_ParCSRGMRESSetPrecond(HYSolver_, HYPRE_LSI_DSuperLUSolve, HYPRE_DummyFunction, HYPrecon_); else { HYPRE_LSI_DSuperLUSetOutputLevel(HYPrecon_, HYOutputLevel_); HYPRE_ParCSRGMRESSetPrecond(HYSolver_, HYPRE_LSI_DSuperLUSolve, HYPRE_LSI_DSuperLUSetup, HYPrecon_); HYPreconSetup_ = 1; } #else printf("GMRES : DSuperLU preconditioning not available.\n"); #endif break; } return; } //*************************************************************************** // set up preconditioners for FGMRES //--------------------------------------------------------------------------- void HYPRE_LinSysCore::setupFGMRESPrecon() { //------------------------------------------------------------------- // if matrix has been reloaded, reset preconditioner //------------------------------------------------------------------- if ( HYPreconReuse_ == 0 && HYPreconSetup_ == 1 ) selectPreconditioner( HYPreconName_ ); //------------------------------------------------------------------- // set up preconditioners //------------------------------------------------------------------- switch ( HYPreconID_ ) { case HYIDENTITY : if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 1 && mypid_ == 0 ) printf("No preconditioning \n"); HYPRE_ParCSRFGMRESSetPrecond(HYSolver_, HYPRE_LSI_SolveIdentity, HYPRE_DummyFunction, HYPrecon_); break; case HYDIAGONAL : if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 1 && mypid_ == 0 ) printf("Diagonal preconditioning \n"); if ( HYPreconReuse_ == 1 && HYPreconSetup_ == 1 ) HYPRE_ParCSRFGMRESSetPrecond(HYSolver_, HYPRE_ParCSRDiagScale, HYPRE_DummyFunction, HYPrecon_); else { HYPRE_ParCSRFGMRESSetPrecond(HYSolver_, HYPRE_ParCSRDiagScale, HYPRE_ParCSRDiagScaleSetup,HYPrecon_); HYPreconSetup_ = 1; } break; case HYPILUT : if ( HYPreconReuse_ == 1 && HYPreconSetup_ == 1 ) HYPRE_ParCSRGMRESSetPrecond(HYSolver_, HYPRE_ParCSRPilutSolve, HYPRE_DummyFunction, HYPrecon_); else { setupPreconPILUT(); HYPRE_ParCSRFGMRESSetPrecond(HYSolver_, HYPRE_ParCSRPilutSolve, HYPRE_ParCSRPilutSetup, HYPrecon_); HYPreconSetup_ = 1; } break; case HYDDILUT : if ( HYPreconReuse_ == 1 && HYPreconSetup_ == 1 ) HYPRE_ParCSRFGMRESSetPrecond(HYSolver_, HYPRE_LSI_DDIlutSolve, HYPRE_DummyFunction, HYPrecon_); else { setupPreconDDILUT(); HYPRE_ParCSRFGMRESSetPrecond(HYSolver_, HYPRE_LSI_DDIlutSolve, HYPRE_LSI_DDIlutSetup, HYPrecon_); HYPreconSetup_ = 1; } break; case HYDDICT : if ( HYPreconReuse_ == 1 && HYPreconSetup_ == 1 ) HYPRE_ParCSRFGMRESSetPrecond(HYSolver_, HYPRE_LSI_DDICTSolve, HYPRE_DummyFunction, HYPrecon_); else { setupPreconDDICT(); HYPRE_ParCSRFGMRESSetPrecond(HYSolver_, HYPRE_LSI_DDICTSolve, HYPRE_LSI_DDICTSetup, HYPrecon_); HYPreconSetup_ = 1; } break; case HYSCHWARZ : if ( HYPreconReuse_ == 1 && HYPreconSetup_ == 1 ) HYPRE_ParCSRGMRESSetPrecond(HYSolver_, HYPRE_LSI_SchwarzSolve, HYPRE_DummyFunction, HYPrecon_); else { setupPreconSchwarz(); HYPRE_ParCSRFGMRESSetPrecond(HYSolver_, HYPRE_LSI_SchwarzSolve, HYPRE_LSI_SchwarzSetup, HYPrecon_); HYPreconSetup_ = 1; } break; case HYPOLY : if ( HYPreconReuse_ == 1 && HYPreconSetup_ == 1 ) HYPRE_ParCSRFGMRESSetPrecond(HYSolver_, HYPRE_LSI_PolySolve, HYPRE_DummyFunction, HYPrecon_); else { setupPreconPoly(); HYPRE_ParCSRFGMRESSetPrecond(HYSolver_, HYPRE_LSI_PolySolve, HYPRE_LSI_PolySetup, HYPrecon_); HYPreconSetup_ = 1; } break; case HYPARASAILS : if ( HYPreconReuse_ == 1 && HYPreconSetup_ == 1 ) HYPRE_ParCSRFGMRESSetPrecond(HYSolver_,HYPRE_ParCSRParaSailsSolve, HYPRE_DummyFunction, HYPrecon_); else { setupPreconParaSails(); HYPRE_ParCSRFGMRESSetPrecond(HYSolver_,HYPRE_ParCSRParaSailsSolve, HYPRE_ParCSRParaSailsSetup,HYPrecon_); HYPreconSetup_ = 1; } break; case HYBOOMERAMG : if ( HYPreconReuse_ == 1 && HYPreconSetup_ == 1 ) HYPRE_ParCSRFGMRESSetPrecond(HYSolver_,HYPRE_BoomerAMGSolve, HYPRE_DummyFunction, HYPrecon_); else { setupPreconBoomerAMG(); HYPRE_ParCSRFGMRESSetPrecond(HYSolver_, HYPRE_BoomerAMGSolve, HYPRE_BoomerAMGSetup, HYPrecon_); HYPreconSetup_ = 1; } break; case HYEUCLID : if ( HYPreconReuse_ == 1 && HYPreconSetup_ == 1 ) HYPRE_ParCSRFGMRESSetPrecond(HYSolver_, HYPRE_EuclidSolve, HYPRE_DummyFunction, HYPrecon_); else { setupPreconEuclid(); HYPRE_ParCSRFGMRESSetPrecond(HYSolver_, HYPRE_EuclidSolve, HYPRE_EuclidSetup, HYPrecon_); HYPreconSetup_ = 1; } break; case HYBLOCK : if ( HYPreconReuse_ == 1 && HYPreconSetup_ == 1 ) HYPRE_ParCSRFGMRESSetPrecond(HYSolver_, HYPRE_LSI_BlockPrecondSolve, HYPRE_DummyFunction, HYPrecon_); else { setupPreconBlock(); HYPRE_ParCSRFGMRESSetPrecond(HYSolver_, HYPRE_LSI_BlockPrecondSolve, HYPRE_LSI_BlockPrecondSetup, HYPrecon_); HYPreconSetup_ = 1; } break; case HYML : #ifdef HAVE_ML if ( HYPreconReuse_ == 1 && HYPreconSetup_ == 1 ) HYPRE_ParCSRFGMRESSetPrecond(HYSolver_, HYPRE_LSI_MLSolve, HYPRE_DummyFunction, HYPrecon_); else { setupPreconML(); HYPRE_ParCSRFGMRESSetPrecond(HYSolver_,HYPRE_LSI_MLSolve, HYPRE_LSI_MLSetup, HYPrecon_); HYPreconSetup_ = 1; } #else printf("FGMRES : ML preconditioning not available.\n"); #endif break; case HYMLMAXWELL : printf("FGMRES : MLMaxwell preconditioning not available.\n"); break; case HYMLI : #ifdef HAVE_MLI if ((HYOutputLevel_ & HYFEI_SPECIALMASK) >= 1 && mypid_ == 0) printf("MLI preconditioning \n"); if ( HYPreconReuse_ == 1 && HYPreconSetup_ == 1 ) HYPRE_ParCSRFGMRESSetPrecond(HYSolver_, HYPRE_LSI_MLISolve, HYPRE_DummyFunction, HYPrecon_); else { HYPRE_ParCSRFGMRESSetPrecond(HYSolver_,HYPRE_LSI_MLISolve, HYPRE_LSI_MLISetup, HYPrecon_); HYPreconSetup_ = 1; } #else printf("FGMRES : ML preconditioning not available.\n"); #endif break; case HYUZAWA : if ((HYOutputLevel_ & HYFEI_SPECIALMASK) >= 1 && mypid_ == 0) printf("Uzawa preconditioning \n"); if ( HYPreconReuse_ == 1 && HYPreconSetup_ == 1 ) HYPRE_ParCSRFGMRESSetPrecond(HYSolver_, HYPRE_LSI_UzawaSolve, HYPRE_DummyFunction, HYPrecon_); else { HYPRE_ParCSRFGMRESSetPrecond(HYSolver_,HYPRE_LSI_UzawaSolve, HYPRE_LSI_UzawaSetup, HYPrecon_); HYPreconSetup_ = 1; } break; case HYAMS : if ((HYOutputLevel_ & HYFEI_SPECIALMASK) >= 1 && mypid_ == 0) printf("AMS preconditioning\n"); if ( HYPreconReuse_ == 1 && HYPreconSetup_ == 1 ) HYPRE_ParCSRFGMRESSetPrecond(HYSolver_,HYPRE_AMSSolve, HYPRE_DummyFunction, HYPrecon_); else { setupPreconAMS(); HYPRE_ParCSRFGMRESSetPrecond(HYSolver_, HYPRE_AMSSolve, HYPRE_AMSSetup, HYPrecon_); HYPreconSetup_ = 1; } break; case HYSYSPDE : #ifdef HY_SYSPDE if ((HYOutputLevel_ & HYFEI_SPECIALMASK) >= 1 && mypid_ == 0) printf("SysPDe preconditioning\n"); if ( HYPreconReuse_ == 1 && HYPreconSetup_ == 1 ) HYPRE_ParCSRFGMRESSetPrecond(HYSolver_, HYPRE_ParCSRSysPDESolve, HYPRE_DummyFunction, HYPrecon_); else { setupPreconSysPDE(); HYPRE_ParCSRFGMRESSetPrecond(HYSolver_, HYPRE_ParCSRSysPDESolve, HYPRE_ParCSRSysPDESetup, HYPrecon_); HYPreconSetup_ = 1; } #else printf("FGMRES : SysPDe preconditioning not available.\n"); #endif break; case HYDSLU : #ifdef HYPRE_USING_DSUPERLU if ((HYOutputLevel_ & HYFEI_SPECIALMASK) >= 1 && mypid_ == 0) printf("DSuperLU preconditioning\n"); if ( HYPreconReuse_ == 1 && HYPreconSetup_ == 1 ) HYPRE_ParCSRFGMRESSetPrecond(HYSolver_, HYPRE_LSI_DSuperLUSolve, HYPRE_DummyFunction, HYPrecon_); else { HYPRE_LSI_DSuperLUSetOutputLevel(HYPrecon_, HYOutputLevel_); HYPRE_ParCSRFGMRESSetPrecond(HYSolver_, HYPRE_LSI_DSuperLUSolve, HYPRE_LSI_DSuperLUSetup, HYPrecon_); HYPreconSetup_ = 1; } #else printf("FGMRES : DSuperLU preconditioning not available.\n"); #endif break; } return; } //*************************************************************************** // set up preconditioners for BiCGSTAB //--------------------------------------------------------------------------- void HYPRE_LinSysCore::setupBiCGSTABPrecon() { //------------------------------------------------------------------- // if matrix has been reloaded, reset preconditioner //------------------------------------------------------------------- if ( HYPreconReuse_ == 0 && HYPreconSetup_ == 1 ) selectPreconditioner( HYPreconName_ ); //------------------------------------------------------------------- // set up preconditioners //------------------------------------------------------------------- switch ( HYPreconID_ ) { case HYIDENTITY : if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 1 && mypid_ == 0 ) printf("No preconditioning \n"); HYPRE_ParCSRBiCGSTABSetPrecond(HYSolver_, HYPRE_LSI_SolveIdentity, HYPRE_DummyFunction, HYPrecon_); break; case HYDIAGONAL : if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 1 && mypid_ == 0 ) printf("Diagonal preconditioning \n"); if ( HYPreconReuse_ == 1 && HYPreconSetup_ == 1 ) HYPRE_ParCSRBiCGSTABSetPrecond(HYSolver_, HYPRE_ParCSRDiagScale, HYPRE_DummyFunction, HYPrecon_); else { HYPRE_ParCSRBiCGSTABSetPrecond(HYSolver_, HYPRE_ParCSRDiagScale, HYPRE_ParCSRDiagScaleSetup,HYPrecon_); HYPreconSetup_ = 1; } break; case HYPILUT : if ( HYPreconReuse_ == 1 && HYPreconSetup_ == 1 ) HYPRE_ParCSRBiCGSTABSetPrecond(HYSolver_, HYPRE_ParCSRPilutSolve, HYPRE_DummyFunction, HYPrecon_); else { setupPreconPILUT(); HYPRE_ParCSRBiCGSTABSetPrecond(HYSolver_, HYPRE_ParCSRPilutSolve, HYPRE_ParCSRPilutSetup,HYPrecon_); HYPreconSetup_ = 1; } break; case HYDDILUT : if ( HYPreconReuse_ == 1 && HYPreconSetup_ == 1 ) HYPRE_ParCSRBiCGSTABSetPrecond(HYSolver_, HYPRE_LSI_DDIlutSolve, HYPRE_DummyFunction, HYPrecon_); else { setupPreconDDILUT(); HYPRE_ParCSRBiCGSTABSetPrecond(HYSolver_, HYPRE_LSI_DDIlutSolve, HYPRE_LSI_DDIlutSetup, HYPrecon_); HYPreconSetup_ = 1; } break; case HYDDICT : if ( HYPreconReuse_ == 1 && HYPreconSetup_ == 1 ) HYPRE_ParCSRBiCGSTABSetPrecond(HYSolver_, HYPRE_LSI_DDICTSolve, HYPRE_DummyFunction, HYPrecon_); else { setupPreconDDICT(); HYPRE_ParCSRBiCGSTABSetPrecond(HYSolver_, HYPRE_LSI_DDICTSolve, HYPRE_LSI_DDICTSetup, HYPrecon_); HYPreconSetup_ = 1; } break; case HYSCHWARZ : if ( HYPreconReuse_ == 1 && HYPreconSetup_ == 1 ) HYPRE_ParCSRBiCGSTABSetPrecond(HYSolver_, HYPRE_LSI_SchwarzSolve, HYPRE_DummyFunction, HYPrecon_); else { setupPreconSchwarz(); HYPRE_ParCSRBiCGSTABSetPrecond(HYSolver_, HYPRE_LSI_SchwarzSolve, HYPRE_LSI_SchwarzSetup,HYPrecon_); HYPreconSetup_ = 1; } break; case HYPOLY : if ( HYPreconReuse_ == 1 && HYPreconSetup_ == 1 ) HYPRE_ParCSRBiCGSTABSetPrecond(HYSolver_, HYPRE_LSI_PolySolve, HYPRE_DummyFunction, HYPrecon_); else { setupPreconPoly(); HYPRE_ParCSRBiCGSTABSetPrecond(HYSolver_, HYPRE_LSI_PolySolve, HYPRE_LSI_PolySetup, HYPrecon_); HYPreconSetup_ = 1; } break; case HYPARASAILS : if ( HYPreconReuse_ == 1 && HYPreconSetup_ == 1 ) HYPRE_ParCSRBiCGSTABSetPrecond(HYSolver_, HYPRE_ParCSRParaSailsSolve, HYPRE_DummyFunction, HYPrecon_); else { setupPreconParaSails(); HYPRE_ParCSRBiCGSTABSetPrecond(HYSolver_, HYPRE_ParCSRParaSailsSolve, HYPRE_ParCSRParaSailsSetup, HYPrecon_); HYPreconSetup_ = 1; } break; case HYBOOMERAMG : if ( HYPreconReuse_ == 1 && HYPreconSetup_ == 1 ) HYPRE_ParCSRBiCGSTABSetPrecond(HYSolver_,HYPRE_BoomerAMGSolve, HYPRE_DummyFunction, HYPrecon_); else { setupPreconBoomerAMG(); HYPRE_ParCSRBiCGSTABSetPrecond(HYSolver_, HYPRE_BoomerAMGSolve, HYPRE_BoomerAMGSetup, HYPrecon_); HYPreconSetup_ = 1; } break; case HYEUCLID : if ( HYPreconReuse_ == 1 && HYPreconSetup_ == 1 ) HYPRE_ParCSRBiCGSTABSetPrecond(HYSolver_, HYPRE_EuclidSolve, HYPRE_DummyFunction, HYPrecon_); else { setupPreconEuclid(); HYPRE_ParCSRBiCGSTABSetPrecond(HYSolver_, HYPRE_EuclidSolve, HYPRE_EuclidSetup,HYPrecon_); HYPreconSetup_ = 1; } break; case HYBLOCK : printf("BiCGSTAB : block preconditioning not available.\n"); exit(1); break; case HYML : #ifdef HAVE_ML if ( HYPreconReuse_ == 1 && HYPreconSetup_ == 1 ) HYPRE_ParCSRBiCGSTABSetPrecond(HYSolver_, HYPRE_LSI_MLSolve, HYPRE_DummyFunction, HYPrecon_); else { setupPreconML(); HYPRE_ParCSRBiCGSTABSetPrecond(HYSolver_,HYPRE_LSI_MLSolve, HYPRE_LSI_MLSetup, HYPrecon_); HYPreconSetup_ = 1; } #else printf("BiCGSTAB : ML preconditioning not available.\n"); #endif break; case HYMLMAXWELL : printf("BiCGSTAB : MLMaxwell preconditioning not available.\n"); break; case HYMLI : #ifdef HAVE_MLI if ((HYOutputLevel_ & HYFEI_SPECIALMASK) >= 1 && mypid_ == 0) printf("MLI preconditioning\n"); if ( HYPreconReuse_ == 1 && HYPreconSetup_ == 1 ) HYPRE_ParCSRBiCGSTABSetPrecond(HYSolver_, HYPRE_LSI_MLISolve, HYPRE_DummyFunction, HYPrecon_); else { HYPRE_ParCSRBiCGSTABSetPrecond(HYSolver_,HYPRE_LSI_MLISolve, HYPRE_LSI_MLISetup, HYPrecon_); HYPreconSetup_ = 1; } #else printf("BiCGSTAB : MLI preconditioning not available.\n"); #endif break; case HYUZAWA : printf("BiCGSTAB : Uzawa preconditioning not available.\n"); exit(1); break; case HYAMS : if ((HYOutputLevel_ & HYFEI_SPECIALMASK) >= 1 && mypid_ == 0) printf("AMS preconditioning\n"); if ( HYPreconReuse_ == 1 && HYPreconSetup_ == 1 ) HYPRE_ParCSRBiCGSTABSetPrecond(HYSolver_,HYPRE_AMSSolve, HYPRE_DummyFunction, HYPrecon_); else { setupPreconAMS(); HYPRE_ParCSRBiCGSTABSetPrecond(HYSolver_, HYPRE_AMSSolve, HYPRE_AMSSetup, HYPrecon_); HYPreconSetup_ = 1; } break; case HYSYSPDE : #ifdef HY_SYSPDE if ((HYOutputLevel_ & HYFEI_SPECIALMASK) >= 1 && mypid_ == 0) printf("SysPDe preconditioning\n"); if ( HYPreconReuse_ == 1 && HYPreconSetup_ == 1 ) HYPRE_ParCSRBiCGSTABSetPrecond(HYSolver_, HYPRE_ParCSRSysPDESolve, HYPRE_DummyFunction, HYPrecon_); else { setupPreconSysPDE(); HYPRE_ParCSRBiCGSTABSetPrecond(HYSolver_, HYPRE_ParCSRSysPDESolve, HYPRE_ParCSRSysPDESetup, HYPrecon_); HYPreconSetup_ = 1; } #else printf("BiCGSTAB : SysPDe preconditioning not available.\n"); #endif break; case HYDSLU : #ifdef HYPRE_USING_DSUPERLU if ((HYOutputLevel_ & HYFEI_SPECIALMASK) >= 1 && mypid_ == 0) printf("DSuperLU preconditioning\n"); if ( HYPreconReuse_ == 1 && HYPreconSetup_ == 1 ) HYPRE_ParCSRBiCGSTABSetPrecond(HYSolver_, HYPRE_LSI_DSuperLUSolve, HYPRE_DummyFunction, HYPrecon_); else { HYPRE_LSI_DSuperLUSetOutputLevel(HYPrecon_, HYOutputLevel_); HYPRE_ParCSRBiCGSTABSetPrecond(HYSolver_, HYPRE_LSI_DSuperLUSolve, HYPRE_LSI_DSuperLUSetup, HYPrecon_); HYPreconSetup_ = 1; } #else printf("BiCGSTAB : DSuperLU preconditioning not available.\n"); #endif break; } return; } //*************************************************************************** // set up preconditioners for BiCGSTABL //--------------------------------------------------------------------------- void HYPRE_LinSysCore::setupBiCGSTABLPrecon() { //------------------------------------------------------------------- // if matrix has been reloaded, reset preconditioner //------------------------------------------------------------------- if ( HYPreconReuse_ == 0 && HYPreconSetup_ == 1 ) selectPreconditioner( HYPreconName_ ); //------------------------------------------------------------------- // set up preconditioners //------------------------------------------------------------------- switch ( HYPreconID_ ) { case HYIDENTITY : if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 1 && mypid_ == 0 ) printf("No preconditioning \n"); HYPRE_ParCSRBiCGSTABLSetPrecond(HYSolver_, HYPRE_LSI_SolveIdentity, HYPRE_DummyFunction, HYPrecon_); break; case HYDIAGONAL : if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 1 && mypid_ == 0 ) printf("Diagonal preconditioning \n"); if ( HYPreconReuse_ == 1 && HYPreconSetup_ == 1 ) HYPRE_ParCSRBiCGSTABLSetPrecond(HYSolver_, HYPRE_ParCSRDiagScale, HYPRE_DummyFunction, HYPrecon_); else { HYPRE_ParCSRBiCGSTABLSetPrecond(HYSolver_, HYPRE_ParCSRDiagScale, HYPRE_ParCSRDiagScaleSetup,HYPrecon_); HYPreconSetup_ = 1; } break; case HYPILUT : if ( HYPreconReuse_ == 1 && HYPreconSetup_ == 1 ) HYPRE_ParCSRBiCGSTABLSetPrecond(HYSolver_,HYPRE_ParCSRPilutSolve, HYPRE_DummyFunction, HYPrecon_); else { setupPreconPILUT(); HYPRE_ParCSRBiCGSTABLSetPrecond(HYSolver_,HYPRE_ParCSRPilutSolve, HYPRE_ParCSRPilutSetup, HYPrecon_); HYPreconSetup_ = 1; } break; case HYDDILUT : if ( HYPreconReuse_ == 1 && HYPreconSetup_ == 1 ) HYPRE_ParCSRBiCGSTABLSetPrecond(HYSolver_, HYPRE_LSI_DDIlutSolve, HYPRE_DummyFunction, HYPrecon_); else { setupPreconDDILUT(); HYPRE_ParCSRBiCGSTABLSetPrecond(HYSolver_, HYPRE_LSI_DDIlutSolve, HYPRE_LSI_DDIlutSetup,HYPrecon_); HYPreconSetup_ = 1; } break; case HYDDICT : if ( HYPreconReuse_ == 1 && HYPreconSetup_ == 1 ) HYPRE_ParCSRBiCGSTABLSetPrecond(HYSolver_, HYPRE_LSI_DDICTSolve, HYPRE_DummyFunction, HYPrecon_); else { setupPreconDDICT(); HYPRE_ParCSRBiCGSTABLSetPrecond(HYSolver_, HYPRE_LSI_DDICTSolve, HYPRE_LSI_DDICTSetup, HYPrecon_); HYPreconSetup_ = 1; } break; case HYSCHWARZ : if ( HYPreconReuse_ == 1 && HYPreconSetup_ == 1 ) HYPRE_ParCSRBiCGSTABLSetPrecond(HYSolver_,HYPRE_LSI_SchwarzSolve, HYPRE_DummyFunction, HYPrecon_); else { setupPreconSchwarz(); HYPRE_ParCSRBiCGSTABLSetPrecond(HYSolver_,HYPRE_LSI_SchwarzSolve, HYPRE_LSI_SchwarzSetup,HYPrecon_); HYPreconSetup_ = 1; } break; case HYPOLY : if ( HYPreconReuse_ == 1 && HYPreconSetup_ == 1 ) HYPRE_ParCSRBiCGSTABLSetPrecond(HYSolver_, HYPRE_LSI_PolySolve, HYPRE_DummyFunction, HYPrecon_); else { setupPreconPoly(); HYPRE_ParCSRBiCGSTABLSetPrecond(HYSolver_, HYPRE_LSI_PolySolve, HYPRE_LSI_PolySetup, HYPrecon_); HYPreconSetup_ = 1; } break; case HYPARASAILS : if ( HYPreconReuse_ == 1 && HYPreconSetup_ == 1 ) HYPRE_ParCSRBiCGSTABLSetPrecond(HYSolver_, HYPRE_ParCSRParaSailsSolve, HYPRE_DummyFunction, HYPrecon_); else { setupPreconParaSails(); HYPRE_ParCSRBiCGSTABLSetPrecond(HYSolver_, HYPRE_ParCSRParaSailsSolve, HYPRE_ParCSRParaSailsSetup, HYPrecon_); HYPreconSetup_ = 1; } break; case HYBOOMERAMG : if ( HYPreconReuse_ == 1 && HYPreconSetup_ == 1 ) HYPRE_ParCSRBiCGSTABLSetPrecond(HYSolver_,HYPRE_BoomerAMGSolve, HYPRE_DummyFunction, HYPrecon_); else { setupPreconBoomerAMG(); HYPRE_ParCSRBiCGSTABLSetPrecond(HYSolver_, HYPRE_BoomerAMGSolve, HYPRE_BoomerAMGSetup, HYPrecon_); HYPreconSetup_ = 1; } break; case HYEUCLID : if ( HYPreconReuse_ == 1 && HYPreconSetup_ == 1 ) HYPRE_ParCSRBiCGSTABLSetPrecond(HYSolver_,HYPRE_EuclidSolve, HYPRE_DummyFunction, HYPrecon_); else { setupPreconEuclid(); HYPRE_ParCSRBiCGSTABLSetPrecond(HYSolver_,HYPRE_EuclidSolve, HYPRE_EuclidSetup, HYPrecon_); HYPreconSetup_ = 1; } break; case HYBLOCK : printf("BiCGSTABL : block preconditioning not available.\n"); exit(1); break; case HYML : #ifdef HAVE_ML if ( HYPreconReuse_ == 1 && HYPreconSetup_ == 1 ) HYPRE_ParCSRBiCGSTABLSetPrecond(HYSolver_, HYPRE_LSI_MLSolve, HYPRE_DummyFunction, HYPrecon_); else { setupPreconML(); HYPRE_ParCSRBiCGSTABLSetPrecond(HYSolver_,HYPRE_LSI_MLSolve, HYPRE_LSI_MLSetup, HYPrecon_); HYPreconSetup_ = 1; } #else printf("BiCGSTABL : ML preconditioning not available.\n"); #endif break; case HYMLMAXWELL : printf("BiCGSTABL : MLMaxwell preconditioning not available.\n"); break; case HYMLI : #ifdef HAVE_MLI if ((HYOutputLevel_ & HYFEI_SPECIALMASK) >= 1 && mypid_ == 0) printf("MLI preconditioning \n"); if ( HYPreconReuse_ == 1 && HYPreconSetup_ == 1 ) HYPRE_ParCSRBiCGSTABLSetPrecond(HYSolver_, HYPRE_LSI_MLISolve, HYPRE_DummyFunction, HYPrecon_); else { HYPRE_ParCSRBiCGSTABLSetPrecond(HYSolver_,HYPRE_LSI_MLISolve, HYPRE_LSI_MLISetup, HYPrecon_); HYPreconSetup_ = 1; } #else printf("BiCGSTABL : ML preconditioning not available.\n"); #endif break; case HYUZAWA : printf("BiCGSTABL : Uzawa preconditioning not available.\n"); exit(1); break; case HYAMS : if ((HYOutputLevel_ & HYFEI_SPECIALMASK) >= 1 && mypid_ == 0) printf("AMS preconditioning\n"); if ( HYPreconReuse_ == 1 && HYPreconSetup_ == 1 ) HYPRE_ParCSRBiCGSTABLSetPrecond(HYSolver_,HYPRE_AMSSolve, HYPRE_DummyFunction, HYPrecon_); else { setupPreconAMS(); HYPRE_ParCSRBiCGSTABLSetPrecond(HYSolver_, HYPRE_AMSSolve, HYPRE_AMSSetup, HYPrecon_); HYPreconSetup_ = 1; } break; case HYSYSPDE : #ifdef HY_SYSPDE if ((HYOutputLevel_ & HYFEI_SPECIALMASK) >= 1 && mypid_ == 0) printf("SysPDe preconditioning\n"); if ( HYPreconReuse_ == 1 && HYPreconSetup_ == 1 ) HYPRE_ParCSRBiCGSTABLSetPrecond(HYSolver_, HYPRE_ParCSRSysPDESolve, HYPRE_DummyFunction, HYPrecon_); else { setupPreconSysPDE(); HYPRE_ParCSRBiCGSTABLSetPrecond(HYSolver_, HYPRE_ParCSRSysPDESolve, HYPRE_ParCSRSysPDESetup, HYPrecon_); HYPreconSetup_ = 1; } #else printf("BiCGSTABL : SysPDe preconditioning not available.\n"); #endif break; case HYDSLU : #ifdef HYPRE_USING_DSUPERLU if ((HYOutputLevel_ & HYFEI_SPECIALMASK) >= 1 && mypid_ == 0) printf("DSuperLU preconditioning\n"); if ( HYPreconReuse_ == 1 && HYPreconSetup_ == 1 ) HYPRE_ParCSRBiCGSTABLSetPrecond(HYSolver_, HYPRE_LSI_DSuperLUSolve, HYPRE_DummyFunction, HYPrecon_); else { HYPRE_LSI_DSuperLUSetOutputLevel(HYPrecon_, HYOutputLevel_); HYPRE_ParCSRBiCGSTABLSetPrecond(HYSolver_, HYPRE_LSI_DSuperLUSolve, HYPRE_LSI_DSuperLUSetup, HYPrecon_); HYPreconSetup_ = 1; } #else printf("BiCGSTABL : DSuperLU preconditioning not available.\n"); #endif break; } return; } //*************************************************************************** // set up preconditioners for TFQMR //--------------------------------------------------------------------------- void HYPRE_LinSysCore::setupTFQmrPrecon() { //------------------------------------------------------------------- // if matrix has been reloaded, reset preconditioner //------------------------------------------------------------------- if ( HYPreconReuse_ == 0 && HYPreconSetup_ == 1 ) selectPreconditioner( HYPreconName_ ); //------------------------------------------------------------------- // set up preconditioners //------------------------------------------------------------------- switch ( HYPreconID_ ) { case HYIDENTITY : if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 1 && mypid_ == 0 ) printf("No preconditioning \n"); HYPRE_ParCSRTFQmrSetPrecond(HYSolver_, HYPRE_LSI_SolveIdentity, HYPRE_DummyFunction, HYPrecon_); break; case HYDIAGONAL : if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 1 && mypid_ == 0 ) printf("Diagonal preconditioning \n"); if ( HYPreconReuse_ == 1 && HYPreconSetup_ == 1 ) HYPRE_ParCSRTFQmrSetPrecond(HYSolver_, HYPRE_ParCSRDiagScale, HYPRE_DummyFunction, HYPrecon_); else { HYPRE_ParCSRTFQmrSetPrecond(HYSolver_, HYPRE_ParCSRDiagScale, HYPRE_ParCSRDiagScaleSetup,HYPrecon_); HYPreconSetup_ = 1; } break; case HYPILUT : if ( HYPreconReuse_ == 1 && HYPreconSetup_ == 1 ) HYPRE_ParCSRTFQmrSetPrecond(HYSolver_, HYPRE_ParCSRPilutSolve, HYPRE_DummyFunction, HYPrecon_); else { setupPreconPILUT(); HYPRE_ParCSRTFQmrSetPrecond(HYSolver_, HYPRE_ParCSRPilutSolve, HYPRE_ParCSRPilutSetup, HYPrecon_); HYPreconSetup_ = 1; } break; case HYDDILUT : if ( HYPreconReuse_ == 1 && HYPreconSetup_ == 1 ) HYPRE_ParCSRTFQmrSetPrecond(HYSolver_, HYPRE_LSI_DDIlutSolve, HYPRE_DummyFunction, HYPrecon_); else { setupPreconDDILUT(); HYPRE_ParCSRTFQmrSetPrecond(HYSolver_, HYPRE_LSI_DDIlutSolve, HYPRE_LSI_DDIlutSetup, HYPrecon_); HYPreconSetup_ = 1; } break; case HYDDICT : if ( HYPreconReuse_ == 1 && HYPreconSetup_ == 1 ) HYPRE_ParCSRTFQmrSetPrecond(HYSolver_, HYPRE_LSI_DDICTSolve, HYPRE_DummyFunction, HYPrecon_); else { setupPreconDDICT(); HYPRE_ParCSRTFQmrSetPrecond(HYSolver_, HYPRE_LSI_DDICTSolve, HYPRE_LSI_DDICTSetup, HYPrecon_); HYPreconSetup_ = 1; } break; case HYSCHWARZ : if ( HYPreconReuse_ == 1 && HYPreconSetup_ == 1 ) HYPRE_ParCSRTFQmrSetPrecond(HYSolver_, HYPRE_LSI_SchwarzSolve, HYPRE_DummyFunction, HYPrecon_); else { setupPreconSchwarz(); HYPRE_ParCSRTFQmrSetPrecond(HYSolver_, HYPRE_LSI_SchwarzSolve, HYPRE_LSI_SchwarzSetup, HYPrecon_); HYPreconSetup_ = 1; } break; case HYPOLY : if ( HYPreconReuse_ == 1 && HYPreconSetup_ == 1 ) HYPRE_ParCSRTFQmrSetPrecond(HYSolver_, HYPRE_LSI_PolySolve, HYPRE_DummyFunction, HYPrecon_); else { setupPreconPoly(); HYPRE_ParCSRTFQmrSetPrecond(HYSolver_, HYPRE_LSI_PolySolve, HYPRE_LSI_PolySetup, HYPrecon_); HYPreconSetup_ = 1; } break; case HYPARASAILS : if ( HYPreconReuse_ == 1 && HYPreconSetup_ == 1 ) HYPRE_ParCSRTFQmrSetPrecond(HYSolver_,HYPRE_ParCSRParaSailsSolve, HYPRE_DummyFunction, HYPrecon_); else { setupPreconParaSails(); HYPRE_ParCSRTFQmrSetPrecond(HYSolver_,HYPRE_ParCSRParaSailsSolve, HYPRE_ParCSRParaSailsSetup,HYPrecon_); HYPreconSetup_ = 1; } break; case HYBOOMERAMG : if ( HYPreconReuse_ == 1 && HYPreconSetup_ == 1 ) HYPRE_ParCSRTFQmrSetPrecond(HYSolver_,HYPRE_BoomerAMGSolve, HYPRE_DummyFunction, HYPrecon_); else { setupPreconBoomerAMG(); HYPRE_ParCSRTFQmrSetPrecond(HYSolver_, HYPRE_BoomerAMGSolve, HYPRE_BoomerAMGSetup, HYPrecon_); HYPreconSetup_ = 1; } break; case HYEUCLID : if ( HYPreconReuse_ == 1 && HYPreconSetup_ == 1 ) HYPRE_ParCSRTFQmrSetPrecond(HYSolver_, HYPRE_EuclidSolve, HYPRE_DummyFunction, HYPrecon_); else { setupPreconEuclid(); HYPRE_ParCSRTFQmrSetPrecond(HYSolver_, HYPRE_EuclidSolve, HYPRE_EuclidSetup, HYPrecon_); HYPreconSetup_ = 1; } break; case HYBLOCK : printf("TFQMR : block preconditioning not available.\n"); exit(1); break; case HYML : #ifdef HAVE_ML if ( HYPreconReuse_ == 1 && HYPreconSetup_ == 1 ) HYPRE_ParCSRTFQmrSetPrecond(HYSolver_, HYPRE_LSI_MLSolve, HYPRE_DummyFunction, HYPrecon_); else { setupPreconML(); HYPRE_ParCSRTFQmrSetPrecond(HYSolver_,HYPRE_LSI_MLSolve, HYPRE_LSI_MLSetup, HYPrecon_); HYPreconSetup_ = 1; } #else printf("TFQMR : ML preconditioning not available.\n"); #endif break; case HYMLMAXWELL : printf("TFQMR : MLMaxwell preconditioning not available.\n"); break; case HYMLI : #ifdef HAVE_MLI if ((HYOutputLevel_ & HYFEI_SPECIALMASK) >= 1 && mypid_ == 0) printf("MLI preconditioning \n"); if ( HYPreconReuse_ == 1 && HYPreconSetup_ == 1 ) HYPRE_ParCSRTFQmrSetPrecond(HYSolver_, HYPRE_LSI_MLISolve, HYPRE_DummyFunction, HYPrecon_); else { HYPRE_ParCSRTFQmrSetPrecond(HYSolver_,HYPRE_LSI_MLISolve, HYPRE_LSI_MLISetup, HYPrecon_); HYPreconSetup_ = 1; } #else printf("TFQMR : MLI preconditioning not available.\n"); #endif break; case HYUZAWA : printf("TFQMR : Uzawa preconditioning not available.\n"); exit(1); break; case HYAMS : if ((HYOutputLevel_ & HYFEI_SPECIALMASK) >= 1 && mypid_ == 0) printf("AMS preconditioning\n"); if ( HYPreconReuse_ == 1 && HYPreconSetup_ == 1 ) HYPRE_ParCSRTFQmrSetPrecond(HYSolver_,HYPRE_AMSSolve, HYPRE_DummyFunction, HYPrecon_); else { setupPreconAMS(); HYPRE_ParCSRTFQmrSetPrecond(HYSolver_, HYPRE_AMSSolve, HYPRE_AMSSetup, HYPrecon_); HYPreconSetup_ = 1; } break; case HYSYSPDE : #ifdef HY_SYSPDE if ((HYOutputLevel_ & HYFEI_SPECIALMASK) >= 1 && mypid_ == 0) printf("SysPDe preconditioning\n"); if ( HYPreconReuse_ == 1 && HYPreconSetup_ == 1 ) HYPRE_ParCSRTFQmrSetPrecond(HYSolver_, HYPRE_ParCSRSysPDESolve, HYPRE_DummyFunction, HYPrecon_); else { setupPreconSysPDE(); HYPRE_ParCSRTFQmrSetPrecond(HYSolver_, HYPRE_ParCSRSysPDESolve, HYPRE_ParCSRSysPDESetup, HYPrecon_); HYPreconSetup_ = 1; } #else printf("TFQMR : SysPDe preconditioning not available.\n"); #endif break; case HYDSLU : #ifdef HYPRE_USING_DSUPERLU if ((HYOutputLevel_ & HYFEI_SPECIALMASK) >= 1 && mypid_ == 0) printf("DSuperLU preconditioning\n"); if ( HYPreconReuse_ == 1 && HYPreconSetup_ == 1 ) HYPRE_ParCSRTFQmrSetPrecond(HYSolver_, HYPRE_LSI_DSuperLUSolve, HYPRE_DummyFunction, HYPrecon_); else { HYPRE_LSI_DSuperLUSetOutputLevel(HYPrecon_, HYOutputLevel_); HYPRE_ParCSRTFQmrSetPrecond(HYSolver_, HYPRE_LSI_DSuperLUSolve, HYPRE_LSI_DSuperLUSetup, HYPrecon_); HYPreconSetup_ = 1; } #else printf("TFQMR : DSuperLU preconditioning not available.\n"); #endif break; } return; } //*************************************************************************** // set up preconditioners for BiCGS //--------------------------------------------------------------------------- void HYPRE_LinSysCore::setupBiCGSPrecon() { //------------------------------------------------------------------- // if matrix has been reloaded, reset preconditioner //------------------------------------------------------------------- if ( HYPreconReuse_ == 0 && HYPreconSetup_ == 1 ) selectPreconditioner( HYPreconName_ ); //------------------------------------------------------------------- // set up preconditioners //------------------------------------------------------------------- switch ( HYPreconID_ ) { case HYIDENTITY : if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 1 && mypid_ == 0 ) printf("No preconditioning \n"); HYPRE_ParCSRBiCGSSetPrecond(HYSolver_, HYPRE_LSI_SolveIdentity, HYPRE_DummyFunction, HYPrecon_); break; case HYDIAGONAL : if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 1 && mypid_ == 0 ) printf("Diagonal preconditioning \n"); if ( HYPreconReuse_ == 1 && HYPreconSetup_ == 1 ) HYPRE_ParCSRBiCGSSetPrecond(HYSolver_, HYPRE_ParCSRDiagScale, HYPRE_DummyFunction, HYPrecon_); else { HYPRE_ParCSRBiCGSSetPrecond(HYSolver_, HYPRE_ParCSRDiagScale, HYPRE_ParCSRDiagScaleSetup,HYPrecon_); HYPreconSetup_ = 1; } break; case HYPILUT : if ( HYPreconReuse_ == 1 && HYPreconSetup_ == 1 ) HYPRE_ParCSRBiCGSSetPrecond(HYSolver_, HYPRE_ParCSRPilutSolve, HYPRE_DummyFunction, HYPrecon_); else { setupPreconPILUT(); HYPRE_ParCSRBiCGSSetPrecond(HYSolver_, HYPRE_ParCSRPilutSolve, HYPRE_ParCSRPilutSetup, HYPrecon_); HYPreconSetup_ = 1; } break; case HYDDILUT : if ( HYPreconReuse_ == 1 && HYPreconSetup_ == 1 ) HYPRE_ParCSRBiCGSSetPrecond(HYSolver_, HYPRE_LSI_DDIlutSolve, HYPRE_DummyFunction, HYPrecon_); else { setupPreconDDILUT(); HYPRE_ParCSRBiCGSSetPrecond(HYSolver_, HYPRE_LSI_DDIlutSolve, HYPRE_LSI_DDIlutSetup, HYPrecon_); HYPreconSetup_ = 1; } break; case HYDDICT : if ( HYPreconReuse_ == 1 && HYPreconSetup_ == 1 ) HYPRE_ParCSRBiCGSSetPrecond(HYSolver_, HYPRE_LSI_DDICTSolve, HYPRE_DummyFunction, HYPrecon_); else { setupPreconDDICT(); HYPRE_ParCSRBiCGSSetPrecond(HYSolver_, HYPRE_LSI_DDICTSolve, HYPRE_LSI_DDICTSetup, HYPrecon_); HYPreconSetup_ = 1; } break; case HYSCHWARZ : if ( HYPreconReuse_ == 1 && HYPreconSetup_ == 1 ) HYPRE_ParCSRBiCGSSetPrecond(HYSolver_, HYPRE_LSI_SchwarzSolve, HYPRE_DummyFunction, HYPrecon_); else { setupPreconSchwarz(); HYPRE_ParCSRBiCGSSetPrecond(HYSolver_, HYPRE_LSI_SchwarzSolve, HYPRE_LSI_SchwarzSetup, HYPrecon_); HYPreconSetup_ = 1; } break; case HYPOLY : if ( HYPreconReuse_ == 1 && HYPreconSetup_ == 1 ) HYPRE_ParCSRBiCGSSetPrecond(HYSolver_, HYPRE_LSI_PolySolve, HYPRE_DummyFunction, HYPrecon_); else { setupPreconPoly(); HYPRE_ParCSRBiCGSSetPrecond(HYSolver_, HYPRE_LSI_PolySolve, HYPRE_LSI_PolySetup, HYPrecon_); HYPreconSetup_ = 1; } break; case HYPARASAILS : if ( HYPreconReuse_ == 1 && HYPreconSetup_ == 1 ) HYPRE_ParCSRBiCGSSetPrecond(HYSolver_,HYPRE_ParCSRParaSailsSolve, HYPRE_DummyFunction, HYPrecon_); else { setupPreconParaSails(); HYPRE_ParCSRBiCGSSetPrecond(HYSolver_,HYPRE_ParCSRParaSailsSolve, HYPRE_ParCSRParaSailsSetup,HYPrecon_); HYPreconSetup_ = 1; } break; case HYBOOMERAMG : if ( HYPreconReuse_ == 1 && HYPreconSetup_ == 1 ) HYPRE_ParCSRBiCGSSetPrecond(HYSolver_,HYPRE_BoomerAMGSolve, HYPRE_DummyFunction, HYPrecon_); else { setupPreconBoomerAMG(); HYPRE_ParCSRBiCGSSetPrecond(HYSolver_, HYPRE_BoomerAMGSolve, HYPRE_BoomerAMGSetup, HYPrecon_); HYPreconSetup_ = 1; } break; case HYEUCLID : if ( HYPreconReuse_ == 1 && HYPreconSetup_ == 1 ) HYPRE_ParCSRBiCGSSetPrecond(HYSolver_, HYPRE_EuclidSolve, HYPRE_DummyFunction, HYPrecon_); else { setupPreconEuclid(); HYPRE_ParCSRBiCGSSetPrecond(HYSolver_, HYPRE_EuclidSolve, HYPRE_EuclidSetup, HYPrecon_); HYPreconSetup_ = 1; } break; case HYBLOCK : printf("BiCGS : block preconditioning not available.\n"); exit(1); break; case HYML : #ifdef HAVE_ML if ( HYPreconReuse_ == 1 && HYPreconSetup_ == 1 ) HYPRE_ParCSRBiCGSSetPrecond(HYSolver_, HYPRE_LSI_MLSolve, HYPRE_DummyFunction, HYPrecon_); else { setupPreconML(); HYPRE_ParCSRBiCGSSetPrecond(HYSolver_,HYPRE_LSI_MLSolve, HYPRE_LSI_MLSetup, HYPrecon_); HYPreconSetup_ = 1; } #else printf("BiCGS : ML preconditioning not available.\n"); #endif break; case HYMLMAXWELL : printf("BiCGS : MLMaxwell preconditioning not available.\n"); break; case HYMLI : #ifdef HAVE_MLI if ((HYOutputLevel_ & HYFEI_SPECIALMASK) >= 1 && mypid_ == 0) printf("MLI preconditioning \n"); if ( HYPreconReuse_ == 1 && HYPreconSetup_ == 1 ) HYPRE_ParCSRBiCGSSetPrecond(HYSolver_, HYPRE_LSI_MLISolve, HYPRE_DummyFunction, HYPrecon_); else { HYPRE_ParCSRBiCGSSetPrecond(HYSolver_,HYPRE_LSI_MLISolve, HYPRE_LSI_MLISetup, HYPrecon_); HYPreconSetup_ = 1; } #else printf("BiCGS : MLI preconditioning not available.\n"); #endif break; case HYUZAWA : printf("BiCGS : Uzawa preconditioning not available.\n"); exit(1); break; case HYAMS : if ((HYOutputLevel_ & HYFEI_SPECIALMASK) >= 1 && mypid_ == 0) printf("AMS preconditioning\n"); if ( HYPreconReuse_ == 1 && HYPreconSetup_ == 1 ) HYPRE_ParCSRBiCGSSetPrecond(HYSolver_,HYPRE_AMSSolve, HYPRE_DummyFunction, HYPrecon_); else { setupPreconAMS(); HYPRE_ParCSRBiCGSSetPrecond(HYSolver_, HYPRE_AMSSolve, HYPRE_AMSSetup, HYPrecon_); HYPreconSetup_ = 1; } break; case HYSYSPDE : #ifdef HY_SYSPDE if ((HYOutputLevel_ & HYFEI_SPECIALMASK) >= 1 && mypid_ == 0) printf("SysPDe preconditioning\n"); if ( HYPreconReuse_ == 1 && HYPreconSetup_ == 1 ) HYPRE_ParCSRBiCGSSetPrecond(HYSolver_, HYPRE_ParCSRSysPDESolve, HYPRE_DummyFunction, HYPrecon_); else { setupPreconSysPDE(); HYPRE_ParCSRBiCGSSetPrecond(HYSolver_, HYPRE_ParCSRSysPDESolve, HYPRE_ParCSRSysPDESetup, HYPrecon_); HYPreconSetup_ = 1; } #else printf("BiCGS : SysPDe preconditioning not available.\n"); #endif break; case HYDSLU : #ifdef HYPRE_USING_DSUPERLU if ((HYOutputLevel_ & HYFEI_SPECIALMASK) >= 1 && mypid_ == 0) printf("DSuperLU preconditioning\n"); if ( HYPreconReuse_ == 1 && HYPreconSetup_ == 1 ) HYPRE_ParCSRBiCGSSetPrecond(HYSolver_, HYPRE_LSI_DSuperLUSolve, HYPRE_DummyFunction, HYPrecon_); else { HYPRE_LSI_DSuperLUSetOutputLevel(HYPrecon_, HYOutputLevel_); HYPRE_ParCSRBiCGSSetPrecond(HYSolver_, HYPRE_LSI_DSuperLUSolve, HYPRE_LSI_DSuperLUSetup, HYPrecon_); HYPreconSetup_ = 1; } #else printf("BiCGS : DSuperLU preconditioning not available.\n"); #endif break; } return; } //*************************************************************************** // set up preconditioners for Symmetric QMR //--------------------------------------------------------------------------- void HYPRE_LinSysCore::setupSymQMRPrecon() { //------------------------------------------------------------------- // if matrix has been reloaded, reset preconditioner //------------------------------------------------------------------- if ( HYPreconReuse_ == 0 && HYPreconSetup_ == 1 ) selectPreconditioner( HYPreconName_ ); //------------------------------------------------------------------- // set up preconditioners //------------------------------------------------------------------- switch ( HYPreconID_ ) { case HYIDENTITY : if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 1 && mypid_ == 0 ) printf("No preconditioning \n"); HYPRE_ParCSRSymQMRSetPrecond(HYSolver_, HYPRE_LSI_SolveIdentity, HYPRE_DummyFunction, HYPrecon_); break; case HYDIAGONAL : if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 1 && mypid_ == 0 ) printf("Diagonal preconditioning \n"); if ( HYPreconReuse_ == 1 && HYPreconSetup_ == 1 ) HYPRE_ParCSRSymQMRSetPrecond(HYSolver_, HYPRE_ParCSRDiagScale, HYPRE_DummyFunction, HYPrecon_); else { HYPRE_ParCSRSymQMRSetPrecond(HYSolver_, HYPRE_ParCSRDiagScale, HYPRE_ParCSRDiagScaleSetup,HYPrecon_); HYPreconSetup_ = 1; } break; case HYPILUT : printf("ERROR : PILUT does not match SymQMR in general.\n"); exit(1); break; case HYDDILUT : printf("ERROR : DDILUT does not match SymQMR in general.\n"); exit(1); break; case HYDDICT : if ( HYPreconReuse_ == 1 && HYPreconSetup_ == 1 ) HYPRE_ParCSRSymQMRSetPrecond(HYSolver_, HYPRE_LSI_DDICTSolve, HYPRE_DummyFunction, HYPrecon_); else { setupPreconDDICT(); HYPRE_ParCSRSymQMRSetPrecond(HYSolver_, HYPRE_LSI_DDICTSolve, HYPRE_LSI_DDICTSetup, HYPrecon_); HYPreconSetup_ = 1; } break; case HYSCHWARZ : printf("ERROR : Schwarz does not match SymQMR in general.\n"); exit(1); break; case HYPOLY : if ( HYPreconReuse_ == 1 && HYPreconSetup_ == 1 ) HYPRE_ParCSRSymQMRSetPrecond(HYSolver_, HYPRE_LSI_PolySolve, HYPRE_DummyFunction, HYPrecon_); else { setupPreconPoly(); HYPRE_ParCSRSymQMRSetPrecond(HYSolver_, HYPRE_LSI_PolySolve, HYPRE_LSI_PolySetup, HYPrecon_); HYPreconSetup_ = 1; } break; case HYPARASAILS : if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 1 ) HYPRE_ParCSRParaSailsSetLogging(HYPrecon_, 1); if ( HYPreconReuse_ == 1 && HYPreconSetup_ == 1 ) HYPRE_ParCSRSymQMRSetPrecond(HYSolver_,HYPRE_ParCSRParaSailsSolve, HYPRE_DummyFunction, HYPrecon_); else { setupPreconParaSails(); HYPRE_ParCSRSymQMRSetPrecond(HYSolver_,HYPRE_ParCSRParaSailsSolve, HYPRE_ParCSRParaSailsSetup,HYPrecon_); HYPreconSetup_ = 1; } break; case HYBOOMERAMG : if ( HYPreconReuse_ == 1 && HYPreconSetup_ == 1 ) HYPRE_ParCSRSymQMRSetPrecond(HYSolver_,HYPRE_BoomerAMGSolve, HYPRE_DummyFunction, HYPrecon_); else { setupPreconBoomerAMG(); HYPRE_ParCSRSymQMRSetPrecond(HYSolver_, HYPRE_BoomerAMGSolve, HYPRE_BoomerAMGSetup, HYPrecon_); HYPreconSetup_ = 1; } break; case HYEUCLID : printf("ERROR : Euclid does not match SymQMR in general.\n"); exit(1); break; case HYBLOCK : if ( HYPreconReuse_ == 1 && HYPreconSetup_ == 1 ) HYPRE_ParCSRSymQMRSetPrecond(HYSolver_, HYPRE_LSI_BlockPrecondSolve, HYPRE_DummyFunction, HYPrecon_); else { setupPreconBlock(); HYPRE_ParCSRSymQMRSetPrecond(HYSolver_, HYPRE_LSI_BlockPrecondSolve, HYPRE_LSI_BlockPrecondSetup, HYPrecon_); HYPreconSetup_ = 1; } break; case HYML : #ifdef HAVE_ML if ( HYPreconReuse_ == 1 && HYPreconSetup_ == 1 ) HYPRE_ParCSRSymQMRSetPrecond(HYSolver_, HYPRE_LSI_MLSolve, HYPRE_DummyFunction, HYPrecon_); else { setupPreconML(); HYPRE_ParCSRSymQMRSetPrecond(HYSolver_,HYPRE_LSI_MLSolve, HYPRE_LSI_MLSetup, HYPrecon_); HYPreconSetup_ = 1; } #else printf("SymQMR : ML preconditioning not available.\n"); #endif break; case HYMLMAXWELL : printf("SymQMR : MLMaxwell preconditioning not available.\n"); break; case HYMLI : #ifdef HAVE_MLI if ((HYOutputLevel_ & HYFEI_SPECIALMASK) >= 1 && mypid_ == 0) printf("MLI preconditioning \n"); if ( HYPreconReuse_ == 1 && HYPreconSetup_ == 1 ) HYPRE_ParCSRSymQMRSetPrecond(HYSolver_, HYPRE_LSI_MLISolve, HYPRE_DummyFunction, HYPrecon_); else { HYPRE_ParCSRSymQMRSetPrecond(HYSolver_,HYPRE_LSI_MLISolve, HYPRE_LSI_MLISetup, HYPrecon_); HYPreconSetup_ = 1; } #else printf("SymQMR : MLI preconditioning not available.\n"); #endif break; case HYUZAWA : printf("SymQMR : Uzawa preconditioning not available.\n"); exit(1); break; case HYAMS : if ((HYOutputLevel_ & HYFEI_SPECIALMASK) >= 1 && mypid_ == 0) printf("AMS preconditioning\n"); if ( HYPreconReuse_ == 1 && HYPreconSetup_ == 1 ) HYPRE_ParCSRSymQMRSetPrecond(HYSolver_,HYPRE_AMSSolve, HYPRE_DummyFunction, HYPrecon_); else { setupPreconAMS(); HYPRE_ParCSRSymQMRSetPrecond(HYSolver_, HYPRE_AMSSolve, HYPRE_AMSSetup, HYPrecon_); HYPreconSetup_ = 1; } break; case HYSYSPDE : #ifdef HY_SYSPDE if ((HYOutputLevel_ & HYFEI_SPECIALMASK) >= 1 && mypid_ == 0) printf("SysPDe preconditioning\n"); if ( HYPreconReuse_ == 1 && HYPreconSetup_ == 1 ) HYPRE_ParCSRSymQMRSetPrecond(HYSolver_, HYPRE_ParCSRSysPDESolve, HYPRE_DummyFunction, HYPrecon_); else { setupPreconSysPDE(); HYPRE_ParCSRSymQMRSetPrecond(HYSolver_, HYPRE_ParCSRSysPDESolve, HYPRE_ParCSRSysPDESetup, HYPrecon_); HYPreconSetup_ = 1; } #else printf("SymQMR : SysPDe preconditioning not available.\n"); #endif break; case HYDSLU : printf("BiCGS : DSuperLU preconditioning not an option.\n"); break; } return; } //*************************************************************************** // this function sets up BOOMERAMG preconditioner //--------------------------------------------------------------------------- void HYPRE_LinSysCore::setupPreconBoomerAMG() { int i, j, *num_sweeps, *relax_type, **relax_points; double *relax_wt, *relax_omega; if ((HYOutputLevel_ & HYFEI_SPECIALMASK) >= 1 && mypid_ == 0) { printf("AMG max levels = %d\n", amgMaxLevels_); printf("AMG coarsen type = %d\n", amgCoarsenType_); printf("AMG measure type = %d\n", amgMeasureType_); printf("AMG threshold = %e\n", amgStrongThreshold_); printf("AMG numsweeps = %d\n", amgNumSweeps_[0]); printf("AMG relax type = %d\n", amgRelaxType_[0]); if (amgGridRlxType_) printf("AMG CF smoothing \n"); printf("AMG relax weight = %e\n", amgRelaxWeight_[0]); printf("AMG relax omega = %e\n", amgRelaxOmega_[0]); printf("AMG system size = %d\n", amgSystemSize_); printf("AMG smooth type = %d\n", amgSmoothType_); printf("AMG smooth numlevels = %d\n", amgSmoothNumLevels_); printf("AMG smooth numsweeps = %d\n", amgSmoothNumSweeps_); printf("AMG Schwarz variant = %d\n", amgSchwarzVariant_); printf("AMG Schwarz overlap = %d\n", amgSchwarzOverlap_); printf("AMG Schwarz domain type = %d\n", amgSchwarzDomainType_); printf("AMG Schwarz relax weight = %e\n", amgSchwarzRelaxWt_); } if ( HYOutputLevel_ & HYFEI_AMGDEBUG ) { HYPRE_BoomerAMGSetDebugFlag(HYPrecon_, 0); HYPRE_BoomerAMGSetPrintLevel(HYPrecon_, 1); } if ( amgSystemSize_ > 1 ) HYPRE_BoomerAMGSetNumFunctions(HYPrecon_, amgSystemSize_); HYPRE_BoomerAMGSetMaxLevels(HYPrecon_, amgMaxLevels_); HYPRE_BoomerAMGSetCoarsenType(HYPrecon_, amgCoarsenType_); HYPRE_BoomerAMGSetMeasureType(HYPrecon_, amgMeasureType_); HYPRE_BoomerAMGSetStrongThreshold(HYPrecon_,amgStrongThreshold_); HYPRE_BoomerAMGSetTol(HYPrecon_, 0.0e0); HYPRE_BoomerAMGSetMaxIter(HYPrecon_, 1); num_sweeps = hypre_CTAlloc(int,4,HYPRE_MEMORY_HOST); for ( i = 0; i < 4; i++ ) num_sweeps[i] = amgNumSweeps_[i]; HYPRE_BoomerAMGSetNumGridSweeps(HYPrecon_, num_sweeps); relax_type = hypre_CTAlloc(int,4,HYPRE_MEMORY_HOST); for ( i = 0; i < 4; i++ ) relax_type[i] = amgRelaxType_[i]; HYPRE_BoomerAMGSetGridRelaxType(HYPrecon_, relax_type); relax_wt = hypre_CTAlloc(double,amgMaxLevels_,HYPRE_MEMORY_HOST); for ( i = 0; i < amgMaxLevels_; i++ ) relax_wt[i] = amgRelaxWeight_[i]; HYPRE_BoomerAMGSetRelaxWeight(HYPrecon_, relax_wt); relax_omega = hypre_CTAlloc(double,amgMaxLevels_,HYPRE_MEMORY_HOST); for ( i = 0; i < amgMaxLevels_; i++ ) relax_omega[i] = amgRelaxOmega_[i]; HYPRE_BoomerAMGSetOmega(HYPrecon_, relax_omega); if (amgGridRlxType_) { relax_points = hypre_CTAlloc(int*,4,HYPRE_MEMORY_HOST); relax_points[0] = hypre_CTAlloc(int,num_sweeps[0],HYPRE_MEMORY_HOST); for ( j = 0; j < num_sweeps[0]; j++ ) relax_points[0][j] = 0; relax_points[1] = hypre_CTAlloc(int,2*num_sweeps[1],HYPRE_MEMORY_HOST); for ( j = 0; j < num_sweeps[1]; j+=2 ) {relax_points[1][j] = -1;relax_points[1][j+1] = 1;} relax_points[2] = hypre_CTAlloc(int,2*num_sweeps[2],HYPRE_MEMORY_HOST); for ( j = 0; j < num_sweeps[2]; j+=2 ) {relax_points[2][j] = -1;relax_points[2][j+1] = 1;} relax_points[3] = hypre_CTAlloc(int,num_sweeps[3],HYPRE_MEMORY_HOST); for ( j = 0; j < num_sweeps[3]; j++ ) relax_points[3][j] = 0; } else { relax_points = hypre_CTAlloc(int*,4,HYPRE_MEMORY_HOST); for ( i = 0; i < 4; i++ ) { relax_points[i] = hypre_CTAlloc(int,num_sweeps[i],HYPRE_MEMORY_HOST); for ( j = 0; j < num_sweeps[i]; j++ ) relax_points[i][j] = 0; } } HYPRE_BoomerAMGSetGridRelaxPoints(HYPrecon_, relax_points); if ( amgSmoothNumLevels_ > 0 ) { HYPRE_BoomerAMGSetSmoothType(HYPrecon_, amgSmoothType_); HYPRE_BoomerAMGSetSmoothNumLevels(HYPrecon_, amgSmoothNumLevels_); HYPRE_BoomerAMGSetSmoothNumSweeps(HYPrecon_, amgSmoothNumSweeps_); HYPRE_BoomerAMGSetSchwarzRlxWeight(HYPrecon_, amgSchwarzRelaxWt_); HYPRE_BoomerAMGSetVariant(HYPrecon_, amgSchwarzVariant_); HYPRE_BoomerAMGSetOverlap(HYPrecon_, amgSchwarzOverlap_); HYPRE_BoomerAMGSetDomainType(HYPrecon_, amgSchwarzDomainType_); } if ( amgUseGSMG_ == 1 ) { HYPRE_BoomerAMGSetGSMG(HYPrecon_, 4); HYPRE_BoomerAMGSetNumSamples(HYPrecon_,amgGSMGNSamples_); } HYPRE_BoomerAMGSetAggNumLevels(HYPrecon_, amgAggLevels_); HYPRE_BoomerAMGSetInterpType(HYPrecon_, amgInterpType_); HYPRE_BoomerAMGSetPMaxElmts(HYPrecon_, amgPmax_); } //*************************************************************************** // this function sets up ML preconditioner //--------------------------------------------------------------------------- void HYPRE_LinSysCore::setupPreconML() { #ifdef HAVE_ML if ((HYOutputLevel_ & HYFEI_SPECIALMASK) >= 1 && mypid_ == 0) { printf("ML strong threshold = %e\n", mlStrongThreshold_); printf("ML numsweeps(pre) = %d\n", mlNumPreSweeps_); printf("ML numsweeps(post) = %d\n", mlNumPostSweeps_); printf("ML smoother (pre) = %d\n", mlPresmootherType_); printf("ML smoother (post) = %d\n", mlPostsmootherType_); printf("ML relax weight = %e\n", mlRelaxWeight_); } HYPRE_LSI_MLSetMethod(HYPrecon_,mlMethod_); HYPRE_LSI_MLSetCoarseSolver(HYPrecon_,mlCoarseSolver_); HYPRE_LSI_MLSetCoarsenScheme(HYPrecon_,mlCoarsenScheme_); HYPRE_LSI_MLSetStrongThreshold(HYPrecon_,mlStrongThreshold_); HYPRE_LSI_MLSetNumPreSmoothings(HYPrecon_,mlNumPreSweeps_); HYPRE_LSI_MLSetNumPostSmoothings(HYPrecon_,mlNumPostSweeps_); HYPRE_LSI_MLSetPreSmoother(HYPrecon_,mlPresmootherType_); HYPRE_LSI_MLSetPostSmoother(HYPrecon_,mlPostsmootherType_); HYPRE_LSI_MLSetDampingFactor(HYPrecon_,mlRelaxWeight_); HYPRE_LSI_MLSetNumPDEs(HYPrecon_,mlNumPDEs_); #else return; #endif } //*************************************************************************** // this function sets up MLMaxwell preconditioner //--------------------------------------------------------------------------- void HYPRE_LinSysCore::setupPreconMLMaxwell() { #ifdef HAVE_MLMAXWELL HYPRE_ParCSRMatrix A_csr; if (maxwellGEN_ != NULL) HYPRE_LSI_MLMaxwellSetGMatrix(HYPrecon_,maxwellGEN_); else { printf("HYPRE_LSC::setupPreconMLMaxwell ERROR - no G matrix.\n"); exit(1); } if (maxwellANN_ == NULL) { HYPRE_IJMatrixGetObject(currA_, (void **) &A_csr); hypre_BoomerAMGBuildCoarseOperator((hypre_ParCSRMatrix *) maxwellGEN_, (hypre_ParCSRMatrix *) A_csr, (hypre_ParCSRMatrix *) maxwellGEN_, (hypre_ParCSRMatrix **) &maxwellANN_); } HYPRE_LSI_MLMaxwellSetANNMatrix(HYPrecon_,maxwellANN_); #else return; #endif } //*************************************************************************** // this function sets up AMS preconditioner //--------------------------------------------------------------------------- void HYPRE_LinSysCore::setupPreconAMS() { #if 0 HYPRE_ParVector parVecX, parVecY, parVecZ; #endif /* Set AMS parameters */ HYPRE_AMSSetDimension(HYPrecon_, amsNumPDEs_); HYPRE_AMSSetMaxIter(HYPrecon_, amsMaxIter_); HYPRE_AMSSetTol(HYPrecon_, amsTol_); HYPRE_AMSSetCycleType(HYPrecon_, amsCycleType_); HYPRE_AMSSetPrintLevel(HYPrecon_, amsPrintLevel_); HYPRE_AMSSetSmoothingOptions(HYPrecon_, amsRelaxType_, amsRelaxTimes_, amsRelaxWt_, amsRelaxOmega_); if (amsBetaPoisson_ != NULL) HYPRE_AMSSetBetaPoissonMatrix(HYPrecon_, amsBetaPoisson_); HYPRE_AMSSetAlphaAMGOptions(HYPrecon_, amsAlphaCoarsenType_, amsAlphaAggLevels_, amsAlphaRelaxType_, amsAlphaStrengthThresh_, amsAlphaInterpType_, amsAlphaPmax_); HYPRE_AMSSetBetaAMGOptions(HYPrecon_, amsBetaCoarsenType_, amsBetaAggLevels_, amsBetaRelaxType_, amsBetaStrengthThresh_, amsBetaInterpType_, amsBetaPmax_); #if 0 if (maxwellGEN_ != NULL) HYPRE_AMSSetDiscreteGradient(HYPrecon_, maxwellGEN_); else { printf("HYPRE_LSC::setupPreconAMS ERROR - no G matrix.\n"); exit(1); } if (amsX_ == NULL && amsY_ != NULL) { HYPRE_IJVectorGetObject(amsX_, (void **) &parVecX); HYPRE_IJVectorGetObject(amsY_, (void **) &parVecY); HYPRE_IJVectorGetObject(amsZ_, (void **) &parVecZ); HYPRE_AMSSetCoordinateVectors(HYPrecon_,parVecX,parVecY,parVecZ); } #endif // Call AMS to construct the discrete gradient matrix G // and the nodal coordinate vectors { HYPRE_ParCSRMatrix A_csr; HYPRE_ParVector b_csr; HYPRE_ParVector x_csr; HYPRE_IJMatrixGetObject(currA_, (void **) &A_csr); HYPRE_IJVectorGetObject(currB_, (void **) &b_csr); HYPRE_IJVectorGetObject(currX_, (void **) &x_csr); if( amsG_ == NULL ) { //Old way of doing things //only works for 1 domain per processor (in ALE3D) //not compatible with contact HYPRE_AMSFEISetup(HYPrecon_, A_csr, b_csr, x_csr, AMSData_.EdgeNodeList_, AMSData_.NodeNumbers_, AMSData_.numEdges_, AMSData_.numLocalNodes_, AMSData_.numNodes_, AMSData_.NodalCoord_); } else { //New Code// HYPRE_ParCSRMatrix G_csr; HYPRE_ParVector X_csr; HYPRE_ParVector Y_csr; HYPRE_ParVector Z_csr; HYPRE_IJMatrixGetObject(amsG_, (void **) &G_csr); HYPRE_IJVectorGetObject(amsX_, (void **) &X_csr); HYPRE_IJVectorGetObject(amsY_, (void **) &Y_csr); HYPRE_IJVectorGetObject(amsZ_, (void **) &Z_csr); HYPRE_AMSSetCoordinateVectors(HYPrecon_,X_csr,Y_csr,Z_csr); bool debugprint = false; if( debugprint ) { HYPRE_ParCSRMatrixPrint( G_csr, "G.parcsr" ); HYPRE_ParCSRMatrixPrint( A_csr, "A.parcsr" ); HYPRE_ParVectorPrint( b_csr, "B.parvector" ); HYPRE_ParVectorPrint( X_csr, "X.parvector" ); HYPRE_ParVectorPrint( Y_csr, "Y.parvector" ); HYPRE_ParVectorPrint( Z_csr, "Z.parvector" ); } HYPRE_AMSSetDiscreteGradient(HYPrecon_,G_csr); } if ((HYOutputLevel_ & HYFEI_SPECIALMASK) >= 1 && mypid_ == 0) printf("AMSprecon: finished building auxiliary info, calling AMSSetup\n"); //int ierr = HYPRE_AMSSetup(HYPrecon_,A_csr,b_csr,x_csr); if ((HYOutputLevel_ & HYFEI_SPECIALMASK) >= 1 && mypid_ == 0) printf("AMSprecon: finished with AMSSetup\n"); } } //*************************************************************************** // this function sets up DDICT preconditioner //--------------------------------------------------------------------------- void HYPRE_LinSysCore::setupPreconDDICT() { if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 1 && mypid_ == 0 ) { printf("DDICT - fillin = %e\n", ddictFillin_); printf("DDICT - drop tol = %e\n", ddictDropTol_); } if ( HYOutputLevel_ & HYFEI_DDILUT ) HYPRE_LSI_DDICTSetOutputLevel(HYPrecon_,2); HYPRE_LSI_DDICTSetFillin(HYPrecon_,ddictFillin_); HYPRE_LSI_DDICTSetDropTolerance(HYPrecon_,ddictDropTol_); } //*************************************************************************** // this function sets up DDILUT preconditioner //--------------------------------------------------------------------------- void HYPRE_LinSysCore::setupPreconDDILUT() { if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 1 && mypid_ == 0 ) { printf("DDILUT - fillin = %e\n", ddilutFillin_); printf("DDILUT - drop tol = %e\n", ddilutDropTol_); } if ( HYOutputLevel_ & HYFEI_DDILUT ) HYPRE_LSI_DDIlutSetOutputLevel(HYPrecon_,2); if ( ddilutReorder_ ) HYPRE_LSI_DDIlutSetReorder(HYPrecon_); HYPRE_LSI_DDIlutSetFillin(HYPrecon_,ddilutFillin_); HYPRE_LSI_DDIlutSetDropTolerance(HYPrecon_,ddilutDropTol_); if ( ddilutOverlap_ == 1 ) HYPRE_LSI_DDIlutSetOverlap(HYPrecon_); if ( ddilutReorder_ == 1 ) HYPRE_LSI_DDIlutSetReorder(HYPrecon_); } //*************************************************************************** // this function sets up Schwarz preconditioner //--------------------------------------------------------------------------- void HYPRE_LinSysCore::setupPreconSchwarz() { if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 1 && mypid_ == 0 ) { printf("Schwarz - ILU fillin = %e\n", schwarzFillin_); printf("Schwarz - nBlocks = %d\n", schwarzNblocks_); printf("Schwarz - blockSize = %d\n", schwarzBlksize_); } if ( HYOutputLevel_ & HYFEI_DDILUT ) HYPRE_LSI_SchwarzSetOutputLevel(HYPrecon_,2); HYPRE_LSI_SchwarzSetILUTFillin(HYPrecon_,schwarzFillin_); HYPRE_LSI_SchwarzSetNBlocks(HYPrecon_, schwarzNblocks_); HYPRE_LSI_SchwarzSetBlockSize(HYPrecon_, schwarzBlksize_); } //*************************************************************************** // this function sets up Polynomial preconditioner //--------------------------------------------------------------------------- void HYPRE_LinSysCore::setupPreconPoly() { if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 1 && mypid_ == 0) printf("Polynomial preconditioning - order = %d\n",polyOrder_ ); HYPRE_LSI_PolySetOrder(HYPrecon_, polyOrder_); } //*************************************************************************** // this function sets up ParaSails preconditioner //--------------------------------------------------------------------------- void HYPRE_LinSysCore::setupPreconParaSails() { if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 1 && mypid_ == 0 ) { printf("ParaSails - nlevels = %d\n",parasailsNlevels_); printf("ParaSails - threshold = %e\n",parasailsThreshold_); printf("ParaSails - filter = %e\n",parasailsFilter_); printf("ParaSails - sym = %d\n",parasailsSym_); printf("ParaSails - loadbal = %e\n",parasailsLoadbal_); } if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 1 ) HYPRE_ParCSRParaSailsSetLogging(HYPrecon_, 1); HYPRE_ParCSRParaSailsSetSym(HYPrecon_,parasailsSym_); HYPRE_ParCSRParaSailsSetParams(HYPrecon_, parasailsThreshold_, parasailsNlevels_); HYPRE_ParCSRParaSailsSetFilter(HYPrecon_, parasailsFilter_); HYPRE_ParCSRParaSailsSetLoadbal(HYPrecon_, parasailsLoadbal_); HYPRE_ParCSRParaSailsSetReuse(HYPrecon_, parasailsReuse_); } //*************************************************************************** // this function sets up Euclid preconditioner //--------------------------------------------------------------------------- void HYPRE_LinSysCore::setupPreconEuclid() { if ((HYOutputLevel_ & HYFEI_SPECIALMASK) >= 1 && mypid_ == 0) { for ( int i = 0; i < euclidargc_; i++ ) printf("Euclid parameter : %s %s\n", euclidargv_[2*i], euclidargv_[2*i+1]); } HYPRE_EuclidSetParams(HYPrecon_,euclidargc_*2,euclidargv_); } //*************************************************************************** // this function sets up Pilut preconditioner //--------------------------------------------------------------------------- void HYPRE_LinSysCore::setupPreconPILUT() { if (pilutFillin_ == 0) pilutFillin_ = pilutMaxNnzPerRow_; if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 1 && mypid_ == 0 ) { printf("PILUT - row size = %d\n", pilutFillin_); printf("PILUT - drop tol = %e\n", pilutDropTol_); } HYPRE_ParCSRPilutSetFactorRowSize(HYPrecon_,pilutFillin_); HYPRE_ParCSRPilutSetDropTolerance(HYPrecon_,pilutDropTol_); } //*************************************************************************** // this function sets up block preconditioner //--------------------------------------------------------------------------- void HYPRE_LinSysCore::setupPreconBlock() { HYPRE_Lookup *newLookup; newLookup = hypre_TAlloc(HYPRE_Lookup, 1, HYPRE_MEMORY_HOST); newLookup->object = (void *) lookup_; HYPRE_LSI_BlockPrecondSetLookup( HYPrecon_, newLookup ); free( newLookup ); } //*************************************************************************** // this function sets up system pde preconditioner //--------------------------------------------------------------------------- void HYPRE_LinSysCore::setupPreconSysPDE() { #ifdef HAVE_SYSPDE if (sysPDEMethod_ >= 0) HYPRE_ParCSRSysPDESetMethod(HYPrecon_, sysPDEMethod_); if (sysPDEFormat_ >= 0) HYPRE_ParCSRFormat(HYPrecon_, sysPDEFormat_); if (sysPDETol_ > 0.0) HYPRE_ParCSRSysPDESetTol(HYPrecon_, sysPDETol_); if (sysPDEMaxIter_ > 0) HYPRE_ParCSRSysPDESetMaxIter(HYPrecon_, sysPDEMaxIter_); if (sysPDENumPre_ > 0) HYPRE_ParCSRSysPDESetNPre(HYPrecon_, sysPDENumPre_); if (sysPDENumPost_ > 0) HYPRE_ParCSRSysPDESetNPost(HYPrecon_, sysPDENumPost_); if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 1 ) HYPRE_ParCSRSysPDESetLogging(HYPrecon_, 1); if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 1 ) HYPRE_ParCSRSysPDESetPrintLevel(HYPrecon_, 1); #endif } //*************************************************************************** // this function solve the incoming linear system using Boomeramg //--------------------------------------------------------------------------- void HYPRE_LinSysCore::solveUsingBoomeramg(int& status) { int i, j, *relax_type, *num_sweeps, **relax_points; double *relax_wt, *relax_omega; HYPRE_ParCSRMatrix A_csr; HYPRE_ParVector b_csr; HYPRE_ParVector x_csr; //------------------------------------------------------------------- // get matrix and vectors in ParCSR format //------------------------------------------------------------------- HYPRE_IJMatrixGetObject(currA_, (void **) &A_csr); HYPRE_IJVectorGetObject(currB_, (void **) &b_csr); HYPRE_IJVectorGetObject(currX_, (void **) &x_csr); //------------------------------------------------------------------- // set BoomerAMG parameters //------------------------------------------------------------------- HYPRE_BoomerAMGSetCoarsenType(HYSolver_, amgCoarsenType_); HYPRE_BoomerAMGSetMeasureType(HYSolver_, amgMeasureType_); HYPRE_BoomerAMGSetStrongThreshold(HYSolver_, amgStrongThreshold_); num_sweeps = hypre_CTAlloc(int,4,HYPRE_MEMORY_HOST); for ( i = 0; i < 4; i++ ) num_sweeps[i] = amgNumSweeps_[i]; HYPRE_BoomerAMGSetNumGridSweeps(HYSolver_, num_sweeps); relax_type = hypre_CTAlloc(int,4,HYPRE_MEMORY_HOST); for ( i = 0; i < 4; i++ ) relax_type[i] = amgRelaxType_[i]; HYPRE_BoomerAMGSetGridRelaxType(HYSolver_, relax_type); HYPRE_BoomerAMGSetMaxLevels(HYPrecon_, amgMaxLevels_); relax_wt = hypre_CTAlloc(double, amgMaxLevels_,HYPRE_MEMORY_HOST); for ( i = 0; i < amgMaxLevels_; i++ ) relax_wt[i] = amgRelaxWeight_[i]; HYPRE_BoomerAMGSetRelaxWeight(HYSolver_, relax_wt); relax_omega = hypre_CTAlloc(double, amgMaxLevels_,HYPRE_MEMORY_HOST); for ( i = 0; i < amgMaxLevels_; i++ ) relax_omega[i] = amgRelaxOmega_[i]; HYPRE_BoomerAMGSetOmega(HYPrecon_, relax_omega); relax_points = hypre_CTAlloc(int*,4,HYPRE_MEMORY_HOST); for ( i = 0; i < 4; i++ ) { relax_points[i] = hypre_CTAlloc(int,num_sweeps[i],HYPRE_MEMORY_HOST); for ( j = 0; j < num_sweeps[i]; j++ ) relax_points[i][j] = 0; } HYPRE_BoomerAMGSetGridRelaxPoints(HYPrecon_, relax_points); if ( amgSmoothNumLevels_ > 0 ) { HYPRE_BoomerAMGSetSmoothType(HYPrecon_, amgSmoothType_); HYPRE_BoomerAMGSetSmoothNumLevels(HYPrecon_, amgSmoothNumLevels_); HYPRE_BoomerAMGSetSmoothNumSweeps(HYPrecon_, amgSmoothNumSweeps_); HYPRE_BoomerAMGSetSchwarzRlxWeight(HYPrecon_, amgSchwarzRelaxWt_); HYPRE_BoomerAMGSetVariant(HYPrecon_, amgSchwarzVariant_); HYPRE_BoomerAMGSetOverlap(HYPrecon_, amgSchwarzOverlap_); HYPRE_BoomerAMGSetDomainType(HYPrecon_, amgSchwarzDomainType_); } if ( amgUseGSMG_ == 1 ) { HYPRE_BoomerAMGSetGSMG(HYPrecon_, 4); HYPRE_BoomerAMGSetNumSamples(HYPrecon_,amgGSMGNSamples_); } if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 1 && mypid_ == 0 ) { printf("***************************************************\n"); printf("* Boomeramg (AMG) solver \n"); printf("* coarsen type = %d\n", amgCoarsenType_); printf("* measure type = %d\n", amgMeasureType_); printf("* threshold = %e\n", amgStrongThreshold_); printf("* numsweeps = %d\n", amgNumSweeps_[0]); printf("* relax type = %d\n", amgRelaxType_[0]); printf("* relax weight = %e\n", amgRelaxWeight_[0]); printf("* maximum iterations = %d\n", maxIterations_); printf("* smooth type = %d\n", amgSmoothType_); printf("* smooth numlevels = %d\n", amgSmoothNumLevels_); printf("* smooth numsweeps = %d\n", amgSmoothNumSweeps_); printf("* Schwarz variant = %d\n", amgSchwarzVariant_); printf("* Schwarz overlap = %d\n", amgSchwarzOverlap_); printf("* Schwarz domain type = %d\n", amgSchwarzDomainType_); printf("* Schwarz relax weight = %e\n", amgSchwarzRelaxWt_); printf("* convergence tolerance = %e\n", tolerance_); printf("*--------------------------------------------------\n"); } if ( HYOutputLevel_ & HYFEI_AMGDEBUG ) { HYPRE_BoomerAMGSetDebugFlag(HYSolver_, 0); HYPRE_BoomerAMGSetPrintLevel(HYSolver_, 1); } HYPRE_BoomerAMGSetMaxIter(HYSolver_, maxIterations_); HYPRE_BoomerAMGSetMeasureType(HYSolver_, 0); HYPRE_BoomerAMGSetup( HYSolver_, A_csr, b_csr, x_csr ); //------------------------------------------------------------------- // BoomerAMG solve //------------------------------------------------------------------- HYPRE_BoomerAMGSolve( HYSolver_, A_csr, b_csr, x_csr ); status = 0; } //*************************************************************************** // this function solve the incoming linear system using SuperLU //--------------------------------------------------------------------------- double HYPRE_LinSysCore::solveUsingSuperLU(int& status) { double rnorm=-1.0; #ifdef HAVE_SUPERLU int i, nnz, nrows, ierr; int rowSize, *colInd, *new_ia, *new_ja, *ind_array; int nz_ptr, *partition, start_row, end_row; double *colVal, *new_a; HYPRE_ParCSRMatrix A_csr; HYPRE_ParVector r_csr; HYPRE_ParVector b_csr; HYPRE_ParVector x_csr; int info=0, permc_spec; int *perm_r, *perm_c; double *rhs, *soln; superlu_options_t slu_options; SuperLUStat_t slu_stat; SuperMatrix A2, B, L, U; NRformat *Ustore; SCformat *Lstore; //------------------------------------------------------------------- // available for sequential processing only for now //------------------------------------------------------------------- if ( numProcs_ > 1 ) { printf("solveUsingSuperLU ERROR - too many processors.\n"); status = -1; return rnorm; } //------------------------------------------------------------------- // need to construct a CSR matrix, and the column indices should // have been stored in colIndices and rowLengths //------------------------------------------------------------------- if ( localStartRow_ != 1 ) { printf("solveUsingSuperLU ERROR - row does not start at 1\n"); status = -1; return rnorm; } //------------------------------------------------------------------- // get information about the current matrix //------------------------------------------------------------------- HYPRE_IJMatrixGetObject(currA_, (void **) &A_csr); HYPRE_ParCSRMatrixGetRowPartitioning( A_csr, &partition ); start_row = partition[0]; end_row = partition[1] - 1; nrows = end_row - start_row + 1; free( partition ); nnz = 0; for ( i = start_row; i <= end_row; i++ ) { HYPRE_ParCSRMatrixGetRow(A_csr,i,&rowSize,&colInd,&colVal); nnz += rowSize; HYPRE_ParCSRMatrixRestoreRow(A_csr,i,&rowSize,&colInd,&colVal); } new_ia = new int[nrows+1]; new_ja = new int[nnz]; new_a = new double[nnz]; nz_ptr = HYPRE_LSI_GetParCSRMatrix(currA_,nrows,nnz,new_ia,new_ja,new_a); nnz = nz_ptr; //------------------------------------------------------------------- // set up SuperLU CSR matrix and the corresponding rhs //------------------------------------------------------------------- dCreate_CompRow_Matrix(&A2,nrows,nrows,nnz,new_a,new_ja,new_ia, SLU_NR,SLU_D,SLU_GE); ind_array = new int[nrows]; for ( i = 0; i < nrows; i++ ) ind_array[i] = i; rhs = new double[nrows]; ierr = HYPRE_IJVectorGetValues(currB_, nrows, ind_array, rhs); hypre_assert(!ierr); dCreate_Dense_Matrix(&B, nrows, 1, rhs, nrows, SLU_DN, SLU_D, SLU_GE); //------------------------------------------------------------------- // set up the rest and solve (permc_spec=0 : natural ordering) //------------------------------------------------------------------- perm_r = new int[nrows]; perm_c = new int[nrows]; permc_spec = superluOrdering_; get_perm_c(permc_spec, &A2, perm_c); for ( i = 0; i < nrows; i++ ) perm_r[i] = 0; set_default_options(&slu_options); slu_options.ColPerm = MY_PERMC; slu_options.Fact = DOFACT; StatInit(&slu_stat); dgssv(&slu_options, &A2, perm_c, perm_r, &L, &U, &B, &slu_stat, &info); //------------------------------------------------------------------- // postprocessing of the return status information //------------------------------------------------------------------- if ( info == 0 ) { status = 1; Lstore = (SCformat *) L.Store; Ustore = (NRformat *) U.Store; if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 3 ) { printf("No of nonzeros in factor L = %d\n", Lstore->nnz); printf("No of nonzeros in factor U = %d\n", Ustore->nnz); printf("SuperLU : NNZ in L+U = %d\n",Lstore->nnz+Ustore->nnz-nrows); } } else { status = 0; printf("HYPRE_LinSysCore::solveUsingSuperLU - dgssv error = %d\n",info); } //------------------------------------------------------------------- // fetch the solution and find residual norm //------------------------------------------------------------------- if ( info == 0 ) { soln = (double *) ((DNformat *) B.Store)->nzval; ierr = HYPRE_IJVectorSetValues(currX_, nrows, (const int *) ind_array, (const double *) soln); hypre_assert(!ierr); HYPRE_IJVectorGetObject(currX_, (void **) &x_csr); HYPRE_IJVectorGetObject(currB_, (void **) &b_csr); HYPRE_IJVectorGetObject(currR_, (void **) &r_csr); ierr = HYPRE_ParVectorCopy( b_csr, r_csr ); hypre_assert(!ierr); HYPRE_ParCSRMatrixMatvec( -1.0, A_csr, x_csr, 1.0, r_csr ); ierr = HYPRE_ParVectorInnerProd( r_csr, r_csr, &rnorm); hypre_assert(!ierr); rnorm = sqrt( rnorm ); if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 2 ) printf("HYPRE_LSC::solveUsingSuperLU - FINAL NORM = %e.\n",rnorm); } //------------------------------------------------------------------- // clean up //------------------------------------------------------------------- delete [] ind_array; delete [] rhs; delete [] perm_c; delete [] perm_r; delete [] new_ia; delete [] new_ja; delete [] new_a; Destroy_SuperMatrix_Store(&B); Destroy_SuperNode_Matrix(&L); SUPERLU_FREE( A2.Store ); SUPERLU_FREE( ((NRformat *) U.Store)->colind); SUPERLU_FREE( ((NRformat *) U.Store)->rowptr); SUPERLU_FREE( ((NRformat *) U.Store)->nzval); SUPERLU_FREE( U.Store ); StatFree(&slu_stat); #else status = -1; printf("HYPRE_LSC::solveUsingSuperLU : not available.\n"); #endif return rnorm; } //*************************************************************************** // this function solve the incoming linear system using SuperLU // using expert mode //--------------------------------------------------------------------------- double HYPRE_LinSysCore::solveUsingSuperLUX(int& status) { double rnorm=-1.0; #ifdef HAVE_SUPERLU int i, nnz, nrows, ierr; int rowSize, *colInd, *new_ia, *new_ja, *ind_array; int nz_ptr; int *partition, start_row, end_row; double *colVal, *new_a; HYPRE_ParCSRMatrix A_csr; HYPRE_ParVector r_csr; HYPRE_ParVector b_csr; HYPRE_ParVector x_csr; int info, permc_spec; int *perm_r, *perm_c, *etree, lwork; double *rhs, *soln, *sol2; double *R, *C; double *ferr, *berr; double rpg, rcond; void *work=NULL; char equed[1]; GlobalLU_t Glu; mem_usage_t mem_usage; superlu_options_t slu_options; SuperLUStat_t slu_stat; SuperMatrix A2, B, X, L, U; NRformat *Ustore; SCformat *Lstore; //------------------------------------------------------------------- // available for sequential processing only for now //------------------------------------------------------------------- if ( numProcs_ > 1 ) { printf("solveUsingSuperLUX ERROR - too many processors.\n"); status = -1; return rnorm; } //------------------------------------------------------------------- // need to construct a CSR matrix, and the column indices should // have been stored in colIndices and rowLengths //------------------------------------------------------------------- if ( localStartRow_ != 1 ) { printf("solveUsingSuperLUX ERROR - row not start at 1\n"); status = -1; return rnorm; } //------------------------------------------------------------------- // get information about the current matrix //------------------------------------------------------------------- HYPRE_IJMatrixGetObject(currA_, (void**) &A_csr); HYPRE_ParCSRMatrixGetRowPartitioning( A_csr, &partition ); start_row = partition[0]; end_row = partition[1] - 1; nrows = end_row - start_row + 1; free( partition ); nnz = 0; for ( i = 0; i < nrows; i++ ) { HYPRE_ParCSRMatrixGetRow(A_csr,i,&rowSize,&colInd,&colVal); nnz += rowSize; HYPRE_ParCSRMatrixRestoreRow(A_csr,i,&rowSize,&colInd,&colVal); } new_ia = new int[nrows+1]; new_ja = new int[nnz]; new_a = new double[nnz]; nz_ptr = HYPRE_LSI_GetParCSRMatrix(currA_,nrows,nnz,new_ia,new_ja,new_a); nnz = nz_ptr; //------------------------------------------------------------------- // set up SuperLU CSR matrix and the corresponding rhs //------------------------------------------------------------------- dCreate_CompRow_Matrix(&A2,nrows,nrows,nnz,new_a,new_ja,new_ia,SLU_NR, SLU_D,SLU_GE); ind_array = new int[nrows]; for ( i = 0; i < nrows; i++ ) ind_array[i] = i; rhs = new double[nrows]; ierr = HYPRE_IJVectorGetValues(currB_, nrows, ind_array, rhs); hypre_assert(!ierr); dCreate_Dense_Matrix(&B, nrows, 1, rhs, nrows, SLU_DN, SLU_D, SLU_GE); soln = new double[nrows]; for ( i = 0; i < nrows; i++ ) soln[i] = 0.0; dCreate_Dense_Matrix(&X, nrows, 1, soln, nrows, SLU_DN, SLU_D, SLU_GE); //------------------------------------------------------------------- // set up the other parameters (permc_spec=0 : natural ordering) //------------------------------------------------------------------- perm_r = new int[nrows]; for ( i = 0; i < nrows; i++ ) perm_r[i] = 0; perm_c = new int[nrows]; etree = new int[nrows]; permc_spec = superluOrdering_; get_perm_c(permc_spec, &A2, perm_c); lwork = 0; set_default_options(&slu_options); slu_options.ColPerm = MY_PERMC; slu_options.Equil = YES; slu_options.Trans = NOTRANS; slu_options.Fact = DOFACT; slu_options.IterRefine = SLU_DOUBLE; slu_options.DiagPivotThresh = 1.0; slu_options.PivotGrowth = YES; slu_options.ConditionNumber = YES; StatInit(&slu_stat); *equed = 'N'; R = (double *) SUPERLU_MALLOC(A2.nrow * sizeof(double)); C = (double *) SUPERLU_MALLOC(A2.ncol * sizeof(double)); ferr = (double *) SUPERLU_MALLOC(sizeof(double)); berr = (double *) SUPERLU_MALLOC(sizeof(double)); //------------------------------------------------------------------- // solve //------------------------------------------------------------------- // dgssvx(&slu_options, &A2, perm_c, perm_r, etree, // equed, R, C, &L, &U, work, lwork, &B, &X, // &rpg, &rcond, ferr, berr, &mem_usage, &slu_stat, &info); dgssvx(&slu_options, &A2, perm_c, perm_r, etree, equed, R, C, &L, &U, work, lwork, &B, &X, &rpg, &rcond, ferr, berr, &Glu, &mem_usage, &slu_stat, &info); //------------------------------------------------------------------- // print SuperLU internal information at the first step //------------------------------------------------------------------- if ( info == 0 || info == nrows+1 ) { status = 1; Lstore = (SCformat *) L.Store; Ustore = (NRformat *) U.Store; if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 3 ) { printf("Recip. pivot growth = %e\n", rpg); printf("%8s%16s%16s\n", "rhs", "FERR", "BERR"); printf("%8d%16e%16e\n", 1, ferr[0], berr[0]); if ( rcond != 0.0 ) printf(" SuperLU : condition number = %e\n", 1.0/rcond); else printf(" SuperLU : Recip. condition number = %e\n", rcond); printf("No of nonzeros in factor L = %d\n", Lstore->nnz); printf("No of nonzeros in factor U = %d\n", Ustore->nnz); printf("SuperLUX : NNZ in L+U = %d\n", Lstore->nnz+Ustore->nnz-nrows); } } else { printf("solveUsingSuperLUX - dgssvx error code = %d\n",info); status = 0; } //------------------------------------------------------------------- // fetch the solution and find residual norm //------------------------------------------------------------------- if ( status == 1 ) { sol2 = (double *) ((DNformat *) X.Store)->nzval; ierr = HYPRE_IJVectorSetValues(currX_, nrows, (const int *) ind_array, (const double *) sol2); hypre_assert(!ierr); HYPRE_IJVectorGetObject(currX_, (void **) &x_csr); HYPRE_IJVectorGetObject(currR_, (void **) &r_csr); HYPRE_IJVectorGetObject(currB_, (void **) &b_csr); ierr = HYPRE_ParVectorCopy( b_csr, r_csr ); hypre_assert(!ierr); ierr = HYPRE_ParCSRMatrixMatvec( -1.0, A_csr, x_csr, 1.0, r_csr ); hypre_assert(!ierr); ierr = HYPRE_ParVectorInnerProd( r_csr, r_csr, &rnorm); hypre_assert(!ierr); rnorm = sqrt( rnorm ); if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 2 ) printf("HYPRE_LSC::solveUsingSuperLUX - FINAL NORM = %e.\n",rnorm); } //------------------------------------------------------------------- // clean up //------------------------------------------------------------------- delete [] ind_array; delete [] perm_c; delete [] perm_r; delete [] etree; delete [] rhs; delete [] soln; delete [] new_ia; delete [] new_ja; delete [] new_a; Destroy_SuperMatrix_Store(&B); Destroy_SuperMatrix_Store(&X); Destroy_SuperNode_Matrix(&L); SUPERLU_FREE( A2.Store ); SUPERLU_FREE( ((NRformat *) U.Store)->colind); SUPERLU_FREE( ((NRformat *) U.Store)->rowptr); SUPERLU_FREE( ((NRformat *) U.Store)->nzval); SUPERLU_FREE( U.Store ); SUPERLU_FREE (R); SUPERLU_FREE (C); SUPERLU_FREE (ferr); SUPERLU_FREE (berr); StatFree(&slu_stat); #else status = -1; printf("HYPRE_LSC::solveUsingSuperLUX : not available.\n"); #endif return rnorm; } //*************************************************************************** // this function solve the incoming linear system using distributed SuperLU //--------------------------------------------------------------------------- double HYPRE_LinSysCore::solveUsingDSuperLU(int& status) { double rnorm=1.0; #ifdef HYPRE_USING_DSUPERLU int ierr; HYPRE_ParCSRMatrix A_csr; HYPRE_ParVector x_csr, b_csr, r_csr; HYPRE_IJMatrixGetObject(currA_, (void **) &A_csr); HYPRE_IJVectorGetObject(currX_, (void **) &x_csr); HYPRE_IJVectorGetObject(currB_, (void **) &b_csr); HYPRE_IJVectorGetObject(currR_, (void **) &r_csr); HYPRE_LSI_DSuperLUCreate(comm_, &HYSolver_); HYPRE_LSI_DSuperLUSetOutputLevel(HYSolver_, HYOutputLevel_); HYPRE_LSI_DSuperLUSetup(HYSolver_, A_csr, b_csr, x_csr); HYPRE_LSI_DSuperLUSolve(HYSolver_, A_csr, b_csr, x_csr); HYPRE_LSI_DSuperLUDestroy(HYSolver_); ierr = HYPRE_ParVectorCopy( b_csr, r_csr ); hypre_assert(!ierr); ierr = HYPRE_ParCSRMatrixMatvec( -1.0, A_csr, x_csr, 1.0, r_csr ); hypre_assert(!ierr); ierr = HYPRE_ParVectorInnerProd( r_csr, r_csr, &rnorm); hypre_assert(!ierr); rnorm = sqrt( rnorm ); //if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 1 ) // printf("HYPRE_LSC::solveUsingDSuperLU - FINAL NORM = %e.\n",rnorm); #endif return rnorm; } //*************************************************************************** // this function solve the incoming linear system using Y12M //--------------------------------------------------------------------------- void HYPRE_LinSysCore::solveUsingY12M(int& status) { #ifdef Y12M int i, k, nnz, nrows, ierr; int rowSize, *colInd, *ind_array; int j, nz_ptr, *colLengths, count, maxRowSize; double *colVal, rnorm; double upperSum, lowerSum, *accuSoln, *origRhs; HYPRE_ParCSRMatrix A_csr; HYPRE_ParVector r_csr; HYPRE_ParVector b_csr; HYPRE_ParVector x_csr; int n, nn, nn1, *rnr, *snr, *ha, iha, iflag[10], ifail; double *pivot, *val, *rhs, aflag[8]; //------------------------------------------------------------------- // available for sequential processing only for now //------------------------------------------------------------------- if ( numProcs_ > 1 ) { printf("solveUsingY12M ERROR - too many processors.\n"); status = 0; return; } //------------------------------------------------------------------- // need to construct a CSR matrix, and the column indices should // have been stored in colIndices and rowLengths //------------------------------------------------------------------- if ( localStartRow_ != 1 ) { printf("solveUsingY12M ERROR - row does not start at 1.\n"); status = -1; return; } if (slideReduction_ == 1) nrows = localEndRow_ - 2 * nConstraints_; else if (slideReduction_ == 2 || slideReduction_ == 3) nrows = localEndRow_ - nConstraints_; else if (schurReduction_ == 1) nrows = localEndRow_ - localStartRow_ + 1 - A21NRows_; else nrows = localEndRow_; colLengths = new int[nrows]; for ( i = 0; i < nrows; i++ ) colLengths[i] = 0; maxRowSize = 0; HYPRE_IJMatrixGetObject(currA_, (void**) &A_csr); for ( i = 0; i < nrows; i++ ) { HYPRE_ParCSRMatrixGetRow(A_csr,i,&rowSize,&colInd,&colVal); maxRowSize = ( rowSize > maxRowSize ) ? rowSize : maxRowSize; for ( j = 0; j < rowSize; j++ ) if ( colVal[j] != 0.0 ) colLengths[colInd[j]]++; HYPRE_ParCSRMatrixRestoreRow(A_csr,i,&rowSize,&colInd,&colVal); } nnz = 0; for ( i = 0; i < nrows; i++ ) nnz += colLengths[i]; nn = 2 * nnz; nn1 = 2 * nnz; snr = new int[nn]; rnr = new int[nn1]; val = new double[nn]; pivot = new double[nrows]; iha = nrows; ha = new int[iha*11]; nz_ptr = 0; for ( i = 0; i < nrows; i++ ) { HYPRE_ParCSRMatrixGetRow(A_csr,i,&rowSize,&colInd,&colVal); for ( j = 0; j < rowSize; j++ ) { if ( colVal[j] != 0.0 ) { rnr[nz_ptr] = i + 1; snr[nz_ptr] = colInd[j] + 1; val[nz_ptr] = colVal[j]; nz_ptr++; } } HYPRE_ParCSRMatrixRestoreRow(A_csr,i,&rowSize,&colInd,&colVal); } nnz = nz_ptr; //------------------------------------------------------------------- // set up other parameters and the right hand side //------------------------------------------------------------------- aflag[0] = 16.0; aflag[1] = 0.0; aflag[2] = 1.0e8; aflag[3] = 1.0e-12; iflag[0] = 1; iflag[1] = 3; iflag[2] = 1; iflag[3] = 0; iflag[4] = 2; ind_array = new int[nrows]; for ( i = 0; i < nrows; i++ ) ind_array[i] = i; rhs = new double[nrows]; ierr = HYPRE_IJVectorGetValues(currB_, nrows, ind_array, rhs); hypre_assert(!ierr); //------------------------------------------------------------------- // call Y12M to solve the linear system //------------------------------------------------------------------- y12maf_(&nrows,&nnz,val,snr,&nn,rnr,&nn1,pivot,ha,&iha,aflag,iflag, rhs,&ifail); if ( ifail != 0 && (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 1 ) { printf("solveUsingY12M WARNING - ifail = %d\n", ifail); } //------------------------------------------------------------------- // postprocessing //------------------------------------------------------------------- if ( ifail == 0 ) { ierr = HYPRE_IJVectorSetValues(currX_, nrows, (const int *) &ind_array, (const double *) rhs); hypre_assert(!ierr); HYPRE_IJVectorGetObject(currX_, (void**) &x_csr); HYPRE_IJVectorGetObject(currR_, (void**) &r_csr); HYPRE_IJVectorGetObject(currB_, (void**) &b_csr); ierr = HYPRE_ParVectorCopy( b_csr, r_csr ); hypre_assert(!ierr); ierr = HYPRE_ParCSRMatrixMatvec( -1.0, A_csr, x_csr, 1.0, r_csr ); hypre_assert(!ierr); ierr = HYPRE_ParVectorInnerProd( r_csr, r_csr, &rnorm); hypre_assert(!ierr); rnorm = sqrt( rnorm ); if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 1 ) printf("HYPRE_LSC::solveUsingY12M - final norm = %e.\n", rnorm); } //------------------------------------------------------------------- // clean up //------------------------------------------------------------------- delete [] ind_array; delete [] rhs; delete [] val; delete [] snr; delete [] rnr; delete [] ha; delete [] pivot; #else status = -1; printf("HYPRE_LSC::solveUsingY12M - not available.\n"); #endif } //*************************************************************************** // this function solve the incoming linear system using Y12M //--------------------------------------------------------------------------- void HYPRE_LinSysCore::solveUsingAMGe(int &iterations) { #ifdef HAVE_AMGE int i, nrows, ierr, *ind_array, status; double rnorm, *rhs, *sol; HYPRE_ParCSRMatrix A_csr; HYPRE_ParVector r_csr; HYPRE_ParVector b_csr; HYPRE_ParVector x_csr; //------------------------------------------------------------------- // available for sequential processing only for now //------------------------------------------------------------------- if ( numProcs_ > 1 ) { printf("solveUsingAMGE ERROR - too many processors.\n"); iterations = 0; return; } //------------------------------------------------------------------- // need to construct a CSR matrix, and the column indices should // have been stored in colIndices and rowLengths //------------------------------------------------------------------- if ( localStartRow_ != 1 ) { printf("solveUsingAMGe ERROR - row does not start at 1.\n"); status = -1; return; } if (slideReduction_ == 1) nrows = localEndRow_ - 2 * nConstraints_; else if (slideReduction_ == 2 || slideReduction_ == 3) nrows = localEndRow_ - nConstraints_; else if (schurReduction_ == 1) nrows = localEndRow_ - localStartRow_ + 1 - A21NRows_; else nrows = localEndRow_; //------------------------------------------------------------------- // set up the right hand side //------------------------------------------------------------------- ind_array = new int[nrows]; for ( i = 0; i < nrows; i++ ) ind_array[i] = i; rhs = new double[nrows]; ierr = HYPRE_IJVectorGetValues(currB_, nrows, ind_array, rhs); hypre_assert(!ierr); //------------------------------------------------------------------- // call Y12M to solve the linear system //------------------------------------------------------------------- sol = new double[nrows]; status = HYPRE_LSI_AMGeSolve( rhs, sol ); //------------------------------------------------------------------- // postprocessing //------------------------------------------------------------------- ierr = HYPRE_IJVectorSetValues(currX_, nrows, (const int *) &ind_array, (const double *) sol); hypre_assert(!ierr); HYPRE_IJVectorGetObject(currX_, (void**) &x_csr); HYPRE_IJVectorGetObject(currR_, (void**) &r_csr); HYPRE_IJVectorGetObject(currB_, (void**) &b_csr); ierr = HYPRE_ParVectorCopy( b_csr, r_csr ); hypre_assert(!ierr); ierr = HYPRE_ParCSRMatrixMatvec( -1.0, A_csr, x_csr, 1.0, r_csr ); hypre_assert(!ierr); ierr = HYPRE_ParVectorInnerProd( r_csr, r_csr, &rnorm); hypre_assert(!ierr); rnorm = sqrt( rnorm ); if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 1 ) printf("HYPRE_LSC::solveUsingAMGe - final norm = %e.\n", rnorm); //------------------------------------------------------------------- // clean up //------------------------------------------------------------------- delete [] ind_array; delete [] rhs; delete [] sol; #else iterations = 0; printf("HYPRE_LSC::solveUsingAMGe - not available.\n"); #endif } //*************************************************************************** // this function loads in the constraint numbers for reduction // (to activate automatic slave search, constrList should be NULL) //--------------------------------------------------------------------------- void HYPRE_LinSysCore::loadConstraintNumbers(int nConstr, int *constrList) { if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 3 ) printf("%4d : HYPRE_LSC::loadConstraintNumbers - size = %d\n", mypid_, nConstr); nConstraints_ = nConstr; if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 3 ) printf("%4d : HYPRE_LSC::leaving loadConstraintNumbers\n", mypid_); } //*************************************************************************** // this function extracts the the version number from HYPRE //--------------------------------------------------------------------------- char *HYPRE_LinSysCore::getVersion() { static char extVersion[100]; char hypre[200], hypreVersion[50], ctmp[50]; sprintf(hypre, "%s", HYPRE_VERSION); sscanf(hypre, "%s %s", ctmp, hypreVersion); sprintf(extVersion, "%s-%s", HYPRE_FEI_Version(), hypreVersion); return extVersion; } //*************************************************************************** // create a node to equation map from the solution vector //--------------------------------------------------------------------------- void HYPRE_LinSysCore::beginCreateMapFromSoln() { mapFromSolnFlag_ = 1; mapFromSolnLengMax_ = 10; mapFromSolnLeng_ = 0; mapFromSolnList_ = new int[mapFromSolnLengMax_]; mapFromSolnList2_ = new int[mapFromSolnLengMax_]; return; } //*************************************************************************** // create a node to equation map from the solution vector //--------------------------------------------------------------------------- void HYPRE_LinSysCore::endCreateMapFromSoln() { int i, *iarray; double *darray; if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 3 ) printf("%4d : HYPRE_LSC::entering endCreateMapFromSoln.\n",mypid_); mapFromSolnFlag_ = 0; if ( mapFromSolnLeng_ > 0 ) darray = new double[mapFromSolnLeng_]; for ( i = 0; i < mapFromSolnLeng_; i++ ) darray[i] = (double) mapFromSolnList_[i]; hypre_qsort1(mapFromSolnList2_, darray, 0, mapFromSolnLeng_-1); iarray = mapFromSolnList2_; mapFromSolnList2_ = mapFromSolnList_; mapFromSolnList_ = iarray; for ( i = 0; i < mapFromSolnLeng_; i++ ) mapFromSolnList2_[i] = (int) darray[i]; delete [] darray; for ( i = 0; i < mapFromSolnLeng_; i++ ) printf("HYPRE_LSC::mapFromSoln %d = %d\n",mapFromSolnList_[i], mapFromSolnList2_[i]); if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 3 ) printf("%4d : HYPRE_LSC::leaving endCreateMapFromSoln.\n",mypid_); } //*************************************************************************** // add extra nonzero entries into the matrix data structure //--------------------------------------------------------------------------- void HYPRE_LinSysCore::putIntoMappedMatrix(int row, int numValues, const double* values, const int* scatterIndices) { int i, index, colIndex, localRow, mappedRow, mappedCol, newLeng; int *tempInd, ind2; double *tempVal; //------------------------------------------------------------------- // error checking //------------------------------------------------------------------- if ( systemAssembled_ == 1 ) { printf("putIntoMappedMatrix ERROR : matrix already assembled\n"); exit(1); } if ( (row+1) < localStartRow_ || (row+1) > localEndRow_ ) { printf("putIntoMappedMatrix ERROR : invalid row number %d.\n",row); exit(1); } index = HYPRE_LSI_Search(mapFromSolnList_, row, mapFromSolnLeng_); if ( index >= 0 ) mappedRow = mapFromSolnList2_[index]; else mappedRow = row; localRow = mappedRow - localStartRow_ + 1; //------------------------------------------------------------------- // load the local matrix //------------------------------------------------------------------- newLeng = rowLengths_[localRow] + numValues; tempInd = new int[newLeng]; tempVal = new double[newLeng]; for ( i = 0; i < rowLengths_[localRow]; i++ ) { tempVal[i] = colValues_[localRow][i]; tempInd[i] = colIndices_[localRow][i]; } delete [] colValues_[localRow]; delete [] colIndices_[localRow]; colValues_[localRow] = tempVal; colIndices_[localRow] = tempInd; index = rowLengths_[localRow]; for ( i = 0; i < numValues; i++ ) { colIndex = scatterIndices[i]; ind2 = HYPRE_LSI_Search(mapFromSolnList_,colIndex,mapFromSolnLeng_); if ( mapFromSolnList_ != NULL ) mappedCol = mapFromSolnList2_[ind2]; else mappedCol = colIndex; ind2 = HYPRE_LSI_Search(colIndices_[localRow],mappedCol+1,index); if ( ind2 >= 0 ) { newLeng--; colValues_[localRow][ind2] = values[i]; if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 4 ) printf("%4d : putIntoMappedMatrix (add) : row, col = %8d %8d %e \n", mypid_, localRow, colIndices_[localRow][ind2]-1, colValues_[localRow][ind2]); } else { ind2 = index; colIndices_[localRow][index] = mappedCol + 1; colValues_[localRow][index++] = values[i]; if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 4 ) printf("%4d : putIntoMappedMatrix : row, col = %8d %8d %e \n", mypid_, localRow, colIndices_[localRow][ind2]-1, colValues_[localRow][ind2]); hypre_qsort1(colIndices_[localRow],colValues_[localRow],0,index-1); } } rowLengths_[localRow] = newLeng; } //*************************************************************************** // project the initial guess into the previous solutions (x + X inv(R) Q^T b) // Given r and B (a collection of right hand vectors such that A X = B) // // min || r - B v || // v // // = min (trans(r) r - trans(r) B v-trans(v) trans(B) r+trans(v) trans(B) B v) // // ==> trans(B) r = trans(B) B v ==> v = inv(trans(B) B) trans(B) r // // Once v is computed, x = x + X v //--------------------------------------------------------------------------- void HYPRE_LinSysCore::computeMinResProjection(HYPRE_ParCSRMatrix A_csr, HYPRE_ParVector x_csr, HYPRE_ParVector b_csr) { int i; double alpha; HYPRE_ParVector r_csr, v_csr, w_csr; //----------------------------------------------------------------------- // diagnostic message //----------------------------------------------------------------------- if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 4 ) printf("%4d : HYPRE_LSC::entering computeMinResProjection %d\n",mypid_, projectCurrSize_); if ( projectCurrSize_ == 0 && HYpxs_ == NULL ) return; //----------------------------------------------------------------------- // compute r = b - A x, save Ax (to w) //----------------------------------------------------------------------- HYPRE_IJVectorGetObject(currR_, (void **) &r_csr); HYPRE_IJVectorGetObject(HYpbs_[projectSize_], (void **) &w_csr); HYPRE_ParCSRMatrixMatvec( 1.0, A_csr, x_csr, 0.0, w_csr ); HYPRE_ParVectorCopy( b_csr, r_csr ); alpha = -1.0; hypre_ParVectorAxpy(alpha,(hypre_ParVector*)w_csr,(hypre_ParVector*)r_csr); //----------------------------------------------------------------------- // compute x + X v, accumulate offset to b (in w) //----------------------------------------------------------------------- for ( i = 0; i < projectCurrSize_; i++ ) { HYPRE_IJVectorGetObject(HYpbs_[i], (void **) &v_csr); HYPRE_ParVectorInnerProd( r_csr, v_csr, &alpha); hypre_ParVectorAxpy(alpha,(hypre_ParVector*)v_csr, (hypre_ParVector*)w_csr); HYPRE_IJVectorGetObject(HYpxs_[i], (void **) &v_csr); hypre_ParVectorAxpy(alpha,(hypre_ParVector*)v_csr, (hypre_ParVector*)x_csr); } //----------------------------------------------------------------------- // save x and b away (and adjust b) //----------------------------------------------------------------------- alpha = - 1.0; hypre_ParVectorAxpy(alpha,(hypre_ParVector*)w_csr,(hypre_ParVector*)b_csr); HYPRE_IJVectorGetObject(HYpxs_[projectSize_], (void **) &v_csr); HYPRE_ParVectorCopy( x_csr, v_csr ); hypre_ParVectorScale(0.0,(hypre_ParVector*)x_csr); //----------------------------------------------------------------------- // diagnostic message //----------------------------------------------------------------------- if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 4 ) printf("%4d : HYPRE_LSC:: leaving computeMinResProjection n", mypid_); return; } //*************************************************************************** // add a new pair of (x,b) vectors to the projection space //--------------------------------------------------------------------------- void HYPRE_LinSysCore::addToMinResProjectionSpace(HYPRE_IJVector xvec, HYPRE_IJVector bvec) { int i, ierr, *partition, start_row, end_row; double alpha; HYPRE_ParVector v_csr, x_csr, xn_csr, b_csr, r_csr, bn_csr; HYPRE_ParCSRMatrix A_csr; //----------------------------------------------------------------------- // diagnostic message //----------------------------------------------------------------------- if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 4 ) printf("%4d : HYPRE_LSC::addToProjectionSpace %d\n",mypid_, projectCurrSize_); //----------------------------------------------------------------------- // fetch the matrix and vectors //----------------------------------------------------------------------- HYPRE_IJMatrixGetObject(currA_, (void **) &A_csr); HYPRE_IJVectorGetObject(xvec, (void **) &x_csr); HYPRE_IJVectorGetObject(bvec, (void **) &b_csr); HYPRE_IJVectorGetObject(currR_, (void **) &r_csr); //----------------------------------------------------------------------- // initially, allocate space for B's and X's and R //----------------------------------------------------------------------- if ( projectCurrSize_ == 0 && HYpbs_ == NULL ) { HYPRE_ParCSRMatrixGetRowPartitioning( A_csr, &partition ); start_row = partition[mypid_]; end_row = partition[mypid_+1] - 1; free( partition ); HYpxs_ = new HYPRE_IJVector[projectSize_+1]; HYpbs_ = new HYPRE_IJVector[projectSize_+1]; for ( i = 0; i <= projectSize_; i++ ) { ierr = HYPRE_IJVectorCreate(comm_, start_row, end_row, &(HYpbs_[i])); ierr = HYPRE_IJVectorSetObjectType(HYpbs_[i], HYPRE_PARCSR); ierr = HYPRE_IJVectorInitialize(HYpbs_[i]); ierr = HYPRE_IJVectorAssemble(HYpbs_[i]); hypre_assert( !ierr ); } for ( i = 0; i <= projectSize_; i++ ) { ierr = HYPRE_IJVectorCreate(comm_, start_row, end_row, &(HYpxs_[i])); ierr = HYPRE_IJVectorSetObjectType(HYpxs_[i], HYPRE_PARCSR); ierr = HYPRE_IJVectorInitialize(HYpxs_[i]); ierr = HYPRE_IJVectorAssemble(HYpxs_[i]); hypre_assert(!ierr); } } //----------------------------------------------------------------------- // if buffer has been filled, move things up (but for now, restart) //----------------------------------------------------------------------- if ( projectCurrSize_ >= projectSize_ ) { //projectCurrSize_--; //tmpxvec = HYpxs_[0]; //tmpbvec = HYpbs_[0]; //for ( i = 0; i < projectCurrSize_; i++ ) //{ // HYpbs_[i] = HYpbs_[i+1]; // HYpxs_[i] = HYpxs_[i+1]; //} //HYpxs_[projectCurrSize_] = tmpxvec; //HYpbs_[projectCurrSize_] = tmpbvec; projectCurrSize_ = 0; } //----------------------------------------------------------------------- // fetch projection vectors //----------------------------------------------------------------------- HYPRE_IJVectorGetObject(HYpxs_[projectCurrSize_], (void **) &xn_csr); HYPRE_IJVectorGetObject(HYpbs_[projectCurrSize_], (void **) &bn_csr); //----------------------------------------------------------------------- // copy incoming initial guess to buffer //----------------------------------------------------------------------- HYPRE_ParVectorCopy( x_csr, xn_csr ); //----------------------------------------------------------------------- // compute bn = A * x //----------------------------------------------------------------------- HYPRE_ParCSRMatrixMatvec( 1.0, A_csr, x_csr, 0.0, bn_csr ); HYPRE_ParVectorCopy( bn_csr, r_csr ); //----------------------------------------------------------------------- // compute new vectors //----------------------------------------------------------------------- for ( i = 0; i < projectCurrSize_; i++ ) { HYPRE_IJVectorGetObject(HYpbs_[i], (void **) &v_csr); HYPRE_ParVectorInnerProd(r_csr, v_csr, &alpha); alpha = - alpha; if ( alpha != 0.0 ) { hypre_ParVectorAxpy(alpha,(hypre_ParVector*)v_csr, (hypre_ParVector*)bn_csr); HYPRE_IJVectorGetObject(HYpxs_[i], (void **) &v_csr); hypre_ParVectorAxpy(alpha,(hypre_ParVector*)v_csr, (hypre_ParVector*)xn_csr); } } HYPRE_ParVectorInnerProd( bn_csr, bn_csr, &alpha); alpha = sqrt( alpha ); if ( alpha != 0.0 ) { alpha = 1.0 / alpha; hypre_ParVectorScale(alpha,(hypre_ParVector*)bn_csr); hypre_ParVectorScale(alpha,(hypre_ParVector*)xn_csr); projectCurrSize_++; } //----------------------------------------------------------------------- // update final solution //----------------------------------------------------------------------- if ( alpha != 0.0 ) { HYPRE_IJVectorGetObject(HYpxs_[projectSize_], (void **) &v_csr); hypre_ParVectorAxpy(1.0,(hypre_ParVector*)v_csr,(hypre_ParVector*)x_csr); HYPRE_IJVectorGetObject(HYpbs_[projectSize_], (void **) &v_csr); hypre_ParVectorAxpy(1.0,(hypre_ParVector*)v_csr,(hypre_ParVector*)b_csr); } //----------------------------------------------------------------------- // diagnostic message //----------------------------------------------------------------------- if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 4 ) printf("%4d : HYPRE_LSC::leaving addToProjectionSpace %d\n",mypid_, projectCurrSize_); } //*************************************************************************** // project the initial guess into the previous solution space // // min || trans(x - xbar) A (x - xbar) || // // solutions (phi_i) at previous steps // // (1) compute r = b - A * x_0 // (2) compute alpha_i = (r, phi_i) for all previous stored vectors // (3) x_stored = x_0 + sum (alpha_i * phi_i) // (4) b_stored = A * x_0 + sum (alpha_i * psi_i) // (5) b = b - b_stored, x = 0 // //--------------------------------------------------------------------------- void HYPRE_LinSysCore::computeAConjProjection(HYPRE_ParCSRMatrix A_csr, HYPRE_ParVector x_csr, HYPRE_ParVector b_csr) { int i; double alpha; HYPRE_ParVector r_csr, v_csr, w_csr; //----------------------------------------------------------------------- // diagnostic message //----------------------------------------------------------------------- if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 4 ) printf("%4d : HYPRE_LSC::entering computeAConjProjection %d\n",mypid_, projectCurrSize_); if ( projectCurrSize_ == 0 && HYpxs_ == NULL ) return; //----------------------------------------------------------------------- // fetch vectors //----------------------------------------------------------------------- HYPRE_IJVectorGetObject(currR_, (void **) &r_csr); HYPRE_IJVectorGetObject(HYpbs_[projectSize_], (void **) &w_csr); //----------------------------------------------------------------------- // compute r = b - A x_0, save A * x_0 (to w) //----------------------------------------------------------------------- HYPRE_ParCSRMatrixMatvec( 1.0, A_csr, x_csr, 0.0, w_csr ); HYPRE_ParVectorCopy( b_csr, r_csr ); alpha = -1.0; hypre_ParVectorAxpy(alpha,(hypre_ParVector*)w_csr,(hypre_ParVector*)r_csr); //----------------------------------------------------------------------- // compute alpha_i = (phi_i, r) // then x = x + alpha_i * phi_i for all i // then w = w + alpha_i * psi_i for all i //----------------------------------------------------------------------- for ( i = 0; i < projectCurrSize_; i++ ) { HYPRE_IJVectorGetObject(HYpxs_[i], (void **) &v_csr); HYPRE_ParVectorInnerProd(r_csr, v_csr, &alpha); hypre_ParVectorAxpy(alpha,(hypre_ParVector*)v_csr, (hypre_ParVector*)x_csr); HYPRE_IJVectorGetObject(HYpbs_[i], (void **) &v_csr); hypre_ParVectorAxpy(alpha,(hypre_ParVector*)v_csr, (hypre_ParVector*)w_csr); } //----------------------------------------------------------------------- // store x away //----------------------------------------------------------------------- HYPRE_IJVectorGetObject(HYpxs_[projectSize_], (void **) &v_csr); HYPRE_ParVectorCopy( x_csr, v_csr ); hypre_ParVectorScale(0.0,(hypre_ParVector*)x_csr); //----------------------------------------------------------------------- // compute new residual b = b - w //----------------------------------------------------------------------- alpha = -1.0; hypre_ParVectorAxpy(alpha,(hypre_ParVector*)w_csr,(hypre_ParVector*)b_csr); //----------------------------------------------------------------------- // diagnostic message //----------------------------------------------------------------------- if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 4 ) printf("%4d : HYPRE_LSC:: leaving computeAConjProjection n", mypid_); return; } //*************************************************************************** // add x to the projection space // // (1) compute alpha_i = (x, psi_i) for all previous stored vectors // (2) phi_n = x - sum(alpha_i * phi_i) // (3) phi_n = phi_n / norm(phi_n)_A // (4) psi_n = A * phi_n //--------------------------------------------------------------------------- void HYPRE_LinSysCore::addToAConjProjectionSpace(HYPRE_IJVector xvec, HYPRE_IJVector bvec) { int i, ierr, *partition, start_row, end_row; double alpha; HYPRE_ParVector v_csr, x_csr, b_csr, bn_csr, xn_csr; //HYPRE_IJVector tmpxvec; HYPRE_ParCSRMatrix A_csr; //----------------------------------------------------------------------- // diagnostic message //----------------------------------------------------------------------- if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 4 ) printf("%4d : HYPRE_LSC::addToAConjProjectionSpace %d\n",mypid_, projectCurrSize_); //----------------------------------------------------------------------- // fetch the matrix and vectors //----------------------------------------------------------------------- HYPRE_IJMatrixGetObject(currA_, (void **) &A_csr); HYPRE_IJVectorGetObject(xvec, (void **) &x_csr); HYPRE_IJVectorGetObject(bvec, (void **) &b_csr); //----------------------------------------------------------------------- // initially, allocate space for the phi's and psi's //----------------------------------------------------------------------- if ( projectCurrSize_ == 0 && HYpxs_ == NULL ) { HYPRE_ParCSRMatrixGetRowPartitioning( A_csr, &partition ); start_row = partition[mypid_]; end_row = partition[mypid_+1] - 1; free( partition ); HYpxs_ = new HYPRE_IJVector[projectSize_+1]; HYpbs_ = new HYPRE_IJVector[projectSize_+1]; for ( i = 0; i <= projectSize_; i++ ) { ierr = HYPRE_IJVectorCreate(comm_, start_row, end_row, &(HYpbs_[i])); ierr = HYPRE_IJVectorSetObjectType(HYpbs_[i], HYPRE_PARCSR); ierr = HYPRE_IJVectorInitialize(HYpbs_[i]); ierr = HYPRE_IJVectorAssemble(HYpbs_[i]); hypre_assert( !ierr ); } for ( i = 0; i <= projectSize_; i++ ) { ierr = HYPRE_IJVectorCreate(comm_, start_row, end_row, &(HYpxs_[i])); ierr = HYPRE_IJVectorSetObjectType(HYpxs_[i], HYPRE_PARCSR); ierr = HYPRE_IJVectorInitialize(HYpxs_[i]); ierr = HYPRE_IJVectorAssemble(HYpxs_[i]); hypre_assert(!ierr); } } //----------------------------------------------------------------------- // if buffer has been filled, move things up (but for now, restart) //----------------------------------------------------------------------- if ( projectCurrSize_ >= projectSize_ ) { //projectCurrSize_--; //tmpxvec = HYpxs_[0]; //for ( i = 0; i < projectCurrSize_; i++ ) HYpxs_[i] = HYpxs_[i+1]; //HYpxs_[projectCurrSize_] = tmpxvec; projectCurrSize_ = 0; } //----------------------------------------------------------------------- // fetch the projection vectors //----------------------------------------------------------------------- HYPRE_IJVectorGetObject(HYpxs_[projectCurrSize_], (void **) &xn_csr); HYPRE_IJVectorGetObject(HYpbs_[projectCurrSize_], (void **) &bn_csr); //----------------------------------------------------------------------- // compute the new A-conjugate vector and its A-norm //----------------------------------------------------------------------- HYPRE_ParVectorCopy( x_csr, xn_csr ); for ( i = 0; i < projectCurrSize_; i++ ) { HYPRE_IJVectorGetObject(HYpbs_[i], (void **) &v_csr); HYPRE_ParVectorInnerProd( x_csr, v_csr, &alpha); if ( alpha != 0.0 ) { alpha = - alpha; HYPRE_IJVectorGetObject(HYpxs_[i], (void **) &v_csr); hypre_ParVectorAxpy(alpha,(hypre_ParVector*)v_csr, (hypre_ParVector*)xn_csr); } } HYPRE_ParCSRMatrixMatvec( 1.0, A_csr, xn_csr, 0.0, bn_csr ); HYPRE_ParVectorInnerProd( xn_csr, bn_csr, &alpha); if ( alpha != 0.0 ) { alpha = 1.0 / sqrt( alpha ); hypre_ParVectorScale(alpha,(hypre_ParVector*)xn_csr); hypre_ParVectorScale(alpha,(hypre_ParVector*)bn_csr); projectCurrSize_++; } //----------------------------------------------------------------------- // update final solution //----------------------------------------------------------------------- if ( alpha != 0.0 ) { HYPRE_IJVectorGetObject(HYpxs_[projectSize_], (void **) &v_csr); hypre_ParVectorAxpy(1.0,(hypre_ParVector*)v_csr,(hypre_ParVector*)x_csr); HYPRE_IJVectorGetObject(HYpbs_[projectSize_], (void **) &v_csr); hypre_ParVectorAxpy(1.0,(hypre_ParVector*)v_csr,(hypre_ParVector*)b_csr); } //----------------------------------------------------------------------- // diagnostic message //----------------------------------------------------------------------- if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 4 ) printf("%4d : HYPRE_LSC::leaving addToAConjProjectionSpace %d\n",mypid_, projectCurrSize_); } //*************************************************************************** //*************************************************************************** // MLI specific functions //*************************************************************************** //*************************************************************************** //*************************************************************************** // initialize field information //--------------------------------------------------------------------------- void HYPRE_LinSysCore::FE_initFields(int nFields, int *fieldSizes, int *fieldIDs) { #ifdef HAVE_MLI if ( haveFEData_ == 1 && feData_ != NULL ) HYPRE_LSI_MLIFEDataInitFields(feData_,nFields,fieldSizes,fieldIDs); #else (void) nFields; (void) fieldSizes; (void) fieldIDs; #endif return; } //*************************************************************************** // initialize element block //--------------------------------------------------------------------------- void HYPRE_LinSysCore::FE_initElemBlock(int nElems, int nNodesPerElem, int numNodeFields, int *nodeFieldIDs) { #ifdef HAVE_MLI int status; if ( haveFEData_ == 1 && feData_ != NULL ) { status = HYPRE_LSI_MLIFEDataInitElemBlock(feData_, nElems, nNodesPerElem, numNodeFields, nodeFieldIDs); if ( status ) { if (haveFEData_ == 1) HYPRE_LSI_MLIFEDataDestroy(feData_); else if (haveFEData_ == 2) HYPRE_LSI_MLISFEIDestroy(feData_); feData_ = NULL; haveFEData_ = 0; } } #else (void) nElems; (void) nNodesPerElem; (void) numNodeFields; (void) nodeFieldIDs; #endif return; } //*************************************************************************** // initialize element node list //--------------------------------------------------------------------------- void HYPRE_LinSysCore::FE_initElemNodeList(int elemID, int nNodesPerElem, int *nodeIDs) { #ifdef HAVE_MLI if ( haveFEData_ == 1 && feData_ != NULL ) HYPRE_LSI_MLIFEDataInitElemNodeList(feData_, elemID, nNodesPerElem, nodeIDs); #else (void) elemID; (void) nNodesPerElem; (void) nodeIDs; #endif return; } //*************************************************************************** // initialize shared nodes //--------------------------------------------------------------------------- void HYPRE_LinSysCore::FE_initSharedNodes(int nShared, int *sharedIDs, int *sharedPLengs, int **sharedProcs) { #ifdef HAVE_MLI if ( haveFEData_ == 1 && feData_ != NULL ) HYPRE_LSI_MLIFEDataInitSharedNodes(feData_, nShared, sharedIDs, sharedPLengs, sharedProcs); #else (void) nShared; (void) sharedIDs; (void) sharedPLengs; (void) sharedProcs; #endif return; } //*************************************************************************** // initialize complete //--------------------------------------------------------------------------- void HYPRE_LinSysCore::FE_initComplete() { #ifdef HAVE_MLI if ( haveFEData_ == 1 && feData_ != NULL ) HYPRE_LSI_MLIFEDataInitComplete(feData_); #endif return; } //*************************************************************************** // load element matrix //--------------------------------------------------------------------------- void HYPRE_LinSysCore::FE_loadElemMatrix(int elemID, int nNodes, int *elemNodeList, int matDim, double **elemMat) { #ifdef HAVE_MLI if ( haveFEData_ == 1 && feData_ != NULL ) HYPRE_LSI_MLIFEDataLoadElemMatrix(feData_, elemID, nNodes, elemNodeList, matDim, elemMat); #else (void) elemID; (void) nNodes; (void) elemNodeList; (void) matDim; (void) elemMat; #endif return; } //*************************************************************************** // build nodal coordinates // (to be used by AMS preconditioner, but it has been replaced with better // scheme. So when time is ripe, this function should be deleted.) //--------------------------------------------------------------------------- void HYPRE_LinSysCore::HYPRE_LSI_BuildNodalCoordinates() { int localNRows, *procNRows, *iTempArray, iP, iN, iS, *nodeProcMap; int *procList, nSends, *sendProcs, *sendLengs, **iSendBufs; int nRecvs, *recvLengs, *recvProcs, **iRecvBufs, iR, numNodes, eqnInd; int *flags, arrayLeng, coordLength, ierr, procIndex, iD; double **dSendBufs, **dRecvBufs, *nCoords, *vecData; MPI_Request *mpiRequests; MPI_Status mpiStatus; HYPRE_ParVector parVec; /* -------------------------------------------------------- */ /* construct procNRows array */ /* -------------------------------------------------------- */ localNRows = localEndRow_ - localStartRow_ + 1; procNRows = new int[numProcs_+1]; iTempArray = new int[numProcs_]; for (iP = 0; iP <= numProcs_; iP++) procNRows[iP] = 0; procNRows[mypid_] = localNRows; MPI_Allreduce(procNRows,iTempArray,numProcs_,MPI_INT,MPI_SUM,comm_); procNRows[0] = 0; for (iP = 1; iP <= numProcs_; iP++) procNRows[iP] = procNRows[iP-1] + iTempArray[iP-1]; /* -------------------------------------------------------- */ /* construct node to processor map */ /* -------------------------------------------------------- */ nodeProcMap = new int[MLI_NumNodes_]; for (iN = 0; iN < MLI_NumNodes_; iN++) { nodeProcMap[iN] = -1; if (MLI_EqnNumbers_[iN] < procNRows[mypid_] || MLI_EqnNumbers_[iN] >= procNRows[mypid_+1]) { for (iP = 0; iP < numProcs_; iP++) if (MLI_EqnNumbers_[iN] < procNRows[iP]) break; nodeProcMap[iN] = iP - 1; } } /* -------------------------------------------------------- */ /* construct send information */ /* -------------------------------------------------------- */ procList = new int[numProcs_]; for (iP = 0; iP < numProcs_; iP++) procList[iP] = 0; for (iN = 0; iN < numProcs_; iN++) if (nodeProcMap[iN] >= 0) procList[nodeProcMap[iN]]++; nSends = 0; for (iP = 0; iP < numProcs_; iP++) if (procList[iP] > 0) nSends++; if (nSends > 0) { sendProcs = new int[nSends]; sendLengs = new int[nSends]; iSendBufs = new int*[nSends]; dSendBufs = new double*[nSends]; } nSends = 0; for (iP = 0; iP < numProcs_; iP++) { if (procList[iP] > 0) { sendLengs[nSends] = procList[iP]; sendProcs[nSends++] = iP; } } /* -------------------------------------------------------- */ /* construct recv information */ /* -------------------------------------------------------- */ for (iP = 0; iP < numProcs_; iP++) procList[iP] = 0; for (iP = 0; iP < nSends; iP++) procList[sendProcs[iP]]++; MPI_Allreduce(procList,iTempArray,numProcs_,MPI_INT,MPI_SUM,comm_); nRecvs = iTempArray[mypid_]; if (nRecvs > 0) { recvLengs = new int[nRecvs]; recvProcs = new int[nRecvs]; iRecvBufs = new int*[nRecvs]; dRecvBufs = new double*[nRecvs]; mpiRequests = new MPI_Request[nRecvs]; } for (iP = 0; iP < nRecvs; iP++) MPI_Irecv(&(recvLengs[iP]), 1, MPI_INT, MPI_ANY_SOURCE, 29421, comm_, &(mpiRequests[iP])); for (iP = 0; iP < nSends; iP++) MPI_Send(&(sendLengs[iP]), 1, MPI_INT, sendProcs[iP], 29421, comm_); for (iP = 0; iP < nRecvs; iP++) { MPI_Wait(&(mpiRequests[iP]), &mpiStatus); recvProcs[iP] = mpiStatus.MPI_SOURCE; } /* -------------------------------------------------------- */ /* communicate equation numbers information */ /* -------------------------------------------------------- */ for (iP = 0; iP < nRecvs; iP++) { iRecvBufs[iP] = new int[recvLengs[iP]]; MPI_Irecv(iRecvBufs[iP], recvLengs[iP], MPI_INT, recvProcs[iP], 29422, comm_, &(mpiRequests[iP])); } for (iP = 0; iP < nSends; iP++) { iSendBufs[iP] = new int[sendLengs[iP]]; sendLengs[iP] = 0; } for (iN = 0; iN < MLI_NumNodes_; iN++) { if (nodeProcMap[iN] >= 0) { procIndex = nodeProcMap[iN]; for (iP = 0; iP < nSends; iP++) if (procIndex == sendProcs[iP]) break; iSendBufs[iP][sendLengs[iP]++] = MLI_EqnNumbers_[iN]; } } for (iP = 0; iP < nSends; iP++) { MPI_Send(iSendBufs[iP], sendLengs[iP], MPI_INT, sendProcs[iP], 29422, comm_); } for (iP = 0; iP < nRecvs; iP++) MPI_Wait(&(mpiRequests[iP]),&mpiStatus); /* -------------------------------------------------------- */ /* communicate coordinate information */ /* -------------------------------------------------------- */ for (iP = 0; iP < nRecvs; iP++) { dRecvBufs[iP] = new double[recvLengs[iP]*MLI_FieldSize_]; MPI_Irecv(dRecvBufs[iP], recvLengs[iP]*MLI_FieldSize_, MPI_DOUBLE, recvProcs[iP], 29425, comm_, &(mpiRequests[iP])); } for (iP = 0; iP < nSends; iP++) { dSendBufs[iP] = new double[sendLengs[iP]*MLI_FieldSize_]; sendLengs[iP] = 0; } for (iN = 0; iN < MLI_NumNodes_; iN++) { if (nodeProcMap[iN] >= 0) { procIndex = nodeProcMap[iN]; for (iP = 0; iP < nSends; iP++) if (procIndex == sendProcs[iP]) break; for (iD = 0; iD < MLI_FieldSize_; iD++) dSendBufs[iP][sendLengs[iP]++] = MLI_NodalCoord_[iN*MLI_FieldSize_+iD]; } } for (iP = 0; iP < nSends; iP++) { sendLengs[iP] /= MLI_FieldSize_; MPI_Send(dSendBufs[iP], sendLengs[iP]*MLI_FieldSize_, MPI_DOUBLE, sendProcs[iP], 29425, comm_); } for (iP = 0; iP < nRecvs; iP++) MPI_Wait(&(mpiRequests[iP]),&mpiStatus); /* -------------------------------------------------------- */ /* check any duplicate coordinate information */ /* -------------------------------------------------------- */ arrayLeng = MLI_NumNodes_; for (iP = 0; iP < nRecvs; iP++) arrayLeng += recvLengs[iP]; flags = new int[arrayLeng]; for (iN = 0; iN < arrayLeng; iN++) flags[iN] = 0; for (iN = 0; iN < MLI_NumNodes_; iN++) { if (nodeProcMap[iN] < 0) { eqnInd = (MLI_EqnNumbers_[iN] - procNRows[mypid_]) / MLI_FieldSize_; if (eqnInd >= arrayLeng) { printf("%d : LoadNodalCoordinates - ERROR(1).\n", mypid_); exit(1); } flags[eqnInd] = 1; } } for (iP = 0; iP < nRecvs; iP++) { for (iR = 0; iR < recvLengs[iP]; iR++) { eqnInd = (iRecvBufs[iP][iR] - procNRows[mypid_]) / MLI_FieldSize_; if (eqnInd >= arrayLeng) { printf("%d : LoadNodalCoordinates - ERROR(2).\n", mypid_); exit(1); } flags[eqnInd] = 1; } } numNodes = 0; for (iN = 0; iN < arrayLeng; iN++) { if ( flags[iN] == 0 ) break; else numNodes++; } delete [] flags; /* -------------------------------------------------------- */ /* set up nodal coordinate information in correct order */ /* -------------------------------------------------------- */ coordLength = MLI_NumNodes_ * MLI_FieldSize_; nCoords = new double[coordLength]; arrayLeng = MLI_NumNodes_ * MLI_FieldSize_; for (iN = 0; iN < MLI_NumNodes_; iN++) { if (nodeProcMap[iN] < 0) { eqnInd = (MLI_EqnNumbers_[iN] - procNRows[mypid_]) / MLI_FieldSize_; if (eqnInd >= 0 && eqnInd < arrayLeng) for (iD = 0; iD < MLI_FieldSize_; iD++) nCoords[eqnInd*MLI_FieldSize_+iD] = MLI_NodalCoord_[iN*MLI_FieldSize_+iD]; } } for (iP = 0; iP < nRecvs; iP++) { for (iR = 0; iR < recvLengs[iP]; iR++) { eqnInd = (iRecvBufs[iP][iR] - procNRows[mypid_]) / MLI_FieldSize_; if (eqnInd >= 0 && eqnInd < arrayLeng) for (iD = 0; iD < MLI_FieldSize_; iD++) nCoords[eqnInd*MLI_FieldSize_+iD] = dRecvBufs[iP][iR*MLI_FieldSize_+iD]; } } /* -------------------------------------------------------- */ /* create AMS vectors */ /* -------------------------------------------------------- */ localNRows = localEndRow_ - localStartRow_ + 1; ierr = HYPRE_IJVectorCreate(comm_,(localStartRow_-1)/MLI_FieldSize_, localEndRow_/MLI_FieldSize_-1, &amsX_); ierr += HYPRE_IJVectorSetObjectType(amsX_, HYPRE_PARCSR); ierr += HYPRE_IJVectorInitialize(amsX_); ierr += HYPRE_IJVectorAssemble(amsX_); hypre_assert(!ierr); HYPRE_IJVectorGetObject(amsX_, (void **) &parVec); vecData = (double *) hypre_VectorData(hypre_ParVectorLocalVector((hypre_ParVector *) parVec)); for (iN = 0; iN < localNRows/MLI_FieldSize_; iN++) vecData[iN] = nCoords[iN*MLI_FieldSize_]; ierr = HYPRE_IJVectorCreate(comm_,(localStartRow_-1)/MLI_FieldSize_, localEndRow_/MLI_FieldSize_-1, &amsY_); ierr += HYPRE_IJVectorSetObjectType(amsY_, HYPRE_PARCSR); ierr += HYPRE_IJVectorInitialize(amsY_); ierr += HYPRE_IJVectorAssemble(amsY_); hypre_assert(!ierr); HYPRE_IJVectorGetObject(amsY_, (void **) &parVec); vecData = (double *) hypre_VectorData(hypre_ParVectorLocalVector((hypre_ParVector *) parVec)); for (iN = 0; iN < localNRows/MLI_FieldSize_; iN++) vecData[iN] = nCoords[iN*MLI_FieldSize_+1]; ierr = HYPRE_IJVectorCreate(comm_,(localStartRow_-1)/MLI_FieldSize_, localEndRow_/MLI_FieldSize_-1, &amsZ_); ierr += HYPRE_IJVectorSetObjectType(amsZ_, HYPRE_PARCSR); ierr += HYPRE_IJVectorInitialize(amsZ_); ierr += HYPRE_IJVectorAssemble(amsZ_); hypre_assert(!ierr); HYPRE_IJVectorGetObject(amsZ_, (void **) &parVec); vecData = (double *) hypre_VectorData(hypre_ParVectorLocalVector((hypre_ParVector *) parVec)); for (iN = 0; iN < localNRows/MLI_FieldSize_; iN++) vecData[iN] = nCoords[iN*MLI_FieldSize_+2]; /* -------------------------------------------------------- */ /* clean up */ /* -------------------------------------------------------- */ delete [] procList; delete [] iTempArray; delete [] nodeProcMap; delete [] procNRows; delete [] nCoords; if (nSends > 0) { delete [] sendProcs; delete [] sendLengs; for (iS = 0; iS < nSends; iS++) delete [] iSendBufs[iS]; for (iS = 0; iS < nSends; iS++) delete [] dSendBufs[iS]; delete [] dSendBufs; delete [] iSendBufs; } if (nRecvs > 0) { delete [] recvProcs; delete [] recvLengs; for (iR = 0; iR < nRecvs; iR++) delete [] iRecvBufs[iR]; for (iR = 0; iR < nRecvs; iR++) delete [] dRecvBufs[iR]; delete [] iRecvBufs; delete [] dRecvBufs; delete [] mpiRequests; } return; } hypre-2.33.0/src/FEI_mv/fei-hypre/HYPRE_LSI_Dsuperlu.c000066400000000000000000000250771477326011500221600ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * HYPRE_LSI_DSuperLU interface * *****************************************************************************/ #include #include #include #include "utilities/_hypre_utilities.h" #include "HYPRE.h" #include "IJ_mv/HYPRE_IJ_mv.h" #include "parcsr_mv/_hypre_parcsr_mv.h" #include "parcsr_ls/HYPRE_parcsr_ls.h" /*--------------------------------------------------------------------------- * Distributed SUPERLU include files *-------------------------------------------------------------------------*/ #ifdef HYPRE_USING_DSUPERLU #include "parcsr_ls/dsuperlu.h" #include "superlu_ddefs.h" typedef struct HYPRE_LSI_DSuperLU_Struct { MPI_Comm comm_; HYPRE_ParCSRMatrix Amat_; superlu_dist_options_t options_; SuperMatrix sluAmat_; dScalePermstruct_t ScalePermstruct_; SuperLUStat_t stat_; dLUstruct_t LUstruct_; dSOLVEstruct_t SOLVEstruct_; int globalNRows_; int localNRows_; int startRow_; int outputLevel_; double *berr_; gridinfo_t sluGrid_; int setupFlag_; } HYPRE_LSI_DSuperLU; int HYPRE_LSI_DSuperLUGenMatrix(HYPRE_Solver solver); /*************************************************************************** * HYPRE_LSI_DSuperLUCreate - Return a DSuperLU object "solver". *--------------------------------------------------------------------------*/ int HYPRE_LSI_DSuperLUCreate( MPI_Comm comm, HYPRE_Solver *solver ) { hypre_DSLUData *dslu_data = NULL; dslu_data = hypre_CTAlloc(hypre_DSLUData, 1, HYPRE_MEMORY_HOST); *solver = (HYPRE_Solver) dslu_data; return 0; } /*************************************************************************** * HYPRE_LSI_DSuperLUDestroy - Destroy a DSuperLU object. *--------------------------------------------------------------------------*/ int HYPRE_LSI_DSuperLUDestroy( HYPRE_Solver solver ) { hypre_DSLUData *dslu_data = (hypre_DSLUData *) solver; PStatFree(&(dslu_data->dslu_data_stat)); Destroy_CompRowLoc_Matrix_dist(&(dslu_data->A_dslu)); dScalePermstructFree(&(dslu_data->dslu_ScalePermstruct)); dDestroy_LU(dslu_data->global_num_rows, &(dslu_data->dslu_data_grid), &(dslu_data->dslu_data_LU)); dLUstructFree(&(dslu_data->dslu_data_LU)); if (dslu_data->dslu_options.SolveInitialized) { dSolveFinalize(&(dslu_data->dslu_options), &(dslu_data->dslu_solve)); } superlu_gridexit(&(dslu_data->dslu_data_grid)); hypre_TFree(dslu_data->berr, HYPRE_MEMORY_HOST); hypre_TFree(dslu_data, HYPRE_MEMORY_HOST); return hypre_error_flag; } /*************************************************************************** * HYPRE_LSI_DSuperLUSetOutputLevel - Set debug level *--------------------------------------------------------------------------*/ int HYPRE_LSI_DSuperLUSetOutputLevel(HYPRE_Solver solver, int level) { HYPRE_LSI_DSuperLU *sluPtr = (HYPRE_LSI_DSuperLU *) solver; sluPtr->outputLevel_ = level; return 0; } /*************************************************************************** * HYPRE_LSI_DSuperLUSetup - Set up function for LSI_DSuperLU. *--------------------------------------------------------------------------*/ int HYPRE_LSI_DSuperLUSetup(HYPRE_Solver solver, HYPRE_ParCSRMatrix A_csr, HYPRE_ParVector b, HYPRE_ParVector x ) { /* Par Data Structure variables */ HYPRE_BigInt global_num_rows = hypre_ParCSRMatrixGlobalNumRows(A_csr); MPI_Comm comm = hypre_ParCSRMatrixComm(A_csr); hypre_CSRMatrix *A_local; HYPRE_Int num_rows; HYPRE_Int num_procs, my_id; HYPRE_Int pcols = 1, prows = 1; HYPRE_BigInt *big_rowptr = NULL; hypre_DSLUData *dslu_data = (hypre_DSLUData *) solver; HYPRE_Int info = 0; HYPRE_Int nrhs = 0; hypre_MPI_Comm_size(comm, &num_procs); hypre_MPI_Comm_rank(comm, &my_id); /* Merge diag and offd into one matrix (global ids) */ A_local = hypre_MergeDiagAndOffd(A_csr); num_rows = hypre_CSRMatrixNumRows(A_local); /* Now convert hypre matrix to a SuperMatrix */ #ifdef HYPRE_MIXEDINT { HYPRE_Int *rowptr = NULL; HYPRE_Int i; rowptr = hypre_CSRMatrixI(A_local); big_rowptr = hypre_CTAlloc(HYPRE_BigInt, (num_rows + 1), HYPRE_MEMORY_HOST); for (i = 0; i < (num_rows + 1); i++) { big_rowptr[i] = (HYPRE_BigInt)rowptr[i]; } } #else big_rowptr = hypre_CSRMatrixI(A_local); #endif dCreate_CompRowLoc_Matrix_dist( &(dslu_data->A_dslu), global_num_rows, global_num_rows, hypre_CSRMatrixNumNonzeros(A_local), num_rows, hypre_ParCSRMatrixFirstRowIndex(A_csr), hypre_CSRMatrixData(A_local), hypre_CSRMatrixBigJ(A_local), big_rowptr, SLU_NR_loc, SLU_D, SLU_GE); /* DOK: SuperLU frees assigned data, so set them to null before * calling hypre_CSRMatrixdestroy on A_local to avoid memory errors. */ #ifndef HYPRE_MIXEDINT hypre_CSRMatrixI(A_local) = NULL; #endif hypre_CSRMatrixData(A_local) = NULL; hypre_CSRMatrixBigJ(A_local) = NULL; hypre_CSRMatrixDestroy(A_local); /*Create process grid */ while (prows * pcols <= num_procs) { ++prows; } --prows; pcols = num_procs / prows; while (prows * pcols != num_procs) { prows -= 1; pcols = num_procs / prows; } //hypre_printf(" prows %d pcols %d\n", prows, pcols); superlu_gridinit(comm, prows, pcols, &(dslu_data->dslu_data_grid)); set_default_options_dist(&(dslu_data->dslu_options)); dslu_data->dslu_options.Fact = DOFACT; dslu_data->dslu_options.PrintStat = NO; /*dslu_data->dslu_options.IterRefine = SLU_DOUBLE; dslu_data->dslu_options.ColPerm = MMD_AT_PLUS_A; dslu_data->dslu_options.DiagPivotThresh = 1.0; dslu_data->dslu_options.ReplaceTinyPivot = NO; */ dScalePermstructInit(global_num_rows, global_num_rows, &(dslu_data->dslu_ScalePermstruct)); dLUstructInit(global_num_rows, &(dslu_data->dslu_data_LU)); PStatInit(&(dslu_data->dslu_data_stat)); dslu_data->global_num_rows = global_num_rows; dslu_data->berr = hypre_CTAlloc(HYPRE_Real, 1, HYPRE_MEMORY_HOST); dslu_data->berr[0] = 0.0; pdgssvx(&(dslu_data->dslu_options), &(dslu_data->A_dslu), &(dslu_data->dslu_ScalePermstruct), NULL, num_rows, nrhs, &(dslu_data->dslu_data_grid), &(dslu_data->dslu_data_LU), &(dslu_data->dslu_solve), dslu_data->berr, &(dslu_data->dslu_data_stat), &info); dslu_data->dslu_options.Fact = FACTORED; return hypre_error_flag; } /*************************************************************************** * HYPRE_LSI_DSuperLUSolve - Solve function for DSuperLU. *--------------------------------------------------------------------------*/ int HYPRE_LSI_DSuperLUSolve( HYPRE_Solver solver, HYPRE_ParCSRMatrix A, HYPRE_ParVector b, HYPRE_ParVector x ) { hypre_DSLUData *dslu_data = (hypre_DSLUData *) solver; HYPRE_Int info = 0; HYPRE_Real *B = hypre_VectorData(hypre_ParVectorLocalVector(x)); HYPRE_Int size = hypre_VectorSize(hypre_ParVectorLocalVector(x)); HYPRE_Int nrhs = 1; hypre_ParVectorCopy(b, x); pdgssvx(&(dslu_data->dslu_options), &(dslu_data->A_dslu), &(dslu_data->dslu_ScalePermstruct), B, size, nrhs, &(dslu_data->dslu_data_grid), &(dslu_data->dslu_data_LU), &(dslu_data->dslu_solve), dslu_data->berr, &(dslu_data->dslu_data_stat), &info); return hypre_error_flag; } /**************************************************************************** * Create SuperLU matrix in CSR *--------------------------------------------------------------------------*/ int HYPRE_LSI_DSuperLUGenMatrix(HYPRE_Solver solver) { int nprocs, mypid, *csrIA, *csrJA, *procNRows, localNNZ; int startRow, localNRows, rowSize, *colInd, irow, jcol; double *csrAA, *colVal; HYPRE_LSI_DSuperLU *sluPtr = (HYPRE_LSI_DSuperLU *) solver; HYPRE_ParCSRMatrix Amat; MPI_Comm mpiComm; /* ---------------------------------------------------------------- */ /* fetch parallel machine parameters */ /* ---------------------------------------------------------------- */ mpiComm = sluPtr->comm_; MPI_Comm_rank(mpiComm, &mypid); MPI_Comm_size(mpiComm, &nprocs); /* ---------------------------------------------------------------- */ /* fetch matrix information */ /* ---------------------------------------------------------------- */ Amat = sluPtr->Amat_; HYPRE_ParCSRMatrixGetRowPartitioning(Amat, &procNRows); startRow = procNRows[mypid]; sluPtr->startRow_ = startRow; localNNZ = 0; for (irow = startRow; irow < procNRows[mypid+1]; irow++) { HYPRE_ParCSRMatrixGetRow(Amat,irow,&rowSize,&colInd,&colVal); localNNZ += rowSize; HYPRE_ParCSRMatrixRestoreRow(Amat,irow,&rowSize,&colInd,&colVal); } localNRows = procNRows[mypid+1] - procNRows[mypid]; sluPtr->localNRows_ = localNRows; sluPtr->globalNRows_ = procNRows[nprocs]; csrIA = (int *) intMalloc_dist(localNRows+1); csrJA = (int *) intMalloc_dist(localNNZ); csrAA = (double *) doubleMalloc_dist(localNNZ); localNNZ = 0; csrIA[0] = localNNZ; for (irow = startRow; irow < procNRows[mypid+1]; irow++) { HYPRE_ParCSRMatrixGetRow(Amat,irow,&rowSize,&colInd,&colVal); for ( jcol = 0; jcol < rowSize; jcol++ ) { csrJA[localNNZ] = colInd[jcol]; csrAA[localNNZ++] = colVal[jcol]; } csrIA[irow-startRow+1] = localNNZ; HYPRE_ParCSRMatrixRestoreRow(Amat,irow,&rowSize,&colInd,&colVal); } /*for (irow = startRow; irow < procNRows[mypid+1]; irow++) * qsort1(csrJA, csrAA, csrIA[irow-startRow], csrIA[irow-startRow+1]-1); */ /* ---------------------------------------------------------------- */ /* create SuperLU matrix */ /* ---------------------------------------------------------------- */ dCreate_CompRowLoc_Matrix_dist(&(sluPtr->sluAmat_), sluPtr->globalNRows_, sluPtr->globalNRows_, localNNZ, localNRows, startRow, csrAA, csrJA, csrIA, SLU_NR_loc, SLU_D, SLU_GE); hypre_TFree(procNRows, HYPRE_MEMORY_HOST); return 0; } #else int bogus; #endif hypre-2.33.0/src/FEI_mv/fei-hypre/HYPRE_LSI_Dsuperlu.h000066400000000000000000000026061477326011500221560ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * HYPRE_LSI_DSuperLU interface * *****************************************************************************/ #ifndef __HYPRE_DSUPERLU__ #define __HYPRE_DSUPERLU__ #include #include #include #include #include "HYPRE.h" #include "utilities/_hypre_utilities.h" #include "parcsr_ls/HYPRE_parcsr_ls.h" #include "parcsr_mv/_hypre_parcsr_mv.h" #ifdef __cplusplus extern "C" { #endif extern int HYPRE_LSI_DSuperLUCreate(MPI_Comm comm, HYPRE_Solver *solver); extern int HYPRE_LSI_DSuperLUDestroy(HYPRE_Solver solver); extern int HYPRE_LSI_DSuperLUSetOutputLevel(HYPRE_Solver solver, int); extern int HYPRE_LSI_DSuperLUSetup(HYPRE_Solver solver,HYPRE_ParCSRMatrix A, HYPRE_ParVector b,HYPRE_ParVector x); extern int HYPRE_LSI_DSuperLUSolve(HYPRE_Solver solver,HYPRE_ParCSRMatrix A, HYPRE_ParVector b, HYPRE_ParVector x); #ifdef __cplusplus } #endif #endif hypre-2.33.0/src/FEI_mv/fei-hypre/HYPRE_LSI_UZAWA.cxx000066400000000000000000001744271477326011500216300ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ //*************************************************************************** // Date : Apr 26, 2002 //*************************************************************************** // system includes //--------------------------------------------------------------------------- #include #include #include #if 0 /* RDF: Not sure this is really needed */ #ifdef WIN32 #define strcmp _stricmp #endif #endif //*************************************************************************** // local includes //--------------------------------------------------------------------------- #include "HYPRE.h" #include "HYPRE_LSI_UZAWA.h" //--------------------------------------------------------------------------- // MLI include files //--------------------------------------------------------------------------- #ifdef HAVE_MLI #include "HYPRE_LSI_mli.h" #endif //*************************************************************************** // local defines and external functions //--------------------------------------------------------------------------- extern "C" { int hypre_BoomerAMGBuildCoarseOperator(hypre_ParCSRMatrix*, hypre_ParCSRMatrix*, hypre_ParCSRMatrix*, hypre_ParCSRMatrix**); } //*************************************************************************** //*************************************************************************** // C-Interface data structure //--------------------------------------------------------------------------- typedef struct HYPRE_LSI_Uzawa_Struct { void *precon; } HYPRE_LSI_UzawaStruct; //*************************************************************************** //*************************************************************************** // C-Interface functions to solver //--------------------------------------------------------------------------- extern "C" int HYPRE_LSI_UzawaCreate(MPI_Comm mpi_comm, HYPRE_Solver *solver) { (void) mpi_comm; HYPRE_LSI_UzawaStruct *cprecon = (HYPRE_LSI_UzawaStruct *) hypre_CTAlloc(HYPRE_LSI_UzawaStruct, 1, HYPRE_MEMORY_HOST); HYPRE_LSI_Uzawa *precon = (HYPRE_LSI_Uzawa *) new HYPRE_LSI_Uzawa(mpi_comm); cprecon->precon = (void *) precon; (*solver) = (HYPRE_Solver) cprecon; return 0; } //*************************************************************************** extern "C" int HYPRE_LSI_UzawaDestroy(HYPRE_Solver solver) { int err=0; HYPRE_LSI_UzawaStruct *cprecon = (HYPRE_LSI_UzawaStruct *) solver; if ( cprecon == NULL ) err = 1; else { HYPRE_LSI_Uzawa *precon = (HYPRE_LSI_Uzawa *) cprecon->precon; if ( precon != NULL ) delete precon; else err = 1; free( cprecon ); } return err; } //*************************************************************************** extern "C" int HYPRE_LSI_UzawaSetParams(HYPRE_Solver solver, char *params) { int err=0; HYPRE_LSI_UzawaStruct *cprecon = (HYPRE_LSI_UzawaStruct *) solver; if ( cprecon == NULL ) err = 1; else { HYPRE_LSI_Uzawa *precon = (HYPRE_LSI_Uzawa *) cprecon->precon; err = precon->setParams(params); } return err; } //*************************************************************************** extern "C" int HYPRE_LSI_UzawaSetMaxIterations(HYPRE_Solver solver, int iter) { int err=0; HYPRE_LSI_UzawaStruct *cprecon = (HYPRE_LSI_UzawaStruct *) solver; if ( cprecon == NULL ) err = 1; else { HYPRE_LSI_Uzawa *precon = (HYPRE_LSI_Uzawa *) cprecon->precon; err = precon->setMaxIterations(iter); } return err; } //*************************************************************************** extern "C" int HYPRE_LSI_UzawaSetTolerance(HYPRE_Solver solver, double tol) { int err=0; HYPRE_LSI_UzawaStruct *cprecon = (HYPRE_LSI_UzawaStruct *) solver; if ( cprecon == NULL ) err = 1; else { HYPRE_LSI_Uzawa *precon = (HYPRE_LSI_Uzawa *) cprecon->precon; err = precon->setTolerance(tol); } return err; } //*************************************************************************** extern "C" int HYPRE_LSI_UzawaGetNumIterations(HYPRE_Solver solver, int *iter) { int err=0; HYPRE_LSI_UzawaStruct *cprecon = (HYPRE_LSI_UzawaStruct *) solver; if ( cprecon == NULL ) err = 1; else { HYPRE_LSI_Uzawa *precon = (HYPRE_LSI_Uzawa *) cprecon->precon; err = precon->getNumIterations(*iter); } return err; } //*************************************************************************** extern "C" int HYPRE_LSI_UzawaSetup(HYPRE_Solver solver, HYPRE_ParCSRMatrix Amat, HYPRE_ParVector b, HYPRE_ParVector x) { int err=0; (void) b; (void) x; HYPRE_LSI_UzawaStruct *cprecon = (HYPRE_LSI_UzawaStruct *) solver; if ( cprecon == NULL ) err = 1; else { HYPRE_LSI_Uzawa *precon = (HYPRE_LSI_Uzawa *) cprecon->precon; err = precon->setup(Amat, x, b); } return err; } //*************************************************************************** extern "C" int HYPRE_LSI_UzawaSolve(HYPRE_Solver solver, HYPRE_ParCSRMatrix Amat, HYPRE_ParVector b, HYPRE_ParVector x) { int err=0; (void) Amat; HYPRE_LSI_UzawaStruct *cprecon = (HYPRE_LSI_UzawaStruct *) solver; if ( cprecon == NULL ) err = 1; else { HYPRE_LSI_Uzawa *precon = (HYPRE_LSI_Uzawa *) cprecon->precon; err = precon->solve(b, x); } return err; } //*************************************************************************** //*************************************************************************** // Constructor //--------------------------------------------------------------------------- HYPRE_LSI_Uzawa::HYPRE_LSI_Uzawa(MPI_Comm comm) { Amat_ = NULL; A11mat_ = NULL; A12mat_ = NULL; S22mat_ = NULL; mpiComm_ = comm; outputLevel_ = 2; S22Scheme_ = 0; maxIterations_ = 1; tolerance_ = 1.0e-6; numIterations_ = 0; procA22Sizes_ = NULL; A11Solver_ = NULL; A11Precond_ = NULL; S22Solver_ = NULL; S22Precond_ = NULL; modifiedScheme_ = 0; S22SolverDampFactor_ = 1.0; A11Params_.SolverID_ = 1; /* default : gmres */ S22Params_.SolverID_ = 1; /* default : cg */ A11Params_.PrecondID_ = 1; /* default : diagonal */ S22Params_.PrecondID_ = 1; /* default : diagonal */ A11Params_.Tol_ = 1.0e-3; S22Params_.Tol_ = 1.0e-3; A11Params_.MaxIter_ = 1000; S22Params_.MaxIter_ = 1000; A11Params_.PSNLevels_ = 1; S22Params_.PSNLevels_ = 1; A11Params_.PSThresh_ = 1.0e-1; S22Params_.PSThresh_ = 1.0e-1; A11Params_.PSFilter_ = 2.0e-1; S22Params_.PSFilter_ = 2.0e-1; A11Params_.AMGThresh_ = 7.5e-1; S22Params_.AMGThresh_ = 7.5e-1; A11Params_.AMGNSweeps_ = 2; S22Params_.AMGNSweeps_ = 2; A11Params_.AMGSystemSize_ = 1; S22Params_.AMGSystemSize_ = 1; A11Params_.PilutFillin_ = 100; S22Params_.PilutFillin_ = 100; A11Params_.PilutDropTol_ = 0.1; S22Params_.PilutDropTol_ = 0.1; A11Params_.EuclidNLevels_ = 1; S22Params_.EuclidNLevels_ = 1; A11Params_.EuclidThresh_ = 0.1; S22Params_.EuclidThresh_ = 0.1; A11Params_.MLIThresh_ = 0.08; S22Params_.MLIThresh_ = 0.08; A11Params_.MLINSweeps_ = 2; S22Params_.MLINSweeps_ = 2; A11Params_.MLIPweight_ = 0.0; S22Params_.MLIPweight_ = 0.0; A11Params_.MLINodeDOF_ = 3; S22Params_.MLINodeDOF_ = 3; A11Params_.MLINullDim_ = 3; S22Params_.MLINullDim_ = 3; } //*************************************************************************** // destructor //--------------------------------------------------------------------------- HYPRE_LSI_Uzawa::~HYPRE_LSI_Uzawa() { Amat_ = NULL; mpiComm_ = 0; if ( procA22Sizes_ != NULL ) delete [] procA22Sizes_; if ( A11mat_ != NULL ) HYPRE_ParCSRMatrixDestroy(A11mat_); if ( A12mat_ != NULL ) HYPRE_ParCSRMatrixDestroy(A12mat_); if ( S22mat_ != NULL ) HYPRE_ParCSRMatrixDestroy(S22mat_); } //*************************************************************************** // set internal parameters //--------------------------------------------------------------------------- int HYPRE_LSI_Uzawa::setParams(char *params) { char param1[256], param2[256], param3[256]; sscanf(params,"%s", param1); if ( strcmp(param1, "Uzawa") ) { printf("HYPRE_LSI_Uzawa::parameters not for me.\n"); return 1; } sscanf(params,"%s %s", param1, param2); if ( !strcmp(param2, "help") ) { printf("Available options for Uzawa are : \n"); printf(" outputLevel \n"); printf(" A11Solver \n"); printf(" A11Tolerance \n"); printf(" A11MaxIterations \n"); printf(" A11Precon \n"); printf(" A11PreconPSNlevels \n"); printf(" A11PreconPSThresh \n"); printf(" A11PreconPSFilter \n"); printf(" A11PreconAMGThresh \n"); printf(" A11PreconAMGNumSweeps \n"); printf(" A11PreconAMGSystemSize \n"); printf(" A11PreconEuclidNLevels \n"); printf(" A11PreconEuclidThresh \n"); printf(" A11PreconPilutFillin \n"); printf(" A11PreconPilutDropTol \n"); printf(" S22SolverDampingFactor \n"); printf(" S22Solver \n"); printf(" S22Tolerance \n"); printf(" S22MaxIterations \n"); printf(" S22Precon \n"); printf(" S22PreconPSNlevels \n"); printf(" S22PreconPSThresh \n"); printf(" S22PreconPSFilter \n"); printf(" S22PreconAMGThresh \n"); printf(" S22PreconAMGNumSweeps \n"); printf(" S22PreconAMGSystemSize \n"); printf(" S22PreconEuclidNLevels \n"); printf(" S22PreconEuclidThresh \n"); printf(" S22PreconPilutFillin \n"); printf(" S22PreconPilutDropTol \n"); } else if ( !strcmp(param2, "outputLevel") ) { sscanf(params,"%s %s %d", param1, param2, &outputLevel_); if ( outputLevel_ > 0 ) printf("HYPRE_LSI_Uzawa::outputLevel = %d.\n", outputLevel_); } else if ( !strcmp(param2, "modified") ) { modifiedScheme_ = 1; if ( outputLevel_ > 0 ) printf("HYPRE_LSI_Uzawa::3 level scheme.\n"); } else if ( !strcmp(param2, "A11Solver") ) { sscanf(params,"%s %s %s", param1, param2, param3); if ( !strcmp(param3, "none") ) { A11Params_.SolverID_ = 0; if (outputLevel_ > 0) printf("HYPRE_LSI_Uzawa::A11 solver = cg\n"); } else if ( !strcmp(param3, "cg") ) { A11Params_.SolverID_ = 1; if (outputLevel_ > 0) printf("HYPRE_LSI_Uzawa::A11 solver = cg\n"); } else if ( !strcmp(param3, "gmres") ) { A11Params_.SolverID_ = 2; if (outputLevel_ > 0) printf("HYPRE_LSI_Uzawa::A11 solver = gmres\n"); } } else if ( !strcmp(param2, "S22Solver") ) { sscanf(params,"%s %s %s", param1, param2, param3); if ( !strcmp(param3, "none") ) { S22Params_.SolverID_ = 0; if (outputLevel_ > 0) printf("HYPRE_LSI_Uzawa::S22 solver = cg\n"); } else if ( !strcmp(param3, "cg") ) { S22Params_.SolverID_ = 1; if (outputLevel_ > 0) printf("HYPRE_LSI_Uzawa::S22 solver = cg\n"); } else if ( !strcmp(param3, "gmres") ) { S22Params_.SolverID_ = 2; if (outputLevel_ > 0) printf("HYPRE_LSI_Uzawa::S22 solver = gmres\n"); } } else if ( !strcmp(param2, "S22SolverDampingFactor") ) { sscanf(params,"%s %s %lg", param1, param2, &S22SolverDampFactor_); if ( S22SolverDampFactor_ < 0.0 ) S22SolverDampFactor_ = 1.0; } else if ( !strcmp(param2, "A11Tolerance") ) { sscanf(params,"%s %s %lg", param1, param2, &(A11Params_.Tol_)); if ( A11Params_.Tol_ >= 1.0 || A11Params_.Tol_ <= 0.0 ) A11Params_.Tol_ = 1.0e-12; if (outputLevel_ > 0) printf("HYPRE_LSI_Uzawa::A11 tol = %e\n", A11Params_.Tol_); } else if ( !strcmp(param2, "S22Tolerance") ) { sscanf(params,"%s %s %lg", param1, param2, &(S22Params_.Tol_)); if ( S22Params_.Tol_ >= 1.0 || S22Params_.Tol_ <= 0.0 ) S22Params_.Tol_ = 1.0e-12; if (outputLevel_ > 0) printf("HYPRE_LSI_Uzawa::S22 tol = %e\n", S22Params_.Tol_); } else if ( !strcmp(param2, "A11MaxIterations") ) { sscanf(params,"%s %s %d", param1, param2, &(A11Params_.MaxIter_)); if ( A11Params_.MaxIter_ <= 0 ) A11Params_.MaxIter_ = 10; if (outputLevel_ > 0) printf("HYPRE_LSI_Uzawa::A11 maxiter = %d\n", A11Params_.MaxIter_); } else if ( !strcmp(param2, "S22MaxIterations") ) { sscanf(params,"%s %s %d", param1, param2, &(S22Params_.MaxIter_)); if ( S22Params_.MaxIter_ <= 0 ) S22Params_.MaxIter_ = 10; if (outputLevel_ > 0) printf("HYPRE_LSI_Uzawa::S22 maxiter = %d\n", S22Params_.MaxIter_); } else if ( !strcmp(param2, "A11Precon") ) { sscanf(params,"%s %s %s", param1, param2, param3); if ( !strcmp(param3, "diagonal") ) { A11Params_.PrecondID_ = 1; if (outputLevel_ > 0) printf("HYPRE_LSI_Uzawa::A11 precon = diagonal\n"); } else if ( !strcmp(param3, "parasails") ) { A11Params_.PrecondID_ = 2; if (outputLevel_ > 0) printf("HYPRE_LSI_Uzawa::A11 precon = parasails\n"); } else if ( !strcmp(param3, "boomeramg") ) { A11Params_.PrecondID_ = 3; if (outputLevel_ > 0) printf("HYPRE_LSI_Uzawa::A11 precon = boomeramg\n"); } else if ( !strcmp(param3, "pilut") ) { A11Params_.PrecondID_ = 4; if (outputLevel_ > 0) printf("HYPRE_LSI_Uzawa::A11 precon = pilut\n"); } else if ( !strcmp(param3, "euclid") ) { A11Params_.PrecondID_ = 5; if (outputLevel_ > 0) printf("HYPRE_LSI_Uzawa::A11 precon = euclid\n"); } else if ( !strcmp(param3, "mli") ) { A11Params_.PrecondID_ = 6; if (outputLevel_ > 0) printf("HYPRE_LSI_Uzawa::A11 precon = MLISA\n"); } } else if ( !strcmp(param2, "S22Precon") ) { sscanf(params,"%s %s %s", param1, param2, param3); if ( !strcmp(param3, "diagonal") ) { S22Params_.PrecondID_ = 1; if (outputLevel_ > 0) printf("HYPRE_LSI_Uzawa::S22 precon = diagonal\n"); } else if ( !strcmp(param3, "parasails") ) { S22Params_.PrecondID_ = 2; if (outputLevel_ > 0) printf("HYPRE_LSI_Uzawa::S22 precon = parasails\n"); } else if ( !strcmp(param3, "boomeramg") ) { S22Params_.PrecondID_ = 3; if (outputLevel_ > 0) printf("HYPRE_LSI_Uzawa::S22 precon = boomeramg\n"); } else if ( !strcmp(param3, "pilut") ) { S22Params_.PrecondID_ = 4; if (outputLevel_ > 0) printf("HYPRE_LSI_Uzawa::S22 precon = pilut\n"); } else if ( !strcmp(param3, "euclid") ) { S22Params_.PrecondID_ = 5; if (outputLevel_ > 0) printf("HYPRE_LSI_Uzawa::S22 precon = euclid\n"); } else if ( !strcmp(param3, "mli") ) { S22Params_.PrecondID_ = 6; if (outputLevel_ > 0) printf("HYPRE_LSI_Uzawa::S22 precon = MLISA\n"); } } else if ( !strcmp(param2, "A11PreconPSNlevels") ) { sscanf(params,"%s %s %d", param1, param2, &(A11Params_.PSNLevels_)); if ( A11Params_.PSNLevels_ < 0 ) A11Params_.PSNLevels_ = 0; if (outputLevel_ > 0) printf("HYPRE_LSI_Uzawa::A11PreconPSNLevels\n"); } else if ( !strcmp(param2, "S22PreconPSNlevels") ) { sscanf(params,"%s %s %d", param1, param2, &(S22Params_.PSNLevels_)); if ( S22Params_.PSNLevels_ < 0 ) S22Params_.PSNLevels_ = 0; if (outputLevel_ > 0) printf("HYPRE_LSI_Uzawa::S22PreconPSNLevels\n"); } else if ( !strcmp(param2, "A11PreconPSThresh") ) { sscanf(params,"%s %s %lg", param1, param2, &(A11Params_.PSThresh_)); if ( A11Params_.PSThresh_ < 0 ) A11Params_.PSThresh_ = 0; if (outputLevel_ > 0) printf("HYPRE_LSI_Uzawa::A11PreconPSThresh\n"); } else if ( !strcmp(param2, "S22PreconPSThresh") ) { sscanf(params,"%s %s %lg", param1, param2, &(S22Params_.PSThresh_)); if ( S22Params_.PSThresh_ < 0 ) S22Params_.PSThresh_ = 0; if (outputLevel_ > 0) printf("HYPRE_LSI_Uzawa::S22PreconPSThresh\n"); } else if ( !strcmp(param2, "A11PreconPSFilter") ) { sscanf(params,"%s %s %lg", param1, param2, &(A11Params_.PSFilter_)); if ( A11Params_.PSFilter_ < 0 ) A11Params_.PSFilter_ = 0; if (outputLevel_ > 0) printf("HYPRE_LSI_Uzawa::A11PreconPSFilter\n"); } else if ( !strcmp(param2, "S22PreconPSFilter") ) { sscanf(params,"%s %s %lg", param1, param2, &(S22Params_.PSFilter_)); if ( S22Params_.PSFilter_ < 0 ) S22Params_.PSFilter_ = 0; if (outputLevel_ > 0) printf("HYPRE_LSI_Uzawa::S22PreconPSFilter\n"); } else if ( !strcmp(param2, "A11PreconAMGThresh") ) { sscanf(params,"%s %s %lg", param1, param2, &(A11Params_.AMGThresh_)); if ( A11Params_.AMGThresh_ < 0.0 ) A11Params_.AMGThresh_ = 0.0; if (outputLevel_ > 0) printf("HYPRE_LSI_Uzawa::A11PreconAMGThresh\n"); } else if ( !strcmp(param2, "S22PreconAMGThresh") ) { sscanf(params,"%s %s %lg", param1, param2, &(S22Params_.AMGThresh_)); if ( S22Params_.AMGThresh_ < 0.0 ) S22Params_.AMGThresh_ = 0.0; if (outputLevel_ > 0) printf("HYPRE_LSI_Uzawa::S22PreconAMGThresh\n"); } else if ( !strcmp(param2, "A11PreconAMGNumSweeps") ) { sscanf(params,"%s %s %d", param1, param2, &(A11Params_.AMGNSweeps_)); if ( A11Params_.AMGNSweeps_ < 0 ) A11Params_.AMGNSweeps_ = 0; if (outputLevel_ > 0) printf("HYPRE_LSI_Uzawa::A11PreconAMGNSweeps\n"); } else if ( !strcmp(param2, "S22PreconAMGNumSweeps") ) { sscanf(params,"%s %s %d", param1, param2, &(S22Params_.AMGNSweeps_)); if ( S22Params_.AMGNSweeps_ < 0 ) S22Params_.AMGNSweeps_ = 0; if (outputLevel_ > 0) printf("HYPRE_LSI_Uzawa::S22PreconAMGNSweeps\n"); } else if ( !strcmp(param2, "A11PreconAMGSystemSize") ) { sscanf(params,"%s %s %d", param1, param2, &(A11Params_.AMGSystemSize_)); if ( A11Params_.AMGSystemSize_ < 1 ) A11Params_.AMGSystemSize_ = 1; if (outputLevel_ > 0) printf("HYPRE_LSI_Uzawa::A11PreconAMGSystemSize\n"); } else if ( !strcmp(param2, "S22PreconAMGSystemSize") ) { sscanf(params,"%s %s %d", param1, param2, &(S22Params_.AMGSystemSize_)); if ( S22Params_.AMGSystemSize_ < 1 ) S22Params_.AMGSystemSize_ = 1; if (outputLevel_ > 0) printf("HYPRE_LSI_Uzawa::S22PreconAMGSystemSize\n"); } else if ( !strcmp(param2, "A11PreconEuclidNLevels") ) { sscanf(params,"%s %s %d", param1, param2, &(A11Params_.EuclidNLevels_)); if ( A11Params_.EuclidNLevels_ < 0 ) A11Params_.EuclidNLevels_ = 0; if (outputLevel_ > 0) printf("HYPRE_LSI_Uzawa::A11PreconEuclidNLevels\n"); } else if ( !strcmp(param2, "S22PreconEuclidNLevels") ) { sscanf(params,"%s %s %d", param1, param2, &(S22Params_.EuclidNLevels_)); if ( S22Params_.EuclidNLevels_ < 0 ) S22Params_.EuclidNLevels_ = 0; if (outputLevel_ > 0) printf("HYPRE_LSI_Uzawa::S22PreconEuclidNLevels\n"); } else if ( !strcmp(param2, "A11PreconEuclidThresh") ) { sscanf(params,"%s %s %lg", param1, param2, &(A11Params_.EuclidThresh_)); if ( A11Params_.EuclidThresh_ < 0 ) A11Params_.EuclidThresh_ = 0; if (outputLevel_ > 0) printf("HYPRE_LSI_Uzawa::A11PreconEuclidThresh\n"); } else if ( !strcmp(param2, "S22PreconEuclidThresh") ) { sscanf(params,"%s %s %lg", param1, param2, &(S22Params_.EuclidThresh_)); if ( S22Params_.EuclidThresh_ < 0 ) S22Params_.EuclidThresh_ = 0; if (outputLevel_ > 0) printf("HYPRE_LSI_Uzawa::S22PreconEuclidThresh\n"); } else if ( !strcmp(param2, "A11PreconPilutFillin") ) { sscanf(params,"%s %s %d", param1, param2, &(A11Params_.PilutFillin_)); if ( A11Params_.PilutFillin_ < 0 ) A11Params_.PilutFillin_ = 0; if (outputLevel_ > 0) printf("HYPRE_LSI_Uzawa::A11PreconPilutFillin\n"); } else if ( !strcmp(param2, "S22PreconPilutFillin") ) { sscanf(params,"%s %s %d", param1, param2, &(S22Params_.PilutFillin_)); if ( S22Params_.PilutFillin_ < 0 ) S22Params_.PilutFillin_ = 0; if (outputLevel_ > 0) printf("HYPRE_LSI_Uzawa::S22PreconPilutFillin\n"); } else if ( !strcmp(param2, "A11PreconPilutDropTol") ) { sscanf(params,"%s %s %lg", param1, param2, &(A11Params_.PilutDropTol_)); if ( A11Params_.PilutDropTol_ < 0 ) A11Params_.PilutDropTol_ = 0; if (outputLevel_ > 0) printf("HYPRE_LSI_Uzawa::A11PreconPilutDropTol\n"); } else if ( !strcmp(param2, "S22PreconPilutDropTol") ) { sscanf(params,"%s %s %lg", param1, param2, &(S22Params_.PilutDropTol_)); if ( S22Params_.PilutDropTol_ < 0 ) S22Params_.PilutDropTol_ = 0; if (outputLevel_ > 0) printf("HYPRE_LSI_Uzawa::S22PreconPilutDropTol\n"); } else if ( !strcmp(param2, "A11PreconMLIThresh") ) { sscanf(params,"%s %s %lg", param1, param2, &(A11Params_.MLIThresh_)); if ( A11Params_.MLIThresh_ < 0.0 ) A11Params_.MLIThresh_ = 0.0; if (outputLevel_ > 0) printf("HYPRE_LSI_Uzawa::A11PreconMLIThresh\n"); } else if ( !strcmp(param2, "S22PreconMLIThresh") ) { sscanf(params,"%s %s %lg", param1, param2, &(S22Params_.MLIThresh_)); if ( S22Params_.MLIThresh_ < 0.0 ) S22Params_.MLIThresh_ = 0.0; if (outputLevel_ > 0) printf("HYPRE_LSI_Uzawa::S22PreconMLIThresh\n"); } else if ( !strcmp(param2, "A11PreconMLINumSweeps") ) { sscanf(params,"%s %s %d", param1, param2, &(A11Params_.MLINSweeps_)); if ( A11Params_.MLINSweeps_ < 0 ) A11Params_.MLINSweeps_ = 0; if (outputLevel_ > 0) printf("HYPRE_LSI_Uzawa::A11PreconMLINSweeps\n"); } else if ( !strcmp(param2, "S22PreconMLINumSweeps") ) { sscanf(params,"%s %s %d", param1, param2, &(S22Params_.MLINSweeps_)); if ( S22Params_.MLINSweeps_ < 0 ) S22Params_.MLINSweeps_ = 0; if (outputLevel_ > 0) printf("HYPRE_LSI_Uzawa::S22PreconMLINSweeps\n"); } else if ( !strcmp(param2, "A11PreconMLIPweight") ) { sscanf(params,"%s %s %lg", param1, param2, &(A11Params_.MLIPweight_)); if ( A11Params_.MLIPweight_ < 0.0 ) A11Params_.MLIPweight_ = 0.0; if (outputLevel_ > 0) printf("HYPRE_LSI_Uzawa::A11PreconMLIPweight\n"); } else if ( !strcmp(param2, "S22PreconMLIPweight") ) { sscanf(params,"%s %s %lg", param1, param2, &(S22Params_.MLIPweight_)); if ( S22Params_.MLIPweight_ < 0.0 ) S22Params_.MLIPweight_ = 0.0; if (outputLevel_ > 0) printf("HYPRE_LSI_Uzawa::S22PreconMLIPweight\n"); } else if ( !strcmp(param2, "A11PreconMLINodeDOF") ) { sscanf(params,"%s %s %d", param1, param2, &(A11Params_.MLINodeDOF_)); if ( A11Params_.MLINodeDOF_ < 1 ) A11Params_.MLINodeDOF_ = 1; if (outputLevel_ > 0) printf("HYPRE_LSI_Uzawa::A11PreconMLINodeDOF\n"); } else if ( !strcmp(param2, "S22PreconMLINodeDOF") ) { sscanf(params,"%s %s %d", param1, param2, &(S22Params_.MLINodeDOF_)); if ( S22Params_.MLINodeDOF_ < 1 ) S22Params_.MLINodeDOF_ = 1; if (outputLevel_ > 0) printf("HYPRE_LSI_Uzawa::S22PreconMLINodeDOF\n"); } else if ( !strcmp(param2, "A11PreconMLINullDim") ) { sscanf(params,"%s %s %d", param1, param2, &(A11Params_.MLINullDim_)); if ( A11Params_.MLINullDim_ < 1 ) A11Params_.MLINullDim_ = 1; if (outputLevel_ > 0) printf("HYPRE_LSI_Uzawa::A11PreconMLINullDim\n"); } else if ( !strcmp(param2, "S22PreconMLINullDim") ) { sscanf(params,"%s %s %d", param1, param2, &(S22Params_.MLINullDim_)); if ( S22Params_.MLINullDim_ < 1 ) S22Params_.MLINullDim_ = 1; if (outputLevel_ > 0) printf("HYPRE_LSI_Uzawa::S22PreconMLINullDim\n"); } else { printf("HYPRE_LSI_Uzawa:: string not recognized %s\n", params); } return 0; } //*************************************************************************** // set maximum number of iterations //--------------------------------------------------------------------------- int HYPRE_LSI_Uzawa::setMaxIterations(int niter) { maxIterations_ = niter; return 0; } //*************************************************************************** // set tolerance //--------------------------------------------------------------------------- int HYPRE_LSI_Uzawa::setTolerance(double tol) { tolerance_ = tol; return 0; } //*************************************************************************** // get number of iterations //--------------------------------------------------------------------------- int HYPRE_LSI_Uzawa::getNumIterations(int &iter) { iter = numIterations_; return 0; } //*************************************************************************** // Given the matrix (A) within the object, separate the blocks //--------------------------------------------------------------------------- int HYPRE_LSI_Uzawa::setup(HYPRE_ParCSRMatrix A, HYPRE_ParVector x, HYPRE_ParVector b) { int mypid; //------------------------------------------------------------------ // initial set up //------------------------------------------------------------------ MPI_Comm_rank( mpiComm_, &mypid ); if ( mypid == 0 && outputLevel_ >= 1 ) printf("%4d : HYPRE_LSI_Uzawa begins....\n", mypid); Amat_ = A; //------------------------------------------------------------------ // clean up first //------------------------------------------------------------------ if ( procA22Sizes_ != NULL ) delete [] procA22Sizes_; if ( A11mat_ != NULL ) HYPRE_ParCSRMatrixDestroy(A11mat_); if ( A12mat_ != NULL ) HYPRE_ParCSRMatrixDestroy(A12mat_); if ( S22mat_ != NULL ) HYPRE_ParCSRMatrixDestroy(S22mat_); procA22Sizes_ = NULL; A11mat_ = NULL; A12mat_ = NULL; S22mat_ = NULL; //------------------------------------------------------------------ // find the size of A22 block in the local processor (procA22Sizes_) //------------------------------------------------------------------ if ( findA22BlockSize() == 0 ) return 0; //------------------------------------------------------------------ // build the reduced matrix //------------------------------------------------------------------ buildBlockMatrices(); //------------------------------------------------------------------ // setup preconditioners //------------------------------------------------------------------ setupPrecon(&A11Precond_, A11mat_, A11Params_); setupPrecon(&S22Precond_, S22mat_, S22Params_); //------------------------------------------------------------------ // return //------------------------------------------------------------------ if ( mypid == 0 && outputLevel_ >= 1 ) printf("%4d : HYPRE_LSI_Uzawa ends.\n", mypid); return 0; } //*************************************************************************** // Solve using the Uzawa algorithm //--------------------------------------------------------------------------- int HYPRE_LSI_Uzawa::solve(HYPRE_ParVector b, HYPRE_ParVector x) { int mypid, *procNRows, startRow, endRow, localNRows, ierr; int irow, A22NRows; double rnorm0, rnorm; double *b_data, *x_data, *u1_data, *u2_data, *f1_data, *f2_data; double *v1_data; HYPRE_IJVector IJR, IJF1, IJF2, IJU1, IJU2, IJT1, IJT2, IJV1, IJV2; HYPRE_ParVector r_csr, f1_csr, f2_csr, u1_csr, u2_csr, t1_csr, t2_csr; HYPRE_ParVector v1_csr, v2_csr; hypre_Vector *b_local, *f1_local, *f2_local; hypre_Vector *x_local, *u1_local, *u2_local, *v1_local; //------------------------------------------------------------------ // get machine information //------------------------------------------------------------------ MPI_Comm_rank( mpiComm_, &mypid ); //------------------------------------------------------------------ // create temporary vectors //------------------------------------------------------------------ HYPRE_ParCSRMatrixGetRowPartitioning( Amat_, &procNRows ); startRow = procNRows[mypid]; endRow = procNRows[mypid+1] - 1; localNRows = endRow - startRow + 1; ierr = HYPRE_IJVectorCreate(mpiComm_, startRow, endRow, &IJR); ierr = HYPRE_IJVectorSetObjectType(IJR, HYPRE_PARCSR); ierr = HYPRE_IJVectorInitialize(IJR); ierr = HYPRE_IJVectorAssemble(IJR); hypre_assert(!ierr); HYPRE_IJVectorGetObject(IJR, (void **) &r_csr); startRow = procNRows[mypid] - procA22Sizes_[mypid]; endRow = procNRows[mypid+1] - procA22Sizes_[mypid+1] - 1; ierr = HYPRE_IJVectorCreate(mpiComm_, startRow, endRow, &IJF1); ierr = HYPRE_IJVectorSetObjectType(IJF1, HYPRE_PARCSR); ierr = HYPRE_IJVectorInitialize(IJF1); ierr = HYPRE_IJVectorAssemble(IJF1); hypre_assert(!ierr); HYPRE_IJVectorGetObject(IJF1, (void **) &f1_csr); ierr = HYPRE_IJVectorCreate(mpiComm_, startRow, endRow, &IJU1); ierr = HYPRE_IJVectorSetObjectType(IJU1, HYPRE_PARCSR); ierr = HYPRE_IJVectorInitialize(IJU1); ierr = HYPRE_IJVectorAssemble(IJU1); hypre_assert(!ierr); HYPRE_IJVectorGetObject(IJU1, (void **) &u1_csr); ierr = HYPRE_IJVectorCreate(mpiComm_, startRow, endRow, &IJT1); ierr = HYPRE_IJVectorSetObjectType(IJT1, HYPRE_PARCSR); ierr = HYPRE_IJVectorInitialize(IJT1); ierr = HYPRE_IJVectorAssemble(IJT1); hypre_assert(!ierr); HYPRE_IJVectorGetObject(IJT1, (void **) &t1_csr); ierr = HYPRE_IJVectorCreate(mpiComm_, startRow, endRow, &IJV1); ierr = HYPRE_IJVectorSetObjectType(IJV1, HYPRE_PARCSR); ierr = HYPRE_IJVectorInitialize(IJV1); ierr = HYPRE_IJVectorAssemble(IJV1); hypre_assert(!ierr); HYPRE_IJVectorGetObject(IJV1, (void **) &v1_csr); startRow = procA22Sizes_[mypid]; endRow = procA22Sizes_[mypid+1] - 1; ierr = HYPRE_IJVectorCreate(mpiComm_, startRow, endRow, &IJF2); ierr = HYPRE_IJVectorSetObjectType(IJF2, HYPRE_PARCSR); ierr = HYPRE_IJVectorInitialize(IJF2); ierr = HYPRE_IJVectorAssemble(IJF2); hypre_assert(!ierr); HYPRE_IJVectorGetObject(IJF2, (void **) &f2_csr); ierr = HYPRE_IJVectorCreate(mpiComm_, startRow, endRow, &IJU2); ierr = HYPRE_IJVectorSetObjectType(IJU2, HYPRE_PARCSR); ierr = HYPRE_IJVectorInitialize(IJU2); ierr = HYPRE_IJVectorAssemble(IJU2); hypre_assert(!ierr); HYPRE_IJVectorGetObject(IJU2, (void **) &u2_csr); ierr = HYPRE_IJVectorCreate(mpiComm_, startRow, endRow, &IJT2); ierr = HYPRE_IJVectorSetObjectType(IJT2, HYPRE_PARCSR); ierr = HYPRE_IJVectorInitialize(IJT2); ierr = HYPRE_IJVectorAssemble(IJT2); hypre_assert(!ierr); HYPRE_IJVectorGetObject(IJT2, (void **) &t2_csr); ierr = HYPRE_IJVectorCreate(mpiComm_, startRow, endRow, &IJV2); ierr = HYPRE_IJVectorSetObjectType(IJV2, HYPRE_PARCSR); ierr = HYPRE_IJVectorInitialize(IJV2); ierr = HYPRE_IJVectorAssemble(IJV2); hypre_assert(!ierr); HYPRE_IJVectorGetObject(IJV2, (void **) &v2_csr); free( procNRows ); //------------------------------------------------------------------ // compute initial residual //------------------------------------------------------------------ if ( maxIterations_ > 1 ) { HYPRE_ParVectorCopy( b, r_csr ); HYPRE_ParCSRMatrixMatvec( -1.0, Amat_, x, 1.0, r_csr ); HYPRE_ParVectorInnerProd( r_csr, r_csr, &rnorm); rnorm = sqrt( rnorm ); rnorm0 = rnorm * tolerance_; if ( rnorm < rnorm0 ) return 0; if ( mypid == 0 ) printf("Uzawa : initial rnorm = %e\n",rnorm); } else rnorm = rnorm0 = 1.0; //------------------------------------------------------------------ // set up solvers //------------------------------------------------------------------ if ( A11Solver_ == NULL ) setupSolver(&A11Solver_,A11mat_,f1_csr,u1_csr,A11Precond_,A11Params_); if ( S22Params_.SolverID_ != 0 && S22Solver_ == NULL ) setupSolver(&S22Solver_,S22mat_,f2_csr,u2_csr,S22Precond_,S22Params_); //------------------------------------------------------------------ // distribute the vectors //------------------------------------------------------------------ A22NRows = procA22Sizes_[mypid+1] - procA22Sizes_[mypid]; b_local = hypre_ParVectorLocalVector((hypre_ParVector *) b); b_data = (double *) hypre_VectorData(b_local); f1_local = hypre_ParVectorLocalVector((hypre_ParVector *) f1_csr); f1_data = (double *) hypre_VectorData(f1_local); f2_local = hypre_ParVectorLocalVector((hypre_ParVector *) f2_csr); f2_data = (double *) hypre_VectorData(f2_local); x_local = hypre_ParVectorLocalVector((hypre_ParVector *) x); x_data = (double *) hypre_VectorData(x_local); u1_local = hypre_ParVectorLocalVector((hypre_ParVector *) u1_csr); u1_data = (double *) hypre_VectorData(u1_local); u2_local = hypre_ParVectorLocalVector((hypre_ParVector *) u2_csr); u2_data = (double *) hypre_VectorData(u2_local); v1_local = hypre_ParVectorLocalVector((hypre_ParVector *) v1_csr); v1_data = (double *) hypre_VectorData(v1_local); for ( irow = 0; irow < localNRows-A22NRows; irow++ ) f1_data[irow] = b_data[irow]; for ( irow = localNRows-A22NRows; irow < localNRows; irow++ ) f2_data[irow-localNRows+A22NRows] = b_data[irow]; //------------------------------------------------------------------ // iterate (using the Cheng-Zou method) //------------------------------------------------------------------ numIterations_ = 0; while ( numIterations_ < maxIterations_ && rnorm >= rnorm0 ) { numIterations_++; //---------------------------------------------------------------- // copy x to split vectors //--------------------------------------------------------------- for ( irow = 0; irow < localNRows-A22NRows; irow++ ) v1_data[irow] = u1_data[irow] = x_data[irow]; for ( irow = localNRows-A22NRows; irow < localNRows; irow++ ) u2_data[irow-localNRows+A22NRows] = x_data[irow]; //---------------------------------------------------------------- // x_{i+1/2} = x_i + Q_A^{-1} (f1 - A x_i - A12 y_i) //--------------------------------------------------------------- HYPRE_ParVectorCopy( f1_csr, t1_csr ); HYPRE_ParCSRMatrixMatvec( -1.0, A11mat_, u1_csr, 1.0, t1_csr ); HYPRE_ParCSRMatrixMatvec( -1.0, A12mat_, u2_csr, 1.0, t1_csr ); if ( A11Params_.SolverID_ == 1 ) HYPRE_ParCSRPCGSolve(A11Solver_, A11mat_, t1_csr, u1_csr); else if ( A11Params_.SolverID_ == 2 ) HYPRE_ParCSRGMRESSolve(A11Solver_, A11mat_, t1_csr, u1_csr); hypre_ParVectorAxpy( 1.0, (hypre_ParVector*)v1_csr , (hypre_ParVector*)u1_csr ); //---------------------------------------------------------------- // y_{i+1/2} = y_i + Q_B^{-1} (A21 x_{i+1/2} - f2) //--------------------------------------------------------------- if ( modifiedScheme_ >= 1 ) { HYPRE_ParVectorCopy( f2_csr, t2_csr ); HYPRE_ParCSRMatrixMatvecT( 1.0, A12mat_, u1_csr, -1.0, t2_csr ); if ( S22Params_.SolverID_ == 1 ) HYPRE_ParCSRPCGSolve(S22Solver_, S22mat_, t2_csr, v2_csr); else if ( S22Params_.SolverID_ == 2 ) HYPRE_ParCSRGMRESSolve(S22Solver_, S22mat_, t2_csr, v2_csr); else { HYPRE_ParVectorCopy( t2_csr, v2_csr ); HYPRE_ParVectorScale( S22SolverDampFactor_, v2_csr ); } hypre_ParVectorAxpy( 1.0, (hypre_ParVector*)v2_csr , (hypre_ParVector*)u2_csr ); //---------------------------------------------------------------- // x_{i+1} = x_i + Q_A^{-1} (f - A x_i - A12 y_{i+1/2}) //--------------------------------------------------------------- HYPRE_ParVectorCopy( f1_csr, t1_csr ); HYPRE_ParCSRMatrixMatvec( -1.0, A11mat_, v1_csr, 1.0, t1_csr ); HYPRE_ParCSRMatrixMatvec( -1.0, A12mat_, u2_csr, 1.0, t1_csr ); if ( A11Params_.SolverID_ == 1 ) HYPRE_ParCSRPCGSolve(A11Solver_, A11mat_, t1_csr, u1_csr); else if ( A11Params_.SolverID_ == 2 ) HYPRE_ParCSRGMRESSolve(A11Solver_, A11mat_, t1_csr, u1_csr); hypre_ParVectorAxpy( 1.0, (hypre_ParVector*)v1_csr , (hypre_ParVector*)u1_csr ); //---------------------------------------------------------------- // y_{i+1} = y_{i+1/2} + Q_B^{-1} (A21 x_{i+1} - f2) //--------------------------------------------------------------- HYPRE_ParVectorCopy( f2_csr, t2_csr ); HYPRE_ParCSRMatrixMatvecT( 1.0, A12mat_, u1_csr, -1.0, t2_csr ); if ( S22Params_.SolverID_ == 1 ) HYPRE_ParCSRPCGSolve(S22Solver_, S22mat_, t2_csr, v2_csr); else if ( S22Params_.SolverID_ == 2 ) HYPRE_ParCSRGMRESSolve(S22Solver_, S22mat_, t2_csr, v2_csr); else { HYPRE_ParVectorCopy( t2_csr, v2_csr ); HYPRE_ParVectorScale( S22SolverDampFactor_, v2_csr ); } hypre_ParVectorAxpy( 1.0, (hypre_ParVector*)v2_csr , (hypre_ParVector*)u2_csr ); } //---------------------------------------------------------------- // merge solution vector and compute residual norm //--------------------------------------------------------------- for ( irow = 0; irow < localNRows-A22NRows; irow++ ) x_data[irow] = u1_data[irow]; for ( irow = localNRows-A22NRows; irow < localNRows; irow++ ) x_data[irow] = u2_data[irow-localNRows+A22NRows]; if ( maxIterations_ > 1 ) { HYPRE_ParVectorCopy( b, r_csr ); HYPRE_ParCSRMatrixMatvec( -1.0, Amat_, x, 1.0, r_csr ); HYPRE_ParVectorInnerProd( r_csr, r_csr, &rnorm); rnorm = sqrt( rnorm ); if ( mypid == 0 ) printf("Uzawa : iteration = %5d, rnorm = %e\n",numIterations_, rnorm); } } HYPRE_IJVectorDestroy(IJR); HYPRE_IJVectorDestroy(IJF1); HYPRE_IJVectorDestroy(IJF2); HYPRE_IJVectorDestroy(IJU1); HYPRE_IJVectorDestroy(IJU2); HYPRE_IJVectorDestroy(IJT1); HYPRE_IJVectorDestroy(IJT2); HYPRE_IJVectorDestroy(IJV2); return 0; } //*************************************************************************** // search for the separator for // A = |A_11 A_12| // |A_12^T A_22| //--------------------------------------------------------------------------- int HYPRE_LSI_Uzawa::findA22BlockSize() { int mypid, nprocs, *procNRows, startRow, endRow; int A22LocalSize, irow, zeroDiag, jcol, rowSize, *colInd; int *iTempList, ip, ncnt, A22GlobalSize; double *colVal; //------------------------------------------------------------------ // get matrix information //------------------------------------------------------------------ MPI_Comm_rank(mpiComm_, &mypid); MPI_Comm_size(mpiComm_, &nprocs); HYPRE_ParCSRMatrixGetRowPartitioning( Amat_, &procNRows ); startRow = procNRows[mypid]; endRow = procNRows[mypid+1] - 1; free( procNRows ); //------------------------------------------------------------------ // search for dimension of A_22 //------------------------------------------------------------------ A22LocalSize = 0; for ( irow = endRow; irow >= startRow; irow-- ) { HYPRE_ParCSRMatrixGetRow(Amat_,irow,&rowSize,&colInd,&colVal); zeroDiag = 1; for ( jcol = 0; jcol < rowSize; jcol++ ) { if ( colInd[jcol] == irow && colVal[jcol] != 0.0 ) { zeroDiag = 0; break; } } HYPRE_ParCSRMatrixRestoreRow(Amat_,irow,&rowSize,&colInd,&colVal); if ( zeroDiag ) A22LocalSize++; else break; } if ( outputLevel_ >= 1 ) printf("%4d : findA22BlockSize - local nrows = %d\n",mypid,A22LocalSize); //------------------------------------------------------------------ // gather the block size information on all processors //------------------------------------------------------------------ iTempList = new int[nprocs]; if ( procA22Sizes_ != NULL ) delete [] procA22Sizes_; procA22Sizes_ = new int[nprocs+1]; for ( ip = 0; ip < nprocs; ip++ ) iTempList[ip] = 0; iTempList[mypid] = A22LocalSize; MPI_Allreduce(iTempList,procA22Sizes_,nprocs,MPI_INT,MPI_SUM,mpiComm_); delete [] iTempList; A22GlobalSize = 0; ncnt = 0; for ( ip = 0; ip < nprocs; ip++ ) { ncnt = procA22Sizes_[ip]; procA22Sizes_[ip] = A22GlobalSize; A22GlobalSize += ncnt; } procA22Sizes_[nprocs] = A22GlobalSize; return A22GlobalSize; } //**************************************************************************** // build the block matrices A11, A21, and S22 //---------------------------------------------------------------------------- int HYPRE_LSI_Uzawa::buildBlockMatrices() { int ierr=0; ierr += buildA11A12Mat(); ierr += buildS22Mat(); return ierr; } //**************************************************************************** // build A11 and A12 matrix //---------------------------------------------------------------------------- int HYPRE_LSI_Uzawa::buildA11A12Mat() { int mypid, nprocs, *procNRows, startRow, endRow, newEndRow, ierr; int A12NCols, A11NRows, A11StartRow, A12StartCol, *A11MatSize, ip; int *A12MatSize, irow, jcol, colIndex, uBound, A11RowSize, A12RowSize; int *A11ColInd, *A12ColInd, rowIndex, rowSize, *colInd, ncnt; int localNRows, maxA11RowSize, maxA12RowSize; double *colVal, *A11ColVal, *A12ColVal; HYPRE_IJMatrix IJA11, IJA12; //------------------------------------------------------------------ // get matrix information //------------------------------------------------------------------ MPI_Comm_rank(mpiComm_, &mypid); MPI_Comm_size(mpiComm_, &nprocs); HYPRE_ParCSRMatrixGetRowPartitioning( Amat_, &procNRows ); startRow = procNRows[mypid]; endRow = procNRows[mypid+1] - 1; localNRows = endRow - startRow + 1; newEndRow = endRow - (procA22Sizes_[mypid+1] - procA22Sizes_[mypid]); //------------------------------------------------------------------ // calculate the dimension of A11 and A12 //------------------------------------------------------------------ A12NCols = procA22Sizes_[mypid+1] - procA22Sizes_[mypid]; A11NRows = localNRows - A12NCols; A11StartRow = procNRows[mypid] - procA22Sizes_[mypid]; A12StartCol = procA22Sizes_[mypid]; if ( outputLevel_ >= 1 ) { printf("%4d : buildA11A12Mat - A11StartRow = %d\n", mypid, A11StartRow); printf("%4d : buildA11A12Mat - A11LocalDim = %d\n", mypid, A11NRows); printf("%4d : buildA11A12Mat - A12StartRow = %d\n", mypid, A12StartCol); printf("%4d : buildA11A12Mat - A12LocalCol = %d\n", mypid, A12NCols); } //------------------------------------------------------------------ // create a matrix context for A11 and A12 //------------------------------------------------------------------ ierr = HYPRE_IJMatrixCreate(mpiComm_,A11StartRow,A11StartRow+A11NRows-1, A11StartRow,A11StartRow+A11NRows-1,&IJA11); ierr += HYPRE_IJMatrixSetObjectType(IJA11, HYPRE_PARCSR); hypre_assert(!ierr); ierr = HYPRE_IJMatrixCreate(mpiComm_,A11StartRow,A11StartRow+A11NRows-1, A12StartCol,A12StartCol+A12NCols-1,&IJA12); ierr += HYPRE_IJMatrixSetObjectType(IJA12, HYPRE_PARCSR); hypre_assert(!ierr); //------------------------------------------------------------------ // compute the number of nonzeros in each matrix //------------------------------------------------------------------ A11MatSize = new int[A11NRows]; A12MatSize = new int[A11NRows]; maxA11RowSize = maxA12RowSize = 0; for ( irow = startRow; irow <= newEndRow ; irow++ ) { A11RowSize = A12RowSize = 0; HYPRE_ParCSRMatrixGetRow(Amat_,irow,&rowSize,&colInd,NULL); for ( jcol = 0; jcol < rowSize; jcol++ ) { colIndex = colInd[jcol]; for ( ip = 1; ip <= nprocs; ip++ ) if ( procNRows[ip] > colIndex ) break; uBound = procNRows[ip] - (procA22Sizes_[ip] - procA22Sizes_[ip-1]); if ( colIndex < uBound ) A11RowSize++; else A12RowSize++; } A11MatSize[irow-startRow] = A11RowSize; A12MatSize[irow-startRow] = A12RowSize; maxA11RowSize = (A11RowSize > maxA11RowSize) ? A11RowSize : maxA11RowSize; maxA12RowSize = (A12RowSize > maxA12RowSize) ? A12RowSize : maxA12RowSize; HYPRE_ParCSRMatrixRestoreRow(Amat_,irow,&rowSize,&colInd,NULL); } //------------------------------------------------------------------ // after fetching the row sizes, initialize the matrices //------------------------------------------------------------------ ierr = HYPRE_IJMatrixSetRowSizes(IJA11, A11MatSize); ierr += HYPRE_IJMatrixInitialize(IJA11); hypre_assert(!ierr); ierr = HYPRE_IJMatrixSetRowSizes(IJA12, A12MatSize); ierr += HYPRE_IJMatrixInitialize(IJA12); hypre_assert(!ierr); //------------------------------------------------------------------ // next load the matrices //------------------------------------------------------------------ A11ColInd = new int[maxA11RowSize+1]; A11ColVal = new double[maxA11RowSize+1]; A12ColInd = new int[maxA12RowSize+1]; A12ColVal = new double[maxA12RowSize+1]; for ( irow = startRow; irow <= newEndRow ; irow++ ) { A11RowSize = A12RowSize = 0; HYPRE_ParCSRMatrixGetRow(Amat_,irow,&rowSize,&colInd,&colVal); for ( jcol = 0; jcol < rowSize; jcol++ ) { colIndex = colInd[jcol]; for ( ip = 1; ip <= nprocs; ip++ ) if ( procNRows[ip] > colIndex ) break; uBound = procNRows[ip] - (procA22Sizes_[ip] - procA22Sizes_[ip-1]); if ( colIndex < uBound ) { A11ColInd[A11RowSize] = colIndex - procA22Sizes_[ip-1]; A11ColVal[A11RowSize++] = colVal[jcol]; } else { A12ColInd[A12RowSize] = colIndex - uBound + procA22Sizes_[ip-1]; A12ColVal[A12RowSize++] = colVal[jcol]; } } HYPRE_ParCSRMatrixRestoreRow(Amat_,irow,&rowSize,&colInd,&colVal); rowIndex = irow - procA22Sizes_[mypid]; ierr = HYPRE_IJMatrixSetValues(IJA11, 1, &A11RowSize, (const int *) &rowIndex, (const int *) A11ColInd, (const double *) A11ColVal); hypre_assert( !ierr ); ierr = HYPRE_IJMatrixSetValues(IJA12, 1, &A12RowSize, (const int *) &rowIndex, (const int *) A12ColInd, (const double *) A12ColVal); hypre_assert( !ierr ); } //------------------------------------------------------------------ // finally assemble the matrix and sanitize //------------------------------------------------------------------ HYPRE_IJMatrixAssemble(IJA11); HYPRE_IJMatrixGetObject(IJA11, (void **) &A11mat_); hypre_MatvecCommPkgCreate((hypre_ParCSRMatrix *) A11mat_); HYPRE_IJMatrixAssemble(IJA12); HYPRE_IJMatrixGetObject(IJA12, (void **) &A12mat_); hypre_MatvecCommPkgCreate((hypre_ParCSRMatrix *) A11mat_); HYPRE_IJMatrixSetObjectType(IJA11, -1); HYPRE_IJMatrixDestroy(IJA11); HYPRE_IJMatrixSetObjectType(IJA12, -1); HYPRE_IJMatrixDestroy(IJA12); delete [] A11MatSize; delete [] A12MatSize; delete [] A11ColInd; delete [] A11ColVal; delete [] A12ColInd; delete [] A12ColVal; free( procNRows ); //------------------------------------------------------------------ // diagnostics //------------------------------------------------------------------ if ( outputLevel_ >= 3 ) { ncnt = 0; MPI_Barrier(mpiComm_); while ( ncnt < nprocs ) { if ( mypid == ncnt ) { printf("====================================================\n"); printf("%4d : Printing A11 matrix... \n", mypid); fflush(stdout); for (irow = A11StartRow;irow < A11StartRow+A11NRows;irow++) { HYPRE_ParCSRMatrixGetRow(A11mat_,irow,&rowSize,&colInd,&colVal); for ( jcol = 0; jcol < rowSize; jcol++ ) if ( colVal[jcol] != 0.0 ) printf("%6d %6d %25.16e \n",irow+1,colInd[jcol]+1, colVal[jcol]); HYPRE_ParCSRMatrixRestoreRow(A11mat_, irow, &rowSize, &colInd, &colVal); } printf("====================================================\n"); } ncnt++; MPI_Barrier(mpiComm_); } } if ( outputLevel_ >= 3 ) { ncnt = 0; MPI_Barrier(mpiComm_); while ( ncnt < nprocs ) { if ( mypid == ncnt ) { printf("====================================================\n"); printf("%4d : Printing A12 matrix... \n", mypid); fflush(stdout); for (irow = A11StartRow;irow < A11StartRow+A11NRows;irow++) { HYPRE_ParCSRMatrixGetRow(A12mat_,irow,&rowSize,&colInd,&colVal); for ( jcol = 0; jcol < rowSize; jcol++ ) if ( colVal[jcol] != 0.0 ) printf("%6d %6d %25.16e \n",irow+1,colInd[jcol]+1, colVal[jcol]); HYPRE_ParCSRMatrixRestoreRow(A12mat_, irow, &rowSize, &colInd, &colVal); } printf("====================================================\n"); } ncnt++; MPI_Barrier(mpiComm_); } } return 0; } //**************************************************************************** // build the block matrix S22 (B diag(A)^{-1} B^T) //---------------------------------------------------------------------------- int HYPRE_LSI_Uzawa::buildS22Mat() { int mypid, nprocs, *procNRows, one=1, A11StartRow, A11NRows, irow, jcol; int rowSize, *colInd, *A11MatSize, ierr; double *colVal, ddata; HYPRE_ParCSRMatrix ainvA11_csr; HYPRE_IJMatrix ainvA11; HYPRE_Solver parasails; //------------------------------------------------------------------ // get machine information //------------------------------------------------------------------ MPI_Comm_rank(mpiComm_, &mypid); MPI_Comm_size(mpiComm_, &nprocs); //------------------------------------------------------------------ // choose between diagonal or approximate inverse //------------------------------------------------------------------ if ( S22Scheme_ == 1 ) { //--------------------------------------------------------------- // build approximate inverse of A11 //--------------------------------------------------------------- HYPRE_ParaSailsCreate(mpiComm_, ¶sails); HYPRE_ParaSailsSetParams(parasails, 0.1, 1); HYPRE_ParaSailsSetFilter(parasails, 0.1); HYPRE_ParaSailsSetLogging(parasails, 1); HYPRE_ParaSailsSetup(parasails, A11mat_, NULL, NULL); HYPRE_ParaSailsBuildIJMatrix(parasails, &ainvA11); } else { //--------------------------------------------------------------- // build inverse of diagonal of A11 //--------------------------------------------------------------- HYPRE_ParCSRMatrixGetRowPartitioning( A11mat_, &procNRows ); A11StartRow = procNRows[mypid]; A11NRows = procNRows[mypid+1] - A11StartRow; ierr = HYPRE_IJMatrixCreate(mpiComm_,A11StartRow, A11StartRow+A11NRows-1, A11StartRow, A11StartRow+A11NRows-1,&ainvA11); ierr += HYPRE_IJMatrixSetObjectType(ainvA11, HYPRE_PARCSR); hypre_assert(!ierr); A11MatSize = new int[A11NRows]; for ( irow = 0; irow < A11NRows; irow++ ) A11MatSize[irow] = 1; ierr = HYPRE_IJMatrixSetRowSizes(ainvA11, A11MatSize); ierr += HYPRE_IJMatrixInitialize(ainvA11); hypre_assert(!ierr); for ( irow = A11StartRow; irow < A11StartRow+A11NRows; irow++ ) { HYPRE_ParCSRMatrixGetRow(A11mat_,irow,&rowSize,&colInd,&colVal); ddata = 0.0; for ( jcol = 0; jcol < rowSize; jcol++ ) { if ( colInd[jcol] == irow ) { ddata = 1.0 / colVal[jcol]; break; } } HYPRE_ParCSRMatrixRestoreRow(A11mat_,irow,&rowSize,&colInd,&colVal); ierr = HYPRE_IJMatrixSetValues(ainvA11, 1, &one, (const int *) &irow, (const int *) &irow, (const double *) &ddata); hypre_assert( !ierr ); } HYPRE_IJMatrixAssemble(ainvA11); free( procNRows ); delete [] A11MatSize; } //------------------------------------------------------------------ // perform the triple matrix product A12' * diagA11 * A12 //------------------------------------------------------------------ HYPRE_IJMatrixGetObject(ainvA11, (void **) &ainvA11_csr); hypre_BoomerAMGBuildCoarseOperator((hypre_ParCSRMatrix *) A12mat_, (hypre_ParCSRMatrix *) ainvA11_csr, (hypre_ParCSRMatrix *) A12mat_, (hypre_ParCSRMatrix **) &S22mat_); //------------------------------------------------------------------ // clean up and return //------------------------------------------------------------------ HYPRE_IJMatrixDestroy(ainvA11); return 0; } //*************************************************************************** // setup preconditioner //--------------------------------------------------------------------------- int HYPRE_LSI_Uzawa::setupPrecon(HYPRE_Solver *precon,HYPRE_ParCSRMatrix Amat, HYPRE_Uzawa_PARAMS paramPtr) { int i, *nsweeps, *relaxType; char **targv; #ifdef HAVE_MLI char paramString[100]; #endif (void) Amat; if ( paramPtr.SolverID_ == 0 ) return 0; //------------------------------------------------------------------ // set up the solvers and preconditioners //------------------------------------------------------------------ switch( paramPtr.PrecondID_ ) { case 2 : HYPRE_ParCSRParaSailsCreate( mpiComm_, precon ); if (paramPtr.SolverID_ == 0) HYPRE_ParCSRParaSailsSetSym(*precon,1); else HYPRE_ParCSRParaSailsSetSym(*precon,0); HYPRE_ParCSRParaSailsSetParams(*precon, paramPtr.PSThresh_, paramPtr.PSNLevels_); HYPRE_ParCSRParaSailsSetFilter(*precon, paramPtr.PSFilter_); break; case 3 : HYPRE_BoomerAMGCreate(precon); HYPRE_BoomerAMGSetMaxIter(*precon, 1); HYPRE_BoomerAMGSetCycleType(*precon, 1); HYPRE_BoomerAMGSetPrintLevel(*precon, outputLevel_); HYPRE_BoomerAMGSetMaxLevels(*precon, 25); HYPRE_BoomerAMGSetMeasureType(*precon, 0); HYPRE_BoomerAMGSetCoarsenType(*precon, 0); HYPRE_BoomerAMGSetStrongThreshold(*precon,paramPtr.AMGThresh_); if ( paramPtr.AMGSystemSize_ > 1 ) HYPRE_BoomerAMGSetNumFunctions(*precon,paramPtr.AMGSystemSize_); nsweeps = hypre_CTAlloc(int,4,HYPRE_MEMORY_HOST); for ( i = 0; i < 4; i++ ) nsweeps[i] = paramPtr.AMGNSweeps_; HYPRE_BoomerAMGSetNumGridSweeps(*precon, nsweeps); relaxType = hypre_CTAlloc(int,4,HYPRE_MEMORY_HOST); for ( i = 0; i < 4; i++ ) relaxType[i] = 6; HYPRE_BoomerAMGSetGridRelaxType(*precon, relaxType); break; case 4 : HYPRE_ParCSRPilutCreate( mpiComm_, precon ); HYPRE_ParCSRPilutSetMaxIter( *precon, 1 ); HYPRE_ParCSRPilutSetFactorRowSize(*precon,paramPtr.PilutFillin_); HYPRE_ParCSRPilutSetDropTolerance(*precon,paramPtr.PilutDropTol_); break; case 5 : HYPRE_EuclidCreate( mpiComm_, precon ); targv = hypre_TAlloc(char*, 4 , HYPRE_MEMORY_HOST); for ( i = 0; i < 4; i++ ) targv[i] = hypre_TAlloc(char, 50, HYPRE_MEMORY_HOST); strcpy(targv[0], "-level"); sprintf(targv[1], "%1d", paramPtr.EuclidNLevels_); strcpy(targv[2], "-sparseA"); sprintf(targv[3], "%f", paramPtr.EuclidThresh_); HYPRE_EuclidSetParams(*precon, 4, targv); for ( i = 0; i < 4; i++ ) free(targv[i]); free(targv); break; case 6 : #ifdef HAVE_MLI HYPRE_LSI_MLICreate(mpiComm_, precon); sprintf(paramString, "MLI outputLevel %d", outputLevel_); HYPRE_LSI_MLISetParams(*precon, paramString); sprintf(paramString, "MLI strengthThreshold %e",paramPtr.MLIThresh_); HYPRE_LSI_MLISetParams(*precon, paramString); sprintf(paramString, "MLI method AMGSA"); HYPRE_LSI_MLISetParams(*precon, paramString); sprintf(paramString, "MLI smoother SGS"); HYPRE_LSI_MLISetParams(*precon, paramString); sprintf(paramString, "MLI numSweeps %d",paramPtr.MLINSweeps_); HYPRE_LSI_MLISetParams(*precon, paramString); sprintf(paramString, "MLI Pweight %e",paramPtr.MLIPweight_); HYPRE_LSI_MLISetParams(*precon, paramString); sprintf(paramString, "MLI nodeDOF %d",paramPtr.MLINodeDOF_); HYPRE_LSI_MLISetParams(*precon, paramString); sprintf(paramString, "MLI nullSpaceDim %d",paramPtr.MLINullDim_); HYPRE_LSI_MLISetParams(*precon, paramString); #else printf("Uzawa setupPrecon ERROR : mli not available.\n"); exit(1); #endif break; } return 0; } //*************************************************************************** // setup solver //--------------------------------------------------------------------------- int HYPRE_LSI_Uzawa::setupSolver(HYPRE_Solver *solver,HYPRE_ParCSRMatrix Amat, HYPRE_ParVector fvec, HYPRE_ParVector xvec, HYPRE_Solver precon, HYPRE_Uzawa_PARAMS paramPtr) { //------------------------------------------------------------------ // create solver context //------------------------------------------------------------------ switch ( paramPtr.SolverID_ ) { case 1 : HYPRE_ParCSRPCGCreate(mpiComm_, solver); HYPRE_ParCSRPCGSetMaxIter(*solver, paramPtr.MaxIter_ ); HYPRE_ParCSRPCGSetTol(*solver, paramPtr.Tol_); HYPRE_ParCSRPCGSetLogging(*solver, outputLevel_); HYPRE_ParCSRPCGSetRelChange(*solver, 0); HYPRE_ParCSRPCGSetTwoNorm(*solver, 1); switch ( paramPtr.PrecondID_ ) { case 1 : HYPRE_ParCSRPCGSetPrecond(*solver, HYPRE_ParCSRDiagScale, HYPRE_ParCSRDiagScaleSetup,precon); break; case 2 : HYPRE_ParCSRPCGSetPrecond(*solver,HYPRE_ParCSRParaSailsSolve, HYPRE_ParCSRParaSailsSetup,precon); break; case 3 : HYPRE_ParCSRPCGSetPrecond(*solver, HYPRE_BoomerAMGSolve, HYPRE_BoomerAMGSetup, precon); break; case 4 : HYPRE_ParCSRPCGSetPrecond(*solver, HYPRE_ParCSRPilutSolve, HYPRE_ParCSRPilutSetup, precon); break; case 5 : HYPRE_ParCSRPCGSetPrecond(*solver, HYPRE_EuclidSolve, HYPRE_EuclidSetup, precon); break; case 6 : #ifdef HAVE_MLI HYPRE_ParCSRPCGSetPrecond(*solver,HYPRE_LSI_MLISolve, HYPRE_LSI_MLISetup, precon); #else printf("Uzawa setupSolver ERROR : mli not available.\n"); exit(1); #endif break; } HYPRE_ParCSRPCGSetup(*solver, Amat, fvec, xvec); break; case 2 : HYPRE_ParCSRGMRESCreate(mpiComm_, solver); HYPRE_ParCSRGMRESSetMaxIter(*solver, paramPtr.MaxIter_ ); HYPRE_ParCSRGMRESSetTol(*solver, paramPtr.Tol_); HYPRE_ParCSRGMRESSetLogging(*solver, outputLevel_); HYPRE_ParCSRGMRESSetKDim(*solver, 50); switch ( paramPtr.PrecondID_ ) { case 1 : HYPRE_ParCSRGMRESSetPrecond(*solver, HYPRE_ParCSRDiagScale, HYPRE_ParCSRDiagScaleSetup,precon); break; case 2 : HYPRE_ParCSRGMRESSetPrecond(*solver,HYPRE_ParCSRParaSailsSolve, HYPRE_ParCSRParaSailsSetup,precon); break; case 3 : HYPRE_ParCSRGMRESSetPrecond(*solver, HYPRE_BoomerAMGSolve, HYPRE_BoomerAMGSetup, precon); break; case 4 : HYPRE_ParCSRGMRESSetPrecond(*solver, HYPRE_ParCSRPilutSolve, HYPRE_ParCSRPilutSetup, precon); break; case 5 : HYPRE_ParCSRGMRESSetPrecond(*solver, HYPRE_EuclidSolve, HYPRE_EuclidSetup, precon); break; case 6 : #ifdef HAVEL_MLI HYPRE_ParCSRGMRESSetPrecond(*solver,HYPRE_LSI_MLISolve, HYPRE_LSI_MLISetup, precon); #else printf("Uzawa setupSolver ERROR : mli not available.\n"); exit(1); #endif break; } HYPRE_ParCSRGMRESSetup(*solver, Amat, fvec, xvec); break; } return 0; } hypre-2.33.0/src/FEI_mv/fei-hypre/HYPRE_LSI_UZAWA.h000066400000000000000000000100621477326011500212350ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ // ************************************************************************** // This is the class that handles slide surface reduction // ************************************************************************** #ifndef __HYPRE_UZAWA__ #define __HYPRE_UZAWA__ // ************************************************************************** // system libraries used // -------------------------------------------------------------------------- #include "utilities/_hypre_utilities.h" #include "IJ_mv/_hypre_IJ_mv.h" #include "parcsr_mv/_hypre_parcsr_mv.h" #include "parcsr_ls/_hypre_parcsr_ls.h" // ************************************************************************* // Solver-Preconditioner parameter data structure // ------------------------------------------------------------------------- typedef struct HYPRE_Uzawa_PARAMS_Struct { int SolverID_; // solver ID int PrecondID_; // preconditioner ID double Tol_; // tolerance for Krylov solver int MaxIter_; // max iterations for Krylov solver int PSNLevels_; // Nlevels for ParaSails double PSThresh_; // threshold for ParaSails double PSFilter_; // filter for ParaSails double AMGThresh_; // threshold for BoomerAMG int AMGNSweeps_; // no. of relaxations for BoomerAMG int AMGSystemSize_; // system size for BoomerAMG int PilutFillin_; // Fillin for Pilut double PilutDropTol_; // drop tolerance for Pilut int EuclidNLevels_; // nlevels for Euclid double EuclidThresh_; // threshold for Euclid double MLIThresh_; // threshold for MLI SA double MLIPweight_; // Pweight for MLI SA int MLINSweeps_; // no. of relaxations for MLI int MLINodeDOF_; // system size for BoomerAMG int MLINullDim_; // null space dimension for MLI SA } HYPRE_Uzawa_PARAMS; // ************************************************************************** // class definition // -------------------------------------------------------------------------- class HYPRE_LSI_Uzawa { MPI_Comm mpiComm_; int outputLevel_; int modifiedScheme_; int S22Scheme_; int maxIterations_; double tolerance_; double S22SolverDampFactor_; int numIterations_; HYPRE_ParCSRMatrix Amat_; HYPRE_ParCSRMatrix A11mat_; HYPRE_ParCSRMatrix A12mat_; HYPRE_ParCSRMatrix S22mat_; int *procA22Sizes_; HYPRE_Solver A11Solver_; // solver for A11 matrix HYPRE_Solver A11Precond_; // preconditioner for A11 matrix HYPRE_Solver S22Solver_; // solver for S12 HYPRE_Solver S22Precond_; // preconditioner for S12 HYPRE_Uzawa_PARAMS A11Params_; HYPRE_Uzawa_PARAMS S22Params_; public: HYPRE_LSI_Uzawa(MPI_Comm); virtual ~HYPRE_LSI_Uzawa(); int setOutputLevel(int level) {outputLevel_ = level; return 0;} int setParams(char *paramString); int setMaxIterations(int); int setTolerance(double); int getNumIterations(int&); int setup(HYPRE_ParCSRMatrix , HYPRE_ParVector , HYPRE_ParVector ); int solve(HYPRE_ParVector , HYPRE_ParVector ); private: int findA22BlockSize(); int buildBlockMatrices(); int buildA11A12Mat(); int buildS22Mat(); int setupSolver(HYPRE_Solver *,HYPRE_ParCSRMatrix, HYPRE_ParVector, HYPRE_ParVector, HYPRE_Solver, HYPRE_Uzawa_PARAMS); int setupPrecon(HYPRE_Solver *,HYPRE_ParCSRMatrix,HYPRE_Uzawa_PARAMS); }; #endif hypre-2.33.0/src/FEI_mv/fei-hypre/HYPRE_LSI_Uzawa_c.h000066400000000000000000000031521477326011500217410ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * HYPRE_LSI_Uzawa interface * *****************************************************************************/ #ifndef __HYPRE_UZAWA__ #define __HYPRE_UZAWA__ #include #include #include #include #include "HYPRE.h" #include "utilities/_hypre_utilities.h" #include "parcsr_ls/_hypre_parcsr_ls.h" #include "parcsr_mv/_hypre_parcsr_mv.h" #include "HYPRE_LSI_UZAWA.h" #ifdef __cplusplus extern "C" { #endif extern int HYPRE_LSI_UzawaCreate(MPI_Comm comm, HYPRE_Solver *solver); extern int HYPRE_LSI_UzawaDestroy(HYPRE_Solver solver); extern int HYPRE_LSI_UzawaSetMaxIterations(HYPRE_Solver solver, int iter); extern int HYPRE_LSI_UzawaSetTolerance(HYPRE_Solver solver, double tol); extern int HYPRE_LSI_UzawaSetParams(HYPRE_Solver solver, char *params); extern int HYPRE_LSI_UzawaGetNumIterations(HYPRE_Solver solver, int *iter); extern int HYPRE_LSI_UzawaSetup(HYPRE_Solver solver,HYPRE_ParCSRMatrix A, HYPRE_ParVector b,HYPRE_ParVector x); extern int HYPRE_LSI_UzawaSolve(HYPRE_Solver solver,HYPRE_ParCSRMatrix A, HYPRE_ParVector b, HYPRE_ParVector x); #ifdef __cplusplus } #endif #endif hypre-2.33.0/src/FEI_mv/fei-hypre/HYPRE_LSI_blkprec.cxx000066400000000000000000003176701477326011500223620ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ //****************************************************************************** //****************************************************************************** // This module supports the solution of linear systems arising from the finite // element discretization of the incompressible Navier Stokes equations. // The steps in using this module are : // // (1) precond = new HYPRE_LSI_BlockP(HYPRE_IJMatrix Amat) // (2a) precond->setSchemeBlockDiag(), or // (2b) precond->setSchemeBlockTriangular(), or // (2c) precond->setSchemeBlockInverse() // (3) If lumped mass matrix is to be loaded, do the following : // -- call directly to HYPRE : beginCreateMapFromSoln // -- use FEI function to load initial guess with map // -- call directly to HYPRE : endCreateMapFromSoln // (4) precond->setup(mapFromSolnList_,mapFromSolnList2_,mapFromSolnLeng_) // (5) precond->solve( HYPRE_IJVector x, HYPRE_IJVector f ) // //****************************************************************************** //****************************************************************************** //****************************************************************************** // system include files //------------------------------------------------------------------------------ #include #include #include #if 0 /* RDF: Not sure this is really needed */ #ifdef WIN32 #define strcmp _stricmp #endif #endif //****************************************************************************** // HYPRE include files //------------------------------------------------------------------------------ #include "HYPRE.h" #include "utilities/_hypre_utilities.h" #include "IJ_mv/HYPRE_IJ_mv.h" #include "parcsr_mv/HYPRE_parcsr_mv.h" #include "parcsr_ls/HYPRE_parcsr_ls.h" #include "HYPRE_LSI_ddilut.h" #include "HYPRE_LSI_mli.h" #include "HYPRE_LSI_blkprec.h" #ifdef HAVE_ML extern "C" { int HYPRE_LSI_MLCreate( MPI_Comm, HYPRE_Solver *); int HYPRE_LSI_MLDestroy( HYPRE_Solver ); int HYPRE_LSI_MLSetup( HYPRE_Solver, HYPRE_ParCSRMatrix, HYPRE_ParVector, HYPRE_ParVector ); int HYPRE_LSI_MLSolve( HYPRE_Solver, HYPRE_ParCSRMatrix, HYPRE_ParVector, HYPRE_ParVector ); int HYPRE_LSI_MLSetStrongThreshold( HYPRE_Solver, double ); int HYPRE_LSI_MLSetNumPreSmoothings( HYPRE_Solver, int ); int HYPRE_LSI_MLSetNumPostSmoothings( HYPRE_Solver, int ); int HYPRE_LSI_MLSetPreSmoother( HYPRE_Solver, int ); int HYPRE_LSI_MLSetPostSmoother( HYPRE_Solver, int ); int HYPRE_LSI_MLSetCoarseSolver( HYPRE_Solver, int ); } #endif //****************************************************************************** // external functions needed here and local defines //------------------------------------------------------------------------------ extern "C" { int hypre_BoomerAMGBuildCoarseOperator(hypre_ParCSRMatrix*, hypre_ParCSRMatrix*, hypre_ParCSRMatrix*, hypre_ParCSRMatrix**); int HYPRE_LSI_Search(int *, int, int); } //****************************************************************************** //****************************************************************************** // C-Interface data structure //------------------------------------------------------------------------------ typedef struct HYPRE_LSI_BlockPrecond_Struct { void *precon; } HYPRE_LSI_BlockPrecond; //****************************************************************************** //****************************************************************************** // C-Interface functions to solver //------------------------------------------------------------------------------ extern "C" int HYPRE_LSI_BlockPrecondCreate(MPI_Comm mpi_comm, HYPRE_Solver *solver) { (void) mpi_comm; HYPRE_LSI_BlockPrecond *cprecon = (HYPRE_LSI_BlockPrecond *) hypre_CTAlloc(HYPRE_LSI_BlockPrecond, 1, HYPRE_MEMORY_HOST); HYPRE_LSI_BlockP *precon = (HYPRE_LSI_BlockP *) new HYPRE_LSI_BlockP(); cprecon->precon = (void *) precon; (*solver) = (HYPRE_Solver) cprecon; return 0; } //------------------------------------------------------------------------------ extern "C" int HYPRE_LSI_BlockPrecondDestroy(HYPRE_Solver solver) { int err=0; HYPRE_LSI_BlockPrecond *cprecon = (HYPRE_LSI_BlockPrecond *) solver; if ( cprecon == NULL ) err = 1; else { HYPRE_LSI_BlockP *precon = (HYPRE_LSI_BlockP *) cprecon->precon; if ( precon != NULL ) delete precon; else err = 1; free( cprecon ); } return err; } //------------------------------------------------------------------------------ extern "C" int HYPRE_LSI_BlockPrecondSetLumpedMasses(HYPRE_Solver solver, int length, double *mass_v) { int err=0; HYPRE_LSI_BlockPrecond *cprecon = (HYPRE_LSI_BlockPrecond *) solver; if ( cprecon == NULL ) err = 1; else { HYPRE_LSI_BlockP *precon = (HYPRE_LSI_BlockP *) cprecon->precon; err = precon->setLumpedMasses(length, mass_v); } return err; } //------------------------------------------------------------------------------ extern "C" int HYPRE_LSI_BlockPrecondSetParams(HYPRE_Solver solver, char *params) { int err=0; HYPRE_LSI_BlockPrecond *cprecon = (HYPRE_LSI_BlockPrecond *) solver; if ( cprecon == NULL ) err = 1; else { HYPRE_LSI_BlockP *precon = (HYPRE_LSI_BlockP *) cprecon->precon; err = precon->setParams(params); } return err; } //------------------------------------------------------------------------------ extern "C" int HYPRE_LSI_BlockPrecondSetLookup(HYPRE_Solver solver, HYPRE_Lookup *lookup) { int err=0; HYPRE_LSI_BlockPrecond *cprecon = (HYPRE_LSI_BlockPrecond *) solver; if ( cprecon == NULL ) err = 1; else { HYPRE_LSI_BlockP *precon = (HYPRE_LSI_BlockP *) cprecon->precon; err = precon->setLookup((Lookup *)lookup->object); } return err; } //------------------------------------------------------------------------------ extern "C" int HYPRE_LSI_BlockPrecondSetup(HYPRE_Solver solver, HYPRE_ParCSRMatrix Amat, HYPRE_ParVector b, HYPRE_ParVector x) { int err=0; (void) b; (void) x; HYPRE_LSI_BlockPrecond *cprecon = (HYPRE_LSI_BlockPrecond *) solver; if ( cprecon == NULL ) err = 1; else { HYPRE_LSI_BlockP *precon = (HYPRE_LSI_BlockP *) cprecon->precon; err = precon->setup(Amat); } return err; } //------------------------------------------------------------------------------ extern "C" int HYPRE_LSI_BlockPrecondSolve(HYPRE_Solver solver, HYPRE_ParCSRMatrix Amat, HYPRE_ParVector b, HYPRE_ParVector x) { int err=0; (void) Amat; HYPRE_LSI_BlockPrecond *cprecon = (HYPRE_LSI_BlockPrecond *) solver; if ( cprecon == NULL ) err = 1; else { HYPRE_LSI_BlockP *precon = (HYPRE_LSI_BlockP *) cprecon->precon; err = precon->solve(b, x); } return err; } //------------------------------------------------------------------------------ extern "C" int HYPRE_LSI_BlockPrecondSetA11Tolerance(HYPRE_Solver solver, double tol) { int err=0; double tol2; char paramString[30]; HYPRE_LSI_BlockPrecond *cprecon = (HYPRE_LSI_BlockPrecond *) solver; if ( cprecon == NULL ) err = 1; else { HYPRE_LSI_BlockP *precon = (HYPRE_LSI_BlockP *) cprecon->precon; tol2 = tol; if ( tol2 > 0.1 ) tol2 = 0.1; sprintf( paramString, "blockP A11Tolerance %e", tol2 ); err = precon->setParams(paramString); } return err; } //****************************************************************************** //****************************************************************************** //****************************************************************************** // Constructor //------------------------------------------------------------------------------ HYPRE_LSI_BlockP::HYPRE_LSI_BlockP() { Amat_ = NULL; A11mat_ = NULL; A12mat_ = NULL; A22mat_ = NULL; F1vec_ = NULL; F2vec_ = NULL; X1vec_ = NULL; X2vec_ = NULL; X1aux_ = NULL; APartition_ = NULL; P22LocalInds_ = NULL; P22GlobalInds_ = NULL; P22Offsets_ = NULL; P22Size_ = -1; P22GSize_ = -1; block1FieldID_ = 0; block2FieldID_ = 1; assembled_ = 0; outputLevel_ = 0; lumpedMassScheme_ = 0; lumpedMassThresh_ = 0.1; lumpedMassNlevels_ = 1; lumpedMassLength_ = 0; lumpedMassDiag_ = NULL; scheme_ = HYPRE_INCFLOW_BDIAG; printFlag_ = 0; A11Solver_ = NULL; A11Precond_ = NULL; A22Solver_ = NULL; A22Precond_ = NULL; A11Params_.SolverID_ = 1; /* default : gmres */ A22Params_.SolverID_ = 0; /* default : cg */ A11Params_.PrecondID_ = 1; /* default : diagonal */ A22Params_.PrecondID_ = 1; /* default : diagonal */ A11Params_.Tol_ = 1.0e-2; A22Params_.Tol_ = 1.0e-2; A11Params_.MaxIter_ = 1000; A22Params_.MaxIter_ = 1000; A11Params_.PSNLevels_ = 1; A22Params_.PSNLevels_ = 1; A11Params_.PSThresh_ = 1.0e-1; A22Params_.PSThresh_ = 1.0e-1; A11Params_.PSFilter_ = 2.0e-1; A22Params_.PSFilter_ = 2.0e-1; A11Params_.AMGThresh_ = 5.0e-1; A22Params_.AMGThresh_ = 5.0e-1; A11Params_.AMGRelaxType_ = 6; A22Params_.AMGRelaxType_ = 6; A11Params_.AMGNSweeps_ = 2; A22Params_.AMGNSweeps_ = 2; A11Params_.AMGSystemSize_ = 1; A22Params_.AMGSystemSize_ = 1; A11Params_.PilutFillin_ = 100; A22Params_.PilutFillin_ = 100; A11Params_.PilutDropTol_ = 0.1; A22Params_.PilutDropTol_ = 0.1; A11Params_.EuclidNLevels_ = 1; A22Params_.EuclidNLevels_ = 1; A11Params_.EuclidThresh_ = 0.1; A22Params_.EuclidThresh_ = 0.1; A11Params_.DDIlutFillin_ = 3.0; A22Params_.DDIlutFillin_ = 3.0; A11Params_.DDIlutDropTol_ = 0.2; A22Params_.DDIlutDropTol_ = 0.2; A11Params_.MLThresh_ = 0.08; A22Params_.MLThresh_ = 0.08; A11Params_.MLNSweeps_ = 1; A22Params_.MLNSweeps_ = 1; A11Params_.MLIThresh_ = 0.08; A22Params_.MLIThresh_ = 0.08; A11Params_.MLINSweeps_ = 1; A22Params_.MLINSweeps_ = 1; A11Params_.MLIRelaxType_ = 2; A22Params_.MLIRelaxType_ = 2; A11Params_.MLIPweight_ = 0.0; A22Params_.MLIPweight_ = 0.0; A11Params_.MLINodeDOF_ = 3; A22Params_.MLINodeDOF_ = 3; A11Params_.MLINullDim_ = 3; A22Params_.MLINullDim_ = 3; } //****************************************************************************** // destructor //------------------------------------------------------------------------------ HYPRE_LSI_BlockP::~HYPRE_LSI_BlockP() { if ( A11mat_ != NULL ) HYPRE_IJMatrixDestroy(A11mat_); if ( A12mat_ != NULL ) HYPRE_IJMatrixDestroy(A12mat_); if ( A22mat_ != NULL ) HYPRE_IJMatrixDestroy(A22mat_); if ( APartition_ != NULL ) free( APartition_ ); if ( P22LocalInds_ != NULL ) delete [] P22LocalInds_; if ( P22GlobalInds_ != NULL ) delete [] P22GlobalInds_; if ( P22Offsets_ != NULL ) delete [] P22Offsets_; if ( lumpedMassDiag_ != NULL ) delete [] lumpedMassDiag_; if ( F1vec_ != NULL ) HYPRE_IJVectorDestroy( F1vec_ ); if ( F2vec_ != NULL ) HYPRE_IJVectorDestroy( F2vec_ ); if ( X1vec_ != NULL ) HYPRE_IJVectorDestroy( X1vec_ ); if ( X2vec_ != NULL ) HYPRE_IJVectorDestroy( X2vec_ ); if ( X1aux_ != NULL ) HYPRE_IJVectorDestroy( X1aux_ ); destroySolverPrecond(); } //****************************************************************************** // load mass matrix for pressure //------------------------------------------------------------------------------ int HYPRE_LSI_BlockP::setLumpedMasses(int length, double *Mdata) { if ( length <= 0 ) { printf("HYPRE_LSI_BlockP setLumpedMasses ERROR : M has length <= 0\n"); exit(1); } lumpedMassLength_ = length; if ( lumpedMassDiag_ != NULL ) delete [] lumpedMassDiag_; lumpedMassDiag_ = new double[length]; for ( int i = 0; i < length; i++ ) lumpedMassDiag_[i] = Mdata[i]; return 0; } //****************************************************************************** // set internal parameters //------------------------------------------------------------------------------ int HYPRE_LSI_BlockP::setParams(char *params) { char param1[256], param2[256], param3[256]; sscanf(params,"%s", param1); if ( strcmp(param1, "blockP") ) { printf("HYPRE_LSI_BlockP::parameters not for me.\n"); return 1; } sscanf(params,"%s %s", param1, param2); if ( !strcmp(param2, "help") ) { printf("Available options for blockP are : \n"); printf(" blockD (block diagonal)\n"); printf(" blockS (block diagonal with Schur complement\n"); printf(" blockT (block tridiagonal)\n"); printf(" blockLU (block LU) \n"); printf(" outputLevel \n"); printf(" block1FieldID (-3 : special for implicitHydro)\n"); printf(" block2FieldID (-3 : special for implicitHydro)\n"); printf(" printInfo \n"); printf(" lumpedMassScheme \n"); printf(" invA11PSNlevels \n"); printf(" invA11PSThresh \n"); printf(" A11Solver \n"); printf(" A11Tolerance \n"); printf(" A11MaxIterations \n"); printf(" A11Precon \n"); printf(" A11PreconPSNlevels \n"); printf(" A11PreconPSThresh \n"); printf(" A11PreconPSFilter \n"); printf(" A11PreconAMGThresh \n"); printf(" A11PreconAMGRelaxType \n"); printf(" A11PreconAMGNumSweeps \n"); printf(" A11PreconAMGSystemSize \n"); printf(" A11PreconEuclidNLevels \n"); printf(" A11PreconEuclidThresh \n"); printf(" A11PreconPilutFillin \n"); printf(" A11PreconPilutDropTol \n"); printf(" A11PreconDDIlutFillin \n"); printf(" A11PreconDDIlutDropTol \n"); printf(" A11PreconMLIThresh \n"); printf(" A11PreconMLIRelaxType \n"); printf(" A11PreconMLINumSweeps \n"); printf(" A11PreconMLIPweight \n"); printf(" A11PreconMLINodeDOF \n"); printf(" A11PreconMLINullDim \n"); printf(" A22Solver \n"); printf(" A22Tolerance \n"); printf(" A22MaxIterations \n"); printf(" A22Precon \n"); printf(" A22PreconPSNlevels \n"); printf(" A22PreconPSThresh \n"); printf(" A22PreconPSFilter \n"); printf(" A22PreconAMGThresh \n"); printf(" A22PreconAMGRelaxType \n"); printf(" A22PreconAMGNumSweeps \n"); printf(" A22PreconAMGSystemSize \n"); printf(" A22PreconEuclidNLevels \n"); printf(" A22PreconEuclidThresh \n"); printf(" A22PreconPilutFillin \n"); printf(" A22PreconPilutDropTol \n"); printf(" A22PreconDDIlutFillin \n"); printf(" A22PreconDDIlutDropTol \n"); printf(" A22PreconMLIThresh \n"); printf(" A22PreconMLIRelaxType \n"); printf(" A22PreconMLINumSweeps \n"); printf(" A22PreconMLIPweight \n"); printf(" A22PreconMLINodeDOF \n"); printf(" A22PreconMLINullDim \n"); } else if ( !strcmp(param2, "blockD") ) { scheme_ = HYPRE_INCFLOW_BDIAG; if ( outputLevel_ > 0 ) printf("HYPRE_LSI_BlockP::select block diagonal.\n"); } else if ( !strcmp(param2, "blockS") ) { scheme_ = HYPRE_INCFLOW_SDIAG; if ( outputLevel_ > 0 ) printf("HYPRE_LSI_BlockP::select block diagonal with Schur.\n"); } else if ( !strcmp(param2, "blockT") ) { scheme_ = HYPRE_INCFLOW_BTRI; if ( outputLevel_ > 0 ) printf("HYPRE_LSI_BlockP::select block triangular.\n"); } else if ( !strcmp(param2, "blockLU") ) { scheme_ = HYPRE_INCFLOW_BLU; if ( outputLevel_ > 0 ) printf("HYPRE_LSI_BlockP::select block LU.\n"); } else if ( !strcmp(param2, "outputLevel") ) { sscanf(params,"%s %s %d", param1, param2, &outputLevel_); if ( outputLevel_ > 0 ) printf("HYPRE_LSI_BlockP::outputLevel = %d.\n", outputLevel_); } else if ( !strcmp(param2, "block1FieldID") ) { sscanf(params,"%s %s %d", param1, param2, &block1FieldID_); if ( outputLevel_ > 0 ) printf("HYPRE_LSI_BlockP::block1FieldID = %d.\n", block1FieldID_); } else if ( !strcmp(param2, "block2FieldID") ) { sscanf(params,"%s %s %d", param1, param2, &block2FieldID_); if ( outputLevel_ > 0 ) printf("HYPRE_LSI_BlockP::block2FieldID = %d.\n", block2FieldID_); } else if ( !strcmp(param2, "printInfo") ) { printFlag_ = 1; if ( outputLevel_ > 0 ) printf("HYPRE_LSI_BlockP::set print flag.\n"); } else if ( !strcmp(param2, "invA11PSNlevels") ) { sscanf(params,"%s %s %d", param1, param2, &lumpedMassNlevels_); if ( outputLevel_ > 0 ) printf("HYPRE_LSI_BlockP::invA11PSNlevels = %d.\n",lumpedMassNlevels_); } else if ( !strcmp(param2, "invA11PSThresh") ) { sscanf(params,"%s %s %lg", param1, param2, &lumpedMassThresh_); if ( outputLevel_ > 0 ) printf("HYPRE_LSI_BlockP::invA11PSThresh = %e.\n", lumpedMassThresh_); } else if ( !strcmp(param2, "invA11Scheme") ) { sscanf(params,"%s %s %s", param1, param2, param3); if ( !strcmp(param3, "diag") ) { lumpedMassScheme_ = 0; if (outputLevel_ > 0) printf("HYPRE_LSI_BlockP::invA11Scheme=diag\n"); } else if ( !strcmp(param3, "ainv") ) { lumpedMassScheme_ = 1; if (outputLevel_ > 0) printf("HYPRE_LSI_BlockP::invA11Scheme = ainv\n"); } } else if ( !strcmp(param2, "A11Solver") ) { sscanf(params,"%s %s %s", param1, param2, param3); if ( !strcmp(param3, "cg") ) { A11Params_.SolverID_ = 0; if (outputLevel_ > 0) printf("HYPRE_LSI_BlockP::A11 solver = cg\n"); } else if ( !strcmp(param3, "gmres") ) { A11Params_.SolverID_ = 1; if (outputLevel_ > 0) printf("HYPRE_LSI_BlockP::A11 solver = gmres\n"); } else if ( !strcmp(param3, "boomeramg") ) { A11Params_.SolverID_ = 2; if (outputLevel_ > 0) printf("HYPRE_LSI_BlockP::A11 solver = boomeramg\n"); } else if ( !strcmp(param3, "diagonal") ) { A11Params_.SolverID_ = 3; if (outputLevel_ > 0) printf("HYPRE_LSI_BlockP::A11 solver = diag\n"); } else if ( !strcmp(param3, "identity") ) { A11Params_.SolverID_ = 9; if (outputLevel_ > 0) printf("HYPRE_LSI_BlockP::A11 solver = identity\n"); } else { printf("HYPRE_LSI_BlockP::invalid A11 solver %s.\n",param3); } } else if ( !strcmp(param2, "A22Solver") ) { sscanf(params,"%s %s %s", param1, param2, param3); if ( !strcmp(param3, "cg") ) { A22Params_.SolverID_ = 0; if (outputLevel_ > 0) printf("HYPRE_LSI_BlockP::A22 solver = cg\n"); } else if ( !strcmp(param3, "gmres") ) { A22Params_.SolverID_ = 1; if (outputLevel_ > 0) printf("HYPRE_LSI_BlockP::A22 solver = gmres\n"); } else if ( !strcmp(param3, "boomeramg") ) { A22Params_.SolverID_ = 2; if (outputLevel_ > 0) printf("HYPRE_LSI_BlockP::A22 solver = boomeramg\n"); } else if ( !strcmp(param3, "diagonal") ) { A22Params_.SolverID_ = 3; if (outputLevel_ > 0) printf("HYPRE_LSI_BlockP::A22 solver = diag\n"); } else if ( !strcmp(param3, "identity") ) { A22Params_.SolverID_ = 9; if (outputLevel_ > 0) printf("HYPRE_LSI_BlockP::A22 solver = identity\n"); } else { printf("HYPRE_LSI_BlockP::invalid A22 solver %s.\n",param3); } } else if ( !strcmp(param2, "A11Tolerance") ) { sscanf(params,"%s %s %lg", param1, param2, &(A11Params_.Tol_)); if ( A11Params_.Tol_ >= 1.0 || A11Params_.Tol_ <= 0.0 ) A11Params_.Tol_ = 1.0e-12; if (outputLevel_ > 0) printf("HYPRE_LSI_BlockP::A11 tol = %e\n", A11Params_.Tol_); } else if ( !strcmp(param2, "A22Tolerance") ) { sscanf(params,"%s %s %lg", param1, param2, &(A22Params_.Tol_)); if ( A22Params_.Tol_ >= 1.0 || A22Params_.Tol_ <= 0.0 ) A22Params_.Tol_ = 1.0e-12; if (outputLevel_ > 0) printf("HYPRE_LSI_BlockP::A22 tol = %e\n", A22Params_.Tol_); } else if ( !strcmp(param2, "A11MaxIterations") ) { sscanf(params,"%s %s %d", param1, param2, &(A11Params_.MaxIter_)); if ( A11Params_.MaxIter_ <= 0 ) A11Params_.MaxIter_ = 10; if (outputLevel_ > 0) printf("HYPRE_LSI_BlockP::A11 maxiter = %d\n", A11Params_.MaxIter_); } else if ( !strcmp(param2, "A22MaxIterations") ) { sscanf(params,"%s %s %d", param1, param2, &(A22Params_.MaxIter_)); if ( A22Params_.MaxIter_ <= 0 ) A22Params_.MaxIter_ = 10; if (outputLevel_ > 0) printf("HYPRE_LSI_BlockP::A22 maxiter = %d\n", A22Params_.MaxIter_); } else if ( !strcmp(param2, "A11Precon") ) { sscanf(params,"%s %s %s", param1, param2, param3); if ( !strcmp(param3, "diagonal") ) { A11Params_.PrecondID_ = 1; if (outputLevel_ > 0) printf("HYPRE_LSI_BlockP::A11 precon = diagonal\n"); } else if ( !strcmp(param3, "parasails") ) { A11Params_.PrecondID_ = 2; if (outputLevel_ > 0) printf("HYPRE_LSI_BlockP::A11 precon = parasails\n"); } else if ( !strcmp(param3, "boomeramg") ) { A11Params_.PrecondID_ = 3; if (outputLevel_ > 0) printf("HYPRE_LSI_BlockP::A11 precon = boomeramg\n"); } else if ( !strcmp(param3, "pilut") ) { A11Params_.PrecondID_ = 4; if (outputLevel_ > 0) printf("HYPRE_LSI_BlockP::A11 precon = pilut\n"); } else if ( !strcmp(param3, "euclid") ) { A11Params_.PrecondID_ = 5; if (outputLevel_ > 0) printf("HYPRE_LSI_BlockP::A11 precon = euclid\n"); } else if ( !strcmp(param3, "ddilut") ) { A11Params_.PrecondID_ = 6; if (outputLevel_ > 0) printf("HYPRE_LSI_BlockP::A11 precon = ddilut\n"); } else if ( !strcmp(param3, "ml") ) { A11Params_.PrecondID_ = 7; if (outputLevel_ > 0) printf("HYPRE_LSI_BlockP::A11 precon = ml\n"); } else if ( !strcmp(param3, "mli") ) { A11Params_.PrecondID_ = 8; if (outputLevel_ > 0) printf("HYPRE_LSI_BlockP::A11 precon = mli\n"); } } else if ( !strcmp(param2, "A22Precon") ) { sscanf(params,"%s %s %s", param1, param2, param3); if ( !strcmp(param3, "diagonal") ) { A22Params_.PrecondID_ = 1; if (outputLevel_ > 0) printf("HYPRE_LSI_BlockP::A22 precon = diagonal\n"); } else if ( !strcmp(param3, "parasails") ) { A22Params_.PrecondID_ = 2; if (outputLevel_ > 0) printf("HYPRE_LSI_BlockP::A22 precon = parasails\n"); } else if ( !strcmp(param3, "boomeramg") ) { A22Params_.PrecondID_ = 3; if (outputLevel_ > 0) printf("HYPRE_LSI_BlockP::A22 precon = boomeramg\n"); } else if ( !strcmp(param3, "pilut") ) { A22Params_.PrecondID_ = 4; if (outputLevel_ > 0) printf("HYPRE_LSI_BlockP::A22 precon = pilut\n"); } else if ( !strcmp(param3, "euclid") ) { A22Params_.PrecondID_ = 5; if (outputLevel_ > 0) printf("HYPRE_LSI_BlockP::A22 precon = euclid\n"); } else if ( !strcmp(param3, "ddilut") ) { A22Params_.PrecondID_ = 6; if (outputLevel_ > 0) printf("HYPRE_LSI_BlockP::A22 precon = ddilut\n"); } else if ( !strcmp(param3, "ml") ) { A22Params_.PrecondID_ = 7; if (outputLevel_ > 0) printf("HYPRE_LSI_BlockP::A22 precon = ml\n"); } else if ( !strcmp(param3, "mli") ) { A22Params_.PrecondID_ = 8; if (outputLevel_ > 0) printf("HYPRE_LSI_BlockP::A22 precon = mli\n"); } } else if ( !strcmp(param2, "A11PreconPSNlevels") ) { sscanf(params,"%s %s %d", param1, param2, &(A11Params_.PSNLevels_)); if ( A11Params_.PSNLevels_ < 0 ) A11Params_.PSNLevels_ = 0; if (outputLevel_ > 0) printf("HYPRE_LSI_BlockP::A11PreconPSNLevels\n"); } else if ( !strcmp(param2, "A22PreconPSNlevels") ) { sscanf(params,"%s %s %d", param1, param2, &(A22Params_.PSNLevels_)); if ( A22Params_.PSNLevels_ < 0 ) A22Params_.PSNLevels_ = 0; if (outputLevel_ > 0) printf("HYPRE_LSI_BlockP::A22PreconPSNLevels\n"); } else if ( !strcmp(param2, "A11PreconPSThresh") ) { sscanf(params,"%s %s %lg", param1, param2, &(A11Params_.PSThresh_)); if ( A11Params_.PSThresh_ < 0 ) A11Params_.PSThresh_ = 0; if (outputLevel_ > 0) printf("HYPRE_LSI_BlockP::A11PreconPSThresh\n"); } else if ( !strcmp(param2, "A22PreconPSThresh") ) { sscanf(params,"%s %s %lg", param1, param2, &(A22Params_.PSThresh_)); if ( A22Params_.PSThresh_ < 0 ) A22Params_.PSThresh_ = 0; if (outputLevel_ > 0) printf("HYPRE_LSI_BlockP::A22PreconPSThresh\n"); } else if ( !strcmp(param2, "A11PreconPSFilter") ) { sscanf(params,"%s %s %lg", param1, param2, &(A11Params_.PSFilter_)); if ( A11Params_.PSFilter_ < 0 ) A11Params_.PSFilter_ = 0; if (outputLevel_ > 0) printf("HYPRE_LSI_BlockP::A11PreconPSFilter\n"); } else if ( !strcmp(param2, "A22PreconPSFilter") ) { sscanf(params,"%s %s %lg", param1, param2, &(A22Params_.PSFilter_)); if ( A22Params_.PSFilter_ < 0 ) A22Params_.PSFilter_ = 0; if (outputLevel_ > 0) printf("HYPRE_LSI_BlockP::A22PreconPSFilter\n"); } else if ( !strcmp(param2, "A11PreconAMGThresh") ) { sscanf(params,"%s %s %lg", param1, param2, &(A11Params_.AMGThresh_)); if ( A11Params_.AMGThresh_ < 0 ) A11Params_.AMGThresh_ = 0; if (outputLevel_ > 0) printf("HYPRE_LSI_BlockP::A11PreconAMGThresh\n"); } else if ( !strcmp(param2, "A22PreconAMGThresh") ) { sscanf(params,"%s %s %lg", param1, param2, &(A22Params_.AMGThresh_)); if ( A22Params_.AMGThresh_ < 0 ) A22Params_.AMGThresh_ = 0; if (outputLevel_ > 0) printf("HYPRE_LSI_BlockP::A22PreconAMGThresh\n"); } else if ( !strcmp(param2, "A11PreconAMGRelaxType") ) { sscanf(params,"%s %s %s", param1, param2, param3); if ( !strcmp(param3, "jacobi" ) ) A11Params_.AMGRelaxType_ = 0; else if ( !strcmp(param3, "gsSlow") ) A11Params_.AMGRelaxType_ = 1; else if ( !strcmp(param3, "gsFast") ) A11Params_.AMGRelaxType_ = 4; else if ( !strcmp(param3, "hybrid" ) ) A11Params_.AMGRelaxType_ = 3; else if ( !strcmp(param3, "hybridsym"))A11Params_.AMGRelaxType_ = 6; else A11Params_.AMGRelaxType_ = 4; if (outputLevel_ > 0) printf("HYPRE_LSI_BlockP::A11PreconAMGRelaxType\n"); } else if ( !strcmp(param2, "A22PreconAMGRelaxType") ) { sscanf(params,"%s %s %s", param1, param2, param3); if ( !strcmp(param3, "jacobi" ) ) A22Params_.AMGRelaxType_ = 0; else if ( !strcmp(param3, "gsSlow") ) A22Params_.AMGRelaxType_ = 1; else if ( !strcmp(param3, "gsFast") ) A22Params_.AMGRelaxType_ = 4; else if ( !strcmp(param3, "hybrid" ) ) A22Params_.AMGRelaxType_ = 3; else if ( !strcmp(param3, "hybridsym"))A22Params_.AMGRelaxType_ = 6; else A22Params_.AMGRelaxType_ = 4; if (outputLevel_ > 0) printf("HYPRE_LSI_BlockP::A22PreconAMGRelaxType\n"); } else if ( !strcmp(param2, "A11PreconAMGNumSweeps") ) { sscanf(params,"%s %s %d", param1, param2, &(A11Params_.AMGNSweeps_)); if ( A11Params_.AMGNSweeps_ < 0 ) A11Params_.AMGNSweeps_ = 0; if (outputLevel_ > 0) printf("HYPRE_LSI_BlockP::A11PreconAMGNSweeps\n"); } else if ( !strcmp(param2, "A22PreconAMGNumSweeps") ) { sscanf(params,"%s %s %d", param1, param2, &(A22Params_.AMGNSweeps_)); if ( A22Params_.AMGNSweeps_ < 0 ) A22Params_.AMGNSweeps_ = 0; if (outputLevel_ > 0) printf("HYPRE_LSI_BlockP::A22PreconAMGNSweeps\n"); } else if ( !strcmp(param2, "A11PreconAMGSystemSize") ) { sscanf(params,"%s %s %d", param1, param2, &(A11Params_.AMGSystemSize_)); if ( A11Params_.AMGSystemSize_ < 0 ) A11Params_.AMGSystemSize_ = 1; if (outputLevel_ > 0) printf("HYPRE_LSI_BlockP::A11PreconAMGSystemSize\n"); } else if ( !strcmp(param2, "A22PreconAMGSystemSize") ) { sscanf(params,"%s %s %d", param1, param2, &(A22Params_.AMGSystemSize_)); if ( A22Params_.AMGSystemSize_ < 0 ) A22Params_.AMGSystemSize_ = 0; if (outputLevel_ > 0) printf("HYPRE_LSI_BlockP::A22PreconAMGSystemSize\n"); } else if ( !strcmp(param2, "A11PreconEuclidNLevels") ) { sscanf(params,"%s %s %d", param1, param2, &(A11Params_.EuclidNLevels_)); if ( A11Params_.EuclidNLevels_ < 0 ) A11Params_.EuclidNLevels_ = 0; if (outputLevel_ > 0) printf("HYPRE_LSI_BlockP::A11PreconEuclidNLevels\n"); } else if ( !strcmp(param2, "A22PreconEuclidNLevels") ) { sscanf(params,"%s %s %d", param1, param2, &(A22Params_.EuclidNLevels_)); if ( A22Params_.EuclidNLevels_ < 0 ) A22Params_.EuclidNLevels_ = 0; if (outputLevel_ > 0) printf("HYPRE_LSI_BlockP::A22PreconEuclidNLevels\n"); } else if ( !strcmp(param2, "A11PreconEuclidThresh") ) { sscanf(params,"%s %s %lg", param1, param2, &(A11Params_.EuclidThresh_)); if ( A11Params_.EuclidThresh_ < 0 ) A11Params_.EuclidThresh_ = 0; if (outputLevel_ > 0) printf("HYPRE_LSI_BlockP::A11PreconEuclidThresh\n"); } else if ( !strcmp(param2, "A22PreconEuclidThresh") ) { sscanf(params,"%s %s %lg", param1, param2, &(A22Params_.EuclidThresh_)); if ( A22Params_.EuclidThresh_ < 0 ) A22Params_.EuclidThresh_ = 0; if (outputLevel_ > 0) printf("HYPRE_LSI_BlockP::A22PreconEuclidThresh\n"); } else if ( !strcmp(param2, "A11PreconPilutFillin") ) { sscanf(params,"%s %s %d", param1, param2, &(A11Params_.PilutFillin_)); if ( A11Params_.PilutFillin_ < 0 ) A11Params_.PilutFillin_ = 0; if (outputLevel_ > 0) printf("HYPRE_LSI_BlockP::A11PreconPilutFillin\n"); } else if ( !strcmp(param2, "A22PreconPilutFillin") ) { sscanf(params,"%s %s %d", param1, param2, &(A22Params_.PilutFillin_)); if ( A22Params_.PilutFillin_ < 0 ) A22Params_.PilutFillin_ = 0; if (outputLevel_ > 0) printf("HYPRE_LSI_BlockP::A22PreconPilutFillin\n"); } else if ( !strcmp(param2, "A11PreconPilutDropTol") ) { sscanf(params,"%s %s %lg", param1, param2, &(A11Params_.PilutDropTol_)); if ( A11Params_.PilutDropTol_ < 0 ) A11Params_.PilutDropTol_ = 0; if (outputLevel_ > 0) printf("HYPRE_LSI_BlockP::A11PreconPilutDropTol\n"); } else if ( !strcmp(param2, "A22PreconPilutDropTol") ) { sscanf(params,"%s %s %lg", param1, param2, &(A22Params_.PilutDropTol_)); if ( A22Params_.PilutDropTol_ < 0 ) A22Params_.PilutDropTol_ = 0; if (outputLevel_ > 0) printf("HYPRE_LSI_BlockP::A22PreconPilutDropTol\n"); } else if ( !strcmp(param2, "A11PreconDDIlutFillin") ) { sscanf(params,"%s %s %lg", param1, param2, &(A11Params_.DDIlutFillin_)); if ( A11Params_.DDIlutFillin_ < 0 ) A11Params_.DDIlutFillin_ = 0; if (outputLevel_ > 0) printf("HYPRE_LSI_BlockP::A11PreconDDIlutFillin\n"); } else if ( !strcmp(param2, "A22PreconDDIlutFillin") ) { sscanf(params,"%s %s %lg", param1, param2, &(A22Params_.DDIlutFillin_)); if ( A22Params_.DDIlutFillin_ < 0 ) A22Params_.DDIlutFillin_ = 0; if (outputLevel_ > 0) printf("HYPRE_LSI_BlockP::A22PreconDDIlutFillin\n"); } else if ( !strcmp(param2, "A11PreconDDIlutDropTol") ) { sscanf(params,"%s %s %lg", param1, param2, &(A11Params_.DDIlutDropTol_)); if ( A11Params_.DDIlutDropTol_ < 0 ) A11Params_.DDIlutDropTol_ = 0; if (outputLevel_ > 0) printf("HYPRE_LSI_BlockP::A11PreconDDIlutDropTol\n"); } else if ( !strcmp(param2, "A22PreconDDIlutDropTol") ) { sscanf(params,"%s %s %lg", param1, param2, &(A22Params_.DDIlutDropTol_)); if ( A22Params_.DDIlutDropTol_ < 0 ) A22Params_.DDIlutDropTol_ = 0; if (outputLevel_ > 0) printf("HYPRE_LSI_BlockP::A22PreconDDIlutDropTol\n"); } else if ( !strcmp(param2, "A11PreconMLThresh") ) { sscanf(params,"%s %s %lg", param1, param2, &(A11Params_.MLThresh_)); if ( A11Params_.MLThresh_ < 0 ) A11Params_.MLThresh_ = 0; if (outputLevel_ > 0) printf("HYPRE_LSI_BlockP::A11PreconMLThresh\n"); } else if ( !strcmp(param2, "A22PreconMLThresh") ) { sscanf(params,"%s %s %lg", param1, param2, &(A22Params_.MLThresh_)); if ( A22Params_.MLThresh_ < 0 ) A22Params_.MLThresh_ = 0; if (outputLevel_ > 0) printf("HYPRE_LSI_BlockP::A22PreconMLThresh\n"); } else if ( !strcmp(param2, "A11PreconMLNumSweeps") ) { sscanf(params,"%s %s %d", param1, param2, &(A11Params_.MLNSweeps_)); if ( A11Params_.MLNSweeps_ < 0 ) A11Params_.MLNSweeps_ = 0; if (outputLevel_ > 0) printf("HYPRE_LSI_BlockP::A11PreconMLNumSweeps\n"); } else if ( !strcmp(param2, "A22PreconMLNumSweeps") ) { sscanf(params,"%s %s %d", param1, param2, &(A22Params_.MLNSweeps_)); if ( A22Params_.MLNSweeps_ < 0 ) A22Params_.MLNSweeps_ = 0; if (outputLevel_ > 0) printf("HYPRE_LSI_BlockP::A22PreconMLNumSweeps\n"); } else if ( !strcmp(param2, "A11PreconMLIThresh") ) { sscanf(params,"%s %s %lg", param1, param2, &(A11Params_.MLIThresh_)); if ( A11Params_.MLIThresh_ < 0.0 ) A11Params_.MLIThresh_ = 0.0; if (outputLevel_ > 0) printf("HYPRE_LSI_BlockP::A11PreconMLIThresh\n"); } else if ( !strcmp(param2, "A22PreconMLIThresh") ) { sscanf(params,"%s %s %lg", param1, param2, &(A22Params_.MLIThresh_)); if ( A22Params_.MLIThresh_ < 0.0 ) A22Params_.MLIThresh_ = 0.0; if (outputLevel_ > 0) printf("HYPRE_LSI_BlockP::A22PreconMLIThresh\n"); } else if ( !strcmp(param2, "A11PreconMLIRelaxType") ) { sscanf(params,"%s %s %s", param1, param2, param3); if ( !strcmp(param3, "jacobi" ) ) A11Params_.MLIRelaxType_ = 0; else if ( !strcmp(param3, "gs") ) A11Params_.MLIRelaxType_ = 1; else if ( !strcmp(param3, "sgs") ) A11Params_.MLIRelaxType_ = 2; else if ( !strcmp(param3, "bsgs") ) A11Params_.MLIRelaxType_ = 3; else if ( !strcmp(param3, "parasails"))A11Params_.MLIRelaxType_ = 4; else A11Params_.MLIRelaxType_ = 2; if (outputLevel_ > 0) printf("HYPRE_LSI_BlockP::A11PreconMLIRelaxType\n"); } else if ( !strcmp(param2, "A22PreconMLIRelaxType") ) { sscanf(params,"%s %s %s", param1, param2, param3); if ( !strcmp(param3, "jacobi" ) ) A22Params_.MLIRelaxType_ = 0; else if ( !strcmp(param3, "gs") ) A22Params_.MLIRelaxType_ = 1; else if ( !strcmp(param3, "sgs") ) A22Params_.MLIRelaxType_ = 2; else if ( !strcmp(param3, "bsgs") ) A22Params_.MLIRelaxType_ = 3; else if ( !strcmp(param3, "parasails"))A22Params_.MLIRelaxType_ = 4; else A22Params_.MLIRelaxType_ = 2; if (outputLevel_ > 0) printf("HYPRE_LSI_BlockP::A22PreconMLIRelaxType\n"); } else if ( !strcmp(param2, "A11PreconMLINumSweeps") ) { sscanf(params,"%s %s %d", param1, param2, &(A11Params_.MLINSweeps_)); if ( A11Params_.MLINSweeps_ < 0 ) A11Params_.MLINSweeps_ = 0; if (outputLevel_ > 0) printf("HYPRE_LSI_BlockP::A11PreconMLINSweeps\n"); } else if ( !strcmp(param2, "A22PreconMLINumSweeps") ) { sscanf(params,"%s %s %d", param1, param2, &(A22Params_.MLINSweeps_)); if ( A22Params_.MLINSweeps_ < 0 ) A22Params_.MLINSweeps_ = 0; if (outputLevel_ > 0) printf("HYPRE_LSI_BlockP::A22PreconMLINSweeps\n"); } else if ( !strcmp(param2, "A11PreconMLIPweight") ) { sscanf(params,"%s %s %lg", param1, param2, &(A11Params_.MLIPweight_)); if ( A11Params_.MLIPweight_ < 0.0 ) A11Params_.MLIPweight_ = 0.0; if (outputLevel_ > 0) printf("HYPRE_LSI_BlockP::A11PreconMLIPweight\n"); } else if ( !strcmp(param2, "A22PreconMLIPweight") ) { sscanf(params,"%s %s %lg", param1, param2, &(A22Params_.MLIPweight_)); if ( A22Params_.MLIPweight_ < 0.0 ) A22Params_.MLIPweight_ = 0.0; if (outputLevel_ > 0) printf("HYPRE_LSI_BlockP::A22PreconMLIPweight\n"); } else if ( !strcmp(param2, "A11PreconMLINodeDOF") ) { sscanf(params,"%s %s %d", param1, param2, &(A11Params_.MLINodeDOF_)); if ( A11Params_.MLINodeDOF_ < 1 ) A11Params_.MLINodeDOF_ = 1; if (outputLevel_ > 0) printf("HYPRE_LSI_BlockP::A11PreconMLINodeDOF\n"); } else if ( !strcmp(param2, "A22PreconMLINodeDOF") ) { sscanf(params,"%s %s %d", param1, param2, &(A22Params_.MLINodeDOF_)); if ( A22Params_.MLINodeDOF_ < 1 ) A22Params_.MLINodeDOF_ = 1; if (outputLevel_ > 0) printf("HYPRE_LSI_BlockP::A22PreconMLINodeDOF\n"); } else if ( !strcmp(param2, "A11PreconMLINullDim") ) { sscanf(params,"%s %s %d", param1, param2, &(A11Params_.MLINullDim_)); if ( A11Params_.MLINullDim_ < 1 ) A11Params_.MLINullDim_ = 1; if (outputLevel_ > 0) printf("HYPRE_LSI_BlockP::A11PreconMLINullDim\n"); } else if ( !strcmp(param2, "A22PreconMLINullDim") ) { sscanf(params,"%s %s %d", param1, param2, &(A22Params_.MLINullDim_)); if ( A22Params_.MLINullDim_ < 1 ) A22Params_.MLINullDim_ = 1; if (outputLevel_ > 0) printf("HYPRE_LSI_BlockP::A22PreconMLINullDim\n"); } else { printf("HYPRE_LSI_BlockP:: string not recognized %s\n", params); } return 0; } //****************************************************************************** // set lookup object //------------------------------------------------------------------------------ int HYPRE_LSI_BlockP::setLookup(Lookup *object) { lookup_ = object; return 0; } //****************************************************************************** // set up routine //------------------------------------------------------------------------------ int HYPRE_LSI_BlockP::setup(HYPRE_ParCSRMatrix Amat) { int i, j, irow, checkZeros, mypid, nprocs, AStart, AEnd, ANRows; int rowSize, *colInd, searchInd, newRow, one=1, maxRowSize; int *colInd2, newRowSize, count, *newColInd, rowSize2; int MNRows, MStartRow, *MRowLengs, SNRows, SStartRow, *SRowLengs; int V1Leng, V1Start, V2Leng, V2Start; double dtemp, *colVal, *colVal2, *newColVal; char fname[100]; FILE *fp; MPI_Comm mpi_comm; HYPRE_IJMatrix Mmat, B22mat; HYPRE_ParCSRMatrix Cmat_csr, Mmat_csr, Smat_csr, A22mat_csr, B22mat_csr; HYPRE_ParCSRMatrix A11mat_csr; HYPRE_Solver parasails; //------------------------------------------------------------------ // diagnostics //------------------------------------------------------------------ if ( printFlag_ ) print(); //------------------------------------------------------------------ // build the blocks A11, A12, and the A22 block, if any //------------------------------------------------------------------ Mmat = NULL; Mmat_csr = NULL; B22mat = NULL; B22mat_csr = NULL; Cmat_csr = NULL; Smat_csr = NULL; A11mat_csr = NULL; A22mat_csr = NULL; Amat_ = Amat; computeBlockInfo(); buildBlocks(); //------------------------------------------------------------------ // If no approximate Schur complement needed, create zero matrix. // Extract the velocity mass matrix in HYPRE_ParCSRMatrix format : // the mass matrix comes either from user (lumpedMassDiag_) or // extracted from the diagonal of the A(1,1) matrix => mass_v //------------------------------------------------------------------ HYPRE_ParCSRMatrixGetComm( Amat_, &mpi_comm ); MPI_Comm_rank( mpi_comm, &mypid ); MPI_Comm_size( mpi_comm, &nprocs ); AStart = APartition_[mypid]; AEnd = APartition_[mypid+1] - 1; ANRows = AEnd - AStart + 1; if (lumpedMassScheme_ == 1) { HYPRE_ParaSailsCreate(mpi_comm, ¶sails); HYPRE_ParaSailsSetParams(parasails,lumpedMassThresh_, lumpedMassNlevels_); HYPRE_ParaSailsSetFilter(parasails, 0.1); HYPRE_ParaSailsSetLogging(parasails, 1); HYPRE_IJMatrixGetObject(A11mat_, (void **) &A11mat_csr); HYPRE_ParaSailsSetup(parasails, A11mat_csr, NULL, NULL); HYPRE_ParaSailsBuildIJMatrix(parasails, &Mmat); } else { if ( lumpedMassDiag_ != NULL ) { checkZeros = 1; for ( i = 0; i < lumpedMassLength_; i++ ) if ( lumpedMassDiag_[i] == 0.0 ) {checkZeros = 0; break;} } else checkZeros = 0; MNRows = ANRows - P22Size_; MStartRow = AStart - P22Offsets_[mypid]; MRowLengs = new int[MNRows]; for ( irow = 0; irow < MNRows; irow++ ) MRowLengs[irow] = 1; HYPRE_IJMatrixCreate(mpi_comm, MStartRow, MStartRow+MNRows-1, MStartRow, MStartRow+MNRows-1, &Mmat); HYPRE_IJMatrixSetObjectType(Mmat, HYPRE_PARCSR); HYPRE_IJMatrixSetRowSizes(Mmat, MRowLengs); HYPRE_IJMatrixInitialize(Mmat); delete [] MRowLengs; newRow = MStartRow; for ( irow = AStart; irow <= AEnd; irow++ ) { searchInd = hypre_BinarySearch(P22LocalInds_, irow, P22Size_); if ( searchInd < 0 ) { if ( checkZeros ) dtemp = lumpedMassDiag_[irow-AStart]; else { HYPRE_ParCSRMatrixGetRow(Amat_,irow,&rowSize,&colInd,&colVal); for ( j = 0; j < rowSize; j++ ) if ( colInd[j] == irow ) { dtemp = colVal[j]; break;} HYPRE_ParCSRMatrixRestoreRow(Amat_,irow,&rowSize,&colInd, &colVal); } dtemp = 1.0 / dtemp; if (scheme_ == HYPRE_INCFLOW_BDIAG) dtemp = 0.0; HYPRE_IJMatrixSetValues(Mmat, 1, &one, (const int *) &newRow, (const int *) &newRow, (const double *) &dtemp); newRow++; } } HYPRE_IJMatrixAssemble(Mmat); } HYPRE_IJMatrixGetObject(Mmat, (void **) &Mmat_csr); hypre_MatvecCommPkgCreate((hypre_ParCSRMatrix *) Mmat_csr); //------------------------------------------------------------------ // create Pressure Poisson matrix (S = C^T M^{-1} C) //------------------------------------------------------------------ if (outputLevel_ >= 1) printf("BlockPrecond setup: C^T M^{-1}C begins\n"); HYPRE_IJMatrixGetObject(A12mat_, (void **) &Cmat_csr); hypre_BoomerAMGBuildCoarseOperator((hypre_ParCSRMatrix *) Cmat_csr, (hypre_ParCSRMatrix *) Mmat_csr, (hypre_ParCSRMatrix *) Cmat_csr, (hypre_ParCSRMatrix **) &Smat_csr); if (outputLevel_ >= 1) printf("BlockPrecond setup: C^T M^{-1} C ends\n"); //------------------------------------------------------------------ // construct new A22 = A22 - S //------------------------------------------------------------------ if ( A22mat_ != NULL ) { B22mat = A22mat_; HYPRE_IJMatrixGetObject(B22mat, (void **) &B22mat_csr); } else B22mat = NULL; SNRows = P22Size_; SStartRow = P22Offsets_[mypid]; HYPRE_IJMatrixCreate(mpi_comm, SStartRow, SStartRow+SNRows-1, SStartRow, SStartRow+SNRows-1, &A22mat_); HYPRE_IJMatrixSetObjectType(A22mat_, HYPRE_PARCSR); SRowLengs = new int[SNRows]; maxRowSize = 0; for ( irow = SStartRow; irow < SStartRow+SNRows; irow++ ) { HYPRE_ParCSRMatrixGetRow(Smat_csr,irow,&rowSize,&colInd,NULL); newRowSize = rowSize; if ( B22mat != NULL ) { HYPRE_ParCSRMatrixGetRow(B22mat_csr,irow,&rowSize2,&colInd2,NULL); #if 1 //========================================== // extract the whole S //------------------------------------------ newRowSize += rowSize2; newColInd = new int[newRowSize]; for (j = 0; j < rowSize; j++) newColInd[j] = colInd[j]; for (j = 0; j < rowSize2; j++) newColInd[j+rowSize] = colInd2[j]; #else //========================================== // extract only the diagonal from S //------------------------------------------ //newRowSize++; //newColInd = new int[newRowSize]; //for (j = 0; j < rowSize; j++) // if (colInd[j] == irow) {newColInd[0] = colInd[j]; break;} //if (j == rowSize) printf("ERROR : diagonal of S not found.\n"); //for (j = 0; j < rowSize2; j++) newColInd[j+1] = colInd2[j]; //========================================== #endif hypre_qsort0(newColInd, 0, newRowSize-1); count = 0; for ( j = 1; j < newRowSize; j++ ) { if ( newColInd[j] != newColInd[count] ) { count++; newColInd[count] = newColInd[j]; } } if ( newRowSize > 0 ) count++; newRowSize = count; HYPRE_ParCSRMatrixRestoreRow(B22mat_csr,irow,&rowSize2,&colInd2,NULL); delete [] newColInd; } SRowLengs[irow-SStartRow] = newRowSize; maxRowSize = ( newRowSize > maxRowSize ) ? newRowSize : maxRowSize; HYPRE_ParCSRMatrixRestoreRow(Smat_csr,irow,&rowSize,&colInd,NULL); } HYPRE_IJMatrixSetRowSizes(A22mat_, SRowLengs); HYPRE_IJMatrixInitialize(A22mat_); delete [] SRowLengs; for ( irow = SStartRow; irow < SStartRow+SNRows; irow++ ) { HYPRE_ParCSRMatrixGetRow(Smat_csr,irow,&rowSize,&colInd,&colVal); if ( B22mat == NULL ) { #if 1 //========================================== // extract the whole S //------------------------------------------ newRowSize = rowSize; newColInd = new int[newRowSize]; newColVal = new double[newRowSize]; for (j = 0; j < rowSize; j++) { newColInd[j] = colInd[j]; newColVal[j] = - colVal[j]; } #else //========================================== // extract only the diagonal from S //------------------------------------------ //newRowSize = 1; //newColInd = new int[newRowSize]; //newColVal = new double[newRowSize]; //for (j = 0; j < rowSize; j++) //{ // if (colInd[j] == irow) // { // newColInd[0] = colInd[j]; // newColVal[0] = - colVal[j]; // break; // } //} //if (j == rowSize) printf("ERROR : diagonal of S not found.\n"); //========================================== #endif } else { HYPRE_ParCSRMatrixGetRow(B22mat_csr,irow,&rowSize2,&colInd2,&colVal2); #if 1 //========================================== // extract the whole S //------------------------------------------ newRowSize = rowSize + rowSize2; newColInd = new int[newRowSize]; newColVal = new double[newRowSize]; for (j = 0; j < rowSize; j++) { newColInd[j] = colInd[j]; newColVal[j] = - colVal[j]; } for (j = 0; j < rowSize2; j++) { newColInd[j+rowSize] = colInd2[j]; newColVal[j+rowSize] = colVal2[j]; } #else //========================================== // extract only the diagonal from S //------------------------------------------ //newRowSize = rowSize2 + 1; //newColInd = new int[newRowSize]; //newColVal = new double[newRowSize]; //for (j = 0; j < rowSize; j++) //{ // if (colInd[j] == irow) // { // newColInd[0] = colInd[j]; // newColVal[0] = - colVal[j] * 1000; // break; // } //} //if (j == rowSize) printf("ERROR : diagonal of S not found.\n"); //for (j = 0; j < rowSize2; j++) //{ // newColInd[j+1] = colInd2[j]; // newColVal[j+1] = colVal2[j]; //} #endif hypre_qsort1(newColInd, newColVal, 0, newRowSize-1); count = 0; for ( j = 1; j < newRowSize; j++ ) { if ( newColInd[j] != newColInd[count] ) { count++; newColInd[count] = newColInd[j]; newColVal[count] = newColVal[j]; } else newColVal[count] += newColVal[j]; } if ( newRowSize > 0 ) count++; newRowSize = count; HYPRE_ParCSRMatrixRestoreRow(B22mat_csr,irow,&rowSize2, &colInd2,&colVal2); } HYPRE_IJMatrixSetValues(A22mat_, 1, &newRowSize, (const int *) &irow, (const int *) newColInd, (const double *) newColVal); HYPRE_ParCSRMatrixRestoreRow(Smat_csr,irow,&rowSize,&colInd,&colVal); delete [] newColInd; delete [] newColVal; } HYPRE_IJMatrixAssemble(A22mat_); HYPRE_IJMatrixGetObject(A22mat_, (void **) &A22mat_csr); if ( B22mat != NULL ) HYPRE_IJMatrixDestroy(B22mat); if ( Mmat != NULL ) HYPRE_IJMatrixDestroy(Mmat); if ( Smat_csr != NULL ) HYPRE_ParCSRMatrixDestroy(Smat_csr); if ( outputLevel_ > 2 && A22mat_csr != NULL ) { sprintf( fname, "A22.%d", mypid); fp = fopen( fname, "w" ); for ( irow = SStartRow; irow < SStartRow+SNRows; irow++ ) { HYPRE_ParCSRMatrixGetRow(A22mat_csr,irow,&rowSize,&colInd,&colVal); for ( j = 0; j < rowSize; j++ ) fprintf(fp," %9d %9d %25.16e\n", irow+1, colInd[j]+1, colVal[j]); HYPRE_ParCSRMatrixRestoreRow(A22mat_csr,irow,&rowSize,&colInd,&colVal); } fclose(fp); } //------------------------------------------------------------------ // build temporary vectors for solution steps //------------------------------------------------------------------ V1Leng = ANRows - P22Size_; V1Start = AStart - P22Offsets_[mypid]; HYPRE_IJVectorCreate(mpi_comm, V1Start, V1Start+V1Leng-1, &F1vec_); HYPRE_IJVectorSetObjectType(F1vec_, HYPRE_PARCSR); HYPRE_IJVectorInitialize(F1vec_); HYPRE_IJVectorAssemble(F1vec_); HYPRE_IJVectorCreate(mpi_comm, V1Start, V1Start+V1Leng-1, &X1vec_); HYPRE_IJVectorSetObjectType(X1vec_, HYPRE_PARCSR); HYPRE_IJVectorInitialize(X1vec_); HYPRE_IJVectorAssemble(X1vec_); if ( scheme_ == HYPRE_INCFLOW_BLU ) { HYPRE_IJVectorCreate(mpi_comm, V1Start, V1Start+V1Leng-1, &X1aux_); HYPRE_IJVectorSetObjectType(X1aux_, HYPRE_PARCSR); HYPRE_IJVectorInitialize(X1aux_); HYPRE_IJVectorAssemble(X1aux_); } V2Leng = P22Size_; V2Start = P22Offsets_[mypid]; HYPRE_IJVectorCreate(mpi_comm, V2Start, V2Start+V2Leng-1, &F2vec_); HYPRE_IJVectorSetObjectType(F2vec_, HYPRE_PARCSR); HYPRE_IJVectorInitialize(F2vec_); HYPRE_IJVectorAssemble(F2vec_); HYPRE_IJVectorCreate(mpi_comm, V2Start, V2Start+V2Leng-1, &X2vec_); HYPRE_IJVectorSetObjectType(X2vec_, HYPRE_PARCSR); HYPRE_IJVectorInitialize(X2vec_); HYPRE_IJVectorAssemble(X2vec_); assembled_ = 1; //------------------------------------------------------------------ // setup solvers and preconditioners //------------------------------------------------------------------ destroySolverPrecond(); setupPrecon(&A11Precond_, A11mat_, A11Params_); setupSolver(&A11Solver_, A11mat_, F1vec_, X1vec_, A11Precond_, A11Params_); setupPrecon(&A22Precond_, A22mat_, A22Params_); setupSolver(&A22Solver_, A22mat_, F2vec_, X2vec_, A22Precond_, A22Params_); return 0; } //****************************************************************************** // solve //------------------------------------------------------------------------------ int HYPRE_LSI_BlockP::solve(HYPRE_ParVector fvec, HYPRE_ParVector xvec) { int AStart, AEnd, irow, searchInd; int mypid, nprocs, V1Start, V2Start, V1Cnt, V2Cnt; double *fvals, *xvals, ddata; MPI_Comm mpi_comm; //------------------------------------------------------------------ // check for errors //------------------------------------------------------------------ if ( assembled_ != 1 ) { printf("BlockPrecond Solve ERROR : not assembled yet.\n"); exit(1); } //------------------------------------------------------------------ // extract matrix and machine information //------------------------------------------------------------------ HYPRE_ParCSRMatrixGetComm( Amat_, &mpi_comm ); MPI_Comm_rank( mpi_comm, &mypid ); MPI_Comm_size( mpi_comm, &nprocs ); AStart = APartition_[mypid]; AEnd = APartition_[mypid+1]; //------------------------------------------------------------------ // extract subvectors for the right hand side //------------------------------------------------------------------ V1Start = AStart - P22Offsets_[mypid]; V2Start = P22Offsets_[mypid]; fvals = hypre_VectorData(hypre_ParVectorLocalVector((hypre_ParVector*)fvec)); V1Cnt = V1Start; V2Cnt = V2Start; for ( irow = AStart; irow < AEnd; irow++ ) { searchInd = hypre_BinarySearch( P22LocalInds_, irow, P22Size_); if ( searchInd >= 0 ) { ddata = fvals[irow-AStart]; HYPRE_IJVectorSetValues(F2vec_, 1, (const int *) &V2Cnt, (const double *) &ddata); V2Cnt++; } else { HYPRE_IJVectorSetValues(F1vec_, 1, (const int *) &V1Cnt, (const double *) &fvals[irow-AStart]); V1Cnt++; } } //------------------------------------------------------------------ // solve them according to the requested scheme //------------------------------------------------------------------ if ( A11Params_.SolverID_ == 0 ) HYPRE_ParCSRPCGSetTol( A11Solver_, A11Params_.Tol_ ); else if ( A11Params_.SolverID_ == 1 ) HYPRE_ParCSRGMRESSetTol( A11Solver_, A11Params_.Tol_); else if ( A11Params_.SolverID_ == 2 ) HYPRE_BoomerAMGSetTol( A11Solver_, A11Params_.Tol_); switch (scheme_) { case HYPRE_INCFLOW_BDIAG : solveBDSolve(X1vec_, X2vec_, F1vec_, F2vec_); break; case HYPRE_INCFLOW_SDIAG : solveBDSolve(X1vec_, X2vec_, F1vec_, F2vec_); break; case HYPRE_INCFLOW_BTRI : solveBTSolve(X1vec_, X2vec_, F1vec_, F2vec_); break; case HYPRE_INCFLOW_BLU : solveBLUSolve(X1vec_, X2vec_, F1vec_, F2vec_); break; default : printf("HYPRE_LSI_BlockP ERROR : scheme not recognized.\n"); exit(1); } //------------------------------------------------------------------ // put the solution back to xvec //------------------------------------------------------------------ V1Cnt = V1Start; V2Cnt = V2Start; xvals = hypre_VectorData(hypre_ParVectorLocalVector((hypre_ParVector*)xvec)); for ( irow = AStart; irow < AEnd; irow++ ) { searchInd = hypre_BinarySearch( P22LocalInds_, irow, P22Size_); if ( searchInd >= 0 ) { HYPRE_IJVectorGetValues(X2vec_, 1, &V2Cnt, &xvals[irow-AStart]); V2Cnt++; } else { HYPRE_IJVectorGetValues(X1vec_, 1, &V1Cnt, &xvals[irow-AStart]); V1Cnt++; } } return 0; } //****************************************************************************** // print parameter settings //------------------------------------------------------------------------------ int HYPRE_LSI_BlockP::print() { int mypid; MPI_Comm mpi_comm; if ( Amat_ != NULL ) { HYPRE_ParCSRMatrixGetComm( Amat_, &mpi_comm ); MPI_Comm_rank( mpi_comm, &mypid ); } else mypid = 0; if ( mypid == 0 ) { printf("*****************************************************\n"); printf("***********HYPRE_LSI_BlockP Information**************\n"); switch ( A11Params_.SolverID_ ) { case 0 : printf("* A11 solver = cg\n"); break; case 1 : printf("* A11 solver = gmres\n"); break; } switch ( A11Params_.PrecondID_ ) { case 1 : printf("* A11 preconditioner = diagonal\n"); break; case 2 : printf("* A11 preconditioner = parasails\n"); break; case 3 : printf("* A11 preconditioner = boomeramg\n"); break; case 4 : printf("* A11 preconditioner = pilut\n"); break; case 5 : printf("* A11 preconditioner = euclid\n"); break; case 6 : printf("* A11 preconditioner = ddilut\n"); break; case 7 : printf("* A11 preconditioner = ml\n"); break; case 8 : printf("* A11 preconditioner = ml\n"); break; } printf("* A11 solver tol = %e\n", A11Params_.Tol_); printf("* A11 solver maxiter = %d\n", A11Params_.MaxIter_); printf("* A11 ParaSails Nlevels = %d\n", A11Params_.PSNLevels_); printf("* A11 ParaSails thresh = %e\n", A11Params_.PSThresh_); printf("* A11 ParaSails filter = %e\n", A11Params_.PSFilter_); printf("* A11 BoomerAMG thresh = %e\n", A11Params_.AMGThresh_); printf("* A11 BoomerAMG nsweeps = %d\n", A11Params_.AMGNSweeps_); printf("* A11 Pilut Fill-in = %d\n", A11Params_.PilutFillin_); printf("* A11 Pilut Drop Tol = %e\n", A11Params_.PilutDropTol_); printf("* A11 Euclid NLevels = %d\n", A11Params_.EuclidNLevels_); printf("* A11 Euclid threshold = %e\n", A11Params_.EuclidThresh_); printf("* A11 DDIlut Fill-in = %e\n", A11Params_.DDIlutFillin_); printf("* A11 DDIlut Drop Tol = %e\n", A11Params_.DDIlutDropTol_); printf("* A11 ML threshold = %e\n", A11Params_.MLThresh_); printf("* A11 ML nsweeps = %d\n", A11Params_.MLNSweeps_); printf("* A11 MLI threshold = %e\n", A11Params_.MLIThresh_); printf("* A11 MLI nsweeps = %d\n", A11Params_.MLINSweeps_); printf("* A11 MLI Pweight = %e\n", A11Params_.MLIPweight_); printf("* A11 MLI nodeDOF = %d\n", A11Params_.MLINodeDOF_); printf("* A11 MLI Null Dim = %d\n", A11Params_.MLINullDim_); switch ( A22Params_.SolverID_ ) { case 0 : printf("* A22 solver = cg\n"); break; case 1 : printf("* A22 solver = gmres\n"); break; } switch ( A22Params_.PrecondID_ ) { case 1 : printf("* A22 preconditioner = diagonal\n"); break; case 2 : printf("* A22 preconditioner = parasails\n"); break; case 3 : printf("* A22 preconditioner = boomeramg\n"); break; case 4 : printf("* A22 preconditioner = pilut\n"); break; case 5 : printf("* A22 preconditioner = euclid\n"); break; case 6 : printf("* A22 preconditioner = ddilut\n"); break; case 7 : printf("* A22 preconditioner = ml\n"); break; case 8 : printf("* A22 preconditioner = mli\n"); break; case 9 : printf("* A22 preconditioner = identity\n"); break; } printf("* A22 solver tol = %e\n", A22Params_.Tol_); printf("* A22 solver maxiter = %d\n", A22Params_.MaxIter_); printf("* A22 ParaSails Nlevels = %d\n", A22Params_.PSNLevels_); printf("* A22 ParaSails thresh = %e\n", A22Params_.PSThresh_); printf("* A22 ParaSails filter = %e\n", A22Params_.PSFilter_); printf("* A22 BoomerAMG thresh = %e\n", A22Params_.AMGThresh_); printf("* A22 BoomerAMG nsweeps = %d\n", A22Params_.AMGNSweeps_); printf("* A22 Pilut Fill-in = %d\n", A22Params_.PilutFillin_); printf("* A22 Pilut Drop Tol = %e\n", A22Params_.PilutDropTol_); printf("* A22 Euclid NLevels = %d\n", A22Params_.EuclidNLevels_); printf("* A22 Euclid threshold = %e\n", A22Params_.EuclidThresh_); printf("* A22 DDIlut Fill-in = %e\n", A22Params_.DDIlutFillin_); printf("* A22 DDIlut Drop Tol = %e\n", A22Params_.DDIlutDropTol_); printf("* A22 ML threshold = %e\n", A22Params_.MLThresh_); printf("* A22 ML nsweeps = %d\n", A22Params_.MLNSweeps_); printf("* A22 MLI threshold = %e\n", A22Params_.MLIThresh_); printf("* A22 MLI nsweeps = %d\n", A22Params_.MLINSweeps_); printf("* A22 MLI Pweight = %e\n", A22Params_.MLIPweight_); printf("* A22 MLI nodeDOF = %d\n", A22Params_.MLINodeDOF_); printf("* A22 MLI Null Dim = %d\n", A22Params_.MLINullDim_); printf("*****************************************************\n"); } return 0; } //****************************************************************************** // load mass matrix for pressure //------------------------------------------------------------------------------ int HYPRE_LSI_BlockP::destroySolverPrecond() { if ( A11Solver_ != NULL ) { if (A11Params_.SolverID_ == 0) HYPRE_ParCSRPCGDestroy(A11Solver_); else if (A11Params_.SolverID_ == 1) HYPRE_ParCSRGMRESDestroy(A11Solver_); else if (A11Params_.SolverID_ == 2) HYPRE_BoomerAMGDestroy(A11Solver_); } if ( A22Solver_ != NULL ) { if (A22Params_.SolverID_ == 0) HYPRE_ParCSRPCGDestroy(A22Solver_); else if (A22Params_.SolverID_ == 1) HYPRE_ParCSRGMRESDestroy(A22Solver_); else if (A22Params_.SolverID_ == 2) HYPRE_BoomerAMGDestroy(A22Solver_); } if ( A11Precond_ != NULL ) { if (A11Params_.PrecondID_ == 2) HYPRE_ParCSRParaSailsDestroy(A11Precond_); else if (A11Params_.PrecondID_ == 3) HYPRE_BoomerAMGDestroy(A11Precond_); else if (A11Params_.PrecondID_ == 4) HYPRE_ParCSRPilutDestroy(A11Precond_); else if (A11Params_.PrecondID_ == 5) HYPRE_EuclidDestroy(A11Precond_); else if (A11Params_.PrecondID_ == 6) HYPRE_LSI_DDIlutDestroy(A11Precond_); #ifdef HAVE_ML else if (A11Params_.PrecondID_ == 7) HYPRE_LSI_MLDestroy(A11Precond_); #endif #ifdef HAVE_MLI else if (A11Params_.PrecondID_ == 8) HYPRE_LSI_MLIDestroy(A11Precond_); #endif } if ( A22Precond_ != NULL ) { if (A22Params_.PrecondID_ == 2) HYPRE_ParCSRParaSailsDestroy(A22Precond_); else if (A22Params_.PrecondID_ == 3) HYPRE_BoomerAMGDestroy(A22Precond_); else if (A22Params_.PrecondID_ == 4) HYPRE_ParCSRPilutDestroy(A22Precond_); else if (A22Params_.PrecondID_ == 5) HYPRE_EuclidDestroy(A22Precond_); else if (A22Params_.PrecondID_ == 6) HYPRE_LSI_DDIlutDestroy(A22Precond_); #ifdef HAVE_ML else if (A22Params_.PrecondID_ == 7) HYPRE_LSI_MLDestroy(A22Precond_); #endif #ifdef HAVE_MLI else if (A22Params_.PrecondID_ == 8) HYPRE_LSI_MLIDestroy(A22Precond_); #endif } A11Solver_ = NULL; A22Solver_ = NULL; A11Precond_ = NULL; A22Precond_ = NULL; return 0; } //****************************************************************************** // Given a matrix A, compute the sizes and indices of the 2 x 2 blocks // (P22Size_,P22GSize_,P22LocalInds_,P22GlobalInds_,P22Offsets_,APartition_) //------------------------------------------------------------------------------ int HYPRE_LSI_BlockP::computeBlockInfo() { int mypid, nprocs, start_row, end_row, irow, nblks, *elem_blk_ids; int j, row_size, *col_ind, *disp_array, interleave, lumping, elemDOF; int field_id, jcol, zero_diag, nElems, nNodes, nEqns; double *col_val; MPI_Comm mpi_comm; //------------------------------------------------------------------ // check that the system matrix has been set, clean up previous // allocations, and extract matrix information //------------------------------------------------------------------ if ( Amat_ == NULL ) { printf("BlockPrecond ERROR : Amat not initialized.\n"); exit(1); } if ( APartition_ != NULL ) free( APartition_ ); if ( P22LocalInds_ != NULL ) delete [] P22LocalInds_; if ( P22GlobalInds_ != NULL ) delete [] P22GlobalInds_; if ( P22Offsets_ != NULL ) delete [] P22Offsets_; APartition_ = NULL; P22LocalInds_ = NULL; P22GlobalInds_ = NULL; P22Offsets_ = NULL; assembled_ = 0; HYPRE_ParCSRMatrixGetRowPartitioning( Amat_, &APartition_ ); HYPRE_ParCSRMatrixGetComm( Amat_, &mpi_comm ); MPI_Comm_rank( mpi_comm, &mypid ); MPI_Comm_size( mpi_comm, &nprocs ); start_row = APartition_[mypid]; end_row = APartition_[mypid+1] - 1; //------------------------------------------------------------------ // find the local size of the (2,2) block //------------------------------------------------------------------ P22Size_ = 0; if ( block1FieldID_ == -3 && block2FieldID_ == -3 ) { for ( irow = end_row; irow >= start_row; irow-- ) { HYPRE_ParCSRMatrixGetRow(Amat_,irow,&row_size,&col_ind,&col_val); zero_diag = 1; for ( jcol = 0; jcol < row_size; jcol++ ) { if ( col_ind[jcol] == irow && col_val[jcol] != 0.0 ) { zero_diag = 0; break; } } HYPRE_ParCSRMatrixRestoreRow(Amat_,irow,&row_size,&col_ind,&col_val); if ( zero_diag ) P22Size_++; else break; } } else if ( block1FieldID_ == -7 ) { nblks = lookup_->getNumElemBlocks(); elem_blk_ids = (int *) lookup_->getElemBlockIDs(); P22Size_ = 0; for ( irow = 0; irow < nblks; irow++ ) { lookup_->getElemBlockInfo(elem_blk_ids[irow], interleave, lumping, elemDOF, nElems, nNodes, nEqns); P22Size_ += nElems; } } else { for ( irow = start_row; irow <= end_row; irow++ ) { field_id = lookup_->getAssociatedFieldID(irow); if (block2FieldID_ >= 0 && field_id == block2FieldID_) P22Size_++; else if (block2FieldID_ < 0 && field_id != block1FieldID_) P22Size_++; } } if ( outputLevel_ > 0 ) { printf("%4d computeBlockInfo : P22_size = %d\n", mypid, P22Size_); } //------------------------------------------------------------------ // allocate array for storing indices of (2,2) block variables //------------------------------------------------------------------ if ( P22Size_ > 0 ) P22LocalInds_ = new int[P22Size_]; else P22LocalInds_ = NULL; //------------------------------------------------------------------ // compose a local list of rows for the (2,2) block //------------------------------------------------------------------ if ( block1FieldID_ == -3 && block2FieldID_ == -3 ) { for ( irow = end_row-P22Size_+1; irow <= end_row; irow++ ) P22LocalInds_[irow-end_row+P22Size_-1] = irow; } else if ( block1FieldID_ == -7 ) { for ( irow = end_row-P22Size_+1; irow <= end_row; irow++ ) P22LocalInds_[irow-end_row+P22Size_-1] = irow; } else { P22Size_ = 0; for ( irow = start_row; irow <= end_row; irow++ ) { field_id = lookup_->getAssociatedFieldID(irow); if ( block2FieldID_ >= 0 && field_id == block2FieldID_ ) P22LocalInds_[P22Size_++] = irow; else if ( block2FieldID_ < 0 && field_id != block1FieldID_ ) P22LocalInds_[P22Size_++] = irow; } } //------------------------------------------------------------------ // compose a global list of rows for the (2,2) block //------------------------------------------------------------------ MPI_Allreduce(&P22Size_, &P22GSize_, 1, MPI_INT, MPI_SUM, mpi_comm); if (outputLevel_ > 0) { if ( P22GSize_ == 0 && mypid == 0 ) printf("computeBlockInfo WARNING : P22Size = 0 on all processors.\n"); } if ( P22GSize_ == 0 ) { if ( APartition_ != NULL ) free( APartition_ ); APartition_ = NULL; return 1; } if ( P22GSize_ > 0 ) P22GlobalInds_ = new int[P22GSize_]; else P22GlobalInds_ = NULL; disp_array = new int[nprocs]; P22Offsets_ = new int[nprocs]; MPI_Allgather(&P22Size_, 1, MPI_INT, P22Offsets_, 1, MPI_INT, mpi_comm); disp_array[0] = 0; for ( j = 1; j < nprocs; j++ ) disp_array[j] = disp_array[j-1] + P22Offsets_[j-1]; MPI_Allgatherv(P22LocalInds_, P22Size_, MPI_INT, P22GlobalInds_, P22Offsets_, disp_array, MPI_INT, mpi_comm); delete [] P22Offsets_; P22Offsets_ = disp_array; if ( outputLevel_ > 2 ) { for ( j = 0; j < P22Size_; j++ ) printf("%4d computeBlockInfo : P22Inds %8d = %d\n", mypid, j, P22LocalInds_[j]); } return 0; } //****************************************************************************** // Given a matrix A, build the 2 x 2 blocks // (This function is to be called after computeBlockInfo //------------------------------------------------------------------------------ int HYPRE_LSI_BlockP::buildBlocks() { int mypid, nprocs, *partition, index, searchInd; int ANRows, AGNRows, AStartRow; int A11NRows, A11NCols, A11GNRows, A11GNCols, A11StartRow, A11StartCol; int A12NRows, A12NCols, A12GNRows, A12GNCols, A12StartRow, A12StartCol; int A22NRows, A22NCols, A22GNRows, A22GNCols, A22StartRow, A22StartCol; int *A11RowLengs, A11MaxRowLeng, A11RowCnt, A11NewSize, *A11_inds; int *A12RowLengs, A12MaxRowLeng, A12RowCnt, A12NewSize, *A12_inds; int *A22RowLengs, A22MaxRowLeng, A22RowCnt, A22NewSize, *A22_inds; int irow, j, rowSize, *inds; double *vals, *A11_vals, *A12_vals, *A22_vals; char fname[200]; FILE *fp; MPI_Comm mpi_comm; HYPRE_ParCSRMatrix A11mat_csr, A22mat_csr, A12mat_csr; //------------------------------------------------------------------ // extract information about the system matrix //------------------------------------------------------------------ HYPRE_ParCSRMatrixGetRowPartitioning( Amat_, &partition ); HYPRE_ParCSRMatrixGetComm( Amat_, &mpi_comm ); MPI_Comm_rank( mpi_comm, &mypid ); MPI_Comm_size( mpi_comm, &nprocs ); AStartRow = partition[mypid]; ANRows = partition[mypid+1] - AStartRow; AGNRows = partition[nprocs]; //------------------------------------------------------------------ // calculate the dimensions of the 2 x 2 blocks //------------------------------------------------------------------ A11NRows = ANRows - P22Size_; A11NCols = A11NRows; A11GNRows = AGNRows - P22GSize_; A11GNCols = A11GNRows; A11StartRow = AStartRow - P22Offsets_[mypid]; A11StartCol = A11StartRow; A12NRows = ANRows - P22Size_; A12NCols = P22Size_; A12GNRows = AGNRows - P22GSize_; A12GNCols = P22GSize_; A12StartRow = AStartRow - P22Offsets_[mypid]; A12StartCol = P22Offsets_[mypid]; A22NRows = P22Size_; A22NCols = P22Size_; A22GNRows = P22GSize_; A22GNCols = P22GSize_; A22StartRow = P22Offsets_[mypid]; A22StartCol = P22Offsets_[mypid]; if ( outputLevel_ >= 1 ) { printf("%4d buildBlock (1,1) : StartRow = %d\n", mypid, A11StartRow); printf("%4d buildBlock (1,1) : GlobalDim = %d %d\n", mypid, A11GNRows, A11GNCols); printf("%4d buildBlock (1,1) : LocalDim = %d %d\n", mypid, A11NRows, A11NCols); printf("%4d buildBlock (1,2) : StartRow = %d\n", mypid, A12StartRow); printf("%4d buildBlock (1,2) : GlobalDim = %d %d\n", mypid, A12GNRows, A12GNCols); printf("%4d buildBlock (1,2) : LocalDim = %d %d\n", mypid, A12NRows, A12NCols); printf("%4d buildBlock (2,2) : StartRow = %d\n", mypid, A22StartRow); printf("%4d buildBlock (2,2) : GlobalDim = %d %d\n", mypid, A22GNRows, A22GNCols); printf("%4d buildBlock (2,2) : LocalDim = %d %d\n", mypid, A22NRows, A22NCols); } //------------------------------------------------------------------ // figure the row sizes of the block matrices //------------------------------------------------------------------ A11RowLengs = new int[A11NRows]; A12RowLengs = new int[A12NRows]; A22RowLengs = new int[A22NRows]; A11MaxRowLeng = 0; A12MaxRowLeng = 0; A22MaxRowLeng = 0; A11RowCnt = 0; A12RowCnt = 0; A22RowCnt = 0; for ( irow = AStartRow; irow < AStartRow+ANRows; irow++ ) { HYPRE_ParCSRMatrixGetRow(Amat_, irow, &rowSize, &inds, &vals); searchInd = hypre_BinarySearch(P22LocalInds_, irow, P22Size_); if ( searchInd < 0 ) // A(1,1) or A(1,2) block { A11NewSize = A12NewSize = 0; for ( j = 0; j < rowSize; j++ ) { index = inds[j]; searchInd = hypre_BinarySearch(P22GlobalInds_,index,P22GSize_); if (searchInd >= 0) A12NewSize++; else A11NewSize++; } if ( A11NewSize <= 0 ) A11NewSize = 1; if ( A12NewSize <= 0 ) A12NewSize = 1; A11RowLengs[A11RowCnt++] = A11NewSize; A12RowLengs[A12RowCnt++] = A12NewSize; A11MaxRowLeng = (A11NewSize > A11MaxRowLeng) ? A11NewSize : A11MaxRowLeng; A12MaxRowLeng = (A12NewSize > A12MaxRowLeng) ? A12NewSize : A12MaxRowLeng; } else // A(2,2) block { A22NewSize = 0; for ( j = 0; j < rowSize; j++ ) { index = inds[j]; searchInd = hypre_BinarySearch(P22GlobalInds_,index,P22GSize_); if (searchInd >= 0) A22NewSize++; } A22RowLengs[A22RowCnt++] = A22NewSize; A22MaxRowLeng = (A22NewSize > A22MaxRowLeng) ? A22NewSize : A22MaxRowLeng; } HYPRE_ParCSRMatrixRestoreRow(Amat_, irow, &rowSize, &inds, &vals); } //------------------------------------------------------------------ // create matrix contexts for the blocks //------------------------------------------------------------------ HYPRE_IJMatrixCreate(mpi_comm, A11StartRow, A11StartRow+A11NRows-1, A11StartCol, A11StartCol+A11NCols-1, &A11mat_); HYPRE_IJMatrixSetObjectType(A11mat_, HYPRE_PARCSR); HYPRE_IJMatrixSetRowSizes(A11mat_, A11RowLengs); HYPRE_IJMatrixInitialize(A11mat_); delete [] A11RowLengs; HYPRE_IJMatrixCreate(mpi_comm, A12StartRow, A12StartRow+A12NRows-1, A12StartCol, A12StartCol+A12NCols-1, &A12mat_); HYPRE_IJMatrixSetObjectType(A12mat_, HYPRE_PARCSR); HYPRE_IJMatrixSetRowSizes(A12mat_, A12RowLengs); HYPRE_IJMatrixInitialize(A12mat_); delete [] A12RowLengs; if ( A22MaxRowLeng > 0 ) { HYPRE_IJMatrixCreate(mpi_comm,A22StartRow,A22StartRow+A22NRows-1, A22StartCol, A22StartCol+A22NCols-1, &A22mat_); HYPRE_IJMatrixSetObjectType(A22mat_, HYPRE_PARCSR); HYPRE_IJMatrixSetRowSizes(A22mat_, A22RowLengs); HYPRE_IJMatrixInitialize(A22mat_); } else A22mat_ = NULL; delete [] A22RowLengs; //------------------------------------------------------------------ // load the matrices extracted from A //------------------------------------------------------------------ A11_inds = new int[A11MaxRowLeng+1]; A11_vals = new double[A11MaxRowLeng+1]; A12_inds = new int[A12MaxRowLeng+1]; A12_vals = new double[A12MaxRowLeng+1]; A22_inds = new int[A22MaxRowLeng+1]; A22_vals = new double[A22MaxRowLeng+1]; A11RowCnt = A11StartRow; A12RowCnt = A12StartRow; A22RowCnt = A22StartRow; for ( irow = AStartRow; irow < AStartRow+ANRows; irow++ ) { HYPRE_ParCSRMatrixGetRow(Amat_, irow, &rowSize, &inds, &vals); searchInd = hypre_BinarySearch(P22LocalInds_, irow, P22Size_); if ( searchInd < 0 ) // A(1,1) or A(1,2) block { A11NewSize = A12NewSize = 0; for ( j = 0; j < rowSize; j++ ) { index = inds[j]; searchInd = HYPRE_LSI_Search(P22GlobalInds_,index,P22GSize_); if (searchInd >= 0) // A(1,2) block { A12_inds[A12NewSize] = searchInd; A12_vals[A12NewSize++] = vals[j]; } else { searchInd = - searchInd - 1; A11_inds[A11NewSize] = index - searchInd; A11_vals[A11NewSize++] = vals[j]; } } if ( A11NewSize == 0 ) { A11_inds[0] = AStartRow - P22Offsets_[mypid]; A11_vals[0] = 0.0; A11NewSize = 1; } if ( A12NewSize == 0 ) { A12_inds[0] = P22Offsets_[mypid]; A12_vals[0] = 0.0; A12NewSize = 1; } HYPRE_IJMatrixSetValues(A11mat_, 1, &A11NewSize, (const int *) &A11RowCnt, (const int *) A11_inds, (const double *) A11_vals); HYPRE_IJMatrixSetValues(A12mat_, 1, &A12NewSize, (const int *) &A12RowCnt, (const int *) A12_inds, (const double *) A12_vals); A11RowCnt++; A12RowCnt++; } else if ( A22MaxRowLeng > 0 ) // A(2,2) block { A22NewSize = 0; for ( j = 0; j < rowSize; j++ ) { index = inds[j]; searchInd = hypre_BinarySearch(P22GlobalInds_,index,P22GSize_); if (searchInd >= 0) { A22_inds[A22NewSize] = searchInd; A22_vals[A22NewSize++] = vals[j]; } } if ( A22NewSize == 0 ) { A22_inds[0] = P22Offsets_[mypid]; A22_vals[0] = 0.0; A22NewSize = 1; } HYPRE_IJMatrixSetValues(A22mat_, 1, &A22NewSize, (const int *) &A22RowCnt, (const int *) A22_inds, (const double *) A22_vals); A22RowCnt++; } HYPRE_ParCSRMatrixRestoreRow(Amat_, irow, &rowSize, &inds, &vals); } delete [] A11_inds; delete [] A11_vals; delete [] A12_inds; delete [] A12_vals; delete [] A22_inds; delete [] A22_vals; //------------------------------------------------------------------ // finally assemble the matrix //------------------------------------------------------------------ HYPRE_IJMatrixAssemble(A11mat_); HYPRE_IJMatrixGetObject(A11mat_, (void **) &A11mat_csr); hypre_MatvecCommPkgCreate((hypre_ParCSRMatrix *) A11mat_csr); HYPRE_IJMatrixAssemble(A12mat_); HYPRE_IJMatrixGetObject(A12mat_, (void **) &A12mat_csr); hypre_MatvecCommPkgCreate((hypre_ParCSRMatrix *) A12mat_csr); if ( A22mat_ != NULL ) { HYPRE_IJMatrixAssemble(A22mat_); HYPRE_IJMatrixGetObject(A22mat_, (void **) &A22mat_csr); hypre_MatvecCommPkgCreate((hypre_ParCSRMatrix *) A22mat_csr); } else A22mat_csr = NULL; free( partition ); if ( outputLevel_ >= 3 ) { sprintf( fname, "A11.%d", mypid); fp = fopen( fname, "w" ); for ( irow = A11StartRow; irow < A11StartRow+A11NRows; irow++ ) { HYPRE_ParCSRMatrixGetRow(A11mat_csr,irow,&rowSize,&inds,&vals); for ( j = 0; j < rowSize; j++ ) fprintf(fp," %9d %9d %25.16e\n", irow+1, inds[j]+1, vals[j]); HYPRE_ParCSRMatrixRestoreRow(A11mat_csr,irow,&rowSize,&inds,&vals); } fclose(fp); sprintf( fname, "A12.%d", mypid); fp = fopen( fname, "w" ); for ( irow = A12StartRow; irow < A12StartRow+A12NRows; irow++ ) { HYPRE_ParCSRMatrixGetRow(A12mat_csr,irow,&rowSize,&inds,&vals); for ( j = 0; j < rowSize; j++ ) fprintf(fp, " %9d %9d %25.16e\n", irow+1, inds[j]+1, vals[j]); HYPRE_ParCSRMatrixRestoreRow(A12mat_csr,irow,&rowSize,&inds,&vals); } fclose(fp); if ( A22mat_csr != NULL ) { sprintf( fname, "A22.%d", mypid); fp = fopen( fname, "w" ); for ( irow = A22StartRow; irow < A22StartRow+A22NRows; irow++ ) { HYPRE_ParCSRMatrixGetRow(A22mat_csr,irow,&rowSize,&inds,&vals); for ( j = 0; j < rowSize; j++ ) fprintf(fp," %9d %9d %25.16e\n", irow+1, inds[j]+1, vals[j]); HYPRE_ParCSRMatrixRestoreRow(A22mat_csr,irow,&rowSize,&inds,&vals); } fclose(fp); } } return 0; } //****************************************************************************** // setup preconditioner //------------------------------------------------------------------------------ int HYPRE_LSI_BlockP::setupPrecon(HYPRE_Solver *precon, HYPRE_IJMatrix Amat, HYPRE_LSI_BLOCKP_PARAMS param_ptr) { int i, nprocs, *nsweeps, *relaxType; char **targv; #ifdef HAVE_MLI char paramString[100]; #endif MPI_Comm mpi_comm; HYPRE_ParCSRMatrix Amat_csr; //------------------------------------------------------------------ // fetch machine parameters //------------------------------------------------------------------ HYPRE_IJMatrixGetObject( Amat, (void **) &Amat_csr ); HYPRE_ParCSRMatrixGetComm( Amat_csr, &mpi_comm ); MPI_Comm_size(mpi_comm, &nprocs); precon = NULL; //------------------------------------------------------------------ // set up the solvers and preconditioners //------------------------------------------------------------------ switch( param_ptr.PrecondID_ ) { case 2 : HYPRE_ParCSRParaSailsCreate( mpi_comm, precon ); if (param_ptr.SolverID_ == 0) HYPRE_ParCSRParaSailsSetSym(*precon,1); else HYPRE_ParCSRParaSailsSetSym(*precon,0); HYPRE_ParCSRParaSailsSetParams(*precon, param_ptr.PSThresh_, param_ptr.PSNLevels_); HYPRE_ParCSRParaSailsSetFilter(*precon, param_ptr.PSFilter_); break; case 3 : HYPRE_BoomerAMGCreate(precon); HYPRE_BoomerAMGSetMaxIter(*precon, 1); HYPRE_BoomerAMGSetCycleType(*precon, 1); HYPRE_BoomerAMGSetPrintLevel(*precon, outputLevel_); HYPRE_BoomerAMGSetMaxLevels(*precon, 25); HYPRE_BoomerAMGSetMeasureType(*precon, 0); HYPRE_BoomerAMGSetCoarsenType(*precon, 0); HYPRE_BoomerAMGSetMeasureType(*precon, 1); HYPRE_BoomerAMGSetStrongThreshold(*precon,param_ptr.AMGThresh_); HYPRE_BoomerAMGSetNumFunctions(*precon, param_ptr.AMGSystemSize_); nsweeps = hypre_CTAlloc(int,4,HYPRE_MEMORY_HOST); for ( i = 0; i < 4; i++ ) nsweeps[i] = param_ptr.AMGNSweeps_; HYPRE_BoomerAMGSetNumGridSweeps(*precon, nsweeps); relaxType = hypre_CTAlloc(int,4,HYPRE_MEMORY_HOST); for ( i = 0; i < 4; i++ ) relaxType[i] = param_ptr.AMGRelaxType_; HYPRE_BoomerAMGSetGridRelaxType(*precon, relaxType); //double relax_wt[25]; //if (nprocs > 1) //{ // for ( i = 0; i < 25; i++ ) relax_wt[i] = -10.0; // HYPRE_BoomerAMGSetRelaxOmega(*precon, relax_wt); //} break; case 4 : HYPRE_ParCSRPilutCreate( mpi_comm, precon ); HYPRE_ParCSRPilutSetMaxIter( *precon, 1 ); HYPRE_ParCSRPilutSetFactorRowSize(*precon,param_ptr.PilutFillin_); HYPRE_ParCSRPilutSetDropTolerance(*precon,param_ptr.PilutDropTol_); break; case 5 : HYPRE_EuclidCreate( mpi_comm, precon ); targv = hypre_TAlloc(char*, 4 , HYPRE_MEMORY_HOST); for ( i = 0; i < 4; i++ ) targv[i] = hypre_TAlloc(char, 50, HYPRE_MEMORY_HOST); strcpy(targv[0], "-level"); sprintf(targv[1], "%1d", param_ptr.EuclidNLevels_); strcpy(targv[2], "-sparseA"); sprintf(targv[3], "%f", param_ptr.EuclidThresh_); HYPRE_EuclidSetParams(*precon, 4, targv); for ( i = 0; i < 4; i++ ) free(targv[i]); free(targv); break; case 6 : HYPRE_LSI_DDIlutCreate( mpi_comm, precon ); HYPRE_LSI_DDIlutSetFillin(*precon, param_ptr.DDIlutFillin_); HYPRE_LSI_DDIlutSetDropTolerance(*precon, param_ptr.DDIlutDropTol_); break; case 7 : #ifdef HAVE_ML HYPRE_LSI_MLCreate( mpi_comm, precon ); HYPRE_LSI_MLSetCoarseSolver(*precon, 0); HYPRE_LSI_MLSetStrongThreshold(*precon, param_ptr.MLThresh_); HYPRE_LSI_MLSetNumPreSmoothings(*precon, param_ptr.MLNSweeps_); HYPRE_LSI_MLSetNumPostSmoothings(*precon,param_ptr.MLNSweeps_); HYPRE_LSI_MLSetPreSmoother(*precon, 1); HYPRE_LSI_MLSetPostSmoother(*precon, 1); break; #else printf("blockP setupPrecon ERROR : ml not available.\n"); exit(1); #endif case 8 : #ifdef HAVE_MLI HYPRE_LSI_MLICreate( mpi_comm, precon ); sprintf(paramString, "MLI outputLevel %d", outputLevel_); HYPRE_LSI_MLISetParams(*precon, paramString); sprintf(paramString,"MLI strengthThreshold %e",param_ptr.MLIThresh_); HYPRE_LSI_MLISetParams(*precon, paramString); sprintf(paramString, "MLI method AMGSA"); HYPRE_LSI_MLISetParams(*precon, paramString); switch (param_ptr.MLIRelaxType_) { case 0 : strcpy(paramString,"MLI smoother Jacobi"); break; case 1 : strcpy(paramString,"MLI smoother GS"); break; case 2 : strcpy(paramString,"MLI smoother SGS"); break; case 3 : strcpy(paramString,"MLI smoother BSGS"); break; case 4 : strcpy(paramString,"MLI smoother ParaSails"); break; } HYPRE_LSI_MLISetParams(*precon, paramString); sprintf(paramString, "MLI numSweeps %d",param_ptr.MLINSweeps_); HYPRE_LSI_MLISetParams(*precon, paramString); sprintf(paramString, "MLI Pweight %e",param_ptr.MLIPweight_); HYPRE_LSI_MLISetParams(*precon, paramString); sprintf(paramString, "MLI nodeDOF %d",param_ptr.MLINodeDOF_); HYPRE_LSI_MLISetParams(*precon, paramString); sprintf(paramString, "MLI nullSpaceDim %d",param_ptr.MLINullDim_); HYPRE_LSI_MLISetParams(*precon, paramString); #else printf("blockP setupPrecon ERROR : mli not available.\n"); exit(1); #endif } return 0; } //****************************************************************************** // setup solver //------------------------------------------------------------------------------ int HYPRE_LSI_BlockP::setupSolver(HYPRE_Solver *solver, HYPRE_IJMatrix Amat, HYPRE_IJVector fvec, HYPRE_IJVector xvec, HYPRE_Solver precon, HYPRE_LSI_BLOCKP_PARAMS param_ptr) { int i, nprocs, *nsweeps, *relaxType; MPI_Comm mpi_comm; HYPRE_ParCSRMatrix Amat_csr; HYPRE_ParVector f_csr, x_csr; //------------------------------------------------------------------ // fetch machine parameters //------------------------------------------------------------------ HYPRE_IJMatrixGetObject( Amat, (void **) &Amat_csr ); HYPRE_IJVectorGetObject( fvec, (void **) &f_csr ); HYPRE_IJVectorGetObject( xvec, (void **) &x_csr ); HYPRE_ParCSRMatrixGetComm( Amat_csr, &mpi_comm ); MPI_Comm_size(mpi_comm, &nprocs); //------------------------------------------------------------------ // create solver context //------------------------------------------------------------------ switch ( param_ptr.SolverID_ ) { case 0 : HYPRE_ParCSRPCGCreate(mpi_comm, solver); HYPRE_ParCSRPCGSetMaxIter(*solver, param_ptr.MaxIter_ ); HYPRE_ParCSRPCGSetTol(*solver, param_ptr.Tol_); HYPRE_ParCSRPCGSetLogging(*solver, outputLevel_); HYPRE_ParCSRPCGSetRelChange(*solver, 0); HYPRE_ParCSRPCGSetTwoNorm(*solver, 1); switch ( param_ptr.PrecondID_ ) { case 1 : HYPRE_ParCSRPCGSetPrecond(*solver, HYPRE_ParCSRDiagScale, HYPRE_ParCSRDiagScaleSetup,precon); break; case 2 : HYPRE_ParCSRPCGSetPrecond(*solver,HYPRE_ParCSRParaSailsSolve, HYPRE_ParCSRParaSailsSetup,precon); break; case 3 : HYPRE_ParCSRPCGSetPrecond(*solver, HYPRE_BoomerAMGSolve, HYPRE_BoomerAMGSetup, precon); break; case 4 : HYPRE_ParCSRPCGSetPrecond(*solver, HYPRE_ParCSRPilutSolve, HYPRE_ParCSRPilutSetup, precon); break; case 5 : HYPRE_ParCSRPCGSetPrecond(*solver, HYPRE_EuclidSolve, HYPRE_EuclidSetup, precon); break; case 6 : HYPRE_ParCSRPCGSetPrecond(*solver, HYPRE_LSI_DDIlutSolve, HYPRE_LSI_DDIlutSetup, precon); break; case 7 : #ifdef HAVE_ML HYPRE_ParCSRPCGSetPrecond(*solver,HYPRE_LSI_MLSolve, HYPRE_LSI_MLSetup, precon); #else printf("blockP setupSolver ERROR : ml not available.\n"); exit(1); #endif break; case 8 : #ifdef HAVE_MLI HYPRE_ParCSRPCGSetPrecond(*solver,HYPRE_LSI_MLISolve, HYPRE_LSI_MLISetup, precon); #else printf("blockP setupSolver ERROR : mli not available.\n"); exit(1); #endif break; } HYPRE_ParCSRPCGSetup(*solver, Amat_csr, f_csr, x_csr); break; case 1 : HYPRE_ParCSRGMRESCreate(mpi_comm, solver); HYPRE_ParCSRGMRESSetMaxIter(*solver, param_ptr.MaxIter_); HYPRE_ParCSRGMRESSetTol(*solver, param_ptr.Tol_); HYPRE_ParCSRGMRESSetLogging(*solver, outputLevel_); HYPRE_ParCSRGMRESSetKDim(*solver, 50); switch ( param_ptr.PrecondID_ ) { case 1 : HYPRE_ParCSRGMRESSetPrecond(*solver, HYPRE_ParCSRDiagScale, HYPRE_ParCSRDiagScaleSetup,precon); break; case 2 : HYPRE_ParCSRGMRESSetPrecond(*solver,HYPRE_ParCSRParaSailsSolve, HYPRE_ParCSRParaSailsSetup,precon); break; case 3 : HYPRE_ParCSRGMRESSetPrecond(*solver, HYPRE_BoomerAMGSolve, HYPRE_BoomerAMGSetup, precon); break; case 4 : HYPRE_ParCSRGMRESSetPrecond(*solver, HYPRE_ParCSRPilutSolve, HYPRE_ParCSRPilutSetup, precon); break; case 5 : HYPRE_ParCSRGMRESSetPrecond(*solver, HYPRE_EuclidSolve, HYPRE_EuclidSetup, precon); break; case 6 : HYPRE_ParCSRGMRESSetPrecond(*solver, HYPRE_LSI_DDIlutSolve, HYPRE_LSI_DDIlutSetup, precon); break; case 7 : #ifdef HAVE_ML HYPRE_ParCSRGMRESSetPrecond(*solver,HYPRE_LSI_MLSolve, HYPRE_LSI_MLSetup, precon); #else printf("blockP setupSolver ERROR : ml not available.\n"); exit(1); #endif break; case 8 : #ifdef HAVE_MLI HYPRE_ParCSRGMRESSetPrecond(*solver,HYPRE_LSI_MLISolve, HYPRE_LSI_MLISetup, precon); #else printf("blockP setupSolver ERROR : mli not available.\n"); exit(1); #endif break; } HYPRE_ParCSRGMRESSetup(*solver, Amat_csr, f_csr, x_csr); break; case 2 : HYPRE_BoomerAMGCreate(solver); HYPRE_BoomerAMGSetMaxIter(*solver, param_ptr.MaxIter_); HYPRE_BoomerAMGSetCycleType(*solver, 1); //HYPRE_BoomerAMGSetTol(*solver, 1.0e-20); HYPRE_BoomerAMGSetPrintLevel(*solver, outputLevel_); HYPRE_BoomerAMGSetMaxLevels(*solver, 25); HYPRE_BoomerAMGSetMeasureType(*solver, 0); HYPRE_BoomerAMGSetCoarsenType(*solver, 0); HYPRE_BoomerAMGSetMeasureType(*solver, 1); HYPRE_BoomerAMGSetStrongThreshold(*solver,param_ptr.AMGThresh_); HYPRE_BoomerAMGSetNumFunctions(*solver, param_ptr.AMGSystemSize_); nsweeps = hypre_CTAlloc(int,4,HYPRE_MEMORY_HOST); for ( i = 0; i < 4; i++ ) nsweeps[i] = param_ptr.AMGNSweeps_; HYPRE_BoomerAMGSetNumGridSweeps(*solver, nsweeps); relaxType = hypre_CTAlloc(int,4,HYPRE_MEMORY_HOST); for ( i = 0; i < 4; i++ ) relaxType[i] = param_ptr.AMGRelaxType_; HYPRE_BoomerAMGSetGridRelaxType(*solver, relaxType); //double relax_wt[25]; //if (nprocs > 1) //{ // for ( i = 0; i < 25; i++ ) relax_wt[i] = -10.0; // HYPRE_BoomerAMGSetRelaxOmega(*solver, relax_wt); //} precon = NULL; HYPRE_BoomerAMGSetup(*solver, Amat_csr, f_csr, x_csr); break; case 3 : HYPRE_ParCSRDiagScaleSetup(*solver, Amat_csr, f_csr, x_csr); precon = NULL; break; } return 0; } //****************************************************************************** // solve with block diagonal or block triangular preconditioner // (1) for diagonal block solve : // (a) A11 solve // (b) A22 solve //------------------------------------------------------------------------------ int HYPRE_LSI_BlockP::solveBDSolve(HYPRE_IJVector x1,HYPRE_IJVector x2, HYPRE_IJVector f1,HYPRE_IJVector f2) { HYPRE_ParCSRMatrix A11mat_csr, A22mat_csr; HYPRE_ParVector x1_csr, x2_csr, f1_csr, f2_csr; //------------------------------------------------------------------ // fetch machine paramters and matrix and vector pointers //------------------------------------------------------------------ HYPRE_IJMatrixGetObject( A11mat_, (void **) &A11mat_csr ); HYPRE_IJMatrixGetObject( A22mat_, (void **) &A22mat_csr ); HYPRE_IJVectorGetObject( F1vec_, (void **) &f1_csr ); HYPRE_IJVectorGetObject( F2vec_, (void **) &f2_csr ); HYPRE_IJVectorGetObject( X1vec_, (void **) &x1_csr ); HYPRE_IJVectorGetObject( X2vec_, (void **) &x2_csr ); //------------------------------------------------------------------ // (1) A22 solve // (2) A11 solve //------------------------------------------------------------------ if ( A22Params_.SolverID_ == 0 ) HYPRE_ParCSRPCGSolve(A22Solver_, A22mat_csr, f2_csr, x2_csr); else if ( A22Params_.SolverID_ == 1 ) HYPRE_ParCSRGMRESSolve(A22Solver_, A22mat_csr, f2_csr, x2_csr); else if ( A22Params_.SolverID_ == 2 ) HYPRE_BoomerAMGSolve( A22Solver_, A22mat_csr, f2_csr, x2_csr ); else if ( A22Params_.SolverID_ == 3 ) HYPRE_ParCSRDiagScale( A22Solver_, A22mat_csr, f2_csr, x2_csr ); else if ( A22Params_.SolverID_ == 9 ) hypre_ParVectorAxpy((double) 1.0, (hypre_ParVector *) f2_csr, (hypre_ParVector *) x2_csr); else { printf("HYPRE_LSI_BlockP ERROR : invalid A22 solver.\n"); exit(1); } if ( A11Params_.SolverID_ == 0 ) HYPRE_ParCSRPCGSolve(A11Solver_, A11mat_csr, f1_csr, x1_csr); else if ( A11Params_.SolverID_ == 1 ) HYPRE_ParCSRGMRESSolve(A11Solver_, A11mat_csr, f1_csr, x1_csr); else if ( A11Params_.SolverID_ == 2 ) HYPRE_BoomerAMGSolve( A11Solver_, A11mat_csr, f1_csr, x1_csr ); else if ( A11Params_.SolverID_ == 3 ) HYPRE_ParCSRDiagScale( A11Solver_, A11mat_csr, f1_csr, x1_csr ); else if ( A11Params_.SolverID_ == 9 ) hypre_ParVectorAxpy((double) 1.0, (hypre_ParVector *) f1_csr, (hypre_ParVector *) x1_csr); else { printf("HYPRE_LSI_BlockP ERROR : invalid A11 solver.\n"); exit(1); } return 0; } //****************************************************************************** // solve with block triangular preconditioner // (a) A11 solve // (b) A22 solve (A_p^{-1} - delta t \hat{M}_p^{-1}) or // (c) A22 solve (A22^{-1}) //------------------------------------------------------------------------------ int HYPRE_LSI_BlockP::solveBTSolve(HYPRE_IJVector x1,HYPRE_IJVector x2, HYPRE_IJVector f1,HYPRE_IJVector f2) { HYPRE_ParCSRMatrix A11mat_csr, A22mat_csr, A12mat_csr; HYPRE_ParVector x1_csr, x2_csr, f1_csr, f2_csr; //------------------------------------------------------------------ // fetch machine paramters and matrix and vector pointers //------------------------------------------------------------------ HYPRE_IJMatrixGetObject( A11mat_, (void **) &A11mat_csr ); HYPRE_IJMatrixGetObject( A22mat_, (void **) &A22mat_csr ); HYPRE_IJMatrixGetObject( A12mat_, (void **) &A12mat_csr ); HYPRE_IJVectorGetObject( F1vec_, (void **) &f1_csr ); HYPRE_IJVectorGetObject( F2vec_, (void **) &f2_csr ); HYPRE_IJVectorGetObject( X1vec_, (void **) &x1_csr ); HYPRE_IJVectorGetObject( X2vec_, (void **) &x2_csr ); //------------------------------------------------------------------ // (1) A22 solve // (2) compute f1 = f1 - C x2 // (3) A11 solve //------------------------------------------------------------------ if ( A22Params_.SolverID_ == 0 ) HYPRE_ParCSRPCGSolve(A22Solver_, A22mat_csr, f2_csr, x2_csr); else if ( A22Params_.SolverID_ == 1 ) HYPRE_ParCSRGMRESSolve(A22Solver_, A22mat_csr, f2_csr, x2_csr); else if ( A22Params_.SolverID_ == 2 ) HYPRE_BoomerAMGSolve( A22Solver_, A22mat_csr, f2_csr, x2_csr ); else if ( A22Params_.SolverID_ == 3 ) HYPRE_ParCSRDiagScale( A22Solver_, A22mat_csr, f2_csr, x2_csr ); else if ( A22Params_.SolverID_ == 9 ) hypre_ParVectorAxpy((double) 1.0, (hypre_ParVector *) f2_csr, (hypre_ParVector *) x2_csr); else { printf("HYPRE_LSI_BlockP ERROR : invalid A22 solver.\n"); exit(1); } HYPRE_ParCSRMatrixMatvec(-1.0, A12mat_csr, x2_csr, 1.0, f1_csr); if ( A11Params_.SolverID_ == 0 ) HYPRE_ParCSRPCGSolve(A11Solver_, A11mat_csr, f1_csr, x1_csr); else if ( A11Params_.SolverID_ == 1 ) HYPRE_ParCSRGMRESSolve(A11Solver_, A11mat_csr, f1_csr, x1_csr); else if ( A11Params_.SolverID_ == 2 ) HYPRE_BoomerAMGSolve( A11Solver_, A11mat_csr, f1_csr, x1_csr ); else if ( A11Params_.SolverID_ == 3 ) HYPRE_ParCSRDiagScale( A11Solver_, A11mat_csr, f1_csr, x1_csr ); else if ( A11Params_.SolverID_ == 9 ) hypre_ParVectorAxpy((double) 1.0, (hypre_ParVector *) f1_csr, (hypre_ParVector *) x1_csr); else { printf("HYPRE_LSI_BlockP ERROR : invalid A11 solver.\n"); exit(1); } return 0; } //****************************************************************************** // solve with block LU preconditioner // y1 = A11 \ f1 // x2 = A22 \ (C' * y1 - f2) // x1 = y1 - A11 \ (C x2 ) //------------------------------------------------------------------------------ int HYPRE_LSI_BlockP::solveBLUSolve(HYPRE_IJVector x1,HYPRE_IJVector x2, HYPRE_IJVector f1,HYPRE_IJVector f2) { HYPRE_ParCSRMatrix A11mat_csr, A22mat_csr, A12mat_csr; HYPRE_ParVector x1_csr, x2_csr, f1_csr, f2_csr, y1_csr; //------------------------------------------------------------------ // fetch matrix and vector pointers //------------------------------------------------------------------ HYPRE_IJMatrixGetObject( A11mat_, (void **) &A11mat_csr ); HYPRE_IJMatrixGetObject( A22mat_, (void **) &A22mat_csr ); HYPRE_IJMatrixGetObject( A12mat_, (void **) &A12mat_csr ); HYPRE_IJVectorGetObject( f1, (void **) &f1_csr ); HYPRE_IJVectorGetObject( f2, (void **) &f2_csr ); HYPRE_IJVectorGetObject( x1, (void **) &x1_csr ); HYPRE_IJVectorGetObject( x2, (void **) &x2_csr ); HYPRE_IJVectorGetObject( X1aux_, (void **) &y1_csr ); //------------------------------------------------------------------ // (1) y1 = A11 \ f1 // (2) x2 = S \ ( f2 - C' * y1 ) // (3) x1 = y1 - A11 \ ( C * x2 ) //------------------------------------------------------------------ if ( A11Params_.SolverID_ == 0 ) HYPRE_ParCSRPCGSolve(A11Solver_, A11mat_csr, f1_csr, y1_csr); else if ( A11Params_.SolverID_ == 1 ) HYPRE_ParCSRGMRESSolve(A11Solver_, A11mat_csr, f1_csr, y1_csr); else if ( A11Params_.SolverID_ == 2 ) HYPRE_BoomerAMGSolve( A11Solver_, A11mat_csr, f1_csr, x1_csr ); else if ( A11Params_.SolverID_ == 3 ) HYPRE_ParCSRDiagScale( A11Solver_, A11mat_csr, f1_csr, x1_csr ); else if ( A11Params_.SolverID_ == 9 ) hypre_ParVectorAxpy((double) 1.0, (hypre_ParVector *) f1_csr, (hypre_ParVector *) x1_csr); else { printf("HYPRE_LSI_BlockP ERROR : invalid A11 solver.\n"); exit(1); } HYPRE_ParCSRMatrixMatvecT(1.0, A12mat_csr, y1_csr, -1.0, f2_csr); if ( A22Params_.SolverID_ == 0 ) HYPRE_ParCSRPCGSolve(A22Solver_, A22mat_csr, f2_csr, x2_csr); else if ( A22Params_.SolverID_ == 1 ) HYPRE_ParCSRGMRESSolve(A22Solver_, A22mat_csr, f2_csr, x2_csr); else if ( A22Params_.SolverID_ == 2 ) HYPRE_BoomerAMGSolve( A22Solver_, A22mat_csr, f2_csr, x2_csr ); else if ( A22Params_.SolverID_ == 3 ) HYPRE_ParCSRDiagScale( A22Solver_, A22mat_csr, f2_csr, x2_csr ); else if ( A22Params_.SolverID_ == 9 ) hypre_ParVectorAxpy((double) 1.0, (hypre_ParVector *) f2_csr, (hypre_ParVector *) x2_csr); else { printf("HYPRE_LSI_BlockP ERROR : invalid A22 solver.\n"); exit(1); } HYPRE_ParCSRMatrixMatvec(-1.0, A12mat_csr, x2_csr, 0.0, f1_csr); if ( A11Params_.SolverID_ == 0 ) HYPRE_ParCSRPCGSolve(A11Solver_, A11mat_csr, f1_csr, x1_csr); else if ( A11Params_.SolverID_ == 1 ) HYPRE_ParCSRGMRESSolve(A11Solver_, A11mat_csr, f1_csr, x1_csr); else if ( A11Params_.SolverID_ == 2 ) HYPRE_BoomerAMGSolve( A11Solver_, A11mat_csr, f1_csr, x1_csr ); else if ( A11Params_.SolverID_ == 3 ) HYPRE_ParCSRDiagScale( A11Solver_, A11mat_csr, f1_csr, x1_csr ); else if ( A11Params_.SolverID_ == 9 ) hypre_ParVectorAxpy((double) 1.0, (hypre_ParVector *) f1_csr, (hypre_ParVector *) x1_csr); else { printf("HYPRE_LSI_BlockP ERROR : invalid A11 solver.\n"); exit(1); } hypre_ParVectorAxpy((double) 1.0, (hypre_ParVector *) y1_csr, (hypre_ParVector *) x1_csr); return 0; } hypre-2.33.0/src/FEI_mv/fei-hypre/HYPRE_LSI_blkprec.h000066400000000000000000000156431477326011500220020ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ // ************************************************************************* // This is the HYPRE implementation of block preconditioners // ************************************************************************* #ifndef _HYPRE_INCFLOW_BLOCKPRECOND_ #define _HYPRE_INCFLOW_BLOCKPRECOND_ // ************************************************************************* // system libraries used // ------------------------------------------------------------------------- #include #include #include #include #include "HYPRE.h" #include "IJ_mv/HYPRE_IJ_mv.h" #include "parcsr_ls/_hypre_parcsr_ls.h" #include "parcsr_mv/_hypre_parcsr_mv.h" // ************************************************************************* // local defines // ------------------------------------------------------------------------- #define HYPRE_INCFLOW_BDIAG 1 #define HYPRE_INCFLOW_SDIAG 2 #define HYPRE_INCFLOW_BTRI 3 #define HYPRE_INCFLOW_BLU 4 // ************************************************************************* // FEI include files // ------------------------------------------------------------------------- #include "HYPRE_FEI_includes.h" // ************************************************************************* // C-wrapper for the FEI Lookup class // ------------------------------------------------------------------------- typedef struct HYPRE_Lookup_Struct { void *object; } HYPRE_Lookup; // ************************************************************************* // Solver-Preconditioner parameter data structure // ------------------------------------------------------------------------- typedef struct HYPRE_LSI_BLOCKP_PARAMS_Struct { int SolverID_; // solver ID int PrecondID_; // preconditioner ID double Tol_; // tolerance for Krylov solver int MaxIter_; // max iterations for Krylov solver int PSNLevels_; // Nlevels for ParaSails double PSThresh_; // threshold for ParaSails double PSFilter_; // filter for ParaSails double AMGThresh_; // threshold for BoomerAMG int AMGRelaxType_; // smoother for BoomerAMG int AMGNSweeps_; // no. of relaxations for BoomerAMG int AMGSystemSize_; // system size for BoomerAMG int PilutFillin_; // Fillin for Pilut double PilutDropTol_; // drop tolerance for Pilut int EuclidNLevels_; // nlevels for Euclid double EuclidThresh_; // threshold for Euclid double DDIlutFillin_; // fill-in for DDIlut double DDIlutDropTol_; // drop tolerance for DDIlut double MLThresh_; // threshold for SA AMG int MLNSweeps_; // no. of relaxations for SA AMG double MLIThresh_; // threshold for MLI's SA AMG int MLIRelaxType_; // smoother for MLI's SA AMG int MLINSweeps_; // no. of relaxations for MLI's SA AMG double MLIPweight_; // prolongation smoother weight int MLINodeDOF_; // nodal degree of freedom int MLINullDim_; // null space dimension } HYPRE_LSI_BLOCKP_PARAMS; // ************************************************************************* // class definition // ------------------------------------------------------------------------- class HYPRE_LSI_BlockP { HYPRE_ParCSRMatrix Amat_; // incoming system matrix HYPRE_IJMatrix A11mat_; // velocity matrix HYPRE_IJMatrix A12mat_; // gradient (divergence) matrix HYPRE_IJMatrix A22mat_; // pressure Poisson HYPRE_IJVector F1vec_; // rhs for velocity HYPRE_IJVector F2vec_; // rhs for pressure HYPRE_IJVector X1vec_; // solution for velocity HYPRE_IJVector X2vec_; // solution for pressure HYPRE_IJVector X1aux_; // auxiliary vector for velocity int *APartition_; // processor partition of matrix A int P22Size_; // number of pressure variables int P22GSize_; // global number of pressure variables int *P22LocalInds_; // pressure local row indices (global) int *P22GlobalInds_; // pressure off-processor row indices int *P22Offsets_; // processor partiton of matrix A22 int block1FieldID_; // identifier for (1,1) block int block2FieldID_; // identifier for (2,2) block int assembled_; // set up complete flag int outputLevel_; // for diagnostics int lumpedMassScheme_; // use diagonal or approximate inverse int lumpedMassNlevels_;// if approx inverse, nlevels double lumpedMassThresh_; // if approx inverse, threshold int lumpedMassLength_; // length of M_v and M_p double *lumpedMassDiag_; // M_v and M_p lumped int scheme_; // which preconditioning ? int printFlag_; // for diagnostics HYPRE_Solver A11Solver_; // solver for velocity matrix HYPRE_Solver A11Precond_; // preconditioner for velocity matrix HYPRE_Solver A22Solver_; // solver for pressure Poisson HYPRE_Solver A22Precond_; // preconditioner for pressure Poisson HYPRE_LSI_BLOCKP_PARAMS A11Params_; HYPRE_LSI_BLOCKP_PARAMS A22Params_; Lookup *lookup_; // FEI lookup object public: HYPRE_LSI_BlockP(); virtual ~HYPRE_LSI_BlockP(); int setLumpedMasses( int length, double *Mdiag ); int setParams(char *param); int setLookup( Lookup *lookup ); int setup(HYPRE_ParCSRMatrix Amat); int solve( HYPRE_ParVector fvec, HYPRE_ParVector xvec ); int print(); private: int destroySolverPrecond(); int computeBlockInfo(); int buildBlocks(); int setupPrecon(HYPRE_Solver *precon, HYPRE_IJMatrix Amat, HYPRE_LSI_BLOCKP_PARAMS); int setupSolver(HYPRE_Solver *solver, HYPRE_IJMatrix Amat, HYPRE_IJVector f, HYPRE_IJVector x, HYPRE_Solver precon, HYPRE_LSI_BLOCKP_PARAMS); int solveBDSolve (HYPRE_IJVector x1, HYPRE_IJVector x2, HYPRE_IJVector f1, HYPRE_IJVector f2 ); int solveBTSolve (HYPRE_IJVector x1, HYPRE_IJVector x2, HYPRE_IJVector f1, HYPRE_IJVector f2 ); int solveBLUSolve(HYPRE_IJVector x1, HYPRE_IJVector x2, HYPRE_IJVector f1, HYPRE_IJVector f2 ); }; #endif hypre-2.33.0/src/FEI_mv/fei-hypre/HYPRE_LSI_block.h000066400000000000000000000033221477326011500214410ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * HYPRE_LSI_BlockP interface * *****************************************************************************/ #ifndef __HYPRE_BLOCKP__ #define __HYPRE_BLOCKP__ #include #include #include #include #include "utilities/_hypre_utilities.h" #include "parcsr_ls/HYPRE_parcsr_ls.h" #include "parcsr_mv/_hypre_parcsr_mv.h" #include "HYPRE_LSI_blkprec.h" #ifdef __cplusplus extern "C" { #endif extern int HYPRE_LSI_BlockPrecondCreate(MPI_Comm comm, HYPRE_Solver *solver); extern int HYPRE_LSI_BlockPrecondDestroy(HYPRE_Solver solver); extern int HYPRE_LSI_BlockPrecondSetLumpedMasses(HYPRE_Solver solver, int,double *); extern int HYPRE_LSI_BlockPrecondSetParams(HYPRE_Solver solver, char *params); extern int HYPRE_LSI_BlockPrecondSetLookup(HYPRE_Solver solver, HYPRE_Lookup *); extern int HYPRE_LSI_BlockPrecondSetup(HYPRE_Solver solver,HYPRE_ParCSRMatrix A, HYPRE_ParVector b,HYPRE_ParVector x); extern int HYPRE_LSI_BlockPrecondSolve(HYPRE_Solver solver,HYPRE_ParCSRMatrix A, HYPRE_ParVector b, HYPRE_ParVector x); extern int HYPRE_LSI_BlockPrecondSetA11Tolerance(HYPRE_Solver solver, double); #ifdef __cplusplus } #endif #endif hypre-2.33.0/src/FEI_mv/fei-hypre/HYPRE_LSI_ddict.c000066400000000000000000001240101477326011500214270ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * HYPRE_DDICT interface * *****************************************************************************/ #include #include #include #include "utilities/_hypre_utilities.h" #include "HYPRE.h" #include "IJ_mv/HYPRE_IJ_mv.h" #include "parcsr_mv/HYPRE_parcsr_mv.h" #include "parcsr_mv/_hypre_parcsr_mv.h" #include "parcsr_ls/HYPRE_parcsr_ls.h" #include "HYPRE_MHMatrix.h" #ifdef HAVE_ML #include "ml_struct.h" #include "ml_aggregate.h" #endif #include "HYPRE_MHMatrix.h" #include "HYPRE_FEI.h" typedef struct HYPRE_LSI_DDICT_Struct { MPI_Comm comm; MH_Matrix *mh_mat; double thresh; double fillin; int Nrows; int extNrows; int *mat_ja; double *mat_aa; int outputLevel; } HYPRE_LSI_DDICT; extern int HYPRE_LSI_MLConstructMHMatrix(HYPRE_ParCSRMatrix,MH_Matrix *, MPI_Comm, int *, MH_Context *); extern int HYPRE_LSI_DDICTComposeOverlappedMatrix(MH_Matrix *, int *, int **recv_lengths, int **int_buf, double **dble_buf, int **sindex_array, int **sindex_array2, int *offset); extern int HYPRE_LSI_DDICTGetRowLengths(MH_Matrix *Amat, int *leng, int **); extern int HYPRE_LIS_DDICTGetOffProcRows(MH_Matrix *Amat, int leng, int *, int Noffset, int *map, int *map2, int **int_buf, double **dble_buf); extern int HYPRE_LSI_DDICTDecompose(HYPRE_LSI_DDICT *ict_ptr,MH_Matrix *Amat, int total_recv_leng, int *recv_lengths, int *ext_ja, double *ext_aa, int *map, int *map2, int Noffset); extern void HYPRE_LSI_qsort1a(int *, int *, int, int); extern int HYPRE_LSI_SplitDSort(double *,int,int*,int); extern int HYPRE_LSI_Search(int *, int, int); extern int HYPRE_LSI_DDICTFactorize(HYPRE_LSI_DDICT *ict_ptr, double *mat_aa, int *mat_ja, int *mat_ia, double *rowNorms); extern int MH_ExchBdry(double *, void *); extern int MH_ExchBdryBack(double *, void *, int *, double **, int **); extern int MH_GetRow(void *, int, int *, int, int *, double *, int *); #define habs(x) ((x) > 0 ? (x) : -(x)) /*****************************************************************************/ /* HYPRE_LSI_DDICTCreate - Return a DDICT preconditioner object "solver". */ /*---------------------------------------------------------------------------*/ int HYPRE_LSI_DDICTCreate( MPI_Comm comm, HYPRE_Solver *solver ) { HYPRE_LSI_DDICT *ict_ptr; ict_ptr = hypre_TAlloc(HYPRE_LSI_DDICT, 1, HYPRE_MEMORY_HOST); if (ict_ptr == NULL) return 1; ict_ptr->comm = comm; ict_ptr->mh_mat = NULL; ict_ptr->fillin = 0.0; ict_ptr->thresh = 0.0; /* defaults */ ict_ptr->mat_ja = NULL; ict_ptr->mat_aa = NULL; ict_ptr->outputLevel = 0; *solver = (HYPRE_Solver) ict_ptr; return 0; } /*****************************************************************************/ /* HYPRE_LSI_DDICTDestroy - Destroy a DDICT object. */ /*---------------------------------------------------------------------------*/ int HYPRE_LSI_DDICTDestroy( HYPRE_Solver solver ) { int i; HYPRE_LSI_DDICT *ict_ptr; ict_ptr = (HYPRE_LSI_DDICT *) solver; hypre_TFree(ict_ptr->mat_ja, HYPRE_MEMORY_HOST); hypre_TFree(ict_ptr->mat_aa, HYPRE_MEMORY_HOST); if ( ict_ptr->mh_mat != NULL ) { hypre_TFree(ict_ptr->mh_mat->sendProc, HYPRE_MEMORY_HOST); hypre_TFree(ict_ptr->mh_mat->sendLeng, HYPRE_MEMORY_HOST); hypre_TFree(ict_ptr->mh_mat->recvProc, HYPRE_MEMORY_HOST); hypre_TFree(ict_ptr->mh_mat->recvLeng, HYPRE_MEMORY_HOST); for ( i = 0; i < ict_ptr->mh_mat->sendProcCnt; i++ ) hypre_TFree(ict_ptr->mh_mat->sendList[i], HYPRE_MEMORY_HOST); hypre_TFree(ict_ptr->mh_mat->sendList, HYPRE_MEMORY_HOST); hypre_TFree(ict_ptr, HYPRE_MEMORY_HOST); } ict_ptr->mh_mat = NULL; hypre_TFree(ict_ptr, HYPRE_MEMORY_HOST); return 0; } /*****************************************************************************/ /* HYPRE_LSI_DDICTSetFillin - Set the fill-in parameter. */ /*---------------------------------------------------------------------------*/ int HYPRE_LSI_DDICTSetFillin(HYPRE_Solver solver, double fillin) { HYPRE_LSI_DDICT *ict_ptr = (HYPRE_LSI_DDICT *) solver; ict_ptr->fillin = fillin; return 0; } /*****************************************************************************/ /* HYPRE_LSI_DDICTSetDropTolerance - Set the threshold for dropping */ /*---------------------------------------------------------------------------*/ int HYPRE_LSI_DDICTSetDropTolerance(HYPRE_Solver solver, double thresh) { HYPRE_LSI_DDICT *ict_ptr = (HYPRE_LSI_DDICT *) solver; ict_ptr->thresh = thresh; return 0; } /*****************************************************************************/ /* HYPRE_LSI_DDICTSetOutputLevel - Set debug level */ /*---------------------------------------------------------------------------*/ int HYPRE_LSI_DDICTSetOutputLevel(HYPRE_Solver solver, int level) { HYPRE_LSI_DDICT *ict_ptr = (HYPRE_LSI_DDICT *) solver; ict_ptr->outputLevel = level; return 0; } /*****************************************************************************/ /* HYPRE_LSI_DDICTSolve - Solve function for DDICT. */ /*---------------------------------------------------------------------------*/ int HYPRE_LSI_DDICTSolve( HYPRE_Solver solver, HYPRE_ParCSRMatrix A, HYPRE_ParVector b, HYPRE_ParVector x ) { int i, j, Nrows, extNrows, *mat_ja, *ibuf, length; double *rhs, *soln, *dbuf, *mat_aa, *dbuf2, dtmp; HYPRE_LSI_DDICT *ict_ptr = (HYPRE_LSI_DDICT *) solver; MH_Context *context; rhs = hypre_VectorData(hypre_ParVectorLocalVector((hypre_ParVector *) b)); soln = hypre_VectorData(hypre_ParVectorLocalVector((hypre_ParVector *) x)); Nrows = ict_ptr->Nrows; extNrows = ict_ptr->extNrows; mat_ja = ict_ptr->mat_ja; mat_aa = ict_ptr->mat_aa; if ( extNrows > 0 ) { dbuf = hypre_TAlloc(double, extNrows , HYPRE_MEMORY_HOST); dbuf2 = hypre_TAlloc(double, extNrows , HYPRE_MEMORY_HOST); for ( i = 0; i < Nrows; i++ ) dbuf[i] = rhs[i]; } else dbuf = dbuf2 = NULL; context = hypre_TAlloc(MH_Context, 1, HYPRE_MEMORY_HOST); context->Amat = ict_ptr->mh_mat; context->comm = MPI_COMM_WORLD; MH_ExchBdry(dbuf, context); for ( i = 0; i < extNrows; i++ ) { dtmp = dbuf[i]; for ( j = mat_ja[i]; j < mat_ja[i+1]; j++ ) dtmp -= ( mat_aa[j] * dbuf2[mat_ja[j]] ); dbuf2[i] = dtmp * mat_aa[i]; } for ( i = extNrows-1; i >= 0; i-- ) { dbuf2[i] *= mat_aa[i]; dtmp = dbuf2[i]; for ( j = mat_ja[i]; j < mat_ja[i+1]; j++ ) dbuf2[mat_ja[j]] -= ( dtmp * mat_aa[j] ); } hypre_TFree(dbuf, HYPRE_MEMORY_HOST); for ( i = 0; i < Nrows; i++ ) soln[i] = dbuf2[i]; MH_ExchBdryBack(dbuf2, context, &length, &dbuf, &ibuf); for ( i = 0; i < length; i++ ) soln[ibuf[i]] = soln[ibuf[i]] + dbuf[i]; hypre_TFree(ibuf, HYPRE_MEMORY_HOST); hypre_TFree(dbuf, HYPRE_MEMORY_HOST); hypre_TFree(dbuf2, HYPRE_MEMORY_HOST); hypre_TFree(context, HYPRE_MEMORY_HOST); return 0; } /*****************************************************************************/ /* HYPRE_LSI_DDICTSetup - Set up function for LSI_DDICT. */ /*---------------------------------------------------------------------------*/ int HYPRE_LSI_DDICTSetup(HYPRE_Solver solver, HYPRE_ParCSRMatrix A_csr, HYPRE_ParVector b, HYPRE_ParVector x ) { int i, j, offset, total_recv_leng, *recv_lengths=NULL; int *int_buf=NULL, mypid, nprocs, overlap_flag=1,*parray; int *map=NULL, *map2=NULL, *row_partition=NULL,*parray2; double *dble_buf=NULL; HYPRE_LSI_DDICT *ict_ptr = (HYPRE_LSI_DDICT *) solver; MH_Context *context=NULL; MH_Matrix *mh_mat=NULL; /* ---------------------------------------------------------------- */ /* get the row information in my processors */ /* ---------------------------------------------------------------- */ MPI_Comm_rank(MPI_COMM_WORLD, &mypid); MPI_Comm_size(MPI_COMM_WORLD, &nprocs); HYPRE_ParCSRMatrixGetRowPartitioning(A_csr, &row_partition); /* ---------------------------------------------------------------- */ /* convert the incoming CSR matrix into a MH matrix */ /* ---------------------------------------------------------------- */ context = hypre_TAlloc(MH_Context, 1, HYPRE_MEMORY_HOST); context->comm = MPI_COMM_WORLD; context->globalEqns = row_partition[nprocs]; context->partition = hypre_TAlloc(int, (nprocs+1), HYPRE_MEMORY_HOST); for (i=0; i<=nprocs; i++) context->partition[i] = row_partition[i]; hypre_TFree( row_partition , HYPRE_MEMORY_HOST); mh_mat = hypre_TAlloc( MH_Matrix, 1, HYPRE_MEMORY_HOST); context->Amat = mh_mat; HYPRE_LSI_MLConstructMHMatrix(A_csr,mh_mat,MPI_COMM_WORLD, context->partition,context); /* ---------------------------------------------------------------- */ /* compose the enlarged overlapped local matrix */ /* ---------------------------------------------------------------- */ if ( overlap_flag ) { HYPRE_LSI_DDICTComposeOverlappedMatrix(mh_mat, &total_recv_leng, &recv_lengths, &int_buf, &dble_buf, &map, &map2,&offset); } else { total_recv_leng = 0; recv_lengths = NULL; int_buf = NULL; dble_buf = NULL; map = NULL; map2 = NULL; parray = hypre_TAlloc(int, nprocs , HYPRE_MEMORY_HOST); parray2 = hypre_TAlloc(int, nprocs , HYPRE_MEMORY_HOST); for ( i = 0; i < nprocs; i++ ) parray2[i] = 0; parray2[mypid] = mh_mat->Nrows; MPI_Allreduce(parray2,parray,nprocs,MPI_INT,MPI_SUM,MPI_COMM_WORLD); offset = 0; for (i = 0; i < mypid; i++) offset += parray[i]; hypre_TFree(parray, HYPRE_MEMORY_HOST); hypre_TFree(parray2, HYPRE_MEMORY_HOST); } /* ---------------------------------------------------------------- */ /* perform ICT decomposition on local matrix */ /* ---------------------------------------------------------------- */ HYPRE_LSI_DDICTDecompose(ict_ptr,mh_mat,total_recv_leng,recv_lengths, int_buf, dble_buf, map,map2, offset); if ( mypid == 0 && ict_ptr->outputLevel > 2 ) { for ( i = 0; i < ict_ptr->extNrows; i++ ) for ( j = ict_ptr->mat_ja[i]; j < ict_ptr->mat_ja[i+1]; j++ ) printf("LA(%d,%d) = %e;\n", i+1, ict_ptr->mat_ja[j]+1, ict_ptr->mat_aa[j]); } ict_ptr->mh_mat = mh_mat; hypre_TFree(recv_lengths, HYPRE_MEMORY_HOST); hypre_TFree(int_buf, HYPRE_MEMORY_HOST); hypre_TFree(dble_buf, HYPRE_MEMORY_HOST); hypre_TFree(map, HYPRE_MEMORY_HOST); hypre_TFree(map2, HYPRE_MEMORY_HOST); hypre_TFree(context->partition, HYPRE_MEMORY_HOST); hypre_TFree(context, HYPRE_MEMORY_HOST); return 0; } /*****************************************************************************/ /* subroutines used for constructing overlapped matrix */ /*---------------------------------------------------------------------------*/ int HYPRE_LSI_DDICTGetRowLengths(MH_Matrix *Amat, int *leng, int **recv_leng) { int i, j, m, mypid, index, *temp_list, allocated_space, length; int nRecv, *recvProc, *recvLeng, *cols, total_recv, mtype, msgtype; int nSend, *sendProc, *sendLeng, **sendList, proc_id, offset; double *vals; MPI_Request *Request; MPI_Status status; MH_Context *context; /* ---------------------------------------------------------------- */ /* fetch communication information */ /* ---------------------------------------------------------------- */ MPI_Comm_rank(MPI_COMM_WORLD, &mypid); nRecv = Amat->recvProcCnt; nSend = Amat->sendProcCnt; recvProc = Amat->recvProc; recvLeng = Amat->recvLeng; sendProc = Amat->sendProc; sendLeng = Amat->sendLeng; sendList = Amat->sendList; total_recv = 0; for ( i = 0; i < nRecv; i++ ) total_recv += recvLeng[i]; (*leng) = total_recv; if ( nRecv <= 0 ) (*recv_leng) = NULL; MPI_Barrier(MPI_COMM_WORLD); /* ---------------------------------------------------------------- */ /* post receives for all messages */ /* ---------------------------------------------------------------- */ (*recv_leng) = hypre_TAlloc(int, total_recv , HYPRE_MEMORY_HOST); if (nRecv > 0) Request = hypre_TAlloc(MPI_Request, nRecv, HYPRE_MEMORY_HOST); offset = 0; mtype = 2001; for (i = 0; i < nRecv; i++) { proc_id = recvProc[i]; msgtype = mtype; length = recvLeng[i]; MPI_Irecv((void *) &((*recv_leng)[offset]), length, MPI_INT, proc_id, msgtype, MPI_COMM_WORLD, &Request[i]); offset += length; } /* ---------------------------------------------------------------- */ /* write out all messages */ /* ---------------------------------------------------------------- */ context = hypre_TAlloc(MH_Context, 1, HYPRE_MEMORY_HOST); context->Amat = Amat; allocated_space = 100; cols = hypre_TAlloc(int, allocated_space , HYPRE_MEMORY_HOST); vals = hypre_TAlloc(double, allocated_space , HYPRE_MEMORY_HOST); for (i = 0; i < nSend; i++) { proc_id = sendProc[i]; length = sendLeng[i]; temp_list = hypre_TAlloc(int, sendLeng[i] , HYPRE_MEMORY_HOST); for (j = 0; j < length; j++) { index = sendList[i][j]; while (MH_GetRow(context,1,&index,allocated_space,cols,vals,&m)==0) { hypre_TFree(cols, HYPRE_MEMORY_HOST); hypre_TFree(vals, HYPRE_MEMORY_HOST); allocated_space += 200 + 1; cols = hypre_TAlloc(int, allocated_space , HYPRE_MEMORY_HOST); vals = hypre_TAlloc(double, allocated_space , HYPRE_MEMORY_HOST); } temp_list[j] = m; } msgtype = mtype; MPI_Send((void*)temp_list,length,MPI_INT,proc_id,msgtype,MPI_COMM_WORLD); hypre_TFree(temp_list, HYPRE_MEMORY_HOST); } hypre_TFree(cols, HYPRE_MEMORY_HOST); hypre_TFree(vals, HYPRE_MEMORY_HOST); hypre_TFree(context, HYPRE_MEMORY_HOST); /* ---------------------------------------------------------------- */ /* wait for messages */ /* ---------------------------------------------------------------- */ for ( i = 0; i < nRecv; i++ ) { MPI_Wait( &Request[i], &status ); } if (nRecv > 0) hypre_TFree(Request, HYPRE_MEMORY_HOST); return 0; } /*****************************************************************************/ /* needed for overlapped smoothers */ /*---------------------------------------------------------------------------*/ int HYPRE_LSI_DDICTGetOffProcRows(MH_Matrix *Amat, int leng, int *recv_leng, int Noffset, int *map, int *map2, int **int_buf, double **dble_buf) { int i, j, k, m, length, offset, allocated_space, proc_id; int nRecv, nSend, *recvProc, *sendProc, total_recv, mtype, msgtype; int *sendLeng, *recvLeng, **sendList, *cols, *isend_buf, Nrows; int nnz, nnz_offset, index, mypid; double *vals, *send_buf; MPI_Request *request; MPI_Status status; MH_Context *context; /* ---------------------------------------------------------------- */ /* fetch communication information */ /* ---------------------------------------------------------------- */ MPI_Comm_rank(MPI_COMM_WORLD, &mypid); Nrows = Amat->Nrows; nRecv = Amat->recvProcCnt; nSend = Amat->sendProcCnt; recvProc = Amat->recvProc; recvLeng = Amat->recvLeng; sendProc = Amat->sendProc; sendLeng = Amat->sendLeng; sendList = Amat->sendList; if ( nRecv <= 0 ) { (*int_buf) = NULL; (*dble_buf) = NULL;} total_recv = 0; for ( i = 0; i < leng; i++ ) total_recv += recv_leng[i]; /* ---------------------------------------------------------------- */ /* allocate buffer space */ /* ---------------------------------------------------------------- */ if ( nRecv > 0 ) request = hypre_TAlloc(MPI_Request , nRecv, HYPRE_MEMORY_HOST); else request = NULL; if ( total_recv > 0 ) { (*int_buf) = hypre_TAlloc(int, total_recv , HYPRE_MEMORY_HOST); (*dble_buf) = hypre_TAlloc(double, total_recv , HYPRE_MEMORY_HOST); } /* ---------------------------------------------------------------- */ /* post receives for all messages */ /* ---------------------------------------------------------------- */ offset = 0; mtype = 2002; nnz_offset = 0; for (i = 0; i < nRecv; i++) { proc_id = recvProc[i]; msgtype = mtype; length = recvLeng[i]; nnz = 0; for (j = 0; j < length; j++) nnz += recv_leng[offset+j]; MPI_Irecv((void *) &((*dble_buf)[nnz_offset]), nnz, MPI_DOUBLE, proc_id, msgtype, MPI_COMM_WORLD, request+i); offset += length; nnz_offset += nnz; } /* ---------------------------------------------------------------- */ /* send rows to other processors */ /* ---------------------------------------------------------------- */ context = hypre_TAlloc(MH_Context, 1, HYPRE_MEMORY_HOST); context->Amat = Amat; mtype = 2002; allocated_space = 100; cols = hypre_TAlloc(int, allocated_space , HYPRE_MEMORY_HOST); vals = hypre_TAlloc(double, allocated_space , HYPRE_MEMORY_HOST); for (i = 0; i < nSend; i++) { proc_id = sendProc[i]; length = sendLeng[i]; nnz = 0; for (j = 0; j < length; j++) { index = sendList[i][j]; while (MH_GetRow(context,1,&index,allocated_space,cols,vals,&m)==0) { hypre_TFree(cols, HYPRE_MEMORY_HOST); hypre_TFree(vals, HYPRE_MEMORY_HOST); allocated_space += 200 + 1; cols = hypre_TAlloc(int, allocated_space , HYPRE_MEMORY_HOST); vals = hypre_TAlloc(double, allocated_space , HYPRE_MEMORY_HOST); } nnz += m; } if ( nnz > 0 ) send_buf = hypre_TAlloc(double, nnz , HYPRE_MEMORY_HOST); offset = 0; for (j = 0; j < length; j++) { index = sendList[i][j]; MH_GetRow(context,1,&index,allocated_space,cols,vals,&m); for (k = 0; k < m; k++) send_buf[offset+k] = vals[k]; offset += m; } msgtype = mtype; MPI_Send((void*) send_buf, nnz, MPI_DOUBLE, proc_id, msgtype, MPI_COMM_WORLD); if ( nnz > 0 ) hypre_TFree(send_buf, HYPRE_MEMORY_HOST); } hypre_TFree(cols, HYPRE_MEMORY_HOST); hypre_TFree(vals, HYPRE_MEMORY_HOST); /* ---------------------------------------------------------------- */ /* wait for all messages */ /* ---------------------------------------------------------------- */ for (i = 0; i < nRecv; i++) { MPI_Wait(request+i, &status); } /* ----------------------------------------------------------- */ /* post receives for all messages */ /* ----------------------------------------------------------- */ mtype = 2003; offset = 0; nnz_offset = 0; for (i = 0; i < nRecv; i++) { proc_id = recvProc[i]; msgtype = mtype; length = recvLeng[i]; nnz = 0; for (j = 0; j < length; j++) nnz += recv_leng[offset+j]; MPI_Irecv((void *) &((*int_buf)[nnz_offset]), nnz, MPI_INT, proc_id, msgtype, MPI_COMM_WORLD, request+i); offset += length; nnz_offset += nnz; } /* ---------------------------------------------------------------- */ /* send rows to other processors */ /* ---------------------------------------------------------------- */ mtype = 2003; cols = hypre_TAlloc(int, allocated_space , HYPRE_MEMORY_HOST); vals = hypre_TAlloc(double, allocated_space , HYPRE_MEMORY_HOST); for (i = 0; i < nSend; i++) { proc_id = sendProc[i]; length = sendLeng[i]; nnz = 0; for (j = 0; j < length; j++) { index = sendList[i][j]; MH_GetRow(context,1,&index,allocated_space,cols,vals,&m); nnz += m; } if ( nnz > 0 ) isend_buf = hypre_TAlloc(int, nnz , HYPRE_MEMORY_HOST); offset = 0; for (j = 0; j < length; j++) { index = sendList[i][j]; MH_GetRow(context,1,&index,allocated_space,cols,vals,&m); for (k = 0; k < m; k++) { if ( cols[k] < Nrows ) isend_buf[offset+k] = cols[k] + Noffset; else isend_buf[offset+k] = map[cols[k]-Nrows]; } offset += m; } msgtype = mtype; MPI_Send((void*) isend_buf, nnz, MPI_INT, proc_id, msgtype, MPI_COMM_WORLD); if ( nnz > 0 ) hypre_TFree(isend_buf, HYPRE_MEMORY_HOST); } hypre_TFree(cols, HYPRE_MEMORY_HOST); hypre_TFree(vals, HYPRE_MEMORY_HOST); /* ----------------------------------------------------------- */ /* post receives for all messages */ /* ----------------------------------------------------------- */ for (i = 0; i < nRecv; i++) { MPI_Wait(request+i, &status); } hypre_TFree(request, HYPRE_MEMORY_HOST); hypre_TFree(context, HYPRE_MEMORY_HOST); return 0; } /*****************************************************************************/ /* construct an enlarged overlapped local matrix */ /*---------------------------------------------------------------------------*/ int HYPRE_LSI_DDICTComposeOverlappedMatrix(MH_Matrix *mh_mat, int *total_recv_leng, int **recv_lengths, int **int_buf, double **dble_buf, int **sindex_array, int **sindex_array2, int *offset) { int i, nprocs, mypid, Nrows, *proc_array, *proc_array2; int extNrows, NrowsOffset, *index_array, *index_array2; int nRecv, *recvLeng; double *dble_array; MH_Context *context; /* ---------------------------------------------------------------- */ /* fetch communication information */ /* ---------------------------------------------------------------- */ MPI_Comm_rank(MPI_COMM_WORLD, &mypid); MPI_Comm_size(MPI_COMM_WORLD, &nprocs); /* ---------------------------------------------------------------- */ /* fetch matrix information */ /* ---------------------------------------------------------------- */ nRecv = mh_mat->recvProcCnt; recvLeng = mh_mat->recvLeng; Nrows = mh_mat->Nrows; /* ---------------------------------------------------------------- */ /* compute the enlarged matrix size */ /* ---------------------------------------------------------------- */ (*total_recv_leng) = 0; for ( i = 0; i < nRecv; i++ ) (*total_recv_leng) += recvLeng[i]; extNrows = Nrows + (*total_recv_leng); /* ---------------------------------------------------------------- */ /* compose NrowsOffset and processor offsets proc_array */ /* ---------------------------------------------------------------- */ proc_array = hypre_TAlloc(int, nprocs , HYPRE_MEMORY_HOST); proc_array2 = hypre_TAlloc(int, nprocs , HYPRE_MEMORY_HOST); for ( i = 0; i < nprocs; i++ ) proc_array2[i] = 0; proc_array2[mypid] = Nrows; MPI_Allreduce(proc_array2,proc_array,nprocs,MPI_INT,MPI_SUM,MPI_COMM_WORLD); NrowsOffset = 0; for (i = 0; i < mypid; i++) NrowsOffset += proc_array[i]; for (i = 1; i < nprocs; i++) proc_array[i] += proc_array[i-1]; hypre_TFree(proc_array2, HYPRE_MEMORY_HOST); /* ---------------------------------------------------------------- */ /* compose the column index map (index_array,index_array2) */ /* ---------------------------------------------------------------- */ context = hypre_TAlloc(MH_Context, 1, HYPRE_MEMORY_HOST); context->comm = MPI_COMM_WORLD; context->Amat = mh_mat; dble_array = hypre_TAlloc(double, extNrows , HYPRE_MEMORY_HOST); for (i = Nrows; i < extNrows; i++) dble_array[i] = 0.0; for (i = 0; i < Nrows; i++) dble_array[i] = 1.0 * ( i + NrowsOffset ); MH_ExchBdry(dble_array, context); if ( extNrows-Nrows > 0 ) index_array = hypre_TAlloc(int, (extNrows-Nrows) , HYPRE_MEMORY_HOST); else index_array = NULL; for (i = Nrows; i < extNrows; i++) index_array[i-Nrows] = dble_array[i]; if ( extNrows-Nrows > 0 ) index_array2 = hypre_TAlloc(int, (extNrows-Nrows) , HYPRE_MEMORY_HOST); else index_array2 = NULL; for (i = 0; i < extNrows-Nrows; i++) index_array2[i] = i; hypre_TFree(dble_array, HYPRE_MEMORY_HOST); hypre_TFree(context, HYPRE_MEMORY_HOST); /* ---------------------------------------------------------------- */ /* send the lengths of each row to remote processor */ /* at the end, additional row information should be given */ /* in total_recv_leng, recv_lengths, int_buf, dble_buf */ /* ---------------------------------------------------------------- */ HYPRE_LSI_DDICTGetRowLengths(mh_mat, total_recv_leng, recv_lengths); HYPRE_LSI_DDICTGetOffProcRows(mh_mat, *total_recv_leng, *recv_lengths, NrowsOffset,index_array,index_array2,int_buf, dble_buf); hypre_TFree(proc_array, HYPRE_MEMORY_HOST); HYPRE_LSI_qsort1a(index_array, index_array2, 0, extNrows-Nrows-1); (*sindex_array) = index_array; (*sindex_array2) = index_array2; (*offset) = NrowsOffset; return 0; } /*****************************************************************************/ /* function for doing ICT decomposition */ /*---------------------------------------------------------------------------*/ int HYPRE_LSI_DDICTDecompose(HYPRE_LSI_DDICT *ict_ptr,MH_Matrix *Amat, int total_recv_leng, int *recv_lengths, int *ext_ja, double *ext_aa, int *map, int *map2, int Noffset) { int i, j, row_leng, *mat_ia, *mat_ja, allocated_space, *cols, mypid; int index, ind2, total_nnz, offset, Nrows, extNrows; double *vals, *mat_aa, *rowNorms, tau, rel_tau; MH_Context *context; /* ---------------------------------------------------------------- */ /* fetch ICT parameters */ /* ---------------------------------------------------------------- */ MPI_Comm_rank(ict_ptr->comm, &mypid); tau = ict_ptr->thresh; Nrows = Amat->Nrows; extNrows = Nrows + total_recv_leng; ict_ptr->Nrows = Nrows; ict_ptr->extNrows = extNrows; /* ---------------------------------------------------------------- */ /* allocate temporary storage space */ /* ---------------------------------------------------------------- */ allocated_space = extNrows; cols = hypre_TAlloc(int, allocated_space , HYPRE_MEMORY_HOST); vals = hypre_TAlloc(double, allocated_space , HYPRE_MEMORY_HOST); rowNorms = hypre_TAlloc(double, extNrows , HYPRE_MEMORY_HOST); /* ---------------------------------------------------------------- */ /* compute the storage requirement for the ILU matrix */ /* ---------------------------------------------------------------- */ context = hypre_TAlloc(MH_Context, 1, HYPRE_MEMORY_HOST); context->Amat = Amat; total_nnz = 0; for ( i = 0; i < Nrows; i++ ) { rowNorms[i] = 0.0; while (MH_GetRow(context,1,&i,allocated_space,cols,vals,&row_leng)==0) { hypre_TFree(vals, HYPRE_MEMORY_HOST); hypre_TFree(cols, HYPRE_MEMORY_HOST); allocated_space += 200 + 1; cols = hypre_TAlloc(int, allocated_space , HYPRE_MEMORY_HOST); vals = hypre_TAlloc(double, allocated_space , HYPRE_MEMORY_HOST); } total_nnz += row_leng; for ( j = 0; j < row_leng; j++ ) rowNorms[i] += habs(vals[j]); rowNorms[i] /= extNrows; rowNorms[i] = 1.0; } for ( i = 0; i < total_recv_leng; i++ ) total_nnz += recv_lengths[i]; mat_ia = hypre_TAlloc(int, (extNrows + 1 ) , HYPRE_MEMORY_HOST); mat_ja = hypre_TAlloc(int, total_nnz , HYPRE_MEMORY_HOST); mat_aa = hypre_TAlloc(double, total_nnz , HYPRE_MEMORY_HOST); /* ---------------------------------------------------------------- */ /* construct the orginal matrix in CSR format */ /* ---------------------------------------------------------------- */ total_nnz = 0; mat_ia[0] = 0; for ( i = 0; i < Nrows; i++ ) { rel_tau = tau * rowNorms[i]; MH_GetRow(context,1,&i,allocated_space,cols,vals,&row_leng); for ( j = 0; j < row_leng; j++ ) { if ( cols[j] <= i && habs(vals[j]) > rel_tau ) { mat_aa[total_nnz] = vals[j]; mat_ja[total_nnz++] = cols[j]; } } mat_ia[i+1] = total_nnz; } offset = 0; for ( i = 0; i < total_recv_leng; i++ ) { rowNorms[i+Nrows] = 0.0; for ( j = offset; j < offset+recv_lengths[i]; j++ ) { index = ext_ja[j]; if ( index >= Noffset && index < Noffset+Nrows ) ext_ja[j] = index - Noffset; else { ind2 = HYPRE_LSI_Search(map, index, extNrows-Nrows); if ( ind2 >= 0 ) ext_ja[j] = map2[ind2] + Nrows; else ext_ja[j] = -1; } if ( ext_ja[j] != -1 ) rowNorms[i+Nrows] += habs(ext_aa[j]); } rowNorms[i+Nrows] /= extNrows; rowNorms[i+Nrows] = 1.0; rel_tau = tau * rowNorms[i+Nrows]; for ( j = offset; j < offset+recv_lengths[i]; j++ ) { if (ext_ja[j] != -1 && ext_ja[j] <= Nrows+i && habs(ext_aa[j]) > rel_tau) { mat_aa[total_nnz] = ext_aa[j]; mat_ja[total_nnz++] = ext_ja[j]; } } offset += recv_lengths[i]; mat_ia[Nrows+i+1] = total_nnz; } /* ---------------------------------------------------------------- */ /* clean up a little */ /* ---------------------------------------------------------------- */ hypre_TFree(Amat->rowptr, HYPRE_MEMORY_HOST); hypre_TFree(Amat->colnum, HYPRE_MEMORY_HOST); hypre_TFree(Amat->values, HYPRE_MEMORY_HOST); hypre_TFree(context, HYPRE_MEMORY_HOST); hypre_TFree(cols, HYPRE_MEMORY_HOST); hypre_TFree(vals, HYPRE_MEMORY_HOST); /* ---------------------------------------------------------------- */ /* call ICT factorization */ /* ---------------------------------------------------------------- */ HYPRE_LSI_DDICTFactorize(ict_ptr, mat_aa, mat_ja, mat_ia, rowNorms); hypre_TFree(mat_aa , HYPRE_MEMORY_HOST); hypre_TFree(mat_ia , HYPRE_MEMORY_HOST); hypre_TFree(mat_ja , HYPRE_MEMORY_HOST); hypre_TFree(rowNorms, HYPRE_MEMORY_HOST); if ( ict_ptr->outputLevel > 0 ) { total_nnz = ict_ptr->mat_ja[extNrows]; printf("%d : DDICT number of nonzeros = %d\n",mypid,total_nnz); } return 0; } /*****************************************************************************/ /* function for doing ICT factorization */ /*---------------------------------------------------------------------------*/ int HYPRE_LSI_DDICTFactorize(HYPRE_LSI_DDICT *ict_ptr, double *mat_aa, int *mat_ja, int *mat_ia, double *rowNorms) { int i, j, row_leng, first, row_beg, row_endp1, track_leng, *track_array; int k, mypid, nnz_count, num_small_pivot, printstep, extNrows; int *msr_iptr, *msc_jptr, *msc_jend, rowMax, Lcount, sortcnt, *sortcols; int totalFill, colIndex, index; double fillin, tau, rel_tau, *dble_buf, *msr_aptr, *msc_aptr, absval; double *sortvals, ddata; /* ---------------------------------------------------------------- */ /* fetch ICT parameters */ /* ---------------------------------------------------------------- */ MPI_Comm_rank(ict_ptr->comm, &mypid); tau = ict_ptr->thresh; fillin = ict_ptr->fillin; extNrows = ict_ptr->extNrows; rowMax = 0; for ( i = 0; i < extNrows; i++ ) { row_leng = mat_ia[i+1] - mat_ia[i]; if ( row_leng > rowMax ) rowMax = row_leng; } totalFill = rowMax * (fillin + 1) * extNrows; /* ---------------------------------------------------------------- */ /* allocate permanent and temporary storage */ /* ---------------------------------------------------------------- */ track_array = hypre_TAlloc(int, extNrows , HYPRE_MEMORY_HOST); sortcols = hypre_TAlloc(int, extNrows , HYPRE_MEMORY_HOST); sortvals = hypre_TAlloc(double, extNrows , HYPRE_MEMORY_HOST); dble_buf = hypre_TAlloc(double, extNrows , HYPRE_MEMORY_HOST); msr_iptr = hypre_TAlloc(int, (totalFill+extNrows+1) , HYPRE_MEMORY_HOST); msc_jptr = hypre_TAlloc(int, (totalFill+extNrows+1) , HYPRE_MEMORY_HOST); msc_jend = hypre_TAlloc(int, (extNrows + 1 ) , HYPRE_MEMORY_HOST); msr_aptr = hypre_TAlloc(double, (totalFill+extNrows) , HYPRE_MEMORY_HOST); msc_aptr = hypre_TAlloc(double, (totalFill+extNrows) , HYPRE_MEMORY_HOST); msc_jptr[0] = msc_jend[0] = extNrows + 1; for ( i = 1; i <= extNrows; i++ ) { msc_jptr[i] = msc_jptr[i-1] + rowMax * (fillin + 1); msc_jend[i] = msc_jptr[i]; } for ( i = 0; i < extNrows; i++ ) dble_buf[i] = 0.0; printstep = extNrows / 10; /* ---------------------------------------------------------------- */ /* process the rows */ /* ---------------------------------------------------------------- */ num_small_pivot = 0; nnz_count = extNrows + 1; msr_iptr[0] = nnz_count; for ( i = 0; i < extNrows; i++ ) { if ( i % printstep == 0 && ict_ptr->outputLevel > 0 ) printf("%4d : DDICT Processing row %6d (%6d)\n",mypid,i,extNrows); /* ------------------------------------------------------------- */ /* get the row information */ /* ------------------------------------------------------------- */ track_leng = 0; row_beg = mat_ia[i]; row_endp1 = mat_ia[i+1]; row_leng = row_endp1 - row_beg; first = i; rel_tau = tau * rowNorms[i]; /* ------------------------------------------------------------- */ /* load the row into dble_buf */ /* ------------------------------------------------------------- */ for ( j = row_beg; j < row_endp1; j++ ) { colIndex = mat_ja[j]; if ( colIndex > i ) printf("WARNING (A)\n"); dble_buf[colIndex] = mat_aa[j]; track_array[track_leng++] = colIndex; if ( colIndex < first ) first = colIndex; } Lcount = row_leng * fillin; /* ------------------------------------------------------------- */ /* reduce the row */ /* ------------------------------------------------------------- */ for ( j = first; j < i; j++ ) { if ( habs(dble_buf[j]) > rel_tau ) { ddata = dble_buf[j] * msr_aptr[j]; for ( k = msc_jptr[j]; k < msc_jend[j]; k++ ) { colIndex = msc_jptr[k]; if ( colIndex > j && colIndex < i ) { if ( dble_buf[colIndex] != 0.0 ) dble_buf[colIndex] -= (ddata * msc_aptr[k]); else { dble_buf[colIndex] = - (ddata * msc_aptr[k]); track_array[track_leng++] = colIndex; } } } dble_buf[j] = ddata; } else dble_buf[j] = 0.0; } /* ------------------------------------------------------------- */ /* sort the new nonzeros */ /* ------------------------------------------------------------- */ sortcnt = 0; if ( track_leng > extNrows ) printf("WARNING (B)\n"); for ( j = row_leng; j < track_leng; j++ ) { index = track_array[j]; absval = habs(dble_buf[index]); if ( absval > rel_tau ) { sortcols[sortcnt] = index; sortvals[sortcnt++] = absval * rowNorms[index]; } else dble_buf[index] = 0.0; } if ( sortcnt > Lcount ) { HYPRE_LSI_SplitDSort(sortvals,sortcnt,sortcols,Lcount); for ( j = Lcount; j < sortcnt; j++ ) dble_buf[sortcols[j]] = 0.0; for ( j = 0; j < row_leng; j++ ) { index = track_array[j]; if ( index != i ) { ddata = dble_buf[i] - (dble_buf[index] * dble_buf[index]); if ( ddata > 1.0E-10 ) dble_buf[i] = ddata; else { printf("%d : DDICT negative pivot (%d,%d,%d)\n", mypid, i, j, extNrows); num_small_pivot++; for ( k = j; k < row_leng; k++ ) { index = track_array[k]; dble_buf[index] = 0.0; } Lcount = 0; break; } } } for ( j = 0; j < Lcount; j++ ) { index = sortcols[j]; ddata = dble_buf[i] - (dble_buf[index] * dble_buf[index]); if ( ddata > 1.0E-10 ) dble_buf[i] = ddata; else { printf("%d : (2) DDICT negative pivot (%d,%d,%d)\n", mypid, i, j, extNrows); num_small_pivot++; for ( k = j; k < Lcount; k++ ) { index = sortcols[k]; dble_buf[index] = 0.0; } Lcount = j; break; } } } else { for ( j = 0; j < row_leng; j++ ) { index = track_array[j]; if ( index != i ) { ddata = dble_buf[i] - (dble_buf[index] * dble_buf[index]); if ( ddata > 1.0E-10 ) dble_buf[i] = ddata; else { printf("%d : DDICT negative pivot (%d,%d,%d)\n", mypid, i, j, extNrows); num_small_pivot++; for ( k = j; k < row_leng; k++ ) { index = track_array[k]; dble_buf[index] = 0.0; } sortcnt = 0; break; } } } for ( j = 0; j < sortcnt; j++ ) { index = sortcols[j]; ddata = dble_buf[i] - (dble_buf[index] * dble_buf[index]); if ( ddata > 1.0E-10 ) dble_buf[i] = ddata; else { printf("%d : (2) DDICT negative pivot (%d,%d,%d)\n", mypid, i, j, extNrows); num_small_pivot++; for ( k = j; k < sortcnt; k++ ) { index = sortcols[k]; dble_buf[index] = 0.0; } sortcnt = j; break; } } } if ( dble_buf[i] > 0 ) { if ( dble_buf[i] < 1.0E-10 ) { num_small_pivot++; msc_aptr[i] = msr_aptr[i] = 1.0E5; } else msc_aptr[i] = msr_aptr[i] = 1.0 / sqrt( dble_buf[i] ); dble_buf[i] = 0.0; } else { printf("%4d : ERROR in DDICT - negative or zero pivot.\n", mypid); printf(" L(%4d,%4d) = %e\n", i, i, dble_buf[i]); msc_aptr[i] = msr_aptr[i] = 1.0 / sqrt( - dble_buf[i] ); dble_buf[i] = 0.0; } for ( j = 0; j < track_leng; j++ ) { index = track_array[j]; if ( index < i && dble_buf[index] != 0.0 ) { msr_aptr[nnz_count] = dble_buf[index]; msr_iptr[nnz_count++] = index; colIndex = msc_jend[index]++; msc_aptr[colIndex] = dble_buf[index]; msc_jptr[colIndex] = i; dble_buf[index] = 0.0; } } msr_iptr[i+1] = nnz_count; } if ( nnz_count > totalFill+extNrows ) printf("%4d : DDICT WARNING : buffer overflow (%d,%d)\n",mypid,nnz_count, totalFill+extNrows); if ( ict_ptr->outputLevel > 0 ) { printf("%4d : DDICT number of nonzeros = %d\n",mypid,nnz_count); printf("%4d : DDICT number of small pivots = %d\n",mypid,num_small_pivot); } /* ---------------------------------------------------------- */ /* deallocate temporary storage space */ /* ---------------------------------------------------------- */ hypre_TFree(track_array, HYPRE_MEMORY_HOST); hypre_TFree(sortcols, HYPRE_MEMORY_HOST); hypre_TFree(sortvals, HYPRE_MEMORY_HOST); hypre_TFree(dble_buf, HYPRE_MEMORY_HOST); hypre_TFree(msc_jptr, HYPRE_MEMORY_HOST); hypre_TFree(msc_jend, HYPRE_MEMORY_HOST); hypre_TFree(msc_aptr, HYPRE_MEMORY_HOST); ict_ptr->mat_ja = msr_iptr; ict_ptr->mat_aa = msr_aptr; return 0; } hypre-2.33.0/src/FEI_mv/fei-hypre/HYPRE_LSI_ddict.h000066400000000000000000000030021477326011500214310ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * HYPRE_DDICT interface * *****************************************************************************/ #ifndef __HYPRE_DDICT__ #define __HYPRE_DDICT__ #include #include #include #include #include "utilities/_hypre_utilities.h" #include "parcsr_ls/HYPRE_parcsr_ls.h" #include "parcsr_mv/_hypre_parcsr_mv.h" #ifdef __cplusplus extern "C" { #endif extern int HYPRE_LSI_DDICTCreate( MPI_Comm comm, HYPRE_Solver *solver ); extern int HYPRE_LSI_DDICTDestroy( HYPRE_Solver solver ); extern int HYPRE_LSI_DDICTSetFillin( HYPRE_Solver solver, double fillin); extern int HYPRE_LSI_DDICTSetOutputLevel( HYPRE_Solver solver, int level); extern int HYPRE_LSI_DDICTSetDropTolerance( HYPRE_Solver solver, double thresh); extern int HYPRE_LSI_DDICTSolve( HYPRE_Solver solver, HYPRE_ParCSRMatrix A, HYPRE_ParVector b, HYPRE_ParVector x ); extern int HYPRE_LSI_DDICTSetup( HYPRE_Solver solver, HYPRE_ParCSRMatrix A, HYPRE_ParVector b, HYPRE_ParVector x ); #ifdef __cplusplus } #endif #endif hypre-2.33.0/src/FEI_mv/fei-hypre/HYPRE_LSI_ddilut.c000066400000000000000000002450531477326011500216400ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * HYPRE_DDILUT interface * *****************************************************************************/ #include #include #include #include "utilities/_hypre_utilities.h" #include "HYPRE.h" #include "IJ_mv/HYPRE_IJ_mv.h" #include "parcsr_mv/HYPRE_parcsr_mv.h" #include "parcsr_mv/_hypre_parcsr_mv.h" #include "parcsr_ls/HYPRE_parcsr_ls.h" #include "HYPRE_MHMatrix.h" #ifdef HAVE_ML #include "ml_struct.h" #include "ml_aggregate.h" #endif #include "HYPRE_MHMatrix.h" #include "HYPRE_FEI.h" extern int HYPRE_LSI_MLConstructMHMatrix(HYPRE_ParCSRMatrix,MH_Matrix *, MPI_Comm, int *, MH_Context *); extern int HYPRE_LSI_DDIlutGetRowLengths(MH_Matrix *,int *, int **,MPI_Comm); extern int HYPRE_LSI_DDIlutGetOffProcRows(MH_Matrix *Amat, int leng, int *, int Noffset, int *map, int *map2, int **int_buf, double **dble_buf, MPI_Comm mpi_comm); extern int HYPRE_LSI_DDIlutDecompose(HYPRE_LSI_DDIlut *ilut_ptr,MH_Matrix *Amat, int total_recv_leng, int *recv_lengths, int *ext_ja, double *ext_aa, int *map, int *map2, int Noffset); extern int HYPRE_LSI_DDIlutDecompose2(HYPRE_LSI_DDIlut *ilut_ptr, MH_Matrix *Amat,int total_recv_leng, int *recv_lengths, int *ext_ja, double *ext_aa, int *map, int *map2, int Noffset); extern void HYPRE_LSI_qsort1a(int *, int *, int, int); extern void hypre_qsort0(int *, int, int); extern int HYPRE_LSI_SplitDSort(double*,int,int*,int); extern int MH_ExchBdry(double *, void *); extern int MH_ExchBdryBack(double *, void *, int *, double **, int **); extern int MH_GetRow(void *, int, int *, int, int *, double *, int *); extern int HYPRE_LSI_Cuthill(int, int *, int *, double *, int *, int *); extern int HYPRE_LSI_Search(int *, int, int); #define habs(x) ((x) > 0 ? (x) : -(x)) /*-------------------------------------------------------------------------- * HYPRE_LSI_DDIlutCreate - Return a DDIlut preconditioner object "solver". *--------------------------------------------------------------------------*/ int HYPRE_LSI_DDIlutCreate( MPI_Comm comm, HYPRE_Solver *solver ) { HYPRE_LSI_DDIlut *ilut_ptr; ilut_ptr = hypre_TAlloc(HYPRE_LSI_DDIlut, 1, HYPRE_MEMORY_HOST); if (ilut_ptr == NULL) return 1; ilut_ptr->comm = comm; ilut_ptr->mh_mat = NULL; ilut_ptr->fillin = 0.0; ilut_ptr->thresh = 0.0; /* defaults */ ilut_ptr->mat_ia = NULL; ilut_ptr->mat_ja = NULL; ilut_ptr->mat_aa = NULL; ilut_ptr->outputLevel = 0; ilut_ptr->overlap = 0; ilut_ptr->order_array = NULL; ilut_ptr->reorder_array = NULL; ilut_ptr->reorder = 0; *solver = (HYPRE_Solver) ilut_ptr; return 0; } /*-------------------------------------------------------------------------- * HYPRE_LSI_DDIlutDestroy - Destroy a DDIlut object. *--------------------------------------------------------------------------*/ int HYPRE_LSI_DDIlutDestroy( HYPRE_Solver solver ) { int i; HYPRE_LSI_DDIlut *ilut_ptr; ilut_ptr = (HYPRE_LSI_DDIlut *) solver; hypre_TFree(ilut_ptr->mat_ia, HYPRE_MEMORY_HOST); hypre_TFree(ilut_ptr->mat_ja, HYPRE_MEMORY_HOST); hypre_TFree(ilut_ptr->mat_aa, HYPRE_MEMORY_HOST); if ( ilut_ptr->mh_mat != NULL ) { hypre_TFree(ilut_ptr->mh_mat->sendProc, HYPRE_MEMORY_HOST); hypre_TFree(ilut_ptr->mh_mat->sendLeng, HYPRE_MEMORY_HOST); hypre_TFree(ilut_ptr->mh_mat->recvProc, HYPRE_MEMORY_HOST); hypre_TFree(ilut_ptr->mh_mat->recvLeng, HYPRE_MEMORY_HOST); for ( i = 0; i < ilut_ptr->mh_mat->sendProcCnt; i++ ) hypre_TFree(ilut_ptr->mh_mat->sendList[i], HYPRE_MEMORY_HOST); hypre_TFree(ilut_ptr->mh_mat->sendList, HYPRE_MEMORY_HOST); hypre_TFree(ilut_ptr->mh_mat, HYPRE_MEMORY_HOST); } ilut_ptr->mh_mat = NULL; hypre_TFree(ilut_ptr->order_array, HYPRE_MEMORY_HOST); hypre_TFree(ilut_ptr->reorder_array, HYPRE_MEMORY_HOST); hypre_TFree(ilut_ptr, HYPRE_MEMORY_HOST); return 0; } /*-------------------------------------------------------------------------- * HYPRE_LSI_DDIlutSetFillin - Set the fill-in parameter. *--------------------------------------------------------------------------*/ int HYPRE_LSI_DDIlutSetFillin(HYPRE_Solver solver, double fillin) { HYPRE_LSI_DDIlut *ilut_ptr = (HYPRE_LSI_DDIlut *) solver; ilut_ptr->fillin = fillin; return 0; } /*-------------------------------------------------------------------------- * HYPRE_LSI_DDIlutSetDropTolerance - Set the threshold for dropping *--------------------------------------------------------------------------*/ int HYPRE_LSI_DDIlutSetDropTolerance(HYPRE_Solver solver, double thresh) { HYPRE_LSI_DDIlut *ilut_ptr = (HYPRE_LSI_DDIlut *) solver; ilut_ptr->thresh = thresh; return 0; } /*-------------------------------------------------------------------------- * HYPRE_LSI_DDIlutSetOverlap - turn on overlap *--------------------------------------------------------------------------*/ int HYPRE_LSI_DDIlutSetOverlap(HYPRE_Solver solver) { HYPRE_LSI_DDIlut *ilut_ptr = (HYPRE_LSI_DDIlut *) solver; ilut_ptr->overlap = 1; return 0; } /*-------------------------------------------------------------------------- * HYPRE_LSI_DDIlutSetReorder - turn on reordering *--------------------------------------------------------------------------*/ int HYPRE_LSI_DDIlutSetReorder(HYPRE_Solver solver) { HYPRE_LSI_DDIlut *ilut_ptr = (HYPRE_LSI_DDIlut *) solver; ilut_ptr->reorder = 1; return 0; } /*-------------------------------------------------------------------------- * HYPRE_LSI_DDIlutSetOutputLevel - Set debug level *--------------------------------------------------------------------------*/ int HYPRE_LSI_DDIlutSetOutputLevel(HYPRE_Solver solver, int level) { HYPRE_LSI_DDIlut *ilut_ptr = (HYPRE_LSI_DDIlut *) solver; ilut_ptr->outputLevel = level; return 0; } /*-------------------------------------------------------------------------- * HYPRE_LSI_DDIlutSolve - Solve function for DDILUT. *--------------------------------------------------------------------------*/ int HYPRE_LSI_DDIlutSolve( HYPRE_Solver solver, HYPRE_ParCSRMatrix A, HYPRE_ParVector b, HYPRE_ParVector x ) { int i, j, *idiag, Nrows, extNrows, *mat_ia, *mat_ja; int column, *order_list, *reorder_list, order_flag; double *rhs, *soln, *dbuffer, ddata, *mat_aa; HYPRE_LSI_DDIlut *ilut_ptr = (HYPRE_LSI_DDIlut *) solver; MH_Context *context; MPI_Comm mpi_comm; rhs = hypre_VectorData(hypre_ParVectorLocalVector((hypre_ParVector *) b)); soln = hypre_VectorData(hypre_ParVectorLocalVector((hypre_ParVector *) x)); Nrows = ilut_ptr->Nrows; extNrows = ilut_ptr->extNrows; mat_ia = ilut_ptr->mat_ia; mat_ja = ilut_ptr->mat_ja; mat_aa = ilut_ptr->mat_aa; order_list = ilut_ptr->order_array; reorder_list = ilut_ptr->reorder_array; order_flag = ilut_ptr->reorder; dbuffer = hypre_TAlloc(double, extNrows , HYPRE_MEMORY_HOST); idiag = hypre_TAlloc(int, extNrows , HYPRE_MEMORY_HOST); for ( i = 0; i < Nrows; i++ ) dbuffer[i] = rhs[i]; HYPRE_ParCSRMatrixGetComm(A, &mpi_comm); context = hypre_TAlloc(MH_Context, 1, HYPRE_MEMORY_HOST); context->Amat = ilut_ptr->mh_mat; context->comm = mpi_comm; if ( extNrows > Nrows ) MH_ExchBdry(dbuffer, context); if ( order_flag ) for ( i = 0; i < Nrows; i++ ) dbuffer[i] = rhs[order_list[i]]; else for ( i = 0; i < Nrows; i++ ) dbuffer[i] = rhs[i]; for ( i = 0; i < extNrows; i++ ) { ddata = 0.0; for ( j = mat_ia[i]; j < mat_ia[i+1]; j++ ) { column = mat_ja[j]; if ( column == i ) { idiag[i] = j; break;} ddata += mat_aa[j] * dbuffer[column]; } dbuffer[i] -= ddata; } for ( i = extNrows-1; i >= 0; i-- ) { ddata = 0.0; for ( j = idiag[i]+1; j < mat_ia[i+1]; j++ ) { column = mat_ja[j]; ddata += mat_aa[j] * dbuffer[column]; } dbuffer[i] -= ddata; dbuffer[i] /= mat_aa[idiag[i]]; } if ( order_flag ) for ( i = 0; i < Nrows; i++ ) soln[i] = dbuffer[reorder_list[i]]; else for ( i = 0; i < Nrows; i++ ) soln[i] = dbuffer[i]; hypre_TFree(dbuffer, HYPRE_MEMORY_HOST); hypre_TFree(idiag, HYPRE_MEMORY_HOST); hypre_TFree(context, HYPRE_MEMORY_HOST); return 0; } /*-------------------------------------------------------------------------- * HYPRE_LSI_DDIlutSetup - Set up function for LSI_DDIlut. *--------------------------------------------------------------------------*/ int HYPRE_LSI_DDIlutSetup(HYPRE_Solver solver, HYPRE_ParCSRMatrix A_csr, HYPRE_ParVector b, HYPRE_ParVector x ) { int i, j, offset, total_recv_leng, *recv_lengths=NULL; int *int_buf=NULL, mypid, nprocs, *parray; int *map=NULL, *map2=NULL, *row_partition=NULL,*parray2; double *dble_buf=NULL; HYPRE_LSI_DDIlut *ilut_ptr = (HYPRE_LSI_DDIlut *) solver; MH_Context *context=NULL; MH_Matrix *mh_mat=NULL; MPI_Comm mpi_comm; /* ---------------------------------------------------------------- */ /* get the row information in my processors */ /* ---------------------------------------------------------------- */ HYPRE_ParCSRMatrixGetComm(A_csr, &mpi_comm); MPI_Comm_rank(mpi_comm, &mypid); MPI_Comm_size(mpi_comm, &nprocs); HYPRE_ParCSRMatrixGetRowPartitioning(A_csr, &row_partition); /* ---------------------------------------------------------------- */ /* convert the incoming CSR matrix into a MH matrix */ /* ---------------------------------------------------------------- */ context = hypre_TAlloc(MH_Context, 1, HYPRE_MEMORY_HOST); context->comm = mpi_comm; context->globalEqns = row_partition[nprocs]; context->partition = hypre_TAlloc(int, (nprocs+1), HYPRE_MEMORY_HOST); for (i=0; i<=nprocs; i++) context->partition[i] = row_partition[i]; hypre_TFree( row_partition , HYPRE_MEMORY_HOST); mh_mat = hypre_TAlloc( MH_Matrix, 1, HYPRE_MEMORY_HOST); context->Amat = mh_mat; HYPRE_LSI_MLConstructMHMatrix(A_csr,mh_mat,mpi_comm, context->partition,context); /* ---------------------------------------------------------------- */ /* compose the enlarged overlapped local matrix */ /* ---------------------------------------------------------------- */ if ( ilut_ptr->overlap != 0 ) { HYPRE_LSI_DDIlutComposeOverlappedMatrix(mh_mat, &total_recv_leng, &recv_lengths, &int_buf, &dble_buf, &map, &map2,&offset, mpi_comm); } else { total_recv_leng = 0; recv_lengths = NULL; int_buf = NULL; dble_buf = NULL; map = NULL; map2 = NULL; parray = hypre_TAlloc(int, nprocs , HYPRE_MEMORY_HOST); parray2 = hypre_TAlloc(int, nprocs , HYPRE_MEMORY_HOST); for ( i = 0; i < nprocs; i++ ) parray2[i] = 0; parray2[mypid] = mh_mat->Nrows; MPI_Allreduce(parray2,parray,nprocs,MPI_INT,MPI_SUM,mpi_comm); offset = 0; for (i = 0; i < mypid; i++) offset += parray[i]; hypre_TFree(parray, HYPRE_MEMORY_HOST); hypre_TFree(parray2, HYPRE_MEMORY_HOST); } /* ---------------------------------------------------------------- */ /* perform ILUT decomposition on local matrix */ /* ---------------------------------------------------------------- */ if ( ilut_ptr->mat_ia == NULL ) HYPRE_LSI_DDIlutDecompose(ilut_ptr,mh_mat,total_recv_leng,recv_lengths, int_buf, dble_buf, map,map2, offset); else { HYPRE_LSI_DDIlutDecompose2(ilut_ptr,mh_mat,total_recv_leng,recv_lengths, int_buf, dble_buf, map,map2, offset); if ( mypid == 0 && ilut_ptr->outputLevel >= 1 ) printf("DDILUT : preconditioner pattern reused.\n"); } if ( mypid == 0 && ilut_ptr->outputLevel > 2 ) { for ( i = 0; i < ilut_ptr->extNrows; i++ ) for ( j = ilut_ptr->mat_ia[i]; j < ilut_ptr->mat_ia[i+1]; j++ ) printf("LA(%d,%d) = %e;\n", i+1, ilut_ptr->mat_ja[j]+1, ilut_ptr->mat_aa[j]); } ilut_ptr->mh_mat = mh_mat; hypre_TFree(mh_mat->rowptr, HYPRE_MEMORY_HOST); hypre_TFree(mh_mat->colnum, HYPRE_MEMORY_HOST); hypre_TFree(mh_mat->values, HYPRE_MEMORY_HOST); hypre_TFree(map, HYPRE_MEMORY_HOST); hypre_TFree(map2, HYPRE_MEMORY_HOST); hypre_TFree(int_buf, HYPRE_MEMORY_HOST); hypre_TFree(dble_buf , HYPRE_MEMORY_HOST); hypre_TFree(recv_lengths, HYPRE_MEMORY_HOST); hypre_TFree(context->partition, HYPRE_MEMORY_HOST); hypre_TFree(context, HYPRE_MEMORY_HOST); return 0; } /*****************************************************************************/ /* subroutines used for constructing overlapped matrix */ /*****************************************************************************/ int HYPRE_LSI_DDIlutGetRowLengths(MH_Matrix *Amat, int *leng, int **recv_leng, MPI_Comm mpi_comm) { int i, j, m, mypid, index, *temp_list, allocated_space, length; int nRecv, *recvProc, *recvLeng, *cols, total_recv, mtype, msgtype; int nSend, *sendProc, *sendLeng, **sendList, proc_id, offset; double *vals; MPI_Request *Request; MPI_Status status; MH_Context *context; /* ---------------------------------------------------------------- */ /* fetch communication information */ /* ---------------------------------------------------------------- */ MPI_Comm_rank(mpi_comm, &mypid); nRecv = Amat->recvProcCnt; nSend = Amat->sendProcCnt; recvProc = Amat->recvProc; recvLeng = Amat->recvLeng; sendProc = Amat->sendProc; sendLeng = Amat->sendLeng; sendList = Amat->sendList; total_recv = 0; for ( i = 0; i < nRecv; i++ ) total_recv += recvLeng[i]; (*leng) = total_recv; if ( nRecv <= 0 ) (*recv_leng) = NULL; MPI_Barrier(mpi_comm); /* ---------------------------------------------------------------- */ /* post receives for all messages */ /* ---------------------------------------------------------------- */ (*recv_leng) = hypre_TAlloc(int, total_recv , HYPRE_MEMORY_HOST); if (nRecv > 0) Request = hypre_TAlloc(MPI_Request, nRecv, HYPRE_MEMORY_HOST); offset = 0; mtype = 2001; for (i = 0; i < nRecv; i++) { proc_id = recvProc[i]; msgtype = mtype; length = recvLeng[i]; MPI_Irecv((void *) &((*recv_leng)[offset]), length, MPI_INT, proc_id, msgtype, mpi_comm, &Request[i]); offset += length; } /* ---------------------------------------------------------------- */ /* write out all messages */ /* ---------------------------------------------------------------- */ context = hypre_TAlloc(MH_Context, 1, HYPRE_MEMORY_HOST); context->Amat = Amat; allocated_space = 100; cols = hypre_TAlloc(int, allocated_space , HYPRE_MEMORY_HOST); vals = hypre_TAlloc(double, allocated_space , HYPRE_MEMORY_HOST); for (i = 0; i < nSend; i++) { proc_id = sendProc[i]; length = sendLeng[i]; temp_list = hypre_TAlloc(int, sendLeng[i] , HYPRE_MEMORY_HOST); for (j = 0; j < length; j++) { index = sendList[i][j]; while (MH_GetRow(context,1,&index,allocated_space,cols,vals,&m)==0) { hypre_TFree(cols, HYPRE_MEMORY_HOST); hypre_TFree(vals, HYPRE_MEMORY_HOST); allocated_space += 200 + 1; cols = hypre_TAlloc(int, allocated_space , HYPRE_MEMORY_HOST); vals = hypre_TAlloc(double, allocated_space , HYPRE_MEMORY_HOST); } temp_list[j] = m; } msgtype = mtype; MPI_Send((void*)temp_list,length,MPI_INT,proc_id,msgtype,mpi_comm); hypre_TFree(temp_list, HYPRE_MEMORY_HOST); } hypre_TFree(cols, HYPRE_MEMORY_HOST); hypre_TFree(vals, HYPRE_MEMORY_HOST); hypre_TFree(context, HYPRE_MEMORY_HOST); /* ---------------------------------------------------------------- */ /* wait for messages */ /* ---------------------------------------------------------------- */ for ( i = 0; i < nRecv; i++ ) { MPI_Wait( &Request[i], &status ); } if (nRecv > 0) hypre_TFree(Request, HYPRE_MEMORY_HOST); return 0; } /*****************************************************************************/ /* needed for overlapped smoothers */ /*****************************************************************************/ int HYPRE_LSI_DDIlutGetOffProcRows(MH_Matrix *Amat, int leng, int *recv_leng, int Noffset, int *map, int *map2, int **int_buf, double **dble_buf, MPI_Comm mpi_comm) { int i, j, k, m, length, offset, allocated_space, proc_id; int nRecv, nSend, *recvProc, *sendProc, total_recv, mtype, msgtype; int *sendLeng, *recvLeng, **sendList, *cols, *isend_buf, Nrows; int nnz, nnz_offset, index, mypid; double *vals, *send_buf; MPI_Request *request; MPI_Status status; MH_Context *context; /* ---------------------------------------------------------------- */ /* fetch communication information */ /* ---------------------------------------------------------------- */ MPI_Comm_rank(mpi_comm, &mypid); Nrows = Amat->Nrows; nRecv = Amat->recvProcCnt; nSend = Amat->sendProcCnt; recvProc = Amat->recvProc; recvLeng = Amat->recvLeng; sendProc = Amat->sendProc; sendLeng = Amat->sendLeng; sendList = Amat->sendList; if ( nRecv <= 0 ) { (*int_buf) = NULL; (*dble_buf) = NULL;} total_recv = 0; for ( i = 0; i < leng; i++ ) total_recv += recv_leng[i]; /* ---------------------------------------------------------------- */ /* allocate buffer space */ /* ---------------------------------------------------------------- */ if ( nRecv > 0 ) request = hypre_TAlloc(MPI_Request , nRecv, HYPRE_MEMORY_HOST); else request = NULL; if ( total_recv > 0 ) { (*int_buf) = hypre_TAlloc(int, total_recv , HYPRE_MEMORY_HOST); (*dble_buf) = hypre_TAlloc(double, total_recv , HYPRE_MEMORY_HOST); } /* ---------------------------------------------------------------- */ /* post receives for all messages */ /* ---------------------------------------------------------------- */ offset = 0; mtype = 2002; nnz_offset = 0; for (i = 0; i < nRecv; i++) { proc_id = recvProc[i]; msgtype = mtype; length = recvLeng[i]; nnz = 0; for (j = 0; j < length; j++) nnz += recv_leng[offset+j]; MPI_Irecv((void *) &((*dble_buf)[nnz_offset]), nnz, MPI_DOUBLE, proc_id, msgtype, mpi_comm, request+i); offset += length; nnz_offset += nnz; } /* ---------------------------------------------------------------- */ /* send rows to other processors */ /* ---------------------------------------------------------------- */ context = hypre_TAlloc(MH_Context, 1, HYPRE_MEMORY_HOST); context->Amat = Amat; mtype = 2002; allocated_space = 100; cols = hypre_TAlloc(int, allocated_space , HYPRE_MEMORY_HOST); vals = hypre_TAlloc(double, allocated_space , HYPRE_MEMORY_HOST); for (i = 0; i < nSend; i++) { proc_id = sendProc[i]; length = sendLeng[i]; nnz = 0; for (j = 0; j < length; j++) { index = sendList[i][j]; while (MH_GetRow(context,1,&index,allocated_space,cols,vals,&m)==0) { hypre_TFree(cols, HYPRE_MEMORY_HOST); hypre_TFree(vals, HYPRE_MEMORY_HOST); allocated_space += 200 + 1; cols = hypre_TAlloc(int, allocated_space , HYPRE_MEMORY_HOST); vals = hypre_TAlloc(double, allocated_space , HYPRE_MEMORY_HOST); } nnz += m; } if ( nnz > 0 ) send_buf = hypre_TAlloc(double, nnz , HYPRE_MEMORY_HOST); offset = 0; for (j = 0; j < length; j++) { index = sendList[i][j]; MH_GetRow(context,1,&index,allocated_space,cols,vals,&m); for (k = 0; k < m; k++) send_buf[offset+k] = vals[k]; offset += m; } msgtype = mtype; MPI_Send((void*) send_buf, nnz, MPI_DOUBLE, proc_id, msgtype, mpi_comm); if ( nnz > 0 ) hypre_TFree(send_buf, HYPRE_MEMORY_HOST); } hypre_TFree(cols, HYPRE_MEMORY_HOST); hypre_TFree(vals, HYPRE_MEMORY_HOST); /* ---------------------------------------------------------------- */ /* wait for all messages */ /* ---------------------------------------------------------------- */ for (i = 0; i < nRecv; i++) { MPI_Wait(request+i, &status); } /* ----------------------------------------------------------- */ /* post receives for all messages */ /* ----------------------------------------------------------- */ mtype = 2003; offset = 0; nnz_offset = 0; for (i = 0; i < nRecv; i++) { proc_id = recvProc[i]; msgtype = mtype; length = recvLeng[i]; nnz = 0; for (j = 0; j < length; j++) nnz += recv_leng[offset+j]; MPI_Irecv((void *) &((*int_buf)[nnz_offset]), nnz, MPI_INT, proc_id, msgtype, mpi_comm, request+i); offset += length; nnz_offset += nnz; } /* ---------------------------------------------------------------- */ /* send rows to other processors */ /* ---------------------------------------------------------------- */ mtype = 2003; cols = hypre_TAlloc(int, allocated_space , HYPRE_MEMORY_HOST); vals = hypre_TAlloc(double, allocated_space , HYPRE_MEMORY_HOST); for (i = 0; i < nSend; i++) { proc_id = sendProc[i]; length = sendLeng[i]; nnz = 0; for (j = 0; j < length; j++) { index = sendList[i][j]; MH_GetRow(context,1,&index,allocated_space,cols,vals,&m); nnz += m; } if ( nnz > 0 ) isend_buf = hypre_TAlloc(int, nnz , HYPRE_MEMORY_HOST); offset = 0; for (j = 0; j < length; j++) { index = sendList[i][j]; MH_GetRow(context,1,&index,allocated_space,cols,vals,&m); for (k = 0; k < m; k++) { if ( cols[k] < Nrows ) isend_buf[offset+k] = cols[k] + Noffset; else isend_buf[offset+k] = map[cols[k]-Nrows]; } offset += m; } msgtype = mtype; MPI_Send((void*) isend_buf, nnz, MPI_INT, proc_id, msgtype, mpi_comm); if ( nnz > 0 ) hypre_TFree(isend_buf, HYPRE_MEMORY_HOST); } hypre_TFree(cols, HYPRE_MEMORY_HOST); hypre_TFree(vals, HYPRE_MEMORY_HOST); /* ----------------------------------------------------------- */ /* post receives for all messages */ /* ----------------------------------------------------------- */ for (i = 0; i < nRecv; i++) { MPI_Wait(request+i, &status); } hypre_TFree(request, HYPRE_MEMORY_HOST); hypre_TFree(context, HYPRE_MEMORY_HOST); return 0; } /*****************************************************************************/ /* construct an enlarged overlapped local matrix */ /*****************************************************************************/ int HYPRE_LSI_DDIlutComposeOverlappedMatrix(MH_Matrix *mh_mat, int *total_recv_leng, int **recv_lengths, int **int_buf, double **dble_buf, int **sindex_array, int **sindex_array2, int *offset, MPI_Comm mpi_comm) { int i, nprocs, mypid, Nrows, *proc_array, *proc_array2; int extNrows, NrowsOffset, *index_array, *index_array2; int nRecv, *recvLeng; double *dble_array; MH_Context *context; /* ---------------------------------------------------------------- */ /* fetch communication information */ /* ---------------------------------------------------------------- */ MPI_Comm_rank(mpi_comm, &mypid); MPI_Comm_size(mpi_comm, &nprocs); /* ---------------------------------------------------------------- */ /* fetch matrix information */ /* ---------------------------------------------------------------- */ nRecv = mh_mat->recvProcCnt; recvLeng = mh_mat->recvLeng; Nrows = mh_mat->Nrows; /* ---------------------------------------------------------------- */ /* compute the enlarged matrix size */ /* ---------------------------------------------------------------- */ (*total_recv_leng) = 0; for ( i = 0; i < nRecv; i++ ) (*total_recv_leng) += recvLeng[i]; extNrows = Nrows + (*total_recv_leng); /* ---------------------------------------------------------------- */ /* compose NrowsOffset and processor offsets proc_array */ /* ---------------------------------------------------------------- */ proc_array = hypre_TAlloc(int, nprocs , HYPRE_MEMORY_HOST); proc_array2 = hypre_TAlloc(int, nprocs , HYPRE_MEMORY_HOST); for ( i = 0; i < nprocs; i++ ) proc_array2[i] = 0; proc_array2[mypid] = Nrows; MPI_Allreduce(proc_array2,proc_array,nprocs,MPI_INT,MPI_SUM,mpi_comm); NrowsOffset = 0; for (i = 0; i < mypid; i++) NrowsOffset += proc_array[i]; for (i = 1; i < nprocs; i++) proc_array[i] += proc_array[i-1]; hypre_TFree(proc_array2, HYPRE_MEMORY_HOST); /* ---------------------------------------------------------------- */ /* compose the column index map (index_array,index_array2) */ /* ---------------------------------------------------------------- */ context = hypre_TAlloc(MH_Context, 1, HYPRE_MEMORY_HOST); context->comm = mpi_comm; context->Amat = mh_mat; dble_array = hypre_TAlloc(double, extNrows , HYPRE_MEMORY_HOST); for (i = Nrows; i < extNrows; i++) dble_array[i] = 0.0; for (i = 0; i < Nrows; i++) dble_array[i] = 1.0 * ( i + NrowsOffset ); MH_ExchBdry(dble_array, context); if ( extNrows-Nrows > 0 ) index_array = hypre_TAlloc(int, (extNrows-Nrows) , HYPRE_MEMORY_HOST); else index_array = NULL; for (i = Nrows; i < extNrows; i++) index_array[i-Nrows] = dble_array[i]; if ( extNrows-Nrows > 0 ) index_array2 = hypre_TAlloc(int, (extNrows-Nrows) , HYPRE_MEMORY_HOST); else index_array2 = NULL; for (i = 0; i < extNrows-Nrows; i++) index_array2[i] = i; hypre_TFree(dble_array, HYPRE_MEMORY_HOST); hypre_TFree(context, HYPRE_MEMORY_HOST); /* ---------------------------------------------------------------- */ /* send the lengths of each row to remote processor */ /* at the end, additional row information should be given */ /* in total_recv_leng, recv_lengths, int_buf, dble_buf */ /* ---------------------------------------------------------------- */ HYPRE_LSI_DDIlutGetRowLengths(mh_mat,total_recv_leng,recv_lengths,mpi_comm); HYPRE_LSI_DDIlutGetOffProcRows(mh_mat, *total_recv_leng, *recv_lengths, NrowsOffset,index_array,index_array2,int_buf, dble_buf,mpi_comm); hypre_TFree(proc_array, HYPRE_MEMORY_HOST); HYPRE_LSI_qsort1a(index_array, index_array2, 0, extNrows-Nrows-1); (*sindex_array) = index_array; (*sindex_array2) = index_array2; (*offset) = NrowsOffset; return 0; } /*****************************************************************************/ /* function for doing ILUT decomposition */ /* ( based on ILU(0) + ILUT based on magnitude) */ /*****************************************************************************/ int HYPRE_LSI_DDIlutDecompose(HYPRE_LSI_DDIlut *ilut_ptr,MH_Matrix *Amat, int total_recv_leng, int *recv_lengths, int *ext_ja, double *ext_aa, int *map, int *map2, int Noffset) { int *mat_ia, *mat_ja, i, m, allocated_space, *cols, mypid; int index, first, Lcount, Ucount, j, k, total_nnz; int sortcnt, colIndex, offset, nnz_count, Nrows, extNrows; int *track_array, track_leng, num_small_pivot, printstep, nnz_row; int *sortcols, *Amat_ia, *Amat_ja, *order_list, *reorder_list; int max_nnz_row, touch_cnt=0, order_flag; double *vals, ddata, *mat_aa, *diagonal, *rowNorms, *Norm2; double *dble_buf, fillin, tau, rel_tau, *sortvals, *Amat_aa; MH_Context *context; /* ---------------------------------------------------------------- */ /* fetch ILUT parameters */ /* ---------------------------------------------------------------- */ MPI_Comm_rank(ilut_ptr->comm, &mypid); fillin = ilut_ptr->fillin; tau = ilut_ptr->thresh; Nrows = Amat->Nrows; extNrows = Nrows + total_recv_leng; ilut_ptr->Nrows = Nrows; ilut_ptr->extNrows = extNrows; order_flag = ilut_ptr->reorder; /* ---------------------------------------------------------------- */ /* allocate temporary storage space */ /* ---------------------------------------------------------------- */ allocated_space = extNrows; cols = hypre_TAlloc(int, allocated_space , HYPRE_MEMORY_HOST); vals = hypre_TAlloc(double, allocated_space , HYPRE_MEMORY_HOST); sortcols = hypre_TAlloc(int, extNrows , HYPRE_MEMORY_HOST); sortvals = hypre_TAlloc(double, extNrows , HYPRE_MEMORY_HOST); dble_buf = hypre_TAlloc(double, extNrows , HYPRE_MEMORY_HOST); diagonal = hypre_TAlloc(double, extNrows , HYPRE_MEMORY_HOST); rowNorms = hypre_TAlloc(double, extNrows , HYPRE_MEMORY_HOST); /* ---------------------------------------------------------------- */ /* compute the storage requirement for the ILU matrix */ /* ---------------------------------------------------------------- */ context = hypre_TAlloc(MH_Context, 1, HYPRE_MEMORY_HOST); context->Amat = Amat; total_nnz = 0; for ( i = 0; i < Nrows; i++ ) { rowNorms[i] = 0.0; while (MH_GetRow(context,1,&i,allocated_space,cols,vals,&m)==0) { hypre_TFree(vals, HYPRE_MEMORY_HOST); hypre_TFree(cols, HYPRE_MEMORY_HOST); allocated_space += 200 + 1; cols = hypre_TAlloc(int, allocated_space , HYPRE_MEMORY_HOST); vals = hypre_TAlloc(double, allocated_space , HYPRE_MEMORY_HOST); } total_nnz += m; for ( j = 0; j < m; j++ ) rowNorms[i] += habs(vals[j]); rowNorms[i] /= extNrows; } hypre_TFree(vals, HYPRE_MEMORY_HOST); hypre_TFree(cols, HYPRE_MEMORY_HOST); /* ---------------------------------------------------------------- */ /* permute the matrix */ /* ---------------------------------------------------------------- */ Amat_ia = hypre_TAlloc(int, (Nrows+1) , HYPRE_MEMORY_HOST); Amat_ja = hypre_TAlloc(int, total_nnz , HYPRE_MEMORY_HOST); Amat_aa = hypre_TAlloc(double, total_nnz , HYPRE_MEMORY_HOST); total_nnz = 0; Amat_ia[0] = total_nnz; for ( i = 0; i < Nrows; i++ ) { MH_GetRow(context,1,&i,allocated_space,&Amat_ja[total_nnz], &Amat_aa[total_nnz],&m); total_nnz += m; Amat_ia[i+1] = total_nnz; } if ( order_flag ) { order_list = hypre_TAlloc(int, Nrows , HYPRE_MEMORY_HOST); reorder_list = hypre_TAlloc(int, Nrows , HYPRE_MEMORY_HOST); for ( i = 0; i < Nrows; i++ ) order_list[i] = reorder_list[i] = i; HYPRE_LSI_Cuthill(Nrows,Amat_ia,Amat_ja,Amat_aa,order_list,reorder_list); ilut_ptr->order_array = order_list; ilut_ptr->reorder_array = reorder_list; Norm2 = hypre_TAlloc(double, Nrows , HYPRE_MEMORY_HOST); for ( i = 0; i < Nrows; i++ ) Norm2[i] = rowNorms[order_list[i]]; hypre_TFree(rowNorms, HYPRE_MEMORY_HOST); rowNorms = Norm2; } /* for ( i = 0; i < Nrows; i++ ) for ( j = Amat_ia[i]; j < Amat_ia[i+1]; j++ ) printf("%10d %10d %25.16e\n", i+1, Amat_ja[j]+1, Amat_aa[j]); */ /* ---------------------------------------------------------------- */ /* allocate space */ /* ---------------------------------------------------------------- */ for ( i = 0; i < total_recv_leng; i++ ) total_nnz += recv_lengths[i]; total_nnz = (int) ((double) total_nnz * (fillin + 1.0)); ilut_ptr->mat_ia = hypre_TAlloc(int, (extNrows + 1 ) , HYPRE_MEMORY_HOST); ilut_ptr->mat_ja = hypre_TAlloc(int, total_nnz , HYPRE_MEMORY_HOST); ilut_ptr->mat_aa = hypre_TAlloc(double, total_nnz , HYPRE_MEMORY_HOST); mat_ia = ilut_ptr->mat_ia; mat_ja = ilut_ptr->mat_ja; mat_aa = ilut_ptr->mat_aa; offset = 0; max_nnz_row = 0; for ( i = 0; i < total_recv_leng; i++ ) { rowNorms[i+Nrows] = 0.0; nnz_row = 0; for ( j = offset; j < offset+recv_lengths[i]; j++ ) { index = ext_ja[j]; if ( index >= Noffset && index < Noffset+Nrows ) ext_ja[j] = index - Noffset; else { m = HYPRE_LSI_Search(map, index, extNrows-Nrows); if ( m >= 0 ) ext_ja[j] = map2[m] + Nrows; else ext_ja[j] = -1; } if ( ext_ja[j] != -1 ) { rowNorms[i+Nrows] += habs(ext_aa[j]); nnz_row++; } } if ( nnz_row > max_nnz_row ) max_nnz_row = nnz_row; rowNorms[i+Nrows] /= extNrows; offset += recv_lengths[i]; } /* ---------------------------------------------------------------- */ /* process the first Nrows */ /* ---------------------------------------------------------------- */ num_small_pivot = 0; nnz_count = 0; mat_ia[0] = 0; track_array = hypre_TAlloc(int, extNrows , HYPRE_MEMORY_HOST); for ( i = 0; i < extNrows; i++ ) dble_buf[i] = 0.0; printstep = extNrows / 10; for ( i = 0; i < Nrows; i++ ) { if ( i % printstep == 0 && ilut_ptr->outputLevel > 0 ) printf("%4d : 0DDILUT Processing row %d(%d)\n",mypid,i,extNrows); track_leng = 0; cols = &(Amat_ja[Amat_ia[i]]); vals = &(Amat_aa[Amat_ia[i]]); m = Amat_ia[i+1] - Amat_ia[i]; for ( j = 0; j < m; j++ ) { if ( cols[j] < extNrows ) { dble_buf[cols[j]] = vals[j]; track_array[track_leng++] = cols[j]; } } Lcount = Ucount = first = 0; first = extNrows; for ( j = 0; j < track_leng; j++ ) { index = track_array[j]; if ( dble_buf[index] != 0 ) { if ( index < i ) Lcount++; else if ( index > i ) Ucount++; else if ( index == i ) diagonal[i] = dble_buf[index]; if ( index < first ) first = index; } } Lcount = Lcount * fillin; Ucount = Ucount * fillin; rel_tau = tau * rowNorms[i]; for ( j = first; j < i; j++ ) { if ( habs(dble_buf[j]) > rel_tau ) { ddata = dble_buf[j] / diagonal[j]; touch_cnt++; for ( k = mat_ia[j]; k < mat_ia[j+1]; k++ ) { colIndex = mat_ja[k]; if ( colIndex > j ) { if ( dble_buf[colIndex] != 0.0 ) dble_buf[colIndex] -= (ddata * mat_aa[k]); else { dble_buf[colIndex] = - (ddata * mat_aa[k]); if ( dble_buf[colIndex] != 0.0 ) track_array[track_leng++] = colIndex; } } } dble_buf[j] = ddata; } else dble_buf[j] = 0.0; } for ( j = 0; j < m; j++ ) { if ( cols[j] < extNrows ) { vals[j] = dble_buf[cols[j]]; if ( cols[j] != i ) dble_buf[cols[j]] = 0.0; } } sortcnt = 0; for ( j = 0; j < track_leng; j++ ) { index = track_array[j]; if ( index < i ) { if ( dble_buf[index] < -rel_tau ) { sortcols[sortcnt] = index; sortvals[sortcnt++] = - dble_buf[index] * rowNorms[index]; } else if ( dble_buf[index] > rel_tau ) { sortcols[sortcnt] = index; sortvals[sortcnt++] = dble_buf[index] * rowNorms[index]; } else dble_buf[index] = 0.0; } } if ( sortcnt > Lcount ) { HYPRE_LSI_SplitDSort(sortvals,sortcnt,sortcols,Lcount); for ( j = Lcount; j < sortcnt; j++ ) dble_buf[sortcols[j]] = 0.0; } for ( j = 0; j < m; j++ ) { if ( cols[j] < i && vals[j] != 0.0 ) { mat_aa[nnz_count] = vals[j]; mat_ja[nnz_count++] = cols[j]; } } for ( j = 0; j < track_leng; j++ ) { index = track_array[j]; if ( index < i && dble_buf[index] != 0.0 ) { mat_aa[nnz_count] = dble_buf[index]; mat_ja[nnz_count++] = index; dble_buf[index] = 0.0; } } diagonal[i] = dble_buf[i]; if ( habs(diagonal[i]) < 1.0e-16 ) { diagonal[i] = 1.0E-6; num_small_pivot++; } mat_aa[nnz_count] = diagonal[i]; mat_ja[nnz_count++] = i; sortcnt = 0; for ( j = 0; j < track_leng; j++ ) { index = track_array[j]; if ( index > i ) { if ( dble_buf[index] < -rel_tau ) { sortcols[sortcnt] = index; sortvals[sortcnt++] = - dble_buf[index] * rowNorms[index]; } else if ( dble_buf[index] > rel_tau ) { sortcols[sortcnt] = index; sortvals[sortcnt++] = dble_buf[index] * rowNorms[index]; } else dble_buf[index] = 0.0; } } if ( sortcnt > Ucount ) { HYPRE_LSI_SplitDSort(sortvals,sortcnt,sortcols,Ucount); for ( j = Ucount; j < sortcnt; j++ ) dble_buf[sortcols[j]] = 0.0; } for ( j = 0; j < m; j++ ) { if ( cols[j] > i && vals[j] != 0.0 ) { mat_aa[nnz_count] = vals[j]; mat_ja[nnz_count++] = cols[j]; } } for ( j = 0; j < track_leng; j++ ) { index = track_array[j]; if ( index > i && dble_buf[index] != 0.0 ) { mat_aa[nnz_count] = dble_buf[index]; mat_ja[nnz_count++] = index; dble_buf[index] = 0.0; } } dble_buf[i] = 0.0; mat_ia[i+1] = nnz_count; } hypre_TFree(Amat_ia, HYPRE_MEMORY_HOST); hypre_TFree(Amat_ja, HYPRE_MEMORY_HOST); hypre_TFree(Amat_aa, HYPRE_MEMORY_HOST); printf("touch_cnt = %d\n", touch_cnt); /* ---------------------------------------------------------------- */ /* process the off-processor rows */ /* ---------------------------------------------------------------- */ offset = 0; cols = hypre_TAlloc(int, max_nnz_row , HYPRE_MEMORY_HOST); vals = hypre_TAlloc(double, max_nnz_row , HYPRE_MEMORY_HOST); for ( i = 0; i < extNrows; i++ ) dble_buf[i] = 0.0; for ( i = 0; i < total_recv_leng; i++ ) { if ( (i+Nrows) % printstep == 0 && ilut_ptr->outputLevel > 0 ) printf("%4d : *DDILUT Processing row %d(%d)\n",mypid,i+Nrows,extNrows); track_leng = m = 0; for ( j = offset; j < offset+recv_lengths[i]; j++ ) { if ( ext_ja[j] != -1 ) { if (order_flag && ext_ja[j] < Nrows) index = reorder_list[ext_ja[j]]; else index = ext_ja[j]; dble_buf[index] = ext_aa[j]; track_array[track_leng++] = index; cols[m] = index; vals[m++] = ext_aa[j]; } } Lcount = Ucount = 0; first = extNrows; for ( j = 0; j < track_leng; j++ ) { index = track_array[j]; if ( dble_buf[index] != 0 ) { if ( index < i+Nrows ) Lcount++; else if ( index > i+Nrows ) Ucount++; else if ( i+Nrows == index ) diagonal[i+Nrows] = dble_buf[index]; if ( index < first ) first = index; } } Lcount = Lcount * fillin; Ucount = Ucount * fillin; rel_tau = tau * rowNorms[i+Nrows]; for ( j = first; j < i+Nrows; j++ ) { if ( habs(dble_buf[j]) > rel_tau ) { ddata = dble_buf[j] / diagonal[j]; for ( k = mat_ia[j]; k < mat_ia[j+1]; k++ ) { colIndex = mat_ja[k]; if ( colIndex > j ) { if ( dble_buf[colIndex] != 0.0 ) dble_buf[colIndex] -= (ddata * mat_aa[k]); else { dble_buf[colIndex] = - (ddata * mat_aa[k]); if ( dble_buf[colIndex] != 0.0 ) track_array[track_leng++] = colIndex; } } } dble_buf[j] = ddata; } else dble_buf[j] = 0.0; } for ( j = 0; j < m; j++ ) { if ( cols[j] < extNrows ) { vals[j] = dble_buf[cols[j]]; if ( cols[j] != i+Nrows ) dble_buf[cols[j]] = 0.0; } } sortcnt = 0; for ( j = 0; j < track_leng; j++ ) { index = track_array[j]; if ( index < i+Nrows ) { if ( dble_buf[index] < -rel_tau ) { sortcols[sortcnt] = index; sortvals[sortcnt++] = - dble_buf[index]*rowNorms[index]; } else if ( dble_buf[index] > rel_tau ) { sortcols[sortcnt] = index; sortvals[sortcnt++] = dble_buf[index] * rowNorms[index]; } else dble_buf[index] = 0.0; } } if ( sortcnt > Lcount ) { HYPRE_LSI_SplitDSort(sortvals,sortcnt,sortcols,Lcount); for ( j = Lcount; j < sortcnt; j++ ) dble_buf[sortcols[j]] = 0.0; } for ( j = 0; j < m; j++ ) { if ( cols[j] < i+Nrows && vals[j] != 0.0 ) { mat_aa[nnz_count] = vals[j]; mat_ja[nnz_count++] = cols[j]; } } for ( j = 0; j < track_leng; j++ ) { index = track_array[j]; if ( index < i+Nrows && dble_buf[index] != 0.0 ) { mat_aa[nnz_count] = dble_buf[index]; mat_ja[nnz_count++] = index; dble_buf[index] = 0.0; } } diagonal[i+Nrows] = dble_buf[i+Nrows]; if ( habs(diagonal[i+Nrows]) < 1.0e-16 ) { diagonal[i+Nrows] = 1.0E-6; num_small_pivot++; } mat_aa[nnz_count] = diagonal[i+Nrows]; mat_ja[nnz_count++] = i+Nrows; dble_buf[i+Nrows] = 0.0; sortcnt = 0; for ( j = 0; j < track_leng; j++ ) { index = track_array[j]; if ( index > i+Nrows ) { if ( dble_buf[index] < -rel_tau ) { sortcols[sortcnt] = index; sortvals[sortcnt++] = - dble_buf[index] * rowNorms[index]; } else if ( dble_buf[index] > rel_tau ) { sortcols[sortcnt] = index; sortvals[sortcnt++] = dble_buf[index] * rowNorms[index]; } else dble_buf[index] = 0.0; } } if ( sortcnt > Ucount ) { HYPRE_LSI_SplitDSort(sortvals,sortcnt,sortcols,Ucount); for ( j = Ucount; j < sortcnt; j++ ) dble_buf[sortcols[j]] = 0.0; } for ( j = 0; j < m; j++ ) { if ( cols[j] > i+Nrows && cols[j] < extNrows && vals[j] != 0.0 ) { mat_aa[nnz_count] = vals[j]; mat_ja[nnz_count++] = cols[j]; } } for ( j = 0; j < track_leng; j++ ) { index = track_array[j]; if ( index > i+Nrows && dble_buf[index] != 0.0 ) { mat_aa[nnz_count] = dble_buf[index]; mat_ja[nnz_count++] = index; dble_buf[index] = 0.0; } } mat_ia[i+Nrows+1] = nnz_count; offset += recv_lengths[i]; } if ( nnz_count > total_nnz ) printf("WARNING in ILUTDecomp : memory bound passed.\n"); if ( ilut_ptr->outputLevel > 0 ) { printf("%4d : DDILUT number of nonzeros = %d\n",mypid,nnz_count); printf("%4d : DDILUT number of small pivots = %d\n",mypid,num_small_pivot); } /* ---------------------------------------------------------- */ /* deallocate temporary storage space */ /* ---------------------------------------------------------- */ hypre_TFree(cols, HYPRE_MEMORY_HOST); hypre_TFree(vals, HYPRE_MEMORY_HOST); hypre_TFree(sortcols, HYPRE_MEMORY_HOST); hypre_TFree(sortvals, HYPRE_MEMORY_HOST); hypre_TFree(dble_buf, HYPRE_MEMORY_HOST); hypre_TFree(diagonal, HYPRE_MEMORY_HOST); hypre_TFree(rowNorms, HYPRE_MEMORY_HOST); hypre_TFree(context, HYPRE_MEMORY_HOST); hypre_TFree(track_array, HYPRE_MEMORY_HOST); return 0; } /*****************************************************************************/ /* function for doing ILUT decomposition */ /* (attempted for pattern reuse, but not done yet) */ /*****************************************************************************/ int HYPRE_LSI_DDIlutDecompose2(HYPRE_LSI_DDIlut *ilut_ptr,MH_Matrix *Amat, int total_recv_leng, int *recv_lengths, int *ext_ja, double *ext_aa, int *map, int *map2, int Noffset) { int *mat_ia, *mat_ja, i, m, allocated_space, *cols, mypid; int index, first, Lcount, Ucount, ncnt, j, k, total_nnz; int sortcnt, colIndex, offset, nnz_count, Nrows, extNrows; int *track_array, track_leng, num_small_pivot, printstep, ndisc; int *sortcols; double *vals, ddata, *mat_aa, *diagonal, *rowNorms; double *dble_buf, fillin, tau, rel_tau, *sortvals, absval; MH_Context *context; /* ---------------------------------------------------------------- */ /* fetch ILUT parameters */ /* ---------------------------------------------------------------- */ MPI_Comm_rank(ilut_ptr->comm, &mypid); fillin = ilut_ptr->fillin; tau = ilut_ptr->thresh; Nrows = Amat->Nrows; extNrows = Nrows + total_recv_leng; ilut_ptr->Nrows = Nrows; ilut_ptr->extNrows = extNrows; /* ---------------------------------------------------------------- */ /* allocate temporary storage space */ /* ---------------------------------------------------------------- */ allocated_space = extNrows; cols = hypre_TAlloc(int, allocated_space , HYPRE_MEMORY_HOST); vals = hypre_TAlloc(double, allocated_space , HYPRE_MEMORY_HOST); sortcols = hypre_TAlloc(int, extNrows , HYPRE_MEMORY_HOST); sortvals = hypre_TAlloc(double, extNrows , HYPRE_MEMORY_HOST); dble_buf = hypre_TAlloc(double, extNrows , HYPRE_MEMORY_HOST); diagonal = hypre_TAlloc(double, extNrows , HYPRE_MEMORY_HOST); rowNorms = hypre_TAlloc(double, extNrows , HYPRE_MEMORY_HOST); /* ---------------------------------------------------------------- */ /* compute the storage requirement for the ILU matrix */ /* ---------------------------------------------------------------- */ context = hypre_TAlloc(MH_Context, 1, HYPRE_MEMORY_HOST); context->Amat = Amat; for ( i = 0; i < Nrows; i++ ) { rowNorms[i] = 0.0; while (MH_GetRow(context,1,&i,allocated_space,cols,vals,&m)==0) { hypre_TFree(vals, HYPRE_MEMORY_HOST); hypre_TFree(cols, HYPRE_MEMORY_HOST); allocated_space += 200 + 1; cols = hypre_TAlloc(int, allocated_space , HYPRE_MEMORY_HOST); vals = hypre_TAlloc(double, allocated_space , HYPRE_MEMORY_HOST); } for ( j = 0; j < m; j++ ) rowNorms[i] += habs(vals[j]); rowNorms[i] /= extNrows; } total_nnz = 0; for ( i = 0; i < total_recv_leng; i++ ) total_nnz += recv_lengths[i]; total_nnz = (int) ((double) total_nnz*(fillin+1.0)) + ilut_ptr->mat_ia[Nrows]; mat_ia = ilut_ptr->mat_ia; mat_ja = ilut_ptr->mat_ja; mat_aa = ilut_ptr->mat_aa; ilut_ptr->mat_ia = hypre_TAlloc(int, (extNrows + 1 ) , HYPRE_MEMORY_HOST); ilut_ptr->mat_ja = hypre_TAlloc(int, total_nnz , HYPRE_MEMORY_HOST); ilut_ptr->mat_aa = hypre_TAlloc(double, total_nnz , HYPRE_MEMORY_HOST); ncnt = 0; ilut_ptr->mat_ia[0] = 0; for ( i = 0; i < Nrows; i++ ) { for ( j = mat_ia[i]; j < mat_ia[i+1]; j++ ) if ( mat_ja[j] >= 0 && mat_ja[j] < extNrows ) ilut_ptr->mat_ja[ncnt++] = mat_ja[j]; ilut_ptr->mat_ia[i+1] = ncnt; } hypre_TFree(mat_ia, HYPRE_MEMORY_HOST); hypre_TFree(mat_ja, HYPRE_MEMORY_HOST); hypre_TFree(mat_aa, HYPRE_MEMORY_HOST); mat_ia = ilut_ptr->mat_ia; mat_ja = ilut_ptr->mat_ja; mat_aa = ilut_ptr->mat_aa; /* ---------------------------------------------------------------- */ /* process the first Nrows */ /* ---------------------------------------------------------------- */ num_small_pivot = 0; mat_ia[0] = 0; track_array = hypre_TAlloc(int, extNrows , HYPRE_MEMORY_HOST); for ( i = 0; i < extNrows; i++ ) dble_buf[i] = 0.0; printstep = extNrows / 10; ndisc = 0; for ( i = 0; i < Nrows; i++ ) { if ( i % printstep == 0 && ilut_ptr->outputLevel > 0 ) printf("%4d : 1DDILUT Processing row %d(%d,%d)\n",mypid,i,extNrows,Nrows); MH_GetRow(context,1,&i,allocated_space,cols,vals,&m); /* ------------------------------------------------------------- */ /* load the row into buffer */ /* ------------------------------------------------------------- */ track_leng = 0; first = extNrows; for ( j = 0; j < m; j++ ) { index = cols[j]; if ( index < extNrows ) { dble_buf[index] = vals[j]; track_array[track_leng++] = index; } if ( index < first ) first = index; } for ( j = mat_ia[i]; j < mat_ia[i+1]; j++ ) { index = mat_ja[j]; if ( dble_buf[index] == 0.0 ) track_array[track_leng++] = index; if ( index < first ) first = index; } if ( (mat_ia[i+1]-mat_ia[i]) != track_leng) ndisc++; /* ------------------------------------------------------------- */ /* perform factorization */ /* ------------------------------------------------------------- */ rel_tau = tau * rowNorms[i]; for ( j = first; j < i; j++ ) { if ( habs(dble_buf[j]) > rel_tau ) { ddata = dble_buf[j] / diagonal[j]; for ( k = mat_ia[j]; k < mat_ia[j+1]; k++ ) { colIndex = mat_ja[k]; if ( colIndex > j ) { if ( dble_buf[colIndex] != 0.0 ) dble_buf[colIndex] -= (ddata * mat_aa[k]); else { dble_buf[colIndex] = - (ddata * mat_aa[k]); if ( dble_buf[colIndex] != 0.0 ) track_array[track_leng++] = colIndex; } } } dble_buf[j] = ddata; } else dble_buf[j] = 0.0; } diagonal[i] = dble_buf[i]; if ( habs(diagonal[i]) < 1.0e-16 ) { diagonal[i] = dble_buf[i] = 1.0E-6; num_small_pivot++; } for (j = mat_ia[i]; j < mat_ia[i+1]; j++) mat_aa[j] = dble_buf[mat_ja[j]]; for ( j = 0; j < track_leng; j++ ) dble_buf[track_array[j]] = 0.0; } nnz_count = mat_ia[Nrows]; ncnt = 0; k = 0; for ( i = 0; i < Nrows; i++ ) { for ( j = k; j < mat_ia[i+1]; j++ ) { if ( mat_aa[j] != 0.0 ) { mat_ja[ncnt] = mat_ja[j]; mat_aa[ncnt++] = mat_aa[j]; } } k = mat_ia[i+1]; mat_ia[i+1] = ncnt; } if ( ilut_ptr->outputLevel > 0 ) { printf("%4d : DDILUT after Nrows - nnz = %d %d\n", mypid, nnz_count, ncnt); printf("%4d : DDILUT number of small pivots = %d\n",mypid,num_small_pivot); printf("%4d : DDILUT number of pattern mismatch = %d\n",mypid,ndisc); } nnz_count = ncnt; /* ---------------------------------------------------------------- */ /* preparation for processing the off-processor rows */ /* ---------------------------------------------------------------- */ offset = 0; for ( i = 0; i < total_recv_leng; i++ ) { rowNorms[i+Nrows] = 0.0; for ( j = offset; j < offset+recv_lengths[i]; j++ ) { index = ext_ja[j]; if ( index >= Noffset && index < Noffset+Nrows ) ext_ja[j] = index - Noffset; else { m = HYPRE_LSI_Search(map, index, extNrows-Nrows); if ( m >= 0 ) ext_ja[j] = map2[m] + Nrows; else ext_ja[j] = -1; if ( ext_ja[j] >= extNrows ) ext_ja[j] = -1; } if ( ext_ja[j] != -1 ) rowNorms[i+Nrows] += habs(ext_aa[j]); } rowNorms[i+Nrows] /= extNrows; offset += recv_lengths[i]; } /* ---------------------------------------------------------------- */ /* process the off-processor rows */ /* ---------------------------------------------------------------- */ offset = 0; for ( i = 0; i < extNrows; i++ ) dble_buf[i] = 0.0; for ( i = 0; i < total_recv_leng; i++ ) { if ( (i+Nrows) % printstep == 0 && ilut_ptr->outputLevel > 0 ) printf("%4d : *DDILUT Processing row %d(%d)\n",mypid,i+Nrows,extNrows); track_leng = m = 0; for ( j = offset; j < offset+recv_lengths[i]; j++ ) { index = ext_ja[j]; if ( index != -1 ) { cols[m] = index; vals[m++] = ext_aa[j]; track_array[track_leng++] = index; dble_buf[index] = ext_aa[j]; } } Lcount = Ucount = 0; first = extNrows; for ( j = 0; j < track_leng; j++ ) { index = track_array[j]; if ( dble_buf[index] != 0 ) { if ( index < i+Nrows ) Lcount++; else if ( index > i+Nrows ) Ucount++; else if ( i+Nrows == index ) diagonal[i+Nrows] = dble_buf[index]; if ( index < first ) first = index; } } Lcount = Lcount * fillin; Ucount = Ucount * fillin; rel_tau = tau * rowNorms[i+Nrows]; for ( j = first; j < i+Nrows; j++ ) { if ( habs(dble_buf[j]) > rel_tau ) { ddata = dble_buf[j] / diagonal[j]; for ( k = mat_ia[j]; k < mat_ia[j+1]; k++ ) { colIndex = mat_ja[k]; if ( colIndex > j ) { if ( dble_buf[colIndex] != 0.0 ) dble_buf[colIndex] -= (ddata * mat_aa[k]); else { dble_buf[colIndex] = - (ddata * mat_aa[k]); if ( dble_buf[colIndex] != 0.0 ) track_array[track_leng++] = colIndex; } } } dble_buf[j] = ddata; } else dble_buf[j] = 0.0; } for ( j = 0; j < m; j++ ) { index = cols[j]; vals[j] = dble_buf[index]; if ( index != i+Nrows ) dble_buf[index] = 0.0; } sortcnt = 0; for ( j = 0; j < track_leng; j++ ) { index = track_array[j]; if ( index < i+Nrows ) { absval = habs( dble_buf[index] ); if ( absval > rel_tau ) { sortcols[sortcnt] = index; sortvals[sortcnt++] = absval * rowNorms[index]; } else dble_buf[index] = 0.0; } } if ( sortcnt > Lcount ) { HYPRE_LSI_SplitDSort(sortvals,sortcnt,sortcols,Lcount); for ( j = Lcount; j < sortcnt; j++ ) dble_buf[sortcols[j]] = 0.0; } for ( j = 0; j < m; j++ ) { if ( cols[j] < i+Nrows && vals[j] != 0.0 ) { mat_aa[nnz_count] = vals[j]; mat_ja[nnz_count++] = cols[j]; } } for ( j = 0; j < track_leng; j++ ) { index = track_array[j]; if ( index < i+Nrows && dble_buf[index] != 0.0 ) { mat_aa[nnz_count] = dble_buf[index]; mat_ja[nnz_count++] = index; dble_buf[index] = 0.0; } } diagonal[i+Nrows] = dble_buf[i+Nrows]; if ( habs(diagonal[i+Nrows]) < 1.0e-16 ) { diagonal[i+Nrows] = 1.0E-6; num_small_pivot++; } mat_aa[nnz_count] = diagonal[i+Nrows]; mat_ja[nnz_count++] = i+Nrows; dble_buf[i+Nrows] = 0.0; sortcnt = 0; for ( j = 0; j < track_leng; j++ ) { index = track_array[j]; if ( index > i+Nrows ) { absval = habs( dble_buf[index] ); if ( absval > rel_tau ) { sortcols[sortcnt] = index; sortvals[sortcnt++] = absval * rowNorms[index]; } else dble_buf[index] = 0.0; } } if ( sortcnt > Ucount ) { HYPRE_LSI_SplitDSort(sortvals,sortcnt,sortcols,Ucount); for ( j = Ucount; j < sortcnt; j++ ) dble_buf[sortcols[j]] = 0.0; } for ( j = 0; j < m; j++ ) { if ( cols[j] > i+Nrows && vals[j] != 0.0 ) { mat_aa[nnz_count] = vals[j]; mat_ja[nnz_count++] = cols[j]; } } for ( j = 0; j < track_leng; j++ ) { index = track_array[j]; if ( index > i+Nrows && dble_buf[index] != 0.0 ) { mat_aa[nnz_count] = dble_buf[index]; mat_ja[nnz_count++] = index; dble_buf[index] = 0.0; } } mat_ia[i+Nrows+1] = nnz_count; offset += recv_lengths[i]; } if ( nnz_count > total_nnz ) printf("WARNING in ILUTDecomp : memory bound passed.\n"); if ( ilut_ptr->outputLevel > 0 ) { printf("%4d : DDILUT number of nonzeros = %d\n",mypid,nnz_count); printf("%4d : DDILUT number of small pivots = %d\n",mypid,num_small_pivot); } /* ---------------------------------------------------------- */ /* deallocate temporary storage space */ /* ---------------------------------------------------------- */ hypre_TFree(cols, HYPRE_MEMORY_HOST); hypre_TFree(vals, HYPRE_MEMORY_HOST); hypre_TFree(sortcols, HYPRE_MEMORY_HOST); hypre_TFree(sortvals, HYPRE_MEMORY_HOST); hypre_TFree(dble_buf, HYPRE_MEMORY_HOST); hypre_TFree(diagonal, HYPRE_MEMORY_HOST); hypre_TFree(rowNorms, HYPRE_MEMORY_HOST); hypre_TFree(context, HYPRE_MEMORY_HOST); hypre_TFree(track_array, HYPRE_MEMORY_HOST); return 0; } /*****************************************************************************/ /* function for doing ILUT decomposition */ /* (purely based on magnitude) */ /*****************************************************************************/ int HYPRE_LSI_DDIlutDecompose3(HYPRE_LSI_DDIlut *ilut_ptr,MH_Matrix *Amat, int total_recv_leng, int *recv_lengths, int *ext_ja, double *ext_aa, int *map, int *map2, int Noffset) { int *mat_ia, *mat_ja, i, m, allocated_space, *cols, mypid; int index, first, Lcount, Ucount, j, k, total_nnz; int sortcnt, colIndex, offset, nnz_count, Nrows, extNrows; int *track_array, track_leng, num_small_pivot; double *vals, ddata, *mat_aa, *diagonal, *rowNorms; double *dble_buf, fillin, tau, rel_tau; MH_Context *context; /* ---------------------------------------------------------------- */ /* fetch ILUT parameters */ /* ---------------------------------------------------------------- */ MPI_Comm_rank(ilut_ptr->comm, &mypid); fillin = ilut_ptr->fillin; tau = ilut_ptr->thresh; Nrows = Amat->Nrows; extNrows = Nrows + total_recv_leng; ilut_ptr->Nrows = Nrows; ilut_ptr->extNrows = extNrows; /* ---------------------------------------------------------------- */ /* allocate temporary storage space */ /* ---------------------------------------------------------------- */ allocated_space = extNrows; cols = hypre_TAlloc(int, allocated_space , HYPRE_MEMORY_HOST); vals = hypre_TAlloc(double, allocated_space , HYPRE_MEMORY_HOST); dble_buf = hypre_TAlloc(double, extNrows , HYPRE_MEMORY_HOST); diagonal = hypre_TAlloc(double, extNrows , HYPRE_MEMORY_HOST); rowNorms = hypre_TAlloc(double, extNrows , HYPRE_MEMORY_HOST); /* ---------------------------------------------------------------- */ /* compute the storage requirement for the ILU matrix */ /* ---------------------------------------------------------------- */ context = hypre_TAlloc(MH_Context, 1, HYPRE_MEMORY_HOST); context->Amat = Amat; total_nnz = 0; for ( i = 0; i < Nrows; i++ ) { rowNorms[i] = 0.0; while (MH_GetRow(context,1,&i,allocated_space,cols,vals,&m)==0) { hypre_TFree(vals, HYPRE_MEMORY_HOST); hypre_TFree(cols, HYPRE_MEMORY_HOST); allocated_space += 200 + 1; cols = hypre_TAlloc(int, allocated_space , HYPRE_MEMORY_HOST); vals = hypre_TAlloc(double, allocated_space , HYPRE_MEMORY_HOST); } total_nnz += m; for ( j = 0; j < m; j++ ) rowNorms[i] += habs(vals[j]); rowNorms[i] /= extNrows; } for ( i = 0; i < total_recv_leng; i++ ) total_nnz += recv_lengths[i]; total_nnz = (int) ((double) total_nnz * (fillin + 1.0)); ilut_ptr->mat_ia = hypre_TAlloc(int, (extNrows + 1 ) , HYPRE_MEMORY_HOST); ilut_ptr->mat_ja = hypre_TAlloc(int, total_nnz , HYPRE_MEMORY_HOST); ilut_ptr->mat_aa = hypre_TAlloc(double, total_nnz , HYPRE_MEMORY_HOST); mat_ia = ilut_ptr->mat_ia; mat_ja = ilut_ptr->mat_ja; mat_aa = ilut_ptr->mat_aa; offset = 0; for ( i = 0; i < total_recv_leng; i++ ) { rowNorms[i+Nrows] = 0.0; for ( j = offset; j < offset+recv_lengths[i]; j++ ) { index = ext_ja[j]; if ( index >= Noffset && index < Noffset+Nrows ) ext_ja[j] = index - Noffset; else { m = HYPRE_LSI_Search(map, index, extNrows-Nrows); if ( m >= 0 ) ext_ja[j] = map2[m] + Nrows; else ext_ja[j] = -1; } if ( ext_ja[j] != -1 ) rowNorms[i+Nrows] += habs(ext_aa[j]); } rowNorms[i+Nrows] /= extNrows; offset += recv_lengths[i]; } /* ---------------------------------------------------------------- */ /* process the first Nrows */ /* ---------------------------------------------------------------- */ num_small_pivot = 0; nnz_count = 0; mat_ia[0] = 0; track_array = hypre_TAlloc(int, extNrows , HYPRE_MEMORY_HOST); for ( i = 0; i < extNrows; i++ ) dble_buf[i] = 0.0; for ( i = 0; i < Nrows; i++ ) { if ( i % 1000 == 0 && ilut_ptr->outputLevel > 0 ) printf("%4d : 2DDILUT Processing row %d(%d)\n",mypid,i,extNrows); track_leng = 0; MH_GetRow(context,1,&i,allocated_space,cols,vals,&m); if ( m < 0 ) printf("IlutDecompose WARNING(1): row nnz = %d\n",m); for ( j = 0; j < m; j++ ) { if ( cols[j] < extNrows ) { dble_buf[cols[j]] = vals[j]; track_array[track_leng++] = cols[j]; } } Lcount = Ucount = first = 0; first = extNrows; for ( j = 0; j < track_leng; j++ ) { index = track_array[j]; if ( dble_buf[index] != 0 ) { if ( index < i ) Lcount++; else if ( index > i ) Ucount++; else if ( index == i ) diagonal[i] = dble_buf[index]; if ( index < first ) first = index; } } Lcount = Lcount * (fillin + 1); Ucount = Ucount * (fillin + 1); rel_tau = tau * rowNorms[i]; for ( j = first; j < i; j++ ) { if ( habs(dble_buf[j]) > rel_tau ) { ddata = dble_buf[j] / diagonal[j]; for ( k = mat_ia[j]; k < mat_ia[j+1]; k++ ) { colIndex = mat_ja[k]; if ( colIndex > j ) { if ( dble_buf[colIndex] != 0.0 ) dble_buf[colIndex] -= (ddata * mat_aa[k]); else { dble_buf[colIndex] = - (ddata * mat_aa[k]); track_array[track_leng++] = colIndex; } } } dble_buf[j] = ddata; } else dble_buf[j] = 0.0; } sortcnt = 0; for ( j = 0; j < track_leng; j++ ) { index = track_array[j]; if ( index < i ) { if ( dble_buf[index] < -rel_tau ) { cols[sortcnt] = index; vals[sortcnt++] = - dble_buf[index] * rowNorms[index]; } else if ( dble_buf[index] > rel_tau ) { cols[sortcnt] = index; vals[sortcnt++] = dble_buf[index] * rowNorms[index]; } else dble_buf[index] = 0.0; } } if ( sortcnt > Lcount ) HYPRE_LSI_SplitDSort(vals,sortcnt,cols,Lcount); if ( sortcnt > Lcount ) { for ( j = Lcount; j < sortcnt; j++ ) dble_buf[cols[j]] = 0.0; } for ( j = 0; j < track_leng; j++ ) { index = track_array[j]; if ( index < i && dble_buf[index] != 0.0 ) { mat_aa[nnz_count] = dble_buf[index]; mat_ja[nnz_count++] = index; dble_buf[index] = 0.0; } } diagonal[i] = dble_buf[i]; if ( habs(diagonal[i]) < 1.0e-16 ) { diagonal[i] = 1.0E-6; num_small_pivot++; } mat_aa[nnz_count] = diagonal[i]; mat_ja[nnz_count++] = i; sortcnt = 0; for ( j = 0; j < track_leng; j++ ) { index = track_array[j]; if ( index > i ) { if ( dble_buf[index] < -rel_tau ) { cols[sortcnt] = index; vals[sortcnt++] = - dble_buf[index] * rowNorms[index]; } else if ( dble_buf[index] > rel_tau ) { cols[sortcnt] = index; vals[sortcnt++] = dble_buf[index] * rowNorms[index]; } else dble_buf[index] = 0.0; } } if ( sortcnt > Ucount ) HYPRE_LSI_SplitDSort(vals,sortcnt,cols,Ucount); if ( sortcnt > Ucount ) { for ( j = Ucount; j < sortcnt; j++ ) dble_buf[cols[j]] = 0.0; } for ( j = 0; j < track_leng; j++ ) { index = track_array[j]; if ( index > i && dble_buf[index] != 0.0 ) { mat_aa[nnz_count] = dble_buf[index]; mat_ja[nnz_count++] = index; dble_buf[index] = 0.0; } } dble_buf[i] = 0.0; mat_ia[i+1] = nnz_count; } /* ---------------------------------------------------------------- */ /* process the off-processor rows */ /* ---------------------------------------------------------------- */ offset = 0; for ( i = 0; i < extNrows; i++ ) dble_buf[i] = 0.0; for ( i = 0; i < total_recv_leng; i++ ) { if ( (i+Nrows) % 1000 == 0 && ilut_ptr->outputLevel > 0 ) printf("%4d : *DDILUT Processing row %d(%d)\n",mypid,i+Nrows,extNrows); track_leng = 0; for ( j = offset; j < offset+recv_lengths[i]; j++ ) { if ( ext_ja[j] != -1 ) { dble_buf[ext_ja[j]] = ext_aa[j]; track_array[track_leng++] = ext_ja[j]; } } Lcount = Ucount = 0; first = extNrows; for ( j = 0; j < track_leng; j++ ) { index = track_array[j]; if ( dble_buf[index] != 0 ) { if ( index < i+Nrows ) Lcount++; else if ( index > i+Nrows ) Ucount++; else if ( i+Nrows == index ) diagonal[i+Nrows] = dble_buf[index]; if ( index < first ) first = index; } } Lcount = Lcount * (fillin + 1); Ucount = Ucount * (fillin + 1); rel_tau = tau * rowNorms[i+Nrows]; for ( j = first; j < i+Nrows; j++ ) { if ( habs(dble_buf[j]) > rel_tau ) { ddata = dble_buf[j] / diagonal[j]; for ( k = mat_ia[j]; k < mat_ia[j+1]; k++ ) { colIndex = mat_ja[k]; if ( colIndex > j ) { if ( dble_buf[colIndex] != 0.0 ) dble_buf[colIndex] -= (ddata * mat_aa[k]); else { dble_buf[colIndex] = - (ddata * mat_aa[k]); track_array[track_leng++] = colIndex; } } } dble_buf[j] = ddata; } else dble_buf[j] = 0.0; } sortcnt = 0; for ( j = 0; j < track_leng; j++ ) { index = track_array[j]; if ( index < i+Nrows ) { if ( dble_buf[index] < -rel_tau ) { cols[sortcnt] = index; vals[sortcnt++] = - dble_buf[index]*rowNorms[index]; } else if ( dble_buf[index] > rel_tau ) { cols[sortcnt] = index; vals[sortcnt++] = dble_buf[index] * rowNorms[index]; } else dble_buf[index] = 0.0; } } if ( sortcnt > Lcount ) HYPRE_LSI_SplitDSort(vals,sortcnt,cols,Lcount); if ( sortcnt > Lcount ) { for ( j = Lcount; j < sortcnt; j++ ) dble_buf[cols[j]] = 0.0; } for ( j = 0; j < track_leng; j++ ) { index = track_array[j]; if ( index < i+Nrows && dble_buf[index] != 0.0 ) { mat_aa[nnz_count] = dble_buf[index]; mat_ja[nnz_count++] = index; dble_buf[index] = 0.0; } } diagonal[i+Nrows] = dble_buf[i+Nrows]; if ( habs(diagonal[i+Nrows]) < 1.0e-16 ) { diagonal[i+Nrows] = 1.0E-6; num_small_pivot++; } mat_aa[nnz_count] = diagonal[i+Nrows]; mat_ja[nnz_count++] = i+Nrows; dble_buf[i+Nrows] = 0.0; sortcnt = 0; for ( j = 0; j < track_leng; j++ ) { index = track_array[j]; if ( index > i+Nrows ) { if ( dble_buf[index] < -rel_tau ) { cols[sortcnt] = index; vals[sortcnt++] = - dble_buf[index] * rowNorms[index]; } else if ( dble_buf[index] > rel_tau ) { cols[sortcnt] = index; vals[sortcnt++] = dble_buf[index] * rowNorms[index]; } else dble_buf[index] = 0.0; } } if ( sortcnt > Ucount ) HYPRE_LSI_SplitDSort(vals,sortcnt,cols,Ucount); if ( sortcnt > Ucount ) { for ( j = Ucount; j < sortcnt; j++ ) dble_buf[cols[j]] = 0.0; } for ( j = 0; j < track_leng; j++ ) { index = track_array[j]; if ( index > i+Nrows && dble_buf[index] != 0.0 ) { mat_aa[nnz_count] = dble_buf[index]; mat_ja[nnz_count++] = index; dble_buf[index] = 0.0; } } mat_ia[i+Nrows+1] = nnz_count; offset += recv_lengths[i]; } if ( nnz_count > total_nnz ) printf("WARNING in ILUTDecomp : memory bound passed.\n"); if ( ilut_ptr->outputLevel > 0 ) { printf("%4d : DDILUT number of nonzeros = %d\n",mypid,nnz_count); printf("%4d : DDILUT number of small pivots = %d\n",mypid,num_small_pivot); } /* ---------------------------------------------------------- */ /* deallocate temporary storage space */ /* ---------------------------------------------------------- */ hypre_TFree(cols, HYPRE_MEMORY_HOST); hypre_TFree(vals, HYPRE_MEMORY_HOST); hypre_TFree(dble_buf, HYPRE_MEMORY_HOST); hypre_TFree(diagonal, HYPRE_MEMORY_HOST); hypre_TFree(rowNorms, HYPRE_MEMORY_HOST); hypre_TFree(context, HYPRE_MEMORY_HOST); hypre_TFree(track_array, HYPRE_MEMORY_HOST); return 0; } /*****************************************************************************/ /* function for doing ILUT decomposition */ /* (This version is based on ILU(1). It converges less well as the original */ /* ILUT based on ILU(0) and magnitude. Its setup time is not faster either)*/ /*****************************************************************************/ int HYPRE_LSI_DDIlutDecomposeNew(HYPRE_LSI_DDIlut *ilut_ptr,MH_Matrix *Amat, int total_recv_leng, int *recv_lengths, int *ext_ja, double *ext_aa, int *map, int *map2, int Noffset) { int *mat_ia, *mat_ja, i, m, allocated_space, *cols, mypid; int index, first, ncnt, j, k, total_nnz; int colIndex, offset, nnz_count, Nrows, extNrows; int *track_array, track_leng, num_small_pivot, printstep; int *mat_ia2, *mat_ja2, *iarray; double *vals, ddata, *mat_aa, *diagonal, *rowNorms; double *dble_buf, tau, rel_tau, *mat_aa2; MH_Context *context; /* ---------------------------------------------------------------- */ /* fetch ILUT parameters */ /* ---------------------------------------------------------------- */ MPI_Comm_rank(ilut_ptr->comm, &mypid); tau = ilut_ptr->thresh; Nrows = Amat->Nrows; extNrows = Nrows + total_recv_leng; ilut_ptr->Nrows = Nrows; ilut_ptr->extNrows = extNrows; /* ---------------------------------------------------------------- */ /* allocate temporary storage space */ /* ---------------------------------------------------------------- */ allocated_space = extNrows; cols = hypre_TAlloc(int, allocated_space , HYPRE_MEMORY_HOST); vals = hypre_TAlloc(double, allocated_space , HYPRE_MEMORY_HOST); dble_buf = hypre_TAlloc(double, extNrows , HYPRE_MEMORY_HOST); diagonal = hypre_TAlloc(double, extNrows , HYPRE_MEMORY_HOST); rowNorms = hypre_TAlloc(double, extNrows , HYPRE_MEMORY_HOST); /* ---------------------------------------------------------------- */ /* compute the storage requirement for the ILU matrix */ /* ---------------------------------------------------------------- */ context = hypre_TAlloc(MH_Context, 1, HYPRE_MEMORY_HOST); context->Amat = Amat; total_nnz = 0; for ( i = 0; i < Nrows; i++ ) { rowNorms[i] = 0.0; while (MH_GetRow(context,1,&i,allocated_space,cols,vals,&m)==0) { hypre_TFree(vals, HYPRE_MEMORY_HOST); hypre_TFree(cols, HYPRE_MEMORY_HOST); allocated_space += 200 + 1; cols = hypre_TAlloc(int, allocated_space , HYPRE_MEMORY_HOST); vals = hypre_TAlloc(double, allocated_space , HYPRE_MEMORY_HOST); } total_nnz += m; for ( j = 0; j < m; j++ ) rowNorms[i] += habs(vals[j]); rowNorms[i] /= extNrows; } for ( i = 0; i < total_recv_leng; i++ ) total_nnz += recv_lengths[i]; mat_ia = hypre_TAlloc(int, (extNrows + 1 ) , HYPRE_MEMORY_HOST); mat_ja = hypre_TAlloc(int, total_nnz , HYPRE_MEMORY_HOST); mat_aa = hypre_TAlloc(double, total_nnz , HYPRE_MEMORY_HOST); total_nnz = total_nnz * 7; mat_ia2 = hypre_TAlloc(int, (extNrows + 1 ) , HYPRE_MEMORY_HOST); mat_ja2 = hypre_TAlloc(int, total_nnz , HYPRE_MEMORY_HOST); ncnt = 0; mat_ia[0] = 0; for ( i = 0; i < Nrows; i++ ) { MH_GetRow(context,1,&i,allocated_space,cols,vals,&m); for ( j = 0; j < m; j++ ) { if ( vals[j] != 0.0 ) { mat_ja[ncnt] = cols[j]; mat_aa[ncnt++] = vals[j]; } } mat_ia[i+1] = ncnt; } offset = 0; for ( i = 0; i < total_recv_leng; i++ ) { rowNorms[i+Nrows] = 0.0; for ( j = offset; j < offset+recv_lengths[i]; j++ ) { index = ext_ja[j]; if ( index >= Noffset && index < Noffset+Nrows ) ext_ja[j] = index - Noffset; else { m = HYPRE_LSI_Search(map, index, extNrows-Nrows); if ( m >= 0 ) ext_ja[j] = map2[m] + Nrows; else ext_ja[j] = -1; } if ( ext_ja[j] != -1 && ext_aa[j] != 0.0 ) { rowNorms[i+Nrows] += habs(ext_aa[j]); mat_ja[ncnt] = ext_ja[j]; mat_aa[ncnt++] = ext_aa[j]; } } rowNorms[i+Nrows] /= extNrows; offset += recv_lengths[i]; mat_ia[Nrows+i+1] = ncnt; } /* ---------------------------------------------------------------- */ /* process the pattern */ /* ---------------------------------------------------------------- */ ncnt = 0; mat_ia2[0] = 0; printstep = extNrows / 10; for ( i = 0; i < extNrows; i++ ) { if ( ( i % printstep == 0 ) && ilut_ptr->outputLevel > 0 ) printf("%4d : DDILUT Processing pattern row = %d (%d)\n",mypid,i,extNrows); k = mat_ia[i+1] - mat_ia[i]; for ( j = mat_ia[i]; j < mat_ia[i+1]; j++ ) { index = mat_ja[j]; k += ( mat_ia[index+1] - mat_ia[index] ); } if ( (k+ncnt) > total_nnz ) { iarray = mat_ja2; total_nnz += (extNrows - i ) * k; mat_ja2 = hypre_TAlloc(int, total_nnz , HYPRE_MEMORY_HOST); for ( j = 0; j < ncnt; j++ ) mat_ja2[j] = iarray[j]; hypre_TFree(iarray, HYPRE_MEMORY_HOST); } for ( j = mat_ia[i]; j < mat_ia[i+1]; j++ ) { index = mat_ja[j]; mat_ja2[ncnt++] = index; for (k = mat_ia[index]; k < mat_ia[index+1]; k++) mat_ja2[ncnt++] = mat_ja[k]; } hypre_qsort0(mat_ja2, mat_ia2[i], ncnt-1); k = mat_ia2[i] + 1; for ( j = mat_ia2[i]+1; j < ncnt; j++ ) { if ( mat_ja2[j] != mat_ja2[k-1] ) mat_ja2[k++] = mat_ja2[j]; } mat_ia2[i+1] = k; ncnt = k; } for ( i = 0; i < ncnt; i++ ) if ( mat_ja2[i] < 0 || mat_ja2[i] >= extNrows ) printf("%4d : DDILUT ERROR ja %d = %d \n",mypid,i,mat_ja2[i]); mat_aa2 = hypre_TAlloc(double, ncnt , HYPRE_MEMORY_HOST); /* ---------------------------------------------------------------- */ /* process the rows */ /* ---------------------------------------------------------------- */ num_small_pivot = 0; track_array = hypre_TAlloc(int, extNrows , HYPRE_MEMORY_HOST); for ( i = 0; i < extNrows; i++ ) dble_buf[i] = 0.0; for ( i = 0; i < extNrows; i++ ) { if ( i % printstep == 0 && ilut_ptr->outputLevel > 0 ) printf("%4d : $DDILUT Processing row %d(%d,%d)\n",mypid,i,extNrows,Nrows); /* ------------------------------------------------------------- */ /* load the row into buffer */ /* ------------------------------------------------------------- */ track_leng = 0; first = extNrows; for ( j = mat_ia[i]; j < mat_ia[i+1]; j++ ) { index = mat_ja[j]; dble_buf[index] = mat_aa[j]; track_array[track_leng++] = index; if ( index < first ) first = index; } /* ------------------------------------------------------------- */ /* perform factorization */ /* ------------------------------------------------------------- */ rel_tau = tau * rowNorms[i]; for ( j = first; j < i; j++ ) { if ( habs(dble_buf[j]) > rel_tau ) { ddata = dble_buf[j] / diagonal[j]; for ( k = mat_ia2[j]; k < mat_ia2[j+1]; k++ ) { colIndex = mat_ja2[k]; if ( colIndex > j && mat_aa2[k] != 0.0 ) { if ( dble_buf[colIndex] != 0.0 ) dble_buf[colIndex] -= (ddata * mat_aa2[k]); else { dble_buf[colIndex] = - (ddata * mat_aa2[k]); if ( dble_buf[colIndex] != 0.0 ) track_array[track_leng++] = colIndex; } } } dble_buf[j] = ddata; } else dble_buf[j] = 0.0; } diagonal[i] = dble_buf[i]; if ( habs(diagonal[i]) < 1.0e-16 ) { diagonal[i] = dble_buf[i] = 1.0E-6; num_small_pivot++; } for (j = mat_ia2[i]; j < mat_ia2[i+1]; j++) mat_aa2[j] = dble_buf[mat_ja2[j]]; for ( j = 0; j < track_leng; j++ ) dble_buf[track_array[j]] = 0.0; } nnz_count = mat_ia2[extNrows]; if ( ilut_ptr->outputLevel > 0 ) { printf("%4d : DDILUT number of nonzeros = %d\n",mypid,nnz_count); printf("%4d : DDILUT number of small pivots = %d\n",mypid,num_small_pivot); } /* ---------------------------------------------------------- */ /* deallocate temporary storage space */ /* ---------------------------------------------------------- */ ilut_ptr->mat_ia = mat_ia2; ilut_ptr->mat_ja = mat_ja2; ilut_ptr->mat_aa = mat_aa2; hypre_TFree(mat_ia, HYPRE_MEMORY_HOST); hypre_TFree(mat_ja, HYPRE_MEMORY_HOST); hypre_TFree(mat_aa, HYPRE_MEMORY_HOST); hypre_TFree(cols, HYPRE_MEMORY_HOST); hypre_TFree(vals, HYPRE_MEMORY_HOST); hypre_TFree(dble_buf, HYPRE_MEMORY_HOST); hypre_TFree(diagonal, HYPRE_MEMORY_HOST); hypre_TFree(rowNorms, HYPRE_MEMORY_HOST); hypre_TFree(context, HYPRE_MEMORY_HOST); hypre_TFree(track_array, HYPRE_MEMORY_HOST); return 0; } hypre-2.33.0/src/FEI_mv/fei-hypre/HYPRE_LSI_ddilut.h000066400000000000000000000032141477326011500216340ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * HYPRE_DDILUT interface * *****************************************************************************/ #ifndef __HYPRE_DDILUT__ #define __HYPRE_DDILUT__ #include #include #include #include #include "utilities/_hypre_utilities.h" #include "parcsr_ls/HYPRE_parcsr_ls.h" #include "parcsr_mv/_hypre_parcsr_mv.h" #ifdef __cplusplus extern "C" { #endif extern int HYPRE_LSI_DDIlutCreate( MPI_Comm comm, HYPRE_Solver *solver ); extern int HYPRE_LSI_DDIlutDestroy( HYPRE_Solver solver ); extern int HYPRE_LSI_DDIlutSetFillin( HYPRE_Solver solver, double fillin); extern int HYPRE_LSI_DDIlutSetOutputLevel( HYPRE_Solver solver, int level); extern int HYPRE_LSI_DDIlutSetDropTolerance( HYPRE_Solver solver, double thresh); extern int HYPRE_LSI_DDIlutSetOverlap( HYPRE_Solver solver ); extern int HYPRE_LSI_DDIlutSetReorder( HYPRE_Solver solver ); extern int HYPRE_LSI_DDIlutSolve( HYPRE_Solver solver, HYPRE_ParCSRMatrix A, HYPRE_ParVector b, HYPRE_ParVector x ); extern int HYPRE_LSI_DDIlutSetup( HYPRE_Solver solver, HYPRE_ParCSRMatrix A, HYPRE_ParVector b, HYPRE_ParVector x ); #ifdef __cplusplus } #endif #endif hypre-2.33.0/src/FEI_mv/fei-hypre/HYPRE_LSI_ml.c000066400000000000000000001306061477326011500207600ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************/ /* HYPRE_LSI_ML interface */ /*--------------------------------------------------------------------------*/ /* local functions : * * MH_Irecv * MH_Send * MH_Wait * MH_ExchBdry * MH_MatVec * MH_GetRow * HYPRE_LSI_MLCreate * HYPRE_LSI_MLDestroy * HYPRE_LSI_MLSetup * HYPRE_LSI_MLSolve * HYPRE_LSI_MLSetStrongThreshold * HYPRE_LSI_MLSetMethod * HYPRE_LSI_MLSetNumPreSmoothings * HYPRE_LSI_MLSetNumPostSmoothings * HYPRE_LSI_MLSetPreSmoother * HYPRE_LSI_MLSetPostSmoother * HYPRE_LSI_MLSetDampingFactor * HYPRE_LSI_MLSetCoarseSolver * HYPRE_LSI_MLSetCoarsenScheme * HYPRE_LSI_MLConstructMHMatrix ****************************************************************************/ #include #include #include #include "../../parcsr_ls/HYPRE_parcsr_ls.h" #include "../../utilities/_hypre_utilities.h" #include "../../distributed_matrix/HYPRE_distributed_matrix_types.h" #include "../../distributed_matrix/HYPRE_distributed_matrix_protos.h" #include "../../matrix_matrix/HYPRE_matrix_matrix_protos.h" #include "../../seq_mv/vector.h" #include "../../parcsr_mv/_hypre_parcsr_mv.h" /* #include "../../parcsr_mv/par_vector.h" */ extern void hypre_qsort0(int *, int, int); #include "HYPRE_MHMatrix.h" extern int HYPRE_LSI_MLConstructMHMatrix(HYPRE_ParCSRMatrix, MH_Matrix *, MPI_Comm, int *,MH_Context*); /****************************************************************************/ /* communication functions on parallel platforms */ /*--------------------------------------------------------------------------*/ int MH_Irecv(void* buf, unsigned int count, int *src, int *mid, MPI_Comm comm, MPI_Request *request ) { #ifdef HYPRE_SEQUENTIAL return 0; #else int my_id, lsrc, retcode; if ( *src < 0 ) lsrc = MPI_ANY_SOURCE; else lsrc = (*src); retcode = MPI_Irecv( buf, (int) count, MPI_BYTE, lsrc, *mid, comm, request); if ( retcode != 0 ) { MPI_Comm_rank(comm, &my_id); printf("%d : MH_Irecv warning : retcode = %d\n", my_id, retcode); } return 0; #endif } int MH_Wait(void* buf, unsigned int count, int *src, int *mid, MPI_Comm comm, MPI_Request *request ) { #ifdef HYPRE_SEQUENTIAL return count; #else MPI_Status status; int my_id, incount, retcode; retcode = MPI_Wait( request, &status ); if ( retcode != 0 ) { MPI_Comm_rank(comm, &my_id); printf("%d : MH_Wait warning : retcode = %d\n", my_id, retcode); } MPI_Get_count(&status, MPI_BYTE, &incount); if ( *src < 0 ) *src = status.MPI_SOURCE; return incount; #endif } int MH_Send(void* buf, unsigned int count, int dest, int mid, MPI_Comm comm ) { #ifdef HYPRE_SEQUENTIAL return 0; #else int my_id; int retcode = MPI_Send( buf, (int) count, MPI_BYTE, dest, mid, comm); if ( retcode != 0 ) { MPI_Comm_rank(comm, &my_id); printf("%d : MH_Send warning : retcode = %d\n", my_id, retcode); } return 0; #endif } /****************************************************************************/ /* wrapper function for interprocessor communication for matvec and getrow */ /*--------------------------------------------------------------------------*/ int MH_ExchBdry(double *vec, void *obj) { #ifdef HYPRE_SEQUENTIAL return 0; #else int i, j, msgid, leng, src, dest, offset, *tempList; double *dbuf; MH_Context *context; MH_Matrix *Amat; MPI_Comm comm; MPI_Request *request; int sendProcCnt, recvProcCnt; int *sendProc, *recvProc; int *sendLeng, *recvLeng; int **sendList, nRows; context = (MH_Context *) obj; Amat = (MH_Matrix *) context->Amat; comm = context->comm; sendProcCnt = Amat->sendProcCnt; recvProcCnt = Amat->recvProcCnt; sendProc = Amat->sendProc; recvProc = Amat->recvProc; sendLeng = Amat->sendLeng; recvLeng = Amat->recvLeng; sendList = Amat->sendList; nRows = Amat->Nrows; if ( recvProcCnt > 0 ) request = hypre_TAlloc( MPI_Request , recvProcCnt , HYPRE_MEMORY_HOST); msgid = 234; offset = nRows; for ( i = 0; i < recvProcCnt; i++ ) { leng = recvLeng[i] * sizeof( double ); src = recvProc[i]; MH_Irecv((void*) &(vec[offset]), leng, &src, &msgid, comm, &request[i]); offset += recvLeng[i]; } msgid = 234; for ( i = 0; i < sendProcCnt; i++ ) { dest = sendProc[i]; leng = sendLeng[i] * sizeof( double ); dbuf = hypre_TAlloc(double, leng , HYPRE_MEMORY_HOST); tempList = sendList[i]; for ( j = 0; j < sendLeng[i]; j++ ) { dbuf[j] = vec[tempList[j]]; } MH_Send((void*) dbuf, leng, dest, msgid, comm); hypre_TFree(dbuf , HYPRE_MEMORY_HOST); } offset = nRows; for ( i = 0; i < recvProcCnt; i++ ) { leng = recvLeng[i] * sizeof( double ); src = recvProc[i]; MH_Wait((void*) &(vec[offset]), leng, &src, &msgid, comm, &request[i]); offset += recvLeng[i]; } if ( recvProcCnt > 0 ) hypre_TFree(request , HYPRE_MEMORY_HOST); return 1; #endif } /****************************************************************************/ /* wrapper function for interprocessor communication for matvec and getrow */ /*--------------------------------------------------------------------------*/ int MH_ExchBdryBack(double *vec, void *obj, int *length, double **outvec, int **outindices) { #ifdef HYPRE_SEQUENTIAL (*outvec) = NULL; (*outindices) = NULL; (*length) = 0; return 0; #else int i, j, msgid, leng, src, dest, offset; MH_Context *context; MH_Matrix *Amat; MPI_Comm comm; MPI_Request *request; int sendProcCnt, recvProcCnt; int *sendProc, *recvProc; int *sendLeng, *recvLeng; int **sendList, nRows; context = (MH_Context *) obj; Amat = (MH_Matrix *) context->Amat; comm = context->comm; sendProcCnt = Amat->sendProcCnt; recvProcCnt = Amat->recvProcCnt; sendProc = Amat->sendProc; recvProc = Amat->recvProc; sendLeng = Amat->sendLeng; recvLeng = Amat->recvLeng; sendList = Amat->sendList; nRows = Amat->Nrows; if ( sendProcCnt > 0 ) { request = hypre_TAlloc( MPI_Request , sendProcCnt , HYPRE_MEMORY_HOST); leng = 0; for ( i = 0; i < sendProcCnt; i++ ) leng += sendLeng[i]; (*outvec) = hypre_TAlloc(double, leng , HYPRE_MEMORY_HOST); (*outindices) = hypre_TAlloc(int, leng , HYPRE_MEMORY_HOST); (*length) = leng; offset = 0; for ( i = 0; i < sendProcCnt; i++ ) { for ( j = 0; j < sendLeng[i]; j++ ) (*outindices)[offset+j] = sendList[i][j]; offset += sendLeng[i]; } } else { (*outvec) = NULL; (*outindices) = NULL; (*length) = 0; } msgid = 8234; offset = 0; for ( i = 0; i < sendProcCnt; i++ ) { leng = sendLeng[i] * sizeof( double ); src = sendProc[i]; MH_Irecv((void*) &((*outvec)[offset]), leng, &src, &msgid, comm, &request[i]); offset += sendLeng[i]; } msgid = 8234; offset = nRows; for ( i = 0; i < recvProcCnt; i++ ) { dest = recvProc[i]; leng = recvLeng[i] * sizeof( double ); MH_Send((void*) &(vec[offset]), leng, dest, msgid, comm); offset += recvLeng[i]; } offset = 0; for ( i = 0; i < sendProcCnt; i++ ) { leng = sendLeng[i] * sizeof( double ); src = sendProc[i]; MH_Wait((void*) &((*outvec)[offset]), leng, &src, &msgid, comm, &request[i]); offset += sendLeng[i]; } if ( sendProcCnt > 0 ) hypre_TFree(request, HYPRE_MEMORY_HOST); return 1; #endif } /****************************************************************************/ /* matvec function for local matrix structure MH_Matrix */ /*--------------------------------------------------------------------------*/ int MH_MatVec(void *obj, int leng1, double p[], int leng2, double ap[]) { MH_Context *context; MH_Matrix *Amat; int i, j, length, nRows, ibeg, iend, k; double *dbuf, sum; int *rowptr, *colnum; double *values; context = (MH_Context *) obj; Amat = (MH_Matrix*) context->Amat; nRows = Amat->Nrows; rowptr = Amat->rowptr; colnum = Amat->colnum; values = Amat->values; length = nRows; for ( i = 0; i < Amat->recvProcCnt; i++ ) length += Amat->recvLeng[i]; dbuf = hypre_TAlloc( double , length , HYPRE_MEMORY_HOST); for ( i = 0; i < nRows; i++ ) dbuf[i] = p[i]; MH_ExchBdry(dbuf, obj); for ( i = 0 ; i < nRows; i++ ) { sum = 0.0; ibeg = rowptr[i]; iend = rowptr[i+1]; for ( j = ibeg; j < iend; j++ ) { k = colnum[j]; sum += ( values[j] * dbuf[k] ); } ap[i] = sum; } hypre_TFree(dbuf, HYPRE_MEMORY_HOST); return 1; } /****************************************************************************/ /* getrow function for local matrix structure MH_Matrix (ML compatible) */ /*--------------------------------------------------------------------------*/ int MH_GetRow(void *obj, int N_requested_rows, int requested_rows[], int allocated_space, int columns[], double values[], int row_lengths[]) { int i, j, ncnt, colindex, rowLeng, rowindex; MH_Context *context = (MH_Context *) obj; MH_Matrix *Amat = (MH_Matrix*) context->Amat; int nRows = Amat->Nrows; int *rowptr = Amat->rowptr; int *colInd = Amat->colnum; double *colVal = Amat->values; ncnt = 0; for ( i = 0; i < N_requested_rows; i++ ) { rowindex = requested_rows[i]; if ( rowindex < 0 || rowindex >= nRows ) printf("Invalid row request in GetRow : %d (%d)\n",rowindex, nRows); rowLeng = rowptr[rowindex+1] - rowptr[rowindex]; if ( ncnt+rowLeng > allocated_space ) {row_lengths[i]=-9; return 0;} row_lengths[i] = rowLeng; colindex = rowptr[rowindex]; for ( j = 0; j < rowLeng; j++ ) { columns[ncnt] = colInd[colindex]; values[ncnt++] = colVal[colindex++]; } } return 1; } /****************************************************************************/ /* HYPRE_LSI_MLCreate */ /*--------------------------------------------------------------------------*/ int HYPRE_LSI_MLCreate( MPI_Comm comm, HYPRE_Solver *solver) { #ifdef HAVE_ML /* create an internal ML data structure */ MH_Link *link = hypre_TAlloc( MH_Link , 1, HYPRE_MEMORY_HOST); if ( link == NULL ) return 1; /* fill in all other default parameters */ link->comm = comm; link->nlevels = 20; /* max number of levels */ link->method = 1; /* default - smoothed aggregation */ link->num_PDEs = 1; /* default - 1 */ link->pre = 1; /* default - Gauss Seidel */ link->post = 1; link->pre_sweeps = 2; /* default - 2 smoothing steps */ link->post_sweeps = 2; link->BGS_blocksize = 3; link->jacobi_wt = 1.0; /* default damping factor */ link->ml_ag = NULL; link->ml_amg = NULL; link->ag_threshold = 0.08; /* threshold for aggregation */ link->contxt = NULL; /* context for matvec */ link->coarse_solver = 0; /* default = SuperLU */ /* create the ML structure */ ML_Create( &(link->ml_ptr), link->nlevels ); *solver = (HYPRE_Solver) link; return 0; #else printf("ML not linked.\n"); return -1; #endif } /****************************************************************************/ /* HYPRE_LSI_MLDestroy */ /*--------------------------------------------------------------------------*/ int HYPRE_LSI_MLDestroy( HYPRE_Solver solver ) { #ifdef HAVE_ML int i; MH_Matrix *Amat; MH_Link *link = (MH_Link *) solver; if ( link->ml_ag != NULL ) ML_Aggregate_Destroy( &(link->ml_ag) ); if ( link->ml_amg != NULL ) ML_AMG_Destroy( &(link->ml_amg) ); ML_Destroy( &(link->ml_ptr) ); hypre_TFree(link->contxt->partition, HYPRE_MEMORY_HOST); if ( link->contxt->Amat != NULL ) { Amat = (MH_Matrix *) link->contxt->Amat; hypre_TFree(Amat->sendProc, HYPRE_MEMORY_HOST); hypre_TFree(Amat->sendLeng, HYPRE_MEMORY_HOST); if ( Amat->sendList != NULL ) { for (i = 0; i < Amat->sendProcCnt; i++ ) hypre_TFree(Amat->sendList[i], HYPRE_MEMORY_HOST); hypre_TFree(Amat->sendList, HYPRE_MEMORY_HOST); } hypre_TFree(Amat->recvProc, HYPRE_MEMORY_HOST); hypre_TFree(Amat->recvLeng, HYPRE_MEMORY_HOST); hypre_TFree(Amat->map, HYPRE_MEMORY_HOST); hypre_TFree(Amat, HYPRE_MEMORY_HOST); } hypre_TFree(link->contxt, HYPRE_MEMORY_HOST); hypre_TFree(link, HYPRE_MEMORY_HOST); return 0; #else printf("ML not linked.\n"); return -1; #endif } /****************************************************************************/ /* HYPRE_LSI_MLSetup */ /*--------------------------------------------------------------------------*/ int HYPRE_LSI_MLSetup( HYPRE_Solver solver, HYPRE_ParCSRMatrix A, HYPRE_ParVector b, HYPRE_ParVector x ) { #ifdef HAVE_ML int i, my_id, nprocs, coarsest_level, level, sweeps, nlevels; int *row_partition, localEqns, length; int Nblocks, *blockList; double wght; MH_Context *context; MH_Matrix *mh_mat; /* -------------------------------------------------------- */ /* fetch the ML pointer */ /* -------------------------------------------------------- */ MH_Link *link = (MH_Link *) solver; ML *ml = link->ml_ptr; nlevels = link->nlevels; /* -------------------------------------------------------- */ /* set up the parallel environment */ /* -------------------------------------------------------- */ MPI_Comm_rank(link->comm, &my_id); MPI_Comm_size(link->comm, &nprocs); /* -------------------------------------------------------- */ /* fetch the matrix row partition information and put it */ /* into the matrix data object (for matvec and getrow) */ /* -------------------------------------------------------- */ HYPRE_ParCSRMatrixGetRowPartitioning( A, &row_partition ); localEqns = row_partition[my_id+1] - row_partition[my_id]; context = hypre_TAlloc(MH_Context, 1, HYPRE_MEMORY_HOST); link->contxt = context; context->comm = link->comm; context->globalEqns = row_partition[nprocs]; context->partition = hypre_TAlloc(int, (nprocs+1), HYPRE_MEMORY_HOST); for (i=0; i<=nprocs; i++) context->partition[i] = row_partition[i]; hypre_TFree( row_partition , HYPRE_MEMORY_HOST); mh_mat = hypre_TAlloc( MH_Matrix, 1, HYPRE_MEMORY_HOST); context->Amat = mh_mat; HYPRE_LSI_MLConstructMHMatrix(A,mh_mat,link->comm, context->partition,context); /* -------------------------------------------------------- */ /* set up the ML communicator information */ /* -------------------------------------------------------- */ ML_Set_Comm_Communicator(ml, link->comm); ML_Set_Comm_MyRank(ml, my_id); ML_Set_Comm_Nprocs(ml, nprocs); ML_Set_Comm_Send(ml, MH_Send); ML_Set_Comm_Recv(ml, MH_Irecv); ML_Set_Comm_Wait(ml, MH_Wait); /* -------------------------------------------------------- */ /* set up the ML matrix information */ /* -------------------------------------------------------- */ ML_Init_Amatrix(ml, nlevels-1, localEqns, localEqns, (void *) context); ML_Set_Amatrix_Matvec(ml, nlevels-1, MH_MatVec); length = localEqns; for (i=0; irecvProcCnt; i++ ) length += mh_mat->recvLeng[i]; ML_Set_Amatrix_Getrow(ml, nlevels-1, MH_GetRow, MH_ExchBdry, length); /* -------------------------------------------------------- */ /* create an AMG or aggregate context */ /* -------------------------------------------------------- */ if ( link->method == 0 ) { ML_AMG_Create(&(link->ml_amg)); ML_AMG_Set_Threshold( link->ml_amg, link->ag_threshold ); if ( link->num_PDEs > 1 ) ML_AMG_Set_AMGScheme_SystemUnknown(link->ml_amg, link->num_PDEs); else ML_AMG_Set_AMGScheme_Scalar(link->ml_amg); ML_AMG_Set_MaxLevels( link->ml_amg, link->nlevels ); coarsest_level = ML_Gen_MGHierarchy_UsingAMG(ml, nlevels-1, ML_DECREASING, link->ml_amg); } else { ML_Aggregate_Create(&(link->ml_ag)); ML_Aggregate_Set_MaxLevels( link->ml_ag, link->nlevels ); ML_Aggregate_Set_Threshold( link->ml_ag, link->ag_threshold ); switch (link->coarsen_scheme) { case 1 : ML_Aggregate_Set_CoarsenScheme_Uncoupled(link->ml_ag); break; case 2 : ML_Aggregate_Set_CoarsenScheme_Coupled(link->ml_ag); break; case 3 : ML_Aggregate_Set_CoarsenScheme_MIS(link->ml_ag); break; case 5 : ML_Aggregate_Set_CoarsenScheme_UncoupledMIS(link->ml_ag); break; case 6 : ML_Aggregate_Set_CoarsenScheme_UncoupledCoupled(link->ml_ag); break; default: ML_Aggregate_Set_CoarsenScheme_Uncoupled(link->ml_ag); break; } coarsest_level = ML_Gen_MGHierarchy_UsingAggregation(ml, nlevels-1, ML_DECREASING, link->ml_ag); } /* -------------------------------------------------------- */ /* perform aggregation */ /* -------------------------------------------------------- */ if ( my_id == 0 ) printf("ML : number of levels = %d\n", coarsest_level); coarsest_level = nlevels - coarsest_level; /* -------------------------------------------------------- */ /* set up smoother and coarse solver */ /* -------------------------------------------------------- */ for (level = nlevels-1; level > coarsest_level; level--) { sweeps = link->pre_sweeps; wght = link->jacobi_wt; switch ( link->pre ) { case 0 : ML_Gen_Smoother_Jacobi(ml, level, ML_PRESMOOTHER, sweeps, wght); break; case 1 : ML_Gen_Smoother_SymGaussSeidel(ml,level,ML_PRESMOOTHER,sweeps,1.0); break; case 2 : ML_Gen_Smoother_SymGaussSeidelSequential(ml,level,ML_PRESMOOTHER, sweeps,1.0); break; case 3 : if ( link->method == 1 ) { Nblocks = ML_Aggregate_Get_AggrCount( link->ml_ag, level ); ML_Aggregate_Get_AggrMap( link->ml_ag, level, &blockList ); ML_Gen_Smoother_VBlockJacobi(ml,level,ML_PRESMOOTHER, sweeps, wght, Nblocks, blockList); } else { ML_Gen_Smoother_SymGaussSeidel(ml,level,ML_PRESMOOTHER, sweeps,1.0); } break; case 4 : if ( link->method == 1 ) { Nblocks = ML_Aggregate_Get_AggrCount( link->ml_ag, level ); ML_Aggregate_Get_AggrMap( link->ml_ag, level, &blockList ); ML_Gen_Smoother_VBlockSymGaussSeidel(ml,level, ML_PRESMOOTHER, sweeps, 1.0, Nblocks, blockList); } else { ML_Gen_Smoother_GaussSeidel(ml,level,ML_PRESMOOTHER, sweeps,wght); } break; case 5 : if ( link->method == 1 ) { Nblocks = ML_Aggregate_Get_AggrCount( link->ml_ag, level ); ML_Aggregate_Get_AggrMap( link->ml_ag, level, &blockList ); ML_Gen_Smoother_VBlockSymGaussSeidelSequential(ml,level, ML_PRESMOOTHER,sweeps,1.0,Nblocks,blockList); } else { ML_Gen_Smoother_GaussSeidel(ml,level,ML_PRESMOOTHER, sweeps,wght); } break; case 6 : ML_Gen_Smoother_OverlappedDDILUT(ml,level, ML_PRESMOOTHER); break; case 7 : ML_Gen_Smoother_VBlockAdditiveSchwarz(ml,level,ML_PRESMOOTHER, sweeps, 0, NULL); break; case 8 : ML_Gen_Smoother_VBlockMultiplicativeSchwarz(ml,level, ML_PRESMOOTHER, sweeps, 0, NULL); break; case 9 : ML_Gen_Smoother_ParaSails(ml, level, ML_PRESMOOTHER, sweeps, 0, 0.1, 1, 0.01, 0, 1); break; default : if ( my_id == 0 ) printf("ML Presmoother : set to default (SGS)\n"); ML_Gen_Smoother_SymGaussSeidel(ml,level,ML_PRESMOOTHER,sweeps,1.0); break; } sweeps = link->post_sweeps; switch ( link->post ) { case 0 : ML_Gen_Smoother_Jacobi(ml, level, ML_POSTSMOOTHER, sweeps, wght); break; case 1 : ML_Gen_Smoother_SymGaussSeidel(ml,level,ML_POSTSMOOTHER, sweeps,1.0); break; case 2 : ML_Gen_Smoother_SymGaussSeidelSequential(ml,level,ML_POSTSMOOTHER, sweeps,1.0); break; case 3 : if ( link->method == 1 ) { Nblocks = ML_Aggregate_Get_AggrCount( link->ml_ag, level ); ML_Aggregate_Get_AggrMap( link->ml_ag, level, &blockList ); ML_Gen_Smoother_VBlockJacobi(ml,level,ML_POSTSMOOTHER, sweeps, wght, Nblocks, blockList); } else { ML_Gen_Smoother_SymGaussSeidel(ml,level,ML_POSTSMOOTHER, sweeps,1.0); } break; case 4 : if ( link->method == 1 ) { Nblocks = ML_Aggregate_Get_AggrCount( link->ml_ag, level ); ML_Aggregate_Get_AggrMap( link->ml_ag, level, &blockList ); ML_Gen_Smoother_VBlockSymGaussSeidel(ml,level,ML_POSTSMOOTHER, sweeps,1.0,Nblocks,blockList); } else { ML_Gen_Smoother_SymGaussSeidel(ml,level,ML_POSTSMOOTHER, sweeps,1.0); } break; case 5 : if ( link->method == 1 ) { Nblocks = ML_Aggregate_Get_AggrCount( link->ml_ag, level ); ML_Aggregate_Get_AggrMap( link->ml_ag, level, &blockList ); ML_Gen_Smoother_VBlockSymGaussSeidelSequential(ml,level, ML_POSTSMOOTHER,sweeps,1.0,Nblocks,blockList); } else { ML_Gen_Smoother_SymGaussSeidel(ml,level,ML_POSTSMOOTHER, sweeps,1.0); } break; default : if ( my_id == 0 ) printf("ML Postsmoother : set to default (SGS)\n"); ML_Gen_Smoother_SymGaussSeidel(ml,level,ML_POSTSMOOTHER, sweeps,1.0); break; } } if ( link->coarse_solver == 0 ) { #ifdef HAVE_SUPERLU ML_Gen_CoarseSolverSuperLU(ml, coarsest_level); #else printf("SuperLU not compiled in : default to GS(50).\n"); #endif } else if ( link->coarse_solver == 1 ) { ML_Gen_CoarseSolverAggregation(ml, coarsest_level, link->ml_ag); } else { ML_Gen_Smoother_GaussSeidel(ml,coarsest_level,ML_PRESMOOTHER,50,1.0); } ML_Gen_Solver(ml, ML_MGV, nlevels-1, coarsest_level); return 0; #else printf("ML not linked.\n"); return -1; #endif } /****************************************************************************/ /* HYPRE_LSI_MLSolve */ /*--------------------------------------------------------------------------*/ int HYPRE_LSI_MLSolve( HYPRE_Solver solver, HYPRE_ParCSRMatrix A, HYPRE_ParVector b, HYPRE_ParVector x ) { #ifdef HAVE_ML double *rhs, *sol; MH_Link *link = (MH_Link *) solver; ML *ml = link->ml_ptr; int leng, level = ml->ML_num_levels - 1; ML_Operator *Amat = &(ml->Amat[level]); ML_Krylov *ml_kry; rhs = hypre_VectorData(hypre_ParVectorLocalVector((hypre_ParVector *) b)); sol = hypre_VectorData(hypre_ParVectorLocalVector((hypre_ParVector *) x)); /* ml_kry = ML_Krylov_Create(ml->comm); ML_Krylov_Set_Method(ml_kry, 1); ML_Krylov_Set_Amatrix(ml_kry, Amat); ML_Krylov_Set_Precon(ml_kry, ml); ML_Krylov_Set_PreconFunc(ml_kry, ML_AMGVSolve_Wrapper); leng = Amat->outvec_leng; ML_Krylov_Solve(ml_kry, leng, rhs, sol); ML_Krylov_Destroy(&ml_kry); */ ML_Solve_AMGV(ml, rhs, sol); /*ML_Iterate(ml, sol, rhs);*/ return 0; #else printf("ML not linked.\n"); return -1; #endif } /****************************************************************************/ /* HYPRE_LSI_MLSetStrongThreshold */ /*--------------------------------------------------------------------------*/ int HYPRE_LSI_MLSetStrongThreshold(HYPRE_Solver solver,double strong_threshold) { MH_Link *link = (MH_Link *) solver; if ( strong_threshold < 0.0 ) { printf("HYPRE_LSI_MLSetStrongThreshold WARNING : reset to 0.\n"); link->ag_threshold = 0.0; } else { link->ag_threshold = strong_threshold; } return( 0 ); } /****************************************************************************/ /* HYPRE_LSI_MLSetMethod */ /*--------------------------------------------------------------------------*/ int HYPRE_LSI_MLSetMethod( HYPRE_Solver solver, int method ) { MH_Link *link = (MH_Link *) solver; if ( method == 1 ) link->method = 1; /* smoothed aggregation */ else link->method = 0; /* AMG */ return( 0 ); } /****************************************************************************/ /* HYPRE_LSI_MLSetNumPDEs */ /*--------------------------------------------------------------------------*/ int HYPRE_LSI_MLSetNumPDEs( HYPRE_Solver solver, int numPDE ) { MH_Link *link = (MH_Link *) solver; if ( numPDE > 1 ) link->num_PDEs = numPDE; else link->num_PDEs = 1; return( 0 ); } /****************************************************************************/ /* HYPRE_LSI_MLSetNumPreSmoothings */ /*--------------------------------------------------------------------------*/ int HYPRE_LSI_MLSetNumPreSmoothings( HYPRE_Solver solver, int num_sweeps ) { MH_Link *link = (MH_Link *) solver; if ( num_sweeps < 0 ) { printf("HYPRE_LSI_MLSetNumPreSmoothings WARNING : reset to 0.\n"); link->pre_sweeps = 0; } else { link->pre_sweeps = num_sweeps; } return( 0 ); } /****************************************************************************/ /* HYPRE_LSI_MLSetNumPostSmoothings */ /*--------------------------------------------------------------------------*/ int HYPRE_LSI_MLSetNumPostSmoothings( HYPRE_Solver solver, int num_sweeps ) { MH_Link *link = (MH_Link *) solver; if ( num_sweeps < 0 ) { printf("HYPRE_LSI_MLSetNumPostSmoothings WARNING : reset to 0.\n"); link->post_sweeps = 0; } else { link->post_sweeps = num_sweeps; } return( 0 ); } /****************************************************************************/ /* HYPRE_LSI_MLSetPreSmoother */ /*--------------------------------------------------------------------------*/ int HYPRE_LSI_MLSetPreSmoother( HYPRE_Solver solver, int smoother_type ) { MH_Link *link = (MH_Link *) solver; if ( smoother_type < 0 || smoother_type > 6 ) { printf("HYPRE_LSI_MLSetPreSmoother WARNING : set to Jacobi.\n"); link->pre = 0; } else { link->pre = smoother_type; } return( 0 ); } /****************************************************************************/ /* HYPRE_LSI_MLSetPostSmoother */ /*--------------------------------------------------------------------------*/ int HYPRE_LSI_MLSetPostSmoother( HYPRE_Solver solver, int smoother_type ) { MH_Link *link = (MH_Link *) solver; if ( smoother_type < 0 || smoother_type > 6 ) { printf("HYPRE_LSI_MLSetPostSmoother WARNING : set to Jacobi.\n"); link->post = 0; } else { link->post = smoother_type; } return( 0 ); } /****************************************************************************/ /* HYPRE_LSI_MLSetDampingFactor */ /*--------------------------------------------------------------------------*/ int HYPRE_LSI_MLSetDampingFactor( HYPRE_Solver solver, double factor ) { MH_Link *link = (MH_Link *) solver; if ( factor < 0.0 || factor > 1.0 ) { printf("HYPRE_LSI_MLSetDampingFactor WARNING : set to 0.5.\n"); link->jacobi_wt = 0.5; } else { link->jacobi_wt = factor; } return( 0 ); } /****************************************************************************/ /* HYPRE_LSI_MLSetCoarseSolver */ /*--------------------------------------------------------------------------*/ int HYPRE_LSI_MLSetCoarseSolver( HYPRE_Solver solver, int solver_id ) { MH_Link *link = (MH_Link *) solver; if ( solver_id < 0 || solver_id > 2 ) { printf("HYPRE_LSI_MLSetCoarseSolver WARNING : reset to Aggr\n"); link->coarse_solver = 1; } else { link->coarse_solver = solver_id; } return( 0 ); } /****************************************************************************/ /* HYPRE_LSI_MLSetCoarsenScheme */ /*--------------------------------------------------------------------------*/ int HYPRE_LSI_MLSetCoarsenScheme( HYPRE_Solver solver, int scheme ) { MH_Link *link = (MH_Link *) solver; if ( scheme < 1 || scheme > 6 ) { printf("HYPRE_LSI_MLSetCoarsenScheme WARNING : reset to uncoupled\n"); link->coarsen_scheme = 1; } else { link->coarsen_scheme = scheme; } return( 0 ); } /****************************************************************************/ /* HYPRE_LSI_MLSetBGSBlockSize */ /*--------------------------------------------------------------------------*/ int HYPRE_LSI_MLSetBGSBlockSize( HYPRE_Solver solver, int size ) { MH_Link *link = (MH_Link *) solver; if ( size < 0 ) { printf("HYPRE_LSI_MLSetBGSBlockSize WARNING : reset to 1.\n"); link->BGS_blocksize = 1; } else { link->BGS_blocksize = size; } return( 0 ); } /****************************************************************************/ /* HYPRE_LSI_MLConstructMHMatrix */ /*--------------------------------------------------------------------------*/ int HYPRE_LSI_MLConstructMHMatrix(HYPRE_ParCSRMatrix A, MH_Matrix *mh_mat, MPI_Comm comm, int *partition,MH_Context *obj) { int i, j, index, my_id, nprocs; int rowLeng, *colInd, startRow, endRow, localEqns; int *diagSize, *offdiagSize, externLeng, *externList, ncnt, nnz; int *rowptr, *columns, num_bdry; double *colVal, *values; #ifndef HYPRE_SEQUENTIAL int sendProcCnt, *sendLeng, *sendProc, **sendList; int recvProcCnt, *recvLeng, *recvProc, *tempCnt, msgid; MPI_Request *Request; MPI_Status status; #endif /* -------------------------------------------------------- */ /* get machine information and local matrix information */ /* -------------------------------------------------------- */ #ifdef HYPRE_SEQUENTIAL my_id = 0; nprocs = 1; #else MPI_Comm_rank(comm, &my_id); MPI_Comm_size(comm, &nprocs); #endif startRow = partition[my_id]; endRow = partition[my_id+1] - 1; localEqns = endRow - startRow + 1; /* -------------------------------------------------------- */ /* probe A to find out about diagonal and off-diagonal */ /* block information */ /* -------------------------------------------------------- */ diagSize = hypre_TAlloc(int, localEqns , HYPRE_MEMORY_HOST); offdiagSize = hypre_TAlloc(int, localEqns , HYPRE_MEMORY_HOST); num_bdry = 0; for ( i = startRow; i <= endRow; i++ ) { diagSize[i-startRow] = offdiagSize[i-startRow] = 0; HYPRE_ParCSRMatrixGetRow(A, i, &rowLeng, &colInd, &colVal); for (j = 0; j < rowLeng; j++) if ( colInd[j] < startRow || colInd[j] > endRow ) { if ( colVal[j] != 0.0 ) offdiagSize[i-startRow]++; /*offdiagSize[i-startRow]++;*/ } else { if ( colVal[j] != 0.0 ) diagSize[i-startRow]++; /*diagSize[i-startRow]++;*/ } HYPRE_ParCSRMatrixRestoreRow(A, i, &rowLeng, &colInd, &colVal); if ( diagSize[i-startRow] + offdiagSize[i-startRow] == 1 ) num_bdry++; } /* -------------------------------------------------------- */ /* construct external node list in global eqn numbers */ /* -------------------------------------------------------- */ externLeng = 0; for ( i = 0; i < localEqns; i++ ) externLeng += offdiagSize[i]; if ( externLeng > 0 ) externList = hypre_TAlloc(int, externLeng, HYPRE_MEMORY_HOST); else externList = NULL; externLeng = 0; for ( i = startRow; i <= endRow; i++ ) { HYPRE_ParCSRMatrixGetRow(A, i, &rowLeng, &colInd, &colVal); for (j = 0; j < rowLeng; j++) { if ( colInd[j] < startRow || colInd[j] > endRow ) if ( colVal[j] != 0.0 ) externList[externLeng++] = colInd[j]; /* externList[externLeng++] = colInd[j]; */ } HYPRE_ParCSRMatrixRestoreRow(A, i, &rowLeng, &colInd, &colVal); } if ( externLeng > 1 ) hypre_qsort0( externList, 0, externLeng-1 ); ncnt = 0; for ( i = 1; i < externLeng; i++ ) { if ( externList[i] != externList[ncnt] ) externList[++ncnt] = externList[i]; } if ( externLeng > 0 ) externLeng = ncnt + 1; /* -------------------------------------------------------- */ /* allocate the CSR matrix */ /* -------------------------------------------------------- */ nnz = 0; for ( i = 0; i < localEqns; i++ ) nnz += diagSize[i] + offdiagSize[i]; rowptr = hypre_TAlloc(int, (localEqns + 1) , HYPRE_MEMORY_HOST); columns = hypre_TAlloc(int, nnz , HYPRE_MEMORY_HOST); values = hypre_TAlloc(double, nnz , HYPRE_MEMORY_HOST); rowptr[0] = 0; for ( i = 1; i <= localEqns; i++ ) rowptr[i] = rowptr[i-1] + diagSize[i-1] + offdiagSize[i-1]; hypre_TFree(diagSize, HYPRE_MEMORY_HOST); hypre_TFree(offdiagSize, HYPRE_MEMORY_HOST); /* -------------------------------------------------------- */ /* put the matrix data in the CSR matrix */ /* -------------------------------------------------------- */ rowptr[0] = 0; ncnt = 0; for ( i = startRow; i <= endRow; i++ ) { HYPRE_ParCSRMatrixGetRow(A, i, &rowLeng, &colInd, &colVal); for (j = 0; j < rowLeng; j++) { index = colInd[j]; if ( colVal[j] != 0.0 ) { if ( index < startRow || index > endRow ) { columns[ncnt] = hypre_BinarySearch(externList,index, externLeng ); columns[ncnt] += localEqns; values [ncnt++] = colVal[j]; } else { columns[ncnt] = index - startRow; values[ncnt++] = colVal[j]; } } } rowptr[i-startRow+1] = ncnt; HYPRE_ParCSRMatrixRestoreRow(A, i, &rowLeng, &colInd, &colVal); } hypre_assert( ncnt == nnz ); /* -------------------------------------------------------- */ /* initialize the MH_Matrix data structure */ /* -------------------------------------------------------- */ mh_mat->Nrows = localEqns; mh_mat->rowptr = rowptr; mh_mat->colnum = columns; mh_mat->values = values; mh_mat->sendProcCnt = 0; mh_mat->recvProcCnt = 0; mh_mat->sendLeng = NULL; mh_mat->recvLeng = NULL; mh_mat->sendProc = NULL; mh_mat->recvProc = NULL; mh_mat->sendList = NULL; mh_mat->map = externList; /* -------------------------------------------------------- */ /* form the remote portion of the matrix */ /* -------------------------------------------------------- */ #ifndef HYPRE_SEQUENTIAL if ( nprocs > 1 ) { /* ----------------------------------------------------- */ /* count number of elements to be received from each */ /* remote processor (assume sequential mapping) */ /* ----------------------------------------------------- */ tempCnt = hypre_TAlloc(int, nprocs , HYPRE_MEMORY_HOST); for ( i = 0; i < nprocs; i++ ) tempCnt[i] = 0; for ( i = 0; i < externLeng; i++ ) { for ( j = 0; j < nprocs; j++ ) { if ( externList[i] >= partition[j] && externList[i] < partition[j+1] ) { tempCnt[j]++; break; } } } /* ----------------------------------------------------- */ /* compile a list processors data is to be received from */ /* ----------------------------------------------------- */ recvProcCnt = 0; for ( i = 0; i < nprocs; i++ ) if ( tempCnt[i] > 0 ) recvProcCnt++; recvLeng = hypre_TAlloc(int, recvProcCnt , HYPRE_MEMORY_HOST); recvProc = hypre_TAlloc(int, recvProcCnt , HYPRE_MEMORY_HOST); recvProcCnt = 0; for ( i = 0; i < nprocs; i++ ) { if ( tempCnt[i] > 0 ) { recvProc[recvProcCnt] = i; recvLeng[recvProcCnt++] = tempCnt[i]; } } /* ----------------------------------------------------- */ /* each processor has to find out how many processors it */ /* has to send data to */ /* ----------------------------------------------------- */ sendLeng = hypre_TAlloc(int, nprocs , HYPRE_MEMORY_HOST); for ( i = 0; i < nprocs; i++ ) tempCnt[i] = 0; for ( i = 0; i < recvProcCnt; i++ ) tempCnt[recvProc[i]] = 1; MPI_Allreduce(tempCnt, sendLeng, nprocs, MPI_INT, MPI_SUM, comm ); sendProcCnt = sendLeng[my_id]; hypre_TFree(sendLeng, HYPRE_MEMORY_HOST); if ( sendProcCnt > 0 ) { sendLeng = hypre_TAlloc(int, sendProcCnt , HYPRE_MEMORY_HOST); sendProc = hypre_TAlloc(int, sendProcCnt , HYPRE_MEMORY_HOST); sendList = hypre_TAlloc(int*, sendProcCnt , HYPRE_MEMORY_HOST); } else { sendLeng = sendProc = NULL; sendList = NULL; } /* ----------------------------------------------------- */ /* each processor sends to all processors it expects to */ /* receive data about the lengths of data expected */ /* ----------------------------------------------------- */ msgid = 539; for ( i = 0; i < recvProcCnt; i++ ) { MPI_Send((void*) &recvLeng[i],1,MPI_INT,recvProc[i],msgid,comm); } for ( i = 0; i < sendProcCnt; i++ ) { MPI_Recv((void*) &sendLeng[i],1,MPI_INT,MPI_ANY_SOURCE,msgid, comm,&status); sendProc[i] = status.MPI_SOURCE; sendList[i] = hypre_TAlloc(int, sendLeng[i] , HYPRE_MEMORY_HOST); if ( sendList[i] == NULL ) printf("allocate problem %d \n", sendLeng[i]); } /* ----------------------------------------------------- */ /* each processor sends to all processors it expects to */ /* receive data about the equation numbers */ /* ----------------------------------------------------- */ for ( i = 0; i < nprocs; i++ ) tempCnt[i] = 0; ncnt = 1; for ( i = 0; i < externLeng; i++ ) { if ( externList[i] >= partition[ncnt] ) { tempCnt[ncnt-1] = i; i--; ncnt++; } } for ( i = ncnt-1; i < nprocs; i++ ) tempCnt[i] = externLeng; /* ----------------------------------------------------- */ /* send the global equation numbers */ /* ----------------------------------------------------- */ if ( sendProcCnt > 0 ) Request = hypre_TAlloc(MPI_Request, sendProcCnt , HYPRE_MEMORY_HOST); msgid = 540; for ( i = 0; i < sendProcCnt; i++ ) { MPI_Irecv((void*)sendList[i],sendLeng[i],MPI_INT,sendProc[i], msgid,comm,&Request[i]); } for ( i = 0; i < recvProcCnt; i++ ) { if ( recvProc[i] == 0 ) j = 0; else j = tempCnt[recvProc[i]-1]; rowLeng = recvLeng[i]; MPI_Send((void*) &externList[j], rowLeng, MPI_INT, recvProc[i], msgid, comm); } for ( i = 0; i < sendProcCnt; i++ ) { MPI_Wait( &Request[i], &status ); } if ( sendProcCnt > 0 ) hypre_TFree(Request, HYPRE_MEMORY_HOST); /* ----------------------------------------------------- */ /* convert the send list from global to local numbers */ /* ----------------------------------------------------- */ for ( i = 0; i < sendProcCnt; i++ ) { for ( j = 0; j < sendLeng[i]; j++ ) { index = sendList[i][j] - startRow; if ( index < 0 || index >= localEqns ) { printf("%d : Construct MH matrix Error - index out ",my_id); printf("of range %d\n", index); } sendList[i][j] = index; } } /* ----------------------------------------------------- */ /* convert the send list from global to local numbers */ /* ----------------------------------------------------- */ mh_mat->sendProcCnt = sendProcCnt; mh_mat->recvProcCnt = recvProcCnt; mh_mat->sendLeng = sendLeng; mh_mat->recvLeng = recvLeng; mh_mat->sendProc = sendProc; mh_mat->recvProc = recvProc; mh_mat->sendList = sendList; /* ----------------------------------------------------- */ /* clean up */ /* ----------------------------------------------------- */ hypre_TFree(tempCnt, HYPRE_MEMORY_HOST); } return 0; #else nprocs = 1; return (nprocs-1); #endif } hypre-2.33.0/src/FEI_mv/fei-hypre/HYPRE_LSI_mli.cxx000066400000000000000000002162341477326011500215130ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************/ /* HYPRE_LSI_MLI interface */ /*--------------------------------------------------------------------------*/ /* local functions : * * HYPRE_LSI_MLICreate * HYPRE_LSI_MLIDestroy * HYPRE_LSI_MLISetup * HYPRE_LSI_MLISolve * HYPRE_LSI_MLISetParams *-------------------------------------------------------------------------- * HYPRE_LSI_MLICreateNodeEqnMap * HYPRE_LSI_MLIAdjustNodeEqnMap * HYPRE_LSI_MLIAdjustNullSpace * HYPRE_LSI_MLISetFEData * HYPRE_LSI_MLILoadNodalCoordinates * HYPRE_LSI_MLILoadMatrixScalings * HYPRE_LSI_MLILoadMaterialLabels *-------------------------------------------------------------------------- * HYPRE_LSI_MLIFEDataCreate * HYPRE_LSI_MLIFEDataDestroy * HYPRE_LSI_MLIFEDataInitFields * HYPRE_LSI_MLIFEDataInitElemBlock * HYPRE_LSI_MLIFEDataInitElemNodeList * HYPRE_LSI_MLIFEDataInitSharedNodes * HYPRE_LSI_MLIFEDataInitComplete * HYPRE_LSI_MLIFEDataLoadElemMatrix * HYPRE_LSI_MLIFEDataWriteToFile *-------------------------------------------------------------------------- * HYPRE_LSI_MLISFEICreate * HYPRE_LSI_MLISFEIDestroy * HYPRE_LSI_MLISFEILoadElemMatrices * HYPRE_LSI_MLISFEIAddNumElems ****************************************************************************/ /****************************************************************************/ /* system include files */ /*--------------------------------------------------------------------------*/ #include "HYPRE_utilities.h" #include #include #include #include #if 0 /* RDF: Not sure this is really needed */ #ifdef WIN32 #define strcmp _stricmp #endif #endif /****************************************************************************/ /* MLI include files */ /*--------------------------------------------------------------------------*/ #ifdef HAVE_MLI #include "mli.h" #include "mli_utils.h" #include "mli_method.h" #endif #include "HYPRE_LSI_mli.h" /****************************************************************************/ /* HYPRE_LSI_MLI data structure */ /*--------------------------------------------------------------------------*/ typedef struct HYPRE_LSI_MLI_Struct { #ifdef HAVE_MLI MLI *mli_; MLI_FEData *feData_; /* holds FE information */ MLI_SFEI *sfei_; /* holds FE information */ MLI_Mapper *mapper_; /* holds mapping information */ #endif MPI_Comm mpiComm_; int outputLevel_; /* for diagnostics */ int nLevels_; /* max number of levels */ int cycleType_; /* 1 for V and 2 for W */ int maxIterations_; /* default - 1 iteration */ char method_[20]; /* default - smoothed aggregation */ char coarsenScheme_[20]; /* default - default in MLI */ char preSmoother_[20]; /* default - symmetric Gauss Seidel */ char postSmoother_ [20]; /* default - symmetric Gauss Seidel */ int preNSweeps_; /* default - 2 smoothing steps */ int postNSweeps_; /* default - 2 smoothing steps */ double *preSmootherWts_; /* relaxation weights */ double *postSmootherWts_; /* relaxation weights */ int smootherPrintRNorm_; /* for smoother diagnostics */ int smootherFindOmega_; /* for SGS smoother */ double strengthThreshold_; /* strength threshold */ char coarseSolver_[20]; /* default = SuperLU */ int coarseSolverNSweeps_; /* number of sweeps (if iterative used) */ double *coarseSolverWts_; /* relaxation weight (if Jacobi used) */ int minCoarseSize_; /* minimum coarse grid size */ int scalar_; /* aggregate in a scalar manner */ int nodeDOF_; /* node degree of freedom */ int spaceDim_; /* 2D or 3D */ int nSpaceDim_; /* number of null vectors */ int localNEqns_; /* number of equations locally */ int nCoordAccept_; /* flag to accept nodal coordinate or not */ double *nCoordinates_; /* for storing nodal coordinates */ double *nullScales_; /* scaling vector for null space */ int calibrationSize_; /* for calibration smoothed aggregation */ double Pweight_; int SPLevel_; char paramFile_[50]; int adjustNullSpace_; int numResetNull_; int *resetNullIndices_; int numMatLabels_; /* for controlling aggregation */ int *matLabels_; int printNullSpace_; int symmetric_; int injectionForR_; HYPRE_ParCSRMatrix correctionMatrix_; /* for nullspace correction */ int numSmoothVecs_; int smoothVecSteps_; double arpackTol_; } HYPRE_LSI_MLI; /****************************************************************************/ /* HYPRE_MLI_FEData data structure */ /*--------------------------------------------------------------------------*/ typedef struct HYPRE_MLI_FEData_Struct { #ifdef HAVE_MLI MPI_Comm comm_; /* MPI communicator */ MLI_FEData *fedata_; /* holds FE information */ int fedataOwn_; /* flag to indicate ownership */ int computeNull_; /* flag - compute null space or not */ int nullDim_; /* number of null space vectors */ #endif } HYPRE_MLI_FEData; /****************************************************************************/ /* HYPRE_MLI_SFEI data structure */ /*--------------------------------------------------------------------------*/ typedef struct HYPRE_MLI_SFEI_Struct { #ifdef HAVE_MLI MPI_Comm comm_; /* MPI communicator */ MLI_SFEI *sfei_; /* holds FE information */ int sfeiOwn_; /* flag to indicate ownership */ #endif } HYPRE_MLI_SFEI; /****************************************************************************/ /* HYPRE_LSI_MLICreate */ /*--------------------------------------------------------------------------*/ extern "C" int HYPRE_LSI_MLICreate( MPI_Comm comm, HYPRE_Solver *solver ) { HYPRE_LSI_MLI *mli_object = hypre_TAlloc(HYPRE_LSI_MLI, 1, HYPRE_MEMORY_HOST); *solver = (HYPRE_Solver) mli_object; mli_object->mpiComm_ = comm; mli_object->outputLevel_ = 0; mli_object->nLevels_ = 0; mli_object->maxIterations_ = 1; mli_object->cycleType_ = 1; strcpy(mli_object->method_ , "AMGSA"); strcpy(mli_object->coarsenScheme_ , "default"); /* default in MLI */ strcpy(mli_object->preSmoother_, "default"); strcpy(mli_object->postSmoother_, "default"); mli_object->preNSweeps_ = 1; mli_object->postNSweeps_ = 1; mli_object->preSmootherWts_ = NULL; mli_object->postSmootherWts_ = NULL; mli_object->smootherPrintRNorm_ = 0; mli_object->smootherFindOmega_ = 0; mli_object->strengthThreshold_ = 0.0; strcpy(mli_object->coarseSolver_, "default"); /* default in MLI */ mli_object->coarseSolverNSweeps_ = 0; mli_object->coarseSolverWts_ = NULL; mli_object->minCoarseSize_ = 0; mli_object->scalar_ = 0; mli_object->nodeDOF_ = 1; mli_object->spaceDim_ = 1; mli_object->nSpaceDim_ = 1; mli_object->localNEqns_ = 0; mli_object->nCoordinates_ = NULL; mli_object->nCoordAccept_ = 0; mli_object->nullScales_ = NULL; mli_object->calibrationSize_ = 0; mli_object->Pweight_ = -1.0; /* default in MLI */ mli_object->SPLevel_ = 0; /* default in MLI */ mli_object->adjustNullSpace_ = 0; mli_object->numResetNull_ = 0; mli_object->resetNullIndices_ = NULL; mli_object->correctionMatrix_ = NULL; strcpy(mli_object->paramFile_, "empty"); mli_object->numMatLabels_ = 0; mli_object->matLabels_ = NULL; mli_object->printNullSpace_ = 0; mli_object->symmetric_ = 1; mli_object->injectionForR_ = 0; mli_object->numSmoothVecs_ = 0; mli_object->smoothVecSteps_ = 0; mli_object->arpackTol_ = 0.0; #ifdef HAVE_MLI mli_object->mli_ = NULL; mli_object->sfei_ = NULL; mli_object->feData_ = NULL; mli_object->mapper_ = NULL; return 0; #else printf("MLI not available.\n"); exit(1); return -1; #endif } /****************************************************************************/ /* HYPRE_LSI_MLIDestroy */ /*--------------------------------------------------------------------------*/ extern "C" int HYPRE_LSI_MLIDestroy( HYPRE_Solver solver ) { HYPRE_LSI_MLI *mli_object = (HYPRE_LSI_MLI *) solver; if ( mli_object->preSmootherWts_ != NULL ) delete [] mli_object->preSmootherWts_; if ( mli_object->postSmootherWts_ != NULL ) delete [] mli_object->postSmootherWts_; if ( mli_object->coarseSolverWts_ != NULL ) delete [] mli_object->coarseSolverWts_; if ( mli_object->nCoordinates_ != NULL ) delete [] mli_object->nCoordinates_; if ( mli_object->nullScales_ != NULL ) delete [] mli_object->nullScales_; if ( mli_object->resetNullIndices_ != NULL ) delete [] mli_object->resetNullIndices_; if ( mli_object->correctionMatrix_ != NULL ) HYPRE_ParCSRMatrixDestroy(mli_object->correctionMatrix_); if ( mli_object->matLabels_ != NULL ) delete [] mli_object->matLabels_; #ifdef HAVE_MLI if ( mli_object->feData_ != NULL ) delete mli_object->feData_; if ( mli_object->mli_ != NULL ) delete mli_object->mli_; free( mli_object ); return 0; #else free( mli_object ); printf("MLI not available.\n"); return -1; #endif } /****************************************************************************/ /* HYPRE_LSI_MLISetup */ /*--------------------------------------------------------------------------*/ extern "C" int HYPRE_LSI_MLISetup( HYPRE_Solver solver, HYPRE_ParCSRMatrix A, HYPRE_ParVector b, HYPRE_ParVector x ) { #ifdef HAVE_MLI int targc, nNodes, iZero=0; double tol=1.0e-8; char *targv[6], paramString[100];; HYPRE_LSI_MLI *mli_object; MLI_Matrix *mli_mat; MLI_Method *method; MPI_Comm mpiComm; MLI *mli; /* -------------------------------------------------------- */ /* create object */ /* -------------------------------------------------------- */ mli_object = (HYPRE_LSI_MLI *) solver; mpiComm = mli_object->mpiComm_; mli = new MLI( mpiComm ); if ( mli_object->mli_ != NULL ) delete mli_object->mli_; mli_object->mli_ = mli; /* -------------------------------------------------------- */ /* set general parameters */ /* -------------------------------------------------------- */ if (!strcmp(mli_object->method_,"AMGSADD") || !strcmp(mli_object->method_,"AMGSADDe")) mli_object->nLevels_ = 2; mli->setNumLevels( mli_object->nLevels_ ); mli->setTolerance( tol ); /* -------------------------------------------------------- */ /* set method specific parameters */ /* -------------------------------------------------------- */ method = MLI_Method_CreateFromName(mli_object->method_,mpiComm); if ( mli_object->outputLevel_ > 0 ) { sprintf(paramString, "setOutputLevel %d", mli_object->outputLevel_); method->setParams( paramString, 0, NULL ); } if ( mli_object->nLevels_ > 0 ) { sprintf(paramString, "setNumLevels %d", mli_object->nLevels_); method->setParams( paramString, 0, NULL ); } if ( mli_object->strengthThreshold_ > 0.0 ) { sprintf(paramString, "setStrengthThreshold %f", mli_object->strengthThreshold_); method->setParams( paramString, 0, NULL ); } if ( mli_object->scalar_ == 1 ) { strcpy(paramString, "scalar"); method->setParams( paramString, 0, NULL ); } if ( mli_object->symmetric_ == 0 ) { strcpy(paramString, "nonsymmetric"); method->setParams( paramString, 0, NULL ); } if ( mli_object->injectionForR_ == 1 ) { strcpy(paramString, "useInjectionForR"); method->setParams( paramString, 0, NULL ); } if ( mli_object->smootherPrintRNorm_ == 1 ) { strcpy(paramString, "setSmootherPrintRNorm"); method->setParams( paramString, 0, NULL ); } if ( mli_object->smootherFindOmega_ == 1 ) { strcpy(paramString, "setSmootherFindOmega"); method->setParams( paramString, 0, NULL ); } if ( mli_object->numSmoothVecs_ > 0 ) { sprintf(paramString, "setSmoothVec %d", mli_object->numSmoothVecs_); method->setParams( paramString, 0, NULL ); if ( mli_object->smoothVecSteps_ > 0 ) sprintf(paramString, "setSmoothVecSteps %d", mli_object->smoothVecSteps_); else sprintf(paramString, "setSmoothVecSteps 5"); method->setParams( paramString, 0, NULL ); } if ( mli_object->arpackTol_ > 0.0 ) { sprintf(paramString, "arpackTol %e", mli_object->arpackTol_); method->setParams( paramString, 0, NULL ); } /* -------------------------------------------------------- */ /* set up presmoother */ /* -------------------------------------------------------- */ if ( strcmp(mli_object->preSmoother_, "default") ) { targc = 2; targv[0] = (char *) &mli_object->preNSweeps_; targv[1] = (char *) mli_object->preSmootherWts_; sprintf(paramString, "setPreSmoother %s", mli_object->preSmoother_); method->setParams( paramString, targc, targv ); } /* -------------------------------------------------------- */ /* set up postsmoother */ /* -------------------------------------------------------- */ if ( strcmp(mli_object->preSmoother_, "default") ) { targc = 2; targv[0] = (char *) &mli_object->postNSweeps_; targv[1] = (char *) mli_object->postSmootherWts_; sprintf(paramString, "setPostSmoother %s", mli_object->postSmoother_); method->setParams( paramString, targc, targv ); } /* -------------------------------------------------------- */ /* set up coarse solver */ /* -------------------------------------------------------- */ if ( strcmp(mli_object->coarseSolver_, "default") ) { targc = 2; targv[0] = (char *) &(mli_object->coarseSolverNSweeps_); targv[1] = (char *) mli_object->coarseSolverWts_; sprintf(paramString, "setCoarseSolver %s", mli_object->coarseSolver_); method->setParams( paramString, targc, targv ); } /* -------------------------------------------------------- */ /* load minimum coarse grid size and others */ /* -------------------------------------------------------- */ if ( mli_object->minCoarseSize_ != 0 ) { sprintf(paramString, "setMinCoarseSize %d",mli_object->minCoarseSize_); method->setParams( paramString, 0, NULL ); } if ( mli_object->Pweight_ >= 0.0 ) { sprintf( paramString, "setPweight %e", mli_object->Pweight_ ); method->setParams( paramString, 0, NULL ); if ( mli_object->SPLevel_ > 0 ) { sprintf( paramString, "setSPLevel %d", mli_object->SPLevel_ ); method->setParams( paramString, 0, NULL ); } } if ( strcmp(mli_object->coarsenScheme_, "default") ) { sprintf(paramString, "setCoarsenScheme %s",mli_object->coarsenScheme_); method->setParams( paramString, 0, NULL ); } /* -------------------------------------------------------- */ /* load calibration size */ /* -------------------------------------------------------- */ if ( mli_object->calibrationSize_ > 0 ) { sprintf(paramString,"setCalibrationSize %d",mli_object->calibrationSize_); method->setParams( paramString, 0, NULL ); } /* -------------------------------------------------------- */ /* load FEData, if there is any */ /* -------------------------------------------------------- */ if ( mli_object->feData_ != NULL ) mli->setFEData( 0, mli_object->feData_, mli_object->mapper_ ); if ( mli_object->sfei_ != NULL ) mli->setSFEI(0, mli_object->sfei_); //mli_object->mapper_ = NULL; //mli_object->feData_ = NULL; /* -------------------------------------------------------- */ /* load null space, if there is any */ /* -------------------------------------------------------- */ if ((mli_object->printNullSpace_ & 1) == 1 ) { strcpy( paramString, "printNullSpace" ); method->setParams( paramString, 0, NULL ); } if ((mli_object->printNullSpace_ & 2) == 2 ) { strcpy( paramString, "printElemNodeList" ); method->setParams( paramString, 0, NULL ); } if ((mli_object->printNullSpace_ & 4) == 4 ) { strcpy( paramString, "printNodalCoord" ); method->setParams( paramString, 0, NULL ); } if ( mli_object->nCoordinates_ != NULL ) { nNodes = mli_object->localNEqns_ / mli_object->nodeDOF_; targc = 6; targv[0] = (char *) &nNodes; targv[1] = (char *) &(mli_object->nodeDOF_); targv[2] = (char *) &(mli_object->spaceDim_); targv[3] = (char *) mli_object->nCoordinates_; targv[4] = (char *) &(mli_object->nSpaceDim_); targv[5] = (char *) mli_object->nullScales_; strcpy( paramString, "setNodalCoord" ); method->setParams( paramString, targc, targv ); #if 0 if ( mli_object->adjustNullSpace_ == 1 && mli_object->correctionMatrix_ != NULL ) { int iV, irow, numNS, length, *partition, mypid; double *NSpace, *vecInData, *vecOutData, *nullCorrection; HYPRE_IJVector IJVecIn, IJVecOut; HYPRE_ParCSRMatrix hypreA; hypre_ParVector *hypreVecIn, *hypreVecOut; HYPRE_Solver solver; strcpy( paramString, "getNullSpace" ); method->getParams( paramString, &targc, targv ); numNS = *(int *) targv[1]; NSpace = (double *) targv[2]; length = *(int *) targv[3]; hypreA = mli_object->correctionMatrix_; HYPRE_ParCSRMatrixGetRowPartitioning( hypreA, &partition ); MPI_Comm_rank( mpiComm , &mypid ); HYPRE_IJVectorCreate(mpiComm, partition[mypid], partition[mypid+1]-1, &IJVecIn); HYPRE_IJVectorSetObjectType(IJVecIn, HYPRE_PARCSR); HYPRE_IJVectorInitialize(IJVecIn); HYPRE_IJVectorAssemble(IJVecIn); HYPRE_IJVectorCreate(mpiComm, partition[mypid], partition[mypid+1]-1, &IJVecOut); HYPRE_IJVectorSetObjectType(IJVecOut, HYPRE_PARCSR); HYPRE_IJVectorInitialize(IJVecOut); HYPRE_IJVectorAssemble(IJVecOut); HYPRE_IJVectorGetObject(IJVecIn, (void **) &hypreVecIn); HYPRE_IJVectorGetObject(IJVecOut, (void **) &hypreVecOut); vecInData = hypre_VectorData(hypre_ParVectorLocalVector(hypreVecIn)); vecOutData = hypre_VectorData(hypre_ParVectorLocalVector(hypreVecOut)); nullCorrection = new double[numNS*length]; HYPRE_ParCSRGMRESCreate(mpiComm, &solver); HYPRE_ParCSRGMRESSetKDim(solver, 100); HYPRE_ParCSRGMRESSetMaxIter(solver, 100); HYPRE_ParCSRGMRESSetTol(solver, 1.0e-8); HYPRE_ParCSRGMRESSetPrecond(solver, HYPRE_ParCSRDiagScale, HYPRE_ParCSRDiagScaleSetup,NULL); HYPRE_ParCSRGMRESSetLogging(solver, mli_object->outputLevel_); HYPRE_ParCSRGMRESSetup(solver, hypreA, (HYPRE_ParVector) hypreVecIn, (HYPRE_ParVector) hypreVecOut); for ( iV = 0; iV < numNS; iV++ ) { for ( irow = 0; irow < length; irow++ ) vecOutData[irow] = NSpace[length*iV+irow]; HYPRE_ParCSRMatrixMatvec(1.0,hypreA,(HYPRE_ParVector) hypreVecOut, 0.0, (HYPRE_ParVector) hypreVecIn); for ( irow = 0; irow < length; irow++ ) vecOutData[irow] = 0.0; HYPRE_ParCSRGMRESSolve(solver,A,(HYPRE_ParVector) hypreVecIn, (HYPRE_ParVector) hypreVecOut); for ( irow = 0; irow < length; irow++ ) nullCorrection[length*iV+irow] = - vecOutData[irow]; } strcpy( paramString, "adjustNullSpace" ); targc = 1; targv[0] = (char *) nullCorrection; method->setParams( paramString, targc, targv ); HYPRE_ParCSRGMRESDestroy(solver); HYPRE_IJVectorDestroy( IJVecIn ); HYPRE_IJVectorDestroy( IJVecOut ); delete [] nullCorrection; free( partition ); } if ( mli_object->numResetNull_ != 0 && mli_object->resetNullIndices_ != NULL ) { int *rowPartition, my_id; HYPRE_ParCSRMatrixGetRowPartitioning( A, &rowPartition ); MPI_Comm_rank( mpiComm , &my_id ); targc = 3; targv[0] = (char *) &(mli_object->numResetNull_); targv[1] = (char *) &(rowPartition[my_id]); targv[2] = (char *) (mli_object->resetNullIndices_); strcpy( paramString, "resetNullSpaceComponents" ); method->setParams( paramString, targc, targv ); free( rowPartition ); } #endif } else { targc = 4; targv[0] = (char *) &(mli_object->nodeDOF_); //if ( mli_object->nSpaceDim_ > mli_object->nodeDOF_ ) // mli_object->nSpaceDim_ = mli_object->nodeDOF_; targv[1] = (char *) &(mli_object->nSpaceDim_); targv[2] = (char *) NULL; targv[3] = (char *) &iZero; strcpy( paramString, "setNullSpace" ); method->setParams( paramString, targc, targv ); } if ( mli_object->correctionMatrix_ != NULL ) { HYPRE_ParCSRMatrixDestroy( mli_object->correctionMatrix_ ); mli_object->correctionMatrix_ = NULL; } if (!strcmp(mli_object->method_,"AMGRS") ) { sprintf( paramString, "setNodeDOF %d", mli_object->nodeDOF_ ); method->setParams( paramString, 0, NULL ); } /* -------------------------------------------------------- */ /* load material labels, if there is any */ /* -------------------------------------------------------- */ if ( mli_object->matLabels_ != NULL ) { strcpy( paramString, "setLabels" ); targc = 3; targv[0] = (char *) &(mli_object->numMatLabels_); targv[1] = (char *) &iZero; targv[2] = (char *) mli_object->matLabels_; method->setParams( paramString, targc, targv ); } /* -------------------------------------------------------- */ /* set parameter file */ /* -------------------------------------------------------- */ if ( strcmp(mli_object->paramFile_, "empty") ) { targc = 1; targv[0] = (char *) mli_object->paramFile_; strcpy( paramString, "setParamFile" ); method->setParams( paramString, targc, targv ); } if ( mli_object->outputLevel_ >= 1 ) { strcpy( paramString, "print" ); method->setParams( paramString, 0, NULL ); } /* -------------------------------------------------------- */ /* finally, set up */ /* -------------------------------------------------------- */ strcpy( paramString, "HYPRE_ParCSR" ); mli_mat = new MLI_Matrix((void*) A, paramString, NULL); mli->setMethod( method ); mli->setSystemMatrix( 0, mli_mat ); mli->setOutputLevel( mli_object->outputLevel_ ); mli->setup(); mli->setMaxIterations( mli_object->maxIterations_ ); mli->setCyclesAtLevel( -1, mli_object->cycleType_ ); return 0; #else printf("MLI not available.\n"); return -1; #endif } /****************************************************************************/ /* HYPRE_LSI_MLISolve */ /*--------------------------------------------------------------------------*/ extern "C" int HYPRE_LSI_MLISolve( HYPRE_Solver solver, HYPRE_ParCSRMatrix A, HYPRE_ParVector b, HYPRE_ParVector x ) { #ifdef HAVE_MLI HYPRE_LSI_MLI *mli_object; MLI_Vector *sol, *rhs; char paramString[100]; strcpy(paramString, "HYPRE_ParVector"); sol = new MLI_Vector( (void *) x, paramString, NULL); rhs = new MLI_Vector( (void *) b, paramString, NULL); mli_object = (HYPRE_LSI_MLI *) solver; if ( mli_object->mli_ == NULL ) { printf("HYPRE_LSI_MLISolve ERROR : mli not instantiated.\n"); exit(1); } mli_object->mli_->solve( sol, rhs); return 0; #else printf("MLI not available.\n"); return -1; #endif } /****************************************************************************/ /* HYPRE_LSI_MLISetParams */ /*--------------------------------------------------------------------------*/ extern "C" int HYPRE_LSI_MLISetParams( HYPRE_Solver solver, char *paramString ) { int i, mypid; double weight; HYPRE_LSI_MLI *mli_object; char param1[256], param2[256], param3[256]; mli_object = (HYPRE_LSI_MLI *) solver; sscanf(paramString,"%s", param1); if ( strcmp(param1, "MLI") ) { printf("HYPRE_LSI_MLI::parameters not for me.\n"); return 1; } MPI_Comm_rank( mli_object->mpiComm_, &mypid ); sscanf(paramString,"%s %s", param1, param2); if ( !strcmp(param2, "help") ) { if ( mypid == 0 ) { printf("%4d : Available options for MLI are : \n", mypid); printf("\t outputLevel \n"); printf("\t numLevels \n"); printf("\t maxIterations \n"); printf("\t cycleType <'V','W'> \n"); printf("\t strengthThreshold \n"); printf("\t method \n"); printf("\t coarsenScheme \n"); printf("\t smoother \n"); printf("\t coarseSolver \n"); printf("\t numSweeps \n"); printf("\t smootherWeight \n"); printf("\t smootherPrintRNorm \n"); printf("\t smootherFindOmega \n"); printf("\t minCoarseSize \n"); printf("\t Pweight \n"); printf("\t SPLevel \n"); printf("\t scalar\n"); printf("\t nodeDOF \n"); printf("\t nullSpaceDim \n"); printf("\t useNodalCoord \n"); printf("\t saAMGCalibrationSize \n"); printf("\t rsAMGSymmetric \n"); printf("\t rsAMGInjectionForR\n"); printf("\t printNullSpace\n"); printf("\t printElemNodeList \n"); printf("\t printNodalCoord \n"); printf("\t paramFile \n"); printf("\t numSmoothVecs \n"); printf("\t smoothVecSteps \n"); printf("\t arpackTol \n"); } } else if ( !strcmp(param2, "outputLevel") ) { sscanf(paramString,"%s %s %d",param1,param2,&(mli_object->outputLevel_)); } else if ( !strcmp(param2, "numLevels") ) { sscanf(paramString,"%s %s %d", param1, param2, &(mli_object->nLevels_)); if ( mli_object->nLevels_ <= 0 ) mli_object->nLevels_ = 1; } else if ( !strcmp(param2, "maxIterations") ) { sscanf(paramString,"%s %s %d", param1, param2, &(mli_object->maxIterations_)); if ( mli_object->maxIterations_ <= 0 ) mli_object->maxIterations_ = 1; } else if ( !strcmp(param2, "cycleType") ) { sscanf(paramString,"%s %s %s", param1, param2, param3); if ( ! strcmp( param3, "V" ) ) mli_object->cycleType_ = 1; else if ( ! strcmp( param3, "W" ) ) mli_object->cycleType_ = 2; } else if ( !strcmp(param2, "strengthThreshold") ) { sscanf(paramString,"%s %s %lg", param1, param2, &(mli_object->strengthThreshold_)); if ( mli_object->strengthThreshold_ < 0.0 ) mli_object->strengthThreshold_ = 0.0; } else if ( !strcmp(param2, "method") ) { sscanf(paramString,"%s %s %s", param1, param2, param3); strcpy( mli_object->method_, param3 ); } else if ( !strcmp(param2, "coarsenScheme") ) { sscanf(paramString,"%s %s %s", param1, param2, param3); strcpy( mli_object->coarsenScheme_, param3 ); } else if ( !strcmp(param2, "smoother") ) { sscanf(paramString,"%s %s %s", param1, param2, param3); strcpy( mli_object->preSmoother_, param3 ); strcpy( mli_object->postSmoother_, param3 ); } else if ( !strcmp(param2, "coarseSolver") ) { sscanf(paramString,"%s %s %s", param1, param2, param3); strcpy( mli_object->coarseSolver_, param3 ); } else if ( !strcmp(param2, "coarseSolverNumSweeps") ) { sscanf(paramString,"%s %s %d", param1, param2, &(mli_object->coarseSolverNSweeps_)); if ( mli_object->coarseSolverNSweeps_ < 1 ) mli_object->coarseSolverNSweeps_ = 1; } else if ( !strcmp(param2, "numSweeps") ) { sscanf(paramString,"%s %s %d",param1,param2,&(mli_object->preNSweeps_)); if ( mli_object->preNSweeps_ <= 0 ) mli_object->preNSweeps_ = 1; mli_object->postNSweeps_ = mli_object->preNSweeps_; if ( mli_object->preSmootherWts_ != NULL ) { weight = mli_object->preSmootherWts_[0]; delete [] mli_object->preSmootherWts_; mli_object->preSmootherWts_ = new double[mli_object->preNSweeps_]; for ( i = 0; i < mli_object->preNSweeps_; i++ ) mli_object->preSmootherWts_[i] = weight; } if ( mli_object->postSmootherWts_ != NULL ) { weight = mli_object->postSmootherWts_[0]; delete [] mli_object->postSmootherWts_; mli_object->postSmootherWts_ = new double[mli_object->postNSweeps_]; for ( i = 0; i < mli_object->postNSweeps_; i++ ) mli_object->postSmootherWts_[i] = weight; } } else if ( !strcmp(param2, "smootherWeight") ) { sscanf(paramString,"%s %s %lg",param1,param2,&weight); if ( weight < 0.0 || weight > 2.0 ) weight = 1.0; if ( mli_object->preNSweeps_ > 0 ) { if ( mli_object->preSmootherWts_ != NULL ) delete [] mli_object->preSmootherWts_; mli_object->preSmootherWts_ = new double[mli_object->preNSweeps_]; for ( i = 0; i < mli_object->preNSweeps_; i++ ) mli_object->preSmootherWts_[i] = weight; mli_object->postNSweeps_ = mli_object->preNSweeps_; if ( mli_object->postSmootherWts_ != NULL ) delete [] mli_object->postSmootherWts_; mli_object->postSmootherWts_ = new double[mli_object->preNSweeps_]; for ( i = 0; i < mli_object->preNSweeps_; i++ ) mli_object->postSmootherWts_[i] = weight; } } else if ( !strcmp(param2, "smootherPrintRNorm") ) { mli_object->smootherPrintRNorm_ = 1; } else if ( !strcmp(param2, "smootherFindOmega") ) { mli_object->smootherFindOmega_ = 1; } else if ( !strcmp(param2, "minCoarseSize") ) { sscanf(paramString,"%s %s %d",param1,param2, &(mli_object->minCoarseSize_)); if ( mli_object->minCoarseSize_ <= 0 ) mli_object->minCoarseSize_ = 20; } else if ( !strcmp(param2, "Pweight") ) { sscanf(paramString,"%s %s %lg",param1,param2, &(mli_object->Pweight_)); if ( mli_object->Pweight_ < 0. ) mli_object->Pweight_ = 1.333; } else if ( !strcmp(param2, "SPLevel") ) { sscanf(paramString,"%s %s %d",param1,param2, &(mli_object->SPLevel_)); if ( mli_object->SPLevel_ < 0 ) mli_object->SPLevel_ = 0; } else if ( !strcmp(param2, "scalar") ) { mli_object->scalar_ = 1; } else if ( !strcmp(param2, "nodeDOF") ) { sscanf(paramString,"%s %s %d",param1,param2, &(mli_object->nodeDOF_)); if ( mli_object->nodeDOF_ <= 0 ) mli_object->nodeDOF_ = 1; } else if ( !strcmp(param2, "nullSpaceDim") ) { sscanf(paramString,"%s %s %d",param1,param2, &(mli_object->nSpaceDim_)); if ( mli_object->nSpaceDim_ <= 0 ) mli_object->nSpaceDim_ = 1; } else if ( !strcmp(param2, "useNodalCoord") ) { sscanf(paramString,"%s %s %s",param1,param2,param3); if ( !strcmp(param3, "on") ) mli_object->nCoordAccept_ = 1; else mli_object->nCoordAccept_ = 0; } else if ( !strcmp(param2, "saAMGCalibrationSize") ) { sscanf(paramString,"%s %s %d",param1,param2, &(mli_object->calibrationSize_)); if (mli_object->calibrationSize_ < 0) mli_object->calibrationSize_ = 0; } else if ( !strcmp(param2, "rsAMGSymmetric") ) { sscanf(paramString,"%s %s %d",param1,param2, &(mli_object->symmetric_)); if ( mli_object->symmetric_ < 0 ) mli_object->symmetric_ = 0; if ( mli_object->symmetric_ > 1 ) mli_object->symmetric_ = 1; } else if ( !strcmp(param2, "rsAMGInjectionForR") ) { mli_object->injectionForR_ = 1; } else if ( !strcmp(param2, "printNullSpace") ) { mli_object->printNullSpace_ |= 1; } else if ( !strcmp(param2, "printElemNodeList") ) { mli_object->printNullSpace_ |= 2; } else if ( !strcmp(param2, "printNodalCoord") ) { mli_object->printNullSpace_ |= 4; } else if ( !strcmp(param2, "paramFile") ) { sscanf(paramString,"%s %s %s",param1,param2,mli_object->paramFile_); } else if ( !strcmp(param2, "numSmoothVecs") ) { sscanf(paramString,"%s %s %d",param1,param2, &(mli_object->numSmoothVecs_)); if ( mli_object->numSmoothVecs_ < 0 ) mli_object->numSmoothVecs_ = 0; } else if ( !strcmp(param2, "smoothVecSteps") ) { sscanf(paramString,"%s %s %d",param1,param2, &(mli_object->smoothVecSteps_)); if ( mli_object->smoothVecSteps_ < 0 ) mli_object->smoothVecSteps_ = 0; } else if ( !strcmp(param2, "arpackTol") ) { sscanf(paramString,"%s %s %lg",param1,param2, &(mli_object->arpackTol_)); if ( mli_object->arpackTol_ <= 0.0 ) mli_object->arpackTol_ = 0.0; } else if ( !strcmp(param2, "incrNullSpaceDim") ) { sscanf(paramString,"%s %s %d",param1,param2, &i); mli_object->nSpaceDim_ += i; } else { if ( mypid == 0 ) { printf("%4d : HYPRE_LSI_MLISetParams ERROR : unrecognized request.\n", mypid); printf("\t offending request = %s.\n", paramString); printf("\tAvailable options for MLI are : \n"); printf("\t outputLevel \n"); printf("\t numLevels \n"); printf("\t maxIterations \n"); printf("\t cycleType <'V','W'> \n"); printf("\t strengthThreshold \n"); printf("\t method \n"); printf("\t smoother \n"); printf("\t coarseSolver \n"); printf("\t numSweeps \n"); printf("\t smootherWeight \n"); printf("\t smootherPrintRNorm\n"); printf("\t smootherFindOmega\n"); printf("\t minCoarseSize \n"); printf("\t Pweight \n"); printf("\t SPLevel \n"); printf("\t nodeDOF \n"); printf("\t nullSpaceDim \n"); printf("\t useNodalCoord \n"); printf("\t saAMGCalibrationSize \n"); printf("\t rsAMGSymmetric \n"); printf("\t rsAMGInjectionForR\n"); printf("\t printNullSpace\n"); printf("\t printElemNodeList\n"); printf("\t printNodalCoord\n"); printf("\t paramFile \n"); printf("\t numSmoothVecs \n"); printf("\t smoothVecSteps \n"); printf("\t arpackTol \n"); exit(1); } } return 0; } /****************************************************************************/ /* HYPRE_LSI_MLICreateNodeEqnMap */ /*--------------------------------------------------------------------------*/ extern "C" int HYPRE_LSI_MLICreateNodeEqnMap(HYPRE_Solver solver, int nNodes, int *nodeNumbers, int *eqnNumbers, int *procNRows) { #ifdef HAVE_MLI int iN, iP, mypid, nprocs, *procMapArray, *iTempArray; int iS, nSends, *sendLengs, *sendProcs, **iSendBufs; int iR, nRecvs, *recvLengs, *recvProcs, **iRecvBufs, *procList; int newNumNodes, *newNodeNumbers, *newEqnNumbers, procIndex; MPI_Comm mpiComm; MPI_Request *mpiRequests; MPI_Status mpiStatus; MLI_Mapper *mapper; HYPRE_LSI_MLI *mli_object = (HYPRE_LSI_MLI *) solver; /* -------------------------------------------------------- */ /* fetch processor information */ /* -------------------------------------------------------- */ if ( mli_object == NULL ) return 1; if ( mli_object->mapper_ != NULL ) delete mli_object->mapper_; mpiComm = mli_object->mpiComm_; MPI_Comm_rank( mpiComm, &mypid ); MPI_Comm_size( mpiComm, &nprocs ); /* -------------------------------------------------------- */ /* construct node to processor map array */ /* -------------------------------------------------------- */ procMapArray = new int[nNodes]; for ( iN = 0; iN < nNodes; iN++ ) { procMapArray[iN] = -1; if ( eqnNumbers[iN] < procNRows[mypid] || eqnNumbers[iN] >= procNRows[mypid+1] ) { for ( iP = 0; iP < nprocs; iP++ ) if ( eqnNumbers[iN] < procNRows[iP] ) break; procMapArray[iN] = iP - 1; } } /* -------------------------------------------------------- */ /* construct send information */ /* -------------------------------------------------------- */ procList = new int[nprocs]; for ( iP = 0; iP < nprocs; iP++ ) procList[iP] = 0; for ( iN = 0; iN < nNodes; iN++ ) if ( procMapArray[iN] >= 0 ) procList[procMapArray[iN]]++; nSends = 0; for ( iP = 0; iP < nprocs; iP++ ) if ( procList[iP] > 0 ) nSends++; if ( nSends > 0 ) { sendProcs = new int[nSends]; sendLengs = new int[nSends]; iSendBufs = new int*[nSends]; } nSends = 0; for ( iP = 0; iP < nprocs; iP++ ) { if ( procList[iP] > 0 ) { sendLengs[nSends] = procList[iP]; sendProcs[nSends++] = iP; } } /* -------------------------------------------------------- */ /* construct recv information */ /* -------------------------------------------------------- */ for ( iP = 0; iP < nprocs; iP++ ) procList[iP] = 0; for ( iP = 0; iP < nSends; iP++ ) procList[sendProcs[iP]]++; iTempArray = new int[nprocs]; MPI_Allreduce(procList,iTempArray,nprocs,MPI_INT,MPI_SUM,mpiComm); nRecvs = iTempArray[mypid]; delete [] procList; delete [] iTempArray; if ( nRecvs > 0 ) { recvLengs = new int[nRecvs]; recvProcs = new int[nRecvs]; iRecvBufs = new int*[nRecvs]; mpiRequests = new MPI_Request[nRecvs]; } for ( iP = 0; iP < nRecvs; iP++ ) MPI_Irecv(&(recvLengs[iP]), 1, MPI_INT, MPI_ANY_SOURCE, 29421, mpiComm, &(mpiRequests[iP])); for ( iP = 0; iP < nSends; iP++ ) MPI_Send(&(sendLengs[iP]), 1, MPI_INT, sendProcs[iP], 29421, mpiComm); for ( iP = 0; iP < nRecvs; iP++ ) { MPI_Wait(&(mpiRequests[iP]), &mpiStatus); recvProcs[iP] = mpiStatus.MPI_SOURCE; } /* -------------------------------------------------------- */ /* communicate node and equation information */ /* -------------------------------------------------------- */ for ( iP = 0; iP < nRecvs; iP++ ) { iRecvBufs[iP] = new int[recvLengs[iP]*2]; MPI_Irecv(iRecvBufs[iP], recvLengs[iP]*2, MPI_INT, recvProcs[iP], 29422, mpiComm, &(mpiRequests[iP])); } for ( iP = 0; iP < nSends; iP++ ) { iSendBufs[iP] = new int[sendLengs[iP]*2]; sendLengs[iP] = 0; } for ( iN = 0; iN < nNodes; iN++ ) { if ( procMapArray[iN] >= 0 ) { procIndex = procMapArray[iN]; for ( iP = 0; iP < nSends; iP++ ) if ( sendProcs[iP] == procIndex ) break; iSendBufs[iP][sendLengs[iP]++] = nodeNumbers[iN]; iSendBufs[iP][sendLengs[iP]++] = eqnNumbers[iN]; } } for ( iP = 0; iP < nSends; iP++ ) { sendLengs[iP] /= 2; MPI_Send(iSendBufs[iP], sendLengs[iP]*2, MPI_INT, sendProcs[iP], 29422, mpiComm); } for ( iP = 0; iP < nRecvs; iP++ ) MPI_Wait(&(mpiRequests[iP]), &mpiStatus); /* -------------------------------------------------------- */ /* form node and equation map */ /* -------------------------------------------------------- */ newNumNodes = nNodes; for ( iP = 0; iP < nRecvs; iP++ ) newNumNodes += recvLengs[iP]; newNodeNumbers = new int[newNumNodes]; newEqnNumbers = new int[newNumNodes]; newNumNodes = 0; for (iN = 0; iN < nNodes; iN++) { newNodeNumbers[newNumNodes] = nodeNumbers[iN]; newEqnNumbers[newNumNodes++] = eqnNumbers[iN]; } for ( iP = 0; iP < nRecvs; iP++ ) { for ( iR = 0; iR < recvLengs[iP]; iR++ ) { newNodeNumbers[newNumNodes] = iRecvBufs[iP][iR*2]; newEqnNumbers[newNumNodes++] = iRecvBufs[iP][iR*2+1]; } } mapper = new MLI_Mapper(); mapper->setMap( newNumNodes, newNodeNumbers, newEqnNumbers ); mli_object->mapper_ = mapper; /* -------------------------------------------------------- */ /* clean up and return */ /* -------------------------------------------------------- */ delete [] procMapArray; if ( nSends > 0 ) { delete [] sendProcs; delete [] sendLengs; for ( iS = 0; iS < nSends; iS++ ) delete [] iSendBufs[iS]; delete [] iSendBufs; } if ( nRecvs > 0 ) { delete [] recvProcs; delete [] recvLengs; for ( iR = 0; iR < nRecvs; iR++ ) delete [] iRecvBufs[iR]; delete [] iRecvBufs; delete [] mpiRequests; } delete [] newNodeNumbers; delete [] newEqnNumbers; return 0; #else (void) solver; (void) nNodes; (void) nodeNumbers; (void) eqnNumbers; (void) procNRows; return 1; #endif } /****************************************************************************/ /* HYPRE_LSI_MLIAdjustNodeEqnMap */ /*--------------------------------------------------------------------------*/ extern "C" int HYPRE_LSI_MLIAdjustNodeEqnMap(HYPRE_Solver solver, int *procNRows, int *procOffsets) { #ifdef HAVE_MLI HYPRE_LSI_MLI *mli_object = (HYPRE_LSI_MLI *) solver; if ( mli_object == NULL ) return 1; if ( mli_object->mapper_ == NULL ) return 1; mli_object->mapper_->adjustMapOffset( mli_object->mpiComm_, procNRows, procOffsets ); return 0; #else (void) solver; (void) procNRows; (void) procOffsets; return 1; #endif } /****************************************************************************/ /* HYPRE_LSI_MLIAdjustNullSpace */ /*--------------------------------------------------------------------------*/ extern "C" int HYPRE_LSI_MLIAdjustNullSpace(HYPRE_Solver solver, int nConstraints, int *slaveIndices, HYPRE_ParCSRMatrix hypreA) { #ifdef HAVE_MLI HYPRE_LSI_MLI *mli_object = (HYPRE_LSI_MLI *) solver; if ( mli_object == NULL ) return 1; mli_object->adjustNullSpace_ = 1; mli_object->numResetNull_ = nConstraints; if ( nConstraints > 0 ) mli_object->resetNullIndices_ = new int[nConstraints]; for ( int i = 0; i < nConstraints; i++ ) mli_object->resetNullIndices_[i] = slaveIndices[i]; mli_object->correctionMatrix_ = hypreA; return 0; #else (void) solver; (void) nConstraints; (void) slaveIndices; (void) hypreA; return 1; #endif } /****************************************************************************/ /* HYPRE_LSI_MLISetFEData */ /*--------------------------------------------------------------------------*/ extern "C" int HYPRE_LSI_MLISetFEData(HYPRE_Solver solver, void *object) { #ifdef HAVE_MLI HYPRE_LSI_MLI *mli_object = (HYPRE_LSI_MLI *) solver; HYPRE_MLI_FEData *hypre_fedata = (HYPRE_MLI_FEData *) object; mli_object->feData_ = hypre_fedata->fedata_; hypre_fedata->fedata_ = NULL; hypre_fedata->fedataOwn_ = 0; return 0; #else (void) solver; (void) object; return 1; #endif } /****************************************************************************/ /* HYPRE_LSI_MLISetSFEI */ /*--------------------------------------------------------------------------*/ extern "C" int HYPRE_LSI_MLISetSFEI(HYPRE_Solver solver, void *object) { #ifdef HAVE_MLI HYPRE_LSI_MLI *mli_object = (HYPRE_LSI_MLI *) solver; HYPRE_MLI_SFEI *hypre_sfei = (HYPRE_MLI_SFEI *) object; mli_object->sfei_ = hypre_sfei->sfei_; hypre_sfei->sfei_ = NULL; hypre_sfei->sfeiOwn_ = 0; return 0; #else (void) solver; (void) object; return 1; #endif } /****************************************************************************/ /* HYPRE_LSI_MLILoadNodalCoordinates */ /* (The nodal coordinates loaded in here conforms to the nodal labeling in */ /* FEI, so the lookup object can be used to find the equation number. */ /* In addition, node numbers and coordinates need to be shuffled between */ /* processors) */ /*--------------------------------------------------------------------------*/ /* #define FEI_250 */ extern "C" int HYPRE_LSI_MLILoadNodalCoordinates(HYPRE_Solver solver, int nNodes, int nodeDOF, int *eqnNumbers, int nDim, double *coords, int localNRows) { int iN, iD, eqnInd, mypid, *flags, arrayLeng; double *nCoords; MPI_Comm mpiComm; #ifdef FEI_250 int iMax, iMin, offFlag; #else int iP, nprocs, *nodeProcMap, *iTempArray; int iS, nSends, *sendLengs, *sendProcs, **iSendBufs, procIndex; int iR, nRecvs, *recvLengs, *recvProcs, **iRecvBufs, *procList; int *procNRows, numNodes, coordLength; double **dSendBufs, **dRecvBufs; MPI_Request *mpiRequests; MPI_Status mpiStatus; #endif HYPRE_LSI_MLI *mli_object = (HYPRE_LSI_MLI *) solver; /* -------------------------------------------------------- */ /* if nodal coordinates flag off, do not take coordinates */ /* -------------------------------------------------------- */ if ( ! mli_object->nCoordAccept_ ) return 1; mpiComm = mli_object->mpiComm_; MPI_Comm_rank( mpiComm, &mypid ); /* -------------------------------------------------------- */ /* clean up previously allocated space */ /* -------------------------------------------------------- */ if ( mli_object->nCoordinates_ != NULL ) delete [] mli_object->nCoordinates_; if ( mli_object->nullScales_ != NULL ) delete [] mli_object->nullScales_; mli_object->nCoordinates_ = NULL; mli_object->nullScales_ = NULL; /* -------------------------------------------------------- */ /* This code is used in place of the 'else' block in view */ /* of the changes made to FEI 2.5.0 */ /* -------------------------------------------------------- */ #ifdef FEI_250 mli_object->spaceDim_ = nDim; mli_object->nodeDOF_ = nodeDOF; iMin = 1000000000; iMax = 0; for ( iN = 0; iN < nNodes; iN++ ) { iMin = ( eqnNumbers[iN] < iMin ) ? eqnNumbers[iN] : iMin; iMax = ( eqnNumbers[iN] > iMax ) ? eqnNumbers[iN] : iMax; } mli_object->localNEqns_ = ( iMax/nDim - iMin/nDim + 1 ) * nDim; offFlag = 0; if ( mli_object->localNEqns_ != nNodes*nDim ) offFlag = 1; iN = offFlag; MPI_Allreduce(&iN,&offFlag,1,MPI_INT,MPI_SUM,mpiComm); if ( offFlag != 0 ) { if ( mypid == 0 ) printf("HYPRE_LSI_MLILoadNodalCoordinates - turned off.\n"); mli_object->nCoordAccept_ = 0; mli_object->localNEqns_ = 0; return 1; } mli_object->nCoordinates_ = new double[nNodes*nDim]; nCoords = mli_object->nCoordinates_; for ( iN = 0; iN < nNodes; iN++ ) { eqnInd = (eqnNumbers[iN] - iMin) / nodeDOF; for ( iD = 0; iD < nDim; iD++ ) nCoords[eqnInd*nDim+iD] = coords[iN*nDim+iD]; } #else /* -------------------------------------------------------- */ /* fetch machine information */ /* -------------------------------------------------------- */ MPI_Comm_size( mpiComm, &nprocs ); /* -------------------------------------------------------- */ /* construct procNRows array */ /* -------------------------------------------------------- */ procNRows = new int[nprocs+1]; iTempArray = new int[nprocs]; for ( iP = 0; iP <= nprocs; iP++ ) procNRows[iP] = 0; procNRows[mypid] = localNRows; MPI_Allreduce(procNRows,iTempArray,nprocs,MPI_INT,MPI_SUM,mpiComm); procNRows[0] = 0; for ( iP = 1; iP <= nprocs; iP++ ) procNRows[iP] = procNRows[iP-1] + iTempArray[iP-1]; /* -------------------------------------------------------- */ /* construct node to processor map */ /* -------------------------------------------------------- */ nodeProcMap = new int[nNodes]; for ( iN = 0; iN < nNodes; iN++ ) { nodeProcMap[iN] = -1; if ( eqnNumbers[iN] < procNRows[mypid] || eqnNumbers[iN] >= procNRows[mypid+1] ) { for ( iP = 0; iP < nprocs; iP++ ) if ( eqnNumbers[iN] < procNRows[iP] ) break; nodeProcMap[iN] = iP - 1; } } /* -------------------------------------------------------- */ /* construct send information */ /* -------------------------------------------------------- */ procList = new int[nprocs]; for ( iP = 0; iP < nprocs; iP++ ) procList[iP] = 0; for ( iN = 0; iN < nNodes; iN++ ) if ( nodeProcMap[iN] >= 0 ) procList[nodeProcMap[iN]]++; nSends = 0; for ( iP = 0; iP < nprocs; iP++ ) if ( procList[iP] > 0 ) nSends++; if ( nSends > 0 ) { sendProcs = new int[nSends]; sendLengs = new int[nSends]; iSendBufs = new int*[nSends]; dSendBufs = new double*[nSends]; } nSends = 0; for ( iP = 0; iP < nprocs; iP++ ) { if ( procList[iP] > 0 ) { sendLengs[nSends] = procList[iP]; sendProcs[nSends++] = iP; } } /* -------------------------------------------------------- */ /* construct recv information */ /* -------------------------------------------------------- */ for ( iP = 0; iP < nprocs; iP++ ) procList[iP] = 0; for ( iP = 0; iP < nSends; iP++ ) procList[sendProcs[iP]]++; MPI_Allreduce(procList,iTempArray,nprocs,MPI_INT,MPI_SUM,mpiComm); nRecvs = iTempArray[mypid]; if ( nRecvs > 0 ) { recvLengs = new int[nRecvs]; recvProcs = new int[nRecvs]; iRecvBufs = new int*[nRecvs]; dRecvBufs = new double*[nRecvs]; mpiRequests = new MPI_Request[nRecvs]; } for ( iP = 0; iP < nRecvs; iP++ ) MPI_Irecv(&(recvLengs[iP]), 1, MPI_INT, MPI_ANY_SOURCE, 29421, mpiComm, &(mpiRequests[iP])); for ( iP = 0; iP < nSends; iP++ ) MPI_Send(&(sendLengs[iP]), 1, MPI_INT, sendProcs[iP], 29421, mpiComm); for ( iP = 0; iP < nRecvs; iP++ ) { MPI_Wait(&(mpiRequests[iP]), &mpiStatus); recvProcs[iP] = mpiStatus.MPI_SOURCE; } /* -------------------------------------------------------- */ /* communicate equation numbers information */ /* -------------------------------------------------------- */ for ( iP = 0; iP < nRecvs; iP++ ) { iRecvBufs[iP] = new int[recvLengs[iP]]; MPI_Irecv(iRecvBufs[iP], recvLengs[iP], MPI_INT, recvProcs[iP], 29422, mpiComm, &(mpiRequests[iP])); } for ( iP = 0; iP < nSends; iP++ ) { iSendBufs[iP] = new int[sendLengs[iP]]; sendLengs[iP] = 0; } for ( iN = 0; iN < nNodes; iN++ ) { if ( nodeProcMap[iN] >= 0 ) { procIndex = nodeProcMap[iN]; for ( iP = 0; iP < nSends; iP++ ) if ( procIndex == sendProcs[iP] ) break; iSendBufs[iP][sendLengs[iP]++] = eqnNumbers[iN]; } } for ( iP = 0; iP < nSends; iP++ ) { MPI_Send(iSendBufs[iP], sendLengs[iP], MPI_INT, sendProcs[iP], 29422, mpiComm); } for ( iP = 0; iP < nRecvs; iP++ ) MPI_Wait(&(mpiRequests[iP]), &mpiStatus); /* -------------------------------------------------------- */ /* communicate coordinate information */ /* -------------------------------------------------------- */ for ( iP = 0; iP < nRecvs; iP++ ) { dRecvBufs[iP] = new double[recvLengs[iP]*nDim]; MPI_Irecv(dRecvBufs[iP], recvLengs[iP]*nDim, MPI_DOUBLE, recvProcs[iP], 29425, mpiComm, &(mpiRequests[iP])); } for ( iP = 0; iP < nSends; iP++ ) { dSendBufs[iP] = new double[sendLengs[iP]*nDim]; sendLengs[iP] = 0; } for ( iN = 0; iN < nNodes; iN++ ) { if ( nodeProcMap[iN] >= 0 ) { procIndex = nodeProcMap[iN]; for ( iP = 0; iP < nSends; iP++ ) if ( procIndex == sendProcs[iP] ) break; for ( iD = 0; iD < nDim; iD++ ) dSendBufs[iP][sendLengs[iP]++]=coords[iN*nDim+iD]; } } for ( iP = 0; iP < nSends; iP++ ) { sendLengs[iP] /= nDim; MPI_Send(dSendBufs[iP], sendLengs[iP]*nDim, MPI_DOUBLE, sendProcs[iP], 29425, mpiComm); } for ( iP = 0; iP < nRecvs; iP++ ) MPI_Wait(&(mpiRequests[iP]), &mpiStatus); /* -------------------------------------------------------- */ /* check any duplicate coordinate information */ /* -------------------------------------------------------- */ arrayLeng = nNodes; for ( iP = 0; iP < nRecvs; iP++ ) arrayLeng += recvLengs[iP]; flags = new int[arrayLeng]; for ( iN = 0; iN < arrayLeng; iN++ ) flags[iN] = 0; for ( iN = 0; iN < nNodes; iN++ ) { if ( nodeProcMap[iN] < 0 ) { eqnInd = (eqnNumbers[iN] - procNRows[mypid]) / nodeDOF; if ( eqnInd >= arrayLeng ) { printf("%d : HYPRE_LSI_MLILoadNodalCoordinates - ERROR(1).\n", mypid); exit(1); } flags[eqnInd] = 1; } } for ( iP = 0; iP < nRecvs; iP++ ) { for ( iR = 0; iR < recvLengs[iP]; iR++ ) { eqnInd = (iRecvBufs[iP][iR] - procNRows[mypid]) / nodeDOF; if ( eqnInd >= arrayLeng ) { printf("%d : HYPRE_LSI_MLILoadNodalCoordinates - ERROR(2).\n", mypid); exit(1); } flags[eqnInd] = 1; } } numNodes = 0; for ( iN = 0; iN < arrayLeng; iN++ ) if ( flags[iN] == 0 ) break; else numNodes++; delete [] flags; /* -------------------------------------------------------- */ /* set up nodal coordinate information in correct order */ /* -------------------------------------------------------- */ mli_object->spaceDim_ = nDim; mli_object->nodeDOF_ = nodeDOF; mli_object->localNEqns_ = numNodes * nodeDOF; coordLength = numNodes * nodeDOF * nDim; mli_object->nCoordinates_ = new double[coordLength]; nCoords = mli_object->nCoordinates_; arrayLeng = numNodes * nodeDOF; for ( iN = 0; iN < nNodes; iN++ ) { if ( nodeProcMap[iN] < 0 ) { eqnInd = (eqnNumbers[iN] - procNRows[mypid]) / nodeDOF; if ( eqnInd >= 0 && eqnInd < arrayLeng ) for ( iD = 0; iD < nDim; iD++ ) nCoords[eqnInd*nDim+iD] = coords[iN*nDim+iD]; } } for ( iP = 0; iP < nRecvs; iP++ ) { for ( iR = 0; iR < recvLengs[iP]; iR++ ) { eqnInd = (iRecvBufs[iP][iR] - procNRows[mypid]) / nodeDOF; if ( eqnInd >= 0 && eqnInd < arrayLeng ) for ( iD = 0; iD < nDim; iD++ ) nCoords[eqnInd*nDim+iD] = dRecvBufs[iP][iR*nDim+iD]; } } for ( iN = 0; iN < numNodes*nodeDOF; iN++ ) if (nCoords[iN] == -99999.0) printf("%d : LSI_mli error %d\n",mypid,iN); /* -------------------------------------------------------- */ /* clean up */ /* -------------------------------------------------------- */ delete [] procList; delete [] iTempArray; delete [] nodeProcMap; delete [] procNRows; if ( nSends > 0 ) { delete [] sendProcs; delete [] sendLengs; for ( iS = 0; iS < nSends; iS++ ) delete [] iSendBufs[iS]; for ( iS = 0; iS < nSends; iS++ ) delete [] dSendBufs[iS]; delete [] dSendBufs; delete [] iSendBufs; } if ( nRecvs > 0 ) { delete [] recvProcs; delete [] recvLengs; for ( iR = 0; iR < nRecvs; iR++ ) delete [] iRecvBufs[iR]; for ( iR = 0; iR < nRecvs; iR++ ) delete [] dRecvBufs[iR]; delete [] iRecvBufs; delete [] dRecvBufs; delete [] mpiRequests; } #endif return 0; } /****************************************************************************/ /* HYPRE_LSI_MLILoadMatrixScalings */ /*--------------------------------------------------------------------------*/ extern "C" int HYPRE_LSI_MLILoadMatrixScalings(HYPRE_Solver solver, int nEqns, double *scalings) { HYPRE_LSI_MLI *mli_object = (HYPRE_LSI_MLI *) solver; if ( scalings != NULL ) { mli_object->nullScales_ = new double[nEqns]; for ( int i = 0; i < nEqns; i++ ) mli_object->nullScales_[i] = scalings[i]; } return 0; } /****************************************************************************/ /* HYPRE_LSI_MLILoadMaterialLabels */ /*--------------------------------------------------------------------------*/ extern "C" int HYPRE_LSI_MLILoadMaterialLabels(HYPRE_Solver solver, int nLabels, int *labels) { HYPRE_LSI_MLI *mli_object = (HYPRE_LSI_MLI *) solver; if ( labels != NULL ) { mli_object->matLabels_ = new int[nLabels]; for ( int i = 0; i < nLabels; i++ ) mli_object->matLabels_[i] = labels[i]; mli_object->numMatLabels_ = nLabels; } return 0; } /****************************************************************************/ /* HYPRE_LSI_MLIFEDataCreate */ /*--------------------------------------------------------------------------*/ extern "C" void *HYPRE_LSI_MLIFEDataCreate( MPI_Comm mpi_comm ) { #ifdef HAVE_MLI HYPRE_MLI_FEData *hypre_fedata; hypre_fedata = hypre_TAlloc(HYPRE_MLI_FEData, 1, HYPRE_MEMORY_HOST); hypre_fedata->comm_ = mpi_comm; hypre_fedata->fedata_ = NULL; hypre_fedata->fedataOwn_ = 0; hypre_fedata->computeNull_ = 0; hypre_fedata->nullDim_ = 1; return ((void *) hypre_fedata); #else return NULL; #endif } /****************************************************************************/ /* HYPRE_LSI_MLIFEDataDestroy */ /*--------------------------------------------------------------------------*/ extern "C" int HYPRE_LSI_MLIFEDataDestroy( void *object ) { #ifdef HAVE_MLI HYPRE_MLI_FEData *hypre_fedata = (HYPRE_MLI_FEData *) object; if ( hypre_fedata == NULL ) return 1; if ( hypre_fedata->fedataOwn_ && hypre_fedata->fedata_ != NULL ) delete hypre_fedata->fedata_; hypre_fedata->fedata_ = NULL; free( hypre_fedata ); return 0; #else return 1; #endif } /****************************************************************************/ /* HYPRE_LSI_MLIFEDataInitFields */ /*--------------------------------------------------------------------------*/ extern "C" int HYPRE_LSI_MLIFEDataInitFields( void *object, int nFields, int *fieldSizes, int *fieldIDs ) { #ifdef HAVE_MLI HYPRE_MLI_FEData *hypre_fedata = (HYPRE_MLI_FEData *) object; MLI_FEData *fedata; if ( hypre_fedata == NULL ) return 1; if ( hypre_fedata->fedata_ != NULL ) delete hypre_fedata->fedata_; hypre_fedata->fedata_ = new MLI_FEData(hypre_fedata->comm_); hypre_fedata->fedataOwn_ = 1; fedata = (MLI_FEData *) hypre_fedata->fedata_; fedata->initFields( nFields, fieldSizes, fieldIDs ); return 0; #else (void) object; (void) nFields; (void) fieldSizes; (void) fieldIDs; return 1; #endif } /****************************************************************************/ /* HYPRE_LSI_MLIFEDataInitElemBlock */ /*--------------------------------------------------------------------------*/ extern "C" int HYPRE_LSI_MLIFEDataInitElemBlock(void *object, int nElems, int nNodesPerElem, int numNodeFields, int *nodeFieldIDs) { #ifdef HAVE_MLI HYPRE_MLI_FEData *hypre_fedata = (HYPRE_MLI_FEData *) object; MLI_FEData *fedata; if ( hypre_fedata == NULL ) return 1; fedata = (MLI_FEData *) hypre_fedata->fedata_; if ( fedata == NULL ) return 1; if ( numNodeFields != 1 ) return 1; hypre_fedata->fedata_->initElemBlock(nElems,nNodesPerElem,numNodeFields, nodeFieldIDs,0,NULL); return 0; #else (void) object; (void) nElems; (void) nNodesPerElem; (void) numNodeFields; (void) nodeFieldIDs; return 1; #endif } /****************************************************************************/ /* HYPRE_LSI_MLIFEDataInitElemNodeList */ /*--------------------------------------------------------------------------*/ extern "C" int HYPRE_LSI_MLIFEDataInitElemNodeList( void *object, int elemID, int nNodesPerElem, int *elemNodeList) { #ifdef HAVE_MLI HYPRE_MLI_FEData *hypre_fedata = (HYPRE_MLI_FEData *) object; MLI_FEData *fedata; if ( hypre_fedata == NULL ) return 1; fedata = (MLI_FEData *) hypre_fedata->fedata_; if ( fedata == NULL ) return 1; fedata->initElemNodeList(elemID,nNodesPerElem,elemNodeList,3,NULL); return 0; #else return 1; #endif } /****************************************************************************/ /* HYPRE_LSI_MLIFEDataInitSharedNodes */ /*--------------------------------------------------------------------------*/ extern "C" int HYPRE_LSI_MLIFEDataInitSharedNodes(void *object, int nSharedNodes, int *sharedNodeIDs, int *sharedProcLengs, int **sharedProcIDs) { #ifdef HAVE_MLI HYPRE_MLI_FEData *hypre_fedata = (HYPRE_MLI_FEData *) object; MLI_FEData *fedata; if ( hypre_fedata == NULL ) return 1; fedata = (MLI_FEData *) hypre_fedata->fedata_; if ( fedata == NULL ) return 1; if ( nSharedNodes > 0 ) fedata->initSharedNodes(nSharedNodes, sharedNodeIDs, sharedProcLengs, sharedProcIDs); return 0; #else (void) object; (void) nSharedNodes; (void) sharedNodeIDs; (void) sharedProcLengs; (void) sharedProcIDs; return 1; #endif } /****************************************************************************/ /* HYPRE_LSI_MLIFEDataInitComplete */ /*--------------------------------------------------------------------------*/ extern "C" int HYPRE_LSI_MLIFEDataInitComplete( void *object ) { #ifdef HAVE_MLI HYPRE_MLI_FEData *hypre_fedata = (HYPRE_MLI_FEData *) object; MLI_FEData *fedata; if ( hypre_fedata == NULL ) return 1; fedata = (MLI_FEData *) hypre_fedata->fedata_; if ( fedata == NULL ) return 1; fedata->initComplete(); return 0; #else (void) object; return 1; #endif } /****************************************************************************/ /* HYPRE_LSI_MLIFEDataLoadElemMatrix */ /*--------------------------------------------------------------------------*/ extern "C" int HYPRE_LSI_MLIFEDataLoadElemMatrix(void *object, int elemID, int nNodes, int *nodeList, int matDim, double **inMat) { (void) nNodes; (void) nodeList; #ifdef HAVE_MLI int i, j; double *elemMat; HYPRE_MLI_FEData *hypre_fedata = (HYPRE_MLI_FEData *) object; MLI_FEData *fedata; /* -------------------------------------------------------- */ /* error checking */ /* -------------------------------------------------------- */ if ( hypre_fedata == NULL ) return 1; fedata = (MLI_FEData *) hypre_fedata->fedata_; if ( fedata == NULL ) return 1; /* -------------------------------------------------------- */ /* load the element matrix */ /* -------------------------------------------------------- */ elemMat = new double[matDim*matDim]; for ( i = 0; i < matDim; i++ ) for ( j = 0; j < matDim; j++ ) elemMat[i+j*matDim] = inMat[i][j]; fedata->loadElemMatrix(elemID, matDim, elemMat); delete [] elemMat; return 0; #else (void) object; (void) elemID; (void) matDim; (void) inMat; return 1; #endif } /****************************************************************************/ /* HYPRE_LSI_MLIFEDataWriteToFile */ /*--------------------------------------------------------------------------*/ extern "C" int HYPRE_LSI_MLIFEDataWriteToFile( void *object, char *filename ) { #ifdef HAVE_MLI MLI_FEData *fedata; HYPRE_MLI_FEData *hypre_fedata = (HYPRE_MLI_FEData *) object; /* -------------------------------------------------------- */ /* error checking */ /* -------------------------------------------------------- */ if ( hypre_fedata == NULL ) return 1; fedata = (MLI_FEData *) hypre_fedata->fedata_; if ( fedata == NULL ) return 1; /* -------------------------------------------------------- */ /* write to file */ /* -------------------------------------------------------- */ fedata->writeToFile( filename ); return 0; #else (void) object; (void) filename; return 1; #endif } /****************************************************************************/ /* HYPRE_LSI_MLISFEICreate */ /*--------------------------------------------------------------------------*/ extern "C" void *HYPRE_LSI_MLISFEICreate( MPI_Comm mpiComm ) { #ifdef HAVE_MLI HYPRE_MLI_SFEI *hypre_sfei; hypre_sfei = hypre_TAlloc(HYPRE_MLI_SFEI, 1, HYPRE_MEMORY_HOST); hypre_sfei->comm_ = mpiComm; hypre_sfei->sfei_ = new MLI_SFEI(mpiComm);; hypre_sfei->sfeiOwn_ = 1; return ((void *) hypre_sfei); #else return NULL; #endif } /****************************************************************************/ /* HYPRE_LSI_MLISFEIDestroy */ /*--------------------------------------------------------------------------*/ extern "C" int HYPRE_LSI_MLISFEIDestroy( void *object ) { #ifdef HAVE_MLI HYPRE_MLI_SFEI *hypre_sfei = (HYPRE_MLI_SFEI *) object; if ( hypre_sfei == NULL ) return 1; if ( hypre_sfei->sfeiOwn_ && hypre_sfei->sfei_ != NULL ) delete hypre_sfei->sfei_; hypre_sfei->sfei_ = NULL; free( hypre_sfei ); return 0; #else return 1; #endif } /****************************************************************************/ /* HYPRE_LSI_MLISFEILoadElemMatrices */ /*--------------------------------------------------------------------------*/ extern "C" int HYPRE_LSI_MLISFEILoadElemMatrices(void *object, int elemBlk, int nElems, int *elemIDs, double ***inMat, int elemNNodes, int **nodeLists) { #ifdef HAVE_MLI HYPRE_MLI_SFEI *hypre_sfei = (HYPRE_MLI_SFEI *) object; MLI_SFEI *sfei; /* -------------------------------------------------------- */ /* error checking */ /* -------------------------------------------------------- */ if ( hypre_sfei == NULL ) return 1; sfei = (MLI_SFEI *) hypre_sfei->sfei_; if ( sfei == NULL ) return 1; /* -------------------------------------------------------- */ /* load the element matrix */ /* -------------------------------------------------------- */ sfei->loadElemBlock(elemBlk,nElems,elemIDs,inMat,elemNNodes,nodeLists); return 0; #else (void) object; (void) elemBlk; (void) nElems; (void) elemIDs; (void) inMat; (void) elemNNodes; (void) nodeLists; return 1; #endif } /****************************************************************************/ /* HYPRE_LSI_MLISFEIAddNumElems */ /*--------------------------------------------------------------------------*/ extern "C" int HYPRE_LSI_MLISFEIAddNumElems(void *object, int elemBlk, int nElems, int elemNNodes) { #ifdef HAVE_MLI HYPRE_MLI_SFEI *hypre_sfei = (HYPRE_MLI_SFEI *) object; MLI_SFEI *sfei; /* -------------------------------------------------------- */ /* error checking */ /* -------------------------------------------------------- */ if ( hypre_sfei == NULL ) return 1; sfei = (MLI_SFEI *) hypre_sfei->sfei_; if ( sfei == NULL ) return 1; /* -------------------------------------------------------- */ /* send information to sfei object */ /* -------------------------------------------------------- */ sfei->addNumElems(elemBlk,nElems,elemNNodes); return 0; #else (void) object; (void) elemBlk; (void) nElems; (void) elemNNodes; return 1; #endif } hypre-2.33.0/src/FEI_mv/fei-hypre/HYPRE_LSI_mli.h000066400000000000000000000072011477326011500211300ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * HYPRE_LSI_MLI interface * *****************************************************************************/ #ifndef __HYPRE_LSI_MLI__ #define __HYPRE_LSI_MLI__ /****************************************************************************** * system includes *---------------------------------------------------------------------------*/ #include #include #include /****************************************************************************** * HYPRE internal libraries *---------------------------------------------------------------------------*/ #include "utilities/_hypre_utilities.h" #include "HYPRE.h" #include "parcsr_ls/HYPRE_parcsr_ls.h" #include "parcsr_mv/_hypre_parcsr_mv.h" #include "HYPRE_FEI_includes.h" /****************************************************************************** * Functions to access this data structure *---------------------------------------------------------------------------*/ #ifdef __cplusplus extern "C" { #endif extern int HYPRE_LSI_MLICreate( MPI_Comm, HYPRE_Solver * ); extern int HYPRE_LSI_MLIDestroy( HYPRE_Solver ); extern int HYPRE_LSI_MLISetup( HYPRE_Solver, HYPRE_ParCSRMatrix, HYPRE_ParVector, HYPRE_ParVector ); extern int HYPRE_LSI_MLISolve( HYPRE_Solver, HYPRE_ParCSRMatrix, HYPRE_ParVector, HYPRE_ParVector); extern int HYPRE_LSI_MLISetParams( HYPRE_Solver, char * ); extern int HYPRE_LSI_MLICreateNodeEqnMap( HYPRE_Solver, int, int *, int *, int *procNRows ); extern int HYPRE_LSI_MLIAdjustNodeEqnMap( HYPRE_Solver, int *, int * ); extern int HYPRE_LSI_MLIGetNullSpace( HYPRE_Solver, int *, int *, double ** ); extern int HYPRE_LSI_MLIAdjustNullSpace( HYPRE_Solver, int, int *, HYPRE_ParCSRMatrix ); extern int HYPRE_LSI_MLISetFEData( HYPRE_Solver, void * ); extern int HYPRE_LSI_MLISetSFEI( HYPRE_Solver, void * ); extern int HYPRE_LSI_MLILoadNodalCoordinates( HYPRE_Solver, int, int, int *, int, double *, int ); extern int HYPRE_LSI_MLILoadMatrixScalings( HYPRE_Solver, int, double * ); extern int HYPRE_LSI_MLILoadMaterialLabels( HYPRE_Solver, int, int * ); extern void *HYPRE_LSI_MLIFEDataCreate( MPI_Comm ); extern int HYPRE_LSI_MLIFEDataDestroy( void * ); extern int HYPRE_LSI_MLIFEDataInitFields( void *, int, int *, int * ); extern int HYPRE_LSI_MLIFEDataInitElemBlock(void *, int, int, int, int *); extern int HYPRE_LSI_MLIFEDataInitElemNodeList(void *, int, int, int*); extern int HYPRE_LSI_MLIFEDataInitSharedNodes(void *, int, int *, int*, int **); extern int HYPRE_LSI_MLIFEDataInitComplete( void * ); extern int HYPRE_LSI_MLIFEDataLoadElemMatrix(void *, int, int, int *, int, double **); extern int HYPRE_LSI_MLIFEDataWriteToFile( void *, char * ); extern void *HYPRE_LSI_MLISFEICreate( MPI_Comm ); extern int HYPRE_LSI_MLISFEIDestroy( void * ); extern int HYPRE_LSI_MLISFEILoadElemMatrices(void *, int, int, int *, double ***, int, int **); extern int HYPRE_LSI_MLISFEIAddNumElems(void *, int, int, int); #ifdef __cplusplus } #endif #endif hypre-2.33.0/src/FEI_mv/fei-hypre/HYPRE_LSI_mlmaxwell.c000066400000000000000000001134461477326011500223550ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************/ /* HYPRE_LSI_MLMaxwell interface */ /*--------------------------------------------------------------------------*/ /* local functions : * * ML_ExchBdry * ML_MatVec * ML_GetRow * HYPRE_LSI_MLMaxwellCreate * HYPRE_LSI_MLMaxwellDestroy * HYPRE_LSI_MLMaxwellSetup * HYPRE_LSI_MLMaxwellSolve * HYPRE_LSI_MLMaxwellSetStrongThreshold * HYPRE_LSI_MLMaxwellSetGMatrix * HYPRE_LSI_MLMaxwellSetANNMatrix * HYPRE_LSI_ConstructMLMatrix ****************************************************************************/ #include #include #include #include "../../parcsr_ls/HYPRE_parcsr_ls.h" #include "../../utilities/_hypre_utilities.h" #include "../../seq_mv/vector.h" /* #include "../../parcsr_mv/par_vector.h" */ #include "../../parcsr_mv/_hypre_parcsr_mv.h" #include "HYPRE_MLMatrix.h" #include "HYPRE_MLMaxwell.h" extern void hypre_qsort0(int *, int, int); extern int HYPRE_LSI_MLConstructMLMatrix(HYPRE_ParCSRMatrix, HYPRE_ML_Matrix *, int *, MPI_Comm, MLMaxwell_Context*); /****************************************************************************/ /* communication functions on parallel platforms */ /*--------------------------------------------------------------------------*/ int ML_Irecv(void* buf, unsigned int count, int *src, int *mid, MPI_Comm comm, MPI_Request *requests) { #ifdef HYPRE_SEQUENTIAL return 0; #else int mypid, lsrc, retcode; if (*src < 0) lsrc = MPI_ANY_SOURCE; else lsrc = (*src); retcode = MPI_Irecv(buf, (int) count,MPI_BYTE,lsrc,*mid,comm,requests); if (retcode != 0) { MPI_Comm_rank(comm, &mypid); printf("%d : ML_Irecv warning : retcode = %d\n", mypid, retcode); } return 0; #endif } int ML_Wait(void* buf, unsigned int count, int *src, int *mid, MPI_Comm comm, MPI_Request *requests) { #ifdef HYPRE_SEQUENTIAL return count; #else MPI_Status status; int mypid, incount, retcode; retcode = MPI_Wait(requests, &status); if (retcode != 0) { MPI_Comm_rank(comm, &mypid); printf("%d : ML_Wait warning : retcode = %d\n", mypid, retcode); } MPI_Get_count(&status, MPI_BYTE, &incount); if (*src < 0) *src = status.MPI_SOURCE; return incount; #endif } int ML_Send(void* buf, unsigned int count, int dest, int mid, MPI_Comm comm) { #ifdef HYPRE_SEQUENTIAL return 0; #else int mypid; int retcode = MPI_Send(buf, (int) count, MPI_BYTE, dest, mid, comm); if (retcode != 0) { MPI_Comm_rank(comm, &mypid); printf("%d : ML_Send warning : retcode = %d\n", mypid, retcode); } return 0; #endif } /****************************************************************************/ /* wrapper function for interprocessor communication for matvec and getrow */ /*--------------------------------------------------------------------------*/ int ML_ExchBdry(double *vec, void *obj) { #ifdef HYPRE_SEQUENTIAL return 0; #else int i, j, msgid, leng, src, dest, offset, *tempList; int sendProcCnt, *sendProc, *sendLeng, **sendList; int recvProcCnt, *recvProc, *recvLeng, nRows; double *dbuf; HYPRE_ML_Matrix *Amat; MPI_Comm comm; MPI_Request *requests; MLMaxwell_Context *context; context = (MLMaxwell_Context *) obj; Amat = (HYPRE_ML_Matrix *) context->Amat; comm = context->comm; sendProcCnt = Amat->sendProcCnt; recvProcCnt = Amat->recvProcCnt; sendProc = Amat->sendProc; recvProc = Amat->recvProc; sendLeng = Amat->sendLeng; recvLeng = Amat->recvLeng; sendList = Amat->sendList; nRows = Amat->Nrows; if (recvProcCnt > 0) requests = hypre_TAlloc(MPI_Request, recvProcCnt, HYPRE_MEMORY_HOST); msgid = 234; offset = nRows; for (i = 0; i < recvProcCnt; i++) { leng = recvLeng[i] * sizeof(double); src = recvProc[i]; ML_Irecv((void*) &(vec[offset]),leng,&src,&msgid,comm,&requests[i]); offset += recvLeng[i]; } msgid = 234; for (i = 0; i < sendProcCnt; i++) { dest = sendProc[i]; leng = sendLeng[i] * sizeof(double); dbuf = hypre_TAlloc(double, leng , HYPRE_MEMORY_HOST); tempList = sendList[i]; for (j = 0; j < sendLeng[i]; j++) dbuf[j] = vec[tempList[j]]; ML_Send((void*) dbuf, leng, dest, msgid, comm); hypre_TFree(dbuf, HYPRE_MEMORY_HOST); } offset = nRows; for (i = 0; i < recvProcCnt; i++) { leng = recvLeng[i] * sizeof(double); src = recvProc[i]; ML_Wait((void*) &(vec[offset]), leng, &src, &msgid, comm, &requests[i]); offset += recvLeng[i]; } if (recvProcCnt > 0) hypre_TFree(requests, HYPRE_MEMORY_HOST); return 1; #endif } /****************************************************************************/ /* matvec function for local matrix structure HYPRE_ML_Matrix */ /*--------------------------------------------------------------------------*/ #ifdef HAVE_MLMAXWELL int ML_MatVec(ML_Operator *obj, int leng1, double p[], int leng2, double ap[]) #else int ML_MatVec(void *obj, int leng1, double p[], int leng2, double ap[]) #endif { #ifdef HAVE_MLMAXWELL int i, j, length, nRows, ibeg, iend, k, *rowptr, *colInd; double *dbuf, sum, *colVal; HYPRE_ML_Matrix *Amat; MLMaxwell_Context *context; ML_Operator *ml_op = (ML_Operator *) obj; context = (MLMaxwell_Context *) ML_Get_MyGetrowData(ml_op); Amat = (HYPRE_ML_Matrix*) context->Amat; nRows = Amat->Nrows; rowptr = Amat->rowptr; colInd = Amat->colnum; colVal = Amat->values; length = nRows; for (i = 0; i < Amat->recvProcCnt; i++) length += Amat->recvLeng[i]; dbuf = hypre_TAlloc(double, length , HYPRE_MEMORY_HOST); for (i = 0; i < nRows; i++) dbuf[i] = p[i]; ML_ExchBdry(dbuf, (void *) context); for (i = 0 ; i < nRows; i++) { sum = 0.0; ibeg = rowptr[i]; iend = rowptr[i+1]; for (j = ibeg; j < iend; j++) { k = colInd[j]; sum += (colVal[j] * dbuf[k]); } ap[i] = sum; } hypre_TFree(dbuf, HYPRE_MEMORY_HOST); return 1; #else printf("ML_MatVec : MLMaxwell not activated.\n"); return -1; #endif } /****************************************************************************/ /* getrow function for local matrix structure HYPRE_ML_Matrix(ML compatible)*/ /*--------------------------------------------------------------------------*/ #ifdef HAVE_MLMAXWELL int ML_GetRow(ML_Operator *obj, int N_requested_rows, int requested_rows[], int allocated_space, int columns[], double values[], int row_lengths[]) #else int ML_GetRow(void *obj, int N_requested_rows, int requested_rows[], int allocated_space, int columns[], double values[], int row_lengths[]) #endif { #ifdef HAVE_MLMAXWELL int i, j, ncnt, colindex, rowLeng, rowindex; int nRows, *rowptr, *colInd; double *colVal; MLMaxwell_Context *context; HYPRE_ML_Matrix *Amat; ML_Operator *ml_op = (ML_Operator *) obj; context = (MLMaxwell_Context *) ML_Get_MyGetrowData(ml_op); Amat = (HYPRE_ML_Matrix*) context->Amat; nRows = Amat->Nrows; rowptr = Amat->rowptr; colInd = Amat->colnum; colVal = Amat->values; ncnt = 0; for (i = 0; i < N_requested_rows; i++) { rowindex = requested_rows[i]; if (rowindex < 0 || rowindex >= nRows) printf("Invalid row request in GetRow : %d (%d)\n",rowindex,nRows); rowLeng = rowptr[rowindex+1] - rowptr[rowindex]; if (ncnt+rowLeng > allocated_space) {row_lengths[i]=-9; return 0;} row_lengths[i] = rowLeng; colindex = rowptr[rowindex]; for (j = 0; j < rowLeng; j++) { columns[ncnt] = colInd[colindex]; values[ncnt++] = colVal[colindex++]; } } return 1; #else printf("ML_GetRow : MLMaxwell not activated.\n"); return -1; #endif } /****************************************************************************/ /* HYPRE_LSI_MLMaxwellCreate */ /*--------------------------------------------------------------------------*/ int HYPRE_LSI_MLMaxwellCreate(MPI_Comm comm, HYPRE_Solver *solver) { #ifdef HAVE_MLMAXWELL /* create an internal ML data structure */ MLMaxwell_Link *link = hypre_TAlloc(MLMaxwell_Link, 1, HYPRE_MEMORY_HOST); if (link == NULL) return 1; /* fill in all other default parameters */ link->comm = comm; link->nlevels = 6; /* max number of levels */ link->smoothP_flag = ML_YES; link->edge_smoother = (void *) ML_Gen_Smoother_MLS; link->node_smoother = (void *) ML_Gen_Smoother_MLS; link->ml_ag = NULL; link->ml_ee = NULL; link->ml_nn = NULL; link->Aee_contxt = NULL; link->Ann_contxt = NULL; link->G_contxt = NULL; link->ag_threshold = 0.0; /* threshold for aggregation */ link->Annmat = NULL; link->Gmat = NULL; link->GTmat = NULL; link->Gmat_array = NULL; link->GTmat_array = NULL; link->node_args = NULL; link->edge_args = NULL; ML_Create(&(link->ml_ee), link->nlevels); ML_Create(&(link->ml_nn), link->nlevels); *solver = (HYPRE_Solver) link; return 0; #else printf("ML not linked.\n"); return -1; #endif } /****************************************************************************/ /* HYPRE_LSI_MLMaxwellDestroy */ /*--------------------------------------------------------------------------*/ int HYPRE_LSI_MLMaxwellDestroy(HYPRE_Solver solver) { #ifdef HAVE_MLMAXWELL int i; HYPRE_ML_Matrix *Amat; MLMaxwell_Link *link = (MLMaxwell_Link *) solver; if (link->ml_ag != NULL) ML_Aggregate_Destroy(&(link->ml_ag)); if (link->ml_ee != NULL) ML_Destroy(&(link->ml_ee)); if (link->ml_nn != NULL) ML_Destroy(&(link->ml_nn)); hypre_TFree(link->Aee_contxt->partition, HYPRE_MEMORY_HOST); hypre_TFree(link->Ann_contxt->partition, HYPRE_MEMORY_HOST); if (link->Aee_contxt->Amat != NULL) { Amat = (HYPRE_ML_Matrix *) link->Aee_contxt->Amat; hypre_TFree(Amat->sendProc, HYPRE_MEMORY_HOST); hypre_TFree(Amat->sendLeng, HYPRE_MEMORY_HOST); if (Amat->sendList != NULL ) { for (i = 0; i < Amat->sendProcCnt; i++) hypre_TFree(Amat->sendList[i], HYPRE_MEMORY_HOST); hypre_TFree(Amat->sendList, HYPRE_MEMORY_HOST); } hypre_TFree(Amat->recvProc, HYPRE_MEMORY_HOST); hypre_TFree(Amat->recvLeng, HYPRE_MEMORY_HOST); hypre_TFree(Amat->map, HYPRE_MEMORY_HOST); hypre_TFree(Amat, HYPRE_MEMORY_HOST); } hypre_TFree(link->Aee_contxt, HYPRE_MEMORY_HOST); if (link->Ann_contxt->Amat != NULL) { Amat = (HYPRE_ML_Matrix *) link->Ann_contxt->Amat; hypre_TFree(Amat->sendProc, HYPRE_MEMORY_HOST); hypre_TFree(Amat->sendLeng, HYPRE_MEMORY_HOST); if (Amat->sendList != NULL ) { for (i = 0; i < Amat->sendProcCnt; i++) hypre_TFree(Amat->sendList[i], HYPRE_MEMORY_HOST); hypre_TFree(Amat->sendList, HYPRE_MEMORY_HOST); } hypre_TFree(Amat->recvProc, HYPRE_MEMORY_HOST); hypre_TFree(Amat->recvLeng, HYPRE_MEMORY_HOST); hypre_TFree(Amat->map, HYPRE_MEMORY_HOST); hypre_TFree(Amat, HYPRE_MEMORY_HOST); } hypre_TFree(link->Ann_contxt, HYPRE_MEMORY_HOST); if (link->G_contxt->Amat != NULL) { Amat = (HYPRE_ML_Matrix *) link->G_contxt->Amat; hypre_TFree(Amat->sendProc, HYPRE_MEMORY_HOST); hypre_TFree(Amat->sendLeng, HYPRE_MEMORY_HOST); if (Amat->sendList != NULL ) { for (i = 0; i < Amat->sendProcCnt; i++) hypre_TFree(Amat->sendList[i], HYPRE_MEMORY_HOST); hypre_TFree(Amat->sendList, HYPRE_MEMORY_HOST); } hypre_TFree(Amat->recvProc, HYPRE_MEMORY_HOST); hypre_TFree(Amat->recvLeng, HYPRE_MEMORY_HOST); hypre_TFree(Amat->map, HYPRE_MEMORY_HOST); hypre_TFree(Amat, HYPRE_MEMORY_HOST); } hypre_TFree(link->G_contxt, HYPRE_MEMORY_HOST); if (link->Gmat != NULL) ML_Operator_Destroy(&(link->Gmat)); if (link->GTmat != NULL) ML_Operator_Destroy(&(link->GTmat)); if (link->Gmat_array != NULL) ML_MGHierarchy_ReitzingerDestroy(link->nlevels-2, &(link->Gmat_array), &(link->GTmat_array)); if (link->node_args != NULL) ML_Smoother_Arglist_Delete(&(link->node_args)); if (link->edge_args != NULL) ML_Smoother_Arglist_Delete(&(link->edge_args)); hypre_TFree(link, HYPRE_MEMORY_HOST); return 0; #else printf("ML not linked.\n"); return -1; #endif } /****************************************************************************/ /* HYPRE_LSI_MLMaxwellSetup */ /*--------------------------------------------------------------------------*/ int HYPRE_LSI_MLMaxwellSetup(HYPRE_Solver solver, HYPRE_ParCSRMatrix A_ee, HYPRE_ParVector x, HYPRE_ParVector b) { #ifdef HAVE_MLMAXWELL int i, mypid, nprocs, coarsest_level, level, nlevels; int *row_partition, nodeNEqns, edgeNEqns, length; int edge_its = 3, node_its = 3, Nfine_node, Nfine_edge, itmp; int hiptmair_type=HALF_HIPTMAIR, Nits_per_presmooth=1; int Ncoarse_edge, Ncoarse_node; double edge_coarsening_rate, node_coarsening_rate; double node_omega = ML_DDEFAULT, edge_omega = ML_DDEFAULT; ML *ml_ee, *ml_nn; ML_Operator *Gmat, *GTmat; MLMaxwell_Link *link; HYPRE_ML_Matrix *mh_Aee, *mh_G, *mh_Ann; MLMaxwell_Context *Aee_context, *G_context, *Ann_context; /* -------------------------------------------------------- */ /* set up the parallel environment */ /* -------------------------------------------------------- */ link = (MLMaxwell_Link *) solver; MPI_Comm_rank(link->comm, &mypid); MPI_Comm_size(link->comm, &nprocs); /* -------------------------------------------------------- */ /* create ML structures */ /* -------------------------------------------------------- */ nlevels = link->nlevels; ML_Create(&(link->ml_ee), nlevels); ML_Create(&(link->ml_nn), nlevels); ml_ee = link->ml_ee; ml_nn = link->ml_nn; /* -------------------------------------------------------- */ /* fetch the matrix row partition information and put it */ /* into the matrix data object (for matvec and getrow) */ /* -------------------------------------------------------- */ Aee_context = hypre_TAlloc(MLMaxwell_Context, 1, HYPRE_MEMORY_HOST); link->Aee_contxt = Aee_context; Aee_context->comm = link->comm; HYPRE_ParCSRMatrixGetRowPartitioning(A_ee, &row_partition); edgeNEqns = row_partition[mypid+1] - row_partition[mypid]; Aee_context->globalEqns = row_partition[nprocs]; Aee_context->partition = hypre_TAlloc(int, (nprocs+1), HYPRE_MEMORY_HOST); for (i=0; i<=nprocs; i++) Aee_context->partition[i] = row_partition[i]; hypre_TFree(row_partition, HYPRE_MEMORY_HOST); mh_Aee = hypre_TAlloc(HYPRE_ML_Matrix, 1, HYPRE_MEMORY_HOST); HYPRE_LSI_MLConstructMLMatrix(A_ee,mh_Aee,Aee_context->partition, link->comm,Aee_context); Aee_context->Amat = mh_Aee; Ann_context = hypre_TAlloc(MLMaxwell_Context, 1, HYPRE_MEMORY_HOST); link->Ann_contxt = Ann_context; Ann_context->comm = link->comm; HYPRE_ParCSRMatrixGetRowPartitioning(link->hypreAnn, &row_partition); nodeNEqns = row_partition[mypid+1] - row_partition[mypid]; Ann_context->globalEqns = row_partition[nprocs]; Ann_context->partition = hypre_TAlloc(int, (nprocs+1), HYPRE_MEMORY_HOST); for (i=0; i<=nprocs; i++) Ann_context->partition[i] = row_partition[i]; hypre_TFree(row_partition, HYPRE_MEMORY_HOST); mh_Ann = hypre_TAlloc(HYPRE_ML_Matrix, 1, HYPRE_MEMORY_HOST); HYPRE_LSI_MLConstructMLMatrix(link->hypreAnn,mh_Ann,Ann_context->partition, link->comm,Ann_context); Ann_context->Amat = mh_Ann; G_context = hypre_TAlloc(MLMaxwell_Context, 1, HYPRE_MEMORY_HOST); link->G_contxt = G_context; G_context->comm = link->comm; HYPRE_ParCSRMatrixGetRowPartitioning(link->hypreG, &row_partition); G_context->globalEqns = row_partition[nprocs]; G_context->partition = hypre_TAlloc(int, (nprocs+1), HYPRE_MEMORY_HOST); for (i=0; i<=nprocs; i++) G_context->partition[i] = row_partition[i]; hypre_TFree(row_partition, HYPRE_MEMORY_HOST); mh_G = hypre_TAlloc(HYPRE_ML_Matrix, 1, HYPRE_MEMORY_HOST); HYPRE_LSI_MLConstructMLMatrix(link->hypreG,mh_G,G_context->partition, link->comm,G_context); G_context->Amat = mh_G; /* -------------------------------------------------------- */ /* Build A_ee directly as an ML matrix */ /* -------------------------------------------------------- */ ML_Init_Amatrix(ml_ee,nlevels-1,edgeNEqns,edgeNEqns,(void *)Aee_context); length = edgeNEqns; for (i=0; irecvProcCnt; i++) length += mh_Aee->recvLeng[i]; ML_Set_Amatrix_Getrow(ml_ee, nlevels-1, ML_GetRow, ML_ExchBdry, length); ML_Operator_Set_ApplyFunc(&(ml_ee->Amat[nlevels-1]), ML_MatVec); /* -------------------------------------------------------- */ /* Build A_nn directly as an ML matrix */ /* -------------------------------------------------------- */ ML_Init_Amatrix(ml_nn, nlevels-1,nodeNEqns,nodeNEqns,(void *)Ann_context); length = nodeNEqns; for (i=0; irecvProcCnt; i++) length += mh_Ann->recvLeng[i]; ML_Set_Amatrix_Getrow(ml_nn, nlevels-1, ML_GetRow, ML_ExchBdry, length); ML_Operator_Set_ApplyFunc(&(ml_nn->Amat[nlevels-1]), ML_MatVec); /* -------------------------------------------------------- */ /* Build G matrix and its transpose */ /* -------------------------------------------------------- */ Gmat = ML_Operator_Create(ml_ee->comm); ML_Operator_Set_Getrow(Gmat, edgeNEqns, ML_GetRow); ML_Operator_Set_ApplyFuncData(Gmat, nodeNEqns, edgeNEqns, (void *) G_context, edgeNEqns, ML_MatVec, 0); length = 0; for (i=0; irecvProcCnt; i++) length += mh_Ann->recvLeng[i]; ML_CommInfoOP_Generate(&(Gmat->getrow->pre_comm), ML_ExchBdry, G_context, ml_ee->comm, nodeNEqns, length); GTmat = ML_Operator_Create(ml_ee->comm); ML_Operator_Transpose_byrow(Gmat, GTmat); link->GTmat = GTmat; /* -------------------------------------------------------- */ /* create an AMG or aggregate context */ /* -------------------------------------------------------- */ ML_Set_PrintLevel(2); ML_Set_Tolerance(ml_ee, 1.0e-8); ML_Aggregate_Create(&(link->ml_ag)); ML_Aggregate_Set_CoarsenScheme_Uncoupled(link->ml_ag); ML_Aggregate_Set_DampingFactor(link->ml_ag, 0.0); /* must be 0 */ ML_Aggregate_Set_MaxCoarseSize(link->ml_ag, 30); ML_Aggregate_Set_Threshold(link->ml_ag, link->ag_threshold); coarsest_level = ML_Gen_MGHierarchy_UsingReitzinger(ml_ee, &ml_nn, nlevels-1, ML_DECREASING, link->ml_ag, Gmat, GTmat, &(link->Gmat_array), &(link->GTmat_array), link->smoothP_flag, 1.5, 0, ML_DDEFAULT); /* -------------------------------------------------------- */ /* Set the Hiptmair subsmoothers */ /* -------------------------------------------------------- */ if (link->node_smoother == (void *) ML_Gen_Smoother_SymGaussSeidel) { link->node_args = ML_Smoother_Arglist_Create(2); ML_Smoother_Arglist_Set(link->node_args, 0, &node_its); ML_Smoother_Arglist_Set(link->node_args, 1, &node_omega); } if (link->edge_smoother == (void *) ML_Gen_Smoother_SymGaussSeidel) { link->edge_args = ML_Smoother_Arglist_Create(2); ML_Smoother_Arglist_Set(link->edge_args, 0, &edge_its); ML_Smoother_Arglist_Set(link->edge_args, 1, &edge_omega); } if (link->node_smoother == (void *) ML_Gen_Smoother_MLS) { link->node_args = ML_Smoother_Arglist_Create(2); ML_Smoother_Arglist_Set(link->node_args, 0, &node_its); Nfine_node = link->Gmat_array[nlevels-1]->invec_leng; ML_gsum_scalar_int(&Nfine_node, &itmp, ml_ee->comm); } if (link->edge_smoother == (void *) ML_Gen_Smoother_MLS) { link->edge_args = ML_Smoother_Arglist_Create(2); ML_Smoother_Arglist_Set(link->edge_args, 0, &edge_its); Nfine_edge = link->Gmat_array[nlevels-1]->outvec_leng; ML_gsum_scalar_int(&Nfine_edge, &itmp, ml_ee->comm); } /* -------------------------------------------------------- */ /* perform aggregation */ /* -------------------------------------------------------- */ if (mypid == 0) printf("HYPRE_MLMaxwell : number of levels = %d\n", coarsest_level); coarsest_level = nlevels - coarsest_level; /* -------------------------------------------------------- */ /* set up at all levels */ /* -------------------------------------------------------- */ for (level = nlevels-1; level >= coarsest_level; level--) { if (link->edge_smoother == (void *) ML_Gen_Smoother_MLS) { if (level != coarsest_level) { Ncoarse_edge = link->Gmat_array[level-1]->outvec_leng; ML_gsum_scalar_int(&Ncoarse_edge, &itmp, ml_ee->comm); edge_coarsening_rate = 2.*((double) Nfine_edge)/ ((double) Ncoarse_edge); } else edge_coarsening_rate = (double) Nfine_edge; ML_Smoother_Arglist_Set(link->edge_args,1,&edge_coarsening_rate); Nfine_edge = Ncoarse_edge; } if (link->node_smoother == (void *) ML_Gen_Smoother_MLS) { if (level != coarsest_level) { Ncoarse_node = link->Gmat_array[level-1]->invec_leng; ML_gsum_scalar_int(&Ncoarse_node, &itmp, ml_ee->comm); node_coarsening_rate = 2.*((double) Nfine_node)/ ((double) Ncoarse_node); } else node_coarsening_rate = (double) Nfine_node; ML_Smoother_Arglist_Set(link->node_args,1,&node_coarsening_rate); Nfine_node = Ncoarse_node; } ML_Gen_Smoother_Hiptmair(ml_ee, level, ML_BOTH, Nits_per_presmooth, link->Gmat_array, link->GTmat_array, NULL, link->edge_smoother, link->edge_args, link->node_smoother, link->node_args, hiptmair_type); } /* -------------------------------------------------------- */ /* set up smoother and coarse solver */ /* -------------------------------------------------------- */ ML_Gen_Solver(ml_ee, ML_MGV, nlevels-1, coarsest_level); return 0; #else printf("ML not linked.\n"); return -1; #endif } /****************************************************************************/ /* HYPRE_LSI_MLSolve */ /*--------------------------------------------------------------------------*/ int HYPRE_LSI_MLMaxwellSolve(HYPRE_Solver solver, HYPRE_ParCSRMatrix A, HYPRE_ParVector b, HYPRE_ParVector x ) { #ifdef HAVE_MLMAXWELL double *rhs, *sol; MLMaxwell_Link *link = (MLMaxwell_Link *) solver; ML *ml_ee = link->ml_ee; rhs = hypre_VectorData(hypre_ParVectorLocalVector((hypre_ParVector *) b)); sol = hypre_VectorData(hypre_ParVectorLocalVector((hypre_ParVector *) x)); ML_Solve_AMGV(ml_ee, rhs, sol); return 0; #else printf("ML not linked.\n"); return -1; #endif } /****************************************************************************/ /* HYPRE_LSI_MLMaxwellSetStrongThreshold */ /*--------------------------------------------------------------------------*/ int HYPRE_LSI_MLMaxwellSetStrengthThreshold(HYPRE_Solver solver, double strength_threshold) { MLMaxwell_Link *link = (MLMaxwell_Link *) solver; if (strength_threshold < 0.0) { printf("HYPRE_LSI_MLMaxwellSetStrengthThreshold WARNING: set to 0.\n"); link->ag_threshold = 0.0; } else { link->ag_threshold = strength_threshold; } return( 0 ); } /****************************************************************************/ /* HYPRE_LSI_MLMaxwellSetGMatrix */ /*--------------------------------------------------------------------------*/ int HYPRE_LSI_MLMaxwellSetGMatrix(HYPRE_Solver solver, HYPRE_ParCSRMatrix G) { MLMaxwell_Link *link = (MLMaxwell_Link *) solver; link->hypreG = G; return( 0 ); } /****************************************************************************/ /* HYPRE_LSI_MLMaxwellSetANNMatrix */ /*--------------------------------------------------------------------------*/ int HYPRE_LSI_MLMaxwellSetANNMatrix(HYPRE_Solver solver, HYPRE_ParCSRMatrix ANN) { MLMaxwell_Link *link = (MLMaxwell_Link *) solver; link->hypreAnn = ANN; return( 0 ); } /****************************************************************************/ /* HYPRE_LSI_MLConstructMLMatrix */ /*--------------------------------------------------------------------------*/ int HYPRE_LSI_MLConstructMLMatrix(HYPRE_ParCSRMatrix A, HYPRE_ML_Matrix *ml_mat, int *partition, MPI_Comm comm, MLMaxwell_Context *obj) { int i, j, index, mypid, nprocs; int rowLeng, *colInd, startRow, endRow, localEqns; int *diagSize, *offdiagSize, externLeng, *externList, ncnt, nnz; int *rowptr, *columns, num_bdry; double *colVal, *values; #ifndef HYPRE_SEQUENTIAL int sendProcCnt, *sendLeng, *sendProc, **sendList; int recvProcCnt, *recvLeng, *recvProc, *tempCnt, msgid; MPI_Request *requests; MPI_Status status; #endif /* -------------------------------------------------------- */ /* get machine information and local matrix information */ /* -------------------------------------------------------- */ #ifdef HYPRE_SEQUENTIAL mypid = 0; nprocs = 1; #else MPI_Comm_rank(comm, &mypid); MPI_Comm_size(comm, &nprocs); #endif startRow = partition[mypid]; endRow = partition[mypid+1] - 1; localEqns = endRow - startRow + 1; /* -------------------------------------------------------- */ /* probe A to find out about diagonal and off-diagonal */ /* block information */ /* -------------------------------------------------------- */ diagSize = hypre_TAlloc(int, localEqns, HYPRE_MEMORY_HOST); offdiagSize = hypre_TAlloc(int, localEqns, HYPRE_MEMORY_HOST); num_bdry = 0; for (i = startRow; i <= endRow; i++) { diagSize[i-startRow] = offdiagSize[i-startRow] = 0; HYPRE_ParCSRMatrixGetRow(A, i, &rowLeng, &colInd, &colVal); for (j = 0; j < rowLeng; j++) { if (colInd[j] < startRow || colInd[j] > endRow) { if ( colVal[j] != 0.0 ) offdiagSize[i-startRow]++; /*offdiagSize[i-startRow]++;*/ } else { if ( colVal[j] != 0.0 ) diagSize[i-startRow]++; /*diagSize[i-startRow]++;*/ } } HYPRE_ParCSRMatrixRestoreRow(A, i, &rowLeng, &colInd, &colVal); if (diagSize[i-startRow] + offdiagSize[i-startRow] == 1) num_bdry++; } /* -------------------------------------------------------- */ /* construct external node list in global eqn numbers */ /* -------------------------------------------------------- */ externLeng = 0; for (i = 0; i < localEqns; i++) externLeng += offdiagSize[i]; if (externLeng > 0) externList = hypre_TAlloc(int, externLeng, HYPRE_MEMORY_HOST); else externList = NULL; externLeng = 0; for (i = startRow; i <= endRow; i++) { HYPRE_ParCSRMatrixGetRow(A, i, &rowLeng, &colInd, &colVal); for (j = 0; j < rowLeng; j++) { if (colInd[j] < startRow || colInd[j] > endRow) if (colVal[j] != 0.0) externList[externLeng++] = colInd[j]; /* externList[externLeng++] = colInd[j]; */ } HYPRE_ParCSRMatrixRestoreRow(A, i, &rowLeng, &colInd, &colVal); } if (externLeng > 1) hypre_qsort0(externList, 0, externLeng-1); ncnt = 0; for (i = 1; i < externLeng; i++) { if (externList[i] != externList[ncnt]) externList[++ncnt] = externList[i]; } if (externLeng > 0) externLeng = ncnt + 1; /* -------------------------------------------------------- */ /* allocate the CSR matrix */ /* -------------------------------------------------------- */ nnz = 0; for (i = 0; i < localEqns; i++) nnz += diagSize[i] + offdiagSize[i]; rowptr = hypre_TAlloc(int, (localEqns + 1) , HYPRE_MEMORY_HOST); columns = hypre_TAlloc(int, nnz , HYPRE_MEMORY_HOST); values = hypre_TAlloc(double, nnz , HYPRE_MEMORY_HOST); rowptr[0] = 0; for (i = 1; i <= localEqns; i++) rowptr[i] = rowptr[i-1] + diagSize[i-1] + offdiagSize[i-1]; hypre_TFree(diagSize, HYPRE_MEMORY_HOST); hypre_TFree(offdiagSize, HYPRE_MEMORY_HOST); /* -------------------------------------------------------- */ /* put the matrix data in the CSR matrix */ /* -------------------------------------------------------- */ rowptr[0] = 0; ncnt = 0; for (i = startRow; i <= endRow; i++) { HYPRE_ParCSRMatrixGetRow(A, i, &rowLeng, &colInd, &colVal); for (j = 0; j < rowLeng; j++) { index = colInd[j]; if (colVal[j] != 0.0) { if (index < startRow || index > endRow) { columns[ncnt] = hypre_BinarySearch(externList,index, externLeng); columns[ncnt] += localEqns; values [ncnt++] = colVal[j]; } else { columns[ncnt] = index - startRow; values[ncnt++] = colVal[j]; } } } rowptr[i-startRow+1] = ncnt; HYPRE_ParCSRMatrixRestoreRow(A, i, &rowLeng, &colInd, &colVal); } hypre_assert(ncnt == nnz); /* -------------------------------------------------------- */ /* initialize the MH_Matrix data structure */ /* -------------------------------------------------------- */ ml_mat->Nrows = localEqns; ml_mat->rowptr = rowptr; ml_mat->colnum = columns; ml_mat->values = values; ml_mat->sendProcCnt = 0; ml_mat->recvProcCnt = 0; ml_mat->sendLeng = NULL; ml_mat->recvLeng = NULL; ml_mat->sendProc = NULL; ml_mat->recvProc = NULL; ml_mat->sendList = NULL; ml_mat->map = externList; /* -------------------------------------------------------- */ /* form the remote portion of the matrix */ /* -------------------------------------------------------- */ #ifndef HYPRE_SEQUENTIAL if (nprocs > 1) { /* ----------------------------------------------------- */ /* count number of elements to be received from each */ /* remote processor (assume sequential mapping) */ /* ----------------------------------------------------- */ tempCnt = hypre_TAlloc(int, nprocs, HYPRE_MEMORY_HOST); for (i = 0; i < nprocs; i++) tempCnt[i] = 0; for (i = 0; i < externLeng; i++) { for ( j = 0; j < nprocs; j++) { if (externList[i] >= partition[j] && externList[i] < partition[j+1]) { tempCnt[j]++; break; } } } /* ----------------------------------------------------- */ /* compile a list processors data is to be received from */ /* ----------------------------------------------------- */ recvProcCnt = 0; for (i = 0; i < nprocs; i++) if (tempCnt[i] > 0) recvProcCnt++; recvLeng = hypre_TAlloc(int, recvProcCnt, HYPRE_MEMORY_HOST); recvProc = hypre_TAlloc(int, recvProcCnt, HYPRE_MEMORY_HOST); recvProcCnt = 0; for (i = 0; i < nprocs; i++) { if (tempCnt[i] > 0) { recvProc[recvProcCnt] = i; recvLeng[recvProcCnt++] = tempCnt[i]; } } /* ----------------------------------------------------- */ /* each processor has to find out how many processors it */ /* has to send data to */ /* ----------------------------------------------------- */ sendLeng = hypre_TAlloc(int, nprocs , HYPRE_MEMORY_HOST); for (i = 0; i < nprocs; i++) tempCnt[i] = 0; for (i = 0; i < recvProcCnt; i++) tempCnt[recvProc[i]] = 1; MPI_Allreduce(tempCnt, sendLeng, nprocs, MPI_INT, MPI_SUM, comm); sendProcCnt = sendLeng[mypid]; hypre_TFree(sendLeng, HYPRE_MEMORY_HOST); if (sendProcCnt > 0) { sendLeng = hypre_TAlloc(int, sendProcCnt , HYPRE_MEMORY_HOST); sendProc = hypre_TAlloc(int, sendProcCnt , HYPRE_MEMORY_HOST); sendList = hypre_TAlloc(int*, sendProcCnt , HYPRE_MEMORY_HOST); } else { sendLeng = sendProc = NULL; sendList = NULL; } /* ----------------------------------------------------- */ /* each processor sends to all processors it expects to */ /* receive data about the lengths of data expected */ /* ----------------------------------------------------- */ msgid = 539; for (i = 0; i < recvProcCnt; i++) { MPI_Send((void*) &recvLeng[i],1,MPI_INT,recvProc[i],msgid,comm); } for (i = 0; i < sendProcCnt; i++) { MPI_Recv((void*) &sendLeng[i],1,MPI_INT,MPI_ANY_SOURCE,msgid, comm,&status); sendProc[i] = status.MPI_SOURCE; sendList[i] = hypre_TAlloc(int, sendLeng[i] , HYPRE_MEMORY_HOST); if (sendList[i] == NULL) printf("allocate problem %d \n", sendLeng[i]); } /* ----------------------------------------------------- */ /* each processor sends to all processors it expects to */ /* receive data about the equation numbers */ /* ----------------------------------------------------- */ for (i = 0; i < nprocs; i++) tempCnt[i] = 0; ncnt = 1; for (i = 0; i < externLeng; i++) { if ( externList[i] >= partition[ncnt] ) { tempCnt[ncnt-1] = i; i--; ncnt++; } } for (i = ncnt-1; i < nprocs; i++) tempCnt[i] = externLeng; /* ----------------------------------------------------- */ /* send the global equation numbers */ /* ----------------------------------------------------- */ if (sendProcCnt > 0) requests = hypre_TAlloc(MPI_Request, sendProcCnt, HYPRE_MEMORY_HOST); msgid = 540; for (i = 0; i < sendProcCnt; i++) { MPI_Irecv((void*)sendList[i],sendLeng[i],MPI_INT,sendProc[i], msgid,comm,&requests[i]); } for (i = 0; i < recvProcCnt; i++) { if (recvProc[i] == 0) j = 0; else j = tempCnt[recvProc[i]-1]; rowLeng = recvLeng[i]; MPI_Send((void*) &externList[j], rowLeng, MPI_INT, recvProc[i], msgid, comm); } for (i = 0; i < sendProcCnt; i++) { MPI_Wait( &requests[i], &status ); } if (sendProcCnt > 0) hypre_TFree(requests, HYPRE_MEMORY_HOST); /* ----------------------------------------------------- */ /* convert the send list from global to local numbers */ /* ----------------------------------------------------- */ for (i = 0; i < sendProcCnt; i++) { for (j = 0; j < sendLeng[i]; j++) { index = sendList[i][j] - startRow; if (index < 0 || index >= localEqns) { printf("%d : Construct ML matrix Error - index out ",mypid); printf("of range %d\n", index); } sendList[i][j] = index; } } /* ----------------------------------------------------- */ /* convert the send list from global to local numbers */ /* ----------------------------------------------------- */ ml_mat->sendProcCnt = sendProcCnt; ml_mat->recvProcCnt = recvProcCnt; ml_mat->sendLeng = sendLeng; ml_mat->recvLeng = recvLeng; ml_mat->sendProc = sendProc; ml_mat->recvProc = recvProc; ml_mat->sendList = sendList; /* ----------------------------------------------------- */ /* clean up */ /* ----------------------------------------------------- */ hypre_TFree(tempCnt, HYPRE_MEMORY_HOST); } return 0; #else nprocs = 1; return (nprocs-1); #endif } hypre-2.33.0/src/FEI_mv/fei-hypre/HYPRE_LSI_poly.c000066400000000000000000000204561477326011500213340ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * HYPRE_LSI_POLY interface * *****************************************************************************/ #include #include #include #include "utilities/_hypre_utilities.h" #include "HYPRE.h" #include "IJ_mv/HYPRE_IJ_mv.h" #include "parcsr_mv/HYPRE_parcsr_mv.h" #include "parcsr_mv/_hypre_parcsr_mv.h" #include "parcsr_ls/HYPRE_parcsr_ls.h" #include "HYPRE_MHMatrix.h" #include "HYPRE_FEI.h" typedef struct HYPRE_LSI_Poly_Struct { MPI_Comm comm; int order; double *coefficients; int Nrows; int outputLevel; } HYPRE_LSI_Poly; #define habs(x) ((x > 0) ? (x) : -(x)) /*-------------------------------------------------------------------------- * HYPRE_LSI_PolyCreate - Return a polynomial preconditioner object "solver". *--------------------------------------------------------------------------*/ int HYPRE_LSI_PolyCreate( MPI_Comm comm, HYPRE_Solver *solver ) { HYPRE_LSI_Poly *poly_ptr; poly_ptr = hypre_TAlloc(HYPRE_LSI_Poly, 1, HYPRE_MEMORY_HOST); if (poly_ptr == NULL) return 1; poly_ptr->comm = comm; poly_ptr->order = 0; poly_ptr->coefficients = NULL; poly_ptr->Nrows = 0; poly_ptr->outputLevel = 0; *solver = (HYPRE_Solver) poly_ptr; return 0; } /*-------------------------------------------------------------------------- * HYPRE_LSI_PolyDestroy - Destroy a Poly object. *--------------------------------------------------------------------------*/ int HYPRE_LSI_PolyDestroy( HYPRE_Solver solver ) { HYPRE_LSI_Poly *poly_ptr; poly_ptr = (HYPRE_LSI_Poly *) solver; hypre_TFree(poly_ptr->coefficients, HYPRE_MEMORY_HOST); hypre_TFree(poly_ptr, HYPRE_MEMORY_HOST); return 0; } /*-------------------------------------------------------------------------- * HYPRE_LSI_PolySetOrder - Set the order of the polynomial. *--------------------------------------------------------------------------*/ int HYPRE_LSI_PolySetOrder(HYPRE_Solver solver, int order ) { HYPRE_LSI_Poly *poly_ptr = (HYPRE_LSI_Poly *) solver; poly_ptr->order = order; if ( poly_ptr->order < 0 ) poly_ptr->order = 0; if ( poly_ptr->order > 8 ) poly_ptr->order = 8; hypre_TFree(poly_ptr->coefficients, HYPRE_MEMORY_HOST); poly_ptr->coefficients = NULL; return 0; } /*-------------------------------------------------------------------------- * HYPRE_LSI_PolySetOutputLevel - Set debug level *--------------------------------------------------------------------------*/ int HYPRE_LSI_PolySetOutputLevel(HYPRE_Solver solver, int level) { HYPRE_LSI_Poly *poly_ptr = (HYPRE_LSI_Poly *) solver; poly_ptr->outputLevel = level; return 0; } /*-------------------------------------------------------------------------- * HYPRE_LSI_PolySolve - Solve function for Polynomial. *--------------------------------------------------------------------------*/ int HYPRE_LSI_PolySolve( HYPRE_Solver solver, HYPRE_ParCSRMatrix A, HYPRE_ParVector b, HYPRE_ParVector x ) { int i, j, order, Nrows; double *rhs, *soln, *orig_rhs, mult, *coefs; HYPRE_LSI_Poly *poly_ptr = (HYPRE_LSI_Poly *) solver; rhs = hypre_VectorData(hypre_ParVectorLocalVector((hypre_ParVector *) b)); soln = hypre_VectorData(hypre_ParVectorLocalVector((hypre_ParVector *) x)); order = poly_ptr->order; Nrows = poly_ptr->Nrows; coefs = poly_ptr->coefficients; if ( coefs == NULL ) { printf("HYPRE_LSI_PolySolve ERROR : PolySetup not called.\n"); exit(1); } orig_rhs = hypre_TAlloc(double, Nrows , HYPRE_MEMORY_HOST); for ( i = 0; i < Nrows; i++ ) { orig_rhs[i] = rhs[i]; soln[i] = rhs[i] * coefs[order]; } for (i = order - 1; i >= 0; i-- ) { HYPRE_ParCSRMatrixMatvec(1.0, A, x, 0.0, b); mult = coefs[i]; for ( j = 0; j < Nrows; j++ ) soln[j] = mult * orig_rhs[j] + rhs[j]; } for ( i = 0; i < Nrows; i++ ) rhs[i] = orig_rhs[i]; hypre_TFree(orig_rhs, HYPRE_MEMORY_HOST); return 0; } /*-------------------------------------------------------------------------- * HYPRE_LSI_PolySetup - Set up function for LSI_Poly. * * abridged from AZTEC * *--------------------------------------------------------------------------*/ int HYPRE_LSI_PolySetup(HYPRE_Solver solver, HYPRE_ParCSRMatrix A_csr, HYPRE_ParVector b, HYPRE_ParVector x ) { int i, j, my_id, startRow, endRow, order; int pos_diag, neg_diag; int rowLeng, *colInd, *row_partition; double *coefs=NULL, rowsum, max_norm, *colVal; HYPRE_LSI_Poly *poly_ptr = (HYPRE_LSI_Poly *) solver; #ifndef HYPRE_SEQUENTIAL double dtemp; #endif /* ---------------------------------------------------------------- */ /* initialize structure */ /* ---------------------------------------------------------------- */ order = poly_ptr->order; coefs = hypre_TAlloc(double, (order+1) , HYPRE_MEMORY_HOST); poly_ptr->coefficients = coefs; /* ---------------------------------------------------------------- */ /* compute matrix norm */ /* ---------------------------------------------------------------- */ HYPRE_ParCSRMatrixGetRowPartitioning( A_csr, &row_partition ); #ifdef HYPRE_SEQUENTIAL my_id = 0; #else MPI_Comm_rank(poly_ptr->comm, &my_id); #endif startRow = row_partition[my_id]; endRow = row_partition[my_id+1] - 1; hypre_TFree( row_partition , HYPRE_MEMORY_HOST); poly_ptr->Nrows = endRow - startRow + 1; max_norm = 0.0; pos_diag = neg_diag = 0; for ( i = startRow; i <= endRow; i++ ) { HYPRE_ParCSRMatrixGetRow(A_csr, i, &rowLeng, &colInd, &colVal); rowsum = 0.0; for (j = 0; j < rowLeng; j++) { rowsum += habs(colVal[j]); if ( colInd[j] == i && colVal[j] > 0.0 ) pos_diag++; if ( colInd[j] == i && colVal[j] < 0.0 ) neg_diag++; } if ( rowsum > max_norm ) max_norm = rowsum; HYPRE_ParCSRMatrixRestoreRow(A_csr, i, &rowLeng, &colInd, &colVal); } #ifndef HYPRE_SEQUENTIAL MPI_Allreduce(&max_norm, &dtemp, 1, MPI_DOUBLE, MPI_MAX, poly_ptr->comm); #endif if ( pos_diag == 0 && neg_diag > 0 ) max_norm = - max_norm; /* ---------------------------------------------------------------- */ /* fill in the coefficient table */ /* ---------------------------------------------------------------- */ switch ( order ) { case 0: coefs[0] = 1.0; break; case 1: coefs[0] = 5.0; coefs[1] = -1.0; break; case 2: coefs[0] = 14.0; coefs[1] = -7.0; coefs[2] = 1.0; break; case 3: coefs[0] = 30.0; coefs[1] = -27.0; coefs[2] = 9.0; coefs[3] = -1.0; break; case 4: coefs[0] = 55.0; coefs[1] = -77.0; coefs[2] = 44.0; coefs[3] = -11.0; coefs[4] = 1.0; break; case 5: coefs[0] = 91.0; coefs[1] = -182.0; coefs[2] = 156.0; coefs[3] = -65.0; coefs[4] = 13.0; coefs[5] = -1.0; break; case 6: coefs[0] = 140.0; coefs[1] = -378.0; coefs[2] = 450.0; coefs[3] = -275.0; coefs[4] = 90.0; coefs[5] = -15.0; coefs[6] = 1.0; break; case 7: coefs[0] = 204.0; coefs[1] = -714.0; coefs[2] = 1122.0; coefs[3] = -935.0; coefs[4] = 442.0; coefs[5] = -119.0; coefs[6] = 17.0; coefs[7] = -1.0; break; case 8: coefs[0] = 285.0; coefs[1] = -1254.0; coefs[2] = 2508.0; coefs[3] = -2717.0; coefs[4] = 1729.0; coefs[5] = -665.0; coefs[6] = 152.0; coefs[7] = -19.0; coefs[8] = 1.0; break; } for( i = 0; i <= order; i++ ) coefs[i] *= pow( 4.0 / max_norm, (double) i); return 0; } hypre-2.33.0/src/FEI_mv/fei-hypre/HYPRE_LSI_poly.h000066400000000000000000000026421477326011500213360ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * HYPRE_POLY interface * *****************************************************************************/ #ifndef __HYPRE_POLY__ #define __HYPRE_POLY__ #include #include #include #include #include "utilities/_hypre_utilities.h" #include "parcsr_ls/HYPRE_parcsr_ls.h" #include "parcsr_mv/_hypre_parcsr_mv.h" #ifdef __cplusplus extern "C" { #endif extern int HYPRE_LSI_PolyCreate( MPI_Comm comm, HYPRE_Solver *solver ); extern int HYPRE_LSI_PolyDestroy( HYPRE_Solver solver ); extern int HYPRE_LSI_PolySetOrder( HYPRE_Solver solver, int order); extern int HYPRE_LSI_PolySetOutputLevel( HYPRE_Solver solver, int level); extern int HYPRE_LSI_PolySolve( HYPRE_Solver solver, HYPRE_ParCSRMatrix A, HYPRE_ParVector b, HYPRE_ParVector x ); extern int HYPRE_LSI_PolySetup( HYPRE_Solver solver, HYPRE_ParCSRMatrix A, HYPRE_ParVector b, HYPRE_ParVector x ); #ifdef __cplusplus } #endif #endif hypre-2.33.0/src/FEI_mv/fei-hypre/HYPRE_LSI_schur.cxx000066400000000000000000001045661477326011500220620ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include #include #include #include "HYPRE_FEI_includes.h" #include "HYPRE.h" #include "utilities/_hypre_utilities.h" #include "parcsr_mv/_hypre_parcsr_mv.h" #include "HYPRE_LSI_schur.h" //****************************************************************************** // These are external functions needed internally here //------------------------------------------------------------------------------ extern "C" { int hypre_BoomerAMGBuildCoarseOperator(hypre_ParCSRMatrix*, hypre_ParCSRMatrix*, hypre_ParCSRMatrix*, hypre_ParCSRMatrix**); int HYPRE_LSI_Search(int*, int, int); void hypre_qsort0(int *, int, int); void hypre_qsort1(int *, double *, int, int); } //****************************************************************************** // Constructor //------------------------------------------------------------------------------ HYPRE_LSI_Schur::HYPRE_LSI_Schur() { A11mat_ = NULL; A12mat_ = NULL; A22mat_ = NULL; Smat_ = NULL; Svec_ = NULL; APartition_ = NULL; P22LocalInds_ = NULL; P22GlobalInds_ = NULL; P22Offsets_ = NULL; P22Size_ = -1; P22GSize_ = -1; assembled_ = 0; outputLevel_ = 1; lookup_ = NULL; mpiComm_ = -1; } //****************************************************************************** // destructor //------------------------------------------------------------------------------ HYPRE_LSI_Schur::~HYPRE_LSI_Schur() { if ( A11mat_ != NULL ) HYPRE_IJMatrixDestroy(A11mat_); if ( A12mat_ != NULL ) HYPRE_IJMatrixDestroy(A12mat_); if ( A22mat_ != NULL ) HYPRE_IJMatrixDestroy(A22mat_); if ( APartition_ != NULL ) free( APartition_ ); if ( P22LocalInds_ != NULL ) delete [] P22LocalInds_; if ( P22GlobalInds_ != NULL ) delete [] P22GlobalInds_; if ( P22Offsets_ != NULL ) delete [] P22Offsets_; } //****************************************************************************** // set lookup object //------------------------------------------------------------------------------ int HYPRE_LSI_Schur::setLookup(Lookup *object) { lookup_ = object; return 0; } //****************************************************************************** // Given a matrix A, compute the sizes and indices of the 2 x 2 blocks // (P22Size_,P22GSize_,P22LocalInds_,P22GlobalInds_,P22Offsets_) //------------------------------------------------------------------------------ int HYPRE_LSI_Schur::computeBlockInfo() { int mypid, nprocs, startRow, endRow, localNrows, irow, lastNodeNum; int j, rowSize, *colInd, *dispArray, index, globalNrows, count; int nodeNum; double *colVal; //------------------------------------------------------------------ // check that the system matrix has been set, clean up previous // allocations, and extract matrix information //------------------------------------------------------------------ MPI_Comm_rank( mpiComm_, &mypid ); MPI_Comm_size( mpiComm_, &nprocs ); startRow = APartition_[mypid]; endRow = APartition_[mypid+1] - 1; localNrows = endRow - startRow + 1; globalNrows = APartition_[nprocs]; //------------------------------------------------------------------ // find the local size of the (2,2) block //------------------------------------------------------------------ P22Size_ = count = 0; lastNodeNum = -1; for ( irow = startRow; irow <= endRow; irow++ ) { nodeNum = lookup_->getAssociatedNodeNumber(irow); if ( nodeNum != lastNodeNum ) { if (count == 1) break; lastNodeNum = nodeNum; count = 1; } else count++; } index = irow - 1; for ( irow = index; irow <= endRow; irow++ ) P22Size_++; if ( outputLevel_ > 0 ) printf("%4d HYPRE_LSI_Schur : P22_size = %d\n", mypid, P22Size_); //------------------------------------------------------------------ // allocate array for storing indices of (2,2) block variables //------------------------------------------------------------------ if ( P22Size_ > 0 ) P22LocalInds_ = new int[P22Size_]; else P22LocalInds_ = NULL; //------------------------------------------------------------------ // compose a local list of rows for the (2,2) block //------------------------------------------------------------------ P22Size_ = count = 0; lastNodeNum = -1; for ( irow = startRow; irow <= endRow; irow++ ) { nodeNum = lookup_->getAssociatedNodeNumber(irow); if ( nodeNum != lastNodeNum ) { if (count == 1) break; lastNodeNum = nodeNum; count = 1; } else count++; } index = irow - 1; for ( irow = index; irow <= endRow; irow++ ) P22LocalInds_[P22Size_++] = irow; //------------------------------------------------------------------ // compose a global list of rows for the (2,2) block //------------------------------------------------------------------ MPI_Allreduce(&P22Size_, &P22GSize_, 1, MPI_INT, MPI_SUM, mpiComm_); if ( outputLevel_ > 0 ) { if ( P22GSize_ == 0 && mypid == 0 ) printf("HYPRE_LSI_Schur WARNING : P22Size = 0 on all processors.\n"); } if ( P22GSize_ == 0 ) { if ( APartition_ != NULL ) free( APartition_ ); APartition_ = NULL; return 1; } if ( P22GSize_ > 0 ) P22GlobalInds_ = new int[P22GSize_]; else P22GlobalInds_ = NULL; dispArray = new int[nprocs]; P22Offsets_ = new int[nprocs]; MPI_Allgather(&P22Size_, 1, MPI_INT, P22Offsets_, 1, MPI_INT, mpiComm_); dispArray[0] = 0; for ( j = 1; j < nprocs; j++ ) dispArray[j] = dispArray[j-1] + P22Offsets_[j-1]; MPI_Allgatherv(P22LocalInds_, P22Size_, MPI_INT, P22GlobalInds_, P22Offsets_, dispArray, MPI_INT, mpiComm_); delete [] P22Offsets_; P22Offsets_ = dispArray; if ( outputLevel_ > 1 ) { for ( j = 0; j < P22Size_; j++ ) printf("%4d HYPRE_LSI_Schur : P22Inds %8d = %d\n", mypid, j, P22LocalInds_[j]); } return 0; } //****************************************************************************** // Given a matrix A, build the 2 x 2 blocks // (This function is to be called after computeBlockInfo //------------------------------------------------------------------------------ int HYPRE_LSI_Schur::buildBlocks(HYPRE_IJMatrix Amat) { int irow, j, k, rowSize, *inds, ierr, mypid, nprocs, index, searchInd; int ANRows, ANCols, AGNRows, AGNCols, AStartRow, AStartCol; int A11NRows, A11NCols, A11GNRows, A11GNCols, A11StartRow, A11StartCol; int A12NRows, A12NCols, A12GNRows, A12GNCols, A12StartRow, A12StartCol; int A22NRows, A22NCols, A22GNRows, A22GNCols, A22StartRow, A22StartCol; int *A11RowLengs, A11MaxRowLeng, A11RowCnt, A11NewSize, *A11_inds; int *A12RowLengs, A12MaxRowLeng, A12RowCnt, A12NewSize, *A12_inds; int *A22RowLengs, A22MaxRowLeng, A22RowCnt, A22NewSize, *A22_inds; double *vals, *A11_vals, *A12_vals, *A22_vals; char fname[200]; FILE *fp; HYPRE_ParCSRMatrix Amat_csr, A11mat_csr, A22mat_csr, A12mat_csr; //------------------------------------------------------------------ // extract information about the system matrix //------------------------------------------------------------------ MPI_Comm_rank( mpiComm_, &mypid ); MPI_Comm_size( mpiComm_, &nprocs ); AStartRow = APartition_[mypid]; AStartCol = AStartRow; ANRows = APartition_[mypid+1] - AStartRow; ANCols = ANRows; AGNRows = APartition_[nprocs]; AGNCols = AGNRows; //------------------------------------------------------------------ // calculate the dimensions of the 2 x 2 blocks //------------------------------------------------------------------ A11NRows = ANRows - P22Size_; A11NCols = A11NRows; A11GNRows = AGNRows - P22GSize_; A11GNCols = A11GNRows; A11StartRow = AStartRow - P22Offsets_[mypid]; A11StartCol = A11StartRow; A12NRows = ANRows - P22Size_; A12NCols = P22Size_; A12GNRows = AGNRows - P22GSize_; A12GNCols = P22GSize_; A12StartRow = AStartRow - P22Offsets_[mypid]; A12StartCol = P22Offsets_[mypid]; A22NRows = P22Size_; A22NCols = P22Size_; A22GNRows = P22GSize_; A22GNCols = P22GSize_; A22StartRow = P22Offsets_[mypid]; A22StartCol = P22Offsets_[mypid]; if ( outputLevel_ >= 1 ) { printf("%4d HYPRE_LSI_Schur(1,1) : StartRow = %d\n",mypid,A11StartRow); printf("%4d HYPRE_LSI_Schur(1,1) : GlobalDim = %d %d\n",mypid,A11GNRows, A11GNCols); printf("%4d HYPRE_LSI_Schur(1,1) : LocalDim = %d %d\n",mypid,A11NRows, A11NCols); printf("%4d HYPRE_LSI_Schur(1,2) : StartRow = %d\n",mypid,A12StartRow); printf("%4d HYPRE_LSI_Schur(1,2) : GlobalDim = %d %d\n",mypid,A12GNRows, A12GNCols); printf("%4d HYPRE_LSI_Schur(1,2) : LocalDim = %d %d\n",mypid,A12NRows, A12NCols); printf("%4d HYPRE_LSI_Schur(2,2) : StartRow = %d\n",mypid,A22StartRow); printf("%4d HYPRE_LSI_Schur(2,2) : GlobalDim = %d %d\n",mypid,A22GNRows, A22GNCols); printf("%4d HYPRE_LSI_Schur(2,2) : LocalDim = %d %d\n",mypid,A22NRows, A22NCols); } //------------------------------------------------------------------ // figure the row sizes of the block matrices //------------------------------------------------------------------ A11RowLengs = new int[A11NRows]; A12RowLengs = new int[A12NRows]; A22RowLengs = new int[A22NRows]; A11MaxRowLeng = 0; A12MaxRowLeng = 0; A22MaxRowLeng = 0; A11RowCnt = 0; A12RowCnt = 0; A22RowCnt = 0; HYPRE_IJMatrixGetObject(Amat, (void**) &Amat_csr); for ( irow = AStartRow; irow < AStartRow+ANRows; irow++ ) { HYPRE_ParCSRMatrixGetRow(Amat_csr, irow, &rowSize, &inds, &vals); searchInd = hypre_BinarySearch(P22LocalInds_, irow, P22Size_); if ( searchInd < 0 ) // A(1,1) or A(1,2) block { A11NewSize = A12NewSize = 0; for ( j = 0; j < rowSize; j++ ) { index = inds[j]; searchInd = hypre_BinarySearch(P22GlobalInds_,index,P22GSize_); if (searchInd >= 0) A12NewSize++; else A11NewSize++; } if ( A12NewSize == 0 ) A12NewSize = 1; A11RowLengs[A11RowCnt++] = A11NewSize; A12RowLengs[A12RowCnt++] = A12NewSize; A11MaxRowLeng = (A11NewSize > A11MaxRowLeng) ? A11NewSize : A11MaxRowLeng; A12MaxRowLeng = (A12NewSize > A12MaxRowLeng) ? A12NewSize : A12MaxRowLeng; if ( A11NewSize != 1 ) printf("%4d HYPRE_LSI_Schur WARNING - A11 row length > 1 : %d\n", irow); } else // A(2,2) block { A22NewSize = 0; for ( j = 0; j < rowSize; j++ ) { index = inds[j]; searchInd = hypre_BinarySearch(P22GlobalInds_,index,P22GSize_); if (searchInd >= 0) A22NewSize++; } A22RowLengs[A22RowCnt++] = A22NewSize; A22MaxRowLeng = (A22NewSize > A22MaxRowLeng) ? A22NewSize : A22MaxRowLeng; } HYPRE_ParCSRMatrixRestoreRow(Amat_csr, irow, &rowSize, &inds, &vals); } //------------------------------------------------------------------ // create matrix contexts for the blocks //------------------------------------------------------------------ ierr = HYPRE_IJMatrixCreate(mpiComm_, A11StartRow, A11StartRow+A11NRows-1, A11StartCol, A11StartCol+A11NCols-1, &A11mat_); ierr += HYPRE_IJMatrixSetObjectType(A11mat_, HYPRE_PARCSR); ierr = HYPRE_IJMatrixSetRowSizes(A11mat_, A11RowLengs); ierr += HYPRE_IJMatrixInitialize(A11mat_); hypre_assert(!ierr); delete [] A11RowLengs; ierr = HYPRE_IJMatrixCreate(mpiComm_, A12StartRow, A12StartRow+A12NRows-1, A12StartCol, A12StartCol+A12NCols-1, &A12mat_); ierr += HYPRE_IJMatrixSetObjectType(A12mat_, HYPRE_PARCSR); ierr = HYPRE_IJMatrixSetRowSizes(A12mat_, A12RowLengs); ierr += HYPRE_IJMatrixInitialize(A12mat_); hypre_assert(!ierr); delete [] A12RowLengs; if ( A22MaxRowLeng > 0 ) { ierr = HYPRE_IJMatrixCreate(mpiComm_,A22StartRow,A22StartRow+A22NRows-1, A22StartCol, A22StartCol+A22NCols-1, &A22mat_); ierr += HYPRE_IJMatrixSetObjectType(A22mat_, HYPRE_PARCSR); ierr = HYPRE_IJMatrixSetRowSizes(A22mat_, A22RowLengs); ierr += HYPRE_IJMatrixInitialize(A22mat_); hypre_assert(!ierr); } else A22mat_ = NULL; delete [] A22RowLengs; //------------------------------------------------------------------ // load the matrices extracted from A //------------------------------------------------------------------ A11_inds = new int[A11MaxRowLeng+1]; A11_vals = new double[A11MaxRowLeng+1]; A12_inds = new int[A12MaxRowLeng+1]; A12_vals = new double[A12MaxRowLeng+1]; A22_inds = new int[A22MaxRowLeng+1]; A22_vals = new double[A22MaxRowLeng+1]; A11RowCnt = A11StartRow; A12RowCnt = A12StartRow; A22RowCnt = A22StartRow; for ( irow = AStartRow; irow < AStartRow+ANRows; irow++ ) { HYPRE_ParCSRMatrixGetRow(Amat_csr, irow, &rowSize, &inds, &vals); searchInd = hypre_BinarySearch(P22LocalInds_, irow, P22Size_); if ( searchInd < 0 ) // A(1,1) or A(1,2) block { A11NewSize = A12NewSize = 0; for ( j = 0; j < rowSize; j++ ) { index = inds[j]; searchInd = HYPRE_LSI_Search(P22GlobalInds_,index,P22GSize_); if (searchInd >= 0) // A(1,2) block { A12_inds[A12NewSize] = searchInd; A12_vals[A12NewSize++] = vals[j]; } else { searchInd = - searchInd - 1; if ( index == irow && vals[j] != 0.0 ) { A11_inds[A11NewSize] = index - searchInd; A11_vals[A11NewSize++] = 1.0 / vals[j]; } } } if ( A12NewSize == 0 ) { A12_inds[0] = P22Offsets_[mypid]; A12_vals[0] = 0.0; A12NewSize = 1; } for ( k = 0; k < A11NewSize; k++ ) { if ( A11_inds[k] < 0 || A11_inds[k] >= A11GNCols ) { printf("%4d : A11 row %8d has invalid column %8d\n",mypid, A11_inds[k]); exit(1); } } HYPRE_IJMatrixSetValues(A11mat_, 1, &A11NewSize, (const int *) &A11RowCnt, (const int *) A11_inds, (const double *) A11_vals); HYPRE_IJMatrixSetValues(A12mat_, 1, &A12NewSize, (const int *) &A12RowCnt, (const int *) A12_inds, (const double *) A12_vals); A11RowCnt++; A12RowCnt++; } else if ( A22MaxRowLeng > 0 ) // A(2,2) block { A22NewSize = 0; for ( j = 0; j < rowSize; j++ ) { index = inds[j]; searchInd = hypre_BinarySearch(P22GlobalInds_,index,P22GSize_); if (searchInd >= 0) { A22_inds[A22NewSize] = searchInd; A22_vals[A22NewSize++] = vals[j]; } } if ( A22NewSize == 0 ) { A22_inds[0] = P22Offsets_[mypid]; A22_vals[0] = 0.0; A22NewSize = 1; } HYPRE_IJMatrixSetValues(A22mat_, 1, &A22NewSize, (const int *) &A22RowCnt, (const int *) A22_inds, (const double *) A22_vals); A22RowCnt++; } HYPRE_ParCSRMatrixRestoreRow(Amat_csr, irow, &rowSize, &inds, &vals); } delete [] A11_inds; delete [] A11_vals; delete [] A12_inds; delete [] A12_vals; delete [] A22_inds; delete [] A22_vals; //------------------------------------------------------------------ // finally assemble the matrix //------------------------------------------------------------------ ierr = HYPRE_IJMatrixAssemble(A11mat_); ierr += HYPRE_IJMatrixGetObject(A11mat_, (void **) &A11mat_csr); hypre_assert( !ierr ); hypre_MatvecCommPkgCreate((hypre_ParCSRMatrix *) A11mat_csr); ierr = HYPRE_IJMatrixAssemble(A12mat_); ierr += HYPRE_IJMatrixGetObject(A12mat_, (void **) &A12mat_csr); hypre_assert( !ierr ); hypre_MatvecCommPkgCreate((hypre_ParCSRMatrix *) A12mat_csr); if ( A22mat_ != NULL ) { ierr = HYPRE_IJMatrixAssemble(A22mat_); ierr += HYPRE_IJMatrixGetObject(A22mat_, (void **) &A22mat_csr); hypre_assert( !ierr ); hypre_MatvecCommPkgCreate((hypre_ParCSRMatrix *) A22mat_csr); } else A22mat_csr = NULL; if ( outputLevel_ >= 3 ) { sprintf( fname, "A11.%d", mypid); fp = fopen( fname, "w" ); for ( irow = A11StartRow; irow < A11StartRow+A11NRows; irow++ ) { HYPRE_ParCSRMatrixGetRow(A11mat_csr,irow,&rowSize,&inds,&vals); for ( j = 0; j < rowSize; j++ ) printf(" %9d %9d %25.16e\n", irow+1, inds[j]+1, vals[j]); HYPRE_ParCSRMatrixRestoreRow(A11mat_csr,irow,&rowSize,&inds,&vals); } fclose(fp); sprintf( fname, "A12.%d", mypid); fp = fopen( fname, "w" ); for ( irow = A12StartRow; irow < A12StartRow+A12NRows; irow++ ) { HYPRE_ParCSRMatrixGetRow(A12mat_csr,irow,&rowSize,&inds,&vals); for ( j = 0; j < rowSize; j++ ) printf(" %9d %9d %25.16e\n", irow+1, inds[j]+1, vals[j]); HYPRE_ParCSRMatrixRestoreRow(A12mat_csr,irow,&rowSize,&inds,&vals); } fclose(fp); if ( A22mat_csr != NULL ) { sprintf( fname, "A22.%d", mypid); fp = fopen( fname, "w" ); for ( irow = A22StartRow; irow < A22StartRow+A22NRows; irow++ ) { HYPRE_ParCSRMatrixGetRow(A22mat_csr,irow,&rowSize,&inds,&vals); for ( j = 0; j < rowSize; j++ ) printf(" %9d %9d %25.16e\n", irow+1, inds[j]+1, vals[j]); HYPRE_ParCSRMatrixRestoreRow(A22mat_csr,irow,&rowSize,&inds,&vals); } fclose(fp); } } return 0; } //****************************************************************************** // set up routine //------------------------------------------------------------------------------ int HYPRE_LSI_Schur::setup(HYPRE_IJMatrix Amat, HYPRE_IJVector sol, HYPRE_IJVector rhs, HYPRE_IJMatrix *rAmat, HYPRE_IJVector *rsol, HYPRE_IJVector *rrhs, HYPRE_IJVector *rres) { int j, irow, mypid, nprocs, rowSize, *colInd, one=1; int maxRowSize, *colInd2, newRowSize, count, *newColInd; int rowSize2, SNRows, SStartRow, *SRowLengs; int V2Leng, V2Start, ierr; double *colVal, *colVal2, *newColVal; HYPRE_IJVector X2vec, R2vec; HYPRE_IJMatrix Smat; HYPRE_ParCSRMatrix Amat_csr; HYPRE_ParCSRMatrix Cmat_csr, Mmat_csr, Smat_csr, A22mat_csr, RAP_csr; //------------------------------------------------------------------ // build the blocks A11, A12, and the A22 block, if any //------------------------------------------------------------------ if ( lookup_ == NULL ) { printf("HYPRE_LSI_Schur ERROR : need lookup object.\n"); exit(1); } if ( A11mat_ != NULL ) HYPRE_IJMatrixDestroy(A11mat_); if ( A12mat_ != NULL ) HYPRE_IJMatrixDestroy(A12mat_); if ( A22mat_ != NULL ) HYPRE_IJMatrixDestroy(A22mat_); if ( F1vec_ != NULL ) HYPRE_IJVectorDestroy(F1vec_); if ( APartition_ != NULL ) free( APartition_ ); if ( P22LocalInds_ != NULL ) delete [] P22LocalInds_; if ( P22GlobalInds_ != NULL ) delete [] P22GlobalInds_; if ( P22Offsets_ != NULL ) delete [] P22Offsets_; F1vec_ = NULL; P22LocalInds_ = NULL; P22GlobalInds_ = NULL; P22Offsets_ = NULL; assembled_ = 0; HYPRE_IJMatrixGetObject( Amat, (void**) &Amat_csr ); HYPRE_ParCSRMatrixGetRowPartitioning( Amat_csr, &APartition_ ); HYPRE_ParCSRMatrixGetComm( Amat_csr, &mpiComm_ ); ierr = computeBlockInfo(); if ( ierr ) return ierr; buildBlocks(Amat); MPI_Comm_rank(mpiComm_, &mypid); //------------------------------------------------------------------ // create Pressure Poisson matrix (T = C^T M^{-1} C) //------------------------------------------------------------------ if (outputLevel_ >= 1) printf("%4d : HYPRE_LSI_Schur setup : C^T M^{-1} C begins\n", mypid); HYPRE_IJMatrixGetObject(A11mat_, (void **) &Mmat_csr); HYPRE_IJMatrixGetObject(A12mat_, (void **) &Cmat_csr); hypre_MatvecCommPkgCreate((hypre_ParCSRMatrix *) Mmat_csr); hypre_BoomerAMGBuildCoarseOperator( (hypre_ParCSRMatrix *) Cmat_csr, (hypre_ParCSRMatrix *) Mmat_csr, (hypre_ParCSRMatrix *) Cmat_csr, (hypre_ParCSRMatrix **) &RAP_csr); if (outputLevel_ >= 1) printf("%4d : HYPRE_LSI_Schur setup : C^T M^{-1} C ends\n", mypid); //------------------------------------------------------------------ // construct new S = A22 - RAP (A22 may be null) //------------------------------------------------------------------ SNRows = P22Size_; SStartRow = P22Offsets_[mypid]; ierr = HYPRE_IJMatrixCreate(mpiComm_, SStartRow, SStartRow+SNRows-1, SStartRow, SStartRow+SNRows-1, &Smat); ierr += HYPRE_IJMatrixSetObjectType(Smat, HYPRE_PARCSR); hypre_assert(!ierr); if ( A22mat_ != NULL ) HYPRE_IJMatrixGetObject(A22mat_, (void **) &A22mat_csr); SRowLengs = new int[SNRows]; maxRowSize = 0; for ( irow = SStartRow; irow < SStartRow+SNRows; irow++ ) { HYPRE_ParCSRMatrixGetRow(RAP_csr,irow,&rowSize,&colInd,NULL); newRowSize = rowSize; if ( A22mat_csr != NULL ) { HYPRE_ParCSRMatrixGetRow(A22mat_csr,irow,&rowSize2,&colInd2,NULL); newRowSize += rowSize2; newColInd = new int[newRowSize]; for (j = 0; j < rowSize; j++) newColInd[j] = colInd[j]; for (j = 0; j < rowSize2; j++) newColInd[j+rowSize] = colInd2[j]; hypre_qsort0(newColInd, 0, newRowSize-1); count = 0; for ( j = 1; j < newRowSize; j++ ) { if ( newColInd[j] != newColInd[count] ) { count++; newColInd[count] = newColInd[j]; } } if ( newRowSize > 0 ) count++; newRowSize = count; HYPRE_ParCSRMatrixRestoreRow(A22mat_csr,irow,&rowSize2,&colInd2,NULL); delete [] newColInd; } SRowLengs[irow-SStartRow] = newRowSize; maxRowSize = ( newRowSize > maxRowSize ) ? newRowSize : maxRowSize; HYPRE_ParCSRMatrixRestoreRow(RAP_csr,irow,&rowSize,&colInd,NULL); } ierr = HYPRE_IJMatrixSetRowSizes(Smat, SRowLengs); ierr += HYPRE_IJMatrixInitialize(Smat); hypre_assert(!ierr); delete [] SRowLengs; for ( irow = SStartRow; irow < SStartRow+SNRows; irow++ ) { HYPRE_ParCSRMatrixGetRow(RAP_csr,irow,&rowSize,&colInd,&colVal); if ( A22mat_csr == NULL ) { newRowSize = rowSize; newColInd = new int[newRowSize]; newColVal = new double[newRowSize]; for (j = 0; j < rowSize; j++) { newColInd[j] = colInd[j]; newColVal[j] = - colVal[j]; } } else { HYPRE_ParCSRMatrixGetRow(A22mat_csr,irow,&rowSize2,&colInd2,&colVal2); newRowSize = rowSize + rowSize2; newColInd = new int[newRowSize]; newColVal = new double[newRowSize]; for (j = 0; j < rowSize; j++) { newColInd[j] = colInd[j]; newColVal[j] = - colVal[j]; } for (j = 0; j < rowSize2; j++) { newColInd[j+rowSize] = colInd2[j]; newColVal[j+rowSize] = colVal2[j]; } hypre_qsort1(newColInd, newColVal, 0, newRowSize-1); count = 0; for ( j = 1; j < newRowSize; j++ ) { if ( newColInd[j] != newColInd[count] ) { count++; newColInd[count] = newColInd[j]; newColVal[count] = newColVal[j]; } else newColVal[count] += newColVal[j]; } if ( newRowSize > 0 ) count++; newRowSize = count; HYPRE_ParCSRMatrixRestoreRow(A22mat_csr,irow,&rowSize2, &colInd2,&colVal2); } HYPRE_IJMatrixSetValues(Smat, 1, &newRowSize, (const int *) &irow, (const int *) newColInd, (const double *) newColVal); HYPRE_ParCSRMatrixRestoreRow(RAP_csr,irow,&rowSize,&colInd,&colVal); delete [] newColInd; delete [] newColVal; } HYPRE_IJMatrixAssemble(Smat); HYPRE_IJMatrixGetObject(Smat, (void **) &Smat_csr); (*rAmat) = Smat; Smat_ = Smat; assembled_ = 1; //------------------------------------------------------------------ // build new right hand side vectors //------------------------------------------------------------------ computeRHS(rhs, rrhs); Svec_ = (*rrhs); //------------------------------------------------------------------ // construct the new solution and residual vectors //------------------------------------------------------------------ V2Leng = P22Size_; V2Start = P22Offsets_[mypid]; HYPRE_IJVectorCreate(mpiComm_, V2Start, V2Start+V2Leng-1, &X2vec); HYPRE_IJVectorSetObjectType(X2vec, HYPRE_PARCSR); ierr = HYPRE_IJVectorInitialize(X2vec); ierr += HYPRE_IJVectorAssemble(X2vec); hypre_assert(!ierr); HYPRE_IJVectorCreate(mpiComm_, V2Start, V2Start+V2Leng-1, &R2vec); HYPRE_IJVectorSetObjectType(R2vec, HYPRE_PARCSR); ierr = HYPRE_IJVectorInitialize(R2vec); ierr += HYPRE_IJVectorAssemble(R2vec); hypre_assert(!ierr); (*rsol) = X2vec; (*rres) = R2vec; return 0; } //****************************************************************************** // set up rhs routine //------------------------------------------------------------------------------ int HYPRE_LSI_Schur::computeRHS(HYPRE_IJVector rhs, HYPRE_IJVector *rrhs) { int mypid, nprocs, AStart, AEnd, ANRows, V1Leng, V1Start; int V2Leng, V2Start, ierr, irow, f1Ind, f2Ind, searchInd; int rowSize, *colInd; double *colVal, ddata; HYPRE_ParVector F1_csr, F2_csr; HYPRE_IJVector F2vec, R2vec, X2vec; HYPRE_ParCSRMatrix A11_csr, C_csr; //------------------------------------------------------------------ // error checking //------------------------------------------------------------------ if ( assembled_ == 0 ) return 1; //------------------------------------------------------------------ // get machine and matrix information //------------------------------------------------------------------ MPI_Comm_rank( mpiComm_, &mypid ); MPI_Comm_size( mpiComm_, &nprocs ); AStart = APartition_[mypid]; AEnd = APartition_[mypid+1] - 1; ANRows = AEnd - AStart + 1; HYPRE_IJMatrixGetObject(A11mat_, (void**) &A11_csr); //------------------------------------------------------------------ // construct the reduced right hand side //------------------------------------------------------------------ V1Leng = ANRows - P22Size_; V1Start = AStart - P22Offsets_[mypid]; HYPRE_IJVectorCreate(mpiComm_, V1Start, V1Start+V1Leng-1, &F1vec_); HYPRE_IJVectorSetObjectType(F1vec_, HYPRE_PARCSR); ierr += HYPRE_IJVectorInitialize(F1vec_); ierr += HYPRE_IJVectorAssemble(F1vec_); hypre_assert(!ierr); V2Leng = P22Size_; V2Start = P22Offsets_[mypid]; HYPRE_IJVectorCreate(mpiComm_, V2Start, V2Start+V2Leng-1, &F2vec); HYPRE_IJVectorSetObjectType(F2vec, HYPRE_PARCSR); ierr += HYPRE_IJVectorInitialize(F2vec); ierr += HYPRE_IJVectorAssemble(F2vec); hypre_assert(!ierr); f1Ind = V1Start; f2Ind = V2Start; for ( irow = AStart; irow <= AEnd; irow++ ) { searchInd = hypre_BinarySearch(P22LocalInds_, irow, P22Size_); HYPRE_IJVectorGetValues(rhs, 1, &irow, &ddata); if ( searchInd < 0 ) { HYPRE_ParCSRMatrixGetRow(A11_csr,f1Ind,&rowSize,&colInd,&colVal); ddata *= colVal[0]; ierr = HYPRE_IJVectorSetValues(F1vec_, 1, (const int *) &f1Ind, (const double *) &ddata); HYPRE_ParCSRMatrixRestoreRow(A11_csr,f1Ind,&rowSize,&colInd,&colVal); hypre_assert( !ierr ); f1Ind++; } else { ierr = HYPRE_IJVectorSetValues(F2vec, 1, (const int *) &f2Ind, (const double *) &ddata); hypre_assert( !ierr ); f2Ind++; } } HYPRE_IJVectorGetObject(F1vec_, (void**) F1_csr); HYPRE_IJVectorGetObject(F2vec, (void**) F2_csr); HYPRE_IJMatrixGetObject(A12mat_, (void**) C_csr); HYPRE_ParCSRMatrixMatvecT( -1.0, C_csr, F1_csr, 1.0, F2_csr ); (*rrhs) = F2vec; return 0; } //****************************************************************************** // compute the long solution //------------------------------------------------------------------------------ int HYPRE_LSI_Schur::computeSol(HYPRE_IJVector X2vec, HYPRE_IJVector Xvec) { int AStart, ANRows, AEnd, irow, searchInd, ierr; int mypid, nprocs, V1Leng, V1Start, V1Cnt, V2Cnt; double *xvals; HYPRE_IJVector X1vec; HYPRE_ParVector X1_csr, X2_csr, F1_csr; HYPRE_ParCSRMatrix C_csr, M_csr; //------------------------------------------------------------------ // check for errors //------------------------------------------------------------------ if ( assembled_ != 1 ) return 1; //------------------------------------------------------------------ // extract matrix and machine information //------------------------------------------------------------------ MPI_Comm_rank( mpiComm_, &mypid ); MPI_Comm_size( mpiComm_, &nprocs ); AStart = APartition_[mypid]; AEnd = APartition_[mypid+1]; ANRows = AEnd - AStart; HYPRE_IJVectorGetObject(X2vec, (void**) X2_csr); HYPRE_IJVectorGetObject(F1vec_, (void**) F1_csr); HYPRE_IJMatrixGetObject(A12mat_, (void**) C_csr); HYPRE_IJMatrixGetObject(A11mat_, (void**) M_csr); //------------------------------------------------------------------ // construct temporary vector //------------------------------------------------------------------ V1Leng = ANRows - P22Size_; V1Start = AStart - P22Offsets_[mypid]; HYPRE_IJVectorCreate(mpiComm_, V1Start, V1Start+V1Leng-1, &X1vec); HYPRE_IJVectorSetObjectType(X1vec, HYPRE_PARCSR); ierr += HYPRE_IJVectorInitialize(X1vec); ierr += HYPRE_IJVectorAssemble(X1vec); hypre_assert(!ierr); //------------------------------------------------------------------ // recover X1 //------------------------------------------------------------------ HYPRE_ParCSRMatrixMatvec( -1.0, C_csr, X2_csr, 1.0, F1_csr ); HYPRE_ParCSRMatrixMatvec( 1.0, M_csr, F1_csr, 0.0, X1_csr ); //------------------------------------------------------------------ // merge X1 and X2 to the unreduced solution vector //------------------------------------------------------------------ V1Cnt = AStart - P22Offsets_[mypid]; V2Cnt = P22Offsets_[mypid]; xvals = hypre_VectorData(hypre_ParVectorLocalVector((hypre_ParVector*)Xvec)); for ( irow = AStart; irow < AEnd; irow++ ) { searchInd = hypre_BinarySearch( P22LocalInds_, irow, P22Size_); if ( searchInd >= 0 ) { ierr = HYPRE_IJVectorGetValues(X2vec, 1, &V2Cnt, &xvals[irow-AStart]); hypre_assert( !ierr ); V2Cnt++; } else { ierr = HYPRE_IJVectorGetValues(X1vec, 1, &V1Cnt, &xvals[irow-AStart]); hypre_assert( !ierr ); V1Cnt++; } } //------------------------------------------------------------------ // clean up and return //------------------------------------------------------------------ HYPRE_IJVectorDestroy(X1vec); return 0; } //****************************************************************************** // print the matrix and right hand side //------------------------------------------------------------------------------ int HYPRE_LSI_Schur::print() { int mypid, irow, j, nnz, V2Leng, V2Start, rowSize, *colInd; double *colVal, ddata; FILE *fp; char fname[100]; HYPRE_ParCSRMatrix S_csr; if ( ! assembled_ ) return 1; MPI_Comm_rank( mpiComm_, &mypid ); sprintf(fname, "hypre_mat.out.%d", mypid); fp = fopen( fname, "w"); nnz = 0; V2Leng = P22Size_; V2Start = P22Offsets_[mypid]; HYPRE_IJMatrixGetObject( Smat_, (void**) S_csr ); for ( irow = V2Start; irow < V2Start+V2Leng; irow++ ) { HYPRE_ParCSRMatrixGetRow(S_csr,irow,&rowSize,&colInd,&colVal); for ( j = 0; j < rowSize; j++ ) if ( colVal[j] != 0.0 ) nnz++; HYPRE_ParCSRMatrixRestoreRow(S_csr,irow,&rowSize,&colInd,&colVal); } fprintf(fp, "%6d %7d \n", V2Leng, nnz); for ( irow = V2Start; irow < V2Start+V2Leng; irow++ ) { HYPRE_ParCSRMatrixGetRow(S_csr,irow,&rowSize,&colInd,&colVal); for ( j = 0; j < rowSize; j++ ) { if ( colVal[j] != 0.0 ) fprintf(fp, "%6d %6d %25.16e \n",irow+1,colInd[j]+1,colVal[j]); } HYPRE_ParCSRMatrixRestoreRow(S_csr,irow,&rowSize,&colInd,&colVal); } fclose(fp); sprintf(fname, "hypre_rhs.out.%d", mypid); fp = fopen( fname, "w"); fprintf(fp, "%6d \n", V2Leng); for ( irow = V2Start; irow < V2Start+V2Leng; irow++ ) { HYPRE_IJVectorGetValues(Svec_, 1, &irow, &ddata); fprintf(fp, "%6d %25.16e \n", irow+1, ddata); } fclose(fp); MPI_Barrier(mpiComm_); return 0; } hypre-2.33.0/src/FEI_mv/fei-hypre/HYPRE_LSI_schur.h000066400000000000000000000055731477326011500215050ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ // ************************************************************************* // This is the HYPRE implementation of Schur reduction // ************************************************************************* #ifndef __HYPRE_LSI_SCHURH__ #define __HYPRE_LSI_SCHURH__ // ************************************************************************* // system libraries used // ------------------------------------------------------------------------- #include #include #include #include #include "HYPRE.h" #include "IJ_mv/HYPRE_IJ_mv.h" // ************************************************************************* // local defines // ------------------------------------------------------------------------- #include "HYPRE_FEI_includes.h" // ************************************************************************* // class definition // ------------------------------------------------------------------------- class HYPRE_LSI_Schur { HYPRE_IJMatrix A11mat_; // mass matrix (should be diagonal) HYPRE_IJMatrix A12mat_; // gradient (divergence) matrix HYPRE_IJMatrix A22mat_; // stabilization matrix HYPRE_IJVector F1vec_; // rhs for block(1,1) HYPRE_IJMatrix Smat_; // Schur complement matrix HYPRE_IJVector Svec_; // reduced RHS int *APartition_; // processor partition of matrix A int P22Size_; // number of pressure variables int P22GSize_; // global number of pressure variables int *P22LocalInds_; // pressure local row indices (global) int *P22GlobalInds_; // pressure off-processor row indices int *P22Offsets_; // processor partiton of matrix A22 int assembled_; // set up complete flag int outputLevel_; // for diagnostics Lookup *lookup_; // FEI lookup object MPI_Comm mpiComm_; public: HYPRE_LSI_Schur(); virtual ~HYPRE_LSI_Schur(); int setLookup( Lookup *lookup ); int setup(HYPRE_IJMatrix Amat, HYPRE_IJVector sol, HYPRE_IJVector rhs, HYPRE_IJMatrix *redA, HYPRE_IJVector *rsol, HYPRE_IJVector *rrhs, HYPRE_IJVector *rres); int computeRHS(HYPRE_IJVector rhs, HYPRE_IJVector *rrhs); int computeSol(HYPRE_IJVector rsol, HYPRE_IJVector sol); int print(); private: int computeBlockInfo(); int buildBlocks(HYPRE_IJMatrix Amat); }; #endif hypre-2.33.0/src/FEI_mv/fei-hypre/HYPRE_LSI_schwarz.c000066400000000000000000001123351477326011500220300ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * HYPRE_Schwarz interface * *****************************************************************************/ #include #include #include #include "utilities/_hypre_utilities.h" #include "HYPRE.h" #include "IJ_mv/HYPRE_IJ_mv.h" #include "parcsr_mv/HYPRE_parcsr_mv.h" #include "parcsr_mv/_hypre_parcsr_mv.h" #include "parcsr_ls/HYPRE_parcsr_ls.h" #include "HYPRE_MHMatrix.h" #ifdef HAVE_ML #include "ml_struct.h" #include "ml_aggregate.h" #endif #include "HYPRE_MHMatrix.h" #include "HYPRE_FEI.h" typedef struct HYPRE_LSI_Schwarz_Struct { MPI_Comm comm; MH_Matrix *mh_mat; int Nrows; int extNrows; int ntimes; double fillin; double threshold; int output_level; int **bmat_ia; int **bmat_ja; double **bmat_aa; int **aux_bmat_ia; int **aux_bmat_ja; double **aux_bmat_aa; int nblocks; int block_size; int *blk_sizes; int **blk_indices; } HYPRE_LSI_Schwarz; extern int HYPRE_LSI_MLConstructMHMatrix(HYPRE_ParCSRMatrix,MH_Matrix *, MPI_Comm, int *, MH_Context *); extern int HYPRE_LSI_SchwarzDecompose(HYPRE_LSI_Schwarz *sch_ptr, MH_Matrix *Amat, int total_recv_leng, int *recv_lengths, int *ext_ja, double *ext_aa, int *map, int *map2, int Noffset); extern int HYPRE_LSI_ILUTDecompose(HYPRE_LSI_Schwarz *sch_ptr); extern void hypre_qsort0(int *, int, int); extern int HYPRE_LSI_SplitDSort(double*,int,int*,int); extern int MH_ExchBdry(double *, void *); extern int HYPRE_LSI_Search(int *, int, int); #define habs(x) ((x) > 0 ? (x) : -(x)) /*-------------------------------------------------------------------------- * HYPRE_LSI_SchwarzCreate - Return a Schwarz preconditioner object "solver" *-------------------------------------------------------------------------*/ int HYPRE_LSI_SchwarzCreate( MPI_Comm comm, HYPRE_Solver *solver ) { HYPRE_LSI_Schwarz *sch_ptr; sch_ptr = hypre_TAlloc(HYPRE_LSI_Schwarz, 1, HYPRE_MEMORY_HOST); if (sch_ptr == NULL) return 1; sch_ptr->comm = comm; sch_ptr->mh_mat = NULL; sch_ptr->bmat_ia = NULL; sch_ptr->bmat_ja = NULL; sch_ptr->bmat_aa = NULL; sch_ptr->aux_bmat_ia = NULL; sch_ptr->aux_bmat_ja = NULL; sch_ptr->aux_bmat_aa = NULL; sch_ptr->fillin = 0.0; sch_ptr->threshold = 1.0e-16; sch_ptr->Nrows = 0; sch_ptr->extNrows = 0; sch_ptr->nblocks = 1; sch_ptr->blk_sizes = NULL; sch_ptr->block_size = 1000; sch_ptr->blk_indices = NULL; sch_ptr->ntimes = 1; sch_ptr->output_level = 0; *solver = (HYPRE_Solver) sch_ptr; return 0; } /*-------------------------------------------------------------------------- * HYPRE_LSI_SchwarzDestroy - Destroy a Schwarz object. *-------------------------------------------------------------------------*/ int HYPRE_LSI_SchwarzDestroy( HYPRE_Solver solver ) { int i; HYPRE_LSI_Schwarz *sch_ptr; sch_ptr = (HYPRE_LSI_Schwarz *) solver; if ( sch_ptr->bmat_ia != NULL ) { for ( i = 0; i < sch_ptr->nblocks; i++ ) hypre_TFree(sch_ptr->bmat_ia[i], HYPRE_MEMORY_HOST); hypre_TFree(sch_ptr->bmat_ia, HYPRE_MEMORY_HOST); } if ( sch_ptr->bmat_ja != NULL ) { for ( i = 0; i < sch_ptr->nblocks; i++ ) hypre_TFree(sch_ptr->bmat_ja[i], HYPRE_MEMORY_HOST); hypre_TFree(sch_ptr->bmat_ja, HYPRE_MEMORY_HOST); } if ( sch_ptr->bmat_aa != NULL ) { for ( i = 0; i < sch_ptr->nblocks; i++ ) hypre_TFree(sch_ptr->bmat_aa[i], HYPRE_MEMORY_HOST); hypre_TFree(sch_ptr->bmat_aa, HYPRE_MEMORY_HOST); } if ( sch_ptr->aux_bmat_ia != NULL ) { for ( i = 0; i < sch_ptr->nblocks; i++ ) hypre_TFree(sch_ptr->aux_bmat_ia[i], HYPRE_MEMORY_HOST); hypre_TFree(sch_ptr->aux_bmat_ia, HYPRE_MEMORY_HOST); } if ( sch_ptr->aux_bmat_ja != NULL ) { for ( i = 0; i < sch_ptr->nblocks; i++ ) hypre_TFree(sch_ptr->aux_bmat_ja[i], HYPRE_MEMORY_HOST); hypre_TFree(sch_ptr->aux_bmat_ja, HYPRE_MEMORY_HOST); } if ( sch_ptr->aux_bmat_aa != NULL ) { for ( i = 0; i < sch_ptr->nblocks; i++ ) hypre_TFree(sch_ptr->aux_bmat_aa[i], HYPRE_MEMORY_HOST); hypre_TFree(sch_ptr->aux_bmat_aa, HYPRE_MEMORY_HOST); } if ( sch_ptr->blk_sizes != NULL ) hypre_TFree(sch_ptr->blk_sizes, HYPRE_MEMORY_HOST); if ( sch_ptr->blk_indices != NULL ) { for ( i = 0; i < sch_ptr->nblocks; i++ ) if ( sch_ptr->blk_indices[i] != NULL ) hypre_TFree(sch_ptr->blk_indices[i], HYPRE_MEMORY_HOST); } if ( sch_ptr->mh_mat != NULL ) { hypre_TFree(sch_ptr->mh_mat->sendProc, HYPRE_MEMORY_HOST); hypre_TFree(sch_ptr->mh_mat->sendLeng, HYPRE_MEMORY_HOST); hypre_TFree(sch_ptr->mh_mat->recvProc, HYPRE_MEMORY_HOST); hypre_TFree(sch_ptr->mh_mat->recvLeng, HYPRE_MEMORY_HOST); for ( i = 0; i < sch_ptr->mh_mat->sendProcCnt; i++ ) hypre_TFree(sch_ptr->mh_mat->sendList[i], HYPRE_MEMORY_HOST); hypre_TFree(sch_ptr->mh_mat->sendList, HYPRE_MEMORY_HOST); hypre_TFree(sch_ptr->mh_mat, HYPRE_MEMORY_HOST); } sch_ptr->mh_mat = NULL; hypre_TFree(sch_ptr, HYPRE_MEMORY_HOST); return 0; } /*-------------------------------------------------------------------------- * HYPRE_LSI_SchwarzSetOutputLevel - Set debug level *-------------------------------------------------------------------------*/ int HYPRE_LSI_SchwarzSetOutputLevel(HYPRE_Solver solver, int level) { HYPRE_LSI_Schwarz *sch_ptr = (HYPRE_LSI_Schwarz *) solver; sch_ptr->output_level = level; return 0; } /*-------------------------------------------------------------------------- * HYPRE_LSI_SchwarzSetBlockSize - Set block size *-------------------------------------------------------------------------*/ int HYPRE_LSI_SchwarzSetNBlocks(HYPRE_Solver solver, int nblks) { HYPRE_LSI_Schwarz *sch_ptr = (HYPRE_LSI_Schwarz *) solver; sch_ptr->nblocks = nblks; return 0; } /*-------------------------------------------------------------------------- * HYPRE_LSI_SchwarzSetBlockSize - Set block size *-------------------------------------------------------------------------*/ int HYPRE_LSI_SchwarzSetBlockSize(HYPRE_Solver solver, int blksize) { HYPRE_LSI_Schwarz *sch_ptr = (HYPRE_LSI_Schwarz *) solver; sch_ptr->block_size = blksize; return 0; } /*-------------------------------------------------------------------------- * HYPRE_LSI_SchwarzSetILUTFillin - Set fillin for block solve *-------------------------------------------------------------------------*/ int HYPRE_LSI_SchwarzSetILUTFillin(HYPRE_Solver solver, double fillin) { HYPRE_LSI_Schwarz *sch_ptr = (HYPRE_LSI_Schwarz *) solver; sch_ptr->fillin = fillin; return 0; } /*-------------------------------------------------------------------------- * HYPRE_LSI_SchwarzSolve - Solve function for Schwarz. *-------------------------------------------------------------------------*/ int HYPRE_LSI_SchwarzSolve( HYPRE_Solver solver, HYPRE_ParCSRMatrix Amat, HYPRE_ParVector b, HYPRE_ParVector x ) { int i, j, cnt, blk, index, max_blk_size, nrows; int ntimes, Nrows, extNrows, nblocks, *indptr, column; int *aux_mat_ia, *aux_mat_ja, *mat_ia, *mat_ja, *idiag; double *dbuffer, *aux_mat_aa, *solbuf, *xbuffer; double *rhs, *soln, *mat_aa, ddata; MH_Context *context; HYPRE_LSI_Schwarz *sch_ptr = (HYPRE_LSI_Schwarz *) solver; /* --------------------------------------------------------- * fetch vectors * ---------------------------------------------------------*/ rhs = hypre_VectorData(hypre_ParVectorLocalVector((hypre_ParVector*) b)); soln = hypre_VectorData(hypre_ParVectorLocalVector((hypre_ParVector*) x)); /* --------------------------------------------------------- * fetch vectors * ---------------------------------------------------------*/ ntimes = sch_ptr->ntimes; Nrows = sch_ptr->Nrows; extNrows = sch_ptr->extNrows; nblocks = sch_ptr->nblocks; max_blk_size = 0; for ( i = 0; i < nblocks; i++ ) if (sch_ptr->blk_sizes[i] > max_blk_size) max_blk_size = sch_ptr->blk_sizes[i]; /* --------------------------------------------------------- * initialize memory for interprocessor communication * ---------------------------------------------------------*/ dbuffer = hypre_TAlloc(double, extNrows , HYPRE_MEMORY_HOST); for ( i = 0; i < Nrows; i++ ) dbuffer[i] = rhs[i]; for ( i = 0; i < Nrows; i++ ) soln[i] = 0.0; context = hypre_TAlloc(MH_Context, 1, HYPRE_MEMORY_HOST); context->comm = sch_ptr->comm; context->Amat = sch_ptr->mh_mat; /* --------------------------------------------------------- * communicate the rhs and put into dbuffer * ---------------------------------------------------------*/ if ( extNrows > Nrows ) MH_ExchBdry(dbuffer, context); solbuf = hypre_TAlloc(double, max_blk_size , HYPRE_MEMORY_HOST); idiag = hypre_TAlloc(int, max_blk_size , HYPRE_MEMORY_HOST); xbuffer = hypre_TAlloc(double, extNrows , HYPRE_MEMORY_HOST); for ( i = Nrows; i < extNrows; i++ ) xbuffer[i] = 0.0; /* --------------------------------------------------------- * the first pass * ---------------------------------------------------------*/ for ( blk = 0; blk < nblocks; blk++ ) { nrows = sch_ptr->blk_sizes[blk]; if ( sch_ptr->blk_indices != NULL ) { indptr = sch_ptr->blk_indices[blk]; for ( i = 0; i < nrows; i++ ) solbuf[i] = dbuffer[indptr[i]]; } else { for ( i = 0; i < nrows; i++ ) solbuf[i] = dbuffer[i]; } mat_ia = sch_ptr->bmat_ia[blk]; mat_ja = sch_ptr->bmat_ja[blk]; mat_aa = sch_ptr->bmat_aa[blk]; if ( nblocks > 1 ) { aux_mat_ia = sch_ptr->aux_bmat_ia[blk]; aux_mat_ja = sch_ptr->aux_bmat_ja[blk]; aux_mat_aa = sch_ptr->aux_bmat_aa[blk]; } if ( nblocks > 1 ) { for ( i = 0; i < nrows; i++ ) { ddata = solbuf[i]; for ( j = aux_mat_ia[i]; j < aux_mat_ia[i+1]; j++ ) { index = aux_mat_ja[j]; if (index= 0; i-- ) { ddata = 0.0; for ( j = idiag[i]+1; j < mat_ia[i+1]; j++ ) { column = mat_ja[j]; ddata += mat_aa[j] * solbuf[column]; } solbuf[i] -= ddata; solbuf[i] /= mat_aa[idiag[i]]; } if ( nblocks > 1 ) { for ( i = 0; i < nrows; i++ ) { if ( indptr[i] < Nrows ) soln[indptr[i]] = solbuf[i]; else xbuffer[indptr[i]] = solbuf[i]; } } else { for ( i = 0; i < nrows; i++ ) { if ( i < Nrows ) soln[i] = solbuf[i]; else xbuffer[i] = solbuf[i]; } } } for ( cnt = 1; cnt < ntimes; cnt++ ) { for ( i = 0; i < Nrows; i++ ) xbuffer[i] = soln[i]; if ( extNrows > Nrows ) MH_ExchBdry(xbuffer, context); for ( blk = 0; blk < nblocks; blk++ ) { nrows = sch_ptr->blk_sizes[blk]; mat_ia = sch_ptr->bmat_ia[blk]; mat_ja = sch_ptr->bmat_ja[blk]; mat_aa = sch_ptr->bmat_aa[blk]; if ( nblocks > 1 ) { indptr = sch_ptr->blk_indices[blk]; aux_mat_ia = sch_ptr->aux_bmat_ia[blk]; aux_mat_ja = sch_ptr->aux_bmat_ja[blk]; aux_mat_aa = sch_ptr->aux_bmat_aa[blk]; for ( i = 0; i < nrows; i++ ) { ddata = dbuffer[indptr[i]]; for ( j = aux_mat_ia[i]; j < aux_mat_ia[i+1]; j++ ) { index = aux_mat_ja[j]; if (index= 0; i-- ) { ddata = 0.0; for ( j = idiag[i]+1; j < mat_ia[i+1]; j++ ) { column = mat_ja[j]; ddata += mat_aa[j] * solbuf[column]; } solbuf[i] -= ddata; solbuf[i] /= mat_aa[idiag[i]]; } if ( nblocks > 1 ) { for ( i = 0; i < nrows; i++ ) if ( indptr[i] < Nrows ) soln[indptr[i]] = solbuf[i]; else xbuffer[indptr[i]] = solbuf[i]; } else { for ( i = 0; i < nrows; i++ ) if ( i < Nrows ) soln[i] = solbuf[i]; else xbuffer[i] = solbuf[i]; } } } /* --------------------------------------------------------- */ /* clean up */ /* --------------------------------------------------------- */ hypre_TFree(xbuffer, HYPRE_MEMORY_HOST); hypre_TFree(idiag, HYPRE_MEMORY_HOST); hypre_TFree(solbuf, HYPRE_MEMORY_HOST); hypre_TFree(dbuffer, HYPRE_MEMORY_HOST); hypre_TFree(context, HYPRE_MEMORY_HOST); return 0; } /*-------------------------------------------------------------------------- * HYPRE_LSI_SchwarzSetup - Set up function for LSI_Schwarz. *-------------------------------------------------------------------------*/ int HYPRE_LSI_SchwarzSetup(HYPRE_Solver solver, HYPRE_ParCSRMatrix A_csr, HYPRE_ParVector b, HYPRE_ParVector x ) { int i, offset, total_recv_leng, *recv_lengths=NULL; int *int_buf=NULL, mypid, nprocs, overlap_flag=1,*parray; int *map=NULL, *map2=NULL, *row_partition=NULL,*parray2; double *dble_buf=NULL; MH_Context *context=NULL; MH_Matrix *mh_mat=NULL; MPI_Comm comm; HYPRE_LSI_Schwarz *sch_ptr = (HYPRE_LSI_Schwarz *) solver; /* --------------------------------------------------------- */ /* get the row information in my processors */ /* --------------------------------------------------------- */ comm = sch_ptr->comm; MPI_Comm_rank(comm, &mypid); MPI_Comm_size(comm, &nprocs); HYPRE_ParCSRMatrixGetRowPartitioning(A_csr, &row_partition); /* --------------------------------------------------------- */ /* convert the incoming CSR matrix into a MH matrix */ /* --------------------------------------------------------- */ context = hypre_TAlloc(MH_Context, 1, HYPRE_MEMORY_HOST); context->comm = comm; context->globalEqns = row_partition[nprocs]; context->partition = hypre_TAlloc(int, (nprocs+1), HYPRE_MEMORY_HOST); for (i=0; i<=nprocs; i++) context->partition[i] = row_partition[i]; hypre_TFree( row_partition , HYPRE_MEMORY_HOST); mh_mat = hypre_TAlloc( MH_Matrix, 1, HYPRE_MEMORY_HOST); context->Amat = mh_mat; HYPRE_LSI_MLConstructMHMatrix(A_csr, mh_mat, comm, context->partition,context); sch_ptr->Nrows = mh_mat->Nrows; sch_ptr->mh_mat = mh_mat; /* --------------------------------------------------------- */ /* compose the enlarged overlapped local matrix */ /* --------------------------------------------------------- */ if ( overlap_flag ) { HYPRE_LSI_DDIlutComposeOverlappedMatrix(mh_mat, &total_recv_leng, &recv_lengths, &int_buf, &dble_buf, &map, &map2,&offset,comm); } else { total_recv_leng = 0; recv_lengths = NULL; int_buf = NULL; dble_buf = NULL; map = NULL; map2 = NULL; parray = hypre_TAlloc(int, nprocs , HYPRE_MEMORY_HOST); parray2 = hypre_TAlloc(int, nprocs , HYPRE_MEMORY_HOST); for ( i = 0; i < nprocs; i++ ) parray2[i] = 0; parray2[mypid] = mh_mat->Nrows; MPI_Allreduce(parray2,parray,nprocs,MPI_INT,MPI_SUM,MPI_COMM_WORLD); offset = 0; for (i = 0; i < mypid; i++) offset += parray[i]; hypre_TFree(parray, HYPRE_MEMORY_HOST); hypre_TFree(parray2, HYPRE_MEMORY_HOST); } /* --------------------------------------------------------- */ /* perform decomposition on local matrix */ /* --------------------------------------------------------- */ HYPRE_LSI_SchwarzDecompose(sch_ptr,mh_mat,total_recv_leng,recv_lengths, int_buf, dble_buf, map, map2, offset); /* --------------------------------------------------------- */ /* clean up */ /* --------------------------------------------------------- */ hypre_TFree(map, HYPRE_MEMORY_HOST); hypre_TFree(map2, HYPRE_MEMORY_HOST); hypre_TFree(int_buf, HYPRE_MEMORY_HOST); hypre_TFree(dble_buf, HYPRE_MEMORY_HOST); hypre_TFree(recv_lengths, HYPRE_MEMORY_HOST); hypre_TFree(context->partition, HYPRE_MEMORY_HOST); hypre_TFree(context, HYPRE_MEMORY_HOST); hypre_TFree(mh_mat->rowptr, HYPRE_MEMORY_HOST); hypre_TFree(mh_mat->colnum, HYPRE_MEMORY_HOST); hypre_TFree(mh_mat->values, HYPRE_MEMORY_HOST); hypre_TFree(mh_mat->map, HYPRE_MEMORY_HOST); return 0; } /**************************************************************************/ /* function for doing Schwarz decomposition */ /**************************************************************************/ int HYPRE_LSI_SchwarzDecompose(HYPRE_LSI_Schwarz *sch_ptr,MH_Matrix *Amat, int total_recv_leng, int *recv_lengths, int *ext_ja, double *ext_aa, int *map, int *map2, int Noffset) { int i, j, k, nnz, *mat_ia, *mat_ja; int **bmat_ia, **bmat_ja; int mypid, *blk_size, index, **blk_indices, **aux_bmat_ia; int ncnt, rownum, offset, Nrows, extNrows, **aux_bmat_ja; int *tmp_blk_leng, *cols, rowleng; int nblocks, col_ind, init_size, aux_nnz, max_blk_size; int *tmp_indices, cur_off_row, length; double *mat_aa, *vals, **aux_bmat_aa, **bmat_aa; /* --------------------------------------------------------- */ /* fetch Schwarz parameters */ /* --------------------------------------------------------- */ MPI_Comm_rank(sch_ptr->comm, &mypid); Nrows = sch_ptr->Nrows; extNrows = Nrows + total_recv_leng; sch_ptr->Nrows = Nrows; sch_ptr->extNrows = extNrows; /* --------------------------------------------------------- */ /* adjust the off-processor row data */ /* --------------------------------------------------------- */ offset = 0; for ( i = 0; i < total_recv_leng; i++ ) { for ( j = offset; j < offset+recv_lengths[i]; j++ ) { index = ext_ja[j]; if ( index >= Noffset && index < Noffset+Nrows ) ext_ja[j] = index - Noffset; else { col_ind = HYPRE_LSI_Search(map, index, extNrows-Nrows); if ( col_ind >= 0 ) ext_ja[j] = map2[col_ind] + Nrows; else ext_ja[j] = -1; } } offset += recv_lengths[i]; } /* --------------------------------------------------------- */ /* compose the initial blk_size information */ /* and extend the each block for the overlap */ /* (at the end blk_indices and bli_size contains the info) */ /* --------------------------------------------------------- */ if ( sch_ptr->nblocks == 1 ) { nblocks = 1; max_blk_size = extNrows; sch_ptr->blk_sizes = hypre_TAlloc(int, nblocks , HYPRE_MEMORY_HOST); blk_size = sch_ptr->blk_sizes; blk_size[0] = extNrows; } else { if ( sch_ptr->nblocks != 0 ) { nblocks = sch_ptr->nblocks; sch_ptr->block_size = (Nrows + nblocks / 2) / nblocks; } else { nblocks = (Nrows - sch_ptr->block_size / 2) / sch_ptr->block_size + 1; sch_ptr->nblocks = nblocks; } sch_ptr->blk_indices = hypre_TAlloc(int*, nblocks , HYPRE_MEMORY_HOST); sch_ptr->blk_sizes = hypre_TAlloc(int, nblocks , HYPRE_MEMORY_HOST); blk_indices = sch_ptr->blk_indices; blk_size = sch_ptr->blk_sizes; tmp_blk_leng = hypre_TAlloc(int, nblocks , HYPRE_MEMORY_HOST); for ( i = 0; i < nblocks-1; i++ ) blk_size[i] = sch_ptr->block_size; blk_size[nblocks-1] = Nrows - sch_ptr->block_size * (nblocks - 1 ); for ( i = 0; i < nblocks; i++ ) { tmp_blk_leng[i] = 5 * blk_size[i] + 5; blk_indices[i] = hypre_TAlloc(int, tmp_blk_leng[i] , HYPRE_MEMORY_HOST); for (j = 0; j < blk_size[i]; j++) blk_indices[i][j] = sch_ptr->block_size * i + j; } max_blk_size = 0; for ( i = 0; i < nblocks; i++ ) { init_size = blk_size[i]; for ( j = 0; j < init_size; j++ ) { rownum = blk_indices[i][j]; cols = &(Amat->colnum[Amat->rowptr[rownum]]); vals = &(Amat->values[Amat->rowptr[rownum]]); rowleng = Amat->rowptr[rownum+1] - Amat->rowptr[rownum]; if ( blk_size[i] + rowleng > tmp_blk_leng[i] ) { tmp_indices = blk_indices[i]; tmp_blk_leng[i] = 2 * ( blk_size[i] + rowleng ) + 2; blk_indices[i] = hypre_TAlloc(int, tmp_blk_leng[i] , HYPRE_MEMORY_HOST); for (k = 0; k < blk_size[i]; k++) blk_indices[i][k] = tmp_indices[k]; hypre_TFree(tmp_indices, HYPRE_MEMORY_HOST); } for ( k = 0; k < rowleng; k++ ) { col_ind = cols[k]; blk_indices[i][blk_size[i]++] = col_ind; } } hypre_qsort0(blk_indices[i], 0, blk_size[i]-1); ncnt = 0; for ( j = 1; j < blk_size[i]; j++ ) if ( blk_indices[i][j] != blk_indices[i][ncnt] ) blk_indices[i][++ncnt] = blk_indices[i][j]; blk_size[i] = ncnt + 1; if ( blk_size[i] > max_blk_size ) max_blk_size = blk_size[i]; } hypre_TFree(tmp_blk_leng, HYPRE_MEMORY_HOST); } /* --------------------------------------------------------- */ /* compute the memory requirements for each block */ /* --------------------------------------------------------- */ sch_ptr->bmat_ia = hypre_TAlloc(int*, nblocks , HYPRE_MEMORY_HOST); sch_ptr->bmat_ja = hypre_TAlloc(int*, nblocks , HYPRE_MEMORY_HOST); sch_ptr->bmat_aa = hypre_TAlloc(double*, nblocks , HYPRE_MEMORY_HOST); bmat_ia = sch_ptr->bmat_ia; bmat_ja = sch_ptr->bmat_ja; bmat_aa = sch_ptr->bmat_aa; if ( nblocks != 1 ) { sch_ptr->aux_bmat_ia = hypre_TAlloc(int*, nblocks , HYPRE_MEMORY_HOST); sch_ptr->aux_bmat_ja = hypre_TAlloc(int*, nblocks , HYPRE_MEMORY_HOST); sch_ptr->aux_bmat_aa = hypre_TAlloc(double*, nblocks , HYPRE_MEMORY_HOST); aux_bmat_ia = sch_ptr->aux_bmat_ia; aux_bmat_ja = sch_ptr->aux_bmat_ja; aux_bmat_aa = sch_ptr->aux_bmat_aa; } else { aux_bmat_ia = NULL; aux_bmat_ja = NULL; aux_bmat_aa = NULL; } /* --------------------------------------------------------- */ /* compose each block into sch_ptr */ /* --------------------------------------------------------- */ cols = hypre_TAlloc(int, max_blk_size , HYPRE_MEMORY_HOST); vals = hypre_TAlloc(double, max_blk_size , HYPRE_MEMORY_HOST); for ( i = 0; i < nblocks; i++ ) { nnz = aux_nnz = offset = cur_off_row = 0; if ( nblocks > 1 ) length = blk_size[i]; else length = extNrows; for ( j = 0; j < length; j++ ) { if ( nblocks > 1 ) rownum = blk_indices[i][j]; else rownum = j; if ( rownum < Nrows ) { rowleng = 0; for ( k = Amat->rowptr[rownum]; k < Amat->rowptr[rownum+1]; k++ ) cols[rowleng++] = Amat->colnum[k]; } else { for ( k = cur_off_row; k < rownum-Nrows; k++ ) offset += recv_lengths[k]; cur_off_row = rownum - Nrows; rowleng = 0; for ( k = offset; k < offset+recv_lengths[cur_off_row]; k++ ) if ( ext_ja[k] != -1 ) cols[rowleng++] = ext_ja[k]; } for ( k = 0; k < rowleng; k++ ) { if ( nblocks > 1 ) index = HYPRE_LSI_Search( blk_indices[i], cols[k], blk_size[i]); else index = cols[k]; if ( index >= 0 ) nnz++; else aux_nnz++; } } bmat_ia[i] = hypre_TAlloc(int, (length + 1) , HYPRE_MEMORY_HOST); bmat_ja[i] = hypre_TAlloc(int, nnz , HYPRE_MEMORY_HOST); bmat_aa[i] = hypre_TAlloc(double, nnz , HYPRE_MEMORY_HOST); mat_ia = bmat_ia[i]; mat_ja = bmat_ja[i]; mat_aa = bmat_aa[i]; if ( nblocks > 1 ) { aux_bmat_ia[i] = hypre_TAlloc(int, (blk_size[i] + 1) , HYPRE_MEMORY_HOST); aux_bmat_ja[i] = hypre_TAlloc(int, aux_nnz , HYPRE_MEMORY_HOST); aux_bmat_aa[i] = hypre_TAlloc(double, aux_nnz , HYPRE_MEMORY_HOST); } /* ------------------------------------------------------ */ /* load the submatrices */ /* ------------------------------------------------------ */ nnz = aux_nnz = offset = cur_off_row = 0; mat_ia[0] = 0; if ( nblocks > 1 ) aux_bmat_ia[i][0] = 0; for ( j = 0; j < blk_size[i]; j++ ) { if ( nblocks > 1 ) rownum = blk_indices[i][j]; else rownum = j; if ( rownum < Nrows ) { rowleng = 0; for ( k = Amat->rowptr[rownum]; k < Amat->rowptr[rownum+1]; k++ ) { vals[rowleng] = Amat->values[k]; cols[rowleng++] = Amat->colnum[k]; } } else { for ( k = cur_off_row; k < rownum-Nrows; k++ ) { offset += recv_lengths[k]; } cur_off_row = rownum - Nrows; rowleng = 0; for ( k = offset; k < offset+recv_lengths[cur_off_row]; k++ ) { if ( ext_ja[k] != -1 ) { cols[rowleng] = ext_ja[k]; vals[rowleng++] = ext_aa[k]; } } } for ( k = 0; k < rowleng; k++ ) { if ( nblocks > 1 ) index = HYPRE_LSI_Search( blk_indices[i], cols[k], blk_size[i]); else index = cols[k]; if ( index >= 0 ) { mat_ja[nnz] = index; mat_aa[nnz++] = vals[k]; } else { aux_bmat_ja[i][aux_nnz] = cols[k]; aux_bmat_aa[i][aux_nnz++] = vals[k]; } } mat_ia[j+1] = nnz; if ( nblocks > 1 ) aux_bmat_ia[i][j+1] = aux_nnz; } for ( j = 0; j < mat_ia[blk_size[i]]; j++ ) if ( mat_ja[j] < 0 || mat_ja[j] >= length ) printf("block %d has index %d\n", i, mat_ja[j]); } hypre_TFree(cols, HYPRE_MEMORY_HOST); hypre_TFree(vals, HYPRE_MEMORY_HOST); /* --------------------------------------------------------- */ /* decompose each block */ /* --------------------------------------------------------- */ HYPRE_LSI_ILUTDecompose( sch_ptr ); return 0; } /*************************************************************************/ /* function for doing ILUT decomposition */ /*************************************************************************/ int HYPRE_LSI_ILUTDecompose( HYPRE_LSI_Schwarz *sch_ptr ) { int i, j, k, blk, nrows, rleng, *cols, *track_array, track_leng; int nblocks, max_blk_size, *mat_ia, *mat_ja, *new_ia, *new_ja; int index, first, sortcnt, *sortcols, Lcount, Ucount, nnz, new_nnz; int colIndex, mypid, output_level, printflag, printflag2; double fillin, *vals, *dble_buf, *rowNorms, *diagonal, *mat_aa, *new_aa; double *sortvals, ddata, tau, rel_tau, absval; /* --------------------------------------------------------- */ /* preparation phase */ /* --------------------------------------------------------- */ MPI_Comm_rank(sch_ptr->comm, &mypid); output_level = sch_ptr->output_level; nblocks = sch_ptr->nblocks; max_blk_size = 0; for ( blk = 0; blk < nblocks; blk++ ) if ( sch_ptr->blk_sizes[blk] > max_blk_size ) max_blk_size = sch_ptr->blk_sizes[blk]; fillin = sch_ptr->fillin; tau = sch_ptr->threshold; track_array = hypre_TAlloc(int, max_blk_size , HYPRE_MEMORY_HOST); sortcols = hypre_TAlloc(int, max_blk_size , HYPRE_MEMORY_HOST); sortvals = hypre_TAlloc(double, max_blk_size , HYPRE_MEMORY_HOST); dble_buf = hypre_TAlloc(double, max_blk_size , HYPRE_MEMORY_HOST); diagonal = hypre_TAlloc(double, max_blk_size , HYPRE_MEMORY_HOST); rowNorms = hypre_TAlloc(double, max_blk_size , HYPRE_MEMORY_HOST); for ( i = 0; i < max_blk_size; i++ ) dble_buf[i] = 0.0; /* --------------------------------------------------------- */ /* process the rows */ /* --------------------------------------------------------- */ printflag = nblocks / 10 + 1; for ( blk = 0; blk < nblocks; blk++ ) { if ( output_level > 0 && blk % printflag == 0 && blk != 0 ) printf("%4d : Schwarz : processing block %6d (%6d)\n",mypid,blk,nblocks); mat_ia = sch_ptr->bmat_ia[blk]; mat_ja = sch_ptr->bmat_ja[blk]; mat_aa = sch_ptr->bmat_aa[blk]; nrows = sch_ptr->blk_sizes[blk]; nnz = mat_ia[nrows]; new_nnz = (int) (nnz * ( 1.0 + fillin )); new_ia = hypre_TAlloc(int, (nrows + 1 ) , HYPRE_MEMORY_HOST); new_ja = hypre_TAlloc(int, new_nnz , HYPRE_MEMORY_HOST); new_aa = hypre_TAlloc(double, new_nnz , HYPRE_MEMORY_HOST); nnz = 0; new_ia[0] = nnz; for ( i = 0; i < nrows; i++ ) { index = mat_ia[i]; cols = &(mat_ja[index]); vals = &(mat_aa[index]); rleng = mat_ia[i+1] - index; ddata = 0.0; for ( j = 0; j < rleng; j++ ) ddata += habs( vals[j] ); rowNorms[i] = ddata; } printflag2 = nrows / 10 + 1; for ( i = 0; i < nrows; i++ ) { if ( output_level > 0 && i % printflag2 == 0 && i != 0 ) printf("%4d : Schwarz : block %6d row %6d (%6d)\n",mypid,blk, i, nrows); track_leng = 0; index = mat_ia[i]; cols = &(mat_ja[index]); vals = &(mat_aa[index]); rleng = mat_ia[i+1] - index; for ( j = 0; j < rleng; j++ ) { dble_buf[cols[j]] = vals[j]; track_array[track_leng++] = cols[j]; } Lcount = Ucount = first = 0; first = nrows; for ( j = 0; j < track_leng; j++ ) { index = track_array[j]; if ( dble_buf[index] != 0 ) { if ( index < i ) Lcount++; else if ( index > i ) Ucount++; else if ( index == i ) diagonal[i] = dble_buf[index]; if ( index < first ) first = index; } } Lcount = Lcount * fillin; Ucount = Ucount * fillin; rel_tau = tau * rowNorms[i]; for ( j = first; j < i; j++ ) { if ( habs(dble_buf[j]) > rel_tau ) { ddata = dble_buf[j] / diagonal[j]; for ( k = new_ia[j]; k < new_ia[j+1]; k++ ) { colIndex = new_ja[k]; if ( colIndex > j ) { if ( dble_buf[colIndex] != 0.0 ) dble_buf[colIndex] -= (ddata * new_aa[k]); else { dble_buf[colIndex] = - (ddata * new_aa[k]); if ( dble_buf[colIndex] != 0.0 ) track_array[track_leng++] = colIndex; } } } dble_buf[j] = ddata; } else dble_buf[j] = 0.0; } for ( j = 0; j < rleng; j++ ) { vals[j] = dble_buf[cols[j]]; if ( cols[j] != i ) dble_buf[cols[j]] = 0.0; } sortcnt = 0; for ( j = 0; j < track_leng; j++ ) { index = track_array[j]; if ( index < i ) { absval = habs( dble_buf[index] ); if ( absval > rel_tau ) { sortcols[sortcnt] = index; sortvals[sortcnt++] = absval * rowNorms[index]; } else dble_buf[index] = 0.0; } } if ( sortcnt > Lcount ) { HYPRE_LSI_SplitDSort(sortvals,sortcnt,sortcols,Lcount); for ( j = Lcount; j < sortcnt; j++ ) dble_buf[sortcols[j]] = 0.0; } for ( j = 0; j < rleng; j++ ) { if ( cols[j] < i && vals[j] != 0.0 ) { new_aa[nnz] = vals[j]; new_ja[nnz++] = cols[j]; } } for ( j = 0; j < track_leng; j++ ) { index = track_array[j]; if ( index < i && dble_buf[index] != 0.0 ) { new_aa[nnz] = dble_buf[index]; new_ja[nnz++] = index; dble_buf[index] = 0.0; } } diagonal[i] = dble_buf[i]; if ( habs(diagonal[i]) < 1.0e-12 ) diagonal[i] = 1.0E-12; new_aa[nnz] = diagonal[i]; new_ja[nnz++] = i; sortcnt = 0; for ( j = 0; j < track_leng; j++ ) { index = track_array[j]; if ( index > i ) { absval = habs( dble_buf[index] ); if ( absval > rel_tau ) { sortcols[sortcnt] = index; sortvals[sortcnt++] = absval * rowNorms[index]; } else dble_buf[index] = 0.0; } } if ( sortcnt > Ucount ) { HYPRE_LSI_SplitDSort(sortvals,sortcnt,sortcols,Ucount); for ( j = Ucount; j < sortcnt; j++ ) dble_buf[sortcols[j]] = 0.0; } for ( j = 0; j < rleng; j++ ) { if ( cols[j] > i && vals[j] != 0.0 ) { new_aa[nnz] = vals[j]; new_ja[nnz++] = cols[j]; } } for ( j = 0; j < track_leng; j++ ) { index = track_array[j]; if ( index > i && dble_buf[index] != 0.0 ) { new_aa[nnz] = dble_buf[index]; new_ja[nnz++] = index; dble_buf[index] = 0.0; } } dble_buf[i] = 0.0; new_ia[i+1] = nnz; } hypre_TFree(mat_ia, HYPRE_MEMORY_HOST); hypre_TFree(mat_ja, HYPRE_MEMORY_HOST); hypre_TFree(mat_aa, HYPRE_MEMORY_HOST); sch_ptr->bmat_ia[blk] = new_ia; sch_ptr->bmat_ja[blk] = new_ja; sch_ptr->bmat_aa[blk] = new_aa; if ( nnz > new_nnz ) { printf("ERROR : nnz (%d) > new_nnz (%d) \n", nnz, new_nnz); exit(1); } for ( j = 0; j < new_ia[sch_ptr->blk_sizes[blk]]; j++ ) { if ( new_ja[j] < 0 || new_ja[j] >= sch_ptr->blk_sizes[blk] ) { printf("(2) block %d has index %d\n", blk, new_ja[j]); exit(1); } } } hypre_TFree(track_array, HYPRE_MEMORY_HOST); hypre_TFree(dble_buf, HYPRE_MEMORY_HOST); hypre_TFree(diagonal, HYPRE_MEMORY_HOST); hypre_TFree(rowNorms, HYPRE_MEMORY_HOST); hypre_TFree(sortcols, HYPRE_MEMORY_HOST); hypre_TFree(sortvals, HYPRE_MEMORY_HOST); return 0; } hypre-2.33.0/src/FEI_mv/fei-hypre/HYPRE_LSI_schwarz.h000066400000000000000000000031431477326011500220310ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * HYPRE_Schwarz interface * *****************************************************************************/ #ifndef __HYPRE_SCHWARZ__ #define __HYPRE_SCHWARZ__ #include #include #include #include #include "utilities/_hypre_utilities.h" #include "parcsr_ls/HYPRE_parcsr_ls.h" #include "parcsr_mv/_hypre_parcsr_mv.h" #ifdef __cplusplus extern "C" { #endif extern int HYPRE_LSI_SchwarzCreate( MPI_Comm comm, HYPRE_Solver *solver ); extern int HYPRE_LSI_SchwarzDestroy( HYPRE_Solver solver ); extern int HYPRE_LSI_SchwarzSetBlockSize( HYPRE_Solver solver, int blksize); extern int HYPRE_LSI_SchwarzSetNBlocks( HYPRE_Solver solver, int nblks); extern int HYPRE_LSI_SchwarzSetILUTFillin( HYPRE_Solver solver, double fillin); extern int HYPRE_LSI_SchwarzSetOutputLevel( HYPRE_Solver solver, int level); extern int HYPRE_LSI_SchwarzSolve( HYPRE_Solver solver, HYPRE_ParCSRMatrix A, HYPRE_ParVector b, HYPRE_ParVector x ); extern int HYPRE_LSI_SchwarzSetup( HYPRE_Solver solver, HYPRE_ParCSRMatrix A, HYPRE_ParVector b, HYPRE_ParVector x ); #ifdef __cplusplus } #endif #endif hypre-2.33.0/src/FEI_mv/fei-hypre/HYPRE_LinSysCore.cxx000066400000000000000000006620271477326011500222620ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ //*************************************************************************** // system includes //--------------------------------------------------------------------------- #include "utilities/_hypre_utilities.h" #include #include #include #include #if 0 /* RDF: Not sure this is really needed */ #ifdef WIN32 #define strcmp _stricmp #endif #endif //*************************************************************************** // HYPRE includes //--------------------------------------------------------------------------- #include "HYPRE.h" #include "IJ_mv/HYPRE_IJ_mv.h" #include "parcsr_mv/HYPRE_parcsr_mv.h" #include "parcsr_ls/HYPRE_parcsr_ls.h" #include "HYPRE_parcsr_bicgstabl.h" #include "HYPRE_parcsr_TFQmr.h" #include "HYPRE_parcsr_bicgs.h" #include "HYPRE_parcsr_symqmr.h" #include "HYPRE_parcsr_fgmres.h" #include "HYPRE_parcsr_lsicg.h" #include "HYPRE_LinSysCore.h" #include "parcsr_mv/_hypre_parcsr_mv.h" #include "HYPRE_LSI_schwarz.h" #include "HYPRE_LSI_ddilut.h" #include "HYPRE_LSI_ddict.h" #include "HYPRE_LSI_poly.h" #include "HYPRE_LSI_block.h" #include "HYPRE_LSI_Uzawa_c.h" #include "HYPRE_LSI_Dsuperlu.h" #include "HYPRE_MLMaxwell.h" #include "HYPRE_SlideReduction.h" //*************************************************************************** // timers //--------------------------------------------------------------------------- #ifdef HYPRE_SEQUENTIAL #include extern "C" { double LSC_Wtime() { clock_t ticks; double seconds; ticks = clock() ; seconds = (double) ticks / (double) CLOCKS_PER_SEC; return seconds; } } #else double LSC_Wtime() { return (MPI_Wtime()); } #endif extern "C" { int HYPRE_LSI_qsort1a( int *, int *, int, int ); int HYPRE_LSI_PartitionMatrix(int, int, int*, int**, double**, int*, int**); int HYPRE_LSI_GetMatrixDiagonal(int, int, int *, int **, double **, int *, int *, double *); } //*************************************************************************** // These are external functions needed internally here //--------------------------------------------------------------------------- #include "HYPRE_LSI_mli.h" extern "C" { #ifdef HAVE_ML int HYPRE_LSI_MLCreate( MPI_Comm, HYPRE_Solver *); int HYPRE_LSI_MLDestroy( HYPRE_Solver ); #endif #ifdef HAVE_MLMAXWELL int HYPRE_LSI_MLMaxwellCreate(MPI_Comm, HYPRE_Solver *); int HYPRE_LSI_MLMaxwellDestroy(HYPRE_Solver ); #endif #ifdef HAVE_AMGE int HYPRE_LSI_AMGeCreate(); int HYPRE_LSI_AMGeDestroy(); int HYPRE_LSI_AMGeSetNNodes(int); int HYPRE_LSI_AMGeSetNElements(int); int HYPRE_LSI_AMGeSetSystemSize(int); int HYPRE_LSI_AMGePutRow(int,int,double*,int*); int HYPRE_LSI_AMGeSolve( double *rhs, double *sol ); int HYPRE_LSI_AMGeSetBoundary( int leng, int *colInd ); int HYPRE_LSI_AMGeWriteToFile(); #endif void hypre_qsort0(int *, int, int); void hypre_qsort1(int *, double *, int, int); } #define habs(x) ( ( (x) > 0 ) ? x : -(x)) //*************************************************************************** // constructor //--------------------------------------------------------------------------- HYPRE_LinSysCore::HYPRE_LinSysCore(MPI_Comm comm) : comm_(comm), HYOutputLevel_(0), memOptimizerFlag_(0), mapFromSolnFlag_(0), mapFromSolnLeng_(0), mapFromSolnLengMax_(0), mapFromSolnList_(NULL), mapFromSolnList2_(NULL), HYA_(NULL), HYnormalA_(NULL), HYb_(NULL), HYnormalB_(NULL), HYbs_(NULL), HYx_(NULL), HYr_(NULL), HYpxs_(NULL), HYpbs_(NULL), numGlobalRows_(0), localStartRow_(0), localEndRow_(-1), localStartCol_(-1), localEndCol_(-1), rowLengths_(NULL), colIndices_(NULL), colValues_(NULL), reducedA_(NULL), reducedB_(NULL), reducedX_(NULL), reducedR_(NULL), HYA21_(NULL), HYA12_(NULL), A21NRows_(0), A21NCols_(0), HYinvA22_(NULL), currA_(NULL), currB_(NULL), currX_(NULL), currR_(NULL), currentRHS_(0), numRHSs_(1), nStored_(0), storedIndices_(NULL), auxStoredIndices_(NULL), mRHSFlag_(0), mRHSNumGEqns_(0), mRHSGEqnIDs_(NULL), mRHSNEntries_(NULL), mRHSBCType_(NULL), mRHSRowInds_(NULL), mRHSRowVals_(NULL), matrixVectorsCreated_(0), systemAssembled_(0), slideReduction_(0), slideReductionMinNorm_(-1.0), slideReductionScaleMatrix_(0), schurReduction_(0), schurReductionCreated_(0), projectionScheme_(0), projectSize_(0), projectCurrSize_(0), projectionMatrix_(NULL), normalEqnFlag_(0), slideObj_(NULL), selectedList_(NULL), selectedListAux_(NULL), nConstraints_(0), constrList_(NULL), matrixPartition_(0), HYSolver_(NULL), maxIterations_(1000), tolerance_(1.0e-6), normAbsRel_(0), pcgRecomputeRes_(0), HYPrecon_(NULL), HYPreconReuse_(0), HYPreconSetup_(0), lookup_(NULL), haveLookup_(0) { //------------------------------------------------------------------- // find my processor ID //------------------------------------------------------------------- MPI_Comm_rank(comm, &mypid_); MPI_Comm_size(comm, &numProcs_); //------------------------------------------------------------------- // default method = gmres //------------------------------------------------------------------- HYSolverName_ = new char[64]; strcpy(HYSolverName_,"gmres"); HYSolverID_ = HYGMRES; //------------------------------------------------------------------- // default preconditioner = identity //------------------------------------------------------------------- HYPreconName_ = new char[64]; strcpy(HYPreconName_,"diagonal"); HYPreconID_ = HYDIAGONAL; //------------------------------------------------------------------- // parameters for controlling amg, pilut, SuperLU, etc. //------------------------------------------------------------------- gmresDim_ = 100; // restart size in GMRES fgmresUpdateTol_ = 0; amgMaxLevels_ = 30; // default max number of levels amgCoarsenType_ = 0; // default coarsening amgMeasureType_ = 0; // local measure amgSystemSize_ = 1; // system size amgMaxIter_ = 1; // number of iterations amgNumSweeps_[0] = 1; // no. of sweeps for fine grid amgNumSweeps_[1] = 1; // no. of presmoothing sweeps amgNumSweeps_[2] = 1; // no. of postsmoothing sweeps amgNumSweeps_[3] = 1; // no. of sweeps for coarsest grid amgRelaxType_[0] = 3; // hybrid for the fine grid amgRelaxType_[1] = 3; // hybrid for presmoothing amgRelaxType_[2] = 3; // hybrid for postsmoothing amgRelaxType_[3] = 9; // direct for the coarsest level amgGridRlxType_ = 0; // smoothes all points amgStrongThreshold_ = 0.25; amgSmoothType_ = 0; // default non point smoother, none amgSmoothNumLevels_ = 0; // no. of levels for non point smoothers amgSmoothNumSweeps_ = 1; // no. of sweeps for non point smoothers amgCGSmoothNumSweeps_ = 0; // no. of sweeps for preconditioned CG smoother amgSchwarzRelaxWt_ = 1.0; // relaxation weight for Schwarz smoother amgSchwarzVariant_ = 0; // hybrid multiplicative Schwarz with // no overlap across processor boundaries amgSchwarzOverlap_ = 1; // minimal overlap amgSchwarzDomainType_ = 2; // domain through agglomeration amgUseGSMG_ = 0; amgGSMGNSamples_ = 0; amgAggLevels_ = 0; amgInterpType_ = 0; amgPmax_ = 0; for (int i = 0; i < 25; i++) amgRelaxWeight_[i] = 1.0; for (int j = 0; j < 25; j++) amgRelaxOmega_[j] = 1.0; pilutFillin_ = 0; // how many nonzeros to keep in L and U pilutDropTol_ = 0.0; pilutMaxNnzPerRow_ = 0; // register the max NNZ/row in matrix A ddilutFillin_ = 1.0; // additional fillin other than A ddilutDropTol_ = 1.0e-8; ddilutOverlap_ = 0; ddilutReorder_ = 0; ddictFillin_ = 1.0; // additional fillin other than A ddictDropTol_ = 1.0e-8; schwarzFillin_ = 1.0; // additional fillin other than A schwarzNblocks_ = 1; schwarzBlksize_ = 0; polyOrder_ = 8; // order of polynomial preconditioner parasailsSym_ = 0; // default is nonsymmetric parasailsThreshold_ = 0.1; parasailsNlevels_ = 1; parasailsFilter_ = 0.05; parasailsLoadbal_ = 0.0; parasailsReuse_ = 0; // reuse pattern if nonzero euclidargc_ = 2; // parameters information for Euclid euclidargv_ = new char*[euclidargc_*2]; for (int k = 0; k < euclidargc_*2; k++) euclidargv_[k] = new char[50]; strcpy(euclidargv_[0], "-level"); strcpy(euclidargv_[1], "0"); strcpy(euclidargv_[2], "-sparseA"); strcpy(euclidargv_[3], "0.0"); superluOrdering_ = 0; // natural ordering in SuperLU superluScale_[0] = 'N'; // no scaling in SuperLUX mlMethod_ = 1; mlNumPreSweeps_ = 1; mlNumPostSweeps_ = 1; mlPresmootherType_ = 1; // default Gauss-Seidel mlPostsmootherType_ = 1; // default Gauss-Seidel mlRelaxWeight_ = 0.5; mlStrongThreshold_ = 0.08; // one suggested by Vanek/Brezina/Mandel mlCoarseSolver_ = 0; // default coarse solver = SuperLU mlCoarsenScheme_ = 1; // default coarsening scheme = uncoupled mlNumPDEs_ = 3; // default block size truncThresh_ = 0.0; rnorm_ = 0.0; rhsIDs_ = new int[1]; rhsIDs_[0] = 0; feData_ = NULL; haveFEData_ = 0; feData_ = NULL; MLI_NumNodes_ = 0; MLI_FieldSize_ = 0; MLI_NodalCoord_ = NULL; MLI_EqnNumbers_ = NULL; MLI_Hybrid_GSA_ = 0; MLI_Hybrid_NSIncr_ = 2; MLI_Hybrid_MaxIter_ = 100; MLI_Hybrid_ConvRate_ = 0.95; MLI_Hybrid_NTrials_ = 5; AMSData_.numNodes_ = 0; AMSData_.numLocalNodes_ = 0; AMSData_.EdgeNodeList_ = NULL; AMSData_.NodeNumbers_ = NULL; AMSData_.NodalCoord_ = NULL; amsX_ = NULL; amsY_ = NULL; amsZ_ = NULL; amsG_ = NULL; amsD0_ = NULL; amsD1_ = NULL; amsNumPDEs_ = 3; amsMaxIter_ = 1; amsTol_ = 0.0; amsCycleType_ = 1; amsRelaxType_ = 2; amsRelaxTimes_ = 1; amsRelaxWt_ = 1.0; amsRelaxOmega_ = 1.0; amsBetaPoisson_ = NULL; amsPrintLevel_ = 0; amsAlphaCoarsenType_ = 10; amsAlphaAggLevels_ = 1; amsAlphaRelaxType_ = 6; amsAlphaStrengthThresh_ = 0.25; amsBetaCoarsenType_ = 10; amsBetaAggLevels_ = 1; amsBetaRelaxType_ = 6; amsBetaStrengthThresh_ = 0.25; FEI_mixedDiagFlag_ = 0; FEI_mixedDiag_ = NULL; sysPDEMethod_ = -1; sysPDEFormat_ = -1; sysPDETol_ = 0.0; sysPDEMaxIter_ = -1; sysPDENumPre_ = -1; sysPDENumPost_ = -1; sysPDENVars_ = 3; //------------------------------------------------------------------- // parameters ML Maxwell solver //------------------------------------------------------------------- maxwellANN_ = NULL; maxwellGEN_ = NULL; } //*************************************************************************** // destructor //--------------------------------------------------------------------------- HYPRE_LinSysCore::~HYPRE_LinSysCore() { int i; //------------------------------------------------------------------- // diagnostic message //------------------------------------------------------------------- if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 3 ) printf("%4d : HYPRE_LSC::entering destructor.\n",mypid_); //------------------------------------------------------------------- // clean up the allocated matrix and vectors //------------------------------------------------------------------- if ( HYA_ != NULL ) {HYPRE_IJMatrixDestroy(HYA_); HYA_ = NULL;} if ( HYx_ != NULL ) {HYPRE_IJVectorDestroy(HYx_); HYx_ = NULL;} if ( HYr_ != NULL ) {HYPRE_IJVectorDestroy(HYr_); HYr_ = NULL;} if ( HYbs_ != NULL ) { for ( i = 0; i < numRHSs_; i++ ) if ( HYbs_[i] != NULL ) HYPRE_IJVectorDestroy(HYbs_[i]); delete [] HYbs_; HYbs_ = NULL; } if ( HYpbs_ != NULL ) { for ( i = 0; i <= projectSize_; i++ ) if ( HYpbs_[i] != NULL ) HYPRE_IJVectorDestroy(HYpbs_[i]); delete [] HYpbs_; HYpbs_ = NULL; } if ( HYpxs_ != NULL ) { for ( i = 0; i <= projectSize_; i++ ) if ( HYpxs_[i] != NULL ) HYPRE_IJVectorDestroy(HYpxs_[i]); delete [] HYpxs_; HYpxs_ = NULL; } if (HYnormalA_!= NULL) {HYPRE_IJMatrixDestroy(HYnormalA_);HYnormalA_ = NULL;} if (HYnormalB_!= NULL) {HYPRE_IJVectorDestroy(HYnormalB_);HYnormalB_ = NULL;} if (reducedA_ != NULL) {HYPRE_IJMatrixDestroy(reducedA_); reducedA_ = NULL;} if (reducedB_ != NULL) {HYPRE_IJVectorDestroy(reducedB_); reducedB_ = NULL;} if (reducedX_ != NULL) {HYPRE_IJVectorDestroy(reducedX_); reducedX_ = NULL;} if (reducedR_ != NULL) {HYPRE_IJVectorDestroy(reducedR_); reducedR_ = NULL;} if (HYA21_ != NULL) {HYPRE_IJMatrixDestroy(HYA21_); HYA21_ = NULL;} if (HYA12_ != NULL) {HYPRE_IJMatrixDestroy(HYA12_); HYA12_ = NULL;} if (HYinvA22_ != NULL) {HYPRE_IJMatrixDestroy(HYinvA22_); HYinvA22_ = NULL;} matrixVectorsCreated_ = 0; systemAssembled_ = 0; projectCurrSize_ = 0; if ( colIndices_ != NULL ) { for ( i = 0; i < localEndRow_-localStartRow_+1; i++ ) if ( colIndices_[i] != NULL ) delete [] colIndices_[i]; delete [] colIndices_; colIndices_ = NULL; } if ( colValues_ != NULL ) { for ( i = 0; i < localEndRow_-localStartRow_+1; i++ ) if ( colValues_[i] != NULL ) delete [] colValues_[i]; delete [] colValues_; colValues_ = NULL; } if ( rowLengths_ != NULL ) { delete [] rowLengths_; rowLengths_ = NULL; } if ( rhsIDs_ != NULL ) delete [] rhsIDs_; if ( storedIndices_ != NULL ) delete [] storedIndices_; if ( auxStoredIndices_ != NULL ) delete [] auxStoredIndices_; if ( mRHSNumGEqns_ > 0) { if (mRHSGEqnIDs_ != NULL) delete [] mRHSGEqnIDs_; if (mRHSNEntries_ != NULL) delete [] mRHSNEntries_; if (mRHSBCType_ != NULL) delete [] mRHSBCType_ ; if (mRHSRowInds_ != NULL) { for (i = 0; i < mRHSNumGEqns_; i++) delete [] mRHSRowInds_[i]; delete [] mRHSRowInds_; } if (mRHSRowVals_ != NULL) { for (i = 0; i < mRHSNumGEqns_; i++) delete [] mRHSRowVals_[i]; delete [] mRHSRowVals_; } mRHSNumGEqns_ = 0; mRHSGEqnIDs_ = NULL; mRHSNEntries_ = NULL; mRHSBCType_ = NULL; mRHSRowInds_ = NULL; mRHSRowVals_ = NULL; } //------------------------------------------------------------------- // clean up direct matrix access variables //------------------------------------------------------------------- if ( mapFromSolnList_ != NULL ) { delete [] mapFromSolnList_; mapFromSolnList_ = NULL; } if ( mapFromSolnList2_ != NULL ) { delete [] mapFromSolnList2_; mapFromSolnList2_ = NULL; } //------------------------------------------------------------------- // call solver destructors //------------------------------------------------------------------- if ( HYSolver_ != NULL ) { if (HYSolverID_ == HYPCG) HYPRE_ParCSRPCGDestroy(HYSolver_); if (HYSolverID_ == HYGMRES) HYPRE_ParCSRGMRESDestroy(HYSolver_); if (HYSolverID_ == HYCGSTAB) HYPRE_ParCSRBiCGSTABDestroy(HYSolver_); if (HYSolverID_ == HYCGSTABL) HYPRE_ParCSRBiCGSTABLDestroy(HYSolver_); if (HYSolverID_ == HYAMG) HYPRE_BoomerAMGDestroy(HYSolver_); if (HYSolverID_ == HYTFQMR) HYPRE_ParCSRTFQmrDestroy(HYSolver_); HYSolver_ = NULL; } delete [] HYSolverName_; HYSolverName_ = NULL; #ifdef HAVE_AMGE if ( HYSolverID_ == HYAMGE ) HYPRE_LSI_AMGeDestroy(); #endif //------------------------------------------------------------------- // call preconditioner destructors //------------------------------------------------------------------- if ( HYPrecon_ != NULL ) { if ( HYPreconID_ == HYPILUT ) HYPRE_ParCSRPilutDestroy( HYPrecon_ ); else if ( HYPreconID_ == HYPARASAILS ) HYPRE_ParCSRParaSailsDestroy( HYPrecon_ ); else if ( HYPreconID_ == HYBOOMERAMG ) HYPRE_BoomerAMGDestroy( HYPrecon_ ); else if ( HYPreconID_ == HYDDILUT ) HYPRE_LSI_DDIlutDestroy( HYPrecon_ ); else if ( HYPreconID_ == HYSCHWARZ ) HYPRE_LSI_SchwarzDestroy( HYPrecon_ ); else if ( HYPreconID_ == HYPOLY ) HYPRE_LSI_PolyDestroy( HYPrecon_ ); else if ( HYPreconID_ == HYEUCLID ) HYPRE_EuclidDestroy( HYPrecon_ ); else if ( HYPreconID_ == HYBLOCK ) HYPRE_LSI_BlockPrecondDestroy( HYPrecon_ ); #ifdef HAVE_ML else if ( HYPreconID_ == HYML ) HYPRE_LSI_MLDestroy( HYPrecon_ ); #endif #ifdef HAVE_MLMAXWELL else if ( HYPreconID_ == HYMLMAXWELL ) HYPRE_LSI_MLMaxwellDestroy( HYPrecon_ ); #endif else if ( HYPreconID_ == HYMLI ) HYPRE_LSI_MLIDestroy( HYPrecon_ ); else if ( HYPreconID_ == HYAMS ) { // Destroy G and coordinate vectors // OLD WAY if( amsG_ == NULL ) { HYPRE_AMSFEIDestroy( HYPrecon_ ); } HYPRE_AMSDestroy( HYPrecon_ ); } #ifdef HAVE_SYSPDE else if ( HYPreconID_ == HYSYSPDE ) HYPRE_ParCSRSysPDEDestroy( HYPrecon_ ); #endif #ifdef HYPRE_USING_DSUPERLU else if ( HYPreconID_ == HYDSLU ) HYPRE_LSI_DSuperLUDestroy(HYPrecon_); #endif HYPrecon_ = NULL; } delete [] HYPreconName_; HYPreconName_ = NULL; for (i = 0; i < euclidargc_*2; i++) delete [] euclidargv_[i]; delete [] euclidargv_; euclidargv_ = NULL; //------------------------------------------------------------------- // clean up variable for various reduction //------------------------------------------------------------------- if ( constrList_ != NULL ) { delete [] constrList_; constrList_ = NULL; } if (selectedList_ != NULL) { delete [] selectedList_; selectedList_ = NULL; } if (selectedListAux_ != NULL) { delete [] selectedListAux_; selectedListAux_ = NULL; } //------------------------------------------------------------------- // deallocate local storage for MLI //------------------------------------------------------------------- #ifdef HAVE_MLI if ( feData_ != NULL ) { if (haveFEData_ == 1) HYPRE_LSI_MLIFEDataDestroy(feData_); else if (haveFEData_ == 2) HYPRE_LSI_MLISFEIDestroy(feData_); feData_ = NULL; } if ( MLI_NodalCoord_ != NULL ) delete [] MLI_NodalCoord_; if ( MLI_EqnNumbers_ != NULL ) delete [] MLI_EqnNumbers_; #endif if (maxwellANN_ != NULL) { HYPRE_ParCSRMatrixDestroy(maxwellANN_); maxwellANN_ = NULL; } if (amsX_ != NULL) HYPRE_IJVectorDestroy(amsX_); if (amsY_ != NULL) HYPRE_IJVectorDestroy(amsY_); if (amsZ_ != NULL) HYPRE_IJVectorDestroy(amsZ_); if (amsG_ != NULL) HYPRE_IJMatrixDestroy(amsG_); if (amsD0_ != NULL) HYPRE_IJMatrixDestroy(amsD0_); if (amsD1_ != NULL) HYPRE_IJMatrixDestroy(amsD1_); // Users who copy this matrix in should be responsible for // destroying this //if (maxwellGEN_ != NULL) //{ // HYPRE_ParCSRMatrixDestroy(maxwellGEN_); // maxwellGEN_ = NULL; //} // This data seems to be freed by hypre_AMSFEIDestroy in ams.c //if (AMSData_.EdgeNodeList_ != NULL) hypre_TFree(AMSData_.EdgeNodeList_, HYPRE_MEMORY_HOST); if (AMSData_.NodeNumbers_ != NULL) hypre_TFree(AMSData_.NodeNumbers_, HYPRE_MEMORY_HOST); if (AMSData_.NodalCoord_ != NULL) hypre_TFree(AMSData_.NodalCoord_, HYPRE_MEMORY_HOST); if (FEI_mixedDiag_ != NULL) delete [] FEI_mixedDiag_; //------------------------------------------------------------------- // diagnostic message //------------------------------------------------------------------- if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 3 ) printf("%4d : HYPRE_LSC::leaving destructor.\n",mypid_); } //*************************************************************************** // clone a copy of HYPRE_LinSysCore //--------------------------------------------------------------------------- #ifndef NOFEI LinearSystemCore* HYPRE_LinSysCore::clone() { return(new HYPRE_LinSysCore(comm_)); } #endif //*************************************************************************** // passing a lookup table to this object // (note : this is called in FEI_initComplete) //--------------------------------------------------------------------------- int HYPRE_LinSysCore::setLookup(Lookup& lookup) { //------------------------------------------------------------------- // diagnostic message //------------------------------------------------------------------- if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 3 ) printf("%4d : HYPRE_LSC::entering setLookup.\n",mypid_); //------------------------------------------------------------------- // set the lookup object and initialize the MLI_FEData object //------------------------------------------------------------------- // RDF: The following line doesn't make sense and generates warnings with some compilers //if (&lookup == NULL) return (0); lookup_ = &lookup; haveLookup_ = 1; //------------------------------------------------------------------- // diagnostic message //------------------------------------------------------------------- if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 3 ) printf("%4d : HYPRE_LSC::leaving setLookup.\n",mypid_); return (0); } //*************************************************************************** //This function is where we establish the structures/objects associated //with the linear algebra library. i.e., do initial allocations, etc. // Rows and columns are 1-based. //--------------------------------------------------------------------------- int HYPRE_LinSysCore::createMatricesAndVectors(int numGlobalEqns, int firstLocalEqn, int numLocalEqns) { int i; //------------------------------------------------------------------- // diagnostic message //------------------------------------------------------------------- if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 3 ) { printf("%4d : HYPRE_LSC::entering createMatricesAndVectors.\n",mypid_); printf("%4d : HYPRE_LSC::startrow, endrow = %d %d\n",mypid_, firstLocalEqn, firstLocalEqn+numLocalEqns-1); } //------------------------------------------------------------------- // clean up previously allocated matrix //------------------------------------------------------------------- if ( rowLengths_ != NULL ) delete [] rowLengths_; if ( colIndices_ != NULL ) { int nrows = localEndRow_ - localStartRow_ + 1; for ( i = 0; i < nrows; i++ ) if ( colIndices_[i] != NULL ) delete [] colIndices_[i]; delete [] colIndices_; } if ( colValues_ != NULL ) { int nrows = localEndRow_ - localStartRow_ + 1; for ( i = 0; i < nrows; i++ ) if ( colValues_[i] != NULL ) delete [] colValues_[i]; delete [] colValues_; } rowLengths_ = NULL; colIndices_ = NULL; colValues_ = NULL; if ( mRHSNumGEqns_ > 0) { if (mRHSGEqnIDs_ != NULL) delete [] mRHSGEqnIDs_; if (mRHSNEntries_ != NULL) delete [] mRHSNEntries_; if (mRHSBCType_ != NULL) delete [] mRHSBCType_; if (mRHSRowInds_ != NULL) { for (i = 0; i < mRHSNumGEqns_; i++) delete [] mRHSRowInds_[i]; delete [] mRHSRowInds_; } if (mRHSRowVals_ != NULL) { for (i = 0; i < mRHSNumGEqns_; i++) delete [] mRHSRowVals_[i]; delete [] mRHSRowVals_; } mRHSNumGEqns_ = 0; mRHSGEqnIDs_ = NULL; mRHSNEntries_ = NULL; mRHSBCType_ = NULL; mRHSRowInds_ = NULL; mRHSRowVals_ = NULL; } //------------------------------------------------------------------- // error checking //------------------------------------------------------------------- if ( ( firstLocalEqn <= 0 ) || ( firstLocalEqn+numLocalEqns-1) > numGlobalEqns) { printf("%4d : createMatricesVectors: invalid local equation nos.\n", mypid_); exit(1); } localStartRow_ = firstLocalEqn; localEndRow_ = firstLocalEqn + numLocalEqns - 1; numGlobalRows_ = numGlobalEqns; //------------------------------------------------------------------- // first clean up previous allocations //------------------------------------------------------------------- if ( matrixVectorsCreated_ ) { if ( HYA_ != NULL ) {HYPRE_IJMatrixDestroy(HYA_); HYA_ = NULL;} if ( HYx_ != NULL ) {HYPRE_IJVectorDestroy(HYx_); HYx_ = NULL;} if ( HYr_ != NULL ) {HYPRE_IJVectorDestroy(HYr_); HYr_ = NULL;} if ( HYbs_ != NULL ) { for ( i = 0; i < numRHSs_; i++ ) if ( HYbs_[i] != NULL ) HYPRE_IJVectorDestroy(HYbs_[i]); delete [] HYbs_; HYbs_ = NULL; } if (reducedA_ != NULL) HYPRE_IJMatrixDestroy(reducedA_); if (reducedB_ != NULL) HYPRE_IJVectorDestroy(reducedB_); if (reducedX_ != NULL) HYPRE_IJVectorDestroy(reducedX_); if (reducedR_ != NULL) HYPRE_IJVectorDestroy(reducedR_); if (HYA21_ != NULL) HYPRE_IJMatrixDestroy(HYA21_); if (HYA12_ != NULL) HYPRE_IJMatrixDestroy(HYA12_); if (HYinvA22_ != NULL) HYPRE_IJMatrixDestroy(HYinvA22_); reducedA_ = NULL; reducedB_ = NULL; reducedX_ = NULL; reducedR_ = NULL; HYA21_ = NULL; HYA12_ = NULL; HYinvA22_ = NULL; A21NRows_ = A21NCols_ = reducedAStartRow_ = 0; } //------------------------------------------------------------------- // instantiate the matrix (can also handle rectangular matrix) //------------------------------------------------------------------- if (localStartCol_ == -1) HYPRE_IJMatrixCreate(comm_, localStartRow_-1,localEndRow_-1, localStartRow_-1,localEndRow_-1, &HYA_); else HYPRE_IJMatrixCreate(comm_, localStartRow_-1,localEndRow_-1, localStartCol_,localEndCol_, &HYA_); HYPRE_IJMatrixSetObjectType(HYA_, HYPRE_PARCSR); //------------------------------------------------------------------- // instantiate the right hand vectors //------------------------------------------------------------------- HYbs_ = new HYPRE_IJVector[numRHSs_]; for ( i = 0; i < numRHSs_; i++ ) { HYPRE_IJVectorCreate(comm_, localStartRow_-1, localEndRow_-1, &(HYbs_[i])); HYPRE_IJVectorSetObjectType(HYbs_[i], HYPRE_PARCSR); HYPRE_IJVectorInitialize(HYbs_[i]); HYPRE_IJVectorAssemble(HYbs_[i]); } HYb_ = HYbs_[0]; //------------------------------------------------------------------- // instantiate the solution vector //------------------------------------------------------------------- if (localStartCol_ == -1) HYPRE_IJVectorCreate(comm_,localStartRow_-1,localEndRow_-1,&HYx_); else HYPRE_IJVectorCreate(comm_,localStartCol_,localEndCol_,&HYx_); HYPRE_IJVectorSetObjectType(HYx_, HYPRE_PARCSR); HYPRE_IJVectorInitialize(HYx_); HYPRE_IJVectorAssemble(HYx_); //------------------------------------------------------------------- // reset fedata //------------------------------------------------------------------- #ifdef HAVE_MLI if ( feData_ != NULL ) { if (haveFEData_ == 1) HYPRE_LSI_MLIFEDataDestroy(feData_); else if (haveFEData_ == 2) HYPRE_LSI_MLISFEIDestroy(feData_); feData_ = NULL; if ( MLI_NodalCoord_ != NULL ) delete [] MLI_NodalCoord_; if ( MLI_EqnNumbers_ != NULL ) delete [] MLI_EqnNumbers_; MLI_NodalCoord_ = NULL; MLI_EqnNumbers_ = NULL; MLI_NumNodes_ = 0; } #endif //------------------------------------------------------------------- // for amge //------------------------------------------------------------------- #ifdef HAVE_AMGE HYPRE_LSI_AMGeCreate(); HYPRE_LSI_AMGeSetNNodes(numGlobalRows_); HYPRE_LSI_AMGeSetNElements(numGlobalRows_); HYPRE_LSI_AMGeSetSystemSize(1); #endif //------------------------------------------------------------------- // instantiate the residual vector //------------------------------------------------------------------- HYPRE_IJVectorCreate(comm_, localStartRow_-1, localEndRow_-1, &HYr_); HYPRE_IJVectorSetObjectType(HYr_, HYPRE_PARCSR); HYPRE_IJVectorInitialize(HYr_); HYPRE_IJVectorAssemble(HYr_); matrixVectorsCreated_ = 1; schurReductionCreated_ = 0; systemAssembled_ = 0; normalEqnFlag_ &= 1; if ( HYnormalA_ != NULL ) { HYPRE_IJMatrixDestroy(HYnormalA_); HYnormalA_ = NULL; } if ( HYnormalB_ != NULL ) { HYPRE_IJVectorDestroy(HYnormalB_); HYnormalB_ = NULL; } //------------------------------------------------------------------- // diagnostic message //------------------------------------------------------------------- if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 3 ) printf("%4d : HYPRE_LSC::leaving createMatricesAndVectors.\n",mypid_); return (0); } //*************************************************************************** // set global and local number of equations // (This is called in FEI_initComplete after setLookup) //--------------------------------------------------------------------------- int HYPRE_LinSysCore::setGlobalOffsets(int leng, int* nodeOffsets, int* eqnOffsets, int* blkEqnOffsets) { //------------------------------------------------------------------- // diagnostic message //------------------------------------------------------------------- if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 3 ) printf("%4d : HYPRE_LSC::entering setGlobalOffsets.\n",mypid_); //------------------------------------------------------------------- // set local range (incoming 0-based, locally 1-based) //------------------------------------------------------------------- (void) leng; (void) nodeOffsets; (void) blkEqnOffsets; int firstLocalEqn = eqnOffsets[mypid_] + 1; int numLocalEqns = eqnOffsets[mypid_+1] - firstLocalEqn + 1; int numGlobalEqns = eqnOffsets[numProcs_]; createMatricesAndVectors(numGlobalEqns, firstLocalEqn, numLocalEqns); //------------------------------------------------------------------- // diagnostic message //------------------------------------------------------------------- if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 3 ) { printf("%4d : HYPRE_LSC::startrow, endrow = %d %d\n",mypid_, localStartRow_, localEndRow_); printf("%4d : HYPRE_LSC::leaving setGlobalOffsets.\n",mypid_); } return (0); } //*************************************************************************** // Grid related function : element node connectivities //--------------------------------------------------------------------------- int HYPRE_LinSysCore::setConnectivities(GlobalID elemBlk, int nElems, int nNodesPerElem, const GlobalID* elemIDs, const int* const* connNodes) { #ifdef HAVE_MLI (void) elemIDs; (void) connNodes; if ( HYPreconID_ == HYMLI && haveFEData_ == 2 ) { if (feData_ == NULL) feData_ = (void *) HYPRE_LSI_MLISFEICreate(comm_); HYPRE_LSI_MLISFEIAddNumElems(feData_,elemBlk,nElems,nNodesPerElem); } #else (void) elemBlk; (void) nElems; (void) nNodesPerElem; (void) elemIDs; (void) connNodes; if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) > 3 ) printf("%4d : HYPRE_LSC::setConnectivities not implemented.\n",mypid_); #endif return (0); } //*************************************************************************** // Grid related function : element stiffness matrix loading //--------------------------------------------------------------------------- int HYPRE_LinSysCore::setStiffnessMatrices(GlobalID elemBlk, int nElems, const GlobalID* elemIDs,const double *const *const *stiff, int nEqnsPerElem, const int *const * eqnIndices) { #ifdef HAVE_MLI if ( HYPreconID_ == HYMLI && feData_ != NULL ) { HYPRE_LSI_MLISFEILoadElemMatrices(feData_,elemBlk,nElems,(int*)elemIDs, (double***)stiff,nEqnsPerElem,(int**)eqnIndices); } #else (void) elemBlk; (void) nElems; (void) elemIDs; (void) stiff; (void) nEqnsPerElem; (void) eqnIndices; if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) > 3 ) printf("%4d : HYPRE_LSC::setStiffnessMatrices not implemented.\n", mypid_); #endif return (0); } //*************************************************************************** // Grid related function : element load vector loading //--------------------------------------------------------------------------- int HYPRE_LinSysCore::setLoadVectors(GlobalID elemBlock, int numElems, const GlobalID* elemIDs, const double *const *load, int numEqnsPerElem, const int *const * eqnIndices) { (void) elemBlock; (void) numElems; (void) elemIDs; (void) load; (void) numEqnsPerElem; (void) eqnIndices; if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) > 3 ) printf("%4d : HYPRE_LSC::setLoadVectors not implemented.\n", mypid_); return (0); } //*************************************************************************** // Set the number of rows in the diagonal part and off diagonal part // of the matrix, using the structure of the matrix, stored in rows. // rows is an array that is 0-based. localStartRow and localEndRow are 1-based. //--------------------------------------------------------------------------- int HYPRE_LinSysCore::allocateMatrix(int **colIndices, int *rowLengths) { int i, j, nsize, rowLeng, maxSize, minSize, searchFlag, *indPtr, *indPtr2; double *vals; //------------------------------------------------------------------- // diagnoistic message and error checking //------------------------------------------------------------------- if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 3 ) { printf("%4d : HYPRE_LSC::entering allocateMatrix.\n", mypid_); if ( localEndRow_ < localStartRow_ ) { printf("allocateMatrix WARNING : createMatrixAndVectors should be\n"); printf(" called before allocateMatrix.\n"); } } //------------------------------------------------------------------- // clean up previously allocated matrix //------------------------------------------------------------------- if ( rowLengths_ != NULL ) delete [] rowLengths_; rowLengths_ = NULL; if ( colIndices_ != NULL ) { for ( i = 0; i < localEndRow_-localStartRow_+1; i++ ) if ( colIndices_[i] != NULL ) delete [] colIndices_[i]; delete [] colIndices_; colIndices_ = NULL; } if ( colValues_ != NULL ) { for ( i = 0; i < localEndRow_-localStartRow_+1; i++ ) if ( colValues_[i] != NULL ) delete [] colValues_[i]; delete [] colValues_; colValues_ = NULL; } //------------------------------------------------------------------- // allocate and store the column index information //------------------------------------------------------------------- nsize = localEndRow_ - localStartRow_ + 1; rowLengths_ = new int[nsize]; colIndices_ = new int*[nsize]; colValues_ = new double*[nsize]; maxSize = 0; minSize = 1000000; for ( i = 0; i < nsize; i++ ) { rowLeng = rowLengths_[i] = rowLengths[i]; if ( rowLeng > 0 ) { colIndices_[i] = new int[rowLeng]; hypre_assert( colIndices_[i] != NULL ); } else colIndices_[i] = NULL; indPtr = colIndices_[i]; indPtr2 = colIndices[i]; for ( j = 0; j < rowLeng; j++ ) indPtr[j] = indPtr2[j]; searchFlag = 0; for ( j = 1; j < rowLeng; j++ ) if ( indPtr[j] < indPtr[j-1]) {searchFlag = 1; break;} if ( searchFlag ) hypre_qsort0( indPtr, 0, rowLeng-1); maxSize = ( rowLeng > maxSize ) ? rowLeng : maxSize; minSize = ( rowLeng < minSize ) ? rowLeng : minSize; if ( rowLeng > 0 ) { colValues_[i] = new double[rowLeng]; hypre_assert( colValues_[i] != NULL ); } vals = colValues_[i]; for ( j = 0; j < rowLeng; j++ ) vals[j] = 0.0; } MPI_Allreduce(&maxSize, &pilutMaxNnzPerRow_,1,MPI_INT,MPI_MAX,comm_); //------------------------------------------------------------------- // diagnoistic message //------------------------------------------------------------------- if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 3 ) { printf("%4d : allocateMatrix : max/min nnz/row = %d %d\n", mypid_, maxSize, minSize); printf("%4d : HYPRE_LSC::leaving allocateMatrix.\n", mypid_); } return (0); } //*************************************************************************** // to establish the structures/objects associated with the linear algebra // library. i.e., do initial allocations, etc. //--------------------------------------------------------------------------- int HYPRE_LinSysCore::setMatrixStructure(int** ptColIndices, int* ptRowLengths, int** blkColIndices, int* blkRowLengths, int* ptRowsPerBlkRow) { int i, j; //------------------------------------------------------------------- // diagnoistic message //------------------------------------------------------------------- if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 3 ) { printf("%4d : HYPRE_LSC::entering setMatrixStructure.\n",mypid_); if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 6 ) { int nRows = localEndRow_ - localStartRow_ + 1; for (i = 0; i < nRows; i++) for (j = 0; j < ptRowLengths[i]; j++) printf(" %4d : row, col = %d %d\n",mypid_, localStartRow_+i, ptColIndices[i][j]+1); } } (void) blkColIndices; (void) blkRowLengths; (void) ptRowsPerBlkRow; //------------------------------------------------------------------- // allocate local space for matrix //------------------------------------------------------------------- int numLocalRows = localEndRow_ - localStartRow_ + 1; for ( i = 0; i < numLocalRows; i++ ) for ( j = 0; j < ptRowLengths[i]; j++ ) ptColIndices[i][j]++; allocateMatrix(ptColIndices, ptRowLengths); for ( i = 0; i < numLocalRows; i++ ) for ( j = 0; j < ptRowLengths[i]; j++ ) ptColIndices[i][j]--; //------------------------------------------------------------------- // diagnoistic message //------------------------------------------------------------------- if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 3 ) printf("%4d : HYPRE_LSC::leaving setMatrixStructure.\n",mypid_); return (0); } //*************************************************************************** // set Lagrange multiplier equations //--------------------------------------------------------------------------- int HYPRE_LinSysCore::setMultCREqns(int multCRSetID, int numCRs, int numNodesPerCR, int** nodeNumbers, int** eqnNumbers, int* fieldIDs, int* multiplierEqnNumbers) { (void) multCRSetID; (void) numCRs; (void) numNodesPerCR; (void) nodeNumbers; (void) eqnNumbers; (void) fieldIDs; (void) multiplierEqnNumbers; if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) > 3 ) printf("%4d : HYPRE_LSC::setMultCREqns not implemented.\n",mypid_); return (0); } //*************************************************************************** // set penalty constraint equations //--------------------------------------------------------------------------- int HYPRE_LinSysCore::setPenCREqns(int penCRSetID, int numCRs, int numNodesPerCR, int** nodeNumbers, int** eqnNumbers, int* fieldIDs) { (void) penCRSetID; (void) numCRs; (void) numNodesPerCR; (void) nodeNumbers; (void) eqnNumbers; (void) fieldIDs; if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) > 3 ) printf("%4d : HYPRE_LSC::setPenCREqns not implemented.\n",mypid_); return (0); } //*************************************************************************** // This function is needed in order to construct a new problem with the // same sparsity pattern. //--------------------------------------------------------------------------- int HYPRE_LinSysCore::resetMatrixAndVector(double setValue) { int i, j, localNRows, *cols; double *vals; //------------------------------------------------------------------- // diagnoistic message //------------------------------------------------------------------- if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 3 ) printf("%4d : HYPRE_LSC::entering resetMatrixAndVector.\n",mypid_); if ( setValue != 0.0 && mypid_ == 0 ) { printf("resetMatrixAndVector ERROR : cannot take nonzeros.\n"); exit(1); } //------------------------------------------------------------------- // reset vector values //------------------------------------------------------------------- localNRows = localEndRow_ - localStartRow_ + 1; cols = new int[localNRows]; vals = new double[localNRows]; for (i = 0; i < localNRows; i++) { cols[i] = localStartRow_ + i - 1; vals[i] = 0.0; } for (i = 0; i < numRHSs_; i++) HYPRE_IJVectorSetValues(HYbs_[i], localNRows, (const int *) cols, (const double *) vals); delete [] cols; delete [] vals; systemAssembled_ = 0; schurReductionCreated_ = 0; projectCurrSize_ = 0; normalEqnFlag_ &= 1; if ( HYnormalA_ != NULL ) { HYPRE_IJMatrixDestroy(HYnormalA_); HYnormalA_ = NULL; } if ( HYnormalB_ != NULL ) { HYPRE_IJVectorDestroy(HYnormalB_); HYnormalB_ = NULL; } //------------------------------------------------------------------- // for now, since HYPRE does not yet support // re-initializing the matrix, restart the whole thing //------------------------------------------------------------------- if ( HYA_ != NULL ) HYPRE_IJMatrixDestroy(HYA_); HYPRE_IJMatrixCreate(comm_, localStartRow_-1, localEndRow_-1, localStartRow_-1, localEndRow_-1, &HYA_); HYPRE_IJMatrixSetObjectType(HYA_, HYPRE_PARCSR); //------------------------------------------------------------------- // clean the reduction stuff //------------------------------------------------------------------- if (reducedA_ != NULL) {HYPRE_IJMatrixDestroy(reducedA_); reducedA_ = NULL;} if (reducedB_ != NULL) {HYPRE_IJVectorDestroy(reducedB_); reducedB_ = NULL;} if (reducedX_ != NULL) {HYPRE_IJVectorDestroy(reducedX_); reducedX_ = NULL;} if (reducedR_ != NULL) {HYPRE_IJVectorDestroy(reducedR_); reducedR_ = NULL;} if (HYA21_ != NULL) {HYPRE_IJMatrixDestroy(HYA21_); HYA21_ = NULL;} if (HYA12_ != NULL) {HYPRE_IJMatrixDestroy(HYA12_); HYA12_ = NULL;} if (HYinvA22_ != NULL) {HYPRE_IJMatrixDestroy(HYinvA22_); HYinvA22_ = NULL;} A21NRows_ = A21NCols_ = reducedAStartRow_ = 0; //------------------------------------------------------------------- // allocate space for storing the matrix coefficient //------------------------------------------------------------------- if ( colValues_ != NULL ) { int nrows = localEndRow_ - localStartRow_ + 1; for ( i = 0; i < nrows; i++ ) if ( colValues_[i] != NULL ) delete [] colValues_[i]; delete [] colValues_; } colValues_ = NULL; colValues_ = new double*[localNRows]; for ( i = 0; i < localNRows; i++ ) { if ( rowLengths_[i] > 0 ) colValues_[i] = new double[rowLengths_[i]]; for ( j = 0; j < rowLengths_[i]; j++ ) colValues_[i][j] = 0.0; } //------------------------------------------------------------------- // reset fedata //------------------------------------------------------------------- #ifdef HAVE_MLI if ( feData_ != NULL ) { if (haveFEData_ == 1) HYPRE_LSI_MLIFEDataDestroy(feData_); else if (haveFEData_ == 2) HYPRE_LSI_MLISFEIDestroy(feData_); feData_ = NULL; if ( MLI_NodalCoord_ != NULL ) delete [] MLI_NodalCoord_; if ( MLI_EqnNumbers_ != NULL ) delete [] MLI_EqnNumbers_; MLI_NodalCoord_ = NULL; MLI_EqnNumbers_ = NULL; MLI_NumNodes_ = 0; } #endif //------------------------------------------------------------------- // diagnostic message //------------------------------------------------------------------- if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 3 ) printf("%4d : HYPRE_LSC::leaving resetMatrixAndVector.\n", mypid_); return (0); } //*************************************************************************** // new function to reset matrix independently //--------------------------------------------------------------------------- int HYPRE_LinSysCore::resetMatrix(double setValue) { int i, j, size; //------------------------------------------------------------------- // diagnostic message //------------------------------------------------------------------- if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 3 ) printf("%4d : HYPRE_LSC::entering resetMatrix.\n",mypid_); if ( setValue != 0.0 && mypid_ == 0 ) { printf("resetMatrix ERROR : cannot take nonzeros.\n"); exit(1); } //------------------------------------------------------------------- // clean the reduction stuff //------------------------------------------------------------------- if (reducedA_ != NULL) {HYPRE_IJMatrixDestroy(reducedA_); reducedA_ = NULL;} if (reducedB_ != NULL) {HYPRE_IJVectorDestroy(reducedB_); reducedB_ = NULL;} if (reducedX_ != NULL) {HYPRE_IJVectorDestroy(reducedX_); reducedX_ = NULL;} if (reducedR_ != NULL) {HYPRE_IJVectorDestroy(reducedR_); reducedR_ = NULL;} if (HYA21_ != NULL) {HYPRE_IJMatrixDestroy(HYA21_); HYA21_ = NULL;} if (HYA12_ != NULL) {HYPRE_IJMatrixDestroy(HYA12_); HYA12_ = NULL;} if (HYinvA22_ != NULL) {HYPRE_IJMatrixDestroy(HYinvA22_); HYinvA22_ = NULL;} A21NRows_ = A21NCols_ = reducedAStartRow_ = 0; //------------------------------------------------------------------- // for now, since HYPRE does not yet support // re-initializing the matrix, restart the whole thing //------------------------------------------------------------------- if ( HYA_ != NULL ) HYPRE_IJMatrixDestroy(HYA_); size = localEndRow_ - localStartRow_ + 1; if (localStartCol_ == -1) HYPRE_IJMatrixCreate(comm_, localStartRow_-1, localEndRow_-1, localStartRow_-1, localEndRow_-1, &HYA_); else HYPRE_IJMatrixCreate(comm_, localStartRow_-1, localEndRow_-1, localStartCol_, localEndCol_, &HYA_); HYPRE_IJMatrixSetObjectType(HYA_, HYPRE_PARCSR); //------------------------------------------------------------------- // allocate space for storing the matrix coefficient //------------------------------------------------------------------- if ( colValues_ != NULL ) { int nrows = localEndRow_ - localStartRow_ + 1; for ( i = 0; i < nrows; i++ ) if ( colValues_[i] != NULL ) delete [] colValues_[i]; delete [] colValues_; } colValues_ = NULL; colValues_ = new double*[size]; for ( i = 0; i < size; i++ ) { if ( rowLengths_[i] > 0 ) colValues_[i] = new double[rowLengths_[i]]; for ( j = 0; j < rowLengths_[i]; j++ ) colValues_[i][j] = 0.0; } //------------------------------------------------------------------- // reset system flags //------------------------------------------------------------------- systemAssembled_ = 0; schurReductionCreated_ = 0; projectCurrSize_ = 0; normalEqnFlag_ &= 5; if ( HYnormalA_ != NULL ) { HYPRE_IJMatrixDestroy(HYnormalA_); HYnormalA_ = NULL; } //------------------------------------------------------------------- // reset fedata //------------------------------------------------------------------- #ifdef HAVE_MLI if ( feData_ != NULL ) { if (haveFEData_ == 1) HYPRE_LSI_MLIFEDataDestroy(feData_); else if (haveFEData_ == 2) HYPRE_LSI_MLISFEIDestroy(feData_); feData_ = NULL; if ( MLI_NodalCoord_ != NULL ) delete [] MLI_NodalCoord_; if ( MLI_EqnNumbers_ != NULL ) delete [] MLI_EqnNumbers_; MLI_NodalCoord_ = NULL; MLI_EqnNumbers_ = NULL; MLI_NumNodes_ = 0; } #endif //------------------------------------------------------------------- // diagnostic message //------------------------------------------------------------------- if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 3 ) printf("%4d : HYPRE_LSC::leaving resetMatrix.\n", mypid_); return (0); } //*************************************************************************** // new function to reset vectors independently //--------------------------------------------------------------------------- int HYPRE_LinSysCore::resetRHSVector(double setValue) { int i, localNRows, *cols; double *vals; //------------------------------------------------------------------- // diagnostic message //------------------------------------------------------------------- if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 3 ) printf("%4d : HYPRE_LSC::entering resetRHSVector.\n",mypid_); //------------------------------------------------------------------- // reset right hand side vectors //------------------------------------------------------------------- if ( HYbs_ != NULL ) { localNRows = localEndRow_ - localStartRow_ + 1; cols = new int[localNRows]; vals = new double[localNRows]; for (i = 0; i < localNRows; i++) { cols[i] = localStartRow_ + i - 1; vals[i] = setValue; } for (i = 0; i < numRHSs_; i++) if ( HYbs_[i] != NULL ) HYPRE_IJVectorSetValues(HYbs_[i], localNRows, (const int *) cols, (const double *) vals); delete [] cols; delete [] vals; } normalEqnFlag_ &= 3; if ( HYnormalB_ != NULL ) { HYPRE_IJVectorDestroy(HYnormalB_); HYnormalB_ = NULL; } //------------------------------------------------------------------- // diagnostic message //------------------------------------------------------------------- if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 3 ) printf("%4d : HYPRE_LSC::leaving resetRHSVector.\n",mypid_); return (0); } //*************************************************************************** // add nonzero entries into the matrix data structure (not in LSC but needed) //--------------------------------------------------------------------------- int HYPRE_LinSysCore::sumIntoSystemMatrix(int row, int numValues, const double* values, const int* scatterIndices) { int i, j, index, colIndex, localRow; //------------------------------------------------------------------- // diagnostic message for high output level only //------------------------------------------------------------------- if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 5 ) { printf("%4d : HYPRE_LSC::entering sumIntoSystemMatrix.\n",mypid_); printf("%4d : row number = %d.\n", mypid_, row); if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 6 ) for ( i = 0; i < numValues; i++ ) printf(" %4d : row,col = %d %d, data = %e\n", mypid_, row+1, scatterIndices[i]+1, values[i]); } //------------------------------------------------------------------- // error checking //------------------------------------------------------------------- if ( systemAssembled_ == 1 ) { printf("%4d : sumIntoSystemMatrix ERROR : matrix already assembled\n", mypid_); exit(1); } if ( row < localStartRow_ || row > localEndRow_ ) { printf("%4d : sumIntoSystemMatrix ERROR : invalid row number %d.\n", mypid_,row); exit(1); } localRow = row - localStartRow_; if ( numValues > rowLengths_[localRow] ) { printf("%4d : sumIntoSystemMatrix ERROR : row size too large.\n",mypid_); exit(1); } //------------------------------------------------------------------- // load the local matrix //------------------------------------------------------------------- for ( i = 0; i < numValues; i++ ) { colIndex = scatterIndices[i]; index = hypre_BinarySearch(colIndices_[localRow], colIndex, rowLengths_[localRow]); if ( index < 0 ) { printf("%4d : sumIntoSystemMatrix ERROR - loading column",mypid_); printf(" that has not been declared before - %d.\n",colIndex); for ( j = 0; j < rowLengths_[localRow]; j++ ) printf(" available column index = %d\n", colIndices_[localRow][j]); exit(1); } colValues_[localRow][index] += values[i]; } #ifdef HAVE_AMGE HYPRE_LSI_AMGePutRow(row,numValues,(double*) values,(int*)scatterIndices); #endif //------------------------------------------------------------------- // diagnostic message //------------------------------------------------------------------- if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 5 ) printf("%4d : HYPRE_LSC::leaving sumIntoSystemMatrix.\n",mypid_); return (0); } //*************************************************************************** // add nonzero entries into the matrix data structure //--------------------------------------------------------------------------- int HYPRE_LinSysCore::sumIntoSystemMatrix(int numPtRows, const int* ptRows, int numPtCols, const int* ptCols, const double* const* values) { int i, j, k, index, colIndex, localRow, orderFlag=0; int *indptr, rowLeng, useOld; double *valptr, *auxValues; //------------------------------------------------------------------- // diagnostic message for high output level only //------------------------------------------------------------------- if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 5 ) { printf("%4d : HYPRE_LSC::entering sumIntoSystemMatrix(2).\n",mypid_); if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 6 ) { for ( i = 0; i < numPtRows; i++ ) { localRow = ptRows[i] - localStartRow_ + 1; for ( j = 0; j < numPtCols; j++ ) printf(" %4d : row,col,val = %8d %8d %e\n",mypid_, ptRows[i]+1, ptCols[j]+1, values[i][j]); } } } //------------------------------------------------------------------- // error checking //------------------------------------------------------------------- if ( systemAssembled_ == 1 ) { printf("sumIntoSystemMatrix ERROR : matrix already assembled\n"); exit(1); } if (FEI_mixedDiagFlag_ && FEI_mixedDiag_ == NULL) { FEI_mixedDiag_ = new double[localEndRow_-localStartRow_+1]; for ( i = 0; i < localEndRow_-localStartRow_+1; i++ ) FEI_mixedDiag_[i] = 0.0; } //------------------------------------------------------------------- // load the local matrix //------------------------------------------------------------------- useOld = orderFlag = 0; if ( numPtCols == nStored_ && storedIndices_ != NULL ) { for ( i = 0; i < numPtCols; i++ ) if ( storedIndices_[i] != ptCols[i] ) break; if ( i == numPtCols ) useOld = 1; } if ( ! useOld ) { for ( i = 1; i < numPtCols; i++ ) if ( ptCols[i] < ptCols[i-1] ) { orderFlag = 1; break; } if ( orderFlag == 1 ) { if ( numPtCols != nStored_ ) { if ( storedIndices_ != NULL ) delete [] storedIndices_; if ( auxStoredIndices_ != NULL ) delete [] auxStoredIndices_; storedIndices_ = new int[numPtCols]; auxStoredIndices_ = new int[numPtCols]; nStored_ = numPtCols; } for ( i = 0; i < numPtCols; i++ ) { storedIndices_[i] = ptCols[i]; auxStoredIndices_[i] = i; } HYPRE_LSI_qsort1a(storedIndices_,auxStoredIndices_,0,numPtCols-1); for ( i = 0; i < numPtCols; i++ ) storedIndices_[i] = ptCols[i]; } else { if ( storedIndices_ != NULL ) delete [] storedIndices_; if ( auxStoredIndices_ != NULL ) delete [] auxStoredIndices_; storedIndices_ = NULL; auxStoredIndices_ = NULL; nStored_ = 0; } } for ( i = 0; i < numPtRows; i++ ) { localRow = ptRows[i] - localStartRow_ + 1; indptr = colIndices_[localRow]; valptr = colValues_[localRow]; rowLeng = rowLengths_[localRow]; auxValues = (double *) values[i]; index = 0; for ( j = 0; j < numPtCols; j++ ) { if ( storedIndices_ ) colIndex = storedIndices_[auxStoredIndices_[j]] + 1; else colIndex = ptCols[j] + 1; if (FEI_mixedDiag_ && ptRows[i] == ptCols[j] && numPtRows > 1) FEI_mixedDiag_[ptCols[numPtCols-1]-localStartRow_+1] += auxValues[j]; while ( index < rowLeng && indptr[index] < colIndex ) index++; if ( index >= rowLeng ) { printf("%4d : sumIntoSystemMatrix ERROR - loading column",mypid_); printf(" that has not been declared before - %d (row=%d).\n", colIndex, ptRows[i]+1); for ( k = 0; k < rowLeng; k++ ) printf(" available column index = %d\n", indptr[k]); exit(1); } if ( auxStoredIndices_ ) valptr[index] += auxValues[auxStoredIndices_[j]]; else valptr[index] += auxValues[j]; } } #ifdef HAVE_AMGE HYPRE_LSI_AMGePutRow(localRow,numPtCols,(double*) values[i],(int*)ptCols); #endif //------------------------------------------------------------------- // diagnostic message //------------------------------------------------------------------- if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 5 ) printf("%4d : HYPRE_LSC::leaving sumIntoSystemMatrix(2).\n",mypid_); return (0); } //*************************************************************************** // add nonzero entries into the matrix data structure //--------------------------------------------------------------------------- int HYPRE_LinSysCore::sumIntoSystemMatrix(int numPtRows, const int* ptRows, int numPtCols, const int* ptCols, int numBlkRows, const int* blkRows, int numBlkCols, const int* blkCols, const double* const* values) { (void) numBlkRows; (void) blkRows; (void) numBlkCols; (void) blkCols; return(sumIntoSystemMatrix(numPtRows, ptRows, numPtCols, ptCols, values)); } //*************************************************************************** // put nonzero entries into the matrix data structure //--------------------------------------------------------------------------- int HYPRE_LinSysCore::putIntoSystemMatrix(int numPtRows, const int* ptRows, int numPtCols, const int* ptCols, const double* const* values) { int i, j, localRow, newLeng, *tempInd, colIndex, index, localNRows; int sortFlag; double *tempVal; //------------------------------------------------------------------- // diagnostic message for high output level only //------------------------------------------------------------------- if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 5 ) printf("%4d : HYPRE_LSC::entering putIntoSystemMatrix.\n",mypid_); //------------------------------------------------------------------- // error checking //------------------------------------------------------------------- if ( systemAssembled_ == 1 ) { printf("putIntoSystemMatrix ERROR : matrix already assembled\n"); exit(1); } if ( numPtRows <= 0 || numPtCols <= 0 ) { printf("%4d : putIntoSystemMatrix ERROR : invalid numPt.\n",mypid_); return (-1); } //------------------------------------------------------------------- // in case the matrix is loaded from scratch //------------------------------------------------------------------- if ( rowLengths_ == NULL && colIndices_ == NULL ) { localNRows = localEndRow_ - localStartRow_ + 1; if ( localNRows > 0 ) { rowLengths_ = new int[localNRows]; colIndices_ = new int*[localNRows]; colValues_ = new double*[localNRows]; } for ( i = 0; i < localNRows; i++ ) { rowLengths_[i] = 0; colIndices_[i] = NULL; colValues_[i] = NULL; } } //------------------------------------------------------------------- // first adjust memory allocation (conservative) //------------------------------------------------------------------- for ( i = 0; i < numPtRows; i++ ) { localRow = ptRows[i] - localStartRow_ + 1; if ( rowLengths_[localRow] > 0 ) { newLeng = rowLengths_[localRow] + numPtCols; tempInd = new int[newLeng]; tempVal = new double[newLeng]; for ( j = 0; j < rowLengths_[localRow]; j++ ) { tempVal[j] = colValues_[localRow][j]; tempInd[j] = colIndices_[localRow][j]; } delete [] colValues_[localRow]; delete [] colIndices_[localRow]; colValues_[localRow] = tempVal; colIndices_[localRow] = tempInd; } else { if ( colIndices_[localRow] != NULL ) delete [] colIndices_[localRow]; if ( colValues_[localRow] != NULL ) delete [] colValues_[localRow]; colIndices_[localRow] = new int[numPtCols]; colValues_[localRow] = new double[numPtCols]; } } //------------------------------------------------------------------- // load the local matrix //------------------------------------------------------------------- for ( i = 0; i < numPtRows; i++ ) { localRow = ptRows[i] - localStartRow_ + 1; if ( rowLengths_[localRow] > 0 ) { newLeng = rowLengths_[localRow]; tempInd = colIndices_[localRow]; tempVal = colValues_[localRow]; for ( j = 0; j < numPtCols; j++ ) { colIndex = ptCols[j] + 1; index = hypre_BinarySearch(tempInd, colIndex, newLeng); if ( index < 0 ) { tempInd[rowLengths_[localRow]] = colIndex; tempVal[rowLengths_[localRow]++] = values[i][j]; } else tempVal[index] = values[i][j]; } newLeng = rowLengths_[localRow]; hypre_qsort1( tempInd, tempVal, 0, newLeng-1 ); } else { tempInd = colIndices_[localRow]; tempVal = colValues_[localRow]; for ( j = 0; j < numPtCols; j++ ) { colIndex = ptCols[j] + 1; tempInd[j] = colIndex; tempVal[j] = values[i][j]; } sortFlag = 0; for ( j = 1; j < numPtCols; j++ ) if ( tempInd[j] < tempInd[j-1] ) sortFlag = 1; rowLengths_[localRow] = numPtCols; if ( sortFlag == 1 ) hypre_qsort1( tempInd, tempVal, 0, numPtCols-1 ); } } //------------------------------------------------------------------- // diagnostic message //------------------------------------------------------------------- if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 5 ) printf("%4d : HYPRE_LSC::leaving putIntoSystemMatrix.\n",mypid_); return (0); } //*************************************************************************** // get the length of the local row //--------------------------------------------------------------------------- int HYPRE_LinSysCore::getMatrixRowLength(int row, int& length) { int *colInd, rowLeng; double *colVal; HYPRE_ParCSRMatrix A_csr; if ((row+1) < localStartRow_ || (row+1) > localEndRow_) return (-1); if ( systemAssembled_ == 0 ) { if ( rowLengths_ == NULL ) return (-1); length = rowLengths_[row+1]; } else { HYPRE_IJMatrixGetObject(currA_, (void **) &A_csr); HYPRE_ParCSRMatrixGetRow(A_csr,row,&rowLeng,&colInd,&colVal); length = rowLeng; HYPRE_ParCSRMatrixRestoreRow(A_csr,row,&rowLeng,&colInd,&colVal); } return (0); } //*************************************************************************** // get the data of a local row //--------------------------------------------------------------------------- int HYPRE_LinSysCore::getMatrixRow(int row, double* coefs, int* indices, int len, int& rowLength) { int i, rowIndex, rowLeng, *colInd, minLeng; double *colVal; HYPRE_ParCSRMatrix A_csr; if ( systemAssembled_ == 0 ) { rowIndex = row + 1; if (rowIndex < localStartRow_ || rowIndex > localEndRow_) return (-1); if ( rowLengths_ == NULL || colIndices_ == NULL ) return (-1); rowLeng = rowLengths_[rowIndex]; colInd = colIndices_[rowIndex]; colVal = colValues_[rowIndex]; minLeng = len; if ( minLeng > rowLeng ) minLeng = rowLeng; for( i = 0; i < minLeng; i++ ) { coefs[i] = colVal[i]; indices[i] = colInd[i]; } rowLength = rowLeng; } else { HYPRE_IJMatrixGetObject(currA_, (void **) &A_csr); rowIndex = row + 1; if (rowIndex < localStartRow_ || rowIndex > localEndRow_) return (-1); rowIndex--; HYPRE_ParCSRMatrixGetRow(A_csr,rowIndex,&rowLeng,&colInd,&colVal); minLeng = len; if ( minLeng > rowLeng ) minLeng = rowLeng; for( i = 0; i < minLeng; i++ ) { coefs[i] = colVal[i]; indices[i] = colInd[i]; } HYPRE_ParCSRMatrixRestoreRow(A_csr,rowIndex,&rowLeng,&colInd,&colVal); rowLength = rowLeng; } return (0); } //*************************************************************************** // input is 1-based, but HYPRE vectors are 0-based //--------------------------------------------------------------------------- int HYPRE_LinSysCore::sumIntoRHSVector(int num, const double* values, const int* indices) { int i, *localInds; //------------------------------------------------------------------- // diagnostic message //------------------------------------------------------------------- if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 5 ) { printf("%4d : HYPRE_LSC::entering sumIntoRHSVector.\n", mypid_); if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 6 ) { for ( i = 0; i < num; i++ ) printf("%d : sumIntoRHSVector - %d = %e.\n", mypid_, indices[i], values[i]); } } //------------------------------------------------------------------- // change the incoming indices to 0-based before loading //------------------------------------------------------------------- localInds = new int[num]; for ( i = 0; i < num; i++ ) // change to 0-based { #if defined(NOFEI) if ( indices[i] >= localStartRow_ && indices[i] <= localEndRow_ ) localInds[i] = indices[i] - 1; #else if ((indices[i]+1) >= localStartRow_ && (indices[i]+1) <= localEndRow_) localInds[i] = indices[i]; #endif else { printf("%d : sumIntoRHSVector ERROR - index %d out of range.\n", mypid_, indices[i]); exit(1); } } HYPRE_IJVectorAddToValues(HYb_, num, (const int *) localInds, (const double *) values); delete [] localInds; //------------------------------------------------------------------- // diagnostic message //------------------------------------------------------------------- if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 5 ) printf("%4d : HYPRE_LSC::leaving sumIntoRHSVector.\n", mypid_); return (0); } //*************************************************************************** // This function scatters (puts) values into the linear-system's // currently selected RHS vector. // num is how many values are being passed, // indices holds the global 0-based 'row-numbers' into which the values go, // and values holds the actual coefficients to be scattered. //--------------------------------------------------------------------------- int HYPRE_LinSysCore::putIntoRHSVector(int num, const double* values, const int* indices) { int i, index; if ((numRHSs_ == 0) && (HYb_ == NULL)) return (0); for ( i = 0; i < num; i++ ) { index = indices[i]; if (index < localStartRow_-1 || index >= localEndRow_) continue; HYPRE_IJVectorSetValues(HYb_, 1, (const int *) &index, (const double *) &(values[i])); } return (0); } //*************************************************************************** // This function gets values from the linear-system's // currently selected RHS vector. // num is how many values are being requested, // indices holds the requested global 0-based 'row-numbers', // and values will hold the returned coefficients. //--------------------------------------------------------------------------- int HYPRE_LinSysCore::getFromRHSVector(int num, double* values, const int* indices) { int i, index; if ((numRHSs_ == 0) && (HYb_ == NULL)) return (0); for ( i = 0; i < num; i++ ) { index = indices[i]; if (index < localStartRow_-1 || index >= localEndRow_) continue; HYPRE_IJVectorGetValues(HYb_,1,&index,&(values[i])); } return (0); } //*************************************************************************** // start assembling the matrix into its internal format //--------------------------------------------------------------------------- int HYPRE_LinSysCore::matrixLoadComplete() { int i, j, numLocalEqns, leng, eqnNum, nnz, *newColInd=NULL; int maxRowLeng, newLeng, rowSize, *colInd, nrows; double *newColVal=NULL, *colVal, value; char fname[40]; FILE *fp; HYPRE_ParCSRMatrix A_csr; HYPRE_ParVector b_csr; HYPRE_SlideReduction *slideObj; //------------------------------------------------------------------- // diagnostic message //------------------------------------------------------------------- if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 3 ) printf("%4d : HYPRE_LSC::entering matrixLoadComplete.\n",mypid_); //------------------------------------------------------------------- // Write MLI FEData information to a file //------------------------------------------------------------------- #ifdef HAVE_MLI if ( haveFEData_ && feData_ != NULL ) { char filename[100]; if ( (HYOutputLevel_ & HYFEI_PRINTFEINFO) ) { strcpy( filename, "fedata" ); HYPRE_LSI_MLIFEDataWriteToFile( feData_, filename ); } } #endif if ( matrixPartition_ == 2 ) matrixPartition_ = 1; //------------------------------------------------------------------- // if the matrix has not been assembled or it has been reset //------------------------------------------------------------------- if ( systemAssembled_ != 1 ) { //---------------------------------------------------------------- // set system matrix initialization parameters //---------------------------------------------------------------- HYPRE_IJMatrixSetRowSizes(HYA_, rowLengths_); HYPRE_IJMatrixInitialize(HYA_); //---------------------------------------------------------------- // load the matrix stored locally to a HYPRE matrix //---------------------------------------------------------------- numLocalEqns = localEndRow_ - localStartRow_ + 1; if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 4 ) { printf("%4d : HYPRE_LSC::matrixLoadComplete - NEqns = %d.\n", mypid_, numLocalEqns); } maxRowLeng = 0; for ( i = 0; i < numLocalEqns; i++ ) { leng = rowLengths_[i]; if ( leng > maxRowLeng ) maxRowLeng = leng; } if ( maxRowLeng > 0 ) { newColInd = new int[maxRowLeng]; newColVal = new double[maxRowLeng]; } nnz = 0; for ( i = 0; i < numLocalEqns; i++ ) { eqnNum = localStartRow_ - 1 + i; leng = rowLengths_[i]; newLeng = 0; for ( j = 0; j < leng; j++ ) { if ( habs(colValues_[i][j]) >= truncThresh_ ) { newColInd[newLeng] = colIndices_[i][j] - 1; newColVal[newLeng++] = colValues_[i][j]; } } HYPRE_IJMatrixSetValues(HYA_, 1, &newLeng,(const int *) &eqnNum, (const int *) newColInd, (const double *) newColVal); delete [] colValues_[i]; if ( memOptimizerFlag_ != 0 ) delete [] colIndices_[i]; nnz += newLeng; } if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 3 ) { printf("%4d : HYPRE_LSC::matrixLoadComplete - nnz = %d.\n", mypid_, nnz); } delete [] colValues_; colValues_ = NULL; if ( memOptimizerFlag_ != 0 ) { delete [] colIndices_; colIndices_ = NULL; } if ( maxRowLeng > 0 ) { delete [] newColInd; delete [] newColVal; } HYPRE_IJMatrixAssemble(HYA_); systemAssembled_ = 1; projectCurrSize_ = 0; currA_ = HYA_; currB_ = HYb_; currX_ = HYx_; currR_ = HYr_; if (slideObj_ != NULL) { slideObj = (HYPRE_SlideReduction *) slideObj_; delete slideObj; } slideObj_ = NULL; } //------------------------------------------------------------------- // diagnostics : print the matrix and rhs to files //------------------------------------------------------------------- if ( (HYOutputLevel_ & HYFEI_PRINTMAT) && (!(HYOutputLevel_ & HYFEI_PRINTREDMAT) ) ) { if ( HYOutputLevel_ & HYFEI_PRINTPARCSRMAT ) { printf("%4d : HYPRE_LSC::print the matrix/rhs to files(1)\n",mypid_); HYPRE_IJMatrixGetObject(HYA_, (void **) &A_csr); sprintf(fname, "HYPRE_Mat"); HYPRE_ParCSRMatrixPrint( A_csr, fname ); HYPRE_IJVectorGetObject(HYb_, (void **) &b_csr); sprintf(fname, "HYPRE_RHS"); HYPRE_ParVectorPrint( b_csr, fname ); } else { printf("%4d : HYPRE_LSC::print the matrix/rhs to files(2)\n",mypid_); HYPRE_IJMatrixGetObject(HYA_, (void **) &A_csr); sprintf(fname, "hypre_mat.out.%d",mypid_); fp = fopen(fname,"w"); nrows = localEndRow_ - localStartRow_ + 1; nnz = 0; for ( i = localStartRow_-1; i <= localEndRow_-1; i++ ) { HYPRE_ParCSRMatrixGetRow(A_csr,i,&rowSize,&colInd,&colVal); for ( j = 0; j < rowSize; j++ ) if ( colVal[j] != 0.0 ) nnz++; HYPRE_ParCSRMatrixRestoreRow(A_csr,i,&rowSize,&colInd,&colVal); } fprintf(fp, "%6d %7d \n", nrows, nnz); for ( i = localStartRow_-1; i <= localEndRow_-1; i++ ) { HYPRE_ParCSRMatrixGetRow(A_csr,i,&rowSize,&colInd,&colVal); for (j = 0; j < rowSize; j++) { if ( colVal[j] != 0.0 ) fprintf(fp, "%6d %6d %25.16e \n",i+1,colInd[j]+1,colVal[j]); } HYPRE_ParCSRMatrixRestoreRow(A_csr,i,&rowSize,&colInd,&colVal); } fclose(fp); sprintf(fname, "hypre_rhs.out.%d",mypid_); fp = fopen(fname,"w"); fprintf(fp, "%6d \n", nrows); for ( i = localStartRow_-1; i <= localEndRow_-1; i++ ) { HYPRE_IJVectorGetValues(HYb_, 1, &i, &value); fprintf(fp, "%6d %25.16e \n", i+1, value); } fclose(fp); MPI_Barrier(comm_); } if ( HYOutputLevel_ & HYFEI_STOPAFTERPRINT ) exit(1); } if (FEI_mixedDiagFlag_) { for ( i = 0; i < localEndRow_-localStartRow_+1; i++ ) { FEI_mixedDiag_[i] *= 0.125; if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 3 ) printf("Mixed diag %5d = %e\n", i, FEI_mixedDiag_[i]); } } //------------------------------------------------------------------- // diagnostic message //------------------------------------------------------------------- if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 3 ) printf("%4d : HYPRE_LSC::leaving matrixLoadComplete.\n",mypid_); return (0); } //*************************************************************************** // put nodal information //--------------------------------------------------------------------------- int HYPRE_LinSysCore::putNodalFieldData(int fieldID, int fieldSize, int* nodeNumbers, int numNodes, const double* data) { int i, j, **nodeFieldIDs, nodeFieldID, *procNRows, nRows, errCnt; int blockID, *blockIDs, *eqnNumbers, *iArray, newNumEdges; //int checkFieldSize; int *aleNodeNumbers, index, newNumNodes, numEdges; double *newData; if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 3 ) { printf("%4d : HYPRE_LSC::entering putNodalFieldData.\n",mypid_); if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 4 && mypid_ == 0 ) { printf(" putNodalFieldData : fieldSize = %d\n", fieldSize); printf(" putNodalFieldData : fieldID = %d\n", fieldID); printf(" putNodalFieldData : numNodes = %d\n", numNodes); } } //------------------------------------------------------------------- // This part is for loading the nodal coordinate information. // The node IDs in nodeNumbers are the one used in FEI (and thus // corresponds to the ones in the system matrix using lookup) //------------------------------------------------------------------- if ( fieldID == -3 || fieldID == -25333 ) { if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 5 ) { for ( i = 0; i < numNodes; i++ ) for ( j = 0; j < fieldSize; j++ ) printf("putNodalFieldData : %4d %2d = %e\n",i,j, data[i*fieldSize+j]); } if ( HYPreconID_ == HYMLI && lookup_ != NULL ) { blockIDs = (int *) lookup_->getElemBlockIDs(); blockID = blockIDs[0]; nodeFieldIDs = (int **) lookup_->getFieldIDsTable(blockID); nodeFieldID = nodeFieldIDs[0][0]; //checkFieldSize = lookup_->getFieldSize(nodeFieldID); //hypre_assert( checkFieldSize == fieldSize ); eqnNumbers = new int[numNodes]; newData = new double[numNodes*fieldSize]; newNumNodes = 0; for ( i = 0; i < numNodes*fieldSize; i++ ) newData[i] = -99999.9; for ( i = 0; i < numNodes; i++ ) { index = lookup_->getEqnNumber(nodeNumbers[i],nodeFieldID); /* ====== This should ultimately be taken out even for newer ale3d implementation =====*/ if ( index >= localStartRow_-1 && index < localEndRow_) { if ( newData[newNumNodes*fieldSize] == -99999.9 ) { for ( j = 0; j < fieldSize; j++ ) newData[newNumNodes*fieldSize+j] = data[i*fieldSize+j]; eqnNumbers[newNumNodes++] = index; } } } nRows = localEndRow_ - localStartRow_ + 1; if ( MLI_NodalCoord_ == NULL ) { MLI_EqnNumbers_ = new int[nRows/fieldSize]; for (i=0; i 0) printf("putNodalFieldData ERROR:incomplete nodal coordinates (%d %d).\n", errCnt, nRows); } else { if (nodeNumbers != NULL && numNodes != 0) { printf("putNodalFieldData WARNING : \n"); printf(" set nodeNumbers = NULL, set numNodes = 0.\n"); } nRows = localEndRow_ - localStartRow_ + 1; MLI_NodalCoord_ = new double[nRows]; for (i=0; i EdgeNodeList //------------------------------------------------------------------- if (fieldID == -4) { if ((HYOutputLevel_ & HYFEI_SPECIALMASK) >= 5) { for (i = 0; i < numNodes; i++) for (j = 0; j < fieldSize; j++) printf("putNodalFieldData : %4d %2d = %e\n",i,j, data[i*fieldSize+j]); } if (lookup_ != NULL && fieldSize == 2 && numNodes > 0) { blockIDs = (int *) lookup_->getElemBlockIDs(); blockID = blockIDs[0]; nodeFieldIDs = (int **) lookup_->getFieldIDsTable(blockID); nodeFieldID = nodeFieldIDs[0][0]; numEdges = numNodes; eqnNumbers = new int[numEdges]; iArray = new int[numEdges*fieldSize]; newNumEdges = 0; for (i = 0; i < numEdges; i++) { index = lookup_->getEqnNumber(nodeNumbers[i],nodeFieldID); if (index >= localStartRow_-1 && index < localEndRow_) { for (j = 0; j < fieldSize; j++) iArray[newNumEdges*fieldSize+j] = (int) data[i*fieldSize+j]; eqnNumbers[newNumEdges++] = index; } } nRows = localEndRow_ - localStartRow_ + 1; if (AMSData_.EdgeNodeList_ != NULL) hypre_TFree(AMSData_.EdgeNodeList_, HYPRE_MEMORY_HOST); AMSData_.EdgeNodeList_ = NULL; if (newNumEdges > 0) { AMSData_.numEdges_ = nRows; AMSData_.EdgeNodeList_ = hypre_CTAlloc(HYPRE_BigInt, nRows*fieldSize, HYPRE_MEMORY_HOST); for (i = 0; i < nRows*fieldSize; i++) AMSData_.EdgeNodeList_[i] = -99999; for (i = 0; i < newNumEdges; i++) { index = eqnNumbers[i] - localStartRow_ + 1; for (j = 0; j < fieldSize; j++ ) AMSData_.EdgeNodeList_[index*fieldSize+j] = iArray[i*fieldSize+j]; } errCnt = 0; for (i = 0; i < nRows*fieldSize; i++) if (AMSData_.EdgeNodeList_[i] == -99999) errCnt++; if (errCnt > 0) printf("putNodalFieldData ERROR:incomplete AMS edge vertex list\n"); } delete [] eqnNumbers; delete [] iArray; } } //------------------------------------------------------------------- // This part is for converting node numbers to equations as well as // for loading the nodal coordinate information // (stored in NodeNumbers, NodalCoord, numNodes, numLocalNodes) //------------------------------------------------------------------- if (fieldID == -5) { if ((HYOutputLevel_ & HYFEI_SPECIALMASK) >= 5) { for (i = 0; i < numNodes; i++) for (j = 0; j < fieldSize; j++) printf("putNodalFieldData : %4d %2d = %e\n",i,j, data[i*fieldSize+j]); } if (lookup_ != NULL && fieldSize == 3) { blockIDs = (int *) lookup_->getElemBlockIDs(); blockID = blockIDs[0]; nodeFieldIDs = (int **) lookup_->getFieldIDsTable(blockID); nodeFieldID = nodeFieldIDs[0][0]; if (AMSData_.NodeNumbers_ != NULL) hypre_TFree(AMSData_.NodeNumbers_, HYPRE_MEMORY_HOST); if (AMSData_.NodalCoord_ != NULL) hypre_TFree(AMSData_.NodalCoord_, HYPRE_MEMORY_HOST); AMSData_.NodeNumbers_ = NULL; AMSData_.NodalCoord_ = NULL; AMSData_.numNodes_ = 0; if (numNodes > 0) { AMSData_.numNodes_ = numNodes; AMSData_.numLocalNodes_ = localEndRow_ - localStartRow_ + 1; AMSData_.NodeNumbers_ = hypre_CTAlloc(HYPRE_BigInt, numNodes, HYPRE_MEMORY_HOST); AMSData_.NodalCoord_ = hypre_CTAlloc(HYPRE_Real, fieldSize*numNodes, HYPRE_MEMORY_HOST); for (i = 0; i < numNodes; i++) { index = lookup_->getEqnNumber(nodeNumbers[i],nodeFieldID); AMSData_.NodeNumbers_[i] = index; for (j = 0; j < fieldSize; j++) AMSData_.NodalCoord_[i*fieldSize+j] = data[i*fieldSize+j]; } } } } //------------------------------------------------------------------- // this is needed to set up the correct node equation map // (the FEI remaps the node IDs in the incoming nodeNumbers array. // to revert to the original ALE3D node numbers, it is passed in // here as data) //------------------------------------------------------------------- else if ( fieldID == -49773 ) { if ( HYPreconID_ == HYMLI && lookup_ != NULL ) { blockIDs = (int *) lookup_->getElemBlockIDs(); blockID = blockIDs[0]; nodeFieldIDs = (int **) lookup_->getFieldIDsTable(blockID); nodeFieldID = nodeFieldIDs[0][0]; //checkFieldSize = lookup_->getFieldSize(nodeFieldID); hypre_assert( fieldSize == 1 ); aleNodeNumbers = new int[numNodes]; eqnNumbers = new int[numNodes]; for ( i = 0; i < numNodes; i++ ) { aleNodeNumbers[i] = (int) data[i]; eqnNumbers[i] = lookup_->getEqnNumber(nodeNumbers[i],nodeFieldID); } procNRows = new int[numProcs_]; for ( i = 0; i < numProcs_; i++ ) procNRows[i] = 0; procNRows[mypid_] = localEndRow_; iArray = procNRows; procNRows = new int[numProcs_+1]; for ( i = 0; i <= numProcs_; i++ ) procNRows[i] = 0; MPI_Allreduce(iArray,&(procNRows[1]),numProcs_,MPI_INT,MPI_SUM,comm_); delete [] iArray; HYPRE_LSI_MLICreateNodeEqnMap(HYPrecon_, numNodes, aleNodeNumbers, eqnNumbers, procNRows); delete [] procNRows; delete [] eqnNumbers; delete [] aleNodeNumbers; } } //------------------------------------------------------------------- // This part is for initializing the nodal coordinates vectors // for AMS in the New Fashion which allows multiply-connected edges //------------------------------------------------------------------- if (fieldID == -100) { errCnt = 0; //USAGE: //FieldID=-100: Initialize space for vectors X,Y,Z for AMS //double *data_dummy; //memAllocDoubles( 1, &data_dummy, NULL); //lsc->putNodalFieldData(-100,1,globalOffsets,numProcs+1,data_dummy); //MPI_Comm_rank(comm, &mypid_); //MPI_Comm_size(comm, &numProcs_); //localStartRowAMSV_ = nodeNumbers[mypid_] + 1; //localEndRowAMSV_ = nodeNumbers[mypid_+1]; localStartRowAMSV_ = fieldSize; localEndRowAMSV_ = numNodes; MPI_Comm_rank(comm_, &mypid_); MPI_Comm_size(comm_, &numProcs_); errCnt += HYPRE_IJVectorCreate(comm_, localStartRowAMSV_, localEndRowAMSV_, &amsX_); errCnt += HYPRE_IJVectorCreate(comm_, localStartRowAMSV_, localEndRowAMSV_, &amsY_); errCnt += HYPRE_IJVectorCreate(comm_, localStartRowAMSV_, localEndRowAMSV_, &amsZ_); errCnt += HYPRE_IJVectorSetObjectType(amsX_, HYPRE_PARCSR); errCnt += HYPRE_IJVectorSetObjectType(amsY_, HYPRE_PARCSR); errCnt += HYPRE_IJVectorSetObjectType(amsZ_, HYPRE_PARCSR); errCnt += HYPRE_IJVectorInitialize(amsX_); errCnt += HYPRE_IJVectorInitialize(amsY_); errCnt += HYPRE_IJVectorInitialize(amsZ_); } if (fieldID == -101 || fieldID == -102 || fieldID == -103) { errCnt = 0; //------------------------------------------------------------------- // This part is for loading the nodal coordinates vectors // for AMS in the New Fashion which allows multiply-connected edges //------------------------------------------------------------------- //Usage //FieldID=-101,2,3 Put values for vectors X,Y,Z for AMS //lsc->putNodalFieldData(-101,1,nodeNumbers_dummy,numNodes,datax_dummy); //lsc->putNodalFieldData(-102,1,nodeNumbers_dummy,numNodes,datay_dummy); //lsc->putNodalFieldData(-103,1,nodeNumbers_dummy,numNodes,dataz_dummy); switch( fieldID ) { case( -101 ) : //errCnt += HYPRE_IJVectorSetValues(amsX_, numNodes, localInds, data); errCnt += HYPRE_IJVectorSetValues(amsX_, numNodes, nodeNumbers, data); break; case( -102 ) : errCnt += HYPRE_IJVectorSetValues(amsY_, numNodes, nodeNumbers, data); break; case( -103 ) : errCnt += HYPRE_IJVectorSetValues(amsZ_, numNodes, nodeNumbers, data); break; default : printf("%d : PutNodalFieldData, FieldID=-101,-102,-103, ERROR - FieldID %d out of range.\n", mypid_,fieldID); exit(1); break; } } if (fieldID == -200) { errCnt = 0; //USAGE //FieldID=-200: Initialize the Matrix G for AMS; //double *globalColOffsetsd; //memAllocDoubles( numProcs+1, &globalColOffsetsd, NULL); //for (int iproc=0;iprocputNodalFieldData(-200,numProcs+1,globalRowOffsets,numProcs+1,globalColOffsetsd); //memFree(&globalRowOffsets,&globalColOffsets,&globalColOffsetsd,NULL); if( amsG_ != NULL) errCnt += HYPRE_IJMatrixDestroy(amsG_); localStartRowAMSG_ = nodeNumbers[0]; localEndRowAMSG_ = nodeNumbers[1]; localStartColAMSG_ = int( data[0] ); localEndColAMSG_ = int( data[1] ); errCnt += HYPRE_IJMatrixCreate(comm_, localStartRowAMSG_, localEndRowAMSG_, localStartColAMSG_, localEndColAMSG_, &amsG_); errCnt += HYPRE_IJMatrixSetObjectType(amsG_, HYPRE_PARCSR); } if (fieldID == -201) { //USAGE //FieldID=-201: Set Row Sizes errCnt = 0; errCnt += HYPRE_IJMatrixSetRowSizes(amsG_, nodeNumbers); errCnt += HYPRE_IJMatrixInitialize(amsG_); } if (fieldID == -202) { //USAGE //FieldID=-202: Put Values into the GMatrix //lsc->putNodalFieldData(-201,eindices[iedge],iindicesr,isize,icoefsr); errCnt += HYPRE_IJMatrixSetValues(amsG_, 1, &numNodes, &fieldSize, nodeNumbers, data); } if (fieldID == -203) { //USAGE //FieldID=-203: Final Assembly of G Matrix //int *nodenumbers_dummy2; //double *data_dummy2; //memAllocInts( 1, &nodenumbers_dummy2, NULL); //memAllocDoubles( 1, &data_dummy2, NULL); //lsc->putNodalFieldData(-202,1,nodenumbers_dummy2,1,data_dummy2); //memFree( &nodenumbers_dummy2, &data_dummy2, NULL); errCnt = HYPRE_IJMatrixAssemble(amsG_); //this is also a good time to do this: errCnt += HYPRE_IJVectorAssemble(amsX_); errCnt += HYPRE_IJVectorAssemble(amsY_); errCnt += HYPRE_IJVectorAssemble(amsZ_); } // fieldID's -300, -301, -302, -303 are for calculating the D0 Matrix // This is purely for debugging. // The D0 Matrix maps nodes to edges if (fieldID == -300) { errCnt = 0; //USAGE //FieldID=-300: Initialize the Matrix D0 for AMS; //double *globalColOffsetsd; //memAllocDoubles( numProcs+1, &globalColOffsetsd, NULL); //for (int iproc=0;iprocputNodalFieldData(-200,numProcs+1,globalRowOffsets,numProcs+1,globalColOffsetsd); //memFree(&globalRowOffsets,&globalColOffsets,&globalColOffsetsd,NULL); if( amsD0_ != NULL) errCnt += HYPRE_IJMatrixDestroy(amsD0_); int localStartRowAMSD_ = nodeNumbers[0]; int localEndRowAMSD_ = nodeNumbers[1]; int localStartColAMSD_ = int( data[0] ); int localEndColAMSD_ = int( data[1] ); errCnt += HYPRE_IJMatrixCreate(comm_, localStartRowAMSD_, localEndRowAMSD_, localStartColAMSD_, localEndColAMSD_, &amsD0_); errCnt += HYPRE_IJMatrixSetObjectType(amsD0_, HYPRE_PARCSR); } if (fieldID == -301) { //USAGE //FieldID=-301: Set Row Sizes for the D0 Matrix errCnt = 0; errCnt += HYPRE_IJMatrixSetRowSizes(amsD0_, nodeNumbers); errCnt += HYPRE_IJMatrixInitialize(amsD0_); } if (fieldID == -302) { //USAGE //FieldID=-302: Put Values into the D0 Matrix //lsc->putNodalFieldData(-201,eindices[iedge],iindicesr,isize,icoefsr); errCnt += HYPRE_IJMatrixSetValues(amsD0_, 1, &numNodes, &fieldSize, nodeNumbers, data); } if (fieldID == -303) { //USAGE //FieldID=-303: Final Assembly of D0 Matrix //int *nodenumbers_dummy2; //double *data_dummy2; //memAllocInts( 1, &nodenumbers_dummy2, NULL); //memAllocDoubles( 1, &data_dummy2, NULL); //lsc->putNodalFieldData(-202,1,nodenumbers_dummy2,1,data_dummy2); //memFree( &nodenumbers_dummy2, &data_dummy2, NULL); errCnt = HYPRE_IJMatrixAssemble(amsD0_); bool printD0matrix = true; if(printD0matrix) { HYPRE_ParCSRMatrix D0_csr; HYPRE_IJMatrixGetObject(amsD0_, (void **) &D0_csr); HYPRE_ParCSRMatrixPrint(D0_csr, "D0.parmatrix"); } } // fieldID's -400, -401, -402, -403 are for calculating the D1 Matrix // This is purely for debugging. // The D1 Matrix maps edges to nodes if (fieldID == -400) { errCnt = 0; //USAGE //FieldID=-400: Initialize the Matrix D1 for AMS; //double *globalColOffsetsd; //memAllocDoubles( numProcs+1, &globalColOffsetsd, NULL); //for (int iproc=0;iprocputNodalFieldData(-200,numProcs+1,globalRowOffsets,numProcs+1,globalColOffsetsd); //memFree(&globalRowOffsets,&globalColOffsets,&globalColOffsetsd,NULL); if( amsD1_ != NULL) errCnt += HYPRE_IJMatrixDestroy(amsD1_); int localStartRowAMSD_ = nodeNumbers[0]; int localEndRowAMSD_ = nodeNumbers[1]; int localStartColAMSD_ = int( data[0] ); int localEndColAMSD_ = int( data[1] ); errCnt += HYPRE_IJMatrixCreate(comm_, localStartRowAMSD_, localEndRowAMSD_, localStartColAMSD_, localEndColAMSD_, &amsD1_); errCnt += HYPRE_IJMatrixSetObjectType(amsD1_, HYPRE_PARCSR); } if (fieldID == -401) { //USAGE //FieldID=-401: Set Row Sizes for the D1 Matrix errCnt = 0; errCnt += HYPRE_IJMatrixSetRowSizes(amsD1_, nodeNumbers); errCnt += HYPRE_IJMatrixInitialize(amsD1_); } if (fieldID == -402) { //USAGE //FieldID=-402: Put Values into the D1 Matrix //lsc->putNodalFieldData(-201,eindices[iedge],iindicesr,isize,icoefsr); errCnt += HYPRE_IJMatrixSetValues(amsD1_, 1, &numNodes, &fieldSize, nodeNumbers, data); } if (fieldID == -403) { //USAGE //FieldID=-403: Final Assembly of D1 Matrix //int *nodenumbers_dummy2; //double *data_dummy2; //memAllocInts( 1, &nodenumbers_dummy2, NULL); //memAllocDoubles( 1, &data_dummy2, NULL); //lsc->putNodalFieldData(-202,1,nodenumbers_dummy2,1,data_dummy2); //memFree( &nodenumbers_dummy2, &data_dummy2, NULL); errCnt = HYPRE_IJMatrixAssemble(amsD1_); bool printD1matrix = true; if(printD1matrix) { HYPRE_ParCSRMatrix D1_csr; HYPRE_IJMatrixGetObject(amsD1_, (void **) &D1_csr); HYPRE_ParCSRMatrixPrint(D1_csr, "D1.parmatrix"); } } if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 3 ) printf("%4d : HYPRE_LSC::leaving putNodalFieldData.\n",mypid_); return (0); } #if 0 /* ------------------------------------------------------ */ /* This section has been replaced due to changes in ale3d */ /* ------------------------------------------------------ */ int HYPRE_LinSysCore::putNodalFieldData(int fieldID, int fieldSize, int* nodeNumbers, int numNodes, const double* data) { int i, **nodeFieldIDs, nodeFieldID, numFields, *procNRows; int blockID, *blockIDs, *eqnNumbers, *iArray, checkFieldSize; int *aleNodeNumbers; if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 2 ) { printf("%4d : HYPRE_LSC::entering putNodalFieldData.\n",mypid_); if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 3 && mypid_ == 0 ) { printf(" putNodalFieldData : fieldSize = %d\n", fieldSize); printf(" putNodalFieldData : fieldID = %d\n", fieldID); printf(" putNodalFieldData : numNodes = %d\n", numNodes); } } //------------------------------------------------------------------- // This part is for loading the nodal coordinate information. // The node IDs in nodeNumbers are the one used in FEI (and thus // corresponds to the ones in the system matrix using lookup) //------------------------------------------------------------------- if ( fieldID == -3 || fieldID == -25333 ) { if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 4 ) { for ( int i = 0; i < numNodes; i++ ) for ( int j = 0; j < fieldSize; j++ ) printf("putNodalFieldData : %4d %2d = %e\n",i,j, data[i*fieldSize+j]); } if ( HYPreconID_ == HYMLI && lookup_ != NULL ) { blockIDs = (int *) lookup_->getElemBlockIDs(); blockID = blockIDs[0]; nodeFieldIDs = (int **) lookup_->getFieldIDsTable(blockID); nodeFieldID = nodeFieldIDs[0][0]; checkFieldSize = lookup_->getFieldSize(nodeFieldID); //hypre_assert( checkFieldSize == fieldSize ); eqnNumbers = new int[numNodes]; for ( i = 0; i < numNodes; i++ ) eqnNumbers[i] = lookup_->getEqnNumber(nodeNumbers[i],nodeFieldID); HYPRE_LSI_MLILoadNodalCoordinates(HYPrecon_, numNodes, checkFieldSize, eqnNumbers, fieldSize, (double *) data); delete [] eqnNumbers; } } //------------------------------------------------------------------- // this is needed to set up the correct node equation map // (the FEI remaps the node IDs in the incoming nodeNumbers array. // to revert to the original ALE3D node numbers, it is passed in // here as data) //------------------------------------------------------------------- else if ( fieldID == -49773 ) { if ( HYPreconID_ == HYMLI && lookup_ != NULL ) { blockIDs = (int *) lookup_->getElemBlockIDs(); blockID = blockIDs[0]; nodeFieldIDs = (int **) lookup_->getFieldIDsTable(blockID); nodeFieldID = nodeFieldIDs[0][0]; checkFieldSize = lookup_->getFieldSize(nodeFieldID); hypre_assert( fieldSize == 1 ); aleNodeNumbers = new int[numNodes]; eqnNumbers = new int[numNodes]; for ( i = 0; i < numNodes; i++ ) { aleNodeNumbers[i] = (int) data[i]; eqnNumbers[i] = lookup_->getEqnNumber(nodeNumbers[i],nodeFieldID); } procNRows = new int[numProcs_]; for ( i = 0; i < numProcs_; i++ ) procNRows[i] = 0; procNRows[mypid_] = localEndRow_; iArray = procNRows; procNRows = new int[numProcs_+1]; for ( i = 0; i <= numProcs_; i++ ) procNRows[i] = 0; MPI_Allreduce(iArray,&(procNRows[1]),numProcs_,MPI_INT,MPI_SUM, comm_); delete [] iArray; HYPRE_LSI_MLICreateNodeEqnMap(HYPrecon_, numNodes, aleNodeNumbers, eqnNumbers, procNRows); delete [] procNRows; delete [] eqnNumbers; delete [] aleNodeNumbers; } } if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 2 ) printf("%4d : HYPRE_LSC::leaving putNodalFieldData.\n",mypid_); return (0); } #endif //*************************************************************************** // This function must enforce an essential boundary condition on each local // equation in 'globalEqn'. This means, that the following modification // should be made to A and b, for each globalEqn: // // for(each local equation i){ // for(each column j in row i) { // if (i==j) b[i] = gamma/alpha; // else b[j] -= (gamma/alpha)*A[j,i]; // } // } // all of row 'globalEqn' and column 'globalEqn' in A should be zeroed, // except for 1.0 on the diagonal. //--------------------------------------------------------------------------- int HYPRE_LinSysCore::enforceEssentialBC(int* globalEqn, double* alpha, double* gamma1, int leng) { int i, j, k, localEqnNum, colIndex, rowSize, *colInd, *iarray; int numLocalRows, eqnNum, rowSize2, *colInd2, numLabels, *labels; int **i2array, count; double rhs_term, val, *colVal2, *colVal, **d2array; //------------------------------------------------------------------- // diagnostic message and error checking // (this function should be called before matrixLoadComplete) //------------------------------------------------------------------- if ( (HYOutputLevel_ & HYFEI_IMPOSENOBC) != 0 ) return 0; if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 5 ) printf("%4d : HYPRE_LSC::entering enforceEssentialBC.\n",mypid_); if ( systemAssembled_ ) { printf("enforceEssentialBC ERROR : system assembled already.\n"); exit(1); } //------------------------------------------------------------------- // if matrix partitioning is requested, do it. //------------------------------------------------------------------- numLocalRows = localEndRow_ - localStartRow_ + 1; if ( matrixPartition_ == 1 && HYPreconID_ == HYMLI ) { HYPRE_LSI_PartitionMatrix(numLocalRows,localStartRow_,rowLengths_, colIndices_,colValues_, &numLabels, &labels); HYPRE_LSI_MLILoadMaterialLabels(HYPrecon_, numLabels, labels); free( labels ); matrixPartition_ = 2; } //------------------------------------------------------------------- // examine each row individually //------------------------------------------------------------------- //**/================================================================ //**/ The following is for multiple right hand side (Mar 2009) if (mRHSFlag_ == 1 && currentRHS_ != 0 && mRHSNumGEqns_ > 0) { for( i = 0; i < leng; i++ ) { for ( j = 0; j < mRHSNumGEqns_; j++ ) if (mRHSGEqnIDs_[j] == globalEqn[i] && mRHSBCType_[j] == 1) break; if (j == mRHSNumGEqns_) { printf("%4d : HYPRE_LSC::enforceEssentialBC ERROR (1).\n",mypid_); return -1; } k = j; localEqnNum = globalEqn[i] + 1 - localStartRow_; if ( localEqnNum >= 0 && localEqnNum < numLocalRows ) { for ( j = 0; j < mRHSNEntries_[k]; j++ ) { rhs_term = gamma1[i] / alpha[i] * mRHSRowVals_[k][j]; eqnNum = mRHSRowInds_[k][j] - 1; HYPRE_IJVectorGetValues(HYb_,1, &eqnNum, &val); val -= rhs_term; HYPRE_IJVectorSetValues(HYb_, 1, (const int *) &eqnNum, (const double *) &rhs_term); } } // Set rhs for boundary point rhs_term = gamma1[i] / alpha[i]; eqnNum = globalEqn[i]; HYPRE_IJVectorSetValues(HYb_, 1, (const int *) &eqnNum, (const double *) &rhs_term); } } //**/================================================================ else { //**/============================================================= //**/ save the BC information if (mRHSFlag_ == 1) { if (mRHSNumGEqns_ == 0) { mRHSGEqnIDs_ = new int[leng]; mRHSNEntries_ = new int[leng]; mRHSBCType_ = new int[leng]; mRHSRowInds_ = new int*[leng]; mRHSRowVals_ = new double*[leng]; for (i = 0; i < leng; i++) mRHSRowInds_[i] = NULL; for (i = 0; i < leng; i++) mRHSRowVals_[i] = NULL; } else { iarray = mRHSGEqnIDs_; mRHSGEqnIDs_ = new int[mRHSNumGEqns_+leng]; for (i = 0; i < mRHSNumGEqns_; i++) mRHSGEqnIDs_[i] = iarray[i]; iarray = mRHSNEntries_; mRHSNEntries_ = new int[mRHSNumGEqns_+leng]; for (i = 0; i < mRHSNumGEqns_; i++) mRHSNEntries_[i] = iarray[i]; iarray = mRHSBCType_; mRHSBCType_ = new int[mRHSNumGEqns_+leng]; for (i = 0; i < mRHSNumGEqns_; i++) mRHSBCType_[i] = iarray[i]; i2array = mRHSRowInds_; mRHSRowInds_ = new int*[mRHSNumGEqns_+leng]; for (i = 0; i < mRHSNumGEqns_; i++) mRHSRowInds_[i] = i2array[i]; d2array = mRHSRowVals_; for (i = 0; i < mRHSNumGEqns_; i++) mRHSRowInds_[i] = i2array[i]; for (i = mRHSNumGEqns_; i < mRHSNumGEqns_+leng; i++) mRHSRowInds_[i] = NULL; mRHSRowVals_ = new double*[mRHSNumGEqns_+leng]; for (i = 0; i < mRHSNumGEqns_; i++) mRHSRowVals_[i] = d2array[i]; for (i = mRHSNumGEqns_; i < mRHSNumGEqns_+leng; i++) mRHSRowVals_[i] = NULL; } } //**/============================================================= for( i = 0; i < leng; i++ ) { localEqnNum = globalEqn[i] + 1 - localStartRow_; if ( localEqnNum >= 0 && localEqnNum < numLocalRows ) { rowSize = rowLengths_[localEqnNum]; colInd = colIndices_[localEqnNum]; colVal = colValues_[localEqnNum]; //=================================================== // store the information for multiple right hand side if (mRHSFlag_ == 1) { count = 0; for ( j = 0; j < rowSize; j++ ) { colIndex = colInd[j]; if (colIndex >= localStartRow_ && colIndex <= localEndRow_) { if ( (colIndex-1) != globalEqn[i]) { rowSize2 = rowLengths_[colIndex-localStartRow_]; colInd2 = colIndices_[colIndex-localStartRow_]; colVal2 = colValues_ [colIndex-localStartRow_]; for( k = 0; k < rowSize2; k++ ) { if (colInd2[k]-1 == globalEqn[i]) count++; break; } } } } if (count > 0) { mRHSBCType_[mRHSNumGEqns_] = 1; mRHSGEqnIDs_[mRHSNumGEqns_] = globalEqn[i]; mRHSNEntries_[mRHSNumGEqns_] = count; mRHSRowInds_[mRHSNumGEqns_] = new int[count]; mRHSRowVals_[mRHSNumGEqns_] = new double[count]; } count = 0; for ( j = 0; j < rowSize; j++ ) { colIndex = colInd[j]; if (colIndex >= localStartRow_ && colIndex <= localEndRow_) { if ( (colIndex-1) != globalEqn[i]) { rowSize2 = rowLengths_[colIndex-localStartRow_]; colInd2 = colIndices_[colIndex-localStartRow_]; colVal2 = colValues_ [colIndex-localStartRow_]; for( k = 0; k < rowSize2; k++ ) { if ( colInd2[k]-1 == globalEqn[i] ) { mRHSRowVals_[mRHSNumGEqns_][count] = colVal2[k]; mRHSRowInds_[mRHSNumGEqns_][count] = colIndex; count++; break; } } } } } mRHSNumGEqns_++; } //=================================================== for ( j = 0; j < rowSize; j++ ) { colIndex = colInd[j]; if ( colIndex-1 == globalEqn[i] ) colVal[j] = 1.0; else colVal[j] = 0.0; if ( colIndex >= localStartRow_ && colIndex <= localEndRow_) { if ( (colIndex-1) != globalEqn[i]) { rowSize2 = rowLengths_[colIndex-localStartRow_]; colInd2 = colIndices_[colIndex-localStartRow_]; colVal2 = colValues_ [colIndex-localStartRow_]; for( k = 0; k < rowSize2; k++ ) { if ( colInd2[k]-1 == globalEqn[i] ) { rhs_term = gamma1[i] / alpha[i] * colVal2[k]; eqnNum = colIndex - 1; HYPRE_IJVectorGetValues(HYb_,1,&eqnNum, &val); val -= rhs_term; HYPRE_IJVectorSetValues(HYb_,1,(const int *) &eqnNum, (const double *) &val); colVal2[k] = 0.0; break; } } } } }// end for(j= 5 ) printf("%4d : HYPRE_LSC::leaving enforceEssentialBC.\n",mypid_); return (0); } //*************************************************************************** // put in globalEqns should hold eqns that are owned locally, but which contain // column indices (the ones in colIndices) which are from remote equations // on which essential boundary-conditions need to be enforced. // This function will only make the modification if the above conditions // hold -- i.e., the equation is a locally-owned equation, and the column // index is NOT a locally owned equation. //--------------------------------------------------------------------------- int HYPRE_LinSysCore::enforceRemoteEssBCs(int numEqns, int* globalEqns, int** colIndices, int* colIndLen, double** coefs) { int i, j, k, numLocalRows, localEqnNum, rowLen, *colInd, eqnNum; int *iarray, **i2array, count; double bval, *colVal, rhs_term, **d2array; //------------------------------------------------------------------- // diagnostic message and error checking // (this function should be called before matrixLoadComplete) //------------------------------------------------------------------- if ( (HYOutputLevel_ & HYFEI_IMPOSENOBC) != 0 ) return 0; if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 5 ) printf("%4d : HYPRE_LSC::entering enforceRemoteEssBC.\n",mypid_); if ( systemAssembled_ ) { printf("enforceRemoteEssBC ERROR : system assembled already.\n"); exit(1); } //------------------------------------------------------------------- // examine each row individually //------------------------------------------------------------------- numLocalRows = localEndRow_ - localStartRow_ + 1; //============================================================ //**/ The following is for multiple right hand side (Mar 2009) if (mRHSFlag_ == 1 && currentRHS_ != 0 && mRHSNumGEqns_ > 0) { for( i = 0; i < numEqns; i++ ) { for ( j = 0; j < mRHSNumGEqns_; j++ ) if (mRHSGEqnIDs_[j] == globalEqns[i] && mRHSBCType_[j] == 2) break; if (j == mRHSNumGEqns_) { printf("%4d : HYPRE_LSC::enforceRemoteEssBCs ERROR (1).\n",mypid_); return -1; } k = j; localEqnNum = globalEqns[i] + 1 - localStartRow_; if ( localEqnNum < 0 || localEqnNum >= numLocalRows ) { continue; } eqnNum = globalEqns[i]; rowLen = mRHSNEntries_[k]; colInd = mRHSRowInds_[k]; colVal = mRHSRowVals_[k]; for ( j = 0; j < colIndLen[i]; j++) { for ( k = 0; k < rowLen; k++ ) { if (colInd[k]-1 == colIndices[i][j]) { rhs_term = colVal[k] * coefs[i][j]; HYPRE_IJVectorGetValues(HYb_,1,&eqnNum,&bval); bval -= rhs_term; HYPRE_IJVectorSetValues(HYb_, 1, (const int *) &eqnNum, (const double *) &bval); } } } } } //**/================================================================ else { //**/============================================================= //**/ save the BC information if (mRHSFlag_ == 1) { if (mRHSNumGEqns_ == 0) { mRHSGEqnIDs_ = new int[numEqns]; mRHSNEntries_ = new int[numEqns]; mRHSBCType_ = new int[numEqns]; mRHSRowInds_ = new int*[numEqns]; mRHSRowVals_ = new double*[numEqns]; for (i = 0; i < numEqns; i++) mRHSRowInds_[i] = NULL; for (i = 0; i < numEqns; i++) mRHSRowVals_[i] = NULL; } else { iarray = mRHSGEqnIDs_; mRHSGEqnIDs_ = new int[mRHSNumGEqns_+numEqns]; for (i = 0; i < mRHSNumGEqns_; i++) mRHSGEqnIDs_[i] = iarray[i]; iarray = mRHSNEntries_; mRHSNEntries_ = new int[mRHSNumGEqns_+numEqns]; for (i = 0; i < mRHSNumGEqns_; i++) mRHSNEntries_[i] = iarray[i]; iarray = mRHSBCType_; mRHSBCType_ = new int[mRHSNumGEqns_+numEqns]; for (i = 0; i < mRHSNumGEqns_; i++) mRHSBCType_[i] = iarray[i]; i2array = mRHSRowInds_; mRHSRowInds_ = new int*[mRHSNumGEqns_+numEqns]; for (i = 0; i < mRHSNumGEqns_; i++) mRHSRowInds_[i] = i2array[i]; d2array = mRHSRowVals_; for (i = 0; i < mRHSNumGEqns_; i++) mRHSRowInds_[i] = i2array[i]; for (i = mRHSNumGEqns_; i < mRHSNumGEqns_+numEqns; i++) mRHSRowInds_[i] = NULL; mRHSRowVals_ = new double*[mRHSNumGEqns_+numEqns]; for (i = 0; i < mRHSNumGEqns_; i++) mRHSRowVals_[i] = d2array[i]; for (i = mRHSNumGEqns_; i < mRHSNumGEqns_+numEqns; i++) mRHSRowVals_[i] = NULL; } } //**/============================================================= for( i = 0; i < numEqns; i++ ) { localEqnNum = globalEqns[i] + 1 - localStartRow_; if ( localEqnNum < 0 || localEqnNum >= numLocalRows ) { continue; } rowLen = rowLengths_[localEqnNum]; colInd = colIndices_[localEqnNum]; colVal = colValues_[localEqnNum]; eqnNum = globalEqns[i]; //=================================================== // store the information for multiple right hand side if (mRHSFlag_ == 1) { count = 0; for ( j = 0; j < colIndLen[i]; j++) { for ( k = 0; k < rowLen; k++ ) if (colInd[k]-1 == colIndices[i][j]) count++; } if (count > 0) { mRHSGEqnIDs_[mRHSNumGEqns_] = globalEqns[i]; mRHSBCType_[mRHSNumGEqns_] = 2; mRHSNEntries_[mRHSNumGEqns_] = count; mRHSRowInds_[mRHSNumGEqns_] = new int[count]; mRHSRowVals_[mRHSNumGEqns_] = new double[count]; } count = 0; for ( j = 0; j < colIndLen[i]; j++) { for ( k = 0; k < rowLen; k++ ) { if (colInd[k]-1 == colIndices[i][j]) { mRHSRowVals_[k][count] = colVal[k]; mRHSRowInds_[k][count] = colInd[k]; } } } } //=================================================== for ( j = 0; j < colIndLen[i]; j++) { for ( k = 0; k < rowLen; k++ ) { if (colInd[k]-1 == colIndices[i][j]) { rhs_term = colVal[k] * coefs[i][j]; HYPRE_IJVectorGetValues(HYb_,1,&eqnNum,&bval); bval -= rhs_term; HYPRE_IJVectorSetValues(HYb_, 1, (const int *) &eqnNum, (const double *) &bval); colVal[k] = 0.0; } } } } } //------------------------------------------------------------------- // diagnostic message //------------------------------------------------------------------- if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 5 ) printf("%4d : HYPRE_LSC::leaving enforceRemoteEssBC.\n",mypid_); return (0); } //*************************************************************************** //This function must enforce a natural or mixed boundary condition on the //equations in 'globalEqn'. This means that the following modification should //be made to A and b: // //A[globalEqn,globalEqn] += alpha/beta; //b[globalEqn] += gamma/beta; //--------------------------------------------------------------------------- int HYPRE_LinSysCore::enforceOtherBC(int* globalEqn, double* alpha, double* beta, double* gamma1, int leng) { int i, j, numLocalRows, localEqnNum, *colInd, rowSize, eqnNum; double val, *colVal, rhs_term; //------------------------------------------------------------------- // diagnostic message and error checking // (this function should be called before matrixLoadComplete) //------------------------------------------------------------------- if ( (HYOutputLevel_ & HYFEI_IMPOSENOBC) != 0 ) return 0; if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 5 ) printf("%4d : HYPRE_LSC::entering enforceOtherBC.\n",mypid_); if ( systemAssembled_ ) { printf("enforceOtherBC ERROR : system assembled already.\n"); exit(1); } //------------------------------------------------------------------- // examine each row individually //------------------------------------------------------------------- numLocalRows = localEndRow_ - localStartRow_ + 1; //============================================================ //**/ The following is for multiple right hand side (Mar 2009) if (mRHSFlag_ == 1 && currentRHS_ != 0) { for( i = 0; i < leng; i++ ) { localEqnNum = globalEqn[i] + 1 - localStartRow_; if ( localEqnNum < 0 || localEqnNum >= numLocalRows ) { continue; } eqnNum = globalEqn[i]; rhs_term = gamma1[i] / beta[i]; HYPRE_IJVectorGetValues(HYb_,1,&eqnNum,&val); val += rhs_term; HYPRE_IJVectorSetValues(HYb_, 1, (const int *) &eqnNum, (const double *) &val); } } //============================================================ else { for( i = 0; i < leng; i++ ) { localEqnNum = globalEqn[i] + 1 - localStartRow_; if ( localEqnNum < 0 || localEqnNum >= numLocalRows ) { continue; } rowSize = rowLengths_[localEqnNum]; colVal = colValues_[localEqnNum]; colInd = colIndices_[localEqnNum]; for ( j = 0; j < rowSize; j++) { if ((colInd[j]-1) == globalEqn[i]) { colVal[j] += alpha[i]/beta[i]; break; } } //now make the rhs modification. // need to fetch matrix and put it back before assembled eqnNum = globalEqn[i]; rhs_term = gamma1[i] / beta[i]; HYPRE_IJVectorGetValues(HYb_,1,&eqnNum,&val); val += rhs_term; HYPRE_IJVectorSetValues(HYb_, 1, (const int *) &eqnNum, (const double *) &val); } } //------------------------------------------------------------------- // diagnostic message //------------------------------------------------------------------- if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 5 ) printf("%4d : HYPRE_LSC::leaving enforceOtherBC.\n",mypid_); return (0); } //*************************************************************************** // put the pointer to the A matrix into the Data object //--------------------------------------------------------------------------- #ifndef NOFEI int HYPRE_LinSysCore::getMatrixPtr(Data& data) { (void) data; printf("%4d : HYPRE_LSC::getMatrixPtr ERROR - not implemented.\n",mypid_); exit(1); return (0); } #endif //*************************************************************************** // Overwrites the current internal matrix with a scaled copy of the // input argument. //--------------------------------------------------------------------------- #ifndef NOFEI int HYPRE_LinSysCore::copyInMatrix(double scalar, const Data& data) { int i; char *name; HYPRE_FEI_AMSData *auxAMSData; (void) scalar; name = data.getTypeName(); if (!strcmp(name, "ANN")) { maxwellANN_ = (HYPRE_ParCSRMatrix) data.getDataPtr(); } else if (!strcmp(name, "GEN")) { maxwellGEN_ = (HYPRE_ParCSRMatrix) data.getDataPtr(); } else if (!strcmp(name, "AMSBMATRIX")) { amsBetaPoisson_ = (HYPRE_ParCSRMatrix) data.getDataPtr(); } else if (!strcmp(name, "AMSData")) { auxAMSData = (HYPRE_FEI_AMSData *) data.getDataPtr(); if (AMSData_.NodeNumbers_ != NULL) hypre_TFree(AMSData_.NodeNumbers_, HYPRE_MEMORY_HOST); if (AMSData_.NodalCoord_ != NULL) hypre_TFree(AMSData_.NodalCoord_, HYPRE_MEMORY_HOST); AMSData_.NodeNumbers_ = NULL; AMSData_.NodalCoord_ = NULL; AMSData_.numNodes_ = auxAMSData->numNodes_; AMSData_.numLocalNodes_ = auxAMSData->numLocalNodes_; if (AMSData_.numNodes_ > 0) { AMSData_.NodeNumbers_ = hypre_CTAlloc(HYPRE_BigInt, AMSData_.numNodes_, HYPRE_MEMORY_HOST); AMSData_.NodalCoord_ = hypre_CTAlloc(HYPRE_Real, AMSData_.numNodes_*mlNumPDEs_, HYPRE_MEMORY_HOST); for (i = 0; i < AMSData_.numNodes_; i++) AMSData_.NodeNumbers_[i] = auxAMSData->NodeNumbers_[i]; for (i = 0; i < AMSData_.numNodes_*mlNumPDEs_; i++) AMSData_.NodalCoord_[i] = auxAMSData->NodalCoord_[i]; } } else { printf("%4d : HYPRE_LSC::copyInMatrix ERROR - invalid data.\n",mypid_); exit(1); } return (0); } #endif //*************************************************************************** //Passes out a scaled copy of the current internal matrix. //--------------------------------------------------------------------------- #ifndef NOFEI int HYPRE_LinSysCore::copyOutMatrix(double scalar, Data& data) { char *name; (void) scalar; name = data.getTypeName(); if (!strcmp(name, "A")) { data.setDataPtr((void *) HYA_); } else if (!strcmp(name, "AMSData")) { data.setDataPtr((void *) &AMSData_); } else { printf("HYPRE_LSC::copyOutMatrix ERROR - invalid command.\n"); exit(1); } return (0); } #endif //*************************************************************************** // add nonzero entries into the matrix data structure //--------------------------------------------------------------------------- #ifndef NOFEI int HYPRE_LinSysCore::sumInMatrix(double scalar, const Data& data) { (void) scalar; (void) data; printf("%4d : HYPRE_LSC::sumInMatrix ERROR - not implemented.\n",mypid_); exit(1); return (0); } #endif //*************************************************************************** // get the data pointer for the right hand side //--------------------------------------------------------------------------- #ifndef NOFEI int HYPRE_LinSysCore::getRHSVectorPtr(Data& data) { //------------------------------------------------------------------- // diagnostic message //------------------------------------------------------------------- if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 3 ) printf("%4d : HYPRE_LSC::entering getRHSVectorPtr.\n",mypid_); //------------------------------------------------------------------- // get the right hand side vector pointer //------------------------------------------------------------------- data.setTypeName("IJ_Vector"); data.setDataPtr((void*) HYb_); //------------------------------------------------------------------- // diagnostic message //------------------------------------------------------------------- if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 3 ) printf("%4d : HYPRE_LSC::leaving getRHSVectorPtr.\n",mypid_); return (0); } #endif //*************************************************************************** // copy the content of the incoming vector to the right hand side vector //--------------------------------------------------------------------------- #ifndef NOFEI int HYPRE_LinSysCore::copyInRHSVector(double scalar, const Data& data) { //------------------------------------------------------------------- // diagnostic message //------------------------------------------------------------------- if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 3 ) printf("%4d : HYPRE_LSC::entering copyInRHSVector.\n",mypid_); if (strcmp("IJ_Vector", data.getTypeName()) && strcmp("Sol_Vector", data.getTypeName())) { printf("copyInRHSVector: data's type string not compatible.\n"); exit(1); } //------------------------------------------------------------------- // copy the incoming vector to the internal right hand side //------------------------------------------------------------------- HYPRE_IJVector inVec = (HYPRE_IJVector) data.getDataPtr(); HYPRE_ParVector srcVec; HYPRE_ParVector destVec; HYPRE_IJVectorGetObject(inVec, (void **) &srcVec); if (!strcmp("Sol_Vector", data.getTypeName())) HYPRE_IJVectorGetObject(HYb_, (void **) &destVec); else HYPRE_IJVectorGetObject(HYx_, (void **) &destVec); HYPRE_ParVectorCopy(srcVec, destVec); if ( scalar != 1.0 ) HYPRE_ParVectorScale( scalar, destVec); // do not destroy the incoming vector //HYPRE_IJVectorDestroy(inVec); //------------------------------------------------------------------- // diagnostic message //------------------------------------------------------------------- if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 3 ) printf("%4d : HYPRE_LSC::leaving copyInRHSVector.\n",mypid_); return (0); } #endif //*************************************************************************** // create an ParVector and copy the right hand side to it (scaled) //--------------------------------------------------------------------------- #ifndef NOFEI int HYPRE_LinSysCore::copyOutRHSVector(double scalar, Data& data) { //------------------------------------------------------------------- // diagnostic message //------------------------------------------------------------------- if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 3 ) printf("%4d : HYPRE_LSC::entering copyOutRHSVector.\n",mypid_); //------------------------------------------------------------------- // extract the right hand side vector //------------------------------------------------------------------- HYPRE_IJVector newVector; HYPRE_IJVectorCreate(comm_, localStartRow_-1, localEndRow_-1, &newVector); HYPRE_IJVectorSetObjectType(newVector, HYPRE_PARCSR); HYPRE_IJVectorInitialize(newVector); HYPRE_IJVectorAssemble(newVector); HYPRE_ParVector Vec1; HYPRE_ParVector Vec2; HYPRE_IJVectorGetObject(HYb_, (void **) &Vec1); HYPRE_IJVectorGetObject(newVector, (void **) &Vec2); HYPRE_ParVectorCopy( Vec1, Vec2); if ( scalar != 1.0 ) HYPRE_ParVectorScale( scalar, Vec2); data.setTypeName("IJ_Vector"); data.setDataPtr((void*) Vec2); //------------------------------------------------------------------- // diagnostic message //------------------------------------------------------------------- if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 3 ) printf("%4d : HYPRE_LSC::leaving copyOutRHSVector.\n",mypid_); return (0); } #endif //*************************************************************************** // add the incoming ParCSR vector to the current right hand side (scaled) //--------------------------------------------------------------------------- #ifndef NOFEI int HYPRE_LinSysCore::sumInRHSVector(double scalar, const Data& data) { //------------------------------------------------------------------- // diagnostic message //------------------------------------------------------------------- if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 3 ) printf("%4d : HYPRE_LSC::entering sumInRHSVector.\n",mypid_); if (strcmp("IJ_Vector", data.getTypeName())) { printf("sumInRHSVector ERROR : data's type string not 'IJ_Vector'.\n"); exit(1); } //------------------------------------------------------------------- // add the incoming vector to the right hand side //------------------------------------------------------------------- HYPRE_IJVector inVec = (HYPRE_IJVector) data.getDataPtr(); HYPRE_ParVector xVec; HYPRE_ParVector yVec; HYPRE_IJVectorGetObject(inVec, (void **) &xVec); HYPRE_IJVectorGetObject(HYb_, (void **) &yVec); hypre_ParVectorAxpy(scalar,(hypre_ParVector*)xVec,(hypre_ParVector*)yVec); //------------------------------------------------------------------- // diagnostic message //------------------------------------------------------------------- if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 3 ) printf("%4d : HYPRE_LSC::leaving sumInRHSVector.\n",mypid_); return (0); } #endif //*************************************************************************** // deallocate an incoming IJ matrix //--------------------------------------------------------------------------- #ifndef NOFEI int HYPRE_LinSysCore::destroyMatrixData(Data& data) { //------------------------------------------------------------------- // diagnostic message //------------------------------------------------------------------- if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 3 ) printf("%4d : HYPRE_LSC::entering destroyMatrixData.\n",mypid_); if (strcmp("IJ_Matrix", data.getTypeName())) { printf("destroyMatrixData ERROR : data doesn't contain a IJ_Matrix.\n"); exit(1); } //------------------------------------------------------------------- // destroy the incoming matrix data //------------------------------------------------------------------- HYPRE_IJMatrix mat = (HYPRE_IJMatrix) data.getDataPtr(); HYPRE_IJMatrixDestroy(mat); //------------------------------------------------------------------- // diagnostic message //------------------------------------------------------------------- if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 3 ) printf("%4d : HYPRE_LSC::leaving destroyMatrixData.\n",mypid_); return (0); } #endif //*************************************************************************** // deallocate an incoming IJ vector //--------------------------------------------------------------------------- #ifndef NOFEI int HYPRE_LinSysCore::destroyVectorData(Data& data) { //------------------------------------------------------------------- // diagnostic message //------------------------------------------------------------------- if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 3 ) printf("%4d : HYPRE_LSC::entering destroyVectorData.\n",mypid_); if (strcmp("IJ_Vector", data.getTypeName())) { printf("destroyVectorData ERROR : data doesn't contain a IJ_Vector."); exit(1); } //------------------------------------------------------------------- // destroy the incoming vector data //------------------------------------------------------------------- HYPRE_IJVector vec = (HYPRE_IJVector) data.getDataPtr(); if ( vec != NULL ) HYPRE_IJVectorDestroy(vec); //------------------------------------------------------------------- // diagnostic message //------------------------------------------------------------------- if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 3 ) printf("%4d : HYPRE_LSC::leaving destroyVectorData.\n",mypid_); return (0); } #endif //*************************************************************************** // set number of right hand side vectors //--------------------------------------------------------------------------- int HYPRE_LinSysCore::setNumRHSVectors(int numRHSs, const int* rhsIDs) { //------------------------------------------------------------------- // diagnostic message //------------------------------------------------------------------- if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 3 ) { printf("%4d : HYPRE_LSC::entering setNumRHSVectors.\n",mypid_); printf("%4d : HYPRE_LSC::incoming numRHSs = %d\n",mypid_,numRHSs); for ( int i = 0; i < numRHSs_; i++ ) printf("%4d : HYPRE_LSC::incoming RHSIDs = %d\n",mypid_,rhsIDs[i]); } if (numRHSs < 0) { printf("setNumRHSVectors ERROR : numRHSs < 0.\n"); exit(1); } //------------------------------------------------------------------- // first destroy the existing right hand side vectors //------------------------------------------------------------------- if ( matrixVectorsCreated_ ) { if ( HYbs_ != NULL ) { for ( int i = 0; i < numRHSs_; i++ ) if ( HYbs_[i] != NULL ) HYPRE_IJVectorDestroy(HYbs_[i]); delete [] HYbs_; HYbs_ = NULL; } } if (numRHSs == 0) return (0); //------------------------------------------------------------------- // instantiate the right hand vectors //------------------------------------------------------------------- if ( matrixVectorsCreated_ ) { HYbs_ = new HYPRE_IJVector[numRHSs_]; for ( int i = 0; i < numRHSs_; i++ ) { HYPRE_IJVectorCreate(comm_, localStartRow_-1, localEndRow_-1, &(HYbs_[i])); HYPRE_IJVectorSetObjectType(HYbs_[i], HYPRE_PARCSR); HYPRE_IJVectorInitialize(HYbs_[i]); HYPRE_IJVectorAssemble(HYbs_[i]); } HYb_ = HYbs_[0]; } //------------------------------------------------------------------- // copy in the right hand side IDs //------------------------------------------------------------------- delete [] rhsIDs_; numRHSs_ = numRHSs; rhsIDs_ = new int[numRHSs_]; for ( int i = 0; i < numRHSs; i++ ) rhsIDs_[i] = rhsIDs[i]; //------------------------------------------------------------------- // diagnostic message //------------------------------------------------------------------- if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 3 ) printf("%4d : HYPRE_LSC::leaving setNumRHSVectors.\n",mypid_); return (0); } //*************************************************************************** // select a right hand side vector //--------------------------------------------------------------------------- int HYPRE_LinSysCore::setRHSID(int rhsID) { //------------------------------------------------------------------- // diagnostic message //------------------------------------------------------------------- if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 3 ) printf("%4d : HYPRE_LSC::setRHSID = %d.\n",mypid_,rhsID); //------------------------------------------------------------------- // set current right hand side vector ID //------------------------------------------------------------------- for( int i = 0; i < numRHSs_; i++ ) { if (rhsIDs_[i] == rhsID) { currentRHS_ = i; HYb_ = HYbs_[currentRHS_]; currB_ = HYb_; return (0); } } printf("setRHSID ERROR : rhsID %d not found.\n", rhsID); exit(1); return (0); } //*************************************************************************** // used for initializing the initial guess //--------------------------------------------------------------------------- int HYPRE_LinSysCore::putInitialGuess(const int* eqnNumbers, const double* values, int leng) { int i, *localInds, *iarray, *iarray2; //------------------------------------------------------------------- // diagnostic message //------------------------------------------------------------------- if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 3 ) printf("%4d : HYPRE_LSC::entering putInitalGuess.\n",mypid_); //------------------------------------------------------------------- // this is to create a FEI to HYPRE equation node map //------------------------------------------------------------------- if ( mapFromSolnFlag_ == 1 ) { if ( (mapFromSolnLeng_+leng) >= mapFromSolnLengMax_ ) { iarray = mapFromSolnList_; iarray2 = mapFromSolnList2_; mapFromSolnLengMax_ = mapFromSolnLengMax_ + 2 * leng; mapFromSolnList_ = new int[mapFromSolnLengMax_]; mapFromSolnList2_ = new int[mapFromSolnLengMax_]; for ( i = 0; i < mapFromSolnLeng_; i++ ) { mapFromSolnList_[i] = iarray[i]; mapFromSolnList2_[i] = iarray2[i]; } if ( iarray != NULL ) delete [] iarray; if ( iarray2 != NULL ) delete [] iarray2; } } localInds = new int[leng]; for ( i = 0; i < leng; i++ ) // change to 0-based { if ((eqnNumbers[i]+1) >= localStartRow_ && (eqnNumbers[i]+1) <= localEndRow_) localInds[i] = eqnNumbers[i]; else { printf("%d : putInitialGuess ERROR - index %d out of range\n", mypid_, eqnNumbers[i]); exit(1); } if ( mapFromSolnFlag_ == 1 ) { mapFromSolnList_[mapFromSolnLeng_] = eqnNumbers[i]; mapFromSolnList2_[mapFromSolnLeng_++] = (int) values[i]; } } HYPRE_IJVectorSetValues(HYx_, leng, (const int *) localInds, (const double *) values); delete [] localInds; //------------------------------------------------------------------- // inject the initial guess into reduced systems, if any //------------------------------------------------------------------- if ( schurReduction_ == 1 ) buildSchurInitialGuess(); //------------------------------------------------------------------- // diagnostic message //------------------------------------------------------------------- if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 3 ) printf("%4d : HYPRE_LSC::leaving putInitalGuess.\n",mypid_); return (0); } //*************************************************************************** // This is a modified function for version 1.5 // used for getting the solution out of the solver, and into the application //--------------------------------------------------------------------------- int HYPRE_LinSysCore::getSolution(double* answers,int leng) { int i, *equations; //------------------------------------------------------------------- // diagnostic message //------------------------------------------------------------------- if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 4 ) printf("%4d : HYPRE_LSC::entering getSolution.\n",mypid_); if (localStartCol_ == -1 && leng != (localEndRow_-localStartRow_+1)) { printf("%4d : HYPRE_LSC ERROR : getSolution: leng != numLocalRows.\n", mypid_); exit(1); } //------------------------------------------------------------------- // get the whole solution vector //------------------------------------------------------------------- equations = new int[leng]; if (localStartCol_ == -1) for ( i = 0; i < leng; i++ ) equations[i] = localStartRow_ + i - 1; else for ( i = 0; i < leng; i++ ) equations[i] = localStartCol_ + i; HYPRE_IJVectorGetValues(HYx_,leng,equations,answers); delete [] equations; //------------------------------------------------------------------- // diagnostic message //------------------------------------------------------------------- if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 4 ) printf("%4d : HYPRE_LSC::leaving getSolution.\n",mypid_); return (0); } //*************************************************************************** // used for getting the solution out of the solver, and into the application //--------------------------------------------------------------------------- int HYPRE_LinSysCore::getSolnEntry(int eqnNumber, double& answer) { double val; int equation; //------------------------------------------------------------------- // diagnostic message //------------------------------------------------------------------- if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 5 ) printf("%4d : HYPRE_LSC::entering getSolnEntry.\n",mypid_); //------------------------------------------------------------------- // get a single solution entry //------------------------------------------------------------------- equation = eqnNumber; // incoming 0-based index if (localStartCol_ == -1 && equation < localStartRow_-1 && equation > localEndRow_ ) { printf("%d : getSolnEntry ERROR - index out of range = %d.\n", mypid_, eqnNumber); exit(1); } HYPRE_IJVectorGetValues(HYx_,1,&equation,&val); answer = val; //------------------------------------------------------------------- // diagnostic message //------------------------------------------------------------------- if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 5 ) printf("%4d : HYPRE_LSC::leaving getSolnEntry.\n",mypid_); return (0); } //*************************************************************************** // select which Krylov solver to use //--------------------------------------------------------------------------- void HYPRE_LinSysCore::selectSolver(char* name) { //------------------------------------------------------------------- // diagnostic message //------------------------------------------------------------------- if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 3 ) { printf("%4d : HYPRE_LSC::entering selectSolver.\n",mypid_); printf("%4d : HYPRE_LSC::solver name = %s.\n",mypid_,name); } //------------------------------------------------------------------- // if already been allocated, destroy it first //------------------------------------------------------------------- if ( HYSolver_ != NULL ) { if ( HYSolverID_ == HYPCG ) HYPRE_ParCSRPCGDestroy(HYSolver_); if ( HYSolverID_ == HYLSICG ) HYPRE_ParCSRLSICGDestroy(HYSolver_); if ( HYSolverID_ == HYHYBRID ) HYPRE_ParCSRHybridDestroy(HYSolver_); if ( HYSolverID_ == HYGMRES ) HYPRE_ParCSRGMRESDestroy(HYSolver_); if ( HYSolverID_ == HYFGMRES) HYPRE_ParCSRFGMRESDestroy(HYSolver_); if ( HYSolverID_ == HYCGSTAB) HYPRE_ParCSRBiCGSTABDestroy(HYSolver_); if ( HYSolverID_ == HYCGSTABL) HYPRE_ParCSRBiCGSTABLDestroy(HYSolver_); if ( HYSolverID_ == HYAMG) HYPRE_BoomerAMGDestroy(HYSolver_); if ( HYSolverID_ == HYTFQMR) HYPRE_ParCSRTFQmrDestroy(HYSolver_); if ( HYSolverID_ == HYBICGS) HYPRE_ParCSRBiCGSDestroy(HYSolver_); if ( HYSolverID_ == HYSYMQMR) HYPRE_ParCSRSymQMRDestroy(HYSolver_); } //------------------------------------------------------------------- // check for the validity of the solver name //------------------------------------------------------------------- if ( !strcmp(name, "cg" ) ) { hypre_strcpy( HYSolverName_, name ); HYSolverID_ = HYPCG; } else if ( !strcmp(name, "lsicg" ) ) { hypre_strcpy( HYSolverName_, name ); HYSolverID_ = HYLSICG; } else if ( !strcmp(name, "hybrid") ) { hypre_strcpy( HYSolverName_, name ); HYSolverID_ = HYHYBRID; } else if ( !strcmp(name, "gmres") ) { hypre_strcpy( HYSolverName_, name ); HYSolverID_ = HYGMRES; } else if ( !strcmp(name, "fgmres") ) { hypre_strcpy( HYSolverName_, name ); HYSolverID_ = HYFGMRES; } else if ( !strcmp(name, "bicgstab") ) { hypre_strcpy( HYSolverName_, name ); HYSolverID_ = HYCGSTAB; } else if ( !strcmp(name, "bicgstabl") ) { hypre_strcpy( HYSolverName_, name ); HYSolverID_ = HYCGSTABL; } else if ( !strcmp(name, "tfqmr") ) { hypre_strcpy( HYSolverName_, name ); HYSolverID_ = HYTFQMR; } else if ( !strcmp(name, "bicgs") ) { hypre_strcpy( HYSolverName_, name ); HYSolverID_ = HYBICGS; } else if ( !strcmp(name, "symqmr") ) { hypre_strcpy( HYSolverName_, name ); HYSolverID_ = HYSYMQMR; } else if ( !strcmp(name, "boomeramg") ) { hypre_strcpy( HYSolverName_, name ); HYSolverID_ = HYAMG; } else if ( !strcmp(name, "superlu") ) { hypre_strcpy( HYSolverName_, name ); HYSolverID_ = HYSUPERLU; } else if ( !strcmp(name, "superlux") ) { hypre_strcpy( HYSolverName_, name ); HYSolverID_ = HYSUPERLUX; } else if ( !strcmp(name, "dsuperlu") ) { hypre_strcpy( HYSolverName_, name ); #ifdef HYPRE_USING_DSUPERLU HYSolverID_ = HYDSUPERLU; #else printf("HYPRE_LinSysCore:: DSuperLU not available.\n"); printf(" default solver to be GMRES.\n"); HYSolverID_ = HYGMRES; #endif } else if ( !strcmp(name, "y12m") ) { hypre_strcpy( HYSolverName_, name ); HYSolverID_ = HYY12M; } else if ( !strcmp(name, "amge") ) { hypre_strcpy( HYSolverName_, name ); HYSolverID_ = HYAMGE; } else { if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 3 ) printf("HYPRE_LSC selectSolver : use default = gmres.\n"); strcpy( HYSolverName_, "gmres" ); HYSolverID_ = HYGMRES; } //------------------------------------------------------------------- // instantiate solver //------------------------------------------------------------------- switch ( HYSolverID_ ) { case HYPCG : HYPRE_ParCSRPCGCreate(comm_, &HYSolver_); break; case HYLSICG : HYPRE_ParCSRLSICGCreate(comm_, &HYSolver_); break; case HYHYBRID : HYPRE_ParCSRHybridCreate(&HYSolver_); break; case HYGMRES : HYPRE_ParCSRGMRESCreate(comm_, &HYSolver_); break; case HYFGMRES : HYPRE_ParCSRFGMRESCreate(comm_, &HYSolver_); break; case HYCGSTAB : HYPRE_ParCSRBiCGSTABCreate(comm_, &HYSolver_); break; case HYCGSTABL : HYPRE_ParCSRBiCGSTABLCreate(comm_, &HYSolver_); break; case HYTFQMR : HYPRE_ParCSRTFQmrCreate(comm_, &HYSolver_); break; case HYBICGS : HYPRE_ParCSRBiCGSCreate(comm_, &HYSolver_); break; case HYSYMQMR : HYPRE_ParCSRSymQMRCreate(comm_, &HYSolver_); break; case HYAMG : HYPRE_BoomerAMGCreate( &HYSolver_); HYPRE_BoomerAMGSetCycleType(HYSolver_, 1); HYPRE_BoomerAMGSetMaxLevels(HYSolver_, 25); break; default: break; } //------------------------------------------------------------------- // diagnostic message //------------------------------------------------------------------- if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 3 ) printf("%4d : HYPRE_LSC::leaving selectSolver.\n",mypid_); return; } //*************************************************************************** // select which preconditioner to use //--------------------------------------------------------------------------- void HYPRE_LinSysCore::selectPreconditioner(char *name) { //------------------------------------------------------------------- // diagnostic message //------------------------------------------------------------------- if ((HYOutputLevel_ & HYFEI_SPECIALMASK) >= 3) printf("%4d : HYPRE_LSC::entering selectPreconditioner = %s.\n", mypid_, name); //------------------------------------------------------------------- // if already been allocated, destroy it first //------------------------------------------------------------------- HYPreconSetup_ = 0; parasailsReuse_ = 0; if ( HYPrecon_ != NULL ) { if (HYPreconID_ == HYPILUT) HYPRE_ParCSRPilutDestroy(HYPrecon_); else if (HYPreconID_ == HYPARASAILS) HYPRE_ParCSRParaSailsDestroy(HYPrecon_); else if (HYPreconID_ == HYBOOMERAMG) HYPRE_BoomerAMGDestroy(HYPrecon_); else if (HYPreconID_ == HYDDILUT) HYPRE_LSI_DDIlutDestroy(HYPrecon_); else if (HYPreconID_ == HYSCHWARZ) HYPRE_LSI_SchwarzDestroy(HYPrecon_); else if (HYPreconID_ == HYDDICT) HYPRE_LSI_DDICTDestroy(HYPrecon_); else if (HYPreconID_ == HYPOLY) HYPRE_LSI_PolyDestroy(HYPrecon_); else if (HYPreconID_ == HYEUCLID) HYPRE_EuclidDestroy(HYPrecon_); else if (HYPreconID_ == HYBLOCK) HYPRE_LSI_BlockPrecondDestroy(HYPrecon_); #ifdef HAVE_ML else if (HYPreconID_ == HYML) HYPRE_LSI_MLDestroy(HYPrecon_); #endif #ifdef HAVE_MLI else if (HYPreconID_ == HYMLI) HYPRE_LSI_MLIDestroy(HYPrecon_); #endif else if (HYPreconID_ == HYUZAWA) HYPRE_LSI_UzawaDestroy(HYPrecon_); #ifdef HAVE_SYSPDE else if (HYPreconID_ == HYSYSPDE) HYPRE_ParCSRSysPDEDestroy(HYPrecon_); #endif #ifdef HYPRE_USING_DSUPERLU else if (HYPreconID_ == HYDSLU) HYPRE_LSI_DSuperLUDestroy(HYPrecon_); #endif } //------------------------------------------------------------------- // check for the validity of the preconditioner name //------------------------------------------------------------------- if (!strcmp(name, "identity")) { hypre_strcpy(HYPreconName_, name); HYPreconID_ = HYIDENTITY; } else if (!strcmp(name, "diagonal")) { hypre_strcpy(HYPreconName_, name); HYPreconID_ = HYDIAGONAL; } else if (!strcmp(name, "pilut")) { hypre_strcpy(HYPreconName_, name); HYPreconID_ = HYPILUT; } else if (!strcmp(name, "parasails")) { hypre_strcpy(HYPreconName_, name); HYPreconID_ = HYPARASAILS; } else if (!strcmp(name, "boomeramg")) { hypre_strcpy(HYPreconName_, name); HYPreconID_ = HYBOOMERAMG; } else if (!strcmp(name, "ddilut")) { hypre_strcpy(HYPreconName_, name); HYPreconID_ = HYDDILUT; } else if (!strcmp(name, "schwarz")) { hypre_strcpy(HYPreconName_, name); HYPreconID_ = HYSCHWARZ; } else if (!strcmp(name, "ddict")) { hypre_strcpy(HYPreconName_, name); HYPreconID_ = HYDDICT; } else if (!strcmp(name, "poly")) { hypre_strcpy(HYPreconName_, name); HYPreconID_ = HYPOLY; } else if (!strcmp(name, "euclid")) { hypre_strcpy(HYPreconName_, name); HYPreconID_ = HYEUCLID; } else if (!strcmp(name, "blockP")) { hypre_strcpy(HYPreconName_, name); HYPreconID_ = HYBLOCK; } else if (!strcmp(name, "ml")) { #ifdef HAVE_ML hypre_strcpy(HYPreconName_, name); HYPreconID_ = HYML; #else if ((HYOutputLevel_ & HYFEI_SPECIALMASK) >= 3) { printf("selectPreconditioner - ML not available.\n"); printf(" set default to diagonal.\n"); } strcpy(HYPreconName_, "diagonal"); HYPreconID_ = HYDIAGONAL; #endif } else if (!strcmp(name, "mlmaxwell")) { #ifdef HAVE_MLMAXWELL hypre_strcpy(HYPreconName_, name); HYPreconID_ = HYMLMAXWELL; #else if ((HYOutputLevel_ & HYFEI_SPECIALMASK) >= 3) { printf("selectPreconditioner - MLMaxwell not available.\n"); printf(" set default to diagonal.\n"); } strcpy(HYPreconName_, "diagonal"); HYPreconID_ = HYDIAGONAL; #endif } else if (!strcmp(name, "mli")) { #ifdef HAVE_MLI hypre_strcpy(HYPreconName_, name); HYPreconID_ = HYMLI; #else if ((HYOutputLevel_ & HYFEI_SPECIALMASK) >= 3) { printf("selectPreconditioner - MLI not available.\n"); printf(" set default to diagonal.\n"); } strcpy(HYPreconName_, "diagonal"); HYPreconID_ = HYDIAGONAL; #endif } else if (!strcmp(name, "ams")) { hypre_strcpy(HYPreconName_, name); HYPreconID_ = HYAMS; } else if (!strcmp(name, "uzawa")) { hypre_strcpy(HYPreconName_, name); HYPreconID_ = HYUZAWA; } #ifdef HAVE_SYSPDE else if (!strcmp(name, "syspde")) { hypre_strcpy(HYPreconName_, name); HYPreconID_ = HYSYSPDE; } #endif #ifdef HYPRE_USING_DSUPERLU else if (!strcmp(name, "dsuperlu")) { hypre_strcpy(HYPreconName_, name); HYPreconID_ = HYDSLU; } #endif else { if ((HYOutputLevel_ & HYFEI_SPECIALMASK) >= 3) { printf("selectPreconditioner error : invalid option.\n"); printf(" use default = diagonal.\n"); } strcpy(HYPreconName_, "diagonal"); HYPreconID_ = HYDIAGONAL; } //------------------------------------------------------------------- // instantiate preconditioner //------------------------------------------------------------------- switch (HYPreconID_) { case HYIDENTITY : HYPrecon_ = NULL; break; case HYDIAGONAL : HYPrecon_ = NULL; break; case HYPILUT : HYPRE_ParCSRPilutCreate(comm_, &HYPrecon_); HYPRE_ParCSRPilutSetMaxIter(HYPrecon_, 1); break; case HYPARASAILS : HYPRE_ParCSRParaSailsCreate(comm_, &HYPrecon_); break; case HYBOOMERAMG : HYPRE_BoomerAMGCreate(&HYPrecon_); HYPRE_BoomerAMGSetMaxIter(HYPrecon_, 1); HYPRE_BoomerAMGSetCycleType(HYPrecon_, 1); HYPRE_BoomerAMGSetMaxLevels(HYPrecon_, 25); HYPRE_BoomerAMGSetMeasureType(HYPrecon_, 0); break; case HYDDILUT : HYPRE_LSI_DDIlutCreate(comm_, &HYPrecon_); break; case HYSCHWARZ : HYPRE_LSI_SchwarzCreate(comm_, &HYPrecon_); break; case HYDDICT : HYPRE_LSI_DDICTCreate(comm_, &HYPrecon_); break; case HYPOLY : HYPRE_LSI_PolyCreate(comm_, &HYPrecon_); break; case HYEUCLID : HYPRE_EuclidCreate(comm_, &HYPrecon_); break; case HYBLOCK : HYPRE_LSI_BlockPrecondCreate(comm_, &HYPrecon_); break; case HYML : #ifdef HAVE_ML HYPRE_LSI_MLCreate(comm_, &HYPrecon_); #else printf("HYPRE_LSC::selectPreconditioner - ML not supported.\n"); #endif break; case HYMLI : #ifdef HAVE_MLI HYPRE_LSI_MLICreate(comm_, &HYPrecon_); #else printf("HYPRE_LSC::selectPreconditioner - MLI not supported.\n"); #endif break; case HYMLMAXWELL : #ifdef HAVE_MLMAXWELL HYPRE_LSI_MLMaxwellCreate(comm_, &HYPrecon_); #else printf("HYPRE_LSC::selectPreconditioner-MLMaxwell unsupported.\n"); #endif break; case HYAMS : HYPRE_AMSCreate(&HYPrecon_); break; case HYUZAWA : HYPRE_LSI_UzawaCreate(comm_, &HYPrecon_); break; case HYSYSPDE : #ifdef HAVE_SYSPDE HYPRE_ParCSRSysPDECreate(comm_, sysPDENVars_, &HYPrecon_); #else printf("HYPRE_LSC::selectPreconditioner-SYSPDE unsupported.\n"); #endif break; case HYDSLU : #ifdef HYPRE_USING_DSUPERLU HYPRE_LSI_DSuperLUCreate(comm_, &HYPrecon_); #else printf("HYPRE_LSC::selectPreconditioner-DSUPERLU unsupported.\n"); #endif break; } //------------------------------------------------------------------- // diagnostic message //------------------------------------------------------------------- if ((HYOutputLevel_ & HYFEI_SPECIALMASK) >= 3) printf("%4d : HYPRE_LSC::leaving selectPreconditioner.\n",mypid_); } //*************************************************************************** // form the residual vector //--------------------------------------------------------------------------- int HYPRE_LinSysCore::formResidual(double* values, int leng) { int i, index, nrows; HYPRE_ParCSRMatrix A_csr; HYPRE_ParVector x_csr; HYPRE_ParVector b_csr; HYPRE_ParVector r_csr; //------------------------------------------------------------------- // diagnostic message and error checking //------------------------------------------------------------------- if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 3 ) printf("%4d : HYPRE_LSC::entering formResidual.\n", mypid_); nrows = localEndRow_ - localStartRow_ + 1; if (leng != nrows) { printf("%4d : HYPRE_LSC::formResidual ERROR - inleng != numLocalRows", mypid_); printf(" numLocalRows, inleng = %d %d",nrows,leng); return (0); } if ( ! systemAssembled_ ) { printf("%4d : HYPRE_LSC formResidual ERROR : system not assembled.\n", mypid_); exit(1); } //------------------------------------------------------------------- // fetch matrix and vector pointers //------------------------------------------------------------------- HYPRE_IJMatrixGetObject(HYA_, (void **) &A_csr); HYPRE_IJVectorGetObject(HYx_, (void **) &x_csr); HYPRE_IJVectorGetObject(HYb_, (void **) &b_csr); HYPRE_IJVectorGetObject(HYr_, (void **) &r_csr); //------------------------------------------------------------------- // form residual vector //------------------------------------------------------------------- HYPRE_ParVectorCopy( b_csr, r_csr ); HYPRE_ParCSRMatrixMatvec( -1.0, A_csr, x_csr, 1.0, r_csr ); //------------------------------------------------------------------- // fetch residual vector //------------------------------------------------------------------- for ( i = localStartRow_-1; i < localEndRow_; i++ ) { index = i - localStartRow_ + 1; HYPRE_IJVectorGetValues(HYr_, 1, &i, &values[index]); } //------------------------------------------------------------------- // diagnostic message //------------------------------------------------------------------- if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 3 ) printf("%4d : HYPRE_LSC::leaving formResidual.\n", mypid_); return (0); } //*************************************************************************** // solve the linear system //--------------------------------------------------------------------------- int HYPRE_LinSysCore::launchSolver(int& solveStatus, int &iterations) { int i, j, numIterations=0, status, localNRows; int startRow, *procNRows, rowSize, *colInd, nnz, nrows; int slideCheck[2]; #ifdef HAVE_MLI int *constrMap, *constrEqns, ncount, *iArray; double *tempNodalCoord; #endif int *numSweeps, *relaxType, reduceAFlag; int *matSizes, *rowInd, retFlag, tempIter, nTrials; double rnorm=0.0, ddata, *colVal, *relaxWt, *diagVals; double stime, etime, ptime, rtime1, rtime2, newnorm; double rnorm0, rnorm1, convRate, rateThresh; char fname[40], paramString[100]; FILE *fp; HYPRE_IJMatrix TempA, IJI; HYPRE_IJVector TempX, TempB, TempR; #ifdef HAVE_MLI HYPRE_ParCSRMatrix perturb_csr; #endif HYPRE_ParCSRMatrix A_csr, I_csr, normalA_csr; HYPRE_ParVector x_csr, b_csr, r_csr; HYPRE_SlideReduction *slideObj = (HYPRE_SlideReduction *) slideObj_; //------------------------------------------------------------------- // Clear Errors //------------------------------------------------------------------- HYPRE_ClearAllErrors(); //------------------------------------------------------------------- // diagnostic message //------------------------------------------------------------------- if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 3 ) printf("%4d : HYPRE_LSC::entering launchSolver.\n", mypid_); //------------------------------------------------------------------- // see if Schur or slide reduction is to be performed //------------------------------------------------------------------- rnorm_ = 0.0; MPI_Barrier(comm_); rtime1 = LSC_Wtime(); if ( schurReduction_ == 1 && schurReductionCreated_ == 0 ) { buildSchurReducedSystem(); schurReductionCreated_ = 1; } else if ( schurReduction_ == 1 ) buildSchurReducedRHS(); if ( schurReduction_ == 0 && slideReduction_ != 0 ) { if ( constrList_ != NULL ) delete [] constrList_; constrList_ = NULL; if ( slideReduction_ == 1 ) buildSlideReducedSystem(); else if ( slideReduction_ == 2 ) buildSlideReducedSystem2(); else if ( slideReduction_ == 3 || slideReduction_ == 4 ) { if (slideObj == NULL) { slideObj = new HYPRE_SlideReduction(comm_); slideObj_ = (void *) slideObj; } TempA = currA_; TempX = currX_; TempB = currB_; TempR = currR_; HYPRE_IJVectorGetLocalRange(HYb_,&slideCheck[0],&slideCheck[1]); // check to see if it has been reduced before // if so, need to redo B and X reduceAFlag = 1; if (currA_ != HYA_) { HYPRE_IJVectorDestroy(currB_); HYPRE_IJVectorDestroy(currX_); HYPRE_IJVectorDestroy(currR_); currB_ = HYb_; currX_ = HYx_; currR_ = HYr_; reduceAFlag = 0; } if ( HYOutputLevel_ & HYFEI_SLIDEREDUCE1 ) slideObj->setOutputLevel(1); if ( HYOutputLevel_ & HYFEI_SLIDEREDUCE2 ) slideObj->setOutputLevel(2); if ( HYOutputLevel_ & HYFEI_SLIDEREDUCE3 ) slideObj->setOutputLevel(3); if ( slideReductionMinNorm_ >= 0.0 ) slideObj->setBlockMinNorm( slideReductionMinNorm_ ); if ( slideReductionScaleMatrix_ == 1 ) slideObj->setScaleMatrix(); slideObj->setTruncationThreshold( truncThresh_ ); if ( slideReduction_ == 4 ) slideObj->setUseSimpleScheme(); slideObj->setup(currA_, currX_, currB_); if ( slideReductionScaleMatrix_ == 1 && HYPreconID_ == HYMLI ) { diagVals = slideObj->getMatrixDiagonal(); nrows = slideObj->getMatrixNumRows(); HYPRE_LSI_MLILoadMatrixScalings(HYPrecon_, nrows, diagVals); } #ifdef HAVE_MLI if ( HYPreconID_ == HYMLI ) { HYPRE_IJMatrixGetObject(currA_, (void **) &A_csr); HYPRE_ParCSRMatrixGetRowPartitioning( A_csr, &procNRows ); slideObj->getProcConstraintMap(&constrMap); HYPRE_LSI_MLIAdjustNodeEqnMap(HYPrecon_, procNRows, constrMap); j = constrMap[mypid_+1] - constrMap[mypid_]; free(procNRows); slideObj->getSlaveEqnList(&constrEqns); slideObj->getPerturbationMatrix(&perturb_csr); HYPRE_LSI_MLIAdjustNullSpace(HYPrecon_,j,constrEqns,perturb_csr); } #endif if (reduceAFlag == 1) { slideObj->getReducedMatrix(&currA_); slideObj->getReducedAuxVector(&currR_); } slideObj->getReducedSolnVector(&currX_); slideObj->getReducedRHSVector(&currB_); if ( currA_ == NULL ) { currA_ = TempA; currX_ = TempX; currB_ = TempB; currR_ = TempR; } } } MPI_Barrier(comm_); rtime2 = LSC_Wtime(); //------------------------------------------------------------------- // if normal equation requested //------------------------------------------------------------------- if ( (normalEqnFlag_ & 1) != 0 ) { if ( (normalEqnFlag_ & 2) == 0 ) { if ( HYnormalA_ != NULL ) HYPRE_IJMatrixDestroy(HYnormalA_); HYPRE_IJMatrixGetObject(HYA_, (void **) &A_csr); HYPRE_IJMatrixCreate(comm_, localStartRow_-1, localEndRow_-1, localStartRow_-1, localEndRow_-1,&IJI); HYPRE_IJMatrixSetObjectType(IJI, HYPRE_PARCSR); localNRows = localEndRow_ - localStartRow_ + 1; matSizes = new int[localNRows]; rowInd = new int[localNRows]; colInd = new int[localNRows]; colVal = new double[localNRows]; for ( i = 0; i < localNRows; i++ ) { matSizes[i] = 1; rowInd[i] = localStartRow_ - 1 + i; colInd[i] = rowInd[i]; colVal[i] = 1.0; } HYPRE_IJMatrixSetRowSizes(IJI, matSizes); HYPRE_IJMatrixInitialize(IJI); HYPRE_IJMatrixSetValues(IJI, localNRows, matSizes, (const int *) rowInd, (const int *) colInd, (const double *) colVal); delete [] rowInd; delete [] colInd; delete [] colVal; HYPRE_IJMatrixAssemble(IJI); HYPRE_IJMatrixGetObject(IJI, (void **) &I_csr); hypre_BoomerAMGBuildCoarseOperator((hypre_ParCSRMatrix*) A_csr, (hypre_ParCSRMatrix*) I_csr, (hypre_ParCSRMatrix*) A_csr, (hypre_ParCSRMatrix**) &normalA_csr); HYPRE_IJMatrixDestroy( IJI ); HYPRE_IJMatrixCreate(comm_, localStartRow_-1, localEndRow_-1, localStartRow_-1, localEndRow_-1,&HYnormalA_); HYPRE_IJMatrixSetObjectType(HYnormalA_, HYPRE_PARCSR); for ( i = localStartRow_-1; i < localEndRow_; i++ ) { HYPRE_ParCSRMatrixGetRow(normalA_csr,i,&rowSize,NULL,NULL); matSizes[i-localStartRow_+1] = rowSize; HYPRE_ParCSRMatrixRestoreRow(normalA_csr,i,&rowSize,NULL,NULL); } HYPRE_IJMatrixSetRowSizes(HYnormalA_, matSizes); HYPRE_IJMatrixInitialize(HYnormalA_); for ( i = localStartRow_-1; i < localEndRow_; i++ ) { HYPRE_ParCSRMatrixGetRow(normalA_csr,i,&rowSize,&colInd,&colVal); HYPRE_IJMatrixSetValues(HYnormalA_, 1, &rowSize, (const int *) &i, (const int *) colInd, (const double *) colVal); HYPRE_ParCSRMatrixRestoreRow(normalA_csr,i,&rowSize,&colInd,&colVal); } HYPRE_IJMatrixAssemble(HYnormalA_); delete [] matSizes; normalEqnFlag_ |= 2; } if ( (normalEqnFlag_ & 4) == 0 ) { if ( HYnormalB_ != NULL ) HYPRE_IJVectorDestroy(HYnormalB_); HYPRE_IJVectorCreate(comm_, localStartRow_-1, localEndRow_-1, &HYnormalB_); HYPRE_IJVectorSetObjectType(HYnormalB_, HYPRE_PARCSR); HYPRE_IJVectorInitialize(HYnormalB_); HYPRE_IJVectorAssemble(HYnormalB_); HYPRE_IJMatrixGetObject(HYA_, (void **) &A_csr); HYPRE_IJVectorGetObject(HYb_, (void **) &b_csr); HYPRE_IJVectorGetObject(HYnormalB_, (void **) &r_csr); HYPRE_ParCSRMatrixMatvecT( 1.0, A_csr, b_csr, 0.0, r_csr ); normalEqnFlag_ |= 4; } } //------------------------------------------------------------------- // fetch matrix and vector pointers //------------------------------------------------------------------- HYPRE_IJMatrixGetObject(currA_, (void **) &A_csr); HYPRE_IJVectorGetObject(currX_, (void **) &x_csr); HYPRE_IJVectorGetObject(currB_, (void **) &b_csr); HYPRE_IJVectorGetObject(currR_, (void **) &r_csr); if ( A_csr == NULL || x_csr == NULL || b_csr == NULL || r_csr == NULL ) { printf("%4d : HYPRE_LSC::launchSolver ERROR.\n",mypid_); printf(" csr pointers null \n"); printf(" Did you forget to call matrixLoadComplete?\n"); exit(1); } if ( (normalEqnFlag_ & 7) == 7 ) { HYPRE_IJMatrixGetObject(HYnormalA_, (void **) &A_csr); HYPRE_IJVectorGetObject(HYnormalB_, (void **) &b_csr); } //------------------------------------------------------------------- // diagnostics (print the reduced matrix to a file) //------------------------------------------------------------------- if ( HYOutputLevel_ & HYFEI_PRINTREDMAT ) { if ( HYOutputLevel_ & HYFEI_PRINTPARCSRMAT ) { printf("%4d : HYPRE_LSC::print matrix/rhs to files(A)\n",mypid_); sprintf(fname, "HYPRE_Mat"); HYPRE_ParCSRMatrixPrint( A_csr, fname); sprintf(fname, "HYPRE_RHS"); HYPRE_ParVectorPrint( b_csr, fname); } else { printf("%4d : HYPRE_LSC::print matrix/rhs to files(B)\n",mypid_); HYPRE_ParCSRMatrixGetRowPartitioning( A_csr, &procNRows ); startRow = procNRows[mypid_]; nrows = procNRows[mypid_+1] - startRow; free( procNRows ); sprintf(fname, "hypre_mat.out.%d", mypid_); fp = fopen( fname, "w"); nnz = 0; for ( i = startRow; i < startRow+nrows; i++ ) { HYPRE_ParCSRMatrixGetRow(A_csr,i,&rowSize,&colInd,&colVal); for ( j = 0; j < rowSize; j++ ) if ( colVal[j] != 0.0 ) nnz++; HYPRE_ParCSRMatrixRestoreRow(A_csr,i,&rowSize,&colInd,&colVal); } fprintf(fp, "%6d %7d \n", nrows, nnz); for ( i = startRow; i < startRow+nrows; i++ ) { HYPRE_ParCSRMatrixGetRow(A_csr,i,&rowSize,&colInd,&colVal); for ( j = 0; j < rowSize; j++ ) { if ( colVal[j] != 0.0 ) fprintf(fp, "%6d %6d %25.8e\n",i+1,colInd[j]+1,colVal[j]); } HYPRE_ParCSRMatrixRestoreRow(A_csr,i,&rowSize,&colInd,&colVal); } fclose(fp); sprintf(fname, "hypre_rhs.out.%d", mypid_); fp = fopen( fname, "w"); fprintf(fp, "%6d \n", nrows); for ( i = startRow; i < startRow+nrows; i++ ) { HYPRE_IJVectorGetValues(currB_, 1, &i, &ddata); fprintf(fp, "%6d %25.8e \n", i+1, ddata); } fclose(fp); MPI_Barrier(comm_); } if ( MLI_NumNodes_ > 0 ) { fp = fopen("rbm","w"); for (i = 0; i < MLI_NumNodes_; i++) for (j = 0; j < MLI_FieldSize_; j++) fprintf(fp,"%8d %25.16e\n", MLI_EqnNumbers_[i]+j+1, MLI_NodalCoord_[i*3+j]); fclose(fp); } if ( HYOutputLevel_ & HYFEI_STOPAFTERPRINT ) exit(1); } #ifdef HAVE_AMGE if ( HYOutputLevel_ & HYFEI_PRINTFEINFO ) { HYPRE_LSI_AMGeWriteToFile(); } #endif //------------------------------------------------------------------- // choose PCG, GMRES, ... or direct solver //------------------------------------------------------------------- MPI_Barrier(comm_); status = 1; solveStatus = status; //set for early return stime = LSC_Wtime(); ptime = stime; if ( projectionScheme_ == 1 ) { computeAConjProjection(A_csr, x_csr, b_csr); } else if ( projectionScheme_ == 2 ) { computeMinResProjection(A_csr, x_csr, b_csr); } #ifdef HAVE_MLI if ( HYPreconID_ == HYMLI && feData_ != NULL ) { if (haveFEData_ == 1) HYPRE_LSI_MLISetFEData( HYPrecon_, feData_ ); if (haveFEData_ == 2) HYPRE_LSI_MLISetSFEI( HYPrecon_, feData_ ); } if ( HYPreconID_ == HYMLI && MLI_EqnNumbers_ != NULL ) { iArray = new int[MLI_NumNodes_]; for (i = 0; i < MLI_NumNodes_; i++) iArray[i] = i; HYPRE_LSI_qsort1a(MLI_EqnNumbers_, iArray, 0, MLI_NumNodes_-1); tempNodalCoord = MLI_NodalCoord_; ncount = 1; for (i = 1; i < MLI_NumNodes_; i++) if (MLI_EqnNumbers_[i] != MLI_EqnNumbers_[ncount-1]) ncount++; MLI_NodalCoord_ = new double[ncount*MLI_FieldSize_]; for (j = 0; j < MLI_FieldSize_; j++) MLI_NodalCoord_[j] = tempNodalCoord[iArray[0]*MLI_FieldSize_+j]; ncount = 1; for (i = 1; i < MLI_NumNodes_; i++) { if (MLI_EqnNumbers_[i] != MLI_EqnNumbers_[ncount-1]) { MLI_EqnNumbers_[ncount] = MLI_EqnNumbers_[i]; for (j = 0; j < MLI_FieldSize_; j++) MLI_NodalCoord_[ncount*MLI_FieldSize_+j] = tempNodalCoord[iArray[i]*MLI_FieldSize_+j]; ncount++; } } MLI_NumNodes_ = ncount; //hypre_assert((MLI_NumNodes_*MLI_FieldSize_)==(localEndRow_-localStartRow_+1)); delete [] tempNodalCoord; delete [] iArray; for (i = 0; i < MLI_NumNodes_; i++) { if (MLI_NodalCoord_[i] == -99999.0) printf("%d : HYPRE launchSolver ERROR - coord %d not filled.\n", mypid_, i); } HYPRE_LSI_MLILoadNodalCoordinates(HYPrecon_, MLI_NumNodes_, MLI_FieldSize_, MLI_EqnNumbers_, MLI_FieldSize_, MLI_NodalCoord_, localEndRow_-localStartRow_+1); } #endif #if 0 // replaced by better scheme, to be deleted later if ( HYPreconID_ == HYAMS && MLI_EqnNumbers_ != NULL ) { HYPRE_LSI_BuildNodalCoordinates(); } #endif switch ( HYSolverID_ ) { //---------------------------------------------------------------- // choose PCG //---------------------------------------------------------------- case HYPCG : if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 1 && mypid_ == 0 ) { printf("***************************************************\n"); printf("* Preconditioned Conjugate Gradient solver \n"); printf("* maximum no. of iterations = %d\n", maxIterations_); printf("* convergence tolerance = %e\n", tolerance_); printf("*--------------------------------------------------\n"); } setupPCGPrecon(); HYPRE_ParCSRPCGSetMaxIter(HYSolver_, maxIterations_); HYPRE_ParCSRPCGSetRelChange(HYSolver_, 0); HYPRE_ParCSRPCGSetTwoNorm(HYSolver_, 1); HYPRE_PCGSetRecomputeResidual(HYSolver_, pcgRecomputeRes_); if ( normAbsRel_ == 0 ) { HYPRE_PCGSetTol(HYSolver_, tolerance_); } else { HYPRE_PCGSetTol(HYSolver_, 0.0); HYPRE_PCGSetAbsoluteTol(HYSolver_, tolerance_); } if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 1 ) { if ( mypid_ == 0 ) printf("***************************************************\n"); HYPRE_ParCSRPCGSetPrintLevel(HYSolver_, 1); if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 2 ) HYPRE_ParCSRPCGSetPrintLevel(HYSolver_, 2); } retFlag = HYPRE_ParCSRPCGSetup(HYSolver_, A_csr, b_csr, x_csr); if ( retFlag != 0 ) { printf("HYPRE_LSC::launchSolver ERROR : in PCG setup.\n"); return retFlag; } // if variable mli preconditioner (SA and GSA) if ( MLI_Hybrid_GSA_ && HYPreconID_ == HYMLI ) { if ( normAbsRel_ == 0 ) { HYPRE_ParVectorCopy( b_csr, r_csr ); HYPRE_ParCSRMatrixMatvec( -1.0, A_csr, x_csr, 1.0, r_csr ); HYPRE_ParVectorInnerProd( r_csr, r_csr, &rnorm0); rnorm0 = sqrt( rnorm0 ); } else rnorm0 = 1.0; HYPRE_ParCSRPCGSetMaxIter(HYSolver_, MLI_Hybrid_MaxIter_); rateThresh = 1.0; for ( i = 0; i < MLI_Hybrid_MaxIter_; i++ ) rateThresh *= MLI_Hybrid_ConvRate_; } MPI_Barrier( comm_ ); ptime = LSC_Wtime(); retFlag = HYPRE_ParCSRPCGSolve(HYSolver_, A_csr, b_csr, x_csr); HYPRE_ParCSRPCGGetNumIterations(HYSolver_, &numIterations); HYPRE_ParVectorCopy( b_csr, r_csr ); HYPRE_ParCSRMatrixMatvec( -1.0, A_csr, x_csr, 1.0, r_csr ); HYPRE_ParVectorInnerProd( r_csr, r_csr, &rnorm); rnorm = sqrt( rnorm ); // if variable mli preconditioner (SA and GSA) if ( MLI_Hybrid_GSA_ && HYPreconID_ == HYMLI ) { nTrials = 1; if (rnorm/rnorm0 >= tolerance_) { HYPRE_ParCSRPCGSolve(HYSolver_, A_csr, b_csr, x_csr); HYPRE_ParCSRPCGGetNumIterations(HYSolver_, &tempIter); numIterations += tempIter; HYPRE_ParVectorCopy( b_csr, r_csr ); HYPRE_ParCSRMatrixMatvec( -1.0, A_csr, x_csr, 1.0, r_csr ); HYPRE_ParVectorInnerProd( r_csr, r_csr, &rnorm1); rnorm1 = sqrt( rnorm1 ); convRate = rnorm1 / rnorm; rnorm = rnorm1; } while ((rnorm/rnorm0)>=tolerance_ && nTrials rateThresh ) { if ( MLI_Hybrid_NSIncr_ > 1 ) sprintf(paramString, "MLI incrNullSpaceDim %d", MLI_Hybrid_NSIncr_); else sprintf(paramString, "MLI incrNullSpaceDim 2"); HYPRE_LSI_MLISetParams(HYPrecon_, paramString); HYPRE_ParCSRPCGSetup(HYSolver_, A_csr, b_csr, x_csr); } HYPRE_ParCSRPCGSolve(HYSolver_, A_csr, b_csr, x_csr); HYPRE_ParCSRPCGGetNumIterations(HYSolver_, &tempIter); numIterations += tempIter; HYPRE_ParVectorCopy( b_csr, r_csr ); HYPRE_ParCSRMatrixMatvec( -1.0, A_csr, x_csr, 1.0, r_csr ); rnorm1 = rnorm; HYPRE_ParVectorInnerProd( r_csr, r_csr, &rnorm); rnorm = sqrt( rnorm ); convRate = rnorm / rnorm1; } if (rnorm/rnorm0 < tolerance_) retFlag = 0; else if (numIterations < maxIterations_) { HYPRE_ParCSRPCGSetMaxIter(HYSolver_,maxIterations_-numIterations); retFlag = HYPRE_ParCSRPCGSolve(HYSolver_, A_csr, b_csr, x_csr); HYPRE_ParCSRPCGGetNumIterations(HYSolver_, &tempIter); numIterations += tempIter; } else retFlag = 1; } if ( retFlag != 0 ) { printf("HYPRE_LSC::launchSolver ERROR : in PCG solve.\n"); return retFlag; } switch ( projectionScheme_ ) { case 1 : addToAConjProjectionSpace(currX_,currB_); break; case 2 : addToMinResProjectionSpace(currX_,currB_); break; } if ( numIterations >= maxIterations_ ) status = 1; else status = 0; break; //---------------------------------------------------------------- // choose LSICG //---------------------------------------------------------------- case HYLSICG : if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 1 && mypid_ == 0 ) { printf("***************************************************\n"); printf("* Conjugate Gradient solver \n"); printf("* maximum no. of iterations = %d\n", maxIterations_); printf("* convergence tolerance = %e\n", tolerance_); printf("*--------------------------------------------------\n"); } setupLSICGPrecon(); HYPRE_ParCSRLSICGSetMaxIter(HYSolver_, maxIterations_); HYPRE_ParCSRLSICGSetTol(HYSolver_, tolerance_); if (normAbsRel_ == 0) HYPRE_ParCSRLSICGSetStopCrit(HYSolver_,0); else HYPRE_ParCSRLSICGSetStopCrit(HYSolver_,1); if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 1 ) { if ( mypid_ == 0 ) printf("***************************************************\n"); HYPRE_ParCSRLSICGSetLogging(HYSolver_, 1); if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 2 ) HYPRE_ParCSRLSICGSetLogging(HYSolver_, 2); } retFlag = HYPRE_ParCSRLSICGSetup(HYSolver_, A_csr, b_csr, x_csr); if ( retFlag != 0 ) { printf("HYPRE_LSC::launchSolver ERROR : in LSICG setup.\n"); return retFlag; } MPI_Barrier( comm_ ); ptime = LSC_Wtime(); retFlag = HYPRE_ParCSRLSICGSolve(HYSolver_, A_csr, b_csr, x_csr); if ( retFlag != 0 ) { printf("HYPRE_LSC::launchSolver ERROR : in LSICG solve.\n"); return retFlag; } HYPRE_ParCSRLSICGGetNumIterations(HYSolver_, &numIterations); HYPRE_ParVectorCopy( b_csr, r_csr ); HYPRE_ParCSRMatrixMatvec( -1.0, A_csr, x_csr, 1.0, r_csr ); HYPRE_ParVectorInnerProd( r_csr, r_csr, &rnorm); rnorm = sqrt( rnorm ); switch ( projectionScheme_ ) { case 1 : addToAConjProjectionSpace(currX_,currB_); break; case 2 : addToMinResProjectionSpace(currX_,currB_); break; } if ( numIterations >= maxIterations_ ) status = 1; else status = 0; break; //---------------------------------------------------------------- // choose hybrid method : CG with diagonal/BoomerAMG preconditioner //---------------------------------------------------------------- case HYHYBRID : if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 1 && mypid_ == 0 ) { printf("***************************************************\n"); printf("* PCG with hybrid diagonal/BoomerAMG preconditioner\n"); printf("* maximum no. of iterations = %d\n", maxIterations_); printf("* convergence tolerance = %e\n", tolerance_); printf("*--------------------------------------------------\n"); } HYPRE_ParCSRHybridSetPCGMaxIter(HYSolver_, maxIterations_); HYPRE_ParCSRHybridSetTol(HYSolver_, tolerance_); HYPRE_ParCSRHybridSetRelChange(HYSolver_, 0); HYPRE_ParCSRHybridSetTwoNorm(HYSolver_, 1); HYPRE_ParCSRHybridSetConvergenceTol(HYSolver_, 0.9); HYPRE_ParCSRHybridSetDSCGMaxIter(HYSolver_, 20); if ( HYOutputLevel_ & HYFEI_AMGDEBUG ) HYPRE_ParCSRHybridSetPrintLevel(HYSolver_, 32); HYPRE_ParCSRHybridSetCoarsenType(HYSolver_, amgCoarsenType_); HYPRE_ParCSRHybridSetMeasureType(HYSolver_, amgMeasureType_); HYPRE_ParCSRHybridSetStrongThreshold(HYSolver_,amgStrongThreshold_); numSweeps = hypre_CTAlloc(int,4,HYPRE_MEMORY_HOST); for ( i = 0; i < 4; i++ ) numSweeps[i] = amgNumSweeps_[i]; HYPRE_ParCSRHybridSetNumGridSweeps(HYSolver_, numSweeps); relaxType = hypre_CTAlloc(int,4,HYPRE_MEMORY_HOST); for ( i = 0; i < 4; i++ ) relaxType[i] = amgRelaxType_[i]; HYPRE_ParCSRHybridSetGridRelaxType(HYSolver_, relaxType); relaxWt = hypre_CTAlloc(double,25,HYPRE_MEMORY_HOST); for ( i = 0; i < 25; i++ ) relaxWt[i] = amgRelaxWeight_[i]; HYPRE_ParCSRHybridSetRelaxWeight(HYSolver_, relaxWt); if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 1 ) { if ( mypid_ == 0 ) printf("***************************************************\n"); HYPRE_ParCSRHybridSetLogging(HYSolver_, 1); if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 2 ) HYPRE_ParCSRHybridSetLogging(HYSolver_, 2); } retFlag = HYPRE_ParCSRHybridSetup(HYSolver_, A_csr, b_csr, x_csr); if ( retFlag != 0 ) { printf("HYPRE_LSC::launchSolver ERROR : in Hybrid setup.\n"); return retFlag; } MPI_Barrier( comm_ ); ptime = LSC_Wtime(); retFlag = HYPRE_ParCSRHybridSolve(HYSolver_, A_csr, b_csr, x_csr); if ( retFlag != 0 ) { printf("HYPRE_LSC::launchSolver ERROR : in Hybrid solve.\n"); return retFlag; } HYPRE_ParCSRHybridGetNumIterations(HYSolver_, &numIterations); HYPRE_ParVectorCopy( b_csr, r_csr ); HYPRE_ParCSRMatrixMatvec( -1.0, A_csr, x_csr, 1.0, r_csr ); HYPRE_ParVectorInnerProd( r_csr, r_csr, &rnorm); rnorm = sqrt( rnorm ); if ( numIterations >= maxIterations_ ) status = 1; else status = 0; break; //---------------------------------------------------------------- // choose GMRES //---------------------------------------------------------------- case HYGMRES : if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 1 && mypid_ == 0 ) { printf("***************************************************\n"); printf("* Generalized Minimal Residual (GMRES) solver \n"); printf("* restart size = %d\n", gmresDim_); printf("* maximum no. of iterations = %d\n", maxIterations_); printf("* convergence tolerance = %e\n", tolerance_); printf("*--------------------------------------------------\n"); } setupGMRESPrecon(); HYPRE_ParCSRGMRESSetKDim(HYSolver_, gmresDim_); HYPRE_ParCSRGMRESSetMaxIter(HYSolver_, maxIterations_); if ( normAbsRel_ == 0 ) { HYPRE_GMRESSetTol(HYSolver_, tolerance_); } else { HYPRE_GMRESSetTol(HYSolver_, 0.0); HYPRE_GMRESSetAbsoluteTol(HYSolver_, tolerance_); } if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 1 ) { HYPRE_ParCSRGMRESSetPrintLevel(HYSolver_, 1); if ( mypid_ == 0 ) printf("***************************************************\n"); if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 2 ) HYPRE_ParCSRGMRESSetPrintLevel(HYSolver_, 2); } retFlag = HYPRE_ParCSRGMRESSetup(HYSolver_, A_csr, b_csr, x_csr); if ( retFlag != 0 ) { printf("HYPRE_LSC::launchSolver ERROR : in GMRES setup.\n"); return retFlag; } // if variable mli preconditioner (SA and GSA) if ( MLI_Hybrid_GSA_ && HYPreconID_ == HYMLI ) { if ( normAbsRel_ == 0 ) { HYPRE_ParVectorCopy( b_csr, r_csr ); HYPRE_ParCSRMatrixMatvec( -1.0, A_csr, x_csr, 1.0, r_csr ); HYPRE_ParVectorInnerProd( r_csr, r_csr, &rnorm0); rnorm0 = sqrt( rnorm0 ); } else rnorm0 = 1.0; HYPRE_ParCSRGMRESSetMaxIter(HYSolver_, MLI_Hybrid_MaxIter_); rateThresh = 1.0; for ( i = 0; i < MLI_Hybrid_MaxIter_; i++ ) rateThresh *= MLI_Hybrid_ConvRate_; } MPI_Barrier( comm_ ); ptime = LSC_Wtime(); retFlag = HYPRE_ParCSRGMRESSolve(HYSolver_, A_csr, b_csr, x_csr); HYPRE_ParCSRGMRESGetNumIterations(HYSolver_, &numIterations); HYPRE_ParVectorCopy( b_csr, r_csr ); HYPRE_ParCSRMatrixMatvec( -1.0, A_csr, x_csr, 1.0, r_csr ); HYPRE_ParVectorInnerProd( r_csr, r_csr, &rnorm); rnorm = sqrt( rnorm ); // if variable mli preconditioner (SA and GSA) if ( MLI_Hybrid_GSA_ && HYPreconID_ == HYMLI ) { nTrials = 0; //if (rnorm/rnorm0 >= tolerance_) //{ // HYPRE_ParCSRGMRESSolve(HYSolver_, A_csr, b_csr, x_csr); // HYPRE_ParCSRGMRESGetNumIterations(HYSolver_, &tempIter); // numIterations += tempIter; // HYPRE_ParVectorCopy( b_csr, r_csr ); // HYPRE_ParCSRMatrixMatvec( -1.0, A_csr, x_csr, 1.0, r_csr ); // HYPRE_ParVectorInnerProd( r_csr, r_csr, &rnorm1); // rnorm1 = sqrt( rnorm1 ); // convRate = rnorm1 / rnorm; // rnorm = rnorm1; //} convRate = rnorm / rnorm0; while ((rnorm/rnorm0)>=tolerance_ && nTrials rateThresh ) { if ( MLI_Hybrid_NSIncr_ > 1 ) sprintf(paramString, "MLI incrNullSpaceDim %d", MLI_Hybrid_NSIncr_); else sprintf(paramString, "MLI incrNullSpaceDim 2"); HYPRE_LSI_MLISetParams(HYPrecon_, paramString); HYPRE_ParCSRGMRESSetup(HYSolver_, A_csr, b_csr, x_csr); } HYPRE_ParCSRGMRESSolve(HYSolver_, A_csr, b_csr, x_csr); HYPRE_ParCSRGMRESGetNumIterations(HYSolver_, &tempIter); numIterations += tempIter; HYPRE_ParVectorCopy( b_csr, r_csr ); HYPRE_ParCSRMatrixMatvec( -1.0, A_csr, x_csr, 1.0, r_csr ); rnorm1 = rnorm; HYPRE_ParVectorInnerProd( r_csr, r_csr, &rnorm); rnorm = sqrt( rnorm ); convRate = rnorm / rnorm1; } if (rnorm/rnorm0 < tolerance_) retFlag = 0; else if (numIterations < maxIterations_) { HYPRE_ParCSRGMRESSetMaxIter(HYSolver_, maxIterations_-numIterations); retFlag = HYPRE_ParCSRGMRESSolve(HYSolver_,A_csr,b_csr,x_csr); HYPRE_ParCSRGMRESGetNumIterations(HYSolver_, &tempIter); numIterations += tempIter; } else retFlag = 1; } if ( retFlag != 0 ) { printf("HYPRE_LSC::launchSolver ERROR : in GMRES solve.\n"); return retFlag; } switch ( projectionScheme_ ) { case 1 : addToAConjProjectionSpace(currX_,currB_); break; case 2 : addToMinResProjectionSpace(currX_,currB_); break; } if ( numIterations >= maxIterations_ ) status = 1; else status = 0; break; //---------------------------------------------------------------- // choose flexible GMRES //---------------------------------------------------------------- case HYFGMRES : if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 1 && mypid_ == 0 ) { printf("***************************************************\n"); printf("* Flexible GMRES solver \n"); printf("* restart size = %d\n", gmresDim_); printf("* maximum no. of iterations = %d\n", maxIterations_); printf("* convergence tolerance = %e\n", tolerance_); printf("*--------------------------------------------------\n"); } setupFGMRESPrecon(); HYPRE_ParCSRFGMRESSetKDim(HYSolver_, gmresDim_); HYPRE_ParCSRFGMRESSetMaxIter(HYSolver_, maxIterations_); HYPRE_ParCSRFGMRESSetTol(HYSolver_, tolerance_); if ( normAbsRel_ == 0 ) HYPRE_ParCSRFGMRESSetStopCrit(HYSolver_,0); else HYPRE_ParCSRFGMRESSetStopCrit(HYSolver_,1); if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 1 ) { if ( mypid_ == 0 ) printf("***************************************************\n"); HYPRE_ParCSRFGMRESSetLogging(HYSolver_, 1); } retFlag = HYPRE_ParCSRFGMRESSetup(HYSolver_, A_csr, b_csr, x_csr); if ( retFlag != 0 ) { printf("HYPRE_LSC::launchSolver ERROR : in FGMRES setup.\n"); return retFlag; } if ( fgmresUpdateTol_ && HYPreconID_ == HYBLOCK ) HYPRE_ParCSRFGMRESUpdatePrecondTolerance(HYSolver_, HYPRE_LSI_BlockPrecondSetA11Tolerance); MPI_Barrier( comm_ ); ptime = LSC_Wtime(); retFlag = HYPRE_ParCSRFGMRESSolve(HYSolver_, A_csr, b_csr, x_csr); if ( retFlag != 0 ) { printf("HYPRE_LSC::launchSolver ERROR : in FGMRES solve.\n"); return retFlag; } HYPRE_ParCSRFGMRESGetNumIterations(HYSolver_, &numIterations); HYPRE_ParVectorCopy( b_csr, r_csr ); HYPRE_ParCSRMatrixMatvec( -1.0, A_csr, x_csr, 1.0, r_csr ); HYPRE_ParVectorInnerProd( r_csr, r_csr, &rnorm); rnorm = sqrt( rnorm ); switch ( projectionScheme_ ) { case 1 : addToAConjProjectionSpace(currX_,currB_); break; case 2 : addToMinResProjectionSpace(currX_,currB_); break; } if ( numIterations >= maxIterations_ ) status = 1; else status = 0; break; //---------------------------------------------------------------- // choose BiCGSTAB //---------------------------------------------------------------- case HYCGSTAB : if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 1 && mypid_ == 0 ) { printf("***************************************************\n"); printf("* BiCGSTAB solver \n"); printf("* maximum no. of iterations = %d\n", maxIterations_); printf("* convergence tolerance = %e\n", tolerance_); printf("*--------------------------------------------------\n"); } setupBiCGSTABPrecon(); HYPRE_ParCSRBiCGSTABSetMaxIter(HYSolver_, maxIterations_); HYPRE_ParCSRBiCGSTABSetTol(HYSolver_, tolerance_); if ( normAbsRel_ == 0 ) HYPRE_ParCSRBiCGSTABSetStopCrit(HYSolver_,0); else HYPRE_ParCSRBiCGSTABSetStopCrit(HYSolver_,1); if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 1 ) { HYPRE_ParCSRBiCGSTABSetPrintLevel(HYSolver_, 1); if ( mypid_ == 0 ) printf("***************************************************\n"); if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 2 ) HYPRE_ParCSRBiCGSTABSetPrintLevel(HYSolver_, 2); } retFlag = HYPRE_ParCSRBiCGSTABSetup(HYSolver_, A_csr, b_csr, x_csr); if ( retFlag != 0 ) { printf("HYPRE_LSC::launchSolver ERROR : in BiCGSTAB setup.\n"); return retFlag; } MPI_Barrier( comm_ ); ptime = LSC_Wtime(); retFlag = HYPRE_ParCSRBiCGSTABSolve(HYSolver_, A_csr, b_csr, x_csr); if ( retFlag != 0 ) { printf("HYPRE_LSC::launchSolver ERROR : in BiCGSTAB solve.\n"); return retFlag; } HYPRE_ParCSRBiCGSTABGetNumIterations(HYSolver_, &numIterations); HYPRE_ParVectorCopy( b_csr, r_csr ); HYPRE_ParCSRMatrixMatvec( -1.0, A_csr, x_csr, 1.0, r_csr ); HYPRE_ParVectorInnerProd( r_csr, r_csr, &rnorm); rnorm = sqrt( rnorm ); switch ( projectionScheme_ ) { case 1 : addToAConjProjectionSpace(currX_,currB_); break; case 2 : addToMinResProjectionSpace(currX_,currB_); break; } if ( numIterations >= maxIterations_ ) status = 1; else status = 0; break; //---------------------------------------------------------------- // choose BiCGSTABL //---------------------------------------------------------------- case HYCGSTABL : if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 1 && mypid_ == 0 ) { printf("***************************************************\n"); printf("* BiCGSTAB(2) solver \n"); printf("* maximum no. of iterations = %d\n", maxIterations_); printf("* convergence tolerance = %e\n", tolerance_); printf("*--------------------------------------------------\n"); } setupBiCGSTABLPrecon(); HYPRE_ParCSRBiCGSTABLSetMaxIter(HYSolver_, maxIterations_); HYPRE_ParCSRBiCGSTABLSetTol(HYSolver_, tolerance_); if (normAbsRel_ == 0) HYPRE_ParCSRBiCGSTABLSetStopCrit(HYSolver_,0); else HYPRE_ParCSRBiCGSTABLSetStopCrit(HYSolver_,1); if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 1 ) { if ( mypid_ == 0 ) printf("***************************************************\n"); HYPRE_ParCSRBiCGSTABLSetLogging(HYSolver_, 1); } retFlag = HYPRE_ParCSRBiCGSTABLSetup(HYSolver_, A_csr, b_csr, x_csr); if ( retFlag != 0 ) { printf("HYPRE_LSC::launchSolver ERROR : in BiCGSTABL setup.\n"); return retFlag; } MPI_Barrier( comm_ ); ptime = LSC_Wtime(); retFlag = HYPRE_ParCSRBiCGSTABLSolve(HYSolver_, A_csr, b_csr, x_csr); if ( retFlag != 0 ) { printf("HYPRE_LSC::launchSolver ERROR : in BiCGSTABL solve.\n"); return retFlag; } HYPRE_ParCSRBiCGSTABLGetNumIterations(HYSolver_, &numIterations); HYPRE_ParVectorCopy( b_csr, r_csr ); HYPRE_ParCSRMatrixMatvec( -1.0, A_csr, x_csr, 1.0, r_csr ); HYPRE_ParVectorInnerProd( r_csr, r_csr, &rnorm); rnorm = sqrt( rnorm ); switch ( projectionScheme_ ) { case 1 : addToAConjProjectionSpace(currX_,currB_); break; case 2 : addToMinResProjectionSpace(currX_,currB_); break; } if ( numIterations >= maxIterations_ ) status = 1; else status = 0; break; //---------------------------------------------------------------- // choose TFQMR //---------------------------------------------------------------- case HYTFQMR : if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 1 && mypid_ == 0 ) { printf("***************************************************\n"); printf("* TFQMR solver \n"); printf("* maximum no. of iterations = %d\n", maxIterations_); printf("* convergence tolerance = %e\n", tolerance_); printf("*--------------------------------------------------\n"); } setupTFQmrPrecon(); HYPRE_ParCSRTFQmrSetMaxIter(HYSolver_, maxIterations_); HYPRE_ParCSRTFQmrSetTol(HYSolver_, tolerance_); if ( normAbsRel_ == 0 ) HYPRE_ParCSRTFQmrSetStopCrit(HYSolver_,0); else HYPRE_ParCSRTFQmrSetStopCrit(HYSolver_,1); if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 1 ) { if ( mypid_ == 0 ) printf("***************************************************\n"); HYPRE_ParCSRTFQmrSetLogging(HYSolver_, 1); } retFlag = HYPRE_ParCSRTFQmrSetup(HYSolver_, A_csr, b_csr, x_csr); if ( retFlag != 0 ) { printf("HYPRE_LSC::launchSolver ERROR : in TFQMR setup.\n"); return retFlag; } MPI_Barrier( comm_ ); ptime = LSC_Wtime(); retFlag = HYPRE_ParCSRTFQmrSolve(HYSolver_, A_csr, b_csr, x_csr); if ( retFlag != 0 ) { printf("HYPRE_LSC::launchSolver ERROR : in TFQMR solve.\n"); return retFlag; } HYPRE_ParCSRTFQmrGetNumIterations(HYSolver_, &numIterations); HYPRE_ParVectorCopy( b_csr, r_csr ); HYPRE_ParCSRMatrixMatvec( -1.0, A_csr, x_csr, 1.0, r_csr ); HYPRE_ParVectorInnerProd( r_csr, r_csr, &rnorm); rnorm = sqrt( rnorm ); switch ( projectionScheme_ ) { case 1 : addToAConjProjectionSpace(currX_,currB_); break; case 2 : addToMinResProjectionSpace(currX_,currB_); break; } if ( numIterations >= maxIterations_ ) status = 1; else status = 0; break; //---------------------------------------------------------------- // choose BiCGS //---------------------------------------------------------------- case HYBICGS : if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 1 && mypid_ == 0 ) { printf("***************************************************\n"); printf("* BiCGS solver \n"); printf("* maximum no. of iterations = %d\n", maxIterations_); printf("* convergence tolerance = %e\n", tolerance_); printf("*--------------------------------------------------\n"); } setupBiCGSPrecon(); HYPRE_ParCSRBiCGSSetMaxIter(HYSolver_, maxIterations_); HYPRE_ParCSRBiCGSSetTol(HYSolver_, tolerance_); if ( normAbsRel_ == 0 ) HYPRE_ParCSRBiCGSSetStopCrit(HYSolver_,0); else HYPRE_ParCSRBiCGSSetStopCrit(HYSolver_,1); if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 1 ) { if ( mypid_ == 0 ) printf("***************************************************\n"); HYPRE_ParCSRBiCGSSetLogging(HYSolver_, 1); } retFlag = HYPRE_ParCSRBiCGSSetup(HYSolver_, A_csr, b_csr, x_csr); if ( retFlag != 0 ) { printf("HYPRE_LSC::launchSolver ERROR : in CGS setup.\n"); return retFlag; } MPI_Barrier( comm_ ); ptime = LSC_Wtime(); retFlag = HYPRE_ParCSRBiCGSSolve(HYSolver_, A_csr, b_csr, x_csr); if ( retFlag != 0 ) { printf("HYPRE_LSC::launchSolver ERROR : in CGS solve.\n"); return retFlag; } HYPRE_ParCSRBiCGSGetNumIterations(HYSolver_, &numIterations); HYPRE_ParVectorCopy( b_csr, r_csr ); HYPRE_ParCSRMatrixMatvec( -1.0, A_csr, x_csr, 1.0, r_csr ); HYPRE_ParVectorInnerProd( r_csr, r_csr, &rnorm); rnorm = sqrt( rnorm ); switch ( projectionScheme_ ) { case 1 : addToAConjProjectionSpace(currX_,currB_); break; case 2 : addToMinResProjectionSpace(currX_,currB_); break; } if ( numIterations >= maxIterations_ ) status = 1; else status = 0; break; //---------------------------------------------------------------- // choose Symmetric QMR //---------------------------------------------------------------- case HYSYMQMR : if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 1 && mypid_ == 0 ) { printf("***************************************************\n"); printf("* SymQMR solver (for symmetric matrices and precond) \n"); printf("* maximum no. of iterations = %d\n", maxIterations_); printf("* convergence tolerance = %e\n", tolerance_); printf("*--------------------------------------------------\n"); } setupSymQMRPrecon(); HYPRE_ParCSRSymQMRSetMaxIter(HYSolver_, maxIterations_); HYPRE_ParCSRSymQMRSetTol(HYSolver_, tolerance_); if ( normAbsRel_ == 0 ) HYPRE_ParCSRSymQMRSetStopCrit(HYSolver_,0); else HYPRE_ParCSRSymQMRSetStopCrit(HYSolver_,1); if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 1 ) { if ( mypid_ == 0 ) printf("***************************************************\n"); HYPRE_ParCSRSymQMRSetLogging(HYSolver_, 1); } retFlag = HYPRE_ParCSRSymQMRSetup(HYSolver_, A_csr, b_csr, x_csr); if ( retFlag != 0 ) { printf("HYPRE_LSC::launchSolver ERROR : in SymQMR setup.\n"); return retFlag; } MPI_Barrier( comm_ ); ptime = LSC_Wtime(); retFlag = HYPRE_ParCSRSymQMRSolve(HYSolver_, A_csr, b_csr, x_csr); if ( retFlag != 0 ) { printf("HYPRE_LSC::launchSolver ERROR : in SymQMR solve.\n"); return retFlag; } HYPRE_ParCSRSymQMRGetNumIterations(HYSolver_, &numIterations); HYPRE_ParVectorCopy( b_csr, r_csr ); HYPRE_ParCSRMatrixMatvec( -1.0, A_csr, x_csr, 1.0, r_csr ); HYPRE_ParVectorInnerProd( r_csr, r_csr, &rnorm); rnorm = sqrt( rnorm ); switch ( projectionScheme_ ) { case 1 : addToAConjProjectionSpace(currX_,currB_); break; case 2 : addToMinResProjectionSpace(currX_,currB_); break; } if ( numIterations >= maxIterations_ ) status = 1; else status = 0; break; //---------------------------------------------------------------- // choose Boomeramg //---------------------------------------------------------------- case HYAMG : solveUsingBoomeramg(status); HYPRE_BoomerAMGGetNumIterations(HYSolver_, &numIterations); HYPRE_ParVectorCopy( b_csr, r_csr ); HYPRE_ParCSRMatrixMatvec( -1.0, A_csr, x_csr, 1.0, r_csr ); HYPRE_ParVectorInnerProd( r_csr, r_csr, &rnorm); rnorm = sqrt( rnorm ); if ( numIterations >= maxIterations_ ) status = 1; else status = 0; ptime = stime; //printf("Boomeramg solver - return status = %d\n",status); break; //---------------------------------------------------------------- // choose SuperLU (single processor) //---------------------------------------------------------------- case HYSUPERLU : if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 1 && mypid_ == 0 ) { printf("***************************************************\n"); printf("* SuperLU (sequential) solver \n"); printf("*--------------------------------------------------\n"); } rnorm = solveUsingSuperLU(status); #ifndef NOFEI if ( status == 1 ) status = 0; #endif numIterations = 1; ptime = stime; //printf("SuperLU solver - return status = %d\n",status); break; //---------------------------------------------------------------- // choose SuperLU (single processor) //---------------------------------------------------------------- case HYSUPERLUX : if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 1 && mypid_ == 0 ) { printf("***************************************************\n"); printf("* SuperLU (sequential) solver with refinement \n"); printf("*--------------------------------------------------\n"); } rnorm = solveUsingSuperLUX(status); #ifndef NOFEI if ( status == 1 ) status = 0; #endif numIterations = 1; //printf("SuperLUX solver - return status = %d\n",status); break; //---------------------------------------------------------------- // choose distributed SuperLU //---------------------------------------------------------------- case HYDSUPERLU : #ifdef HYPRE_USING_DSUPERLU if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 1 && mypid_ == 0 ) { printf("***************************************************\n"); printf("* distributed SuperLU solver \n"); printf("*--------------------------------------------------\n"); } rnorm = solveUsingDSuperLU(status); #ifndef NOFEI if ( status == 1 ) status = 0; #endif numIterations = 1; #else printf("distributed SuperLU not available.\n"); exit(1); #endif break; //---------------------------------------------------------------- // choose Y12M (single processor) //---------------------------------------------------------------- case HYY12M : #ifdef Y12M if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 1 && mypid_ == 0 ) { printf("***************************************************\n"); printf("* Y12M (sequential) solver\n"); printf("*--------------------------------------------------\n"); } solveUsingY12M(status); #ifndef NOFEI if ( status == 1 ) status = 0; #endif numIterations = 1; ptime = stime; //printf("Y12M solver - return status = %d\n",status); break; #else printf("HYPRE_LSC : Y12M not available. \n"); exit(1); break; #endif //---------------------------------------------------------------- // choose AMGE (single processor) //---------------------------------------------------------------- case HYAMGE : #ifdef HAVE_AMGE if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 1 && mypid_ == 0 ) { printf("***************************************************\n"); printf("* AMGe (sequential) solver\n"); printf("*--------------------------------------------------\n"); } solveUsingAMGe(numIterations); if ( numIterations >= maxIterations_ ) status = 1; ptime = stime; #else printf("AMGe not supported.\n"); #endif break; } //------------------------------------------------------------------- // recover solution for reduced system //------------------------------------------------------------------- if ( slideReduction_ == 1 ) { newnorm = rnorm; rnorm = buildSlideReducedSoln(); } else if ( slideReduction_ == 2 ) { newnorm = rnorm; rnorm = buildSlideReducedSoln2(); } else if ( slideReduction_ == 3 || slideReduction_ == 4 ) { newnorm = rnorm; currA_ = TempA; currX_ = TempX; currB_ = TempB; currR_ = TempR; HYPRE_IJMatrixGetObject(currA_, (void **) &A_csr); HYPRE_IJVectorGetObject(currX_, (void **) &x_csr); HYPRE_IJVectorGetObject(currB_, (void **) &b_csr); HYPRE_IJVectorGetObject(currR_, (void **) &r_csr); if ( slideReduction_ == 3 ) slideObj->buildReducedSolnVector(currX_, currB_); else slideObj->buildModifiedSolnVector(currX_); HYPRE_ParVectorCopy( b_csr, r_csr ); HYPRE_ParCSRMatrixMatvec( -1.0, A_csr, x_csr, 1.0, r_csr ); HYPRE_ParVectorInnerProd( r_csr, r_csr, &rnorm); rnorm = sqrt( rnorm ); } else if ( schurReduction_ == 1 ) { newnorm = rnorm; rnorm = buildSchurReducedSoln(); } if ( (normalEqnFlag_ & 7) == 7 ) { HYPRE_IJMatrixGetObject(currA_, (void **) &A_csr); HYPRE_IJVectorGetObject(currX_, (void **) &x_csr); HYPRE_IJVectorGetObject(currB_, (void **) &b_csr); HYPRE_IJVectorGetObject(currR_, (void **) &r_csr); HYPRE_ParVectorCopy( b_csr, r_csr ); HYPRE_ParCSRMatrixMatvec( -1.0, A_csr, x_csr, 1.0, r_csr ); HYPRE_ParVectorInnerProd( r_csr, r_csr, &rnorm); rnorm = sqrt( rnorm ); } //------------------------------------------------------------------- // register solver return information and print timing information //------------------------------------------------------------------- solveStatus = status; iterations = numIterations; rnorm_ = rnorm; MPI_Barrier(comm_); etime = LSC_Wtime(); if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 1 && mypid_ == 0 ) { printf("***************************************************\n"); printf("* Solver Statistics *\n"); printf("*-------------------------------------------------*\n"); if ( slideReduction_ || schurReduction_ ) printf("** HYPRE matrix reduction time = %e\n",rtime2-rtime1); printf("** HYPRE preconditioner setup time = %e\n", ptime - stime); printf("** HYPRE solution time = %e\n", etime - ptime); printf("** HYPRE total time = %e\n", etime - stime); printf("** HYPRE number of iterations = %d\n", numIterations); if ( slideReduction_ || schurReduction_ ) printf("** HYPRE reduced residual norm = %e\n", newnorm); printf("** HYPRE final residual norm = %e\n", rnorm); printf("***************************************************\n"); } //------------------------------------------------------------------- // write solution to an output file //------------------------------------------------------------------- if ( HYOutputLevel_ & HYFEI_PRINTSOL ) { nrows = localEndRow_ - localStartRow_ + 1; startRow = localStartRow_ - 1; sprintf(fname, "hypre_sol.out.%d", mypid_); fp = fopen( fname, "w"); fprintf(fp, "%6d \n", nrows); for ( i = startRow; i < startRow+nrows; i++ ) { HYPRE_IJVectorGetValues(currX_, 1, &i, &ddata); fprintf(fp, "%6d %25.16e \n", i+1, ddata); } fclose(fp); MPI_Barrier(comm_); } //------------------------------------------------------------------- // diagnostic message //------------------------------------------------------------------- if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 3 ) printf("%4d : HYPRE_LSC::leaving launchSolver.\n", mypid_); return (0); } //*************************************************************************** // this function extracts the matrix in a CSR format //--------------------------------------------------------------------------- int HYPRE_LinSysCore::writeSystem(const char *name) { (void) name; printf("HYPRE_LinsysCore : writeSystem not implemented.\n"); return (0); } //*************************************************************************** // this function computes matrix vector product //--------------------------------------------------------------------------- int HYPRE_LinSysCore::HYPRE_LSC_Matvec(void *x, void *y) { HYPRE_ParCSRMatrix A_csr; HYPRE_ParVector x_csr = (HYPRE_ParVector) x; HYPRE_ParVector y_csr = (HYPRE_ParVector) y; HYPRE_IJMatrixGetObject(currA_, (void **) &A_csr); HYPRE_ParCSRMatrixMatvec(1.0, A_csr, x_csr, 0.0, y_csr); return (0); } //*************************************************************************** // this function computes vector multiply and add //--------------------------------------------------------------------------- int HYPRE_LinSysCore::HYPRE_LSC_Axpby(double a, void *x, double b, void *y) { HYPRE_ParVector x_csr = (HYPRE_ParVector) x; HYPRE_ParVector y_csr = (HYPRE_ParVector) y; if ( b != 1.0 ) HYPRE_ParVectorScale( b, y_csr); hypre_ParVectorAxpy(a, (hypre_ParVector*) x_csr, (hypre_ParVector*) y_csr); return (0); } //*************************************************************************** // this function fetches the right hand side vector //--------------------------------------------------------------------------- void *HYPRE_LinSysCore::HYPRE_LSC_GetRHSVector() { HYPRE_ParVector b_csr; HYPRE_IJVectorGetObject(HYb_, (void **) &b_csr); return (void *) b_csr; } //*************************************************************************** // this function fetches the solution vector //--------------------------------------------------------------------------- void *HYPRE_LinSysCore::HYPRE_LSC_GetSolVector() { HYPRE_ParVector x_csr; HYPRE_IJVectorGetObject(HYx_, (void **) &x_csr); return (void *) x_csr; } //*************************************************************************** // this function fetches the matrix //--------------------------------------------------------------------------- void *HYPRE_LinSysCore::HYPRE_LSC_GetMatrix() { HYPRE_ParCSRMatrix A_csr; HYPRE_IJMatrixGetObject(currA_, (void **) &A_csr); return (void *) A_csr; } //*************************************************************************** // this function set column ranges //--------------------------------------------------------------------------- void *HYPRE_LinSysCore::HYPRE_LSC_SetColMap(int start, int end) { localStartCol_ = start; localEndCol_ = end; return (void *) NULL; } //*************************************************************************** // this function set column ranges //--------------------------------------------------------------------------- void *HYPRE_LinSysCore::HYPRE_LSC_MatMatMult(void *inMat) { HYPRE_ParCSRMatrix A_csr; hypre_ParCSRMatrix *B_csr, *C_csr; HYPRE_IJMatrixGetObject(currA_, (void **) &A_csr); B_csr = (hypre_ParCSRMatrix *) inMat; C_csr = hypre_ParMatmul((hypre_ParCSRMatrix *)A_csr,B_csr); return (void *) C_csr; } //*************************************************************************** // this function returns the residual norm //--------------------------------------------------------------------------- double HYPRE_LinSysCore::HYPRE_LSC_GetRNorm() { return rnorm_; } hypre-2.33.0/src/FEI_mv/fei-hypre/HYPRE_LinSysCore.h000066400000000000000000000751721477326011500217060ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ // ************************************************************************* // This is the HYPRE implementation of LinearSystemCore. // ************************************************************************* #ifndef _HYPRE_LinSysCore_h_ #define _HYPRE_LinSysCore_h_ #define HYPRE_FEI_Version() "FEI/HYPRE 2.7.0R1" // ************************************************************************* // system libraries used // ------------------------------------------------------------------------- #include #include #include #include #ifdef NOFEI #undef NOFEI #endif // ************************************************************************* // FEI-specific include files // ------------------------------------------------------------------------- #include "HYPRE_FEI_includes.h" // ************************************************************************* // local enumerations and defines // ------------------------------------------------------------------------- enum HYsolverID {HYPCG,HYLSICG,HYGMRES,HYFGMRES,HYCGSTAB,HYCGSTABL,HYTFQMR, HYBICGS,HYSYMQMR,HYAMG,HYSUPERLU,HYSUPERLUX,HYDSUPERLU, HYY12M,HYAMGE,HYHYBRID}; enum HYpreconID {HYIDENTITY,HYDIAGONAL,HYPILUT,HYPARASAILS,HYBOOMERAMG,HYML, HYDDILUT,HYPOLY,HYDDICT,HYSCHWARZ,HYEUCLID,HYBLOCK,HYMLI, HYUZAWA,HYMLMAXWELL,HYAMS,HYSYSPDE,HYDSLU}; #define HYFEI_HIGHMASK (2147483647-255) #define HYFEI_SPECIALMASK 255 #define HYFEI_SLIDEREDUCE1 256 #define HYFEI_SLIDEREDUCE2 512 #define HYFEI_SLIDEREDUCE3 1024 #define HYFEI_PRINTMAT 2048 #define HYFEI_PRINTREDMAT 4096 #define HYFEI_PRINTSOL 8192 #define HYFEI_DDILUT 16384 #define HYFEI_SCHURREDUCE1 32768 #define HYFEI_SCHURREDUCE2 65536 #define HYFEI_SCHURREDUCE3 131072 #define HYFEI_PRINTFEINFO 262144 #define HYFEI_AMGDEBUG 524288 #define HYFEI_STOPAFTERPRINT 1048576 #define HYFEI_PRINTPARCSRMAT 2097152 #define HYFEI_IMPOSENOBC 4194304 // ************************************************************************* // substructure definition // ------------------------------------------------------------------------- typedef struct { HYPRE_BigInt *EdgeNodeList_; HYPRE_BigInt *NodeNumbers_; HYPRE_Int numEdges_; HYPRE_Int numLocalNodes_; HYPRE_Int numNodes_; HYPRE_Real *NodalCoord_; } HYPRE_FEI_AMSData; // ************************************************************************* // class definition // ------------------------------------------------------------------------- class HYPRE_LinSysCore #ifndef NOFEI : public LinearSystemCore #endif { public: HYPRE_LinSysCore(MPI_Comm comm); virtual ~HYPRE_LinSysCore(); // ---------------------------------------------------------------------- // for creating another one, w/o knowing the run-time type of 'this' one. // ---------------------------------------------------------------------- #ifndef NOFEI LinearSystemCore* clone(); #endif // ---------------------------------------------------------------------- // parameters : for setting generic argc/argv style parameters. // ---------------------------------------------------------------------- int parameters(int numParams, char** params); // ---------------------------------------------------------------------- // new functions in FEI 1.5 and above (not implemented here) // ---------------------------------------------------------------------- int setLookup(Lookup& lookup); int setConnectivities(GlobalID elemBlock, int numElements, int numNodesPerElem, const GlobalID* elemIDs, const int* const* connNodes) ; int setStiffnessMatrices(GlobalID elemBlock, int numElems, const GlobalID* elemIDs, const double *const *const *stiff, int numEqnsPerElem, const int *const * eqnIndices); int setLoadVectors(GlobalID elemBlock, int numElems, const GlobalID* elemIDs, const double *const * load, int numEqnsPerElem, const int *const * eqnIndices); int setMultCREqns(int multCRSetID, int numCRs, int numNodesPerCR, int** nodeNumbers, int** eqnNumbers, int* fieldIDs, int* multiplierEqnNumbers); int setPenCREqns(int penCRSetID, int numCRs, int numNodesPerCR, int** nodeNumbers, int** eqnNumbers, int* fieldIDs); // ---------------------------------------------------------------------- // setGlobalOffsets : provide info for initial creation of // matrix/vector data, Equation numbers are 1-based, and local sets // of equation numbers are contiguous. // ---------------------------------------------------------------------- int setGlobalOffsets(int len, int* nodeOffsets, int* eqnOffsets, int* blkEqnOffsets); // ---------------------------------------------------------------------- // setMatrixStructure : provide enough info to allocate the matrix -- // i.e., define the structure. // ---------------------------------------------------------------------- int setMatrixStructure(int** ptColIndices, int* ptRowLengths, int** blkColIndices, int* blkRowLengths, int* ptRowsPerBlkRow); // ---------------------------------------------------------------------- // resetMatrixAndVector : don't destroy the structure of the matrix, // but set the value 's' throughout the matrix and vectors. // ---------------------------------------------------------------------- int resetMatrixAndVector(double s); // ---------------------------------------------------------------------- // reset matrix and vector individually // ---------------------------------------------------------------------- int resetMatrix(double s); int resetRHSVector(double s); // ---------------------------------------------------------------------- // sumIntoSystemMatrix: // this is the primary assembly function. The coefficients 'values' // are to be accumumlated into (added to any values already in place) // global (0-based) equation 'row' of the matrix. // ---------------------------------------------------------------------- int sumIntoSystemMatrix(int numPtRows, const int* ptRows, int numPtCols, const int* ptCols, int numBlkRows, const int* blkRows, int numBlkCols, const int* blkCols, const double* const* values); // ---------------------------------------------------------------------- // sumIntoSystemMatrix: // this is the primary assembly function. The coefficients 'values' // are to be accumumlated into (added to any values already in place) // global (1-based) [old - 0-based] equation 'row' of the matrix. // ---------------------------------------------------------------------- int sumIntoSystemMatrix(int numPtRows, const int* ptRows, int numPtCols, const int* ptCols, const double* const* values); // ---------------------------------------------------------------------- // Point-entry matrix data as for 'sumIntoSystemMatrix', but in this case // the data should be "put" into the matrix (i.e., overwrite any coefficients // already present) rather than being "summed" into the matrix. // ---------------------------------------------------------------------- int putIntoSystemMatrix(int numPtRows, const int* ptRows, int numPtCols, const int* ptCols, const double* const* values); // ---------------------------------------------------------------------- // Get the length of a row of the matrix. // ---------------------------------------------------------------------- int getMatrixRowLength(int row, int& length); // ---------------------------------------------------------------------- // Obtain the coefficients and indices for a row of the matrix. // ---------------------------------------------------------------------- int getMatrixRow(int row, double* coefs, int* indices, int len, int& rowLength); // ---------------------------------------------------------------------- // sumIntoRHSVector: // this is the rhs vector equivalent to sumIntoSystemMatrix above. // ---------------------------------------------------------------------- int sumIntoRHSVector(int num, const double* values, const int* indices); // ---------------------------------------------------------------------- // For putting coefficients into the rhs vector // ---------------------------------------------------------------------- int putIntoRHSVector(int num, const double* values, const int* indices); // ---------------------------------------------------------------------- // For getting coefficients out of the rhs vector // ---------------------------------------------------------------------- int getFromRHSVector(int num, double* values, const int* indices); // ---------------------------------------------------------------------- // matrixLoadComplete: // do any internal synchronization/communication. // ---------------------------------------------------------------------- int matrixLoadComplete(); // ---------------------------------------------------------------------- // Pass nodal data that probably doesn't mean anything to the FEI // implementation, but may mean something to the linear solver. Examples: // geometric coordinates, nullspace data, etc. // ---------------------------------------------------------------------- int putNodalFieldData(int fieldID, int fieldSize, int* nodeNumbers, int numNodes, const double* data); // ---------------------------------------------------------------------- // functions for enforcing boundary conditions. // ---------------------------------------------------------------------- int enforceEssentialBC(int* globalEqn,double* alpha,double* gamma,int len); int enforceRemoteEssBCs(int numEqns, int* globalEqns, int** colIndices, int* colIndLen, double** coefs); int enforceOtherBC(int* globalEqn, double* alpha, double* beta, double* gamma, int len); // ---------------------------------------------------------------------- //functions for getting/setting matrix or vector pointers. // ---------------------------------------------------------------------- // ---------------------------------------------------------------------- // getMatrixPtr: // obtain a pointer to the 'A' matrix. This should be considered a // constant pointer -- i.e., this class remains responsible for the // matrix (e.g., de-allocation upon destruction). // ---------------------------------------------------------------------- #ifndef NOFEI int getMatrixPtr(Data& data); #endif // ---------------------------------------------------------------------- // copyInMatrix: // replaces the internal matrix with a copy of the input argument, scaled // by the coefficient 'scalar'. // ---------------------------------------------------------------------- #ifndef NOFEI int copyInMatrix(double scalar, const Data& data); #endif // ---------------------------------------------------------------------- // copyOutMatrix: // passes out a copy of the internal matrix, scaled by the coefficient // 'scalar'. // ---------------------------------------------------------------------- #ifndef NOFEI int copyOutMatrix(double scalar, Data& data); #endif // ---------------------------------------------------------------------- // sumInMatrix: // accumulate (sum) a copy of the input argument into the internal // matrix, scaling the input by the coefficient 'scalar'. // ---------------------------------------------------------------------- #ifndef NOFEI int sumInMatrix(double scalar, const Data& data); #endif // ---------------------------------------------------------------------- // get/setRHSVectorPtr: // the same semantics apply here as for the matrixPtr functions above. // ---------------------------------------------------------------------- #ifndef NOFEI int getRHSVectorPtr(Data& data); #endif // ---------------------------------------------------------------------- // copyInRHSVector/copyOutRHSVector/sumInRHSVector: // the same semantics apply here as for the matrix functions above. // ---------------------------------------------------------------------- #ifndef NOFEI int copyInRHSVector(double scalar, const Data& data); int copyOutRHSVector(double scalar, Data& data); int sumInRHSVector(double scalar, const Data& data); #endif // ---------------------------------------------------------------------- // destroyMatrixData/destroyVectorData: // Utility function for destroying the matrix (or vector) in Data // ---------------------------------------------------------------------- #ifndef NOFEI int destroyMatrixData(Data& data); int destroyVectorData(Data& data); #endif // ---------------------------------------------------------------------- // functions for managing multiple rhs vectors // ---------------------------------------------------------------------- int setNumRHSVectors(int numRHSs, const int* rhsIDs); // ---------------------------------------------------------------------- // setRHSID: // set the 'current' rhs context, assuming multiple rhs vectors. // ---------------------------------------------------------------------- int setRHSID(int rhsID); // ---------------------------------------------------------------------- // putInitialGuess: // function for setting (a subset of) the initial-guess // solution values (i.e., in the 'x' vector). // ---------------------------------------------------------------------- int putInitialGuess(const int* eqnNumbers, const double* values,int len); // ---------------------------------------------------------------------- // function for getting all of the answers ('x' vector). // ---------------------------------------------------------------------- int getSolution(double* answers, int len); // ---------------------------------------------------------------------- // function for getting the (single) entry at equation number 'eqnNumber'. // ---------------------------------------------------------------------- int getSolnEntry(int eqnNumber, double& answer); // ---------------------------------------------------------------------- // This will be called to request that LinearSystemCore form the residual // vector r = b - A*x, and pass the coefficients for r back out in the // 'values' list. // ---------------------------------------------------------------------- int formResidual(double* values, int len); double HYPRE_LSC_GetRNorm(); // ---------------------------------------------------------------------- // function for launching the linear solver // ---------------------------------------------------------------------- int launchSolver(int& solveStatus, int& iterations); // ---------------------------------------------------------------------- // other functions // ---------------------------------------------------------------------- int writeSystem(const char *); // ---------------------------------------------------------------------- // old functions before FEI 1.5 (but still needed here) // ---------------------------------------------------------------------- int createMatricesAndVectors(int numGlobalEqns, int firstLocalEqn, int numLocalEqns); int allocateMatrix(int** colIndices, int* rowLengths); int sumIntoSystemMatrix(int row, int numValues, const double* values, const int* scatterIndices); // ---------------------------------------------------------------------- // HYPRE-specific public functions // ---------------------------------------------------------------------- void loadConstraintNumbers(int length, int *list); char *getVersion(); void beginCreateMapFromSoln(); void endCreateMapFromSoln(); void putIntoMappedMatrix(int row, int numValues, const double* values, const int* scatterIndices); void getFEDataObject(void **object) { (*object) = feData_; } int HYPRE_LSC_Matvec(void *x, void *y); int HYPRE_LSC_Axpby(double, void *, double, void *); void *HYPRE_LSC_GetRHSVector(); void *HYPRE_LSC_GetSolVector(); void *HYPRE_LSC_GetMatrix(); void *HYPRE_LSC_SetColMap(int, int); void *HYPRE_LSC_MatMatMult(void *); // ---------------------------------------------------------------------- // MLI-specific public functions // ---------------------------------------------------------------------- void FE_initFields(int nFields, int *fieldSizes, int *fieldIDs); void FE_initElemBlock(int nElems, int nNodesPerElem, int numNodeFields, int *nodeFieldIDs); void FE_initElemNodeList(int elemID, int nNodesPerElem, int *nodeIDs); void FE_initSharedNodes(int nShared, int *sharedIDs, int *sharedPLengs, int **sharedProcs); void FE_initComplete(); void FE_loadElemMatrix(int elemID, int nNodes, int *elemNodeList, int matDim, double **elemMat); private: //functions // ---------------------------------------------------------------------- // HYPRE specific private functions // ---------------------------------------------------------------------- void setupPCGPrecon(); void setupLSICGPrecon(); void setupGMRESPrecon(); void setupFGMRESPrecon(); void setupBiCGSTABPrecon(); void setupBiCGSTABLPrecon(); void setupTFQmrPrecon(); void setupBiCGSPrecon(); void setupSymQMRPrecon(); void setupPreconBoomerAMG(); void setupPreconParaSails(); void setupPreconDDICT(); void setupPreconDDILUT(); void setupPreconPILUT(); void setupPreconPoly(); void setupPreconSchwarz(); void setupPreconML(); void setupPreconMLMaxwell(); void setupPreconAMS(); void setupPreconBlock(); void setupPreconEuclid(); void setupPreconSysPDE(); void solveUsingBoomeramg(int&); double solveUsingSuperLU(int&); double solveUsingSuperLUX(int&); double solveUsingDSuperLU(int&); void solveUsingY12M(int&); void solveUsingAMGe(int&); void buildSlideReducedSystem(); void buildSlideReducedSystem2(); double buildSlideReducedSoln(); double buildSlideReducedSoln2(); void buildSchurReducedSystem(); void buildSchurReducedSystem2(); void buildSlideReducedSystemPartA(int*,int*,int,int,int*,int*); void buildSlideReducedSystemPartB(int*,int*,int,int,int*,int*, HYPRE_ParCSRMatrix *); void buildSlideReducedSystemPartC(int*,int*,int,int,int*,int*, HYPRE_ParCSRMatrix); void buildSchurReducedRHS(); void buildSchurInitialGuess(); double buildSchurReducedSoln(); void computeAConjProjection(HYPRE_ParCSRMatrix A_csr, HYPRE_ParVector x, HYPRE_ParVector b); void computeMinResProjection(HYPRE_ParCSRMatrix A_csr, HYPRE_ParVector x, HYPRE_ParVector b); void addToAConjProjectionSpace(HYPRE_IJVector x, HYPRE_IJVector b); void addToMinResProjectionSpace(HYPRE_IJVector x, HYPRE_IJVector b); int HYPRE_Schur_Search(int,int,int*,int*,int,int); void HYPRE_LSI_BuildNodalCoordinates(); // ---------------------------------------------------------------------- // private functions for selecting solver/preconditioner // ---------------------------------------------------------------------- void selectSolver(char* name); void selectPreconditioner(char* name); private: //variables // ---------------------------------------------------------------------- // parallel communication information and output levels // ---------------------------------------------------------------------- MPI_Comm comm_; // MPI communicator int numProcs_; // number of processors int mypid_; // my processor ID int HYOutputLevel_; // control print information int memOptimizerFlag_; // turn on memory optimizer // ---------------------------------------------------------------------- // for storing information about how to load matrix directly (bypass FEI) // ---------------------------------------------------------------------- int mapFromSolnFlag_; int mapFromSolnLeng_; int mapFromSolnLengMax_; int *mapFromSolnList_; int *mapFromSolnList2_; // ---------------------------------------------------------------------- // matrix and vectors // ---------------------------------------------------------------------- HYPRE_IJMatrix HYA_; // the system matrix HYPRE_IJMatrix HYnormalA_; // normalized system matrix HYPRE_IJVector HYb_; // the current RHS HYPRE_IJVector HYnormalB_; // normalized system rhs HYPRE_IJVector *HYbs_; // an array of RHSs HYPRE_IJVector HYx_; // the solution vector HYPRE_IJVector HYr_; // temporary vector for residual HYPRE_IJVector *HYpxs_; // an array of previous solutions HYPRE_IJVector *HYpbs_; // an array of previous rhs int numGlobalRows_; int localStartRow_; int localEndRow_; int localStartCol_; int localEndCol_; int *rowLengths_; int **colIndices_; double **colValues_; double truncThresh_; double rnorm_; // ---------------------------------------------------------------------- // matrix and vectors for reduction // ---------------------------------------------------------------------- HYPRE_IJMatrix reducedA_; // matrix for reduction HYPRE_IJVector reducedB_; // RHS vector for reduction HYPRE_IJVector reducedX_; // solution vector for reduction HYPRE_IJVector reducedR_; // temporary vector for reduction HYPRE_IJMatrix HYA21_; // (2,1) block in reduction HYPRE_IJMatrix HYA12_; // (1,2) block in reduction int A21NRows_; // number of rows in (2,1) block int A21NCols_; // number of cols in (2,1) block int reducedAStartRow_; // Nrows in reduced system HYPRE_IJMatrix HYinvA22_; // inv(A22) in slide reduction // ---------------------------------------------------------------------- // pointers to current matrix and vectors for solver // ---------------------------------------------------------------------- HYPRE_IJMatrix currA_; HYPRE_IJVector currB_; HYPRE_IJVector currX_; HYPRE_IJVector currR_; int currentRHS_; int *rhsIDs_; int numRHSs_; int nStored_; int *storedIndices_; int *auxStoredIndices_; int mRHSFlag_; int mRHSNumGEqns_; int *mRHSGEqnIDs_; int *mRHSNEntries_; int *mRHSBCType_; int **mRHSRowInds_; double **mRHSRowVals_; // ---------------------------------------------------------------------- // flags for matrix assembly, various reductions, and projections // ---------------------------------------------------------------------- int matrixVectorsCreated_; int systemAssembled_; int slideReduction_; double slideReductionMinNorm_; int slideReductionScaleMatrix_; int schurReduction_; int schurReductionCreated_; int projectionScheme_; int projectSize_; int projectCurrSize_; double **projectionMatrix_; int normalEqnFlag_; void *slideObj_; // ---------------------------------------------------------------------- // variables for slide and Schur reduction // ---------------------------------------------------------------------- int *selectedList_; int *selectedListAux_; int nConstraints_; int *constrList_; int matrixPartition_; // ---------------------------------------------------------------------- // variables for the selected solver and preconditioner // ---------------------------------------------------------------------- char *HYSolverName_; HYPRE_Solver HYSolver_; HYsolverID HYSolverID_; int gmresDim_; int fgmresUpdateTol_; int maxIterations_; double tolerance_; int normAbsRel_; int pcgRecomputeRes_; char *HYPreconName_; HYPRE_Solver HYPrecon_; HYpreconID HYPreconID_; int HYPreconReuse_; int HYPreconSetup_; // ---------------------------------------------------------------------- // preconditioner specific variables // ---------------------------------------------------------------------- int amgMaxLevels_; int amgCoarsenType_; int amgMaxIter_; int amgMeasureType_; int amgNumSweeps_[4]; int amgRelaxType_[4]; int amgGridRlxType_; double amgRelaxWeight_[25]; double amgRelaxOmega_[25]; double amgStrongThreshold_; int amgSystemSize_; int amgSmoothType_; int amgSmoothNumLevels_; int amgSmoothNumSweeps_; int amgCGSmoothNumSweeps_; double amgSchwarzRelaxWt_; int amgSchwarzVariant_; int amgSchwarzOverlap_; int amgSchwarzDomainType_; int amgUseGSMG_; int amgGSMGNSamples_; int amgAggLevels_; int amgInterpType_; int amgPmax_; int pilutFillin_; double pilutDropTol_; int pilutMaxNnzPerRow_; int parasailsSym_; double parasailsThreshold_; int parasailsNlevels_; double parasailsFilter_; double parasailsLoadbal_; int parasailsReuse_; int mlMethod_; int mlNumPreSweeps_; int mlNumPostSweeps_; int mlPresmootherType_; int mlPostsmootherType_; double mlRelaxWeight_; double mlStrongThreshold_; int mlCoarseSolver_; int mlCoarsenScheme_; int mlNumPDEs_; int superluOrdering_; char superluScale_[1]; double ddilutFillin_; double ddilutDropTol_; int ddilutOverlap_; int ddilutReorder_; double ddictFillin_; double ddictDropTol_; double schwarzFillin_; int schwarzNblocks_; int schwarzBlksize_; int polyOrder_; int euclidargc_; char **euclidargv_; HYPRE_IJVector amsX_; HYPRE_IJVector amsY_; HYPRE_IJVector amsZ_; int localStartRowAMSV_; int localEndRowAMSV_; HYPRE_IJMatrix amsG_; HYPRE_IJMatrix amsD0_; HYPRE_IJMatrix amsD1_; int localStartRowAMSG_; int localEndRowAMSG_; int localStartColAMSG_; int localEndColAMSG_; HYPRE_ParCSRMatrix amsBetaPoisson_; int amsNumPDEs_; int amsMaxIter_; double amsTol_; int amsCycleType_; int amsRelaxType_; int amsRelaxTimes_; double amsRelaxWt_; double amsRelaxOmega_; int amsPrintLevel_; int amsAlphaCoarsenType_; int amsAlphaAggLevels_; int amsAlphaRelaxType_; double amsAlphaStrengthThresh_; int amsAlphaInterpType_; int amsAlphaPmax_; int amsBetaCoarsenType_; int amsBetaAggLevels_; int amsBetaRelaxType_; double amsBetaStrengthThresh_; int amsBetaInterpType_; int amsBetaPmax_; int sysPDEMethod_; int sysPDEFormat_; double sysPDETol_; int sysPDEMaxIter_; int sysPDENumPre_; int sysPDENumPost_; int sysPDENVars_; // ---------------------------------------------------------------------- // FEI and MLI variables // ---------------------------------------------------------------------- void *feData_; int haveFEData_; Lookup *lookup_; int haveLookup_; int MLI_NumNodes_; int MLI_FieldSize_; int *MLI_EqnNumbers_; double *MLI_NodalCoord_; int MLI_Hybrid_NSIncr_; int MLI_Hybrid_GSA_; int MLI_Hybrid_MaxIter_; double MLI_Hybrid_ConvRate_; int MLI_Hybrid_NTrials_; HYPRE_FEI_AMSData AMSData_; int FEI_mixedDiagFlag_; double *FEI_mixedDiag_; // ---------------------------------------------------------------------- // ML Maxwell variables // ---------------------------------------------------------------------- HYPRE_ParCSRMatrix maxwellANN_; // Maxwell nodal matrix HYPRE_ParCSRMatrix maxwellGEN_; // Maxwell gradient matrix // ---------------------------------------------------------------------- // temporary functions for testing purposes // ---------------------------------------------------------------------- friend void fei_hypre_test(int argc, char *argv[]); friend void fei_hypre_domaindecomposition(int argc, char *argv[]); }; #endif hypre-2.33.0/src/FEI_mv/fei-hypre/HYPRE_MHMatrix.h000066400000000000000000000032231477326011500213310ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************/ /* data structures for local matrix */ /*--------------------------------------------------------------------------*/ #ifndef _MHMAT_ #define _MHMAT_ #ifdef HAVE_ML #include "ml_struct.h" #include "ml_aggregate.h" #include "ml_amg.h" #endif typedef struct { int Nrows; int *rowptr; int *colnum; int *map; double *values; int sendProcCnt; int *sendProc; int *sendLeng; int **sendList; int recvProcCnt; int *recvProc; int *recvLeng; } MH_Matrix; typedef struct { MH_Matrix *Amat; MPI_Comm comm; int globalEqns; int *partition; } MH_Context; typedef struct { MPI_Comm comm; #ifdef HAVE_ML ML *ml_ptr; #endif int nlevels; int method; int num_PDEs; int pre, post; int pre_sweeps, post_sweeps; int BGS_blocksize; double jacobi_wt; double ag_threshold; int coarse_solver; int coarsen_scheme; #ifdef HAVE_ML ML_Aggregate *ml_ag; ML_AMG *ml_amg; #endif MH_Context *contxt; } MH_Link; #endif hypre-2.33.0/src/FEI_mv/fei-hypre/HYPRE_MLMatrix.h000066400000000000000000000017071477326011500213420ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************/ /* data structures for local matrix */ /*--------------------------------------------------------------------------*/ #ifndef _HYPREMLMAT_ #define _HYPREMLMAT_ typedef struct { int Nrows; int *rowptr; int *colnum; int *map; double *values; int sendProcCnt; int *sendProc; int *sendLeng; int **sendList; int recvProcCnt; int *recvProc; int *recvLeng; } HYPRE_ML_Matrix; #endif hypre-2.33.0/src/FEI_mv/fei-hypre/HYPRE_MLMaxwell.h000066400000000000000000000030571477326011500215070ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************/ /* data structures for local matrix and ml object */ /*--------------------------------------------------------------------------*/ #ifndef _MLMAXWELL_ #define _MLMAXWELL_ /* #define HAVE_MLMAXWELL */ #ifdef HAVE_MLMAXWELL #include "ml_include.h" #endif #include "HYPRE_MLMatrix.h" typedef struct { HYPRE_ML_Matrix *Amat; MPI_Comm comm; int globalEqns; int *partition; } MLMaxwell_Context; typedef struct { MPI_Comm comm; #ifdef HAVE_MLMAXWELL ML *ml_ee; ML *ml_nn; #endif int nlevels; int smoothP_flag; double ag_threshold; void *edge_smoother; void *node_smoother; HYPRE_ParCSRMatrix hypreG; HYPRE_ParCSRMatrix hypreAnn; #ifdef HAVE_MLMAXWELL ML_Aggregate *ml_ag; ML_Operator *Annmat; ML_Operator *Gmat; ML_Operator *GTmat; ML_Operator **Gmat_array; ML_Operator **GTmat_array; #endif MLMaxwell_Context *Aee_contxt; MLMaxwell_Context *G_contxt; MLMaxwell_Context *Ann_contxt; void **node_args; void **edge_args; } MLMaxwell_Link; #endif hypre-2.33.0/src/FEI_mv/fei-hypre/HYPRE_SlideReduction.cxx000066400000000000000000006031431477326011500231370ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ //*************************************************************************** // Date : Apr 26, 2002 (This version works sequentially for up to 10000 elems) //*************************************************************************** // system includes //--------------------------------------------------------------------------- #include #include #include #include #define HYPRE_SLIDEMAX 100 #define HYPRE_BITMASK2 3 //*************************************************************************** // local includes //--------------------------------------------------------------------------- #include "HYPRE.h" #include "HYPRE_SlideReduction.h" #include "HYPRE_LSI_mli.h" #include "parcsr_mv/_hypre_parcsr_mv.h" #include "parcsr_ls/_hypre_parcsr_ls.h" #include "seq_mv/seq_mv.h" #include "HYPRE_FEI.h" //*************************************************************************** // local defines and external functions //--------------------------------------------------------------------------- #define habs(x) (((x) > 0.0) ? x : -(x)) extern "C" { // int hypre_BoomerAMGBuildCoarseOperator(hypre_ParCSRMatrix*, // hypre_ParCSRMatrix*, hypre_ParCSRMatrix*, hypre_ParCSRMatrix**); //void hypre_qsort0(int *, int, int); //void hypre_qsort1(int *, double *, int, int); //int HYPRE_LSI_Search(int*, int, int); //int HYPRE_LSI_qsort1a(int *, int *, int, int); //int HYPRE_LSI_MatrixInverse(double **, int, double ***); } //*************************************************************************** // Constructor //--------------------------------------------------------------------------- HYPRE_SlideReduction::HYPRE_SlideReduction(MPI_Comm comm) { Amat_ = NULL; A21mat_ = NULL; invA22mat_ = NULL; reducedAmat_ = NULL; reducedBvec_ = NULL; reducedXvec_ = NULL; reducedRvec_ = NULL; mpiComm_ = comm; outputLevel_ = 0; procNConstr_ = NULL; slaveEqnList_ = NULL; slaveEqnListAux_ = NULL; gSlaveEqnList_ = NULL; gSlaveEqnListAux_ = NULL; constrBlkInfo_ = NULL; constrBlkSizes_ = NULL; eqnStatuses_ = NULL; blockMinNorm_ = 1.0e-4; hypreRAP_ = NULL; truncTol_ = 1.0e-20; scaleMatrixFlag_ = 0; ADiagISqrts_ = NULL; useSimpleScheme_ = 0; } //*************************************************************************** // destructor //--------------------------------------------------------------------------- HYPRE_SlideReduction::~HYPRE_SlideReduction() { Amat_ = NULL; mpiComm_ = 0; if ( procNConstr_ != NULL ) delete [] procNConstr_; if ( slaveEqnList_ != NULL ) delete [] slaveEqnList_; if ( slaveEqnListAux_ != NULL ) delete [] slaveEqnListAux_; if ( eqnStatuses_ != NULL ) delete [] eqnStatuses_; if ( gSlaveEqnList_ != NULL ) delete [] gSlaveEqnList_; if ( gSlaveEqnListAux_ != NULL ) delete [] gSlaveEqnListAux_; if ( constrBlkInfo_ != NULL ) delete [] constrBlkInfo_; if ( constrBlkSizes_ != NULL ) delete [] constrBlkSizes_; if ( A21mat_ != NULL ) HYPRE_IJMatrixDestroy(A21mat_); if ( invA22mat_ != NULL ) HYPRE_IJMatrixDestroy(invA22mat_); if ( reducedAmat_ != NULL ) HYPRE_IJMatrixDestroy(reducedAmat_); if ( reducedBvec_ != NULL ) HYPRE_IJVectorDestroy(reducedBvec_); if ( reducedXvec_ != NULL ) HYPRE_IJVectorDestroy(reducedXvec_); if ( reducedRvec_ != NULL ) HYPRE_IJVectorDestroy(reducedRvec_); if ( hypreRAP_ != NULL ) HYPRE_ParCSRMatrixDestroy(hypreRAP_); if ( ADiagISqrts_ != NULL ) delete [] ADiagISqrts_; } //*************************************************************************** // set output level //--------------------------------------------------------------------------- int HYPRE_SlideReduction::setOutputLevel( int level ) { if ( level == 1 ) outputLevel_ |= 1; if ( level == 2 ) outputLevel_ |= 2; if ( level == 3 ) outputLevel_ |= 4; return 0; } //*************************************************************************** // set use simple scheme //--------------------------------------------------------------------------- int HYPRE_SlideReduction::setUseSimpleScheme() { useSimpleScheme_ = 1; return 0; } //*************************************************************************** // set truncation threshold for matrix //--------------------------------------------------------------------------- int HYPRE_SlideReduction::setTruncationThreshold(double trunc) { truncTol_ = trunc; return 0; } //*************************************************************************** // enable scaling the matrix //--------------------------------------------------------------------------- int HYPRE_SlideReduction::setScaleMatrix() { scaleMatrixFlag_ = 1; return 0; } //*************************************************************************** // set the minimum norm for stable blocks //--------------------------------------------------------------------------- int HYPRE_SlideReduction::setBlockMinNorm(double norm) { blockMinNorm_ = norm; return 0; } //*************************************************************************** // get matrix number of rows //--------------------------------------------------------------------------- int HYPRE_SlideReduction::getMatrixNumRows() { int mypid, nprocs, *procNRows, localNRows, nConstraints; HYPRE_ParCSRMatrix A_csr; MPI_Comm_rank( mpiComm_, &mypid ); MPI_Comm_size( mpiComm_, &nprocs ); HYPRE_IJMatrixGetObject(Amat_, (void **) &A_csr); HYPRE_ParCSRMatrixGetRowPartitioning( A_csr, &procNRows ); localNRows = procNRows[mypid+1] - procNRows[mypid]; nConstraints = procNConstr_[mypid+1] - procNConstr_[mypid]; hypre_TFree( procNRows,HYPRE_MEMORY_HOST ); return (localNRows-nConstraints); } //*************************************************************************** // get matrix diagonal //--------------------------------------------------------------------------- double *HYPRE_SlideReduction::getMatrixDiagonal() { return ADiagISqrts_; } //*************************************************************************** // get reduced matrix //--------------------------------------------------------------------------- int HYPRE_SlideReduction::getReducedMatrix(HYPRE_IJMatrix *mat) { (*mat) = reducedAmat_; return 0; } //*************************************************************************** // get reduced rhs //--------------------------------------------------------------------------- int HYPRE_SlideReduction::getReducedRHSVector(HYPRE_IJVector *rhs) { (*rhs) = reducedBvec_; return 0; } //*************************************************************************** // get reduced solution vector //--------------------------------------------------------------------------- int HYPRE_SlideReduction::getReducedSolnVector(HYPRE_IJVector *sol) { (*sol) = reducedXvec_; return 0; } //*************************************************************************** // get auxiliary (temporary) vector //--------------------------------------------------------------------------- int HYPRE_SlideReduction::getReducedAuxVector(HYPRE_IJVector *auxV ) { (*auxV) = reducedRvec_; return 0; } //*************************************************************************** // get processor to constraint map //--------------------------------------------------------------------------- int HYPRE_SlideReduction::getProcConstraintMap(int **map) { (*map) = procNConstr_; return 0; } //*************************************************************************** // get slave equation list //--------------------------------------------------------------------------- int HYPRE_SlideReduction::getSlaveEqnList(int **slist) { (*slist) = slaveEqnList_; return 0; } //*************************************************************************** // get perturbation matrix (reduced = sub(A) - perturb(A)) // (for oorrecting the null space) //--------------------------------------------------------------------------- int HYPRE_SlideReduction::getPerturbationMatrix(HYPRE_ParCSRMatrix *matrix) { (*matrix) = hypreRAP_; hypreRAP_ = NULL; return 0; } //*************************************************************************** // Given the matrix (A) within the object, compute the reduced system and put // it in place. Additional information given are : // // Additional assumptions are : // // - a given slave equation and the corresponding constraint equation // reside in the same processor // - constraint equations are given at the end of the local matrix // (hence given by endRow-nConstr to endRow) // - each processor gets a contiguous block of equations, and processor // i+1 has equation numbers higher than those of processor i //--------------------------------------------------------------------------- int HYPRE_SlideReduction::setup(HYPRE_IJMatrix A, HYPRE_IJVector x, HYPRE_IJVector b) { int mypid, nprocs, ierr, maxBSize=HYPRE_SLIDEMAX, bSize=2; int *procNRows, nrows1, nrows2, reduceAFlag; HYPRE_ParCSRMatrix A_csr; HYPRE_ParVector b_csr; //------------------------------------------------------------------ // initial set up //------------------------------------------------------------------ MPI_Comm_rank( mpiComm_, &mypid ); MPI_Comm_size( mpiComm_, &nprocs ); if ( mypid == 0 && (outputLevel_ & HYPRE_BITMASK2) >= 1 ) printf("%4d : HYPRE_SlideReduction begins....\n", mypid); //------------------------------------------------------------------ // check matrix and vector compatibility //------------------------------------------------------------------ reduceAFlag = 1; HYPRE_IJMatrixGetObject(Amat_, (void **) &A_csr); HYPRE_ParCSRMatrixGetRowPartitioning(A_csr, &procNRows); nrows1 = procNRows[nprocs] - procNRows[0]; free(procNRows); HYPRE_IJMatrixGetObject(A, (void **) &A_csr); HYPRE_ParCSRMatrixGetRowPartitioning(A_csr, &procNRows); nrows2 = procNRows[nprocs] - procNRows[0]; free(procNRows); if (nrows1 != nrows2) reduceAFlag = 0; if (reduceAFlag == 0) { HYPRE_IJVectorGetObject(b, (void **) &b_csr); procNRows = hypre_ParVectorPartitioning((hypre_ParVector *) b_csr); nrows2 = procNRows[nprocs] - procNRows[0]; if (nrows1 != nrows2) { if (mypid == 0) printf("HYPRE_SlideReduction ERROR - A,b dim mismatch (reuse)!\n"); exit(1); } } //------------------------------------------------------------------ // clean up first //------------------------------------------------------------------ if (reduceAFlag == 1) { Amat_ = A; if ( procNConstr_ != NULL ) delete [] procNConstr_; if ( slaveEqnList_ != NULL ) delete [] slaveEqnList_; if ( slaveEqnListAux_ != NULL ) delete [] slaveEqnListAux_; if ( gSlaveEqnList_ != NULL ) delete [] gSlaveEqnList_; if ( gSlaveEqnListAux_ != NULL ) delete [] gSlaveEqnListAux_; if ( constrBlkInfo_ != NULL ) delete [] constrBlkInfo_; if ( constrBlkSizes_ != NULL ) delete [] constrBlkSizes_; if ( eqnStatuses_ != NULL ) delete [] eqnStatuses_; if ( invA22mat_ != NULL ) HYPRE_IJMatrixDestroy(invA22mat_); if ( A21mat_ != NULL ) HYPRE_IJMatrixDestroy(A21mat_); if ( reducedAmat_ != NULL ) HYPRE_IJMatrixDestroy(reducedAmat_); if ( reducedBvec_ != NULL ) HYPRE_IJVectorDestroy(reducedBvec_); if ( reducedXvec_ != NULL ) HYPRE_IJVectorDestroy(reducedXvec_); if ( reducedRvec_ != NULL ) HYPRE_IJVectorDestroy(reducedRvec_); procNConstr_ = NULL; slaveEqnList_ = NULL; slaveEqnListAux_ = NULL; gSlaveEqnList_ = NULL; gSlaveEqnListAux_ = NULL; eqnStatuses_ = NULL; constrBlkInfo_ = NULL; constrBlkSizes_ = NULL; reducedAmat_ = NULL; invA22mat_ = NULL; A21mat_ = NULL; reducedBvec_ = NULL; reducedXvec_ = NULL; reducedRvec_ = NULL; } else { if ( reducedBvec_ != NULL ) HYPRE_IJVectorDestroy(reducedBvec_); if ( reducedXvec_ != NULL ) HYPRE_IJVectorDestroy(reducedXvec_); if ( reducedRvec_ != NULL ) HYPRE_IJVectorDestroy(reducedRvec_); reducedBvec_ = NULL; reducedXvec_ = NULL; reducedRvec_ = NULL; } //------------------------------------------------------------------ // find the number of constraints in the local processor //------------------------------------------------------------------ if (reduceAFlag == 1) { if ( findConstraints() == 0 ) return 0; } //------------------------------------------------------------------ // see if we can find a set of slave nodes for the constraint eqns // If not, search for block size of 2 or higher. //------------------------------------------------------------------ if (reduceAFlag == 1) { if ( useSimpleScheme_ == 0 ) { ierr = findSlaveEqns1(); while (ierr < 0 && bSize <= maxBSize) ierr = findSlaveEqnsBlock(bSize++); if ( ierr < 0 ) { printf("%4d : HYPRE_SlideReduction ERROR - fail !\n", mypid); exit(1); } composeGlobalList(); } } //------------------------------------------------------------------ // build the reduced matrix //------------------------------------------------------------------ if (reduceAFlag == 1) { if (useSimpleScheme_ == 0) buildReducedMatrix(); else buildSubMatrices(); } //------------------------------------------------------------------ // build the reduced right hand side vector //------------------------------------------------------------------ if (useSimpleScheme_ == 0) buildReducedRHSVector(b); else buildModifiedRHSVector(x,b); //------------------------------------------------------------------ // if scale matrix is request, scale matrix and vector //------------------------------------------------------------------ if ( scaleMatrixFlag_ == 1 ) { if (reduceAFlag == 1) scaleMatrixVector(); else { if (mypid == 0) printf("HYPRE_SlideReduction ERROR - reuse & scale don't match!\n"); exit(1); } } //------------------------------------------------------------------ // clean up and return //------------------------------------------------------------------ if ( mypid == 0 && ( outputLevel_ & HYPRE_BITMASK2 ) >= 1 ) printf("%4d : HYPRE_SlideReduction ends.\n", mypid); return 0; } //*************************************************************************** // search for local constraints (end of the matrix block) //--------------------------------------------------------------------------- int HYPRE_SlideReduction::findConstraints() { int mypid, nprocs, *procNRows, startRow, endRow; int nConstraints, irow, ncnt, isAConstr, jcol, rowSize, *colInd; int *iTempList, ip, globalNConstr; double *colVal; HYPRE_ParCSRMatrix A_csr; //------------------------------------------------------------------ // get matrix information //------------------------------------------------------------------ MPI_Comm_rank(mpiComm_, &mypid); MPI_Comm_size(mpiComm_, &nprocs); HYPRE_IJMatrixGetObject(Amat_, (void **) &A_csr); HYPRE_ParCSRMatrixGetRowPartitioning( A_csr, &procNRows ); startRow = procNRows[mypid]; endRow = procNRows[mypid+1] - 1; free( procNRows ); //------------------------------------------------------------------ // search for number of local constraints // (==> nConstraints) //------------------------------------------------------------------ //#define PRINTC #ifdef PRINTC int localNRows = endRow - startRow + 1; char filename[100]; FILE *fp; sprintf( filename, "Constr.%d", localNRows); fp = fopen( filename, "w" ); #endif nConstraints = 0; for ( irow = endRow; irow >= startRow; irow-- ) { HYPRE_ParCSRMatrixGetRow(A_csr,irow,&rowSize,&colInd,&colVal); isAConstr = 1; for ( jcol = 0; jcol < rowSize; jcol++ ) { if ( colInd[jcol] == irow && colVal[jcol] != 0.0 ) { isAConstr = 0; break; } } #ifdef PRINTC if ( isAConstr ) { for ( jcol = 0; jcol < rowSize; jcol++ ) fprintf(fp,"%8d %8d %e\n",nConstraints+1,colInd[jcol]+1, colVal[jcol]); } #endif HYPRE_ParCSRMatrixRestoreRow(A_csr,irow,&rowSize,&colInd,&colVal); if ( isAConstr ) nConstraints++; else break; } #ifdef PRINTC fclose(fp); #endif if ( ( outputLevel_ & HYPRE_BITMASK2 ) >= 1 ) printf("%4d : findConstraints - number of constraints = %d\n", mypid, nConstraints); //------------------------------------------------------------------ // compute the base nConstraints on each processor // (==> globalNConstr, procNConstr) //------------------------------------------------------------------ iTempList = new int[nprocs]; if ( procNConstr_ != NULL ) delete [] procNConstr_; procNConstr_ = new int[nprocs+1]; for ( ip = 0; ip < nprocs; ip++ ) iTempList[ip] = 0; iTempList[mypid] = nConstraints; MPI_Allreduce(iTempList,procNConstr_,nprocs,MPI_INT,MPI_SUM,mpiComm_); delete [] iTempList; globalNConstr = 0; ncnt = 0; for ( ip = 0; ip < nprocs; ip++ ) { ncnt = procNConstr_[ip]; procNConstr_[ip] = globalNConstr; globalNConstr += ncnt; } procNConstr_[nprocs] = globalNConstr; if ( slaveEqnList_ != NULL ) delete [] slaveEqnList_; if ( nConstraints > 0 ) slaveEqnList_ = new int[nConstraints]; else slaveEqnList_ = NULL; for ( irow = 0; irow < nConstraints; irow++ ) slaveEqnList_[irow] = -1; if ( constrBlkInfo_ != NULL ) delete [] constrBlkInfo_; if ( nConstraints > 0 ) constrBlkInfo_ = new int[nConstraints]; else constrBlkInfo_ = NULL; for ( irow = 0; irow < nConstraints; irow++ ) constrBlkInfo_[irow] = -1; if ( constrBlkSizes_ != NULL ) delete [] constrBlkSizes_; if ( nConstraints > 0 ) constrBlkSizes_ = new int[nConstraints]; else constrBlkSizes_ = NULL; for ( irow = 0; irow < nConstraints; irow++ ) constrBlkSizes_[irow] = 0; if ( nConstraints > 0 ) { eqnStatuses_ = new int[endRow-nConstraints-startRow+1]; for (irow = 0; irow < endRow-nConstraints-startRow+1; irow++ ) eqnStatuses_[irow] = 0; } else eqnStatuses_ = NULL; return globalNConstr; } //*************************************************************************** // search for a slave equation list (block size = 1) //--------------------------------------------------------------------------- int HYPRE_SlideReduction::findSlaveEqns1() { int mypid, nprocs, *procNRows, startRow, endRow; int nConstraints, irow, jcol, rowSize, ncnt, *colInd, index; int nCandidates, *candidateList; int *constrListAux, colIndex, searchIndex, procIndex, uBound; int nSum, newEndRow; double *colVal, searchValue; HYPRE_ParCSRMatrix A_csr; //------------------------------------------------------------------ // get matrix information //------------------------------------------------------------------ MPI_Comm_rank(mpiComm_, &mypid); MPI_Comm_size(mpiComm_, &nprocs); HYPRE_IJMatrixGetObject(Amat_, (void **) &A_csr); HYPRE_ParCSRMatrixGetRowPartitioning( A_csr, &procNRows ); startRow = procNRows[mypid]; endRow = procNRows[mypid+1] - 1; nConstraints = procNConstr_[mypid+1] - procNConstr_[mypid]; newEndRow = endRow - nConstraints; //------------------------------------------------------------------ // compose candidate slave list (slaves in candidateList, corresponding // constraint equation in constrListAux) //------------------------------------------------------------------ nCandidates = 0; candidateList = NULL; constrListAux = NULL; if ( nConstraints > 0 ) { candidateList = new int[newEndRow-startRow+1]; constrListAux = new int[newEndRow-startRow+1]; //------------------------------------------------------------------ // candidates are those with 1 link to the constraint list //------------------------------------------------------------------ for ( irow = startRow; irow <= endRow-nConstraints; irow++ ) { HYPRE_ParCSRMatrixGetRow(A_csr,irow,&rowSize,&colInd,&colVal); ncnt = 0; constrListAux[irow-startRow] = -1; for ( jcol = 0; jcol < rowSize; jcol++ ) { colIndex = colInd[jcol]; for ( procIndex = 1; procIndex <= nprocs; procIndex++ ) if ( colIndex < procNRows[procIndex] ) break; uBound = procNRows[procIndex] - (procNConstr_[procIndex] - procNConstr_[procIndex-1]); if ( colIndex >= uBound && procIndex == (mypid+1) ) { ncnt++; searchIndex = colIndex; } else if ( colIndex >= uBound && procIndex != (mypid+1) ) ncnt = 2; if ( ncnt > 1 ) break; } HYPRE_ParCSRMatrixRestoreRow(A_csr,irow,&rowSize,&colInd,&colVal); if (ncnt == 1 && searchIndex > newEndRow && searchIndex <= endRow) { constrListAux[nCandidates] = searchIndex; candidateList[nCandidates++] = irow; if ( ( outputLevel_ & HYPRE_BITMASK2 ) >= 3 ) printf("%4d : findSlaveEqns1 - candidate %d = %d(%d)\n", mypid, nCandidates-1, irow, searchIndex); } } if ( ( outputLevel_ & HYPRE_BITMASK2 ) >= 1 ) printf("%4d : findSlaveEqns1 - nCandidates, nConstr = %d %d\n", mypid, nCandidates, nConstraints); } //--------------------------------------------------------------------- // search the constraint equations for the selected slave equations // (search for candidates column index with maximum magnitude) // ==> slaveEqnList_ //--------------------------------------------------------------------- searchIndex = 0; for ( irow = endRow-nConstraints+1; irow <= endRow; irow++ ) { HYPRE_ParCSRMatrixGetRow(A_csr,irow,&rowSize,&colInd,&colVal); searchIndex = -1; searchValue = 1.0E-6; for ( jcol = 0; jcol < rowSize; jcol++ ) { if (colVal[jcol] != 0.0 && colInd[jcol] >= startRow && colInd[jcol] <= (endRow-nConstraints) && eqnStatuses_[colInd[jcol]-startRow] == 0) { colIndex = hypre_BinarySearch(candidateList, colInd[jcol], nCandidates); if ( colIndex >= 0 && habs(colVal[jcol]) > searchValue ) { if ( irow != constrListAux[colIndex] ) break; searchValue = habs(colVal[jcol]); searchIndex = colInd[jcol]; } } } HYPRE_ParCSRMatrixRestoreRow(A_csr,irow,&rowSize,&colInd,&colVal); if ( searchIndex >= 0 ) { index = irow - endRow + nConstraints - 1; slaveEqnList_[index] = searchIndex; constrBlkInfo_[index] = index; constrBlkSizes_[index] = 1; eqnStatuses_[searchIndex-startRow] = 1; if ( ( outputLevel_ & HYPRE_BITMASK2 ) >= 2 ) printf("%4d : findSlaveEqns1 - constr %7d <=> slave %d\n", mypid, irow, searchIndex); } else { slaveEqnList_[irow-endRow+nConstraints-1] = -1; if ( ( outputLevel_ & HYPRE_BITMASK2 ) >= 2 ) { printf("%4d : findSlaveEqns1 - constraint %4d fails",mypid,irow); printf(" to find a slave.\n"); } } } if ( nConstraints > 0 ) { delete [] constrListAux; delete [] candidateList; } free( procNRows ); //--------------------------------------------------------------------- // if not all constraint-slave pairs can be found, return -1 //--------------------------------------------------------------------- ncnt = 0; for ( irow = 0; irow < nConstraints; irow++ ) if ( slaveEqnList_[irow] == -1 ) ncnt++; MPI_Allreduce(&ncnt, &nSum, 1, MPI_INT, MPI_SUM, mpiComm_); if ( nSum > 0 ) { if ( mypid == 0 && ( outputLevel_ & HYPRE_BITMASK2 ) >= 1 ) { printf("%4d : findSlaveEqns1 fails - total number of unsatisfied", mypid); printf(" constraints = %d \n", nSum); } if ( ( outputLevel_ & HYPRE_BITMASK2 ) >= 1 ) { for ( irow = 0; irow < nConstraints; irow++ ) if ( slaveEqnList_[irow] == -1 ) { printf("%4d : findSlaveEqns1 - unsatisfied constraint",mypid); printf(" equation = %d\n", irow+endRow-nConstraints+1); } } return -1; } else return 0; } //*************************************************************************** // search for a slave equation list (block size of up to blkSizeMax) //--------------------------------------------------------------------------- int HYPRE_SlideReduction::findSlaveEqnsBlock(int blkSize) { int mypid, nprocs, *procNRows, startRow, endRow, localNRows; int nConstraints, irow, jcol, rowSize, ncnt, *colInd; int nCandidates, *candidateList, **constrListAuxs, colIndex, rowSize2; int ic, ii, jj, searchIndex, searchInd2, newEndRow; int blkSizeMax=HYPRE_SLIDEMAX, *colInd2, searchInd3; int constrIndex, uBound, lBound, nSum, isACandidate, newBlkSize, *colTmp; int constrIndex2, searchBlkSize, newIndex, oldIndex, irowLocal, ip; int *blkInfo, blkInfoCnt; double *colVal, searchValue, retVal, *colVal2; HYPRE_ParCSRMatrix A_csr; //------------------------------------------------------------------ // if block size too large, return error //------------------------------------------------------------------ if ( blkSize > blkSizeMax ) return -1; //------------------------------------------------------------------ // get matrix information //------------------------------------------------------------------ MPI_Comm_rank(mpiComm_, &mypid); MPI_Comm_size(mpiComm_, &nprocs); HYPRE_IJMatrixGetObject(Amat_, (void **) &A_csr); HYPRE_ParCSRMatrixGetRowPartitioning( A_csr, &procNRows ); startRow = procNRows[mypid]; endRow = procNRows[mypid+1] - 1; localNRows = endRow - startRow + 1; nConstraints = procNConstr_[mypid+1] - procNConstr_[mypid]; newEndRow = endRow - nConstraints; if ( mypid == 0 && ( outputLevel_ & HYPRE_BITMASK2 ) >= 1 ) printf("%4d : findSlaveEqnsBlock - size = %d\n", mypid, blkSize); //------------------------------------------------------------------ // compose candidate slave list (slaves in candidateList, corresponding // constraint equation in constrListAuxs) //------------------------------------------------------------------ nCandidates = 0; if ( nConstraints > 0 ) { candidateList = new int[localNRows-nConstraints]; constrListAuxs = new int*[localNRows-nConstraints]; for ( ic = 0; ic < localNRows-nConstraints; ic++ ) { constrListAuxs[ic] = new int[blkSize]; for (jcol = 0; jcol < blkSize; jcol++) constrListAuxs[ic][jcol] = -1; } //--------------------------------------------------------------- // candidates are those with links to the constraint list //--------------------------------------------------------------- for ( irow = startRow; irow <= endRow-nConstraints; irow++ ) { if ( eqnStatuses_[irow-startRow] == 1 ) continue; HYPRE_ParCSRMatrixGetRow(A_csr,irow,&rowSize,&colInd,&colVal); ncnt = 0; for ( jcol = 0; jcol < rowSize; jcol++ ) { colIndex = colInd[jcol]; for ( ip = 0; ip < nprocs; ip++ ) { uBound = procNRows[ip+1]; lBound = uBound - (procNConstr_[ip+1] - procNConstr_[ip]); if ( colIndex >= lBound && colIndex < uBound && ip == mypid ) { ncnt++; if ( ncnt <= blkSize ) constrListAuxs[nCandidates][ncnt-1] = colIndex; } else if (colIndex >= lBound && colIndex < uBound && ip != mypid) { ncnt = blkSize + 1; break; } } if ( ncnt > blkSize ) break; } HYPRE_ParCSRMatrixRestoreRow(A_csr,irow,&rowSize,&colInd,&colVal); if ( ncnt >= 1 && ncnt <= blkSize ) { isACandidate = 1; for ( ic = 0; ic < ncnt; ic++ ) { if ( constrListAuxs[nCandidates][ic] <= newEndRow || constrListAuxs[nCandidates][ic] > endRow ) { isACandidate = 0; break; } } if ( isACandidate ) { candidateList[nCandidates++] = irow; if ( ( outputLevel_ & HYPRE_BITMASK2 ) >= 3 ) printf("%4d : findSlaveEqnsBlock - candidate %d = %d\n", mypid, nCandidates-1, irow); } } } if ( ( outputLevel_ & HYPRE_BITMASK2 ) >= 1 ) printf("%4d : findSlaveEqnsBlock - nCandidates, nConstr = %d %d\n", mypid, nCandidates, nConstraints); } //--------------------------------------------------------------------- // revise candidates taking into consideration nonsymmetry //--------------------------------------------------------------------- int *tempSlaveList, *tempSlaveListAux; if ( nConstraints > 0 ) tempSlaveList = new int[nConstraints]; if ( nConstraints > 0 ) tempSlaveListAux = new int[nConstraints]; for (irow = 0; irow < nConstraints; irow++) { tempSlaveList[irow] = slaveEqnList_[irow]; tempSlaveListAux[irow] = irow; } HYPRE_LSI_qsort1a(tempSlaveList, tempSlaveListAux, 0, nConstraints-1); /* for each of the candidates, examine all associated constraints dof */ for ( irow = 0; irow < nCandidates; irow++ ) { for ( ic = 0; ic < blkSize; ic++ ) { constrIndex = constrListAuxs[irow][ic]; /* if valid constraint number */ if ( constrIndex >= 0 ) { /* get the constraint row */ HYPRE_ParCSRMatrixGetRow(A_csr,constrIndex,&rowSize,&colInd,NULL); /* for each nonzero entry of the constraint row */ /* - see if the column number is an already selected slave */ /* - if so, find the corresponding constraint no. of that slave */ /* - add that constraint to my list */ for ( jcol = 0; jcol < rowSize; jcol++ ) { colIndex = colInd[jcol]; searchIndex = hypre_BinarySearch(tempSlaveList,colIndex, nConstraints); if ( searchIndex >= 0 ) { searchInd2 = tempSlaveListAux[searchIndex] + newEndRow + 1; for ( ip = 0; ip < blkSize; ip++ ) if ( constrListAuxs[irow][ip] == searchInd2 || constrListAuxs[irow][ip] == -1 ) break; if ( ip == blkSize ) constrListAuxs[irow][0] = -5; else if ( constrListAuxs[irow][ip] == -1 ) { constrListAuxs[irow][ip] = searchInd2; if ( ( outputLevel_ & HYPRE_BITMASK2 ) >= 2 ) printf("Slave candidate %d adds new constr %d\n", candidateList[irow], searchInd2); } } } HYPRE_ParCSRMatrixRestoreRow(A_csr,constrIndex,&rowSize,&colInd, NULL); } } } /* delete candidates that gives larger than expected blocksize */ ncnt = 0; for ( irow = 0; irow < nCandidates; irow++ ) { if ( constrListAuxs[irow][0] != -5 ) { if ( irow != ncnt ) { if ( constrListAuxs[ncnt] != NULL ) delete [] constrListAuxs[ncnt]; constrListAuxs[ncnt] = constrListAuxs[irow]; constrListAuxs[irow] = NULL; candidateList[ncnt++] = candidateList[irow]; } else ncnt++; } } nCandidates = ncnt; if ( nConstraints > 0 ) delete [] tempSlaveList; if ( nConstraints > 0 ) delete [] tempSlaveListAux; //--------------------------------------------------------------------- // search the constraint equations for the selected slave equations // (search for candidates column index with maximum magnitude) // ==> slaveEqnList_ //--------------------------------------------------------------------- searchIndex = 0; blkInfo = new int[blkSize+HYPRE_SLIDEMAX]; for ( irow = newEndRow+1; irow <= endRow; irow++ ) { /* -- if slave variable has not been picked for constraint irow -- */ irowLocal = irow - endRow + nConstraints - 1; if ( slaveEqnList_[irowLocal] == -1 ) { /* -- get the constraint row, and search for nonzero entries -- */ HYPRE_ParCSRMatrixGetRow(A_csr,irow,&rowSize2,&colInd2,&colVal2); rowSize = rowSize2; colInd = new int[rowSize]; colVal = new double[rowSize]; for ( jcol = 0; jcol < rowSize; jcol++ ) { colInd[jcol] = colInd2[jcol]; colVal[jcol] = colVal2[jcol]; } HYPRE_ParCSRMatrixRestoreRow(A_csr,irow,&rowSize2,&colInd2,&colVal2); searchIndex = -1; searchValue = blockMinNorm_; for ( jcol = 0; jcol < rowSize; jcol++ ) { colIndex = colInd[jcol]; if (colVal[jcol] != 0.0 && colIndex >= startRow && colIndex <= newEndRow) { /* -- see if the nonzero entry is a potential candidate -- */ searchInd2 = hypre_BinarySearch(candidateList, colIndex, nCandidates); /* -- if the nonzero entry is a potential candidate, see -- */ /* -- if the use of this as slave will give block size -- */ /* -- that is too large. -- */ if (searchInd2 >= 0 && eqnStatuses_[colIndex-startRow] != 1) { newBlkSize = 1; blkInfoCnt = 0; for ( ic = 0; ic < blkSize; ic++ ) { constrIndex = constrListAuxs[searchInd2][ic]; if ( constrIndex != -1 ) { constrIndex2 = constrIndex - endRow + nConstraints - 1; if ( constrIndex != irow && slaveEqnList_[constrIndex2] != -1) { for ( ip = 0; ip < blkInfoCnt; ip++ ) if ( blkInfo[ip] == constrBlkInfo_[constrIndex2] ) break; if ( ip == blkInfoCnt ) { newBlkSize += constrBlkSizes_[constrIndex2]; blkInfo[blkInfoCnt]=constrBlkInfo_[constrIndex2]; blkInfoCnt++; } } /* else if (constrIndex != irow ) newBlkSize++; */ } } if ( ( outputLevel_ & HYPRE_BITMASK2 ) >= 2 ) { printf("%4d : constraint %d - candidate %d (%d) ", mypid, irow, searchInd2, candidateList[searchInd2]); printf("gives blksize = %d\n", newBlkSize); } /* if (newBlkSize > 1 && newBlkSize <= blkSize) */ if (newBlkSize <= blkSize) { retVal = matrixCondEst(irow,colIndex,blkInfo,blkInfoCnt); if ( ( outputLevel_ & HYPRE_BITMASK2 ) >= 2 ) printf("%4d : pivot = %e (%e) : %d\n", mypid, retVal, searchValue,newBlkSize); if ( retVal > searchValue ) { searchValue = habs(colVal[jcol]); searchIndex = colIndex; searchBlkSize = newBlkSize; } } } } } delete [] colInd; delete [] colVal; if ( searchIndex >= 0 && searchValue > blockMinNorm_ ) { searchInd2 = hypre_BinarySearch(candidateList,searchIndex, nCandidates); newIndex = -9; for ( ic = 0; ic < blkSize; ic++ ) { constrIndex = constrListAuxs[searchInd2][ic]; if ( constrIndex != -1 ) { constrIndex2 = constrIndex - endRow + nConstraints - 1; if (constrIndex != irow && slaveEqnList_[constrIndex2] != -1) { if (newIndex == -9) newIndex=constrBlkInfo_[constrIndex2]; oldIndex = constrBlkInfo_[constrIndex2]; for ( ii = 0; ii < nConstraints; ii++ ) { if ( constrBlkInfo_[ii] == oldIndex ) { constrBlkInfo_[ii] = newIndex; constrBlkSizes_[ii] = searchBlkSize; } } } } } if (newIndex == -9) newIndex = irowLocal; constrBlkInfo_[irowLocal] = newIndex; constrBlkSizes_[irowLocal] = searchBlkSize; slaveEqnList_[irowLocal] = searchIndex; searchInd2 = hypre_BinarySearch(candidateList, searchIndex, nCandidates); eqnStatuses_[searchIndex-startRow] = 1; /* update the constrListAux - first get selected slave row */ for ( ii = 0; ii < blkSize; ii++ ) { constrIndex2 = constrListAuxs[searchInd2][ii]; if ( constrIndex2 != -1 ) { HYPRE_ParCSRMatrixGetRow(A_csr,constrIndex2,&rowSize2, &colInd2,&colVal2); for ( jj = 0; jj < rowSize2; jj++ ) { searchInd3 = hypre_BinarySearch(candidateList, colInd2[jj],nCandidates); if ( searchInd3 >= 0 ) { for ( ip = 0; ip < blkSize; ip++ ) { if ( constrListAuxs[searchInd3][ip] == irow || constrListAuxs[searchInd3][ip] == -1 ) break; } if ( ip == blkSize ) { constrListAuxs[searchInd3][0] = -5; eqnStatuses_[colInd2[jj]-startRow] = 1; if ( ( outputLevel_ & HYPRE_BITMASK2 ) >= 3 ) printf("*Slave candidate %d disabled.\n", candidateList[searchInd3]); } else if ( constrListAuxs[searchInd3][ip] == -1 ) { constrListAuxs[searchInd3][ip] = irow; if ( ( outputLevel_ & HYPRE_BITMASK2 ) >= 3 ) printf("*Slave candidate %d adds new constr %d\n", candidateList[searchInd3], irow); } } } HYPRE_ParCSRMatrixRestoreRow(A_csr,constrIndex2,&rowSize2, &colInd2,&colVal2); } } if ( ( outputLevel_ & HYPRE_BITMASK2 ) >= 2 ) printf("%4d : findSlaveEqnsBlock - constr %d <=> slave %d (%d)\n", mypid, irow, searchIndex, newIndex); } else { if ( ( outputLevel_ & HYPRE_BITMASK2 ) >= 2 ) { if ( searchIndex < 0 && searchValue > blockMinNorm_ ) { printf("%4d : findSlaveEqnsBlock - constraint %4d fails (0)", mypid, irow); printf(" to find a slave.\n"); } else if ( searchIndex >= 0 && searchValue <= blockMinNorm_ ) { printf("%4d : findSlaveEqnsBlock - constraint %4d fails (1)", mypid, irow); printf(" to find a slave.\n"); } else { printf("%4d : findSlaveEqnsBlock - constraint %4d fails (2)", mypid, irow); printf(" to find a slave.\n"); } if ( ( outputLevel_ & HYPRE_BITMASK2 ) >= 3 ) { HYPRE_ParCSRMatrixGetRow(A_csr,irow,&rowSize,&colInd,&colVal); colTmp = new int[rowSize]; rowSize2 = rowSize; for ( ii = 0; ii < rowSize; ii++ ) colTmp[ii] = colInd[ii]; HYPRE_ParCSRMatrixRestoreRow(A_csr,irow,&rowSize,&colInd, &colVal); for ( jcol = 0; jcol < rowSize2; jcol++ ) { colIndex = colTmp[jcol]; printf("%4d : row %d has col %d (%d,%d) (%d,%d)\n",mypid, irow,colIndex,jcol,rowSize,procNRows[mypid], procNRows[mypid+1]); if ( colIndex >= procNRows[mypid] && colIndex < procNRows[mypid+1]) { HYPRE_ParCSRMatrixGetRow(A_csr,colIndex,&rowSize, &colInd,NULL); for ( ii = 0; ii < rowSize; ii++ ) printf("%4d : col %d has col %d (%d,%d)\n",mypid, colIndex,colInd[ii],ii,rowSize); HYPRE_ParCSRMatrixRestoreRow(A_csr,colIndex,&rowSize, &colInd,NULL); } } delete [] colTmp; } } } } } delete [] blkInfo; if ( nConstraints > 0 ) { for ( ic = 0; ic < localNRows-nConstraints; ic++ ) if ( constrListAuxs[ic] != NULL ) delete [] constrListAuxs[ic]; delete [] constrListAuxs; delete [] candidateList; } free( procNRows ); #if 0 int is, *iArray1, *iArray2; if ( constrBlkInfo_ != NULL ) { iArray1 = new int[nConstraints]; iArray2 = new int[nConstraints]; for ( is = 0; is < nConstraints; is++ ) { iArray1[is] = constrBlkInfo_[is]; iArray2[is] = constrBlkSizes_[is]; } HYPRE_LSI_qsort1a(iArray1, iArray2, 0, nConstraints-1); ip = -1; ncnt = 0; for ( is = 0; is < nConstraints; is++ ) { if ( iArray1[is] != ip ) { iArray1[ncnt] = iArray1[is]; iArray2[ncnt] = iArray2[is]; ncnt++; ip = iArray1[is]; } } HYPRE_LSI_qsort1a(iArray2, iArray1, 0, ncnt-1); ip = 1; for ( is = 1; is < ncnt; is++ ) { if ( iArray2[is] == iArray2[is-1] ) ip++; else { printf("%4d : number of blocks with blksize %6d = %d\n", mypid, iArray2[is-1], ip); ip = 1; } } printf("%4d : number of blocks with blksize %6d = %d\n", mypid, iArray2[ncnt-1], ip); delete [] iArray1; delete [] iArray2; } #endif //--------------------------------------------------------------------- // if not all constraint-slave pairs can be found, return -1 //--------------------------------------------------------------------- ncnt = 0; for ( irow = 0; irow < nConstraints; irow++ ) if ( slaveEqnList_[irow] == -1 ) ncnt++; MPI_Allreduce(&ncnt, &nSum, 1, MPI_INT, MPI_SUM, mpiComm_); if ( nSum > 0 ) { if ( mypid == 0 && ( outputLevel_ & HYPRE_BITMASK2 ) >= 1 ) { printf("%4d : findSlaveEqnsBlock fails - total number of unsatisfied", mypid); printf(" constraints = %d \n", nSum); } if ( ( outputLevel_ & HYPRE_BITMASK2 ) >= 1 ) { for ( irow = 0; irow < nConstraints; irow++ ) if ( slaveEqnList_[irow] == -1 ) { printf("%4d : findSlaveEqnsBlock - unsatisfied constraint",mypid); printf(" equation = %d\n", irow+endRow-nConstraints+1); } } return -1; } else return 0; } //*************************************************************************** // compose global slave equation list //--------------------------------------------------------------------------- int HYPRE_SlideReduction::composeGlobalList() { int mypid, nprocs, nConstraints, is, ip, *recvCntArray, *displArray; int globalNConstr, ierr, ncnt, *iArray1, *iArray2; //------------------------------------------------------------------ // fetch machine and constraint parameters //------------------------------------------------------------------ MPI_Comm_rank( mpiComm_, &mypid ); MPI_Comm_size( mpiComm_, &nprocs ); nConstraints = procNConstr_[mypid+1] - procNConstr_[mypid]; globalNConstr = procNConstr_[nprocs]; //------------------------------------------------------------------ // sort the local selected node list and its auxiliary list, then // form a global list of slave nodes on each processor // form the corresponding auxiliary list for later pruning // ==> slaveEqnListAux_, gSlaveEqnList_, gSlaveEqnListAux_ //------------------------------------------------------------------ if ( slaveEqnListAux_ != NULL ) delete [] slaveEqnListAux_; if ( gSlaveEqnList_ != NULL ) delete [] gSlaveEqnList_; if ( gSlaveEqnListAux_ != NULL ) delete [] gSlaveEqnListAux_; slaveEqnListAux_ = NULL; if ( nConstraints > 0 ) { slaveEqnListAux_ = new int[nConstraints]; for ( is = 0; is < nConstraints; is++ ) slaveEqnListAux_[is] = is; HYPRE_LSI_qsort1a(slaveEqnList_, slaveEqnListAux_, 0, nConstraints-1); ierr = 0; for ( is = 1; is < nConstraints; is++ ) { if ( slaveEqnList_[is] == slaveEqnList_[is-1] ) { printf("%4d : HYPRE_SlideReduction ERROR - repeated slave",mypid); printf(" equation %d\n", slaveEqnList_[is]); ierr = 1; break; } } if ( ierr ) { for ( is = 0; is < nConstraints; is++ ) { printf("%4d : HYPRE_SlideReduction slave %d = %d \n",mypid,is, slaveEqnList_[is]); } exit(1); } } gSlaveEqnList_ = new int[globalNConstr]; gSlaveEqnListAux_ = new int[globalNConstr]; //------------------------------------------------------------------ // compose global slave equation list //------------------------------------------------------------------ recvCntArray = new int[nprocs]; displArray = new int[nprocs]; MPI_Allgather(&nConstraints,1,MPI_INT,recvCntArray,1,MPI_INT,mpiComm_); displArray[0] = 0; for ( ip = 1; ip < nprocs; ip++ ) displArray[ip] = displArray[ip-1] + recvCntArray[ip-1]; for ( ip = 0; ip < nConstraints; ip++ ) slaveEqnListAux_[ip] += displArray[mypid]; MPI_Allgatherv(slaveEqnList_, nConstraints, MPI_INT, gSlaveEqnList_, recvCntArray, displArray, MPI_INT, mpiComm_); MPI_Allgatherv(slaveEqnListAux_, nConstraints, MPI_INT, gSlaveEqnListAux_, recvCntArray, displArray, MPI_INT, mpiComm_); for ( is = 0; is < nConstraints; is++ ) slaveEqnListAux_[is] -= displArray[mypid]; delete [] recvCntArray; delete [] displArray; if ( constrBlkInfo_ != NULL && ( outputLevel_ & HYPRE_BITMASK2 ) >= 1 ) { iArray1 = new int[nConstraints]; iArray2 = new int[nConstraints]; for ( is = 0; is < nConstraints; is++ ) { iArray1[is] = constrBlkInfo_[is]; iArray2[is] = constrBlkSizes_[is]; } HYPRE_LSI_qsort1a(iArray1, iArray2, 0, nConstraints-1); ip = -1; ncnt = 0; for ( is = 0; is < nConstraints; is++ ) { if ( iArray1[is] != ip ) { iArray1[ncnt] = iArray1[is]; iArray2[ncnt] = iArray2[is]; ncnt++; ip = iArray1[is]; } } HYPRE_LSI_qsort1a(iArray2, iArray1, 0, ncnt-1); ip = 1; for ( is = 1; is < ncnt; is++ ) { if ( iArray2[is] == iArray2[is-1] ) ip++; else { printf("%4d : number of blocks with blksize %6d = %d\n", mypid, iArray2[is-1], ip); ip = 1; } } printf("%4d : number of blocks with blksize %6d = %d\n", mypid, iArray2[ncnt-1], ip); delete [] iArray1; delete [] iArray2; } if ( ( outputLevel_ & HYPRE_BITMASK2 ) > 1 ) for ( is = 0; is < nConstraints; is++ ) printf("%4d : HYPRE_SlideReduction - slaveEqnList %d = %d(%d)\n", mypid, is, slaveEqnList_[is], slaveEqnListAux_[is]); return 0; } //**************************************************************************** // build the submatrix matrix //---------------------------------------------------------------------------- int HYPRE_SlideReduction::buildSubMatrices() { int mypid, nprocs, *procNRows, startRow, endRow, localNRows; int globalNConstr, globalNRows, nConstraints, ncnt; int A21NRows, A21NCols, A21GlobalNRows, A21GlobalNCols; int A21StartRow, A21StartCol, ierr, maxRowSize, *A21MatSize; int newEndRow, irow, rowIndex, newRowSize, nnzA21, rowCount; int *colInd, *newColInd, rowSize, *reducedAMatSize, uBound; int reducedANRows, reducedANCols, reducedAStartRow, reducedAStartCol; int reducedAGlobalNRows, reducedAGlobalNCols, jcol; int procIndex, colIndex, totalNNZ, newColIndex; double *colVal, *newColVal; HYPRE_ParCSRMatrix A_csr, A21_csr, reducedA_csr; //------------------------------------------------------------------ // get matrix information //------------------------------------------------------------------ MPI_Comm_rank(mpiComm_, &mypid); MPI_Comm_size(mpiComm_, &nprocs); HYPRE_IJMatrixGetObject(Amat_, (void **) &A_csr); HYPRE_ParCSRMatrixGetRowPartitioning( A_csr, &procNRows ); startRow = procNRows[mypid]; endRow = procNRows[mypid+1] - 1; localNRows = endRow - startRow + 1; globalNConstr = procNConstr_[nprocs]; globalNRows = procNRows[nprocs]; nConstraints = procNConstr_[mypid+1] - procNConstr_[mypid]; //****************************************************************** // extract A21 from A //------------------------------------------------------------------ // calculate the dimension of A21 //------------------------------------------------------------------ A21NRows = nConstraints; A21NCols = localNRows - nConstraints; A21GlobalNRows = globalNConstr; A21GlobalNCols = globalNRows - globalNConstr; A21StartRow = procNConstr_[mypid]; A21StartCol = procNRows[mypid] - procNConstr_[mypid]; if ( ( outputLevel_ & HYPRE_BITMASK2 ) >= 1 ) { printf("%4d : buildA21Mat(2) - A21StartRow = %d\n", mypid, A21StartRow); printf("%4d : buildA21Mat(2) - A21GlobalDim = %d %d\n", mypid, A21GlobalNRows, A21GlobalNCols); printf("%4d : buildA21Mat(2) - A21LocalDim = %d %d\n",mypid, A21NRows, A21NCols); } //------------------------------------------------------------------ // create a matrix context for A21 //------------------------------------------------------------------ ierr = HYPRE_IJMatrixCreate(mpiComm_,A21StartRow,A21StartRow+A21NRows-1, A21StartCol,A21StartCol+A21NCols-1,&A21mat_); ierr += HYPRE_IJMatrixSetObjectType(A21mat_, HYPRE_PARCSR); hypre_assert(!ierr); //------------------------------------------------------------------ // compute the number of nonzeros in the nConstraint row of A21 //------------------------------------------------------------------ rowCount = maxRowSize = 0; newEndRow = endRow - nConstraints; if ( A21NRows > 0 ) A21MatSize = new int[A21NRows]; else A21MatSize = NULL; for ( irow = endRow-nConstraints+1; irow <= endRow; irow++ ) { HYPRE_ParCSRMatrixGetRow(A_csr,irow,&rowSize,&colInd,&colVal); newRowSize = 0; for ( jcol = 0; jcol < rowSize; jcol++ ) { colIndex = colInd[jcol]; if (colVal[jcol] != 0.0 && (colIndex <= newEndRow || colIndex > endRow)) newRowSize++; } A21MatSize[irow-newEndRow-1] = newRowSize; maxRowSize = ( newRowSize > maxRowSize ) ? newRowSize : maxRowSize; HYPRE_ParCSRMatrixRestoreRow(A_csr,irow,&rowSize,&colInd,&colVal); } nnzA21 = 0; for ( irow = 0; irow < nConstraints; irow++ ) nnzA21 += A21MatSize[irow]; MPI_Allreduce(&nnzA21,&ncnt,1,MPI_INT,MPI_SUM,mpiComm_); if ( mypid == 0 && ( outputLevel_ & HYPRE_BITMASK2 ) >= 1 ) printf(" 0 : buildSubMatrices : NNZ of A21 = %d\n", ncnt); //------------------------------------------------------------------ // after fetching the row sizes, set up A21 with such sizes //------------------------------------------------------------------ ierr = HYPRE_IJMatrixSetRowSizes(A21mat_, A21MatSize); ierr += HYPRE_IJMatrixInitialize(A21mat_); hypre_assert(!ierr); if ( A21NRows > 0 ) delete [] A21MatSize; //------------------------------------------------------------------ // next load the first nConstraint row to A21 extracted from A // (at the same time, the D block is saved for future use) //------------------------------------------------------------------ rowCount = A21StartRow; newColInd = new int[maxRowSize+1]; newColVal = new double[maxRowSize+1]; for ( irow = endRow-nConstraints+1; irow <= endRow; irow++ ) { HYPRE_ParCSRMatrixGetRow(A_csr,irow,&rowSize,&colInd,&colVal); newRowSize = 0; for ( jcol = 0; jcol < rowSize; jcol++ ) { colIndex = colInd[jcol]; if (colVal[jcol] != 0.0 && (colIndex <= newEndRow || colIndex > endRow)) { for ( procIndex = 0; procIndex < nprocs; procIndex++ ) if ( procNRows[procIndex] > colIndex ) break; procIndex--; newColIndex = colInd[jcol] - procNConstr_[procIndex]; newColInd[newRowSize] = newColIndex; newColVal[newRowSize++] = colVal[jcol]; } } HYPRE_IJMatrixSetValues(A21mat_, 1, &newRowSize, (const int *) &rowCount, (const int *) newColInd, (const double *) newColVal); HYPRE_ParCSRMatrixRestoreRow(A_csr,irow,&rowSize,&colInd,&colVal); rowCount++; } delete [] newColInd; delete [] newColVal; HYPRE_IJMatrixAssemble(A21mat_); HYPRE_IJMatrixGetObject(A21mat_, (void **) &A21_csr); hypre_MatvecCommPkgCreate((hypre_ParCSRMatrix *) A21_csr); //****************************************************************** // extract submatrix of A not corresponding to constraints //------------------------------------------------------------------ reducedANRows = localNRows - nConstraints; reducedANCols = reducedANRows; reducedAStartRow = procNRows[mypid] - procNConstr_[mypid]; reducedAStartCol = reducedAStartRow; reducedAGlobalNRows = globalNRows - globalNConstr; reducedAGlobalNCols = reducedAGlobalNRows; if ( ( outputLevel_ & HYPRE_BITMASK2 ) >= 1 ) { printf("%4d : buildReducedMatrix - reduceAGlobalDim = %d %d\n", mypid, reducedAGlobalNRows, reducedAGlobalNCols); printf("%4d : buildReducedMatrix - reducedALocalDim = %d %d\n", mypid, reducedANRows, reducedANCols); } //------------------------------------------------------------------ // create a matrix context for reducedA //------------------------------------------------------------------ ierr = HYPRE_IJMatrixCreate(mpiComm_,reducedAStartRow, reducedAStartRow+reducedANRows-1, reducedAStartCol, reducedAStartCol+reducedANCols-1,&reducedAmat_); ierr += HYPRE_IJMatrixSetObjectType(reducedAmat_, HYPRE_PARCSR); hypre_assert(!ierr); //------------------------------------------------------------------ // compute row sizes for reducedA //------------------------------------------------------------------ reducedAMatSize = new int[reducedANRows]; rowCount = maxRowSize = totalNNZ = 0; for ( irow = startRow; irow <= newEndRow; irow++ ) { HYPRE_ParCSRMatrixGetRow(A_csr,irow,&rowSize,&colInd,&colVal); newRowSize = 0; for ( jcol = 0; jcol < rowSize; jcol++ ) { colIndex = colInd[jcol]; for ( procIndex = 0; procIndex < nprocs; procIndex++ ) if ( procNRows[procIndex] > colIndex ) break; uBound = procNRows[procIndex] - (procNConstr_[procIndex]-procNConstr_[procIndex-1]); procIndex--; if (colIndex < uBound) newRowSize++; } rowIndex = reducedAStartRow + rowCount; maxRowSize = ( newRowSize > maxRowSize ) ? newRowSize : maxRowSize; reducedAMatSize[rowCount++] = newRowSize; totalNNZ += newRowSize; HYPRE_ParCSRMatrixRestoreRow(A_csr,irow,&rowSize,&colInd,&colVal); } ierr = HYPRE_IJMatrixSetRowSizes(reducedAmat_, reducedAMatSize); ierr += HYPRE_IJMatrixInitialize(reducedAmat_); hypre_assert(!ierr); delete [] reducedAMatSize; //------------------------------------------------------------------ // load the reducedA matrix //------------------------------------------------------------------ rowCount = 0; newColInd = new int[maxRowSize+1]; newColVal = new double[maxRowSize+1]; for ( irow = startRow; irow <= newEndRow; irow++ ) { HYPRE_ParCSRMatrixGetRow(A_csr, irow, &rowSize, &colInd, &colVal); newRowSize = 0; for (jcol = 0; jcol < rowSize; jcol++) { colIndex = colInd[jcol]; for ( procIndex = 0; procIndex < nprocs; procIndex++ ) if ( procNRows[procIndex] > colIndex ) break; uBound = procNRows[procIndex] - (procNConstr_[procIndex]-procNConstr_[procIndex-1]); procIndex--; if ( colIndex < uBound ) { newColInd[newRowSize] = colIndex - procNConstr_[procIndex]; newColVal[newRowSize++] = colVal[jcol]; } HYPRE_ParCSRMatrixRestoreRow(A_csr,irow,&rowSize,&colInd,&colVal); } rowIndex = reducedAStartRow + rowCount; ierr = HYPRE_IJMatrixSetValues(reducedAmat_, 1, &newRowSize, (const int *) &rowIndex, (const int *) newColInd, (const double *) newColVal); hypre_assert(!ierr); rowCount++; } delete [] newColInd; delete [] newColVal; free( procNRows ); //------------------------------------------------------------------ // assemble the reduced matrix //------------------------------------------------------------------ HYPRE_IJMatrixAssemble(reducedAmat_); HYPRE_IJMatrixGetObject(reducedAmat_, (void **) &reducedA_csr); return 0; } //**************************************************************************** // build reduced rhs vector (form red_f1 = f1 - A12*x2) //---------------------------------------------------------------------------- int HYPRE_SlideReduction::buildModifiedRHSVector(HYPRE_IJVector x, HYPRE_IJVector b) { int nprocs, mypid, *procNRows, startRow, endRow, localNRows; int nConstraints, redBNRows, redBStart, ierr, x2NRows, x2Start; int vecIndex, irow; double *b_data, *rb_data, *x_data, *x2_data; HYPRE_ParCSRMatrix A_csr, A21_csr; HYPRE_IJVector x2; HYPRE_ParVector b_csr, rb_csr, x_csr, x2_csr; hypre_Vector *b_local, *rb_local, *x_local, *x2_local; //------------------------------------------------------------------ // sanitize //------------------------------------------------------------------ if (reducedBvec_ != NULL ) HYPRE_IJVectorDestroy(reducedBvec_); if (reducedXvec_ != NULL ) HYPRE_IJVectorDestroy(reducedXvec_); if (reducedRvec_ != NULL ) HYPRE_IJVectorDestroy(reducedRvec_); reducedBvec_ = NULL; reducedXvec_ = NULL; reducedRvec_ = NULL; //------------------------------------------------------------------ // get machine and matrix information //------------------------------------------------------------------ if (reducedAmat_ == NULL) return 0; MPI_Comm_rank( mpiComm_, &mypid ); MPI_Comm_size( mpiComm_, &nprocs ); HYPRE_IJMatrixGetObject(Amat_, (void **) &A_csr); HYPRE_ParCSRMatrixGetRowPartitioning( A_csr, &procNRows ); startRow = procNRows[mypid]; endRow = procNRows[mypid+1] - 1; localNRows = endRow - startRow + 1; if (procNConstr_ == NULL || procNConstr_[nprocs] == 0) { printf("%4d : buildModifiedRHSVector WARNING - no local data.\n",mypid); free(procNRows); return 1; } //------------------------------------------------------------------ // create reducedB //------------------------------------------------------------------ nConstraints = procNConstr_[mypid+1] - procNConstr_[mypid]; redBNRows = localNRows - nConstraints; redBStart = procNRows[mypid] - procNConstr_[mypid]; ierr = HYPRE_IJVectorCreate(mpiComm_, redBStart, redBStart+redBNRows-1, &reducedBvec_); ierr += HYPRE_IJVectorSetObjectType(reducedBvec_, HYPRE_PARCSR); ierr += HYPRE_IJVectorInitialize(reducedBvec_); ierr += HYPRE_IJVectorAssemble(reducedBvec_); hypre_assert( !ierr ); HYPRE_IJVectorGetObject(reducedBvec_, (void **) &rb_csr); HYPRE_IJVectorGetObject(b, (void **) &b_csr); b_local = hypre_ParVectorLocalVector((hypre_ParVector *) b_csr); b_data = (double *) hypre_VectorData(b_local); rb_local = hypre_ParVectorLocalVector((hypre_ParVector *) rb_csr); rb_data = (double *) hypre_VectorData(rb_local); for ( irow = 0; irow < localNRows-nConstraints; irow++ ) rb_data[irow] = b_data[irow]; //------------------------------------------------------------------ // create x_2 //------------------------------------------------------------------ x2NRows = nConstraints; x2Start = procNConstr_[mypid]; HYPRE_IJVectorCreate(mpiComm_, x2Start, x2Start+x2NRows-1, &x2); HYPRE_IJVectorSetObjectType(x2, HYPRE_PARCSR); ierr = HYPRE_IJVectorInitialize(x2); ierr += HYPRE_IJVectorAssemble(x2); hypre_assert(!ierr); HYPRE_IJVectorGetObject(x2, (void **) &x2_csr); HYPRE_IJVectorGetObject(x, (void **) &x_csr); x_local = hypre_ParVectorLocalVector((hypre_ParVector *) x_csr); x_data = (double *) hypre_VectorData(x_local); x2_local = hypre_ParVectorLocalVector((hypre_ParVector *) x2_csr); x2_data = (double *) hypre_VectorData(x2_local); for ( irow = 0; irow < nConstraints; irow++ ) { vecIndex = localNRows - nConstraints + irow; x2_data[irow] = x_data[vecIndex]; } //------------------------------------------------------------------ // form reducedB = A21^T * u_2 //------------------------------------------------------------------ HYPRE_IJMatrixGetObject(A21mat_, (void **) &A21_csr); HYPRE_ParCSRMatrixMatvecT(-1.0, A21_csr, x2_csr, 1.0, rb_csr); HYPRE_IJVectorDestroy(x2); //------------------------------------------------------------------ // create a few more vectors //------------------------------------------------------------------ ierr = HYPRE_IJVectorCreate(mpiComm_, redBStart, redBStart+redBNRows-1, &reducedXvec_); ierr += HYPRE_IJVectorSetObjectType(reducedXvec_, HYPRE_PARCSR); ierr += HYPRE_IJVectorInitialize(reducedXvec_); ierr += HYPRE_IJVectorAssemble(reducedXvec_); hypre_assert( !ierr ); ierr = HYPRE_IJVectorCreate(mpiComm_, redBStart, redBStart+redBNRows-1, &reducedRvec_); ierr += HYPRE_IJVectorSetObjectType(reducedRvec_, HYPRE_PARCSR); ierr += HYPRE_IJVectorInitialize(reducedRvec_); ierr += HYPRE_IJVectorAssemble(reducedRvec_); hypre_assert( !ierr ); free( procNRows ); return 0; } //***************************************************************************** // given the solution vector, copy the actual solution //----------------------------------------------------------------------------- int HYPRE_SlideReduction::buildModifiedSolnVector(HYPRE_IJVector x) { int mypid, nprocs, *procNRows, startRow, endRow, localNRows; int nConstraints, irow; double *x_data, *rx_data; HYPRE_ParCSRMatrix A_csr; HYPRE_ParVector x_csr, rx_csr; hypre_Vector *x_local, *rx_local; //------------------------------------------------------------------ // get machine and matrix information //------------------------------------------------------------------ if ( reducedXvec_ == NULL ) return -1; MPI_Comm_rank( mpiComm_, &mypid ); MPI_Comm_size( mpiComm_, &nprocs ); HYPRE_IJMatrixGetObject(Amat_, (void **) &A_csr); HYPRE_ParCSRMatrixGetRowPartitioning( A_csr, &procNRows ); startRow = procNRows[mypid]; endRow = procNRows[mypid+1] - 1; localNRows = endRow - startRow + 1; nConstraints = procNConstr_[mypid+1] - procNConstr_[mypid]; free( procNRows ); if (( outputLevel_ & HYPRE_BITMASK2 ) >= 1 && (procNConstr_==NULL || procNConstr_[nprocs]==0)) { printf("%4d : buildModifiedSolnVector WARNING - no local entry.\n", mypid); return 1; } //------------------------------------------------------------------ // compute b2 - A21 * sol (v1 = b2 + v1) //------------------------------------------------------------------ HYPRE_IJVectorGetObject(x, (void **) &x_csr); x_local = hypre_ParVectorLocalVector((hypre_ParVector *) x_csr); x_data = (double *) hypre_VectorData(x_local); HYPRE_IJVectorGetObject(reducedXvec_, (void **) &rx_csr); rx_local = hypre_ParVectorLocalVector((hypre_ParVector *) rx_csr); rx_data = (double *) hypre_VectorData(rx_local); for ( irow = 0; irow < localNRows-nConstraints; irow++ ) x_data[irow] = rx_data[irow]; return 0; } //**************************************************************************** // build the reduced matrix //---------------------------------------------------------------------------- int HYPRE_SlideReduction::buildReducedMatrix() { int mypid, nprocs, *procNRows, startRow, endRow, localNRows; int globalNConstr, globalNRows, nConstraints, newEndRow; int reducedANRows, reducedANCols, reducedAStartRow, reducedAStartCol; int reducedAGlobalNRows, reducedAGlobalNCols, ncnt, irow, jcol; int rowSize, *colInd, *reducedAMatSize, rowCount, maxRowSize; int rowSize2, *colInd2, newRowSize, rowIndex, searchIndex, uBound; int procIndex, colIndex, ierr, *newColInd, totalNNZ; double *colVal, *colVal2, *newColVal; char fname[40]; HYPRE_ParCSRMatrix A_csr, A21_csr, invA22_csr, RAP_csr, reducedA_csr; //------------------------------------------------------------------ // first compute A21 and invA22 //------------------------------------------------------------------ buildA21Mat(); buildInvA22Mat(); //------------------------------------------------------------------ // get matrix information //------------------------------------------------------------------ MPI_Comm_rank(mpiComm_, &mypid); MPI_Comm_size(mpiComm_, &nprocs); HYPRE_IJMatrixGetObject(Amat_, (void **) &A_csr); HYPRE_ParCSRMatrixGetRowPartitioning( A_csr, &procNRows ); startRow = procNRows[mypid]; endRow = procNRows[mypid+1] - 1; localNRows = endRow - startRow + 1; globalNConstr = procNConstr_[nprocs]; globalNRows = procNRows[nprocs]; nConstraints = procNConstr_[mypid+1] - procNConstr_[mypid]; newEndRow = endRow - nConstraints; reducedANRows = localNRows - nConstraints; reducedANCols = reducedANRows; reducedAStartRow = procNRows[mypid] - procNConstr_[mypid]; reducedAStartCol = reducedAStartRow; reducedAGlobalNRows = globalNRows - globalNConstr; reducedAGlobalNCols = reducedAGlobalNRows; //------------------------------------------------------------------ // perform the triple matrix product A12 * invA22 * A21 //------------------------------------------------------------------ HYPRE_IJMatrixGetObject(A21mat_, (void **) &A21_csr); HYPRE_IJMatrixGetObject(invA22mat_, (void **) &invA22_csr); if ( ( outputLevel_ & HYPRE_BITMASK2 ) >= 1 ) printf("%4d : buildReducedMatrix - Triple matrix product starts\n", mypid); hypre_BoomerAMGBuildCoarseOperator((hypre_ParCSRMatrix *) A21_csr, (hypre_ParCSRMatrix *) invA22_csr, (hypre_ParCSRMatrix *) A21_csr, (hypre_ParCSRMatrix **) &RAP_csr); if ( ( outputLevel_ & HYPRE_BITMASK2 ) >= 1 ) printf("%4d : buildReducedMatrix - Triple matrix product ends\n", mypid); if ( outputLevel_ >= 4 ) { sprintf(fname, "rap.%d", mypid); FILE *fp = fopen(fname, "w"); if ( mypid == 0 ) { printf("====================================================\n"); printf("%4d : Printing RAP matrix... \n", mypid); fflush(stdout); } for (irow=reducedAStartRow; irow= 1 ) { printf("%4d : buildReducedMatrix - reduceAGlobalDim = %d %d\n", mypid, reducedAGlobalNRows, reducedAGlobalNCols); printf("%4d : buildReducedMatrix - reducedALocalDim = %d %d\n", mypid, reducedANRows, reducedANCols); } //------------------------------------------------------------------ // create a matrix context for reducedA //------------------------------------------------------------------ ierr = HYPRE_IJMatrixCreate(mpiComm_,reducedAStartRow, reducedAStartRow+reducedANRows-1, reducedAStartCol, reducedAStartCol+reducedANCols-1,&reducedAmat_); ierr += HYPRE_IJMatrixSetObjectType(reducedAmat_, HYPRE_PARCSR); hypre_assert(!ierr); //------------------------------------------------------------------ // compute row sizes for reducedA //------------------------------------------------------------------ rowCount = maxRowSize = totalNNZ = 0; for ( irow = startRow; irow <= newEndRow; irow++ ) { searchIndex = hypre_BinarySearch(slaveEqnList_, irow, nConstraints); if ( searchIndex >= 0 ) reducedAMatSize[rowCount++] = 1; else { HYPRE_ParCSRMatrixGetRow(A_csr,irow,&rowSize,&colInd,&colVal); rowIndex = reducedAStartRow + rowCount; ierr = HYPRE_ParCSRMatrixGetRow(RAP_csr,rowIndex,&rowSize2, &colInd2, &colVal2); hypre_assert( !ierr ); newRowSize = rowSize + rowSize2; maxRowSize = ( newRowSize > maxRowSize ) ? newRowSize : maxRowSize; newColInd = new int[newRowSize]; for (jcol = 0; jcol < rowSize; jcol++) newColInd[jcol] = colInd[jcol]; for (jcol = 0; jcol < rowSize2; jcol++) newColInd[rowSize+jcol] = colInd2[jcol]; hypre_qsort0(newColInd, 0, newRowSize-1); ncnt = 0; for ( jcol = 1; jcol < newRowSize; jcol++ ) if (newColInd[jcol] != newColInd[ncnt]) newColInd[++ncnt] = newColInd[jcol]; if ( newRowSize > 0 ) ncnt++; reducedAMatSize[rowCount++] = ncnt; totalNNZ += ncnt; HYPRE_ParCSRMatrixRestoreRow(A_csr,irow,&rowSize,&colInd,&colVal); ierr = HYPRE_ParCSRMatrixRestoreRow(RAP_csr,rowIndex,&rowSize2, &colInd2,&colVal2); delete [] newColInd; hypre_assert( !ierr ); } } ierr = HYPRE_IJMatrixSetRowSizes(reducedAmat_, reducedAMatSize); ierr += HYPRE_IJMatrixInitialize(reducedAmat_); hypre_assert(!ierr); delete [] reducedAMatSize; int totalNNZA = 0; for ( irow = startRow; irow <= endRow; irow++ ) { HYPRE_ParCSRMatrixGetRow(A_csr,irow,&rowSize,NULL,NULL); totalNNZA += rowSize; HYPRE_ParCSRMatrixRestoreRow(A_csr,irow,&rowSize,NULL,NULL); } if ( ( outputLevel_ & HYPRE_BITMASK2 ) >= 1 ) { printf("%4d : buildReducedMatrix - NNZ of reducedA = %d %d %e\n", mypid, totalNNZ, totalNNZA, 1.0*totalNNZ/totalNNZA); } //------------------------------------------------------------------ // load the reducedA matrix //------------------------------------------------------------------ rowCount = 0; newColInd = new int[maxRowSize+1]; newColVal = new double[maxRowSize+1]; for ( irow = startRow; irow <= newEndRow; irow++ ) { searchIndex = hypre_BinarySearch(slaveEqnList_, irow, nConstraints); rowIndex = reducedAStartRow + rowCount; if ( searchIndex >= 0 ) { newRowSize = 1; newColInd[0] = reducedAStartRow + rowCount; newColVal[0] = 1.0; } else { HYPRE_ParCSRMatrixGetRow(A_csr, irow, &rowSize, &colInd, &colVal); HYPRE_ParCSRMatrixGetRow(RAP_csr,rowIndex,&rowSize2,&colInd2, &colVal2); newRowSize = rowSize + rowSize2; ncnt = 0; for ( jcol = 0; jcol < rowSize; jcol++ ) { colIndex = colInd[jcol]; for ( procIndex = 0; procIndex < nprocs; procIndex++ ) if ( procNRows[procIndex] > colIndex ) break; uBound = procNRows[procIndex] - (procNConstr_[procIndex]-procNConstr_[procIndex-1]); procIndex--; if ( colIndex < uBound ) { searchIndex = hypre_BinarySearch(gSlaveEqnList_, colIndex, globalNConstr); if ( searchIndex < 0 ) { newColInd[ncnt] = colIndex - procNConstr_[procIndex]; newColVal[ncnt++] = colVal[jcol]; } } } for ( jcol = 0; jcol < rowSize2; jcol++ ) { newColInd[ncnt+jcol] = colInd2[jcol]; newColVal[ncnt+jcol] = - colVal2[jcol]; } newRowSize = ncnt + rowSize2; hypre_qsort1(newColInd, newColVal, 0, newRowSize-1); ncnt = 0; for ( jcol = 0; jcol < newRowSize; jcol++ ) { if ( jcol != ncnt && newColInd[jcol] == newColInd[ncnt] ) newColVal[ncnt] += newColVal[jcol]; else if ( newColInd[jcol] != newColInd[ncnt] ) { ncnt++; newColVal[ncnt] = newColVal[jcol]; newColInd[ncnt] = newColInd[jcol]; } } newRowSize = ncnt + 1; ncnt = 0; for ( jcol = 0; jcol < newRowSize; jcol++ ) { if ( habs(newColVal[jcol]) >= truncTol_ ) { newColInd[ncnt] = newColInd[jcol]; newColVal[ncnt++] = newColVal[jcol]; } } newRowSize = ncnt; HYPRE_ParCSRMatrixRestoreRow(A_csr,irow,&rowSize,&colInd,&colVal); HYPRE_ParCSRMatrixRestoreRow(RAP_csr,rowIndex,&rowSize2,&colInd2, &colVal2); } ierr = HYPRE_IJMatrixSetValues(reducedAmat_, 1, &newRowSize, (const int *) &rowIndex, (const int *) newColInd, (const double *) newColVal); hypre_assert(!ierr); rowCount++; } delete [] newColInd; delete [] newColVal; hypreRAP_ = RAP_csr; free( procNRows ); //------------------------------------------------------------------ // assemble the reduced matrix //------------------------------------------------------------------ HYPRE_IJMatrixAssemble(reducedAmat_); HYPRE_IJMatrixGetObject(reducedAmat_, (void **) &reducedA_csr); if ( outputLevel_ >= 5 ) { sprintf(fname, "reducedA.%d", mypid); FILE *fp = fopen(fname, "w"); if ( mypid == 0 ) { printf("====================================================\n"); printf("%4d : Printing reducedA matrix... \n", mypid); fflush(stdout); } for ( irow = reducedAStartRow; irow < reducedAStartRow+localNRows-nConstraints; irow++ ) { //printf("%d : reducedA ROW %d\n", mypid, irow); ierr = HYPRE_ParCSRMatrixGetRow(reducedA_csr,irow,&rowSize, &colInd, &colVal); //hypre_qsort1(colInd, colVal, 0, rowSize-1); for ( jcol = 0; jcol < rowSize; jcol++ ) if ( colVal[jcol] != 0.0 ) fprintf(fp,"%6d %6d %25.16e \n",irow+1,colInd[jcol]+1, colVal[jcol]); HYPRE_ParCSRMatrixRestoreRow(reducedA_csr,irow,&rowSize,&colInd, &colVal); } fclose(fp); if ( mypid == 0 ) printf("====================================================\n"); } return 0; } //**************************************************************************** // build reduced rhs vector (form red_f1 = f1 - A12*invA22*f2) //---------------------------------------------------------------------------- int HYPRE_SlideReduction::buildReducedRHSVector(HYPRE_IJVector b) { int nprocs, mypid, *procNRows, startRow, endRow, localNRows; int nConstraints, newEndRow, f2LocalLength, f2Start, ierr; int irow, jcol, vecIndex, redBLocalLength, redBStart, rowIndex; double *b_data, *f2_data, ddata; HYPRE_ParCSRMatrix A_csr, A21_csr, invA22_csr; HYPRE_IJVector f2, f2hat; HYPRE_ParVector b_csr, f2_csr, f2hat_csr, rb_csr; hypre_Vector *b_local, *f2_local; //------------------------------------------------------------------ // get machine and matrix information //------------------------------------------------------------------ if ( reducedAmat_ == NULL ) return 0; MPI_Comm_rank( mpiComm_, &mypid ); MPI_Comm_size( mpiComm_, &nprocs ); HYPRE_IJMatrixGetObject(Amat_, (void **) &A_csr); HYPRE_ParCSRMatrixGetRowPartitioning( A_csr, &procNRows ); startRow = procNRows[mypid]; endRow = procNRows[mypid+1] - 1; localNRows = endRow - startRow + 1; if ( procNConstr_ == NULL || procNConstr_[nprocs] == 0 ) { printf("%4d : buildReducedRHSVector WARNING - no local entries.\n",mypid); free(procNRows); return 1; } //------------------------------------------------------------------ // form f2hat = invA22 * f2 //------------------------------------------------------------------ nConstraints = procNConstr_[mypid+1] - procNConstr_[mypid]; newEndRow = endRow - nConstraints; f2LocalLength = 2 * nConstraints; f2Start = 2 * procNConstr_[mypid]; HYPRE_IJVectorCreate(mpiComm_, f2Start, f2Start+f2LocalLength-1, &f2); HYPRE_IJVectorSetObjectType(f2, HYPRE_PARCSR); ierr = HYPRE_IJVectorInitialize(f2); ierr += HYPRE_IJVectorAssemble(f2); hypre_assert(!ierr); HYPRE_IJVectorGetObject(f2, (void **) &f2_csr); HYPRE_IJVectorCreate(mpiComm_, f2Start, f2Start+f2LocalLength-1, &f2hat); HYPRE_IJVectorSetObjectType(f2hat, HYPRE_PARCSR); ierr = HYPRE_IJVectorInitialize(f2hat); ierr += HYPRE_IJVectorAssemble(f2hat); hypre_assert(!ierr); HYPRE_IJVectorGetObject(f2hat, (void **) &f2hat_csr); HYPRE_IJVectorGetObject(b, (void **) &b_csr); b_local = hypre_ParVectorLocalVector((hypre_ParVector *) b_csr); b_data = (double *) hypre_VectorData(b_local); f2_local = hypre_ParVectorLocalVector((hypre_ParVector *) f2_csr); f2_data = (double *) hypre_VectorData(f2_local); for ( irow = 0; irow < nConstraints; irow++ ) { vecIndex = -1; for ( jcol = 0; jcol < nConstraints; jcol++ ) { if ( slaveEqnListAux_[jcol] == irow ) { vecIndex = slaveEqnList_[jcol]; break; } } hypre_assert( vecIndex >= startRow ); hypre_assert( vecIndex <= endRow ); f2_data[irow] = b_data[vecIndex-startRow]; } for ( irow = 0; irow < nConstraints; irow++ ) { vecIndex = localNRows - nConstraints + irow; f2_data[irow+nConstraints] = b_data[vecIndex]; } HYPRE_IJMatrixGetObject(invA22mat_, (void **) &invA22_csr); HYPRE_ParCSRMatrixMatvec( 1.0, invA22_csr, f2_csr, 0.0, f2hat_csr ); HYPRE_IJVectorDestroy(f2); //------------------------------------------------------------------ // form reducedB = A21^T * f2hat //------------------------------------------------------------------ redBLocalLength = localNRows - nConstraints; redBStart = procNRows[mypid] - procNConstr_[mypid]; ierr = HYPRE_IJVectorCreate(mpiComm_, redBStart, redBStart+redBLocalLength-1, &reducedBvec_); ierr += HYPRE_IJVectorSetObjectType(reducedBvec_, HYPRE_PARCSR); ierr += HYPRE_IJVectorInitialize(reducedBvec_); ierr += HYPRE_IJVectorAssemble(reducedBvec_); hypre_assert( !ierr ); HYPRE_IJVectorGetObject(reducedBvec_, (void **) &rb_csr); HYPRE_IJMatrixGetObject(A21mat_, (void **) &A21_csr); HYPRE_ParCSRMatrixMatvecT(-1.0, A21_csr, f2hat_csr, 0.0, rb_csr); HYPRE_IJVectorDestroy(f2hat); //------------------------------------------------------------------ // finally form reducedB = f1 - f2til //------------------------------------------------------------------ rowIndex = redBStart; for ( irow = startRow; irow <= newEndRow; irow++ ) { if ( hypre_BinarySearch(slaveEqnList_, irow, nConstraints) < 0 ) { ddata = b_data[irow-startRow]; HYPRE_IJVectorAddToValues(reducedBvec_, 1, (const int *) &rowIndex, (const double *) &ddata); } else { ddata = 0.0; HYPRE_IJVectorSetValues(reducedBvec_, 1, (const int *) &rowIndex, (const double *) &ddata); } rowIndex++; } HYPRE_IJVectorGetObject(reducedBvec_, (void **) &rb_csr); //------------------------------------------------------------------ // create a few more vectors //------------------------------------------------------------------ ierr = HYPRE_IJVectorCreate(mpiComm_, redBStart, redBStart+redBLocalLength-1, &reducedXvec_); ierr += HYPRE_IJVectorSetObjectType(reducedXvec_, HYPRE_PARCSR); ierr += HYPRE_IJVectorInitialize(reducedXvec_); ierr += HYPRE_IJVectorAssemble(reducedXvec_); hypre_assert( !ierr ); ierr = HYPRE_IJVectorCreate(mpiComm_, redBStart, redBStart+redBLocalLength-1, &reducedRvec_); ierr += HYPRE_IJVectorSetObjectType(reducedRvec_, HYPRE_PARCSR); ierr += HYPRE_IJVectorInitialize(reducedRvec_); ierr += HYPRE_IJVectorAssemble(reducedRvec_); hypre_assert( !ierr ); free( procNRows ); return 0; } //***************************************************************************** // given the submatrices and the solution vector, restore the actual solution // A21 x_1 + A22 x_2 = b2 // x_2 = invA22 * ( b2 - A21 x_1 ) //----------------------------------------------------------------------------- int HYPRE_SlideReduction::buildReducedSolnVector(HYPRE_IJVector x, HYPRE_IJVector b) { int mypid, nprocs, *procNRows, startRow, endRow, localNRows; int nConstraints, newEndRow, vecStart, vecLocalLength, ierr; int irow, jcol, rowIndex, searchIndex, length; double *b_data, *v1_data, *rx_data, *x_data, *x2_data; HYPRE_ParCSRMatrix A_csr, A21_csr, invA22_csr; HYPRE_ParVector x_csr, x2_csr, v1_csr, b_csr, rx_csr; HYPRE_IJVector v1, x2; hypre_Vector *b_local, *v1_local, *rx_local, *x_local, *x2_local; //------------------------------------------------------------------ // get machine and matrix information //------------------------------------------------------------------ if ( reducedAmat_ == NULL ) return 0; MPI_Comm_rank( mpiComm_, &mypid ); MPI_Comm_size( mpiComm_, &nprocs ); HYPRE_IJMatrixGetObject(Amat_, (void **) &A_csr); HYPRE_ParCSRMatrixGetRowPartitioning( A_csr, &procNRows ); startRow = procNRows[mypid]; endRow = procNRows[mypid+1] - 1; localNRows = endRow - startRow + 1; nConstraints = procNConstr_[mypid+1] - procNConstr_[mypid]; newEndRow = endRow - nConstraints; if (( outputLevel_ & HYPRE_BITMASK2 ) >= 1 && (procNConstr_==NULL || procNConstr_[nprocs]==0)) { printf("%4d : buildReducedSolnVector WARNING - no local entry.\n",mypid); return 1; } //------------------------------------------------------------------ // compute v1 = - A21 * sol //------------------------------------------------------------------ vecStart = 2 * procNConstr_[mypid]; vecLocalLength = 2 * nConstraints; ierr = HYPRE_IJVectorCreate(mpiComm_, vecStart, vecStart+vecLocalLength-1, &v1); ierr += HYPRE_IJVectorSetObjectType(v1, HYPRE_PARCSR); ierr += HYPRE_IJVectorInitialize(v1); ierr += HYPRE_IJVectorAssemble(v1); hypre_assert(!ierr); HYPRE_IJVectorGetObject(v1, (void **) &v1_csr); HYPRE_IJMatrixGetObject(A21mat_, (void **) &A21_csr); HYPRE_IJVectorGetObject(reducedXvec_, (void **) &rx_csr); if ( scaleMatrixFlag_ == 1 && ADiagISqrts_ != NULL ) { rx_local = hypre_ParVectorLocalVector((hypre_ParVector *) rx_csr); rx_data = (double *) hypre_VectorData(rx_local); length = hypre_VectorSize(rx_local); for ( irow = 0; irow < length; irow++ ) rx_data[irow] *= ADiagISqrts_[irow]; } HYPRE_ParCSRMatrixMatvec( -1.0, A21_csr, rx_csr, 0.0, v1_csr ); //------------------------------------------------------------------ // compute b2 - A21 * sol (v1 = b2 + v1) //------------------------------------------------------------------ HYPRE_IJVectorGetObject(b, (void **) &b_csr); b_local = hypre_ParVectorLocalVector((hypre_ParVector *) b_csr); b_data = (double *) hypre_VectorData(b_local); v1_local = hypre_ParVectorLocalVector((hypre_ParVector *) v1_csr); v1_data = (double *) hypre_VectorData(v1_local); rowIndex = 0; for ( irow = 0; irow < nConstraints; irow++ ) { searchIndex = -1; for ( jcol = 0; jcol < nConstraints; jcol++ ) { if ( slaveEqnListAux_[jcol] == irow ) { searchIndex = slaveEqnList_[jcol]; break; } } hypre_assert( searchIndex >= startRow ); hypre_assert( searchIndex <= newEndRow ); v1_data[rowIndex++] += b_data[searchIndex-startRow]; } for ( irow = endRow-nConstraints+1; irow <= endRow; irow++ ) v1_data[rowIndex++] += b_data[irow-startRow]; //------------------------------------------------------------- // compute inv(A22) * (f2 - A21 * sol) --> x2 = invA22 * v1 //------------------------------------------------------------- ierr = HYPRE_IJVectorCreate(mpiComm_, vecStart, vecStart+vecLocalLength-1, &x2); ierr += HYPRE_IJVectorSetObjectType(x2, HYPRE_PARCSR); ierr += HYPRE_IJVectorInitialize(x2); ierr += HYPRE_IJVectorAssemble(x2); hypre_assert(!ierr); HYPRE_IJVectorGetObject(x2, (void **) &x2_csr ); HYPRE_IJMatrixGetObject(invA22mat_, (void **) &invA22_csr ); HYPRE_ParCSRMatrixMatvec(1.0, invA22_csr, v1_csr, 0.0, x2_csr); #if 0 FILE *fp = fopen("rhs.m", "w"); for ( irow = 0; irow < 2*nConstraints; irow++ ) fprintf(fp, " %6d %25.16e \n", irow+1, v1_data[irow]); fclose(fp); #endif //------------------------------------------------------------- // inject final solution to the solution vector x //------------------------------------------------------------- HYPRE_IJVectorGetObject(x, (void **) &x_csr ); rx_local = hypre_ParVectorLocalVector((hypre_ParVector *) rx_csr); rx_data = (double *) hypre_VectorData(rx_local); x_local = hypre_ParVectorLocalVector((hypre_ParVector *) x_csr); x_data = (double *) hypre_VectorData(x_local); x2_local = hypre_ParVectorLocalVector((hypre_ParVector *) x2_csr); x2_data = (double *) hypre_VectorData(x2_local); for ( irow = 0; irow < localNRows-nConstraints; irow++ ) x_data[irow] = rx_data[irow]; for ( irow = 0; irow < nConstraints; irow++ ) { for ( jcol = 0; jcol < nConstraints; jcol++ ) { if ( slaveEqnListAux_[jcol] == irow ) { searchIndex = slaveEqnList_[jcol]; break; } } x_data[searchIndex-startRow] = x2_data[irow]; } for ( irow = nConstraints; irow < 2*nConstraints; irow++ ) x_data[localNRows-2*nConstraints+irow] = x2_data[irow]; //------------------------------------------------------------------ // compute true residual //------------------------------------------------------------------ #if 0 double rnorm; HYPRE_IJVector R; HYPRE_ParVector R_csr; ierr = HYPRE_IJVectorCreate(mpiComm_, procNRows[mypid], procNRows[mypid+1]-1, &R); ierr += HYPRE_IJVectorSetObjectType(R, HYPRE_PARCSR); ierr += HYPRE_IJVectorInitialize(R); ierr += HYPRE_IJVectorAssemble(R); hypre_assert(!ierr); HYPRE_IJVectorGetObject(R, (void **) &R_csr); HYPRE_ParVectorCopy( b_csr, R_csr ); HYPRE_ParCSRMatrixMatvec( -1.0, A_csr, x_csr, 1.0, R_csr ); HYPRE_ParVectorInnerProd( R_csr, R_csr, &rnorm); hypre_Vector *R_local=hypre_ParVectorLocalVector((hypre_ParVector*) R_csr); double *R_data = (double *) hypre_VectorData(R_local); HYPRE_ParVectorInnerProd( R_csr, R_csr, &rnorm); double rnorm2 = 0.0; for ( irow = 0; irow < nConstraints; irow++ ) { searchIndex = -1; for ( jcol = 0; jcol < nConstraints; jcol++ ) { if ( slaveEqnListAux_[jcol] == irow ) { searchIndex = slaveEqnList_[jcol]; break; } } rnorm2 += (R_data[searchIndex-startRow] * R_data[searchIndex-startRow]); } for ( irow = endRow-nConstraints+1; irow <= endRow; irow++ ) rnorm2 += (R_data[irow-startRow] * R_data[irow-startRow]); HYPRE_IJVectorDestroy(R); if ( mypid == 0 ) printf("HYPRE_SlideRedction norm check = %e %e %e\n", sqrt(rnorm), sqrt(rnorm-rnorm2), sqrt(rnorm2)); #endif //---------------------------------------------------------------- // clean up //---------------------------------------------------------------- HYPRE_IJVectorDestroy(v1); HYPRE_IJVectorDestroy(x2); free( procNRows ); return 0; } //**************************************************************************** // build A21 matrix //---------------------------------------------------------------------------- int HYPRE_SlideReduction::buildA21Mat() { int mypid, nprocs, *procNRows, startRow, endRow, localNRows; int globalNConstr, globalNRows, nConstraints, A21NRows, A21NCols; int A21GlobalNRows, A21GlobalNCols, A21StartRow, A21StartCol, ierr; int rowCount, maxRowSize, newEndRow, *A21MatSize, irow, is, rowIndex; int rowSize, *colInd, newRowSize, jcol, colIndex, searchIndex; int nnzA21, *newColInd, procIndex, ncnt, newColIndex; double *colVal, *newColVal; char fname[40]; HYPRE_ParCSRMatrix A_csr, A21_csr; //------------------------------------------------------------------ // get matrix information //------------------------------------------------------------------ MPI_Comm_rank(mpiComm_, &mypid); MPI_Comm_size(mpiComm_, &nprocs); HYPRE_IJMatrixGetObject(Amat_, (void **) &A_csr); HYPRE_ParCSRMatrixGetRowPartitioning( A_csr, &procNRows ); startRow = procNRows[mypid]; endRow = procNRows[mypid+1] - 1; localNRows = endRow - startRow + 1; globalNConstr = procNConstr_[nprocs]; globalNRows = procNRows[nprocs]; nConstraints = procNConstr_[mypid+1] - procNConstr_[mypid]; //****************************************************************** // extract A21 from A //------------------------------------------------------------------ // calculate the dimension of A21 //------------------------------------------------------------------ A21NRows = 2 * nConstraints; A21NCols = localNRows - nConstraints; A21GlobalNRows = 2 * globalNConstr; A21GlobalNCols = globalNRows - globalNConstr; A21StartRow = 2 * procNConstr_[mypid]; A21StartCol = procNRows[mypid] - procNConstr_[mypid]; if ( ( outputLevel_ & HYPRE_BITMASK2 ) >= 1 ) { printf("%4d : buildA21Mat - A21StartRow = %d\n", mypid, A21StartRow); printf("%4d : buildA21Mat - A21GlobalDim = %d %d\n", mypid, A21GlobalNRows, A21GlobalNCols); printf("%4d : buildA21Mat - A21LocalDim = %d %d\n",mypid, A21NRows, A21NCols); } //------------------------------------------------------------------ // create a matrix context for A21 //------------------------------------------------------------------ ierr = HYPRE_IJMatrixCreate(mpiComm_,A21StartRow,A21StartRow+A21NRows-1, A21StartCol,A21StartCol+A21NCols-1,&A21mat_); ierr += HYPRE_IJMatrixSetObjectType(A21mat_, HYPRE_PARCSR); hypre_assert(!ierr); //------------------------------------------------------------------ // compute the number of nonzeros in the first nConstraint row of A21 // (which consists of the rows in selectedList), the nnz will // be reduced by excluding the constraint and selected slave columns //------------------------------------------------------------------ rowCount = maxRowSize = 0; newEndRow = endRow - nConstraints; if ( A21NRows > 0 ) A21MatSize = new int[A21NRows]; else A21MatSize = NULL; for ( irow = 0; irow < nConstraints; irow++ ) { for ( is = 0; is < nConstraints; is++ ) { if ( slaveEqnListAux_[is] == irow ) { rowIndex = slaveEqnList_[is]; break; } } HYPRE_ParCSRMatrixGetRow(A_csr,rowIndex,&rowSize,&colInd,&colVal); newRowSize = 0; for ( jcol = 0; jcol < rowSize; jcol++ ) { colIndex = colInd[jcol]; if ( colVal[jcol] != 0.0 ) { if ( colIndex <= newEndRow || colIndex > endRow ) { searchIndex = hypre_BinarySearch(gSlaveEqnList_,colIndex, globalNConstr); if ( searchIndex < 0 ) newRowSize++; } } } A21MatSize[irow] = newRowSize; maxRowSize = ( newRowSize > maxRowSize ) ? newRowSize : maxRowSize; HYPRE_ParCSRMatrixRestoreRow(A_csr,rowIndex,&rowSize,&colInd,&colVal); } //------------------------------------------------------------------ // compute the number of nonzeros in the second nConstraint row of A21 // (which consists of the rows in constraint equations) //------------------------------------------------------------------ rowCount = nConstraints; for ( irow = endRow-nConstraints+1; irow <= endRow; irow++ ) { HYPRE_ParCSRMatrixGetRow(A_csr,irow,&rowSize,&colInd,&colVal); newRowSize = 0; for ( jcol = 0; jcol < rowSize; jcol++ ) { if ( colVal[jcol] != 0.0 ) { colIndex = colInd[jcol]; if ( colIndex <= newEndRow || colIndex > endRow ) { searchIndex = hypre_BinarySearch(gSlaveEqnList_,colIndex, globalNConstr); if ( searchIndex < 0 ) newRowSize++; } } } A21MatSize[rowCount] = newRowSize; maxRowSize = ( newRowSize > maxRowSize ) ? newRowSize : maxRowSize; HYPRE_ParCSRMatrixRestoreRow(A_csr,irow,&rowSize,&colInd,&colVal); rowCount++; } nnzA21 = 0; for ( irow = 0; irow < 2*nConstraints; irow++ ) nnzA21 += A21MatSize[irow]; MPI_Allreduce(&nnzA21,&ncnt,1,MPI_INT,MPI_SUM,mpiComm_); if ( mypid == 0 && ( outputLevel_ & HYPRE_BITMASK2 ) >= 1 ) printf(" 0 : buildA21Mat : NNZ of A21 = %d\n", ncnt); //------------------------------------------------------------------ // after fetching the row sizes, set up A21 with such sizes //------------------------------------------------------------------ ierr = HYPRE_IJMatrixSetRowSizes(A21mat_, A21MatSize); ierr += HYPRE_IJMatrixInitialize(A21mat_); hypre_assert(!ierr); if ( A21NRows > 0 ) delete [] A21MatSize; //------------------------------------------------------------------ // next load the first nConstraint row to A21 extracted from A // (at the same time, the D block is saved for future use) //------------------------------------------------------------------ rowCount = A21StartRow; newColInd = new int[maxRowSize+1]; newColVal = new double[maxRowSize+1]; for ( irow = 0; irow < nConstraints; irow++ ) { for ( is = 0; is < nConstraints; is++ ) { if ( slaveEqnListAux_[is] == irow ) { rowIndex = slaveEqnList_[is]; break; } } HYPRE_ParCSRMatrixGetRow(A_csr,rowIndex,&rowSize,&colInd,&colVal); newRowSize = 0; for ( jcol = 0; jcol < rowSize; jcol++ ) { if ( colVal[jcol] != 0.0 ) { colIndex = colInd[jcol]; if ( colIndex <= newEndRow || colIndex > endRow ) { searchIndex = HYPRE_LSI_Search(gSlaveEqnList_,colIndex, globalNConstr); if ( searchIndex < 0 ) { for ( procIndex = 0; procIndex < nprocs; procIndex++ ) if ( procNRows[procIndex] > colIndex ) break; procIndex--; newColIndex = colIndex - procNConstr_[procIndex]; newColInd[newRowSize] = newColIndex; newColVal[newRowSize++] = colVal[jcol]; if ( newColIndex < 0 || newColIndex >= A21GlobalNCols ) { printf("%4d : buildA21Mat ERROR - ",mypid); printf(" out of range (%d,%d (%d))\n", rowCount, colIndex, A21GlobalNCols); for ( is = 0; is < rowSize; is++ ) printf("%4d : row %7d has col = %7d\n",mypid,rowIndex, colInd[is]); exit(1); } if ( newRowSize > maxRowSize+1 ) { if ( ( outputLevel_ & HYPRE_BITMASK2 ) >= 2 ) { printf("%4d : buildA21Mat WARNING - ",mypid); printf("passing array boundary(1).\n"); } } } } } } HYPRE_IJMatrixSetValues(A21mat_, 1, &newRowSize, (const int *) &rowCount, (const int *) newColInd, (const double *) newColVal); HYPRE_ParCSRMatrixRestoreRow(A_csr,rowIndex,&rowSize,&colInd,&colVal); rowCount++; } //------------------------------------------------------------------ // next load the second nConstraint rows to A21 extracted from A //------------------------------------------------------------------ for ( irow = endRow-nConstraints+1; irow <= endRow; irow++ ) { HYPRE_ParCSRMatrixGetRow(A_csr,irow,&rowSize,&colInd,&colVal); newRowSize = 0; for ( jcol = 0; jcol < rowSize; jcol++ ) { colIndex = colInd[jcol]; if (colVal[jcol] != 0.0 && (colIndex <= newEndRow || colIndex > endRow)) { searchIndex = hypre_BinarySearch(gSlaveEqnList_, colIndex, globalNConstr); if ( searchIndex < 0 ) { for ( procIndex = 0; procIndex < nprocs; procIndex++ ) if ( procNRows[procIndex] > colIndex ) break; procIndex--; newColIndex = colInd[jcol] - procNConstr_[procIndex]; newColInd[newRowSize] = newColIndex; newColVal[newRowSize++] = colVal[jcol]; } } } HYPRE_IJMatrixSetValues(A21mat_, 1, &newRowSize, (const int *) &rowCount, (const int *) newColInd, (const double *) newColVal); HYPRE_ParCSRMatrixRestoreRow(A_csr,irow,&rowSize,&colInd,&colVal); rowCount++; } delete [] newColInd; delete [] newColVal; free( procNRows ); //------------------------------------------------------------------ // finally assemble the matrix and sanitize //------------------------------------------------------------------ HYPRE_IJMatrixAssemble(A21mat_); HYPRE_IJMatrixGetObject(A21mat_, (void **) &A21_csr); hypre_MatvecCommPkgCreate((hypre_ParCSRMatrix *) A21_csr); if ( outputLevel_ >= 5 ) { sprintf(fname, "A21.%d", mypid); FILE *fp = fopen(fname, "w"); if ( mypid == 0 ) { printf("====================================================\n"); printf("%4d : Printing A21 matrix... \n", mypid); fflush(stdout); } for (irow = A21StartRow;irow < A21StartRow+2*nConstraints;irow++) { HYPRE_ParCSRMatrixGetRow(A21_csr,irow,&rowSize,&colInd,&colVal); for ( jcol = 0; jcol < rowSize; jcol++ ) if ( colVal[jcol] != 0.0 ) fprintf(fp, "%6d %6d %25.16e \n",irow+1,colInd[jcol]+1, colVal[jcol]); HYPRE_ParCSRMatrixRestoreRow(A21_csr, irow, &rowSize, &colInd, &colVal); } fclose(fp); if ( mypid == 0 ) printf("====================================================\n"); } return 0; } //**************************************************************************** // build invA22 matrix // - given A22 = | B C |, compute | 0 C^{-T} | // | C^T 0 | | C^{-1} -C^{-1} B C^{-T} | //---------------------------------------------------------------------------- int HYPRE_SlideReduction::buildInvA22Mat() { int mypid, nprocs, *procNRows, endRow; int is, globalNConstr, nConstraints, irow, jcol, rowSize; int *colInd, newEndRow, rowIndex, colIndex, searchIndex; int ig, ir, ic, ierr, index, offset, newRowSize, *newColInd; int maxBlkSize=HYPRE_SLIDEMAX, procIndex; int nGroups, *groupIDs, **groupRowNums, *groupSizes, *iTempList; int rowCount, *colInd2, rowSize2; double *colVal, *colVal2, **Imat, **Imat2, *newColVal; char fname[40]; HYPRE_ParCSRMatrix A_csr, invA22_csr; //------------------------------------------------------------------ // get matrix information //------------------------------------------------------------------ MPI_Comm_rank(mpiComm_, &mypid); MPI_Comm_size(mpiComm_, &nprocs); HYPRE_IJMatrixGetObject(Amat_, (void **) &A_csr); HYPRE_ParCSRMatrixGetRowPartitioning( A_csr, &procNRows ); endRow = procNRows[mypid+1] - 1; globalNConstr = procNConstr_[nprocs]; nConstraints = procNConstr_[mypid+1] - procNConstr_[mypid]; newEndRow = endRow - nConstraints; //------------------------------------------------------------------ // construct the group information //------------------------------------------------------------------ nGroups = 0; if ( nConstraints > 0 ) { iTempList = new int[nConstraints]; for ( irow = 0; irow < nConstraints; irow++ ) iTempList[irow] = constrBlkInfo_[irow]; hypre_qsort0( iTempList, 0, nConstraints-1 ); nGroups = 1; for ( irow = 1; irow < nConstraints; irow++ ) if ( iTempList[irow] != iTempList[irow-1] ) nGroups++; groupIDs = new int[nGroups]; groupSizes = new int[nGroups]; groupIDs[0] = iTempList[0]; groupSizes[0] = 1; nGroups = 1; for ( irow = 1; irow < nConstraints; irow++ ) { if ( iTempList[irow] != iTempList[irow-1] ) { groupSizes[nGroups] = 1; groupIDs[nGroups++] = iTempList[irow]; } else groupSizes[nGroups-1]++; } groupRowNums = new int*[nGroups]; for ( ig = 0; ig < nGroups; ig++ ) { if ( groupSizes[ig] > maxBlkSize ) { printf("%4d : buildInvA22 ERROR - block Size %d >= %d\n", mypid, groupSizes[ig], maxBlkSize); printf("%4d : buildInvA22 ERROR - group ID = %d\n", mypid, groupIDs[ig]); exit(1); } } for ( ig = 0; ig < nGroups; ig++ ) { groupRowNums[ig] = new int[groupSizes[ig]]; groupSizes[ig] = 0; } for ( irow = 0; irow < nConstraints; irow++ ) { index = constrBlkInfo_[irow]; searchIndex = hypre_BinarySearch(groupIDs, index, nGroups); groupRowNums[searchIndex][groupSizes[searchIndex]++] = irow; } delete [] iTempList; } //------------------------------------------------------------------ // first extract the (2,1) block of A22 // ( constraints-to-local slaves ) //------------------------------------------------------------------ int *CT_JA = NULL, CTRowSize, CTOffset; double *CT_AA = NULL; if ( nConstraints > 0 ) { CT_JA = new int[nConstraints*maxBlkSize]; CT_AA = new double[nConstraints*maxBlkSize]; for ( irow = 0; irow < nConstraints*maxBlkSize; irow++ ) CT_JA[irow] = -1; } #if 0 FILE *fp = fopen("CT.m","w"); #endif for ( irow = 0; irow < nConstraints; irow++ ) { rowIndex = newEndRow + 1 + irow; HYPRE_ParCSRMatrixGetRow(A_csr,rowIndex,&rowSize,&colInd,&colVal); CTOffset = maxBlkSize * irow; CTRowSize = 0; for ( jcol = 0; jcol < rowSize; jcol++ ) { colIndex = colInd[jcol]; searchIndex = hypre_BinarySearch(slaveEqnList_,colIndex,nConstraints); if ( searchIndex >= 0 ) { CT_JA[CTOffset+CTRowSize] = slaveEqnListAux_[searchIndex]; CT_AA[CTOffset+CTRowSize] = colVal[jcol]; CTRowSize++; #if 0 fprintf(fp,"%d %d %25.16e\n",irow+1,CT_JA[CTOffset+CTRowSize-1]+1,colVal[jcol]); #endif } } HYPRE_ParCSRMatrixRestoreRow(A_csr,rowIndex,&rowSize,&colInd,&colVal); } #if 0 fclose(fp); #endif //------------------------------------------------------------------ // invert the (2,1) block of A22 //------------------------------------------------------------------ #if 0 FILE *fp2 = fopen("invCT.m","w"); #endif Imat = hypre_TAlloc(double*, maxBlkSize , HYPRE_MEMORY_HOST); for ( ir = 0; ir < maxBlkSize; ir++ ) Imat[ir] = hypre_TAlloc(double, maxBlkSize , HYPRE_MEMORY_HOST); for ( ig = 0; ig < nGroups; ig++ ) { for ( ir = 0; ir < groupSizes[ig]; ir++ ) for ( ic = 0; ic < groupSizes[ig]; ic++ ) Imat[ir][ic] = 0.0; for ( ir = 0; ir < groupSizes[ig]; ir++ ) { rowIndex = groupRowNums[ig][ir]; offset = rowIndex * maxBlkSize; for ( ic = 0; ic < maxBlkSize; ic++ ) { colIndex = CT_JA[offset+ic]; if ( colIndex != -1 ) { for ( is = 0; is < groupSizes[ig]; is++ ) if ( colIndex == groupRowNums[ig][is] ) break; Imat[ir][is] = CT_AA[offset+ic]; } } } ierr = HYPRE_LSI_MatrixInverse((double**) Imat, groupSizes[ig], &Imat2); if ( ierr ) { printf("Failed Block %d has indices (%d) : ", ig, groupSizes[ig]); for ( ir = 0; ir < groupSizes[ig]; ir++ ) printf(" %d ", groupRowNums[ig][ir]); printf("\n"); for ( ir = 0; ir < groupSizes[ig]; ir++ ) { for ( ic = 0; ic < groupSizes[ig]; ic++ ) printf(" %e ", Imat[ir][ic]); printf("\n"); } printf("\n"); for ( ir = 0; ir < groupSizes[ig]; ir++ ) { for ( ic = 0; ic < groupSizes[ig]; ic++ ) printf(" %e ", Imat2[ir][ic]); printf("\n"); } printf("\n"); for ( ir = 0; ir < groupSizes[ig]; ir++ ) { rowIndex = groupRowNums[ig][ir]; offset = rowIndex * maxBlkSize; for ( ic = 0; ic < maxBlkSize; ic++ ) { colIndex = CT_JA[offset+ic]; if ( colIndex != -1 ) { printf(" rowIndex,colIndex,val = %d %d %e\n",rowIndex, colIndex,CT_AA[offset+ic]); } } } } hypre_assert( !ierr ); for ( ir = 0; ir < groupSizes[ig]; ir++ ) { rowIndex = groupRowNums[ig][ir]; offset = rowIndex * maxBlkSize; for (ic = 0; ic < maxBlkSize; ic++) CT_JA[offset+ic] = -1; for ( ic = 0; ic < groupSizes[ig]; ic++ ) { if ( Imat2[ir][ic] != 0.0 ) { CT_JA[offset+ic] = groupRowNums[ig][ic]; CT_AA[offset+ic] = Imat2[ir][ic]; #if 0 fprintf(fp2,"%d %d %25.16e\n",rowIndex+1,CT_JA[offset+ic]+1,CT_AA[offset+ic]); #endif } } free( Imat2[ir] ); } free( Imat2 ); } #if 0 fclose(fp2); #endif for ( ir = 0; ir < maxBlkSize; ir++ ) free( Imat[ir] ); free( Imat ); //------------------------------------------------------------------ // form ParCSRMatrix of the (2,1) block of A22 //------------------------------------------------------------------ int *hypreCTMatSize, maxRowSize; hypre_ParCSRMatrix *hypreCT; HYPRE_IJMatrix IJCT; ierr = HYPRE_IJMatrixCreate(mpiComm_, procNConstr_[mypid], procNConstr_[mypid]+nConstraints-1, procNConstr_[mypid], procNConstr_[mypid]+nConstraints-1, &IJCT); ierr += HYPRE_IJMatrixSetObjectType(IJCT, HYPRE_PARCSR); hypre_assert(!ierr); if ( nConstraints > 0 ) hypreCTMatSize = new int[nConstraints]; else hypreCTMatSize = NULL; maxRowSize = 0; for ( irow = 0; irow < nConstraints; irow++ ) { newRowSize = 0; offset = irow * maxBlkSize; for ( ic = 0; ic < maxBlkSize; ic++ ) if ( CT_JA[offset+ic] != -1 ) newRowSize++; hypreCTMatSize[irow] = newRowSize; maxRowSize = (newRowSize > maxRowSize) ? newRowSize : maxRowSize; } ierr = HYPRE_IJMatrixSetRowSizes(IJCT, hypreCTMatSize); ierr = HYPRE_IJMatrixInitialize(IJCT); hypre_assert(!ierr); if ( nConstraints > 0 ) delete [] hypreCTMatSize; newColInd = new int[maxRowSize+1]; newColVal = new double[maxRowSize+1]; for ( irow = 0; irow < nConstraints; irow++ ) { rowIndex = procNConstr_[mypid] + irow; offset = irow * maxBlkSize; newRowSize = 0; for ( ic = 0; ic < maxBlkSize; ic++ ) { if ( CT_JA[offset+ic] != -1 ) { newColInd[newRowSize] = CT_JA[offset+ic] + procNConstr_[mypid]; newColVal[newRowSize++] = CT_AA[offset+ic]; } } ierr = HYPRE_IJMatrixSetValues(IJCT, 1, &newRowSize, (const int *) &rowIndex, (const int *) newColInd, (const double *) newColVal); hypre_assert( !ierr ); } delete [] newColInd; delete [] newColVal; if ( nConstraints > 0 ) { delete [] CT_JA; delete [] CT_AA; } HYPRE_IJMatrixAssemble(IJCT); HYPRE_IJMatrixGetObject(IJCT, (void **) &hypreCT); hypre_MatvecCommPkgCreate((hypre_ParCSRMatrix *) hypreCT); //------------------------------------------------------------------ // next extract the (1,2) block of A22 // ( local slaves-to-constraints ) //------------------------------------------------------------------ int *C_JA = NULL, CRowSize, COffset; double *C_AA = NULL; if ( nConstraints > 0 ) { C_JA = new int[nConstraints*maxBlkSize]; C_AA = new double[nConstraints*maxBlkSize]; for ( irow = 0; irow < nConstraints*maxBlkSize; irow++ ) C_JA[irow] = -1; } for ( irow = 0; irow < nConstraints; irow++ ) { for ( is = 0; is < nConstraints; is++ ) { if ( slaveEqnListAux_[is] == irow ) { rowIndex = slaveEqnList_[is]; break; } } HYPRE_ParCSRMatrixGetRow(A_csr,rowIndex,&rowSize,&colInd,&colVal); CRowSize = 0; COffset = maxBlkSize * irow; for ( jcol = 0; jcol < rowSize; jcol++ ) { colIndex = colInd[jcol]; if ( colIndex > newEndRow && colIndex <= endRow ) { C_JA[COffset+CRowSize] = colIndex - newEndRow - 1; C_AA[COffset+CRowSize] = colVal[jcol]; CRowSize++; } } HYPRE_ParCSRMatrixRestoreRow(A_csr,rowIndex,&rowSize,&colInd,&colVal); } //------------------------------------------------------------------ // invert the (2,1) block of A22 //------------------------------------------------------------------ Imat = hypre_TAlloc(double*, maxBlkSize , HYPRE_MEMORY_HOST); for ( ir = 0; ir < maxBlkSize; ir++ ) Imat[ir] = hypre_TAlloc(double, maxBlkSize , HYPRE_MEMORY_HOST); for ( ig = 0; ig < nGroups; ig++ ) { for ( ir = 0; ir < groupSizes[ig]; ir++ ) for ( ic = 0; ic < groupSizes[ig]; ic++ ) Imat[ir][ic] = 0.0; for ( ir = 0; ir < groupSizes[ig]; ir++ ) { rowIndex = groupRowNums[ig][ir]; offset = rowIndex * maxBlkSize; for ( ic = 0; ic < maxBlkSize; ic++ ) { colIndex = C_JA[offset+ic]; if ( colIndex != -1 ) { for ( is = 0; is < groupSizes[ig]; is++ ) if ( colIndex == groupRowNums[ig][is] ) break; Imat[ir][is] = C_AA[offset+ic]; } } } ierr = HYPRE_LSI_MatrixInverse((double**) Imat, groupSizes[ig], &Imat2); hypre_assert( !ierr ); for ( ir = 0; ir < groupSizes[ig]; ir++ ) { rowIndex = groupRowNums[ig][ir]; offset = rowIndex * maxBlkSize; for (ic = 0; ic < maxBlkSize; ic++) C_JA[offset+ic] = -1; for ( ic = 0; ic < groupSizes[ig]; ic++ ) { if ( Imat2[ir][ic] != 0.0 ) { C_JA[offset+ic] = groupRowNums[ig][ic]; C_AA[offset+ic] = Imat2[ir][ic]; } } free( Imat2[ir] ); } free( Imat2 ); } for ( ir = 0; ir < maxBlkSize; ir++ ) free( Imat[ir] ); free( Imat ); //------------------------------------------------------------------ // form ParCSRMatrix of the (1,2) block of A22 //------------------------------------------------------------------ int *hypreCMatSize; hypre_ParCSRMatrix *hypreC; HYPRE_IJMatrix IJC; ierr = HYPRE_IJMatrixCreate(mpiComm_, procNConstr_[mypid], procNConstr_[mypid]+nConstraints-1, procNConstr_[mypid], procNConstr_[mypid]+nConstraints-1, &IJC); ierr += HYPRE_IJMatrixSetObjectType(IJC, HYPRE_PARCSR); hypre_assert(!ierr); if ( nConstraints > 0 ) hypreCMatSize = new int[nConstraints]; else hypreCMatSize = NULL; maxRowSize = 0; for ( irow = 0; irow < nConstraints; irow++ ) { newRowSize = 0; offset = irow * maxBlkSize; for ( ic = 0; ic < maxBlkSize; ic++ ) if ( C_JA[offset+ic] != -1 ) newRowSize++; hypreCMatSize[irow] = newRowSize; maxRowSize = (newRowSize > maxRowSize) ? newRowSize : maxRowSize; } ierr = HYPRE_IJMatrixSetRowSizes(IJC, hypreCMatSize); ierr = HYPRE_IJMatrixInitialize(IJC); hypre_assert(!ierr); if ( nConstraints > 0 ) delete [] hypreCMatSize; newColInd = new int[maxRowSize+1]; newColVal = new double[maxRowSize+1]; for ( irow = 0; irow < nConstraints; irow++ ) { rowIndex = procNConstr_[mypid] + irow; offset = irow * maxBlkSize; newRowSize = 0; for ( ic = 0; ic < maxBlkSize; ic++ ) { if ( C_JA[offset+ic] != -1 ) { newColInd[newRowSize] = C_JA[offset+ic] + procNConstr_[mypid]; newColVal[newRowSize++] = C_AA[offset+ic]; } } ierr = HYPRE_IJMatrixSetValues(IJC, 1, &newRowSize, (const int *) &rowIndex, (const int *) newColInd, (const double *) newColVal); hypre_assert( !ierr ); } delete [] newColInd; delete [] newColVal; if ( nConstraints > 0 ) { delete [] C_JA; delete [] C_AA; } HYPRE_IJMatrixAssemble(IJC); HYPRE_IJMatrixGetObject(IJC, (void **) &hypreC); hypre_MatvecCommPkgCreate((hypre_ParCSRMatrix *) hypreC); if ( nConstraints > 0 ) { delete [] groupIDs; delete [] groupSizes; for ( ig = 0; ig < nGroups; ig++ ) delete [] groupRowNums[ig]; delete [] groupRowNums; } //------------------------------------------------------------------ // form ParCSRMatrix of the (2,2) block of the invA22 matrix //------------------------------------------------------------------ int *hypreBMatSize=NULL; hypre_ParCSRMatrix *hypreB; HYPRE_IJMatrix IJB; ierr = HYPRE_IJMatrixCreate(mpiComm_, procNConstr_[mypid], procNConstr_[mypid]+nConstraints-1, procNConstr_[mypid], procNConstr_[mypid]+nConstraints-1, &IJB); ierr = HYPRE_IJMatrixSetObjectType(IJB, HYPRE_PARCSR); hypre_assert(!ierr); if ( nConstraints > 0 ) hypreBMatSize = new int[nConstraints]; maxRowSize = 0; for ( irow = 0; irow < nConstraints; irow++ ) { for ( is = 0; is < nConstraints; is++ ) { if ( slaveEqnListAux_[is] == irow ) { rowIndex = slaveEqnList_[is]; break; } } HYPRE_ParCSRMatrixGetRow(A_csr,rowIndex,&rowSize,&colInd,&colVal); newRowSize = 0; for ( jcol = 0; jcol < rowSize; jcol++ ) { colIndex = colInd[jcol]; searchIndex = hypre_BinarySearch(gSlaveEqnList_, colIndex, globalNConstr); if ( searchIndex >= 0 ) newRowSize++; } HYPRE_ParCSRMatrixRestoreRow(A_csr,rowIndex,&rowSize,&colInd,&colVal); hypreBMatSize[irow] = newRowSize; maxRowSize = (newRowSize > maxRowSize) ? newRowSize : maxRowSize; } ierr = HYPRE_IJMatrixSetRowSizes(IJB, hypreBMatSize); ierr = HYPRE_IJMatrixInitialize(IJB); hypre_assert(!ierr); if ( nConstraints > 0 ) delete [] hypreBMatSize; newColInd = new int[maxRowSize+1]; newColVal = new double[maxRowSize+1]; for ( irow = 0; irow < nConstraints; irow++ ) { for ( is = 0; is < nConstraints; is++ ) { if ( slaveEqnListAux_[is] == irow ) { rowIndex = slaveEqnList_[is]; break; } } HYPRE_ParCSRMatrixGetRow(A_csr,rowIndex,&rowSize,&colInd,&colVal); newRowSize = 0; for ( jcol = 0; jcol < rowSize; jcol++ ) { colIndex = colInd[jcol]; searchIndex = hypre_BinarySearch(gSlaveEqnList_, colIndex, globalNConstr); if ( searchIndex >= 0 ) { newColInd[newRowSize] = gSlaveEqnListAux_[searchIndex]; newColVal[newRowSize++] = - colVal[jcol]; } } HYPRE_ParCSRMatrixRestoreRow(A_csr,rowIndex,&rowSize,&colInd,&colVal); rowIndex = procNConstr_[mypid] + irow; ierr = HYPRE_IJMatrixSetValues(IJB, 1, &newRowSize, (const int *) &rowIndex, (const int *) newColInd, (const double *) newColVal); hypre_assert( !ierr ); } HYPRE_IJMatrixAssemble(IJB); HYPRE_IJMatrixGetObject(IJB, (void **) &hypreB); hypre_MatvecCommPkgCreate((hypre_ParCSRMatrix *) hypreB); delete [] newColInd; delete [] newColVal; //------------------------------------------------------------------ // perform triple matrix product - C^{-1} B C^{-T} //------------------------------------------------------------------ HYPRE_ParCSRMatrix hypreCBC; #if 0 strcpy( fname, "hypreCT" ); HYPRE_ParCSRMatrixPrint((HYPRE_ParCSRMatrix) hypreCT, fname); strcpy( fname, "hypreB" ); HYPRE_ParCSRMatrixPrint((HYPRE_ParCSRMatrix) hypreB, fname); #endif hypre_BoomerAMGBuildCoarseOperator(hypreCT, hypreB, hypreCT, (hypre_ParCSRMatrix **) &hypreCBC); #if 0 for ( irow = 0; irow < nConstraints; irow++ ) { HYPRE_ParCSRMatrixGetRow((HYPRE_ParCSRMatrix) hypreCT,irow,&rowSize, &colInd,&colVal); for (jcol = 0; jcol < rowSize; jcol++ ) printf("CT : %5d %5d %25.16e\n",irow+1,colInd[jcol]+1,colVal[jcol]); HYPRE_ParCSRMatrixRestoreRow((HYPRE_ParCSRMatrix) hypreCT,irow,&rowSize, &colInd,&colVal); } for ( irow = 0; irow < nConstraints; irow++ ) { HYPRE_ParCSRMatrixGetRow((HYPRE_ParCSRMatrix) hypreB,irow,&rowSize, &colInd,&colVal); for (jcol = 0; jcol < rowSize; jcol++ ) printf("B : %5d %5d %25.16e\n",irow+1,colInd[jcol]+1,colVal[jcol]); HYPRE_ParCSRMatrixRestoreRow((HYPRE_ParCSRMatrix) hypreB,irow,&rowSize, &colInd,&colVal); } for ( irow = 0; irow < nConstraints; irow++ ) { HYPRE_ParCSRMatrixGetRow((HYPRE_ParCSRMatrix) hypreCBC,irow,&rowSize, &colInd,&colVal); for (jcol = 0; jcol < rowSize; jcol++ ) printf("CBC : %5d %5d %25.16e\n",irow+1,colInd[jcol]+1,colVal[jcol]); HYPRE_ParCSRMatrixRestoreRow((HYPRE_ParCSRMatrix) hypreCBC,irow,&rowSize, &colInd,&colVal); } #endif HYPRE_IJMatrixDestroy( IJB ); //------------------------------------------------------------------ // calculate the dimension of invA22 //------------------------------------------------------------------ int invA22NRows = 2 * nConstraints; int invA22NCols = invA22NRows; int invA22StartRow = 2 * procNConstr_[mypid]; int invA22StartCol = invA22StartRow; int *invA22MatSize=NULL; //------------------------------------------------------------------ // create a matrix context for A22 //------------------------------------------------------------------ ierr = HYPRE_IJMatrixCreate(mpiComm_, invA22StartRow, invA22StartRow+invA22NRows-1, invA22StartCol, invA22StartCol+invA22NCols-1, &invA22mat_); ierr += HYPRE_IJMatrixSetObjectType(invA22mat_, HYPRE_PARCSR); hypre_assert(!ierr); //------------------------------------------------------------------ // compute the no. of nonzeros in the first nConstraint row of invA22 //------------------------------------------------------------------ maxRowSize = 0; if ( invA22NRows > 0 ) invA22MatSize = new int[invA22NRows]; for ( irow = 0; irow < nConstraints; irow++ ) { rowIndex = procNConstr_[mypid] + irow; ierr = HYPRE_ParCSRMatrixGetRow((HYPRE_ParCSRMatrix) hypreCT,rowIndex, &rowSize,NULL,NULL); hypre_assert( !ierr ); invA22MatSize[irow] = rowSize; HYPRE_ParCSRMatrixRestoreRow((HYPRE_ParCSRMatrix) hypreCT,rowIndex, &rowSize,NULL,NULL); maxRowSize = ( rowSize > maxRowSize ) ? rowSize : maxRowSize; } //------------------------------------------------------------------ // compute the number of nonzeros in the second nConstraints row of // invA22 (consisting of [D and A22 block]) //------------------------------------------------------------------ #if 0 for ( irow = 0; irow < nConstraints; irow++ ) { HYPRE_ParCSRMatrixGetRow((HYPRE_ParCSRMatrix) hypreCBC,irow,&rowSize, &colInd,&colVal); for (jcol = 0; jcol < rowSize; jcol++ ) printf("CBC1 : %5d %5d %25.16e\n",irow+1,colInd[jcol]+1,colVal[jcol]); HYPRE_ParCSRMatrixRestoreRow((HYPRE_ParCSRMatrix) hypreCBC,irow,&rowSize, &colInd,&colVal); } #endif for ( irow = 0; irow < nConstraints; irow++ ) { rowIndex = procNConstr_[mypid] + irow; ierr = HYPRE_ParCSRMatrixGetRow((HYPRE_ParCSRMatrix) hypreC,rowIndex, &rowSize,&colInd,&colVal); hypre_assert( !ierr ); newRowSize = rowSize; HYPRE_ParCSRMatrixRestoreRow((HYPRE_ParCSRMatrix) hypreC,rowIndex, &rowSize,&colInd,&colVal); ierr = HYPRE_ParCSRMatrixGetRow((HYPRE_ParCSRMatrix) hypreCBC,rowIndex, &rowSize,&colInd,&colVal); hypre_assert( !ierr ); newRowSize += rowSize; HYPRE_ParCSRMatrixRestoreRow((HYPRE_ParCSRMatrix) hypreCBC,rowIndex, &rowSize,&colInd,&colVal); invA22MatSize[nConstraints+irow] = newRowSize; maxRowSize = ( newRowSize > maxRowSize ) ? newRowSize : maxRowSize; } //------------------------------------------------------------------ // after fetching the row sizes, set up invA22 with such sizes //------------------------------------------------------------------ #if 0 for ( irow = 0; irow < nConstraints; irow++ ) { HYPRE_ParCSRMatrixGetRow((HYPRE_ParCSRMatrix) hypreCBC,irow,&rowSize, &colInd,&colVal); for (jcol = 0; jcol < rowSize; jcol++ ) printf("CBC2 : %5d %5d %25.16e\n",irow+1,colInd[jcol]+1,colVal[jcol]); HYPRE_ParCSRMatrixRestoreRow((HYPRE_ParCSRMatrix) hypreCBC,irow,&rowSize, &colInd,&colVal); } #endif ierr = HYPRE_IJMatrixSetRowSizes(invA22mat_, invA22MatSize); ierr += HYPRE_IJMatrixInitialize(invA22mat_); hypre_assert(!ierr); if ( invA22NRows > 0 ) delete [] invA22MatSize; //------------------------------------------------------------------ // next load the first nConstraints row to invA22 extracted from A // (that is, the D block) //------------------------------------------------------------------ newColInd = new int[maxRowSize+1]; newColVal = new double[maxRowSize+1]; for ( irow = 0; irow < nConstraints; irow++ ) { rowIndex = procNConstr_[mypid] + irow; ierr = HYPRE_ParCSRMatrixGetRow((HYPRE_ParCSRMatrix) hypreCT,rowIndex, &rowSize,&colInd,&colVal); hypre_assert( !ierr ); newRowSize = 0; for ( jcol = 0; jcol < rowSize; jcol++ ) { newColInd[newRowSize] = colInd[jcol] + procNConstr_[mypid] + nConstraints; newColVal[newRowSize++] = colVal[jcol]; } HYPRE_ParCSRMatrixRestoreRow((HYPRE_ParCSRMatrix) hypreCT,rowIndex, &rowSize,&colInd,&colVal); rowCount = invA22StartRow + irow; ierr = HYPRE_IJMatrixSetValues(invA22mat_, 1, &rowSize, (const int *) &rowCount, (const int *) newColInd, (const double *) newColVal); hypre_assert(!ierr); } //------------------------------------------------------------------ // next load the second nConstraints rows to A22 extracted from A //------------------------------------------------------------------ for ( irow = 0; irow < nConstraints; irow++ ) { rowIndex = procNConstr_[mypid] + irow; ierr = HYPRE_ParCSRMatrixGetRow((HYPRE_ParCSRMatrix) hypreC,rowIndex, &rowSize,&colInd,&colVal); hypre_assert( !ierr ); newRowSize = 0; for ( jcol = 0; jcol < rowSize; jcol++ ) { newColInd[newRowSize] = colInd[jcol] + procNConstr_[mypid]; newColVal[newRowSize++] = colVal[jcol]; } HYPRE_ParCSRMatrixRestoreRow((HYPRE_ParCSRMatrix) hypreC,rowIndex, &rowSize,&colInd,&colVal); ierr = HYPRE_ParCSRMatrixGetRow((HYPRE_ParCSRMatrix) hypreCBC,rowIndex, &rowSize2,&colInd2,&colVal2); hypre_assert( !ierr ); for ( jcol = 0; jcol < rowSize2; jcol++ ) { colIndex = colInd2[jcol]; for ( procIndex = 0; procIndex <= nprocs; procIndex++ ) if ( procNConstr_[procIndex] > colIndex ) break; newColInd[newRowSize] = colIndex + procNConstr_[procIndex]; newColVal[newRowSize++] = colVal2[jcol]; } HYPRE_ParCSRMatrixRestoreRow((HYPRE_ParCSRMatrix) hypreCBC,rowIndex, &rowSize2,&colInd2,&colVal2); rowCount = invA22StartRow + nConstraints + irow; ierr = HYPRE_IJMatrixSetValues(invA22mat_, 1, &newRowSize, (const int *) &rowCount, (const int *) newColInd, (const double *) newColVal); hypre_assert(!ierr); } delete [] newColInd; delete [] newColVal; free( procNRows ); HYPRE_IJMatrixDestroy( IJC ); HYPRE_IJMatrixDestroy( IJCT ); HYPRE_ParCSRMatrixDestroy( (HYPRE_ParCSRMatrix) hypreCBC ); //------------------------------------------------------------------ // finally assemble the matrix and sanitize //------------------------------------------------------------------ HYPRE_IJMatrixAssemble(invA22mat_); HYPRE_IJMatrixGetObject(invA22mat_, (void **) &invA22_csr); hypre_MatvecCommPkgCreate((hypre_ParCSRMatrix *) invA22_csr); if ( outputLevel_ >= 5 ) { sprintf( fname, "invA.%d", mypid ); FILE *fp = fopen( fname, "w"); if ( mypid == 0 ) { printf("====================================================\n"); printf("%4d : Printing invA22 matrix... \n", mypid); fflush(stdout); } for (irow=invA22StartRow; irow < invA22StartRow+invA22NRows;irow++) { HYPRE_ParCSRMatrixGetRow(invA22_csr,irow,&rowSize,&colInd,&colVal); for ( jcol = 0; jcol < rowSize; jcol++ ) if ( colVal[jcol] != 0.0 ) fprintf(fp,"%6d %6d %25.16e \n",irow+1,colInd[jcol]+1, colVal[jcol]); HYPRE_ParCSRMatrixRestoreRow(invA22_csr,irow,&rowSize,&colInd, &colVal); } fclose(fp); if ( mypid == 0 ) printf("====================================================\n"); } return 0; } //*************************************************************************** // scale matrix //--------------------------------------------------------------------------- int HYPRE_SlideReduction::scaleMatrixVector() { int *partition, startRow, localNRows, index, offset; int irow, jcol, iP, rowSize, *colInd, *rowLengs; int mypid, nprocs; int nSends, *sendStarts, *sendMap, *offdMap, ierr; int nRecvs, *recvStarts, pstart, pend, maxRowLeng; int *ADiagI, *ADiagJ, *AOffdI, *AOffdJ, rowInd; double *ADiagA, *AOffdA, *bData, *b2Data; double *scaleVec, *extScaleVec, *colVal, *sBuffer; HYPRE_IJMatrix newA; HYPRE_IJVector newB; hypre_ParCSRMatrix *A_csr; hypre_CSRMatrix *ADiag, *AOffd; hypre_ParVector *b_csr, *b2_csr; hypre_ParCSRCommPkg *commPkg; hypre_ParCSRCommHandle *commHandle; //----------------------------------------------------------------------- // fetch matrix and parameters //----------------------------------------------------------------------- MPI_Comm_rank( mpiComm_, &mypid ); MPI_Comm_size( mpiComm_, &nprocs ); HYPRE_IJMatrixGetObject(reducedAmat_, (void **) &A_csr); hypre_MatvecCommPkgCreate((hypre_ParCSRMatrix *) A_csr); HYPRE_ParCSRMatrixGetRowPartitioning((HYPRE_ParCSRMatrix) A_csr,&partition); startRow = partition[mypid]; localNRows = partition[mypid+1] - startRow; free( partition ); ADiag = hypre_ParCSRMatrixDiag(A_csr); ADiagI = hypre_CSRMatrixI(ADiag); ADiagJ = hypre_CSRMatrixJ(ADiag); ADiagA = hypre_CSRMatrixData(ADiag); AOffd = hypre_ParCSRMatrixOffd(A_csr); AOffdI = hypre_CSRMatrixI(AOffd); AOffdJ = hypre_CSRMatrixJ(AOffd); AOffdA = hypre_CSRMatrixData(AOffd); HYPRE_IJVectorGetObject(reducedBvec_, (void **) &b_csr); bData = hypre_VectorData(hypre_ParVectorLocalVector(b_csr)); offdMap = hypre_ParCSRMatrixColMapOffd(A_csr); commPkg = hypre_ParCSRMatrixCommPkg((hypre_ParCSRMatrix *) A_csr); nSends = hypre_ParCSRCommPkgNumSends(commPkg); nRecvs = hypre_ParCSRCommPkgNumRecvs(commPkg); recvStarts = hypre_ParCSRCommPkgRecvVecStarts(commPkg); sendStarts = hypre_ParCSRCommPkgSendMapStarts(commPkg); sendMap = hypre_ParCSRCommPkgSendMapElmts(commPkg); //----------------------------------------------------------------------- // fetch diagonal of A //----------------------------------------------------------------------- scaleVec = new double[localNRows]; rowLengs = new int[localNRows]; extScaleVec = NULL; if ( nRecvs > 0 ) extScaleVec = new double[recvStarts[nRecvs]]; maxRowLeng = 0; for ( irow = 0; irow < localNRows; irow++ ) { scaleVec[irow] = 0.0; rowLengs[irow] = ADiagI[irow+1] - ADiagI[irow] + AOffdI[irow+1] - AOffdI[irow]; if ( rowLengs[irow] > maxRowLeng ) maxRowLeng = rowLengs[irow]; for ( jcol = ADiagI[irow]; jcol < ADiagI[irow+1]; jcol++ ) if ( ADiagJ[jcol] == irow ) scaleVec[irow] = ADiagA[jcol]; } for ( irow = 0; irow < localNRows; irow++ ) { if ( habs( scaleVec[irow] ) == 0.0 ) { printf("%d : scaleMatrixVector - diag %d = %e <= 0 \n",mypid,irow, scaleVec[irow]); exit(1); } scaleVec[irow] = 1.0/sqrt(scaleVec[irow]); } //----------------------------------------------------------------------- // exchange diagonal of A //----------------------------------------------------------------------- if ( nSends > 0 ) { sBuffer = new double[sendStarts[nSends]]; offset = 0; for ( iP = 0; iP < nSends; iP++ ) { pstart = sendStarts[iP]; pend = sendStarts[iP+1]; for ( jcol = pstart; jcol < pend; jcol++ ) { index = sendMap[jcol]; sBuffer[offset++] = scaleVec[index]; } } } else sBuffer = NULL; commHandle = hypre_ParCSRCommHandleCreate(1,commPkg,sBuffer,extScaleVec); hypre_ParCSRCommHandleDestroy(commHandle); if ( nSends > 0 ) delete [] sBuffer; //----------------------------------------------------------------------- // construct new matrix //----------------------------------------------------------------------- HYPRE_IJMatrixCreate(mpiComm_, startRow, startRow+localNRows-1, startRow, startRow+localNRows-1, &newA); HYPRE_IJMatrixSetObjectType(newA, HYPRE_PARCSR); HYPRE_IJMatrixSetRowSizes(newA, rowLengs); HYPRE_IJMatrixInitialize(newA); delete [] rowLengs; colInd = new int[maxRowLeng]; colVal = new double[maxRowLeng]; for ( irow = 0; irow < localNRows; irow++ ) { rowSize = 0; for ( jcol = ADiagI[irow]; jcol < ADiagI[irow+1]; jcol++ ) { index = ADiagJ[jcol]; colInd[rowSize] = index + startRow; colVal[rowSize++] = scaleVec[irow]*scaleVec[index]*ADiagA[jcol]; } for ( jcol = AOffdI[irow]; jcol < AOffdI[irow+1]; jcol++ ) { index = AOffdJ[jcol]; colInd[rowSize] = offdMap[index]; colVal[rowSize++] = scaleVec[irow]*extScaleVec[index]*AOffdA[jcol]; } rowInd = irow + startRow; HYPRE_IJMatrixSetValues(newA, 1, &rowSize, (const int *) &rowInd, (const int *) colInd, (const double *) colVal); } HYPRE_IJMatrixAssemble(newA); delete [] colInd; delete [] colVal; delete [] extScaleVec; //----------------------------------------------------------------------- // construct new vector //----------------------------------------------------------------------- ierr = HYPRE_IJVectorCreate(mpiComm_,startRow,startRow+localNRows-1,&newB); ierr += HYPRE_IJVectorSetObjectType(newB, HYPRE_PARCSR); ierr += HYPRE_IJVectorInitialize(newB); ierr += HYPRE_IJVectorAssemble(newB); ierr += HYPRE_IJVectorGetObject(newB, (void **) &b2_csr); b2Data = hypre_VectorData(hypre_ParVectorLocalVector(b2_csr)); hypre_assert( !ierr ); for ( irow = 0; irow < localNRows; irow++ ) b2Data[irow] = bData[irow] * scaleVec[irow]; ADiagISqrts_ = scaleVec; reducedAmat_ = newA; reducedBvec_ = newB; return 0; } //**************************************************************************** // estimate conditioning of a small block //---------------------------------------------------------------------------- double HYPRE_SlideReduction::matrixCondEst(int globalRowID, int globalColID, int *blkInfo,int blkCnt) { int mypid, nprocs, *procNRows, endRow, nConstraints; int localBlkCnt, *localBlkInfo, irow, jcol, matDim, searchIndex; int *rowIndices, rowSize, *colInd, rowIndex, index2, ierr; int *localSlaveEqns, *localSlaveAuxs; double *colVal, **matrix, **matrix2, retVal, value; HYPRE_ParCSRMatrix A_csr; //------------------------------------------------------------------ // get matrix information //------------------------------------------------------------------ MPI_Comm_rank(mpiComm_, &mypid); MPI_Comm_size(mpiComm_, &nprocs); HYPRE_IJMatrixGetObject(Amat_, (void **) &A_csr); HYPRE_ParCSRMatrixGetRowPartitioning( A_csr, &procNRows ); endRow = procNRows[mypid+1] - 1; nConstraints = procNConstr_[mypid+1] - procNConstr_[mypid]; free( procNRows ); //------------------------------------------------------------------ // collect all row indices //------------------------------------------------------------------ localBlkCnt = blkCnt; localBlkInfo = new int[blkCnt]; for (irow = 0; irow < blkCnt; irow++) localBlkInfo[irow] = blkInfo[irow]; hypre_qsort0(localBlkInfo, 0, localBlkCnt-1); matDim = 1; for ( irow = 0; irow < nConstraints; irow++ ) { searchIndex = hypre_BinarySearch(localBlkInfo, constrBlkInfo_[irow], localBlkCnt); if ( searchIndex >= 0 ) matDim++; } rowIndices = new int[matDim]; matDim = 0; rowIndices[matDim++] = globalRowID; for ( irow = 0; irow < nConstraints; irow++ ) { searchIndex = hypre_BinarySearch(localBlkInfo, constrBlkInfo_[irow], localBlkCnt); if ( searchIndex >= 0 ) rowIndices[matDim++] = endRow - nConstraints + irow + 1; } hypre_qsort0(rowIndices, 0, matDim-1); matrix = hypre_TAlloc(double*, matDim , HYPRE_MEMORY_HOST); localSlaveEqns = new int[nConstraints]; localSlaveAuxs = new int[nConstraints]; for ( irow = 0; irow < nConstraints; irow++ ) localSlaveEqns[irow] = slaveEqnList_[irow]; localSlaveEqns[globalRowID-(endRow+1-nConstraints)] = globalColID; for ( irow = 0; irow < nConstraints; irow++ ) localSlaveAuxs[irow] = irow; HYPRE_LSI_qsort1a(localSlaveEqns, localSlaveAuxs, 0, nConstraints-1); for ( irow = 0; irow < matDim; irow++ ) { matrix[irow] = hypre_TAlloc(double, matDim , HYPRE_MEMORY_HOST); for ( jcol = 0; jcol < matDim; jcol++ ) matrix[irow][jcol] = 0.0; } for ( irow = 0; irow < matDim; irow++ ) { rowIndex = rowIndices[irow]; HYPRE_ParCSRMatrixGetRow(A_csr,rowIndex,&rowSize,&colInd,&colVal); for ( jcol = 0; jcol < rowSize; jcol++ ) { searchIndex = hypre_BinarySearch(localSlaveEqns,colInd[jcol], nConstraints); if ( searchIndex >= 0 ) { index2 = localSlaveAuxs[searchIndex] + endRow - nConstraints + 1; searchIndex = hypre_BinarySearch(rowIndices,index2,matDim); if ( searchIndex >= 0 ) matrix[irow][searchIndex] = colVal[jcol]; } } HYPRE_ParCSRMatrixRestoreRow(A_csr,rowIndex,&rowSize,&colInd,&colVal); } #if 0 if ( matDim <= 4 ) for ( irow = 0; irow < matDim; irow++ ) { for ( jcol = 0; jcol < matDim; jcol++ ) printf(" %e ", matrix[irow][jcol]); printf("\n"); } #endif ierr = HYPRE_LSI_MatrixInverse((double**) matrix,matDim,&matrix2); if ( ierr ) retVal = 1.0e-10; else { retVal = 0.0; for ( irow = 0; irow < matDim; irow++ ) { for ( jcol = 0; jcol < matDim; jcol++ ) { value = habs(matrix2[irow][jcol]); retVal = ( value > retVal ) ? value : retVal; } } retVal = 1.0 / retVal; for ( irow = 0; irow < matDim; irow++ ) free(matrix2[irow]); free( matrix2 ); } for ( irow = 0; irow < matDim; irow++ ) free(matrix[irow]); free( matrix ); delete [] localBlkInfo; delete [] rowIndices; delete [] localSlaveEqns; delete [] localSlaveAuxs; return retVal; } //*************************************************************************** //*************************************************************************** // Obsolete, but keep it for now //*************************************************************************** // search for a slave equation list (block size = 2) //--------------------------------------------------------------------------- int HYPRE_SlideReduction::findSlaveEqns2(int **couplings) { int mypid, nprocs, *procNRows, startRow, endRow; int nConstraints, irow, jcol, rowSize, ncnt, *colInd; int nCandidates, *candidateList; int *constrListAux, colIndex, searchIndex, newEndRow; int *constrListAux2; int constrIndex, uBound, lBound, nSum, nPairs, index; double *colVal, searchValue; HYPRE_ParCSRMatrix A_csr; //------------------------------------------------------------------ // get matrix information //------------------------------------------------------------------ MPI_Comm_rank(mpiComm_, &mypid); MPI_Comm_size(mpiComm_, &nprocs); HYPRE_IJMatrixGetObject(Amat_, (void **) &A_csr); HYPRE_ParCSRMatrixGetRowPartitioning( A_csr, &procNRows ); startRow = procNRows[mypid]; endRow = procNRows[mypid+1] - 1; nConstraints = procNConstr_[mypid+1] - procNConstr_[mypid]; newEndRow = endRow - nConstraints; nPairs = 0; for ( irow = 0; irow < nConstraints; irow++ ) if ( slaveEqnList_[irow] == -1 ) nPairs++; (*couplings) = new int[nPairs*2+1]; (*couplings)[0] = nPairs; //------------------------------------------------------------------ // compose candidate slave list (slaves in candidateList, corresponding // constraint equation in constrListAux and constrListAux2) //------------------------------------------------------------------ nCandidates = 0; candidateList = NULL; constrListAux = NULL; constrListAux2 = NULL; if ( nConstraints > 0 ) { candidateList = new int[endRow-nConstraints-startRow+1]; constrListAux = new int[endRow-nConstraints-startRow+1]; constrListAux2 = new int[endRow-nConstraints-startRow+1]; //--------------------------------------------------------------- // candidates are those with 2 links to the constraint list //--------------------------------------------------------------- uBound = procNRows[mypid+1]; lBound = uBound - nConstraints; for ( irow = startRow; irow <= endRow-nConstraints; irow++ ) { HYPRE_ParCSRMatrixGetRow(A_csr,irow,&rowSize,&colInd,&colVal); ncnt = 0; constrListAux[nCandidates] = -1; constrListAux2[nCandidates] = -1; for ( jcol = 0; jcol < rowSize; jcol++ ) { colIndex = colInd[jcol]; if ( colIndex >= lBound && colIndex < uBound ) { ncnt++; if ( ncnt == 1 && constrListAux[nCandidates] == -1 ) constrListAux[nCandidates] = colIndex; else if ( ncnt == 2 && constrListAux2[nCandidates] == -1 ) constrListAux2[nCandidates] = colIndex; } if ( ncnt > 2 ) break; } HYPRE_ParCSRMatrixRestoreRow(A_csr,irow,&rowSize,&colInd,&colVal); if ( ncnt == 2 ) { if ( constrListAux[nCandidates] > newEndRow && constrListAux[nCandidates] <= endRow && constrListAux2[nCandidates] > newEndRow && constrListAux2[nCandidates] <= endRow ) { candidateList[nCandidates++] = irow; if ( ( outputLevel_ & HYPRE_BITMASK2 ) >= 1 ) printf("%4d : findSlaveEqns2 - candidate %d = %d\n", mypid, nCandidates-1, irow); } } } if ( ( outputLevel_ & HYPRE_BITMASK2 ) >= 1 ) printf("%4d : findSlaveEqns2 - nCandidates, nConstr = %d %d\n", mypid, nCandidates, nConstraints); } //--------------------------------------------------------------------- // search the constraint equations for the selected slave equations // (search for candidates column index with maximum magnitude) // ==> slaveEqnList_ //--------------------------------------------------------------------- nPairs = 0; searchIndex = 0; for ( irow = endRow-nConstraints+1; irow <= endRow; irow++ ) { if ( slaveEqnList_[irow-endRow+nConstraints-1] == -1 ) { HYPRE_ParCSRMatrixGetRow(A_csr,irow,&rowSize,&colInd,&colVal); searchIndex = -1; searchValue = -1.0E10; for ( jcol = 0; jcol < rowSize; jcol++ ) { if (colVal[jcol] != 0.0 && colInd[jcol] >= startRow && colInd[jcol] <= (endRow-nConstraints)) { colIndex = hypre_BinarySearch(candidateList, colInd[jcol], nCandidates); /* -- if the column corresponds to a candidate, then -- */ /* -- see if that candidate has a constraint connection -- */ /* -- that has been satisfied (slaveEqnList_[irow]) -- */ if ( colIndex >= 0 ) { constrIndex = constrListAux[colIndex]; if ( constrIndex == irow ) constrIndex = constrListAux2[colIndex]; if (slaveEqnList_[constrIndex-endRow+nConstraints-1] != -1) { if ( habs(colVal[jcol]) > searchValue ) { searchValue = habs(colVal[jcol]); searchIndex = colInd[jcol]; } } } } } HYPRE_ParCSRMatrixRestoreRow(A_csr,irow,&rowSize,&colInd,&colVal); if ( searchIndex >= 0 ) { slaveEqnList_[irow-endRow+nConstraints-1] = searchIndex; index = hypre_BinarySearch(candidateList,searchIndex,nCandidates); (*couplings)[nPairs*2+1] = constrListAux[index]; (*couplings)[nPairs*2+2] = constrListAux2[index]; nPairs++; if ( ( outputLevel_ & HYPRE_BITMASK2 ) >= 1 ) printf("%4d : findSlaveEqns2 - constr %d <=> slave %d\n", mypid, irow, searchIndex); } else { if ( ( outputLevel_ & HYPRE_BITMASK2 ) >= 1 ) { printf("%4d : findSlaveEqns2 - constraint %4d fails", mypid, irow); printf(" to find a slave.\n"); } break; } } } if ( nConstraints > 0 ) { delete [] constrListAux; delete [] constrListAux2; delete [] candidateList; } free( procNRows ); //--------------------------------------------------------------------- // if not all constraint-slave pairs can be found, return -1 //--------------------------------------------------------------------- ncnt = 0; for ( irow = 0; irow < nConstraints; irow++ ) if ( slaveEqnList_[irow] == -1 ) ncnt++; MPI_Allreduce(&ncnt, &nSum, 1, MPI_INT, MPI_SUM, mpiComm_); if ( nSum > 0 ) { if ( mypid == 0 && ( outputLevel_ & HYPRE_BITMASK2 ) >= 1 ) { printf("%4d : findSlaveEqns2 fails - total number of unsatisfied", mypid); printf(" constraints = %d \n", nSum); } if ( ( outputLevel_ & HYPRE_BITMASK2 ) >= 1 ) { for ( irow = 0; irow < nConstraints; irow++ ) if ( slaveEqnList_[irow] == -1 ) { printf("%4d : findSlaveEqns2 - unsatisfied constraint",mypid); printf(" equation = %d\n", irow+endRow-nConstraints+1); } } return -1; } else return 0; } //**************************************************************************** // build reduced matrix //---------------------------------------------------------------------------- int HYPRE_SlideReduction::buildReducedMatrix2() { int mypid, nprocs, *procNRows, startRow, endRow, localNRows; int globalNConstr, globalNRows, nConstraints, A21NRows, A21NCols; int A21GlobalNRows, A21GlobalNCols, A21StartRow, A21StartCol, ierr; int rowCount, maxRowSize, newEndRow, *A21MatSize, irow, is, rowIndex; int rowSize, *colInd, newRowSize, jcol, colIndex, searchIndex; int nnzA21, *newColInd, procIndex, ncnt, uBound, *colInd2, rowSize2; int newColIndex, *rowTags=NULL; double *colVal, *newColVal, mat2X2[4], denom, *colVal2; char fname[40]; HYPRE_ParCSRMatrix A_csr, A21_csr, invA22_csr, RAP_csr, reducedA_csr; //------------------------------------------------------------------ // get matrix information //------------------------------------------------------------------ MPI_Comm_rank(mpiComm_, &mypid); MPI_Comm_size(mpiComm_, &nprocs); HYPRE_IJMatrixGetObject(Amat_, (void **) &A_csr); HYPRE_ParCSRMatrixGetRowPartitioning( A_csr, &procNRows ); startRow = procNRows[mypid]; endRow = procNRows[mypid+1] - 1; localNRows = endRow - startRow + 1; globalNConstr = procNConstr_[nprocs]; globalNRows = procNRows[nprocs]; nConstraints = procNConstr_[mypid+1] - procNConstr_[mypid]; //****************************************************************** // extract A21 from A //------------------------------------------------------------------ // calculate the dimension of A21 //------------------------------------------------------------------ A21NRows = 2 * nConstraints; A21NCols = localNRows - nConstraints; A21GlobalNRows = 2 * globalNConstr; A21GlobalNCols = globalNRows - globalNConstr; A21StartRow = 2 * procNConstr_[mypid]; A21StartCol = procNRows[mypid] - procNConstr_[mypid]; if ( ( outputLevel_ & HYPRE_BITMASK2 ) >= 1 ) { printf("%4d : buildReducedMatrix - A21StartRow = %d\n", mypid, A21StartRow); printf("%4d : buildReducedMatrix - A21GlobalDim = %d %d\n", mypid, A21GlobalNRows, A21GlobalNCols); printf("%4d : buildReducedMatrix - A21LocalDim = %d %d\n",mypid, A21NRows, A21NCols); } //------------------------------------------------------------------ // create a matrix context for A21 //------------------------------------------------------------------ ierr = HYPRE_IJMatrixCreate(mpiComm_,A21StartRow,A21StartRow+A21NRows-1, A21StartCol,A21StartCol+A21NCols-1,&A21mat_); ierr += HYPRE_IJMatrixSetObjectType(A21mat_, HYPRE_PARCSR); hypre_assert(!ierr); //------------------------------------------------------------------ // compute the number of nonzeros in the first nConstraint row of A21 // (which consists of the rows in selectedList), the nnz will // be reduced by excluding the constraint and selected slave columns //------------------------------------------------------------------ rowCount = maxRowSize = 0; newEndRow = endRow - nConstraints; A21MatSize = new int[A21NRows]; for ( irow = 0; irow < nConstraints; irow++ ) { for ( is = 0; is < nConstraints; is++ ) { if ( slaveEqnListAux_[is] == irow ) { rowIndex = slaveEqnList_[is]; break; } } HYPRE_ParCSRMatrixGetRow(A_csr,rowIndex,&rowSize,&colInd,&colVal); newRowSize = 0; for ( jcol = 0; jcol < rowSize; jcol++ ) { colIndex = colInd[jcol]; if ( colVal[jcol] != 0.0 ) { if ( colIndex <= newEndRow || colIndex > endRow ) { searchIndex = hypre_BinarySearch(gSlaveEqnList_,colIndex, globalNConstr); if ( searchIndex < 0 ) newRowSize++; } } } A21MatSize[irow] = newRowSize; maxRowSize = ( newRowSize > maxRowSize ) ? newRowSize : maxRowSize; HYPRE_ParCSRMatrixRestoreRow(A_csr,rowIndex,&rowSize,&colInd,&colVal); } //------------------------------------------------------------------ // compute the number of nonzeros in the second nConstraint row of A21 // (which consists of the rows in constraint equations) //------------------------------------------------------------------ rowCount = nConstraints; for ( irow = endRow-nConstraints+1; irow <= endRow; irow++ ) { HYPRE_ParCSRMatrixGetRow(A_csr,irow,&rowSize,&colInd,&colVal); newRowSize = 0; for ( jcol = 0; jcol < rowSize; jcol++ ) { if ( colVal[jcol] != 0.0 ) { colIndex = colInd[jcol]; if ( colIndex <= newEndRow || colIndex > endRow ) { searchIndex = hypre_BinarySearch(gSlaveEqnList_,colIndex, globalNConstr); if ( searchIndex < 0 ) newRowSize++; } } } A21MatSize[rowCount] = newRowSize; maxRowSize = ( newRowSize > maxRowSize ) ? newRowSize : maxRowSize; HYPRE_ParCSRMatrixRestoreRow(A_csr,irow,&rowSize,&colInd,&colVal); rowCount++; } nnzA21 = 0; for ( irow = 0; irow < 2*nConstraints; irow++ ) nnzA21 += A21MatSize[irow]; MPI_Allreduce(&nnzA21,&ncnt,1,MPI_INT,MPI_SUM,mpiComm_); if ( mypid == 0 && ( outputLevel_ & HYPRE_BITMASK2 ) >= 1 ) printf(" 0 : buildReducedMatrix : NNZ of A21 = %d\n", ncnt); //------------------------------------------------------------------ // after fetching the row sizes, set up A21 with such sizes //------------------------------------------------------------------ ierr = HYPRE_IJMatrixSetRowSizes(A21mat_, A21MatSize); ierr += HYPRE_IJMatrixInitialize(A21mat_); hypre_assert(!ierr); delete [] A21MatSize; //------------------------------------------------------------------ // next load the first nConstraint row to A21 extracted from A // (at the same time, the D block is saved for future use) //------------------------------------------------------------------ rowCount = A21StartRow; newColInd = new int[maxRowSize+1]; newColVal = new double[maxRowSize+1]; for ( irow = 0; irow < nConstraints; irow++ ) { for ( is = 0; is < nConstraints; is++ ) { if ( slaveEqnListAux_[is] == irow ) { rowIndex = slaveEqnList_[is]; break; } } HYPRE_ParCSRMatrixGetRow(A_csr,rowIndex,&rowSize,&colInd,&colVal); newRowSize = 0; for ( jcol = 0; jcol < rowSize; jcol++ ) { if ( colVal[jcol] != 0.0 ) { colIndex = colInd[jcol]; if ( colIndex <= newEndRow || colIndex > endRow ) { searchIndex = HYPRE_LSI_Search(gSlaveEqnList_,colIndex, globalNConstr); if ( searchIndex < 0 ) { for ( procIndex = 0; procIndex < nprocs; procIndex++ ) if ( procNRows[procIndex] > colIndex ) break; procIndex--; newColIndex = colIndex - procNConstr_[procIndex]; newColInd[newRowSize] = newColIndex; newColVal[newRowSize++] = colVal[jcol]; if ( newColIndex < 0 || newColIndex >= A21GlobalNCols ) { printf("%4d : buildReducedMatrix ERROR - A21",mypid); printf(" out of range (%d,%d (%d))\n", rowCount, colIndex, A21GlobalNCols); for ( is = 0; is < rowSize; is++ ) printf("%4d : row %7d has col = %7d\n",mypid,rowIndex, colInd[is]); exit(1); } if ( newRowSize > maxRowSize+1 ) { if ( ( outputLevel_ & HYPRE_BITMASK2 ) >= 2 ) { printf("%4d : buildReducedMatrix WARNING - ",mypid); printf("passing array boundary(1).\n"); } } } } } } HYPRE_IJMatrixSetValues(A21mat_,1,&newRowSize,(const int *) &rowCount, (const int *) newColInd, (const double *) newColVal); HYPRE_ParCSRMatrixRestoreRow(A_csr,rowIndex,&rowSize,&colInd,&colVal); rowCount++; } //------------------------------------------------------------------ // next load the second nConstraint rows to A21 extracted from A //------------------------------------------------------------------ for ( irow = endRow-nConstraints+1; irow <= endRow; irow++ ) { HYPRE_ParCSRMatrixGetRow(A_csr,irow,&rowSize,&colInd,&colVal); newRowSize = 0; for ( jcol = 0; jcol < rowSize; jcol++ ) { colIndex = colInd[jcol]; if (colVal[jcol] != 0.0 && (colIndex <= newEndRow || colIndex > endRow)) { searchIndex = hypre_BinarySearch(gSlaveEqnList_, colIndex, globalNConstr); if ( searchIndex < 0 ) { for ( procIndex = 0; procIndex < nprocs; procIndex++ ) if ( procNRows[procIndex] > colIndex ) break; procIndex--; newColIndex = colInd[jcol] - procNConstr_[procIndex]; newColInd[newRowSize] = newColIndex; newColVal[newRowSize++] = colVal[jcol]; } } } HYPRE_IJMatrixSetValues(A21mat_,1,&newRowSize,(const int *) &rowCount, (const int *) newColInd, (const double *) newColVal); HYPRE_ParCSRMatrixRestoreRow(A_csr,irow,&rowSize,&colInd,&colVal); rowCount++; } delete [] newColInd; delete [] newColVal; //------------------------------------------------------------------ // finally assemble the matrix and sanitize //------------------------------------------------------------------ HYPRE_IJMatrixAssemble(A21mat_); HYPRE_IJMatrixGetObject(A21mat_, (void **) &A21_csr); hypre_MatvecCommPkgCreate((hypre_ParCSRMatrix *) A21_csr); if ( outputLevel_ >= 5 ) { sprintf(fname, "A21.%d", mypid); FILE *fp = fopen(fname, "w"); if ( mypid == 0 ) { printf("====================================================\n"); printf("%4d : Printing A21 matrix... \n", mypid); fflush(stdout); } for (irow = A21StartRow;irow < A21StartRow+2*nConstraints;irow++) { HYPRE_ParCSRMatrixGetRow(A21_csr,irow,&rowSize,&colInd,&colVal); for ( jcol = 0; jcol < rowSize; jcol++ ) if ( colVal[jcol] != 0.0 ) fprintf(fp,"%6d %6d %25.16e \n",irow+1,colInd[jcol]+1, colVal[jcol]); HYPRE_ParCSRMatrixRestoreRow(A21_csr, irow, &rowSize, &colInd, &colVal); } if ( mypid == 0 ) printf("====================================================\n"); fclose(fp); } //****************************************************************** // construct invA22 // - given A22 = | B C |, compute | 0 C^{-T} | // | C^T 0 | | C^{-1} -C^{-1} B C^{-T} | //------------------------------------------------------------------ //------------------------------------------------------------------ // first extract the (2,1) block of A22 // ( constraints-to-local slaves ) //------------------------------------------------------------------ int *CT_JA = NULL; double *CT_AA = NULL; if ( nConstraints > 0 ) { CT_JA = new int[nConstraints*2]; CT_AA = new double[nConstraints*2]; } for ( irow = 0; irow < nConstraints; irow++ ) { rowIndex = newEndRow + 1 + irow; HYPRE_ParCSRMatrixGetRow(A_csr,rowIndex,&rowSize,&colInd,&colVal); CT_JA[irow*2] = CT_JA[irow*2+1] = -1; CT_AA[irow*2] = CT_AA[irow*2+1] = 0.0; for ( jcol = 0; jcol < rowSize; jcol++ ) { colIndex = colInd[jcol]; searchIndex = hypre_BinarySearch(slaveEqnList_,colIndex,nConstraints); if ( searchIndex >= 0 ) { if ( CT_JA[irow*2] == -1 ) { CT_JA[irow*2] = slaveEqnListAux_[searchIndex]; CT_AA[irow*2] = colVal[jcol]; } else { CT_JA[irow*2+1] = slaveEqnListAux_[searchIndex]; CT_AA[irow*2+1] = colVal[jcol]; } } } HYPRE_ParCSRMatrixRestoreRow(A_csr,rowIndex,&rowSize,&colInd,&colVal); } //------------------------------------------------------------------ // invert the (2,1) block of A22 //------------------------------------------------------------------ if ( nConstraints > 0 ) rowTags = new int[nConstraints]; for ( irow = 0; irow < nConstraints; irow++ ) rowTags[irow] = -1; for ( irow = 0; irow < nConstraints; irow++ ) { if ( rowTags[irow] == -1 ) { if ( CT_JA[irow*2+1] == -1 ) CT_AA[irow*2] = 1.0 / CT_AA[irow*2]; else { if ( CT_JA[2*irow] == irow ) { mat2X2[0] = CT_AA[2*irow]; mat2X2[2] = CT_AA[2*irow+1]; rowIndex = CT_JA[2*irow+1]; } else { mat2X2[0] = CT_AA[2*irow+1]; mat2X2[2] = CT_AA[2*irow]; rowIndex = CT_JA[2*irow]; } if ( rowTags[rowIndex] != -1 ) CT_AA[rowIndex*2] = 1.0 / CT_AA[rowIndex*2]; if ( CT_JA[2*rowIndex] == rowIndex ) { mat2X2[3] = CT_AA[2*rowIndex]; mat2X2[1] = CT_AA[2*rowIndex+1]; } else { mat2X2[3] = CT_AA[2*rowIndex+1]; mat2X2[1] = CT_AA[2*rowIndex]; } rowTags[rowIndex] = 0; denom = mat2X2[0] * mat2X2[3] - mat2X2[1] * mat2X2[2]; denom = 1.0 / denom; CT_JA[irow*2] = irow; CT_AA[irow*2] = mat2X2[3] * denom; CT_JA[irow*2+1] = rowIndex; CT_AA[irow*2+1] = - mat2X2[2] * denom; CT_JA[rowIndex*2] = rowIndex; CT_AA[rowIndex*2] = mat2X2[0] * denom; CT_JA[rowIndex*2+1] = irow; CT_AA[rowIndex*2+1] = - mat2X2[1] * denom; } rowTags[irow] = 0; } } if ( nConstraints > 0 ) delete [] rowTags; //------------------------------------------------------------------ // form ParCSRMatrix of the (2,1) block of A22 //------------------------------------------------------------------ int *hypreCTMatSize; hypre_ParCSRMatrix *hypreCT; HYPRE_IJMatrix IJCT; ierr = HYPRE_IJMatrixCreate(mpiComm_, procNConstr_[mypid], procNConstr_[mypid]+nConstraints-1, procNConstr_[mypid], procNConstr_[mypid]+nConstraints-1, &IJCT); ierr += HYPRE_IJMatrixSetObjectType(IJCT, HYPRE_PARCSR); hypre_assert(!ierr); if ( nConstraints > 0 ) hypreCTMatSize = new int[nConstraints]; maxRowSize = 0; for ( irow = 0; irow < nConstraints; irow++ ) { hypreCTMatSize[irow] = 1; if ( CT_JA[irow*2+1] != -1 && CT_AA[irow*2+1] != 0.0 ) hypreCTMatSize[irow]++; } ierr = HYPRE_IJMatrixSetRowSizes(IJCT, hypreCTMatSize); ierr = HYPRE_IJMatrixInitialize(IJCT); hypre_assert(!ierr); if ( nConstraints > 0 ) delete [] hypreCTMatSize; newColInd = new int[2]; newColVal = new double[2]; for ( irow = 0; irow < nConstraints; irow++ ) { rowIndex = procNConstr_[mypid] + irow; newColInd[0] = CT_JA[irow*2] + procNConstr_[mypid]; newColVal[0] = CT_AA[irow*2]; newRowSize = 1; if ( CT_JA[irow*2+1] != -1 && CT_AA[irow*2+1] != 0.0 ) { newColInd[1] = CT_JA[irow*2+1] + procNConstr_[mypid]; newColVal[1] = CT_AA[irow*2+1]; newRowSize++; } ierr = HYPRE_IJMatrixSetValues(IJCT, 1, &newRowSize, (const int *) &rowIndex, (const int *) newColInd, (const double *) newColVal); hypre_assert( !ierr ); } delete [] newColInd; delete [] newColVal; if ( nConstraints > 0 ) { delete [] CT_JA; delete [] CT_AA; } HYPRE_IJMatrixAssemble(IJCT); HYPRE_IJMatrixGetObject(IJCT, (void **) &hypreCT); hypre_MatvecCommPkgCreate((hypre_ParCSRMatrix *) hypreCT); //------------------------------------------------------------------ // next extract the (1,2) block of A22 // ( local slaves-to-constraints ) //------------------------------------------------------------------ int *C_JA = NULL; double *C_AA = NULL; if ( nConstraints > 0 ) { C_JA = new int[nConstraints*2]; C_AA = new double[nConstraints*2]; } for ( irow = 0; irow < nConstraints; irow++ ) { for ( is = 0; is < nConstraints; is++ ) { if ( slaveEqnListAux_[is] == irow ) { rowIndex = slaveEqnList_[is]; break; } } HYPRE_ParCSRMatrixGetRow(A_csr,rowIndex,&rowSize,&colInd,&colVal); C_JA[irow*2] = C_JA[irow*2+1] = -1; C_AA[irow*2] = C_AA[irow*2+1] = 0.0; for ( jcol = 0; jcol < rowSize; jcol++ ) { colIndex = colInd[jcol]; if ( colIndex > newEndRow && colIndex <= endRow ) { if ( C_JA[irow*2] == -1 ) { C_JA[irow*2] = colIndex - newEndRow - 1; C_AA[irow*2] = colVal[jcol]; } else { C_JA[irow*2+1] = colIndex - newEndRow - 1; C_AA[irow*2+1] = colVal[jcol]; } } } HYPRE_ParCSRMatrixRestoreRow(A_csr,rowIndex,&rowSize,&colInd,&colVal); } //------------------------------------------------------------------ // invert the (1,2) block of A22 //------------------------------------------------------------------ if ( nConstraints > 0 ) rowTags = new int[nConstraints]; for ( irow = 0; irow < nConstraints; irow++ ) rowTags[irow] = -1; for ( irow = 0; irow < nConstraints; irow++ ) { if ( rowTags[irow] == -1 ) { if ( C_JA[irow*2+1] == -1 ) C_AA[irow*2] = 1.0 / C_AA[irow*2]; else { if ( C_JA[2*irow] == irow ) { mat2X2[0] = C_AA[2*irow]; mat2X2[2] = C_AA[2*irow+1]; rowIndex = C_JA[2*irow+1]; } else { mat2X2[0] = C_AA[2*irow+1]; mat2X2[2] = C_AA[2*irow]; rowIndex = C_JA[2*irow]; } if ( rowTags[rowIndex] != -1 ) C_AA[rowIndex*2] = 1.0 / C_AA[rowIndex*2]; if ( C_JA[2*rowIndex] == rowIndex ) { mat2X2[3] = C_AA[2*rowIndex]; mat2X2[1] = C_AA[2*rowIndex+1]; } else { mat2X2[3] = C_AA[2*rowIndex+1]; mat2X2[1] = C_AA[2*rowIndex]; } rowTags[rowIndex] = 0; denom = mat2X2[0] * mat2X2[3] - mat2X2[1] * mat2X2[3]; denom = 1.0 / denom; C_JA[irow*2] = irow; C_AA[irow*2] = mat2X2[3] * denom; C_JA[irow*2+1] = rowIndex; C_AA[irow*2+1] = - mat2X2[2] * denom; C_JA[rowIndex*2] = rowIndex; C_AA[rowIndex*2] = mat2X2[0] * denom; C_JA[rowIndex*2+1] = irow; C_AA[rowIndex*2+1] = - mat2X2[1] * denom; } rowTags[irow] = 0; } } if ( nConstraints > 0 ) delete [] rowTags; //------------------------------------------------------------------ // form ParCSRMatrix of the (1,2) block of A22 //------------------------------------------------------------------ int *hypreCMatSize; hypre_ParCSRMatrix *hypreC; HYPRE_IJMatrix IJC; ierr = HYPRE_IJMatrixCreate(mpiComm_, procNConstr_[mypid], procNConstr_[mypid]+nConstraints-1, procNConstr_[mypid], procNConstr_[mypid]+nConstraints-1, &IJC); ierr += HYPRE_IJMatrixSetObjectType(IJC, HYPRE_PARCSR); hypre_assert(!ierr); if ( nConstraints > 0 ) hypreCMatSize = new int[nConstraints]; maxRowSize = 0; for ( irow = 0; irow < nConstraints; irow++ ) { hypreCMatSize[irow] = 1; if ( C_JA[irow*2+1] != -1 && C_AA[irow*2+1] != 0.0 ) hypreCMatSize[irow]++; } ierr = HYPRE_IJMatrixSetRowSizes(IJC, hypreCMatSize); ierr = HYPRE_IJMatrixInitialize(IJC); hypre_assert(!ierr); if ( nConstraints > 0 ) delete [] hypreCMatSize; newColInd = new int[2]; newColVal = new double[2]; for ( irow = 0; irow < nConstraints; irow++ ) { rowIndex = procNConstr_[mypid] + irow; newColInd[0] = C_JA[irow*2] + procNConstr_[mypid]; newColVal[0] = C_AA[irow*2]; newRowSize = 1; if ( C_JA[irow*2+1] != -1 && C_AA[irow*2+1] != 0.0 ) { newColInd[1] = C_JA[irow*2+1] + procNConstr_[mypid]; newColVal[1] = C_AA[irow*2+1]; newRowSize++; } ierr = HYPRE_IJMatrixSetValues(IJC, 1, &newRowSize, (const int *) &rowIndex, (const int *) newColInd, (const double *) newColVal); hypre_assert( !ierr ); } delete [] newColInd; delete [] newColVal; if ( nConstraints > 0 ) { delete [] C_JA; delete [] C_AA; } HYPRE_IJMatrixAssemble(IJC); HYPRE_IJMatrixGetObject(IJC, (void **) &hypreC); hypre_MatvecCommPkgCreate((hypre_ParCSRMatrix *) hypreC); //------------------------------------------------------------------ // form ParCSRMatrix of the (2,2) block of the invA22 matrix //------------------------------------------------------------------ int *hypreBMatSize; hypre_ParCSRMatrix *hypreB; HYPRE_IJMatrix IJB; ierr = HYPRE_IJMatrixCreate(mpiComm_, procNConstr_[mypid], procNConstr_[mypid]+nConstraints-1, procNConstr_[mypid], procNConstr_[mypid]+nConstraints-1, &IJB); ierr = HYPRE_IJMatrixSetObjectType(IJB, HYPRE_PARCSR); hypre_assert(!ierr); if ( nConstraints > 0 ) hypreBMatSize = new int[nConstraints]; maxRowSize = 0; for ( irow = 0; irow < nConstraints; irow++ ) { for ( is = 0; is < nConstraints; is++ ) { if ( slaveEqnListAux_[is] == irow ) { rowIndex = slaveEqnList_[is]; break; } } HYPRE_ParCSRMatrixGetRow(A_csr,rowIndex,&rowSize,&colInd,&colVal); newRowSize = 0; for ( jcol = 0; jcol < rowSize; jcol++ ) { colIndex = colInd[jcol]; searchIndex = hypre_BinarySearch(gSlaveEqnList_, colIndex, globalNConstr); if ( searchIndex >= 0 ) newRowSize++; } HYPRE_ParCSRMatrixRestoreRow(A_csr,rowIndex,&rowSize,&colInd,&colVal); hypreBMatSize[irow] = newRowSize; maxRowSize = (newRowSize > maxRowSize) ? newRowSize : maxRowSize; } ierr = HYPRE_IJMatrixSetRowSizes(IJB, hypreBMatSize); ierr = HYPRE_IJMatrixInitialize(IJB); hypre_assert(!ierr); if ( nConstraints > 0 ) delete [] hypreBMatSize; if ( maxRowSize > 0 ) { newColInd = new int[maxRowSize]; newColVal = new double[maxRowSize]; } for ( irow = 0; irow < nConstraints; irow++ ) { for ( is = 0; is < nConstraints; is++ ) { if ( slaveEqnListAux_[is] == irow ) { rowIndex = slaveEqnList_[is]; break; } } HYPRE_ParCSRMatrixGetRow(A_csr,rowIndex,&rowSize,&colInd,&colVal); newRowSize = 0; for ( jcol = 0; jcol < rowSize; jcol++ ) { colIndex = colInd[jcol]; searchIndex = hypre_BinarySearch(gSlaveEqnList_, colIndex, globalNConstr); if ( searchIndex >= 0 ) { newColInd[newRowSize] = gSlaveEqnListAux_[searchIndex]; newColVal[newRowSize++] = - colVal[jcol]; } } HYPRE_ParCSRMatrixRestoreRow(A_csr,rowIndex,&rowSize,&colInd,&colVal); rowIndex = procNConstr_[mypid] + irow; ierr = HYPRE_IJMatrixSetValues(IJB, 1, &newRowSize, (const int *) &rowIndex, (const int *) newColInd, (const double *) newColVal); hypre_assert( !ierr ); } HYPRE_IJMatrixAssemble(IJB); HYPRE_IJMatrixGetObject(IJB, (void **) &hypreB); if ( maxRowSize > 0 ) { delete [] newColInd; delete [] newColVal; } //------------------------------------------------------------------ // perform triple matrix product - C^{-1} B C^{-T} //------------------------------------------------------------------ HYPRE_ParCSRMatrix hypreCBC; strcpy( fname, "hypreCT" ); HYPRE_ParCSRMatrixPrint((HYPRE_ParCSRMatrix) hypreCT, fname); strcpy( fname, "hypreB" ); HYPRE_ParCSRMatrixPrint((HYPRE_ParCSRMatrix) hypreB, fname); hypre_BoomerAMGBuildCoarseOperator(hypreCT, hypreB, hypreCT, (hypre_ParCSRMatrix **) &hypreCBC); #if 0 for ( irow = 0; irow < nConstraints; irow++ ) { HYPRE_ParCSRMatrixGetRow((HYPRE_ParCSRMatrix) hypreCT,irow,&rowSize, &colInd,&colVal); for (jcol = 0; jcol < rowSize; jcol++ ) printf("CT : %5d %5d %25.16e\n",irow+1,colInd[jcol]+1,colVal[jcol]); HYPRE_ParCSRMatrixRestoreRow((HYPRE_ParCSRMatrix) hypreCT,irow,&rowSize, &colInd,&colVal); } for ( irow = 0; irow < nConstraints; irow++ ) { HYPRE_ParCSRMatrixGetRow((HYPRE_ParCSRMatrix) hypreB,irow,&rowSize, &colInd,&colVal); for (jcol = 0; jcol < rowSize; jcol++ ) printf("B : %5d %5d %25.16e\n",irow+1,colInd[jcol]+1,colVal[jcol]); HYPRE_ParCSRMatrixRestoreRow((HYPRE_ParCSRMatrix) hypreB,irow,&rowSize, &colInd,&colVal); } for ( irow = 0; irow < nConstraints; irow++ ) { HYPRE_ParCSRMatrixGetRow((HYPRE_ParCSRMatrix) hypreCBC,irow,&rowSize, &colInd,&colVal); for (jcol = 0; jcol < rowSize; jcol++ ) printf("CBC : %5d %5d %25.16e\n",irow+1,colInd[jcol]+1,colVal[jcol]); HYPRE_ParCSRMatrixRestoreRow((HYPRE_ParCSRMatrix) hypreCBC,irow,&rowSize, &colInd,&colVal); } #endif HYPRE_IJMatrixDestroy( IJB ); //------------------------------------------------------------------ // calculate the dimension of invA22 //------------------------------------------------------------------ int invA22NRows = A21NRows; int invA22NCols = invA22NRows; int invA22StartRow = A21StartRow; int invA22StartCol = invA22StartRow; int *invA22MatSize; //------------------------------------------------------------------ // create a matrix context for A22 //------------------------------------------------------------------ ierr = HYPRE_IJMatrixCreate(mpiComm_, invA22StartRow, invA22StartRow+invA22NRows-1, invA22StartCol, invA22StartCol+invA22NCols-1, &invA22mat_); ierr += HYPRE_IJMatrixSetObjectType(invA22mat_, HYPRE_PARCSR); hypre_assert(!ierr); //------------------------------------------------------------------ // compute the no. of nonzeros in the first nConstraint row of invA22 //------------------------------------------------------------------ maxRowSize = 0; invA22MatSize = new int[invA22NRows]; for ( irow = 0; irow < nConstraints; irow++ ) { rowIndex = procNConstr_[mypid] + irow; ierr = HYPRE_ParCSRMatrixGetRow((HYPRE_ParCSRMatrix) hypreCT,rowIndex, &rowSize,NULL,NULL); hypre_assert( !ierr ); invA22MatSize[irow] = rowSize; HYPRE_ParCSRMatrixRestoreRow((HYPRE_ParCSRMatrix) hypreCT,rowIndex, &rowSize,NULL,NULL); maxRowSize = ( rowSize > maxRowSize ) ? rowSize : maxRowSize; } //------------------------------------------------------------------ // compute the number of nonzeros in the second nConstraints row of // invA22 (consisting of [D and A22 block]) //------------------------------------------------------------------ #if 0 for ( irow = 0; irow < nConstraints; irow++ ) { HYPRE_ParCSRMatrixGetRow((HYPRE_ParCSRMatrix) hypreCBC,irow,&rowSize, &colInd,&colVal); for (jcol = 0; jcol < rowSize; jcol++ ) printf("CBC1 : %5d %5d %25.16e\n",irow+1,colInd[jcol]+1,colVal[jcol]); HYPRE_ParCSRMatrixRestoreRow((HYPRE_ParCSRMatrix) hypreCBC,irow,&rowSize, &colInd,&colVal); } #endif for ( irow = 0; irow < nConstraints; irow++ ) { rowIndex = procNConstr_[mypid] + irow; ierr = HYPRE_ParCSRMatrixGetRow((HYPRE_ParCSRMatrix) hypreC,rowIndex, &rowSize,&colInd,&colVal); hypre_assert( !ierr ); newRowSize = rowSize; HYPRE_ParCSRMatrixRestoreRow((HYPRE_ParCSRMatrix) hypreC,rowIndex, &rowSize,&colInd,&colVal); ierr = HYPRE_ParCSRMatrixGetRow((HYPRE_ParCSRMatrix) hypreCBC,rowIndex, &rowSize,&colInd,&colVal); hypre_assert( !ierr ); newRowSize += rowSize; HYPRE_ParCSRMatrixRestoreRow((HYPRE_ParCSRMatrix) hypreCBC,rowIndex, &rowSize,&colInd,&colVal); invA22MatSize[nConstraints+irow] = newRowSize; maxRowSize = ( newRowSize > maxRowSize ) ? newRowSize : maxRowSize; } //------------------------------------------------------------------ // after fetching the row sizes, set up invA22 with such sizes //------------------------------------------------------------------ #if 0 for ( irow = 0; irow < nConstraints; irow++ ) { HYPRE_ParCSRMatrixGetRow((HYPRE_ParCSRMatrix) hypreCBC,irow,&rowSize, &colInd,&colVal); for (jcol = 0; jcol < rowSize; jcol++ ) printf("CBC2 : %5d %5d %25.16e\n",irow+1,colInd[jcol]+1,colVal[jcol]); HYPRE_ParCSRMatrixRestoreRow((HYPRE_ParCSRMatrix) hypreCBC,irow,&rowSize, &colInd,&colVal); } #endif ierr = HYPRE_IJMatrixSetRowSizes(invA22mat_, invA22MatSize); ierr += HYPRE_IJMatrixInitialize(invA22mat_); hypre_assert(!ierr); delete [] invA22MatSize; //------------------------------------------------------------------ // next load the first nConstraints row to invA22 extracted from A // (that is, the D block) //------------------------------------------------------------------ newColInd = new int[maxRowSize+1]; newColVal = new double[maxRowSize+1]; for ( irow = 0; irow < nConstraints; irow++ ) { rowIndex = procNConstr_[mypid] + irow; ierr = HYPRE_ParCSRMatrixGetRow((HYPRE_ParCSRMatrix) hypreCT,rowIndex, &rowSize,&colInd,&colVal); hypre_assert( !ierr ); newRowSize = 0; for ( jcol = 0; jcol < rowSize; jcol++ ) { newColInd[newRowSize] = colInd[jcol] + procNConstr_[mypid] + nConstraints; newColVal[newRowSize++] = colVal[jcol]; } HYPRE_ParCSRMatrixRestoreRow((HYPRE_ParCSRMatrix) hypreCT,rowIndex, &rowSize,&colInd,&colVal); rowCount = invA22StartRow + irow; ierr = HYPRE_IJMatrixSetValues(invA22mat_, 1, &rowSize, (const int *) &rowCount, (const int *) newColInd, (const double *) newColVal); hypre_assert(!ierr); } //------------------------------------------------------------------ // next load the second nConstraints rows to A22 extracted from A //------------------------------------------------------------------ for ( irow = 0; irow < nConstraints; irow++ ) { rowIndex = procNConstr_[mypid] + irow; ierr = HYPRE_ParCSRMatrixGetRow((HYPRE_ParCSRMatrix) hypreC,rowIndex, &rowSize,&colInd,&colVal); hypre_assert( !ierr ); newRowSize = 0; for ( jcol = 0; jcol < rowSize; jcol++ ) { newColInd[newRowSize] = colInd[jcol] + procNConstr_[mypid]; newColVal[newRowSize++] = colVal[jcol]; } HYPRE_ParCSRMatrixRestoreRow((HYPRE_ParCSRMatrix) hypreC,rowIndex, &rowSize,&colInd,&colVal); ierr = HYPRE_ParCSRMatrixGetRow((HYPRE_ParCSRMatrix) hypreCBC,rowIndex, &rowSize2,&colInd2,&colVal2); hypre_assert( !ierr ); for ( jcol = 0; jcol < rowSize2; jcol++ ) { newColInd[newRowSize] = colInd2[jcol] + procNConstr_[mypid] + nConstraints; newColVal[newRowSize++] = colVal2[jcol]; } HYPRE_ParCSRMatrixRestoreRow((HYPRE_ParCSRMatrix) hypreCBC,rowIndex, &rowSize2,&colInd2,&colVal2); rowCount = invA22StartRow + nConstraints + irow; ierr = HYPRE_IJMatrixSetValues(invA22mat_, 1, &newRowSize, (const int *) &rowCount, (const int *) newColInd, (const double *) newColVal); hypre_assert(!ierr); } delete [] newColInd; delete [] newColVal; HYPRE_IJMatrixDestroy( IJC ); HYPRE_IJMatrixDestroy( IJCT ); HYPRE_ParCSRMatrixDestroy( (HYPRE_ParCSRMatrix) hypreCBC ); //------------------------------------------------------------------ // finally assemble the matrix and sanitize //------------------------------------------------------------------ HYPRE_IJMatrixAssemble(invA22mat_); HYPRE_IJMatrixGetObject(invA22mat_, (void **) &invA22_csr); hypre_MatvecCommPkgCreate((hypre_ParCSRMatrix *) invA22_csr); if ( outputLevel_ >= 5 ) { sprintf(fname, "invA22.%d", mypid); FILE *fp = fopen(fname, "w"); if ( mypid == ncnt ) { printf("====================================================\n"); printf("%4d : Printing invA22 matrix... \n", mypid); fflush(stdout); } for (irow=invA22StartRow; irow < invA22StartRow+invA22NRows;irow++) { HYPRE_ParCSRMatrixGetRow(invA22_csr,irow,&rowSize,&colInd,&colVal); for ( jcol = 0; jcol < rowSize; jcol++ ) if ( colVal[jcol] != 0.0 ) fprintf(fp,"%6d %6d %25.16e \n",irow+1,colInd[jcol]+1, colVal[jcol]); HYPRE_ParCSRMatrixRestoreRow(invA22_csr,irow,&rowSize,&colInd, &colVal); } if ( mypid == ncnt ) printf("====================================================\n"); fclose(fp); } //****************************************************************** // perform the triple matrix product A12 * invA22 * A21 //------------------------------------------------------------------ HYPRE_IJMatrixGetObject(A21mat_, (void **) &A21_csr); HYPRE_IJMatrixGetObject(invA22mat_, (void **) &invA22_csr); if ( ( outputLevel_ & HYPRE_BITMASK2 ) >= 1 ) printf("%4d : buildReducedMatrix - Triple matrix product starts\n", mypid); hypre_BoomerAMGBuildCoarseOperator((hypre_ParCSRMatrix *) A21_csr, (hypre_ParCSRMatrix *) invA22_csr, (hypre_ParCSRMatrix *) A21_csr, (hypre_ParCSRMatrix **) &RAP_csr); if ( ( outputLevel_ & HYPRE_BITMASK2 ) >= 1 ) printf("%4d : buildReducedMatrix - Triple matrix product ends\n", mypid); if ( outputLevel_ >= 4 ) { sprintf(fname, "rap.%d", mypid); FILE *fp = fopen(fname, "w"); if ( mypid == 0 ) { printf("====================================================\n"); printf("%4d : Printing RAP matrix... \n", mypid); fflush(stdout); } for ( irow = A21StartRow; irow < A21StartRow+A21NCols; irow++ ) { HYPRE_ParCSRMatrixGetRow(RAP_csr,irow,&rowSize,&colInd,&colVal); for ( jcol = 0; jcol < rowSize; jcol++ ) if ( colVal[jcol] != 0.0 ) printf("%6d %6d %25.16e \n",irow+1,colInd[jcol]+1, colVal[jcol]); HYPRE_ParCSRMatrixRestoreRow(RAP_csr,irow,&rowSize,&colInd, &colVal); } fclose(fp); if ( mypid == 0 ) printf("====================================================\n"); } //****************************************************************** // finally form reduceA = A11 - A12 * invA22 * A21 //------------------------------------------------------------------ //------------------------------------------------------------------ // compute row sizes //------------------------------------------------------------------ int reducedANRows = localNRows - nConstraints; int reducedANCols = reducedANRows; int reducedAStartRow = procNRows[mypid] - procNConstr_[mypid]; int reducedAStartCol = reducedAStartRow; int reducedAGlobalNRows = globalNRows - globalNConstr; int reducedAGlobalNCols = reducedAGlobalNRows; int *reducedAMatSize = new int[reducedANRows]; if ( ( outputLevel_ & HYPRE_BITMASK2 ) >= 1 ) { printf("%4d : buildReducedMatrix - reduceAGlobalDim = %d %d\n", mypid, reducedAGlobalNRows, reducedAGlobalNCols); printf("%4d : buildReducedMatrix - reducedALocalDim = %d %d\n", mypid, reducedANRows, reducedANCols); } //------------------------------------------------------------------ // create a matrix context for reducedA //------------------------------------------------------------------ ierr = HYPRE_IJMatrixCreate(mpiComm_,reducedAStartRow, reducedAStartRow+reducedANRows-1, reducedAStartCol, reducedAStartCol+reducedANCols-1,&reducedAmat_); ierr += HYPRE_IJMatrixSetObjectType(reducedAmat_, HYPRE_PARCSR); hypre_assert(!ierr); //------------------------------------------------------------------ // compute row sizes for reducedA //------------------------------------------------------------------ rowCount = maxRowSize = 0; for ( irow = startRow; irow <= newEndRow; irow++ ) { searchIndex = hypre_BinarySearch(slaveEqnList_, irow, nConstraints); if ( searchIndex >= 0 ) reducedAMatSize[rowCount++] = 1; else { HYPRE_ParCSRMatrixGetRow(A_csr,irow,&rowSize,&colInd,NULL); rowIndex = reducedAStartRow + rowCount; ierr = HYPRE_ParCSRMatrixGetRow(RAP_csr,rowIndex,&rowSize2, &colInd2, NULL); hypre_assert( !ierr ); newRowSize = rowSize + rowSize2; maxRowSize = ( newRowSize > maxRowSize ) ? newRowSize : maxRowSize; newColInd = new int[newRowSize]; for (jcol = 0; jcol < rowSize; jcol++) newColInd[jcol] = colInd[jcol]; for (jcol = 0; jcol < rowSize2; jcol++) newColInd[rowSize+jcol] = colInd2[jcol]; hypre_qsort0(newColInd, 0, newRowSize-1); ncnt = 0; for ( jcol = 1; jcol < newRowSize; jcol++ ) if (newColInd[jcol] != newColInd[ncnt]) newColInd[++ncnt] = newColInd[jcol]; if ( newRowSize > 0 ) ncnt++; reducedAMatSize[rowIndex++] = ncnt; HYPRE_ParCSRMatrixRestoreRow(A_csr,irow,&rowSize,&colInd,NULL); ierr = HYPRE_ParCSRMatrixRestoreRow(RAP_csr,rowIndex,&rowSize2, &colInd2,NULL); delete [] newColInd; hypre_assert( !ierr ); rowCount++; } } ierr = HYPRE_IJMatrixSetRowSizes(reducedAmat_, reducedAMatSize); ierr += HYPRE_IJMatrixInitialize(reducedAmat_); hypre_assert(!ierr); delete [] reducedAMatSize; //------------------------------------------------------------------ // load the reducedA matrix //------------------------------------------------------------------ rowCount = 0; newColInd = new int[maxRowSize+1]; newColVal = new double[maxRowSize+1]; for ( irow = startRow; irow <= newEndRow; irow++ ) { searchIndex = hypre_BinarySearch(slaveEqnList_, irow, nConstraints); rowIndex = reducedAStartRow + rowCount; if ( searchIndex >= 0 ) { newRowSize = 1; newColInd[0] = reducedAStartRow + rowCount; newColVal[0] = 1.0; } else { HYPRE_ParCSRMatrixGetRow(A_csr, irow, &rowSize, &colInd, &colVal); HYPRE_ParCSRMatrixGetRow(RAP_csr,rowIndex,&rowSize2,&colInd2, &colVal2); newRowSize = rowSize + rowSize2; ncnt = 0; for ( jcol = 0; jcol < rowSize; jcol++ ) { colIndex = colInd[jcol]; for ( procIndex = 0; procIndex < nprocs; procIndex++ ) if ( procNRows[procIndex] > colIndex ) break; uBound = procNRows[procIndex] - (procNConstr_[procIndex]-procNConstr_[procIndex-1]); procIndex--; if ( colIndex < uBound ) { searchIndex = hypre_BinarySearch(gSlaveEqnList_, colIndex, globalNConstr); if ( searchIndex < 0 ) { newColInd[ncnt] = colIndex - procNConstr_[procIndex]; newColVal[ncnt++] = colVal[jcol]; } } } for ( jcol = 0; jcol < rowSize2; jcol++ ) { newColInd[ncnt+jcol] = colInd2[jcol]; newColVal[ncnt+jcol] = - colVal2[jcol]; } newRowSize = ncnt + rowSize2; hypre_qsort1(newColInd, newColVal, 0, newRowSize-1); ncnt = 0; for ( jcol = 0; jcol < newRowSize; jcol++ ) { if ( jcol != ncnt && newColInd[jcol] == newColInd[ncnt] ) newColVal[ncnt] += newColVal[jcol]; else if ( newColInd[jcol] != newColInd[ncnt] ) { ncnt++; newColVal[ncnt] = newColVal[jcol]; newColInd[ncnt] = newColInd[jcol]; } } newRowSize = ncnt + 1; HYPRE_ParCSRMatrixRestoreRow(A_csr,irow,&rowSize,&colInd,&colVal); HYPRE_ParCSRMatrixRestoreRow(RAP_csr,rowIndex,&rowSize2,&colInd2, &colVal2); } ierr = HYPRE_IJMatrixSetValues(reducedAmat_, 1, &newRowSize, (const int *) &rowIndex, (const int *) newColInd, (const double *) newColVal); hypre_assert(!ierr); rowCount++; } delete [] newColInd; delete [] newColVal; //------------------------------------------------------------------ // assemble the reduced matrix //------------------------------------------------------------------ HYPRE_IJMatrixAssemble(reducedAmat_); HYPRE_IJMatrixGetObject(reducedAmat_, (void **) &reducedA_csr); if ( ( outputLevel_ & HYPRE_BITMASK2 ) >= 5 ) { MPI_Barrier(mpiComm_); ncnt = 0; while ( ncnt < nprocs ) { if ( mypid == ncnt ) { printf("====================================================\n"); printf("%4d : Printing reducedA matrix... \n", mypid); fflush(stdout); for ( irow = reducedAStartRow; irow < reducedAStartRow+localNRows-nConstraints; irow++ ) { //printf("%d : reducedA ROW %d\n", mypid, irow); ierr = HYPRE_ParCSRMatrixGetRow(reducedA_csr,irow,&rowSize, &colInd, &colVal); //hypre_qsort1(colInd, colVal, 0, rowSize-1); for ( jcol = 0; jcol < rowSize; jcol++ ) if ( colVal[jcol] != 0.0 ) printf("%6d %6d %25.8e \n",irow+1,colInd[jcol]+1, colVal[jcol]); HYPRE_ParCSRMatrixRestoreRow(reducedA_csr,irow,&rowSize, &colInd, &colVal); } printf("====================================================\n"); } MPI_Barrier(mpiComm_); ncnt++; } } //------------------------------------------------------------------ // store away matrix and clean up //------------------------------------------------------------------ free( procNRows ); HYPRE_ParCSRMatrixDestroy(RAP_csr); return 0; } hypre-2.33.0/src/FEI_mv/fei-hypre/HYPRE_SlideReduction.h000066400000000000000000000063561477326011500225670ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ // ************************************************************************** // This is the class that handles slide surface reduction // ************************************************************************** #ifndef __HYPRE_SLIDEREDUCTION__ #define __HYPRE_SLIDEREDUCTION__ // ************************************************************************** // system libraries used // -------------------------------------------------------------------------- #include "utilities/_hypre_utilities.h" #include "IJ_mv/_hypre_IJ_mv.h" #include "parcsr_mv/_hypre_parcsr_mv.h" // ************************************************************************** // class definition // -------------------------------------------------------------------------- class HYPRE_SlideReduction { MPI_Comm mpiComm_; HYPRE_IJMatrix Amat_; HYPRE_IJMatrix A21mat_; HYPRE_IJMatrix invA22mat_; HYPRE_IJMatrix reducedAmat_; HYPRE_IJVector reducedBvec_; HYPRE_IJVector reducedXvec_; HYPRE_IJVector reducedRvec_; int outputLevel_; int *procNConstr_; int *slaveEqnList_; int *slaveEqnListAux_; int *gSlaveEqnList_; int *gSlaveEqnListAux_; int *constrBlkInfo_; int *constrBlkSizes_; int *eqnStatuses_; double blockMinNorm_; HYPRE_ParCSRMatrix hypreRAP_; double truncTol_; double *ADiagISqrts_; int scaleMatrixFlag_; int useSimpleScheme_; public: HYPRE_SlideReduction(MPI_Comm); virtual ~HYPRE_SlideReduction(); int setOutputLevel(int level); int setUseSimpleScheme(); int setTruncationThreshold(double trunc); int setScaleMatrix(); int setBlockMinNorm(double norm); int getMatrixNumRows(); double *getMatrixDiagonal(); int getReducedMatrix(HYPRE_IJMatrix *mat); int getReducedRHSVector(HYPRE_IJVector *rhs); int getReducedSolnVector(HYPRE_IJVector *sol); int getReducedAuxVector(HYPRE_IJVector *auxV); int getProcConstraintMap(int **map); int getSlaveEqnList(int **slist); int getPerturbationMatrix(HYPRE_ParCSRMatrix *matrix); int setup(HYPRE_IJMatrix , HYPRE_IJVector , HYPRE_IJVector ); int buildReducedSolnVector(HYPRE_IJVector x, HYPRE_IJVector b); int buildModifiedSolnVector(HYPRE_IJVector x); private: int findConstraints(); int findSlaveEqns1(); int findSlaveEqnsBlock(int blkSize); int composeGlobalList(); int buildSubMatrices(); int buildModifiedRHSVector(HYPRE_IJVector, HYPRE_IJVector); int buildReducedMatrix(); int buildReducedRHSVector(HYPRE_IJVector); int buildA21Mat(); int buildInvA22Mat(); int scaleMatrixVector(); double matrixCondEst(int, int, int *, int); int findSlaveEqns2(int **couplings); int buildReducedMatrix2(); }; #endif hypre-2.33.0/src/FEI_mv/fei-hypre/HYPRE_fei_matrix.cxx000066400000000000000000000052241477326011500223450ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * HYPRE_fei_matrix functions * *****************************************************************************/ #include #include #include #include "IJ_mv/HYPRE_IJ_mv.h" #include "parcsr_mv/HYPRE_parcsr_mv.h" #include "fei_mv.h" //NEW FEI 2.23.02 #include "fei_Data.hpp" /*****************************************************************************/ /* HYPRE_FEMatrixCreate function */ /*---------------------------------------------------------------------------*/ extern "C" int HYPRE_FEMatrixCreate(MPI_Comm comm, HYPRE_FEMesh mesh, HYPRE_FEMatrix *matrix) { HYPRE_FEMatrix myMatrix; myMatrix = (HYPRE_FEMatrix) hypre_TAlloc(HYPRE_FEMatrix, 1, HYPRE_MEMORY_HOST); myMatrix->comm_ = comm; myMatrix->mesh_ = mesh; (*matrix) = myMatrix; return 0; } /*****************************************************************************/ /* HYPRE_FEMatrixDestroy - Destroy a FEMatrix object. */ /*---------------------------------------------------------------------------*/ extern "C" int HYPRE_FEMatrixDestroy(HYPRE_FEMatrix matrix) { if (matrix) { free(matrix); } return 0; } /*****************************************************************************/ /* HYPRE_FEMatrixGetObject */ /*---------------------------------------------------------------------------*/ extern "C" int HYPRE_FEMatrixGetObject(HYPRE_FEMatrix matrix, void **object) { int ierr=0; HYPRE_FEMesh mesh; LinearSystemCore* lsc; Data dataObj; HYPRE_IJMatrix A; HYPRE_ParCSRMatrix ACSR; if (matrix == NULL) ierr = 1; else { mesh = matrix->mesh_; if (mesh == NULL) ierr = 1; else { lsc = (LinearSystemCore *) mesh->linSys_; if (lsc != NULL) { lsc->copyOutMatrix(1.0e0, dataObj); A = (HYPRE_IJMatrix) dataObj.getDataPtr(); HYPRE_IJMatrixGetObject(A, (void **) &ACSR); (*object) = (void *) ACSR; } else { (*object) = NULL; ierr = 1; } } } return ierr; } hypre-2.33.0/src/FEI_mv/fei-hypre/HYPRE_fei_mesh.cxx000066400000000000000000000454511477326011500220030ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * HYPRE_fei_matrix functions * *****************************************************************************/ #include #include #include #ifdef HAVE_FEI #include "FEI_Implementation.h" #endif #include "LLNL_FEI_Impl.h" #include "fei_mv.h" /*****************************************************************************/ /* HYPRE_FEMeshCreate function */ /*---------------------------------------------------------------------------*/ extern "C" int HYPRE_FEMeshCreate(MPI_Comm comm, HYPRE_FEMesh *meshptr) { HYPRE_FEMesh myMesh; myMesh = (HYPRE_FEMesh) hypre_TAlloc(HYPRE_FEMesh, 1, HYPRE_MEMORY_HOST); myMesh->comm_ = comm; myMesh->linSys_ = NULL; myMesh->feiPtr_ = NULL; myMesh->objectType_ = -1; (*meshptr) = myMesh; return 0; } /*****************************************************************************/ /* HYPRE_FEMatrixDestroy - Destroy a FEMatrix object. */ /*---------------------------------------------------------------------------*/ extern "C" int HYPRE_FEMeshDestroy(HYPRE_FEMesh mesh) { LLNL_FEI_Impl *fei; LinearSystemCore *lsc; if (mesh) { if (mesh->feiPtr_ != NULL && mesh->objectType_ == 1) { fei = (LLNL_FEI_Impl *) mesh->feiPtr_; delete fei; } if (mesh->linSys_ != NULL && mesh->objectType_ == 1) { lsc = (LinearSystemCore *) mesh->linSys_; delete lsc; } free(mesh); } return 0; } /*****************************************************************************/ /* HYPRE_FEMatrixSetFEIObject */ /*---------------------------------------------------------------------------*/ extern "C" int HYPRE_FEMeshSetFEIObject(HYPRE_FEMesh mesh, void *feiObj, void *lscObj) { int numParams=1; char *paramString[1]; LLNL_FEI_Impl *fei; if (mesh != NULL) { #ifdef HAVE_FEI if (feiObj != NULL) { mesh->feiPtr_ = feiObj; mesh->linSys_ = lscObj; if (lscObj == NULL) { printf("HYPRE_FEMeshSetObject ERROR : lscObj not given.\n"); mesh->feiPtr_ = NULL; return 1; } mesh->objectType_ = 2; } else { fei = (LLNL_FEI_Impl *) new LLNL_FEI_Impl(mesh->comm_); paramString[0] = new char[100]; strcpy(paramString[0], "externalSolver HYPRE"); fei->parameters(numParams, paramString); mesh->linSys_ = (void *) fei->lscPtr_->lsc_; mesh->feiPtr_ = (void *) fei; mesh->objectType_ = 1; delete [] paramString[0]; } #else fei = (LLNL_FEI_Impl *) new LLNL_FEI_Impl(mesh->comm_); paramString[0] = new char[100]; strcpy(paramString[0], "externalSolver HYPRE"); fei->parameters(numParams, paramString); mesh->linSys_ = (void *) fei->lscPtr_->lsc_; mesh->feiPtr_ = (void *) fei; mesh->objectType_ = 1; delete [] paramString[0]; #endif } return 0; } /*****************************************************************************/ /* HYPRE_FEMeshParameters */ /*---------------------------------------------------------------------------*/ extern "C" int HYPRE_FEMeshParameters(HYPRE_FEMesh mesh, int numParams, char **paramStrings) { LLNL_FEI_Impl *fei1; #ifdef HAVE_FEI FEI_Implementation *fei2; #endif int ierr=1; if ((mesh != NULL) && (mesh->feiPtr_ != NULL)) { #ifdef HAVE_FEI if (mesh->objectType_ == 1) { fei1 = (LLNL_FEI_Impl *) mesh->feiPtr_; ierr = fei1->parameters(numParams, paramStrings); } if (mesh->objectType_ == 2) { fei2 = (FEI_Implementation *) mesh->feiPtr_; ierr = fei2->parameters(numParams, paramStrings); } #else fei1 = (LLNL_FEI_Impl *) mesh->feiPtr_; ierr = fei1->parameters(numParams, paramStrings); #endif } return ierr; } /*****************************************************************************/ /* HYPRE_FEMeshInitFields */ /*---------------------------------------------------------------------------*/ extern "C" int HYPRE_FEMeshInitFields(HYPRE_FEMesh mesh, int numFields, int *fieldSizes, int *fieldIDs) { LLNL_FEI_Impl *fei1; #ifdef HAVE_FEI FEI_Implementation *fei2; #endif int ierr=1; if ((mesh != NULL) && (mesh->feiPtr_ != NULL)) { #ifdef HAVE_FEI if (mesh->objectType_ == 1) { fei1 = (LLNL_FEI_Impl *) mesh->feiPtr_; ierr = fei1->initFields(numFields, fieldSizes, fieldIDs); } if (mesh->objectType_ == 2) { fei2 = (FEI_Implementation *) mesh->feiPtr_; ierr = fei2->initFields(numFields, fieldSizes, fieldIDs); } #else fei1 = (LLNL_FEI_Impl *) mesh->feiPtr_; ierr = fei1->initFields(numFields, fieldSizes, fieldIDs); #endif } return ierr; } /*****************************************************************************/ /* HYPRE_FEMeshInitElemBlock */ /*---------------------------------------------------------------------------*/ extern "C" int HYPRE_FEMeshInitElemBlock(HYPRE_FEMesh mesh, int blockID, int nElements, int numNodesPerElement, int *numFieldsPerNode, int **nodalFieldIDs, int numElemDOFFieldsPerElement, int *elemDOFFieldIDs, int interleaveStrategy ) { int ierr=1; LLNL_FEI_Impl *fei1; #ifdef HAVE_FEI FEI_Implementation *fei2; #endif if ((mesh != NULL) && (mesh->feiPtr_ != NULL)) { #ifdef HAVE_FEI if (mesh->objectType_ == 1) { fei1 = (LLNL_FEI_Impl *) mesh->feiPtr_; ierr = fei1->initElemBlock(blockID, nElements, numNodesPerElement, numFieldsPerNode, nodalFieldIDs, numElemDOFFieldsPerElement, elemDOFFieldIDs, interleaveStrategy); } if (mesh->objectType_ == 2) { fei2 = (FEI_Implementation *) mesh->feiPtr_; ierr = fei2->initElemBlock(blockID, nElements, numNodesPerElement, numFieldsPerNode, nodalFieldIDs, numElemDOFFieldsPerElement, elemDOFFieldIDs, interleaveStrategy); } #else fei1 = (LLNL_FEI_Impl *) mesh->feiPtr_; ierr = fei1->initElemBlock(blockID, nElements, numNodesPerElement, numFieldsPerNode, nodalFieldIDs, numElemDOFFieldsPerElement, elemDOFFieldIDs, interleaveStrategy); #endif } return ierr; } /*****************************************************************************/ /* HYPRE_FEMeshInitElem */ /*---------------------------------------------------------------------------*/ extern "C" int HYPRE_FEMeshInitElem(HYPRE_FEMesh mesh, int blockID, int elemID, int *elemConn) { int ierr=1; LLNL_FEI_Impl *fei1; #ifdef HAVE_FEI FEI_Implementation *fei2; #endif if ((mesh != NULL) && (mesh->feiPtr_ != NULL)) { #ifdef HAVE_FEI if (mesh->objectType_ == 1) { fei1 = (LLNL_FEI_Impl *) mesh->feiPtr_; ierr = fei1->initElem(blockID, elemID, elemConn); } if (mesh->objectType_ == 2) { fei2 = (FEI_Implementation *) mesh->feiPtr_; ierr = fei2->initElem(blockID, elemID, elemConn); } #else fei1 = (LLNL_FEI_Impl *) mesh->feiPtr_; ierr = fei1->initElem(blockID, elemID, elemConn); #endif } return ierr; } /*****************************************************************************/ /* HYPRE_FEMeshInitSharedNodes */ /*---------------------------------------------------------------------------*/ extern "C" int HYPRE_FEMeshInitSharedNodes(HYPRE_FEMesh mesh, int nShared, int* sharedIDs, int* sharedLeng, int** sharedProcs) { int ierr=1; LLNL_FEI_Impl *fei1; #ifdef HAVE_FEI FEI_Implementation *fei2; #endif if ((mesh != NULL) && (mesh->feiPtr_ != NULL)) { #ifdef HAVE_FEI if (mesh->objectType_ == 1) { fei1 = (LLNL_FEI_Impl *) mesh->feiPtr_; ierr = fei1->initSharedNodes(nShared, sharedIDs, sharedLeng, sharedProcs); } if (mesh->objectType_ == 2) { fei2 = (FEI_Implementation *) mesh->feiPtr_; ierr = fei2->initSharedNodes(nShared, sharedIDs, sharedLeng, sharedProcs); } #else fei1 = (LLNL_FEI_Impl *) mesh->feiPtr_; ierr = fei1->initSharedNodes(nShared, sharedIDs, sharedLeng, sharedProcs); #endif } return ierr; } /*****************************************************************************/ /* HYPRE_FEMeshInitComplete */ /*---------------------------------------------------------------------------*/ extern "C" int HYPRE_FEMeshInitComplete(HYPRE_FEMesh mesh) { int ierr=1; LLNL_FEI_Impl *fei1; #ifdef HAVE_FEI FEI_Implementation *fei2; #endif if ((mesh != NULL) && (mesh->feiPtr_ != NULL)) { #ifdef HAVE_FEI if (mesh->objectType_ == 1) { fei1 = (LLNL_FEI_Impl *) mesh->feiPtr_; ierr = fei1->initComplete(); } if (mesh->objectType_ == 2) { fei2 = (FEI_Implementation *) mesh->feiPtr_; ierr = fei2->initComplete(); } #else fei1 = (LLNL_FEI_Impl *) mesh->feiPtr_; ierr = fei1->initComplete(); #endif } return ierr; } /*****************************************************************************/ /* HYPRE_FEMeshLoadNodeBCs */ /*---------------------------------------------------------------------------*/ extern "C" int HYPRE_FEMeshLoadNodeBCs(HYPRE_FEMesh mesh, int nNodes, int* nodeIDs, int fieldID, double** alpha, double** beta, double** gamma) { int ierr=1; LLNL_FEI_Impl *fei1; #ifdef HAVE_FEI FEI_Implementation *fei2; #endif if ((mesh != NULL) && (mesh->feiPtr_ != NULL)) { #ifdef HAVE_FEI if (mesh->objectType_ == 1) { fei1 = (LLNL_FEI_Impl *) mesh->feiPtr_; ierr = fei1->loadNodeBCs(nNodes,nodeIDs,fieldID,alpha,beta,gamma); } if (mesh->objectType_ == 2) { fei2 = (FEI_Implementation *) mesh->feiPtr_; ierr = fei2->loadNodeBCs(nNodes,nodeIDs,fieldID,alpha,beta,gamma); } #else fei1 = (LLNL_FEI_Impl *) mesh->feiPtr_; ierr = fei1->loadNodeBCs(nNodes,nodeIDs,fieldID,alpha,beta,gamma); #endif } return ierr; } /*****************************************************************************/ /* HYPRE_FEMeshSumInElem */ /*---------------------------------------------------------------------------*/ extern "C" int HYPRE_FEMeshSumInElem(HYPRE_FEMesh mesh, int blockID, int elemID, int* elemConn, double** elemStiffness, double *elemLoad, int elemFormat) { int ierr=1; LLNL_FEI_Impl *fei1; #ifdef HAVE_FEI FEI_Implementation *fei2; #endif if ((mesh != NULL) && (mesh->feiPtr_ != NULL)) { #ifdef HAVE_FEI if (mesh->objectType_ == 1) { fei1 = (LLNL_FEI_Impl *) mesh->feiPtr_; ierr = fei1->sumInElem(blockID, elemID, elemConn, elemStiffness, elemLoad, elemFormat); } if (mesh->objectType_ == 2) { fei2 = (FEI_Implementation *) mesh->feiPtr_; ierr = fei2->sumInElem(blockID, elemID, elemConn, elemStiffness, elemLoad, elemFormat); } #else fei1 = (LLNL_FEI_Impl *) mesh->feiPtr_; ierr = fei1->sumInElem(blockID, elemID, elemConn, elemStiffness, elemLoad, elemFormat); #endif } return ierr; } /*****************************************************************************/ /* HYPRE_FEMeshSumInElemMatrix */ /*---------------------------------------------------------------------------*/ extern "C" int HYPRE_FEMeshSumInElemMatrix(HYPRE_FEMesh mesh, int blockID, int elemID, int* elemConn, double** elemStiffness, int elemFormat) { int ierr=1; LLNL_FEI_Impl *fei1; #ifdef HAVE_FEI FEI_Implementation *fei2; #endif if ((mesh != NULL) && (mesh->feiPtr_ != NULL)) { #ifdef HAVE_FEI if (mesh->objectType_ == 1) { fei1 = (LLNL_FEI_Impl *) mesh->feiPtr_; ierr = fei1->sumInElemMatrix(blockID, elemID, elemConn, elemStiffness, elemFormat); } if (mesh->objectType_ == 2) { fei2 = (FEI_Implementation *) mesh->feiPtr_; ierr = fei2->sumInElemMatrix(blockID, elemID, elemConn, elemStiffness, elemFormat); } #else fei1 = (LLNL_FEI_Impl *) mesh->feiPtr_; ierr = fei1->sumInElemMatrix(blockID, elemID, elemConn, elemStiffness, elemFormat); #endif } return ierr; } /*****************************************************************************/ /* HYPRE_FEMeshSumInElemRHS */ /*---------------------------------------------------------------------------*/ extern "C" int HYPRE_FEMeshSumInElemRHS(HYPRE_FEMesh mesh, int blockID, int elemID, int* elemConn, double* elemLoad) { int ierr=1; LLNL_FEI_Impl *fei1; #ifdef HAVE_FEI FEI_Implementation *fei2; #endif if ((mesh != NULL) && (mesh->feiPtr_ != NULL)) { #ifdef HAVE_FEI if (mesh->objectType_ == 1) { fei1 = (LLNL_FEI_Impl *) mesh->feiPtr_; ierr = fei1->sumInElemRHS(blockID, elemID, elemConn, elemLoad); } if (mesh->objectType_ == 2) { fei2 = (FEI_Implementation *) mesh->feiPtr_; ierr = fei2->sumInElemRHS(blockID, elemID, elemConn, elemLoad); } #else fei1 = (LLNL_FEI_Impl *) mesh->feiPtr_; ierr = fei1->sumInElemRHS(blockID, elemID, elemConn, elemLoad); #endif } return ierr; } /*****************************************************************************/ /* HYPRE_FEMeshLoadComplete */ /*---------------------------------------------------------------------------*/ extern "C" int HYPRE_FEMeshLoadComplete(HYPRE_FEMesh mesh) { int ierr=1; LLNL_FEI_Impl *fei1; #ifdef HAVE_FEI FEI_Implementation *fei2; #endif if ((mesh != NULL) && (mesh->feiPtr_ != NULL)) { #ifdef HAVE_FEI if (mesh->objectType_ == 1) { fei1 = (LLNL_FEI_Impl *) mesh->feiPtr_; ierr = fei1->loadComplete(); } if (mesh->objectType_ == 2) { fei2 = (FEI_Implementation *) mesh->feiPtr_; ierr = fei2->loadComplete(); } #else fei1 = (LLNL_FEI_Impl *) mesh->feiPtr_; ierr = fei1->loadComplete(); #endif } return ierr; } /*****************************************************************************/ /* HYPRE_FEMeshSolve */ /*---------------------------------------------------------------------------*/ extern "C" int HYPRE_FEMeshSolve(HYPRE_FEMesh mesh) { int ierr=1; LLNL_FEI_Impl *fei1; #ifdef HAVE_FEI FEI_Implementation *fei2; #endif if ((mesh != NULL) && (mesh->feiPtr_ != NULL)) { #ifdef HAVE_FEI if (mesh->objectType_ == 1) { fei1 = (LLNL_FEI_Impl *) mesh->feiPtr_; fei1->solve(&ierr); } if (mesh->objectType_ == 2) { fei2 = (FEI_Implementation *) mesh->feiPtr_; fei2->solve(&ierr); } #else fei1 = (LLNL_FEI_Impl *) mesh->feiPtr_; fei1->solve(&ierr); #endif } return ierr; } /*****************************************************************************/ /* HYPRE_FEMeshGetBlockNodeIDList */ /*---------------------------------------------------------------------------*/ extern "C" int HYPRE_FEMeshGetBlockNodeIDList(HYPRE_FEMesh mesh, int blockID, int numNodes, int *nodeIDList) { int ierr=1; LLNL_FEI_Impl *fei1; #ifdef HAVE_FEI FEI_Implementation *fei2; #endif if ((mesh != NULL) && (mesh->feiPtr_ != NULL)) { #ifdef HAVE_FEI if (mesh->objectType_ == 1) { fei1 = (LLNL_FEI_Impl *) mesh->feiPtr_; ierr = -9999; fei1->solve(&ierr); ierr = 1; ierr = fei1->getBlockNodeIDList(blockID, numNodes, nodeIDList); } if (mesh->objectType_ == 2) { fei2 = (FEI_Implementation *) mesh->feiPtr_; ierr = fei2->getBlockNodeIDList(blockID, numNodes, nodeIDList); } #else fei1 = (LLNL_FEI_Impl *) mesh->feiPtr_; ierr = -9999; ierr = fei1->getBlockNodeIDList(blockID, numNodes, nodeIDList); ierr = 1; #endif } return ierr; } /*****************************************************************************/ /* HYPRE_FEMeshGetBlockNodeSolution */ /*---------------------------------------------------------------------------*/ extern "C" int HYPRE_FEMeshGetBlockNodeSolution(HYPRE_FEMesh mesh, int blockID, int numNodes, int *nodeIDList, int *solnOffsets, double *solnValues) { int ierr=1; LLNL_FEI_Impl *fei1; #ifdef HAVE_FEI FEI_Implementation *fei2; #endif if ((mesh != NULL) && (mesh->feiPtr_ != NULL)) { #ifdef HAVE_FEI if (mesh->objectType_ == 1) { fei1 = (LLNL_FEI_Impl *) mesh->feiPtr_; ierr = fei1->getBlockNodeSolution(blockID, numNodes, nodeIDList, solnOffsets, solnValues); } if (mesh->objectType_ == 2) { fei2 = (FEI_Implementation *) mesh->feiPtr_; ierr = fei2->getBlockNodeSolution(blockID, numNodes, nodeIDList, solnOffsets, solnValues); } #else fei1 = (LLNL_FEI_Impl *) mesh->feiPtr_; ierr = fei1->getBlockNodeSolution(blockID, numNodes, nodeIDList, solnOffsets, solnValues); #endif } return ierr; } hypre-2.33.0/src/FEI_mv/fei-hypre/HYPRE_fei_mv.h000066400000000000000000000121611477326011500211060ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #ifndef HYPRE_FE_MV_HEADER #define HYPRE_FE_MV_HEADER #include "HYPRE_utilities.h" #ifdef __cplusplus extern "C" { #endif /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ /** * @name FEI System Interface * * This interface represents a FE conceptual view of a * linear system. * * @memo A FE conceptual interface **/ /*@{*/ /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ /** * @name FE Mesh **/ /*@{*/ struct hypre_FEMesh_struct; typedef struct hypre_FEMesh_struct *HYPRE_FEMesh; /** * Create a FE Mesh object. **/ int HYPRE_FEMeshCreate(MPI_Comm comm, HYPRE_FEMesh *mesh); /** * Destroy an FE Mesh object. An object should be explicitly destroyed * using this destructor when the user's code no longer needs direct * access to it. **/ int HYPRE_FEMeshDestroy(HYPRE_FEMesh mesh); /** * load an FE object **/ int HYPRE_FEMeshSetFEObject(HYPRE_FEMesh mesh, void *, void *); /** * initialize all fields in the finite element mesh **/ int HYPRE_FEMeshInitFields(HYPRE_FEMesh mesh, int numFields, int *fieldSizes, int *fieldIDs); /** * initialize an element block **/ int HYPRE_FEMeshInitElemBlock(HYPRE_FEMesh mesh, int blockID, int nElements, int numNodesPerElement, int *numFieldsPerNode, int **nodalFieldIDs, int numElemDOFFieldsPerElement, int *elemDOFFieldIDs, int interleaveStrategy); /** * initialize the connectivity of a given element **/ int HYPRE_FEMeshInitElem(HYPRE_FEMesh mesh, int blockID, int elemID, int *elemConn); /** * initialize the shared nodes between processors **/ int HYPRE_FEMeshInitSharedNodes(HYPRE_FEMesh mesh, int nShared, int *sharedIDs, int *sharedLeng, int **sharedProcs); /** * initialization complete **/ int HYPRE_FEMeshInitComplete(HYPRE_FEMesh mesh); /** * load node boundary conditions **/ int HYPRE_FEMeshLoadNodeBCs(HYPRE_FEMesh mesh, int numNodes, int *nodeIDs, int fieldID, double **alpha, double **beta, double **gamma); /*@}*/ /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ /** * @name FE Matrices **/ /*@{*/ struct hypre_FEMatrix_struct; /** * The matrix object **/ typedef struct hypre_FEMatrix_struct *HYPRE_FEMatrix; /** * create a new FE matrix **/ int HYPRE_FEMatrixCreate(MPI_Comm comm, HYPRE_FEMesh mesh, HYPRE_FEMatrix *matrix); /** * destroy a new FE matrix **/ int HYPRE_FEMatrixDestroy(HYPRE_FEMatrix matrix); /** * prepare a matrix object for setting coefficient values **/ int HYPRE_FEMatrixInitialize(HYPRE_FEMatrix matrix); /** * signal that loading has been completed **/ int HYPRE_FEMatrixAssemble(HYPRE_FEMatrix matrix); /** * Set the storage type of the matrix object to be constructed. * Currently, {\tt type} can only be {\tt HYPRE\_PARCSR} (default). * **/ int HYPRE_FEMatrixSetObjectType(HYPRE_FEMatrix matrix, int type); /** * Get a reference to the constructed matrix object. * * @see HYPRE_FEMatrixSetObjectType **/ int HYPRE_FEMatrixGetObject(HYPRE_FEMatrix matrix, void **object); /*@}*/ /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ /** * @name FE Vectors **/ /*@{*/ struct hypre_FEVector_struct; /** * The vector object. **/ typedef struct hypre_FEVector_struct *HYPRE_FEVector; /** * Create a vector object. **/ int HYPRE_FEVectorCreate(MPI_Comm comm, HYPRE_FEMesh mesh, HYPRE_FEVector *vector); /** * Destroy a vector object. **/ int HYPRE_FEVectorDestroy(HYPRE_FEVector vector); /** * Prepare a vector object for setting coefficient values. **/ int HYPRE_FEVectorInitialize(HYPRE_FEVector vector); /** * Finalize the construction of the vector before using. **/ int HYPRE_FEVectorAssemble(HYPRE_FEVector vector); /** * Set the storage type of the vector object to be constructed. * Currently, {\tt type} can only be {\tt HYPRE\_PARCSR} (default). **/ int HYPRE_FEVectorSetObjectType(HYPRE_FEVector vector, int type); /** * Get a reference to the constructed vector object. **/ int HYPRE_FEVectorGetObject(HYPRE_FEVector vector, void **object); /*@}*/ /*@}*/ /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ #ifdef __cplusplus } #endif #endif hypre-2.33.0/src/FEI_mv/fei-hypre/HYPRE_fei_vector.cxx000066400000000000000000000103561477326011500223450ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * HYPRE_fei_vector functions * *****************************************************************************/ #include #include #include #ifdef HAVE_FEI #include "FEI_Implementation.h" #endif #include "LLNL_FEI_Impl.h" #include "fei_mv.h" //New FEI 2.23.02 #include "fei_Data.hpp" #include "IJ_mv/HYPRE_IJ_mv.h" #include "parcsr_mv/HYPRE_parcsr_mv.h" /*****************************************************************************/ /* HYPRE_FEVectorCreate function */ /*---------------------------------------------------------------------------*/ extern "C" int HYPRE_FEVectorCreate(MPI_Comm comm, HYPRE_FEMesh mesh, HYPRE_FEVector *vector) { HYPRE_FEVector myVector; myVector = (HYPRE_FEVector) hypre_TAlloc(HYPRE_FEVector, 1, HYPRE_MEMORY_HOST); myVector->mesh_ = mesh; myVector->comm_ = comm; (*vector) = myVector; return 0; } /*****************************************************************************/ /* HYPRE_FEVectorDestroy - Destroy a FEVector object. */ /*---------------------------------------------------------------------------*/ extern "C" int HYPRE_FEVectorDestroy(HYPRE_FEVector vector) { if (vector) { free(vector); } return 0; } /*****************************************************************************/ /* HYPRE_FEVectorGetRHS */ /*---------------------------------------------------------------------------*/ extern "C" int HYPRE_FEVectorGetRHS(HYPRE_FEVector vector, void **object) { int ierr=0; HYPRE_FEMesh mesh; LinearSystemCore* lsc; Data dataObj; HYPRE_IJVector X; HYPRE_ParVector XCSR; if (vector == NULL) ierr = 1; else { mesh = vector->mesh_; if (mesh == NULL) ierr = 1; else { lsc = (LinearSystemCore *) mesh->linSys_; if (lsc != NULL) { lsc->copyOutRHSVector(1.0e0, dataObj); X = (HYPRE_IJVector) dataObj.getDataPtr(); HYPRE_IJVectorGetObject(X, (void **) &XCSR); (*object) = (void *) XCSR; } else { (*object) = NULL; ierr = 1; } } } return ierr; } /*****************************************************************************/ /* HYPRE_FEVectorSetSol */ /*---------------------------------------------------------------------------*/ extern "C" int HYPRE_FEVectorSetSol(HYPRE_FEVector vector, void *object) { int ierr=0; HYPRE_FEMesh mesh; LinearSystemCore *lsc; Data dataObj; LLNL_FEI_Impl *fei1; #ifdef HAVE_FEI FEI_Implementation *fei2; #endif if (vector == NULL) ierr = 1; else { mesh = vector->mesh_; if (mesh == NULL) ierr = 1; else { lsc = (LinearSystemCore *) mesh->linSys_; if (lsc != NULL) { dataObj.setTypeName("Sol_Vector"); dataObj.setDataPtr((void*) object); lsc->copyInRHSVector(1.0e0, dataObj); if (mesh->feiPtr_ != NULL) { #ifdef HAVE_FEI if (mesh->objectType_ == 1) { fei1 = (LLNL_FEI_Impl *) mesh->feiPtr_; ierr = fei1->solve(&ierr); } if (mesh->objectType_ == 2) { fei2 = (FEI_Implementation *) mesh->feiPtr_; ierr = fei2->solve(&ierr); } #else fei1 = (LLNL_FEI_Impl *) mesh->feiPtr_; ierr = fei1->solve(&ierr); #endif } } else { ierr = 1; } } } return ierr; } hypre-2.33.0/src/FEI_mv/fei-hypre/HYPRE_parcsr_TFQmr.c000066400000000000000000000134711477326011500222040ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include #include #include #include #include "utilities/_hypre_utilities.h" #include "HYPRE.h" #include "IJ_mv/HYPRE_IJ_mv.h" #include "parcsr_mv/HYPRE_parcsr_mv.h" #include "parcsr_mv/_hypre_parcsr_mv.h" #include "parcsr_ls/HYPRE_parcsr_ls.h" #include "HYPRE_FEI.h" #include "_hypre_FEI.h" /****************************************************************************** * * HYPRE_ParCSRTFQmr interface * *****************************************************************************/ //extern void *hypre_TFQmrCreate(); //extern int hypre_TFQmrDestroy(void *); //extern int hypre_TFQmrSetup(void *, void *, void *, void *); //extern int hypre_TFQmrSolve(void *, void *, void *, void *); //extern int hypre_TFQmrSetTol(void *, double); //extern int hypre_TFQmrSetMaxIter(void *, int); //extern int hypre_TFQmrSetStopCrit(void *, int); //extern int hypre_TFQmrSetPrecond(void *, int (*precond)(void*,void*,void*,void*), // int (*precond_setup)(void*,void*,void*,void*), void *); //extern int hypre_TFQmrSetLogging(void *, int); //extern int hypre_TFQmrGetNumIterations(void *, int *); //extern int hypre_TFQmrGetFinalRelativeResidualNorm(void *, double *); /*-------------------------------------------------------------------------- * HYPRE_ParCSRTFQmrCreate *--------------------------------------------------------------------------*/ int HYPRE_ParCSRTFQmrCreate( MPI_Comm comm, HYPRE_Solver *solver ) { *solver = (HYPRE_Solver) hypre_TFQmrCreate( ); return 0; } /*-------------------------------------------------------------------------- * HYPRE_ParCSRTFQmrDestroy *--------------------------------------------------------------------------*/ int HYPRE_ParCSRTFQmrDestroy( HYPRE_Solver solver ) { return( hypre_TFQmrDestroy( (void *) solver ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRTFQmrSetup *--------------------------------------------------------------------------*/ int HYPRE_ParCSRTFQmrSetup( HYPRE_Solver solver, HYPRE_ParCSRMatrix A, HYPRE_ParVector b, HYPRE_ParVector x ) { return( hypre_TFQmrSetup( (void *) solver, (void *) A, (void *) b, (void *) x ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRTFQmrSolve *--------------------------------------------------------------------------*/ int HYPRE_ParCSRTFQmrSolve( HYPRE_Solver solver, HYPRE_ParCSRMatrix A, HYPRE_ParVector b, HYPRE_ParVector x ) { return( hypre_TFQmrSolve( (void *) solver, (void *) A, (void *) b, (void *) x ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRTFQmrSetTol *--------------------------------------------------------------------------*/ int HYPRE_ParCSRTFQmrSetTol( HYPRE_Solver solver, double tol ) { return( hypre_TFQmrSetTol( (void *) solver, tol ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRTFQmrSetMaxIter *--------------------------------------------------------------------------*/ int HYPRE_ParCSRTFQmrSetMaxIter( HYPRE_Solver solver, int max_iter ) { return( hypre_TFQmrSetMaxIter( (void *) solver, max_iter ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRTFQmretStopCrit *--------------------------------------------------------------------------*/ int HYPRE_ParCSRTFQmrSetStopCrit( HYPRE_Solver solver, int stop_crit ) { return( hypre_TFQmrSetStopCrit( (void *) solver, stop_crit ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRTFQmrSetPrecond *--------------------------------------------------------------------------*/ int HYPRE_ParCSRTFQmrSetPrecond( HYPRE_Solver solver, int (*precond) (HYPRE_Solver sol, HYPRE_ParCSRMatrix matrix, HYPRE_ParVector b, HYPRE_ParVector x), int (*precond_setup)(HYPRE_Solver sol, HYPRE_ParCSRMatrix matrix, HYPRE_ParVector b, HYPRE_ParVector x), void *precond_data ) { return( hypre_TFQmrSetPrecond( (void *) solver, (HYPRE_Int (*)(void*,void*,void*,void*))precond, (HYPRE_Int (*)(void*,void*,void*,void*))precond_setup, precond_data ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRTFQmrSetLogging *--------------------------------------------------------------------------*/ int HYPRE_ParCSRTFQmrSetLogging( HYPRE_Solver solver, int logging) { return( hypre_TFQmrSetLogging( (void *) solver, logging ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRTFQmretNumIterations *--------------------------------------------------------------------------*/ int HYPRE_ParCSRTFQmrGetNumIterations(HYPRE_Solver solver,int *num_iterations) { return( hypre_TFQmrGetNumIterations( (void *) solver, num_iterations ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRTFQmrGetFinalRelativeResidualNorm *--------------------------------------------------------------------------*/ int HYPRE_ParCSRTFQmrGetFinalRelativeResidualNorm( HYPRE_Solver solver, double *norm ) { return( hypre_TFQmrGetFinalRelativeResidualNorm( (void *) solver, norm ) ); } hypre-2.33.0/src/FEI_mv/fei-hypre/HYPRE_parcsr_TFQmr.h000066400000000000000000000040141477326011500222020ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * HYPRE_ParCSRTFQmr interface * *****************************************************************************/ #ifndef __TFQMR__ #define __TFQMR__ #ifdef __cplusplus extern "C" { #endif extern int HYPRE_ParCSRTFQmrCreate( MPI_Comm comm, HYPRE_Solver *solver ); extern int HYPRE_ParCSRTFQmrDestroy( HYPRE_Solver solver ); extern int HYPRE_ParCSRTFQmrSetup(HYPRE_Solver solver,HYPRE_ParCSRMatrix A, HYPRE_ParVector b, HYPRE_ParVector x ); extern int HYPRE_ParCSRTFQmrSolve(HYPRE_Solver solver,HYPRE_ParCSRMatrix A, HYPRE_ParVector b, HYPRE_ParVector x ); extern int HYPRE_ParCSRTFQmrSetTol( HYPRE_Solver solver, double tol ); extern int HYPRE_ParCSRTFQmrSetMaxIter( HYPRE_Solver solver, int max_iter ); extern int HYPRE_ParCSRTFQmrSetStopCrit( HYPRE_Solver solver, int stop_crit ); extern int HYPRE_ParCSRTFQmrSetPrecond( HYPRE_Solver solver, int (*precond) (HYPRE_Solver sol, HYPRE_ParCSRMatrix matrix, HYPRE_ParVector b, HYPRE_ParVector x), int (*precond_setup)(HYPRE_Solver sol, HYPRE_ParCSRMatrix matrix, HYPRE_ParVector b, HYPRE_ParVector x), void *precond_data ); extern int HYPRE_ParCSRTFQmrSetLogging( HYPRE_Solver solver, int logging); extern int HYPRE_ParCSRTFQmrGetNumIterations(HYPRE_Solver solver, int *num_iterations); extern int HYPRE_ParCSRTFQmrGetFinalRelativeResidualNorm(HYPRE_Solver solver, double *norm ); #ifdef __cplusplus } #endif #endif hypre-2.33.0/src/FEI_mv/fei-hypre/HYPRE_parcsr_bicgs.c000066400000000000000000000116661477326011500223060ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include #include #include #include #include "utilities/_hypre_utilities.h" #include "HYPRE.h" #include "IJ_mv/HYPRE_IJ_mv.h" #include "parcsr_mv/HYPRE_parcsr_mv.h" #include "parcsr_mv/_hypre_parcsr_mv.h" #include "parcsr_ls/HYPRE_parcsr_ls.h" #include "HYPRE_FEI.h" #include "_hypre_FEI.h" /*-------------------------------------------------------------------------- * HYPRE_ParCSRBiCGSCreate *--------------------------------------------------------------------------*/ int HYPRE_ParCSRBiCGSCreate( MPI_Comm comm, HYPRE_Solver *solver ) { *solver = (HYPRE_Solver) hypre_BiCGSCreate( ); return 0; } /*-------------------------------------------------------------------------- * HYPRE_ParCSRBiCGSDestroy *--------------------------------------------------------------------------*/ int HYPRE_ParCSRBiCGSDestroy( HYPRE_Solver solver ) { return( hypre_BiCGSDestroy( (void *) solver ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRBiCGSSetup *--------------------------------------------------------------------------*/ int HYPRE_ParCSRBiCGSSetup( HYPRE_Solver solver, HYPRE_ParCSRMatrix A, HYPRE_ParVector b, HYPRE_ParVector x ) { return( hypre_BiCGSSetup( (void *) solver, (void *) A, (void *) b, (void *) x ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRBiCGSSolve *--------------------------------------------------------------------------*/ int HYPRE_ParCSRBiCGSSolve( HYPRE_Solver solver, HYPRE_ParCSRMatrix A, HYPRE_ParVector b, HYPRE_ParVector x ) { return( hypre_BiCGSSolve( (void *) solver, (void *) A, (void *) b, (void *) x ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRBiCGSSetTol *--------------------------------------------------------------------------*/ int HYPRE_ParCSRBiCGSSetTol( HYPRE_Solver solver, double tol ) { return( hypre_BiCGSSetTol( (void *) solver, tol ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRBiCGSSetMaxIter *--------------------------------------------------------------------------*/ int HYPRE_ParCSRBiCGSSetMaxIter( HYPRE_Solver solver, int max_iter ) { return( hypre_BiCGSSetMaxIter( (void *) solver, max_iter ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRBiCGSetStopCrit *--------------------------------------------------------------------------*/ int HYPRE_ParCSRBiCGSSetStopCrit( HYPRE_Solver solver, int stop_crit ) { return( hypre_BiCGSSetStopCrit( (void *) solver, stop_crit ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRBiCGSSetPrecond *--------------------------------------------------------------------------*/ int HYPRE_ParCSRBiCGSSetPrecond( HYPRE_Solver solver, int (*precond) (HYPRE_Solver sol, HYPRE_ParCSRMatrix matrix, HYPRE_ParVector b, HYPRE_ParVector x), int (*precond_setup)(HYPRE_Solver sol, HYPRE_ParCSRMatrix matrix, HYPRE_ParVector b, HYPRE_ParVector x), void *precond_data ) { return( hypre_BiCGSSetPrecond( (void *) solver, (HYPRE_Int (*)(void*,void*,void*,void*))precond, (HYPRE_Int (*)(void*,void*,void*,void*))precond_setup, precond_data ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRBiCGSSetLogging *--------------------------------------------------------------------------*/ int HYPRE_ParCSRBiCGSSetLogging( HYPRE_Solver solver, int logging) { return( hypre_BiCGSSetLogging( (void *) solver, logging ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRBiCGSetNumIterations *--------------------------------------------------------------------------*/ int HYPRE_ParCSRBiCGSGetNumIterations(HYPRE_Solver solver,int *num_iterations) { return( hypre_BiCGSGetNumIterations( (void *) solver, num_iterations ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRBiCGSGetFinalRelativeResidualNorm *--------------------------------------------------------------------------*/ int HYPRE_ParCSRBiCGSGetFinalRelativeResidualNorm( HYPRE_Solver solver, double *norm ) { return( hypre_BiCGSGetFinalRelativeResidualNorm( (void *) solver, norm ) ); } hypre-2.33.0/src/FEI_mv/fei-hypre/HYPRE_parcsr_bicgs.h000066400000000000000000000040201477326011500222750ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * HYPRE_ParCSRBiCGS interface * *****************************************************************************/ #ifndef __BICGS__ #define __BICGS__ #ifdef __cplusplus extern "C" { #endif extern int HYPRE_ParCSRBiCGSCreate( MPI_Comm comm, HYPRE_Solver *solver ); extern int HYPRE_ParCSRBiCGSDestroy( HYPRE_Solver solver ); extern int HYPRE_ParCSRBiCGSSetup(HYPRE_Solver solver,HYPRE_ParCSRMatrix A, HYPRE_ParVector b, HYPRE_ParVector x ); extern int HYPRE_ParCSRBiCGSSolve(HYPRE_Solver solver,HYPRE_ParCSRMatrix A, HYPRE_ParVector b, HYPRE_ParVector x ); extern int HYPRE_ParCSRBiCGSSetTol( HYPRE_Solver solver, double tol ); extern int HYPRE_ParCSRBiCGSSetMaxIter( HYPRE_Solver solver, int max_iter ); extern int HYPRE_ParCSRBiCGSSetStopCrit( HYPRE_Solver solver, int stop_crit ); extern int HYPRE_ParCSRBiCGSSetPrecond( HYPRE_Solver solver, int (*precond) (HYPRE_Solver sol, HYPRE_ParCSRMatrix matrix, HYPRE_ParVector b, HYPRE_ParVector x), int (*precond_setup)(HYPRE_Solver sol, HYPRE_ParCSRMatrix matrix, HYPRE_ParVector b, HYPRE_ParVector x), void *precond_data ); extern int HYPRE_ParCSRBiCGSSetLogging( HYPRE_Solver solver, int logging); extern int HYPRE_ParCSRBiCGSGetNumIterations(HYPRE_Solver solver, int *num_iterations); extern int HYPRE_ParCSRBiCGSGetFinalRelativeResidualNorm(HYPRE_Solver solver, double *norm ); #ifdef __cplusplus } #endif #endif hypre-2.33.0/src/FEI_mv/fei-hypre/HYPRE_parcsr_bicgstabl.c000066400000000000000000000145041477326011500231430ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include #include #include #include #include "utilities/_hypre_utilities.h" #include "HYPRE.h" #include "IJ_mv/HYPRE_IJ_mv.h" #include "parcsr_mv/HYPRE_parcsr_mv.h" #include "parcsr_mv/_hypre_parcsr_mv.h" #include "parcsr_ls/HYPRE_parcsr_ls.h" #include "HYPRE_FEI.h" #include "_hypre_FEI.h" /****************************************************************************** * * HYPRE_ParCSRBiCGSTABL interface * *****************************************************************************/ extern void *hypre_BiCGSTABLCreate(); extern int hypre_BiCGSTABLDestroy(void *); extern int hypre_BiCGSTABLSetup(void *, void *, void *, void *); extern int hypre_BiCGSTABLSolve(void *, void *, void *, void *); extern int hypre_BiCGSTABLSetTol(void *, double); extern int hypre_BiCGSTABLSetSize(void *, int); extern int hypre_BiCGSTABLSetMaxIter(void *, int); extern int hypre_BiCGSTABLSetStopCrit(void *, double); extern int hypre_BiCGSTABLSetPrecond(void *, int (*precond)(void*,void*,void*,void*), int (*precond_setup)(void*,void*,void*,void*), void *); extern int hypre_BiCGSTABLSetLogging(void *, int); extern int hypre_BiCGSTABLGetNumIterations(void *,int *); extern int hypre_BiCGSTABLGetFinalRelativeResidualNorm(void *, double *); /*-------------------------------------------------------------------------- * HYPRE_ParCSRBiCGSTABLCreate *--------------------------------------------------------------------------*/ int HYPRE_ParCSRBiCGSTABLCreate( MPI_Comm comm, HYPRE_Solver *solver ) { *solver = (HYPRE_Solver) hypre_BiCGSTABLCreate( ); return 0; } /*-------------------------------------------------------------------------- * HYPRE_ParCSRBiCGSTABLDestroy *--------------------------------------------------------------------------*/ int HYPRE_ParCSRBiCGSTABLDestroy( HYPRE_Solver solver ) { return( hypre_BiCGSTABLDestroy( (void *) solver ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRBiCGSTABLSetup *--------------------------------------------------------------------------*/ int HYPRE_ParCSRBiCGSTABLSetup( HYPRE_Solver solver, HYPRE_ParCSRMatrix A, HYPRE_ParVector b, HYPRE_ParVector x ) { return( hypre_BiCGSTABLSetup( (void *) solver, (void *) A, (void *) b, (void *) x ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRBiCGSTABLSolve *--------------------------------------------------------------------------*/ int HYPRE_ParCSRBiCGSTABLSolve( HYPRE_Solver solver, HYPRE_ParCSRMatrix A, HYPRE_ParVector b, HYPRE_ParVector x ) { return( hypre_BiCGSTABLSolve( (void *) solver, (void *) A, (void *) b, (void *) x ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRBiCGSTABLSetTol *--------------------------------------------------------------------------*/ int HYPRE_ParCSRBiCGSTABLSetTol( HYPRE_Solver solver, double tol ) { return( hypre_BiCGSTABLSetTol( (void *) solver, tol ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRBiCGSTABLSetSize *--------------------------------------------------------------------------*/ int HYPRE_ParCSRBiCGSTABLSetSize( HYPRE_Solver solver, int size ) { return( hypre_BiCGSTABLSetSize( (void *) solver, size ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRBiCGSTABLSetMaxIter *--------------------------------------------------------------------------*/ int HYPRE_ParCSRBiCGSTABLSetMaxIter( HYPRE_Solver solver, int max_iter ) { return( hypre_BiCGSTABLSetMaxIter( (void *) solver, max_iter ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRBiCGSTABSetStopCrit *--------------------------------------------------------------------------*/ int HYPRE_ParCSRBiCGSTABLSetStopCrit( HYPRE_Solver solver, int stop_crit ) { return( hypre_BiCGSTABLSetStopCrit( (void *) solver, stop_crit ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRBiCGSTABLSetPrecond *--------------------------------------------------------------------------*/ int HYPRE_ParCSRBiCGSTABLSetPrecond( HYPRE_Solver solver, int (*precond) (HYPRE_Solver sol, HYPRE_ParCSRMatrix matrix, HYPRE_ParVector b, HYPRE_ParVector x), int (*precond_setup)(HYPRE_Solver sol, HYPRE_ParCSRMatrix matrix, HYPRE_ParVector b, HYPRE_ParVector x), void *precond_data ) { return( hypre_BiCGSTABLSetPrecond( (void *) solver, (HYPRE_Int (*)(void*,void*,void*,void*))precond, (HYPRE_Int (*)(void*,void*,void*,void*))precond_setup, precond_data ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRBiCGSTABLSetLogging *--------------------------------------------------------------------------*/ int HYPRE_ParCSRBiCGSTABLSetLogging( HYPRE_Solver solver, int logging) { return( hypre_BiCGSTABLSetLogging( (void *) solver, logging ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRBiCGSTABGetNumIterations *--------------------------------------------------------------------------*/ int HYPRE_ParCSRBiCGSTABLGetNumIterations(HYPRE_Solver solver,int *num_iterations) { return( hypre_BiCGSTABLGetNumIterations( (void *) solver, num_iterations ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRBiCGSTABLGetFinalRelativeResidualNorm *--------------------------------------------------------------------------*/ int HYPRE_ParCSRBiCGSTABLGetFinalRelativeResidualNorm( HYPRE_Solver solver, double *norm ) { return( hypre_BiCGSTABLGetFinalRelativeResidualNorm( (void *) solver, norm ) ); } hypre-2.33.0/src/FEI_mv/fei-hypre/HYPRE_parcsr_bicgstabl.h000066400000000000000000000042131477326011500231440ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * HYPRE_ParCSRBiCGSTABL interface * *****************************************************************************/ #ifndef __CGSTABL__ #define __CGSTABL__ #ifdef __cplusplus extern "C" { #endif extern int HYPRE_ParCSRBiCGSTABLCreate( MPI_Comm comm, HYPRE_Solver *solver ); extern int HYPRE_ParCSRBiCGSTABLDestroy( HYPRE_Solver solver ); extern int HYPRE_ParCSRBiCGSTABLSetup(HYPRE_Solver solver,HYPRE_ParCSRMatrix A, HYPRE_ParVector b, HYPRE_ParVector x ); extern int HYPRE_ParCSRBiCGSTABLSolve(HYPRE_Solver solver,HYPRE_ParCSRMatrix A, HYPRE_ParVector b, HYPRE_ParVector x ); extern int HYPRE_ParCSRBiCGSTABLSetTol( HYPRE_Solver solver, double tol ); extern int HYPRE_ParCSRBiCGSTABLSetSize( HYPRE_Solver solver, int size ); extern int HYPRE_ParCSRBiCGSTABLSetMaxIter( HYPRE_Solver solver, int max_iter ); extern int HYPRE_ParCSRBiCGSTABLSetStopCrit( HYPRE_Solver solver, int stop_crit ); extern int HYPRE_ParCSRBiCGSTABLSetPrecond( HYPRE_Solver solver, int (*precond) (HYPRE_Solver sol, HYPRE_ParCSRMatrix matrix, HYPRE_ParVector b, HYPRE_ParVector x), int (*precond_setup)(HYPRE_Solver sol, HYPRE_ParCSRMatrix matrix, HYPRE_ParVector b, HYPRE_ParVector x), void *precond_data ); extern int HYPRE_ParCSRBiCGSTABLSetLogging( HYPRE_Solver solver, int logging); extern int HYPRE_ParCSRBiCGSTABLGetNumIterations(HYPRE_Solver solver, int *num_iterations); extern int HYPRE_ParCSRBiCGSTABLGetFinalRelativeResidualNorm(HYPRE_Solver solver, double *norm ); #ifdef __cplusplus } #endif #endif hypre-2.33.0/src/FEI_mv/fei-hypre/HYPRE_parcsr_fgmres.c000066400000000000000000000155031477326011500224740ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include #include #include #include #include "utilities/_hypre_utilities.h" #include "HYPRE.h" #include "IJ_mv/HYPRE_IJ_mv.h" #include "parcsr_mv/HYPRE_parcsr_mv.h" #include "parcsr_mv/_hypre_parcsr_mv.h" #include "parcsr_ls/HYPRE_parcsr_ls.h" #include "HYPRE_parcsr_fgmres.h" #include "HYPRE_FEI.h" #include "_hypre_FEI.h" //extern void *hypre_FGMRESCreate(); //extern int hypre_FGMRESDestroy(void *); //extern int hypre_FGMRESSetup(void *, void *, void *, void *); //extern int hypre_FGMRESSolve(void *, void *, void *, void *); //extern int hypre_FGMRESSetKDim(void *, int); //extern int hypre_FGMRESSetTol(void *, double); //extern int hypre_FGMRESSetMaxIter(void *, int); //extern int hypre_FGMRESSetStopCrit(void *, double); //extern int hypre_FGMRESSetPrecond(void *, int (*precond)(void*,void*,void*,void*), // int (*precond_setup)(void*,void*,void*,void*),void *precond_data); //extern int hypre_FGMRESGetPrecond(void *, HYPRE_Solver *); //extern int hypre_FGMRESSetLogging(void *, int); //extern int hypre_FGMRESGetNumIterations(void *, int *); //extern int hypre_FGMRESGetFinalRelativeResidualNorm(void *,double *); //extern int hypre_FGMRESUpdatePrecondTolerance(void *, int (*update_tol)(HYPRE_Solver,double)); /****************************************************************************** * * HYPRE_ParCSRFGMRES interface * *****************************************************************************/ /*-------------------------------------------------------------------------- * HYPRE_ParCSRFGMRESCreate *--------------------------------------------------------------------------*/ int HYPRE_ParCSRFGMRESCreate( MPI_Comm comm, HYPRE_Solver *solver ) { *solver = (HYPRE_Solver) hypre_FGMRESCreate( ); return 0; } /*-------------------------------------------------------------------------- * HYPRE_ParCSRFGMRESDestroy *--------------------------------------------------------------------------*/ int HYPRE_ParCSRFGMRESDestroy( HYPRE_Solver solver ) { return( hypre_FGMRESDestroy( (void *) solver ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRFGMRESSetup *--------------------------------------------------------------------------*/ int HYPRE_ParCSRFGMRESSetup( HYPRE_Solver solver, HYPRE_ParCSRMatrix A, HYPRE_ParVector b, HYPRE_ParVector x ) { return( hypre_FGMRESSetup( (void *) solver, (void *) A, (void *) b, (void *) x ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRFGMRESSolve *--------------------------------------------------------------------------*/ int HYPRE_ParCSRFGMRESSolve( HYPRE_Solver solver, HYPRE_ParCSRMatrix A, HYPRE_ParVector b, HYPRE_ParVector x ) { return( hypre_FGMRESSolve( (void *) solver, (void *) A, (void *) b, (void *) x ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRFGMRESSetKDim *--------------------------------------------------------------------------*/ int HYPRE_ParCSRFGMRESSetKDim( HYPRE_Solver solver, int dim ) { return( hypre_FGMRESSetKDim( (void *) solver, dim ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRFGMRESSetTol *--------------------------------------------------------------------------*/ int HYPRE_ParCSRFGMRESSetTol( HYPRE_Solver solver, double tol ) { return( hypre_FGMRESSetTol( (void *) solver, tol ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRFGMRESSetMaxIter *--------------------------------------------------------------------------*/ int HYPRE_ParCSRFGMRESSetMaxIter( HYPRE_Solver solver, int max_iter ) { return( hypre_FGMRESSetMaxIter( (void *) solver, max_iter ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRFGMRESetStopCrit *--------------------------------------------------------------------------*/ int HYPRE_ParCSRFGMRESSetStopCrit( HYPRE_Solver solver, int stop_crit ) { return( hypre_FGMRESSetStopCrit( (void *) solver, stop_crit ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRFGMRESSetPrecond *--------------------------------------------------------------------------*/ int HYPRE_ParCSRFGMRESSetPrecond( HYPRE_Solver solver, int (*precond)(HYPRE_Solver sol, HYPRE_ParCSRMatrix matrix, HYPRE_ParVector b, HYPRE_ParVector x), int (*precond_setup)(HYPRE_Solver sol, HYPRE_ParCSRMatrix matrix, HYPRE_ParVector b, HYPRE_ParVector x), void *precond_data ) { return( hypre_FGMRESSetPrecond( (void *) solver, (HYPRE_Int (*)(void*,void*,void*,void*))precond, (HYPRE_Int (*)(void*,void*,void*,void*))precond_setup, precond_data ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRFGMRESSetLogging *--------------------------------------------------------------------------*/ int HYPRE_ParCSRFGMRESSetLogging( HYPRE_Solver solver, int logging) { return( hypre_FGMRESSetLogging( (void *) solver, logging ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRFGMRESetNumIterations *--------------------------------------------------------------------------*/ int HYPRE_ParCSRFGMRESGetNumIterations(HYPRE_Solver solver,int *num_iterations) { return( hypre_FGMRESGetNumIterations( (void *) solver, num_iterations ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRFGMRESGetFinalRelativeResidualNorm *--------------------------------------------------------------------------*/ int HYPRE_ParCSRFGMRESGetFinalRelativeResidualNorm( HYPRE_Solver solver, double *norm ) { return( hypre_FGMRESGetFinalRelativeResidualNorm( (void *) solver, norm ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRFGMRESUpdatePrecondTolerance *--------------------------------------------------------------------------*/ int HYPRE_ParCSRFGMRESUpdatePrecondTolerance( HYPRE_Solver solver, int (*update_tol)(HYPRE_Solver sol, double ) ) { return( hypre_FGMRESUpdatePrecondTolerance(solver,(int(*) (int*, double)) update_tol) ); } hypre-2.33.0/src/FEI_mv/fei-hypre/HYPRE_parcsr_fgmres.h000066400000000000000000000042041477326011500224750ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * HYPRE_ParCSRFGMRES interface * *****************************************************************************/ #ifndef __FGMRESH__ #define __FGMRESH__ #ifdef __cplusplus extern "C" { #endif int HYPRE_ParCSRFGMRESCreate( MPI_Comm comm, HYPRE_Solver *solver ); int HYPRE_ParCSRFGMRESDestroy( HYPRE_Solver solver ); int HYPRE_ParCSRFGMRESSetup(HYPRE_Solver solver,HYPRE_ParCSRMatrix A, HYPRE_ParVector b, HYPRE_ParVector x ); int HYPRE_ParCSRFGMRESSolve(HYPRE_Solver solver,HYPRE_ParCSRMatrix A, HYPRE_ParVector b, HYPRE_ParVector x ); int HYPRE_ParCSRFGMRESSetKDim(HYPRE_Solver solver, int kdim); int HYPRE_ParCSRFGMRESSetTol(HYPRE_Solver solver, double tol); int HYPRE_ParCSRFGMRESSetMaxIter(HYPRE_Solver solver, int max_iter); int HYPRE_ParCSRFGMRESSetStopCrit(HYPRE_Solver solver, int stop_crit); int HYPRE_ParCSRFGMRESSetPrecond(HYPRE_Solver solver, int (*precond)(HYPRE_Solver sol, HYPRE_ParCSRMatrix matrix, HYPRE_ParVector b, HYPRE_ParVector x), int (*precond_setup)(HYPRE_Solver sol, HYPRE_ParCSRMatrix matrix, HYPRE_ParVector b, HYPRE_ParVector x), void *precond_data); int HYPRE_ParCSRFGMRESSetLogging(HYPRE_Solver solver, int logging); int HYPRE_ParCSRFGMRESGetNumIterations(HYPRE_Solver solver, int *num_iterations); int HYPRE_ParCSRFGMRESGetFinalRelativeResidualNorm(HYPRE_Solver solver, double *norm ); int HYPRE_ParCSRFGMRESUpdatePrecondTolerance(HYPRE_Solver solver, int (*set_tolerance)(HYPRE_Solver sol, double)); #ifdef __cplusplus } #endif #endif hypre-2.33.0/src/FEI_mv/fei-hypre/HYPRE_parcsr_lsicg.c000066400000000000000000000134121477326011500223070ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include #include #include #include #include "utilities/_hypre_utilities.h" #include "HYPRE.h" #include "IJ_mv/HYPRE_IJ_mv.h" #include "parcsr_mv/HYPRE_parcsr_mv.h" #include "parcsr_mv/_hypre_parcsr_mv.h" #include "parcsr_ls/HYPRE_parcsr_ls.h" #include "HYPRE_FEI.h" /****************************************************************************** * * HYPRE_ParCSRLSICG interface * *****************************************************************************/ extern void *hypre_LSICGCreate(); extern int hypre_LSICGDestroy(void *); extern int hypre_LSICGSetup(void *, void *, void *, void *); extern int hypre_LSICGSolve(void *, void *, void *, void *); extern int hypre_LSICGSetTol(void *, double); extern int hypre_LSICGSetMaxIter(void *, int); extern int hypre_LSICGSetStopCrit(void *, double); extern int hypre_LSICGSetPrecond(void *, int (*precond)(void*,void*,void*,void*), int (*precond_setup)(void*,void*,void*,void*), void *); extern int hypre_LSICGSetLogging(void *, int); extern int hypre_LSICGGetNumIterations(void *,int *); extern int hypre_LSICGGetFinalRelativeResidualNorm(void *, double *); /*-------------------------------------------------------------------------- * HYPRE_ParCSRLSICGCreate *--------------------------------------------------------------------------*/ int HYPRE_ParCSRLSICGCreate( MPI_Comm comm, HYPRE_Solver *solver ) { *solver = (HYPRE_Solver) hypre_LSICGCreate( ); return 0; } /*-------------------------------------------------------------------------- * HYPRE_ParCSRLSICGDestroy *--------------------------------------------------------------------------*/ int HYPRE_ParCSRLSICGDestroy( HYPRE_Solver solver ) { return( hypre_LSICGDestroy( (void *) solver ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRLSICGSetup *--------------------------------------------------------------------------*/ int HYPRE_ParCSRLSICGSetup( HYPRE_Solver solver, HYPRE_ParCSRMatrix A, HYPRE_ParVector b, HYPRE_ParVector x ) { return( hypre_LSICGSetup( (void *) solver, (void *) A, (void *) b, (void *) x ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRLSICGSolve *--------------------------------------------------------------------------*/ int HYPRE_ParCSRLSICGSolve( HYPRE_Solver solver, HYPRE_ParCSRMatrix A, HYPRE_ParVector b, HYPRE_ParVector x ) { return( hypre_LSICGSolve( (void *) solver, (void *) A, (void *) b, (void *) x ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRLSICGSetTol *--------------------------------------------------------------------------*/ int HYPRE_ParCSRLSICGSetTol( HYPRE_Solver solver, double tol ) { return( hypre_LSICGSetTol( (void *) solver, tol ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRLSICGSetMaxIter *--------------------------------------------------------------------------*/ int HYPRE_ParCSRLSICGSetMaxIter( HYPRE_Solver solver, int max_iter ) { return( hypre_LSICGSetMaxIter( (void *) solver, max_iter ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRLSICGetStopCrit *--------------------------------------------------------------------------*/ int HYPRE_ParCSRLSICGSetStopCrit( HYPRE_Solver solver, int stop_crit ) { return( hypre_LSICGSetStopCrit( (void *) solver, stop_crit ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRLSICGSetPrecond *--------------------------------------------------------------------------*/ int HYPRE_ParCSRLSICGSetPrecond( HYPRE_Solver solver, int (*precond) (HYPRE_Solver sol, HYPRE_ParCSRMatrix matrix, HYPRE_ParVector b, HYPRE_ParVector x), int (*precond_setup)(HYPRE_Solver sol, HYPRE_ParCSRMatrix matrix, HYPRE_ParVector b, HYPRE_ParVector x), void *precond_data ) { return( hypre_LSICGSetPrecond( (void *) solver, (HYPRE_Int (*)(void*,void*,void*,void*))precond, (HYPRE_Int (*)(void*,void*,void*,void*))precond_setup, precond_data ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRLSICGSetLogging *--------------------------------------------------------------------------*/ int HYPRE_ParCSRLSICGSetLogging( HYPRE_Solver solver, int logging) { return( hypre_LSICGSetLogging( (void *) solver, logging ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRLSICGetNumIterations *--------------------------------------------------------------------------*/ int HYPRE_ParCSRLSICGGetNumIterations(HYPRE_Solver solver,int *num_iterations) { return( hypre_LSICGGetNumIterations( (void *) solver, num_iterations ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRLSICGGetFinalRelativeResidualNorm *--------------------------------------------------------------------------*/ int HYPRE_ParCSRLSICGGetFinalRelativeResidualNorm( HYPRE_Solver solver, double *norm ) { return( hypre_LSICGGetFinalRelativeResidualNorm( (void *) solver, norm ) ); } hypre-2.33.0/src/FEI_mv/fei-hypre/HYPRE_parcsr_lsicg.h000066400000000000000000000037651477326011500223260ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * HYPRE_ParCSRLSICG interface * *****************************************************************************/ #ifndef __LSICG__ #define __LSICG__ #ifdef __cplusplus extern "C" { #endif extern int HYPRE_ParCSRLSICGCreate(MPI_Comm comm, HYPRE_Solver *solver); extern int HYPRE_ParCSRLSICGDestroy(HYPRE_Solver solver); extern int HYPRE_ParCSRLSICGSetup(HYPRE_Solver solver,HYPRE_ParCSRMatrix A, HYPRE_ParVector b, HYPRE_ParVector x ); extern int HYPRE_ParCSRLSICGSolve(HYPRE_Solver solver,HYPRE_ParCSRMatrix A, HYPRE_ParVector b, HYPRE_ParVector x ); extern int HYPRE_ParCSRLSICGSetTol(HYPRE_Solver solver, double tol); extern int HYPRE_ParCSRLSICGSetMaxIter(HYPRE_Solver solver, int max_iter); extern int HYPRE_ParCSRLSICGSetStopCrit(HYPRE_Solver solver, int stop_crit); extern int HYPRE_ParCSRLSICGSetPrecond(HYPRE_Solver solver, int (*precond) (HYPRE_Solver sol, HYPRE_ParCSRMatrix matrix, HYPRE_ParVector b, HYPRE_ParVector x), int (*precond_setup)(HYPRE_Solver sol, HYPRE_ParCSRMatrix matrix, HYPRE_ParVector b, HYPRE_ParVector x), void *precond_data ); extern int HYPRE_ParCSRLSICGSetLogging(HYPRE_Solver solver, int logging); extern int HYPRE_ParCSRLSICGGetNumIterations(HYPRE_Solver solver, int *num_iterations); extern int HYPRE_ParCSRLSICGGetFinalRelativeResidualNorm(HYPRE_Solver solver, double *norm ); #ifdef __cplusplus } #endif #endif hypre-2.33.0/src/FEI_mv/fei-hypre/HYPRE_parcsr_maxwell.c000066400000000000000000000166051477326011500226660ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include #include #include #include #include "utilities/_hypre_utilities.h" #include "HYPRE.h" #include "IJ_mv/HYPRE_IJ_mv.h" #include "parcsr_mv/HYPRE_parcsr_mv.h" #include "parcsr_mv/_hypre_parcsr_mv.h" #include "parcsr_ls/HYPRE_parcsr_ls.h" #include "HYPRE_FEI.h" /*-------------------------------------------------------------------------- * hypre_CotreeData *--------------------------------------------------------------------------*/ typedef struct { int max_iter; double tol; hypre_ParCSRMatrix *Aee; hypre_ParCSRMatrix *Att; hypre_ParCSRMatrix *Atc; hypre_ParCSRMatrix *Act; hypre_ParCSRMatrix *Acc; hypre_ParCSRMatrix *Gen; hypre_ParCSRMatrix *Gc; hypre_ParCSRMatrix *Gt; hypre_ParCSRMatrix *Gtinv; hypre_ParVector *w; } hypre_CotreeData; /****************************************************************************** * * HYPRE_ParCSRCotree interface * *****************************************************************************/ /*-------------------------------------------------------------------------- * HYPRE_ParCSRCotreeCreate *--------------------------------------------------------------------------*/ int HYPRE_ParCSRCotreeCreate(MPI_Comm comm, HYPRE_Solver *solver) { hypre_CotreeData *cotree_data; void *void_data; cotree_data = hypre_CTAlloc(hypre_CotreeData, 1, HYPRE_MEMORY_HOST); void_data = (void *) cotree_data; *solver = (HYPRE_Solver) void_data; (cotree_data -> Aee) = NULL; (cotree_data -> Acc) = NULL; (cotree_data -> Act) = NULL; (cotree_data -> Atc) = NULL; (cotree_data -> Att) = NULL; (cotree_data -> Gen) = NULL; (cotree_data -> Gc) = NULL; (cotree_data -> Gt) = NULL; (cotree_data -> Gtinv) = NULL; (cotree_data -> tol) = 1.0e-06; (cotree_data -> max_iter) = 1000; (cotree_data -> w) = NULL; return 0; } /*-------------------------------------------------------------------------- * HYPRE_ParCSRCotreeDestroy *--------------------------------------------------------------------------*/ int HYPRE_ParCSRCotreeDestroy(HYPRE_Solver solver) { void *cotree_vdata = (void *) solver; hypre_CotreeData *cotree_data = (hypre_CotreeData *) cotree_vdata; if (cotree_data) { hypre_TFree(cotree_data, HYPRE_MEMORY_HOST); if ((cotree_data->w) != NULL) { hypre_ParVectorDestroy(cotree_data->w); cotree_data->w = NULL; } if ((cotree_data->Acc) != NULL) { hypre_ParCSRMatrixDestroy(cotree_data->Acc); cotree_data->Acc = NULL; } if ((cotree_data->Act) != NULL) { hypre_ParCSRMatrixDestroy(cotree_data->Act); cotree_data->Act = NULL; } if ((cotree_data->Atc) != NULL) { hypre_ParCSRMatrixDestroy(cotree_data->Atc); cotree_data->Atc = NULL; } if ((cotree_data->Att) != NULL) { hypre_ParCSRMatrixDestroy(cotree_data->Att); cotree_data->Att = NULL; } if ((cotree_data->Gc) != NULL) { hypre_ParCSRMatrixDestroy(cotree_data->Gc); cotree_data->Gc = NULL; } if ((cotree_data->Gt) != NULL) { hypre_ParCSRMatrixDestroy(cotree_data->Gt); cotree_data->Gt = NULL; } if ((cotree_data->Gtinv) != NULL) { hypre_ParCSRMatrixDestroy(cotree_data->Gtinv); cotree_data->Gtinv = NULL; } } return 0; } /*-------------------------------------------------------------------------- * HYPRE_ParCSRCotreeSetup *--------------------------------------------------------------------------*/ int HYPRE_ParCSRCotreeSetup(HYPRE_Solver solver, HYPRE_ParCSRMatrix A, HYPRE_ParVector b, HYPRE_ParVector x) { int *partition, *new_partition, nprocs, *tindices, ii; void *vsolver = (void *) solver; /* void *vA = (void *) A; void *vb = (void *) b; void *vx = (void *) x; */ hypre_CotreeData *cotree_data = (hypre_CotreeData *) vsolver; hypre_ParCSRMatrix **submatrices; hypre_ParVector *new_vector; MPI_Comm comm; cotree_data->Aee = (hypre_ParCSRMatrix *) A; hypre_ParCSRMatrixGenSpanningTree(cotree_data->Gen, &tindices, 1); submatrices = hypre_TAlloc(hypre_ParCSRMatrix *, 1, HYPRE_MEMORY_HOST); hypre_ParCSRMatrixExtractSubmatrices(cotree_data->Aee, tindices, &submatrices); cotree_data->Att = submatrices[0]; cotree_data->Atc = submatrices[1]; cotree_data->Act = submatrices[2]; cotree_data->Acc = submatrices[3]; hypre_ParCSRMatrixExtractRowSubmatrices(cotree_data->Gen, tindices, &submatrices); cotree_data->Gt = submatrices[0]; cotree_data->Gc = submatrices[1]; hypre_TFree(submatrices, HYPRE_MEMORY_HOST); comm = hypre_ParCSRMatrixComm((hypre_ParCSRMatrix *) A); MPI_Comm_size(comm, &nprocs); partition = hypre_ParVectorPartitioning((hypre_ParVector *) b); new_partition = hypre_TAlloc(int, (nprocs+1) , HYPRE_MEMORY_HOST); for (ii = 0; ii <= nprocs; ii++) new_partition[ii] = partition[ii]; /* partition = hypre_ParVectorPartitioning((hypre_ParVector *) b); */ new_vector = hypre_ParVectorCreate(hypre_ParVectorComm((hypre_ParVector *)b), (int) hypre_ParVectorGlobalSize((hypre_ParVector *) b), new_partition); hypre_ParVectorInitialize(new_vector); cotree_data->w = new_vector; return 0; } /*-------------------------------------------------------------------------- * HYPRE_ParCSRCotreeSolve * (1) Given initial E and f, compute residual R * (2) Use GMRES to solve for cotree system given Rc with preconditioner * (a) (I + FF^t) solve * (b) preconditioned \hat{Acc} solve * (c) (I + FF^t) solve * (3) update E *-------------------------------------------------------------------------- * (I + FF^t) x = y where F = G_c G_t^{-1} * (1) w2 = G_c^t y * (2) Poisson solve A z1 = w2 * (3) z2 = y - F G_t z1 *--------------------------------------------------------------------------*/ int HYPRE_ParCSRCotreeSolve(HYPRE_Solver solver, HYPRE_ParCSRMatrix A, HYPRE_ParVector b, HYPRE_ParVector x) { void *cotree_vdata = (void *) solver; hypre_CotreeData *cotree_data = (hypre_CotreeData *)cotree_vdata; cotree_data->w = NULL; return 0; } /*-------------------------------------------------------------------------- * HYPRE_ParCSRCotreeSetTol *--------------------------------------------------------------------------*/ int HYPRE_ParCSRCotreeSetTol(HYPRE_Solver solver, double tol) { return 0; } /*-------------------------------------------------------------------------- * HYPRE_ParCSRCotreeSetMaxIter *--------------------------------------------------------------------------*/ int HYPRE_ParCSRCotreeSetMaxIter(HYPRE_Solver solver, int max_iter) { return 0; } hypre-2.33.0/src/FEI_mv/fei-hypre/HYPRE_parcsr_superlu.c000066400000000000000000000246021477326011500227100ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * HYPRE_ParCSR_SuperLU interface * *****************************************************************************/ #include #include #include #include "utilities/_hypre_utilities.h" #include "HYPRE.h" #include "parcsr_mv/_hypre_parcsr_mv.h" #include "parcsr_ls/HYPRE_parcsr_ls.h" #include "HYPRE_FEI.h" /*--------------------------------------------------------------------------- * SUPERLU include files *-------------------------------------------------------------------------*/ #ifdef HAVE_SUPERLU_20 #include "dsp_defs.h" #include "superlu_util.h" typedef struct HYPRE_SuperLU_Struct { int factorized_; int *permR_; int *permC_; SuperMatrix SLU_Lmat; SuperMatrix SLU_Umat; int outputLevel_; } HYPRE_SuperLU; #endif #ifdef HAVE_SUPERLU #include "slu_ddefs.h" #include "slu_util.h" typedef struct HYPRE_SuperLU_Struct { int factorized_; int *permR_; int *permC_; SuperMatrix SLU_Lmat; SuperMatrix SLU_Umat; int outputLevel_; } HYPRE_SuperLU; #endif /*************************************************************************** * HYPRE_ParCSR_SuperLUCreate - Return a SuperLU object "solver". *--------------------------------------------------------------------------*/ int HYPRE_ParCSR_SuperLUCreate( MPI_Comm comm, HYPRE_Solver *solver ) { #ifdef HAVE_SUPERLU int nprocs; HYPRE_SuperLU *sluPtr; MPI_Comm_size(comm, &nprocs); if ( nprocs > 1 ) { printf("HYPRE_ParCSR_SuperLUCreate ERROR - too many processors.\n"); return -1; } sluPtr = hypre_TAlloc(HYPRE_SuperLU, 1, HYPRE_MEMORY_HOST); hypre_assert ( sluPtr != NULL ); sluPtr->factorized_ = 0; sluPtr->permR_ = NULL; sluPtr->permC_ = NULL; sluPtr->outputLevel_ = 0; *solver = (HYPRE_Solver) sluPtr; return 0; #else printf("HYPRE_ParCSR_SuperLUCreate ERROR - SuperLU not enabled.\n"); *solver = (HYPRE_Solver) NULL; return -1; #endif } /*************************************************************************** * HYPRE_ParCSR_SuperLUDestroy - Destroy a SuperLU object. *--------------------------------------------------------------------------*/ int HYPRE_ParCSR_SuperLUDestroy( HYPRE_Solver solver ) { #ifdef HAVE_SUPERLU HYPRE_SuperLU *sluPtr = (HYPRE_SuperLU *) solver; hypre_assert ( sluPtr != NULL ); hypre_TFree(sluPtr->permR_, HYPRE_MEMORY_HOST); hypre_TFree(sluPtr->permC_, HYPRE_MEMORY_HOST); hypre_TFree(sluPtr, HYPRE_MEMORY_HOST); return 0; #else printf("HYPRE_ParCSR_SuperLUDestroy ERROR - SuperLU not enabled.\n"); *solver = (HYPRE_Solver) NULL; return -1; #endif } /*************************************************************************** * HYPRE_ParCSR_SuperLUSetOutputLevel - Set debug level *--------------------------------------------------------------------------*/ int HYPRE_ParCSR_SuperLUSetOutputLevel(HYPRE_Solver solver, int level) { #ifdef HAVE_SUPERLU HYPRE_SuperLU *sluPtr = (HYPRE_SuperLU *) solver; hypre_assert ( sluPtr != NULL ); sluPtr->outputLevel_ = level; return 0; #else printf("HYPRE_ParCSR_SuperLUSetOutputLevel ERROR - SuperLU not enabled.\n"); *solver = (HYPRE_Solver) NULL; return -1; #endif } /*************************************************************************** * HYPRE_ParCSR_SuperLUSetup - Set up function for SuperLU. *--------------------------------------------------------------------------*/ int HYPRE_ParCSR_SuperLUSetup(HYPRE_Solver solver, HYPRE_ParCSRMatrix A_csr, HYPRE_ParVector b, HYPRE_ParVector x ) { #ifdef HAVE_SUPERLU int startRow, endRow, nrows, *partition, *AdiagI, *AdiagJ, nnz; int irow, colNum, index, *cscI, *cscJ, jcol, *colLengs; int *etree, permcSpec, lwork, panelSize, relax, info; double *AdiagA, *cscA, diagPivotThresh, dropTol; char refact[1]; hypre_CSRMatrix *Adiag; HYPRE_SuperLU *sluPtr; SuperMatrix sluAmat, auxAmat; superlu_options_t slu_options; SuperLUStat_t slu_stat; /* ---------------------------------------------------------------- */ /* get matrix information */ /* ---------------------------------------------------------------- */ sluPtr = (HYPRE_SuperLU *) solver; hypre_assert ( sluPtr != NULL ); HYPRE_ParCSRMatrixGetRowPartitioning( A_csr, &partition ); startRow = partition[0]; endRow = partition[1] - 1; nrows = endRow - startRow + 1; hypre_TFree(partition, HYPRE_MEMORY_HOST); if ( startRow != 0 ) { printf("HYPRE_ParCSR_SuperLUSetup ERROR - start row != 0.\n"); return -1; } /* ---------------------------------------------------------------- */ /* get hypre matrix */ /* ---------------------------------------------------------------- */ Adiag = hypre_ParCSRMatrixDiag((hypre_ParCSRMatrix *) A_csr); AdiagI = hypre_CSRMatrixI(Adiag); AdiagJ = hypre_CSRMatrixJ(Adiag); AdiagA = hypre_CSRMatrixData(Adiag); nnz = AdiagI[nrows]; /* ---------------------------------------------------------------- */ /* convert the csr matrix into csc matrix */ /* ---------------------------------------------------------------- */ colLengs = hypre_TAlloc(int, nrows , HYPRE_MEMORY_HOST); for ( irow = 0; irow < nrows; irow++ ) colLengs[irow] = 0; for ( irow = 0; irow < nrows; irow++ ) for ( jcol = AdiagI[irow]; jcol < AdiagI[irow+1]; jcol++ ) colLengs[AdiagJ[jcol]]++; cscJ = hypre_TAlloc(int, (nrows+1) , HYPRE_MEMORY_HOST); cscI = hypre_TAlloc(int, nnz , HYPRE_MEMORY_HOST); cscA = hypre_TAlloc(double, nnz , HYPRE_MEMORY_HOST); cscJ[0] = 0; nnz = 0; for ( jcol = 1; jcol <= nrows; jcol++ ) { nnz += colLengs[jcol-1]; cscJ[jcol] = nnz; } for ( irow = 0; irow < nrows; irow++ ) { for ( jcol = AdiagI[irow]; jcol < AdiagI[irow+1]; jcol++ ) { colNum = AdiagJ[jcol]; index = cscJ[colNum]++; cscI[index] = irow; cscA[index] = AdiagA[jcol]; } } cscJ[0] = 0; nnz = 0; for ( jcol = 1; jcol <= nrows; jcol++ ) { nnz += colLengs[jcol-1]; cscJ[jcol] = nnz; } hypre_TFree(colLengs, HYPRE_MEMORY_HOST); /* ---------------------------------------------------------------- */ /* create SuperMatrix */ /* ---------------------------------------------------------------- */ dCreate_CompCol_Matrix(&sluAmat,nrows,nrows,cscJ[nrows],cscA,cscI, cscJ, SLU_NC, SLU_D, SLU_GE); etree = hypre_TAlloc(int, nrows , HYPRE_MEMORY_HOST); sluPtr->permC_ = hypre_TAlloc(int, nrows , HYPRE_MEMORY_HOST); sluPtr->permR_ = hypre_TAlloc(int, nrows , HYPRE_MEMORY_HOST); permcSpec = 0; get_perm_c(permcSpec, &sluAmat, sluPtr->permC_); slu_options.Fact = DOFACT; slu_options.SymmetricMode = NO; sp_preorder(&slu_options, &sluAmat, sluPtr->permC_, etree, &auxAmat); diagPivotThresh = 1.0; dropTol = 0.0; panelSize = sp_ienv(1); relax = sp_ienv(2); StatInit(&slu_stat); lwork = 0; slu_options.ColPerm = MY_PERMC; slu_options.DiagPivotThresh = diagPivotThresh; dgstrf(&slu_options, &auxAmat, dropTol, relax, panelSize, etree, NULL, lwork, sluPtr->permC_, sluPtr->permR_, &(sluPtr->SLU_Lmat), &(sluPtr->SLU_Umat), &slu_stat, &info); Destroy_CompCol_Permuted(&auxAmat); Destroy_CompCol_Matrix(&sluAmat); hypre_TFree(etree, HYPRE_MEMORY_HOST); sluPtr->factorized_ = 1; StatFree(&slu_stat); return 0; #else printf("HYPRE_ParCSR_SuperLUSetup ERROR - SuperLU not enabled.\n"); *solver = (HYPRE_Solver) NULL; return -1; #endif } /*************************************************************************** * HYPRE_ParCSR_SuperLUSolve - Solve function for SuperLU. *--------------------------------------------------------------------------*/ int HYPRE_ParCSR_SuperLUSolve(HYPRE_Solver solver, HYPRE_ParCSRMatrix A, HYPRE_ParVector b, HYPRE_ParVector x ) { #ifdef HAVE_SUPERLU int nrows, i, info; double *bData, *xData; SuperMatrix B; SuperLUStat_t slu_stat; trans_t trans; HYPRE_SuperLU *sluPtr = (HYPRE_SuperLU *) solver; /* ---------------------------------------------------------------- */ /* make sure setup has been called */ /* ---------------------------------------------------------------- */ hypre_assert ( sluPtr != NULL ); if ( ! (sluPtr->factorized_) ) { printf("HYPRE_ParCSR_SuperLUSolve ERROR - not factorized yet.\n"); return -1; } /* ---------------------------------------------------------------- */ /* fetch right hand side and solution vector */ /* ---------------------------------------------------------------- */ xData = hypre_VectorData(hypre_ParVectorLocalVector((hypre_ParVector *)x)); bData = hypre_VectorData(hypre_ParVectorLocalVector((hypre_ParVector *)b)); nrows = hypre_ParVectorGlobalSize((hypre_ParVector *)x); for (i = 0; i < nrows; i++) xData[i] = bData[i]; /* ---------------------------------------------------------------- */ /* solve */ /* ---------------------------------------------------------------- */ dCreate_Dense_Matrix(&B, nrows, 1, bData, nrows, SLU_DN, SLU_D,SLU_GE); /* ------------------------------------------------------------- * solve the problem * -----------------------------------------------------------*/ trans = NOTRANS; StatInit(&slu_stat); dgstrs (trans, &(sluPtr->SLU_Lmat), &(sluPtr->SLU_Umat), sluPtr->permC_, sluPtr->permR_, &B, &slu_stat, &info); Destroy_SuperMatrix_Store(&B); StatFree(&slu_stat); return 0; #else printf("HYPRE_ParCSR_SuperLUSolve ERROR - SuperLU not enabled.\n"); *solver = (HYPRE_Solver) NULL; return -1; #endif } hypre-2.33.0/src/FEI_mv/fei-hypre/HYPRE_parcsr_superlu.h000066400000000000000000000025411477326011500227130ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * HYPRE_ParCSR_SuperLU interface * *****************************************************************************/ #ifndef __HYPRE_PARCSR_SUPERLU__ #define __HYPRE_PARCSR_SUPERLU__ #include #include #include #include #include "HYPRE.h" #include "utilities/_hypre_utilities.h" #include "parcsr_mv/_hypre_parcsr_mv.h" #ifdef __cplusplus extern "C" { #endif extern int HYPRE_ParCSR_SuperLUCreate(MPI_Comm comm, HYPRE_Solver *solver); extern int HYPRE_ParCSR_SuperLUDestroy(HYPRE_Solver solver); extern int HYPRE_ParCSR_SuperLUSetOutputLevel(HYPRE_Solver solver, int); extern int HYPRE_ParCSR_SuperLUSetup(HYPRE_Solver solver,HYPRE_ParCSRMatrix A, HYPRE_ParVector b,HYPRE_ParVector x); extern int HYPRE_ParCSR_SuperLUSolve(HYPRE_Solver solver,HYPRE_ParCSRMatrix A, HYPRE_ParVector b, HYPRE_ParVector x); #ifdef __cplusplus } #endif #endif hypre-2.33.0/src/FEI_mv/fei-hypre/HYPRE_parcsr_symqmr.c000066400000000000000000000135051477326011500225410ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include #include #include #include #include "utilities/_hypre_utilities.h" #include "HYPRE.h" #include "IJ_mv/HYPRE_IJ_mv.h" #include "parcsr_mv/HYPRE_parcsr_mv.h" #include "parcsr_mv/_hypre_parcsr_mv.h" #include "parcsr_ls/HYPRE_parcsr_ls.h" #include "HYPRE_FEI.h" /****************************************************************************** * * HYPRE_ParCSRSymQMR interface * *****************************************************************************/ extern void *hypre_SymQMRCreate(); extern int hypre_SymQMRDestroy(void *); extern int hypre_SymQMRSetup(void *, void *, void *, void *); extern int hypre_SymQMRSolve(void *, void *, void *, void *); extern int hypre_SymQMRSetTol(void *, double); extern int hypre_SymQMRSetMaxIter(void *, int); extern int hypre_SymQMRSetStopCrit(void *, double); extern int hypre_SymQMRSetPrecond(void *, int (*precond)(void*,void*,void*,void*), int (*precond_setup)(void*,void*,void*,void*), void *); extern int hypre_SymQMRSetLogging(void *, int ); extern int hypre_SymQMRGetNumIterations(void *, int *); extern int hypre_SymQMRGetFinalRelativeResidualNorm(void *, double *); /*-------------------------------------------------------------------------- * HYPRE_ParCSRSymQMRCreate *--------------------------------------------------------------------------*/ int HYPRE_ParCSRSymQMRCreate( MPI_Comm comm, HYPRE_Solver *solver ) { *solver = (HYPRE_Solver) hypre_SymQMRCreate( ); return 0; } /*-------------------------------------------------------------------------- * HYPRE_ParCSRSymQMRDestroy *--------------------------------------------------------------------------*/ int HYPRE_ParCSRSymQMRDestroy( HYPRE_Solver solver ) { return( hypre_SymQMRDestroy( (void *) solver ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRSymQMRSetup *--------------------------------------------------------------------------*/ int HYPRE_ParCSRSymQMRSetup( HYPRE_Solver solver, HYPRE_ParCSRMatrix A, HYPRE_ParVector b, HYPRE_ParVector x ) { return( hypre_SymQMRSetup( (void *) solver, (void *) A, (void *) b, (void *) x ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRSymQMRSolve *--------------------------------------------------------------------------*/ int HYPRE_ParCSRSymQMRSolve( HYPRE_Solver solver, HYPRE_ParCSRMatrix A, HYPRE_ParVector b, HYPRE_ParVector x ) { return( hypre_SymQMRSolve( (void *) solver, (void *) A, (void *) b, (void *) x ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRSymQMRSetTol *--------------------------------------------------------------------------*/ int HYPRE_ParCSRSymQMRSetTol( HYPRE_Solver solver, double tol ) { return( hypre_SymQMRSetTol( (void *) solver, tol ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRSymQMRSetMaxIter *--------------------------------------------------------------------------*/ int HYPRE_ParCSRSymQMRSetMaxIter( HYPRE_Solver solver, int max_iter ) { return( hypre_SymQMRSetMaxIter( (void *) solver, max_iter ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRSymQMRSetStopCrit *--------------------------------------------------------------------------*/ int HYPRE_ParCSRSymQMRSetStopCrit( HYPRE_Solver solver, int stop_crit ) { return( hypre_SymQMRSetStopCrit( (void *) solver, stop_crit ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRSymQMRSetPrecond *--------------------------------------------------------------------------*/ int HYPRE_ParCSRSymQMRSetPrecond( HYPRE_Solver solver, int (*precond) (HYPRE_Solver sol, HYPRE_ParCSRMatrix matrix, HYPRE_ParVector b, HYPRE_ParVector x), int (*precond_setup)(HYPRE_Solver sol, HYPRE_ParCSRMatrix matrix, HYPRE_ParVector b, HYPRE_ParVector x), void *precond_data ) { return( hypre_SymQMRSetPrecond( (void *) solver, (HYPRE_Int (*)(void*,void*,void*,void*))precond, (HYPRE_Int (*)(void*,void*,void*,void*))precond_setup, precond_data ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRSymQMRSetLogging *--------------------------------------------------------------------------*/ int HYPRE_ParCSRSymQMRSetLogging( HYPRE_Solver solver, int logging) { return( hypre_SymQMRSetLogging( (void *) solver, logging ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRSymQMRetNumIterations *--------------------------------------------------------------------------*/ int HYPRE_ParCSRSymQMRGetNumIterations(HYPRE_Solver solver,int *num_iterations) { return( hypre_SymQMRGetNumIterations( (void *) solver, num_iterations ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRSymQMRGetFinalRelativeResidualNorm *--------------------------------------------------------------------------*/ int HYPRE_ParCSRSymQMRGetFinalRelativeResidualNorm( HYPRE_Solver solver, double *norm ) { return( hypre_SymQMRGetFinalRelativeResidualNorm( (void *) solver, norm ) ); } hypre-2.33.0/src/FEI_mv/fei-hypre/HYPRE_parcsr_symqmr.h000066400000000000000000000040301477326011500225370ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * HYPRE_ParCSRSymQMR interface * *****************************************************************************/ #ifndef __SYMQMR__ #define __SYMQMR__ #ifdef __cplusplus extern "C" { #endif extern int HYPRE_ParCSRSymQMRCreate( MPI_Comm comm, HYPRE_Solver *solver ); extern int HYPRE_ParCSRSymQMRDestroy( HYPRE_Solver solver ); extern int HYPRE_ParCSRSymQMRSetup(HYPRE_Solver solver,HYPRE_ParCSRMatrix A, HYPRE_ParVector b, HYPRE_ParVector x ); extern int HYPRE_ParCSRSymQMRSolve(HYPRE_Solver solver,HYPRE_ParCSRMatrix A, HYPRE_ParVector b, HYPRE_ParVector x ); extern int HYPRE_ParCSRSymQMRSetTol( HYPRE_Solver solver, double tol ); extern int HYPRE_ParCSRSymQMRSetMaxIter( HYPRE_Solver solver, int max_iter ); extern int HYPRE_ParCSRSymQMRSetStopCrit( HYPRE_Solver solver, int stop_crit ); extern int HYPRE_ParCSRSymQMRSetPrecond( HYPRE_Solver solver, int (*precond) (HYPRE_Solver sol, HYPRE_ParCSRMatrix matrix, HYPRE_ParVector b, HYPRE_ParVector x), int (*precond_setup)(HYPRE_Solver sol, HYPRE_ParCSRMatrix matrix, HYPRE_ParVector b, HYPRE_ParVector x), void *precond_data ); extern int HYPRE_ParCSRSymQMRSetLogging( HYPRE_Solver solver, int logging); extern int HYPRE_ParCSRSymQMRGetNumIterations(HYPRE_Solver solver, int *num_iterations); extern int HYPRE_ParCSRSymQMRGetFinalRelativeResidualNorm(HYPRE_Solver solver, double *norm ); #ifdef __cplusplus } #endif #endif hypre-2.33.0/src/FEI_mv/fei-hypre/LLNL_FEI.doc000066400000000000000000000504541477326011500204430ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /** * @name Finite Element Interface * * @memo A finite element-based conceptual interface **/ /*@{*/ /** * @name FEI Functions **/ /*@{*/ /** * Finite element interface constructor: this function creates an * instantiation of the HYPRE fei class. * @param comm - an MPI communicator **/ LLNL_FEI_Impl(MPI_Comm comm); /** * Finite element interface destructor: this function destroys * the object as well as its internal memory allocations. * @param - no parameter needed **/ ~LLNL_FEI_Impl(); /** * The parameter function is the single most important function * to pass solver information (which solver, which preconditioner, * tolerance, other solver parameters) to HYPRE. * @param numParams - number of command strings * @param paramStrings - the command strings **/ int parameters(int numParams, char **paramStrings); /** * Each node or element variable has one or more fields. The field * information can be set up using this function. * @param numFields - total number of fields for all variable types * @param fieldSizes - degree of freedom for each field type * @param fieldIDs - a list of field identifiers **/ int initFields(int numFields, int *fieldSizes, int *fieldIDs); /** * The whole finite element mesh can be broken down into a number of * element blocks. The attributes for each element block are: an * identifier, number of elements, number of nodes per elements, * the number of fields in each element node, etc. * @param elemblockID - element block identifier * @param numElements - number of element in this block * @param numNodesPerElement - number of nodes per element in this block * @param numFieldsPerNode - number of fields for each node * @param nodalFieldIDs - field identifiers for the nodal unknowns * @param numElemDOFFieldsPerElement - number of fields for the element * @param elemDOFFieldIDs - field identifier for the element unknowns * @param interleaveStratety - indicates how unknowns are ordered */ int initElemBlock(int elemBlockID, int numElements, int numNodesPerElement, int *numFieldsPerNode, int **nodalFieldIDs, int numElemDOFFieldsPerElement, int *elemDOFFieldIDs, int interleaveStrategy); /** * This function initializes element connectivity (that is, the node * identifiers associated with the current element) given an element * block identifier and the element identifier with the element block. * @param elemblockID - element block identifier * @param elemID - element identifier * @param elemConn - a list of node identifiers for this element **/ int initElem(int elemBlockID, int elemID, int *elemConn); /** * This function initializes the nodes that are shared between the * current processor and its neighbors. The FEI will decide a unique * processor each shared node will be assigned to. * @param nShared - number of shared nodes * @param sharedIDs - shared node identifiers * @param sharedLengs - the number of processors each node shares with * @param sharedProcs - the processor identifiers each node shares with **/ int initSharedNodes(int nShared, int *sharedIDs, int *sharedLengs, int **sharedProcs); /** * This function initializes the Lagrange multiplier constraints * @param CRListLen - the number of constraints * @param CRNodeList - node identifiers where constraints are applied * @param CRFieldList - field identifiers within nodes where constraints are applied * @param CRID - the constraint identifier **/ int initCRMult(int CRListLen,int *CRNodeList,int *CRFieldList,int *CRID); /** * This function signals to the FEI that the initialization step has * been completed. The loading step will follow. * @param - no parameter needed **/ int initComplete(); /** * This function resets the global matrix to be of the same sparsity * pattern as before but with every entry set to s. The right hand * side is set to 0. * @param s - the value each matrix entry is set to. **/ int resetSystem(double s); /** * This function resets the global matrix to be of the same sparsity * pattern as before but with every entry set to s. * @param s - the value each matrix entry is set to. **/ int resetMatrix(double s); /** * This function resets the right hand side vector to s. * @param s - the value each right hand side vector entry is set to. **/ int resetRHSVector(double s); /** * This function resets the solution vector to s. * @param s - the value each solution vector entry is set to. **/ int resetInitialGuess(double s); /** * This function loads the nodal boundary conditions. The boundary conditions * @param nNodes - number of nodes boundary conditions are imposed * @param nodeIDs - nodal identifiers * @param fieldID - field identifier with nodes where BC are imposed * @param alpha - the multipliers for the field * @param beta - the multipliers for the normal derivative of the field * @param gamma - the boundary values on the right hand side of the equations **/ int loadNodeBCs(int nNodes, int *nodeIDs, int fieldID, double **alpha, double **beta, double **gamma); /** * This function adds the element contribution to the global stiffness matrix * and also the element load to the right hand side vector * @param elemBlockID - element block identifier * @param elemID - element identifier * @param elemConn - a list of node identifiers for this element * @param elemStiff - element stiffness matrix * @param elemLoad - right hand side (load) for this element * @param elemFormat - the format the unknowns are passed in **/ int sumInElem(int elemBlockID, int elemID, int *elemConn, double **elemStiff, double *elemLoad, int elemFormat); /** * This function differs from the sumInElem function in that the right hand * load vector is not passed. * @param elemBlockID - element block identifier * @param elemID - element identifier * @param elemConn - a list of node identifiers for this element * @param elemStiff - element stiffness matrix * @param elemFormat - the format the unknowns are passed in **/ int sumInElemMatrix(int elemBlock, int elemID, int* elemConn, double **elemStiffness, int elemFormat); /** * This function adds the element load to the right hand side vector * @param elemBlockID - element block identifier * @param elemID - element identifier * @param elemConn - a list of node identifiers for this element * @param elemLoad - right hand side (load) for this element **/ int sumInElemRHS(int elemBlock, int elemID, int *elemConn, double *elemLoad); /** * This function signals to the FEI that the loading phase has * been completed. * @param - no parameter needed **/ int loadComplete(); /** * This function returns the number of nodes given the element block. * @param elemBlockID - element block identifier * @param nNodes - the number of nodes to be returned **/ int getNumBlockActNodes(int elemBlockID, int *nNodes); /** * This function returns the number of unknowns given the element block. * @param elemBlockID - element block identifier * @param nEqns - the number of unknowns to be returned **/ int getNumBlockActEqns(int elemBlockID, int *nEqns); /** * This function returns the node identifiers given the element block. * @param elemBlockID - element block identifier * @param numNodes - the number of nodes * @param nodeIDList - the node identifiers **/ int getBlockNodeIDList(int elemBlockID, int numNodes, int *nodeIDList); /** * This function returns the nodal solutions given the element block number. * @param elemBlockID - element block identifier * @param numNodes - the number of nodes * @param nodeIDList - the node identifiers * @param solnOffsets - the equation number for each nodal solution * @param solnValues - the nodal solution values **/ int getBlockNodeSolution(int elemBlockID, int numNodes, int *nodeIDList, int *solnOffsets, double *solnValues); /** * This function loads the Lagrange multiplier constraints * @param CRID - the constraint identifier * @param CRListLen - the number of constraints * @param CRNodeList - node identifiers where constraints are applied * @param CRFieldList - field identifiers within nodes where constraints are applied * @param CRWeightList - a list of weights applied to each specified field * @param CRValue - the constraint value (right hand side of the constraint) **/ int loadCRMult(int CRID, int CRListLen, int *CRNodeList, int *CRFieldList, double *CRWeightList, double CRValue); /*@}*/ /** * @name FEI Solver Parameters **/ /*@{*/ /** * Here the various options for solvers and preconditioners * are defined. * *\begin{description} *\item[solver xxx] where xxx specifies one of {\sf cg}, {\sf gmres}, * {\sf fgmres}, {\sf bicgs}, {\sf bicgstab}, {\sf tfqmr}, * {\sf symqmr}, {\sf superlu}, or {\sf superlux}. The * default is {\sf gmres}. * The solver type can be followed by {\sf override} to * specify its priority when multiple solvers are declared * at random order. *\item[preconditioner xxx] where xxx is one of {\sf diagonal}, {\sf pilut}, * {\sf euclid}, {\sf parasails}, {\sf boomeramg}, {\sf poly}, or * {\sf mli}. The default is {\sf diagonal}. Another option for * xxx is {\sf reuse} which allows the preconditioner to be reused * (this should only be set after a preconditioner has been set * up already). * The preconditioner type can be followed by {\sf override} to * specify its priority when multiple preconditioners are declared * at random order. *\item[maxIterations xxx] where xxx is an integer specifying the maximum * number of iterations permitted for the iterative solvers. * The default value is 1000. *\item[tolerance xxx] where xxx is a floating point number specifying the * termination criterion for the iterative solvers. The default * value is 1.0E-6. *\item[gmresDim xxx] where xxx is an integer specifying the value of m in * restarted GMRES(m). The default value is 100. *\item[stopCrit xxx] where xxx is one of {\sf absolute} or {\sf relative} * stopping criterion. *\item[superluOrdering xxx] - where xxx specifies one of {\sf natural} or * {\sf mmd} (minimum degree ordering). This ordering * is used to minimize the number of nonzeros generated * in the LU decomposition. The default is natural ordering. *\item[superluScale xxx] where xxx specifies one of {\sf y} (perform row * and column scalings before decomposition) or {\sf n}. * The default is no scaling. *\end{description} **/ Preconditioners and Solvers /** * Parameter options for the algebraic multigrid preconditioner BoomerAMG. * *\begin{description} *\item[amgMaxLevels xxx] where xxx is an integer specifying the maximum * number of levels to be used for the grid hierarchy. *\item[amgCoarsenType xxx] where xxx specifies one of {\sf falgout} or * {\sf ruge}, or {\sf default (CLJP)} coarsening for BoomerAMG. *\item[amgMeasureType xxx] where xxx specifies one of {\sf local} or * or {\sf global}. This parameter affects how coarsening is * performed in parallel. *\item[amgRelaxType xxx] where xxx is one of {\sf jacobi} (Damped Jacobi), * {\sf gs-slow} (sequential Gauss-Seidel), {\sf gs-fast} * (Gauss-Seidel on interior nodes), or {\sf hybrid}. * The default is {\sf hybrid}. *\item[amgNumSweeps xxx] where xxx is an integer specifying the number of * pre- and post-smoothing at each level of BoomerAMG. * The default is two pre- and two post-smoothings. *\item[amgRelaxWeight xxx] where xxx is a floating point number between * 0 and 1 specifying the damping factor for BoomerAMG's damped * Jacobi and GS smoothers. The default value is 1.0. *\item[amgRelaxOmega xxx] where xxx is a floating point number between * 0 and 1 specifying the damping factor for BoomerAMG's hybrid * smoother for multiple processors. The default value is 1.0. *\item[amgStrongThreshold xxx] where xxx is a floating point number between 0 * and 1 specifying the threshold used to determine * strong coupling in BoomerAMG's coasening. The default * value is 0.25. *\item[amgSystemSize xxx] where xxx is the degree of freedom per node. *\item[amgMaxLevels xxx] where xxx is an integer specifying the maximum * number of iterations to be used during the solve phase. *\item[amgUseGSMG] - tells BoomerAMG to use a different coarsening called * GSMG. *\item[amgGSMGNumSamples] where xxx is the number of samples to generate * to determine how to coarsen for GSMG. *\end{description} **/ BoomerAMG /** * Parameter options for the smoothed aggregation preconditioner MLI. * *\begin{description} *\item[outputLevel xxx] where xxx is the output level for diagnostics. *\item[method xxx] where xxx is either {\sf AMGSA} (default), {\sf AMGSAe}, * to indicate which MLI algorithm is to be used. *\item[numLevels xxx] where xxx is the maximum number of levels (default=30) * used. *\item[maxIterations xxx] where xxx is the maximum number of iterations * (default = 1 as preconditioner). *\item[cycleType xxx] where xxx is either 'V' or 'W' cycle (default = 'V'). *\item[strengthThreshold xxx] strength threshold for coarsening (default = 0). *\item[smoother xxx] where xxx is either {\sf Jacobi}, {\sf BJacobi}, {\sf GS}, * {\sf SGS}, {\sf HSGS} (SSOR,default), {\sf BSGS}, {\sf ParaSails}, * {\sf MLS}, {\sf CGJacobi}, {\sf CGBJacobi}, or {\sf Chebyshev}. *\item[numSweeps xxx] where xxx is the number of smoother sweeps (default = 2). *\item[coarseSolver xxx] where xxx is one of those in 'smoother' or * {\sf SuperLU} (default). *\item[minCoarseSize xxx] where xxx is the minimum coarse grid size to * control the number of levels used (default = 3000). *\item[Pweight xxx] where xxx is the relaxation parameter for the prolongation * smoother (default 0.0). *\item[nodeDOF xxx] where xxx is the degree of freedom for each node * (default = 1). *\item[nullSpaceDim xxx] where xxx is the dimension of the null space for * the coarse grid (default = 1). *\item[useNodalCoord xxx] where xxx is either 'on' or 'off' (default) * to indicate whether the nodal coordinates are used to generate the * initial null space. *\item[saAMGCalibrationSize xxx] where xxx is the additional null space * vectors to be generated via calibration (default = 0). *\item[numSmoothVecs xxx] where xxx is the number of near null space * vectors used to create the prolongation operator (default = 0). *\item[smoothVecSteps xxx] where xxx is the number of smoothing steps * used to generate the smooth vectors (default = 0). *\end{description} * *In addition, to use 'AMGSAe', the parameter 'haveSFEI' has to be sent into *the FEI using the parameters function (this option is valid only for the *Sandia FEI implementation). **/ MLI /** * Parameter options for ILUT, ParaSails and polynomial preconditioners * are defined. * *\begin{description} *\item[euclidNlevels xxx] where xxx is an non-negative integer specifying * the desired sparsity of the incomplete factors. The * default value is 0. *\item[euclidThreshold xxx] where xxx is a floating point number specifying * the threshold used to sparsify the incomplete factors. The default * value is 0.0. *\item[parasailsThreshold xxx] where xxx is a floating point number between 0 * and 1 specifying the threshold used to prune small entries * in setting up the sparse approximate inverse. The default * value is 0.0. *\item[parasailsNlevels xxx] where xxx is an integer larger than 0 specifying * the desired sparsity of the approximate inverse. The * default value is 1. *\item[parasailsFilter xxx] where xxx is a floating point number between 0 * and 1 specifying the threshold used to prune small entries * in $A$. The default value is 0.0. *\item[parasailsLoadbal xxx] where xxx is a floating point number between 0 * and 1 specifying how load balancing has to be done * (Edmond, explain please). The default value is 0.0. *\item[parasailsSymmetric] sets Parasails to take $A$ as symmetric. *\item[parasailsUnSymmetric] sets Parasails to take $A$ as nonsymmetric * (default). *\item[parasailsReuse] sets Parasails to reuse the sparsity pattern of $A$. *\item[polyorder xxx] where xxx is the order of the least-squares polynomial * preconditioner. *\end{description} **/ Various /** * Parameters which define different reduction modes. * *\begin{description} *\item[schurReduction] turns on the Schur reduction mode. *\item[slideReduction] turns on the slide reduction mode. *\item[slideReduction2] turns on the slide reduction mode version 2 *(see section 2). *\item[slideReduction3] turns on the slide reduction mode version 3 *(see section 2). *\end{description} **/ Matrix Reduction /** * Parameters control diagnostic information, memory use, etc. * *\begin{description} *\item[outputLevel xxx] where xxx is an integer specifying the output * level. An output level of $1$ prints only the solver * information such as number of iterations and timings. * An output level of $2$ prints debug information such as * the functions visited and preconditioner information. * An output level of $3$ or higher prints more debug information * such as the matrix and right hand side loaded via the * LinearSystemCore functions to the standard output. *\item[setDebug xxx] where xxx is one of {\sf slideReduction1}, * {\sf slideReduction2}, * {\sf slideReduction3} (level 1,2,3 diagnostics in the slide surface * reduction code), {\sf printMat} (print the original matrix * into a file), {\sf printReducedMat} (print the reduced matrix * into a file), {\sf printSol} (print the solution into a file), * {\sf ddilut} (output diagnostic information for DDIlut * preconditioner setup), and {\sf amgDebug} (output diagnostic * information for AMG). *\item[optimizeMemory] cleans up the matrix sparsity pattern after the matrix * has been loaded. (It has been kept to allow matrix reuse.) *\item[imposeNoBC] turns off the boundary condition to allow diagnosing the * matrix (for example, checking the null space.) *\end{description} **/ Performance Tuning and Diagnostics /** * Parameters that are helpful for finite element information. * *\begin{description} *\item[AConjugateProjection xxx] where xxx specifies the number of previous * solution vectors to keep for the A-conjugate projection. * The default is 0 (the projection is off). *\item[minResProjection xxx] where xxx specifies the number of previous * solution vectors to keep for projection. * The default is 0 (the projection is off). *\item[haveFEData] indicates that additional finite element information are * available to assist in building more efficient solvers. *\item[haveSFEI] indicates that the simplified finite element information are * available to assist in building more efficient solvers. *\end{description} **/ Miscellaneous /*@}*/ /*@}*/ hypre-2.33.0/src/FEI_mv/fei-hypre/LLNL_FEI_Fei.cxx000066400000000000000000003632031477326011500212620ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /************************************************************************** Module: LLNL_FEI_Fei.cxx Purpose: custom implementation of the FEI **************************************************************************/ #include #include #include #include #include "_hypre_utilities.h" #include "HYPRE.h" #include "LLNL_FEI_Fei.h" /************************************************************************** ************************************************************************** Each element block contains a number of elements of the same type (e.g. hex or tet element). For this implementation, all element block should have the same number of degree of freedom per node. **************************************************************************/ /************************************************************************** Constructor -------------------------------------------------------------------------*/ LLNL_FEI_Elem_Block::LLNL_FEI_Elem_Block( int blockID ) { blockID_ = blockID; currElem_ = 0; numElems_ = 0; nodesPerElem_ = 0; nodeDOF_ = 0; elemIDs_ = NULL; elemNodeLists_ = NULL; elemMatrices_ = NULL; rhsVectors_ = NULL; solnVectors_ = NULL; tempX_ = NULL; tempY_ = NULL; sortedIDs_ = NULL; sortedIDAux_ = NULL; } /************************************************************************** destructor -------------------------------------------------------------------------*/ LLNL_FEI_Elem_Block::~LLNL_FEI_Elem_Block() { int iE; if ( elemIDs_ != NULL ) delete [] elemIDs_; if ( elemNodeLists_ != NULL ) { for ( iE = 0; iE < numElems_; iE++ ) if ( elemNodeLists_[iE] != NULL ) delete [] elemNodeLists_[iE]; delete [] elemNodeLists_; } if ( elemMatrices_ != NULL ) { for ( iE = 0; iE < numElems_; iE++ ) if ( elemMatrices_[iE] != NULL ) delete [] elemMatrices_[iE]; delete [] elemMatrices_; } if ( rhsVectors_ != NULL ) { for ( iE = 0; iE < numElems_; iE++ ) if ( rhsVectors_[iE] != NULL ) delete [] rhsVectors_[iE]; delete [] rhsVectors_; } if ( solnVectors_ != NULL ) { for ( iE = 0; iE < numElems_; iE++ ) if ( solnVectors_[iE] != NULL ) delete [] solnVectors_[iE]; delete [] solnVectors_; } if ( sortedIDs_ != NULL ) delete [] sortedIDs_; if ( sortedIDAux_ != NULL ) delete [] sortedIDAux_; if ( tempX_ != NULL ) delete [] tempX_; if ( tempY_ != NULL ) delete [] tempY_; } /************************************************************************** initialization -------------------------------------------------------------------------*/ int LLNL_FEI_Elem_Block::initialize(int numElements, int numNodesPerElement, int dofPerNode) { int iE; if ( elemIDs_ != NULL ) delete [] elemIDs_; if ( elemNodeLists_ != NULL ) { for ( iE = 0; iE < numElems_; iE++ ) if ( elemNodeLists_[iE] != NULL ) delete [] elemNodeLists_[iE]; delete [] elemNodeLists_; } if ( elemMatrices_ != NULL ) { for ( iE = 0; iE < numElems_; iE++ ) if ( elemMatrices_[iE] != NULL ) delete [] elemMatrices_[iE]; delete [] elemMatrices_; } if ( rhsVectors_ != NULL ) { for ( iE = 0; iE < numElems_; iE++ ) if ( rhsVectors_[iE] != NULL ) delete [] rhsVectors_[iE]; delete [] rhsVectors_; } if ( solnVectors_ != NULL ) { for ( iE = 0; iE < numElems_; iE++ ) if ( solnVectors_[iE] != NULL ) delete [] solnVectors_[iE]; delete [] solnVectors_; } numElems_ = numElements; nodesPerElem_ = numNodesPerElement; nodeDOF_ = dofPerNode; currElem_ = 0; elemIDs_ = new int[numElems_]; elemNodeLists_ = new int*[numElems_]; for ( iE = 0; iE < numElems_; iE++ ) elemNodeLists_[iE] = NULL; elemMatrices_ = new double*[numElems_]; for ( iE = 0; iE < numElems_; iE++ ) elemMatrices_[iE] = NULL; rhsVectors_ = new double*[numElems_]; for ( iE = 0; iE < numElems_; iE++ ) rhsVectors_[iE] = NULL; solnVectors_ = new double*[numElems_]; for ( iE = 0; iE < numElems_; iE++ ) solnVectors_[iE] = NULL; return 0; } /************************************************************************** reset the system for reloading (no reinitialization needed) -------------------------------------------------------------------------*/ int LLNL_FEI_Elem_Block::reset() { int iE; if ( elemNodeLists_ != NULL ) { for ( iE = 0; iE < numElems_; iE++ ) { if ( elemNodeLists_[iE] != NULL ) delete [] elemNodeLists_[iE]; elemNodeLists_[iE] = NULL; } } if ( elemMatrices_ != NULL ) { for ( iE = 0; iE < numElems_; iE++ ) { if ( elemMatrices_[iE] != NULL ) delete [] elemMatrices_[iE]; elemMatrices_[iE] = NULL; } } if ( rhsVectors_ != NULL ) { for ( iE = 0; iE < numElems_; iE++ ) { if ( rhsVectors_[iE] != NULL ) delete [] rhsVectors_[iE]; rhsVectors_[iE] = NULL; } } currElem_ = 0; return 0; } /************************************************************************** reset the element load vectors -------------------------------------------------------------------------*/ int LLNL_FEI_Elem_Block::resetRHSVectors(double s) { int iE, iD, matDim=nodesPerElem_*nodeDOF_; if ( rhsVectors_ != NULL ) { for ( iE = 0; iE < numElems_; iE++ ) for ( iD = 0; iD < matDim; iD++ ) rhsVectors_[iE][iD] = s; } currElem_ = 0; return 0; } /************************************************************************** reset the element solution vectors -------------------------------------------------------------------------*/ int LLNL_FEI_Elem_Block::resetSolnVectors(double s) { int iE, iD, matDim=nodesPerElem_*nodeDOF_; if ( solnVectors_ != NULL ) { for ( iE = 0; iE < numElems_; iE++ ) for ( iD = 0; iD < matDim; iD++ ) solnVectors_[iE][iD] = s; } currElem_ = 0; return 0; } /************************************************************************** load individual element information -------------------------------------------------------------------------*/ int LLNL_FEI_Elem_Block::loadElemInfo(int elemID, int *elemConn, double **elemStiff, double *elemLoad) { if ( currElem_ >= numElems_ ) { printf("LLNL_FEI_Elem_Block::loadElemInfo ERROR : too many elements.\n"); exit(1); } #if 0 printf("Loading element %d : ", elemID); for ( int iN2 = 0; iN2 < nodesPerElem_; iN2++ ) printf("%d ", elemConn[iN2]); printf("\n"); #endif elemNodeLists_[currElem_] = new int[nodesPerElem_]; int matDim = nodesPerElem_ * nodeDOF_; elemMatrices_[currElem_] = new double[matDim*matDim]; rhsVectors_[currElem_] = new double[matDim]; if ( solnVectors_[currElem_] != NULL ) delete [] solnVectors_[currElem_]; solnVectors_[currElem_] = new double[matDim]; elemIDs_[currElem_] = elemID; for ( int iN = 0; iN < nodesPerElem_; iN++ ) elemNodeLists_[currElem_][iN] = elemConn[iN]; for ( int iM = 0; iM < matDim; iM++ ) rhsVectors_[currElem_][iM] = elemLoad[iM]; for ( int iM2 = 0; iM2 < matDim; iM2++ ) solnVectors_[currElem_][iM2] = 0.0; for ( int iM3 = 0; iM3 < matDim; iM3++ ) for ( int jM = 0; jM < matDim; jM++ ) elemMatrices_[currElem_][jM*matDim+iM3] = elemStiff[iM3][jM]; currElem_++; return 0; } /************************************************************************** load individual element matrix only -------------------------------------------------------------------------*/ int LLNL_FEI_Elem_Block::loadElemMatrix(int elemID, int *elemConn, double **elemStiff) { if ( currElem_ >= numElems_ ) { printf("LLNL_FEI_Elem_Block::loadElemMatrix ERROR- too many elements.\n"); exit(1); } #if 0 printf("Loading element %d : ", elemID); for ( int iN = 0; iN < nodesPerElem_; iN++ ) printf("%d ", elemConn[iN]); printf("\n"); #endif elemNodeLists_[currElem_] = new int[nodesPerElem_]; int matDim = nodesPerElem_ * nodeDOF_; elemMatrices_[currElem_] = new double[matDim*matDim]; if ( solnVectors_[currElem_] != NULL ) delete [] solnVectors_[currElem_]; solnVectors_[currElem_] = new double[matDim]; elemIDs_[currElem_] = elemID; for ( int iN = 0; iN < nodesPerElem_; iN++ ) elemNodeLists_[currElem_][iN] = elemConn[iN]; for ( int iM2 = 0; iM2 < matDim; iM2++ ) solnVectors_[currElem_][iM2] = 0.0; for ( int iM3 = 0; iM3 < matDim; iM3++ ) for ( int jM = 0; jM < matDim; jM++ ) elemMatrices_[currElem_][jM*matDim+iM3] = elemStiff[iM3][jM]; currElem_++; return 0; } /************************************************************************** load individual load information -------------------------------------------------------------------------*/ int LLNL_FEI_Elem_Block::loadElemRHS(int elemID, double *elemLoad) { int iD, iE, matDim=nodesPerElem_*nodeDOF_; if ( currElem_ >= numElems_ ) currElem_ = 0; if ( numElems_ > 0 && elemID != elemIDs_[currElem_] ) { if ( sortedIDs_ == NULL ) { sortedIDs_ = new int[numElems_]; sortedIDAux_ = new int[numElems_]; for ( iE = 0; iE < numElems_; iE++ ) sortedIDs_[iE] = elemIDs_[iE]; for ( iE = 0; iE < numElems_; iE++ ) sortedIDAux_[iE] = iE; LLNL_FEI_Fei::IntSort2(sortedIDs_, sortedIDAux_, 0, numElems_-1); } currElem_ = hypre_BinarySearch(sortedIDs_,elemID,numElems_); } if ( rhsVectors_ == NULL ) { rhsVectors_ = new double*[numElems_]; for ( iE = 0; iE < numElems_; iE++ ) rhsVectors_[iE] = NULL; } if ( rhsVectors_[currElem_] == NULL ) rhsVectors_[currElem_] = new double[matDim]; for ( iD = 0; iD < matDim; iD++ ) rhsVectors_[currElem_][iD] = elemLoad[iD]; currElem_++; return 0; } /************************************************************************** check to see if all element information has been loaded -------------------------------------------------------------------------*/ int LLNL_FEI_Elem_Block::checkLoadComplete() { if ( currElem_ != numElems_ ) return 1; else { if ( tempX_ != NULL ) delete [] tempX_; if ( tempY_ != NULL ) delete [] tempY_; tempX_ = new double[nodesPerElem_*nodeDOF_]; tempY_ = new double[nodesPerElem_*nodeDOF_]; } return 0; } /************************************************************************** LLNL_FEI_Fei is the core linear system interface. Each instantiation supports multiple elememt blocks. **************************************************************************/ /************************************************************************** Constructor -------------------------------------------------------------------------*/ LLNL_FEI_Fei::LLNL_FEI_Fei( MPI_Comm comm ) { mpiComm_ = comm; MPI_Comm_rank( comm, &mypid_ ); numBlocks_ = 0; elemBlocks_ = NULL; outputLevel_ = 0; /* ----------------------------------------------------------------- * node information * ----------------------------------------------------------------*/ numLocalNodes_ = 0; numExtNodes_ = 0; nodeDOF_ = 1; nodeGlobalIDs_ = NULL; nodeExtNewGlobalIDs_ = NULL; globalNodeOffsets_ = NULL; globalCROffsets_ = NULL; numSharedNodes_ = 0; sharedNodeIDs_ = NULL; sharedNodeNProcs_ = NULL; sharedNodeProcs_ = NULL; numCRMult_ = 0; CRListLen_ = 0; CRNodeLists_ = NULL; CRFieldID_ = -1; CRWeightLists_ = NULL; CRValues_ = NULL; /* ----------------------------------------------------------------- * communication information * ----------------------------------------------------------------*/ nRecvs_ = 0; recvLengs_ = NULL; recvProcs_ = NULL; recvProcIndices_ = NULL; nSends_ = 0; sendLengs_ = NULL; sendProcs_ = NULL; sendProcIndices_ = NULL; /* ----------------------------------------------------------------- * matrix and vector information * ----------------------------------------------------------------*/ matPtr_ = new LLNL_FEI_Matrix(comm); solnVector_ = NULL; rhsVector_ = NULL; /* ----------------------------------------------------------------- * node boundary condition information * ----------------------------------------------------------------*/ numBCNodes_ = 0; BCNodeIDs_ = NULL; BCNodeAlpha_ = NULL; BCNodeBeta_ = NULL; BCNodeGamma_ = NULL; /* ----------------------------------------------------------------- * others * ----------------------------------------------------------------*/ FLAG_LoadComplete_ = 0; TimerLoad_ = 0.0; TimerLoadStart_ = 0.0; } /************************************************************************** destructor -------------------------------------------------------------------------*/ LLNL_FEI_Fei::~LLNL_FEI_Fei() { int iB; double internCode=1.0e35; if ( outputLevel_ > 2 ) printf("%4d : LLNL_FEI_Fei destructor\n", mypid_); resetSystem(internCode); if ( matPtr_ != NULL ) delete matPtr_; for ( iB = 0; iB < numBlocks_; iB++ ) if ( elemBlocks_[iB] != NULL ) delete elemBlocks_[iB]; if ( elemBlocks_ != NULL ) delete [] elemBlocks_; if ( solnVector_ != NULL ) delete [] solnVector_; } /************************************************************************** parameters function -------------------------------------------------------------------------*/ int LLNL_FEI_Fei::parameters(int numParams, char **paramString) { int i, one=1; char param1[256]; for ( i = 0; i < numParams; i++ ) { sscanf(paramString[i],"%s", param1); if ( !strcmp(param1, "outputLevel") ) { sscanf(paramString[i],"%s %d", param1, &outputLevel_); if ( outputLevel_ < 0 ) outputLevel_ = 0; if ( outputLevel_ > 4 ) outputLevel_ = 4; matPtr_->parameters( one, ¶mString[i] ); } else if ( !strcmp(param1, "matrixNoOverlap") ) { matPtr_->parameters( one, ¶mString[i] ); } else if ( !strcmp(param1, "setDebug") ) { matPtr_->parameters( one, ¶mString[i] ); } } return 0; } /************************************************************************** initialize nodal degree of freedom -------------------------------------------------------------------------*/ int LLNL_FEI_Fei::initFields(int numFields, int *fieldSizes, int *fieldIDs) { (void) fieldIDs; if ( numFields != 1 ) { printf("%4d : LLNL_FEI_Fei::initFields WARNING - numFields != 1", mypid_); printf(" Take field 0.\n"); nodeDOF_ = fieldSizes[0]; return -1; } nodeDOF_ = fieldSizes[0]; return 0; } /************************************************************************** set element and node information -------------------------------------------------------------------------*/ int LLNL_FEI_Fei::initElemBlock(int elemBlockID, int numElements, int numNodesPerElement, int *numFieldsPerNode, int **nodalFieldIDs, int numElemDOFFieldsPerElement, int *elemDOFFieldIDs, int interleaveStrategy) { (void) numFieldsPerNode; (void) nodalFieldIDs; (void) numElemDOFFieldsPerElement; (void) elemDOFFieldIDs; (void) interleaveStrategy; if ( outputLevel_ > 2 ) { printf("%4d : LLNL_FEI_Fei::initElemBlock begins... \n", mypid_); printf(" elemBlockID = %d \n", elemBlockID); printf(" numElements = %d \n", numElements); printf(" nodesPerElem = %d \n", numNodesPerElement); if ( outputLevel_ > 3 ) { for ( int iN = 0; iN < numNodesPerElement; iN++ ) { printf(" Node %d has fields : ", iN); for ( int iF = 0; iF < numFieldsPerNode[iN]; iF++ ) printf("%d ", nodalFieldIDs[iN][iF]); printf("\n"); } for ( int iE = 0; iE < numElemDOFFieldsPerElement; iE++ ) printf(" Element field IDs %d = %d\n", iE, elemDOFFieldIDs[iE]); } } if ( numBlocks_ == 0 ) { elemBlocks_ = new LLNL_FEI_Elem_Block*[1]; elemBlocks_[0] = new LLNL_FEI_Elem_Block(elemBlockID); numBlocks_ = 1; } else { for ( int iB = 0; iB < numBlocks_; iB++ ) { if ( elemBlocks_[iB]->getElemBlockID() == elemBlockID ) { printf("%4d : LLNL_FEI_Fei::initElemBlock ERROR - ",mypid_); printf("repeated blockID\n"); exit(1); } } LLNL_FEI_Elem_Block **tempBlocks = elemBlocks_; numBlocks_++; elemBlocks_ = new LLNL_FEI_Elem_Block*[numBlocks_]; for ( int iB2 = 0; iB2 < numBlocks_-1; iB2++ ) elemBlocks_[iB2] = tempBlocks[iB2]; elemBlocks_[numBlocks_-1] = new LLNL_FEI_Elem_Block(elemBlockID); delete [] tempBlocks; } elemBlocks_[numBlocks_-1]->initialize(numElements, numNodesPerElement, nodeDOF_); FLAG_LoadComplete_= 0; if ( outputLevel_ > 2 ) printf("%4d : LLNL_FEI_Fei::initElemBlock ends.\n", mypid_); return 0; } /************************************************************************** initialize shared node information -------------------------------------------------------------------------*/ int LLNL_FEI_Fei::initSharedNodes(int nShared, int *sharedIDs, int *sharedNProcs, int **sharedProcs) { int iN, iP, newNumShared, *oldSharedIDs, *oldSharedNProcs; int **oldSharedProcs; if ( outputLevel_ > 2 ) printf("%4d : LLNL_FEI_Fei::initSharedNodes begins... \n", mypid_); TimerLoadStart_ = MPI_Wtime(); if ( numSharedNodes_ > 0 ) { newNumShared = numSharedNodes_ + nShared; oldSharedIDs = sharedNodeIDs_; sharedNodeIDs_ = new int[newNumShared]; for ( iN = 0; iN < numSharedNodes_; iN++ ) sharedNodeIDs_[iN] = oldSharedIDs[iN]; for ( iN = 0; iN < nShared; iN++ ) sharedNodeIDs_[iN+numSharedNodes_] = sharedIDs[iN]; oldSharedNProcs = sharedNodeNProcs_; sharedNodeNProcs_ = new int[newNumShared]; for ( iN = 0; iN < numSharedNodes_; iN++ ) sharedNodeNProcs_[iN] = oldSharedNProcs[iN]; for ( iN = 0; iN < nShared; iN++ ) sharedNodeNProcs_[iN+numSharedNodes_] = sharedNProcs[iN]; oldSharedProcs = sharedNodeProcs_; sharedNodeProcs_ = new int*[newNumShared]; for ( iN = 0; iN < numSharedNodes_; iN++ ) sharedNodeProcs_[iN] = oldSharedProcs[iN]; for ( iN = 0; iN < nShared; iN++ ) { sharedNodeProcs_[iN+numSharedNodes_] = new int[sharedNProcs[iN]]; for ( iP = 0; iP < sharedNProcs[iN]; iP++ ) sharedNodeProcs_[iN+numSharedNodes_][iP] = sharedProcs[iN][iP]; } numSharedNodes_ = newNumShared; delete [] oldSharedProcs; delete [] oldSharedNProcs; delete [] oldSharedIDs; } else { numSharedNodes_ = nShared; sharedNodeIDs_ = new int[nShared]; for ( iN = 0; iN < nShared; iN++ ) sharedNodeIDs_[iN] = sharedIDs[iN]; sharedNodeNProcs_ = new int[nShared]; for ( iN = 0; iN < nShared; iN++ ) sharedNodeNProcs_[iN] = sharedNProcs[iN]; sharedNodeProcs_ = new int*[nShared]; for ( iN = 0; iN < nShared; iN++ ) { sharedNodeProcs_[iN] = new int[sharedNProcs[iN]]; for ( iP = 0; iP < sharedNProcs[iN]; iP++ ) sharedNodeProcs_[iN][iP] = sharedProcs[iN][iP]; } } TimerLoad_ += MPI_Wtime() - TimerLoadStart_; if ( outputLevel_ > 2 ) printf("%4d : LLNL_FEI_Fei::initSharedNodes ends. \n", mypid_); return 0; } /************************************************************************** reset the system -------------------------------------------------------------------------*/ int LLNL_FEI_Fei::resetSystem(double s) { (void) s; if ( outputLevel_ > 2 ) printf("%4d : LLNL_FEI_Fei::resetSystem begins...\n", mypid_); resetMatrix(s); if ( rhsVector_ != NULL ) delete [] rhsVector_; rhsVector_ = NULL; if ( outputLevel_ > 2 ) printf("%4d : LLNL_FEI_Fei::resetSystem ends.\n", mypid_); return 0; } /************************************************************************** reset the matrix -------------------------------------------------------------------------*/ int LLNL_FEI_Fei::resetMatrix(double s) { int iB, iD; double internCode=1.0e35; if ( outputLevel_ > 2 ) printf("%4d : LLNL_FEI_Fei::resetMatrix begins...\n", mypid_); for ( iB = 0; iB < numBlocks_; iB++ ) elemBlocks_[iB]->reset(); numLocalNodes_ = 0; numExtNodes_ = 0; if ( nodeGlobalIDs_ != NULL ) delete [] nodeGlobalIDs_; if ( nodeExtNewGlobalIDs_ != NULL ) delete [] nodeExtNewGlobalIDs_; if ( globalNodeOffsets_ != NULL ) delete [] globalNodeOffsets_; if ( globalCROffsets_ != NULL ) delete [] globalCROffsets_; if ( recvLengs_ != NULL ) delete [] recvLengs_; if ( recvProcs_ != NULL ) delete [] recvProcs_; if ( recvProcIndices_ != NULL ) delete [] recvProcIndices_; if ( sendLengs_ != NULL ) delete [] sendLengs_; if ( sendProcs_ != NULL ) delete [] sendProcs_; if ( sendProcIndices_ != NULL ) delete [] sendProcIndices_; if ( matPtr_ != NULL ) delete matPtr_; if ( BCNodeAlpha_ != NULL ) { for ( iD = 0; iD < numBCNodes_; iD++ ) delete [] BCNodeAlpha_[iD]; delete [] BCNodeAlpha_; } if ( BCNodeBeta_ != NULL ) { for ( iD = 0; iD < numBCNodes_; iD++ ) delete [] BCNodeBeta_[iD]; delete [] BCNodeBeta_; } if ( BCNodeGamma_ != NULL ) { for ( iD = 0; iD < numBCNodes_; iD++ ) delete [] BCNodeGamma_[iD]; delete [] BCNodeGamma_; } if ( BCNodeIDs_ != NULL ) delete [] BCNodeIDs_; if ( s == internCode ) { if ( CRNodeLists_ != NULL ) { for ( iD = 0; iD < numCRMult_; iD++ ) if ( CRNodeLists_[iD] != NULL ) delete [] CRNodeLists_[iD]; delete [] CRNodeLists_; } if ( CRWeightLists_ != NULL ) { for ( iD = 0; iD < numCRMult_; iD++ ) if ( CRWeightLists_[iD] != NULL ) delete [] CRWeightLists_[iD]; delete [] CRWeightLists_; } if ( CRValues_ != NULL ) delete [] CRValues_; numCRMult_ = 0; CRListLen_ = 0; CRNodeLists_ = NULL; CRWeightLists_ = NULL; CRValues_ = NULL; } if ( s == internCode ) { if ( sharedNodeIDs_ != NULL ) delete [] sharedNodeIDs_; if ( sharedNodeNProcs_ != NULL ) delete [] sharedNodeNProcs_; if ( sharedNodeProcs_ != NULL ) { for ( iD = 0; iD < numSharedNodes_; iD++ ) if ( sharedNodeProcs_[iD] != NULL ) delete [] sharedNodeProcs_[iD]; delete [] sharedNodeProcs_; } numSharedNodes_ = 0; sharedNodeIDs_ = NULL; sharedNodeNProcs_ = NULL; sharedNodeProcs_ = NULL; } nSends_ = 0; nRecvs_ = 0; nodeGlobalIDs_ = NULL; nodeExtNewGlobalIDs_ = NULL; globalNodeOffsets_ = NULL; globalCROffsets_ = NULL; recvLengs_ = NULL; recvProcs_ = NULL; recvProcIndices_ = NULL; sendLengs_ = NULL; sendProcs_ = NULL; sendProcIndices_ = NULL; matPtr_ = new LLNL_FEI_Matrix(mpiComm_); BCNodeIDs_ = NULL; BCNodeAlpha_ = NULL; BCNodeBeta_ = NULL; BCNodeGamma_ = NULL; numBCNodes_ = 0; TimerLoad_ = 0.0; TimerLoadStart_ = 0.0; TimerSolve_ = 0.0; TimerSolveStart_ = 0.0; FLAG_LoadComplete_ = 0; if ( outputLevel_ > 2 ) printf("%4d : LLNL_FEI_Fei::resetMatrix ends.\n", mypid_); return 0; } /************************************************************************** reset the rhs vector -------------------------------------------------------------------------*/ int LLNL_FEI_Fei::resetRHSVector(double s) { (void) s; if ( outputLevel_ > 2 ) printf("%4d : LLNL_FEI_Fei::resetRHSVector begins...\n", mypid_); for ( int iB = 0; iB < numBlocks_; iB++ ) elemBlocks_[iB]->resetRHSVectors(s); if ( outputLevel_ > 2 ) printf("%4d : LLNL_FEI_Fei::resetRHSVector ends.\n", mypid_); return 0; } /************************************************************************** reset the solution vector -------------------------------------------------------------------------*/ int LLNL_FEI_Fei::resetInitialGuess(double s) { (void) s; if ( outputLevel_ > 2 ) printf("%4d : LLNL_FEI_Fei::resetInitialGuess begins...\n", mypid_); for ( int iB = 0; iB < numBlocks_; iB++ ) elemBlocks_[iB]->resetSolnVectors(s); if ( outputLevel_ > 2 ) printf("%4d : LLNL_FEI_Fei::resetInitialGuess ends (%e).\n", mypid_, s); return 0; } /************************************************************************** load node boundary conditions -------------------------------------------------------------------------*/ int LLNL_FEI_Fei::loadNodeBCs(int numNodes, int *nodeIDs, int fieldID, double **alpha, double **beta, double **gamma) { int iN, iD, oldNumBCNodes, *oldBCNodeIDs; double **oldBCAlpha, **oldBCBeta, **oldBCGamma; (void) fieldID; if ( outputLevel_ > 2 ) printf("%4d : LLNL_FEI_Fei::loadNodeBCs begins...(%d)\n",mypid_,numNodes); TimerLoadStart_ = MPI_Wtime(); if ( numNodes > 0 ) { if ( numBCNodes_ == 0 ) { numBCNodes_ = numNodes; BCNodeIDs_ = new int[numBCNodes_]; BCNodeAlpha_ = new double*[numBCNodes_]; BCNodeBeta_ = new double*[numBCNodes_]; BCNodeGamma_ = new double*[numBCNodes_]; for ( iN = 0; iN < numNodes; iN++ ) { BCNodeIDs_[iN] = nodeIDs[iN]; BCNodeAlpha_[iN] = new double[nodeDOF_]; BCNodeBeta_[iN] = new double[nodeDOF_]; BCNodeGamma_[iN] = new double[nodeDOF_]; for ( iD = 0; iD < nodeDOF_; iD++ ) { BCNodeAlpha_[iN][iD] = alpha[iN][iD]; BCNodeBeta_[iN][iD] = beta[iN][iD]; BCNodeGamma_[iN][iD] = gamma[iN][iD]; } } } else { oldNumBCNodes = numBCNodes_; oldBCNodeIDs = BCNodeIDs_; oldBCAlpha = BCNodeAlpha_; oldBCBeta = BCNodeBeta_; oldBCGamma = BCNodeGamma_; numBCNodes_ += numNodes; BCNodeIDs_ = new int[numBCNodes_]; BCNodeAlpha_ = new double*[numBCNodes_]; BCNodeBeta_ = new double*[numBCNodes_]; BCNodeGamma_ = new double*[numBCNodes_]; for ( iN = 0; iN < oldNumBCNodes; iN++ ) { BCNodeIDs_[iN] = oldBCNodeIDs[iN]; BCNodeAlpha_[iN] = oldBCAlpha[iN]; BCNodeBeta_[iN] = oldBCBeta[iN]; BCNodeGamma_[iN] = oldBCGamma[iN]; } delete [] oldBCNodeIDs; delete [] oldBCAlpha; delete [] oldBCBeta; delete [] oldBCGamma; for ( iN = 0; iN < numNodes; iN++ ) { BCNodeIDs_[oldNumBCNodes+iN] = nodeIDs[iN]; BCNodeAlpha_[oldNumBCNodes+iN] = new double[nodeDOF_]; BCNodeBeta_[oldNumBCNodes+iN] = new double[nodeDOF_]; BCNodeGamma_[oldNumBCNodes+iN] = new double[nodeDOF_]; for ( iD = 0; iD < nodeDOF_; iD++ ) { BCNodeAlpha_[oldNumBCNodes+iN][iD] = alpha[iN][iD]; BCNodeBeta_[oldNumBCNodes+iN][iD] = beta[iN][iD]; BCNodeGamma_[oldNumBCNodes+iN][iD] = gamma[iN][iD]; } } } } TimerLoad_ += MPI_Wtime() - TimerLoadStart_; if ( outputLevel_ > 2 ) printf("%4d : LLNL_FEI_Fei::loadNodeBCs ends.\n", mypid_); return 0; } /************************************************************************** load element connectivities, stiffness matrices, and element load -------------------------------------------------------------------------*/ int LLNL_FEI_Fei::sumInElem(int elemBlockID, int elemID, int *elemConn, double **elemStiff, double *elemLoad, int elemFormat) { int iB=0; (void) elemFormat; if ( numBlocks_ > 1 ) { for ( iB = 0; iB < numBlocks_; iB++ ) if ( elemBlocks_[iB]->getElemBlockID() == elemBlockID ) break; } #if DEBUG if ( iB == numBlocks_ ) { printf("%4d : LLNL_FEI_Fei::sumInElem ERROR - ", mypid_); printf("blockID invalid (%d).\n", iB); exit(1); } #endif #if DEBUG if ( outputLevel_ > 3 && elemBlocks_[iB]->getCurrentElem()==0 ) printf("%4d : LLNL_FEI_Fei::sumInElem begins... \n", mypid_); #endif if ( elemBlocks_[iB]->getCurrentElem()==0 ) TimerLoadStart_ = MPI_Wtime(); elemBlocks_[iB]->loadElemInfo(elemID, elemConn, elemStiff, elemLoad); if ( elemBlocks_[iB]->getCurrentElem()==elemBlocks_[iB]->getNumElems() ) TimerLoad_ += MPI_Wtime() - TimerLoadStart_; #if DEBUG if ( outputLevel_ > 3 && elemBlocks_[iB]->getCurrentElem()==elemBlocks_[iB]->getNumElems() ) printf("%4d : LLNL_FEI_Fei::sumInElem ends. \n", mypid_); #endif return 0; } /************************************************************************** load element connectivities and stiffness matrices -------------------------------------------------------------------------*/ int LLNL_FEI_Fei::sumInElemMatrix(int elemBlockID, int elemID, int *elemConn, double **elemStiff, int elemFormat) { int iB=0; (void) elemFormat; if ( numBlocks_ > 1 ) { for ( iB = 0; iB < numBlocks_; iB++ ) if ( elemBlocks_[iB]->getElemBlockID() == elemBlockID ) break; } #if DEBUG if ( iB == numBlocks_ ) { printf("%4d : LLNL_FEI_Fei::sumInElemMatrix ERROR - ", mypid_); printf("blockID invalid (%d).\n", iB); exit(1); } #endif #if DEBUG if ( outputLevel_ > 3 && elemBlocks_[iB]->getCurrentElem()==0 ) printf("%4d : LLNL_FEI_Fei::sumInElemMatrix begins... \n", mypid_); #endif if ( elemBlocks_[iB]->getCurrentElem()==0 ) TimerLoadStart_ = MPI_Wtime(); elemBlocks_[iB]->loadElemMatrix(elemID, elemConn, elemStiff); if ( elemBlocks_[iB]->getCurrentElem()==elemBlocks_[iB]->getNumElems() ) TimerLoad_ += MPI_Wtime() - TimerLoadStart_; #if DEBUG if ( outputLevel_ > 3 && elemBlocks_[iB]->getCurrentElem()==elemBlocks_[iB]->getNumElems() ) printf("%4d : LLNL_FEI_Fei::sumInElemMatrix ends. \n", mypid_); #endif return 0; } /************************************************************************** load element load -------------------------------------------------------------------------*/ int LLNL_FEI_Fei::sumInElemRHS(int elemBlockID, int elemID, int *elemConn, double *elemLoad) { int iB=0; (void) elemConn; if ( numBlocks_ > 1 ) { for ( iB = 0; iB < numBlocks_; iB++ ) if ( elemBlocks_[iB]->getElemBlockID() == elemBlockID ) break; } #if DEBUG if ( iB == numBlocks_ ) { printf("%4d : LLNL_FEI_Fei::sumInElemRHS ERROR - ", mypid_); printf("blockID invalid (%d).\n", iB); exit(1); } #endif elemBlocks_[iB]->loadElemRHS(elemID, elemLoad); return 0; } /************************************************************************** assemble matrix information -------------------------------------------------------------------------*/ int LLNL_FEI_Fei::loadComplete() { int nprocs, iB, iP, iN, iE, ierr, nodeRegister; int totalNNodes, nElems, elemNNodes, **elemNodeList, nodeNumber; int *nodeIDs, *nodeIDAux, localNNodes, *nodeIDAux2; int CRNNodes, *sharedNodePInfo, *gatherBuf1, *gatherBuf2; /* ----------------------------------------------------------------- * get machine information * ----------------------------------------------------------------*/ if ( outputLevel_ > 2 ) printf("%4d : LLNL_FEI_Fei::loadComplete begins.... \n", mypid_); TimerLoadStart_ = MPI_Wtime(); MPI_Comm_size( mpiComm_, &nprocs ); /* ----------------------------------------------------------------- * check that element stiffness matrices, connectivities, and rhs * have been loaded, and create solution vectors. * ----------------------------------------------------------------*/ for ( iB = 0; iB < numBlocks_; iB++ ) { ierr = elemBlocks_[iB]->checkLoadComplete(); hypre_assert( !ierr ); } /* ----------------------------------------------------------------- * sort the shared nodes * ----------------------------------------------------------------*/ sortSharedNodes(); /* ----------------------------------------------------------------- * obtain an ordered array of maybe repeated node IDs * ----------------------------------------------------------------*/ composeOrderedNodeIDList(&nodeIDs, &nodeIDAux, &totalNNodes, &CRNNodes); /* ----------------------------------------------------------------- * based on shared node and CRMult information, construct an array * of to which processor each shared node belongs (nodeIDAux and * sharedNodePInfo) * ----------------------------------------------------------------*/ findSharedNodeProcs(nodeIDs, nodeIDAux, totalNNodes, CRNNodes, &sharedNodePInfo); /* ----------------------------------------------------------------- * tally the number of local nodes (internal and external) * ----------------------------------------------------------------*/ localNNodes = numLocalNodes_ = 0; for ( iN = 1; iN < totalNNodes; iN++ ) { if ( nodeIDs[iN] != nodeIDs[iN-1] ) { localNNodes++; if ( nodeIDAux[iN] >= 0 ) numLocalNodes_++; } } if ( totalNNodes > 0 ) localNNodes++; if ( totalNNodes > 0 && nodeIDAux[0] >= 0 ) numLocalNodes_++; if ( outputLevel_ > 2 ) { printf("%4d : LLNL_FEI_Fei::loadComplete - nLocalNodes = %d\n", mypid_, numLocalNodes_); printf("%4d : LLNL_FEI_Fei::loadComplete - numExtNodes = %d\n", mypid_, localNNodes-numLocalNodes_); printf("%4d : LLNL_FEI_Fei::loadComplete - numCRMult = %d\n", mypid_, numCRMult_); } /* ----------------------------------------------------------------- * construct global node list, starting with nodes that belong * to local processor * ----------------------------------------------------------------*/ numExtNodes_ = localNNodes - numLocalNodes_; nodeGlobalIDs_ = new int[localNNodes]; nodeNumber = 0; nodeRegister = -1; for ( iN = 0; iN < totalNNodes; iN++ ) { if ( nodeIDAux[iN] >= 0 && nodeIDs[iN] != nodeRegister ) { nodeRegister = nodeIDs[iN]; nodeGlobalIDs_[nodeNumber++] = nodeIDs[iN]; nodeIDs[iN] = nodeNumber - 1; } else if ( nodeIDAux[iN] >= 0 ) nodeIDs[iN] = nodeNumber - 1; } nodeRegister = -1; for ( iN = 0; iN < totalNNodes; iN++ ) { if ( nodeIDAux[iN] < 0 && nodeIDs[iN] != nodeRegister ) { nodeRegister = nodeIDs[iN]; nodeGlobalIDs_[nodeNumber++] = nodeIDs[iN]; nodeIDs[iN] = nodeNumber - 1; } else if ( nodeIDAux[iN] < 0 ) nodeIDs[iN] = nodeNumber - 1; } /* ----------------------------------------------------------------- * diagnostics * ----------------------------------------------------------------*/ #if 0 { int mypid, iNN, iNN2; char fname[30]; FILE *fp; MPI_Comm_rank( mpiComm_, &mypid ); sprintf(fname, "nodeID.%d", mypid); fp = fopen( fname, "w" ); fprintf(fp, "%9d %9d\n", numLocalNodes_, numExtNodes_); for ( iNN = 0; iNN < numLocalNodes_+numExtNodes_; iNN++ ) fprintf(fp, "%9d %9d\n", iNN, nodeGlobalIDs_[iNN]); fprintf(fp, "\n ---- shared nodes ---- \n"); for ( iNN = 0; iNN < numSharedNodes_; iNN++ ) for ( iNN2 = 0; iNN2 < sharedNodeNProcs_[iNN]; iNN2++ ) fprintf(fp, "%9d %9d %9d %9d\n", iNN,sharedNodeIDs_[iNN], sharedNodePInfo[iNN],sharedNodeProcs_[iNN][iNN2]); fprintf(fp, "\n ---- CR ---- \n"); for ( iNN = 0; iNN < numCRMult_; iNN++ ) { fprintf(fp, "%9d : ", iNN); for ( iNN2 = 0; iNN2 < CRListLen_; iNN2++ ) fprintf(fp, "%9d ", CRNodeLists_[iNN][iNN2]); fprintf(fp, "\n"); for ( iNN2 = 0; iNN2 < CRListLen_; iNN2++ ) fprintf(fp, " %9d : %16.8e %16.8e %16.8e\n", CRNodeLists_[iNN][iNN2], CRWeightLists_[iNN][iNN2*nodeDOF_], CRWeightLists_[iNN][iNN2*nodeDOF_+1], CRWeightLists_[iNN][iNN2*nodeDOF_+2]); } fclose(fp); } #endif /* ----------------------------------------------------------------- * rewrite the element connectivities with local node numbers * ----------------------------------------------------------------*/ if ( totalNNodes > 0 ) nodeIDAux2 = new int[totalNNodes]; for ( iN = 0; iN < totalNNodes; iN++ ) if ( nodeIDAux[iN] < 0 ) nodeIDAux[iN] = - nodeIDAux[iN] - 1; for ( iN = 0; iN < totalNNodes; iN++ ) { if ( nodeIDAux[iN] >= 0 && nodeIDAux[iN] < totalNNodes ) nodeIDAux2[nodeIDAux[iN]] = nodeIDs[iN]; else { printf("%4d : LLNL_FEI_Fei::loadComplete ERROR(2)\n",mypid_); exit(1); } } totalNNodes = 0; for ( iB = 0; iB < numBlocks_; iB++ ) { nElems = elemBlocks_[iB]->getNumElems(); elemNNodes = elemBlocks_[iB]->getElemNumNodes(); elemNodeList = elemBlocks_[iB]->getElemNodeLists(); for ( iE = 0; iE < nElems; iE++ ) { for ( iN = 0; iN < elemNNodes; iN++ ) elemNodeList[iE][iN] = nodeIDAux2[totalNNodes++]; } } if ( totalNNodes > 0 ) { delete [] nodeIDAux; delete [] nodeIDAux2; delete [] nodeIDs; } /* ----------------------------------------------------------------- * diagnostics * ----------------------------------------------------------------*/ #if 0 { int mypid, iD, iNN, iNN2; double **elemMats; char fname[30]; FILE *fp; MPI_Comm_rank( mpiComm_, &mypid ); sprintf(fname, "elemNode.%d", mypid); fp = fopen( fname, "w" ); for ( iB = 0; iB < numBlocks_; iB++ ) { nElems = elemBlocks_[iB]->getNumElems(); elemNNodes = elemBlocks_[iB]->getElemNumNodes(); elemNodeList = elemBlocks_[iB]->getElemNodeLists(); elemMats = elemBlocks_[iB]->getElemMatrices(); for ( iE = 0; iE < nElems; iE++ ) { fprintf(fp, "Element %7d : ", iE); for ( iN = 0; iN < elemNNodes; iN++ ) fprintf(fp, "%7d ", nodeGlobalIDs_[elemNodeList[iE][iN]]); fprintf(fp, "\n"); for ( iN = 0; iN < elemNNodes; iN++ ) { for ( iD = 0; iD < nodeDOF_; iD++ ) fprintf(fp, "%16.8e ", elemMats[iE][iN*nodeDOF_+iD]); fprintf(fp, "\n"); } } } fclose(fp); } #endif /* ----------------------------------------------------------------- * get global node offset information (globalNodeOffsets_) * ----------------------------------------------------------------*/ if ( globalNodeOffsets_ != NULL ) delete [] globalNodeOffsets_; if ( globalCROffsets_ != NULL ) delete [] globalCROffsets_; globalNodeOffsets_ = new int[nprocs+1]; globalCROffsets_ = new int[nprocs+1]; gatherBuf1 = new int[2]; gatherBuf2 = new int[2*nprocs]; gatherBuf1[0] = numLocalNodes_; gatherBuf1[1] = numCRMult_; MPI_Allgather(gatherBuf1, 2, MPI_INT, gatherBuf2, 2, MPI_INT, mpiComm_); for (iP = 0; iP < nprocs; iP++) globalNodeOffsets_[iP] = gatherBuf2[2*iP]; for (iP = 0; iP < nprocs; iP++) globalCROffsets_[iP] = gatherBuf2[2*iP+1]; for ( iP = nprocs; iP > 0; iP-- ) globalNodeOffsets_[iP] = globalNodeOffsets_[iP-1]; globalNodeOffsets_[0] = 0; for ( iP = 1; iP <= nprocs; iP++ ) globalNodeOffsets_[iP] += globalNodeOffsets_[iP-1]; for ( iP = nprocs; iP > 0; iP-- ) globalCROffsets_[iP] = globalCROffsets_[iP-1]; globalCROffsets_[0] = 0; for ( iP = 1; iP <= nprocs; iP++ ) globalCROffsets_[iP] += globalCROffsets_[iP-1]; delete [] gatherBuf1; delete [] gatherBuf2; /* ----------------------------------------------------------------- * next construct communication pattern * ----------------------------------------------------------------*/ setupCommPattern( sharedNodePInfo ); if ( sharedNodePInfo != NULL ) delete [] sharedNodePInfo; /* ----------------------------------------------------------------- * construct the global matrix and diagonal * ----------------------------------------------------------------*/ buildGlobalMatrixVector(); matPtr_->setComplete(); TimerLoad_ += MPI_Wtime() - TimerLoadStart_; FLAG_LoadComplete_ = 1; if ( outputLevel_ > 2 ) printf("%4d : LLNL_FEI_Fei::loadComplete ends. \n", mypid_); return 0; } /************************************************************************** get number of distinct node in a given block -------------------------------------------------------------------------*/ int LLNL_FEI_Fei::getNumBlockActNodes(int blockID, int *numNodes) { int localNNodes, iB, iE, iN, totalNNodes, nElems; int elemNNodes, **elemNodeLists, *nodeIDs; if ( numBlocks_ == 1 ) { (*numNodes) = numLocalNodes_ + numExtNodes_; if ( outputLevel_ > 2 ) { printf("%4d : LLNL_FEI_Fei::getNumBlockActNodes blockID = %d.\n", mypid_, blockID); printf("%4d : LLNL_FEI_Fei::getNumBlockActNodes numNodes = %d\n", mypid_, (*numNodes)); } return 0; } else { for ( iB = 0; iB < numBlocks_; iB++ ) if ( elemBlocks_[iB]->getElemBlockID() == blockID ) break; if ( iB >= numBlocks_ ) { printf("%4d : LLNL_FEI_Fei::getNumBlockActNodes ERROR -",mypid_); printf(" invalid blockID\n"); exit(1); } totalNNodes = numLocalNodes_ + numExtNodes_; nodeIDs = new int[totalNNodes]; for ( iN = 0; iN < totalNNodes; iN++ ) nodeIDs[iN] = 0; nElems = elemBlocks_[iB]->getNumElems(); elemNNodes = elemBlocks_[iB]->getElemNumNodes(); elemNodeLists = elemBlocks_[iB]->getElemNodeLists(); for ( iE = 0; iE < nElems; iE++ ) for ( iN = 0; iN < elemNNodes; iN++ ) nodeIDs[elemNodeLists[iE][iN]] = 1; localNNodes = 0; for ( iN = 0; iN < totalNNodes; iN++ ) if ( nodeIDs[iN] == 1 ) localNNodes++; delete [] nodeIDs; (*numNodes) = localNNodes; if ( outputLevel_ > 2 ) { printf("%4d : LLNL_FEI_Fei::getNumBlockActNodes blockID = %d.\n", mypid_, blockID); printf("%4d : LLNL_FEI_Fei::getNumBlockActNodes numNodes = %d\n", mypid_, (*numNodes)); } } return 0; } /************************************************************************** get number of distinct equations in a given block -------------------------------------------------------------------------*/ int LLNL_FEI_Fei::getNumBlockActEqns(int blockID, int *numEqns) { int numNodes; getNumBlockActNodes(blockID, &numNodes); (*numEqns) = numNodes * nodeDOF_; if ( outputLevel_ > 2 ) { printf("%4d : LLNL_FEI_Fei::getNumBlockActEqns blockID = %d\n", mypid_, blockID); printf("%4d : LLNL_FEI_Fei::getNumBlockActEqns numEqns = %d\n", mypid_, (*numEqns)); } return 0; } /************************************************************************** get a node list in a given block -------------------------------------------------------------------------*/ int LLNL_FEI_Fei::getBlockNodeIDList(int blockID,int numNodes,int *nodeList) { int localNNodes, iB, iE, iN, totalNNodes, nElems; int elemNNodes, **elemNodeLists, *nodeIDs; if ( outputLevel_ > 2 ) { printf("%4d : LLNL_FEI_Fei::getBlockNodeIDList blockID = %d\n", mypid_, blockID); printf("%4d : LLNL_FEI_Fei::getBlockNodeIDList numNodes = %d\n", mypid_, numNodes); } if ( numBlocks_ == 1 ) { localNNodes = numLocalNodes_ + numExtNodes_; if ( localNNodes != numNodes ) { printf("%4d : LLNL_FEI_Fei::getBlockNodeIDList ERROR - nNodes",mypid_); printf(" mismatch.\n"); exit(1); } for ( iN = 0; iN < localNNodes; iN++ ) nodeList[iN] = nodeGlobalIDs_[iN]; return 0; } else { for ( iB = 0; iB < numBlocks_; iB++ ) if ( elemBlocks_[iB]->getElemBlockID() == blockID ) break; if ( iB >= numBlocks_ ) { printf("%4d : LLNL_FEI_Fei::getBlockNodeIDList ERROR -",mypid_); printf(" invalid blockID.\n"); exit(1); } totalNNodes = numLocalNodes_ + numExtNodes_; nodeIDs = new int[totalNNodes]; for ( iN = 0; iN < totalNNodes; iN++ ) nodeIDs[iN] = 0; nElems = elemBlocks_[iB]->getNumElems(); elemNNodes = elemBlocks_[iB]->getElemNumNodes(); elemNodeLists = elemBlocks_[iB]->getElemNodeLists(); for ( iE = 0; iE < nElems; iE++ ) for ( iN = 0; iN < elemNNodes; iN++ ) nodeIDs[elemNodeLists[iE][iN]] = 1; localNNodes = 0; for ( iN = 0; iN < totalNNodes; iN++ ) if ( nodeIDs[iN] == 1 ) nodeList[localNNodes++] = nodeGlobalIDs_[iN]; if ( localNNodes != numNodes ) { printf("%4d : LLNL_FEI_Fei::getBlockNodeIDList ERROR -",mypid_); printf(" nNodes mismatch (%d,%d).\n", localNNodes, numNodes); exit(1); } delete [] nodeIDs; } return 0; } /************************************************************************** get solution -------------------------------------------------------------------------*/ int LLNL_FEI_Fei::getBlockNodeSolution(int blockID,int numNodes, int *nodeList, int *nodeOffsets, double *solnValues) { int iB, iE, iN, iD, totalNNodes, *nodeIDs, index, offset; int nElems, elemNNodes, **elemNodeLists, nodeID, localNNodes; double *dataBuf, **solnVecs; (void) nodeList; if ( outputLevel_ > 2 ) { printf("%4d : LLNL_FEI_Fei::getBlockNodeSolution blockID = %d\n", mypid_, blockID); printf("%4d : LLNL_FEI_Fei::getBlockNodeSolution numNodes = %d\n", mypid_, numNodes); } if ( numBlocks_ == 1 ) { for ( iN = 0; iN < numNodes; iN++ ) { offset = iN * nodeDOF_; nodeOffsets[iN] = offset; if ( numCRMult_ > 0 ) { if ( nodeList[iN] == nodeGlobalIDs_[iN] ) { if ( iN >= numLocalNodes_) offset += numCRMult_; } else { index = -1; if ( numLocalNodes_ > 0 ) index = hypre_BinarySearch(nodeGlobalIDs_,nodeList[iN], numLocalNodes_); if ( index < 0 ) offset += numCRMult_; } } for ( iD = 0; iD < nodeDOF_; iD++ ) solnValues[iN*nodeDOF_+iD] = solnVector_[offset+iD]; } } else { for ( iB = 0; iB < numBlocks_; iB++ ) if ( elemBlocks_[iB]->getElemBlockID() == blockID ) break; if ( iB >= numBlocks_ ) { printf("%4d : LLNL_FEI_Fei::getBlockNodeSolution ERROR -",mypid_); printf(" invalid blockID.\n"); exit(1); } totalNNodes = numLocalNodes_ + numExtNodes_; nodeIDs = new int[totalNNodes]; dataBuf = new double[totalNNodes*nodeDOF_]; for ( iN = 0; iN < totalNNodes; iN++ ) nodeIDs[iN] = 0; nElems = elemBlocks_[iB]->getNumElems(); elemNNodes = elemBlocks_[iB]->getElemNumNodes(); elemNodeLists = elemBlocks_[iB]->getElemNodeLists(); solnVecs = elemBlocks_[iB]->getSolnVectors(); for ( iE = 0; iE < nElems; iE++ ) { for ( iN = 0; iN < elemNNodes; iN++ ) { nodeID = elemNodeLists[iE][iN]; nodeIDs[nodeID] = 1; for ( iD = 0; iD < nodeDOF_; iD++ ) dataBuf[nodeID*nodeDOF_+iD] = solnVecs[iE][iN*nodeDOF_+iD]; } } localNNodes = 0; for ( iN = 0; iN < totalNNodes; iN++ ) { nodeID = nodeIDs[iN]; if ( nodeID == 1 ) { nodeOffsets[localNNodes] = localNNodes * nodeDOF_; for ( iD = 0; iD < nodeDOF_; iD++ ) solnValues[localNNodes*nodeDOF_+iD] = dataBuf[iN*nodeDOF_+iD]; localNNodes++; } } delete [] nodeIDs; delete [] dataBuf; } return 0; } /************************************************************************** initialize Lagrange Multipliers -------------------------------------------------------------------------*/ int LLNL_FEI_Fei::initCRMult(int CRListLen,int *CRNodeList,int *CRFieldList, int *CRID) { (void) CRNodeList; (void) CRFieldList; if ( outputLevel_ > 3 ) printf("%4d : LLNL_FEI_Fei::initCRMult begins...\n", mypid_); if ( numCRMult_ == 0 ) CRListLen_ = CRListLen; else { if ( CRListLen != CRListLen_ ) { printf("%4d : LLNL_FEI_Fei::initCRMult ERROR : inconsistent lengths\n", mypid_); printf("%4d : LLNL_FEI_Fei::initCRMult lengths = %d %d\n", mypid_, CRListLen, CRListLen_); exit(1); } } (*CRID) = numCRMult_++; if ( outputLevel_ > 3 ) printf("%4d : LLNL_FEI_Fei::initCRMult ends.\n", mypid_); return 0; } /************************************************************************** load Lagrange Multipliers -------------------------------------------------------------------------*/ int LLNL_FEI_Fei::loadCRMult(int CRID, int CRListLen, int *CRNodeList, int *CRFieldList, double *CRWeightList, double CRValue) { (void) CRFieldList; int iD, iD2; if ( outputLevel_ > 3 ) printf("%4d : LLNL_FEI_Fei::loadCRMult begins...\n", mypid_); if ( CRNodeLists_ == NULL ) { if ( numCRMult_ > 0 && CRListLen_ > 0 ) { CRNodeLists_ = new int*[numCRMult_]; for ( iD = 0; iD < numCRMult_; iD++ ) { CRNodeLists_[iD] = new int[CRListLen_]; for ( iD2 = 0; iD2 < CRListLen_; iD2++ ) CRNodeLists_[iD][iD2] = -1; } CRWeightLists_ = new double*[numCRMult_]; for ( iD = 0; iD < numCRMult_; iD++ ) CRWeightLists_[iD] = new double[CRListLen_*nodeDOF_]; CRValues_ = new double[numCRMult_]; } } if ( CRID < 0 || CRID >= numCRMult_ ) { printf("%4d : LLNL_FEI_Fei::loadCRMult ERROR : invalid ID = %d (%d)\n", mypid_, CRID, numCRMult_); exit(1); } if ( CRListLen != CRListLen_ ) { printf("%4d : LLNL_FEI_Fei::loadCRMult ERROR : inconsistent lengths\n", mypid_); printf("%4d : LLNL_FEI_Fei::loadCRMult lengths = %d %d\n", mypid_, CRListLen, CRListLen_); exit(1); } for ( iD = 0; iD < CRListLen_; iD++ ) { CRNodeLists_[CRID][iD] = CRNodeList[iD]; for ( iD2 = 0; iD2 < nodeDOF_; iD2++ ) CRWeightLists_[CRID][iD*nodeDOF_+iD2] = CRWeightList[iD*nodeDOF_+iD2]; } CRValues_[CRID] = CRValue; if ( outputLevel_ > 3 ) printf("%4d : LLNL_FEI_Fei::loadCRMult ends.\n", mypid_); return 0; } /************************************************************************** build global stiffness matrix -------------------------------------------------------------------------*/ void LLNL_FEI_Fei::buildGlobalMatrixVector() { int matDim, *diagCounts=NULL, nElems, elemNNodes, **elemNodeLists=NULL; int iB, iD, iE, iN, offset, iD2, iD3, iN2, *elemNodeList=NULL, diagNNZ; int offdNNZ, *offdCounts=NULL, rowIndBase, rowInd, colIndBase, colInd; int iP, nprocs, iCount, index, iBegin, *TdiagIA=NULL, *TdiagJA=NULL; int *ToffdIA=NULL, *ToffdJA=NULL, elemNExt, elemNLocal, nodeID, length; int diagOffset, offdOffset, nLocal, rowInd2, *globalEqnOffsets; int *diagIA, *diagJA, *offdIA, *offdJA, *extEqnList, *crOffsets; int nRecvs, *recvLengs, *recvProcs, *recvProcIndices, *flags; int nSends, *sendLengs, *sendProcs, *sendProcIndices, BCcnt, *iArray; double **elemMats=NULL, *elemMat=NULL, *TdiagAA=NULL, *ToffdAA=NULL; double alpha, beta, gamma, dtemp, *diagAA, *offdAA, *diagonal, *dvec; double **tArray; if ( outputLevel_ > 2 ) printf("%4d : LLNL_FEI_Fei::buildGlobalMatrixVector begins..\n",mypid_); /* ----------------------------------------------------------------- * assemble the right hand side vector * -----------------------------------------------------------------*/ assembleRHSVector(); /* ----------------------------------------------------------------- * count the number of nonzeros per row (diagCounts, offdCounts) * -----------------------------------------------------------------*/ matDim = ( numLocalNodes_ + numExtNodes_) * nodeDOF_ + numCRMult_; nLocal = numLocalNodes_ * nodeDOF_; if ( matDim > 0 ) { diagCounts = new int[matDim]; offdCounts = new int[matDim]; } for ( iD = 0; iD < matDim; iD++ ) diagCounts[iD] = offdCounts[iD] = 0; for ( iB = 0; iB < numBlocks_; iB++ ) { nElems = elemBlocks_[iB]->getNumElems(); elemNNodes = elemBlocks_[iB]->getElemNumNodes(); elemNodeLists = elemBlocks_[iB]->getElemNodeLists(); elemMats = elemBlocks_[iB]->getElemMatrices(); for ( iE = 0; iE < nElems; iE++ ) { elemMat = elemMats[iE]; elemNodeList = elemNodeLists[iE]; elemNExt = elemNLocal = 0; for ( iN = 0; iN < elemNNodes; iN++ ) { if ( elemNodeList[iN] < numLocalNodes_ ) elemNLocal++; else elemNExt++; } for ( iN = 0; iN < elemNNodes; iN++ ) { rowInd = elemNodeList[iN] * nodeDOF_; if ( rowInd >= nLocal ) rowInd += numCRMult_; for ( iD = 0; iD < nodeDOF_; iD++ ) { diagCounts[rowInd+iD] += elemNLocal * nodeDOF_; offdCounts[rowInd+iD] += elemNExt * nodeDOF_; } } } } for ( iD = 0; iD < numCRMult_; iD++ ) { for ( iD2 = 0; iD2 < CRListLen_; iD2++ ) { nodeID = CRNodeLists_[iD][iD2]; index = -1; if ( numLocalNodes_ > 0 ) index = hypre_BinarySearch(nodeGlobalIDs_,nodeID,numLocalNodes_); /* if CR nodes is in my local node collection */ if ( index >= 0 ) { for ( iD3 = 0; iD3 < nodeDOF_; iD3++ ) { dtemp = CRWeightLists_[iD][iD2*nodeDOF_+iD3]; if ( dtemp != 0.0 ) { diagCounts[nLocal+iD]++; diagCounts[index*nodeDOF_+iD3]++; } } } /* if CR nodes is not in my local node collection */ else { index = -1; if ( numExtNodes_ > 0 ) index = hypre_BinarySearch(&nodeGlobalIDs_[numLocalNodes_], nodeID, numExtNodes_); /* but if CR nodes is in my remote node collection */ if ( index >= 0 ) { for ( iD3 = 0; iD3 < nodeDOF_; iD3++ ) { dtemp = CRWeightLists_[iD][iD2*nodeDOF_+iD3]; if ( dtemp != 0.0 ) { offdCounts[nLocal+iD]++; rowInd = (index+numLocalNodes_)*nodeDOF_+numCRMult_+iD3; diagCounts[rowInd]++; } } } else { printf("%4d : LLNL_FEI_Fei::buildGlobalMatrixVector ERROR(1).\n", mypid_); exit(1); } } } } /* ----------------------------------------------------------------- * allocate the CSR matrix storage space * -----------------------------------------------------------------*/ diagNNZ = offdNNZ = 0; for ( iD = 0; iD < matDim; iD++ ) { diagNNZ += diagCounts[iD]; offdNNZ += offdCounts[iD]; } if ( diagNNZ > 0 ) { TdiagIA = new int[matDim+1]; TdiagJA = new int[diagNNZ]; TdiagAA = new double[diagNNZ]; } if ( offdNNZ > 0 ) { ToffdIA = new int[matDim+1]; ToffdJA = new int[offdNNZ]; ToffdAA = new double[offdNNZ]; } /* ----------------------------------------------------------------- * get ready for loading up the CSR matrix * -----------------------------------------------------------------*/ offset = 0; for ( iD = 0; iD < matDim; iD++ ) { TdiagIA[iD] = offset; offset += diagCounts[iD]; } offset = 0; if ( offdNNZ > 0 ) { for ( iD = 0; iD < matDim; iD++ ) { ToffdIA[iD] = offset; offset += offdCounts[iD]; } } /* ----------------------------------------------------------------- * load the CSR matrix * -----------------------------------------------------------------*/ /* first load the element stiffness matrices */ for ( iB = 0; iB < numBlocks_; iB++ ) { nElems = elemBlocks_[iB]->getNumElems(); elemNNodes = elemBlocks_[iB]->getElemNumNodes(); elemNodeLists = elemBlocks_[iB]->getElemNodeLists(); elemMats = elemBlocks_[iB]->getElemMatrices(); if ( nodeDOF_ == 1 ) { for ( iE = 0; iE < nElems; iE++ ) { elemMat = elemMats[iE]; elemNodeList = elemNodeLists[iE]; offset = 0; for ( iN = 0; iN < elemNNodes; iN++ ) { colInd = elemNodeList[iN]; if ( colInd >= nLocal ) { colInd += numCRMult_; for ( iN2 = 0; iN2 < elemNNodes; iN2++ ) { rowInd = elemNodeList[iN2]; if ( rowInd >= nLocal ) rowInd += numCRMult_; if ( *elemMat != 0.0 ) { index = ToffdIA[rowInd]++; ToffdJA[index] = colInd; ToffdAA[index] = *elemMat; } elemMat++; } } else { for ( iN2 = 0; iN2 < elemNNodes; iN2++ ) { rowInd = elemNodeList[iN2]; if ( rowInd >= nLocal ) rowInd += numCRMult_; if ( *elemMat != 0.0 ) { index = TdiagIA[rowInd]++; TdiagJA[index] = colInd; TdiagAA[index] = *elemMat; } elemMat++; } } } delete [] elemMats[iE]; elemMats[iE] = NULL; } } else { for ( iE = 0; iE < nElems; iE++ ) { elemMat = elemMats[iE]; elemNodeList = elemNodeLists[iE]; offset = 0; for ( iN = 0; iN < elemNNodes; iN++ ) { colIndBase = elemNodeList[iN] * nodeDOF_; for ( iD = 0; iD < nodeDOF_; iD++ ) { colInd = colIndBase + iD; if ( colInd >= nLocal ) colInd += numCRMult_; for ( iN2 = 0; iN2 < elemNNodes; iN2++ ) { rowIndBase = elemNodeList[iN2] * nodeDOF_; for ( iD2 = 0; iD2 < nodeDOF_; iD2++ ) { rowInd = rowIndBase + iD2; if ( rowInd >= nLocal ) rowInd += numCRMult_; if ( elemMat[offset] != 0.0 ) { if ( colInd >= nLocal ) { index = ToffdIA[rowInd]++; ToffdJA[index] = colInd; ToffdAA[index] = elemMat[offset]; } else { index = TdiagIA[rowInd]++; TdiagJA[index] = colInd; TdiagAA[index] = elemMat[offset]; } } offset++; } } } } delete [] elemMats[iE]; elemMats[iE] = NULL; } } } /* then load the constraint matrix A21 */ for ( iD = 0; iD < numCRMult_; iD++ ) { rowInd = nLocal + iD; for ( iD2 = 0; iD2 < CRListLen_; iD2++ ) { nodeID = CRNodeLists_[iD][iD2]; index = hypre_BinarySearch(nodeGlobalIDs_,nodeID,numLocalNodes_); if ( index >= 0 ) { for ( iD3 = 0; iD3 < nodeDOF_; iD3++ ) { dtemp = CRWeightLists_[iD][iD2*nodeDOF_+iD3]; if ( dtemp != 0.0 ) { offset = TdiagIA[rowInd]++; colInd = index * nodeDOF_ + iD3; TdiagJA[offset] = colInd; TdiagAA[offset] = dtemp; offset = TdiagIA[colInd]++; TdiagJA[offset] = rowInd; TdiagAA[offset] = dtemp; } } } else { if ( numExtNodes_ <= 0 ) { printf("%4d : LLNL_FEI_Fei::buildGlobalMatrixVector ERROR(2).\n", mypid_); exit(1); } index = hypre_BinarySearch(&nodeGlobalIDs_[numLocalNodes_],nodeID, numExtNodes_); for ( iD3 = 0; iD3 < nodeDOF_; iD3++ ) { dtemp = CRWeightLists_[iD][iD2*nodeDOF_+iD3]; if ( dtemp != 0.0 ) { offset = ToffdIA[rowInd]++; colInd = (index + numLocalNodes_)*nodeDOF_+numCRMult_+iD3; ToffdJA[offset] = colInd; ToffdAA[offset] = dtemp; offset = TdiagIA[colInd]++; TdiagJA[offset] = rowInd; TdiagAA[offset] = dtemp; } } } } } /* ----------------------------------------------------------------- * compress the matrix (take out redundant columns) * -----------------------------------------------------------------*/ if ( outputLevel_ > 2 ) printf("%4d : LLNL_FEI_Fei::buildGlobalMatrixVector mid phase\n",mypid_); offset = 0; for ( iD = 0; iD < matDim; iD++ ) { iCount = TdiagIA[iD] - offset; TdiagIA[iD] = offset; offset += diagCounts[iD]; diagCounts[iD] = iCount; } if ( offdNNZ > 0 ) { offset = 0; for ( iD = 0; iD < matDim; iD++ ) { iCount = ToffdIA[iD] - offset; ToffdIA[iD] = offset; offset += offdCounts[iD]; offdCounts[iD] = iCount; } } for ( iD = 0; iD < matDim; iD++ ) { if ( diagCounts[iD] > 0 ) { iBegin = TdiagIA[iD]; iCount = diagCounts[iD]; index = iBegin; if ( iCount > 0 ) IntSort2a(&(TdiagJA[iBegin]),&(TdiagAA[iBegin]),0,iCount-1); for ( iD2 = iBegin+1; iD2 < iBegin+iCount; iD2++ ) { if ( TdiagJA[iD2] == TdiagJA[index] ) TdiagAA[index] += TdiagAA[iD2]; else { if (TdiagAA[index] != 0.0 ) index++; TdiagJA[index] = TdiagJA[iD2]; TdiagAA[index] = TdiagAA[iD2]; } } if ( iCount > 0 && TdiagAA[index] != 0.0 ) index++; diagCounts[iD] = index - iBegin; } if ( offdCounts[iD] > 0 ) { iBegin = ToffdIA[iD]; iCount = offdCounts[iD]; index = iBegin; if ( iCount > 0 ) IntSort2a(&(ToffdJA[iBegin]),&(ToffdAA[iBegin]),0,iCount-1); for ( iD2 = iBegin+1; iD2 < iBegin+iCount; iD2++ ) { if ( ToffdJA[iD2] == ToffdJA[index] ) ToffdAA[index] += ToffdAA[iD2]; else { if (ToffdAA[index] != 0.0 ) index++; ToffdJA[index] = ToffdJA[iD2]; ToffdAA[index] = ToffdAA[iD2]; } } if ( iCount > 0 && ToffdAA[index] != 0.0 ) index++; offdCounts[iD] = index - iBegin; } } /* ----------------------------------------------------------------- * obtain off-processor boundary conditions * -----------------------------------------------------------------*/ length = (numLocalNodes_ + numExtNodes_) * nodeDOF_ * 3; /* part 1: if BC is declared on off-processors, get them in */ if (length > 0 ) { dvec = new double[length]; for (iD = 0; iD < length; iD++) dvec[iD] = 0.0; for ( iN = 0; iN < numBCNodes_; iN++ ) { nodeID = BCNodeIDs_[iN]; index = -1; if (numExtNodes_ > 0) index = hypre_BinarySearch(&nodeGlobalIDs_[numLocalNodes_],nodeID, numExtNodes_); if (index >= 0) dvec[(numLocalNodes_+index)*nodeDOF_] = 1.0; } gatherAddDData( dvec ); BCcnt = 0; for (iD = 0; iD < numLocalNodes_; iD++) if (dvec[iD*nodeDOF_] == 1.0) BCcnt++; if (BCcnt > 0) { iArray = BCNodeIDs_; BCNodeIDs_ = new int[numBCNodes_+BCcnt]; for (iN = 0; iN < numBCNodes_; iN++) BCNodeIDs_[iN] = iArray[iN]; delete [] iArray; offset = numBCNodes_; for (iD = 0; iD < numLocalNodes_; iD++) if (dvec[iD*nodeDOF_] == 1.0) BCNodeIDs_[offset++] = iD; tArray = BCNodeAlpha_; BCNodeAlpha_ = new double*[numBCNodes_+BCcnt]; for (iN = 0; iN < numBCNodes_; iN++) BCNodeAlpha_[iN] = tArray[iN]; for (iN = 0; iN < BCcnt; iN++) { BCNodeAlpha_[numBCNodes_+iN] = new double[nodeDOF_]; for (iD = 0; iD < nodeDOF_; iD++) BCNodeAlpha_[numBCNodes_+iN][iD] = 0.0; } delete [] tArray; tArray = BCNodeBeta_; BCNodeBeta_ = new double*[numBCNodes_+BCcnt]; for (iN = 0; iN < numBCNodes_; iN++) BCNodeBeta_[iN] = tArray[iN]; for (iN = 0; iN < BCcnt; iN++) { BCNodeBeta_[numBCNodes_+iN] = new double[nodeDOF_]; for (iD = 0; iD < nodeDOF_; iD++) BCNodeBeta_[numBCNodes_+iN][iD] = 0.0; } delete [] tArray; tArray = BCNodeGamma_; BCNodeGamma_ = new double*[numBCNodes_+BCcnt]; for (iN = 0; iN < numBCNodes_; iN++) BCNodeGamma_[iN] = tArray[iN]; for (iN = 0; iN < BCcnt; iN++) { BCNodeGamma_[numBCNodes_+iN] = new double[nodeDOF_]; for (iD = 0; iD < nodeDOF_; iD++) BCNodeGamma_[numBCNodes_+iN][iD] = 0.0; } delete [] tArray; } for (iD = 0; iD < length; iD++) dvec[iD] = 0.0; for ( iN = 0; iN < numBCNodes_; iN++ ) { nodeID = BCNodeIDs_[iN]; index = -1; if (numExtNodes_ > 0) index = hypre_BinarySearch(&nodeGlobalIDs_[numLocalNodes_],nodeID, numExtNodes_); if (index >= 0) { for (iD = index*nodeDOF_*3; iD < index*nodeDOF_*3+nodeDOF_; iD++) dvec[numLocalNodes_*nodeDOF_*3+iD] = BCNodeAlpha_[iN][iD%nodeDOF_]; for (iD = index*nodeDOF_*3+nodeDOF_; iD < index*nodeDOF_*3+nodeDOF_*2; iD++) dvec[numLocalNodes_*nodeDOF_*3+iD] = BCNodeBeta_[iN][iD%nodeDOF_]; for (iD = index*nodeDOF_*3+nodeDOF_*2; iD < (index+1)*nodeDOF_*3; iD++) dvec[numLocalNodes_*nodeDOF_*3+iD] = BCNodeGamma_[iN][iD%nodeDOF_]; } } iD = nodeDOF_; nodeDOF_ *= 3; gatherAddDData( dvec ); nodeDOF_ = iD; for (iN = numBCNodes_; iN < numBCNodes_+BCcnt; iN++) { nodeID = BCNodeIDs_[iN]; for (iD = 0; iD < nodeDOF_; iD++) BCNodeAlpha_[iN][iD] = dvec[nodeID*nodeDOF_*3+iD]; for (iD = 0; iD < nodeDOF_; iD++) BCNodeBeta_[iN][iD] = dvec[nodeID*nodeDOF_*3+nodeDOF_+iD]; for (iD = 0; iD < nodeDOF_; iD++) BCNodeGamma_[iN][iD] = dvec[nodeID*nodeDOF_*3+nodeDOF_*2+iD]; BCNodeIDs_[iN] = nodeGlobalIDs_[nodeID]; } numBCNodes_ += BCcnt; delete [] dvec; } /* part 1: if BC is declared on-processors, get them out */ if (length > 0 ) { dvec = new double[length]; for (iD = 0; iD < length; iD++) dvec[iD] = 0.0; for ( iN = 0; iN < numBCNodes_; iN++ ) { nodeID = BCNodeIDs_[iN]; index = hypre_BinarySearch(nodeGlobalIDs_,nodeID,numLocalNodes_); if (index >= 0) dvec[index*nodeDOF_] = 1.0; } scatterDData( dvec ); BCcnt = 0; for (iD = numLocalNodes_; iD < numLocalNodes_+numExtNodes_; iD++) if (dvec[iD*nodeDOF_] != 0.0) BCcnt++; if (BCcnt > 0) { iArray = BCNodeIDs_; BCNodeIDs_ = new int[numBCNodes_+BCcnt]; for (iN = 0; iN < numBCNodes_; iN++) BCNodeIDs_[iN] = iArray[iN]; delete [] iArray; offset = numBCNodes_; for (iD = numLocalNodes_; iD < numLocalNodes_+numExtNodes_; iD++) if (dvec[iD*nodeDOF_] == 1.0) BCNodeIDs_[offset++] = iD; tArray = BCNodeAlpha_; BCNodeAlpha_ = new double*[numBCNodes_+BCcnt]; for (iN = 0; iN < numBCNodes_; iN++) BCNodeAlpha_[iN] = tArray[iN]; for (iN = 0; iN < BCcnt; iN++) { BCNodeAlpha_[numBCNodes_+iN] = new double[nodeDOF_]; for (iD = 0; iD < nodeDOF_; iD++) BCNodeAlpha_[numBCNodes_+iN][iD] = 0.0; } delete [] tArray; tArray = BCNodeBeta_; BCNodeBeta_ = new double*[numBCNodes_+BCcnt]; for (iN = 0; iN < numBCNodes_; iN++) BCNodeBeta_[iN] = tArray[iN]; for (iN = 0; iN < BCcnt; iN++) { BCNodeBeta_[numBCNodes_+iN] = new double[nodeDOF_]; for (iD = 0; iD < nodeDOF_; iD++) BCNodeBeta_[numBCNodes_+iN][iD] = 0.0; } delete [] tArray; tArray = BCNodeGamma_; BCNodeGamma_ = new double*[numBCNodes_+BCcnt]; for (iN = 0; iN < numBCNodes_; iN++) BCNodeGamma_[iN] = tArray[iN]; for (iN = 0; iN < BCcnt; iN++) { BCNodeGamma_[numBCNodes_+iN] = new double[nodeDOF_]; for (iD = 0; iD < nodeDOF_; iD++) BCNodeGamma_[numBCNodes_+iN][iD] = 0.0; } delete [] tArray; } for (iD = 0; iD < length; iD++) dvec[iD] = 0.0; for ( iN = 0; iN < numBCNodes_; iN++ ) { nodeID = BCNodeIDs_[iN]; index = hypre_BinarySearch(nodeGlobalIDs_,nodeID,numLocalNodes_); if (index >= 0) { for (iD = index*nodeDOF_*3; iD < index*nodeDOF_*3+nodeDOF_; iD++) dvec[iD] = BCNodeAlpha_[iN][iD%nodeDOF_]; for (iD = index*nodeDOF_*3+nodeDOF_; iD < index*nodeDOF_*3+nodeDOF_*2; iD++) dvec[iD] = BCNodeBeta_[iN][iD%nodeDOF_]; for (iD = index*nodeDOF_*3+nodeDOF_*2; iD < (index+1)*nodeDOF_*3; iD++) dvec[iD] = BCNodeGamma_[iN][iD%nodeDOF_]; } } iD = nodeDOF_; nodeDOF_ *= 3; scatterDData( dvec ); nodeDOF_ = iD; for (iN = numBCNodes_; iN < numBCNodes_+BCcnt; iN++) { nodeID = BCNodeIDs_[iN]; for (iD = 0; iD < nodeDOF_; iD++) BCNodeAlpha_[iN][iD] = dvec[nodeID*nodeDOF_*3+iD]; for (iD = 0; iD < nodeDOF_; iD++) BCNodeBeta_[iN][iD] = dvec[nodeID*nodeDOF_*3+nodeDOF_+iD]; for (iD = 0; iD < nodeDOF_; iD++) BCNodeGamma_[iN][iD] = dvec[nodeID*nodeDOF_*3+nodeDOF_*2+iD]; BCNodeIDs_[iN] = nodeGlobalIDs_[nodeID]; } numBCNodes_ += BCcnt; delete [] dvec; } /* ----------------------------------------------------------------- * impose boundary conditions * -----------------------------------------------------------------*/ for (iD = nLocal; iD < matDim; iD++) rhsVector_[iD] = 0.0; flags = NULL; if (numLocalNodes_+numExtNodes_ > 0) flags = new int[(numLocalNodes_+numExtNodes_)*nodeDOF_]; for (iD = 0; iD < (numLocalNodes_+numExtNodes_)*nodeDOF_; iD++) flags[iD] = 0; for ( iN = 0; iN < numBCNodes_; iN++ ) { nodeID = BCNodeIDs_[iN]; index = -1; if (numLocalNodes_ > 0) index = hypre_BinarySearch(nodeGlobalIDs_,nodeID,numLocalNodes_); if (index >= 0) { for (iD = index*nodeDOF_; iD < (index+1)*nodeDOF_; iD++) { if (flags[iD] == 0) { alpha = BCNodeAlpha_[iN][iD%nodeDOF_]; beta = BCNodeBeta_[iN][iD%nodeDOF_]; gamma = BCNodeGamma_[iN][iD%nodeDOF_]; if (beta == 0.0 && alpha != 0.0) { flags[iD] = 1; for (iD2=TdiagIA[iD];iD2= 0) { for (iD3 = TdiagIA[rowInd]; iD3= 0) { for (iD3 = TdiagIA[rowInd]; iD3 0) { for (iD2=TdiagIA[rowInd]; iD2= 0) { for (iD3 = ToffdIA[rowInd2]; iD3= 0) { for (iD3 = ToffdIA[rowInd2]; iD3 0 ) { offdNNZ = 0; for ( iD = 0; iD < matDim; iD++ ) for ( iD2 = ToffdIA[iD]; iD2 < ToffdIA[iD]+offdCounts[iD]; iD2++ ) if ( ToffdAA[iD2] != 0.0 ) offdNNZ++; } if ( diagNNZ > 0 ) { diagIA = new int[matDim+1]; diagJA = new int[diagNNZ]; diagAA = new double[diagNNZ]; diagonal = new double[matDim]; diagIA[0] = 0; } else { diagIA = NULL; diagJA = NULL; diagAA = NULL; diagonal = NULL; } if ( offdNNZ > 0 ) { offdIA = new int[matDim+1]; offdJA = new int[offdNNZ]; offdAA = new double[offdNNZ]; offdIA[0] = 0; } else { offdIA = NULL; offdJA = NULL; offdAA = NULL; } diagOffset = offdOffset = 0; for ( iD = 0; iD < matDim; iD++ ) { iCount = diagCounts[iD]; index = TdiagIA[iD]; diagonal[iD] = 0.0; for ( iD2 = 0; iD2 < iCount; iD2++ ) { if ( TdiagJA[index] == iD ) { if ( TdiagAA[index] != 0.0 ) diagonal[iD] = TdiagAA[index]; } if ( TdiagJA[index] >= 0 && TdiagAA[index] != 0.0 ) { diagJA[diagOffset] = TdiagJA[index]; diagAA[diagOffset++] = TdiagAA[index]; } index++; } diagIA[iD+1] = diagOffset; if ( offdNNZ > 0 ) { iCount = offdCounts[iD]; index = ToffdIA[iD]; for ( iD2 = 0; iD2 < iCount; iD2++ ) { if ( ToffdJA[index] == iD ) { if ( ToffdAA[index] != 0.0 ) diagonal[iD] = ToffdAA[index]; } if ( ToffdJA[index] >= 0 && ToffdAA[index] != 0.0 ) { offdJA[offdOffset] = ToffdJA[index]; offdAA[offdOffset++] = ToffdAA[index]; } index++; } offdIA[iD+1] = offdOffset; } } /* ----------------------------------------------------------------- * fix up diagonal entries in light of parallel processing * -----------------------------------------------------------------*/ gatherAddDData( diagonal ); for ( iD = 0; iD < matDim; iD++ ) { if ( diagonal[iD] == 0.0 ) diagonal[iD] = 1.0; else diagonal[iD] = 1.0 / diagonal[iD]; } /* ----------------------------------------------------------------- * assemble initial guess vector * -----------------------------------------------------------------*/ assembleSolnVector(); /* ----------------------------------------------------------------- * create matrix class * -----------------------------------------------------------------*/ fetchExtEqnList(&extEqnList); MPI_Comm_size(mpiComm_, &nprocs); globalEqnOffsets = new int[nprocs+1]; crOffsets = new int[nprocs+1]; for ( iP = 0; iP <= nprocs; iP++ ) { globalEqnOffsets[iP] = globalNodeOffsets_[iP] * nodeDOF_ + globalCROffsets_[iP]; crOffsets[iP] = globalCROffsets_[iP]; } matPtr_->setMatrix(numLocalNodes_*nodeDOF_+numCRMult_, diagIA, diagJA, diagAA, numExtNodes_*nodeDOF_, extEqnList, offdIA, offdJA, offdAA, diagonal, globalEqnOffsets, crOffsets); modifyCommPattern(&nRecvs,&recvLengs,&recvProcs,&recvProcIndices, &nSends,&sendLengs,&sendProcs,&sendProcIndices); matPtr_->setCommPattern(nRecvs, recvLengs, recvProcs, recvProcIndices, nSends, sendLengs, sendProcs, sendProcIndices); /* ----------------------------------------------------------------- * clean up * -----------------------------------------------------------------*/ if ( matDim > 0 ) { delete [] diagCounts; delete [] offdCounts; } if ( diagNNZ > 0 ) { delete [] TdiagIA; delete [] TdiagJA; delete [] TdiagAA; } if ( offdNNZ > 0 ) { delete [] ToffdIA; delete [] ToffdJA; delete [] ToffdAA; } if ( outputLevel_ > 2 ) printf("%4d : LLNL_FEI_Fei::buildGlobalMatrixVector ends. \n",mypid_); } /************************************************************************** form right hand side vector from element load vectors -------------------------------------------------------------------------*/ void LLNL_FEI_Fei::assembleRHSVector() { int iB, iE, iN, iD, **elemNodeLists, numElems, elemNumNodes; int eqnIndex1, eqnIndex2, matDim, nLocal; double **rhsVectors; if ( rhsVector_ != NULL ) delete [] rhsVector_; matDim = (numLocalNodes_ + numExtNodes_) * nodeDOF_ + numCRMult_; nLocal = numLocalNodes_ * nodeDOF_; rhsVector_ = new double[matDim]; for ( iD = 0; iD < matDim; iD++ ) rhsVector_[iD] = 0.0; for ( iD = nLocal; iD < nLocal+numCRMult_; iD++ ) rhsVector_[iD] = CRValues_[iD-nLocal]; for ( iB = 0; iB < numBlocks_; iB++ ) { elemNodeLists = elemBlocks_[iB]->getElemNodeLists(); rhsVectors = elemBlocks_[iB]->getRHSVectors(); numElems = elemBlocks_[iB]->getNumElems(); elemNumNodes = elemBlocks_[iB]->getElemNumNodes(); for ( iE = 0; iE < numElems; iE++ ) { for ( iN = 0; iN < elemNumNodes; iN++ ) { eqnIndex1 = elemNodeLists[iE][iN] * nodeDOF_; if ( eqnIndex1 >= nLocal ) eqnIndex1 += numCRMult_; eqnIndex2 = iN * nodeDOF_; for ( iD = 0; iD < nodeDOF_; iD++ ) rhsVector_[eqnIndex1+iD] += rhsVectors[iE][eqnIndex2+iD]; } } } gatherAddDData( rhsVector_ ); scatterDData( rhsVector_ ); } /************************************************************************** form solution vector -------------------------------------------------------------------------*/ void LLNL_FEI_Fei::assembleSolnVector() { int iB, iE, iN, iD, **elemNodeLists, numElems, elemNumNodes; int eqnIndex1, eqnIndex2, matDim, nLocal; double **solnVectors; matDim = (numLocalNodes_ + numExtNodes_) * nodeDOF_ + numCRMult_; nLocal = numLocalNodes_ * nodeDOF_; if ( solnVector_ == NULL ) solnVector_ = new double[matDim]; for ( iD = 0; iD < matDim; iD++ ) solnVector_[iD] = 0.0; for ( iB = 0; iB < numBlocks_; iB++ ) { elemNodeLists = elemBlocks_[iB]->getElemNodeLists(); solnVectors = elemBlocks_[iB]->getSolnVectors(); numElems = elemBlocks_[iB]->getNumElems(); elemNumNodes = elemBlocks_[iB]->getElemNumNodes(); for ( iE = 0; iE < numElems; iE++ ) { for ( iN = 0; iN < elemNumNodes; iN++ ) { eqnIndex1 = elemNodeLists[iE][iN] * nodeDOF_; if ( eqnIndex1 >= nLocal ) eqnIndex1 += numCRMult_; eqnIndex2 = iN * nodeDOF_; for ( iD = 0; iD < nodeDOF_; iD++ ) solnVector_[eqnIndex1+iD] += solnVectors[iE][eqnIndex2+iD]; } } } gatherAddDData( solnVector_ ); scatterDData( solnVector_ ); } /************************************************************************** distribute solution vector to element solution vectors -------------------------------------------------------------------------*/ void LLNL_FEI_Fei::disassembleSolnVector(double *solns) { int iB, iE, iN, iD, **elemNodeLists, numElems, elemNumNodes; int eqnIndex1, eqnIndex2, nLocal; double **solnVectors; nLocal = numLocalNodes_ * nodeDOF_; for ( iD = 0; iD < nLocal; iD++ ) solnVector_[iD] = solns[iD]; scatterDData( solnVector_ ); for ( iB = 0; iB < numBlocks_; iB++ ) { elemNodeLists = elemBlocks_[iB]->getElemNodeLists(); solnVectors = elemBlocks_[iB]->getSolnVectors(); numElems = elemBlocks_[iB]->getNumElems(); elemNumNodes = elemBlocks_[iB]->getElemNumNodes(); for ( iE = 0; iE < numElems; iE++ ) { for ( iN = 0; iN < elemNumNodes; iN++ ) { eqnIndex1 = elemNodeLists[iE][iN] * nodeDOF_; if ( eqnIndex1 >= nLocal ) eqnIndex1 += numCRMult_; eqnIndex2 = iN * nodeDOF_; for ( iD = 0; iD < nodeDOF_; iD++ ) solnVectors[iE][eqnIndex2+iD] = solnVector_[eqnIndex1+iD]; } } } } /************************************************************************** sort an integer array -------------------------------------------------------------------------*/ void LLNL_FEI_Fei::IntSort(int *ilist, int left, int right) { int i, last, mid, itemp; if (left >= right) return; mid = (left + right) / 2; itemp = ilist[left]; ilist[left] = ilist[mid]; ilist[mid] = itemp; last = left; for (i = left+1; i <= right; i++) { if (ilist[i] < ilist[left]) { last++; itemp = ilist[last]; ilist[last] = ilist[i]; ilist[i] = itemp; } } itemp = ilist[left]; ilist[left] = ilist[last]; ilist[last] = itemp; IntSort(ilist, left, last-1); IntSort(ilist, last+1, right); } /************************************************************************** sort an integer array and an auxiliary array -------------------------------------------------------------------------*/ void LLNL_FEI_Fei::IntSort2(int *ilist, int *ilist2, int left, int right) { int i, last, mid, itemp; if (left >= right) return; mid = (left + right) / 2; itemp = ilist[left]; ilist[left] = ilist[mid]; ilist[mid] = itemp; itemp = ilist2[left]; ilist2[left] = ilist2[mid]; ilist2[mid] = itemp; last = left; for (i = left+1; i <= right; i++) { if (ilist[i] < ilist[left]) { last++; itemp = ilist[last]; ilist[last] = ilist[i]; ilist[i] = itemp; itemp = ilist2[last]; ilist2[last] = ilist2[i]; ilist2[i] = itemp; } } itemp = ilist[left]; ilist[left] = ilist[last]; ilist[last] = itemp; itemp = ilist2[left]; ilist2[left] = ilist2[last]; ilist2[last] = itemp; IntSort2(ilist, ilist2, left, last-1); IntSort2(ilist, ilist2, last+1, right); } /************************************************************************** sort an integer array with an auxiliary double array -------------------------------------------------------------------------*/ void LLNL_FEI_Fei::IntSort2a(int *ilist,double *dlist,int left,int right) { int mid, i, itemp, last, end2, isort, *ilist2, *ilist3; double dtemp, *dlist2, *dlist3; if (left >= right) return; mid = (left + right) / 2; itemp = ilist[left]; ilist[left] = ilist[mid]; ilist[mid] = itemp; dtemp = dlist[left]; dlist[left] = dlist[mid]; dlist[mid] = dtemp; last = left; isort = ilist[left]; ilist2 = &(ilist[last]); dlist2 = &(dlist[last]); ilist3 = &(ilist[left+1]); dlist3 = &(dlist[left+1]); end2 = right + 1; for (i = left+1; i < end2; i++) { if ( *ilist3 < isort ) { last++; ilist2++; dlist2++; itemp = *ilist2; *ilist2 = *ilist3; *ilist3 = itemp; dtemp = *dlist2; *dlist2 = *dlist3; *dlist3 = dtemp; } ilist3++; dlist3++; } itemp = ilist[left]; ilist[left] = ilist[last]; ilist[last] = itemp; dtemp = dlist[left]; dlist[left] = dlist[last]; dlist[last] = dtemp; IntSort2a(ilist, dlist, left, last-1); IntSort2a(ilist, dlist, last+1, right); } /************************************************************************** exchange extended vectors between processors -------------------------------------------------------------------------*/ void LLNL_FEI_Fei::scatterDData( double *dvec ) { int iD, iD2, iP, ind1, ind2, offset; double *dRecvBufs, *dSendBufs; MPI_Request *requests; MPI_Status status; if ( nRecvs_ > 0 ) { offset = 0; for ( iP = 0; iP < nRecvs_; iP++ ) offset += recvLengs_[iP]; dRecvBufs = new double[offset*nodeDOF_]; requests = new MPI_Request[nRecvs_]; } if ( nSends_ > 0 ) { offset = 0; for ( iP = 0; iP < nSends_; iP++ ) offset += sendLengs_[iP]; dSendBufs = new double[offset*nodeDOF_]; offset = 0; for ( iP = 0; iP < nSends_; iP++ ) { for ( iD = 0; iD < sendLengs_[iP]; iD++ ) { ind1 = sendProcIndices_[offset+iD] * nodeDOF_; ind2 = iD * nodeDOF_; for ( iD2 = 0; iD2 < nodeDOF_; iD2++ ) dSendBufs[offset*nodeDOF_+ind2+iD2] = dvec[ind1+iD2]; } offset += sendLengs_[iP]; } } offset = 0; for ( iP = 0; iP < nRecvs_; iP++ ) { MPI_Irecv( &dRecvBufs[offset], recvLengs_[iP]*nodeDOF_, MPI_DOUBLE, recvProcs_[iP], 40343, mpiComm_, &requests[iP]); offset += recvLengs_[iP] * nodeDOF_; } offset = 0; for ( iP = 0; iP < nSends_; iP++ ) { MPI_Send( &dSendBufs[offset], sendLengs_[iP]*nodeDOF_, MPI_DOUBLE, sendProcs_[iP], 40343, mpiComm_); offset += sendLengs_[iP] * nodeDOF_; } for ( iP = 0; iP < nRecvs_; iP++ ) MPI_Wait( &requests[iP], &status ); if ( nRecvs_ > 0 ) delete [] requests; offset = 0; for ( iP = 0; iP < nRecvs_; iP++ ) { for ( iD = 0; iD < recvLengs_[iP]; iD++ ) { ind1 = recvProcIndices_[offset+iD] * nodeDOF_ + numCRMult_; ind2 = iD * nodeDOF_; for ( iD2 = 0; iD2 < nodeDOF_; iD2++ ) dvec[ind1+iD2] = dRecvBufs[offset*nodeDOF_+ind2+iD2]; } offset += recvLengs_[iP]; } if ( nRecvs_ > 0 ) delete [] dRecvBufs; if ( nSends_ > 0 ) delete [] dSendBufs; } /************************************************************************** exchange data between processors -------------------------------------------------------------------------*/ void LLNL_FEI_Fei::gatherAddDData( double *dvec ) { int iD, iD2, iP, ind1, ind2, offset; double *dRecvBufs, *dSendBufs; MPI_Request *requests; MPI_Status status; if ( nSends_ > 0 ) { offset = 0; for ( iP = 0; iP < nSends_; iP++ ) offset += sendLengs_[iP]; dRecvBufs = new double[offset*nodeDOF_]; requests = new MPI_Request[nSends_]; } if ( nRecvs_ > 0 ) { offset = 0; for ( iP = 0; iP < nRecvs_; iP++ ) offset += recvLengs_[iP]; dSendBufs = new double[offset*nodeDOF_]; offset = 0; for ( iP = 0; iP < nRecvs_; iP++ ) { for ( iD = 0; iD < recvLengs_[iP]; iD++ ) { ind1 = recvProcIndices_[offset+iD] * nodeDOF_ + numCRMult_; ind2 = iD * nodeDOF_; for ( iD2 = 0; iD2 < nodeDOF_; iD2++ ) dSendBufs[offset*nodeDOF_+ind2+iD2] = dvec[ind1+iD2]; } offset += recvLengs_[iP]; } } offset = 0; for ( iP = 0; iP < nSends_; iP++ ) { MPI_Irecv( &dRecvBufs[offset], sendLengs_[iP]*nodeDOF_, MPI_DOUBLE, sendProcs_[iP], 40342, mpiComm_, &requests[iP]); offset += sendLengs_[iP] * nodeDOF_; } offset = 0; for ( iP = 0; iP < nRecvs_; iP++ ) { MPI_Send( &dSendBufs[offset], recvLengs_[iP]*nodeDOF_, MPI_DOUBLE, recvProcs_[iP], 40342, mpiComm_); offset += recvLengs_[iP] * nodeDOF_; } for ( iP = 0; iP < nSends_; iP++ ) MPI_Wait( &requests[iP], &status ); if ( nSends_ > 0 ) delete [] requests; offset = 0; for ( iP = 0; iP < nSends_; iP++ ) { for ( iD = 0; iD < sendLengs_[iP]; iD++ ) { ind1 = sendProcIndices_[offset+iD] * nodeDOF_; ind2 = iD * nodeDOF_; for ( iD2 = 0; iD2 < nodeDOF_; iD2++ ) dvec[ind1+iD2] += dRecvBufs[offset*nodeDOF_+ind2+iD2]; } offset += sendLengs_[iP]; } if ( nSends_ > 0 ) delete [] dRecvBufs; if ( nRecvs_ > 0 ) delete [] dSendBufs; } /************************************************************************** exchange data between processors -------------------------------------------------------------------------*/ void LLNL_FEI_Fei::gatherIData( int *iSendBuf, int *iRecvBuf ) { int iP, msgid=40342, offset, length; MPI_Request *requests; MPI_Status status; if ( nSends_ > 0 ) requests = new MPI_Request[nSends_]; offset = 0; for ( iP = 0; iP < nSends_; iP++ ) { length = sendLengs_[iP] * nodeDOF_; MPI_Irecv( &iRecvBuf[offset], length, MPI_INT, sendProcs_[iP], msgid, mpiComm_, &requests[iP]); offset += length; } offset = 0; for ( iP = 0; iP < nRecvs_; iP++ ) { length = recvLengs_[iP] * nodeDOF_; MPI_Send( &iSendBuf[offset], length, MPI_INT, recvProcs_[iP], msgid, mpiComm_); offset += length; } for ( iP = 0; iP < nSends_; iP++ ) MPI_Wait( &requests[iP], &status ); if ( nSends_ > 0 ) delete [] requests; } /************************************************************************** exchange data between processors -------------------------------------------------------------------------*/ void LLNL_FEI_Fei::gatherDData( double *dSendBuf, double *dRecvBuf ) { int iP, msgid=40343, offset, length; MPI_Request *requests; MPI_Status status; if ( nSends_ > 0 ) requests = new MPI_Request[nSends_]; offset = 0; for ( iP = 0; iP < nSends_; iP++ ) { length = sendLengs_[iP] * nodeDOF_; MPI_Irecv( &dRecvBuf[offset], length, MPI_DOUBLE, sendProcs_[iP], msgid, mpiComm_, &requests[iP]); offset += length; } offset = 0; for ( iP = 0; iP < nRecvs_; iP++ ) { length = recvLengs_[iP] * nodeDOF_; MPI_Send( &dSendBuf[offset], length, MPI_DOUBLE, recvProcs_[iP], msgid, mpiComm_); offset += length; } for ( iP = 0; iP < nSends_; iP++ ) MPI_Wait( &requests[iP], &status ); if ( nSends_ > 0 ) delete [] requests; } /************************************************************************** sort the shared nodes -------------------------------------------------------------------------*/ void LLNL_FEI_Fei::sortSharedNodes() { int *nodeIDs, *nodeIDAux, **sharedNodeProcAux, iN, index, iP; /* ----------------------------------------------------------------- * sort the shared nodes * ----------------------------------------------------------------*/ if ( numSharedNodes_ > 0 ) { nodeIDs = new int[numSharedNodes_]; nodeIDAux = new int[numSharedNodes_]; sharedNodeProcAux = new int*[numSharedNodes_]; for ( iN = 0; iN < numSharedNodes_; iN++ ) nodeIDs[iN] = iN; IntSort2(sharedNodeIDs_, nodeIDs, 0, numSharedNodes_-1); for ( iN = 0; iN < numSharedNodes_; iN++ ) { sharedNodeProcAux[iN] = sharedNodeProcs_[iN]; nodeIDAux[iN] = sharedNodeNProcs_[iN]; } for ( iN = 0; iN < numSharedNodes_; iN++ ) { index = nodeIDs[iN]; sharedNodeProcs_[iN] = sharedNodeProcAux[index]; sharedNodeNProcs_[iN] = nodeIDAux[index]; } delete [] sharedNodeProcAux; delete [] nodeIDAux; delete [] nodeIDs; index = 0; for ( iN = 1; iN < numSharedNodes_; iN++ ) { if ( sharedNodeIDs_[iN] == sharedNodeIDs_[index] ) { nodeIDAux = sharedNodeProcs_[index]; sharedNodeProcs_[index] = new int[sharedNodeNProcs_[index]+sharedNodeNProcs_[iN]]; for ( iP = 0; iP < sharedNodeNProcs_[index]; iP++ ) sharedNodeProcs_[index][iP] = nodeIDAux[iP]; for ( iP = 0; iP < sharedNodeNProcs_[iN]; iP++ ) sharedNodeProcs_[index][sharedNodeNProcs_[index]+iP] = sharedNodeProcs_[iN][iP]; sharedNodeNProcs_[index] += sharedNodeNProcs_[iN]; delete [] nodeIDAux; delete [] sharedNodeProcs_[iN]; } else { index++; sharedNodeIDs_[index] = sharedNodeIDs_[iN]; sharedNodeProcs_[index] = sharedNodeProcs_[iN]; sharedNodeNProcs_[index] = sharedNodeNProcs_[iN]; } } if ( numSharedNodes_ > 0 ) numSharedNodes_ = index + 1; for ( iN = 0; iN < numSharedNodes_; iN++ ) { IntSort(sharedNodeProcs_[iN], 0, sharedNodeNProcs_[iN]-1); index = 0; for ( iP = 1; iP < sharedNodeNProcs_[iN]; iP++ ) if (sharedNodeProcs_[iN][iP] != sharedNodeProcs_[iN][index]) sharedNodeProcs_[iN][++index] = sharedNodeProcs_[iN][iP]; sharedNodeNProcs_[iN] = index + 1; } } } /************************************************************************** * obtain an ordered array of distinct node IDs * (nodeGlobalIDs_, numLocalNodes_) -------------------------------------------------------------------------*/ void LLNL_FEI_Fei::composeOrderedNodeIDList(int **nodeIDs_out, int **nodeIDAux_out, int *totalNNodes_out, int *CRNNodes_out) { int NNodes, iB, nElems, elemNNodes, *nodeIDs=NULL, **elemNodeList=NULL; int iE, iN, iD, *nodeIDAux=NULL, CRNNodes, totalNNodes; /* ------------------------------------------------------- */ /* count the total number of nodes (ID can be repeated) */ /* ------------------------------------------------------- */ NNodes = 0; for ( iB = 0; iB < numBlocks_; iB++ ) { nElems = elemBlocks_[iB]->getNumElems(); elemNNodes = elemBlocks_[iB]->getElemNumNodes(); NNodes += nElems * elemNNodes; } CRNNodes = numCRMult_ * CRListLen_; totalNNodes = NNodes + CRNNodes; /* ------------------------------------------------------- */ /* allocate space and fetch the global node numbers */ /* ------------------------------------------------------- */ if ( totalNNodes > 0 ) nodeIDs = new int[totalNNodes]; totalNNodes = 0; for ( iB = 0; iB < numBlocks_; iB++ ) { nElems = elemBlocks_[iB]->getNumElems(); elemNNodes = elemBlocks_[iB]->getElemNumNodes(); elemNodeList = elemBlocks_[iB]->getElemNodeLists(); for ( iE = 0; iE < nElems; iE++ ) for ( iN = 0; iN < elemNNodes; iN++ ) nodeIDs[totalNNodes++] = elemNodeList[iE][iN]; } for ( iN = 0; iN < numCRMult_; iN++ ) for ( iD = 0; iD < CRListLen_; iD++ ) nodeIDs[totalNNodes++] = CRNodeLists_[iN][iD]; /* -- sort the global node numbers (ordering in nodeIDAux) -- */ if ( totalNNodes > 0 ) nodeIDAux = new int[totalNNodes]; for ( iN = 0; iN < totalNNodes; iN++ ) nodeIDAux[iN] = iN; IntSort2(nodeIDs, nodeIDAux, 0, totalNNodes-1); (*nodeIDs_out) = nodeIDs; (*nodeIDAux_out) = nodeIDAux; (*totalNNodes_out) = totalNNodes; (*CRNNodes_out) = CRNNodes; } /************************************************************************** * find which processor each shared node belongs to -------------------------------------------------------------------------*/ void LLNL_FEI_Fei::findSharedNodeProcs(int *nodeIDs, int *nodeIDAux, int totalNNodes, int CRNNodes, int **sharedNodePInfo_out) { int *sharedNodePInfo, iN, minProc, NNodes; int nprocs, index, *sharedNodePInds, iN2; MPI_Comm_size( mpiComm_, &nprocs); if ( numSharedNodes_ == 0 ) { (*sharedNodePInfo_out) = NULL; return; } sharedNodePInfo = new int[numSharedNodes_]; sharedNodePInds = new int[numSharedNodes_]; NNodes = totalNNodes - CRNNodes; for ( iN = 0; iN < numSharedNodes_; iN++ ) { /* --- search for processor with lowest rank to be owner --- */ index = hypre_BinarySearch(nodeIDs,sharedNodeIDs_[iN],totalNNodes); sharedNodePInds[iN] = -1; #if 0 /* Charles: 3/5/07 : sorted already, no need to do it again */ minProc = nprocs; for (int iP = 0; iP < sharedNodeNProcs_[iN]; iP++ ) { int pindex = sharedNodeProcs_[iN][iP]; if ( pindex < minProc ) minProc = pindex; } #else minProc = sharedNodeProcs_[iN][0]; #endif /* pind = -ve if my processor doesn't own nor need the shared node * pind = 0:nprocs-1 if my processor owns or needs the shared node pind >= nprocs if my processor needs but does not own it */ if ( index >= 0 ) { /* this segment is needed for comparison with NNodes */ for ( iN2 = index-1; iN2 >= 0; iN2-- ) { if ( nodeIDs[iN2] != nodeIDs[index] ) break; if ( nodeIDAux[iN2] < nodeIDAux[index] ) index = iN2; } for ( iN2 = index+1; iN2 < totalNNodes; iN2++ ) { if ( nodeIDs[iN2] != nodeIDs[index] ) break; if ( nodeIDAux[iN2] < nodeIDAux[index] ) index = iN2; } sharedNodePInds[iN] = index; if (nodeIDAux[index] < NNodes && mypid_ < minProc) minProc = mypid_; if (nodeIDAux[index] >= NNodes) minProc += nprocs; sharedNodePInfo[iN] = minProc; } else sharedNodePInfo[iN] = - minProc - 1; } findSharedNodeOwners( sharedNodePInfo ); for ( iN = 0; iN < numSharedNodes_; iN++ ) { if ( sharedNodePInfo[iN] != mypid_ ) { index = sharedNodePInds[iN]; if ( index >= 0 && nodeIDAux[index] >= 0 ) { for ( iN2 = index-1; iN2 >= 0; iN2-- ) { if ( nodeIDs[iN2] == nodeIDs[index] ) nodeIDAux[iN2] = - nodeIDAux[iN2] - 1; else break; } for ( iN2 = index+1; iN2 < totalNNodes; iN2++ ) { if ( nodeIDs[iN2] == nodeIDs[index] ) nodeIDAux[iN2] = - nodeIDAux[iN2] - 1; else break; } nodeIDAux[index] = - nodeIDAux[index] - 1; } } } delete [] sharedNodePInds; (*sharedNodePInfo_out) = sharedNodePInfo; } /************************************************************************** * obtain an ordered array of distinct node IDs * (nodeGlobalIDs_, numLocalNodes_) -------------------------------------------------------------------------*/ void LLNL_FEI_Fei::findSharedNodeOwners( int *sharedNodePInfo ) { int nComm, nCommAux, *commProcs, *commLengs, nprocs, iN, iP; int **sbuffer, **rbuffer, pindex, sindex, index, minProc; MPI_Request *requests; MPI_Status status; /* --- find number of distinct processors (nComm, commProcs) --- */ MPI_Comm_size( mpiComm_, &nprocs ); nComm = 0; for ( iN = 0; iN < numSharedNodes_; iN++ ) for ( iP = 0; iP < sharedNodeNProcs_[iN]; iP++ ) if ( sharedNodeProcs_[iN][iP] != mypid_ ) nComm++; if ( nComm > 0 ) commProcs = new int[nComm]; nComm = 0; for ( iN = 0; iN < numSharedNodes_; iN++ ) for ( iP = 0; iP < sharedNodeNProcs_[iN]; iP++ ) if ( sharedNodeProcs_[iN][iP] != mypid_ ) commProcs[nComm++] = sharedNodeProcs_[iN][iP]; if ( nComm > 0 ) IntSort(commProcs, 0, nComm-1); nCommAux = nComm; nComm = 0; for ( iP = 1; iP < nCommAux; iP++ ) { if ( commProcs[iP] != commProcs[nComm] ) commProcs[++nComm] = commProcs[iP]; } if ( nCommAux > 0 ) nComm++; /* --- allocate buffers (commLengs, sbuffer, rbuffer) --- */ if ( nComm > 0 ) commLengs = new int[nComm]; for ( iP = 0; iP < nComm; iP++ ) commLengs[iP] = 0; for ( iN = 0; iN < numSharedNodes_; iN++ ) { for ( iP = 0; iP < sharedNodeNProcs_[iN]; iP++ ) { pindex = sharedNodeProcs_[iN][iP]; if ( pindex != mypid_ ) { sindex = hypre_BinarySearch(commProcs,pindex,nComm); commLengs[sindex]++; } } } if ( nComm > 0 ) sbuffer = new int*[nComm]; if ( nComm > 0 ) rbuffer = new int*[nComm]; for ( iP = 0; iP < nComm; iP++ ) { sbuffer[iP] = new int[commLengs[iP]]; rbuffer[iP] = new int[commLengs[iP]]; commLengs[iP] = 0; } /* --- fill buffers --- */ for ( iN = 0; iN < numSharedNodes_; iN++ ) { for ( iP = 0; iP < sharedNodeNProcs_[iN]; iP++ ) { pindex = sharedNodeProcs_[iN][iP]; if ( pindex != mypid_ ) { sindex = hypre_BinarySearch(commProcs,pindex,nComm); sbuffer[sindex][commLengs[sindex]++] = sharedNodePInfo[iN]; } } } /* --- communicate --- */ if ( nComm > 0 ) requests = new MPI_Request[nComm]; for ( iP = 0; iP < nComm; iP++ ) MPI_Irecv( rbuffer[iP], commLengs[iP], MPI_INT, commProcs[iP], 89034, mpiComm_, &requests[iP]); for ( iP = 0; iP < nComm; iP++ ) MPI_Send( sbuffer[iP], commLengs[iP], MPI_INT, commProcs[iP], 89034, mpiComm_); for ( iP = 0; iP < nComm; iP++ ) MPI_Wait( &requests[iP], &status ); if ( nComm > 0 ) delete [] requests; /* --- update --- */ for ( iP = 0; iP < nComm; iP++ ) commLengs[iP] = 0; for ( iN = 0; iN < numSharedNodes_; iN++ ) { /* first take out all processors which disavow themselves */ for ( iP = 0; iP < sharedNodeNProcs_[iN]; iP++ ) { pindex = sharedNodeProcs_[iN][iP]; if ( pindex != mypid_ ) { sindex = hypre_BinarySearch(commProcs,pindex,nComm); index = rbuffer[sindex][commLengs[sindex]++]; if ( index < 0 ) sharedNodeProcs_[iN][iP] = - sharedNodeProcs_[iN][iP] - 1; else if ( index >= nprocs ) sharedNodeProcs_[iN][iP] += nprocs; } } /* now choose one from the rest of the processors */ minProc = nprocs; for ( iP = 0; iP < sharedNodeNProcs_[iN]; iP++ ) { pindex = sharedNodeProcs_[iN][iP]; if ( pindex >= nprocs ) sharedNodeProcs_[iN][iP] -= nprocs; else if ( mypid_ != pindex && pindex >= 0 ) { if ( pindex < minProc ) minProc = pindex; } } index = sharedNodePInfo[iN]; if (index >= 0 && index < nprocs && mypid_ < minProc) minProc = mypid_; sharedNodePInfo[iN] = minProc; } /* --- clean up --- */ if ( nComm > 0 ) delete [] commProcs; if ( nComm > 0 ) delete [] commLengs; for ( iP = 0; iP < nComm; iP++ ) { delete [] sbuffer[iP]; delete [] rbuffer[iP]; } if ( nComm > 0 ) delete [] sbuffer; if ( nComm > 0 ) delete [] rbuffer; return; } /************************************************************************** * setupCommPattern -------------------------------------------------------------------------*/ void LLNL_FEI_Fei::setupCommPattern( int *sharedNodePInfo ) { int iP, iN, iN2, index, index2, *ownerProcs, *sndrcvReg, *pArrayAux; int pCounts, nRecv, *recvLengs, *recvProcs, *recvBuf; int nSend, *sendLengs, *sendProcs, *sendBuf, nodeOffset, pindex; int nodeID, offset, *tLengs; MPI_Request *requests; MPI_Status status; /* allocate temporary variables */ ownerProcs = NULL; pArrayAux = NULL; sndrcvReg = NULL; if ( numExtNodes_ > 0 ) ownerProcs = new int[numExtNodes_]; if ( numExtNodes_ > 0 ) pArrayAux = new int[numExtNodes_]; if ( numSharedNodes_ > 0 ) sndrcvReg = new int[numSharedNodes_]; nodeOffset = globalNodeOffsets_[mypid_]; /* for all shared nodes, see if they are recv or send nodes */ for ( iN = 0; iN < numSharedNodes_; iN++ ) { nodeID = sharedNodeIDs_[iN]; index = -1; if ( numExtNodes_ > 0 ) index = hypre_BinarySearch(&(nodeGlobalIDs_[numLocalNodes_]),nodeID, numExtNodes_); if ( index >= 0 ) { sndrcvReg[iN] = 1; // recv ownerProcs[index] = sharedNodePInfo[iN]; pArrayAux[index] = sharedNodePInfo[iN]; } else { index2 = hypre_BinarySearch(nodeGlobalIDs_,nodeID,numLocalNodes_); if ( index2 >= 0 ) sndrcvReg[iN] = 0; // send else sndrcvReg[iN] = -1; } } /* based on the pArrayAux and ownerProcs arrays, compose */ /* receive information (nRecv, recvLengs, recvProcs) */ nRecv = 0; recvProcs = NULL; recvLengs = NULL; recvBuf = NULL; if (numExtNodes_ > 0) IntSort(pArrayAux, 0, numExtNodes_-1); if ( numExtNodes_ > 0 ) nRecv = 1; for ( iN = 1; iN < numExtNodes_; iN++ ) if ( pArrayAux[iN] != pArrayAux[nRecv-1] ) pArrayAux[nRecv++] = pArrayAux[iN]; if ( nRecv > 0 ) { recvProcs = new int[nRecv]; for ( iP = 0; iP < nRecv; iP++ ) recvProcs[iP] = pArrayAux[iP]; recvLengs = new int[nRecv]; for ( iP = 0; iP < nRecv; iP++ ) recvLengs[iP] = 0; for ( iN = 0; iN < numSharedNodes_; iN++ ) { if ( sndrcvReg[iN] == 1 ) { nodeID = sharedNodeIDs_[iN]; index = hypre_BinarySearch(&(nodeGlobalIDs_[numLocalNodes_]), nodeID,numExtNodes_); index = hypre_BinarySearch(recvProcs,ownerProcs[index],nRecv); recvLengs[index]++; } } offset = 0; for ( iP = 0; iP < nRecv; iP++ ) offset += recvLengs[iP]; recvBuf = new int[offset]; } delete [] pArrayAux; /* compose send information (nSend, sendLengs, sendProcs) */ pCounts = 0; for ( iN = 0; iN < numSharedNodes_; iN++ ) if ( sndrcvReg[iN] == 0 ) pCounts += sharedNodeNProcs_[iN]; if ( pCounts > 0 ) pArrayAux = new int[pCounts]; pCounts = 0; for ( iN = 0; iN < numSharedNodes_; iN++ ) { if ( sndrcvReg[iN] == 0 ) { for ( iP = 0; iP < sharedNodeNProcs_[iN]; iP++ ) { pindex = sharedNodeProcs_[iN][iP]; if ( pindex >= 0 && pindex != mypid_ ) pArrayAux[pCounts++] = pindex; } } } nSend = 0; sendProcs = NULL; sendLengs = NULL; if ( pCounts > 0 ) { IntSort( pArrayAux, 0, pCounts-1 ); nSend = 1; for ( iP = 1; iP < pCounts; iP++ ) if ( pArrayAux[iP] != pArrayAux[nSend-1] ) pArrayAux[nSend++] = pArrayAux[iP]; if ( nSend > 0 ) sendProcs = new int[nSend]; for ( iP = 0; iP < nSend; iP++ ) sendProcs[iP] = pArrayAux[iP]; sendLengs = new int[nSend]; for ( iP = 0; iP < nSend; iP++ ) sendLengs[iP] = 0; for ( iN = 0; iN < numSharedNodes_; iN++ ) { if ( sndrcvReg[iN] == 0 ) { for ( iP = 0; iP < sharedNodeNProcs_[iN]; iP++ ) { pindex = sharedNodeProcs_[iN][iP]; if ( pindex >= 0 && pindex != mypid_ ) { index = sharedNodeProcs_[iN][iP]; index = hypre_BinarySearch(sendProcs,index,nSend); sendLengs[index]++; } } } } offset = 0; for ( iP = 0; iP < nSend; iP++ ) offset += sendLengs[iP]; if ( offset > 0 ) sendBuf = new int[offset]; tLengs = new int[nSend+1]; tLengs[0] = 0; for (iP = 1; iP < nSend; iP++) tLengs[iP] = tLengs[iP-1]+sendLengs[iP-1]; for ( iP = 0; iP < nSend; iP++ ) sendLengs[iP] = 0; for ( iN = 0; iN < numSharedNodes_; iN++ ) { if ( sndrcvReg[iN] == 0 ) { for ( iP = 0; iP < sharedNodeNProcs_[iN]; iP++ ) { pindex = sharedNodeProcs_[iN][iP]; if ( pindex >= 0 && pindex != mypid_ ) { index = hypre_BinarySearch(sendProcs,pindex,nSend); index2 = hypre_BinarySearch(nodeGlobalIDs_, sharedNodeIDs_[iN],numLocalNodes_); sendBuf[tLengs[index]+sendLengs[index]] = nodeOffset + index2; sendLengs[index]++; } } } } delete [] tLengs; } if ( pCounts > 0 ) delete [] pArrayAux; /* -- exchange the (NEW) global node indices -- */ if ( nRecv > 0 ) requests = new MPI_Request[nRecv]; offset = 0; for ( iP = 0; iP < nRecv; iP++ ) { MPI_Irecv( &recvBuf[offset], recvLengs[iP], MPI_INT, recvProcs[iP], 183, mpiComm_, &requests[iP]); offset += recvLengs[iP]; } offset = 0; for ( iP = 0; iP < nSend; iP++ ) { MPI_Send( &sendBuf[offset], sendLengs[iP], MPI_INT, sendProcs[iP], 183, mpiComm_); offset += sendLengs[iP]; } for ( iP = 0; iP < nRecv; iP++ ) MPI_Wait( &requests[iP], &status ); if ( nRecv > 0 ) delete [] requests; /* -- fix the send index array -- */ offset = 0; for (iP = 0; iP < nSend; iP++) { for ( iN = 0; iN < sendLengs[iP]; iN++ ) sendBuf[offset+iN] -= nodeOffset; offset += sendLengs[iP]; } /* -- based on the recv information, construct recv index array -- */ if ( numExtNodes_ > 0 ) nodeExtNewGlobalIDs_ = new int[numExtNodes_]; tLengs = new int[nRecv+1]; tLengs[0] = 0; for ( iP = 1; iP < nRecv; iP++ ) tLengs[iP] = tLengs[iP-1] + recvLengs[iP-1]; for ( iP = 0; iP < nRecv; iP++ ) recvLengs[iP] = 0; for ( iN = 0; iN < numExtNodes_; iN++ ) { index = hypre_BinarySearch(recvProcs, ownerProcs[iN], nRecv); iN2 = recvBuf[tLengs[index]+recvLengs[index]]; nodeExtNewGlobalIDs_[iN] = iN2; recvBuf[tLengs[index]+recvLengs[index]] = iN + numLocalNodes_; recvLengs[index]++; } delete [] tLengs; if ( numSharedNodes_ > 0 ) delete [] sndrcvReg; if ( numExtNodes_ > 0 ) delete [] ownerProcs; /* -- construct the receive communication pattern -- */ nRecvs_ = nRecv; if ( nRecv > 0 ) { recvProcs_ = recvProcs; recvLengs_ = recvLengs; } else recvProcs_ = recvLengs_ = NULL; if ( nRecv > 0 ) recvProcIndices_ = recvBuf; else recvProcIndices_ = NULL; /* -- construct the send communication pattern -- */ nSends_ = nSend; if ( nSend > 0 ) { sendLengs_ = sendLengs; sendProcs_ = sendProcs; } else sendLengs_ = sendProcs_ = NULL; if ( nSend > 0 ) sendProcIndices_ = sendBuf; else sendProcIndices_ = NULL; } /************************************************************************** fetch the matrix -------------------------------------------------------------------------*/ void LLNL_FEI_Fei::getMatrix(LLNL_FEI_Matrix **mat) { if ( FLAG_LoadComplete_ == 0 ) loadComplete(); (*mat) = matPtr_; } /************************************************************************** get the off processor column indices -------------------------------------------------------------------------*/ void LLNL_FEI_Fei::fetchExtEqnList(int **eqnList) { int iN, iD, iP, index, offset; (*eqnList) = NULL; if ( numExtNodes_ == 0 ) return; (*eqnList) = new int[numExtNodes_ * nodeDOF_]; if ( globalCROffsets_ == NULL ) { for ( iN = 0; iN < numExtNodes_; iN++ ) for ( iD = 0; iD < nodeDOF_; iD++ ) (*eqnList)[iN*nodeDOF_+iD] = nodeExtNewGlobalIDs_[iN]*nodeDOF_+ iD; } else { offset = 0; for ( iP = 0; iP < nRecvs_; iP++ ) { for ( iN = 0; iN < recvLengs_[iP]; iN++ ) { index = recvProcIndices_[offset+iN] - numLocalNodes_; for ( iD = 0; iD < nodeDOF_; iD++ ) { (*eqnList)[index*nodeDOF_+iD] = nodeExtNewGlobalIDs_[index] * nodeDOF_ + iD + globalCROffsets_[recvProcs_[iP]]; } } offset += recvLengs_[iP]; } } } /************************************************************************** get the off processor column indices -------------------------------------------------------------------------*/ void LLNL_FEI_Fei::modifyCommPattern(int *nrecvs, int **recvlengs, int **recvprocs, int **recvindices, int *nsends, int **sendlengs, int **sendprocs, int **sendindices) { int iP, iD, iD2, offset, index, count; int nRecvs=0, *recvLengs=NULL, *recvProcs=NULL, *recvIndices=NULL; int nSends=0, *sendLengs=NULL, *sendProcs=NULL, *sendIndices=NULL; if ( nRecvs_ > 0 ) { nRecvs = nRecvs_; recvLengs = new int[nRecvs]; recvProcs = new int[nRecvs]; offset = 0; for ( iP = 0; iP < nRecvs_; iP++ ) offset += recvLengs_[iP]; recvIndices = new int[offset*nodeDOF_]; offset = 0; for ( iP = 0; iP < nRecvs_; iP++ ) { recvLengs[iP] = recvLengs_[iP] * nodeDOF_; recvProcs[iP] = recvProcs_[iP]; for ( iD = 0; iD < recvLengs_[iP]; iD++ ) { index = iD * nodeDOF_; for ( iD2 = 0; iD2 < nodeDOF_; iD2++) recvIndices[offset*nodeDOF_+index+iD2] = recvProcIndices_[offset+iD] * nodeDOF_ + iD2 + numCRMult_; } offset += recvLengs_[iP]; } } if ( nSends_ > 0 ) { nSends = nSends_; sendLengs = new int[nSends]; sendProcs = new int[nSends]; offset = 0; for ( iP = 0; iP < nSends_; iP++ ) offset += sendLengs_[iP]; sendIndices = new int[offset*nodeDOF_]; offset = 0; for ( iP = 0; iP < nSends_; iP++ ) { sendLengs[iP] = sendLengs_[iP] * nodeDOF_; sendProcs[iP] = sendProcs_[iP]; for ( iD = 0; iD < sendLengs_[iP]; iD++) { count = iD * nodeDOF_; for ( iD2 = 0; iD2 < nodeDOF_; iD2++) sendIndices[offset*nodeDOF_+count+iD2] = sendProcIndices_[offset+iD] * nodeDOF_ + iD2; } offset += sendLengs_[iP]; } } (*nrecvs) = nRecvs; (*recvlengs) = recvLengs; (*recvprocs) = recvProcs; (*recvindices) = recvIndices; (*nsends) = nSends; (*sendlengs) = sendLengs; (*sendprocs) = sendProcs; (*sendindices) = sendIndices; } hypre-2.33.0/src/FEI_mv/fei-hypre/LLNL_FEI_Fei.h000066400000000000000000000152231477326011500207030ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /*************************************************************************** Module: LLNL_FEI_Fei.h Purpose: custom implementation of the FEI ***************************************************************************/ #ifndef _LLNL_FEI_FEI_H_ #define _LLNL_FEI_FEI_H_ #include "LLNL_FEI_Matrix.h" /************************************************************************** definition of the class to capture the FEI information ---------------------------------------------------------------------------*/ class LLNL_FEI_Elem_Block { int blockID_; int numElems_; int nodeDOF_; int *elemIDs_; int **elemNodeLists_; int *sortedIDs_; int *sortedIDAux_; double **elemMatrices_; double **rhsVectors_; double **solnVectors_; int nodesPerElem_; int currElem_; double *tempX_; double *tempY_; public : LLNL_FEI_Elem_Block(int blockID); ~LLNL_FEI_Elem_Block(); int getElemBlockID() {return blockID_;} int getNumElems() {return numElems_;} int getElemNumNodes() {return nodesPerElem_;} int getCurrentElem() {return currElem_;} int **getElemNodeLists() {return elemNodeLists_;} double **getElemMatrices() {return elemMatrices_;} double **getRHSVectors() {return rhsVectors_;} double **getSolnVectors() {return solnVectors_;} int initialize(int numElems, int nNodesPerElem, int nodeDOF); int reset(); int resetRHSVectors(double s); int resetSolnVectors(double s); int loadElemInfo(int elemID, int *elemNodeList, double **elemStiff, double *elemRHS); int loadElemMatrix(int elemID, int *elemNodeList, double **elemStiff); int loadElemRHS(int elemID, double *elemRHS); int checkLoadComplete(); }; /************************************************************************** definition of the class to capture the FEI information ---------------------------------------------------------------------------*/ class LLNL_FEI_Fei { MPI_Comm mpiComm_; int mypid_; int outputLevel_; int numBlocks_; LLNL_FEI_Elem_Block **elemBlocks_; int numLocalNodes_; int numExtNodes_; int nodeDOF_; int *nodeGlobalIDs_; int *nodeExtNewGlobalIDs_; int *globalNodeOffsets_; int *globalCROffsets_; int numCRMult_; int CRListLen_; int **CRNodeLists_; int CRFieldID_; double **CRWeightLists_; double *CRValues_; int numSharedNodes_; int *sharedNodeIDs_; int *sharedNodeNProcs_; int **sharedNodeProcs_; int nRecvs_; int *recvLengs_; int *recvProcs_; int *recvProcIndices_; int nSends_; int *sendLengs_; int *sendProcs_; int *sendProcIndices_; int numBCNodes_; int *BCNodeIDs_; double **BCNodeAlpha_; double **BCNodeBeta_; double **BCNodeGamma_; LLNL_FEI_Matrix *matPtr_; double *solnVector_; double *rhsVector_; int FLAG_LoadComplete_; double TimerLoad_; double TimerLoadStart_; double TimerSolve_; double TimerSolveStart_; public : LLNL_FEI_Fei(MPI_Comm comm); ~LLNL_FEI_Fei(); int parameters(int numParams, char **paramString); int initFields(int numFields, int *fieldSizes, int *fieldIDs); int initElemBlock(int elemBlockID, int numElements, int numNodesPerElement, int *numFieldsPerNode, int **nodalFieldIDs, int numElemDOFFieldsPerElement, int *elemDOFFieldIDs, int interleaveStrategy); int initElem(int elemBlockID, int elemID, int *elemConn) {(void) elemBlockID; (void) elemID; (void) elemConn; return 0;} int initSharedNodes(int nShared, int *sharedIDs, int *sharedLeng, int **sharedProcs); int initComplete() {return 0;} int resetSystem(double s); int resetMatrix(double s); int resetRHSVector(double s); int resetInitialGuess(double s); int loadNodeBCs(int nNodes, int *nodeIDs, int fieldID, double **alpha, double **beta, double **gamma); int sumInElem(int elemBlock, int elemID, int *elemConn, double **elemStiff, double *elemLoad, int elemFormat); int sumInElemMatrix(int elemBlock, int elemID, int* elemConn, double **elemStiffness, int elemFormat); int sumInElemRHS(int elemBlock, int elemID, int *elemConn, double *elemLoad); int loadComplete(); int getNumBlockActNodes(int blockID, int *nNodes); int getNumBlockActEqns(int blockID, int *nEqns); int getBlockNodeIDList(int blockID, int numNodes, int *nodeIDList); int getBlockNodeSolution(int blockID, int numNodes, int *nodeIDList, int *solnOffsets, double *solnValues); int initCRMult(int CRListLen,int *CRNodeList,int *CRFieldList,int *CRID); int loadCRMult(int CRID, int CRListLen, int *CRNodeList, int *CRFieldList, double *CRWeightList, double CRValue); private: void assembleRHSVector(); void assembleSolnVector(); void buildGlobalMatrixVector(); void IntSort(int *, int, int); void IntSort2a(int *, double *, int, int); void scatterDData(double *x); void gatherAddDData(double *x); void gatherIData(int *x, int *y); void gatherDData(double *x, double *y); void sortSharedNodes(); void composeOrderedNodeIDList(int **nodeIDs, int **nodeIDAux, int *totalNNodes, int *CRNNodes); void findSharedNodeProcs(int *nodeIDs, int *nodeIDAux, int totalNNodes, int CRNNodes, int **sharedNodePInfo) ; void findSharedNodeOwners( int *sharedNodePInfo ); void setupCommPattern( int *sharedNodePInfo ); void modifyCommPattern(int *nrecvs, int **recvlengs, int **recvprocs, int **recvindices, int *nsends, int **sendlengs, int **sendprocs, int **sendIndices); void fetchExtEqnList(int **eqnList); public: void getRHSVector(double **rhs) {(*rhs) = rhsVector_;} void getSolnVector(double **soln) {(*soln) = solnVector_;} void getMatrix(LLNL_FEI_Matrix **mat); void disassembleSolnVector(double *); static void IntSort2(int *, int *, int, int); }; #endif /* endif for _LLNL_FEI_FEI_H_ */ hypre-2.33.0/src/FEI_mv/fei-hypre/LLNL_FEI_Impl.cxx000066400000000000000000000173231477326011500214570ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /************************************************************************** Module: LLNL_FEI_Impl.cxx Purpose: custom implementation of the FEI **************************************************************************/ #include #include #include #include #include "LLNL_FEI_Impl.h" /*------------------------------------------------------------------------- local defines -------------------------------------------------------------------------*/ #define SOLVERLOCK 1024 /************************************************************************** LLNL_FEI_Impl is the top level finite element interface. **************************************************************************/ /************************************************************************** Constructor -------------------------------------------------------------------------*/ LLNL_FEI_Impl::LLNL_FEI_Impl( MPI_Comm comm ) { mpiComm_ = comm; feiPtr_ = new LLNL_FEI_Fei(comm); solverPtr_ = NULL; lscPtr_ = NULL; matPtr_ = NULL; FLAG_SolverLib_ = 0; } /************************************************************************** destructor -------------------------------------------------------------------------*/ LLNL_FEI_Impl::~LLNL_FEI_Impl() { if (feiPtr_ != NULL) delete feiPtr_; if (solverPtr_ != NULL) delete solverPtr_; if (lscPtr_ != NULL) delete lscPtr_; } /************************************************************************** parameter function -------------------------------------------------------------------------*/ int LLNL_FEI_Impl::parameters(int numParams, char **paramString) { int i, iOne=1; char param1[100], param2[100], *param3; SolverLib_t solver; for ( i = 0; i < numParams; i++ ) { sscanf(paramString[i], "%s", param1); if ( !strcmp( param1, "externalSolver" ) ) { //printf("LLNL_FEI_Impl::make sure you call externalSolver before "); //printf("loading the matrix.\n"); if ( (FLAG_SolverLib_ & SOLVERLOCK) == 0 ) { sscanf(paramString[i], "%s %s", param1, param2); if ( !strcmp( param2, "HYPRE" ) ) FLAG_SolverLib_ = 1; else FLAG_SolverLib_ = 0; } } else if ( !strcmp( param1, "transferSolution" ) ) { transferSolution(); } } FLAG_SolverLib_ |= SOLVERLOCK; if ( (FLAG_SolverLib_ - SOLVERLOCK) > 0 ) { if ( lscPtr_ != NULL ) delete lscPtr_; if ( solverPtr_ != NULL ) { delete solverPtr_; solverPtr_ = NULL; } param3 = new char[30]; strcpy( param3, "matrixNoOverlap" ); feiPtr_->parameters(iOne,¶m3); delete [] param3; solver = HYPRE; lscPtr_ = new LLNL_FEI_LSCore(solver); } else { if ( solverPtr_ != NULL ) delete solverPtr_; if ( lscPtr_ != NULL ) { delete lscPtr_; lscPtr_ = NULL; } solverPtr_ = new LLNL_FEI_Solver(mpiComm_); } feiPtr_->parameters(numParams,paramString); if (solverPtr_ != NULL) solverPtr_->parameters(numParams,paramString); if (lscPtr_ != NULL) lscPtr_->parameters(numParams,paramString); return 0; } /************************************************************************** solve -------------------------------------------------------------------------*/ int LLNL_FEI_Impl::solve(int *status) { double *rhsVector, *solnVector; if ((FLAG_SolverLib_ & SOLVERLOCK) != 0) FLAG_SolverLib_ -= SOLVERLOCK; feiPtr_->getRHSVector(&rhsVector); feiPtr_->getSolnVector(&solnVector); feiPtr_->getMatrix(&matPtr_); if ( solverPtr_ != NULL ) { solverPtr_->loadRHSVector(rhsVector); solverPtr_->loadSolnVector(solnVector); solverPtr_->loadMatrix(matPtr_); solverPtr_->solve(status); } else if (lscPtr_ != NULL) { int localNRows, *diagIA, *diagJA, *indices, *offsets, rowSize; int extNRows, *offdIA, *offdJA, *colMap, maxRowSize, *colInds; int i, j, rowInd, one=1, iter, mypid; double *diagAA, *offdAA, *colVals; char format[20]; MPI_Comm_rank(mpiComm_, &mypid); strcpy( format, "HYPRE" ); matPtr_->getLocalMatrix(&localNRows, &diagIA, &diagJA, &diagAA); matPtr_->getExtMatrix(&extNRows, &offdIA, &offdJA, &offdAA, &colMap); offsets = matPtr_->getEqnOffsets(); lscPtr_->setGlobalOffsets(localNRows, NULL, offsets, NULL); maxRowSize = 0; for ( i = 0; i < localNRows; i++ ) { rowSize = diagIA[i+1] - diagIA[i]; if (offdIA != NULL ) rowSize += offdIA[i+1] - offdIA[i]; if (rowSize > maxRowSize) maxRowSize = rowSize; } if ( maxRowSize > 0 ) { colInds = new int[maxRowSize]; colVals = new double[maxRowSize]; } for ( i = 0; i < localNRows; i++ ) { rowSize = 0; for ( j = diagIA[i]; j < diagIA[i+1]; j++ ) { colInds[rowSize] = diagJA[j] + offsets[mypid]; colVals[rowSize++] = diagAA[j]; } if ( offdIA != NULL ) { for ( j = offdIA[i]; j < offdIA[i+1]; j++ ) { colInds[rowSize] = colMap[offdJA[j]-localNRows]; colVals[rowSize++] = offdAA[j]; } } rowInd = offsets[mypid] + i; lscPtr_->putIntoSystemMatrix(one, &rowInd, rowSize, (const int *) colInds, (const double* const*) &colVals); } if ( maxRowSize > 0 ) { delete [] colInds; delete [] colVals; } if ( localNRows > 0 ) indices = new int[localNRows]; for ( i = 0; i < localNRows; i++ ) indices[i] = i + offsets[mypid]; lscPtr_->putIntoRHSVector(localNRows, (const double *) rhsVector, (const int *) indices); lscPtr_->putInitialGuess((const int *) indices, (const double *) solnVector, localNRows); lscPtr_->matrixLoadComplete(); // Charles : this status check not in application code? if ((*status) != -9999) lscPtr_->solve(status,&iter); lscPtr_->getSolution(solnVector, localNRows); if (localNRows > 0) delete [] indices; } feiPtr_->disassembleSolnVector(solnVector); return 0; } /************************************************************************** residual norm calculation -------------------------------------------------------------------------*/ int LLNL_FEI_Impl::residualNorm(int whichNorm, int numFields, int *fieldIDs, double *norms ) { (void) numFields; (void) fieldIDs; double *solnVec, *rhsVec; feiPtr_->getSolnVector(&solnVec); feiPtr_->getRHSVector(&rhsVec); matPtr_->residualNorm(whichNorm,solnVec,rhsVec,norms); return 0; } /************************************************************************** transfer the solution from lsc to the fei mesh so that when getSolution is called to fei, it will fetch the correct data -------------------------------------------------------------------------*/ int LLNL_FEI_Impl::transferSolution() { int localNRows, *diagIA, *diagJA; double *diagAA, *solnVector; matPtr_->getLocalMatrix(&localNRows, &diagIA, &diagJA, &diagAA); solnVector = new double[localNRows]; lscPtr_->getSolution(solnVector, localNRows); feiPtr_->disassembleSolnVector(solnVector); return 0; } hypre-2.33.0/src/FEI_mv/fei-hypre/LLNL_FEI_Impl.h000066400000000000000000000126411477326011500211020ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /*************************************************************************** Module: LLNL_FEI_Impl.h Purpose: custom implementation of the FEI ***************************************************************************/ #ifndef _LLNL_FEI_IMPL_H_ #define _LLNL_FEI_IMPL_H_ #include "HYPRE.h" #include "_hypre_utilities.h" #include "LLNL_FEI_LSCore.h" #include "LLNL_FEI_Fei.h" #include "LLNL_FEI_Solver.h" #include "LLNL_FEI_Matrix.h" /************************************************************************** definition of the class to capture the FEI information ---------------------------------------------------------------------------*/ class LLNL_FEI_Impl { MPI_Comm mpiComm_; LLNL_FEI_Fei *feiPtr_; LLNL_FEI_Solver *solverPtr_; LLNL_FEI_Matrix *matPtr_; int FLAG_SolverLib_; public: LLNL_FEI_LSCore *lscPtr_; public : LLNL_FEI_Impl(MPI_Comm comm); ~LLNL_FEI_Impl(); int parameters(int numParams, char **paramString); int setSolveType(int solveType) { (void) solveType; return 0;} inline int initFields(int numFields, int *fieldSizes, int *fieldIDs) {return feiPtr_->initFields(numFields,fieldSizes,fieldIDs);} inline int initElemBlock(int elemBlockID, int numElements, int numNodesPerElement, int *numFieldsPerNode, int **nodalFieldIDs, int numElemDOFFieldsPerElement, int *elemDOFFieldIDs, int interleaveStrategy) {return feiPtr_->initElemBlock(elemBlockID, numElements, numNodesPerElement, numFieldsPerNode, nodalFieldIDs, numElemDOFFieldsPerElement, elemDOFFieldIDs, interleaveStrategy);} inline int initElem(int elemBlockID, int elemID, int *elemConn) {(void) elemBlockID; (void) elemID; (void) elemConn; return 0;} inline int initSharedNodes(int nShared, int *sharedIDs, int *sharedLeng, int **sharedProcs) {return feiPtr_->initSharedNodes(nShared,sharedIDs, sharedLeng,sharedProcs);} inline int initComplete() {return feiPtr_->initComplete();} inline int resetSystem(double s) {return feiPtr_->resetSystem(s);} inline int resetMatrix(double s) {return feiPtr_->resetMatrix(s);} inline int resetRHSVector(double s) {return feiPtr_->resetRHSVector(s);} inline int resetInitialGuess(double s) {return feiPtr_->resetInitialGuess(s);} inline int loadNodeBCs(int nNodes, int *nodeIDs, int fieldID, double **alpha, double **beta, double **gamma) {return feiPtr_->loadNodeBCs(nNodes,nodeIDs,fieldID, alpha,beta,gamma);} inline int sumInElem(int elemBlock, int elemID, int *elemConn, double **elemStiff, double *elemLoad, int elemFormat) {return feiPtr_->sumInElem(elemBlock,elemID,elemConn, elemStiff,elemLoad,elemFormat);} inline int sumInElemMatrix(int elemBlock, int elemID, int* elemConn, double **elemStiffness, int elemFormat) {return feiPtr_->sumInElemMatrix(elemBlock,elemID, elemConn,elemStiffness,elemFormat);} inline int sumInElemRHS(int elemBlock, int elemID, int *elemConn, double *elemLoad) {return feiPtr_->sumInElemRHS(elemBlock,elemID,elemConn, elemLoad);} inline int loadComplete() {return feiPtr_->loadComplete();} int solve(int *status); inline int iterations(int *iterTaken) {return solverPtr_->iterations(iterTaken);} int residualNorm(int whichNorm, int numFields, int* fieldIDs, double* norms); inline int getNumBlockActNodes(int blockID, int *nNodes) {return feiPtr_->getNumBlockActNodes(blockID,nNodes);} inline int getNumBlockActEqns(int blockID, int *nEqns) {return feiPtr_->getNumBlockActEqns(blockID,nEqns);} inline int getBlockNodeIDList(int blockID, int numNodes, int *nodeIDList) {return feiPtr_->getBlockNodeIDList(blockID,numNodes, nodeIDList);} inline int getBlockNodeSolution(int blockID, int numNodes, int *nodeIDList, int *solnOffsets, double *solnValues) {return feiPtr_->getBlockNodeSolution(blockID,numNodes, nodeIDList,solnOffsets,solnValues);} inline int initCRMult(int CRListLen,int *CRNodeList,int *CRFieldList, int *CRID) {return feiPtr_->initCRMult(CRListLen,CRNodeList, CRFieldList,CRID);} inline int loadCRMult(int CRID, int CRListLen, int *CRNodeList, int *CRFieldList, double *CRWeightList, double CRValue) {return feiPtr_->loadCRMult(CRID,CRListLen,CRNodeList, CRFieldList,CRWeightList,CRValue);} private: int transferSolution(); }; #endif /* endif for _LLNL_FEI_IMPL_H_ */ hypre-2.33.0/src/FEI_mv/fei-hypre/LLNL_FEI_LSCore.cxx000066400000000000000000000136151477326011500217050ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /************************************************************************** Module: LLNL_FEI_LSCore.cxx Purpose: custom implementation of the FEI/LSC **************************************************************************/ #include #include #include #include "_hypre_utilities.h" #include "HYPRE.h" #include "LLNL_FEI_LSCore.h" /************************************************************************** Constructor -------------------------------------------------------------------------*/ LLNL_FEI_LSCore::LLNL_FEI_LSCore(SolverLib_t solverLib) { lsc_ = NULL; switch (solverLib) { case HYPRE: lsc_ = HYPRE_base_create(MPI_COMM_WORLD ); if ( lsc_ == NULL ) printf("problem building HYPRE\n"); break; default: printf("unable to determine library type in LLNL_FEI_LSCore."); } } /************************************************************************** destructor -------------------------------------------------------------------------*/ LLNL_FEI_LSCore::~LLNL_FEI_LSCore() { if (lsc_ != NULL) delete lsc_; } /************************************************************************** direct access to LSC functions -------------------------------------------------------------------------*/ int LLNL_FEI_LSCore::setGlobalOffsets(int leng, int *nodeOffsets, int *eqnOffsets, int *blkEqnOffsets) { return(lsc_->setGlobalOffsets(leng,nodeOffsets,eqnOffsets,blkEqnOffsets)); } /************************************************************************** direct access to LSC functions -------------------------------------------------------------------------*/ int LLNL_FEI_LSCore::setMatrixStructure(int **ptColIndices, int *ptRowLengths, int **blkColIndices,int *blkRowLengths,int *ptRowsPerBlkRow) { return(lsc_->setMatrixStructure(ptColIndices,ptRowLengths,blkColIndices, blkRowLengths,ptRowsPerBlkRow)); } /************************************************************************** direct access to LSC functions -------------------------------------------------------------------------*/ int LLNL_FEI_LSCore::sumIntoSystemMatrix(int nRows, const int *rows, int nCols, const int* cols, const double* const* vals) { return(lsc_->sumIntoSystemMatrix(nRows,rows,nCols,cols,vals)); } /************************************************************************** direct access to LSC functions -------------------------------------------------------------------------*/ int LLNL_FEI_LSCore::putIntoSystemMatrix(int nRows, const int *rows, int nCols, const int* cols, const double* const* vals) { return(lsc_->putIntoSystemMatrix(nRows,rows,nCols,cols,vals)); } /************************************************************************** direct access to LSC functions -------------------------------------------------------------------------*/ int LLNL_FEI_LSCore::matrixLoadComplete() { return(lsc_->matrixLoadComplete()); } /************************************************************************** direct access to LSC functions -------------------------------------------------------------------------*/ int LLNL_FEI_LSCore::sumIntoRHSVector(int num, const double *vals, const int *indices) { return(lsc_->sumIntoRHSVector(num, vals, indices)); } /************************************************************************** direct access to LSC functions -------------------------------------------------------------------------*/ int LLNL_FEI_LSCore::putIntoRHSVector(int num, const double *vals, const int *indices) { return(lsc_->putIntoRHSVector(num, vals, indices)); } /************************************************************************** direct access to LSC functions -------------------------------------------------------------------------*/ int LLNL_FEI_LSCore::putInitialGuess(const int *eqnNumbers, const double *values, int len) { return(lsc_->putInitialGuess(eqnNumbers, values, len)); } /************************************************************************** direct access to LSC functions -------------------------------------------------------------------------*/ int LLNL_FEI_LSCore::parameters( int nParams, char **params) { return(lsc_->parameters(nParams, params)); } /************************************************************************** direct access to LSC functions -------------------------------------------------------------------------*/ int LLNL_FEI_LSCore::solve( int *status, int *iterations) { return(lsc_->launchSolver(*status, *iterations)); } /************************************************************************** direct access to LSC functions -------------------------------------------------------------------------*/ int LLNL_FEI_LSCore::formResidual( double* values, int leng) { return(lsc_->formResidual(values, leng)); } /************************************************************************** direct access to LSC functions -------------------------------------------------------------------------*/ int LLNL_FEI_LSCore::getSolution( double *answers, int leng) { return(lsc_->getSolution(answers, leng)); } /************************************************************************** direct access to LSC functions -------------------------------------------------------------------------*/ int LLNL_FEI_LSCore::getSolnEntry( int eqnNum, double *answers) { return(lsc_->getSolnEntry(eqnNum, *answers)); } hypre-2.33.0/src/FEI_mv/fei-hypre/LLNL_FEI_LSCore.h000066400000000000000000000044751477326011500213360ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /************************************************************************** Module: LLNL_FEI_LSCore.h Purpose: custom implementation of the FEI/LSC **************************************************************************/ #ifndef _LLNL_FEI_LSCORE_H_ #define _LLNL_FEI_LSCORE_H_ //New FEI 2.23.02 #include "fei_defs.h" #include "fei_Data.hpp" #include "fei_Lookup.hpp" #include "fei_LinearSystemCore.hpp" #include "cfei_hypre.h" typedef enum { UNDEFINED_SolverLib = -1, HYPRE =2 } SolverLib_t; /****************************************************************************** This is the definition for the base LLNL_FEI_LSCore class. *****************************************************************************/ class LLNL_FEI_LSCore { private : public : LinearSystemCore *lsc_; LLNL_FEI_LSCore( SolverLib_t tmp ); ~LLNL_FEI_LSCore(); int setGlobalOffsets(int leng, int *nodeOffsets, int *eqnOffsets, int *blkEqnOffsets); int setMatrixStructure(int **ptColIndices, int *ptRowLengths, int **blkColIndices, int *blkRowLengths, int *ptRowsPerBlkRow); int sumIntoSystemMatrix(int nRows, const int *rows, int nCols, const int* cols, const double* const* vals); int putIntoSystemMatrix(int nRows, const int *rows, int nCols, const int* cols, const double* const* vals); int matrixLoadComplete(); int sumIntoRHSVector(int num, const double *vals, const int *indices); int putIntoRHSVector(int num, const double *vals, const int *indices); int putInitialGuess(const int *eqnNumbers, const double *values, int leng); int parameters(int nParams, char **params); int solve(int *status, int *iterations); int formResidual( double* values, int leng); int getSolution(double *answers, int leng); int getSolnEntry(int eqnNum, double *answers); }; #endif /* endif for _LLNL_FEI_LSCORE_H_ */ hypre-2.33.0/src/FEI_mv/fei-hypre/LLNL_FEI_Matrix.cxx000066400000000000000000001311301477326011500220130ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /************************************************************************** Module: LLNL_FEI_Matrix.cpp Author: Charles Tong Purpose: custom implementation of the FEI/Matrix **************************************************************************/ #include #include #include #include #include "_hypre_utilities.h" #include "HYPRE.h" #include "LLNL_FEI_Matrix.h" /************************************************************************** Constructor -------------------------------------------------------------------------*/ LLNL_FEI_Matrix::LLNL_FEI_Matrix( MPI_Comm comm ) { mpiComm_ = comm; MPI_Comm_rank(comm, &mypid_); outputLevel_ = 0; localNRows_ = 0; nConstraints_ = 0; extNRows_ = 0; constrEqns_ = NULL; globalEqnOffsets_ = NULL; globalCROffsets_ = NULL; extColMap_ = NULL; /* ----------------------------------------------------------------- * matrix and vector information * ----------------------------------------------------------------*/ diagIA_ = NULL; diagJA_ = NULL; diagAA_ = NULL; offdIA_ = NULL; offdJA_ = NULL; offdAA_ = NULL; diagonal_ = NULL; /* ----------------------------------------------------------------* * communication information * ----------------------------------------------------------------*/ nRecvs_ = 0; recvLengs_ = NULL; recvProcs_ = NULL; recvProcIndices_ = NULL; dRecvBufs_ = NULL; dExtBufs_ = NULL; nSends_ = 0; sendLengs_ = NULL; sendProcs_ = NULL; sendProcIndices_ = NULL; dSendBufs_ = NULL; mpiRequests_ = NULL; /* ----------------------------------------------------------------- * others * ----------------------------------------------------------------*/ FLAG_PrintMatrix_ = 0; FLAG_MatrixOverlap_ = 1; } /************************************************************************** destructor -------------------------------------------------------------------------*/ LLNL_FEI_Matrix::~LLNL_FEI_Matrix() { double zero=0.0; resetMatrix(zero); } /************************************************************************** parameters function -------------------------------------------------------------------------*/ int LLNL_FEI_Matrix::parameters(int numParams, char **paramString) { int i; char param[256], param1[256]; for ( i = 0; i < numParams; i++ ) { sscanf(paramString[i],"%s", param1); if ( !strcmp(param1, "outputLevel") ) { sscanf(paramString[i],"%s %d", param1, &outputLevel_); if ( outputLevel_ < 0 ) outputLevel_ = 0; } else if ( !strcmp(param1, "setDebug") ) { sscanf(paramString[i],"%s %s", param1, param); if ( !strcmp(param, "printMatrix") ) FLAG_PrintMatrix_ = 1; } else if ( !strcmp(param1, "matrixNoOverlap") ) { FLAG_MatrixOverlap_ = 0; } } return 0; } /************************************************************************** reset matrix function -------------------------------------------------------------------------*/ int LLNL_FEI_Matrix::resetMatrix(double s) { (void) s; localNRows_ = 0; nConstraints_ = 0; extNRows_ = 0; if ( constrEqns_ != NULL ) delete [] constrEqns_; if ( globalEqnOffsets_ != NULL ) delete [] globalEqnOffsets_; if ( globalCROffsets_ != NULL ) delete [] globalCROffsets_; if ( extColMap_ != NULL ) delete [] extColMap_; if ( diagIA_ != NULL ) delete [] diagIA_; if ( diagJA_ != NULL ) delete [] diagJA_; if ( diagAA_ != NULL ) delete [] diagAA_; if ( offdIA_ != NULL ) delete [] offdIA_; if ( offdJA_ != NULL ) delete [] offdJA_; if ( offdAA_ != NULL ) delete [] offdAA_; if ( diagonal_ != NULL ) delete [] diagonal_; if ( recvLengs_ != NULL ) delete [] recvLengs_; if ( recvProcs_ != NULL ) delete [] recvProcs_; if ( recvProcIndices_ != NULL ) delete [] recvProcIndices_; if ( dRecvBufs_ != NULL ) delete [] dRecvBufs_; if ( dExtBufs_ != NULL ) delete [] dExtBufs_; if ( sendLengs_ != NULL ) delete [] sendLengs_; if ( sendProcs_ != NULL ) delete [] sendProcs_; if ( sendProcIndices_ != NULL ) delete [] sendProcIndices_; if ( dSendBufs_ != NULL ) delete [] dSendBufs_; if ( mpiRequests_ != NULL ) delete [] mpiRequests_; localNRows_ = 0; nConstraints_ = 0; extNRows_ = 0; constrEqns_ = NULL; globalEqnOffsets_ = NULL; globalCROffsets_ = NULL; extColMap_ = NULL; diagIA_ = NULL; diagJA_ = NULL; diagAA_ = NULL; offdIA_ = NULL; offdJA_ = NULL; offdAA_ = NULL; diagonal_ = NULL; nRecvs_ = 0; recvLengs_ = NULL; recvProcs_ = NULL; recvProcIndices_ = NULL; dRecvBufs_ = NULL; dExtBufs_ = NULL; nSends_ = 0; sendLengs_ = NULL; sendProcs_ = NULL; sendProcIndices_ = NULL; dSendBufs_ = NULL; mpiRequests_ = NULL; return 0; } /************************************************************************** set element and node information -------------------------------------------------------------------------*/ int LLNL_FEI_Matrix::setMatrix(int nRows, int *diagIA, int *diagJA, double *diagAA, int extNRows, int *colMap, int *offdIA, int *offdJA, double *offdAA, double *diagonal, int *eqnOffsets, int *crOffsets) { double zero=0.0; resetMatrix(zero); localNRows_ = nRows; diagIA_ = diagIA; diagJA_ = diagJA; diagAA_ = diagAA; extNRows_ = extNRows; extColMap_ = colMap; offdIA_ = offdIA; offdJA_ = offdJA; offdAA_ = offdAA; diagonal_ = diagonal; globalEqnOffsets_ = eqnOffsets; globalCROffsets_ = crOffsets; return 0; } /************************************************************************** set communication pattern -------------------------------------------------------------------------*/ int LLNL_FEI_Matrix::setCommPattern(int nRecvs, int *recvLengs, int *recvProcs, int *recvProcIndices, int nSends, int *sendLengs, int *sendProcs, int *sendProcIndices) { int iP, nSize; if (recvLengs_ != NULL) delete [] recvLengs_; if (recvProcs_ != NULL) delete [] recvProcs_; if (recvProcIndices_ != NULL) delete [] recvProcIndices_; if (dRecvBufs_ != NULL) delete [] dRecvBufs_; if (dExtBufs_ != NULL) delete [] dExtBufs_; if (sendLengs_ != NULL) delete [] sendLengs_; if (sendProcs_ != NULL) delete [] sendProcs_; if (sendProcIndices_ != NULL) delete [] sendProcIndices_; if (dSendBufs_ != NULL) delete [] dSendBufs_; if (mpiRequests_ != NULL) delete [] mpiRequests_; nRecvs_ = nRecvs; recvProcs_ = recvProcs; recvLengs_ = recvLengs; recvProcIndices_ = recvProcIndices; nSends_ = nSends; sendProcs_ = sendProcs; sendLengs_ = sendLengs; sendProcIndices_ = sendProcIndices; dRecvBufs_ = NULL; dSendBufs_ = NULL; dExtBufs_ = NULL; mpiRequests_ = NULL; if (nRecvs_ > 0) { nSize = 0; for (iP = 0; iP < nRecvs_; iP++) nSize += recvLengs_[iP]; dRecvBufs_ = new double[nSize]; dExtBufs_ = new double[nSize]; } if (nSends_ > 0) { nSize = 0; for (iP = 0; iP < nSends_; iP++) nSize += sendLengs_[iP]; dSendBufs_ = new double[nSize]; } if (nRecvs_+nSends_ > 0) mpiRequests_ = new MPI_Request[nRecvs_+nSends_]; return 0; } /************************************************************************** set complete pattern -------------------------------------------------------------------------*/ int LLNL_FEI_Matrix::setComplete() { if ( FLAG_MatrixOverlap_ == 0 ) exchangeSubMatrices(); if ( FLAG_PrintMatrix_ == 1 ) printMatrix(); return 0; } /************************************************************************** set constraints -------------------------------------------------------------------------*/ int LLNL_FEI_Matrix::setConstraints(int nConstr, int *constrEqns) { if (constrEqns_ != NULL) delete [] constrEqns_; nConstraints_ = nConstr; constrEqns_ = constrEqns; return 0; } /************************************************************************** form residual norm -------------------------------------------------------------------------*/ int LLNL_FEI_Matrix::residualNorm(int whichNorm, double *solnVec, double *rhsVec, double* norms) { int totalNRows, irow; double *rVec, rnorm, dtemp; (*norms) = 0.0; if (whichNorm < 0 || whichNorm > 2) return(-1); totalNRows = localNRows_ + extNRows_; rVec = new double[totalNRows]; matvec( solnVec, rVec ); for ( irow = 0; irow < localNRows_; irow++ ) rVec[irow] = rhsVec[irow] - rVec[irow]; switch(whichNorm) { case 0: rnorm = 0.0; for ( irow = 0; irow < localNRows_; irow++ ) { dtemp = fabs( rVec[irow] ); if ( dtemp > rnorm ) rnorm = dtemp; } MPI_Allreduce(&rnorm, &dtemp, 1, MPI_DOUBLE, MPI_MAX, mpiComm_); (*norms) = dtemp; break; case 1: rnorm = 0.0; for ( irow = 0; irow < localNRows_; irow++ ) rnorm += fabs( rVec[irow] ); MPI_Allreduce(&rnorm, &dtemp, 1, MPI_DOUBLE, MPI_SUM, mpiComm_); (*norms) = dtemp; break; case 2: rnorm = 0.0; for ( irow = 0; irow < localNRows_; irow++ ) rnorm += rVec[irow] * rVec[irow]; MPI_Allreduce(&rnorm, &dtemp, 1, MPI_DOUBLE, MPI_SUM, mpiComm_); (*norms) = sqrt(dtemp); break; } delete [] rVec; return 0; } /************************************************************************** matrix vector multiply -------------------------------------------------------------------------*/ void LLNL_FEI_Matrix::matvec(double *xvec, double *yvec) { int iD, iD2, matDim; double ddata; if ( FLAG_MatrixOverlap_ == 1 ) matDim = localNRows_ + extNRows_; else matDim = localNRows_; /* ----------------------------------------------------------------- * exchange vector information between processors * -----------------------------------------------------------------*/ scatterDData( xvec ); /* ----------------------------------------------------------------- * in case global stiffness matrix has been composed, use it * -----------------------------------------------------------------*/ for ( iD = 0; iD < matDim; iD++ ) { ddata = 0.0; for ( iD2 = diagIA_[iD]; iD2 < diagIA_[iD+1]; iD2++ ) ddata += diagAA_[iD2] * xvec[diagJA_[iD2]]; yvec[iD] = ddata; } /* ----------------------------------------------------------------- * in case global stiffness matrix has been composed, use it * -----------------------------------------------------------------*/ if ( offdIA_ != NULL ) { for ( iD = 0; iD < matDim; iD++ ) { ddata = 0.0; for ( iD2 = offdIA_[iD]; iD2 < offdIA_[iD+1]; iD2++ ) ddata += offdAA_[iD2] * dExtBufs_[offdJA_[iD2]-localNRows_]; yvec[iD] += ddata; } } /* ----------------------------------------------------------------- * exchange vector information between processors * -----------------------------------------------------------------*/ if ( FLAG_MatrixOverlap_ == 1 ) gatherAddDData( yvec ); } /************************************************************************** exchange extended vectors between processors -------------------------------------------------------------------------*/ void LLNL_FEI_Matrix::scatterDData( double *dvec ) { int iD, iP, ind1, offset; MPI_Status status; offset = 0; for ( iP = 0; iP < nRecvs_; iP++ ) { MPI_Irecv( &dRecvBufs_[offset], recvLengs_[iP], MPI_DOUBLE, recvProcs_[iP], 40343, mpiComm_, &mpiRequests_[iP]); offset += recvLengs_[iP]; } offset = 0; for ( iP = 0; iP < nSends_; iP++ ) { for ( iD = 0; iD < sendLengs_[iP]; iD++ ) { ind1 = sendProcIndices_[offset+iD]; dSendBufs_[offset+iD] = dvec[ind1]; } MPI_Send( &dSendBufs_[offset], sendLengs_[iP], MPI_DOUBLE, sendProcs_[iP], 40343, mpiComm_); offset += sendLengs_[iP]; } for ( iP = 0; iP < nRecvs_; iP++ ) MPI_Wait( &mpiRequests_[iP], &status ); offset = 0; for ( iP = 0; iP < nRecvs_; iP++ ) { for ( iD = 0; iD < recvLengs_[iP]; iD++ ) { ind1 = recvProcIndices_[offset+iD] - localNRows_; dExtBufs_[ind1] = dRecvBufs_[offset+iD]; } offset += recvLengs_[iP]; } } /************************************************************************** exchange data between processors -------------------------------------------------------------------------*/ void LLNL_FEI_Matrix::gatherAddDData( double *dvec ) { int iD, iP, ind1, offset; MPI_Status status; offset = 0; for ( iP = 0; iP < nSends_; iP++ ) { MPI_Irecv( &dSendBufs_[offset], sendLengs_[iP], MPI_DOUBLE, sendProcs_[iP], 40342, mpiComm_, &mpiRequests_[iP]); offset += sendLengs_[iP]; } offset = 0; for ( iP = 0; iP < nRecvs_; iP++ ) { for ( iD = 0; iD < recvLengs_[iP]; iD++ ) { ind1 = recvProcIndices_[offset+iD]; dRecvBufs_[offset+iD] = dvec[ind1]; } MPI_Send( &dRecvBufs_[offset], recvLengs_[iP], MPI_DOUBLE, recvProcs_[iP], 40342, mpiComm_); offset += recvLengs_[iP]; } for ( iP = 0; iP < nSends_; iP++ ) MPI_Wait( &mpiRequests_[iP], &status ); offset = 0; for ( iP = 0; iP < nSends_; iP++ ) { for ( iD = 0; iD < sendLengs_[iP]; iD++ ) { ind1 = sendProcIndices_[offset+iD]; dvec[ind1] += dSendBufs_[offset+iD]; } offset += sendLengs_[iP]; } } /************************************************************************** print matrix and right hand side vector to a file -------------------------------------------------------------------------*/ void LLNL_FEI_Matrix::printMatrix() { int iD, iD2, offset, iEnd, totalNNZ, colInd; int rowInd, matDim; char filename[20]; FILE *fp; sprintf(filename, "mat.%d", mypid_); fp = fopen(filename, "w"); if ( FLAG_MatrixOverlap_ == 1 ) matDim = localNRows_ + extNRows_; else matDim = localNRows_; totalNNZ = diagIA_[matDim]; if ( offdIA_ != NULL ) totalNNZ += offdIA_[matDim]; fprintf(fp, "%6d %7d \n", matDim, totalNNZ); offset = globalEqnOffsets_[mypid_]; for ( iD = 0; iD < localNRows_; iD++ ) { for ( iD2 = diagIA_[iD]; iD2 < diagIA_[iD+1]; iD2++ ) if ( diagJA_[iD2] == iD ) fprintf(fp,"%6d %6d %25.16e \n", iD+offset+1, diagJA_[iD2]+offset+1, diagAA_[iD2]); for ( iD2 = diagIA_[iD]; iD2 < diagIA_[iD+1]; iD2++ ) if ( diagJA_[iD2] != iD ) fprintf(fp,"%6d %6d %25.16e \n", iD+offset+1, diagJA_[iD2]+offset+1, diagAA_[iD2]); if ( offdIA_ != NULL ) { for ( iD2 = offdIA_[iD]; iD2 < offdIA_[iD+1]; iD2++ ) { colInd = extColMap_[offdJA_[iD2]-localNRows_] + 1; fprintf(fp,"%6d %6d %25.16e \n",iD+offset+1,colInd,offdAA_[iD2]); } } } if ( FLAG_MatrixOverlap_ == 1 ) { iEnd = localNRows_ + extNRows_; for ( iD = localNRows_; iD < iEnd; iD++ ) { for ( iD2 = diagIA_[iD]; iD2 < diagIA_[iD+1]; iD2++ ) { if ( diagJA_[iD2] == iD ) { rowInd = extColMap_[iD-localNRows_] + 1; colInd = diagJA_[iD2] + offset + 1; fprintf(fp,"%6d %6d %25.16e \n",rowInd,colInd,diagAA_[iD2]); } } for ( iD2 = diagIA_[iD]; iD2 < diagIA_[iD+1]; iD2++ ) { if ( diagJA_[iD2] != iD ) { rowInd = extColMap_[iD-localNRows_] + 1; colInd = diagJA_[iD2] + offset + 1; fprintf(fp,"%6d %6d %25.16e \n",rowInd,colInd,diagAA_[iD2]); } } if ( offdIA_ != NULL ) { for ( iD2 = offdIA_[iD]; iD2 < offdIA_[iD+1]; iD2++ ) { rowInd = extColMap_[iD-localNRows_] + 1; colInd = extColMap_[offdJA_[iD2]-localNRows_] + 1; fprintf(fp,"%6d %6d %25.16e \n",rowInd,colInd,offdAA_[iD2]); } } } } fclose(fp); } /************************************************************************** perform local matrix matrix multiplication -------------------------------------------------------------------------*/ void LLNL_FEI_Matrix::matMult( int ANRows, int ANCols, int *AIA, int *AJA, double *AAA, int BNRows, int BNCols, int *BIA, int *BJA, double *BAA, int *DNRows, int *DNCols, int **DIA, int **DJA, double **DAA) { (void) ANCols; (void) BNRows; int CNRows, CNCols, CNnz, *CReg, ia, ib, ia2, colIndA, colIndB, iTemp; int *CIA, *CJA, offset; double dTempA, dTempB, *CAA; /* ----------------------------------------------------------------------- * matrix matrix multiply - first compute sizes of each row in C * ----------------------------------------------------------------------*/ CNRows = ANRows; CNCols = BNCols; CNnz = 0; CReg = new int[CNRows]; for ( ib = 0; ib < CNRows; ib++ ) CReg[ib] = -1; for ( ia = 0; ia < ANRows; ia++ ) { for ( ia2 = AIA[ia]; ia2 < AIA[ia+1]; ia2++ ) { colIndA = AJA[ia2]; for ( ib = BIA[colIndA]; ib < BIA[colIndA+1]; ib++ ) { colIndB = BJA[ib]; if ( CReg[colIndB] != ia ) { CReg[colIndB] = ia; CNnz++; } } } } /* ----------------------------------------------------------------------- * matrix matrix multiply - perform the actual multiplication * ----------------------------------------------------------------------*/ CIA = new int[CNRows+1]; CJA = new int[CNnz]; CAA = new double[CNnz]; CNnz = 0; for ( ib = 0; ib < CNRows; ib++ ) CReg[ib] = -1; CIA[0] = 0; for ( ia = 0; ia < ANRows; ia++ ) { iTemp = CNnz; for ( ia2 = AIA[ia]; ia2 < AIA[ia+1]; ia2++ ) { colIndA = AJA[ia2]; dTempA = AAA[ia2]; for ( ib = BIA[colIndA]; ib < BIA[colIndA+1]; ib++ ) { colIndB = BJA[ib]; dTempB = BAA[ib]; offset = CReg[colIndB]; if ( offset < iTemp ) { CReg[colIndB] = CNnz; CJA[CNnz] = colIndB; CAA[CNnz++] = dTempA * dTempB; } else CAA[offset] += dTempA * dTempB; } } CIA[ia+1] = CNnz; } if ( CNRows > 0 ) delete [] CReg; (*DNRows) = CNRows; (*DNCols) = CNCols; (*DIA) = CIA; (*DJA) = CJA; (*DAA) = CAA; } /************************************************************************** exchange the off-diagonal matrices between processors -------------------------------------------------------------------------*/ void LLNL_FEI_Matrix::exchangeSubMatrices() { int **sendRowLengs, **recvRowLengs, currRow, iP, iN, rowInd; int *sendMatLengs, *recvMatLengs, **iSendBufs, **iRecvBufs; int count, index, iD, iD2, rowStart, rowEndp1, offset; int *diagRowLengs, *offdRowLengs, *TdiagIA, *TdiagJA; int *ToffdIA, *ToffdJA, *iSortArray1, *iSortArray2, *iShortList; int newDiagNNZ, newOffdNNZ, nRecvs, nSends, *recvLengs, *recvProcs; int *sendLengs, *sendProcs, nprocs, *recvProcIndices, eqnOffset; int *sendProcIndices, *procLengs, *procLengs2, totalRecvs, leng; double **dSendBufs, **dRecvBufs, *TdiagAA, *ToffdAA; MPI_Request *requests; MPI_Status status; MPI_Comm_size( mpiComm_, &nprocs ); if ( nprocs == 1 ) return; if ( outputLevel_ > 2 ) printf("%4d : exchangeSubMatrices begins... \n", mypid_); /* ----------------------------------------------------------------- * construct sendRowLengs and recvRowLengs * -----------------------------------------------------------------*/ nRecvs = nSends_; recvLengs = sendLengs_; recvProcs = sendProcs_; recvProcIndices = sendProcIndices_; nSends = nRecvs_; sendLengs = recvLengs_; sendProcs = recvProcs_; sendProcIndices = recvProcIndices_; if ( nSends > 0 ) sendRowLengs = new int*[nSends]; if ( nRecvs > 0 ) recvRowLengs = new int*[nRecvs]; if ( nRecvs > 0 ) requests = new MPI_Request[nRecvs]; for ( iP = 0; iP < nRecvs; iP++ ) { recvRowLengs[iP] = new int[recvLengs[iP]]; MPI_Irecv(recvRowLengs[iP], recvLengs[iP], MPI_INT, recvProcs[iP], 2476, mpiComm_, &requests[iP]); } offset = 0; for ( iP = 0; iP < nSends; iP++ ) { sendRowLengs[iP] = new int[sendLengs[iP]]; for ( iN = 0; iN < sendLengs[iP]; iN++ ) { currRow = sendProcIndices[offset+iN]; sendRowLengs[iP][iN] = (diagIA_[currRow+1] - diagIA_[currRow]); if ( offdIA_ != NULL ) sendRowLengs[iP][iN] += (offdIA_[currRow+1]-offdIA_[currRow]); } MPI_Send( sendRowLengs[iP], sendLengs[iP], MPI_INT, sendProcs[iP], 2476, mpiComm_); offset += sendLengs[iP]; } for ( iP = 0; iP < nRecvs; iP++ ) MPI_Wait( &requests[iP], &status ); if ( nRecvs > 0 ) delete [] requests; /* ----------------------------------------------------------------- * construct sendMatLengs and recvMatLengs * -----------------------------------------------------------------*/ if ( nSends > 0 ) sendMatLengs = new int[nSends]; if ( nRecvs > 0 ) recvMatLengs = new int[nRecvs]; for ( iP = 0; iP < nSends; iP++ ) { sendMatLengs[iP] = 0; for ( iN = 0; iN < sendLengs[iP]; iN++ ) sendMatLengs[iP] += sendRowLengs[iP][iN]; } for ( iP = 0; iP < nRecvs; iP++ ) { recvMatLengs[iP] = 0; for ( iN = 0; iN < recvLengs[iP]; iN++ ) recvMatLengs[iP] += recvRowLengs[iP][iN]; } /* ----------------------------------------------------------------- * construct and fill the communication buffers for sending matrix rows * -----------------------------------------------------------------*/ if ( nRecvs > 0 ) { dRecvBufs = new double*[nRecvs]; iRecvBufs = new int*[nRecvs]; } if ( nSends > 0 ) { dSendBufs = new double*[nSends]; iSendBufs = new int*[nSends]; } eqnOffset = globalEqnOffsets_[mypid_]; offset = 0; for ( iP = 0; iP < nSends; iP++ ) { iSendBufs[iP] = new int[sendMatLengs[iP]]; dSendBufs[iP] = new double[sendMatLengs[iP]]; count = 0; for ( iN = 0; iN < sendLengs[iP]; iN++ ) { currRow = sendProcIndices[offset+iN]; for ( iD = diagIA_[currRow]; iD < diagIA_[currRow+1]; iD++ ) { iSendBufs[iP][count] = diagJA_[iD] + eqnOffset; dSendBufs[iP][count++] = diagAA_[iD]; } if ( offdIA_ != NULL ) { for ( iD = offdIA_[currRow]; iD < offdIA_[currRow+1]; iD++ ) { index = extColMap_[offdJA_[iD]-localNRows_]; iSendBufs[iP][count] = index; dSendBufs[iP][count++] = offdAA_[iD]; } } } offset += sendLengs[iP]; } /* ----------------------------------------------------------------- * send the matrix rows * -----------------------------------------------------------------*/ if ( nRecvs > 0 ) requests = new MPI_Request[nRecvs]; for ( iP = 0; iP < nRecvs; iP++ ) { iRecvBufs[iP] = new int[recvMatLengs[iP]]; MPI_Irecv(iRecvBufs[iP], recvMatLengs[iP], MPI_INT, recvProcs[iP], 2477, mpiComm_, &requests[iP]); } for ( iP = 0; iP < nSends; iP++ ) MPI_Send( iSendBufs[iP], sendMatLengs[iP], MPI_INT, sendProcs[iP], 2477, mpiComm_); for ( iP = 0; iP < nRecvs; iP++ ) MPI_Wait( &requests[iP], &status ); for ( iP = 0; iP < nRecvs; iP++ ) { dRecvBufs[iP] = new double[recvMatLengs[iP]]; MPI_Irecv(dRecvBufs[iP], recvMatLengs[iP], MPI_DOUBLE, recvProcs[iP], 2478, mpiComm_, &requests[iP]); } for ( iP = 0; iP < nSends; iP++ ) MPI_Send( dSendBufs[iP], sendMatLengs[iP], MPI_DOUBLE, sendProcs[iP], 2478, mpiComm_); for ( iP = 0; iP < nRecvs; iP++ ) MPI_Wait( &requests[iP], &status ); if ( nRecvs > 0 ) delete [] requests; if ( nSends > 0 ) { for ( iP = 0; iP < nSends; iP++ ) delete [] sendRowLengs[iP]; delete [] sendRowLengs; delete [] sendMatLengs; for ( iP = 0; iP < nSends; iP++ ) delete [] iSendBufs[iP]; for ( iP = 0; iP < nSends; iP++ ) delete [] dSendBufs[iP]; delete [] iSendBufs; delete [] dSendBufs; } /* ----------------------------------------------------------------- * (now all information are in iRecvBufs and dRecvBufs) * -----------------------------------------------------------------*/ rowStart = eqnOffset; rowEndp1 = rowStart + localNRows_; diagRowLengs = new int[localNRows_]; for ( iD = 0; iD < localNRows_; iD++ ) diagRowLengs[iD] = diagIA_[iD+1] - diagIA_[iD]; offdRowLengs = new int[localNRows_]; if ( offdIA_ != NULL ) { for ( iD = 0; iD < localNRows_; iD++ ) offdRowLengs[iD] = offdIA_[iD+1] - offdIA_[iD]; } else { for ( iD = 0; iD < localNRows_; iD++ ) offdRowLengs[iD] = 0; } offset = 0; for ( iP = 0; iP < nSends_; iP++ ) { count = 0; for ( iN = 0; iN < sendLengs_[iP]; iN++ ) { rowInd = sendProcIndices_[offset+iN]; for ( iD = 0; iD < recvRowLengs[iP][iN]; iD++ ) { index = iRecvBufs[iP][count++]; if ( index >= rowStart && index < rowEndp1 ) diagRowLengs[rowInd]++; else offdRowLengs[rowInd]++; } } offset += sendLengs_[iP]; } newDiagNNZ = newOffdNNZ = 0; for ( iD = 0; iD < localNRows_; iD++ ) newDiagNNZ += diagRowLengs[iD]; for ( iD = 0; iD < localNRows_; iD++ ) newOffdNNZ += offdRowLengs[iD]; /* ----------------------------------------------------------------- * -----------------------------------------------------------------*/ TdiagIA = new int[localNRows_+1]; TdiagJA = new int[newDiagNNZ]; TdiagAA = new double[newDiagNNZ]; TdiagIA[0] = 0; for ( iD = 1; iD <= localNRows_; iD++ ) TdiagIA[iD] = TdiagIA[iD-1] + diagRowLengs[iD-1]; for ( iD = 0; iD < localNRows_; iD++ ) { index = TdiagIA[iD]; for ( iD2 = diagIA_[iD]; iD2 < diagIA_[iD+1]; iD2++ ) { TdiagJA[index] = diagJA_[iD2]; TdiagAA[index] = diagAA_[iD2]; index++; } TdiagIA[iD] = index; } delete [] diagIA_; delete [] diagJA_; delete [] diagAA_; if ( newOffdNNZ > 0 ) { ToffdIA = new int[localNRows_+1]; ToffdJA = new int[newOffdNNZ]; ToffdAA = new double[newOffdNNZ]; ToffdIA[0] = 0; for ( iD = 1; iD <= localNRows_; iD++ ) ToffdIA[iD] = ToffdIA[iD-1] + offdRowLengs[iD-1]; if ( offdIA_ != NULL ) { for ( iD = 0; iD < localNRows_; iD++ ) { index = ToffdIA[iD]; for ( iD2 = offdIA_[iD]; iD2 < offdIA_[iD+1]; iD2++ ) { count = extColMap_[offdJA_[iD2]-localNRows_]; ToffdJA[index] = count; ToffdAA[index] = offdAA_[iD2]; index++; } ToffdIA[iD] = index; } delete [] offdIA_; delete [] offdJA_; delete [] offdAA_; offdIA_ = NULL; offdJA_ = NULL; offdAA_ = NULL; } } offset = 0; for ( iP = 0; iP < nSends_; iP++ ) { count = 0; for ( iN = 0; iN < sendLengs_[iP]; iN++ ) { rowInd = sendProcIndices_[offset+iN]; for ( iD = 0; iD < recvRowLengs[iP][iN]; iD++ ) { index = iRecvBufs[iP][count]; if ( index >= rowStart && index < rowEndp1 ) { TdiagJA[TdiagIA[rowInd]] = index - rowStart; TdiagAA[TdiagIA[rowInd]++] = dRecvBufs[iP][count]; } else { ToffdJA[ToffdIA[rowInd]] = index; ToffdAA[ToffdIA[rowInd]++] = dRecvBufs[iP][count]; } count++; } } offset += sendLengs_[iP]; } if (nRecvs > 0) { for ( iP = 0; iP < nRecvs; iP++ ) delete [] iRecvBufs[iP]; for ( iP = 0; iP < nRecvs; iP++ ) delete [] dRecvBufs[iP]; for ( iP = 0; iP < nRecvs; iP++ ) delete [] recvRowLengs[iP]; delete [] iRecvBufs; delete [] dRecvBufs; delete [] recvRowLengs; delete [] recvMatLengs; } /* ----------------------------------------------------------------- * (now all data in Tdiag and Toffd and diagRowLengs and offdRowLengs) * sort the diagonal block and construct new diag block * -----------------------------------------------------------------*/ TdiagIA[0] = 0; for ( iD = 1; iD <= localNRows_; iD++ ) TdiagIA[iD] = TdiagIA[iD-1] + diagRowLengs[iD-1]; for ( iD = 0; iD < localNRows_; iD++ ) { index = TdiagIA[iD]; leng = diagRowLengs[iD]; IntSort2a(&(TdiagJA[index]),&(TdiagAA[index]),0,leng-1); count = index; for ( iN = index+1; iN < index+leng; iN++ ) { if ( TdiagJA[iN] != TdiagJA[count] ) { count++; TdiagJA[count] = TdiagJA[iN]; TdiagAA[count] = TdiagAA[iN]; } else TdiagAA[count] += TdiagAA[iN]; } if ( leng > 0 ) diagRowLengs[iD] = count - index + 1; else diagRowLengs[iD] = 0; } newDiagNNZ = 0; for ( iD = 0; iD < localNRows_; iD++ ) newDiagNNZ += diagRowLengs[iD]; diagIA_ = new int[localNRows_+1]; diagJA_ = new int[newDiagNNZ]; diagAA_ = new double[newDiagNNZ]; newDiagNNZ = 0; diagIA_[0] = newDiagNNZ; for ( iD = 0; iD < localNRows_; iD++ ) { index = TdiagIA[iD]; leng = diagRowLengs[iD]; for ( iN = index; iN < index+leng; iN++ ) { diagJA_[newDiagNNZ] = TdiagJA[iN]; diagAA_[newDiagNNZ++] = TdiagAA[iN]; } diagIA_[iD+1] = newDiagNNZ; } delete [] TdiagIA; delete [] TdiagJA; delete [] TdiagAA; delete [] diagRowLengs; /* ----------------------------------------------------------------- * sort the off-diagonal block * -----------------------------------------------------------------*/ if ( newOffdNNZ > 0 ) { ToffdIA[0] = 0; for ( iD = 1; iD <= localNRows_; iD++ ) ToffdIA[iD] = ToffdIA[iD-1] + offdRowLengs[iD-1]; newOffdNNZ = 0; for ( iD = 0; iD < localNRows_; iD++ ) { index = ToffdIA[iD]; leng = offdRowLengs[iD]; IntSort2a(&(ToffdJA[index]),&(ToffdAA[index]),0,leng-1); count = index; for ( iN = index+1; iN < index+leng; iN++ ) { if ( ToffdJA[iN] != ToffdJA[count] ) { count++; ToffdJA[count] = ToffdJA[iN]; ToffdAA[count] = ToffdAA[iN]; } else ToffdAA[count] += ToffdAA[iN]; } if ( leng > 0 ) offdRowLengs[iD] = count - index + 1; else offdRowLengs[iD] = 0; for ( iN = 0; iN < offdRowLengs[iD]; iN++ ) { ToffdJA[newOffdNNZ] = ToffdJA[index+iN]; ToffdAA[newOffdNNZ++] = ToffdAA[index+iN]; } } } /* ----------------------------------------------------------------- * sort the off-diagonal block to find distinct indices and construct * new receive information * -----------------------------------------------------------------*/ nRecvs = 0; recvProcs = recvLengs = NULL; recvProcIndices = NULL; if ( newOffdNNZ > 0 ) { /* sort all the off-diagonal indices */ iSortArray1 = new int[newOffdNNZ]; for ( iD = 0; iD < newOffdNNZ; iD++ ) iSortArray1[iD] = ToffdJA[iD]; iSortArray2 = new int[newOffdNNZ]; for ( iD = 0; iD < newOffdNNZ; iD++ ) iSortArray2[iD] = iD; IntSort2(iSortArray1, iSortArray2, 0, newOffdNNZ-1); /* put the short list in iShortList and the offset in iSortArray1 */ totalRecvs = 0; index = iSortArray1[0]; for ( iD = 1; iD < newOffdNNZ; iD++ ) { if ( iSortArray1[iD] != index ) { totalRecvs++; index = iSortArray1[iD]; } } totalRecvs++; iShortList = new int[totalRecvs]; totalRecvs = 0; index = iSortArray1[0]; iShortList[0] = iSortArray1[0]; iSortArray1[0] = totalRecvs; for ( iD = 1; iD < newOffdNNZ; iD++ ) { if ( iSortArray1[iD] != index ) { totalRecvs++; index = iSortArray1[iD]; iShortList[totalRecvs] = index; } iSortArray1[iD] = totalRecvs; } totalRecvs++; if ( extColMap_ != NULL ) delete [] extColMap_; extColMap_ = iShortList; extNRows_ = totalRecvs; /* convert the indices in ToffdJA */ for ( iD = 0; iD < newOffdNNZ; iD++ ) ToffdJA[iSortArray2[iD]] = iSortArray1[iD] + localNRows_; /* compress the Toffd matrix */ ToffdIA[0] = 0; for ( iD = 1; iD <= localNRows_; iD++ ) ToffdIA[iD] = ToffdIA[iD-1] + offdRowLengs[iD-1]; offdIA_ = ToffdIA; offdJA_ = new int[newOffdNNZ]; offdAA_ = new double[newOffdNNZ]; newOffdNNZ = 0; for ( iD = 0; iD < localNRows_; iD++ ) { index = ToffdIA[iD]; leng = offdRowLengs[iD]; for ( iN = index; iN < index+leng; iN++ ) { offdJA_[newOffdNNZ] = ToffdJA[iN]; offdAA_[newOffdNNZ++] = ToffdAA[iN]; } } delete [] ToffdJA; delete [] ToffdAA; /* construct nRecvs, recvLengs and recvProcs */ procLengs = new int[nprocs+1]; for ( iP = 0; iP < nprocs; iP++ ) procLengs[iP] = 0; for ( iP = 0; iP <= nprocs; iP++ ) { index = globalEqnOffsets_[iP]; iD2 = BinarySearch2(iShortList,0,totalRecvs,index); if ( iD2 == -1 ) iD2 = 0; else if ( iD2 == -totalRecvs+1 ) iD2 = - iD2 + 1; else if ( iD2 < 0 ) iD2 = - iD2; procLengs[iP] = iD2; } nRecvs = 0; for ( iP = 0; iP < nprocs; iP++ ) if ( procLengs[iP] != procLengs[iP+1] ) nRecvs++; if ( nRecvs > 0 ) { recvProcs = new int[nRecvs]; recvLengs = new int[nRecvs]; } else { recvProcs = NULL; recvLengs = NULL; } nRecvs = 0; for ( iP = 0; iP < nprocs; iP++ ) if ( procLengs[iP] != procLengs[iP+1] ) { recvLengs[nRecvs] = procLengs[iP+1] - procLengs[iP]; recvProcs[nRecvs++] = iP; } delete [] iSortArray1; delete [] iSortArray2; delete [] procLengs; if ( nRecvs > 0 ) { count = 0; for ( iP = 0; iP < nRecvs; iP++ ) count += recvLengs[iP]; recvProcIndices = new int[count]; for ( iN = 0; iN < count; iN++ ) recvProcIndices[iN] = iN + localNRows_; } } delete [] offdRowLengs; /* ----------------------------------------------------------------- * diagnostics * -----------------------------------------------------------------*/ #if 0 { char fname[20]; sprintf(fname,"extMap.%d",mypid_); FILE *fp = fopen(fname, "w"); for ( iD = 0; iD < extNRows_; iD++ ) fprintf(fp,"%10d %10d\n",iD,extColMap_[iD]); for ( iP = 0; iP < nRecvs; iP++ ) fprintf(fp,"recv proc = %10d, length = %10d\n",recvProcs[iP], recvLengs[iP]); fclose(fp); } #endif /* ----------------------------------------------------------------- * construct send information * -----------------------------------------------------------------*/ procLengs = new int[nprocs]; for ( iP = 0; iP < nprocs; iP++ ) procLengs[iP] = 0; for ( iP = 0; iP < nRecvs; iP++ ) procLengs[recvProcs[iP]] = 1; procLengs2 = new int[nprocs]; MPI_Allreduce(procLengs,procLengs2,nprocs,MPI_INT,MPI_SUM,mpiComm_); nSends = procLengs2[mypid_]; delete [] procLengs; delete [] procLengs2; sendProcs = sendLengs = NULL; sendProcIndices = NULL; if ( nSends > 0 ) { sendProcs = new int[nSends]; sendLengs = new int[nSends]; requests = new MPI_Request[nSends]; } for ( iP = 0; iP < nSends; iP++ ) MPI_Irecv(&(sendLengs[iP]),1,MPI_INT,MPI_ANY_SOURCE,12233,mpiComm_, &requests[iP]); for ( iP = 0; iP < nRecvs; iP++ ) MPI_Send(&(recvLengs[iP]),1,MPI_INT,recvProcs[iP],12233,mpiComm_); for ( iP = 0; iP < nSends; iP++ ) { MPI_Wait( &requests[iP], &status ); sendProcs[iP] = status.MPI_SOURCE; } if ( nSends > 0 ) { count = 0; for ( iP = 0; iP < nSends; iP++ ) count += sendLengs[iP]; sendProcIndices = new int[count]; } count = 0; for ( iP = 0; iP < nSends; iP++ ) { MPI_Irecv(&sendProcIndices[count],sendLengs[iP],MPI_INT,sendProcs[iP], 12234,mpiComm_, &requests[iP]); count += sendLengs[iP]; } index = 0; for ( iP = 0; iP < nRecvs; iP++ ) { iShortList = &(extColMap_[index]); leng = recvLengs[iP]; index += leng; MPI_Send(iShortList,leng,MPI_INT,recvProcs[iP],12234,mpiComm_); } for ( iP = 0; iP < nSends; iP++ ) MPI_Wait( &requests[iP], &status ); if ( nSends > 0 ) delete [] requests; nRecvs_ = nRecvs; if ( recvLengs_ != NULL ) delete [] recvLengs_; if ( recvProcs_ != NULL ) delete [] recvProcs_; if ( recvProcIndices_ != NULL ) delete [] recvProcIndices_; recvLengs_ = recvLengs; recvProcs_ = recvProcs; recvProcIndices_ = recvProcIndices; nSends_ = nSends; if ( sendLengs_ != NULL ) delete [] sendLengs_; if ( sendProcs_ != NULL ) delete [] sendProcs_; if ( sendProcIndices_ != NULL ) delete [] sendProcIndices_; sendLengs_ = sendLengs; sendProcs_ = sendProcs; sendProcIndices_ = sendProcIndices; count = 0; for ( iP = 0; iP < nSends_; iP++ ) { for ( iN = 0; iN < sendLengs_[iP]; iN++ ) { if ( sendProcIndices[count+iN] < eqnOffset || sendProcIndices[count+iN] >= eqnOffset+localNRows_ ) printf("%4d : exchangeSubMatrices ERROR : sendIndex %d (%d,%d).\n", mypid_, sendProcIndices[count+iN], eqnOffset, eqnOffset+localNRows_); else sendProcIndices[count+iN] -= eqnOffset; } count += sendLengs_[iP]; } if ( dRecvBufs_ != NULL ) delete [] dRecvBufs_; if ( dExtBufs_ != NULL ) delete [] dExtBufs_; if ( nRecvs_ > 0 ) { count = 0; for (iP = 0; iP < nRecvs_; iP++) count += recvLengs_[iP]; dRecvBufs_ = new double[count]; dExtBufs_ = new double[count]; } if ( dSendBufs_ != NULL ) delete [] dSendBufs_; if ( nSends_ > 0 ) { count = 0; for (iP = 0; iP < nSends_; iP++) count += sendLengs_[iP]; dSendBufs_ = new double[count]; } if ( mpiRequests_ != NULL ) delete [] mpiRequests_; if (nRecvs_+nSends_ > 0) mpiRequests_ = new MPI_Request[nRecvs_+nSends_]; /* ----------------------------------------------------------------- * diagnostics * -----------------------------------------------------------------*/ #if 0 { char fname[20]; sprintf(fname,"commInfo.%d",mypid_); FILE *fp = fopen(fname, "w"); count = 0; for ( iP = 0; iP < nRecvs_; iP++ ) { fprintf(fp,"recv from %10d = %10d\n",recvProcs_[iP],recvLengs_[iP]); for ( iD = 0; iD < recvLengs_[iP]; iD++ ) { fprintf(fp,"recv ind %10d = %10d\n",count,recvProcIndices_[count]); count++; } } count = 0; for ( iP = 0; iP < nSends_; iP++ ) { fprintf(fp,"send to %10d = %10d\n",sendProcs_[iP],sendLengs_[iP]); for ( iD = 0; iD < sendLengs_[iP]; iD++ ) { fprintf(fp,"send ind %10d = %10d\n",count,sendProcIndices_[count]); count++; } } fclose(fp); } #endif if ( outputLevel_ > 2 ) printf("%4d : exchangeSubMatrices ends. \n", mypid_); } /************************************************************************ * Function : BinarySearch2 ************************************************************************/ int LLNL_FEI_Matrix::BinarySearch2(int *map, int start, int mapSize, int num) { int k, khi, klo ; if (map == NULL) return -1 ; klo = start ; khi = start + mapSize; k = ((khi+klo) >> 1) + 1 ; while (khi-klo > 1) { k = (khi+klo) >> 1 ; if (map[k] == num) return k ; else if (map[k] > num) khi = k ; else klo = k ; } if (map[khi] == num) return khi; if (map[klo] == num) return klo; else return -(klo+1) ; } /************************************************************************** sort an integer array -------------------------------------------------------------------------*/ void LLNL_FEI_Matrix::IntSort(int *ilist, int left, int right) { int i, last, mid, itemp; if (left >= right) return; mid = (left + right) / 2; itemp = ilist[left]; ilist[left] = ilist[mid]; ilist[mid] = itemp; last = left; for (i = left+1; i <= right; i++) { if (ilist[i] < ilist[left]) { last++; itemp = ilist[last]; ilist[last] = ilist[i]; ilist[i] = itemp; } } itemp = ilist[left]; ilist[left] = ilist[last]; ilist[last] = itemp; IntSort(ilist, left, last-1); IntSort(ilist, last+1, right); } /************************************************************************** sort an integer array and an auxiliary array -------------------------------------------------------------------------*/ void LLNL_FEI_Matrix::IntSort2(int *ilist, int *ilist2, int left, int right) { int i, last, mid, itemp; if (left >= right) return; mid = (left + right) / 2; itemp = ilist[left]; ilist[left] = ilist[mid]; ilist[mid] = itemp; itemp = ilist2[left]; ilist2[left] = ilist2[mid]; ilist2[mid] = itemp; last = left; for (i = left+1; i <= right; i++) { if (ilist[i] < ilist[left]) { last++; itemp = ilist[last]; ilist[last] = ilist[i]; ilist[i] = itemp; itemp = ilist2[last]; ilist2[last] = ilist2[i]; ilist2[i] = itemp; } } itemp = ilist[left]; ilist[left] = ilist[last]; ilist[last] = itemp; itemp = ilist2[left]; ilist2[left] = ilist2[last]; ilist2[last] = itemp; IntSort2(ilist, ilist2, left, last-1); IntSort2(ilist, ilist2, last+1, right); } /************************************************************************** sort an integer array with an auxiliary double array -------------------------------------------------------------------------*/ void LLNL_FEI_Matrix::IntSort2a(int *ilist,double *dlist,int left,int right) { int mid, i, itemp, last, end2, isort, *ilist2, *ilist3; double dtemp, *dlist2, *dlist3; if (left >= right) return; mid = (left + right) / 2; itemp = ilist[left]; ilist[left] = ilist[mid]; ilist[mid] = itemp; dtemp = dlist[left]; dlist[left] = dlist[mid]; dlist[mid] = dtemp; last = left; isort = ilist[left]; ilist2 = &(ilist[last]); dlist2 = &(dlist[last]); ilist3 = &(ilist[left+1]); dlist3 = &(dlist[left+1]); end2 = right + 1; for (i = left+1; i < end2; i++) { if ( *ilist3 < isort ) { last++; ilist2++; dlist2++; itemp = *ilist2; *ilist2 = *ilist3; *ilist3 = itemp; dtemp = *dlist2; *dlist2 = *dlist3; *dlist3 = dtemp; } ilist3++; dlist3++; } itemp = ilist[left]; ilist[left] = ilist[last]; ilist[last] = itemp; dtemp = dlist[left]; dlist[left] = dlist[last]; dlist[last] = dtemp; IntSort2a(ilist, dlist, left, last-1); IntSort2a(ilist, dlist, last+1, right); } hypre-2.33.0/src/FEI_mv/fei-hypre/LLNL_FEI_Matrix.h000066400000000000000000000075131477326011500214470ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /*************************************************************************** Module: LLNL_FEI_Matrix.h Purpose: custom implementation of the FEI/Matrix ***************************************************************************/ #ifndef _LLNL_FEI_MATRIX_H_ #define _LLNL_FEI_MATRIX_H_ #include "_hypre_utilities.h" #include "HYPRE.h" /************************************************************************** definition of the class to capture the FEI matrix information ---------------------------------------------------------------------------*/ class LLNL_FEI_Matrix { MPI_Comm mpiComm_; int mypid_; int outputLevel_; int localNRows_; int nConstraints_; int extNRows_; int *constrEqns_; int *globalEqnOffsets_; int *globalCROffsets_; int *extColMap_; int *diagIA_; int *diagJA_; double *diagAA_; int *offdIA_; int *offdJA_; double *offdAA_; double *diagonal_; int nRecvs_; int *recvLengs_; int *recvProcs_; int *recvProcIndices_; double *dRecvBufs_; double *dExtBufs_; int nSends_; int *sendLengs_; int *sendProcs_; int *sendProcIndices_; double *dSendBufs_; MPI_Request *mpiRequests_; int FLAG_PrintMatrix_; int FLAG_MatrixOverlap_; public : LLNL_FEI_Matrix(MPI_Comm comm); ~LLNL_FEI_Matrix(); int parameters(int numParams, char **paramString); int resetMatrix(double s); int setMatrix(int nRows, int *diagIA, int *diagJA, double *diagAA, int nExtRows, int *colMap, int *offdIA, int *offdJA, double *offdAA, double *diagonal, int *eqnOffsets, int *crOffsets); int setCommPattern(int nRecvs, int *recvLengs, int *recvProcs, int *recvProcIndices, int nSends, int *sendLengs, int *sendProcs, int *sendProcIndices); int setComplete(); int setConstraints(int nConstraints, int *constEqns); int residualNorm(int whichNorm, double *solnVector, double *rhsVector, double* norms); int getNumLocalRows() {return localNRows_;} int getNumExtRows() {return extNRows_;} int *getEqnOffsets() {return globalEqnOffsets_;} double *getMatrixDiagonal() {return diagonal_;} int getLocalMatrix(int *nrows, int **ia, int **ja, double **aa) {(*nrows) = localNRows_; (*ia) = diagIA_; (*ja) = diagJA_; (*aa) = diagAA_; return 0; } int getExtMatrix(int *nrows, int **ia, int **ja, double **aa, int **map) {(*nrows) = extNRows_; (*ia) = offdIA_; (*ja) = offdJA_; (*aa) = offdAA_; (*map) = extColMap_; return 0; } void matvec(double *x, double *y); private: void scatterDData(double *x); void gatherAddDData(double *x); void printMatrix(); void matMult(int ANRows, int ANCols, int *AIA, int *AJA, double *AAA, int BNRows, int BNCols, int *BIA, int *BJA, double *BAA, int *DNRows, int *DNCols, int **DIA, int **DJA, double **DAA); void exchangeSubMatrices(); int BinarySearch2(int *list, int start, int lsize, int ind); void IntSort(int *list1, int start, int theEnd); void IntSort2(int *list1, int *list2, int start, int theEnd); void IntSort2a(int *list1, double *list2, int start, int theEnd); }; #endif /* endif for _LLNL_FEI_MATRIX_H_ */ hypre-2.33.0/src/FEI_mv/fei-hypre/LLNL_FEI_Solver.cxx000066400000000000000000001266671477326011500220440ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /************************************************************************** Module: LLNL_FEI_Solver.cxx Purpose: custom implementation of the FEI/Solver **************************************************************************/ #include #include #include #include #include "_hypre_utilities.h" #include "HYPRE.h" #include "LLNL_FEI_Solver.h" #ifdef HAVE_SUPERLU_20 #include "dsp_defs.h" #include "superlu_util.h" #endif #ifdef HAVE_SUPERLU #include "slu_ddefs.h" #include "slu_util.h" #endif /************************************************************************** Constructor -------------------------------------------------------------------------*/ LLNL_FEI_Solver::LLNL_FEI_Solver( MPI_Comm comm ) { mpiComm_ = comm; MPI_Comm_rank( comm, &mypid_ ); outputLevel_ = 0; /* ----------------------------------------------------------------- * solver information * ----------------------------------------------------------------*/ solverID_ = 0; krylovMaxIterations_ = 1000; krylovAbsRel_ = 0; /* 0 - relative norm */ krylovTolerance_ = 1.0e-6; krylovIterations_ = 0; krylovResidualNorm_ = 0.0; gmresDim_ = 20; /* ----------------------------------------------------------------- * node boundary condition information * ----------------------------------------------------------------*/ matPtr_ = NULL; solnVector_ = NULL; rhsVector_ = NULL; /* ----------------------------------------------------------------- * others * ----------------------------------------------------------------*/ TimerSolve_ = 0.0; TimerSolveStart_ = 0.0; } /************************************************************************** parameters function -------------------------------------------------------------------------*/ int LLNL_FEI_Solver::parameters(int numParams, char **paramString) { int i, olevel; #ifdef HAVE_SUPERLU int nprocs; #endif char param[256], param1[256]; for ( i = 0; i < numParams; i++ ) { sscanf(paramString[i],"%s", param1); if ( !strcmp(param1, "outputLevel") ) { sscanf(paramString[i],"%s %d", param1, &olevel); outputLevel_ = olevel; if ( olevel < 0 ) outputLevel_ = 0; if ( olevel > 4 ) outputLevel_ = 4; } else if ( !strcmp(param1, "gmresDim") ) { sscanf(paramString[i],"%s %d", param1, &gmresDim_); if ( gmresDim_ < 0 ) gmresDim_ = 10; } else if ( !strcmp(param1, "maxIterations") ) { sscanf(paramString[i],"%s %d", param1, &krylovMaxIterations_); if ( krylovMaxIterations_ <= 0 ) krylovMaxIterations_ = 1; } else if ( !strcmp(param1, "tolerance") ) { sscanf(paramString[i],"%s %lg", param1, &krylovTolerance_); if ( krylovTolerance_ >= 1.0 || krylovTolerance_ <= 0.0 ) krylovTolerance_ = 1.0e-6; } else if ( !strcmp(param1, "stopCrit") ) { sscanf(paramString[i],"%s %s", param1, param); if ( !strcmp(param, "absolute") ) krylovAbsRel_ = 1; else if ( !strcmp(param, "relative") ) krylovAbsRel_ = 0; else krylovAbsRel_ = 0; } else if ( !strcmp(param1, "solver") ) { sscanf(paramString[i],"%s %s", param1, param); if ( !strcmp(param, "cg") ) solverID_ = 0; else if ( !strcmp(param, "gmres") ) solverID_ = 1; else if ( !strcmp(param, "cgs") ) solverID_ = 2; else if ( !strcmp(param, "bicgstab")) solverID_ = 3; else if ( !strcmp(param, "superlu") ) { #ifdef HAVE_SUPERLU MPI_Comm_size( mpiComm_, &nprocs ); if ( nprocs == 1 ) solverID_ = 4; else { printf("LLNL_FEI_Solver WARNING : SuperLU not supported on "); printf("more than 1 proc. Use GMRES instead.\n"); solverID_ = 1; } #else printf("LLNL_FEI_Solver WARNING : SuperLU not available.\n"); solverID_ = 1; #endif } else solverID_ = 1; } else if ( !strcmp(param1, "preconditioner") ) { sscanf(paramString[i],"%s %s", param1, param); if ( (! !strcmp(param, "diag")) && (! !strcmp(param, "diagonal")) ) printf("LLNL_FEI_Solver::parameters - invalid preconditioner.\n"); } } return 0; } /************************************************************************** solve the linear system -------------------------------------------------------------------------*/ int LLNL_FEI_Solver::solve(int *status) { int nprocs; double dArray[2], dArray2[2]; if ( matPtr_ == NULL || solnVector_ == NULL || rhsVector_ == NULL ) { printf("%4d : LLNL_FEI_Solver::solve ERROR - not initialized.\n",mypid_); (*status) = 1; return 1; } MPI_Comm_size(mpiComm_, &nprocs); if ( outputLevel_ >= 1 && mypid_ == 0 ) printf("\t**************************************************\n"); switch (solverID_) { case 0 : TimerSolveStart_ = MPI_Wtime(); if ( outputLevel_ >= 1 && mypid_ == 0 ) { printf("\tLLNL_FEI CG with diagonal preconditioning\n"); printf("\tmaxIterations = %d\n",krylovMaxIterations_); printf("\ttolerance = %e\n",krylovTolerance_); } (*status) = solveUsingCG(); break; case 1 : TimerSolveStart_ = MPI_Wtime(); if ( outputLevel_ >= 1 && mypid_ == 0 ) { printf("\tLLNL_FEI GMRES with diagonal preconditioning\n"); printf("\t\tGMRES dimension = %d\n", gmresDim_); printf("\tmaxIterations = %d\n",krylovMaxIterations_); printf("\ttolerance = %e\n",krylovTolerance_); } (*status) = solveUsingGMRES(); break; case 2 : TimerSolveStart_ = MPI_Wtime(); if ( outputLevel_ >= 1 && mypid_ == 0 ) { printf("\tLLNL_FEI CGS with diagonal preconditioning\n"); printf("\tmaxIterations = %d\n",krylovMaxIterations_); printf("\ttolerance = %e\n",krylovTolerance_); } (*status) = solveUsingCGS(); break; case 3 : TimerSolveStart_ = MPI_Wtime(); if ( outputLevel_ >= 1 && mypid_ == 0 ) { printf("\tLLNL_FEI Bicgstab with diagonal preconditioning\n"); printf("\tmaxIterations = %d\n",krylovMaxIterations_); printf("\ttolerance = %e\n",krylovTolerance_); } (*status) = solveUsingBicgstab(); break; case 4 : TimerSolveStart_ = MPI_Wtime(); if ( outputLevel_ >= 1 && mypid_ == 0 ) { printf("\tLLNL_FEI direct link to SuperLU \n"); } (*status) = solveUsingSuperLU(); break; } TimerSolve_ = MPI_Wtime() - TimerSolveStart_; if (outputLevel_ >= 2) { dArray[0] = TimerSolve_; dArray[1] = TimerSolve_; MPI_Allreduce(dArray,dArray2,1,MPI_DOUBLE,MPI_SUM,mpiComm_); MPI_Allreduce(&dArray[1],&dArray2[1],1,MPI_DOUBLE,MPI_MAX,mpiComm_); } if (outputLevel_ >= 1 && mypid_ == 0) { printf("\tLLNL_FEI local solver : number of iterations = %d\n", krylovIterations_); if (outputLevel_ >= 2) { printf("\tLLNL_FEI local solver : final residual norm = %e\n", krylovResidualNorm_); printf("\tLLNL_FEI local solver : average solve time = %e\n", dArray2[0]/(double) nprocs); printf("\tLLNL_FEI local solver : maximum solve time = %e\n", dArray2[1]); } printf("\t**************************************************\n"); } return (*status); } /************************************************************************** solve linear system using conjugate gradient -------------------------------------------------------------------------*/ int LLNL_FEI_Solver::solveUsingCG() { int irow, iter, converged=0, localNRows, extNRows, totalNRows; int numTrials, innerIteration; double alpha, beta, rho=0.0, rhom1, rnorm0, rnorm, sigma, eps1; double *rVec, *pVec, *apVec, *zVec, dArray[2], dArray2[2], *diagonal; /* ----------------------------------------------------------------- * compute matrix information and allocate Krylov vectors * -----------------------------------------------------------------*/ localNRows = matPtr_->getNumLocalRows(); extNRows = matPtr_->getNumExtRows(); diagonal = matPtr_->getMatrixDiagonal(); totalNRows = localNRows + extNRows; rVec = new double[totalNRows]; /* ----------------------------------------------------------------- * compute initial residual vector and norm * -----------------------------------------------------------------*/ matPtr_->matvec( solnVector_, rVec ); for ( irow = 0; irow < localNRows; irow++ ) rVec[irow] = rhsVector_[irow] - rVec[irow]; rnorm0 = rnorm = 0.0; for ( irow = 0; irow < localNRows; irow++ ) { rnorm0 += (rVec[irow] * rVec[irow]); rnorm += (rhsVector_[irow] * rhsVector_[irow]); } dArray[0] = rnorm0; dArray[1] = rnorm; MPI_Allreduce(dArray, dArray2, 2, MPI_DOUBLE, MPI_SUM, mpiComm_); rnorm0 = sqrt(dArray2[1]); rnorm = sqrt(dArray2[0]); if ( outputLevel_ >= 2 && mypid_ == 0 ) printf("\tLLNL_FEI_Solver_CG initial rnorm = %e (%e)\n",rnorm,rnorm0); if ( rnorm0 == 0.0 ) { delete [] rVec; return 0; } /* ----------------------------------------------------------------- * initialization * -----------------------------------------------------------------*/ iter = 0; numTrials = 0; pVec = new double[totalNRows]; apVec = new double[totalNRows]; zVec = new double[totalNRows]; for ( irow = 0; irow < localNRows; irow++ ) pVec[irow] = 0.0; if ( krylovAbsRel_ == 0 ) eps1 = krylovTolerance_ * rnorm0; else eps1 = krylovTolerance_; if ( rnorm < eps1 ) converged = 1; /* ----------------------------------------------------------------- * loop until convergence is achieved * -----------------------------------------------------------------*/ while ( converged == 0 && numTrials < 2 ) { innerIteration = 0; while ( rnorm >= eps1 && iter < krylovMaxIterations_ ) { iter++; innerIteration++; if ( innerIteration == 1 ) { if ( diagonal != NULL ) for (irow = 0; irow < localNRows; irow++) zVec[irow] = rVec[irow] * diagonal[irow]; else for (irow = 0; irow < localNRows; irow++) zVec[irow] = rVec[irow]; rhom1 = rho; rho = 0.0; for ( irow = 0; irow < localNRows; irow++ ) rho += rVec[irow] * zVec[irow]; dArray[0] = rho; MPI_Allreduce(dArray, dArray2, 1, MPI_DOUBLE, MPI_SUM, mpiComm_); rho = dArray2[0]; beta = 0.0; } else beta = rho / rhom1; for ( irow = 0; irow < localNRows; irow++ ) pVec[irow] = zVec[irow] + beta * pVec[irow]; matPtr_->matvec( pVec, apVec ); sigma = 0.0; for ( irow = 0; irow < localNRows; irow++ ) sigma += pVec[irow] * apVec[irow]; dArray[0] = sigma; MPI_Allreduce(dArray, dArray2, 1, MPI_DOUBLE, MPI_SUM, mpiComm_); sigma = dArray2[0]; alpha = rho / sigma; for ( irow = 0; irow < localNRows; irow++ ) { solnVector_[irow] += alpha * pVec[irow]; rVec[irow] -= alpha * apVec[irow]; } rnorm = 0.0; for ( irow = 0; irow < localNRows; irow++ ) rnorm += rVec[irow] * rVec[irow]; dArray[0] = rnorm; if ( diagonal != NULL ) for (irow = 0; irow < localNRows; irow++) zVec[irow] = rVec[irow] * diagonal[irow]; else for (irow = 0; irow < localNRows; irow++) zVec[irow] = rVec[irow]; rhom1 = rho; rho = 0.0; for ( irow = 0; irow < localNRows; irow++ ) rho += rVec[irow] * zVec[irow]; dArray[1] = rho; MPI_Allreduce(dArray, dArray2, 2, MPI_DOUBLE, MPI_SUM, mpiComm_); rho = dArray2[1]; rnorm = sqrt( dArray2[0] ); if ( outputLevel_ >= 2 && iter % 1 == 0 && mypid_ == 0 ) printf("\tLLNL_FEI_Solver_CG : iteration %d - rnorm = %e (%e)\n", iter, rnorm, eps1); } matPtr_->matvec( solnVector_, rVec ); for ( irow = 0; irow < localNRows; irow++ ) rVec[irow] = rhsVector_[irow] - rVec[irow]; rnorm = 0.0; for ( irow = 0; irow < localNRows; irow++ ) rnorm += rVec[irow] * rVec[irow]; dArray[0] = rnorm; MPI_Allreduce(dArray, dArray2, 1, MPI_DOUBLE, MPI_SUM, mpiComm_); rnorm = sqrt( dArray2[0] ); if ( outputLevel_ >= 2 && mypid_ == 0 ) printf("\tLLNL_FEI_Solver_CG actual rnorm = %e \n",rnorm); if ( (rnorm < eps1 || rnorm < 1.0e-16) || iter >= krylovMaxIterations_ ) converged = 1; numTrials++; } krylovIterations_ = iter; krylovResidualNorm_ = rnorm; /* ----------------------------------------------------------------- * clean up * -----------------------------------------------------------------*/ delete [] rVec; delete [] pVec; delete [] apVec; delete [] zVec; return (1-converged); } /************************************************************************** solve linear system using GMRES -------------------------------------------------------------------------*/ int LLNL_FEI_Solver::solveUsingGMRES() { int irow, iter, converged=0, localNRows, extNRows, totalNRows; int innerIterations, iV, iV2, kStep, kp1, jV; double rnorm0, rnorm, eps1, epsmac=1.0e-16, gam; double **kVectors, **HH, *RS, *C, *S, *dArray, *dArray2; double *tVector, *tVector2, *v1, *v2, *diagonal, dtemp; /* ----------------------------------------------------------------- * compute matrix information and allocate Krylov vectors * -----------------------------------------------------------------*/ localNRows = matPtr_->getNumLocalRows(); extNRows = matPtr_->getNumExtRows(); diagonal = matPtr_->getMatrixDiagonal(); totalNRows = localNRows + extNRows; kVectors = new double*[gmresDim_+2]; for (iV = 0; iV <= gmresDim_+1; iV++) kVectors[iV] = new double[totalNRows]; dArray = new double[gmresDim_+1]; dArray2 = new double[gmresDim_+1]; /* ----------------------------------------------------------------- * compute initial residual vector and norm * -----------------------------------------------------------------*/ tVector = kVectors[1]; matPtr_->matvec( solnVector_, tVector ); for ( irow = 0; irow < localNRows; irow++ ) tVector[irow] = rhsVector_[irow] - tVector[irow]; rnorm0 = rnorm = 0.0; for ( irow = 0; irow < localNRows; irow++ ) { rnorm0 += (tVector[irow] * tVector[irow]); rnorm += (rhsVector_[irow] * rhsVector_[irow]); } dArray[0] = rnorm0; dArray[1] = rnorm; MPI_Allreduce(dArray, dArray2, 2, MPI_DOUBLE, MPI_SUM, mpiComm_); rnorm0 = sqrt(dArray2[0]); rnorm = sqrt(dArray2[1]); if ( outputLevel_ >= 2 && mypid_ == 0 ) printf("\tLLNL_FEI_Solver_GMRES initial rnorm = %e (%e)\n", rnorm, rnorm0); if ( rnorm0 < 1.0e-20 ) { for (iV = 0; iV <= gmresDim_+1; iV++) delete [] kVectors[iV]; delete [] kVectors; delete [] dArray; delete [] dArray2; return 0; } /* ----------------------------------------------------------------- * initialization * -----------------------------------------------------------------*/ if ( krylovAbsRel_ == 0 ) eps1 = krylovTolerance_ * rnorm0; else eps1 = krylovTolerance_; HH = new double*[gmresDim_+2]; for (iV=1; iV<=gmresDim_+1; iV++) HH[iV] = new double[gmresDim_+2]; RS = new double[gmresDim_+2]; S = new double[gmresDim_+1]; C = new double[gmresDim_+1]; /* ----------------------------------------------------------------- * loop until convergence is achieved * -----------------------------------------------------------------*/ iter = 0; while ( rnorm >= eps1 && iter < krylovMaxIterations_ ) { dtemp = 1.0 / rnorm; tVector = kVectors[1]; for (irow = 0; irow < localNRows; irow++) tVector[irow] *= dtemp; RS[1] = rnorm; innerIterations = 0; while ( innerIterations < gmresDim_ && rnorm >= eps1 && iter < krylovMaxIterations_ ) { innerIterations++; iter++; kStep = innerIterations; kp1 = innerIterations + 1; v1 = kVectors[kStep]; v2 = kVectors[0]; if ( diagonal != NULL ) for (irow = 0; irow < localNRows; irow++) v2[irow] = v1[irow] * diagonal[irow]; else for (irow = 0; irow < localNRows; irow++) v2[irow] = v1[irow]; matPtr_->matvec( kVectors[0], kVectors[kp1] ); #if 0 tVector = kVectors[kp1]; for ( iV = 1; iV <= kStep; iV++ ) { dtemp = 0.0; tVector2 = kVectors[iV]; for ( irow = 0; irow < localNRows; irow++ ) dtemp += tVector2[irow] * tVector[irow]; dArray[iV-1] = dtemp; } MPI_Allreduce(dArray, dArray2, kStep, MPI_DOUBLE, MPI_SUM, mpiComm_); tVector = kVectors[kp1]; for ( iV = 1; iV <= kStep; iV++ ) { dtemp = dArray2[iV-1]; HH[iV][kStep] = dtemp; tVector2 = kVectors[iV]; for ( irow = 0; irow < localNRows; irow++ ) tVector[irow] -= dtemp * tVector2[irow]; } #else tVector = kVectors[kp1]; for ( iV = 1; iV <= kStep; iV++ ) { dtemp = 0.0; tVector2 = kVectors[iV]; for ( irow = 0; irow < localNRows; irow++ ) dtemp += tVector2[irow] * tVector[irow]; dArray[0] = dtemp; MPI_Allreduce(dArray, dArray2, 1, MPI_DOUBLE, MPI_SUM, mpiComm_); dtemp = dArray2[0]; HH[iV][kStep] = dtemp; for ( irow = 0; irow < localNRows; irow++ ) tVector[irow] -= dtemp * tVector2[irow]; } #endif dtemp = 0.0; for ( irow = 0; irow < localNRows; irow++ ) dtemp += tVector[irow] * tVector[irow]; MPI_Allreduce(&dtemp, dArray2, 1, MPI_DOUBLE, MPI_SUM, mpiComm_); dtemp = sqrt(dArray2[0]); HH[kp1][kStep] = dtemp; if ( dtemp != 0.0 ) { dtemp = 1.0 / dtemp; for (irow = 0; irow < localNRows; irow++) tVector[irow] *= dtemp; } for ( iV = 2; iV <= kStep; iV++ ) { dtemp = HH[iV-1][kStep]; HH[iV-1][kStep] = C[iV-1] * dtemp + S[iV-1] * HH[iV][kStep]; HH[iV][kStep] = -S[iV-1] * dtemp + C[iV-1] * HH[iV][kStep]; } gam = sqrt(HH[kStep][kStep]*HH[kStep][kStep]+ HH[kp1][kStep]*HH[kp1][kStep]); if ( gam == 0.0 ) gam = epsmac; C[kStep] = HH[kStep][kStep] / gam; S[kStep] = HH[kp1][kStep] / gam; RS[kp1] = -S[kStep] * RS[kStep]; RS[kStep] = C[kStep] * RS[kStep]; HH[kStep][kStep] = C[kStep] * HH[kStep][kStep] + S[kStep] * HH[kp1][kStep]; rnorm = fabs(RS[kp1]); if ( outputLevel_ >= 2 && mypid_ == 0 ) printf("\tLLNL_FEI_Solver_GMRES : iteration %d - rnorm = %e\n", iter, rnorm); } RS[kStep] = RS[kStep] / HH[kStep][kStep]; for ( iV = 2; iV <= kStep; iV++ ) { iV2 = kStep - iV + 1; dtemp = RS[iV2]; for ( jV = iV2+1; jV <= kStep; jV++ ) dtemp = dtemp - HH[iV2][jV] * RS[jV]; RS[iV2] = dtemp / HH[iV2][iV2]; } tVector = kVectors[1]; dtemp = RS[1]; for ( irow = 0; irow < localNRows; irow++ ) tVector[irow] *= dtemp; for ( iV = 2; iV <= kStep; iV++ ) { dtemp = RS[iV]; tVector2 = kVectors[iV]; for ( irow = 0; irow < localNRows; irow++ ) tVector[irow] += dtemp * tVector2[irow]; } tVector = kVectors[1]; if ( diagonal != NULL ) { for (irow = 0; irow < localNRows; irow++) tVector[irow] *= diagonal[irow]; } for (irow = 0; irow < localNRows; irow++) solnVector_[irow] += tVector[irow]; matPtr_->matvec( solnVector_, tVector ); for ( irow = 0; irow < localNRows; irow++ ) tVector[irow] = rhsVector_[irow] - tVector[irow]; rnorm = 0.0; for ( irow = 0; irow < localNRows; irow++ ) rnorm += (tVector[irow] * tVector[irow]); MPI_Allreduce(&rnorm, dArray2, 1, MPI_DOUBLE, MPI_SUM, mpiComm_); rnorm = sqrt(dArray2[0]); } if ( rnorm < eps1 ) converged = 1; if ( outputLevel_ >= 2 && mypid_ == 0 ) printf("\tLLNL_FEI_Solver_GMRES : final rnorm = %e\n", rnorm); krylovIterations_ = iter; krylovResidualNorm_ = rnorm; /* ----------------------------------------------------------------- * clean up * -----------------------------------------------------------------*/ for (iV = 0; iV <= gmresDim_+1; iV++) delete [] kVectors[iV]; delete [] kVectors; for ( iV =1; iV <= gmresDim_+1; iV++ ) delete [] HH[iV]; delete [] HH; delete [] RS; delete [] S; delete [] C; delete [] dArray; delete [] dArray2; return (1-converged); } /************************************************************************** solve linear system using CGS -------------------------------------------------------------------------*/ int LLNL_FEI_Solver::solveUsingCGS() { int irow, iter, converged=0, localNRows, extNRows, totalNRows; int numTrials, innerIteration; double *rVec, *rhVec, *vVec, *pVec, *qVec, *uVec, *tVec; double rho1, rho2, sigma, alpha, dtemp, dtemp2, rnorm, rnorm0; double beta, beta2, eps1, dArray[2], dArray2[2], *diagonal; /* ----------------------------------------------------------------- * compute matrix information and allocate Krylov vectors * -----------------------------------------------------------------*/ localNRows = matPtr_->getNumLocalRows(); extNRows = matPtr_->getNumExtRows(); diagonal = matPtr_->getMatrixDiagonal(); totalNRows = localNRows + extNRows; rVec = new double[totalNRows]; /* ----------------------------------------------------------------- * compute initial residual vector and norm * -----------------------------------------------------------------*/ matPtr_->matvec( solnVector_, rVec ); for ( irow = 0; irow < localNRows; irow++ ) rVec[irow] = rhsVector_[irow] - rVec[irow]; rnorm0 = rnorm = 0.0; for ( irow = 0; irow < localNRows; irow++ ) { rnorm0 += (rVec[irow] * rVec[irow]); rnorm += (rhsVector_[irow] * rhsVector_[irow]); } dArray[0] = rnorm0; dArray[1] = rnorm; MPI_Allreduce(dArray, dArray2, 2, MPI_DOUBLE, MPI_SUM, mpiComm_); rnorm0 = sqrt(dArray2[1]); rnorm = sqrt(dArray2[0]); if ( outputLevel_ >= 2 && mypid_ == 0 ) printf("\tLLNL_FEI_Solver_CGS initial rnorm = %e (%e)\n",rnorm,rnorm0); if ( rnorm0 == 0.0 ) { delete [] rVec; return 0; } /* ----------------------------------------------------------------- * initialization * -----------------------------------------------------------------*/ rhVec = new double[totalNRows]; vVec = new double[totalNRows]; pVec = new double[totalNRows]; qVec = new double[totalNRows]; uVec = new double[totalNRows]; tVec = new double[totalNRows]; for (irow = 0; irow < localNRows; irow++) rhVec[irow] = rVec[irow]; for (irow = 0; irow < totalNRows; irow++) pVec[irow] = qVec[irow] = 0.0; rho2 = rnorm * rnorm; beta = rho2; iter = 0; numTrials = 0; if ( krylovAbsRel_ == 0 ) eps1 = krylovTolerance_ * rnorm0; else eps1 = krylovTolerance_; if ( rnorm < eps1 ) converged = 1; /* ----------------------------------------------------------------- * loop until convergence is achieved * -----------------------------------------------------------------*/ while ( converged == 0 && numTrials < 1 ) { innerIteration = 0; while ( rnorm >= eps1 && iter < krylovMaxIterations_ ) { iter++; innerIteration++; rho1 = rho2; beta2 = beta * beta; for (irow = 0; irow < totalNRows; irow++) { tVec[irow] = beta * qVec[irow]; uVec[irow] = rVec[irow] + tVec[irow]; pVec[irow] = uVec[irow] + tVec[irow] + beta2 * pVec[irow]; } if ( diagonal != NULL ) { for (irow = 0; irow < localNRows; irow++) tVec[irow] = pVec[irow] * diagonal[irow]; } else for (irow = 0; irow < localNRows; irow++) tVec[irow] = pVec[irow]; matPtr_->matvec( tVec, vVec ); sigma = 0.0; for ( irow = 0; irow < localNRows; irow++ ) sigma += (rhVec[irow] * vVec[irow]); MPI_Allreduce(&sigma, dArray, 1, MPI_DOUBLE, MPI_SUM, mpiComm_); sigma = dArray[0]; alpha = rho1 / sigma; for (irow = 0; irow < totalNRows; irow++) { qVec[irow] = uVec[irow] - alpha * vVec[irow]; uVec[irow] += qVec[irow]; } if ( diagonal != NULL ) { for (irow = 0; irow < localNRows; irow++) { tVec[irow] = uVec[irow] * diagonal[irow]; solnVector_[irow] += alpha * uVec[irow] * diagonal[irow]; } } else { for (irow = 0; irow < localNRows; irow++) { tVec[irow] = uVec[irow]; solnVector_[irow] += alpha * uVec[irow]; } } matPtr_->matvec( tVec, vVec ); for (irow = 0; irow < totalNRows; irow++) rVec[irow] -= alpha * vVec[irow]; dtemp = dtemp2 = 0.0; for ( irow = 0; irow < localNRows; irow++ ) { dtemp += (rVec[irow] * rhVec[irow]); dtemp2 += (rVec[irow] * rVec[irow]); } dArray[0] = dtemp; dArray[1] = dtemp2; MPI_Allreduce(dArray, dArray2, 2, MPI_DOUBLE, MPI_SUM, mpiComm_); rho2 = dArray2[0]; beta = rho2 / rho1; rnorm = sqrt(dArray2[1]); if ( outputLevel_ >= 2 && iter % 1 == 0 && mypid_ == 0 ) printf("\tLLNL_FEI_Solver_CGS : iteration %d - rnorm = %e (%e)\n", iter, rnorm, eps1); } matPtr_->matvec( solnVector_, rVec ); for ( irow = 0; irow < localNRows; irow++ ) rVec[irow] = rhsVector_[irow] - rVec[irow]; rnorm = 0.0; for ( irow = 0; irow < localNRows; irow++ ) rnorm += rVec[irow] * rVec[irow]; MPI_Allreduce(&rnorm, dArray, 1, MPI_DOUBLE, MPI_SUM, mpiComm_); rnorm = sqrt( dArray[0] ); if ( outputLevel_ >= 2 && mypid_ == 0 ) printf("\tLLNL_FEI_Solver_CGS actual rnorm = %e \n",rnorm); if ( rnorm < eps1 || iter >= krylovMaxIterations_ ) break; numTrials++; } if ( rnorm < eps1 ) converged = 1; krylovIterations_ = iter; krylovResidualNorm_ = rnorm; /* ----------------------------------------------------------------- * clean up * -----------------------------------------------------------------*/ delete [] rVec; delete [] rhVec; delete [] pVec; delete [] qVec; delete [] uVec; delete [] tVec; return (1-converged); } /************************************************************************** solve linear system using Bicgstab -------------------------------------------------------------------------*/ int LLNL_FEI_Solver::solveUsingBicgstab() { int irow, iter, converged=0, localNRows, extNRows, totalNRows; int iM, jM, numTrials, innerIteration, blen=2; double *rVec, *rhVec, *xhVec, *tVec, **utVec, **rtVec, *ut2, *rt2; double rho, rho1, alpha, dtemp, dtemp2, rnorm, rnorm0, *ut1, *rt1; double beta, omega, gamma, eps1, dArray[2], dArray2[2], *diagonal; double *sigma, *gammap, *gammanp, *gammapp, **mat, **tau; /* ----------------------------------------------------------------- * compute matrix information and allocate Krylov vectors * -----------------------------------------------------------------*/ localNRows = matPtr_->getNumLocalRows(); extNRows = matPtr_->getNumExtRows(); diagonal = matPtr_->getMatrixDiagonal(); totalNRows = localNRows + extNRows; rVec = new double[totalNRows]; /* ----------------------------------------------------------------- * compute initial residual vector and norm * -----------------------------------------------------------------*/ matPtr_->matvec( solnVector_, rVec ); for ( irow = 0; irow < localNRows; irow++ ) rVec[irow] = rhsVector_[irow] - rVec[irow]; rnorm0 = rnorm = 0.0; for ( irow = 0; irow < localNRows; irow++ ) { rnorm0 += (rVec[irow] * rVec[irow]); rnorm += (rhsVector_[irow] * rhsVector_[irow]); } dArray[0] = rnorm0; dArray[1] = rnorm; MPI_Allreduce(dArray, dArray2, 2, MPI_DOUBLE, MPI_SUM, mpiComm_); rnorm0 = sqrt(dArray2[1]); rnorm = sqrt(dArray2[0]); if ( outputLevel_ >= 2 && mypid_ == 0 ) printf("\tLLNL_FEI_Solver_Bicgstab initial rnorm = %e (%e)\n", rnorm,rnorm0); if ( rnorm0 == 0.0 ) { delete [] rVec; return 0; } /* ----------------------------------------------------------------- * initialization * -----------------------------------------------------------------*/ if ( krylovAbsRel_ == 0 ) eps1 = krylovTolerance_ * rnorm0; else eps1 = krylovTolerance_; if ( rnorm < eps1 ) converged = 1; sigma = new double[blen+1]; gammap = new double[blen+1]; gammanp = new double[blen+1]; gammapp = new double[blen+1]; mat = new double*[blen+1]; tau = new double*[blen+1]; for ( iM = 1; iM <= blen; iM++ ) { mat[iM] = new double[blen+1]; tau[iM] = new double[blen+1]; } rhVec = new double[totalNRows]; xhVec = new double[totalNRows]; tVec = new double[totalNRows]; utVec = new double*[blen+2]; rtVec = new double*[blen+2]; for ( iM = 0; iM < blen+2; iM++ ) { utVec[iM] = new double[totalNRows]; rtVec[iM] = new double[totalNRows]; } iter = 0; numTrials = 0; /* ----------------------------------------------------------------- * loop until convergence is achieved * -----------------------------------------------------------------*/ while ( converged == 0 && numTrials < 1 ) { innerIteration = 0; for ( irow = 0; irow < localNRows; irow++ ) { rhVec[irow] = rtVec[0][irow] = rVec[irow]; xhVec[irow] = solnVector_[irow]; utVec[0][irow] = 0.0; } omega = rho = 1.0; alpha = 0.0; while ( rnorm >= eps1 && iter < krylovMaxIterations_ ) { iter += blen; innerIteration += blen; ut1 = utVec[0]; ut2 = utVec[1]; rt1 = rtVec[0]; rt2 = rtVec[1]; for ( irow = 0; irow < localNRows; irow++ ) { ut2[irow] = ut1[irow]; rt2[irow] = rt1[irow]; } rho = -omega * rho; for ( iM = 0; iM < blen; iM++ ) { dtemp = 0.0; for ( irow = 0; irow < localNRows; irow++ ) dtemp += (rhVec[irow] * rtVec[iM+1][irow]); MPI_Allreduce(&dtemp, &rho1, 1, MPI_DOUBLE, MPI_SUM, mpiComm_); beta = alpha * rho1 / rho; rho = rho1; dtemp = -beta; for ( jM = 0; jM <= iM; jM++ ) for ( irow = 0; irow < localNRows; irow++ ) utVec[jM+1][irow] = dtemp * utVec[jM+1][irow] + rtVec[jM+1][irow]; if (diagonal != NULL) { ut1 = utVec[iM+1]; for (irow = 0; irow < localNRows; irow++) tVec[irow] = ut1[irow] * diagonal[irow]; } else { ut1 = utVec[iM+1]; for (irow = 0; irow < localNRows; irow++) tVec[irow] = ut1[irow]; } matPtr_->matvec( tVec, utVec[iM+2] ); dtemp = 0.0; for ( irow = 0; irow < localNRows; irow++ ) dtemp += (rhVec[irow] * utVec[iM+2][irow]); MPI_Allreduce(&dtemp, &gamma, 1, MPI_DOUBLE, MPI_SUM, mpiComm_); alpha = rho / gamma; for ( jM = 0; jM <= iM; jM++ ) for ( irow = 0; irow < localNRows; irow++ ) rtVec[jM+1][irow] -= alpha * utVec[jM+2][irow]; if ( diagonal != NULL ) { for (irow = 0; irow < localNRows; irow++) tVec[irow] = rtVec[iM+1][irow] * diagonal[irow]; } else { rt1 = rtVec[iM+1]; for (irow = 0; irow < localNRows; irow++) tVec[irow] = rt1[irow]; } matPtr_->matvec( tVec, rtVec[iM+2] ); for (irow = 0; irow < localNRows; irow++) xhVec[irow] += alpha * utVec[1][irow]; } for ( iM = 1; iM <= blen; iM++ ) for ( jM = 1; jM <= blen; jM++ ) mat[iM][jM] = 0.0; for ( iM = 1; iM <= blen; iM++ ) { for ( jM = 1; jM <= iM-1; jM++ ) { dtemp = 0.0; for ( irow = 0; irow < localNRows; irow++ ) dtemp += (rtVec[jM+1][irow] * rtVec[iM+1][irow]); MPI_Allreduce(&dtemp, &dtemp2, 1, MPI_DOUBLE, MPI_SUM, mpiComm_); tau[jM][iM] = dtemp2 / sigma[jM]; mat[jM][iM] = tau[jM][iM] * sigma[jM]; dtemp = -tau[jM][iM]; for (irow = 0; irow < localNRows; irow++) rtVec[iM+1][irow] += dtemp * rtVec[jM+1][irow]; } dtemp = 0.0; for ( irow = 0; irow < localNRows; irow++ ) dtemp += (rtVec[iM+1][irow] * rtVec[iM+1][irow]); dArray[0] = dtemp; dtemp = 0.0; for ( irow = 0; irow < localNRows; irow++ ) dtemp += (rtVec[1][irow] * rtVec[iM+1][irow]); dArray[1] = dtemp; MPI_Allreduce(dArray, dArray2, 2, MPI_DOUBLE, MPI_SUM, mpiComm_); sigma[iM] = dArray2[0]; mat[iM][iM] = sigma[iM]; gammap[iM] = dArray2[1] / sigma[iM]; } gammanp[blen] = gammap[blen]; omega = gammanp[blen]; for ( iM = blen-1; iM >= 1; iM-- ) { gammanp[iM] = gammap[iM]; for (jM=iM+1; jM<=blen; jM++) gammanp[iM] = gammanp[iM] - tau[iM][jM] * gammanp[jM]; } for (iM=1; iM<=blen-1; iM++) { gammapp[iM] = gammanp[iM+1]; for (jM=iM+1; jM<=blen-1; jM++) gammapp[iM] = gammapp[iM] + tau[iM][jM] * gammanp[jM+1]; } dtemp = gammanp[1]; for (irow = 0; irow < localNRows; irow++) xhVec[irow] += dtemp * rtVec[1][irow]; dtemp = - gammap[blen]; for (irow = 0; irow < localNRows; irow++) rtVec[1][irow] += dtemp * rtVec[blen+1][irow]; dtemp = - gammanp[blen]; for (irow = 0; irow < localNRows; irow++) utVec[1][irow] += dtemp * utVec[blen+1][irow]; for (iM=1; iM<=blen-1; iM++) { dtemp = - gammanp[iM]; for (irow = 0; irow < localNRows; irow++) utVec[1][irow] += dtemp * utVec[iM+1][irow]; dtemp = gammapp[iM]; for (irow = 0; irow < localNRows; irow++) xhVec[irow] += dtemp * rtVec[iM+1][irow]; dtemp = - gammap[iM]; for (irow = 0; irow < localNRows; irow++) rtVec[1][irow] += dtemp * rtVec[iM+1][irow]; } ut1 = utVec[0]; ut2 = utVec[1]; rt1 = rtVec[0]; rt2 = rtVec[1]; for ( irow = 0; irow < localNRows; irow++ ) { ut1[irow] = ut2[irow]; rt1[irow] = rt2[irow]; solnVector_[irow] = xhVec[irow]; } dtemp = 0.0; for ( irow = 0; irow < localNRows; irow++ ) dtemp += (rtVec[1][irow] * rtVec[1][irow]); MPI_Allreduce(&dtemp, &rnorm, 1, MPI_DOUBLE, MPI_SUM, mpiComm_); rnorm = sqrt( rnorm ); if ( outputLevel_ >= 2 && iter % 1 == 0 && mypid_ == 0 ) printf("\tLLNL_FEI_Solver_Bicgstab : iteration %d - rnorm = %e (%e)\n", iter, rnorm, eps1); } if ( diagonal != NULL ) { for (irow = 0; irow < localNRows; irow++) solnVector_[irow] *= diagonal[irow]; } matPtr_->matvec( solnVector_, rVec ); for ( irow = 0; irow < localNRows; irow++ ) rVec[irow] = rhsVector_[irow] - rVec[irow]; rnorm = 0.0; for ( irow = 0; irow < localNRows; irow++ ) rnorm += rVec[irow] * rVec[irow]; MPI_Allreduce(&rnorm, dArray, 1, MPI_DOUBLE, MPI_SUM, mpiComm_); rnorm = sqrt( dArray[0] ); if ( outputLevel_ >= 2 && mypid_ == 0 ) printf("\tLLNL_FEI_Solver_Bicgstab actual rnorm = %e \n",rnorm); if ( rnorm < eps1 || iter >= krylovMaxIterations_ ) break; numTrials++; } if ( rnorm < eps1 ) converged = 1; krylovIterations_ = iter; krylovResidualNorm_ = rnorm; /* ----------------------------------------------------------------- * clean up * -----------------------------------------------------------------*/ delete [] sigma; delete [] gammap; delete [] gammanp; delete [] gammapp; for ( iM = 1; iM <= blen; iM++ ) { delete [] mat[iM]; delete [] tau[iM]; } delete [] mat; delete [] tau; delete [] rVec; delete [] rhVec; delete [] xhVec; delete [] tVec; for ( iM = 0; iM < blen+2; iM++ ) { delete [] utVec[iM]; delete [] rtVec[iM]; } delete [] utVec; delete [] rtVec; return (1-converged); } /************************************************************************** solve linear system using SuperLU -------------------------------------------------------------------------*/ int LLNL_FEI_Solver::solveUsingSuperLU() { #ifdef HAVE_SUPERLU int localNRows, localNnz, *countArray, irow, jcol, *cscIA, *cscJA; int colNum, index, *etree, permcSpec, lwork, panelSize, relax, info; int *permC, *permR, *diagIA, *diagJA; double *cscAA, diagPivotThresh, *rVec, rnorm; double *diagAA; trans_t trans; superlu_options_t slu_options; SuperLUStat_t slu_stat; GlobalLU_t Glu; SuperMatrix superLU_Amat; SuperMatrix superLU_Lmat; SuperMatrix superLU_Umat; SuperMatrix AC; SuperMatrix B; /* --------------------------------------------------------------- * conversion from CSR to CSC * -------------------------------------------------------------*/ matPtr_->getLocalMatrix(&localNRows,&diagIA,&diagJA,&diagAA); countArray = new int[localNRows]; for ( irow = 0; irow < localNRows; irow++ ) countArray[irow] = 0; for ( irow = 0; irow < localNRows; irow++ ) for ( jcol = diagIA[irow]; jcol < diagIA[irow+1]; jcol++ ) countArray[diagJA[jcol]]++; localNnz = diagIA[localNRows]; cscJA = hypre_TAlloc(int, (localNRows+1) , HYPRE_MEMORY_HOST); cscIA = hypre_TAlloc(int, localNnz , HYPRE_MEMORY_HOST); cscAA = hypre_TAlloc(double, localNnz , HYPRE_MEMORY_HOST); cscJA[0] = 0; localNnz = 0; for ( jcol = 1; jcol <= localNRows; jcol++ ) { localNnz += countArray[jcol-1]; cscJA[jcol] = localNnz; } for ( irow = 0; irow < localNRows; irow++ ) { for ( jcol = diagIA[irow]; jcol < diagIA[irow+1]; jcol++ ) { colNum = diagJA[jcol]; index = cscJA[colNum]++; cscIA[index] = irow; cscAA[index] = diagAA[jcol]; } } cscJA[0] = 0; localNnz = 0; for ( jcol = 1; jcol <= localNRows; jcol++ ) { localNnz += countArray[jcol-1]; cscJA[jcol] = localNnz; } delete [] countArray; /* --------------------------------------------------------------- * make SuperMatrix * -------------------------------------------------------------*/ dCreate_CompCol_Matrix(&superLU_Amat, localNRows, localNRows, cscJA[localNRows], cscAA, cscIA, cscJA, SLU_NC, SLU_D, SLU_GE); etree = new int[localNRows]; permC = new int[localNRows]; permR = new int[localNRows]; permcSpec = 0; get_perm_c(permcSpec, &superLU_Amat, permC); slu_options.Fact = DOFACT; slu_options.SymmetricMode = NO; sp_preorder(&slu_options, &superLU_Amat, permC, etree, &AC); diagPivotThresh = 1.0; panelSize = sp_ienv(1); relax = sp_ienv(2); StatInit(&slu_stat); lwork = 0; slu_options.ColPerm = MY_PERMC; slu_options.DiagPivotThresh = diagPivotThresh; // dgstrf(&slu_options, &AC, dropTol, relax, panelSize, // etree, NULL, lwork, permC, permR, &superLU_Lmat, // &superLU_Umat, &slu_stat, &info); dgstrf(&slu_options, &AC, relax, panelSize, etree, NULL, lwork, permC, permR, &superLU_Lmat, &superLU_Umat, &Glu, &slu_stat, &info); Destroy_CompCol_Permuted(&AC); Destroy_CompCol_Matrix(&superLU_Amat); delete [] etree; /* ------------------------------------------------------------- * create a SuperLU dense matrix from right hand side * -----------------------------------------------------------*/ for ( irow = 0; irow < localNRows; irow++ ) solnVector_[irow] = rhsVector_[irow]; dCreate_Dense_Matrix(&B, localNRows, 1, solnVector_, localNRows, SLU_DN, SLU_D, SLU_GE); /* ------------------------------------------------------------- * solve the problem * -----------------------------------------------------------*/ trans = NOTRANS; dgstrs (trans, &superLU_Lmat, &superLU_Umat, permC, permR, &B, &slu_stat, &info); rVec = new double[localNRows]; matPtr_->matvec( solnVector_, rVec ); for ( irow = 0; irow < localNRows; irow++ ) rVec[irow] = rhsVector_[irow] - rVec[irow]; rnorm = 0.0; for ( irow = 0; irow < localNRows; irow++ ) rnorm += rVec[irow] * rVec[irow]; rnorm = sqrt( rnorm ); if ( outputLevel_ >= 2 && mypid_ == 0 ) printf("\tLLNL_FEI_Solver_SuperLU rnorm = %e \n",rnorm); krylovIterations_ = 1; krylovResidualNorm_ = rnorm; /* ------------------------------------------------------------- * clean up * -----------------------------------------------------------*/ Destroy_SuperMatrix_Store(&B); delete [] rVec; if ( permR != NULL ) { Destroy_SuperNode_Matrix(&superLU_Lmat); Destroy_CompCol_Matrix(&superLU_Umat); } delete [] permR; delete [] permC; StatFree(&slu_stat); return (info); #else return (1); #endif } hypre-2.33.0/src/FEI_mv/fei-hypre/LLNL_FEI_Solver.h000066400000000000000000000040461477326011500214530ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /*************************************************************************** Module: LLNL_FEI_Solver.h Purpose: custom implementation of the FEI/Solver ***************************************************************************/ #ifndef _LLNL_FEI_SOLVER_H_ #define _LLNL_FEI_SOLVER_H_ #include "LLNL_FEI_Matrix.h" /************************************************************************** definition of the class to capture the FEI/Solver information ---------------------------------------------------------------------------*/ class LLNL_FEI_Solver { MPI_Comm mpiComm_; int mypid_; int outputLevel_; LLNL_FEI_Matrix *matPtr_; int solverID_; int krylovMaxIterations_; double krylovTolerance_; int krylovAbsRel_; int krylovIterations_; double krylovResidualNorm_; int gmresDim_; double *solnVector_; double *rhsVector_; double TimerSolve_; double TimerSolveStart_; public : LLNL_FEI_Solver(MPI_Comm comm); ~LLNL_FEI_Solver() {} int parameters(int numParams, char **paramString); int solve(int *status); int iterations(int *iterTaken) {*iterTaken=krylovIterations_; return 0;} int getResidualNorm(double *rnorm) {*rnorm=krylovResidualNorm_; return 0;} int getSolveTime(double *stime) {*stime=TimerSolve_; return 0;} int loadMatrix(LLNL_FEI_Matrix *mat) {matPtr_ = mat; return 0;} int loadSolnVector(double *soln) {solnVector_ = soln ; return 0;} int loadRHSVector(double *rhs) {rhsVector_ = rhs; return 0;} private: int solveUsingCG(); int solveUsingGMRES(); int solveUsingCGS(); int solveUsingBicgstab(); int solveUsingSuperLU(); }; #endif /* endif for _LLNL_FEI_SOLVER_H_ */ hypre-2.33.0/src/FEI_mv/fei-hypre/Makefile000066400000000000000000000124671477326011500201720ustar00rootroot00000000000000# Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) include ../../config/Makefile.config BASE_DIR = ${HYPRE_FEI_BASE_DIR} #SUPERLU_INCLUDE = -I$(srcdir)/../SuperLU/SRC #SUPERLU_LIB = -L$(srcdir)/../SuperLU CINCLUDES=${INCLUDES} ${MPIINCLUDE} -I../ml/src/Include CXXINCLUDES=${INCLUDES} ${MPIINCLUDE} -I../ml/src/Include CDEFS = -DBOOL_NOT_SUPPORTED CXXDEFS = ${CDEFS} -DMPICH_SKIP_MPICXX C_COMPILE_FLAGS = \ ${CDEFS}\ -I../..\ -I$(BASE_DIR)\ -I$(srcdir)\ -I$(srcdir)/../..\ -I$(srcdir)/../../lapack\ -I$(srcdir)/../../IJ_mv\ -I$(srcdir)/../../utilities\ -I$(srcdir)/../../multivector\ -I$(srcdir)/../../krylov\ -I$(srcdir)/../../parcsr_block_mv\ -I$(srcdir)/../../parcsr_mv\ -I$(srcdir)/../../parcsr_ls\ -I$(srcdir)/../../seq_mv\ -I$(srcdir)/../../seq_block_mv\ -I$(srcdir)/../../distributed_matrix\ -I$(srcdir)/../../distributed_ls\ -I$(srcdir)/../fei-base\ ${SUPERLU_INCLUDE}\ ${DSUPERLU_INCLUDE}\ ${CINCLUDES} CXX_COMPILE_FLAGS = \ ${CXXDEFS}\ -I../..\ -I$(BASE_DIR)\ -I$(srcdir)/../..\ -I$(srcdir)/../../lapack\ -I$(srcdir)/../../IJ_mv\ -I$(srcdir)/../../utilities\ -I$(srcdir)/../../multivector\ -I$(srcdir)/../../krylov\ -I$(srcdir)/../../parcsr_block_mv\ -I$(srcdir)/../../parcsr_mv\ -I$(srcdir)/../../seq_block_mv\ -I$(srcdir)/../../parcsr_ls\ -I$(srcdir)/../../seq_mv\ -I$(srcdir)/../../distributed_matrix\ -I$(srcdir)/../../distributed_ls\ -I$(srcdir)/../femli\ -I$(srcdir)/../fei-base\ ${SUPERLU_INCLUDE}\ ${DSUPERLU_INCLUDE}\ ${CXXINCLUDES} HEADERS =\ cfei-hypre.h\ cfei_hypre.h\ hypre_cfei.h\ HYPRE_LinSysCore.h\ HYPRE_FEI_includes.h \ $(BASE_DIR)/fei_Data.hpp \ $(BASE_DIR)/fei_Lookup.hpp \ $(BASE_DIR)/fei_LinearSystemCore.hpp \ $(BASE_DIR)/fei_defs.h\ LLNL_FEI_Impl.h\ LLNL_FEI_Fei.h\ LLNL_FEI_LSCore.h\ LLNL_FEI_Solver.h\ LLNL_FEI_Matrix.h\ FEI_HYPRE_Impl.h\ FEI_HYPRE_include.h\ HYPRE_Builder.h\ HYPRE_LSI_Dsuperlu.h\ HYPRE_LSI_UZAWA.h\ HYPRE_LSI_Uzawa_c.h\ HYPRE_LSI_blkprec.h\ HYPRE_LSI_block.h\ HYPRE_LSI_ddict.h\ HYPRE_LSI_ddilut.h\ HYPRE_LSI_mli.h\ HYPRE_LSI_poly.h\ HYPRE_LSI_schur.h\ HYPRE_LSI_schwarz.h\ HYPRE_MHMatrix.h\ HYPRE_MLMatrix.h\ HYPRE_MLMaxwell.h\ HYPRE_SlideReduction.h\ HYPRE_parcsr_TFQmr.h\ HYPRE_parcsr_bicgs.h\ HYPRE_parcsr_bicgstabl.h\ HYPRE_parcsr_fgmres.h\ HYPRE_parcsr_lsicg.h\ HYPRE_parcsr_symqmr.h\ fei_mv.h FILESC = \ HYPRE_LSI_Dsuperlu.c\ HYPRE_LSI_ddict.c\ HYPRE_LSI_ddilut.c\ HYPRE_LSI_ml.c\ HYPRE_LSI_mlmaxwell.c\ HYPRE_LSI_poly.c\ HYPRE_LSI_schwarz.c\ HYPRE_parcsr_TFQmr.c\ HYPRE_parcsr_bicgs.c\ HYPRE_parcsr_bicgstabl.c\ HYPRE_parcsr_fgmres.c\ HYPRE_parcsr_lsicg.c\ HYPRE_parcsr_symqmr.c\ HYPRE_parcsr_maxwell.c\ SymQMR.c\ TFQmr.c\ bicgs.c\ bicgstabl.c\ fgmres.c\ hypre_lsi_amge.c\ hypre_lsi_ddamg.c\ hypre_lsi_misc.c\ lsicg.c FILESCXX = \ FEI_HYPRE_Impl.cxx\ LLNL_FEI_Impl.cxx\ LLNL_FEI_Fei.cxx\ LLNL_FEI_LSCore.cxx\ LLNL_FEI_Solver.cxx\ LLNL_FEI_Matrix.cxx\ HYPRE_LSC_aux.cxx\ HYPRE_LSI_UZAWA.cxx\ HYPRE_LSI_blkprec.cxx\ HYPRE_LSI_mli.cxx\ HYPRE_LinSysCore.cxx\ HYPRE_SlideReduction.cxx\ cfei_hypre.cxx\ hypre_cfei.cxx\ hypre_schur_reduce.cxx\ hypre_slide_reduce.cxx\ HYPRE_fei_mesh.cxx\ HYPRE_fei_matrix.cxx\ HYPRE_fei_vector.cxx OBJSC = ${FILESC:.c=.o} OBJSCXX = ${FILESCXX:.cxx=.o} OBJS = ${OBJSC} ${OBJSCXX} SONAME = libHYPRE_FEI-${HYPRE_RELEASE_VERSION}${HYPRE_LIB_SUFFIX} ################################################################## # Targets ################################################################## all: libHYPRE_FEI${HYPRE_LIB_SUFFIX} cp -fR $(srcdir)/cfei-hypre.h $(HYPRE_BUILD_DIR)/include cp -fR $(srcdir)/cfei_hypre.h $(HYPRE_BUILD_DIR)/include cp -fR $(srcdir)/hypre_cfei.h $(HYPRE_BUILD_DIR)/include cp -fR $(srcdir)/HYPRE_LinSysCore.h $(HYPRE_BUILD_DIR)/include cp -fR $(srcdir)/HYPRE_FEI*.h $(HYPRE_BUILD_DIR)/include cp -fR $(srcdir)/LLNL_FEI*.h $(HYPRE_BUILD_DIR)/include cp -fR $(BASE_DIR)/fei_Data.hpp $(HYPRE_BUILD_DIR)/include cp -fR $(BASE_DIR)/fei_Lookup.hpp $(HYPRE_BUILD_DIR)/include cp -fR $(BASE_DIR)/fei_LinearSystemCore.hpp $(HYPRE_BUILD_DIR)/include cp -fR $(BASE_DIR)/fei_defs.h $(HYPRE_BUILD_DIR)/include install: libHYPRE_FEI${HYPRE_LIB_SUFFIX} cp -fR $(srcdir)/cfei-hypre.h $(HYPRE_INC_INSTALL) cp -fR $(srcdir)/cfei_hypre.h $(HYPRE_INC_INSTALL) cp -fR $(srcdir)/hypre_cfei.h $(HYPRE_BUILD_DIR)/include cp -fR $(srcdir)/HYPRE_LinSysCore.h $(HYPRE_INC_INSTALL) cp -fR $(srcdir)/HYPRE_FEI*.h $(HYPRE_INC_INSTALL) cp -fR $(srcdir)/LLNL_FEI*.h $(HYPRE_INC_INSTALL) cp -fR $(BASE_DIR)/fei_Data.hpp $(HYPRE_BUILD_DIR)/include cp -fR $(BASE_DIR)/fei_Lookup.hpp $(HYPRE_BUILD_DIR)/include cp -fR $(BASE_DIR)/fei_LinearSystemCore.hpp $(HYPRE_BUILD_DIR)/include cp -fR $(BASE_DIR)/fei_defs.h $(HYPRE_BUILD_DIR)/include @echo "" clean: rm -rf *.o libHYPRE* rm -rf pchdir tca.map *inslog* distclean: clean ################################################################## # Rules ################################################################## libHYPRE_FEI.a: ${OBJS} @echo "Building $@ ... " ${AR} $@ ${OBJS} ${RANLIB} $@ libHYPRE_FEI.so libHYPRE_FEI.dylib: ${OBJS} @echo "Building $@ ... " ${BUILD_CC_SHARED} -o ${SONAME} ${OBJS} ${SHARED_SET_SONAME}${SONAME} ln -s -f ${SONAME} $@ ${OBJS}: ${HEADERS} hypre-2.33.0/src/FEI_mv/fei-hypre/SymQMR.c000066400000000000000000000314201477326011500200140ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * Symmetric QMR * *****************************************************************************/ #include "utilities/_hypre_utilities.h" #include "HYPRE.h" #include "IJ_mv/HYPRE_IJ_mv.h" #include "parcsr_mv/HYPRE_parcsr_mv.h" #include "parcsr_mv/_hypre_parcsr_mv.h" #include "parcsr_ls/_hypre_parcsr_ls.h" #include "parcsr_ls/HYPRE_parcsr_ls.h" /*-------------------------------------------------------------------------- * hypre_SymQMRData *--------------------------------------------------------------------------*/ typedef struct { int max_iter; int stop_crit; double tol; double rel_residual_norm; void *A; void *r; void *q; void *u; void *d; void *t; void *rq; void *matvec_data; int (*precond)(void*,void*,void*,void*); int (*precond_setup)(void*,void*,void*,void*); void *precond_data; /* log info (always logged) */ int num_iterations; /* additional log info (logged when `logging' > 0) */ int logging; double *norms; char *log_file_name; } hypre_SymQMRData; /*-------------------------------------------------------------------------- * hypre_SymQMRCreate *--------------------------------------------------------------------------*/ void * hypre_SymQMRCreate( ) { hypre_SymQMRData *symqmr_data; symqmr_data = hypre_CTAlloc(hypre_SymQMRData, 1, HYPRE_MEMORY_HOST); /* set defaults */ (symqmr_data -> tol) = 1.0e-06; (symqmr_data -> max_iter) = 1000; (symqmr_data -> stop_crit) = 0; /* rel. residual norm */ (symqmr_data -> precond) = hypre_ParKrylovIdentity; (symqmr_data -> precond_setup) = hypre_ParKrylovIdentitySetup; (symqmr_data -> precond_data) = NULL; (symqmr_data -> logging) = 0; (symqmr_data -> r) = NULL; (symqmr_data -> q) = NULL; (symqmr_data -> u) = NULL; (symqmr_data -> d) = NULL; (symqmr_data -> t) = NULL; (symqmr_data -> rq) = NULL; (symqmr_data -> matvec_data) = NULL; (symqmr_data -> norms) = NULL; (symqmr_data -> log_file_name) = NULL; return (void *) symqmr_data; } /*-------------------------------------------------------------------------- * hypre_SymQMRDestroy *--------------------------------------------------------------------------*/ int hypre_SymQMRDestroy( void *symqmr_vdata ) { hypre_SymQMRData *symqmr_data = (hypre_SymQMRData*) symqmr_vdata; int ierr = 0; if (symqmr_data) { if ((symqmr_data -> logging) > 0) { hypre_TFree(symqmr_data -> norms, HYPRE_MEMORY_HOST); } hypre_ParKrylovMatvecDestroy(symqmr_data -> matvec_data); hypre_ParKrylovDestroyVector(symqmr_data -> r); hypre_ParKrylovDestroyVector(symqmr_data -> q); hypre_ParKrylovDestroyVector(symqmr_data -> u); hypre_ParKrylovDestroyVector(symqmr_data -> d); hypre_ParKrylovDestroyVector(symqmr_data -> t); hypre_ParKrylovDestroyVector(symqmr_data -> rq); hypre_TFree(symqmr_data, HYPRE_MEMORY_HOST); } return(ierr); } /*-------------------------------------------------------------------------- * hypre_SymQMRSetup *--------------------------------------------------------------------------*/ int hypre_SymQMRSetup( void *symqmr_vdata, void *A, void *b, void *x ) { hypre_SymQMRData *symqmr_data = (hypre_SymQMRData*) symqmr_vdata; int max_iter = (symqmr_data -> max_iter); int (*precond_setup)(void*, void*, void*, void*) = (symqmr_data -> precond_setup); void *precond_data = (symqmr_data -> precond_data); int ierr = 0; (symqmr_data -> A) = A; /*-------------------------------------------------- * The arguments for NewVector are important to * maintain consistency between the setup and * compute phases of matvec and the preconditioner. *--------------------------------------------------*/ if ((symqmr_data -> r) == NULL) (symqmr_data -> r) = hypre_ParKrylovCreateVector(b); if ((symqmr_data -> q) == NULL) (symqmr_data -> q) = hypre_ParKrylovCreateVector(b); if ((symqmr_data -> u) == NULL) (symqmr_data -> u) = hypre_ParKrylovCreateVector(b); if ((symqmr_data -> d) == NULL) (symqmr_data -> d) = hypre_ParKrylovCreateVector(b); if ((symqmr_data -> t) == NULL) (symqmr_data -> t) = hypre_ParKrylovCreateVector(b); if ((symqmr_data -> rq) == NULL) (symqmr_data -> rq) = hypre_ParKrylovCreateVector(b); if ((symqmr_data -> matvec_data) == NULL) (symqmr_data -> matvec_data) = hypre_ParKrylovMatvecCreate(A, x); ierr = precond_setup(precond_data, A, b, x); /*----------------------------------------------------- * Allocate space for log info *-----------------------------------------------------*/ if ((symqmr_data -> logging) > 0) { if ((symqmr_data -> norms) == NULL) (symqmr_data -> norms) = hypre_CTAlloc(double, max_iter + 1, HYPRE_MEMORY_HOST); if ((symqmr_data -> log_file_name) == NULL) (symqmr_data -> log_file_name) = (char*)"symqmr.out.log"; } return ierr; } /*-------------------------------------------------------------------------- * hypre_SymQMRSolve *-------------------------------------------------------------------------*/ int hypre_SymQMRSolve(void *symqmr_vdata, void *A, void *b, void *x) { hypre_SymQMRData *symqmr_data = (hypre_SymQMRData*) symqmr_vdata; int max_iter = (symqmr_data -> max_iter); int stop_crit = (symqmr_data -> stop_crit); double accuracy = (symqmr_data -> tol); void *matvec_data = (symqmr_data -> matvec_data); void *r = (symqmr_data -> r); void *q = (symqmr_data -> q); void *u = (symqmr_data -> u); void *d = (symqmr_data -> d); void *t = (symqmr_data -> t); void *rq = (symqmr_data -> rq); int (*precond)(void*, void*, void*, void*) = (symqmr_data -> precond); int *precond_data = (int*)(symqmr_data -> precond_data); /* logging variables */ int logging = (symqmr_data -> logging); double *norms = (symqmr_data -> norms); int ierr=0, my_id, num_procs, iter; double theta, tau, rhom1, rho, dtmp, r_norm; double thetam1, c, epsilon; double sigma, alpha, beta; hypre_ParKrylovCommInfo(A,&my_id,&num_procs); if (logging > 0) { norms = (symqmr_data -> norms); } /* initialize work arrays */ hypre_ParKrylovCopyVector(b,r); /* compute initial residual */ hypre_ParKrylovMatvec(matvec_data,-1.0, A, x, 1.0, r); r_norm = sqrt(hypre_ParKrylovInnerProd(r,r)); if (logging > 0) { norms[0] = r_norm; if (my_id == 0) printf("SymQMR : Initial L2 norm of residual = %e\n", r_norm); } iter = 0; epsilon = accuracy * r_norm; /* convergence criterion |r_i| <= accuracy , absolute residual norm*/ if (stop_crit) epsilon = accuracy; while ( iter < max_iter && r_norm > epsilon ) { if ( my_id == 0 && iter > 0 && logging ) printf("SymQMR restart... \n"); tau = r_norm; precond(precond_data, A, r, q); rho = hypre_ParKrylovInnerProd(r,q); theta = 0.0; hypre_ParKrylovClearVector(d); hypre_ParKrylovCopyVector(r,rq); while ( iter < max_iter && r_norm > epsilon ) { iter++; hypre_ParKrylovMatvec(matvec_data,1.0,A,q,0.0,t); sigma = hypre_ParKrylovInnerProd(q,t); if ( sigma == 0.0 ) { printf("SymQMR ERROR : sigma = 0.0\n"); exit(1); } alpha = rho / sigma; dtmp = - alpha; hypre_ParKrylovAxpy(dtmp,t,r); thetam1 = theta; theta = sqrt(hypre_ParKrylovInnerProd(r,r)) / tau; c = 1.0 / sqrt(1.0 + theta * theta ); tau = tau * theta * c; dtmp = c * c * thetam1 * thetam1; hypre_ParKrylovScaleVector(dtmp,d); dtmp = c * c * alpha; hypre_ParKrylovAxpy(dtmp,q,d); dtmp = 1.0; hypre_ParKrylovAxpy(dtmp,d,x); precond(precond_data, A, r, u); rhom1 = rho; rho = hypre_ParKrylovInnerProd(r,u); beta = rho / rhom1; hypre_ParKrylovScaleVector(beta,q); dtmp = 1.0; hypre_ParKrylovAxpy(dtmp,u,q); dtmp = 1.0 - c * c; hypre_ParKrylovScaleVector(dtmp,rq); dtmp = c * c; hypre_ParKrylovAxpy(dtmp,r,rq); r_norm = sqrt(hypre_ParKrylovInnerProd(rq,rq)); norms[iter] = r_norm; if ( my_id == 0 && logging ) printf(" SymQMR : iteration %4d - residual norm = %e \n", iter, r_norm); } /* compute true residual */ hypre_ParKrylovCopyVector(b,r); hypre_ParKrylovMatvec(matvec_data,-1.0, A, x, 1.0, r); r_norm = sqrt(hypre_ParKrylovInnerProd(r,r)); } (symqmr_data -> num_iterations) = iter; (symqmr_data -> rel_residual_norm) = r_norm; if (iter >= max_iter && r_norm > epsilon) ierr = 1; return ierr; } /*-------------------------------------------------------------------------- * hypre_SymQMRSetTol *--------------------------------------------------------------------------*/ int hypre_SymQMRSetTol( void *symqmr_vdata, double tol ) { hypre_SymQMRData *symqmr_data = (hypre_SymQMRData*) symqmr_vdata; int ierr = 0; (symqmr_data -> tol) = tol; return ierr; } /*-------------------------------------------------------------------------- * hypre_SymQMRSetMaxIter *--------------------------------------------------------------------------*/ int hypre_SymQMRSetMaxIter( void *symqmr_vdata, int max_iter ) { hypre_SymQMRData *symqmr_data = (hypre_SymQMRData*) symqmr_vdata; int ierr = 0; (symqmr_data -> max_iter) = max_iter; return ierr; } /*-------------------------------------------------------------------------- * hypre_SymQMRSetStopCrit *--------------------------------------------------------------------------*/ int hypre_SymQMRSetStopCrit( void *symqmr_vdata, double stop_crit ) { hypre_SymQMRData *symqmr_data = (hypre_SymQMRData*) symqmr_vdata; int ierr = 0; (symqmr_data -> stop_crit) = stop_crit; return ierr; } /*-------------------------------------------------------------------------- * hypre_SymQMRSetPrecond *--------------------------------------------------------------------------*/ int hypre_SymQMRSetPrecond( void *symqmr_vdata, int (*precond)(void*,void*,void*,void*), int (*precond_setup)(void*,void*,void*,void*), void *precond_data ) { hypre_SymQMRData *symqmr_data = (hypre_SymQMRData*) symqmr_vdata; int ierr = 0; (symqmr_data -> precond) = precond; (symqmr_data -> precond_setup) = precond_setup; (symqmr_data -> precond_data) = precond_data; return ierr; } /*-------------------------------------------------------------------------- * hypre_SymQMRSetLogging *--------------------------------------------------------------------------*/ int hypre_SymQMRSetLogging( void *symqmr_vdata, int logging) { hypre_SymQMRData *symqmr_data = (hypre_SymQMRData*) symqmr_vdata; int ierr = 0; (symqmr_data -> logging) = logging; return ierr; } /*-------------------------------------------------------------------------- * hypre_SymQMRGetNumIterations *--------------------------------------------------------------------------*/ int hypre_SymQMRGetNumIterations(void *symqmr_vdata,int *num_iterations) { hypre_SymQMRData *symqmr_data = (hypre_SymQMRData*) symqmr_vdata; int ierr = 0; *num_iterations = (symqmr_data -> num_iterations); return ierr; } /*-------------------------------------------------------------------------- * hypre_SymQMRGetFinalRelativeResidualNorm *--------------------------------------------------------------------------*/ int hypre_SymQMRGetFinalRelativeResidualNorm( void *symqmr_vdata, double *relative_residual_norm ) { hypre_SymQMRData *symqmr_data = (hypre_SymQMRData*) symqmr_vdata; int ierr = 0; *relative_residual_norm = (symqmr_data -> rel_residual_norm); return ierr; } hypre-2.33.0/src/FEI_mv/fei-hypre/TFQmr.c000066400000000000000000000353401477326011500176620ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * TFQmr * *****************************************************************************/ #include "utilities/_hypre_utilities.h" #include "HYPRE.h" #include "IJ_mv/HYPRE_IJ_mv.h" #include "parcsr_mv/HYPRE_parcsr_mv.h" #include "parcsr_mv/_hypre_parcsr_mv.h" #include "parcsr_ls/_hypre_parcsr_ls.h" #include "parcsr_ls/HYPRE_parcsr_ls.h" #include "_hypre_FEI.h" /*-------------------------------------------------------------------------- * hypre_TFQmrData *--------------------------------------------------------------------------*/ typedef struct { int max_iter; int stop_crit; double tol; double rel_residual_norm; void *A; void *r; void *tr; void *yo; void *ye; void *t1; void *t2; void *w; void *v; void *d; void *t3; void *matvec_data; int (*precond)(void*, void*, void*, void*); int (*precond_setup)(void*, void*, void*, void*); void *precond_data; /* log info (always logged) */ int num_iterations; /* additional log info (logged when `logging' > 0) */ int logging; double *norms; char *log_file_name; } hypre_TFQmrData; /*-------------------------------------------------------------------------- * hypre_TFQmrCreate *--------------------------------------------------------------------------*/ void * hypre_TFQmrCreate( ) { hypre_TFQmrData *tfqmr_data; tfqmr_data = hypre_CTAlloc(hypre_TFQmrData, 1, HYPRE_MEMORY_HOST); /* set defaults */ (tfqmr_data -> tol) = 1.0e-06; (tfqmr_data -> max_iter) = 1000; (tfqmr_data -> stop_crit) = 0; /* rel. residual norm */ (tfqmr_data -> precond) = hypre_ParKrylovIdentity; (tfqmr_data -> precond_setup) = hypre_ParKrylovIdentitySetup; (tfqmr_data -> precond_data) = NULL; (tfqmr_data -> logging) = 0; (tfqmr_data -> r) = NULL; (tfqmr_data -> tr) = NULL; (tfqmr_data -> yo) = NULL; (tfqmr_data -> ye) = NULL; (tfqmr_data -> t1) = NULL; (tfqmr_data -> t2) = NULL; (tfqmr_data -> w) = NULL; (tfqmr_data -> v) = NULL; (tfqmr_data -> d) = NULL; (tfqmr_data -> t3) = NULL; (tfqmr_data -> matvec_data) = NULL; (tfqmr_data -> norms) = NULL; (tfqmr_data -> log_file_name) = NULL; return (void *) tfqmr_data; } /*-------------------------------------------------------------------------- * hypre_TFQmrDestroy *--------------------------------------------------------------------------*/ int hypre_TFQmrDestroy( void *tfqmr_vdata ) { hypre_TFQmrData *tfqmr_data = (hypre_TFQmrData *) tfqmr_vdata; int ierr = 0; if (tfqmr_data) { if ((tfqmr_data -> logging) > 0) { hypre_TFree(tfqmr_data -> norms, HYPRE_MEMORY_HOST); } hypre_ParKrylovMatvecDestroy(tfqmr_data -> matvec_data); hypre_ParKrylovDestroyVector(tfqmr_data -> r); hypre_ParKrylovDestroyVector(tfqmr_data -> tr); hypre_ParKrylovDestroyVector(tfqmr_data -> yo); hypre_ParKrylovDestroyVector(tfqmr_data -> ye); hypre_ParKrylovDestroyVector(tfqmr_data -> t1); hypre_ParKrylovDestroyVector(tfqmr_data -> t2); hypre_ParKrylovDestroyVector(tfqmr_data -> w); hypre_ParKrylovDestroyVector(tfqmr_data -> v); hypre_ParKrylovDestroyVector(tfqmr_data -> d); hypre_ParKrylovDestroyVector(tfqmr_data -> t3); hypre_TFree(tfqmr_data, HYPRE_MEMORY_HOST); } return(ierr); } /*-------------------------------------------------------------------------- * hypre_TFQmrSetup *--------------------------------------------------------------------------*/ int hypre_TFQmrSetup( void *tfqmr_vdata, void *A, void *b, void *x ) { hypre_TFQmrData *tfqmr_data = (hypre_TFQmrData *) tfqmr_vdata; int max_iter = (tfqmr_data -> max_iter); int (*precond_setup)(void*, void*, void*, void*) = (tfqmr_data -> precond_setup); void *precond_data = (tfqmr_data -> precond_data); int ierr = 0; (tfqmr_data -> A) = A; /*-------------------------------------------------- * The arguments for NewVector are important to * maintain consistency between the setup and * compute phases of matvec and the preconditioner. *--------------------------------------------------*/ if ((tfqmr_data -> r) == NULL) (tfqmr_data -> r) = hypre_ParKrylovCreateVector(b); if ((tfqmr_data -> tr) == NULL) (tfqmr_data -> tr) = hypre_ParKrylovCreateVector(b); if ((tfqmr_data -> yo) == NULL) (tfqmr_data -> yo) = hypre_ParKrylovCreateVector(b); if ((tfqmr_data -> ye) == NULL) (tfqmr_data -> ye) = hypre_ParKrylovCreateVector(b); if ((tfqmr_data -> t1) == NULL) (tfqmr_data -> t1) = hypre_ParKrylovCreateVector(b); if ((tfqmr_data -> t2) == NULL) (tfqmr_data -> t2) = hypre_ParKrylovCreateVector(b); if ((tfqmr_data -> w) == NULL) (tfqmr_data -> w) = hypre_ParKrylovCreateVector(b); if ((tfqmr_data -> v) == NULL) (tfqmr_data -> v) = hypre_ParKrylovCreateVector(b); if ((tfqmr_data -> d) == NULL) (tfqmr_data -> d) = hypre_ParKrylovCreateVector(b); if ((tfqmr_data -> t3) == NULL) (tfqmr_data -> t3) = hypre_ParKrylovCreateVector(b); if ((tfqmr_data -> matvec_data) == NULL) (tfqmr_data -> matvec_data) = hypre_ParKrylovMatvecCreate(A, x); ierr = precond_setup(precond_data, A, b, x); /*----------------------------------------------------- * Allocate space for log info *-----------------------------------------------------*/ if ((tfqmr_data -> logging) > 0) { if ((tfqmr_data -> norms) == NULL) (tfqmr_data -> norms) = hypre_CTAlloc(double, max_iter + 1, HYPRE_MEMORY_HOST); if ((tfqmr_data -> log_file_name) == NULL) (tfqmr_data -> log_file_name) = (char*)"tfqmr.out.log"; } return ierr; } /*-------------------------------------------------------------------------- * hypre_TFQmrSolve *-------------------------------------------------------------------------*/ int hypre_TFQmrSolve(void *tfqmr_vdata, void *A, void *b, void *x) { hypre_TFQmrData *tfqmr_data = (hypre_TFQmrData *) tfqmr_vdata; int max_iter = (tfqmr_data -> max_iter); int stop_crit = (tfqmr_data -> stop_crit); double accuracy = (tfqmr_data -> tol); void *matvec_data = (tfqmr_data -> matvec_data); void *r = (tfqmr_data -> r); void *tr = (tfqmr_data -> tr); void *yo = (tfqmr_data -> yo); void *ye = (tfqmr_data -> ye); void *t1 = (tfqmr_data -> t1); void *t2 = (tfqmr_data -> t2); void *w = (tfqmr_data -> w); void *v = (tfqmr_data -> v); void *d = (tfqmr_data -> d); void *t3 = (tfqmr_data -> t3); int (*precond)(void*, void*, void*, void*) = (tfqmr_data -> precond); int *precond_data = (int*)(tfqmr_data -> precond_data); /* logging variables */ int logging = (tfqmr_data -> logging); double *norms = (tfqmr_data -> norms); int ierr=0, my_id, num_procs, iter; double eta, theta, tau, rhom1, rho, dtmp, r_norm, b_norm; double rnbnd, etam1, thetam1, c, epsilon; double sigma, alpha, beta; hypre_ParKrylovCommInfo(A,&my_id,&num_procs); if (logging > 0) { norms = (tfqmr_data -> norms); } /* initialize work arrays */ hypre_ParKrylovCopyVector(b,r); /* compute initial residual */ hypre_ParKrylovMatvec(matvec_data,-1.0, A, x, 1.0, r); r_norm = sqrt(hypre_ParKrylovInnerProd(r,r)); b_norm = sqrt(hypre_ParKrylovInnerProd(b,b)); if (logging > 0) { norms[0] = r_norm; if (my_id == 0) { printf("TFQmr : L2 norm of b = %e\n", b_norm); if (b_norm == 0.0) printf("Rel_resid_norm actually contains the residual norm\n"); printf("TFQmr : Initial L2 norm of residual = %e\n", r_norm); } } iter = 0; if (b_norm > 0.0) { /* convergence criterion |r_i| <= accuracy*|b| if |b| > 0 */ epsilon = accuracy * b_norm; } else { /* convergence criterion |r_i| <= accuracy*|r0| if |b| = 0 */ epsilon = accuracy * r_norm; }; /* convergence criterion |r_i| <= accuracy , absolute residual norm*/ if (stop_crit) epsilon = accuracy; hypre_ParKrylovCopyVector(r,tr); hypre_ParKrylovCopyVector(r,yo); hypre_ParKrylovCopyVector(r,w); hypre_ParKrylovClearVector(d); hypre_ParKrylovClearVector(v); precond(precond_data, A, yo, t3); hypre_ParKrylovMatvec(matvec_data,1.0,A,t3,0.0,v); hypre_ParKrylovCopyVector(v,t1); tau = r_norm; theta = 0.0; eta = 0.0; rho = r_norm * r_norm; while ( iter < max_iter && r_norm > epsilon ) { iter++; sigma = hypre_ParKrylovInnerProd(tr,v); alpha = rho / sigma; hypre_ParKrylovCopyVector(yo,ye); dtmp = - alpha; hypre_ParKrylovAxpy(dtmp,v,ye); hypre_ParKrylovAxpy(dtmp,t1,w); thetam1 = theta; theta = sqrt(hypre_ParKrylovInnerProd(w,w)) / tau; c = 1.0 / sqrt(1.0 + theta * theta ); tau = tau * theta * c; etam1 = eta; eta = c * c * alpha; dtmp = thetam1 * thetam1 * etam1 / alpha; hypre_ParKrylovCopyVector(d,t3); hypre_ParKrylovCopyVector(yo,d); hypre_ParKrylovAxpy(dtmp,t3,d); hypre_ParKrylovAxpy(eta,d,x); dtmp = 2.0 * iter; rnbnd = tau * sqrt( dtmp ); precond(precond_data, A, ye, t3); hypre_ParKrylovMatvec(matvec_data,1.0,A,t3,0.0,t2); dtmp = - alpha; hypre_ParKrylovAxpy(dtmp,t2,w); thetam1 = theta; theta = sqrt(hypre_ParKrylovInnerProd(w,w)) / tau; c = 1.0 / sqrt(1.0 + theta * theta ); tau = tau * theta * c; etam1 = eta; eta = c * c * alpha; dtmp = thetam1 * thetam1 * etam1 / alpha; hypre_ParKrylovCopyVector(d,t3); hypre_ParKrylovCopyVector(ye,d); hypre_ParKrylovAxpy(dtmp,t3,d); hypre_ParKrylovAxpy(eta,d,x); dtmp = 2.0 * iter + 1.0; rnbnd = tau * sqrt( dtmp ); /* r_norm = theta * tau; */ r_norm = rnbnd; if ( my_id == 0 && logging ) printf(" TFQmr : iter %4d - res. norm = %e \n", iter, r_norm); rhom1 = rho; rho = hypre_ParKrylovInnerProd(tr,w); beta = rho / rhom1; hypre_ParKrylovCopyVector(w,yo); hypre_ParKrylovAxpy(beta,ye,yo); precond(precond_data, A, yo, t3); hypre_ParKrylovMatvec(matvec_data,1.0,A,t3,0.0,t1); hypre_ParKrylovCopyVector(t2,t3); hypre_ParKrylovAxpy(beta,v,t3); hypre_ParKrylovCopyVector(t1,v); hypre_ParKrylovAxpy(beta,t3,v); } precond(precond_data, A, x, t3); hypre_ParKrylovCopyVector(t3,x); (tfqmr_data -> num_iterations) = iter; if (b_norm > 0.0) (tfqmr_data -> rel_residual_norm) = r_norm/b_norm; if (b_norm == 0.0) (tfqmr_data -> rel_residual_norm) = r_norm; if (iter >= max_iter && r_norm > epsilon) ierr = 1; return ierr; } /*-------------------------------------------------------------------------- * hypre_TFQmrSetTol *--------------------------------------------------------------------------*/ int hypre_TFQmrSetTol( void *tfqmr_vdata, double tol ) { hypre_TFQmrData *tfqmr_data = (hypre_TFQmrData *) tfqmr_vdata; int ierr = 0; (tfqmr_data -> tol) = tol; return ierr; } /*-------------------------------------------------------------------------- * hypre_TFQmrSetMaxIter *--------------------------------------------------------------------------*/ int hypre_TFQmrSetMaxIter( void *tfqmr_vdata, int max_iter ) { hypre_TFQmrData *tfqmr_data = (hypre_TFQmrData *) tfqmr_vdata; int ierr = 0; (tfqmr_data -> max_iter) = max_iter; return ierr; } /*-------------------------------------------------------------------------- * hypre_TFQmrSetStopCrit *--------------------------------------------------------------------------*/ int hypre_TFQmrSetStopCrit( void *tfqmr_vdata, double stop_crit ) { hypre_TFQmrData *tfqmr_data = (hypre_TFQmrData *) tfqmr_vdata; int ierr = 0; (tfqmr_data -> stop_crit) = stop_crit; return ierr; } /*-------------------------------------------------------------------------- * hypre_TFQmrSetPrecond *--------------------------------------------------------------------------*/ int hypre_TFQmrSetPrecond( void *tfqmr_vdata, int (*precond)(void*,void*,void*,void*), int (*precond_setup)(void*,void*,void*,void*), void *precond_data ) { hypre_TFQmrData *tfqmr_data = (hypre_TFQmrData *) tfqmr_vdata; int ierr = 0; (tfqmr_data -> precond) = precond; (tfqmr_data -> precond_setup) = precond_setup; (tfqmr_data -> precond_data) = precond_data; return ierr; } /*-------------------------------------------------------------------------- * hypre_TFQmrSetLogging *--------------------------------------------------------------------------*/ int hypre_TFQmrSetLogging( void *tfqmr_vdata, int logging) { hypre_TFQmrData *tfqmr_data = (hypre_TFQmrData *) tfqmr_vdata; int ierr = 0; (tfqmr_data -> logging) = logging; return ierr; } /*-------------------------------------------------------------------------- * hypre_TFQmrGetNumIterations *--------------------------------------------------------------------------*/ int hypre_TFQmrGetNumIterations(void *tfqmr_vdata,int *num_iterations) { hypre_TFQmrData *tfqmr_data = (hypre_TFQmrData *) tfqmr_vdata; int ierr = 0; *num_iterations = (tfqmr_data -> num_iterations); return ierr; } /*-------------------------------------------------------------------------- * hypre_TFQmrGetFinalRelativeResidualNorm *--------------------------------------------------------------------------*/ int hypre_TFQmrGetFinalRelativeResidualNorm( void *tfqmr_vdata, double *relative_residual_norm ) { hypre_TFQmrData *tfqmr_data = (hypre_TFQmrData *) tfqmr_vdata; int ierr = 0; *relative_residual_norm = (tfqmr_data -> rel_residual_norm); return ierr; } hypre-2.33.0/src/FEI_mv/fei-hypre/_hypre_FEI.h000066400000000000000000000104321477326011500206420ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #ifndef hypre_FEI__ #define hypre_FEI__ #include "HYPRE.h" #include "IJ_mv/HYPRE_IJ_mv.h" #include "parcsr_mv/HYPRE_parcsr_mv.h" #include "parcsr_mv/_hypre_parcsr_mv.h" #include "parcsr_ls/_hypre_parcsr_ls.h" #include "parcsr_ls/HYPRE_parcsr_ls.h" #ifdef __cplusplus extern "C" { #endif /* bicgs.c */ void * hypre_BiCGSCreate( ); int hypre_BiCGSDestroy( void *bicgs_vdata ); int hypre_BiCGSSetup( void *bicgs_vdata, void *A, void *b, void *x ); int hypre_BiCGSSolve(void *bicgs_vdata, void *A, void *b, void *x); int hypre_BiCGSSetTol( void *bicgs_vdata, double tol ); int hypre_BiCGSSetMaxIter( void *bicgs_vdata, int max_iter ); int hypre_BiCGSSetStopCrit( void *bicgs_vdata, double stop_crit ); int hypre_BiCGSSetPrecond( void *bicgs_vdata, int (*precond)(void*,void*,void*,void*), int (*precond_setup)(void*,void*,void*,void*), void *precond_data ); int hypre_BiCGSSetLogging( void *bicgs_vdata, int logging); int hypre_BiCGSGetNumIterations(void *bicgs_vdata,int *num_iterations); int hypre_BiCGSGetFinalRelativeResidualNorm( void *bicgs_vdata, double *relative_residual_norm ); /* bicgstabl.c */ void * hypre_BiCGSTABLCreate( ); int hypre_BiCGSTABLDestroy( void *bicgstab_vdata ); int hypre_BiCGSTABLSetup( void *bicgstab_vdata, void *A, void *b, void *x ); int hypre_BiCGSTABLSolve(void *bicgstab_vdata, void *A, void *b, void *x); int hypre_BiCGSTABLSetSize( void *bicgstab_vdata, int size ); int hypre_BiCGSTABLSetMaxIter( void *bicgstab_vdata, int max_iter ); int hypre_BiCGSTABLSetStopCrit( void *bicgstab_vdata, double stop_crit ); int hypre_BiCGSTABLSetPrecond( void *bicgstab_vdata, int (*precond)(void*, void*, void*, void*), int (*precond_setup)(void*, void*, void*, void*), void *precond_data ); int hypre_BiCGSTABLSetLogging( void *bicgstab_vdata, int logging); int hypre_BiCGSTABLGetNumIterations(void *bicgstab_vdata,int *num_iterations); int hypre_BiCGSTABLGetFinalRelativeResidualNorm( void *bicgstab_vdata, double *relative_residual_norm ); /* fgmres.c */ void *hypre_FGMRESCreate(); int hypre_FGMRESDestroy( void *fgmres_vdata ); int hypre_FGMRESSetup( void *fgmres_vdata, void *A, void *b, void *x ); int hypre_FGMRESSolve(void *fgmres_vdata, void *A, void *b, void *x); int hypre_FGMRESSetKDim( void *fgmres_vdata, int k_dim ); int hypre_FGMRESSetTol( void *fgmres_vdata, double tol ); int hypre_FGMRESSetMaxIter( void *fgmres_vdata, int max_iter ); int hypre_FGMRESSetStopCrit( void *fgmres_vdata, double stop_crit ); int hypre_FGMRESSetPrecond( void *fgmres_vdata, int (*precond)(void*,void*,void*,void*), int (*precond_setup)(void*,void*,void*,void*), void *precond_data ); int hypre_FGMRESGetPrecond(void *fgmres_vdata, HYPRE_Solver *precond_data_ptr); int hypre_FGMRESSetLogging( void *fgmres_vdata, int logging ); int hypre_FGMRESGetNumIterations( void *fgmres_vdata, int *num_iterations ); int hypre_FGMRESGetFinalRelativeResidualNorm(void *fgmres_vdata, double *relative_residual_norm ); int hypre_FGMRESUpdatePrecondTolerance(void *fgmres_vdata, int (*update_tol)(int*, double)); /* TFQmr.c */ void * hypre_TFQmrCreate(); int hypre_TFQmrDestroy( void *tfqmr_vdata ); int hypre_TFQmrSetup( void *tfqmr_vdata, void *A, void *b, void *x ); int hypre_TFQmrSolve(void *tfqmr_vdata, void *A, void *b, void *x); int hypre_TFQmrSetTol( void *tfqmr_vdata, double tol ); int hypre_TFQmrSetMaxIter( void *tfqmr_vdata, int max_iter ); int hypre_TFQmrSetStopCrit( void *tfqmr_vdata, double stop_crit ); int hypre_TFQmrSetPrecond( void *tfqmr_vdata, int (*precond)(void*,void*,void*,void*), int (*precond_setup)(void*,void*,void*,void*), void *precond_data ); int hypre_TFQmrSetLogging( void *tfqmr_vdata, int logging); int hypre_TFQmrGetNumIterations(void *tfqmr_vdata,int *num_iterations); int hypre_TFQmrGetFinalRelativeResidualNorm( void *tfqmr_vdata, double *relative_residual_norm ); #ifdef __cplusplus } #endif #endif hypre-2.33.0/src/FEI_mv/fei-hypre/bicgs.c000066400000000000000000000317431477326011500177630ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "_hypre_FEI.h" /****************************************************************************** * * BiCGS * *****************************************************************************/ #include "utilities/_hypre_utilities.h" #include "HYPRE.h" #include "IJ_mv/HYPRE_IJ_mv.h" #include "parcsr_mv/HYPRE_parcsr_mv.h" #include "parcsr_mv/_hypre_parcsr_mv.h" #include "parcsr_ls/_hypre_parcsr_ls.h" #include "parcsr_ls/HYPRE_parcsr_ls.h" /*-------------------------------------------------------------------------- * hypre_BiCGSData *--------------------------------------------------------------------------*/ typedef struct { int max_iter; int stop_crit; double tol; double rel_residual_norm; void *A; void *r; void *p; void *v; void *q; void *rh; void *u; void *t1; void *t2; void *matvec_data; int (*precond)(void*, void*, void*, void*); int (*precond_setup)(void*, void*, void*, void*); void *precond_data; /* log info (always logged) */ int num_iterations; /* additional log info (logged when `logging' > 0) */ int logging; double *norms; char *log_file_name; } hypre_BiCGSData; /*-------------------------------------------------------------------------- * hypre_BiCGSCreate *--------------------------------------------------------------------------*/ void * hypre_BiCGSCreate( ) { hypre_BiCGSData *bicgs_data; bicgs_data = hypre_CTAlloc(hypre_BiCGSData, 1, HYPRE_MEMORY_HOST); /* set defaults */ (bicgs_data -> tol) = 1.0e-06; (bicgs_data -> max_iter) = 1000; (bicgs_data -> stop_crit) = 0; /* rel. residual norm */ (bicgs_data -> precond) = hypre_ParKrylovIdentity; (bicgs_data -> precond_setup) = hypre_ParKrylovIdentitySetup; (bicgs_data -> precond_data) = NULL; (bicgs_data -> logging) = 0; (bicgs_data -> r) = NULL; (bicgs_data -> rh) = NULL; (bicgs_data -> p) = NULL; (bicgs_data -> v) = NULL; (bicgs_data -> q) = NULL; (bicgs_data -> u) = NULL; (bicgs_data -> t1) = NULL; (bicgs_data -> t2) = NULL; (bicgs_data -> matvec_data) = NULL; (bicgs_data -> norms) = NULL; (bicgs_data -> log_file_name) = NULL; return (void *) bicgs_data; } /*-------------------------------------------------------------------------- * hypre_BiCGSDestroy *--------------------------------------------------------------------------*/ int hypre_BiCGSDestroy( void *bicgs_vdata ) { hypre_BiCGSData *bicgs_data = (hypre_BiCGSData *) bicgs_vdata; int ierr = 0; if (bicgs_data) { if ((bicgs_data -> logging) > 0) { hypre_TFree(bicgs_data -> norms, HYPRE_MEMORY_HOST); } hypre_ParKrylovMatvecDestroy(bicgs_data -> matvec_data); hypre_ParKrylovDestroyVector(bicgs_data -> r); hypre_ParKrylovDestroyVector(bicgs_data -> rh); hypre_ParKrylovDestroyVector(bicgs_data -> v); hypre_ParKrylovDestroyVector(bicgs_data -> p); hypre_ParKrylovDestroyVector(bicgs_data -> q); hypre_ParKrylovDestroyVector(bicgs_data -> u); hypre_ParKrylovDestroyVector(bicgs_data -> t1); hypre_ParKrylovDestroyVector(bicgs_data -> t2); hypre_TFree(bicgs_data, HYPRE_MEMORY_HOST); } return(ierr); } /*-------------------------------------------------------------------------- * hypre_BiCGSSetup *--------------------------------------------------------------------------*/ int hypre_BiCGSSetup( void *bicgs_vdata, void *A, void *b, void *x ) { hypre_BiCGSData *bicgs_data = (hypre_BiCGSData *) bicgs_vdata; int max_iter = (bicgs_data -> max_iter); int (*precond_setup)(void*, void*, void*, void*) = (bicgs_data -> precond_setup); void *precond_data = (bicgs_data -> precond_data); int ierr = 0; (bicgs_data -> A) = A; /*-------------------------------------------------- * The arguments for NewVector are important to * maintain consistency between the setup and * compute phases of matvec and the preconditioner. *--------------------------------------------------*/ if ((bicgs_data -> r) == NULL) (bicgs_data -> r) = hypre_ParKrylovCreateVector(b); if ((bicgs_data -> rh) == NULL) (bicgs_data -> rh) = hypre_ParKrylovCreateVector(b); if ((bicgs_data -> v) == NULL) (bicgs_data -> v) = hypre_ParKrylovCreateVector(b); if ((bicgs_data -> p) == NULL) (bicgs_data -> p) = hypre_ParKrylovCreateVector(b); if ((bicgs_data -> q) == NULL) (bicgs_data -> q) = hypre_ParKrylovCreateVector(b); if ((bicgs_data -> u) == NULL) (bicgs_data -> u) = hypre_ParKrylovCreateVector(b); if ((bicgs_data -> t1) == NULL) (bicgs_data -> t1) = hypre_ParKrylovCreateVector(b); if ((bicgs_data -> t2) == NULL) (bicgs_data -> t2) = hypre_ParKrylovCreateVector(b); if ((bicgs_data -> matvec_data) == NULL) (bicgs_data -> matvec_data) = hypre_ParKrylovMatvecCreate(A, x); ierr = precond_setup(precond_data, A, b, x); /*----------------------------------------------------- * Allocate space for log info *-----------------------------------------------------*/ if ((bicgs_data -> logging) > 0) { if ((bicgs_data -> norms) == NULL) (bicgs_data -> norms) = hypre_CTAlloc(double, max_iter + 1, HYPRE_MEMORY_HOST); if ((bicgs_data -> log_file_name) == NULL) (bicgs_data -> log_file_name) = (char*)"bicgs.out.log"; } return ierr; } /*-------------------------------------------------------------------------- * hypre_BiCGSSolve *-------------------------------------------------------------------------*/ int hypre_BiCGSSolve(void *bicgs_vdata, void *A, void *b, void *x) { hypre_BiCGSData *bicgs_data = (hypre_BiCGSData *) bicgs_vdata; int max_iter = (bicgs_data -> max_iter); int stop_crit = (bicgs_data -> stop_crit); double accuracy = (bicgs_data -> tol); void *matvec_data = (bicgs_data -> matvec_data); void *r = (bicgs_data -> r); void *rh = (bicgs_data -> rh); void *v = (bicgs_data -> v); void *p = (bicgs_data -> p); void *q = (bicgs_data -> q); void *u = (bicgs_data -> u); void *t1 = (bicgs_data -> t1); void *t2 = (bicgs_data -> t2); int (*precond)(void*, void*, void*, void*) = (bicgs_data -> precond); int *precond_data = (int*)(bicgs_data -> precond_data); /* logging variables */ int logging = (bicgs_data -> logging); double *norms = (bicgs_data -> norms); int ierr=0, my_id, num_procs, iter; double rho1, rho2, sigma, alpha, dtmp, r_norm, b_norm; double beta, epsilon; hypre_ParKrylovCommInfo(A,&my_id,&num_procs); if (logging > 0) { norms = (bicgs_data -> norms); } /* initialize work arrays */ hypre_ParKrylovCopyVector(b,r); /* compute initial residual */ hypre_ParKrylovMatvec(matvec_data,-1.0, A, x, 1.0, r); r_norm = sqrt(hypre_ParKrylovInnerProd(r,r)); b_norm = sqrt(hypre_ParKrylovInnerProd(b,b)); if (logging > 0) { norms[0] = r_norm; if (my_id == 0) { printf("BiCGS : L2 norm of b = %e\n", b_norm); if (b_norm == 0.0) printf("Rel_resid_norm actually contains the residual norm\n"); printf("BiCGS : Initial L2 norm of residual = %e\n", r_norm); } } iter = 0; if (b_norm > 0.0) { /* convergence criterion |r_i| <= accuracy*|b| if |b| > 0 */ epsilon = accuracy * b_norm; } else { /* convergence criterion |r_i| <= accuracy*|r0| if |b| = 0 */ epsilon = accuracy * r_norm; }; /* convergence criterion |r_i| <= accuracy , absolute residual norm*/ if (stop_crit) epsilon = accuracy; hypre_ParKrylovCopyVector(r,rh); hypre_ParKrylovClearVector(p); hypre_ParKrylovClearVector(q); rho2 = r_norm * r_norm; beta = rho2; while ( iter < max_iter && r_norm > epsilon ) { iter++; rho1 = rho2; hypre_ParKrylovCopyVector(r,u); hypre_ParKrylovAxpy(beta,q,u); hypre_ParKrylovCopyVector(q,t1); hypre_ParKrylovAxpy(beta,p,t1); hypre_ParKrylovCopyVector(u,p); hypre_ParKrylovAxpy(beta,t1,p); precond(precond_data, A, p, t1); hypre_ParKrylovMatvec(matvec_data,1.0,A,t1,0.0,v); sigma = hypre_ParKrylovInnerProd(rh,v); alpha = rho1 / sigma; hypre_ParKrylovCopyVector(u,q); dtmp = - alpha; hypre_ParKrylovAxpy(dtmp,v,q); dtmp = 1.0; hypre_ParKrylovAxpy(dtmp,q,u); precond(precond_data, A, u, t1); hypre_ParKrylovAxpy(alpha,t1,x); hypre_ParKrylovMatvec(matvec_data,1.0,A,t1,0.0,t2); dtmp = - alpha; hypre_ParKrylovAxpy(dtmp,t2,r); rho2 = hypre_ParKrylovInnerProd(r,rh); beta = rho2 / rho1; r_norm = sqrt(hypre_ParKrylovInnerProd(r,r)); if ( my_id == 0 && logging ) printf(" BiCGS : iter %4d - res. norm = %e \n", iter, r_norm); } (bicgs_data -> num_iterations) = iter; if (b_norm > 0.0) (bicgs_data -> rel_residual_norm) = r_norm/b_norm; if (b_norm == 0.0) (bicgs_data -> rel_residual_norm) = r_norm; if (iter >= max_iter && r_norm > epsilon) ierr = 1; return ierr; } /*-------------------------------------------------------------------------- * hypre_BiCGSSetTol *--------------------------------------------------------------------------*/ int hypre_BiCGSSetTol( void *bicgs_vdata, double tol ) { hypre_BiCGSData *bicgs_data = (hypre_BiCGSData *) bicgs_vdata; int ierr = 0; (bicgs_data -> tol) = tol; return ierr; } /*-------------------------------------------------------------------------- * hypre_BiCGSSetMaxIter *--------------------------------------------------------------------------*/ int hypre_BiCGSSetMaxIter( void *bicgs_vdata, int max_iter ) { hypre_BiCGSData *bicgs_data = (hypre_BiCGSData *) bicgs_vdata; int ierr = 0; (bicgs_data -> max_iter) = max_iter; return ierr; } /*-------------------------------------------------------------------------- * hypre_BiCGSSetStopCrit *--------------------------------------------------------------------------*/ int hypre_BiCGSSetStopCrit( void *bicgs_vdata, double stop_crit ) { hypre_BiCGSData *bicgs_data = (hypre_BiCGSData *) bicgs_vdata; int ierr = 0; (bicgs_data -> stop_crit) = stop_crit; return ierr; } /*-------------------------------------------------------------------------- * hypre_BiCGSSetPrecond *--------------------------------------------------------------------------*/ int hypre_BiCGSSetPrecond( void *bicgs_vdata, int (*precond)(void*,void*,void*,void*), int (*precond_setup)(void*,void*,void*,void*), void *precond_data ) { hypre_BiCGSData *bicgs_data = (hypre_BiCGSData *) bicgs_vdata; int ierr = 0; (bicgs_data -> precond) = precond; (bicgs_data -> precond_setup) = precond_setup; (bicgs_data -> precond_data) = precond_data; return ierr; } /*-------------------------------------------------------------------------- * hypre_BiCGSSetLogging *--------------------------------------------------------------------------*/ int hypre_BiCGSSetLogging( void *bicgs_vdata, int logging) { hypre_BiCGSData *bicgs_data = (hypre_BiCGSData *) bicgs_vdata; int ierr = 0; (bicgs_data -> logging) = logging; return ierr; } /*-------------------------------------------------------------------------- * hypre_BiCGSGetNumIterations *--------------------------------------------------------------------------*/ int hypre_BiCGSGetNumIterations(void *bicgs_vdata,int *num_iterations) { hypre_BiCGSData *bicgs_data = (hypre_BiCGSData *) bicgs_vdata; int ierr = 0; *num_iterations = (bicgs_data -> num_iterations); return ierr; } /*-------------------------------------------------------------------------- * hypre_BiCGSGetFinalRelativeResidualNorm *--------------------------------------------------------------------------*/ int hypre_BiCGSGetFinalRelativeResidualNorm( void *bicgs_vdata, double *relative_residual_norm ) { hypre_BiCGSData *bicgs_data = (hypre_BiCGSData *) bicgs_vdata; int ierr = 0; *relative_residual_norm = (bicgs_data -> rel_residual_norm); return ierr; } hypre-2.33.0/src/FEI_mv/fei-hypre/bicgstabl.c000066400000000000000000001102101477326011500206110ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * BiCGSTABL * *****************************************************************************/ #include "utilities/_hypre_utilities.h" #include "HYPRE.h" #include "IJ_mv/HYPRE_IJ_mv.h" #include "parcsr_mv/HYPRE_parcsr_mv.h" #include "parcsr_mv/_hypre_parcsr_mv.h" #include "parcsr_ls/_hypre_parcsr_ls.h" #include "parcsr_ls/HYPRE_parcsr_ls.h" #include "_hypre_FEI.h" /*-------------------------------------------------------------------------- * hypre_BiCGSTABLData *--------------------------------------------------------------------------*/ typedef struct { int size; int max_iter; int stop_crit; double tol; double rel_residual_norm; void *A; void *r; void *s; void *y; void *t; void *tt; void *st; void *asm1; void *as; void *awt; void *wt; void *wh; void *at; void *xt; void *t2; void *matvec_data; int (*precond)(void*, void*, void*, void*); int (*precond_setup)(void*, void*, void*, void*); void *precond_data; /* log info (always logged) */ int num_iterations; /* additional log info (logged when `logging' > 0) */ int logging; double *norms; char *log_file_name; } hypre_BiCGSTABLData; /*-------------------------------------------------------------------------- * hypre_BiCGSTABLCreate *--------------------------------------------------------------------------*/ void * hypre_BiCGSTABLCreate( ) { hypre_BiCGSTABLData *bicgstab_data; bicgstab_data = hypre_CTAlloc(hypre_BiCGSTABLData, 1, HYPRE_MEMORY_HOST); /* set defaults */ (bicgstab_data -> tol) = 1.0e-06; (bicgstab_data -> size) = 2; (bicgstab_data -> max_iter) = 1000; (bicgstab_data -> stop_crit) = 0; /* rel. residual norm */ (bicgstab_data -> precond) = hypre_ParKrylovIdentity; (bicgstab_data -> precond_setup) = hypre_ParKrylovIdentitySetup; (bicgstab_data -> precond_data) = NULL; (bicgstab_data -> logging) = 0; (bicgstab_data -> s) = NULL; (bicgstab_data -> y) = NULL; (bicgstab_data -> t) = NULL; (bicgstab_data -> tt) = NULL; (bicgstab_data -> s) = NULL; (bicgstab_data -> asm1) = NULL; (bicgstab_data -> as) = NULL; (bicgstab_data -> awt) = NULL; (bicgstab_data -> wt) = NULL; (bicgstab_data -> wh) = NULL; (bicgstab_data -> at) = NULL; (bicgstab_data -> xt) = NULL; (bicgstab_data -> t2) = NULL; (bicgstab_data -> matvec_data) = NULL; (bicgstab_data -> norms) = NULL; (bicgstab_data -> log_file_name) = NULL; return (void *) bicgstab_data; } /*-------------------------------------------------------------------------- * hypre_BiCGSTABLDestroy *--------------------------------------------------------------------------*/ int hypre_BiCGSTABLDestroy( void *bicgstab_vdata ) { hypre_BiCGSTABLData *bicgstab_data = (hypre_BiCGSTABLData *) bicgstab_vdata; int ierr = 0; if (bicgstab_data) { if ((bicgstab_data -> logging) > 0) { hypre_TFree(bicgstab_data -> norms, HYPRE_MEMORY_HOST); } hypre_ParKrylovMatvecDestroy(bicgstab_data -> matvec_data); hypre_ParKrylovDestroyVector(bicgstab_data -> r); hypre_ParKrylovDestroyVector(bicgstab_data -> s); hypre_ParKrylovDestroyVector(bicgstab_data -> y); hypre_ParKrylovDestroyVector(bicgstab_data -> t); hypre_ParKrylovDestroyVector(bicgstab_data -> tt); hypre_ParKrylovDestroyVector(bicgstab_data -> st); hypre_ParKrylovDestroyVector(bicgstab_data -> as); hypre_ParKrylovDestroyVector(bicgstab_data -> asm1); hypre_ParKrylovDestroyVector(bicgstab_data -> awt); hypre_ParKrylovDestroyVector(bicgstab_data -> wt); hypre_ParKrylovDestroyVector(bicgstab_data -> wh); hypre_ParKrylovDestroyVector(bicgstab_data -> at); hypre_ParKrylovDestroyVector(bicgstab_data -> xt); hypre_ParKrylovDestroyVector(bicgstab_data -> t2); hypre_TFree(bicgstab_data, HYPRE_MEMORY_HOST); } return(ierr); } /*-------------------------------------------------------------------------- * hypre_BiCGSTABLSetup *--------------------------------------------------------------------------*/ int hypre_BiCGSTABLSetup( void *bicgstab_vdata, void *A, void *b, void *x ) { hypre_BiCGSTABLData *bicgstab_data = (hypre_BiCGSTABLData *) bicgstab_vdata; int max_iter = (bicgstab_data -> max_iter); int (*precond_setup)(void*, void*, void*, void*) = (bicgstab_data -> precond_setup); void *precond_data = (bicgstab_data -> precond_data); int ierr = 0; (bicgstab_data -> A) = A; /*-------------------------------------------------- * The arguments for NewVector are important to * maintain consistency between the setup and * compute phases of matvec and the preconditioner. *--------------------------------------------------*/ if ((bicgstab_data -> r) == NULL) (bicgstab_data -> r) = hypre_ParKrylovCreateVector(b); if ((bicgstab_data -> s) == NULL) (bicgstab_data -> s) = hypre_ParKrylovCreateVector(b); if ((bicgstab_data -> y) == NULL) (bicgstab_data -> y) = hypre_ParKrylovCreateVector(b); if ((bicgstab_data -> t) == NULL) (bicgstab_data -> t) = hypre_ParKrylovCreateVector(b); if ((bicgstab_data -> tt) == NULL) (bicgstab_data -> tt) = hypre_ParKrylovCreateVector(b); if ((bicgstab_data -> st) == NULL) (bicgstab_data -> st) = hypre_ParKrylovCreateVector(b); if ((bicgstab_data -> asm1) == NULL) (bicgstab_data -> asm1) = hypre_ParKrylovCreateVector(b); if ((bicgstab_data -> as) == NULL) (bicgstab_data -> as) = hypre_ParKrylovCreateVector(b); if ((bicgstab_data -> awt) == NULL) (bicgstab_data -> awt) = hypre_ParKrylovCreateVector(b); if ((bicgstab_data -> wt) == NULL) (bicgstab_data -> wt) = hypre_ParKrylovCreateVector(b); if ((bicgstab_data -> wh) == NULL) (bicgstab_data -> wh) = hypre_ParKrylovCreateVector(b); if ((bicgstab_data -> at) == NULL) (bicgstab_data -> at) = hypre_ParKrylovCreateVector(b); if ((bicgstab_data -> xt) == NULL) (bicgstab_data -> xt) = hypre_ParKrylovCreateVector(b); if ((bicgstab_data -> t2) == NULL) (bicgstab_data -> t2) = hypre_ParKrylovCreateVector(b); if ((bicgstab_data -> matvec_data) == NULL) (bicgstab_data -> matvec_data) = hypre_ParKrylovMatvecCreate(A, x); ierr = precond_setup(precond_data, A, b, x); /*----------------------------------------------------- * Allocate space for log info *-----------------------------------------------------*/ if ((bicgstab_data -> logging) > 0) { if ((bicgstab_data -> norms) == NULL) (bicgstab_data -> norms) = hypre_CTAlloc(double, max_iter + 1, HYPRE_MEMORY_HOST); if ((bicgstab_data -> log_file_name) == NULL) (bicgstab_data -> log_file_name) = (char*) "bicgstab.out.log"; } return ierr; } /*-------------------------------------------------------------------------- * hypre_BiCGSTABLSolve *-------------------------------------------------------------------------*/ int hypre_BiCGSTABLSolve(void *bicgstab_vdata, void *A, void *b, void *x) { hypre_BiCGSTABLData *bicgstab_data = (hypre_BiCGSTABLData *) bicgstab_vdata; int max_iter = (bicgstab_data -> max_iter); int stop_crit = (bicgstab_data -> stop_crit); double accuracy = (bicgstab_data -> tol); void *matvec_data = (bicgstab_data -> matvec_data); void *r = (bicgstab_data -> r); void *s = (bicgstab_data -> s); void *y = (bicgstab_data -> y); void *t = (bicgstab_data -> t); void *tt = (bicgstab_data -> tt); void *wt = (bicgstab_data -> wt); void *awt = (bicgstab_data -> awt); void *asm1 = (bicgstab_data -> asm1); void *as = (bicgstab_data -> as); void *wh = (bicgstab_data -> wh); void *xt = (bicgstab_data -> xt); void *at = (bicgstab_data -> at); void *st = (bicgstab_data -> st); void *t2 = (bicgstab_data -> t2); int (*precond)(void*, void*, void*, void*) = (bicgstab_data -> precond); int *precond_data = (int*) (bicgstab_data -> precond_data); /* logging variables */ int logging = (bicgstab_data -> logging); double *norms = (bicgstab_data -> norms); int ierr = 0; int iter, flag; int my_id, num_procs; double eta, chi, xi, psi, dtmp, dtmp2, r_norm, b_norm; double A11, A12, A21, A22, B1, B2, omega; double epsilon, phi, delta, deltam1, omegam1; hypre_ParKrylovCommInfo(A,&my_id,&num_procs); if (logging > 0) { norms = (bicgstab_data -> norms); } /* initialize work arrays */ hypre_ParKrylovClearVector(x); hypre_ParKrylovCopyVector(b,r); /* compute initial residual */ hypre_ParKrylovMatvec(matvec_data,-1.0, A, x, 1.0, r); r_norm = sqrt(hypre_ParKrylovInnerProd(r,r)); b_norm = sqrt(hypre_ParKrylovInnerProd(b,b)); if (logging > 0) { norms[0] = r_norm; if (my_id == 0) { printf("BiCGSTABL : L2 norm of b = %e\n", b_norm); if (b_norm == 0.0) printf("Rel_resid_norm actually contains the residual norm\n"); printf("BiCGSTABL : Initial L2 norm of residual = %e\n", r_norm); } } iter = 0; if (b_norm > 0.0) { /* convergence criterion |r_i| <= accuracy*|b| if |b| > 0 */ epsilon = accuracy * b_norm; } else { /* convergence criterion |r_i| <= accuracy*|r0| if |b| = 0 */ epsilon = accuracy * r_norm; }; /* convergence criterion |r_i| <= accuracy , absolute residual norm*/ if (stop_crit) epsilon = accuracy; hypre_ParKrylovCopyVector(r,s); hypre_ParKrylovCopyVector(r,y); delta = hypre_ParKrylovInnerProd(r,y); precond(precond_data, A, s, t); hypre_ParKrylovMatvec(matvec_data,1.0,A,t,0.0,as); phi = hypre_ParKrylovInnerProd(y,as) / delta; omega = 0.0; while ( iter < max_iter && r_norm > epsilon ) { iter++; omegam1 = omega; omega = 1.0 / phi; if ( iter >= 2 ) { hypre_ParKrylovCopyVector(awt,at); dtmp = - psi; hypre_ParKrylovAxpy(dtmp,asm1,at); hypre_ParKrylovCopyVector(wt,wh); dtmp = - omega; hypre_ParKrylovAxpy(dtmp,at,wh); } hypre_ParKrylovCopyVector(r,wt); dtmp = - omega; hypre_ParKrylovAxpy(dtmp,as,wt); if ( iter % 2 == 1 ) { precond(precond_data, A, wt, t); hypre_ParKrylovMatvec(matvec_data,1.0,A,t,0.0,awt); dtmp = hypre_ParKrylovInnerProd(wt,awt); dtmp2 = hypre_ParKrylovInnerProd(awt,awt); chi = dtmp / dtmp2; hypre_ParKrylovCopyVector(wt,r); dtmp = - chi; hypre_ParKrylovAxpy(dtmp,awt,r); hypre_ParKrylovCopyVector(x,xt); hypre_ParKrylovAxpy(omega,s,x); hypre_ParKrylovAxpy(chi,wt,x); deltam1 = delta; delta = hypre_ParKrylovInnerProd(r,y); psi = - omega * delta / ( deltam1 * chi); hypre_ParKrylovCopyVector(s,st); hypre_ParKrylovCopyVector(s,t); dtmp = - chi; hypre_ParKrylovAxpy(dtmp,as,t); hypre_ParKrylovCopyVector(r,s); dtmp = - psi; hypre_ParKrylovAxpy(dtmp,t,s); } else { dtmp = - 1.0; hypre_ParKrylovCopyVector(wt,t2); hypre_ParKrylovAxpy(dtmp,wh,t2); precond(precond_data, A, wt, t); hypre_ParKrylovMatvec(matvec_data,1.0,A,t,0.0,awt); A11 = hypre_ParKrylovInnerProd(t2,t2); A12 = hypre_ParKrylovInnerProd(t2,awt); A21 = A12; A22 = hypre_ParKrylovInnerProd(awt,awt); B1 = hypre_ParKrylovInnerProd(t2,wh); B2 = hypre_ParKrylovInnerProd(awt,wh); flag = 0; if ( A21 > A11 ) { dtmp = A11; A11 = A21; A21 = dtmp; dtmp = A12; A12 = A22; A22 = dtmp; flag = 1; } A21 = A12 / A11; A22 = A22 - A12 * A12 / A11; xi = B1; eta = B2 - A21 * xi; eta = eta / A22; xi = (xi - A12 * eta) / A11; xi = - xi; eta = -eta; if ( flag == 1 ) { dtmp = eta; eta = xi; xi = dtmp;} dtmp = 1.0 - xi; hypre_ParKrylovCopyVector(wh,r); hypre_ParKrylovScaleVector(dtmp,r); hypre_ParKrylovAxpy(xi,wt,r); hypre_ParKrylovAxpy(eta,awt,r); hypre_ParKrylovCopyVector(x,t); hypre_ParKrylovAxpy(omega,s,t); hypre_ParKrylovCopyVector(xt,x); hypre_ParKrylovAxpy(omegam1,st,x); hypre_ParKrylovAxpy(omega,tt,x); dtmp = 1.0 - xi; hypre_ParKrylovScaleVector(dtmp,x); hypre_ParKrylovAxpy(xi,t,x); dtmp = - eta; hypre_ParKrylovAxpy(dtmp,wt,x); deltam1 = delta; delta = hypre_ParKrylovInnerProd(r,y); psi = omega * delta / ( deltam1 * eta); hypre_ParKrylovCopyVector(s,st); dtmp = 1.0 - xi; hypre_ParKrylovCopyVector(tt,t); hypre_ParKrylovAxpy(xi,s,t); hypre_ParKrylovAxpy(eta,as,t); hypre_ParKrylovCopyVector(r,s); dtmp = - psi; hypre_ParKrylovAxpy(dtmp,t,s); } hypre_ParKrylovCopyVector(wt,tt); dtmp = - psi; hypre_ParKrylovAxpy(dtmp,st,tt); hypre_ParKrylovCopyVector(as,asm1); precond(precond_data, A, s, t); hypre_ParKrylovMatvec(matvec_data,1.0,A,t,0.0,as); phi = hypre_ParKrylovInnerProd(as,y) / delta; precond(precond_data, A, x, t); hypre_ParKrylovMatvec(matvec_data,-1.0, A, t, 1.0, r); r_norm = hypre_ParKrylovInnerProd(r,r); if ( my_id == 0 && logging ) printf(" BiCGSTAB2 : iter %4d - res. norm = %e \n", iter, r_norm); } precond(precond_data, A, x, t); hypre_ParKrylovCopyVector(t,x); (bicgstab_data -> num_iterations) = iter; if (b_norm > 0.0) (bicgstab_data -> rel_residual_norm) = r_norm/b_norm; if (b_norm == 0.0) (bicgstab_data -> rel_residual_norm) = r_norm; if (iter >= max_iter && r_norm > epsilon) ierr = 1; return ierr; } /*-------------------------------------------------------------------------- * hypre_BiCGSTABLSetTol *--------------------------------------------------------------------------*/ int hypre_BiCGSTABLSetTol( void *bicgstab_vdata, double tol ) { hypre_BiCGSTABLData *bicgstab_data = (hypre_BiCGSTABLData *) bicgstab_vdata; int ierr = 0; (bicgstab_data -> tol) = tol; return ierr; } /*-------------------------------------------------------------------------- * hypre_BiCGSTABLSetMinIter *--------------------------------------------------------------------------*/ int hypre_BiCGSTABLSetSize( void *bicgstab_vdata, int size ) { hypre_BiCGSTABLData *bicgstab_data = (hypre_BiCGSTABLData *) bicgstab_vdata; int ierr = 0; (bicgstab_data -> size) = size; return ierr; } /*-------------------------------------------------------------------------- * hypre_BiCGSTABLSetMaxIter *--------------------------------------------------------------------------*/ int hypre_BiCGSTABLSetMaxIter( void *bicgstab_vdata, int max_iter ) { hypre_BiCGSTABLData *bicgstab_data = (hypre_BiCGSTABLData *) bicgstab_vdata; int ierr = 0; (bicgstab_data -> max_iter) = max_iter; return ierr; } /*-------------------------------------------------------------------------- * hypre_BiCGSTABLSetStopCrit *--------------------------------------------------------------------------*/ int hypre_BiCGSTABLSetStopCrit( void *bicgstab_vdata, double stop_crit ) { hypre_BiCGSTABLData *bicgstab_data = (hypre_BiCGSTABLData *) bicgstab_vdata; int ierr = 0; (bicgstab_data -> stop_crit) = stop_crit; return ierr; } /*-------------------------------------------------------------------------- * hypre_BiCGSTABLSetPrecond *--------------------------------------------------------------------------*/ int hypre_BiCGSTABLSetPrecond( void *bicgstab_vdata, int (*precond)(void*, void*, void*, void*), int (*precond_setup)(void*, void*, void*, void*), void *precond_data ) { hypre_BiCGSTABLData *bicgstab_data = (hypre_BiCGSTABLData *) bicgstab_vdata; int ierr = 0; (bicgstab_data -> precond) = precond; (bicgstab_data -> precond_setup) = precond_setup; (bicgstab_data -> precond_data) = precond_data; return ierr; } /*-------------------------------------------------------------------------- * hypre_BiCGSTABLSetLogging *--------------------------------------------------------------------------*/ int hypre_BiCGSTABLSetLogging( void *bicgstab_vdata, int logging) { hypre_BiCGSTABLData *bicgstab_data = (hypre_BiCGSTABLData *) bicgstab_vdata; int ierr = 0; (bicgstab_data -> logging) = logging; return ierr; } /*-------------------------------------------------------------------------- * hypre_BiCGSTABLGetNumIterations *--------------------------------------------------------------------------*/ int hypre_BiCGSTABLGetNumIterations(void *bicgstab_vdata,int *num_iterations) { hypre_BiCGSTABLData *bicgstab_data = (hypre_BiCGSTABLData *) bicgstab_vdata; int ierr = 0; *num_iterations = (bicgstab_data -> num_iterations); return ierr; } /*-------------------------------------------------------------------------- * hypre_BiCGSTABLGetFinalRelativeResidualNorm *--------------------------------------------------------------------------*/ int hypre_BiCGSTABLGetFinalRelativeResidualNorm( void *bicgstab_vdata, double *relative_residual_norm ) { hypre_BiCGSTABLData *bicgstab_data = (hypre_BiCGSTABLData *) bicgstab_vdata; int ierr = 0; *relative_residual_norm = (bicgstab_data -> rel_residual_norm); return ierr; } /****************************************************************************** ****************************************************************************** ****************************************************************************** haven't been verified to work yet *****************************************************************************/ #ifdef OLDSTUFF /****************************************************************************** * * BiCGSTABL * *****************************************************************************/ #include "utilities/_hypre_utilities.h" #include "HYPRE.h" #include "IJ_mv/HYPRE_IJ_mv.h" #include "parcsr_mv/HYPRE_parcsr_mv.h" #include "parcsr_mv/parcsr_mv.h" #include "parcsr_ls/parcsr_ls.h" #include "parcsr_ls/HYPRE_parcsr_ls.h" #include "headers.h" /*-------------------------------------------------------------------------- * hypre_BiCGSTABLData *--------------------------------------------------------------------------*/ typedef struct { int size; int max_iter; int stop_crit; double tol; double rel_residual_norm; void *A; void *r; void *rh; void *rt; void *rt1; void *rt2; void *rt3; void *ut; void *ut1; void *ut2; void *ut3; void *t; void *xh; void *matvec_data; int (*precond)(void*,void*,void*,void*); int (*precond_setup)(void*,void*,void*,void*); void *precond_data; /* log info (always logged) */ int num_iterations; /* additional log info (logged when `logging' > 0) */ int logging; double *norms; char *log_file_name; } hypre_BiCGSTABLData; /*-------------------------------------------------------------------------- * hypre_BiCGSTABLCreate *--------------------------------------------------------------------------*/ void * hypre_BiCGSTABLCreate( ) { hypre_BiCGSTABLData *bicgstab_data; bicgstab_data = hypre_CTAlloc(hypre_BiCGSTABLData, 1, HYPRE_MEMORY_HOST); /* set defaults */ (bicgstab_data -> tol) = 1.0e-06; (bicgstab_data -> size) = 2; (bicgstab_data -> max_iter) = 1000; (bicgstab_data -> stop_crit) = 0; /* rel. residual norm */ (bicgstab_data -> precond) = hypre_ParKrylovIdentity; (bicgstab_data -> precond_setup) = hypre_ParKrylovIdentitySetup; (bicgstab_data -> precond_data) = NULL; (bicgstab_data -> logging) = 0; (bicgstab_data -> r) = NULL; (bicgstab_data -> rh) = NULL; (bicgstab_data -> rt) = NULL; (bicgstab_data -> rt1) = NULL; (bicgstab_data -> rt2) = NULL; (bicgstab_data -> rt3) = NULL; (bicgstab_data -> ut) = NULL; (bicgstab_data -> ut1) = NULL; (bicgstab_data -> ut2) = NULL; (bicgstab_data -> ut3) = NULL; (bicgstab_data -> xh) = NULL; (bicgstab_data -> t) = NULL; (bicgstab_data -> matvec_data) = NULL; (bicgstab_data -> norms) = NULL; (bicgstab_data -> log_file_name) = NULL; return (void *) bicgstab_data; } /*-------------------------------------------------------------------------- * hypre_BiCGSTABLDestroy *--------------------------------------------------------------------------*/ int hypre_BiCGSTABLDestroy( void *bicgstab_vdata ) { hypre_BiCGSTABLData *bicgstab_data = (hypre_BiCGSTABLData *) bicgstab_vdata; int i, ierr = 0; if (bicgstab_data) { if ((bicgstab_data -> logging) > 0) { hypre_TFree(bicgstab_data -> norms, HYPRE_MEMORY_HOST); } hypre_ParKrylovMatvecDestroy(bicgstab_data -> matvec_data); hypre_ParKrylovDestroyVector(bicgstab_data -> r); hypre_ParKrylovDestroyVector(bicgstab_data -> rh); hypre_ParKrylovDestroyVector(bicgstab_data -> rt); hypre_ParKrylovDestroyVector(bicgstab_data -> rt1); hypre_ParKrylovDestroyVector(bicgstab_data -> rt2); hypre_ParKrylovDestroyVector(bicgstab_data -> rt3); hypre_ParKrylovDestroyVector(bicgstab_data -> ut); hypre_ParKrylovDestroyVector(bicgstab_data -> ut1); hypre_ParKrylovDestroyVector(bicgstab_data -> ut2); hypre_ParKrylovDestroyVector(bicgstab_data -> ut3); hypre_ParKrylovDestroyVector(bicgstab_data -> xh); hypre_ParKrylovDestroyVector(bicgstab_data -> t); hypre_TFree(bicgstab_data, HYPRE_MEMORY_HOST); } return(ierr); } /*-------------------------------------------------------------------------- * hypre_BiCGSTABLSetup *--------------------------------------------------------------------------*/ int hypre_BiCGSTABLSetup( void *bicgstab_vdata, void *A, void *b, void *x ) { hypre_BiCGSTABLData *bicgstab_data = (hypre_BiCGSTABLData *) bicgstab_vdata; int max_iter = (bicgstab_data -> max_iter); int (*precond_setup)(void*,void*,void*,void*) = (bicgstab_data -> precond_setup); void *precond_data = (bicgstab_data -> precond_data); int ierr = 0; (bicgstab_data -> A) = A; /*-------------------------------------------------- * The arguments for NewVector are important to * maintain consistency between the setup and * compute phases of matvec and the preconditioner. *--------------------------------------------------*/ if ((bicgstab_data -> r) == NULL) (bicgstab_data -> r) = hypre_ParKrylovCreateVector(b); if ((bicgstab_data -> rh) == NULL) (bicgstab_data -> rh) = hypre_ParKrylovCreateVector(b); if ((bicgstab_data -> rt) == NULL) (bicgstab_data -> rt) = hypre_ParKrylovCreateVector(b); if ((bicgstab_data -> rt1) == NULL) (bicgstab_data -> rt1) = hypre_ParKrylovCreateVector(b); if ((bicgstab_data -> rt2) == NULL) (bicgstab_data -> rt2) = hypre_ParKrylovCreateVector(b); if ((bicgstab_data -> rt3) == NULL) (bicgstab_data -> rt3) = hypre_ParKrylovCreateVector(b); if ((bicgstab_data -> ut) == NULL) (bicgstab_data -> ut) = hypre_ParKrylovCreateVector(b); if ((bicgstab_data -> ut1) == NULL) (bicgstab_data -> ut1) = hypre_ParKrylovCreateVector(b); if ((bicgstab_data -> ut2) == NULL) (bicgstab_data -> ut2) = hypre_ParKrylovCreateVector(b); if ((bicgstab_data -> ut3) == NULL) (bicgstab_data -> ut3) = hypre_ParKrylovCreateVector(b); if ((bicgstab_data -> xh) == NULL) (bicgstab_data -> xh) = hypre_ParKrylovCreateVector(b); if ((bicgstab_data -> t) == NULL) (bicgstab_data -> t) = hypre_ParKrylovCreateVector(b); if ((bicgstab_data -> matvec_data) == NULL) (bicgstab_data -> matvec_data) = hypre_ParKrylovMatvecCreate(A, x); precond_setup(precond_data, A, b, x); /*----------------------------------------------------- * Allocate space for log info *-----------------------------------------------------*/ if ((bicgstab_data -> logging) > 0) { if ((bicgstab_data -> norms) == NULL) (bicgstab_data -> norms) = hypre_CTAlloc(double, max_iter + 1, HYPRE_MEMORY_HOST); if ((bicgstab_data -> log_file_name) == NULL) (bicgstab_data -> log_file_name) = (char*)"bicgstab.out.log"; } return ierr; } /*-------------------------------------------------------------------------- * hypre_BiCGSTABLSolve *-------------------------------------------------------------------------*/ int hypre_BiCGSTABLSolve(void *bicgstab_vdata, void *A, void *b, void *x) { hypre_BiCGSTABLData *bicgstab_data = (hypre_BiCGSTABLData *) bicgstab_vdata; int size = (bicgstab_data -> size); int max_iter = (bicgstab_data -> max_iter); int stop_crit = (bicgstab_data -> stop_crit); double accuracy = (bicgstab_data -> tol); void *matvec_data = (bicgstab_data -> matvec_data); double mat[2][2], gammanp[2], gammap[2], sigma[2], tau[2][2]; void *r = (bicgstab_data -> r); void *rh = (bicgstab_data -> rh); void *rt = (bicgstab_data -> rt); void *rt1 = (bicgstab_data -> rt1); void *rt2 = (bicgstab_data -> rt2); void *rt3 = (bicgstab_data -> rt3); void *ut = (bicgstab_data -> ut); void *ut1 = (bicgstab_data -> ut1); void *ut2 = (bicgstab_data -> ut2); void *ut3 = (bicgstab_data -> ut3); void *xh = (bicgstab_data -> xh); void *t = (bicgstab_data -> t); int (*precond)(void*,void*,void*,void*) = (bicgstab_data -> precond); int *precond_data = (int*) (bicgstab_data -> precond_data); /* logging variables */ int logging = (bicgstab_data -> logging); double *norms = (bicgstab_data -> norms); char *log_file_name = (bicgstab_data -> log_file_name); int ierr = 0; int iter; int j; int my_id, num_procs; double alpha, beta, gamma, epsilon, rho, rho1, dtmp, r_norm, b_norm; double gammapp[2], darray[2], epsmac = 1.e-16, omega; hypre_ParKrylovCommInfo(A,&my_id,&num_procs); if (logging > 0) { norms = (bicgstab_data -> norms); log_file_name = (bicgstab_data -> log_file_name); } /* initialize work arrays */ hypre_ParKrylovClearVector(x); hypre_ParKrylovCopyVector(b,r); /* compute initial residual */ hypre_ParKrylovMatvec(matvec_data,-1.0, A, x, 1.0, r); r_norm = sqrt(hypre_ParKrylovInnerProd(r,r)); b_norm = sqrt(hypre_ParKrylovInnerProd(b,b)); if (logging > 0) { norms[0] = r_norm; if (my_id == 0) { printf("BiCGSTABL : L2 norm of b = %e\n", b_norm); if (b_norm == 0.0) printf("Rel_resid_norm actually contains the residual norm\n"); printf("BiCGSTABL : Initial L2 norm of residual = %e\n", r_norm); } } iter = 0; if (b_norm > 0.0) { /* convergence criterion |r_i| <= accuracy*|b| if |b| > 0 */ epsilon = accuracy * b_norm; } else { /* convergence criterion |r_i| <= accuracy*|r0| if |b| = 0 */ epsilon = accuracy * r_norm; }; /* convergence criterion |r_i| <= accuracy , absolute residual norm*/ if (stop_crit) epsilon = accuracy; hypre_ParKrylovCopyVector(r,rh); hypre_ParKrylovCopyVector(r,rt); hypre_ParKrylovCopyVector(x,xh); hypre_ParKrylovClearVector(ut); omega = rho = 1.0; alpha = 0.0; while ( iter < max_iter && r_norm > epsilon ) { iter += size; hypre_ParKrylovCopyVector(ut,ut1); hypre_ParKrylovCopyVector(rt,rt1); rho = - omega * rho; rho1 = hypre_ParKrylovInnerProd(rh,rt1); beta = alpha * rho1 / rho; rho = rho1; dtmp = -beta; hypre_ParKrylovScaleVector(dtmp,ut1); hypre_ParKrylovAxpy(1.0,rt1,ut1); precond(precond_data, A, ut1, t); hypre_ParKrylovMatvec(matvec_data,1.0,A,t,0.0,ut2); gamma = hypre_ParKrylovInnerProd(rh,ut2); alpha = rho / gamma; dtmp = -alpha; hypre_ParKrylovAxpy(dtmp,ut2,rt1); precond(precond_data, A, rt1, t); hypre_ParKrylovMatvec(matvec_data,1.0,A,t,0.0,rt2); hypre_ParKrylovAxpy(alpha,ut1,xh); rho1 = hypre_ParKrylovInnerProd(rh,rt2); beta = alpha * rho1 / rho; rho = rho1; dtmp = -beta; hypre_ParKrylovScaleVector(dtmp,ut1); hypre_ParKrylovAxpy(1.0,rt1,ut1); hypre_ParKrylovScaleVector(dtmp,ut2); hypre_ParKrylovAxpy(1.0,rt2,ut2); precond(precond_data, A, ut2, t); hypre_ParKrylovMatvec(matvec_data,1.0,A,t,0.0,ut3); gamma = hypre_ParKrylovInnerProd(rh,ut3); alpha = rho / gamma; dtmp = -alpha; hypre_ParKrylovAxpy(dtmp,ut2,rt1); hypre_ParKrylovAxpy(dtmp,ut3,rt2); precond(precond_data, A, rt2, t); hypre_ParKrylovMatvec(matvec_data,1.0,A,t,0.0,rt3); hypre_ParKrylovAxpy(alpha,ut1,xh); mat[0][0] = 0.0; mat[0][1] = 0.0; mat[1][0] = 0.0; mat[1][1] = 0.0; darray[0] = hypre_ParKrylovInnerProd(rt2,rt2); darray[1] = hypre_ParKrylovInnerProd(rt1,rt2); sigma[0] = darray[0]; mat[0][0] = sigma[0]; gammap[0] = darray[1] / sigma[0]; dtmp = hypre_ParKrylovInnerProd(rt2,rt3); tau[0][1] = dtmp / sigma[0]; mat[0][1] = tau[0][1] * sigma[0]; dtmp = -tau[0][1]; hypre_ParKrylovAxpy(dtmp,rt2,rt3); darray[0] = hypre_ParKrylovInnerProd(rt3,rt3); darray[1] = hypre_ParKrylovInnerProd(rt1,rt3); sigma[1] = darray[0]; mat[1][1] = sigma[1]; gammap[1] = darray[1] / sigma[1]; gammanp[1] = gammap[1]; omega = gammanp[1]; gammanp[0] = gammap[0]; gammanp[0] = gammanp[0] - tau[0][1] * gammanp[1]; gammapp[0] = gammanp[1]; dtmp = gammanp[0]; hypre_ParKrylovAxpy(dtmp,rt1,xh); dtmp = - gammap[1]; hypre_ParKrylovAxpy(dtmp,rt3,rt1); dtmp = - gammanp[1]; hypre_ParKrylovAxpy(dtmp,ut3,ut1); dtmp = - gammanp[0]; hypre_ParKrylovAxpy(dtmp,ut2,ut1); dtmp = gammapp[0]; hypre_ParKrylovAxpy(dtmp,rt2,xh); dtmp = - gammap[0]; hypre_ParKrylovAxpy(dtmp,rt2,rt1); hypre_ParKrylovCopyVector(ut1,ut); hypre_ParKrylovCopyVector(rt1,rt); hypre_ParKrylovCopyVector(xh,x); precond(precond_data, A, x, t); hypre_ParKrylovMatvec(matvec_data,-1.0, A, t, 1.0, r); r_norm = hypre_ParKrylovInnerProd(r,r); if ( my_id == 0 && logging ) printf(" BiCGSTABL : iter %4d - res. norm = %e \n", iter, r_norm); } precond(precond_data, A, x, t); hypre_ParKrylovCopyVector(t,x); (bicgstab_data -> num_iterations) = iter; if (b_norm > 0.0) (bicgstab_data -> rel_residual_norm) = r_norm/b_norm; if (b_norm == 0.0) (bicgstab_data -> rel_residual_norm) = r_norm; if (iter >= max_iter && r_norm > epsilon) ierr = 1; return ierr; } /*-------------------------------------------------------------------------- * hypre_BiCGSTABLSetTol *--------------------------------------------------------------------------*/ int hypre_BiCGSTABLSetTol( void *bicgstab_vdata, double tol ) { hypre_BiCGSTABLData *bicgstab_data = (hypre_BiCGSTABLData *) bicgstab_vdata; int ierr = 0; (bicgstab_data -> tol) = tol; return ierr; } /*-------------------------------------------------------------------------- * hypre_BiCGSTABLSetMinIter *--------------------------------------------------------------------------*/ int hypre_BiCGSTABLSetSize( void *bicgstab_vdata, int size ) { hypre_BiCGSTABLData *bicgstab_data = (hypre_BiCGSTABLData *) bicgstab_vdata; int ierr = 0; (bicgstab_data -> size) = size; return ierr; } /*-------------------------------------------------------------------------- * hypre_BiCGSTABLSetMaxIter *--------------------------------------------------------------------------*/ int hypre_BiCGSTABLSetMaxIter( void *bicgstab_vdata, int max_iter ) { hypre_BiCGSTABLData *bicgstab_data = (hypre_BiCGSTABLData *) bicgstab_vdata; int ierr = 0; (bicgstab_data -> max_iter) = max_iter; return ierr; } /*-------------------------------------------------------------------------- * hypre_BiCGSTABLSetStopCrit *--------------------------------------------------------------------------*/ int hypre_BiCGSTABLSetStopCrit( void *bicgstab_vdata, double stop_crit ) { hypre_BiCGSTABLData *bicgstab_data = (hypre_BiCGSTABLData *) bicgstab_vdata; int ierr = 0; (bicgstab_data -> stop_crit) = stop_crit; return ierr; } /*-------------------------------------------------------------------------- * hypre_BiCGSTABLSetPrecond *--------------------------------------------------------------------------*/ int hypre_BiCGSTABLSetPrecond( void *bicgstab_vdata, int (*precond)(void*,void*,void*,void*), int (*precond_setup)(void*,void*,void*,void*), void *precond_data ) { hypre_BiCGSTABLData *bicgstab_data = (hypre_BiCGSTABLData *) bicgstab_vdata; int ierr = 0; (bicgstab_data -> precond) = precond; (bicgstab_data -> precond_setup) = precond_setup; (bicgstab_data -> precond_data) = precond_data; return ierr; } /*-------------------------------------------------------------------------- * hypre_BiCGSTABLSetLogging *--------------------------------------------------------------------------*/ int hypre_BiCGSTABLSetLogging( void *bicgstab_vdata, int logging) { hypre_BiCGSTABLData *bicgstab_data = (hypre_BiCGSTABLData *) bicgstab_vdata; int ierr = 0; (bicgstab_data -> logging) = logging; return ierr; } /*-------------------------------------------------------------------------- * hypre_BiCGSTABLGetNumIterations *--------------------------------------------------------------------------*/ int hypre_BiCGSTABLGetNumIterations(void *bicgstab_vdata,int *num_iterations) { hypre_BiCGSTABLData *bicgstab_data = (hypre_BiCGSTABLData *) bicgstab_vdata; int ierr = 0; *num_iterations = (bicgstab_data -> num_iterations); return ierr; } /*-------------------------------------------------------------------------- * hypre_BiCGSTABLGetFinalRelativeResidualNorm *--------------------------------------------------------------------------*/ int hypre_BiCGSTABLGetFinalRelativeResidualNorm( void *bicgstab_vdata, double *relative_residual_norm ) { hypre_BiCGSTABLData *bicgstab_data = (hypre_BiCGSTABLData *) bicgstab_vdata; int ierr = 0; *relative_residual_norm = (bicgstab_data -> rel_residual_norm); return ierr; } #endif hypre-2.33.0/src/FEI_mv/fei-hypre/cfei-hypre.h000066400000000000000000000010131477326011500207170ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #ifndef cfei_hypre_h_included #define cfei_hypre_h_included #include #include #include "cfei_hypre.h" #endif /*cfei_hypre_h_included*/ hypre-2.33.0/src/FEI_mv/fei-hypre/cfei_hypre.cxx000066400000000000000000000434001477326011500213620ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include #include #include "HYPRE.h" #include "utilities/_hypre_utilities.h" #include "IJ_mv/HYPRE_IJ_mv.h" #include "parcsr_mv/HYPRE_parcsr_mv.h" #include "parcsr_ls/HYPRE_parcsr_ls.h" #include "HYPRE_FEI_includes.h" #include "HYPRE_LinSysCore.h" #include "cfei_hypre.h" /******************************************************************************/ /* Create function for a HYPRE_LinSysCore object. */ /*----------------------------------------------------------------------------*/ LinearSystemCore *HYPRE_base_create( MPI_Comm comm ) { LinearSystemCore* linSys = new HYPRE_LinSysCore(comm); return (linSys); } /******************************************************************************/ /* Create function for a HYPRE_LinSysCore object. */ /*----------------------------------------------------------------------------*/ extern "C" int HYPRE_LinSysCore_create(LinSysCore** lsc, MPI_Comm comm) { HYPRE_LinSysCore* linSys = new HYPRE_LinSysCore(comm); if (linSys == NULL) return(1); *lsc = new LinSysCore; if (*lsc == NULL) return(1); (*lsc)->lsc_ = (void*)linSys; return(0); } /******************************************************************************/ /* Destroy function, to de-allocate a HYPRE_LinSysCore object. */ /*----------------------------------------------------------------------------*/ extern "C" int HYPRE_LinSysCore_destroy(LinSysCore** lsc) { if (*lsc == NULL) return(1); HYPRE_LinSysCore* linSys = (HYPRE_LinSysCore*)((*lsc)->lsc_); if (linSys == NULL) return(1); delete linSys; delete *lsc; *lsc = NULL; return(0); } /******************************************************************************/ /* function for loading to the matrix directly but with FEI equation mappings */ /*----------------------------------------------------------------------------*/ extern "C" int HYPRE_LSC_BeginMappedMatrixLoad(LinSysCore* lsc) { if (lsc == NULL) return(1); HYPRE_LinSysCore* linSys = (HYPRE_LinSysCore*)(lsc->lsc_); if (linSys == NULL) return(1); linSys->beginCreateMapFromSoln(); return(0); } /******************************************************************************/ /* function for loading to the matrix directly but with FEI equation mappings */ /*----------------------------------------------------------------------------*/ extern "C" int HYPRE_LSC_EndMappedMatrixLoad(LinSysCore* lsc) { if (lsc == NULL) return(1); HYPRE_LinSysCore* linSys = (HYPRE_LinSysCore*)(lsc->lsc_); if (linSys == NULL) return(1); linSys->endCreateMapFromSoln(); return(0); } /******************************************************************************/ /* function for loading to the matrix directly but with FEI equation mappings */ /*----------------------------------------------------------------------------*/ extern "C" int HYPRE_LSC_MappedMatrixLoad(LinSysCore* lsc, int row, int col, double val) { if (lsc == NULL) return(1); HYPRE_LinSysCore* linSys = (HYPRE_LinSysCore*)(lsc->lsc_); if (linSys == NULL) return(1); linSys->putIntoMappedMatrix(row, 1, &val, &col); return(0); } /******************************************************************************/ /* function for getting the version number */ /*----------------------------------------------------------------------------*/ extern "C" char *HYPRE_LSC_GetVersion(LinSysCore* lsc) { char *lscVersion; if (lsc == NULL) return(NULL); HYPRE_LinSysCore* linSys = (HYPRE_LinSysCore*)(lsc->lsc_); if (linSys == NULL) return(NULL); lscVersion = linSys->getVersion(); return(lscVersion); } /******************************************************************************/ /* get the finite element grid object */ /*----------------------------------------------------------------------------*/ extern "C" int HYPRE_LSC_GetFEDataObject(LinSysCore* lsc, void **object) { if (lsc == NULL) return(1); HYPRE_LinSysCore* linSys = (HYPRE_LinSysCore*)(lsc->lsc_); if (linSys == NULL) return(1); linSys->getFEDataObject(object); return(0); } /******************************************************************************/ /* the parameter function (to set parameter values) */ /*----------------------------------------------------------------------------*/ extern "C" int HYPRE_LSC_parameters(LinSysCore* lsc, int numParams, char **params) { if (lsc == NULL) return(1); HYPRE_LinSysCore* linSys = (HYPRE_LinSysCore*)(lsc->lsc_); if (linSys == NULL) return(1); linSys->parameters(numParams, params); return(0); } /******************************************************************************/ /* This function sets up the equation offset on each processor */ /*----------------------------------------------------------------------------*/ extern "C" int HYPRE_LSC_setGlobalOffsets(LinSysCore* lsc, int leng, int* nodeOffsets, int* eqnOffsets, int* blkEqnOffsets) { if (lsc == NULL) return(1); HYPRE_LinSysCore* linSys = (HYPRE_LinSysCore*)(lsc->lsc_); if (linSys == NULL) return(1); linSys->setGlobalOffsets(leng, nodeOffsets, eqnOffsets, blkEqnOffsets); return(0); } /******************************************************************************/ /* set up the matrix sparsity pattern */ /*----------------------------------------------------------------------------*/ extern "C" int HYPRE_LSC_setMatrixStructure(LinSysCore *lsc, int** ptColIndices, int* ptRowLengths, int** blkColIndices, int* blkRowLengths, int* ptRowsPerBlkRow) { if (lsc == NULL) return(1); HYPRE_LinSysCore* linSys = (HYPRE_LinSysCore*)(lsc->lsc_); if (linSys == NULL) return(1); linSys->setMatrixStructure(ptColIndices, ptRowLengths, blkColIndices, blkRowLengths, ptRowsPerBlkRow); return(0); } /******************************************************************************/ /* reset the matrix but keep the sparsity pattern */ /*----------------------------------------------------------------------------*/ extern "C" int HYPRE_LSC_resetMatrixAndVector(LinSysCore *lsc, double val) { if (lsc == NULL) return(1); HYPRE_LinSysCore* linSys = (HYPRE_LinSysCore*)(lsc->lsc_); if (linSys == NULL) return(1); linSys->resetMatrixAndVector(val); return(0); } /******************************************************************************/ /* reset the matrix but keep the sparsity pattern */ /*----------------------------------------------------------------------------*/ extern "C" int HYPRE_LSC_resetMatrix(LinSysCore *lsc, double val) { if (lsc == NULL) return(1); HYPRE_LinSysCore* linSys = (HYPRE_LinSysCore*)(lsc->lsc_); if (linSys == NULL) return(1); linSys->resetMatrix(val); return(0); } /******************************************************************************/ /* reset the right hand side vector */ /*----------------------------------------------------------------------------*/ extern "C" int HYPRE_LSC_resetRHSVector(LinSysCore *lsc, double val) { if (lsc == NULL) return(1); HYPRE_LinSysCore* linSys = (HYPRE_LinSysCore*)(lsc->lsc_); if (linSys == NULL) return(1); linSys->resetRHSVector(val); return(0); } /******************************************************************************/ /* load the matrix */ /*----------------------------------------------------------------------------*/ extern "C" int HYPRE_LSC_sumIntoSystemMatrix(LinSysCore *lsc, int numPtRows, const int* ptRows, int numPtCols, const int* ptCols, int numBlkRows, const int* blkRows, int numBlkCols, const int* blkCols, const double* const* values) { if (lsc == NULL) return(1); HYPRE_LinSysCore* linSys = (HYPRE_LinSysCore*)(lsc->lsc_); if (linSys == NULL) return(1); linSys->sumIntoSystemMatrix(numPtRows, ptRows, numPtCols, ptCols, numBlkRows, blkRows, numBlkCols, blkCols, values); return(0); } /******************************************************************************/ /* load the right hand side vector */ /*----------------------------------------------------------------------------*/ extern "C" int HYPRE_LSC_sumIntoRHSVector(LinSysCore *lsc, int num, const double* values, const int* indices) { if (lsc == NULL) return(1); HYPRE_LinSysCore* linSys = (HYPRE_LinSysCore*)(lsc->lsc_); if (linSys == NULL) return(1); linSys->sumIntoRHSVector(num, values, indices); return(0); } /******************************************************************************/ /* matrix loading completed */ /*----------------------------------------------------------------------------*/ extern "C" int HYPRE_LSC_matrixLoadComplete(LinSysCore *lsc) { if (lsc == NULL) return(1); HYPRE_LinSysCore* linSys = (HYPRE_LinSysCore*)(lsc->lsc_); if (linSys == NULL) return(1); linSys->matrixLoadComplete(); return(0); } /******************************************************************************/ /* enforce essential boundary condition */ /*----------------------------------------------------------------------------*/ extern "C" int HYPRE_LSC_enforceEssentialBC(LinSysCore *lsc, int* globalEqn, double* alpha, double* gamma1, int leng) { if (lsc == NULL) return(1); HYPRE_LinSysCore* linSys = (HYPRE_LinSysCore*)(lsc->lsc_); if (linSys == NULL) return(1); linSys->enforceEssentialBC(globalEqn, alpha, gamma1, leng); return(0); } /******************************************************************************/ /* enforce essential boundary condition (cross processor boundary) */ /*----------------------------------------------------------------------------*/ extern "C" int HYPRE_LSC_enforceRemoteEssBCs(LinSysCore *lsc,int numEqns, int* globalEqns, int** colIndices, int* colIndLen, double** coefs) { if (lsc == NULL) return(1); HYPRE_LinSysCore* linSys = (HYPRE_LinSysCore*)(lsc->lsc_); if (linSys == NULL) return(1); linSys->enforceRemoteEssBCs(numEqns,globalEqns,colIndices,colIndLen,coefs); return(0); } /******************************************************************************/ /* enforce natural boundary condition */ /*----------------------------------------------------------------------------*/ extern "C" int HYPRE_LSC_enforceOtherBC(LinSysCore *lsc, int* globalEqn, double* alpha, double* beta, double* gamma1, int leng) { if (lsc == NULL) return(1); HYPRE_LinSysCore* linSys = (HYPRE_LinSysCore*)(lsc->lsc_); if (linSys == NULL) return(1); linSys->enforceOtherBC(globalEqn, alpha, beta, gamma1, leng); return(0); } /******************************************************************************/ /* put initial guess into HYPRE */ /*----------------------------------------------------------------------------*/ extern "C" int HYPRE_LSC_putInitialGuess(LinSysCore *lsc, const int* eqnNumbers, const double* values, int leng) { if (lsc == NULL) return(1); HYPRE_LinSysCore* linSys = (HYPRE_LinSysCore*)(lsc->lsc_); if (linSys == NULL) return(1); linSys->putInitialGuess(eqnNumbers, values, leng); return(0); } /******************************************************************************/ /* get the whole solution vector */ /*----------------------------------------------------------------------------*/ extern "C" int HYPRE_LSC_getSolution(LinSysCore *lsc, double *answers, int leng) { if (lsc == NULL) return(1); HYPRE_LinSysCore* linSys = (HYPRE_LinSysCore*)(lsc->lsc_); if (linSys == NULL) return(1); linSys->getSolution(answers, leng); return(0); } /******************************************************************************/ /* get a solution entry */ /*----------------------------------------------------------------------------*/ extern "C" int HYPRE_LSC_getSolnEntry(LinSysCore *lsc, int eqnNumber, double *answer) { if (lsc == NULL) return(1); HYPRE_LinSysCore* linSys = (HYPRE_LinSysCore*)(lsc->lsc_); if (linSys == NULL) return(1); linSys->getSolnEntry(eqnNumber, (*answer)); return(0); } /******************************************************************************/ /* form and fetch the residual vector */ /*----------------------------------------------------------------------------*/ extern "C" int HYPRE_LSC_formResidual(LinSysCore *lsc, double *values, int leng) { if (lsc == NULL) return(1); HYPRE_LinSysCore* linSys = (HYPRE_LinSysCore*)(lsc->lsc_); if (linSys == NULL) return(1); linSys->formResidual(values, leng); return(0); } /******************************************************************************/ /* start iterating */ /*----------------------------------------------------------------------------*/ extern "C" int HYPRE_LSC_launchSolver(LinSysCore *lsc, int *solveStatus, int *iter) { if (lsc == NULL) return(1); HYPRE_LinSysCore* linSys = (HYPRE_LinSysCore*)(lsc->lsc_); if (linSys == NULL) return(1); linSys->launchSolver(*solveStatus, *iter); return(0); } /******************************************************************************/ /* begin initializing the field IDs */ /*----------------------------------------------------------------------------*/ extern "C" int HYPRE_LSC_FEDataInitFields(LinSysCore *lsc, int nFields, int *fieldSizes, int *fieldIDs) { if (lsc == NULL) return(1); HYPRE_LinSysCore* linSys = (HYPRE_LinSysCore*)(lsc->lsc_); if ( linSys == NULL ) return(1); linSys->FE_initFields(nFields, fieldSizes, fieldIDs); return(0); } /******************************************************************************/ /* begin initializing the element block */ /*----------------------------------------------------------------------------*/ extern "C" int HYPRE_LSC_FEDataInitElemBlock(LinSysCore *lsc, int nElems, int nNodesPerElem, int numNodeFields, int *nodeFieldIDs) { if (lsc == NULL) return(1); HYPRE_LinSysCore* linSys = (HYPRE_LinSysCore*)(lsc->lsc_); if ( linSys == NULL ) return(1); linSys->FE_initElemBlock(nElems, nNodesPerElem, numNodeFields, nodeFieldIDs); return(0); } /******************************************************************************/ /* begin initializing element connectivity information */ /*----------------------------------------------------------------------------*/ extern "C" int HYPRE_LSC_FEDataInitElemNodeList(LinSysCore *lsc, int elemID, int nNodesPerElem, int *elemConn) { if (lsc == NULL) return(1); HYPRE_LinSysCore* linSys = (HYPRE_LinSysCore*)(lsc->lsc_); if ( linSys == NULL ) return(1); linSys->FE_initElemNodeList(elemID,nNodesPerElem,elemConn); return(0); } /******************************************************************************/ /* begin initializing shared node information */ /*----------------------------------------------------------------------------*/ extern "C" int HYPRE_LSC_FEDataInitSharedNodes(LinSysCore *lsc, int nShared, int *sharedIDs, int *sharedLengs, int **sharedProcs) { if (lsc == NULL) return(1); HYPRE_LinSysCore* linSys = (HYPRE_LinSysCore*)(lsc->lsc_); if ( linSys == NULL ) return(1); linSys->FE_initSharedNodes(nShared,sharedIDs,sharedLengs,sharedProcs); return(0); } /******************************************************************************/ /* initialization done */ /*----------------------------------------------------------------------------*/ extern "C" int HYPRE_LSC_FEDataInitComplete(LinSysCore *lsc) { if (lsc == NULL) return(1); HYPRE_LinSysCore* linSys = (HYPRE_LinSysCore*)(lsc->lsc_); if ( linSys == NULL ) return(1); linSys->FE_initComplete(); return(0); } /******************************************************************************/ /* begin initializing the element set */ /*----------------------------------------------------------------------------*/ extern "C" int HYPRE_LSC_FEDataLoadElemMatrix(LinSysCore *lsc, int elemID, int nNodesPerElem, int *elemConn, int matDim, double **elemStiff) { if (lsc == NULL) return(1); HYPRE_LinSysCore* linSys = (HYPRE_LinSysCore*)(lsc->lsc_); if ( linSys == NULL ) return(1); linSys->FE_loadElemMatrix(elemID,nNodesPerElem,elemConn,matDim,elemStiff); return(0); } hypre-2.33.0/src/FEI_mv/fei-hypre/cfei_hypre.h000066400000000000000000000100531477326011500210050ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #ifndef _cfei_hypre_h_ #define _cfei_hypre_h_ /* This header defines the prototype for the HYPRE-specific functions that uses the LinSysCore struct pointer, which is used by FEI_create. */ #ifndef CFEI_LinSysCore_DEFINED #define CFEI_LinSysCore_DEFINED /* First we define the LinSysCore struct which is kind of like an abstract type. ISIS_LinSysCore_create produces an instance of LinSysCore. */ struct LinSysCore_struct { void* lsc_; }; typedef struct LinSysCore_struct LinSysCore; #endif #ifdef __cplusplus LinearSystemCore *HYPRE_base_create( MPI_Comm comm ); #endif #ifdef __cplusplus extern "C" { #endif int HYPRE_LinSysCore_create(LinSysCore** lsc, MPI_Comm comm); int HYPRE_LinSysCore_destroy(LinSysCore** lsc); int HYPRE_LSC_BeginMappedMatrixLoad(LinSysCore* lsc); int HYPRE_LSC_EndMappedMatrixLoad(LinSysCore* lsc); int HYPRE_LSC_MappedMatrixLoad(LinSysCore* lsc, int row, int col, double val); char *HYPRE_LSC_GetVersion(LinSysCore* lsc); int HYPRE_LSC_GetFEDataObject(LinSysCore* lsc, void **object); int HYPRE_LSC_parameters(LinSysCore* lsc, int numParams, char **params); int HYPRE_LSC_setGlobalOffsets(LinSysCore* lsc, int leng, int* nodeOffsets, int* eqnOffsets, int* blkEqnOffsets); int HYPRE_LSC_setMatrixStructure(LinSysCore *lsc, int** ptColIndices, int* ptRowLengths, int** blkColIndices, int* blkRowLengths, int* ptRowsPerBlkRow); int HYPRE_LSC_resetMatrixAndVector(LinSysCore *lsc, double val); int HYPRE_LSC_resetMatrix(LinSysCore *lsc, double val); int HYPRE_LSC_resetRHSVector(LinSysCore *lsc, double val); int HYPRE_LSC_sumIntoSystemMatrix(LinSysCore *lsc, int numPtRows, const int* ptRows, int numPtCols, const int* ptCols, int numBlkRows, const int* blkRows, int numBlkCols, const int* blkCols, const double* const* values); int HYPRE_LSC_sumIntoRHSVector(LinSysCore *lsc, int num, const double* values, const int* indices); int HYPRE_LSC_matrixLoadComplete(LinSysCore *lsc); int HYPRE_LSC_enforceEssentialBC(LinSysCore *lsc, int* globalEqn, double* alpha, double* gamma, int leng); int HYPRE_LSC_enforceRemoteEssBCs(LinSysCore *lsc,int numEqns,int* globalEqns, int** colIndices, int* colIndLen, double** coefs); int HYPRE_LSC_enforceOtherBC(LinSysCore *lsc, int* globalEqn, double* alpha, double* beta, double* gamma, int leng); int HYPRE_LSC_putInitialGuess(LinSysCore *lsc, const int* eqnNumbers, const double* values, int leng); int HYPRE_LSC_getSolution(LinSysCore *lsc, double *answers, int leng); int HYPRE_LSC_getSolnEntry(LinSysCore *lsc, int eqnNumber, double *answer); int HYPRE_LSC_formResidual(LinSysCore *lsc, double *values, int leng); int HYPRE_LSC_launchSolver(LinSysCore *lsc, int *solveStatus, int *iter); int HYPRE_LSC_FEDataInitFields(LinSysCore* lsc, int nFields, int *fieldSizes, int *fieldIDs); int HYPRE_LSC_FEDataInitElemBlock(LinSysCore* lsc, int nElems, int nNodes, int nNodeFields, int *nodeFieldIDs); int HYPRE_LSC_FEDataInitElemNodeList(LinSysCore* lsc, int elemID, int nNodes, int *nList); int HYPRE_LSC_FEDataInitSharedNodes(LinSysCore* lsc, int nShared, int *sharedIDs, int *sharedPLengs, int **sharedProcs); int HYPRE_LSC_FEDataInitComplete(LinSysCore* lsc); int HYPRE_LSC_FEDataLoadElemMatrix(LinSysCore* lsc, int elemID, int nNodes, int *nList, int sDim, double **sMat); #ifdef __cplusplus } #endif #endif hypre-2.33.0/src/FEI_mv/fei-hypre/driver.C000066400000000000000000000362341477326011500201270ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ // ************************************************************************* // test program for HYPRE_LinSysCore // ************************************************************************* //*************************************************************************** // system includes //--------------------------------------------------------------------------- #include #include #include //************************************************************************** // HYPRE includes //--------------------------------------------------------------------------- #include "HYPRE.h" #include "utilities/utilities.h" #include "../../IJ_mv/HYPRE_IJ_mv.h" #include "../../parcsr_mv/HYPRE_parcsr_mv.h" #include "../../parcsr_ls/HYPRE_parcsr_ls.h" #include "HYPRE_FEI_includes.h" #include "HYPRE_LinSysCore.h" //************************************************************************** // local defines and local and external functions //--------------------------------------------------------------------------- void fei_hypre_domaindecomposition(int, char **); void fei_hypre_test(int, char **); extern "C" { int HYPRE_LSI_DDAMGSolve(HYPRE_ParCSRMatrix A_csr, HYPRE_ParVector x_csr, HYPRE_ParVector b_csr ); void HYPRE_LSI_Get_IJAMatrixFromFile(double **val, int **ia, int **ja, int *N, double **rhs, char *matfile, char *rhsfile); } //*************************************************************************** // main program //*************************************************************************** main(int argc, char *argv[]) { fei_hypre_test(argc, argv); } //*************************************************************************** // a test program //*************************************************************************** void fei_hypre_test(int argc, char *argv[]) { int i, j, k, my_rank, num_procs, nrows, nnz, mybegin, myend, status; int *ia, *ja, ncnt, index, chunksize, iterations, local_nrows; int *rowLengths, **colIndices, blksize=1, *list, prec; double *val, *rhs, ddata, ddata_max; //------------------------------------------------------------------ // initialize parallel platform //------------------------------------------------------------------ MPI_Init(&argc, &argv); MPI_Comm_rank(MPI_COMM_WORLD, &my_rank); MPI_Comm_size(MPI_COMM_WORLD, &num_procs); HYPRE_LinSysCore H(MPI_COMM_WORLD); //------------------------------------------------------------------ // read the matrix and rhs and broadcast //------------------------------------------------------------------ if ( my_rank == 0 ) { HYPRE_LSI_Get_IJAMatrixFromFile(&val, &ia, &ja, &nrows, &rhs, "matrix.data", "rhs.data"); nnz = ia[nrows]; MPI_Bcast(&nrows, 1, MPI_INT, 0, MPI_COMM_WORLD); MPI_Bcast(&nnz, 1, MPI_INT, 0, MPI_COMM_WORLD); MPI_Bcast(ia, nrows+1, MPI_INT, 0, MPI_COMM_WORLD); MPI_Bcast(ja, nnz, MPI_INT, 0, MPI_COMM_WORLD); MPI_Bcast(val, nnz, MPI_DOUBLE, 0, MPI_COMM_WORLD); MPI_Bcast(rhs, nrows, MPI_DOUBLE, 0, MPI_COMM_WORLD); } else { MPI_Bcast(&nrows, 1, MPI_INT, 0, MPI_COMM_WORLD); MPI_Bcast(&nnz, 1, MPI_INT, 0, MPI_COMM_WORLD); ia = new int[nrows+1]; ja = new int[nnz]; val = new double[nnz]; rhs = new double[nrows]; MPI_Bcast(ia, nrows+1, MPI_INT, 0, MPI_COMM_WORLD); MPI_Bcast(ja, nnz, MPI_INT, 0, MPI_COMM_WORLD); MPI_Bcast(val, nnz, MPI_DOUBLE, 0, MPI_COMM_WORLD); MPI_Bcast(rhs, nrows, MPI_DOUBLE, 0, MPI_COMM_WORLD); } chunksize = nrows / blksize; if ( chunksize * blksize != nrows ) { printf("Cannot put into matrix blocks with block size 3\n"); exit(1); } chunksize = chunksize / num_procs; mybegin = chunksize * my_rank * blksize; myend = chunksize * (my_rank + 1) * blksize - 1; if ( my_rank == num_procs-1 ) myend = nrows - 1; printf("Processor %d : begin/end = %d %d\n", my_rank, mybegin, myend); fflush(stdout); //------------------------------------------------------------------ // create matrix in the HYPRE context //------------------------------------------------------------------ local_nrows = myend - mybegin + 1; H.createMatricesAndVectors(nrows, mybegin+1, local_nrows); rowLengths = new int[local_nrows]; colIndices = new int*[local_nrows]; for ( i = mybegin; i < myend+1; i++ ) { ncnt = ia[i+1] - ia[i]; rowLengths[i-mybegin] = ncnt; colIndices[i-mybegin] = new int[ncnt]; k = 0; for (j = ia[i]; j < ia[i+1]; j++) colIndices[i-mybegin][k++] = ja[j]; } H.allocateMatrix(colIndices, rowLengths); for ( i = mybegin; i < myend+1; i++ ) delete [] colIndices[i-mybegin]; delete [] colIndices; delete [] rowLengths; //------------------------------------------------------------------ // load the matrix //------------------------------------------------------------------ for ( i = mybegin; i <= myend; i++ ) { ncnt = ia[i+1] - ia[i]; index = i + 1; H.sumIntoSystemMatrix(index, ncnt, &val[ia[i]], &ja[ia[i]]); } H.matrixLoadComplete(); free( ia ); free( ja ); free( val ); //------------------------------------------------------------------ // load the right hand side //------------------------------------------------------------------ for ( i = mybegin; i <= myend; i++ ) { index = i; H.sumIntoRHSVector(1, &rhs[i], &index); } free( rhs ); //------------------------------------------------------------------ // set other parameters //------------------------------------------------------------------ char *paramString = new char[100]; strcpy(paramString, "version"); H.parameters(1, ¶mString); strcpy(paramString, "solver gmres"); H.parameters(1, ¶mString); strcpy(paramString, "relativeNorm"); H.parameters(1, ¶mString); strcpy(paramString, "tolerance 1.0e-6"); H.parameters(1, ¶mString); if ( my_rank == 0 ) { printf("preconditioner (diagonal,parasails,boomeramg,ml,pilut,ddilut) : "); scanf("%d", &prec); } MPI_Bcast(&prec, 1, MPI_INT, 0, MPI_COMM_WORLD); switch (prec) { case 0 : strcpy(paramString, "preconditioner diagonal"); break; case 1 : strcpy(paramString, "preconditioner parasails"); break; case 2 : strcpy(paramString, "preconditioner boomeramg"); break; case 3 : strcpy(paramString, "preconditioner ml"); break; case 4 : strcpy(paramString, "preconditioner pilut"); break; case 5 : strcpy(paramString, "preconditioner ddilut"); break; default : strcpy(paramString, "preconditioner parasails"); break; } H.parameters(1, ¶mString); strcpy(paramString, "gmresDim 300"); H.parameters(1, ¶mString); strcpy(paramString, "ddilutFillin 0.0"); H.parameters(1, ¶mString); strcpy(paramString, "amgRelaxType hybrid"); H.parameters(1, ¶mString); strcpy(paramString, "amgRelaxWeight 0.5"); H.parameters(1, ¶mString); strcpy(paramString, "amgStrongThreshold 0.08"); H.parameters(1, ¶mString); strcpy(paramString, "amgNumSweeps 2"); H.parameters(1, ¶mString); strcpy(paramString, "mlNumPresweeps 2"); H.parameters(1, ¶mString); strcpy(paramString, "mlNumPostsweeps 2"); H.parameters(1, ¶mString); strcpy(paramString, "mlPresmootherType bgs"); H.parameters(1, ¶mString); strcpy(paramString, "mlPostsmootherType bgs"); H.parameters(1, ¶mString); strcpy(paramString, "mlRelaxWeight 0.5"); H.parameters(1, ¶mString); strcpy(paramString, "mlStrongThreshold 0.08"); H.parameters(1, ¶mString); strcpy(paramString, "parasailsNlevels 1"); H.parameters(1, ¶mString); strcpy(paramString, "parasailsThreshold 0.1"); H.parameters(1, ¶mString); //------------------------------------------------------------------ // solve the system //------------------------------------------------------------------ strcpy(paramString, "outputLevel 1"); H.parameters(1, ¶mString); /* strcpy(paramString, "schurReduction"); H.parameters(1, ¶mString); */ H.launchSolver(status, iterations); /* strcpy(paramString, "preconditioner reuse"); H.parameters(1, ¶mString); ddata = 0.0; for ( i = H.localStartRow_; i <= H.localEndRow_; i++ ) { H.putInitialGuess(&i, &ddata, 1); } H.launchSolver(status, iterations); ddata = 0.0; for ( i = H.localStartRow_; i <= H.localEndRow_; i++ ) { H.putInitialGuess(&i, &ddata, 1); } H.launchSolver(status, iterations); */ if ( status != 1 ) { printf("%4d : HYPRE_LinSysCore : solve unsuccessful.\n", my_rank); } else if ( my_rank == 0 ) { printf("HYPRE_LinSysCore : solve successful.\n", my_rank); printf(" iteration count = %4d\n", iterations); } if ( my_rank == 0 ) { //for ( i = H.localStartRow_-1; i < H.localEndRow_; i++ ) //{ // HYPRE_IJVectorGetLocalComponents(H.currX_,1,&i, NULL, &ddata); // //H.getSolnEntry(i, ddata); // printf("sol(%d): %e\n", i, ddata); //} } //------------------------------------------------------------------ // clean up //------------------------------------------------------------------ MPI_Finalize(); } //*************************************************************************** // driver program for domain decomposition //*************************************************************************** void fei_hypre_domaindecomposition(int argc, char *argv[]) { int i, j, k, nrows, nnz, global_nrows; int num_procs, status, rowCnt, relaxType[4]; int *ia, *ja, ncnt, index, chunksize, myRank; int local_nrows, eqnNum, *rowLengths, **colIndices; int blksize=1, *list, *colInd, *newColInd; int rowSize, newRowSize, maxRowSize=0, num_iterations; int myBegin, myEnd; double *val, *rhs, *colVal, *newColVal, ddata; MPI_Comm newComm, dummyComm; HYPRE_Solver SeqPrecon; HYPRE_Solver PSolver; HYPRE_ParCSRMatrix A_csr; HYPRE_ParVector x_csr; HYPRE_ParVector b_csr; HYPRE_ParVector r_csr; //****************************************************************** // initialize parallel platform //------------------------------------------------------------------ MPI_Init(&argc, &argv); MPI_Comm_rank(MPI_COMM_WORLD, &myRank); MPI_Comm_size(MPI_COMM_WORLD, &num_procs); HYPRE_LinSysCore H(MPI_COMM_WORLD); //****************************************************************** // read the matrix and rhs and broadcast //------------------------------------------------------------------ if ( myRank == 0 ) { HYPRE_LSI_Get_IJAMatrixFromFile(&val, &ia, &ja, &nrows, &rhs, "matrix.data", "rhs.data"); nnz = ia[nrows]; MPI_Bcast(&nrows, 1, MPI_INT, 0, MPI_COMM_WORLD); MPI_Bcast(&nnz, 1, MPI_INT, 0, MPI_COMM_WORLD); MPI_Bcast(ia, nrows+1, MPI_INT, 0, MPI_COMM_WORLD); MPI_Bcast(ja, nnz, MPI_INT, 0, MPI_COMM_WORLD); MPI_Bcast(val, nnz, MPI_DOUBLE, 0, MPI_COMM_WORLD); MPI_Bcast(rhs, nrows, MPI_DOUBLE, 0, MPI_COMM_WORLD); } else { MPI_Bcast(&nrows, 1, MPI_INT, 0, MPI_COMM_WORLD); MPI_Bcast(&nnz, 1, MPI_INT, 0, MPI_COMM_WORLD); ia = new int[nrows+1]; ja = new int[nnz]; val = new double[nnz]; rhs = new double[nrows]; MPI_Bcast(ia, nrows+1, MPI_INT, 0, MPI_COMM_WORLD); MPI_Bcast(ja, nnz, MPI_INT, 0, MPI_COMM_WORLD); MPI_Bcast(val, nnz, MPI_DOUBLE, 0, MPI_COMM_WORLD); MPI_Bcast(rhs, nrows, MPI_DOUBLE, 0, MPI_COMM_WORLD); } chunksize = nrows / blksize; if ( chunksize * blksize != nrows ) { printf("Cannot put into matrix blocks with block size 3\n"); exit(1); } chunksize = chunksize / num_procs; myBegin = chunksize * myRank * blksize; myEnd = chunksize * (myRank + 1) * blksize - 1; if ( myRank == num_procs-1 ) myEnd = nrows - 1; printf("Processor %d : begin/end = %d %d\n", myRank, myBegin, myEnd); fflush(stdout); //****************************************************************** // create and load the global matrix in the HYPRE context //------------------------------------------------------------------ local_nrows = myEnd - myBegin + 1; MPI_Allreduce(&local_nrows, &global_nrows,1,MPI_INT,MPI_SUM,MPI_COMM_WORLD); H.createMatricesAndVectors(nrows, myBegin+1, local_nrows); rowLengths = new int[local_nrows]; colIndices = new int*[local_nrows]; for ( i = myBegin; i < myEnd+1; i++ ) { ncnt = ia[i+1] - ia[i]; rowLengths[i-myBegin] = ncnt; colIndices[i-myBegin] = new int[ncnt]; k = 0; for (j = ia[i]; j < ia[i+1]; j++) colIndices[i-myBegin][k++] = ja[j]; } H.allocateMatrix(colIndices, rowLengths); for ( i = myBegin; i < myEnd+1; i++ ) delete [] colIndices[i-myBegin]; delete [] colIndices; delete [] rowLengths; for ( i = myBegin; i <= myEnd; i++ ) { ncnt = ia[i+1] - ia[i]; index = i + 1; H.sumIntoSystemMatrix(index, ncnt, &val[ia[i]], &ja[ia[i]]); } H.matrixLoadComplete(); free( ia ); free( ja ); free( val ); //****************************************************************** // load the right hand side //------------------------------------------------------------------ for ( i = myBegin; i <= myEnd; i++ ) { index = i + 1; H.sumIntoRHSVector(1, &rhs[i], &index); } free( rhs ); //****************************************************************** // call solver //------------------------------------------------------------------ //---old_IJ--------------------------------------------------------- //x_csr = (HYPRE_ParVector) HYPRE_IJVectorGetLocalStorage(H.HYx_); //b_csr = (HYPRE_ParVector) HYPRE_IJVectorGetLocalStorage(H.HYb_); //A_csr = (HYPRE_ParCSRMatrix) HYPRE_IJMatrixGetLocalStorage(H.HYA_); //---new_IJ--------------------------------------------------------- HYPRE_IJVectorGetObject(H.HYx_, (void**) &x_csr); HYPRE_IJVectorGetObject(H.HYb_, (void**) &b_csr); HYPRE_IJMatrixGetObject(H.HYA_, (void**) &A_csr); //------------------------------------------------------------------ HYPRE_LSI_DDAMGSolve(A_csr,x_csr,b_csr); MPI_Finalize(); } hypre-2.33.0/src/FEI_mv/fei-hypre/driver.cxx000066400000000000000000000362211477326011500205430ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ // ************************************************************************* // test program for HYPRE_LinSysCore // ************************************************************************* //*************************************************************************** // system includes //--------------------------------------------------------------------------- #include #include #include //************************************************************************** // HYPRE includes //--------------------------------------------------------------------------- #include "HYPRE.h" #include "utilities/_hypre_utilities.h" #include "IJ_mv/HYPRE_IJ_mv.h" #include "parcsr_mv/HYPRE_parcsr_mv.h" #include "parcsr_ls/HYPRE_parcsr_ls.h" #include "HYPRE_FEI_includes.h" #include "HYPRE_LinSysCore.h" //************************************************************************** // local defines and local and external functions //--------------------------------------------------------------------------- void fei_hypre_domaindecomposition(int, char **); void fei_hypre_test(int, char **); extern "C" { int HYPRE_LSI_DDAMGSolve(HYPRE_ParCSRMatrix A_csr, HYPRE_ParVector x_csr, HYPRE_ParVector b_csr ); void HYPRE_LSI_Get_IJAMatrixFromFile(double **val, int **ia, int **ja, int *N, double **rhs, char *matfile, char *rhsfile); } //*************************************************************************** // main program //*************************************************************************** main(int argc, char *argv[]) { fei_hypre_test(argc, argv); } //*************************************************************************** // a test program //*************************************************************************** void fei_hypre_test(int argc, char *argv[]) { int i, j, k, my_rank, num_procs, nrows, nnz, mybegin, myend, status; int *ia, *ja, ncnt, index, chunksize, iterations, local_nrows; int *rowLengths, **colIndices, blksize=1, *list, prec; double *val, *rhs, ddata, ddata_max; //------------------------------------------------------------------ // initialize parallel platform //------------------------------------------------------------------ MPI_Init(&argc, &argv); MPI_Comm_rank(MPI_COMM_WORLD, &my_rank); MPI_Comm_size(MPI_COMM_WORLD, &num_procs); HYPRE_LinSysCore H(MPI_COMM_WORLD); //------------------------------------------------------------------ // read the matrix and rhs and broadcast //------------------------------------------------------------------ if ( my_rank == 0 ) { HYPRE_LSI_Get_IJAMatrixFromFile(&val, &ia, &ja, &nrows, &rhs, "matrix.data", "rhs.data"); nnz = ia[nrows]; MPI_Bcast(&nrows, 1, MPI_INT, 0, MPI_COMM_WORLD); MPI_Bcast(&nnz, 1, MPI_INT, 0, MPI_COMM_WORLD); MPI_Bcast(ia, nrows+1, MPI_INT, 0, MPI_COMM_WORLD); MPI_Bcast(ja, nnz, MPI_INT, 0, MPI_COMM_WORLD); MPI_Bcast(val, nnz, MPI_DOUBLE, 0, MPI_COMM_WORLD); MPI_Bcast(rhs, nrows, MPI_DOUBLE, 0, MPI_COMM_WORLD); } else { MPI_Bcast(&nrows, 1, MPI_INT, 0, MPI_COMM_WORLD); MPI_Bcast(&nnz, 1, MPI_INT, 0, MPI_COMM_WORLD); ia = new int[nrows+1]; ja = new int[nnz]; val = new double[nnz]; rhs = new double[nrows]; MPI_Bcast(ia, nrows+1, MPI_INT, 0, MPI_COMM_WORLD); MPI_Bcast(ja, nnz, MPI_INT, 0, MPI_COMM_WORLD); MPI_Bcast(val, nnz, MPI_DOUBLE, 0, MPI_COMM_WORLD); MPI_Bcast(rhs, nrows, MPI_DOUBLE, 0, MPI_COMM_WORLD); } chunksize = nrows / blksize; if ( chunksize * blksize != nrows ) { printf("Cannot put into matrix blocks with block size 3\n"); exit(1); } chunksize = chunksize / num_procs; mybegin = chunksize * my_rank * blksize; myend = chunksize * (my_rank + 1) * blksize - 1; if ( my_rank == num_procs-1 ) myend = nrows - 1; printf("Processor %d : begin/end = %d %d\n", my_rank, mybegin, myend); fflush(stdout); //------------------------------------------------------------------ // create matrix in the HYPRE context //------------------------------------------------------------------ local_nrows = myend - mybegin + 1; H.createMatricesAndVectors(nrows, mybegin+1, local_nrows); rowLengths = new int[local_nrows]; colIndices = new int*[local_nrows]; for ( i = mybegin; i < myend+1; i++ ) { ncnt = ia[i+1] - ia[i]; rowLengths[i-mybegin] = ncnt; colIndices[i-mybegin] = new int[ncnt]; k = 0; for (j = ia[i]; j < ia[i+1]; j++) colIndices[i-mybegin][k++] = ja[j]; } H.allocateMatrix(colIndices, rowLengths); for ( i = mybegin; i < myend+1; i++ ) delete [] colIndices[i-mybegin]; delete [] colIndices; delete [] rowLengths; //------------------------------------------------------------------ // load the matrix //------------------------------------------------------------------ for ( i = mybegin; i <= myend; i++ ) { ncnt = ia[i+1] - ia[i]; index = i + 1; H.sumIntoSystemMatrix(index, ncnt, &val[ia[i]], &ja[ia[i]]); } H.matrixLoadComplete(); free( ia ); free( ja ); free( val ); //------------------------------------------------------------------ // load the right hand side //------------------------------------------------------------------ for ( i = mybegin; i <= myend; i++ ) { index = i; H.sumIntoRHSVector(1, &rhs[i], &index); } free( rhs ); //------------------------------------------------------------------ // set other parameters //------------------------------------------------------------------ char *paramString = new char[100]; strcpy(paramString, "version"); H.parameters(1, ¶mString); strcpy(paramString, "solver gmres"); H.parameters(1, ¶mString); strcpy(paramString, "relativeNorm"); H.parameters(1, ¶mString); strcpy(paramString, "tolerance 1.0e-6"); H.parameters(1, ¶mString); if ( my_rank == 0 ) { printf("preconditioner (diagonal,parasails,boomeramg,ml,pilut,ddilut) : "); scanf("%d", &prec); } MPI_Bcast(&prec, 1, MPI_INT, 0, MPI_COMM_WORLD); switch (prec) { case 0 : strcpy(paramString, "preconditioner diagonal"); break; case 1 : strcpy(paramString, "preconditioner parasails"); break; case 2 : strcpy(paramString, "preconditioner boomeramg"); break; case 3 : strcpy(paramString, "preconditioner ml"); break; case 4 : strcpy(paramString, "preconditioner pilut"); break; case 5 : strcpy(paramString, "preconditioner ddilut"); break; default : strcpy(paramString, "preconditioner parasails"); break; } H.parameters(1, ¶mString); strcpy(paramString, "gmresDim 300"); H.parameters(1, ¶mString); strcpy(paramString, "ddilutFillin 0.0"); H.parameters(1, ¶mString); strcpy(paramString, "amgRelaxType hybrid"); H.parameters(1, ¶mString); strcpy(paramString, "amgRelaxWeight 0.5"); H.parameters(1, ¶mString); strcpy(paramString, "amgStrongThreshold 0.08"); H.parameters(1, ¶mString); strcpy(paramString, "amgNumSweeps 2"); H.parameters(1, ¶mString); strcpy(paramString, "mlNumPresweeps 2"); H.parameters(1, ¶mString); strcpy(paramString, "mlNumPostsweeps 2"); H.parameters(1, ¶mString); strcpy(paramString, "mlPresmootherType bgs"); H.parameters(1, ¶mString); strcpy(paramString, "mlPostsmootherType bgs"); H.parameters(1, ¶mString); strcpy(paramString, "mlRelaxWeight 0.5"); H.parameters(1, ¶mString); strcpy(paramString, "mlStrongThreshold 0.08"); H.parameters(1, ¶mString); strcpy(paramString, "parasailsNlevels 1"); H.parameters(1, ¶mString); strcpy(paramString, "parasailsThreshold 0.1"); H.parameters(1, ¶mString); //------------------------------------------------------------------ // solve the system //------------------------------------------------------------------ strcpy(paramString, "outputLevel 1"); H.parameters(1, ¶mString); /* strcpy(paramString, "schurReduction"); H.parameters(1, ¶mString); */ H.launchSolver(status, iterations); /* strcpy(paramString, "preconditioner reuse"); H.parameters(1, ¶mString); ddata = 0.0; for ( i = H.localStartRow_; i <= H.localEndRow_; i++ ) { H.putInitialGuess(&i, &ddata, 1); } H.launchSolver(status, iterations); ddata = 0.0; for ( i = H.localStartRow_; i <= H.localEndRow_; i++ ) { H.putInitialGuess(&i, &ddata, 1); } H.launchSolver(status, iterations); */ if ( status != 1 ) { printf("%4d : HYPRE_LinSysCore : solve unsuccessful.\n", my_rank); } else if ( my_rank == 0 ) { printf("HYPRE_LinSysCore : solve successful.\n", my_rank); printf(" iteration count = %4d\n", iterations); } if ( my_rank == 0 ) { //for ( i = H.localStartRow_-1; i < H.localEndRow_; i++ ) //{ // HYPRE_IJVectorGetLocalComponents(H.currX_,1,&i, NULL, &ddata); // //H.getSolnEntry(i, ddata); // printf("sol(%d): %e\n", i, ddata); //} } //------------------------------------------------------------------ // clean up //------------------------------------------------------------------ MPI_Finalize(); } //*************************************************************************** // driver program for domain decomposition //*************************************************************************** void fei_hypre_domaindecomposition(int argc, char *argv[]) { int i, j, k, nrows, nnz, global_nrows; int num_procs, status, rowCnt, relaxType[4]; int *ia, *ja, ncnt, index, chunksize, myRank; int local_nrows, eqnNum, *rowLengths, **colIndices; int blksize=1, *list, *colInd, *newColInd; int rowSize, newRowSize, maxRowSize=0, num_iterations; int myBegin, myEnd; double *val, *rhs, *colVal, *newColVal, ddata; MPI_Comm newComm, dummyComm; HYPRE_Solver SeqPrecon; HYPRE_Solver PSolver; HYPRE_ParCSRMatrix A_csr; HYPRE_ParVector x_csr; HYPRE_ParVector b_csr; HYPRE_ParVector r_csr; //****************************************************************** // initialize parallel platform //------------------------------------------------------------------ MPI_Init(&argc, &argv); MPI_Comm_rank(MPI_COMM_WORLD, &myRank); MPI_Comm_size(MPI_COMM_WORLD, &num_procs); HYPRE_LinSysCore H(MPI_COMM_WORLD); //****************************************************************** // read the matrix and rhs and broadcast //------------------------------------------------------------------ if ( myRank == 0 ) { HYPRE_LSI_Get_IJAMatrixFromFile(&val, &ia, &ja, &nrows, &rhs, "matrix.data", "rhs.data"); nnz = ia[nrows]; MPI_Bcast(&nrows, 1, MPI_INT, 0, MPI_COMM_WORLD); MPI_Bcast(&nnz, 1, MPI_INT, 0, MPI_COMM_WORLD); MPI_Bcast(ia, nrows+1, MPI_INT, 0, MPI_COMM_WORLD); MPI_Bcast(ja, nnz, MPI_INT, 0, MPI_COMM_WORLD); MPI_Bcast(val, nnz, MPI_DOUBLE, 0, MPI_COMM_WORLD); MPI_Bcast(rhs, nrows, MPI_DOUBLE, 0, MPI_COMM_WORLD); } else { MPI_Bcast(&nrows, 1, MPI_INT, 0, MPI_COMM_WORLD); MPI_Bcast(&nnz, 1, MPI_INT, 0, MPI_COMM_WORLD); ia = new int[nrows+1]; ja = new int[nnz]; val = new double[nnz]; rhs = new double[nrows]; MPI_Bcast(ia, nrows+1, MPI_INT, 0, MPI_COMM_WORLD); MPI_Bcast(ja, nnz, MPI_INT, 0, MPI_COMM_WORLD); MPI_Bcast(val, nnz, MPI_DOUBLE, 0, MPI_COMM_WORLD); MPI_Bcast(rhs, nrows, MPI_DOUBLE, 0, MPI_COMM_WORLD); } chunksize = nrows / blksize; if ( chunksize * blksize != nrows ) { printf("Cannot put into matrix blocks with block size 3\n"); exit(1); } chunksize = chunksize / num_procs; myBegin = chunksize * myRank * blksize; myEnd = chunksize * (myRank + 1) * blksize - 1; if ( myRank == num_procs-1 ) myEnd = nrows - 1; printf("Processor %d : begin/end = %d %d\n", myRank, myBegin, myEnd); fflush(stdout); //****************************************************************** // create and load the global matrix in the HYPRE context //------------------------------------------------------------------ local_nrows = myEnd - myBegin + 1; MPI_Allreduce(&local_nrows, &global_nrows,1,MPI_INT,MPI_SUM,MPI_COMM_WORLD); H.createMatricesAndVectors(nrows, myBegin+1, local_nrows); rowLengths = new int[local_nrows]; colIndices = new int*[local_nrows]; for ( i = myBegin; i < myEnd+1; i++ ) { ncnt = ia[i+1] - ia[i]; rowLengths[i-myBegin] = ncnt; colIndices[i-myBegin] = new int[ncnt]; k = 0; for (j = ia[i]; j < ia[i+1]; j++) colIndices[i-myBegin][k++] = ja[j]; } H.allocateMatrix(colIndices, rowLengths); for ( i = myBegin; i < myEnd+1; i++ ) delete [] colIndices[i-myBegin]; delete [] colIndices; delete [] rowLengths; for ( i = myBegin; i <= myEnd; i++ ) { ncnt = ia[i+1] - ia[i]; index = i + 1; H.sumIntoSystemMatrix(index, ncnt, &val[ia[i]], &ja[ia[i]]); } H.matrixLoadComplete(); free( ia ); free( ja ); free( val ); //****************************************************************** // load the right hand side //------------------------------------------------------------------ for ( i = myBegin; i <= myEnd; i++ ) { index = i + 1; H.sumIntoRHSVector(1, &rhs[i], &index); } free( rhs ); //****************************************************************** // call solver //------------------------------------------------------------------ //---old_IJ--------------------------------------------------------- //x_csr = (HYPRE_ParVector) HYPRE_IJVectorGetLocalStorage(H.HYx_); //b_csr = (HYPRE_ParVector) HYPRE_IJVectorGetLocalStorage(H.HYb_); //A_csr = (HYPRE_ParCSRMatrix) HYPRE_IJMatrixGetLocalStorage(H.HYA_); //---new_IJ--------------------------------------------------------- HYPRE_IJVectorGetObject(H.HYx_, (void**) &x_csr); HYPRE_IJVectorGetObject(H.HYb_, (void**) &b_csr); HYPRE_IJMatrixGetObject(H.HYA_, (void**) &A_csr); //------------------------------------------------------------------ HYPRE_LSI_DDAMGSolve(A_csr,x_csr,b_csr); MPI_Finalize(); } hypre-2.33.0/src/FEI_mv/fei-hypre/fei_mv.h000066400000000000000000000335621477326011500201470ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "_hypre_utilities.h" // NEW FEI (2.23.02) #include "fei_LinearSystemCore.hpp" #include "LLNL_FEI_Impl.h" #ifndef hypre_FE_MV_HEADER #define hypre_FE_MV_HEADER #include "HYPRE.h" #ifdef __cplusplus extern "C" { #endif /****************************************************************************** * * Header info for the hypre_FEMesh structures * *****************************************************************************/ #ifndef hypre_FE_MESH_HEADER #define hypre_FE_MESH_HEADER /*-------------------------------------------------------------------------- * hypre_FEMesh: *--------------------------------------------------------------------------*/ typedef struct hypre_FEMesh_struct { MPI_Comm comm_; void *linSys_; void *feiPtr_; int objectType_; } hypre_FEMesh; typedef struct hypre_FEMesh_struct *HYPRE_FEMesh; #endif /****************************************************************************** * * Header info for the hypre_FEMatrix structures * *****************************************************************************/ #ifndef hypre_FE_MATRIX_HEADER #define hypre_FE_MATRIX_HEADER /*-------------------------------------------------------------------------- * hypre_FEMatrix: *--------------------------------------------------------------------------*/ typedef struct hypre_FEMatrix_struct { MPI_Comm comm_; hypre_FEMesh *mesh_; } hypre_FEMatrix; typedef struct hypre_FEMatrix_struct *HYPRE_FEMatrix; #endif /****************************************************************************** * * Header info for the hypre_FEVector structures * *****************************************************************************/ #ifndef hypre_FE_VECTOR_HEADER #define hypre_FE_VECTOR_HEADER /*-------------------------------------------------------------------------- * hypre_FEVector: *--------------------------------------------------------------------------*/ typedef struct hypre_FEVector_struct { MPI_Comm comm_; hypre_FEMesh* mesh_; } hypre_FEVector; typedef struct hypre_FEVector_struct *HYPRE_FEVector; #endif /** * @name HYPRE's Finite Element Interface * * @memo A finite element-based conceptual interface **/ /*@{*/ /** * @name HYPRE FEI functions **/ /*@{*/ /*-------------------------------------------------------------------------- * HYPRE_fei_mesh.cxx *--------------------------------------------------------------------------*/ /** * Finite element interface constructor: this function creates an * instantiation of the HYPRE fei class. * @param comm - an MPI communicator * @param mesh - upon return, contains a pointer to the finite element mesh **/ int HYPRE_FEMeshCreate( MPI_Comm comm, HYPRE_FEMesh *mesh ); /** * Finite element interface destructor: this function destroys * the object as well as its internal memory allocations. * @param mesh - a pointer to the finite element mesh **/ int HYPRE_FEMeshDestroy( HYPRE_FEMesh mesh ); /** * This function passes the externally-built FEI object (for example, * Sandia's implementation of the FEI) as well as corresponding * LinearSystemCore object. * @param mesh - a pointer to the finite element mesh * @param externFEI - a pointer to the externally built finite element object * @param linSys - a pointer to the HYPRE linear system solver object built * using the HYPRE\_base\_create function. **/ int HYPRE_FEMeshSetFEObject(HYPRE_FEMesh mesh, void *externFEI, void *linSys); /** * The parameters function is the single most important function * to pass solver information (which solver, which preconditioner, * tolerance, other solver parameters) to the underlying solver. * @param mesh - a pointer to the finite element mesh * @param numParams - number of command strings * @param paramStrings - the command strings **/ int HYPRE_FEMeshParameters(HYPRE_FEMesh mesh, int numParams, char **paramStrings); /** * Each node or element variable has one or more fields. The field * information can be set up using this function. * @param mesh - a pointer to the finite element mesh * @param numFields - total number of fields for all variable types * @param fieldSizes - degree of freedom for each field type * @param fieldIDs - a list of field identifiers **/ int HYPRE_FEMeshInitFields( HYPRE_FEMesh mesh, int numFields, int *fieldSizes, int *fieldIDs ); /** * The whole finite element mesh can be broken down into a number of * element blocks. The attributes for each element block are: an * identifier, number of elements, number of nodes per elements, * the number of fields in each element node, etc. * @param mesh - a pointer to the finite element mesh * @param blockID - element block identifier * @param nElements - number of element in this block * @param numNodesPerElement - number of nodes per element in this block * @param numFieldsPerNode - number of fields for each node * @param nodalFieldIDs - field identifiers for the nodal unknowns * @param numElemDOFFieldsPerElement - number of fields for the element * @param elemDOFFieldIDs - field identifier for the element unknowns * @param interleaveStratety - indicates how unknowns are ordered */ int HYPRE_FEMeshInitElemBlock( HYPRE_FEMesh mesh, int blockID, int nElements, int numNodesPerElement, int *numFieldsPerNode, int **nodalFieldIDs, int numElemDOFFieldsPerElement, int *elemDOFFieldIDs, int interleaveStrategy ); /** * This function initializes element connectivity (that is, the node * identifiers associated with the current element) given an element * block identifier and the element identifier with the element block. * @param mesh - a pointer to the finite element mesh * @param blockID - element block identifier * @param elemID - element identifier * @param elemConn - a list of node identifiers for this element **/ int HYPRE_FEMeshInitElem( HYPRE_FEMesh mesh, int blockID, int elemID, int *elemConn ); /** * This function initializes the nodes that are shared between the * current processor and its neighbors. The FEI will decide a unique * processor each shared node will be assigned to. * @param mesh - a pointer to the finite element mesh * @param nShared - number of shared nodes * @param sharedIDs - shared node identifiers * @param sharedLengs - the number of processors each node shares with * @param sharedProcs - the processor identifiers each node shares with **/ int HYPRE_FEMeshInitSharedNodes( HYPRE_FEMesh mesh, int nShared, int *sharedIDs, int *sharedLeng, int **sharedProcs ); /** * This function signals to the FEI that the initialization step has * been completed. The loading step will follow. * @param mesh - a pointer to the finite element mesh **/ int HYPRE_FEMeshInitComplete( HYPRE_FEMesh mesh ); /** * This function loads the nodal boundary conditions. The boundary conditions * @param mesh - a pointer to the finite element mesh * @param nNodes - number of nodes boundary conditions are imposed * @param nodeIDs - nodal identifiers * @param fieldID - field identifier with nodes where BC are imposed * @param alpha - the multipliers for the field * @param beta - the multipliers for the normal derivative of the field * @param gamma - the boundary values on the right hand side of the equations **/ int HYPRE_FEMeshLoadNodeBCs( HYPRE_FEMesh mesh, int numNodes, int *nodeIDs, int fieldID, double **alpha, double **beta, double **gamma ); /** * This function adds the element contribution to the global stiffness matrix * and also the element load to the right hand side vector * @param mesh - a pointer to the finite element mesh * @param BlockID - element block identifier * @param elemID - element identifier * @param elemConn - a list of node identifiers for this element * @param elemStiff - element stiffness matrix * @param elemLoad - right hand side (load) for this element * @param elemFormat - the format the unknowns are passed in **/ int HYPRE_FEMeshSumInElem( HYPRE_FEMesh mesh, int blockID, int elemID, int* elemConn, double** elemStiffness, double *elemLoad, int elemFormat ); /** * This function differs from the sumInElem function in that the right hand * load vector is not passed. * @param mesh - a pointer to the finite element mesh * @param blockID - element block identifier * @param elemID - element identifier * @param elemConn - a list of node identifiers for this element * @param elemStiff - element stiffness matrix * @param elemFormat - the format the unknowns are passed in **/ int HYPRE_FEMeshSumInElemMatrix( HYPRE_FEMesh mesh, int blockID, int elemID, int* elemConn, double** elemStiffness, int elemFormat ); /** * This function adds the element load to the right hand side vector * @param mesh - a pointer to the finite element mesh * @param blockID - element block identifier * @param elemID - element identifier * @param elemConn - a list of node identifiers for this element * @param elemLoad - right hand side (load) for this element **/ int HYPRE_FEMeshSumInElemRHS( HYPRE_FEMesh mesh, int blockID, int elemID, int* elemConn, double* elemLoad ); /** * This function signals to the FEI that the loading phase has * been completed. * @param mesh - a pointer to the finite element mesh **/ int HYPRE_FEMeshLoadComplete( HYPRE_FEMesh mesh ); /** * This function tells the FEI to solve the linear system * @param mesh - a pointer to the finite element mesh **/ int HYPRE_FEMeshSolve( HYPRE_FEMesh mesh ); /** * This function sends a solution vector to the FEI * @param mesh - a pointer to the finite element mesh * @param sol - solution vector **/ int HYPRE_FEMeshSetSolution( HYPRE_FEMesh mesh, void *sol ); /** * This function returns the node identifiers given the element block. * @param mesh - a pointer to the finite element mesh * @param blockID - element block identifier * @param numNodes - the number of nodes * @param nodeIDList - the node identifiers **/ int HYPRE_FEMeshGetBlockNodeIDList( HYPRE_FEMesh mesh, int blockID, int numNodes, int *nodeIDList ); /** * This function returns the nodal solutions given the element block number. * @param mesh - a pointer to the finite element mesh * @param blockID - element block identifier * @param numNodes - the number of nodes * @param nodeIDList - the node identifiers * @param solnOffsets - the equation number for each nodal solution * @param solnValues - the nodal solution values **/ int HYPRE_FEMeshGetBlockNodeSolution( HYPRE_FEMesh mesh, int blockID, int numNodes, int *nodeIDList, int *solnOffsets, double *solnValues ); /*@}*/ /** * @name HYPRE FEI Matrix functions **/ /*@{*/ /*-------------------------------------------------------------------------- * HYPRE_fei_matrix.cxx *--------------------------------------------------------------------------*/ /** * Finite element matrix constructor * @param comm - an MPI communicator * @param mesh - a pointer to the finite element mesh * @param matrix - upon return, contains a pointer to the FE matrix **/ int HYPRE_FEMatrixCreate( MPI_Comm comm, HYPRE_FEMesh mesh, HYPRE_FEMatrix *matrix ); /** * Finite element matrix destructor * @param matrix - a pointer to the FE matrix **/ int HYPRE_FEMatrixDestroy( HYPRE_FEMatrix matrix ); /** * This function gets the underlying HYPRE parcsr matrix from the FE mesh * @param matrix - a pointer to the FE matrix * @param object - a pointer to the HYPRE parcsr matrix **/ int HYPRE_FEMatrixGetObject( HYPRE_FEMatrix matrix, void **object ); /*@}*/ /** * @name HYPRE FEI Matrix functions **/ /*@{*/ /*-------------------------------------------------------------------------- * HYPRE_fei_vector.cxx *--------------------------------------------------------------------------*/ /** * Finite element vector constructor * @param comm - an MPI communicator * @param mesh - a pointer to the finite element mesh * @param vector - upon return, contains a pointer to the FE vector **/ int HYPRE_FEVectorCreate( MPI_Comm comm , HYPRE_FEMesh mesh, HYPRE_FEVector *vector); /** * Finite element vector destructor * @param vector - a pointer to the FE vector **/ int HYPRE_FEVectorDestroy( HYPRE_FEVector vector ); /** * This function gets the underlying RHS vector from the FE mesh * @param vector - a pointer to the FE vector * @param object - upon return, points to the RHS vector **/ int HYPRE_FEVectorGetRHS( HYPRE_FEVector vector, void **object ); /** * This function gives the solution vector to the FE mesh * @param vector - a pointer to the FE vector * @param object - points to the solution vector **/ int HYPRE_FEVectorSetSol( HYPRE_FEVector vector, void *object ); /*@}*/ /*@}*/ #ifdef __cplusplus } #endif #endif hypre-2.33.0/src/FEI_mv/fei-hypre/fgmres.c000066400000000000000000000406551477326011500201610ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "_hypre_FEI.h" /****************************************************************************** * * FGMRES - flexible gmres * *****************************************************************************/ #include "utilities/_hypre_utilities.h" #include "HYPRE.h" #include "IJ_mv/HYPRE_IJ_mv.h" #include "parcsr_mv/HYPRE_parcsr_mv.h" #include "parcsr_mv/_hypre_parcsr_mv.h" #include "parcsr_ls/_hypre_parcsr_ls.h" #include "parcsr_ls/HYPRE_parcsr_ls.h" /*-------------------------------------------------------------------------- * hypre_FGMRESData *--------------------------------------------------------------------------*/ typedef struct { int max_iter; int stop_crit; int k_dim; double tol; double rel_residual_norm; void *A; void *w; void **p; void **z; void *r; void *matvec_data; int (*precond)(void*, void*, void*, void*); int (*precond_setup)(void*, void*, void*, void*); void *precond_data; int num_iterations; int logging; double *norms; char *log_file_name; int precond_tol_update; int (*precond_update_tol)(int*,double); } hypre_FGMRESData; /*-------------------------------------------------------------------------- * hypre_FGMRESCreate *--------------------------------------------------------------------------*/ void *hypre_FGMRESCreate() { hypre_FGMRESData *fgmres_data; fgmres_data = hypre_CTAlloc(hypre_FGMRESData, 1, HYPRE_MEMORY_HOST); /* set defaults */ (fgmres_data -> k_dim) = 5; (fgmres_data -> tol) = 1.0e-06; (fgmres_data -> max_iter) = 1000; (fgmres_data -> stop_crit) = 0; /* rel. residual norm */ (fgmres_data -> precond) = hypre_ParKrylovIdentity; (fgmres_data -> precond_setup) = hypre_ParKrylovIdentitySetup; (fgmres_data -> precond_data) = NULL; (fgmres_data -> logging) = 0; (fgmres_data -> p) = NULL; (fgmres_data -> z) = NULL; (fgmres_data -> r) = NULL; (fgmres_data -> w) = NULL; (fgmres_data -> matvec_data) = NULL; (fgmres_data -> norms) = NULL; (fgmres_data -> log_file_name) = NULL; (fgmres_data -> logging) = 0; (fgmres_data -> precond_tol_update) = 0; (fgmres_data -> precond_update_tol) = NULL; return (void *) fgmres_data; } /*-------------------------------------------------------------------------- * hypre_FGMRESDestroy *--------------------------------------------------------------------------*/ int hypre_FGMRESDestroy( void *fgmres_vdata ) { int i, ierr=0; hypre_FGMRESData *fgmres_data = (hypre_FGMRESData *) fgmres_vdata; if (fgmres_data) { if ( (fgmres_data->logging) > 0 && (fgmres_data->norms != NULL) ) hypre_TFree( fgmres_data -> norms , HYPRE_MEMORY_HOST); if ( (fgmres_data->matvec_data) != NULL ) hypre_ParKrylovMatvecDestroy(fgmres_data -> matvec_data); if ( (fgmres_data-> r) != NULL ) hypre_ParKrylovDestroyVector(fgmres_data -> r); if ( (fgmres_data-> w) != NULL ) hypre_ParKrylovDestroyVector(fgmres_data -> w); if ( (fgmres_data-> p) != NULL ) { for (i = 0; i < (fgmres_data -> k_dim+1); i++) hypre_ParKrylovDestroyVector((fgmres_data -> p)[i]); hypre_TFree( fgmres_data -> p , HYPRE_MEMORY_HOST); } if ( (fgmres_data-> z) != NULL ) { for (i = 0; i < (fgmres_data -> k_dim+1); i++) hypre_ParKrylovDestroyVector((fgmres_data -> z)[i]); hypre_TFree( fgmres_data -> z , HYPRE_MEMORY_HOST); } hypre_TFree( fgmres_data , HYPRE_MEMORY_HOST); } return(ierr); } /*-------------------------------------------------------------------------- * hypre_FGMRESSetup *--------------------------------------------------------------------------*/ int hypre_FGMRESSetup( void *fgmres_vdata, void *A, void *b, void *x ) { hypre_FGMRESData *fgmres_data = (hypre_FGMRESData *) fgmres_vdata; int k_dim = (fgmres_data -> k_dim); int max_iter = (fgmres_data -> max_iter); int (*precond_setup)(void*, void*, void*, void*) = (fgmres_data -> precond_setup); void *precond_data = (fgmres_data -> precond_data); int ierr = 0; (fgmres_data -> A) = A; if ((fgmres_data -> r) == NULL) (fgmres_data -> r) = hypre_ParKrylovCreateVector(b); if ((fgmres_data -> w) == NULL) (fgmres_data -> w) = hypre_ParKrylovCreateVector(b); if ((fgmres_data -> p) == NULL) (fgmres_data -> p) = (void**) hypre_ParKrylovCreateVectorArray(k_dim+1,b); if ((fgmres_data -> z) == NULL) (fgmres_data -> z) = (void**) hypre_ParKrylovCreateVectorArray(k_dim+1,b); if ((fgmres_data -> matvec_data) == NULL) (fgmres_data -> matvec_data) = hypre_ParKrylovMatvecCreate(A, x); ierr = precond_setup(precond_data, A, b, x); if ((fgmres_data -> logging) > 0) { if ((fgmres_data -> norms) == NULL) (fgmres_data -> norms) = hypre_CTAlloc(double, max_iter + 1, HYPRE_MEMORY_HOST); if ((fgmres_data -> log_file_name) == NULL) (fgmres_data -> log_file_name) = (char*) "fgmres.out.log"; } return ierr; } /*-------------------------------------------------------------------------- * hypre_FGMRESSolve *-------------------------------------------------------------------------*/ int hypre_FGMRESSolve(void *fgmres_vdata, void *A, void *b, void *x) { hypre_FGMRESData *fgmres_data = (hypre_FGMRESData *) fgmres_vdata; int k_dim = (fgmres_data -> k_dim); int max_iter = (fgmres_data -> max_iter); int stop_crit = (fgmres_data -> stop_crit); double accuracy = (fgmres_data -> tol); void *matvec_data = (fgmres_data -> matvec_data); void *r = (fgmres_data -> r); void **p = (fgmres_data -> p); void **z = (fgmres_data -> z); int (*precond)(void*, void*, void*, void*) = (fgmres_data -> precond); int *precond_data = (int*) (fgmres_data -> precond_data); int logging = (fgmres_data -> logging); double *norms = (fgmres_data -> norms); int tol_update = (fgmres_data -> precond_tol_update); int (*update_tol)(int*,double)= (fgmres_data -> precond_update_tol); int i, j, k, ierr = 0, iter, my_id, num_procs; double *rs, **hh, *c, *s, t; double epsilon, gamma, r_norm, b_norm, epsmac = 1.e-16; hypre_ParKrylovCommInfo(A,&my_id,&num_procs); /* initialize work arrays */ if (logging > 0) norms = (fgmres_data -> norms); rs = hypre_CTAlloc(double, k_dim+1, HYPRE_MEMORY_HOST); c = hypre_CTAlloc(double, k_dim, HYPRE_MEMORY_HOST); s = hypre_CTAlloc(double, k_dim, HYPRE_MEMORY_HOST); hh = hypre_CTAlloc(double*, k_dim+1, HYPRE_MEMORY_HOST); for (i=0; i < k_dim+1; i++) hh[i] = hypre_CTAlloc(double, k_dim, HYPRE_MEMORY_HOST); hypre_ParKrylovCopyVector(b,p[0]); /* compute initial residual */ hypre_ParKrylovMatvec(matvec_data,-1.0, A, x, 1.0, p[0]); r_norm = sqrt(hypre_ParKrylovInnerProd(p[0],p[0])); b_norm = sqrt(hypre_ParKrylovInnerProd(b,b)); if (logging > 0) { norms[0] = r_norm; if (my_id == 0) { printf("FGMRES : L2 norm of b: %e\n", b_norm); if (b_norm == 0.0) printf("Rel_resid_norm actually contains the residual norm\n"); printf("FGMRES : Initial L2 norm of residual: %e\n", r_norm); } } iter = 0; if (b_norm > 0.0) { /* convergence criterion |r_i| <= accuracy*|b| if |b| > 0 */ epsilon = accuracy * b_norm; } else { /* convergence criterion |r_i| <= accuracy*|r0| if |b| = 0 */ epsilon = accuracy * r_norm; }; /* convergence criterion |r_i| <= accuracy , absolute residual norm*/ if ( stop_crit ) epsilon = accuracy; while (iter < max_iter) { /* initialize first term of hessenberg system */ rs[0] = r_norm; if (r_norm == 0.0) { ierr = 0; return ierr; } if (r_norm <= epsilon && iter > 0) { hypre_ParKrylovCopyVector(b,r); hypre_ParKrylovMatvec(matvec_data,-1.0, A, x, 1.0, r); r_norm = sqrt(hypre_ParKrylovInnerProd(r,r)); if (r_norm <= epsilon) { if (logging > 0 && my_id == 0) printf("Final L2 norm of residual: %e\n\n", r_norm); break; } } t = 1.0 / r_norm; hypre_ParKrylovScaleVector(t,p[0]); i = 0; while (i < k_dim && r_norm > epsilon && iter < max_iter) { i++; iter++; hypre_ParKrylovClearVector(z[i-1]); if ( tol_update != 0 && update_tol != NULL ) update_tol(precond_data,r_norm/b_norm); precond(precond_data, A, p[i-1], z[i-1]); hypre_ParKrylovMatvec(matvec_data, 1.0, A, z[i-1], 0.0, p[i]); /* modified Gram_Schmidt */ for (j=0; j < i; j++) { hh[j][i-1] = hypre_ParKrylovInnerProd(p[j],p[i]); hypre_ParKrylovAxpy(-hh[j][i-1],p[j],p[i]); } t = sqrt(hypre_ParKrylovInnerProd(p[i],p[i])); hh[i][i-1] = t; if (t != 0.0) { t = 1.0/t; hypre_ParKrylovScaleVector(t, p[i]); } /* done with modified Gram_schmidt. update factorization of hh */ for (j = 1; j < i; j++) { t = hh[j-1][i-1]; hh[j-1][i-1] = c[j-1]*t + s[j-1]*hh[j][i-1]; hh[j][i-1] = -s[j-1]*t + c[j-1]*hh[j][i-1]; } gamma = sqrt(hh[i-1][i-1]*hh[i-1][i-1] + hh[i][i-1]*hh[i][i-1]); if (gamma == 0.0) gamma = epsmac; c[i-1] = hh[i-1][i-1]/gamma; s[i-1] = hh[i][i-1]/gamma; rs[i] = -s[i-1]*rs[i-1]; rs[i-1] = c[i-1]*rs[i-1]; /* determine residual norm */ hh[i-1][i-1] = c[i-1]*hh[i-1][i-1] + s[i-1]*hh[i][i-1]; r_norm = fabs(rs[i]); if (logging > 0) { norms[iter] = r_norm; if (my_id == 0) printf("FGMRES : iteration = %6d, norm of r = %e\n", iter, r_norm); } } /* now compute solution, first solve upper triangular system */ rs[i-1] = rs[i-1]/hh[i-1][i-1]; for (k = i-2; k >= 0; k--) { t = rs[k]; for (j = k+1; j < i; j++) t -= hh[k][j]*rs[j]; rs[k] = t/hh[k][k]; } for (j = 0; j < i; j++) hypre_ParKrylovAxpy(rs[j], z[j], x); /* check for convergence, evaluate actual residual */ hypre_ParKrylovCopyVector(b,p[0]); hypre_ParKrylovMatvec(matvec_data,-1.0, A, x, 1.0, p[0]); r_norm = sqrt(hypre_ParKrylovInnerProd(p[0],p[0])); if (r_norm <= epsilon) { if (logging > 0 && my_id == 0) printf("FGMRES Final L2 norm of residual: %e\n\n", r_norm); break; } } (fgmres_data -> num_iterations) = iter; if (b_norm > 0.0) (fgmres_data -> rel_residual_norm) = r_norm/b_norm; if (b_norm == 0.0) (fgmres_data -> rel_residual_norm) = r_norm; if (iter >= max_iter && r_norm > epsilon) ierr = 1; hypre_TFree(c, HYPRE_MEMORY_HOST); hypre_TFree(s, HYPRE_MEMORY_HOST); hypre_TFree(rs, HYPRE_MEMORY_HOST); for (i=0; i < k_dim+1; i++) hypre_TFree(hh[i], HYPRE_MEMORY_HOST); hypre_TFree(hh, HYPRE_MEMORY_HOST); return ierr; } /*-------------------------------------------------------------------------- * hypre_FGMRESSetKDim *--------------------------------------------------------------------------*/ int hypre_FGMRESSetKDim( void *fgmres_vdata, int k_dim ) { int ierr = 0; hypre_FGMRESData *fgmres_data = (hypre_FGMRESData *) fgmres_vdata; (fgmres_data -> k_dim) = k_dim; return ierr; } /*-------------------------------------------------------------------------- * hypre_FGMRESSetTol *--------------------------------------------------------------------------*/ int hypre_FGMRESSetTol( void *fgmres_vdata, double tol ) { int ierr = 0; hypre_FGMRESData *fgmres_data = (hypre_FGMRESData *) fgmres_vdata; (fgmres_data -> tol) = tol; return ierr; } /*-------------------------------------------------------------------------- * hypre_FGMRESSetMaxIter *--------------------------------------------------------------------------*/ int hypre_FGMRESSetMaxIter( void *fgmres_vdata, int max_iter ) { int ierr = 0; hypre_FGMRESData *fgmres_data = (hypre_FGMRESData *) fgmres_vdata; (fgmres_data -> max_iter) = max_iter; return ierr; } /*-------------------------------------------------------------------------- * hypre_FGMRESSetStopCrit *--------------------------------------------------------------------------*/ int hypre_FGMRESSetStopCrit( void *fgmres_vdata, double stop_crit ) { int ierr = 0; hypre_FGMRESData *fgmres_data = (hypre_FGMRESData *) fgmres_vdata; (fgmres_data -> stop_crit) = stop_crit; return ierr; } /*-------------------------------------------------------------------------- * hypre_FGMRESSetPrecond *--------------------------------------------------------------------------*/ int hypre_FGMRESSetPrecond( void *fgmres_vdata, int (*precond)(void*,void*,void*,void*), int (*precond_setup)(void*,void*,void*,void*), void *precond_data ) { int ierr = 0; hypre_FGMRESData *fgmres_data = (hypre_FGMRESData *) fgmres_vdata; (fgmres_data -> precond) = precond; (fgmres_data -> precond_setup) = precond_setup; (fgmres_data -> precond_data) = precond_data; return ierr; } /*-------------------------------------------------------------------------- * hypre_FGMRESGetPrecond *--------------------------------------------------------------------------*/ int hypre_FGMRESGetPrecond(void *fgmres_vdata, HYPRE_Solver *precond_data_ptr) { int ierr = 0; hypre_FGMRESData *fgmres_data = (hypre_FGMRESData *) fgmres_vdata; *precond_data_ptr = (HYPRE_Solver)(fgmres_data -> precond_data); return ierr; } /*-------------------------------------------------------------------------- * hypre_FGMRESSetLogging *--------------------------------------------------------------------------*/ int hypre_FGMRESSetLogging( void *fgmres_vdata, int logging ) { int ierr = 0; hypre_FGMRESData *fgmres_data = (hypre_FGMRESData *) fgmres_vdata; (fgmres_data -> logging) = logging; return ierr; } /*-------------------------------------------------------------------------- * hypre_FGMRESGetNumIterations *--------------------------------------------------------------------------*/ int hypre_FGMRESGetNumIterations( void *fgmres_vdata, int *num_iterations ) { int ierr = 0; hypre_FGMRESData *fgmres_data = (hypre_FGMRESData *) fgmres_vdata; *num_iterations = (fgmres_data -> num_iterations); return ierr; } /*-------------------------------------------------------------------------- * hypre_FGMRESGetFinalRelativeResidualNorm *--------------------------------------------------------------------------*/ int hypre_FGMRESGetFinalRelativeResidualNorm(void *fgmres_vdata, double *relative_residual_norm ) { int ierr = 0; hypre_FGMRESData *fgmres_data = (hypre_FGMRESData *) fgmres_vdata; *relative_residual_norm = (fgmres_data -> rel_residual_norm); return ierr; } /*-------------------------------------------------------------------------- * hypre_FGMRESUpdatePrecondTolerance *--------------------------------------------------------------------------*/ int hypre_FGMRESUpdatePrecondTolerance(void *fgmres_vdata, int (*update_tol)(int*, double)) { int ierr = 0; hypre_FGMRESData *fgmres_data = (hypre_FGMRESData *) fgmres_vdata; (fgmres_data -> precond_tol_update) = 1; (fgmres_data -> precond_update_tol) = update_tol; return ierr; } hypre-2.33.0/src/FEI_mv/fei-hypre/hypre_cfei.cxx000066400000000000000000000371461477326011500213740ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include #include #include "HYPRE.h" #include "LLNL_FEI_Impl.h" #include "utilities/_hypre_utilities.h" #include "hypre_cfei.h" /******************************************************************************/ /* constructor */ /*----------------------------------------------------------------------------*/ extern "C" HYPRE_FEI_Impl *HYPRE_FEI_create( MPI_Comm comm ) { HYPRE_FEI_Impl *cfei; LLNL_FEI_Impl *lfei; cfei = hypre_TAlloc(HYPRE_FEI_Impl, 1, HYPRE_MEMORY_HOST); lfei = new LLNL_FEI_Impl(comm); cfei->fei_ = (void *) lfei; return (cfei); } /******************************************************************************/ /* Destroy function */ /*----------------------------------------------------------------------------*/ extern "C" int HYPRE_FEI_destroy(HYPRE_FEI_Impl *fei) { LLNL_FEI_Impl *lfei; if (fei == NULL) return 1; lfei = (LLNL_FEI_Impl *) fei->fei_; if (lfei != NULL) delete lfei; return(0); } /******************************************************************************/ /* function for setting algorithmic parameters */ /*----------------------------------------------------------------------------*/ extern "C" int HYPRE_FEI_parameters(HYPRE_FEI_Impl *fei, int numParams, char **paramString) { LLNL_FEI_Impl *lfei; if (fei == NULL) return 1; if (fei->fei_ == NULL) return 1; lfei = (LLNL_FEI_Impl *) fei->fei_; lfei->parameters(numParams, paramString); return(0); } /******************************************************************************/ /* set solve type */ /*----------------------------------------------------------------------------*/ extern "C" int HYPRE_FEI_setSolveType(HYPRE_FEI_Impl *fei, int solveType) { LLNL_FEI_Impl *lfei; if (fei == NULL) return 1; if (fei->fei_ == NULL) return 1; lfei = (LLNL_FEI_Impl *) fei->fei_; lfei->setSolveType(solveType); return(0); } /******************************************************************************/ /* initialize different fields */ /*----------------------------------------------------------------------------*/ extern "C" int HYPRE_FEI_initFields(HYPRE_FEI_Impl *fei, int numFields, int *fieldSizes, int *fieldIDs) { LLNL_FEI_Impl *lfei; if (fei == NULL) return 1; if (fei->fei_ == NULL) return 1; lfei = (LLNL_FEI_Impl *) fei->fei_; lfei->initFields(numFields, fieldSizes, fieldIDs); return(0); } /******************************************************************************/ /* initialize element block */ /*----------------------------------------------------------------------------*/ extern "C" int HYPRE_FEI_initElemBlock(HYPRE_FEI_Impl *fei, int elemBlockID, int numElements, int numNodesPerElement, int *numFieldsPerNode, int **nodalFieldIDs, int numElemDOFFieldsPerElement, int *elemDOFFieldIDs, int interleaveStrategy) { LLNL_FEI_Impl *lfei; if (fei == NULL) return 1; if (fei->fei_ == NULL) return 1; lfei = (LLNL_FEI_Impl *) fei->fei_; lfei->initElemBlock(elemBlockID, numElements, numNodesPerElement, numFieldsPerNode, nodalFieldIDs, numElemDOFFieldsPerElement, elemDOFFieldIDs, interleaveStrategy); return(0); } /******************************************************************************/ /* initialize element connectivity */ /*----------------------------------------------------------------------------*/ extern "C" int HYPRE_FEI_initElem(HYPRE_FEI_Impl *fei, int elemBlockID, int elemID, int *elemConn) { LLNL_FEI_Impl *lfei; if (fei == NULL) return 1; if (fei->fei_ == NULL) return 1; lfei = (LLNL_FEI_Impl *) fei->fei_; lfei->initElem(elemBlockID, elemID, elemConn); return(0); } /******************************************************************************/ /* initialize shared nodes */ /*----------------------------------------------------------------------------*/ extern "C" int HYPRE_FEI_initSharedNodes(HYPRE_FEI_Impl *fei, int nShared, int *sharedIDs, int *sharedLeng, int **sharedProcs) { LLNL_FEI_Impl *lfei; if (fei == NULL) return 1; if (fei->fei_ == NULL) return 1; lfei = (LLNL_FEI_Impl *) fei->fei_; lfei->initSharedNodes(nShared, sharedIDs, sharedLeng, sharedProcs); return(0); } /******************************************************************************/ /* signal completion of initialization */ /*----------------------------------------------------------------------------*/ extern "C" int HYPRE_FEI_initComplete(HYPRE_FEI_Impl *fei) { LLNL_FEI_Impl *lfei; if (fei == NULL) return 1; if (fei->fei_ == NULL) return 1; lfei = (LLNL_FEI_Impl *) fei->fei_; lfei->initComplete(); return(0); } /******************************************************************************/ /* reset the whole system */ /*----------------------------------------------------------------------------*/ extern "C" int HYPRE_FEI_resetSystem(HYPRE_FEI_Impl *fei, double s) { LLNL_FEI_Impl *lfei; if (fei == NULL) return 1; if (fei->fei_ == NULL) return 1; lfei = (LLNL_FEI_Impl *) fei->fei_; lfei->resetSystem(s); return(0); } /******************************************************************************/ /* reset the matrix */ /*----------------------------------------------------------------------------*/ extern "C" int HYPRE_FEI_resetMatrix(HYPRE_FEI_Impl *fei, double s) { LLNL_FEI_Impl *lfei; if (fei == NULL) return 1; if (fei->fei_ == NULL) return 1; lfei = (LLNL_FEI_Impl *) fei->fei_; lfei->resetMatrix(s); return(0); } /******************************************************************************/ /* reset the right hand side */ /*----------------------------------------------------------------------------*/ extern "C" int HYPRE_FEI_resetRHSVector(HYPRE_FEI_Impl *fei, double s) { LLNL_FEI_Impl *lfei; if (fei == NULL) return 1; if (fei->fei_ == NULL) return 1; lfei = (LLNL_FEI_Impl *) fei->fei_; lfei->resetRHSVector(s); return(0); } /******************************************************************************/ /* reset the initial guess */ /*----------------------------------------------------------------------------*/ extern "C" int HYPRE_FEI_resetInitialGuess(HYPRE_FEI_Impl *fei, double s) { LLNL_FEI_Impl *lfei; if (fei == NULL) return 1; if (fei->fei_ == NULL) return 1; lfei = (LLNL_FEI_Impl *) fei->fei_; lfei->resetInitialGuess(s); return(0); } /******************************************************************************/ /* load boundary condition */ /*----------------------------------------------------------------------------*/ extern "C" int HYPRE_FEI_loadNodeBCs(HYPRE_FEI_Impl *fei, int nNodes, int *nodeIDs, int fieldID, double **alpha, double **beta, double **gamma) { LLNL_FEI_Impl *lfei; if (fei == NULL) return 1; if (fei->fei_ == NULL) return 1; lfei = (LLNL_FEI_Impl *) fei->fei_; lfei->loadNodeBCs(nNodes, nodeIDs, fieldID, alpha, beta, gamma); return(0); } /******************************************************************************/ /* submit element stiffness matrix (with right hand side) */ /*----------------------------------------------------------------------------*/ extern "C" int HYPRE_FEI_sumInElem(HYPRE_FEI_Impl *fei, int elemBlock, int elemID, int *elemConn, double **elemStiff, double *elemLoad, int elemFormat) { LLNL_FEI_Impl *lfei; if (fei == NULL) return 1; if (fei->fei_ == NULL) return 1; lfei = (LLNL_FEI_Impl *) fei->fei_; lfei->sumInElem(elemBlock, elemID, elemConn, elemStiff, elemLoad, elemFormat); return(0); } /******************************************************************************/ /* submit element stiffness matrix */ /*----------------------------------------------------------------------------*/ extern "C" int HYPRE_FEI_sumInElemMatrix(HYPRE_FEI_Impl *fei, int elemBlock, int elemID, int *elemConn, double **elemStiff, int elemFormat) { LLNL_FEI_Impl *lfei; if (fei == NULL) return 1; if (fei->fei_ == NULL) return 1; lfei = (LLNL_FEI_Impl *) fei->fei_; lfei->sumInElemMatrix(elemBlock,elemID,elemConn,elemStiff,elemFormat); return(0); } /******************************************************************************/ /* submit element right hand side */ /*----------------------------------------------------------------------------*/ extern "C" int HYPRE_FEI_sumInElemRHS(HYPRE_FEI_Impl *fei, int elemBlock, int elemID, int *elemConn, double *elemLoad) { LLNL_FEI_Impl *lfei; if (fei == NULL) return 1; if (fei->fei_ == NULL) return 1; lfei = (LLNL_FEI_Impl *) fei->fei_; lfei->sumInElemRHS(elemBlock, elemID, elemConn, elemLoad); return(0); } /******************************************************************************/ /* signal completion of loading */ /*----------------------------------------------------------------------------*/ extern "C" int HYPRE_FEI_loadComplete(HYPRE_FEI_Impl *fei) { LLNL_FEI_Impl *lfei; if (fei == NULL) return 1; if (fei->fei_ == NULL) return 1; lfei = (LLNL_FEI_Impl *) fei->fei_; lfei->loadComplete(); return(0); } /******************************************************************************/ /* solve the linear system */ /*----------------------------------------------------------------------------*/ extern "C" int HYPRE_FEI_solve(HYPRE_FEI_Impl *fei, int *status) { LLNL_FEI_Impl *lfei; if (fei == NULL) return 1; if (fei->fei_ == NULL) return 1; lfei = (LLNL_FEI_Impl *) fei->fei_; lfei->solve(status); return(0); } /******************************************************************************/ /* get the iteration count */ /*----------------------------------------------------------------------------*/ extern "C" int HYPRE_FEI_iterations(HYPRE_FEI_Impl *fei, int *iterTaken) { LLNL_FEI_Impl *lfei; if (fei == NULL) return 1; if (fei->fei_ == NULL) return 1; lfei = (LLNL_FEI_Impl *) fei->fei_; lfei->iterations(iterTaken); return(0); } /******************************************************************************/ /* compute residual norm of the solution */ /*----------------------------------------------------------------------------*/ extern "C" int HYPRE_FEI_residualNorm(HYPRE_FEI_Impl *fei, int whichNorm, int numFields, int* fieldIDs, double* norms) { LLNL_FEI_Impl *lfei; if (fei == NULL) return 1; if (fei->fei_ == NULL) return 1; lfei = (LLNL_FEI_Impl *) fei->fei_; lfei->residualNorm(whichNorm, numFields, fieldIDs, norms); return(0); } /******************************************************************************/ /* retrieve solution information (number of nodes) */ /*----------------------------------------------------------------------------*/ extern "C" int HYPRE_FEI_getNumBlockActNodes(HYPRE_FEI_Impl *fei, int blockID, int *nNodes) { LLNL_FEI_Impl *lfei; if (fei == NULL) return 1; if (fei->fei_ == NULL) return 1; lfei = (LLNL_FEI_Impl *) fei->fei_; lfei->getNumBlockActNodes(blockID, nNodes); return(0); } /******************************************************************************/ /* retrieve solution information (number of equations) */ /*----------------------------------------------------------------------------*/ extern "C" int HYPRE_FEI_getNumBlockActEqns(HYPRE_FEI_Impl *fei, int blockID, int *nEqns) { LLNL_FEI_Impl *lfei; if (fei == NULL) return 1; if (fei->fei_ == NULL) return 1; lfei = (LLNL_FEI_Impl *) fei->fei_; lfei->getNumBlockActEqns(blockID, nEqns); return(0); } /******************************************************************************/ /* retrieve solution information (node ID list) */ /*----------------------------------------------------------------------------*/ extern "C" int HYPRE_FEI_getBlockNodeIDList(HYPRE_FEI_Impl *fei, int blockID, int numNodes, int *nodeIDList) { LLNL_FEI_Impl *lfei; if (fei == NULL) return 1; if (fei->fei_ == NULL) return 1; lfei = (LLNL_FEI_Impl *) fei->fei_; lfei->getBlockNodeIDList(blockID, numNodes, nodeIDList); return(0); } /******************************************************************************/ /* retrieve solution information (actual solution) */ /*----------------------------------------------------------------------------*/ extern "C" int HYPRE_FEI_getBlockNodeSolution(HYPRE_FEI_Impl *fei, int blockID, int numNodes, int *nodeIDList, int *solnOffsets, double *solnValues) { LLNL_FEI_Impl *lfei; if (fei == NULL) return 1; if (fei->fei_ == NULL) return 1; lfei = (LLNL_FEI_Impl *) fei->fei_; lfei->getBlockNodeSolution(blockID, numNodes, nodeIDList, solnOffsets, solnValues); return(0); } /******************************************************************************/ /* initialze constraints */ /*----------------------------------------------------------------------------*/ extern "C" int HYPRE_FEI_initCRMult(HYPRE_FEI_Impl *fei, int CRListLen, int *CRNodeList, int *CRFieldList, int *CRID) { LLNL_FEI_Impl *lfei; if (fei == NULL) return 1; if (fei->fei_ == NULL) return 1; lfei = (LLNL_FEI_Impl *) fei->fei_; lfei->initCRMult(CRListLen, CRNodeList, CRFieldList, CRID); return(0); } /******************************************************************************/ /* load constraints */ /*----------------------------------------------------------------------------*/ extern "C" int HYPRE_FEI_loadCRMult(HYPRE_FEI_Impl *fei, int CRID, int CRListLen, int *CRNodeList, int *CRFieldList, double *CRWeightList, double CRValue) { LLNL_FEI_Impl *lfei; if (fei == NULL) return 1; if (fei->fei_ == NULL) return 1; lfei = (LLNL_FEI_Impl *) fei->fei_; lfei->loadCRMult(CRID, CRListLen, CRNodeList, CRFieldList, CRWeightList, CRValue); return(0); } hypre-2.33.0/src/FEI_mv/fei-hypre/hypre_cfei.h000066400000000000000000000066751477326011500210240ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #ifndef _hypre_cfei_h_ #define _hypre_cfei_h_ struct HYPRE_FEI_struct { void* fei_; }; typedef struct HYPRE_FEI_struct HYPRE_FEI_Impl; #ifdef __cplusplus extern "C" { #endif HYPRE_FEI_Impl *HYPRE_FEI_create( MPI_Comm comm ); int HYPRE_FEI_destroy(HYPRE_FEI_Impl* fei); int HYPRE_FEI_parameters(HYPRE_FEI_Impl *fei, int numParams, char **paramString); int HYPRE_FEI_setSolveType(HYPRE_FEI_Impl *fei, int solveType); int HYPRE_FEI_initFields(HYPRE_FEI_Impl *fei, int numFields, int *fieldSizes, int *fieldIDs); int HYPRE_FEI_initElemBlock(HYPRE_FEI_Impl *fei, int elemBlockID, int numElements, int numNodesPerElement, int *numFieldsPerNode, int **nodalFieldIDs, int numElemDOFFieldsPerElement, int *elemDOFFieldIDs, int interleaveStrategy); int HYPRE_FEI_initElem(HYPRE_FEI_Impl *fei, int elemBlockID, int elemID, int *elemConn); int HYPRE_FEI_initSharedNodes(HYPRE_FEI_Impl *fei, int nShared, int *sharedIDs, int *sharedLeng, int **sharedProcs); int HYPRE_FEI_initComplete(HYPRE_FEI_Impl *fei); int HYPRE_FEI_resetSystem(HYPRE_FEI_Impl *fei, double s); int HYPRE_FEI_resetMatrix(HYPRE_FEI_Impl *fei, double s); int HYPRE_FEI_resetRHSVector(HYPRE_FEI_Impl *fei, double s); int HYPRE_FEI_resetInitialGuess(HYPRE_FEI_Impl *fei, double s); int HYPRE_FEI_loadNodeBCs(HYPRE_FEI_Impl *fei, int nNodes, int *nodeIDs, int fieldID, double **alpha, double **beta, double **gamma); int HYPRE_FEI_sumInElem(HYPRE_FEI_Impl *fei, int elemBlock, int elemID, int *elemConn, double **elemStiff, double *elemLoad, int elemFormat); int HYPRE_FEI_sumInElemMatrix(HYPRE_FEI_Impl *fei, int elemBlock, int elemID, int* elemConn, double **elemStiffness, int elemFormat); int HYPRE_FEI_sumInElemRHS(HYPRE_FEI_Impl *fei, int elemBlock, int elemID, int *elemConn, double *elemLoad); int HYPRE_FEI_loadComplete(HYPRE_FEI_Impl *fei); int HYPRE_FEI_solve(HYPRE_FEI_Impl *fei, int *status); int HYPRE_FEI_iterations(HYPRE_FEI_Impl *fei, int *iterTaken); int HYPRE_FEI_residualNorm(HYPRE_FEI_Impl *fei, int whichNorm, int numFields, int* fieldIDs, double* norms); int HYPRE_FEI_getNumBlockActNodes(HYPRE_FEI_Impl *fei, int blockID, int *nNodes); int HYPRE_FEI_getNumBlockActEqns(HYPRE_FEI_Impl *fei, int blockID, int *nEqns); int HYPRE_FEI_getBlockNodeIDList(HYPRE_FEI_Impl *fei, int blockID, int numNodes, int *nodeIDList); int HYPRE_FEI_getBlockNodeSolution(HYPRE_FEI_Impl *fei, int blockID, int numNodes, int *nodeIDList, int *solnOffsets, double *solnValues); int HYPRE_FEI_initCRMult(HYPRE_FEI_Impl *fei, int CRListLen, int *CRNodeList, int *CRFieldList, int *CRID); int HYPRE_FEI_loadCRMult(HYPRE_FEI_Impl *fei, int CRID, int CRListLen, int *CRNodeList, int *CRFieldList, double *CRWeightList, double CRValue); #ifdef __cplusplus } #endif #endif hypre-2.33.0/src/FEI_mv/fei-hypre/hypre_lsi_amge.c000066400000000000000000000605631477326011500216650ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * HYPRE_LSI_AMGE interface * *****************************************************************************/ #ifdef HAVE_AMGE #include #include #include #include "utilities/_hypre_utilities.h" #include "HYPRE.h" #include "seq_ls/amge/AMGe_matrix_topology.h" #include "seq_mv/csr_matrix.h" extern int hypre_AMGeMatrixTopologySetup(hypre_AMGeMatrixTopology ***A, int *level, int *i_element_node_0, int *j_element_node_0, int num_elements, int num_nodes, int Max_level); extern int hypre_AMGeCoarsenodeSetup(hypre_AMGeMatrixTopology **A, int *level, int **i_node_neighbor_coarsenode, int **j_node_neighbor_coarsenode, int **i_node_coarsenode, int **j_node_coarsenode, int **i_block_node, int **j_block_node, int *Num_blocks, int *Num_elements, int *Num_nodes); /* ********************************************************************* */ /* local variables to this module */ /* ********************************************************************* */ int rowLeng=0; int *i_element_node_0; int *j_element_node_0; int num_nodes, num_elements; int *i_dof_on_boundary; int system_size=1, num_dofs; int element_count=0; int temp_elemat_cnt; int **temp_elem_node, *temp_elem_node_cnt; double **temp_elem_data; /* ********************************************************************* */ /* constructor */ /* ********************************************************************* */ int HYPRE_LSI_AMGeCreate() { printf("LSI_AMGe constructor\n"); i_element_node_0 = NULL; j_element_node_0 = NULL; num_nodes = 0; num_elements = 0; system_size = 1; num_dofs = 0; element_count = 0; temp_elemat_cnt = 0; temp_elem_node = NULL; temp_elem_node_cnt = NULL; temp_elem_data = NULL; i_dof_on_boundary = NULL; return 0; } /* ********************************************************************* */ /* destructor */ /* ********************************************************************* */ int HYPRE_LSI_AMGeDestroy() { int i; printf("LSI_AMGe destructor\n"); hypre_TFree(i_element_node_0, HYPRE_MEMORY_HOST); hypre_TFree(j_element_node_0, HYPRE_MEMORY_HOST); hypre_TFree(i_dof_on_boundary, HYPRE_MEMORY_HOST); hypre_TFree(temp_elem_node_cnt, HYPRE_MEMORY_HOST); for ( i = 0; i < num_elements; i++ ) { hypre_TFree(temp_elem_node[i], HYPRE_MEMORY_HOST); hypre_TFree(temp_elem_data[i], HYPRE_MEMORY_HOST); } temp_elem_node = NULL; temp_elem_node_cnt = NULL; temp_elem_data = NULL; return 0; } /* ********************************************************************* */ /* set the number of nodes in the finest grid */ /* ********************************************************************* */ int HYPRE_LSI_AMGeSetNNodes(int nNodes) { int i; printf("LSI_AMGe NNodes = %d\n", nNodes); num_nodes = nNodes; return 0; } /* ********************************************************************* */ /* set the number of elements in the finest grid */ /* ********************************************************************* */ int HYPRE_LSI_AMGeSetNElements(int nElems) { int i, nbytes; printf("LSI_AMGe NElements = %d\n", nElems); num_elements = nElems; nbytes = num_elements * sizeof(double*); temp_elem_data = hypre_TAlloc( nbytes ,HYPRE_MEMORY_HOST); for ( i = 0; i < num_elements; i++ ) temp_elem_data[i] = NULL; nbytes = num_elements * sizeof(int*); temp_elem_node = hypre_TAlloc( nbytes ,HYPRE_MEMORY_HOST); for ( i = 0; i < num_elements; i++ ) temp_elem_node[i] = NULL; nbytes = num_elements * sizeof(int); temp_elem_node_cnt = hypre_TAlloc( nbytes ,HYPRE_MEMORY_HOST); return 0; } /* ********************************************************************* */ /* set system size */ /* ********************************************************************* */ int HYPRE_LSI_AMGeSetSystemSize(int size) { printf("LSI_AMGe SystemSize = %d\n", size); system_size = size; return 0; } /* ********************************************************************* */ /* set boundary condition */ /* ********************************************************************* */ int HYPRE_LSI_AMGeSetBoundary(int size, int *list) { int i; printf("LSI_AMGe SetBoundary = %d\n", size); if ( i_dof_on_boundary == NULL ) i_dof_on_boundary = hypre_TAlloc(int, num_nodes * system_size , HYPRE_MEMORY_HOST); for ( i = 0; i < num_nodes*system_size; i++ ) i_dof_on_boundary[i] = -1; for ( i = 0; i < size; i++ ) { if (list[i] >= 0 && list[i] < num_nodes*system_size) i_dof_on_boundary[list[i]] = 0; else printf("AMGeSetBoundary ERROR : %d(%d)\n", list[i],num_nodes*system_size); } return 0; } /* ********************************************************************* */ /* load a row into this module */ /* ********************************************************************* */ int HYPRE_LSI_AMGePutRow(int row, int length, const double *colVal, const int *colInd) { int i, nbytes; if ( rowLeng == 0 ) { if ( element_count % 100 == 0 ) printf("LSI_AMGe PutRow %d\n", element_count); if ( element_count < 0 || element_count >= num_elements ) printf("ERROR : element count too large %d\n",element_count); temp_elem_node_cnt[element_count] = length / system_size; nbytes = length / system_size * sizeof(int); temp_elem_node[element_count] = hypre_TAlloc( nbytes ,HYPRE_MEMORY_HOST); for ( i = 0; i < length; i+=system_size ) temp_elem_node[element_count][i/system_size] = (colInd[i]-1)/system_size; nbytes = length * length * sizeof(double); temp_elem_data[element_count] = hypre_TAlloc(nbytes,HYPRE_MEMORY_HOST); temp_elemat_cnt = 0; rowLeng = length; } for ( i = 0; i < length; i++ ) temp_elem_data[element_count][temp_elemat_cnt++] = colVal[i]; if ( temp_elemat_cnt == rowLeng * rowLeng ) { element_count++; rowLeng = 0; } return 0; } /* ********************************************************************* */ /* Solve */ /* ********************************************************************* */ int HYPRE_LSI_AMGeSolve(double *rhs, double *x) { int i, j, l, counter, ierr, total_length; int *Num_nodes, *Num_elements, *Num_dofs, level; int max_level, Max_level; int multiplier; /* coarsenode information and coarsenode neighborhood information */ int **i_node_coarsenode, **j_node_coarsenode; int **i_node_neighbor_coarsenode, **j_node_neighbor_coarsenode; /* PDEsystem information: --------------------------------------- */ int *i_dof_node_0, *j_dof_node_0; int *i_node_dof_0, *j_node_dof_0; int *i_element_dof_0, *j_element_dof_0; double *element_data; int **i_node_dof, **j_node_dof; /* Dirichlet boundary conditions information: ------------------- */ /* int *i_dof_on_boundary; */ /* nested dissection blocks: ------------------------------------ */ int **i_block_node, **j_block_node; int *Num_blocks; /* nested dissection ILU(1) smoother: --------------------------- */ /* internal format: --------------------------------------------- */ int **i_ILUdof_to_dof; int **i_ILUdof_ILUdof_t, **j_ILUdof_ILUdof_t, **i_ILUdof_ILUdof, **j_ILUdof_ILUdof; double **LD_data, **U_data; /* -------------------------------------------------------------- */ /* PCG & V_cycle arrays: */ /* -------------------------------------------------------------- */ double *r, *v, **w, **d, *aux, *v_coarse, *w_coarse; double *d_coarse, *v_fine, *w_fine, *d_fine; int max_iter = 1000; int coarse_level; int nu = 1; /* not used ---------------------------------------- */ double reduction_factor; /* Interpolation P and stiffness matrices Matrix; --------------- */ hypre_CSRMatrix **P; hypre_CSRMatrix **Matrix; hypre_AMGeMatrixTopology **A; /* element matrices information: -------------------------------- */ int *i_element_chord_0, *j_element_chord_0; double *a_element_chord_0; int *i_chord_dof_0, *j_chord_dof_0; int *Num_chords; /* auxiliary arrays for enforcing Dirichlet boundary conditions: */ int *i_dof_dof_a, *j_dof_dof_a; double *a_dof_dof; /* ===============================================================*/ /* set num_nodes, num_elements */ /* fill up element_data */ /* fill up i_element_node_0 and j_element_node_0 */ /* fill up i_dof_on_boundary (0 - boundary, 1 - otherwise) */ /* ===============================================================*/ num_elements = element_count; if ( num_nodes == 0 || num_elements == 0 ) { printf("HYPRE_LSI_AMGe ERROR : num_nodes or num_elements not set.\n"); exit(1); } total_length = 0; for ( i = 0; i < num_elements; i++ ) { multiplier = temp_elem_node_cnt[i] * system_size; total_length += (multiplier * multiplier); } element_data = hypre_TAlloc(double, total_length , HYPRE_MEMORY_HOST); counter = 0; for ( i = 0; i < num_elements; i++ ) { multiplier = temp_elem_node_cnt[i] * system_size; multiplier *= multiplier; for ( j = 0; j < multiplier; j++ ) element_data[counter++] = temp_elem_data[i][j]; hypre_TFree(temp_elem_data[i], HYPRE_MEMORY_HOST); } hypre_TFree(temp_elem_data, HYPRE_MEMORY_HOST); temp_elem_data = NULL; total_length = 0; for (i = 0; i < num_elements; i++) total_length += temp_elem_node_cnt[i]; i_element_node_0 = hypre_TAlloc(int, (num_elements + 1) , HYPRE_MEMORY_HOST); j_element_node_0 = hypre_TAlloc(int, total_length , HYPRE_MEMORY_HOST); counter = 0; for (i = 0; i < num_elements; i++) { i_element_node_0[i] = counter; for (j = 0; j < temp_elem_node_cnt[i]; j++) j_element_node_0[counter++] = temp_elem_node[i][j]; hypre_TFree(temp_elem_node[i], HYPRE_MEMORY_HOST); } i_element_node_0[num_elements] = counter; hypre_TFree(temp_elem_node, HYPRE_MEMORY_HOST); temp_elem_node = NULL; /* -------------------------------------------------------------- */ /* initialization */ /* -------------------------------------------------------------- */ Max_level = 25; Num_chords = hypre_CTAlloc(int, Max_level, HYPRE_MEMORY_HOST); Num_elements = hypre_CTAlloc(int, Max_level, HYPRE_MEMORY_HOST); Num_nodes = hypre_CTAlloc(int, Max_level, HYPRE_MEMORY_HOST); Num_dofs = hypre_CTAlloc(int, Max_level, HYPRE_MEMORY_HOST); Num_blocks = hypre_CTAlloc(int, Max_level, HYPRE_MEMORY_HOST); for (i = 0; i < Max_level; i++) { Num_dofs[i] = 0; Num_elements[i] = 0; } Num_nodes[0] = num_nodes; Num_elements[0] = num_elements; /* -------------------------------------------------------------- */ /* set up matrix topology for the fine matrix */ /* input : i_element_node_0, j_element_node_0, num_elements, */ /* num_nodes, Max_level */ /* -------------------------------------------------------------- */ printf("LSI_AMGe Solve : Setting up topology \n"); ierr = hypre_AMGeMatrixTopologySetup(&A, &level, i_element_node_0, j_element_node_0, num_elements, num_nodes, Max_level); max_level = level; /* -------------------------------------------------------------- */ /* set up matrix topology for the coarse grids */ /* input : A, Num_elements[0], Num_nodes[0] */ /* -------------------------------------------------------------- */ printf("LSI_AMGe Solve : Setting up coarse grids \n"); ierr = hypre_AMGeCoarsenodeSetup(A, &level, &i_node_neighbor_coarsenode, &j_node_neighbor_coarsenode, &i_node_coarsenode, &j_node_coarsenode, &i_block_node, &j_block_node, Num_blocks, Num_elements, Num_nodes); /* -------------------------------------------------------------- */ /* set up dof arrays based on system size */ /* output : i_dof_node_0, j_dof_node_0, num_dofs */ /* -------------------------------------------------------------- */ ierr = compute_dof_node(&i_dof_node_0, &j_dof_node_0, Num_nodes[0], system_size, &num_dofs); Num_dofs[0] = num_dofs; /* if (system_size == 1) i_dof_on_boundary = i_node_on_boundary; else { ierr = compute_dof_on_boundary(&i_dof_on_boundary, i_node_on_boundary, Num_nodes[0], system_size); hypre_TFree(i_node_on_boundary, HYPRE_MEMORY_HOST); i_node_on_boundary = NULL; } */ /* -------------------------------------------------------------- */ /* get element_dof information */ /* -------------------------------------------------------------- */ ierr = transpose_matrix_create(&i_node_dof_0, &j_node_dof_0, i_dof_node_0, j_dof_node_0, Num_dofs[0], Num_nodes[0]); if (system_size == 1) { i_element_dof_0 = i_element_node_0; j_element_dof_0 = j_element_node_0; } else ierr = matrix_matrix_product(&i_element_dof_0, &j_element_dof_0, i_element_node_0,j_element_node_0,i_node_dof_0,j_node_dof_0, Num_elements[0], Num_nodes[0], Num_dofs[0]); /* -------------------------------------------------------------- */ /* store element matrices in element_chord format */ /* -------------------------------------------------------------- */ printf("LSI_AMGe Solve : Setting up element dof relations \n"); ierr = hypre_AMGeElementMatrixDof(i_element_dof_0, j_element_dof_0, element_data, &i_element_chord_0, &j_element_chord_0, &a_element_chord_0, &i_chord_dof_0, &j_chord_dof_0, &Num_chords[0], Num_elements[0], Num_dofs[0]); printf("LSI_AMGe Solve : Setting up interpolation \n"); ierr = hypre_AMGeInterpolationSetup(&P, &Matrix, A, &level, /* ------ fine-grid element matrices ----- */ i_element_chord_0, j_element_chord_0, a_element_chord_0, i_chord_dof_0, j_chord_dof_0, /* nnz: of the assembled matrices -------*/ Num_chords, /* ----- coarse node information ------ */ i_node_neighbor_coarsenode, j_node_neighbor_coarsenode, i_node_coarsenode, j_node_coarsenode, /* --------- Dirichlet b.c. ----------- */ i_dof_on_boundary, /* -------- PDEsystem information -------- */ system_size, i_dof_node_0, j_dof_node_0, i_node_dof_0, j_node_dof_0, &i_node_dof, &j_node_dof, Num_elements, Num_nodes, Num_dofs); hypre_TFree(i_dof_on_boundary, HYPRE_MEMORY_HOST); i_dof_on_boundary = NULL; hypre_TFree(i_dof_node_0, HYPRE_MEMORY_HOST); hypre_TFree(j_dof_node_0, HYPRE_MEMORY_HOST); printf("LSI_AMGe Solve : Setting up smoother \n"); ierr = hypre_AMGeSmootherSetup(&i_ILUdof_to_dof, &i_ILUdof_ILUdof, &j_ILUdof_ILUdof, &LD_data, &i_ILUdof_ILUdof_t, &j_ILUdof_ILUdof_t, &U_data, Matrix, &level, i_block_node, j_block_node, i_node_dof, j_node_dof, Num_blocks, Num_nodes, Num_dofs); hypre_TFree(i_node_dof_0, HYPRE_MEMORY_HOST); hypre_TFree(j_node_dof_0, HYPRE_MEMORY_HOST); for (l=0; l < level+1; l++) { hypre_TFree(i_block_node[l], HYPRE_MEMORY_HOST); hypre_TFree(j_block_node[l], HYPRE_MEMORY_HOST); } for (l=1; l < level+1; l++) { hypre_TFree(i_node_dof[l], HYPRE_MEMORY_HOST); hypre_TFree(j_node_dof[l], HYPRE_MEMORY_HOST); } hypre_TFree(i_node_dof, HYPRE_MEMORY_HOST); hypre_TFree(j_node_dof, HYPRE_MEMORY_HOST); hypre_TFree(i_block_node, HYPRE_MEMORY_HOST); hypre_TFree(j_block_node, HYPRE_MEMORY_HOST); /* ===================================================================== */ /* =================== S O L U T I O N P A R T: ====================== */ /* ===================================================================== */ /* one V(1,1) --cycle as preconditioner in PCG: ======================== */ /* ILU solve pre--smoothing, ILU solve post--smoothing; ================ */ w = hypre_CTAlloc(double*, level+1, HYPRE_MEMORY_HOST); d = hypre_CTAlloc(double*, level+1, HYPRE_MEMORY_HOST); for (l=0; l < level+1; l++) { Num_dofs[l] = Num_nodes[l] * system_size; if (Num_dofs[l] > 0) { w[l] = hypre_CTAlloc(double, Num_dofs[l], HYPRE_MEMORY_HOST); d[l] = hypre_CTAlloc(double, Num_dofs[l], HYPRE_MEMORY_HOST); } else { level = l-1; break; } } num_dofs = Num_dofs[0]; /*x = hypre_CTAlloc(double, num_dofs); */ /*rhs = hypre_CTAlloc(double, num_dofs);*/ r = hypre_CTAlloc(double, num_dofs, HYPRE_MEMORY_HOST); aux = hypre_CTAlloc(double, num_dofs, HYPRE_MEMORY_HOST); v_fine = hypre_CTAlloc(double, num_dofs, HYPRE_MEMORY_HOST); w_fine = hypre_CTAlloc(double, num_dofs, HYPRE_MEMORY_HOST); d_fine = hypre_CTAlloc(double, num_dofs, HYPRE_MEMORY_HOST); coarse_level = level; v_coarse = hypre_CTAlloc(double, Num_dofs[coarse_level], HYPRE_MEMORY_HOST); w_coarse = hypre_CTAlloc(double, Num_dofs[coarse_level], HYPRE_MEMORY_HOST); d_coarse = hypre_CTAlloc(double, Num_dofs[coarse_level], HYPRE_MEMORY_HOST); for (l=0; l < level; l++) { printf("\n\n=======================================================\n"); printf(" Testing level[%d] PCG solve: \n",l); printf("===========================================================\n"); for (i=0; i < Num_dofs[l]; i++) x[i] = 0.e0; /* for (i=0; i < Num_dofs[l]; i++) rhs[i] = rand(); */ i_dof_dof_a = hypre_CSRMatrixI(Matrix[l]); j_dof_dof_a = hypre_CSRMatrixJ(Matrix[l]); a_dof_dof = hypre_CSRMatrixData(Matrix[l]); ierr = hypre_ILUsolve(x, i_ILUdof_to_dof[l], i_ILUdof_ILUdof[l], j_ILUdof_ILUdof[l], LD_data[l], i_ILUdof_ILUdof_t[l], j_ILUdof_ILUdof_t[l], U_data[l], rhs, Num_dofs[l]); ierr = hypre_ILUpcg(x, rhs, a_dof_dof, i_dof_dof_a, j_dof_dof_a, i_ILUdof_to_dof[l], i_ILUdof_ILUdof[l], j_ILUdof_ILUdof[l], LD_data[l], i_ILUdof_ILUdof_t[l], j_ILUdof_ILUdof_t[l], U_data[l], v_fine, w_fine, d_fine, max_iter, Num_dofs[l]); printf("\n\n=======================================================\n"); printf(" END test PCG solve: \n"); printf("===========================================================\n"); } printf("\n\n===============================================================\n"); printf(" ------- V_cycle & nested dissection ILU(1) smoothing: --------\n"); printf("================================================================\n"); num_dofs = Num_dofs[0]; /* for (i=0; i < num_dofs; i++) rhs[i] = rand(); */ ierr = hypre_VcycleILUpcg(x, rhs, w, d, &reduction_factor, Matrix, i_ILUdof_to_dof, i_ILUdof_ILUdof, j_ILUdof_ILUdof, LD_data, i_ILUdof_ILUdof_t, j_ILUdof_ILUdof_t, U_data, P, aux, r, v_fine, w_fine, d_fine, max_iter, v_coarse, w_coarse, d_coarse, nu, level, coarse_level, Num_dofs); /* hypre_TFree(x); */ /* hypre_TFree(rhs); */ hypre_TFree(r, HYPRE_MEMORY_HOST); hypre_TFree(aux, HYPRE_MEMORY_HOST); for (l=0; l < level+1; l++) if (Num_dofs[l] > 0) { hypre_TFree(w[l], HYPRE_MEMORY_HOST); hypre_TFree(d[l], HYPRE_MEMORY_HOST); hypre_CSRMatrixDestroy(Matrix[l]); } for (l=0; l < max_level; l++) { hypre_TFree(i_node_coarsenode[l], HYPRE_MEMORY_HOST); hypre_TFree(j_node_coarsenode[l], HYPRE_MEMORY_HOST); hypre_TFree(i_node_neighbor_coarsenode[l], HYPRE_MEMORY_HOST); hypre_TFree(j_node_neighbor_coarsenode[l], HYPRE_MEMORY_HOST); if (system_size == 1 &&Num_dofs[l+1] > 0) { hypre_CSRMatrixI(P[l]) = NULL; hypre_CSRMatrixJ(P[l]) = NULL; } } for (l=0; l < level; l++) { hypre_TFree(i_ILUdof_to_dof[l], HYPRE_MEMORY_HOST); hypre_TFree(i_ILUdof_ILUdof[l], HYPRE_MEMORY_HOST); hypre_TFree(j_ILUdof_ILUdof[l], HYPRE_MEMORY_HOST); hypre_TFree(LD_data[l], HYPRE_MEMORY_HOST); hypre_TFree(i_ILUdof_ILUdof_t[l], HYPRE_MEMORY_HOST); hypre_TFree(j_ILUdof_ILUdof_t[l], HYPRE_MEMORY_HOST); hypre_TFree(U_data[l], HYPRE_MEMORY_HOST); hypre_CSRMatrixDestroy(P[l]); } hypre_TFree(v_fine, HYPRE_MEMORY_HOST); hypre_TFree(w_fine, HYPRE_MEMORY_HOST); hypre_TFree(d_fine, HYPRE_MEMORY_HOST); hypre_TFree(w, HYPRE_MEMORY_HOST); hypre_TFree(d, HYPRE_MEMORY_HOST); hypre_TFree(v_coarse, HYPRE_MEMORY_HOST); hypre_TFree(w_coarse, HYPRE_MEMORY_HOST); hypre_TFree(d_coarse, HYPRE_MEMORY_HOST); for (l=0; l < max_level+1; l++) hypre_DestroyAMGeMatrixTopology(A[l]); hypre_TFree(Num_nodes, HYPRE_MEMORY_HOST); hypre_TFree(Num_elements, HYPRE_MEMORY_HOST); hypre_TFree(Num_dofs, HYPRE_MEMORY_HOST); hypre_TFree(Num_blocks, HYPRE_MEMORY_HOST); hypre_TFree(Num_chords, HYPRE_MEMORY_HOST); hypre_TFree(i_chord_dof_0, HYPRE_MEMORY_HOST); hypre_TFree(j_chord_dof_0, HYPRE_MEMORY_HOST); hypre_TFree(i_element_chord_0, HYPRE_MEMORY_HOST); hypre_TFree(j_element_chord_0, HYPRE_MEMORY_HOST); hypre_TFree(a_element_chord_0, HYPRE_MEMORY_HOST); hypre_TFree(P, HYPRE_MEMORY_HOST); hypre_TFree(Matrix, HYPRE_MEMORY_HOST); hypre_TFree(A, HYPRE_MEMORY_HOST); hypre_TFree(i_ILUdof_to_dof, HYPRE_MEMORY_HOST); hypre_TFree(i_ILUdof_ILUdof, HYPRE_MEMORY_HOST); hypre_TFree(j_ILUdof_ILUdof, HYPRE_MEMORY_HOST); hypre_TFree(LD_data, HYPRE_MEMORY_HOST); hypre_TFree(i_ILUdof_ILUdof_t, HYPRE_MEMORY_HOST); hypre_TFree(j_ILUdof_ILUdof_t, HYPRE_MEMORY_HOST); hypre_TFree(U_data, HYPRE_MEMORY_HOST); hypre_TFree(i_node_coarsenode, HYPRE_MEMORY_HOST); hypre_TFree(j_node_coarsenode, HYPRE_MEMORY_HOST); hypre_TFree(i_node_neighbor_coarsenode, HYPRE_MEMORY_HOST); hypre_TFree(j_node_neighbor_coarsenode, HYPRE_MEMORY_HOST); hypre_TFree(element_data, HYPRE_MEMORY_HOST); return 0; } /* ********************************************************************* */ /* local variables to this module */ /* ********************************************************************* */ int HYPRE_LSI_AMGeWriteToFile() { int i, j, k, length; FILE *fp; fp = fopen("elem_mat", "w"); for ( i = 0; i < element_count; i++ ) { length = temp_elem_node_cnt[i] * system_size; for ( j = 0; j < length; j++ ) { for ( k = 0; k < length; k++ ) fprintf(fp, "%13.6e ", temp_elem_data[i][j*length+k]); fprintf(fp, "\n"); } fprintf(fp, "\n"); } fclose(fp); fp = fopen("elem_node", "w"); fprintf(fp, "%d %d\n", element_count, num_nodes); for (i = 0; i < element_count; i++) { for (j = 0; j < temp_elem_node_cnt[i]; j++) fprintf(fp, "%d ", temp_elem_node[i][j]+1); fprintf(fp,"\n"); } fclose(fp); fp = fopen("node_bc", "w"); for (i = 0; i < num_nodes*system_size; i++) { fprintf(fp, "%d\n", i_dof_on_boundary[i]); } fclose(fp); return 0; } #else /* this is used only to eliminate compiler warnings */ int hypre_empty4; #endif hypre-2.33.0/src/FEI_mv/fei-hypre/hypre_lsi_ddamg.c000066400000000000000000001344511477326011500220260ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include #include #include #include #define habs(x) ((x > 0 ) ? x : -(x)) /*-------------------------------------------------------------------------*/ /* parcsr_mv.h is put here instead of in HYPRE_LinSysCore.h */ /* because it gives warning when compiling cfei.cc */ /*-------------------------------------------------------------------------*/ #include "utilities/_hypre_utilities.h" #include "HYPRE.h" #include "IJ_mv/HYPRE_IJ_mv.h" #include "parcsr_mv/HYPRE_parcsr_mv.h" #include "parcsr_mv/_hypre_parcsr_mv.h" #include "parcsr_ls/HYPRE_parcsr_ls.h" /* RDF: What is MPIAPI? */ #ifndef MPIAPI #define MPIAPI #endif int HYPRE_DummySetup(HYPRE_Solver solver, HYPRE_ParCSRMatrix A_csr, HYPRE_ParVector x_csr, HYPRE_ParVector y_csr ){return 0;} void HYPRE_LSI_Get_IJAMatrixFromFile(double**,int**,int**,int*,double**, char*,char*); extern int MPIAPI MPI_Comm_split(MPI_Comm, int, int, MPI_Comm *); /***************************************************************************/ /***************************************************************************/ /* This section investigates the use of domain decomposition preconditioner*/ /* using AMG. */ /***************************************************************************/ /***************************************************************************/ /***************************************************************************/ /* local variables for preconditioning (bad idea, but...) */ /***************************************************************************/ HYPRE_IJMatrix localA; HYPRE_IJVector localb; HYPRE_IJVector localx; int myBegin, myEnd, myRank; int interior_nrows, *offRowLengths; int **offColInd; int *remap_array; double **offColVal; MPI_Comm parComm; HYPRE_Solver cSolver; HYPRE_Solver cPrecon; /***************************************************************************/ /* Apply [I ] */ /* [E_ob] vb */ /***************************************************************************/ int HYPRE_LocalAMGSolve(HYPRE_Solver solver, HYPRE_ParVector x_csr, HYPRE_ParVector y_csr ) { int i, local_nrows, *temp_list; HYPRE_ParCSRMatrix LA_csr; HYPRE_ParVector Lx_csr; HYPRE_ParVector Lb_csr; hypre_ParVector *x_par; hypre_ParVector *y_par; hypre_Vector *x_par_local; hypre_Vector *y_par_local; double *x_par_data ; double *y_par_data ; double *temp_vect; hypre_ParVector *Lx_par; hypre_Vector *Lx_local; double *Lx_data; /* --------------------------------------------------------*/ /* fetch data pointer of input and output vectors */ /* --------------------------------------------------------*/ local_nrows = myEnd - myBegin + 1; x_par = (hypre_ParVector *) x_csr; x_par_local = hypre_ParVectorLocalVector(x_par); x_par_data = hypre_VectorData(x_par_local); y_par = (hypre_ParVector *) y_csr; y_par_local = hypre_ParVectorLocalVector(y_par); y_par_data = hypre_VectorData(y_par_local); /* --------------------------------------------------------*/ /* create localb & localx of length = no. of interior nodes*/ /* --------------------------------------------------------*/ temp_list = hypre_TAlloc(int, interior_nrows , HYPRE_MEMORY_HOST); temp_vect = hypre_TAlloc(double, interior_nrows , HYPRE_MEMORY_HOST); for (i = 0; i < interior_nrows; i++) temp_list[i] = i; for (i = 0; i < local_nrows; i++) { if (remap_array[i] >= 0) temp_vect[remap_array[i]] = x_par_data[i]; } HYPRE_IJVectorSetValues(localb,interior_nrows,(const int *) temp_list, temp_vect); hypre_TFree(temp_list, HYPRE_MEMORY_HOST); hypre_TFree(temp_vect, HYPRE_MEMORY_HOST); /* --------------------------------------------------------*/ /* perform one cycle of AMG to subdomain (internal nodes) */ /* --------------------------------------------------------*/ HYPRE_IJMatrixGetObject(localA, (void**) &LA_csr); HYPRE_IJVectorGetObject(localx, (void**) &Lx_csr); HYPRE_IJVectorGetObject(localb, (void**) &Lb_csr); HYPRE_BoomerAMGSolve( solver, LA_csr, Lb_csr, Lx_csr ); /* --------------------------------------------------------*/ /* update interior nodes, leave boundary nodes unchanged */ /* --------------------------------------------------------*/ Lx_par = (hypre_ParVector *) Lx_csr; Lx_local = hypre_ParVectorLocalVector(Lx_par); Lx_data = hypre_VectorData(Lx_local); for (i = 0; i < local_nrows; i++) { if (remap_array[i] >= 0) y_par_data[i] = Lx_data[remap_array[i]]; } return 0; } /***************************************************************************/ /* Apply [I ] */ /* [E_ob] vb */ /***************************************************************************/ int HYPRE_ApplyExtension(HYPRE_Solver solver, HYPRE_ParVector x_csr, HYPRE_ParVector y_csr ) { int i, j, index, local_nrows, global_nrows, *temp_list; HYPRE_ParCSRMatrix LA_csr; HYPRE_ParVector Lx_csr; HYPRE_ParVector Lb_csr; hypre_ParVector *x_par; hypre_ParVector *y_par; hypre_Vector *x_par_local; hypre_Vector *y_par_local; double *x_par_data ; double *y_par_data ; double *temp_vect; hypre_ParVector *Lx_par; hypre_Vector *Lx_local; double *Lx_data; /* --------------------------------------------------------*/ /* get local and global size of vectors */ /* --------------------------------------------------------*/ local_nrows = myEnd - myBegin + 1; MPI_Allreduce(&local_nrows,&global_nrows,1,MPI_INT,MPI_SUM,parComm); /* --------------------------------------------------------*/ /* fetch data pointer of input and output vectors */ /* --------------------------------------------------------*/ x_par = (hypre_ParVector *) x_csr; x_par_local = hypre_ParVectorLocalVector(x_par); x_par_data = hypre_VectorData(x_par_local); y_par = (hypre_ParVector *) y_csr; y_par_local = hypre_ParVectorLocalVector(y_par); y_par_data = hypre_VectorData(y_par_local); /* --------------------------------------------------------*/ /* copy from x to temporary vector */ /* --------------------------------------------------------*/ index = 0; for (i = 0; i < local_nrows; i++) { if ( remap_array[i] < 0 ) y_par_data[i] = x_par_data[index++]; else y_par_data[i] = 0.0; } /* --------------------------------------------------------*/ /* create localb & localx of length = no. of interior nodes*/ /* --------------------------------------------------------*/ temp_list = hypre_TAlloc(int, interior_nrows , HYPRE_MEMORY_HOST); temp_vect = hypre_TAlloc(double, interior_nrows , HYPRE_MEMORY_HOST); for (i = 0; i < interior_nrows; i++) temp_list[i] = i; for (i = 0; i < local_nrows; i++) { if (remap_array[i] >= 0 && remap_array[i] < interior_nrows) { temp_vect[remap_array[i]] = 0.0; for (j = 0; j < offRowLengths[i]; j++) temp_vect[remap_array[i]] += (offColVal[i][j] * y_par_data[offColInd[i][j]]); } else if ( remap_array[i] >= interior_nrows) printf("WARNING : index out of range.\n"); } HYPRE_IJVectorSetValues(localb,interior_nrows,(const int*) temp_list, temp_vect); hypre_TFree(temp_list, HYPRE_MEMORY_HOST); hypre_TFree(temp_vect, HYPRE_MEMORY_HOST); /* --------------------------------------------------------*/ /* perform one cycle of AMG to subdomain (internal nodes) */ /* --------------------------------------------------------*/ HYPRE_IJMatrixGetObject(localA, (void**) &LA_csr); HYPRE_IJVectorGetObject(localx, (void**) &Lx_csr); HYPRE_IJVectorGetObject(localb, (void**) &Lb_csr); HYPRE_BoomerAMGSolve( solver, LA_csr, Lb_csr, Lx_csr ); /* --------------------------------------------------------*/ /* update interior nodes, leave boundary nodes unchanged */ /* --------------------------------------------------------*/ Lx_par = (hypre_ParVector *) Lx_csr; Lx_local = hypre_ParVectorLocalVector(Lx_par); Lx_data = hypre_VectorData(Lx_local); for (i=0; i= 0) y_par_data[i] = -Lx_data[remap_array[i]]; } return 0; } /***************************************************************************/ /* Apply [I E_ob^T] v */ /***************************************************************************/ int HYPRE_ApplyExtensionTranspose(HYPRE_Solver solver, HYPRE_ParVector x_csr, HYPRE_ParVector y_csr ) { int i, j, index, local_nrows, global_nrows, *temp_list; HYPRE_IJVector tvec; HYPRE_ParCSRMatrix LA_csr; HYPRE_ParVector Lx_csr; HYPRE_ParVector Lb_csr; HYPRE_ParVector t_csr; hypre_ParVector *x_par; hypre_ParVector *y_par; hypre_ParVector *t_par; hypre_Vector *x_par_local; hypre_Vector *y_par_local; hypre_Vector *t_par_local; double *x_par_data ; double *y_par_data ; double *t_par_data ; double *temp_vect; hypre_ParVector *Lx_par; hypre_Vector *Lx_local; double *Lx_data; /* --------------------------------------------------------*/ /* get local and global size of vectors */ /* --------------------------------------------------------*/ local_nrows = myEnd - myBegin + 1; MPI_Allreduce(&local_nrows,&global_nrows,1,MPI_INT,MPI_SUM,parComm); /* --------------------------------------------------------*/ /* create a temporary long vector */ /* --------------------------------------------------------*/ HYPRE_IJVectorCreate(parComm, myBegin, myEnd, &tvec); HYPRE_IJVectorSetObjectType(tvec, HYPRE_PARCSR); HYPRE_IJVectorInitialize(tvec); HYPRE_IJVectorAssemble(tvec); HYPRE_IJVectorGetObject(tvec, (void **) &t_csr); t_par = (hypre_ParVector *) t_csr; t_par_local = hypre_ParVectorLocalVector(t_par); t_par_data = hypre_VectorData(t_par_local); /* --------------------------------------------------------*/ /* fetch data pointer of input and output vectors */ /* --------------------------------------------------------*/ x_par = (hypre_ParVector *) x_csr; x_par_local = hypre_ParVectorLocalVector(x_par); x_par_data = hypre_VectorData(x_par_local); y_par = (hypre_ParVector *) y_csr; y_par_local = hypre_ParVectorLocalVector(y_par); y_par_data = hypre_VectorData(y_par_local); /* --------------------------------------------------------*/ /* create localb & localx of length = no. of interior nodes*/ /* --------------------------------------------------------*/ temp_list = hypre_TAlloc(int, interior_nrows , HYPRE_MEMORY_HOST); temp_vect = hypre_TAlloc(double, interior_nrows , HYPRE_MEMORY_HOST); for (i=0; i= 0 && remap_array[i] < interior_nrows) temp_vect[remap_array[i]] = x_par_data[i]; } HYPRE_IJVectorSetValues(localb,interior_nrows,(const int*) temp_list, temp_vect); hypre_TFree(temp_list, HYPRE_MEMORY_HOST); hypre_TFree(temp_vect, HYPRE_MEMORY_HOST); /* --------------------------------------------------------*/ /* perform one cycle of AMG to subdomain (internal nodes) */ /* --------------------------------------------------------*/ HYPRE_IJMatrixGetObject(localA, (void**) &LA_csr); HYPRE_IJVectorGetObject(localx, (void**) &Lx_csr); HYPRE_IJVectorGetObject(localb, (void**) &Lb_csr); HYPRE_BoomerAMGSolve( solver, LA_csr, Lb_csr, Lx_csr ); /* --------------------------------------------------------*/ /* update boundary nodes */ /* --------------------------------------------------------*/ Lx_par = (hypre_ParVector *) Lx_csr; Lx_local = hypre_ParVectorLocalVector(Lx_par); Lx_data = hypre_VectorData(Lx_local); for (i=0; i= 0 ) { for (j=0; j= 0 && remap_array[i] < interior_nrows) { temp_vect[remap_array[i]] = 0.0; for (j = 0; j < offRowLengths[i]; j++) temp_vect[remap_array[i]] += (offColVal[i][j] * x_par_data[offColInd[i][j]]); } else if ( remap_array[i] >= interior_nrows) printf("WARNING : index out of range.\n"); } HYPRE_IJVectorSetValues(localb,interior_nrows,(const int*) temp_list, temp_vect); hypre_TFree(temp_list, HYPRE_MEMORY_HOST); hypre_TFree(temp_vect, HYPRE_MEMORY_HOST); /* --------------------------------------------------------*/ /* perform one cycle of AMG to subdomain (internal nodes) */ /* --------------------------------------------------------*/ HYPRE_IJMatrixGetObject(localA, (void**) &LA_csr); HYPRE_IJVectorGetObject(localx, (void**) &Lx_csr); HYPRE_IJVectorGetObject(localb, (void**) &Lb_csr); HYPRE_BoomerAMGSolve( solver, LA_csr, Lb_csr, Lx_csr ); /* --------------------------------------------------------*/ /* update interior nodes, leave boundary nodes unchanged */ /* --------------------------------------------------------*/ Lx_par = (hypre_ParVector *) Lx_csr; Lx_local = hypre_ParVectorLocalVector(Lx_par); Lx_data = hypre_VectorData(Lx_local); for (i=0; i= 0) y_par_data[i] -= Lx_data[remap_array[i]]; } return 0; } /***************************************************************************/ /* Apply E^T to an incoming vector */ /***************************************************************************/ int HYPRE_ApplyTransformTranspose(HYPRE_Solver solver, HYPRE_ParVector x_csr, HYPRE_ParVector y_csr ) { int i, j, index, local_nrows, *temp_list; HYPRE_ParCSRMatrix LA_csr; HYPRE_ParVector Lx_csr; HYPRE_ParVector Lb_csr; hypre_ParVector *x_par; hypre_ParVector *y_par; hypre_Vector *x_par_local; hypre_Vector *y_par_local; double *x_par_data ; double *y_par_data ; double *temp_vect; hypre_ParVector *Lx_par; hypre_Vector *Lx_local; double *Lx_data; /* --------------------------------------------------------*/ /* get local and global size of vectors */ /* --------------------------------------------------------*/ local_nrows = myEnd - myBegin + 1; /* --------------------------------------------------------*/ /* fetch data pointer of input and output vectors */ /* --------------------------------------------------------*/ x_par = (hypre_ParVector *) x_csr; x_par_local = hypre_ParVectorLocalVector(x_par); x_par_data = hypre_VectorData(x_par_local); y_par = (hypre_ParVector *) y_csr; y_par_local = hypre_ParVectorLocalVector(y_par); y_par_data = hypre_VectorData(y_par_local); /* --------------------------------------------------------*/ /* copy from x to temporary vector */ /* --------------------------------------------------------*/ for (i = 0; i < local_nrows; i++) y_par_data[i] = x_par_data[i]; /* --------------------------------------------------------*/ /* create localb & localx of length = no. of interior nodes*/ /* --------------------------------------------------------*/ temp_list = hypre_TAlloc(int, interior_nrows , HYPRE_MEMORY_HOST); temp_vect = hypre_TAlloc(double, interior_nrows , HYPRE_MEMORY_HOST); for (i=0; i= 0 && remap_array[i] < interior_nrows) temp_vect[remap_array[i]] = x_par_data[i]; } HYPRE_IJVectorSetValues(localb,interior_nrows,(const int*) temp_list, temp_vect); hypre_TFree(temp_list, HYPRE_MEMORY_HOST); hypre_TFree(temp_vect, HYPRE_MEMORY_HOST); /* --------------------------------------------------------*/ /* perform one cycle of AMG to subdomain (internal nodes) */ /* --------------------------------------------------------*/ HYPRE_IJMatrixGetObject(localA, (void**) &LA_csr); HYPRE_IJVectorGetObject(localx, (void**) &Lx_csr); HYPRE_IJVectorGetObject(localb, (void**) &Lb_csr); HYPRE_BoomerAMGSolve( solver, LA_csr, Lb_csr, Lx_csr ); /* --------------------------------------------------------*/ /* update boundary nodes */ /* --------------------------------------------------------*/ Lx_par = (hypre_ParVector *) Lx_csr; Lx_local = hypre_ParVectorLocalVector(Lx_par); Lx_data = hypre_VectorData(Lx_local); for (i=0; i= 0 ) { for (j=0; j 1.0E-8 && its < maxiter ) { ror = 1.0 / rnorm; for (i = 0; i < local_intface_nrows; i++) ws[0][i] = ror * r_par_data[i]; RS[1] = rnorm2; icnt = 0; rnorm2 = rnorm; while (icnt < mlen && (rnorm2/init_norm) > 1.0E-8) { icnt++; its++; icnt2 = icnt + 1; for (i = 0; i < local_intface_nrows; i++) t_par_data[i] = ws[icnt-1][i]; HYPRE_ApplyExtension( solver, t_csr, T_csr ); HYPRE_ParCSRMatrixMatvec( 1.0, A_csr, T_csr, 0.0, T2_csr ); HYPRE_ApplyExtensionTranspose( solver, T2_csr, t_csr ); for (i = 0; i < local_intface_nrows; i++) ws[icnt][i] = t_par_data[i]; for (j = 1; j <= icnt; j++) { for (i=0; i= 0)*/ /* --------------------------------------------------------*/ remap_array = hypre_TAlloc(int, local_nrows , HYPRE_MEMORY_HOST); for ( i = 0; i < local_nrows; i++ ) remap_array[i] = 0; for ( i = myBegin; i <= myEnd; i++ ) { HYPRE_ParCSRMatrixGetRow(A_csr,i,&rowSize,&colInd,&colVal); for ( j = 0; j < rowSize; j++ ) if ( colInd[j] < myBegin || colInd[j] > myEnd ) {remap_array[i-myBegin] = -1; break;} HYPRE_ParCSRMatrixRestoreRow(A_csr,i,&rowSize,&colInd,&colVal); } interior_nrows = 0; for ( i = 0; i < local_nrows; i++ ) if ( remap_array[i] == 0 ) remap_array[i] = interior_nrows++; /* --------------------------------------------------------*/ /* construct the local matrix (only the border nodes) */ /* --------------------------------------------------------*/ HYPRE_IJMatrixCreate(newComm, 0, 0+interior_nrows-1, 0, 0+interior_nrows-1, &localA); HYPRE_IJMatrixSetObjectType(localA, HYPRE_PARCSR); rowLengths = hypre_TAlloc(int, interior_nrows , HYPRE_MEMORY_HOST); offRowLengths = hypre_TAlloc(int, local_nrows , HYPRE_MEMORY_HOST); rowCnt = 0; maxRowSize = 0; for ( i = myBegin; i <= myEnd; i++ ) { offRowLengths[i-myBegin] = 0; if ( remap_array[i-myBegin] >= 0 ) { rowLengths[rowCnt] = 0; HYPRE_ParCSRMatrixGetRow(A_csr,i,&rowSize,&colInd,&colVal); for ( j = 0; j < rowSize; j++ ) { if ( colInd[j] >= myBegin && colInd[j] <= myEnd ) { if (remap_array[colInd[j]-myBegin] >= 0) rowLengths[rowCnt]++; else offRowLengths[i-myBegin]++; } } nnz += rowLengths[rowCnt]; maxRowSize = (rowLengths[rowCnt] > maxRowSize) ? rowLengths[rowCnt] : maxRowSize; HYPRE_ParCSRMatrixRestoreRow(A_csr,i,&rowSize,&colInd,&colVal); rowCnt++; } } HYPRE_IJMatrixSetRowSizes(localA, rowLengths); HYPRE_IJMatrixInitialize(localA); newColInd = hypre_TAlloc(int, maxRowSize , HYPRE_MEMORY_HOST); newColVal = hypre_TAlloc(double, maxRowSize , HYPRE_MEMORY_HOST); rowCnt = 0; offColInd = hypre_TAlloc(int*, local_nrows , HYPRE_MEMORY_HOST); offColVal = hypre_TAlloc(double*, local_nrows , HYPRE_MEMORY_HOST); for ( i = 0; i < local_nrows; i++ ) { if ( offRowLengths[i] > 0 ) { offColInd[i] = hypre_TAlloc(int, offRowLengths[i] , HYPRE_MEMORY_HOST); offColVal[i] = hypre_TAlloc(double, offRowLengths[i] , HYPRE_MEMORY_HOST); } else { offColInd[i] = NULL; offColVal[i] = NULL; } } for ( i = 0; i < local_nrows; i++ ) { eqnNum = myBegin + i; if ( remap_array[i] >= 0 ) { HYPRE_ParCSRMatrixGetRow(A_csr,eqnNum,&rowSize,&colInd,&colVal); nnz = 0; k = 0; for ( j = 0; j < rowSize; j++ ) { if ( colInd[j] >= myBegin && colInd[j] <= myEnd ) { if ( remap_array[colInd[j]-myBegin] >= 0 ) { newColInd[nnz] = remap_array[colInd[j]-myBegin]; newColVal[nnz++] = colVal[j]; } else { offColInd[i][k] = colInd[j]-myBegin; offColVal[i][k++] = colVal[j]; } } } if ( k != offRowLengths[i] ) printf("WARNING : k != offRowLengths[i]\n"); HYPRE_ParCSRMatrixRestoreRow(A_csr,eqnNum,&rowSize,&colInd,&colVal); HYPRE_IJMatrixSetValues(localA,1,&nnz,&rowCnt,newColInd,newColVal); rowCnt++; } } hypre_TFree(newColInd , HYPRE_MEMORY_HOST); hypre_TFree(newColVal , HYPRE_MEMORY_HOST); HYPRE_IJMatrixAssemble(localA); /* --------------------------------------------------------*/ /* create and load local vectors */ /* --------------------------------------------------------*/ HYPRE_IJVectorCreate(newComm, 0, interior_nrows-1, &localx); HYPRE_IJVectorSetObjectType(localx, HYPRE_PARCSR); HYPRE_IJVectorInitialize(localx); HYPRE_IJVectorAssemble(localx); HYPRE_IJVectorCreate(newComm, 0, interior_nrows-1, &localb); HYPRE_IJVectorSetObjectType(localb, HYPRE_PARCSR); HYPRE_IJVectorInitialize(localb); HYPRE_IJVectorAssemble(localb); /* --------------------------------------------------------*/ /* create an AMG context */ /* --------------------------------------------------------*/ HYPRE_BoomerAMGCreate(&SeqPrecon); HYPRE_BoomerAMGSetMaxIter(SeqPrecon, 1); HYPRE_BoomerAMGSetCycleType(SeqPrecon, 1); HYPRE_BoomerAMGSetMaxLevels(SeqPrecon, 25); relaxType[0] = relaxType[1] = relaxType[2] = 5; relaxType[3] = 9; HYPRE_BoomerAMGSetGridRelaxType(SeqPrecon, relaxType); HYPRE_BoomerAMGSetTol(SeqPrecon, 1.0E-16); HYPRE_BoomerAMGSetMeasureType(SeqPrecon, 0); HYPRE_IJMatrixGetObject(localA, (void**) &LA_csr); HYPRE_IJVectorGetObject(localx, (void**) &Lx_csr); HYPRE_IJVectorGetObject(localb, (void**) &Lb_csr); /*HYPRE_BoomerAMGSetPrintLevel(SeqPrecon, 2);*/ /*HYPRE_BoomerAMGSetDebugFlag(SeqPrecon, 1);*/ HYPRE_BoomerAMGSetup( SeqPrecon, LA_csr, Lb_csr, Lx_csr); MPI_Barrier(MPI_COMM_WORLD); /* --------------------------------------------------------*/ /* diagnostics */ /* --------------------------------------------------------*/ /* small code to check symmetry HYPRE_ParVectorSetRandomValues( x_csr, 10345 ); HYPRE_ParVectorSetRandomValues( b_csr, 24893 ); HYPRE_DDAMGSolve( SeqPrecon, A_csr, x_csr, r_csr); HYPRE_ParVectorInnerProd( b_csr, r_csr, &ddata); printf("CHECK 1 = %e\n", ddata); HYPRE_DDAMGSolve( SeqPrecon, A_csr, b_csr, r_csr); HYPRE_ParVectorInnerProd( x_csr, r_csr, &ddata); printf("CHECK 2 = %e\n", ddata); */ MPI_Allreduce(&local_nrows, &global_nrows,1,MPI_INT,MPI_SUM,parComm); local_intface_nrows = myEnd - myBegin + 1 - interior_nrows; MPI_Allreduce(&local_intface_nrows, &global_intface_nrows, 1,MPI_INT, MPI_SUM,parComm); itemp_vec = hypre_TAlloc(int, num_procs , HYPRE_MEMORY_HOST); itemp_vec2 = hypre_TAlloc(int, num_procs , HYPRE_MEMORY_HOST); for (i = 0; i < num_procs; i++) itemp_vec[i] = 0; itemp_vec[myRank] = local_intface_nrows; MPI_Allreduce(itemp_vec, itemp_vec2, num_procs, MPI_INT, MPI_SUM, parComm); myBegin_int = 0; for (i = 0; i < myRank; i++) myBegin_int += itemp_vec2[i]; myEnd_int = myBegin_int + local_intface_nrows - 1; hypre_TFree(itemp_vec, HYPRE_MEMORY_HOST); hypre_TFree(itemp_vec2, HYPRE_MEMORY_HOST); HYPRE_IJVectorCreate(parComm, myBegin_int, myEnd_int, &tvec); HYPRE_IJVectorSetObjectType(tvec, HYPRE_PARCSR); HYPRE_IJVectorInitialize(tvec); HYPRE_IJVectorAssemble(tvec); HYPRE_IJVectorCreate(parComm, myBegin, myEnd, &Tvec); HYPRE_IJVectorSetObjectType(Tvec, HYPRE_PARCSR); HYPRE_IJVectorInitialize(Tvec); HYPRE_IJVectorAssemble(Tvec); HYPRE_IJVectorCreate(parComm, myBegin, myEnd, &T2vec); HYPRE_IJVectorSetObjectType(T2vec, HYPRE_PARCSR); HYPRE_IJVectorInitialize(T2vec); HYPRE_IJVectorAssemble(T2vec); HYPRE_IJVectorGetObject(Tvec, (void **) &T_csr); HYPRE_IJVectorGetObject(T2vec, (void **) &T2_csr); HYPRE_IJVectorGetObject(tvec, (void **) &t_csr); /* for ( i = 0; i < global_intface_nrows; i++ ) { MPI_Barrier(MPI_COMM_WORLD); HYPRE_IJVectorZeroLocalComponents(tvec); if ( i >= myBegin_int && i <= myEnd_int ) t_par_data[i-myBegin_int] = 1.0; HYPRE_ApplyExtension( SeqPrecon, t_csr, T_csr ); HYPRE_ParCSRMatrixMatvec( 1.0, A_csr, T_csr, 0.0, T2_csr ); HYPRE_ApplyExtensionTranspose( SeqPrecon, T2_csr, t_csr ); for ( k1 = 0; k1 < local_intface_nrows; k1++ ) if ( t_par_data[k1] != 0.0 ) printf("RA(%4d,%4d) = %e;\n",i+1,myBegin_int+k1+1,t_par_data[k1]); } */ MPI_Barrier(MPI_COMM_WORLD); /* --------------------------------------------------------*/ /* solve using GMRES */ /* --------------------------------------------------------*/ HYPRE_ParCSRGMRESCreate(parComm, &PSolver); HYPRE_ParCSRGMRESSetPrecond(PSolver,HYPRE_DDAMGSolve,HYPRE_DummySetup, SeqPrecon); HYPRE_ParCSRGMRESSetKDim(PSolver, 100); HYPRE_ParCSRGMRESSetMaxIter(PSolver, 100); HYPRE_ParCSRGMRESSetTol(PSolver, 1.0E-8); HYPRE_ParCSRGMRESSetup(PSolver, A_csr, b_csr, x_csr); HYPRE_ParCSRGMRESSolve(PSolver, A_csr, b_csr, x_csr); HYPRE_ParCSRGMRESGetNumIterations(PSolver, &num_iterations); /*HYPRE_ParCSRPCGCreate(parComm, &PSolver); HYPRE_ParCSRPCGSetPrecond(PSolver,HYPRE_DDAMGSolve,HYPRE_DummySetup, SeqPrecon); HYPRE_ParCSRPCGSetMaxIter(PSolver, 100); HYPRE_ParCSRPCGSetTol(PSolver, 1.0E-8); HYPRE_ParCSRPCGSetup(PSolver, A_csr, b_csr, x_csr); HYPRE_ParCSRPCGSolve(PSolver, A_csr, b_csr, x_csr); HYPRE_ParCSRPCGGetNumIterations(PSolver, &num_iterations); */ if ( myRank == 0 ) printf("GMRES iteration count = %d \n", num_iterations); /* --------------------------------------------------------*/ /* clean up */ /* --------------------------------------------------------*/ HYPRE_IJMatrixDestroy(localA); HYPRE_IJVectorDestroy(localx); HYPRE_IJVectorDestroy(localb); HYPRE_BoomerAMGDestroy(SeqPrecon); HYPRE_ParCSRGMRESDestroy( PSolver ); return 0; } hypre-2.33.0/src/FEI_mv/fei-hypre/hypre_lsi_misc.c000066400000000000000000000540421477326011500217020ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include #include #include #include "utilities/_hypre_utilities.h" #include "IJ_mv/HYPRE_IJ_mv.h" #include "parcsr_mv/_hypre_parcsr_mv.h" #include "parcsr_ls/_hypre_parcsr_ls.h" #include "seq_mv/seq_mv.h" #include "HYPRE_FEI.h" extern void hypre_qsort0(int*, int, int); extern void hypre_qsort1(int*, double*, int, int); #define habs(x) ((x) > 0.0 ? x : -(x)) /***************************************************************************/ /* reading a matrix from a file in ija format (first row : nrows, nnz) */ /* (read by a single processor) */ /*-------------------------------------------------------------------------*/ void HYPRE_LSI_Get_IJAMatrixFromFile(double **val, int **ia, int **ja, int *N, double **rhs, char *matfile, char *rhsfile) { int i, j, Nrows, nnz, icount, rowindex, colindex, curr_row; int k, m, *mat_ia, *mat_ja, ncnt, rnum; double dtemp, *mat_a, value, *rhs_local; FILE *fp; /*------------------------------------------------------------------*/ /* read matrix file */ /*------------------------------------------------------------------*/ printf("Reading matrix file = %s \n", matfile ); fp = fopen( matfile, "r" ); if ( fp == NULL ) { printf("Error : file open error (filename=%s).\n", matfile); exit(1); } fscanf(fp, "%d %d", &Nrows, &nnz); if ( Nrows <= 0 || nnz <= 0 ) { printf("Error : nrows,nnz = %d %d\n", Nrows, nnz); exit(1); } mat_ia = hypre_TAlloc(int, (Nrows+1) , HYPRE_MEMORY_HOST); mat_ja = hypre_TAlloc(int, nnz , HYPRE_MEMORY_HOST); mat_a = hypre_TAlloc(double, nnz , HYPRE_MEMORY_HOST); mat_ia[0] = 0; curr_row = 0; icount = 0; for ( i = 0; i < nnz; i++ ) { fscanf(fp, "%d %d %lg", &rowindex, &colindex, &value); rowindex--; colindex--; if ( rowindex != curr_row ) mat_ia[++curr_row] = icount; if ( rowindex < 0 || rowindex >= Nrows ) printf("Error reading row %d (curr_row = %d)\n", rowindex, curr_row); if ( colindex < 0 || colindex >= Nrows ) printf("Error reading col %d (rowindex = %d)\n", colindex, rowindex); /*if ( value != 0.0 ) {*/ mat_ja[icount] = colindex; mat_a[icount++] = value; /*}*/ } fclose(fp); for ( i = curr_row+1; i <= Nrows; i++ ) mat_ia[i] = icount; (*val) = mat_a; (*ia) = mat_ia; (*ja) = mat_ja; (*N) = Nrows; printf("matrix has %6d rows and %7d nonzeros\n", Nrows, mat_ia[Nrows]); /*------------------------------------------------------------------*/ /* read rhs file */ /*------------------------------------------------------------------*/ printf("reading rhs file = %s \n", rhsfile ); fp = fopen( rhsfile, "r" ); if ( fp == NULL ) { printf("Error : file open error (filename=%s).\n", rhsfile); exit(1); } fscanf(fp, "%d", &ncnt); if ( ncnt <= 0 || ncnt != Nrows) { printf("Error : nrows = %d \n", ncnt); exit(1); } fflush(stdout); rhs_local = hypre_TAlloc(double, Nrows , HYPRE_MEMORY_HOST); m = 0; for ( k = 0; k < ncnt; k++ ) { fscanf(fp, "%d %lg", &rnum, &dtemp); rhs_local[rnum-1] = dtemp; m++; } fflush(stdout); ncnt = m; fclose(fp); (*rhs) = rhs_local; printf("reading rhs done \n"); for ( i = 0; i < Nrows; i++ ) { for ( j = mat_ia[i]; j < mat_ia[i+1]; j++ ) mat_ja[j]++; } printf("returning from reading matrix\n"); } /***************************************************************************/ /* HYPRE_LSI_Search - this is a modification of hypre_BinarySearch */ /*-------------------------------------------------------------------------*/ int HYPRE_LSI_Search(int *list,int value,int list_length) { int low, high, m; int not_found = 1; low = 0; high = list_length-1; while (not_found && low <= high) { m = (low + high) / 2; if (value < list[m]) { high = m - 1; } else if (value > list[m]) { low = m + 1; } else { not_found = 0; return m; } } return -(low+1); } /* ************************************************************************ */ /* Given a sorted list of indices and the key, find the position of the */ /* key in the list. If not found, return the index of the position */ /* corresponding to where it would have been stored. */ /* (borrowed from the search routine in ML) */ /* ------------------------------------------------------------------------ */ int HYPRE_LSI_Search2(int key, int nlist, int *list) { int nfirst, nlast, nmid, found, index; if (nlist <= 0) return -1; nfirst = 0; nlast = nlist-1; if (key > list[nlast]) return -(nlast+1); if (key < list[nfirst]) return -(nfirst+1); found = 0; while ((found == 0) && ((nlast-nfirst)>1)) { nmid = (nfirst + nlast) / 2; if (key == list[nmid]) {index = nmid; found = 1;} else if (key > list[nmid]) nfirst = nmid; else nlast = nmid; } if (found == 1) return index; else if (key == list[nfirst]) return nfirst; else if (key == list[nlast]) return nlast; else return -(nfirst+1); } /* ************************************************************************ */ /* this function extracts the matrix in a CSR format */ /* ------------------------------------------------------------------------ */ int HYPRE_LSI_GetParCSRMatrix(HYPRE_IJMatrix Amat, int nrows, int nnz, int *ia_ptr, int *ja_ptr, double *a_ptr) { int nz, i, j, ierr, rowSize, *colInd, nz_ptr, *colInd2; int firstNnz; double *colVal, *colVal2; HYPRE_ParCSRMatrix A_csr; nz = 0; nz_ptr = 0; ia_ptr[0] = nz_ptr; /* ---old_IJ----------------------------------------------------------- */ /*A_csr = (HYPRE_ParCSRMatrix) HYPRE_IJMatrixGetLocalStorage(Amat);*/ /* ---new_IJ----------------------------------------------------------- */ HYPRE_IJMatrixGetObject(Amat, (void**) &A_csr); /* -------------------------------------------------------------------- */ for ( i = 0; i < nrows; i++ ) { ierr = HYPRE_ParCSRMatrixGetRow(A_csr,i,&rowSize,&colInd,&colVal); hypre_assert(!ierr); colInd2 = hypre_TAlloc(int, rowSize , HYPRE_MEMORY_HOST); colVal2 = hypre_TAlloc(double, rowSize , HYPRE_MEMORY_HOST); for ( j = 0; j < rowSize; j++ ) { colInd2[j] = colInd[j]; colVal2[j] = colVal[j]; } hypre_qsort1(colInd2, colVal2, 0, rowSize-1); for ( j = 0; j < rowSize-1; j++ ) if ( colInd2[j] == colInd2[j+1] ) printf("HYPRE_LSI_GetParCSRMatrix-duplicate colind at row %d \n",i); firstNnz = 0; for ( j = 0; j < rowSize; j++ ) { if ( colVal2[j] != 0.0 ) { if (nz_ptr > 0 && firstNnz > 0 && colInd2[j] == ja_ptr[nz_ptr-1]) { a_ptr[nz_ptr-1] += colVal2[j]; printf("HYPRE_LSI_GetParCSRMatrix:: repeated col in row %d\n",i); } else { ja_ptr[nz_ptr] = colInd2[j]; a_ptr[nz_ptr++] = colVal2[j]; if ( nz_ptr > nnz ) { printf("HYPRE_LSI_GetParCSRMatrix Error (1) - %d %d.\n",i, nrows); exit(1); } firstNnz++; } } else nz++; } hypre_TFree(colInd2, HYPRE_MEMORY_HOST); hypre_TFree(colVal2, HYPRE_MEMORY_HOST); ia_ptr[i+1] = nz_ptr; ierr = HYPRE_ParCSRMatrixRestoreRow(A_csr,i,&rowSize,&colInd,&colVal); hypre_assert(!ierr); } /* if ( nnz != nz_ptr ) { printf("HYPRE_LSI_GetParCSRMatrix note : matrix sparsity has been \n"); printf(" changed since matConfigure - %d > %d ?\n", nnz, nz_ptr); printf(" number of zeros = %d \n", nz ); } */ return nz_ptr; } /* ******************************************************************** */ /* sort integers */ /* -------------------------------------------------------------------- */ void HYPRE_LSI_qsort1a( int *ilist, int *ilist2, int left, int right) { int i, last, mid, itemp; if (left >= right) return; mid = (left + right) / 2; itemp = ilist[left]; ilist[left] = ilist[mid]; ilist[mid] = itemp; itemp = ilist2[left]; ilist2[left] = ilist2[mid]; ilist2[mid] = itemp; last = left; for (i = left+1; i <= right; i++) { if (ilist[i] < ilist[left]) { last++; itemp = ilist[last]; ilist[last] = ilist[i]; ilist[i] = itemp; itemp = ilist2[last]; ilist2[last] = ilist2[i]; ilist2[i] = itemp; } } itemp = ilist[left]; ilist[left] = ilist[last]; ilist[last] = itemp; itemp = ilist2[left]; ilist2[left] = ilist2[last]; ilist2[last] = itemp; HYPRE_LSI_qsort1a(ilist, ilist2, left, last-1); HYPRE_LSI_qsort1a(ilist, ilist2, last+1, right); } /* ******************************************************************** */ /* sort a given list in increasing order */ /* -------------------------------------------------------------------- */ int HYPRE_LSI_SplitDSort2(double *dlist, int nlist, int *ilist, int limit) { int itemp, *iarray1, *iarray2, count1, count2, i; double dtemp, *darray1, *darray2; if ( nlist <= 1 ) return 0; if ( nlist == 2 ) { if ( dlist[0] < dlist[1] ) { dtemp = dlist[0]; dlist[0] = dlist[1]; dlist[1] = dtemp; itemp = ilist[0]; ilist[0] = ilist[1]; ilist[1] = itemp; } return 0; } count1 = 0; count2 = 0; iarray1 = hypre_TAlloc(int, 2 * nlist , HYPRE_MEMORY_HOST); iarray2 = iarray1 + nlist; darray1 = hypre_TAlloc(double, 2 * nlist , HYPRE_MEMORY_HOST); darray2 = darray1 + nlist; if ( darray2 == NULL ) { printf("ERROR : malloc\n"); exit(1); } dtemp = dlist[0]; itemp = ilist[0]; for ( i = 1; i < nlist; i++ ) { if (dlist[i] >= dtemp ) { darray1[count1] = dlist[i]; iarray1[count1++] = ilist[i]; } else { darray2[count2] = dlist[i]; iarray2[count2++] = ilist[i]; } } dlist[count1] = dtemp; ilist[count1] = itemp; for ( i = 0; i < count1; i++ ) { dlist[i] = darray1[i]; ilist[i] = iarray1[i]; } for ( i = 0; i < count2; i++ ) { dlist[count1+1+i] = darray2[i]; ilist[count1+1+i] = iarray2[i]; } hypre_TFree(darray1, HYPRE_MEMORY_HOST); hypre_TFree(iarray1, HYPRE_MEMORY_HOST); if ( count1+1 == limit ) return 0; else if ( count1+1 < limit ) HYPRE_LSI_SplitDSort2(&(dlist[count1+1]),count2,&(ilist[count1+1]), limit-count1-1); else HYPRE_LSI_SplitDSort2( dlist, count1, ilist, limit ); return 0; } /* ******************************************************************** */ /* sort a given list in increasing order */ /* -------------------------------------------------------------------- */ int HYPRE_LSI_SplitDSort(double *dlist, int nlist, int *ilist, int limit) { int i, first, last, itemp, cur_index; double dtemp, cur_val; if ( nlist <= 1 ) return 0; if ( nlist == 2 ) { if ( dlist[0] < dlist[1] ) { dtemp = dlist[0]; dlist[0] = dlist[1]; dlist[1] = dtemp; itemp = ilist[0]; ilist[0] = ilist[1]; ilist[1] = itemp; } return 0; } first = 0; last = nlist - 1; do { cur_index = first; cur_val = dlist[cur_index]; for ( i = first+1; i <= last; i++ ) { if ( dlist[i] > cur_val ) { cur_index++; itemp = ilist[cur_index]; ilist[cur_index] = ilist[i]; ilist[i] = itemp; dtemp = dlist[cur_index]; dlist[cur_index] = dlist[i]; dlist[i] = dtemp; } } itemp = ilist[cur_index]; ilist[cur_index] = ilist[first]; ilist[first] = itemp; dtemp = dlist[cur_index]; dlist[cur_index] = dlist[first]; dlist[first] = dtemp; if ( cur_index > limit ) last = cur_index - 1; else if ( cur_index < limit ) first = cur_index + 1; } while ( cur_index != limit ); return 0; } /* ******************************************************************** */ /* copy from one vector to another (identity preconditioning) */ /* -------------------------------------------------------------------- */ int HYPRE_LSI_SolveIdentity(HYPRE_Solver solver, HYPRE_ParCSRMatrix Amat, HYPRE_ParVector b, HYPRE_ParVector x) { (void) solver; (void) Amat; HYPRE_ParVectorCopy( b, x ); return 0; } /* ******************************************************************** */ /* Cuthill McKee reordering algorithm */ /* -------------------------------------------------------------------- */ int HYPRE_LSI_Cuthill(int n, int *ia, int *ja, double *aa, int *order_array, int *reorder_array) { int nnz, *nz_array, cnt, i, j, *tag_array, *queue, nqueue, qhead; int root, norder, mindeg, *ia2, *ja2; double *aa2; nz_array = hypre_TAlloc(int, n , HYPRE_MEMORY_HOST); nnz = ia[n]; for ( i = 0; i < n; i++ ) nz_array[i] = ia[i+1] - ia[i]; tag_array = hypre_TAlloc(int, n , HYPRE_MEMORY_HOST); queue = hypre_TAlloc(int, n , HYPRE_MEMORY_HOST); for ( i = 0; i < n; i++ ) tag_array[i] = 0; norder = 0; mindeg = 10000000; root = -1; for ( i = 0; i < n; i++ ) { if ( nz_array[i] == 1 ) { tag_array[i] = 1; order_array[norder++] = i; reorder_array[i] = norder-1; } else if ( nz_array[i] < mindeg ) { mindeg = nz_array[i]; root = i; } } if ( root == -1 ) { printf("HYPRE_LSI_Cuthill ERROR : Amat is diagonal\n"); exit(1); } nqueue = 0; queue[nqueue++] = root; qhead = 0; tag_array[root] = 1; while ( qhead < nqueue ) { root = queue[qhead++]; order_array[norder++] = root; reorder_array[root] = norder - 1; for ( j = ia[root]; j < ia[root+1]; j++ ) { if ( tag_array[ja[j]] == 0 ) { tag_array[ja[j]] = 1; queue[nqueue++] = ja[j]; } } if ( qhead == nqueue && norder < n ) for ( j = 0; j < n; j++ ) if ( tag_array[j] == 0 ) queue[nqueue++] = j; } ia2 = hypre_TAlloc(int, (n+1) , HYPRE_MEMORY_HOST); ja2 = hypre_TAlloc(int, nnz , HYPRE_MEMORY_HOST); aa2 = hypre_TAlloc(double, nnz , HYPRE_MEMORY_HOST); ia2[0] = 0; nnz = 0; for ( i = 0; i < n; i++ ) { cnt = order_array[i]; for ( j = ia[cnt]; j < ia[cnt+1]; j++ ) { ja2[nnz] = ja[j]; aa2[nnz++] = aa[j]; } ia2[i+1] = nnz; } for ( i = 0; i < nnz; i++ ) ja[i] = reorder_array[ja2[i]]; for ( i = 0; i < nnz; i++ ) aa[i] = aa2[i]; for ( i = 0; i <= n; i++ ) ia[i] = ia2[i]; hypre_TFree(ia2, HYPRE_MEMORY_HOST); hypre_TFree(ja2, HYPRE_MEMORY_HOST); hypre_TFree(aa2, HYPRE_MEMORY_HOST); hypre_TFree(nz_array, HYPRE_MEMORY_HOST); hypre_TFree(tag_array, HYPRE_MEMORY_HOST); hypre_TFree(queue, HYPRE_MEMORY_HOST); return 0; } /* ******************************************************************** */ /* matrix of a dense matrix */ /* -------------------------------------------------------------------- */ int HYPRE_LSI_MatrixInverse( double **Amat, int ndim, double ***Cmat ) { int i, j, k; double denom, **Bmat, dmax; (*Cmat) = NULL; if ( ndim == 1 ) { if ( habs(Amat[0][0]) <= 1.0e-16 ) return -1; Bmat = hypre_TAlloc(double*, ndim , HYPRE_MEMORY_HOST); for ( i = 0; i < ndim; i++ ) Bmat[i] = hypre_TAlloc(double, ndim , HYPRE_MEMORY_HOST); Bmat[0][0] = 1.0 / Amat[0][0]; (*Cmat) = Bmat; return 0; } if ( ndim == 2 ) { denom = Amat[0][0] * Amat[1][1] - Amat[0][1] * Amat[1][0]; if ( habs( denom ) <= 1.0e-16 ) return -1; Bmat = hypre_TAlloc(double*, ndim , HYPRE_MEMORY_HOST); for ( i = 0; i < ndim; i++ ) Bmat[i] = hypre_TAlloc(double, ndim , HYPRE_MEMORY_HOST); Bmat[0][0] = Amat[1][1] / denom; Bmat[1][1] = Amat[0][0] / denom; Bmat[0][1] = - ( Amat[0][1] / denom ); Bmat[1][0] = - ( Amat[1][0] / denom ); (*Cmat) = Bmat; return 0; } else { Bmat = hypre_TAlloc(double*, ndim , HYPRE_MEMORY_HOST); for ( i = 0; i < ndim; i++ ) { Bmat[i] = hypre_TAlloc(double, ndim , HYPRE_MEMORY_HOST); for ( j = 0; j < ndim; j++ ) Bmat[i][j] = 0.0; Bmat[i][i] = 1.0; } for ( i = 1; i < ndim; i++ ) { for ( j = 0; j < i; j++ ) { if ( habs(Amat[j][j]) < 1.0e-16 ) return -1; denom = Amat[i][j] / Amat[j][j]; for ( k = 0; k < ndim; k++ ) { Amat[i][k] -= denom * Amat[j][k]; Bmat[i][k] -= denom * Bmat[j][k]; } } } for ( i = ndim-2; i >= 0; i-- ) { for ( j = ndim-1; j >= i+1; j-- ) { if ( habs(Amat[j][j]) < 1.0e-16 ) return -1; denom = Amat[i][j] / Amat[j][j]; for ( k = 0; k < ndim; k++ ) { Amat[i][k] -= denom * Amat[j][k]; Bmat[i][k] -= denom * Bmat[j][k]; } } } for ( i = 0; i < ndim; i++ ) { denom = Amat[i][i]; if ( habs(denom) < 1.0e-16 ) return -1; for ( j = 0; j < ndim; j++ ) Bmat[i][j] /= denom; } for ( i = 0; i < ndim; i++ ) for ( j = 0; j < ndim; j++ ) if ( habs(Bmat[i][j]) < 1.0e-17 ) Bmat[i][j] = 0.0; dmax = 0.0; for ( i = 0; i < ndim; i++ ) { for ( j = 0; j < ndim; j++ ) if ( habs(Bmat[i][j]) > dmax ) dmax = habs(Bmat[i][j]); /* for ( j = 0; j < ndim; j++ ) if ( habs(Bmat[i][j]/dmax) < 1.0e-15 ) Bmat[i][j] = 0.0; */ } (*Cmat) = Bmat; if ( dmax > 1.0e6 ) return 1; else return 0; } } /* ******************************************************************** */ /* find the separators of a matrix */ /* -------------------------------------------------------------------- */ int HYPRE_LSI_PartitionMatrix( int nRows, int startRow, int *rowLengths, int **colIndices, double **colValues, int *nLabels, int **labels) { int irow, rowCnt, labelNum, *localLabels, actualNRows; int jcol, root, indHead, indTail, *indSet, index; /*----------------------------------------------------------------*/ /* search for constraint rows */ /*----------------------------------------------------------------*/ for ( irow = nRows-1; irow >= 0; irow-- ) { index = irow + startRow; for ( jcol = 0; jcol < rowLengths[irow]; jcol++ ) if (colIndices[irow][jcol] == index && colValues[irow][jcol] != 0.0) break; if ( jcol != rowLengths[irow] ) break; } (*nLabels) = actualNRows = irow + 1; /*----------------------------------------------------------------*/ /* search for constraint rows */ /*----------------------------------------------------------------*/ localLabels = hypre_TAlloc(int, actualNRows , HYPRE_MEMORY_HOST); for ( irow = 0; irow < actualNRows; irow++ ) localLabels[irow] = -1; indSet = hypre_TAlloc(int, actualNRows , HYPRE_MEMORY_HOST); labelNum = 0; rowCnt = actualNRows; while ( rowCnt > 0 ) { root = -1; for ( irow = 0; irow < actualNRows; irow++ ) if ( localLabels[irow] == -1 ) {root = irow; break;} if ( root == -1 ) { printf("HYPRE_LSI_PartitionMatrix : something wrong.\n"); exit(1); } indHead = indTail = 0; localLabels[root] = labelNum; rowCnt--; for ( jcol = 0; jcol < rowLengths[root]; jcol++ ) { index = colIndices[root][jcol] - startRow; if ( index >= 0 && index < actualNRows && localLabels[index] < 0 ) { indSet[indTail++] = index; localLabels[index] = labelNum; } } while ( (indTail - indHead) > 0 ) { root = indSet[indHead++]; rowCnt--; for ( jcol = 0; jcol < rowLengths[root]; jcol++ ) { index = colIndices[root][jcol] - startRow; if ( index >= 0 && index < actualNRows && localLabels[index] < 0 ) { indSet[indTail++] = index; localLabels[index] = labelNum; } } } labelNum++; } if ( labelNum > 4 ) { printf("HYPRE_LSI_PartitionMatrix : number of labels %d too large.\n", labelNum+1); hypre_TFree(localLabels, HYPRE_MEMORY_HOST); (*nLabels) = 0; (*labels) = NULL; } else { printf("HYPRE_LSI_PartitionMatrix : number of labels = %d.\n", labelNum); (*labels) = localLabels; } hypre_TFree(indSet, HYPRE_MEMORY_HOST); return 0; } hypre-2.33.0/src/FEI_mv/fei-hypre/hypre_schur_reduce.cxx000066400000000000000000002431051477326011500231330ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include #include #include #include "HYPRE.h" #include "utilities/_hypre_utilities.h" #include "IJ_mv/HYPRE_IJ_mv.h" #include "parcsr_mv/HYPRE_parcsr_mv.h" #include "parcsr_ls/HYPRE_parcsr_ls.h" #include "HYPRE_LinSysCore.h" #define habs(x) ((x > 0) ? x : -(x)) //--------------------------------------------------------------------------- // _hypre_parcsr_mv.h is put here instead of in HYPRE_LinSysCore.h // because it gives warning when compiling cfei.cc //--------------------------------------------------------------------------- #include "parcsr_mv/_hypre_parcsr_mv.h" //--------------------------------------------------------------------------- // These are external functions needed internally here //--------------------------------------------------------------------------- extern "C" { int hypre_BoomerAMGBuildCoarseOperator(hypre_ParCSRMatrix*, hypre_ParCSRMatrix*, hypre_ParCSRMatrix*, hypre_ParCSRMatrix**); int HYPRE_LSI_Search(int*, int, int); void hypre_qsort0(int *, int, int); void hypre_qsort1(int *, double *, int, int); } //***************************************************************************** // Given the matrix (A) within the object, compute the reduced system and put // it in place. Additional information given are : //----------------------------------------------------------------------------- void HYPRE_LinSysCore::buildSchurReducedSystem() { int i, j, ierr, ncnt, ncnt2; int nRows, globalNRows, StartRow, EndRow, colIndex; int nSchur, *schurList, globalNSchur, *globalSchurList; int CStartRow, CNRows, CNCols, CGlobalNRows, CGlobalNCols; int CTStartRow, CTNRows, CTNCols, CTGlobalNRows, CTGlobalNCols; int MStartRow, MNRows, MNCols, MGlobalNRows, MGlobalNCols; int rowSize, rowCount, rowIndex, maxRowSize, newRowSize; int *CMatSize, *CTMatSize, *MMatSize, *colInd, *newColInd, one=1; int *tempList, *recvCntArray, *displArray, *colInd2, rowSize2; int procIndex, *ProcNRows, *ProcNSchur, searchIndex, CStartCol; double *colVal, *colVal2, *newColVal, *diagonal, ddata, maxdiag, mindiag; HYPRE_IJMatrix Cmat, CTmat, Mmat; HYPRE_ParCSRMatrix A_csr, C_csr, CT_csr, M_csr, S_csr; HYPRE_IJVector f1, f2, f2hat; HYPRE_ParVector f1_csr, f2hat_csr; //****************************************************************** // initial clean up and set up //------------------------------------------------------------------ if ( mypid_ == 0 && (HYOutputLevel_ & HYFEI_SCHURREDUCE1) ) printf(" buildSchurSystem begins....\n"); if ( HYA21_ != NULL ) HYPRE_IJMatrixDestroy(HYA21_); if ( HYA12_ != NULL ) HYPRE_IJMatrixDestroy(HYA12_); if ( HYinvA22_ != NULL ) HYPRE_IJMatrixDestroy(HYinvA22_); if ( reducedB_ != NULL ) HYPRE_IJVectorDestroy(reducedB_); if ( reducedX_ != NULL ) HYPRE_IJVectorDestroy(reducedX_); if ( reducedR_ != NULL ) HYPRE_IJVectorDestroy(reducedR_); if ( reducedA_ != NULL ) HYPRE_IJMatrixDestroy(reducedA_); HYA21_ = NULL; HYA12_ = NULL; HYinvA22_ = NULL; reducedB_ = NULL; reducedX_ = NULL; reducedR_ = NULL; reducedA_ = NULL; StartRow = localStartRow_ - 1; EndRow = localEndRow_ - 1; nRows = localEndRow_ - localStartRow_ + 1; HYPRE_IJMatrixGetObject(HYA_, (void **) &A_csr); if ( HYOutputLevel_ & HYFEI_SCHURREDUCE1 ) printf("%4d : buildSchurSystem - StartRow/EndRow = %d %d\n",mypid_, StartRow,EndRow); //****************************************************************** // construct local and global information about where the constraints // are (this is given by user or searched within this code) //------------------------------------------------------------------ //------------------------------------------------------------------ // get information about processor offsets and globalNRows // (ProcNRows, globalNRows) //------------------------------------------------------------------ ProcNRows = new int[numProcs_]; tempList = new int[numProcs_]; for ( i = 0; i < numProcs_; i++ ) tempList[i] = 0; tempList[mypid_] = StartRow; MPI_Allreduce(tempList, ProcNRows, numProcs_, MPI_INT, MPI_SUM, comm_); delete [] tempList; MPI_Allreduce(&nRows, &globalNRows,1,MPI_INT,MPI_SUM,comm_); //****************************************************************** // compose the local and global Schur node lists //------------------------------------------------------------------ nSchur = 0; for ( i = StartRow; i <= EndRow; i++ ) { HYPRE_ParCSRMatrixGetRow(A_csr,i,&rowSize,&colInd,&colVal); searchIndex = globalNRows + 1; for (j = 0; j < rowSize; j++) { colIndex = colInd[j]; if ( colIndex < searchIndex && colVal[j] != 0.0 ) searchIndex = colIndex; } if ( searchIndex < i ) nSchur++; //searchIndex = -1; //for (j = 0; j < rowSize; j++) //{ // colIndex = colInd[j]; // if ( colIndex < i && colVal[j] != 0.0 ) // if ( colIndex > searchIndex ) searchIndex = colIndex; //} //if ( searchIndex >= StartRow ) nSchur++; HYPRE_ParCSRMatrixRestoreRow(A_csr,i,&rowSize,&colInd,&colVal); } if ( HYOutputLevel_ & HYFEI_SCHURREDUCE1 ) printf("%4d : buildSchurSystem - nSchur = %d\n",mypid_,nSchur); //------------------------------------------------------------------ // allocate array for storing indices of selected nodes //------------------------------------------------------------------ if ( nSchur > 0 ) schurList = new int[nSchur]; else schurList = NULL; //------------------------------------------------------------------ // compose the list of rows having zero diagonal // (nSchur, schurList) //------------------------------------------------------------------ nSchur = 0; for ( i = StartRow; i <= EndRow; i++ ) { HYPRE_ParCSRMatrixGetRow(A_csr,i,&rowSize,&colInd,&colVal); searchIndex = globalNRows + 1; for (j = 0; j < rowSize; j++) { colIndex = colInd[j]; if ( colIndex < searchIndex && colVal[j] != 0.0 ) searchIndex = colIndex; } if ( searchIndex < i ) schurList[nSchur++] = i; //searchIndex = -1; //for (j = 0; j < rowSize; j++) //{ // colIndex = colInd[j]; // if ( colIndex < i && colVal[j] != 0.0 ) // if ( colIndex > searchIndex ) searchIndex = colIndex; //} //if ( searchIndex >= StartRow ) schurList[nSchur++] = i; HYPRE_ParCSRMatrixRestoreRow(A_csr,i,&rowSize,&colInd,&colVal); } //------------------------------------------------------------------ // compose the global list of rows having zero diagonal // (globalNSchur, globalSchurList) //------------------------------------------------------------------ MPI_Allreduce(&nSchur, &globalNSchur, 1, MPI_INT, MPI_SUM,comm_); if ( HYOutputLevel_ & HYFEI_SCHURREDUCE1 ) { if ( globalNSchur == 0 && mypid_ == 0 ) printf("buildSchurSystem WARNING : nSchur = 0 on all processors.\n"); } if ( globalNSchur == 0 ) { schurReduction_ = 0; delete [] ProcNRows; return; } if ( globalNSchur > 0 ) globalSchurList = new int[globalNSchur]; else globalSchurList = NULL; recvCntArray = new int[numProcs_]; displArray = new int[numProcs_]; MPI_Allgather(&nSchur, 1, MPI_INT, recvCntArray, 1, MPI_INT, comm_); displArray[0] = 0; for ( i = 1; i < numProcs_; i++ ) displArray[i] = displArray[i-1] + recvCntArray[i-1]; MPI_Allgatherv(schurList, nSchur, MPI_INT, globalSchurList, recvCntArray, displArray, MPI_INT, comm_); delete [] recvCntArray; delete [] displArray; if ( HYOutputLevel_ & HYFEI_SCHURREDUCE2 ) { for ( i = 0; i < nSchur; i++ ) printf("%4d : buildSchurSystem - schurList %d = %d\n",mypid_, i,schurList[i]); } //------------------------------------------------------------------ // get information about processor offsets for nSchur // (ProcNSchur) //------------------------------------------------------------------ ProcNSchur = new int[numProcs_]; tempList = new int[numProcs_]; for ( i = 0; i < numProcs_; i++ ) tempList[i] = 0; tempList[mypid_] = nSchur; MPI_Allreduce(tempList, ProcNSchur, numProcs_, MPI_INT, MPI_SUM, comm_); delete [] tempList; globalNSchur = 0; ncnt = 0; for ( i = 0; i < numProcs_; i++ ) { globalNSchur += ProcNSchur[i]; ncnt2 = ProcNSchur[i]; ProcNSchur[i] = ncnt; ncnt += ncnt2; } //****************************************************************** // construct Cmat //------------------------------------------------------------------ //------------------------------------------------------------------ // calculate the dimension of Cmat //------------------------------------------------------------------ CNRows = nSchur; CNCols = nRows - nSchur; CGlobalNRows = globalNSchur; CGlobalNCols = globalNRows - globalNSchur; CStartRow = ProcNSchur[mypid_]; if ( HYOutputLevel_ & HYFEI_SCHURREDUCE1 ) { printf("%4d : buildSchurSystem : CStartRow = %d\n",mypid_,CStartRow); printf("%4d : buildSchurSystem : CGlobalDim = %d %d\n", mypid_, CGlobalNRows, CGlobalNCols); printf("%4d : buildSchurSystem : CLocalDim = %d %d\n",mypid_, CNRows, CNCols); } //------------------------------------------------------------------ // create a matrix context for Cmat //------------------------------------------------------------------ CStartCol = ProcNRows[mypid_] - ProcNSchur[mypid_]; ierr = HYPRE_IJMatrixCreate(comm_, CStartRow, CStartRow+CNRows-1, CStartCol, CStartCol+CNCols-1, &Cmat); ierr += HYPRE_IJMatrixSetObjectType(Cmat, HYPRE_PARCSR); hypre_assert(!ierr); //------------------------------------------------------------------ // compute the number of nonzeros per row in Cmat and call set up //------------------------------------------------------------------ maxRowSize = 0; CMatSize = new int[CNRows]; for ( i = 0; i < nSchur; i++ ) { rowIndex = schurList[i]; HYPRE_ParCSRMatrixGetRow(A_csr,rowIndex,&rowSize,&colInd,&colVal); newRowSize = 0; for (j = 0; j < rowSize; j++) { colIndex = colInd[j]; searchIndex = hypre_BinarySearch(globalSchurList,colIndex, globalNSchur); if (searchIndex < 0) newRowSize++; else if ( colVal[j] != 0.0 ) { if ( HYOutputLevel_ & HYFEI_SCHURREDUCE3 ) { printf("%4d : buildSchurSystem WARNING : A22 block != 0\n", mypid_); printf(" Cmat[%4d,%4d] = %e\n",rowIndex,colIndex,colVal[j]); } } } CMatSize[i] = newRowSize; maxRowSize = ( newRowSize > maxRowSize ) ? newRowSize : maxRowSize; HYPRE_ParCSRMatrixRestoreRow(A_csr,rowIndex,&rowSize,&colInd,&colVal); } ierr = HYPRE_IJMatrixSetRowSizes(Cmat, CMatSize); ierr += HYPRE_IJMatrixInitialize(Cmat); hypre_assert(!ierr); delete [] CMatSize; //------------------------------------------------------------------ // load Cmat extracted from A //------------------------------------------------------------------ newColInd = new int[maxRowSize+1]; newColVal = new double[maxRowSize+1]; rowCount = CStartRow; for ( i = 0; i < nSchur; i++ ) { rowIndex = schurList[i]; HYPRE_ParCSRMatrixGetRow(A_csr,rowIndex,&rowSize,&colInd,&colVal); newRowSize = 0; for (j = 0; j < rowSize; j++) { if ( colVal[j] != 0.0 ) { colIndex = colInd[j]; searchIndex = HYPRE_LSI_Search(globalSchurList,colIndex, globalNSchur); if ( searchIndex < 0 ) { searchIndex = - searchIndex - 1; for ( procIndex = 0; procIndex < numProcs_; procIndex++ ) if ( ProcNRows[procIndex] > colIndex ) break; procIndex--; colIndex = colInd[j] - searchIndex; //colIndex = colInd[j]-ProcNSchur[procIndex]-searchIndex; newColInd[newRowSize] = colIndex; newColVal[newRowSize++] = colVal[j]; if ( colIndex < 0 || colIndex >= CGlobalNCols ) { if ( HYOutputLevel_ & HYFEI_SCHURREDUCE1 ) { printf("%4d : buildSchurSystem WARNING - Cmat ", mypid_); printf("out of range %d - %d (%d)\n", rowCount,colIndex, CGlobalNCols); } } if ( newRowSize > maxRowSize+1 ) { if ( HYOutputLevel_ & HYFEI_SCHURREDUCE1 ) { printf("%4d buildSchurSystem : WARNING - ",mypid_); printf("passing array boundary(1).\n"); } } } } } HYPRE_ParCSRMatrixRestoreRow(A_csr,rowIndex,&rowSize,&colInd,&colVal); HYPRE_IJMatrixSetValues(Cmat, 1, &newRowSize, (const int *) &rowCount, (const int *) newColInd, (const double *) newColVal); rowCount++; } delete [] newColInd; delete [] newColVal; //------------------------------------------------------------------ // finally assemble the matrix //------------------------------------------------------------------ HYPRE_IJMatrixAssemble(Cmat); HYPRE_IJMatrixGetObject(Cmat, (void **) &C_csr); hypre_MatvecCommPkgCreate((hypre_ParCSRMatrix *) C_csr); if ( HYOutputLevel_ & HYFEI_SCHURREDUCE3 ) { ncnt = 0; MPI_Barrier(MPI_COMM_WORLD); while ( ncnt < numProcs_ ) { if ( mypid_ == ncnt ) { printf("====================================================\n"); printf("%4d buildSchurSystem : matrix Cmat assembled %d.\n", mypid_,CStartRow); fflush(stdout); for ( i = CStartRow; i < CStartRow+nSchur; i++ ) { HYPRE_ParCSRMatrixGetRow(C_csr,i,&rowSize,&colInd,&colVal); printf("Cmat ROW = %6d (%d)\n", i, rowSize); for ( j = 0; j < rowSize; j++ ) printf(" col = %6d, val = %e \n", colInd[j], colVal[j]); HYPRE_ParCSRMatrixRestoreRow(C_csr,i,&rowSize,&colInd,&colVal); } printf("====================================================\n"); } ncnt++; MPI_Barrier(MPI_COMM_WORLD); } } //****************************************************************** // construct the diagonal Mmat //------------------------------------------------------------------ //------------------------------------------------------------------ // calculate the dimension of Mmat //------------------------------------------------------------------ MNRows = nRows - nSchur; MNCols = nRows - nSchur; MGlobalNRows = globalNRows - globalNSchur; MGlobalNCols = globalNRows - globalNSchur; MStartRow = ProcNRows[mypid_] - ProcNSchur[mypid_]; if ( HYOutputLevel_ & HYFEI_SCHURREDUCE1 ) { printf("%4d : buildSchurSystem - MStartRow = %d\n",mypid_,MStartRow); printf("%4d : buildSchurSystem - MGlobalDim = %d %d\n", mypid_, MGlobalNRows, MGlobalNCols); printf("%4d : buildSchurSystem - MLocalDim = %d %d\n",mypid_, MNRows, MNCols); } //------------------------------------------------------------------ // create a matrix context for Mmat //------------------------------------------------------------------ ierr = HYPRE_IJMatrixCreate(comm_, MStartRow, MStartRow+MNRows-1, MStartRow, MStartRow+MNCols-1, &Mmat); ierr += HYPRE_IJMatrixSetObjectType(Mmat, HYPRE_PARCSR); MMatSize = new int[MNRows]; for ( i = 0; i < MNRows; i++ ) MMatSize[i] = 1; ierr = HYPRE_IJMatrixSetRowSizes(Mmat, MMatSize); ierr += HYPRE_IJMatrixInitialize(Mmat); hypre_assert(!ierr); delete [] MMatSize; //------------------------------------------------------------------ // load Mmat //------------------------------------------------------------------ maxdiag = -1.0E10; mindiag = 1.0E10; diagonal = new double[MNRows]; rowIndex = MStartRow; ierr = 0; for ( i = StartRow; i <= EndRow; i++ ) { searchIndex = hypre_BinarySearch(schurList, i, nSchur); if ( searchIndex < 0 ) { ncnt = 0; HYPRE_ParCSRMatrixGetRow(A_csr,i,&rowSize,&colInd,&colVal); for (j = 0; j < rowSize; j++) { colIndex = colInd[j]; if ( colIndex == i && colVal[j] != 0.0 ) { ddata = 1.0 / colVal[j]; maxdiag = ( colVal[j] > maxdiag ) ? colVal[j] : maxdiag; mindiag = ( colVal[j] < mindiag ) ? colVal[j] : mindiag; break; } if ( colVal[j] != 0.0 ) ncnt++; } if ( j == rowSize ) { if ( HYOutputLevel_ & HYFEI_SCHURREDUCE1 ) printf("%4d : buildSchurSystem WARNING - diag[%d] not found\n", mypid_, i); ierr = 1; } else if ( ncnt > 1 ) ierr = 1; diagonal[rowIndex-MStartRow] = ddata; HYPRE_ParCSRMatrixRestoreRow(A_csr,i,&rowSize,&colInd,&colVal); HYPRE_IJMatrixSetValues(Mmat, 1, &one, (const int *) &rowIndex, (const int *) &rowIndex, (const double *) &ddata); rowIndex++; } } ddata = maxdiag; MPI_Allreduce(&ddata, &maxdiag, 1, MPI_DOUBLE, MPI_MAX, comm_); ddata = -mindiag; MPI_Allreduce(&ddata, &mindiag, 1, MPI_DOUBLE, MPI_MAX, comm_); mindiag = - mindiag; if ( mypid_ == 0 && (HYOutputLevel_ & HYFEI_SCHURREDUCE1)) { printf("%4d : buildSchurSystem : max diagonal = %e\n",mypid_,maxdiag); printf("%4d : buildSchurSystem : min diagonal = %e\n",mypid_,mindiag); } //------------------------------------------------------------------ // finally assemble Mmat //------------------------------------------------------------------ HYPRE_IJMatrixAssemble(Mmat); HYPRE_IJMatrixGetObject(Mmat, (void **) &M_csr); hypre_MatvecCommPkgCreate((hypre_ParCSRMatrix *) M_csr); //------------------------------------------------------------------ // Error checking //------------------------------------------------------------------ MPI_Allreduce(&ierr, &ncnt, 1, MPI_INT, MPI_SUM, comm_); if ( ncnt > 0 ) { if ( HYOutputLevel_ & HYFEI_SCHURREDUCE1 ) { printf("buildSchurSystem WARNING : A11 not diagonal\n"); printf("buildSchurSystem WARNING : reduction not performed.\n"); } schurReduction_ = 0; delete [] ProcNRows; delete [] ProcNSchur; if ( nSchur > 0 ) delete [] schurList; if ( globalNSchur > 0 ) delete [] globalSchurList; HYPRE_IJMatrixDestroy(Cmat); return; } //****************************************************************** // construct CTmat (transpose of Cmat) //------------------------------------------------------------------ //------------------------------------------------------------------ // calculate the dimension of CTmat //------------------------------------------------------------------ CTNRows = CNCols; CTNCols = CNRows; CTGlobalNRows = CGlobalNCols; CTGlobalNCols = CGlobalNRows; CTStartRow = ProcNRows[mypid_] - ProcNSchur[mypid_]; if ( HYOutputLevel_ & HYFEI_SCHURREDUCE1 ) { printf("%4d : buildSchurSystem - CTStartRow = %d\n",mypid_,CTStartRow); printf("%4d : buildSchurSystem - CTGlobalDim = %d %d\n", mypid_, CTGlobalNRows, CTGlobalNCols); printf("%4d : buildSchurSystem - CTLocalDim = %d %d\n",mypid_, CTNRows, CTNCols); } //------------------------------------------------------------------ // create a matrix context for CTmat //------------------------------------------------------------------ ierr = HYPRE_IJMatrixCreate(comm_, CTStartRow, CTStartRow+CTNRows-1, CStartRow, CStartRow+CTNCols-1, &CTmat); ierr += HYPRE_IJMatrixSetObjectType(CTmat, HYPRE_PARCSR); hypre_assert(!ierr); //------------------------------------------------------------------ // compute the number of nonzeros per row in CTmat and call set up //------------------------------------------------------------------ maxRowSize = 0; CTMatSize = new int[CTNRows]; rowCount = 0; for ( i = StartRow; i <= EndRow; i++ ) { searchIndex = hypre_BinarySearch(schurList, i, nSchur); if ( searchIndex < 0 ) { HYPRE_ParCSRMatrixGetRow(A_csr,i,&rowSize,&colInd,&colVal); newRowSize = 0; for (j = 0; j < rowSize; j++) { colIndex = colInd[j]; searchIndex = hypre_BinarySearch(globalSchurList,colIndex, globalNSchur); if (searchIndex >= 0) newRowSize++; } //if ( newRowSize <= 0 && (HYOutputLevel_ & HYFEI_SCHURREDUCE1) ) // printf("%d : WARNING at row %d - empty row.\n", mypid_, i); if ( newRowSize <= 0 ) newRowSize = 1; CTMatSize[rowCount++] = newRowSize; maxRowSize = ( newRowSize > maxRowSize ) ? newRowSize : maxRowSize; HYPRE_ParCSRMatrixRestoreRow(A_csr,i,&rowSize,&colInd,&colVal); } } ierr = HYPRE_IJMatrixSetRowSizes(CTmat, CTMatSize); ierr += HYPRE_IJMatrixInitialize(CTmat); hypre_assert(!ierr); delete [] CTMatSize; //------------------------------------------------------------------ // load CTmat extracted from A //------------------------------------------------------------------ newColInd = new int[maxRowSize+1]; newColVal = new double[maxRowSize+1]; rowCount = CTStartRow; for ( i = StartRow; i <= EndRow; i++ ) { searchIndex = hypre_BinarySearch(schurList, i, nSchur); if ( searchIndex < 0 ) { HYPRE_ParCSRMatrixGetRow(A_csr,i,&rowSize,&colInd,&colVal); newRowSize = 0; for (j = 0; j < rowSize; j++) { colIndex = colInd[j]; searchIndex = hypre_BinarySearch(globalSchurList,colIndex, globalNSchur); if (searchIndex >= 0) { newColInd[newRowSize] = searchIndex; if ( searchIndex >= globalNSchur ) { if ( HYOutputLevel_ & HYFEI_SCHURREDUCE1 ) { printf("%4d : buildSchurSystem WARNING - CTmat ",mypid_); printf("out of range %d - %d (%d)\n", rowCount, searchIndex, globalNSchur); } } newColVal[newRowSize++] = colVal[j]; } } if ( newRowSize == 0 ) { newColInd[0] = ProcNSchur[mypid_]; newColVal[0] = 0.0; newRowSize = 1; } HYPRE_ParCSRMatrixRestoreRow(A_csr,i,&rowSize,&colInd,&colVal); HYPRE_IJMatrixSetValues(CTmat, 1, &newRowSize, (const int *) &rowCount, (const int *) newColInd, (const double *) newColVal); rowCount++; } } delete [] newColInd; delete [] newColVal; //------------------------------------------------------------------ // finally assemble the matrix //------------------------------------------------------------------ HYPRE_IJMatrixAssemble(CTmat); HYPRE_IJMatrixGetObject(CTmat, (void **) &CT_csr); hypre_MatvecCommPkgCreate((hypre_ParCSRMatrix *) CT_csr); if ( HYOutputLevel_ & HYFEI_SCHURREDUCE3 ) { ncnt = 0; MPI_Barrier(MPI_COMM_WORLD); while ( ncnt < numProcs_ ) { if ( mypid_ == ncnt ) { printf("====================================================\n"); printf("%4d buildSchurSystem : matrix CTmat assembled %d.\n", mypid_,CTStartRow); fflush(stdout); for ( i = CTStartRow; i < CTStartRow+CTNRows; i++ ) { HYPRE_ParCSRMatrixGetRow(CT_csr,i,&rowSize,&colInd,&colVal); printf("CTmat ROW = %6d (%d)\n", i, rowSize); for ( j = 0; j < rowSize; j++ ) printf(" col = %6d, val = %e \n", colInd[j], colVal[j]); HYPRE_ParCSRMatrixRestoreRow(CT_csr,i,&rowSize,&colInd, &colVal); } printf("====================================================\n"); } ncnt++; MPI_Barrier(MPI_COMM_WORLD); } } //****************************************************************** // perform the triple matrix product //------------------------------------------------------------------ if ( HYOutputLevel_ & HYFEI_SCHURREDUCE1 ) printf("%4d : buildSchurSystem - Triple matrix product begins..\n", mypid_); hypre_BoomerAMGBuildCoarseOperator( (hypre_ParCSRMatrix *) CT_csr, (hypre_ParCSRMatrix *) M_csr, (hypre_ParCSRMatrix *) CT_csr, (hypre_ParCSRMatrix **) &S_csr); if ( HYOutputLevel_ & HYFEI_SCHURREDUCE1 ) printf("%4d : buildSchurSystem - Triple matrix product ends\n",mypid_); if ( HYOutputLevel_ & HYFEI_SCHURREDUCE3 ) { MPI_Barrier(MPI_COMM_WORLD); ncnt = 0; while ( ncnt < numProcs_ ) { if ( mypid_ == ncnt ) { for ( i = CStartRow; i < CStartRow+CNRows; i++ ) { HYPRE_ParCSRMatrixGetRow(S_csr,i,&rowSize,&colInd, &colVal); printf("Schur ROW = %6d (%d)\n", i, rowSize); for ( j = 0; j < rowSize; j++ ) printf(" col = %6d, val = %e \n", colInd[j], colVal[j]); HYPRE_ParCSRMatrixRestoreRow(S_csr,i,&rowSize,&colInd,&colVal); } } MPI_Barrier(MPI_COMM_WORLD); ncnt++; } } // ***************************************************************** // form modified right hand side (f2 = f2 - C*M*f1) // ***************************************************************** //------------------------------------------------------------------ // form f2hat = C*M*f1 //------------------------------------------------------------------ HYPRE_IJVectorCreate(comm_, CTStartRow, CTStartRow+CTNRows-1, &f1); HYPRE_IJVectorSetObjectType(f1, HYPRE_PARCSR); ierr += HYPRE_IJVectorInitialize(f1); ierr += HYPRE_IJVectorAssemble(f1); hypre_assert(!ierr); HYPRE_IJVectorCreate(comm_, CStartRow, CStartRow+CNRows-1, &f2hat); HYPRE_IJVectorSetObjectType(f2hat, HYPRE_PARCSR); ierr += HYPRE_IJVectorInitialize(f2hat); ierr += HYPRE_IJVectorAssemble(f2hat); hypre_assert(!ierr); rowCount = CTStartRow; for ( i = StartRow; i <= EndRow; i++ ) { searchIndex = hypre_BinarySearch(schurList, i, nSchur); if ( searchIndex < 0 ) { HYPRE_IJVectorGetValues(HYb_, 1, &i, &ddata); ddata *= diagonal[rowCount-CTStartRow]; ierr = HYPRE_IJVectorSetValues(f1, 1, (const int *) &rowCount, (const double *) &ddata); hypre_assert( !ierr ); rowCount++; } } HYPRE_IJVectorGetObject(f1, (void **) &f1_csr); HYPRE_IJVectorGetObject(f2hat, (void **) &f2hat_csr); HYPRE_ParCSRMatrixMatvec( 1.0, C_csr, f1_csr, 0.0, f2hat_csr ); delete [] diagonal; HYPRE_IJVectorDestroy(f1); //------------------------------------------------------------------ // form f2 = f2 - f2hat //------------------------------------------------------------------ HYPRE_IJVectorCreate(comm_, CStartRow, CStartRow+CNRows-1, &f2); HYPRE_IJVectorSetObjectType(f2, HYPRE_PARCSR); ierr += HYPRE_IJVectorInitialize(f2); ierr += HYPRE_IJVectorAssemble(f2); hypre_assert(!ierr); rowCount = CStartRow; for ( i = 0; i < nSchur; i++ ) { rowIndex = schurList[i]; HYPRE_IJVectorGetValues(HYb_, 1, &rowIndex, &ddata); ddata = - ddata; ierr = HYPRE_IJVectorSetValues(f2, 1, (const int *) &rowCount, (const double *) &ddata); HYPRE_IJVectorGetValues(f2hat, 1, &rowCount, &ddata); HYPRE_IJVectorAddToValues(f2, 1, (const int *) &rowCount, (const double *) &ddata); HYPRE_IJVectorGetValues(f2, 1, &rowCount, &ddata); hypre_assert( !ierr ); rowCount++; } HYPRE_IJVectorDestroy(f2hat); // ***************************************************************** // set up the system with the new matrix // ***************************************************************** ierr = HYPRE_IJMatrixCreate(comm_, CStartRow, CStartRow+CNRows-1, CStartRow, CStartRow+CNRows-1, &reducedA_); ierr += HYPRE_IJMatrixSetObjectType(reducedA_, HYPRE_PARCSR); hypre_assert(!ierr); //------------------------------------------------------------------ // compute row sizes for the Schur complement //------------------------------------------------------------------ CMatSize = new int[CNRows]; maxRowSize = 0; for ( i = CStartRow; i < CStartRow+CNRows; i++ ) { HYPRE_ParCSRMatrixGetRow(S_csr,i,&rowSize,&colInd,NULL); rowIndex = schurList[i-CStartRow]; HYPRE_ParCSRMatrixGetRow(A_csr,rowIndex,&rowSize2,&colInd2,NULL); newRowSize = rowSize + rowSize2; newColInd = new int[newRowSize]; for (j = 0; j < rowSize; j++) newColInd[j] = colInd[j]; ncnt = 0; for (j = 0; j < rowSize2; j++) { colIndex = colInd2[j]; searchIndex = hypre_BinarySearch(globalSchurList,colIndex, globalNSchur); if ( searchIndex >= 0 ) { newColInd[rowSize+ncnt] = colInd2[j]; ncnt++; } } newRowSize = rowSize + ncnt; hypre_qsort0(newColInd, 0, newRowSize-1); ncnt = 0; for ( j = 1; j < newRowSize; j++ ) { if ( newColInd[j] != newColInd[ncnt] ) { ncnt++; newColInd[ncnt] = newColInd[j]; } } if ( newRowSize > 0 ) ncnt++; CMatSize[i-CStartRow] = ncnt; maxRowSize = ( ncnt > maxRowSize ) ? ncnt : maxRowSize; HYPRE_ParCSRMatrixRestoreRow(S_csr,i,&rowSize,&colInd,NULL); HYPRE_ParCSRMatrixRestoreRow(A_csr,rowIndex,&rowSize2,&colInd2,NULL); delete [] newColInd; } ierr = HYPRE_IJMatrixSetRowSizes(reducedA_, CMatSize); ierr += HYPRE_IJMatrixInitialize(reducedA_); hypre_assert(!ierr); delete [] CMatSize; //------------------------------------------------------------------ // load and assemble the Schur complement matrix //------------------------------------------------------------------ for ( i = CStartRow; i < CStartRow+CNRows; i++ ) { HYPRE_ParCSRMatrixGetRow(S_csr,i,&rowSize,&colInd,&colVal); rowIndex = schurList[i-CStartRow]; HYPRE_ParCSRMatrixGetRow(A_csr,rowIndex,&rowSize2,&colInd2,&colVal2); newRowSize = rowSize + rowSize2; newColInd = new int[newRowSize]; newColVal = new double[newRowSize]; for (j = 0; j < rowSize; j++) { newColInd[j] = colInd[j]; newColVal[j] = colVal[j]; } ncnt = 0; for (j = 0; j < rowSize2; j++) { colIndex = colInd2[j]; searchIndex = hypre_BinarySearch(globalSchurList,colIndex, globalNSchur); if ( searchIndex >= 0 ) { newColInd[rowSize+ncnt] = searchIndex; newColVal[rowSize+ncnt] = - colVal2[j]; ncnt++; } } newRowSize = rowSize + ncnt; hypre_qsort1(newColInd, newColVal, 0, newRowSize-1); ncnt = 0; for ( j = 1; j < newRowSize; j++ ) { if ( newColInd[j] == newColInd[ncnt] ) { newColVal[ncnt] += newColVal[j]; } else { ncnt++; newColInd[ncnt] = newColInd[j]; newColVal[ncnt] = newColVal[j]; } } if ( newRowSize > 0 ) newRowSize = ++ncnt; ncnt = 0; ddata = 0.0; for ( j = 0; j < newRowSize; j++ ) if ( habs(newColVal[j]) > ddata ) ddata = habs(newColVal[j]); for ( j = 0; j < newRowSize; j++ ) { if ( habs(newColVal[j]) > ddata*1.0e-14 ) { newColInd[ncnt] = newColInd[j]; newColVal[ncnt++] = newColVal[j]; } } newRowSize = ncnt; HYPRE_ParCSRMatrixRestoreRow(S_csr,i,&rowSize,&colInd,&colVal); HYPRE_ParCSRMatrixRestoreRow(A_csr,rowIndex,&rowSize2,&colInd2, &colVal2); HYPRE_IJMatrixSetValues(reducedA_, 1, &newRowSize, (const int *) &i, (const int *) newColInd, (const double *) newColVal); delete [] newColInd; delete [] newColVal; } HYPRE_IJMatrixAssemble(reducedA_); HYPRE_ParCSRMatrixDestroy(S_csr); //------------------------------------------------------------------ // create and initialize the reduced x, and create the reduced r //------------------------------------------------------------------ ierr = HYPRE_IJVectorCreate(comm_,CStartRow,CStartRow+CNRows-1,&reducedX_); ierr = HYPRE_IJVectorSetObjectType(reducedX_, HYPRE_PARCSR); ierr = HYPRE_IJVectorInitialize(reducedX_); ierr = HYPRE_IJVectorAssemble(reducedX_); hypre_assert(!ierr); ierr = HYPRE_IJVectorCreate(comm_,CStartRow,CStartRow+CNRows-1,&reducedR_); ierr = HYPRE_IJVectorSetObjectType(reducedR_, HYPRE_PARCSR); ierr = HYPRE_IJVectorInitialize(reducedR_); ierr = HYPRE_IJVectorAssemble(reducedR_); hypre_assert(!ierr); //------------------------------------------------------------------ // save A21 and invA22 for solution recovery //------------------------------------------------------------------ reducedB_ = f2; currA_ = reducedA_; currB_ = reducedB_; currR_ = reducedR_; currX_ = reducedX_; HYA21_ = CTmat; HYA12_ = Cmat; HYinvA22_ = Mmat; A21NRows_ = CTNRows; A21NCols_ = CTNCols; buildSchurInitialGuess(); //------------------------------------------------------------------ // final clean up //------------------------------------------------------------------ delete [] globalSchurList; selectedList_ = schurList; delete [] ProcNRows; delete [] ProcNSchur; if ( colValues_ != NULL ) { for ( j = 0; j < localEndRow_-localStartRow_+1; j++ ) if ( colValues_[j] != NULL ) delete [] colValues_[j]; delete [] colValues_; colValues_ = NULL; } if ( mypid_ == 0 && (HYOutputLevel_ & HYFEI_SCHURREDUCE1) ) printf(" buildSchurSystem ends....\n"); } //***************************************************************************** // build the solution vector for Schur-reduced systems //----------------------------------------------------------------------------- double HYPRE_LinSysCore::buildSchurReducedSoln() { int i, *int_array, *gint_array, x2NRows, x2GlobalNRows; int ierr, rowNum, startRow, startRow2, index, localNRows; double ddata, rnorm; HYPRE_ParCSRMatrix A_csr, A21_csr, A22_csr; HYPRE_ParVector x_csr, x2_csr, r_csr, b_csr; HYPRE_IJVector R1, x2; if ( HYA21_ == NULL || HYinvA22_ == NULL ) { printf("buildSchurReducedSoln WARNING : A21 or A22 absent.\n"); return (0.0); } else { //--------------------------------------------------------------- // compute A21 * sol //--------------------------------------------------------------- int_array = new int[numProcs_]; gint_array = new int[numProcs_]; x2NRows = A21NRows_; for ( i = 0; i < numProcs_; i++ ) int_array[i] = 0; int_array[mypid_] = x2NRows; MPI_Allreduce(int_array,gint_array,numProcs_,MPI_INT,MPI_SUM,comm_); x2GlobalNRows = 0; for ( i = 0; i < numProcs_; i++ ) x2GlobalNRows += gint_array[i]; rowNum = 0; for ( i = 0; i < mypid_; i++ ) rowNum += gint_array[i]; startRow = rowNum; startRow2 = localStartRow_ - 1 - rowNum; delete [] int_array; delete [] gint_array; localNRows = localEndRow_ - localStartRow_ + 1 - A21NRows_; ierr = HYPRE_IJVectorCreate(comm_, startRow, startRow+x2NRows-1, &R1); ierr = HYPRE_IJVectorSetObjectType(R1, HYPRE_PARCSR); ierr = HYPRE_IJVectorInitialize(R1); ierr = HYPRE_IJVectorAssemble(R1); hypre_assert(!ierr); HYPRE_IJMatrixGetObject(HYA21_, (void **) &A21_csr); HYPRE_IJVectorGetObject(currX_, (void **) &x_csr); HYPRE_IJVectorGetObject(R1, (void **) &r_csr); HYPRE_ParCSRMatrixMatvec( -1.0, A21_csr, x_csr, 0.0, r_csr ); //------------------------------------------------------------- // f2 - A21 * sol //------------------------------------------------------------- rowNum = startRow; if ( selectedList_ != NULL ) { for ( i = localStartRow_-1; i < localEndRow_; i++ ) { if (HYPRE_LSI_Search(selectedList_,i,localNRows)<0) { HYPRE_IJVectorGetValues(HYb_, 1, &i, &ddata); HYPRE_IJVectorAddToValues(R1, 1, (const int *) &rowNum, (const double *) &ddata); rowNum++; } } } else { for ( i = localStartRow_-1; i < localEndRow_-A21NCols_; i++ ) { HYPRE_IJVectorGetValues(HYb_, 1, &i, &ddata); HYPRE_IJVectorAddToValues(R1, 1, (const int *) &rowNum, (const double *) &ddata); HYPRE_IJVectorGetValues(R1, 1, &rowNum, &ddata); rowNum++; } } //------------------------------------------------------------- // inv(A22) * (f2 - A21 * sol) //------------------------------------------------------------- ierr = HYPRE_IJVectorCreate(comm_, startRow, startRow+x2NRows-1, &x2); ierr = HYPRE_IJVectorSetObjectType(x2, HYPRE_PARCSR); ierr = HYPRE_IJVectorInitialize(x2); ierr = HYPRE_IJVectorAssemble(x2); hypre_assert(!ierr); HYPRE_IJMatrixGetObject(HYinvA22_, (void **) &A22_csr); HYPRE_IJVectorGetObject(R1, (void **) &r_csr); HYPRE_IJVectorGetObject(x2, (void **) &x2_csr); HYPRE_ParCSRMatrixMatvec( 1.0, A22_csr, r_csr, 0.0, x2_csr ); //------------------------------------------------------------- // inject final solution to the solution vector //------------------------------------------------------------- if ( selectedList_ != NULL ) { for ( i = startRow2; i < startRow2+localNRows; i++ ) { HYPRE_IJVectorGetValues(reducedX_, 1, &i, &ddata); index = selectedList_[i-startRow2]; HYPRE_IJVectorSetValues(HYx_, 1, (const int *) &index, (const double *) &ddata); } rowNum = localStartRow_ - 1; for ( i = startRow; i < startRow+A21NRows_; i++ ) { HYPRE_IJVectorGetValues(x2, 1, &i, &ddata); while (HYPRE_LSI_Search(selectedList_,rowNum,localNRows)>=0) rowNum++; HYPRE_IJVectorSetValues(HYx_, 1, (const int *) &rowNum, (const double *) &ddata); rowNum++; } } else { for ( i = startRow2; i < startRow2+localNRows; i++ ) { HYPRE_IJVectorGetValues(reducedX_, 1, &i, &ddata); index = localEndRow_ - A21NCols_ + i - startRow2; HYPRE_IJVectorSetValues(HYx_, 1, (const int *) &index, (const double *) &ddata); } rowNum = localStartRow_ - 1; for ( i = startRow; i < startRow+A21NRows_; i++ ) { HYPRE_IJVectorGetValues(x2, 1, &i, &ddata); HYPRE_IJVectorSetValues(HYx_, 1, (const int *) &rowNum, (const double *) &ddata); rowNum++; } } //------------------------------------------------------------- // residual norm check //------------------------------------------------------------- HYPRE_IJMatrixGetObject(HYA_, (void **) &A_csr); HYPRE_IJVectorGetObject(HYx_, (void **) &x_csr); HYPRE_IJVectorGetObject(HYb_, (void **) &b_csr); HYPRE_IJVectorGetObject(HYr_, (void **) &r_csr); HYPRE_ParVectorCopy( b_csr, r_csr ); HYPRE_ParCSRMatrixMatvec( -1.0, A_csr, x_csr, 1.0, r_csr ); HYPRE_ParVectorInnerProd( r_csr, r_csr, &rnorm); rnorm = sqrt( rnorm ); if ( mypid_ == 0 && ( HYOutputLevel_ & HYFEI_SCHURREDUCE1 ) ) printf(" buildReducedSystemSoln::final residual norm = %e\n", rnorm); } currX_ = HYx_; //**************************************************************** // clean up //---------------------------------------------------------------- HYPRE_IJVectorDestroy(R1); HYPRE_IJVectorDestroy(x2); return rnorm; } //***************************************************************************** // form initial solution for the reduced system //----------------------------------------------------------------------------- void HYPRE_LinSysCore::buildSchurInitialGuess() { int i, ierr, EndRow, nSchur, *partition, CStartRow; int *getIndices, *putIndices; double *dArray; HYPRE_ParVector hypre_x; //------------------------------------------------------------------ // initial set up //------------------------------------------------------------------ if (reducedX_ == HYx_ || reducedX_ == NULL || reducedA_ == NULL) return; EndRow = localEndRow_ - 1; nSchur = A21NCols_; if ( nSchur == 0 ) return; HYPRE_IJVectorGetObject(reducedX_, (void **) &hypre_x); partition = hypre_ParVectorPartitioning((hypre_ParVector *) hypre_x); CStartRow = partition[mypid_]; //------------------------------------------------------------------ // injecting initial guesses //------------------------------------------------------------------ if ( selectedList_ != NULL ) getIndices = selectedList_; else { getIndices = new int[nSchur]; for ( i = 0; i < nSchur; i++ ) getIndices[i] = EndRow+1-nSchur+i; } dArray = new double[nSchur]; putIndices = new int[nSchur]; for ( i = 0; i < nSchur; i++ ) putIndices[i] = CStartRow + i; HYPRE_IJVectorGetValues(HYx_, nSchur, getIndices, dArray); ierr = HYPRE_IJVectorSetValues(reducedX_, nSchur, (const int *) putIndices, (const double *) dArray); hypre_assert( !ierr ); delete [] dArray; delete [] putIndices; if ( selectedList_ == NULL ) delete [] getIndices; } //***************************************************************************** // form modified right hand side (f2 = f2 - C*M*f1) //----------------------------------------------------------------------------- void HYPRE_LinSysCore::buildSchurReducedRHS() { int i, ncnt, ncnt2, ierr, *colInd, CTStartRow, CStartRow, rowIndex; int StartRow, EndRow; int nSchur, *schurList, *ProcNRows, *ProcNSchur; int globalNSchur, CTNRows, CTNCols, CTGlobalNRows, CTGlobalNCols; int CNRows, *tempList, searchIndex, rowCount, rowSize; double ddata, ddata2, *colVal; HYPRE_IJMatrix Cmat, Mmat; HYPRE_IJVector f1, f2, f2hat; HYPRE_ParVector f1_csr, f2hat_csr; HYPRE_ParCSRMatrix M_csr, C_csr; //****************************************************************** // initial set up //------------------------------------------------------------------ if ( mypid_ == 0 && (HYOutputLevel_ & HYFEI_SCHURREDUCE1) ) printf(" buildSchurRHS begins....\n"); if ( HYA21_ == NULL || HYinvA22_ == NULL ) { printf("buildSchurReducedRHS WARNING : A21 or A22 absent.\n"); return; } StartRow = localStartRow_ - 1; EndRow = localEndRow_ - 1; //------------------------------------------------------------------ // get information about processor offsets and globalNRows // (ProcNRows, globalNRows) //------------------------------------------------------------------ ProcNRows = new int[numProcs_]; tempList = new int[numProcs_]; for ( i = 0; i < numProcs_; i++ ) tempList[i] = 0; tempList[mypid_] = EndRow - StartRow + 1; MPI_Allreduce(tempList, ProcNRows, numProcs_, MPI_INT, MPI_SUM, comm_); ncnt = 0; for ( i = 0; i < numProcs_; i++ ) { ncnt2 = ProcNRows[i]; ProcNRows[i] = ncnt; ncnt += ncnt2; } ProcNSchur = new int[numProcs_]; for ( i = 0; i < numProcs_; i++ ) tempList[i] = 0; tempList[mypid_] = A21NCols_; MPI_Allreduce(tempList, ProcNSchur, numProcs_, MPI_INT, MPI_SUM, comm_); globalNSchur = 0; ncnt = 0; for ( i = 0; i < numProcs_; i++ ) { globalNSchur += ProcNSchur[i]; ncnt2 = ProcNSchur[i]; ProcNSchur[i] = ncnt; ncnt += ncnt2; } CStartRow = ProcNSchur[mypid_]; CTStartRow = ProcNRows[mypid_] - ProcNSchur[mypid_]; delete [] ProcNRows; delete [] ProcNSchur; delete [] tempList; CTNRows = A21NRows_; CTNCols = A21NCols_; MPI_Allreduce(&CTNRows, &CTGlobalNRows, 1, MPI_INT, MPI_SUM, comm_); MPI_Allreduce(&CTNCols, &CTGlobalNCols, 1, MPI_INT, MPI_SUM, comm_); Cmat = HYA12_; Mmat = HYinvA22_; CNRows = CTNCols; nSchur = A21NCols_; schurList = selectedList_; HYPRE_IJMatrixGetObject(Mmat, (void **) &M_csr); HYPRE_IJMatrixGetObject(Cmat, (void **) &C_csr); // ***************************************************************** // form f2hat = C*M*f1 //------------------------------------------------------------------ HYPRE_IJVectorCreate(comm_, CTStartRow, CTStartRow+CTNRows-1, &f1); HYPRE_IJVectorSetObjectType(f1, HYPRE_PARCSR); ierr = HYPRE_IJVectorInitialize(f1); ierr = HYPRE_IJVectorAssemble(f1); hypre_assert(!ierr); HYPRE_IJVectorCreate(comm_, CStartRow, CStartRow+CNRows-1, &f2hat); HYPRE_IJVectorSetObjectType(f2hat, HYPRE_PARCSR); ierr += HYPRE_IJVectorInitialize(f2hat); ierr = HYPRE_IJVectorAssemble(f2hat); hypre_assert(!ierr); rowCount = CTStartRow; if ( schurList != NULL ) { for ( i = StartRow; i <= EndRow; i++ ) { searchIndex = hypre_BinarySearch(schurList, i, nSchur); if ( searchIndex < 0 ) { HYPRE_IJVectorGetValues(HYb_, 1, &i, &ddata); HYPRE_ParCSRMatrixGetRow(M_csr,rowCount,&rowSize,&colInd,&colVal); if ( rowSize != 1 ) printf("buildReducedRHS : WARNING.\n"); if ( colVal[0] != 0.0 ) ddata *= colVal[0]; ierr = HYPRE_IJVectorSetValues(f1, 1, (const int *) &rowCount, (const double *) &ddata); HYPRE_ParCSRMatrixRestoreRow(M_csr,rowCount,&rowSize,&colInd, &colVal); hypre_assert( !ierr ); rowCount++; } } } else { for ( i = StartRow; i <= EndRow-nSchur; i++ ) { HYPRE_IJVectorGetValues(HYb_, 1, &i, &ddata); HYPRE_ParCSRMatrixGetRow(M_csr,rowCount,&rowSize,&colInd,&colVal); if ( rowSize != 1 ) printf("buildReducedRHS : WARNING.\n"); if ( colVal[0] != 0.0 ) ddata *= colVal[0]; ierr = HYPRE_IJVectorSetValues(f1, 1, (const int *) &rowCount, (const double *) &ddata); HYPRE_ParCSRMatrixRestoreRow(M_csr,rowCount,&rowSize,&colInd, &colVal); hypre_assert( !ierr ); rowCount++; } } HYPRE_IJVectorGetObject(f1, (void **) &f1_csr); HYPRE_IJVectorGetObject(f2hat, (void **) &f2hat_csr); HYPRE_ParCSRMatrixMatvec( 1.0, C_csr, f1_csr, 0.0, f2hat_csr ); HYPRE_IJVectorDestroy(f1); //------------------------------------------------------------------ // form f2 = f2 - f2hat //------------------------------------------------------------------ HYPRE_IJVectorCreate(comm_, CStartRow, CStartRow+CNRows-1, &f2); HYPRE_IJVectorSetObjectType(f2, HYPRE_PARCSR); ierr += HYPRE_IJVectorInitialize(f2); ierr += HYPRE_IJVectorAssemble(f2); hypre_assert(!ierr); rowCount = CStartRow; for ( i = 0; i < nSchur; i++ ) { if ( schurList != NULL ) rowIndex = schurList[i]; else rowIndex = EndRow+1-nSchur+i; HYPRE_IJVectorGetValues(HYb_, 1, &rowIndex, &ddata); HYPRE_IJVectorGetValues(f2hat, 1, &rowCount, &ddata2); ddata = ddata2 - ddata; ierr = HYPRE_IJVectorSetValues(f2, 1, (const int *) &rowCount, (const double *) &ddata); hypre_assert( !ierr ); rowCount++; } HYPRE_IJVectorDestroy(f2hat); //****************************************************************** // initialize current matrix system //------------------------------------------------------------------ if ( reducedB_ != NULL ) HYPRE_IJVectorDestroy(reducedB_); reducedB_ = f2; currA_ = reducedA_; currB_ = reducedB_; currR_ = reducedR_; currX_ = reducedX_; if ( mypid_ == 0 && (HYOutputLevel_ & HYFEI_SCHURREDUCE1) ) printf(" buildSchurRHS ends....\n"); } //***************************************************************************** // Given the matrix (A) within the object, compute the reduced system and put // it in place. Additional information given are : // (This version is different from the previous one in that users are supposed // to give hypre the number of rows in the reduced matrix starting from the // bottom, and that the (2,2) block is not expected to be a zero block) //----------------------------------------------------------------------------- void HYPRE_LinSysCore::buildSchurReducedSystem2() { int i, j, ierr, ncnt, one=1; int nRows, globalNRows, StartRow, EndRow, colIndex; int nSchur, globalNSchur; int CStartRow, CNRows, CNCols, CGlobalNRows, CGlobalNCols; int CTStartRow, CTNRows, CTNCols; int MStartRow, MNRows, MNCols, MGlobalNRows, MGlobalNCols; int rowSize, rowCount, rowIndex, maxRowSize, newRowSize; int *CMatSize, *CTMatSize, *MMatSize, *colInd, *newColInd, *colInd2; int *tempList, rowSize2; int *ProcNRows, *ProcNSchur, searchIndex, CStartCol; double *colVal, *newColVal, *diagonal, ddata, maxdiag, mindiag, darray[2]; double darray2[2], *colVal2, rowmax; HYPRE_IJMatrix Cmat, CTmat, Mmat; HYPRE_ParCSRMatrix A_csr, C_csr, CT_csr, M_csr, S_csr; HYPRE_IJVector f1, f2, f2hat; HYPRE_ParVector f1_csr, f2hat_csr; //****************************************************************** // output initial message and clean up //------------------------------------------------------------------ if ( mypid_ == 0 && (HYOutputLevel_ & HYFEI_SCHURREDUCE1) ) printf("buildSchurSystem (2) begins....\n"); if ( HYA21_ != NULL ) HYPRE_IJMatrixDestroy(HYA21_); if ( HYA12_ != NULL ) HYPRE_IJMatrixDestroy(HYA12_); if ( HYinvA22_ != NULL ) HYPRE_IJMatrixDestroy(HYinvA22_); if ( reducedB_ != NULL ) HYPRE_IJVectorDestroy(reducedB_); if ( reducedX_ != NULL ) HYPRE_IJVectorDestroy(reducedX_); if ( reducedR_ != NULL ) HYPRE_IJVectorDestroy(reducedR_); if ( reducedA_ != NULL ) HYPRE_IJMatrixDestroy(reducedA_); HYA21_ = NULL; HYA12_ = NULL; HYinvA22_ = NULL; reducedB_ = NULL; reducedX_ = NULL; reducedR_ = NULL; reducedA_ = NULL; //****************************************************************** // set up local information //------------------------------------------------------------------ StartRow = localStartRow_ - 1; EndRow = localEndRow_ - 1; nRows = localEndRow_ - localStartRow_ + 1; HYPRE_IJMatrixGetObject(HYA_, (void **) &A_csr); if ( HYOutputLevel_ & HYFEI_SCHURREDUCE1 ) printf("%4d : buildSchurSystem - StartRow/EndRow = %d %d\n",mypid_, StartRow,EndRow); //****************************************************************** // construct global information about the matrix //------------------------------------------------------------------ ProcNRows = new int[numProcs_]; tempList = new int[numProcs_]; for ( i = 0; i < numProcs_; i++ ) tempList[i] = 0; tempList[mypid_] = nRows; MPI_Allreduce(tempList, ProcNRows, numProcs_, MPI_INT, MPI_SUM, comm_); delete [] tempList; globalNRows = 0; for ( i = 0; i < numProcs_; i++ ) { ncnt = globalNRows; globalNRows += ProcNRows[i]; ProcNRows[i] = ncnt; } //****************************************************************** // perform an automatic search for nSchur //------------------------------------------------------------------ nSchur = 0; for ( i = StartRow; i <= EndRow; i++ ) { HYPRE_ParCSRMatrixGetRow(A_csr,i,&rowSize,&colInd,&colVal); searchIndex = globalNRows + 1; for (j = 0; j < rowSize; j++) { colIndex = colInd[j]; if ( colIndex < searchIndex && colVal[j] != 0.0 ) searchIndex = colIndex; } HYPRE_ParCSRMatrixRestoreRow(A_csr,i,&rowSize,&colInd,&colVal); if ( searchIndex >= i ) nSchur++; else break; } nSchur = EndRow - StartRow + 1 - nSchur; MPI_Allreduce(&nSchur, &globalNSchur, 1, MPI_INT, MPI_SUM,comm_); if ( HYOutputLevel_ & HYFEI_SCHURREDUCE1 ) { printf("%4d buildSchurSystem : nSchur = %d\n",mypid_,nSchur); if ( globalNSchur == 0 && mypid_ == 0 ) printf("buildSchurSystem WARNING : nSchur = 0 on all processors.\n"); } if ( globalNSchur == 0 ) { schurReduction_ = 0; delete [] ProcNRows; return; } //****************************************************************** // construct global information about the reduced matrix //------------------------------------------------------------------ ProcNSchur = new int[numProcs_]; tempList = new int[numProcs_]; for ( i = 0; i < numProcs_; i++ ) tempList[i] = 0; tempList[mypid_] = nSchur; MPI_Allreduce(tempList, ProcNSchur, numProcs_, MPI_INT, MPI_SUM, comm_); delete [] tempList; globalNSchur = 0; for ( i = 0; i < numProcs_; i++ ) { ncnt = globalNSchur; globalNSchur += ProcNSchur[i]; ProcNSchur[i] = ncnt; } //****************************************************************** // construct Cmat //------------------------------------------------------------------ //------------------------------------------------------------------ // calculate the dimension of Cmat //------------------------------------------------------------------ CNRows = nSchur; CNCols = nRows - nSchur; CGlobalNRows = globalNSchur; CGlobalNCols = globalNRows - globalNSchur; CStartRow = ProcNSchur[mypid_]; if ( HYOutputLevel_ & HYFEI_SCHURREDUCE1 ) { printf("%4d buildSchurSystem : CStartRow = %d\n",mypid_,CStartRow); printf("%4d buildSchurSystem : CGlobalDim = %d %d\n", mypid_, CGlobalNRows, CGlobalNCols); printf("%4d buildSchurSystem : CLocalDim = %d %d\n",mypid_, CNRows, CNCols); } //------------------------------------------------------------------ // create a matrix context for Cmat //------------------------------------------------------------------ CStartCol = ProcNRows[mypid_] - ProcNSchur[mypid_]; ierr = HYPRE_IJMatrixCreate(comm_, CStartRow, CStartRow+CNRows-1, CStartCol, CStartCol+CNCols-1, &Cmat); ierr += HYPRE_IJMatrixSetObjectType(Cmat, HYPRE_PARCSR); hypre_assert(!ierr); //------------------------------------------------------------------ // compute the number of nonzeros per row in Cmat and call set up //------------------------------------------------------------------ maxRowSize = 0; CMatSize = new int[CNRows]; for ( i = 0; i < nSchur; i++ ) { rowIndex = EndRow - nSchur + i + 1; HYPRE_ParCSRMatrixGetRow(A_csr,rowIndex,&rowSize,&colInd,&colVal); newRowSize = 0; for (j = 0; j < rowSize; j++) { colIndex = colInd[j]; searchIndex = HYPRE_Schur_Search(colIndex, numProcs_, ProcNRows, ProcNSchur, globalNRows, globalNSchur); if (searchIndex < 0) newRowSize++; } CMatSize[i] = newRowSize; maxRowSize = ( newRowSize > maxRowSize ) ? newRowSize : maxRowSize; HYPRE_ParCSRMatrixRestoreRow(A_csr,rowIndex,&rowSize,&colInd,&colVal); } ierr = HYPRE_IJMatrixSetRowSizes(Cmat, CMatSize); ierr += HYPRE_IJMatrixInitialize(Cmat); hypre_assert(!ierr); delete [] CMatSize; //------------------------------------------------------------------ // load Cmat extracted from A //------------------------------------------------------------------ newColInd = new int[maxRowSize+1]; newColVal = new double[maxRowSize+1]; rowCount = CStartRow; for ( i = 0; i < nSchur; i++ ) { rowIndex = EndRow - nSchur + i + 1; HYPRE_ParCSRMatrixGetRow(A_csr,rowIndex,&rowSize,&colInd,&colVal); newRowSize = 0; for (j = 0; j < rowSize; j++) { if ( colVal[j] != 0.0 ) { colIndex = colInd[j]; searchIndex = HYPRE_Schur_Search(colIndex, numProcs_, ProcNRows, ProcNSchur, globalNRows, globalNSchur); if ( searchIndex < 0 ) { searchIndex = - searchIndex - 1; colIndex = searchIndex; newColInd[newRowSize] = colIndex; newColVal[newRowSize++] = colVal[j]; if ( colIndex < 0 || colIndex >= CGlobalNCols ) { if ( HYOutputLevel_ & HYFEI_SCHURREDUCE1 ) { printf("%4d buildSchurSystem WARNING : Cmat ", mypid_); printf("out of range %d - %d (%d)\n", rowCount, colIndex, CGlobalNCols); } } if ( newRowSize > maxRowSize+1 ) { if ( HYOutputLevel_ & HYFEI_SCHURREDUCE1 ) { printf("%4d buildSchurSystem : WARNING - ",mypid_); printf("passing array boundary(1).\n"); } } } } } HYPRE_ParCSRMatrixRestoreRow(A_csr,rowIndex,&rowSize,&colInd,&colVal); HYPRE_IJMatrixSetValues(Cmat, 1, &newRowSize, (const int *) &rowCount, (const int *) newColInd, (const double *) newColVal); rowCount++; } delete [] newColInd; delete [] newColVal; //------------------------------------------------------------------ // finally assemble the matrix //------------------------------------------------------------------ HYPRE_IJMatrixAssemble(Cmat); HYPRE_IJMatrixGetObject(Cmat, (void **) &C_csr); hypre_MatvecCommPkgCreate((hypre_ParCSRMatrix *) C_csr); if ( HYOutputLevel_ & HYFEI_SCHURREDUCE3 ) { ncnt = 0; MPI_Barrier(MPI_COMM_WORLD); while ( ncnt < numProcs_ ) { if ( mypid_ == ncnt ) { printf("====================================================\n"); printf("%4d buildSchurSystem : matrix Cmat assembled %d.\n", mypid_,CStartRow); fflush(stdout); for ( i = CStartRow; i < CStartRow+nSchur; i++ ) { HYPRE_ParCSRMatrixGetRow(C_csr,i,&rowSize,&colInd,&colVal); printf("Cmat ROW = %6d (%d)\n", i, rowSize); for ( j = 0; j < rowSize; j++ ) printf(" col = %6d, val = %e \n", colInd[j], colVal[j]); HYPRE_ParCSRMatrixRestoreRow(C_csr,i,&rowSize,&colInd,&colVal); } printf("====================================================\n"); } ncnt++; MPI_Barrier(MPI_COMM_WORLD); } } //****************************************************************** // construct the diagonal Mmat and CTmat //------------------------------------------------------------------ //------------------------------------------------------------------ // calculate the dimension of Mmat and CTmat //------------------------------------------------------------------ MNRows = nRows - nSchur; MNCols = nRows - nSchur; MGlobalNRows = globalNRows - globalNSchur; MGlobalNCols = globalNRows - globalNSchur; MStartRow = ProcNRows[mypid_] - ProcNSchur[mypid_]; CTNRows = nRows - nSchur; CTNCols = nSchur; CTStartRow = ProcNRows[mypid_] - ProcNSchur[mypid_]; if ( HYOutputLevel_ & HYFEI_SCHURREDUCE1 ) { printf("%4d buildSchurSystem : MStartRow = %d\n",mypid_,MStartRow); printf("%4d buildSchurSystem : MGlobalDim = %d %d\n", mypid_, MGlobalNRows, MGlobalNCols); printf("%4d buildSchurSystem : MLocalDim = %d %d\n",mypid_, MNRows, MNCols); } //------------------------------------------------------------------ // create a matrix context for Mmat and CTmat //------------------------------------------------------------------ ierr = HYPRE_IJMatrixCreate(comm_, MStartRow, MStartRow+MNRows-1, MStartRow, MStartRow+MNCols-1, &Mmat); ierr += HYPRE_IJMatrixSetObjectType(Mmat, HYPRE_PARCSR); hypre_assert(!ierr); ierr = HYPRE_IJMatrixCreate(comm_, CTStartRow, CTStartRow+CTNRows-1, CStartRow, CStartRow+CTNCols-1, &CTmat); ierr += HYPRE_IJMatrixSetObjectType(Mmat, HYPRE_PARCSR); hypre_assert(!ierr); //------------------------------------------------------------------ // compute row sizes for Mmat //------------------------------------------------------------------ MMatSize = new int[MNRows]; for ( i = 0; i < MNRows; i++ ) MMatSize[i] = 1; ierr = HYPRE_IJMatrixSetRowSizes(Mmat, MMatSize); ierr += HYPRE_IJMatrixInitialize(Mmat); hypre_assert(!ierr); delete [] MMatSize; //------------------------------------------------------------------ // compute row sizes for CTmat //------------------------------------------------------------------ maxRowSize = 0; CTMatSize = new int[CTNRows]; rowCount = 0; for ( i = StartRow; i <= EndRow-nSchur; i++ ) { HYPRE_ParCSRMatrixGetRow(A_csr,i,&rowSize,&colInd,&colVal); newRowSize = 0; for (j = 0; j < rowSize; j++) { colIndex = colInd[j]; if ( colVal[j] != 0.0 ) { searchIndex = HYPRE_Schur_Search(colIndex, numProcs_, ProcNRows, ProcNSchur, globalNRows, globalNSchur); if (searchIndex >= 0) newRowSize++; } } if ( newRowSize <= 0 && (HYOutputLevel_ & HYFEI_SCHURREDUCE3) ) printf("%d : WARNING at row %d - empty row.\n", mypid_, i); if ( newRowSize <= 0 ) newRowSize = 1; CTMatSize[rowCount++] = newRowSize; maxRowSize = ( newRowSize > maxRowSize ) ? newRowSize : maxRowSize; HYPRE_ParCSRMatrixRestoreRow(A_csr,i,&rowSize,&colInd,&colVal); } ierr = HYPRE_IJMatrixSetRowSizes(CTmat, CTMatSize); ierr += HYPRE_IJMatrixInitialize(CTmat); hypre_assert(!ierr); delete [] CTMatSize; //------------------------------------------------------------------ // load Mmat and CTmat //------------------------------------------------------------------ newColInd = new int[maxRowSize+1]; newColVal = new double[maxRowSize+1]; maxdiag = -1.0E10; mindiag = 1.0E10; diagonal = new double[MNRows]; rowIndex = MStartRow; ierr = 0; for ( i = StartRow; i <= EndRow-nSchur; i++ ) { ncnt = 0; HYPRE_ParCSRMatrixGetRow(A_csr,i,&rowSize,&colInd,&colVal); newRowSize = 0; for (j = 0; j < rowSize; j++) { colIndex = colInd[j]; if ( colVal[j] != 0.0 ) { searchIndex = HYPRE_Schur_Search(colIndex, numProcs_, ProcNRows, ProcNSchur, globalNRows, globalNSchur); if (searchIndex >= 0) { newColInd[newRowSize] = searchIndex; if ( searchIndex >= globalNSchur ) { if ( HYOutputLevel_ & HYFEI_SCHURREDUCE1 ) { printf("%4d : buildSchurSystem WARNING - CTmat ",mypid_); printf("out of range %d - %d (%d)\n", rowIndex, searchIndex, globalNSchur); } } newColVal[newRowSize++] = colVal[j]; } else if ( colIndex == i && colVal[j] != 0.0 ) { ddata = 1.0 / colVal[j]; ncnt++; maxdiag = ( colVal[j] > maxdiag ) ? colVal[j] : maxdiag; mindiag = ( colVal[j] < mindiag ) ? colVal[j] : mindiag; } } } if ( ncnt == 0 ) { if ( HYOutputLevel_ & HYFEI_SCHURREDUCE1 ) printf("%4d : buildSchurSystem WARNING - diag[%d] not found.\n", mypid_, i); ierr = 1; } else if ( ncnt > 1 ) ierr = 1; if ( newRowSize == 0 ) { newColInd[0] = ProcNSchur[mypid_]; newColVal[0] = 0.0; newRowSize = 1; } diagonal[rowIndex-MStartRow] = ddata; HYPRE_ParCSRMatrixRestoreRow(A_csr,i,&rowSize,&colInd,&colVal); HYPRE_IJMatrixSetValues(Mmat, 1, &one, (const int *) &rowIndex, (const int *) &rowIndex, (const double *) &ddata); HYPRE_IJMatrixSetValues(CTmat, 1, &newRowSize, (const int *) &rowIndex, (const int *) newColInd, (const double *) newColVal); rowIndex++; } delete [] newColInd; delete [] newColVal; //------------------------------------------------------------------ // output statistics about sizes of diagonal elements //------------------------------------------------------------------ darray[0] = maxdiag; darray[1] = - mindiag; darray2[0] = maxdiag; darray2[1] = - mindiag; MPI_Allreduce(darray, darray2, 2, MPI_DOUBLE, MPI_MAX, comm_); maxdiag = darray2[0]; mindiag = - darray2[1]; if ( mypid_ == 0 && (HYOutputLevel_ & HYFEI_SCHURREDUCE1)) { printf("%4d : buildSchurSystem - max diagonal = %e\n",mypid_,maxdiag); printf("%4d : buildSchurSystem - min diagonal = %e\n",mypid_,mindiag); } //------------------------------------------------------------------ // finally assemble Mmat //------------------------------------------------------------------ HYPRE_IJMatrixAssemble(Mmat); HYPRE_IJMatrixGetObject(Mmat, (void **) &M_csr); hypre_MatvecCommPkgCreate((hypre_ParCSRMatrix *) M_csr); HYPRE_IJMatrixAssemble(CTmat); HYPRE_IJMatrixGetObject(CTmat, (void **) &CT_csr); hypre_MatvecCommPkgCreate((hypre_ParCSRMatrix *) CT_csr); //------------------------------------------------------------------ // Error checking //------------------------------------------------------------------ MPI_Allreduce(&ierr, &ncnt, 1, MPI_INT, MPI_SUM, comm_); if ( ncnt > 0 ) { if ( HYOutputLevel_ & HYFEI_SCHURREDUCE1 ) { printf("%4d : buildSchurSystem WARNING - A11 not diagonal\n",mypid_); printf("%4d : buildSchurSystem WARNING - reduction not performed\n", mypid_); } schurReduction_ = 0; delete [] ProcNRows; delete [] ProcNSchur; HYPRE_IJMatrixDestroy(Cmat); return; } //------------------------------------------------------------------ // diagnostics (output CTmat) //------------------------------------------------------------------ if ( HYOutputLevel_ & HYFEI_SCHURREDUCE3 ) { ncnt = 0; MPI_Barrier(MPI_COMM_WORLD); while ( ncnt < numProcs_ ) { if ( mypid_ == ncnt ) { printf("====================================================\n"); printf("%4d buildSchurSystem : matrix CTmat assembled %d.\n", mypid_,CTStartRow); fflush(stdout); for ( i = CTStartRow; i < CTStartRow+CTNRows; i++ ) { HYPRE_ParCSRMatrixGetRow(CT_csr,i,&rowSize,&colInd,&colVal); printf("CTmat ROW = %6d (%d)\n", i, rowSize); for ( j = 0; j < rowSize; j++ ) printf(" col = %6d, val = %e \n", colInd[j], colVal[j]); HYPRE_ParCSRMatrixRestoreRow(CT_csr,i,&rowSize,&colInd, &colVal); } printf("====================================================\n"); } ncnt++; MPI_Barrier(MPI_COMM_WORLD); } } //****************************************************************** // perform the triple matrix product //------------------------------------------------------------------ if ( HYOutputLevel_ & HYFEI_SCHURREDUCE1 ) printf("%4d : buildSchurSystem - Triple matrix product begins..\n", mypid_); hypre_BoomerAMGBuildCoarseOperator( (hypre_ParCSRMatrix *) CT_csr, (hypre_ParCSRMatrix *) M_csr, (hypre_ParCSRMatrix *) CT_csr, (hypre_ParCSRMatrix **) &S_csr); if ( HYOutputLevel_ & HYFEI_SCHURREDUCE1 ) printf("%4d : buildSchurSystem - Triple matrix product ends\n", mypid_); if ( HYOutputLevel_ & HYFEI_SCHURREDUCE3 ) { MPI_Barrier(MPI_COMM_WORLD); ncnt = 0; while ( ncnt < numProcs_ ) { if ( mypid_ == ncnt ) { for ( i = CStartRow; i < CStartRow+CNRows; i++ ) { HYPRE_ParCSRMatrixGetRow(S_csr,i,&rowSize,&colInd, &colVal); printf("Schur ROW = %6d (%d)\n", i, rowSize); for ( j = 0; j < rowSize; j++ ) printf(" col = %6d, val = %e \n", colInd[j], colVal[j]); HYPRE_ParCSRMatrixRestoreRow(S_csr,i,&rowSize,&colInd,&colVal); } } MPI_Barrier(MPI_COMM_WORLD); ncnt++; } } // ***************************************************************** // form modified right hand side (f2 = f2 - C*M*f1) // ***************************************************************** // ***************************************************************** // form f2hat = C*M*f1 //------------------------------------------------------------------ HYPRE_IJVectorCreate(comm_, CTStartRow, CTStartRow+CTNRows-1, &f1); HYPRE_IJVectorSetObjectType(f1, HYPRE_PARCSR); ierr += HYPRE_IJVectorInitialize(f1); ierr += HYPRE_IJVectorAssemble(f1); hypre_assert(!ierr); HYPRE_IJVectorCreate(comm_, CStartRow, CStartRow+CNRows-1, &f2hat); HYPRE_IJVectorSetObjectType(f2hat, HYPRE_PARCSR); ierr += HYPRE_IJVectorInitialize(f2hat); ierr += HYPRE_IJVectorAssemble(f2hat); hypre_assert(!ierr); rowCount = CTStartRow; for ( i = StartRow; i <= EndRow-nSchur; i++ ) { HYPRE_IJVectorGetValues(HYb_, 1, &i, &ddata); ddata *= diagonal[rowCount-CTStartRow]; ierr = HYPRE_IJVectorSetValues(f1, 1, (const int *) &rowCount, (const double *) &ddata); hypre_assert( !ierr ); rowCount++; } HYPRE_IJVectorGetObject(f1, (void **) &f1_csr); HYPRE_IJVectorGetObject(f2hat, (void **) &f2hat_csr); HYPRE_ParCSRMatrixMatvec( 1.0, C_csr, f1_csr, 0.0, f2hat_csr ); delete [] diagonal; HYPRE_IJVectorDestroy(f1); //------------------------------------------------------------------ // form f2 = f2 - f2hat (and negate) //------------------------------------------------------------------ HYPRE_IJVectorCreate(comm_, CStartRow, CStartRow+CNRows-1, &f2); HYPRE_IJVectorSetObjectType(f2, HYPRE_PARCSR); ierr += HYPRE_IJVectorInitialize(f2); ierr += HYPRE_IJVectorAssemble(f2); hypre_assert(!ierr); rowCount = CStartRow; for ( i = 0; i < nSchur; i++ ) { rowIndex = EndRow - nSchur + i + 1; HYPRE_IJVectorGetValues(HYb_, 1, &rowIndex, &ddata); ddata = - ddata; ierr = HYPRE_IJVectorSetValues(f2, 1, (const int *) &rowCount, (const double *) &ddata); HYPRE_IJVectorGetValues(f2hat, 1, &rowCount, &ddata); HYPRE_IJVectorAddToValues(f2, 1, (const int *) &rowCount, (const double *) &ddata); HYPRE_IJVectorGetValues(f2, 1, &rowCount, &ddata); hypre_assert( !ierr ); rowCount++; } HYPRE_IJVectorDestroy(f2hat); //****************************************************************** // set up the system with the new matrix //------------------------------------------------------------------ ierr = HYPRE_IJMatrixCreate(comm_, CStartRow, CStartRow+CNRows-1, CStartRow, CStartRow+CNRows-1, &reducedA_); ierr += HYPRE_IJMatrixSetObjectType(reducedA_, HYPRE_PARCSR); hypre_assert(!ierr); //------------------------------------------------------------------ // compute row sizes for the Schur complement //------------------------------------------------------------------ CMatSize = new int[CNRows]; maxRowSize = 0; for ( i = CStartRow; i < CStartRow+CNRows; i++ ) { HYPRE_ParCSRMatrixGetRow(S_csr,i,&rowSize,&colInd,NULL); rowIndex = EndRow - nSchur + i + 1; HYPRE_ParCSRMatrixGetRow(A_csr,rowIndex,&rowSize2,&colInd2,NULL); newRowSize = rowSize + rowSize2; newColInd = new int[newRowSize]; for (j = 0; j < rowSize; j++) newColInd[j] = colInd[j]; ncnt = 0; for (j = 0; j < rowSize2; j++) { colIndex = colInd2[j]; searchIndex = HYPRE_Schur_Search(colIndex, numProcs_, ProcNRows, ProcNSchur, globalNRows, globalNSchur); if ( searchIndex >= 0 ) { newColInd[rowSize+ncnt] = colInd2[j]; ncnt++; } } newRowSize = rowSize + ncnt; hypre_qsort0(newColInd, 0, newRowSize-1); ncnt = 0; for ( j = 1; j < newRowSize; j++ ) { if ( newColInd[j] != newColInd[ncnt] ) { ncnt++; newColInd[ncnt] = newColInd[j]; } } if ( newRowSize > 0 ) ncnt++; CMatSize[i-CStartRow] = ncnt; maxRowSize = ( ncnt > maxRowSize ) ? ncnt : maxRowSize; HYPRE_ParCSRMatrixRestoreRow(S_csr,i,&rowSize,&colInd,NULL); HYPRE_ParCSRMatrixRestoreRow(A_csr,rowIndex,&rowSize2,&colInd2,NULL); delete [] newColInd; } ierr = HYPRE_IJMatrixSetRowSizes(reducedA_, CMatSize); ierr += HYPRE_IJMatrixInitialize(reducedA_); hypre_assert(!ierr); delete [] CMatSize; //------------------------------------------------------------------ // load and assemble the Schur complement matrix //------------------------------------------------------------------ for ( i = CStartRow; i < CStartRow+CNRows; i++ ) { HYPRE_ParCSRMatrixGetRow(S_csr,i,&rowSize,&colInd,&colVal); rowIndex = EndRow - nSchur + i + 1; HYPRE_ParCSRMatrixGetRow(A_csr,rowIndex,&rowSize2,&colInd2,&colVal2); newRowSize = rowSize + rowSize2; newColInd = new int[newRowSize]; newColVal = new double[newRowSize]; for (j = 0; j < rowSize; j++) { newColInd[j] = colInd[j]; newColVal[j] = colVal[j]; } ncnt = 0; for (j = 0; j < rowSize2; j++) { colIndex = colInd2[j]; searchIndex = HYPRE_Schur_Search(colIndex, numProcs_, ProcNRows, ProcNSchur, globalNRows, globalNSchur); if ( searchIndex >= 0 ) { newColInd[rowSize+ncnt] = searchIndex; newColVal[rowSize+ncnt] = - colVal2[j]; ncnt++; } } newRowSize = rowSize + ncnt; hypre_qsort1(newColInd, newColVal, 0, newRowSize-1); ncnt = 0; for ( j = 1; j < newRowSize; j++ ) { if ( newColInd[j] == newColInd[ncnt] ) { newColVal[ncnt] += newColVal[j]; } else { ncnt++; newColInd[ncnt] = newColInd[j]; newColVal[ncnt] = newColVal[j]; } } if ( newRowSize > 0 ) newRowSize = ++ncnt; ncnt = 0; rowmax = 0.0; for ( j = 0; j < newRowSize; j++ ) if ( habs(newColVal[j]) > rowmax ) rowmax = habs(newColVal[j]); for ( j = 0; j < newRowSize; j++ ) { if ( habs(newColVal[j]) > rowmax*1.0e-14 ) { newColInd[ncnt] = newColInd[j]; newColVal[ncnt++] = newColVal[j]; } } newRowSize = ncnt; // see how this can be done elegantly //if ( newRowSize == 1 && newColInd[0] == i && newColVal[0] < 0.0 ) // newColVal[0] = - newColVal[0]; HYPRE_ParCSRMatrixRestoreRow(S_csr,i,&rowSize,&colInd,&colVal); HYPRE_ParCSRMatrixRestoreRow(A_csr,rowIndex,&rowSize2,&colInd2, &colVal2); HYPRE_IJMatrixSetValues(reducedA_, 1, &newRowSize, (const int *) &i, (const int *) newColInd, (const double *) newColVal); } HYPRE_IJMatrixAssemble(reducedA_); //------------------------------------------------------------------ // create the reduced x, right hand side and r //------------------------------------------------------------------ ierr = HYPRE_IJVectorCreate(comm_,CStartRow,CStartRow+CNRows-1,&reducedX_); ierr = HYPRE_IJVectorSetObjectType(reducedX_, HYPRE_PARCSR); ierr = HYPRE_IJVectorInitialize(reducedX_); ierr = HYPRE_IJVectorAssemble(reducedX_); hypre_assert(!ierr); ierr = HYPRE_IJVectorCreate(comm_,CStartRow,CStartRow+CNRows-1,&reducedR_); ierr = HYPRE_IJVectorSetObjectType(reducedR_, HYPRE_PARCSR); ierr = HYPRE_IJVectorInitialize(reducedR_); ierr = HYPRE_IJVectorAssemble(reducedR_); hypre_assert(!ierr); reducedB_ = f2; currA_ = reducedA_; currB_ = reducedB_; currR_ = reducedR_; currX_ = reducedX_; //****************************************************************** // save A21 and invA22 for solution recovery //------------------------------------------------------------------ HYA21_ = CTmat; HYA12_ = Cmat; HYinvA22_ = Mmat; A21NRows_ = CTNRows; A21NCols_ = CTNCols; //------------------------------------------------------------------ // final clean up //------------------------------------------------------------------ delete [] ProcNRows; delete [] ProcNSchur; if ( colValues_ != NULL ) { for ( j = 0; j < localEndRow_-localStartRow_+1; j++ ) if ( colValues_[j] != NULL ) delete [] colValues_[j]; delete [] colValues_; colValues_ = NULL; } if ( mypid_ == 0 && (HYOutputLevel_ & HYFEI_SCHURREDUCE1) ) printf(" buildSchurSystem ends....\n"); } //***************************************************************************** // search to see if the key is in the range //----------------------------------------------------------------------------- int HYPRE_LinSysCore::HYPRE_Schur_Search(int key, int nprocs, int *Barray, int *Sarray, int globalNrows, int globalNSchur) { int i, index1, index2, search_index, out_of_range, not_found; search_index = 0; out_of_range = 0; not_found = 0; for ( i = 0; i < nprocs; i++ ) { if ( i == (nprocs-1) ) { index1 = globalNrows; index2 = index1 - globalNSchur; } else { index1 = Barray[i+1]; index2 = index1 - Sarray[i+1]; } if ( key >= index2 && key < index1 ) { search_index += ( key - index2 ); break; } else if ( key >= index1 ) { search_index += ( index2 - index1 ); out_of_range += ( index2 - Barray[i] ); } else if ( key >= Barray[i] ) { out_of_range += (key - Barray[i]); not_found = 1; break; } if ( i == (nprocs-1) ) out_of_range += (index1 - index2); } if ( not_found ) return (-out_of_range-1); else return search_index; } hypre-2.33.0/src/FEI_mv/fei-hypre/hypre_slide_reduce.cxx000066400000000000000000004060441477326011500231120ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ //*************************************************************************** // system includes //--------------------------------------------------------------------------- #include #include #include //*************************************************************************** // HYPRE includes //--------------------------------------------------------------------------- #include "HYPRE.h" #include "utilities/_hypre_utilities.h" #include "IJ_mv/HYPRE_IJ_mv.h" #include "parcsr_mv/HYPRE_parcsr_mv.h" #include "parcsr_ls/HYPRE_parcsr_ls.h" #include "parcsr_mv/_hypre_parcsr_mv.h" #include "HYPRE_LinSysCore.h" #include "HYPRE_LSI_mli.h" //*************************************************************************** // local defines and external functions //--------------------------------------------------------------------------- #define habs(x) (((x) > 0.0) ? x : -(x)) extern "C" { int hypre_BoomerAMGBuildCoarseOperator(hypre_ParCSRMatrix*, hypre_ParCSRMatrix*, hypre_ParCSRMatrix*, hypre_ParCSRMatrix**); void hypre_qsort0(int *, int, int); void hypre_qsort1(int *, double *, int, int); int HYPRE_LSI_Search(int*, int, int); } //***************************************************************************** // Given the matrix (A) within the object, compute the reduced system and put // it in place. Additional information given are : // // Additional assumptions are : // // - a given slave equation and the corresponding constraint equation // reside in the same processor // - constraint equations are given at the end of the local matrix // (hence given by EndRow_-nConstr to EndRow_) // - each processor gets a contiguous block of equations, and processor // i+1 has equation numbers higher than those of processor i //----------------------------------------------------------------------------- void HYPRE_LinSysCore::buildSlideReducedSystem() { int i, j, StartRow, EndRow, rowSize, *colInd, globalNConstr; int nRows, *ProcNRows, *tempList, globalNRows, ncnt; int globalNSelected, *globalSelectedList, *globalSelectedListAux; int *ProcNConstr, isAConstr, ncnt2; double *colVal; HYPRE_ParCSRMatrix A_csr, RAP_csr; //****************************************************************** // initial set up //------------------------------------------------------------------ if ( mypid_ == 0 && (HYOutputLevel_ & HYFEI_SLIDEREDUCE1) ) printf("%4d : SlideReduction begins....\n",mypid_); StartRow = localStartRow_ - 1; EndRow = localEndRow_ - 1; if ( HYOutputLevel_ & HYFEI_SLIDEREDUCE1 ) printf("%4d : SlideReduction - StartRow/EndRow = %d %d\n",mypid_, StartRow,EndRow); //****************************************************************** // construct local and global information about where the constraints // are (this is given by user or searched within this code) //------------------------------------------------------------------ //------------------------------------------------------------------ // get the CSR matrix for A //------------------------------------------------------------------ HYPRE_IJMatrixGetObject(HYA_, (void **) &A_csr); //------------------------------------------------------------------ // search the entire local matrix to find where the constraint // equations are, if not already given //------------------------------------------------------------------ MPI_Allreduce(&nConstraints_,&globalNConstr,1,MPI_INT,MPI_SUM,comm_); if ( globalNConstr == 0 ) { for ( i = EndRow; i >= StartRow; i-- ) { HYPRE_ParCSRMatrixGetRow(A_csr,i,&rowSize,&colInd,&colVal); isAConstr = 1; for (j = 0; j < rowSize; j++) if ( colInd[j] == i && colVal[j] != 0.0 ) {isAConstr = 0; break;} HYPRE_ParCSRMatrixRestoreRow(A_csr,i,&rowSize,&colInd,&colVal); if ( isAConstr ) nConstraints_++; else break; } } if ( HYOutputLevel_ & HYFEI_SLIDEREDUCE1 ) printf("%4d : SlideReduction - no. constr = %d\n",mypid_,nConstraints_); MPI_Allreduce(&nConstraints_, &globalNConstr, 1, MPI_INT, MPI_SUM, comm_); if ( globalNConstr == 0 ) return; //------------------------------------------------------------------ // get information about nRows from all processors //------------------------------------------------------------------ nRows = localEndRow_ - localStartRow_ + 1; ProcNRows = new int[numProcs_]; tempList = new int[numProcs_]; for ( i = 0; i < numProcs_; i++ ) tempList[i] = 0; tempList[mypid_] = nRows; MPI_Allreduce(tempList, ProcNRows, numProcs_, MPI_INT, MPI_SUM, comm_); delete [] tempList; if ( HYOutputLevel_ & HYFEI_SLIDEREDUCE1 ) printf("%4d : SlideReduction - localNRows = %d\n", mypid_, nRows); //------------------------------------------------------------------ // compute the base NRows on each processor // (This is needed later on for column index conversion) //------------------------------------------------------------------ globalNRows = 0; ncnt = 0; for ( i = 0; i < numProcs_; i++ ) { globalNRows += ProcNRows[i]; ncnt2 = ProcNRows[i]; ProcNRows[i] = ncnt; ncnt += ncnt2; } //------------------------------------------------------------------ // compose a global array marking where the constraint equations are //------------------------------------------------------------------ globalNConstr = 0; tempList = new int[numProcs_]; ProcNConstr = new int[numProcs_]; for ( i = 0; i < numProcs_; i++ ) tempList[i] = 0; tempList[mypid_] = nConstraints_; MPI_Allreduce(tempList,ProcNConstr,numProcs_,MPI_INT,MPI_SUM,comm_); delete [] tempList; //------------------------------------------------------------------ // compute the base nConstraints on each processor // (This is needed later on for column index conversion) //------------------------------------------------------------------ ncnt = 0; for ( i = 0; i < numProcs_; i++ ) { globalNConstr += ProcNConstr[i]; ncnt2 = ProcNConstr[i]; ProcNConstr[i] = ncnt; ncnt += ncnt2; } //****************************************************************** // compose the local and global selected node lists //------------------------------------------------------------------ //------------------------------------------------------------------ // allocate array for storing indices of selected nodes //------------------------------------------------------------------ globalNSelected = globalNConstr; if (globalNSelected > 0) { globalSelectedList = new int[globalNSelected]; globalSelectedListAux = new int[globalNSelected]; } else globalSelectedList = globalSelectedListAux = NULL; if ( selectedList_ != NULL ) delete [] selectedList_; if ( selectedListAux_ != NULL ) delete [] selectedListAux_; if ( nConstraints_ > 0 ) { selectedList_ = new int[nConstraints_]; selectedListAux_ = new int[nConstraints_]; } else selectedList_ = selectedListAux_ = NULL; //------------------------------------------------------------------ // call the three parts //------------------------------------------------------------------ buildSlideReducedSystemPartA(ProcNRows,ProcNConstr,globalNRows, globalNConstr,globalSelectedList, globalSelectedListAux); buildSlideReducedSystemPartB(ProcNRows,ProcNConstr,globalNRows, globalNConstr,globalSelectedList, globalSelectedListAux, &RAP_csr); buildSlideReducedSystemPartC(ProcNRows,ProcNConstr,globalNRows, globalNConstr,globalSelectedList, globalSelectedListAux, RAP_csr); //------------------------------------------------------------------ // initialize global variables and clean up //------------------------------------------------------------------ currA_ = reducedA_; currB_ = reducedB_; currR_ = reducedR_; currX_ = reducedX_; delete [] globalSelectedList; delete [] globalSelectedListAux; delete [] ProcNRows; delete [] ProcNConstr; HYPRE_ParCSRMatrixDestroy(RAP_csr); //if ( HYA_ != NULL ) {HYPRE_IJMatrixDestroy(HYA_); HYA_ = NULL;} if ( colIndices_ != NULL ) { for ( i = 0; i < localEndRow_-localStartRow_+1; i++ ) if ( colIndices_[i] != NULL ) delete [] colIndices_[i]; delete [] colIndices_; colIndices_ = NULL; } if ( colValues_ != NULL ) { for ( j = 0; j < localEndRow_-localStartRow_+1; j++ ) if ( colValues_[j] != NULL ) delete [] colValues_[j]; delete [] colValues_; colValues_ = NULL; if ( rowLengths_ != NULL ) { delete [] rowLengths_; rowLengths_ = NULL; } } } //***************************************************************************** // Part A of buildSlideReducedSystem : generate a selected equation list //----------------------------------------------------------------------------- void HYPRE_LinSysCore::buildSlideReducedSystemPartA(int *ProcNRows, int *ProcNConstr, int globalNRows, int globalNConstr, int *globalSelectedList, int *globalSelectedListAux) { int i, ncnt2, StartRow, EndRow, ncnt;; int nSlaves, *constrListAux, colIndex, searchIndex, procIndex, ubound; int j, k, ierr, rowSize, *colInd, *colInd2, rowIndex, nSelected; int *recvCntArray, *displArray, *selectedList, *selectedListAux; int rowSize2; double *colVal, searchValue, *dble_array, *colVal2; HYPRE_ParCSRMatrix A_csr; //------------------------------------------------------------------ // get matrix information //------------------------------------------------------------------ StartRow = localStartRow_ - 1; EndRow = localEndRow_ - 1; HYPRE_IJMatrixGetObject(HYA_, (void **) &A_csr); nSelected = nConstraints_; selectedList = selectedList_; selectedListAux = selectedListAux_; //------------------------------------------------------------------ // compose candidate slave list //------------------------------------------------------------------ nSlaves = 0; constrListAux = NULL; if ( nConstraints_ > 0 && constrList_ == NULL ) { constrList_ = new int[EndRow-nConstraints_-StartRow+1]; constrListAux = new int[EndRow-nConstraints_-StartRow+1]; //------------------------------------------------------------------ // candidates are those with 1 link to the constraint list //------------------------------------------------------------------ for ( i = StartRow; i <= EndRow-nConstraints_; i++ ) { ierr = HYPRE_ParCSRMatrixGetRow(A_csr,i,&rowSize,&colInd,&colVal); hypre_assert(!ierr); ncnt = 0; for (j = 0; j < rowSize; j++) { colIndex = colInd[j]; for (procIndex=0; procIndex < numProcs_; procIndex++ ) if ( colIndex < ProcNRows[procIndex] ) break; if ( procIndex == numProcs_ ) ubound = globalNRows - (globalNConstr-ProcNConstr[procIndex-1]); else ubound = ProcNRows[procIndex] - (ProcNConstr[procIndex] - ProcNConstr[procIndex-1]); //Note : include structural zeros by not checking for nonzero //if ( colIndex >= ubound && colVal[j] != 0.0 ) if ( colIndex >= ubound ) { ncnt++; searchIndex = colIndex; } if ( ncnt > 1 ) break; } HYPRE_ParCSRMatrixRestoreRow(A_csr,i,&rowSize,&colInd,&colVal); if ( j == rowSize && ncnt == 1 ) { constrListAux[nSlaves] = searchIndex; constrList_[nSlaves++] = i; } if ( HYOutputLevel_ & HYFEI_SLIDEREDUCE2 ) { if ( j == rowSize && ncnt == 1 ) printf("%4d : SlideReductionA - slave candidate %d = %d(%d)\n", mypid_, nSlaves-1, i, constrListAux[nSlaves-1]); } } if ( HYOutputLevel_ & HYFEI_SLIDEREDUCE1 ) { printf("%4d : SlideReductionA - nSlave Candidate, nConstr = %d %d\n", mypid_,nSlaves, nConstraints_); } } else if ( constrList_ != NULL ) { if ( mypid_ == 0 && ( HYOutputLevel_ & HYFEI_SLIDEREDUCE1 ) ) printf("%4d : SlideReductionA WARNING - constraint list not empty\n", mypid_); } //--------------------------------------------------------------------- // search the constraint equations for the selected nodes // (search for candidates column index with maximum magnitude) //--------------------------------------------------------------------- nSelected = 0; rowIndex = -1; searchIndex = 0; for ( i = EndRow-nConstraints_+1; i <= EndRow; i++ ) { ierr = HYPRE_ParCSRMatrixGetRow(A_csr,i,&rowSize,&colInd,&colVal); hypre_assert(!ierr); searchIndex = -1; searchValue = -1.0E10; for (j = 0; j < rowSize; j++) { if (colVal[j] != 0.0 && colInd[j] >= StartRow && colInd[j] <= (EndRow-nConstraints_)) { colIndex = hypre_BinarySearch(constrList_,colInd[j],nSlaves); if ( colIndex >= 0 && constrListAux[colIndex] != -1) { if ( habs(colVal[j]) > searchValue ) { if (i != constrListAux[colIndex]) { if ( HYOutputLevel_ & HYFEI_SLIDEREDUCE1 ) { printf("%4d : SlideReductionA WARNING - slave %d", mypid_, colInd[j]); printf(" candidate does not have constr %d\n", i); } } searchValue = habs(colVal[j]); searchIndex = colInd[j]; } } } } if ( searchIndex >= 0 ) { selectedList[nSelected++] = searchIndex; if ( HYOutputLevel_ & HYFEI_SLIDEREDUCE2 ) { printf("%4d : SlideReductionA - constraint %4d <=> slave %d \n", mypid_,i,searchIndex); } } else { // get ready for error processing colInd2 = new int[rowSize]; colVal2 = new double[rowSize]; for ( j = 0; j < rowSize; j++ ) { colInd2[j] = colInd[j]; colVal2[j] = colVal[j]; } rowIndex = i; HYPRE_ParCSRMatrixRestoreRow(A_csr,i,&rowSize,&colInd,&colVal); colInd = colInd2; colVal = colVal2; break; } HYPRE_ParCSRMatrixRestoreRow(A_csr,i,&rowSize,&colInd,&colVal); } //--------------------------------------------------------------------- // error processing //--------------------------------------------------------------------- if ( searchIndex < 0 ) searchIndex = 1; else searchIndex = 0; MPI_Allreduce(&searchIndex, &ncnt,1,MPI_INT,MPI_MAX,comm_); if ( ncnt > 0 ) { ncnt2 = 0; while ( ncnt2 < numProcs_ ) { if ( ncnt2 == mypid_ && rowIndex >= 0 ) { printf("%4d : SlideReductionA ERROR - constraint number",mypid_); printf(" cannot be found for row %d\n", rowIndex); for (j = 0; j < rowSize; j++) { printf("ROW %4d COL = %d VAL = %e\n",rowIndex,colInd[j], colVal[j]); if (colVal[j] != 0.0 && colInd[j] >= StartRow && colInd[j] <= (EndRow-nConstraints_)) { colIndex = colInd[j]; HYPRE_ParCSRMatrixGetRow(A_csr,colIndex,&rowSize2,&colInd2, &colVal2); printf(" row %4d (%d) : \n",colIndex, rowSize2); for (k = 0; k < rowSize2; k++) printf(" row %4d col = %d val = %e\n",colIndex, colInd2[k],colVal2[k]); HYPRE_ParCSRMatrixRestoreRow(A_csr,colIndex,&rowSize2, &colInd2,&colVal2); } } printf("===================================================\n"); } ncnt2++; MPI_Barrier(comm_); } MPI_Finalize(); exit(1); } delete [] constrListAux; //------------------------------------------------------------------ // sort the local selected node list and its auxiliary list, then // form a global list of selected nodes on each processor // form the corresponding auxiliary list for later pruning //------------------------------------------------------------------ dble_array = new double[nSelected]; for ( i = 0; i < nSelected; i++ ) dble_array[i] = (double) i; if ( nSelected > 1 ) hypre_qsort1(selectedList, dble_array, 0, nSelected-1); for (i = 1; i < nSelected; i++) { if ( selectedList[i] == selectedList[i-1] ) { printf("%4d : SlideReductionA ERROR - repeated selected nodes %d \n", mypid_, selectedList[i]); exit(1); } } for (i = 0; i < nSelected; i++) selectedListAux[i] = (int) dble_array[i]; delete [] dble_array; recvCntArray = new int[numProcs_]; displArray = new int[numProcs_]; MPI_Allgather(&nSelected, 1, MPI_INT, recvCntArray, 1,MPI_INT, comm_); displArray[0] = 0; for ( i = 1; i < numProcs_; i++ ) displArray[i] = displArray[i-1] + recvCntArray[i-1]; for ( i = 0; i < nSelected; i++ ) selectedListAux[i] += displArray[mypid_]; MPI_Allgatherv(selectedList, nSelected, MPI_INT, globalSelectedList, recvCntArray, displArray, MPI_INT, comm_); MPI_Allgatherv(selectedListAux, nSelected, MPI_INT, globalSelectedListAux, recvCntArray, displArray, MPI_INT, comm_); for ( i = 0; i < nSelected; i++ ) selectedListAux[i] -= displArray[mypid_]; delete [] recvCntArray; delete [] displArray; if ( HYOutputLevel_ & HYFEI_SLIDEREDUCE2 ) { for ( i = 0; i < nSelected; i++ ) printf("%4d : SlideReductionA - selectedList %d = %d(%d)\n",mypid_, i,selectedList[i],selectedListAux[i]); } } //***************************************************************************** // Part B of buildSlideReducedSystem : create submatrices //----------------------------------------------------------------------------- void HYPRE_LinSysCore::buildSlideReducedSystemPartB(int *ProcNRows, int *ProcNConstr, int globalNRows, int globalNConstr, int *globalSelectedList, int *globalSelectedListAux, HYPRE_ParCSRMatrix *rap_csr) { int A21NRows, A21GlobalNRows, A21NCols, A21GlobalNCols, A21StartRow; int i, j, nRows, ncnt, StartRow, A21StartCol; int ierr, rowCount, maxRowSize, newEndRow, *A21MatSize, EndRow; int rowIndex, rowSize, *colInd, rowSize2, colIndex, searchIndex; int nnzA21, *newColInd, diagCount, newRowSize, procIndex; int *recvCntArray, *displArray, *invA22MatSize, one=1; int invA22NRows, invA22GlobalNRows, invA22NCols, invA22GlobalNCols; int nSelected, *selectedList, *selectedListAux, globalNSelected; double *colVal, *newColVal, *diagonal, *extDiagonal; HYPRE_ParCSRMatrix A_csr, A21_csr, invA22_csr, RAP_csr; HYPRE_IJMatrix A21, invA22; //****************************************************************** // get matrix and constraint information //------------------------------------------------------------------ nRows = localEndRow_ - localStartRow_ + 1; StartRow = localStartRow_ - 1; EndRow = localEndRow_ - 1; HYPRE_IJMatrixGetObject(HYA_, (void **) &A_csr); globalNSelected = globalNConstr; nSelected = nConstraints_; selectedList = selectedList_; selectedListAux = selectedListAux_; //------------------------------------------------------------------ // calculate the dimension of A21 //------------------------------------------------------------------ A21NRows = 2 * nConstraints_; A21NCols = nRows - 2 * nConstraints_; A21GlobalNRows = 2 * globalNConstr; A21GlobalNCols = globalNRows - 2 * globalNConstr; A21StartRow = 2 * ProcNConstr[mypid_]; A21StartCol = ProcNRows[mypid_] - 2 * ProcNConstr[mypid_]; if ( HYOutputLevel_ & HYFEI_SLIDEREDUCE1 ) { printf("%4d : SlideReductionB - A21StartRow = %d\n", mypid_, A21StartRow); printf("%4d : SlideReductionB - A21GlobalDim = %d %d\n", mypid_, A21GlobalNRows, A21GlobalNCols); printf("%4d : SlideReductionB - A21LocalDim = %d %d\n",mypid_, A21NRows, A21NCols); } //------------------------------------------------------------------ // create a matrix context for A21 //------------------------------------------------------------------ ierr = HYPRE_IJMatrixCreate(comm_, A21StartRow, A21StartRow+A21NRows-1, A21StartCol, A21StartCol+A21NCols-1, &A21); ierr += HYPRE_IJMatrixSetObjectType(A21, HYPRE_PARCSR); hypre_assert(!ierr); //------------------------------------------------------------------ // compute the number of nonzeros in the first nConstraint row of A21 // (which consists of the rows in selectedList), the nnz will // be reduced by excluding the constraint and selected slave columns //------------------------------------------------------------------ rowCount = 0; maxRowSize = 0; newEndRow = EndRow - nConstraints_; A21MatSize = new int[A21NRows]; for ( i = 0; i < nSelected; i++ ) { for ( j = 0; j < nSelected; j++ ) { if ( selectedListAux[j] == i ) { rowIndex = selectedList[j]; break; } } HYPRE_ParCSRMatrixGetRow(A_csr,rowIndex,&rowSize,&colInd,&colVal); rowSize2 = 0; for (j = 0; j < rowSize; j++) { colIndex = colInd[j]; if ( colVal[j] != 0.0 ) { searchIndex = hypre_BinarySearch(globalSelectedList,colIndex, globalNSelected); if (searchIndex < 0 && (colIndex <= newEndRow || colIndex >= localEndRow_)) rowSize2++; } } A21MatSize[rowCount] = rowSize2; maxRowSize = ( rowSize2 > maxRowSize ) ? rowSize2 : maxRowSize; HYPRE_ParCSRMatrixRestoreRow(A_csr,rowIndex,&rowSize,&colInd,&colVal); rowCount++; } //------------------------------------------------------------------ // compute the number of nonzeros in the second nConstraint row of A21 // (which consists of the rows in constraint equations), the nnz will // be reduced by excluding the selected slave columns only (since the // entries corresponding to the constraint columns are 0, and since // the selected matrix is a diagonal matrix, there is no need to // search for slave equations in the off-processor list) //------------------------------------------------------------------ rowCount = nSelected; for ( i = EndRow-nConstraints_+1; i <= EndRow; i++ ) { HYPRE_ParCSRMatrixGetRow(A_csr,i,&rowSize,&colInd,&colVal); rowSize2 = 0; for (j = 0; j < rowSize; j++) { if ( colVal[j] != 0.0 ) { colIndex = colInd[j]; searchIndex = hypre_BinarySearch(globalSelectedList,colIndex, globalNSelected); if ( searchIndex < 0 ) rowSize2++; } } A21MatSize[rowCount] = rowSize2; maxRowSize = ( rowSize2 > maxRowSize ) ? rowSize2 : maxRowSize; HYPRE_ParCSRMatrixRestoreRow(A_csr,i,&rowSize,&colInd,&colVal); rowCount++; } nnzA21 = 0; for ( i = 0; i < 2*nConstraints_; i++ ) nnzA21 += A21MatSize[i]; //------------------------------------------------------------------ // after fetching the row sizes, set up A21 with such sizes //------------------------------------------------------------------ ierr = HYPRE_IJMatrixSetRowSizes(A21, A21MatSize); ierr += HYPRE_IJMatrixInitialize(A21); hypre_assert(!ierr); delete [] A21MatSize; //------------------------------------------------------------------ // next load the first nConstraint row to A21 extracted from A // (at the same time, the D block is saved for future use) //------------------------------------------------------------------ rowCount = A21StartRow; if ( nConstraints_ > 0 ) diagonal = new double[nConstraints_]; else diagonal = NULL; newColInd = new int[maxRowSize+1]; newColVal = new double[maxRowSize+1]; diagCount = 0; for ( i = 0; i < nSelected; i++ ) { for ( j = 0; j < nSelected; j++ ) { if ( selectedListAux[j] == i ) { rowIndex = selectedList[j]; break; } } HYPRE_ParCSRMatrixGetRow(A_csr,rowIndex,&rowSize,&colInd,&colVal); newRowSize = 0; for (j = 0; j < rowSize; j++) { if ( colVal[j] != 0.0 ) { colIndex = colInd[j]; if (colIndex <= newEndRow || colIndex >= localEndRow_) { searchIndex = HYPRE_LSI_Search(globalSelectedList,colIndex, globalNSelected); if ( searchIndex < 0 ) { searchIndex = - searchIndex - 1; for ( procIndex = 0; procIndex < numProcs_; procIndex++ ) if ( ProcNRows[procIndex] > colIndex ) break; procIndex--; colIndex = colInd[j]-ProcNConstr[procIndex]-searchIndex; newColInd[newRowSize] = colIndex; newColVal[newRowSize++] = colVal[j]; if ( colIndex < 0 || colIndex >= A21GlobalNCols ) { if ( HYOutputLevel_ & HYFEI_SLIDEREDUCE1 ) { printf("%4d : SlideReductionB WARNING - A21 ",mypid_); printf("out of range (%d,%d (%d))\n", rowCount, colIndex, A21GlobalNCols); } } if ( newRowSize > maxRowSize+1 ) { if ( HYOutputLevel_ & HYFEI_SLIDEREDUCE1 ) { printf("%4d : SlideReductionB WARNING - ",mypid_); printf("passing array boundary(1).\n"); } } } } else if ( colIndex > newEndRow && colIndex <= EndRow ) { if ( colVal[j] != 0.0 ) diagonal[diagCount++] = colVal[j]; if ( habs(colVal[j]) < 1.0E-8 ) { if ( HYOutputLevel_ & HYFEI_SLIDEREDUCE1 ) { printf("%4d : SlideReductionB WARNING - large entry ", mypid_); printf("in invA22\n"); } } } } } HYPRE_IJMatrixSetValues(A21, 1, &newRowSize, (const int *) &rowCount, (const int *) newColInd, (const double *) newColVal); HYPRE_ParCSRMatrixRestoreRow(A_csr,rowIndex,&rowSize,&colInd,&colVal); if ( diagCount != (i+1) ) { printf("%4d : SlideReductionB ERROR (3) - %d %d.\n", mypid_, diagCount,i+1); exit(1); } rowCount++; } //------------------------------------------------------------------ // send the diagonal to each processor that needs them //------------------------------------------------------------------ recvCntArray = new int[numProcs_]; displArray = new int[numProcs_]; MPI_Allgather(&diagCount, 1, MPI_INT, recvCntArray, 1, MPI_INT, comm_); displArray[0] = 0; for ( i = 1; i < numProcs_; i++ ) displArray[i] = displArray[i-1] + recvCntArray[i-1]; ncnt = displArray[numProcs_-1] + recvCntArray[numProcs_-1]; if ( ncnt > 0 ) extDiagonal = new double[ncnt]; else extDiagonal = NULL; MPI_Allgatherv(diagonal, diagCount, MPI_DOUBLE, extDiagonal, recvCntArray, displArray, MPI_DOUBLE, comm_); diagCount = ncnt; delete [] recvCntArray; delete [] displArray; if ( diagonal != NULL ) delete [] diagonal; //------------------------------------------------------------------ // next load the second nConstraint rows to A21 extracted from A //------------------------------------------------------------------ for ( i = EndRow-nConstraints_+1; i <= EndRow; i++ ) { HYPRE_ParCSRMatrixGetRow(A_csr,i,&rowSize,&colInd,&colVal); newRowSize = 0; for (j = 0; j < rowSize; j++) { colIndex = colInd[j]; searchIndex = HYPRE_LSI_Search(globalSelectedList,colIndex, globalNSelected); if ( searchIndex < 0 && colVal[j] != 0.0 ) { searchIndex = - searchIndex - 1; for ( procIndex = 0; procIndex < numProcs_; procIndex++ ) if ( ProcNRows[procIndex] > colIndex ) break; procIndex--; colIndex = colInd[j] - ProcNConstr[procIndex] - searchIndex; newColInd[newRowSize] = colIndex; newColVal[newRowSize++] = colVal[j]; if ( colIndex < 0 || colIndex >= A21GlobalNCols ) { if ( HYOutputLevel_ & HYFEI_SLIDEREDUCE1 ) printf("%4d : SlideReductionB WARNING - A21(%d,%d(%d))\n", mypid_, rowCount, colIndex, A21GlobalNCols); } if ( newRowSize > maxRowSize+1 ) { if ( HYOutputLevel_ & HYFEI_SLIDEREDUCE1 ) { printf("%4d : SlideReductionB WARNING - ",mypid_); printf("passing array boundary(2).\n"); } } } } HYPRE_IJMatrixSetValues(A21, 1, &newRowSize, (const int *) &rowCount, (const int *) newColInd, (const double *) newColVal); HYPRE_ParCSRMatrixRestoreRow(A_csr,i,&rowSize,&colInd,&colVal); rowCount++; } delete [] newColInd; delete [] newColVal; //------------------------------------------------------------------ // finally assemble the matrix and sanitize //------------------------------------------------------------------ HYPRE_IJMatrixAssemble(A21); HYPRE_IJMatrixGetObject(A21, (void **) &A21_csr); hypre_MatvecCommPkgCreate((hypre_ParCSRMatrix *) A21_csr); if ( HYOutputLevel_ & HYFEI_SLIDEREDUCE3 ) { ncnt = 0; MPI_Barrier(comm_); while ( ncnt < numProcs_ ) { if ( mypid_ == ncnt ) { printf("====================================================\n"); printf("%4d : SlideReductionB - matrix A21 assembled %d.\n", mypid_,A21StartRow); fflush(stdout); for ( i = A21StartRow; i < A21StartRow+2*nConstraints_; i++ ) { HYPRE_ParCSRMatrixGetRow(A21_csr,i,&rowSize,&colInd,&colVal); printf("A21 ROW = %6d (%d)\n", i, rowSize); for ( j = 0; j < rowSize; j++ ) printf(" col = %6d, val = %e \n", colInd[j], colVal[j]); HYPRE_ParCSRMatrixRestoreRow(A21_csr, i, &rowSize, &colInd, &colVal); } printf("====================================================\n"); } ncnt++; MPI_Barrier(comm_); } } //****************************************************************** // construct invA22 //------------------------------------------------------------------ //------------------------------------------------------------------ // calculate the dimension of invA22 //------------------------------------------------------------------ invA22NRows = A21NRows; invA22NCols = invA22NRows; invA22GlobalNRows = A21GlobalNRows; invA22GlobalNCols = invA22GlobalNRows; if ( HYOutputLevel_ & HYFEI_SLIDEREDUCE1 ) { printf("%4d : SlideReductionB - A22GlobalDim = %d %d\n", mypid_, invA22GlobalNRows, invA22GlobalNCols); printf("%4d : SlideReductionB - A22LocalDim = %d %d\n", mypid_, invA22NRows, invA22NCols); } //------------------------------------------------------------------ // create a matrix context for A22 //------------------------------------------------------------------ ierr = HYPRE_IJMatrixCreate(comm_, A21StartRow, A21StartRow+invA22NRows-1, A21StartRow, A21StartRow+invA22NCols-1, &invA22); ierr += HYPRE_IJMatrixSetObjectType(invA22, HYPRE_PARCSR); hypre_assert(!ierr); //------------------------------------------------------------------ // compute the no. of nonzeros in the first nConstraint row of invA22 //------------------------------------------------------------------ maxRowSize = 0; invA22MatSize = new int[invA22NRows]; for ( i = 0; i < nConstraints_; i++ ) invA22MatSize[i] = 1; //------------------------------------------------------------------ // compute the number of nonzeros in the second nConstraints row of // invA22 (consisting of [D and A22 block]) //------------------------------------------------------------------ for ( i = 0; i < nSelected; i++ ) { for ( j = 0; j < nSelected; j++ ) { if ( selectedListAux[j] == i ) { rowIndex = selectedList[j]; break; } } HYPRE_ParCSRMatrixGetRow(A_csr,rowIndex,&rowSize,&colInd,&colVal); rowSize2 = 1; for (j = 0; j < rowSize; j++) { colIndex = colInd[j]; if ( colVal[j] != 0.0 ) { if ( colIndex >= StartRow && colIndex <= newEndRow ) { searchIndex = hypre_BinarySearch(selectedList, colIndex, nSelected); if ( searchIndex >= 0 ) rowSize2++; } else if ( colIndex < StartRow || colIndex > EndRow ) { searchIndex = hypre_BinarySearch(globalSelectedList,colIndex, globalNSelected); if ( searchIndex >= 0 ) rowSize2++; } } } invA22MatSize[nConstraints_+i] = rowSize2; maxRowSize = ( rowSize2 > maxRowSize ) ? rowSize2 : maxRowSize; HYPRE_ParCSRMatrixRestoreRow(A_csr,rowIndex,&rowSize,&colInd,&colVal); } //------------------------------------------------------------------ // after fetching the row sizes, set up invA22 with such sizes //------------------------------------------------------------------ ierr = HYPRE_IJMatrixSetRowSizes(invA22, invA22MatSize); ierr += HYPRE_IJMatrixInitialize(invA22); hypre_assert(!ierr); delete [] invA22MatSize; //------------------------------------------------------------------ // next load the first nConstraints_ row to invA22 extracted from A // (that is, the D block) //------------------------------------------------------------------ maxRowSize++; newColInd = new int[maxRowSize]; newColVal = new double[maxRowSize]; for ( i = 0; i < diagCount; i++ ) { extDiagonal[i] = 1.0 / extDiagonal[i]; } for ( i = 0; i < nConstraints_; i++ ) { newColInd[0] = A21StartRow + nConstraints_ + i; rowIndex = A21StartRow + i; if ( newColInd[0] < 0 || newColInd[0] >= invA22GlobalNCols ) { if ( HYOutputLevel_ & HYFEI_SLIDEREDUCE1 ) printf("%4d : SlideReductionB WARNING - A22 (%d, %d (%d))\n", mypid_, rowIndex, newColInd[0], invA22GlobalNCols); } newColVal[0] = extDiagonal[A21StartRow/2+i]; ierr = HYPRE_IJMatrixSetValues(invA22, 1, &one, (const int *) &rowIndex, (const int *) newColInd, (const double *) newColVal); hypre_assert(!ierr); } //------------------------------------------------------------------ // next load the second nConstraints_ rows to A22 extracted from A //------------------------------------------------------------------ for ( i = 0; i < nSelected; i++ ) { for ( j = 0; j < nSelected; j++ ) { if ( selectedListAux[j] == i ) { rowIndex = selectedList[j]; break; } } HYPRE_ParCSRMatrixGetRow(A_csr,rowIndex,&rowSize,&colInd,&colVal); newRowSize = 1; newColInd[0] = A21StartRow + i; newColVal[0] = extDiagonal[A21StartRow/2+i]; for (j = 0; j < rowSize; j++) { colIndex = colInd[j]; if ( colVal[j] != 0.0 ) { searchIndex = hypre_BinarySearch(globalSelectedList,colIndex, globalNSelected); if ( searchIndex >= 0 ) { searchIndex = globalSelectedListAux[searchIndex]; for ( procIndex = 0; procIndex < numProcs_; procIndex++ ) if ( ProcNRows[procIndex] > colIndex ) break; if ( procIndex == numProcs_ ) { newColInd[newRowSize] = searchIndex + globalNConstr; } else { newColInd[newRowSize] = searchIndex + ProcNConstr[procIndex]; } if ( newColInd[newRowSize] < 0 || newColInd[newRowSize] >= invA22GlobalNCols ) { if ( HYOutputLevel_ & HYFEI_SLIDEREDUCE1 ) printf("%4d : SlideReductionB WARNING - A22(%d,%d,%d)\n", mypid_,rowCount,newColInd[newRowSize], invA22GlobalNCols); } newColVal[newRowSize++] = - extDiagonal[A21StartRow/2+i] * colVal[j] * extDiagonal[searchIndex]; if ( newRowSize > maxRowSize ) { if ( HYOutputLevel_ & HYFEI_SLIDEREDUCE1 ) { printf("%4d : SlideReductionB WARNING - ",mypid_); printf("passing array boundary(3).\n"); } } } } } rowCount = A21StartRow + nConstraints_ + i; ierr = HYPRE_IJMatrixSetValues(invA22, 1, &newRowSize, (const int *) &rowCount, (const int *) newColInd, (const double *) newColVal); hypre_assert(!ierr); HYPRE_ParCSRMatrixRestoreRow(A_csr,rowIndex,&rowSize,&colInd,&colVal); } delete [] newColInd; delete [] newColVal; delete [] extDiagonal; //------------------------------------------------------------------ // finally assemble the matrix and sanitize //------------------------------------------------------------------ HYPRE_IJMatrixAssemble(invA22); HYPRE_IJMatrixGetObject(invA22, (void **) &invA22_csr); hypre_MatvecCommPkgCreate((hypre_ParCSRMatrix *) invA22_csr); if ( HYOutputLevel_ & HYFEI_SLIDEREDUCE3 ) { ncnt = 0; MPI_Barrier(comm_); while ( ncnt < numProcs_ ) { if ( mypid_ == ncnt ) { printf("====================================================\n"); printf("%4d : SlideReductionB - invA22 \n", mypid_); for ( i = A21StartRow; i < A21StartRow+2*nConstraints_; i++ ) { HYPRE_ParCSRMatrixGetRow(invA22_csr,i,&rowSize,&colInd, &colVal); printf("invA22 ROW = %6d (%d)\n", i, rowSize); for ( j = 0; j < rowSize; j++ ) printf(" col = %6d, val = %e \n", colInd[j], colVal[j]); HYPRE_ParCSRMatrixRestoreRow(invA22_csr,i,&rowSize,&colInd, &colVal); } printf("====================================================\n"); } MPI_Barrier(comm_); ncnt++; } } //****************************************************************** // perform the triple matrix product //------------------------------------------------------------------ HYPRE_IJMatrixGetObject(A21, (void **) &A21_csr); HYPRE_IJMatrixGetObject(invA22, (void **) &invA22_csr); if ( HYOutputLevel_ & HYFEI_SLIDEREDUCE1 ) printf("%4d : SlideReductionB - Triple matrix product starts\n",mypid_); hypre_BoomerAMGBuildCoarseOperator( (hypre_ParCSRMatrix *) A21_csr, (hypre_ParCSRMatrix *) invA22_csr, (hypre_ParCSRMatrix *) A21_csr, (hypre_ParCSRMatrix **) &RAP_csr); if ( HYOutputLevel_ & HYFEI_SLIDEREDUCE1 ) printf("%4d : SlideReductionB - Triple matrix product ends\n", mypid_); if ( HYOutputLevel_ & HYFEI_SLIDEREDUCE3 ) { MPI_Barrier(comm_); ncnt = 0; while ( ncnt < numProcs_ ) { if ( mypid_ == ncnt ) { for ( i = A21StartRow; i < A21StartRow+A21NCols; i++ ) { HYPRE_ParCSRMatrixGetRow(RAP_csr,i,&rowSize,&colInd, &colVal); printf("RAP ROW = %6d (%d)\n", i, rowSize); for ( j = 0; j < rowSize; j++ ) printf(" col = %6d, val = %e \n", colInd[j], colVal[j]); HYPRE_ParCSRMatrixRestoreRow(RAP_csr,i,&rowSize,&colInd, &colVal); } } MPI_Barrier(comm_); ncnt++; } } //****************************************************************** // set global objects and checking //------------------------------------------------------------------ HYA21_ = A21; HYinvA22_ = invA22; (*rap_csr) = RAP_csr; MPI_Allreduce(&nnzA21,&ncnt,1,MPI_INT,MPI_SUM,comm_); if ( mypid_ == 0 && ( HYOutputLevel_ & HYFEI_SLIDEREDUCE1 )) printf(" SlideReductionB : NNZ of A21 = %d\n", ncnt); } //***************************************************************************** // Part C of buildSlideReducedSystem : create subvectors and wrap up //----------------------------------------------------------------------------- void HYPRE_LinSysCore::buildSlideReducedSystemPartC(int *ProcNRows, int *ProcNConstr, int globalNRows, int globalNConstr, int *globalSelectedList, int *globalSelectedListAux, HYPRE_ParCSRMatrix RAP_csr) { int i, j, nRows, StartRow, EndRow; int newNRows, *reducedAMatSize, reducedAStartRow; int rowCount, rowIndex, newRowSize, rowSize, rowSize2, *newColInd; int *colInd, *colInd2, colIndex, searchIndex, ubound, ncnt, ierr; int A21NRows, A21NCols, A21GlobalNRows, A21GlobalNCols, A21StartRow; int A12NRows, A12NCols, A12GlobalNRows, A12GlobalNCols, A12StartRow; int *A12MatSize, newEndRow, globalNSelected, procIndex, nnzA12; int nSelected, *selectedList, *selectedListAux, A21StartCol; double *colVal, *colVal2, *newColVal, ddata; HYPRE_IJMatrix A12, reducedA; HYPRE_ParCSRMatrix A_csr, A12_csr, reducedA_csr, invA22_csr; HYPRE_IJVector f2, f2hat; HYPRE_ParVector f2_csr, f2hat_csr, reducedB_csr; //------------------------------------------------------------------ // get matrix and constraint information //------------------------------------------------------------------ nRows = localEndRow_ - localStartRow_ + 1; StartRow = localStartRow_ - 1; EndRow = localEndRow_ - 1; newEndRow = EndRow - nConstraints_; newEndRow = EndRow - nConstraints_; HYPRE_IJMatrixGetObject(HYA_, (void **) &A_csr); globalNSelected = globalNConstr; nSelected = nConstraints_; selectedList = selectedList_; selectedListAux = selectedListAux_; //------------------------------------------------------------------ // first calculate the dimension of the reduced matrix //------------------------------------------------------------------ newNRows = nRows - 2 * nConstraints_; A21StartCol = ProcNRows[mypid_] - 2 * ProcNConstr[mypid_]; ierr = HYPRE_IJMatrixCreate(comm_, A21StartCol, A21StartCol+newNRows-1, A21StartCol, A21StartCol+newNRows-1, &reducedA); ierr += HYPRE_IJMatrixSetObjectType(reducedA, HYPRE_PARCSR); hypre_assert(!ierr); //------------------------------------------------------------------ // set up reducedA with proper sizes //------------------------------------------------------------------ reducedAMatSize = new int[newNRows]; reducedAStartRow = ProcNRows[mypid_] - 2 * ProcNConstr[mypid_]; rowCount = reducedAStartRow; rowIndex = 0; for ( i = StartRow; i <= newEndRow; i++ ) { searchIndex = hypre_BinarySearch(selectedList, i, nSelected); if ( searchIndex < 0 ) { HYPRE_ParCSRMatrixGetRow(A_csr,i,&rowSize,&colInd,&colVal); ierr = HYPRE_ParCSRMatrixGetRow(RAP_csr,rowCount,&rowSize2, &colInd2, &colVal2); hypre_assert( !ierr ); newRowSize = rowSize + rowSize2; newColInd = new int[newRowSize]; for (j = 0; j < rowSize; j++) newColInd[j] = colInd[j]; for (j = 0; j < rowSize2; j++) newColInd[rowSize+j] = colInd2[j]; hypre_qsort0(newColInd, 0, newRowSize-1); ncnt = 0; for ( j = 1; j < newRowSize; j++ ) { if ( newColInd[j] != newColInd[ncnt] ) { ncnt++; newColInd[ncnt] = newColInd[j]; } } if ( newRowSize > 0 ) ncnt++; reducedAMatSize[rowIndex++] = ncnt; HYPRE_ParCSRMatrixRestoreRow(A_csr,i,&rowSize,&colInd,&colVal); ierr = HYPRE_ParCSRMatrixRestoreRow(RAP_csr,rowCount,&rowSize2, &colInd2,&colVal2); delete [] newColInd; hypre_assert( !ierr ); rowCount++; } } //------------------------------------------------------------------ // create a matrix context for reducedA //------------------------------------------------------------------ ierr = HYPRE_IJMatrixSetRowSizes(reducedA, reducedAMatSize); ierr += HYPRE_IJMatrixInitialize(reducedA); hypre_assert(!ierr); delete [] reducedAMatSize; //------------------------------------------------------------------ // load the reducedA matrix //------------------------------------------------------------------ rowCount = reducedAStartRow; for ( i = StartRow; i <= newEndRow; i++ ) { searchIndex = hypre_BinarySearch(selectedList, i, nSelected); if ( searchIndex < 0 ) { HYPRE_ParCSRMatrixGetRow(A_csr, i, &rowSize, &colInd, &colVal); HYPRE_ParCSRMatrixGetRow(RAP_csr,rowCount,&rowSize2,&colInd2, &colVal2); newRowSize = rowSize + rowSize2; newColInd = new int[newRowSize]; newColVal = new double[newRowSize]; ncnt = 0; for ( j = 0; j < rowSize; j++ ) { colIndex = colInd[j]; for ( procIndex = 0; procIndex < numProcs_; procIndex++ ) if ( ProcNRows[procIndex] > colIndex ) break; if ( procIndex == numProcs_ ) ubound = globalNRows-(globalNConstr-ProcNConstr[numProcs_-1]); else ubound = ProcNRows[procIndex] - (ProcNConstr[procIndex]-ProcNConstr[procIndex-1]); procIndex--; if ( colIndex < ubound ) { searchIndex = HYPRE_LSI_Search(globalSelectedList,colIndex, globalNSelected); if ( searchIndex < 0 ) { searchIndex = - searchIndex - 1; newColInd[ncnt] = colIndex - ProcNConstr[procIndex] - searchIndex; newColVal[ncnt++] = colVal[j]; } } } for ( j = 0; j < rowSize2; j++ ) { newColInd[ncnt+j] = colInd2[j]; newColVal[ncnt+j] = - colVal2[j]; } newRowSize = ncnt + rowSize2; hypre_qsort1(newColInd, newColVal, 0, newRowSize-1); ncnt = 0; for ( j = 0; j < newRowSize; j++ ) { if ( j != ncnt && newColInd[j] == newColInd[ncnt] ) newColVal[ncnt] += newColVal[j]; else if ( newColInd[j] != newColInd[ncnt] ) { ncnt++; newColVal[ncnt] = newColVal[j]; newColInd[ncnt] = newColInd[j]; } } newRowSize = ncnt + 1; ierr = HYPRE_IJMatrixSetValues(reducedA, 1, &newRowSize, (const int *) &rowCount, (const int *) newColInd, (const double *) newColVal); hypre_assert(!ierr); HYPRE_ParCSRMatrixRestoreRow(A_csr,i,&rowSize,&colInd,&colVal); HYPRE_ParCSRMatrixRestoreRow(RAP_csr,rowCount,&rowSize2,&colInd2, &colVal2); rowCount++; delete [] newColInd; delete [] newColVal; } } //------------------------------------------------------------------ // assemble the reduced matrix //------------------------------------------------------------------ HYPRE_IJMatrixAssemble(reducedA); if ( HYOutputLevel_ & HYFEI_SLIDEREDUCE1 ) printf("%4d : SlideReductionC - reducedAStartRow = %d\n", mypid_, reducedAStartRow); HYPRE_IJMatrixGetObject(reducedA, (void **) &reducedA_csr); if ( HYOutputLevel_ & HYFEI_SLIDEREDUCE3 ) { MPI_Barrier(comm_); ncnt = 0; while ( ncnt < numProcs_ ) { if ( mypid_ == ncnt ) { printf("====================================================\n"); for ( i = reducedAStartRow; i < reducedAStartRow+nRows-2*nConstraints_; i++ ) { printf("%d : reducedA ROW %d\n", mypid_, i); ierr = HYPRE_ParCSRMatrixGetRow(reducedA_csr,i,&rowSize, &colInd, &colVal); //hypre_qsort1(colInd, colVal, 0, rowSize-1); for ( j = 0; j < rowSize; j++ ) if ( colVal[j] != 0.0 ) printf("%4d %4d %20.13e\n", i, colInd[j], colVal[j]); HYPRE_ParCSRMatrixRestoreRow(reducedA_csr,i,&rowSize,&colInd, &colVal); } printf("====================================================\n"); } MPI_Barrier(comm_); ncnt++; } } // ***************************************************************** // form modified right hand side (f1 = f1 - A12*invA22*f2) // ***************************************************************** // ***************************************************************** // form f2hat = invA22 * f2 //------------------------------------------------------------------ A21NRows = 2 * nConstraints_; A21NCols = nRows - 2 * nConstraints_; A21GlobalNRows = 2 * globalNConstr; A21GlobalNCols = globalNRows - 2 * globalNConstr; A21StartRow = 2 * ProcNConstr[mypid_]; HYPRE_IJVectorCreate(comm_, A21StartRow, A21StartRow+A21NRows-1, &f2); HYPRE_IJVectorSetObjectType(f2, HYPRE_PARCSR); ierr += HYPRE_IJVectorInitialize(f2); ierr += HYPRE_IJVectorAssemble(f2); hypre_assert(!ierr); HYPRE_IJVectorCreate(comm_, A21StartRow, A21StartRow+A21NRows-1, &f2hat); HYPRE_IJVectorSetObjectType(f2hat, HYPRE_PARCSR); ierr += HYPRE_IJVectorInitialize(f2hat); ierr += HYPRE_IJVectorAssemble(f2hat); hypre_assert(!ierr); colInd = new int[nSelected*2]; colVal = new double[nSelected*2]; for ( i = 0; i < nSelected; i++ ) { for ( j = 0; j < nSelected; j++ ) { if ( selectedListAux[j] == i ) { colInd[i] = selectedList[j]; break; } } if ( colInd[i] < 0 ) { printf("%4d : SlideReductionC ERROR - out of range %d\n", mypid_, colInd[i]); exit(1); } } for ( i = 0; i < nSelected; i++ ) { colInd[nSelected+i] = EndRow - nConstraints_ + i + 1; } HYPRE_IJVectorGetValues(HYb_, 2*nSelected, colInd, colVal); for ( i = 0; i < nSelected*2; i++ ) colInd[i] = A21StartRow + i; ierr = HYPRE_IJVectorSetValues(f2,2*nSelected,(const int *) colInd, (const double *) colVal); hypre_assert( !ierr ); HYPRE_IJVectorGetObject(f2, (void **) &f2_csr); HYPRE_IJVectorGetObject(f2hat, (void **) &f2hat_csr); HYPRE_IJMatrixGetObject(HYinvA22_, (void **) &invA22_csr); HYPRE_ParCSRMatrixMatvec( 1.0, invA22_csr, f2_csr, 0.0, f2hat_csr ); delete [] colVal; delete [] colInd; HYPRE_IJVectorDestroy(f2); // ***************************************************************** // set up A12 with proper sizes before forming f2til = A12 * f2hat //------------------------------------------------------------------ //------------------------------------------------------------------ // calculate the dimension of A12 //------------------------------------------------------------------ A12NRows = A21NCols; A12NCols = A21NRows; A12GlobalNRows = A21GlobalNCols; A12GlobalNCols = A21GlobalNRows; A12MatSize = new int[A12NRows]; A12StartRow = ProcNRows[mypid_] - 2 * ProcNConstr[mypid_]; if ( HYOutputLevel_ & HYFEI_SLIDEREDUCE1 ) { printf("%4d : SlideReductionC - A12GlobalDim = %d %d\n", mypid_, A12GlobalNRows, A12GlobalNCols); printf("%4d : SlideReductionC - A12LocalDim = %d %d\n", mypid_, A12NRows, A12NCols); } //------------------------------------------------------------------ // create a matrix context for A12 //------------------------------------------------------------------ ierr = HYPRE_IJMatrixCreate(comm_, A21StartCol, A21StartCol+A12NRows-1, A21StartRow, A21StartRow+A12NCols-1, &A12); ierr += HYPRE_IJMatrixSetObjectType(A12, HYPRE_PARCSR); hypre_assert(!ierr); //------------------------------------------------------------------ // compute the number of nonzeros in each row of A12 // (which consists of the rows in selectedList and the constraints) //------------------------------------------------------------------ rowCount = A12StartRow; rowIndex = 0; for ( i = StartRow; i <= newEndRow; i++ ) { searchIndex = hypre_BinarySearch(selectedList, i, nSelected); if ( searchIndex < 0 ) { HYPRE_ParCSRMatrixGetRow(A_csr,i,&rowSize,&colInd,&colVal); newRowSize = 0; for (j = 0; j < rowSize; j++) { if ( colVal[j] != 0.0 ) { colIndex = colInd[j]; for ( procIndex = 0; procIndex < numProcs_; procIndex++ ) if ( ProcNRows[procIndex] > colIndex ) break; if ( procIndex == numProcs_ ) ubound = globalNRows - (globalNConstr - ProcNConstr[numProcs_-1]); else ubound = ProcNRows[procIndex] - (ProcNConstr[procIndex]-ProcNConstr[procIndex-1]); procIndex--; if ( colIndex >= ubound ) newRowSize++; else { if (hypre_BinarySearch(globalSelectedList,colIndex, globalNSelected) >= 0) newRowSize++; } } } A12MatSize[rowIndex++] = newRowSize; HYPRE_ParCSRMatrixRestoreRow(A_csr,i,&rowSize,&colInd,&colVal); rowCount++; } } //------------------------------------------------------------------ // after fetching the row sizes, set up A12 with such sizes //------------------------------------------------------------------ nnzA12 = 0; for ( i = 0; i < A12NRows; i++ ) nnzA12 += A12MatSize[i]; ierr = HYPRE_IJMatrixSetRowSizes(A12, A12MatSize); ierr += HYPRE_IJMatrixInitialize(A12); hypre_assert(!ierr); delete [] A12MatSize; //------------------------------------------------------------------ // load the A12 matrix //------------------------------------------------------------------ rowCount = A12StartRow; for ( i = StartRow; i <= newEndRow; i++ ) { searchIndex = hypre_BinarySearch(selectedList, i, nSelected); if ( searchIndex < 0 ) { HYPRE_ParCSRMatrixGetRow(A_csr, i, &rowSize, &colInd, &colVal); newRowSize = 0; newColInd = new int[rowSize]; newColVal = new double[rowSize]; for (j = 0; j < rowSize; j++) { colIndex = colInd[j]; for ( procIndex = 0; procIndex < numProcs_; procIndex++ ) if ( ProcNRows[procIndex] > colIndex ) break; if ( procIndex == numProcs_ ) ubound = globalNRows-(globalNConstr-ProcNConstr[numProcs_-1]); else ubound = ProcNRows[procIndex] - (ProcNConstr[procIndex]-ProcNConstr[procIndex-1]); procIndex--; if ( colIndex >= ubound ) { if ( procIndex != numProcs_ - 1 ) { newColInd[newRowSize] = colInd[j] - ubound + ProcNConstr[procIndex] + ProcNConstr[procIndex+1]; } else { newColInd[newRowSize] = colInd[j] - ubound + ProcNConstr[procIndex] + globalNConstr; } if ( newColInd[newRowSize] < 0 || newColInd[newRowSize] >= A12GlobalNCols ) { if ( HYOutputLevel_ & HYFEI_SLIDEREDUCE1 ) { printf("%4d : SlideReductionC WARNING - A12 col index ", mypid_); printf("out of range %d %d(%d)\n", i, newColInd[newRowSize], A12GlobalNCols); } } newColVal[newRowSize++] = colVal[j]; } else { searchIndex = HYPRE_LSI_Search(globalSelectedList,colInd[j], globalNSelected); if ( searchIndex >= 0) { searchIndex = globalSelectedListAux[searchIndex]; newColInd[newRowSize] = searchIndex + ProcNConstr[procIndex]; if ( newColInd[newRowSize] < 0 || newColInd[newRowSize] >= A12GlobalNCols ) { if ( HYOutputLevel_ & HYFEI_SLIDEREDUCE1 ) { printf("%4d : SlideReductionC WARNING - \n",mypid_); printf(" A12(%d,%d,%d))\n", i, newColInd[newRowSize], A12GlobalNCols); } } newColVal[newRowSize++] = colVal[j]; } } } ierr = HYPRE_IJMatrixSetValues(A12, 1, &newRowSize, (const int *) &rowCount, (const int *) newColInd, (const double *) newColVal); hypre_assert(!ierr); HYPRE_ParCSRMatrixRestoreRow(A_csr,i,&rowSize,&colInd,&colVal); rowCount++; delete [] newColInd; delete [] newColVal; } } MPI_Allreduce(&nnzA12,&ncnt,1,MPI_INT,MPI_SUM,comm_); if ( mypid_ == 0 && ( HYOutputLevel_ & HYFEI_SLIDEREDUCE1 )) printf(" SlideReductionC : NNZ of A12 = %d\n", ncnt); //------------------------------------------------------------------ // assemble the A12 matrix //------------------------------------------------------------------ ierr = HYPRE_IJMatrixAssemble(A12); hypre_assert( !ierr ); HYPRE_IJMatrixGetObject(A12, (void **) &A12_csr); if ( HYOutputLevel_ & HYFEI_SLIDEREDUCE3 ) { MPI_Barrier(comm_); ncnt = 0; while ( ncnt < numProcs_ ) { if ( mypid_ == ncnt ) { printf("====================================================\n"); for (i=A12StartRow;i nConstraints, globalNConstr //------------------------------------------------------------------ MPI_Allreduce(&nConstraints_,&globalNConstr,1,MPI_INT,MPI_SUM,comm_); if ( globalNConstr == 0 ) { for ( i = EndRow; i >= StartRow; i-- ) { HYPRE_ParCSRMatrixGetRow(A_csr,i,&rowSize,&colInd,&colVal); isAConstr = 1; for (j = 0; j < rowSize; j++) if (colInd[j] == i && colVal[j] != 0.0) {isAConstr = 0; break;} HYPRE_ParCSRMatrixRestoreRow(A_csr,i,&rowSize,&colInd,&colVal); if ( isAConstr ) nConstraints_++; else break; } } if ( HYOutputLevel_ & HYFEI_SLIDEREDUCE1 ) printf("%4d : SlideReduction2 : no. constr = %d\n", mypid_, nConstraints_); MPI_Allreduce(&nConstraints_, &globalNConstr, 1, MPI_INT, MPI_SUM, comm_); if ( globalNConstr == 0 ) return; //------------------------------------------------------------------ // get information about nRows from all processors, and then // compute the base NRows on each processor // (This is needed later on for column index conversion) // ==> ProcNRows, globalNRows //------------------------------------------------------------------ ProcNRows = new int[numProcs_]; tempList = new int[numProcs_]; for ( i = 0; i < numProcs_; i++ ) tempList[i] = 0; tempList[mypid_] = nRows; MPI_Allreduce(tempList, ProcNRows, numProcs_, MPI_INT, MPI_SUM, comm_); delete [] tempList; globalNRows = 0; ncnt = 0; for ( i = 0; i < numProcs_; i++ ) { globalNRows += ProcNRows[i]; ncnt2 = ProcNRows[i]; ProcNRows[i] = ncnt; ncnt += ncnt2; } if ( HYOutputLevel_ & HYFEI_SLIDEREDUCE1 ) printf("%4d : SlideReduction2 : localNRows = %d\n", mypid_, nRows); //------------------------------------------------------------------ // compose a global array marking where the constraint equations are, // then compute the base nConstraints on each processor // (This is needed later on for column index conversion) // ==> ProcNConstr, globalNConstr //------------------------------------------------------------------ globalNConstr = 0; tempList = new int[numProcs_]; ProcNConstr = new int[numProcs_]; for ( i = 0; i < numProcs_; i++ ) tempList[i] = 0; tempList[mypid_] = nConstraints_; MPI_Allreduce(tempList,ProcNConstr,numProcs_,MPI_INT,MPI_SUM,comm_); delete [] tempList; ncnt = 0; for ( i = 0; i < numProcs_; i++ ) { globalNConstr += ProcNConstr[i]; ncnt2 = ProcNConstr[i]; ProcNConstr[i] = ncnt; ncnt += ncnt2; } #ifdef HAVE_MLI if ( HYPreconID_ == HYMLI ) HYPRE_LSI_MLIAdjustNodeEqnMap(HYPrecon_, ProcNRows, ProcNConstr); #endif //****************************************************************** // compose the local and global selected node lists //------------------------------------------------------------------ if ( selectedList_ != NULL ) delete [] selectedList_; if ( selectedListAux_ != NULL ) delete [] selectedListAux_; nSelected = nConstraints_; if ( nConstraints_ > 0 ) { selectedList_ = new int[nConstraints_]; selectedListAux_ = new int[nConstraints_]; } else selectedList_ = selectedListAux_ = NULL; globalNSelected = globalNConstr; if (globalNSelected > 0) { globalSelectedList = new int[globalNSelected]; globalSelectedListAux = new int[globalNSelected]; } else globalSelectedList = globalSelectedListAux = NULL; buildSlideReducedSystemPartA(ProcNRows,ProcNConstr,globalNRows, globalNSelected,globalSelectedList, globalSelectedListAux); //****************************************************************** // construct A21 //------------------------------------------------------------------ //------------------------------------------------------------------ // calculate the dimension of A21 //------------------------------------------------------------------ A21NRows = 2 * nConstraints_; A21NCols = nRows - nConstraints_; A21GlobalNRows = 2 * globalNConstr; A21GlobalNCols = globalNRows - globalNConstr; A21StartRow = 2 * ProcNConstr[mypid_]; A21StartCol = ProcNRows[mypid_] - ProcNConstr[mypid_]; if ( HYOutputLevel_ & HYFEI_SLIDEREDUCE1 ) { printf("%4d : SlideReduction2 : A21StartRow = %d\n", mypid_, A21StartRow); printf("%4d : SlideReduction2 : A21GlobalDim = %d %d\n", mypid_, A21GlobalNRows, A21GlobalNCols); printf("%4d : SlideReduction2 : A21LocalDim = %d %d\n",mypid_, A21NRows, A21NCols); } //------------------------------------------------------------------ // create a matrix context for A21 //------------------------------------------------------------------ ierr = HYPRE_IJMatrixCreate(comm_, A21StartRow, A21StartRow+A21NRows-1, A21StartCol, A21StartCol+A21NCols-1, &A21); ierr += HYPRE_IJMatrixSetObjectType(A21, HYPRE_PARCSR); hypre_assert(!ierr); //------------------------------------------------------------------ // compute the number of nonzeros in the first nConstraint row of A21 // (which consists of the rows in selectedList), the nnz will // be reduced by excluding the constraint and selected slave columns //------------------------------------------------------------------ rowCount = 0; maxRowSize = 0; newEndRow = EndRow - nConstraints_; A21MatSize = new int[A21NRows]; for ( i = 0; i < nSelected; i++ ) { for ( j = 0; j < nSelected; j++ ) { if ( selectedListAux_[j] == i ) { rowIndex = selectedList_[j]; break; } } HYPRE_ParCSRMatrixGetRow(A_csr,rowIndex,&rowSize,&colInd,&colVal); newRowSize = 0; for (j = 0; j < rowSize; j++) { colIndex = colInd[j]; if ( colVal[j] != 0.0 ) { if (colIndex <= newEndRow || colIndex >= localEndRow_) { if (colIndex >= StartRow && colIndex <= newEndRow ) searchIndex = hypre_BinarySearch(selectedList_,colIndex, nSelected); else searchIndex = hypre_BinarySearch(globalSelectedList, colIndex, globalNSelected); if (searchIndex < 0 ) newRowSize++; } } } A21MatSize[rowCount] = newRowSize; maxRowSize = ( newRowSize > maxRowSize ) ? newRowSize : maxRowSize; HYPRE_ParCSRMatrixRestoreRow(A_csr,rowIndex,&rowSize,&colInd,&colVal); rowCount++; } //------------------------------------------------------------------ // compute the number of nonzeros in the second nConstraint row of A21 // (which consists of the rows in constraint equations), the nnz will // be reduced by excluding the selected slave columns only (since the // entries corresponding to the constraint columns are 0, and since // the selected matrix is a diagonal matrix, there is no need to // search for slave equations in the off-processor list) //------------------------------------------------------------------ rowCount = nSelected; for ( i = EndRow-nConstraints_+1; i <= EndRow; i++ ) { HYPRE_ParCSRMatrixGetRow(A_csr,i,&rowSize,&colInd,&colVal); newRowSize = 0; for (j = 0; j < rowSize; j++) { if ( colVal[j] != 0.0 ) { colIndex = colInd[j]; if (colIndex <= newEndRow || colIndex >= localEndRow_) { if (colIndex >= StartRow && colIndex <= newEndRow ) searchIndex = hypre_BinarySearch(selectedList_,colIndex, nSelected); else searchIndex = hypre_BinarySearch(globalSelectedList, colIndex, globalNSelected); if ( searchIndex < 0 ) newRowSize++; } } } A21MatSize[rowCount] = newRowSize; maxRowSize = ( newRowSize > maxRowSize ) ? newRowSize : maxRowSize; HYPRE_ParCSRMatrixRestoreRow(A_csr,i,&rowSize,&colInd,&colVal); rowCount++; } nnzA21 = 0; for ( i = 0; i < 2*nConstraints_; i++ ) nnzA21 += A21MatSize[i]; //------------------------------------------------------------------ // after fetching the row sizes, set up A21 with such sizes //------------------------------------------------------------------ ierr = HYPRE_IJMatrixSetRowSizes(A21, A21MatSize); ierr += HYPRE_IJMatrixInitialize(A21); hypre_assert(!ierr); delete [] A21MatSize; //------------------------------------------------------------------ // next load the first nConstraint row to A21 extracted from A // (at the same time, the D block is saved for future use) //------------------------------------------------------------------ rowCount = A21StartRow; if ( nConstraints_ > 0 ) diagonal = new double[nConstraints_]; else diagonal = NULL; newColInd = new int[maxRowSize+1]; newColVal = new double[maxRowSize+1]; diagCount = 0; for ( i = 0; i < nSelected; i++ ) { for ( j = 0; j < nSelected; j++ ) { if ( selectedListAux_[j] == i ) { rowIndex = selectedList_[j]; break; } } HYPRE_ParCSRMatrixGetRow(A_csr,rowIndex,&rowSize,&colInd,&colVal); newRowSize = 0; for (j = 0; j < rowSize; j++) { if ( colVal[j] != 0.0 ) { colIndex = colInd[j]; if (colIndex <= newEndRow || colIndex >= localEndRow_) { searchIndex = hypre_BinarySearch(globalSelectedList, colIndex, globalNSelected); if ( searchIndex < 0 ) { for ( procIndex = 0; procIndex < numProcs_; procIndex++ ) if ( ProcNRows[procIndex] > colIndex ) break; procIndex--; newColIndex = colInd[j] - ProcNConstr[procIndex]; newColInd[newRowSize] = newColIndex; newColVal[newRowSize++] = colVal[j]; if ( newColIndex < 0 || newColIndex >= A21GlobalNCols ) { if (HYOutputLevel_ & HYFEI_SLIDEREDUCE1) { printf("%4d : SlideReduction2 WARNING - ",mypid_); printf(" A21(%d,%d(%d))\n", rowCount, colIndex, A21GlobalNCols); } } if ( newRowSize > maxRowSize+1 ) { if (HYOutputLevel_ & HYFEI_SLIDEREDUCE1) { printf("%4d : SlideReduction2 : WARNING - ",mypid_); printf("cross array boundary(1).\n"); } } } } //--------------------------------------------------------- // slave equations should only have one nonzeros // corresponding to the D in A22 //--------------------------------------------------------- else if ( colIndex > newEndRow && colIndex <= EndRow ) { if ( colVal[j] != 0.0 ) diagonal[diagCount++] = colVal[j]; if ( habs(colVal[j]) < 1.0E-8 ) { if (HYOutputLevel_ & HYFEI_SLIDEREDUCE1) { printf("%4d : SlideReduction2 WARNING : large ",mypid_); printf("entry in invA22\n"); } } } } } HYPRE_IJMatrixSetValues(A21, 1, &newRowSize, (const int *) &rowCount, (const int *) newColInd, (const double *) newColVal); HYPRE_ParCSRMatrixRestoreRow(A_csr,rowIndex,&rowSize,&colInd,&colVal); if ( diagCount != (i+1) ) { printf("%4d : SlideReduction2 ERROR (3) : %d %d.\n", mypid_, diagCount,i+1); exit(1); } rowCount++; } //------------------------------------------------------------------ // send the diagonal to each processor that needs them //------------------------------------------------------------------ recvCntArray = new int[numProcs_]; displArray = new int[numProcs_]; MPI_Allgather(&diagCount, 1, MPI_INT, recvCntArray, 1, MPI_INT, comm_); displArray[0] = 0; for ( i = 1; i < numProcs_; i++ ) displArray[i] = displArray[i-1] + recvCntArray[i-1]; ncnt = displArray[numProcs_-1] + recvCntArray[numProcs_-1]; if ( ncnt > 0 ) extDiagonal = new double[ncnt]; else extDiagonal = NULL; MPI_Allgatherv(diagonal, diagCount, MPI_DOUBLE, extDiagonal, recvCntArray, displArray, MPI_DOUBLE, comm_); diagCount = ncnt; delete [] recvCntArray; delete [] displArray; if ( diagonal != NULL ) delete [] diagonal; //------------------------------------------------------------------ // next load the second nConstraint rows to A21 extracted from A // (assume the constraint-constraint block is 0 ) //------------------------------------------------------------------ for ( i = EndRow-nConstraints_+1; i <= EndRow; i++ ) { HYPRE_ParCSRMatrixGetRow(A_csr,i,&rowSize,&colInd,&colVal); newRowSize = 0; for (j = 0; j < rowSize; j++) { colIndex = colInd[j]; if ( colVal[j] != 0.0 ) { if (colIndex <= newEndRow || colIndex >= localEndRow_) { if (colIndex >= StartRow && colIndex <= newEndRow ) searchIndex = hypre_BinarySearch(selectedList_,colIndex, nSelected); else searchIndex = hypre_BinarySearch(globalSelectedList, colIndex, globalNSelected); if ( searchIndex < 0 ) { for ( procIndex = 0; procIndex < numProcs_; procIndex++ ) if ( ProcNRows[procIndex] > colIndex ) break; procIndex--; newColIndex = colInd[j] - ProcNConstr[procIndex]; newColInd[newRowSize] = newColIndex; newColVal[newRowSize++] = colVal[j]; if ( newColIndex < 0 || newColIndex >= A21GlobalNCols ) { if (HYOutputLevel_ & HYFEI_SLIDEREDUCE1) { printf("%4d : SlideReduction2 WARNING - ",mypid_); printf(" A21(%d,%d(%d))\n", rowCount, colIndex, A21GlobalNCols); } } if ( newRowSize > maxRowSize+1 ) { if (HYOutputLevel_ & HYFEI_SLIDEREDUCE1) { printf("%4d : SlideReductionWARNING : ",mypid_); printf("crossing array boundary(2).\n"); } } } } } } if ( newRowSize == 0 && (HYOutputLevel_ & HYFEI_SLIDEREDUCE1)) printf("%4d : SlideReduction2 WARNING : loading all 0 to A21\n", mypid_); HYPRE_IJMatrixSetValues(A21, 1, &newRowSize, (const int *) &rowCount, (const int *) newColInd, (const double *) newColVal); HYPRE_ParCSRMatrixRestoreRow(A_csr,i,&rowSize,&colInd,&colVal); rowCount++; } delete [] newColInd; delete [] newColVal; //------------------------------------------------------------------ // finally assemble the matrix and sanitize //------------------------------------------------------------------ HYPRE_IJMatrixAssemble(A21); HYPRE_IJMatrixGetObject(A21, (void **) &A21_csr); hypre_MatvecCommPkgCreate((hypre_ParCSRMatrix *) A21_csr); if ( HYOutputLevel_ & HYFEI_SLIDEREDUCE3 ) { ncnt = 0; MPI_Barrier(comm_); while ( ncnt < numProcs_ ) { if ( mypid_ == ncnt ) { printf("====================================================\n"); printf("%4d : SlideReduction2 : matrix A21 assembled %d.\n", mypid_,A21StartRow); fflush(stdout); for ( i = A21StartRow; i < A21StartRow+2*nConstraints_; i++ ) { HYPRE_ParCSRMatrixGetRow(A21_csr,i,&rowSize,&colInd,&colVal); printf("A21 ROW = %6d (%d)\n", i, rowSize); for ( j = 0; j < rowSize; j++ ) printf(" col = %6d, val = %e \n", colInd[j], colVal[j]); HYPRE_ParCSRMatrixRestoreRow(A21_csr,i,&rowSize,&colInd, &colVal); } printf("====================================================\n"); } ncnt++; MPI_Barrier(comm_); } } //****************************************************************** // construct invA22 //------------------------------------------------------------------ //------------------------------------------------------------------ // calculate the dimension of invA22 //------------------------------------------------------------------ invA22NRows = A21NRows; invA22NCols = invA22NRows; invA22GlobalNRows = A21GlobalNRows; invA22GlobalNCols = invA22GlobalNRows; if ( HYOutputLevel_ & HYFEI_SLIDEREDUCE1 ) { printf("%4d : SlideReduction2 - A22GlobalDim = %d %d\n", mypid_, invA22GlobalNRows, invA22GlobalNCols); printf("%4d : SlideReduction2 - A22LocalDim = %d %d\n", mypid_, invA22NRows, invA22NCols); } //------------------------------------------------------------------ // create a matrix context for A22 //------------------------------------------------------------------ ierr = HYPRE_IJMatrixCreate(comm_, A21StartRow, A21StartRow+invA22NRows-1, A21StartRow, A21StartRow+invA22NCols-1, &invA22); ierr += HYPRE_IJMatrixSetObjectType(invA22, HYPRE_PARCSR); hypre_assert(!ierr); //------------------------------------------------------------------ // compute the no. of nonzeros in the first nConstraint row of invA22 //------------------------------------------------------------------ maxRowSize = 0; invA22MatSize = new int[invA22NRows]; for ( i = 0; i < nConstraints_; i++ ) invA22MatSize[i] = 1; //------------------------------------------------------------------ // compute the number of nonzeros in the second nConstraints row of // invA22 (consisting of [D and A22 block]) //------------------------------------------------------------------ for ( i = 0; i < nSelected; i++ ) { for ( j = 0; j < nSelected; j++ ) { if ( selectedListAux_[j] == i ) { rowIndex = selectedList_[j]; break; } } HYPRE_ParCSRMatrixGetRow(A_csr,rowIndex,&rowSize,&colInd,&colVal); rowSize2 = 1; for (j = 0; j < rowSize; j++) { colIndex = colInd[j]; if ( colVal[j] != 0.0 ) { if ( colIndex >= StartRow && colIndex <= newEndRow ) { searchIndex = hypre_BinarySearch(selectedList_, colIndex, nSelected); if ( searchIndex >= 0 ) rowSize2++; } else if ( colIndex < StartRow || colIndex > EndRow ) { searchIndex = hypre_BinarySearch(globalSelectedList,colIndex, globalNSelected); if ( searchIndex >= 0 ) rowSize2++; } } } invA22MatSize[nConstraints_+i] = rowSize2; maxRowSize = ( rowSize2 > maxRowSize ) ? rowSize2 : maxRowSize; HYPRE_ParCSRMatrixRestoreRow(A_csr,rowIndex,&rowSize,&colInd,&colVal); } //------------------------------------------------------------------ // after fetching the row sizes, set up invA22 with such sizes //------------------------------------------------------------------ ierr = HYPRE_IJMatrixSetRowSizes(invA22, invA22MatSize); ierr += HYPRE_IJMatrixInitialize(invA22); hypre_assert(!ierr); delete [] invA22MatSize; //------------------------------------------------------------------ // next load the first nConstraints_ row to invA22 extracted from A // (that is, the D block) //------------------------------------------------------------------ maxRowSize++; newColInd = new int[maxRowSize]; newColVal = new double[maxRowSize]; for ( i = 0; i < diagCount; i++ ) extDiagonal[i] = 1.0 / extDiagonal[i]; for ( i = 0; i < nConstraints_; i++ ) { newColInd[0] = A21StartRow + nConstraints_ + i; rowIndex = A21StartRow + i; if ( newColInd[0] < 0 || newColInd[0] >= invA22GlobalNCols ) { if ( HYOutputLevel_ & HYFEI_SLIDEREDUCE1 ) printf("%4d : SlideReduction2 WARNING - A22(%d,%d(%d))\n", mypid_, rowIndex, newColInd[0], invA22GlobalNCols); } newColVal[0] = extDiagonal[A21StartRow/2+i]; ierr = HYPRE_IJMatrixSetValues(invA22, 1, &one, (const int *) &rowIndex, (const int *) newColInd, (const double *) newColVal); hypre_assert(!ierr); } //------------------------------------------------------------------ // next load the second nConstraints_ rows to A22 extracted from A //------------------------------------------------------------------ for ( i = 0; i < nSelected; i++ ) { for ( j = 0; j < nSelected; j++ ) { if ( selectedListAux_[j] == i ) { rowIndex = selectedList_[j]; break; } } HYPRE_ParCSRMatrixGetRow(A_csr,rowIndex,&rowSize,&colInd,&colVal); newRowSize = 1; newColInd[0] = A21StartRow + i; newColVal[0] = extDiagonal[A21StartRow/2+i]; for (j = 0; j < rowSize; j++) { colIndex = colInd[j]; if ( colVal[j] != 0.0 ) { searchIndex = hypre_BinarySearch(globalSelectedList, colIndex,globalNSelected); if ( searchIndex >= 0 ) { searchIndex = globalSelectedListAux[searchIndex]; for ( procIndex = 0; procIndex < numProcs_; procIndex++ ) if ( ProcNRows[procIndex] > colIndex ) break; if ( procIndex == numProcs_ ) newColInd[newRowSize] = searchIndex + globalNConstr; else newColInd[newRowSize] = searchIndex+ProcNConstr[procIndex]; if ( newColInd[newRowSize] < 0 || newColInd[newRowSize] >= invA22GlobalNCols ) { if ( HYOutputLevel_ & HYFEI_SLIDEREDUCE1 ) printf("%4d : SlideReduction2 WARNING - A22(%d,%d,%d)\n", mypid_, rowCount, newColInd[newRowSize], invA22GlobalNCols); } newColVal[newRowSize++] = - extDiagonal[A21StartRow/2+i] * colVal[j] * extDiagonal[searchIndex]; if ( newRowSize > maxRowSize ) { if ( HYOutputLevel_ & HYFEI_SLIDEREDUCE1 ) { printf("%4d : SlideReduction2 WARNING - ",mypid_); printf("passing array boundary(3).\n"); } } } } } rowCount = A21StartRow + nConstraints_ + i; ierr = HYPRE_IJMatrixSetValues(invA22, 1, &newRowSize, (const int *) &rowCount, (const int *) newColInd, (const double *) newColVal); hypre_assert(!ierr); HYPRE_ParCSRMatrixRestoreRow(A_csr,rowIndex,&rowSize,&colInd,&colVal); } delete [] newColInd; delete [] newColVal; delete [] extDiagonal; //------------------------------------------------------------------ // finally assemble the matrix and sanitize //------------------------------------------------------------------ HYPRE_IJMatrixAssemble(invA22); HYPRE_IJMatrixGetObject(invA22, (void **) &invA22_csr); hypre_MatvecCommPkgCreate((hypre_ParCSRMatrix *) invA22_csr); if ( HYOutputLevel_ & HYFEI_SLIDEREDUCE3 ) { ncnt = 0; MPI_Barrier(comm_); while ( ncnt < numProcs_ ) { if ( mypid_ == ncnt ) { printf("====================================================\n"); printf("%4d : SlideReduction - invA22 \n", mypid_); for ( i = A21StartRow; i < A21StartRow+2*nConstraints_; i++ ) { HYPRE_ParCSRMatrixGetRow(invA22_csr,i,&rowSize,&colInd, &colVal); printf("invA22 ROW = %6d (%d)\n", i, rowSize); for ( j = 0; j < rowSize; j++ ) printf(" col = %6d, val = %e \n", colInd[j], colVal[j]); HYPRE_ParCSRMatrixRestoreRow(invA22_csr,i,&rowSize,&colInd, &colVal); } printf("====================================================\n"); } MPI_Barrier(comm_); ncnt++; } } //****************************************************************** // perform the triple matrix product //------------------------------------------------------------------ HYPRE_IJMatrixGetObject(A21, (void **) &A21_csr); HYPRE_IJMatrixGetObject(invA22, (void **) &invA22_csr); if ( HYOutputLevel_ & HYFEI_SLIDEREDUCE1 ) printf("%4d : SlideReduction2 - Triple matrix product starts\n",mypid_); hypre_BoomerAMGBuildCoarseOperator( (hypre_ParCSRMatrix *) A21_csr, (hypre_ParCSRMatrix *) invA22_csr, (hypre_ParCSRMatrix *) A21_csr, (hypre_ParCSRMatrix **) &RAP_csr); if ( HYOutputLevel_ & HYFEI_SLIDEREDUCE1 ) printf("%4d : SlideReduction2 - Triple matrix product ends\n", mypid_); if ( HYOutputLevel_ & HYFEI_SLIDEREDUCE3 ) { MPI_Barrier(comm_); ncnt = 0; while ( ncnt < numProcs_ ) { if ( mypid_ == ncnt ) { for ( i = A21StartRow; i < A21StartRow+A21NCols; i++ ) { HYPRE_ParCSRMatrixGetRow(RAP_csr,i,&rowSize,&colInd, &colVal); printf("RAP ROW = %6d (%d)\n", i, rowSize); for ( j = 0; j < rowSize; j++ ) printf(" col = %6d, val = %e \n", colInd[j], colVal[j]); HYPRE_ParCSRMatrixRestoreRow(RAP_csr,i,&rowSize,&colInd, &colVal); } } MPI_Barrier(comm_); ncnt++; } } //****************************************************************** // finally formed the Schur complement reduced system by // extracting the A11 part of A and subtracting the RAP //------------------------------------------------------------------ //------------------------------------------------------------------ // first calculate the dimension of the reduced matrix //------------------------------------------------------------------ newNRows = nRows - nConstraints_; ierr = HYPRE_IJMatrixCreate(comm_, A21StartCol, A21StartCol+newNRows-1, A21StartCol, A21StartCol+newNRows-1, &reducedA); ierr += HYPRE_IJMatrixSetObjectType(reducedA, HYPRE_PARCSR); hypre_assert(!ierr); //------------------------------------------------------------------ // set up reducedA with proper sizes //------------------------------------------------------------------ reducedAMatSize = new int[newNRows]; reducedAStartRow = ProcNRows[mypid_] - ProcNConstr[mypid_]; rowCount = reducedAStartRow; rowIndex = 0; for ( i = StartRow; i <= newEndRow; i++ ) { searchIndex = hypre_BinarySearch(selectedList_, i, nSelected); if ( searchIndex < 0 ) { HYPRE_ParCSRMatrixGetRow(A_csr,i,&rowSize,&colInd,&colVal); ierr = HYPRE_ParCSRMatrixGetRow(RAP_csr,rowCount,&rowSize2, &colInd2, &colVal2); hypre_assert( !ierr ); newRowSize = rowSize + rowSize2; newColInd = new int[newRowSize]; for (j = 0; j < rowSize; j++) newColInd[j] = colInd[j]; for (j = 0; j < rowSize2; j++) newColInd[rowSize+j] = colInd2[j]; hypre_qsort0(newColInd, 0, newRowSize-1); ncnt = 0; for ( j = 0; j < newRowSize; j++ ) { if ( newColInd[j] != newColInd[ncnt] ) { ncnt++; newColInd[ncnt] = newColInd[j]; } } reducedAMatSize[rowIndex++] = ncnt; HYPRE_ParCSRMatrixRestoreRow(A_csr,i,&rowSize,&colInd,&colVal); ierr = HYPRE_ParCSRMatrixRestoreRow(RAP_csr,rowCount,&rowSize2, &colInd2,&colVal2); delete [] newColInd; hypre_assert( !ierr ); rowCount++; } else { reducedAMatSize[rowIndex++] = 1; rowCount++; } } //------------------------------------------------------------------ // create a matrix context for reducedA //------------------------------------------------------------------ ierr = HYPRE_IJMatrixSetRowSizes(reducedA, reducedAMatSize); ierr += HYPRE_IJMatrixInitialize(reducedA); hypre_assert(!ierr); delete [] reducedAMatSize; //------------------------------------------------------------------ // load the reducedA matrix //------------------------------------------------------------------ rowCount = reducedAStartRow; for ( i = StartRow; i <= newEndRow; i++ ) { searchIndex = hypre_BinarySearch(selectedList_, i, nSelected); if ( searchIndex < 0 ) { HYPRE_ParCSRMatrixGetRow(A_csr, i, &rowSize, &colInd, &colVal); HYPRE_ParCSRMatrixGetRow(RAP_csr,rowCount,&rowSize2,&colInd2, &colVal2); newRowSize = rowSize + rowSize2; newColInd = new int[newRowSize]; newColVal = new double[newRowSize]; ncnt = 0; for ( j = 0; j < rowSize; j++ ) { colIndex = colInd[j]; for ( procIndex = 0; procIndex < numProcs_; procIndex++ ) if ( ProcNRows[procIndex] > colIndex ) break; if ( procIndex == numProcs_ ) ubound = globalNRows-(globalNConstr-ProcNConstr[numProcs_-1]); else ubound = ProcNRows[procIndex] - (ProcNConstr[procIndex]-ProcNConstr[procIndex-1]); procIndex--; if ( colIndex < ubound ) { if ( colIndex >= StartRow && colIndex <= EndRow ) searchIndex = HYPRE_LSI_Search(selectedList_,colIndex, nSelected); else searchIndex = HYPRE_LSI_Search(globalSelectedList,colIndex, globalNSelected); if ( searchIndex < 0 ) { newColInd[ncnt] = colIndex - ProcNConstr[procIndex]; newColVal[ncnt++] = colVal[j]; } } } for ( j = 0; j < rowSize2; j++ ) { newColInd[ncnt+j] = colInd2[j]; newColVal[ncnt+j] = - colVal2[j]; } newRowSize = ncnt + rowSize2; hypre_qsort1(newColInd, newColVal, 0, newRowSize-1); ncnt = 0; for ( j = 0; j < newRowSize; j++ ) { if ( j != ncnt && newColInd[j] == newColInd[ncnt] ) newColVal[ncnt] += newColVal[j]; else if ( newColInd[j] != newColInd[ncnt] ) { ncnt++; newColVal[ncnt] = newColVal[j]; newColInd[ncnt] = newColInd[j]; } } newRowSize = ncnt + 1; ierr = HYPRE_IJMatrixSetValues(reducedA, 1, &newRowSize, (const int *) &rowCount, (const int *) newColInd, (const double *) newColVal); hypre_assert(!ierr); HYPRE_ParCSRMatrixRestoreRow(A_csr,i,&rowSize,&colInd,&colVal); HYPRE_ParCSRMatrixRestoreRow(RAP_csr,rowCount,&rowSize2,&colInd2, &colVal2); rowCount++; delete [] newColInd; delete [] newColVal; } else { newRowSize = 1; newColInd = new int[newRowSize]; newColVal = new double[newRowSize]; newColInd[0] = rowCount; newColVal[0] = 1.0; ierr = HYPRE_IJMatrixSetValues(reducedA, 1, &newRowSize, (const int *) &rowCount, (const int *) newColInd, (const double *) newColVal); hypre_assert(!ierr); rowCount++; delete [] newColInd; delete [] newColVal; } } //------------------------------------------------------------------ // assemble the reduced matrix //------------------------------------------------------------------ HYPRE_IJMatrixAssemble(reducedA); if ( HYOutputLevel_ & HYFEI_SLIDEREDUCE1 ) printf("%4d : SlideReduction2 - reducedA - StartRow = %d\n", mypid_, reducedAStartRow); HYPRE_IJMatrixGetObject(reducedA, (void **) &reducedA_csr); if ( HYOutputLevel_ & HYFEI_SLIDEREDUCE3 ) { MPI_Barrier(comm_); ncnt = 0; while ( ncnt < numProcs_ ) { if ( mypid_ == ncnt ) { printf("====================================================\n"); for ( i = reducedAStartRow; i < reducedAStartRow+nRows-2*nConstraints_; i++ ) { printf("%d : reducedA ROW %d\n", mypid_, i); ierr = HYPRE_ParCSRMatrixGetRow(reducedA_csr,i,&rowSize, &colInd,&colVal); //hypre_qsort1(colInd, colVal, 0, rowSize-1); for ( j = 0; j < rowSize; j++ ) if ( colVal[j] != 0.0 ) printf("%4d %4d %20.13e\n", i+1, colInd[j]+1, colVal[j]); HYPRE_ParCSRMatrixRestoreRow(reducedA_csr,i,&rowSize,&colInd, &colVal); } printf("====================================================\n"); } MPI_Barrier(comm_); ncnt++; } } // ***************************************************************** // form modified right hand side (f1 = f1 - A12*invA22*f2) // ***************************************************************** // ***************************************************************** // form f2hat = invA22 * f2 //------------------------------------------------------------------ HYPRE_IJVectorCreate(comm_, A21StartRow, A21StartRow+A21NRows-1, &f2); HYPRE_IJVectorSetObjectType(f2, HYPRE_PARCSR); if ( HYOutputLevel_ & HYFEI_SLIDEREDUCE1 ) printf("%4d : SlideReduction2 - A21 dims = %d %d %d\n", mypid_, A21StartRow, A21NRows, A21GlobalNRows); ierr += HYPRE_IJVectorInitialize(f2); ierr += HYPRE_IJVectorAssemble(f2); hypre_assert(!ierr); HYPRE_IJVectorCreate(comm_, A21StartRow, A21StartRow+A21NRows-1, &f2hat); HYPRE_IJVectorSetObjectType(f2hat, HYPRE_PARCSR); ierr += HYPRE_IJVectorInitialize(f2hat); ierr += HYPRE_IJVectorAssemble(f2hat); hypre_assert(!ierr); colInd = new int[nSelected*2]; colVal = new double[nSelected*2]; for ( i = 0; i < nSelected; i++ ) { for ( j = 0; j < nSelected; j++ ) { if ( selectedListAux_[j] == i ) { colInd[i] = selectedList_[j]; break; } } if ( colInd[i] < 0 ) { printf("%4d : SlideReduction2 ERROR - out of range %d\n", mypid_, colInd[i]); exit(1); } } for ( i = 0; i < nSelected; i++ ) { colInd[nSelected+i] = EndRow - nConstraints_ + i + 1; } HYPRE_IJVectorGetValues(HYb_, 2*nSelected, colInd, colVal); for ( i = 0; i < nSelected*2; i++ ) colInd[i] = A21StartRow + i; ierr = HYPRE_IJVectorSetValues(f2, 2*nSelected, (const int *) colInd, (const double *) colVal); hypre_assert( !ierr ); HYPRE_IJVectorGetObject(f2, (void **) &f2_csr); HYPRE_IJVectorGetObject(f2hat, (void **) &f2hat_csr); HYPRE_ParCSRMatrixMatvec( 1.0, invA22_csr, f2_csr, 0.0, f2hat_csr ); delete [] colVal; delete [] colInd; HYPRE_IJVectorDestroy(f2); // ***************************************************************** // set up A12 with proper sizes before forming f2til = A12 * f2hat //------------------------------------------------------------------ //------------------------------------------------------------------ // calculate the dimension of A12 //------------------------------------------------------------------ A12NRows = A21NCols; A12NCols = A21NRows; A12GlobalNRows = A21GlobalNCols; A12GlobalNCols = A21GlobalNRows; A12MatSize = new int[A12NRows]; A12StartRow = ProcNRows[mypid_] - ProcNConstr[mypid_]; if ( HYOutputLevel_ & HYFEI_SLIDEREDUCE1 ) { printf("%4d : SlideReduction2 - A12GlobalDim = %d %d\n", mypid_, A12GlobalNRows, A12GlobalNCols); printf("%4d : SlideReduction2 - A12LocalDim = %d %d\n", mypid_, A12NRows, A12NCols); } //------------------------------------------------------------------ // create a matrix context for A12 //------------------------------------------------------------------ ierr = HYPRE_IJMatrixCreate(comm_, A21StartCol, A21StartCol+A12NRows-1, A21StartRow, A21StartRow+A12NCols-1, &A12); ierr += HYPRE_IJMatrixSetObjectType(A12, HYPRE_PARCSR); hypre_assert(!ierr); //------------------------------------------------------------------ // compute the number of nonzeros in each row of A12 // (which consists of the rows in selectedList and the constraints) //------------------------------------------------------------------ rowCount = A12StartRow; rowIndex = 0; nnzA12 = 0; for ( i = StartRow; i <= newEndRow; i++ ) { searchIndex = hypre_BinarySearch(selectedList_, i, nSelected); if ( searchIndex < 0 ) { HYPRE_ParCSRMatrixGetRow(A_csr,i,&rowSize,&colInd,&colVal); newRowSize = 0; for (j = 0; j < rowSize; j++) { if ( colVal[j] != 0.0 ) { colIndex = colInd[j]; for ( procIndex = 0; procIndex < numProcs_; procIndex++ ) if ( ProcNRows[procIndex] > colIndex ) break; if ( procIndex == numProcs_ ) ubound = globalNRows - (globalNConstr-ProcNConstr[numProcs_-1]); else ubound = ProcNRows[procIndex] - (ProcNConstr[procIndex]-ProcNConstr[procIndex-1]); procIndex--; if ( colIndex >= ubound ) newRowSize++; else if (colIndex >= StartRow && colIndex <= EndRow) { if (hypre_BinarySearch(selectedList_,colIndex,nSelected)>=0) newRowSize++; } else { if (hypre_BinarySearch(globalSelectedList,colIndex, globalNSelected) >= 0) newRowSize++; } } } A12MatSize[rowIndex++] = newRowSize; HYPRE_ParCSRMatrixRestoreRow(A_csr,i,&rowSize,&colInd,&colVal); rowCount++; } else { A12MatSize[rowIndex++] = 1; rowCount++; nnzA12--; } } //------------------------------------------------------------------ // after fetching the row sizes, set up A12 with such sizes //------------------------------------------------------------------ for ( i = 0; i < A12NRows; i++ ) nnzA12 += A12MatSize[i]; ierr = HYPRE_IJMatrixSetRowSizes(A12, A12MatSize); ierr += HYPRE_IJMatrixInitialize(A12); hypre_assert(!ierr); delete [] A12MatSize; //------------------------------------------------------------------ // load the A12 matrix //------------------------------------------------------------------ rowCount = A12StartRow; for ( i = StartRow; i <= newEndRow; i++ ) { searchIndex = hypre_BinarySearch(selectedList_, i, nSelected); if ( searchIndex < 0 ) { HYPRE_ParCSRMatrixGetRow(A_csr, i, &rowSize, &colInd, &colVal); newRowSize = 0; newColInd = new int[rowSize]; newColVal = new double[rowSize]; for (j = 0; j < rowSize; j++) { colIndex = colInd[j]; if ( colVal[j] != 0.0 ) { for ( procIndex = 0; procIndex < numProcs_; procIndex++ ) if ( ProcNRows[procIndex] > colIndex ) break; if ( procIndex == numProcs_ ) ubound = globalNRows - (globalNConstr - ProcNConstr[numProcs_-1]); else ubound = ProcNRows[procIndex] - (ProcNConstr[procIndex]-ProcNConstr[procIndex-1]); procIndex--; if ( colIndex >= ubound ) { if ( procIndex != numProcs_ - 1 ) { newColInd[newRowSize] = colInd[j] - ubound + ProcNConstr[procIndex] + ProcNConstr[procIndex+1]; } else { newColInd[newRowSize] = colInd[j] - ubound + ProcNConstr[procIndex] + globalNConstr; } if ( newColInd[newRowSize] < 0 || newColInd[newRowSize] >= A12GlobalNCols ) { if ( HYOutputLevel_ & HYFEI_SLIDEREDUCE1 ) { printf("%4d : SlideReduction WARNING - A12 col index", mypid_); printf(" out of range %d %d(%d)\n", i, newColInd[newRowSize], A12GlobalNCols); } } newColVal[newRowSize++] = colVal[j]; } else { if ( colInd[j] >= StartRow && colInd[j] <= EndRow ) { searchIndex = HYPRE_LSI_Search(selectedList_,colInd[j], nSelected); if ( searchIndex >= 0 ) searchIndex = selectedListAux_[searchIndex] + ProcNConstr[mypid_]; } else { searchIndex = HYPRE_LSI_Search(globalSelectedList, colInd[j], globalNSelected); if ( searchIndex >= 0 ) searchIndex = globalSelectedListAux[searchIndex]; } if ( searchIndex >= 0) { newColInd[newRowSize] = searchIndex + ProcNConstr[procIndex]; if ( newColInd[newRowSize] < 0 || newColInd[newRowSize] >= A12GlobalNCols ) { if ( HYOutputLevel_ & HYFEI_SLIDEREDUCE1 ) { printf("%4d : SlideReduction WARNING - A12 col ", mypid_); printf(" index out of range %d %d(%d)\n",i, newColInd[newRowSize], A12GlobalNCols); } } newColVal[newRowSize++] = colVal[j]; } } } } ierr = HYPRE_IJMatrixSetValues(A12, 1, &newRowSize, (const int *) &rowCount, (const int *) newColInd, (const double *) newColVal); hypre_assert(!ierr); HYPRE_ParCSRMatrixRestoreRow(A_csr,i,&rowSize,&colInd,&colVal); rowCount++; delete [] newColInd; delete [] newColVal; } else { newRowSize = 1; newColInd = new int[newRowSize]; newColVal = new double[newRowSize]; newColInd[0] = A21StartRow; newColVal[0] = 0.0; ierr = HYPRE_IJMatrixSetValues(A12, 1, &newRowSize, (const int *) &rowCount, (const int *) newColInd, (const double *) newColVal); hypre_assert(!ierr); rowCount++; delete [] newColInd; delete [] newColVal; } } //------------------------------------------------------------------ // assemble the A12 matrix //------------------------------------------------------------------ ierr = HYPRE_IJMatrixAssemble(A12); hypre_assert( !ierr ); HYPRE_IJMatrixGetObject(A12, (void **) &A12_csr); if ( HYOutputLevel_ & HYFEI_SLIDEREDUCE3 ) { MPI_Barrier(comm_); ncnt = 0; while ( ncnt < numProcs_ ) { if ( mypid_ == ncnt ) { printf("====================================================\n"); for (i=A12StartRow;i=0) rowNum++; HYPRE_IJVectorSetValues(HYx_, 1, (const int *) &rowNum, (const double *) &ddata); rowNum++; } for ( i = 0; i < nConstraints_; i++ ) { for ( j = 0; j < nConstraints_; j++ ) { if ( selectedListAux_[j] == i ) { index = selectedList_[j]; break; } } j = i + startRow; HYPRE_IJVectorGetValues(x2, 1, &j, &ddata); HYPRE_IJVectorSetValues(HYx_, 1, (const int *) &index, (const double *) &ddata); } for ( i = nConstraints_; i < 2*nConstraints_; i++ ) { j = startRow + i; HYPRE_IJVectorGetValues(x2, 1, &j, &ddata); index = localEndRow_ - 2 * nConstraints_ + i; HYPRE_IJVectorSetValues(HYx_, 1, (const int *) &index, (const double *) &ddata); } //------------------------------------------------------------- // residual norm check //------------------------------------------------------------- HYPRE_IJMatrixGetObject(HYA_, (void **) &A_csr); HYPRE_IJVectorGetObject(HYx_, (void **) &x_csr); HYPRE_IJVectorGetObject(HYb_, (void **) &b_csr); HYPRE_IJVectorGetObject(HYr_, (void **) &r_csr); HYPRE_ParVectorCopy( b_csr, r_csr ); HYPRE_ParCSRMatrixMatvec( -1.0, A_csr, x_csr, 1.0, r_csr ); HYPRE_ParVectorInnerProd( r_csr, r_csr, &rnorm); rnorm = sqrt( rnorm ); if ( mypid_ == 0 && ( HYOutputLevel_ & HYFEI_SLIDEREDUCE1 )) printf("buildSlideReducedSoln::final residual norm = %e\n", rnorm); } currX_ = HYx_; //**************************************************************** // clean up //---------------------------------------------------------------- HYPRE_IJVectorDestroy(R1); HYPRE_IJVectorDestroy(x2); return rnorm; } //***************************************************************************** // Given the matrix (A) within the object, compute the reduced system and put // it in place. Additional information given are : //----------------------------------------------------------------------------- double HYPRE_LinSysCore::buildSlideReducedSoln2() { int i, j, *int_array, *gint_array, x2NRows, x2GlobalNRows; int ierr, rowNum, startRow, startRow2, index, localNRows; int index2; double ddata, rnorm; HYPRE_ParCSRMatrix A_csr, A21_csr, A22_csr; HYPRE_ParVector x_csr, x2_csr, r_csr, b_csr; HYPRE_IJVector R1, x2; if ( HYA21_ == NULL || HYinvA22_ == NULL ) { printf("buildSlideReducedSoln2 WARNING : A21 or A22 absent.\n"); return (0.0); } else { //------------------------------------------------------------------ // compute A21 * sol //------------------------------------------------------------------ x2NRows = 2 * nConstraints_; int_array = new int[numProcs_]; gint_array = new int[numProcs_]; for ( i = 0; i < numProcs_; i++ ) int_array[i] = 0; int_array[mypid_] = x2NRows; MPI_Allreduce(int_array,gint_array,numProcs_,MPI_INT,MPI_SUM,comm_); x2GlobalNRows = 0; for ( i = 0; i < numProcs_; i++ ) x2GlobalNRows += gint_array[i]; rowNum = 0; for ( i = 0; i < mypid_; i++ ) rowNum += gint_array[i]; startRow = rowNum; startRow2 = localStartRow_ - 1 - rowNum/2; delete [] int_array; delete [] gint_array; ierr = HYPRE_IJVectorCreate(comm_, startRow, startRow+x2NRows-1, &R1); ierr = HYPRE_IJVectorSetObjectType(R1, HYPRE_PARCSR); ierr = HYPRE_IJVectorInitialize(R1); ierr = HYPRE_IJVectorAssemble(R1); hypre_assert(!ierr); HYPRE_IJMatrixGetObject(HYA21_, (void **) &A21_csr); HYPRE_IJVectorGetObject(currX_, (void **) &x_csr); HYPRE_IJVectorGetObject(R1, (void **) &r_csr); HYPRE_ParCSRMatrixMatvec( -1.0, A21_csr, x_csr, 0.0, r_csr ); //------------------------------------------------------------------ // f2 - A21 * sol //------------------------------------------------------------------ for ( i = 0; i < nConstraints_; i++ ) { for ( j = 0; j < nConstraints_; j++ ) { if ( selectedListAux_[j] == i ) { index = selectedList_[j]; break; } } HYPRE_IJVectorGetValues(HYb_, 1, &index, &ddata); HYPRE_IJVectorAddToValues(R1, 1, (const int *) &rowNum, (const double *) &ddata); rowNum++; } for ( i = localEndRow_-nConstraints_; i < localEndRow_; i++ ) { HYPRE_IJVectorGetValues(HYb_, 1, &i, &ddata); HYPRE_IJVectorAddToValues(R1, 1, (const int *) &rowNum, (const double *) &ddata); rowNum++; } //------------------------------------------------------------- // inv(A22) * (f2 - A21 * sol) //------------------------------------------------------------- ierr = HYPRE_IJVectorCreate(comm_, startRow, startRow+x2NRows-1, &x2); ierr = HYPRE_IJVectorSetObjectType(x2, HYPRE_PARCSR); ierr = HYPRE_IJVectorInitialize(x2); ierr = HYPRE_IJVectorAssemble(x2); hypre_assert(!ierr); HYPRE_IJMatrixGetObject(HYinvA22_, (void **) &A22_csr ); HYPRE_IJVectorGetObject(R1, (void **) &r_csr ); HYPRE_IJVectorGetObject(x2, (void **) &x2_csr ); HYPRE_ParCSRMatrixMatvec( 1.0, A22_csr, r_csr, 0.0, x2_csr ); //------------------------------------------------------------- // inject final solution to the solution vector //------------------------------------------------------------- localNRows = localEndRow_ - localStartRow_ + 1 - nConstraints_; for ( i = 0; i < localNRows; i++ ) { index = startRow2 + i; HYPRE_IJVectorGetValues(reducedX_, 1, &index, &ddata); index2 = localStartRow_ - 1 + i; HYPRE_IJVectorSetValues(HYx_, 1, (const int *) &index2, (const double *) &ddata); } for ( i = 0; i < nConstraints_; i++ ) { for ( j = 0; j < nConstraints_; j++ ) { if ( selectedListAux_[j] == i ) { index = selectedList_[j]; break; } } j = i + startRow; HYPRE_IJVectorGetValues(x2, 1, &j, &ddata); HYPRE_IJVectorSetValues(HYx_, 1, (const int *) &index, (const double *) &ddata); } for ( i = nConstraints_; i < 2*nConstraints_; i++ ) { j = startRow + i; HYPRE_IJVectorGetValues(x2, 1, &j, &ddata); index = localEndRow_ - 2 * nConstraints_ + i; HYPRE_IJVectorSetValues(HYx_, 1, (const int *) &index, (const double *) &ddata); } //------------------------------------------------------------- // residual norm check //------------------------------------------------------------- HYPRE_IJMatrixGetObject(HYA_, (void **) &A_csr); HYPRE_IJVectorGetObject(HYx_, (void **) &x_csr); HYPRE_IJVectorGetObject(HYb_, (void **) &b_csr); HYPRE_IJVectorGetObject(HYr_, (void **) &r_csr); HYPRE_ParVectorCopy( b_csr, r_csr ); HYPRE_ParCSRMatrixMatvec( -1.0, A_csr, x_csr, 1.0, r_csr ); HYPRE_ParVectorInnerProd( r_csr, r_csr, &rnorm); rnorm = sqrt( rnorm ); if ( mypid_ == 0 && ( HYOutputLevel_ & HYFEI_SLIDEREDUCE1 )) printf("buildSlideReducedSoln::final residual norm = %e\n", rnorm); } currX_ = HYx_; //**************************************************************** // clean up //---------------------------------------------------------------- HYPRE_IJVectorDestroy(R1); HYPRE_IJVectorDestroy(x2); return rnorm; } hypre-2.33.0/src/FEI_mv/fei-hypre/lsicg.c000066400000000000000000000261001477326011500177640ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * LSICG * *****************************************************************************/ #include "utilities/_hypre_utilities.h" #include "HYPRE.h" #include "parcsr_ls/_hypre_parcsr_ls.h" #include "parcsr_mv/_hypre_parcsr_mv.h" #include "seq_mv/seq_mv.h" /*-------------------------------------------------------------------------- * hypre_LSICGData *--------------------------------------------------------------------------*/ typedef struct { int max_iter; int stop_crit; double tol; double rel_residual_norm; void *A; void *r; void *ap; void *p; void *z; void *matvec_data; int (*precond)(void*, void*, void*, void*); int (*precond_setup)(void*, void*, void*, void*); void *precond_data; int num_iterations; int logging; } hypre_LSICGData; /*-------------------------------------------------------------------------- * hypre_LSICGCreate *--------------------------------------------------------------------------*/ void *hypre_LSICGCreate( ) { hypre_LSICGData *lsicg_data; lsicg_data = hypre_CTAlloc(hypre_LSICGData, 1, HYPRE_MEMORY_HOST); /* set defaults */ (lsicg_data -> tol) = 1.0e-06; (lsicg_data -> max_iter) = 1000; (lsicg_data -> stop_crit) = 0; /* rel. residual norm */ (lsicg_data -> precond) = hypre_ParKrylovIdentity; (lsicg_data -> precond_setup) = hypre_ParKrylovIdentitySetup; (lsicg_data -> precond_data) = NULL; (lsicg_data -> logging) = 0; (lsicg_data -> r) = NULL; (lsicg_data -> p) = NULL; (lsicg_data -> ap) = NULL; (lsicg_data -> z) = NULL; (lsicg_data -> matvec_data) = NULL; return (void *) lsicg_data; } /*-------------------------------------------------------------------------- * hypre_LSICGDestroy *--------------------------------------------------------------------------*/ int hypre_LSICGDestroy( void *lsicg_vdata ) { hypre_LSICGData *lsicg_data = (hypre_LSICGData *) lsicg_vdata; int ierr = 0; if (lsicg_data) { hypre_ParKrylovMatvecDestroy(lsicg_data -> matvec_data); hypre_ParKrylovDestroyVector(lsicg_data -> r); hypre_ParKrylovDestroyVector(lsicg_data -> p); hypre_ParKrylovDestroyVector(lsicg_data -> ap); hypre_ParKrylovDestroyVector(lsicg_data -> z); hypre_TFree(lsicg_data, HYPRE_MEMORY_HOST); } return(ierr); } /*-------------------------------------------------------------------------- * hypre_LSICGSetup *--------------------------------------------------------------------------*/ int hypre_LSICGSetup( void *lsicg_vdata, void *A, void *b, void *x ) { hypre_LSICGData *lsicg_data = (hypre_LSICGData *) lsicg_vdata; int (*precond_setup)(void*, void*, void*, void*) = (lsicg_data -> precond_setup); void *precond_data = (lsicg_data -> precond_data); int ierr = 0; (lsicg_data -> A) = A; /*-------------------------------------------------- * The arguments for NewVector are important to * maintain consistency between the setup and * compute phases of matvec and the preconditioner. *--------------------------------------------------*/ if ((lsicg_data -> r) == NULL) (lsicg_data -> r) = hypre_ParKrylovCreateVector(b); if ((lsicg_data -> p) == NULL) (lsicg_data -> p) = hypre_ParKrylovCreateVector(b); if ((lsicg_data -> z) == NULL) (lsicg_data -> z) = hypre_ParKrylovCreateVector(b); if ((lsicg_data -> ap) == NULL) (lsicg_data -> ap) = hypre_ParKrylovCreateVector(b); if ((lsicg_data -> matvec_data) == NULL) (lsicg_data -> matvec_data) = hypre_ParKrylovMatvecCreate(A, x); ierr = precond_setup(precond_data, A, b, x); return ierr; } /*-------------------------------------------------------------------------- * hypre_LSICGSolve *-------------------------------------------------------------------------*/ int hypre_LSICGSolve(void *lsicg_vdata, void *A, void *b, void *x) { int ierr=0, mypid, nprocs, iter, converged=0; double rhom1, rho, r_norm, b_norm, epsilon; double sigma, alpha, beta, dArray[2], dArray2[2]; hypre_Vector *r_local, *z_local; MPI_Comm comm; hypre_LSICGData *lsicg_data = (hypre_LSICGData *) lsicg_vdata; int max_iter = (lsicg_data -> max_iter); int stop_crit = (lsicg_data -> stop_crit); double accuracy = (lsicg_data -> tol); void *matvec_data = (lsicg_data -> matvec_data); void *r = (lsicg_data -> r); void *p = (lsicg_data -> p); void *z = (lsicg_data -> z); void *ap = (lsicg_data -> ap); int (*precond)(void*, void*, void*, void*) = (lsicg_data -> precond); int *precond_data = (int*)(lsicg_data -> precond_data); int logging = (lsicg_data -> logging); /* compute initial residual */ r_local = hypre_ParVectorLocalVector((hypre_ParVector *) r); z_local = hypre_ParVectorLocalVector((hypre_ParVector *) z); comm = hypre_ParCSRMatrixComm((hypre_ParCSRMatrix *) A); hypre_ParKrylovCommInfo(A,&mypid,&nprocs); hypre_ParKrylovCopyVector(b,r); hypre_ParKrylovMatvec(matvec_data,-1.0, A, x, 1.0, r); r_norm = sqrt(hypre_ParKrylovInnerProd(r,r)); b_norm = sqrt(hypre_ParKrylovInnerProd(b,b)); if (logging > 0) { if (mypid == 0) { printf("LSICG : L2 norm of b = %e\n", b_norm); if (b_norm == 0.0) printf("Rel_resid_norm actually contains the residual norm\n"); printf("LSICG : Initial L2 norm of residual = %e\n", r_norm); } } /* set convergence criterion */ if (b_norm > 0.0) epsilon = accuracy * b_norm; else epsilon = accuracy * r_norm; if ( stop_crit ) epsilon = accuracy; iter = 0; hypre_ParKrylovClearVector(p); while ( converged == 0 ) { while ( r_norm > epsilon && iter < max_iter ) { iter++; if ( iter == 1 ) { precond(precond_data, A, r, z); rhom1 = rho; rho = hypre_ParKrylovInnerProd(r,z); beta = 0.0; } else beta = rho / rhom1; hypre_ParKrylovScaleVector( beta, p ); hypre_ParKrylovAxpy(1.0e0, z, p); hypre_ParKrylovMatvec(matvec_data,1.0e0,A,p,0.0,ap); sigma = hypre_ParKrylovInnerProd(p,ap); alpha = rho / sigma; if ( sigma == 0.0 ) { printf("HYPRE::LSICG ERROR - sigma = 0.0.\n"); ierr = 2; return ierr; } hypre_ParKrylovAxpy(alpha, p, x); hypre_ParKrylovAxpy(-alpha, ap, r); dArray[0] = hypre_SeqVectorInnerProd( r_local, r_local ); precond(precond_data, A, r, z); rhom1 = rho; dArray[1] = hypre_SeqVectorInnerProd( r_local, z_local ); MPI_Allreduce(dArray, dArray2, 2, MPI_DOUBLE, MPI_SUM, comm); rho = dArray2[1]; r_norm = sqrt( dArray2[0] ); if ( iter % 1 == 0 && mypid == 0 ) printf("LSICG : iteration %d - residual norm = %e (%e)\n", iter, r_norm, epsilon); } hypre_ParKrylovCopyVector(b,r); hypre_ParKrylovMatvec(matvec_data,-1.0, A, x, 1.0, r); r_norm = sqrt(hypre_ParKrylovInnerProd(r,r)); if ( logging >= 1 && mypid == 0 ) printf("LSICG actual residual norm = %e \n",r_norm); if ( r_norm < epsilon || iter >= max_iter ) converged = 1; } if ( iter >= max_iter ) ierr = 1; lsicg_data->rel_residual_norm = r_norm; lsicg_data->num_iterations = iter; if ( logging >= 1 && mypid == 0 ) printf("LSICG : total number of iterations = %d \n",iter); return ierr; } /*-------------------------------------------------------------------------- * hypre_LSICGSetTol *--------------------------------------------------------------------------*/ int hypre_LSICGSetTol( void *lsicg_vdata, double tol ) { hypre_LSICGData *lsicg_data = (hypre_LSICGData *) lsicg_vdata; (lsicg_data -> tol) = tol; return 0; } /*-------------------------------------------------------------------------- * hypre_LSICGSetMaxIter *--------------------------------------------------------------------------*/ int hypre_LSICGSetMaxIter( void *lsicg_vdata, int max_iter ) { hypre_LSICGData *lsicg_data = (hypre_LSICGData *) lsicg_vdata; (lsicg_data -> max_iter) = max_iter; return 0; } /*-------------------------------------------------------------------------- * hypre_LSICGSetStopCrit *--------------------------------------------------------------------------*/ int hypre_LSICGSetStopCrit( void *lsicg_vdata, double stop_crit ) { hypre_LSICGData *lsicg_data = (hypre_LSICGData *) lsicg_vdata; (lsicg_data -> stop_crit) = stop_crit; return 0; } /*-------------------------------------------------------------------------- * hypre_LSICGSetPrecond *--------------------------------------------------------------------------*/ int hypre_LSICGSetPrecond( void *lsicg_vdata, int (*precond)(void*,void*,void*,void*), int (*precond_setup)(void*,void*,void*,void*), void *precond_data ) { hypre_LSICGData *lsicg_data = (hypre_LSICGData *) lsicg_vdata; (lsicg_data -> precond) = precond; (lsicg_data -> precond_setup) = precond_setup; (lsicg_data -> precond_data) = precond_data; return 0; } /*-------------------------------------------------------------------------- * hypre_LSICGSetLogging *--------------------------------------------------------------------------*/ int hypre_LSICGSetLogging( void *lsicg_vdata, int logging) { hypre_LSICGData *lsicg_data = (hypre_LSICGData *) lsicg_vdata; (lsicg_data -> logging) = logging; return 0; } /*-------------------------------------------------------------------------- * hypre_LSICGGetNumIterations *--------------------------------------------------------------------------*/ int hypre_LSICGGetNumIterations(void *lsicg_vdata,int *num_iterations) { hypre_LSICGData *lsicg_data = (hypre_LSICGData *) lsicg_vdata; *num_iterations = (lsicg_data -> num_iterations); return 0; } /*-------------------------------------------------------------------------- * hypre_LSICGGetFinalRelativeResidualNorm *--------------------------------------------------------------------------*/ int hypre_LSICGGetFinalRelativeResidualNorm(void *lsicg_vdata, double *relative_residual_norm) { hypre_LSICGData *lsicg_data = (hypre_LSICGData *) lsicg_vdata; *relative_residual_norm = (lsicg_data -> rel_residual_norm); return 0; } hypre-2.33.0/src/FEI_mv/fei-hypre/ml_maxwell.cxx000066400000000000000000000232241477326011500214100ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ // ************************************************************************* // test program for HYPRE_LinSysCore // ************************************************************************* //*************************************************************************** // system includes //--------------------------------------------------------------------------- #include #include #include //************************************************************************** // HYPRE includes //--------------------------------------------------------------------------- #include "HYPRE.h" #include "utilities/_hypre_utilities.h" #include "IJ_mv/HYPRE_IJ_mv.h" #include "parcsr_mv/HYPRE_parcsr_mv.h" #include "parcsr_ls/HYPRE_parcsr_ls.h" #include "HYPRE_LinSysCore.h" #define HABS(x) ((x) > 0 ? (x) : -(x)) //************************************************************************** // local defines and local and external functions //--------------------------------------------------------------------------- void fei_hypre_test(int, char **); void hypre_read_matrix(double **val, int **ia, int **ja, int *N, int *M, char *matfile); void hypre_read_rhs(double **val, int *N, char *rhsfile); //*************************************************************************** // main program //*************************************************************************** int main(int argc, char *argv[]) { fei_hypre_test(argc, argv); } //*************************************************************************** // a test program //*************************************************************************** void fei_hypre_test(int argc, char *argv[]) { int i, j, k, my_rank, num_procs, nrows, status; int *ia, *ja, ncnt, index, ncols, iterations; int *rowLengths, **colIndices; double *val, *rhs, *sol; char tname[20], *paramString = new char[100]; HYPRE_ParCSRMatrix G_csr; Data data; //------------------------------------------------------------------ // initialize parallel platform //------------------------------------------------------------------ MPI_Init(&argc, &argv); MPI_Comm_rank(MPI_COMM_WORLD, &my_rank); MPI_Comm_size(MPI_COMM_WORLD, &num_procs); HYPRE_LinSysCore H(MPI_COMM_WORLD); //------------------------------------------------------------------ // read edge matrix //------------------------------------------------------------------ hypre_read_matrix(&val,&ia,&ja,&nrows,&ncols,"Edge.ij"); H.createMatricesAndVectors(nrows, 1, nrows); rowLengths = new int[nrows]; colIndices = new int*[nrows]; for (i = 0; i < nrows; i++) { ncnt = ia[i+1] - ia[i]; rowLengths[i] = ncnt; colIndices[i] = new int[ncnt]; k = 0; for (j = ia[i]; j < ia[i+1]; j++) colIndices[i][k++] = ja[j] + 1; } H.allocateMatrix(colIndices, rowLengths); delete [] rowLengths; for (i = 0; i < nrows; i++) { ncnt = ia[i+1] - ia[i]; index = i + 1; H.sumIntoSystemMatrix(index, ncnt, &val[ia[i]], colIndices[i]); } H.matrixLoadComplete(); for (i = 0; i < nrows; i++ ) delete [] colIndices[i]; delete [] colIndices; delete [] ia; delete [] ja; delete [] val; //------------------------------------------------------------------ // read gradient matrix //------------------------------------------------------------------ HYPRE_LinSysCore G(MPI_COMM_WORLD); hypre_read_matrix(&val, &ia, &ja, &nrows, &ncols, "Grad.ij"); if (nrows != ncols) G.HYPRE_LSC_SetColMap(0, ncols-1); G.createMatricesAndVectors(nrows, 1, nrows); rowLengths = new int[nrows]; colIndices = new int*[nrows]; for (i = 0; i < nrows; i++) { ncnt = ia[i+1] - ia[i]; rowLengths[i] = ncnt; colIndices[i] = new int[ncnt]; k = 0; for (j = ia[i]; j < ia[i+1]; j++) colIndices[i][k++] = ja[j] + 1; } G.allocateMatrix(colIndices, rowLengths); delete [] rowLengths; for (i = 0; i < nrows; i++) { ncnt = ia[i+1] - ia[i]; index = i + 1; G.sumIntoSystemMatrix(index, ncnt, &val[ia[i]], colIndices[i]); } G.matrixLoadComplete(); for (i = 0; i < nrows; i++ ) delete [] colIndices[i]; delete [] colIndices; delete [] ia; delete [] ja; delete [] val; HYPRE_IJMatrixGetObject(G.HYA_, (void**) &G_csr); data.setDataPtr((void *) G_csr); strcpy(tname, "GEN"); data.setTypeName(tname); H.copyInMatrix(1.0, data); G.HYA_ = NULL; //------------------------------------------------------------------ // load the right hand side //------------------------------------------------------------------ hypre_read_rhs(&rhs, &i, "rhs.ij"); if (i < 0) { rhs = new double[nrows]; for (i = 0; i < nrows; i++) rhs[i] = 1.0; } for (i = 0; i < nrows; i++) { H.sumIntoRHSVector(1, &rhs[i], &i); } delete [] rhs; //------------------------------------------------------------------ // set other parameters //------------------------------------------------------------------ strcpy(paramString, "solver gmres"); H.parameters(1, ¶mString); strcpy(paramString, "gmresDim 300"); H.parameters(1, ¶mString); strcpy(paramString, "relativeNorm"); H.parameters(1, ¶mString); strcpy(paramString, "tolerance 1.0e-12"); H.parameters(1, ¶mString); strcpy(paramString, "preconditioner boomeramg"); strcpy(paramString, "preconditioner mlmaxwell"); H.parameters(1, ¶mString); strcpy(paramString, "mlStrongThreshold 0.08"); H.parameters(1, ¶mString); //------------------------------------------------------------------ // solve the system //------------------------------------------------------------------ strcpy(paramString, "outputLevel 3"); H.parameters(1, ¶mString); H.launchSolver(status, iterations); sol = new double[nrows]; H.getSolution(sol, nrows); for (i = 0; i < 10; i++) printf("Solution %6d = %16.8e\n", i, sol[i]); delete [] sol; //------------------------------------------------------------------ // clean up //------------------------------------------------------------------ MPI_Finalize(); } #if 0 HYPRE_IJVectorGetObject(H.HYx_, (void**) &x_csr); HYPRE_IJVectorGetObject(H.HYb_, (void**) &b_csr); HYPRE_IJMatrixGetObject(H.HYA_, (void**) &A_csr); #endif //*************************************************************************** // read a matrix //*************************************************************************** void hypre_read_matrix(double **val, int **ia, int **ja, int *N, int *M, char *matfile) { int i, nrows, ncols, nnz, icount, rowindex, colindex, curr_row; int *mat_ia, *mat_ja; double *mat_a, value; FILE *fp; /*------------------------------------------------------------------*/ /* read matrix file */ /*------------------------------------------------------------------*/ printf("Reading matrix file = %s \n", matfile); fp = fopen(matfile, "r"); if (fp == NULL) { printf("File not found = %s \n", matfile); exit(1); } fscanf(fp, "%d %d %d", &nnz, &nrows, &ncols); mat_ia = new int[nrows+1]; mat_ja = new int[nnz]; mat_a = new double[nnz]; mat_ia[0] = 0; curr_row = 0; icount = 0; for (i = 0; i < nnz; i++) { fscanf(fp, "%d %d %lg", &rowindex, &colindex, &value); if (rowindex != curr_row) mat_ia[++curr_row] = icount; if (rowindex < 0 || rowindex >= nrows) printf("Error reading row %d (curr_row = %d)\n",rowindex,curr_row); if (colindex < 0 || colindex >= ncols) printf("Error reading col %d (rowindex = %d)\n",colindex,rowindex); if (HABS(value) > 1.0e-12) { mat_ja[icount] = colindex; mat_a[icount++] = value; } } fclose(fp); for (i = curr_row+1; i <= nrows; i++) mat_ia[i] = icount; (*val) = mat_a; (*ia) = mat_ia; (*ja) = mat_ja; (*N) = nrows; (*M) = ncols; printf("matrix has %6d rows and %7d nonzeros\n",nrows,mat_ia[nrows]); return; } //*************************************************************************** // read a right hand side //*************************************************************************** void hypre_read_rhs(double **val, int *N, char *rhsfile) { int i, nrows, rowindex; double *rhs, value; FILE *fp; /*------------------------------------------------------------------*/ /* read matrix file */ /*------------------------------------------------------------------*/ printf("Reading rhs file = %s \n", rhsfile); fp = fopen(rhsfile, "r"); if (fp == NULL) { printf("File not found = %s \n", rhsfile); (*N) = -1; return; } fscanf(fp, "%d", &nrows); rhs = new double[nrows]; for (i = 0; i < nrows; i++) { fscanf(fp, "%d %lg", &rowindex, &value); if (rowindex < 0 || rowindex >= nrows) printf("Error reading row %d (curr_row = %d)\n",rowindex,i); rhs[i] = value; } fclose(fp); (*N) = nrows; (*val) = rhs; return; } hypre-2.33.0/src/FEI_mv/femli/000077500000000000000000000000001477326011500157245ustar00rootroot00000000000000hypre-2.33.0/src/FEI_mv/femli/CMakeLists.txt000066400000000000000000000021411477326011500204620ustar00rootroot00000000000000# Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) set(HYPRE_mli_SRCS mli_utils.c mli_amgsa_calib.cxx mli_amgsa_coarsen1.cxx mli_amgsa_dd_fedata.cxx mli_amgsa_dd_sfei.cxx mli_method.cxx mli_method_amgcr.cxx mli_method_amgrs.cxx mli_method_amgsa.cxx mli.cxx mli_oneLevel.cxx cmli.cxx mli_febase.cxx mli_fedata.cxx mli_fedata_utils.cxx mli_sfei.cxx mli_mapper.cxx mli_matrix.cxx mli_matrix_mult.cxx mli_matrix_utils.cxx mli_solver.cxx mli_solver_jacobi.cxx mli_solver_bjacobi.cxx mli_solver_gs.cxx mli_solver_sgs.cxx mli_solver_bsgs.cxx mli_solver_hsgs.cxx mli_solver_hschwarz.cxx mli_solver_parasails.cxx mli_solver_mls.cxx mli_solver_mli.cxx mli_solver_amg.cxx mli_solver_chebyshev.cxx mli_solver_cg.cxx mli_solver_gmres.cxx mli_solver_kaczmarz.cxx mli_solver_superlu.cxx mli_solver_seqsuperlu.cxx mli_solver_arpacksuperlu.cxx mli_vector.cxx ) add_library(HYPRE_mli OBJECT ${HYPRE_mli_SRCS}) hypre-2.33.0/src/FEI_mv/femli/Makefile000066400000000000000000000066001477326011500173660ustar00rootroot00000000000000# Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) include ../../config/Makefile.config CINCLUDES = ${INCLUDES} ${MPIINCLUDE} MLI_INCLUDES = \ -I.\ -I../..\ -I$(srcdir)\ -I$(srcdir)/../../blas\ -I$(srcdir)/../../lapack\ -I$(srcdir)/../../utilities\ -I$(srcdir)/../../IJ_mv\ -I$(srcdir)/../../krylov\ -I$(srcdir)/../../multivector\ -I$(srcdir)/../../parcsr_mv\ -I$(srcdir)/../../parcsr_ls\ -I$(srcdir)/../../seq_mv\ -I$(srcdir)/../../seq_block_mv\ -I$(srcdir)/../../distributed_matrix\ -I$(srcdir)/../../distributed_ls\ -I$(srcdir)/../../FEI_mv/fei-hypre\ -I$(srcdir)/../../FEI_mv/femli\ ${SUPERLU_INCLUDE} # ${DSUPERLU_INCLUDE} C_COMPILE_FLAGS =\ -DMLI_SUPERLU\ ${MLI_INCLUDES}\ ${CINCLUDES} CXX_COMPILE_FLAGS =\ -DMLI_SUPERLU -DMPICH_SKIP_MPICXX\ ${MLI_INCLUDES}\ ${CINCLUDES} HEADERS =\ mli_method.h\ mli_method_amgcr.h\ mli_method_amgrs.h\ mli_method_amgsa.h\ mli.h\ mli_defs.h\ mli_oneLevel.h\ cmli.h\ mli_febase.h\ mli_fedata.h\ mli_sfei.h\ mli_fedata_utils.h\ mli_mapper.h\ mli_matrix.h\ mli_matrix_misc.h\ mli_solver.h\ mli_solver_jacobi.h\ mli_solver_bjacobi.h\ mli_solver_gs.h\ mli_solver_sgs.h\ mli_solver_bsgs.h\ mli_solver_hsgs.h\ mli_solver_hschwarz.h\ mli_solver_parasails.h\ mli_solver_mls.h\ mli_solver_mli.h\ mli_solver_amg.h\ mli_solver_chebyshev.h\ mli_solver_cg.h\ mli_solver_gmres.h\ mli_solver_kaczmarz.h\ mli_solver_superlu.h\ mli_solver_seqsuperlu.h\ mli_solver_arpacksuperlu.h\ mli_utils.h\ mli_vector.h FILES =\ mli_utils.c\ mli_amgsa_calib.cxx\ mli_amgsa_coarsen1.cxx\ mli_amgsa_dd_fedata.cxx\ mli_amgsa_dd_sfei.cxx\ mli_method.cxx\ mli_method_amgcr.cxx\ mli_method_amgrs.cxx\ mli_method_amgsa.cxx\ mli.cxx\ mli_oneLevel.cxx\ cmli.cxx\ mli_febase.cxx\ mli_fedata.cxx\ mli_fedata_utils.cxx\ mli_sfei.cxx\ mli_mapper.cxx\ mli_matrix.cxx\ mli_matrix_mult.cxx\ mli_matrix_utils.cxx\ mli_solver.cxx\ mli_solver_jacobi.cxx\ mli_solver_bjacobi.cxx\ mli_solver_gs.cxx\ mli_solver_sgs.cxx\ mli_solver_bsgs.cxx\ mli_solver_hsgs.cxx\ mli_solver_hschwarz.cxx\ mli_solver_parasails.cxx\ mli_solver_mls.cxx\ mli_solver_mli.cxx\ mli_solver_amg.cxx\ mli_solver_chebyshev.cxx\ mli_solver_cg.cxx\ mli_solver_gmres.cxx\ mli_solver_kaczmarz.cxx\ mli_solver_superlu.cxx\ mli_solver_seqsuperlu.cxx\ mli_solver_arpacksuperlu.cxx\ mli_vector.cxx OBJSC = ${FILES:.c=.o} OBJSCXX = ${OBJSC:.cxx=.o} OBJS = ${OBJSCXX:.f=.o} SONAME = libHYPRE_mli-${HYPRE_RELEASE_VERSION}${HYPRE_LIB_SUFFIX} ################################################################## # Targets ################################################################## all: libHYPRE_mli${HYPRE_LIB_SUFFIX} # cp -fR libHYPRE* $(HYPRE_BUILD_DIR)/lib install: libHYPRE_mli${HYPRE_LIB_SUFFIX} # cp -fR libHYPRE* $(HYPRE_LIB_INSTALL) @echo " " clean: rm -f *.o libHYPRE* rm -rf pchdir tca.map *inslog* distclean: clean ################################################################## # Rules ################################################################## libHYPRE_mli.a: ${OBJS} @echo "Building $@ ... " ${AR} $@ ${OBJS} ${RANLIB} $@ libHYPRE_mli.so libHYPRE_mli.dylib: ${OBJS} @echo "Building $@ ... " ${BUILD_CC_SHARED} -o ${SONAME} ${OBJS} ${SHARED_SET_SONAME}${SONAME} ln -s -f ${SONAME} $@ ${OBJS}: ${HEADERS} hypre-2.33.0/src/FEI_mv/femli/Usage_amgs000066400000000000000000000036211477326011500177240ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ To create the smoothed aggregation or Ruge Stuben AMG methods, 1. instantiate the method (create smoothed aggregation AMG context) method = MLI_Method_CreateFromName( methodName, comm ); where name = "AMGSA", "AMGRS", .. comm = a MPI communicator or method = MLI_Method_CreateFromID( methodID, comm ); 2. set the desired AMG parameters method->setParams( param_string, argc, argv ); param_string is one of : ( - integer, - floating point ) setOutputLevel setNumLevels setCoarsenScheme setMinCoarseSize setStrengthThreshold setCalcSpectralNorm setCalibrationSize setPreSmoother setPostSmoother argc = 2 argv[0] = nsweeps argv[1] = weights setCoarseSolver argc = 2 (0 for SuperLU) argv[0] = nsweeps argv[1] = weights setNullSpace argc = 4; argv[0] = node degree of freedom\n"; argv[1] = number of null space vectors\n"; argv[2] = null space information\n"; argv[3] = vector length\n"; setNodalCoord argc = 3 (or 4 if matrix has been scaled); argv[0] = number of nodes argv[1] = node degree of freedom argv[2] = coordinates argv[3] = scalings print 3. set up the grid hierarchy method->setup(mli); 4. to solve, call mli->solve hypre-2.33.0/src/FEI_mv/femli/Usage_solver000066400000000000000000000015531477326011500203110ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ To create a smoother/solver, 1. instantiate the solver agent solver = new MLI_SolverCreateFromName( name ); where solver_id (solver_name) is one of : Jacobi BJacobi GS SGS BSGS ParaSails MLS CG Chebyshev SuperLU SeqSuperLU 2. call setParams to set specific parameters solver->setParams( param_string, argc, argv ); 3. call setup solver->setup(MLI_Matrix *mat); 4. call solve solver->solve(MLI_Vector *, MLI_Vector *); hypre-2.33.0/src/FEI_mv/femli/cmli.cxx000066400000000000000000000616241477326011500174050ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * C wrapper functions * *****************************************************************************/ #include #include #include "cmli.h" #include "mli.h" #include "mli_vector.h" #include "mli_matrix.h" #include "mli_solver.h" #include "mli_method.h" #include "mli_fedata.h" #include "mli_fedata_utils.h" #include "mli_mapper.h" /***************************************************************************** * CMLI : constructor *---------------------------------------------------------------------------*/ extern "C" CMLI *MLI_Create( MPI_Comm comm ) { MLI *mli = new MLI( comm ); CMLI *cmli = hypre_CTAlloc(CMLI, 1, HYPRE_MEMORY_HOST); cmli->mli_ = mli; return cmli; } /***************************************************************************** * CMLI : destructor *---------------------------------------------------------------------------*/ extern "C" int MLI_Destroy( CMLI *cmli ) { int err=0; MLI *mli; if ( cmli == NULL ) err = 1; else { mli = (MLI *) cmli->mli_; if ( mli == NULL ) err = 1; else delete mli; free( cmli ); } return err; } /***************************************************************************** * CMLI : set convergence tolerance *---------------------------------------------------------------------------*/ extern "C" int MLI_SetTolerance( CMLI *cmli, double tolerance ) { int err=0; MLI *mli; if ( cmli == NULL ) err = 0; else { mli = (MLI *) cmli->mli_; if ( mli == NULL ) err = 1; else mli->setTolerance( tolerance ); } if ( err ) printf("MLI_SetTolerance ERROR !!\n"); return err; } /***************************************************************************** * CMLI : set maximum number of iterations *---------------------------------------------------------------------------*/ extern "C" int MLI_SetMaxIterations( CMLI *cmli, int iterations ) { int err=0; MLI *mli; if ( cmli == NULL ) err = 1; else { mli = (MLI *) cmli->mli_; if ( mli == NULL ) err = 1; else mli->setMaxIterations( iterations ); } if ( err ) printf("MLI_SetMaxIterations ERROR !!\n"); return err; } /***************************************************************************** * CMLI : set number of levels *---------------------------------------------------------------------------*/ extern "C" int MLI_SetNumLevels( CMLI *cmli, int num_levels ) { int err=0; MLI *mli; if ( cmli == NULL ) err = 1; else { mli = (MLI *) cmli->mli_; if ( mli == NULL ) err = 1; else mli->setNumLevels( num_levels ); } if ( err ) printf("MLI_SetNumLevels ERROR !!\n"); return err; } /***************************************************************************** * CMLI : set number of cycles for a given level *---------------------------------------------------------------------------*/ extern "C" int MLI_SetCyclesAtLevel( CMLI *cmli, int level, int cycles ) { int err=0; MLI *mli; if ( cmli == NULL ) err = 1; else { mli = (MLI *) cmli->mli_; if ( mli == NULL ) err = 1; else mli->setCyclesAtLevel( level, cycles ); } if ( err ) printf("MLI_SetCyclesAtLevel ERROR !!\n"); return err; } /***************************************************************************** * CMLI : set system matrix *---------------------------------------------------------------------------*/ extern "C" int MLI_SetSystemMatrix( CMLI *cmli, int level, CMLI_Matrix *CAmat ) { int err=0; MLI *mli; MLI_Matrix *matrix; if ( cmli == NULL || CAmat == NULL ) err = 1; else { mli = (MLI *) cmli->mli_; matrix = (MLI_Matrix *) CAmat->matrix_; if ( mli == NULL || CAmat == NULL ) err = 1; else mli->setSystemMatrix(level, matrix); CAmat->owner_ = 0; } if ( err ) printf("MLI_SetSystemMatrix ERROR !!!\n"); return err; } /***************************************************************************** * CMLI : set restriction matrix *---------------------------------------------------------------------------*/ extern "C" int MLI_SetRestriction( CMLI *cmli, int level, CMLI_Matrix *CRmat ) { int err=0; MLI *mli; MLI_Matrix *matrix; if ( cmli == NULL || CRmat == NULL ) err = 1; else { mli = (MLI *) cmli->mli_; matrix = (MLI_Matrix *) CRmat->matrix_; if ( mli == NULL || CRmat == NULL ) err = 1; else mli->setRestriction(level, matrix); CRmat->owner_ = 0; } if ( err ) printf("MLI_SetRestriction ERROR !!\n"); return err; } /***************************************************************************** * CMLI : set prolongation *---------------------------------------------------------------------------*/ extern "C" int MLI_SetProlongation( CMLI *cmli, int level, CMLI_Matrix *CPmat ) { int err=0; MLI *mli; MLI_Matrix *matrix; if ( cmli == NULL || CPmat == NULL ) err = 1; else { mli = (MLI *) cmli->mli_; matrix = (MLI_Matrix *) CPmat->matrix_; if ( mli == NULL || CPmat == NULL ) err = 1; else mli->setProlongation(level, matrix); CPmat->owner_ = 0; } if ( err ) printf("MLI_SetProlongation ERROR !!\n"); return err; } /***************************************************************************** * CMLI : set finite element information object *---------------------------------------------------------------------------*/ extern "C" int MLI_SetFEData( CMLI *cmli, int level, CMLI_FEData *cfedata, CMLI_Mapper *cmapper ) { int err=0; MLI *mli; MLI_FEData *fedata; MLI_Mapper *mapper; if ( cmli == NULL || cfedata == NULL ) err = 1; else { mli = (MLI *) cmli->mli_; fedata = (MLI_FEData *) cfedata->fedata_; mapper = (MLI_Mapper *) cmapper->mapper_; if (mli == NULL || fedata == NULL) err = 1; else mli->setFEData(level,fedata,mapper); cfedata->owner_ = 0; } if ( err ) printf("MLI_SetFEData ERROR !!\n"); return err; } /***************************************************************************** * CMLI : set smoother *---------------------------------------------------------------------------*/ extern "C" int MLI_SetSmoother( CMLI *cmli, int level, int pre_post, CMLI_Solver *csolver ) { int err=0; MLI *mli; MLI_Solver *solver; if ( cmli == NULL || csolver == NULL ) err = 1; else { mli = (MLI *) cmli->mli_; solver = (MLI_Solver *) csolver->solver_; if (mli == NULL || solver == NULL) err = 1; else mli->setSmoother(level,pre_post,solver); csolver->owner_ = 0; } if ( err ) printf("MLI_SetSmoother ERROR !!\n"); return err; } /***************************************************************************** * CMLI : set coarse solver *---------------------------------------------------------------------------*/ extern "C" int MLI_SetCoarseSolve( CMLI *cmli, CMLI_Solver *csolver ) { int err=0; MLI *mli; MLI_Solver *solver; if ( cmli == NULL || csolver == NULL ) err = 1; else { mli = (MLI *) cmli->mli_; solver = (MLI_Solver *) csolver->solver_; if ( mli == NULL || solver == NULL ) err = 1; else mli->setCoarseSolve( solver ); csolver->owner_ = 0; } if ( err ) printf("MLI_SetCoarseSolve ERROR !!\n"); return err; } /***************************************************************************** * set multilevel method *---------------------------------------------------------------------------*/ extern "C" int MLI_SetMethod( CMLI *cmli, CMLI_Method *method_data ) { int err=0; MLI *mli; MLI_Method *data; if ( cmli == NULL || method_data == NULL ) err = 1; else { mli = (MLI *) cmli->mli_; data = (MLI_Method *) method_data->method_; if ( mli == NULL || data == NULL ) err = 1; else mli->setMethod( data ); method_data->owner_ = 0; } if ( err ) printf("MLI_SetMethod ERROR !!\n"); return err; } /***************************************************************************** * set up the multilevel method *---------------------------------------------------------------------------*/ extern "C" int MLI_Setup( CMLI *cmli ) { int err=0; MLI *mli; if ( cmli == NULL ) err = 1; else { mli = (MLI *) cmli->mli_; if ( mli == NULL ) err = 1; else mli->setup(); } if ( err ) printf("MLI_Setup ERROR !!\n"); return err; } /***************************************************************************** * perform one multilevel cycle *---------------------------------------------------------------------------*/ extern "C" int MLI_Cycle( CMLI *cmli, CMLI_Vector *csol, CMLI_Vector *crhs ) { int err=0; MLI *mli; MLI_Vector *sol, *rhs; if ( cmli == NULL || csol == NULL || crhs == NULL ) err = 1; else { mli = (MLI *) cmli->mli_; sol = (MLI_Vector *) csol->vector_; rhs = (MLI_Vector *) crhs->vector_; if (mli == NULL || sol == NULL || rhs == NULL) err = 1; else mli->cycle(sol, rhs); csol->owner_ = 0; crhs->owner_ = 0; } if ( err ) printf("MLI_Cycle ERROR !!\n"); return err; } /***************************************************************************** * perform multilevel cycles until convergence *---------------------------------------------------------------------------*/ extern "C" int MLI_Solve( CMLI *cmli, CMLI_Vector *csol, CMLI_Vector *crhs ) { int err=0; MLI *mli; MLI_Vector *sol, *rhs; if ( cmli == NULL || csol == NULL || crhs == NULL ) err = 1; else { mli = (MLI *) cmli->mli_; sol = (MLI_Vector *) csol->vector_; rhs = (MLI_Vector *) crhs->vector_; if (mli == NULL || sol == NULL || rhs == NULL) err = 1; else mli->solve(sol, rhs); csol->owner_ = 0; crhs->owner_ = 0; } if ( err ) printf("MLI_Solve ERROR !!\n"); return err; } /***************************************************************************** * set output levels *---------------------------------------------------------------------------*/ extern "C" int MLI_SetOutputLevel( CMLI *cmli, int level ) { int err=0; MLI *mli; if ( cmli == NULL ) err = 1; else { mli = (MLI *) cmli->mli_; if ( mli == NULL ) err = 1; else mli->setOutputLevel( level ); } if ( err ) printf("MLI_SetOutputLevel ERROR !!\n"); return err; } /***************************************************************************** * print MLI internal information *---------------------------------------------------------------------------*/ extern "C" int MLI_Print( CMLI *cmli ) { int err=0; MLI *mli; if ( cmli == NULL ) err = 1; else { mli = (MLI *) cmli->mli_; if ( mli == NULL ) err = 1; else mli->print(); } if ( err ) printf("MLI_Print ERROR !!\n"); return err; } /***************************************************************************** * print MLI timing information *---------------------------------------------------------------------------*/ extern "C" int MLI_PrintTiming( CMLI *cmli ) { int err=0; MLI *mli; if ( cmli == NULL ) err = 1; else { mli = (MLI *) cmli->mli_; if ( mli == NULL ) err = 1; else mli->printTiming(); } if ( err ) printf("MLI_PrintTiming ERROR !!\n"); return err; } /***************************************************************************** * create a "C" finite element data object *---------------------------------------------------------------------------*/ extern "C" CMLI_FEData *MLI_FEDataCreate(MPI_Comm comm, void *fedata, char *name) { int mypid; MLI_FEData *mli_fedata; CMLI_FEData *cmli_fedata; MPI_Comm_rank(comm, &mypid); mli_fedata = new MLI_FEData( comm ); cmli_fedata = hypre_CTAlloc(CMLI_FEData, 1, HYPRE_MEMORY_HOST); cmli_fedata->fedata_ = (void *) mli_fedata; cmli_fedata->owner_ = 1; return cmli_fedata; } /***************************************************************************** * destroy a "C" FEData object *---------------------------------------------------------------------------*/ extern "C" int MLI_FEDataDestroy( CMLI_FEData *cfedata ) { int err=0; MLI_FEData *fedata; if ( cfedata == NULL ) err = 1; else { fedata = (MLI_FEData *) cfedata->fedata_; if ( fedata == NULL ) err = 1; else if ( cfedata->owner_ ) delete fedata; free( cfedata ); } return err; } /***************************************************************************** * create element node matrix from FEData *---------------------------------------------------------------------------*/ extern "C" int MLI_FEDataGetElemNodeMatrix( CMLI_FEData *cfedata, MPI_Comm comm, void ** mat ) { int err=0; MLI_FEData *fedata; MLI_Matrix *elemNodeMat; if ( cfedata == NULL ) err = 1; else { fedata = (MLI_FEData *) cfedata->fedata_; if ( fedata == NULL ) err = 1; else { MLI_FEDataConstructElemNodeMatrix(comm, fedata, &elemNodeMat); (*mat) = elemNodeMat; } } return err; } /***************************************************************************** * create element face matrix from FEData *---------------------------------------------------------------------------*/ extern "C" int MLI_FEDataGetElemFaceMatrix( CMLI_FEData *cfedata, MPI_Comm comm, void ** mat ) { int err=0; MLI_FEData *fedata; MLI_Matrix *elemFaceMat; if ( cfedata == NULL ) err = 1; else { fedata = (MLI_FEData *) cfedata->fedata_; if ( fedata == NULL ) err = 1; else { MLI_FEDataConstructElemFaceMatrix(comm, fedata, &elemFaceMat); (*mat) = elemFaceMat; } } return err; } /***************************************************************************** * create face node matrix from FEData *---------------------------------------------------------------------------*/ extern "C" int MLI_FEDataGetFaceNodeMatrix( CMLI_FEData *cfedata, MPI_Comm comm, void ** mat ) { int err=0; MLI_FEData *fedata; MLI_Matrix *faceNodeMat; if ( cfedata == NULL ) err = 1; else { fedata = (MLI_FEData *) cfedata->fedata_; if ( fedata == NULL ) err = 1; else { MLI_FEDataConstructFaceNodeMatrix(comm, fedata, &faceNodeMat); (*mat) = faceNodeMat; } } return err; } /***************************************************************************** * create node element matrix from FEData *---------------------------------------------------------------------------*/ extern "C" int MLI_FEDataGetNodeElemMatrix( CMLI_FEData *cfedata, MPI_Comm comm, void ** mat ) { int err=0; MLI_FEData *fedata; MLI_Matrix *nodeElemMat; if ( cfedata == NULL ) err = 1; else { fedata = (MLI_FEData *) cfedata->fedata_; if ( fedata == NULL ) err = 1; else { MLI_FEDataConstructNodeElemMatrix(comm, fedata, &nodeElemMat); (*mat) = nodeElemMat; } } return err; } /***************************************************************************** * create face element matrix from FEData *---------------------------------------------------------------------------*/ extern "C" int MLI_FEDataGetFaceElemMatrix( CMLI_FEData *cfedata, MPI_Comm comm, void ** mat ) { int err=0; MLI_FEData *fedata; MLI_Matrix *faceElemMat; if ( cfedata == NULL ) err = 1; else { fedata = (MLI_FEData *) cfedata->fedata_; if ( fedata == NULL ) err = 1; else { MLI_FEDataConstructFaceElemMatrix(comm, fedata, &faceElemMat); (*mat) = faceElemMat; } } return err; } /***************************************************************************** * create node face matrix from FEData *---------------------------------------------------------------------------*/ extern "C" int MLI_FEDataGetNodeFaceMatrix( CMLI_FEData *cfedata, MPI_Comm comm, void ** mat ) { int err=0; MLI_FEData *fedata; MLI_Matrix *nodeFaceMat; if ( cfedata == NULL ) err = 1; else { fedata = (MLI_FEData *) cfedata->fedata_; if ( fedata == NULL ) err = 1; else { MLI_FEDataConstructNodeFaceMatrix(comm, fedata, &nodeFaceMat); (*mat) = nodeFaceMat; } } return err; } /***************************************************************************** * create a "C" matrix object *---------------------------------------------------------------------------*/ extern "C" CMLI_Matrix *MLI_MatrixCreate(void *matrix, char *name, MLI_Function *func) { MLI_Matrix *mli_matrix; CMLI_Matrix *cmli_matrix; mli_matrix = new MLI_Matrix( matrix, name, func ); cmli_matrix = hypre_CTAlloc(CMLI_Matrix, 1, HYPRE_MEMORY_HOST); cmli_matrix->matrix_ = (void *) mli_matrix; cmli_matrix->owner_ = 1; return cmli_matrix; } /***************************************************************************** * destroy a "C" matrix object *---------------------------------------------------------------------------*/ extern "C" int MLI_MatrixDestroy( CMLI_Matrix *cmatrix ) { int err=0; MLI_Matrix *matrix; if ( cmatrix == NULL ) err = 1; else { matrix = (MLI_Matrix *) cmatrix->matrix_; if ( matrix == NULL ) err = 1; else if ( cmatrix->owner_ ) delete matrix; free( cmatrix ); } return err; } /***************************************************************************** * create a "C" vector object *---------------------------------------------------------------------------*/ CMLI_Vector *MLI_VectorCreate(void *vector,const char *name, MLI_Function *func) { MLI_Vector *mli_vector = new MLI_Vector( vector, name, func ); CMLI_Vector *cmli_vector = hypre_CTAlloc(CMLI_Vector, 1, HYPRE_MEMORY_HOST); cmli_vector->vector_ = (void *) mli_vector; cmli_vector->owner_ = 1; return cmli_vector; } /***************************************************************************** * destroy a "C" vector object *---------------------------------------------------------------------------*/ extern "C" int MLI_VectorDestroy( CMLI_Vector *cvector ) { int err=0; MLI_Vector *mli_vector; if ( cvector == NULL ) err = 1; else { mli_vector = (MLI_Vector *) cvector->vector_; if ( mli_vector == NULL ) err = 1; else if ( cvector->owner_ ) delete mli_vector; free( cvector ); } return err; } /***************************************************************************** * create a "C" solver object *---------------------------------------------------------------------------*/ extern "C" CMLI_Solver *MLI_SolverCreate(char *name) { MLI_Solver *mli_solver; CMLI_Solver *cmli_solver = hypre_CTAlloc(CMLI_Solver, 1, HYPRE_MEMORY_HOST); mli_solver = MLI_Solver_CreateFromName( name ); cmli_solver->solver_ = (void *) mli_solver; cmli_solver->owner_ = 1; return cmli_solver; } /***************************************************************************** * destroy a "C" solver object *---------------------------------------------------------------------------*/ extern "C" int MLI_SolverDestroy( CMLI_Solver *csolver ) { int err=0; MLI_Solver *mli_solver; if ( csolver == NULL ) err = 1; else { mli_solver = (MLI_Solver *) csolver->solver_; if ( mli_solver == NULL ) err = 1; else if ( csolver->owner_ ) delete mli_solver; free( csolver ); } return err; } /***************************************************************************** * set solver parameters *---------------------------------------------------------------------------*/ extern "C" int MLI_SolverSetParams(CMLI_Solver *solver, char *param_string, int argc, char **argv) { int err=0; MLI_Solver *mli_solver; if ( solver == NULL ) err = 1; else { mli_solver = (MLI_Solver *) solver->solver_; if ( mli_solver == NULL ) err = 1; else mli_solver->setParams(param_string,argc,argv); } if ( err ) printf("MLI_SolverSetParams ERROR !!\n"); return err; } /***************************************************************************** * create a "C" mapper object *---------------------------------------------------------------------------*/ extern "C" CMLI_Mapper *MLI_MapperCreate() { MLI_Mapper *mli_mapper; CMLI_Mapper *cmli_mapper = hypre_CTAlloc(CMLI_Mapper, 1, HYPRE_MEMORY_HOST); mli_mapper = new MLI_Mapper(); cmli_mapper->mapper_ = (void *) mli_mapper; cmli_mapper->owner_ = 1; return cmli_mapper; } /***************************************************************************** * destroy a "C" mapper object *---------------------------------------------------------------------------*/ extern "C" int MLI_MapperDestroy( CMLI_Mapper *cmapper ) { int err=0; MLI_Mapper *mli_mapper; if ( cmapper == NULL ) err = 1; else { mli_mapper = (MLI_Mapper *) cmapper->mapper_; if ( mli_mapper == NULL ) err = 1; else if ( cmapper->owner_ ) delete mli_mapper; free( cmapper ); } return err; } /***************************************************************************** * set mapper parameters *---------------------------------------------------------------------------*/ extern "C" int MLI_MapperSetParams(CMLI_Mapper *mapper, char *param_string, int argc, char **argv) { int err=0; MLI_Mapper *mli_mapper; if ( mapper == NULL ) err = 1; else { mli_mapper = (MLI_Mapper *) mapper->mapper_; if ( mli_mapper == NULL ) err = 1; else mli_mapper->setParams(param_string,argc,argv); } if ( err ) printf("MLI_MapperSetParams ERROR !!\n"); return err; } /***************************************************************************** * create a "C" method object *---------------------------------------------------------------------------*/ extern "C" CMLI_Method *MLI_MethodCreate(char *name, MPI_Comm comm) { int err=0; MLI_Method *mli_method; CMLI_Method *cmli_method; mli_method = MLI_Method_CreateFromName(name, comm); cmli_method = hypre_CTAlloc(CMLI_Method, 1, HYPRE_MEMORY_HOST); if ( mli_method == NULL || cmli_method == NULL ) err = 1; else { cmli_method->method_ = (void *) mli_method; cmli_method->owner_ = 1; } if ( err ) printf("MLI_MethodCreate ERROR !!\n"); return cmli_method; } /***************************************************************************** * destroy a "C" method object *---------------------------------------------------------------------------*/ extern "C" int MLI_MethodDestroy( CMLI_Method *cmli_method ) { int err=0; MLI_Method *mli_method; if ( cmli_method == NULL ) err = 1; else { if ( cmli_method->owner_ != 0 ) { mli_method = (MLI_Method *) cmli_method->method_; if ( mli_method == NULL ) err = 1; else delete mli_method; } free( cmli_method ); } if ( err ) printf("MLI_MethodDestroy ERROR !!\n"); return err; } /***************************************************************************** * set method parameters *---------------------------------------------------------------------------*/ extern "C" int MLI_MethodSetParams(CMLI_Method *cmethod, char *param_string, int argc, char **argv) { int err=0; MLI_Method *mli_method; if ( cmethod == NULL ) err = 1; else { mli_method = (MLI_Method *) cmethod->method_; if (mli_method == NULL) err = 1; else mli_method->setParams(param_string, argc, argv); } if ( err ) printf("MLI_MethodSetParams ERROR !!\n"); return err; } hypre-2.33.0/src/FEI_mv/femli/cmli.h000066400000000000000000000167051477326011500170320ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * Header info for MLI C interface * *****************************************************************************/ #ifndef __CINTFACEH__ #define __CINTFACEH__ #include "_hypre_utilities.h" #ifdef __cplusplus extern "C" { #endif /****************************************************************************** * new data type definitions *****************************************************************************/ typedef struct CMLI_Matrix_Struct CMLI_Matrix; typedef struct CMLI_Struct CMLI; typedef struct CMLI_Vector_Struct CMLI_Vector; typedef struct CMLI_Solver_Struct CMLI_Solver; typedef struct CMLI_FEData_Struct CMLI_FEData; typedef struct CMLI_Method_Struct CMLI_Method; typedef struct CMLI_Mapper_Struct CMLI_Mapper; /****************************************************************************** * structure prototypes *****************************************************************************/ struct CMLI_Struct { void* mli_; }; struct CMLI_Matrix_Struct { void* matrix_; int owner_; }; struct CMLI_Vector_Struct { void* vector_; int owner_; }; struct CMLI_Solver_Struct { void* solver_; int owner_; }; struct CMLI_FEData_Struct { void* fedata_; int owner_; }; struct CMLI_Method_Struct { void* method_; int owner_; }; struct CMLI_Mapper_Struct { void* mapper_; int owner_; }; #ifdef __cplusplus } #endif #include "mli_utils.h" #ifdef __cplusplus extern "C" { #endif /* **************************************************************** */ /* functions for the top level "C" MLI object */ /* ---------------------------------------------------------------- */ /* ---------------------------------------------------------------- */ /* constructor and destructor */ /* ---------------------------------------------------------------- */ CMLI *MLI_Create(MPI_Comm comm); int MLI_Destroy(CMLI *cmli); /* ---------------------------------------------------------------- */ /* set MLI internal parameters */ /* ---------------------------------------------------------------- */ int MLI_SetTolerance(CMLI *cmli, double tolerance); int MLI_SetMaxIterations(CMLI *cmli, int iterations); int MLI_SetNumLevels(CMLI *cmli, int num_levels); int MLI_SetCyclesAtLevel(CMLI *cmli, int level, int cycles); /* ---------------------------------------------------------------- */ /* set various operators */ /* ---------------------------------------------------------------- */ int MLI_SetSystemMatrix(CMLI *cmli, int level, CMLI_Matrix *Amat); int MLI_SetRestriction(CMLI *cmli, int level, CMLI_Matrix *Rmat); int MLI_SetProlongation(CMLI *cmli, int level, CMLI_Matrix *Pmat); int MLI_SetFEData(CMLI *cmli, int level, CMLI_FEData *fedata, CMLI_Mapper *); int MLI_SetSmoother(CMLI *cmli,int level,int side,CMLI_Solver *solver); int MLI_SetCoarseSolve(CMLI *cmli, CMLI_Solver *solver); /* ---------------------------------------------------------------- */ /* set which MG method and the associated parameters */ /* ---------------------------------------------------------------- */ int MLI_SetMethod(CMLI *cmli, CMLI_Method *method_data); /* ---------------------------------------------------------------- */ /* set up the multigrid structure (all components) */ /* ---------------------------------------------------------------- */ int MLI_Setup(CMLI *cmli); /* ---------------------------------------------------------------- */ /* solve functions */ /* ---------------------------------------------------------------- */ int MLI_Cycle(CMLI *cmli, CMLI_Vector *sol, CMLI_Vector *rhs); int MLI_Solve(CMLI *cmli, CMLI_Vector *sol, CMLI_Vector *rhs); /* ---------------------------------------------------------------- */ /* diagnostics and statistics */ /* ---------------------------------------------------------------- */ int MLI_SetOutputLevel(CMLI *cmli, int output_level); int MLI_Print( CMLI *cmli ); int MLI_PrintTiming( CMLI *cmli ); /* **************************************************************** */ /* functions for the "C" finite element data object */ /* ---------------------------------------------------------------- */ CMLI_FEData *MLI_FEDataCreate(MPI_Comm comm, void *fedata, char *name); int MLI_FEDataDestroy(CMLI_FEData *fedata); /* ---------------------------------------------------------------- */ /* create topological matrices */ /* ---------------------------------------------------------------- */ int MLI_FEDataGetElemNodeMatrix(CMLI_FEData *, MPI_Comm, void **mat); int MLI_FEDataGetElemFaceMatrix(CMLI_FEData *, MPI_Comm, void **mat); int MLI_FEDataGetFaceNodeMatrix(CMLI_FEData *, MPI_Comm, void **mat); int MLI_FEDataGetNodeElemMatrix(CMLI_FEData *, MPI_Comm, void **mat); int MLI_FEDataGetFaceElemMatrix(CMLI_FEData *, MPI_Comm, void **mat); int MLI_FEDataGetNodeFaceMatrix(CMLI_FEData *, MPI_Comm, void **mat); /* **************************************************************** */ /* constructor and destructor for a "C" MLI matrix object */ /* ---------------------------------------------------------------- */ CMLI_Matrix *MLI_MatrixCreate(void *matrix, char *name, MLI_Function *destroy_func); int MLI_MatrixDestroy( CMLI_Matrix *matrix ); /* **************************************************************** */ /* constructor and destructor for a "C" MLI vector object */ /* ---------------------------------------------------------------- */ CMLI_Vector *MLI_VectorCreate(void *vector,const char *name, MLI_Function *destroy_func); int MLI_VectorDestroy(CMLI_Vector *vector); /* **************************************************************** */ /* functions for the "C" MLI solver object */ /* ---------------------------------------------------------------- */ CMLI_Solver *MLI_SolverCreate(char *name); int MLI_SolverDestroy(CMLI_Solver *solver); int MLI_SolverSetParams(CMLI_Solver *solver, char *param_string, int argc, char **argv); /* **************************************************************** */ /* functions for the "C" MLI mapper object */ /* ---------------------------------------------------------------- */ CMLI_Mapper *MLI_MapperCreate(); int MLI_MapperDestroy(CMLI_Mapper *mapper); int MLI_MapperSetParams(CMLI_Mapper *solver, char *param_string, int argc, char **argv); /* **************************************************************** */ /* functions for the "C" MLI Method object */ /* ---------------------------------------------------------------- */ CMLI_Method *MLI_MethodCreate(char *name, MPI_Comm comm); int MLI_MethodDestroy(CMLI_Method *method); int MLI_MethodSetParams(CMLI_Method *cmethod, char *name, int argc, char **argv); #ifdef __cplusplus } #endif #endif hypre-2.33.0/src/FEI_mv/femli/driver_fedata.cxx000066400000000000000000000623741477326011500212630ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /************************************************************************** ************************************************************************** * test program for MLI_FEData functions ************************************************************************** **************************************************************************/ #include #include #include /* #include */ #include "mli_fedata.h" /************************************************************************** functions to be defined later **************************************************************************/ void test1P(); void test2P(); void test4P(); /************************************************************************** main program **************************************************************************/ main(int argc, char **argv) { int nprocs; MPI_Init(&argc, &argv); MPI_Comm_size( MPI_COMM_WORLD, &nprocs ); switch ( nprocs ) { case 1 : test1P(); break; case 2 : test2P(); break; case 4 : test4P(); break; default : printf("nprocs other than 1, 2, or 4 not available.\n"); break; } MPI_Finalize(); } /************************************************************************** 1 processor test case **************************************************************************/ void test1P() { int fieldSize=1, fieldID=0, nElems=4, nNodesPerElem=4; int nodeNumFields=1, nodeFieldID=0, spaceDim=2; int i, j, *eGlobalIDs, **nGlobalIDLists, eMatDim=4; int mypid, status; double **coord, **stiffMat; char param_string[100]; MLI_FEData *fedata; MLI_FEData *fedata2; MPI_Comm_rank( MPI_COMM_WORLD, &mypid ); fedata = new MLI_FEData( MPI_COMM_WORLD ); fedata->setOutputLevel(0); fedata->setOrderOfPDE(2); fedata->setOrderOfFE(1); fedata->setOrderOfFE(1); fedata->setSpaceDimension(spaceDim); fedata->initFields(1, &fieldSize, &fieldID); fedata->initElemBlock(nElems, nNodesPerElem, nodeNumFields, &nodeFieldID, 0, NULL); eGlobalIDs = new int[nElems]; nGlobalIDLists = new int*[nElems]; for ( i = 0; i < nElems; i++ ) nGlobalIDLists[i] = new int[nNodesPerElem]; coord = new double*[nElems]; for ( i = 0; i < nElems; i++ ) coord[i] = new double[nNodesPerElem*spaceDim]; stiffMat = new double*[nElems]; for ( i = 0; i < nElems; i++ ) { stiffMat[i] = new double[eMatDim*eMatDim]; for ( j = 0; j < eMatDim*eMatDim; j++ ) stiffMat[i][j] = (double) j; } eGlobalIDs[0] = 0; eGlobalIDs[1] = 1; eGlobalIDs[2] = 2; eGlobalIDs[3] = 3; nGlobalIDLists[0][0] = 0; nGlobalIDLists[0][1] = 1; nGlobalIDLists[0][2] = 3; nGlobalIDLists[0][3] = 4; nGlobalIDLists[1][0] = 1; nGlobalIDLists[1][1] = 2; nGlobalIDLists[1][2] = 4; nGlobalIDLists[1][3] = 5; nGlobalIDLists[2][0] = 3; nGlobalIDLists[2][1] = 4; nGlobalIDLists[2][2] = 6; nGlobalIDLists[2][3] = 7; nGlobalIDLists[3][0] = 4; nGlobalIDLists[3][1] = 5; nGlobalIDLists[3][2] = 7; nGlobalIDLists[3][3] = 8; coord[0][0] = 0.0; coord[0][1] = 0.0; coord[0][2] = 0.5; coord[0][3] = 0.0; coord[0][4] = 0.0; coord[0][5] = 0.5; coord[0][6] = 0.5; coord[0][7] = 0.5; coord[1][0] = 0.5; coord[1][1] = 0.0; coord[1][2] = 1.0; coord[1][3] = 0.0; coord[1][4] = 0.5; coord[1][5] = 0.5; coord[1][6] = 1.0; coord[1][7] = 0.5; coord[2][0] = 0.0; coord[2][1] = 0.5; coord[2][2] = 0.5; coord[2][3] = 0.5; coord[2][4] = 0.0; coord[2][5] = 1.0; coord[2][6] = 0.5; coord[2][7] = 1.0; coord[3][0] = 0.5; coord[3][1] = 0.5; coord[3][2] = 1.0; coord[3][3] = 0.5; coord[3][4] = 0.5; coord[3][5] = 1.0; coord[3][6] = 1.0; coord[3][7] = 1.0; fedata->initElemBlockNodeLists(nElems, eGlobalIDs, nNodesPerElem, nGlobalIDLists, spaceDim, coord); fedata->initComplete(); fedata->loadElemBlockMatrices(nElems, eMatDim, stiffMat); strcpy( param_string, "test" ); fedata->writeToFile(param_string); delete [] eGlobalIDs; for ( i = 0; i < nElems; i++ ) delete [] nGlobalIDLists[i]; delete [] nGlobalIDLists; for ( i = 0; i < nElems; i++ ) delete [] coord[i]; delete [] coord; for ( i = 0; i < nElems; i++ ) delete [] stiffMat[i]; delete [] stiffMat; fedata2 = new MLI_FEData( MPI_COMM_WORLD ); strcpy( param_string, "test" ); fedata2->readFromFile(param_string); strcpy( param_string, "test2" ); fedata2->writeToFile(param_string); sprintf(param_string, "diff test.elemConn.%d test2.elemConn.%d > /dev/null",mypid,mypid); status = system(param_string); if ( status == 0 ) printf("test passed : %s\n", param_string); else printf("test failed : %s\n", param_string); sprintf(param_string, "diff test.elemMatrix.%d test2.elemMatrix.%d > /dev/null",mypid,mypid); status = system(param_string); if ( status == 0 ) printf("test passed : %s\n", param_string); else printf("test failed : %s\n", param_string); sprintf(param_string, "diff test.nodeCoord.%d test2.nodeCoord.%d > /dev/null",mypid,mypid); status = system(param_string); if ( status == 0 ) printf("test passed : %s\n", param_string); else printf("test failed : %s\n", param_string); } /************************************************************************** 2 processor test case **************************************************************************/ void test2P() { int fieldSize=1, fieldID=0, nElems=4, nNodesPerElem=4; int nodeNumFields=1, nodeFieldID=0, spaceDim=2; int i, j, *eGlobalIDs, **nGlobalIDLists, eMatDim=4; int numSharedNodes, *sharedNodeNProcs, **sharedNodeProcs; int *sharedNodeList, mypid, status; double **coord, **stiffMat; char param_string[100]; MLI_FEData *fedata, *fedata2; MPI_Comm_rank( MPI_COMM_WORLD, &mypid ); fedata = new MLI_FEData( MPI_COMM_WORLD ); fedata->setOutputLevel(0); fedata->setOrderOfPDE(2); fedata->setOrderOfFE(1); fedata->setOrderOfFE(1); fedata->setSpaceDimension(spaceDim); fedata->initFields(1, &fieldSize, &fieldID); fedata->initElemBlock(nElems, nNodesPerElem, nodeNumFields, &nodeFieldID, 0, NULL); eGlobalIDs = new int[nElems]; nGlobalIDLists = new int*[nElems]; for ( i = 0; i < nElems; i++ ) nGlobalIDLists[i] = new int[nNodesPerElem]; coord = new double*[nElems]; for ( i = 0; i < nElems; i++ ) coord[i] = new double[nNodesPerElem*spaceDim]; numSharedNodes = 3; sharedNodeList = new int[3]; sharedNodeList[0] = 2; sharedNodeList[1] = 7; sharedNodeList[2] = 12; sharedNodeNProcs = new int[3]; sharedNodeNProcs[0] = 2; sharedNodeNProcs[1] = 2; sharedNodeNProcs[2] = 2; sharedNodeProcs = new int*[3]; stiffMat = new double*[nElems]; for ( i = 0; i < nElems; i++ ) { stiffMat[i] = new double[eMatDim*eMatDim]; for ( j = 0; j < eMatDim*eMatDim; j++ ) stiffMat[i][j] = (double) j; } for ( i = 0; i < 3; i++ ) { sharedNodeProcs[i] = new int[2]; sharedNodeProcs[i][0] = 0; sharedNodeProcs[i][1] = 1; } if ( mypid == 0 ) { eGlobalIDs[0] = 0; eGlobalIDs[1] = 1; eGlobalIDs[2] = 4; eGlobalIDs[3] = 5; nGlobalIDLists[0][0] = 0; nGlobalIDLists[0][1] = 1; nGlobalIDLists[0][2] = 5; nGlobalIDLists[0][3] = 6; nGlobalIDLists[1][0] = 1; nGlobalIDLists[1][1] = 2; nGlobalIDLists[1][2] = 6; nGlobalIDLists[1][3] = 7; nGlobalIDLists[2][0] = 5; nGlobalIDLists[2][1] = 6; nGlobalIDLists[2][2] = 10; nGlobalIDLists[2][3] = 11; nGlobalIDLists[3][0] = 6; nGlobalIDLists[3][1] = 7; nGlobalIDLists[3][2] = 11; nGlobalIDLists[3][3] = 12; coord[0][0] = 0.0; coord[0][1] = 0.0; coord[0][2] = 0.25; coord[0][3] = 0.0; coord[0][4] = 0.0; coord[0][5] = 0.5; coord[0][6] = 0.25; coord[0][7] = 0.5; coord[1][0] = 0.25; coord[1][1] = 0.0; coord[1][2] = 0.5; coord[1][3] = 0.0; coord[1][4] = 0.25; coord[1][5] = 0.5; coord[1][6] = 0.5; coord[1][7] = 0.5; coord[2][0] = 0.0; coord[2][1] = 0.5; coord[2][2] = 0.25; coord[2][3] = 0.5; coord[2][4] = 0.0; coord[2][5] = 1.0; coord[2][6] = 0.25; coord[2][7] = 1.0; coord[3][0] = 0.25; coord[3][1] = 0.5; coord[3][2] = 0.5; coord[3][3] = 0.5; coord[3][4] = 0.25; coord[3][5] = 1.0; coord[3][6] = 0.5; coord[3][7] = 1.0; } else if ( mypid == 1 ) { eGlobalIDs[0] = 2; eGlobalIDs[1] = 3; eGlobalIDs[2] = 6; eGlobalIDs[3] = 7; nGlobalIDLists[0][0] = 2; nGlobalIDLists[0][1] = 3; nGlobalIDLists[0][2] = 7; nGlobalIDLists[0][3] = 8; nGlobalIDLists[1][0] = 3; nGlobalIDLists[1][1] = 4; nGlobalIDLists[1][2] = 8; nGlobalIDLists[1][3] = 9; nGlobalIDLists[2][0] = 7; nGlobalIDLists[2][1] = 8; nGlobalIDLists[2][2] = 12; nGlobalIDLists[2][3] = 13; nGlobalIDLists[3][0] = 8; nGlobalIDLists[3][1] = 9; nGlobalIDLists[3][2] = 13; nGlobalIDLists[3][3] = 14; coord[0][0] = 0.5; coord[0][1] = 0.0; coord[0][2] = 0.75; coord[0][3] = 0.0; coord[0][4] = 0.5; coord[0][5] = 0.5; coord[0][6] = 0.75; coord[0][7] = 0.5; coord[1][0] = 0.75; coord[1][1] = 0.0; coord[1][2] = 1.0; coord[1][3] = 0.0; coord[1][4] = 0.75; coord[1][5] = 0.5; coord[1][6] = 1.0; coord[1][7] = 0.5; coord[2][0] = 0.5; coord[2][1] = 0.5; coord[2][2] = 0.75; coord[2][3] = 0.5; coord[2][4] = 0.5; coord[2][5] = 1.0; coord[2][6] = 0.75; coord[2][7] = 1.0; coord[3][0] = 0.75; coord[3][1] = 0.5; coord[3][2] = 1.0; coord[3][3] = 0.5; coord[3][4] = 0.75; coord[3][5] = 1.0; coord[3][6] = 1.0; coord[3][7] = 1.0; } fedata->initElemBlockNodeLists(nElems, eGlobalIDs, nNodesPerElem, nGlobalIDLists, spaceDim, coord); fedata->initSharedNodes(numSharedNodes, sharedNodeList, sharedNodeNProcs, sharedNodeProcs); fedata->initComplete(); fedata->loadElemBlockMatrices(nElems, eMatDim, stiffMat); strcpy( param_string, "test" ); fedata->writeToFile(param_string); delete [] eGlobalIDs; for ( i = 0; i < nElems; i++ ) delete [] nGlobalIDLists[i]; delete [] nGlobalIDLists; for ( i = 0; i < nElems; i++ ) delete [] coord[i]; delete [] coord; delete [] sharedNodeList; delete [] sharedNodeNProcs; for ( i = 0; i < numSharedNodes; i++ ) delete [] sharedNodeProcs[i]; delete [] sharedNodeProcs; for ( i = 0; i < nElems; i++ ) delete [] stiffMat[i]; delete [] stiffMat; fedata2 = new MLI_FEData( MPI_COMM_WORLD ); strcpy( param_string, "test" ); fedata2->readFromFile(param_string); strcpy( param_string, "test2" ); fedata2->writeToFile(param_string); if ( mypid == 0 ) { for ( i = 0; i < 2; i++ ) { sprintf(param_string, "diff test.elemConn.%d test2.elemConn.%d > /dev/null",i,i); status = system(param_string); if ( status == 0 ) printf("test passed : %s\n", param_string); else printf("test failed : %s\n", param_string); sprintf(param_string, "diff test.elemMatrix.%d test2.elemMatrix.%d > /dev/null",i,i); status = system(param_string); if ( status == 0 ) printf("test passed : %s\n", param_string); else printf("test failed : %s\n", param_string); sprintf(param_string, "diff test.nodeCoord.%d test2.nodeCoord.%d > /dev/null",i,i); status = system(param_string); if ( status == 0 ) printf("test passed : %s\n", param_string); else printf("test failed : %s\n", param_string); sprintf(param_string, "diff test.nodeShared.%d test2.nodeShared.%d > /dev/null",i,i); status = system(param_string); if ( status == 0 ) printf("test passed : %s\n", param_string); else printf("test failed : %s\n", param_string); } } } /************************************************************************** 4 processor test case **************************************************************************/ void test4P() { int fieldSize=1, fieldID=0, nElems=4, nNodesPerElem=4; int nodeNumFields=1, nodeFieldID=0, spaceDim=2; int i, j, *eGlobalIDs, **nGlobalIDLists, eMatDim=4; int numSharedNodes, *sharedNodeNProcs, **sharedNodeProcs; int *sharedNodeList, mypid, status, nprocs; double **coord, **stiffMat; char param_string[100]; MLI_FEData *fedata, *fedata2; MPI_Comm_size( MPI_COMM_WORLD, &nprocs ); MPI_Comm_rank( MPI_COMM_WORLD, &mypid ); fedata = new MLI_FEData( MPI_COMM_WORLD ); fedata->setOutputLevel(0); fedata->setOrderOfPDE(2); fedata->setOrderOfFE(1); fedata->setOrderOfFE(1); fedata->setSpaceDimension(spaceDim); fedata->initFields(1, &fieldSize, &fieldID); fedata->initElemBlock(nElems, nNodesPerElem, nodeNumFields, &nodeFieldID, 0, NULL); eGlobalIDs = new int[nElems]; nGlobalIDLists = new int*[nElems]; for ( i = 0; i < nElems; i++ ) nGlobalIDLists[i] = new int[nNodesPerElem]; coord = new double*[nElems]; for ( i = 0; i < nElems; i++ ) coord[i] = new double[nNodesPerElem*spaceDim]; numSharedNodes = 5; sharedNodeList = new int[numSharedNodes]; sharedNodeNProcs = new int[numSharedNodes]; sharedNodeProcs = new int*[numSharedNodes]; for ( i = 0; i < numSharedNodes; i++ ) sharedNodeProcs[i] = new int[4]; stiffMat = new double*[nElems]; for ( i = 0; i < nElems; i++ ) { stiffMat[i] = new double[eMatDim*eMatDim]; for ( j = 0; j < eMatDim*eMatDim; j++ ) stiffMat[i][j] = (double) j; } if ( mypid == 0 ) { eGlobalIDs[0] = 0; eGlobalIDs[1] = 1; eGlobalIDs[2] = 4; eGlobalIDs[3] = 5; nGlobalIDLists[0][0] = 0; nGlobalIDLists[0][1] = 1; nGlobalIDLists[0][2] = 5; nGlobalIDLists[0][3] = 6; nGlobalIDLists[1][0] = 1; nGlobalIDLists[1][1] = 2; nGlobalIDLists[1][2] = 6; nGlobalIDLists[1][3] = 7; nGlobalIDLists[2][0] = 5; nGlobalIDLists[2][1] = 6; nGlobalIDLists[2][2] = 10; nGlobalIDLists[2][3] = 11; nGlobalIDLists[3][0] = 6; nGlobalIDLists[3][1] = 7; nGlobalIDLists[3][2] = 11; nGlobalIDLists[3][3] = 12; coord[0][0] = 0.0; coord[0][1] = 0.0; coord[0][2] = 0.25; coord[0][3] = 0.0; coord[0][4] = 0.0; coord[0][5] = 0.25; coord[0][6] = 0.25; coord[0][7] = 0.25; coord[1][0] = 0.25; coord[1][1] = 0.0; coord[1][2] = 0.5; coord[1][3] = 0.0; coord[1][4] = 0.25; coord[1][5] = 0.25; coord[1][6] = 0.5; coord[1][7] = 0.25; coord[2][0] = 0.0; coord[2][1] = 0.25; coord[2][2] = 0.25; coord[2][3] = 0.25; coord[2][4] = 0.0; coord[2][5] = 0.5; coord[2][6] = 0.25; coord[2][7] = 0.5; coord[3][0] = 0.25; coord[3][1] = 0.25; coord[3][2] = 0.5; coord[3][3] = 0.25; coord[3][4] = 0.25; coord[3][5] = 0.5; coord[3][6] = 0.5; coord[3][7] = 0.5; sharedNodeList[0] = 2; sharedNodeNProcs[0] = 2; sharedNodeProcs[0][0] = 0; sharedNodeProcs[0][1] = 1; sharedNodeList[1] = 7; sharedNodeNProcs[1] = 2; sharedNodeProcs[1][0] = 0; sharedNodeProcs[1][1] = 1; sharedNodeList[2] = 12; sharedNodeNProcs[2] = 4; sharedNodeProcs[2][0] = 0; sharedNodeProcs[2][1] = 1; sharedNodeProcs[2][2] = 2; sharedNodeProcs[2][3] = 3; sharedNodeList[3] = 10; sharedNodeNProcs[3] = 2; sharedNodeProcs[3][0] = 0; sharedNodeProcs[3][1] = 2; sharedNodeList[4] = 11; sharedNodeNProcs[4] = 2; sharedNodeProcs[4][0] = 0; sharedNodeProcs[4][1] = 2; } else if ( mypid == 1 ) { eGlobalIDs[0] = 2; eGlobalIDs[1] = 3; eGlobalIDs[2] = 6; eGlobalIDs[3] = 7; nGlobalIDLists[0][0] = 2; nGlobalIDLists[0][1] = 3; nGlobalIDLists[0][2] = 7; nGlobalIDLists[0][3] = 8; nGlobalIDLists[1][0] = 3; nGlobalIDLists[1][1] = 4; nGlobalIDLists[1][2] = 8; nGlobalIDLists[1][3] = 9; nGlobalIDLists[2][0] = 7; nGlobalIDLists[2][1] = 8; nGlobalIDLists[2][2] = 12; nGlobalIDLists[2][3] = 13; nGlobalIDLists[3][0] = 8; nGlobalIDLists[3][1] = 9; nGlobalIDLists[3][2] = 13; nGlobalIDLists[3][3] = 14; coord[0][0] = 0.5; coord[0][1] = 0.0; coord[0][2] = 0.75; coord[0][3] = 0.0; coord[0][4] = 0.5; coord[0][5] = 0.25; coord[0][6] = 0.75; coord[0][7] = 0.25; coord[1][0] = 0.75; coord[1][1] = 0.0; coord[1][2] = 1.0; coord[1][3] = 0.0; coord[1][4] = 0.75; coord[1][5] = 0.25; coord[1][6] = 1.0; coord[1][7] = 0.25; coord[2][0] = 0.5; coord[2][1] = 0.25; coord[2][2] = 0.75; coord[2][3] = 0.25; coord[2][4] = 0.5; coord[2][5] = 0.5; coord[2][6] = 0.75; coord[2][7] = 0.5; coord[3][0] = 0.75; coord[3][1] = 0.25; coord[3][2] = 1.0; coord[3][3] = 0.25; coord[3][4] = 0.75; coord[3][5] = 0.5; coord[3][6] = 1.0; coord[3][7] = 0.5; sharedNodeList[0] = 2; sharedNodeNProcs[0] = 2; sharedNodeProcs[0][0] = 0; sharedNodeProcs[0][1] = 1; sharedNodeList[1] = 7; sharedNodeNProcs[1] = 2; sharedNodeProcs[1][0] = 0; sharedNodeProcs[1][1] = 1; sharedNodeList[2] = 12; sharedNodeNProcs[2] = 4; sharedNodeProcs[2][0] = 0; sharedNodeProcs[2][1] = 1; sharedNodeProcs[2][2] = 2; sharedNodeProcs[2][3] = 3; sharedNodeList[3] = 13; sharedNodeNProcs[3] = 2; sharedNodeProcs[3][0] = 1; sharedNodeProcs[3][1] = 3; sharedNodeList[4] = 14; sharedNodeNProcs[4] = 2; sharedNodeProcs[4][0] = 1; sharedNodeProcs[4][1] = 3; } else if ( mypid == 2 ) { eGlobalIDs[0] = 8; eGlobalIDs[1] = 9; eGlobalIDs[2] = 12; eGlobalIDs[3] = 13; nGlobalIDLists[0][0] = 10; nGlobalIDLists[0][1] = 11; nGlobalIDLists[0][2] = 15; nGlobalIDLists[0][3] = 16; nGlobalIDLists[1][0] = 11; nGlobalIDLists[1][1] = 12; nGlobalIDLists[1][2] = 16; nGlobalIDLists[1][3] = 17; nGlobalIDLists[2][0] = 15; nGlobalIDLists[2][1] = 16; nGlobalIDLists[2][2] = 20; nGlobalIDLists[2][3] = 21; nGlobalIDLists[3][0] = 16; nGlobalIDLists[3][1] = 17; nGlobalIDLists[3][2] = 21; nGlobalIDLists[3][3] = 22; coord[0][0] = 0.0; coord[0][1] = 0.5; coord[0][2] = 0.25; coord[0][3] = 0.5; coord[0][4] = 0.0; coord[0][5] = 0.75; coord[0][6] = 0.25; coord[0][7] = 0.75; coord[1][0] = 0.25; coord[1][1] = 0.5; coord[1][2] = 0.5; coord[1][3] = 0.5; coord[1][4] = 0.25; coord[1][5] = 0.75; coord[1][6] = 0.5; coord[1][7] = 0.75; coord[2][0] = 0.0; coord[2][1] = 0.75; coord[2][2] = 0.25; coord[2][3] = 0.75; coord[2][4] = 0.0; coord[2][5] = 1.0; coord[2][6] = 0.25; coord[2][7] = 1.0; coord[3][0] = 0.25; coord[3][1] = 0.75; coord[3][2] = 0.5; coord[3][3] = 0.75; coord[3][4] = 0.25; coord[3][5] = 1.0; coord[3][6] = 0.5; coord[3][7] = 1.0; sharedNodeList[0] = 10; sharedNodeNProcs[0] = 2; sharedNodeProcs[0][0] = 0; sharedNodeProcs[0][1] = 2; sharedNodeList[1] = 11; sharedNodeNProcs[1] = 2; sharedNodeProcs[1][0] = 0; sharedNodeProcs[1][1] = 2; sharedNodeList[2] = 12; sharedNodeNProcs[2] = 4; sharedNodeProcs[2][0] = 0; sharedNodeProcs[2][1] = 1; sharedNodeProcs[2][2] = 2; sharedNodeProcs[2][3] = 3; sharedNodeList[3] = 17; sharedNodeNProcs[3] = 2; sharedNodeProcs[3][0] = 2; sharedNodeProcs[3][1] = 3; sharedNodeList[4] = 22; sharedNodeNProcs[4] = 2; sharedNodeProcs[4][0] = 2; sharedNodeProcs[4][1] = 3; } else if ( mypid == 3 ) { eGlobalIDs[0] = 10; eGlobalIDs[1] = 11; eGlobalIDs[2] = 14; eGlobalIDs[3] = 15; nGlobalIDLists[0][0] = 12; nGlobalIDLists[0][1] = 13; nGlobalIDLists[0][2] = 17; nGlobalIDLists[0][3] = 18; nGlobalIDLists[1][0] = 13; nGlobalIDLists[1][1] = 14; nGlobalIDLists[1][2] = 18; nGlobalIDLists[1][3] = 19; nGlobalIDLists[2][0] = 17; nGlobalIDLists[2][1] = 18; nGlobalIDLists[2][2] = 22; nGlobalIDLists[2][3] = 23; nGlobalIDLists[3][0] = 18; nGlobalIDLists[3][1] = 19; nGlobalIDLists[3][2] = 23; nGlobalIDLists[3][3] = 24; coord[0][0] = 0.5; coord[0][1] = 0.5; coord[0][2] = 0.75; coord[0][3] = 0.5; coord[0][4] = 0.5; coord[0][5] = 0.75; coord[0][6] = 0.75; coord[0][7] = 0.75; coord[1][0] = 0.75; coord[1][1] = 0.5; coord[1][2] = 1.0; coord[1][3] = 0.5; coord[1][4] = 0.75; coord[1][5] = 0.75; coord[1][6] = 1.0; coord[1][7] = 0.75; coord[2][0] = 0.5; coord[2][1] = 0.75; coord[2][2] = 0.75; coord[2][3] = 0.75; coord[2][4] = 0.5; coord[2][5] = 1.0; coord[2][6] = 0.75; coord[2][7] = 1.0; coord[3][0] = 0.75; coord[3][1] = 0.75; coord[3][2] = 1.0; coord[3][3] = 0.75; coord[3][4] = 0.75; coord[3][5] = 1.0; coord[3][6] = 1.0; coord[3][7] = 1.0; sharedNodeList[0] = 13; sharedNodeNProcs[0] = 2; sharedNodeProcs[0][0] = 0; sharedNodeProcs[0][1] = 2; sharedNodeList[1] = 14; sharedNodeNProcs[1] = 2; sharedNodeProcs[1][0] = 0; sharedNodeProcs[1][1] = 2; sharedNodeList[2] = 12; sharedNodeNProcs[2] = 4; sharedNodeProcs[2][0] = 0; sharedNodeProcs[2][1] = 1; sharedNodeProcs[2][2] = 2; sharedNodeProcs[2][3] = 3; sharedNodeList[3] = 17; sharedNodeNProcs[3] = 2; sharedNodeProcs[3][0] = 2; sharedNodeProcs[3][1] = 3; sharedNodeList[4] = 22; sharedNodeNProcs[4] = 2; sharedNodeProcs[4][0] = 2; sharedNodeProcs[4][1] = 3; } fedata->initElemBlockNodeLists(nElems, eGlobalIDs, nNodesPerElem, nGlobalIDLists, spaceDim, coord); fedata->initSharedNodes(numSharedNodes, sharedNodeList, sharedNodeNProcs, sharedNodeProcs); fedata->initComplete(); fedata->loadElemBlockMatrices(nElems, eMatDim, stiffMat); strcpy( param_string, "test" ); fedata->writeToFile(param_string); delete [] eGlobalIDs; for ( i = 0; i < nElems; i++ ) delete [] nGlobalIDLists[i]; delete [] nGlobalIDLists; for ( i = 0; i < nElems; i++ ) delete [] coord[i]; delete [] coord; delete [] sharedNodeList; delete [] sharedNodeNProcs; for ( i = 0; i < numSharedNodes; i++ ) delete [] sharedNodeProcs[i]; delete [] sharedNodeProcs; for ( i = 0; i < nElems; i++ ) delete [] stiffMat[i]; delete [] stiffMat; fedata2 = new MLI_FEData( MPI_COMM_WORLD ); strcpy( param_string, "test" ); fedata2->readFromFile(param_string); strcpy( param_string, "test2" ); fedata2->writeToFile(param_string); if ( mypid == 0 ) { for ( i = 0; i < nprocs; i++ ) { sprintf(param_string, "diff test.elemConn.%d test2.elemConn.%d > /dev/null",i,i); status = system(param_string); if ( status == 0 ) printf("test passed : %s\n", param_string); else printf("test failed : %s\n", param_string); sprintf(param_string, "diff test.elemMatrix.%d test2.elemMatrix.%d > /dev/null",i,i); status = system(param_string); if ( status == 0 ) printf("test passed : %s\n", param_string); else printf("test failed : %s\n", param_string); sprintf(param_string, "diff test.nodeCoord.%d test2.nodeCoord.%d > /dev/null",i,i); status = system(param_string); if ( status == 0 ) printf("test passed : %s\n", param_string); else printf("test failed : %s\n", param_string); sprintf(param_string, "diff test.nodeShared.%d test2.nodeShared.%d > /dev/null",i,i); status = system(param_string); if ( status == 0 ) printf("test passed : %s\n", param_string); else printf("test failed : %s\n", param_string); } } } hypre-2.33.0/src/FEI_mv/femli/driver_matrix.cxx000066400000000000000000000210321477326011500213250ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** test program *****************************************************************************/ #include #include "HYPRE.h" #include "_hypre_utilities.h" #include "mli_matrix.h" #include "mli_matrix_misc.h" #include "IJ_mv.h" #include "seq_mv.h" #include "parcsr_mv.h" #include "parcsr_ls.h" #include /****************************************************************************** test program ----------------------------------------------------------------------------*/ extern void testOverLapped( HYPRE_ParCSRMatrix ); extern void testRAP( HYPRE_ParCSRMatrix ); extern void GenTridiagMatrix( HYPRE_ParCSRMatrix *Amat ); extern void GenLaplacian9pt( HYPRE_ParCSRMatrix *Amat ); /****************************************************************************** main program ----------------------------------------------------------------------------*/ main(int argc, char **argv) { int problem=2, test=2; HYPRE_ParCSRMatrix Amat; MPI_Init(&argc, &argv); switch (problem) { case 1 : GenTridiagMatrix( &Amat ); break; case 2 : GenLaplacian9pt( &Amat ); break; } switch (test) { case 1 : testOverLapped(Amat); break; case 2 : testRAP(Amat); break; } HYPRE_ParCSRMatrixDestroy( Amat ); MPI_Finalize(); } /****************************************************************************** test the overlapped matrix ----------------------------------------------------------------------------*/ void testOverLapped( HYPRE_ParCSRMatrix HYPREA ) { int extNRows, *extRowLengs, *extCols; double *extVals; char paramString[100]; MLI_Function *funcPtr; MLI_Matrix *mli_mat; funcPtr = new MLI_Function(); MLI_Utils_HypreParCSRMatrixGetDestroyFunc(funcPtr); sprintf(paramString, "HYPRE_ParCSR" ); mli_mat = new MLI_Matrix( HYPREA, paramString, funcPtr ); MLI_Matrix_GetOverlappedMatrix(mli_mat, &extNRows, &extRowLengs, &extCols, &extVals); delete [] extRowLengs; delete [] extCols; delete [] extVals; delete mli_mat; } /****************************************************************************** test matrix matrix product ----------------------------------------------------------------------------*/ void testRAP( HYPRE_ParCSRMatrix HYPREA ) { int i, mypid; char paramString[100]; double time1, time2, timeOld, timeNew; MLI_Function *funcPtr; MLI_Matrix *mli_mat, *mli_Cmat; hypre_ParCSRMatrix *hypreRAP; MPI_Comm_rank(MPI_COMM_WORLD, &mypid); funcPtr = new MLI_Function(); MLI_Utils_HypreParCSRMatrixGetDestroyFunc(funcPtr); sprintf(paramString, "HYPRE_ParCSR" ); mli_mat = new MLI_Matrix( HYPREA, paramString, funcPtr ); timeOld = timeNew = 0.0; /* for ( i = 0; i < 1; i++ ) { if ( mypid == 0 ) printf("MatMatMult %d\n", i); MPI_Barrier(MPI_COMM_WORLD); time1 = MLI_Utils_WTime(); hypreRAP = (hypre_ParCSRMatrix *) hypre_ParMatmul( (hypre_ParCSRMatrix *) HYPREA, (hypre_ParCSRMatrix *) HYPREA); MPI_Barrier(MPI_COMM_WORLD); time2 = MLI_Utils_WTime(); timeOld += time2 - time1; MPI_Barrier(MPI_COMM_WORLD); time1 = MLI_Utils_WTime(); MLI_Matrix_MatMatMult(mli_mat, mli_mat, &mli_Cmat); MPI_Barrier(MPI_COMM_WORLD); time2 = MLI_Utils_WTime(); timeNew += time2 - time1; hypre_ParCSRMatrixDestroy( (hypre_ParCSRMatrix *) hypreRAP); delete mli_Cmat; } if ( mypid == 0 ) printf("Old MatMatMult time = %e\n", timeOld/10); if ( mypid == 0 ) printf("New MatMatMult time = %e\n", timeNew/10); */ if ( mypid == 0 ) printf("Old MatMatMult\n"); MPI_Barrier(MPI_COMM_WORLD); time1 = MLI_Utils_WTime(); hypreRAP = (hypre_ParCSRMatrix *) hypre_ParMatmul( (hypre_ParCSRMatrix *) HYPREA, (hypre_ParCSRMatrix *) HYPREA); MPI_Barrier(MPI_COMM_WORLD); time2 = MLI_Utils_WTime(); if ( mypid == 0 ) printf("Old MatMatMult time = %e\n", time2-time1); sprintf(paramString, "HYPRE_ParCSR" ); funcPtr = new MLI_Function(); mli_Cmat = new MLI_Matrix( hypreRAP, paramString, funcPtr ); mli_Cmat->print("OldAA"); if ( mypid == 0 ) printf("New MatMatMult\n"); MPI_Barrier(MPI_COMM_WORLD); time1 = MLI_Utils_WTime(); MLI_Matrix_MatMatMult(mli_mat, mli_mat, &mli_Cmat); MPI_Barrier(MPI_COMM_WORLD); time2 = MLI_Utils_WTime(); if ( mypid == 0 ) printf("New MatMatMult time = %e\n", time2-time1); mli_Cmat->print("newAA"); delete mli_mat; } /****************************************************************************** set up a matrix from 9-point 2D Laplacian ----------------------------------------------------------------------------*/ void GenTridiagMatrix( HYPRE_ParCSRMatrix *Amat ) { int mypid, nprocs, localNRows=10, length=7, *rowSizes, *colInd; int ii, irow, irow2, rowIndex, ierr, globalNRows; int firstRow, firstCol, lastRow, lastCol; double *colVal; HYPRE_IJMatrix IJA; MPI_Comm_size(MPI_COMM_WORLD, &nprocs); MPI_Comm_rank(MPI_COMM_WORLD, &mypid); firstRow = mypid * localNRows; lastRow = (mypid + 1) * localNRows - 1; firstCol = firstRow; lastCol = lastRow; globalNRows = localNRows * nprocs; ierr = HYPRE_IJMatrixCreate( MPI_COMM_WORLD, firstRow, lastRow, firstCol, lastCol, &IJA ); ierr += HYPRE_IJMatrixSetObjectType( IJA, HYPRE_PARCSR ); rowSizes = new int[localNRows]; for ( ii = 0; ii < localNRows; ii++ ) rowSizes[ii] = length; ierr = HYPRE_IJMatrixSetRowSizes ( IJA, (const int *) rowSizes ); ierr = HYPRE_IJMatrixInitialize( IJA ); delete [] rowSizes; colInd = new int[length]; colVal = new double[length]; for ( irow = 0; irow < localNRows; irow++ ) { rowIndex = firstRow + irow; irow2 = 0; for ( ii = length-1; ii >= 0; ii-- ) { colInd[irow2] = rowIndex - length/2 + ii; colVal[irow2] = -1; if ( colInd[irow2] == rowIndex ) colVal[irow2] = 10.0; if ( colInd[irow2] >= 0 && colInd[irow2] < globalNRows ) irow2++; } ierr += HYPRE_IJMatrixSetValues( IJA, 1, &irow2, &rowIndex, (const int *) colInd, (const double *) colVal ); } ierr += HYPRE_IJMatrixAssemble( IJA ); delete [] colInd; delete [] colVal; ierr += HYPRE_IJMatrixGetObject( IJA, (void **) Amat); } /****************************************************************************** set up a matrix from 9-point 2D Laplacian ----------------------------------------------------------------------------*/ void GenLaplacian9pt( HYPRE_ParCSRMatrix *Amat ) { int nx, ny, px, py, mypx, mypy, mypid, nprocs; double *values; HYPRE_ParCSRMatrix A; /*----------------------------------------------------------- * get machine information *-----------------------------------------------------------*/ MPI_Comm_rank(MPI_COMM_WORLD, &mypid ); MPI_Comm_size(MPI_COMM_WORLD, &nprocs ); /*----------------------------------------------------------- * set up grid and processor parameters *-----------------------------------------------------------*/ nx = ny = 100; if ( nprocs > 1 ) px = 2; else px = 1; py = nprocs / px; if ( (px*py) != nprocs) { printf("Error: Invalid processor topology \n"); exit(1); } if (mypid == 0) { printf(" Laplacian 9pt:\n"); printf(" (nx, ny) = (%d, %d)\n", nx, ny); printf(" (px, py) = (%d, %d)\n", px, py); } mypx = mypid % px; mypy = ( mypid - mypx) / px; /*----------------------------------------------------------- * create matrix parameters *-----------------------------------------------------------*/ values = new double[2]; values[1] = -1.0; values[0] = 0.0; if ( nx > 1 ) values[0] += 2.0; if ( ny > 1 ) values[0] += 2.0; if ( nx > 1 && ny > 1 ) values[0] += 4.0; A = (HYPRE_ParCSRMatrix) GenerateLaplacian9pt(MPI_COMM_WORLD, nx, ny, px, py, mypx, mypy, values); delete [] values; (*Amat) = A; } hypre-2.33.0/src/FEI_mv/femli/driver_util.c000066400000000000000000000130011477326011500204130ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * tests for various function in this directory * *****************************************************************************/ #include #include #include "mli_utils.h" extern int mli_computespectrum_(int *,int *,double *, double *, int *, double *, double *, double *, int *); void testEigen(); void testMergeSort(); /****************************************************************************** * main program *****************************************************************************/ main() { int test=2; switch (test) { case 1 : testEigen(); case 2 : testMergeSort(); } } /****************************************************************************** * test the Fortan functin for computing eigenvalues *---------------------------------------------------------------------------*/ void testEigen() { int i, mDim=24, ierr, matz=0; double *matrix, *evalues, *evectors, *daux1, *daux2; FILE *fp; matrix = hypre_TAlloc(double, mDim * mDim , HYPRE_MEMORY_HOST); fp = fopen("test.m", "r"); if ( fp == NULL ) { printf("testEigen ERROR : file not found.\n"); exit(1); } for ( i = 0; i < mDim*mDim; i++ ) fscanf(fp, "%lg", &(matrix[i])); evectors = hypre_TAlloc(double, mDim * mDim , HYPRE_MEMORY_HOST); evalues = hypre_TAlloc(double, mDim , HYPRE_MEMORY_HOST); daux1 = hypre_TAlloc(double, mDim , HYPRE_MEMORY_HOST); daux2 = hypre_TAlloc(double, mDim , HYPRE_MEMORY_HOST); mli_computespectrum_(&mDim, &mDim, matrix, evalues, &matz, evectors, daux1, daux2, &ierr); for ( i = 0; i < mDim; i++ ) printf("eigenvalue = %e\n", evalues[i]); hypre_TFree(matrix, HYPRE_MEMORY_HOST); hypre_TFree(evectors, HYPRE_MEMORY_HOST); hypre_TFree(evalues, HYPRE_MEMORY_HOST); hypre_TFree(daux1, HYPRE_MEMORY_HOST); hypre_TFree(daux2, HYPRE_MEMORY_HOST); } /****************************************************************************** * test merge sort utility *---------------------------------------------------------------------------*/ void testMergeSort() { int i, j, nlist=7, maxLeng=20, **list, **list2, *listLengs; int newNList, *newList, *checkList, checkN, checkFlag; listLengs = hypre_TAlloc(int, nlist , HYPRE_MEMORY_HOST); list = hypre_TAlloc(int*, nlist , HYPRE_MEMORY_HOST); list2 = hypre_TAlloc(int*, nlist , HYPRE_MEMORY_HOST); for ( i = 0; i < nlist; i++ ) { list[i] = hypre_TAlloc(int, maxLeng , HYPRE_MEMORY_HOST); list2[i] = hypre_TAlloc(int, maxLeng , HYPRE_MEMORY_HOST); } listLengs[0] = 5; list[0][0] = 4; list[0][1] = 5; list[0][2] = 6; list[0][3] = 8; list[0][4] = 9; listLengs[1] = 1; list[1][0] = 10; listLengs[2] = 4; list[2][0] = 5; list[2][1] = 6; list[2][2] = 7; list[2][3] = 9; listLengs[3] = 2; list[3][0] = 10; list[3][1] = 11; listLengs[4] = 3; list[4][0] = 6; list[4][1] = 7; list[4][2] = 8; listLengs[5] = 3; list[5][0] = 10; list[5][1] = 11; list[5][2] = 12; listLengs[6] = 3; list[6][0] = 7; list[6][1] = 8; list[6][2] = 9; checkN = 0; for ( i = 0; i < nlist; i++ ) for ( j = 0; j < listLengs[i]; j++ ) list2[i][j] = checkN++; for ( i = 0; i < nlist; i++ ) MLI_Utils_IntQSort2(list[i], NULL, 0, listLengs[i]-1); for ( i = 0; i < nlist; i++ ) for ( j = 0; j < listLengs[i]; j++ ) printf("original %5d %5d = %d\n", i, j, list[i][j]); printf("MergeSort begins...\n"); MLI_Utils_IntMergeSort(nlist, listLengs, list, list2, &newNList, &newList); for ( i = 0; i < newNList; i++ ) printf("after %5d = %d\n", i, newList[i]); printf("MergeSort ends.\n"); /* for ( i = 0; i < newNList; i++ ) printf("Merge List %5d = %d\n", i, newList[i]); checkList = hypre_TAlloc(int, nlist * maxLeng , HYPRE_MEMORY_HOST); for ( i = 0; i < nlist; i++ ) for ( j = 0; j < maxLeng; j++ ) checkList[i*maxLeng+j] = list[i][j]; printf("QSort begins...\n"); MLI_Utils_IntQSort2(checkList, NULL, 0, nlist*maxLeng-1); printf("QSort ends.\n"); checkN = 1; for ( i = 1; i < nlist*maxLeng; i++ ) if ( checkList[checkN-1] != checkList[i] ) checkList[checkN++] = checkList[i]; if ( checkN != newNList ) printf("MergeSort and QSort lengths = %d %d\n", newNList, checkN); checkFlag = 0; for ( i = 0; i < newNList; i++ ) { if ( checkList[i] != newList[i] ) { printf("MergeSort and QSort discrepancy %5d = %5d %5d\n", i, newList[i], checkList[i]); checkFlag++; } } printf("MergeSort and QSort lengths = %d %d\n", newNList, checkN); if ( checkFlag == 0 ) printf("MergeSort and QSort gives same result.\n"); for ( i = 0; i < nlist; i++ ) { hypre_TFree(list[i], HYPRE_MEMORY_HOST); hypre_TFree(list2[i], HYPRE_MEMORY_HOST); } hypre_TFree(checkList , HYPRE_MEMORY_HOST); */ hypre_TFree(listLengs, HYPRE_MEMORY_HOST); hypre_TFree(list, HYPRE_MEMORY_HOST); hypre_TFree(list2, HYPRE_MEMORY_HOST); hypre_TFree(newList, HYPRE_MEMORY_HOST); } hypre-2.33.0/src/FEI_mv/femli/genTecPlot.c000066400000000000000000000063531477326011500201430ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include main(int argc, char **argv) { int i, j, ncnt, nElems, nNodes, *elemNodeList, nrows, ncols; int vecNum=0; double *nodalCoord, *eVec; char filename[100]; FILE *fp; printf("argument 1 : vector number (0 - m)\n"); printf("argument 2 : file 1 (eigenfile)\n"); printf("argument 3 : file 2 (elemConn file)\n"); printf("argument 4 : file 3 (nodal coordinate file)\n"); if (argc >= 2) sscanf(argv[1],"%d", &vecNum); printf("vecNum = %d\n", vecNum); if (argc >= 3) strcpy(filename, argv[2]); else strcpy(filename,"eVec"); fp = fopen(filename, "r"); if ( fp == NULL ) { printf("ERROR : %s file not found.\n", filename); exit(1); } fscanf(fp,"%d %d", &nrows, &ncols); eVec = hypre_TAlloc(double, nrows*ncols, HYPRE_MEMORY_HOST); for (i = 0; i < nrows; i++) for (j = 0; j < ncols; j++) fscanf(fp,"%lg", &eVec[i+j*nrows]); fclose(fp); if (argc >= 4) strcpy(filename, argv[3]); else strcpy(filename,"elemNodeList"); fp = fopen(filename, "r"); if ( fp == NULL ) { printf("ERROR : %s file not found.\n", filename); exit(1); } fscanf(fp,"%d", &nElems); elemNodeList = hypre_TAlloc(int, nElems*8, HYPRE_MEMORY_HOST); ncnt = 0; for (i = 0; i < nElems; i++) { for (j = 0; j < 8; j++) { fscanf(fp,"%d %d %d", &elemNodeList[ncnt],&elemNodeList[ncnt], &elemNodeList[ncnt]); elemNodeList[ncnt] = elemNodeList[ncnt] / 3; ncnt++; } } fclose(fp); if (argc >= 5) strcpy(filename, argv[4]); else strcpy(filename,"nodalCoord"); fp = fopen(filename, "r"); if ( fp == NULL ) { printf("ERROR : %s file not found.\n", filename); exit(1); } fscanf(fp,"%d", &nNodes); nodalCoord = hypre_TAlloc(double, nNodes*3, HYPRE_MEMORY_HOST); ncnt = 0; for (i = 0; i < nNodes; i++) { fscanf(fp,"%lg %lg %lg", &nodalCoord[ncnt],&nodalCoord[ncnt+1], &nodalCoord[ncnt+2]); ncnt += 3; } fclose(fp); if (argc >= 6) strcpy(filename, argv[5]); else strcpy(filename,"tplotout.dat"); printf("outputfile = %s\n", filename); fp = fopen(filename, "w"); fprintf(fp, "TITLE = \"ALE3D TBAR Data\"\n"); fprintf(fp, "VARIABLES = \"X\" \"Y\" \"Z\" \"U\" \"V\" \"W\"\n"); fprintf(fp, "ZONE N=%d, E=%d, F=FEPOINT, ET=BRICK\n", nNodes, nElems); fprintf(fp, "\n"); for (i = 0; i < nNodes; i++) { fprintf(fp, "%16.8e %16.8e %16.8e %16.8e %16.8e %16.8e\n", nodalCoord[i*3],nodalCoord[i*3+1],nodalCoord[i*3+2], eVec[i*3+vecNum*nrows], eVec[i*3+1+vecNum*nrows], eVec[i*3+2+vecNum*nrows]); } fprintf(fp, "\n"); ncnt = 0; for (i = 0; i < nElems; i++) { for (j = 0; j < 8; j++) fprintf(fp, "%7d ", elemNodeList[ncnt++]); fprintf(fp, "\n"); } fclose(fp); } hypre-2.33.0/src/FEI_mv/femli/mli.cxx000066400000000000000000000400301477326011500172260ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * functions for the top level MLI data structure * *****************************************************************************/ #include #include #include #include "mli.h" #include "mli_utils.h" /***************************************************************************** * constructor *---------------------------------------------------------------------------*/ MLI::MLI( MPI_Comm comm ) { #ifdef MLI_DEBUG_DETAILED printf("MLI::MLI\n"); #endif mpiComm_ = comm; maxLevels_ = 40; numLevels_ = 40; coarsestLevel_ = 0; outputLevel_ = 0; assembled_ = MLI_FALSE; tolerance_ = 1.0e-6; maxIterations_ = 20; currIter_ = 0; oneLevels_ = new MLI_OneLevel*[maxLevels_]; for (int j = 0; j < maxLevels_; j++) oneLevels_[j] = new MLI_OneLevel(this); for (int i = 0; i < maxLevels_; i++) { oneLevels_[i]->setLevelNum(i); if ( i < (maxLevels_-1) ) oneLevels_[i]->setNextLevel(oneLevels_[i+1]); if ( i > 0 ) oneLevels_[i]->setPrevLevel(oneLevels_[i-1]); } coarseSolver_ = NULL; methodPtr_ = NULL; solveTime_ = 0.0; buildTime_ = 0.0; } /***************************************************************************** * destructor *---------------------------------------------------------------------------*/ MLI::~MLI() { #ifdef MLI_DEBUG_DETAILED printf("MLI::~MLI\n"); #endif for ( int i = 0; i < maxLevels_; i++ ) delete oneLevels_[i]; delete [] oneLevels_; if ( coarseSolver_ != NULL ) delete coarseSolver_; if ( methodPtr_ != NULL ) delete methodPtr_; } /***************************************************************************** * set discretization matrix *---------------------------------------------------------------------------*/ int MLI::setSystemMatrix( int level, MLI_Matrix *A ) { #ifdef MLI_DEBUG_DETAILED printf("MLI::setSystemMatrix, level = %d\n", level); #endif if ( level >= 0 && level < maxLevels_ ) oneLevels_[level]->setAmat( A ); else { printf("MLI::setSystemMatrix ERROR : wrong level = %d\n", level); exit(1); } return 0; } /***************************************************************************** * set restriction operator *---------------------------------------------------------------------------*/ int MLI::setRestriction( int level, MLI_Matrix *R ) { #ifdef MLI_DEBUG_DETAILED printf("MLI::setRestriction, level = %d\n", level); #endif if ( level >= 0 && level < maxLevels_ ) oneLevels_[level]->setRmat( R ); else { printf("MLI::setRestriction ERROR : wrong level = %d\n", level); exit(1); } return 0; } /***************************************************************************** * set prolongation operator *---------------------------------------------------------------------------*/ int MLI::setProlongation( int level, MLI_Matrix *P ) { #ifdef MLI_DEBUG_DETAILED printf("MLI::setProlongation, level = %d\n", level); #endif if ( level >= 0 && level < maxLevels_ ) oneLevels_[level]->setPmat( P ); else { printf("MLI::setProlongation ERROR : wrong level = %d\n", level); exit(1); } return 0; } /***************************************************************************** * set smoother *---------------------------------------------------------------------------*/ int MLI::setSmoother( int level, int pre_post, MLI_Solver *smoother ) { #ifdef MLI_DEBUG_DETAILED printf("MLI::setSmoother, level = %d\n", level); #endif if ( level >= 0 && level < maxLevels_ ) { oneLevels_[level]->setSmoother( pre_post, smoother ); } else { printf("MLI::setSmoother ERROR : wrong level = %d\n", level); exit(1); } return 0; } /***************************************************************************** * set coarse solver *---------------------------------------------------------------------------*/ int MLI::setCoarseSolve( MLI_Solver *solver ) { #ifdef MLI_DEBUG_DETAILED printf("MLI::setCoarseSolve\n"); #endif if ( ! assembled_ ) coarseSolver_ = solver; else oneLevels_[coarsestLevel_]->setCoarseSolve(solver); return 0; } /***************************************************************************** * set finite element data information *---------------------------------------------------------------------------*/ int MLI::setFEData( int level, MLI_FEData *fedata, MLI_Mapper *map ) { #ifdef MLI_DEBUG_DETAILED printf("MLI::setFEData\n"); #endif if ( level >= 0 && level < maxLevels_ ) { oneLevels_[level]->setFEData( fedata, map ); } else { printf("MLI::setFEData ERROR : wrong level = %d\n", level); exit(1); } return 0; } /***************************************************************************** * set finite element data information *---------------------------------------------------------------------------*/ int MLI::setSFEI( int level, MLI_SFEI *sfei ) { #ifdef MLI_DEBUG_DETAILED printf("MLI::setSFEI\n"); #endif if ( level >= 0 && level < maxLevels_ ) { oneLevels_[level]->setSFEI( sfei ); } else { printf("MLI::setSFEI ERROR : wrong level = %d\n", level); exit(1); } return 0; } /***************************************************************************** * set cycle type at various levels *---------------------------------------------------------------------------*/ int MLI::setCyclesAtLevel( int level, int cycles ) { #ifdef MLI_DEBUG_DETAILED printf("MLI::setCyclesAtLevel at level %d, cycles = %d\n",level,cycles); #endif if ( level >= 0 && level < maxLevels_ ) { oneLevels_[level]->setCycles( cycles ); } else if ( level == -1 ) { for (int i = 0; i < maxLevels_; i++) oneLevels_[i]->setCycles( cycles ); } else { printf("MLI::setCyclesAtLevel ERROR : wrong level = %d\n",level); exit(1); } return 0; } /***************************************************************************** * set ML method *---------------------------------------------------------------------------*/ int MLI::setMethod( MLI_Method *object ) { #ifdef MLI_DEBUG_DETAILED printf("MLI::setMethod = %s\n", object->getName()); #endif methodPtr_ = object; return 0; } /***************************************************************************** * set up the grid hierarchy *---------------------------------------------------------------------------*/ int MLI::setup() { int nlevels, status=0; char paramString[100]; currIter_ = 0; buildTime_ = MLI_Utils_WTime(); sprintf( paramString, "setOutputLevel %d", outputLevel_ ); methodPtr_->setParams(paramString, 0, NULL); nlevels = methodPtr_->setup(this); coarsestLevel_ = nlevels - 1; buildTime_ = MLI_Utils_WTime() - buildTime_; for (int i = 0; i < nlevels; i++) status += oneLevels_[i]->setup(); if ( coarseSolver_ != NULL ) { oneLevels_[coarsestLevel_]->setCoarseSolve(coarseSolver_); coarseSolver_ = NULL; } assembled_ = 1; return status; } /***************************************************************************** * perform one cycle *---------------------------------------------------------------------------*/ int MLI::cycle( MLI_Vector *sol, MLI_Vector *rhs ) { oneLevels_[0]->setSolutionVector( sol ); oneLevels_[0]->setRHSVector( rhs ); int status = oneLevels_[0]->solve1Cycle(); return status; } /***************************************************************************** * perform solve *---------------------------------------------------------------------------*/ int MLI::solve( MLI_Vector *sol, MLI_Vector *rhs ) { int iter=0, mypid; double norm2, relTol, oldNorm2, zero=0.0; MLI_Matrix *Amat; MLI_Vector *res; #if 0 char paramString[30]; MLI_Solver *preSmoother; #endif /*-------------------------------------------------------------------*/ /* check for error */ /*-------------------------------------------------------------------*/ if ( ! assembled_ ) { printf("MLI::solve ERROR - setup not called yet.\n"); exit(1); } /*-------------------------------------------------------------------*/ /* if coarse solver was set before setup, put it in the coarse level */ /*-------------------------------------------------------------------*/ if ( coarseSolver_ != NULL ) { oneLevels_[coarsestLevel_]->setCoarseSolve(coarseSolver_); coarseSolver_ = NULL; } /*-------------------------------------------------------------------*/ /* compute initial residual norm and convergence tolerance */ /*-------------------------------------------------------------------*/ MPI_Comm_rank(mpiComm_, &mypid); res = oneLevels_[0]->getResidualVector(); Amat = oneLevels_[0]->getAmat(); solveTime_ = MLI_Utils_WTime(); if ( maxIterations_ == 1 ) { norm2 = 1.0; relTol = 0.1; sol->setConstantValue(zero); #if 0 strcpy( paramString, "zeroInitialGuess" ); preSmoother = oneLevels_[0]->getPreSmoother(); if (preSmoother != NULL) preSmoother->setParams(paramString, 0, NULL); #endif } else { Amat->apply( -1.0, sol, 1.0, rhs, res ); norm2 = res->norm2(); relTol = tolerance_ * norm2; if ( outputLevel_ > 0 && currIter_ == 0 ) printf("\tMLI Initial norm = %16.8e (%16.8e)\n", norm2, relTol); } while ( norm2 > relTol && iter < maxIterations_ ) { iter++; currIter_++; cycle( sol, rhs ); if ( maxIterations_ > 1 ) { Amat->apply( -1.0, sol, 1.0, rhs, res ); oldNorm2 = norm2; norm2 = res->norm2(); if ( outputLevel_ > 0 && mypid == 0 && maxIterations_ > 1 ) printf("\tMLI iteration = %5d, rnorm = %14.6e (%14.6e)\n", currIter_, norm2, norm2/oldNorm2); } if ( iter < maxIterations_ ) { oneLevels_[0]->resetSolutionVector(); oneLevels_[0]->resetRHSVector(); } } solveTime_ = MLI_Utils_WTime() - solveTime_; if ( norm2 > tolerance_ || iter >= maxIterations_ ) return 1; else return 0; } /***************************************************************************** * print *---------------------------------------------------------------------------*/ int MLI::print() { int mypid; MPI_Comm_rank(mpiComm_, &mypid); if ( mypid == 0 ) { printf("\t***************** MLI Information *********************\n"); printf("\t*** maxLevels = %d\n", maxLevels_); printf("\t*** output level = %d\n", outputLevel_); printf("\t*** max iterations = %d\n", maxIterations_); printf("\t*** tolerance = %e\n", tolerance_); printf("\t*******************************************************\n"); } return 0; } /***************************************************************************** * output timing information *---------------------------------------------------------------------------*/ int MLI::printTiming() { int mypid; MPI_Comm_rank( mpiComm_, &mypid ); if ( mypid == 0 ) { printf("\t***************** MLI Timing Information **************\n"); printf("\t*** MLI Build time = %e seconds\n", buildTime_); printf("\t*** MLI Solve time = %e seconds\n", solveTime_); printf("\t*******************************************************\n"); } return 0; } /***************************************************************************** * get oneLevel object *---------------------------------------------------------------------------*/ MLI_OneLevel* MLI::getOneLevelObject( int level ) { if ( level >= 0 && level < maxLevels_ ) return oneLevels_[level]; else { printf("MLI::getOneLevelObject ERROR : wrong level = %d\n", level); return NULL; } } /***************************************************************************** * get system matrix *---------------------------------------------------------------------------*/ MLI_Matrix* MLI::getSystemMatrix( int level ) { if ( level >= 0 && level < maxLevels_ ) return oneLevels_[level]->getAmat(); else { printf("MLI::getSystemMatrix ERROR : wrong level = %d\n", level); return NULL; } } /***************************************************************************** * get prolongation operator *---------------------------------------------------------------------------*/ MLI_Matrix* MLI::getProlongation( int level ) { if ( level >= 0 && level < maxLevels_ ) return oneLevels_[level]->getPmat(); else { printf("MLI::getProlongation ERROR : wrong level = %d\n", level); return NULL; } } /***************************************************************************** * get restriction operator *---------------------------------------------------------------------------*/ MLI_Matrix* MLI::getRestriction( int level ) { if ( level >= 0 && level < maxLevels_ ) return oneLevels_[level]->getRmat(); else { printf("MLI::getRestriction ERROR : wrong level = %d\n", level); return NULL; } } /***************************************************************************** * get smoother *---------------------------------------------------------------------------*/ MLI_Solver* MLI::getSmoother( int level, int pre_post ) { if ( level >= 0 && level < maxLevels_ ) { if ( pre_post == MLI_SMOOTHER_PRE ) return oneLevels_[level]->getPreSmoother(); else if ( pre_post == MLI_SMOOTHER_POST ) return oneLevels_[level]->getPostSmoother(); else { printf("MLI::getSmoother ERROR : pre or post ? \n"); return ((MLI_Solver *) NULL); } } else { printf("MLI::getRestriction ERROR : wrong level = %d\n", level); return ((MLI_Solver *) NULL); } } /***************************************************************************** * get fedata *---------------------------------------------------------------------------*/ MLI_FEData* MLI::getFEData( int level ) { if ( level >= 0 && level < maxLevels_ ) return oneLevels_[level]->getFEData(); else { printf("MLI::getFEData ERROR : wrong level = %d\n", level); return ((MLI_FEData *) NULL); } } /***************************************************************************** * get sfei *---------------------------------------------------------------------------*/ MLI_SFEI* MLI::getSFEI( int level ) { if ( level >= 0 && level < maxLevels_ ) return oneLevels_[level]->getSFEI(); else { printf("MLI::getSFEI ERROR : wrong level = %d\n", level); return ((MLI_SFEI *) NULL); } } /***************************************************************************** * get node to equation map *---------------------------------------------------------------------------*/ MLI_Mapper* MLI::getNodeEqnMap( int level ) { if ( level >= 0 && level < maxLevels_ ) return oneLevels_[level]->getNodeEqnMap(); else { printf("MLI::getNodeEqnMap ERROR : wrong level = %d\n", level); return ((MLI_Mapper *) NULL); } } /***************************************************************************** * reset discretization matrix *---------------------------------------------------------------------------*/ int MLI::resetSystemMatrix( int level ) { #ifdef MLI_DEBUG_DETAILED printf("MLI::resetSystemMatrix, level = %d\n", level); #endif if ( level >= 0 && level < maxLevels_ ) oneLevels_[level]->resetAmat(); else { printf("MLI::resetSystemMatrix ERROR : wrong level = %d\n", level); exit(1); } return 0; } hypre-2.33.0/src/FEI_mv/femli/mli.h000066400000000000000000000074161477326011500166660ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * Header info for the top level MLI data structure * *****************************************************************************/ #ifndef __MLIH__ #define __MLIH__ #define MLI_VCYCLE 0 #define MLI_WCYCLE 1 /*-------------------------------------------------------------------------- * include files *--------------------------------------------------------------------------*/ #include "_hypre_utilities.h" #include "mli_defs.h" #include "mli_solver.h" #include "mli_method.h" #include "mli_matrix.h" #include "mli_vector.h" #include "mli_fedata.h" #include "mli_sfei.h" #include "mli_mapper.h" #include "mli_oneLevel.h" class MLI_OneLevel; class MLI_Method; /*-------------------------------------------------------------------------- * MLI data structure declaration *--------------------------------------------------------------------------*/ class MLI { MPI_Comm mpiComm_; /* MPI communicator */ int maxLevels_; /* maximum number of levels */ int numLevels_; /* number of levels requested by user */ int coarsestLevel_; /* indicate the coarsest level number */ int outputLevel_; /* for diagnostics */ double tolerance_; /* for convergence check */ int maxIterations_; /* termination criterion */ int currIter_; /* current iteration (within ML) */ MLI_OneLevel **oneLevels_; /* store information for each level */ MLI_Solver *coarseSolver_; /* temporarily store the coarse solver*/ MLI_Method *methodPtr_; /* data object for a given method */ int assembled_; /* indicate MG hierarchy is assembled */ double solveTime_; double buildTime_; public : MLI( MPI_Comm mpiComm); ~MLI(); int setOutputLevel( int level ) { outputLevel_ = level; return 0;} int setTolerance( double tol ) { tolerance_ = tol; return 0;} int setMaxIterations( int iter ) { maxIterations_ = iter; return 0;} int setNumLevels(int levels) { numLevels_ = levels; return 0;} int setSystemMatrix( int level, MLI_Matrix *Amat ); int setRestriction( int level, MLI_Matrix *Rmat ); int setProlongation( int level, MLI_Matrix *Pmat ); int setSmoother( int level , int prePost, MLI_Solver *solver ); int setFEData( int level, MLI_FEData *fedata, MLI_Mapper *map ); int setSFEI( int level, MLI_SFEI *sfei ); int setCoarseSolve( MLI_Solver *solver ); int setCyclesAtLevel(int level, int cycles); int setMethod( MLI_Method *method_data ); int setup(); int cycle( MLI_Vector *sol, MLI_Vector *rhs ); int solve( MLI_Vector *sol, MLI_Vector *rhs ); int print(); int printTiming(); MLI_OneLevel *getOneLevelObject( int level ); MLI_Matrix *getSystemMatrix( int level ); MLI_Matrix *getProlongation( int level ); MLI_Matrix *getRestriction( int level ); MLI_Solver *getSmoother( int level, int pre_post ); MLI_FEData *getFEData( int level ); MLI_SFEI *getSFEI( int level ); MLI_Mapper *getNodeEqnMap( int level ); int resetSystemMatrix( int level ); int getNumLevels() { return numLevels_; } MLI_Method *getMethod() { return methodPtr_; } }; #endif hypre-2.33.0/src/FEI_mv/femli/mli_amgsa_calib.cxx000066400000000000000000000346551477326011500215500ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ // ********************************************************************* // This function is a first experiment to study calibrated smoothed // aggregation methods. Users first load the first set of null space // vectors, and subsequent generation of addition approximate null space // vectors are based on the previous set. // ********************************************************************* // ********************************************************************* // This file is customized to use HYPRE matrix format // ********************************************************************* // ********************************************************************* // local includes // --------------------------------------------------------------------- #include #include "HYPRE.h" #include "_hypre_utilities.h" #include "HYPRE_IJ_mv.h" #include "seq_mv.h" #include "_hypre_parcsr_mv.h" #include "mli_method_amgsa.h" #include "mli_utils.h" /*********************************************************************** * generate multilevel structure using an adaptive method * --------------------------------------------------------------------- */ int MLI_Method_AMGSA::setupCalibration( MLI *mli ) { int mypid, nprocs, *partition, ndofs, nrows, n_null; int i, j, k, level, local_nrows, relax_num, targc, calib_size_tmp; double *dble_array, *relax_wts, start_time; double *sol_data, *nullspace_store, dtime, *Q_array, *R_array; char param_string[100], **targv; MLI_Matrix *mli_Amat; MLI_Vector *mli_rhs, *mli_sol; MLI *new_mli; MPI_Comm comm; MLI_Method *new_amgsa; hypre_Vector *sol_local; hypre_ParVector *trial_sol, *zero_rhs; hypre_ParCSRMatrix *hypreA; #ifdef MLI_DEBUG_DETAILED printf("MLI_Method_AMGSA::setupCalibration begins...\n"); #endif /* --------------------------------------------------------------- */ /* fetch machine and matrix information */ /* --------------------------------------------------------------- */ comm = getComm(); MPI_Comm_rank( comm, &mypid ); MPI_Comm_size( comm, &nprocs ); mli_Amat = mli->getSystemMatrix( 0 ); hypreA = (hypre_ParCSRMatrix *) mli_Amat->getMatrix(); targv = new char*[4]; /* --------------------------------------------------------------- */ /* create trial vectors for calibration (trial_sol, zero_rhs) */ /* --------------------------------------------------------------- */ HYPRE_ParCSRMatrixGetRowPartitioning((HYPRE_ParCSRMatrix) hypreA, &partition); trial_sol = hypre_ParVectorCreate(comm, partition[nprocs], partition); hypre_ParVectorInitialize( trial_sol ); HYPRE_ParCSRMatrixGetRowPartitioning((HYPRE_ParCSRMatrix) hypreA, &partition); local_nrows = partition[mypid+1] - partition[mypid]; zero_rhs = hypre_ParVectorCreate(comm, partition[nprocs], partition); hypre_ParVectorInitialize( zero_rhs ); hypre_ParVectorSetConstantValues( zero_rhs, 0.0 ); sol_local = hypre_ParVectorLocalVector(trial_sol); sol_data = hypre_VectorData(sol_local); /* --------------------------------------------------------------- */ /* fetch initial set of null space */ /* --------------------------------------------------------------- */ getNullSpace(ndofs, n_null, nullspace_store, nrows); if ( nullspace_store != NULL ) { dble_array = nullspace_store; nullspace_store = new double[nrows*(n_null+calibrationSize_)]; for (i = 0; i < nrows*n_null; i++) nullspace_store[i] = dble_array[i]; delete [] dble_array; } else { nrows = local_nrows; nullspace_store = new double[nrows*(n_null+calibrationSize_)]; for ( j = 0; j < n_null; j++ ) { for ( k = 0; k < nrows; k++ ) if ( k % n_null == j ) nullspace_store[j*nrows+k] = 1.0; else nullspace_store[j*nrows+k] = 0.0; } } /* --------------------------------------------------------------- */ /* clone the method definition (use SGS as approx coarse solver) */ /* And allocate temporaray arrays for QR decomposition. */ /* --------------------------------------------------------------- */ relax_num = 20; relax_wts = new double[relax_num]; for ( i = 0; i < relax_num; i++ ) relax_wts[i] = 1.0; new_amgsa = MLI_Method_CreateFromID( MLI_METHOD_AMGSA_ID, comm ); copy( new_amgsa ); sprintf( param_string, "setCoarseSolver SGS" ); targc = 2; targv[0] = (char *) &relax_num; targv[1] = (char *) relax_wts; new_amgsa->setParams( param_string, targc, targv ); Q_array = new double[nrows*(n_null+calibrationSize_)]; R_array = new double[(n_null+calibrationSize_)*(n_null+calibrationSize_)]; new_mli = new MLI( comm ); new_mli->setMaxIterations(2); new_mli->setMethod( new_amgsa ); new_mli->setSystemMatrix( 0, mli_Amat ); /* --------------------------------------------------------------- */ /* recover the other null space vectors */ /* --------------------------------------------------------------- */ start_time = MLI_Utils_WTime(); for ( i = 0; i < calibrationSize_; i++ ) { /* ------------------------------------------------------------ */ /* set the current set of null space vectors */ /* ------------------------------------------------------------ */ sprintf( param_string, "setNullSpace" ); targc = 4; targv[0] = (char *) &ndofs; targv[1] = (char *) &n_null; targv[2] = (char *) nullspace_store; targv[3] = (char *) &nrows; new_amgsa->setParams( param_string, targc, targv ); dtime = time_getWallclockSeconds(); /* ------------------------------------------------------------ */ /* use random initial vectors for now and then call setup */ /* ------------------------------------------------------------ */ hypre_ParVectorSetRandomValues( trial_sol, (int) dtime ); new_mli->setup(); /* ------------------------------------------------------------ */ /* solve using a random initial vector and a zero rhs */ /* ------------------------------------------------------------ */ sprintf(param_string, "HYPRE_ParVector"); mli_sol = new MLI_Vector( (void*) trial_sol, param_string, NULL ); mli_rhs = new MLI_Vector( (void*) zero_rhs, param_string, NULL ); new_mli->cycle( mli_sol, mli_rhs ); /* ------------------------------------------------------------ */ /* add the new approximate null space vector to the current set */ /* ------------------------------------------------------------ */ for ( j = nrows*n_null; j < nrows*(n_null+1); j++ ) nullspace_store[j] = sol_data[j-nrows*n_null]; n_null++; for ( j = 0; j < nrows*n_null; j++ ) Q_array[j] = nullspace_store[j]; #if 0 MLI_Utils_QR( Q_array, R_array, nrows, n_null ); for ( j = 0; j < n_null; j++ ) printf("P%d : Norm of Null %d = %e\n", mypid,j,R_array[j*n_null+j]); #endif } totalTime_ += ( MLI_Utils_WTime() - start_time ); /* --------------------------------------------------------------- */ /* store the new set of null space vectors, and call mli setup */ /* --------------------------------------------------------------- */ setNullSpace(ndofs, n_null, nullspace_store, nrows); calib_size_tmp = calibrationSize_; calibrationSize_ = 0; level = setup( mli ); calibrationSize_ = calib_size_tmp; /* --------------------------------------------------------------- */ /* clean up */ /* --------------------------------------------------------------- */ new_mli->resetSystemMatrix(0); delete new_mli; delete [] Q_array; delete [] R_array; delete [] relax_wts; delete [] targv; delete [] nullspace_store; hypre_ParVectorDestroy( trial_sol ); hypre_ParVectorDestroy( zero_rhs ); #ifdef MLI_DEBUG_DETAILED printf("MLI_Method_AMGSA::setupCalibration ends.\n"); #endif return level; } /*********************************************************************** * generate multilevel structure using an adaptive method (not done yet) * --------------------------------------------------------------------- */ #if 0 int MLI_Method_AMGSA::setupCalibration( MLI *mli ) { int mypid, nprocs, *partition, ndofs, nrows, n_null; int i, j, k, level, local_nrows, relax_num, targc, calib_size_tmp; double *dble_array, *relax_wts, start_time; double *sol_data, *nullspace_store, dtime, *Q_array, *R_array; char param_string[100], **targv; MLI_Matrix *mli_Amat; MLI_Vector *mli_rhs, *mli_sol; MLI *new_mli; MPI_Comm comm; MLI_Method *new_amgsa; hypre_Vector *sol_local; hypre_ParVector *trial_sol, *zero_rhs; hypre_ParCSRMatrix *hypreA; #ifdef MLI_DEBUG_DETAILED printf("MLI_Method_AMGSA::setupCalibration begins...\n"); #endif /* --------------------------------------------------------------- */ /* fetch machine and matrix information */ /* --------------------------------------------------------------- */ comm = getComm(); MPI_Comm_rank( comm, &mypid ); MPI_Comm_size( comm, &nprocs ); mli_Amat = mli->getSystemMatrix( 0 ); hypreA = (hypre_ParCSRMatrix *) mli_Amat->getMatrix(); targv = new char*[4]; HYPRE_ParCSRMatrixGetRowPartitioning((HYPRE_ParCSRMatrix) hypreA, &partition); local_nrows = partition[mypid+1] - partition[mypid]; free( partition ); /* --------------------------------------------------------------- */ /* fetch initial set of null space */ /* --------------------------------------------------------------- */ getNullSpace(ndofs, n_null, nullspace_store, nrows); if ( nullspace_store != NULL ) delete [] nullspace_store; n_null = 0; nrows = local_nrows; /* --------------------------------------------------------------- */ /* create trial vectors for calibration (trial_sol, zero_rhs) */ /* --------------------------------------------------------------- */ HYPRE_ParCSRMatrixGetRowPartitioning((HYPRE_ParCSRMatrix) hypreA, &partition); trial_sol = hypre_ParVectorCreate(comm, partition[nprocs], partition); hypre_ParVectorInitialize( trial_sol ); hypre_ParVectorSetRandomValues( trial_sol, (int) dtime ); HYPRE_ParCSRMatrixGetRowPartitioning((HYPRE_ParCSRMatrix) hypreA, &partition); zero_rhs = hypre_ParVectorCreate(comm, partition[nprocs], partition); hypre_ParVectorInitialize( zero_rhs ); hypre_ParVectorSetConstantValues( zero_rhs, 0.0 ); sol_data = hypre_VectorData(hypre_ParVectorLocalVector(trial_sol)); sprintf(param_string, "HYPRE_ParVector"); mli_sol = new MLI_Vector( (void*) trial_sol, param_string, NULL ); mli_rhs = new MLI_Vector( (void*) zero_rhs, param_string, NULL ); /* --------------------------------------------------------------- */ /* compute approximate null vectors */ /* --------------------------------------------------------------- */ start_time = MLI_Utils_WTime(); new_mli = NULL; for ( i = 0; i < calibrationSize_; i++ ) { dtime = time_getWallclockSeconds(); hypre_ParVectorSetRandomValues( trial_sol, (int) dtime ); if ( i == 0 ) { smoother_ptr->solve(mli_rhs, mli_sol); } else { new_mli->cycle( mli_sol, mli_rhs ); if (new_amgsa != NULL) delete new_amgsa; if (new_mli != NULL) delete new_mli; delete mli_sol; delete mli_rhs; } /* ------------------------------------------------------------ */ /* clone new amgsa and mli */ /* ------------------------------------------------------------ */ new_amgsa = MLI_Method_CreateFromID( MLI_METHOD_AMGSA_ID, comm ); copy( new_amgsa ); new_amgsa->setNumLevels(2); new_mli = new MLI( comm ); new_mli->setMaxIterations(2); new_mli->setMethod( new_amgsa ); new_mli->setSystemMatrix( 0, mli_Amat ); /* ------------------------------------------------------------ */ /* construct and initialize the new null space */ /* ------------------------------------------------------------ */ offset = local_nrows * n_null; for (i = offset; i < offset+local_nrows; i++) nullspace_store[i] = sol_data[i-offset]; n_null++; sprintf( param_string, "setNullSpace" ); targc = 4; targv[0] = (char *) &ndofs; targv[1] = (char *) &n_null; targv[2] = (char *) nullspace_store; targv[3] = (char *) &nrows; new_amgsa->setParams( param_string, targc, targv ); if ( i < calibrationSize_-1 ) new_mli->setup(); } delete new_amgsa; delete new_mli; totalTime_ += ( MLI_Utils_WTime() - start_time ); /* --------------------------------------------------------------- */ /* store the new set of null space vectors, and call mli setup */ /* --------------------------------------------------------------- */ setNullSpace(ndofs, n_null, nullspace_store, nrows); calib_size_tmp = calibrationSize_; calibrationSize_ = 0; level = setup( mli ); calibrationSize_ = calib_size_tmp; /* --------------------------------------------------------------- */ /* clean up */ /* --------------------------------------------------------------- */ new_mli->resetSystemMatrix(0); delete new_mli; delete [] Q_array; delete [] R_array; delete [] relax_wts; delete [] targv; delete [] nullspace_store; hypre_ParVectorDestroy( trial_sol ); hypre_ParVectorDestroy( zero_rhs ); #ifdef MLI_DEBUG_DETAILED printf("MLI_Method_AMGSA::setupCalibration ends.\n"); #endif return level; } #endif hypre-2.33.0/src/FEI_mv/femli/mli_amgsa_coarsen1.cxx000066400000000000000000002055431477326011500222050ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ // ********************************************************************* // This file is customized to use HYPRE matrix format // ********************************************************************* // ********************************************************************* // local includes // --------------------------------------------------------------------- #include #include #include "HYPRE.h" #include "_hypre_utilities.h" #include "HYPRE_IJ_mv.h" #include "seq_mv.h" #include "_hypre_parcsr_mv.h" #include "mli_vector.h" #include "mli_method_amgsa.h" #include "mli_utils.h" #include "mli_solver.h" #include "mli_solver_sgs.h" // ********************************************************************* // local defines // --------------------------------------------------------------------- #define MLI_METHOD_AMGSA_READY -1 #define MLI_METHOD_AMGSA_SELECTED -2 #define MLI_METHOD_AMGSA_PENDING -3 #define MLI_METHOD_AMGSA_NOTSELECTED -4 #define habs(x) ((x > 0 ) ? x : -(x)) // ********************************************************************* // Purpose : Given Amat and aggregation information, create the // corresponding Pmat using the local aggregation scheme // --------------------------------------------------------------------- double MLI_Method_AMGSA::genP(MLI_Matrix *mli_Amat, MLI_Matrix **Pmat_out, int initCount, int *initAggr) { HYPRE_IJMatrix IJPmat; hypre_ParCSRMatrix *Amat, *A2mat, *Pmat, *Gmat=NULL, *Jmat, *Pmat2; hypre_ParCSRCommPkg *comm_pkg; MLI_Matrix *mli_Pmat, *mli_Jmat, *mli_A2mat=NULL; MLI_Function *funcPtr; MPI_Comm comm; int i, j, k, index, irow, mypid, numProcs, AStartRow, AEndRow; int ALocalNRows, *partition, naggr, *node2aggr, *eqn2aggr, ierr; int PLocalNCols, PStartCol, PGlobalNCols, *colInd, *P_cols; int PLocalNRows, PStartRow, *rowLengths, rowNum, GGlobalNRows; int blkSize, maxAggSize, *aggCntArray, **aggIndArray; int aggSize, info, nzcnt, *localLabels=NULL, AGlobalNRows; double *colVal, **P_vecs, maxEigen=0, alpha, dtemp; double *qArray, *newNull, *rArray, ritzValues[2]; char paramString[200]; /*----------------------------------------------------------------- * fetch matrix and machine information *-----------------------------------------------------------------*/ Amat = (hypre_ParCSRMatrix *) mli_Amat->getMatrix(); #if 0 sprintf(paramString, "matrix%d", currLevel_); hypre_ParCSRMatrixPrintIJ(Amat, 1, 1, paramString); printf("matrix %s printed\n", paramString); #endif comm = hypre_ParCSRMatrixComm(Amat); MPI_Comm_rank(comm,&mypid); MPI_Comm_size(comm,&numProcs); /*----------------------------------------------------------------- * fetch other matrix information *-----------------------------------------------------------------*/ HYPRE_ParCSRMatrixGetRowPartitioning((HYPRE_ParCSRMatrix) Amat,&partition); AStartRow = partition[mypid]; AEndRow = partition[mypid+1] - 1; AGlobalNRows = partition[numProcs]; ALocalNRows = AEndRow - AStartRow + 1; free( partition ); if ( AGlobalNRows < minCoarseSize_ ) { if ( mypid == 0 && outputLevel_ > 2 ) { printf("\tMETHOD_AMGSA::genP - stop coarsening (less than min %d)\n", minCoarseSize_); } (*Pmat_out) = NULL; return 0.0; } /*----------------------------------------------------------------- * read aggregate information if desired *-----------------------------------------------------------------*/ #if 0 /* read aggregate info from stdin */ if (currLevel_ == 0) { FILE *file; printf("reading aggregates from marker file, n=%d\n",ALocalNRows); file = stdin; initCount = 0; initAggr = new int[ALocalNRows]; for (i=0; i initCount) initCount = initAggr[i]; } initCount++; printf("number of aggregates = %d\n", initCount); } #endif /*----------------------------------------------------------------- * reduce Amat based on the block size information (if nodeDofs_ > 1) *-----------------------------------------------------------------*/ if ( initAggr == NULL ) { blkSize = currNodeDofs_; if (blkSize > 1 && scalar_ == 0) { MLI_Matrix_Compress(mli_Amat, blkSize, &mli_A2mat); if ( saLabels_ != NULL && saLabels_[currLevel_] != NULL ) { localLabels = new int[ALocalNRows/blkSize]; for ( i = 0; i < ALocalNRows; i+=blkSize ) localLabels[i/blkSize] = saLabels_[currLevel_][i]; } else localLabels = NULL; } else { mli_A2mat = mli_Amat; if ( saLabels_ != NULL && saLabels_[currLevel_] != NULL ) localLabels = saLabels_[currLevel_]; else localLabels = NULL; } A2mat = (hypre_ParCSRMatrix *) mli_A2mat->getMatrix(); } /*----------------------------------------------------------------- * modify minimum aggregate size, if needed *-----------------------------------------------------------------*/ if ( scalar_ == 0 ) { minAggrSize_ = nullspaceDim_ / currNodeDofs_; if ( minAggrSize_ <= 1 ) minAggrSize_ = 2; if ( currLevel_ == (numLevels_-1) ) minAggrSize_ = 2; } else minAggrSize_ = nullspaceDim_ * 2; if (currLevel_ == 0) minAggrSize_ = minAggrSize_ * 3 / 2; /*----------------------------------------------------------------- * perform coarsening (If aggregate information is not given, then * if dimension of A is small enough and hybrid is on, switch to * global coarsening. Otherwise if the scheme is local, do local * coarsening). *-----------------------------------------------------------------*/ if ( initAggr == NULL ) { GGlobalNRows = hypre_ParCSRMatrixGlobalNumRows(A2mat); if ( GGlobalNRows <= minAggrSize_*numProcs ) { formGlobalGraph(A2mat, &Gmat); coarsenGlobal(Gmat, &naggr, &node2aggr); hypre_ParCSRMatrixDestroy(Gmat); } else if ( GGlobalNRows > minAggrSize_*numProcs ) { formLocalGraph(A2mat, &Gmat, localLabels); coarsenLocal(Gmat, &naggr, &node2aggr); hypre_ParCSRMatrixDestroy(Gmat); } if ( blkSize > 1 && scalar_ == 0 ) { if ( saLabels_ != NULL && saLabels_[currLevel_] != NULL ) if (localLabels != NULL) delete [] localLabels; if (mli_A2mat != NULL) delete mli_A2mat; } } else { blkSize = currNodeDofs_; naggr = initCount; node2aggr = new int[ALocalNRows]; for ( i = 0; i < ALocalNRows; i++ ) node2aggr[i] = initAggr[i]; } /*----------------------------------------------------------------- * create global P *-----------------------------------------------------------------*/ if ( (initAggr == NULL) & (numSmoothVec_ == 0) ) { if ( GGlobalNRows <= minAggrSize_*numProcs ) { genPGlobal(Amat, Pmat_out, naggr, node2aggr); if (node2aggr != NULL) delete [] node2aggr; return 1.0e39; } } /*----------------------------------------------------------------- * fetch the coarse grid information and instantiate P * If coarse grid size is below a given threshold, stop *-----------------------------------------------------------------*/ PLocalNCols = naggr * nullspaceDim_; MLI_Utils_GenPartition(comm, PLocalNCols, &partition); PStartCol = partition[mypid]; PGlobalNCols = partition[numProcs]; free( partition ); if ( PGlobalNCols > AGlobalNRows*3/4 ) { (*Pmat_out) = NULL; delete [] node2aggr; if ( mypid == 0 && outputLevel_ > 2 ) { printf("METHOD_AMGSA::genP - cannot coarsen any further.\n"); } return 0.0; } PLocalNRows = ALocalNRows; PStartRow = AStartRow; ierr = HYPRE_IJMatrixCreate(comm,PStartRow,PStartRow+PLocalNRows-1, PStartCol,PStartCol+PLocalNCols-1,&IJPmat); ierr = HYPRE_IJMatrixSetObjectType(IJPmat, HYPRE_PARCSR); hypre_assert(!ierr); /*----------------------------------------------------------------- * expand the aggregation information if block size > 1 ==> eqn2aggr *-----------------------------------------------------------------*/ if ( blkSize > 1 && initAggr == NULL && scalar_ == 0 ) { eqn2aggr = new int[ALocalNRows]; for ( i = 0; i < ALocalNRows; i++ ) eqn2aggr[i] = node2aggr[i/blkSize]; delete [] node2aggr; } else eqn2aggr = node2aggr; /*----------------------------------------------------------------- * construct the next set of labels for the next level *-----------------------------------------------------------------*/ if ( saLabels_ != NULL && saLabels_[currLevel_] != NULL ) { if ( (currLevel_+1) < maxLevels_ ) { if ( saLabels_[currLevel_+1] != NULL ) delete [] saLabels_[currLevel_+1]; saLabels_[currLevel_+1] = new int[PLocalNCols]; for ( i = 0; i < PLocalNCols; i++ ) saLabels_[currLevel_+1][i] = -1; for ( i = 0; i < naggr; i++ ) { for ( j = 0; j < ALocalNRows; j++ ) if ( eqn2aggr[j] == i ) break; for ( k = 0; k < nullspaceDim_; k++ ) saLabels_[currLevel_+1][i*nullspaceDim_+k] = saLabels_[currLevel_][j]; } for ( i = 0; i < PLocalNCols; i++ ) if ( saLabels_[currLevel_+1][i] < 0 || saLabels_[currLevel_+1][i] >= naggr ) printf("saLabels[%d][%d] = %d (%d)\n",currLevel_+1,i, saLabels_[currLevel_+1][i], naggr); } } /*----------------------------------------------------------------- * compute smoothing factor for the prolongation smoother *-----------------------------------------------------------------*/ if ( (currLevel_ >= SPLevel_ && Pweight_ != 0.0) || !strcmp(preSmoother_, "MLS") || !strcmp(postSmoother_, "MLS")) { MLI_Utils_ComputeExtremeRitzValues(Amat, ritzValues, 1); maxEigen = ritzValues[0]; if ( mypid == 0 && outputLevel_ > 1 ) printf("\tEstimated spectral radius of A = %e\n", maxEigen); hypre_assert ( maxEigen > 0.0 ); alpha = Pweight_ / maxEigen; } /*----------------------------------------------------------------- * create smooth vectors if this option was chosen *-----------------------------------------------------------------*/ if (currLevel_ == 0 && numSmoothVec_ != 0) formSmoothVec(mli_Amat); //formSmoothVecLanczos(mli_Amat); if (currLevel_ > 0 && numSmoothVec_ != 0) smoothTwice(mli_Amat); /*----------------------------------------------------------------- * create a compact form for the null space vectors * (get ready to perform QR on them) *-----------------------------------------------------------------*/ P_vecs = new double*[nullspaceDim_]; P_cols = new int[PLocalNRows]; for (i = 0; i < nullspaceDim_; i++) P_vecs[i] = new double[PLocalNRows]; for ( irow = 0; irow < PLocalNRows; irow++ ) { if ( eqn2aggr[irow] >= 0 ) { P_cols[irow] = PStartCol + eqn2aggr[irow] * nullspaceDim_; if ( nullspaceVec_ != NULL ) { for ( j = 0; j < nullspaceDim_; j++ ) P_vecs[j][irow] = nullspaceVec_[j*PLocalNRows+irow]; } else { for ( j = 0; j < nullspaceDim_; j++ ) { if ( irow % nullspaceDim_ == j ) P_vecs[j][irow] = 1.0; else P_vecs[j][irow] = 0.0; } } } else { P_cols[irow] = -1; for ( j = 0; j < nullspaceDim_; j++ ) P_vecs[j][irow] = 0.0; } } /*----------------------------------------------------------------- * perform QR for null space *-----------------------------------------------------------------*/ newNull = NULL; if ( PLocalNRows > 0 && numSmoothVec_ == 0) { /* ------ count the size of each aggregate ------ */ aggCntArray = new int[naggr]; for ( i = 0; i < naggr; i++ ) aggCntArray[i] = 0; for ( irow = 0; irow < PLocalNRows; irow++ ) if ( eqn2aggr[irow] >= 0 ) aggCntArray[eqn2aggr[irow]]++; maxAggSize = 0; for ( i = 0; i < naggr; i++ ) if (aggCntArray[i] > maxAggSize) maxAggSize = aggCntArray[i]; /* ------ register which equation is in which aggregate ------ */ aggIndArray = new int*[naggr]; for ( i = 0; i < naggr; i++ ) { aggIndArray[i] = new int[aggCntArray[i]]; aggCntArray[i] = 0; } for ( irow = 0; irow < PLocalNRows; irow++ ) { index = eqn2aggr[irow]; if ( index >= 0 ) aggIndArray[index][aggCntArray[index]++] = irow; } /* ------ allocate storage for QR factorization ------ */ qArray = new double[maxAggSize * nullspaceDim_]; rArray = new double[nullspaceDim_ * nullspaceDim_]; newNull = new double[naggr*nullspaceDim_*nullspaceDim_]; /* ------ perform QR on each aggregate ------ */ for ( i = 0; i < naggr; i++ ) { aggSize = aggCntArray[i]; if ( aggSize < nullspaceDim_ ) { printf("Aggregation ERROR : underdetermined system in QR.\n"); printf(" error on Proc %d\n", mypid); printf(" error on aggr %d (%d)\n", i, naggr); printf(" aggr size is %d\n", aggSize); exit(1); } /* ------ put data into the temporary array ------ */ for ( j = 0; j < aggSize; j++ ) { for ( k = 0; k < nullspaceDim_; k++ ) qArray[aggSize*k+j] = P_vecs[k][aggIndArray[i][j]]; } /* ------ call QR function ------ */ #if 0 if ( mypid == 0 && i == 0) { for ( j = 0; j < aggSize; j++ ) { printf("%5d : (size=%d)\n", aggIndArray[i][j], aggSize); for ( k = 0; k < nullspaceDim_; k++ ) printf("%10.3e ", qArray[aggSize*k+j]); printf("\n"); } } #endif if ( currLevel_ < (numLevels_-1) ) { info = MLI_Utils_QR(qArray, rArray, aggSize, nullspaceDim_); if (info != 0) { printf("%4d : Aggregation WARNING : QR returns non-zero for\n", mypid); printf(" aggregate %d, size = %d, info = %d\n",i,aggSize,info); #if 0 /* for ( j = 0; j < aggSize; j++ ) { for ( k = 0; k < nullspaceDim_; k++ ) qArray[aggSize*k+j] = P_vecs[k][aggIndArray[i][j]]; } */ printf("PArray : \n"); for ( j = 0; j < aggSize; j++ ) { index = aggIndArray[i][j];; printf("%5d : ", index); for ( k = 0; k < nullspaceDim_; k++ ) printf("%16.8e ", P_vecs[k][index]); printf("\n"); } printf("RArray : \n"); for ( j = 0; j < nullspaceDim_; j++ ) { for ( k = 0; k < nullspaceDim_; k++ ) printf("%16.8e ", rArray[j+nullspaceDim_*k]); printf("\n"); } #endif } } else { for ( k = 0; k < nullspaceDim_; k++ ) { dtemp = 0.0; for ( j = 0; j < aggSize; j++ ) dtemp += qArray[aggSize*k+j] * qArray[aggSize*k+j]; dtemp = 1.0 / sqrt(dtemp); for ( j = 0; j < aggSize; j++ ) qArray[aggSize*k+j] *= dtemp; } } /* ------ after QR, put the R into the next null space ------ */ for ( j = 0; j < nullspaceDim_; j++ ) for ( k = 0; k < nullspaceDim_; k++ ) newNull[i*nullspaceDim_+j+k*naggr*nullspaceDim_] = rArray[j+nullspaceDim_*k]; /* ------ put the P to P_vecs ------ */ for ( j = 0; j < aggSize; j++ ) { for ( k = 0; k < nullspaceDim_; k++ ) { index = aggIndArray[i][j]; P_vecs[k][index] = qArray[ k*aggSize + j ]; } } } for ( i = 0; i < naggr; i++ ) delete [] aggIndArray[i]; delete [] aggIndArray; delete [] aggCntArray; delete [] qArray; delete [] rArray; } else if ( PLocalNRows > 0 && numSmoothVec_ != 0) { double *uArray, *sArray, *vtArray, *workArray; // printf("using SVD and numSmoothVec_ = %d\n", numSmoothVec_); /* ------ count the size of each aggregate ------ */ aggCntArray = new int[naggr]; for ( i = 0; i < naggr; i++ ) aggCntArray[i] = 0; for ( irow = 0; irow < PLocalNRows; irow++ ) if ( eqn2aggr[irow] >= 0 ) aggCntArray[eqn2aggr[irow]]++; maxAggSize = 0; for ( i = 0; i < naggr; i++ ) if (aggCntArray[i] > maxAggSize) maxAggSize = aggCntArray[i]; /* ------ register which equation is in which aggregate ------ */ aggIndArray = new int*[naggr]; for ( i = 0; i < naggr; i++ ) { aggIndArray[i] = new int[aggCntArray[i]]; aggCntArray[i] = 0; } for ( irow = 0; irow < PLocalNRows; irow++ ) { index = eqn2aggr[irow]; if ( index >= 0 ) aggIndArray[index][aggCntArray[index]++] = irow; } /* ------ allocate storage for SVD factorization ------ */ #ifndef MIN #define MIN(a,b) ((a)<(b)?(a):(b)) #endif uArray = new double[maxAggSize * numSmoothVec_ ]; sArray = new double[MIN(maxAggSize, numSmoothVec_)]; vtArray = new double[MIN(maxAggSize, numSmoothVec_) * numSmoothVec_]; workArray = new double[5*(maxAggSize + numSmoothVec_)]; newNull = new double[naggr*nullspaceDim_*numSmoothVec_]; #if 0 // print members of each aggregate for (i=0; i= 0 ) { nzcnt = 0; for ( j = 0; j < nullspaceDim_; j++ ) { if ( P_vecs[j][irow] != 0.0 ) { colInd[nzcnt] = P_cols[irow] + j; colVal[nzcnt++] = P_vecs[j][irow]; } } rowNum = PStartRow + irow; HYPRE_IJMatrixSetValues(IJPmat, 1, &nzcnt, (const int *) &rowNum, (const int *) colInd, (const double *) colVal); } } ierr = HYPRE_IJMatrixAssemble(IJPmat); hypre_assert( !ierr ); HYPRE_IJMatrixGetObject(IJPmat, (void **) &Pmat); hypre_MatvecCommPkgCreate((hypre_ParCSRMatrix *) Pmat); comm_pkg = hypre_ParCSRMatrixCommPkg(Amat); if (!comm_pkg) hypre_MatvecCommPkgCreate(Amat); HYPRE_IJMatrixSetObjectType(IJPmat, -1); HYPRE_IJMatrixDestroy( IJPmat ); delete [] colInd; delete [] colVal; } /*----------------------------------------------------------------- * form prolongator by P = (I - alpha A) tentP *-----------------------------------------------------------------*/ else { MLI_Matrix_FormJacobi(mli_Amat, alpha, &mli_Jmat); Jmat = (hypre_ParCSRMatrix *) mli_Jmat->getMatrix(); rowLengths = new int[PLocalNRows]; for ( i = 0; i < PLocalNRows; i++ ) rowLengths[i] = nullspaceDim_; ierr = HYPRE_IJMatrixSetRowSizes(IJPmat, rowLengths); ierr = HYPRE_IJMatrixInitialize(IJPmat); hypre_assert(!ierr); delete [] rowLengths; colInd = new int[nullspaceDim_]; colVal = new double[nullspaceDim_]; for ( irow = 0; irow < PLocalNRows; irow++ ) { if ( P_cols[irow] >= 0 ) { nzcnt = 0; for ( j = 0; j < nullspaceDim_; j++ ) { if ( P_vecs[j][irow] != 0.0 ) { colInd[nzcnt] = P_cols[irow] + j; colVal[nzcnt++] = P_vecs[j][irow]; } } rowNum = PStartRow + irow; HYPRE_IJMatrixSetValues(IJPmat, 1, &nzcnt, (const int *) &rowNum, (const int *) colInd, (const double *) colVal); } } ierr = HYPRE_IJMatrixAssemble(IJPmat); hypre_assert( !ierr ); HYPRE_IJMatrixGetObject(IJPmat, (void **) &Pmat2); HYPRE_IJMatrixSetObjectType(IJPmat, -1); HYPRE_IJMatrixDestroy( IJPmat ); delete [] colInd; delete [] colVal; Pmat = hypre_ParMatmul( Jmat, Pmat2); hypre_ParCSRMatrixDestroy(Pmat2); delete mli_Jmat; } #if 0 hypre_ParCSRMatrixPrintIJ(Pmat, 1, 1, "pmat"); #endif /*----------------------------------------------------------------- * clean up *-----------------------------------------------------------------*/ if ( P_cols != NULL ) delete [] P_cols; if ( P_vecs != NULL ) { for (i = 0; i < nullspaceDim_; i++) if ( P_vecs[i] != NULL ) delete [] P_vecs[i]; delete [] P_vecs; } delete [] eqn2aggr; /*----------------------------------------------------------------- * set up and return the Pmat *-----------------------------------------------------------------*/ funcPtr = new MLI_Function(); MLI_Utils_HypreParCSRMatrixGetDestroyFunc(funcPtr); sprintf(paramString, "HYPRE_ParCSR" ); mli_Pmat = new MLI_Matrix( Pmat, paramString, funcPtr ); (*Pmat_out) = mli_Pmat; delete funcPtr; return maxEigen; } // ********************************************************************* // Purpose : Given Amat and aggregation information, create the // corresponding Pmat using the global aggregation scheme // --------------------------------------------------------------------- double MLI_Method_AMGSA::genPGlobal(hypre_ParCSRMatrix *Amat, MLI_Matrix **PmatOut, int nAggr, int *aggrMap) { int mypid, nprocs, *partition, *aggrCnt, PLocalNRows, PStartRow; int irow, jcol, nzcnt, ierr; int PLocalNCols, PStartCol, *rowLengths, rowInd, *colInd; double *colVal, dtemp, *accum, *accum2; char paramString[50]; MPI_Comm comm; hypre_ParCSRMatrix *Pmat; hypre_ParCSRCommPkg *commPkg; HYPRE_IJMatrix IJPmat; MLI_Matrix *mli_Pmat; MLI_Function *funcPtr; /*----------------------------------------------------------------- * fetch and construct matrix parameters *-----------------------------------------------------------------*/ comm = hypre_ParCSRMatrixComm(Amat); MPI_Comm_rank(comm,&mypid); MPI_Comm_size(comm,&nprocs); HYPRE_ParCSRMatrixGetRowPartitioning((HYPRE_ParCSRMatrix) Amat, &partition); PStartRow = partition[mypid]; PLocalNRows = partition[mypid+1] - PStartRow; free(partition); if ( nAggr > 0 ) aggrCnt = new int[nAggr]; for ( irow = 0; irow < nAggr; irow++ ) aggrCnt[irow] = -1; for ( irow = 0; irow < nprocs; irow++ ) if ( aggrCnt[aggrMap[irow]] == -1 ) aggrCnt[aggrMap[irow]] = irow; PStartCol = 0; for ( irow = 0; irow < mypid; irow++ ) if ( aggrCnt[aggrMap[irow]] == irow ) PStartCol += nullspaceDim_; if ( aggrCnt[aggrMap[mypid]] == mypid ) PLocalNCols = nullspaceDim_; else PLocalNCols = 0; if ( nAggr > 0 ) delete [] aggrCnt; /*----------------------------------------------------------------- * initialize P matrix *-----------------------------------------------------------------*/ ierr = HYPRE_IJMatrixCreate(comm,PStartRow,PStartRow+PLocalNRows-1, PStartCol,PStartCol+PLocalNCols-1,&IJPmat); ierr = HYPRE_IJMatrixSetObjectType(IJPmat, HYPRE_PARCSR); hypre_assert(!ierr); rowLengths = new int[PLocalNRows]; for (irow = 0; irow < PLocalNRows; irow++) rowLengths[irow] = nullspaceDim_; ierr = HYPRE_IJMatrixSetRowSizes(IJPmat, rowLengths); ierr = HYPRE_IJMatrixInitialize(IJPmat); hypre_assert(!ierr); delete [] rowLengths; /*----------------------------------------------------------------- * create scaling array *-----------------------------------------------------------------*/ accum = new double[nprocs*nullspaceDim_]; accum2 = new double[nprocs*nullspaceDim_]; for ( irow = 0; irow < nprocs*nullspaceDim_; irow++ ) accum[irow] = 0.0; for ( irow = 0; irow < nprocs*nullspaceDim_; irow++ ) accum2[irow] = 0.0; for ( irow = 0; irow < PLocalNRows; irow++ ) { for ( jcol = 0; jcol < nullspaceDim_; jcol++ ) { dtemp = nullspaceVec_[jcol*PLocalNRows+irow]; accum[mypid*nullspaceDim_+jcol] += (dtemp * dtemp); } } MPI_Allreduce(accum,accum2,nullspaceDim_*nprocs,MPI_DOUBLE,MPI_SUM,comm); for ( irow = 0; irow < nullspaceDim_; irow++ ) accum[irow] = 0.0; for ( irow = 0; irow < nprocs; irow++ ) { if ( aggrMap[irow] == aggrMap[mypid] ) { for ( jcol = 0; jcol < nullspaceDim_; jcol++ ) accum[jcol] += accum2[irow*nullspaceDim_+jcol]; } } for ( irow = 0; irow < nullspaceDim_; irow++ ) accum[irow] = 1.0 / sqrt(accum[irow]); /*----------------------------------------------------------------- * load P matrix *-----------------------------------------------------------------*/ colInd = new int[nullspaceDim_]; colVal = new double[nullspaceDim_]; for ( irow = 0; irow < PLocalNRows; irow++ ) { nzcnt = 0; for ( jcol = 0; jcol < nullspaceDim_; jcol++ ) { dtemp = nullspaceVec_[jcol*PLocalNRows+irow]; if ( dtemp != 0.0 ) { colInd[nzcnt] = aggrMap[mypid] * nullspaceDim_ + jcol; colVal[nzcnt++] = dtemp * accum[jcol]; } } rowInd = PStartRow + irow; HYPRE_IJMatrixSetValues(IJPmat, 1, &nzcnt, (const int *) &rowInd, (const int *) colInd, (const double *) colVal); } delete [] colInd; delete [] colVal; delete [] accum; delete [] accum2; /*----------------------------------------------------------------- * assemble and create the MLI_Matrix format of the P matrix *-----------------------------------------------------------------*/ ierr = HYPRE_IJMatrixAssemble(IJPmat); hypre_assert( !ierr ); HYPRE_IJMatrixGetObject(IJPmat, (void **) &Pmat); hypre_MatvecCommPkgCreate((hypre_ParCSRMatrix *) Pmat); commPkg = hypre_ParCSRMatrixCommPkg(Amat); if ( !commPkg ) hypre_MatvecCommPkgCreate(Amat); HYPRE_IJMatrixSetObjectType(IJPmat, -1); HYPRE_IJMatrixDestroy( IJPmat ); funcPtr = new MLI_Function(); MLI_Utils_HypreParCSRMatrixGetDestroyFunc(funcPtr); sprintf(paramString, "HYPRE_ParCSR" ); mli_Pmat = new MLI_Matrix( Pmat, paramString, funcPtr ); (*PmatOut) = mli_Pmat; delete funcPtr; return 0.0; } /* ********************************************************************* * * local coarsening scheme (Given a graph, aggregate on the local subgraph) * --------------------------------------------------------------------- */ int MLI_Method_AMGSA::coarsenLocal(hypre_ParCSRMatrix *hypre_graph, int *mliAggrLeng, int **mliAggrArray) { MPI_Comm comm; int mypid, numProcs, *partition, startRow, endRow, maxInd; int localNRows, naggr=0, *node2aggr, *aggrSizes, nUndone; int irow, icol, colNum, rowNum, rowLeng, *cols, global_nrows; int *nodeStat, selectFlag, nSelected=0, nNotSelected=0, count; int ibuf[2], itmp[2]; double maxVal, *vals; /*----------------------------------------------------------------- * fetch machine and matrix parameters *-----------------------------------------------------------------*/ comm = hypre_ParCSRMatrixComm(hypre_graph); MPI_Comm_rank(comm,&mypid); MPI_Comm_size(comm,&numProcs); HYPRE_ParCSRMatrixGetRowPartitioning((HYPRE_ParCSRMatrix) hypre_graph, &partition); startRow = partition[mypid]; endRow = partition[mypid+1] - 1; free( partition ); localNRows = endRow - startRow + 1; MPI_Allreduce(&localNRows, &global_nrows, 1, MPI_INT, MPI_SUM, comm); if ( mypid == 0 && outputLevel_ > 1 ) { printf("\t*** Aggregation(U) : total nodes to aggregate = %d\n", global_nrows); } /*----------------------------------------------------------------- * this array is used to determine which row has been aggregated *-----------------------------------------------------------------*/ if ( localNRows > 0 ) { node2aggr = new int[localNRows]; aggrSizes = new int[localNRows]; nodeStat = new int[localNRows]; for ( irow = 0; irow < localNRows; irow++ ) { aggrSizes[irow] = 0; node2aggr[irow] = -1; nodeStat[irow] = MLI_METHOD_AMGSA_READY; rowNum = startRow + irow; hypre_ParCSRMatrixGetRow(hypre_graph,rowNum,&rowLeng,NULL,NULL); if (rowLeng <= 0) { nodeStat[irow] = MLI_METHOD_AMGSA_NOTSELECTED; nNotSelected++; } hypre_ParCSRMatrixRestoreRow(hypre_graph,rowNum,&rowLeng,NULL,NULL); } } else node2aggr = aggrSizes = nodeStat = NULL; /*----------------------------------------------------------------- * Phase 1 : form aggregates *-----------------------------------------------------------------*/ for ( irow = 0; irow < localNRows; irow++ ) { if ( nodeStat[irow] == MLI_METHOD_AMGSA_READY ) { rowNum = startRow + irow; hypre_ParCSRMatrixGetRow(hypre_graph,rowNum,&rowLeng,&cols,NULL); selectFlag = 1; count = 1; for ( icol = 0; icol < rowLeng; icol++ ) { colNum = cols[icol] - startRow; if ( colNum >= 0 && colNum < localNRows ) { if ( nodeStat[colNum] != MLI_METHOD_AMGSA_READY ) { selectFlag = 0; break; } else count++; } } if ( selectFlag == 1 && count >= minAggrSize_ ) { nSelected++; node2aggr[irow] = naggr; aggrSizes[naggr] = 1; nodeStat[irow] = MLI_METHOD_AMGSA_SELECTED; for ( icol = 0; icol < rowLeng; icol++ ) { colNum = cols[icol] - startRow; if ( colNum >= 0 && colNum < localNRows ) { node2aggr[colNum] = naggr; nodeStat[colNum] = MLI_METHOD_AMGSA_SELECTED; aggrSizes[naggr]++; nSelected++; } } naggr++; } hypre_ParCSRMatrixRestoreRow(hypre_graph,rowNum,&rowLeng,&cols,NULL); } } itmp[0] = naggr; itmp[1] = nSelected; if (outputLevel_ > 1) MPI_Allreduce(itmp, ibuf, 2, MPI_INT, MPI_SUM, comm); if ( mypid == 0 && outputLevel_ > 1 ) { printf("\t*** Aggregation(U) P1 : no. of aggregates = %d\n",ibuf[0]); printf("\t*** Aggregation(U) P1 : no. nodes aggregated = %d\n",ibuf[1]); } /*----------------------------------------------------------------- * Phase 2 : put the rest into one of the existing aggregates *-----------------------------------------------------------------*/ if ( (nSelected+nNotSelected) < localNRows ) { for ( irow = 0; irow < localNRows; irow++ ) { if ( nodeStat[irow] == MLI_METHOD_AMGSA_READY ) { rowNum = startRow + irow; hypre_ParCSRMatrixGetRow(hypre_graph,rowNum,&rowLeng,&cols,&vals); maxInd = -1; maxVal = 0.0; for ( icol = 0; icol < rowLeng; icol++ ) { colNum = cols[icol] - startRow; if ( colNum >= 0 && colNum < localNRows ) { if ( nodeStat[colNum] == MLI_METHOD_AMGSA_SELECTED ) { if (vals[icol] > maxVal) { maxInd = colNum; maxVal = vals[icol]; } } } } if ( maxInd != -1 ) { node2aggr[irow] = node2aggr[maxInd]; nodeStat[irow] = MLI_METHOD_AMGSA_PENDING; aggrSizes[node2aggr[maxInd]]++; } hypre_ParCSRMatrixRestoreRow(hypre_graph,rowNum,&rowLeng,&cols, &vals); } } for ( irow = 0; irow < localNRows; irow++ ) { if ( nodeStat[irow] == MLI_METHOD_AMGSA_PENDING ) { nodeStat[irow] = MLI_METHOD_AMGSA_SELECTED; nSelected++; } } } itmp[0] = naggr; itmp[1] = nSelected; if (outputLevel_ > 1) MPI_Allreduce(itmp,ibuf,2,MPI_INT,MPI_SUM,comm); if ( mypid == 0 && outputLevel_ > 1 ) { printf("\t*** Aggregation(U) P2 : no. of aggregates = %d\n",ibuf[0]); printf("\t*** Aggregation(U) P2 : no. nodes aggregated = %d\n",ibuf[1]); } /*----------------------------------------------------------------- * Phase 3 : form aggregates for all other rows *-----------------------------------------------------------------*/ if ( (nSelected+nNotSelected) < localNRows ) { for ( irow = 0; irow < localNRows; irow++ ) { if ( nodeStat[irow] == MLI_METHOD_AMGSA_READY ) { rowNum = startRow + irow; hypre_ParCSRMatrixGetRow(hypre_graph,rowNum,&rowLeng,&cols,NULL); count = 1; for ( icol = 0; icol < rowLeng; icol++ ) { colNum = cols[icol] - startRow; if ( colNum >= 0 && colNum < localNRows ) { if ( nodeStat[colNum] == MLI_METHOD_AMGSA_READY ) count++; } } if ( count > 1 && count >= minAggrSize_ ) { node2aggr[irow] = naggr; nodeStat[irow] = MLI_METHOD_AMGSA_SELECTED; aggrSizes[naggr] = 1; nSelected++; for ( icol = 0; icol < rowLeng; icol++ ) { colNum = cols[icol] - startRow; if ( colNum >= 0 && colNum < localNRows ) { if ( nodeStat[colNum] == MLI_METHOD_AMGSA_READY ) { nodeStat[colNum] = MLI_METHOD_AMGSA_SELECTED; node2aggr[colNum] = naggr; aggrSizes[naggr]++; nSelected++; } } } naggr++; } hypre_ParCSRMatrixRestoreRow(hypre_graph,rowNum,&rowLeng,&cols, NULL); } } } itmp[0] = naggr; itmp[1] = nSelected; if (outputLevel_ > 1) MPI_Allreduce(itmp,ibuf,2,MPI_INT,MPI_SUM,comm); if ( mypid == 0 && outputLevel_ > 1 ) { printf("\t*** Aggregation(U) P3 : no. of aggregates = %d\n",ibuf[0]); printf("\t*** Aggregation(U) P3 : no. nodes aggregated = %d\n",ibuf[1]); } /*----------------------------------------------------------------- * Phase 4 : finally put all lone rows into some neighbor aggregate *-----------------------------------------------------------------*/ if ( (nSelected+nNotSelected) < localNRows ) { for ( irow = 0; irow < localNRows; irow++ ) { if ( nodeStat[irow] == MLI_METHOD_AMGSA_READY ) { rowNum = startRow + irow; hypre_ParCSRMatrixGetRow(hypre_graph,rowNum,&rowLeng,&cols,NULL); for ( icol = 0; icol < rowLeng; icol++ ) { colNum = cols[icol] - startRow; if ( colNum >= 0 && colNum < localNRows ) { if ( nodeStat[colNum] == MLI_METHOD_AMGSA_SELECTED ) { node2aggr[irow] = node2aggr[colNum]; nodeStat[irow] = MLI_METHOD_AMGSA_SELECTED; aggrSizes[node2aggr[colNum]]++; nSelected++; break; } } } hypre_ParCSRMatrixRestoreRow(hypre_graph,rowNum,&rowLeng,&cols, NULL); } } } itmp[0] = naggr; itmp[1] = nSelected; if ( outputLevel_ > 1 ) MPI_Allreduce(itmp,ibuf,2,MPI_INT,MPI_SUM,comm); if ( mypid == 0 && outputLevel_ > 1 ) { printf("\t*** Aggregation(U) P4 : no. of aggregates = %d\n",ibuf[0]); printf("\t*** Aggregation(U) P4 : no. nodes aggregated = %d\n",ibuf[1]); } nUndone = localNRows - nSelected - nNotSelected; //if ( nUndone > 0 ) if ( nUndone > localNRows ) { count = nUndone / minAggrSize_; if ( count == 0 ) count = 1; count += naggr; irow = icol = 0; while ( nUndone > 0 ) { if ( nodeStat[irow] == MLI_METHOD_AMGSA_READY ) { node2aggr[irow] = naggr; nodeStat[irow] = MLI_METHOD_AMGSA_SELECTED; nUndone--; nSelected++; icol++; if ( icol >= minAggrSize_ && naggr < count-1 ) { icol = 0; naggr++; } } irow++; } naggr = count; } itmp[0] = naggr; itmp[1] = nSelected; if ( outputLevel_ > 1 ) MPI_Allreduce(itmp,ibuf,2,MPI_INT,MPI_SUM,comm); if ( mypid == 0 && outputLevel_ > 1 ) { printf("\t*** Aggregation(U) P5 : no. of aggregates = %d\n",ibuf[0]); printf("\t*** Aggregation(U) P5 : no. nodes aggregated = %d\n",ibuf[1]); } /*----------------------------------------------------------------- * diagnostics *-----------------------------------------------------------------*/ if ( (nSelected+nNotSelected) < localNRows ) { #ifdef MLI_DEBUG_DETAILED for ( irow = 0; irow < localNRows; irow++ ) { if ( nodeStat[irow] == MLI_METHOD_AMGSA_READY ) { rowNum = startRow + irow; printf("%5d : unaggregated node = %8d\n", mypid, rowNum); hypre_ParCSRMatrixGetRow(hypre_graph,rowNum,&rowLeng,&cols,NULL); for ( icol = 0; icol < rowLeng; icol++ ) { colNum = cols[icol]; printf("ERROR : neighbor of unselected node %9d = %9d\n", rowNum, colNum); } } } #endif } /*----------------------------------------------------------------- * clean up and initialize the output arrays *-----------------------------------------------------------------*/ if ( localNRows > 0 ) delete [] aggrSizes; if ( localNRows > 0 ) delete [] nodeStat; if ( localNRows == 1 && naggr == 0 ) { node2aggr[0] = 0; naggr = 1; } (*mliAggrArray) = node2aggr; (*mliAggrLeng) = naggr; return 0; } /* ********************************************************************* * * global coarsening scheme (for the coarsest grid only) * --------------------------------------------------------------------- */ int MLI_Method_AMGSA::coarsenGlobal(hypre_ParCSRMatrix *Gmat, int *mliAggrLeng, int **mliAggrArray) { int nRecvs, *recvProcs, mypid, nprocs, *commGraphI; int *commGraphJ, *recvCounts, i, j, *aggrInds, nAggr; int pIndex, *aggrCnts, *rowCounts, nRows; MPI_Comm comm; hypre_ParCSRCommPkg *commPkg; comm = hypre_ParCSRMatrixComm(Gmat); commPkg = hypre_ParCSRMatrixCommPkg(Gmat); if ( commPkg == NULL ) { hypre_MatvecCommPkgCreate((hypre_ParCSRMatrix *) Gmat); commPkg = hypre_ParCSRMatrixCommPkg(Gmat); } nRecvs = hypre_ParCSRCommPkgNumRecvs(commPkg); recvProcs = hypre_ParCSRCommPkgRecvProcs(commPkg); MPI_Comm_rank(comm, &mypid); MPI_Comm_size(comm, &nprocs); commGraphI = new int[nprocs+1]; recvCounts = new int[nprocs]; MPI_Allgather(&nRecvs, 1, MPI_INT, recvCounts, 1, MPI_INT, comm); commGraphI[0] = 0; for ( i = 1; i <= nprocs; i++ ) commGraphI[i] = commGraphI[i-1] + recvCounts[i-1]; commGraphJ = new int[commGraphI[nprocs]]; MPI_Allgatherv(recvProcs, nRecvs, MPI_INT, commGraphJ, recvCounts, commGraphI, MPI_INT, comm); delete [] recvCounts; rowCounts = new int[nprocs]; nRows = hypre_ParCSRMatrixNumRows(Gmat); MPI_Allgather(&nRows, 1, MPI_INT, rowCounts, 1, MPI_INT, comm); nAggr = 0; aggrInds = new int[nprocs]; aggrCnts = new int[nprocs]; for ( i = 0; i < nprocs; i++ ) aggrInds[i] = -1; for ( i = 0; i < nprocs; i++ ) aggrCnts[i] = 0; for ( i = 0; i < nprocs; i++ ) { if (aggrInds[i] == -1) { aggrCnts[nAggr] = rowCounts[i]; for ( j = commGraphI[i]; j < commGraphI[i+1]; j++ ) { pIndex = commGraphJ[j]; if (aggrInds[pIndex] == -1) aggrCnts[nAggr] += rowCounts[i]; } if ( aggrCnts[nAggr] >= minAggrSize_ ) { aggrInds[i] = nAggr; for ( j = commGraphI[i]; j < commGraphI[i+1]; j++ ) { pIndex = commGraphJ[j]; if (aggrInds[pIndex] == -1) aggrInds[pIndex] = nAggr; } nAggr++; } else aggrCnts[nAggr] = 0; } } for ( i = 0; i < nprocs; i++ ) { if (aggrInds[i] == -1) { aggrInds[i] = nAggr; aggrCnts[nAggr] += rowCounts[i]; if (aggrCnts[nAggr] >= minAggrSize_) nAggr++; } } for ( i = 0; i < nprocs; i++ ) { if (aggrInds[i] == nAggr) aggrInds[i] = nAggr - 1; } if ( outputLevel_ > 2 && mypid == 0 ) { printf("\tMETHOD_AMGSA::coarsenGlobal - nAggr = %d\n", nAggr); } if ( mypid == 0 && outputLevel_ > 1 ) { printf("\t*** Aggregation(C) : no. of aggregates = %d\n",nAggr); printf("\t*** Aggregation(C) : no. nodes aggregated = %d\n", hypre_ParCSRMatrixGlobalNumRows(Gmat)); } delete [] aggrCnts; delete [] rowCounts; (*mliAggrLeng) = nAggr; (*mliAggrArray) = aggrInds; return 0; } /*********************************************************************** * form graph from matrix (internal subroutine) * ------------------------------------------------------------------- */ int MLI_Method_AMGSA::formLocalGraph( hypre_ParCSRMatrix *Amat, hypre_ParCSRMatrix **graph_in, int *localLabels) { HYPRE_IJMatrix IJGraph; hypre_CSRMatrix *AdiagBlock; hypre_ParCSRMatrix *graph; MPI_Comm comm; int i, j, jj, index, mypid, *partition; int startRow, endRow, *rowLengths; int *AdiagRPtr, *AdiagCols, AdiagNRows, length; int irow, maxRowNnz, ierr, *colInd, labeli, labelj; double *diagData=NULL, *colVal; double *AdiagVals, dcomp1, dcomp2, epsilon; /*----------------------------------------------------------------- * fetch machine and matrix parameters *-----------------------------------------------------------------*/ hypre_assert( Amat != NULL ); comm = hypre_ParCSRMatrixComm(Amat); MPI_Comm_rank(comm,&mypid); HYPRE_ParCSRMatrixGetRowPartitioning((HYPRE_ParCSRMatrix) Amat,&partition); startRow = partition[mypid]; endRow = partition[mypid+1] - 1; free( partition ); AdiagBlock = hypre_ParCSRMatrixDiag(Amat); AdiagNRows = hypre_CSRMatrixNumRows(AdiagBlock); AdiagRPtr = hypre_CSRMatrixI(AdiagBlock); AdiagCols = hypre_CSRMatrixJ(AdiagBlock); AdiagVals = hypre_CSRMatrixData(AdiagBlock); #if 0 // seems to give some problems (12/31/03) if ( useSAMGeFlag_ ) { if ( saLabels_ != NULL && saLabels_[currLevel_] != NULL ) { partition = new int[AdiagNRows/currNodeDofs_]; for ( i = 0; i < AdiagNRows; i+=currNodeDofs_ ) partition[i/currNodeDofs_] = saLabels_[currLevel_][i]; hypre_qsort0(partition, 0, AdiagNRows/currNodeDofs_-1); jj = 1; for ( i = 1; i < AdiagNRows/currNodeDofs_; i++ ) if (partition[i] != partition[i-1]) jj++; if ( jj * currNodeDofs_ < AdiagNRows/2 ) { for ( i = 0; i < AdiagNRows; i++ ) saLabels_[currLevel_][i] = 0; for ( i = 0; i < AdiagNRows/currNodeDofs_; i++ ) localLabels[i] = 0; if ( currNodeDofs_ > 6 ) nullspaceDim_ = currNodeDofs_ = 6; } delete [] partition; } } #endif /*----------------------------------------------------------------- * construct the diagonal array (diagData) *-----------------------------------------------------------------*/ if ( threshold_ > 0.0 ) { diagData = new double[AdiagNRows]; #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(irow,j) HYPRE_SMP_SCHEDULE #endif for (irow = 0; irow < AdiagNRows; irow++) { for (j = AdiagRPtr[irow]; j < AdiagRPtr[irow+1]; j++) { if ( AdiagCols[j] == irow ) { diagData[irow] = AdiagVals[j]; break; } } } } /*----------------------------------------------------------------- * initialize the graph *-----------------------------------------------------------------*/ ierr = HYPRE_IJMatrixCreate(comm, startRow, endRow, startRow, endRow, &IJGraph); ierr = HYPRE_IJMatrixSetObjectType(IJGraph, HYPRE_PARCSR); hypre_assert(!ierr); /*----------------------------------------------------------------- * find and initialize the length of each row in the graph *-----------------------------------------------------------------*/ epsilon = threshold_; for ( i = 0; i < currLevel_; i++ ) epsilon *= 0.5; if ( mypid == 0 && outputLevel_ > 1 ) { printf("\t*** Aggregation(U) : strength threshold = %8.2e\n", epsilon); } epsilon = epsilon * epsilon; rowLengths = new int[AdiagNRows]; #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(irow,j,jj,index,dcomp1,dcomp2) HYPRE_SMP_SCHEDULE #endif for ( irow = 0; irow < AdiagNRows; irow++ ) { rowLengths[irow] = 0; index = startRow + irow; if ( localLabels != NULL ) labeli = localLabels[irow]; else labeli = 0; if ( epsilon > 0.0 ) { for (j = AdiagRPtr[irow]; j < AdiagRPtr[irow+1]; j++) { jj = AdiagCols[j]; if ( localLabels != NULL ) labelj = localLabels[jj]; else labelj = 0; if ( jj != irow ) { dcomp1 = AdiagVals[j] * AdiagVals[j]; if (dcomp1 > 0.0 && labeli == labelj) rowLengths[irow]++; } } } else { for (j = AdiagRPtr[irow]; j < AdiagRPtr[irow+1]; j++) { jj = AdiagCols[j]; if ( localLabels != NULL ) labelj = localLabels[jj]; else labelj = 0; if ( jj != irow && AdiagVals[j] != 0.0 && labeli == labelj ) rowLengths[irow]++; } } } maxRowNnz = 0; for ( irow = 0; irow < AdiagNRows; irow++ ) { if ( rowLengths[irow] > maxRowNnz ) maxRowNnz = rowLengths[irow]; } ierr = HYPRE_IJMatrixSetRowSizes(IJGraph, rowLengths); ierr = HYPRE_IJMatrixInitialize(IJGraph); hypre_assert(!ierr); delete [] rowLengths; /*----------------------------------------------------------------- * load and assemble the graph *-----------------------------------------------------------------*/ colInd = new int[maxRowNnz]; colVal = new double[maxRowNnz]; for ( irow = 0; irow < AdiagNRows; irow++ ) { length = 0; index = startRow + irow; if ( localLabels != NULL ) labeli = localLabels[irow]; else labeli = 0; if ( epsilon > 0.0 ) { for (j = AdiagRPtr[irow]; j < AdiagRPtr[irow+1]; j++) { jj = AdiagCols[j]; if ( localLabels != NULL ) labelj = localLabels[jj]; else labelj = 0; if ( jj != irow ) { dcomp1 = AdiagVals[j] * AdiagVals[j]; if ( dcomp1 > 0.0 ) { dcomp2 = habs(diagData[irow] * diagData[jj]); if ( (dcomp1 >= epsilon * dcomp2) && (labeli == labelj) ) { colVal[length] = dcomp1 / dcomp2; colInd[length++] = jj + startRow; } } } } } else { for (j = AdiagRPtr[irow]; j < AdiagRPtr[irow+1]; j++) { jj = AdiagCols[j]; if ( localLabels != NULL ) labelj = localLabels[jj]; else labelj = 0; if ( jj != irow ) { if (AdiagVals[j] != 0.0 && (labeli == labelj)) { colVal[length] = AdiagVals[j]; colInd[length++] = jj + startRow; } } } } HYPRE_IJMatrixSetValues(IJGraph, 1, &length, (const int *) &index, (const int *) colInd, (const double *) colVal); } ierr = HYPRE_IJMatrixAssemble(IJGraph); hypre_assert(!ierr); /*----------------------------------------------------------------- * return the graph and clean up *-----------------------------------------------------------------*/ HYPRE_IJMatrixGetObject(IJGraph, (void **) &graph); HYPRE_IJMatrixSetObjectType(IJGraph, -1); HYPRE_IJMatrixDestroy(IJGraph); (*graph_in) = graph; delete [] colInd; delete [] colVal; if ( threshold_ > 0.0 ) delete [] diagData; return 0; } /*********************************************************************** * form global graph from matrix (threshold assumed 0) * ------------------------------------------------------------------- */ int MLI_Method_AMGSA::formGlobalGraph( hypre_ParCSRMatrix *Amat, hypre_ParCSRMatrix **Gmat) { HYPRE_IJMatrix IJGraph; hypre_CSRMatrix *ADiag, *AOffd; hypre_ParCSRMatrix *graph; MPI_Comm comm; int cInd, jcol, index, mypid, nprocs, *partition; int startRow, endRow, *rowLengths, length; int *ADiagI, *ADiagJ, *AOffdI, *AOffdJ, localNRows; int irow, maxRowNnz, ierr, *colInd, *colMapOffd; double *colVal, *ADiagA, *AOffdA; /*----------------------------------------------------------------- * fetch machine and matrix parameters *-----------------------------------------------------------------*/ hypre_assert( Amat != NULL ); comm = hypre_ParCSRMatrixComm(Amat); MPI_Comm_rank(comm,&mypid); MPI_Comm_size(comm,&nprocs); HYPRE_ParCSRMatrixGetRowPartitioning((HYPRE_ParCSRMatrix) Amat,&partition); startRow = partition[mypid]; endRow = partition[mypid+1] - 1; free( partition ); ADiag = hypre_ParCSRMatrixDiag(Amat); AOffd = hypre_ParCSRMatrixOffd(Amat); localNRows = hypre_CSRMatrixNumRows(ADiag); ADiagI = hypre_CSRMatrixI(ADiag); ADiagJ = hypre_CSRMatrixJ(ADiag); ADiagA = hypre_CSRMatrixData(ADiag); AOffdI = hypre_CSRMatrixI(AOffd); AOffdJ = hypre_CSRMatrixJ(AOffd); AOffdA = hypre_CSRMatrixData(AOffd); /*----------------------------------------------------------------- * initialize the graph *-----------------------------------------------------------------*/ ierr = HYPRE_IJMatrixCreate(comm, startRow, endRow, startRow, endRow, &IJGraph); ierr = HYPRE_IJMatrixSetObjectType(IJGraph, HYPRE_PARCSR); hypre_assert(!ierr); /*----------------------------------------------------------------- * find and initialize the length of each row in the graph *-----------------------------------------------------------------*/ if (localNRows > 0) rowLengths = new int[localNRows]; for ( irow = 0; irow < localNRows; irow++ ) { rowLengths[irow] = 0; for (jcol = ADiagI[irow]; jcol < ADiagI[irow+1]; jcol++) { cInd = ADiagJ[jcol]; if ( cInd != irow && ADiagA[jcol] != 0.0 ) rowLengths[irow]++; } if (nprocs > 1) { for (jcol = AOffdI[irow]; jcol < AOffdI[irow+1]; jcol++) if ( AOffdA[jcol] != 0.0 ) rowLengths[irow]++; } } maxRowNnz = 0; for ( irow = 0; irow < localNRows; irow++ ) { if ( rowLengths[irow] > maxRowNnz ) maxRowNnz = rowLengths[irow]; } ierr = HYPRE_IJMatrixSetRowSizes(IJGraph, rowLengths); ierr = HYPRE_IJMatrixInitialize(IJGraph); hypre_assert(!ierr); if (localNRows > 0) delete [] rowLengths; /*----------------------------------------------------------------- * load and assemble the graph *-----------------------------------------------------------------*/ if (localNRows > 0) colInd = new int[maxRowNnz]; if (localNRows > 0) colVal = new double[maxRowNnz]; if (nprocs > 1) colMapOffd = hypre_ParCSRMatrixColMapOffd(Amat); for ( irow = 0; irow < localNRows; irow++ ) { length = 0; index = startRow + irow; for (jcol = ADiagI[irow]; jcol < ADiagI[irow+1]; jcol++) { cInd = ADiagJ[jcol]; if ( cInd != irow && ADiagA[jcol] != 0.0) { colVal[length] = ADiagA[jcol]; colInd[length++] = cInd + startRow; } } if (nprocs > 1) { for (jcol = AOffdI[irow]; jcol < AOffdI[irow+1]; jcol++) { cInd = AOffdJ[jcol]; if ( AOffdA[jcol] != 0.0) { colVal[length] = AOffdA[jcol]; colInd[length++] = colMapOffd[cInd]; } } } HYPRE_IJMatrixSetValues(IJGraph, 1, &length, (const int *) &index, (const int *) colInd, (const double *) colVal); } ierr = HYPRE_IJMatrixAssemble(IJGraph); hypre_assert(!ierr); /*----------------------------------------------------------------- * return the graph and clean up *-----------------------------------------------------------------*/ HYPRE_IJMatrixGetObject(IJGraph, (void **) &graph); HYPRE_IJMatrixSetObjectType(IJGraph, -1); HYPRE_IJMatrixDestroy(IJGraph); (*Gmat) = graph; if (localNRows > 0) delete [] colInd; if (localNRows > 0) delete [] colVal; return 0; } #undef MLI_METHOD_AMGSA_READY #undef MLI_METHOD_AMGSA_SELECTED #undef MLI_METHOD_AMGSA_PENDING #undef MLI_METHOD_AMGSA_NOTSELECTED /*********************************************************************** * Construct the initial smooth vectors and put them in nullspaceVec_ * ------------------------------------------------------------------- */ int MLI_Method_AMGSA::formSmoothVec(MLI_Matrix *mli_Amat) { hypre_ParCSRMatrix *Amat; MPI_Comm comm; int mypid, nprocs; int *partition; hypre_ParVector *trial_sol, *zero_rhs; MLI_Vector *mli_rhs, *mli_sol; hypre_Vector *sol_local; double *sol_data; int local_nrows; char paramString[200]; MLI_Solver_SGS *smoother; double *nsptr; int i, j; /* warn if nullspaceVec_ is not NULL */ if (nullspaceVec_ != NULL) { printf("Warning: formSmoothVec: zeroing nullspaceVec_\n"); delete [] nullspaceVec_; nullspaceVec_ = NULL; } Amat = (hypre_ParCSRMatrix *) mli_Amat->getMatrix(); comm = hypre_ParCSRMatrixComm(Amat); MPI_Comm_rank(comm,&mypid); MPI_Comm_size(comm,&nprocs); /*----------------------------------------------------------------- * create MLI_Vectors *-----------------------------------------------------------------*/ HYPRE_ParCSRMatrixGetRowPartitioning((HYPRE_ParCSRMatrix) Amat, &partition); zero_rhs = hypre_ParVectorCreate(comm, partition[nprocs], partition); hypre_ParVectorInitialize( zero_rhs ); hypre_ParVectorSetConstantValues( zero_rhs, 0.0 ); strcpy( paramString, "HYPRE_ParVector" ); mli_rhs = new MLI_Vector( (void*) zero_rhs, paramString, NULL ); HYPRE_ParCSRMatrixGetRowPartitioning((HYPRE_ParCSRMatrix) Amat, &partition); trial_sol = hypre_ParVectorCreate(comm, partition[nprocs], partition); hypre_ParVectorInitialize( trial_sol ); mli_sol = new MLI_Vector( (void*) trial_sol, paramString, NULL ); local_nrows = partition[mypid+1] - partition[mypid]; sol_local = hypre_ParVectorLocalVector(trial_sol); sol_data = hypre_VectorData(sol_local); /*----------------------------------------------------------------- * allocate space for smooth vectors and set up smoother *-----------------------------------------------------------------*/ nullspaceVec_ = new double[local_nrows*numSmoothVec_]; nsptr = nullspaceVec_; strcpy( paramString, "SGS" ); smoother = new MLI_Solver_SGS( paramString ); smoother->setParams(numSmoothVecSteps_, NULL); smoother->setup(mli_Amat); /*----------------------------------------------------------------- * smooth the vectors *-----------------------------------------------------------------*/ for (i=0; isolve(mli_rhs, mli_sol); MLI_Utils_ScaleVec(Amat, trial_sol); /* extract solution */ for (j=0; jgetMatrix(); comm = hypre_ParCSRMatrixComm(Amat); MPI_Comm_rank(comm, &mypid); MPI_Comm_size(comm, &nprocs); HYPRE_ParCSRMatrixGetRowPartitioning((HYPRE_ParCSRMatrix) Amat, &partition); local_nrows = partition[mypid+1] - partition[mypid]; trial_sol = hypre_ParVectorCreate(comm, partition[nprocs], partition); hypre_ParVectorInitialize( trial_sol ); sol_local = hypre_ParVectorLocalVector(trial_sol); sol_data = hypre_VectorData(sol_local); if (nullspaceVec_ != NULL) { printf("Warning: formSmoothVecLanczos: zeroing nullspaceVec_\n"); delete [] nullspaceVec_; nullspaceVec_ = NULL; } nullspaceVec_ = new double[local_nrows*numSmoothVec_]; nsptr = nullspaceVec_; MLI_Utils_ComputeLowEnergyLanczos(Amat, numSmoothVecSteps_, numSmoothVec_, nullspaceVec_); /* need to scale the individual vectors */ for (i=0; igetMatrix(); comm = hypre_ParCSRMatrixComm(Amat); MPI_Comm_rank(comm,&mypid); MPI_Comm_size(comm,&nprocs); /*----------------------------------------------------------------- * create MLI_Vectors *-----------------------------------------------------------------*/ HYPRE_ParCSRMatrixGetRowPartitioning((HYPRE_ParCSRMatrix) Amat, &partition); zero_rhs = hypre_ParVectorCreate(comm, partition[nprocs], partition); hypre_ParVectorInitialize( zero_rhs ); hypre_ParVectorSetConstantValues( zero_rhs, 0.0 ); strcpy( paramString, "HYPRE_ParVector" ); mli_rhs = new MLI_Vector( (void*) zero_rhs, paramString, NULL ); HYPRE_ParCSRMatrixGetRowPartitioning((HYPRE_ParCSRMatrix) Amat, &partition); trial_sol = hypre_ParVectorCreate(comm, partition[nprocs], partition); hypre_ParVectorInitialize( trial_sol ); mli_sol = new MLI_Vector( (void*) trial_sol, paramString, NULL ); local_nrows = partition[mypid+1] - partition[mypid]; sol_local = hypre_ParVectorLocalVector(trial_sol); sol_data = hypre_VectorData(sol_local); /*----------------------------------------------------------------- * set up smoother *-----------------------------------------------------------------*/ strcpy( paramString, "SGS" ); smoother = new MLI_Solver_SGS( paramString ); smoother->setParams(2, NULL); // 2 smoothing steps smoother->setup(mli_Amat); /*----------------------------------------------------------------- * smooth the vectors *-----------------------------------------------------------------*/ nsptr = nullspaceVec_; for (i=0; isolve(mli_rhs, mli_sol); MLI_Utils_ScaleVec(Amat, trial_sol); // need this /* extract solution */ nsptr = hold; for (j=0; j // ********************************************************************* // HYPRE includes external to MLI // --------------------------------------------------------------------- #include "HYPRE.h" #include "_hypre_utilities.h" #include "HYPRE_IJ_mv.h" #include "seq_mv.h" #include "_hypre_parcsr_mv.h" // ********************************************************************* // local MLI includes // --------------------------------------------------------------------- #include "mli_method_amgsa.h" #include "mli_utils.h" #include "mli_mapper.h" #include "mli_fedata.h" #include "mli_fedata_utils.h" #include "mli_matrix.h" // ********************************************************************* // functions external to MLI // --------------------------------------------------------------------- extern "C" { /* ARPACK function to compute eigenvalues/eigenvectors */ void dnstev_(int *n, int *nev, char *which, double *sigmar, double *sigmai, int *colptr, int *rowind, double *nzvals, double *dr, double *di, double *z, int *ldz, int *info, double *tol); } /*********************************************************************** *********************************************************************** * compute initial null spaces (for the subdomain only) using FEData * --------------------------------------------------------------------- */ int MLI_Method_AMGSA::setupFEDataBasedNullSpaces( MLI *mli ) { int i, j, k, jj, k1, level, mypid, nElems, nodeNumFields; int nodeFieldID, elemNNodes, **elemNodeLists, *elemNodeList1D; int blockSize, *nodeEqnList, eMatDim, *partition, localStartRow; int localNRows, rowInd1, rowInd2, colInd1, colInd2; int colOffset1, colOffset2, elemID, *elemIDs, rowSize; int csrNrows, *csrIA, *csrJA, totalNNodes, sInd1, sInd2, offset; int *newNodeEqnList, *newElemNodeList, *orderArray, newNNodes; double *elemMat, *csrAA; double *eigenR, *eigenI, *eigenV; char which[20]; char *targv[1]; MPI_Comm comm; MLI_FEData *fedata; MLI_Mapper *nodeEqnMap; MLI_Matrix *mliAmat; hypre_ParCSRMatrix *hypreA; #ifdef MLI_ARPACK int info; double sigmaR, sigmaI; #endif #ifdef MLI_DEBUG_DETAILED printf("MLI_Method_AMGSA::setupFEDataBasedNullSpaces begins.\n"); #endif /* --------------------------------------------------------------- */ /* error checking */ /* --------------------------------------------------------------- */ if ( mli == NULL ) { printf("MLI_Method_AMGSA::setupFEDataBasedNullSpaces ERROR"); printf(" - no mli.\n"); exit(1); } level = 0; fedata = mli->getFEData(level); if ( fedata == NULL ) { printf("MLI_Method_AMGSA::setupFEDataBasedNullSpaces ERROR"); printf(" - no fedata.\n"); exit(1); } /* --------------------------------------------------------------- */ /* fetch communicator matrix information */ /* --------------------------------------------------------------- */ comm = getComm(); MPI_Comm_rank( comm, &mypid ); mliAmat = mli->getSystemMatrix( level ); hypreA = (hypre_ParCSRMatrix *) mliAmat->getMatrix(); HYPRE_ParCSRMatrixGetRowPartitioning((HYPRE_ParCSRMatrix) hypreA, &partition); localStartRow = partition[mypid]; localNRows = partition[mypid+1] - localStartRow; free( partition ); /* --------------------------------------------------------------- */ /* fetch FEData information (nElems, elemIDs, elemNNodes, */ /* elemNodeLists, blockSize) */ /* --------------------------------------------------------------- */ fedata->getNodeNumFields(nodeNumFields); if ( nodeNumFields != 1 ) { printf("MLI_Method_AMGSA::setupFEDataBasedNullSpaces - "); printf("nodeNumFields != 1.\n"); return 1; } fedata->getNumElements( nElems ); if ( nElems <= 0 ) return 0; elemIDs = new int[nElems]; fedata->getElemBlockGlobalIDs(nElems, elemIDs); fedata->getElemNumNodes(elemNNodes); totalNNodes = nElems * elemNNodes; elemNodeList1D = new int[totalNNodes]; elemNodeLists = new int*[nElems]; for ( i = 0; i < nElems; i++ ) elemNodeLists[i] = &(elemNodeList1D[i*elemNNodes]); fedata->getElemBlockNodeLists(nElems, elemNNodes, elemNodeLists); fedata->getNodeFieldIDs(nodeNumFields, &nodeFieldID); fedata->getFieldSize(nodeFieldID, blockSize); /* --------------------------------------------------------------- */ /* find the number of nodes in local subdomain (including external */ /* nodes) and assign a local equation number to them */ /* output : newElemNodeList, newNodeEqnList, newNNodes */ /* --------------------------------------------------------------- */ newNodeEqnList = new int[totalNNodes]; newElemNodeList = new int[totalNNodes]; orderArray = new int[totalNNodes]; for (i = 0; i < totalNNodes; i++) { orderArray[i] = i; newElemNodeList[i] = elemNodeList1D[i]; } MLI_Utils_IntQSort2(newElemNodeList, orderArray, 0, totalNNodes-1); newNNodes = 1; newNodeEqnList[orderArray[0]] = (newNNodes - 1) * blockSize; for ( i = 1; i < totalNNodes; i++ ) { if (newElemNodeList[i] != newElemNodeList[newNNodes-1]) newElemNodeList[newNNodes++] = newElemNodeList[i]; newNodeEqnList[orderArray[i]] = (newNNodes - 1) * blockSize; } delete [] newElemNodeList; /* --------------------------------------------------------------- */ /* allocate and initialize subdomain matrix */ /* --------------------------------------------------------------- */ eMatDim = elemNNodes * blockSize; elemMat = new double[eMatDim*eMatDim]; rowSize = elemNNodes * blockSize * 8; csrNrows = newNNodes * blockSize; csrIA = new int[csrNrows+1]; csrJA = new int[csrNrows*rowSize]; hypre_assert( ((long) csrJA) ); csrAA = new double[csrNrows*rowSize]; hypre_assert( ((long) csrAA) ); csrIA[0] = 0; for ( i = 1; i < csrNrows; i++ ) csrIA[i] = csrIA[i-1] + rowSize; /* --------------------------------------------------------------- */ /* construct CSR matrix (with holes) */ /* --------------------------------------------------------------- */ strcpy( which, "destroyElemMatrix" ); targv[0] = (char *) &elemID; for ( i = 0; i < nElems; i++ ) { elemID = elemIDs[i]; fedata->getElemMatrix(elemID, eMatDim, elemMat); fedata->impSpecificRequests(which, 1, targv); for ( j = 0; j < elemNNodes; j++ ) { colInd1 = newNodeEqnList[i*elemNNodes+j]; colInd2 = j * blockSize; for ( jj = 0; jj < blockSize; jj++ ) { colOffset1 = colInd1 + jj; colOffset2 = eMatDim * ( colInd2 + jj ); for ( k = 0; k < elemNNodes; k++ ) { rowInd1 = newNodeEqnList[i*elemNNodes+k]; rowInd2 = k * blockSize; for ( k1 = 0; k1 < blockSize; k1++ ) { if ( elemMat[rowInd2+k1+colOffset2] != 0.0 ) { offset = csrIA[rowInd1+k1]++; csrJA[offset] = colOffset1; csrAA[offset] = elemMat[rowInd2+k1+colOffset2]; } } } } } } delete [] elemMat; /* --------------------------------------------------------------- */ /* compress the CSR matrix */ /* --------------------------------------------------------------- */ jj = 0; csrIA[csrNrows] = 0; for ( i = 0; i <= csrNrows; i++ ) { if ( csrIA[i] > rowSize * (i+1) ) { printf("MLI_Method_AMGSA::setupFEDataBasedNullSpaces "); printf("ERROR : rowSize too large (increase it). \n"); printf(" => allowed = %d, actual = %d\n",rowSize, csrIA[i]-rowSize*i); exit(1); } if ( i < csrNrows ) { k1 = csrIA[i] - i * rowSize; sInd1 = i * rowSize; sInd2 = i * rowSize + k1 - 1; MLI_Utils_IntQSort2a(&(csrJA[sInd1]),&(csrAA[sInd1]),0,sInd2-sInd1); k1 = sInd1; for ( j = sInd1+1; j <= sInd2; j++ ) { if ( csrJA[j] == csrJA[k1] ) csrAA[k1] += csrAA[j]; else { k1++; csrJA[k1] = csrJA[j]; csrAA[k1] = csrAA[j]; } } if ( sInd2 >= sInd1 ) k1 = k1 - sInd1 + 1; else k1 = 0; sInd2 = sInd1 + k1; k1 = sInd1; for ( j = sInd1; j < sInd2; j++ ) { csrJA[k1] = csrJA[j]; csrAA[k1++] = csrAA[j]; } k1 = k1 - sInd1; for ( j = jj; j < jj+k1; j++ ) { csrJA[j] = csrJA[sInd1+j-jj]; csrAA[j] = csrAA[sInd1+j-jj]; } } csrIA[i] = jj; jj += k1; } #if 0 FILE *fp; fp = fopen("SMat", "w"); for ( i = 0; i < csrNrows; i++ ) for ( j = csrIA[i]; j < csrIA[i+1]; j++ ) fprintf(fp, "%5d %5d %25.16e \n", i+1, csrJA[j]+1, csrAA[j]); fclose( fp ); #endif /* --------------------------------------------------------------- */ /* change from base-0 to base-1 indexing for Fortran call */ /* --------------------------------------------------------------- */ for ( i = 0; i < csrIA[csrNrows]; i++ ) csrJA[i]++; for ( i = 0; i <= csrNrows; i++ ) csrIA[i]++; /* --------------------------------------------------------------- */ /* compute near null spaces */ /* --------------------------------------------------------------- */ strcpy( which, "shift" ); eigenR = new double[nullspaceDim_+1]; eigenI = new double[nullspaceDim_+1]; eigenV = new double[csrNrows*(nullspaceDim_+1)]; hypre_assert((long) eigenV); #ifdef MLI_ARPACK sigmaR = 1.0e-5; sigmaI = 0.0e-1; dnstev_(&csrNrows, &nullspaceDim_, which, &sigmaR, &sigmaI, csrIA, csrJA, csrAA, eigenR, eigenI, eigenV, &csrNrows, &info, &arpackTol_); #else printf("MLI_Method_AMGSA::FATAL ERROR : ARPACK not installed.\n"); exit(1); #endif if ( useSAMGDDFlag_ ) ARPACKSuperLUExists_ = 1; else { strcpy( which, "destroy" ); #ifdef MLI_ARPACK dnstev_(&csrNrows, &nullspaceDim_, which, &sigmaR, &sigmaI, csrIA, csrJA, csrAA, eigenR, eigenI, eigenV, &csrNrows, &info, &arpackTol_); #else printf("MLI_Method_AMGSA::FATAL ERROR : ARPACK not installed.\n"); exit(1); #endif } #if 1 for ( i = 0; i < nullspaceDim_; i++ ) printf("%5d : eigenvalue %5d = %e\n", mypid, i, eigenR[i]); #endif delete [] eigenR; delete [] eigenI; delete [] csrIA; delete [] csrJA; delete [] csrAA; /* --------------------------------------------------------------- */ /* get node to equation map */ /* --------------------------------------------------------------- */ nodeEqnMap = mli->getNodeEqnMap(level); if ( nodeEqnMap != NULL ) { nodeEqnList = new int[totalNNodes]; nodeEqnMap->getMap(totalNNodes,elemNodeList1D,nodeEqnList); } else { nodeEqnList = new int[totalNNodes]; for ( i = 0; i < nElems; i++ ) for ( j = 0; j < elemNNodes; j++ ) nodeEqnList[i*elemNNodes+j] = elemNodeLists[i][j] * blockSize; } /* --------------------------------------------------------------- */ /* load the null space vectors */ /* --------------------------------------------------------------- */ if ( nullspaceVec_ != NULL ) delete [] nullspaceVec_; nullspaceLen_ = localNRows; nullspaceVec_ = new double[nullspaceLen_*nullspaceDim_]; for ( i = 0; i < totalNNodes; i++ ) { jj = orderArray[i]; k1 = elemNodeList1D[jj]; /* get node number */ rowInd1 = nodeEqnList[jj]; /* get equation number for the node */ rowInd1 -= localStartRow; if ( rowInd1 >= 0 && rowInd1 < localNRows ) { rowInd2 = newNodeEqnList[jj]; for ( j = 0; j < blockSize; j++ ) for ( k = 0; k < nullspaceDim_; k++ ) nullspaceVec_[rowInd1+j+k*nullspaceLen_] = eigenV[rowInd2+j+k*csrNrows]; } } #if 0 FILE *fp; char param_string[80]; sprintf(param_string, "ANull.%d", mypid); fp = fopen( param_string, "w" ); for ( i = 0; i < localNRows; i++ ) { for ( j = 0; j < nullspaceDim_; j++ ) fprintf(fp, "%25.16e ", nullspaceVec_[localNRows*j+i]); fprintf(fp, "\n"); } fclose(fp); MPI_Barrier(comm); exit(1); #endif /* --------------------------------------------------------------- */ /* clean up */ /* --------------------------------------------------------------- */ delete [] orderArray; delete [] newNodeEqnList; delete [] eigenV; delete [] elemNodeList1D; delete [] elemNodeLists; delete [] elemIDs; delete [] nodeEqnList; #ifdef MLI_DEBUG_DETAILED printf("MLI_Method_AMGSA::setupFEDataBasedNullSpaces ends.\n"); #endif return 0; } /*********************************************************************** * set up domain decomposition method by having each subdomain with * the same aggregate number 0 * --------------------------------------------------------------------- */ int MLI_Method_AMGSA::setupFEDataBasedAggregates( MLI *mli ) { int i, level, mypid, *partition, localNRows, *aggrMap; int nprocs; MPI_Comm comm; MLI_Matrix *mliAmat; hypre_ParCSRMatrix *hypreA; #ifdef MLI_DEBUG_DETAILED printf("MLI_Method_AMGSA::setupFEDataBasedAggregates begins...\n"); #endif /* --------------------------------------------------------------- */ /* fetch communicator matrix information */ /* --------------------------------------------------------------- */ level = 0; comm = getComm(); MPI_Comm_rank( comm, &mypid ); MPI_Comm_size( comm, &nprocs ); mliAmat = mli->getSystemMatrix( level ); hypreA = (hypre_ParCSRMatrix *) mliAmat->getMatrix(); HYPRE_ParCSRMatrixGetRowPartitioning((HYPRE_ParCSRMatrix) hypreA, &partition); localNRows = partition[mypid+1] - partition[mypid]; free( partition ); aggrMap = new int[localNRows]; for ( i = 0; i < localNRows; i++ ) aggrMap[i] = 0; saData_[0] = aggrMap; saCounts_[0] = 1; numLevels_ = 2; minCoarseSize_ = nprocs; #ifdef MLI_DEBUG_DETAILED printf("MLI_Method_AMGSA::setupFEDataBasedAggregates ends.\n"); #endif return 0; } /*********************************************************************** * set up domain decomposition on each subdomain as smoother * using the SuperLU factors already generated here. * --------------------------------------------------------------------- */ int MLI_Method_AMGSA::setupFEDataBasedSuperLUSmoother(MLI *mli, int level) { int mypid, nprocs, localStartRow, localEndRow; int *partition, nodeNumFields, nElems, *elemIDs, elemNNodes; int totalNNodes, **elemNodeLists, *elemNodeList1D; int nodeFieldID, blockSize, *newNodeEqnList, *newElemNodeList; int *orderArray, newNNodes, *nodeEqnList; int *iTempArray, iE, iN, iP, jN, index; int *procArray, globalEqnNum, nSendMap, *sendMap; int nRecvs, *recvLengs, *recvProcs, **iRecvBufs; int nSends, *sendLengs, *sendProcs, **iSendBufs; MPI_Comm comm; MPI_Request *requests; MPI_Status *statuses; MLI_Mapper *nodeEqnMap; MLI_FEData *fedata; MLI_Matrix *mliAmat; hypre_ParCSRMatrix *hypreA; /* --------------------------------------------------------------- */ /* error checking */ /* --------------------------------------------------------------- */ if ( mli == NULL ) { printf("MLI_Method_AMGSA::setupFEDataBasedSuperLUSmoother ERROR - "); printf("no mli\n"); exit(1); } fedata = mli->getFEData(level); if ( fedata == NULL ) { printf("MLI_Method_AMGSA::setupFEDataBasedSuperLUSmoother ERROR - "); printf("no fedata\n"); exit(1); } /* --------------------------------------------------------------- */ /* fetch communicator matrix information */ /* --------------------------------------------------------------- */ comm = getComm(); MPI_Comm_rank( comm, &mypid ); MPI_Comm_size( comm, &nprocs ); mliAmat = mli->getSystemMatrix( level ); hypreA = (hypre_ParCSRMatrix *) mliAmat->getMatrix(); HYPRE_ParCSRMatrixGetRowPartitioning((HYPRE_ParCSRMatrix) hypreA, &partition); localStartRow = partition[mypid]; localEndRow = partition[mypid+1] - 1; free( partition ); /* --------------------------------------------------------------- */ /* fetch FEData information (nElems, elemIDs, elemNNodes, */ /* elemNodeLists, blockSize) */ /* --------------------------------------------------------------- */ fedata->getNodeNumFields(nodeNumFields); if ( nodeNumFields != 1 ) { printf("MLI_Method_AMGSA::setupFEDataBasedSuperLUSmoother - "); printf("nodeNumFields!=1.\n"); return 1; } fedata->getNumElements( nElems ); if ( nElems <= 0 ) return 0; elemIDs = new int[nElems]; fedata->getElemBlockGlobalIDs(nElems, elemIDs); fedata->getElemNumNodes(elemNNodes); totalNNodes = nElems * elemNNodes; elemNodeList1D = new int[totalNNodes]; elemNodeLists = new int*[nElems]; for ( iE = 0; iE < nElems; iE++ ) elemNodeLists[iE] = &(elemNodeList1D[iE*elemNNodes]); fedata->getElemBlockNodeLists(nElems, elemNNodes, elemNodeLists); fedata->getNodeFieldIDs(nodeNumFields, &nodeFieldID); fedata->getFieldSize(nodeFieldID, blockSize); /* --------------------------------------------------------------- */ /* find the number of nodes in local subdomain (including external */ /* nodes) and assign a local equation number to them */ /* output : newElemNodeList, newNodeEqnList, newNNodes */ /* --------------------------------------------------------------- */ newNodeEqnList = new int[totalNNodes]; newElemNodeList = new int[totalNNodes]; orderArray = new int[totalNNodes]; for ( iN = 0; iN < totalNNodes; iN++ ) { orderArray[iN] = iN; newElemNodeList[iN] = elemNodeList1D[iN]; } MLI_Utils_IntQSort2(newElemNodeList, orderArray, 0, totalNNodes-1); newNNodes = 1; newNodeEqnList[orderArray[0]] = (newNNodes - 1) * blockSize; for ( iN = 1; iN < totalNNodes; iN++ ) { if (newElemNodeList[iN] != newElemNodeList[newNNodes-1]) newElemNodeList[newNNodes++] = newElemNodeList[iN]; newNodeEqnList[orderArray[iN]] = (newNNodes - 1) * blockSize; } delete [] newElemNodeList; /* --------------------------------------------------------------- */ /* get node to equation map */ /* --------------------------------------------------------------- */ nodeEqnMap = mli->getNodeEqnMap(level); if ( nodeEqnMap != NULL ) { nodeEqnList = new int[totalNNodes]; nodeEqnMap->getMap(totalNNodes,elemNodeList1D,nodeEqnList); } else { nodeEqnList = new int[totalNNodes]; for ( iE = 0; iE < nElems; iE++ ) for ( jN = 0; jN < elemNNodes; jN++ ) nodeEqnList[iE*elemNNodes+jN] = elemNodeLists[iE][jN] * blockSize; } /* --------------------------------------------------------------- */ /* form incoming A-ordered equation to local-ordered equation map */ /* local node-equation map in newNodeEqnList (for SuperLU) */ /* A-ordered node-equation map in nodeEqnList */ /* - first sort and compress the nodeEqnList and newNodeEqnList */ /* - then see how many variables are from external processors */ /* - construct communication pattern */ /* --------------------------------------------------------------- */ /* --- construct unique equation list for A --- */ MLI_Utils_IntQSort2(nodeEqnList, newNodeEqnList, 0, totalNNodes-1); newNNodes = 1; for ( iN = 1; iN < totalNNodes; iN++ ) { if (nodeEqnList[iN] != nodeEqnList[newNNodes-1]) { newNodeEqnList[newNNodes] = newNodeEqnList[iN]; nodeEqnList[newNNodes++] = nodeEqnList[iN]; } } /* --- construct receive processor list --- */ iTempArray = new int[nprocs]; for ( iP = 0; iP < nprocs; iP++ ) iTempArray[iP] = 0; for ( iN = 0; iN < newNNodes; iN++ ) { if (nodeEqnList[iN] < localStartRow || nodeEqnList[iN] >= localEndRow) { for ( iP = 0; iP < nprocs; iP++ ) if ( nodeEqnList[iN] < partition[iP] ) break; iTempArray[iP-1]++; } } nRecvs = 0; for ( iP = 0; iP < nprocs; iP++ ) if ( iTempArray[iP] > 0 ) nRecvs++; if ( nRecvs > 0 ) { recvLengs = new int[nRecvs]; recvProcs = new int[nRecvs]; iSendBufs = new int*[nRecvs]; nRecvs = 0; for ( iP = 0; iP < nprocs; iP++ ) { if ( iTempArray[iP] > 0 ) { recvProcs[nRecvs] = iP; recvLengs[nRecvs++] = iTempArray[iP]; } } } delete [] iTempArray; /* --- construct send processor list --- */ procArray = new int[nprocs]; for ( iP = 0; iP < nprocs; iP++ ) procArray[iP] = 0; for ( iP = 0; iP < nRecvs; iP++ ) procArray[recvProcs[iP]] = 1; iTempArray = procArray; procArray = new int[nprocs]; MPI_Allreduce(iTempArray, procArray, nprocs, MPI_INT, MPI_SUM, comm); nSends = procArray[mypid]; delete [] procArray; delete [] iTempArray; if ( nSends > 0 ) { sendLengs = new int[nSends]; sendProcs = new int[nSends]; iRecvBufs = new int*[nSends]; requests = new MPI_Request[nSends]; statuses = new MPI_Status[nSends]; } /* --- get send lengths and sort send processor list --- */ for ( iP = 0; iP < nSends; iP++ ) MPI_Irecv(&(sendLengs[iP]), 1, MPI_INT, MPI_ANY_SOURCE, 57421, comm, &(requests[iP])); for ( iP = 0; iP < nRecvs; iP++ ) MPI_Send(&(recvLengs[iP]), 1, MPI_INT, recvProcs[iP], 57421, comm); for ( iP = 0; iP < nSends; iP++ ) { MPI_Wait( &(requests[iP]), &(statuses[iP]) ); sendProcs[iP] = statuses[iP].MPI_SOURCE; } MLI_Utils_IntQSort2(sendProcs, sendLengs, 0, nSends-1); /* --- send the receive equation list to the send processors --- */ for ( iP = 0; iP < nSends; iP++ ) { iRecvBufs[iP] = new int[sendLengs[iP]]; MPI_Irecv(iRecvBufs[iP], sendLengs[iP], MPI_INT, sendProcs[iP], 37290, comm, &(requests[iP])); } for ( iP = 0; iP < nRecvs; iP++ ) { iSendBufs[iP] = new int[recvLengs[iP]]; recvLengs[iP] = 0; } for ( iN = 0; iN < newNNodes; iN++ ) { if (nodeEqnList[iN] < localStartRow || nodeEqnList[iN] >= localEndRow) { for ( iP = 0; iP < nprocs; iP++ ) if ( nodeEqnList[iN] < partition[iP] ) break; index = MLI_Utils_BinarySearch( iP-1, recvProcs, nRecvs); iSendBufs[index][recvLengs[index]++] = nodeEqnList[iN]; } } for ( iP = 0; iP < nRecvs; iP++ ) { MPI_Send(iSendBufs[iP], recvLengs[iP], MPI_INT, recvProcs[iP], 37290, comm); delete [] iSendBufs[iP]; } if ( nRecvs > 0 ) delete [] iSendBufs; MPI_Waitall( nSends, requests, statuses ); /* --- set up the send Map (which elements to send) --- */ nSendMap = 0; for ( iP = 0; iP < nSends; iP++ ) nSendMap += sendLengs[iP]; sendMap = new int[nSendMap]; nSendMap = 0; for ( iP = 0; iP < nSends; iP++ ) { for ( jN = 0; jN < sendLengs[iP]; jN++ ) { globalEqnNum = iRecvBufs[iP][jN]; index = MLI_Utils_BinarySearch(globalEqnNum,nodeEqnList,newNNodes); sendMap[nSendMap++] = index; } delete [] iRecvBufs[iP]; } if ( nSends > 0 ) { delete [] iRecvBufs; delete [] requests; delete [] statuses; } /* --- store the communication information --- */ ddObj_ = new MLI_AMGSA_DD[1]; ddObj_->sendMap = sendMap; ddObj_->nSendMap = nSendMap; ddObj_->nSends = nSends; ddObj_->nRecvs = nRecvs; ddObj_->sendProcs = sendProcs; ddObj_->recvProcs = recvProcs; ddObj_->sendLengs = sendLengs; ddObj_->recvLengs = recvLengs; ddObj_->NNodes = newNNodes; ddObj_->dofPerNode = blockSize; ddObj_->ANodeEqnList = nodeEqnList; ddObj_->SNodeEqnList = newNodeEqnList; return 1; } hypre-2.33.0/src/FEI_mv/femli/mli_amgsa_dd_sfei.cxx000066400000000000000000003577001477326011500220720ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ // ********************************************************************* // This file is customized to use HYPRE matrix format // ********************************************************************* // ********************************************************************* // system includes // --------------------------------------------------------------------- #include #define MABS(x) ((x) > 0 ? (x) : (-(x))) // ********************************************************************* // HYPRE includes external to MLI // --------------------------------------------------------------------- #include "HYPRE.h" #include "_hypre_utilities.h" #include "HYPRE_IJ_mv.h" #include "seq_mv.h" #include "_hypre_parcsr_mv.h" #define mabs(x) ((x) > 0 ? x : -(x)) // ********************************************************************* // local defines // --------------------------------------------------------------------- #define MLI_METHOD_AMGSA_READY -1 #define MLI_METHOD_AMGSA_SELECTED -2 #define MLI_METHOD_AMGSA_PENDING -3 #define MLI_METHOD_AMGSA_NOTSELECTED -4 #define MLI_METHOD_AMGSA_SELECTED2 -5 // ********************************************************************* // local MLI includes // --------------------------------------------------------------------- #include "mli_method_amgsa.h" #include "mli_utils.h" #include "mli_sfei.h" #include "mli_fedata_utils.h" #include "mli_matrix.h" #include "mli_matrix_misc.h" #include "mli_solver.h" // ********************************************************************* // functions external to MLI // --------------------------------------------------------------------- extern "C" { /* ARPACK function to compute eigenvalues/eigenvectors */ void dnstev_(int *n, int *nev, char *which, double *sigmar, double *sigmai, int *colptr, int *rowind, double *nzvals, double *dr, double *di, double *z, int *ldz, int *info, double *tol); } /*********************************************************************** * COMPUTE SUBDOMAIN-BASED NULL SPACES USING EIGENDECOMPOSITION *********************************************************************** * compute initial null spaces (for the subdomain only) using FEData * --------------------------------------------------------------------- */ int MLI_Method_AMGSA::setupSFEIBasedNullSpaces(MLI *mli) { int k, iN, iD, iR, level, mypid, nElems, elemNNodes; int iE, iN2, **elemNodeLists, *elemNodeList1D, totalNNodes; int *partition, localStartRow, localNRows, *newElemNodeList; int eMatDim, newNNodes, *elemNodeList, count, *orderArray; int csrNrows, *csrIA, *csrJA, offset, rowSize, startCol; int rowInd, colInd, colOffset, rowLeng, start, nSubdomains; double **elemMatrices, *elemMat, *csrAA, dAccum; double *eigenR, *eigenI, *eigenV; char which[20], filename[100];; FILE *fp; MPI_Comm comm; MLI_SFEI *sfei; MLI_Matrix *mliAmat; hypre_ParCSRMatrix *hypreA; #ifdef MLI_ARPACK int info; double sigmaR, sigmaI; #endif #ifdef MLI_DEBUG_DETAILED printf("MLI_Method_AMGSA::setupSFEIBasedNullSpaces begins.\n"); #endif /* --------------------------------------------------------------- */ /* error checking */ /* --------------------------------------------------------------- */ if (mli == NULL) { printf("MLI_Method_AMGSA::setupSFEIBasedNullSpaces ERROR"); printf(" - no mli.\n"); exit(1); } level = 0; sfei = mli->getSFEI(level); if (sfei == NULL) { printf("MLI_Method_AMGSA::setupSFEIBasedNullSpaces ERROR"); printf(" - no sfei.\n"); exit(1); } nSubdomains = sfei->getNumElemBlocks(); if (nSubdomains <= 0) return 0; /* --------------------------------------------------------------- */ /* fetch communicator matrix information */ /* --------------------------------------------------------------- */ comm = getComm(); MPI_Comm_rank(comm, &mypid); mliAmat = mli->getSystemMatrix(level); hypreA = (hypre_ParCSRMatrix *) mliAmat->getMatrix(); HYPRE_ParCSRMatrixGetRowPartitioning((HYPRE_ParCSRMatrix) hypreA, &partition); localStartRow = partition[mypid]; localNRows = partition[mypid+1] - localStartRow; free(partition); /* --------------------------------------------------------------- */ /* fetch communicator matrix information */ /* --------------------------------------------------------------- */ startCol = 0; if (nullspaceVec_ != NULL) { for (k = 0; k < nullspaceDim_; k++) { dAccum = 0.0; for (iR = 0; iR < nullspaceLen_; iR++) dAccum += mabs(nullspaceVec_[iR+k*nullspaceLen_]); if (dAccum == 0.0) {startCol = k; break;} } if (k == nullspaceDim_) startCol = nullspaceDim_; if ( startCol == nullspaceDim_ ) return 0; } /* --------------------------------------------------------------- */ /* initialize null space vector and aggregation label */ /* --------------------------------------------------------------- */ //if ( nullspaceVec_ != NULL ) delete [] nullspaceVec_; if (nullspaceVec_ != NULL) hypre_assert( nullspaceLen_ == localNRows ); if (nullspaceVec_ == NULL) { nullspaceLen_ = localNRows; nullspaceVec_ = new double[localNRows*nullspaceDim_]; } if (saLabels_ == NULL) { saLabels_ = new int*[maxLevels_]; for (k = 0; k < maxLevels_; k++) saLabels_[k] = NULL; } if (saLabels_[0] != NULL) delete [] saLabels_[0]; saLabels_[0] = new int[localNRows]; for (k = 0; k < localNRows; k++) saLabels_[0][k] = -1; /* --------------------------------------------------------------- */ /* fetch SFEI information (nElems,elemIDs,elemNNodes,elemNodeLists)*/ /* --------------------------------------------------------------- */ if ((printToFile_ & 8) != 0 && nSubdomains == 1) { sprintf(filename,"elemNodeList.%d", mypid); fp = fopen(filename,"w"); } else fp = NULL; for (iD = 0; iD < nSubdomains; iD++) { nElems = sfei->getBlockNumElems(iD); if (fp != NULL) fprintf(fp, "%d\n", nElems); elemNNodes = sfei->getBlockElemNEqns(iD); elemNodeLists = sfei->getBlockElemEqnLists(iD); elemMatrices = sfei->getBlockElemStiffness(iD); totalNNodes = nElems * elemNNodes; elemNodeList1D = new int[totalNNodes]; count = 0; for (iE = 0; iE < nElems; iE++) for (iN = 0; iN < elemNNodes; iN++) elemNodeList1D[count++] = elemNodeLists[iE][iN]; /* ------------------------------------------------------ */ /* find the number of nodes in local subdomain (including */ /* external nodes) */ /* ------------------------------------------------------ */ orderArray = new int[totalNNodes]; newElemNodeList = new int[totalNNodes]; for ( iN = 0; iN < totalNNodes; iN++ ) { orderArray[iN] = iN; newElemNodeList[iN] = elemNodeList1D[iN]; } MLI_Utils_IntQSort2(newElemNodeList,orderArray,0,totalNNodes-1); elemNodeList1D[orderArray[0]] = 0; newNNodes = 0; for (iN = 1; iN < totalNNodes; iN++) { if (newElemNodeList[iN] == newElemNodeList[newNNodes]) elemNodeList1D[orderArray[iN]] = newNNodes; else { newNNodes++; elemNodeList1D[orderArray[iN]] = newNNodes; newElemNodeList[newNNodes] = newElemNodeList[iN]; } } if (totalNNodes > 0) newNNodes++; delete [] orderArray; delete [] newElemNodeList; /* -------------------------------------------------------- */ /* allocate and initialize subdomain matrix */ /* -------------------------------------------------------- */ eMatDim = elemNNodes; rowSize = elemNNodes * 16; csrNrows = newNNodes; csrIA = new int[csrNrows+1]; csrJA = new int[csrNrows*rowSize]; hypre_assert( csrJA != NULL ); csrAA = new double[csrNrows*rowSize]; hypre_assert(csrAA != NULL); for (iR = 0; iR < csrNrows; iR++) csrIA[iR] = iR * rowSize; /* -------------------------------------------------------- */ /* construct CSR matrix (with holes) */ /* -------------------------------------------------------- */ for (iE = 0; iE < nElems; iE++) { elemMat = elemMatrices[iE]; elemNodeList = elemNodeLists[iE]; for (iN = 0; iN < elemNNodes; iN++) { colInd = elemNodeList1D[iN+iE*elemNNodes]; colOffset = eMatDim * iN; for (iN2 = 0; iN2 < elemNNodes; iN2++) { if (elemMat[colOffset+iN2] != 0.0) { rowInd = elemNodeList1D[iN2+iE*elemNNodes]; offset = csrIA[rowInd]++; csrJA[offset] = colInd; csrAA[offset] = elemMat[iN2+colOffset]; } } } } /* -------------------------------------------------------- */ /* compress the CSR matrix */ /* -------------------------------------------------------- */ offset = 0; for (iR = 0; iR < csrNrows; iR++) { if (csrIA[iR] > rowSize * (iR+1)) { printf("MLI_Method_AMGSA::setupSFEIBasedNullSpaces "); printf("ERROR : rowSize too large (increase it). \n"); printf(" => allowed = %d, actual = %d\n",rowSize, csrIA[iR]-rowSize*iR); exit(1); } rowLeng = csrIA[iR] - iR * rowSize; csrIA[iR] = offset; start = iR * rowSize; MLI_Utils_IntQSort2a(&(csrJA[start]),&(csrAA[start]),0,rowLeng-1); count = start; for (k = start+1; k < start+rowLeng; k++) { if (csrJA[k] == csrJA[count]) csrAA[count] += csrAA[k]; else { count++; csrJA[count] = csrJA[k]; csrAA[count] = csrAA[k]; } } if (rowLeng > 0) count = count - start + 1; else count = 0; for (k = 0; k < count; k++) { csrJA[offset+k] = csrJA[start+k]; csrAA[offset+k] = csrAA[start+k]; } offset += count; } csrIA[csrNrows] = offset; /* -------------------------------------------------------- */ /* change from base-0 to base-1 indexing for Fortran call */ /* -------------------------------------------------------- */ for (iR = 0; iR < csrIA[csrNrows]; iR++) csrJA[iR]++; for (iR = 0; iR <= csrNrows; iR++) csrIA[iR]++; /* -------------------------------------------------------- */ /* compute near null spaces */ /* -------------------------------------------------------- */ strcpy(which, "Shift"); eigenR = new double[nullspaceDim_+1]; eigenI = new double[nullspaceDim_+1]; eigenV = new double[csrNrows*(nullspaceDim_+1)]; hypre_assert((long) eigenV); #ifdef MLI_ARPACK sigmaR = 1.0e-6; sigmaI = 0.0e0; dnstev_(&csrNrows, &nullspaceDim_, which, &sigmaR, &sigmaI, csrIA, csrJA, csrAA, eigenR, eigenI, eigenV, &csrNrows, &info, &arpackTol_); if (outputLevel_ > 2) { printf("%5d : Subdomain %3d (%3d) (size=%d) : \n",mypid,iD, nSubdomains,csrNrows); for (k = 0; k < nullspaceDim_; k++) printf("\t%5d : ARPACK eigenvalues %2d = %16.8e %16.8e\n", mypid, k, eigenR[k], eigenI[k]); } #else printf("MLI_Method_AMGSA::FATAL ERROR : ARPACK not installed.\n"); exit(1); #endif // strcpy( which, "destroy" ); #ifdef MLI_ARPACK // dnstev_(&csrNrows, &nullspaceDim_, which, &sigmaR, &sigmaI, // csrIA, csrJA, csrAA, eigenR, eigenI, eigenV, &csrNrows, &info, // &arpackTol_); #else printf("MLI_Method_AMGSA::FATAL ERROR : ARPACK not installed.\n"); exit(1); #endif delete [] eigenR; delete [] eigenI; delete [] csrIA; delete [] csrJA; delete [] csrAA; /* -------------------------------------------------------- */ /* load the null space vectors */ /* -------------------------------------------------------- */ if (nullspaceLen_ == 0) nullspaceLen_ = localNRows; if (nullspaceVec_ == NULL) nullspaceVec_ = new double[nullspaceLen_ * nullspaceDim_]; for (iE = 0; iE < nElems; iE++) { elemNodeList = elemNodeLists[iE]; for (iN = 0; iN < elemNNodes; iN++) { rowInd = elemNodeList[iN] - localStartRow; if (fp != NULL) fprintf(fp,"%7d ", rowInd+1); if (rowInd >= 0 && rowInd < localNRows) { saLabels_[0][rowInd] = iD; colInd = elemNodeList1D[iE*elemNNodes+iN]; for (k = startCol; k < nullspaceDim_; k++) nullspaceVec_[rowInd+k*nullspaceLen_] = eigenV[colInd+k*csrNrows]; } } if (fp != NULL) fprintf(fp,"\n"); } delete [] elemNodeList1D; /* -------------------------------------------------------- */ /* clean up */ /* -------------------------------------------------------- */ delete [] eigenV; } if (fp != NULL) fclose(fp); if ((printToFile_ & 4) != 0) { sprintf(filename, "eVec.%d", mypid); fp = fopen(filename, "w"); fprintf(fp," %d %d\n", nullspaceLen_, nullspaceDim_); for ( iN = 0; iN < nullspaceLen_; iN++ ) { for ( k = 0; k < nullspaceDim_; k++ ) fprintf(fp,"%17.9e ",nullspaceVec_[nullspaceLen_*k+iN]); fprintf(fp,"\n"); } fclose(fp); } #ifdef MLI_DEBUG_DETAILED printf("MLI_Method_AMGSA::setupSFEIBasedNullSpaces ends.\n"); #endif return 0; } /*********************************************************************** * SET UP AGGREGATES BASED ON FEI SUBDOMAIN INFORMATION *********************************************************************** * set up domain decomposition method by having each subdomain with * the same aggregate number 0 * --------------------------------------------------------------------- */ int MLI_Method_AMGSA::setupSFEIBasedAggregates(MLI *mli) { int iR, iD, level, mypid, *partition, localNRows, *aggrMap; int nSubdomains, nElems, elemNNodes, **elemNodeLists; int iE, iN, localStartRow, nprocs, index, count, *aggrMap2; MPI_Comm comm; MLI_Matrix *mliAmat; hypre_ParCSRMatrix *hypreA; MLI_SFEI *sfei; #ifdef MLI_DEBUG_DETAILED printf("MLI_Method_AMGSA:setupSFEIBasedAggregates begins...\n"); #endif /* --------------------------------------------------------------- */ /* error checking */ /* --------------------------------------------------------------- */ if (mli == NULL) { printf("MLI_Method_AMGSA::setupSFEIBasedAggregates ERROR"); printf(" - no mli.\n"); exit(1); } level = 0; sfei = mli->getSFEI(level); if (sfei == NULL) { printf("MLI_Method_AMGSA::setupSFEIBasedAggregates ERROR"); printf(" - no sfei.\n"); exit(1); } sfei->freeStiffnessMatrices(); nSubdomains = sfei->getNumElemBlocks(); if (nSubdomains <= 0) return 0; /* --------------------------------------------------------------- */ /* fetch communicator and matrix information */ /* --------------------------------------------------------------- */ comm = getComm(); MPI_Comm_rank(comm, &mypid); MPI_Comm_size(comm, &nprocs); mliAmat = mli->getSystemMatrix(level); hypreA = (hypre_ParCSRMatrix *) mliAmat->getMatrix(); HYPRE_ParCSRMatrixGetRowPartitioning((HYPRE_ParCSRMatrix) hypreA, &partition); localStartRow = partition[mypid]; localNRows = partition[mypid+1] - localStartRow; free(partition); /* --------------------------------------------------------------- */ /* create and fill the aggrMap array */ /* --------------------------------------------------------------- */ aggrMap = new int[localNRows]; aggrMap2 = new int[localNRows]; for (iR = 0; iR < localNRows; iR++) aggrMap[iR] = -1; if (saDataAux_ != NULL) { index = saDataAux_[0][0] + 1; for (iD = 0; iD < index; iD++) delete [] saDataAux_[iD]; delete [] saDataAux_; } saDataAux_ = new int*[nSubdomains+1]; saDataAux_[0] = new int[nSubdomains+1]; for (iD = 1; iD < nSubdomains+1; iD++) saDataAux_[iD] = NULL; saDataAux_[0][0] = nSubdomains; for (iD = 0; iD < nSubdomains; iD++) { for ( iR = 0; iR < localNRows; iR++ ) aggrMap2[iR] = -1; nElems = sfei->getBlockNumElems(iD); elemNNodes = sfei->getBlockElemNEqns(iD); elemNodeLists = sfei->getBlockElemEqnLists(iD); for (iE = 0; iE < nElems; iE++) { for (iN = 0; iN < elemNNodes; iN++) { index = elemNodeLists[iE][iN] - localStartRow; if (index >= 0 && index < localNRows && aggrMap[index] < 0) aggrMap[index] = iD; if (index >= 0 && index < localNRows) aggrMap2[index] = iD; } } count = 0; for (iR = 0; iR < localNRows; iR++) if (aggrMap2[iR] >= 0) count++; saDataAux_[0][iD+1] = count; saDataAux_[iD+1] = new int[count]; count = 0; for (iR = 0; iR < localNRows; iR++) if (aggrMap2[iR] >= 0) saDataAux_[iD+1][count++] = iR; } #if 0 /* force non-overlapped aggregates */ for ( iD = 0; iD < nSubdomains; iD++ ) { count = 0; for (iR = 0; iR < localNRows; iR++) if (aggrMap[iR] == iD) count++; saDataAux_[0][iD+1] = count; if (saDataAux_[iD+1] != NULL) delete [] saDataAux_[iD+1]; saDataAux_[iD+1] = new int[count]; count = 0; for (iR = 0; iR < localNRows; iR++) if (aggrMap[iR] == iD) saDataAux_[iD+1][count++] = iR; } #endif delete [] aggrMap2; saData_[0] = aggrMap; saCounts_[0] = nSubdomains; numLevels_ = 2; minCoarseSize_ = nprocs; #ifdef MLI_DEBUG_DETAILED printf("MLI_Method_AMGSA::setupSFEIBasedAggregates ends.\n"); #endif return 0; } /*********************************************************************** * set up domain decomposition method by extending the local problem * (based on Bank-Lu-Tong-Vassilevski method but with aggregation) * --------------------------------------------------------------------- */ int MLI_Method_AMGSA::setupExtendedDomainDecomp(MLI *mli) { MLI_Function *funcPtr; /* --------------------------------------------------------------- */ /* error checking */ /* --------------------------------------------------------------- */ if (mli == NULL) { printf("MLI_Method_AMGSA::setupExtendedDomainDecomp ERROR"); printf(" - no mli.\n"); exit(1); } /* *************************************************************** */ /* creating the local expanded matrix */ /* --------------------------------------------------------------- */ /* --------------------------------------------------------------- */ /* fetch communicator and fine matrix information */ /* --------------------------------------------------------------- */ MPI_Comm comm; int mypid, nprocs, level, *partition, ANRows; MLI_Matrix *mli_Amat; hypre_ParCSRMatrix *hypreA; comm = getComm(); MPI_Comm_rank( comm, &mypid ); MPI_Comm_size( comm, &nprocs ); #ifdef MLI_DEBUG_DETAILED printf("%d : MLI_Method_AMGSA::setupExtendedDomainDecomp begins...\n",mypid); #endif level = 0; mli_Amat = mli->getSystemMatrix( level ); hypreA = (hypre_ParCSRMatrix *) mli_Amat->getMatrix(); HYPRE_ParCSRMatrixGetRowPartitioning((HYPRE_ParCSRMatrix) hypreA, &partition); ANRows = partition[mypid+1] - partition[mypid]; free( partition ); /* --------------------------------------------------------------- */ /* first save the nodeDofs and null space information */ /* (since genP replaces the null vectors with new ones) */ /* --------------------------------------------------------------- */ int nodeDofs, iD, iD2; double *nullVecs=NULL; nodeDofs = currNodeDofs_; nullVecs = new double[nullspaceDim_*ANRows]; if (nullspaceVec_ != NULL) { for (iD = 0; iD < nullspaceDim_*ANRows; iD++) nullVecs[iD] = nullspaceVec_[iD]; } else { for (iD = 0; iD < nullspaceDim_; iD++) for (iD2 = 0; iD2 < ANRows; iD2++) if (MABS((iD - iD2)) % nullspaceDim_ == 0) nullVecs[iD*ANRows+iD2] = 1.0; else nullVecs[iD*ANRows+iD2] = 0.0; } /* --------------------------------------------------------------- */ /* create the first coarse grid matrix (the off processor block */ /* will be the 2,2 block of my expanded matrix) */ /* Note: genP_DD coarsens less on processor boundaries. */ /* --------------------------------------------------------------- */ int *ACPartition, ACNRows, ACStart, *aggrInfo, *bdryData; MLI_Matrix *mli_Pmat, *mli_cAmat; hypre_ParCSRMatrix *hypreAc, *hypreP; hypre_ParCSRCommPkg *commPkg; genP_DD(mli_Amat, &mli_Pmat, &aggrInfo, &bdryData); delete [] aggrInfo; hypreP = (hypre_ParCSRMatrix *) mli_Pmat->getMatrix(); commPkg = hypre_ParCSRMatrixCommPkg(hypreP); if (commPkg == NULL) hypre_MatvecCommPkgCreate(hypreP); MLI_Matrix_ComputePtAP(mli_Pmat, mli_Amat, &mli_cAmat); hypreAc = (hypre_ParCSRMatrix *) mli_cAmat->getMatrix(); HYPRE_ParCSRMatrixGetRowPartitioning((HYPRE_ParCSRMatrix) hypreAc, &ACPartition); ACStart = ACPartition[mypid]; ACNRows = ACPartition[mypid+1] - ACStart; /* --------------------------------------------------------------- */ /* fetch communication information for the coarse matrix */ /* --------------------------------------------------------------- */ int nRecvs, *recvProcs, nSends, *sendProcs; commPkg = hypre_ParCSRMatrixCommPkg(hypreAc); if ( commPkg == NULL ) { hypre_MatvecCommPkgCreate((hypre_ParCSRMatrix *) hypreAc); commPkg = hypre_ParCSRMatrixCommPkg(hypreAc); } nRecvs = hypre_ParCSRCommPkgNumRecvs(commPkg); recvProcs = hypre_ParCSRCommPkgRecvProcs(commPkg); nSends = hypre_ParCSRCommPkgNumSends(commPkg); sendProcs = hypre_ParCSRCommPkgSendProcs(commPkg); /* --------------------------------------------------------------- */ /* calculate the size of my local expanded off matrix (this is */ /* needed to create the permutation matrix) - the local size of */ /* the expanded off matrix should be the total number of rows of */ /* my recv neighbors */ /* --------------------------------------------------------------- */ int iP, PENCols, proc, *PEPartition, PECStart, *recvLengs; PENCols = 0; if (nRecvs > 0) recvLengs = new int[nRecvs]; for (iP = 0; iP < nRecvs; iP++) { proc = recvProcs[iP]; PENCols += (ACPartition[proc+1] - ACPartition[proc]); recvLengs[iP] = ACPartition[proc+1] - ACPartition[proc]; } PEPartition = new int[nprocs+1]; MPI_Allgather(&PENCols,1,MPI_INT,&(PEPartition[1]),1,MPI_INT,comm); PEPartition[0] = 0; for (iP = 2; iP <= nprocs; iP++) PEPartition[iP] += PEPartition[iP-1]; PECStart = PEPartition[mypid]; /* --------------------------------------------------------------- */ /* since PE(i,j) = 1 means putting external row i into local row */ /* j, and since I may not own row i of PE, I need to tell my */ /* neighbor processor who owns row i the value of j. */ /* ==> procOffsets */ /* --------------------------------------------------------------- */ int *procOffsets, offset; MPI_Request *mpiRequests; MPI_Status mpiStatus; if (nSends > 0) { mpiRequests = new MPI_Request[nSends]; procOffsets = new int[nSends]; } for (iP = 0; iP < nSends; iP++) MPI_Irecv(&procOffsets[iP],1,MPI_INT,sendProcs[iP],13582,comm, &(mpiRequests[iP])); offset = 0; for (iP = 0; iP < nRecvs; iP++) { MPI_Send(&offset, 1, MPI_INT, recvProcs[iP], 13582, comm); offset += (ACPartition[recvProcs[iP]+1] - ACPartition[recvProcs[iP]]); } for (iP = 0; iP < nSends; iP++) MPI_Wait(&(mpiRequests[iP]), &mpiStatus); if (nSends > 0) delete [] mpiRequests; /* --------------------------------------------------------------- */ /* create the permutation matrix to gather expanded coarse matrix */ /* PE has same number of rows as Ac but it has many more columns */ /* --------------------------------------------------------------- */ int ierr, *rowSizes, *colInds, rowIndex; double *colVals; char paramString[50]; MLI_Matrix *mli_PE; HYPRE_IJMatrix IJ_PE; hypre_ParCSRMatrix *hyprePE; ierr = HYPRE_IJMatrixCreate(comm,ACStart,ACStart+ACNRows-1, PECStart,PECStart+PENCols-1,&IJ_PE); ierr += HYPRE_IJMatrixSetObjectType(IJ_PE, HYPRE_PARCSR); hypre_assert(!ierr); if (ACNRows > 0) rowSizes = new int[ACNRows]; for (iD = 0; iD < ACNRows; iD++) rowSizes[iD] = nSends; ierr = HYPRE_IJMatrixSetRowSizes(IJ_PE, rowSizes); ierr += HYPRE_IJMatrixInitialize(IJ_PE); hypre_assert(!ierr); if (ACNRows > 0) delete [] rowSizes; if (nSends > 0) { colInds = new int[nSends]; colVals = new double[nSends]; for (iP = 0; iP < nSends; iP++) colVals[iP] = 1.0; } for (iD = 0; iD < ACNRows; iD++) { rowIndex = iD + ACStart; for (iP = 0; iP < nSends; iP++) colInds[iP] = procOffsets[iP] + PEPartition[sendProcs[iP]] + iD; HYPRE_IJMatrixSetValues(IJ_PE, 1, &nSends, (const int *) &rowIndex, (const int *) colInds, (const double *) colVals); } if (nSends > 0) { delete [] colInds; delete [] colVals; delete [] procOffsets; } HYPRE_IJMatrixAssemble(IJ_PE); HYPRE_IJMatrixGetObject(IJ_PE, (void **) &hyprePE); funcPtr = new MLI_Function(); MLI_Utils_HypreParCSRMatrixGetDestroyFunc(funcPtr); sprintf(paramString, "HYPRE_ParCSR"); mli_PE = new MLI_Matrix( (void *) hyprePE, paramString, funcPtr); delete funcPtr; commPkg = hypre_ParCSRMatrixCommPkg(hyprePE); if (commPkg == NULL) hypre_MatvecCommPkgCreate((hypre_ParCSRMatrix *) hyprePE); /* --------------------------------------------------------------- */ /* form the expanded coarse matrix (that is, the (2,2) block of my */ /* final matrix). Also, form A * P (in order to form the (1,2) and */ /* and (2,1) block */ /* --------------------------------------------------------------- */ MLI_Matrix *mli_AExt; hypre_ParCSRMatrix *hypreAExt, *hypreAP; MLI_Matrix_ComputePtAP(mli_PE, mli_cAmat, &mli_AExt); hypreAExt = (hypre_ParCSRMatrix *) mli_AExt->getMatrix(); hypreP = (hypre_ParCSRMatrix *) mli_Pmat->getMatrix(); hypreAP = hypre_ParMatmul(hypreA, hypreP); /* --------------------------------------------------------------- */ /* coarsen one more time for non-neighbor fine aggregates */ /* then create [A_c Aco Poo Po2 */ /* trans Po2^T Aoo Po2] */ /* --------------------------------------------------------------- */ #if 0 // generate Po2 MLI_Matrix *mli_Pmat2; // set up one aggregate per processor //### need to set bdryData for my immediate neighbors to 0 genP_Selective(mli_AExt, &mli_Pmat2, PENCols, bdryData); delete [] bdryData; // compute Aco Poo Po2 hypre_ParCSRMatrix *hypreP2, *hypreP3, *hypreAP2; hypreP2 = (hypre_ParCSRMatrix *) mli_Pmat2->getMatrix(); hypreAP2 = hypre_ParMatmul(hypreAP, hypreP2); hypreP3 = hypre_ParMatmul(hypreP, hypreP2); // compute Po2^T Aoo Po2 MLI_Matrix *mli_AExt2; MLI_Matrix_ComputePtAP(mli_Pmat2, mli_AExt, &mli_AExt2); // adjust pointers hypre_ParCSRMatrixDestroy(hypreAP); hypreAP = hypreAP2; delete mli_Pmat; funcPtr = new MLI_Function(); MLI_Utils_HypreParCSRMatrixGetDestroyFunc(funcPtr); sprintf(paramString, "HYPRE_ParCSR"); mli_Pmat = new MLI_Matrix(hypreP3, paramString, funcPtr); delete funcPtr; delete mli_Pmat2; delete mli_AExt; mli_AExt = mli_AExt2; hypreAExt = (hypre_ParCSRMatrix *) mli_AExt->getMatrix(); hypreP = (hypre_ParCSRMatrix *) mli_Pmat->getMatrix(); #endif /* --------------------------------------------------------------- */ /* concatenate the local and the (1,2) and (2,2) block */ /* --------------------------------------------------------------- */ int *AdiagI, *AdiagJ, *APoffdI, *APoffdJ, *AEdiagI, *AEdiagJ, index; int *APcmap, newNrows, *newIA, *newJA, newNnz, *auxIA, iR, iC; double *AdiagA, *APoffdA, *AEdiagA, *newAA; hypre_CSRMatrix *Adiag, *APoffd, *AEdiag; Adiag = hypre_ParCSRMatrixDiag(hypreA); AdiagI = hypre_CSRMatrixI(Adiag); AdiagJ = hypre_CSRMatrixJ(Adiag); AdiagA = hypre_CSRMatrixData(Adiag); APoffd = hypre_ParCSRMatrixOffd(hypreAP); APoffdI = hypre_CSRMatrixI(APoffd); APoffdJ = hypre_CSRMatrixJ(APoffd); APoffdA = hypre_CSRMatrixData(APoffd); APcmap = hypre_ParCSRMatrixColMapOffd(hypreAP); AEdiag = hypre_ParCSRMatrixDiag(hypreAExt); AEdiagI = hypre_CSRMatrixI(AEdiag); AEdiagJ = hypre_CSRMatrixJ(AEdiag); AEdiagA = hypre_CSRMatrixData(AEdiag); newNrows = ANRows + PENCols; newIA = new int[newNrows+1]; newNnz = AdiagI[ANRows] + AEdiagI[PENCols] + 2 * APoffdI[ANRows]; newJA = new int[newNnz]; newAA = new double[newNnz]; auxIA = new int[PENCols]; newNnz = 0; newIA[0] = newNnz; for ( iR = 0; iR < PENCols; iR++ ) auxIA[iR] = 0; // (1,1) and (1,2) blocks for ( iR = 0; iR < ANRows; iR++ ) { for ( iC = AdiagI[iR]; iC < AdiagI[iR+1]; iC++ ) { newJA[newNnz] = AdiagJ[iC]; newAA[newNnz++] = AdiagA[iC]; } for ( iC = APoffdI[iR]; iC < APoffdI[iR+1]; iC++ ) { index = APcmap[APoffdJ[iC]]; offset = ANRows; for ( iP = 0; iP < nRecvs; iP++ ) { if ( index < ACPartition[recvProcs[iP]+1] ) { index = index - ACPartition[recvProcs[iP]] + offset; break; } offset += (ACPartition[recvProcs[iP]+1] - ACPartition[recvProcs[iP]]); } newJA[newNnz] = index; newAA[newNnz++] = APoffdA[iC]; APoffdJ[iC] = index; auxIA[index-ANRows]++; } newIA[iR+1] = newNnz; } // (2,2) block for ( iR = ANRows; iR < ANRows+PENCols; iR++ ) { newNnz += auxIA[iR-ANRows]; for ( iC = AEdiagI[iR-ANRows]; iC < AEdiagI[iR-ANRows+1]; iC++ ) { newJA[newNnz] = AEdiagJ[iC] + ANRows; newAA[newNnz++] = AEdiagA[iC]; } newIA[iR+1] = newNnz; } // (2,1) block for ( iR = 0; iR < PENCols; iR++ ) auxIA[iR] = 0; for ( iR = 0; iR < ANRows; iR++ ) { for ( iC = APoffdI[iR]; iC < APoffdI[iR+1]; iC++ ) { index = APoffdJ[iC]; offset = newIA[index] + auxIA[index-ANRows]; newJA[offset] = iR; newAA[offset] = APoffdA[iC]; auxIA[index-ANRows]++; } } /* --------------------------------------------------------------- */ int iZero=0, *newRowSizes; MPI_Comm newMPIComm; HYPRE_IJMatrix IJnewA; hypre_ParCSRMatrix *hypreNewA; MLI_Matrix *mli_newA; MPI_Comm_split(comm, mypid, iZero, &newMPIComm); ierr = HYPRE_IJMatrixCreate(newMPIComm,iZero,newNrows-1,iZero, newNrows-1,&IJnewA); ierr += HYPRE_IJMatrixSetObjectType(IJnewA, HYPRE_PARCSR); hypre_assert(!ierr); if ( newNrows > 0 ) newRowSizes = new int[newNrows]; for ( iD = 0; iD < newNrows; iD++ ) newRowSizes[iD] = newIA[iD+1] - newIA[iD]; ierr = HYPRE_IJMatrixSetRowSizes(IJnewA, newRowSizes); ierr += HYPRE_IJMatrixInitialize(IJnewA); hypre_assert(!ierr); for ( iD = 0; iD < newNrows; iD++ ) { offset = newIA[iD]; HYPRE_IJMatrixSetValues(IJnewA, 1, &newRowSizes[iD], (const int *) &iD, (const int *) &newJA[offset], (const double *) &newAA[offset]); } if ( newNrows > 0 ) delete [] newRowSizes; delete [] newIA; delete [] newJA; delete [] newAA; HYPRE_IJMatrixAssemble(IJnewA); HYPRE_IJMatrixGetObject(IJnewA, (void **) &hypreNewA); sprintf(paramString, "HYPRE_ParCSR" ); funcPtr = new MLI_Function(); MLI_Utils_HypreParCSRMatrixGetDestroyFunc(funcPtr); mli_newA = new MLI_Matrix( (void *) hypreNewA, paramString, funcPtr); /* --------------------------------------------------------------- */ /* communicate null space vectors */ /* --------------------------------------------------------------- */ int rLength, sLength; double *tmpNullVecs, *newNullVecs; if ( PENCols > 0 ) tmpNullVecs = new double[PENCols*nullspaceDim_]; if ( nRecvs > 0 ) mpiRequests = new MPI_Request[nRecvs]; offset = 0; for ( iP = 0; iP < nRecvs; iP++ ) { rLength = ACPartition[recvProcs[iP]+1] - ACPartition[recvProcs[iP]]; rLength *= nullspaceDim_; MPI_Irecv(&tmpNullVecs[offset],rLength,MPI_DOUBLE,recvProcs[iP],14581, comm,&(mpiRequests[iP])); offset += rLength; } for ( iP = 0; iP < nSends; iP++ ) { sLength = ACNRows * nullspaceDim_; MPI_Send(nullVecs, sLength, MPI_DOUBLE, sendProcs[iP], 14581, comm); } for ( iP = 0; iP < nRecvs; iP++ ) MPI_Wait( &(mpiRequests[iP]), &mpiStatus ); if ( nRecvs > 0 ) delete [] mpiRequests; newNullVecs = new double[newNrows*nullspaceDim_]; for ( iD = 0; iD < nullspaceDim_; iD++ ) for ( iD2 = 0; iD2 < ANRows; iD2++ ) newNullVecs[iD*newNrows+iD2] = nullVecs[iD*ANRows+iD2]; offset = 0; for ( iP = 0; iP < nRecvs; iP++ ) { rLength = ACPartition[recvProcs[iP]+1] - ACPartition[recvProcs[iP]]; for ( iD = 0; iD < nullspaceDim_; iD++ ) for ( iD2 = 0; iD2 < rLength; iD2++ ) newNullVecs[iD*newNrows+iD2+offset] = tmpNullVecs[offset+iD*rLength+iD2]; rLength *= nullspaceDim_; offset += rLength; } if ( PENCols > 0 ) delete [] tmpNullVecs; /* --------------------------------------------------------------- */ /* create new overlapped DD smoother using sequential SuperLU */ /* --------------------------------------------------------------- */ int *sendLengs; char *targv[7]; MLI_Solver *smootherPtr; MLI_Matrix *mli_PSmat; //sprintf( paramString, "SeqSuperLU" ); if (!strcmp(preSmoother_, "CGMLI")) sprintf(paramString, "CGMLI"); else sprintf(paramString, "CGAMG"); smootherPtr = MLI_Solver_CreateFromName(paramString); sprintf( paramString, "numSweeps 10000" ); smootherPtr->setParams(paramString, 0, NULL); sprintf( paramString, "tolerance 1.0e-6" ); smootherPtr->setParams(paramString, 0, NULL); // restate these lines if aggregation is used for subdomain solve // delete [] newNullVecs; //sprintf( paramString, "setNullSpace" ); //targv[0] = (char *) &nullspaceDim_; //targv[1] = (char *) newNullVecs; //smootherPtr->setParams(paramString, 2, targv); // send PSmat and communication information to smoother if ( nSends > 0 ) sendLengs = new int[nSends]; for ( iP = 0; iP < nSends; iP++ ) sendLengs[iP] = ACNRows; sprintf( paramString, "setPmat" ); mli_PSmat = mli_Pmat; targv[0] = (char *) mli_PSmat; smootherPtr->setParams(paramString, 1, targv); sprintf( paramString, "setCommData" ); targv[0] = (char *) &nRecvs; targv[1] = (char *) recvProcs; targv[2] = (char *) recvLengs; targv[3] = (char *) &nSends; targv[4] = (char *) sendProcs; targv[5] = (char *) sendLengs; targv[6] = (char *) &comm; smootherPtr->setParams(paramString, 7, targv); if ( nSends > 0 ) delete [] sendLengs; smootherPtr->setup(mli_newA); mli->setSmoother( level, MLI_SMOOTHER_PRE, smootherPtr ); /* --------------------------------------------------------------- */ /* create prolongation and coarse grid operators */ /* --------------------------------------------------------------- */ MLI_Solver *csolvePtr; MLI_Matrix *mli_Rmat; delete mli_cAmat; // set up one aggregate per processor saCounts_[0] = 1; if (saData_[0] != NULL) delete [] saData_[0]; saData_[0] = new int[ANRows]; for ( iD = 0; iD < ANRows; iD++ ) saData_[0][iD] = 0; // restore nullspace changed by the last genP currNodeDofs_ = nodeDofs; if ( nullspaceVec_ != NULL ) delete [] nullspaceVec_; nullspaceVec_ = new double[nullspaceDim_*ANRows]; for ( iD = 0; iD < nullspaceDim_*ANRows; iD++) nullspaceVec_[iD] = nullVecs[iD]; // create prolongation and coarse grid operators genP(mli_Amat, &mli_Pmat, saCounts_[0], saData_[0]); MLI_Matrix_ComputePtAP(mli_Pmat, mli_Amat, &mli_cAmat); mli->setSystemMatrix(level+1, mli_cAmat); mli->setProlongation(level+1, mli_Pmat); sprintf(paramString, "HYPRE_ParCSRT"); mli_Rmat = new MLI_Matrix(mli_Pmat->getMatrix(), paramString, NULL); mli->setRestriction(level, mli_Rmat); /* --------------------------------------------------------------- */ /* setup coarse solver */ /* --------------------------------------------------------------- */ strcpy( paramString, "SuperLU" ); csolvePtr = MLI_Solver_CreateFromName( paramString ); csolvePtr->setup(mli_cAmat); mli->setCoarseSolve(csolvePtr); /* --------------------------------------------------------------- */ /* clean up */ /* --------------------------------------------------------------- */ free( ACPartition ); delete [] PEPartition; delete [] auxIA; HYPRE_IJMatrixDestroy(IJ_PE); delete mli_AExt; delete [] nullVecs; delete mli_PE; #ifdef MLI_DEBUG_DETAILED printf("%d : MLI_Method_AMGSA::setupExtendedDomainDecomp ends.\n",mypid); #endif level = 2; return (level); } // ************************************************************************ // Purpose : Given Amat, perform preferential coarsening (small aggregates // near processor boundaries and create the corresponding Pmat // (called by setupExtendedDomainDecomp) // ------------------------------------------------------------------------ double MLI_Method_AMGSA::genP_DD(MLI_Matrix *mli_Amat,MLI_Matrix **PmatOut, int **eqn2aggrOut, int **bdryDataOut) { int mypid, nprocs, *partition, AStartRow, AEndRow, ALocalNRows; int blkSize, naggr, *node2aggr, ierr, PLocalNCols, PStartCol; int PLocalNRows, PStartRow, *eqn2aggr, irow, jcol, ig, *bdryData; int *PCols, maxAggSize, *aggCntArray, index, **aggIndArray; int aggSize, nzcnt, *rowLengths, rowNum, *colInd; double **PVecs, *newNull, *qArray, *rArray, *colVal; char paramString[200]; HYPRE_IJMatrix IJPmat; hypre_ParCSRMatrix *Amat, *A2mat, *Pmat; MLI_Matrix *mli_A2mat=NULL, *mli_Pmat; MPI_Comm comm; hypre_ParCSRCommPkg *commPkg; MLI_Function *funcPtr; /*----------------------------------------------------------------- * fetch matrix and machine information *-----------------------------------------------------------------*/ Amat = (hypre_ParCSRMatrix *) mli_Amat->getMatrix(); comm = hypre_ParCSRMatrixComm(Amat); MPI_Comm_rank(comm,&mypid); MPI_Comm_size(comm,&nprocs); /*----------------------------------------------------------------- * fetch other matrix information *-----------------------------------------------------------------*/ HYPRE_ParCSRMatrixGetRowPartitioning((HYPRE_ParCSRMatrix) Amat,&partition); AStartRow = partition[mypid]; AEndRow = partition[mypid+1] - 1; ALocalNRows = AEndRow - AStartRow + 1; free( partition ); /*----------------------------------------------------------------- * reduce Amat based on the block size information (if nodeDofs_ > 1) *-----------------------------------------------------------------*/ blkSize = currNodeDofs_; if (blkSize > 1) MLI_Matrix_Compress(mli_Amat, blkSize, &mli_A2mat); else mli_A2mat = mli_Amat; A2mat = (hypre_ParCSRMatrix *) mli_A2mat->getMatrix(); /*----------------------------------------------------------------- * modify minimum aggregate size, if needed *-----------------------------------------------------------------*/ minAggrSize_ = nullspaceDim_ / currNodeDofs_; if ( minAggrSize_ <= 1 ) minAggrSize_ = 2; /*----------------------------------------------------------------- * perform coarsening (small aggregates on processor boundaries) * 10/2005 : add bdryData for secondary aggregation *-----------------------------------------------------------------*/ coarsenGraded(A2mat, &naggr, &node2aggr, &bdryData); if (blkSize > 1 && mli_A2mat != NULL) delete mli_A2mat; if (blkSize > 1) { (*bdryDataOut) = new int[ALocalNRows]; for (irow = 0; irow < ALocalNRows; irow++) (*bdryDataOut)[irow] = bdryData[irow/blkSize]; delete [] bdryData; } else (*bdryDataOut) = bdryData; /*----------------------------------------------------------------- * fetch the coarse grid information and instantiate P *-----------------------------------------------------------------*/ PLocalNCols = naggr * nullspaceDim_; MLI_Utils_GenPartition(comm, PLocalNCols, &partition); PStartCol = partition[mypid]; free( partition ); PLocalNRows = ALocalNRows; PStartRow = AStartRow; ierr = HYPRE_IJMatrixCreate(comm,PStartRow,PStartRow+PLocalNRows-1, PStartCol,PStartCol+PLocalNCols-1,&IJPmat); ierr = HYPRE_IJMatrixSetObjectType(IJPmat, HYPRE_PARCSR); hypre_assert(!ierr); /*----------------------------------------------------------------- * expand the aggregation information if block size > 1 ==> eqn2aggr *-----------------------------------------------------------------*/ if ( blkSize > 1 ) { eqn2aggr = new int[ALocalNRows]; for ( irow = 0; irow < ALocalNRows; irow++ ) eqn2aggr[irow] = node2aggr[irow/blkSize]; delete [] node2aggr; } else eqn2aggr = node2aggr; /*----------------------------------------------------------------- * create a compact form for the null space vectors * (get ready to perform QR on them) *-----------------------------------------------------------------*/ PVecs = new double*[nullspaceDim_]; PCols = new int[PLocalNRows]; for (irow = 0; irow < nullspaceDim_; irow++) PVecs[irow] = new double[PLocalNRows]; for ( irow = 0; irow < PLocalNRows; irow++ ) { if ( eqn2aggr[irow] >= 0 ) PCols[irow] = PStartCol + eqn2aggr[irow] * nullspaceDim_; else PCols[irow] = PStartCol + (-eqn2aggr[irow]-1) * nullspaceDim_; if ( nullspaceVec_ != NULL ) { for ( jcol = 0; jcol < nullspaceDim_; jcol++ ) PVecs[jcol][irow] = nullspaceVec_[jcol*PLocalNRows+irow]; } else { for ( jcol = 0; jcol < nullspaceDim_; jcol++ ) { if (irow % nullspaceDim_ == jcol) PVecs[jcol][irow] = 1.0; else PVecs[jcol][irow] = 0.0; } } } /*----------------------------------------------------------------- * perform QR for null space *-----------------------------------------------------------------*/ newNull = NULL; if ( PLocalNRows > 0 ) { /* ------ count the size of each aggregate ------ */ aggCntArray = new int[naggr]; for ( ig = 0; ig < naggr; ig++ ) aggCntArray[ig] = 0; for ( irow = 0; irow < PLocalNRows; irow++ ) if ( eqn2aggr[irow] >= 0 ) aggCntArray[eqn2aggr[irow]]++; else aggCntArray[(-eqn2aggr[irow]-1)]++; maxAggSize = 0; for ( ig = 0; ig < naggr; ig++ ) if (aggCntArray[ig] > maxAggSize) maxAggSize = aggCntArray[ig]; /* ------ register which equation is in which aggregate ------ */ aggIndArray = new int*[naggr]; for ( ig = 0; ig < naggr; ig++ ) { aggIndArray[ig] = new int[aggCntArray[ig]]; aggCntArray[ig] = 0; } for ( irow = 0; irow < PLocalNRows; irow++ ) { index = eqn2aggr[irow]; if ( index >= 0 ) aggIndArray[index][aggCntArray[index]++] = irow; else aggIndArray[-index-1][aggCntArray[-index-1]++] = irow; } /* ------ allocate storage for QR factorization ------ */ qArray = new double[maxAggSize * nullspaceDim_]; rArray = new double[nullspaceDim_ * nullspaceDim_]; newNull = new double[naggr*nullspaceDim_*nullspaceDim_]; /* ------ perform QR on each aggregate ------ */ for ( ig = 0; ig < naggr; ig++ ) { aggSize = aggCntArray[ig]; if ( aggSize < nullspaceDim_ ) { printf("Aggregation ERROR : underdetermined system in QR.\n"); printf(" error on Proc %d\n", mypid); printf(" error on aggr %d (%d)\n", ig, naggr); printf(" aggr size is %d\n", aggSize); exit(1); } /* ------ put data into the temporary array ------ */ for ( jcol = 0; jcol < aggSize; jcol++ ) { for ( irow = 0; irow < nullspaceDim_; irow++ ) qArray[aggSize*irow+jcol] = PVecs[irow][aggIndArray[ig][jcol]]; } /* ------ call QR function ------ */ /* if ( currLevel_ < (numLevels_-1) ) { info = MLI_Utils_QR(qArray, rArray, aggSize, nullspaceDim_); if (info != 0) { printf("%4d : Aggregation WARNING : QR returns non-zero for\n", mypid); printf(" aggregate %d, size = %d, info = %d\n",ig,aggSize,info); } } else { for ( irow = 0; irow < nullspaceDim_; irow++ ) { dtemp = 0.0; for ( jcol = 0; jcol < aggSize; jcol++ ) dtemp += qArray[aggSize*irow+jcol]*qArray[aggSize*irow+jcol]; dtemp = 1.0 / sqrt(dtemp); for ( jcol = 0; jcol < aggSize; jcol++ ) qArray[aggSize*irow+jcol] *= dtemp; } } */ /* ------ after QR, put the R into the next null space ------ */ /* for ( jcol = 0; jcol < nullspaceDim_; jcol++ ) for ( irow = 0; irow < nullspaceDim_; irow++ ) newNull[ig*nullspaceDim_+jcol+irow*naggr*nullspaceDim_] = rArray[jcol+nullspaceDim_*irow]; */ for ( jcol = 0; jcol < nullspaceDim_; jcol++ ) for ( irow = 0; irow < nullspaceDim_; irow++ ) if ( irow == jcol ) newNull[ig*nullspaceDim_+jcol+irow*naggr*nullspaceDim_] = 1.0; else newNull[ig*nullspaceDim_+jcol+irow*naggr*nullspaceDim_] = 0.0; /* ------ put the P to PVecs ------ */ for ( jcol = 0; jcol < aggSize; jcol++ ) { for ( irow = 0; irow < nullspaceDim_; irow++ ) { index = aggIndArray[ig][jcol]; PVecs[irow][index] = qArray[ irow*aggSize + jcol ]; } } } for ( ig = 0; ig < naggr; ig++ ) delete [] aggIndArray[ig]; delete [] aggIndArray; delete [] aggCntArray; delete [] qArray; delete [] rArray; } if ( nullspaceVec_ != NULL ) delete [] nullspaceVec_; nullspaceVec_ = newNull; /*----------------------------------------------------------------- * initialize Pmat *-----------------------------------------------------------------*/ rowLengths = new int[PLocalNRows]; for ( irow = 0; irow < PLocalNRows; irow++ ) rowLengths[irow] = nullspaceDim_; ierr = HYPRE_IJMatrixSetRowSizes(IJPmat, rowLengths); ierr = HYPRE_IJMatrixInitialize(IJPmat); hypre_assert(!ierr); delete [] rowLengths; /*-------------------------------------------------------------------- * load and assemble Pmat *--------------------------------------------------------------------*/ colInd = new int[nullspaceDim_]; colVal = new double[nullspaceDim_]; for ( irow = 0; irow < PLocalNRows; irow++ ) { if ( PCols[irow] >= 0 ) { nzcnt = 0; for ( jcol = 0; jcol < nullspaceDim_; jcol++ ) { if ( PVecs[jcol][irow] != 0.0 ) { colInd[nzcnt] = PCols[irow] + jcol; colVal[nzcnt++] = PVecs[jcol][irow]; } } rowNum = PStartRow + irow; HYPRE_IJMatrixSetValues(IJPmat, 1, &nzcnt, (const int *) &rowNum, (const int *) colInd, (const double *) colVal); } } ierr = HYPRE_IJMatrixAssemble(IJPmat); hypre_assert( !ierr ); HYPRE_IJMatrixGetObject(IJPmat, (void **) &Pmat); hypre_MatvecCommPkgCreate((hypre_ParCSRMatrix *) Pmat); commPkg = hypre_ParCSRMatrixCommPkg(Amat); if (!commPkg) hypre_MatvecCommPkgCreate(Amat); HYPRE_IJMatrixSetObjectType(IJPmat, -1); HYPRE_IJMatrixDestroy( IJPmat ); delete [] colInd; delete [] colVal; /*----------------------------------------------------------------- * clean up *-----------------------------------------------------------------*/ if ( PCols != NULL ) delete [] PCols; if ( PVecs != NULL ) { for (irow = 0; irow < nullspaceDim_; irow++) if ( PVecs[irow] != NULL ) delete [] PVecs[irow]; delete [] PVecs; } (*eqn2aggrOut) = eqn2aggr; /*----------------------------------------------------------------- * set up and return Pmat *-----------------------------------------------------------------*/ funcPtr = new MLI_Function(); MLI_Utils_HypreParCSRMatrixGetDestroyFunc(funcPtr); sprintf(paramString, "HYPRE_ParCSR" ); mli_Pmat = new MLI_Matrix( Pmat, paramString, funcPtr ); (*PmatOut) = mli_Pmat; delete funcPtr; return 0.0; } // ********************************************************************* // graded coarsening scheme (Given a graph, aggregate on the local subgraph // but give smaller aggregate near processor boundaries) // (called by setupExtendedDomainDecomp/genP_DD) // --------------------------------------------------------------------- int MLI_Method_AMGSA::coarsenGraded(hypre_ParCSRMatrix *hypreG, int *mliAggrLeng, int **mliAggrArray, int **bdryData) { MPI_Comm comm; int mypid, nprocs, *partition, startRow, endRow, maxInd; int localNRows, naggr=0, *node2aggr, *aggrSizes, nUndone; int irow, jcol, colNum, rowLeng, *cols, globalNRows; int *nodeStat, selectFlag, nSelected=0, nNotSelected=0, count; int ibuf[2], itmp[2], *bdrySet, localMinSize, index, maxCount; int *GDiagI, *GDiagJ, *GOffdI; double maxVal, *vals, *GDiagA; hypre_CSRMatrix *GDiag, *GOffd; #ifdef MLI_DEBUG_DETAILED int rowNum; #endif /*----------------------------------------------------------------- * fetch machine and matrix parameters *-----------------------------------------------------------------*/ comm = hypre_ParCSRMatrixComm(hypreG); MPI_Comm_rank(comm,&mypid); MPI_Comm_size(comm,&nprocs); HYPRE_ParCSRMatrixGetRowPartitioning((HYPRE_ParCSRMatrix) hypreG, &partition); startRow = partition[mypid]; endRow = partition[mypid+1] - 1; free( partition ); localNRows = endRow - startRow + 1; MPI_Allreduce(&localNRows, &globalNRows, 1, MPI_INT, MPI_SUM, comm); if ( mypid == 0 && outputLevel_ > 1 ) { printf("\t*** Aggregation(G) : total nodes to aggregate = %d\n", globalNRows); } GDiag = hypre_ParCSRMatrixDiag(hypreG); GDiagI = hypre_CSRMatrixI(GDiag); GDiagJ = hypre_CSRMatrixJ(GDiag); GDiagA = hypre_CSRMatrixData(GDiag); GOffd = hypre_ParCSRMatrixOffd(hypreG); GOffdI = hypre_CSRMatrixI(GOffd); /*----------------------------------------------------------------- * allocate status arrays *-----------------------------------------------------------------*/ if (localNRows > 0) { node2aggr = new int[localNRows]; aggrSizes = new int[localNRows]; nodeStat = new int[localNRows]; bdrySet = new int[localNRows]; for ( irow = 0; irow < localNRows; irow++ ) { aggrSizes[irow] = 0; node2aggr[irow] = -1; nodeStat[irow] = MLI_METHOD_AMGSA_READY; bdrySet[irow] = 0; } } else node2aggr = aggrSizes = nodeStat = bdrySet = NULL; /*----------------------------------------------------------------- * search for zero rows and rows near the processor boundaries *-----------------------------------------------------------------*/ for ( irow = 0; irow < localNRows; irow++ ) { rowLeng = GDiagI[irow+1] - GDiagI[irow]; if (rowLeng <= 0) { nodeStat[irow] = MLI_METHOD_AMGSA_NOTSELECTED; nNotSelected++; } if (GOffdI != NULL && (GOffdI[irow+1] - GOffdI[irow]) > 0) bdrySet[irow] = 1; } /*----------------------------------------------------------------- * Phase 0 : form aggregates near the boundary (aggregates should be * as small as possible, but has to satisfy min size. * The algorithm gives preference to nodes on boundaries.) *-----------------------------------------------------------------*/ localMinSize = nullspaceDim_ / currNodeDofs_ * 2; for ( irow = 0; irow < localNRows; irow++ ) { if ( nodeStat[irow] == MLI_METHOD_AMGSA_READY && bdrySet[irow] == 1 ) { nSelected++; node2aggr[irow] = - naggr - 1; aggrSizes[naggr] = 1; nodeStat[irow] = MLI_METHOD_AMGSA_SELECTED2; if (localMinSize > 1) { rowLeng = GDiagI[irow+1] - GDiagI[irow]; cols = &(GDiagJ[GDiagI[irow]]); jcol = 0; while ( aggrSizes[naggr] < localMinSize && jcol < rowLeng ) { index = cols[jcol]; if ( index != irow && (bdrySet[index] != 1) && nodeStat[irow] == MLI_METHOD_AMGSA_READY ) { node2aggr[index] = naggr; aggrSizes[naggr]++; nodeStat[index] = MLI_METHOD_AMGSA_SELECTED2; } jcol++; } } naggr++; } } itmp[0] = naggr; itmp[1] = nSelected; if (outputLevel_ > 1) MPI_Allreduce(itmp, ibuf, 2, MPI_INT, MPI_SUM, comm); if ( mypid == 0 && outputLevel_ > 1 ) { printf("\t*** Aggregation(G) P0 : no. of aggregates = %d\n",ibuf[0]); printf("\t*** Aggregation(G) P0 : no. nodes aggregated = %d\n",ibuf[1]); } // search for seed node with largest number of neighbors maxInd = -1; maxCount = -1; for ( irow = 0; irow < localNRows; irow++ ) { if ( nodeStat[irow] == MLI_METHOD_AMGSA_READY ) { count = 0; rowLeng = GDiagI[irow+1] - GDiagI[irow]; cols = &(GDiagJ[GDiagI[irow]]); for ( jcol = 0; jcol < rowLeng; jcol++ ) { index = cols[jcol]; if ( nodeStat[index] == MLI_METHOD_AMGSA_READY ) count++; } if ( count > maxCount ) { maxCount = count; maxInd = irow; } } } /*----------------------------------------------------------------- * Phase 1 : form aggregates *-----------------------------------------------------------------*/ for ( irow = 0; irow < localNRows; irow++ ) { if ( nodeStat[irow] == MLI_METHOD_AMGSA_READY ) { rowLeng = GDiagI[irow+1] - GDiagI[irow]; cols = &(GDiagJ[GDiagI[irow]]); selectFlag = 1; count = 1; for ( jcol = 0; jcol < rowLeng; jcol++ ) { colNum = cols[jcol]; if ( nodeStat[colNum] != MLI_METHOD_AMGSA_READY ) { selectFlag = 0; break; } else count++; } if ( selectFlag == 1 && count >= minAggrSize_ ) { aggrSizes[naggr] = 0; for ( jcol = 0; jcol < rowLeng; jcol++ ) { colNum = cols[jcol]; node2aggr[colNum] = naggr; nodeStat[colNum] = MLI_METHOD_AMGSA_SELECTED; aggrSizes[naggr]++; nSelected++; } naggr++; } } } itmp[0] = naggr; itmp[1] = nSelected; if (outputLevel_ > 1) MPI_Allreduce(itmp, ibuf, 2, MPI_INT, MPI_SUM, comm); if ( mypid == 0 && outputLevel_ > 1 ) { printf("\t*** Aggregation(G) P1 : no. of aggregates = %d\n",ibuf[0]); printf("\t*** Aggregation(G) P1 : no. nodes aggregated = %d\n",ibuf[1]); } /*----------------------------------------------------------------- * Phase 2 : put the rest into one of the existing aggregates *-----------------------------------------------------------------*/ if ( (nSelected+nNotSelected) < localNRows ) { for ( irow = 0; irow < localNRows; irow++ ) { if ( nodeStat[irow] == MLI_METHOD_AMGSA_READY ) { rowLeng = GDiagI[irow+1] - GDiagI[irow]; cols = &(GDiagJ[GDiagI[irow]]); vals = &(GDiagA[GDiagI[irow]]); maxInd = -1; maxVal = 0.0; for ( jcol = 0; jcol < rowLeng; jcol++ ) { colNum = cols[jcol]; if ( nodeStat[colNum] == MLI_METHOD_AMGSA_SELECTED ) { if (vals[jcol] > maxVal) { maxInd = colNum; maxVal = vals[jcol]; } } } if ( maxInd != -1 ) { node2aggr[irow] = node2aggr[maxInd]; nodeStat[irow] = MLI_METHOD_AMGSA_PENDING; aggrSizes[node2aggr[maxInd]]++; } } } for ( irow = 0; irow < localNRows; irow++ ) { if ( nodeStat[irow] == MLI_METHOD_AMGSA_PENDING ) { nodeStat[irow] = MLI_METHOD_AMGSA_SELECTED; nSelected++; } } } itmp[0] = naggr; itmp[1] = nSelected; if (outputLevel_ > 1) MPI_Allreduce(itmp,ibuf,2,MPI_INT,MPI_SUM,comm); if ( mypid == 0 && outputLevel_ > 1 ) { printf("\t*** Aggregation(G) P2 : no. of aggregates = %d\n",ibuf[0]); printf("\t*** Aggregation(G) P2 : no. nodes aggregated = %d\n",ibuf[1]); } /*----------------------------------------------------------------- * Phase 3 : form aggregates for all other rows *-----------------------------------------------------------------*/ if ( (nSelected+nNotSelected) < localNRows ) { for ( irow = 0; irow < localNRows; irow++ ) { if ( nodeStat[irow] == MLI_METHOD_AMGSA_READY ) { rowLeng = GDiagI[irow+1] - GDiagI[irow]; cols = &(GDiagJ[GDiagI[irow]]); count = 1; for ( jcol = 0; jcol < rowLeng; jcol++ ) { colNum = cols[jcol]; if ( nodeStat[colNum] == MLI_METHOD_AMGSA_READY ) count++; } if ( count > 1 && count >= minAggrSize_ ) { aggrSizes[naggr] = 0; for ( jcol = 0; jcol < rowLeng; jcol++ ) { colNum = cols[jcol]; if ( nodeStat[colNum] == MLI_METHOD_AMGSA_READY ) { nodeStat[colNum] = MLI_METHOD_AMGSA_SELECTED; node2aggr[colNum] = naggr; aggrSizes[naggr]++; nSelected++; } } naggr++; } } } } itmp[0] = naggr; itmp[1] = nSelected; if (outputLevel_ > 1) MPI_Allreduce(itmp,ibuf,2,MPI_INT,MPI_SUM,comm); if ( mypid == 0 && outputLevel_ > 1 ) { printf("\t*** Aggregation(G) P3 : no. of aggregates = %d\n",ibuf[0]); printf("\t*** Aggregation(G) P3 : no. nodes aggregated = %d\n",ibuf[1]); } /*----------------------------------------------------------------- * Phase 4 : finally put all lone rows into some neighbor aggregate *-----------------------------------------------------------------*/ if ( (nSelected+nNotSelected) < localNRows ) { for ( irow = 0; irow < localNRows; irow++ ) { if ( nodeStat[irow] == MLI_METHOD_AMGSA_READY ) { rowLeng = GDiagI[irow+1] - GDiagI[irow]; cols = &(GDiagJ[GDiagI[irow]]); for ( jcol = 0; jcol < rowLeng; jcol++ ) { colNum = cols[jcol]; if ( nodeStat[colNum] == MLI_METHOD_AMGSA_SELECTED ) { node2aggr[irow] = node2aggr[colNum]; nodeStat[irow] = MLI_METHOD_AMGSA_SELECTED; aggrSizes[node2aggr[colNum]]++; nSelected++; break; } } } } } itmp[0] = naggr; itmp[1] = nSelected; if ( outputLevel_ > 1 ) MPI_Allreduce(itmp,ibuf,2,MPI_INT,MPI_SUM,comm); if ( mypid == 0 && outputLevel_ > 1 ) { printf("\t*** Aggregation(G) P4 : no. of aggregates = %d\n",ibuf[0]); printf("\t*** Aggregation(G) P4 : no. nodes aggregated = %d\n",ibuf[1]); } nUndone = localNRows - nSelected - nNotSelected; //if ( nUndone > 0 ) if ( nUndone > localNRows ) { count = nUndone / minAggrSize_; if ( count == 0 ) count = 1; count += naggr; irow = jcol = 0; while ( nUndone > 0 ) { if ( nodeStat[irow] == MLI_METHOD_AMGSA_READY ) { node2aggr[irow] = naggr; nodeStat[irow] = MLI_METHOD_AMGSA_SELECTED; nUndone--; nSelected++; jcol++; if ( jcol >= minAggrSize_ && naggr < count-1 ) { jcol = 0; naggr++; } } irow++; } naggr = count; } itmp[0] = naggr; itmp[1] = nSelected; if ( outputLevel_ > 1 ) MPI_Allreduce(itmp,ibuf,2,MPI_INT,MPI_SUM,comm); if ( mypid == 0 && outputLevel_ > 1 ) { printf("\t*** Aggregation(G) P5 : no. of aggregates = %d\n",ibuf[0]); printf("\t*** Aggregation(G) P5 : no. nodes aggregated = %d\n",ibuf[1]); } /*----------------------------------------------------------------- * diagnostics *-----------------------------------------------------------------*/ if ( (nSelected+nNotSelected) < localNRows ) { #ifdef MLI_DEBUG_DETAILED for ( irow = 0; irow < localNRows; irow++ ) { if ( nodeStat[irow] == MLI_METHOD_AMGSA_READY ) { rowNum = startRow + irow; printf("%5d : unaggregated node = %8d\n", mypid, rowNum); hypre_ParCSRMatrixGetRow(hypreG,rowNum,&rowLeng,&cols,NULL); for ( jcol = 0; jcol < rowLeng; jcol++ ) { colNum = cols[jcol]; printf("ERROR : neighbor of unselected node %9d = %9d\n", rowNum, colNum); } hypre_ParCSRMatrixRestoreRow(hypreG,rowNum,&rowLeng,&cols,NULL); } } #else printf("%5d : ERROR - not all nodes aggregated.\n", mypid); exit(1); #endif } /*----------------------------------------------------------------- * clean up and initialize the output arrays *-----------------------------------------------------------------*/ if (localNRows > 0) delete [] aggrSizes; if (localNRows > 0) delete [] nodeStat; if (localNRows == 1 && naggr == 0) { node2aggr[0] = 0; naggr = 1; } (*bdryData) = bdrySet; (*mliAggrArray) = node2aggr; (*mliAggrLeng) = naggr; return 0; } // ************************************************************************ // Purpose : Given Amat, perform preferential coarsening (no coarsening // when the bdry flag = 1 // (called by setupExtendedDomainDecomp) // ------------------------------------------------------------------------ double MLI_Method_AMGSA::genP_Selective(MLI_Matrix *mli_Amat, MLI_Matrix **PmatOut, int ALen, int *bdryData) { int mypid, nprocs, *partition, AStartRow, AEndRow, ALocalNRows; int blkSize, naggr, *node2aggr, ierr, PLocalNCols, PStartCol; int PLocalNRows, PStartRow, *eqn2aggr, irow, jcol, ig; int *PCols, maxAggSize, *aggCntArray, index, **aggIndArray; int aggSize, nzcnt, *rowLengths, rowNum, *colInd, *compressBdryData; double **PVecs, *newNull, *qArray, *rArray, *colVal; char paramString[200]; HYPRE_IJMatrix IJPmat; hypre_ParCSRMatrix *Amat, *A2mat, *Pmat; MLI_Matrix *mli_A2mat=NULL, *mli_Pmat; MPI_Comm comm; hypre_ParCSRCommPkg *commPkg; MLI_Function *funcPtr; /*----------------------------------------------------------------- * fetch matrix information *-----------------------------------------------------------------*/ Amat = (hypre_ParCSRMatrix *) mli_Amat->getMatrix(); comm = hypre_ParCSRMatrixComm(Amat); MPI_Comm_rank(comm,&mypid); MPI_Comm_size(comm,&nprocs); HYPRE_ParCSRMatrixGetRowPartitioning((HYPRE_ParCSRMatrix) Amat,&partition); AStartRow = partition[mypid]; AEndRow = partition[mypid+1] - 1; ALocalNRows = AEndRow - AStartRow + 1; free(partition); /*----------------------------------------------------------------- * reduce Amat based on the block size information (if nodeDofs_ > 1) *-----------------------------------------------------------------*/ blkSize = currNodeDofs_; if (blkSize > 1) MLI_Matrix_Compress(mli_Amat, blkSize, &mli_A2mat); else mli_A2mat = mli_Amat; A2mat = (hypre_ParCSRMatrix *) mli_A2mat->getMatrix(); /*----------------------------------------------------------------- * modify minimum aggregate size, if needed *-----------------------------------------------------------------*/ minAggrSize_ = nullspaceDim_ / currNodeDofs_; if (minAggrSize_ <= 1) minAggrSize_ = 2; /*----------------------------------------------------------------- * perform coarsening (no aggregation on processor boundaries) *-----------------------------------------------------------------*/ if (blkSize > 1) { compressBdryData = new int[ALocalNRows/blkSize]; for (irow = 0; irow < ALocalNRows; irow+=blkSize) compressBdryData[irow/blkSize] = bdryData[irow]; } else compressBdryData = bdryData; coarsenSelective(A2mat, &naggr, &node2aggr, bdryData); if (blkSize > 1 && mli_A2mat != NULL) delete mli_A2mat; if (blkSize > 1) delete [] compressBdryData; /*----------------------------------------------------------------- * fetch the coarse grid information and instantiate P *-----------------------------------------------------------------*/ PLocalNCols = naggr * nullspaceDim_; MLI_Utils_GenPartition(comm, PLocalNCols, &partition); PStartCol = partition[mypid]; free( partition ); PLocalNRows = ALocalNRows; PStartRow = AStartRow; ierr = HYPRE_IJMatrixCreate(comm,PStartRow,PStartRow+PLocalNRows-1, PStartCol,PStartCol+PLocalNCols-1,&IJPmat); ierr = HYPRE_IJMatrixSetObjectType(IJPmat, HYPRE_PARCSR); hypre_assert(!ierr); /*----------------------------------------------------------------- * expand the aggregation information if block size > 1 ==> eqn2aggr *-----------------------------------------------------------------*/ if ( blkSize > 1 ) { eqn2aggr = new int[ALocalNRows]; for ( irow = 0; irow < ALocalNRows; irow++ ) eqn2aggr[irow] = node2aggr[irow/blkSize]; delete [] node2aggr; } else eqn2aggr = node2aggr; /*----------------------------------------------------------------- * create a compact form for the null space vectors * (get ready to perform QR on them) *-----------------------------------------------------------------*/ PVecs = new double*[nullspaceDim_]; PCols = new int[PLocalNRows]; for (irow = 0; irow < nullspaceDim_; irow++) PVecs[irow] = new double[PLocalNRows]; for ( irow = 0; irow < PLocalNRows; irow++ ) { if ( eqn2aggr[irow] >= 0 ) PCols[irow] = PStartCol + eqn2aggr[irow] * nullspaceDim_; else PCols[irow] = PStartCol + (-eqn2aggr[irow]-1) * nullspaceDim_; if ( nullspaceVec_ != NULL ) { for ( jcol = 0; jcol < nullspaceDim_; jcol++ ) PVecs[jcol][irow] = nullspaceVec_[jcol*PLocalNRows+irow]; } else { for ( jcol = 0; jcol < nullspaceDim_; jcol++ ) { if (irow % nullspaceDim_ == jcol) PVecs[jcol][irow] = 1.0; else PVecs[jcol][irow] = 0.0; } } } /*----------------------------------------------------------------- * perform QR for null space *-----------------------------------------------------------------*/ newNull = NULL; if ( PLocalNRows > 0 ) { /* ------ count the size of each aggregate ------ */ aggCntArray = new int[naggr]; for ( ig = 0; ig < naggr; ig++ ) aggCntArray[ig] = 0; for ( irow = 0; irow < PLocalNRows; irow++ ) if ( eqn2aggr[irow] >= 0 ) aggCntArray[eqn2aggr[irow]]++; else aggCntArray[(-eqn2aggr[irow]-1)]++; maxAggSize = 0; for ( ig = 0; ig < naggr; ig++ ) if (aggCntArray[ig] > maxAggSize) maxAggSize = aggCntArray[ig]; /* ------ register which equation is in which aggregate ------ */ aggIndArray = new int*[naggr]; for ( ig = 0; ig < naggr; ig++ ) { aggIndArray[ig] = new int[aggCntArray[ig]]; aggCntArray[ig] = 0; } for ( irow = 0; irow < PLocalNRows; irow++ ) { index = eqn2aggr[irow]; if ( index >= 0 ) aggIndArray[index][aggCntArray[index]++] = irow; else aggIndArray[-index-1][aggCntArray[-index-1]++] = irow; } /* ------ allocate storage for QR factorization ------ */ qArray = new double[maxAggSize * nullspaceDim_]; rArray = new double[nullspaceDim_ * nullspaceDim_]; newNull = new double[naggr*nullspaceDim_*nullspaceDim_]; /* ------ perform QR on each aggregate ------ */ for ( ig = 0; ig < naggr; ig++ ) { aggSize = aggCntArray[ig]; if ( aggSize < nullspaceDim_ ) { printf("Aggregation ERROR : underdetermined system in QR.\n"); printf(" error on Proc %d\n", mypid); printf(" error on aggr %d (%d)\n", ig, naggr); printf(" aggr size is %d\n", aggSize); exit(1); } /* ------ put data into the temporary array ------ */ for ( jcol = 0; jcol < aggSize; jcol++ ) { for ( irow = 0; irow < nullspaceDim_; irow++ ) qArray[aggSize*irow+jcol] = PVecs[irow][aggIndArray[ig][jcol]]; } /* ------ after QR, put the R into the next null space ------ */ for ( jcol = 0; jcol < nullspaceDim_; jcol++ ) for ( irow = 0; irow < nullspaceDim_; irow++ ) if ( irow == jcol ) newNull[ig*nullspaceDim_+jcol+irow*naggr*nullspaceDim_]=1.0; else newNull[ig*nullspaceDim_+jcol+irow*naggr*nullspaceDim_]=0.0; /* ------ put the P to PVecs ------ */ for ( jcol = 0; jcol < aggSize; jcol++ ) { for ( irow = 0; irow < nullspaceDim_; irow++ ) { index = aggIndArray[ig][jcol]; PVecs[irow][index] = qArray[ irow*aggSize + jcol ]; } } } for ( ig = 0; ig < naggr; ig++ ) delete [] aggIndArray[ig]; delete [] aggIndArray; delete [] aggCntArray; delete [] qArray; delete [] rArray; } if ( nullspaceVec_ != NULL ) delete [] nullspaceVec_; nullspaceVec_ = newNull; /*----------------------------------------------------------------- * initialize Pmat *-----------------------------------------------------------------*/ rowLengths = new int[PLocalNRows]; for ( irow = 0; irow < PLocalNRows; irow++ ) rowLengths[irow] = nullspaceDim_; ierr = HYPRE_IJMatrixSetRowSizes(IJPmat, rowLengths); ierr = HYPRE_IJMatrixInitialize(IJPmat); hypre_assert(!ierr); delete [] rowLengths; /*-------------------------------------------------------------------- * load and assemble Pmat *--------------------------------------------------------------------*/ colInd = new int[nullspaceDim_]; colVal = new double[nullspaceDim_]; for ( irow = 0; irow < PLocalNRows; irow++ ) { if ( PCols[irow] >= 0 ) { nzcnt = 0; for ( jcol = 0; jcol < nullspaceDim_; jcol++ ) { if ( PVecs[jcol][irow] != 0.0 ) { colInd[nzcnt] = PCols[irow] + jcol; colVal[nzcnt++] = PVecs[jcol][irow]; } } rowNum = PStartRow + irow; HYPRE_IJMatrixSetValues(IJPmat, 1, &nzcnt, (const int *) &rowNum, (const int *) colInd, (const double *) colVal); } } ierr = HYPRE_IJMatrixAssemble(IJPmat); hypre_assert( !ierr ); HYPRE_IJMatrixGetObject(IJPmat, (void **) &Pmat); hypre_MatvecCommPkgCreate((hypre_ParCSRMatrix *) Pmat); commPkg = hypre_ParCSRMatrixCommPkg(Amat); if (!commPkg) hypre_MatvecCommPkgCreate(Amat); HYPRE_IJMatrixSetObjectType(IJPmat, -1); HYPRE_IJMatrixDestroy( IJPmat ); delete [] colInd; delete [] colVal; /*----------------------------------------------------------------- * clean up *-----------------------------------------------------------------*/ if (PCols != NULL) delete [] PCols; if (PVecs != NULL) { for (irow = 0; irow < nullspaceDim_; irow++) if (PVecs[irow] != NULL) delete [] PVecs[irow]; delete [] PVecs; } delete [] eqn2aggr; /*----------------------------------------------------------------- * set up and return Pmat *-----------------------------------------------------------------*/ funcPtr = new MLI_Function(); MLI_Utils_HypreParCSRMatrixGetDestroyFunc(funcPtr); sprintf(paramString, "HYPRE_ParCSR" ); mli_Pmat = new MLI_Matrix( Pmat, paramString, funcPtr ); (*PmatOut) = mli_Pmat; delete funcPtr; return 0.0; } // ********************************************************************* // selective coarsening scheme (Given a graph, aggregate on the local // subgraph but no aggregation near processor boundaries) // (called by setupExtendedDomainDecomp/genP_Selective) // --------------------------------------------------------------------- int MLI_Method_AMGSA::coarsenSelective(hypre_ParCSRMatrix *hypreG, int *naggrOut, int **aggrInfoOut, int *bdryData) { MPI_Comm comm; int mypid, nprocs, *partition, startRow, endRow, maxInd; int localNRows, naggr=0, *node2aggr, *aggrSizes, nUndone; int irow, jcol, colNum, rowLeng, *cols, globalNRows; int *nodeStat, selectFlag, nSelected=0, nNotSelected=0, count; int *GDiagI, *GDiagJ; double maxVal, *vals, *GDiagA; hypre_CSRMatrix *GDiag; #ifdef MLI_DEBUG_DETAILED int rowNum; #endif /*----------------------------------------------------------------- * fetch machine and matrix parameters *-----------------------------------------------------------------*/ comm = hypre_ParCSRMatrixComm(hypreG); MPI_Comm_rank(comm,&mypid); MPI_Comm_size(comm,&nprocs); HYPRE_ParCSRMatrixGetRowPartitioning((HYPRE_ParCSRMatrix) hypreG, &partition); startRow = partition[mypid]; endRow = partition[mypid+1] - 1; free( partition ); localNRows = endRow - startRow + 1; MPI_Allreduce(&localNRows, &globalNRows, 1, MPI_INT, MPI_SUM, comm); if ( mypid == 0 && outputLevel_ > 1 ) { printf("\t*** Aggregation(G) : total nodes to aggregate = %d\n", globalNRows); } GDiag = hypre_ParCSRMatrixDiag(hypreG); GDiagI = hypre_CSRMatrixI(GDiag); GDiagJ = hypre_CSRMatrixJ(GDiag); GDiagA = hypre_CSRMatrixData(GDiag); /*----------------------------------------------------------------- * allocate status arrays *-----------------------------------------------------------------*/ if (localNRows > 0) { node2aggr = new int[localNRows]; aggrSizes = new int[localNRows]; nodeStat = new int[localNRows]; for ( irow = 0; irow < localNRows; irow++ ) { if (bdryData[irow] == 1) { nodeStat[irow] = MLI_METHOD_AMGSA_SELECTED; node2aggr[irow] = naggr++; aggrSizes[irow] = 1; nSelected++; } else { nodeStat[irow] = MLI_METHOD_AMGSA_READY; node2aggr[irow] = -1; aggrSizes[irow] = 0; } } } else node2aggr = aggrSizes = nodeStat = NULL; /*----------------------------------------------------------------- * search for zero rows and rows near the processor boundaries *-----------------------------------------------------------------*/ for ( irow = 0; irow < localNRows; irow++ ) { rowLeng = GDiagI[irow+1] - GDiagI[irow]; if (rowLeng <= 0) { nodeStat[irow] = MLI_METHOD_AMGSA_NOTSELECTED; nNotSelected++; } } /*----------------------------------------------------------------- * Phase 1 : form aggregates *-----------------------------------------------------------------*/ for (irow = 0; irow < localNRows; irow++) { if (nodeStat[irow] == MLI_METHOD_AMGSA_READY) { rowLeng = GDiagI[irow+1] - GDiagI[irow]; cols = &(GDiagJ[GDiagI[irow]]); selectFlag = 1; count = 1; for ( jcol = 0; jcol < rowLeng; jcol++ ) { colNum = cols[jcol]; if (nodeStat[colNum] != MLI_METHOD_AMGSA_READY) { selectFlag = 0; break; } else count++; } if (selectFlag == 1 && count >= minAggrSize_) { aggrSizes[naggr] = 0; for ( jcol = 0; jcol < rowLeng; jcol++ ) { colNum = cols[jcol]; node2aggr[colNum] = naggr; nodeStat[colNum] = MLI_METHOD_AMGSA_SELECTED; aggrSizes[naggr]++; nSelected++; } naggr++; } } } /*----------------------------------------------------------------- * Phase 2 : put the rest into one of the existing aggregates *-----------------------------------------------------------------*/ if ((nSelected+nNotSelected) < localNRows) { for (irow = 0; irow < localNRows; irow++) { if (nodeStat[irow] == MLI_METHOD_AMGSA_READY) { rowLeng = GDiagI[irow+1] - GDiagI[irow]; cols = &(GDiagJ[GDiagI[irow]]); vals = &(GDiagA[GDiagI[irow]]); maxInd = -1; maxVal = 0.0; for (jcol = 0; jcol < rowLeng; jcol++) { colNum = cols[jcol]; if (nodeStat[colNum] == MLI_METHOD_AMGSA_SELECTED) { if (vals[jcol] > maxVal) { maxInd = colNum; maxVal = vals[jcol]; } } } if (maxInd != -1) { node2aggr[irow] = node2aggr[maxInd]; nodeStat[irow] = MLI_METHOD_AMGSA_PENDING; aggrSizes[node2aggr[maxInd]]++; } } } for (irow = 0; irow < localNRows; irow++) { if (nodeStat[irow] == MLI_METHOD_AMGSA_PENDING) { nodeStat[irow] = MLI_METHOD_AMGSA_SELECTED; nSelected++; } } } /*----------------------------------------------------------------- * Phase 3 : form aggregates for all other rows *-----------------------------------------------------------------*/ if ((nSelected+nNotSelected) < localNRows) { for (irow = 0; irow < localNRows; irow++) { if (nodeStat[irow] == MLI_METHOD_AMGSA_READY) { rowLeng = GDiagI[irow+1] - GDiagI[irow]; cols = &(GDiagJ[GDiagI[irow]]); count = 1; for (jcol = 0; jcol < rowLeng; jcol++) { colNum = cols[jcol]; if (nodeStat[colNum] == MLI_METHOD_AMGSA_READY) count++; } if (count > 1 && count >= minAggrSize_) { aggrSizes[naggr] = 0; for (jcol = 0; jcol < rowLeng; jcol++) { colNum = cols[jcol]; if (nodeStat[colNum] == MLI_METHOD_AMGSA_READY) { nodeStat[colNum] = MLI_METHOD_AMGSA_SELECTED; node2aggr[colNum] = naggr; aggrSizes[naggr]++; nSelected++; } } naggr++; } } } } /*----------------------------------------------------------------- * Phase 4 : finally put all lone rows into some neighbor aggregate *-----------------------------------------------------------------*/ if ((nSelected+nNotSelected) < localNRows) { for (irow = 0; irow < localNRows; irow++) { if (nodeStat[irow] == MLI_METHOD_AMGSA_READY) { rowLeng = GDiagI[irow+1] - GDiagI[irow]; cols = &(GDiagJ[GDiagI[irow]]); for (jcol = 0; jcol < rowLeng; jcol++) { colNum = cols[jcol]; if (nodeStat[colNum] == MLI_METHOD_AMGSA_SELECTED) { node2aggr[irow] = node2aggr[colNum]; nodeStat[irow] = MLI_METHOD_AMGSA_SELECTED; aggrSizes[node2aggr[colNum]]++; nSelected++; break; } } } } } nUndone = localNRows - nSelected - nNotSelected; //if ( nUndone > 0 ) if ( nUndone > localNRows ) { count = nUndone / minAggrSize_; if ( count == 0 ) count = 1; count += naggr; irow = jcol = 0; while ( nUndone > 0 ) { if ( nodeStat[irow] == MLI_METHOD_AMGSA_READY ) { node2aggr[irow] = naggr; nodeStat[irow] = MLI_METHOD_AMGSA_SELECTED; nUndone--; nSelected++; jcol++; if ( jcol >= minAggrSize_ && naggr < count-1 ) { jcol = 0; naggr++; } } irow++; } naggr = count; } /*----------------------------------------------------------------- * diagnostics *-----------------------------------------------------------------*/ if ((nSelected+nNotSelected) < localNRows) { #ifdef MLI_DEBUG_DETAILED for (irow = 0; irow < localNRows; irow++) { if (nodeStat[irow] == MLI_METHOD_AMGSA_READY) { rowNum = startRow + irow; printf("%5d : unaggregated node = %8d\n", mypid, rowNum); hypre_ParCSRMatrixGetRow(hypreG,rowNum,&rowLeng,&cols,NULL); for ( jcol = 0; jcol < rowLeng; jcol++ ) { colNum = cols[jcol]; printf("ERROR : neighbor of unselected node %9d = %9d\n", rowNum, colNum); } hypre_ParCSRMatrixRestoreRow(hypreG,rowNum,&rowLeng,&cols,NULL); } } #else printf("%5d : ERROR - not all nodes aggregated.\n", mypid); exit(1); #endif } /*----------------------------------------------------------------- * clean up and initialize the output arrays *-----------------------------------------------------------------*/ if (localNRows > 0) delete [] aggrSizes; if (localNRows > 0) delete [] nodeStat; if (localNRows == 1 && naggr == 0) { node2aggr[0] = 0; naggr = 1; } (*aggrInfoOut) = node2aggr; (*naggrOut) = naggr; return 0; } //********************************************************************** // set up domain decomposition method by extending the local problem // (A simplified version of setupExtendedDomainDecomp using inefficient // method - just for testing only) // --------------------------------------------------------------------- int MLI_Method_AMGSA::setupExtendedDomainDecomp2(MLI *mli) { MLI_Function *funcPtr; int nRecvs, *recvProcs, nSends, *sendProcs, ierr, *rowSizes; int *colInds, rowIndex, iP; int *recvLengs, mypid, nprocs, level, *Apartition, ANRows; int nodeDofs, iD, iD2, AStart, AExtNRows; double *nullVecs=NULL, *colVals; char paramString[50]; MPI_Comm comm; MLI_Matrix *mli_Amat; hypre_ParCSRMatrix *hypreA; hypre_ParCSRCommPkg *commPkg; /* --------------------------------------------------------------- */ /* error checking */ /* --------------------------------------------------------------- */ if (mli == NULL) { printf("MLI_Method_AMGSA::setupExtendedDomainDecomp2 ERROR"); printf(" - no mli.\n"); exit(1); } /* --------------------------------------------------------------- */ /* fetch communicator and fine matrix information */ /* --------------------------------------------------------------- */ comm = getComm(); MPI_Comm_rank(comm, &mypid); MPI_Comm_size(comm, &nprocs); #ifdef MLI_DEBUG_DETAILED printf("%d : AMGSA::setupExtendedDomainDecomp2 begins...\n",mypid); #endif level = 0; mli_Amat = mli->getSystemMatrix(level); hypreA = (hypre_ParCSRMatrix *) mli_Amat->getMatrix(); HYPRE_ParCSRMatrixGetRowPartitioning((HYPRE_ParCSRMatrix) hypreA, &Apartition); AStart = Apartition[mypid]; ANRows = Apartition[mypid+1] - AStart; /* --------------------------------------------------------------- */ /* first save the nodeDofs and null space information since it */ /* will be destroyed soon and needs to be recovered later */ /* --------------------------------------------------------------- */ nodeDofs = currNodeDofs_; nullVecs = new double[nullspaceDim_*ANRows]; if (nullspaceVec_ != NULL) { for (iD = 0; iD < nullspaceDim_*ANRows; iD++) nullVecs[iD] = nullspaceVec_[iD]; } else { for (iD = 0; iD < nullspaceDim_; iD++) for (iD2 = 0; iD2 < ANRows; iD2++) if (MABS((iD - iD2)) % nullspaceDim_ == 0) nullVecs[iD*ANRows+iD2] = 1.0; else nullVecs[iD*ANRows+iD2] = 0.0; } /* --------------------------------------------------------------- */ /* get my neighbor processor information */ /* --------------------------------------------------------------- */ commPkg = hypre_ParCSRMatrixCommPkg(hypreA); if (commPkg == NULL) { hypre_MatvecCommPkgCreate((hypre_ParCSRMatrix *) hypreA); commPkg = hypre_ParCSRMatrixCommPkg(hypreA); } nRecvs = hypre_ParCSRCommPkgNumRecvs(commPkg); recvProcs = hypre_ParCSRCommPkgRecvProcs(commPkg); nSends = hypre_ParCSRCommPkgNumSends(commPkg); sendProcs = hypre_ParCSRCommPkgSendProcs(commPkg); if (nRecvs > 0) recvLengs = new int[nRecvs]; /* --------------------------------------------------------------- */ /* calculate the size of my expanded matrix AExt which is the sum */ /* of the rows of my neighbors (and mine also) */ /* --------------------------------------------------------------- */ AExtNRows = 0; for (iP = 0; iP < nRecvs; iP++) { recvLengs[iP] = Apartition[recvProcs[iP]+1] - Apartition[recvProcs[iP]]; AExtNRows += recvLengs[iP]; } /* --------------------------------------------------------------- */ /* communicate processor offsets for AExt (needed to create */ /* partition) */ /* --------------------------------------------------------------- */ int *AExtpartition = new int[nprocs+1]; MPI_Allgather(&AExtNRows, 1, MPI_INT, &AExtpartition[1], 1, MPI_INT, comm); AExtpartition[0] = 0; for (iP = 1; iP < nprocs; iP++) AExtpartition[iP+1] = AExtpartition[iP+1] + AExtpartition[iP]; /* --------------------------------------------------------------- */ /* create QExt (permutation matrix for getting local AExt) */ /* --------------------------------------------------------------- */ int QExtCStart = AExtpartition[mypid]; int QExtNCols = AExtpartition[mypid+1] - QExtCStart; int QExtNRows = ANRows; int QExtRStart = AStart; HYPRE_IJMatrix IJ_QExt; ierr = HYPRE_IJMatrixCreate(comm,QExtRStart,QExtRStart+QExtNRows-1, QExtCStart,QExtCStart+QExtNCols-1,&IJ_QExt); ierr += HYPRE_IJMatrixSetObjectType(IJ_QExt, HYPRE_PARCSR); hypre_assert(!ierr); rowSizes = new int[QExtNRows]; for (iD = 0; iD < ANRows; iD++) rowSizes[iD] = 2 * nSends; ierr = HYPRE_IJMatrixSetRowSizes(IJ_QExt, rowSizes); ierr += HYPRE_IJMatrixInitialize(IJ_QExt); hypre_assert(!ierr); delete [] rowSizes; /* --------------------------------------------------------------- */ /* when creating QExt, need to set up the QExtOffsets ==> */ /* since QExt(i,j) = 1 means putting local col i into external col */ /* j, and since I may not own row i of PE, I need to tell my */ /* neighbor processor who owns row i the value of j. */ /* --------------------------------------------------------------- */ int *QExtOffsets, offset, pindex; MPI_Request *mpiRequests; MPI_Status mpiStatus; if (nSends > 0) { mpiRequests = new MPI_Request[nSends]; QExtOffsets = new int[nSends]; } for (iP = 0; iP < nSends; iP++) MPI_Irecv(&QExtOffsets[iP],1,MPI_INT,sendProcs[iP],434243,comm, &(mpiRequests[iP])); offset = 0; // tell neighbor processors that their cols will become my offset // cols (+ my processor offset) for (iP = 0; iP < nRecvs; iP++) { MPI_Send(&offset, 1, MPI_INT, recvProcs[iP], 434243, comm); offset += (Apartition[recvProcs[iP]+1] - Apartition[recvProcs[iP]]); } for ( iP = 0; iP < nSends; iP++ ) MPI_Wait( &(mpiRequests[iP]), &mpiStatus ); if (nSends > 0) delete [] mpiRequests; /* --------------------------------------------------------------- */ /* create QExt */ /* --------------------------------------------------------------- */ hypre_ParCSRMatrix *hypreQExt; MLI_Matrix *mli_QExt; if (nSends > 0) { colInds = new int[nSends+1]; colVals = new double[nSends+1]; for (iP = 0; iP <= nSends; iP++) colVals[iP] = 1.0; } for (iD = 0; iD < QExtNRows; iD++) { rowIndex = QExtRStart + iD; colInds[0] = QExtRStart + iD; for (iP = 0; iP < nSends; iP++) { pindex = sendProcs[iP]; colInds[iP] = AExtpartition[pindex] + QExtOffsets[iP] + iD; } HYPRE_IJMatrixSetValues(IJ_QExt, 1, &nSends, (const int *) &rowIndex, (const int *) colInds, (const double *) colVals); } if (nSends > 0) { delete [] colInds; delete [] colVals; delete [] QExtOffsets; } HYPRE_IJMatrixAssemble(IJ_QExt); HYPRE_IJMatrixGetObject(IJ_QExt, (void **) &hypreQExt); sprintf(paramString, "HYPRE_ParCSR"); mli_QExt = new MLI_Matrix( (void *) hypreQExt, paramString, NULL); commPkg = hypre_ParCSRMatrixCommPkg(hypreQExt); if (commPkg == NULL) hypre_MatvecCommPkgCreate((hypre_ParCSRMatrix *) hypreQExt); /* --------------------------------------------------------------- */ /* form the expanded fine matrix */ /* --------------------------------------------------------------- */ MLI_Matrix *mli_AExt; //hypre_ParCSRMatrix *hypreAExt; MLI_Matrix_ComputePtAP(mli_QExt, mli_Amat, &mli_AExt); //hypreAExt = (hypre_ParCSRMatrix *) mli_AExt->getMatrix(); delete mli_QExt; HYPRE_IJMatrixDestroy(IJ_QExt); /* --------------------------------------------------------------- */ /* communicate null space information for graded coarsening */ /* --------------------------------------------------------------- */ int rLength, sLength; double *tmpNullVecs; if (QExtNCols > 0) tmpNullVecs = new double[QExtNCols*nullspaceDim_]; if (nRecvs > 0) mpiRequests = new MPI_Request[nRecvs]; offset = 0; for (iP = 0; iP < nRecvs; iP++) { rLength = AExtpartition[recvProcs[iP]+1] - AExtpartition[recvProcs[iP]]; rLength *= nullspaceDim_; MPI_Irecv(&tmpNullVecs[offset],rLength,MPI_DOUBLE,recvProcs[iP],14581, comm,&(mpiRequests[iP])); offset += rLength; } for (iP = 0; iP < nSends; iP++) { sLength = ANRows * nullspaceDim_; MPI_Send(nullVecs, sLength, MPI_DOUBLE, sendProcs[iP], 14581, comm); } for (iP = 0; iP < nRecvs; iP++) MPI_Wait(&(mpiRequests[iP]), &mpiStatus); if (nRecvs > 0) delete [] mpiRequests; if (nullspaceVec_ != NULL) delete [] nullspaceVec_; nullspaceVec_ = new double[QExtNCols*nullspaceDim_]; for (iD = 0; iD < nullspaceDim_; iD++) for (iD2 = 0; iD2 < ANRows; iD2++) nullspaceVec_[iD*QExtNCols+iD2] = nullVecs[iD*ANRows+iD2]; offset = ANRows; for ( iP = 0; iP < nRecvs; iP++ ) { rLength = AExtpartition[recvProcs[iP]+1] - AExtpartition[recvProcs[iP]]; for (iD = 0; iD < nullspaceDim_; iD++) for (iD2 = 0; iD2 < rLength; iD2++) nullspaceVec_[iD*QExtNCols+iD2+offset] = tmpNullVecs[offset+iD*rLength+iD2]; rLength *= nullspaceDim_; offset += rLength; } if (QExtNCols > 0) delete [] tmpNullVecs; delete [] AExtpartition; /* --------------------------------------------------------------- */ /* graded coarsening on the expanded fine matrix */ /* (this P will be needed later to collect neighbor unknowns */ /* before smoothing - its transpose) */ /* --------------------------------------------------------------- */ MLI_Matrix *mli_PExt; genP_AExt(mli_AExt, &mli_PExt, ANRows); /* --------------------------------------------------------------- */ /* create the local domain decomposition matrix */ /* reduced so that the local subdomain matrix is smaller - will be */ /* used as a smoother */ /* --------------------------------------------------------------- */ MLI_Matrix *mli_ACExt; MLI_Matrix_ComputePtAP(mli_PExt, mli_AExt, &mli_ACExt); /* --------------------------------------------------------------- */ /* need to convert the ACExt into local matrix (since the matrix */ /* is local) */ /* --------------------------------------------------------------- */ int iZero=0, ACExtNRows, *newRowSizes, *ACExtI, *ACExtJ; double *ACExtD; MPI_Comm newMPIComm; hypre_ParCSRMatrix *hypreACExt, *hypreNewA; hypre_CSRMatrix *csrACExt; HYPRE_IJMatrix IJnewA; hypreACExt = (hypre_ParCSRMatrix *) mli_AExt->getMatrix(); ACExtNRows = hypre_ParCSRMatrixNumRows(hypreACExt); MPI_Comm_split(comm, mypid, iZero, &newMPIComm); ierr = HYPRE_IJMatrixCreate(newMPIComm,iZero,ACExtNRows-1,iZero, ACExtNRows-1, &IJnewA); ierr += HYPRE_IJMatrixSetObjectType(IJnewA, HYPRE_PARCSR); hypre_assert(!ierr); if (ACExtNRows > 0) newRowSizes = new int[ACExtNRows]; csrACExt = hypre_ParCSRMatrixDiag(hypreACExt); ACExtI = hypre_CSRMatrixI(csrACExt); ACExtJ = hypre_CSRMatrixJ(csrACExt); ACExtD = hypre_CSRMatrixData(csrACExt); for (iD = 0; iD < ACExtNRows; iD++) newRowSizes[iD] = ACExtI[iD+1] - ACExtI[iD]; ierr = HYPRE_IJMatrixSetRowSizes(IJnewA, newRowSizes); ierr += HYPRE_IJMatrixInitialize(IJnewA); hypre_assert(!ierr); for (iD = 0; iD < ACExtNRows; iD++) { offset = ACExtI[iD]; HYPRE_IJMatrixSetValues(IJnewA, 1, &newRowSizes[iD], (const int *) &iD, (const int *) &ACExtJ[offset], (const double *) &ACExtD[offset]); } if (ACExtNRows > 0) delete [] newRowSizes; HYPRE_IJMatrixAssemble(IJnewA); HYPRE_IJMatrixGetObject(IJnewA, (void **) &hypreNewA); sprintf(paramString, "HYPRE_ParCSR"); funcPtr = new MLI_Function(); MLI_Utils_HypreParCSRMatrixGetDestroyFunc(funcPtr); delete mli_ACExt; mli_ACExt = new MLI_Matrix( (void *) hypreNewA, paramString, funcPtr); delete mli_AExt; HYPRE_IJMatrixSetObjectType(IJnewA, -1); HYPRE_IJMatrixDestroy(IJnewA); /* --------------------------------------------------------------- */ /* create new overlapped DD smoother using sequential SuperLU */ /* --------------------------------------------------------------- */ int *sendLengs; char *targv[7]; MLI_Solver *smootherPtr; MLI_Matrix *mli_PSmat; if (!strcmp(preSmoother_, "CGMLI")) sprintf(paramString, "CGMLI"); else sprintf(paramString, "CGAMG"); smootherPtr = MLI_Solver_CreateFromName(paramString); sprintf(paramString, "numSweeps 10000"); smootherPtr->setParams(paramString, 0, NULL); sprintf(paramString, "tolerance 1.0e-6"); smootherPtr->setParams(paramString, 0, NULL); // send PSmat and communication information to smoother if (nSends > 0) sendLengs = new int[nSends]; for (iP = 0; iP < nSends; iP++) sendLengs[iP] = ANRows; sprintf(paramString, "setPmat"); mli_PSmat = mli_PExt; targv[0] = (char *) mli_PSmat; smootherPtr->setParams(paramString, 1, targv); sprintf(paramString, "setCommData"); targv[0] = (char *) &nRecvs; targv[1] = (char *) recvProcs; targv[2] = (char *) recvLengs; targv[3] = (char *) &nSends; targv[4] = (char *) sendProcs; targv[5] = (char *) sendLengs; targv[6] = (char *) &comm; smootherPtr->setParams(paramString, 7, targv); if (nSends > 0) delete [] sendLengs; if (nRecvs > 0) delete [] recvLengs; smootherPtr->setup(mli_ACExt); mli->setSmoother(level, MLI_SMOOTHER_PRE, smootherPtr); /* --------------------------------------------------------------- */ /* create prolongation and coarse grid operators */ /* --------------------------------------------------------------- */ MLI_Solver *csolvePtr; MLI_Matrix *mli_Pmat, *mli_Rmat, *mli_cAmat; // set up one aggregate per processor saCounts_[0] = 1; if (saData_[0] != NULL) delete [] saData_[0]; saData_[0] = new int[ANRows]; for (iD = 0; iD < ANRows; iD++) saData_[0][iD] = 0; // restore nullspace changed by the last genP currNodeDofs_ = nodeDofs; if (nullspaceVec_ != NULL) delete [] nullspaceVec_; nullspaceVec_ = new double[nullspaceDim_*ANRows]; for (iD = 0; iD < nullspaceDim_*ANRows; iD++) nullspaceVec_[iD] = nullVecs[iD]; delete [] nullVecs; // create prolongation and coarse grid operators genP(mli_Amat, &mli_Pmat, saCounts_[0], saData_[0]); MLI_Matrix_ComputePtAP(mli_Pmat, mli_Amat, &mli_cAmat); mli->setSystemMatrix(level+1, mli_cAmat); mli->setProlongation(level+1, mli_Pmat); sprintf(paramString, "HYPRE_ParCSRT"); mli_Rmat = new MLI_Matrix(mli_Pmat->getMatrix(), paramString, NULL); mli->setRestriction(level, mli_Rmat); /* --------------------------------------------------------------- */ /* setup coarse solver */ /* --------------------------------------------------------------- */ strcpy( paramString, "SuperLU" ); csolvePtr = MLI_Solver_CreateFromName( paramString ); csolvePtr->setup(mli_cAmat); mli->setCoarseSolve(csolvePtr); /* --------------------------------------------------------------- */ /* clean up */ /* --------------------------------------------------------------- */ free(Apartition); #ifdef MLI_DEBUG_DETAILED printf("%d : MLI_Method_AMGSA::setupExtendedDomainDecomp2 ends.\n",mypid); #endif level = 2; return (level); } // ************************************************************************ // Purpose : Given Amat, perform preferential coarsening // (setupExtendedDomainDecomp2) // ------------------------------------------------------------------------ double MLI_Method_AMGSA::genP_AExt(MLI_Matrix *mli_Amat,MLI_Matrix **PmatOut, int inANRows) { int mypid, nprocs, *partition, AStartRow, AEndRow, ALocalNRows; int blkSize, naggr, *node2aggr, ierr, PLocalNCols, PStartCol; int PLocalNRows, PStartRow, *eqn2aggr, irow, jcol, ig; int *PCols, maxAggSize, *aggCntArray, index, **aggIndArray; int aggSize, nzcnt, *rowLengths, rowNum, *colInd; double **PVecs, *newNull, *qArray, *rArray, *colVal; char paramString[200]; HYPRE_IJMatrix IJPmat; hypre_ParCSRMatrix *Amat, *A2mat, *Pmat; MLI_Matrix *mli_A2mat=NULL, *mli_Pmat; MPI_Comm comm; hypre_ParCSRCommPkg *commPkg; MLI_Function *funcPtr; /*----------------------------------------------------------------- * fetch matrix and machine information *-----------------------------------------------------------------*/ Amat = (hypre_ParCSRMatrix *) mli_Amat->getMatrix(); comm = hypre_ParCSRMatrixComm(Amat); MPI_Comm_rank(comm,&mypid); MPI_Comm_size(comm,&nprocs); /*----------------------------------------------------------------- * fetch other matrix information *-----------------------------------------------------------------*/ HYPRE_ParCSRMatrixGetRowPartitioning((HYPRE_ParCSRMatrix) Amat,&partition); AStartRow = partition[mypid]; AEndRow = partition[mypid+1] - 1; ALocalNRows = AEndRow - AStartRow + 1; free(partition); /*----------------------------------------------------------------- * reduce Amat based on the block size information (if nodeDofs_ > 1) *-----------------------------------------------------------------*/ blkSize = currNodeDofs_; if (blkSize > 1) MLI_Matrix_Compress(mli_Amat, blkSize, &mli_A2mat); else mli_A2mat = mli_Amat; A2mat = (hypre_ParCSRMatrix *) mli_A2mat->getMatrix(); /*----------------------------------------------------------------- * modify minimum aggregate size, if needed *-----------------------------------------------------------------*/ minAggrSize_ = nullspaceDim_ / currNodeDofs_; if (minAggrSize_ <= 1) minAggrSize_ = 2; /*----------------------------------------------------------------- * perform coarsening *-----------------------------------------------------------------*/ coarsenAExt(A2mat, &naggr, &node2aggr, inANRows); if (blkSize > 1 && mli_A2mat != NULL) delete mli_A2mat; /*----------------------------------------------------------------- * fetch the coarse grid information and instantiate P *-----------------------------------------------------------------*/ PLocalNCols = naggr * nullspaceDim_; MLI_Utils_GenPartition(comm, PLocalNCols, &partition); PStartCol = partition[mypid]; free(partition); PLocalNRows = ALocalNRows; PStartRow = AStartRow; ierr = HYPRE_IJMatrixCreate(comm,PStartRow,PStartRow+PLocalNRows-1, PStartCol,PStartCol+PLocalNCols-1,&IJPmat); ierr = HYPRE_IJMatrixSetObjectType(IJPmat, HYPRE_PARCSR); hypre_assert(!ierr); /*----------------------------------------------------------------- * expand the aggregation information if block size > 1 ==> eqn2aggr *-----------------------------------------------------------------*/ if (blkSize > 1) { eqn2aggr = new int[ALocalNRows]; for (irow = 0; irow < ALocalNRows; irow++) eqn2aggr[irow] = node2aggr[irow/blkSize]; delete [] node2aggr; } else eqn2aggr = node2aggr; /*----------------------------------------------------------------- * create a compact form for the null space vectors * (get ready to perform QR on them) *-----------------------------------------------------------------*/ PVecs = new double*[nullspaceDim_]; PCols = new int[PLocalNRows]; for (irow = 0; irow < nullspaceDim_; irow++) PVecs[irow] = new double[PLocalNRows]; for (irow = 0; irow < PLocalNRows; irow++) { if (eqn2aggr[irow] >= 0) PCols[irow] = PStartCol + eqn2aggr[irow] * nullspaceDim_; else PCols[irow] = PStartCol + (-eqn2aggr[irow]-1) * nullspaceDim_; if (nullspaceVec_ != NULL) { for (jcol = 0; jcol < nullspaceDim_; jcol++) PVecs[jcol][irow] = nullspaceVec_[jcol*PLocalNRows+irow]; } else { for (jcol = 0; jcol < nullspaceDim_; jcol++) { if (irow % nullspaceDim_ == jcol) PVecs[jcol][irow] = 1.0; else PVecs[jcol][irow] = 0.0; } } } /*----------------------------------------------------------------- * perform QR for null space *-----------------------------------------------------------------*/ newNull = NULL; if (PLocalNRows > 0) { /* ------ count the size of each aggregate ------ */ aggCntArray = new int[naggr]; for (ig = 0; ig < naggr; ig++) aggCntArray[ig] = 0; for (irow = 0; irow < PLocalNRows; irow++) if (eqn2aggr[irow] >= 0) aggCntArray[eqn2aggr[irow]]++; else aggCntArray[(-eqn2aggr[irow]-1)]++; maxAggSize = 0; for (ig = 0; ig < naggr; ig++) if (aggCntArray[ig] > maxAggSize) maxAggSize = aggCntArray[ig]; /* ------ register which equation is in which aggregate ------ */ aggIndArray = new int*[naggr]; for (ig = 0; ig < naggr; ig++) { aggIndArray[ig] = new int[aggCntArray[ig]]; aggCntArray[ig] = 0; } for (irow = 0; irow < PLocalNRows; irow++) { index = eqn2aggr[irow]; if (index >= 0) aggIndArray[index][aggCntArray[index]++] = irow; else aggIndArray[-index-1][aggCntArray[-index-1]++] = irow; } /* ------ allocate storage for QR factorization ------ */ qArray = new double[maxAggSize * nullspaceDim_]; rArray = new double[nullspaceDim_ * nullspaceDim_]; newNull = new double[naggr*nullspaceDim_*nullspaceDim_]; /* ------ perform QR on each aggregate ------ */ for (ig = 0; ig < naggr; ig++) { aggSize = aggCntArray[ig]; if (aggSize < nullspaceDim_) { printf("Aggregation ERROR : underdetermined system in QR.\n"); printf(" error on Proc %d\n", mypid); printf(" error on aggr %d (%d)\n", ig, naggr); printf(" aggr size is %d\n", aggSize); exit(1); } /* ------ put data into the temporary array ------ */ for (jcol = 0; jcol < aggSize; jcol++) { for (irow = 0; irow < nullspaceDim_; irow++) qArray[aggSize*irow+jcol] = PVecs[irow][aggIndArray[ig][jcol]]; } /* ------ after QR, put the R into the next null space ------ */ for (jcol = 0; jcol < nullspaceDim_; jcol++) for (irow = 0; irow < nullspaceDim_; irow++) if (irow == jcol) newNull[ig*nullspaceDim_+jcol+irow*naggr*nullspaceDim_] = 1.0; else newNull[ig*nullspaceDim_+jcol+irow*naggr*nullspaceDim_] = 0.0; /* ------ put the P to PVecs ------ */ for (jcol = 0; jcol < aggSize; jcol++) { for (irow = 0; irow < nullspaceDim_; irow++) { index = aggIndArray[ig][jcol]; PVecs[irow][index] = qArray[ irow*aggSize + jcol ]; } } } for (ig = 0; ig < naggr; ig++) delete [] aggIndArray[ig]; delete [] aggIndArray; delete [] aggCntArray; delete [] qArray; delete [] rArray; } if (nullspaceVec_ != NULL) delete [] nullspaceVec_; nullspaceVec_ = newNull; /*----------------------------------------------------------------- * initialize Pmat *-----------------------------------------------------------------*/ rowLengths = new int[PLocalNRows]; for (irow = 0; irow < PLocalNRows; irow++) rowLengths[irow] = nullspaceDim_; ierr = HYPRE_IJMatrixSetRowSizes(IJPmat, rowLengths); ierr = HYPRE_IJMatrixInitialize(IJPmat); hypre_assert(!ierr); delete [] rowLengths; /*-------------------------------------------------------------------- * load and assemble Pmat *--------------------------------------------------------------------*/ colInd = new int[nullspaceDim_]; colVal = new double[nullspaceDim_]; for (irow = 0; irow < PLocalNRows; irow++) { if (PCols[irow] >= 0) { nzcnt = 0; for (jcol = 0; jcol < nullspaceDim_; jcol++) { if (PVecs[jcol][irow] != 0.0) { colInd[nzcnt] = PCols[irow] + jcol; colVal[nzcnt++] = PVecs[jcol][irow]; } } rowNum = PStartRow + irow; HYPRE_IJMatrixSetValues(IJPmat, 1, &nzcnt, (const int *) &rowNum, (const int *) colInd, (const double *) colVal); } } ierr = HYPRE_IJMatrixAssemble(IJPmat); hypre_assert(!ierr); HYPRE_IJMatrixGetObject(IJPmat, (void **) &Pmat); hypre_MatvecCommPkgCreate((hypre_ParCSRMatrix *) Pmat); commPkg = hypre_ParCSRMatrixCommPkg(Amat); if (!commPkg) hypre_MatvecCommPkgCreate(Amat); HYPRE_IJMatrixSetObjectType(IJPmat, -1); HYPRE_IJMatrixDestroy(IJPmat); delete [] colInd; delete [] colVal; /*----------------------------------------------------------------- * clean up *-----------------------------------------------------------------*/ if (PCols != NULL) delete [] PCols; if (PVecs != NULL) { for (irow = 0; irow < nullspaceDim_; irow++) if (PVecs[irow] != NULL) delete [] PVecs[irow]; delete [] PVecs; } /*----------------------------------------------------------------- * set up and return Pmat *-----------------------------------------------------------------*/ funcPtr = new MLI_Function(); MLI_Utils_HypreParCSRMatrixGetDestroyFunc(funcPtr); sprintf(paramString, "HYPRE_ParCSR" ); mli_Pmat = new MLI_Matrix( Pmat, paramString, funcPtr ); (*PmatOut) = mli_Pmat; delete funcPtr; return 0.0; } // ********************************************************************* // graded coarsening scheme (Given a graph, aggregate on the local subgraph // but give smaller aggregate near processor boundaries) // (called by setupExtendedDomainDecomp2/genP_AExt) // --------------------------------------------------------------------- int MLI_Method_AMGSA::coarsenAExt(hypre_ParCSRMatrix *hypreG, int *mliAggrLeng, int **mliAggrArray, int inANRows) { MPI_Comm comm; int mypid, nprocs, *partition, startRow, endRow, maxInd; int localNRows, naggr=0, *node2aggr, *aggrSizes; int irow, jcol, rowLeng, globalNRows, index; int *nodeStat, selectFlag, nSelected=0, nNotSelected=0, count; int *GDiagI, *GDiagJ; double maxVal, *GDiagA; hypre_CSRMatrix *GDiag; /*----------------------------------------------------------------- * fetch machine and matrix parameters *-----------------------------------------------------------------*/ comm = hypre_ParCSRMatrixComm(hypreG); MPI_Comm_rank(comm,&mypid); MPI_Comm_size(comm,&nprocs); HYPRE_ParCSRMatrixGetRowPartitioning((HYPRE_ParCSRMatrix) hypreG, &partition); startRow = partition[mypid]; endRow = partition[mypid+1] - 1; free(partition); localNRows = endRow - startRow + 1; MPI_Allreduce(&localNRows, &globalNRows, 1, MPI_INT, MPI_SUM, comm); if (mypid == 0 && outputLevel_ > 1) { printf("\t*** Aggregation(E) : total nodes to aggregate = %d\n", globalNRows); } GDiag = hypre_ParCSRMatrixDiag(hypreG); GDiagI = hypre_CSRMatrixI(GDiag); GDiagJ = hypre_CSRMatrixJ(GDiag); GDiagA = hypre_CSRMatrixData(GDiag); /*----------------------------------------------------------------- * allocate status arrays *-----------------------------------------------------------------*/ if (localNRows > 0) { node2aggr = new int[localNRows]; aggrSizes = new int[localNRows]; nodeStat = new int[localNRows]; for (irow = 0; irow < inANRows; irow++) { aggrSizes[irow] = 1; node2aggr[irow] = -1; nodeStat[irow] = MLI_METHOD_AMGSA_SELECTED; } for (irow = inANRows; irow < localNRows; irow++) { aggrSizes[irow] = 0; node2aggr[irow] = -1; nodeStat[irow] = MLI_METHOD_AMGSA_READY; } nSelected = inANRows; } else node2aggr = aggrSizes = nodeStat = NULL; /*----------------------------------------------------------------- * search for zero rows and rows near the processor boundaries *-----------------------------------------------------------------*/ for (irow = inANRows; irow < localNRows; irow++) { rowLeng = GDiagI[irow+1] - GDiagI[irow]; if (rowLeng <= 0) { nodeStat[irow] = MLI_METHOD_AMGSA_NOTSELECTED; nNotSelected++; } } /*----------------------------------------------------------------- * Phase 0 : 1 node per aggregate for the immediate neighbors *-----------------------------------------------------------------*/ for (irow = 0; irow < inANRows; irow++) { for (jcol = GDiagI[irow]; jcol < GDiagI[irow+1]; jcol++) { index = GDiagJ[jcol]; if (index >= inANRows && nodeStat[index]==MLI_METHOD_AMGSA_READY) { node2aggr[index] = naggr; nodeStat[index] = MLI_METHOD_AMGSA_SELECTED; aggrSizes[naggr] = 1; naggr++; nSelected++; } } } /*----------------------------------------------------------------- * Phase 1 : small aggregates for the next level *-----------------------------------------------------------------*/ for (irow = inANRows; irow < localNRows; irow++) { if (nodeStat[irow] == MLI_METHOD_AMGSA_READY) { selectFlag = 0; for (jcol = GDiagI[irow]; jcol < GDiagI[irow+1]; jcol++) { index = GDiagJ[jcol]; if (nodeStat[index] == MLI_METHOD_AMGSA_SELECTED) { selectFlag = 1; break; } } if (selectFlag == 1) { nSelected++; node2aggr[irow] = naggr; aggrSizes[naggr] = 1; nodeStat[irow] = MLI_METHOD_AMGSA_SELECTED2; for (jcol = GDiagI[irow]; jcol < GDiagI[irow+1]; jcol++) { index = GDiagJ[jcol]; if (nodeStat[irow]==MLI_METHOD_AMGSA_READY) { nSelected++; node2aggr[index] = naggr; aggrSizes[naggr]++; nodeStat[index] = MLI_METHOD_AMGSA_SELECTED2; } } naggr++; } } } for (irow = inANRows; irow < localNRows; irow++) if (nodeStat[index] == MLI_METHOD_AMGSA_SELECTED2) nodeStat[index] = MLI_METHOD_AMGSA_SELECTED; /*----------------------------------------------------------------- * Phase 1 : form aggregates *-----------------------------------------------------------------*/ for (irow = inANRows; irow < localNRows; irow++) { if (nodeStat[irow] == MLI_METHOD_AMGSA_READY) { selectFlag = 1; for (jcol = GDiagI[irow]; jcol < GDiagI[irow+1]; jcol++) { index = GDiagJ[jcol]; if (nodeStat[index] != MLI_METHOD_AMGSA_READY) { selectFlag = 0; break; } } if (selectFlag == 1) { aggrSizes[naggr] = 1; node2aggr[irow] = naggr; nodeStat[irow] = MLI_METHOD_AMGSA_SELECTED; nSelected++; for (jcol = GDiagI[irow]; jcol < GDiagI[irow+1]; jcol++) { index = GDiagJ[jcol]; node2aggr[index] = naggr; nodeStat[index] = MLI_METHOD_AMGSA_SELECTED; aggrSizes[naggr]++; nSelected++; } naggr++; } } } /*----------------------------------------------------------------- * Phase 2 : put the rest into one of the existing aggregates *-----------------------------------------------------------------*/ if ((nSelected+nNotSelected) < localNRows) { for (irow = inANRows; irow < localNRows; irow++) { if (nodeStat[irow] == MLI_METHOD_AMGSA_READY) { maxInd = -1; maxVal = 0.0; for (jcol = GDiagI[irow]; jcol < GDiagI[irow+1]; jcol++) { index = GDiagJ[jcol]; if (nodeStat[index] == MLI_METHOD_AMGSA_SELECTED) { if (GDiagA[jcol] > maxVal) { maxInd = jcol; maxVal = GDiagA[jcol]; } } } if (maxInd != -1) { node2aggr[irow] = node2aggr[maxInd]; nodeStat[irow] = MLI_METHOD_AMGSA_PENDING; aggrSizes[node2aggr[maxInd]]++; } } } for (irow = inANRows; irow < localNRows; irow++) { if (nodeStat[irow] == MLI_METHOD_AMGSA_PENDING) { nodeStat[irow] = MLI_METHOD_AMGSA_SELECTED; nSelected++; } } } /*----------------------------------------------------------------- * Phase 4 : finally put all lone rows into some neighbor aggregate *-----------------------------------------------------------------*/ int nUndone = localNRows - nSelected - nNotSelected; if (nUndone > 0) { count = nUndone / minAggrSize_; if (count == 0) count = 1; count += naggr; irow = jcol = 0; while (nUndone > 0) { if (nodeStat[irow] == MLI_METHOD_AMGSA_READY) { node2aggr[irow] = naggr; nodeStat[irow] = MLI_METHOD_AMGSA_SELECTED; nUndone--; nSelected++; jcol++; if (jcol >= minAggrSize_ && naggr < count-1) { jcol = 0; naggr++; } } irow++; } naggr = count; } /*----------------------------------------------------------------- * clean up and initialize the output arrays *-----------------------------------------------------------------*/ if (localNRows > 0) delete [] aggrSizes; if (localNRows > 0) delete [] nodeStat; if (localNRows == 1 && naggr == 0) { node2aggr[0] = 0; naggr = 1; } (*mliAggrArray) = node2aggr; (*mliAggrLeng) = naggr; return 0; } hypre-2.33.0/src/FEI_mv/femli/mli_amgsa_elem.cxx000066400000000000000000000322311477326011500214040ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ // ********************************************************************* // This file is customized to use HYPRE matrix format // ********************************************************************* // ********************************************************************* // local includes // --------------------------------------------------------------------- #include #include "HYPRE.h" #include "_hypre_utilities.h" #include "HYPRE_IJ_mv.h" #include "seq_mv.h" #include "_hypre_parcsr_mv.h" #include "mli_method_amgsa.h" #include "mli_utils.h" #include "mli_mapper.h" #include "mli_fedata.h" #include "mli_fedata_utils.h" #include "mli_matrix.h" extern "C" { void mli_computespectrum_(int *,int *,double *, double *, int *, double *, double *, double *, int *); } /*********************************************************************** * set up initial data using FEData * (nullspaceVec, saData_, saCounts_) * --------------------------------------------------------------------- */ int MLI_Method_AMGSA::setupUsingFEData( MLI *mli ) { int i, j, k, level, mypid, nprocs, nElems, nodeNumFields; int nodeFieldID, elemNNodes, **elemNodeLists, *elemNodeList1D; int blockSize=3, nNodes, *nodeEqnList, *sortArray, elemIndex; int eqnIndex, *aggrMap, currMacroNumber, elemStart, elemCount; int *macroNumbers, eMatDim, ierr, matz=1, *partition, aggrSize; int localStartRow, localNRows, nMacros, *macroSizes, nAggr; int j1, k1, *macroNodeEqnList, nodeIndex, eqnInd1, eqnInd2; int eqnNumber, colOffset1, colOffset2, *nodeNodeMap, elemID; int macroMatDim, *macroNodeList, macroNumNodes, *elemIDs; double *evalues, *evectors, *dAux1, *dAux2; double *elemMat, *elemMats; char paramString[100]; MPI_Comm comm; MLI_FEData *fedata; MLI_Mapper *nodeEqnMap; MLI_Function *funcPtr; MLI_Matrix *mliAmat, *mliENMat, *mliNEMat, *mliEEMat; hypre_ParCSRMatrix *hypreA, *hypreEE, *hypreEN, *hypreNE; #ifdef MLI_DEBUG_DETAILED printf("MLI_Method_AMGSA::setupUsingFEData begins...\n"); #endif /* --------------------------------------------------------------- */ /* error checking */ /* --------------------------------------------------------------- */ if ( mli == NULL ) { printf("MLI_Method_AMGSA::setupUsingFEData ERROR - no mli."); exit(1); } level = 0; fedata = mli->getFEData(level); if ( fedata == NULL ) { printf("MLI_Method_AMGSA::setupUsingFEData ERROR - no fedata.\n"); exit(1); } nodeEqnMap = mli->getNodeEqnMap(level); /* --------------------------------------------------------------- */ /* fetch communicator matrix information */ /* --------------------------------------------------------------- */ comm = getComm(); MPI_Comm_rank( comm, &mypid ); MPI_Comm_size( comm, &nprocs ); mliAmat = mli->getSystemMatrix( level ); hypreA = (hypre_ParCSRMatrix *) mliAmat->getMatrix(); HYPRE_ParCSRMatrixGetRowPartitioning((HYPRE_ParCSRMatrix) hypreA, &partition); localStartRow = partition[mypid]; localNRows = partition[mypid+1] - localStartRow; free( partition ); /* --------------------------------------------------------------- */ /* fetch FEData information */ /* --------------------------------------------------------------- */ fedata->getNodeNumFields(nodeNumFields); if ( nodeNumFields != 1 ) return 1; fedata->getNumElements( nElems ); elemIDs = new int[nElems]; fedata->getElemBlockGlobalIDs(nElems, elemIDs); fedata->getElemNumNodes(elemNNodes); elemNodeList1D = new int[nElems*elemNNodes]; elemNodeLists = new int*[nElems]; for ( i = 0; i < nElems; i++ ) elemNodeLists[i] = &(elemNodeList1D[i*elemNNodes]); fedata->getElemBlockNodeLists(nElems, elemNNodes, elemNodeLists); fedata->getNodeFieldIDs(nodeNumFields, &nodeFieldID); fedata->getFieldSize(nodeFieldID, blockSize); fedata->getNumNodes(nNodes); /* --------------------------------------------------------------- */ /* construct element-element matrix */ /* --------------------------------------------------------------- */ MLI_FEDataConstructElemNodeMatrix(comm, fedata, &mliENMat); hypreEN = (hypre_ParCSRMatrix *) mliENMat->getMatrix(); MLI_FEDataConstructNodeElemMatrix(comm, fedata, &mliNEMat); hypreNE = (hypre_ParCSRMatrix *) mliNEMat->getMatrix(); hypreEE = (hypre_ParCSRMatrix *) hypre_ParMatmul( (hypre_ParCSRMatrix *) hypreEN, (hypre_ParCSRMatrix *) hypreNE); /* --------------------------------------------------------------- */ /* perform element agglomeration */ /* --------------------------------------------------------------- */ funcPtr = new MLI_Function(); MLI_Utils_HypreParCSRMatrixGetDestroyFunc(funcPtr); sprintf(paramString, "HYPRE_ParCSR" ); mliEEMat = new MLI_Matrix( (void *) hypreEE, paramString, funcPtr ); MLI_FEDataAgglomerateElemsLocalOld(mliEEMat, ¯oNumbers); delete mliENMat; delete mliNEMat; delete mliEEMat; /* --------------------------------------------------------------- */ /* form aggregates */ /* --------------------------------------------------------------- */ /* --- get the node to equation map --- */ nodeEqnList = NULL; if ( nodeEqnMap != NULL ) { if ( nElems > 0 ) { nodeEqnList = new int[nElems*elemNNodes]; nodeEqnMap->getMap(nElems*elemNNodes,elemNodeList1D,nodeEqnList); } else nodeEqnList = NULL; } /* --- sort the element to macroelement map --- */ if ( nElems > 0 ) sortArray = new int[nElems]; else sortArray = NULL; for ( i = 0; i < nElems; i++ ) sortArray[i] = i; MLI_Utils_IntQSort2(macroNumbers, sortArray, 0, nElems-1); if ( nElems > 0 ) nMacros = macroNumbers[nElems-1] + 1; else nMacros = 0; /* --- get the node to equation map --- */ if ( localNRows > 0 ) aggrMap = new int[localNRows]; else aggrMap = NULL; for ( i = 0; i < localNRows; i++ ) aggrMap[i] = -1; /* --- map equation to aggregates --- */ currMacroNumber = -1; for ( i = 0; i < nElems; i++ ) { if ( macroNumbers[i] != currMacroNumber ) currMacroNumber = macroNumbers[i]; elemIndex = sortArray[i]; for ( j = 0; j < elemNNodes; j++ ) { eqnIndex = nodeEqnList[elemIndex*elemNNodes+j] - localStartRow; /* option between how aggregates are chosen in view of overlap if (eqnIndex>=0 && eqnIndex= 0 && eqnIndex < localNRows ) for ( k = 0; k < blockSize; k++ ) aggrMap[eqnIndex+k] = currMacroNumber; } } /* --- analyze aggregate sizes (merge small aggregates) --- */ if ( nElems > 0 ) macroSizes = new int[nElems]; else macroSizes = NULL; for ( i = 0; i < nMacros; i++ ) macroSizes[i] = 0; for ( i = 0; i < localNRows; i++ ) macroSizes[aggrMap[i]]++; /* --- compute null spaces --- */ if ( nullspaceVec_ != NULL ) delete [] nullspaceVec_; nullspaceLen_ = localNRows; nullspaceVec_ = new double[nullspaceLen_*nullspaceDim_]; eMatDim = elemNNodes * blockSize; elemMat = new double[eMatDim*eMatDim]; evectors = NULL; elemMats = NULL; elemStart = 0; while ( elemStart < nElems ) { currMacroNumber = macroNumbers[elemStart]; if ( outputLevel_ >= 1 && currMacroNumber % 200 == 0 ) printf("Computing null spaces of aggregate %d (%d)\n", currMacroNumber, nMacros); elemCount = elemStart + 1; while (macroNumbers[elemCount] == currMacroNumber && elemCount < nElems) elemCount++; macroNumNodes = ( elemCount - elemStart ) * elemNNodes; macroNodeList = new int[macroNumNodes]; for ( i = elemStart; i < elemCount; i++ ) { elemIndex = sortArray[i]; for ( j = 0; j < elemNNodes; j++ ) macroNodeList[(i-elemStart)*elemNNodes+j] = elemNodeLists[elemIndex][j]; } MLI_Utils_IntQSort2(macroNodeList, NULL, 0, macroNumNodes-1); k = 1; for ( i = 1; i < macroNumNodes; i++ ) if ( macroNodeList[i] != macroNodeList[k-1] ) macroNodeList[k++] = macroNodeList[i]; macroNumNodes = k; macroNodeEqnList = new int[macroNumNodes]; nodeEqnMap->getMap(macroNumNodes,macroNodeList,macroNodeEqnList); aggrSize = 0; for ( j = 0; j < macroNumNodes; j++ ) { eqnNumber = macroNodeEqnList[j] - localStartRow; if ( eqnNumber >= 0 && eqnNumber < localNRows && aggrMap[eqnNumber] == macroNumbers[elemStart] ) aggrSize += blockSize; } if ( aggrSize == 0 ) continue; macroMatDim = macroNumNodes * blockSize; evectors = new double[macroMatDim*macroMatDim]; evalues = new double[macroMatDim]; dAux1 = new double[macroMatDim]; dAux2 = new double[macroMatDim]; elemMats = new double[macroMatDim*macroMatDim]; nodeNodeMap = new int[elemNNodes]; for ( i = 0; i < macroMatDim*macroMatDim; i++ ) elemMats[i] = 0.0; for ( i = elemStart; i < elemCount; i++ ) { elemIndex = sortArray[i]; elemID = elemIDs[elemIndex]; fedata->getElemMatrix(elemID, eMatDim, elemMat); for ( j = 0; j < elemNNodes; j++ ) { nodeIndex = elemNodeLists[elemIndex][j]; nodeNodeMap[j] = MLI_Utils_BinarySearch(nodeIndex, macroNodeList, macroNumNodes); } for ( j = 0; j < elemNNodes; j++ ) { eqnInd1 = nodeNodeMap[j] * blockSize; for ( j1 = 0; j1 < blockSize; j1++ ) { colOffset1 = macroMatDim * ( eqnInd1 + j1 ); colOffset2 = eMatDim * ( j * blockSize + j1 ); for ( k = 0; k < elemNNodes; k++ ) { eqnInd2 = nodeNodeMap[k] * blockSize; for ( k1 = 0; k1 < blockSize; k1++ ) elemMats[eqnInd2+k1+colOffset1] += elemMat[k*blockSize+k1+colOffset2]; } } } } mli_computespectrum_(¯oMatDim, ¯oMatDim, elemMats, evalues, &matz, evectors, dAux1, dAux2, &ierr); for ( i = 0; i < nullspaceDim_; i++ ) { for ( j = 0; j < macroNumNodes; j++ ) { eqnNumber = macroNodeEqnList[j] - localStartRow; if ( eqnNumber >= 0 && eqnNumber < localNRows && aggrMap[eqnNumber] == macroNumbers[elemStart] ) { for ( k = 0; k < blockSize; k++ ) nullspaceVec_[eqnNumber+k+i*nullspaceLen_] = evectors[j*blockSize+k+i*macroMatDim]; } } } delete [] macroNodeEqnList; delete [] nodeNodeMap; delete [] macroNodeList; delete [] evectors; delete [] elemMats; delete [] evalues; delete [] dAux1; delete [] dAux2; elemStart = elemCount; } /* --------------------------------------------------------------- */ /* massage aggregate numbers and store them */ /* --------------------------------------------------------------- */ for ( i = 0; i < nMacros; i++ ) macroNumbers[i] = 0; for ( i = 0; i < localNRows; i++ ) macroNumbers[aggrMap[i]]++; for ( i = 0; i < nMacros; i++ ) { if ( macroNumbers[i] > 0 ) macroNumbers[i] = 1; else macroNumbers[i] = -1; } nAggr = 0; for ( i = 0; i < nMacros; i++ ) if ( macroNumbers[i] > 0 ) macroNumbers[i] = nAggr++; for ( i = 0; i < localNRows; i++ ) aggrMap[i] = macroNumbers[aggrMap[i]]; printf("setupUsingFEData : no aggregate\n"); /* saCounts_[0] = nAggr; saData_[0] = aggrMap; */ /* --------------------------------------------------------------- */ /* clean up */ /* --------------------------------------------------------------- */ if ( eMatDim > 0 ) delete [] elemMat; if ( nElems > 0 ) delete [] elemNodeList1D; if ( nElems > 0 ) delete [] elemNodeLists; if ( nElems > 0 ) delete [] elemIDs; if ( nElems > 0 ) delete [] sortArray; if ( nElems > 0 ) delete [] macroSizes; if ( nElems > 0 ) free( macroNumbers ); if ( nodeEqnList != NULL ) delete [] nodeEqnList; #ifdef MLI_DEBUG_DETAILED printf("MLI_Method_AMGSA::setupUsingFEData ends.\n"); #endif return 0; } hypre-2.33.0/src/FEI_mv/femli/mli_defs.h000066400000000000000000000016101477326011500176550ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * global definitions * *****************************************************************************/ #ifndef __MLIDEFS__ #define __MLIDEFS__ #define MLI_FALSE 0 #define MLI_TRUE 1 #define MLI_NONE -1 #define MLI_DEFAULT -1 #define MLI_SMOOTHER_PRE 1 #define MLI_SMOOTHER_POST 2 #define MLI_SMOOTHER_BOTH 3 #endif hypre-2.33.0/src/FEI_mv/femli/mli_febase.cxx000066400000000000000000001031321477326011500205360ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "mli_febase.h" /****************************************************************************/ /* class definition for abstract finite element structure */ /* (The design of this class attempts to follow the FEI 2.0 (Sandia) as */ /* closely as possible. Functions related to matrix and solver */ /* construction and utilization are removed. Additional finite element */ /* information (e.g. nodal coordinates, face information) have been added) */ /*--------------------------------------------------------------------------*/ MLI_FEBase::MLI_FEBase() {} MLI_FEBase::~MLI_FEBase() {} /**************************************************************************** * load general information ****************************************************************************/ /** set diagnostics level @param level - diagnostics level (0 or higher) */ int MLI_FEBase::setOutputLevel(int level) {(void) level; return -1;} /** set space dimension @param numDim - number of space dimension (3 for 3D) */ int MLI_FEBase::setSpaceDimension(int numDim) {(void) numDim; return -1;} /** set order of PDE @param pdeOrder - order of PDE (e.g. 2 for second order) */ int MLI_FEBase::setOrderOfPDE(int pdeOrder) {(void) pdeOrder; return -1;} /** set order of finite element discretization @param feOrder - order of FE discretization e.g. 2 for second order) */ int MLI_FEBase::setOrderOfFE(int feOrder) {(void) feOrder; return -1;} /**************************************************************************** * initialization functions ****************************************************************************/ /** set the current element block to load @param blockID - choose blockID as current element block number (if not called, assume blockID=0) */ int MLI_FEBase::setCurrentElemBlockID(int blockID) {(void) blockID; return -1;} /** declare all field variables used in this context @param numFields - total number of fields @param fieldSizes - degree of freedom for each fieldID declared @param fieldIDs - a list of distinct field IDs */ int MLI_FEBase::initFields(int numFields, const int *fieldSizes, const int *fieldIDs) { (void) numFields; (void) fieldSizes; (void) fieldIDs; return -1; } /** initialize element block information @param nElems - no. of elements in this block @param nNodesPerElem - no of nodes in each element in this block @param nodeNumFields - number of fields per node @param nodeFieldIDs - node field IDs @param elemNumFields - number of element fields @param elemFieldIDs - element field IDs */ int MLI_FEBase::initElemBlock(int nElems, int nNodesPerElem, int nodeNumFields, const int *nodeFieldIDs, int elemNumFields, const int *elemFieldIDs) { (void) nElems; (void) nNodesPerElem; (void) nodeNumFields; (void) elemNumFields; (void) elemFieldIDs; return -1; } /** initialize element connectivities @param nElems - no. of elements in this block @param elemIDs - a list of global element IDs @param elemNNodes - no of nodes in each element in this block @param nodeIDs - lists of node IDs for each element @param spaceDim - space dimension (e.g. 3 for 3D) @param coord - nodal coordinates (can be NULL) */ int MLI_FEBase::initElemNodeList(int elemID,int elemNNodes,const int *nodeIDs, int spaceDim, const double *coord) { (void) elemID; (void) elemNNodes; (void) nodeIDs; (void) spaceDim; (void) coord; return -1; } /** initialize element connectivities @param nElems - no. of elements in this block @param eGlobalIDs - a list of global element IDs @param nNodesPerElem - no of nodes in each element in this block @param nGlobalIDLists - lists of node IDs for each element @param spaceDim - space dimension (e.g. 3 for 3D) @param coord - nodal coordinates (can be NULL) */ int MLI_FEBase::initElemBlockNodeLists(int nElems, const int *eGlobalIDs, int nNodesPerElem, const int* const *nGlobalIDLists, int spaceDim, const double* const *coord) { (void) nElems; (void) eGlobalIDs; (void) nNodesPerElem; (void) nGlobalIDLists; (void) spaceDim; (void) coord; return -1; } /** initialize all shared nodes and which processors have them @param nNodes - number of shared nodes @param nGlobalIDs - IDs of shared nodes @param numProcs[i] - number of processors node i shares with @param procLists[i] - a list of processors to share node i */ int MLI_FEBase::initSharedNodes(int nNodes, const int *nGlobalIDs, const int *numProcs, const int * const *procLists) { (void) nNodes; (void) nGlobalIDs; (void) numProcs; (void) procLists; return -1; } /** initialize the element face lists of all elements in local processors in the same order as the globalIDs list given above @param nElems - has to match nElems in loadElemBlock @param nFaces - number of faces for each element @param fGlobalIDs - lists of face global IDs for each element */ int MLI_FEBase::initElemBlockFaceLists(int nElems, int nFaces, const int* const *fGlobalIDLists) { (void) nElems; (void) nFaces; (void) fGlobalIDLists; return -1; } /** initialize node lists of all local faces @param nFaces - number of faces in local processor @param fGlobalIDs - a list of face global IDs @param nNodes - number of nodes each face has @param nGlobalIDLists[i] - node list of face fGlobalIDs[i] */ int MLI_FEBase::initFaceBlockNodeLists(int nFaces, const int *fGlobalIDs, int nNodes, const int * const *nGlobalIDLists) { (void) nFaces; (void) fGlobalIDs; (void) nNodes; (void) nGlobalIDLists; return -1; } /** initialize a list of faces that are shared with other processors @param nFaces - number of shared faces @param fGlobalIDs - IDs of shared faces @param numProcs[i] - number of processors face i shares with @param procLists[i] - a list of processors to share face i */ int MLI_FEBase::initSharedFaces(int nFaces, const int *fGlobalIDs, const int *numProcs, const int* const *procLists) { (void) nFaces; (void) fGlobalIDs; (void) numProcs; (void) procLists; return -1; } /** initialization complete */ int MLI_FEBase::initComplete() {return -1;} /**************************************************************************** * load element information ****************************************************************************/ /* ------------------------------------------------------------------------- Collective loading : may mean excessive memory allocation *-------------------------------------------------------------------------*/ /** Load connectivity and stiffness matrices of all elements in local processor (collective loading for one element block) @params nElems - no. of elements in this block @params sMatDim - dimension of element matrices (for checking only) @params stiffMat - element matrices */ int MLI_FEBase::loadElemBlockMatrices(int nElems, int sMatDim, const double* const *stiffMat) { (void) nElems; (void) sMatDim; (void) stiffMat; return -1; } /** Load null spaces of all elements in local processors in the same order as the globalIDs list given above @param nElems - has to match nElems in loadElemBlock @param nNSpace - number of null space for each elements (it is an array as it may be different for different elements) @param sMatDim - number of unknowns for each element (for checking) @param nSpace - the null space information (column major) */ int MLI_FEBase::loadElemBlockNullSpaces(int nElems, const int *nNSpace, int sMatDim, const double* const *nSpace) { (void) nElems; (void) nNSpace; (void) sMatDim; (void) nSpace; return -1; } /** Load volumes of all elements in local processors in the same order as the globalIDs list given above @param nElems - has to match nElems in loadElemBlock @param elemVols - volume for each element in the list */ int MLI_FEBase::loadElemBlockVolumes(int nElems, const double *elemVols) { (void) nElems; (void) elemVols; return -1; } /** Load material type of all elements in local processors in the same order as the globalIDs list given above @param nElems - has to match nElems in loadElemBlock @param elemMaterials - material types for each element */ int MLI_FEBase::loadElemBlockMaterials(int nElems, const int *elemMaterial) { (void) nElems; (void) elemMaterial; return -1; } /** Load the element parent IDs of all elements in local processors in the same order as the globalIDs list given above @param nElems - has to match nElems in loadElemBlock @param pGlobalIDs - parent element global IDs for each element */ int MLI_FEBase::loadElemBlockParentIDs(int nElems, const int *pGlobalIDs) { (void) nElems; (void) pGlobalIDs; return -1; } /** Load the element loads (rhs) of all elements in local processors in the same order as the globalIDs list given above @param nElems - has to match nElems in loadElemBlock @param loadDim - length of each load vector (for checking only) @param elemLoads - right hand sides for each element */ int MLI_FEBase::loadElemBlockLoads(int nElems, int loadDim, const double* const *elemLoads) { (void) nElems; (void) loadDim; (void) elemLoads; return -1; } /** Load the element initial guess of all elements in local processors in the same order as the globalIDs list given above @param nElems - has to match nElems in loadElemBlock @param loadDim - length of each solution vector (for checking) @param elemSols - solution for each element */ int MLI_FEBase::loadElemBlockSolutions(int nElems, int solDim, const double* const *elemSols) { (void) nElems; (void) solDim; (void) elemSols; return -1; } /** Load element boundary conditions @param nElems - number of elements having boundary conditions @param eGlobalIDs - element global IDs @param elemDOF - element degree of freedom @param BCFlags - flag those DOFs that are BCs ('Y' for BCs) @param bcVals - boundary condition values (nElems values) */ int MLI_FEBase::loadElemBCs(int nElems, const int *eGlobalIDs, int elemDOF, const char *const *BCFlags, const double *const *bcVals) { (void) nElems; (void) eGlobalIDs; (void) elemDOF; (void) BCFlags; (void) bcVals; return -1; } /* ------------------------------------------------------------------------- * These functions allows elements to be loaded individually. * This may be more memory efficient, but not CPU efficient (many searches) *-------------------------------------------------------------------------*/ /** Load element matrix @param eGlobalID - element global ID @param nNodesPerElem - number of nodes per element (for checking) @param nGlobalIDs - a list of nodes for the element @param sMatDim - dimension of the element matrix (for checking) @param stiffMat - element stiffness matrix (column major) */ int MLI_FEBase::loadElemMatrix(int eGlobalID,int sMatDim,const double *stiffMat) { (void) eGlobalID; (void) sMatDim; (void) stiffMat; return -1; } /** Load element null space @param eGlobalID - element global ID @param nNSpace - number of null space vectors in the element @param sMatDim - length of each null space (for checking) @param nSpace - null space stored in column major manner */ int MLI_FEBase::loadElemNullSpace(int eGlobalID, int nNSpace, int sMatDim, const double *nSpace) { (void) eGlobalID; (void) nNSpace; (void) sMatDim; (void) nSpace; return -1; } /** load element load @param eGlobalID - element global ID @param sMatDim - dimension of the load vector (for checking) @param elemLoad - the element load vector */ int MLI_FEBase::loadElemLoad(int eGlobalID, int sMatDim, const double *elemLoad) { (void) eGlobalID; (void) sMatDim; (void) elemLoad; return -1; } /** load element solution (initial guess) @param eGlobalID - element global ID @param sMatDim - dimension of the solution vector @param elemSol - the element solution vector */ int MLI_FEBase::loadElemSolution(int eGlobalID,int sMatDim, const double *elemSol) { (void) eGlobalID; (void) sMatDim; (void) elemSol; return -1; } /** load the function pointer to fetch element stiffness matrices @param object - object to pass back to function to get element matrices @param func - pointer to the function for getting element matrices */ int MLI_FEBase::loadFunc_getElemMatrix(void *object, int (*func)(void*,int eGlobalID,int sMatDim,double *stiffMat)) { (void) object; (void) func; return -1; } /* ------------------------------------------------------------------------- * load node boundary conditions and share nodes *-------------------------------------------------------------------------*/ /** load all node essential boundary conditions @param nNodes - number of BC nodes @param nGlobalIDs - IDs of boundary nodes @param nodeDOF - total DOF in a node (for checking only) @param BCFlags - flag those DOFs that are BCs ('Y' - BCs) @param bcVals - boundary condition values (nNodes values) */ int MLI_FEBase::loadNodeBCs(int nNodes, const int *nGlobalIDs, int nodeDOF, const char *const *BCFlags, const double * const *bcVals) { (void) nNodes; (void) nGlobalIDs; (void) nodeDOF; (void) BCFlags; (void) bcVals; return -1; } /**************************************************************************** * get general information ****************************************************************************/ /** Return the space dimension (2D or 3D) @param (output) numDim - number of space dimension (3 for 3D) */ int MLI_FEBase::getSpaceDimension(int& numDim) {(void) numDim; return -1;} /** Return the order of the PDE @param (output) pdeOrder - order of PDE (2 for 2nd order) */ int MLI_FEBase::getOrderOfPDE(int& pdeOrder) {(void) pdeOrder; return -1;} /** Return the order of the FE discretization @param (output) feOrder - order of finite element discretization */ int MLI_FEBase::getOrderOfFE(int& feOrder) {(void) feOrder; return -1;} /** Return the number of unknowns for a given field @param (input) fieldID - field ID @param (output) fieldSize - degree of freedom for the field */ int MLI_FEBase::getFieldSize(int fieldID, int &fieldSize) { (void) fieldID; (void) fieldSize; return -1; } /**************************************************************************** * get element information ****************************************************************************/ /** Return the number of the local elements in nElems @param (output) nElems - return the number of element in this block */ int MLI_FEBase::getNumElements(int& nElems) {(void) nElems; return -1;} /** Return the number of fields in each element in this block @param (output) numFields - number of element fields in this block */ int MLI_FEBase::getElemNumFields(int& numFields) {(void) numFields; return -1;} /** Return the field IDs for each element in this block @param (input) numFields - number of element fields (checking) @param (output) fieldIDs - field IDs */ int MLI_FEBase::getElemFieldIDs(int numFields, int *fieldIDs) { (void) numFields; (void) fieldIDs; return -1; } /* ------------------------------------------------------------------------- * collective gets *-------------------------------------------------------------------------*/ /** Return all element global IDs (of size from getNumElements) @param (input) nElems - number of elements (from getNumElements) @param (output) eGlobalIDs - has the element GlobalIDs upon return (eGlobalIDs should be pre-allocated with length nElems) */ int MLI_FEBase::getElemBlockGlobalIDs(int nElems, int *eGlobalIDs) { (void) nElems; (void) eGlobalIDs; return -1; } /** Return the number of nodes for the elements in this block @param (output) nNodes - number of nodes for each element upon return */ int MLI_FEBase::getElemNumNodes(int& nNodes) {(void) nNodes; return -1;} /** Return the globalIDs of nodes for elements with global IDs given in the call to getElemGlobalIDs (same order) @param (input) nElems - no. of elements in this block (checking) @param (input) nNodes - no. of nodes for each element (checking) @param (ouptut) nGlobalIDLists - node lists for each element */ int MLI_FEBase::getElemBlockNodeLists(int nElems, int nNodes, int **nGlobalIDLists) { (void) nElems; (void) nNodes; (void) nGlobalIDLists; return -1; } /** Return dimension of element matrix in this block @param (output) sMatDim - dimension of the element matrix */ int MLI_FEBase::getElemMatrixDim(int &sMatDim) {(void) sMatDim; return -1;} /** Return element matrices for all elements in the block with global IDs given in the call to getElemGlobalIDs (same order) @param (input) nElems - number of elements in this block (checking) @param (input) sMatDim - dimension of element matrices (checking) @param (ouptut) elemMat - a list of element matrices */ int MLI_FEBase::getElemBlockMatrices(int nElems, int sMatDim, double **elemMat) { (void) nElems; (void) sMatDim; (void) elemMat; return -1; } /** Return the element null space sizes for elements with global IDs given in the call to getElemGlobalIDs (same order) @param (input) nElems - number of elements in this block (checking) @param (output) dimsNS - dimensions of the null spaces for all elements */ int MLI_FEBase::getElemBlockNullSpaceSizes(int nElems, int *dimsNS) { (void) nElems; (void) dimsNS; return -1; } /** Return the element null space for elements with global IDs given in the call to getElemGlobalIDs (same order) @param (input) nElems - no. of elements in this block (checking) @param (input) dimsNS[i] - no. of null space vectors for element i @param (input) sMatDim - dimension of each null space vector @param (ouptut) nullSpaces[i] - null space vectors for element i */ int MLI_FEBase::getElemBlockNullSpaces(int nElems, const int *dimsNS, int sMatDim, double **nullSpaces) { (void) nElems; (void) dimsNS; (void) sMatDim; (void) nullSpaces; return -1; } /** Return element volumes for elements given in the call to getElemGlobalIDs (in the same order) @param (input) nElems - number of elements in this block (checking) @param (output) elemVols - element volumes */ int MLI_FEBase::getElemBlockVolumes(int nElems, double *elemVols) { (void) nElems; (void) elemVols; return -1; } /** Return element materials for elements given in the call to getElemGlobalIDs (in the same order) @param (input) nElems - number of elements in this block (checking) @param (output) elemMats - element materials */ int MLI_FEBase::getElemBlockMaterials(int nElems, int *elemMats) { (void) nElems; (void) elemMats; return -1; } /** Return the parent IDs of elements (global IDs) in the same order as the list obtained from a call to getElemGlobalIDs @param (input) nElems - no. of elements in this block (checking) @param (output) pGlobalIDts - list of parent elements' global IDs */ int MLI_FEBase::getElemBlockParentIDs(int nElems, int *pGlobalIDs) { (void) nElems; (void) pGlobalIDs; return -1; } /** Return the number of faces of each element in this block @param (output) nFaces - number of faces for elements in this block */ int MLI_FEBase::getElemNumFaces(int& nFaces) {(void) nFaces; return -1;} /** Return the face lists of the elements (global IDs) in the same order as the IDs obtained by a call to the getElemGlobalIDs @param (input) nElems - no. of elements in this block (checking) @param (input) nFaces - no. of faces for all elements (checking) @param (output) fGlobalIDLists - lists of face global IDs */ int MLI_FEBase::getElemBlockFaceLists(int nElems, int nFaces, int **fGlobalIDLists) { (void) nElems; (void) nFaces; (void) fGlobalIDLists; return -1; } /* ------------------------------------------------------------------------- * individual (element) gets *-------------------------------------------------------------------------*/ /** Return the globalIDs of nodes for the element given element's global ID @param (input) eGlobalID - global ID of element @param (input) nNodes - number of nodes in this element (checking) @param (output) nGlobalIDs - a list of node global IDs for this element */ int MLI_FEBase::getElemNodeList(int eGlobalID, int nNodes, int *nGlobalIDs) { (void) eGlobalID; (void) nNodes; (void) nGlobalIDs; return -1; } /** Return an element stiffness matrix @param (input) eGlobalID - global ID of element @param (input) sMatDim - dimension of the element matrix (checking) @param (output) elemMat - element matrix in column major ordering */ int MLI_FEBase::getElemMatrix(int eGlobalID, int sMatDim, double *elemMat) { (void) eGlobalID; (void) sMatDim; (void) elemMat; return -1; } /** Return the element's null space size @param (input) eGlobalID - element global ID @param (output) dimNS - dimension of the null space */ int MLI_FEBase::getElemNullSpaceSize(int eGlobalID, int &dimNS) { (void) eGlobalID; (void) dimNS; return -1; } /** Return the element's null space @param (input) eGlobalID - element global ID @param (input) dimNS - number of null space vectors @param (input) sMatDim - length of each null space vector @param (output) nSpace - the null space vectors */ int MLI_FEBase::getElemNullSpace(int eGlobalID, int dimNS, int sMatDim, double *nSpace) { (void) eGlobalID; (void) dimNS; (void) sMatDim; (void) nSpace; return -1; } /** Return element volume @param (input) eGlobalID - element global ID @param (output) elemVol - element volume */ int MLI_FEBase::getElemVolume(int eGlobalID, double& elemVol) { (void) eGlobalID; (void) elemVol; return -1; } /** Return element material @param (input) eGlobalID - element global ID @param (output) elemMaterial - element material */ int MLI_FEBase::getElemMaterial(int eGlobalID, int& elemMaterial) { (void) eGlobalID; (void) elemMaterial; return -1; } /** Return the parent ID of a given element @param (input) eGlobalID - element global ID @param (output) pGlobalIDs - parent element's global IDs */ int MLI_FEBase::getElemParentID(int eGlobalID, int& pGlobalID) { (void) eGlobalID; (void) pGlobalID; return -1; } /** Return the face list of a given element @param (input) eGlobalID - element global ID @param (input) nFaces - number of faces for this element (checking) @param (output) fGlobalIDs - face global IDs */ int MLI_FEBase::getElemFaceList(int eGlobalID, int nFaces, int *fGlobalIDs) { (void) eGlobalID; (void) nFaces; (void) fGlobalIDs; return -1; } /** Return the number of elements having essential BCs @param (output) nElems - number of boundary elements */ int MLI_FEBase::getNumBCElems(int& nElems) {(void) nElems; return -1;} /** Return the essential BCs @param (input) nElems - number of boundary elements @param (output) eGlobalIDs - a list of boundary elements' global IDs @param (output) eDOFs - element DOFs (sum of all field DOFs) for checking purposes @param (output) BCFlags[i][j] = 'Y' if element i has a BC at the j-th position (if node i has field 0 and 1 and field 0 has rank 1 and field 1 has rank 3, then if field 1 has a BC at its second position, then BCFlags[i][2] = 'Y') @param (output) BCVals - boundary values */ int MLI_FEBase::getElemBCs(int nElems, int *eGlobalIDs, int eDOFs, char **BCFlags, double **BCVals) { (void) nElems; (void) eGlobalIDs; (void) eDOFs; (void) BCFlags; (void) BCVals; return -1; } /**************************************************************************** * get node information ****************************************************************************/ /** Return the number of local and external nodes @param (output) nNodes - number of nodes for this processor */ int MLI_FEBase::getNumNodes(int& nNodes) { (void) nNodes; return -1; } /** Return the global node IDs corresponding to local IDs from 0 to nNodes-1 with nNodes is the parameter returned from getNumNodes @param (input) nNodes - total no. of nodes (checking) @param (output) nGlobalIDs - node global IDs */ int MLI_FEBase::getNodeBlockGlobalIDs(int nNodes, int *nGlobalIDs) { (void) nNodes; (void) nGlobalIDs; return -1; } /** Return the number of fields for each node in the block @param (output) numFields - number of fields for each node */ int MLI_FEBase::getNodeNumFields(int &numFields) {(void) numFields; return -1;} /** Return the field ID for each node in the block @param (input) numFields - number of fields for each node @param (output) fieldIDs - a list of field IDs */ int MLI_FEBase::getNodeFieldIDs(int numFields, int *fieldIDs) { (void) numFields; (void) fieldIDs; return -1; } /** Return the coordinates of the nodes in the block (in the order of the node IDs from the call to getNodeBlockGlobalIDs) @param (input) nNodes - number of local/external nodes @param (input) spaceDim - spatial dimension (2 for 2D) @param (output) coordinates - coordinates */ int MLI_FEBase::getNodeBlockCoordinates(int nNodes, int spaceDim, double *coordinates) { (void) nNodes; (void) spaceDim; (void) coordinates; return -1; } /** Return the number of nodes having essential BCs @param (output) nNodes - number of boundary nodes */ int MLI_FEBase::getNumBCNodes(int& nNodes) {(void) nNodes; return -1;} /** Return the essential BCs @param (input) nNodes - number of boundary nodes @param (output) nGlobalIDs - a list of boundary nodes' global IDs @param (output) nDOFs - nodal DOFs (sum of all field DOFs) for checking purposes @param (output) BCFlags[i][j] = 'Y' if node i has a BC at the j-th position (if node i has field 0 and 1 and field 0 has rank 1 and field 1 has rank 3, then if field 1 has a BC at its second position, then BCFlags[i][2] = 'Y') @param (output) BCVals - boundary values */ int MLI_FEBase::getNodeBCs(int nNodes, int *nGlobalIDs, int nDOFs, char **BCFlags, double **BCVals) { (void) nNodes; (void) nGlobalIDs; (void) nDOFs; (void) BCFlags; (void) BCVals; return -1; } /** Return the number of shared nodes @param (output) nNodes - number of shared nodes */ int MLI_FEBase::getNumSharedNodes(int& nNodes) {(void) nNodes; return -1;} /** Return shared node list and for every of the nodes with how many processors is shared (the data is copied) @param (input) nNodes - number of shared nodes @param (output) nGlobalIDs - node global IDs @param (output) numProcs[i] - number of processors sharing nGlobalIDs[i] */ int MLI_FEBase::getSharedNodeNumProcs(int nNodes,int *nGlobalIDs,int *numProcs) { (void) nNodes; (void) nGlobalIDs; (void) numProcs; return -1; } /** Return the processors that share the given node @param (input) nNodes - number of shared nodes @param (input) numProcs[i] - number of processors sharing nGlobalIDs[i] from call to getSharedNodeNumProcs @param (input) procList[i] - processor IDs sharing nGlobalIDs[i] */ int MLI_FEBase::getSharedNodeProcs(int nNodes, int *numProcs, int **procList) { (void) nNodes; (void) numProcs; (void) procList; return -1; } /**************************************************************************** * get face information ****************************************************************************/ /** Return the number of faces in my processor @param (output) nFaces - number of faces */ int MLI_FEBase::getNumFaces(int& nFaces) {(void) nFaces; return -1;} /** Return the global IDs of all internal and external faces @param (input) nFaces - number of external faces @param (output) fGlobalIDs - a list of all faces' global IDs */ int MLI_FEBase::getFaceBlockGlobalIDs(int nFaces, int *fGlobalIDs) { (void) nFaces; (void) fGlobalIDs; return -1; } /** Return number of faces shared with other processors @param (output) nFaces - number of shared faces */ int MLI_FEBase::getNumSharedFaces(int& nFaces) {(void) nFaces; return -1;} /** Return shared face information @param (output) nFaces - number of shared faces @param (output) fGlobalIDs - face global IDs @param (output) numProcs[i] - number of processors sharing fGlobalIDs[i] */ int MLI_FEBase::getSharedFaceNumProcs(int nFaces,int *fGlobalIDs,int *numProcs) { (void) nFaces; (void) fGlobalIDs; (void) numProcs; return -1; } /** Return shared face information (processor) @param (input) nFaces - number of shared faces @param (input) numProcs[i] - number of processors sharing fGlobalIDs[i] from call to getSharedFaceNumProcs @param (input) procList[i] - processor IDs sharing fGlobalIDs[i] */ int MLI_FEBase::getSharedFaceProcs(int nFaces, int *numProcs, int **procList) { (void) nFaces; (void) numProcs; (void) procList; return -1; } /** Return the number of nodes in a face @param (output) nNodes - number of nodes in a face */ int MLI_FEBase::getFaceNumNodes(int &nNodes) {(void) nNodes; return -1;} /** Return the number of nodes in a face @param (input) nFaces - toal number of faces in this block @param (input) nNodesPerFace - number of nodes in a face @param (output) nGlobalIDLists - lists of nodes for faces */ int MLI_FEBase::getFaceBlockNodeLists(int nFaces, int nNodesPerFace, int **nGlobalIDLists) { (void) nFaces; (void) nNodesPerFace; (void) nGlobalIDLists; return -1; } /** Return the node list of a face given a global face ID @param (input) fGlobalID - face global ID @param (input) nNodes - number of nodes in a face (for checking) @param (output) nGlobalIDs - node global IDs */ int MLI_FEBase::getFaceNodeList(int fGlobalID, int nNodes, int *nGlobalIDs) { (void) fGlobalID; (void) nNodes; (void) nGlobalIDs; return -1; } /**************************************************************************** * shape function information ****************************************************************************/ /** load the function pointer to fetch shape function interpolant @param object - data to be passed back to the called function @param object - data object @param func - function pointer */ int MLI_FEBase::loadFunc_computeShapeFuncInterpolant(void *object, int (*func) (void *,int elemID,int nNodes,const double *coor, double *coef)) { (void) object; (void) func; return -1; } /** call fetch shape function interpolant @param (input) eGlobalID - element global ID @param (input) nNodes - number of nodes in this element @param (input) coord - coordinate information about this node @param (output) coef - coefficients returned */ int MLI_FEBase::getShapeFuncInterpolant(int eGlobalID, int nNodes, const double *coord, double *coef) { (void) eGlobalID; (void) nNodes; (void) coord; (void) coef; return -1; } /**************************************************************************** * other functions ****************************************************************************/ /** This function is used to get/set implementation-specific data of a derived FEBase object. @param (input) paramString - command string @param (input) argc - dimension of argv @param (input/output) argv - data returns the number of arguments returned, if appropriate. */ int MLI_FEBase::impSpecificRequests(char *paramString, int argc, char **argv) { (void) paramString; (void) argc; (void) argv; return -1; } /** read the element data from a file @param filename - a string storing name of the output file */ int MLI_FEBase::readFromFile(char *filename) {(void) filename; return -1;} /** write the element data to a file @param filename - a string storing name of the output file */ int MLI_FEBase::writeToFile(char *filename) {(void) filename; return -1;} hypre-2.33.0/src/FEI_mv/femli/mli_febase.h000066400000000000000000000240021477326011500201610ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #ifndef __MLIFEBASEH__ #define __MLIFEBASEH__ /****************************************************************************/ /* class definition for abstract finite element structure */ /* (The design of this class attempts to follow the FEI 2.0 (Sandia) as */ /* closely as possible. Functions related to matrix and solver */ /* construction and utilization are removed. Additional finite element */ /* information (e.g. nodal coordinates, face information) have been added) */ /*--------------------------------------------------------------------------*/ class MLI_FEBase { public : MLI_FEBase(); virtual ~MLI_FEBase(); // ========================================================================= // load general information // ========================================================================= virtual int setOutputLevel(int level); virtual int setSpaceDimension(int numDim); virtual int setOrderOfPDE(int pdeOrder); virtual int setOrderOfFE(int feOrder); // ========================================================================= // initialization functions // ========================================================================= virtual int setCurrentElemBlockID(int blockID); virtual int initFields(int numFields, const int *fieldSizes, const int *fieldIDs); virtual int initElemBlock(int nElems, int nNodesPerElem, int nodeNumFields, const int *nodeFieldIDs, int elemNumFields, const int *elemFieldIDs); virtual int initElemNodeList(int elemID,int elemNNodes,const int *nodeIDs, int spaceDim, const double *coord); virtual int initElemBlockNodeLists(int nElems, const int *eGlobalIDs, int nNodesPerElem, const int* const *nGlobalIDLists, int spaceDim, const double* const *coord); virtual int initSharedNodes(int nNodes, const int *nGlobalIDs, const int *numProcs, const int * const *procLists); virtual int initElemBlockFaceLists(int nElems, int nFaces, const int* const *fGlobalIDLists); virtual int initFaceBlockNodeLists(int nFaces, const int *fGlobalIDs, int nNodes, const int * const *nGlobalIDLists); virtual int initSharedFaces(int nFaces, const int *fGlobalIDs, const int *numProcs, const int* const *procLists); virtual int initComplete(); // ========================================================================= // load element information // ========================================================================= virtual int loadElemBlockMatrices(int nElems, int sMatDim, const double* const *stiffMat); virtual int loadElemBlockNullSpaces(int nElems, const int *nNSpace, int sMatDim, const double* const *nSpace); virtual int loadElemBlockVolumes(int nElems, const double *elemVols); virtual int loadElemBlockMaterials(int nElems, const int *elemMaterial); virtual int loadElemBlockParentIDs(int nElems, const int *pGlobalIDs); virtual int loadElemBlockLoads(int nElems, int loadDim, const double* const *elemLoads); virtual int loadElemBlockSolutions(int nElems, int solDim, const double* const *elemSols); virtual int loadElemBCs(int nElems, const int *eGlobalIDs, int elemDOF, const char *const *BCFlags, const double *const *bcVals); virtual int loadElemMatrix(int eGlobalID, int sMatDim, const double *stiffMat); virtual int loadElemNullSpace(int eGlobalID, int nNSpace, int sMatDim, const double *nSpace); virtual int loadElemLoad(int eGlobalID, int sMatDim, const double *elemLoad); virtual int loadElemSolution(int eGlobalID, int sMatDim, const double *elemSol); virtual int loadFunc_getElemMatrix(void *object, int (*func)(void*,int eGlobalID,int sMatDim,double *stiffMat)); // ========================================================================= // load node boundary conditions and share nodes // ========================================================================= virtual int loadNodeBCs(int nNodes, const int *nGlobalIDs, int nodeDOF, const char *const *BCFlags, const double * const *bcVals); // ========================================================================= // get general information // ========================================================================= virtual int getSpaceDimension(int& numDim); virtual int getOrderOfPDE(int& pdeOrder); virtual int getOrderOfFE(int& feOrder); virtual int getFieldSize(int fieldID, int &fieldSize); // ========================================================================= // get element information // ========================================================================= virtual int getNumElements(int& nElems); virtual int getElemNumFields(int& numFields); virtual int getElemFieldIDs(int numFields, int *fieldIDs); virtual int getElemBlockGlobalIDs(int nElems, int *eGlobalIDs); virtual int getElemNumNodes(int& nNodes); virtual int getElemBlockNodeLists(int nElems, int nNodes, int **nGlobalIDLists); virtual int getElemMatrixDim(int &sMatDim); virtual int getElemBlockMatrices(int nElems, int sMatDim, double **elemMat); virtual int getElemBlockNullSpaceSizes(int nElems, int *dimsNS); virtual int getElemBlockNullSpaces(int nElems, const int *dimsNS, int sMatDim, double **nullSpaces); virtual int getElemBlockVolumes(int nElems, double *elemVols); virtual int getElemBlockMaterials(int nElems, int *elemMats); virtual int getElemBlockParentIDs(int nElems, int *pGlobalIDs); virtual int getElemNumFaces(int& nFaces); virtual int getElemBlockFaceLists(int nElems, int nFaces, int **fGlobalIDLists); virtual int getElemNodeList(int eGlobalID, int nNodes, int *nGlobalIDs); virtual int getElemMatrix(int eGlobalID, int sMatDim, double *elemMat); virtual int getElemNullSpaceSize(int eGlobalID, int &dimNS); virtual int getElemNullSpace(int eGlobalID, int dimNS, int sMatDim, double *nSpace); virtual int getElemVolume(int eGlobalID, double& elemVol); virtual int getElemMaterial(int eGlobalID, int& elemMaterial); virtual int getElemParentID(int eGlobalID, int& pGlobalID); virtual int getElemFaceList(int eGlobalID, int nFaces, int *fGlobalIDs); virtual int getNumBCElems(int& nElems); virtual int getElemBCs(int nElems, int *eGlobalIDs, int eDOFs, char **BCFlags, double **BCVals); // ========================================================================= // get node information // ========================================================================= virtual int getNumNodes(int& nNodes); virtual int getNodeBlockGlobalIDs(int nNodes, int *nGlobalIDs); virtual int getNodeNumFields(int &numFields); virtual int getNodeFieldIDs(int numFields, int *fieldIDs); virtual int getNodeBlockCoordinates(int nNodes, int spaceDim, double *coordinates); virtual int getNumBCNodes(int& nNodes); virtual int getNodeBCs(int nNodes, int *nGlobalIDs, int nDOFs, char **BCFlags, double **BCVals); virtual int getNumSharedNodes(int& nNodes); virtual int getSharedNodeNumProcs(int nNodes, int *nGlobalIDs, int *numProcs); virtual int getSharedNodeProcs(int nNodes, int *numProcs, int **procList); // ========================================================================= // get face information // ========================================================================= virtual int getNumFaces(int& nFaces); virtual int getFaceBlockGlobalIDs(int nFaces, int *fGlobalIDs); virtual int getNumSharedFaces(int& nFaces); virtual int getSharedFaceNumProcs(int nFaces, int *fGlobalIDs, int *numProcs); virtual int getSharedFaceProcs(int nFaces, int *numProcs, int **procList); virtual int getFaceNumNodes(int &nNodes); virtual int getFaceBlockNodeLists(int nFaces, int nNodesPerFace, int **nGlobalIDLists); virtual int getFaceNodeList(int fGlobalID, int nNodes, int *nGlobalIDs); // ------------------------------------------------------------------------- // shape function information // ------------------------------------------------------------------------- virtual int loadFunc_computeShapeFuncInterpolant(void *object, int (*func) (void *,int elemID,int nNodes,const double *coor, double *coef)); virtual int getShapeFuncInterpolant(int eGlobalID, int nNodes, const double *coord, double *coef); // ------------------------------------------------------------------------- // other functions // ------------------------------------------------------------------------- virtual int impSpecificRequests(char *paramString, int argc, char **argv); virtual int readFromFile(char *filename); virtual int writeToFile(char *filename); }; #endif hypre-2.33.0/src/FEI_mv/femli/mli_fedata.cxx000066400000000000000000004637651477326011500205620ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /************************************************************************** ************************************************************************** * MLI_FEData Class functions ************************************************************************** **************************************************************************/ #include #include #include #if 0 /* RDF: Not sure this is really needed */ #ifdef WIN32 #define strcmp _stricmp #endif #endif #include "_hypre_utilities.h" #include "mli_fedata.h" #include "mli_utils.h" /************************************************************************** * constructor *-----------------------------------------------------------------------*/ MLI_FEData::MLI_FEData(MPI_Comm mpi_comm) { mpiComm_ = mpi_comm; outputLevel_ = 0; spaceDimension_ = -1; orderOfPDE_ = -1; orderOfFE_ = -1; numElemBlocks_ = 0; elemBlockList_ = NULL; numFields_ = 0; fieldIDs_ = NULL; fieldSizes_ = NULL; currentElemBlock_ = -1; USR_computeShapeFuncInterpolant = NULL; USR_getElemMatrix = NULL; } //************************************************************************* // destructor //------------------------------------------------------------------------- MLI_FEData::~MLI_FEData() { for ( int i = 0; i < numElemBlocks_; i++ ) deleteElemBlock(i); delete [] elemBlockList_; if ( fieldIDs_ != NULL ) delete [] fieldIDs_; if ( fieldSizes_ != NULL ) delete [] fieldSizes_; } //************************************************************************* // set diagnostics output level //------------------------------------------------------------------------- int MLI_FEData::setOutputLevel(int level) { if ( level < 0 ) { printf("setOutputLevel ERROR : level should be >= 0.\n"); return 0; } outputLevel_ = level; return 1; } //************************************************************************* // dimension of the physical problem (2D, 3D, etc.) //------------------------------------------------------------------------- int MLI_FEData::setSpaceDimension(int dimension) { if ( dimension <= 0 || dimension > 4 ) { printf("setSpaceDimension ERROR : dimension should be > 0 and <= 4.\n"); exit(1); } if (outputLevel_ >= 1) printf("setSpaceDimension = %d\n", dimension); spaceDimension_ = dimension; return 1; } //************************************************************************* // order of the partial differential equation //------------------------------------------------------------------------- int MLI_FEData::setOrderOfPDE(int pdeOrder) { if ( pdeOrder <= 0 || pdeOrder > 4 ) { printf("setOrderOfPDE ERROR : PDE order should be > 0 and <= 4.\n"); exit(1); } if (outputLevel_ >= 1) printf("setOrderOfPDE = %d\n", pdeOrder); orderOfPDE_ = pdeOrder; return 1; } //************************************************************************* // order of the finite element discretization //------------------------------------------------------------------------- int MLI_FEData::setOrderOfFE(int feOrder) { if ( feOrder <= 0 || feOrder > 4 ) { printf("setOrderOfFE ERROR : order should be > 0 and <= 4.\n"); exit(1); } if (outputLevel_ >= 1) printf("setOrderOfFE = %d\n", feOrder); orderOfFE_ = feOrder; return 1; } //************************************************************************* // set current element block ID (not implemented yet for blockID > 0) //------------------------------------------------------------------------- int MLI_FEData::setCurrentElemBlockID(int blockID) { if ( blockID != 0 ) { printf("setCurrentElemBlockID ERROR : blockID other than 0 invalid.\n"); exit(1); } if ( outputLevel_ >= 1 ) printf("setCurrentElemBlockID = %d\n", blockID); currentElemBlock_ = blockID; return 1; } //************************************************************************* // initialize field information //------------------------------------------------------------------------- int MLI_FEData::initFields(int nFields, const int *fieldSizes, const int *fieldIDs) { int i, mypid; if ( nFields <= 0 || nFields > 10 ) { printf("initFields ERROR : nFields invalid.\n"); exit(1); } MPI_Comm_rank(mpiComm_, &mypid); if ( outputLevel_ >= 1 && mypid == 0 ) { printf("\tinitFields : number of fields = %d\n", nFields); for ( i = 0; i < nFields; i++ ) printf("\t fieldID and size = %d %d\n",fieldIDs[i],fieldSizes[i]); } numFields_ = nFields; if ( fieldSizes_ != NULL ) delete [] fieldSizes_; fieldSizes_ = new int[nFields]; for ( i = 0; i < nFields; i++ ) fieldSizes_[i] = fieldSizes[i]; if ( fieldIDs_ != NULL ) delete [] fieldIDs_; fieldIDs_ = new int[nFields]; for ( i = 0; i < nFields; i++ ) fieldIDs_[i] = fieldIDs[i]; return 1; } //************************************************************************* // initialize the element block information //------------------------------------------------------------------------- int MLI_FEData::initElemBlock(int nElems, int nNodesPerElem, int nodeNumFields, const int *nodeFieldIDs, int elemNumFields, const int *elemFieldIDs) { int i; MLI_ElemBlock *currBlock; // ------------------------------------------------------------- // --- initial checking // ------------------------------------------------------------- if ( nElems <= 0 ) { printf("initElemBlock ERROR : nElems <= 0.\n"); exit(1); } if ( elemNumFields < 0 ) { printf("initElemBlock ERROR : elemNumFields < 0.\n"); exit(1); } if ( nodeNumFields < 0 ) { printf("initElemBlock ERROR : nodeNumFields < 0.\n"); exit(1); } if (outputLevel_ >= 1) { printf("initElemBlock : nElems = %d\n", nElems); printf("initElemBlock : node nFields = %d\n", nodeNumFields); printf("initElemBlock : elem nFields = %d\n", elemNumFields); } // ------------------------------------------------------------- // --- clean up previous element setups // ------------------------------------------------------------- if ( currentElemBlock_ >= 0 && currentElemBlock_ < numElemBlocks_ && elemBlockList_[currentElemBlock_] != NULL ) { deleteElemBlock(currentElemBlock_); createElemBlock(currentElemBlock_); } else if ( currentElemBlock_ >= 0 && currentElemBlock_ < numElemBlocks_ ) createElemBlock(currentElemBlock_); else createElemBlock(++currentElemBlock_); currBlock = elemBlockList_[currentElemBlock_]; // ------------------------------------------------------------- // --- allocate space for element IDs and node lists // ------------------------------------------------------------- currBlock->numLocalElems_ = nElems; currBlock->elemGlobalIDs_ = new int[nElems]; for ( i = 0; i < nElems; i++ ) currBlock->elemGlobalIDs_[i] = -1; currBlock->elemNodeIDList_ = new int*[nElems]; for ( i = 0; i < nElems; i++ ) currBlock->elemNodeIDList_[i] = NULL; // ------------------------------------------------------------- // --- store number of nodes per element information // ------------------------------------------------------------- if ( nNodesPerElem <= 0 || nNodesPerElem > 200 ) { printf("initElemBlock ERROR : nNodesPerElem <= 0 or > 200.\n"); exit(1); } currBlock->elemNumNodes_ = nNodesPerElem; // ------------------------------------------------------------- // --- store node level data // ------------------------------------------------------------- currBlock->nodeNumFields_ = nodeNumFields; currBlock->nodeFieldIDs_ = new int[nodeNumFields]; for ( i = 0; i < nodeNumFields; i++ ) currBlock->nodeFieldIDs_[i] = nodeFieldIDs[i]; // ------------------------------------------------------------- // --- store element level data // ------------------------------------------------------------- currBlock->elemNumFields_ = elemNumFields; if ( elemNumFields > 0 ) { currBlock->elemFieldIDs_ = new int[elemNumFields]; for ( i = 0; i < elemNumFields; i++ ) currBlock->elemFieldIDs_[i] = elemFieldIDs[i]; } return 1; } //************************************************************************* // initialize the element connectivities //------------------------------------------------------------------------- int MLI_FEData::initElemBlockNodeLists(int nElems, const int *eGlobalIDs, int nNodesPerElem, const int* const *nGlobalIDLists, int spaceDim, const double* const *coord) { int i, j, length, *intArray; MLI_ElemBlock *currBlock; // ------------------------------------------------------------- // --- initial checking // ------------------------------------------------------------- currBlock = elemBlockList_[currentElemBlock_]; if ( nElems != currBlock->numLocalElems_ ) { printf("initElemBlockNodeLists ERROR : nElems do not match.\n"); exit(1); } if ( nNodesPerElem != currBlock->elemNumNodes_ ) { printf("initElemBlockNodeLists ERROR : nNodesPerElem invalid.\n"); exit(1); } if ( spaceDimension_ != spaceDim && coord != NULL ) { printf("initElemBlockNodeLists ERROR : spaceDim invalid.\n"); exit(1); } #ifdef MLI_DEBUG_DETAILED printf("initElemBlockNodeLists Diagnostics: segFault test.\n"); double ddata; for (i = 0; i < nElems; i++) { index = eGlobalIDs[i]; for (j = 0; j < nNodesPerElem; j++) length = nGlobalIDLists[i][j]; if ( coord != NULL ) { for (j = 0; j < nNodesPerElem*spaceDim; j++) ddata = coord[i][j]; } } printf("initElemBlockNodeLists Diagnostics : passed the segFault test.\n"); #endif // ------------------------------------------------------------- // --- allocate storage and load for storing element global IDs // ------------------------------------------------------------- if ( currBlock->elemGlobalIDs_ == NULL ) { printf("initElemBlockNodeLists ERROR : have not called initElemBlock."); exit(1); } for (i = 0; i < nElems; i++) currBlock->elemGlobalIDs_[i] = eGlobalIDs[i]; // ------------------------------------------------------------- // --- allocate storage and load for element node connectivities // ------------------------------------------------------------- for ( i = 0; i < nElems; i++ ) { currBlock->elemNodeIDList_[i] = new int[nNodesPerElem]; intArray = currBlock->elemNodeIDList_[i]; for ( j = 0; j < nNodesPerElem; j++ ) intArray[j] = nGlobalIDLists[i][j]; } if ( coord == NULL ) return 1; // ------------------------------------------------------------- // --- temporarily store away nodal coordinates // ------------------------------------------------------------- length = nNodesPerElem * spaceDimension_ * nElems; currBlock->nodeCoordinates_ = new double[length]; length = nNodesPerElem * spaceDimension_; for ( i = 0; i < nElems; i++ ) { for ( j = 0; j < length; j++ ) currBlock->nodeCoordinates_[i*length+j] = coord[i][j]; } return 1; } //************************************************************************* // initialize the element connectivities //------------------------------------------------------------------------- int MLI_FEData::initElemNodeList( int eGlobalID, int nNodesPerElem, const int* nGlobalIDs, int spaceDim, const double *coord) { int i, j, length, index, *intArray, nElems; MLI_ElemBlock *currBlock; // ------------------------------------------------------------- // --- initial checking // ------------------------------------------------------------- currBlock = elemBlockList_[currentElemBlock_]; if ( nNodesPerElem != currBlock->elemNumNodes_ ) { printf("initElemNodeList ERROR : nNodesPerElem invalid.\n"); exit(1); } if ( spaceDimension_ != spaceDim && coord != NULL ) { printf("initElemNodeList ERROR : spaceDim invalid.\n"); exit(1); } #ifdef MLI_DEBUG_DETAILED printf("initElemNodeList Diagnostics: segFault test.\n"); double ddata; for (i = 0; i < nNodesPerElem; i++) index = nGlobalIDs[i]; if ( coord != NULL ) for (i = 0; i < nNodesPerElem*spaceDim; i++) ddata = coord[i]; printf("initElemNodeList Diagnostics : passed the segFault test.\n"); #endif // ------------------------------------------------------------- // --- allocate storage and load for storing element global IDs // ------------------------------------------------------------- if ( currBlock->elemGlobalIDs_ == NULL ) { printf("initElemNodeList ERROR : have not called initElemBlock."); exit(1); } index = currBlock->elemOffset_++; currBlock->elemGlobalIDs_[index] = eGlobalID; // ------------------------------------------------------------- // --- allocate storage and load for element node connectivities // ------------------------------------------------------------- currBlock->elemNodeIDList_[index] = new int[nNodesPerElem]; intArray = currBlock->elemNodeIDList_[index]; for ( j = 0; j < nNodesPerElem; j++ ) intArray[j] = nGlobalIDs[j]; if ( coord == NULL ) return 1; // ------------------------------------------------------------- // --- temporarily store away nodal coordinates // ------------------------------------------------------------- nElems = currBlock->numLocalElems_; length = nNodesPerElem * spaceDimension_ * nElems; if ( currBlock->nodeCoordinates_ == NULL ) currBlock->nodeCoordinates_ = new double[length]; length = nNodesPerElem * spaceDimension_; for ( i = 0; i < length; i++ ) currBlock->nodeCoordinates_[index*length+i] = coord[i]; return 1; } //************************************************************************* // initialize shared node list //------------------------------------------------------------------------- int MLI_FEData::initSharedNodes(int nNodes, const int *nGlobalIDs, const int *numProcs, const int * const *procLists) { int i, j, length, index, index2, *nodeIDs, *auxArray; int *sharedNodeIDs, *sharedNodeNProcs, **sharedNodeProc, nSharedNodes; MLI_ElemBlock *currBlock; // ------------------------------------------------------------- // --- initial checking // ------------------------------------------------------------- if ( nNodes < 0 ) { printf("initSharedNodes ERROR : nNodes < 0.\n"); exit(1); } if ( nNodes == 0 ) return 0; currBlock = elemBlockList_[currentElemBlock_]; if ( currBlock->sharedNodeIDs_ != NULL ) printf("initSharedNodes WARNING : already initialized (1) ?\n"); if ( currBlock->sharedNodeNProcs_ != NULL ) printf("initSharedNodes WARNING : already initialized (2) ?\n"); if ( currBlock->sharedNodeProc_ != NULL ) printf("initSharedNodes WARNING : already initialized (3) ?\n"); #ifdef MLI_DEBUG_DETAILED printf("initSharedNodes Diagnostics: segFault test.\n"); for (i = 0; i < nNodes; i++) { index = nGlobalIDs[i]; length = numProcs[i]; for (j = 0; j < length; j++) index = procLists[i][j]; } printf("initSharedNodes Diagnostics: passed the segFault test.\n"); #endif // ------------------------------------------------------------- // --- sort and copy the shared node list // ------------------------------------------------------------- nodeIDs = new int[nNodes]; auxArray = new int[nNodes]; for (i = 0; i < nNodes; i++) nodeIDs[i] = nGlobalIDs[i]; for (i = 0; i < nNodes; i++) auxArray[i] = i; MLI_Utils_IntQSort2(nodeIDs, auxArray, 0, nNodes-1); nSharedNodes = 1; for (i = 1; i < nNodes; i++) if ( nodeIDs[i] != nodeIDs[nSharedNodes-1] ) nSharedNodes++; sharedNodeIDs = new int[nSharedNodes]; sharedNodeNProcs = new int[nSharedNodes]; sharedNodeProc = new int*[nSharedNodes]; nSharedNodes = 1; sharedNodeIDs[0] = nodeIDs[0]; for (i = 1; i < nNodes; i++) if ( nodeIDs[i] != sharedNodeIDs[nSharedNodes-1] ) sharedNodeIDs[nSharedNodes++] = nodeIDs[i]; for ( i = 0; i < nSharedNodes; i++ ) sharedNodeNProcs[i] = 0; for ( i = 0; i < nNodes; i++ ) { index = MLI_Utils_BinarySearch(nodeIDs[i],sharedNodeIDs, nSharedNodes); index2 = auxArray[i]; sharedNodeNProcs[index] += numProcs[index2]; } for ( i = 0; i < nSharedNodes; i++ ) { sharedNodeProc[i] = new int[sharedNodeNProcs[i]]; sharedNodeNProcs[i] = 0; } for ( i = 0; i < nNodes; i++ ) { index = MLI_Utils_BinarySearch(nodeIDs[i],sharedNodeIDs, nSharedNodes); index2 = auxArray[i]; for ( j = 0; j < numProcs[index2]; j++ ) sharedNodeProc[index][sharedNodeNProcs[index]++] = procLists[index2][j]; } delete [] nodeIDs; delete [] auxArray; for ( i = 0; i < nSharedNodes; i++ ) { MLI_Utils_IntQSort2(sharedNodeProc[i],NULL,0,sharedNodeNProcs[i]-1); length = 1; for ( j = 1; j < sharedNodeNProcs[i]; j++ ) if ( sharedNodeProc[i][j] != sharedNodeProc[i][length-1] ) sharedNodeProc[i][length++] = sharedNodeProc[i][j]; sharedNodeNProcs[i] = length; } currBlock->numSharedNodes_ = nSharedNodes; currBlock->sharedNodeIDs_ = sharedNodeIDs; currBlock->sharedNodeNProcs_ = sharedNodeNProcs; currBlock->sharedNodeProc_ = sharedNodeProc; return 1; } //************************************************************************* // initialize element face lists //------------------------------------------------------------------------- int MLI_FEData::initElemBlockFaceLists(int nElems, int nFaces, const int* const *fGlobalIDLists) { int i, j, index, *elemFaceList; MLI_ElemBlock *currBlock; // ------------------------------------------------------------- // --- initial checking // ------------------------------------------------------------- currBlock = elemBlockList_[currentElemBlock_]; if ( nElems != currBlock->numLocalElems_ ) { printf("initElemBlockFaceLists ERROR : nElems do not match.\n"); exit(1); } if ( nFaces <= 0 || nFaces > 100 ) { printf("initElemBlockFaceLists ERROR : nFaces invalid.\n"); exit(1); } #ifdef MLI_DEBUG_DETAILED printf("initElemBlockFaceLists Diagnostics: segFault test.\n"); for (i = 0; i < nElems; i++) for (j = 0; j < nFaces; j++) index = fGlobalIDLists[i][j]; printf("initElemBlockFaceLists Diagnostics: passed the segFault test.\n"); #endif // ------------------------------------------------------------- // --- allocate storage space // ------------------------------------------------------------- if ( currBlock->elemFaceIDList_ == NULL ) { currBlock->elemFaceIDList_ = new int*[nElems]; currBlock->elemNumFaces_ = nFaces; for (i = 0; i < nElems; i++) currBlock->elemFaceIDList_[i] = new int[nFaces]; } // ------------------------------------------------------------- // --- load face information // ------------------------------------------------------------- for ( i = 0; i < nElems; i++ ) { index = currBlock->elemGlobalIDAux_[i]; elemFaceList = currBlock->elemFaceIDList_[i]; for ( j = 0; j < nFaces; j++ ) elemFaceList[j] = fGlobalIDLists[index][j]; } return 1; } //************************************************************************* // initialize face node list //------------------------------------------------------------------------- int MLI_FEData::initFaceBlockNodeLists(int nFaces, const int *fGlobalIDs, int nNodes, const int * const *nGlobalIDLists) { int i, j, index, *faceArray, **faceNodeList; MLI_ElemBlock *currBlock; // ------------------------------------------------------------- // --- initial checking // ------------------------------------------------------------- currBlock = elemBlockList_[currentElemBlock_]; if ( currBlock->elemFaceIDList_ == NULL ) { printf("initFaceBlockNodeLists ERROR : elem-face not initialized.\n"); exit(1); } #ifdef MLI_DEBUG_DETAILED printf("initFaceBlockNodeLists Diagnostics: segFault test.\n"); for (i = 0; i < nFaces; i++) { index = fGlobalIDs[i]; for (j = 0; j < nNodes; j++) index = nGlobalIDLists[i][j]; } printf("initFaceBlockNodeLists Diagnostics: passed the segFault test.\n"); #endif // ------------------------------------------------------------- // --- find out how many distinct faces from elemFaceIDList // ------------------------------------------------------------- currBlock->numLocalFaces_ = nFaces; currBlock->faceNumNodes_ = nNodes; currBlock->numExternalFaces_ = 0; currBlock->faceGlobalIDs_ = new int[nFaces]; currBlock->faceNodeIDList_ = new int*[nFaces]; faceArray = new int[nFaces]; for ( i = 0; i < nFaces; i++ ) { currBlock->faceGlobalIDs_[i] = fGlobalIDs[i]; currBlock->faceNodeIDList_[i] = NULL; faceArray[i] = i; } MLI_Utils_IntQSort2(currBlock->faceGlobalIDs_, faceArray, 0, nFaces-1); // ------------------------------------------------------------- // --- load the face Node list // ------------------------------------------------------------- faceNodeList = currBlock->faceNodeIDList_; for ( i = 0; i < nFaces; i++ ) { index = faceArray[faceArray[i]]; faceNodeList[index] = new int[nNodes]; for ( j = 0; j < nNodes; j++ ) faceNodeList[i][j] = nGlobalIDLists[index][j]; } delete [] faceArray; return 1; } //************************************************************************* // initialize shared face list // (*** need to take into consideration of repeated face numbers in the // face list - for pairs, just as already been done in initSharedNodes) //------------------------------------------------------------------------- int MLI_FEData::initSharedFaces(int nFaces, const int *fGlobalIDs, const int *numProcs, const int* const *procLists) { int i, j, index, *intArray; MLI_ElemBlock *currBlock; // ------------------------------------------------------------- // --- initial checking // ------------------------------------------------------------- if ( nFaces <= 0 ) { printf("initSharedFaces ERROR : nFaces <= 0.\n"); exit(1); } currBlock = elemBlockList_[currentElemBlock_]; if ( currBlock->sharedFaceIDs_ != NULL ) printf("initSharedFaces WARNING : already initialized (1) ?\n"); if ( currBlock->sharedFaceNProcs_ != NULL ) printf("initSharedFaces WARNING : already initialized (2) ?\n"); if ( currBlock->sharedFaceProc_ != NULL ) printf("initSharedFaces WARNING : already initialized (3) ?\n"); #ifdef MLI_DEBUG_DETAILED printf("initSharedFaces Diagnostics: segFault test.\n"); for (i = 0; i < nFaces; i++) { index = fGlobalIDs[i]; length = numProcs[i]; for (j = 0; j < length; j++) index = procList[i][j]; } printf("initSharedFaces Diagnostics: passed the segFault test.\n"); #endif // ------------------------------------------------------------- // --- allocate space for the incoming data // ------------------------------------------------------------- currBlock->numSharedFaces_ = nFaces; currBlock->sharedFaceIDs_ = new int[nFaces]; currBlock->sharedFaceNProcs_ = new int[nFaces]; currBlock->sharedFaceProc_ = new int*[nFaces]; // ------------------------------------------------------------- // --- load shared face information // ------------------------------------------------------------- intArray = new int[nFaces]; for (i = 0; i < nFaces; i++) currBlock->sharedFaceIDs_[i] = fGlobalIDs[i]; for (i = 0; i < nFaces; i++) intArray[i] = i; MLI_Utils_IntQSort2(currBlock->sharedFaceIDs_, intArray, 0, nFaces-1); for ( i = 0; i < nFaces; i++ ) { index = intArray[i]; if ( numProcs[index] <= 0 ) { printf("initSharedFaces ERROR : numProcs not valid.\n"); exit(1); } currBlock->sharedFaceNProcs_[i] = numProcs[index]; currBlock->sharedFaceProc_[i] = new int[numProcs[index]]; for ( j = 0; j < numProcs[index]; j++ ) currBlock->sharedFaceProc_[i][j] = procLists[index][j]; MLI_Utils_IntQSort2(currBlock->sharedFaceProc_[i], NULL, 0, numProcs[index]-1); } delete [] intArray; return 1; } //************************************************************************* // initialization complete //------------------------------------------------------------------------- int MLI_FEData::initComplete() { int i, j, k, nElems, *elemList, totalNodes, *nodeArray, counter; int index, temp_cnt, numSharedNodes, nExtNodes, elemNumNodes; int *sharedNodeIDs, *sharedNodeNProcs, **sharedNodeProc; int **elemNodeList, searchInd, elemNumFaces, numSharedFaces; int *sharedFaceIDs, *sharedFaceNProcs, **sharedFaceProc, numProcs; int mypid, totalFaces, nExtFaces, *faceArray, *procArray; int **elemFaceList, *procArray2, *ownerP, *sndrcvReg, nProcs; int nRecv, nSend, *recvProcs, *sendProcs, *recvLengs, *sendLengs; int nNodes, pnum, **sendBuf, **recvBuf, *iauxArray, index2; int *intArray, **intArray2, nNodesPerElem, length, *nodeArrayAux; double *dtemp_array, *nodeCoords; MPI_Request *request; MPI_Status status; MLI_ElemBlock *currBlock; currBlock = elemBlockList_[currentElemBlock_]; // ------------------------------------------------------------- // --- check all element connectivities have been loaded // ------------------------------------------------------------- nElems = currBlock->numLocalElems_; hypre_assert( nElems > 0 ); elemList = currBlock->elemGlobalIDs_; if ( elemList == NULL ) { printf("initComplete ERROR : initElemBlockNodeLists not called.\n"); exit(1); } for ( i = 0; i < nElems; i++ ) { if ( elemList[i] < 0 ) { printf("initComplete ERROR : negative element ID.\n"); exit(1); } } for ( i = 0; i < nElems; i++ ) { for ( j = 0; j < currBlock->elemNumNodes_; j++ ) { if ( currBlock->elemNodeIDList_[i][j] < 0 ) { printf("initComplete ERROR : negative node ID.\n"); exit(1); } } } // ------------------------------------------------------------- // --- sort elemGlobalIDs in increasing order and shuffle // ------------------------------------------------------------- currBlock->elemGlobalIDAux_ = new int[nElems]; for ( i = 0; i < nElems; i++ ) currBlock->elemGlobalIDAux_[i] = i; MLI_Utils_IntQSort2(currBlock->elemGlobalIDs_, currBlock->elemGlobalIDAux_, 0, nElems-1); // ------------------------------------------------------------- // --- error checking (for duplicate element IDs) // ------------------------------------------------------------- for ( i = 1; i < nElems; i++ ) { hypre_assert( currBlock->elemGlobalIDs_[i] >= 0 ); if ( currBlock->elemGlobalIDs_[i] == currBlock->elemGlobalIDs_[i-1] ) { printf("initComplete ERROR : duplicate elemIDs.\n"); exit(1); } } // ------------------------------------------------------------- // --- allocate storage and load for element node connectivities // ------------------------------------------------------------- nNodesPerElem = currBlock->elemNumNodes_; intArray2 = new int*[nElems]; for ( i = 0; i < nElems; i++ ) intArray2[i] = new int[nNodesPerElem]; for ( i = 0; i < nElems; i++ ) { index = currBlock->elemGlobalIDAux_[i]; intArray = currBlock->elemNodeIDList_[index]; for ( j = 0; j < nNodesPerElem; j++ ) intArray2[i][j] = intArray[j]; } for ( i = 0; i < nElems; i++ ) delete [] currBlock->elemNodeIDList_[i]; delete [] currBlock->elemNodeIDList_; currBlock->elemNodeIDList_ = intArray2; length = nNodesPerElem * spaceDimension_; if ( currBlock->nodeCoordinates_ != NULL ) { nodeCoords = new double[length]; for ( i = 0; i < nElems; i++ ) { for ( j = 0; j < length; j++ ) { index = currBlock->elemGlobalIDAux_[i]; nodeCoords[i*length+j] = currBlock->nodeCoordinates_[index*length+j]; } } delete [] currBlock->nodeCoordinates_; currBlock->nodeCoordinates_ = nodeCoords; } // ------------------------------------------------------------- // --- compute element and nodal degrees of freedom // ------------------------------------------------------------- currBlock->elemDOF_ = 0; for ( i = 0; i < currBlock->elemNumFields_; i++ ) currBlock->elemNumFields_ += fieldSizes_[currBlock->elemFieldIDs_[i]]; currBlock->nodeDOF_ = 0; for ( i = 0; i < currBlock->nodeNumFields_; i++ ) currBlock->nodeDOF_ += fieldSizes_[currBlock->nodeFieldIDs_[i]]; // ------------------------------------------------------------- // --- obtain an ordered array of distinct node IDs // ------------------------------------------------------------- elemNumNodes = currBlock->elemNumNodes_; elemNodeList = currBlock->elemNodeIDList_; temp_cnt = nElems * elemNumNodes; nodeArray = new int[temp_cnt]; nodeArrayAux = new int[temp_cnt]; totalNodes = 0; for ( i = 0; i < nElems; i++ ) { for ( j = 0; j < elemNumNodes; j++ ) nodeArray[totalNodes++] = elemNodeList[i][j]; } MLI_Utils_IntQSort2(nodeArray, NULL, 0, temp_cnt-1); totalNodes = 1; for ( i = 1; i < temp_cnt; i++ ) if ( nodeArray[i] != nodeArray[totalNodes-1] ) nodeArray[totalNodes++] = nodeArray[i]; for ( i = 0; i < totalNodes; i++ ) nodeArrayAux[i] = nodeArray[i]; // ------------------------------------------------------------- // --- search for external nodes // ------------------------------------------------------------- MPI_Comm_rank(mpiComm_, &mypid); numSharedNodes = currBlock->numSharedNodes_; sharedNodeIDs = currBlock->sharedNodeIDs_; sharedNodeNProcs = currBlock->sharedNodeNProcs_; sharedNodeProc = currBlock->sharedNodeProc_; nExtNodes = 0; for ( i = 0; i < numSharedNodes; i++ ) { for ( j = 0; j < sharedNodeNProcs[i]; j++ ) { if ( sharedNodeProc[i][j] < mypid ) { nExtNodes++; index = MLI_Utils_BinarySearch( sharedNodeIDs[i], nodeArray, totalNodes); if ( index < 0 ) { printf("initComplete ERROR : shared node not in elements.\n"); printf(" %d\n", sharedNodeIDs[i]); for ( k = 0; k < totalNodes; k++ ) printf(" nodeArray = %d\n", nodeArray[k]); exit(1); } if ( nodeArrayAux[index] >= 0 ) nodeArrayAux[index] = - nodeArrayAux[index] - 1; break; } } } // ------------------------------------------------------------- // --- initialize the external nodes apart from internal // ------------------------------------------------------------- nExtNodes = 0; for (i = 0; i < totalNodes; i++) if ( nodeArrayAux[i] < 0 ) nExtNodes++; currBlock->numExternalNodes_ = nExtNodes; currBlock->numLocalNodes_ = totalNodes - nExtNodes; currBlock->nodeGlobalIDs_ = new int[totalNodes]; temp_cnt = 0; for (i = 0; i < totalNodes; i++) { if ( nodeArrayAux[i] >= 0 ) currBlock->nodeGlobalIDs_[temp_cnt++] = nodeArray[i]; } for (i = 0; i < totalNodes; i++) { if ( nodeArrayAux[i] < 0 ) currBlock->nodeGlobalIDs_[temp_cnt++] = nodeArray[i]; } delete [] nodeArray; delete [] nodeArrayAux; // ------------------------------------------------------------- // --- create an aux array for holding mapped external node IDs // ------------------------------------------------------------- MPI_Comm_size( mpiComm_, &nProcs ); ownerP = NULL; iauxArray = NULL; sndrcvReg = NULL; if ( nExtNodes > 0 ) ownerP = new int[nExtNodes]; if ( nExtNodes > 0 ) iauxArray = new int[nExtNodes]; if ( numSharedNodes > 0 ) sndrcvReg = new int[numSharedNodes]; nNodes = currBlock->numLocalNodes_; for ( i = 0; i < numSharedNodes; i++ ) { index = searchNode( sharedNodeIDs[i] ) - nNodes; if ( index >= nExtNodes ) { printf("FEData initComplete ERROR : ext node ID construction.\n"); exit(1); } if ( index >= 0 ) { sndrcvReg[i] = 1; // recv pnum = mypid; for ( j = 0; j < sharedNodeNProcs[i]; j++ ) if ( sharedNodeProc[i][j] < pnum ) pnum = sharedNodeProc[i][j]; ownerP[index] = pnum; iauxArray[index] = pnum; } else sndrcvReg[i] = 0; // send } nRecv = 0; recvProcs = NULL; recvLengs = NULL; recvBuf = NULL; MLI_Utils_IntQSort2( iauxArray, NULL, 0, nExtNodes-1); if ( nExtNodes > 0 ) nRecv = 1; for ( i = 1; i < nExtNodes; i++ ) if (iauxArray[i] != iauxArray[nRecv-1]) iauxArray[nRecv++] = iauxArray[i]; if ( nRecv > 0 ) { recvProcs = new int[nRecv]; for ( i = 0; i < nRecv; i++ ) recvProcs[i] = iauxArray[i]; recvLengs = new int[nRecv]; for ( i = 0; i < nRecv; i++ ) recvLengs[i] = 0; for ( i = 0; i < nExtNodes; i++ ) { index = MLI_Utils_BinarySearch( ownerP[i], recvProcs, nRecv ); recvLengs[index]++; } recvBuf = new int*[nRecv]; for ( i = 0; i < nRecv; i++ ) recvBuf[i] = new int[recvLengs[i]]; } if ( nExtNodes > 0 ) delete [] iauxArray; counter = 0; for ( i = 0; i < numSharedNodes; i++ ) if ( sndrcvReg[i] == 0 ) counter += sharedNodeNProcs[i]; if ( counter > 0 ) iauxArray = new int[counter]; counter = 0; for ( i = 0; i < numSharedNodes; i++ ) { if ( sndrcvReg[i] == 0 ) { for ( j = 0; j < sharedNodeNProcs[i]; j++ ) if ( sharedNodeProc[i][j] != mypid ) iauxArray[counter++] = sharedNodeProc[i][j]; } } nSend = 0; sendProcs = NULL; sendLengs = NULL; sendBuf = NULL; if ( counter > 0 ) { MLI_Utils_IntQSort2( iauxArray, NULL, 0, counter-1); nSend = 1; for ( i = 1; i < counter; i++ ) if (iauxArray[i] != iauxArray[nSend-1]) iauxArray[nSend++] = iauxArray[i]; sendProcs = new int[nSend]; for ( i = 0; i < nSend; i++ ) sendProcs[i] = iauxArray[i]; sendLengs = new int[nSend]; for ( i = 0; i < nSend; i++ ) sendLengs[i] = 0; for ( i = 0; i < numSharedNodes; i++ ) { if ( sndrcvReg[i] == 0 ) { for ( j = 0; j < sharedNodeNProcs[i]; j++ ) { if ( sharedNodeProc[i][j] != mypid ) { index = sharedNodeProc[i][j]; index = MLI_Utils_BinarySearch( index, sendProcs, nSend ); sendLengs[index]++; } } } } sendBuf = new int*[nSend]; for ( i = 0; i < nSend; i++ ) sendBuf[i] = new int[sendLengs[i]]; for ( i = 0; i < nSend; i++ ) sendLengs[i] = 0; for ( i = 0; i < numSharedNodes; i++ ) { if ( sndrcvReg[i] == 0 ) { for ( j = 0; j < sharedNodeNProcs[i]; j++ ) { if ( sharedNodeProc[i][j] != mypid ) { index = sharedNodeProc[i][j]; index = MLI_Utils_BinarySearch( index, sendProcs, nSend ); index2 = searchNode( sharedNodeIDs[i] ); sendBuf[index][sendLengs[index]++] = currBlock->nodeOffset_ + index2; } } } } } if ( counter > 0 ) delete [] iauxArray; if ( nRecv > 0 ) request = new MPI_Request[nRecv]; for ( i = 0; i < nRecv; i++ ) MPI_Irecv( recvBuf[i], recvLengs[i], MPI_INT, recvProcs[i], 183, mpiComm_, &request[i]); for ( i = 0; i < nSend; i++ ) MPI_Send( sendBuf[i], sendLengs[i], MPI_INT, sendProcs[i], 183, mpiComm_); for ( i = 0; i < nRecv; i++ ) MPI_Wait( &request[i], &status ); if ( nExtNodes > 0 ) currBlock->nodeExtNewGlobalIDs_ = new int[nExtNodes]; for ( i = 0; i < nRecv; i++ ) recvLengs[i] = 0; for ( i = 0; i < nExtNodes; i++ ) { index = MLI_Utils_BinarySearch( ownerP[i], recvProcs, nRecv ); j = recvBuf[index][recvLengs[index]++]; currBlock->nodeExtNewGlobalIDs_[i] = j; } if ( nExtNodes > 0 ) delete [] ownerP; if ( numSharedNodes > 0 ) delete [] sndrcvReg; if ( nRecv > 0 ) delete [] recvLengs; if ( nRecv > 0 ) delete [] recvProcs; for ( i = 0; i < nRecv; i++ ) delete [] recvBuf[i]; if ( nRecv > 0 ) delete [] recvBuf; if ( nSend > 0 ) delete [] sendLengs; if ( nSend > 0 ) delete [] sendProcs; for ( i = 0; i < nSend; i++ ) delete [] sendBuf[i]; if ( nSend > 0 ) delete [] sendBuf; if ( nRecv > 0 ) delete [] request; // ------------------------------------------------------------- // --- now that the node list if finalized, shuffle the coordinates // ------------------------------------------------------------- if ( currBlock->nodeCoordinates_ != NULL ) { nodeArray = currBlock->nodeGlobalIDs_; dtemp_array = currBlock->nodeCoordinates_; nodeCoords = new double[totalNodes * spaceDimension_]; for ( i = 0; i < nElems; i++ ) { for ( j = 0; j < currBlock->elemNumNodes_; j++ ) { index = currBlock->elemNodeIDList_[i][j]; searchInd = MLI_Utils_BinarySearch(index, nodeArray, totalNodes-nExtNodes); if ( searchInd < 0 ) searchInd = MLI_Utils_BinarySearch(index, &(nodeArray[totalNodes-nExtNodes]), nExtNodes) + totalNodes - nExtNodes; for ( k = 0; k < spaceDimension_; k++ ) nodeCoords[searchInd*spaceDimension_+k] = dtemp_array[(i*elemNumNodes+j)*spaceDimension_+k]; } } delete [] dtemp_array; currBlock->nodeCoordinates_ = nodeCoords; } // ------------------------------------------------------------- // --- check for correctness in loading IDs // ------------------------------------------------------------- if ( currBlock->elemFaceIDList_ != NULL ) { elemNumFaces = currBlock->elemNumFaces_; elemFaceList = currBlock->elemFaceIDList_; temp_cnt = nElems * elemNumFaces; faceArray = new int[temp_cnt]; totalFaces = 0; for ( i = 0; i < nElems; i++ ) { for ( j = 0; j < elemNumFaces; j++ ) faceArray[totalFaces++] = elemFaceList[i][j]; } MLI_Utils_IntQSort2(faceArray, NULL, 0, temp_cnt-1); totalFaces = 1; for ( i = 1; i < temp_cnt; i++ ) if ( faceArray[i] != faceArray[i-1] ) faceArray[totalFaces++] = faceArray[i]; if ( totalFaces != currBlock->numLocalFaces_ && currBlock->faceGlobalIDs_ == NULL ) { printf("initComplete WARNING : face IDs not initialized.\n"); } else if ( totalFaces != currBlock->numLocalFaces_ && currBlock->faceGlobalIDs_ != NULL ) { printf("initComplete ERROR : numbers of face do not match.\n"); exit(1); } else { delete [] currBlock->faceGlobalIDs_; currBlock->faceGlobalIDs_ = NULL; } } // ------------------------------------------------------------- // --- search for external faces // ------------------------------------------------------------- if ( currBlock->elemFaceIDList_ != NULL && currBlock->numSharedFaces_ > 0 ) { numSharedFaces = currBlock->numSharedFaces_; sharedFaceIDs = currBlock->sharedFaceIDs_; sharedFaceNProcs = currBlock->sharedFaceNProcs_; sharedFaceProc = currBlock->sharedFaceProc_; nExtFaces = 0; for ( i = 0; i < numSharedFaces; i++ ) { for ( j = 0; j < sharedFaceNProcs[i]; j++ ) { if ( sharedFaceProc[i][j] < mypid ) { nExtFaces++; index = MLI_Utils_BinarySearch( sharedFaceIDs[i], faceArray, totalFaces); if ( index < 0 ) { printf("initComplete ERROR : shared node not in elements.\n"); exit(1); } faceArray[index] = - faceArray[index]; break; } } } currBlock->numExternalFaces_ = nExtFaces; currBlock->numLocalFaces_ = totalFaces - nExtFaces; currBlock->faceGlobalIDs_ = new int[totalFaces]; temp_cnt = 0; for (i = 0; i < totalFaces; i++) { if ( faceArray[i] >= 0 ) currBlock->faceGlobalIDs_[temp_cnt++] = faceArray[i]; } for (i = 0; i < totalFaces; i++) { if ( faceArray[i] < 0 ) currBlock->faceGlobalIDs_[temp_cnt++] = - faceArray[i]; } delete [] faceArray; } // ------------------------------------------------------------- // --- get element, node and face offsets // ------------------------------------------------------------- MPI_Comm_size( mpiComm_, &numProcs ); procArray = new int[numProcs]; procArray2 = new int[numProcs]; for ( i = 0; i < numProcs; i++ ) procArray2[i] = 0; procArray2[mypid] = currBlock->numLocalElems_; MPI_Allreduce(procArray2, procArray, numProcs, MPI_INT, MPI_SUM, mpiComm_); currBlock->elemOffset_ = 0; for ( i = 0; i < mypid; i++ ) currBlock->elemOffset_ += procArray[i]; procArray2[mypid] = currBlock->numLocalNodes_ - currBlock->numExternalNodes_; MPI_Allreduce(procArray2, procArray, numProcs, MPI_INT, MPI_SUM, mpiComm_); currBlock->nodeOffset_ = 0; for ( i = 0; i < mypid; i++ ) currBlock->nodeOffset_ += procArray[i]; procArray2[mypid] = currBlock->numLocalFaces_ - currBlock->numExternalFaces_; MPI_Allreduce(procArray2, procArray, numProcs, MPI_INT, MPI_SUM, mpiComm_); currBlock->faceOffset_ = 0; for ( i = 0; i < mypid; i++ ) currBlock->faceOffset_ += procArray[i]; delete [] procArray; delete [] procArray2; // ------------------------------------------------------------- // --- initialization complete // ------------------------------------------------------------- currBlock->initComplete_ = 1; return 1; } //************************************************************************* // load all element matrices at once //------------------------------------------------------------------------- int MLI_FEData::loadElemBlockMatrices(int nElems, int sMatDim, const double* const *stiffMat) { int i, j, length, index; double *row_darray; MLI_ElemBlock *currBlock; // ------------------------------------------------------------- // --- initial checking // ------------------------------------------------------------- currBlock = elemBlockList_[currentElemBlock_]; if ( nElems != currBlock->numLocalElems_ ) { printf("loadElemBlockMatrices ERROR : nElems mismatch.\n"); exit(1); } if ( ! currBlock->initComplete_ ) { printf("loadElemBlockMatrices ERROR : initialization not completed.\n"); exit(1); } #ifdef MLI_DEBUG_DETAILED printf("loadElemBlockMatrices Diagnostics: segFault test.\n"); double ddata; for (i = 0; i < nElems; i++) { for (j = 0; j < sMatDim*sMatDim; j++) ddata = stiffMat[i][j]; } printf("loadElemBlockMatrices Diagnostics: passed the segFault test.\n"); #endif // ------------------------------------------------------------- // --- allocate storage and load element stiffness matrices // ------------------------------------------------------------- if ( sMatDim <= 0 || sMatDim > 200 ) { printf("loadElemBlockMatrices ERROR : sMatDim invalid.\n"); exit(1); } currBlock->elemStiffDim_ = sMatDim; currBlock->elemStiffMat_ = new double*[nElems]; for ( i = 0; i < nElems; i++ ) { length = sMatDim * sMatDim; currBlock->elemStiffMat_[i] = new double[length]; index = currBlock->elemGlobalIDAux_[i]; row_darray = currBlock->elemStiffMat_[i]; for ( j = 0; j < length; j++ ) row_darray[j] = stiffMat[index][j]; } return 1; } //************************************************************************* // load element nullspace for all elements //------------------------------------------------------------------------- int MLI_FEData::loadElemBlockNullSpaces(int nElems, const int *nNSpace, int sMatDim, const double* const *nSpace) { int i, j, index, length; MLI_ElemBlock *currBlock; // ------------------------------------------------------------- // --- initial checking // ------------------------------------------------------------- (void) sMatDim; currBlock = elemBlockList_[currentElemBlock_]; if ( nElems != currBlock->numLocalElems_ ) { printf("loadElemBlockNullSpaces ERROR : nElems do not match.\n"); exit(1); } if ( ! currBlock->initComplete_ ) { printf("loadElemBlockNullSpaces ERROR : initialization not complete.\n"); exit(1); } if ( currBlock->elemNullSpace_ == NULL || currBlock->elemNumNS_ == NULL ) { currBlock->elemNullSpace_ = new double*[nElems]; currBlock->elemNumNS_ = new int[nElems]; for ( i = 0; i < nElems; i++ ) { currBlock->elemNullSpace_[i] = NULL; currBlock->elemNumNS_[i] = 0; } } #ifdef MLI_DEBUG_DETAILED printf("loadElemBlockNullSpaces Diagnostics: segFault test.\n"); double ddata; for (i = 0; i < nElems; i++) { length = nNSpace[i]; for (j = 0; j < sMatDim*length; j++) ddata = nSpace[i][j]; } printf("loadElemBlockNullSpaces Diagnostics: passed the segFault test.\n"); #endif // ------------------------------------------------------------- // --- load null space information // ------------------------------------------------------------- for ( i = 0; i < nElems; i++ ) { index = currBlock->elemGlobalIDAux_[i]; currBlock->elemNumNS_[i] = nNSpace[index]; length = currBlock->elemStiffDim_ * nNSpace[index]; currBlock->elemNullSpace_[i] = new double[length]; for ( j = 0; j < length; j++ ) currBlock->elemNullSpace_[i][j] = nSpace[index][j]; } return 1; } //************************************************************************* // load element volumes for all elements //------------------------------------------------------------------------- int MLI_FEData::loadElemBlockVolumes(int nElems, const double *elemVols) { int i, index; MLI_ElemBlock *currBlock; // ------------------------------------------------------------- // --- initial checking // ------------------------------------------------------------- currBlock = elemBlockList_[currentElemBlock_]; if ( nElems != currBlock->numLocalElems_ ) { printf("loadElemBlockVolumes ERROR : nElems do not match.\n"); exit(1); } if ( ! currBlock->initComplete_ ) { printf("loadElemBlockVolumes ERROR : initialization not complete.\n"); exit(1); } if ( currBlock->elemVolume_ == NULL ) currBlock->elemVolume_ = new double[nElems]; #ifdef MLI_DEBUG_DETAILED printf("loadElemBlockVolumes Diagnostics: segFault test.\n"); double ddata; for (i = 0; i < nElems; i++) ddata = elemVols[i]; printf("loadElemBlockVolumes Diagnostics: passed the segFault test.\n"); #endif // ------------------------------------------------------------- // --- load element volume information // ------------------------------------------------------------- for ( i = 0; i < nElems; i++ ) { index = currBlock->elemGlobalIDAux_[i]; currBlock->elemVolume_[i] = elemVols[index]; } return 1; } //************************************************************************* // load element material for all elements //------------------------------------------------------------------------- int MLI_FEData::loadElemBlockMaterials(int nElems, const int *elemMats) { int i, index; MLI_ElemBlock *currBlock; // ------------------------------------------------------------- // --- initial checking // ------------------------------------------------------------- currBlock = elemBlockList_[currentElemBlock_]; if ( nElems != currBlock->numLocalElems_ ) { printf("loadElemBlockMaterials ERROR : nElems do not match.\n"); exit(1); } if ( ! currBlock->initComplete_ ) { printf("loadElemBlockMaterials ERROR : initialization not complete.\n"); exit(1); } if ( currBlock->elemMaterial_ == NULL ) currBlock->elemMaterial_ = new int[nElems]; #ifdef MLI_DEBUG_DETAILED printf("loadElemBlockMaterials Diagnostics: segFault test.\n"); double ddata; for (i = 0; i < nElems; i++) ddata = elemVols[i]; printf("loadElemBlockMaterials Diagnostics: passed the segFault test.\n"); #endif // ------------------------------------------------------------- // --- load element material space information // ------------------------------------------------------------- for ( i = 0; i < nElems; i++ ) { index = currBlock->elemGlobalIDAux_[i]; currBlock->elemMaterial_[i] = elemMats[index]; } return 1; } //************************************************************************* // load element parent IDs for all elements //------------------------------------------------------------------------- int MLI_FEData::loadElemBlockParentIDs(int nElems, const int *elemPIDs) { int i, index; MLI_ElemBlock *currBlock; // ------------------------------------------------------------- // --- initial checking // ------------------------------------------------------------- currBlock = elemBlockList_[currentElemBlock_]; if ( nElems != currBlock->numLocalElems_ ) { printf("loadElemBlockParentIDs ERROR : nElems do not match.\n"); exit(1); } if ( ! currBlock->initComplete_ ) { printf("loadElemBlockParentIDs ERROR : initialization not complete.\n"); exit(1); } if ( currBlock->elemParentIDs_ == NULL ) currBlock->elemParentIDs_ = new int[nElems]; #ifdef MLI_DEBUG_DETAILED printf("loadElemBlockParentIDs Diagnostics: segFault test.\n"); for (i = 0; i < nElems; i++) index = elemPIDs[i]; printf("loadElemBlockParentIDs Diagnostics: passed the segFault test.\n"); #endif // ------------------------------------------------------------- // --- load element material space information // ------------------------------------------------------------- for ( i = 0; i < nElems; i++ ) { index = currBlock->elemGlobalIDAux_[i]; currBlock->elemParentIDs_[i] = elemPIDs[index]; } return 1; } //************************************************************************* // load element load //------------------------------------------------------------------------- int MLI_FEData::loadElemBlockLoads(int nElems, int loadDim, const double* const *elemLoads) { int i, j, index; double *dble_array; MLI_ElemBlock *currBlock; // ------------------------------------------------------------- // --- initial checking // ------------------------------------------------------------- currBlock = elemBlockList_[currentElemBlock_]; if ( nElems != currBlock->numLocalElems_ ) { printf("loadElemBlockLoads ERROR : nElems do not match.\n"); exit(1); } if ( loadDim != currBlock->elemStiffDim_ ) { printf("loadElemBlockLoads ERROR : loadDim invalid.\n"); exit(1); } if ( ! currBlock->initComplete_ ) { printf("loadElemBlockLoads ERROR : initialization not complete.\n"); exit(1); } #ifdef MLI_DEBUG_DETAILED double ddata; printf("loadElemBlockLoads Diagnostics: segFault test.\n"); for (i = 0; i < nElems; i++) for (j = 0; j < loadDim; j++) ddata = elemLoads[i][j]; printf("loadElemBlockLoads Diagnostics: passed the segFault test.\n"); #endif // ------------------------------------------------------------- // --- allocate storage space // ------------------------------------------------------------- if ( currBlock->elemLoads_ == NULL ) { currBlock->elemLoads_ = new double*[nElems]; for ( i = 0; i < nElems; i++ ) currBlock->elemLoads_[i] = new double[loadDim]; } // ------------------------------------------------------------- // --- load face information // ------------------------------------------------------------- for ( i = 0; i < nElems; i++ ) { index = currBlock->elemGlobalIDAux_[i]; dble_array = currBlock->elemLoads_[i]; for ( j = 0; j < loadDim; j++ ) dble_array[j] = elemLoads[index][j]; } return 1; } //************************************************************************* // load element solution //------------------------------------------------------------------------- int MLI_FEData::loadElemBlockSolutions(int nElems, int solDim, const double* const *elemSols) { int i, j, index; double *dble_array; MLI_ElemBlock *currBlock; // ------------------------------------------------------------- // --- initial checking // ------------------------------------------------------------- currBlock = elemBlockList_[currentElemBlock_]; if ( nElems != currBlock->numLocalElems_ ) { printf("loadElemBlockSolutions ERROR : nElems do not match.\n"); exit(1); } if ( solDim != currBlock->elemStiffDim_ ) { printf("loadElemBlockSolutions ERROR : solDim invalid."); exit(1); } if ( ! currBlock->initComplete_ ) { printf("loadElemBlockSolutions ERROR : initialization not complete.\n"); exit(1); } #ifdef MLI_DEBUG_DETAILED printf("loadElemBlockSolutions Diagnostics: segFault test.\n"); double ddata; for (i = 0; i < nElems; i++) for (j = 0; j < loadDim; j++) ddata = elemSols[i][j]; printf("loadElemBlockSolutions Diagnostics: passed the segFault test.\n"); #endif // ------------------------------------------------------------- // --- allocate storage space // ------------------------------------------------------------- if ( currBlock->elemSol_ == NULL ) { currBlock->elemSol_ = new double*[nElems]; for ( i = 0; i < nElems; i++ ) currBlock->elemSol_[i] = new double[solDim]; } // ------------------------------------------------------------- // --- load face information // ------------------------------------------------------------- for ( i = 0; i < nElems; i++ ) { index = currBlock->elemGlobalIDAux_[i]; dble_array = currBlock->elemSol_[i]; for ( j = 0; j < solDim; j++ ) dble_array[j] = elemSols[index][j]; } return 1; } //************************************************************************* // load element boundary conditions //------------------------------------------------------------------------- int MLI_FEData::loadElemBCs(int nElems, const int *eGlobalIDs, int elemDOF, const char * const *BCFlags, const double *const *BCVals) { int i, j, elemDOFCheck; double *bcData; MLI_ElemBlock *currBlock; // ------------------------------------------------------------- // --- initial checking // ------------------------------------------------------------- currBlock = elemBlockList_[currentElemBlock_]; if ( nElems <= 0 ) { printf("loadElemBCs ERROR : nElems <= 0.\n"); exit(1); } elemDOFCheck = 0; for ( i = 0; i < currBlock->elemNumFields_; i++ ) elemDOFCheck += fieldSizes_[currBlock->elemFieldIDs_[i]]; if ( elemDOFCheck != elemDOF ) { printf("loadElemBCs ERROR : element DOF not valid.\n"); exit(1); } if ( ! currBlock->initComplete_ ) { printf("loadElemBCs ERROR : initialization not complete.\n"); exit(1); } #ifdef MLI_DEBUG_DETAILED printf("loadElemBCs Diagnostics: segFault test.\n"); char cdata; double ddata; for (i = 0; i < nElems; i++) { j = eGlobalIDs[i]; for (j = 0; j < elemDOF; j++) cdata = BCFlags[i][j]; for (j = 0; j < elemDOF; j++) ddata = BCVals[i][j]; } printf("loadElemBCs Diagnostics: passed the segFault test.\n"); #endif // ------------------------------------------------------------- // --- allocate storage space // ------------------------------------------------------------- if ( currBlock->elemNumBCs_ == 0 ) { currBlock->elemNumBCs_ = nElems; currBlock->elemBCIDList_ = new int[nElems]; currBlock->elemBCFlagList_ = new char*[nElems]; currBlock->elemBCValues_ = new double*[nElems]; for ( i = 0; i < nElems; i++ ) { currBlock->elemBCFlagList_[i] = new char[elemDOF]; currBlock->elemBCValues_[i] = new double[elemDOF]; } } // ------------------------------------------------------------- // --- load boundary information // ------------------------------------------------------------- for ( i = 0; i < nElems; i++ ) { currBlock->elemBCIDList_[i] = eGlobalIDs[i]; bcData = currBlock->elemBCValues_[i]; for ( j = 0; j < elemDOF; j++ ) { bcData[j] = BCVals[i][j]; currBlock->elemBCFlagList_[i][j] = BCFlags[i][j]; } } return 1; } //************************************************************************* // load element node list and stiffness matrix //------------------------------------------------------------------------- int MLI_FEData::loadElemMatrix(int eGlobalID, int eMatDim, const double *elemMat) { int i, j, index; MLI_ElemBlock *currBlock; // ------------------------------------------------------------- // --- error checking // ------------------------------------------------------------- currBlock = elemBlockList_[currentElemBlock_]; #ifdef MLI_DEBUG_DETAILED if ( ! currBlock->intComplete_ ) { printf("loadElemMatrix ERROR : initialization not complete.\n"); exit(1); } if (currBlock->elemStiffMat_ != NULL && eMatDim != currBlock->elemStiffDim_) { printf("loadElemMatrix ERROR : dimension mismatch.\n"); exit(1); } if ( nNodesPerElem <= 0 ) { printf("loadElemMatrix ERROR : NodesPerElem <= 0."); exit(1); } #endif // ------------------------------------------------------------- // --- allocate memory for stiffness matrix // ------------------------------------------------------------- if ( currBlock->elemStiffMat_ == NULL ) { currBlock->elemStiffMat_ = new double*[currBlock->numLocalElems_]; for ( i = 0; i < currBlock->numLocalElems_; i++ ) currBlock->elemStiffMat_[i] = NULL; currBlock->elemStiffDim_ = eMatDim; } // ------------------------------------------------------------- // --- search for the data holder // ------------------------------------------------------------- index = searchElement( eGlobalID ); #ifdef MLI_DEBUG_DETAILED if ( index < 0 ) { printf("loadElemMatrix ERROR : invalid elementID %d\n", eGlobalID); exit(1); } if ( elemStiff_[index] != NULL ) { printf("loadElemMatrix ERROR : element loaded before.\n"); exit(1); } #endif // ------------------------------------------------------------- // --- search for the data holder // ------------------------------------------------------------- currBlock->elemStiffMat_[index] = new double[eMatDim*eMatDim]; for ( j = 0; j < eMatDim*eMatDim; j++ ) currBlock->elemStiffMat_[index][j] = elemMat[j]; return 1; } //************************************************************************* // load element nullspace //------------------------------------------------------------------------- int MLI_FEData::loadElemNullSpace(int eGlobalID, int numNS, int eMatDim, const double *nSpace) { int i, nElems, index; MLI_ElemBlock *currBlock; // ------------------------------------------------------------- // --- error checking // ------------------------------------------------------------- currBlock = elemBlockList_[currentElemBlock_]; #ifdef MLI_DEBUG_DETAILED if ( ! currBlock->intComplete_ ) { printf("loadElemNullSpace ERROR : initialization not complete.\n"); exit(1); } #endif // ------------------------------------------------------------- // --- allocate storage // ------------------------------------------------------------- nElems = currBlock->numLocalElems_; if ( currBlock->elemNullSpace_ == NULL || currBlock->elemNumNS_ == NULL ) { currBlock->elemNullSpace_ = new double*[nElems]; currBlock->elemNumNS_ = new int[nElems]; for ( i = 0; i < nElems; i++ ) { currBlock->elemNullSpace_[i] = NULL; currBlock->elemNumNS_[i] = 0; } } // ------------------------------------------------------------- // --- search for the data holder // ------------------------------------------------------------- index = searchElement( eGlobalID ); #ifdef MLI_DEBUG_DETAILED if ( index < 0 ) { printf("loadElemNullSpace ERROR : invalid elementID %d\n",eGlobalID); exit(1); } #endif index = searchElement( eGlobalID ); #ifdef MLI_DEBUG_DETAILED if ( index < 0 ) { printf("loadElemNullSpace ERROR : invalid element %d\n",elemGlobalID); exit(1); } if ( currBlock->elemNullSpace_[index] != NULL ) { printf("loadElemNullSpace ERROR : NullSpace already initialized.\n"); exit(1); } #endif currBlock->elemNumNS_[index] = numNS; currBlock->elemNullSpace_[index] = new double[numNS*eMatDim]; for ( i = 0; i < numNS*eMatDim; i++ ) currBlock->elemNullSpace_[index][i] = nSpace[i]; return 1; } //************************************************************************* // load element load (right hand side) //------------------------------------------------------------------------- int MLI_FEData::loadElemLoad(int eGlobalID, int eMatDim, const double *elemLoad) { int i, nElems, index; MLI_ElemBlock *currBlock; // ------------------------------------------------------------- // --- error checking // ------------------------------------------------------------- currBlock = elemBlockList_[currentElemBlock_]; #ifdef MLI_DEBUG_DETAILED if ( ! currBlock->intComplete_ ) { printf("loadElemLoad ERROR : initialization not complete.\n"); exit(1); } #endif // ------------------------------------------------------------- // --- allocate storage // ------------------------------------------------------------- nElems = currBlock->numLocalElems_; if ( currBlock->elemLoads_ == NULL ) { currBlock->elemLoads_ = new double*[nElems]; for ( i = 0; i < nElems; i++ ) currBlock->elemLoads_[i] = NULL; } // ------------------------------------------------------------- // --- search for the data holder // ------------------------------------------------------------- index = searchElement( eGlobalID ); #ifdef MLI_DEBUG_DETAILED if ( index < 0 ) { printf("loadElemLoad ERROR : invalid elementID %d\n", eGlobalID); exit(1); } #endif // ------------------------------------------------------------- // --- load data // ------------------------------------------------------------- #ifdef MLI_DEBUG_DETAILED if ( currBlock->elemLoads_[index] != NULL ) { printf("loadElemLoad ERROR : element load already initialized.\n"); exit(1); } #endif currBlock->elemLoads_[index] = new double[eMatDim]; for ( i = 0; i < eMatDim; i++ ) currBlock->elemLoads_[index][i] = elemLoad[i]; return 1; } //************************************************************************* // load element solution //------------------------------------------------------------------------- int MLI_FEData::loadElemSolution(int eGlobalID, int eMatDim, const double *elemSol) { int i, nElems, index; MLI_ElemBlock *currBlock; // ------------------------------------------------------------- // --- error checking // ------------------------------------------------------------- currBlock = elemBlockList_[currentElemBlock_]; #ifdef MLI_DEBUG_DETAILED if ( ! currBlock->intComplete_ ) { printf("loadElemSolution ERROR : initialization not complete.\n"); exit(1); } #endif // ------------------------------------------------------------- // --- allocate storage // ------------------------------------------------------------- nElems = currBlock->numLocalElems_; if ( currBlock->elemSol_ == NULL ) { currBlock->elemSol_ = new double*[nElems]; for ( i = 0; i < nElems; i++ ) currBlock->elemSol_[i] = NULL; } // ------------------------------------------------------------- // --- search for the data holder // ------------------------------------------------------------- index = searchElement( eGlobalID ); #ifdef MLI_DEBUG_DETAILED if ( index < 0 ) { printf("loadElemSolution ERROR : invalid elementID %d\n",eGlobalID); exit(1); } #endif // ------------------------------------------------------------- // --- load data // ------------------------------------------------------------- #ifdef MLI_DEBUG_DETAILED if ( currBlock->elemSol_[index] != NULL ) { printf("loadElemSolution ERROR : element load already initialized.\n"); exit(1); } #endif currBlock->elemSol_[index] = new double[eMatDim]; for ( i = 0; i < eMatDim; i++ ) currBlock->elemSol_[index][i] = elemSol[i]; return 1; } //************************************************************************* // set node boundary condition //------------------------------------------------------------------------- int MLI_FEData::loadNodeBCs(int nNodes, const int *nodeIDs, int nodeDOF, const char * const *BCFlags, const double * const *BCVals) { int i, j, nodeDOFCheck; double *bcData; MLI_ElemBlock *currBlock; // ------------------------------------------------------------- // --- error checking // ------------------------------------------------------------- currBlock = elemBlockList_[currentElemBlock_]; if ( nNodes <= 0 ) { printf("loadNodeBCs ERROR : nNodes <= 0.\n"); exit(1); } nodeDOFCheck = 0; for ( i = 0; i < currBlock->nodeNumFields_; i++ ) nodeDOFCheck += fieldSizes_[currBlock->nodeFieldIDs_[i]]; if ( nodeDOFCheck != nodeDOF ) { printf("loadNodeBCs ERROR : node DOF not valid.\n"); exit(1); } if ( ! currBlock->initComplete_ ) { printf("loadNodeBCs ERROR : initialization not complete.\n"); exit(1); } #ifdef MLI_DEBUG_DETAILED printf("loadNodeBCs Diagnostics: segFault test.\n"); char cdata; double ddata; for (i = 0; i < nNodes; i++) { j = nodeIDs[i]; for (j = 0; j < nodeDOF; j++) cdata = BCFlags[i][j]; for (j = 0; j < nodeDOF; j++) ddata = BCVals[i][j]; } printf("loadNodeBCs Diagnostics: passed the segFault test.\n"); #endif // ------------------------------------------------------------- // --- allocate storage space // ------------------------------------------------------------- if ( currBlock->nodeNumBCs_ == 0 ) { currBlock->nodeNumBCs_ = nNodes; currBlock->nodeBCIDList_ = new int[nNodes]; currBlock->nodeBCFlagList_ = new char*[nNodes]; currBlock->nodeBCValues_ = new double*[nNodes]; for ( i = 0; i < nNodes; i++ ) { currBlock->nodeBCFlagList_[i] = new char[nodeDOF]; currBlock->nodeBCValues_[i] = new double[nodeDOF]; } } // ------------------------------------------------------------- // --- load boundary information // ------------------------------------------------------------- for ( i = 0; i < nNodes; i++ ) { currBlock->nodeBCIDList_[i] = nodeIDs[i]; bcData = currBlock->nodeBCValues_[i]; for ( j = 0; j < nodeDOF; j++ ) { bcData[j] = BCVals[i][j]; currBlock->nodeBCFlagList_[i][j] = BCFlags[i][j]; } } return 1; } //************************************************************************* // get dimension of physical problem //------------------------------------------------------------------------- int MLI_FEData::getSpaceDimension(int& numDim) { numDim = spaceDimension_; return 1; } //************************************************************************* // get order of PDE //------------------------------------------------------------------------- int MLI_FEData::getOrderOfPDE(int& order) { order = orderOfPDE_; return 1; } //************************************************************************* // get order of FE //------------------------------------------------------------------------- int MLI_FEData::getOrderOfFE(int& order) { order = orderOfFE_; return 1; } //************************************************************************* // get field size //------------------------------------------------------------------------- int MLI_FEData::getFieldSize(int fieldID, int& fieldSize) { fieldSize = 0; for ( int i = 0; i < numFields_; i++ ) if ( fieldIDs_[i] == fieldID ) fieldSize = fieldSizes_[i]; if ( fieldSize > 0 ) return 1; else return 0; } //************************************************************************* // get number of local elements //------------------------------------------------------------------------- int MLI_FEData::getNumElements(int& nelems) { MLI_ElemBlock *currBlock = elemBlockList_[currentElemBlock_]; nelems = currBlock->numLocalElems_; return 1; } //************************************************************************* // get element's number of fields //------------------------------------------------------------------------- int MLI_FEData::getElemNumFields(int& numFields) { MLI_ElemBlock *currBlock = elemBlockList_[currentElemBlock_]; numFields = currBlock->elemNumFields_; return 1; } //************************************************************************* // get element's field IDs //------------------------------------------------------------------------- int MLI_FEData::getElemFieldIDs(int numFields, int *fieldIDs) { #ifdef MLI_DEBUG_DETAILED printf("getElemFieldIDs Diagnostics: segFault test.\n"); for (int i = 0; i < numFields; i++) fieldIDs[i] = 0; printf("getElemFieldIDs Diagnostics: passed the segFault test.\n"); #endif MLI_ElemBlock *currBlock = elemBlockList_[currentElemBlock_]; for ( int j = 0; j < numFields; j++ ) fieldIDs[j] = currBlock->elemFieldIDs_[j]; return 1; } //************************************************************************* // get an element globalID //------------------------------------------------------------------------- int MLI_FEData::getElemGlobalID(int localID, int &globalID) { // ------------------------------------------------------------- // --- error checking // ------------------------------------------------------------- MLI_ElemBlock *currBlock = elemBlockList_[currentElemBlock_]; #ifdef MLI_DEBUG_DETAILED if ( ! currBlock->initComplete_ ) { printf("getElemGlobalID ERROR : initialization not complete.\n"); exit(1); } if ( currBlock->numLocalElems_ < localID ) { printf("getElemGlobalID ERROR : invalid local ID.\n"); exit(1); } #endif globalID = currBlock->elemGlobalIDs_[localID]; return 1; } //************************************************************************* // get all element globalIDs //------------------------------------------------------------------------- int MLI_FEData::getElemBlockGlobalIDs(int nElems, int *eGlobalIDs) { // ------------------------------------------------------------- // --- error checking // ------------------------------------------------------------- MLI_ElemBlock *currBlock = elemBlockList_[currentElemBlock_]; if ( ! currBlock->initComplete_ ) { printf("getElemGlobalID ERROR : initialization not complete.\n"); exit(1); } if ( currBlock->numLocalElems_ != nElems ) { printf("getElemBlockGlobalIDs ERROR : nElems mismatch.\n"); exit(1); } #ifdef MLI_DEBUG_DETAILED printf("getElemBlockGlobalIDs Diagnostics: segFault test.\n"); for (int i = 0; i < nElems; i++) eGlobalIDs[i] = 0; printf("getElemBlockGlobalIDs Diagnostics: passed the segFault test.\n"); #endif for ( int j = 0; j < nElems; j++ ) eGlobalIDs[j] = currBlock->elemGlobalIDs_[j]; return 1; } //************************************************************************* // get element number of nodes //------------------------------------------------------------------------- int MLI_FEData::getElemNumNodes(int& nNodes) { MLI_ElemBlock *currBlock = elemBlockList_[currentElemBlock_]; nNodes = currBlock->elemNumNodes_; return 1; } //************************************************************************* // get element block nodelists //------------------------------------------------------------------------- int MLI_FEData::getElemBlockNodeLists(int nElems, int nNodes, int **nodeList) { int i, j; // ------------------------------------------------------------- // --- error checking // ------------------------------------------------------------- MLI_ElemBlock *currBlock = elemBlockList_[currentElemBlock_]; if ( currBlock->initComplete_ != 1 ) { printf("getElemBlockNodeLists ERROR : not initialized.\n"); exit(1); } if ( currBlock->numLocalElems_ != nElems ) { printf("getElemBlockNodeLists ERROR : nElems do not match.\n"); exit(1); } if ( currBlock->elemNumNodes_ != nNodes ) { printf("getElemBlockNodeLists ERROR : elemNumNodes do not match.\n"); exit(1); } #ifdef MLI_DEBUG_DETAILED printf("getElemBlockNodeLists Diagnostics: segFault test.\n"); for (i = 0; i < nElems; i++) for (j = 0; j < nNodes; j++) nodeList[i][j] = 0; printf("getElemBlockNodeLists Diagnostics: passed the segFault test.\n"); #endif // ------------------------------------------------------------- // --- get nodelists // ------------------------------------------------------------- for ( i = 0; i < nElems; i++ ) { for ( j = 0; j < nNodes; j++ ) nodeList[i][j] = currBlock->elemNodeIDList_[i][j]; } return 1; } //************************************************************************* // get element matrices' dimension //------------------------------------------------------------------------- int MLI_FEData::getElemMatrixDim(int& matDim) { MLI_ElemBlock *currBlock = elemBlockList_[currentElemBlock_]; matDim = currBlock->elemStiffDim_; return 1; } //************************************************************************* // get all element stiffness matrices //------------------------------------------------------------------------- int MLI_FEData::getElemBlockMatrices(int nElems,int eMatDim,double **elemMat) { int i, j; double *outMat, *stiffMat; // ------------------------------------------------------------- // --- error checking // ------------------------------------------------------------- MLI_ElemBlock *currBlock = elemBlockList_[currentElemBlock_]; if ( currBlock->initComplete_ != 1 ) { printf("getElemBlockMatrices ERROR : not initialized.\n"); exit(1); } if ( currBlock->numLocalElems_ != nElems ) { printf("getElemBlockMatrices ERROR : nElems do not match.\n"); exit(1); } if ( currBlock->elemStiffDim_ != eMatDim ) { printf("getElemBlockMatrices ERROR : matrix dimension do not match.\n"); exit(1); } #ifdef MLI_DEBUG_DETAILED printf("getElemBlockMatrices Diagnostics: segFault test.\n"); for (i = 0; i < nElems; i++) for (j = 0; j < eMatDim*eMatDim; j++) elemMat[i][j] = 0.0; printf("getElemBlockMatrices Diagnostics: passed the segFault test.\n"); #endif // ------------------------------------------------------------- // --- get element matrices // ------------------------------------------------------------- for ( i = 0; i < nElems; i++ ) { if ( currBlock->elemStiffMat_[i] == NULL ) { printf("getElemBlockMatrices ERROR : elemMat not initialized.\n"); exit(1); } outMat = elemMat[i]; stiffMat = currBlock->elemStiffMat_[i]; for ( j = 0; j < eMatDim*eMatDim; j++ ) outMat[j] = stiffMat[j]; } return 1; } //************************************************************************* // get all element nullspace sizes //------------------------------------------------------------------------- int MLI_FEData::getElemBlockNullSpaceSizes(int nElems, int *dimNS) { int i; // ------------------------------------------------------------- // --- error checking // ------------------------------------------------------------- MLI_ElemBlock *currBlock = elemBlockList_[currentElemBlock_]; if ( currBlock->initComplete_ != 1 ) { printf("getElemBlockNullSpaceSizes ERROR : not initialized.\n"); exit(1); } if ( currBlock->numLocalElems_ != nElems ) { printf("getElemBlockNullSpaceSizes ERROR : nElems do not match.\n"); exit(1); } #ifdef MLI_DEBUG_DETAILED printf("getElemBlockNullSpaceSizes Diagnostics: segFault test.\n"); for (i = 0; i < nElems; i++) dimNS[i] = 0; printf("getElemBlockNullSpaceSizes Diagnostics: passed segFault test.\n"); #endif // ------------------------------------------------------------- // --- load nullspace sizes // ------------------------------------------------------------- if ( currBlock->elemNumNS_ == NULL ) for ( i = 0; i < nElems; i++ ) dimNS[i] = 0; else for ( i = 0; i < nElems; i++ ) dimNS[i] = currBlock->elemNumNS_[i]; return 1; } //************************************************************************* // get all element nullspaces //------------------------------------------------------------------------- int MLI_FEData::getElemBlockNullSpaces(int nElems, const int *dimNS, int eMatDim, double **nullSpaces) { int i,j; // ------------------------------------------------------------- // --- error checking // ------------------------------------------------------------- MLI_ElemBlock *currBlock = elemBlockList_[currentElemBlock_]; if ( currBlock->initComplete_ != 1 ) { printf("getElemBlockNullSpaces ERROR : not initialized.\n"); exit(1); } if ( currBlock->numLocalElems_ != nElems ) { printf("getElemBlockNullSpaces ERROR : nElems do not match.\n"); exit(1); } if ( currBlock->elemStiffDim_ == eMatDim ) { printf("getElemBlockNullSpaces ERROR : eMatDim do not match.\n"); exit(1); } if ( currBlock->elemNumNS_ == NULL ) { printf("getElemBlockNullSpaces ERROR : no null space information.\n"); exit(1); } #ifdef MLI_DEBUG_DETAILED printf("getElemBlockNullSpaces Diagnostics: segFault test.\n"); for (i = 0; i < nElems; i++) for (j = 0; j < dimNS[i]*eMatDim; j++) nullSpaces[i][j] = 0.0; printf("getElemBlockNullSpaces Diagnostics: passed segFault test.\n"); #endif // ------------------------------------------------------------- // --- load nullspace sizes // ------------------------------------------------------------- for ( i = 0; i < nElems; i++ ) { if ( dimNS[i] != currBlock->elemNumNS_[i] ) { printf("getElemBlockNullSpaces ERROR : dimension do not match.\n"); exit(1); } for ( j = 0; j < eMatDim*dimNS[i]; j++ ) nullSpaces[i][j] = currBlock->elemNullSpace_[i][j]; } return 1; } //************************************************************************* // get all element volumes //------------------------------------------------------------------------- int MLI_FEData::getElemBlockVolumes(int nElems, double *elemVols) { // ------------------------------------------------------------- // --- error checking // ------------------------------------------------------------- MLI_ElemBlock *currBlock = elemBlockList_[currentElemBlock_]; if ( currBlock->initComplete_ != 1 ) { printf("getElemBlockVolumes ERROR : not initialized.\n"); exit(1); } if ( currBlock->numLocalElems_ != nElems ) { printf("getElemBlockVolumes ERROR : nElems do not match.\n"); exit(1); } if ( currBlock->elemVolume_ == NULL ) { printf("getElemBlockVolumes ERROR : no volumes available.\n"); exit(1); } // ------------------------------------------------------------- // --- load element volumes // ------------------------------------------------------------- for ( int i = 0; i < nElems; i++ ) elemVols[i] = currBlock->elemVolume_[i]; return 1; } //************************************************************************* // get all element materials //------------------------------------------------------------------------- int MLI_FEData::getElemBlockMaterials(int nElems, int *elemMats) { // ------------------------------------------------------------- // --- error checking // ------------------------------------------------------------- MLI_ElemBlock *currBlock = elemBlockList_[currentElemBlock_]; if ( currBlock->initComplete_ != 1 ) { printf("getElemBlockMaterials ERROR : not initialized.\n"); exit(1); } if ( currBlock->numLocalElems_ != nElems ) { printf("getElemBlockMaterials ERROR : nElems do not match.\n"); exit(1); } if ( currBlock->elemMaterial_ == NULL ) { printf("getElemBlockMaterials ERROR : no material available.\n"); exit(1); } // ------------------------------------------------------------- // --- load element materials // ------------------------------------------------------------- for (int i = 0; i < nElems; i++) elemMats[i] = currBlock->elemMaterial_[i]; return 1; } //************************************************************************* // get all element parent IDs //------------------------------------------------------------------------- int MLI_FEData::getElemBlockParentIDs(int nElems, int *parentIDs) { // ------------------------------------------------------------- // --- error checking // ------------------------------------------------------------- MLI_ElemBlock *currBlock = elemBlockList_[currentElemBlock_]; if ( currBlock->initComplete_ != 1 ) { printf("getElemBlockParentIDs ERROR : not initialized.\n"); exit(1); } if ( currBlock->numLocalElems_ != nElems ) { printf("getElemBlockParentIDs ERROR : nElems do not match.\n"); exit(1); } if ( currBlock->elemParentIDs_ == NULL ) { printf("getElemBlockParentIDs ERROR : no parent ID available.\n"); exit(1); } // ------------------------------------------------------------- // --- load element parent IDs // ------------------------------------------------------------- for (int i = 0; i < nElems; i++) parentIDs[i] = currBlock->elemParentIDs_[i]; return 1; } //************************************************************************* // get element number of faces //------------------------------------------------------------------------- int MLI_FEData::getElemNumFaces(int& nFaces) { MLI_ElemBlock *currBlock = elemBlockList_[currentElemBlock_]; nFaces = currBlock->elemNumFaces_; return 1; } //************************************************************************* // get all element face lists //------------------------------------------------------------------------- int MLI_FEData::getElemBlockFaceLists(int nElems, int nFaces, int **faceList) { // ------------------------------------------------------------- // --- error checking // ------------------------------------------------------------- MLI_ElemBlock *currBlock = elemBlockList_[currentElemBlock_]; if ( currBlock->initComplete_ != 1 ) { printf("getElemBlockFaceLists ERROR : not initialized.\n"); exit(1); } if ( currBlock->numLocalElems_ != nElems ) { printf("getElemBlockFaceLists ERROR : nElems do not match.\n"); exit(1); } if ( currBlock->elemNumFaces_ != nFaces ) { printf("getElemBlockFaceLists ERROR : elemNumFaces do not match.\n"); exit(1); } // ------------------------------------------------------------- // --- get face lists // ------------------------------------------------------------- for ( int i = 0; i < nElems; i++ ) { for ( int j = 0; j < nFaces; j++ ) faceList[i][j] = currBlock->elemFaceIDList_[i][j]; } return 1; } //************************************************************************* // get element node list given an element global ID //------------------------------------------------------------------------- int MLI_FEData::getElemNodeList(int eGlobalID, int nNodes, int *nodeList) { // ------------------------------------------------------------- // --- error checking // ------------------------------------------------------------- MLI_ElemBlock *currBlock = elemBlockList_[currentElemBlock_]; if ( currBlock->initComplete_ != 1 ) { printf("getElemNodeList ERROR : not initialized.\n"); exit(1); } if ( currBlock->elemNumNodes_ != nNodes ) { printf("getElemNodeList ERROR : elemNumNodes do not match.\n"); exit(1); } // ------------------------------------------------------------- // --- get node list // ------------------------------------------------------------- int index = searchElement(eGlobalID); if ( index < 0 ) { printf("getElemNodeList ERROR : element not found.\n"); exit(1); } for ( int i = 0; i < nNodes; i++ ) nodeList[i] = currBlock->elemNodeIDList_[index][i]; return 1; } //************************************************************************* // get an element matrix //------------------------------------------------------------------------- int MLI_FEData::getElemMatrix(int eGlobalID, int eMatDim, double *elemMat) { // ------------------------------------------------------------- // --- error checking // ------------------------------------------------------------- MLI_ElemBlock *currBlock = elemBlockList_[currentElemBlock_]; if ( currBlock->initComplete_ != 1 ) { printf("getElemMatrix ERROR : not initialized.\n"); exit(1); } if ( currBlock->elemStiffDim_ != eMatDim ) { printf("getElemMatrix ERROR : matrix dimension do not match.\n"); exit(1); } // ------------------------------------------------------------- // --- load element matrix // ------------------------------------------------------------- int index = searchElement(eGlobalID); if ( index < 0 ) { printf("getElemMatrix ERROR : element not found.\n"); exit(1); } if ( currBlock->elemStiffMat_[index] == NULL ) { printf("getElemBlockMatrix ERROR : elemMat not initialized.\n"); exit(1); } double *stiffMat = currBlock->elemStiffMat_[index]; for ( int i = 0; i < eMatDim*eMatDim; i++ ) elemMat[i] = stiffMat[i]; return 1; } //************************************************************************* // get an element nullspace size //------------------------------------------------------------------------- int MLI_FEData::getElemNullSpaceSize(int eGlobalID, int &dimNS) { // ------------------------------------------------------------- // --- error checking // ------------------------------------------------------------- MLI_ElemBlock *currBlock = elemBlockList_[currentElemBlock_]; if ( currBlock->initComplete_ != 1 ) { printf("getElemNullSpaceSize ERROR : not initialized.\n"); exit(1); } // ------------------------------------------------------------- // --- load nullspace size // ------------------------------------------------------------- int index = searchElement(eGlobalID); if ( index < 0 ) { printf("getElemNullSpaceSize ERROR : element not found.\n"); exit(1); } if ( currBlock->elemNumNS_ == NULL ) dimNS = 0; else dimNS = currBlock->elemNumNS_[index]; return 1; } //************************************************************************* // get an element nullspace //------------------------------------------------------------------------- int MLI_FEData::getElemNullSpace(int eGlobalID, int dimNS, int eMatDim, double *nullSpaces) { // ------------------------------------------------------------- // --- error checking // ------------------------------------------------------------- MLI_ElemBlock *currBlock = elemBlockList_[currentElemBlock_]; if ( currBlock->initComplete_ != 1 ) { printf("getElemNullSpace ERROR : not initialized.\n"); exit(1); } if ( currBlock->elemStiffDim_ == eMatDim ) { printf("getElemNullSpace ERROR : eMatDim do not match.\n"); exit(1); } if ( currBlock->elemNumNS_ == NULL ) { printf("getElemNullSpace ERROR : no null space information.\n"); exit(1); } // ------------------------------------------------------------- // --- load nullspace sizes // ------------------------------------------------------------- int index = searchElement(eGlobalID); if ( index < 0 ) { printf("getElemNullSpace ERROR : element not found.\n"); exit(1); } for ( int i = 0; i < eMatDim*dimNS; i++ ) nullSpaces[i] = currBlock->elemNullSpace_[index][i]; return 1; } //************************************************************************* // get an element volume //------------------------------------------------------------------------- int MLI_FEData::getElemVolume(int eGlobalID, double &elemVol) { // ------------------------------------------------------------- // --- error checking // ------------------------------------------------------------- MLI_ElemBlock *currBlock = elemBlockList_[currentElemBlock_]; if ( currBlock->initComplete_ != 1 ) { printf("getElemVolume ERROR : not initialized.\n"); exit(1); } if ( currBlock->elemVolume_ == NULL ) { printf("getElemVolumes ERROR : no volumes available.\n"); exit(1); } // ------------------------------------------------------------- // --- load element volumes // ------------------------------------------------------------- int index = searchElement(eGlobalID); if ( index < 0 ) { printf("getElemVolume ERROR : element not found.\n"); exit(1); } elemVol = currBlock->elemVolume_[index]; return 1; } //************************************************************************* // get an element material //------------------------------------------------------------------------- int MLI_FEData::getElemMaterial(int eGlobalID, int &elemMat) { // ------------------------------------------------------------- // --- error checking // ------------------------------------------------------------- MLI_ElemBlock *currBlock = elemBlockList_[currentElemBlock_]; if ( currBlock->initComplete_ != 1 ) { printf("getElemMaterial ERROR : not initialized.\n"); exit(1); } if ( currBlock->elemMaterial_ == NULL ) { printf("getElemMaterial ERROR : no material available.\n"); exit(1); } // ------------------------------------------------------------- // --- load element material // ------------------------------------------------------------- int index = searchElement(eGlobalID); if ( index < 0 ) { printf("getElemMaterial ERROR : element not found.\n"); exit(1); } elemMat = currBlock->elemMaterial_[index]; return 1; } //************************************************************************* // get all element parent IDs //------------------------------------------------------------------------- int MLI_FEData::getElemParentID(int eGlobalID, int &parentID) { // ------------------------------------------------------------- // --- error checking // ------------------------------------------------------------- MLI_ElemBlock *currBlock = elemBlockList_[currentElemBlock_]; if ( currBlock->initComplete_ != 1 ) { printf("getElemParentID ERROR : not initialized.\n"); exit(1); } if ( currBlock->elemParentIDs_ == NULL ) { printf("getElemParentID ERROR : no parent ID available.\n"); exit(1); } // ------------------------------------------------------------- // --- load element parent IDs // ------------------------------------------------------------- int index = searchElement(eGlobalID); if ( index < 0 ) { printf("getElemParentId ERROR : element not found.\n"); exit(1); } parentID = currBlock->elemParentIDs_[index]; return 1; } //************************************************************************* // get an element's face list //------------------------------------------------------------------------- int MLI_FEData::getElemFaceList(int eGlobalID, int nFaces, int *faceList) { // ------------------------------------------------------------- // --- error checking // ------------------------------------------------------------- MLI_ElemBlock *currBlock = elemBlockList_[currentElemBlock_]; if ( currBlock->initComplete_ != 1 ) { printf("getElemFaceList ERROR : not initialized.\n"); exit(1); } if ( currBlock->elemNumFaces_ != nFaces ) { printf("getElemFaceList ERROR : elemNumFaces do not match.\n"); exit(1); } // ------------------------------------------------------------- // --- get face list // ------------------------------------------------------------- int index = searchElement(eGlobalID); if ( index < 0 ) { printf("getElemFaceList ERROR : element not found.\n"); exit(1); } for ( int i = 0; i < nFaces; i++ ) faceList[i] = currBlock->elemFaceIDList_[index][i]; return 1; } //************************************************************************* // get number of boundary elements //------------------------------------------------------------------------- int MLI_FEData::getNumBCElems(int& nElems) { MLI_ElemBlock *currBlock = elemBlockList_[currentElemBlock_]; nElems = currBlock->elemNumBCs_; return 1; } //************************************************************************* // get number of boundary elements //------------------------------------------------------------------------- int MLI_FEData::getElemBCs(int nElems, int *eGlobalIDs, int eDOFs, char **fieldFlag, double **BCVals) { // ------------------------------------------------------------- // --- error checking // ------------------------------------------------------------- MLI_ElemBlock *currBlock = elemBlockList_[currentElemBlock_]; if ( ! currBlock->initComplete_ ) { printf("getElemBCs ERROR : initialization not complete.\n"); exit(1); } if ( currBlock->elemNumBCs_ != nElems ) { printf("getElemBCs ERROR : nElems mismatch.\n"); exit(1); } if ( eDOFs != currBlock->elemDOF_ ) { printf("getElemBCs ERROR : element DOF mismatch.\n"); exit(1); } // ------------------------------------------------------------- // --- load information // ------------------------------------------------------------- for ( int i = 0; i < nElems; i++ ) { eGlobalIDs[i] = currBlock->elemBCIDList_[i]; for ( int j = 0; j < eDOFs; j++ ) { fieldFlag[i][j] = currBlock->elemBCFlagList_[i][j]; BCVals[i][j] = currBlock->elemBCValues_[i][j]; } } return 1; } //************************************************************************* // get number of total nodes (local + external) //------------------------------------------------------------------------- int MLI_FEData::getNumNodes(int& nNodes) { MLI_ElemBlock *currBlock = elemBlockList_[currentElemBlock_]; nNodes = currBlock->numLocalNodes_ + currBlock->numExternalNodes_; return 1; } //************************************************************************* // get all node globalIDs //------------------------------------------------------------------------- int MLI_FEData::getNodeBlockGlobalIDs(int nNodes, int *nGlobalIDs) { // ------------------------------------------------------------- // --- error checking // ------------------------------------------------------------- MLI_ElemBlock *currBlock = elemBlockList_[currentElemBlock_]; if ( ! currBlock->initComplete_ ) { printf("getNodeBlockGlobalIDs ERROR : initialization not complete.\n"); exit(1); } if ( (currBlock->numLocalNodes_+currBlock->numExternalNodes_) != nNodes ) { printf("getNodeBlockGlobalIDs ERROR : nNodes mismatch.\n"); exit(1); } // ------------------------------------------------------------- // --- get nodal global IDs // ------------------------------------------------------------- for (int i = 0; i < nNodes; i++) nGlobalIDs[i] = currBlock->nodeGlobalIDs_[i]; return 1; } //************************************************************************* // get node's number of fields //------------------------------------------------------------------------- int MLI_FEData::getNodeNumFields(int &numFields) { MLI_ElemBlock *currBlock = elemBlockList_[currentElemBlock_]; numFields = currBlock->nodeNumFields_; return 1; } //************************************************************************* // get node's field IDs //------------------------------------------------------------------------- int MLI_FEData::getNodeFieldIDs(int numFields, int *fieldIDs) { MLI_ElemBlock *currBlock = elemBlockList_[currentElemBlock_]; for ( int i = 0; i < numFields; i++ ) fieldIDs[i] = currBlock->nodeFieldIDs_[i]; return 1; } //************************************************************************* // get all node coordinates //------------------------------------------------------------------------- int MLI_FEData::getNodeBlockCoordinates(int nNodes, int spaceDim, double *coordinates) { // ------------------------------------------------------------- // --- error checking // ------------------------------------------------------------- MLI_ElemBlock *currBlock = elemBlockList_[currentElemBlock_]; if ( ! currBlock->initComplete_ ) { printf("getNodeBlockCoordinates ERROR : initialization not complete.\n"); exit(1); } if ( (currBlock->numLocalNodes_+currBlock->numExternalNodes_) != nNodes ) { printf("getNodeBlockCoordinates ERROR : nNodes mismatch.\n"); exit(1); } if ( spaceDimension_ != spaceDim ) { printf("getNodeBlockCoordinates ERROR : space dimension mismatch.\n"); exit(1); } // ------------------------------------------------------------- // --- get nodal coordinates // ------------------------------------------------------------- for (int i = 0; i < nNodes*spaceDim; i++) coordinates[i] = currBlock->nodeCoordinates_[i]; return 1; } //************************************************************************* // get number of boundary nodes //------------------------------------------------------------------------- int MLI_FEData::getNumBCNodes(int& nNodes) { MLI_ElemBlock *currBlock = elemBlockList_[currentElemBlock_]; nNodes = currBlock->nodeNumBCs_; return 1; } //************************************************************************* // get number of boundary nodes //------------------------------------------------------------------------- int MLI_FEData::getNodeBCs(int nNodes, int *nGlobalIDs, int nDOFs, char **fieldFlag, double **BCVals) { // ------------------------------------------------------------- // --- error checking // ------------------------------------------------------------- MLI_ElemBlock *currBlock = elemBlockList_[currentElemBlock_]; if ( ! currBlock->initComplete_ ) { printf("getNodeBCs ERROR : initialization not complete.\n"); exit(1); } if ( currBlock->nodeNumBCs_ != nNodes ) { printf("getNodeBCs ERROR : nNodes mismatch.\n"); exit(1); } if ( nDOFs != currBlock->nodeDOF_ ) { printf("getNodeBCs ERROR : nodal DOF mismatch.\n"); exit(1); } // ------------------------------------------------------------- // --- load information // ------------------------------------------------------------- for ( int i = 0; i < nNodes; i++ ) { nGlobalIDs[i] = currBlock->nodeBCIDList_[i]; for ( int j = 0; j < nDOFs; j++ ) { fieldFlag[i][j] = currBlock->nodeBCFlagList_[i][j]; BCVals[i][j] = currBlock->nodeBCValues_[i][j]; } } return 1; } //************************************************************************* // get number of shared nodes //------------------------------------------------------------------------- int MLI_FEData::getNumSharedNodes(int& nNodes) { MLI_ElemBlock *currBlock = elemBlockList_[currentElemBlock_]; nNodes = currBlock->numSharedNodes_; return 1; } //************************************************************************* // get shared nodes number of processor information //------------------------------------------------------------------------- int MLI_FEData::getSharedNodeNumProcs(int nNodes, int *nGlobalIDs, int *numProcs) { // ------------------------------------------------------------- // --- error checking // ------------------------------------------------------------- MLI_ElemBlock *currBlock = elemBlockList_[currentElemBlock_]; if ( ! currBlock->initComplete_ ) { printf("getSharedNodeNumProcs ERROR : initialization not complete.\n"); exit(1); } if ( currBlock->numSharedNodes_ != nNodes ) { printf("getSharedNodeNumProcs ERROR : nNodes mismatch.\n"); exit(1); } // ------------------------------------------------------------- // --- get information // ------------------------------------------------------------- for ( int i = 0; i < nNodes; i++ ) { nGlobalIDs[i] = currBlock->sharedNodeIDs_[i]; numProcs[i] = currBlock->sharedNodeNProcs_[i]; } return 1; } //************************************************************************* // get shared nodes processor lists //------------------------------------------------------------------------- int MLI_FEData::getSharedNodeProcs(int nNodes, int *numProcs, int **procLists) { // ------------------------------------------------------------- // --- error checking // ------------------------------------------------------------- MLI_ElemBlock *currBlock = elemBlockList_[currentElemBlock_]; if ( ! currBlock->initComplete_ ) { printf("getSharedNodeProcs ERROR : initialization not complete.\n"); exit(1); } if ( currBlock->numSharedNodes_ != nNodes ) { printf("getSharedNodeProcs ERROR : nNodes mismatch.\n"); exit(1); } // ------------------------------------------------------------- // --- get information // ------------------------------------------------------------- for ( int i = 0; i < nNodes; i++ ) { if ( numProcs[i] != currBlock->sharedNodeNProcs_[i] ) { printf("NumSharedNodeProcs ERROR : numProcs mismatch.\n"); exit(1); } for ( int j = 0; j < numProcs[i]; j++ ) procLists[i][j] = currBlock->sharedNodeProc_[i][j]; } return 1; } //************************************************************************* // get number of faces //------------------------------------------------------------------------- int MLI_FEData::getNumFaces(int &nFaces) { MLI_ElemBlock *currBlock = elemBlockList_[currentElemBlock_]; if ( ! currBlock->initComplete_ ) { printf("getNumFaces ERROR : initialization not complete.\n"); exit(1); } nFaces = currBlock->numLocalFaces_ + currBlock->numExternalFaces_; return 1; } //************************************************************************* // get all face globalIDs //------------------------------------------------------------------------- int MLI_FEData::getFaceBlockGlobalIDs(int nFaces, int *fGlobalIDs) { MLI_ElemBlock *currBlock = elemBlockList_[currentElemBlock_]; if ( ! currBlock->initComplete_ ) { printf("getFaceBlockGlobalIDs ERROR : initialization not complete.\n"); exit(1); } if ( (currBlock->numLocalFaces_+currBlock->numExternalFaces_) != nFaces ) { printf("getFaceBlockGlobalIDs ERROR : nFaces mismatch.\n"); exit(1); } for ( int i = 0; i < nFaces; i++ ) fGlobalIDs[i] = currBlock->faceGlobalIDs_[i]; return 1; } //************************************************************************* // get number of shared faces //------------------------------------------------------------------------- int MLI_FEData::getNumSharedFaces(int &nFaces) { MLI_ElemBlock *currBlock = elemBlockList_[currentElemBlock_]; if ( ! currBlock->initComplete_ ) { printf("getNumSharedFaces ERROR : initialization not complete.\n"); exit(1); } nFaces = currBlock->numSharedFaces_; return 1; } //************************************************************************* // get shared faces number of processor information //------------------------------------------------------------------------- int MLI_FEData::getSharedFaceNumProcs(int nFaces, int *fGlobalIDs, int *numProcs) { // ------------------------------------------------------------- // --- error checking // ------------------------------------------------------------- MLI_ElemBlock *currBlock = elemBlockList_[currentElemBlock_]; if ( ! currBlock->initComplete_ ) { printf("getSharedFaceNumProcs ERROR : initialization not complete.\n"); exit(1); } if ( currBlock->numSharedFaces_ != nFaces ) { printf("getSharedFaceNumProcs ERROR : nFaces mismatch.\n"); exit(1); } // ------------------------------------------------------------- // --- get information // ------------------------------------------------------------- for ( int i = 0; i < nFaces; i++ ) { fGlobalIDs[i] = currBlock->sharedFaceIDs_[i]; numProcs[i] = currBlock->sharedFaceNProcs_[i]; } return 1; } //************************************************************************* // get shared face processor lists //------------------------------------------------------------------------- int MLI_FEData::getSharedFaceProcs(int nFaces, int *numProcs, int **procLists) { // ------------------------------------------------------------- // --- error checking // ------------------------------------------------------------- MLI_ElemBlock *currBlock = elemBlockList_[currentElemBlock_]; if ( ! currBlock->initComplete_ ) { printf("getSharedFaceProcs ERROR : initialization not complete.\n"); exit(1); } if ( currBlock->numSharedFaces_ != nFaces ) { printf("getSharedFaceProcs ERROR : nFaces mismatch.\n"); exit(1); } // ------------------------------------------------------------- // --- get information // ------------------------------------------------------------- for ( int i = 0; i < nFaces; i++ ) { if ( numProcs[i] != currBlock->sharedFaceNProcs_[i] ) { printf("NumSharedFaceProcs ERROR : numProcs mismatch.\n"); exit(1); } for ( int j = 0; j < numProcs[i]; j++ ) procLists[i][j] = currBlock->sharedFaceProc_[i][j]; } return 1; } //************************************************************************* // get number of nodes on a face //------------------------------------------------------------------------- int MLI_FEData::getFaceNumNodes(int &nNodes) { MLI_ElemBlock *currBlock = elemBlockList_[currentElemBlock_]; if ( ! currBlock->initComplete_ ) { printf("getFaceNumNodes ERROR : initialization not complete.\n"); exit(1); } nNodes = currBlock->faceNumNodes_; return 1; } //************************************************************************* // get block face node list //------------------------------------------------------------------------- int MLI_FEData::getFaceBlockNodeLists(int nFaces, int nNodesPerFace, int **nGlobalIDLists) { MLI_ElemBlock *currBlock = elemBlockList_[currentElemBlock_]; // ------------------------------------------------------------- // --- error checking // ------------------------------------------------------------- if ( ! currBlock->initComplete_ ) { printf("getFaceBlockNodeLists ERROR : initialization not complete.\n"); exit(1); } if ((currBlock->numLocalFaces_+currBlock->numExternalFaces_) != nFaces) { printf("getFaceBlockNodeLists ERROR : number of faces mismatch.\n"); exit(1); } if ( currBlock->faceNumNodes_ != nNodesPerFace ) { printf("getFaceBlockNodeLists ERROR : face numNodes mismatch.\n"); exit(1); } // ------------------------------------------------------------- // --- search face and get face node list // ------------------------------------------------------------- for ( int i = 0; i < nFaces; i++ ) for ( int j = 0; j < nNodesPerFace; j++ ) nGlobalIDLists[i][j] = currBlock->faceNodeIDList_[i][j]; return 1; } //************************************************************************* // get face node list //------------------------------------------------------------------------- int MLI_FEData::getFaceNodeList(int fGlobalID, int nNodes, int *nodeList) { MLI_ElemBlock *currBlock = elemBlockList_[currentElemBlock_]; // ------------------------------------------------------------- // --- error checking // ------------------------------------------------------------- if ( ! currBlock->initComplete_ ) { printf("getFaceNodeList ERROR : initialization not complete.\n"); exit(1); } if ( currBlock->faceNumNodes_ != nNodes ) { printf("getFaceNodeList ERROR : face numNodes mismatch.\n"); exit(1); } // ------------------------------------------------------------- // --- search face and get face node list // ------------------------------------------------------------- int index = searchFace( fGlobalID ); if ( index < 0 ) { printf("getFaceNodeList ERROR : face ID not found.\n"); exit(1); } for ( int i = 0; i < nNodes; i++ ) nodeList[i] = currBlock->faceNodeIDList_[index][i]; return 1; } //************************************************************************* // load in the function to calculate shape function interpolant //------------------------------------------------------------------------- int MLI_FEData::loadFunc_computeShapeFuncInterpolant(void *object, int (*func) (void*,int elemID,int nNodes,const double *coord,double *coef)) { USR_FEGridObj_ = object; USR_computeShapeFuncInterpolant = func; return 1; } //************************************************************************* // get shape function interpolant //------------------------------------------------------------------------- int MLI_FEData::getShapeFuncInterpolant(int elemID, int nNodes, const double *coord, double *coef) { USR_computeShapeFuncInterpolant(USR_FEGridObj_, elemID, nNodes, coord,coef); return 1; } //************************************************************************* // implementation specific requests //------------------------------------------------------------------------- int MLI_FEData::impSpecificRequests(char *data_key, int argc, char **argv) { int mypid, nprocs; MLI_ElemBlock *currBlock = elemBlockList_[currentElemBlock_]; // ------------------------------------------------------------- // --- error checking // ------------------------------------------------------------- if ( ! currBlock->initComplete_ ) { printf("impSpecificRequests ERROR : call initComplete first.\n"); exit(1); } // ------------------------------------------------------------- // --- output help menu // ------------------------------------------------------------- MPI_Comm_rank( mpiComm_, &mypid); MPI_Comm_size( mpiComm_, &nprocs); if ( ! strcmp("help",data_key) ) { printf("impSpecifRequests : Available requests are \n"); printf(" getElemOffset : get element processor offset \n"); printf(" argc - >= 1.\n"); printf(" argv[0] - (int *) of length 1.\n"); printf(" getNodeOffset : get node processor offset \n"); printf(" argc - >= 1.\n"); printf(" argv[0] - (int *) of length 1.\n"); printf(" getFaceOffset : get face processor offset \n"); printf(" argc - >= 1.\n"); printf(" argv[0] - (int *) of length 1.\n"); printf(" getNumExtNodes : get number of external nodes \n"); printf(" argc - >= 1.\n"); printf(" argv[0] - (int *) of length 1.\n"); printf(" getNumExtFaces : get number of external faces \n"); printf(" argc - >= 1.\n"); printf(" argv[0] - (int *) of length 1.\n"); printf(" getExtNodeNewGlobalIDs : get external nodes' mapped IDs\n"); printf(" argc - >= 1.\n"); printf(" argv[0] - (int *) of length nNnodesExt.\n"); printf(" getExtFaceNewGlobalIDs : get external faces' mapped IDs\n"); printf(" argc - >= 1.\n"); printf(" argv[0] - (int *) of length nNnodesExt.\n"); return 1; } // ------------------------------------------------------------- // --- process requests // ------------------------------------------------------------- // --- get element processor offset if ( ! strcmp("getElemOffset",data_key) ) { if ( argc < 1 ) { printf("implSpecificRequests ERROR : getElemOffset - argc < 1.\n"); exit(1); } int *offset = (int *) argv[0]; (*offset) = currBlock->elemOffset_; return 1; } // --- get node processor offset else if ( ! strcmp("getNodeOffset", data_key) ) { if ( argc < 1 ) { printf("impSpecificRequests ERROR : getNodeOffset - argc < 1.\n"); exit(1); } int *offset = (int *) argv[0]; (*offset) = currBlock->nodeOffset_; return 1; } // --- get face processor offset else if ( ! strcmp("getFaceOffset", data_key) ) { if ( argc < 1 ) { printf("impSpecificRequests ERROR : getFaceOffset - argc < 1.\n"); exit(1); } int *offset = (int *) argv[0]; (*offset) = currBlock->faceOffset_; return 1; } // --- get number of external nodes (to my processor) else if ( ! strcmp("getNumExtNodes", data_key) ) { if ( argc < 1 ) { printf("impSpecificRequests ERROR : getNumExtNodes - argc < 1.\n"); exit(1); } int *nNodesExt = (int *) argv[0]; (*nNodesExt) = currBlock->numExternalNodes_; return 1; } // --- get number of external faces (to my processor) else if ( ! strcmp("getNumExtFaces", data_key) ) { if ( argc < 1 ) { printf("impSpecificRequests ERROR : getNumExtFaces - argc < 1.\n"); exit(1); } int *nFacesExt = (int *) argv[0]; (*nFacesExt) = currBlock->numExternalFaces_; return 1; } // --- get the mapped globalIDs of external nodes else if ( ! strcmp("getExtNodeNewGlobalIDs", data_key) ) { if ( argc < 1 ) { printf("impSpecificRequests ERROR : getExtNodeNewGlobalIDs-argc<1\n"); exit(1); } int *newGlobalIDs = (int *) argv[0]; for ( int i = 0; i < currBlock->numExternalNodes_; i++ ) newGlobalIDs[i] = currBlock->nodeExtNewGlobalIDs_[i]; return 1; } // --- get the mapped globalIDs of external faces else if ( ! strcmp("getExtFaceNewGlobalIDs", data_key) ) { if ( argc < 1 ) { printf("impSpecificRequests ERROR : getExtFaceNewGlobalIDs-argc<1\n"); exit(1); } int *newGlobalIDs = (int *) argv[0]; for ( int j = 0; j < currBlock->numExternalFaces_; j++ ) newGlobalIDs[j] = currBlock->faceExtNewGlobalIDs_[j]; return 1; } // --- get the mapped globalIDs of external faces else if ( ! strcmp("destroyElemMatrix", data_key) ) { int elemNum = *(int *) argv[0]; int index = searchElement(elemNum); if ( index < 0 ) { printf("impSpecificRequests ERROR : getElemMatrix not found.\n"); exit(1); } if ( currBlock->elemStiffMat_[index] != NULL ) { delete [] currBlock->elemStiffMat_[index]; currBlock->elemStiffMat_[index] = NULL; } } // --- create node element matrix (given local nodeExt element matrix) else if ( ! strcmp("updateNodeElemMatrix",data_key) ) { int *ncols = (int *) argv[0], **cols = (int **) argv[1]; int nNodes = currBlock->numLocalNodes_; int nNodesExt = currBlock->numExternalNodes_; int *nodeList = currBlock->nodeGlobalIDs_; int *sharedNodeList = currBlock->sharedNodeIDs_; int numSharedNodes = currBlock->numSharedNodes_; int *sharedNodeNProcs = currBlock->sharedNodeNProcs_; int **sharedNodeProc = currBlock->sharedNodeProc_; int i, j, index, pnum, pSrc, *iBuf, msgID, nodeGID, ncnt; int *columns, *procList, *procTemp, nSends, *sendLengs; int *sendProcs, **sendBufs, nRecvs, *recvProcs, *recvLengs; int **recvBufs, *owner, length; MPI_Request *request; MPI_Status status; // get the owners for the external nodes MPI_Barrier(mpiComm_); if ( nNodesExt > 0 ) owner = new int[nNodesExt]; else owner = NULL; for ( i = 0; i < numSharedNodes; i++ ) { index = searchNode( sharedNodeList[i] ) - nNodes; if ( index >= 0 ) { pnum = mypid; for ( j = 0; j < sharedNodeNProcs[i]; j++ ) if ( sharedNodeProc[i][j] < pnum ) pnum = sharedNodeProc[i][j]; owner[index] = pnum; } } // find out how many distinct processor numbers and fill the // send buffer if ( nNodesExt > 0 ) procList = new int[mypid]; else procList = NULL; for ( i = 0; i < nNodesExt; i++ ) procList[i] = 0; for ( i = 0; i < nNodesExt; i++ ) procList[owner[index]] += ncols[i+nNodes] + 2; nSends = 0; for ( i = 0; i < mypid; i++ ) if ( procList[i] > 0 ) nSends++; sendLengs = NULL; sendProcs = NULL; sendBufs = NULL; if ( nSends > 0 ) { sendLengs = new int[nSends]; sendProcs = new int[nSends]; sendBufs = new int*[nSends]; nSends = 0; for ( i = 0; i < mypid; i++ ) { if ( procList[i] > 0 ) { sendLengs[nSends] = procList[i]; sendProcs[nSends] = i; sendBufs[i] = new int[sendLengs[nSends]]; sendLengs[nSends] = 0; nSends++; } } nSends = 0; for ( i = 0; i < mypid; i++ ) if ( procList[i] > 0 ) procList[i] = nSends++; for ( i = 0; i < nNodesExt; i++ ) owner[i] = procList[owner[i]]; for ( i = 0; i < nNodesExt; i++ ) { sendBufs[owner[i]][sendLengs[owner[i]]++] = nodeList[i+nNodes]; sendBufs[owner[i]][sendLengs[owner[i]]++] = ncols[i+nNodes]; for ( j = 0; j < ncols[i+nNodes]; j++ ) sendBufs[owner[i]][sendLengs[owner[i]]++] = cols[i+nNodes][j]; } } // let the receiver knows about its intent to send procList = new int[nprocs]; procTemp = new int[nprocs]; for ( i = 0; i < nprocs; i++ ) procTemp[i] = 0; for ( i = 0; i < nSends; i++ ) procTemp[sendProcs[i]] = 1; MPI_Allreduce(procTemp,procList,nprocs,MPI_INT,MPI_SUM,mpiComm_); nRecvs = procList[mypid]; delete [] procList; delete [] procTemp; recvLengs = NULL; recvProcs = NULL; recvBufs = NULL; request = NULL; if ( nRecvs > 0 ) { request = new MPI_Request[nRecvs]; recvLengs = new int[nRecvs]; pSrc = MPI_ANY_SOURCE; msgID = 33420; for ( i = 0; i < nRecvs; i++ ) MPI_Irecv(&recvLengs[i],1,MPI_INT,pSrc,msgID,mpiComm_,&request[i]); } if ( nSends > 0 ) { msgID = 33420; for ( i = 0; i < nSends; i++ ) MPI_Send(&sendLengs[i],1,MPI_INT,sendProcs[i],msgID,mpiComm_); } if ( nRecvs > 0 ) { recvProcs = new int[nRecvs]; recvBufs = new int*[nRecvs]; for ( i = 0; i < nRecvs; i++ ) { MPI_Wait( &request[i], &status ); recvProcs[i] = status.MPI_SOURCE; recvBufs[i] = new int[recvLengs[i]]; } } // now send/receive the external information if ( nRecvs > 0 ) { msgID = 33421; for ( i = 0; i < nRecvs; i++ ) { pSrc = recvProcs[i]; length = recvLengs[i]; iBuf = recvBufs[i]; MPI_Irecv(iBuf,length,MPI_INT,pSrc,msgID,mpiComm_,&request[i]); } } if ( nSends > 0 ) { msgID = 33421; for ( i = 0; i < nSends; i++ ) { pSrc = sendProcs[i]; length = sendLengs[i]; iBuf = sendBufs[i]; MPI_Send(iBuf, length, MPI_INT, pSrc, msgID, mpiComm_); } } if ( nRecvs > 0 ) { for ( i = 0; i < nRecvs; i++ ) MPI_Wait( &request[i], &status ); } // owners of shared nodes receive data for( i = 0; i < nRecvs; i++ ) { ncnt = 0; while ( ncnt < recvLengs[i] ) { nodeGID = recvBufs[i][ncnt++]; length = recvBufs[i][ncnt++]; iBuf = recvBufs[i]; index = MLI_Utils_BinarySearch(nodeGID, nodeList, nNodes); if ( index < 0 ) { printf("updateNodeElemMatrix ERROR : in communication.\n"); exit(1); } columns = new int[ncols[index]+length]; for ( j = 0; j < ncols[index]; j++ ) columns[j] = cols[index][j]; for ( j = 0; j < length; j++ ) columns[ncols[index]++] = iBuf[j+ncnt]; ncnt += length; delete [] cols[index]; cols[index] = columns; } } delete [] procList; delete [] owner; for ( i = 0; i < nSends; i++ ) delete [] sendBufs[i]; delete [] sendBufs; delete [] sendLengs; delete [] sendProcs; for ( i = 0; i < nRecvs; i++ ) delete [] recvBufs[i]; delete [] recvBufs; delete [] recvLengs; delete [] recvProcs; delete [] request; return 1; } // --- create face element matrix (given local faceExt element matrix) else if ( !strcmp("updatefaceElemMatrix",data_key) ) { MPI_Barrier(mpiComm_); int i, j, index, n, pnum, Buf[100]; int *ncols = (int *) argv[0], **cols = (int **) argv[1]; int *ind = new int[currBlock->numSharedFaces_]; int *columns, l, k; MPI_Request request; MPI_Status Status; // get the owners for the external faces int nFaces = currBlock->numLocalFaces_; int nFacesExt = currBlock->numExternalFaces_; int *faceList = currBlock->faceGlobalIDs_; int *sharedFaceList = currBlock->sharedFaceIDs_; int numSharedFaces = currBlock->numSharedFaces_; int *sharedFaceNProcs = currBlock->sharedFaceNProcs_; int **sharedFaceProc = currBlock->sharedFaceProc_; int *owner = new int [nFacesExt]; for ( i = 0; i < numSharedFaces; i++ ) { index = searchFace( sharedFaceList[i] ) - nFaces; if ( index >= 0 ) { pnum = mypid; for ( j = 0; j < sharedFaceNProcs[i]; j++ ) if ( currBlock->sharedFaceProc_[i][j] < pnum ) pnum = currBlock->sharedFaceProc_[i][j]; owner[index] = pnum; } } // external faces send with which elements are connected for ( i = 0; i < nFacesExt; i++ ) MPI_Isend(cols[i+nFaces], ncols[i+nFaces], MPI_INT, owner[i], faceList[i+nFaces], mpiComm_, &request); // owners of shared faces receive data for ( i = 0; i < numSharedFaces; i++ ) { ind[i] = MLI_Utils_BinarySearch(sharedFaceList[i], faceList, nFaces); // the shared face is owned by this subdomain if (ind[i] >= 0) { for ( j = 0; j < sharedFaceNProcs[i]; j++ ) if ( sharedFaceProc[i][j] != mypid ) { MPI_Recv( Buf, 100, MPI_INT, MPI_ANY_SOURCE, MPI_ANY_TAG, mpiComm_, &Status); MPI_Get_count( &Status, MPI_INT, &n); k = MLI_Utils_BinarySearch(Status.MPI_TAG,faceList,nFaces); columns = new int[ncols[k]+n]; for( l = 0; l < ncols[k]; l++ ) columns[l] = cols[k][l]; for( l = 0; l < n; l++ ) columns[ncols[k]++] = Buf[l]; delete [] cols[k]; cols[k] = columns; } } } delete [] ind; delete [] owner; return 1; } return 0; } //************************************************************************* // read grid information from files //------------------------------------------------------------------------- int MLI_FEData::readFromFile(char *infile) { int i, j, k, nNodes, nodeDOF, index, nNodesPerElem; int numFields, *fieldIDs=NULL, *fieldSizes=NULL, nElems_check; int index2, nElems, *elemIDs=NULL, eMatDim; int nodeNumFields, *nodeFieldIDs=NULL; int elemNumFields, *elemFieldIDs=NULL; int *nodeIDs=NULL, **IDLists=NULL, *numProcs=NULL, **procLists=NULL; int spaceDim=0, *nodeIDAux=NULL, mypid; char **nodeBCFlags=NULL; double *nodeCoords=NULL, **newCoords=NULL, **elemMat, **nodeBCVals; char filename[80], inputString[256];; FILE *fp; // ------------------------------------------------------------- // --- read element node connectivity information // Format : space dimension // number of fields // fieldID and field size ... // number of elements // number of nodes per element // number of element fields // element field IDs... // number of nodal fields // nodal field IDs... // element global IDs (nElems of them) // element node list (nElems*nNodesPerElem of them) // ------------------------------------------------------------- MPI_Comm_rank(mpiComm_, &mypid); sprintf( filename, "%s.elemConn.%d", infile, mypid ); fp = fopen( filename, "r" ); if ( fp == NULL ) { printf("readFromFile ERROR : file elemConn does not exist.\n"); exit(1); } fgets(inputString, 100, fp); while ( inputString[0] == '#' ) fgets(inputString, 100, fp); sscanf(inputString, "%d", &spaceDimension_); fscanf(fp, "%d", &numFields); fieldIDs = new int[numFields]; fieldSizes = new int[numFields]; for ( i = 0; i < numFields; i++ ) fscanf(fp, "%d %d", &(fieldIDs[i]), &(fieldSizes[i])); fscanf(fp, "%d", &nElems); fscanf(fp, "%d", &nNodesPerElem); fscanf(fp, "%d", &elemNumFields); if ( elemNumFields > 0 ) elemFieldIDs = new int[elemNumFields]; for (i = 0; i < elemNumFields; i++) fscanf(fp, "%d", &elemFieldIDs[i]); fscanf(fp, "%d", &nodeNumFields); if ( nodeNumFields > 0 ) nodeFieldIDs = new int[nodeNumFields]; for (i = 0; i < nodeNumFields; i++) fscanf(fp, "%d", &nodeFieldIDs[i]); elemIDs = new int[nElems]; for (i = 0; i < nElems; i++) fscanf(fp, "%d", &(elemIDs[i])); IDLists = new int*[nElems]; for (i = 0; i < nElems; i++) IDLists[i] = new int[nNodesPerElem]; for (i = 0; i < nElems; i++) { for (j = 0; j < nNodesPerElem; j++) fscanf(fp, "%d", &(IDLists[i][j])); } fclose(fp); // ------------------------------------------------------------- // --- read coordinate file, if present // Format : number of nodes // space dimension // node global ID x y z ... // ------------------------------------------------------------- sprintf( filename, "%s.nodeCoord.%d", infile, mypid ); fp = fopen( filename, "r" ); if ( fp != NULL ) { fgets(inputString, 100, fp); while ( inputString[0] == '#' ) fgets(inputString, 100, fp); sscanf(inputString, "%d", &nNodes); fscanf(fp, "%d", &spaceDim); nodeIDs = new int[nNodes]; nodeCoords = new double[nNodes * spaceDim]; for (i = 0; i < nNodes; i++) { fscanf(fp, "%d", &(nodeIDs[i])); for (j = 0; j < spaceDim; j++) fscanf(fp, "%lg", &(nodeCoords[i*spaceDim+j])); } fclose(fp); nodeIDAux = new int[nNodes]; for (i = 0; i < nNodes; i++) nodeIDAux[i] = i; newCoords = new double*[nElems]; for (i = 0; i < nElems; i++) newCoords[i] = new double[nNodesPerElem*spaceDim]; MLI_Utils_IntQSort2(nodeIDs, nodeIDAux, 0, nNodes-1); for (i = 0; i < nElems; i++) { for (j = 0; j < nNodesPerElem; j++) { index = MLI_Utils_BinarySearch(IDLists[i][j], nodeIDs, nNodes); if ( index < 0 ) { printf("readFromFile ERROR : element node ID not found.\n"); exit(1); } for (k = 0; k < spaceDim; k++) { index2 = nodeIDAux[index]; newCoords[i][j*spaceDim+k] = nodeCoords[index2*spaceDim+k]; } } } } // ------------------------------------------------------------- // --- initialize the element block // ------------------------------------------------------------- initFields(numFields, fieldSizes, fieldIDs); initElemBlock(nElems, nNodesPerElem, nodeNumFields, nodeFieldIDs, elemNumFields, elemFieldIDs); initElemBlockNodeLists(nElems, elemIDs, nNodesPerElem, IDLists, spaceDim, newCoords); // ------------------------------------------------------------- // --- clean up // ------------------------------------------------------------- if ( fieldIDs != NULL ) delete [] fieldIDs; if ( fieldSizes != NULL ) delete [] fieldSizes; if ( newCoords != NULL ) { for (i = 0; i < nElems; i++) delete [] newCoords[i]; delete [] newCoords; } if ( nodeCoords != NULL ) delete [] nodeCoords; if ( IDLists != NULL ) { for (i = 0; i < nElems; i++) delete [] IDLists[i]; delete [] IDLists; } if ( elemIDs != NULL ) delete [] elemIDs; if ( nodeIDs != NULL ) delete [] nodeIDs; if ( nodeIDAux != NULL ) delete [] nodeIDAux; if ( elemFieldIDs != NULL ) delete [] elemFieldIDs; if ( nodeFieldIDs != NULL ) delete [] nodeFieldIDs; // ------------------------------------------------------------- // --- read and shared nodes information // ------------------------------------------------------------- sprintf( filename, "%s.nodeShared.%d", infile, mypid ); fp = fopen( filename, "r" ); if ( fp != NULL ) { fgets(inputString, 100, fp); while ( inputString[0] == '#' ) fgets(inputString, 100, fp); sscanf(inputString, "%d", &nNodes); nodeIDs = new int[nNodes]; numProcs = new int[nNodes]; procLists = new int*[nNodes]; for ( i = 0; i < nNodes; i++ ) { fscanf(fp, "%d %d", &(nodeIDs[i]), &(numProcs[i])); procLists[i] = new int[numProcs[i]]; for ( j = 0; j < numProcs[i]; j++ ) fscanf(fp, "%d", &(procLists[i][j])); } initSharedNodes(nNodes, nodeIDs, numProcs, procLists); delete [] nodeIDs; delete [] numProcs; for ( i = 0; i < nNodes; i++ ) delete [] procLists[i]; delete [] procLists; } initComplete(); // ------------------------------------------------------------- // --- read and load element stiffness matrices // ------------------------------------------------------------- sprintf( filename, "%s.elemMatrix.%d", infile, mypid ); fp = fopen( filename, "r" ); if ( fp == NULL ) { printf("readFromFile ERROR : file elemMatrix does not exist.\n"); exit(1); } fgets(inputString, 100, fp); while ( inputString[0] == '#' ) fgets(inputString, 100, fp); sscanf(inputString, "%d", &nElems_check); if ( nElems_check != nElems ) { printf("readFromFile ERROR : elemMat dimension do not match.\n"); exit(1); } fscanf(fp, "%d", &eMatDim); elemMat = new double*[nElems]; for ( i = 0; i < nElems; i++ ) elemMat[i] = new double[eMatDim*eMatDim]; for ( i = 0; i < nElems; i++ ) { for ( j = 0; j < eMatDim; j++ ) for ( k = 0; k < eMatDim; k++ ) fscanf(fp, "%lg", &(elemMat[i][k*eMatDim+j])); } fclose(fp); loadElemBlockMatrices(nElems, eMatDim, elemMat); for ( i = 0; i < nElems; i++ ) delete [] elemMat[i]; delete [] elemMat; // ------------------------------------------------------------- // --- read and load node boundary information // ------------------------------------------------------------- sprintf( filename, "%s.nodeBC.%d", infile, mypid ); fp = fopen( filename, "r" ); if ( fp != NULL ) { fgets(inputString, 100, fp); while ( inputString[0] == '#' ) fgets(inputString, 100, fp); sscanf(inputString, "%d %d", &nNodes, &nodeDOF); nodeIDs = new int[nNodes]; nodeBCFlags = new char*[nNodes]; nodeBCVals = new double*[nNodes]; for ( i = 0; i < nNodes; i++ ) nodeBCFlags[i] = new char[nodeDOF]; for ( i = 0; i < nNodes; i++ ) { nodeBCVals[i] = new double[nodeDOF]; for ( j = 0; j < nodeDOF; j++ ) nodeBCVals[i][j] = 0.0; } for ( i = 0; i < nNodes; i++ ) { fscanf(fp, "%d", &(nodeIDs[i])); for ( j = 0; j < nodeDOF; j++ ) { fscanf(fp, "%d", &k); if ( k > 0 ) { nodeBCFlags[i][j] = 'Y'; fscanf(fp, "%lg", &(nodeBCVals[i][j])); } else nodeBCFlags[i][j] = 'N'; } } fclose(fp); loadNodeBCs(nNodes, nodeIDs, nodeDOF, nodeBCFlags, nodeBCVals); if ( nodeIDs != NULL ) delete [] nodeIDs; for ( i = 0; i < nNodes; i++ ) delete [] nodeBCFlags[i]; if ( nodeBCFlags != NULL ) delete [] nodeBCFlags; for ( i = 0; i < nNodes; i++ ) delete [] nodeBCVals[i]; if ( nodeBCVals != NULL ) delete [] nodeBCVals; } return 1; } //************************************************************************* // write grid information to files //------------------------------------------------------------------------- int MLI_FEData::writeToFile(char *infile) { int i, j, k, nElems, nNodes, nodeDOF, length, mypid; char filename[80]; FILE *fp; MLI_ElemBlock *currBlock; // ------------------------------------------------------------- // --- error checking // ------------------------------------------------------------- currBlock = elemBlockList_[currentElemBlock_]; if ( ! currBlock->initComplete_ ) { printf("writeToFile ERROR : initialization not complete.\n"); exit(1); } // ------------------------------------------------------------- // --- write element node connectivity information // Format : space dimension // number of fields // fieldID and field size ... // number of elements // number of nodes per element // number of element fields // element field IDs... // number of nodal fields // nodal field IDs... // element global IDs (nElems of them) // element node list (nElems*nNodesPerElem of them) // ------------------------------------------------------------- MPI_Comm_rank( mpiComm_, &mypid ); sprintf( filename, "%s.elemConn.%d", infile, mypid ); fp = fopen( filename, "w" ); if ( fp == NULL ) { printf("writeToFile ERROR : cannot write to elemConn file.\n"); exit(1); } fprintf(fp, "# Data format \n"); fprintf(fp, "# A. space dimension \n"); fprintf(fp, "# B. number of fields \n"); fprintf(fp, "# C. fieldIDs fieldSizes \n"); fprintf(fp, "# D. number of elements \n"); fprintf(fp, "# E. number of nodes per element \n"); fprintf(fp, "# F. number of element fields\n"); fprintf(fp, "# G. element field IDs\n"); fprintf(fp, "# H. number of nodal fields\n"); fprintf(fp, "# I. nodal field IDs\n"); fprintf(fp, "# J. element globalIDs \n"); fprintf(fp, "# K. element node lists \n"); fprintf(fp, "#\n"); fprintf(fp, "%12d\n", spaceDimension_); fprintf(fp, "%12d\n", numFields_); for ( i = 0; i < numFields_; i++ ) fprintf(fp, "%12d %12d\n", fieldIDs_[i], fieldSizes_[i]); nElems = currBlock->numLocalElems_; fprintf(fp, "%12d\n", nElems); fprintf(fp, "%12d\n", currBlock->elemNumNodes_); fprintf(fp, "%12d\n", currBlock->elemNumFields_); for (i = 0; i < currBlock->elemNumFields_; i++) fprintf(fp, "%12d\n", currBlock->elemFieldIDs_[i]); fprintf(fp, "%12d\n", currBlock->nodeNumFields_); for (i = 0; i < currBlock->nodeNumFields_; i++) fprintf(fp, "%12d\n", currBlock->nodeFieldIDs_[i]); fprintf(fp, "\n"); for (i = 0; i < nElems; i++) fprintf(fp, "%12d\n", currBlock->elemGlobalIDs_[i]); fprintf(fp,"\n"); for (i = 0; i < nElems; i++) { for ( j = 0; j < currBlock->elemNumNodes_; j++ ) fprintf(fp, "%d ", currBlock->elemNodeIDList_[i][j]); fprintf(fp,"\n"); } fclose(fp); // ------------------------------------------------------------- // --- write coordinate file, if needed // Format : number of nodes // space dimension // node global ID x y z ... // ------------------------------------------------------------- if ( currBlock->nodeCoordinates_ != NULL ) { sprintf( filename, "%s.nodeCoord.%d", infile, mypid ); fp = fopen( filename, "w" ); if ( fp == NULL ) { printf("writeToFile ERROR : cannot write to nodeCoord file.\n"); exit(1); } fprintf(fp, "# Data format \n"); fprintf(fp, "# A. number of nodes \n"); fprintf(fp, "# B. space dimension \n"); fprintf(fp, "# C. node ID xcoord ycoord zcoord\n"); fprintf(fp, "#\n"); nNodes = currBlock->numLocalNodes_ + currBlock->numExternalNodes_; fprintf(fp, "%12d\n", nNodes); fprintf(fp, "%12d\n", spaceDimension_); for ( i = 0; i < nNodes; i++ ) { fprintf(fp, "%12d", currBlock->nodeGlobalIDs_[i]); for (j = 0; j < spaceDimension_; j++) fprintf(fp, "%20.12e", currBlock->nodeCoordinates_[i*spaceDimension_+j]); fprintf(fp,"\n"); } fclose(fp); } // ------------------------------------------------------------- // --- write and shared nodes information // Format : number of shared nodes // shared Node ID number of processors processor list // ------------------------------------------------------------- nNodes = currBlock->numSharedNodes_; if ( nNodes > 0 ) { sprintf( filename, "%s.nodeShared.%d", infile, mypid ); fp = fopen( filename, "w" ); if ( fp == NULL ) { printf("writeToFile ERROR : cannot write to nodeShared file.\n"); exit(1); } fprintf(fp, "# Data format \n"); fprintf(fp, "# A. number of shared nodes \n"); fprintf(fp, "# B. shared node ID, nprocs, processor list \n"); fprintf(fp, "#\n"); fprintf(fp, "%d\n", nNodes); for ( i = 0; i < nNodes; i++ ) { fprintf(fp, "%12d %12d\n", currBlock->sharedNodeIDs_[i], currBlock->sharedNodeNProcs_[i]); for ( j = 0; j < currBlock->sharedNodeNProcs_[i]; j++ ) fprintf(fp, "%12d\n", currBlock->sharedNodeProc_[i][j]); } fclose(fp); } // ------------------------------------------------------------- // --- write element stiffness matrices // ------------------------------------------------------------- length = currBlock->elemStiffDim_; sprintf( filename, "%s.elemMatrix.%d", infile, mypid ); fp = fopen( filename, "w" ); if ( fp == NULL ) { printf("writeToFile ERROR : cannot write to elemMatrix file.\n"); exit(1); } fprintf(fp, "# Data format \n"); fprintf(fp, "# A. number of Elements \n"); fprintf(fp, "# B. dimension of element matrix \n"); fprintf(fp, "# C. element matrices \n"); fprintf(fp, "#\n"); fprintf(fp, "%d\n", nElems); fprintf(fp, "%d\n\n", length); for ( i = 0; i < nElems; i++ ) { for ( j = 0; j < length; j++ ) { for ( k = 0; k < length; k++ ) fprintf(fp, "%25.16e ", currBlock->elemStiffMat_[i][k*length+j]); fprintf(fp, "\n"); } fprintf(fp, "\n"); } fclose(fp); // ------------------------------------------------------------- // --- write node boundary information // ------------------------------------------------------------- nNodes = currBlock->nodeNumBCs_; if ( nNodes > 0 ) { sprintf( filename, "%s.nodeBC.%d", infile, mypid ); fp = fopen( filename, "w" ); if ( fp == NULL ) { printf("writeToFile ERROR : cannot write to nodeBC file.\n"); exit(1); } nodeDOF = currBlock->nodeDOF_; fprintf(fp, "# Data format \n"); fprintf(fp, "# A. number of boundary nodes \n"); fprintf(fp, "# B. nodal degree of freedom \n"); fprintf(fp, "# C. node ID (1 or -1) value (if 1) \n\n"); fprintf(fp, "#\n"); fprintf(fp, "%d\n", nNodes ); fprintf(fp, "%d\n", nodeDOF ); for ( i = 0; i < nNodes; i++ ) { for ( j = 0; j < nodeDOF; j++ ) { if ( currBlock->nodeBCFlagList_[i][j] == 'Y' ) fprintf(fp, "%12d 1 %25.16e\n", currBlock->nodeBCIDList_[i], currBlock->nodeBCValues_[i][j]); else fprintf(fp, "%12d -1\n", currBlock->nodeBCIDList_[i]); } } fclose(fp); } return 1; } /************************************************************************** * constructor for the elemBlock *-----------------------------------------------------------------------*/ int MLI_FEData::createElemBlock(int blockID) { int i; MLI_ElemBlock **tempBlocks, *currBlock; // ------------------------------------------------------------- // --- check that element block ID cannot be arbitrary // ------------------------------------------------------------- if ( blockID > numElemBlocks_ ) { printf("createElemBlock : block ID %d invalid.\n", blockID); exit(1); } // ------------------------------------------------------------- // --- if a new elemBlock is requested // ------------------------------------------------------------- if ( blockID == numElemBlocks_ ) { tempBlocks = elemBlockList_; numElemBlocks_++; elemBlockList_ = new MLI_ElemBlock*[numElemBlocks_]; for (i = 0; i < numElemBlocks_-1; i++) elemBlockList_[i] = tempBlocks[i]; elemBlockList_[numElemBlocks_-1] = new MLI_ElemBlock(); delete [] tempBlocks; } // ------------------------------------------------------------- // --- initialize variables in the new element block // ------------------------------------------------------------- currBlock = elemBlockList_[blockID]; currBlock->numLocalElems_ = 0; currBlock->elemGlobalIDs_ = NULL; currBlock->elemGlobalIDAux_ = NULL; currBlock->elemNumFields_ = 0; currBlock->elemFieldIDs_ = NULL; currBlock->elemDOF_ = 0; currBlock->elemNumNodes_ = 0; currBlock->elemNodeIDList_ = NULL; currBlock->elemStiffDim_ = 0; currBlock->elemStiffMat_ = NULL; currBlock->elemNumNS_ = NULL; currBlock->elemNullSpace_ = NULL; currBlock->elemVolume_ = NULL; currBlock->elemMaterial_ = NULL; currBlock->elemParentIDs_ = NULL; currBlock->elemLoads_ = NULL; currBlock->elemSol_ = NULL; currBlock->elemNumFaces_ = 0; currBlock->elemFaceIDList_ = NULL; currBlock->elemNumBCs_ = 0; currBlock->elemBCIDList_ = NULL; currBlock->elemBCFlagList_ = NULL; currBlock->elemBCValues_ = NULL; currBlock->elemOffset_ = 0; currBlock->numLocalNodes_ = 0; currBlock->numExternalNodes_ = 0; currBlock->nodeGlobalIDs_ = NULL; currBlock->nodeNumFields_ = 0; currBlock->nodeFieldIDs_ = NULL; currBlock->nodeDOF_ = 0; currBlock->nodeCoordinates_ = NULL; currBlock->nodeNumBCs_ = 0; currBlock->nodeBCIDList_ = NULL; currBlock->nodeBCFlagList_ = NULL; currBlock->nodeBCValues_ = NULL; currBlock->numSharedNodes_ = 0; currBlock->sharedNodeIDs_ = NULL; currBlock->sharedNodeNProcs_ = NULL; currBlock->sharedNodeProc_ = NULL; currBlock->nodeExtNewGlobalIDs_ = NULL; currBlock->nodeOffset_ = 0; currBlock->numLocalFaces_ = 0; currBlock->numExternalFaces_ = 0; currBlock->faceGlobalIDs_ = NULL; currBlock->faceNumNodes_ = 0; currBlock->faceNodeIDList_ = NULL; currBlock->numSharedFaces_ = 0; currBlock->sharedFaceIDs_ = NULL; currBlock->sharedFaceNProcs_ = NULL; currBlock->sharedFaceProc_ = NULL; currBlock->faceExtNewGlobalIDs_ = NULL; currBlock->faceOffset_ = 0; currBlock->initComplete_ = 0; return 0; } /************************************************************************** * destructor for the elemBlock *-----------------------------------------------------------------------*/ int MLI_FEData::deleteElemBlock(int blockID) { int i; MLI_ElemBlock *currBlock; // ------------------------------------------------------------- // --- error checking // ------------------------------------------------------------- if ( blockID >= numElemBlocks_ || blockID < 0 ) { printf("deleteElemBlock : block ID %d invalid.\n", blockID); exit(1); } if ( elemBlockList_[blockID] == NULL ) { printf("deleteElemBlock : block %d NULL.\n", blockID); exit(1); } // ------------------------------------------------------------- // --- initialize variables in the new element block // ------------------------------------------------------------- currBlock = elemBlockList_[blockID]; if (currBlock->elemGlobalIDs_ != NULL) delete [] currBlock->elemGlobalIDs_; if (currBlock->elemGlobalIDAux_ != NULL) delete [] currBlock->elemGlobalIDAux_; if (currBlock->elemFieldIDs_ != NULL) delete [] currBlock->elemFieldIDs_; if (currBlock->elemNodeIDList_ != NULL) { for ( i = 0; i < currBlock->numLocalElems_; i++ ) delete [] currBlock->elemNodeIDList_[i]; delete [] currBlock->elemNodeIDList_; } if (currBlock->elemStiffMat_ != NULL) { for ( i = 0; i < currBlock->numLocalElems_; i++ ) delete [] currBlock->elemStiffMat_[i]; delete [] currBlock->elemStiffMat_; } if (currBlock->elemNumNS_ != NULL) delete [] currBlock->elemNumNS_; if (currBlock->elemNullSpace_ != NULL) delete [] currBlock->elemNullSpace_; if (currBlock->elemVolume_ != NULL) delete [] currBlock->elemVolume_; if (currBlock->elemMaterial_ != NULL) delete [] currBlock->elemMaterial_; if (currBlock->elemParentIDs_ != NULL) delete [] currBlock->elemParentIDs_; if (currBlock->elemLoads_ != NULL) { for ( i = 0; i < currBlock->numLocalElems_; i++ ) delete [] currBlock->elemLoads_[i]; delete [] currBlock->elemLoads_; } if (currBlock->elemSol_ != NULL) { for ( i = 0; i < currBlock->numLocalElems_; i++ ) delete [] currBlock->elemSol_[i]; delete [] currBlock->elemSol_; } if (currBlock->elemFaceIDList_ != NULL) { for ( i = 0; i < currBlock->numLocalElems_; i++ ) delete [] currBlock->elemFaceIDList_[i]; delete [] currBlock->elemFaceIDList_; } if (currBlock->elemBCIDList_ != NULL) delete [] currBlock->elemBCIDList_; if (currBlock->elemBCFlagList_ != NULL) { for ( i = 0; i < currBlock->numLocalElems_; i++ ) delete [] currBlock->elemBCFlagList_[i]; delete [] currBlock->elemBCFlagList_; for ( i = 0; i < currBlock->numLocalElems_; i++ ) delete [] currBlock->elemBCValues_[i]; delete [] currBlock->elemBCValues_; } currBlock->elemNumFields_ = 0; currBlock->elemDOF_ = 0; currBlock->elemNumNodes_ = 0; currBlock->elemStiffDim_ = 0; currBlock->numLocalElems_ = 0; currBlock->elemNumFaces_ = 0; currBlock->elemNumBCs_ = 0; currBlock->elemOffset_ = 0; if (currBlock->nodeGlobalIDs_ != NULL) delete [] currBlock->nodeGlobalIDs_; if (currBlock->nodeFieldIDs_ != NULL) delete [] currBlock->nodeFieldIDs_; if (currBlock->nodeCoordinates_ != NULL) delete [] currBlock->nodeCoordinates_; if (currBlock->nodeBCIDList_ != NULL) delete [] currBlock->nodeBCIDList_; if (currBlock->nodeBCFlagList_ != NULL) { for ( i = 0; i < currBlock->nodeNumBCs_; i++ ) delete [] currBlock->nodeBCFlagList_[i]; delete [] currBlock->nodeBCFlagList_; for ( i = 0; i < currBlock->nodeNumBCs_; i++ ) delete [] currBlock->nodeBCValues_[i]; delete [] currBlock->nodeBCValues_; } if (currBlock->sharedNodeIDs_ != NULL) delete [] currBlock->sharedNodeIDs_; if (currBlock->sharedNodeNProcs_ != NULL) delete [] currBlock->sharedNodeNProcs_; if (currBlock->sharedNodeProc_ != NULL) { for ( i = 0; i < currBlock->numSharedNodes_; i++ ) delete [] currBlock->sharedNodeProc_[i]; delete [] currBlock->sharedNodeProc_; } if ( currBlock->nodeExtNewGlobalIDs_ != NULL ) delete [] currBlock->nodeExtNewGlobalIDs_; currBlock->numLocalNodes_ = 0; currBlock->numExternalNodes_ = 0; currBlock->nodeNumFields_ = 0; currBlock->nodeDOF_ = 0; currBlock->nodeNumBCs_ = 0; currBlock->numSharedNodes_ = 0; currBlock->nodeOffset_ = 0; if (currBlock->faceGlobalIDs_ != NULL) delete [] currBlock->faceGlobalIDs_; if (currBlock->faceNodeIDList_ != NULL) { int nFaces = currBlock->numLocalFaces_ + currBlock->numExternalFaces_; for ( i = 0; i < nFaces; i++ ) delete [] currBlock->faceNodeIDList_[i]; delete [] currBlock->faceNodeIDList_; } if (currBlock->sharedFaceIDs_ != NULL) delete [] currBlock->sharedFaceIDs_; if (currBlock->sharedFaceNProcs_ != NULL) delete [] currBlock->sharedFaceNProcs_; if (currBlock->sharedFaceProc_ != NULL) { for ( i = 0; i < currBlock->numSharedFaces_; i++ ) delete [] currBlock->sharedFaceProc_[i]; delete [] currBlock->sharedFaceProc_; } if ( currBlock->faceExtNewGlobalIDs_ != NULL ) delete [] currBlock->faceExtNewGlobalIDs_; currBlock->numLocalFaces_ = 0; currBlock->numExternalFaces_ = 0; currBlock->faceNumNodes_ = 0; currBlock->numSharedFaces_ = 0; currBlock->faceOffset_ = 0; currBlock->initComplete_ = 0; return 0; } /************************************************************************** * search element ID in an ordered array *-----------------------------------------------------------------------*/ int MLI_FEData::searchElement(int key) { int index; MLI_ElemBlock *currBlock = elemBlockList_[currentElemBlock_]; index = MLI_Utils_BinarySearch(key, currBlock->elemGlobalIDs_, currBlock->numLocalElems_); return index; } /************************************************************************** * search node ID in an ordered array *-----------------------------------------------------------------------*/ int MLI_FEData::searchNode(int key) { int index; MLI_ElemBlock *currBlock = elemBlockList_[currentElemBlock_]; index = MLI_Utils_BinarySearch(key, currBlock->nodeGlobalIDs_, currBlock->numLocalNodes_); if ( index < 0 ) { index = MLI_Utils_BinarySearch(key, &(currBlock->nodeGlobalIDs_[currBlock->numLocalNodes_]), currBlock->numExternalNodes_); if ( index >= 0 ) index += currBlock->numLocalNodes_; } return index; } /************************************************************************** * search face ID in an ordered array *-----------------------------------------------------------------------*/ int MLI_FEData::searchFace(int key) { int index; MLI_ElemBlock *currBlock = elemBlockList_[currentElemBlock_]; index = MLI_Utils_BinarySearch(key, currBlock->faceGlobalIDs_, currBlock->numLocalFaces_); if ( index < 0 ) { index = MLI_Utils_BinarySearch(key, &(currBlock->faceGlobalIDs_[currBlock->numLocalFaces_]), currBlock->numExternalFaces_); if ( index >= 0 ) index += currBlock->numLocalFaces_; } return index; } hypre-2.33.0/src/FEI_mv/femli/mli_fedata.h000066400000000000000000000333371477326011500201730ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #ifndef __MLIFEDATA_H__ #define __MLIFEDATA_H__ #include "_hypre_utilities.h" #include "mli_febase.h" /****************************************************************************/ /* data structures for Finite element grid information */ /*--------------------------------------------------------------------------*/ /*--------------------------------------------------------------------------*/ /* first, definition of an element block (all elements in an element block */ /* have the same number of nodes and same number of fields, etc.) */ /*--------------------------------------------------------------------------*/ typedef struct MLI_ElemBlock_Struct { int numLocalElems_; /* number of elements in this block */ int *elemGlobalIDs_; /* element global IDs in this block */ int *elemGlobalIDAux_; /* for conversion to local IDs */ int elemNumNodes_; /* number of nodes per elements */ int **elemNodeIDList_; /* element node list (global IDs) */ int elemNumFields_; /* number of element fields */ int *elemFieldIDs_; /* a list of element field IDs */ int elemDOF_; /* element degree of freedom */ int elemStiffDim_; /* element stiffness matrix dimension */ double **elemStiffMat_; /* element stiffness matrices */ int *elemNumNS_; /* element number of nullspace vectors */ double **elemNullSpace_; /* element null space vectors */ double *elemVolume_; /* element volumes */ int *elemMaterial_; /* element materials */ int *elemParentIDs_; /* element parentIDs */ double **elemLoads_; double **elemSol_; int elemNumFaces_; /* number of faces in an element */ int **elemFaceIDList_; /* element face global ID lists */ int elemNumBCs_; int *elemBCIDList_; char **elemBCFlagList_; double **elemBCValues_; int elemOffset_; int numLocalNodes_; /* number of internal nodes */ int numExternalNodes_; /* number of external nodes */ int *nodeGlobalIDs_; /* a list of node global IDs */ int nodeNumFields_; /* number of node fields */ int *nodeFieldIDs_; /* a list of node field IDs */ int nodeDOF_; /* nodal degree of freedom */ double *nodeCoordinates_; /* a list of nodal coordinates */ int nodeNumBCs_; /* number of node BCs */ int *nodeBCIDList_; /* a list of BC node global IDs */ char **nodeBCFlagList_; /* a list of node BC flags */ double **nodeBCValues_; /* node BCs */ int numSharedNodes_; /* number of shared nodes */ int *sharedNodeIDs_; /* shared node global IDs */ int *sharedNodeNProcs_; /* number of processors each node is shared*/ int **sharedNodeProc_; /* processor IDs for shared nodes */ int *nodeExtNewGlobalIDs_; /* processor IDs for shared nodes */ int nodeOffset_; /* node processor offset */ int numLocalFaces_; /* number of local faces */ int numExternalFaces_; /* number of external faces (local element)*/ int *faceGlobalIDs_; /* a list of face global IDs */ int faceNumNodes_; /* number of nodes in a face */ int **faceNodeIDList_; /* face node list */ int numSharedFaces_; /* number of shared faces */ int *sharedFaceIDs_; /* shared face IDs */ int *sharedFaceNProcs_; /* number of processors each face is shared*/ int **sharedFaceProc_; /* processor IDs of shared faces */ int *faceExtNewGlobalIDs_; /* processor IDs for shared nodes */ int faceOffset_; /* face global offsets */ int initComplete_; } MLI_ElemBlock; class MLI_FEData : public MLI_FEBase { MPI_Comm mpiComm_; int outputLevel_; int spaceDimension_; int orderOfPDE_; int orderOfFE_; int numElemBlocks_; MLI_ElemBlock **elemBlockList_; int currentElemBlock_; int numFields_; int *fieldIDs_; int *fieldSizes_; // The private fields below appear to be unused /* int elemsAssembled_; int nodesAssembled_; int facesAssembled_; void *USR_FEMatrixObj_; */ void *USR_FEGridObj_; int (*USR_computeShapeFuncInterpolant)(void*, int eGlobalID, int nNodes, const double *coord, double *coef); int (*USR_getElemMatrix)(void*, int eGlobalID, int sMatDim, double *stiffMat); public : MLI_FEData(MPI_Comm comm); ~MLI_FEData(); // ------------------------------------------------------------------------- // load general information // ------------------------------------------------------------------------- int setOutputLevel(int level); int setSpaceDimension(int numDim); int setOrderOfPDE(int pdeOrder); int setOrderOfFE(int feOrder); // ========================================================================= // initialization functions // ========================================================================= int setCurrentElemBlockID(int blockID); int initFields(int numFields, const int *fieldSizes, const int *fieldIDs); int initElemBlock(int nElems, int nNodesPerElem, int nodeNumFields, const int *nodeFieldIDs, int elemNumFields, const int *elemFieldIDs); int initElemBlockNodeLists(int nElems, const int *eGlobalIDs, int nNodesPerElem, const int* const *nGlobalIDLists, int spaceDim, const double* const *coord); int initElemNodeList(int eGlobalIDs,int nNodesPerElem,const int *nGlobalIDs, int spaceDim, const double *coord); int initSharedNodes(int nNodes, const int *nGlobalIDs, const int *numProcs, const int * const *procLists); int initElemBlockFaceLists(int nElems, int nFaces, const int* const *fGlobalIDLists); int initFaceBlockNodeLists(int nFaces, const int *fGlobalIDs, int nNodes, const int * const *nGlobalIDLists); int initSharedFaces(int nFaces, const int *fGlobalIDs, const int *numProcs, const int* const *procLists); int initComplete(); // ========================================================================= // load element information // ========================================================================= // ------------------------------------------------------------------------- // collective loading of element data // ------------------------------------------------------------------------- int loadElemBlockMatrices(int nElems, int sMatDim, const double* const *stiffMat); int loadElemBlockNullSpaces(int nElems, const int *nNSpace, int sMatDim, const double* const *nSpace); int loadElemBlockVolumes(int nElems, const double *elemVols); int loadElemBlockMaterials(int nElems, const int *elemMaterial); int loadElemBlockParentIDs(int nElems, const int *pGlobalIDs); int loadElemBlockLoads(int nElems, int loadDim, const double* const *elemLoads); int loadElemBlockSolutions(int nElems, int solDim, const double* const *elemSols); int loadElemBCs(int nElems, const int *eGlobalIDs, int elemDOF, const char* const *BCFlags, const double *const *bcVals); // ------------------------------------------------------------------------- // These functions allows elements to be loaded individually. // ------------------------------------------------------------------------- int loadElemMatrix(int eGlobalID, int sMatDim, const double *stiffMat); int loadElemNullSpace(int eGlobalID, int nNSpace, int sMatDim, const double *nSpace); int loadElemLoad(int eGlobalID, int sMatDim, const double *elemLoad); int loadElemSolution(int eGlobalID, int sMatDim, const double *elemSol); //int loadFunc_getElemMatrix(void *object, int (*func)(void *,int eGlobalID, // int sMatDim,double *stiffMat)); // ========================================================================= // load node boundary conditions // ========================================================================= int loadNodeBCs(int nNodes, const int *nGlobalIDs, int nodeDOF, const char *const *BCFlags, const double* const *bcVals); // ========================================================================= // get general information // ========================================================================= int getSpaceDimension(int& numDim); int getOrderOfPDE(int& pdeOrder); int getOrderOfFE(int& feOrder); int getFieldSize(int fieldID, int &fieldSize); // ========================================================================= // get element information // ========================================================================= int getNumElements(int& nElems); int getElemNumFields(int& numFields); int getElemFieldIDs(int numFields, int *fieldIDs); int getElemGlobalID(int eLocalID, int &eGlobalID); int getElemBlockGlobalIDs(int nElems, int *eGlobalIDs); int getElemNumNodes(int& nNodes); int getElemBlockNodeLists(int nElems,int nNodes,int **nGlobalIDLists); int getElemMatrixDim(int &sMatDim); int getElemBlockMatrices(int nElems, int sMatDim, double **elemMat); int getElemBlockNullSpaceSizes(int nElems, int *dimsNS); int getElemBlockNullSpaces(int nElems, const int *dimsNS, int sMatDim, double **nullSpaces); int getElemBlockVolumes(int nElems, double *elemVols); int getElemBlockMaterials(int nElems, int *elemVols); int getElemBlockParentIDs(int nElems, int *pGlobalIDs); int getElemNumFaces(int& nFaces); int getElemBlockFaceLists(int nElems, int nFaces, int **fGlobalIDLists); int getElemNodeList(int eGlobalID, int nNodes, int *nGlobalIDs); int getElemMatrix(int eGlobalID, int sMatDim, double *elemMat); int getElemNullSpaceSize(int eGlobalID, int &dimNS); int getElemNullSpace(int eGlobalID, int dimNS, int sMatDim, double *nSpace); int getElemVolume(int eGlobalID, double& elemVol); int getElemMaterial(int eGlobalID, int& elemMat); int getElemParentID(int eGlobalID, int& pGlobalID); int getElemFaceList(int eGlobalID, int nFaces, int *fGlobalIDs); int getNumBCElems(int& nElems); int getElemBCs(int nElems, int *eGlobalIDs, int eDOFs, char **fieldFlag, double **BCVals); // ========================================================================= // get node information // ========================================================================= int getNumNodes(int& nNodes); int getNodeBlockGlobalIDs(int nNodes, int *nGlobalIDs); int getNodeNumFields(int &numFields); int getNodeFieldIDs(int numFields, int *fieldIDs); int getNodeBlockCoordinates(int nNodes, int spaceDim, double *coordinates); int getNumBCNodes(int& nNodes); int getNodeBCs(int nNodes, int *nGlobalIDs, int nDOFs, char **fieldFlag, double **BCVals); int getNumSharedNodes(int& nNodes); int getSharedNodeNumProcs(int nNodes, int *nGlobalIDs, int *numProcs); int getSharedNodeProcs(int nNodes, int *numProcs, int **procList); // ------------------------------------------------------------------------- // get face information // ------------------------------------------------------------------------- int getNumFaces(int& nfaces); int getFaceBlockGlobalIDs(int nFaces, int *fGlobalIDs); int getNumSharedFaces(int& nFaces); int getSharedFaceNumProcs(int nFaces, int *fGlobalIDs, int *numProcs); int getSharedFaceProcs(int nFaces, int *numProcs, int **procList); int getFaceNumNodes(int &nNodes); int getFaceBlockNodeLists(int nFaces, int nNodesPerFace, int **nGlobalIDLists); int getFaceNodeList(int fGlobalID, int nNodes, int *nGlobalIDs); // ------------------------------------------------------------------------- // shape function information // ------------------------------------------------------------------------- int loadFunc_computeShapeFuncInterpolant(void *object, int (*func) (void *, int eGlobalID,int nNodes,const double *coord, double *coef)); int getShapeFuncInterpolant(int eGlobalID, int nNodes, const double *coord, double *coef); // ------------------------------------------------------------------------- // other functions // ------------------------------------------------------------------------- int impSpecificRequests(char *param_string, int argc, char **argv); int readFromFile(char *filename); int writeToFile(char *filename); // ------------------------------------------------------------------------- // internal functions // ------------------------------------------------------------------------- int createElemBlock(int blockID); int deleteElemBlock(int blockID); int searchElement(int); int searchNode(int key); int searchFace(int key); }; #endif hypre-2.33.0/src/FEI_mv/femli/mli_fedata_utils.cxx000066400000000000000000001352431477326011500217650ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /************************************************************************** ************************************************************************** * MLI_FEData utilities functions ************************************************************************** **************************************************************************/ #include #include #include "mli_fedata_utils.h" #include "HYPRE_IJ_mv.h" #include "mli_utils.h" /************************************************************************** * Function : MLI_FEDataConstructElemNodeMatrix * Purpose : Form element to node connectivity matrix * Inputs : FEData * Outputs : element-node matrix *-----------------------------------------------------------------------*/ void MLI_FEDataConstructElemNodeMatrix(MPI_Comm comm, MLI_FEData *fedata, MLI_Matrix **mli_mat) { int i, j, rows, nNodes, nLocal, nNodesExt, nElems; int elemOffset, nodeOffset, *elemIDs, *rowLengs, ind; int *extMap=NULL, mypid, nprocs, elemNNodes, *nodeList; double values[8]; char paramString[100], *targv[2]; HYPRE_IJMatrix IJMat; MLI_Function *funcPtr; HYPRE_ParCSRMatrix CSRMat; /* ------------------------------------------------------------ */ /* fetch number of elements, local nodes, and element IDs */ /* ------------------------------------------------------------ */ MPI_Comm_rank(comm, &mypid); MPI_Comm_size(comm, &nprocs); fedata->getNumElements( nElems ); fedata->getNumNodes( nNodes ); fedata->getElemNumNodes( elemNNodes ); targv[0] = (char *) &nNodesExt; strcpy(paramString, "getNumExtNodes"); fedata->impSpecificRequests( paramString, 1, targv ); nLocal = nNodes - nNodesExt; if ( nElems > 0 ) elemIDs = new int[nElems]; else elemIDs = NULL; fedata->getElemBlockGlobalIDs ( nElems, elemIDs ); /* ------------------------------------------------------------ */ /* fetch element and node offsets */ /* ------------------------------------------------------------ */ strcpy(paramString, "getElemOffset"); targv[0] = (char *) &elemOffset; fedata->impSpecificRequests(paramString, 1, targv); strcpy(paramString, "getNodeOffset"); targv[0] = (char *) &nodeOffset; fedata->impSpecificRequests(paramString, 1, targv); /* ------------------------------------------------------------ */ /* create HYPRE IJ matrix */ /* ------------------------------------------------------------ */ HYPRE_IJMatrixCreate(comm, elemOffset, elemOffset + nElems - 1, nodeOffset, nodeOffset + nLocal - 1 , &IJMat); HYPRE_IJMatrixSetObjectType(IJMat, HYPRE_PARCSR); if ( nElems > 0 ) rowLengs = new int[nElems]; else rowLengs = NULL; for ( i = 0; i < nElems; i++ ) rowLengs[i] = elemNNodes; HYPRE_IJMatrixSetRowSizes(IJMat, rowLengs); HYPRE_IJMatrixInitialize(IJMat); if ( nElems > 0 ) delete [] rowLengs; /* ------------------------------------------------------------ */ /* convert global node numbers into new global numbers */ /* ------------------------------------------------------------ */ if ( nNodesExt > 0 ) extMap = new int[nNodesExt]; else extMap = NULL; targv[0] = (char *) extMap; strcpy(paramString, "getExtNodeNewGlobalIDs"); fedata->impSpecificRequests( paramString, 1, targv ); if ( elemNNodes > 0 ) nodeList = new int[elemNNodes]; else nodeList = NULL; for ( i = 0; i < nElems; i++ ) { rows = i + elemOffset; fedata->getElemNodeList(elemIDs[i], elemNNodes, nodeList); for ( j = 0; j < elemNNodes; j++ ) { ind = fedata->searchNode(nodeList[j]); if ( ind >= nLocal ) nodeList[j] = extMap[ind-nLocal]; else nodeList[j] = nodeOffset + ind; values[j] = 1.; } HYPRE_IJMatrixSetValues(IJMat,1,&elemNNodes,&rows,nodeList,values); } if ( nElems > 0 ) delete [] elemIDs; if ( nNodesExt > 0 ) delete [] extMap; if ( elemNNodes > 0 ) delete [] nodeList; HYPRE_IJMatrixAssemble(IJMat); /* ------------------------------------------------------------ */ /* fetch and return matrix */ /* ------------------------------------------------------------ */ HYPRE_IJMatrixGetObject(IJMat, (void **) &CSRMat); HYPRE_IJMatrixSetObjectType(IJMat, -1); HYPRE_IJMatrixDestroy(IJMat); funcPtr = new MLI_Function(); MLI_Utils_HypreParCSRMatrixGetDestroyFunc(funcPtr); sprintf(paramString, "HYPRE_ParCSR" ); (*mli_mat) = new MLI_Matrix( CSRMat, paramString, funcPtr ); } /************************************************************************** * Function : MLI_FEDataConstructElemFaceMatrix * Purpose : Form element to face connectivity matrix * Inputs : FEData * Outputs : element-face matrix *-----------------------------------------------------------------------*/ void MLI_FEDataConstructElemFaceMatrix(MPI_Comm comm, MLI_FEData *fedata, MLI_Matrix **mli_mat ) { int nLocal, nFaces, nElems, i, j, rows, nFacesExt; int elemOffset, faceOffset, *elemIDs, *rowLengs; int ncols, cols[8]; double values[8]; char param_string[100], *targv[2]; HYPRE_IJMatrix IJMat; MLI_Function *funcPtr; HYPRE_ParCSRMatrix *CSRMat; /* ------------------------------------------------------------ */ /* fetch number of elements, local faces, and element IDs */ /* ------------------------------------------------------------ */ fedata->getNumElements ( nElems ); fedata->getNumFaces ( nFaces ); targv[0] = (char *) &nFacesExt; strcpy(param_string, "getNumExtFaces"); fedata->impSpecificRequests( param_string, 1, targv ); nLocal = nFaces - nFacesExt; elemIDs = new int [ nElems ]; fedata->getElemBlockGlobalIDs ( nElems, elemIDs ); /* ------------------------------------------------------------ */ /* fetch element and face offsets */ /* ------------------------------------------------------------ */ strcpy(param_string, "getElemOffset"); targv[0] = (char *) &elemOffset; fedata->impSpecificRequests(param_string, 1, targv); strcpy(param_string, "getFaceOffset"); targv[0] = (char *) &faceOffset; fedata->impSpecificRequests(param_string, 1, targv); /* ------------------------------------------------------------ */ /* create HYPRE IJ matrix */ /* ------------------------------------------------------------ */ HYPRE_IJMatrixCreate(comm, elemOffset, elemOffset + nElems - 1, faceOffset, faceOffset + nLocal - 1 , &IJMat); HYPRE_IJMatrixSetObjectType(IJMat, HYPRE_PARCSR); rowLengs = new int[nElems]; fedata->getElemNumFaces( ncols ); for ( i = 0; i < nElems; i++ ) rowLengs[i] = ncols; HYPRE_IJMatrixSetRowSizes(IJMat, rowLengs); HYPRE_IJMatrixInitialize(IJMat); delete [] rowLengs; for ( i = 0; i < nElems; i++ ) { rows = i + elemOffset; fedata->getElemFaceList(elemIDs[i], ncols, cols); for( j = 0; j < ncols; j++ ) values[j] = 1.; HYPRE_IJMatrixSetValues(IJMat, 1, &ncols, &rows, cols, values); } delete [] elemIDs; HYPRE_IJMatrixAssemble(IJMat); /* ------------------------------------------------------------ */ /* fetch and return matrix */ /* ------------------------------------------------------------ */ HYPRE_IJMatrixGetObject(IJMat, (void **) &CSRMat); HYPRE_IJMatrixSetObjectType(IJMat, -1); HYPRE_IJMatrixDestroy(IJMat); funcPtr = new MLI_Function(); MLI_Utils_HypreParCSRMatrixGetDestroyFunc(funcPtr); sprintf(param_string, "HYPRE_ParCSR" ); (*mli_mat) = new MLI_Matrix( CSRMat, param_string, funcPtr ); } /************************************************************************** * Function : MLI_FEDataConstructFaceNodeMatrix * Purpose : Form face to node connectivity matrix * Inputs : FEData * Outputs : face-node matrix *-----------------------------------------------------------------------*/ void MLI_FEDataConstructFaceNodeMatrix(MPI_Comm comm, MLI_FEData *fedata, MLI_Matrix **mli_mat ) { int nfaces, lfaces, efaces, nlocal, i, j, rows; int faceOffset, nodeOffset, *elemIDs, *rowLengs, ncols; int cols[8], nNodesExt; double values[8]; char param_string[100], *targv[2]; HYPRE_IJMatrix IJMat; MLI_Function *funcPtr; HYPRE_ParCSRMatrix *CSRMat; /* ------------------------------------------------------------ */ /* fetch number of faces, local nodes, and face IDs */ /* ------------------------------------------------------------ */ fedata->getNumFaces ( nfaces ); targv[0] = (char *) &efaces; strcpy(param_string, "getNumExtFaces"); fedata->impSpecificRequests( param_string, 1, targv ); lfaces = nfaces - efaces; fedata->getNumNodes ( nlocal ); targv[0] = (char *) &nNodesExt; strcpy(param_string, "getNumExtNodes"); fedata->impSpecificRequests( param_string, 1, targv ); nlocal = nlocal - nNodesExt; elemIDs = new int [ nfaces ]; fedata->getFaceBlockGlobalIDs ( nfaces, elemIDs ); /* ------------------------------------------------------------ */ /* fetch face and node offsets */ /* ------------------------------------------------------------ */ strcpy(param_string, "getFaceOffset"); targv[0] = (char *) &faceOffset; fedata->impSpecificRequests(param_string, 1, targv); strcpy(param_string, "getNodeOffset"); targv[0] = (char *) &nodeOffset; fedata->impSpecificRequests(param_string, 1, targv); /* ------------------------------------------------------------ */ /* create HYPRE IJ matrix */ /* ------------------------------------------------------------ */ HYPRE_IJMatrixCreate(comm, faceOffset, faceOffset + lfaces - 1, nodeOffset, nodeOffset + nlocal - 1 , &IJMat); HYPRE_IJMatrixSetObjectType(IJMat, HYPRE_PARCSR); rowLengs = new int[lfaces]; fedata->getFaceNumNodes( ncols ); for ( i = 0; i < lfaces; i++ ) rowLengs[i] = ncols; HYPRE_IJMatrixSetRowSizes(IJMat, rowLengs); HYPRE_IJMatrixInitialize(IJMat); delete [] rowLengs; for ( i = 0; i < lfaces; i++ ) { rows = i + faceOffset; fedata->getFaceNodeList(elemIDs[i], ncols, cols); for ( j = 0; j < ncols; j++ ) values[j] = 1.; HYPRE_IJMatrixSetValues(IJMat, 1, &ncols, &rows, cols, values); } delete [] elemIDs; HYPRE_IJMatrixAssemble(IJMat); /* ------------------------------------------------------------ */ /* fetch and return matrix */ /* ------------------------------------------------------------ */ HYPRE_IJMatrixGetObject(IJMat, (void **) &CSRMat); HYPRE_IJMatrixSetObjectType(IJMat, -1); HYPRE_IJMatrixDestroy(IJMat); funcPtr = new MLI_Function(); MLI_Utils_HypreParCSRMatrixGetDestroyFunc(funcPtr); sprintf(param_string, "HYPRE_ParCSR" ); (*mli_mat) = new MLI_Matrix( CSRMat, param_string, funcPtr ); } /************************************************************************** * Function : MLI_FEDataConstructNodeElemMatrix * Purpose : Form node to element connectivity matrix * Inputs : FEData * Outputs : node-element matrix *-----------------------------------------------------------------------*/ void MLI_FEDataConstructNodeElemMatrix(MPI_Comm comm, MLI_FEData *fedata, MLI_Matrix **mli_mat ) { int i, j, k, nElems, nNodes, nLocal, nNodesExt; int **cols, elemOffset, nodeOffset, *elemIDs, *ncols; int *nodeList, mypid, elemNNodes, *rowLengs, rowInd; double values[100]; char param_string[100], *targv[2]; HYPRE_IJMatrix IJMat; MLI_Function *funcPtr; HYPRE_ParCSRMatrix *CSRMat; /* ------------------------------------------------------------ */ /* fetch number of elements, local nodes, and element IDs */ /* ------------------------------------------------------------ */ MPI_Comm_rank( comm, &mypid ); fedata->getNumNodes( nNodes ); targv[0] = (char *) &nNodesExt; strcpy(param_string, "getNumExtNodes"); fedata->impSpecificRequests( param_string, 1, targv ); nLocal = nNodes - nNodesExt; fedata->getNumElements( nElems ); elemIDs = new int[nElems]; fedata->getElemBlockGlobalIDs( nElems, elemIDs ); /* ------------------------------------------------------------ */ /* fetch element and node offsets */ /* ------------------------------------------------------------ */ strcpy(param_string, "getElemOffset"); targv[0] = (char *) &elemOffset; fedata->impSpecificRequests(param_string, 1, targv); strcpy(param_string, "getNodeOffset"); targv[0] = (char *) &nodeOffset; fedata->impSpecificRequests(param_string, 1, targv); /* ------------------------------------------------------------ */ /* Update ncols and cols for shared nodes */ /* ------------------------------------------------------------ */ rowLengs = new int[nNodes]; ncols = new int[nNodes]; cols = new int*[nNodes]; for ( i = 0; i < nNodes; i++ ) rowLengs[i] = 0; fedata->getElemNumNodes( elemNNodes ); if ( elemNNodes > 0 ) nodeList = new int[elemNNodes]; else nodeList = NULL; for( i = 0; i < nElems; i++ ) { fedata->getElemNodeList(elemIDs[i], elemNNodes, nodeList); for( j = 0; j < elemNNodes; j++ ) rowLengs[fedata->searchNode(nodeList[j])]++; } for ( i = 0; i < nNodes; i++ ) { cols[i] = new int[rowLengs[i]]; ncols[i] = 0; } for ( i = 0; i < nElems; i++ ) { fedata->getElemNodeList(elemIDs[i], elemNNodes, nodeList); for ( j = 0; j < elemNNodes; j++ ) { k = fedata->searchNode(nodeList[j]); cols[k][ncols[k]++] = i + elemOffset; } } strcpy(param_string, "updateNodeElemMatrix"); targv[0] = (char *) rowLengs; targv[1] = (char *) cols; fedata->impSpecificRequests(param_string, 2, targv); /* ------------------------------------------------------------ */ /* create HYPRE IJ matrix */ /* ------------------------------------------------------------ */ HYPRE_IJMatrixCreate(comm, nodeOffset, nodeOffset + nLocal - 1, elemOffset, elemOffset + nElems - 1 , &IJMat); HYPRE_IJMatrixSetObjectType(IJMat, HYPRE_PARCSR); HYPRE_IJMatrixSetRowSizes(IJMat, rowLengs); HYPRE_IJMatrixInitialize(IJMat); for ( i = 0; i < nLocal; i++ ) { rowInd = i + nodeOffset; for ( j = 0; j < rowLengs[i]; j++ ) values[j] = 1.; HYPRE_IJMatrixSetValues(IJMat,1,rowLengs+i,&rowInd,cols[i],values); } HYPRE_IJMatrixAssemble(IJMat); if ( nElems > 0 ) delete [] elemIDs; if ( elemNNodes > 0 ) delete [] nodeList; if ( nNodes > 0 ) delete [] rowLengs; if ( nNodes > 0 ) delete [] ncols; for ( i = 0; i < nNodes; i++ ) delete [] cols[i]; delete [] cols; /* ------------------------------------------------------------ */ /* fetch and return matrix */ /* ------------------------------------------------------------ */ HYPRE_IJMatrixGetObject(IJMat, (void **) &CSRMat); HYPRE_IJMatrixSetObjectType(IJMat, -1); HYPRE_IJMatrixDestroy(IJMat); funcPtr = new MLI_Function(); MLI_Utils_HypreParCSRMatrixGetDestroyFunc(funcPtr); sprintf(param_string, "HYPRE_ParCSR" ); (*mli_mat) = new MLI_Matrix( CSRMat, param_string, funcPtr ); } /************************************************************************** * Function : MLI_FEDataConstructFaceElemMatrix * Purpose : Form face to element connectivity matrix * Inputs : FEData * Outputs : face-element matrix *-----------------------------------------------------------------------*/ void MLI_FEDataConstructFaceElemMatrix(MPI_Comm comm, MLI_FEData *fedata, MLI_Matrix **mli_mat ) { int i, j, k, n, nElems, nfaces, nlocal, nFacesExt, rows; int elemOffset, faceOffset, *elemIDs, *nncols, *ncols, face[8]; int **cols; double values[100]; char param_string[100], *targv[2]; HYPRE_IJMatrix IJMat; MLI_Function *funcPtr; HYPRE_ParCSRMatrix *CSRMat; /* ------------------------------------------------------------ */ /* fetch number of elements, local nodes, and element IDs */ /* ------------------------------------------------------------ */ fedata->getNumFaces ( nlocal ); targv[0] = (char *) &nFacesExt; strcpy(param_string, "getNumExtFaces"); fedata->impSpecificRequests( param_string, 1, targv ); nlocal = nlocal - nFacesExt; fedata->getNumElements ( nElems ); elemIDs = new int [ nElems ]; fedata->getElemBlockGlobalIDs ( nElems, elemIDs ); /* ------------------------------------------------------------ */ /* fetch element and face offsets */ /* ------------------------------------------------------------ */ strcpy(param_string, "getElemOffset"); targv[0] = (char *) &elemOffset; fedata->impSpecificRequests(param_string, 1, targv); strcpy(param_string, "getFaceOffset"); targv[0] = (char *) &faceOffset; fedata->impSpecificRequests(param_string, 1, targv); /* ------------------------------------------------------------ */ /* Update ncols and cols for shared nodes */ /* ------------------------------------------------------------ */ nfaces = nlocal + nFacesExt; ncols = new int [nfaces]; nncols = new int [nfaces]; cols = new int*[nfaces]; for ( i = 0; i < nfaces; i++ ) ncols[i] = 0; fedata->getElemNumFaces(n); for ( i = 0; i < nElems; i++ ) { fedata->getElemFaceList(elemIDs[i], n, face); for ( j = 0; j < n; j++ ) ncols[fedata->searchFace(face[j])]++; } for ( i = 0; i < nfaces; i++ ) { cols[i] = new int[ncols[i]]; nncols[i] = 0; } for ( i = 0; i < nElems; i++ ) { fedata->getElemFaceList(elemIDs[i], n, face); for ( j = 0; j < n; j++ ) { k = fedata->searchFace(face[j]); cols[k][nncols[k]++] = i + elemOffset; } } strcpy(param_string, "updateFaceElemMatrix"); targv[0] = (char *) ncols; targv[1] = (char *) cols; fedata->impSpecificRequests(param_string, 2, targv); /* ------------------------------------------------------------ */ /* create HYPRE IJ matrix */ /* ------------------------------------------------------------ */ HYPRE_IJMatrixCreate(comm, faceOffset, faceOffset + nlocal - 1, elemOffset, elemOffset + nElems - 1 , &IJMat); HYPRE_IJMatrixSetObjectType(IJMat, HYPRE_PARCSR); HYPRE_IJMatrixSetRowSizes(IJMat, ncols); HYPRE_IJMatrixInitialize(IJMat); for ( i = 0; i < nlocal; i++ ) { rows = i + faceOffset; for ( j = 0; j < ncols[i]; j++ ) values[j] = 1.; HYPRE_IJMatrixSetValues(IJMat, 1, ncols+i, &rows, cols[i], values); } HYPRE_IJMatrixAssemble(IJMat); delete [] elemIDs; delete [] ncols; delete [] nncols; for ( i = 0; i < nfaces; i++ ) delete [] cols[i]; delete [] cols; /* ------------------------------------------------------------ */ /* fetch and return matrix */ /* ------------------------------------------------------------ */ HYPRE_IJMatrixGetObject(IJMat, (void **) &CSRMat); HYPRE_IJMatrixSetObjectType(IJMat, -1); HYPRE_IJMatrixDestroy(IJMat); funcPtr = new MLI_Function(); MLI_Utils_HypreParCSRMatrixGetDestroyFunc(funcPtr); sprintf(param_string, "HYPRE_ParCSR" ); (*mli_mat) = new MLI_Matrix( CSRMat, param_string, funcPtr ); } /************************************************************************** * Function : MLI_FEDataConstructNodeFaceMatrix * Purpose : Form node to face connectivity matrix * Inputs : FEData * Outputs : node-face matrix *-----------------------------------------------------------------------*/ void MLI_FEDataConstructNodeFaceMatrix(MPI_Comm comm, MLI_FEData *fedata, MLI_Matrix **mli_mat ) { int i, j, k, n, nfaces, nNodes, nlocal, nNodesExt, **cols, rows; int faceOffset, nodeOffset, efaces, *nncols, *ncols, node[8]; double values[100]; char param_string[100], *targv[2]; HYPRE_IJMatrix IJMat; MLI_Function *funcPtr; HYPRE_ParCSRMatrix *CSRMat; /* ------------------------------------------------------------ */ /* fetch number of faces, local nodes, and face IDs */ /* ------------------------------------------------------------ */ fedata->getNumNodes( nlocal ); targv[0] = (char *) &nNodesExt; strcpy(param_string, "getNumExtNodes"); fedata->impSpecificRequests( param_string, 1, targv ); nlocal = nlocal - nNodesExt; fedata->getNumFaces( nfaces ); targv[0] = (char *) &efaces; strcpy(param_string, "getNumExtFaces"); fedata->impSpecificRequests( param_string, 1, targv ); nfaces = nfaces - efaces; int *faceIDs = new int [ nfaces ]; fedata->getFaceBlockGlobalIDs ( nfaces, faceIDs ); /* ------------------------------------------------------------ */ /* fetch node and face offsets */ /* ------------------------------------------------------------ */ strcpy(param_string, "getFaceOffset"); targv[0] = (char *) &faceOffset; fedata->impSpecificRequests(param_string, 1, targv); strcpy(param_string, "getNodeOffset"); targv[0] = (char *) &nodeOffset; fedata->impSpecificRequests(param_string, 1, targv); /* ------------------------------------------------------------ */ /* Update ncols and cols for shared nodes */ /* update_node_elements again since the info is in the args */ /* ------------------------------------------------------------ */ nNodes = nlocal + nNodesExt; ncols = new int [nNodes]; nncols = new int [nNodes]; cols = new int*[nNodes]; for ( i = 0; i < nNodes; i++ ) ncols[i] = 0; fedata->getFaceNumNodes(n); for(i=0; igetFaceNodeList(faceIDs[i], n, node); for ( j = 0; j < n; j++ ) ncols[fedata->searchNode(node[j])]++; } for ( i = 0; i < nNodes; i++ ) { cols[i] = new int[ncols[i]]; nncols[i] = 0; } for ( i = 0; i < nfaces; i++ ) { fedata->getFaceNodeList(faceIDs[i], n, node); for ( j = 0; j < n; j++ ) { k = fedata->searchNode(node[j]); cols[k][nncols[k]++] = i + faceOffset; } } strcpy(param_string, "updateNodeElemMatrix"); targv[0] = (char *) ncols; targv[1] = (char *) cols; fedata->impSpecificRequests(param_string, 2, targv); /* ------------------------------------------------------------ */ /* create HYPRE IJ matrix */ /* ------------------------------------------------------------ */ HYPRE_IJMatrixCreate(comm, nodeOffset, nodeOffset + nlocal - 1, faceOffset, faceOffset + nfaces - 1 , &IJMat); HYPRE_IJMatrixSetObjectType(IJMat, HYPRE_PARCSR); HYPRE_IJMatrixSetRowSizes(IJMat, ncols); HYPRE_IJMatrixInitialize(IJMat); for ( i = 0; i < nlocal; i++ ) { rows = i + nodeOffset; for ( j = 0; j < ncols[i]; j++ ) values[j] = 1.; HYPRE_IJMatrixSetValues(IJMat, 1, ncols+i, &rows, cols[i], values); } HYPRE_IJMatrixAssemble(IJMat); delete [] faceIDs; delete [] ncols; delete [] nncols; for ( i = 0; i < nNodes; i++ ) delete [] cols[i]; delete [] cols; /* ------------------------------------------------------------ */ /* fetch and return matrix */ /* ------------------------------------------------------------ */ HYPRE_IJMatrixGetObject(IJMat, (void **) &CSRMat); HYPRE_IJMatrixSetObjectType(IJMat, -1); HYPRE_IJMatrixDestroy(IJMat); funcPtr = new MLI_Function(); MLI_Utils_HypreParCSRMatrixGetDestroyFunc(funcPtr); sprintf(param_string, "HYPRE_ParCSR" ); (*mli_mat) = new MLI_Matrix( CSRMat, param_string, funcPtr ); } /************************************************************************* * Function : MLI_FEDataAgglomerateElemsLocal * Purpose : Form macroelements * Inputs : element-element matrix * Outputs : macro-element labels *-----------------------------------------------------------------------*/ void MLI_FEDataAgglomerateElemsLocal(MLI_Matrix *elemMatrix, int **macroLabelsOut) { int mypid, nprocs, startElem, endElem, localNElems; int ii, jj, *partition, nextElem, neighCnt, minNeighs; int *macroLabels, *denseRow, *denseRow2, *noRoot; int *macroIA, *macroJA, *macroAA, nMacros, *macroLists; int parent, macroNnz, loopFlag, curWeight, curIndex; int rowNum, rowLeng, *cols, count, colIndex; int maxWeight, elemCount, elemIndex, macroNumber; int connects, secondChance; double *vals; MPI_Comm comm; hypre_ParCSRMatrix *hypreEE; /*----------------------------------------------------------------- * fetch machine and matrix parameters *-----------------------------------------------------------------*/ hypreEE = (hypre_ParCSRMatrix *) elemMatrix->getMatrix(); comm = hypre_ParCSRMatrixComm(hypreEE); MPI_Comm_rank(comm,&mypid); MPI_Comm_size(comm,&nprocs); HYPRE_ParCSRMatrixGetRowPartitioning((HYPRE_ParCSRMatrix) hypreEE, &partition); startElem = partition[mypid]; endElem = partition[mypid+1] - 1; localNElems = endElem - startElem + 1; free( partition ); macroLabels = NULL; noRoot = NULL; denseRow = NULL; denseRow2 = NULL; macroIA = NULL; macroJA = NULL; macroAA = NULL; /* ------------------------------------------------------------------- */ /* this array is used to determine which element has been agglomerated */ /* and which macroelement the current element belongs to */ /* ------------------------------------------------------------------- */ macroLabels = hypre_TAlloc(int, localNElems , HYPRE_MEMORY_HOST); for ( ii = 0; ii < localNElems; ii++ ) macroLabels[ii] = -1; /* ------------------------------------------------------------------- */ /* this array is used to indicate which element has been used as root */ /* for agglomeration so that no duplication will be done. */ /* ------------------------------------------------------------------- */ noRoot = hypre_TAlloc(int, localNElems , HYPRE_MEMORY_HOST); for ( ii = 0; ii < localNElems; ii++ ) noRoot[ii] = 0; /* ------------------------------------------------------------------- */ /* These array are used to expand a sparse row into a full row */ /* (denseRow is used to register information for already agglomerated */ /* elements while denseRow2 is used to register information for */ /* possible macroelement). */ /* ------------------------------------------------------------------- */ denseRow = hypre_TAlloc(int, localNElems , HYPRE_MEMORY_HOST); denseRow2 = hypre_TAlloc(int, localNElems , HYPRE_MEMORY_HOST); for ( ii = 0; ii < localNElems; ii++ ) denseRow[ii] = denseRow2[ii] = 0; /* ------------------------------------------------------------------- */ /* These arrays are needed to find neighbor element for agglomeration */ /* that preserves nice geometric shapes */ /* ------------------------------------------------------------------- */ macroIA = hypre_TAlloc(int, (localNElems/3+1) , HYPRE_MEMORY_HOST); macroJA = hypre_TAlloc(int, (localNElems/3+1) * 216 , HYPRE_MEMORY_HOST); macroAA = hypre_TAlloc(int, (localNElems/3+1) * 216 , HYPRE_MEMORY_HOST); /* ------------------------------------------------------------------- */ /* allocate memory for the output data (assume no more than 60 elements*/ /* in any macroelements */ /* ------------------------------------------------------------------- */ nMacros = 0; macroLists = hypre_TAlloc(int, 60 , HYPRE_MEMORY_HOST); /* ------------------------------------------------------------------- */ /* search for initial element (one with least number of neighbors) */ /* ------------------------------------------------------------------- */ nextElem = -1; minNeighs = 10000; for ( ii = 0; ii < localNElems; ii++ ) { rowNum = startElem + ii; hypre_ParCSRMatrixGetRow(hypreEE,rowNum,&rowLeng,&cols,NULL); neighCnt = 0; for ( jj = 0; jj < rowLeng; jj++ ) if ( cols[jj] >= startElem && cols[jj] < endElem ) neighCnt++; if ( neighCnt < minNeighs ) { minNeighs = neighCnt; nextElem = ii; } hypre_ParCSRMatrixRestoreRow(hypreEE,rowNum,&rowLeng,&cols,NULL); } /* ------------------------------------------------------------------- */ /* loop through all elements for agglomeration */ /* ------------------------------------------------------------------- */ if ( nextElem == -1 ) loopFlag = 0; else loopFlag = 1; parent = -1; macroIA[0] = 0; macroNnz = 0; while ( loopFlag ) { if ( macroLabels[nextElem] < 0 ) { /* ------------------------------------------------------------- */ /* update the current macroelement connectivity row */ /* ------------------------------------------------------------- */ for ( ii = 0; ii < localNElems; ii++ ) denseRow2[ii] = denseRow[ii]; /* ------------------------------------------------------------- */ /* load row nextElem into denseRow, keeping track of max weight */ /* ------------------------------------------------------------- */ curWeight = 0; curIndex = -1; rowNum = nextElem + startElem; hypre_ParCSRMatrixGetRow(hypreEE,rowNum,&rowLeng,&cols,&vals); for ( ii = 0; ii < rowLeng; ii++ ) { colIndex = cols[ii] - startElem; if ( colIndex >= 0 && colIndex < localNElems && denseRow2[colIndex] >= 0 ) { denseRow2[colIndex] = (int) vals[ii]; if ( ((int) vals[ii]) > curWeight ) { curWeight = (int) vals[ii]; curIndex = cols[ii]; } } } /* ------------------------------------------------------------- */ /* if there is a parent macroelement to the root element, do the */ /* following : */ /* 1. find how many links between the selected neighbor element */ /* and the parent element (there may be none) */ /* 2. search for other neighbor elements to see if they have the */ /* same links to the root element but which is more connected */ /* to the parent element, and select it */ /* ------------------------------------------------------------- */ if ( parent >= 0 ) { connects = 0; for ( jj = macroIA[parent]; jj < macroIA[parent+1]; jj++ ) if ( macroJA[jj] == curIndex ) {connects = macroAA[jj]; break;} for ( ii = 0; ii < rowLeng; ii++ ) { colIndex = cols[ii] - startElem; if ( colIndex >= 0 && colIndex < localNElems ) { if (((int) vals[ii]) == curWeight && colIndex != curIndex) { for (jj = macroIA[parent]; jj < macroIA[parent+1]; jj++) { if (macroJA[jj] == colIndex && macroAA[jj] > connects) { curWeight = (int) vals[ii]; curIndex = cols[ii]; break; } } } } } } hypre_ParCSRMatrixRestoreRow(hypreEE,rowNum,&rowLeng,&cols,&vals); /* store the element on the macroelement list */ elemCount = 0; maxWeight = 0; macroLists[elemCount++] = nextElem; denseRow2[nextElem] = -1; /* grab the neighboring elements */ /*while ( elemCount < 8 || curWeight > maxWeight )*/ secondChance = 0; while ( curWeight > maxWeight || secondChance == 0 ) { /* if decent macroelement is unlikely to be formed, exit */ if ( elemCount == 1 && curWeight < 4 ) break; if ( elemCount == 2 && curWeight < 6 ) break; if ( elemCount > 2 && curWeight <= 6 ) break; /* otherwise include this element in the list */ if ( curWeight <= maxWeight ) secondChance = 1; maxWeight = curWeight; macroLists[elemCount++] = curIndex; denseRow2[curIndex] = - 1; /* update the macroelement connectivity */ rowNum = startElem + curIndex; hypre_ParCSRMatrixGetRow(hypreEE,rowNum,&rowLeng,&cols,&vals); for ( ii = 0; ii < rowLeng; ii++ ) { colIndex = cols[ii] - startElem; if (colIndex >= 0 && colIndex < localNElems && denseRow2[colIndex] >= 0) denseRow2[colIndex] += (int) vals[ii]; } hypre_ParCSRMatrixRestoreRow(hypreEE,rowNum,&rowLeng,&cols,&vals); /* search for next element to agglomerate (max connectivity) */ curWeight = 0; curIndex = -1; for ( ii = 0; ii < localNElems; ii++ ) { if (denseRow2[ii] > curWeight) { curWeight = denseRow2[ii]; curIndex = ii; } } /* if more than one with same weight, use other criterion */ if ( curIndex >= 0 && parent >= 0 ) { for ( jj = macroIA[parent]; jj < macroIA[parent+1]; jj++ ) if ( macroJA[jj] == curIndex ) connects = macroAA[jj]; for ( ii = 0; ii < localNElems; ii++ ) { if (denseRow2[ii] == curWeight && ii != curIndex ) { for ( jj = macroIA[parent]; jj < macroIA[parent+1]; jj++ ) { if ( macroJA[jj] == ii && macroAA[jj] > connects ) { curWeight = denseRow2[ii]; curIndex = ii; break; } } } } } } /* if decent macroelement has been found, validate it */ if ( elemCount > 60 ) { printf("Element Agglomeration : elemCount . 60.\n"); exit(1); } if ( elemCount >= 4 ) { for ( jj = 0; jj < elemCount; jj++ ) { elemIndex = macroLists[jj]; macroLabels[elemIndex] = nMacros; denseRow2[elemIndex] = -1; noRoot[elemIndex] = 1; } for ( jj = 0; jj < localNElems; jj++ ) denseRow[jj] = denseRow2[jj]; for ( jj = 0; jj < localNElems; jj++ ) { if ( denseRow[jj] > 0 ) { macroJA[macroNnz] = jj; macroAA[macroNnz++] = denseRow[jj]; } } parent = nMacros++; macroIA[nMacros] = macroNnz; } else { noRoot[nextElem] = 1; denseRow[nextElem] = 0; if ( parent >= 0 ) { for ( ii = macroIA[parent]; ii < macroIA[parent+1]; ii++ ) { jj = macroJA[ii]; if (noRoot[jj] == 0) denseRow[jj] = macroAA[ii]; } } } /* search for the root of the next macroelement */ maxWeight = 0; nextElem = -1; for ( jj = 0; jj < localNElems; jj++ ) { if ( denseRow[jj] > 0 ) { if ( denseRow[jj] > maxWeight ) { maxWeight = denseRow[jj]; nextElem = jj; } denseRow[jj] = 0; } } if ( nextElem == -1 ) { parent = -1; for ( jj = 0; jj < localNElems; jj++ ) if (macroLabels[jj] < 0 && noRoot[jj] == 0) { nextElem = jj; break; } } if ( nextElem == -1 ) loopFlag = 0; } } /* if there are still leftovers, put them into adjacent macroelement * or form their own, if neighbor macroelement not found */ loopFlag = 1; while ( loopFlag ) { count = 0; for ( ii = 0; ii < localNElems; ii++ ) { if ( macroLabels[ii] < 0 ) { rowNum = startElem + ii; hypre_ParCSRMatrixGetRow(hypreEE,rowNum,&rowLeng,&cols,&vals); for ( jj = 0; jj < rowLeng; jj++ ) { colIndex = cols[jj] - startElem; if ( colIndex >= 0 && colIndex < localNElems ) { macroNumber = macroLabels[colIndex]; if ( ((int) vals[jj]) >= 4 && macroNumber >= 0 ) { macroLabels[ii] = - macroNumber - 10; count++; break; } } } hypre_ParCSRMatrixRestoreRow(hypreEE,rowNum,&rowLeng,&cols,&vals); } } for ( ii = 0; ii < localNElems; ii++ ) { if ( macroLabels[ii] <= -10 ) macroLabels[ii] = - macroLabels[ii] - 10; } if ( count == 0 ) loopFlag = 0; } /* finally lone zones will be all by themselves */ for ( ii = 0; ii < localNElems; ii++ ) { if ( macroLabels[ii] < 0 ) /* element still has not been agglomerated */ macroLabels[ii] = nMacros++; } /* initialize the output arrays */ printf("number of macroelements = %d (%d) : %e\n", nMacros, localNElems, (double) localNElems/nMacros); if ( nMacros > localNElems/3 ) { printf("Element Agglomeration ERROR : too many macros (factor<3)\n"); exit(1); } (*macroLabelsOut) = macroLabels; free( macroLists ); free( macroIA ); free( macroJA ); free( macroAA ); free( denseRow ); free( denseRow2 ); free( noRoot ); } /************************************************************************* * Function : MLI_FEDataAgglomerateElemsLocalOld (Old version) * Purpose : Form macroelements * Inputs : element-element matrix * Outputs : macro-element labels *-----------------------------------------------------------------------*/ void MLI_FEDataAgglomerateElemsLocalOld(MLI_Matrix *elemMatrix, int **macroLabelsOut) { hypre_ParCSRMatrix *hypreEE; MPI_Comm comm; int mypid, nprocs, *partition, startElem, endElem; int localNElems, nMacros, *macroLabels, *macroSizes; int *macroList, ielem, jj, colIndex, *denseRow; int maxWeight, curWeight, curIndex, rowLeng, rowNum; int elemCount, elemIndex, macroNumber, *cols; double *vals; /*----------------------------------------------------------------- * fetch machine and matrix parameters *-----------------------------------------------------------------*/ hypreEE = (hypre_ParCSRMatrix *) elemMatrix->getMatrix(); comm = hypre_ParCSRMatrixComm(hypreEE); MPI_Comm_rank(comm,&mypid); MPI_Comm_size(comm,&nprocs); HYPRE_ParCSRMatrixGetRowPartitioning((HYPRE_ParCSRMatrix) hypreEE, &partition); startElem = partition[mypid]; endElem = partition[mypid+1] - 1; localNElems = endElem - startElem + 1; free( partition ); /*----------------------------------------------------------------- * this array is used to determine which element has been agglomerated *-----------------------------------------------------------------*/ macroLabels = hypre_TAlloc(int, localNElems , HYPRE_MEMORY_HOST); for ( ielem = 0; ielem < localNElems; ielem++ ) macroLabels[ielem] = -1; /*----------------------------------------------------------------- * this array is used to expand a sparse row into a full row *-----------------------------------------------------------------*/ denseRow = hypre_TAlloc(int, localNElems , HYPRE_MEMORY_HOST); for ( ielem = 0; ielem < localNElems; ielem++ ) denseRow[ielem] = 0; /*----------------------------------------------------------------- * allocate memory for the output data (assume no more than * 100 elements in any macroelements *-----------------------------------------------------------------*/ nMacros = 0; macroSizes = hypre_TAlloc(int, localNElems/2 , HYPRE_MEMORY_HOST); macroList = hypre_TAlloc(int, 100 , HYPRE_MEMORY_HOST); /*----------------------------------------------------------------- * loop through all elements for agglomeration *-----------------------------------------------------------------*/ for ( ielem = 0; ielem < localNElems; ielem++ ) { if ( macroLabels[ielem] < 0 ) /* element has not been agglomerated */ { maxWeight = 0; curWeight = 0; curIndex = -1; /* load row ielem into denseRow, keeping track of maximum weight */ rowNum = startElem + ielem; hypre_ParCSRMatrixGetRow(hypreEE,rowNum,&rowLeng,&cols,&vals); for ( jj = 0; jj < rowLeng; jj++ ) { colIndex = cols[jj] - startElem; if ( colIndex >= 0 && colIndex < localNElems ) { if ( denseRow[colIndex] >= 0 && colIndex != ielem ) { denseRow[colIndex] = (int) vals[jj]; if ( ((int) vals[jj]) > curWeight ) { curWeight = (int) vals[jj]; curIndex = colIndex; } } } } hypre_ParCSRMatrixRestoreRow(hypreEE,rowNum,&rowLeng,&cols,&vals); /* begin agglomeration using element ielem as root */ elemCount = 0; macroList[elemCount++] = ielem; denseRow[ielem] = -1; while (curWeight >= 4 && curWeight > maxWeight && elemCount < 100) { maxWeight = curWeight; macroList[elemCount++] = curIndex; denseRow[curIndex] = -1; rowNum = startElem + curIndex; hypre_ParCSRMatrixGetRow(hypreEE,rowNum,&rowLeng,&cols,&vals); for ( jj = 0; jj < rowLeng; jj++ ) { colIndex = cols[jj] - startElem; if ( colIndex >= 0 && colIndex < localNElems ) { if ( denseRow[colIndex] >= 0 ) { denseRow[colIndex] += (int) vals[jj]; if ( ((int) denseRow[colIndex]) > curWeight ) { curWeight = denseRow[colIndex]; curIndex = colIndex; } } } } hypre_ParCSRMatrixRestoreRow(hypreEE,rowNum,&rowLeng,&cols,&vals); } /* if macroelement has size > 1, register it and reset denseRow */ if ( elemCount >= 4 ) { for ( jj = 0; jj < elemCount; jj++ ) { elemIndex = macroList[jj]; macroLabels[elemIndex] = nMacros; #if 0 printf("Macroelement %4d has element %4d\n",nMacros,elemIndex); #endif } for ( jj = 0; jj < localNElems; jj++ ) if ( denseRow[jj] > 0 ) denseRow[jj] = 0; macroSizes[nMacros++] = elemCount; } else denseRow[ielem] = 0; } } /*----------------------------------------------------------------- * if there are still leftovers, put them into adjacent macroelement *-----------------------------------------------------------------*/ for ( ielem = 0; ielem < localNElems; ielem++ ) { if ( macroLabels[ielem] < 0 ) /* not been agglomerated */ { rowNum = startElem + ielem; hypre_ParCSRMatrixGetRow(hypreEE,rowNum,&rowLeng,&cols,&vals); curIndex = -1; maxWeight = 3; for ( jj = 0; jj < rowLeng; jj++ ) { colIndex = cols[jj] - startElem; if ( colIndex >= 0 && colIndex < localNElems ) { macroNumber = macroLabels[colIndex]; if ( macroNumber > 0 && vals[jj] > maxWeight ) { maxWeight = (int) vals[jj]; curIndex = macroNumber; } } } hypre_ParCSRMatrixRestoreRow(hypreEE,rowNum,&rowLeng,&cols,&vals); if ( curIndex >= 0 ) macroLabels[ielem] = curIndex; } } /*----------------------------------------------------------------- * finally lone zones will be all by themselves *-----------------------------------------------------------------*/ for ( ielem = 0; ielem < localNElems; ielem++ ) { if ( macroLabels[ielem] < 0 ) /* still has not been agglomerated */ { macroSizes[nMacros] = 1; macroLabels[ielem] = nMacros++; } } /*----------------------------------------------------------------- * initialize the output arrays *-----------------------------------------------------------------*/ printf("number of macroelements = %d (%d) : %e\n", nMacros, localNElems, (double) localNElems/nMacros); (*macroLabelsOut) = macroLabels; free( macroList ); free( macroSizes ); free( denseRow ); } hypre-2.33.0/src/FEI_mv/femli/mli_fedata_utils.h000066400000000000000000000031301477326011500213770ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /************************************************************************** ************************************************************************** * MLI_FEData utilities functions ************************************************************************** **************************************************************************/ #include #include #include "HYPRE.h" #include "_hypre_parcsr_mv.h" #include "mli_fedata.h" #include "mli_matrix.h" /************************************************************************** * functions *-----------------------------------------------------------------------*/ void MLI_FEDataConstructElemNodeMatrix(MPI_Comm, MLI_FEData*, MLI_Matrix**); void MLI_FEDataConstructElemFaceMatrix(MPI_Comm, MLI_FEData*, MLI_Matrix**); void MLI_FEDataConstructFaceNodeMatrix(MPI_Comm, MLI_FEData*, MLI_Matrix**); void MLI_FEDataConstructNodeElemMatrix(MPI_Comm, MLI_FEData*, MLI_Matrix**); void MLI_FEDataConstructFaceElemMatrix(MPI_Comm, MLI_FEData*, MLI_Matrix**); void MLI_FEDataConstructNodeFaceMatrix(MPI_Comm, MLI_FEData*, MLI_Matrix**); void MLI_FEDataAgglomerateElemsLocal(MLI_Matrix *, int **macro_labels_out); void MLI_FEDataAgglomerateElemsLocalOld(MLI_Matrix *, int **macro_labels_out); hypre-2.33.0/src/FEI_mv/femli/mli_festruct.h000066400000000000000000001205501477326011500206000ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #ifndef __MLIFESTRUCTH__ #define __MLIFESTRUCTH__ /****************************************************************************/ /* class definition for abstract finite element structure */ /* (The design of this class attempts to follow the FEI 2.0 (Sandia) as */ /* closely as possible. Functions related to matrix and solver */ /* construction and utilization are removed. Additional finite element */ /* information (e.g. nodal coordinates, face information) have been added) */ /*--------------------------------------------------------------------------*/ class MLI_FEStruct { public : MLI_FEStruct() {} virtual ~MLI_FEStruct() {} // ========================================================================= // load general information // ========================================================================= /** set diagnostics level @param level - diagnostics level (0 or higher) */ virtual int setOutputLevel(int level) {(void) level; return -1;} /** set space dimension @param numDim - number of space dimension (3 for 3D) */ virtual int setSpaceDimension(int numDim) {(void) numDim; return -1;} /** set order of PDE @param pdeOrder - order of PDE (e.g. 2 for second order) */ virtual int setOrderOfPDE(int pdeOrder) {(void) pdeOrder; return -1;} /** set order of finite element discretization @param feOrder - order of FE discretization e.g. 2 for second order) */ virtual int setOrderOfFE(int feOrder) {(void) feOrder; return -1;} // ========================================================================= // initialization functions // ========================================================================= /** set the current element block to load @param blockID - choose blockID as current element block number (if not called, assume blockID=0) */ virtual int setCurrentElemBlockID(int blockID) {(void) blockID; return -1;} /** declare all field variables used in this context @param numFields - total number of fields @param fieldSizes - degree of freedom for each fieldID declared @param fieldIDs - a list of distinct field IDs */ virtual int initFields(int numFields, const int *fieldSizes, const int *fieldIDs) = 0; /** initialize element block information @param nElems - no. of elements in this block @param nNodesPerElem - no of nodes in each element in this block @param nodeNumFields - number of fields per node @param nodeFieldIDs - node field IDs @param elemNumFields - number of element fields @param elemFieldIDs - element field IDs */ virtual int initElemBlock(int nElems, int nNodesPerElem, int nodeNumFields, const int *nodeFieldIDs, int elemNumFields, const int *elemFieldIDs) = 0; /** initialize element connectivities @param nElems - no. of elements in this block @param eGlobalIDs - a list of global element IDs @param nNodesPerElem - no of nodes in each element in this block @param nGlobalIDLists - lists of node IDs for each element @param spaceDim - space dimension (e.g. 3 for 3D) @param coord - nodal coordinates (can be NULL) */ virtual int initElemBlockNodeLists(int nElems, const int *eGlobalIDs, int nNodesPerElem, const int* const *nGlobalIDLists, int spaceDim, const double* const *coord) = 0; /** initialize all shared nodes and which processors have them @param nNodes - number of shared nodes @param nGlobalIDs - IDs of shared nodes @param numProcs[i] - number of processors node i shares with @param procLists[i] - a list of processors to share node i */ virtual int initSharedNodes(int nNodes, int *nGlobalIDs, const int *numProcs, const int * const *procLists) {(void) nNodes; (void) nGlobalIDs; (void) numProcs; (void) procLists; return -1;} /** initialize the element face lists of all elements in local processors in the same order as the globalIDs list given above @param nElems - has to match nElems in loadElemBlock @param nFaces - number of faces for each element @param fGlobalIDs - lists of face global IDs for each element */ virtual int initElemBlockFaceLists(int nElems, int nFaces, const int* const *fGlobalIDLists) {(void) nElems; (void) nFaces; (void) fGlobalIDLists; return -1;} /** initialize node lists of all local faces @param nFaces - number of faces in local processor @param fGlobalIDs - a list of face global IDs @param nNodes - number of nodes each face has @param nGlobalIDLists[i] - node list of face fGlobalIDs[i] */ virtual int initFaceBlockNodeLists(int nFaces, const int *fGlobalIDs, int nNodes, const int * const *nGlobalIDLists) {(void) nFaces; (void) fGlobalIDs; (void) nNodes; (void) nGlobalIDLists; return -1;} /** initialize a list of faces that are shared with other processors @param nFaces - number of shared faces @param fGlobalIDs - IDs of shared faces @param numProcs[i] - number of processors face i shares with @param procLists[i] - a list of processors to share face i */ virtual int initSharedFaces(int nFaces, const int *fGlobalIDs, const int *numProcs, const int* const *procLists) {(void) nFaces; (void) fGlobalIDs; (void) numProcs; (void) procLists; return -1;} /** initialization complete */ virtual int initComplete() = 0; // ========================================================================= // load element information // ========================================================================= // ------------------------------------------------------------------------- // Collective loading : may mean excessive memory allocation // ------------------------------------------------------------------------- /** Load connectivity and stiffness matrices of all elements in local processor (collective loading for one element block) @params nElems - no. of elements in this block @params sMatDim - dimension of element matrices (for checking only) @params stiffMat - element matrices */ virtual int loadElemBlockMatrices(int nElems, int sMatDim, const double* const *stiffMat) {(void) nElems; (void) sMatDim; (void) stiffMat; return -1;} /** Load null spaces of all elements in local processors in the same order as the globalIDs list given above @param nElems - has to match nElems in loadElemBlock @param nNSpace - number of null space for each elements (it is an array as it may be different for different elements) @param sMatDim - number of unknowns for each element (for checking) @param nSpace - the null space information (column major) */ virtual int loadElemBlockNullSpaces(int nElems, const int *nNSpace, int sMatDim, const double* const *nSpace) {(void) nElems; (void) nNSpace; (void) sMatDim; (void) nSpace; return -1;} /** Load volumes of all elements in local processors in the same order as the globalIDs list given above @param nElems - has to match nElems in loadElemBlock @param elemVols - volume for each element in the list */ virtual int loadElemBlockVolumes(int nElems, const double *elemVols) {(void) nElems; (void) elemVols; return -1;} /** Load material type of all elements in local processors in the same order as the globalIDs list given above @param nElems - has to match nElems in loadElemBlock @param elemMaterials - material types for each element */ virtual int loadElemBlockMaterials(int nElems, const int *elemMaterial) {(void) nElems; (void) elemMaterial; return -1;} /** Load the element parent IDs of all elements in local processors in the same order as the globalIDs list given above @param nElems - has to match nElems in loadElemBlock @param pGlobalIDs - parent element global IDs for each element */ virtual int loadElemBlockParentIDs(int nElems, const int *pGlobalIDs) {(void) nElems; (void) pGlobalIDs; return -1;} /** Load the element loads (rhs) of all elements in local processors in the same order as the globalIDs list given above @param nElems - has to match nElems in loadElemBlock @param loadDim - length of each load vector (for checking only) @param elemLoads - right hand sides for each element */ virtual int loadElemBlockLoads(int nElems, int loadDim, const double* const *elemLoads) {(void) nElems; (void) loadDim; (void) elemLoads; return -1;} /** Load the element initial guess of all elements in local processors in the same order as the globalIDs list given above @param nElems - has to match nElems in loadElemBlock @param loadDim - length of each solution vector (for checking) @param elemSols - solution for each element */ virtual int loadElemBlockSolutions(int nElems, int solDim, const double* const *elemSols) {(void) nElems; (void) solDim; (void) elemSols; return -1;} /** Load element boundary conditions @param nElems - number of elements having boundary conditions @param eGlobalIDs - element global IDs @param elemDOF - element degree of freedom @param BCFlags - flag those DOFs that are BCs ('Y' for BCs) @param bcVals - boundary condition values (nElems values) */ virtual int loadElemBCs(int nElems, const int *eGlobalIDs, int elemDOF, const char *const *BCFlags, const double *const *bcVals) {(void) nElems; (void) eGlobalIDs; (void) elemDOF; (void) BCFlags; (void) bcVals; return -1;} // ------------------------------------------------------------------------- // These functions allows elements to be loaded individually. // This may be more memory efficient, but not CPU efficient (many searches) // ------------------------------------------------------------------------- /** Load element matrix @param eGlobalID - element global ID @param nNodesPerElem - number of nodes per element (for checking) @param nGlobalIDs - a list of nodes for the element @param sMatDim - dimension of the element matrix (for checking) @param stiffMat - element stiffness matrix (column major) */ virtual int loadElemMatrix(int eGlobalID, int nNodesPerElem, const int *nGlobalIDs, int sMatDim, const double *stiffMat) {(void) eGlobalID; (void) nNodesPerElem; (void) nGlobalIDs; (void) sMatDim; (void) stiffMat; return -1;} /** Load element null space @param eGlobalID - element global ID @param nNSpace - number of null space vectors in the element @param sMatDim - length of each null space (for checking) @param nSpace - null space stored in column major manner */ virtual int loadElemNullSpace(int eGlobalID, int nNSpace, int sMatDim, const double *nSpace) {(void) eGlobalID; (void) nNSpace; (void) sMatDim; (void) nSpace; return -1;} /** load element load @param eGlobalID - element global ID @param sMatDim - dimension of the load vector (for checking) @param elemLoad - the element load vector */ virtual int loadElemLoad(int eGlobalID, int sMatDim, const double *elemLoad) {(void) eGlobalID; (void) sMatDim; (void) elemLoad; return -1;} /** load element solution (initial guess) @param eGlobalID - element global ID @param sMatDim - dimension of the solution vector @param elemSol - the element solution vector */ virtual int loadElemSolution(int eGlobalID, int sMatDim, const double *elemSol) {(void) eGlobalID; (void) sMatDim; (void) elemSol; return -1;} /** load the function pointer to fetch element stiffness matrices @param object - object to pass back to function to get element matrices @param func - pointer to the function for getting element matrices */ virtual int loadFunc_getElemMatrix(void *object, int (*func) (int eGlobalID,int sMatDim,double *stiffMat)) {(void) object; (void) func; return -1;} // ========================================================================= // load node boundary conditions and share nodes // ========================================================================= /** load all node essential boundary conditions @param nNodes - number of BC nodes @param nGlobalIDs - IDs of boundary nodes @param nodeDOF - total DOF in a node (for checking only) @param BCFlags - flag those DOFs that are BCs ('Y' - BCs) @param bcVals - boundary condition values (nNodes values) */ virtual int loadNodeBCs(int nNodes, const int *nGlobalIDs, int nodeDOF, const char *const *BCFlags, const double * const *bcVals) {(void) nNodes; (void) nGlobalIDs; (void) nodeDOF; (void) BCFlags; (void) bcVals; return -1;} // ========================================================================= // get general information // ========================================================================= /** Return the space dimension (2D or 3D) @param (output) numDim - number of space dimension (3 for 3D) */ virtual int getSpaceDimension(int& numDim) {(void) numDim; return -1;} /** Return the order of the PDE @param (output) pdeOrder - order of PDE (2 for 2nd order) */ virtual int getOrderOfPDE(int& pdeOrder) {(void) pdeOrder; return -1;} /** Return the order of the FE discretization @param (output) feOrder - order of finite element discretization */ virtual int getOrderOfFE(int& feOrder) {(void) feOrder; return -1;} /** Return the number of unknowns for a given field @param (input) fieldID - field ID @param (output) fieldSize - degree of freedom for the field */ virtual int getFieldSize(int fieldID, int &fieldSize) {(void) fieldID; (void) fieldSize; return -1;} // ========================================================================= // get element information // ========================================================================= /** Return the number of the local elements in nElems @param (output) nElems - return the number of element in this block */ virtual int getNumElements(int& nElems) {(void) nElems; return -1;} /** Return the number of fields in each element in this block @param (output) numFields - number of element fields in this block */ virtual int getElemNumFields(int& numFields) {(void) numFields; return -1;} /** Return the field IDs for each element in this block @param (input) numFields - number of element fields (checking) @param (output) fieldIDs - field IDs */ virtual int getElemFieldIDs(int numFields, int *fieldIDs) {(void) numFields; (void) fieldIDs; return -1;} // ------------------------------------------------------------------------- // collective gets // ------------------------------------------------------------------------- /** Return all element global IDs (of size from getNumElements) @param (input) nElems - number of elements (from getNumElements) @param (output) eGlobalIDs - has the element GlobalIDs upon return (eGlobalIDs should be pre-allocated with length nElems) */ virtual int getElemBlockGlobalIDs(int nElems, int *eGlobalIDs) {(void) nElems; (void) eGlobalIDs; return -1;} /** Return the number of nodes for the elements in this block @param (output) nNodes - number of nodes for each element upon return */ virtual int getElemNumNodes(int& nNodes) {(void) nNodes; return -1;} /** Return the globalIDs of nodes for elements with global IDs given in the call to getElemGlobalIDs (same order) @param (input) nElems - no. of elements in this block (checking) @param (input) nNodes - no. of nodes for each element (checking) @param (ouptut) nGlobalIDLists - node lists for each element */ virtual int getElemBlockNodeLists(int nElems, int nNodes, int **nGlobalIDLists) {(void) nElems; (void) nNodes; (void) nGlobalIDLists; return -1;} /** Return dimension of element matrix in this block @param (output) sMatDim - dimension of the element matrix */ virtual int getElemMatrixDim(int &sMatDim) {(void) sMatDim; return -1;} /** Return element matrices for all elements in the block with global IDs given in the call to getElemGlobalIDs (same order) @param (input) nElems - number of elements in this block (checking) @param (input) sMatDim - dimension of element matrices (checking) @param (ouptut) elemMat - a list of element matrices */ virtual int getElemBlockMatrices(int nElems, int sMatDim, double **elemMat) {(void) nElems; (void) sMatDim; (void) elemMat; return -1;} /** Return the element null space sizes for elements with global IDs given in the call to getElemGlobalIDs (same order) @param (input) nElems - number of elements in this block (checking) @param (output) dimsNS - dimensions of the null spaces for all elements */ virtual int getElemBlockNullSpaceSizes(int nElems, int *dimsNS) {(void) nElems; (void) dimsNS; return -1;} /** Return the element null space for elements with global IDs given in the call to getElemGlobalIDs (same order) @param (input) nElems - no. of elements in this block (checking) @param (input) dimsNS[i] - no. of null space vectors for element i @param (input) sMatDim - dimension of each null space vector @param (ouptut) nullSpaces[i] - null space vectors for element i */ virtual int getElemBlockNullSpaces(int nElems, const int *dimsNS, int sMatDim, double **nullSpaces) {(void) nElems; (void) dimsNS; (void) sMatDim; (void) nullSpaces; return -1;} /** Return element volumes for elements given in the call to getElemGlobalIDs (in the same order) @param (input) nElems - number of elements in this block (checking) @param (output) elemVols - element volumes */ virtual int getElemBlockVolumes(int nElems, double *elemVols) {(void) nElems; (void) elemVols; return -1;} /** Return element materials for elements given in the call to getElemGlobalIDs (in the same order) @param (input) nElems - number of elements in this block (checking) @param (output) elemMats - element materials */ virtual int getElemBlockMaterials(int nElems, int *elemMats) {(void) nElems; (void) elemMats; return -1;} /** Return the parent IDs of elements (global IDs) in the same order as the list obtained from a call to getElemGlobalIDs @param (input) nElems - no. of elements in this block (checking) @param (output) pGlobalIDts - list of parent elements' global IDs */ virtual int getElemBlockParentIDs(int nElems, int *pGlobalIDs) {(void) nElems; (void) pGlobalIDs; return -1;} /** Return the number of faces of each element in this block @param (output) nFaces - number of faces for elements in this block */ virtual int getElemNumFaces(int& nFaces) {(void) nFaces; return -1;} /** Return the face lists of the elements (global IDs) in the same order as the IDs obtained by a call to the getElemGlobalIDs @param (input) nElems - no. of elements in this block (checking) @param (input) nFaces - no. of faces for all elements (checking) @param (output) fGlobalIDLists - lists of face global IDs */ virtual int getElemBlockFaceLists(int nElems, int nFaces, int **fGlobalIDLists) {(void) nElems; (void) nFaces; (void) fGlobalIDLists; return -1;} // ------------------------------------------------------------------------- // individual (element) gets // ------------------------------------------------------------------------- /** Return the globalIDs of nodes for the element given element's global ID @param (input) eGlobalID - global ID of element @param (input) nNodes - number of nodes in this element (checking) @param (output) nGlobalIDs - a list of node global IDs for this element */ virtual int getElemNodeList(int eGlobalID, int nNodes, int *nGlobalIDs) {(void) eGlobalID; (void) nNodes; (void) nGlobalIDs; return -1;} /** Return an element stiffness matrix @param (input) eGlobalID - global ID of element @param (input) sMatDim - dimension of the element matrix (checking) @param (output) elemMat - element matrix in column major ordering */ virtual int getElemMatrix(int eGlobalID, int sMatDim, double *elemMat) {(void) eGlobalID; (void) sMatDim; (void) elemMat; return -1;} /** Return the element's null space size @param (input) eGlobalID - element global ID @param (output) dimNS - dimension of the null space */ virtual int getElemNullSpaceSize(int eGlobalID, int &dimNS) {(void) eGlobalID; (void) dimNS; return -1;} /** Return the element's null space @param (input) eGlobalID - element global ID @param (input) dimNS - number of null space vectors @param (input) sMatDim - length of each null space vector @param (output) nSpace - the null space vectors */ virtual int getElemNullSpace(int eGlobalID, int dimNS, int sMatDim, double *nSpace) {(void) eGlobalID; (void) dimNS; (void) sMatDim; (void) nSpace; return -1;} /** Return element volume @param (input) eGlobalID - element global ID @param (output) elemVol - element volume */ virtual int getElemVolume(int eGlobalID, double& elemVol) {(void) eGlobalID; (void) elemVol; return -1;} /** Return element material @param (input) eGlobalID - element global ID @param (output) elemMaterial - element material */ virtual int getElemMaterial(int eGlobalID, int& elemMaterial) {(void) eGlobalID; (void) elemMaterial; return -1;} /** Return the parent ID of a given element @param (input) eGlobalID - element global ID @param (output) pGlobalIDs - parent element's global IDs */ virtual int getElemParentID(int eGlobalID, int& pGlobalID) {(void) eGlobalID; (void) pGlobalID; return -1;} /** Return the face list of a given element @param (input) eGlobalID - element global ID @param (input) nFaces - number of faces for this element (checking) @param (output) fGlobalIDs - face global IDs */ virtual int getElemFaceList(int eGlobalID, int nFaces, int *fGlobalIDs) {(void) eGlobalID; (void) nFaces; (void) fGlobalIDs; return -1;} /** Return the number of elements having essential BCs @param (output) nElems - number of boundary elements */ virtual int getNumBCElems(int& nElems) {(void) nElems; return -1;} /** Return the essential BCs @param (input) nElems - number of boundary elements @param (output) eGlobalIDs - a list of boundary elements' global IDs @param (output) eDOFs - element DOFs (sum of all field DOFs) for checking purposes @param (output) BCFlags[i][j] = 'Y' if element i has a BC at the j-th position (if node i has field 0 and 1 and field 0 has rank 1 and field 1 has rank 3, then if field 1 has a BC at its second position, then BCFlags[i][2] = 'Y') @param (output) BCVals - boundary values */ virtual int getElemBCs(int nElems, int *eGlobalIDs, int eDOFs, char **BCFlags, double **BCVals) {(void) nElems; (void) eGlobalIDs; (void) eDOFs; (void) BCFlags; (void) BCVals; return -1;} // ========================================================================= // get node information // ========================================================================= /** Return the number of local and external nodes @param (output) nNodes - number of nodes for this processor */ virtual int getNumNodes(int& nNodes) {(void) nNodes; return -1;} /** Return the global node IDs corresponding to local IDs from 0 to nNodes-1 with nNodes is the parameter returned from getNumNodes @param (input) nNodes - total no. of nodes (checking) @param (output) nGlobalIDs - node global IDs */ virtual int getNodeBlockGlobalIDs(int nNodes, int *nGlobalIDs) {(void) nNodes; (void) nGlobalIDs; return -1;} /** Return the number of fields for each node in the block @param (output) numFields - number of fields for each node */ virtual int getNodeNumFields(int &numFields) {(void) numFields; return -1;} /** Return the field ID for each node in the block @param (input) numFields - number of fields for each node @param (output) fieldIDs - a list of field IDs */ virtual int getNodeFieldIDs(int numFields, int *fieldIDs) {(void) numFields; (void) fieldIDs; return -1;} /** Return the coordinates of the nodes in the block (in the order of the node IDs from the call to getNodeBlockGlobalIDs) @param (input) nNodes - number of local/external nodes @param (input) spaceDim - spatial dimension (2 for 2D) @param (output) coordinates - coordinates */ virtual int getNodeBlockCoordinates(int nNodes, int spaceDim, double *coordinates) {(void) nNodes; (void) spaceDim; (void) coordinates; return -1;} /** Return the number of nodes having essential BCs @param (output) nNodes - number of boundary nodes */ virtual int getNumBCNodes(int& nNodes) {(void) nNodes; return -1;} /** Return the essential BCs @param (input) nNodes - number of boundary nodes @param (output) nGlobalIDs - a list of boundary nodes' global IDs @param (output) nDOFs - nodal DOFs (sum of all field DOFs) for checking purposes @param (output) BCFlags[i][j] = 'Y' if node i has a BC at the j-th position (if node i has field 0 and 1 and field 0 has rank 1 and field 1 has rank 3, then if field 1 has a BC at its second position, then BCFlags[i][2] = 'Y') @param (output) BCVals - boundary values */ virtual int getNodeBCs(int nNodes, int *nGlobalIDs, int nDOFs, char **BCFlags, double **BCVals) {(void) nNodes; (void) nGlobalIDs; (void) nDOFs; (void) BCFlags; (void) BCVals; return -1;} /** Return the number of shared nodes @param (output) nNodes - number of shared nodes */ virtual int getNumSharedNodes(int& nNodes) {(void) nNodes; return -1;} /** Return shared node list and for every of the nodes with how many processors is shared (the data is copied) @param (input) nNodes - number of shared nodes @param (output) nGlobalIDs - node global IDs @param (output) numProcs[i] - number of processors sharing nGlobalIDs[i] */ virtual int getSharedNodeNumProcs(int nNodes, int *nGlobalIDs, int *numProcs) {(void) nNodes; (void) nGlobalIDs; (void) numProcs; return -1;} /** Return the processors that share the given node @param (input) nNodes - number of shared nodes @param (input) numProcs[i] - number of processors sharing nGlobalIDs[i] from call to getSharedNodeNumProcs @param (input) procList[i] - processor IDs sharing nGlobalIDs[i] */ virtual int getSharedNodeProcs(int nNodes, int *numProcs, int **procList) {(void) nNodes; (void) numProcs; (void) procList; return -1;} // ========================================================================= // get face information // ========================================================================= /** Return the number of faces in my processor @param (output) nFaces - number of faces */ virtual int getNumFaces(int& nFaces) {(void) nFaces; return -1;} /** Return the global IDs of all internal and external faces @param (input) nFaces - number of external faces @param (output) fGlobalIDs - a list of all faces' global IDs */ virtual int getFaceBlockGlobalIDs(int nFaces, int *fGlobalIDs) {(void) nFaces; (void) fGlobalIDs; return -1;} /** Return number of faces shared with other processors @param (output) nFaces - number of shared faces */ virtual int getNumSharedFaces(int& nFaces) {(void) nFaces; return -1;} /** Return shared face information @param (output) nFaces - number of shared faces @param (output) fGlobalIDs - face global IDs @param (output) numProcs[i] - number of processors sharing fGlobalIDs[i] */ virtual int getSharedFaceNumProcs(int nFaces, int *fGlobalIDs, int *numProcs) {(void) nFaces; (void) fGlobalIDs; (void) numProcs; return -1;} /** Return shared face information (processor) @param (input) nFaces - number of shared faces @param (input) numProcs[i] - number of processors sharing fGlobalIDs[i] from call to getSharedFaceNumProcs @param (input) procList[i] - processor IDs sharing fGlobalIDs[i] */ virtual int getSharedFaceProcs(int nFaces, int *numProcs, int **procList) {(void) nFaces; (void) numProcs; (void) procList; return -1;} /** Return the number of nodes in a face @param (output) nNodes - number of nodes in a face */ virtual int getFaceNumNodes(int &nNodes) {(void) nNodes; return -1;} /** Return the number of nodes in a face @param (input) nFaces - toal number of faces in this block @param (input) nNodesPerFace - number of nodes in a face @param (output) nGlobalIDLists - lists of nodes for faces */ virtual int getFaceBlockNodeLists(int nFaces, int nNodesPerFace, int **nGlobalIDLists) {(void) nFaces; (void) nNodesPerFace; (void) nGlobalIDLists; return -1;} /** Return the node list of a face given a global face ID @param (input) fGlobalID - face global ID @param (input) nNodes - number of nodes in a face (for checking) @param (output) nGlobalIDs - node global IDs */ virtual int getFaceNodeList(int fGlobalID, int nNodes, int *nGlobalIDs) {(void) fGlobalID; (void) nNodes; (void) nGlobalIDs; return -1;} // ------------------------------------------------------------------------- // shape function information // ------------------------------------------------------------------------- /** load the function pointer to fetch shape function interpolant @param object - data to be passed back to the called function @param object - data object @param func - function pointer */ virtual int loadFunc_computeShapeFuncInterpolant(void *object, int (*func) (void *,int elemID,int nNodes,const double *coor, double *coef)) {(void) object; (void) func; return -1;} /** call fetch shape function interpolant @param (input) eGlobalID - element global ID @param (input) nNodes - number of nodes in this element @param (input) coord - coordinate information about this node @param (output) coef - coefficients returned */ virtual int getShapeFuncInterpolant(int eGlobalID, int nNodes, const double *coord, double *coef) {(void) eGlobalID; (void) nNodes; (void) coord; (void) coef; return -1;} // ------------------------------------------------------------------------- // other functions // ------------------------------------------------------------------------- /** This function is used to get/set implementation-specific data of a derived FEBase object. @param (input) paramString - command string @param (input) argc - dimension of argv @param (input/output) argv - data returns the number of arguments returned, if appropriate. */ virtual int impSpecificRequests(char *paramString, int argc, char **argv) {(void) paramString; (void) argc; (void) argv; return -1;} /** read the element data from a file @param filename - a string storing name of the output file */ virtual int readFromFile(char *filename) {(void) filename; return -1;} /** write the element data to a file @param filename - a string storing name of the output file */ virtual int writeToFile(char *filename) {(void) filename; return -1;} }; #endif hypre-2.33.0/src/FEI_mv/femli/mli_mapper.cxx000066400000000000000000000104521477326011500205770ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include #include "_hypre_utilities.h" #include "HYPRE.h" #include "mli_mapper.h" #include "mli_utils.h" /*************************************************************************** * constructor function for the MLI_Mapper *--------------------------------------------------------------------------*/ MLI_Mapper::MLI_Mapper() { nEntries = 0; tokenList = NULL; tokenMap = NULL; } /*************************************************************************** * destructor function for the MLI_Mapper *--------------------------------------------------------------------------*/ MLI_Mapper::~MLI_Mapper() { if ( tokenList != NULL ) delete [] tokenList; if ( tokenMap != NULL ) delete [] tokenMap; } /*************************************************************************** * set map *--------------------------------------------------------------------------*/ int MLI_Mapper::setMap(int nItems, int *itemList, int *mapList) { int i, *tokenAux; if ( nItems <= 0 ) return -1; nEntries = nItems; tokenList = new int[nItems]; for ( i = 0; i < nItems; i++ ) tokenList[i] = itemList[i]; tokenAux = new int[nItems]; for ( i = 0; i < nItems; i++ ) tokenAux[i] = i; MLI_Utils_IntQSort2( tokenList, tokenAux, 0, nItems-1 ); tokenMap = new int[nItems]; for ( i = 0; i < nItems; i++ ) tokenMap[i] = mapList[tokenAux[i]]; delete [] tokenAux; return 0; } /*************************************************************************** * adjust map offset (This is used for slide surface reduction) *--------------------------------------------------------------------------*/ int MLI_Mapper::adjustMapOffset(MPI_Comm comm, int *procNRows, int *procOffsets) { int i, j, nprocs; if ( nEntries <= 0 ) return -1; MPI_Comm_size(MPI_COMM_WORLD, &nprocs); for ( i = 0; i < nEntries; i++ ) { for ( j = 0; j < nprocs; j++ ) if ( tokenList[i] < procNRows[j] ) break; tokenMap[i] -= procOffsets[j-1]; } return 0; } /*************************************************************************** * get map *--------------------------------------------------------------------------*/ int MLI_Mapper::getMap(int nItems, int *itemList, int *mapList) { int i, *itemTemp, *itemAux, counter; if ( nItems <= 0 ) return -1; itemTemp = new int[nItems]; for ( i = 0; i < nItems; i++ ) itemTemp[i] = itemList[i]; itemAux = new int[nItems]; for ( i = 0; i < nItems; i++ ) itemAux[i] = i; MLI_Utils_IntQSort2( itemTemp, itemAux, 0, nItems-1 ); counter = 0; for ( i = 0; i < nItems; i++ ) { if ( itemTemp[i] == tokenList[counter] ) mapList[itemAux[i]] = tokenMap[counter]; else { counter++; while ( counter < nEntries ) { if ( itemTemp[i] == tokenList[counter] ) { mapList[itemAux[i]] = tokenMap[counter]; break; } else counter++; } } if ( counter >= nEntries ) { printf("MLI_Mapper::getMap - item not found %d.\n", itemList[i]); exit(1); } } delete [] itemTemp; delete [] itemAux; return 0; } /*************************************************************************** * setParams *--------------------------------------------------------------------------*/ int MLI_Mapper::setParams(char *param_string, int argc, char **argv) { int nItems, *itemList, *mapList; if ( !strcmp(param_string, "setMap") ) { if ( argc == 3 ) { nItems = *(int *) argv[0]; itemList = (int *) argv[1]; mapList = (int *) argv[2]; setMap(nItems, itemList, mapList); } else { printf("MLI_Mapper::setParams : setMap requires 3 arguments.\n"); exit(1); } } else { printf("MLI_Mapper::setParams : command not recognized %s.\n", param_string); return 1; } return 0; } hypre-2.33.0/src/FEI_mv/femli/mli_mapper.h000066400000000000000000000026341477326011500202270ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * Header info for the MLI_Mapper data structure * *****************************************************************************/ #ifndef __MLIMAPPERH__ #define __MLIMAPPERH__ /*-------------------------------------------------------------------------- * include files *--------------------------------------------------------------------------*/ #include #include "_hypre_utilities.h" /*-------------------------------------------------------------------------- * MLI_Mapper data structure declaration *--------------------------------------------------------------------------*/ class MLI_Mapper { int nEntries; int *tokenList; int *tokenMap; public : MLI_Mapper(); ~MLI_Mapper(); int setMap(int nItems, int *itemList, int *mapList); int adjustMapOffset(MPI_Comm comm, int *procNRows, int *procOffsets); int getMap(int nItems, int *itemList, int *mapList); int setParams(char *param_string, int argc, char **argv); }; #endif hypre-2.33.0/src/FEI_mv/femli/mli_matrix.cxx000066400000000000000000000312321477326011500206160ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include #include #include "_hypre_utilities.h" #include "HYPRE.h" #include "_hypre_parcsr_mv.h" #include "HYPRE_IJ_mv.h" #include "mli_matrix.h" #include "mli_utils.h" /*************************************************************************** * constructor function for the MLI_Matrix *--------------------------------------------------------------------------*/ MLI_Matrix::MLI_Matrix(void *inMatrix,char *inName, MLI_Function *func) { #ifdef MLI_DEBUG_DETAILED printf("MLI_Matrix::MLI_Matrix : %s\n", inName); #endif matrix_ = inMatrix; if (func != NULL) destroyFunc_ = (int (*)(void *)) func->func_; else destroyFunc_ = NULL; strncpy(name_, inName, 100); gNRows_ = -1; maxNNZ_ = -1; minNNZ_ = -1; totNNZ_ = -1; dtotNNZ_ = 0.0; maxVal_ = 0.0; minVal_ = 0.0; subMatrixLength_ = 0; subMatrixEqnList_ = NULL; } /*************************************************************************** * destructor function for the MLI_Matrix *--------------------------------------------------------------------------*/ MLI_Matrix::~MLI_Matrix() { #ifdef MLI_DEBUG printf("MLI_Matrix::~MLI_Matrix : %s\n", name_); #endif if (matrix_ != NULL && destroyFunc_ != NULL) destroyFunc_(matrix_); matrix_ = NULL; destroyFunc_ = NULL; if (subMatrixEqnList_ != NULL) delete [] subMatrixEqnList_; subMatrixEqnList_ = NULL; } /*************************************************************************** * apply function ( vec3 = alpha * Matrix * vec1 + beta * vec2) *--------------------------------------------------------------------------*/ int MLI_Matrix::apply(double alpha, MLI_Vector *vec1, double beta, MLI_Vector *vec2, MLI_Vector *vec3) { int irow, status, ncolsA, nrowsV, mypid, index; int startRow, endRow, *partitioning, ierr; double *V1_data, *V2_data, *V3_data; double *V1S_data, *V2S_data, *V3S_data; char *vname; hypre_ParVector *hypreV1, *hypreV2, *hypreV3; hypre_ParVector *hypreV1S, *hypreV2S, *hypreV3S; hypre_ParCSRMatrix *hypreA = (hypre_ParCSRMatrix *) matrix_; HYPRE_IJVector IJV1, IJV2, IJV3; MPI_Comm comm; #ifdef MLI_DEBUG_DETAILED printf("MLI_Matrix::apply : %s\n", name_); #endif /* ----------------------------------------------------------------------- * error checking * ----------------------------------------------------------------------*/ if (!strcmp(name_, "HYPRE_ParCSR") && !strcmp(name_, "HYPRE_ParCSRT")) { printf("MLI_Matrix::apply ERROR : matrix not HYPRE_ParCSR.\n"); exit(1); } vname = vec1->getName(); if (strcmp(vname, "HYPRE_ParVector")) { printf("MLI_Matrix::apply ERROR : vec1 not HYPRE_ParVector.\n"); printf("MLI_Matrix::vec1 of type = %s\n", vname); exit(1); } if (vec2 != NULL) { vname = vec2->getName(); if (strcmp(vname, "HYPRE_ParVector")) { printf("MLI_Matrix::apply ERROR : vec2 not HYPRE_ParVector.\n"); exit(1); } } vname = vec3->getName(); if (strcmp(vname, "HYPRE_ParVector")) { printf("MLI_Matrix::apply ERROR : vec3 not HYPRE_ParVector.\n"); exit(1); } /* ----------------------------------------------------------------------- * fetch matrix and vectors; and then operate * ----------------------------------------------------------------------*/ hypreA = (hypre_ParCSRMatrix *) matrix_; hypreV1 = (hypre_ParVector *) vec1->getVector(); nrowsV = hypre_VectorSize(hypre_ParVectorLocalVector(hypreV1)); if (!strcmp(name_, "HYPRE_ParCSR")) ncolsA = hypre_ParCSRMatrixNumCols(hypreA); else ncolsA = hypre_ParCSRMatrixNumRows(hypreA); if (subMatrixLength_ == 0 || ncolsA == nrowsV) { hypreV1 = (hypre_ParVector *) vec1->getVector(); hypreV3 = (hypre_ParVector *) vec3->getVector(); if (vec2 != NULL) { hypreV2 = (hypre_ParVector *) vec2->getVector(); status = hypre_ParVectorCopy( hypreV2, hypreV3 ); } else status = hypre_ParVectorSetConstantValues( hypreV3, 0.0e0 ); if (!strcmp(name_, "HYPRE_ParCSR")) { status += hypre_ParCSRMatrixMatvec(alpha,hypreA,hypreV1,beta,hypreV3); } else { status += hypre_ParCSRMatrixMatvecT(alpha,hypreA,hypreV1,beta,hypreV3); } return status; } else if (subMatrixLength_ != 0 && ncolsA != nrowsV) { comm = hypre_ParCSRMatrixComm(hypreA); MPI_Comm_rank(comm, &mypid); if (!strcmp(name_, "HYPRE_ParCSR")) HYPRE_ParCSRMatrixGetColPartitioning((HYPRE_ParCSRMatrix)hypreA, &partitioning); else HYPRE_ParCSRMatrixGetColPartitioning((HYPRE_ParCSRMatrix)hypreA, &partitioning); startRow = partitioning[mypid]; endRow = partitioning[mypid+1]; free(partitioning); ierr = HYPRE_IJVectorCreate(comm, startRow, endRow-1, &IJV1); ierr += HYPRE_IJVectorSetObjectType(IJV1, HYPRE_PARCSR); ierr += HYPRE_IJVectorInitialize(IJV1); ierr += HYPRE_IJVectorAssemble(IJV1); ierr += HYPRE_IJVectorGetObject(IJV1, (void **) &hypreV1S); ierr = HYPRE_IJVectorCreate(comm, startRow, endRow-1, &IJV3); ierr += HYPRE_IJVectorSetObjectType(IJV3, HYPRE_PARCSR); ierr += HYPRE_IJVectorInitialize(IJV3); ierr += HYPRE_IJVectorAssemble(IJV3); ierr += HYPRE_IJVectorGetObject(IJV3, (void **) &hypreV3S); V1S_data = hypre_VectorData(hypre_ParVectorLocalVector(hypreV1S)); V3S_data = hypre_VectorData(hypre_ParVectorLocalVector(hypreV3S)); hypreV1 = (hypre_ParVector *) vec1->getVector(); hypreV3 = (hypre_ParVector *) vec3->getVector(); V1_data = hypre_VectorData(hypre_ParVectorLocalVector(hypreV1)); V3_data = hypre_VectorData(hypre_ParVectorLocalVector(hypreV3)); if (vec2 != NULL) { ierr = HYPRE_IJVectorCreate(comm, startRow, endRow-1, &IJV2); ierr += HYPRE_IJVectorSetObjectType(IJV2, HYPRE_PARCSR); ierr += HYPRE_IJVectorInitialize(IJV2); ierr += HYPRE_IJVectorAssemble(IJV2); ierr += HYPRE_IJVectorGetObject(IJV2, (void **) &hypreV2S); hypreV2 = (hypre_ParVector *) vec2->getVector(); V2_data = hypre_VectorData(hypre_ParVectorLocalVector(hypreV2)); V2S_data = hypre_VectorData(hypre_ParVectorLocalVector(hypreV2S)); } for (irow = 0; irow < subMatrixLength_; irow++) { index = subMatrixEqnList_[irow]; V1S_data[irow] = V1_data[index]; V3S_data[irow] = V3_data[index]; if (vec2 != NULL) V2S_data[irow] = V2_data[index]; } if (!strcmp(name_, "HYPRE_ParCSR")) { status = hypre_ParCSRMatrixMatvec(alpha,hypreA,hypreV1S, beta,hypreV3S); } else { status = hypre_ParCSRMatrixMatvecT(alpha,hypreA,hypreV1S, beta,hypreV3S); } for (irow = 0; irow < subMatrixLength_; irow++) { index = subMatrixEqnList_[irow]; V3_data[index] = V3S_data[irow]; } ierr += HYPRE_IJVectorDestroy(IJV1); ierr += HYPRE_IJVectorDestroy(IJV2); ierr += HYPRE_IJVectorDestroy(IJV3); return status; } return 0; } /****************************************************************************** * create a vector from information of this matrix *---------------------------------------------------------------------------*/ MLI_Vector *MLI_Matrix::createVector() { int mypid, nprocs, startRow, endRow; int ierr, *partitioning; char paramString[100]; MPI_Comm comm; HYPRE_ParVector newVec; hypre_ParCSRMatrix *hypreA; HYPRE_IJVector IJvec; MLI_Vector *mli_vec; MLI_Function *funcPtr; if (strcmp(name_, "HYPRE_ParCSR")) { printf("MLI_Matrix::createVector ERROR - matrix has invalid type.\n"); exit(1); } hypreA = (hypre_ParCSRMatrix *) matrix_; comm = hypre_ParCSRMatrixComm(hypreA); MPI_Comm_rank(comm, &mypid); MPI_Comm_size(comm, &nprocs); if (!strcmp(name_, "HYPRE_ParCSR")) HYPRE_ParCSRMatrixGetColPartitioning((HYPRE_ParCSRMatrix)hypreA, &partitioning); else HYPRE_ParCSRMatrixGetRowPartitioning((HYPRE_ParCSRMatrix)hypreA, &partitioning); startRow = partitioning[mypid]; endRow = partitioning[mypid+1]; free( partitioning ); ierr = HYPRE_IJVectorCreate(comm, startRow, endRow-1, &IJvec); ierr += HYPRE_IJVectorSetObjectType(IJvec, HYPRE_PARCSR); ierr += HYPRE_IJVectorInitialize(IJvec); ierr += HYPRE_IJVectorAssemble(IJvec); ierr += HYPRE_IJVectorGetObject(IJvec, (void **) &newVec); ierr += HYPRE_IJVectorSetObjectType(IJvec, -1); ierr += HYPRE_IJVectorDestroy(IJvec); hypre_assert( !ierr ); HYPRE_ParVectorSetConstantValues(newVec, 0.0); sprintf(paramString, "HYPRE_ParVector"); funcPtr = new MLI_Function(); MLI_Utils_HypreParVectorGetDestroyFunc(funcPtr); mli_vec = new MLI_Vector((void*) newVec, paramString, funcPtr); delete funcPtr; return mli_vec; } /****************************************************************************** * create a vector from information of this matrix *---------------------------------------------------------------------------*/ int MLI_Matrix::getMatrixInfo(char *paramString, int &intParams, double &dbleParams) { int matInfo[4]; double valInfo[3]; if (!strcmp(name_, "HYPRE_ParCSR") && !strcmp(name_, "HYPRE_ParCSRT")) { printf("MLI_Matrix::getInfo ERROR : matrix not HYPRE_ParCSR.\n"); intParams = -1; dbleParams = 0.0; return 1; } if (gNRows_ < 0) { MLI_Utils_HypreMatrixGetInfo(matrix_, matInfo, valInfo); gNRows_ = matInfo[0]; maxNNZ_ = matInfo[1]; minNNZ_ = matInfo[2]; totNNZ_ = matInfo[3]; maxVal_ = valInfo[0]; minVal_ = valInfo[1]; dtotNNZ_ = valInfo[2]; } intParams = 0; dbleParams = 0.0; if (!strcmp(paramString, "nrows" )) intParams = gNRows_; else if (!strcmp(paramString, "maxnnz")) intParams = maxNNZ_; else if (!strcmp(paramString, "minnnz")) intParams = minNNZ_; else if (!strcmp(paramString, "totnnz")) intParams = totNNZ_; else if (!strcmp(paramString, "maxval")) dbleParams = maxVal_; else if (!strcmp(paramString, "minval")) dbleParams = minVal_; else if (!strcmp(paramString, "dtotnnz")) dbleParams = dtotNNZ_; return 0; } /****************************************************************************** * load submatrix equation list *---------------------------------------------------------------------------*/ void MLI_Matrix::setSubMatrixEqnList(int length, int *list) { if (length <= 0) return; if (subMatrixEqnList_ != NULL) delete [] subMatrixEqnList_; subMatrixLength_ = length; subMatrixEqnList_ = new int[length]; for (int i = 0; i < subMatrixLength_; i++) subMatrixEqnList_[i] = list[i]; } /****************************************************************************** * get matrix *---------------------------------------------------------------------------*/ void *MLI_Matrix::getMatrix() { return matrix_; } /****************************************************************************** * take matrix (will be destroyed by the taker) *---------------------------------------------------------------------------*/ void *MLI_Matrix::takeMatrix() { destroyFunc_ = NULL; return matrix_; } /****************************************************************************** * get the name of this matrix *---------------------------------------------------------------------------*/ char *MLI_Matrix::getName() { return name_; } /****************************************************************************** * print a matrix *---------------------------------------------------------------------------*/ int MLI_Matrix::print(char *filename) { if (!strcmp(name_, "HYPRE_ParCSR") && !strcmp(name_, "HYPRE_ParCSRT")) { printf("MLI_Matrix::print ERROR : matrix not HYPRE_ParCSR.\n"); return 1; } MLI_Utils_HypreMatrixPrint((void *) matrix_, filename); return 0; } hypre-2.33.0/src/FEI_mv/femli/mli_matrix.h000066400000000000000000000043151477326011500202450ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * Header info for the MLI_Matrix data structure * *****************************************************************************/ #ifndef __MLIMATRIXH__ #define __MLIMATRIXH__ /*-------------------------------------------------------------------------- * include files *--------------------------------------------------------------------------*/ #include "_hypre_utilities.h" #include "mli_vector.h" #include "mli_utils.h" /*-------------------------------------------------------------------------- * MLI_Matrix data structure declaration *--------------------------------------------------------------------------*/ class MLI_Matrix { char name_[100]; int gNRows_, maxNNZ_, minNNZ_, totNNZ_; double maxVal_, minVal_, dtotNNZ_; void *matrix_; int (*destroyFunc_)(void *); int subMatrixLength_; int *subMatrixEqnList_; public : MLI_Matrix( void *, char *, MLI_Function *func); ~MLI_Matrix(); void setSubMatrixEqnList(int leng, int *list); void *getMatrix(); void *takeMatrix(); char *getName(); int apply(double, MLI_Vector *, double, MLI_Vector *, MLI_Vector *); MLI_Vector *createVector(); int getMatrixInfo(char *, int &, double &); int print(char *); }; extern int MLI_Matrix_ComputePtAP(MLI_Matrix *P,MLI_Matrix *A,MLI_Matrix **); extern int MLI_Matrix_FormJacobi(MLI_Matrix *A, double alpha, MLI_Matrix **J); extern int MLI_Matrix_Compress(MLI_Matrix *A, int blksize, MLI_Matrix **A2); extern int MLI_Matrix_GetSubMatrix(MLI_Matrix *A, int nRows, int *rowIndices, int *newNRows, double **newAA); extern int MLI_Matrix_GetOverlappedMatrix(MLI_Matrix *, int *offNRows, int **offRowLengs, int **offCols, double **offVals); #endif hypre-2.33.0/src/FEI_mv/femli/mli_matrix_misc.h000066400000000000000000000026151477326011500212610ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * utility functions * *****************************************************************************/ #include "_hypre_utilities.h" #include "mli_matrix.h" extern int MLI_Matrix_ComputePtAP(MLI_Matrix *P,MLI_Matrix *A,MLI_Matrix **); extern int MLI_Matrix_FormJacobi(MLI_Matrix *A, double alpha, MLI_Matrix **J); extern int MLI_Matrix_Compress(MLI_Matrix *A, int blksize, MLI_Matrix **A2); extern int MLI_Matrix_GetSubMatrix(MLI_Matrix *A, int nRows, int *rowIndices, int *newNRows, double **newAA); extern int MLI_Matrix_GetOverlappedMatrix(MLI_Matrix *, int *offNRows, int **offRowLengs, int **offCols, double **offVals); extern void MLI_Matrix_GetExtRows(MLI_Matrix *, MLI_Matrix *, int *extNRows, int **extRowLengs, int **extCols, double **extVals); extern void MLI_Matrix_MatMatMult(MLI_Matrix *, MLI_Matrix *, MLI_Matrix **); extern void MLI_Matrix_Transpose(MLI_Matrix *, MLI_Matrix **); hypre-2.33.0/src/FEI_mv/femli/mli_matrix_mult.cxx000066400000000000000000001007661477326011500216700ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include #include #include "_hypre_utilities.h" #include "HYPRE.h" #include "_hypre_parcsr_mv.h" #include "HYPRE_IJ_mv.h" #include "mli_matrix.h" #include "mli_matrix_misc.h" #include "mli_utils.h" /*************************************************************************** * get the external rows of B in order to multiply A * B *--------------------------------------------------------------------------*/ void MLI_Matrix_MatMatMult( MLI_Matrix *Amat, MLI_Matrix *Bmat, MLI_Matrix **Cmat) { int ir, ic, is, ia, ia2, ib, index, length, offset, iTemp; int *iArray, ibegin, sortFlag, tempCnt, nprocs, mypid; int BExtNumUniqueCols, BExtNRows, *BExtRowLengs, *BExtCols, BExtNnz; int *extColList, *extColListAux; int *BRowStarts, *BColStarts, BNRows, BNCols, BStartCol, BEndCol; int *ARowStarts, *AColStarts, ANRows, ANCols; int *ADiagIA, *AOffdIA, *ADiagJA, *AOffdJA, *CDiagIA, *CDiagJA; int *BDiagIA, *BOffdIA, *BDiagJA, *BOffdJA, *COffdIA, *COffdJA; int *diagCols, *BColMap, BColMapInd, iTempDiag, iTempOffd; int mergeSortNList, **mergeSortList2D, **mergeSortAuxs; int *mergeSortList, *mergeSortLengs, *extDiagListAux; int CNRows, CNCols, *CDiagReg, *COffdReg, COffdNCols; int *CRowStarts, *CColStarts, CExtNCols, colIndA, colIndB; int *CColMap, *CColMapAux, CDiagNnz, COffdNnz; double *BDiagAA, *BOffdAA, *ADiagAA, *AOffdAA, dTemp; double *BExtVals, *CDiagAA, dTempA, dTempB; double *COffdAA; char paramString[50]; MPI_Comm mpiComm; MLI_Function *funcPtr; hypre_CSRMatrix *BDiag, *BOffd, *ADiag, *AOffd, *CDiag, *COffd; hypre_ParCSRMatrix *hypreA, *hypreB, *hypreC; /* ----------------------------------------------------------------------- * check to make sure both matrices are ParCSR matrices * ----------------------------------------------------------------------*/ if ( strcmp(Amat->getName(),"HYPRE_ParCSR") || strcmp(Bmat->getName(),"HYPRE_ParCSR") ) { printf("MLI_Matrix_MatMatMult ERROR - matrix has invalid type.\n"); exit(1); } hypreA = (hypre_ParCSRMatrix *) Amat->getMatrix(); hypreB = (hypre_ParCSRMatrix *) Bmat->getMatrix(); mpiComm = hypre_ParCSRMatrixComm(hypreA); MPI_Comm_size(mpiComm, &nprocs); MPI_Comm_rank(mpiComm, &mypid); /* ----------------------------------------------------------------------- * Get external rows of B (BExtRowLengs has been allocated 1 longer than * BExtNRows in the GetExtRows function) * Extract the diagonal indices into arrays diagCols * ----------------------------------------------------------------------*/ MLI_Matrix_GetExtRows(Amat, Bmat, &BExtNRows, &BExtRowLengs, &BExtCols, &BExtVals); tempCnt = 0; for ( ir = 0; ir < BExtNRows*2; ir++ ) { iTemp = BExtRowLengs[ir]; BExtRowLengs[ir] = tempCnt; tempCnt += iTemp; } if ( BExtNRows > 0 ) { BExtRowLengs[BExtNRows*2] = tempCnt; for ( ir = 0; ir < BExtNRows*2; ir++ ) { ibegin = BExtRowLengs[ir] + 1; if ( ir % 2 == 0 ) ibegin++; sortFlag = 0; for ( ic = ibegin; ic < BExtRowLengs[ir+1]; ic++ ) if ( BExtCols[ic] < BExtCols[ic-1] ) {sortFlag=1; break;} if ( sortFlag ) { ibegin = BExtRowLengs[ir]; if ( ir % 2 == 0 ) ibegin++; length = BExtRowLengs[ir+1] - ibegin; MLI_Utils_IntQSort2a(&(BExtCols[ibegin]), &(BExtVals[ibegin]), 0, length-1); } } diagCols = new int[BExtNRows]; for ( ir = 0; ir < BExtNRows; ir++ ) diagCols[ir] = BExtCols[BExtRowLengs[ir*2]]; MLI_Utils_IntQSort2(diagCols, NULL, 0, BExtNRows-1); } /* ----------------------------------------------------------------------- * Compile a list of unique column numbers in BExt. This is done by * exploiting the orderings in the BExtCols in each external row by * a merge sort. At the end, the unique column numbers are given in * extColList and the extColListAux array will map the column number of * BExtCols[j] to its offset in extColList. * ----------------------------------------------------------------------*/ if ( BExtNRows == 0 ) BExtNnz = BExtNumUniqueCols = 0; else { BExtNnz = BExtRowLengs[BExtNRows*2]; extColList = new int[BExtNnz]; extColListAux = new int[BExtNnz]; extDiagListAux = new int[BExtNRows]; for ( ir = 0; ir < BExtNnz; ir++ ) extColList[ir] = BExtCols[ir]; for ( ir = 0; ir < BExtNnz; ir++ ) extColListAux[ir] = -1; mergeSortNList = BExtNRows * 2 + 1; mergeSortList2D = new int*[mergeSortNList]; mergeSortAuxs = new int*[mergeSortNList]; mergeSortLengs = new int[mergeSortNList]; for ( is = 0; is < BExtNRows*2; is++ ) { if ( is % 2 == 0 ) { mergeSortList2D[is] = &(extColList[BExtRowLengs[is]+1]); mergeSortAuxs[is] = &(extColListAux[BExtRowLengs[is]+1]); mergeSortLengs[is] = BExtRowLengs[is+1] - BExtRowLengs[is] - 1; } else { mergeSortList2D[is] = &(extColList[BExtRowLengs[is]]); mergeSortAuxs[is] = &(extColListAux[BExtRowLengs[is]]); mergeSortLengs[is] = BExtRowLengs[is+1] - BExtRowLengs[is]; } } for ( ir = 0; ir < BExtNRows; ir++ ) extDiagListAux[ir] = extColListAux[BExtRowLengs[ir*2]]; mergeSortList2D[BExtNRows*2] = diagCols; mergeSortAuxs[BExtNRows*2] = extDiagListAux; mergeSortLengs[BExtNRows*2] = BExtNRows; MLI_Utils_IntMergeSort(mergeSortNList, mergeSortLengs, mergeSortList2D, mergeSortAuxs, &BExtNumUniqueCols, &mergeSortList); for ( ir = 0; ir < BExtNRows; ir++ ) extColListAux[BExtRowLengs[ir*2]] = extDiagListAux[ir]; delete [] mergeSortList2D; delete [] mergeSortAuxs; delete [] mergeSortLengs; delete [] extDiagListAux; delete [] extColList; delete [] diagCols; if ( BExtNumUniqueCols > 0 ) extColList = new int[BExtNumUniqueCols]; else extColList = NULL; for ( ir = 0; ir < BExtNumUniqueCols; ir++ ) extColList[ir] = mergeSortList[ir]; free( mergeSortList ); } /* ----------------------------------------------------------------------- * Next prune the internal columns (to my proc) from this list (by setting * the colum index to its ones-complement), since they have already been * included elsewhere * ----------------------------------------------------------------------*/ BColStarts = hypre_ParCSRMatrixColStarts(hypreB); BStartCol = BColStarts[mypid]; BEndCol = BColStarts[mypid+1] - 1; for ( ir = 0; ir < BExtNumUniqueCols; ir++ ) { if ( extColList[ir] >= BStartCol && extColList[ir] <= BEndCol ) extColList[ir] = - (extColList[ir] - BStartCol) - 1; } /* ----------------------------------------------------------------------- * Next prune the external columns by eliminating all columns already * present in the BColMap list, which is assumed ordered * ----------------------------------------------------------------------*/ BOffd = hypre_ParCSRMatrixOffd(hypreB); BColMap = hypre_ParCSRMatrixColMapOffd(hypreB); BColMapInd = 0; BNCols = BColStarts[mypid+1] - BColStarts[mypid]; for ( ir = 0; ir < BExtNumUniqueCols; ir++ ) { if ( extColList[ir] >= 0 ) { while (BColMapInd 0 ) iArray = new int[BExtNumUniqueCols]; tempCnt = 0; for ( ir = 0; ir < BExtNumUniqueCols; ir++ ) { if ( extColList[ir] >= 0 ) iArray[ir] = tempCnt++; else iArray[ir] = -1; } for ( ir = 0; ir < BExtNnz; ir++ ) { index = extColListAux[ir]; iTemp = extColList[index]; if ( iTemp < 0 ) BExtCols[ir] = - iTemp - 1; else BExtCols[ir] = iArray[index] + BNCols + BExtNRows; } if ( BExtNumUniqueCols > 0 ) delete [] iArray; tempCnt = BExtNumUniqueCols; BExtNumUniqueCols = 0; for ( ir = 0; ir < tempCnt; ir++ ) { if ( extColList[ir] >= 0 ) extColList[BExtNumUniqueCols++] = extColList[ir]; } if ( BExtNRows > 0 ) delete [] extColListAux; CExtNCols = BNCols + BExtNRows + BExtNumUniqueCols; /* ----------------------------------------------------------------------- * fetch information about matrix A and B * ----------------------------------------------------------------------*/ if (!hypre_ParCSRMatrixCommPkg(hypreA)) hypre_MatvecCommPkgCreate(hypreA); ADiag = hypre_ParCSRMatrixDiag(hypreA); ADiagIA = hypre_CSRMatrixI(ADiag); ADiagJA = hypre_CSRMatrixJ(ADiag); ADiagAA = hypre_CSRMatrixData(ADiag); AOffd = hypre_ParCSRMatrixOffd(hypreA); AOffdIA = hypre_CSRMatrixI(AOffd); AOffdJA = hypre_CSRMatrixJ(AOffd); AOffdAA = hypre_CSRMatrixData(AOffd); ARowStarts = hypre_ParCSRMatrixRowStarts(hypreA); AColStarts = hypre_ParCSRMatrixColStarts(hypreA); ANRows = ARowStarts[mypid+1] - ARowStarts[mypid]; ANCols = AColStarts[mypid+1] - AColStarts[mypid]; if (!hypre_ParCSRMatrixCommPkg(hypreB)) hypre_MatvecCommPkgCreate(hypreB); BDiag = hypre_ParCSRMatrixDiag(hypreB); BDiagIA = hypre_CSRMatrixI(BDiag); BDiagJA = hypre_CSRMatrixJ(BDiag); BDiagAA = hypre_CSRMatrixData(BDiag); BOffd = hypre_ParCSRMatrixOffd(hypreB); BOffdIA = hypre_CSRMatrixI(BOffd); BOffdJA = hypre_CSRMatrixJ(BOffd); BOffdAA = hypre_CSRMatrixData(BOffd); BRowStarts = hypre_ParCSRMatrixRowStarts(hypreB); BNRows = BRowStarts[mypid+1] - BRowStarts[mypid]; /* ----------------------------------------------------------------------- * matrix matrix multiply - first compute sizes of each row in C * ----------------------------------------------------------------------*/ CNRows = ANRows; CNCols = BNCols; CDiagNnz = COffdNnz = 0; CDiagReg = new int[CNRows]; if ( CExtNCols > 0 ) COffdReg = new int[CExtNCols]; for ( ib = 0; ib < CNRows; ib++ ) CDiagReg[ib] = -1; for ( ib = 0; ib < CExtNCols; ib++ ) COffdReg[ib] = -1; for ( ia = 0; ia < ANRows; ia++ ) { for ( ia2 = ADiagIA[ia]; ia2 < ADiagIA[ia+1]; ia2++ ) { colIndA = ADiagJA[ia2]; if ( colIndA < BNRows ) { for ( ib = BDiagIA[colIndA]; ib < BDiagIA[colIndA+1]; ib++ ) { colIndB = BDiagJA[ib]; if ( CDiagReg[colIndB] != ia ) { CDiagReg[colIndB] = ia; CDiagNnz++; } } for ( ib = BOffdIA[colIndA]; ib < BOffdIA[colIndA+1]; ib++ ) { colIndB = BOffdJA[ib] + BNCols; if ( COffdReg[colIndB] != ia ) { COffdReg[colIndB] = ia; COffdNnz++; } } } else { index = colIndA - BNRows; for (ib=BExtRowLengs[2*index]; ib 0 ) { COffdJA = hypre_TAlloc(int, COffdNnz , HYPRE_MEMORY_HOST); COffdAA = hypre_TAlloc(double, COffdNnz , HYPRE_MEMORY_HOST); } else { COffdJA = NULL; COffdAA = NULL; } COffdNCols = CExtNCols - CNCols; CDiagNnz = COffdNnz = 0; for ( ib = 0; ib < CNRows; ib++ ) CDiagReg[ib] = -1; for ( ib = 0; ib < CExtNCols; ib++ ) COffdReg[ib] = -1; CColMap = NULL; if (COffdNCols > 0) CColMap = hypre_TAlloc(int, COffdNCols , HYPRE_MEMORY_HOST); for ( ia = 0; ia < BExtNRows; ia++ ) CColMap[ia] = BColMap[ia]; for ( ia = BExtNRows; ia < COffdNCols; ia++ ) CColMap[ia] = extColList[ia-BExtNRows]; if ( COffdNCols > 0 ) CColMapAux = new int[COffdNCols]; for ( ia = 0; ia < COffdNCols; ia++ ) CColMapAux[ia] = ia; MLI_Utils_IntQSort2(CColMap, CColMapAux, 0, COffdNCols-1); iArray = CColMapAux; if ( COffdNCols > 0 ) CColMapAux = new int[COffdNCols]; for ( ia = 0; ia < COffdNCols; ia++ ) CColMapAux[iArray[ia]] = ia; if ( COffdNCols > 0 ) delete [] iArray; CDiagIA[0] = COffdIA[0] = 0; for ( ia = 0; ia < ANRows; ia++ ) { iTempDiag = CDiagNnz; iTempOffd = COffdNnz; for ( ia2 = ADiagIA[ia]; ia2 < ADiagIA[ia+1]; ia2++ ) { colIndA = ADiagJA[ia2]; dTempA = ADiagAA[ia2]; if ( colIndA < BNRows ) { for ( ib = BDiagIA[colIndA]; ib < BDiagIA[colIndA+1]; ib++ ) { colIndB = BDiagJA[ib]; dTempB = BDiagAA[ib]; offset = CDiagReg[colIndB]; if ( offset < iTempDiag ) { CDiagReg[colIndB] = CDiagNnz; CDiagJA[CDiagNnz] = colIndB; CDiagAA[CDiagNnz++] = dTempA * dTempB; } else CDiagAA[offset] += dTempA * dTempB; } for ( ib = BOffdIA[colIndA]; ib < BOffdIA[colIndA+1]; ib++ ) { colIndB = BOffdJA[ib] + BNCols; dTempB = BOffdAA[ib]; offset = COffdReg[colIndB]; if ( offset < iTempOffd ) { COffdReg[colIndB] = COffdNnz; COffdJA[COffdNnz] = CColMapAux[colIndB-BNCols]; COffdAA[COffdNnz++] = dTempA * dTempB; } else COffdAA[offset] += dTempA * dTempB; } } else { index = colIndA - BNRows; for (ib=BExtRowLengs[2*index];ib 0 ) delete [] CDiagReg; if ( CExtNCols > 0 ) delete [] COffdReg; if ( COffdNCols > 0 ) delete [] CColMapAux; /* ----------------------------------------------------------------------- * move the diagonal entry to the beginning of the row * ----------------------------------------------------------------------*/ for ( ia = 0; ia < CNRows; ia++ ) { iTemp = -1; for ( ia2 = CDiagIA[ia]; ia2 < CDiagIA[ia+1]; ia2++ ) { if ( CDiagJA[ia2] == ia ) { iTemp = CDiagJA[ia2]; dTemp = CDiagAA[ia2]; break; } } if ( iTemp >= 0 ) { for ( ib = ia2; ib > CDiagIA[ia]; ib-- ) { CDiagJA[ib] = CDiagJA[ib-1]; CDiagAA[ib] = CDiagAA[ib-1]; } CDiagJA[CDiagIA[ia]] = iTemp; CDiagAA[CDiagIA[ia]] = dTemp; } } /* ----------------------------------------------------------------------- * finally form HYPRE_ParCSRMatrix for the product * ----------------------------------------------------------------------*/ #if 0 if ( mypid == 1 ) { for ( ia = 0; ia < CNRows; ia++ ) { for ( ia2 = CDiagIA[ia]; ia2 < CDiagIA[ia+1]; ia2++ ) printf("%d : CDiag %5d = %5d %e\n",mypid,ia,CDiagJA[ia2], CDiagAA[ia2]); for ( ia2 = COffdIA[ia]; ia2 < COffdIA[ia+1]; ia2++ ) printf("%d : COffd %5d = %5d %e\n",mypid,ia,COffdJA[ia2], COffdAA[ia2]); } } #endif CRowStarts = hypre_TAlloc(int, (nprocs+1) , HYPRE_MEMORY_HOST); CColStarts = hypre_TAlloc(int, (nprocs+1) , HYPRE_MEMORY_HOST); for ( ia = 0; ia <= nprocs; ia++ ) CRowStarts[ia] = ARowStarts[ia]; for ( ia = 0; ia <= nprocs; ia++ ) CColStarts[ia] = BColStarts[ia]; hypreC = hypre_ParCSRMatrixCreate(mpiComm, CNRows, CNCols, CRowStarts, CColStarts, COffdNCols, CDiagNnz, COffdNnz); CDiag = hypre_ParCSRMatrixDiag(hypreC); hypre_CSRMatrixData(CDiag) = CDiagAA; hypre_CSRMatrixI(CDiag) = CDiagIA; hypre_CSRMatrixJ(CDiag) = CDiagJA; COffd = hypre_ParCSRMatrixOffd(hypreC); hypre_CSRMatrixI(COffd) = COffdIA; if ( COffdNCols > 0 ) { hypre_CSRMatrixJ(COffd) = COffdJA; hypre_CSRMatrixData(COffd) = COffdAA; hypre_ParCSRMatrixColMapOffd(hypreC) = CColMap; } sprintf(paramString, "HYPRE_ParCSR"); funcPtr = new MLI_Function(); MLI_Utils_HypreParCSRMatrixGetDestroyFunc(funcPtr); (*Cmat) = new MLI_Matrix((void *) hypreC, paramString, funcPtr); delete funcPtr; } /*************************************************************************** * get the external rows of B in order to multiply A * B * (modified so that extRowLengs has 2 numbers for each row, one for * the diagonal part, and the other for the off-diagonal part. This is * done to optimize the code in order each part is sorted.) *--------------------------------------------------------------------------*/ void MLI_Matrix_GetExtRows( MLI_Matrix *Amat, MLI_Matrix *Bmat, int *extNRowsP, int **extRowLengsP, int **extColsP, double **extValsP) { hypre_ParCSRMatrix *hypreA, *hypreB; hypre_ParCSRCommPkg *commPkg; hypre_CSRMatrix *BDiag, *BOffd; int nprocs, mypid, nSends, *sendProcs, *sendStarts; int *sendMap, nRecvs, *recvProcs, *recvStarts; int ip, jp, kp, rowIndex, length; int recvNRows, sendNRows, totalSendNnz, totalRecvNnz; int curNnz, sendIndex, proc; int ir, offset, upper, requestCnt, *recvCols, *iSendBuf; int *BDiagIA, *BOffdIA, *BDiagJA, *BOffdJA, *colMapOffd; #if 0 int *BRowStarts; #endif int *BColStarts; int *recvRowLengs, BStartCol; double *BDiagAA, *BOffdAA, *recvVals, *dSendBuf; MPI_Request *requests; MPI_Status *statuses; MPI_Comm mpiComm; #ifdef MLI_DEBUG_DETAILED printf("MLI_Matrix_GetExtRows begins... \n"); #endif /* ----------------------------------------------------------------------- * fetch HYPRE matrices and machine information * ----------------------------------------------------------------------*/ hypreA = (hypre_ParCSRMatrix *) Amat->getMatrix(); hypreB = (hypre_ParCSRMatrix *) Bmat->getMatrix(); mpiComm = hypre_ParCSRMatrixComm(hypreA); MPI_Comm_size(mpiComm, &nprocs); MPI_Comm_rank(mpiComm, &mypid); #if 0 BRowStarts = hypre_ParCSRMatrixRowStarts(hypreB); #endif BColStarts = hypre_ParCSRMatrixColStarts(hypreB); BStartCol = BColStarts[mypid]; if ( nprocs == 1 ) { (*extRowLengsP) = NULL; (*extColsP) = NULL; (*extValsP) = NULL; (*extNRowsP) = 0; return; } /* ----------------------------------------------------------------------- * fetch communication information * ----------------------------------------------------------------------*/ commPkg = hypre_ParCSRMatrixCommPkg(hypreA); if ( !commPkg ) hypre_MatvecCommPkgCreate(hypreA); commPkg = hypre_ParCSRMatrixCommPkg(hypreA); nSends = hypre_ParCSRCommPkgNumSends(commPkg); sendProcs = hypre_ParCSRCommPkgSendProcs(commPkg); sendStarts = hypre_ParCSRCommPkgSendMapStarts(commPkg); sendMap = hypre_ParCSRCommPkgSendMapElmts(commPkg); nRecvs = hypre_ParCSRCommPkgNumRecvs(commPkg); recvProcs = hypre_ParCSRCommPkgRecvProcs(commPkg); recvStarts = hypre_ParCSRCommPkgRecvVecStarts(commPkg); recvNRows = recvStarts[nRecvs]; sendNRows = sendStarts[nSends]; if ( nRecvs + nSends > 0 ) requests = new MPI_Request[nRecvs+nSends]; /* ----------------------------------------------------------------------- * fetch the local B matrix * ----------------------------------------------------------------------*/ colMapOffd = hypre_ParCSRMatrixColMapOffd(hypreB); BDiag = hypre_ParCSRMatrixDiag(hypreB); BDiagIA = hypre_CSRMatrixI(BDiag); BDiagJA = hypre_CSRMatrixJ(BDiag); BDiagAA = hypre_CSRMatrixData(BDiag); BOffd = hypre_ParCSRMatrixOffd(hypreB); BOffdIA = hypre_CSRMatrixI(BOffd); BOffdJA = hypre_CSRMatrixJ(BOffd); BOffdAA = hypre_CSRMatrixData(BOffd); /* ----------------------------------------------------------------------- * construct external row lengths (recvRowLengs) * ----------------------------------------------------------------------*/ if ( recvNRows > 0 ) recvRowLengs = new int[2*recvNRows+1]; else recvRowLengs = NULL; requestCnt = 0; for ( ip = 0; ip < nRecvs; ip++ ) { proc = recvProcs[ip]; offset = recvStarts[ip]; length = recvStarts[ip+1] - offset; MPI_Irecv(&(recvRowLengs[offset*2]), length*2, MPI_INT, proc, 27027, mpiComm, &requests[requestCnt++]); } if ( sendNRows > 0 ) iSendBuf = new int[sendNRows*2]; sendIndex = totalSendNnz = 0; for ( ip = 0; ip < nSends; ip++ ) { proc = sendProcs[ip]; offset = sendStarts[ip]; upper = sendStarts[ip+1]; length = upper - offset; for ( jp = offset; jp < upper; jp++ ) { //rowIndex = sendMap[jp] + BStartRow; //hypre_ParCSRMatrixGetRow(hypreB,rowIndex,&rowLeng,NULL,NULL); rowIndex = sendMap[jp]; iSendBuf[sendIndex++] = BDiagIA[rowIndex+1] - BDiagIA[rowIndex]; iSendBuf[sendIndex++] = BOffdIA[rowIndex+1] - BOffdIA[rowIndex]; totalSendNnz += iSendBuf[sendIndex-1] + iSendBuf[sendIndex-2]; //hypre_ParCSRMatrixRestoreRow(hypreB,rowIndex,&rowLeng,NULL,NULL); } MPI_Isend(&iSendBuf[offset*2], length*2, MPI_INT, proc, 27027, mpiComm, &requests[requestCnt++]); } statuses = new MPI_Status[requestCnt]; MPI_Waitall( requestCnt, requests, statuses ); if ( sendNRows > 0 ) delete [] iSendBuf; /*----------------------------------------------------------------- * construct offCols *-----------------------------------------------------------------*/ totalRecvNnz = 0; for ( ir = 0; ir < recvNRows*2; ir++) totalRecvNnz += recvRowLengs[ir]; if ( totalRecvNnz > 0 ) { recvCols = new int[totalRecvNnz]; recvVals = new double[totalRecvNnz]; } requestCnt = totalRecvNnz = 0; for ( ip = 0; ip < nRecvs; ip++ ) { proc = recvProcs[ip]; offset = recvStarts[ip]; length = recvStarts[ip+1] - offset; curNnz = 0; for ( jp = 0; jp < length*2; jp++ ) curNnz += recvRowLengs[offset*2+jp]; MPI_Irecv(&recvCols[totalRecvNnz], curNnz, MPI_INT, proc, 27028, mpiComm, &requests[requestCnt++]); totalRecvNnz += curNnz; } if ( totalSendNnz > 0 ) iSendBuf = new int[totalSendNnz]; sendIndex = totalSendNnz = 0; for ( ip = 0; ip < nSends; ip++ ) { proc = sendProcs[ip]; offset = sendStarts[ip]; upper = sendStarts[ip+1]; length = upper - offset; curNnz = totalSendNnz; for ( jp = offset; jp < upper; jp++ ) { //rowIndex = sendMap[jp] + BStartRow; //hypre_ParCSRMatrixGetRow(hypreB,rowIndex,&rowLeng,&cols,NULL); //for ( kp = 0; kp < rowLeng; kp++ ) // iSendBuf[curNnz++] = cols[kp]; //hypre_ParCSRMatrixRestoreRow(hypreB,rowIndex,&rowLeng,&cols,NULL); rowIndex = sendMap[jp]; for ( kp = BDiagIA[rowIndex]; kp < BDiagIA[rowIndex+1]; kp++ ) iSendBuf[curNnz++] = BDiagJA[kp] + BStartCol; for ( kp = BOffdIA[rowIndex]; kp < BOffdIA[rowIndex+1]; kp++ ) iSendBuf[curNnz++] = colMapOffd[BOffdJA[kp]]; } curNnz -= totalSendNnz; MPI_Isend(&iSendBuf[totalSendNnz], curNnz, MPI_INT, proc, 27028, mpiComm, &requests[requestCnt++]); totalSendNnz += curNnz; } MPI_Waitall( requestCnt, requests, statuses ); if ( totalSendNnz > 0 ) delete [] iSendBuf; /*----------------------------------------------------------------- * construct offVals *-----------------------------------------------------------------*/ requestCnt = totalRecvNnz = 0; for ( ip = 0; ip < nRecvs; ip++ ) { proc = recvProcs[ip]; offset = recvStarts[ip]; length = recvStarts[ip+1] - offset; curNnz = 0; for (jp = 0; jp < length*2; jp++) curNnz += recvRowLengs[offset*2+jp]; MPI_Irecv(&recvVals[totalRecvNnz], curNnz, MPI_DOUBLE, proc, 27029, mpiComm, &requests[requestCnt++]); totalRecvNnz += curNnz; } if ( totalSendNnz > 0 ) dSendBuf = new double[totalSendNnz]; sendIndex = totalSendNnz = 0; for ( ip = 0; ip < nSends; ip++ ) { proc = sendProcs[ip]; offset = sendStarts[ip]; upper = sendStarts[ip+1]; length = upper - offset; curNnz = totalSendNnz; for ( jp = offset; jp < upper; jp++ ) { //rowIndex = sendMap[jp] + BStartRow; //hypre_ParCSRMatrixGetRow(hypreB,rowIndex,&rowLeng,NULL,&vals); //for ( kp = 0; kp < rowLeng; kp++ ) // dSendBuf[curNnz++] = vals[kp]; //hypre_ParCSRMatrixRestoreRow(hypreB,rowIndex,&rowLeng,NULL,&vals); rowIndex = sendMap[jp]; for ( kp = BDiagIA[rowIndex]; kp < BDiagIA[rowIndex+1]; kp++ ) dSendBuf[curNnz++] = BDiagAA[kp]; for ( kp = BOffdIA[rowIndex]; kp < BOffdIA[rowIndex+1]; kp++ ) dSendBuf[curNnz++] = BOffdAA[kp]; } curNnz -= totalSendNnz; MPI_Isend(&(dSendBuf[totalSendNnz]), curNnz, MPI_DOUBLE, proc, 27029, mpiComm, &requests[requestCnt++]); totalSendNnz += curNnz; } MPI_Waitall( requestCnt, requests, statuses ); if ( totalSendNnz > 0 ) delete [] dSendBuf; if ( nRecvs + nSends > 0 ) delete [] requests; if ( nRecvs + nSends > 0 ) delete [] statuses; /* ----------------------------------------------------------------------- * diagnostics * ----------------------------------------------------------------------*/ (*extRowLengsP) = recvRowLengs; (*extColsP) = recvCols; (*extValsP) = recvVals; (*extNRowsP) = recvNRows; #if 0 BRowStarts = hypre_ParCSRMatrixRowStarts(hypreB); totalRecvNnz = 0; if ( mypid == 0 ) { for ( ip = 0; ip < nprocs; ip++ ) printf("processor has range %d %d\n",BRowStarts[ip],BRowStarts[ip+1]); for ( ip = 0; ip < nprocs; ip++ ) { offset = recvStarts[ip]; length = recvStarts[ip+1] - offset; curNnz = 0; for (jp = 0; jp < length*2; jp++) curNnz += recvRowLengs[offset*2+jp]; for (jp = 0; jp < curNnz; jp++) { printf("%d : recvData = %5d %e\n", mypid, recvCols[totalRecvNnz], recvVals[totalRecvNnz]); totalRecvNnz++; } } } #endif } hypre-2.33.0/src/FEI_mv/femli/mli_matrix_utils.cxx000066400000000000000000000416201477326011500220400ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include #include #include "HYPRE.h" #include "_hypre_utilities.h" #include "_hypre_parcsr_mv.h" #include "HYPRE_IJ_mv.h" #include "mli_matrix.h" #include "mli_utils.h" extern "C" { void hypre_qsort0(int *, int, int); } /*************************************************************************** * compute triple matrix product function *--------------------------------------------------------------------------*/ int MLI_Matrix_ComputePtAP(MLI_Matrix *Pmat, MLI_Matrix *Amat, MLI_Matrix **RAPmat_out) { int ierr; char paramString[200]; void *Pmat2, *Amat2, *RAPmat2; MLI_Matrix *RAPmat; MLI_Function *funcPtr; if ( strcmp(Pmat->getName(),"HYPRE_ParCSR") || strcmp(Amat->getName(),"HYPRE_ParCSR") ) { printf("MLI_Matrix_computePtAP ERROR - matrix has invalid type.\n"); exit(1); } Pmat2 = (void *) Pmat->getMatrix(); Amat2 = (void *) Amat->getMatrix(); ierr = MLI_Utils_HypreMatrixComputeRAP(Pmat2,Amat2,&RAPmat2); if ( ierr ) printf("ERROR in MLI_Matrix_ComputePtAP\n"); sprintf(paramString, "HYPRE_ParCSR"); funcPtr = new MLI_Function(); MLI_Utils_HypreParCSRMatrixGetDestroyFunc(funcPtr); RAPmat = new MLI_Matrix(RAPmat2,paramString,funcPtr); delete funcPtr; (*RAPmat_out) = RAPmat; return 0; } /*************************************************************************** * compute triple matrix product function *--------------------------------------------------------------------------*/ int MLI_Matrix_FormJacobi(MLI_Matrix *Amat, double alpha, MLI_Matrix **Jmat) { int ierr; char paramString[200]; void *A, *J; MLI_Function *funcPtr; if ( strcmp(Amat->getName(),"HYPRE_ParCSR") ) { printf("MLI_Matrix_FormJacobi ERROR - matrix has invalid type.\n"); exit(1); } A = (void *) Amat->getMatrix();; ierr = MLI_Utils_HypreMatrixFormJacobi(A, alpha, &J); if ( ierr ) printf("ERROR in MLI_Matrix_FormJacobi\n"); sprintf(paramString, "HYPRE_ParCSR"); funcPtr = new MLI_Function(); MLI_Utils_HypreParCSRMatrixGetDestroyFunc(funcPtr); (*Jmat) = new MLI_Matrix(J,paramString,funcPtr); delete funcPtr; return ierr; } /*************************************************************************** * compress matrix by block size > 1 *--------------------------------------------------------------------------*/ int MLI_Matrix_Compress(MLI_Matrix *Amat, int blksize, MLI_Matrix **Amat2) { int ierr; char paramString[200]; void *A, *A2; MLI_Function *funcPtr; if ( strcmp(Amat->getName(),"HYPRE_ParCSR") ) { printf("MLI_Matrix_Compress ERROR - matrix has invalid type.\n"); exit(1); } if ( blksize <= 1 ) { printf("MLI_Matrix_Compress WARNING - blksize <= 1.\n"); (*Amat2) = NULL; return 1; } A = (void *) Amat->getMatrix();; ierr = MLI_Utils_HypreMatrixCompress(A, blksize, &A2); if ( ierr ) printf("ERROR in MLI_Matrix_Compress\n"); sprintf(paramString, "HYPRE_ParCSR"); funcPtr = new MLI_Function(); MLI_Utils_HypreParCSRMatrixGetDestroyFunc(funcPtr); (*Amat2) = new MLI_Matrix(A2,paramString,funcPtr); delete funcPtr; return ierr; } /*************************************************************************** * get submatrix given row indices *--------------------------------------------------------------------------*/ int MLI_Matrix_GetSubMatrix(MLI_Matrix *A_in, int nRows, int *rowIndices, int *newNRows, double **newAA) { int mypid, nprocs, *partition, startRow, endRow; int i, j, myNRows, irow, rowInd, rowLeng, *cols, *myRowIndices; double *AA, *vals; hypre_ParCSRMatrix *A; MPI_Comm comm; /*----------------------------------------------------------------- * fetch machine and matrix parameters (off_offset) *-----------------------------------------------------------------*/ A = (hypre_ParCSRMatrix *) A_in; comm = hypre_ParCSRMatrixComm(A); MPI_Comm_rank(comm, &mypid); MPI_Comm_size(comm, &nprocs); HYPRE_ParCSRMatrixGetRowPartitioning((HYPRE_ParCSRMatrix) A, &partition); startRow = partition[mypid]; endRow = partition[mypid+1] - 1; free( partition ); myNRows = 0; for ( irow = 0; irow < nRows; irow++ ) { rowInd = rowIndices[irow]; if ( rowInd >= startRow && rowInd < endRow ) { hypre_ParCSRMatrixGetRow(A,rowInd,&rowLeng,&cols,NULL); myNRows += rowLeng; hypre_ParCSRMatrixRestoreRow(A,rowInd,&rowLeng,&cols,NULL); } } myRowIndices = new int[myNRows]; myNRows = 0; for ( irow = 0; irow < nRows; irow++ ) { rowInd = rowIndices[irow]; if ( rowInd >= startRow && rowInd < endRow ) { hypre_ParCSRMatrixGetRow(A,rowInd,&rowLeng,&cols,NULL); for ( i = 0; i < rowLeng; i++ ) myRowIndices[myNRows++] = cols[i]; hypre_ParCSRMatrixRestoreRow(A,rowInd,&rowLeng,&cols,NULL); } } hypre_qsort0(myRowIndices, 0, myNRows-1); j = 1; for ( i = 1; i < myNRows; i++ ) if ( myRowIndices[i] != myRowIndices[j-1] ) myRowIndices[j++] = myRowIndices[i]; myNRows = j; AA = new double[myNRows*myNRows]; for ( irow = 0; irow < myNRows*myNRows; irow++ ) AA[i] = 0.0; for ( irow = 0; irow < myNRows; irow++ ) { rowInd = myRowIndices[irow]; if ( rowInd >= startRow && rowInd < endRow ) { hypre_ParCSRMatrixGetRow(A,rowInd,&rowLeng,&cols,&vals); for ( i = 0; i < rowLeng; i++ ) AA[(cols[i]-startRow)*myNRows+irow] = vals[i]; hypre_ParCSRMatrixRestoreRow(A,rowInd,&rowLeng,&cols,&vals); } } (*newAA) = AA; (*newNRows) = myNRows; return 0; } /*************************************************************************** * get submatrix given row indices *--------------------------------------------------------------------------*/ int MLI_Matrix_GetOverlappedMatrix(MLI_Matrix *mli_mat, int *offNRows, int **offRowLengths, int **offCols, double **offVals) { int i, j, k, mypid, nprocs, *partition, startRow; int nSends, *sendProcs, nRecvs; int *recvProcs, *recvStarts, proc, offset, length, reqNum; int totalSendNnz, totalRecvNnz, index, base, totalSends; int totalRecvs, rowNum, rowLength, *colInd, *sendStarts; int limit, *isendBuf, *cols, curNnz, *rowIndices; double *dsendBuf, *vals, *colVal; hypre_ParCSRMatrix *A; MPI_Comm comm; MPI_Request *requests; MPI_Status *status; hypre_ParCSRCommPkg *commPkg; /*----------------------------------------------------------------- * fetch machine and matrix parameters (off_offset) *-----------------------------------------------------------------*/ A = (hypre_ParCSRMatrix *) mli_mat->getMatrix(); comm = hypre_ParCSRMatrixComm(A); MPI_Comm_rank(comm,&mypid); MPI_Comm_size(comm,&nprocs); if ( nprocs == 1 ) { (*offNRows) = 0; (*offRowLengths) = NULL; (*offCols) = NULL; (*offVals) = NULL; return 0; } HYPRE_ParCSRMatrixGetRowPartitioning((HYPRE_ParCSRMatrix) A, &partition); startRow = partition[mypid]; hypre_TFree( partition , HYPRE_MEMORY_HOST); /*----------------------------------------------------------------- * fetch matrix communication information (off_nrows) *-----------------------------------------------------------------*/ hypre_MatvecCommPkgCreate((hypre_ParCSRMatrix *) A); commPkg = hypre_ParCSRMatrixCommPkg(A); nSends = hypre_ParCSRCommPkgNumSends(commPkg); sendProcs = hypre_ParCSRCommPkgSendProcs(commPkg); sendStarts = hypre_ParCSRCommPkgSendMapStarts(commPkg); nRecvs = hypre_ParCSRCommPkgNumRecvs(commPkg); recvProcs = hypre_ParCSRCommPkgRecvProcs(commPkg); recvStarts = hypre_ParCSRCommPkgRecvVecStarts(commPkg); requests = hypre_CTAlloc( MPI_Request, nRecvs+nSends , HYPRE_MEMORY_HOST); totalSends = sendStarts[nSends]; totalRecvs = recvStarts[nRecvs]; (*offNRows) = totalRecvs; /*----------------------------------------------------------------- * construct offRowLengths *-----------------------------------------------------------------*/ if ( totalRecvs > 0 ) (*offRowLengths) = new int[totalRecvs]; else (*offRowLengths) = NULL; reqNum = 0; for (i = 0; i < nRecvs; i++) { proc = recvProcs[i]; offset = recvStarts[i]; length = recvStarts[i+1] - offset; MPI_Irecv(&((*offRowLengths)[offset]),length,MPI_INT,proc,13278,comm, &requests[reqNum++]); } if ( totalSends > 0 ) isendBuf = hypre_CTAlloc( int, totalSends , HYPRE_MEMORY_HOST); index = totalSendNnz = 0; for (i = 0; i < nSends; i++) { proc = sendProcs[i]; offset = sendStarts[i]; limit = sendStarts[i+1]; length = limit - offset; for (j = offset; j < limit; j++) { rowNum = hypre_ParCSRCommPkgSendMapElmt(commPkg,j) + startRow; hypre_ParCSRMatrixGetRow(A,rowNum,&rowLength,&colInd,NULL); isendBuf[index++] = rowLength; totalSendNnz += rowLength; hypre_ParCSRMatrixRestoreRow(A,rowNum,&rowLength,&colInd,NULL); } MPI_Isend(&isendBuf[offset], length, MPI_INT, proc, 13278, comm, &requests[reqNum++]); } status = hypre_CTAlloc(MPI_Status, reqNum, HYPRE_MEMORY_HOST); MPI_Waitall( reqNum, requests, status ); hypre_TFree( status , HYPRE_MEMORY_HOST); if ( totalSends > 0 ) hypre_TFree( isendBuf , HYPRE_MEMORY_HOST); /*----------------------------------------------------------------- * construct row indices *-----------------------------------------------------------------*/ if ( totalRecvs > 0 ) rowIndices = new int[totalRecvs]; else rowIndices = NULL; reqNum = 0; for (i = 0; i < nRecvs; i++) { proc = recvProcs[i]; offset = recvStarts[i]; length = recvStarts[i+1] - offset; MPI_Irecv(&(rowIndices[offset]), length, MPI_INT, proc, 13279, comm, &requests[reqNum++]); } if ( totalSends > 0 ) isendBuf = hypre_CTAlloc( int, totalSends , HYPRE_MEMORY_HOST); index = 0; for (i = 0; i < nSends; i++) { proc = sendProcs[i]; offset = sendStarts[i]; limit = sendStarts[i+1]; length = limit - offset; for (j = offset; j < limit; j++) { rowNum = hypre_ParCSRCommPkgSendMapElmt(commPkg,j) + startRow; isendBuf[index++] = rowNum; } MPI_Isend(&isendBuf[offset], length, MPI_INT, proc, 13279, comm, &requests[reqNum++]); } status = hypre_CTAlloc(MPI_Status, reqNum, HYPRE_MEMORY_HOST); MPI_Waitall( reqNum, requests, status ); hypre_TFree( status , HYPRE_MEMORY_HOST); if ( totalSends > 0 ) hypre_TFree( isendBuf , HYPRE_MEMORY_HOST); /*----------------------------------------------------------------- * construct offCols *-----------------------------------------------------------------*/ totalRecvNnz = 0; for (i = 0; i < totalRecvs; i++) totalRecvNnz += (*offRowLengths)[i]; if ( totalRecvNnz > 0 ) { cols = new int[totalRecvNnz]; vals = new double[totalRecvNnz]; } reqNum = totalRecvNnz = 0; for (i = 0; i < nRecvs; i++) { proc = recvProcs[i]; offset = recvStarts[i]; length = recvStarts[i+1] - offset; curNnz = 0; for (j = 0; j < length; j++) curNnz += (*offRowLengths)[offset+j]; MPI_Irecv(&cols[totalRecvNnz], curNnz, MPI_INT, proc, 13280, comm, &requests[reqNum++]); totalRecvNnz += curNnz; } if ( totalSendNnz > 0 ) isendBuf = hypre_CTAlloc( int, totalSendNnz , HYPRE_MEMORY_HOST); index = totalSendNnz = 0; for (i = 0; i < nSends; i++) { proc = sendProcs[i]; offset = sendStarts[i]; limit = sendStarts[i+1]; length = limit - offset; base = totalSendNnz; for (j = offset; j < limit; j++) { rowNum = hypre_ParCSRCommPkgSendMapElmt(commPkg,j) + startRow; hypre_ParCSRMatrixGetRow(A,rowNum,&rowLength,&colInd,NULL); for (k = 0; k < rowLength; k++) isendBuf[totalSendNnz++] = colInd[k]; hypre_ParCSRMatrixRestoreRow(A,rowNum,&rowLength,&colInd,NULL); } length = totalSendNnz - base; MPI_Isend(&isendBuf[base], length, MPI_INT, proc, 13280, comm, &requests[reqNum++]); } status = hypre_CTAlloc(MPI_Status, reqNum, HYPRE_MEMORY_HOST); MPI_Waitall( reqNum, requests, status ); hypre_TFree( status , HYPRE_MEMORY_HOST); if ( totalSendNnz > 0 ) hypre_TFree( isendBuf , HYPRE_MEMORY_HOST); /*----------------------------------------------------------------- * construct offVals *-----------------------------------------------------------------*/ reqNum = totalRecvNnz = 0; for (i = 0; i < nRecvs; i++) { proc = recvProcs[i]; offset = recvStarts[i]; length = recvStarts[i+1] - offset; curNnz = 0; for (j = 0; j < length; j++) curNnz += (*offRowLengths)[offset+j]; MPI_Irecv(&vals[totalRecvNnz], curNnz, MPI_DOUBLE, proc, 13281, comm, &requests[reqNum++]); totalRecvNnz += curNnz; } if ( totalSendNnz > 0 ) dsendBuf = hypre_CTAlloc( double, totalSendNnz , HYPRE_MEMORY_HOST); index = totalSendNnz = 0; for (i = 0; i < nSends; i++) { proc = sendProcs[i]; offset = sendStarts[i]; limit = sendStarts[i+1]; length = limit - offset; base = totalSendNnz; for (j = offset; j < limit; j++) { rowNum = hypre_ParCSRCommPkgSendMapElmt(commPkg,j) + startRow; hypre_ParCSRMatrixGetRow(A,rowNum,&rowLength,NULL,&colVal); for (k = 0; k < rowLength; k++) dsendBuf[totalSendNnz++] = colVal[k]; hypre_ParCSRMatrixRestoreRow(A,rowNum,&rowLength,NULL,&colVal); } length = totalSendNnz - base; MPI_Isend(&dsendBuf[base], length, MPI_DOUBLE, proc, 13281, comm, &requests[reqNum++]); } status = hypre_CTAlloc(MPI_Status, reqNum, HYPRE_MEMORY_HOST); MPI_Waitall( reqNum, requests, status ); hypre_TFree( status , HYPRE_MEMORY_HOST); if ( totalSendNnz > 0 ) hypre_TFree( dsendBuf , HYPRE_MEMORY_HOST); if ( nSends+nRecvs > 0 ) hypre_TFree( requests , HYPRE_MEMORY_HOST); (*offCols) = cols; (*offVals) = vals; return 0; } /*************************************************************************** * perform matrix transpose (modified from parcsr_mv function by putting * diagonal entries at the beginning of the row) *--------------------------------------------------------------------------*/ void MLI_Matrix_Transpose(MLI_Matrix *Amat, MLI_Matrix **AmatT) { int one=1, ia, ia2, ib, iTemp, *ATDiagI, *ATDiagJ; int localNRows; double dTemp, *ATDiagA; char paramString[30]; hypre_CSRMatrix *ATDiag; hypre_ParCSRMatrix *hypreA, *hypreAT; MLI_Matrix *mli_AmatT; MLI_Function *funcPtr; hypreA = (hypre_ParCSRMatrix *) Amat->getMatrix(); hypre_ParCSRMatrixTranspose( hypreA, &hypreAT, one ); ATDiag = hypre_ParCSRMatrixDiag(hypreAT); localNRows = hypre_CSRMatrixNumRows(ATDiag); ATDiagI = hypre_CSRMatrixI(ATDiag); ATDiagJ = hypre_CSRMatrixJ(ATDiag); ATDiagA = hypre_CSRMatrixData(ATDiag); /* ----------------------------------------------------------------------- * move the diagonal entry to the beginning of the row * ----------------------------------------------------------------------*/ for ( ia = 0; ia < localNRows; ia++ ) { iTemp = -1; for ( ia2 = ATDiagI[ia]; ia2 < ATDiagI[ia+1]; ia2++ ) { if ( ATDiagJ[ia2] == ia ) { iTemp = ATDiagJ[ia2]; dTemp = ATDiagA[ia2]; break; } } if ( iTemp >= 0 ) { for ( ib = ia2; ib > ATDiagI[ia]; ib-- ) { ATDiagJ[ib] = ATDiagJ[ib-1]; ATDiagA[ib] = ATDiagA[ib-1]; } ATDiagJ[ATDiagI[ia]] = iTemp; ATDiagA[ATDiagI[ia]] = dTemp; } } /* ----------------------------------------------------------------------- * construct MLI_Matrix * ----------------------------------------------------------------------*/ sprintf( paramString, "HYPRE_ParCSRMatrix" ); funcPtr = new MLI_Function(); MLI_Utils_HypreParCSRMatrixGetDestroyFunc(funcPtr); mli_AmatT = new MLI_Matrix((void*) hypreAT, paramString, funcPtr); delete funcPtr; *AmatT = mli_AmatT; } hypre-2.33.0/src/FEI_mv/femli/mli_method.cxx000066400000000000000000000173131477326011500205760ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * functions for creating MLI_Method * *****************************************************************************/ /*-------------------------------------------------------------------------- * include files *--------------------------------------------------------------------------*/ #if 0 /* RDF: Not sure this is really needed */ #ifdef WIN32 #define strcmp _stricmp #endif #endif #include #include "mli_method.h" #include "mli_method_amgsa.h" #include "mli_method_amgrs.h" #include "mli_method_amgcr.h" /***************************************************************************** * constructor *--------------------------------------------------------------------------*/ MLI_Method::MLI_Method( MPI_Comm comm ) { mpiComm_ = comm; methodID_ = -1; strcpy(methodName_, "MLI_NONE"); } /***************************************************************************** * destructor *--------------------------------------------------------------------------*/ MLI_Method::~MLI_Method() { } /***************************************************************************** * virtual setup function *--------------------------------------------------------------------------*/ int MLI_Method::setup( MLI *mli ) { (void) mli; return -1; } /***************************************************************************** * virtual set parameter function *--------------------------------------------------------------------------*/ int MLI_Method::setParams(char *name, int argc, char *argv[]) { (void) name; (void) argc; (void) argv; return -1; } /***************************************************************************** * virtual get parameter function *--------------------------------------------------------------------------*/ int MLI_Method::getParams(char *name, int *argc, char *argv[]) { (void) name; (void) argc; (void) argv; return -1; } /***************************************************************************** * get method name *--------------------------------------------------------------------------*/ char *MLI_Method::getName() { return methodName_; } /***************************************************************************** * set method name *--------------------------------------------------------------------------*/ int MLI_Method::setName( char *inName ) { strcpy(methodName_, inName); return 0; } /***************************************************************************** * set method ID *--------------------------------------------------------------------------*/ int MLI_Method::setID( int inID ) { methodID_ = inID; return 0; } /***************************************************************************** * get method ID *--------------------------------------------------------------------------*/ int MLI_Method::getID() { return methodID_; } /***************************************************************************** * get communicator *--------------------------------------------------------------------------*/ MPI_Comm MLI_Method::getComm() { return mpiComm_; } /***************************************************************************** * create a method from method name *--------------------------------------------------------------------------*/ MLI_Method *MLI_Method_CreateFromName( char *str, MPI_Comm comm ) { MLI_Method *methodPtr; char paramString[80]; if ( !strcmp(str, "AMGSA" ) ) { methodPtr = new MLI_Method_AMGSA(comm); } else if ( !strcmp(str, "AMGSAe" ) ) { methodPtr = new MLI_Method_AMGSA(comm); strcpy( paramString, "useSAMGe" ); methodPtr->setParams( paramString, 0, NULL ); } else if ( !strcmp(str, "AMGSADD" ) ) { methodPtr = new MLI_Method_AMGSA(comm); strcpy( paramString, "useSAMGDD" ); methodPtr->setParams( paramString, 0, NULL ); strcpy( paramString, "setNumLevels 2" ); methodPtr->setParams( paramString, 0, NULL ); } else if ( !strcmp(str, "AMGSADDe" ) ) { methodPtr = new MLI_Method_AMGSA(comm); strcpy( paramString, "useSAMGe" ); methodPtr->setParams( paramString, 0, NULL ); strcpy( paramString, "useSAMGDD" ); methodPtr->setParams( paramString, 0, NULL ); strcpy( paramString, "setNumLevels 2" ); methodPtr->setParams( paramString, 0, NULL ); } else if ( !strcmp(str, "AMGRS" ) ) { methodPtr = new MLI_Method_AMGRS(comm); } else if ( !strcmp(str, "AMGCR" ) ) { methodPtr = new MLI_Method_AMGCR(comm); } else { printf("MLI_Method_Create ERROR : method %s not defined.\n", str); printf(" valid ones are : \n\n"); printf(" (1) AMGSA (%d)\n", MLI_METHOD_AMGSA_ID); printf(" (2) AMGSAe (%d)\n", MLI_METHOD_AMGSAE_ID); printf(" (3) AMGSADD (%d)\n", MLI_METHOD_AMGSADD_ID); printf(" (4) AMGSADDe (%d)\n", MLI_METHOD_AMGSADDE_ID); printf(" (5) AMGRS (%d)\n", MLI_METHOD_AMGRS_ID); printf(" (6) AMGCR (%d)\n", MLI_METHOD_AMGCR_ID); exit(1); } return methodPtr; } /***************************************************************************** * create a method from method ID *--------------------------------------------------------------------------*/ MLI_Method *MLI_Method_CreateFromID( int methodID, MPI_Comm comm ) { MLI_Method *methodPtr; char paramString[80]; switch ( methodID ) { case MLI_METHOD_AMGSA_ID : methodPtr = new MLI_Method_AMGSA(comm); break; case MLI_METHOD_AMGSAE_ID : methodPtr = new MLI_Method_AMGSA(comm); strcpy( paramString, "useSAMGe" ); methodPtr->setParams(paramString, 0, NULL); break; case MLI_METHOD_AMGSADD_ID : methodPtr = new MLI_Method_AMGSA(comm); strcpy( paramString, "useSAMGDD" ); methodPtr->setParams(paramString, 0, NULL); strcpy( paramString, "setNumLevels 2" ); methodPtr->setParams(paramString, 0, NULL); break; case MLI_METHOD_AMGSADDE_ID : methodPtr = new MLI_Method_AMGSA(comm); strcpy( paramString, "useSAMGe" ); methodPtr->setParams(paramString, 0, NULL); strcpy( paramString, "useSAMGDD" ); methodPtr->setParams(paramString, 0, NULL); strcpy( paramString, "setNumLevels 2" ); methodPtr->setParams(paramString, 0, NULL); break; case MLI_METHOD_AMGRS_ID : methodPtr = new MLI_Method_AMGRS(comm); break; case MLI_METHOD_AMGCR_ID : methodPtr = new MLI_Method_AMGCR(comm); break; default : printf("MLI_Method_Create ERROR : method %d not defined\n", methodID); printf(" valid ones are : \n\n"); printf(" (1) AMGSA (%d)\n", MLI_METHOD_AMGSA_ID); printf(" (2) AMGSAe (%d)\n", MLI_METHOD_AMGSAE_ID); printf(" (3) AMGSADD (%d)\n", MLI_METHOD_AMGSADD_ID); printf(" (4) AMGSADDe (%d)\n", MLI_METHOD_AMGSADDE_ID); printf(" (5) AMGRS (%d)\n", MLI_METHOD_AMGRS_ID); printf(" (6) AMGCR (%d)\n", MLI_METHOD_AMGCR_ID); exit(1); } return methodPtr; } hypre-2.33.0/src/FEI_mv/femli/mli_method.h000066400000000000000000000036021477326011500202170ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * Header info for the MLI_Method data structure * *****************************************************************************/ #ifndef __MLIMETHODH__ #define __MLIMETHODH__ /**************************************************************************** * defines and include files *--------------------------------------------------------------------------*/ #define MLI_METHOD_AMGSA_ID 701 #define MLI_METHOD_AMGSAE_ID 702 #define MLI_METHOD_AMGSADD_ID 703 #define MLI_METHOD_AMGSADDE_ID 704 #define MLI_METHOD_AMGRS_ID 705 #define MLI_METHOD_AMGCR_ID 706 #include "_hypre_utilities.h" #include "mli.h" class MLI; /**************************************************************************** * MLI_Method abstract class definition *--------------------------------------------------------------------------*/ class MLI_Method { char methodName_[200]; int methodID_; MPI_Comm mpiComm_; public : MLI_Method( MPI_Comm comm ); virtual ~MLI_Method(); virtual int setup( MLI *mli ); virtual int setParams(char *name, int argc, char *argv[]); virtual int getParams(char *name, int *argc, char *argv[]); char *getName(); int setName( char *in_name ); int setID( int in_id ); int getID(); MPI_Comm getComm(); }; extern MLI_Method *MLI_Method_CreateFromName(char *,MPI_Comm); extern MLI_Method *MLI_Method_CreateFromID(int,MPI_Comm); #endif hypre-2.33.0/src/FEI_mv/femli/mli_method_amgcr.cxx000066400000000000000000001713551477326011500217560ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #if 0 /* RDF: Not sure this is really needed */ #ifdef WIN32 #define strcmp _stricmp #endif #endif #include #include "HYPRE.h" #include "_hypre_utilities.h" #include "_hypre_parcsr_ls.h" #include "mli_utils.h" #include "mli_matrix.h" #include "mli_matrix_misc.h" #include "mli_vector.h" #include "mli_solver.h" #include "mli_method_amgcr.h" #ifdef __cplusplus extern "C" { #endif #include "ParaSails/Matrix.h" #include "ParaSails/ParaSails.h" #include "_hypre_parcsr_ls.h" #ifdef __cplusplus } #endif #define habs(x) ((x > 0) ? x : (-x)) /* ********************************************************************* * * constructor * --------------------------------------------------------------------- */ MLI_Method_AMGCR::MLI_Method_AMGCR( MPI_Comm comm ) : MLI_Method( comm ) { char name[100]; strcpy(name, "AMGCR"); setName( name ); setID( MLI_METHOD_AMGCR_ID ); maxLevels_ = 40; numLevels_ = 2; currLevel_ = 0; outputLevel_ = 0; findMIS_ = 0; targetMu_ = 0.25; numTrials_ = 1; numVectors_ = 1; minCoarseSize_ = 100; cutThreshold_ = 0.01; strcpy(smoother_, "Jacobi"); smootherNum_ = 1; smootherWgts_ = new double[2]; smootherWgts_[0] = smootherWgts_[1] = 1.0; strcpy(coarseSolver_, "SuperLU"); coarseSolverNum_ = 1; coarseSolverWgts_ = new double[20]; for (int j = 0; j < 20; j++) coarseSolverWgts_ [j] = 1.0; RAPTime_ = 0.0; totalTime_ = 0.0; strcpy(paramFile_, "empty"); PDegree_ = 2; } /* ********************************************************************* * * destructor * --------------------------------------------------------------------- */ MLI_Method_AMGCR::~MLI_Method_AMGCR() { if (smootherWgts_ != NULL) delete [] smootherWgts_; if (coarseSolverWgts_ != NULL) delete [] coarseSolverWgts_; } /* ********************************************************************* * * set parameters * --------------------------------------------------------------------- */ int MLI_Method_AMGCR::setParams(char *inName, int argc, char *argv[]) { int i, mypid, level, nSweeps=1; double *weights=NULL; char param1[256], param2[256], *param3; MPI_Comm comm; comm = getComm(); MPI_Comm_rank( comm, &mypid ); sscanf(inName, "%s", param1); if ( outputLevel_ >= 1 && mypid == 0 ) printf("\tMLI_Method_AMGCR::setParam = %s\n", inName); if ( !strcmp(param1, "setOutputLevel" )) { sscanf(inName,"%s %d", param1, &level); return (setOutputLevel(level)); } else if ( !strcmp(param1, "setNumLevels" )) { sscanf(inName,"%s %d", param1, &level); return (setNumLevels(level)); } else if ( !strcmp(param1, "useMIS" )) { findMIS_ = 1; return 0; } else if ( !strcmp(param1, "setTargetMu" )) { sscanf(inName,"%s %lg", param1, &targetMu_); if (targetMu_ < 0.0) targetMu_ = 0.5; if (targetMu_ > 1.0) targetMu_ = 0.5; return 0; } else if ( !strcmp(param1, "setNumTrials" )) { sscanf(inName,"%s %d", param1, &numTrials_); if (numTrials_ < 1) numTrials_ = 1; return 0; } else if ( !strcmp(param1, "setNumVectors" )) { sscanf(inName,"%s %d", param1, &numVectors_); if (numVectors_ < 1) numVectors_ = 1; return 0; } else if ( !strcmp(param1, "setPDegree" )) { sscanf(inName,"%s %d", param1, &PDegree_); if (PDegree_ < 0) PDegree_ = 0; if (PDegree_ > 3) PDegree_ = 3; return 0; } else if ( !strcmp(param1, "setSmoother" )) { sscanf(inName,"%s %s", param1, param2); if ( argc != 2 ) { printf("MLI_Method_AMGCR::setParams ERROR - setSmoother needs"); printf(" 2 arguments.\n"); printf(" argument[0] : number of relaxation sweeps \n"); printf(" argument[1] : relaxation weights\n"); return 1; } nSweeps = *(int *) argv[0]; weights = (double *) argv[1]; smootherNum_ = nSweeps; if (smootherWgts_ != NULL) delete [] smootherWgts_; smootherWgts_ = new double[nSweeps]; for (i = 0; i < nSweeps; i++) smootherWgts_[i] = weights[i]; strcpy(smoother_, param2); return 0; } else if (!strcmp(param1, "setCoarseSolver")) { sscanf(inName,"%s %s", param1, param2); if ( strcmp(param2, "SuperLU") && argc != 2 ) { printf("MLI_Method_AMGCR::setParams ERROR - setCoarseSolver needs"); printf(" 2 arguments.\n"); printf(" argument[0] : number of relaxation sweeps \n"); printf(" argument[1] : relaxation weights\n"); return 1; } else if ( strcmp(param2, "SuperLU") ) { strcpy(coarseSolver_, param2); coarseSolverNum_ = *(int *) argv[0]; if (coarseSolverWgts_ != NULL) delete [] coarseSolverWgts_; coarseSolverWgts_ = new double[coarseSolverNum_]; weights = (double *) argv[1]; for (i = 0; i < coarseSolverNum_; i++) smootherWgts_[i] = weights[i]; } else if ( !strcmp(param2, "SuperLU") ) { if (coarseSolverWgts_ != NULL) delete [] coarseSolverWgts_; coarseSolverWgts_ = NULL; weights = NULL; coarseSolverNum_ = 1; } return 0; } else if ( !strcmp(param1, "setParamFile" )) { param3 = (char *) argv[0]; strcpy( paramFile_, param3 ); return 0; } else if ( !strcmp(param1, "print" )) { print(); return 0; } return 1; } /*********************************************************************** * generate multilevel structure * --------------------------------------------------------------------- */ int MLI_Method_AMGCR::setup( MLI *mli ) { int level, mypid, *ISMarker, localNRows; int irow, nrows, gNRows, numFpts, *fList;; int *ADiagI, *ADiagJ, jcol; double startTime, elapsedTime; char paramString[100], *targv[10]; MLI_Matrix *mli_Pmat, *mli_Rmat, *mli_Amat, *mli_cAmat, *mli_Affmat; MLI_Matrix *mli_Afcmat; MLI_Solver *smootherPtr, *csolvePtr; MPI_Comm comm; hypre_ParCSRMatrix *hypreA, *hypreP, *hypreR, *hypreAP, *hypreAC; hypre_CSRMatrix *ADiag; MLI_Function *funcPtr; #ifdef MLI_DEBUG_DETAILED printf("MLI_Method_AMGCR::setup begins...\n"); #endif /* --------------------------------------------------------------- */ /* traverse all levels */ /* --------------------------------------------------------------- */ RAPTime_ = 0.0; level = 0; comm = getComm(); MPI_Comm_rank( comm, &mypid ); totalTime_ = MLI_Utils_WTime(); for (level = 0; level < numLevels_; level++ ) { currLevel_ = level; if (level == numLevels_-1) break; /* -------------------------------------------------- */ /* fetch fine grid matrix information */ /* -------------------------------------------------- */ mli_Amat = mli->getSystemMatrix(level); hypre_assert (mli_Amat != NULL); hypreA = (hypre_ParCSRMatrix *) mli_Amat->getMatrix(); gNRows = hypre_ParCSRMatrixGlobalNumRows(hypreA); ADiag = hypre_ParCSRMatrixDiag(hypreA); localNRows = hypre_CSRMatrixNumRows(ADiag); if (localNRows < minCoarseSize_) break; if (mypid == 0 && outputLevel_ > 0) { printf("\t*****************************************************\n"); printf("\t*** AMGCR : level = %d, nrows = %d\n", level, gNRows); printf("\t-----------------------------------------------------\n"); } /* -------------------------------------------------- */ /* perform coarsening and P */ /* -------------------------------------------------- */ if (findMIS_ > 0) { #if 0 hypre_BoomerAMGCoarsen(hypreA, hypreA, 0, 0, &ISMarker); #else ISMarker = new int[localNRows]; for (irow = 0; irow < localNRows; irow++) ISMarker[irow] = 0; ADiag = hypre_ParCSRMatrixDiag(hypreA); ADiagI = hypre_CSRMatrixI(ADiag); ADiagJ = hypre_CSRMatrixJ(ADiag); for (irow = 0; irow < localNRows; irow++) { if (ISMarker[irow] == 0) { ISMarker[irow] = 1; for (jcol = ADiagI[irow]; jcol < ADiagI[irow+1]; jcol++) if (ISMarker[ADiagJ[jcol]] == 0) ISMarker[ADiagJ[jcol]] = -1; } } for (irow = 0; irow < localNRows; irow++) if (ISMarker[irow] < 0) ISMarker[irow] = 0; #endif } else { ISMarker = new int[localNRows]; for (irow = 0; irow < localNRows; irow++) ISMarker[irow] = 0; } for (irow = 0; irow < localNRows; irow++) if (ISMarker[irow] < 0) ISMarker[irow] = 0; mli_Affmat = performCR(mli_Amat, ISMarker, &mli_Afcmat); nrows = 0; for (irow = 0; irow < localNRows; irow++) if (ISMarker[irow] == 1) nrows++; if (nrows < minCoarseSize_) break; mli_Pmat = createPmat(ISMarker, mli_Amat, mli_Affmat, mli_Afcmat); delete mli_Afcmat; if (mli_Pmat == NULL) break; mli->setProlongation(level+1, mli_Pmat); mli_Rmat = createRmat(ISMarker, mli_Amat, mli_Affmat); mli->setRestriction(level, mli_Rmat); /* -------------------------------------------------- */ /* construct and set the coarse grid matrix */ /* -------------------------------------------------- */ startTime = MLI_Utils_WTime(); if (mypid == 0 && outputLevel_ > 0) printf("\tComputing RAP\n"); hypreP = (hypre_ParCSRMatrix *) mli_Pmat->getMatrix(); hypreR = (hypre_ParCSRMatrix *) mli_Rmat->getMatrix(); hypreAP = hypre_ParMatmul(hypreA, hypreP); hypreAC = hypre_ParMatmul(hypreR, hypreAP); sprintf(paramString, "HYPRE_ParCSR"); funcPtr = new MLI_Function(); MLI_Utils_HypreParCSRMatrixGetDestroyFunc(funcPtr); mli_cAmat = new MLI_Matrix((void*) hypreAC, paramString, funcPtr); delete funcPtr; hypre_ParCSRMatrixDestroy(hypreAP); mli->setSystemMatrix(level+1, mli_cAmat); elapsedTime = (MLI_Utils_WTime() - startTime); RAPTime_ += elapsedTime; if (mypid == 0 && outputLevel_ > 0) printf("\tRAP computed, time = %e seconds.\n", elapsedTime); /* -------------------------------------------------- */ /* set the smoothers */ /* (if domain decomposition and ARPACKA SuperLU */ /* smoothers is requested, perform special treatment, */ /* and if domain decomposition and SuperLU smoother */ /* is requested with multiple local subdomains, again */ /* perform special treatment.) */ /* -------------------------------------------------- */ smootherPtr = MLI_Solver_CreateFromName(smoother_); targv[0] = (char *) &smootherNum_; targv[1] = (char *) smootherWgts_; sprintf(paramString, "relaxWeight"); smootherPtr->setParams(paramString, 2, targv); numFpts = 0; for (irow = 0; irow < localNRows; irow++) if (ISMarker[irow] == 0) numFpts++; #if 1 if (numFpts > 0) { fList = new int[numFpts]; numFpts = 0; for (irow = 0; irow < localNRows; irow++) if (ISMarker[irow] == 0) fList[numFpts++] = irow; targv[0] = (char *) &numFpts; targv[1] = (char *) fList; sprintf(paramString, "setFptList"); smootherPtr->setParams(paramString, 2, targv); } sprintf(paramString, "setModifiedDiag"); smootherPtr->setParams(paramString, 0, NULL); smootherPtr->setup(mli_Affmat); mli->setSmoother(level, MLI_SMOOTHER_PRE, smootherPtr); sprintf(paramString, "ownAmat"); smootherPtr->setParams(paramString, 0, NULL); #else printf("whole grid smoothing\n"); smootherPtr->setup(mli_Amat); mli->setSmoother(level, MLI_SMOOTHER_PRE, smootherPtr); mli->setSmoother(level, MLI_SMOOTHER_POST, smootherPtr); #endif } /* --------------------------------------------------------------- */ /* set the coarse grid solver */ /* --------------------------------------------------------------- */ if (mypid == 0 && outputLevel_ > 0) printf("\tCoarse level = %d\n",level); csolvePtr = MLI_Solver_CreateFromName( coarseSolver_ ); if (strcmp(coarseSolver_, "SuperLU")) { targv[0] = (char *) &coarseSolverNum_; targv[1] = (char *) coarseSolverWgts_ ; sprintf(paramString, "relaxWeight"); csolvePtr->setParams(paramString, 2, targv); } mli_Amat = mli->getSystemMatrix(level); csolvePtr->setup(mli_Amat); mli->setCoarseSolve(csolvePtr); totalTime_ = MLI_Utils_WTime() - totalTime_; if (outputLevel_ >= 2) printStatistics(mli); #ifdef MLI_DEBUG_DETAILED printf("MLI_Method_AMGCR::setup ends."); #endif return (level+1); } /* ********************************************************************* * * set diagnostics output level * --------------------------------------------------------------------- */ int MLI_Method_AMGCR::setOutputLevel( int level ) { outputLevel_ = level; return 0; } /* ********************************************************************* * * set number of levels * --------------------------------------------------------------------- */ int MLI_Method_AMGCR::setNumLevels( int nlevels ) { if ( nlevels < maxLevels_ && nlevels > 0 ) numLevels_ = nlevels; return 0; } /* ********************************************************************* * * select independent set * --------------------------------------------------------------------- */ int MLI_Method_AMGCR::selectIndepSet(MLI_Matrix *mli_Amat, int **indepSet) { int irow, localNRows, numColsOffd, graphArraySize; int *graphArray, *graphArrayOffd, *ISMarker, *ISMarkerOffd=NULL; int nprocs, *ADiagI, *ADiagJ; double *measureArray; hypre_ParCSRMatrix *hypreA, *hypreS; hypre_CSRMatrix *ADiag, *AOffd, *SExt=NULL; MPI_Comm comm; hypreA = (hypre_ParCSRMatrix *) mli_Amat->getMatrix(); ADiag = hypre_ParCSRMatrixDiag(hypreA); ADiagI = hypre_CSRMatrixI(ADiag); ADiagJ = hypre_CSRMatrixJ(ADiag); AOffd = hypre_ParCSRMatrixOffd(hypreA); localNRows = hypre_CSRMatrixNumRows(ADiag); numColsOffd = hypre_CSRMatrixNumCols(AOffd); comm = getComm(); MPI_Comm_size(comm, &nprocs); measureArray = new double[localNRows+numColsOffd]; for (irow = 0; irow < localNRows+numColsOffd; irow++) measureArray[irow] = 0; for (irow = 0; irow < ADiagI[localNRows]; irow++) measureArray[ADiagJ[irow]] += 1; hypre_BoomerAMGCreateS(hypreA, 0.0e0, 0.0e0, 1, NULL, &hypreS); hypre_BoomerAMGIndepSetInit(hypreS, measureArray, 0); graphArraySize = localNRows; graphArray = new int[localNRows]; for (irow = 0; irow < localNRows; irow++) graphArray[irow] = irow; if (numColsOffd) graphArrayOffd = new int[numColsOffd]; else graphArrayOffd = NULL; for (irow = 0; irow < numColsOffd; irow++) graphArrayOffd[irow] = irow; ISMarker = new int[localNRows]; for (irow = 0; irow < localNRows; irow++) ISMarker[irow] = 0; if (numColsOffd) { ISMarkerOffd = new int[numColsOffd]; for (irow = 0; irow < numColsOffd; irow++) ISMarkerOffd[irow] = 0; } if (nprocs > 1) SExt = hypre_ParCSRMatrixExtractBExt(hypreA,hypreA,0); hypre_BoomerAMGIndepSet(hypreS, measureArray, graphArray, graphArraySize, graphArrayOffd, numColsOffd, ISMarker, ISMarkerOffd); delete [] measureArray; delete [] graphArray; if (numColsOffd > 0) delete [] graphArrayOffd; if (nprocs > 1) hypre_CSRMatrixDestroy(SExt); hypre_ParCSRMatrixDestroy(hypreS); if (numColsOffd > 0) delete [] ISMarkerOffd; (*indepSet) = ISMarker; return 0; } /* ********************************************************************* * * perform compatible relaxation * --------------------------------------------------------------------- */ MLI_Matrix *MLI_Method_AMGCR::performCR(MLI_Matrix *mli_Amat, int *indepSet, MLI_Matrix **AfcMat) { int nprocs, mypid, localNRows, iT, numFpts, irow, *reduceArray1; int *reduceArray2, iP, FStartRow, FNRows, ierr, *rowLengs; int startRow, rowIndex, colIndex, rowCount; int one=1, *ADiagI, *ADiagJ, *sortIndices, *fList; int idata, fPt, iV, ranSeed, jcol, rowCount2, CStartRow, CNRows; int newCount, it; #if 0 double relaxWts[5]; #endif double colValue, rnorm0, rnorm1, dOne=1.0; double *XaccData, ddata, threshold, *XData, arnorm0, arnorm1; double aratio, ratio1, ratio2, *ADiagA; char paramString[200]; HYPRE_IJMatrix IJPFF, IJPFC; hypre_ParCSRMatrix *hypreA, *hypreAff, *hyprePFC, *hypreAffT; hypre_ParCSRMatrix *hypreAfc, *hyprePFF, *hyprePFFT, *hypreAPFC; hypre_CSRMatrix *ADiag; HYPRE_IJVector IJB, IJX, IJXacc; hypre_ParVector *hypreB, *hypreX, *hypreXacc; MLI_Matrix *mli_PFFMat, *mli_AffMat, *mli_AfcMat, *mli_AffTMat; MLI_Vector *mli_Xvec, *mli_Bvec; #if 0 MLI_Solver *smootherPtr; #endif MPI_Comm comm; HYPRE_Solver hypreSolver; /* ------------------------------------------------------ */ /* get matrix and machine information */ /* ------------------------------------------------------ */ comm = getComm(); MPI_Comm_size(comm, &nprocs); MPI_Comm_rank(comm, &mypid); hypreA = (hypre_ParCSRMatrix *) mli_Amat->getMatrix(); ADiag = hypre_ParCSRMatrixDiag(hypreA); ADiagI = hypre_CSRMatrixI(ADiag); ADiagJ = hypre_CSRMatrixJ(ADiag); ADiagA = hypre_CSRMatrixData(ADiag); localNRows = hypre_CSRMatrixNumRows(ADiag); startRow = hypre_ParCSRMatrixFirstRowIndex(hypreA); fList = new int[localNRows]; /* ------------------------------------------------------ */ /* loop over number of trials */ /* ------------------------------------------------------ */ printf("\tPerform compatible relaxation\n"); arnorm1 = arnorm0 = 1; for (iT = 0; iT < numTrials_; iT++) { /* --------------------------------------------------- */ /* get Aff and Afc matrices (get dimension) */ /* --------------------------------------------------- */ numFpts = 0; for (irow = 0; irow < localNRows; irow++) if (indepSet[irow] != 1) fList[numFpts++] = irow; printf("\tTrial %3d (%3d) : number of F-points = %d\n", iT, numTrials_, numFpts); reduceArray1 = new int[nprocs+1]; reduceArray2 = new int[nprocs+1]; for (iP = 0; iP < nprocs; iP++) reduceArray1[iP] = 0; reduceArray1[mypid] = numFpts; MPI_Allreduce(reduceArray1,reduceArray2,nprocs,MPI_INT,MPI_SUM,comm); for (iP = nprocs-1; iP >= 0; iP--) reduceArray2[iP+1] = reduceArray2[iP]; reduceArray2[0] = 0; for (iP = 2; iP <= nprocs; iP++) reduceArray2[iP] += reduceArray2[iP-1]; FStartRow = reduceArray2[mypid]; FNRows = reduceArray2[mypid+1] - FStartRow; delete [] reduceArray1; delete [] reduceArray2; CStartRow = startRow - FStartRow; CNRows = localNRows - FNRows; /* --------------------------------------------------- */ /* get Aff and Afc matrices (create permute matrices) */ /* --------------------------------------------------- */ ierr = HYPRE_IJMatrixCreate(comm,startRow,startRow+localNRows-1, FStartRow,FStartRow+FNRows-1,&IJPFF); ierr = HYPRE_IJMatrixSetObjectType(IJPFF, HYPRE_PARCSR); hypre_assert(!ierr); rowLengs = new int[localNRows]; for (irow = 0; irow < localNRows; irow++) rowLengs[irow] = 1; ierr = HYPRE_IJMatrixSetRowSizes(IJPFF, rowLengs); ierr = HYPRE_IJMatrixInitialize(IJPFF); hypre_assert(!ierr); ierr = HYPRE_IJMatrixCreate(comm,startRow,startRow+localNRows-1, CStartRow,CStartRow+CNRows-1, &IJPFC); ierr = HYPRE_IJMatrixSetObjectType(IJPFC, HYPRE_PARCSR); hypre_assert(!ierr); ierr = HYPRE_IJMatrixSetRowSizes(IJPFC, rowLengs); ierr = HYPRE_IJMatrixInitialize(IJPFC); hypre_assert(!ierr); delete [] rowLengs; /* --------------------------------------------------- */ /* get Aff and Afc matrices (load permute matrices) */ /* --------------------------------------------------- */ colValue = 1.0; rowCount = rowCount2 = 0; for (irow = 0; irow < localNRows; irow++) { rowIndex = startRow + irow; if (indepSet[irow] == 0) { colIndex = FStartRow + rowCount; HYPRE_IJMatrixSetValues(IJPFF,1,&one,(const int *) &rowIndex, (const int *) &colIndex, (const double *) &colValue); rowCount++; } else { colIndex = CStartRow + rowCount2; HYPRE_IJMatrixSetValues(IJPFC,1,&one,(const int *) &rowIndex, (const int *) &colIndex, (const double *) &colValue); rowCount2++; } } ierr = HYPRE_IJMatrixAssemble(IJPFF); hypre_assert( !ierr ); HYPRE_IJMatrixGetObject(IJPFF, (void **) &hyprePFF); //hypre_MatvecCommPkgCreate((hypre_ParCSRMatrix *) hyprePFF); sprintf(paramString, "HYPRE_ParCSR" ); mli_PFFMat = new MLI_Matrix((void *)hyprePFF,paramString,NULL); ierr = HYPRE_IJMatrixAssemble(IJPFC); hypre_assert( !ierr ); HYPRE_IJMatrixGetObject(IJPFC, (void **) &hyprePFC); //hypre_MatvecCommPkgCreate((hypre_ParCSRMatrix *) hyprePFC); hypreAPFC = hypre_ParMatmul(hypreA, hyprePFC); hypre_ParCSRMatrixTranspose(hyprePFF, &hyprePFFT, 1); hypreAfc = hypre_ParMatmul(hyprePFFT, hypreAPFC); sprintf(paramString, "HYPRE_ParCSR" ); mli_AfcMat = new MLI_Matrix((void *)hypreAfc,paramString,NULL); MLI_Matrix_ComputePtAP(mli_PFFMat, mli_Amat, &mli_AffMat); hypreAff = (hypre_ParCSRMatrix *) mli_AffMat->getMatrix(); if (arnorm1/arnorm0 < targetMu_) break; #define HAVE_TRANS #ifdef HAVE_TRANS MLI_Matrix_Transpose(mli_AffMat, &mli_AffTMat); hypreAffT = (hypre_ParCSRMatrix *) mli_AffTMat->getMatrix(); #endif HYPRE_IJVectorCreate(comm,FStartRow, FStartRow+FNRows-1,&IJX); HYPRE_IJVectorSetObjectType(IJX, HYPRE_PARCSR); HYPRE_IJVectorInitialize(IJX); HYPRE_IJVectorAssemble(IJX); HYPRE_IJVectorGetObject(IJX, (void **) &hypreX); sprintf(paramString, "HYPRE_ParVector" ); mli_Xvec = new MLI_Vector((void *)hypreX,paramString,NULL); HYPRE_IJVectorCreate(comm,FStartRow, FStartRow+FNRows-1,&IJXacc); HYPRE_IJVectorSetObjectType(IJXacc, HYPRE_PARCSR); HYPRE_IJVectorInitialize(IJXacc); HYPRE_IJVectorAssemble(IJXacc); HYPRE_IJVectorGetObject(IJXacc, (void **) &hypreXacc); hypre_ParVectorSetConstantValues(hypreXacc, 0.0); HYPRE_IJVectorCreate(comm,FStartRow, FStartRow+FNRows-1,&IJB); HYPRE_IJVectorSetObjectType(IJB, HYPRE_PARCSR); HYPRE_IJVectorInitialize(IJB); HYPRE_IJVectorAssemble(IJB); HYPRE_IJVectorGetObject(IJB, (void **) &hypreB); hypre_ParVectorSetConstantValues(hypreB, 0.0); sprintf(paramString, "HYPRE_ParVector" ); mli_Bvec = new MLI_Vector((void *)hypreB,paramString,NULL); #if 0 /* --------------------------------------------------- */ /* set up Jacobi smoother with 4 sweeps and weight=1 */ /* --------------------------------------------------- */ strcpy(paramString, "Jacobi"); smootherPtr = MLI_Solver_CreateFromName(paramString); targc = 2; numSweeps = 1; targv[0] = (char *) &numSweeps; for (i = 0; i < 5; i++) relaxWts[i] = 1.0; targv[1] = (char *) relaxWts; strcpy(paramString, "relaxWeight"); smootherPtr->setParams(paramString, targc, targv); maxEigen = 1.0; targc = 1; targv[0] = (char *) &maxEigen; strcpy(paramString, "setMaxEigen"); smootherPtr->setParams(paramString, targc, targv); smootherPtr->setup(mli_AffMat); /* --------------------------------------------------- */ /* relaxation */ /* --------------------------------------------------- */ targc = 2; targv[0] = (char *) &numSweeps; targv[1] = (char *) relaxWts; strcpy(paramString, "relaxWeight"); arnorm0 = 1.0; arnorm1 = 0.0; aratio = 0.0; XData = (double *) hypre_VectorData(hypre_ParVectorLocalVector(hypreX)); for (iV = 0; iV < numVectors_; iV++) { ranSeed = 9001 * 7901 * iV *iV * iV * iV + iV * iV * iV + 101; HYPRE_ParVectorSetRandomValues((HYPRE_ParVector) hypreX,ranSeed); for (irow = 0; irow < FNRows; irow++) XData[irow] = 0.5 * XData[irow] + 0.5; hypre_ParVectorSetConstantValues(hypreB, 0.0); hypre_ParCSRMatrixMatvec(-1.0, hypreAff, hypreX, 1.0, hypreB); rnorm0 = sqrt(hypre_ParVectorInnerProd(hypreB, hypreB)); hypre_ParVectorSetConstantValues(hypreB, 0.0); numSweeps = 5; smootherPtr->setParams(paramString, targc, targv); smootherPtr->solve(mli_Bvec, mli_Xvec); hypre_ParCSRMatrixMatvec(-1.0, hypreAff, hypreX, 1.0, hypreB); rnorm1 = sqrt(hypre_ParVectorInnerProd(hypreB, hypreB)); rnorm0 = rnorm1; hypre_ParVectorSetConstantValues(hypreB, 0.0); numSweeps = 1; smootherPtr->setParams(paramString, targc, targv); smootherPtr->solve(mli_Bvec, mli_Xvec); hypre_ParCSRMatrixMatvec(-1.0, hypreAff, hypreX, 1.0, hypreB); rnorm1 = sqrt(hypre_ParVectorInnerProd(hypreB, hypreB)); hypre_ParVectorAxpy(dOne, hypreX, hypreXacc); printf("\tTrial %3d : Jacobi norms = %16.8e %16.8e\n",iT, rnorm0,rnorm1); if (iV == 0) arnorm0 = rnorm0; else arnorm0 += rnorm0; arnorm1 += rnorm1; if (rnorm0 < 1.0e-10) rnorm0 = 1.0; ratio1 = ratio2 = rnorm1 / rnorm0; aratio += ratio1; if (ratio1 < targetMu_) break; } delete smootherPtr; #else MLI_Utils_mJacobiCreate(comm, &hypreSolver); MLI_Utils_mJacobiSetParams(hypreSolver, PDegree_); XData = (double *) hypre_VectorData(hypre_ParVectorLocalVector(hypreX)); aratio = 0.0; for (iV = 0; iV < numVectors_; iV++) { ranSeed = 9001 * 7901 * iV *iV * iV * iV + iV * iV * iV + 101; /* ------------------------------------------------------- */ /* CR with A */ /* ------------------------------------------------------- */ HYPRE_ParVectorSetRandomValues((HYPRE_ParVector) hypreX,ranSeed); for (irow = 0; irow < FNRows; irow++) XData[irow] = 0.5 * XData[irow] + 0.5; hypre_ParVectorSetConstantValues(hypreB, 0.0); hypre_ParCSRMatrixMatvec(-1.0, hypreAff, hypreX, 1.0, hypreB); rnorm0 = sqrt(hypre_ParVectorInnerProd(hypreB, hypreB)); hypre_ParVectorSetConstantValues(hypreB, 0.0); strcpy(paramString, "pJacobi"); MLI_Utils_HypreGMRESSolve(hypreSolver, (HYPRE_Matrix) hypreAff, (HYPRE_Vector) hypreB, (HYPRE_Vector) hypreX, paramString); hypre_ParCSRMatrixMatvec(-1.0, hypreAff, hypreX, 1.0, hypreB); rnorm1 = sqrt(hypre_ParVectorInnerProd(hypreB, hypreB)); if (rnorm1 < rnorm0 * 1.0e-10 || rnorm1 < 1.0e-10) { printf("\tperformCR : rnorm0, rnorm1 = %e %e\n",rnorm0,rnorm1); break; } rnorm0 = rnorm1; hypre_ParVectorSetConstantValues(hypreB, 0.0); strcpy(paramString, "mJacobi"); MLI_Utils_HypreGMRESSolve(hypreSolver, (HYPRE_Matrix) hypreAff, (HYPRE_Vector) hypreB, (HYPRE_Vector) hypreX, paramString); hypre_ParCSRMatrixMatvec(-1.0, hypreAff, hypreX, 1.0, hypreB); rnorm1 = sqrt(hypre_ParVectorInnerProd(hypreB, hypreB)); rnorm1 = 0.2 * log10(rnorm1/rnorm0); rnorm1 = pow(1.0e1, rnorm1); ratio1 = rnorm1; /* ------------------------------------------------------- */ /* CR with A^T */ /* ------------------------------------------------------- */ #ifdef HAVE_TRANS HYPRE_ParVectorSetRandomValues((HYPRE_ParVector) hypreX,ranSeed); for (irow = 0; irow < FNRows; irow++) XData[irow] = 0.5 * XData[irow] + 0.5; hypre_ParVectorSetConstantValues(hypreB, 0.0); hypre_ParCSRMatrixMatvec(-1.0, hypreAff, hypreX, 1.0, hypreB); rnorm0 = sqrt(hypre_ParVectorInnerProd(hypreB, hypreB)); hypre_ParVectorSetConstantValues(hypreB, 0.0); strcpy(paramString, "pJacobi"); MLI_Utils_HypreGMRESSolve(hypreSolver, (HYPRE_Matrix) hypreAffT, (HYPRE_Vector) hypreB, (HYPRE_Vector) hypreX, paramString); hypre_ParCSRMatrixMatvec(-1.0, hypreAffT, hypreX, 1.0, hypreB); rnorm1 = sqrt(hypre_ParVectorInnerProd(hypreB, hypreB)); if (rnorm1 < rnorm0 * 1.0e-10 || rnorm1 < 1.0e-10) break; rnorm0 = rnorm1; hypre_ParVectorSetConstantValues(hypreB, 0.0); strcpy(paramString, "mJacobi"); MLI_Utils_HypreGMRESSolve(hypreSolver, (HYPRE_Matrix) hypreAffT, (HYPRE_Vector) hypreB, (HYPRE_Vector) hypreX, paramString); hypre_ParCSRMatrixMatvec(-1.0, hypreAffT, hypreX, 1.0, hypreB); rnorm1 = sqrt(hypre_ParVectorInnerProd(hypreB, hypreB)); rnorm1 = 0.2 * log10(rnorm1/rnorm0); ratio2 = pow(1.0e1, rnorm1); if (ratio1 > ratio2) aratio += ratio1; else aratio += ratio2; #else aratio += ratio1; ratio2 = 0; #endif /* ------------------------------------------------------- */ /* accumulate error vector */ /* ------------------------------------------------------- */ hypre_ParVectorAxpy(dOne, hypreX, hypreXacc); if (ratio1 < targetMu_ && ratio2 < targetMu_) { printf("\tTrial %3d(%3d) : GMRES norms ratios = %16.8e %16.8e ##\n", iT, iV, ratio1, ratio2); break; } else printf("\tTrial %3d(%3d) : GMRES norms ratios = %16.8e %16.8e\n", iT, iV, ratio1, ratio2); } MLI_Utils_mJacobiDestroy(hypreSolver); #endif /* --------------------------------------------------- */ /* select coarse points */ /* --------------------------------------------------- */ if (iV == numVectors_) aratio /= (double) numVectors_; printf("aratio = %e\n", aratio); if ((aratio >= targetMu_ || (iT == 0 && localNRows == FNRows)) && iT < (numTrials_-1)) { XaccData = (double *) hypre_VectorData(hypre_ParVectorLocalVector(hypreXacc)); sortIndices = new int[FNRows]; for (irow = 0; irow < FNRows; irow++) sortIndices[irow] = irow; for (irow = 0; irow < FNRows; irow++) if (XaccData[irow] < 0.0) XaccData[irow] = - XaccData[irow]; //MLI_Utils_DbleQSort2a(XaccData, sortIndices, 0, FNRows-1); if (FNRows > 0) threshold = XaccData[FNRows-1] * cutThreshold_; #if 0 newCount = 0; for (ic = 0; ic < localNRows; ic++) { threshold = XaccData[FNRows-1] * cutThreshold_; for (it = 0; it < 6; it++) { for (irow = FNRows-1; irow >= 0; irow--) { ddata = XaccData[irow]; if (ddata > threshold) { idata = sortIndices[irow]; fPt = fList[idata]; if (indepSet[fPt] == 0) { count = 0; for (jcol = ADiagI[fPt]; jcol < ADiagI[fPt+1]; jcol++) if (indepSet[ADiagJ[jcol]] == 1) count++; if (count <= ic) { newCount++; indepSet[fPt] = 1; for (jcol = ADiagI[fPt];jcol < ADiagI[fPt+1];jcol++) if (indepSet[ADiagJ[jcol]] == 0) indepSet[ADiagJ[jcol]] = -1; } } } } threshold *= 0.1; for (irow = 0; irow < localNRows; irow++) if (indepSet[irow] < 0) indepSet[irow] = 0; if ((localNRows+newCount-FNRows) > (localNRows/2) && ic > 2) { if (((double) newCount/ (double) localNRows) > 0.05) break; } } if ((localNRows+newCount-FNRows) > (localNRows/2) && ic > 2) { if (((double) newCount/ (double) localNRows) > 0.05) break; } } #else newCount = 0; threshold = XaccData[FNRows-1] * cutThreshold_; for (it = 0; it < 1; it++) { for (irow = FNRows-1; irow >= 0; irow--) { ddata = XaccData[irow]; if (ddata > threshold) { idata = sortIndices[irow]; fPt = fList[idata]; if (indepSet[fPt] == 0) { newCount++; indepSet[fPt] = 1; for (jcol = ADiagI[fPt];jcol < ADiagI[fPt+1];jcol++) if (indepSet[ADiagJ[jcol]] == 0 && habs(ADiagA[jcol]/ADiagA[ADiagI[fPt]]) > 1.0e-12) indepSet[ADiagJ[jcol]] = -1; } } } threshold *= 0.1; for (irow = 0; irow < localNRows; irow++) if (indepSet[irow] < 0) indepSet[irow] = 0; if ((localNRows+newCount-FNRows) > (localNRows/2)) { if (((double) newCount/ (double) localNRows) > 0.1) break; } } #endif delete [] sortIndices; if (newCount == 0) { printf("CR stops because newCount = 0\n"); break; } } /* --------------------------------------------------- */ /* clean up */ /* --------------------------------------------------- */ HYPRE_IJMatrixDestroy(IJPFF); hypre_ParCSRMatrixDestroy(hyprePFFT); hypre_ParCSRMatrixDestroy(hypreAPFC); #ifdef HAVE_TRANS delete mli_AffTMat; #endif HYPRE_IJMatrixDestroy(IJPFC); HYPRE_IJVectorDestroy(IJX); HYPRE_IJVectorDestroy(IJB); HYPRE_IJVectorDestroy(IJXacc); delete mli_Bvec; delete mli_Xvec; if (aratio < targetMu_ && iT != 0) break; if (numTrials_ == 1) break; delete mli_AffMat; delete mli_AfcMat; hypre_ParCSRMatrixDestroy(hypreAfc); } /* ------------------------------------------------------ */ /* final clean up */ /* ------------------------------------------------------ */ delete [] fList; (*AfcMat) = mli_AfcMat; return mli_AffMat; } /* ********************************************************************* * * create the prolongation matrix * --------------------------------------------------------------------- */ MLI_Matrix *MLI_Method_AMGCR::createPmat(int *indepSet, MLI_Matrix *mli_Amat, MLI_Matrix *mli_Affmat, MLI_Matrix *mli_Afcmat) { int *ADiagI, *ADiagJ, localNRows, AffNRows, AffStartRow, irow; int *rowLengs, ierr, startRow, rowCount, rowIndex, colIndex; int *colInd, rowSize, jcol, one=1, maxRowLeng, nnz; int *tPDiagI, *tPDiagJ, cCount, fCount, ncount, *ADDiagI, *ADDiagJ; int *AD2DiagI, *AD2DiagJ, *newColInd, newRowSize; int nprocs, AccStartRow, AccNRows; double *ADiagA, *colVal, colValue, *newColVal, *DDiagA; double *tPDiagA, *ADDiagA, *AD2DiagA, omega=1, dtemp; char paramString[100]; HYPRE_IJMatrix IJInvD, IJP; hypre_ParCSRMatrix *hypreA, *hypreAff, *hypreInvD, *hypreP=NULL, *hypreAD; hypre_ParCSRMatrix *hypreAD2, *hypreAfc, *hypreTmp; hypre_CSRMatrix *ADiag, *DDiag, *tPDiag, *ADDiag, *AD2Diag; MLI_Function *funcPtr; MLI_Matrix *mli_Pmat; MPI_Comm comm; HYPRE_Solver ps; /* ------------------------------------------------------ */ /* get matrix information */ /* ------------------------------------------------------ */ comm = getComm(); MPI_Comm_size(comm, &nprocs); hypreA = (hypre_ParCSRMatrix *) mli_Amat->getMatrix(); startRow = hypre_ParCSRMatrixFirstRowIndex(hypreA); localNRows = hypre_ParCSRMatrixNumRows(hypreA); hypreAff = (hypre_ParCSRMatrix *) mli_Affmat->getMatrix(); AffStartRow = hypre_ParCSRMatrixFirstRowIndex(hypreAff); AffNRows = hypre_ParCSRMatrixNumRows(hypreAff); /* ------------------------------------------------------ */ /* create the diagonal matrix of A */ /* ------------------------------------------------------ */ ierr = HYPRE_IJMatrixCreate(comm,AffStartRow,AffStartRow+AffNRows-1, AffStartRow,AffStartRow+AffNRows-1,&IJInvD); ierr = HYPRE_IJMatrixSetObjectType(IJInvD, HYPRE_PARCSR); hypre_assert(!ierr); rowLengs = new int[AffNRows]; for (irow = 0; irow < AffNRows; irow++) rowLengs[irow] = 1; ierr = HYPRE_IJMatrixSetRowSizes(IJInvD, rowLengs); ierr = HYPRE_IJMatrixInitialize(IJInvD); hypre_assert(!ierr); delete [] rowLengs; /* ------------------------------------------------------ */ /* load the diagonal matrix of A */ /* ------------------------------------------------------ */ rowCount = 0; for (irow = 0; irow < localNRows; irow++) { rowIndex = startRow + irow; if (indepSet[irow] == 0) { HYPRE_ParCSRMatrixGetRow((HYPRE_ParCSRMatrix) hypreA, rowIndex, &rowSize, &colInd, &colVal); colValue = 1.0; for (jcol = 0; jcol < rowSize; jcol++) { if (colInd[jcol] == rowIndex) { colValue = colVal[jcol]; break; } } if (colValue >= 0.0) { for (jcol = 0; jcol < rowSize; jcol++) if (colInd[jcol] != rowIndex && (indepSet[colInd[jcol]-startRow] == 0) && colVal[jcol] > 0.0) colValue += colVal[jcol]; } else { for (jcol = 0; jcol < rowSize; jcol++) if (colInd[jcol] != rowIndex && (indepSet[colInd[jcol]-startRow] == 0) && colVal[jcol] < 0.0) colValue += colVal[jcol]; } colValue = 1.0 / colValue; colIndex = AffStartRow + rowCount; HYPRE_IJMatrixSetValues(IJInvD,1,&one,(const int *) &colIndex, (const int *) &colIndex, (const double *) &colValue); rowCount++; HYPRE_ParCSRMatrixRestoreRow((HYPRE_ParCSRMatrix) hypreA, rowIndex, &rowSize, &colInd, &colVal); } } /* ------------------------------------------------------ */ /* finally assemble the diagonal matrix of A */ /* ------------------------------------------------------ */ ierr = HYPRE_IJMatrixAssemble(IJInvD); hypre_assert( !ierr ); HYPRE_IJMatrixGetObject(IJInvD, (void **) &hypreInvD); ierr += HYPRE_IJMatrixSetObjectType(IJInvD, -1); ierr += HYPRE_IJMatrixDestroy(IJInvD); hypre_assert( !ierr ); /* ------------------------------------------------------ */ /* generate polynomial of Aff and invD */ /* ------------------------------------------------------ */ if (PDegree_ == 0) { hypreP = hypreInvD; hypreInvD = NULL; ADiag = hypre_ParCSRMatrixDiag(hypreP); ADiagI = hypre_CSRMatrixI(ADiag); ADiagJ = hypre_CSRMatrixJ(ADiag); ADiagA = hypre_CSRMatrixData(ADiag); for (irow = 0; irow < AffNRows; irow++) for (jcol = ADiagI[irow]; jcol < ADiagI[irow+1]; jcol++) ADiagA[jcol] = - ADiagA[jcol]; } else if (PDegree_ == 1) { #if 1 hypreP = hypre_ParMatmul(hypreAff, hypreInvD); DDiag = hypre_ParCSRMatrixDiag(hypreInvD); DDiagA = hypre_CSRMatrixData(DDiag); ADiag = hypre_ParCSRMatrixDiag(hypreP); ADiagI = hypre_CSRMatrixI(ADiag); ADiagJ = hypre_CSRMatrixJ(ADiag); ADiagA = hypre_CSRMatrixData(ADiag); for (irow = 0; irow < AffNRows; irow++) { for (jcol = ADiagI[irow]; jcol < ADiagI[irow+1]; jcol++) { if (ADiagJ[jcol] == irow) ADiagA[jcol] = - omega*DDiagA[irow]*(2.0-omega*ADiagA[jcol]); else ADiagA[jcol] = omega * omega * DDiagA[irow] * ADiagA[jcol]; } } #else ierr = HYPRE_IJMatrixCreate(comm,AffStartRow,AffStartRow+AffNRows-1, AffStartRow,AffStartRow+AffNRows-1,&IJP); ierr = HYPRE_IJMatrixSetObjectType(IJP, HYPRE_PARCSR); hypre_assert(!ierr); rowLengs = new int[AffNRows]; maxRowLeng = 0; ADiag = hypre_ParCSRMatrixDiag(hypreAff); ADiagI = hypre_CSRMatrixI(ADiag); ADiagJ = hypre_CSRMatrixJ(ADiag); ADiagA = hypre_CSRMatrixData(ADiag); for (irow = 0; irow < AffNRows; irow++) { newRowSize = 1; for (jcol = ADiagI[irow]; jcol < ADiagI[irow+1]; jcol++) if (ADiagJ[jcol] == irow) {index = jcol; break;} for (jcol = ADiagI[irow]; jcol < ADiagI[irow+1]; jcol++) if (ADiagJ[jcol] != irow && ADiagA[jcol]*ADiagA[index] < 0.0) newRowSize++; rowLengs[irow] = newRowSize; if (newRowSize > maxRowLeng) maxRowLeng = newRowSize; } ierr = HYPRE_IJMatrixSetRowSizes(IJP, rowLengs); ierr = HYPRE_IJMatrixInitialize(IJP); hypre_assert(!ierr); delete [] rowLengs; newColInd = new int[maxRowLeng]; newColVal = new double[maxRowLeng]; for (irow = 0; irow < AffNRows; irow++) { newRowSize = 0; index = -1; for (jcol = ADiagI[irow]; jcol < ADiagI[irow+1]; jcol++) if (ADiagJ[jcol] == irow) {index = jcol; break;} if (index == -1) printf("WARNING : zero diagonal.\n"); newColInd[0] = AffStartRow + irow; newColVal[0] = ADiagA[index]; newRowSize++; for (jcol = ADiagI[irow]; jcol < ADiagI[irow+1]; jcol++) { if (ADiagJ[jcol] != irow && ADiagA[jcol]*ADiagA[index] < 0.0) { newColInd[newRowSize] = AffStartRow + ADiagJ[jcol]; newColVal[newRowSize++] = ADiagA[jcol]; } else { newColVal[0] += ADiagA[jcol]; } } for (jcol = 1; jcol < newRowSize; jcol++) newColVal[jcol] /= (-newColVal[0]); newColVal[0] = 1.0; rowIndex = AffStartRow + irow; ierr = HYPRE_IJMatrixSetValues(IJP, 1, &newRowSize, (const int *) &rowIndex, (const int *) newColInd, (const double *) newColVal); hypre_assert(!ierr); } delete [] newColInd; delete [] newColVal; ierr = HYPRE_IJMatrixAssemble(IJP); hypre_assert( !ierr ); HYPRE_IJMatrixGetObject(IJP, (void **) &hypreAD); hypreP = hypre_ParMatmul(hypreAD, hypreInvD); ierr += HYPRE_IJMatrixDestroy(IJP); #endif } else if (PDegree_ == 2) { hypreAD = hypre_ParMatmul(hypreAff, hypreInvD); hypreAD2 = hypre_ParMatmul(hypreAD, hypreAD); ADDiag = hypre_ParCSRMatrixDiag(hypreAD); AD2Diag = hypre_ParCSRMatrixDiag(hypreAD2); ADDiagI = hypre_CSRMatrixI(ADDiag); ADDiagJ = hypre_CSRMatrixJ(ADDiag); ADDiagA = hypre_CSRMatrixData(ADDiag); AD2DiagI = hypre_CSRMatrixI(AD2Diag); AD2DiagJ = hypre_CSRMatrixJ(AD2Diag); AD2DiagA = hypre_CSRMatrixData(AD2Diag); DDiag = hypre_ParCSRMatrixDiag(hypreInvD); DDiagA = hypre_CSRMatrixData(DDiag); newColInd = new int[2*AffNRows]; newColVal = new double[2*AffNRows]; ierr = HYPRE_IJMatrixCreate(comm,AffStartRow,AffStartRow+AffNRows-1, AffStartRow,AffStartRow+AffNRows-1,&IJP); ierr = HYPRE_IJMatrixSetObjectType(IJP, HYPRE_PARCSR); hypre_assert(!ierr); rowLengs = new int[AffNRows]; maxRowLeng = 0; for (irow = 0; irow < AffNRows; irow++) { newRowSize = 0; for (jcol = ADDiagI[irow]; jcol < ADDiagI[irow+1]; jcol++) newColInd[newRowSize] = ADDiagJ[jcol]; for (jcol = AD2DiagI[irow]; jcol < AD2DiagI[irow+1]; jcol++) newColInd[newRowSize] = AD2DiagJ[jcol]; if (newRowSize > maxRowLeng) maxRowLeng = newRowSize; hypre_qsort0(newColInd, 0, newRowSize-1); ncount = 0; for ( jcol = 0; jcol < newRowSize; jcol++ ) { if ( newColInd[jcol] != newColInd[ncount] ) { ncount++; newColInd[ncount] = newColInd[jcol]; } } newRowSize = ncount + 1; rowLengs[irow] = newRowSize; } ierr = HYPRE_IJMatrixSetRowSizes(IJP, rowLengs); ierr = HYPRE_IJMatrixInitialize(IJP); hypre_assert(!ierr); delete [] rowLengs; nnz = 0; for (irow = 0; irow < AffNRows; irow++) { rowIndex = AffStartRow + irow; newRowSize = 0; for (jcol = ADDiagI[irow]; jcol < ADDiagI[irow+1]; jcol++) { newColInd[newRowSize] = ADDiagJ[jcol]; if (ADDiagJ[jcol] == irow) newColVal[newRowSize++] = 3.0 * (1.0 - ADDiagA[jcol]); else newColVal[newRowSize++] = - 3.0 * ADDiagA[jcol]; } for (jcol = AD2DiagI[irow]; jcol < AD2DiagI[irow+1]; jcol++) { newColInd[newRowSize] = AD2DiagJ[jcol]; newColVal[newRowSize++] = AD2DiagA[jcol]; } hypre_qsort1(newColInd, newColVal, 0, newRowSize-1); ncount = 0; for ( jcol = 0; jcol < newRowSize; jcol++ ) { if ( jcol != ncount && newColInd[jcol] == newColInd[ncount] ) newColVal[ncount] += newColVal[jcol]; else if ( newColInd[jcol] != newColInd[ncount] ) { ncount++; newColVal[ncount] = newColVal[jcol]; newColInd[ncount] = newColInd[jcol]; } } newRowSize = ncount + 1; for ( jcol = 0; jcol < newRowSize; jcol++ ) newColVal[jcol] = - (DDiagA[irow] * newColVal[jcol]); ierr = HYPRE_IJMatrixSetValues(IJP, 1, &newRowSize, (const int *) &rowIndex, (const int *) newColInd, (const double *) newColVal); nnz += newRowSize; hypre_assert(!ierr); } delete [] newColInd; delete [] newColVal; ierr = HYPRE_IJMatrixAssemble(IJP); hypre_assert( !ierr ); HYPRE_IJMatrixGetObject(IJP, (void **) &hypreP); ierr += HYPRE_IJMatrixSetObjectType(IJP, -1); ierr += HYPRE_IJMatrixDestroy(IJP); hypre_assert(!ierr); hypre_ParCSRMatrixDestroy(hypreAD); hypre_ParCSRMatrixDestroy(hypreAD2); } else if (PDegree_ == 3) { printf("start parasails\n"); HYPRE_ParaSailsCreate(comm, &ps); HYPRE_ParaSailsSetParams(ps, 1.0e-2, 2); HYPRE_ParaSailsSetFilter(ps, 1.0e-2); HYPRE_ParaSailsSetSym(ps, 0); HYPRE_ParaSailsSetLogging(ps, 1); HYPRE_ParaSailsSetup(ps, (HYPRE_ParCSRMatrix) hypreAff, NULL, NULL); HYPRE_ParaSailsBuildIJMatrix(ps, &IJP); HYPRE_IJMatrixGetObject(IJP, (void **) &hypreP); printf("finish parasails\n"); } if (hypreInvD != NULL) hypre_ParCSRMatrixDestroy(hypreInvD); /* ------------------------------------------------------ */ /* create the final P matrix (from hypreP) */ /* ------------------------------------------------------ */ hypreAfc = (hypre_ParCSRMatrix *) mli_Afcmat->getMatrix(); hypreTmp = hypre_ParMatmul(hypreP, hypreAfc); hypre_ParCSRMatrixDestroy(hypreP); hypreP = hypreTmp; tPDiag = hypre_ParCSRMatrixDiag(hypreP); tPDiagI = hypre_CSRMatrixI(tPDiag); tPDiagJ = hypre_CSRMatrixJ(tPDiag); tPDiagA = hypre_CSRMatrixData(tPDiag); AccStartRow = startRow - AffStartRow; AccNRows = localNRows - AffNRows; ierr = HYPRE_IJMatrixCreate(comm,startRow,startRow+localNRows-1, AccStartRow,AccStartRow+AccNRows-1,&IJP); ierr = HYPRE_IJMatrixSetObjectType(IJP, HYPRE_PARCSR); hypre_assert(!ierr); rowLengs = new int[localNRows]; maxRowLeng = 0; ncount = 0; for (irow = 0; irow < localNRows; irow++) { if (indepSet[irow] == 1) rowLengs[irow] = 1; else { rowLengs[irow] = tPDiagI[ncount+1] - tPDiagI[ncount]; ncount++; } if (rowLengs[irow] > maxRowLeng) maxRowLeng = rowLengs[irow]; } ierr = HYPRE_IJMatrixSetRowSizes(IJP, rowLengs); ierr = HYPRE_IJMatrixInitialize(IJP); hypre_assert(!ierr); delete [] rowLengs; fCount = 0; cCount = 0; newColInd = new int[maxRowLeng]; newColVal = new double[maxRowLeng]; for (irow = 0; irow < localNRows; irow++) { rowIndex = startRow + irow; if (indepSet[irow] == 1) { newRowSize = 1; newColInd[0] = AccStartRow + cCount; newColVal[0] = 1.0; cCount++; } else { newRowSize = 0; for (jcol = tPDiagI[fCount]; jcol < tPDiagI[fCount+1]; jcol++) { newColInd[newRowSize] = tPDiagJ[jcol] + AccStartRow; newColVal[newRowSize++] = tPDiagA[jcol]; } fCount++; } // pruning #if 1 if (irow == 0) printf("pruning and scaling\n"); dtemp = 0.0; for (jcol = 0; jcol < newRowSize; jcol++) if (habs(newColVal[jcol]) > dtemp) dtemp = habs(newColVal[jcol]); dtemp *= 0.25; ncount = 0; for (jcol = 0; jcol < newRowSize; jcol++) if (habs(newColVal[jcol]) > dtemp) { newColInd[ncount] = newColInd[jcol]; newColVal[ncount++] = newColVal[jcol]; } newRowSize = ncount; #endif // scaling #if 0 dtemp = 0.0; for (jcol = 0; jcol < newRowSize; jcol++) dtemp += habs(newColVal[jcol]); dtemp = 1.0 / dtemp; for (jcol = 0; jcol < newRowSize; jcol++) newColVal[jcol] *= dtemp; #endif if (PDegree_ == 3) { for (jcol = 0; jcol < newRowSize; jcol++) newColVal[jcol] = - newColVal[jcol]; } ierr = HYPRE_IJMatrixSetValues(IJP, 1, &newRowSize, (const int *) &rowIndex, (const int *) newColInd, (const double *) newColVal); hypre_assert(!ierr); } delete [] newColInd; delete [] newColVal; ierr = HYPRE_IJMatrixAssemble(IJP); hypre_assert( !ierr ); hypre_ParCSRMatrixDestroy(hypreP); HYPRE_IJMatrixGetObject(IJP, (void **) &hypreP); ierr += HYPRE_IJMatrixSetObjectType(IJP, -1); ierr += HYPRE_IJMatrixDestroy(IJP); hypre_assert(!ierr); /* ------------------------------------------------------ */ /* package the P matrix */ /* ------------------------------------------------------ */ sprintf(paramString, "HYPRE_ParCSR"); funcPtr = new MLI_Function(); MLI_Utils_HypreParCSRMatrixGetDestroyFunc(funcPtr); mli_Pmat = new MLI_Matrix((void*) hypreP, paramString, funcPtr); delete funcPtr; return mli_Pmat; } /* ********************************************************************* * * create the restriction matrix * --------------------------------------------------------------------- */ MLI_Matrix *MLI_Method_AMGCR::createRmat(int *indepSet, MLI_Matrix *mli_Amat, MLI_Matrix *mli_Affmat) { int startRow, localNRows, AffStartRow, AffNRows, RStartRow; int RNRows, ierr, *rowLengs, rowCount, rowIndex, colIndex; int one=1, irow; double colValue; char paramString[100]; MPI_Comm comm; HYPRE_IJMatrix IJR; hypre_ParCSRMatrix *hypreA, *hypreAff, *hypreR; MLI_Function *funcPtr; MLI_Matrix *mli_Rmat; /* ------------------------------------------------------ */ /* get matrix information */ /* ------------------------------------------------------ */ comm = getComm(); hypreA = (hypre_ParCSRMatrix *) mli_Amat->getMatrix(); startRow = hypre_ParCSRMatrixFirstRowIndex(hypreA); localNRows = hypre_ParCSRMatrixNumRows(hypreA); hypreAff = (hypre_ParCSRMatrix *) mli_Affmat->getMatrix(); AffStartRow = hypre_ParCSRMatrixFirstRowIndex(hypreAff); AffNRows = hypre_ParCSRMatrixNumRows(hypreAff); /* ------------------------------------------------------ */ /* create a matrix context */ /* ------------------------------------------------------ */ RStartRow = startRow - AffStartRow; RNRows = localNRows - AffNRows; ierr = HYPRE_IJMatrixCreate(comm,RStartRow,RStartRow+RNRows-1, startRow,startRow+localNRows-1,&IJR); ierr = HYPRE_IJMatrixSetObjectType(IJR, HYPRE_PARCSR); hypre_assert(!ierr); rowLengs = new int[RNRows]; for (irow = 0; irow < RNRows; irow++) rowLengs[irow] = 1; ierr = HYPRE_IJMatrixSetRowSizes(IJR, rowLengs); ierr = HYPRE_IJMatrixInitialize(IJR); hypre_assert(!ierr); delete [] rowLengs; /* ------------------------------------------------------ */ /* load the R matrix */ /* ------------------------------------------------------ */ rowCount = 0; colValue = 1.0; for (irow = 0; irow < localNRows; irow++) { if (indepSet[irow] == 1) { rowIndex = RStartRow + rowCount; colIndex = startRow + irow; HYPRE_IJMatrixSetValues(IJR,1,&one,(const int *) &rowIndex, (const int *) &colIndex, (const double *) &colValue); rowCount++; } } /* ------------------------------------------------------ */ /* assemble the R matrix */ /* ------------------------------------------------------ */ ierr = HYPRE_IJMatrixAssemble(IJR); hypre_assert(!ierr); HYPRE_IJMatrixGetObject(IJR, (void **) &hypreR); ierr += HYPRE_IJMatrixSetObjectType(IJR, -1); ierr += HYPRE_IJMatrixDestroy(IJR); hypre_assert( !ierr ); sprintf(paramString, "HYPRE_ParCSR"); funcPtr = new MLI_Function(); MLI_Utils_HypreParCSRMatrixGetDestroyFunc(funcPtr); mli_Rmat = new MLI_Matrix((void*) hypreR, paramString, funcPtr); delete funcPtr; return mli_Rmat; } /* ********************************************************************* * * print AMG information * --------------------------------------------------------------------- */ int MLI_Method_AMGCR::print() { int mypid; MPI_Comm comm = getComm(); MPI_Comm_rank( comm, &mypid); if ( mypid == 0 ) { printf("\t********************************************************\n"); printf("\t*** method name = %s\n", getName()); printf("\t*** number of levels = %d\n", numLevels_); printf("\t*** use MIS = %d\n", findMIS_); printf("\t*** target relaxation rate = %e\n", targetMu_); printf("\t*** truncation threshold = %e\n", cutThreshold_); printf("\t*** number of trials = %d\n", numTrials_); printf("\t*** number of trial vectors = %d\n", numVectors_); printf("\t*** polynomial degree = %d\n", PDegree_); printf("\t*** minimum coarse size = %d\n", minCoarseSize_); printf("\t*** smoother type = %s\n", smoother_); printf("\t*** smoother nsweeps = %d\n", smootherNum_); printf("\t*** smoother weight = %e\n", smootherWgts_[0]); printf("\t*** coarse solver type = %s\n", coarseSolver_); printf("\t*** coarse solver nsweeps = %d\n", coarseSolverNum_); printf("\t********************************************************\n"); } return 0; } /* ********************************************************************* * * print AMG statistics information * --------------------------------------------------------------------- */ int MLI_Method_AMGCR::printStatistics(MLI *mli) { int mypid, level, globalNRows, totNRows, fineNRows; int maxNnz, minNnz, fineNnz, totNnz, thisNnz, itemp; double maxVal, minVal, dtemp; char paramString[100]; MLI_Matrix *mli_Amat, *mli_Pmat; MPI_Comm comm = getComm(); /* --------------------------------------------------------------- */ /* output header */ /* --------------------------------------------------------------- */ MPI_Comm_rank( comm, &mypid); if ( mypid == 0 ) printf("\t****************** AMGCR Statistics ********************\n"); /* --------------------------------------------------------------- */ /* output processing time */ /* --------------------------------------------------------------- */ if ( mypid == 0 ) { printf("\t*** number of levels = %d\n", currLevel_+1); printf("\t*** total RAP time = %e seconds\n", RAPTime_); printf("\t*** total GenMG time = %e seconds\n", totalTime_); printf("\t******************** Amatrix ***************************\n"); printf("\t*level Nrows MaxNnz MinNnz TotalNnz maxValue minValue*\n"); } /* --------------------------------------------------------------- */ /* fine and coarse matrix complexity information */ /* --------------------------------------------------------------- */ totNnz = totNRows = 0; for ( level = 0; level <= currLevel_; level++ ) { mli_Amat = mli->getSystemMatrix( level ); sprintf(paramString, "nrows"); mli_Amat->getMatrixInfo(paramString, globalNRows, dtemp); sprintf(paramString, "maxnnz"); mli_Amat->getMatrixInfo(paramString, maxNnz, dtemp); sprintf(paramString, "minnnz"); mli_Amat->getMatrixInfo(paramString, minNnz, dtemp); sprintf(paramString, "totnnz"); mli_Amat->getMatrixInfo(paramString, thisNnz, dtemp); sprintf(paramString, "maxval"); mli_Amat->getMatrixInfo(paramString, itemp, maxVal); sprintf(paramString, "minval"); mli_Amat->getMatrixInfo(paramString, itemp, minVal); if ( mypid == 0 ) { printf("\t*%3d %9d %5d %5d %10d %8.3e %8.3e *\n",level, globalNRows, maxNnz, minNnz, thisNnz, maxVal, minVal); } if ( level == 0 ) fineNnz = thisNnz; totNnz += thisNnz; if ( level == 0 ) fineNRows = globalNRows; totNRows += globalNRows; } /* --------------------------------------------------------------- */ /* prolongation operator complexity information */ /* --------------------------------------------------------------- */ if ( mypid == 0 ) { printf("\t******************** Pmatrix ***************************\n"); printf("\t*level Nrows MaxNnz MinNnz TotalNnz maxValue minValue*\n"); fflush(stdout); } for ( level = 1; level <= currLevel_; level++ ) { mli_Pmat = mli->getProlongation( level ); sprintf(paramString, "nrows"); mli_Pmat->getMatrixInfo(paramString, globalNRows, dtemp); sprintf(paramString, "maxnnz"); mli_Pmat->getMatrixInfo(paramString, maxNnz, dtemp); sprintf(paramString, "minnnz"); mli_Pmat->getMatrixInfo(paramString, minNnz, dtemp); sprintf(paramString, "totnnz"); mli_Pmat->getMatrixInfo(paramString, thisNnz, dtemp); sprintf(paramString, "maxval"); mli_Pmat->getMatrixInfo(paramString, itemp, maxVal); sprintf(paramString, "minval"); mli_Pmat->getMatrixInfo(paramString, itemp, minVal); if ( mypid == 0 ) { printf("\t*%3d %9d %5d %5d %10d %8.3e %8.3e *\n",level, globalNRows, maxNnz, minNnz, thisNnz, maxVal, minVal); } } /* --------------------------------------------------------------- */ /* other complexity information */ /* --------------------------------------------------------------- */ if ( mypid == 0 ) { printf("\t********************************************************\n"); dtemp = (double) totNnz / (double) fineNnz; printf("\t*** Amat complexity = %e\n", dtemp); dtemp = (double) totNRows / (double) fineNRows; printf("\t*** grid complexity = %e\n", dtemp); printf("\t********************************************************\n"); fflush(stdout); } return 0; } hypre-2.33.0/src/FEI_mv/femli/mli_method_amgcr.h000066400000000000000000000041341477326011500213710ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * Header info for the Compatible relaxation-based multilevel method * *****************************************************************************/ #ifndef __MLIMETHODAMGCRH__ #define __MLIMETHODAMGCRH__ #include "_hypre_utilities.h" #include "_hypre_parcsr_mv.h" #include "mli.h" #include "mli_matrix.h" #include "mli_method.h" /* *********************************************************************** * definition of the classical Ruge Stuben AMG data structure * ----------------------------------------------------------------------*/ class MLI_Method_AMGCR : public MLI_Method { int maxLevels_; int numLevels_; int currLevel_; int outputLevel_; int findMIS_; int numTrials_; int numVectors_; int minCoarseSize_; double cutThreshold_; double targetMu_; char smoother_[20]; int smootherNum_; double *smootherWgts_; char coarseSolver_[20]; int coarseSolverNum_; double *coarseSolverWgts_; double RAPTime_; double totalTime_; char paramFile_[50]; int PDegree_; public : MLI_Method_AMGCR(MPI_Comm comm); ~MLI_Method_AMGCR(); int setup( MLI *mli ); int setParams(char *name, int argc, char *argv[]); int setOutputLevel(int outputLevel); int setNumLevels(int nlevels); int selectIndepSet(MLI_Matrix *, int **indepSet); MLI_Matrix *performCR(MLI_Matrix *, int *indepSet, MLI_Matrix **); MLI_Matrix *createPmat(int *indepSet,MLI_Matrix *,MLI_Matrix *,MLI_Matrix *); MLI_Matrix *createRmat(int *indepSet, MLI_Matrix *, MLI_Matrix *); int print(); int printStatistics(MLI *mli); }; #endif hypre-2.33.0/src/FEI_mv/femli/mli_method_amgrs.cxx000066400000000000000000002103151477326011500217640ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #define PDEGREE 1 #define MU 0.5 #define pruneFactor 0.1 #if 0 /* RDF: Not sure this is really needed */ #ifdef WIN32 #define strcmp _stricmp #endif #endif /* #define MLI_USE_HYPRE_MATMATMULT */ #include #include "HYPRE.h" #include "_hypre_parcsr_ls.h" #include "mli_utils.h" #include "mli_matrix.h" #include "mli_matrix_misc.h" #include "mli_vector.h" #include "mli_solver.h" #include "mli_method_amgrs.h" #define habs(x) ((x) > 0 ? x : -(x)) /* ********************************************************************* * * constructor * --------------------------------------------------------------------- */ MLI_Method_AMGRS::MLI_Method_AMGRS( MPI_Comm comm ) : MLI_Method( comm ) { char name[100]; strcpy(name, "AMGRS"); setName( name ); setID( MLI_METHOD_AMGRS_ID ); outputLevel_ = 0; maxLevels_ = 25; numLevels_ = 25; currLevel_ = 0; coarsenScheme_ = MLI_METHOD_AMGRS_FALGOUT; measureType_ = 0; /* default : local measure */ threshold_ = 0.5; nodeDOF_ = 1; minCoarseSize_ = 200; maxRowSum_ = 0.9; symmetric_ = 1; useInjectionForR_ = 0; truncFactor_ = 0.0; mxelmtsP_ = 0; strcpy(smoother_, "Jacobi"); smootherNSweeps_ = 2; smootherWeights_ = new double[2]; smootherWeights_[0] = smootherWeights_[1] = 0.667; smootherPrintRNorm_ = 0; smootherFindOmega_ = 0; strcpy(coarseSolver_, "SGS"); coarseSolverNSweeps_ = 20; coarseSolverWeights_ = new double[20]; for ( int j = 0; j < 20; j++ ) coarseSolverWeights_[j] = 1.0; RAPTime_ = 0.0; totalTime_ = 0.0; } /* ********************************************************************* * * destructor * --------------------------------------------------------------------- */ MLI_Method_AMGRS::~MLI_Method_AMGRS() { if ( smootherWeights_ != NULL ) delete [] smootherWeights_; if ( coarseSolverWeights_ != NULL ) delete [] coarseSolverWeights_; } /* ********************************************************************* * * set parameters * --------------------------------------------------------------------- */ int MLI_Method_AMGRS::setParams(char *in_name, int argc, char *argv[]) { int level, size, nSweeps=1; double thresh, *weights=NULL; char param1[256], param2[256]; sscanf(in_name, "%s", param1); if ( !strcmp(param1, "setOutputLevel" )) { sscanf(in_name,"%s %d", param1, &level); return ( setOutputLevel( level ) ); } else if ( !strcmp(param1, "setNumLevels" )) { sscanf(in_name,"%s %d", param1, &level); return ( setNumLevels( level ) ); } else if ( !strcmp(param1, "setCoarsenScheme" )) { sscanf(in_name,"%s %s", param1, param2); if ( !strcmp(param2, "cljp" ) ) return ( setCoarsenScheme( MLI_METHOD_AMGRS_CLJP ) ); else if ( !strcmp(param2, "ruge" ) ) return ( setCoarsenScheme( MLI_METHOD_AMGRS_RUGE ) ); else if ( !strcmp(param2, "falgout" ) ) return ( setCoarsenScheme( MLI_METHOD_AMGRS_FALGOUT ) ); else { printf("MLI_Method_AMGRS::setParams ERROR : setCoarsenScheme not"); printf(" valid. Valid options are : cljp, ruge, and falgout \n"); return 1; } } else if ( !strcmp(param1, "setMeasureType" )) { sscanf(in_name,"%s %s", param1, param2); if ( !strcmp(param2, "local" ) ) return ( setMeasureType( 0 ) ); else if ( !strcmp(param2, "global" ) ) return ( setMeasureType( 1 ) ); else { printf("MLI_Method_AMGRS::setParams ERROR : setMeasureType not"); printf(" valid. Valid options are : local or global\n"); return 1; } } else if ( !strcmp(param1, "setStrengthThreshold" )) { sscanf(in_name,"%s %lg", param1, &thresh); return ( setStrengthThreshold( thresh ) ); } else if ( !strcmp(param1, "setTruncationFactor" )) { sscanf(in_name,"%s %lg", param1, &truncFactor_); return 0; } else if ( !strcmp(param1, "setPMaxElmts" )) { sscanf(in_name,"%s %d", param1, &mxelmtsP_); return 0; } else if ( !strcmp(param1, "setNodeDOF" )) { sscanf(in_name,"%s %d", param1, &size); return ( setNodeDOF( size ) ); } else if ( !strcmp(param1, "setNullSpace" )) { size = *(int *) argv[0]; return ( setNodeDOF( size ) ); } else if ( !strcmp(param1, "setMinCoarseSize" )) { sscanf(in_name,"%s %d", param1, &size); return ( setMinCoarseSize( size ) ); } else if ( !strcmp(param1, "nonsymmetric" )) { symmetric_ = 0; return 0; } else if ( !strcmp(param1, "useInjectionForR" )) { useInjectionForR_ = 1; return 0; } else if ( !strcmp(param1, "setSmoother" ) || !strcmp(param1, "setPreSmoother" )) { sscanf(in_name,"%s %s", param1, param2); if ( argc != 2 ) { printf("MLI_Method_AMGRS::setParams ERROR - setSmoother needs"); printf(" 2 arguments.\n"); printf(" argument[0] : number of relaxation sweeps \n"); printf(" argument[1] : relaxation weights\n"); return 1; } nSweeps = *(int *) argv[0]; weights = (double *) argv[1]; return ( setSmoother(param2, nSweeps, weights) ); } else if ( !strcmp(param1, "setSmootherPrintRNorm" )) { smootherPrintRNorm_ = 1; return 0; } else if ( !strcmp(param1, "setSmootherFindOmega" )) { smootherFindOmega_ = 1; return 0; } else if ( !strcmp(param1, "setCoarseSolver" )) { sscanf(in_name,"%s %s", param1, param2); if ( strcmp(param2, "SuperLU") && argc != 2 ) { printf("MLI_Method_AMGRS::setParams ERROR - setCoarseSolver needs"); printf(" 2 arguments.\n"); printf(" argument[0] : number of relaxation sweeps \n"); printf(" argument[1] : relaxation weights\n"); return 1; } else if ( strcmp(param2, "SuperLU") ) { nSweeps = *(int *) argv[0]; weights = (double *) argv[1]; } else if ( !strcmp(param2, "SuperLU") ) { nSweeps = 1; weights = NULL; } return ( setCoarseSolver(param2, nSweeps, weights) ); } else if ( !strcmp(param1, "print" )) { return ( print() ); } return 1; } /*********************************************************************** * generate multilevel structure * --------------------------------------------------------------------- */ int MLI_Method_AMGRS::setup( MLI *mli ) { int k, level, irow, localNRows, mypid, nprocs, startRow; int numNodes, one=1, globalNRows, *coarsePartition; int *CFMarkers=NULL, coarseNRows, *dofArray, *cdofArray=NULL; int *reduceArray1, *reduceArray2, *rowLengs, ierr, zeroNRows; int startCol, localNCols, colInd, rowNum; int globalCoarseNRows, numTrials; int *mapStoA; double startTime, elapsedTime, colVal=1.0; char paramString[100], *targv[10]; MLI_Matrix *mli_Pmat, *mli_Rmat, *mli_APmat, *mli_Amat, *mli_cAmat; MLI_Matrix *mli_ATmat, *mli_Affmat, *mli_Afcmat; MLI_Solver *smootherPtr, *csolverPtr; MPI_Comm comm; MLI_Function *funcPtr; HYPRE_IJMatrix IJRmat; hypre_ParCSRMatrix *hypreA, *hypreS, *hypreAT, *hypreST, *hypreP, *hypreR; hypre_ParCSRMatrix *hypreRT, *hypreS2=NULL; #ifdef MLI_USE_HYPRE_MATMATMULT hypre_ParCSRMatrix *hypreAP, *hypreCA; #endif #ifdef MLI_DEBUG_DETAILED printf("MLI_Method_AMGRS::setup begins...\n"); #endif /* --------------------------------------------------------------- */ /* fetch machine parameters */ /* --------------------------------------------------------------- */ RAPTime_ = 0.0; comm = getComm(); MPI_Comm_rank( comm, &mypid ); MPI_Comm_size( comm, &nprocs ); totalTime_ = MLI_Utils_WTime(); /* --------------------------------------------------------------- */ /* traverse all levels */ /* --------------------------------------------------------------- */ for ( level = 0; level < numLevels_; level++ ) { if ( mypid == 0 && outputLevel_ > 0 ) { printf("\t*****************************************************\n"); printf("\t*** Ruge Stuben AMG : level = %d\n", level); printf("\t-----------------------------------------------------\n"); } currLevel_ = level; if ( level == numLevels_-1 ) break; /* ------fetch fine grid matrix----------------------------------- */ mli_Amat = mli->getSystemMatrix(level); hypre_assert ( mli_Amat != NULL ); hypreA = (hypre_ParCSRMatrix *) mli_Amat->getMatrix(); startRow = hypre_ParCSRMatrixFirstRowIndex(hypreA); localNRows = hypre_CSRMatrixNumRows(hypre_ParCSRMatrixDiag(hypreA)); globalNRows = hypre_ParCSRMatrixGlobalNumRows(hypreA); /* ------create strength matrix----------------------------------- */ numNodes = localNRows / nodeDOF_; if ( level == 0 && (numNodes * nodeDOF_) != localNRows ) { printf("\tMLI_Method_AMGRS::setup - nrows not divisible by dof.\n"); printf("\tMLI_Method_AMGRS::setup - revert nodeDOF to 1.\n"); nodeDOF_ = 1; numNodes = localNRows / nodeDOF_; } if ( level == 0 ) { if ( localNRows > 0 ) dofArray = new int[localNRows]; else dofArray = NULL; for ( irow = 0; irow < localNRows; irow+=nodeDOF_ ) for ( k = 0; k < nodeDOF_; k++ ) dofArray[irow+k] = k; } else { if ( level > 0 && dofArray != NULL ) delete [] dofArray; dofArray = cdofArray; } hypre_BoomerAMGCreateS(hypreA, threshold_, maxRowSum_, nodeDOF_, dofArray, &hypreS); if ( threshold_ > 0 ) { hypre_BoomerAMGCreateSCommPkg(hypreA, hypreS, &mapStoA); } else mapStoA = NULL; if ( coarsenScheme_ == MLI_METHOD_AMGRS_CR ) { hypre_BoomerAMGCreateS(hypreA, 1.0e-16, maxRowSum_, nodeDOF_, dofArray, &hypreS2); } else hypreS2 = NULL; /* ------perform coarsening--------------------------------------- */ switch ( coarsenScheme_ ) { case MLI_METHOD_AMGRS_CLJP : hypre_BoomerAMGCoarsen(hypreS, hypreA, 0, outputLevel_, &CFMarkers); break; case MLI_METHOD_AMGRS_RUGE : hypre_BoomerAMGCoarsenRuge(hypreS, hypreA, measureType_, coarsenScheme_, outputLevel_, &CFMarkers); break; case MLI_METHOD_AMGRS_FALGOUT : hypre_BoomerAMGCoarsenFalgout(hypreS, hypreA, measureType_, outputLevel_, &CFMarkers); break; case MLI_METHOD_AMGRS_CR : hypre_BoomerAMGCoarsen(hypreS, hypreA, 0, outputLevel_, &CFMarkers); k = 0; for (irow = 0; irow < localNRows; irow++) { if (CFMarkers[irow] > 0) {CFMarkers[irow] = 1; k++;} else if (CFMarkers[irow] < 0) CFMarkers[irow] = 0; } printf("\tAMGRS_CR(1) nCoarse = %d\n", k); numTrials = 100; mli_Affmat = performCR(mli_Amat,CFMarkers,&mli_Afcmat,numTrials, hypreS2); k = 0; for (irow = 0; irow < localNRows; irow++) { if (CFMarkers[irow] > 0) {CFMarkers[irow] = 1; k++;} else if (CFMarkers[irow] <= 0) CFMarkers[irow] = -1; } printf("\tAMGRS_CR(2) nCoarse = %d\n", k); break; } coarseNRows = 0; for ( irow = 0; irow < localNRows; irow++ ) if ( CFMarkers[irow] == 1 ) coarseNRows++; /* ------if nonsymmetric, compute S for R------------------------- */ if ( symmetric_ == 0 ) { MLI_Matrix_Transpose( mli_Amat, &mli_ATmat ); hypreAT = (hypre_ParCSRMatrix *) mli_ATmat->getMatrix(); hypre_BoomerAMGCreateS(hypreAT, threshold_, maxRowSum_, nodeDOF_, dofArray, &hypreST); hypre_BoomerAMGCoarsen(hypreST, hypreAT, 1, outputLevel_, &CFMarkers); coarseNRows = 0; for ( irow = 0; irow < localNRows; irow++ ) if ( CFMarkers[irow] == 1 ) coarseNRows++; } /* ------construct processor maps for the coarse grid------------- */ coarsePartition = (int *) hypre_CTAlloc(int, nprocs+1, HYPRE_MEMORY_HOST); coarsePartition[0] = 0; MPI_Allgather(&coarseNRows, 1, MPI_INT, &(coarsePartition[1]), 1, MPI_INT, comm); for ( irow = 2; irow < nprocs+1; irow++ ) coarsePartition[irow] += coarsePartition[irow-1]; globalCoarseNRows = coarsePartition[nprocs]; if ( outputLevel_ > 1 && mypid == 0 ) printf("\tMLI_Method_AMGRS::setup - # C dof = %d(%d)\n", globalCoarseNRows, globalNRows); /* ------if nonsymmetric, need to make sure localNRows > 0 ------ */ /* ------ or the matrixTranspose function will give problems ----- */ zeroNRows = 0; if ( symmetric_ == 0 ) { for ( irow = 0; irow < nprocs; irow++ ) { if ( (coarsePartition[irow+1]-coarsePartition[irow]) <= 0 ) { zeroNRows = 1; break; } } } /* ------ wrap up creating the multigrid hierarchy --------------- */ if ( coarsePartition[nprocs] < minCoarseSize_ || coarsePartition[nprocs] == globalNRows || zeroNRows == 1 ) { if ( symmetric_ == 0 ) { delete mli_ATmat; hypre_ParCSRMatrixDestroy(hypreST); } hypre_TFree( coarsePartition , HYPRE_MEMORY_HOST); if ( CFMarkers != NULL ) hypre_TFree( CFMarkers , HYPRE_MEMORY_HOST); if ( hypreS != NULL ) hypre_ParCSRMatrixDestroy(hypreS); if ( hypreS2 != NULL ) hypre_ParCSRMatrixDestroy(hypreS2); if ( coarsenScheme_ == MLI_METHOD_AMGRS_CR ) { delete mli_Affmat; delete mli_Afcmat; } break; } k = (int) (globalNRows * 0.75); //if ( coarsenScheme_ > 0 && coarsePartition[nprocs] >= k ) // coarsenScheme_ = 0; /* ------create new dof array for coarse grid--------------------- */ if ( coarseNRows > 0 ) cdofArray = new int[coarseNRows]; else cdofArray = NULL; coarseNRows = 0; for ( irow = 0; irow < localNRows; irow++ ) { if ( CFMarkers[irow] == 1 ) cdofArray[coarseNRows++] = dofArray[irow]; } /* ------build and set the interpolation operator----------------- */ #if 0 //=============================================== // This part is for future research on better Pmat //=============================================== if ( coarsenScheme_ == MLI_METHOD_AMGRS_CR ) { mli_Pmat = createPmat(CFMarkers, mli_Amat, mli_Affmat, mli_Afcmat); delete mli_Affmat; delete mli_Afcmat; mli->setProlongation(level+1, mli_Pmat); } else //=============================================== #endif { hypre_BoomerAMGBuildInterp(hypreA, CFMarkers, hypreS, coarsePartition, nodeDOF_, dofArray, outputLevel_, truncFactor_, mxelmtsP_, mapStoA, &hypreP); funcPtr = new MLI_Function(); MLI_Utils_HypreParCSRMatrixGetDestroyFunc(funcPtr); sprintf(paramString, "HYPRE_ParCSR" ); mli_Pmat = new MLI_Matrix( (void *) hypreP, paramString, funcPtr ); mli->setProlongation(level+1, mli_Pmat); delete funcPtr; } if ( hypreS != NULL ) hypre_ParCSRMatrixDestroy(hypreS); if ( hypreS2 != NULL ) hypre_ParCSRMatrixDestroy(hypreS2); /* ------build and set the restriction operator, if needed-------- */ if ( useInjectionForR_ == 1 ) { reduceArray1 = new int[nprocs+1]; reduceArray2 = new int[nprocs+1]; for ( k = 0; k < nprocs; k++ ) reduceArray1[k] = 0; reduceArray1[mypid] = coarseNRows; MPI_Allreduce(reduceArray1,reduceArray2,nprocs,MPI_INT,MPI_SUM,comm); for (k = nprocs-1; k >= 0; k--) reduceArray2[k+1] = reduceArray2[k]; reduceArray2[0] = 0; for ( k = 2; k <= nprocs; k++ ) reduceArray2[k] += reduceArray2[k-1]; startCol = reduceArray2[mypid]; localNCols = reduceArray2[mypid+1] - startCol; globalCoarseNRows = reduceArray2[nprocs]; ierr = HYPRE_IJMatrixCreate(comm, startCol, startCol+localNCols-1, startRow,startRow+localNRows-1,&IJRmat); ierr = HYPRE_IJMatrixSetObjectType(IJRmat, HYPRE_PARCSR); hypre_assert(!ierr); rowLengs = new int[localNCols]; for ( k = 0; k < localNCols; k++ ) rowLengs[k] = 1; ierr = HYPRE_IJMatrixSetRowSizes(IJRmat, rowLengs); ierr = HYPRE_IJMatrixInitialize(IJRmat); hypre_assert(!ierr); delete [] rowLengs; delete [] reduceArray1; delete [] reduceArray2; k = 0; for ( irow = 0; irow < localNCols; irow++ ) { while ( CFMarkers[k] != 1 ) k++; rowNum = startCol + irow; colInd = k + startRow; HYPRE_IJMatrixSetValues(IJRmat, 1, &one, (const int *) &rowNum, (const int *) &colInd, (const double *) &colVal); k++; } ierr = HYPRE_IJMatrixAssemble(IJRmat); hypre_assert( !ierr ); HYPRE_IJMatrixGetObject(IJRmat, (void **) &hypreR); hypre_MatvecCommPkgCreate((hypre_ParCSRMatrix *) hypreR); funcPtr = new MLI_Function(); MLI_Utils_HypreParCSRMatrixGetDestroyFunc(funcPtr); sprintf(paramString, "HYPRE_ParCSR" ); mli_Rmat = new MLI_Matrix( (void *) hypreR, paramString, funcPtr ); mli->setRestriction(level, mli_Rmat); delete funcPtr; delete mli_ATmat; hypre_ParCSRMatrixDestroy(hypreST); } else if ( symmetric_ == 0 ) { hypre_BoomerAMGBuildInterp(hypreAT, CFMarkers, hypreST, coarsePartition, nodeDOF_, dofArray, outputLevel_, truncFactor_, mxelmtsP_, mapStoA, &hypreRT); hypre_ParCSRMatrixTranspose( hypreRT, &hypreR, one ); funcPtr = new MLI_Function(); MLI_Utils_HypreParCSRMatrixGetDestroyFunc(funcPtr); sprintf(paramString, "HYPRE_ParCSR" ); mli_Rmat = new MLI_Matrix( (void *) hypreR, paramString, funcPtr ); mli->setRestriction(level, mli_Rmat); delete funcPtr; delete mli_ATmat; hypre_ParCSRMatrixDestroy(hypreST); hypre_ParCSRMatrixDestroy(hypreRT); } else { sprintf(paramString, "HYPRE_ParCSRT"); mli_Rmat = new MLI_Matrix(mli_Pmat->getMatrix(), paramString, NULL); mli->setRestriction(level, mli_Rmat); } if ( CFMarkers != NULL ) hypre_TFree( CFMarkers , HYPRE_MEMORY_HOST); //if ( coarsePartition != NULL ) hypre_TFree( coarsePartition , HYPRE_MEMORY_HOST); startTime = MLI_Utils_WTime(); /* ------construct and set the coarse grid matrix----------------- */ if ( mypid == 0 && outputLevel_ > 0 ) printf("\tComputing RAP\n"); if ( symmetric_ == 1 ) { //hypreP = (hypre_ParCSRMatrix *) mli_Pmat->getMatrix(); //hypre_ParCSRMatrixTranspose(hypreP, &hypreR, 1); //hypreAP = hypre_ParMatmul(hypreA, hypreP); //hypreCA = hypre_ParMatmul(hypreR, hypreAP); //funcPtr = new MLI_Function(); //MLI_Utils_HypreParCSRMatrixGetDestroyFunc(funcPtr); //sprintf(paramString, "HYPRE_ParCSR" ); //mli_cAmat = new MLI_Matrix((void *) hypreCA, paramString, funcPtr); //delete funcPtr; //hypre_ParCSRMatrixDestroy( hypreR ); //hypre_ParCSRMatrixDestroy( hypreAP ); MLI_Matrix_ComputePtAP(mli_Pmat, mli_Amat, &mli_cAmat); } else { #ifdef MLI_USE_HYPRE_MATMATMULT hypreP = (hypre_ParCSRMatrix *) mli_Pmat->getMatrix(); hypreR = (hypre_ParCSRMatrix *) mli_Rmat->getMatrix(); hypreAP = hypre_ParMatmul( hypreA, hypreP ); hypreCA = hypre_ParMatmul( hypreR, hypreAP ); hypre_ParCSRMatrixDestroy( hypreAP ); funcPtr = new MLI_Function(); MLI_Utils_HypreParCSRMatrixGetDestroyFunc(funcPtr); sprintf(paramString, "HYPRE_ParCSR" ); mli_cAmat = new MLI_Matrix((void *) hypreCA, paramString, funcPtr); delete funcPtr; #else MLI_Matrix_MatMatMult(mli_Amat, mli_Pmat, &mli_APmat); MLI_Matrix_MatMatMult(mli_Rmat, mli_APmat, &mli_cAmat); delete mli_APmat; #endif } mli->setSystemMatrix(level+1, mli_cAmat); elapsedTime = (MLI_Utils_WTime() - startTime); RAPTime_ += elapsedTime; if ( mypid == 0 && outputLevel_ > 0 ) printf("\tRAP computed, time = %e seconds.\n", elapsedTime); /* ------set the smoothers---------------------------------------- */ smootherPtr = MLI_Solver_CreateFromName( smoother_ ); targv[0] = (char *) &smootherNSweeps_; targv[1] = (char *) smootherWeights_; sprintf( paramString, "relaxWeight" ); smootherPtr->setParams(paramString, 2, targv); if ( smootherPrintRNorm_ == 1 ) { sprintf( paramString, "printRNorm" ); smootherPtr->setParams(paramString, 0, NULL); } if ( smootherFindOmega_ == 1 ) { sprintf( paramString, "findOmega" ); smootherPtr->setParams(paramString, 0, NULL); } sprintf( paramString, "setModifiedDiag" ); smootherPtr->setParams(paramString, 0, NULL); smootherPtr->setup(mli_Amat); mli->setSmoother( level, MLI_SMOOTHER_BOTH, smootherPtr ); } if ( dofArray != NULL ) delete [] dofArray; /* ------set the coarse grid solver---------------------------------- */ if (mypid == 0 && outputLevel_ > 0) printf("\tCoarse level = %d\n",level); csolverPtr = MLI_Solver_CreateFromName( coarseSolver_ ); if ( strcmp(coarseSolver_, "SuperLU") ) { targv[0] = (char *) &coarseSolverNSweeps_; targv[1] = (char *) coarseSolverWeights_ ; sprintf( paramString, "relaxWeight" ); csolverPtr->setParams(paramString, 2, targv); } mli_Amat = mli->getSystemMatrix(level); csolverPtr->setup(mli_Amat); mli->setCoarseSolve(csolverPtr); totalTime_ = MLI_Utils_WTime() - totalTime_; /* --------------------------------------------------------------- */ /* return the coarsest grid level number */ /* --------------------------------------------------------------- */ if ( outputLevel_ >= 2 ) printStatistics(mli); #ifdef MLI_DEBUG_DETAILED printf("MLI_Method_AMGRS::setup ends."); #endif return (level+1); } /* ********************************************************************* * * set diagnostics output level * --------------------------------------------------------------------- */ int MLI_Method_AMGRS::setOutputLevel( int level ) { outputLevel_ = level; return 0; } /* ********************************************************************* * * set number of levels * --------------------------------------------------------------------- */ int MLI_Method_AMGRS::setNumLevels( int nlevels ) { if ( nlevels < maxLevels_ && nlevels > 0 ) numLevels_ = nlevels; return 0; } /* ********************************************************************* * * set smoother * --------------------------------------------------------------------- */ int MLI_Method_AMGRS::setSmoother(char *stype, int num, double *wgt) { int i; #ifdef MLI_DEBUG_DETAILED printf("MLI_Method_AMGRS::setSmoother - type = %s.\n", stype); #endif strcpy( smoother_, stype ); if ( num > 0 ) smootherNSweeps_ = num; else smootherNSweeps_ = 1; delete [] smootherWeights_; smootherWeights_ = new double[smootherNSweeps_]; if ( wgt == NULL ) for (i = 0; i < smootherNSweeps_; i++) smootherWeights_[i] = 0.; else for (i = 0; i < smootherNSweeps_; i++) smootherWeights_[i] = wgt[i]; return 0; } /* ********************************************************************* * * set coarse solver * --------------------------------------------------------------------- */ int MLI_Method_AMGRS::setCoarseSolver( char *stype, int num, double *wgt ) { int i; #ifdef MLI_DEBUG_DETAILED printf("MLI_Method_AMGRS::setCoarseSolver - type = %s.\n", stype); #endif strcpy( coarseSolver_, stype ); if ( num > 0 ) coarseSolverNSweeps_ = num; else coarseSolverNSweeps_ = 1; delete [] coarseSolverWeights_ ; if ( wgt != NULL && strcmp(coarseSolver_, "SuperLU") ) { coarseSolverWeights_ = new double[coarseSolverNSweeps_]; for (i = 0; i < coarseSolverNSweeps_; i++) coarseSolverWeights_ [i] = wgt[i]; } else coarseSolverWeights_ = NULL; return 0; } /* ********************************************************************* * * set measure type * --------------------------------------------------------------------- */ int MLI_Method_AMGRS::setMeasureType( int mtype ) { measureType_ = mtype; return 0; } /* ********************************************************************* * * set node degree of freedom * --------------------------------------------------------------------- */ int MLI_Method_AMGRS::setNodeDOF( int dof ) { if ( dof > 0 && dof < 20 ) nodeDOF_ = dof; return 0; } /* ********************************************************************* * * set coarsening scheme * --------------------------------------------------------------------- */ int MLI_Method_AMGRS::setCoarsenScheme( int scheme ) { if ( scheme == MLI_METHOD_AMGRS_CLJP ) { coarsenScheme_ = MLI_METHOD_AMGRS_CLJP; return 0; } else if ( scheme == MLI_METHOD_AMGRS_RUGE ) { coarsenScheme_ = MLI_METHOD_AMGRS_RUGE; return 0; } else if ( scheme == MLI_METHOD_AMGRS_FALGOUT ) { coarsenScheme_ = MLI_METHOD_AMGRS_FALGOUT; return 0; } else { printf("MLI_Method_AMGRS::setCoarsenScheme - invalid scheme.\n"); return 1; } } /* ********************************************************************* * * set minimum coarse size * --------------------------------------------------------------------- */ int MLI_Method_AMGRS::setMinCoarseSize( int coarse_size ) { if ( coarse_size > 0 ) minCoarseSize_ = coarse_size; return 0; } /* ********************************************************************* * * set coarsening threshold * --------------------------------------------------------------------- */ int MLI_Method_AMGRS::setStrengthThreshold( double thresh ) { if ( thresh > 0.0 ) threshold_ = thresh; else threshold_ = 0.0; return 0; } /* ********************************************************************* * * print AMGRS information * --------------------------------------------------------------------- */ int MLI_Method_AMGRS::print() { int mypid; MPI_Comm comm = getComm(); MPI_Comm_rank( comm, &mypid); if ( mypid == 0 ) { printf("\t********************************************************\n"); printf("\t*** method name = %s\n", getName()); printf("\t*** number of levels = %d\n", numLevels_); printf("\t*** coarsen type = %d\n", coarsenScheme_); printf("\t*** measure type = %d\n", measureType_); printf("\t*** strength threshold = %e\n", threshold_); printf("\t*** truncation factor = %e\n", truncFactor_); printf("\t*** P max elments = %d\n", mxelmtsP_); printf("\t*** nodal degree of freedom = %d\n", nodeDOF_); printf("\t*** symmetric flag = %d\n", symmetric_); printf("\t*** R injection flag = %d\n", useInjectionForR_); printf("\t*** minimum coarse size = %d\n", minCoarseSize_); printf("\t*** smoother type = %s\n", smoother_); printf("\t*** smoother nsweeps = %d\n", smootherNSweeps_); printf("\t*** coarse solver type = %s\n", coarseSolver_); printf("\t*** coarse solver nsweeps = %d\n", coarseSolverNSweeps_); printf("\t********************************************************\n"); } return 0; } /* ********************************************************************* * * print AMGRS statistics information * --------------------------------------------------------------------- */ int MLI_Method_AMGRS::printStatistics(MLI *mli) { int mypid, level, globalNRows, totNRows, fineNRows; int maxNnz, minNnz, fineNnz, totNnz, thisNnz, itemp; double maxVal, minVal, dtemp; char paramString[100]; MLI_Matrix *mli_Amat, *mli_Pmat; MPI_Comm comm = getComm(); /* --------------------------------------------------------------- */ /* output header */ /* --------------------------------------------------------------- */ MPI_Comm_rank( comm, &mypid); if ( mypid == 0 ) printf("\t****************** AMGRS Statistics ********************\n"); /* --------------------------------------------------------------- */ /* output processing time */ /* --------------------------------------------------------------- */ if ( mypid == 0 ) { printf("\t*** number of levels = %d\n", currLevel_+1); printf("\t*** total RAP time = %e seconds\n", RAPTime_); printf("\t*** total GenML time = %e seconds\n", totalTime_); printf("\t******************** Amatrix ***************************\n"); printf("\t*level Nrows MaxNnz MinNnz TotalNnz maxValue minValue*\n"); } /* --------------------------------------------------------------- */ /* fine and coarse matrix complexity information */ /* --------------------------------------------------------------- */ totNnz = totNRows = 0; for ( level = 0; level <= currLevel_; level++ ) { mli_Amat = mli->getSystemMatrix( level ); sprintf(paramString, "nrows"); mli_Amat->getMatrixInfo(paramString, globalNRows, dtemp); sprintf(paramString, "maxnnz"); mli_Amat->getMatrixInfo(paramString, maxNnz, dtemp); sprintf(paramString, "minnnz"); mli_Amat->getMatrixInfo(paramString, minNnz, dtemp); sprintf(paramString, "totnnz"); mli_Amat->getMatrixInfo(paramString, thisNnz, dtemp); sprintf(paramString, "maxval"); mli_Amat->getMatrixInfo(paramString, itemp, maxVal); sprintf(paramString, "minval"); mli_Amat->getMatrixInfo(paramString, itemp, minVal); if ( mypid == 0 ) { printf("\t*%3d %9d %5d %5d %10d %8.3e %8.3e *\n",level, globalNRows, maxNnz, minNnz, thisNnz, maxVal, minVal); } if ( level == 0 ) fineNnz = thisNnz; totNnz += thisNnz; if ( level == 0 ) fineNRows = globalNRows; totNRows += globalNRows; } /* --------------------------------------------------------------- */ /* prolongation operator complexity information */ /* --------------------------------------------------------------- */ if ( mypid == 0 ) { printf("\t******************** Pmatrix ***************************\n"); printf("\t*level Nrows MaxNnz MinNnz TotalNnz maxValue minValue*\n"); fflush(stdout); } for ( level = 1; level <= currLevel_; level++ ) { mli_Pmat = mli->getProlongation( level ); sprintf(paramString, "nrows"); mli_Pmat->getMatrixInfo(paramString, globalNRows, dtemp); sprintf(paramString, "maxnnz"); mli_Pmat->getMatrixInfo(paramString, maxNnz, dtemp); sprintf(paramString, "minnnz"); mli_Pmat->getMatrixInfo(paramString, minNnz, dtemp); sprintf(paramString, "totnnz"); mli_Pmat->getMatrixInfo(paramString, thisNnz, dtemp); sprintf(paramString, "maxval"); mli_Pmat->getMatrixInfo(paramString, itemp, maxVal); sprintf(paramString, "minval"); mli_Pmat->getMatrixInfo(paramString, itemp, minVal); if ( mypid == 0 ) { printf("\t*%3d %9d %5d %5d %10d %8.3e %8.3e *\n",level, globalNRows, maxNnz, minNnz, thisNnz, maxVal, minVal); } } /* --------------------------------------------------------------- */ /* other complexity information */ /* --------------------------------------------------------------- */ if ( mypid == 0 ) { printf("\t********************************************************\n"); dtemp = (double) totNnz / (double) fineNnz; printf("\t*** Amat complexity = %e\n", dtemp); dtemp = (double) totNRows / (double) fineNRows; printf("\t*** grid complexity = %e\n", dtemp); printf("\t********************************************************\n"); fflush(stdout); } return 0; } /* ********************************************************************* * * perform compatible relaxation * --------------------------------------------------------------------- */ MLI_Matrix *MLI_Method_AMGRS::performCR(MLI_Matrix *mli_Amat, int *indepSet, MLI_Matrix **AfcMat, int numTrials, hypre_ParCSRMatrix *hypreS) { int nprocs, mypid, localNRows, iT, numFpts, irow, *reduceArray1; int *reduceArray2, iP, FStartRow, FNRows, ierr, *rowLengs; int startRow, rowIndex, colIndex, targc, numSweeps=4, rowCount; int one=1, iC, *ADiagI, *ADiagJ, *fList, colInd; int iV, ranSeed, jcol, rowCount2, CStartRow, CNRows; int kcol; int numVectors = 1, *SDiagI, *SDiagJ, count; int numNew1, numNew2, numNew3, *sortIndices, stopRefine=1; double maxEigen, relaxWts[5], colValue, rnorm0, rnorm1, dOne=1.0; double *XaccData, *XData, *ADiagD; double aratio, ratio1, *ADiagA, targetMu=MU; char paramString[200], *targv[2]; HYPRE_IJMatrix IJPFF, IJPFC; hypre_ParCSRMatrix *hypreA, *hypreAff, *hyprePFC; hypre_ParCSRMatrix *hypreAfc, *hyprePFF, *hyprePFFT, *hypreAPFC; hypre_CSRMatrix *ADiag, *SDiag; HYPRE_IJVector IJB, IJX, IJXacc; hypre_ParVector *hypreB, *hypreX, *hypreXacc; MLI_Matrix *mli_PFFMat, *mli_AffMat, *mli_AfcMat; #ifdef HAVE_TRANS MLI_Matrix *mli_AffTMat; #endif MLI_Vector *mli_Xvec, *mli_Bvec; MLI_Solver *smootherPtr; MPI_Comm comm; MLI_Function *funcPtr; /* ------------------------------------------------------ */ /* get matrix and machine information */ /* ------------------------------------------------------ */ comm = getComm(); MPI_Comm_size(comm, &nprocs); MPI_Comm_rank(comm, &mypid); hypreA = (hypre_ParCSRMatrix *) mli_Amat->getMatrix(); ADiag = hypre_ParCSRMatrixDiag(hypreA); ADiagI = hypre_CSRMatrixI(ADiag); ADiagJ = hypre_CSRMatrixJ(ADiag); ADiagA = hypre_CSRMatrixData(ADiag); SDiag = hypre_ParCSRMatrixDiag(hypreS); SDiagI = hypre_CSRMatrixI(SDiag); SDiagJ = hypre_CSRMatrixJ(SDiag); localNRows = hypre_CSRMatrixNumRows(ADiag); startRow = hypre_ParCSRMatrixFirstRowIndex(hypreA); /* ------------------------------------------------------ */ /* select initial set of fine points */ /* ------------------------------------------------------ */ #if 0 if (numTrials != 1) { for (irow = 0; irow < localNRows; irow++) indepSet[irow] = 1; for (irow = 0; irow < localNRows; irow++) { if (indepSet[irow] == 1) /* if I am a C-point */ { indepSet[irow] = 0; /* set myself to be a F-pt */ for (jcol = ADiagI[irow]; jcol < ADiagI[irow+1]; jcol++) { colInd = ADiagJ[jcol]; /* for each of my neighbors */ if (indepSet[colInd] == 1) /* if it is a C-point */ { /* if I depend strongly on it, leave it as C-pt */ for (kcol = SDiagI[irow]; kcol < SDiagI[irow+1]; kcol++) { if (SDiagJ[kcol] == colInd) { indepSet[colInd] = -1; break; } } /* if I don't depend strongly on it, see if it depends on me*/ if (kcol == SDiagI[irow+1]) { for (kcol=SDiagI[colInd]; kcol < SDiagI[colInd+1]; kcol++) { if (SDiagJ[kcol] == irow) { indepSet[colInd] = -1; break; } } } } } } } for (irow = 0; irow < localNRows; irow++) if (indepSet[irow] < 0) indepSet[irow] = 1; count = 0; for (irow = 0; irow < localNRows; irow++) if (indepSet[irow] == 1) count++; /* ------------------------------------------------------ */ /* select second set of fine points */ /* ------------------------------------------------------ */ for (irow = 0; irow < localNRows; irow++) { if (indepSet[irow] == 1) /* if I am a C-point */ { count = 0; for (jcol = ADiagI[irow]; jcol < ADiagI[irow+1]; jcol++) { colInd = ADiagJ[jcol]; /* for each of my neighbors */ if (indepSet[colInd] == 0) /* if it is a F-point */ { /* if I depend strongly on it, increment counter */ for (kcol = SDiagI[irow]; kcol < SDiagI[irow+1]; kcol++) { if (SDiagJ[kcol] == colInd) { count++; break; } } /* if I don't depend strongly on it, see if it depends on me*/ if (kcol == SDiagI[irow+1]) { for (kcol=SDiagI[colInd]; kcol < SDiagI[colInd+1]; kcol++) { if (SDiagJ[kcol] == irow) { count++; break; } } } } } if (count <= 1) indepSet[irow] = 0; } } count = 0; for (irow = 0; irow < localNRows; irow++) if (indepSet[irow] == 1) count++; } #endif /* ------------------------------------------------------ */ /* loop over number of trials */ /* ------------------------------------------------------ */ printf("\tPerform compatible relaxation\n"); ADiagD = new double[localNRows]; for (irow = 0; irow < localNRows; irow++) for (jcol = ADiagI[irow]; jcol < ADiagI[irow+1]; jcol++) if (ADiagJ[jcol] == irow) {ADiagD[irow] = ADiagA[jcol]; break;} fList = new int[localNRows]; aratio = 0.0; numNew1 = numNew2 = numNew3 = 0; for (iT = 0; iT < numTrials; iT++) { /* --------------------------------------------------- */ /* get Aff and Afc matrices (get dimension) */ /* --------------------------------------------------- */ numFpts = 0; for (irow = 0; irow < localNRows; irow++) if (indepSet[irow] != 1) fList[numFpts++] = irow; printf("\tTrial %3d (%3d) : number of F-points = %d\n", iT, numTrials, numFpts); reduceArray1 = new int[nprocs+1]; reduceArray2 = new int[nprocs+1]; for (iP = 0; iP < nprocs; iP++) reduceArray1[iP] = 0; for (iP = 0; iP < nprocs; iP++) reduceArray2[iP] = 0; reduceArray1[mypid] = numFpts; MPI_Allreduce(reduceArray1,reduceArray2,nprocs,MPI_INT,MPI_SUM,comm); for (iP = nprocs-1; iP >= 0; iP--) reduceArray2[iP+1] = reduceArray2[iP]; reduceArray2[0] = 0; for (iP = 2; iP <= nprocs; iP++) reduceArray2[iP] += reduceArray2[iP-1]; FStartRow = reduceArray2[mypid]; FNRows = reduceArray2[mypid+1] - FStartRow; delete [] reduceArray1; delete [] reduceArray2; CStartRow = startRow - FStartRow; CNRows = localNRows - FNRows; /* --------------------------------------------------- */ /* get Aff and Afc matrices (create permute matrices) */ /* --------------------------------------------------- */ ierr = HYPRE_IJMatrixCreate(comm,startRow,startRow+localNRows-1, FStartRow,FStartRow+FNRows-1,&IJPFF); ierr = HYPRE_IJMatrixSetObjectType(IJPFF, HYPRE_PARCSR); hypre_assert(!ierr); rowLengs = new int[localNRows]; for (irow = 0; irow < localNRows; irow++) rowLengs[irow] = 1; ierr = HYPRE_IJMatrixSetRowSizes(IJPFF, rowLengs); ierr = HYPRE_IJMatrixInitialize(IJPFF); hypre_assert(!ierr); ierr = HYPRE_IJMatrixCreate(comm,startRow,startRow+localNRows-1, CStartRow,CStartRow+CNRows-1, &IJPFC); ierr = HYPRE_IJMatrixSetObjectType(IJPFC, HYPRE_PARCSR); hypre_assert(!ierr); ierr = HYPRE_IJMatrixSetRowSizes(IJPFC, rowLengs); ierr = HYPRE_IJMatrixInitialize(IJPFC); hypre_assert(!ierr); delete [] rowLengs; /* --------------------------------------------------- */ /* get Aff and Afc matrices (load permute matrices) */ /* --------------------------------------------------- */ colValue = 1.0; rowCount = rowCount2 = 0; for (irow = 0; irow < localNRows; irow++) { rowIndex = startRow + irow; if (indepSet[irow] == 0) { colIndex = FStartRow + rowCount; HYPRE_IJMatrixSetValues(IJPFF,1,&one,(const int *) &rowIndex, (const int *) &colIndex, (const double *) &colValue); rowCount++; } else { colIndex = CStartRow + rowCount2; HYPRE_IJMatrixSetValues(IJPFC,1,&one,(const int *) &rowIndex, (const int *) &colIndex, (const double *) &colValue); rowCount2++; } } ierr = HYPRE_IJMatrixAssemble(IJPFF); hypre_assert( !ierr ); HYPRE_IJMatrixGetObject(IJPFF, (void **) &hyprePFF); //hypre_MatvecCommPkgCreate((hypre_ParCSRMatrix *) hyprePFF); sprintf(paramString, "HYPRE_ParCSR" ); mli_PFFMat = new MLI_Matrix((void *)hyprePFF,paramString,NULL); ierr = HYPRE_IJMatrixAssemble(IJPFC); hypre_assert( !ierr ); HYPRE_IJMatrixGetObject(IJPFC, (void **) &hyprePFC); //hypre_MatvecCommPkgCreate((hypre_ParCSRMatrix *) hyprePFC); hypreAPFC = hypre_ParMatmul(hypreA, hyprePFC); hypre_ParCSRMatrixTranspose(hyprePFF, &hyprePFFT, 1); hypreAfc = hypre_ParMatmul(hyprePFFT, hypreAPFC); funcPtr = new MLI_Function(); MLI_Utils_HypreParCSRMatrixGetDestroyFunc(funcPtr); sprintf(paramString, "HYPRE_ParCSR" ); mli_AfcMat = new MLI_Matrix((void *)hypreAfc,paramString,funcPtr); delete funcPtr; MLI_Matrix_ComputePtAP(mli_PFFMat, mli_Amat, &mli_AffMat); hypreAff = (hypre_ParCSRMatrix *) mli_AffMat->getMatrix(); //if (aratio > targetMu || iT == numTrials-1) break; //if (((double)FNRows/(double)localNRows) > 0.75) break; HYPRE_IJVectorCreate(comm,FStartRow, FStartRow+FNRows-1,&IJX); HYPRE_IJVectorSetObjectType(IJX, HYPRE_PARCSR); HYPRE_IJVectorInitialize(IJX); HYPRE_IJVectorAssemble(IJX); HYPRE_IJVectorGetObject(IJX, (void **) &hypreX); sprintf(paramString, "HYPRE_ParVector" ); mli_Xvec = new MLI_Vector((void *)hypreX,paramString,NULL); HYPRE_IJVectorCreate(comm,FStartRow, FStartRow+FNRows-1,&IJXacc); HYPRE_IJVectorSetObjectType(IJXacc, HYPRE_PARCSR); HYPRE_IJVectorInitialize(IJXacc); HYPRE_IJVectorAssemble(IJXacc); HYPRE_IJVectorGetObject(IJXacc, (void **) &hypreXacc); hypre_ParVectorSetConstantValues(hypreXacc, 0.0); HYPRE_IJVectorCreate(comm,FStartRow, FStartRow+FNRows-1,&IJB); HYPRE_IJVectorSetObjectType(IJB, HYPRE_PARCSR); HYPRE_IJVectorInitialize(IJB); HYPRE_IJVectorAssemble(IJB); HYPRE_IJVectorGetObject(IJB, (void **) &hypreB); hypre_ParVectorSetConstantValues(hypreB, 0.0); sprintf(paramString, "HYPRE_ParVector" ); mli_Bvec = new MLI_Vector((void *)hypreB,paramString,NULL); /* --------------------------------------------------- */ /* set up Jacobi smoother with 4 sweeps and weight=1 */ /* --------------------------------------------------- */ strcpy(paramString, "Jacobi"); smootherPtr = MLI_Solver_CreateFromName(paramString); strcpy(paramString, "setModifiedDiag"); smootherPtr->setParams(paramString, 0, NULL); targc = 2; numSweeps = 1; targv[0] = (char *) &numSweeps; for (iC = 0; iC < 5; iC++) relaxWts[iC] = 3.0/3.0; targv[1] = (char *) relaxWts; strcpy(paramString, "relaxWeight"); smootherPtr->setParams(paramString, targc, targv); maxEigen = 1.0; targc = 1; targv[0] = (char *) &maxEigen; strcpy(paramString, "setMaxEigen"); smootherPtr->setParams(paramString, targc, targv); smootherPtr->setup(mli_AffMat); /* --------------------------------------------------- */ /* relaxation */ /* --------------------------------------------------- */ targc = 2; targv[0] = (char *) &numSweeps; targv[1] = (char *) relaxWts; strcpy(paramString, "relaxWeight"); aratio = 0.0; XData = (double *) hypre_VectorData(hypre_ParVectorLocalVector(hypreX)); XaccData = (double *) hypre_VectorData(hypre_ParVectorLocalVector(hypreXacc)); for (iV = 0; iV < numVectors; iV++) { ranSeed = 9001 * 7901 * iV *iV * iV * iV + iV * iV * iV + 101; HYPRE_ParVectorSetRandomValues((HYPRE_ParVector) hypreX,ranSeed); for (irow = 0; irow < FNRows; irow++) XData[irow] = 0.5 * XData[irow] + 0.5; hypre_ParVectorAxpy(dOne, hypreX, hypreXacc); hypre_ParVectorSetConstantValues(hypreB, 0.0); hypre_ParCSRMatrixMatvec(-1.0, hypreAff, hypreX, 1.0, hypreB); rnorm0 = sqrt(hypre_ParVectorInnerProd(hypreB, hypreB)); hypre_ParVectorSetConstantValues(hypreB, 0.0); numSweeps = 5; smootherPtr->setParams(paramString, targc, targv); smootherPtr->solve(mli_Bvec, mli_Xvec); hypre_ParCSRMatrixMatvec(-1.0, hypreAff, hypreX, 1.0, hypreB); rnorm1 = sqrt(hypre_ParVectorInnerProd(hypreB, hypreB)); rnorm0 = rnorm1; hypre_ParVectorSetConstantValues(hypreB, 0.0); numSweeps = PDEGREE+1; smootherPtr->setParams(paramString, targc, targv); smootherPtr->solve(mli_Bvec, mli_Xvec); hypre_ParCSRMatrixMatvec(-1.0, hypreAff, hypreX, 1.0, hypreB); rnorm1 = sqrt(hypre_ParVectorInnerProd(hypreB, hypreB)); aratio = 0; for (irow = 0; irow < FNRows; irow++) { ratio1 = habs(XData[irow]); XaccData[irow] = ratio1; if (ratio1 > aratio) aratio = ratio1; } printf("\tTrial %3d : Jacobi norms = %16.8e %16.8e %16.8e\n",iT, rnorm0,rnorm1,aratio); if (rnorm0 > 1.0e-10) aratio = rnorm1 / rnorm0; else aratio = 0.0; } delete smootherPtr; /* --------------------------------------------------- */ /* select fine points */ /* --------------------------------------------------- */ if (iV == numVectors) aratio /= (double) numVectors; if (aratio < targetMu) { if (stopRefine == 0) { for (irow = 0; irow < localNRows; irow++) { if (indepSet[irow] == 1) /* if I am a C-point */ { count = 0; for (jcol = ADiagI[irow]; jcol < ADiagI[irow+1]; jcol++) { colInd = ADiagJ[jcol]; /* for each of my neighbors */ if (indepSet[colInd] == 0) /* if it is a F-point */ { /* if I depend strongly on it, increment counter */ for (kcol= SDiagI[irow]; kcol < SDiagI[irow+1]; kcol++) { if (SDiagJ[kcol] == colInd) { count++; break; } } if (kcol == SDiagI[irow+1]) { for (kcol=SDiagI[colInd];kcol targetMu) { sortIndices = new int[localNRows]; for (irow = 0; irow < localNRows; irow++) sortIndices[irow] = -1; iC = 0; for (irow = 0; irow < localNRows; irow++) if (indepSet[irow] != 1) sortIndices[irow] = iC++; for (irow = 0; irow < localNRows; irow++) { iC = sortIndices[irow]; if (indepSet[irow] == 0 && (habs(XaccData[iC]) > 0.1)) { aratio = targetMu; //stopRefine = 1; indepSet[irow] = 1; /* set it to a coarse point */ for (jcol = ADiagI[irow]; jcol < ADiagI[irow+1]; jcol++) { colInd = ADiagJ[jcol]; if (indepSet[colInd] == 0) /* if it is a F-point */ { for (kcol = SDiagI[irow]; kcol < SDiagI[irow+1]; kcol++) { if (SDiagJ[kcol] == colInd) { indepSet[colInd] = -1; break; } } if (kcol == SDiagI[irow+1]) { for (kcol=SDiagI[colInd];kcolgetMatrix(); startRow = hypre_ParCSRMatrixFirstRowIndex(hypreA); localNRows = hypre_ParCSRMatrixNumRows(hypreA); hypreAff = (hypre_ParCSRMatrix *) mli_Affmat->getMatrix(); AffStartRow = hypre_ParCSRMatrixFirstRowIndex(hypreAff); AffNRows = hypre_ParCSRMatrixNumRows(hypreAff); /* ------------------------------------------------------ */ /* create the diagonal matrix of A */ /* ------------------------------------------------------ */ ierr = HYPRE_IJMatrixCreate(comm,AffStartRow,AffStartRow+AffNRows-1, AffStartRow,AffStartRow+AffNRows-1,&IJInvD); ierr = HYPRE_IJMatrixSetObjectType(IJInvD, HYPRE_PARCSR); hypre_assert(!ierr); rowLengs = new int[AffNRows]; for (irow = 0; irow < AffNRows; irow++) rowLengs[irow] = 1; ierr = HYPRE_IJMatrixSetRowSizes(IJInvD, rowLengs); ierr = HYPRE_IJMatrixInitialize(IJInvD); hypre_assert(!ierr); delete [] rowLengs; /* ------------------------------------------------------ */ /* load the diagonal matrix of A */ /* ------------------------------------------------------ */ rowCount = 0; for (irow = 0; irow < localNRows; irow++) { rowIndex = startRow + irow; if (indepSet[irow] == 0) { HYPRE_ParCSRMatrixGetRow((HYPRE_ParCSRMatrix) hypreA, rowIndex, &rowSize, &colInd, &colVal); colValue = 1.0; for (jcol = 0; jcol < rowSize; jcol++) { if (colInd[jcol] == rowIndex) { colValue = colVal[jcol]; break; } } if (colValue >= 0.0) { for (jcol = 0; jcol < rowSize; jcol++) if (colInd[jcol] != rowIndex && (indepSet[colInd[jcol]-startRow] == 0) && colVal[jcol] > 0.0) colValue += colVal[jcol]; } else { for (jcol = 0; jcol < rowSize; jcol++) if (colInd[jcol] != rowIndex && (indepSet[colInd[jcol]-startRow] == 0) && colVal[jcol] < 0.0) colValue += colVal[jcol]; } colValue = 1.0 / colValue; colIndex = AffStartRow + rowCount; HYPRE_IJMatrixSetValues(IJInvD,1,&one,(const int *) &colIndex, (const int *) &colIndex, (const double *) &colValue); rowCount++; HYPRE_ParCSRMatrixRestoreRow((HYPRE_ParCSRMatrix) hypreA, rowIndex, &rowSize, &colInd, &colVal); } } /* ------------------------------------------------------ */ /* finally assemble the diagonal matrix of A */ /* ------------------------------------------------------ */ ierr = HYPRE_IJMatrixAssemble(IJInvD); hypre_assert( !ierr ); HYPRE_IJMatrixGetObject(IJInvD, (void **) &hypreInvD); ierr += HYPRE_IJMatrixSetObjectType(IJInvD, -1); ierr += HYPRE_IJMatrixDestroy(IJInvD); hypre_assert( !ierr ); /* ------------------------------------------------------ */ /* generate polynomial of Aff and invD */ /* ------------------------------------------------------ */ if (PDegree == 0) { hypreP = hypreInvD; hypreInvD = NULL; ADiag = hypre_ParCSRMatrixDiag(hypreP); ADiagI = hypre_CSRMatrixI(ADiag); ADiagJ = hypre_CSRMatrixJ(ADiag); ADiagA = hypre_CSRMatrixData(ADiag); for (irow = 0; irow < AffNRows; irow++) for (jcol = ADiagI[irow]; jcol < ADiagI[irow+1]; jcol++) ADiagA[jcol] = - ADiagA[jcol]; } else if (PDegree == 1) { #if 1 hypreP = hypre_ParMatmul(hypreAff, hypreInvD); DDiag = hypre_ParCSRMatrixDiag(hypreInvD); DDiagA = hypre_CSRMatrixData(DDiag); ADiag = hypre_ParCSRMatrixDiag(hypreP); ADiagI = hypre_CSRMatrixI(ADiag); ADiagJ = hypre_CSRMatrixJ(ADiag); ADiagA = hypre_CSRMatrixData(ADiag); for (irow = 0; irow < AffNRows; irow++) { for (jcol = ADiagI[irow]; jcol < ADiagI[irow+1]; jcol++) { if (ADiagJ[jcol] == irow) ADiagA[jcol] = - omega*DDiagA[irow]*(2.0-omega*ADiagA[jcol]); else ADiagA[jcol] = omega * omega * DDiagA[irow] * ADiagA[jcol]; } } #else ierr = HYPRE_IJMatrixCreate(comm,AffStartRow,AffStartRow+AffNRows-1, AffStartRow,AffStartRow+AffNRows-1,&IJP); ierr = HYPRE_IJMatrixSetObjectType(IJP, HYPRE_PARCSR); hypre_assert(!ierr); rowLengs = new int[AffNRows]; maxRowLeng = 0; ADiag = hypre_ParCSRMatrixDiag(hypreAff); ADiagI = hypre_CSRMatrixI(ADiag); ADiagJ = hypre_CSRMatrixJ(ADiag); ADiagA = hypre_CSRMatrixData(ADiag); for (irow = 0; irow < AffNRows; irow++) { newRowSize = 1; for (jcol = ADiagI[irow]; jcol < ADiagI[irow+1]; jcol++) if (ADiagJ[jcol] == irow) {index = jcol; break;} for (jcol = ADiagI[irow]; jcol < ADiagI[irow+1]; jcol++) if (ADiagJ[jcol] != irow && ADiagA[jcol]*ADiagA[index] < 0.0) newRowSize++; rowLengs[irow] = newRowSize; if (newRowSize > maxRowLeng) maxRowLeng = newRowSize; } ierr = HYPRE_IJMatrixSetRowSizes(IJP, rowLengs); ierr = HYPRE_IJMatrixInitialize(IJP); hypre_assert(!ierr); delete [] rowLengs; newColInd = new int[maxRowLeng]; newColVal = new double[maxRowLeng]; for (irow = 0; irow < AffNRows; irow++) { newRowSize = 0; index = -1; for (jcol = ADiagI[irow]; jcol < ADiagI[irow+1]; jcol++) if (ADiagJ[jcol] == irow) {index = jcol; break;} if (index == -1) printf("WARNING : zero diagonal.\n"); newColInd[0] = AffStartRow + irow; newColVal[0] = ADiagA[index]; newRowSize++; for (jcol = ADiagI[irow]; jcol < ADiagI[irow+1]; jcol++) { if (ADiagJ[jcol] != irow && ADiagA[jcol]*ADiagA[index] < 0.0) { newColInd[newRowSize] = AffStartRow + ADiagJ[jcol]; newColVal[newRowSize++] = ADiagA[jcol]; } else { newColVal[0] += ADiagA[jcol]; } } for (jcol = 1; jcol < newRowSize; jcol++) newColVal[jcol] /= (-newColVal[0]); newColVal[0] = 2.0 - newColVal[0]; rowIndex = AffStartRow + irow; ierr = HYPRE_IJMatrixSetValues(IJP, 1, &newRowSize, (const int *) &rowIndex, (const int *) newColInd, (const double *) newColVal); hypre_assert(!ierr); } delete [] newColInd; delete [] newColVal; ierr = HYPRE_IJMatrixAssemble(IJP); hypre_assert( !ierr ); HYPRE_IJMatrixGetObject(IJP, (void **) &hypreAD); hypreP = hypre_ParMatmul(hypreAD, hypreInvD); ierr += HYPRE_IJMatrixDestroy(IJP); #endif } else if (PDegree == 2) { hypreAD = hypre_ParMatmul(hypreAff, hypreInvD); hypreAD2 = hypre_ParMatmul(hypreAD, hypreAD); ADDiag = hypre_ParCSRMatrixDiag(hypreAD); AD2Diag = hypre_ParCSRMatrixDiag(hypreAD2); ADDiagI = hypre_CSRMatrixI(ADDiag); ADDiagJ = hypre_CSRMatrixJ(ADDiag); ADDiagA = hypre_CSRMatrixData(ADDiag); AD2DiagI = hypre_CSRMatrixI(AD2Diag); AD2DiagJ = hypre_CSRMatrixJ(AD2Diag); AD2DiagA = hypre_CSRMatrixData(AD2Diag); DDiag = hypre_ParCSRMatrixDiag(hypreInvD); DDiagA = hypre_CSRMatrixData(DDiag); newColInd = new int[2*AffNRows]; newColVal = new double[2*AffNRows]; ierr = HYPRE_IJMatrixCreate(comm,AffStartRow,AffStartRow+AffNRows-1, AffStartRow,AffStartRow+AffNRows-1,&IJP); ierr = HYPRE_IJMatrixSetObjectType(IJP, HYPRE_PARCSR); hypre_assert(!ierr); rowLengs = new int[AffNRows]; maxRowLeng = 0; for (irow = 0; irow < AffNRows; irow++) { newRowSize = 0; for (jcol = ADDiagI[irow]; jcol < ADDiagI[irow+1]; jcol++) newColInd[newRowSize] = ADDiagJ[jcol]; for (jcol = AD2DiagI[irow]; jcol < AD2DiagI[irow+1]; jcol++) newColInd[newRowSize] = AD2DiagJ[jcol]; if (newRowSize > maxRowLeng) maxRowLeng = newRowSize; hypre_qsort0(newColInd, 0, newRowSize-1); ncount = 0; for ( jcol = 0; jcol < newRowSize; jcol++ ) { if ( newColInd[jcol] != newColInd[ncount] ) { ncount++; newColInd[ncount] = newColInd[jcol]; } } newRowSize = ncount + 1; rowLengs[irow] = newRowSize; } ierr = HYPRE_IJMatrixSetRowSizes(IJP, rowLengs); ierr = HYPRE_IJMatrixInitialize(IJP); hypre_assert(!ierr); delete [] rowLengs; nnz = 0; for (irow = 0; irow < AffNRows; irow++) { rowIndex = AffStartRow + irow; newRowSize = 0; for (jcol = ADDiagI[irow]; jcol < ADDiagI[irow+1]; jcol++) { newColInd[newRowSize] = ADDiagJ[jcol]; if (ADDiagJ[jcol] == irow) newColVal[newRowSize++] = 3.0 * (1.0 - ADDiagA[jcol]); else newColVal[newRowSize++] = - 3.0 * ADDiagA[jcol]; } for (jcol = AD2DiagI[irow]; jcol < AD2DiagI[irow+1]; jcol++) { newColInd[newRowSize] = AD2DiagJ[jcol]; newColVal[newRowSize++] = AD2DiagA[jcol]; } hypre_qsort1(newColInd, newColVal, 0, newRowSize-1); ncount = 0; for ( jcol = 0; jcol < newRowSize; jcol++ ) { if ( jcol != ncount && newColInd[jcol] == newColInd[ncount] ) newColVal[ncount] += newColVal[jcol]; else if ( newColInd[jcol] != newColInd[ncount] ) { ncount++; newColVal[ncount] = newColVal[jcol]; newColInd[ncount] = newColInd[jcol]; } } newRowSize = ncount + 1; for ( jcol = 0; jcol < newRowSize; jcol++ ) newColVal[jcol] = - (DDiagA[irow] * newColVal[jcol]); ierr = HYPRE_IJMatrixSetValues(IJP, 1, &newRowSize, (const int *) &rowIndex, (const int *) newColInd, (const double *) newColVal); nnz += newRowSize; hypre_assert(!ierr); } delete [] newColInd; delete [] newColVal; ierr = HYPRE_IJMatrixAssemble(IJP); hypre_assert( !ierr ); HYPRE_IJMatrixGetObject(IJP, (void **) &hypreP); ierr += HYPRE_IJMatrixSetObjectType(IJP, -1); ierr += HYPRE_IJMatrixDestroy(IJP); hypre_assert(!ierr); hypre_ParCSRMatrixDestroy(hypreAD); hypre_ParCSRMatrixDestroy(hypreAD2); } if (hypreInvD != NULL) hypre_ParCSRMatrixDestroy(hypreInvD); /* ------------------------------------------------------ */ /* create the final P matrix (from hypreP) */ /* ------------------------------------------------------ */ hypreAfc = (hypre_ParCSRMatrix *) mli_Afcmat->getMatrix(); hypreTmp = hypre_ParMatmul(hypreP, hypreAfc); hypre_ParCSRMatrixDestroy(hypreP); hypreP = hypreTmp; tPDiag = hypre_ParCSRMatrixDiag(hypreP); tPDiagI = hypre_CSRMatrixI(tPDiag); tPDiagJ = hypre_CSRMatrixJ(tPDiag); tPDiagA = hypre_CSRMatrixData(tPDiag); AccStartRow = startRow - AffStartRow; AccNRows = localNRows - AffNRows; ierr = HYPRE_IJMatrixCreate(comm,startRow,startRow+localNRows-1, AccStartRow,AccStartRow+AccNRows-1,&IJP); ierr = HYPRE_IJMatrixSetObjectType(IJP, HYPRE_PARCSR); hypre_assert(!ierr); rowLengs = new int[localNRows]; maxRowLeng = 0; ncount = 0; for (irow = 0; irow < localNRows; irow++) { if (indepSet[irow] == 1) rowLengs[irow] = 1; else { rowLengs[irow] = tPDiagI[ncount+1] - tPDiagI[ncount]; ncount++; } if (rowLengs[irow] > maxRowLeng) maxRowLeng = rowLengs[irow]; } ierr = HYPRE_IJMatrixSetRowSizes(IJP, rowLengs); ierr = HYPRE_IJMatrixInitialize(IJP); hypre_assert(!ierr); delete [] rowLengs; fCount = 0; cCount = 0; newColInd = new int[maxRowLeng]; newColVal = new double[maxRowLeng]; for (irow = 0; irow < localNRows; irow++) { rowIndex = startRow + irow; if (indepSet[irow] == 1) { newRowSize = 1; newColInd[0] = AccStartRow + cCount; newColVal[0] = 1.0; cCount++; } else { newRowSize = 0; for (jcol = tPDiagI[fCount]; jcol < tPDiagI[fCount+1]; jcol++) { newColInd[newRowSize] = tPDiagJ[jcol] + AccStartRow; newColVal[newRowSize++] = tPDiagA[jcol]; } fCount++; } /* pruning */ if (irow == 0) printf("pruning and scaling\n"); dtemp = 0.0; for (jcol = 0; jcol < newRowSize; jcol++) if (habs(newColVal[jcol]) > dtemp) dtemp = habs(newColVal[jcol]); dtemp *= pruneFactor; ncount = 0; for (jcol = 0; jcol < newRowSize; jcol++) { if (habs(newColVal[jcol]) > dtemp) { newColInd[ncount] = newColInd[jcol]; newColVal[ncount++] = newColVal[jcol]; } } newRowSize = ncount; /* scaling */ dtemp = 0.0; for (jcol = 0; jcol < newRowSize; jcol++) dtemp += habs(newColVal[jcol]); dtemp = 1.0 / dtemp; for (jcol = 0; jcol < newRowSize; jcol++) newColVal[jcol] *= dtemp; ierr = HYPRE_IJMatrixSetValues(IJP, 1, &newRowSize, (const int *) &rowIndex, (const int *) newColInd, (const double *) newColVal); hypre_assert(!ierr); } delete [] newColInd; delete [] newColVal; ierr = HYPRE_IJMatrixAssemble(IJP); hypre_assert( !ierr ); hypre_ParCSRMatrixDestroy(hypreP); HYPRE_IJMatrixGetObject(IJP, (void **) &hypreP); ierr += HYPRE_IJMatrixSetObjectType(IJP, -1); ierr += HYPRE_IJMatrixDestroy(IJP); hypre_assert(!ierr); /* ------------------------------------------------------ */ /* package the P matrix */ /* ------------------------------------------------------ */ sprintf(paramString, "HYPRE_ParCSR"); funcPtr = new MLI_Function(); MLI_Utils_HypreParCSRMatrixGetDestroyFunc(funcPtr); mli_Pmat = new MLI_Matrix((void*) hypreP, paramString, funcPtr); delete funcPtr; return mli_Pmat; } hypre-2.33.0/src/FEI_mv/femli/mli_method_amgrs.h000066400000000000000000000072051477326011500214130ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * Header info for the Ruge Stuben AMG data structure * *****************************************************************************/ #ifndef __MLIMETHODAMGRSH__ #define __MLIMETHODAMGRSH__ #include "_hypre_utilities.h" #include "_hypre_parcsr_mv.h" #include "mli.h" #include "mli_matrix.h" #include "mli_method.h" #define MLI_METHOD_AMGRS_CLJP 0 #define MLI_METHOD_AMGRS_RUGE 1 #define MLI_METHOD_AMGRS_FALGOUT 2 #define MLI_METHOD_AMGRS_CR 3 /* *********************************************************************** * definition of the classical Ruge Stuben AMG data structure * ----------------------------------------------------------------------*/ class MLI_Method_AMGRS : public MLI_Method { int maxLevels_; /* the finest level is 0 */ int numLevels_; /* number of levels requested */ int currLevel_; /* current level being processed */ int outputLevel_; /* for diagnostics */ int coarsenScheme_; /* coarsening scheme */ int measureType_; /* local or local measure */ double threshold_; /* strength threshold */ double truncFactor_; /* truncation factor */ int mxelmtsP_; /* max no. of elmts per row for P */ int nodeDOF_; /* equation block size (fixed) */ int minCoarseSize_; /* tell when to stop coarsening */ double maxRowSum_; /* used in Boomeramg */ int symmetric_; /* symmetric or nonsymmetric amg */ int useInjectionForR_; /* how R is to be constructed */ char smoother_[20]; /* denote which pre-smoother to use */ int smootherNSweeps_; /* number of pre-smoother sweeps */ double *smootherWeights_; /* number of postsmoother sweeps */ int smootherPrintRNorm_; /* tell smoother to print rnorm */ int smootherFindOmega_; /* tell smoother to find omega */ char coarseSolver_[20]; /* denote which coarse solver to use*/ int coarseSolverNSweeps_; /* number of coarse solver sweeps */ double *coarseSolverWeights_; /* weight used in coarse solver */ double RAPTime_; double totalTime_; public : MLI_Method_AMGRS( MPI_Comm comm ); ~MLI_Method_AMGRS(); int setup( MLI *mli ); int setParams(char *name, int argc, char *argv[]); int setOutputLevel( int outputLevel ); int setNumLevels( int nlevels ); int setCoarsenScheme( int scheme ); int setMeasureType( int measure ); int setStrengthThreshold( double thresh ); int setMinCoarseSize( int minSize ); int setNodeDOF( int dof ); int setSmoother( char *stype, int num, double *wgt ); int setCoarseSolver( char *stype, int num, double *wgt ); int print(); int printStatistics(MLI *mli); MLI_Matrix *performCR(MLI_Matrix *, int *, MLI_Matrix **,int, hypre_ParCSRMatrix *); MLI_Matrix *createPmat(int *, MLI_Matrix *, MLI_Matrix *, MLI_Matrix *); }; #endif hypre-2.33.0/src/FEI_mv/femli/mli_method_amgsa.cxx000066400000000000000000001717201477326011500217510ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #if 0 /* RDF: Not sure this is really needed */ #ifdef WIN32 #define strcmp _stricmp #endif #endif #include #include "HYPRE.h" #include "HYPRE_IJ_mv.h" #include "mli_utils.h" #include "mli_matrix.h" #include "mli_matrix_misc.h" #include "mli_vector.h" #include "mli_solver.h" #include "mli_method_amgsa.h" #define MABS(x) (((x) > 0) ? (x) : -(x)) /* ********************************************************************* * * functions external to MLI * --------------------------------------------------------------------- */ #ifdef MLI_ARPACK extern "C" { /* ARPACK function to compute eigenvalues/eigenvectors */ void dnstev_(int *n, int *nev, char *which, double *sigmar, double *sigmai, int *colptr, int *rowind, double *nzvals, double *dr, double *di, double *z, int *ldz, int *info, double *tol); } #endif /* ********************************************************************* * * constructor * --------------------------------------------------------------------- */ MLI_Method_AMGSA::MLI_Method_AMGSA( MPI_Comm comm ) : MLI_Method( comm ) { char name[100]; strcpy(name, "AMGSA"); setName( name ); setID( MLI_METHOD_AMGSA_ID ); maxLevels_ = 40; numLevels_ = 40; currLevel_ = 0; outputLevel_ = 0; scalar_ = 0; nodeDofs_ = 1; currNodeDofs_ = 1; threshold_ = 0.0; nullspaceDim_ = 1; nullspaceVec_ = NULL; nullspaceLen_ = 0; numSmoothVec_ = 0; /* smooth vectors instead of null vectors */ numSmoothVecSteps_ = 0; Pweight_ = 0.0; SPLevel_ = 0; dropTolForP_ = 0.0; /* tolerance to sparsify P*/ saCounts_ = new int[40]; /* number of aggregates */ saData_ = new int*[40]; /* node to aggregate data */ saDataAux_ = NULL; spectralNorms_ = new double[40]; /* calculated max eigen */ for ( int i = 0; i < 40; i++ ) { saCounts_[i] = 0; saData_[i] = NULL; spectralNorms_[i] = 0.0; } calcNormScheme_ = 0; /* use matrix rowsum norm */ minCoarseSize_ = 3000; /* smallest coarse grid */ minAggrSize_ = 3; /* smallest aggregate size */ coarsenScheme_ = MLI_METHOD_AMGSA_LOCAL; strcpy(preSmoother_, "HSGS"); strcpy(postSmoother_, "HSGS"); preSmootherNum_ = 2; postSmootherNum_ = 2; preSmootherWgt_ = new double[2]; postSmootherWgt_ = new double[2]; preSmootherWgt_[0] = preSmootherWgt_[1] = 1.0; postSmootherWgt_[0] = postSmootherWgt_[1] = 1.0; smootherPrintRNorm_ = 0; smootherFindOmega_ = 0; strcpy(coarseSolver_, "SuperLU"); coarseSolverNum_ = 0; coarseSolverWgt_ = NULL; calibrationSize_ = 0; useSAMGeFlag_ = 0; RAPTime_ = 0.0; totalTime_ = 0.0; ddObj_ = NULL; ARPACKSuperLUExists_ = 0; saLabels_ = NULL; useSAMGDDFlag_ = 0; printToFile_ = 0; strcpy( paramFile_, "empty" ); symmetric_ = 1; arpackTol_ = 1.0e-10; } /* ********************************************************************* * * destructor * --------------------------------------------------------------------- */ MLI_Method_AMGSA::~MLI_Method_AMGSA() { char paramString[20]; if ( nullspaceVec_ != NULL ) delete [] nullspaceVec_; if ( saDataAux_ != NULL ) { for ( int j = 0; j < saCounts_[0]; j++ ) if ( saDataAux_[j] != NULL ) delete [] saDataAux_[j]; delete [] saDataAux_; } if ( saCounts_ != NULL ) delete [] saCounts_; if ( saData_ != NULL ) { for ( int i = 0; i < maxLevels_; i++ ) { if ( saData_[i] != NULL ) delete [] saData_[i]; else break; } delete [] saData_; saData_ = NULL; } if ( saLabels_ != NULL ) { for ( int k = 0; k < maxLevels_; k++ ) { if ( saLabels_[k] != NULL ) delete [] saLabels_[k]; else break; } delete [] saLabels_; saLabels_ = NULL; } if ( spectralNorms_ != NULL ) delete [] spectralNorms_; if ( preSmootherWgt_ != NULL ) delete [] preSmootherWgt_; if ( postSmootherWgt_ != NULL ) delete [] postSmootherWgt_; if ( coarseSolverWgt_ != NULL ) delete [] coarseSolverWgt_ ; if ( ddObj_!= NULL ) { if ( ddObj_->sendProcs != NULL ) delete [] ddObj_->sendProcs; if ( ddObj_->recvProcs != NULL ) delete [] ddObj_->recvProcs; if ( ddObj_->sendLengs != NULL ) delete [] ddObj_->sendLengs; if ( ddObj_->recvLengs != NULL ) delete [] ddObj_->recvLengs; if ( ddObj_->sendMap != NULL ) delete [] ddObj_->sendMap; if ( ddObj_->ANodeEqnList != NULL ) delete [] ddObj_->ANodeEqnList; if ( ddObj_->SNodeEqnList != NULL ) delete [] ddObj_->SNodeEqnList; delete ddObj_; } if ( ARPACKSuperLUExists_ ) { strcpy( paramString, "destroy" ); #ifdef MLI_ARPACK int info; dnstev_(NULL, NULL, paramString, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, &info, &arpackTol_); #endif } } /* ********************************************************************* * * set parameters * --------------------------------------------------------------------- */ int MLI_Method_AMGSA::setParams(char *in_name, int argc, char *argv[]) { int level, size, nDOF, numNS, length, nSweeps=1, offset, nsDim; int prePost, nnodes, nAggr, *aggrInfo, *labels, is, *indices; int mypid; double thresh, pweight, *nullspace, *weights=NULL, *coords, *scales; double *nsAdjust; char param1[256], param2[256], *param3; MPI_Comm comm; comm = getComm(); MPI_Comm_rank( comm, &mypid ); sscanf(in_name, "%s", param1); if ( outputLevel_ > 1 && mypid == 0 ) printf("\tMLI_Method_AMGSA::setParam = %s\n", in_name); if ( !strcmp(param1, "setOutputLevel" )) { sscanf(in_name,"%s %d", param1, &level); return ( setOutputLevel( level ) ); } else if ( !strcmp(param1, "setNumLevels" )) { sscanf(in_name,"%s %d", param1, &level); return ( setNumLevels( level ) ); } else if ( !strcmp(param1, "useSAMGe" )) { useSAMGeFlag_ = 1; return 0; } else if ( !strcmp(param1, "useSAMGDD" )) { useSAMGDDFlag_ = 1; return 0; } else if ( !strcmp(param1, "useSAMGDDExt" )) { useSAMGDDFlag_ = 2; return 0; } else if ( !strcmp(param1, "useSAMGDDExt2" )) { useSAMGDDFlag_ = 3; return 0; } else if ( !strcmp(param1, "setCoarsenScheme" )) { sscanf(in_name,"%s %s", param1, param2); if ( !strcmp(param2, "local" ) ) return ( setCoarsenScheme( MLI_METHOD_AMGSA_LOCAL ) ); else if ( !strcmp(param2, "hybrid" ) ) return ( setCoarsenScheme( MLI_METHOD_AMGSA_HYBRID ) ); else { printf("MLI_Method_AMGSA::setParams ERROR : setCoarsenScheme not"); printf(" valid. Valid options are : local \n"); return 1; } } else if ( !strcmp(param1, "setMinCoarseSize" )) { sscanf(in_name,"%s %d", param1, &size); return ( setMinCoarseSize( size ) ); } else if ( !strcmp(param1, "setMinAggrSize" )) { sscanf(in_name,"%s %d", param1, &size); return ( setMinAggregateSize( size ) ); } else if ( !strcmp(param1, "setStrengthThreshold" )) { sscanf(in_name,"%s %lg", param1, &thresh); return ( setStrengthThreshold( thresh ) ); } else if ( !strcmp(param1, "setSmoothVec" )) { sscanf(in_name,"%s %d", param1, &size); return ( setSmoothVec( size ) ); } else if ( !strcmp(param1, "setSmoothVecSteps" )) { sscanf(in_name,"%s %d", param1, &size); return ( setSmoothVecSteps( size ) ); } else if ( !strcmp(param1, "setPweight" )) { sscanf(in_name,"%s %lg", param1, &pweight); return ( setPweight( pweight ) ); } else if ( !strcmp(param1, "setSPLevel" )) { sscanf(in_name,"%s %d", param1, &level); return ( setSPLevel( level ) ); } else if ( !strcmp(param1, "setCalcSpectralNorm" )) { return ( setCalcSpectralNorm() ); } else if ( !strcmp(param1, "useNonsymmetric" )) { symmetric_ = 0; return ( 0 ); } else if ( !strcmp(param1, "setAggregateInfo" )) { if ( argc != 4 ) { printf("MLI_Method_AMGSA::setParams ERROR - setAggregateInfo"); printf(" needs 4 args.\n"); printf(" argument[0] : level number \n"); printf(" argument[1] : number of aggregates \n"); printf(" argument[2] : total degree of freedom \n"); printf(" argument[3] : aggregate information \n"); return 1; } level = *(int *) argv[0]; nAggr = *(int *) argv[1]; length = *(int *) argv[2]; aggrInfo = (int *) argv[3]; return ( setAggregateInfo(level,nAggr,length,aggrInfo) ); } else if ( !strcmp(param1, "setCalibrationSize" )) { sscanf(in_name,"%s %d", param1, &size); return ( setCalibrationSize( size ) ); } else if ( !strcmp(param1, "setPreSmoother" )) { sscanf(in_name,"%s %s", param1, param2); if ( argc != 2 ) { printf("MLI_Method_AMGSA::setParams ERROR - setPreSmoother needs"); printf(" 2 arguments.\n"); printf(" argument[0] : number of relaxation sweeps \n"); printf(" argument[1] : relaxation weights\n"); return 1; } prePost = MLI_SMOOTHER_PRE; nSweeps = *(int *) argv[0]; weights = (double *) argv[1]; return ( setSmoother(prePost, param2, nSweeps, weights) ); } else if ( !strcmp(param1, "setPostSmoother" )) { sscanf(in_name,"%s %s", param1, param2); if ( argc != 2 ) { printf("MLI_Method_AMGSA::setParams ERROR - setPostSmoother needs"); printf(" 2 arguments.\n"); printf(" argument[0] : number of relaxation sweeps \n"); printf(" argument[1] : relaxation weights\n"); return 1; } prePost = MLI_SMOOTHER_POST; nSweeps = *(int *) argv[0]; weights = (double *) argv[1]; return ( setSmoother(prePost, param2, nSweeps, weights) ); } else if ( !strcmp(param1, "setSmootherPrintRNorm" )) { smootherPrintRNorm_ = 1; return 0; } else if ( !strcmp(param1, "setSmootherFindOmega" )) { smootherFindOmega_ = 1; return 0; } else if ( !strcmp(param1, "setCoarseSolver" )) { sscanf(in_name,"%s %s", param1, param2); if ( strcmp(param2, "SuperLU") && argc != 2 ) { printf("MLI_Method_AMGSA::setParams ERROR - setCoarseSolver needs"); printf(" 2 arguments.\n"); printf(" argument[0] : number of relaxation sweeps \n"); printf(" argument[1] : relaxation weights\n"); return 1; } else if ( strcmp(param2, "SuperLU") ) { nSweeps = *(int *) argv[0]; weights = (double *) argv[1]; } else if ( !strcmp(param2, "SuperLU") ) { nSweeps = 1; weights = NULL; } return ( setCoarseSolver(param2, nSweeps, weights) ); } else if ( !strcmp(param1, "setNullSpace" )) { if ( argc != 4 ) { printf("MLI_Method_AMGSA::setParams ERROR - setNullSpace needs"); printf(" 4 arguments.\n"); printf(" argument[0] : node degree of freedom \n"); printf(" argument[1] : number of null space vectors \n"); printf(" argument[2] : null space information \n"); printf(" argument[3] : vector length \n"); return 1; } nDOF = *(int *) argv[0]; numNS = *(int *) argv[1]; nullspace = (double *) argv[2]; length = *(int *) argv[3]; return ( setNullSpace(nDOF,numNS,nullspace,length) ); } else if ( !strcmp(param1, "adjustNullSpace" )) { if ( argc != 1 ) { printf("MLI_Method_AMGSA::setParams ERROR - adjustNullSpace needs"); printf(" 1 argument.\n"); printf(" argument[0] : adjustment vectors \n"); return 1; } nsAdjust = (double *) argv[0]; return ( adjustNullSpace( nsAdjust ) ); } else if ( !strcmp(param1, "resetNullSpaceComponents" )) { if ( argc != 3 ) { printf("MLI_Method_AMGSA::setParams ERROR - resetNSComponents needs"); printf(" 2 arguments.\n"); printf(" argument[0] : number of equations \n"); printf(" argument[1] : equation number offset \n"); printf(" argument[2] : list of equation numbers \n"); return 1; } length = *(int *) argv[0]; offset = *(int *) argv[1]; indices = (int *) argv[2]; return ( resetNullSpaceComponents(length, offset, indices) ); } else if ( !strcmp(param1, "setNodalCoord" )) { if ( argc != 5 && argc != 6 ) { printf("MLI_Method_AMGSA::setParams ERROR - setNodalCoord needs"); printf(" 4 arguments.\n"); printf(" argument[0] : number of nodes \n"); printf(" argument[1] : node degree of freedom \n"); printf(" argument[2] : number of space dimension\n"); printf(" argument[3] : coordinate information \n"); printf(" argument[4] : null space dimension \n"); printf(" argument[5] : scalings (can be null) \n"); return 1; } nnodes = *(int *) argv[0]; nDOF = *(int *) argv[1]; nsDim = *(int *) argv[2]; coords = (double *) argv[3]; numNS = *(int *) argv[4]; if ( argc == 6 ) scales = (double *) argv[5]; else scales = NULL; return ( setNodalCoordinates(nnodes,nDOF,nsDim,coords,numNS,scales) ); } else if ( !strcmp(param1, "setLabels" )) { if ( argc != 3 ) { printf("MLI_Method_AMGSA::setParams ERROR - setLabels needs"); printf(" 3 arguments.\n"); printf(" argument[0] : vector length \n"); printf(" argument[1] : level number \n"); printf(" argument[2] : label information \n"); return 1; } length = *(int *) argv[0]; level = *(int *) argv[1]; labels = (int *) argv[2]; if ( saLabels_ == NULL ) { saLabels_ = new int*[maxLevels_]; for ( is = 0; is < maxLevels_; is++ ) saLabels_[is] = NULL; } if ( level < 0 || level >= maxLevels_ ) { printf("MLI_Method_AMGSA::setParams ERROR - setLabels has \n"); printf("invalid level number = %d (%d)\n", level, maxLevels_); return 1; } if ( saLabels_[level] != NULL ) delete [] saLabels_[level]; saLabels_[level] = new int[length]; for ( is = 0; is < length; is++ ) saLabels_[level][is] = labels[is]; return 0; } else if ( !strcmp(param1, "scalar" )) { scalar_ = 1; } else if ( !strcmp(param1, "setParamFile" )) { param3 = (char *) argv[0]; strcpy( paramFile_, param3 ); return 0; } else if ( !strcmp(param1, "printNodalCoord" )) { printToFile_ |= 2; return 0; } else if ( !strcmp(param1, "printNullSpace" )) { printToFile_ |= 4; return 0; } else if ( !strcmp(param1, "printElemNodeList" )) { printToFile_ |= 8; return 0; } else if ( !strcmp(param1, "print" )) { return ( print() ); } else if ( !strcmp(param1, "arpackTol" )) { sscanf(in_name, "%s %lg", param1, &arpackTol_); if ( arpackTol_ <= 1.0e-10 ) arpackTol_ = 1.0e-10; if ( arpackTol_ > 1.0e-1 ) arpackTol_ = 1.0e-1; } return 1; } /***************************************************************************** * get parameters *--------------------------------------------------------------------------*/ int MLI_Method_AMGSA::getParams(char *in_name, int *argc, char *argv[]) { int nDOF, numNS, length; double *nullspace; if ( !strcmp(in_name, "getNullSpace" )) { if ( (*argc) < 4 ) { printf("MLI_Method_AMGSA::getParams ERROR - getNullSpace needs"); printf(" 4 arguments.\n"); exit(1); } getNullSpace(nodeDofs_,numNS,nullspace,length); argv[0] = (char *) &nDOF; argv[1] = (char *) &numNS; argv[2] = (char *) nullspace; argv[3] = (char *) &length; (*argc) = 4; return 0; } else { printf("MLI_Method_AMGSA::getParams ERROR - invalid param string.\n"); return 1; } } /*********************************************************************** * generate multilevel structure * --------------------------------------------------------------------- */ int MLI_Method_AMGSA::setup( MLI *mli ) { int level, mypid, nRows, nullspaceDimKeep, ii, jj; double startTime, elapsedTime, maxEigen, maxEigenT, dtemp=0.0; char paramString[100], *targv[10]; MLI_Matrix *mli_Pmat, *mli_Rmat, *mli_Amat, *mli_ATmat, *mli_cAmat; MLI_Solver *smootherPtr, *csolvePtr; MPI_Comm comm; MLI_Function *funcPtr; hypre_ParCSRMatrix *hypreRT; MLI_FEData *fedata; MLI_SFEI *sfei; #define DEBUG #ifdef DEBUG int *partition, ANRows, AStart, AEnd; double *XData, rnorm; HYPRE_IJVector IJX, IJY; hypre_ParCSRMatrix *hypreA; hypre_ParVector *hypreX, *hypreY; if (nullspaceVec_ != NULL) { mli_Amat = mli->getSystemMatrix(0); hypreA = (hypre_ParCSRMatrix *) mli_Amat->getMatrix(); comm = hypre_ParCSRMatrixComm(hypreA); MPI_Comm_rank(comm,&mypid); HYPRE_ParCSRMatrixGetRowPartitioning((HYPRE_ParCSRMatrix) hypreA,&partition); AStart = partition[mypid]; AEnd = partition[mypid+1]; ANRows = AEnd - AStart; free(partition); HYPRE_IJVectorCreate(comm, AStart, AEnd-1,&IJX); HYPRE_IJVectorSetObjectType(IJX, HYPRE_PARCSR); HYPRE_IJVectorInitialize(IJX); HYPRE_IJVectorAssemble(IJX); HYPRE_IJVectorGetObject(IJX, (void **) &hypreX); HYPRE_IJVectorCreate(comm, AStart, AEnd-1,&IJY); HYPRE_IJVectorSetObjectType(IJY, HYPRE_PARCSR); HYPRE_IJVectorInitialize(IJY); HYPRE_IJVectorAssemble(IJY); HYPRE_IJVectorGetObject(IJY, (void **) &hypreY); XData = (double *) hypre_VectorData(hypre_ParVectorLocalVector(hypreX)); for (ii = 0; ii < nullspaceDim_; ii++) { for (jj = 0; jj < ANRows; jj++) XData[jj] = nullspaceVec_[ii*ANRows+jj]; hypre_ParCSRMatrixMatvec(1.0, hypreA, hypreX, 0.0, hypreY); rnorm = sqrt(hypre_ParVectorInnerProd(hypreY, hypreY)); if (mypid == 0) printf("HYPRE FEI: check null space = %e\n", rnorm); } HYPRE_IJVectorDestroy(IJX); HYPRE_IJVectorDestroy(IJY); } else { printf("MLI::setup - no nullspace vector.\n"); } #endif #ifdef MLI_DEBUG_DETAILED printf("MLI_Method_AMGSA::setup begins...\n"); #endif /* --------------------------------------------------------------- */ /* if using the extended DD method, needs special processing */ /* --------------------------------------------------------------- */ #if 1 if (useSAMGDDFlag_ == 2) { return(setupExtendedDomainDecomp(mli)); } if (useSAMGDDFlag_ == 3) { return(setupExtendedDomainDecomp2(mli)); } #endif /* --------------------------------------------------------------- */ /* clean up some mess made previously for levels other than the */ /* finest level */ /* --------------------------------------------------------------- */ if (saData_ != NULL) { for (level = 1; level < maxLevels_; level++) { if (saData_[level] != NULL) delete [] saData_[level]; saData_[level] = NULL; } } nullspaceDimKeep = nullspaceDim_; /* --------------------------------------------------------------- */ /* if requested, compute null spaces from finite element stiffness */ /* matrices */ /* --------------------------------------------------------------- */ if (useSAMGeFlag_) { level = 0; fedata = mli->getFEData( level ); if (fedata != NULL) setupFEDataBasedNullSpaces(mli); else { sfei = mli->getSFEI( level ); if (sfei != NULL) setupSFEIBasedNullSpaces(mli); else useSAMGeFlag_ = 0; } } /* --------------------------------------------------------------- */ /* if domain decomposition requested, compute aggregate based on */ /* subdomains */ /* --------------------------------------------------------------- */ if (useSAMGDDFlag_ == 1) { level = 0; fedata = mli->getFEData( level ); if (fedata != NULL) setupFEDataBasedAggregates(mli); else { sfei = mli->getSFEI( level ); if (sfei != NULL) setupSFEIBasedAggregates(mli); else useSAMGDDFlag_ = 0; } } /* --------------------------------------------------------------- */ /* update nullspace dimension */ /* --------------------------------------------------------------- */ if ( nullspaceVec_ != NULL ) { for ( ii = nullspaceDim_-1; ii >= 0; ii-- ) { dtemp = 0.0; for ( jj = 0; jj < nullspaceLen_; jj++ ) dtemp += MABS(nullspaceVec_[ii*nullspaceLen_+jj]); if (dtemp != 0.0) break; } nullspaceDim_ = nullspaceDim_ + ii - nullspaceDim_ + 1; } /* --------------------------------------------------------------- */ /* call calibration if calibration size > 0 */ /* --------------------------------------------------------------- */ if (calibrationSize_ > 0) return(setupCalibration(mli)); /* --------------------------------------------------------------- */ /* if no null spaces have been provided nor computed, set null */ /* space dimension equal to node degree of freedom */ /* --------------------------------------------------------------- */ if (nullspaceDim_ != nodeDofs_ && nullspaceVec_ == NULL && numSmoothVec_ == 0) nullspaceDim_ = nodeDofs_; /* --------------------------------------------------------------- */ /* traverse all levels */ /* --------------------------------------------------------------- */ RAPTime_ = 0.0; level = 0; comm = getComm(); MPI_Comm_rank( comm, &mypid ); mli_Amat = mli->getSystemMatrix(level); totalTime_ = MLI_Utils_WTime(); #if HAVE_LOBPCG relaxNullSpaces(mli_Amat); #endif for (level = 0; level < numLevels_; level++ ) { if (mypid == 0 && outputLevel_ > 0) { printf("\t*****************************************************\n"); printf("\t*** Aggregation (uncoupled) : level = %d\n", level); printf("\t-----------------------------------------------------\n"); } currLevel_ = level; if (level == numLevels_-1) break; /* -------------------------------------------------- */ /* fetch fine grid matrix */ /* -------------------------------------------------- */ mli_Amat = mli->getSystemMatrix(level); hypre_assert (mli_Amat != NULL); /* -------------------------------------------------- */ /* perform coarsening */ /* -------------------------------------------------- */ switch (coarsenScheme_) { case MLI_METHOD_AMGSA_LOCAL : if (level == 0) maxEigen = genP(mli_Amat,&mli_Pmat,saCounts_[0],saData_[0]); else maxEigen = genP(mli_Amat, &mli_Pmat, 0, NULL); break; case MLI_METHOD_AMGSA_HYBRID : if (level == 0) maxEigen = genP(mli_Amat,&mli_Pmat,saCounts_[0],saData_[0]); else maxEigen = genP(mli_Amat, &mli_Pmat, 0, NULL); break; } if (maxEigen != 0.0) spectralNorms_[level] = maxEigen; if (mli_Pmat == NULL) break; startTime = MLI_Utils_WTime(); /* -------------------------------------------------- */ /* construct and set the coarse grid matrix */ /* -------------------------------------------------- */ if (mypid == 0 && outputLevel_ > 0) printf("\tComputing RAP\n"); MLI_Matrix_ComputePtAP(mli_Pmat, mli_Amat, &mli_cAmat); mli->setSystemMatrix(level+1, mli_cAmat); elapsedTime = (MLI_Utils_WTime() - startTime); RAPTime_ += elapsedTime; if (mypid == 0 && outputLevel_ > 0) printf("\tRAP computed, time = %e seconds.\n", elapsedTime); #if 0 mli_Amat->print("Amat"); mli_Pmat->print("Pmat"); mli_cAmat->print("cAmat"); #endif /* -------------------------------------------------- */ /* set the prolongation matrix */ /* -------------------------------------------------- */ mli->setProlongation(level+1, mli_Pmat); /* -------------------------------------------------- */ /* if nonsymmetric, generate a different R */ /* then set restriction operator */ /* -------------------------------------------------- */ if (symmetric_ == 0 && Pweight_ == 0.0) { MLI_Matrix_Transpose(mli_Amat, &mli_ATmat); switch (coarsenScheme_) { case MLI_METHOD_AMGSA_LOCAL : maxEigenT = genP(mli_ATmat, &mli_Rmat, saCounts_[level], saData_[level]); if ( maxEigenT < 0.0 ) printf("MLI_Method_AMGSA::setup ERROR : maxEigenT < 0.\n"); break; case MLI_METHOD_AMGSA_HYBRID : maxEigenT = genP(mli_ATmat, &mli_Rmat, saCounts_[level], saData_[level]); if ( maxEigenT < 0.0 ) printf("MLI_Method_AMGSA::setup ERROR : maxEigenT < 0.\n"); break; } delete mli_ATmat; hypreRT = (hypre_ParCSRMatrix *) mli_Rmat->takeMatrix(); delete mli_Rmat; sprintf(paramString, "HYPRE_ParCSRT"); funcPtr = new MLI_Function(); MLI_Utils_HypreParCSRMatrixGetDestroyFunc(funcPtr); sprintf(paramString, "HYPRE_ParCSRT" ); mli_Rmat = new MLI_Matrix( (void *) hypreRT, paramString, funcPtr ); delete funcPtr; } else { sprintf(paramString, "HYPRE_ParCSRT"); mli_Rmat = new MLI_Matrix(mli_Pmat->getMatrix(), paramString, NULL); } mli->setRestriction(level, mli_Rmat); /* -------------------------------------------------- */ /* if a global coarsening step has been called, this */ /* is the coarsest grid. So quit. */ /* -------------------------------------------------- */ if (spectralNorms_[level] == 1.0e39) { spectralNorms_[level] = 0.0; level++; currLevel_ = level; break; } /* -------------------------------------------------- */ /* set the smoothers */ /* (if domain decomposition and ARPACKA SuperLU */ /* smoothers is requested, perform special treatment, */ /* and if domain decomposition and SuperLU smoother */ /* is requested with multiple local subdomains, again */ /* perform special treatment.) */ /* -------------------------------------------------- */ if ( useSAMGDDFlag_ == 1 && numLevels_ == 2 && !strcmp(preSmoother_, "ARPACKSuperLU") ) { setupFEDataBasedSuperLUSmoother(mli, level); smootherPtr = MLI_Solver_CreateFromName(preSmoother_); targv[0] = (char *) ddObj_; sprintf( paramString, "ARPACKSuperLUObject" ); smootherPtr->setParams(paramString, 1, targv); smootherPtr->setup(mli_Amat); mli->setSmoother( level, MLI_SMOOTHER_PRE, smootherPtr ); #if 0 smootherPtr = MLI_Solver_CreateFromName(preSmoother_); smootherPtr->setParams(paramString, 1, targv); smootherPtr->setup(mli_Amat); mli->setSmoother( level, MLI_SMOOTHER_POST, smootherPtr ); #endif continue; } else if ( useSAMGDDFlag_ == 1 && numLevels_ == 2 && !strcmp(preSmoother_, "SeqSuperLU") && saDataAux_ != NULL) { smootherPtr = MLI_Solver_CreateFromName(preSmoother_); sprintf( paramString, "setSubProblems" ); targv[0] = (char *) &(saDataAux_[0][0]); targv[1] = (char *) &(saDataAux_[0][1]); targv[2] = (char *) &(saDataAux_[1]); smootherPtr->setParams(paramString, 3, targv); smootherPtr->setup(mli_Amat); mli->setSmoother(level, MLI_SMOOTHER_PRE, smootherPtr); mli->setSmoother(level, MLI_SMOOTHER_POST, NULL); } else { smootherPtr = MLI_Solver_CreateFromName( preSmoother_ ); targv[0] = (char *) &preSmootherNum_; targv[1] = (char *) preSmootherWgt_; sprintf( paramString, "relaxWeight" ); smootherPtr->setParams(paramString, 2, targv); if ( !strcmp(preSmoother_, "Jacobi") ) { sprintf( paramString, "setModifiedDiag" ); smootherPtr->setParams(paramString, 0, NULL); } if ( !strcmp(preSmoother_, "MLS") ) { sprintf( paramString, "maxEigen" ); targv[0] = (char *) &maxEigen; smootherPtr->setParams(paramString, 1, targv); } if ( smootherPrintRNorm_ == 1 ) { sprintf( paramString, "printRNorm" ); smootherPtr->setParams(paramString, 0, NULL); } if ( smootherFindOmega_ == 1 ) { sprintf( paramString, "findOmega" ); smootherPtr->setParams(paramString, 0, NULL); } smootherPtr->setup(mli_Amat); mli->setSmoother( level, MLI_SMOOTHER_PRE, smootherPtr ); if ( strcmp(preSmoother_, postSmoother_) ) { smootherPtr = MLI_Solver_CreateFromName( postSmoother_ ); targv[0] = (char *) &postSmootherNum_; targv[1] = (char *) postSmootherWgt_; sprintf( paramString, "relaxWeight" ); smootherPtr->setParams(paramString, 2, targv); if ( !strcmp(postSmoother_, "MLS") ) { sprintf( paramString, "maxEigen" ); targv[0] = (char *) &maxEigen; smootherPtr->setParams(paramString, 1, targv); } if ( smootherPrintRNorm_ == 1 ) { sprintf( paramString, "printRNorm" ); smootherPtr->setParams(paramString, 0, NULL); } if ( smootherFindOmega_ == 1 ) { sprintf( paramString, "findOmega" ); smootherPtr->setParams(paramString, 0, NULL); } smootherPtr->setup(mli_Amat); } mli->setSmoother( level, MLI_SMOOTHER_POST, smootherPtr ); } } /* --------------------------------------------------------------- */ /* set the coarse grid solver */ /* --------------------------------------------------------------- */ if (mypid == 0 && outputLevel_ > 0) printf("\tCoarse level = %d\n",level); mli_Amat = mli->getSystemMatrix(level); strcpy(paramString, "nrows"); mli_Amat->getMatrixInfo(paramString, nRows, dtemp); if (nRows > 10000) { if ( outputLevel_ > 1 && mypid == 0 ) printf("ML_Method_AMGSA::message - nCoarse too large => GMRESSGS.\n"); strcpy(coarseSolver_, "GMRESSGS"); csolvePtr = MLI_Solver_CreateFromName( coarseSolver_ ); sprintf(paramString, "maxIterations %d", coarseSolverNum_); csolvePtr->setParams(paramString, 0, NULL); } else { csolvePtr = MLI_Solver_CreateFromName( coarseSolver_ ); if (strcmp(coarseSolver_, "SuperLU")) { targv[0] = (char *) &coarseSolverNum_; targv[1] = (char *) coarseSolverWgt_ ; sprintf( paramString, "relaxWeight" ); csolvePtr->setParams(paramString, 2, targv); if (!strcmp(coarseSolver_, "MLS")) { sprintf(paramString, "maxEigen"); targv[0] = (char *) &maxEigen; csolvePtr->setParams(paramString, 1, targv); } } } mli_Amat = mli->getSystemMatrix(level); csolvePtr->setup(mli_Amat); mli->setCoarseSolve(csolvePtr); totalTime_ = MLI_Utils_WTime() - totalTime_; /* --------------------------------------------------------------- */ /* return the coarsest grid level number */ /* --------------------------------------------------------------- */ if ( outputLevel_ >= 2 ) printStatistics(mli); nullspaceDim_ = nullspaceDimKeep; #ifdef MLI_DEBUG_DETAILED printf("MLI_Method_AMGSA::setup ends."); #endif return (level+1); } /* ********************************************************************* * * set diagnostics output level * --------------------------------------------------------------------- */ int MLI_Method_AMGSA::setOutputLevel( int level ) { outputLevel_ = level; return 0; } /* ********************************************************************* * * set number of levels * --------------------------------------------------------------------- */ int MLI_Method_AMGSA::setNumLevels( int nlevels ) { if ( nlevels < maxLevels_ && nlevels > 0 ) numLevels_ = nlevels; return 0; } /* ********************************************************************* * * set smoother * --------------------------------------------------------------------- */ int MLI_Method_AMGSA::setSmoother(int prePost, char *stype, int num, double *wgt) { int i; #ifdef MLI_DEBUG_DETAILED printf("MLI_Method_AMGSA::setSmoother - type = %s.\n", stype); #endif if ( prePost != MLI_SMOOTHER_PRE && prePost != MLI_SMOOTHER_BOTH && prePost != MLI_SMOOTHER_POST ) { printf("MLI_Method_AMGSA::setSmoother ERROR - invalid info (1).\n"); return 1; } if ( prePost == MLI_SMOOTHER_PRE || prePost != MLI_SMOOTHER_BOTH ) { strcpy( preSmoother_, stype ); if ( num > 0 ) preSmootherNum_ = num; else preSmootherNum_ = 1; delete [] preSmootherWgt_; preSmootherWgt_ = new double[preSmootherNum_]; if ( wgt == NULL ) for (i = 0; i < preSmootherNum_; i++) preSmootherWgt_[i] = 1.0; else for (i = 0; i < preSmootherNum_; i++) preSmootherWgt_[i] = wgt[i]; } if ( prePost == MLI_SMOOTHER_POST || prePost == MLI_SMOOTHER_BOTH ) { strcpy( postSmoother_, stype ); if ( num > 0 ) postSmootherNum_ = num; else postSmootherNum_ = 1; delete [] postSmootherWgt_; postSmootherWgt_ = new double[postSmootherNum_]; if ( wgt == NULL ) for (i = 0; i < postSmootherNum_; i++) postSmootherWgt_[i] = 1.0; else for (i = 0; i < postSmootherNum_; i++) postSmootherWgt_[i] = wgt[i]; } return 0; } /* ********************************************************************* * * set coarse solver * --------------------------------------------------------------------- */ int MLI_Method_AMGSA::setCoarseSolver( char *stype, int num, double *wgt ) { int i; #ifdef MLI_DEBUG_DETAILED printf("MLI_Method_AMGSA::setCoarseSolver - type = %s.\n", stype); #endif strcpy( coarseSolver_, stype ); if ( num > 0 ) coarseSolverNum_ = num; else coarseSolverNum_ = 1; delete [] coarseSolverWgt_ ; if ( wgt != NULL && strcmp(coarseSolver_, "SuperLU") ) { coarseSolverWgt_ = new double[coarseSolverNum_]; for (i = 0; i < coarseSolverNum_; i++) coarseSolverWgt_ [i] = wgt[i]; } else coarseSolverWgt_ = NULL; return 0; } /* ********************************************************************* * * set coarsening scheme * --------------------------------------------------------------------- */ int MLI_Method_AMGSA::setCoarsenScheme( int scheme ) { if ( scheme == MLI_METHOD_AMGSA_LOCAL ) { coarsenScheme_ = MLI_METHOD_AMGSA_LOCAL; return 0; } else if ( scheme == MLI_METHOD_AMGSA_HYBRID ) { coarsenScheme_ = MLI_METHOD_AMGSA_HYBRID; return 0; } else { printf("MLI_Method_AMGSA::setCoarsenScheme ERROR - invalid scheme.\n"); return 1; } } /* ********************************************************************* * * set minimum coarse size * --------------------------------------------------------------------- */ int MLI_Method_AMGSA::setMinCoarseSize( int coarseSize ) { if ( coarseSize > 0 ) minCoarseSize_ = coarseSize; return 0; } /* ********************************************************************* * * set minimum aggregate size * --------------------------------------------------------------------- */ int MLI_Method_AMGSA::setMinAggregateSize( int aggrSize ) { if ( aggrSize > 0 ) minAggrSize_ = aggrSize; return 0; } /* ********************************************************************* * * set coarsening threshold * --------------------------------------------------------------------- */ int MLI_Method_AMGSA::setStrengthThreshold( double thresh ) { if ( thresh > 0.0 ) threshold_ = thresh; else threshold_ = 0.0; return 0; } /* ********************************************************************* * * set number of smooth vectors * --------------------------------------------------------------------- */ int MLI_Method_AMGSA::setSmoothVec( int num ) { if ( num >= 0 ) numSmoothVec_ = num; return 0; } /* ********************************************************************* * * set number of steps for generating smooth vectors * --------------------------------------------------------------------- */ int MLI_Method_AMGSA::setSmoothVecSteps( int num ) { if ( num >= 0 ) numSmoothVecSteps_ = num; return 0; } /* ********************************************************************* * * set damping factor for smoother prolongator * --------------------------------------------------------------------- */ int MLI_Method_AMGSA::setPweight( double weight ) { if ( weight >= 0.0 && weight <= 2.0 ) Pweight_ = weight; return 0; } /* ********************************************************************* * * set starting level for smoother prolongator * --------------------------------------------------------------------- */ int MLI_Method_AMGSA::setSPLevel( int level ) { if ( level > 0 ) SPLevel_ = level; return 0; } /* ********************************************************************* * * indicate spectral norm is to be calculated * --------------------------------------------------------------------- */ int MLI_Method_AMGSA::setCalcSpectralNorm() { calcNormScheme_ = 1; return 0; } /* ********************************************************************* * * load the initial aggregate information * --------------------------------------------------------------------- */ int MLI_Method_AMGSA::setAggregateInfo(int level, int aggrCnt, int length, int *aggrInfo) { if ( level != 0 ) { printf("MLI_Method_AMGSA::setAggregateInfo ERROR : invalid level"); printf(" number = %d.", level); return 1; } saCounts_[level] = aggrCnt; if ( saData_[level] != NULL ) delete [] saData_[level]; saData_[level] = new int[length]; for ( int i = 0; i < length; i++ ) saData_[level][i] = aggrInfo[i]; return 0; } /* ********************************************************************* * * load the null space * --------------------------------------------------------------------- */ int MLI_Method_AMGSA::setNullSpace( int nDOF, int ndim, double *nullvec, int length ) { #if 0 if ( (nullvec == NULL) && (nDOF != ndim) ) { printf("MLI_Method_AMGSA::setNullSpace WARNING - When no nullspace\n"); printf(" vector is specified, the nodal DOFS must be equal to the \n"); printf("nullspace dimension.\n"); ndim = nDOF; } #endif nodeDofs_ = nDOF; currNodeDofs_ = nDOF; nullspaceDim_ = ndim; nullspaceLen_ = length; if ( nullspaceVec_ != NULL ) delete [] nullspaceVec_; if ( nullvec != NULL ) { nullspaceVec_ = new double[length * ndim]; for ( int i = 0; i < length*ndim; i++ ) nullspaceVec_[i] = nullvec[i]; } else nullspaceVec_ = NULL; return 0; } /* ********************************************************************* * * adjust null space vectors * --------------------------------------------------------------------- */ int MLI_Method_AMGSA::adjustNullSpace(double *vecAdjust) { int i; if ( useSAMGeFlag_ ) return 0; for ( i = 0; i < nullspaceLen_*nullspaceDim_; i++ ) nullspaceVec_[i] += vecAdjust[i]; return 0; } /* ********************************************************************* * * reset some entry in the null space vectors * --------------------------------------------------------------------- */ int MLI_Method_AMGSA::resetNullSpaceComponents(int length, int start, int *eqnIndices) { int i, j, index; if ( useSAMGeFlag_ ) return 0; for ( i = 0; i < length; i++ ) { index = eqnIndices[i] - start; for ( j = 0; j < nullspaceDim_; j++ ) nullspaceVec_[j*nullspaceLen_+index] = 0.; } return 0; } /* ********************************************************************* * * load nodal coordinates (translates into rigid body modes) * (abridged from similar function in ML) * --------------------------------------------------------------------- */ int MLI_Method_AMGSA::setNodalCoordinates(int num_nodes,int nDOF,int nsDim, double *coords, int numNS, double *scalings) { int i, j, k, offset, voffset, mypid; char fname[100]; FILE *fp; MPI_Comm comm = getComm(); MPI_Comm_rank( comm, &mypid ); if ( nDOF == 1 ) { nodeDofs_ = 1; currNodeDofs_ = 1; nullspaceLen_ = num_nodes; nullspaceDim_ = numNS; if (useSAMGeFlag_ == 0 && numNS != 1) nullspaceDim_ = 1; } else if ( nDOF == 3 ) { nodeDofs_ = 3; currNodeDofs_ = 3; nullspaceLen_ = num_nodes * 3; nullspaceDim_ = numNS; if (useSAMGeFlag_ == 0 && numNS != 6 && numNS != 12 && numNS != 21) nullspaceDim_ = 6; } else { printf("setNodalCoordinates: nDOF = %d not supported\n",nDOF); exit(1); } if (nullspaceVec_ != NULL) delete [] nullspaceVec_; if ((printToFile_ & 2) != 0 && nodeDofs_ == 3 ) { sprintf(fname, "nodalCoord.%d", mypid); fp = fopen(fname, "w"); fprintf(fp, "%d\n", num_nodes); for ( i = 0 ; i < num_nodes; i++ ) { for ( j = 0 ; j < nodeDofs_; j++ ) fprintf(fp," %25.16e", coords[i*nodeDofs_+j]); fprintf(fp,"\n"); } fclose(fp); } nullspaceVec_ = new double[nullspaceLen_ * nullspaceDim_]; for( i = 0 ; i < nullspaceLen_*nullspaceDim_; i++ ) nullspaceVec_[i] = 0.0; for( i = 0 ; i < num_nodes; i++ ) { if ( nodeDofs_ == 1 ) { for( k = 0; k < nsDim; k++ ) nullspaceVec_[k*nullspaceLen_+i] = 0.0; nullspaceVec_[i] = 1.0; if ( nullspaceDim_ == 4 ) { for( k = 0; k < nsDim; k++ ) nullspaceVec_[(k+1)*nullspaceLen_+i] = coords[i*nsDim+k]; } } else if ( nodeDofs_ == 3 ) { if ( nullspaceDim_ == 6 ) { voffset = i * nodeDofs_; for ( j = 0; j < 3; j++ ) { for( k = 0; k < 3; k++ ) { offset = k * nullspaceLen_ + voffset + j; if ( j == k ) nullspaceVec_[offset] = 1.0; else nullspaceVec_[offset] = 0.0; } } for ( j = 0; j < 3; j++ ) { for ( k = 3; k < 6; k++ ) { offset = k * nullspaceLen_ + voffset + j; if ( j == k-3 ) nullspaceVec_[offset] = 0.0; else { if (j+k == 4) nullspaceVec_[offset] = coords[i*3+2]; else if (j+k == 5) nullspaceVec_[offset] = coords[i*3+1]; else if (j+k == 6) nullspaceVec_[offset] = coords[i*3]; else nullspaceVec_[offset] = 0.0; } } } j = 0; k = 5; offset = k * nullspaceLen_ + voffset + j; nullspaceVec_[offset] *= -1.0; j = 1; k = 3; offset = k * nullspaceLen_ + voffset + j; nullspaceVec_[offset] *= -1.0; j = 2; k = 4; offset = k * nullspaceLen_ + voffset + j; nullspaceVec_[offset] *= -1.0; } else if ( (nullspaceDim_ == 12 || nullspaceDim_ == 21 || nullspaceDim_ == 24) && useSAMGeFlag_ == 0 ) { voffset = i * nodeDofs_; for ( j = 0; j < 3; j++ ) { for( k = 0; k < 3; k++ ) { offset = k * nullspaceLen_ + voffset + j; if ( j == k ) nullspaceVec_[offset] = 1.0; else nullspaceVec_[offset] = 0.0; } for( k = 3; k < 6; k++ ) { offset = k * nullspaceLen_ + voffset + j; if ( j == (k-3) ) nullspaceVec_[offset] = coords[i*3]; else nullspaceVec_[offset] = 0.0; } for( k = 6; k < 9; k++ ) { offset = k * nullspaceLen_ + voffset + j; if ( j == (k-6) ) nullspaceVec_[offset] = coords[i*3+1]; else nullspaceVec_[offset] = 0.0; } for( k = 9; k < 12; k++ ) { offset = k * nullspaceLen_ + voffset + j; if ( j == (k-9) ) nullspaceVec_[offset] = coords[i*3+2]; else nullspaceVec_[offset] = 0.0; } } } if ( (nullspaceDim_ == 21 || nullspaceDim_ == 24) && useSAMGeFlag_ == 0 ) { voffset = i * nodeDofs_; for ( j = 0; j < 3; j++ ) { for( k = 12; k < 15; k++ ) { offset = k * nullspaceLen_ + voffset + j; if ( j == (k-12) ) nullspaceVec_[offset] = coords[i*3]*coords[i*3+1]; else nullspaceVec_[offset] = 0.0; } for( k = 15; k < 18; k++ ) { offset = k * nullspaceLen_ + voffset + j; if ( j == (k-15) ) nullspaceVec_[offset] = coords[i*3+1]*coords[i*3+2]; else nullspaceVec_[offset] = 0.0; } for( k = 18; k < 21; k++ ) { offset = k * nullspaceLen_ + voffset + j; if (j == (k-18)) nullspaceVec_[offset] = coords[i*3]*coords[i*3+2]; else nullspaceVec_[offset] = 0.0; } } } if ( nullspaceDim_ == 24 && useSAMGeFlag_ == 0 ) { voffset = i * nodeDofs_; for ( j = 0; j < 3; j++ ) { for( k = 21; k < 24; k++ ) { offset = k * nullspaceLen_ + voffset + j; if (j == (k-21)) nullspaceVec_[offset] = coords[i*3]*coords[i*3+1]*coords[i*3+2]; else nullspaceVec_[offset] = 0.0; } } } } } if ( scalings != NULL ) { for ( i = 0 ; i < nullspaceDim_; i++ ) for ( j = 0 ; j < nullspaceLen_; j++ ) nullspaceVec_[i*nullspaceLen_+j] /= scalings[j]; } return 0; } /* ********************************************************************* * * set parameter for calibration AMG * --------------------------------------------------------------------- */ int MLI_Method_AMGSA::setCalibrationSize( int size ) { if ( size > 0 ) calibrationSize_ = size; return 0; } /* ********************************************************************* * * print AMGSA information * --------------------------------------------------------------------- */ int MLI_Method_AMGSA::print() { int mypid; MPI_Comm comm = getComm(); MPI_Comm_rank( comm, &mypid); if ( mypid == 0 ) { printf("\t********************************************************\n"); printf("\t*** method name = %s\n", getName()); printf("\t*** number of levels = %d\n", numLevels_); printf("\t*** coarsen scheme = %d\n", coarsenScheme_); printf("\t*** nodal degree of freedom = %d\n", nodeDofs_); printf("\t*** null space dimension = %d\n", nullspaceDim_); printf("\t*** Smooth vectors = %d\n", numSmoothVec_); printf("\t*** Smooth vector steps = %d\n", numSmoothVecSteps_); printf("\t*** strength threshold = %e\n", threshold_); printf("\t*** Prolongator factor = %e\n", Pweight_); printf("\t*** S Prolongator level = %d\n", SPLevel_); printf("\t*** drop tolerance for P = %e\n", dropTolForP_); printf("\t*** A-norm scheme = %d\n", calcNormScheme_); printf("\t*** minimum coarse size = %d\n", minCoarseSize_); printf("\t*** pre smoother type = %s\n", preSmoother_); printf("\t*** pre smoother nsweeps = %d\n", preSmootherNum_); printf("\t*** post smoother type = %s\n", postSmoother_); printf("\t*** post smoother nsweeps = %d\n", postSmootherNum_); printf("\t*** coarse solver type = %s\n", coarseSolver_); printf("\t*** coarse solver nsweeps = %d\n", coarseSolverNum_); printf("\t*** calibration size = %d\n", calibrationSize_); printf("\t********************************************************\n"); } return 0; } /* ********************************************************************* * * print AMGSA statistics information * --------------------------------------------------------------------- */ int MLI_Method_AMGSA::printStatistics(MLI *mli) { int mypid, level, globalNRows, totNRows, fineNRows; int maxNnz, minNnz, fineNnz, totNnz, thisNnz, itemp; double maxVal, minVal, dtemp, dthisNnz, dtotNnz, dfineNnz; char paramString[100]; MLI_Matrix *mli_Amat, *mli_Pmat; MPI_Comm comm = getComm(); /* --------------------------------------------------------------- */ /* output header */ /* --------------------------------------------------------------- */ MPI_Comm_rank( comm, &mypid); if ( mypid == 0 ) printf("\t****************** AMGSA Statistics ********************\n"); /* --------------------------------------------------------------- */ /* output processing time */ /* --------------------------------------------------------------- */ if ( mypid == 0 ) { printf("\t*** number of levels = %d\n", currLevel_+1); printf("\t*** total RAP time = %e seconds\n", RAPTime_); printf("\t*** total GenML time = %e seconds\n", totalTime_); printf("\t******************** Amatrix ***************************\n"); printf("\t*level Nrows MaxNnz MinNnz TotalNnz maxValue minValue*\n"); } /* --------------------------------------------------------------- */ /* fine and coarse matrix complexity information */ /* --------------------------------------------------------------- */ totNnz = totNRows = 0; dtotNnz = 0.0; for ( level = 0; level <= currLevel_; level++ ) { mli_Amat = mli->getSystemMatrix( level ); sprintf(paramString, "nrows"); mli_Amat->getMatrixInfo(paramString, globalNRows, dtemp); sprintf(paramString, "maxnnz"); mli_Amat->getMatrixInfo(paramString, maxNnz, dtemp); sprintf(paramString, "minnnz"); mli_Amat->getMatrixInfo(paramString, minNnz, dtemp); sprintf(paramString, "totnnz"); mli_Amat->getMatrixInfo(paramString, thisNnz, dtemp); sprintf(paramString, "maxval"); mli_Amat->getMatrixInfo(paramString, itemp, maxVal); sprintf(paramString, "minval"); mli_Amat->getMatrixInfo(paramString, itemp, minVal); sprintf(paramString, "dtotnnz"); mli_Amat->getMatrixInfo(paramString, itemp, dthisNnz); if ( mypid == 0 ) { if (globalNRows > 25000000) printf("\t*%3d %10d %5d %5d %11.5e %8.3e %8.3e *\n",level, globalNRows, maxNnz, minNnz, dthisNnz, maxVal, minVal); else printf("\t*%3d %10d %5d %5d %11d %8.3e %8.3e *\n",level, globalNRows, maxNnz, minNnz, thisNnz, maxVal, minVal); } if ( level == 0 ) { fineNnz = thisNnz; dfineNnz = dthisNnz; } totNnz += thisNnz; dtotNnz += dthisNnz; if ( level == 0 ) fineNRows = globalNRows; totNRows += globalNRows; } /* --------------------------------------------------------------- */ /* prolongation operator complexity information */ /* --------------------------------------------------------------- */ if ( mypid == 0 ) { printf("\t******************** Pmatrix ***************************\n"); printf("\t*level Nrows MaxNnz MinNnz TotalNnz maxValue minValue*\n"); fflush(stdout); } for ( level = 1; level <= currLevel_; level++ ) { mli_Pmat = mli->getProlongation( level ); sprintf(paramString, "nrows"); mli_Pmat->getMatrixInfo(paramString, globalNRows, dtemp); sprintf(paramString, "maxnnz"); mli_Pmat->getMatrixInfo(paramString, maxNnz, dtemp); sprintf(paramString, "minnnz"); mli_Pmat->getMatrixInfo(paramString, minNnz, dtemp); sprintf(paramString, "totnnz"); mli_Pmat->getMatrixInfo(paramString, thisNnz, dtemp); sprintf(paramString, "maxval"); mli_Pmat->getMatrixInfo(paramString, itemp, maxVal); sprintf(paramString, "minval"); mli_Pmat->getMatrixInfo(paramString, itemp, minVal); if ( mypid == 0 ) { printf("\t*%3d %10d %5d %5d %11d %8.3e %8.3e *\n",level, globalNRows, maxNnz, minNnz, thisNnz, maxVal, minVal); } } /* --------------------------------------------------------------- */ /* other complexity information */ /* --------------------------------------------------------------- */ if ( mypid == 0 ) { printf("\t********************************************************\n"); if ( fineNnz > 1000000000 ) dtemp = dtotNnz / dfineNnz; else dtemp = dtotNnz / (double) fineNnz; printf("\t*** Amat complexity = %e\n", dtemp); dtemp = (double) totNRows / (double) fineNRows; printf("\t*** grid complexity = %e\n", dtemp); printf("\t********************************************************\n"); fflush(stdout); } return 0; } /* ********************************************************************* * * get the null space * --------------------------------------------------------------------- */ int MLI_Method_AMGSA::getNullSpace(int &nDOF,int &ndim,double *&nullvec, int &leng) { nDOF = currNodeDofs_; ndim = nullspaceDim_; nullvec = nullspaceVec_; leng = nullspaceLen_; return 0; } /* ********************************************************************* * * clone another object * --------------------------------------------------------------------- */ int MLI_Method_AMGSA::copy( MLI_Method *new_obj ) { MLI_Method_AMGSA *new_amgsa; if ( ! strcmp(new_obj->getName(), "AMGSA" ) ) { new_amgsa = (MLI_Method_AMGSA *) new_obj; new_amgsa->maxLevels_ = maxLevels_; new_amgsa->setOutputLevel( outputLevel_ ); new_amgsa->setNumLevels( numLevels_ ); new_amgsa->setSmoother( MLI_SMOOTHER_PRE, preSmoother_, preSmootherNum_, preSmootherWgt_ ); new_amgsa->setSmoother( MLI_SMOOTHER_POST, postSmoother_, postSmootherNum_, postSmootherWgt_ ); new_amgsa->setCoarseSolver(coarseSolver_,coarseSolverNum_, coarseSolverWgt_ ); new_amgsa->setCoarsenScheme( coarsenScheme_ ); new_amgsa->setMinCoarseSize( minCoarseSize_ ); if ( calcNormScheme_ ) new_amgsa->setCalcSpectralNorm(); new_amgsa->setPweight( Pweight_ ); new_amgsa->setSPLevel( SPLevel_ ); new_amgsa->setNullSpace(nodeDofs_,nullspaceDim_,nullspaceVec_, nullspaceLen_); new_amgsa->setSmoothVec( numSmoothVec_ ); new_amgsa->setSmoothVecSteps( numSmoothVecSteps_ ); new_amgsa->setStrengthThreshold( threshold_ ); } else { printf("MLI_Method_AMGSA::copy ERROR - incoming object not AMGSA.\n"); exit(1); } return 0; } /* ********************************************************************* * * LOBPCG subroutine calls * ********************************************************************* */ #ifdef HAVE_LOBPCG #ifdef __cplusplus extern "C" { #endif #include "lobpcg.h" #include "IJ_mv.h" #include "_hypre_parcsr_mv.h" #include "seq_mv.h" #include "_hypre_parcsr_ls.h" HYPRE_Solver lobHYPRESolver; HYPRE_ParCSRMatrix lobHYPREA; int Funct_Solve(HYPRE_ParVector b,HYPRE_ParVector x) { int ierr=0; ierr=HYPRE_ParCSRPCGSolve(lobHYPRESolver,lobHYPREA,b,x); hypre_assert(ierr); return 0; } int Func_Matvec(HYPRE_ParVector x,HYPRE_ParVector y) { int ierr=0; ierr=HYPRE_ParCSRMatrixMatvec(1.0,lobHYPREA,x,0.0,y); hypre_assert(ierr); return 0; } #ifdef __cplusplus } #endif #endif /* ********************************************************************* * * relax null spaces * --------------------------------------------------------------------- */ int MLI_Method_AMGSA::relaxNullSpaces(MLI_Matrix *mli_Amat) { #ifdef HAVE_LOBPCG int mypid, *partitioning, startRow, endRow, localNRows; int iV, i, offset, *cols; double *eigval, *uData; MPI_Comm comm; HYPRE_IJVector tempIJ; hypre_ParVector **lobVecs = new hypre_ParVector*[nullspaceDim_]; hypre_ParCSRMatrix *hypreA; HYPRE_Solver HYPrecon=NULL; HYPRE_LobpcgData lobpcgdata; int (*FuncT)(HYPRE_ParVector x,HYPRE_ParVector y); comm = getComm(); MPI_Comm_rank( comm, &mypid ); hypreA = (hypre_ParCSRMatrix *) mli_Amat->getMatrix(); HYPRE_ParCSRMatrixGetRowPartitioning((HYPRE_ParCSRMatrix) hypreA, &partitioning ); startRow = partitioning[mypid]; endRow = partitioning[mypid+1] - 1; localNRows = endRow - startRow + 1; cols = new int[localNRows]; for ( i = startRow; i <= endRow; i++ ) cols[i] = startRow + i; for ( iV = 0; iV < nullspaceDim_; iV++ ) { HYPRE_IJVectorCreate(comm, startRow, endRow, &tempIJ); HYPRE_IJVectorSetObjectType(tempIJ, HYPRE_PARCSR); HYPRE_IJVectorInitialize(tempIJ); HYPRE_IJVectorAssemble(tempIJ); offset = nullspaceLen_ * iV ; HYPRE_IJVectorSetValues(tempIJ, localNRows, (const int *) cols, (const double *) &(nullspaceVec_[offset])); HYPRE_IJVectorGetObject(tempIJ, (void **) &(lobVecs[iV])); //HYPRE_ParVectorSetRandomValues( (HYPRE_ParVector) lobVecs[iV], 9001*iV*7901 ); HYPRE_IJVectorSetObjectType(tempIJ, -1); HYPRE_IJVectorDestroy(tempIJ); } delete [] cols; free(partitioning); printf("LOBPCG Solve\n"); HYPRE_LobpcgCreate(&lobpcgdata); HYPRE_LobpcgSetVerbose(lobpcgdata); HYPRE_LobpcgSetBlocksize(lobpcgdata, nullspaceDim_); FuncT = Funct_Solve; HYPRE_LobpcgSetSolverFunction(lobpcgdata,FuncT); HYPRE_LobpcgSetup(lobpcgdata); lobHYPREA = (HYPRE_ParCSRMatrix) hypreA; HYPRE_ParCSRPCGCreate(comm, &lobHYPRESolver); HYPRE_ParCSRPCGSetMaxIter(lobHYPRESolver, 10); HYPRE_ParCSRPCGSetTol(lobHYPRESolver, 1.0e-1); HYPRE_ParCSRPCGSetup(lobHYPRESolver, lobHYPREA, (HYPRE_ParVector) lobVecs[0], (HYPRE_ParVector) lobVecs[1]); HYPRE_ParCSRPCGSetPrecond(lobHYPRESolver, HYPRE_ParCSRDiagScale, HYPRE_ParCSRDiagScaleSetup, HYPrecon); HYPRE_LobpcgSetTolerance(lobpcgdata, 1.0e-1); HYPRE_LobpcgSolve(lobpcgdata,Func_Matvec,(HYPRE_ParVector*)lobVecs,&eigval); for ( iV = 0; iV < nullspaceDim_; iV++ ) { uData = hypre_VectorData( hypre_ParVectorLocalVector((hypre_ParVector *)lobVecs[iV])); offset = nullspaceLen_ * iV; for ( i = 0; i < nullspaceLen_; i++ ) nullspaceVec_[offset+i] = uData[i]; hypre_ParVectorDestroy(lobVecs[iV]); } HYPRE_LobpcgDestroy(lobpcgdata); #endif return 0; } hypre-2.33.0/src/FEI_mv/femli/mli_method_amgsa.h000066400000000000000000000162111477326011500213670ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * Header info for the smoothed aggregation data structure * *****************************************************************************/ #ifndef __MLIMETHODAMGSAH__ #define __MLIMETHODAMGSAH__ #include "_hypre_utilities.h" #include "_hypre_parcsr_mv.h" #include "mli.h" #include "mli_matrix.h" #include "mli_method.h" #define MLI_METHOD_AMGSA_LOCAL 0 #define MLI_METHOD_AMGSA_HYBRID 1 /* ********************************************************************* * * internal data structure used for domain decomposition * --------------------------------------------------------------------- */ typedef struct MLI_AMGSA_DD_Struct { int nSends; int nRecvs; int *sendLengs; int *recvLengs; int *sendProcs; int *recvProcs; int *sendMap; int nSendMap; int NNodes; int *ANodeEqnList; int *SNodeEqnList; int dofPerNode; } MLI_AMGSA_DD; /* *********************************************************************** * definition of the aggregation based AMG data structure * ----------------------------------------------------------------------*/ class MLI_Method_AMGSA : public MLI_Method { int maxLevels_; /* the finest level is 0 */ int numLevels_; /* number of levels requested */ int currLevel_; /* current level being processed */ int outputLevel_; /* for diagnostics */ int scalar_; /* aggregate in scalar manner */ int nodeDofs_; /* equation block size (fixed) */ int currNodeDofs_ ; /* current block size (this stage) */ double threshold_; /* for creating aggregation graph */ int nullspaceDim_; /* null space information (changes */ int nullspaceLen_; /* length of nullspace in each dim */ double *nullspaceVec_; /* as curr_level) */ int numSmoothVec_; /* if nonzero, use smooth vectors */ int numSmoothVecSteps_; /* steps for generating smooth vecs */ double Pweight_; /* weight for prolongator smoother */ int SPLevel_; /* start level for P smoother */ double dropTolForP_ ; /* tolerance for sparsifying P */ int *saCounts_; /* store aggregation information at */ int **saData_; /* each level */ int **saLabels_; /* labels for aggregation */ int **saDataAux_; /* for subdomain aggregates */ double *spectralNorms_; /* computed matrix norms */ int calcNormScheme_; /* method to estimate matrix norm */ int minAggrSize_; /* tell when to stop aggregation */ int minCoarseSize_; /* tell when to stop aggregation */ int coarsenScheme_; /* different aggregation schemes */ char preSmoother_[20]; /* denote which pre-smoother to use */ char postSmoother_[20]; /* denote which postsmoother to use */ int preSmootherNum_; /* number of pre-smoother sweeps */ int postSmootherNum_; /* number of postsmoother sweeps */ double *preSmootherWgt_; /* weight used in pre-smoother */ double *postSmootherWgt_; /* weight used in postsmoother */ int smootherPrintRNorm_; /* tell smoother to print rnorm */ int smootherFindOmega_; /* tell smoother to find good omega */ char coarseSolver_[20]; /* denote which coarse solver to use*/ int coarseSolverNum_; /* number of coarse solver sweeps */ double *coarseSolverWgt_; /* weight used in coarse solver */ int calibrationSize_; /* for calibration AMG method */ int symmetric_; /* choose between symm/nonsymm */ int useSAMGeFlag_; /* element based method */ int useSAMGDDFlag_; /* domain decomposition (NN) method */ double RAPTime_; double totalTime_; int ARPACKSuperLUExists_; MLI_AMGSA_DD *ddObj_; char paramFile_[100]; int printToFile_; double arpackTol_; public : MLI_Method_AMGSA(MPI_Comm); ~MLI_Method_AMGSA(); int setup(MLI *); int setParams(char *, int, char *argv[]); int getParams(char *, int *, char *argv[]); int setOutputLevel(int); int setNumLevels(int); int setSmoother(int, char *, int, double *); int setCoarseSolver(char *, int, double *); int setCoarsenScheme(int); int setMinAggregateSize(int); int setMinCoarseSize(int); int setStrengthThreshold(double); int setSmoothVec(int); int setSmoothVecSteps(int); int setPweight(double); int setSPLevel(int); int setCalcSpectralNorm(); int setAggregateInfo(int, int, int, int *); int setNullSpace(int, int, double *, int); int resetNullSpaceComponents(int, int, int *); int adjustNullSpace(double *); int setNodalCoordinates(int, int, int, double *, int, double *); int setCalibrationSize(int); int setupCalibration(MLI *); int setupFEDataBasedNullSpaces(MLI *); int setupFEDataBasedAggregates(MLI *); int setupFEDataBasedSuperLUSmoother(MLI *, int); int setupSFEIBasedNullSpaces(MLI *); int setupSFEIBasedAggregates(MLI *); int setupExtendedDomainDecomp(MLI *); int setupExtendedDomainDecomp2(MLI *); int setupSFEIBasedSuperLUSmoother(MLI *, int); int print(); int printStatistics(MLI *); int getNullSpace(int &, int &, double *&, int &); int copy(MLI_Method *); int relaxNullSpaces(MLI_Matrix *); private : double genP( MLI_Matrix *, MLI_Matrix **, int, int * ); double genPGlobal(hypre_ParCSRMatrix *, MLI_Matrix **, int, int *); int formSmoothVec(MLI_Matrix *); int formSmoothVecLanczos(MLI_Matrix *); int smoothTwice(MLI_Matrix *mli_Amat); int formLocalGraph( hypre_ParCSRMatrix *, hypre_ParCSRMatrix **, int *); int formGlobalGraph(hypre_ParCSRMatrix *, hypre_ParCSRMatrix **); int coarsenLocal( hypre_ParCSRMatrix *, int *, int **); int coarsenGlobal(hypre_ParCSRMatrix *, int *, int **); double genP_DD(MLI_Matrix *, MLI_Matrix **, int **, int **); double genP_Selective(MLI_Matrix *, MLI_Matrix **, int, int *); int coarsenGraded(hypre_ParCSRMatrix *graph, int *, int **, int **); int coarsenSelective(hypre_ParCSRMatrix *graph, int *, int **, int *); double genP_AExt(MLI_Matrix *, MLI_Matrix **, int); int coarsenAExt(hypre_ParCSRMatrix *graph, int *, int **, int); }; #endif hypre-2.33.0/src/FEI_mv/femli/mli_olapdd.c000066400000000000000000000242221477326011500201760ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "_hypre_parcsr_mv.h" extern int MLI_Smoother_Apply_Schwarz(void *smoother_obj,hypre_ParCSRMatrix *A, hypre_ParVector *f,hypre_ParVector *u); /****************************************************************************** * Schwarz relaxation scheme *****************************************************************************/ typedef struct MLI_Smoother_Schwarz_Struct { hypre_ParCSRMatrix *Amat; ParaSails *ps; int factorized; } MLI_Smoother_Schwarz; /*-------------------------------------------------------------------------- * MLI_Smoother_Create_Schwarz *--------------------------------------------------------------------------*/ int MLI_Smoother_Create_Schwarz(void **smoother_obj) { MLI_Smoother_Schwarz *smoother; smoother = hypre_CTAlloc( MLI_Smoother_Schwarz, 1 , HYPRE_MEMORY_HOST); if ( smoother == NULL ) { (*smoother_obj) = NULL; return 1; } smoother->Amat = NULL; } /*-------------------------------------------------------------------------- * MLI_Smoother_Destroy_Schwarz *--------------------------------------------------------------------------*/ int MLI_Smoother_Destroy_Schwarz(void *smoother_obj) { MLI_Smoother_Schwarz *smoother; smoother = (MLI_Smoother_Schwarz *) smoother_obj; if ( smoother != NULL ) hypre_TFree( smoother , HYPRE_MEMORY_HOST); return 0; } /*-------------------------------------------------------------------------- * MLI_Smoother_Setup_Schwarz *--------------------------------------------------------------------------*/ int MLI_Smoother_Setup_Schwarz(void *smoother_obj, int (**smoother_func)(void *smoother_obj, hypre_ParCSRMatrix *A,hypre_ParVector *f, hypre_ParVector *u), hypre_ParCSRMatrix *A, { int *partition, mypid, start_row, end_row; int row, row_length, *col_indices; double *col_values; Matrix *mat; ParaSails *ps; MLI_Smoother_ParaSails *smoother; MPI_Comm comm; /*----------------------------------------------------------------- * fetch machine and matrix parameters *-----------------------------------------------------------------*/ comm = hypre_ParCSRMatrixComm(A); MPI_Comm_rank(comm,&mypid); HYPRE_ParCSRMatrixGetRowPartitioning((HYPRE_ParCSRMatrix) A, &partition); start_row = partition[mypid]; end_row = partition[mypid+1] - 1; /*----------------------------------------------------------------- * construct a ParaSails matrix *-----------------------------------------------------------------*/ mat = MatrixCreate(comm, start_row, end_row); for (row = start_row; row <= end_row; row++) { hypre_ParCSRMatrixGetRow(A, row, &row_length, &col_indices, &col_values); MatrixSetRow(mat, row, row_length, col_indices, col_values); hypre_ParCSRMatrixRestoreRow(A,row,&row_length,&col_indices,&col_values); } MatrixComplete(mat); /*----------------------------------------------------------------- * construct a ParaSails smoother object *-----------------------------------------------------------------*/ smoother = hypre_CTAlloc( MLI_Smoother_ParaSails, 1 , HYPRE_MEMORY_HOST); if ( smoother == NULL ) { (*smoother_obj) = NULL; return 1; } ps = ParaSailsCreate(comm, start_row, end_row, parasails_factorized); ps->loadbal_beta = parasails_loadbal; ParaSailsSetupPattern(ps, mat, thresh, num_levels); ParaSailsStatsPattern(ps, mat); ParaSailsSetupValues(ps, mat, filter); ParaSailsStatsValues(ps, mat); smoother->factorized = parasails_factorized; smoother->ps = ps; smoother->Amat = A; /*----------------------------------------------------------------- * clean up and return object and function *-----------------------------------------------------------------*/ MatrixDestroy(mat); (*smoother_obj) = (void *) smoother; if ( trans ) (*smoother_func) = MLI_Smoother_Apply_ParaSailsTrans; else (*smoother_func) = MLI_Smoother_Apply_ParaSails; return 0; } /*-------------------------------------------------------------------------- * MLI_Smoother_Apply_ParaSails *--------------------------------------------------------------------------*/ int MLI_Smoother_Apply_ParaSails(void *smoother_obj, hypre_ParCSRMatrix *A, hypre_ParVector *f, hypre_ParVector *u) { hypre_CSRMatrix *A_diag; hypre_ParVector *Vtemp; hypre_Vector *u_local, *Vtemp_local; double *u_data, *Vtemp_data; int i, n, relax_error = 0, global_size; int num_procs, *partition1, *partition2; int parasails_factorized; double *tmp_data; MPI_Comm comm; MLI_Smoother_ParaSails *smoother; ParaSails *ps; /*----------------------------------------------------------------- * fetch machine and smoother parameters *-----------------------------------------------------------------*/ MPI_Comm_size(comm,&num_procs); smoother = (MLI_Smoother_ParaSails *) smoother_obj; A = smoother->Amat; comm = hypre_ParCSRMatrixComm(A); A_diag = hypre_ParCSRMatrixDiag(A); n = hypre_CSRMatrixNumRows(A_diag); u_local = hypre_ParVectorLocalVector(u); u_data = hypre_VectorData(u_local); /*----------------------------------------------------------------- * create temporary vector *-----------------------------------------------------------------*/ global_size = hypre_ParVectorGlobalSize(f); partition1 = hypre_ParVectorPartitioning(f); partition2 = hypre_CTAlloc( int, num_procs+1 , HYPRE_MEMORY_HOST); for ( i = 0; i <= num_procs; i++ ) partition2[i] = partition1[i]; Vtemp = hypre_ParVectorCreate(comm, global_size, partition2); Vtemp_local = hypre_ParVectorLocalVector(Vtemp); Vtemp_data = hypre_VectorData(Vtemp_local); /*----------------------------------------------------------------- * perform smoothing *-----------------------------------------------------------------*/ hypre_ParVectorCopy(f, Vtemp); hypre_ParCSRMatrixMatvec(-1.0, A, u, 1.0, Vtemp); tmp_data = hypre_CTAlloc( double, n , HYPRE_MEMORY_HOST); parasails_factorized = smoother->factorized; if (!parasails_factorized) { MatrixMatvec(ps->M, Vtemp_data, tmp_data); for (i = 0; i < n; i++) u_data[i] += tmp_data[i]; } else { MatrixMatvec(ps->M, Vtemp_data, tmp_data); MatrixMatvecTrans(ps->M, tmp_data, tmp_data); for (i = 0; i < n; i++) u_data[i] += tmp_data[i]; } /*----------------------------------------------------------------- * clean up *-----------------------------------------------------------------*/ hypre_TFree( tmp_data , HYPRE_MEMORY_HOST); return(relax_error); } /*-------------------------------------------------------------------------- * MLI_Smoother_Apply_ParaSailsTrans *--------------------------------------------------------------------------*/ int MLI_Smoother_Apply_ParaSailsTrans(void *smoother_obj,hypre_ParCSRMatrix *A, hypre_ParVector *f,hypre_ParVector *u) { hypre_CSRMatrix *A_diag; hypre_ParVector *Vtemp; hypre_Vector *u_local, *Vtemp_local; double *u_data, *Vtemp_data; int i, n, relax_error = 0, global_size; int num_procs, *partition1, *partition2; int parasails_factorized; double *tmp_data; MPI_Comm comm; MLI_Smoother_ParaSails *smoother; ParaSails *ps; /*----------------------------------------------------------------- * fetch machine and smoother parameters *-----------------------------------------------------------------*/ MPI_Comm_size(comm,&num_procs); smoother = (MLI_Smoother_ParaSails *) smoother_obj; A = smoother->Amat; comm = hypre_ParCSRMatrixComm(A); A_diag = hypre_ParCSRMatrixDiag(A); n = hypre_CSRMatrixNumRows(A_diag); u_local = hypre_ParVectorLocalVector(u); u_data = hypre_VectorData(u_local); /*----------------------------------------------------------------- * create temporary vector *-----------------------------------------------------------------*/ global_size = hypre_ParVectorGlobalSize(f); partition1 = hypre_ParVectorPartitioning(f); partition2 = hypre_CTAlloc( int, num_procs+1 , HYPRE_MEMORY_HOST); for ( i = 0; i <= num_procs; i++ ) partition2[i] = partition1[i]; Vtemp = hypre_ParVectorCreate(comm, global_size, partition2); Vtemp_local = hypre_ParVectorLocalVector(Vtemp); Vtemp_data = hypre_VectorData(Vtemp_local); /*----------------------------------------------------------------- * perform smoothing *-----------------------------------------------------------------*/ hypre_ParVectorCopy(f, Vtemp); hypre_ParCSRMatrixMatvec(-1.0, A, u, 1.0, Vtemp); tmp_data = hypre_CTAlloc( double, n , HYPRE_MEMORY_HOST); parasails_factorized = smoother->factorized; if (!parasails_factorized) { MatrixMatvecTrans(ps->M, Vtemp_data, tmp_data); for (i = 0; i < n; i++) u_data[i] += tmp_data[i]; } else { MatrixMatvec(ps->M, Vtemp_data, tmp_data); MatrixMatvecTrans(ps->M, tmp_data, tmp_data); for (i = 0; i < n; i++) u_data[i] += tmp_data[i]; } /*----------------------------------------------------------------- * clean up *-----------------------------------------------------------------*/ hypre_TFree( tmp_data , HYPRE_MEMORY_HOST); return(relax_error); } #endif hypre-2.33.0/src/FEI_mv/femli/mli_oneLevel.cxx000066400000000000000000000266031477326011500210710ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * functions for each grid level * *****************************************************************************/ #include #include "_hypre_utilities.h" #include "mli_utils.h" #include "mli_oneLevel.h" /***************************************************************************** * constructor *--------------------------------------------------------------------------*/ MLI_OneLevel::MLI_OneLevel( MLI *mli ) { #ifdef MLI_DEBUG_DETAILED printf("MLI_OneLevel::MLI_OneLevel\n"); #endif mliObject_ = mli; levelNum_ = -1; fedata_ = NULL; sfei_ = NULL; nodeEqnMap_ = NULL; Amat_ = NULL; Rmat_ = NULL; Pmat_ = NULL; vecSol_ = NULL; vecRhs_ = NULL; vecRes_ = NULL; preSmoother_ = NULL; postSmoother_ = NULL; coarseSolver_ = NULL; nextLevel_ = NULL; prevLevel_ = NULL; ncycles_ = 1; } /***************************************************************************** * destructor *--------------------------------------------------------------------------*/ MLI_OneLevel::~MLI_OneLevel() { #ifdef MLI_DEBUG_DETAILED printf("MLI_OneLevel::~MLI_OneLevel\n"); #endif if ( Amat_ != NULL ) delete Amat_; if ( Rmat_ != NULL ) delete Rmat_; if ( Pmat_ != NULL ) delete Pmat_; if ( vecSol_ != NULL ) delete vecSol_; if ( vecRhs_ != NULL ) delete vecRhs_; if ( vecRes_ != NULL ) delete vecRes_; if ( preSmoother_ == postSmoother_ ) postSmoother_ = NULL; if ( preSmoother_ != NULL ) delete preSmoother_; if ( postSmoother_ != NULL ) delete postSmoother_; if ( coarseSolver_ != NULL ) delete coarseSolver_; } /***************************************************************************** * set A matrix *--------------------------------------------------------------------------*/ int MLI_OneLevel::setAmat( MLI_Matrix *A ) { #ifdef MLI_DEBUG_DETAILED printf("MLI_OneLevel::setAmat\n"); #endif if ( Amat_ != NULL ) delete Amat_; Amat_ = A; return 0; } /***************************************************************************** * set R matrix *--------------------------------------------------------------------------*/ int MLI_OneLevel::setRmat( MLI_Matrix *R ) { #ifdef MLI_DEBUG_DETAILED printf("MLI_OneLevel::setRmat at level %d\n", levelNum_); #endif if ( Rmat_ != NULL ) delete Rmat_; Rmat_ = R; return 0; } /***************************************************************************** * set P matrix *--------------------------------------------------------------------------*/ int MLI_OneLevel::setPmat( MLI_Matrix *P ) { #ifdef MLI_DEBUG_DETAILED printf("MLI_OneLevel::setPmat at level %d\n", levelNum_); #endif if ( Pmat_ != NULL ) delete Pmat_; Pmat_ = P; return 0; } /***************************************************************************** * set solution vector *--------------------------------------------------------------------------*/ int MLI_OneLevel::setSolutionVector( MLI_Vector *sol ) { #ifdef MLI_DEBUG_DETAILED printf("MLI_OneLevel::setSolutionVector\n"); #endif if ( vecSol_ != NULL ) delete vecSol_; vecSol_ = sol; return 0; } /***************************************************************************** * set right hand side vector *--------------------------------------------------------------------------*/ int MLI_OneLevel::setRHSVector( MLI_Vector *rhs ) { #ifdef MLI_DEBUG_DETAILED printf("MLI_OneLevel::setRHSVector\n"); #endif if ( vecRhs_ != NULL ) delete vecRhs_; vecRhs_ = rhs; return 0; } /***************************************************************************** * set residual vector *--------------------------------------------------------------------------*/ int MLI_OneLevel::setResidualVector( MLI_Vector *res ) { #ifdef MLI_DEBUG_DETAILED printf("MLI_OneLevel::setResidualVector\n"); #endif if ( vecRes_ != NULL ) delete vecRes_; vecRes_ = res; return 0; } /***************************************************************************** * set the smoother *--------------------------------------------------------------------------*/ int MLI_OneLevel::setSmoother( int pre_post, MLI_Solver *smoother ) { #ifdef MLI_DEBUG_DETAILED printf("MLI_OneLevel::setSmoother, pre_post = %d\n", pre_post); #endif if ( pre_post == MLI_SMOOTHER_PRE ) preSmoother_ = smoother; else if ( pre_post == MLI_SMOOTHER_POST ) postSmoother_ = smoother; else if ( pre_post == MLI_SMOOTHER_BOTH ) { preSmoother_ = smoother; postSmoother_ = smoother; } return 0; } /***************************************************************************** * set the coarse solver *--------------------------------------------------------------------------*/ int MLI_OneLevel::setCoarseSolve( MLI_Solver *solver ) { #ifdef MLI_DEBUG_DETAILED printf("MLI_OneLevel::setCoarseSolve\n"); #endif if ( coarseSolver_ != NULL ) delete coarseSolver_; coarseSolver_ = solver; return 0; } /***************************************************************************** * set finite element information object *--------------------------------------------------------------------------*/ int MLI_OneLevel::setFEData( MLI_FEData *data, MLI_Mapper *map ) { #ifdef MLI_DEBUG_DETAILED printf("MLI_OneLevel::setFEData\n"); #endif fedata_ = data; if ( nodeEqnMap_ != NULL ) delete nodeEqnMap_; nodeEqnMap_ = map; return 0; } /***************************************************************************** * set finite element information object *--------------------------------------------------------------------------*/ int MLI_OneLevel::setSFEI( MLI_SFEI *data ) { #ifdef MLI_DEBUG_DETAILED printf("MLI_OneLevel::setSFEI\n"); #endif sfei_ = data; return 0; } /***************************************************************************** * setup *--------------------------------------------------------------------------*/ int MLI_OneLevel::setup() { #ifdef MLI_DEBUG_DETAILED printf("MLI_OneLevel::setup at level %d\n", levelNum_); #endif if ( Amat_ == NULL ) { printf("MLI_OneLevel::setup at level %d\n", levelNum_); exit(1); } if ( levelNum_ != 0 && Pmat_ == NULL ) { printf("MLI_OneLevel::setup at level %d - no Pmat\n", levelNum_); exit(1); } if ( !strcmp(Amat_->getName(),"HYPRE_ParCSR") && !strcmp(Amat_->getName(),"HYPRE_ParCSRT")) { printf("MLI_OneLevel::setup ERROR : Amat not HYPRE_ParCSR.\n"); exit(1); } if ( vecRes_ != NULL ) delete vecRes_; vecRes_ = Amat_->createVector(); if ( levelNum_ > 0 ) { if ( levelNum_ > 0 && vecRhs_ != NULL ) delete vecRhs_; if ( levelNum_ > 0 && vecSol_ != NULL ) delete vecSol_; vecSol_ = vecRes_->clone(); vecRhs_ = vecRes_->clone(); } return 0; } /***************************************************************************** * perform one cycle *--------------------------------------------------------------------------*/ int MLI_OneLevel::solve1Cycle() { int i; MLI_Vector *sol, *rhs, *res; #ifdef MLI_DEBUG_DETAILED printf("MLI_OneLevel::solve1Cycle\n"); #endif sol = vecSol_; rhs = vecRhs_; res = vecRes_; if ( Rmat_ == NULL ) { /* ---------------------------------------------------------------- */ /* coarsest level - perform coarse solve */ /* ---------------------------------------------------------------- */ if ( coarseSolver_ != NULL ) { #ifdef MLI_DEBUG_DETAILED printf("MLI_OneLevel::solve1Cycle - coarse solve at level %d\n", levelNum_); #endif coarseSolver_->solve( rhs, sol ); } else { if (preSmoother_ != NULL) preSmoother_->solve(rhs, sol); else if (postSmoother_ != NULL) postSmoother_->solve(rhs, sol); else rhs->copy(sol); } return 0; } else { for ( i = 0; i < ncycles_; i++ ) { /* ------------------------------------------------------------- */ /* smooth and compute residual */ /* ------------------------------------------------------------- */ if ( preSmoother_ != NULL ) { #ifdef MLI_DEBUG_DETAILED printf("MLI_OneLevel::solve1Cycle - presmoothing at level %d\n", levelNum_); #endif preSmoother_->solve( rhs, sol ); } Amat_->apply( -1.0, sol, 1.0, rhs, res ); /* ------------------------------------------------------------- */ /* transfer to coarse level */ /* ------------------------------------------------------------- */ #ifdef MLI_DEBUG_DETAILED printf("MLI_OneLevel::solve1Cycle - restriction to level %d\n", levelNum_+1); #endif Rmat_->apply(1.0, res, 0.0, NULL, nextLevel_->vecRhs_); nextLevel_->vecSol_->setConstantValue(0.0e0); nextLevel_->solve1Cycle(); /* ------------------------------------------------------------- */ /* transfer solution back to fine level */ /* ------------------------------------------------------------- */ #ifdef MLI_DEBUG_DETAILED printf("MLI_OneLevel::solve1Cycle - interpolate to level %d\n", levelNum_); #endif nextLevel_->Pmat_->apply(1.0, nextLevel_->vecSol_, 1.0, sol, sol); /* ------------------------------------------------------------- */ /* postsmoothing */ /* ------------------------------------------------------------- */ if ( postSmoother_ != NULL ) { postSmoother_->solve( rhs, sol ); #ifdef MLI_DEBUG_DETAILED printf("MLI_OneLevel::solve1Cycle - postsmoothing at level %d\n", levelNum_); #endif } } } return 0; } /***************************************************************************** * wipe out Amatrix for this level (but not destroy it) *--------------------------------------------------------------------------*/ int MLI_OneLevel::resetAmat() { #ifdef MLI_DEBUG_DETAILED printf("MLI_OneLevel::resetAmat\n"); #endif Amat_ = NULL; return 0; } /***************************************************************************** * wipe out solution vector for this level (but not destroy it) *--------------------------------------------------------------------------*/ int MLI_OneLevel::resetSolutionVector() { #ifdef MLI_DEBUG_DETAILED printf("MLI_OneLevel::resetSolutionVector\n"); #endif vecSol_ = NULL; return 0; } /***************************************************************************** * wipe out rhs vector for this level (but not destroy it) *--------------------------------------------------------------------------*/ int MLI_OneLevel::resetRHSVector() { #ifdef MLI_DEBUG_DETAILED printf("MLI_OneLevel::resetRHSVector\n"); #endif vecRhs_ = NULL; return 0; } hypre-2.33.0/src/FEI_mv/femli/mli_oneLevel.h000066400000000000000000000073601477326011500205150ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * Header info each MLI level *****************************************************************************/ #ifndef __MLIONELEVELH__ #define __MLIONELEVELH__ #include "_hypre_utilities.h" #include "mli.h" class MLI; /*-------------------------------------------------------------------------- * MLI data structure declaration *--------------------------------------------------------------------------*/ class MLI_OneLevel { MLI *mliObject_; /* pointer to the top level structure */ MLI_FEData *fedata_; /* pointer to finite element data */ MLI_SFEI *sfei_; /* pointer to finite element data */ MLI_Mapper *nodeEqnMap_; /* pointer to node to equation map */ MLI_Matrix *Amat_; /* pointer to Amat */ MLI_Matrix *Rmat_; /* pointer to Rmat */ MLI_Matrix *Pmat_; /* pointer to Pmat */ MLI_Solver *preSmoother_; /* pointer to pre-smoother */ MLI_Solver *postSmoother_; /* pointer to postsmoother */ MLI_Solver *coarseSolver_; /* pointer to coarse grid solver */ MLI_OneLevel *nextLevel_; /* point to next coarse level */ MLI_OneLevel *prevLevel_; /* point to next coarse level */ MLI_Vector *vecSol_; /* pointer to solution vector */ MLI_Vector *vecRhs_; /* pointer to right hand side vector */ MLI_Vector *vecRes_; /* pointer to residual vector */ int ncycles_; /* V, W, or others */ int levelNum_; /* level number */ public : MLI_OneLevel( MLI *mli ); ~MLI_OneLevel(); int setCycles( int cycles ) { ncycles_ = cycles; return 0; } int setLevelNum( int num ) { levelNum_ = num; return 0; } int setAmat( MLI_Matrix *A ); int setRmat( MLI_Matrix *R ); int setPmat( MLI_Matrix *P ); int setSolutionVector( MLI_Vector *sol ); int setRHSVector( MLI_Vector *rhs ); int setResidualVector( MLI_Vector *res ); int setSmoother( int pre_post, MLI_Solver *solver ); int setCoarseSolve( MLI_Solver *solver ); int setFEData( MLI_FEData *data, MLI_Mapper *map ); int setSFEI( MLI_SFEI *data ); int setNextLevel( MLI_OneLevel *next ) {nextLevel_ = next; return 0;} int setPrevLevel( MLI_OneLevel *prev ) {prevLevel_ = prev; return 0;} int setup(); int solve1Cycle(); int resetAmat(); int resetSolutionVector(); int resetRHSVector(); MLI_Matrix *getAmat() { return Amat_; } MLI_Matrix *getPmat() { return Pmat_; } MLI_Matrix *getRmat() { return Rmat_; } MLI_Solver *getPreSmoother() { return preSmoother_; } MLI_Solver *getPostSmoother() { return postSmoother_; } MLI_Vector *getRHSVector() { return vecRhs_; } MLI_Vector *getResidualVector() { return vecRes_; } MLI_Vector *getSolutionVector() { return vecSol_; } MLI_FEData *getFEData() { return fedata_; } MLI_SFEI *getSFEI() { return sfei_; } MLI_Mapper *getNodeEqnMap() { return nodeEqnMap_; } }; #endif hypre-2.33.0/src/FEI_mv/femli/mli_sfei.cxx000066400000000000000000000224061477326011500202430ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /************************************************************************** ************************************************************************** * MLI_SFEI Class functions (simplified FEI) ************************************************************************** **************************************************************************/ #include #include #include #include "mli_sfei.h" /************************************************************************** * constructor *-----------------------------------------------------------------------*/ MLI_SFEI::MLI_SFEI(MPI_Comm mpiComm) { mpiComm_ = mpiComm; outputLevel_ = 1; maxElemBlocks_ = 0; nElemBlocks_ = 0; blkNumElems_ = NULL; blkElemNEqns_ = NULL; blkNodeDofs_ = NULL; blkElemEqnLists_ = NULL; blkElemStiffness_ = NULL; // the following variable is added to counter the fact that // the Sandia FEI called addNumElems starting with blkID = 0 // while it called loadElemBlock starting with the actual blkID blkIDBase_ = -1; } //************************************************************************* // destructor //------------------------------------------------------------------------- MLI_SFEI::~MLI_SFEI() { int i, j; if ( blkElemEqnLists_ != NULL ) { for ( i = 0; i < nElemBlocks_; i++ ) { for ( j = 0; j < blkNumElems_[i]; j++ ) if ( blkElemEqnLists_[i][j] != NULL ) delete [] blkElemEqnLists_[i][j]; delete [] blkElemEqnLists_[i]; } delete [] blkElemEqnLists_; } if ( blkElemStiffness_ != NULL ) { for ( i = 0; i < nElemBlocks_; i++ ) { for ( j = 0; j < blkNumElems_[i]; j++ ) if ( blkElemStiffness_[i][j] != NULL ) delete [] blkElemStiffness_[i][j]; delete [] blkElemStiffness_[i]; } delete [] blkElemStiffness_; } if ( blkNumElems_ != NULL ) delete [] blkNumElems_; if ( blkElemNEqns_ != NULL ) delete [] blkElemNEqns_; if ( blkNodeDofs_ != NULL ) delete [] blkNodeDofs_; } //************************************************************************* // set diagnostics output level //------------------------------------------------------------------------- int MLI_SFEI::setOutputLevel(int level) { if ( level < 0 ) { printf("MLI_SFEI::setOutputLevel ERROR - level should be >= 0.\n"); return 0; } outputLevel_ = level; return 1; } //************************************************************************* // free up stiffness matrices because it is not going to be used any more //------------------------------------------------------------------------- int MLI_SFEI::freeStiffnessMatrices() { int i, j; if ( blkElemStiffness_ != NULL ) { for ( i = 0; i < nElemBlocks_; i++ ) { for ( j = 0; j < blkNumElems_[i]; j++ ) if ( blkElemStiffness_[i][j] != NULL ) delete [] blkElemStiffness_[i][j]; delete [] blkElemStiffness_[i]; } delete [] blkElemStiffness_; } blkElemStiffness_ = NULL; blkIDBase_ = -1; return 0; } //************************************************************************* // accumulate number of element information //------------------------------------------------------------------------- int MLI_SFEI::addNumElems(int elemBlk, int nElems, int nNodesPerElem) { int iB, *tempBlkNumElems, *tempBlkElemNEqns, *tempBlkNodeDofs; if ( elemBlk != nElemBlocks_ && elemBlk != (nElemBlocks_-1) ) { printf("MLI_SFEI::addNumElems ERROR : elemBlk %d(%d) invalid\n", elemBlk,nElemBlocks_); return -1; } if ( blkNumElems_ == NULL ) { maxElemBlocks_ = 20; nElemBlocks_ = 0; blkNumElems_ = new int[maxElemBlocks_]; blkElemNEqns_ = new int[maxElemBlocks_]; blkNodeDofs_ = new int[maxElemBlocks_]; for ( iB = 0; iB < maxElemBlocks_; iB++ ) { blkNumElems_[iB] = 0; blkElemNEqns_[iB] = 0; blkNodeDofs_[iB] = 0; } } if ( elemBlk >= nElemBlocks_ ) { if ( nElemBlocks_ >= maxElemBlocks_ ) { tempBlkNumElems = blkNumElems_; tempBlkElemNEqns = blkElemNEqns_; tempBlkNodeDofs = blkNodeDofs_; maxElemBlocks_ += 10; blkNumElems_ = new int[maxElemBlocks_]; blkElemNEqns_ = new int[maxElemBlocks_]; blkNodeDofs_ = new int[maxElemBlocks_]; for ( iB = 0; iB < nElemBlocks_; iB++ ) { blkNumElems_[iB] = tempBlkNumElems[iB]; blkElemNEqns_[iB] = tempBlkElemNEqns[iB]; blkNodeDofs_[iB] = tempBlkNodeDofs[iB]; } } blkNumElems_[elemBlk] = nElems; blkElemNEqns_[elemBlk] = nNodesPerElem; } else if ( elemBlk >= 0 ) blkNumElems_[elemBlk] += nElems; if ( elemBlk == nElemBlocks_ ) nElemBlocks_++; return 0; } //************************************************************************* // initialize the element connectivities //------------------------------------------------------------------------- int MLI_SFEI::loadElemBlock(int blkID, int nElems, const int* elemIDs, const double *const *const *stiff, int nEqnsPerElem, const int *const * eqnIndices) { (void) elemIDs; int iB, iE, iN, iN2, count, currElem, matSize, *nodeList, elemBlk; double *stiffMat; if (blkIDBase_ == -1) blkIDBase_ = blkID; elemBlk = blkID - blkIDBase_; if (nElemBlocks_ <= 0) return 0; if (elemBlk < 0 || elemBlk >= nElemBlocks_) { printf("MLI_SFEI::loadElemBlock ERROR : elemBlk %d invalid\n",elemBlk); return -1; } if (blkElemEqnLists_ == NULL) { for (iB = 0; iB < nElemBlocks_; iB++) { if (blkNumElems_[iB] <= 0) { printf("MLI_SFEI::addNumElems ERROR : some elemBlk has 0 elems\n"); return -1; } } blkElemEqnLists_ = new int**[nElemBlocks_]; blkElemStiffness_ = new double**[nElemBlocks_]; for (iB = 0; iB < nElemBlocks_; iB++) { blkElemEqnLists_[iB] = new int*[blkNumElems_[iB]]; blkElemStiffness_[iB] = new double*[blkNumElems_[iB]]; for (iE = 0; iE < blkNumElems_[iB]; iE++) { blkElemEqnLists_[iB][iE] = NULL; blkElemStiffness_[iB][iE] = NULL; } blkNumElems_[iB] = 0; } } if (nEqnsPerElem != blkElemNEqns_[elemBlk] && blkElemNEqns_[elemBlk] != 0) blkNodeDofs_[elemBlk] = nEqnsPerElem / blkElemNEqns_[elemBlk]; blkElemNEqns_[elemBlk] = nEqnsPerElem; currElem = blkNumElems_[elemBlk]; matSize = nEqnsPerElem * nEqnsPerElem; for (iE = 0; iE < nElems; iE++) { blkElemEqnLists_[elemBlk][currElem] = new int[nEqnsPerElem]; nodeList = blkElemEqnLists_[elemBlk][currElem]; for (iN = 0; iN < nEqnsPerElem; iN++) nodeList[iN] = eqnIndices[iE][iN]; blkElemStiffness_[elemBlk][currElem] = new double[matSize]; stiffMat = blkElemStiffness_[elemBlk][currElem]; count = 0; for (iN = 0; iN < nEqnsPerElem; iN++) for (iN2 = 0; iN2 < nEqnsPerElem; iN2++) stiffMat[count++] = stiff[iE][iN2][iN]; currElem++; } blkNumElems_[elemBlk] = currElem; return 0; } //************************************************************************* // get block number of elements //------------------------------------------------------------------------- int MLI_SFEI::getBlockNumElems(int blkID) { if (blkID < 0 || blkID >= nElemBlocks_) { printf("MLI_SFEI::getBlockNumElems ERROR - invalid blkID.\n"); return -1; } return blkNumElems_[blkID]; } //************************************************************************* // get block number of nodes per element //------------------------------------------------------------------------- int MLI_SFEI::getBlockElemNEqns(int blkID) { if (blkID < 0 || blkID >= nElemBlocks_) { printf("MLI_SFEI::getBlockElemNEqns ERROR - invalid blkID.\n"); return -1; } return blkElemNEqns_[blkID]; } //************************************************************************* // get element block nodelists //------------------------------------------------------------------------- int **MLI_SFEI::getBlockElemEqnLists(int blkID) { if (blkID < 0 || blkID >= nElemBlocks_) { printf("MLI_SFEI::getBlockElemEqnLists ERROR - invalid blkID.\n"); return NULL; } return blkElemEqnLists_[blkID]; } //************************************************************************* // get block element stiffness matrices //------------------------------------------------------------------------- double **MLI_SFEI::getBlockElemStiffness(int blkID) { if (blkID < 0 || blkID >= nElemBlocks_) { printf("MLI_SFEI::getBlockElemStiffness ERROR - invalid blkID.\n"); return NULL; } return blkElemStiffness_[blkID]; } hypre-2.33.0/src/FEI_mv/femli/mli_sfei.h000066400000000000000000000031231477326011500176630ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #ifndef __MLISFEI_H__ #define __MLISFEI_H__ #include "_hypre_utilities.h" #include "mli_febase.h" /****************************************************************************/ /* data structures for Finite element grid information */ /*--------------------------------------------------------------------------*/ class MLI_SFEI : public MLI_FEBase { MPI_Comm mpiComm_; int outputLevel_; int nElemBlocks_; int maxElemBlocks_; int *blkNumElems_; int *blkElemNEqns_; int *blkNodeDofs_; int ***blkElemEqnLists_; double ***blkElemStiffness_; int blkIDBase_; public : MLI_SFEI(MPI_Comm comm); ~MLI_SFEI(); int setOutputLevel(int level); int freeStiffnessMatrices(); int addNumElems(int elemBlk, int nElems, int nNodesPerElem); int loadElemBlock(int elemBlk, int nElems, const int* elemIDs, const double *const *const *stiff, int nEqnsPerElem, const int *const * eqnIndices); int getNumElemBlocks() {return nElemBlocks_;} int getBlockNumElems(int iD); int getBlockElemNEqns(int iD); int **getBlockElemEqnLists(int iD); double **getBlockElemStiffness(int iD); }; #endif hypre-2.33.0/src/FEI_mv/femli/mli_solver.cxx000066400000000000000000000173271477326011500206350ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * functions for the MLI_Solver * *****************************************************************************/ #define habs(x) ((x > 0) ? x : -(x)) /*-------------------------------------------------------------------------- * include files *--------------------------------------------------------------------------*/ #include #include "_hypre_parcsr_mv.h" #include "seq_mv.h" #include "mli_solver.h" #include "mli_solver_jacobi.h" #include "mli_solver_bjacobi.h" #include "mli_solver_gs.h" #include "mli_solver_sgs.h" #include "mli_solver_hsgs.h" #include "mli_solver_bsgs.h" #include "mli_solver_hschwarz.h" #include "mli_solver_parasails.h" #include "mli_solver_mls.h" #include "mli_solver_chebyshev.h" #include "mli_solver_cg.h" #include "mli_solver_gmres.h" #include "mli_solver_superlu.h" #include "mli_solver_seqsuperlu.h" #include "mli_solver_arpacksuperlu.h" #include "mli_solver_kaczmarz.h" #include "mli_solver_mli.h" #include "mli_solver_amg.h" /***************************************************************************** * constructor *--------------------------------------------------------------------------*/ MLI_Solver::MLI_Solver(char *str) { strcpy( solver_name, str ); } /***************************************************************************** * destructor *--------------------------------------------------------------------------*/ MLI_Solver::~MLI_Solver() { } /***************************************************************************** * getName function *--------------------------------------------------------------------------*/ char* MLI_Solver::getName() { return solver_name; } /***************************************************************************** * set parameter function *--------------------------------------------------------------------------*/ int MLI_Solver::setParams(char *paramString,int argc,char **argv) { (void) paramString; (void) argc; (void) argv; return -1; } /***************************************************************************** * get parameter function *--------------------------------------------------------------------------*/ int MLI_Solver::getParams(char *paramString,int *argc,char **argv) { (void) paramString; (void) argc; (void) argv; return -1; } /***************************************************************************** * create a solver from its name *--------------------------------------------------------------------------*/ MLI_Solver *MLI_Solver_CreateFromName( char *str ) { char paramString[100]; MLI_Solver *solver_ptr=NULL; if (!strcmp(str,"Jacobi")) solver_ptr = new MLI_Solver_Jacobi(str); else if (!strcmp(str,"BJacobi")) solver_ptr = new MLI_Solver_BJacobi(str); else if (!strcmp(str,"GS")) solver_ptr = new MLI_Solver_GS(str); else if (!strcmp(str,"SGS")) solver_ptr = new MLI_Solver_SGS(str); else if (!strcmp(str,"HSGS")) solver_ptr = new MLI_Solver_HSGS(str); else if (!strcmp(str,"HSchwarz"))solver_ptr = new MLI_Solver_HSchwarz(str); else if (!strcmp(str,"MCSGS")) { solver_ptr = new MLI_Solver_SGS(str); strcpy( paramString, "setScheme multicolor"); solver_ptr->setParams( paramString, 0, NULL); } else if (!strcmp(str,"BSGS")) solver_ptr = new MLI_Solver_BSGS(str); else if (!strcmp(str,"MCBSGS")) { solver_ptr = new MLI_Solver_BSGS(str); strcpy( paramString, "setScheme multicolor"); solver_ptr->setParams( paramString, 0, NULL); } else if (!strcmp(str,"ParaSails"))solver_ptr = new MLI_Solver_ParaSails(str); else if (!strcmp(str,"MLS")) solver_ptr = new MLI_Solver_MLS(str); else if (!strcmp(str,"Chebyshev"))solver_ptr = new MLI_Solver_Chebyshev(str); else if (!strcmp(str,"CGJacobi")) { solver_ptr = new MLI_Solver_CG(str); strcpy( paramString, "baseMethod Jacobi"); solver_ptr->setParams(paramString, 0, NULL); } else if (!strcmp(str,"CGBJacobi")) { solver_ptr = new MLI_Solver_CG(str); strcpy( paramString, "baseMethod BJacobi"); solver_ptr->setParams(paramString, 0, NULL); } else if (!strcmp(str,"CGSGS")) { solver_ptr = new MLI_Solver_CG(str); strcpy( paramString, "baseMethod SGS"); solver_ptr->setParams(paramString, 0, NULL); } else if (!strcmp(str,"CGBSGS")) { solver_ptr = new MLI_Solver_CG(str); strcpy( paramString, "baseMethod BSGS"); solver_ptr->setParams(paramString, 0, NULL); } else if (!strcmp(str,"CGMLI")) { solver_ptr = new MLI_Solver_CG(str); strcpy( paramString, "baseMethod MLI"); solver_ptr->setParams(paramString, 0, NULL); } else if (!strcmp(str,"CGAMG")) { solver_ptr = new MLI_Solver_CG(str); strcpy( paramString, "baseMethod AMG"); solver_ptr->setParams(paramString, 0, NULL); } else if (!strcmp(str,"CGILU")) { solver_ptr = new MLI_Solver_CG(str); strcpy( paramString, "baseMethod ILU"); solver_ptr->setParams(paramString, 0, NULL); } else if (!strcmp(str,"GMRESJacobi")) { solver_ptr = new MLI_Solver_GMRES(str); strcpy( paramString, "baseMethod Jacobi"); solver_ptr->setParams(paramString, 0, NULL); } else if (!strcmp(str,"GMRESSGS")) { solver_ptr = new MLI_Solver_GMRES(str); strcpy( paramString, "baseMethod SGS"); solver_ptr->setParams(paramString, 0, NULL); } else if (!strcmp(str,"GMRESMLI")) { solver_ptr = new MLI_Solver_GMRES(str); strcpy( paramString, "baseMethod MLI"); solver_ptr->setParams(paramString, 0, NULL); } else if (!strcmp(str, "Kaczmarz")) { solver_ptr = new MLI_Solver_Kaczmarz(str); } else if (!strcmp(str,"SuperLU")) { #ifdef MLI_SUPERLU solver_ptr = new MLI_Solver_SuperLU(str); #else printf("MLI_Solver_Create ERROR : SuperLU not available\n"); exit(1); #endif } else if (!strcmp(str,"SeqSuperLU")) { #ifdef MLI_SUPERLU solver_ptr = new MLI_Solver_SeqSuperLU(str); #else printf("MLI_Solver_Create ERROR : SuperLU not available\n"); exit(1); #endif } else if (!strcmp(str, "ARPACKSuperLU")) { #ifdef MLI_SUPERLU solver_ptr = new MLI_Solver_ARPACKSuperLU(str); #else printf("MLI_Solver_Create ERROR : SuperLU not available\n"); exit(1); #endif } else { printf("MLI_Solver_Create ERROR : solver %s undefined.\n",str); printf("Valid ones are : \n"); printf("\t Jacobi \n"); printf("\t BJacobi \n"); printf("\t GS \n"); printf("\t SGS \n"); printf("\t MCSGS \n"); printf("\t BSGS \n"); printf("\t HSGS (BoomerAMG SGS) \n"); printf("\t HSchwarz (BoomerAMG Schwarz) \n"); printf("\t MCBSGS \n"); printf("\t ParaSails \n"); printf("\t MLS \n"); printf("\t Chebyshev \n"); printf("\t CGJacobi \n"); printf("\t CGBJacobi \n"); printf("\t CGSGS \n"); printf("\t CGBSGS \n"); printf("\t CGMLI \n"); printf("\t CGAMG \n"); printf("\t CGILU \n"); printf("\t GMRESJacobi \n"); printf("\t GMRESSGS \n"); printf("\t GMRESMLI \n"); printf("\t Kaczmarz\n"); printf("\t SuperLU\n"); printf("\t SeqSuperLU\n"); printf("\t ARPACKSuperLU\n"); fflush(stdout); exit(1); } return solver_ptr; } hypre-2.33.0/src/FEI_mv/femli/mli_solver.h000066400000000000000000000047741477326011500202640ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * Header info for the MLI_Solver data structure * *****************************************************************************/ #ifndef __MLI_SOLVER_H__ #define __MLI_SOLVER_H__ /*-------------------------------------------------------------------------- * defines *--------------------------------------------------------------------------*/ #define MLI_SOLVER_JACOBI_ID 301 #define MLI_SOLVER_BJACOBI_ID 302 #define MLI_SOLVER_GS_ID 303 #define MLI_SOLVER_SGS_ID 304 #define MLI_SOLVER_BSGS_ID 305 #define MLI_SOLVER_PARASAILS_ID 306 #define MLI_SOLVER_MLS_ID 307 #define MLI_SOLVER_CHEBYSHEV_ID 308 #define MLI_SOLVER_CG_ID 309 #define MLI_SOLVER_SUPERLU_ID 310 #define MLI_SOLVER_SEQSUPERLU_ID 311 #define MLI_SOLVER_ARPACKSUPERLU_ID 312 #define MLI_SOLVER_KARCMARZ_ID 313 #define MLI_SOLVER_GMRES_ID 314 #define MLI_SOLVER_MLI_ID 315 #define MLI_SOLVER_ILU_ID 316 #define MLI_SOLVER_AMG_ID 317 /*-------------------------------------------------------------------------- * include files *--------------------------------------------------------------------------*/ #include #include "_hypre_utilities.h" #include "mli_matrix.h" #include "mli_vector.h" /*-------------------------------------------------------------------------- * MLI_Solver data structure declaration *--------------------------------------------------------------------------*/ class MLI_Solver { char solver_name[100]; public : MLI_Solver(char *name); virtual ~MLI_Solver(); char* getName(); virtual int setup(MLI_Matrix *)=0; virtual int solve(MLI_Vector *, MLI_Vector *)=0; virtual int setParams(char *paramString,int argc,char **argv); virtual int getParams(char *paramString,int *argc,char **argv); }; /*-------------------------------------------------------------------------- * MLI_Solver functions *--------------------------------------------------------------------------*/ extern MLI_Solver *MLI_Solver_CreateFromName(char *); #endif hypre-2.33.0/src/FEI_mv/femli/mli_solver_amg.cxx000066400000000000000000000063231477326011500214530ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include #include #include #include #include "_hypre_parcsr_ls.h" #include "_hypre_parcsr_mv.h" #include "mli_solver_amg.h" /****************************************************************************** * constructor *---------------------------------------------------------------------------*/ MLI_Solver_AMG::MLI_Solver_AMG(char *name) : MLI_Solver(name) { Amat_ = NULL; precond_ = NULL; } /****************************************************************************** * destructor *---------------------------------------------------------------------------*/ MLI_Solver_AMG::~MLI_Solver_AMG() { Amat_ = NULL; if (precond_ != NULL) HYPRE_BoomerAMGDestroy(precond_); precond_ = NULL; } /****************************************************************************** * set up the solver *---------------------------------------------------------------------------*/ int MLI_Solver_AMG::setup(MLI_Matrix *mat) { int i, *nSweeps, *rTypes; double *relaxWt, *relaxOmega; hypre_ParCSRMatrix *hypreA; Amat_ = mat; hypreA = (hypre_ParCSRMatrix *) Amat_->getMatrix(); HYPRE_BoomerAMGCreate(&precond_); HYPRE_BoomerAMGSetMaxIter(precond_, 1); HYPRE_BoomerAMGSetCycleType(precond_, 1); HYPRE_BoomerAMGSetMaxLevels(precond_, 25); HYPRE_BoomerAMGSetMeasureType(precond_, 0); HYPRE_BoomerAMGSetDebugFlag(precond_, 0); HYPRE_BoomerAMGSetPrintLevel(precond_, 1); HYPRE_BoomerAMGSetCoarsenType(precond_, 0); HYPRE_BoomerAMGSetStrongThreshold(precond_, 0.8); nSweeps = hypre_TAlloc(int, 4 , HYPRE_MEMORY_HOST); for (i = 0; i < 4; i++) nSweeps[i] = 1; HYPRE_BoomerAMGSetNumGridSweeps(precond_, nSweeps); rTypes = hypre_TAlloc(int, 4 , HYPRE_MEMORY_HOST); for (i = 0; i < 4; i++) rTypes[i] = 6; relaxWt = hypre_TAlloc(double, 25 , HYPRE_MEMORY_HOST); for (i = 0; i < 25; i++) relaxWt[i] = 1.0; HYPRE_BoomerAMGSetRelaxWeight(precond_, relaxWt); relaxOmega = hypre_TAlloc(double, 25 , HYPRE_MEMORY_HOST); for (i = 0; i < 25; i++) relaxOmega[i] = 1.0; HYPRE_BoomerAMGSetOmega(precond_, relaxOmega); HYPRE_BoomerAMGSetup(precond_, (HYPRE_ParCSRMatrix) hypreA, (HYPRE_ParVector) NULL, (HYPRE_ParVector) NULL); return 0; } /****************************************************************************** * apply function *---------------------------------------------------------------------------*/ int MLI_Solver_AMG::solve(MLI_Vector *fIn, MLI_Vector *uIn) { if (precond_ == NULL || Amat_ == NULL) { printf("MLI_Solver_AMG::solve ERROR - setup not called\n"); exit(1); } HYPRE_ParCSRMatrix hypreA = (HYPRE_ParCSRMatrix) Amat_->getMatrix(); HYPRE_ParVector f = (HYPRE_ParVector) fIn->getVector(); HYPRE_ParVector u = (HYPRE_ParVector) uIn->getVector(); HYPRE_BoomerAMGSolve(precond_, hypreA, f, u); return 0; } hypre-2.33.0/src/FEI_mv/femli/mli_solver_amg.h000066400000000000000000000020261477326011500210740ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #ifndef __MLI_SOLVER_AMG_H__ #define __MLI_SOLVER_AMG_H__ #include #include "HYPRE_config.h" #include "_hypre_utilities.h" #include "_hypre_parcsr_ls.h" #include "mli_matrix.h" #include "mli_vector.h" #include "mli_solver.h" /****************************************************************************** * data structure for BoomerAMG smoother *---------------------------------------------------------------------------*/ class MLI_Solver_AMG : public MLI_Solver { MLI_Matrix *Amat_; HYPRE_Solver precond_; public : MLI_Solver_AMG(char *name); ~MLI_Solver_AMG(); int setup(MLI_Matrix *Amat); int solve(MLI_Vector *f, MLI_Vector *u); }; #endif hypre-2.33.0/src/FEI_mv/femli/mli_solver_arpacksuperlu.cxx000066400000000000000000000220411477326011500235630ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #ifdef MLI_SUPERLU /* **************************************************************************** * This module takes advantage of the use of SuperLU for computing the null * spaces in each substructure. The factored matrix can be used as a * domain-decomposed smoother. The solve function assumes that a call * to dnstev has been performed before to set up the SuperLU factors. Thus * this module is to be used with caution. (experimental) * ***************************************************************************/ /* **************************************************************************** * system libraries * --------------------------------------------------------------------------*/ #include #include "mli_method_amgsa.h" #include "mli_solver_arpacksuperlu.h" /* **************************************************************************** * external function * --------------------------------------------------------------------------*/ extern "C" { /* ARPACK function to compute eigenvalues/eigenvectors */ void dnstev_(int *n, int *nev, char *which, double *sigmar, double *sigmai, int *colptr, int *rowind, double *nzvals, double *dr, double *di, double *z, int *ldz, int *info); } /* **************************************************************************** * constructor * --------------------------------------------------------------------------*/ MLI_Solver_ARPACKSuperLU::MLI_Solver_ARPACKSuperLU(char *name) : MLI_Solver(name) { nRecvs_ = 0; recvLengs_ = NULL; recvProcs_ = NULL; nSends_ = 0; sendLengs_ = NULL; sendProcs_ = NULL; sendMap_ = NULL; nSendMap_ = 0; nNodes_ = 0; ANodeEqnList_ = NULL; SNodeEqnList_ = NULL; blockSize_ = 0; } /* **************************************************************************** * destructor * --------------------------------------------------------------------------*/ MLI_Solver_ARPACKSuperLU::~MLI_Solver_ARPACKSuperLU() { if ( recvLengs_ != NULL ) delete [] recvLengs_; if ( recvProcs_ != NULL ) delete [] recvProcs_; if ( sendLengs_ != NULL ) delete [] sendLengs_; if ( sendProcs_ != NULL ) delete [] sendProcs_; if ( sendMap_ != NULL ) delete [] sendMap_; if ( ANodeEqnList_ != NULL ) delete [] ANodeEqnList_; if ( SNodeEqnList_ != NULL ) delete [] SNodeEqnList_; } /* **************************************************************************** * setup * --------------------------------------------------------------------------*/ int MLI_Solver_ARPACKSuperLU::setup( MLI_Matrix *mat ) { Amat_ = mat; return 0; } /* **************************************************************************** * This subroutine calls the SuperLU subroutine to perform LU * back substitution * --------------------------------------------------------------------------*/ int MLI_Solver_ARPACKSuperLU::solve( MLI_Vector *f_in, MLI_Vector *u_in ) { #ifdef MLI_ARPACK int iP, iE, iB, mypid, length, info, *partition; int offset, totalRecvs, totalSends, SLeng, SIndex, AIndex; double *u_data, *f_data, *dRecvBufs, *dSendBufs; double *permutedF, *permutedX; char paramString[100]; hypre_ParVector *u, *f; hypre_Vector *u_local, *f_local; hypre_ParCSRMatrix *hypreA; MPI_Comm mpiComm; MPI_Request *requests; MPI_Status *statuses; /* ------------------------------------------------------------- * fetch matrix and vector parameters * -----------------------------------------------------------*/ hypreA = (hypre_ParCSRMatrix *) Amat_->getMatrix(); mpiComm = hypre_ParCSRMatrixComm(hypreA); MPI_Comm_rank( mpiComm, &mypid ); u = (hypre_ParVector *) u_in->getVector(); u_local = hypre_ParVectorLocalVector(u); u_data = hypre_VectorData(u_local); f = (hypre_ParVector *) f_in->getVector(); f_local = hypre_ParVectorLocalVector(f); f_data = hypre_VectorData(f_local); /* ------------------------------------------------------------- * collect global vector and create a SuperLU dense matrix * -----------------------------------------------------------*/ if ( nRecvs_ > 0 ) { totalRecvs = 0; for ( iP = 0; iP < nRecvs_; iP++ ) totalRecvs += recvLengs_[iP]; totalRecvs *= blockSize_; dRecvBufs = new double[totalRecvs]; requests = new MPI_Request[nRecvs_]; statuses = new MPI_Status[nRecvs_]; } if ( nSends_ > 0 ) { totalSends = 0; for ( iP = 0; iP < nSends_; iP++ ) totalSends += sendLengs_[iP]; totalSends *= blockSize_; dSendBufs = new double[totalSends]; for ( iP = 0; iP < nSendMap_; iP++ ) for ( iB = 0; iB < blockSize_; iB++ ) dSendBufs[iP*blockSize_+iB] = f_data[sendMap_[iP]+iB]; } offset = 0; for ( iP = 0; iP < nRecvs_; iP++ ) { length = recvLengs_[iP] * blockSize_; MPI_Irecv(&(dRecvBufs[offset]), length, MPI_DOUBLE, recvProcs_[iP], 23482, mpiComm, &(requests[iP])); offset += length; } offset = 0; for ( iP = 0; iP < nSends_; iP++ ) { length = sendLengs_[iP] * blockSize_; MPI_Send(&(dSendBufs[offset]), length, MPI_DOUBLE, sendProcs_[iP], 23482, mpiComm); offset += length; } if ( nSends_ > 0 ) delete [] dSendBufs; MPI_Waitall( nRecvs_, requests, statuses ); /* ------------------------------------------------------------- * permute the vector into the one for SuperLU * -----------------------------------------------------------*/ SLeng = nNodes_ * blockSize_; permutedF = new double[SLeng]; permutedX = new double[SLeng]; for ( iE = 0; iE < SLeng; iE+=blockSize_ ) { SIndex = SNodeEqnList_[iE/blockSize_]; AIndex = ANodeEqnList_[iE/blockSize_]; if ( AIndex < 0 ) { AIndex = - AIndex - 1; for ( iB = 0; iB < blockSize_; iB++ ) permutedF[SIndex+iB] = dRecvBufs[AIndex+iB]; } else { for ( iB = 0; iB < blockSize_; iB++ ) permutedF[SIndex+iB] = f_data[AIndex+iB]; } } if ( nRecvs_ > 0 ) delete [] dRecvBufs; /* ------------------------------------------------------------- * solve using SuperLU * -----------------------------------------------------------*/ strcpy( paramString, "solve" ); dnstev_(NULL, NULL, paramString, NULL, NULL, NULL, NULL, NULL, permutedF, permutedX, NULL, NULL, &info); /* ------------------------------------------------------------- * permute the solution back to A order * -----------------------------------------------------------*/ for ( iE = 0; iE < SLeng; iE+=blockSize_ ) { SIndex = SNodeEqnList_[iE/blockSize_]; AIndex = ANodeEqnList_[iE/blockSize_]; if ( AIndex >= 0 ) { for ( iB = 0; iB < blockSize_; iB++ ) u_data[AIndex+iB] = permutedX[SIndex+iB]; } } /* ------------------------------------------------------------- * clean up * -----------------------------------------------------------*/ delete [] permutedF; delete [] permutedX; if ( nRecvs_ > 0 ) { delete [] requests; delete [] statuses; } return info; #else printf("FATAL ERROR : ARPACK not installed.\n"); exit(1); return -1; #endif } /****************************************************************************** * set ARPACKSuperLU parameters *---------------------------------------------------------------------------*/ int MLI_Solver_ARPACKSuperLU::setParams( char *paramString, int argc, char **argv ) { MLI_AMGSA_DD *ddObj; if ( !strcmp(paramString, "ARPACKSuperLUObject") ) { if ( argc != 1 ) { printf("MLI_Solver_ARPACKSuperLU::setParams - ARPACKSuperLUObj "); printf("allows only 1 argument.\n"); } ddObj = (MLI_AMGSA_DD *) argv[0]; nRecvs_ = ddObj->nRecvs; recvLengs_ = ddObj->recvLengs; recvProcs_ = ddObj->recvProcs; nSends_ = ddObj->nRecvs; sendLengs_ = ddObj->sendLengs; sendProcs_ = ddObj->sendProcs; sendMap_ = ddObj->sendMap; nSendMap_ = ddObj->nSendMap; nNodes_ = ddObj->NNodes; ANodeEqnList_ = ddObj->ANodeEqnList; SNodeEqnList_ = ddObj->SNodeEqnList; blockSize_ = ddObj->dofPerNode; } else if ( strcmp(paramString, "zeroInitialGuess") ) { printf("Solver_ARPACKSuperLU::setParams - parameter not recognized.\n"); printf(" Params = %s\n", paramString); return 1; } return 0; } #endif hypre-2.33.0/src/FEI_mv/femli/mli_solver_arpacksuperlu.h000066400000000000000000000026301477326011500232120ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #ifdef MLI_SUPERLU #ifndef __MLI_SOLVER_ARPACKSUPERLU_H__ #define __MLI_SOLVER_ARPACKSUPERLU_H__ #include #include "mli_vector.h" #include "mli_solver.h" #include "mli_matrix.h" /****************************************************************************** * data structure for the SuperLU in ARPACK shift-and-invert procedure *---------------------------------------------------------------------------*/ class MLI_Solver_ARPACKSuperLU : public MLI_Solver { MLI_Matrix *Amat_; int nRecvs_; int *recvLengs_; int *recvProcs_; int nSends_; int *sendLengs_; int *sendProcs_; int *sendMap_; int nSendMap_; int nNodes_; int *ANodeEqnList_; int *SNodeEqnList_; int blockSize_; public : MLI_Solver_ARPACKSuperLU(char *name); ~MLI_Solver_ARPACKSuperLU(); int setup(MLI_Matrix *mat); int solve(MLI_Vector *f, MLI_Vector *u); int setParams(char *paramString, int argc, char **argv); }; #endif #else int bogus; #endif hypre-2.33.0/src/FEI_mv/femli/mli_solver_bjacobi.cxx000066400000000000000000001007001477326011500222720ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include #include #include "mli_solver_bjacobi.h" #ifdef HAVE_ESSL #include #endif #define switchSize 200 /****************************************************************************** * BJacobi relaxation scheme *****************************************************************************/ /****************************************************************************** * constructor *--------------------------------------------------------------------------*/ MLI_Solver_BJacobi::MLI_Solver_BJacobi(char *name) : MLI_Solver(name) { Amat_ = NULL; nSweeps_ = 1; relaxWeights_ = NULL; zeroInitialGuess_ = 0; useOverlap_ = 0; blockSize_ = 200; nBlocks_ = 0; blockLengths_ = NULL; blockSolvers_ = NULL; maxBlkLeng_ = 0; offNRows_ = 0; offRowIndices_ = NULL; offRowLengths_ = NULL; offCols_ = NULL; offVals_ = NULL; blkScheme_ = 0; /* default = SuperLU */ esslMatrices_ = NULL; } /****************************************************************************** * destructor *--------------------------------------------------------------------------*/ MLI_Solver_BJacobi::~MLI_Solver_BJacobi() { cleanBlocks(); if (relaxWeights_ != NULL) delete [] relaxWeights_; } /****************************************************************************** * setup *--------------------------------------------------------------------------*/ int MLI_Solver_BJacobi::setup(MLI_Matrix *Amat_in) { Amat_ = Amat_in; /*----------------------------------------------------------------- * clean up first *-----------------------------------------------------------------*/ cleanBlocks(); /*----------------------------------------------------------------- * fetch the extended (to other processors) portion of the matrix *-----------------------------------------------------------------*/ composeOverlappedMatrix(); /*----------------------------------------------------------------- * construct the extended matrix *-----------------------------------------------------------------*/ #if HAVE_ESSL if ( blockSize_ <= switchSize && useOverlap_ == 0 ) blkScheme_ = 1; #endif buildBlocks(); return 0; } /****************************************************************************** * solve function *---------------------------------------------------------------------------*/ int MLI_Solver_BJacobi::solve(MLI_Vector *f_in, MLI_Vector *u_in) { int iP, jP, nRecvs, *recvProcs, *recvStarts, nRecvBefore; int blockStartRow, iB, iS, blockEndRow, blkLeng, length; int localNRows, iStart, iEnd, irow, jcol, colIndex, index, mypid; int nSends, numColsOffd, start, relaxError=0; int nprocs, *partition, startRow, endRow, offOffset, *tmpJ; int *ADiagI, *ADiagJ, *AOffdI, *AOffdJ, offIRow; double *ADiagA, *AOffdA, *uData, *fData, *tmpA, *fExtData=NULL; double relaxWeight, *vBufData=NULL, *vExtData=NULL, res; double *dbleX=NULL, *dbleB=NULL; char vecName[30]; MPI_Comm comm; hypre_ParCSRMatrix *A; hypre_CSRMatrix *ADiag, *AOffd; hypre_ParCSRCommPkg *commPkg; hypre_ParCSRCommHandle *commHandle; hypre_ParVector *f, *u; hypre_Vector *sluB=NULL, *sluX=NULL; MLI_Vector *mliX, *mliB; #if HAVE_ESSL int info; #endif /*----------------------------------------------------------------- * fetch machine and matrix parameters *-----------------------------------------------------------------*/ A = (hypre_ParCSRMatrix *) Amat_->getMatrix(); comm = hypre_ParCSRMatrixComm(A); commPkg = hypre_ParCSRMatrixCommPkg(A); ADiag = hypre_ParCSRMatrixDiag(A); localNRows = hypre_CSRMatrixNumRows(ADiag); ADiagI = hypre_CSRMatrixI(ADiag); ADiagJ = hypre_CSRMatrixJ(ADiag); ADiagA = hypre_CSRMatrixData(ADiag); AOffd = hypre_ParCSRMatrixOffd(A); numColsOffd = hypre_CSRMatrixNumCols(AOffd); AOffdI = hypre_CSRMatrixI(AOffd); AOffdJ = hypre_CSRMatrixJ(AOffd); AOffdA = hypre_CSRMatrixData(AOffd); u = (hypre_ParVector *) u_in->getVector(); uData = hypre_VectorData(hypre_ParVectorLocalVector(u)); f = (hypre_ParVector *) f_in->getVector(); fData = hypre_VectorData(hypre_ParVectorLocalVector(f)); partition = hypre_ParVectorPartitioning(f); MPI_Comm_rank(comm,&mypid); MPI_Comm_size(comm,&nprocs); startRow = partition[mypid]; endRow = partition[mypid+1] - 1; nRecvBefore = 0; if ( nprocs > 1 ) { nRecvs = hypre_ParCSRCommPkgNumRecvs(commPkg); recvProcs = hypre_ParCSRCommPkgRecvProcs(commPkg); recvStarts = hypre_ParCSRCommPkgRecvVecStarts(commPkg); if ( useOverlap_ ) { for ( iP = 0; iP < nRecvs; iP++ ) if ( recvProcs[iP] > mypid ) break; nRecvBefore = recvStarts[iP]; } } /*----------------------------------------------------------------- * setting up for interprocessor communication *-----------------------------------------------------------------*/ if (nprocs > 1) { nSends = hypre_ParCSRCommPkgNumSends(commPkg); length = hypre_ParCSRCommPkgSendMapStart(commPkg,nSends); if ( length > 0 ) vBufData = new double[length]; if ( numColsOffd > 0 ) { vExtData = new double[numColsOffd]; fExtData = new double[numColsOffd]; } for ( irow = 0; irow < numColsOffd; irow++ ) vExtData[irow] = 0.0; } /*-------------------------------------------------------------------- * communicate right hand side *--------------------------------------------------------------------*/ if (nprocs > 1 && useOverlap_) { index = 0; for (iP = 0; iP < nSends; iP++) { start = hypre_ParCSRCommPkgSendMapStart(commPkg, iP); for (jP=start;jP 0 ) { dbleB = new double[maxBlkLeng_]; dbleX = new double[maxBlkLeng_]; } if ( blkScheme_ == 0 ) { if ( maxBlkLeng_ > 0 ) { sluB = hypre_SeqVectorCreate( maxBlkLeng_ ); sluX = hypre_SeqVectorCreate( maxBlkLeng_ ); } hypre_VectorData(sluB) = dbleB; hypre_VectorData(sluX) = dbleX; } /*----------------------------------------------------------------- * perform block Jacobi sweeps *-----------------------------------------------------------------*/ for ( iS = 0; iS < nSweeps_; iS++ ) { if ( relaxWeights_ != NULL ) relaxWeight = relaxWeights_[iS]; else relaxWeight = 1.0; if ( relaxWeight <= 0.0 ) relaxWeight = 1.0; if (nprocs > 1) { if ( zeroInitialGuess_ == 0 ) { index = 0; for (iP = 0; iP < nSends; iP++) { start = hypre_ParCSRCommPkgSendMapStart(commPkg, iP); for (jP=start; jP= startRow && irow <= endRow ) { res = fData[index]; if ( zeroInitialGuess_ == 0 ) { iStart = ADiagI[index]; iEnd = ADiagI[index+1]; tmpJ = &(ADiagJ[iStart]); tmpA = &(ADiagA[iStart]); for (jcol = iStart; jcol < iEnd; jcol++) res -= *tmpA++ * uData[*tmpJ++]; if ( AOffdI != NULL ) { iStart = AOffdI[index]; iEnd = AOffdI[index+1]; tmpJ = &(AOffdJ[iStart]); tmpA = &(AOffdA[iStart]); for (jcol = iStart; jcol < iEnd; jcol++) res -= *tmpA++ * vExtData[*tmpJ++]; } } dbleB[irow-blockStartRow] = res; } else { res = fExtData[offIRow]; if ( zeroInitialGuess_ == 0 ) { iStart = 0; iEnd = offRowLengths_[offIRow]; tmpA = &(offVals_[offOffset]); tmpJ = &(offCols_[offOffset]); for (jcol = iStart; jcol < iEnd; jcol++) { colIndex = *tmpJ++; if ( colIndex >= localNRows ) res -= *tmpA++ * vExtData[colIndex-localNRows]; else if ( colIndex >= 0 ) res -= *tmpA++ * uData[colIndex]; else tmpA++; } offOffset += iEnd; } dbleB[irow-blockStartRow] = res; offIRow++; } } if ( blkScheme_ == 0 ) { hypre_VectorSize(sluB) = blkLeng; hypre_VectorSize(sluX) = blkLeng; strcpy( vecName, "HYPRE_Vector" ); mliB = new MLI_Vector((void*) sluB, vecName, NULL); mliX = new MLI_Vector((void*) sluX, vecName, NULL); blockSolvers_[iB]->solve( mliB, mliX ); delete mliB; delete mliX; } else { for ( irow = 0; irow < blkLeng; irow++ ) dbleX[irow] = dbleB[irow]; #if HAVE_ESSL dpps(esslMatrices_[iB], blkLeng, dbleX, 1); #endif } for ( irow = blockStartRow; irow <= blockEndRow; irow++ ) { if ( irow >= startRow && irow <= endRow ) uData[irow-startRow] += relaxWeight * dbleX[irow-blockStartRow]; else vExtData[offIRow-blockSize_+irow-blockStartRow+1] += relaxWeight * dbleX[irow-blockStartRow]; } } zeroInitialGuess_ = 0; } /*----------------------------------------------------------------- * symmetrize *-----------------------------------------------------------------*/ if (nprocs > 1 && useOverlap_) { commHandle = hypre_ParCSRCommHandleCreate(2,commPkg,vExtData, vBufData); hypre_ParCSRCommHandleDestroy(commHandle); commHandle = NULL; index = 0; for (iP = 0; iP < nSends; iP++) { start = hypre_ParCSRCommPkgSendMapStart(commPkg, iP); for (jP=start;jP= 1 ) nSweeps_ = *(int*) argv[0]; if ( argc == 2 ) weights = (double*) argv[1]; if ( nSweeps_ < 1 ) nSweeps_ = 1; if ( relaxWeights_ != NULL ) delete [] relaxWeights_; relaxWeights_ = NULL; if ( weights != NULL ) { relaxWeights_ = new double[nSweeps_]; for ( i = 0; i < nSweeps_; i++ ) relaxWeights_[i] = weights[i]; } } else if ( !strcmp(param1, "zeroInitialGuess") ) { zeroInitialGuess_ = 1; return 0; } return 1; } /****************************************************************************** * compose overlapped matrix *--------------------------------------------------------------------------*/ int MLI_Solver_BJacobi::composeOverlappedMatrix() { hypre_ParCSRMatrix *A; MPI_Comm comm; MPI_Request *requests; MPI_Status *status; int i, j, k, mypid, nprocs, *partition, startRow, endRow; int localNRows, extNRows, nSends, *sendProcs, nRecvs; int *recvProcs, *recvStarts, proc, offset, length, reqNum; int totalSendNnz, totalRecvNnz, index, base, totalSends; int totalRecvs, rowNum, rowSize, *colInd, *sendStarts; int limit, *iSendBuf, curNnz, *recvIndices, colIndex; double *dSendBuf, *colVal; hypre_ParCSRCommPkg *commPkg; /*----------------------------------------------------------------- * fetch machine and matrix parameters *-----------------------------------------------------------------*/ A = (hypre_ParCSRMatrix *) Amat_->getMatrix(); comm = hypre_ParCSRMatrixComm(A); MPI_Comm_rank(comm,&mypid); MPI_Comm_size(comm,&nprocs); if ( ! useOverlap_ || nprocs <= 1 ) return 0; HYPRE_ParCSRMatrixGetRowPartitioning((HYPRE_ParCSRMatrix) A, &partition); startRow = partition[mypid]; endRow = partition[mypid+1] - 1; localNRows = endRow - startRow + 1; free( partition ); /*----------------------------------------------------------------- * fetch matrix communication information (offNRows_) *-----------------------------------------------------------------*/ extNRows = localNRows; if ( nprocs > 1 && useOverlap_ ) { commPkg = hypre_ParCSRMatrixCommPkg(A); nSends = hypre_ParCSRCommPkgNumSends(commPkg); sendProcs = hypre_ParCSRCommPkgSendProcs(commPkg); sendStarts = hypre_ParCSRCommPkgSendMapStarts(commPkg); nRecvs = hypre_ParCSRCommPkgNumRecvs(commPkg); recvProcs = hypre_ParCSRCommPkgRecvProcs(commPkg); recvStarts = hypre_ParCSRCommPkgRecvVecStarts(commPkg); for ( i = 0; i < nRecvs; i++ ) extNRows += ( recvStarts[i+1] - recvStarts[i] ); requests = new MPI_Request[nRecvs+nSends]; totalSends = sendStarts[nSends]; totalRecvs = recvStarts[nRecvs]; if ( totalRecvs > 0 ) offRowLengths_ = new int[totalRecvs]; else offRowLengths_ = NULL; recvIndices = hypre_ParCSRMatrixColMapOffd(A); if ( totalRecvs > 0 ) offRowIndices_ = new int[totalRecvs]; else offRowIndices_ = NULL; for ( i = 0; i < totalRecvs; i++ ) offRowIndices_[i] = recvIndices[i]; offNRows_ = totalRecvs; } else nRecvs = nSends = offNRows_ = totalRecvs = totalSends = 0; /*----------------------------------------------------------------- * construct offRowLengths *-----------------------------------------------------------------*/ reqNum = 0; for (i = 0; i < nRecvs; i++) { proc = recvProcs[i]; offset = recvStarts[i]; length = recvStarts[i+1] - offset; MPI_Irecv(&(offRowLengths_[offset]), length, MPI_INT, proc, 17304, comm, &(requests[reqNum++])); } if ( totalSends > 0 ) iSendBuf = new int[totalSends]; index = totalSendNnz = 0; for (i = 0; i < nSends; i++) { proc = sendProcs[i]; offset = sendStarts[i]; limit = sendStarts[i+1]; length = limit - offset; for (j = offset; j < limit; j++) { rowNum = hypre_ParCSRCommPkgSendMapElmt(commPkg,j) + startRow; hypre_ParCSRMatrixGetRow(A,rowNum,&rowSize,&colInd,NULL); iSendBuf[index++] = rowSize; totalSendNnz += rowSize; hypre_ParCSRMatrixRestoreRow(A,rowNum,&rowSize,&colInd,NULL); } MPI_Isend(&(iSendBuf[offset]), length, MPI_INT, proc, 17304, comm, &(requests[reqNum++])); } status = new MPI_Status[reqNum]; MPI_Waitall( reqNum, requests, status ); delete [] status; if ( totalSends > 0 ) delete [] iSendBuf; /*----------------------------------------------------------------- * construct offCols *-----------------------------------------------------------------*/ totalRecvNnz = 0; for (i = 0; i < totalRecvs; i++) totalRecvNnz += offRowLengths_[i]; if ( totalRecvNnz > 0 ) { offCols_ = new int[totalRecvNnz]; offVals_ = new double[totalRecvNnz]; } reqNum = totalRecvNnz = 0; for (i = 0; i < nRecvs; i++) { proc = recvProcs[i]; offset = recvStarts[i]; length = recvStarts[i+1] - offset; curNnz = 0; for (j = 0; j < length; j++) curNnz += offRowLengths_[offset+j]; MPI_Irecv(&(offCols_[totalRecvNnz]), curNnz, MPI_INT, proc, 17305, comm, &(requests[reqNum++])); totalRecvNnz += curNnz; } if ( totalSendNnz > 0 ) iSendBuf = new int[totalSendNnz]; index = totalSendNnz = 0; for (i = 0; i < nSends; i++) { proc = sendProcs[i]; offset = sendStarts[i]; limit = sendStarts[i+1]; length = limit - offset; base = totalSendNnz; for (j = offset; j < limit; j++) { rowNum = hypre_ParCSRCommPkgSendMapElmt(commPkg,j) + startRow; hypre_ParCSRMatrixGetRow(A,rowNum,&rowSize,&colInd,NULL); for (k = 0; k < rowSize; k++) iSendBuf[totalSendNnz++] = colInd[k]; hypre_ParCSRMatrixRestoreRow(A,rowNum,&rowSize,&colInd,NULL); } length = totalSendNnz - base; MPI_Isend(&(iSendBuf[base]), length, MPI_INT, proc, 17305, comm, &(requests[reqNum++])); } status = new MPI_Status[reqNum]; if ( reqNum > 0 ) MPI_Waitall( reqNum, requests, status ); delete [] status; if ( totalSendNnz > 0 ) delete [] iSendBuf; /*----------------------------------------------------------------- * construct offVals *-----------------------------------------------------------------*/ reqNum = totalRecvNnz = 0; for (i = 0; i < nRecvs; i++) { proc = recvProcs[i]; offset = recvStarts[i]; length = recvStarts[i+1] - offset; curNnz = 0; for (j = 0; j < length; j++) curNnz += offRowLengths_[offset+j]; MPI_Irecv(&(offVals_[totalRecvNnz]), curNnz, MPI_DOUBLE, proc, 17306, comm, &(requests[reqNum++])); totalRecvNnz += curNnz; } if ( totalSendNnz > 0 ) dSendBuf = new double[totalSendNnz]; index = totalSendNnz = 0; for (i = 0; i < nSends; i++) { proc = sendProcs[i]; offset = sendStarts[i]; limit = sendStarts[i+1]; length = limit - offset; base = totalSendNnz; for (j = offset; j < limit; j++) { rowNum = hypre_ParCSRCommPkgSendMapElmt(commPkg,j) + startRow; hypre_ParCSRMatrixGetRow(A,rowNum,&rowSize,NULL,&colVal); for (k = 0; k < rowSize; k++) dSendBuf[totalSendNnz++] = colVal[k]; hypre_ParCSRMatrixRestoreRow(A,rowNum,&rowSize,NULL,&colVal); } length = totalSendNnz - base; MPI_Isend(&(dSendBuf[base]), length, MPI_DOUBLE, proc, 17306, comm, &(requests[reqNum++])); } status = new MPI_Status[reqNum]; if ( reqNum > 0 ) MPI_Waitall( reqNum, requests, status ); delete [] status; if ( totalSendNnz > 0 ) delete [] dSendBuf; if ( nprocs > 1 && useOverlap_ ) delete [] requests; /*----------------------------------------------------------------- * convert column indices *-----------------------------------------------------------------*/ offset = 0; for ( i = 0; i < offNRows_; i++ ) { for ( j = 0; j < offRowLengths_[i]; j++ ) { colIndex = offCols_[offset]; if ( colIndex >= startRow && colIndex <= endRow ) offCols_[offset] = colIndex - startRow; else { index = MLI_Utils_BinarySearch(colIndex,offRowIndices_,offNRows_); if ( index >= 0 ) offCols_[offset] = localNRows + index; else offCols_[offset] = -1; } offset++; } } return 0; } /****************************************************************************** * build the blocks *--------------------------------------------------------------------------*/ int MLI_Solver_BJacobi::buildBlocks() { int iB, iP, mypid, nprocs, *partition, startRow, endRow; int localNRows, nRecvs, *recvProcs, *recvStarts, nRecvBefore=0; int offRowOffset, offRowNnz, blockStartRow, blockEndRow, index; int irow, jcol, colIndex, rowSize, *colInd, localRow, localNnz; int blkLeng, *csrIA, *csrJA, offset, rowIndex; double *colVal, *csrAA, *esslMatrix; char sName[20]; MPI_Comm comm; hypre_ParCSRCommPkg *commPkg; hypre_ParCSRMatrix *A = (hypre_ParCSRMatrix *) Amat_->getMatrix(); hypre_CSRMatrix *seqA; MLI_Matrix *mliMat; MLI_Function *funcPtr=NULL; /*----------------------------------------------------------------- * fetch matrix information *-----------------------------------------------------------------*/ comm = hypre_ParCSRMatrixComm(A); MPI_Comm_rank(comm,&mypid); MPI_Comm_size(comm,&nprocs); HYPRE_ParCSRMatrixGetRowPartitioning((HYPRE_ParCSRMatrix) A, &partition); startRow = partition[mypid]; endRow = partition[mypid+1] - 1; localNRows = endRow - startRow + 1; free( partition ); if ( nprocs > 1 && useOverlap_ ) { commPkg = hypre_ParCSRMatrixCommPkg(A); nRecvs = hypre_ParCSRCommPkgNumRecvs(commPkg); recvProcs = hypre_ParCSRCommPkgRecvProcs(commPkg); recvStarts = hypre_ParCSRCommPkgRecvVecStarts(commPkg); nRecvBefore = 0; for ( iP = 0; iP < nRecvs; iP++ ) if ( recvProcs[iP] > mypid ) break; nRecvBefore = recvStarts[iP]; } else nRecvs = 0; /*----------------------------------------------------------------- * compute block information (blockLengths_) *-----------------------------------------------------------------*/ nBlocks_ = ( localNRows + blockSize_ - 1 + offNRows_ ) / blockSize_; if ( nBlocks_ == 0 ) nBlocks_ = 1; blockLengths_ = new int[nBlocks_]; for ( iB = 0; iB < nBlocks_; iB++ ) blockLengths_[iB] = blockSize_; blockLengths_[nBlocks_-1] = localNRows+offNRows_-blockSize_*(nBlocks_-1); maxBlkLeng_ = 0; for ( iB = 0; iB < nBlocks_; iB++ ) maxBlkLeng_ = ( blockLengths_[iB] > maxBlkLeng_ ) ? blockLengths_[iB] : maxBlkLeng_; /*----------------------------------------------------------------- * construct block matrix inverses *-----------------------------------------------------------------*/ if ( blkScheme_ == 0 ) { strcpy( sName, "SeqSuperLU" ); blockSolvers_ = new MLI_Solver_SeqSuperLU*[nBlocks_]; for ( iB = 0; iB < nBlocks_; iB++ ) blockSolvers_[iB] = new MLI_Solver_SeqSuperLU(sName); funcPtr = hypre_TAlloc(MLI_Function, 1, HYPRE_MEMORY_HOST); } else { esslMatrices_ = new double*[nBlocks_]; for ( iB = 0; iB < nBlocks_; iB++ ) esslMatrices_[iB] = NULL; } offRowOffset = offRowNnz = 0; for ( iB = 0; iB < nBlocks_; iB++ ) { blkLeng = blockLengths_[iB]; blockStartRow = iB * blockSize_ + startRow - nRecvBefore; blockEndRow = blockStartRow + blkLeng - 1; localNnz = 0; if ( blkScheme_ == 0 ) { for ( irow = blockStartRow; irow <= blockEndRow; irow++ ) { if ( irow >= startRow && irow <= endRow ) { hypre_ParCSRMatrixGetRow(A, irow, &rowSize, &colInd, &colVal); localNnz += rowSize; hypre_ParCSRMatrixRestoreRow(A,irow,&rowSize,&colInd,&colVal); } else localNnz += offRowLengths_[offRowOffset+irow-blockStartRow]; } seqA = hypre_CSRMatrixCreate( blkLeng, blkLeng, localNnz ); csrIA = new int[blkLeng+1]; csrJA = new int[localNnz]; csrAA = new double[localNnz]; localRow = 0; localNnz = 0; csrIA[0] = localNnz; for ( irow = blockStartRow; irow <= blockEndRow; irow++ ) { if ( irow >= startRow && irow <= endRow ) { hypre_ParCSRMatrixGetRow(A, irow, &rowSize, &colInd, &colVal); for ( jcol = 0; jcol < rowSize; jcol++ ) { colIndex = colInd[jcol]; if ((colIndex >= blockStartRow) && (colIndex <= blockEndRow)) { csrJA[localNnz] = colIndex - blockStartRow; csrAA[localNnz++] = colVal[jcol]; } } hypre_ParCSRMatrixRestoreRow(A,irow,&rowSize,&colInd,&colVal); } else { rowSize = offRowLengths_[offRowOffset]; colInd = &(offCols_[offRowNnz]); colVal = &(offVals_[offRowNnz]); for ( jcol = 0; jcol < rowSize; jcol++ ) { colIndex = colInd[jcol]; if ((colIndex >= blockStartRow) && (colIndex <= blockEndRow)) { csrJA[localNnz] = colIndex - blockStartRow; csrAA[localNnz++] = colVal[jcol]; } } offRowOffset++; offRowNnz += rowSize; } localRow++; csrIA[localRow] = localNnz; } hypre_CSRMatrixI(seqA) = csrIA; hypre_CSRMatrixJ(seqA) = csrJA; hypre_CSRMatrixData(seqA) = csrAA; MLI_Utils_HypreCSRMatrixGetDestroyFunc(funcPtr); strcpy( sName, "HYPRE_CSR" ); mliMat = new MLI_Matrix((void*) seqA, sName, funcPtr); blockSolvers_[iB]->setup( mliMat ); delete mliMat; } else { esslMatrices_[iB] = new double[blkLeng * (blkLeng+1)/2]; esslMatrix = esslMatrices_[iB]; for ( irow = 0; irow < blkLeng*(blkLeng+1)/2; irow++ ) esslMatrix[irow] = 0.0; offset = 0; for ( irow = blockStartRow; irow <= blockEndRow; irow++ ) { rowIndex = irow - blockStartRow; if ( irow >= startRow && irow <= endRow ) { hypre_ParCSRMatrixGetRow(A, irow, &rowSize, &colInd, &colVal); for ( jcol = 0; jcol < rowSize; jcol++ ) { colIndex = colInd[jcol] - blockStartRow; if ((colIndex >= rowIndex) && (colIndex < blkLeng)) { index = colIndex - rowIndex; esslMatrix[offset+index] = colVal[jcol]; } } hypre_ParCSRMatrixRestoreRow(A,irow,&rowSize,&colInd,&colVal); } else { rowSize = offRowLengths_[offRowOffset]; colInd = &(offCols_[offRowNnz]); colVal = &(offVals_[offRowNnz]); for ( jcol = 0; jcol < rowSize; jcol++ ) { colIndex = colInd[jcol] - blockStartRow; if ((colIndex >= rowIndex) && (colIndex < blkLeng)) { index = colIndex - rowIndex; esslMatrix[offset+index] = colVal[jcol]; } } offRowOffset++; offRowNnz += rowSize; } offset += blkLeng - irow + blockStartRow; } #ifdef HAVE_ESSL dppf(esslMatrix, blkLeng, 1); #endif } } if ( funcPtr != NULL ) free( funcPtr ); return 0; } /****************************************************************************** * adjust the off processor incoming matrix *--------------------------------------------------------------------------*/ int MLI_Solver_BJacobi::adjustOffColIndices() { int mypid, *partition, startRow, endRow, localNRows; int offset, index, colIndex, irow, jcol; hypre_ParCSRMatrix *A; MPI_Comm comm; /*----------------------------------------------------------------- * fetch machine and matrix parameters *-----------------------------------------------------------------*/ A = (hypre_ParCSRMatrix *) Amat_->getMatrix(); comm = hypre_ParCSRMatrixComm(A); MPI_Comm_rank(comm,&mypid); HYPRE_ParCSRMatrixGetRowPartitioning((HYPRE_ParCSRMatrix) A, &partition); startRow = partition[mypid]; endRow = partition[mypid+1] - 1; localNRows = endRow - startRow + 1; free( partition ); /*----------------------------------------------------------------- * convert column indices *-----------------------------------------------------------------*/ offset = 0; for ( irow = 0; irow < offNRows_; irow++ ) { for ( jcol = 0; jcol < offRowLengths_[irow]; jcol++ ) { colIndex = offCols_[offset]; if ( colIndex >= startRow && colIndex <= endRow ) offCols_[offset] = colIndex - startRow; else { index = MLI_Utils_BinarySearch(colIndex,offRowIndices_,offNRows_); if ( index >= 0 ) offCols_[offset] = localNRows + index; else offCols_[offset] = -1; } offset++; } } return 0; } /****************************************************************************** * clean blocks *--------------------------------------------------------------------------*/ int MLI_Solver_BJacobi::cleanBlocks() { int iB; if ( blockSolvers_ != NULL ) { for ( iB = 0; iB < nBlocks_; iB++ ) delete blockSolvers_[iB]; delete blockSolvers_; } if ( blockLengths_ != NULL ) delete [] blockLengths_; if ( offRowIndices_ != NULL ) delete [] offRowIndices_; if ( offRowLengths_ != NULL ) delete [] offRowLengths_; if ( offCols_ != NULL ) delete [] offCols_; if ( offVals_ != NULL ) delete [] offVals_; nBlocks_ = 0; blockLengths_ = NULL; blockSolvers_ = NULL; offNRows_ = 0; offRowIndices_ = NULL; offRowLengths_ = NULL; offCols_ = NULL; offVals_ = NULL; if ( esslMatrices_ != NULL ) { for ( iB = 0; iB < nBlocks_; iB++ ) if ( esslMatrices_[iB] != NULL ) delete [] esslMatrices_[iB]; delete [] esslMatrices_; esslMatrices_ = NULL; } return 0; } hypre-2.33.0/src/FEI_mv/femli/mli_solver_bjacobi.h000066400000000000000000000031311477326011500217170ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #ifndef __MLI_SOLVER_BJACOBI_H__ #define __MLI_SOLVER_BJACOBI_H__ #include #include "mli_matrix.h" #include "mli_vector.h" #include "mli_solver.h" #include "mli_solver_seqsuperlu.h" /****************************************************************************** * data structure for the BJacobi relaxation scheme *---------------------------------------------------------------------------*/ class MLI_Solver_BJacobi : public MLI_Solver { MLI_Matrix *Amat_; int nSweeps_; double *relaxWeights_; int useOverlap_; int nBlocks_; int blockSize_; int *blockLengths_; int maxBlkLeng_; int zeroInitialGuess_; int offNRows_; int *offRowIndices_; int *offRowLengths_; int *offCols_; double *offVals_; MLI_Solver_SeqSuperLU **blockSolvers_; int blkScheme_; double **esslMatrices_; public : MLI_Solver_BJacobi(char *name); ~MLI_Solver_BJacobi(); int setup(MLI_Matrix *Amat); int solve(MLI_Vector *f, MLI_Vector *u); int setParams( char *paramString, int argc, char **argv); int composeOverlappedMatrix(); int buildBlocks(); int adjustOffColIndices(); int cleanBlocks(); }; #endif hypre-2.33.0/src/FEI_mv/femli/mli_solver_bsgs.cxx000066400000000000000000001213001477326011500216360ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include #include #include "mli_solver_bsgs.h" #ifdef HAVE_ESSL #include #endif #define switchSize 200 /****************************************************************************** * BSGS relaxation scheme *****************************************************************************/ /****************************************************************************** * constructor *--------------------------------------------------------------------------*/ MLI_Solver_BSGS::MLI_Solver_BSGS(char *name) : MLI_Solver(name) { Amat_ = NULL; nSweeps_ = 1; relaxWeights_ = NULL; zeroInitialGuess_ = 0; useOverlap_ = 0; blockSize_ = 512; nBlocks_ = 0; blockLengths_ = NULL; blockSolvers_ = NULL; maxBlkLeng_ = 0; offNRows_ = 0; offRowIndices_ = NULL; offRowLengths_ = NULL; offCols_ = NULL; offVals_ = NULL; myColor_ = 0; numColors_ = 1; scheme_ = 1; #ifdef HAVE_ESSL esslMatrices_ = NULL; #endif } /****************************************************************************** * destructor *--------------------------------------------------------------------------*/ MLI_Solver_BSGS::~MLI_Solver_BSGS() { cleanBlocks(); if (relaxWeights_ != NULL) delete [] relaxWeights_; } /****************************************************************************** * setup *--------------------------------------------------------------------------*/ int MLI_Solver_BSGS::setup(MLI_Matrix *Amat_in) { hypre_ParCSRMatrix *A; MPI_Comm comm; Amat_ = Amat_in; /*----------------------------------------------------------------- * set up coloring scheme *-----------------------------------------------------------------*/ if ( scheme_ == 0 ) doProcColoring(); else if ( scheme_ == 1 ) { myColor_ = 0; numColors_ = 1; } else { A = (hypre_ParCSRMatrix *) Amat_->getMatrix(); comm = hypre_ParCSRMatrixComm(A); MPI_Comm_size(comm, &numColors_); MPI_Comm_rank(comm, &myColor_); } /*----------------------------------------------------------------- * clean up first *-----------------------------------------------------------------*/ cleanBlocks(); /*----------------------------------------------------------------- * fetch the extended (to other processors) portion of the matrix *-----------------------------------------------------------------*/ composeOverlappedMatrix(); adjustOffColIndices(); /*----------------------------------------------------------------- * construct the extended matrix *-----------------------------------------------------------------*/ buildBlocks(); return 0; } /****************************************************************************** * solve function *---------------------------------------------------------------------------*/ int MLI_Solver_BSGS::solve(MLI_Vector *f_in, MLI_Vector *u_in) { int iP, jP, iC, nRecvs, *recvProcs, *recvStarts, nRecvBefore; int blockStartRow, iB, iS, blockEndRow, blkLeng; int localNRows, iStart, iEnd, irow, jcol, colIndex, index, mypid; int nSends, numColsOffd, start, relaxError=0, length; int nprocs, *partition, startRow, endRow, offOffset, *tmpJ; int *ADiagI, *ADiagJ, *AOffdI, *AOffdJ, offIRow, totalOffNNZ; double *ADiagA, *AOffdA, *uData, *fData, *tmpA, *fExtData=NULL; double relaxWeight, *vBufData=NULL, *vExtData=NULL, res; double *dbleX=NULL, *dbleB=NULL; char vecName[30]; MPI_Comm comm; hypre_ParCSRMatrix *A; hypre_CSRMatrix *ADiag, *AOffd; hypre_ParCSRCommPkg *commPkg; hypre_ParCSRCommHandle *commHandle; hypre_ParVector *f, *u; hypre_Vector *sluB=NULL, *sluX=NULL; MLI_Vector *mliX=NULL, *mliB=NULL; /*----------------------------------------------------------------- * fetch machine and matrix parameters *-----------------------------------------------------------------*/ A = (hypre_ParCSRMatrix *) Amat_->getMatrix(); comm = hypre_ParCSRMatrixComm(A); commPkg = hypre_ParCSRMatrixCommPkg(A); ADiag = hypre_ParCSRMatrixDiag(A); localNRows = hypre_CSRMatrixNumRows(ADiag); ADiagI = hypre_CSRMatrixI(ADiag); ADiagJ = hypre_CSRMatrixJ(ADiag); ADiagA = hypre_CSRMatrixData(ADiag); AOffd = hypre_ParCSRMatrixOffd(A); numColsOffd = hypre_CSRMatrixNumCols(AOffd); AOffdI = hypre_CSRMatrixI(AOffd); AOffdJ = hypre_CSRMatrixJ(AOffd); AOffdA = hypre_CSRMatrixData(AOffd); u = (hypre_ParVector *) u_in->getVector(); uData = hypre_VectorData(hypre_ParVectorLocalVector(u)); f = (hypre_ParVector *) f_in->getVector(); fData = hypre_VectorData(hypre_ParVectorLocalVector(f)); partition = hypre_ParVectorPartitioning(f); MPI_Comm_rank(comm,&mypid); MPI_Comm_size(comm,&nprocs); startRow = partition[mypid]; endRow = partition[mypid+1] - 1; nRecvBefore = 0; totalOffNNZ = 0; if ( nprocs > 1 ) { nRecvs = hypre_ParCSRCommPkgNumRecvs(commPkg); recvProcs = hypre_ParCSRCommPkgRecvProcs(commPkg); recvStarts = hypre_ParCSRCommPkgRecvVecStarts(commPkg); if ( useOverlap_ ) { for ( iP = 0; iP < nRecvs; iP++ ) if ( recvProcs[iP] > mypid ) break; nRecvBefore = recvStarts[iP]; offNRows_ = recvStarts[nRecvs]; for ( iP = 0; iP < offNRows_; iP++ ) totalOffNNZ += offRowLengths_[iP]; } } /*----------------------------------------------------------------- * setting up for interprocessor communication *-----------------------------------------------------------------*/ if (nprocs > 1) { nSends = hypre_ParCSRCommPkgNumSends(commPkg); length = hypre_ParCSRCommPkgSendMapStart(commPkg,nSends); if ( length > 0 ) vBufData = new double[length]; if ( numColsOffd > 0 ) { vExtData = new double[numColsOffd]; fExtData = new double[numColsOffd]; } for ( irow = 0; irow < numColsOffd; irow++ ) vExtData[irow] = 0.0; } /*-------------------------------------------------------------------- * communicate right hand side *--------------------------------------------------------------------*/ if (nprocs > 1 && useOverlap_) { index = 0; for (iP = 0; iP < nSends; iP++) { start = hypre_ParCSRCommPkgSendMapStart(commPkg, iP); for (jP=start;jP 0 ) { dbleB = new double[maxBlkLeng_]; dbleX = new double[maxBlkLeng_]; } #ifdef HAVE_ESSL if ( blockSize_ > switchSize ) { #endif if ( maxBlkLeng_ > 0 ) { sluB = hypre_SeqVectorCreate( maxBlkLeng_ ); sluX = hypre_SeqVectorCreate( maxBlkLeng_ ); } hypre_VectorData(sluB) = dbleB; hypre_VectorData(sluX) = dbleX; #ifdef HAVE_ESSL } #endif /*----------------------------------------------------------------- * perform block SGS sweeps *-----------------------------------------------------------------*/ for ( iS = 0; iS < nSweeps_; iS++ ) { if ( relaxWeights_ != NULL ) relaxWeight = relaxWeights_[iS]; else relaxWeight = 1.0; if ( relaxWeight <= 0.0 ) relaxWeight = 1.0; for ( iC = 0; iC < numColors_; iC++ ) { if (nprocs > 1) { if ( ! zeroInitialGuess_) { index = 0; for (iP = 0; iP < nSends; iP++) { start = hypre_ParCSRCommPkgSendMapStart(commPkg, iP); for (jP=start; jP= startRow && irow <= endRow ) { iStart = ADiagI[index]; iEnd = ADiagI[index+1]; tmpJ = &(ADiagJ[iStart]); tmpA = &(ADiagA[iStart]); res = fData[index]; for (jcol = iStart; jcol < iEnd; jcol++) { res -= *tmpA * uData[*tmpJ]; tmpA++; tmpJ++; } if ( ! zeroInitialGuess_) { iStart = AOffdI[index]; iEnd = AOffdI[index+1]; tmpJ = &(AOffdJ[iStart]); tmpA = &(AOffdA[iStart]); for (jcol = iStart; jcol < iEnd; jcol++) { res -= (*tmpA) * vExtData[(*tmpJ)]; tmpA++; tmpJ++; } } dbleB[irow-blockStartRow] = res; } else { offIRow++; iStart = 0; iEnd = offRowLengths_[offIRow]; tmpA = &(offVals_[offOffset]); tmpJ = &(offCols_[offOffset]); res = fExtData[offIRow]; for (jcol = iStart; jcol < iEnd; jcol++) { colIndex = *tmpJ; if ( colIndex >= localNRows ) res -= (*tmpA) * vExtData[colIndex-localNRows]; else if ( colIndex >= 0 ) res -= (*tmpA) * uData[colIndex]; tmpA++; tmpJ++; } offOffset += iEnd; dbleB[irow-blockStartRow] = res; } } #ifdef HAVE_ESSL if ( blockSize_ > switchSize ) { #endif hypre_VectorSize(sluB) = blkLeng; hypre_VectorSize(sluX) = blkLeng; strcpy( vecName, "HYPRE_Vector" ); mliB = new MLI_Vector((void*) sluB, vecName, NULL); mliX = new MLI_Vector((void*) sluX, vecName, NULL); blockSolvers_[iB]->solve( mliB, mliX ); delete mliB; delete mliX; #ifdef HAVE_ESSL } else { for (irow = 0; irow < blkLeng; irow++) dbleX[irow] = dbleB[irow]; dpps(esslMatrices_[iB], blkLeng, dbleX, 1); } #endif for ( irow = blockStartRow; irow <= blockEndRow; irow++ ) { if ( irow < startRow ) vExtData[offIRow-blockSize_+irow-blockStartRow+1] += relaxWeight * dbleX[irow-blockStartRow]; else if ( irow <= endRow ) uData[irow-startRow] += relaxWeight * dbleX[irow-blockStartRow]; else vExtData[offIRow-blockSize_+irow-blockStartRow+1] += relaxWeight * dbleX[irow-blockStartRow]; } } } zeroInitialGuess_ = 0; } /*----------------------------------------------------------------- * process each block backward *-----------------------------------------------------------------*/ for ( iC = 0; iC < numColors_; iC++ ) { if ( numColors_ > 1 && nprocs > 1 ) { if ( ! zeroInitialGuess_) { index = 0; for (iP = 0; iP < nSends; iP++) { start = hypre_ParCSRCommPkgSendMapStart(commPkg, iP); for (jP=start; jP= 0; iB-- ) { blkLeng = blockLengths_[iB]; blockStartRow = iB * blockSize_ + startRow - nRecvBefore; blockEndRow = blockStartRow + blkLeng - 1; for ( irow = blockStartRow; irow <= blockEndRow; irow++ ) { index = irow - startRow; if ( irow >= startRow && irow <= endRow ) { iStart = ADiagI[index]; iEnd = ADiagI[index+1]; tmpJ = &(ADiagJ[iStart]); tmpA = &(ADiagA[iStart]); res = fData[index]; for (jcol = iStart; jcol < iEnd; jcol++) { res -= (*tmpA) * uData[*tmpJ]; tmpA++; tmpJ++; } if ( ! zeroInitialGuess_ ) { iStart = AOffdI[index]; iEnd = AOffdI[index+1]; tmpJ = &(AOffdJ[iStart]); tmpA = &(AOffdA[iStart]); for (jcol = iStart; jcol < iEnd; jcol++) { res -= (*tmpA) * vExtData[*tmpJ]; tmpA++; tmpJ++; } } dbleB[irow-blockStartRow] = res; } else { offIRow--; iStart = 0; iEnd = offRowLengths_[offIRow]; offOffset -= iEnd; tmpA = &(offVals_[offOffset]); tmpJ = &(offCols_[offOffset]); res = fExtData[offIRow]; for (jcol = iStart; jcol < iEnd; jcol++) { colIndex = *tmpJ; if ( colIndex >= localNRows ) res -= (*tmpA) * vExtData[colIndex-localNRows]; else if ( colIndex >= 0 ) res -= (*tmpA) * uData[colIndex]; tmpA++; tmpJ++; } dbleB[irow-blockStartRow] = res; } } #ifdef HAVE_ESSL if ( blockSize_ > switchSize ) { #endif hypre_VectorSize(sluB) = blkLeng; hypre_VectorSize(sluX) = blkLeng; strcpy( vecName, "HYPRE_Vector" ); mliB = new MLI_Vector((void*) sluB, vecName, NULL); mliX = new MLI_Vector((void*) sluX, vecName, NULL); blockSolvers_[iB]->solve( mliB, mliX ); delete mliB; delete mliX; #ifdef HAVE_ESSL } else { for (irow = 0; irow < blkLeng; irow++) dbleX[irow] = dbleB[irow]; dpps(esslMatrices_[iB], blkLeng, dbleX, 1); } #endif for ( irow = blockStartRow; irow <= blockEndRow; irow++ ) { if ( irow < startRow ) vExtData[offIRow+irow-blockStartRow] += relaxWeight * dbleX[irow-blockStartRow]; else if ( irow <= endRow ) uData[irow-startRow] += relaxWeight * dbleX[irow-blockStartRow]; else vExtData[offIRow+irow-blockStartRow] += relaxWeight * dbleX[irow-blockStartRow]; } } } } } /*----------------------------------------------------------------- * symmetrize *-----------------------------------------------------------------*/ if (nprocs > 1 && useOverlap_) { commHandle = hypre_ParCSRCommHandleCreate(2,commPkg,vExtData, vBufData); hypre_ParCSRCommHandleDestroy(commHandle); commHandle = NULL; index = 0; for (iP = 0; iP < nSends; iP++) { start = hypre_ParCSRCommPkgSendMapStart(commPkg, iP); for (jP=start;jP switchSize ) { #endif if ( sluX != NULL ) hypre_SeqVectorDestroy( sluX ); if ( sluB != NULL ) hypre_SeqVectorDestroy( sluB ); #ifdef HAVE_ESSL } #endif return(relaxError); } /****************************************************************************** * set parameters *---------------------------------------------------------------------------*/ int MLI_Solver_BSGS::setParams(char *paramString, int argc, char **argv) { int i; double *weights=NULL; char param1[200], param2[200]; sscanf(paramString, "%s", param1); if ( !strcmp(param1, "blockSize") ) { sscanf(paramString, "%s %d", param1, &blockSize_); if ( blockSize_ < 10 ) blockSize_ = 10; return 0; } else if ( !strcmp(param1, "numSweeps") ) { sscanf(paramString, "%s %d", param1, &nSweeps_); if ( nSweeps_ < 1 ) nSweeps_ = 1; return 0; } else if ( !strcmp(param1, "relaxWeight") ) { if ( argc != 2 && argc != 1 ) { printf("Solver_BSGS::setParams ERROR : needs 1 or 2 args.\n"); return 1; } if ( argc >= 1 ) nSweeps_ = *(int*) argv[0]; if ( argc == 2 ) weights = (double*) argv[1]; if ( nSweeps_ < 1 ) nSweeps_ = 1; if ( relaxWeights_ != NULL ) delete [] relaxWeights_; relaxWeights_ = NULL; if ( weights != NULL ) { relaxWeights_ = new double[nSweeps_]; for ( i = 0; i < nSweeps_; i++ ) relaxWeights_[i] = weights[i]; } } else if ( !strcmp(param1, "setScheme") ) { sscanf(paramString, "%s %s", param1, param2); if ( !strcmp(param2, "multicolor") ) scheme_ = 0; else if ( !strcmp(param2, "parallel") ) scheme_ = 1; else if ( !strcmp(param2, "sequential") ) scheme_ = 2; return 0; } else if ( !strcmp(param1, "zeroInitialGuess") ) { zeroInitialGuess_ = 1; return 0; } return 1; } /****************************************************************************** * compose overlapped matrix *--------------------------------------------------------------------------*/ int MLI_Solver_BSGS::composeOverlappedMatrix() { hypre_ParCSRMatrix *A; MPI_Comm comm; MPI_Request *requests; MPI_Status *status; int i, j, k, mypid, nprocs, *partition, startRow, endRow; int localNRows, extNRows, nSends, *sendProcs, nRecvs; int *recvProcs, *recvStarts, proc, offset, length, reqNum; int totalSendNnz, totalRecvNnz, index, base, totalSends; int totalRecvs, rowNum, rowSize, *colInd, *sendStarts; int limit, *iSendBuf, curNnz, *recvIndices; double *dSendBuf, *colVal; hypre_ParCSRCommPkg *commPkg; /*----------------------------------------------------------------- * fetch machine and matrix parameters *-----------------------------------------------------------------*/ A = (hypre_ParCSRMatrix *) Amat_->getMatrix(); comm = hypre_ParCSRMatrixComm(A); MPI_Comm_rank(comm,&mypid); MPI_Comm_size(comm,&nprocs); if ( ! useOverlap_ || nprocs <= 1 ) return 0; HYPRE_ParCSRMatrixGetRowPartitioning((HYPRE_ParCSRMatrix) A, &partition); startRow = partition[mypid]; endRow = partition[mypid+1] - 1; localNRows = endRow - startRow + 1; free( partition ); /*----------------------------------------------------------------- * fetch matrix communication information (offNRows_) *-----------------------------------------------------------------*/ extNRows = localNRows; if ( nprocs > 1 && useOverlap_ ) { commPkg = hypre_ParCSRMatrixCommPkg(A); nSends = hypre_ParCSRCommPkgNumSends(commPkg); sendProcs = hypre_ParCSRCommPkgSendProcs(commPkg); sendStarts = hypre_ParCSRCommPkgSendMapStarts(commPkg); nRecvs = hypre_ParCSRCommPkgNumRecvs(commPkg); recvProcs = hypre_ParCSRCommPkgRecvProcs(commPkg); recvStarts = hypre_ParCSRCommPkgRecvVecStarts(commPkg); for ( i = 0; i < nRecvs; i++ ) extNRows += ( recvStarts[i+1] - recvStarts[i] ); requests = new MPI_Request[nRecvs+nSends]; totalSends = sendStarts[nSends]; totalRecvs = recvStarts[nRecvs]; if ( totalRecvs > 0 ) offRowLengths_ = new int[totalRecvs]; else offRowLengths_ = NULL; recvIndices = hypre_ParCSRMatrixColMapOffd(A); if ( totalRecvs > 0 ) offRowIndices_ = new int[totalRecvs]; else offRowIndices_ = NULL; for ( i = 0; i < totalRecvs; i++ ) offRowIndices_[i] = recvIndices[i]; offNRows_ = totalRecvs; } else nRecvs = nSends = offNRows_ = totalRecvs = totalSends = 0; /*----------------------------------------------------------------- * construct offRowLengths *-----------------------------------------------------------------*/ reqNum = 0; for (i = 0; i < nRecvs; i++) { proc = recvProcs[i]; offset = recvStarts[i]; length = recvStarts[i+1] - offset; MPI_Irecv(&(offRowLengths_[offset]), length, MPI_INT, proc, 17304, comm, &(requests[reqNum++])); } if ( totalSends > 0 ) iSendBuf = new int[totalSends]; index = totalSendNnz = 0; for (i = 0; i < nSends; i++) { proc = sendProcs[i]; offset = sendStarts[i]; limit = sendStarts[i+1]; length = limit - offset; for (j = offset; j < limit; j++) { rowNum = hypre_ParCSRCommPkgSendMapElmt(commPkg,j) + startRow; hypre_ParCSRMatrixGetRow(A,rowNum,&rowSize,&colInd,NULL); iSendBuf[index++] = rowSize; totalSendNnz += rowSize; hypre_ParCSRMatrixRestoreRow(A,rowNum,&rowSize,&colInd,NULL); } MPI_Isend(&(iSendBuf[offset]), length, MPI_INT, proc, 17304, comm, &(requests[reqNum++])); } status = new MPI_Status[reqNum]; MPI_Waitall( reqNum, requests, status ); delete [] status; if ( totalSends > 0 ) delete [] iSendBuf; /*----------------------------------------------------------------- * construct offCols *-----------------------------------------------------------------*/ totalRecvNnz = 0; for (i = 0; i < totalRecvs; i++) totalRecvNnz += offRowLengths_[i]; if ( totalRecvNnz > 0 ) { offCols_ = new int[totalRecvNnz]; offVals_ = new double[totalRecvNnz]; } reqNum = totalRecvNnz = 0; for (i = 0; i < nRecvs; i++) { proc = recvProcs[i]; offset = recvStarts[i]; length = recvStarts[i+1] - offset; curNnz = 0; for (j = 0; j < length; j++) curNnz += offRowLengths_[offset+j]; MPI_Irecv(&(offCols_[totalRecvNnz]), curNnz, MPI_INT, proc, 17305, comm, &(requests[reqNum++])); totalRecvNnz += curNnz; } if ( totalSendNnz > 0 ) iSendBuf = new int[totalSendNnz]; index = totalSendNnz = 0; for (i = 0; i < nSends; i++) { proc = sendProcs[i]; offset = sendStarts[i]; limit = sendStarts[i+1]; length = limit - offset; base = totalSendNnz; for (j = offset; j < limit; j++) { rowNum = hypre_ParCSRCommPkgSendMapElmt(commPkg,j) + startRow; hypre_ParCSRMatrixGetRow(A,rowNum,&rowSize,&colInd,NULL); for (k = 0; k < rowSize; k++) iSendBuf[totalSendNnz++] = colInd[k]; hypre_ParCSRMatrixRestoreRow(A,rowNum,&rowSize,&colInd,NULL); } length = totalSendNnz - base; MPI_Isend(&(iSendBuf[base]), length, MPI_INT, proc, 17305, comm, &(requests[reqNum++])); } status = new MPI_Status[reqNum]; if ( reqNum > 0 ) MPI_Waitall( reqNum, requests, status ); delete [] status; if ( totalSendNnz > 0 ) delete [] iSendBuf; /*----------------------------------------------------------------- * construct offVals *-----------------------------------------------------------------*/ reqNum = totalRecvNnz = 0; for (i = 0; i < nRecvs; i++) { proc = recvProcs[i]; offset = recvStarts[i]; length = recvStarts[i+1] - offset; curNnz = 0; for (j = 0; j < length; j++) curNnz += offRowLengths_[offset+j]; MPI_Irecv(&(offVals_[totalRecvNnz]), curNnz, MPI_DOUBLE, proc, 17306, comm, &(requests[reqNum++])); totalRecvNnz += curNnz; } if ( totalSendNnz > 0 ) dSendBuf = new double[totalSendNnz]; index = totalSendNnz = 0; for (i = 0; i < nSends; i++) { proc = sendProcs[i]; offset = sendStarts[i]; limit = sendStarts[i+1]; length = limit - offset; base = totalSendNnz; for (j = offset; j < limit; j++) { rowNum = hypre_ParCSRCommPkgSendMapElmt(commPkg,j) + startRow; hypre_ParCSRMatrixGetRow(A,rowNum,&rowSize,NULL,&colVal); for (k = 0; k < rowSize; k++) dSendBuf[totalSendNnz++] = colVal[k]; hypre_ParCSRMatrixRestoreRow(A,rowNum,&rowSize,NULL,&colVal); } length = totalSendNnz - base; MPI_Isend(&(dSendBuf[base]), length, MPI_DOUBLE, proc, 17306, comm, &(requests[reqNum++])); } status = new MPI_Status[reqNum]; if ( reqNum > 0 ) MPI_Waitall( reqNum, requests, status ); delete [] status; if ( totalSendNnz > 0 ) delete [] dSendBuf; if ( nprocs > 1 && useOverlap_ ) delete [] requests; return 0; } /****************************************************************************** * build the blocks *--------------------------------------------------------------------------*/ int MLI_Solver_BSGS::buildBlocks() { int iB, iP, mypid, nprocs, *partition, startRow, endRow; int localNRows, nRecvs, *recvProcs, *recvStarts, nRecvBefore=0; int offRowOffset, offRowNnz, blockStartRow, blockEndRow; int irow, jcol, colIndex, rowSize, *colInd, localRow, localNnz; int blkLeng, *csrIA, *csrJA; double *colVal, *csrAA; char sName[20]; MPI_Comm comm; hypre_ParCSRCommPkg *commPkg; hypre_ParCSRMatrix *A = (hypre_ParCSRMatrix *) Amat_->getMatrix(); hypre_CSRMatrix *seqA; MLI_Matrix *mliMat; MLI_Function *funcPtr; #ifdef HAVE_ESSL int index, offset, rowIndex; double *esslMatrix; #endif /*----------------------------------------------------------------- * fetch matrix information *-----------------------------------------------------------------*/ comm = hypre_ParCSRMatrixComm(A); MPI_Comm_rank(comm,&mypid); MPI_Comm_size(comm,&nprocs); HYPRE_ParCSRMatrixGetRowPartitioning((HYPRE_ParCSRMatrix) A, &partition); startRow = partition[mypid]; endRow = partition[mypid+1] - 1; localNRows = endRow - startRow + 1; free( partition ); if ( blockSize_ == 1 ) { nBlocks_ = localNRows; blockLengths_ = new int[nBlocks_]; for ( iB = 0; iB < nBlocks_; iB++ ) blockLengths_[iB] = 1; maxBlkLeng_ = 1; return 0; } if ( nprocs > 1 && useOverlap_ ) { commPkg = hypre_ParCSRMatrixCommPkg(A); nRecvs = hypre_ParCSRCommPkgNumRecvs(commPkg); recvProcs = hypre_ParCSRCommPkgRecvProcs(commPkg); recvStarts = hypre_ParCSRCommPkgRecvVecStarts(commPkg); nRecvBefore = 0; for ( iP = 0; iP < nRecvs; iP++ ) if ( recvProcs[iP] > mypid ) break; nRecvBefore = recvStarts[iP]; } else nRecvs = 0; /*----------------------------------------------------------------- * compute block information (blockLengths_) *-----------------------------------------------------------------*/ nBlocks_ = ( localNRows + blockSize_ - 1 + offNRows_ ) / blockSize_; if ( nBlocks_ == 0 ) nBlocks_ = 1; blockLengths_ = new int[nBlocks_]; for ( iB = 0; iB < nBlocks_; iB++ ) blockLengths_[iB] = blockSize_; blockLengths_[nBlocks_-1] = localNRows+offNRows_-blockSize_*(nBlocks_-1); maxBlkLeng_ = 0; for ( iB = 0; iB < nBlocks_; iB++ ) maxBlkLeng_ = ( blockLengths_[iB] > maxBlkLeng_ ) ? blockLengths_[iB] : maxBlkLeng_; /*----------------------------------------------------------------- * construct block matrices inverses *-----------------------------------------------------------------*/ #ifdef HAVE_ESSL if ( blockSize_ > switchSize ) { #endif strcpy( sName, "SeqSuperLU" ); blockSolvers_ = new MLI_Solver_SeqSuperLU*[nBlocks_]; for ( iB = 0; iB < nBlocks_; iB++ ) blockSolvers_[iB] = new MLI_Solver_SeqSuperLU(sName); funcPtr = hypre_TAlloc(MLI_Function, 1, HYPRE_MEMORY_HOST); #ifdef HAVE_ESSL } else { esslMatrices_ = new double*[nBlocks_]; for ( iB = 0; iB < nBlocks_; iB++ ) esslMatrices_[iB] = NULL; } #endif offRowOffset = offRowNnz = 0; for ( iB = 0; iB < nBlocks_; iB++ ) { blkLeng = blockLengths_[iB]; blockStartRow = iB * blockSize_ + startRow - nRecvBefore; blockEndRow = blockStartRow + blkLeng - 1; localNnz = 0; #ifdef HAVE_ESSL if ( blockSize_ > switchSize ) { #endif for ( irow = blockStartRow; irow <= blockEndRow; irow++ ) { if ( irow >= startRow && irow <= endRow ) { hypre_ParCSRMatrixGetRow(A, irow, &rowSize, &colInd, &colVal); localNnz += rowSize; hypre_ParCSRMatrixRestoreRow(A, irow, &rowSize, &colInd, &colVal); } else localNnz += offRowLengths_[offRowOffset+irow-blockStartRow]; } seqA = hypre_CSRMatrixCreate( blkLeng, blkLeng, localNnz ); csrIA = new int[blkLeng+1]; csrJA = new int[localNnz]; csrAA = new double[localNnz]; localRow = 0; localNnz = 0; csrIA[0] = localNnz; for ( irow = blockStartRow; irow <= blockEndRow; irow++ ) { if ( irow >= startRow && irow <= endRow ) { hypre_ParCSRMatrixGetRow(A, irow, &rowSize, &colInd, &colVal); for ( jcol = 0; jcol < rowSize; jcol++ ) { colIndex = colInd[jcol]; if ((colIndex >= blockStartRow) && (colIndex <= blockEndRow)) { csrJA[localNnz] = colIndex - blockStartRow; csrAA[localNnz++] = colVal[jcol]; } } hypre_ParCSRMatrixRestoreRow(A, irow, &rowSize, &colInd, &colVal); } else { rowSize = offRowLengths_[offRowOffset]; colInd = &(offCols_[offRowNnz]); colVal = &(offVals_[offRowNnz]); for ( jcol = 0; jcol < rowSize; jcol++ ) { colIndex = colInd[jcol]; if ((colIndex >= blockStartRow) && (colIndex <= blockEndRow)) { csrJA[localNnz] = colIndex - blockStartRow; csrAA[localNnz++] = colVal[jcol]; } } offRowOffset++; offRowNnz += rowSize; } localRow++; csrIA[localRow] = localNnz; } hypre_CSRMatrixI(seqA) = csrIA; hypre_CSRMatrixJ(seqA) = csrJA; hypre_CSRMatrixData(seqA) = csrAA; MLI_Utils_HypreCSRMatrixGetDestroyFunc(funcPtr); strcpy( sName, "HYPRE_CSR" ); mliMat = new MLI_Matrix((void*) seqA, sName, funcPtr); blockSolvers_[iB]->setup( mliMat ); delete mliMat; #ifdef HAVE_ESSL } else { esslMatrices_[iB] = new double[blkLeng * (blkLeng+1)/2]; esslMatrix = esslMatrices_[iB]; bzero((char *) esslMatrices_[iB],blkLeng*(blkLeng+1)/2*sizeof(double)); offset = 0; for ( irow = blockStartRow; irow <= blockEndRow; irow++ ) { rowIndex = irow - blockStartRow; if ( irow >= startRow && irow <= endRow ) { hypre_ParCSRMatrixGetRow(A, irow, &rowSize, &colInd, &colVal); for ( jcol = 0; jcol < rowSize; jcol++ ) { colIndex = colInd[jcol] - blockStartRow; if ((colIndex >= rowIndex) && (colIndex <= blkLeng)) { index = colIndex - rowIndex; esslMatrix[offset+index] = colVal[jcol]; } } hypre_ParCSRMatrixRestoreRow(A,irow,&rowSize,&colInd,&colVal); } else { rowSize = offRowLengths_[offRowOffset]; colInd = &(offCols_[offRowNnz]); colVal = &(offVals_[offRowNnz]); for ( jcol = 0; jcol < rowSize; jcol++ ) { colIndex = colInd[jcol] - blockStartRow; if ((colIndex >= rowIndex) && (colIndex <= blkLeng)) { index = colIndex - rowIndex; esslMatrix[offset+index] = colVal[jcol]; } } offRowOffset++; offRowNnz += rowSize; } offset += blkLeng - irow + blockStartRow; } dppf(esslMatrix, blkLeng, 1); } #endif } #ifdef HAVE_ESSL if ( blockSize_ > switchSize ) { #endif free( funcPtr ); #ifdef HAVE_ESSL } #endif return 0; } /****************************************************************************** * adjust the off processor incoming matrix *--------------------------------------------------------------------------*/ int MLI_Solver_BSGS::adjustOffColIndices() { int mypid, *partition, startRow, endRow, localNRows; int offset, index, colIndex, irow, jcol; hypre_ParCSRMatrix *A; MPI_Comm comm; /*----------------------------------------------------------------- * fetch machine and matrix parameters *-----------------------------------------------------------------*/ A = (hypre_ParCSRMatrix *) Amat_->getMatrix(); comm = hypre_ParCSRMatrixComm(A); MPI_Comm_rank(comm,&mypid); HYPRE_ParCSRMatrixGetRowPartitioning((HYPRE_ParCSRMatrix) A, &partition); startRow = partition[mypid]; endRow = partition[mypid+1] - 1; localNRows = endRow - startRow + 1; free( partition ); /*----------------------------------------------------------------- * convert column indices *-----------------------------------------------------------------*/ offset = 0; for ( irow = 0; irow < offNRows_; irow++ ) { for ( jcol = 0; jcol < offRowLengths_[irow]; jcol++ ) { colIndex = offCols_[offset]; if ( colIndex >= startRow && colIndex <= endRow ) offCols_[offset] = colIndex - startRow; else { index = MLI_Utils_BinarySearch(colIndex,offRowIndices_,offNRows_); if ( index >= 0 ) offCols_[offset] = localNRows + index; else offCols_[offset] = -1; } offset++; } } return 0; } /****************************************************************************** * clean blocks *--------------------------------------------------------------------------*/ int MLI_Solver_BSGS::cleanBlocks() { int iB; if ( blockSolvers_ != NULL ) { for ( iB = 0; iB < nBlocks_; iB++ ) delete blockSolvers_[iB]; delete blockSolvers_; } if ( blockLengths_ != NULL ) delete [] blockLengths_; if ( offRowIndices_ != NULL ) delete [] offRowIndices_; if ( offRowLengths_ != NULL ) delete [] offRowLengths_; if ( offCols_ != NULL ) delete [] offCols_; if ( offVals_ != NULL ) delete [] offVals_; nBlocks_ = 0; blockLengths_ = NULL; blockSolvers_ = NULL; offNRows_ = 0; offRowIndices_ = NULL; offRowLengths_ = NULL; offCols_ = NULL; offVals_ = NULL; return 0; } /****************************************************************************** * color processors *---------------------------------------------------------------------------*/ int MLI_Solver_BSGS::doProcColoring() { int nSends, *sendProcs, mypid, nprocs, *commGraphI; int *commGraphJ, *recvCounts, i, j, *colors, *colorsAux; int pIndex, pColor; MPI_Comm comm; hypre_ParCSRMatrix *A; hypre_ParCSRCommPkg *commPkg; A = (hypre_ParCSRMatrix *) Amat_->getMatrix(); comm = hypre_ParCSRMatrixComm(A); commPkg = hypre_ParCSRMatrixCommPkg(A); if ( commPkg == NULL ) { hypre_MatvecCommPkgCreate((hypre_ParCSRMatrix *) A); commPkg = hypre_ParCSRMatrixCommPkg(A); } nSends = hypre_ParCSRCommPkgNumSends(commPkg); sendProcs = hypre_ParCSRCommPkgSendProcs(commPkg); MPI_Comm_rank(comm, &mypid); MPI_Comm_size(comm, &nprocs); commGraphI = new int[nprocs+1]; recvCounts = new int[nprocs]; MPI_Allgather(&nSends, 1, MPI_INT, recvCounts, 1, MPI_INT, comm); commGraphI[0] = 0; for ( i = 1; i <= nprocs; i++ ) commGraphI[i] = commGraphI[i-1] + recvCounts[i-1]; commGraphJ = new int[commGraphI[nprocs]]; MPI_Allgatherv(sendProcs, nSends, MPI_INT, commGraphJ, recvCounts, commGraphI, MPI_INT, comm); delete [] recvCounts; #if 0 if ( mypid == 0 ) { for ( i = 0; i < nprocs; i++ ) for ( j = commGraphI[i]; j < commGraphI[i+1]; j++ ) printf("Graph(%d,%d)\n", i, commGraphJ[j]); } #endif colors = new int[nprocs]; colorsAux = new int[nprocs]; for ( i = 0; i < nprocs; i++ ) colors[i] = colorsAux[i] = -1; for ( i = 0; i < nprocs; i++ ) { for ( j = commGraphI[i]; j < commGraphI[i+1]; j++ ) { pIndex = commGraphJ[j]; pColor = colors[pIndex]; if ( pColor >= 0 ) colorsAux[pColor] = 1; } for ( j = 0; j < nprocs; j++ ) if ( colorsAux[j] < 0 ) break; colors[i] = j; for ( j = commGraphI[i]; j < commGraphI[i+1]; j++ ) { pIndex = commGraphJ[j]; pColor = colors[pIndex]; if ( pColor >= 0 ) colorsAux[pColor] = -1; } } delete [] colorsAux; myColor_ = colors[mypid]; numColors_ = 0; for ( j = 0; j < nprocs; j++ ) if ( colors[j]+1 > numColors_ ) numColors_ = colors[j]+1; delete [] colors; return 0; } hypre-2.33.0/src/FEI_mv/femli/mli_solver_bsgs.h000066400000000000000000000032471477326011500212740ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #ifndef __MLI_SOLVER_BSGS_H__ #define __MLI_SOLVER_BSGS_H__ #include #include "mli_matrix.h" #include "mli_vector.h" #include "mli_solver.h" #include "mli_solver_seqsuperlu.h" /****************************************************************************** * data structure for the BSGS relaxation scheme *---------------------------------------------------------------------------*/ class MLI_Solver_BSGS : public MLI_Solver { MLI_Matrix *Amat_; int nSweeps_; double *relaxWeights_; int useOverlap_; int nBlocks_; int blockSize_; int *blockLengths_; int maxBlkLeng_; int zeroInitialGuess_; int offNRows_; int *offRowIndices_; int *offRowLengths_; int *offCols_; double *offVals_; MLI_Solver_SeqSuperLU **blockSolvers_; int scheme_; int numColors_; int myColor_; #ifdef HAVE_ESSL double **esslMatrices_; #endif public : MLI_Solver_BSGS(char *name); ~MLI_Solver_BSGS(); int setup(MLI_Matrix *Amat); int solve(MLI_Vector *f, MLI_Vector *u); int setParams( char *paramString, int argc, char **argv); int composeOverlappedMatrix(); int buildBlocks(); int adjustOffColIndices(); int cleanBlocks(); int doProcColoring(); }; #endif hypre-2.33.0/src/FEI_mv/femli/mli_solver_cg.cxx000066400000000000000000000502151477326011500212770ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include #include #include "HYPRE.h" #include "mli_solver_cg.h" #include "mli_solver_jacobi.h" #include "mli_solver_bjacobi.h" #include "mli_solver_sgs.h" #include "mli_solver_bsgs.h" #include "mli_solver_hsgs.h" #include "mli_solver_mli.h" #include "mli_solver_amg.h" /****************************************************************************** * constructor *---------------------------------------------------------------------------*/ MLI_Solver_CG::MLI_Solver_CG(char *name) : MLI_Solver(name) { Amat_ = NULL; rVec_ = NULL; zVec_ = NULL; pVec_ = NULL; apVec_ = NULL; maxIterations_ = 3; tolerance_ = 0.0; baseSolver_ = NULL; baseMethod_ = MLI_SOLVER_BSGS_ID; zeroInitialGuess_ = 0; // for domain decomposition with coarse overlaps nSends_ = 0; nRecvs_ = 0; sendProcs_ = NULL; recvProcs_ = NULL; sendLengs_ = NULL; recvLengs_ = NULL; PSmat_ = NULL; AComm_ = 0; PSvec_ = NULL; iluI_ = NULL; iluJ_ = NULL; iluA_ = NULL; iluD_ = NULL; } /****************************************************************************** * destructor *---------------------------------------------------------------------------*/ MLI_Solver_CG::~MLI_Solver_CG() { if ( rVec_ != NULL ) delete rVec_; if ( zVec_ != NULL ) delete zVec_; if ( pVec_ != NULL ) delete pVec_; if ( apVec_ != NULL ) delete apVec_; if ( PSmat_ != NULL ) delete PSmat_; if ( PSvec_ != NULL ) delete PSvec_; if ( sendProcs_ != NULL ) delete [] sendProcs_; if ( recvProcs_ != NULL ) delete [] recvProcs_; if ( sendLengs_ != NULL ) delete [] sendLengs_; if ( recvLengs_ != NULL ) delete [] recvLengs_; if ( baseSolver_ != NULL ) delete baseSolver_; if ( iluI_ != NULL ) delete iluI_; if ( iluJ_ != NULL ) delete iluJ_; if ( iluA_ != NULL ) delete iluA_; if ( iluD_ != NULL ) delete iluD_; } /****************************************************************************** * set up the smoother *---------------------------------------------------------------------------*/ int MLI_Solver_CG::setup(MLI_Matrix *Amat_in) { int numSweeps; double value=4.0/3.0; char paramString[100], *argv[1];; /*----------------------------------------------------------------- * set local matrix *-----------------------------------------------------------------*/ Amat_ = Amat_in; /*----------------------------------------------------------------- * set up preconditioner *-----------------------------------------------------------------*/ switch( baseMethod_ ) { case MLI_SOLVER_JACOBI_ID : sprintf(paramString, "Jacobi"); baseSolver_ = new MLI_Solver_Jacobi(paramString); sprintf(paramString, "numSweeps"); numSweeps = 1; argv[0] = (char *) &numSweeps; baseSolver_->setParams(paramString,1,argv); sprintf(paramString, "setMaxEigen"); argv[0] = (char *) &value; baseSolver_->setParams(paramString,1,argv); break; case MLI_SOLVER_BJACOBI_ID: sprintf(paramString, "BJacobi"); baseSolver_ = new MLI_Solver_BJacobi(paramString); sprintf(paramString, "numSweeps"); numSweeps = 1; argv[0] = (char *) &numSweeps; baseSolver_->setParams(paramString,1,argv); break; case MLI_SOLVER_SGS_ID : sprintf(paramString, "HSGS"); baseSolver_ = new MLI_Solver_HSGS(paramString); sprintf(paramString, "numSweeps"); numSweeps = 1; argv[0] = (char *) &numSweeps; baseSolver_->setParams(paramString,1,argv); break; case MLI_SOLVER_BSGS_ID : sprintf(paramString, "BSGS"); baseSolver_ = new MLI_Solver_BSGS(paramString); sprintf(paramString, "numSweeps"); numSweeps = 1; argv[0] = (char *) &numSweeps; baseSolver_->setParams(paramString,1,argv); break; case MLI_SOLVER_AMG_ID : sprintf(paramString, "AMG"); baseSolver_ = new MLI_Solver_AMG(paramString); break; case MLI_SOLVER_MLI_ID : sprintf(paramString, "MLI"); baseSolver_ = new MLI_Solver_MLI(paramString); break; case MLI_SOLVER_ILU_ID: iluDecomposition(); break; default : printf("MLI_Solver_CG ERROR : no base method.\n"); exit(1); } if (baseMethod_ != MLI_SOLVER_ILU_ID) baseSolver_->setup(Amat_); /*----------------------------------------------------------------- * build auxiliary vectors *-----------------------------------------------------------------*/ rVec_ = Amat_->createVector(); zVec_ = Amat_->createVector(); pVec_ = Amat_->createVector(); apVec_ = Amat_->createVector(); return 0; } /****************************************************************************** * apply function *---------------------------------------------------------------------------*/ int MLI_Solver_CG::solve(MLI_Vector *f_in, MLI_Vector *u_in) { int i, iter, localNRows, iP, rlength, shortNRows; double *pData, *zData, *rData, *u2Data, *f2Data, dZero=0.0; double rho, rhom1, alpha, beta, sigma, rnorm, dOne=1.0; double *fData, *uData; char paramString[30]; hypre_ParCSRMatrix *A, *P; hypre_CSRMatrix *ADiag; hypre_ParVector *f, *u, *p, *z, *r, *ap, *f2; MPI_Request *mpiRequests; MPI_Status mpiStatus; MLI_Vector *zVecLocal, *rVecLocal; /*----------------------------------------------------------------- * fetch machine and smoother parameters *-----------------------------------------------------------------*/ A = (hypre_ParCSRMatrix *) Amat_->getMatrix(); ADiag = hypre_ParCSRMatrixDiag(A); localNRows = hypre_CSRMatrixNumRows(ADiag); /*----------------------------------------------------------------- * fetch local vectors *-----------------------------------------------------------------*/ r = (hypre_ParVector *) rVec_->getVector(); /* -- r -- */ z = (hypre_ParVector *) zVec_->getVector(); /* -- z -- */ p = (hypre_ParVector *) pVec_->getVector(); /* -- p -- */ ap = (hypre_ParVector *) apVec_->getVector(); /* -- ap -- */ /*----------------------------------------------------------------- * for domain decomposition, set up for extended vector f *-----------------------------------------------------------------*/ f = (hypre_ParVector *) f_in->getVector(); u = (hypre_ParVector *) u_in->getVector(); rData = hypre_VectorData(hypre_ParVectorLocalVector(r)); if ( PSmat_ != NULL ) { P = (hypre_ParCSRMatrix *) PSmat_->getMatrix(); f2 = (hypre_ParVector *) PSvec_->getVector(); hypre_ParCSRMatrixMatvecT(dOne, P, f, dZero, f2); rlength = 0; for ( iP = 0; iP < nRecvs_; iP++ ) rlength += recvLengs_[iP]; shortNRows = localNRows - rlength; f2Data = hypre_VectorData(hypre_ParVectorLocalVector(f2)); if ( nRecvs_ > 0 ) mpiRequests = new MPI_Request[nRecvs_]; for ( iP = 0; iP < nRecvs_; iP++ ) { MPI_Irecv(&rData[shortNRows],recvLengs_[iP],MPI_DOUBLE, recvProcs_[iP], 45716, AComm_, &(mpiRequests[iP])); shortNRows += recvLengs_[iP]; } for ( iP = 0; iP < nSends_; iP++ ) MPI_Send(f2Data,sendLengs_[iP],MPI_DOUBLE,sendProcs_[iP],45716, AComm_); for ( iP = 0; iP < nRecvs_; iP++ ) MPI_Wait( &(mpiRequests[iP]), &mpiStatus ); if ( nRecvs_ > 0 ) delete [] mpiRequests; shortNRows = localNRows - rlength; fData = hypre_VectorData(hypre_ParVectorLocalVector(f)); for ( i = 0; i < shortNRows; i++ ) rData[i] = fData[i]; zeroInitialGuess_ = 0; u2Data = new double[localNRows]; for ( i = 0; i < localNRows; i++ ) u2Data[i] = 0.0; } else { hypre_ParVectorCopy(f, r); if (zeroInitialGuess_==0) hypre_ParCSRMatrixMatvec(-1.0,A,u,1.0,r); zeroInitialGuess_ = 0; } /*----------------------------------------------------------------- * set up for outer iterations *-----------------------------------------------------------------*/ if ( tolerance_ != 0.0 ) rnorm = sqrt(hypre_ParVectorInnerProd(r, r)); else rnorm = 1.0; /*----------------------------------------------------------------- * fetch auxiliary vectors *-----------------------------------------------------------------*/ pData = hypre_VectorData(hypre_ParVectorLocalVector(p)); zData = hypre_VectorData(hypre_ParVectorLocalVector(z)); /*----------------------------------------------------------------- * Perform iterations *-----------------------------------------------------------------*/ iter = 0; rho = 0.0; while ( iter < maxIterations_ && rnorm > tolerance_ ) { iter++; hypre_ParVectorSetConstantValues(z, 0.0); strcpy(paramString, "zeroInitialGuess"); if (baseMethod_ != MLI_SOLVER_ILU_ID) baseSolver_->setParams( paramString, 0, NULL ); strcpy( paramString, "HYPRE_ParVector" ); zVecLocal = new MLI_Vector( (void *) z, paramString, NULL); rVecLocal = new MLI_Vector( (void *) r, paramString, NULL); if (baseMethod_ == MLI_SOLVER_ILU_ID) iluSolve(rData, zData); else baseSolver_->solve( rVecLocal, zVecLocal ); rhom1 = rho; rho = hypre_ParVectorInnerProd(r, z); if ( iter == 1 ) { beta = 0.0; hypre_ParVectorCopy(z, p); } else { beta = rho / rhom1; #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i) HYPRE_SMP_SCHEDULE #endif for ( i = 0; i < localNRows; i++ ) pData[i] = beta * pData[i] + zData[i]; } hypre_ParCSRMatrixMatvec(1.0, A, p, 0.0, ap); sigma = hypre_ParVectorInnerProd(p, ap); alpha = rho /sigma; if ( PSmat_ == NULL ) hypre_ParVectorAxpy(alpha, p, u); /* u = u + alpha p */ else for ( i = 0; i < localNRows; i++ ) u2Data[i] += alpha * pData[i]; hypre_ParVectorAxpy(-alpha, ap, r); /* r = r - alpha ap */ if (tolerance_ != 0.0 && maxIterations_ > 1) rnorm = sqrt(hypre_ParVectorInnerProd(r, r)); } /*----------------------------------------------------------------- * for domain decomposition, recover the solution vector *-----------------------------------------------------------------*/ if ( PSmat_ != NULL ) { uData = hypre_VectorData(hypre_ParVectorLocalVector(u)); for ( i = 0; i < shortNRows; i++ ) uData[i] = u2Data[i]; delete [] u2Data; } return(0); } /****************************************************************************** * set CG parameters *---------------------------------------------------------------------------*/ int MLI_Solver_CG::setParams( char *paramString, int argc, char **argv ) { int i, *iArray; char param1[100], param2[100]; sscanf(paramString, "%s", param1); if ( !strcmp(param1, "maxIterations") ) { sscanf(paramString, "%s %d", param1, &maxIterations_); return 0; } else if ( !strcmp(param1, "tolerance") ) { sscanf(paramString, "%s %lg", param1, &tolerance_); return 0; } else if ( !strcmp(param1, "zeroInitialGuess") ) { zeroInitialGuess_ = 1; return 0; } else if ( !strcmp(param1, "numSweeps") ) { sscanf(paramString, "%s %d", param1, &maxIterations_); return 0; } else if ( !strcmp(param1, "relaxWeight") ) { if ( argc != 2 && argc != 1 ) { printf("MLI_Solver_CG::setParams ERROR : needs 1 or 2 args.\n"); return 1; } if ( argc >= 1 ) maxIterations_ = *(int*) argv[0]; return 0; } else if ( !strcmp(param1, "baseMethod") ) { sscanf(paramString, "%s %s", param1, param2); if ( !strcmp(param2, "Jacobi") ) baseMethod_ = MLI_SOLVER_JACOBI_ID; else if ( !strcmp(param2, "BJacobi") ) baseMethod_ = MLI_SOLVER_BJACOBI_ID; else if ( !strcmp(param2, "SGS") ) baseMethod_ = MLI_SOLVER_SGS_ID; else if ( !strcmp(param2, "BSGS") ) baseMethod_ = MLI_SOLVER_BSGS_ID; else if ( !strcmp(param2, "AMG") ) baseMethod_ = MLI_SOLVER_AMG_ID; else if ( !strcmp(param2, "MLI") ) baseMethod_ = MLI_SOLVER_MLI_ID; else if ( !strcmp(param2, "ILU") ) baseMethod_ = MLI_SOLVER_ILU_ID; else baseMethod_ = MLI_SOLVER_BJACOBI_ID; return 0; } else if ( !strcmp(param1, "setPmat") ) { if ( argc != 1 ) { printf("MLI_Solver_CG::setParams ERROR : needs 1 arg.\n"); return 1; } HYPRE_IJVector auxVec; PSmat_ = (MLI_Matrix *) argv[0]; hypre_ParCSRMatrix *hypreAux; hypre_ParCSRMatrix *ps = (hypre_ParCSRMatrix *) PSmat_->getMatrix(); int nCols = hypre_ParCSRMatrixNumCols(ps); int start = hypre_ParCSRMatrixFirstColDiag(ps); MPI_Comm vComm = hypre_ParCSRMatrixComm(ps); HYPRE_IJVectorCreate(vComm, start, start+nCols-1, &auxVec); HYPRE_IJVectorSetObjectType(auxVec, HYPRE_PARCSR); HYPRE_IJVectorInitialize(auxVec); HYPRE_IJVectorAssemble(auxVec); HYPRE_IJVectorGetObject(auxVec, (void **) &hypreAux); HYPRE_IJVectorSetObjectType(auxVec, -1); HYPRE_IJVectorDestroy(auxVec); strcpy( paramString, "HYPRE_ParVector" ); MLI_Function *funcPtr = new MLI_Function(); MLI_Utils_HypreParVectorGetDestroyFunc(funcPtr); PSvec_ = new MLI_Vector( (void*) hypreAux, paramString, funcPtr ); delete funcPtr; } else if ( !strcmp(param1, "setCommData") ) { if ( argc != 7 ) { printf("MLI_Solver_CG::setParams ERROR : needs 7 arg.\n"); return 1; } nRecvs_ = *(int *) argv[0]; if ( nRecvs_ > 0 ) { recvProcs_ = new int[nRecvs_]; recvLengs_ = new int[nRecvs_]; iArray = (int *) argv[1]; for ( i = 0; i < nRecvs_; i++ ) recvProcs_[i] = iArray[i]; iArray = (int *) argv[2]; for ( i = 0; i < nRecvs_; i++ ) recvLengs_[i] = iArray[i]; } nSends_ = *(int *) argv[3]; if ( nSends_ > 0 ) { sendProcs_ = new int[nSends_]; sendLengs_ = new int[nSends_]; iArray = (int *) argv[4]; for ( i = 0; i < nSends_; i++ ) sendProcs_[i] = iArray[i]; iArray = (int *) argv[5]; for ( i = 0; i < nSends_; i++ ) sendLengs_[i] = iArray[i]; } AComm_ = *(MPI_Comm *) argv[6]; } else { printf("MLI_Solver_CG::setParams - parameter not recognized.\n"); printf(" Params = %s\n", paramString); return 1; } return 0; } /****************************************************************************** * ilu decomposition *---------------------------------------------------------------------------*/ int MLI_Solver_CG::iluDecomposition() { int nrows, i, j, jj, jjj, k, rownum, colnum; int *ADiagI, *ADiagJ; double *ADiagA, *darray, dt; hypre_ParCSRMatrix *A; hypre_CSRMatrix *ADiag; A = (hypre_ParCSRMatrix *) Amat_->getMatrix(); ADiag = hypre_ParCSRMatrixDiag(A); nrows = hypre_CSRMatrixNumRows(ADiag); ADiagI = hypre_CSRMatrixI(ADiag); ADiagJ = hypre_CSRMatrixJ(ADiag); ADiagA = hypre_CSRMatrixData(ADiag); iluI_ = new int[nrows+2]; iluJ_ = new int[ADiagI[nrows]]; iluA_ = new double[ADiagI[nrows]]; iluD_ = new int[nrows+1]; // ----------------------------------------------------------------- // then put the elements (submatrix) of A into lu array // ----------------------------------------------------------------- for (i = 0; i <= nrows; i++) iluI_[i+1] = ADiagI[i]; for (i = 1; i <= nrows; i++) { rownum = i; for (j = iluI_[i]; j < iluI_[i+1]; j++) { colnum = ADiagJ[j] + 1; if (colnum == rownum) iluD_[i] = j; iluJ_[j] = colnum; iluA_[j] = ADiagA[j]; } } // ----------------------------------------------------------------- // loop on all the rows // ----------------------------------------------------------------- darray = new double[nrows+1]; for ( i = 1; i <= nrows; i++) { if (iluI_[i] != iluI_[i+1]) { for (j = 1; j <= nrows; j++) darray[j] = 0.0e0; for (j = iluI_[i]; j < iluI_[i+1]; j++) { jj = iluJ_[j]; if (iluI_[jj] != iluI_[jj+1]) darray[jj] = iluA_[j]; } // ---------------------------------------------------------- // eliminate L part of row i // ---------------------------------------------------------- for (j = iluI_[i]; j < iluI_[i+1]; j++) { jj = iluJ_[j]; if (jj < i && iluI_[jj] != iluI_[jj+1]) { dt = darray[jj]; if (dt != 0.0) { dt = dt * iluA_[iluD_[jj]]; darray[jj] = dt; for (k = iluI_[jj]; k < iluI_[jj+1]; k++) { jjj = iluJ_[k]; if (jjj > jj) darray[jjj] -= dt * iluA_[k]; } } } } // ---------------------------------------------------------- // put modified row part to lu array // ---------------------------------------------------------- for (j = iluI_[i]; j < iluI_[i+1]; j++) { jj = iluJ_[j]; if (iluI_[jj] != iluI_[jj+1]) iluA_[j] = darray[jj]; else iluA_[j] = 0.0; } iluA_[iluD_[i]] = 1.0e0 / iluA_[iluD_[i]]; } } delete [] darray; return 0; } /****************************************************************************** * ilu solve *---------------------------------------------------------------------------*/ int MLI_Solver_CG::iluSolve(double *inData, double *outData) { int i, j, k, nrows; double dtmp; hypre_ParCSRMatrix *A; hypre_CSRMatrix *ADiag; A = (hypre_ParCSRMatrix *) Amat_->getMatrix(); ADiag = hypre_ParCSRMatrixDiag(A); nrows = hypre_CSRMatrixNumRows(ADiag); for (i = 0; i < nrows; i++) outData[i] = inData[i]; for (i = 1; i <= nrows; i++) { if (iluI_[i] != iluI_[i+1]) { dtmp = 0.0e0; for (k = iluI_[i]; k < iluD_[i]; k++) { j = iluJ_[k]; dtmp += (iluA_[k] * outData[j-1]); } outData[i-1] = outData[i-1] - dtmp; } } for (i = nrows; i >= 1; i--) { if (iluI_[i] != iluI_[i+1]) { dtmp = 0.0e0; for (k = iluD_[i]+1; k < iluI_[i+1]; k++) { j = iluJ_[k]; dtmp += (iluA_[k] * outData[j-1]); } outData[i-1] = (outData[i-1] - dtmp) * iluA_[iluD_[i]]; } } return 0; } hypre-2.33.0/src/FEI_mv/femli/mli_solver_cg.h000066400000000000000000000030671477326011500207270ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #ifndef __MLI_SOLVER_CG_H__ #define __MLI_SOLVER_CG_H__ #include "mli_matrix.h" #include "mli_vector.h" #include "mli_solver.h" /****************************************************************************** * data structure for the CG scheme *---------------------------------------------------------------------------*/ class MLI_Solver_CG : public MLI_Solver { MLI_Matrix *Amat_; int maxIterations_; double tolerance_; int zeroInitialGuess_; MLI_Vector *rVec_; MLI_Vector *zVec_; MLI_Vector *pVec_; MLI_Vector *apVec_; MLI_Solver *baseSolver_; int baseMethod_; MLI_Matrix *PSmat_; MLI_Vector *PSvec_; int nRecvs_; int *recvProcs_; int *recvLengs_; int nSends_; int *sendProcs_; int *sendLengs_; MPI_Comm AComm_; int *iluI_; int *iluJ_; int *iluD_; double *iluA_; public : MLI_Solver_CG(char *name); ~MLI_Solver_CG(); int setup(MLI_Matrix *Amat); int solve(MLI_Vector *f, MLI_Vector *u); int setParams( char *paramString, int argc, char **argv ); int iluDecomposition(); int iluSolve(double *, double *); }; #endif hypre-2.33.0/src/FEI_mv/femli/mli_solver_chebyshev.cxx000066400000000000000000000156411477326011500226720ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include #include #include #include #if 0 /* RDF: Not sure this is really needed */ #ifdef WIN32 #define strcmp _stricmp #endif #endif #include "mli_solver_jacobi.h" #include "mli_solver_chebyshev.h" #include "_hypre_parcsr_mv.h" /****************************************************************************** * constructor *---------------------------------------------------------------------------*/ MLI_Solver_Chebyshev::MLI_Solver_Chebyshev(char *name) : MLI_Solver(name) { Amat_ = NULL; degree_ = 2; rVec_ = NULL; zVec_ = NULL; pVec_ = NULL; diagonal_ = NULL; maxEigen_ = 0.0; minEigen_ = 0.0; zeroInitialGuess_ = 0; } /****************************************************************************** * destructor *---------------------------------------------------------------------------*/ MLI_Solver_Chebyshev::~MLI_Solver_Chebyshev() { Amat_ = NULL; if ( rVec_ != NULL ) delete rVec_; if ( zVec_ != NULL ) delete zVec_; if ( pVec_ != NULL ) delete pVec_; if ( diagonal_ != NULL ) delete [] diagonal_; } /****************************************************************************** * set up the smoother *---------------------------------------------------------------------------*/ int MLI_Solver_Chebyshev::setup(MLI_Matrix *mat) { int i, j, localNRows, *ADiagI, *ADiagJ; double *ADiagA, *ritzValues, omega=3.0/3.0, scale; hypre_ParCSRMatrix *A; hypre_CSRMatrix *ADiag; /*----------------------------------------------------------------- * fetch parameters *-----------------------------------------------------------------*/ Amat_ = mat; A = (hypre_ParCSRMatrix *) Amat_->getMatrix(); ADiag = hypre_ParCSRMatrixDiag(A); ADiagI = hypre_CSRMatrixI(ADiag); ADiagJ = hypre_CSRMatrixJ(ADiag); ADiagA = hypre_CSRMatrixData(ADiag); localNRows = hypre_CSRMatrixNumRows(ADiag); /*----------------------------------------------------------------- * compute spectral radius of scaled Amat *-----------------------------------------------------------------*/ if ( maxEigen_ == 0.0 ) { ritzValues = new double[2]; MLI_Utils_ComputeExtremeRitzValues( A, ritzValues, 1 ); maxEigen_ = ritzValues[0]; minEigen_ = ritzValues[1]; delete [] ritzValues; } /*----------------------------------------------------------------- * extract and store matrix diagonal *-----------------------------------------------------------------*/ scale = omega / maxEigen_; if ( localNRows > 0 ) diagonal_ = new double[localNRows]; for ( i = 0; i < localNRows; i++ ) { diagonal_[i] = 1.0; for ( j = ADiagI[i]; j < ADiagI[i+1]; j++ ) { if ( ADiagJ[j] == i && ADiagA[j] != 0.0 ) { diagonal_[i] = scale / ADiagA[j] ; break; } } } /*----------------------------------------------------------------- * allocate temporary vectors *-----------------------------------------------------------------*/ if ( rVec_ != NULL ) delete rVec_; if ( zVec_ != NULL ) delete zVec_; if ( pVec_ != NULL ) delete pVec_; rVec_ = mat->createVector(); zVec_ = mat->createVector(); pVec_ = mat->createVector(); return 0; } /****************************************************************************** * apply function *---------------------------------------------------------------------------*/ int MLI_Solver_Chebyshev::solve(MLI_Vector *f_in, MLI_Vector *u_in) { int i, j, localNRows; double *pData, *zData, alpha, beta, cValue, dValue; double *rData, lambdaMax, lambdaMin, omega=2.0/3.0; hypre_ParCSRMatrix *A; hypre_CSRMatrix *ADiag; hypre_ParVector *r, *z, *p, *u, *f; /*----------------------------------------------------------------- * fetch machine and smoother parameters *-----------------------------------------------------------------*/ A = (hypre_ParCSRMatrix *) Amat_->getMatrix(); ADiag = hypre_ParCSRMatrixDiag(A); localNRows = hypre_CSRMatrixNumRows(ADiag); u = (hypre_ParVector *) u_in->getVector(); f = (hypre_ParVector *) f_in->getVector(); r = (hypre_ParVector *) rVec_->getVector(); z = (hypre_ParVector *) zVec_->getVector(); p = (hypre_ParVector *) pVec_->getVector(); rData = hypre_VectorData(hypre_ParVectorLocalVector(r)); zData = hypre_VectorData(hypre_ParVectorLocalVector(z)); pData = hypre_VectorData(hypre_ParVectorLocalVector(p)); lambdaMin = omega * minEigen_ / maxEigen_; lambdaMax = omega; dValue = 0.5 * (lambdaMax + lambdaMin); cValue = 0.5 * (lambdaMax - lambdaMin); /*----------------------------------------------------------------- * Perform Chebyshev iterations *-----------------------------------------------------------------*/ hypre_ParVectorCopy( f, r ); if ( zeroInitialGuess_ == 0 ) hypre_ParCSRMatrixMatvec( -1.0, A, u, 1.0, r ); zeroInitialGuess_ = 0; for ( i = 1; i <= degree_; i++ ) { for ( j = 0 ; j < localNRows; j++ ) zData[j] = diagonal_[j] * rData[j]; if ( i == 1 ) { hypre_ParVectorCopy( z, p ); alpha = 2.0 / dValue; } else { beta = 0.5 * alpha * cValue; beta = beta * beta; alpha = 1.0 / ( dValue - beta ); for ( j = 0 ; j < localNRows; j++ ) pData[j] = zData[j] + beta * pData[j]; } hypre_ParVectorAxpy( alpha, p, u ); hypre_ParCSRMatrixMatvec( -alpha, A, p, 1.0, r ); } return(0); } /****************************************************************************** * set Chebyshev parameters *---------------------------------------------------------------------------*/ int MLI_Solver_Chebyshev::setParams(char *paramString, int argc, char **argv) { char param1[200]; sscanf( paramString, "%s", param1 ); if ( !strcmp(param1, "relaxWeight") ) { if ( argc >= 1 ) degree_ = *(int*) argv[0]; if ( degree_ < 3 ) degree_ = 3; } else if ( !strcmp(param1, "degree") ) { if ( argc != 1 ) { printf("MLI_Solver_Chebyshev::setParams ERROR : needs 1 arg.\n"); return 1; } degree_ = *(int*) argv[0]; if ( degree_ < 3 ) degree_ = 3; } else if ( !strcmp(param1, "zeroInitialGuess") ) { zeroInitialGuess_ = 1; } return 0; } hypre-2.33.0/src/FEI_mv/femli/mli_solver_chebyshev.h000066400000000000000000000023231477326011500223100ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #ifndef __MLI_SOLVER_CHEBYSHEV_H__ #define __MLI_SOLVER_CHEBYSHEV_H__ #include #include "mli_matrix.h" #include "mli_vector.h" #include "mli_solver.h" /****************************************************************************** * data structure for the Chebyshev smoother *---------------------------------------------------------------------------*/ class MLI_Solver_Chebyshev : public MLI_Solver { MLI_Matrix *Amat_; MLI_Vector *rVec_; MLI_Vector *zVec_; MLI_Vector *pVec_; double *diagonal_; int degree_; int zeroInitialGuess_; double maxEigen_; double minEigen_; public : MLI_Solver_Chebyshev(char *name); ~MLI_Solver_Chebyshev(); int setup(MLI_Matrix *Amat); int solve(MLI_Vector *f, MLI_Vector *u); int setParams( char *paramString, int argc, char **argv ); }; #endif hypre-2.33.0/src/FEI_mv/femli/mli_solver_gmres.cxx000066400000000000000000000310411477326011500220170ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include #include #include "mli_solver_gmres.h" #include "mli_solver_jacobi.h" #include "mli_solver_bjacobi.h" #include "mli_solver_bsgs.h" #include "mli_solver_hsgs.h" #include "mli_solver_mli.h" /****************************************************************************** * constructor *---------------------------------------------------------------------------*/ MLI_Solver_GMRES::MLI_Solver_GMRES(char *name) : MLI_Solver(name) { Amat_ = NULL; KDim_ = 20; tolerance_ = 1.0e-16; maxIterations_ = 1000; rVec_ = NULL; pVec_ = NULL; zVec_ = NULL; baseSolver_ = NULL; baseMethod_ = MLI_SOLVER_SGS_ID; } /****************************************************************************** * destructor *---------------------------------------------------------------------------*/ MLI_Solver_GMRES::~MLI_Solver_GMRES() { int i; if ( rVec_ != NULL ) delete rVec_; if ( pVec_ != NULL ) { for (i = 0; i < KDim_+1; i++) delete pVec_[i]; delete [] pVec_; } if ( zVec_ != NULL ) { for (i = 0; i < KDim_+1; i++) delete zVec_[i]; delete [] zVec_; } if ( baseSolver_ != NULL ) delete baseSolver_; } /****************************************************************************** * set up the smoother *---------------------------------------------------------------------------*/ int MLI_Solver_GMRES::setup(MLI_Matrix *Amat_in) { int i, numSweeps; double value=4.0/3.0; char paramString[100], *argv[1];; /*----------------------------------------------------------------- * set local matrix *-----------------------------------------------------------------*/ Amat_ = Amat_in; /*----------------------------------------------------------------- * set up preconditioner *-----------------------------------------------------------------*/ if ( baseSolver_ != NULL ) delete baseSolver_; switch( baseMethod_ ) { case MLI_SOLVER_JACOBI_ID : sprintf(paramString, "Jacobi"); baseSolver_ = new MLI_Solver_Jacobi(paramString); sprintf(paramString, "numSweeps"); numSweeps = 1; argv[0] = (char *) &numSweeps; baseSolver_->setParams(paramString,1,argv); sprintf(paramString, "setMaxEigen"); argv[0] = (char *) &value; baseSolver_->setParams(paramString,1,argv); break; case MLI_SOLVER_BJACOBI_ID: sprintf(paramString, "BJacobi"); baseSolver_ = new MLI_Solver_BJacobi(paramString); sprintf(paramString, "numSweeps"); numSweeps = 1; argv[0] = (char *) &numSweeps; baseSolver_->setParams(paramString,1,argv); break; case MLI_SOLVER_SGS_ID : sprintf(paramString, "HSGS"); baseSolver_ = new MLI_Solver_HSGS(paramString); sprintf(paramString, "numSweeps"); numSweeps = 1; argv[0] = (char *) &numSweeps; baseSolver_->setParams(paramString,1,argv); break; case MLI_SOLVER_BSGS_ID : sprintf(paramString, "BSGS"); baseSolver_ = new MLI_Solver_BSGS(paramString); sprintf(paramString, "numSweeps"); numSweeps = 1; argv[0] = (char *) &numSweeps; baseSolver_->setParams(paramString,1,argv); break; case MLI_SOLVER_MLI_ID : sprintf(paramString, "MLI"); baseSolver_ = new MLI_Solver_BSGS(paramString); break; default : printf("MLI_Solver_GMRES ERROR : no base method.\n"); exit(1); } baseSolver_->setup(Amat_); /*----------------------------------------------------------------- * destroy previously allocated auxiliary vectors *-----------------------------------------------------------------*/ if ( rVec_ != NULL ) delete rVec_; if ( pVec_ != NULL ) { for (i = 0; i < KDim_+1; i++) delete pVec_[i]; delete [] pVec_; } if ( zVec_ != NULL ) { for (i = 0; i < KDim_+1; i++) delete zVec_[i]; delete [] zVec_; } /*----------------------------------------------------------------- * build auxiliary vectors *-----------------------------------------------------------------*/ rVec_ = Amat_->createVector(); pVec_ = new MLI_Vector*[KDim_+1]; zVec_ = new MLI_Vector*[KDim_+1]; for ( i = 0; i <= KDim_; i++ ) pVec_[i] = Amat_->createVector(); for ( i = 0; i <= KDim_; i++ ) zVec_[i] = Amat_->createVector(); return 0; } /****************************************************************************** * apply function *---------------------------------------------------------------------------*/ int MLI_Solver_GMRES::solve(MLI_Vector *b_in, MLI_Vector *u_in) { hypre_ParCSRMatrix *A; hypre_ParVector *b, *u, *r, **p, **z; int i, j, k, ierr = 0, iter, mypid; double *rs, **hh, *c, *s, t, zero=0.0; double epsilon, gamma1, rnorm, epsmac = 1.e-16; char paramString[100]; MPI_Comm comm; /*----------------------------------------------------------------- * fetch machine and matrix/vector parameters *-----------------------------------------------------------------*/ A = (hypre_ParCSRMatrix *) Amat_->getMatrix(); b = (hypre_ParVector *) b_in->getVector(); u = (hypre_ParVector *) u_in->getVector(); HYPRE_ParCSRMatrixGetComm((HYPRE_ParCSRMatrix) A, &comm); MPI_Comm_rank(comm, &mypid); /*----------------------------------------------------------------- * fetch other auxiliary vectors *-----------------------------------------------------------------*/ r = (hypre_ParVector *) rVec_->getVector(); p = hypre_TAlloc(hypre_ParVector *, (KDim_+1), HYPRE_MEMORY_HOST); z = hypre_TAlloc(hypre_ParVector *, (KDim_+1), HYPRE_MEMORY_HOST); for ( i = 0; i <= KDim_; i++ ) p[i] = (hypre_ParVector *) pVec_[i]->getVector(); for ( i = 0; i <= KDim_; i++ ) z[i] = (hypre_ParVector *) zVec_[i]->getVector(); rs = new double[KDim_+1]; c = new double[KDim_]; s = new double[KDim_]; hh = new double*[KDim_+1]; for (i=0; i < KDim_+1; i++) hh[i] = new double[KDim_]; /*----------------------------------------------------------------- * compute initial rnorm *-----------------------------------------------------------------*/ hypre_ParVectorSetConstantValues(u, zero); hypre_ParVectorCopy(b, r); //hypre_ParCSRMatrixMatvec(-1.0,A,u,1.0,r); rnorm = sqrt(hypre_ParVectorInnerProd(r, r)); if ( tolerance_ != 0.0 ) epsilon = rnorm * tolerance_; else epsilon = 1.0; /*----------------------------------------------------------------- * Perform iterations *-----------------------------------------------------------------*/ hypre_ParVectorCopy(r,p[0]); iter = 0; strcpy( paramString, "zeroInitialGuess" ); while (iter < maxIterations_) { rs[0] = rnorm; if (rnorm == 0.0) { ierr = 0; return ierr; } if (rnorm <= epsilon && iter > 0) { hypre_ParVectorCopy(b,r); hypre_ParCSRMatrixMatvec(-1.0, A, u, 1.0, r); rnorm = sqrt(hypre_ParVectorInnerProd(r,r)); if (rnorm <= epsilon) break; } t = 1.0 / rnorm; hypre_ParVectorScale(t,p[0]); i = 0; while (i < KDim_ && rnorm > epsilon && iter < maxIterations_) { i++; iter++; hypre_ParVectorSetConstantValues(z[i-1], zero); baseSolver_->setParams( paramString, 0, NULL ); baseSolver_->solve( pVec_[i-1], zVec_[i-1] ); hypre_ParCSRMatrixMatvec(1.0, A, z[i-1], 0.0, p[i]); /* modified Gram_Schmidt */ for (j=0; j < i; j++) { hh[j][i-1] = hypre_ParVectorInnerProd(p[j],p[i]); hypre_ParVectorAxpy(-hh[j][i-1],p[j],p[i]); } t = sqrt(hypre_ParVectorInnerProd(p[i],p[i])); hh[i][i-1] = t; if (t != 0.0) { t = 1.0/t; hypre_ParVectorScale(t, p[i]); } /* done with modified Gram_schmidt. update factorization of hh */ for (j = 1; j < i; j++) { t = hh[j-1][i-1]; hh[j-1][i-1] = c[j-1]*t + s[j-1]*hh[j][i-1]; hh[j][i-1] = -s[j-1]*t + c[j-1]*hh[j][i-1]; } gamma1 = sqrt(hh[i-1][i-1]*hh[i-1][i-1] + hh[i][i-1]*hh[i][i-1]); if (gamma1 == 0.0) gamma1 = epsmac; c[i-1] = hh[i-1][i-1]/gamma1; s[i-1] = hh[i][i-1]/gamma1; rs[i] = -s[i-1]*rs[i-1]; rs[i-1] = c[i-1]*rs[i-1]; /* determine residual norm */ hh[i-1][i-1] = c[i-1]*hh[i-1][i-1] + s[i-1]*hh[i][i-1]; rnorm = fabs(rs[i]); } /* now compute solution, first solve upper triangular system */ rs[i-1] = rs[i-1]/hh[i-1][i-1]; for (k = i-2; k >= 0; k--) { t = rs[k]; for (j = k+1; j < i; j++) t -= hh[k][j]*rs[j]; rs[k] = t/hh[k][k]; } for (j = 0; j < i; j++) hypre_ParVectorAxpy(rs[j], z[j], u); /* check for convergence, evaluate actual residual */ hypre_ParVectorCopy(b,p[0]); hypre_ParCSRMatrixMatvec(-1.0, A, u, 1.0, p[0]); rnorm = sqrt(hypre_ParVectorInnerProd(p[0],p[0])); if (mypid == -1) printf("GMRES iter = %d, rnorm = %e\n", iter, rnorm); if (rnorm <= epsilon) break; } /*----------------------------------------------------------------- * clean up *-----------------------------------------------------------------*/ delete [] c; delete [] s; delete [] rs; for (i=0; i < KDim_+1; i++) delete [] hh[i]; delete [] hh; free(p); free(z); return(0); } /****************************************************************************** * set GMRES parameters *---------------------------------------------------------------------------*/ int MLI_Solver_GMRES::setParams( char *paramString, int argc, char **argv ) { char param1[100], param2[100]; sscanf(paramString, "%s", param1); if ( !strcmp(param1, "maxIterations") ) { sscanf(paramString, "%s %d", param1, &maxIterations_); return 0; } else if ( !strcmp(param1, "tolerance") ) { sscanf(paramString, "%s %lg", param1, &tolerance_); return 0; } else if ( !strcmp(param1, "numSweeps") ) { sscanf(paramString, "%s %d", param1, &maxIterations_); return 0; } else if ( !strcmp(param1, "relaxWeight") ) { if ( argc != 2 && argc != 1 ) { printf("MLI_Solver_GMRES::setParams ERROR : needs 1 or 2 args.\n"); return 1; } if ( argc >= 1 ) maxIterations_ = *(int*) argv[0]; return 0; } else if ( !strcmp(param1, "baseMethod") ) { sscanf(paramString, "%s %s", param1, param2); if ( !strcmp(param2, "Jacobi") ) baseMethod_ = MLI_SOLVER_JACOBI_ID; else if ( !strcmp(param2, "BJacobi") ) baseMethod_ = MLI_SOLVER_BJACOBI_ID; else if ( !strcmp(param2, "SGS") ) baseMethod_ = MLI_SOLVER_SGS_ID; else if ( !strcmp(param2, "BSGS") ) baseMethod_ = MLI_SOLVER_BSGS_ID; else if ( !strcmp(param2, "MLI") ) baseMethod_ = MLI_SOLVER_MLI_ID; else baseMethod_ = MLI_SOLVER_BJACOBI_ID; return 0; } else { printf("MLI_Solver_GMRES::setParams - parameter not recognized.\n"); printf(" Params = %s\n", paramString); return 1; } } hypre-2.33.0/src/FEI_mv/femli/mli_solver_gmres.h000066400000000000000000000022521477326011500214460ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #ifndef __MLI_SOLVER_GMRES_H__ #define __MLI_SOLVER_GMRES_H__ #include "mli_matrix.h" #include "mli_vector.h" #include "mli_solver.h" /****************************************************************************** * data structure for the GMRES scheme *---------------------------------------------------------------------------*/ class MLI_Solver_GMRES : public MLI_Solver { MLI_Matrix *Amat_; int maxIterations_; double tolerance_; int KDim_; MLI_Vector *rVec_; MLI_Vector **pVec_; MLI_Vector **zVec_; MLI_Solver *baseSolver_; int baseMethod_; public : MLI_Solver_GMRES(char *name); ~MLI_Solver_GMRES(); int setup(MLI_Matrix *Amat); int solve(MLI_Vector *f, MLI_Vector *u); int setParams( char *paramString, int argc, char **argv ); }; #endif hypre-2.33.0/src/FEI_mv/femli/mli_solver_gs.cxx000066400000000000000000000243221477326011500213170ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include #include "mli_solver_gs.h" #include "_hypre_parcsr_mv.h" /****************************************************************************** * Gauss-Seidel relaxation scheme *****************************************************************************/ /****************************************************************************** * constructor *---------------------------------------------------------------------------*/ MLI_Solver_GS::MLI_Solver_GS(char *name) : MLI_Solver(name) { Amat_ = NULL; nSweeps_ = 1; relaxWeights_ = new double[1]; relaxWeights_[0] = 1.0; zeroInitialGuess_ = 0; } /****************************************************************************** * destructor *---------------------------------------------------------------------------*/ MLI_Solver_GS::~MLI_Solver_GS() { if ( relaxWeights_ != NULL ) delete [] relaxWeights_; relaxWeights_ = NULL; } /****************************************************************************** * set up the smoother *---------------------------------------------------------------------------*/ int MLI_Solver_GS::setup(MLI_Matrix *mat) { Amat_ = mat; return 0; } /****************************************************************************** * apply function *---------------------------------------------------------------------------*/ int MLI_Solver_GS::solve(MLI_Vector *fIn, MLI_Vector *uIn) { hypre_ParCSRMatrix *A; hypre_CSRMatrix *ADiag, *AOffd; int *ADiagI, *ADiagJ, *AOffdI, *AOffdJ; double *ADiagA, *AOffdA, *uData, *fData; int i, j, is, localNRows, relaxError=0; int ii, jj, nprocs, nthreads, start, length; int nSends, extNRows, index, size, ns, ne, rest; double zero = 0.0, relaxWeight, res; double *vBufData; double *vExtData, *tmpData; MPI_Comm comm; hypre_ParCSRCommPkg *commPkg; hypre_ParVector *f, *u; hypre_ParCSRCommHandle *commHandle; /*----------------------------------------------------------------- * fetch machine and smoother parameters *-----------------------------------------------------------------*/ nthreads = hypre_NumThreads(); A = (hypre_ParCSRMatrix *) Amat_->getMatrix(); comm = hypre_ParCSRMatrixComm(A); commPkg = hypre_ParCSRMatrixCommPkg(A); ADiag = hypre_ParCSRMatrixDiag(A); localNRows = hypre_CSRMatrixNumRows(ADiag); ADiagI = hypre_CSRMatrixI(ADiag); ADiagJ = hypre_CSRMatrixJ(ADiag); ADiagA = hypre_CSRMatrixData(ADiag); AOffd = hypre_ParCSRMatrixOffd(A); extNRows = hypre_CSRMatrixNumCols(AOffd); AOffdI = hypre_CSRMatrixI(AOffd); AOffdJ = hypre_CSRMatrixJ(AOffd); AOffdA = hypre_CSRMatrixData(AOffd); u = (hypre_ParVector *) uIn->getVector(); f = (hypre_ParVector *) fIn->getVector(); uData = hypre_VectorData(hypre_ParVectorLocalVector(u)); fData = hypre_VectorData(hypre_ParVectorLocalVector(f)); MPI_Comm_size(comm,&nprocs); /*----------------------------------------------------------------- * setting up for interprocessor communication *-----------------------------------------------------------------*/ vBufData = vExtData = tmpData = NULL; if (nprocs > 1) { nSends = hypre_ParCSRCommPkgNumSends(commPkg); length = hypre_ParCSRCommPkgSendMapStart(commPkg,nSends); if ( length > 0 ) vBufData = new double[length]; if ( extNRows > 0 ) vExtData = new double[extNRows]; } if (nthreads > 1 && localNRows > 0) tmpData = new double[localNRows]; /*----------------------------------------------------------------- * perform GS sweeps *-----------------------------------------------------------------*/ for( is = 0; is < nSweeps_; is++ ) { if ( relaxWeights_ != NULL ) relaxWeight = relaxWeights_[is]; else relaxWeight = 1.0; if (nprocs > 1 && zeroInitialGuess_ != 1 ) { index = 0; for (i = 0; i < nSends; i++) { start = hypre_ParCSRCommPkgSendMapStart(commPkg, i); for (j=start;j 1) { #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i) HYPRE_SMP_SCHEDULE #endif for (i = 0; i < localNRows; i++) tmpData[i] = uData[i]; #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i,ii,j,jj,ns,ne,res,rest,size) HYPRE_SMP_SCHEDULE #endif for (j = 0; j < nthreads; j++) { size = localNRows/nthreads; rest = localNRows - size*nthreads; if (j < rest) { ns = j*size+j; ne = (j+1)*size+j+1; } else { ns = j*size+rest; ne = (j+1)*size+rest; } for (i = ns; i < ne; i++) /* interior points first */ { /*----------------------------------------------------------- * If diagonal is nonzero, relax point i; otherwise, skip it. *-----------------------------------------------------------*/ if ( ADiagA[ADiagI[i]] != zero) { res = fData[i]; for (jj = ADiagI[i]; jj < ADiagI[i+1]; jj++) { ii = ADiagJ[jj]; if (ii >= ns && ii < ne) res -= ADiagA[jj] * uData[ii]; else res -= ADiagA[jj] * tmpData[ii]; } for (jj = AOffdI[i]; jj < AOffdI[i+1]; jj++) { ii = AOffdJ[jj]; res -= AOffdA[jj] * vExtData[ii]; } uData[i] += relaxWeight * (res / ADiagA[ADiagI[i]]); } } } } else { for (i = 0; i < localNRows; i++) /* interior points first */ { /*----------------------------------------------------------- * If diagonal is nonzero, relax point i; otherwise, skip it. *-----------------------------------------------------------*/ if ( ADiagA[ADiagI[i]] != zero) { res = fData[i]; for (jj = ADiagI[i]; jj < ADiagI[i+1]; jj++) { ii = ADiagJ[jj]; res -= ADiagA[jj] * uData[ii]; } for (jj = AOffdI[i]; jj < AOffdI[i+1]; jj++) { ii = AOffdJ[jj]; res -= AOffdA[jj] * vExtData[ii]; } uData[i] += relaxWeight * (res / ADiagA[ADiagI[i]]); } } } zeroInitialGuess_ = 0; } /*----------------------------------------------------------------- * clean up and return *-----------------------------------------------------------------*/ if ( vExtData != NULL ) delete [] vExtData; if ( vBufData != NULL ) delete [] vBufData; if ( tmpData != NULL ) delete [] tmpData; return(relaxError); } /****************************************************************************** * set parameters *---------------------------------------------------------------------------*/ int MLI_Solver_GS::setParams(char *paramString, int argc, char **argv) { int i; double *weights=NULL; if ( !strcmp(paramString, "numSweeps") ) { if ( argc == 1 ) nSweeps_ = *(int*) argv[0]; if ( nSweeps_ < 1 ) nSweeps_ = 1; return 0; } else if ( !strcmp(paramString, "relaxWeight") ) { if ( argc != 2 && argc != 1 ) { printf("MLI_Solver_GS::setParams ERROR : needs 1 or 2 args.\n"); return 1; } if ( argc >= 1 ) nSweeps_ = *(int*) argv[0]; if ( argc == 2 ) weights = (double*) argv[1]; if ( nSweeps_ < 1 ) nSweeps_ = 1; if ( relaxWeights_ != NULL ) delete [] relaxWeights_; relaxWeights_ = NULL; if ( weights != NULL ) { relaxWeights_ = new double[nSweeps_]; for ( i = 0; i < nSweeps_; i++ ) { if ( weights[i] > 0.0 ) relaxWeights_[i] = weights[i]; else relaxWeights_[i] = 1.0; } } } else if ( strcmp(paramString, "zeroInitialGuess") ) { printf("MLI_Solver_GS::setParams - parameter not recognized.\n"); printf(" Params = %s\n", paramString); return 1; } return 0; } /****************************************************************************** * set parameters *---------------------------------------------------------------------------*/ int MLI_Solver_GS::setParams( int ntimes, double *weights ) { int i, nsweeps=0; if ( ntimes <= 0 ) { printf("MLI_Solver_GS::setParams WARNING : nsweeps set to 1.\n"); nsweeps = 1; } nSweeps_ = nsweeps; if ( relaxWeights_ != NULL ) delete [] relaxWeights_; relaxWeights_ = new double[ntimes]; if ( weights == NULL ) { printf("MLI_Solver_GS::setParams - relaxWeights set to 0.5.\n"); for ( i = 0; i < nsweeps; i++ ) relaxWeights_[i] = 0.5; } else { for ( i = 0; i < nsweeps; i++ ) { if (weights[i] >= 0. && weights[i] <= 2.) relaxWeights_[i] = weights[i]; else { printf("MLI_Solver_GS::setParams - some weights set to 1.0.\n"); relaxWeights_[i] = 1.0; } } } return 0; } hypre-2.33.0/src/FEI_mv/femli/mli_solver_gs.h000066400000000000000000000022321477326011500207400ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #ifndef __MLI_SOLVER_GS_H__ #define __MLI_SOLVER_GS_H__ #include #include "_hypre_parcsr_mv.h" #include "mli_matrix.h" #include "mli_vector.h" #include "mli_solver.h" /****************************************************************************** * data structure for the Gauss Seidel relaxation scheme *---------------------------------------------------------------------------*/ class MLI_Solver_GS : public MLI_Solver { MLI_Matrix *Amat_; int nSweeps_; double *relaxWeights_; int zeroInitialGuess_; public : MLI_Solver_GS(char *name); ~MLI_Solver_GS(); int setup(MLI_Matrix *Amat); int solve(MLI_Vector *f, MLI_Vector *u); int setParams(char *paramString, int argc, char **argv); int setParams(int ntimes, double *relax_weights); }; #endif hypre-2.33.0/src/FEI_mv/femli/mli_solver_hschwarz.cxx000066400000000000000000000131521477326011500225360ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include #include #include "_hypre_parcsr_mv.h" #include "_hypre_parcsr_ls.h" #include "par_amg.h" #include "mli_solver_hschwarz.h" /****************************************************************************** * symmetric Gauss-Seidel relaxation scheme in BoomerAMG *****************************************************************************/ /****************************************************************************** * constructor *---------------------------------------------------------------------------*/ MLI_Solver_HSchwarz::MLI_Solver_HSchwarz(char *name) : MLI_Solver(name) { Amat_ = NULL; nSweeps_ = 1; relaxWeight_ = 1.0; mliVec_ = NULL; blkSize_ = 3; printRNorm_ = 0; smoother_ = NULL; } /****************************************************************************** * destructor *---------------------------------------------------------------------------*/ MLI_Solver_HSchwarz::~MLI_Solver_HSchwarz() { if ( mliVec_ != NULL ) delete mliVec_; if ( smoother_ != NULL ) HYPRE_SchwarzDestroy( smoother_ ); } /****************************************************************************** * set up the smoother *---------------------------------------------------------------------------*/ int MLI_Solver_HSchwarz::setup(MLI_Matrix *mat) { Amat_ = mat; mliVec_ = Amat_->createVector(); calcOmega(); return 0; } /****************************************************************************** * apply function *---------------------------------------------------------------------------*/ int MLI_Solver_HSchwarz::solve(MLI_Vector *fIn, MLI_Vector *uIn) { HYPRE_ParCSRMatrix A; HYPRE_ParVector u, f; A = (HYPRE_ParCSRMatrix) Amat_->getMatrix(); u = (HYPRE_ParVector) uIn->getVector(); f = (HYPRE_ParVector) fIn->getVector(); HYPRE_SchwarzSolve(smoother_, A, f, u); return 0; } /****************************************************************************** * set SGS parameters *---------------------------------------------------------------------------*/ int MLI_Solver_HSchwarz::setParams( char *paramString, int argc, char **argv ) { double *weights=NULL; char param1[100]; sscanf(paramString, "%s", param1); if ( !strcmp(param1, "numSweeps") ) { if ( argc != 1 ) { printf("MLI_Solver_HSchwarz::setParams ERROR : needs 1 arg.\n"); return 1; } nSweeps_ = *(int*) argv[0]; if ( nSweeps_ < 1 ) nSweeps_ = 1; relaxWeight_ = 1; return 0; } else if ( !strcmp(param1, "relaxWeight") ) { if ( argc != 2 && argc != 1 ) { printf("MLI_Solver_HSchwarz::setParams ERROR : needs 1 or 2 args.\n"); return 1; } if ( argc >= 1 ) nSweeps_ = *(int*) argv[0]; if ( argc == 2 ) weights = (double*) argv[1]; if ( nSweeps_ < 1 ) nSweeps_ = 1; if ( weights != NULL ) relaxWeight_ = weights[0]; } else if ( !strcmp(param1, "printRNorm") ) { printRNorm_ = 1; } else if ( !strcmp(param1, "blkSize") ) { sscanf(paramString, "%s %d", param1, &blkSize_); if ( blkSize_ < 1 ) blkSize_ = 1; } else { printf("MLI_Solver_HSchwarz::setParams - parameter not recognized.\n"); printf(" Params = %s\n", paramString); return 1; } return 0; } /****************************************************************************** * calculate relax weight *---------------------------------------------------------------------------*/ int MLI_Solver_HSchwarz::calcOmega() { int relaxType=6, relaxTypes[2], level=0, numCGSweeps=10; int one=1, zero=0; double dOne=1.0; hypre_ParCSRMatrix *A; hypre_ParVector *vTemp; hypre_ParAMGData *amgData; HYPRE_Solver *smoother; A = (hypre_ParCSRMatrix *) Amat_->getMatrix(); amgData = (hypre_ParAMGData *) hypre_BoomerAMGCreate(); amgData->A_array = new hypre_ParCSRMatrix*[1]; amgData->A_array[0] = A; amgData->CF_marker_array = new int*[1]; amgData->CF_marker_array[0] = NULL; relaxTypes[0] = 0; relaxTypes[1] = relaxType; amgData->grid_relax_type = relaxTypes; vTemp = (hypre_ParVector *) mliVec_->getVector(); amgData->Vtemp = vTemp; amgData->smooth_type = relaxType; amgData->smooth_num_levels = 1; amgData->smooth_num_sweeps = one; smoother = hypre_CTAlloc(HYPRE_Solver, one, HYPRE_MEMORY_HOST); amgData->smoother = smoother; HYPRE_SchwarzCreate(&smoother[0]); HYPRE_SchwarzSetNumFunctions(smoother[0], blkSize_); HYPRE_SchwarzSetVariant(smoother[0], zero); HYPRE_SchwarzSetOverlap(smoother[0], zero); HYPRE_SchwarzSetDomainType(smoother[0], one); HYPRE_SchwarzSetRelaxWeight(smoother[0], dOne); if (relaxWeight_ >= 1.0) hypre_BoomerAMGCGRelaxWt((void *)amgData,level,numCGSweeps,&relaxWeight_); //printf("HSchwarz : relaxWt = %e (%d)\n", relaxWeight_, blkSize_); HYPRE_SchwarzSetRelaxWeight(smoother[0], relaxWeight_); HYPRE_SchwarzSetup(smoother[0], (HYPRE_ParCSRMatrix) A, (HYPRE_ParVector) vTemp, (HYPRE_ParVector) vTemp); smoother_ = smoother[0]; hypre_TFree(amgData, HYPRE_MEMORY_HOST); delete [] amgData->A_array; delete [] amgData->CF_marker_array; return 0; } hypre-2.33.0/src/FEI_mv/femli/mli_solver_hschwarz.h000066400000000000000000000023641477326011500221660ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #ifndef __MLI_SOLVER_HSCHWARZ_H__ #define __MLI_SOLVER_HSCHWARZ_H__ #include #include "_hypre_parcsr_ls.h" #include "_hypre_parcsr_mv.h" #include "mli_matrix.h" #include "mli_vector.h" #include "mli_solver.h" /****************************************************************************** * data structure for the Schwarz relaxation scheme *---------------------------------------------------------------------------*/ class MLI_Solver_HSchwarz : public MLI_Solver { MLI_Matrix *Amat_; int nSweeps_; int printRNorm_; int blkSize_; double relaxWeight_; MLI_Vector *mliVec_; HYPRE_Solver smoother_; public : MLI_Solver_HSchwarz(char *name); ~MLI_Solver_HSchwarz(); int setup(MLI_Matrix *Amat); int solve(MLI_Vector *f, MLI_Vector *u); int setParams(char *param, int argc, char **argv); int calcOmega(); }; #endif hypre-2.33.0/src/FEI_mv/femli/mli_solver_hsgs.cxx000066400000000000000000000134201477326011500216470ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include #include #include "_hypre_parcsr_mv.h" #include "_hypre_parcsr_ls.h" #include "par_amg.h" #include "mli_solver_hsgs.h" /****************************************************************************** * symmetric Gauss-Seidel relaxation scheme in BoomerAMG *****************************************************************************/ /****************************************************************************** * constructor *---------------------------------------------------------------------------*/ MLI_Solver_HSGS::MLI_Solver_HSGS(char *name) : MLI_Solver(name) { Amat_ = NULL; nSweeps_ = 1; relaxWeights_ = 1.0; relaxOmega_ = 1.0; mliVec_ = NULL; calcOmega_ = 1; } /****************************************************************************** * destructor *---------------------------------------------------------------------------*/ MLI_Solver_HSGS::~MLI_Solver_HSGS() { if (mliVec_ != NULL) delete mliVec_; mliVec_ = NULL; } /****************************************************************************** * set up the smoother *---------------------------------------------------------------------------*/ int MLI_Solver_HSGS::setup(MLI_Matrix *mat) { Amat_ = mat; if (mliVec_ != NULL) delete mliVec_; mliVec_ = Amat_->createVector(); if (calcOmega_ == 1) calcOmega(); return 0; } /****************************************************************************** * apply function *---------------------------------------------------------------------------*/ int MLI_Solver_HSGS::solve(MLI_Vector *fIn, MLI_Vector *uIn) { int relaxType=6, relaxPts=0, iS; hypre_ParCSRMatrix *A; hypre_ParVector *f, *u, *vTemp; hypre_ParVector *zTemp = NULL; //int mypid; //double rnorm; //MPI_Comm comm; /*----------------------------------------------------------------- * fetch machine and smoother parameters *-----------------------------------------------------------------*/ A = (hypre_ParCSRMatrix *) Amat_->getMatrix(); u = (hypre_ParVector *) uIn->getVector(); f = (hypre_ParVector *) fIn->getVector(); vTemp = (hypre_ParVector *) mliVec_->getVector(); /* AB: need an extra vector for threading */ if (hypre_NumThreads() > 1) { zTemp = hypre_ParVectorCreate(hypre_ParCSRMatrixComm(A), hypre_ParCSRMatrixGlobalNumRows(A), hypre_ParCSRMatrixRowStarts(A)); hypre_ParVectorInitialize(zTemp); } //comm = hypre_ParCSRMatrixComm(A); //MPI_Comm_rank(comm, &mypid); for (iS = 0; iS < nSweeps_; iS++) { hypre_BoomerAMGRelax(A,f,NULL,relaxType,relaxPts,relaxWeights_, relaxOmega_,NULL,u,vTemp, zTemp); //hypre_ParVectorCopy( f, vTemp ); //hypre_ParCSRMatrixMatvec( -1.0, A, u, 1.0, vTemp ); //rnorm = sqrt(hypre_ParVectorInnerProd( vTemp, vTemp )); //if ( mypid == 0 ) // printf("\tMLI_Solver_HSGS iter = %4d, rnorm = %e (omega=%e)\n", // iS, rnorm, relaxWeights_); } if (zTemp) hypre_ParVectorDestroy(zTemp); return 0; } /****************************************************************************** * set SGS parameters *---------------------------------------------------------------------------*/ int MLI_Solver_HSGS::setParams(char *paramString, int argc, char **argv) { double *weights=NULL; char param1[100]; sscanf(paramString, "%s", param1); if (!strcmp(param1, "numSweeps")) { if ( argc != 1 ) { printf("MLI_Solver_HSGS::setParams ERROR : needs 1 arg.\n"); return 1; } nSweeps_ = *(int*) argv[0]; if ( nSweeps_ < 1 ) nSweeps_ = 1; return 0; } else if ( !strcmp(param1, "relaxWeight") ) { if ( argc != 2 && argc != 1 ) { printf("MLI_Solver_HSGS::setParams ERROR : needs 1 or 2 args.\n"); return 1; } if ( argc >= 1 ) nSweeps_ = *(int*) argv[0]; if ( argc == 2 ) weights = (double*) argv[1]; if ( nSweeps_ < 1 ) nSweeps_ = 1; if ( weights != NULL ) relaxWeights_ = weights[0]; } else if ( !strcmp(param1, "calcOmega") ) { calcOmega_ = 1; } else return 1; return 0; } /****************************************************************************** * calculate relax weight *---------------------------------------------------------------------------*/ int MLI_Solver_HSGS::calcOmega() { int relaxType=6, relaxTypes[2], level=0, numCGSweeps=10; hypre_ParCSRMatrix *A; hypre_ParVector *vTemp; hypre_ParAMGData *amgData; A = (hypre_ParCSRMatrix *) Amat_->getMatrix(); amgData = (hypre_ParAMGData *) hypre_BoomerAMGCreate(); amgData->CF_marker_array = new int*[1]; amgData->CF_marker_array[0] = NULL; amgData->A_array = new hypre_ParCSRMatrix*[1]; amgData->A_array[0] = A; vTemp = (hypre_ParVector *) mliVec_->getVector(); amgData->Vtemp = vTemp; relaxTypes[0] = 0; relaxTypes[1] = relaxType; amgData->grid_relax_type = relaxTypes; amgData->smooth_num_levels = 0; amgData->smooth_type = 0; hypre_BoomerAMGCGRelaxWt((void *) amgData,level,numCGSweeps,&relaxOmega_); //printf("HYPRE/FEI/MLI HSGS : relaxOmega = %e\n", relaxOmega_); delete [] amgData->A_array; delete [] amgData->CF_marker_array; hypre_TFree(amgData, HYPRE_MEMORY_HOST); return 0; } hypre-2.33.0/src/FEI_mv/femli/mli_solver_hsgs.h000066400000000000000000000024061477326011500212760ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #ifndef __MLI_SOLVER_HSGS_H__ #define __MLI_SOLVER_HSGS_H__ #include #include "_hypre_parcsr_mv.h" #include "mli_matrix.h" #include "mli_vector.h" #include "mli_solver.h" /****************************************************************************** * data structure for the symmetric Gauss Seidel relaxation scheme *---------------------------------------------------------------------------*/ class MLI_Solver_HSGS : public MLI_Solver { MLI_Matrix *Amat_; int nSweeps_; // The private field below appears to be unused // int printRNorm_; int calcOmega_; double relaxWeights_; double relaxOmega_; MLI_Vector *mliVec_; public : MLI_Solver_HSGS(char *name); ~MLI_Solver_HSGS(); int setup(MLI_Matrix *Amat); int solve(MLI_Vector *f, MLI_Vector *u); int setParams(char *param, int argc, char **argv); int calcOmega(); }; #endif hypre-2.33.0/src/FEI_mv/femli/mli_solver_jacobi.cxx000066400000000000000000000331451477326011500221400ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include #include #include #include "mli_utils.h" #include "mli_solver_jacobi.h" /****************************************************************************** * constructor *---------------------------------------------------------------------------*/ MLI_Solver_Jacobi::MLI_Solver_Jacobi(char *name) : MLI_Solver(name) { Amat_ = NULL; nSweeps_ = 1; relaxWeights_ = new double[1]; relaxWeights_[0] = 0.0; zeroInitialGuess_ = 0; diagonal_ = NULL; auxVec_ = NULL; auxVec2_ = NULL; auxVec3_ = NULL; maxEigen_ = 0.0; numFpts_ = 0; FptList_ = NULL; ownAmat_ = 0; modifiedD_ = 0; } /****************************************************************************** * destructor *---------------------------------------------------------------------------*/ MLI_Solver_Jacobi::~MLI_Solver_Jacobi() { if ( relaxWeights_ != NULL ) delete [] relaxWeights_; if ( diagonal_ != NULL ) delete [] diagonal_; if ( auxVec_ != NULL ) delete auxVec_; if ( auxVec2_ != NULL ) delete auxVec2_; if ( auxVec3_ != NULL ) delete auxVec3_; if ( FptList_ != NULL ) delete FptList_; if ( ownAmat_ == 1 ) delete Amat_; } /****************************************************************************** * set up the smoother *---------------------------------------------------------------------------*/ int MLI_Solver_Jacobi::setup(MLI_Matrix *Amat) { int i, globalNRows, *partition, *ADiagI, *ADiagJ; int j, localNRows, status; double *ADiagA, *ritzValues; char *paramString; MPI_Comm comm; hypre_ParCSRMatrix *A; hypre_CSRMatrix *ADiag; hypre_ParVector *hypreVec; MLI_Function *funcPtr; /*----------------------------------------------------------------- * fetch machine and matrix parameters *-----------------------------------------------------------------*/ Amat_ = Amat; A = (hypre_ParCSRMatrix *) Amat_->getMatrix(); comm = hypre_ParCSRMatrixComm(A); ADiag = hypre_ParCSRMatrixDiag(A); ADiagI = hypre_CSRMatrixI(ADiag); ADiagJ = hypre_CSRMatrixJ(ADiag); ADiagA = hypre_CSRMatrixData(ADiag); localNRows = hypre_CSRMatrixNumRows(ADiag); globalNRows = hypre_ParCSRMatrixGlobalNumRows( A ); /*----------------------------------------------------------------- * extract and store matrix diagonal *-----------------------------------------------------------------*/ if ( localNRows > 0 ) diagonal_ = new double[localNRows]; for ( i = 0; i < localNRows; i++ ) { diagonal_[i] = 0.0; for ( j = ADiagI[i]; j < ADiagI[i+1]; j++ ) { if ( ADiagJ[j] == i && ADiagA[j] != 0.0 ) { diagonal_[i] = ADiagA[j]; break; } } if ((modifiedD_ & 1) == 1) { if (diagonal_[i] > 0) { for ( j = ADiagI[i]; j < ADiagI[i+1]; j++ ) { if ( ADiagJ[j] != i && ADiagA[j] > 0.0 ) diagonal_[i] += ADiagA[j]; } } else { for ( j = ADiagI[i]; j < ADiagI[i+1]; j++ ) { if ( ADiagJ[j] != i && ADiagA[j] < 0.0 ) diagonal_[i] += ADiagA[j]; } } } diagonal_[i] = 1.0 / diagonal_[i]; } /*----------------------------------------------------------------- * create temporary vector *-----------------------------------------------------------------*/ funcPtr = hypre_TAlloc( MLI_Function , 1, HYPRE_MEMORY_HOST); MLI_Utils_HypreParVectorGetDestroyFunc(funcPtr); paramString = new char[20]; strcpy( paramString, "HYPRE_ParVector" ); HYPRE_ParCSRMatrixGetRowPartitioning((HYPRE_ParCSRMatrix) A, &partition); hypreVec = hypre_ParVectorCreate(comm, globalNRows, partition); hypre_ParVectorInitialize(hypreVec); auxVec_ = new MLI_Vector(hypreVec, paramString, funcPtr); HYPRE_ParCSRMatrixGetRowPartitioning((HYPRE_ParCSRMatrix) A, &partition); hypreVec = hypre_ParVectorCreate(comm, globalNRows, partition); hypre_ParVectorInitialize(hypreVec); auxVec2_ = new MLI_Vector(hypreVec, paramString, funcPtr); HYPRE_ParCSRMatrixGetRowPartitioning((HYPRE_ParCSRMatrix) A, &partition); hypreVec = hypre_ParVectorCreate(comm, globalNRows, partition); hypre_ParVectorInitialize(hypreVec); auxVec3_ = new MLI_Vector(hypreVec, paramString, funcPtr); delete [] paramString; free( funcPtr ); /*----------------------------------------------------------------- * compute spectral radius of A *-----------------------------------------------------------------*/ if (maxEigen_ == 0.0 && (relaxWeights_ == NULL || relaxWeights_[0] == 0.0)) { ritzValues = new double[2]; status = MLI_Utils_ComputeExtremeRitzValues(A, ritzValues, 1); if ( status != 0 ) MLI_Utils_ComputeMatrixMaxNorm(A, ritzValues, 1); maxEigen_ = ritzValues[0]; delete [] ritzValues; } if ( relaxWeights_ == NULL ) relaxWeights_ = new double[nSweeps_]; if (maxEigen_ != 0.0) { for (i = 0; i < nSweeps_; i++) relaxWeights_[i] = 1.0 / maxEigen_; } return 0; } /****************************************************************************** * apply function *---------------------------------------------------------------------------*/ int MLI_Solver_Jacobi::solve(MLI_Vector *fIn, MLI_Vector *uIn) { int i, j, is, localNRows, *ADiagI, *ADiagJ, index; double *rData, *uData, weight, *f2Data, *u2Data, *fData; double *ADiagA, dtemp, coeff; hypre_ParCSRMatrix *A; hypre_CSRMatrix *ADiag; hypre_ParVector *f, *u, *r, *f2, *u2; /*----------------------------------------------------------------- * fetch machine and matrix parameters *-----------------------------------------------------------------*/ A = (hypre_ParCSRMatrix *) Amat_->getMatrix(); ADiag = hypre_ParCSRMatrixDiag(A); localNRows = hypre_CSRMatrixNumRows(ADiag); f = (hypre_ParVector *) fIn->getVector(); u = (hypre_ParVector *) uIn->getVector(); r = (hypre_ParVector *) auxVec_->getVector(); rData = hypre_VectorData(hypre_ParVectorLocalVector(r)); uData = hypre_VectorData(hypre_ParVectorLocalVector(u)); ADiagI = hypre_CSRMatrixI(ADiag); ADiagJ = hypre_CSRMatrixJ(ADiag); ADiagA = hypre_CSRMatrixData(ADiag); /*----------------------------------------------------------------- * loop *-----------------------------------------------------------------*/ if (numFpts_ == 0) { for ( is = 0; is < nSweeps_; is++ ) { weight = relaxWeights_[is]; hypre_ParVectorCopy(f, r); if ( zeroInitialGuess_ == 0 ) { if ((modifiedD_ & 2) == 0) hypre_ParCSRMatrixMatvec(-1.0, A, u, 1.0, r); else { for ( i = 0; i < localNRows; i++ ) { dtemp = rData[i]; for ( j = ADiagI[i]; j < ADiagI[i+1]; j++ ) { index = ADiagJ[j]; coeff = ADiagA[j]; if (coeff*diagonal_[i] < 0.0) dtemp -= coeff * uData[index]; else dtemp -= coeff * uData[i]; } rData[i] = dtemp; } } } #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i) HYPRE_SMP_SCHEDULE #endif for ( i = 0; i < localNRows; i++ ) uData[i] += weight * rData[i] * diagonal_[i]; zeroInitialGuess_ = 0; } } else { if (numFpts_ != localNRows) { printf("MLI_Solver_Jacobi::solve ERROR : length mismatch.\n"); exit(1); } f2 = (hypre_ParVector *) auxVec2_->getVector(); u2 = (hypre_ParVector *) auxVec3_->getVector(); fData = hypre_VectorData(hypre_ParVectorLocalVector(f)); f2Data = hypre_VectorData(hypre_ParVectorLocalVector(f2)); u2Data = hypre_VectorData(hypre_ParVectorLocalVector(u2)); for (i = 0; i < numFpts_; i++) f2Data[i] = fData[FptList_[i]]; for (i = 0; i < numFpts_; i++) u2Data[i] = uData[FptList_[i]]; for ( is = 0; is < nSweeps_; is++ ) { weight = relaxWeights_[is]; hypre_ParVectorCopy(f2, r); if ( zeroInitialGuess_ == 0 ) hypre_ParCSRMatrixMatvec(-1.0, A, u2, 1.0, r); #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i) HYPRE_SMP_SCHEDULE #endif for ( i = 0; i < localNRows; i++ ) u2Data[i] += weight * rData[i] * diagonal_[i]; zeroInitialGuess_ = 0; } for (i = 0; i < numFpts_; i++) uData[FptList_[i]] = u2Data[i]; } return 0; } /****************************************************************************** * set Jacobi parameters *---------------------------------------------------------------------------*/ int MLI_Solver_Jacobi::setParams( char *paramString, int argc, char **argv ) { int i, *fList; double *weights=NULL; if ( !strcmp(paramString, "numSweeps") ) { if ( argc != 1 ) { printf("MLI_Solver_Jacobi::setParams ERROR : needs 1 arg.\n"); return 1; } nSweeps_ = *(int*) argv[0]; if ( nSweeps_ < 1 ) nSweeps_ = 1; if ( relaxWeights_ != NULL ) delete [] relaxWeights_; relaxWeights_ = NULL; return 0; } else if ( !strcmp(paramString, "setMaxEigen") ) { if ( argc != 1 ) { printf("MLI_Solver_Jacobi::setParams ERROR : needs 1 arg.\n"); return 1; } maxEigen_ = *(double*) argv[0]; return 0; } else if ( !strcmp(paramString, "relaxWeight") ) { if ( argc != 2 && argc != 1 ) { printf("MLI_Solver_Jacobi::setParams ERROR : needs 1 or 2 args.\n"); return 1; } if ( argc >= 1 ) nSweeps_ = *(int*) argv[0]; if ( argc == 2 ) weights = (double*) argv[1]; if ( nSweeps_ < 1 ) nSweeps_ = 1; if ( relaxWeights_ != NULL ) delete [] relaxWeights_; relaxWeights_ = NULL; if ( weights != NULL ) { relaxWeights_ = new double[nSweeps_]; for ( i = 0; i < nSweeps_; i++ ) relaxWeights_[i] = weights[i]; } } else if ( !strcmp(paramString, "zeroInitialGuess") ) { zeroInitialGuess_ = 1; return 0; } else if ( !strcmp(paramString, "setModifiedDiag") ) { modifiedD_ |= 1; return 0; } else if ( !strcmp(paramString, "useModifiedDiag") ) { modifiedD_ |= 2; return 0; } else if ( !strcmp(paramString, "setFptList") ) { if ( argc != 2 ) { printf("MLI_Solver_Jacobi::setParams ERROR : needs 2 args.\n"); return 1; } numFpts_ = *(int*) argv[0]; fList = (int*) argv[1]; if ( FptList_ != NULL ) delete [] FptList_; FptList_ = NULL; if (numFpts_ <= 0) return 0; FptList_ = new int[numFpts_];; for ( i = 0; i < numFpts_; i++ ) FptList_[i] = fList[i]; return 0; } else if ( !strcmp(paramString, "ownAmat") ) { ownAmat_ = 1; return 0; } #if 0 else { printf("MLI_Solver_Jacobi::setParams - parameter not recognized.\n"); printf(" Params = %s\n", paramString); return 1; } #endif return 0; } /****************************************************************************** * set Jacobi parameters *---------------------------------------------------------------------------*/ int MLI_Solver_Jacobi::setParams( int ntimes, double *weights ) { int i, nsweeps; nsweeps = ntimes; if ( ntimes <= 0 ) { printf("MLI_Solver_Jacobi::setParams WARNING : nSweeps set to 1.\n"); nsweeps = 1; } nSweeps_ = nsweeps; if ( relaxWeights_ != NULL ) delete [] relaxWeights_; relaxWeights_ = new double[nsweeps]; if ( weights == NULL ) { printf("MLI_Solver_Jacobi::setParams - relaxWeights set to 0.0.\n"); for ( i = 0; i < nsweeps; i++ ) relaxWeights_[i] = 0.0; } else { for ( i = 0; i < nsweeps; i++ ) { if (weights[i] >= 0. && weights[i] <= 2.) relaxWeights_[i] = weights[i]; else { printf("MLI_Solver_Jacobi::setParams - weights set to 0.0.\n"); relaxWeights_[i] = 0.0; } } } return 0; } /****************************************************************************** * get Jacobi parameters *---------------------------------------------------------------------------*/ int MLI_Solver_Jacobi::getParams( char *paramString, int *argc, char **argv ) { double *ddata, *ritzValues; if ( !strcmp(paramString, "getMaxEigen") ) { if ( maxEigen_ == 0.0 ) { ritzValues = new double[2]; MLI_Utils_ComputeExtremeRitzValues((hypre_ParCSRMatrix *) Amat_->getMatrix(), ritzValues, 1); maxEigen_ = ritzValues[0]; delete [] ritzValues; } ddata = (double *) argv[0]; ddata[0] = maxEigen_; *argc = 1; return 0; } else return -1; } hypre-2.33.0/src/FEI_mv/femli/mli_solver_jacobi.h000066400000000000000000000026751477326011500215710ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #ifndef __MLI_SOLVER_JACOBI_H__ #define __MLI_SOLVER_JACOBI_H__ #include #include "mli_matrix.h" #include "mli_vector.h" #include "mli_solver.h" /****************************************************************************** * data structure for the Damped Jacobi relaxation scheme *---------------------------------------------------------------------------*/ class MLI_Solver_Jacobi : public MLI_Solver { MLI_Matrix *Amat_; int nSweeps_; double *relaxWeights_; double *diagonal_; double maxEigen_; MLI_Vector *auxVec_; MLI_Vector *auxVec2_; MLI_Vector *auxVec3_; int zeroInitialGuess_; int numFpts_; int *FptList_; int ownAmat_; int modifiedD_; public : MLI_Solver_Jacobi(char *name); ~MLI_Solver_Jacobi(); int setup(MLI_Matrix *Amat); int solve(MLI_Vector *f, MLI_Vector *u); int setParams( char *paramString, int argc, char **argv ); int setParams( int ntimes, double *relax_weights ); int getParams( char *paramString, int *argc, char **argv ); }; #endif hypre-2.33.0/src/FEI_mv/femli/mli_solver_kaczmarz.cxx000066400000000000000000000201101477326011500225170ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include #include "mli_solver_kaczmarz.h" #include "_hypre_parcsr_mv.h" /****************************************************************************** * Kaczmarz relaxation scheme *****************************************************************************/ /****************************************************************************** * constructor *---------------------------------------------------------------------------*/ MLI_Solver_Kaczmarz::MLI_Solver_Kaczmarz(char *name) : MLI_Solver(name) { Amat_ = NULL; nSweeps_ = 1; AsqDiag_ = NULL; zeroInitialGuess_ = 0; } /****************************************************************************** * destructor *---------------------------------------------------------------------------*/ MLI_Solver_Kaczmarz::~MLI_Solver_Kaczmarz() { if ( AsqDiag_ != NULL ) delete [] AsqDiag_; AsqDiag_ = NULL; } /****************************************************************************** * set up the smoother *---------------------------------------------------------------------------*/ int MLI_Solver_Kaczmarz::setup(MLI_Matrix *mat) { int irow, jcol, localNRows, *ADiagI, *AOffdI; double *ADiagA, *AOffdA, rowNorm; hypre_ParCSRMatrix *A; hypre_CSRMatrix *ADiag, *AOffd; Amat_ = mat; A = (hypre_ParCSRMatrix *) Amat_->getMatrix(); ADiag = hypre_ParCSRMatrixDiag(A); AOffd = hypre_ParCSRMatrixOffd(A); localNRows = hypre_CSRMatrixNumRows(ADiag); ADiagI = hypre_CSRMatrixI(ADiag); ADiagA = hypre_CSRMatrixData(ADiag); AOffdI = hypre_CSRMatrixI(AOffd); AOffdA = hypre_CSRMatrixData(AOffd); if ( AsqDiag_ != NULL ) delete [] AsqDiag_; AsqDiag_ = new double[localNRows]; for ( irow = 0; irow < localNRows; irow++ ) { rowNorm = 0.0; for ( jcol = ADiagI[irow]; jcol < ADiagI[irow+1]; jcol++ ) rowNorm += (ADiagA[jcol] * ADiagA[jcol]); for ( jcol = AOffdI[irow]; jcol < AOffdI[irow+1]; jcol++ ) rowNorm += (AOffdA[jcol] * AOffdA[jcol]); if ( rowNorm != 0.0 ) AsqDiag_[irow] = 1.0 / rowNorm; else AsqDiag_[irow] = 1.0; } return 0; } /****************************************************************************** * apply function *---------------------------------------------------------------------------*/ int MLI_Solver_Kaczmarz::solve(MLI_Vector *fIn, MLI_Vector *uIn) { hypre_ParCSRMatrix *A; hypre_CSRMatrix *ADiag, *AOffd; int *ADiagI, *ADiagJ, *AOffdI, *AOffdJ; double *ADiagA, *AOffdA, *uData, *fData; int irow, jcol, is, localNRows, retFlag=0, nprocs, start; int nSends, extNRows, index, endp1; double *vBufData, *vExtData, res; MPI_Comm comm; hypre_ParCSRCommPkg *commPkg; hypre_ParVector *f, *u; hypre_ParCSRCommHandle *commHandle; /*----------------------------------------------------------------- * fetch machine and smoother parameters *-----------------------------------------------------------------*/ A = (hypre_ParCSRMatrix *) Amat_->getMatrix(); comm = hypre_ParCSRMatrixComm(A); commPkg = hypre_ParCSRMatrixCommPkg(A); ADiag = hypre_ParCSRMatrixDiag(A); localNRows = hypre_CSRMatrixNumRows(ADiag); ADiagI = hypre_CSRMatrixI(ADiag); ADiagJ = hypre_CSRMatrixJ(ADiag); ADiagA = hypre_CSRMatrixData(ADiag); AOffd = hypre_ParCSRMatrixOffd(A); extNRows = hypre_CSRMatrixNumCols(AOffd); AOffdI = hypre_CSRMatrixI(AOffd); AOffdJ = hypre_CSRMatrixJ(AOffd); AOffdA = hypre_CSRMatrixData(AOffd); u = (hypre_ParVector *) uIn->getVector(); f = (hypre_ParVector *) fIn->getVector(); uData = hypre_VectorData(hypre_ParVectorLocalVector(u)); fData = hypre_VectorData(hypre_ParVectorLocalVector(f)); MPI_Comm_size(comm,&nprocs); /*----------------------------------------------------------------- * setting up for interprocessor communication *-----------------------------------------------------------------*/ if (nprocs > 1) { nSends = hypre_ParCSRCommPkgNumSends(commPkg); vBufData = new double[hypre_ParCSRCommPkgSendMapStart(commPkg,nSends)]; vExtData = new double[extNRows]; for ( irow = 0; irow < extNRows; irow++ ) vExtData[irow] = 0.0; } /*----------------------------------------------------------------- * perform Kaczmarz sweeps *-----------------------------------------------------------------*/ for( is = 0; is < nSweeps_; is++ ) { if (nprocs > 1 && zeroInitialGuess_ != 1 ) { index = 0; for (irow = 0; irow < nSends; irow++) { start = hypre_ParCSRCommPkgSendMapStart(commPkg, irow); endp1 = hypre_ParCSRCommPkgSendMapStart(commPkg,irow+1); for ( jcol = start; jcol < endp1; jcol++ ) vBufData[index++] = uData[hypre_ParCSRCommPkgSendMapElmt(commPkg,jcol)]; } commHandle = hypre_ParCSRCommHandleCreate(1,commPkg,vBufData, vExtData); hypre_ParCSRCommHandleDestroy(commHandle); commHandle = NULL; } for ( irow = 0; irow < localNRows; irow++ ) { res = fData[irow]; for ( jcol = ADiagI[irow]; jcol < ADiagI[irow+1]; jcol++ ) { index = ADiagJ[jcol]; res -= ADiagA[jcol] * uData[index]; } if (nprocs > 1 && zeroInitialGuess_ != 1 ) { for ( jcol = AOffdI[irow]; jcol < AOffdI[irow+1]; jcol++ ) { index = AOffdJ[jcol]; res -= AOffdA[jcol] * vExtData[index]; } } res *= AsqDiag_[irow]; for ( jcol = ADiagI[irow]; jcol < ADiagI[irow+1]; jcol++ ) { index = ADiagJ[jcol]; uData[index] += res * ADiagA[jcol]; } } for ( irow = localNRows-1; irow >= 0; irow-- ) { res = fData[irow]; for ( jcol = ADiagI[irow]; jcol < ADiagI[irow+1]; jcol++ ) { index = ADiagJ[jcol]; res -= ADiagA[jcol] * uData[index]; } if (nprocs > 1 && zeroInitialGuess_ != 1 ) { for ( jcol = AOffdI[irow]; jcol < AOffdI[irow+1]; jcol++ ) { index = AOffdJ[jcol]; res -= AOffdA[jcol] * vExtData[index]; } } res *= AsqDiag_[irow]; for ( jcol = ADiagI[irow]; jcol < ADiagI[irow+1]; jcol++ ) { index = ADiagJ[jcol]; uData[index] += res * ADiagA[jcol]; } for ( jcol = AOffdI[irow]; jcol < AOffdI[irow+1]; jcol++ ) { index = AOffdJ[jcol]; vExtData[index] += res * AOffdA[jcol]; } } zeroInitialGuess_ = 0; } /*----------------------------------------------------------------- * clean up and return *-----------------------------------------------------------------*/ if (nprocs > 1) { delete [] vExtData; delete [] vBufData; } return (retFlag); } /****************************************************************************** * set SGS parameters *---------------------------------------------------------------------------*/ int MLI_Solver_Kaczmarz::setParams(char *paramString, int argc, char **argv) { if (!strcmp(paramString,"numSweeps") || !strcmp(paramString,"relaxWeight")) { if ( argc >= 1 ) nSweeps_ = *(int*) argv[0]; if ( nSweeps_ < 1 ) nSweeps_ = 1; } else if ( !strcmp(paramString, "zeroInitialGuess") ) { zeroInitialGuess_ = 1; } return 0; } hypre-2.33.0/src/FEI_mv/femli/mli_solver_kaczmarz.h000066400000000000000000000021721477326011500221540ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #ifndef __MLI_SOLVER_KACZMARZ_H__ #define __MLI_SOLVER_KACZMARZ_H__ #include #include "_hypre_parcsr_mv.h" #include "mli_matrix.h" #include "mli_vector.h" #include "mli_solver.h" /****************************************************************************** * data structure for the Kaczmarz relaxation scheme *---------------------------------------------------------------------------*/ class MLI_Solver_Kaczmarz : public MLI_Solver { MLI_Matrix *Amat_; int nSweeps_; double *AsqDiag_; int zeroInitialGuess_; public : MLI_Solver_Kaczmarz(char *name); ~MLI_Solver_Kaczmarz(); int setup(MLI_Matrix *Amat); int solve(MLI_Vector *f, MLI_Vector *u); int setParams(char *paramString, int argc, char **argv); }; #endif hypre-2.33.0/src/FEI_mv/femli/mli_solver_mli.cxx000066400000000000000000000050011477326011500214600ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include #include #include #include #include "_hypre_parcsr_mv.h" #include "mli_solver_mli.h" #include "mli_method_amgsa.h" /****************************************************************************** * constructor *---------------------------------------------------------------------------*/ MLI_Solver_MLI::MLI_Solver_MLI(char *name) : MLI_Solver(name) { Amat_ = NULL; mli_ = NULL; } /****************************************************************************** * destructor *---------------------------------------------------------------------------*/ MLI_Solver_MLI::~MLI_Solver_MLI() { Amat_ = NULL; if ( mli_ != NULL ) delete mli_; } /****************************************************************************** * set up the solver *---------------------------------------------------------------------------*/ int MLI_Solver_MLI::setup(MLI_Matrix *mat) { int iOne=1, level0=0, targc; double dOne=1.0; char *targv[2], paramString[100]; MPI_Comm comm; MLI_Method *method; hypre_ParCSRMatrix *hypreA; Amat_ = mat; hypreA = (hypre_ParCSRMatrix *) Amat_->getMatrix(); comm = hypre_ParCSRMatrixComm( hypreA ); if ( mli_ != NULL ) delete mli_; mli_ = new MLI(comm); method = new MLI_Method_AMGSA(comm); sprintf(paramString, "setMinCoarseSize 100"); method->setParams( paramString, 0, NULL ); targc = 2; targv[0] = (char *) &iOne; targv[1] = (char *) &dOne; sprintf(paramString, "setPreSmoother SGS"); method->setParams( paramString, targc, targv ); mli_->setMethod(method); mli_->setSystemMatrix(level0, Amat_); mli_->setMaxIterations( 1 ); mli_->setOutputLevel( 2 ); mli_->setup(); return 0; } /****************************************************************************** * apply function *---------------------------------------------------------------------------*/ int MLI_Solver_MLI::solve(MLI_Vector *fIn, MLI_Vector *uIn) { if ( mli_ == NULL ) { printf("MLI_Solver_MLI::solve ERROR - no mli\n"); exit(1); } mli_->solve( uIn, fIn ); return 0; } hypre-2.33.0/src/FEI_mv/femli/mli_solver_mli.h000066400000000000000000000020271477326011500211120ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #ifndef __MLI_SOLVER_MLI_H__ #define __MLI_SOLVER_MLI_H__ #include #include "HYPRE_config.h" #include "_hypre_utilities.h" #include "mli_matrix.h" #include "mli_vector.h" #include "mli_solver.h" #include "mli.h" /****************************************************************************** * data structure for the MLI smoothed aggregation smoother *---------------------------------------------------------------------------*/ class MLI_Solver_MLI : public MLI_Solver { MLI_Matrix *Amat_; MLI *mli_; public : MLI_Solver_MLI(char *name); ~MLI_Solver_MLI(); int setup(MLI_Matrix *Amat); int solve(MLI_Vector *f, MLI_Vector *u); }; #endif hypre-2.33.0/src/FEI_mv/femli/mli_solver_mls.cxx000066400000000000000000000270561477326011500215100ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include #include #include #include #include "mli_solver_mls.h" #include "_hypre_parcsr_mv.h" #define hmin(x,y) (((x) < (y)) ? (x) : (y)) /****************************************************************************** * constructor *---------------------------------------------------------------------------*/ MLI_Solver_MLS::MLI_Solver_MLS(char *name) : MLI_Solver(name) { Amat_ = NULL; Vtemp_ = NULL; Wtemp_ = NULL; Ytemp_ = NULL; maxEigen_ = 0.0; mlsDeg_ = 1; mlsBoost_ = 1.1; mlsOver_ = 1.1; for ( int i = 0; i < 5; i++ ) mlsOm_[i] = 0.0; mlsOm2_ = 1.8; for ( int j = 0; j < 5; j++ ) mlsCf_[j] = 0.0; zeroInitialGuess_ = 0; } /****************************************************************************** * destructor *---------------------------------------------------------------------------*/ MLI_Solver_MLS::~MLI_Solver_MLS() { Amat_ = NULL; if ( Vtemp_ != NULL ) delete Vtemp_; if ( Wtemp_ != NULL ) delete Wtemp_; if ( Ytemp_ != NULL ) delete Ytemp_; } /****************************************************************************** * set up the smoother * (This setup is modified from Marian Brezina's code in ML) *---------------------------------------------------------------------------*/ int MLI_Solver_MLS::setup(MLI_Matrix *mat) { int i, j, nGrid, MAX_DEG=5, nSamples=20000; double cosData0, cosData1, coord, *ritzValues; double sample, gridStep, rho, rho2; double pi=4.e0 * atan(1.e0); /* 3.141592653589793115998e0; */ /*----------------------------------------------------------------- * check that proper spectral radius is passed in *-----------------------------------------------------------------*/ Amat_ = mat; if ( maxEigen_ <= 0.0 ) { ritzValues = new double[2]; MLI_Utils_ComputeExtremeRitzValues( (hypre_ParCSRMatrix *) Amat_->getMatrix(), ritzValues, 0 ); maxEigen_ = ritzValues[0]; delete [] ritzValues; } /*----------------------------------------------------------------- * compute the coefficients *-----------------------------------------------------------------*/ for ( i = 0; i < MAX_DEG; i++ ) mlsOm_[i] = 0.e0; rho = mlsOver_ * maxEigen_; cosData1 = 1.e0 / (2.e0 * (double) mlsDeg_ + 1.e0); for ( i = 0; i < mlsDeg_; i++ ) { cosData0 = (2.0 * (double) i + 2.0) * pi; mlsOm_[i] = 2.e0 / (rho * (1.e0 - cos(cosData0 * cosData1))); } mlsCf_[0] = mlsOm_[0] + mlsOm_[1] + mlsOm_[2] + mlsOm_[3] + mlsOm_[4]; mlsCf_[1] = -(mlsOm_[0]*mlsOm_[1] + mlsOm_[0]*mlsOm_[2] + mlsOm_[0]*mlsOm_[3] + mlsOm_[0]*mlsOm_[4] + mlsOm_[1]*mlsOm_[2] + mlsOm_[1]*mlsOm_[3] + mlsOm_[1]*mlsOm_[4] + mlsOm_[2]*mlsOm_[3] + mlsOm_[2]*mlsOm_[4] + mlsOm_[3]*mlsOm_[4]); mlsCf_[2] = +(mlsOm_[0]*mlsOm_[1]*mlsOm_[2] + mlsOm_[0]*mlsOm_[1]*mlsOm_[3] + mlsOm_[0]*mlsOm_[1]*mlsOm_[4] + mlsOm_[0]*mlsOm_[2]*mlsOm_[3] + mlsOm_[0]*mlsOm_[2]*mlsOm_[4] + mlsOm_[0]*mlsOm_[3]*mlsOm_[4] + mlsOm_[1]*mlsOm_[2]*mlsOm_[3] + mlsOm_[1]*mlsOm_[2]*mlsOm_[4] + mlsOm_[1]*mlsOm_[3]*mlsOm_[4] + mlsOm_[2]*mlsOm_[3]*mlsOm_[4]); mlsCf_[3] = -(mlsOm_[0]*mlsOm_[1]*mlsOm_[2]*mlsOm_[3] + mlsOm_[0]*mlsOm_[1]*mlsOm_[2]*mlsOm_[4] + mlsOm_[0]*mlsOm_[1]*mlsOm_[3]*mlsOm_[4] + mlsOm_[0]*mlsOm_[2]*mlsOm_[3]*mlsOm_[4] + mlsOm_[1]*mlsOm_[2]*mlsOm_[3]*mlsOm_[4]); mlsCf_[4] = mlsOm_[0] * mlsOm_[1] * mlsOm_[2] * mlsOm_[3] * mlsOm_[4]; if ( mlsDeg_> 1 ) { gridStep = rho / (double) nSamples; nGrid = (int) hmin(((int)(rho/gridStep))+1, nSamples); rho2 = 0.e0; for ( i = 0; i < nGrid-1; i++ ) { coord = (double)(i+1) * gridStep; sample = 1.e0 - mlsOm_[0] * coord; for ( j = 1; j < mlsDeg_; j++) sample *= (1.0 - mlsOm_[j] * coord); sample *= sample * coord; if (sample > rho2) rho2 = sample; } } else rho2 = 4.0 / ( 27.0 * mlsOm_[0] ); if ( mlsDeg_ < 2) mlsBoost_ = 1.019e0; else mlsBoost_ = 1.025e0; rho2 *= mlsBoost_; mlsOm2_ = 2.e0 / rho2; /*----------------------------------------------------------------- * allocate temporary vectors *-----------------------------------------------------------------*/ if ( Vtemp_ != NULL ) delete Vtemp_; if ( Wtemp_ != NULL ) delete Wtemp_; if ( Ytemp_ != NULL ) delete Ytemp_; Vtemp_ = mat->createVector(); Wtemp_ = mat->createVector(); Ytemp_ = mat->createVector(); return 0; } /****************************************************************************** * apply function *---------------------------------------------------------------------------*/ int MLI_Solver_MLS::solve(MLI_Vector *fIn, MLI_Vector *uIn) { int i, localNRows, deg; double omega, coef, *uData; double *VtempData, *WtempData, *YtempData; hypre_ParCSRMatrix *A; hypre_CSRMatrix *ADiag; hypre_ParVector *Vtemp, *Wtemp, *Ytemp, *f, *u; /*----------------------------------------------------------------- * check that proper spectral radius is passed in *-----------------------------------------------------------------*/ if ( maxEigen_ <= 0.0 ) { printf("MLI_Solver_MLS::solver ERROR - maxEigen <= 0.\n"); exit(1); } /*----------------------------------------------------------------- * fetch machine and smoother parameters *-----------------------------------------------------------------*/ A = (hypre_ParCSRMatrix *) Amat_->getMatrix(); ADiag = hypre_ParCSRMatrixDiag(A); localNRows = hypre_CSRMatrixNumRows(ADiag); f = (hypre_ParVector *) fIn->getVector(); u = (hypre_ParVector *) uIn->getVector(); uData = hypre_VectorData(hypre_ParVectorLocalVector(u)); /*----------------------------------------------------------------- * create temporary vector *-----------------------------------------------------------------*/ Vtemp = (hypre_ParVector *) Vtemp_->getVector(); Wtemp = (hypre_ParVector *) Wtemp_->getVector(); Ytemp = (hypre_ParVector *) Ytemp_->getVector(); VtempData = hypre_VectorData(hypre_ParVectorLocalVector(Vtemp)); WtempData = hypre_VectorData(hypre_ParVectorLocalVector(Wtemp)); YtempData = hypre_VectorData(hypre_ParVectorLocalVector(Ytemp)); /*----------------------------------------------------------------- * Perform MLS iterations *-----------------------------------------------------------------*/ /* compute Vtemp = f - A u */ hypre_ParVectorCopy(f,Vtemp); if ( zeroInitialGuess_ != 0 ) { hypre_ParCSRMatrixMatvec(-1.0, A, u, 1.0, Vtemp); zeroInitialGuess_ = 0; } if ( mlsDeg_ == 1 ) { coef = mlsCf_[0] * mlsOver_; /* u = u + coef * Vtemp */ #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i) HYPRE_SMP_SCHEDULE #endif for (i = 0; i < localNRows; i++) uData[i] += (coef * VtempData[i]); /* compute residual Vtemp = A u - f */ hypre_ParVectorCopy(f,Vtemp); hypre_ParCSRMatrixMatvec(1.0, A, u, -1.0, Vtemp); /* compute residual Wtemp = (I - omega * A)^deg Vtemp */ hypre_ParVectorCopy(Vtemp,Wtemp); for ( deg = 0; deg < mlsDeg_; deg++ ) { omega = mlsOm_[deg]; hypre_ParCSRMatrixMatvec(1.0, A, Wtemp, 0.0, Vtemp); for (i = 0; i < localNRows; i++) WtempData[i] -= (omega * VtempData[i]); } /* compute residual Vtemp = (I - omega * A)^deg Wtemp */ hypre_ParVectorCopy(Wtemp,Vtemp); for ( deg = mlsDeg_-1; deg > -1; deg-- ) { omega = mlsOm_[deg]; hypre_ParCSRMatrixMatvec(1.0, A, Vtemp, 0.0, Wtemp); for (i = 0; i < localNRows; i++) VtempData[i] -= (omega * WtempData[i]); } /* compute u = u - coef * Vtemp */ coef = mlsOver_ * mlsOm2_; #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i) HYPRE_SMP_SCHEDULE #endif for (i = 0; i < localNRows; i++) uData[i] -= ( coef * VtempData[i] ); } else { /* Ytemp = coef * Vtemp */ coef = mlsCf_[0]; #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i) HYPRE_SMP_SCHEDULE #endif for (i = 0; i < localNRows; i++) YtempData[i] = (coef * VtempData[i]); /* Wtemp = coef * Vtemp */ for ( deg = 1; deg < mlsDeg_; deg++ ) { hypre_ParCSRMatrixMatvec(1.0, A, Vtemp, 0.0, Wtemp); hypre_ParVectorCopy(Wtemp,Vtemp); coef = mlsCf_[deg]; #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i) HYPRE_SMP_SCHEDULE #endif for (i = 0; i < localNRows; i++) YtempData[i] += ( coef * WtempData[i] ); } #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i) HYPRE_SMP_SCHEDULE #endif for (i = 0; i < localNRows; i++) uData[i] += (mlsOver_ * YtempData[i]); /* compute residual Vtemp = A u - f */ hypre_ParVectorCopy(f,Vtemp); hypre_ParCSRMatrixMatvec(1.0, A, u, -1.0, Vtemp); /* compute residual Wtemp = (I - omega * A)^deg Vtemp */ hypre_ParVectorCopy(Vtemp,Wtemp); for ( deg = 0; deg < mlsDeg_; deg++ ) { omega = mlsOm_[deg]; hypre_ParCSRMatrixMatvec(1.0, A, Wtemp, 0.0, Vtemp); for (i = 0; i < localNRows; i++) WtempData[i] -= (omega * VtempData[i]); } /* compute residual Vtemp = (I - omega * A)^deg Wtemp */ hypre_ParVectorCopy(Wtemp,Vtemp); for ( deg = mlsDeg_-1; deg > -1; deg-- ) { omega = mlsOm_[deg]; hypre_ParCSRMatrixMatvec(1.0, A, Vtemp, 0.0, Wtemp); for (i = 0; i < localNRows; i++) VtempData[i] -= (omega * WtempData[i]); } /* compute u = u - coef * Vtemp */ coef = mlsOver_ * mlsOm2_; #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i) HYPRE_SMP_SCHEDULE #endif for (i = 0; i < localNRows; i++) uData[i] -= ( coef * VtempData[i] ); } return(0); } /****************************************************************************** * set MLS parameters *---------------------------------------------------------------------------*/ int MLI_Solver_MLS::setParams( char *paramString, int argc, char **argv ) { if ( !strcmp(paramString, "maxEigen") ) { if ( argc != 1 ) { printf("MLI_Solver_MLS::setParams ERROR : needs 1 or 2 args.\n"); return 1; } maxEigen_ = *(double*) argv[0]; if ( maxEigen_ < 0.0 ) { printf("MLI_Solver_MLS::setParams ERROR - maxEigen <= 0 (%e)\n", maxEigen_); maxEigen_ = 0.0; return 1; } } else if ( !strcmp(paramString, "zeroInitialGuess") ) { zeroInitialGuess_ = 1; } return 0; } /****************************************************************************** * set MLS parameters *---------------------------------------------------------------------------*/ int MLI_Solver_MLS::setParams( double eigen ) { if ( maxEigen_ <= 0.0 ) { printf("MLI_Solver_MLS::setParams WARNING - maxEigen <= 0.\n"); return 1; } maxEigen_ = eigen; return 0; } hypre-2.33.0/src/FEI_mv/femli/mli_solver_mls.h000066400000000000000000000026071477326011500211300ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #ifndef __MLI_SOLVER_MLS_H__ #define __MLI_SOLVER_MLS_H__ #include #include "mli_matrix.h" #include "mli_vector.h" #include "mli_solver.h" /****************************************************************************** * data structure for the MLS smoother by Brezina S = (I - omega A)^2 A * where omega = 2 / max_eigen of A) *---------------------------------------------------------------------------*/ class MLI_Solver_MLS : public MLI_Solver { MLI_Matrix *Amat_; MLI_Vector *Vtemp_; MLI_Vector *Wtemp_; MLI_Vector *Ytemp_; double maxEigen_; int mlsDeg_; /* degree for current level */ double mlsBoost_; double mlsOver_; double mlsOm_[5]; double mlsOm2_; double mlsCf_[5]; int zeroInitialGuess_; public : MLI_Solver_MLS(char *name); ~MLI_Solver_MLS(); int setup(MLI_Matrix *Amat); int solve(MLI_Vector *f, MLI_Vector *u); int setParams( char *paramString, int argc, char **argv ); int setParams( double maxEigen ); }; #endif hypre-2.33.0/src/FEI_mv/femli/mli_solver_parasails.cxx000066400000000000000000000420671477326011500226730ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include #include "_hypre_parcsr_mv.h" #include "mli_solver_parasails.h" /****************************************************************************** * ParaSails relaxation scheme *****************************************************************************/ /****************************************************************************** * constructor *--------------------------------------------------------------------------*/ MLI_Solver_ParaSails::MLI_Solver_ParaSails(char *name) : MLI_Solver(name) { #ifdef MLI_PARASAILS Amat_ = NULL; ps_ = NULL; nlevels_ = 2; /* number of levels */ symmetric_ = 0; /* nonsymmetric */ transpose_ = 0; /* non-transpose */ correction_ = 1.0; /* 0.8 confirmed a good value for 4-8 proc */ threshold_ = 1.0e-4; filter_ = 1.0e-4; loadbal_ = 0; /* no load balance */ zeroInitialGuess_ = 0; ownAmat_ = 0; numFpts_ = 0; fpList_ = NULL; auxVec2_ = NULL; auxVec3_ = NULL; #else printf("MLI_Solver_ParaSails::constructor - ParaSails smoother "); printf("not available.\n"); exit(1); #endif } /****************************************************************************** * destructor *--------------------------------------------------------------------------*/ MLI_Solver_ParaSails::~MLI_Solver_ParaSails() { #ifdef MLI_PARASAILS if ( ps_ != NULL ) ParaSailsDestroy(ps_); ps_ = NULL; #endif if (ownAmat_ == 1 && Amat_ != NULL) delete Amat_; if (fpList_ != NULL) delete fpList_; if (auxVec2_ != NULL) delete auxVec2_; if (auxVec3_ != NULL) delete auxVec3_; } /****************************************************************************** * Setup *--------------------------------------------------------------------------*/ int MLI_Solver_ParaSails::setup(MLI_Matrix *Amat_in) { #ifdef MLI_PARASAILS hypre_ParCSRMatrix *A; int *partition, mypid, nprocs, start_row, end_row; int row, row_length, *col_indices, globalNRows; double *col_values; char *paramString; Matrix *mat; MPI_Comm comm; MLI_Function *funcPtr; hypre_ParVector *hypreVec; /*----------------------------------------------------------------- * fetch machine and matrix parameters *-----------------------------------------------------------------*/ Amat_ = Amat_in; A = (hypre_ParCSRMatrix *) Amat_->getMatrix(); comm = hypre_ParCSRMatrixComm(A); MPI_Comm_rank(comm,&mypid); MPI_Comm_size(comm,&nprocs); HYPRE_ParCSRMatrixGetRowPartitioning((HYPRE_ParCSRMatrix) A, &partition); start_row = partition[mypid]; end_row = partition[mypid+1] - 1; globalNRows = partition[nprocs]; /*----------------------------------------------------------------- * construct a ParaSails matrix *-----------------------------------------------------------------*/ mat = MatrixCreate(comm, start_row, end_row); for (row = start_row; row <= end_row; row++) { hypre_ParCSRMatrixGetRow(A, row, &row_length, &col_indices, &col_values); MatrixSetRow(mat, row, row_length, col_indices, col_values); hypre_ParCSRMatrixRestoreRow(A,row,&row_length,&col_indices,&col_values); } MatrixComplete(mat); /*----------------------------------------------------------------- * construct a ParaSails smoother object *-----------------------------------------------------------------*/ ps_ = ParaSailsCreate(comm, start_row, end_row, symmetric_); ps_->loadbal_beta = loadbal_; ParaSailsSetupPattern(ps_, mat, threshold_, nlevels_); ParaSailsStatsPattern(ps_, mat); ParaSailsSetupValues(ps_, mat, filter_); ParaSailsStatsValues(ps_, mat); /*----------------------------------------------------------------- * clean up and return object and function *-----------------------------------------------------------------*/ MatrixDestroy(mat); /*----------------------------------------------------------------- * set up other auxiliary vectors *-----------------------------------------------------------------*/ funcPtr = hypre_TAlloc( MLI_Function , 1, HYPRE_MEMORY_HOST); MLI_Utils_HypreParVectorGetDestroyFunc(funcPtr); paramString = new char[20]; strcpy( paramString, "HYPRE_ParVector" ); HYPRE_ParCSRMatrixGetRowPartitioning((HYPRE_ParCSRMatrix) A, &partition); hypreVec = hypre_ParVectorCreate(comm, globalNRows, partition); hypre_ParVectorInitialize(hypreVec); auxVec2_ = new MLI_Vector(hypreVec, paramString, funcPtr); HYPRE_ParCSRMatrixGetRowPartitioning((HYPRE_ParCSRMatrix) A, &partition); hypreVec = hypre_ParVectorCreate(comm, globalNRows, partition); hypre_ParVectorInitialize(hypreVec); auxVec3_ = new MLI_Vector(hypreVec, paramString, funcPtr); delete [] paramString; free( funcPtr ); return 0; #else (void) Amat_in; printf("MLI_Solver_ParaSails::setup ERROR - ParaSails smoother "); printf("not available.\n"); exit(1); return 1; #endif } /****************************************************************************** * solve *--------------------------------------------------------------------------*/ int MLI_Solver_ParaSails::solve(MLI_Vector *f_in, MLI_Vector *u_in) { int i; double *fData, *f2Data, *u2Data, *uData; hypre_ParVector *f2, *u2, *f, *u; #ifdef MLI_PARASAILS if (numFpts_ == 0) { if (transpose_) return (applyParaSailsTrans( f_in, u_in )); else return (applyParaSails( f_in, u_in )); } else { f2 = (hypre_ParVector *) auxVec2_->getVector(); u2 = (hypre_ParVector *) auxVec3_->getVector(); f = (hypre_ParVector *) f_in->getVector(); u = (hypre_ParVector *) u_in->getVector(); fData = hypre_VectorData(hypre_ParVectorLocalVector(f)); uData = hypre_VectorData(hypre_ParVectorLocalVector(u)); f2Data = hypre_VectorData(hypre_ParVectorLocalVector(f2)); u2Data = hypre_VectorData(hypre_ParVectorLocalVector(u2)); for (i = 0; i < numFpts_; i++) f2Data[i] = fData[fpList_[i]]; for (i = 0; i < numFpts_; i++) u2Data[i] = uData[fpList_[i]]; if (transpose_) applyParaSailsTrans(auxVec2_, auxVec3_); else applyParaSails(auxVec2_, auxVec3_); for (i = 0; i < numFpts_; i++) uData[fpList_[i]] = u2Data[i]; } return 0; #else (void) f_in; (void) u_in; printf("MLI_Solver_ParaSails::solve ERROR - ParaSails smoother \n"); printf("not available.\n"); exit(1); return 1; #endif } /****************************************************************************** * set parameters *---------------------------------------------------------------------------*/ int MLI_Solver_ParaSails::setParams(char *paramString, int argc, char **argv) { int i, *fList; char param1[100]; sscanf(paramString, "%s", param1); if ( !strcmp(param1, "nLevels") ) { sscanf(paramString, "%s %d", param1, &nlevels_); if ( nlevels_ < 0 ) nlevels_ = 0; } else if ( !strcmp(param1, "symmetric") ) symmetric_ = 1; else if ( !strcmp(param1, "unsymmetric") ) symmetric_ = 0; else if ( !strcmp(param1, "transpose") ) transpose_ = 1; else if ( !strcmp(param1, "loadbal") ) loadbal_ = 1; else if ( !strcmp(param1, "threshold") ) { sscanf(paramString, "%s %lg", param1, &threshold_); if ( threshold_< 0 || threshold_> 1. ) threshold_= 0.; } else if ( !strcmp(param1, "filter") ) { sscanf(paramString, "%s %lg", param1, &filter_); if ( filter_ < 0 || filter_ > 1. ) filter_= 0.; } else if ( !strcmp(param1, "correction") ) { sscanf(paramString, "%s %lg", param1, &correction_); if ( correction_<= 0 ) correction_= 0.5; } else if ( !strcmp(param1, "zeroInitialGuess") ) { zeroInitialGuess_ = 1; } else if ( !strcmp(paramString, "setFptList") ) { if ( argc != 2 ) { printf("MLI_Solver_Jacobi::setParams ERROR : needs 2 args.\n"); return 1; } numFpts_ = *(int*) argv[0]; fList = (int*) argv[1]; if ( fpList_ != NULL ) delete [] fpList_; fpList_ = NULL; if (numFpts_ <= 0) return 0; fpList_ = new int[numFpts_];; for ( i = 0; i < numFpts_; i++ ) fpList_[i] = fList[i]; return 0; } else if ( !strcmp(paramString, "ownAmat") ) { ownAmat_ = 1; return 0; } else if ( strcmp(param1, "relaxWeight") ) { printf("MLI_Solver_ParaSails::setParams - parameter not recognized.\n"); printf(" Params = %s\n", paramString); return 1; } return 0; } /****************************************************************************** * apply as it is *--------------------------------------------------------------------------*/ int MLI_Solver_ParaSails::applyParaSails(MLI_Vector *f_in, MLI_Vector *u_in) { #ifdef MLI_PARASAILS hypre_ParCSRMatrix *A; hypre_CSRMatrix *A_diag; hypre_ParVector *Vtemp; hypre_Vector *u_local, *Vtemp_local; double *u_data, *Vtemp_data; int i, n, relax_error = 0, global_size; int num_procs, *partition1, *partition2; double *tmp_data; MPI_Comm comm; hypre_ParVector *u, *f; /*----------------------------------------------------------------- * fetch machine and smoother parameters *-----------------------------------------------------------------*/ A = (hypre_ParCSRMatrix *) Amat_->getMatrix(); comm = hypre_ParCSRMatrixComm(A); A_diag = hypre_ParCSRMatrixDiag(A); n = hypre_CSRMatrixNumRows(A_diag); u = (hypre_ParVector *) u_in->getVector(); u_local = hypre_ParVectorLocalVector(u); u_data = hypre_VectorData(u_local); MPI_Comm_size(comm,&num_procs); /*----------------------------------------------------------------- * create temporary vector *-----------------------------------------------------------------*/ f = (hypre_ParVector *) f_in->getVector(); global_size = hypre_ParVectorGlobalSize(f); partition1 = hypre_ParVectorPartitioning(f); partition2 = hypre_CTAlloc( int, num_procs+1 , HYPRE_MEMORY_HOST); for ( i = 0; i <= num_procs; i++ ) partition2[i] = partition1[i]; Vtemp = hypre_ParVectorCreate(comm, global_size, partition2); hypre_ParVectorInitialize(Vtemp); Vtemp_local = hypre_ParVectorLocalVector(Vtemp); Vtemp_data = hypre_VectorData(Vtemp_local); /*----------------------------------------------------------------- * perform smoothing *-----------------------------------------------------------------*/ tmp_data = new double[n]; hypre_ParVectorCopy(f, Vtemp); if ( zeroInitialGuess_ == 0 ) hypre_ParCSRMatrixMatvec(-1.0, A, u, 1.0, Vtemp); ParaSailsApply(ps_, Vtemp_data, tmp_data); if ( zeroInitialGuess_ == 0 ) for (i = 0; i < n; i++) u_data[i] += correction_ * tmp_data[i]; else for (i = 0; i < n; i++) u_data[i] = correction_ * tmp_data[i]; zeroInitialGuess_ = 0; /*----------------------------------------------------------------- * clean up *-----------------------------------------------------------------*/ delete [] tmp_data; return(relax_error); #else (void) f_in; (void) u_in; printf("MLI_Solver_ParaSails::applyParaSails ERROR - ParaSails not"); printf(" available.\n"); exit(1); return 1; #endif } /****************************************************************************** * apply its transpose *--------------------------------------------------------------------------*/ int MLI_Solver_ParaSails::applyParaSailsTrans(MLI_Vector *f_in, MLI_Vector *u_in) { #ifdef MLI_PARASAILS hypre_ParCSRMatrix *A; hypre_CSRMatrix *A_diag; hypre_ParVector *Vtemp; hypre_Vector *u_local, *Vtemp_local; double *u_data, *Vtemp_data; int i, n, relax_error = 0, global_size; int num_procs, *partition1, *partition2; double *tmp_data; MPI_Comm comm; hypre_ParVector *u, *f; /*----------------------------------------------------------------- * fetch machine and smoother parameters *-----------------------------------------------------------------*/ A = (hypre_ParCSRMatrix *) Amat_->getMatrix(); comm = hypre_ParCSRMatrixComm(A); A_diag = hypre_ParCSRMatrixDiag(A); n = hypre_CSRMatrixNumRows(A_diag); u = (hypre_ParVector *) u_in->getVector(); u_local = hypre_ParVectorLocalVector(u); u_data = hypre_VectorData(u_local); MPI_Comm_size(comm,&num_procs); /*----------------------------------------------------------------- * create temporary vector *-----------------------------------------------------------------*/ f = (hypre_ParVector *) f_in->getVector(); global_size = hypre_ParVectorGlobalSize(f); partition1 = hypre_ParVectorPartitioning(f); partition2 = hypre_CTAlloc( int, num_procs+1 , HYPRE_MEMORY_HOST); for ( i = 0; i <= num_procs; i++ ) partition2[i] = partition1[i]; Vtemp = hypre_ParVectorCreate(comm, global_size, partition2); Vtemp_local = hypre_ParVectorLocalVector(Vtemp); Vtemp_data = hypre_VectorData(Vtemp_local); /*----------------------------------------------------------------- * perform smoothing *-----------------------------------------------------------------*/ tmp_data = new double[n]; hypre_ParVectorCopy(f, Vtemp); if ( zeroInitialGuess_ == 0 ) hypre_ParCSRMatrixMatvec(-1.0, A, u, 1.0, Vtemp); ParaSailsApplyTrans(ps_, Vtemp_data, tmp_data); if ( zeroInitialGuess_ == 0 ) for (i = 0; i < n; i++) u_data[i] += correction_ * tmp_data[i]; else for (i = 0; i < n; i++) u_data[i] = correction_ * tmp_data[i]; zeroInitialGuess_ = 0; /*----------------------------------------------------------------- * clean up *-----------------------------------------------------------------*/ delete [] tmp_data; return(relax_error); #else (void) f_in; (void) u_in; printf("MLI_Solver_ParaSails::applyParaSailsTrans ERROR - ParaSails"); printf(" not available.\n"); exit(1); return 1; #endif } /****************************************************************************** * set ParaSails number of levels parameter *---------------------------------------------------------------------------*/ int MLI_Solver_ParaSails::setNumLevels( int levels ) { if ( levels < 0 ) { printf("MLI_Solver_ParaSails::setNumLevels WARNING : nlevels = 0.\n"); nlevels_ = 0; } else nlevels_ = levels; return 0; } /****************************************************************************** * set ParaSails symmetry parameter *---------------------------------------------------------------------------*/ int MLI_Solver_ParaSails::setSymmetric() { symmetric_ = 1; return 0; } /*---------------------------------------------------------------------------*/ int MLI_Solver_ParaSails::setUnSymmetric() { symmetric_ = 0; return 0; } /****************************************************************************** * set ParaSails threshold *---------------------------------------------------------------------------*/ int MLI_Solver_ParaSails::setThreshold( double thresh ) { if ( thresh < 0 || thresh > 1. ) { printf("MLI_Solver_ParaSails::setThreshold WARNING - thresh = 0.\n"); threshold_ = 0.; } else threshold_ = thresh; return 0; } /****************************************************************************** * set ParaSails filter *---------------------------------------------------------------------------*/ int MLI_Solver_ParaSails::setFilter( double data ) { if ( data < 0 || data > 1. ) { printf("MLI_Solver_ParaSails::setThreshold WARNING - filter = 0.\n"); filter_ = 0.; } else filter_ = data; return 0; } /****************************************************************************** * set ParaSails loadbal parameter *---------------------------------------------------------------------------*/ int MLI_Solver_ParaSails::setLoadBal() { loadbal_ = 1; return 0; } /****************************************************************************** * set ParaSails tranpose parameter *---------------------------------------------------------------------------*/ int MLI_Solver_ParaSails::setTranspose() { transpose_ = 1; return 0; } /****************************************************************************** * set ParaSails smoother correction factor *---------------------------------------------------------------------------*/ int MLI_Solver_ParaSails::setUnderCorrection(double factor) { correction_ = factor; return 0; } hypre-2.33.0/src/FEI_mv/femli/mli_solver_parasails.h000066400000000000000000000036271477326011500223170ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #ifndef __MLI_SOLVERPARASAILS_H__ #define __MLI_SOLVERPARASAILS_H__ #define MLI_PARASAILS #include #include "mli_matrix.h" #include "mli_vector.h" #include "mli_solver.h" #ifdef __cplusplus extern "C" { #endif #ifdef MLI_PARASAILS #include "ParaSails/Matrix.h" #include "ParaSails/ParaSails.h" #endif #ifdef __cplusplus } #endif /****************************************************************************** * data structure for the ParaSails relaxation scheme *---------------------------------------------------------------------------*/ class MLI_Solver_ParaSails : public MLI_Solver { MLI_Matrix *Amat_; #ifdef MLI_PARASAILS ParaSails *ps_; #endif int nlevels_; int symmetric_; double threshold_; double filter_; int loadbal_; int transpose_; double correction_; int zeroInitialGuess_; int numFpts_; int *fpList_; int ownAmat_; MLI_Vector *auxVec2_; MLI_Vector *auxVec3_; public : MLI_Solver_ParaSails(char *name); ~MLI_Solver_ParaSails(); int setup(MLI_Matrix *Amat); int solve(MLI_Vector *f, MLI_Vector *u); int setParams(char *paramString, int argc, char **argv); int applyParaSails(MLI_Vector *f, MLI_Vector *u); int applyParaSailsTrans(MLI_Vector *f, MLI_Vector *u); int setNumLevels( int nlevels ); int setSymmetric(); int setUnSymmetric(); int setThreshold( double thresh ); int setFilter( double filter ); int setLoadBal(); int setTranspose(); int setUnderCorrection(double); }; #endif hypre-2.33.0/src/FEI_mv/femli/mli_solver_seqsuperlu.cxx000066400000000000000000001027341477326011500231220ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /* **************************************************************************** * -- SuperLU routine (version 1.1) -- * Univ. of California Berkeley, Xerox Palo Alto Research Center, * and Lawrence Berkeley National Lab. * ************************************************************************* */ #ifdef MLI_SUPERLU #include #include #include "mli_solver_seqsuperlu.h" #include "HYPRE.h" #include "_hypre_parcsr_mv.h" #include "_hypre_IJ_mv.h" /* **************************************************************************** * constructor * --------------------------------------------------------------------------*/ MLI_Solver_SeqSuperLU::MLI_Solver_SeqSuperLU(char *name) : MLI_Solver(name) { permRs_ = NULL; permCs_ = NULL; mliAmat_ = NULL; factorized_ = 0; localNRows_ = 0; nSubProblems_ = 1; subProblemRowSizes_ = NULL; subProblemRowIndices_ = NULL; numColors_ = 1; myColors_ = new int[numColors_]; myColors_[0] = 0; // for domain decomposition with coarse overlaps nSends_ = 0; nRecvs_ = 0; sendProcs_ = NULL; recvProcs_ = NULL; sendLengs_ = NULL; recvLengs_ = NULL; PSmat_ = NULL; AComm_ = 0; PSvec_ = NULL; } /* **************************************************************************** * destructor * --------------------------------------------------------------------------*/ MLI_Solver_SeqSuperLU::~MLI_Solver_SeqSuperLU() { int iP; for ( iP = 0; iP < nSubProblems_; iP++ ) { if ( permRs_[iP] != NULL ) { Destroy_SuperNode_Matrix(&(superLU_Lmats[iP])); Destroy_CompCol_Matrix(&(superLU_Umats[iP])); } } if ( permRs_ != NULL ) { for ( iP = 0; iP < nSubProblems_; iP++ ) if ( permRs_[iP] != NULL ) delete [] permRs_[iP]; delete [] permRs_; } if ( permCs_ != NULL ) { for ( iP = 0; iP < nSubProblems_; iP++ ) if ( permCs_[iP] != NULL ) delete [] permCs_[iP]; delete [] permCs_; } if ( subProblemRowSizes_ != NULL ) delete [] subProblemRowSizes_; if ( subProblemRowIndices_ != NULL ) { for (iP = 0; iP < nSubProblems_; iP++) if (subProblemRowIndices_[iP] != NULL) delete [] subProblemRowIndices_[iP]; delete [] subProblemRowIndices_; } if ( myColors_ != NULL ) delete [] myColors_; if ( sendProcs_ != NULL ) delete [] sendProcs_; if ( recvProcs_ != NULL ) delete [] recvProcs_; if ( sendLengs_ != NULL ) delete [] sendLengs_; if ( recvLengs_ != NULL ) delete [] recvLengs_; if ( PSmat_ != NULL ) delete PSmat_; if ( PSvec_ != NULL ) delete PSvec_; } /* **************************************************************************** * setup * --------------------------------------------------------------------------*/ int MLI_Solver_SeqSuperLU::setup( MLI_Matrix *Amat ) { int nrows, iP, startRow, nnz, *csrIA, *csrJA, *cscJA, *cscIA; int irow, icol, *rowArray, *countArray, colNum, index, nSubRows; int *etree, permcSpec, lwork, panelSize, relax, info, rowCnt; double *csrAA, *cscAA; hypre_ParCSRMatrix *hypreA; hypre_CSRMatrix *ADiag; SuperMatrix AC, superLU_Amat; superlu_options_t slu_options; SuperLUStat_t slu_stat; GlobalLU_t Glu; /* --------------------------------------------------------------- * fetch matrix * -------------------------------------------------------------*/ if ( nSubProblems_ > 100 ) { printf("MLI_Solver_SeqSuperLU::setup ERROR - over 100 subproblems.\n"); exit(1); } mliAmat_ = Amat; if ( !strcmp( mliAmat_->getName(), "HYPRE_ParCSR" ) ) { hypreA = (hypre_ParCSRMatrix *) mliAmat_->getMatrix(); ADiag = hypre_ParCSRMatrixDiag(hypreA); } else if ( !strcmp( mliAmat_->getName(), "HYPRE_CSR" ) ) { ADiag = (hypre_CSRMatrix *) mliAmat_->getMatrix(); } else { printf("MLI_Solver_SeqSuperLU::setup ERROR - invalid format(%s).\n", mliAmat_->getName()); exit(1); } /* --------------------------------------------------------------- * fetch matrix * -------------------------------------------------------------*/ csrAA = hypre_CSRMatrixData(ADiag); csrIA = hypre_CSRMatrixI(ADiag); csrJA = hypre_CSRMatrixJ(ADiag); nrows = hypre_CSRMatrixNumRows(ADiag); nnz = hypre_CSRMatrixNumNonzeros(ADiag); startRow = 0; localNRows_ = nrows; /* --------------------------------------------------------------- * set up coloring and then take out overlap subdomains * -------------------------------------------------------------*/ if ( numColors_ > 1 ) setupBlockColoring(); #if 0 if ( nSubProblems_ > 0 ) { int *domainNumArray = new int[nrows]; for (iP = nSubProblems_-1; iP >= 0; iP--) { for (irow = 0; irow < subProblemRowSizes_[iP]; irow++) domainNumArray[subProblemRowIndices_[iP][irow]] = iP; delete [] subProblemRowIndices_[iP]; } delete [] subProblemRowSizes_; delete [] subProblemRowIndices_; subProblemRowSizes_ = new int[nSubProblems_]; subProblemRowIndices_ = new int*[nSubProblems_]; for (iP = 0; iP < nSubProblems_; iP++) subProblemRowSizes_[iP] = 0; for (irow = 0; irow < nrows; irow++) subProblemRowSizes_[domainNumArray[irow]]++; for (iP = 0; iP < nSubProblems_; iP++) subProblemRowIndices_[iP] = new int[subProblemRowSizes_[iP]]; for (iP = 0; iP < nSubProblems_; iP++) subProblemRowSizes_[iP] = 0; for (irow = 0; irow < nrows; irow++) { index = domainNumArray[irow]; subProblemRowIndices_[index][subProblemRowSizes_[index]++] = irow; } delete [] domainNumArray; } #endif /* --------------------------------------------------------------- * allocate space * -------------------------------------------------------------*/ permRs_ = new int*[nSubProblems_]; permCs_ = new int*[nSubProblems_]; /* --------------------------------------------------------------- * conversion from CSR to CSC * -------------------------------------------------------------*/ countArray = new int[nrows]; if ( subProblemRowIndices_ != NULL ) rowArray = new int[nrows]; #if 0 FILE *fp = fopen("matfile","w"); for (irow = 0; irow < nrows; irow++) for (icol = csrIA[irow]; icol < csrIA[irow+1]; icol++) fprintf(fp,"%8d %8d %25.16e\n",irow,csrJA[icol],csrAA[icol]); fclose(fp); #endif for ( iP = 0; iP < nSubProblems_; iP++ ) { if ( subProblemRowIndices_ != NULL ) { nSubRows = subProblemRowSizes_[iP]; for (irow = 0; irow < nrows; irow++) rowArray[irow] = -1; rowCnt = 0; for (irow = 0; irow < nSubRows; irow++) { index = subProblemRowIndices_[iP][irow] - startRow; if (index >= 0 && index < nrows) rowArray[index] = rowCnt++; } for ( irow = 0; irow < nSubRows; irow++ ) countArray[irow] = 0; rowCnt = 0; for ( irow = 0; irow < nrows; irow++ ) { if ( rowArray[irow] >= 0 ) { for ( icol = csrIA[irow]; icol < csrIA[irow+1]; icol++ ) { index = csrJA[icol]; if (rowArray[index] >= 0) countArray[rowArray[index]]++; } } } nnz = 0; for ( irow = 0; irow < nSubRows; irow++ ) nnz += countArray[irow]; cscJA = hypre_TAlloc(int, (nSubRows+1) , HYPRE_MEMORY_HOST); cscIA = hypre_TAlloc(int, nnz , HYPRE_MEMORY_HOST); cscAA = hypre_TAlloc(double, nnz , HYPRE_MEMORY_HOST); cscJA[0] = 0; nnz = 0; for ( icol = 1; icol <= nSubRows; icol++ ) { nnz += countArray[icol-1]; cscJA[icol] = nnz; } for ( irow = 0; irow < nrows; irow++ ) { if ( rowArray[irow] >= 0 ) { for ( icol = csrIA[irow]; icol < csrIA[irow+1]; icol++ ) { colNum = rowArray[csrJA[icol]]; if ( colNum >= 0) { index = cscJA[colNum]++; cscIA[index] = rowArray[irow]; cscAA[index] = csrAA[icol]; } } } } cscJA[0] = 0; nnz = 0; for ( icol = 1; icol <= nSubRows; icol++ ) { nnz += countArray[icol-1]; cscJA[icol] = nnz; } dCreate_CompCol_Matrix(&superLU_Amat, nSubRows, nSubRows, cscJA[nSubRows], cscAA, cscIA, cscJA, SLU_NC, SLU_D, SLU_GE); etree = new int[nSubRows]; permCs_[iP] = new int[nSubRows]; permRs_[iP] = new int[nSubRows]; permcSpec = 0; get_perm_c(permcSpec, &superLU_Amat, permCs_[iP]); slu_options.Fact = DOFACT; slu_options.SymmetricMode = NO; sp_preorder(&slu_options, &superLU_Amat, permCs_[iP], etree, &AC); panelSize = sp_ienv(1); relax = sp_ienv(2); StatInit(&slu_stat); lwork = 0; // dgstrf(&slu_options, &AC, dropTol, relax, panelSize, // etree,NULL,lwork,permCs_[iP],permRs_[iP], // &(superLU_Lmats[iP]),&(superLU_Umats[iP]),&slu_stat,&info); dgstrf(&slu_options, &AC, relax, panelSize, etree,NULL,lwork,permCs_[iP],permRs_[iP], &(superLU_Lmats[iP]),&(superLU_Umats[iP]),&Glu,&slu_stat,&info); Destroy_CompCol_Permuted(&AC); Destroy_CompCol_Matrix(&superLU_Amat); delete [] etree; StatFree(&slu_stat); } else { for ( irow = 0; irow < nrows; irow++ ) countArray[irow] = 0; for ( irow = 0; irow < nrows; irow++ ) { for ( icol = csrIA[irow]; icol < csrIA[irow+1]; icol++ ) { if (csrJA[icol] < 0 || csrJA[icol] >= nrows) printf("SeqSuperLU ERROR : colNum = %d\n", colNum); countArray[csrJA[icol]]++; } } cscJA = hypre_TAlloc(int, (nrows+1) , HYPRE_MEMORY_HOST); cscAA = hypre_TAlloc(double, nnz , HYPRE_MEMORY_HOST); cscIA = hypre_TAlloc(int, nnz , HYPRE_MEMORY_HOST); cscJA[0] = 0; nnz = 0; for ( icol = 1; icol <= nrows; icol++ ) { nnz += countArray[icol-1]; cscJA[icol] = nnz; } for ( irow = 0; irow < nrows; irow++ ) { for ( icol = csrIA[irow]; icol < csrIA[irow+1]; icol++ ) { colNum = csrJA[icol]; if (colNum < 0 || colNum >= nrows) { printf("ERROR : irow, icol, colNum = %d, %d, %d\n", irow, icol, colNum); exit(1); } index = cscJA[colNum]++; if (index < 0 || index >= nnz) printf("ERROR : index = %d %d %d\n", index, colNum, irow); cscIA[index] = irow; cscAA[index] = csrAA[icol]; } } cscJA[0] = 0; nnz = 0; for ( icol = 1; icol <= nrows; icol++ ) { nnz += countArray[icol-1]; cscJA[icol] = nnz; } dCreate_CompCol_Matrix(&superLU_Amat, nrows, nrows, cscJA[nrows], cscAA, cscIA, cscJA, SLU_NC, SLU_D, SLU_GE); etree = new int[nrows]; permCs_[iP] = new int[nrows]; permRs_[iP] = new int[nrows]; permcSpec = 0; get_perm_c(permcSpec, &superLU_Amat, permCs_[iP]); slu_options.Fact = DOFACT; slu_options.SymmetricMode = NO; sp_preorder(&slu_options, &superLU_Amat, permCs_[iP], etree, &AC); panelSize = sp_ienv(1); relax = sp_ienv(2); StatInit(&slu_stat); lwork = 0; // dgstrf(&slu_options, &AC, dropTol, relax, panelSize, // etree,NULL,lwork,permRs_[iP],permCs_[iP],&(superLU_Lmats[iP]), // &(superLU_Umats[iP]),&slu_stat,&info); dgstrf(&slu_options, &AC, relax, panelSize, etree,NULL,lwork,permRs_[iP],permCs_[iP],&(superLU_Lmats[iP]), &(superLU_Umats[iP]),&Glu,&slu_stat,&info); Destroy_CompCol_Permuted(&AC); Destroy_CompCol_Matrix(&superLU_Amat); delete [] etree; StatFree(&slu_stat); } } factorized_ = 1; delete [] countArray; if ( subProblemRowIndices_ != NULL ) delete [] rowArray; return 0; } /* **************************************************************************** * This subroutine calls the SuperLU subroutine to perform LU * backward substitution * --------------------------------------------------------------------------*/ int MLI_Solver_SeqSuperLU::solve(MLI_Vector *fIn, MLI_Vector *uIn) { int iP, iC, irow, nrows, info, nSubRows, extNCols, nprocs, endp1; int jP, jcol, index, nSends, start, rowInd, *AOffdI, *AOffdJ; int *ADiagI, *ADiagJ, rlength, offset, length; double *uData, *fData, *subUData, *sBuffer, *rBuffer, res, *AOffdA; double *ADiagA, *f2Data, *u2Data, one=1.0, zero=0.0; MPI_Comm comm; SuperMatrix B; trans_t trans; SuperLUStat_t slu_stat; hypre_ParVector *f, *u, *f2; hypre_CSRMatrix *ADiag, *AOffd; hypre_ParCSRMatrix *A, *P; hypre_ParCSRCommPkg *commPkg; hypre_ParCSRCommHandle *commHandle; MPI_Request *mpiRequests; MPI_Status mpiStatus; /* ------------------------------------------------------------- * check that the factorization has been called * -----------------------------------------------------------*/ if ( ! factorized_ ) { printf("MLI_Solver_SeqSuperLU::Solve ERROR - not factorized yet.\n"); exit(1); } /* ------------------------------------------------------------- * fetch matrix and vector parameters * -----------------------------------------------------------*/ A = (hypre_ParCSRMatrix *) mliAmat_->getMatrix(); comm = hypre_ParCSRMatrixComm(A); commPkg = hypre_ParCSRMatrixCommPkg(A); if ( commPkg == NULL ) { hypre_MatvecCommPkgCreate((hypre_ParCSRMatrix *) A); commPkg = hypre_ParCSRMatrixCommPkg(A); } MPI_Comm_size(comm, &nprocs); ADiag = hypre_ParCSRMatrixDiag(A); ADiagI = hypre_CSRMatrixI(ADiag); ADiagJ = hypre_CSRMatrixJ(ADiag); ADiagA = hypre_CSRMatrixData(ADiag); AOffd = hypre_ParCSRMatrixOffd(A); AOffdI = hypre_CSRMatrixI(AOffd); AOffdJ = hypre_CSRMatrixJ(AOffd); AOffdA = hypre_CSRMatrixData(AOffd); extNCols = hypre_CSRMatrixNumCols(AOffd); nrows = localNRows_; u = (hypre_ParVector *) uIn->getVector(); uData = hypre_VectorData(hypre_ParVectorLocalVector(u)); f = (hypre_ParVector *) fIn->getVector(); fData = hypre_VectorData(hypre_ParVectorLocalVector(f)); /* ------------------------------------------------------------- * allocate communication buffers if overlap but not DD * -----------------------------------------------------------*/ rBuffer = sBuffer = NULL; if ( PSmat_ != NULL ) { rlength = 0; for ( iP = 0; iP < nRecvs_; iP++ ) rlength += recvLengs_[iP]; f2 = (hypre_ParVector *) PSvec_->getVector(); f2Data = hypre_VectorData(hypre_ParVectorLocalVector(f2)); u2Data = new double[localNRows_]; if ( nRecvs_ > 0 ) mpiRequests = new MPI_Request[nRecvs_]; } else { if (nprocs > 1) { nSends = hypre_ParCSRCommPkgNumSends(commPkg); if ( nSends > 0 ) { length = hypre_ParCSRCommPkgSendMapStart(commPkg,nSends); sBuffer = new double[length]; } else sBuffer = NULL; if ( extNCols > 0 ) rBuffer = new double[extNCols]; } } /* ------------------------------------------------------------- * collect global vector and create a SuperLU dense matrix * solve the problem * clean up * -----------------------------------------------------------*/ if ( nSubProblems_ == 1 ) { if ( PSmat_ != NULL ) { P = (hypre_ParCSRMatrix *) PSmat_->getMatrix(); hypre_ParCSRMatrixMatvecT(one, P, f, zero, f2); offset = nrows - rlength; for ( iP = 0; iP < nRecvs_; iP++ ) { MPI_Irecv(&u2Data[offset],recvLengs_[iP],MPI_DOUBLE, recvProcs_[iP], 45716, AComm_, &(mpiRequests[iP])); offset += recvLengs_[iP]; } length = nrows - rlength; for ( iP = 0; iP < nSends_; iP++ ) MPI_Send(f2Data,sendLengs_[iP],MPI_DOUBLE,sendProcs_[iP],45716, AComm_); for ( iP = 0; iP < nRecvs_; iP++ ) MPI_Wait( &(mpiRequests[iP]), &mpiStatus ); if ( nRecvs_ > 0 ) delete [] mpiRequests; length = nrows - rlength; for ( irow = 0; irow < length; irow++ ) u2Data[irow] = fData[irow]; dCreate_Dense_Matrix(&B, nrows, 1, u2Data, nrows, SLU_DN, SLU_D, SLU_GE); StatInit(&slu_stat); trans = NOTRANS; dgstrs (trans, &(superLU_Lmats[0]), &(superLU_Umats[0]), permCs_[0], permRs_[0], &B, &slu_stat, &info); Destroy_SuperMatrix_Store(&B); for ( irow = 0; irow < length; irow++ ) uData[irow] = u2Data[irow]; //delete [] u2Data; StatFree(&slu_stat); return info; } else { for ( irow = 0; irow < nrows; irow++ ) uData[irow] = fData[irow]; dCreate_Dense_Matrix(&B, nrows, 1, uData, nrows, SLU_DN, SLU_D, SLU_GE); trans = NOTRANS; StatInit(&slu_stat); dgstrs (trans, &(superLU_Lmats[0]), &(superLU_Umats[0]), permCs_[0], permRs_[0], &B, &slu_stat, &info); Destroy_SuperMatrix_Store(&B); StatFree(&slu_stat); return info; } } /* ------------------------------------------------------------- * if more than 1 subProblems * -----------------------------------------------------------*/ subUData = new double[nrows]; for ( iC = 0; iC < numColors_; iC++ ) { if (nprocs > 1 && iC > 0) { index = 0; for (iP = 0; iP < nSends; iP++) { start = hypre_ParCSRCommPkgSendMapStart(commPkg, iP); endp1 = hypre_ParCSRCommPkgSendMapStart(commPkg, iP+1); for (jP = start; jP < endp1; jP++) sBuffer[index++] = uData[hypre_ParCSRCommPkgSendMapElmt(commPkg,jP)]; } commHandle = hypre_ParCSRCommHandleCreate(1,commPkg,sBuffer,rBuffer); hypre_ParCSRCommHandleDestroy(commHandle); commHandle = NULL; } for ( iP = 0; iP < nSubProblems_; iP++ ) { if ( iC == myColors_[iP] ) { for (irow = 0; irow < subProblemRowSizes_[iP]; irow++) { rowInd = subProblemRowIndices_[iP][irow]; res = fData[rowInd]; for (jcol = ADiagI[rowInd]; jcol < ADiagI[rowInd+1]; jcol++) res -= ADiagA[jcol] * uData[ADiagJ[jcol]]; for (jcol = AOffdI[rowInd]; jcol < AOffdI[rowInd+1]; jcol++) res -= AOffdA[jcol] * rBuffer[AOffdJ[jcol]]; subUData[irow] = res; } nSubRows = subProblemRowSizes_[iP]; dCreate_Dense_Matrix(&B,nSubRows,1,subUData,nSubRows,SLU_DN,SLU_D,SLU_GE); trans = NOTRANS; dgstrs(trans,&(superLU_Lmats[iP]),&(superLU_Umats[iP]), permCs_[iP],permRs_[iP],&B,&slu_stat,&info); Destroy_SuperMatrix_Store(&B); for ( irow = 0; irow < nSubRows; irow++ ) uData[subProblemRowIndices_[iP][irow]] += subUData[irow]; } } } if (sBuffer != NULL) delete [] sBuffer; if (rBuffer != NULL) delete [] rBuffer; return info; } /****************************************************************************** * set SGS parameters *---------------------------------------------------------------------------*/ int MLI_Solver_SeqSuperLU::setParams(char *paramString, int argc, char **argv) { int i, j, *iArray, **iArray2; char param1[100]; sscanf(paramString, "%s", param1); if ( !strcmp(param1, "setSubProblems") ) { if ( argc != 3 ) { printf("MLI_Solver_SeqSuperLU::setParams ERROR : needs 3 arg.\n"); return 1; } if (subProblemRowSizes_ != NULL) delete [] subProblemRowSizes_; subProblemRowSizes_ = NULL; if (subProblemRowIndices_ != NULL) { for (i = 0; i < nSubProblems_; i++) if (subProblemRowIndices_[i] != NULL) delete [] subProblemRowIndices_[i]; subProblemRowIndices_ = NULL; } nSubProblems_ = *(int *) argv[0]; if (nSubProblems_ <= 0) nSubProblems_ = 1; if (nSubProblems_ > 1) { iArray = (int *) argv[1]; subProblemRowSizes_ = new int[nSubProblems_];; for (i = 0; i < nSubProblems_; i++) subProblemRowSizes_[i] = iArray[i]; iArray2 = (int **) argv[2]; subProblemRowIndices_ = new int*[nSubProblems_];; for (i = 0; i < nSubProblems_; i++) { subProblemRowIndices_[i] = new int[subProblemRowSizes_[i]]; for (j = 0; j < subProblemRowSizes_[i]; j++) subProblemRowIndices_[i][j] = iArray2[i][j]; } } } else if ( !strcmp(param1, "setPmat") ) { if ( argc != 1 ) { printf("MLI_Solver_SeqSuperLU::setParams ERROR : needs 1 arg.\n"); return 1; } HYPRE_IJVector auxVec; PSmat_ = (MLI_Matrix *) argv[0]; hypre_ParCSRMatrix *hypreAux; hypre_ParCSRMatrix *ps = (hypre_ParCSRMatrix *) PSmat_->getMatrix(); int nCols = hypre_ParCSRMatrixNumCols(ps); int start = hypre_ParCSRMatrixFirstColDiag(ps); MPI_Comm vComm = hypre_ParCSRMatrixComm(ps); HYPRE_IJVectorCreate(vComm, start, start+nCols-1, &auxVec); HYPRE_IJVectorSetObjectType(auxVec, HYPRE_PARCSR); HYPRE_IJVectorInitialize(auxVec); HYPRE_IJVectorAssemble(auxVec); HYPRE_IJVectorGetObject(auxVec, (void **) &hypreAux); HYPRE_IJVectorSetObjectType(auxVec, -1); HYPRE_IJVectorDestroy(auxVec); strcpy( paramString, "HYPRE_ParVector" ); MLI_Function *funcPtr = new MLI_Function(); MLI_Utils_HypreParVectorGetDestroyFunc(funcPtr); PSvec_ = new MLI_Vector( (void*) hypreAux, paramString, funcPtr ); delete funcPtr; } else if ( !strcmp(param1, "setCommData") ) { if ( argc != 7 ) { printf("MLI_Solver_SeqSuperLU::setParams ERROR : needs 7 arg.\n"); return 1; } nRecvs_ = *(int *) argv[0]; if ( nRecvs_ > 0 ) { recvProcs_ = new int[nRecvs_]; recvLengs_ = new int[nRecvs_]; iArray = (int *) argv[1]; for ( i = 0; i < nRecvs_; i++ ) recvProcs_[i] = iArray[i]; iArray = (int *) argv[2]; for ( i = 0; i < nRecvs_; i++ ) recvLengs_[i] = iArray[i]; } nSends_ = *(int *) argv[3]; if ( nSends_ > 0 ) { sendProcs_ = new int[nSends_]; sendLengs_ = new int[nSends_]; iArray = (int *) argv[4]; for ( i = 0; i < nSends_; i++ ) sendProcs_[i] = iArray[i]; iArray = (int *) argv[5]; for ( i = 0; i < nSends_; i++ ) sendLengs_[i] = iArray[i]; } AComm_ = *(MPI_Comm *) argv[6]; } else { printf("MLI_Solver_SeqSuperLU::setParams - parameter not recognized.\n"); printf(" Params = %s\n", paramString); return 1; } return 0; } /****************************************************************************** * multicoloring *---------------------------------------------------------------------------*/ int MLI_Solver_SeqSuperLU::setupBlockColoring() { int i, j, k, nSends, mypid, nprocs, myRowOffset, nEntries; int *procNRows, gNRows, *globalGI, *globalGJ; int *localGI, *localGJ, *offsets, globalOffset, gRowCnt; int searchIndex, searchStatus; MPI_Comm comm; hypre_ParCSRMatrix *A; hypre_ParCSRCommPkg *commPkg; hypre_ParCSRCommHandle *commHandle; hypre_CSRMatrix *AOffd; /*---------------------------------------------------------------*/ /* fetch matrix */ /*---------------------------------------------------------------*/ A = (hypre_ParCSRMatrix *) mliAmat_->getMatrix(); comm = hypre_ParCSRMatrixComm(A); commPkg = hypre_ParCSRMatrixCommPkg(A); if ( commPkg == NULL ) { hypre_MatvecCommPkgCreate((hypre_ParCSRMatrix *) A); commPkg = hypre_ParCSRMatrixCommPkg(A); } MPI_Comm_rank(comm, &mypid); MPI_Comm_size(comm, &nprocs); /*---------------------------------------------------------------*/ /* construct local graph ==> (nSubProblems_, GDiagI, GDiagJ) */ /*---------------------------------------------------------------*/ int *sortIndices; int *graphMatrix = new int[nSubProblems_*nSubProblems_]; for (i = 0; i < nSubProblems_*nSubProblems_; i++) graphMatrix[i] = 0; for (i = 0; i < nSubProblems_; i++) { for (j = i+1; j < nSubProblems_; j++) { nEntries = subProblemRowSizes_[i] + subProblemRowSizes_[j]; sortIndices = new int[nEntries]; nEntries = subProblemRowSizes_[i]; for (k = 0; k < subProblemRowSizes_[i]; k++) sortIndices[k] = subProblemRowIndices_[i][k]; for (k = 0; k < subProblemRowSizes_[j]; k++) sortIndices[nEntries+k] = subProblemRowIndices_[j][k]; nEntries += subProblemRowSizes_[j]; MLI_Utils_IntQSort2(sortIndices,NULL,0,nEntries-1); for (k = 1; k < nEntries; k++) { if (sortIndices[k] == sortIndices[k-1]) { graphMatrix[i*nSubProblems_+j] = 1; graphMatrix[j*nSubProblems_+i] = 1; break; } } delete [] sortIndices; } } nEntries = 0; for (i = 0; i < nSubProblems_*nSubProblems_; i++) if (graphMatrix[i] != 0) nEntries++; int *GDiagI = new int[nSubProblems_+1]; int *GDiagJ = new int[nEntries]; nEntries = 0; GDiagI[0] = nEntries; for (i = 0; i < nSubProblems_; i++) { for (j = 0; j < nSubProblems_; j++) if (graphMatrix[i*nSubProblems_+j] == 1) GDiagJ[nEntries++] = j; GDiagI[i+1] = nEntries; } delete [] graphMatrix; /*---------------------------------------------------------------*/ /* compute processor number of rows and my row offset */ /* (myRowOffset, proNRows) */ /*---------------------------------------------------------------*/ procNRows = new int[nprocs]; MPI_Allgather(&nSubProblems_,1,MPI_INT,procNRows,1,MPI_INT,comm); gNRows = 0; for (i = 0; i < nprocs; i++) gNRows += procNRows[i]; myRowOffset = 0; for (i = 0; i < mypid; i++) myRowOffset += procNRows[i]; for (i = 0; i < GDiagI[nSubProblems_]; i++) GDiagJ[i] += myRowOffset; /*---------------------------------------------------------------*/ /* construct local off-diagonal graph */ /*---------------------------------------------------------------*/ int extNCols, mapStart, mapEnd, mapIndex, *AOffdI, *AOffdJ; int localNRows; double *sBuffer=NULL, *rBuffer=NULL; localNRows = hypre_CSRMatrixNumRows(hypre_ParCSRMatrixDiag(A)); AOffd = hypre_ParCSRMatrixOffd(A); AOffdI = hypre_CSRMatrixI(AOffd); AOffdJ = hypre_CSRMatrixJ(AOffd); extNCols = hypre_CSRMatrixNumCols(AOffd); nSends = hypre_ParCSRCommPkgNumSends(commPkg); if (extNCols > 0) rBuffer = new double[extNCols]; if (nSends > 0) sBuffer = new double[hypre_ParCSRCommPkgSendMapStart(commPkg,nSends)]; mapIndex = 0; for (i = 0; i < nSends; i++) { mapStart = hypre_ParCSRCommPkgSendMapStart(commPkg, i); mapEnd = hypre_ParCSRCommPkgSendMapStart(commPkg, i+1); for (j=mapStart; j= 0) { sBuffer[mapIndex++] = (double) (k + myRowOffset); break; } } } } if ( nSends > 0 || extNCols > 0 ) { commHandle = hypre_ParCSRCommHandleCreate(1,commPkg,sBuffer,rBuffer); hypre_ParCSRCommHandleDestroy(commHandle); commHandle = NULL; } if ( extNCols > 0 ) { int indexI, indexJ; int *GOffdCnt = new int[nSubProblems_]; int *GOffdJ = new int[nSubProblems_*extNCols]; for (i = 0; i < nSubProblems_; i++) GOffdCnt[i] = 0; for (i = 0; i < nSubProblems_*extNCols; i++) GOffdJ[i] = -1; for (i = 0; i < localNRows; i++) { if ( AOffdI[i+1] > AOffdI[i] ) { for (k = 0; k < nSubProblems_; k++) { indexI = MLI_Utils_BinarySearch(i,subProblemRowIndices_[k], subProblemRowSizes_[k]); if (indexI >= 0) break; } for (j = AOffdI[i]; j < AOffdJ[i+1]; j++) { indexJ = (int) rBuffer[i]; GOffdJ[extNCols*k+AOffdJ[j]] = indexJ; } } } int totalNNZ = GDiagI[nSubProblems_]; for (i = 0; i < nSubProblems_; i++) totalNNZ += GOffdCnt[i]; localGI = new int[nSubProblems_+1]; localGJ = new int[totalNNZ]; totalNNZ = 0; localGI[0] = totalNNZ; for (i = 0; i < nSubProblems_; i++) { for (j = GDiagI[i]; j < GDiagI[i+1]; j++) localGJ[totalNNZ++] = GDiagJ[j]; for (j = 0; j < extNCols; j++) if (GOffdJ[i*extNCols+j] >= 0) localGJ[totalNNZ++] = GOffdJ[i*extNCols+j]; localGI[i+1] = totalNNZ; } delete [] GDiagI; delete [] GDiagJ; delete [] GOffdCnt; delete [] GOffdJ; } else { localGI = GDiagI; localGJ = GDiagJ; } if (sBuffer != NULL) delete [] sBuffer; if (rBuffer != NULL) delete [] rBuffer; /*---------------------------------------------------------------*/ /* form global graph (gNRows, globalGI, globalGJ) */ /*---------------------------------------------------------------*/ globalGI = new int[gNRows+1]; offsets = new int[nprocs+1]; offsets[0] = 0; for (i = 1; i <= nprocs; i++) offsets[i] = offsets[i-1] + procNRows[i-1]; MPI_Allgatherv(&localGI[1], nSubProblems_, MPI_INT, &globalGI[1], procNRows, offsets, MPI_INT, comm); delete [] offsets; globalOffset = 0; gRowCnt = 1; globalGI[0] = globalOffset; for (i = 0; i < nprocs; i++) { for (j = 0; j < procNRows[i]; j++) { globalGI[gRowCnt] = globalOffset + globalGI[gRowCnt]; gRowCnt++; } globalOffset += globalGI[gRowCnt-1]; } globalGJ = new int[globalOffset]; int *recvCnts = new int[nprocs+1]; globalOffset = 0; for (i = 0; i < nprocs; i++) { gRowCnt = globalOffset; globalOffset = globalGI[gRowCnt+procNRows[i]]; recvCnts[i] = globalOffset - gRowCnt; } offsets = new int[nprocs+1]; offsets[0] = 0; for (i = 1; i <= nprocs; i++) offsets[i] = offsets[i-1] + recvCnts[i-1]; nEntries = localGI[nSubProblems_]; MPI_Allgatherv(localGJ, nEntries, MPI_INT, globalGJ, recvCnts, offsets, MPI_INT, comm); delete [] offsets; delete [] recvCnts; delete [] localGI; delete [] localGJ; #if 0 if ( mypid == 0 ) { for ( i = 0; i < gNRows; i++ ) for ( j = globalGI[i]; j < globalGI[i+1]; j++ ) printf("Graph(%d,%d)\n", i, globalGJ[j]); } #endif /*---------------------------------------------------------------*/ /* start coloring */ /*---------------------------------------------------------------*/ int *colors = new int[gNRows]; int *colorsAux = new int[gNRows]; int gIndex, gColor; for ( i = 0; i < gNRows; i++ ) colors[i] = colorsAux[i] = -1; for ( i = 0; i < gNRows; i++ ) { for ( j = globalGI[i]; j < globalGI[i+1]; j++ ) { gIndex = globalGJ[j]; gColor = colors[gIndex]; if ( gColor >= 0 ) colorsAux[gColor] = 1; } for ( j = 0; j < gNRows; j++ ) if ( colorsAux[j] < 0 ) break; colors[i] = j; for ( j = globalGI[i]; j < globalGI[i+1]; j++ ) { gIndex = globalGJ[j]; gColor = colors[gIndex]; if ( gColor >= 0 ) colorsAux[gColor] = -1; } } delete [] colorsAux; myColors_ = new int[nSubProblems_]; for ( j = myRowOffset; j < myRowOffset+nSubProblems_; j++ ) myColors_[j-myRowOffset] = colors[j]; numColors_ = 0; for ( j = 0; j < gNRows; j++ ) if ( colors[j]+1 > numColors_ ) numColors_ = colors[j]+1; delete [] colors; if ( mypid == 0 ) printf("\tMLI_Solver_SeqSuperLU : number of colors = %d\n",numColors_); return 0; } #endif hypre-2.33.0/src/FEI_mv/femli/mli_solver_seqsuperlu.h000066400000000000000000000033441477326011500225440ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #ifdef MLI_SUPERLU #ifndef __MLI_SOLVER_SEQSUPERLU_H__ #define __MLI_SOLVER_SEQSUPERLU_H__ #include #include "slu_ddefs.h" #include "slu_util.h" #include "mli_matrix.h" #include "mli_vector.h" #include "mli_solver.h" /****************************************************************************** * data structure for the sequential SuperLU solution scheme *---------------------------------------------------------------------------*/ class MLI_Solver_SeqSuperLU : public MLI_Solver { MLI_Matrix *mliAmat_; int factorized_; int **permRs_; int **permCs_; int localNRows_; SuperMatrix superLU_Lmats[100]; SuperMatrix superLU_Umats[100]; int nSubProblems_; int **subProblemRowIndices_; int *subProblemRowSizes_; int numColors_; int *myColors_; int nRecvs_; int *recvProcs_; int *recvLengs_; int nSends_; int *sendProcs_; int *sendLengs_; MPI_Comm AComm_; MLI_Matrix *PSmat_; MLI_Vector *PSvec_; public : MLI_Solver_SeqSuperLU(char *name); ~MLI_Solver_SeqSuperLU(); int setup(MLI_Matrix *Amat); int solve(MLI_Vector *f, MLI_Vector *u); int setParams(char *paramString, int argc, char **argv); int setupBlockColoring(); }; #endif #else int bogus; #endif hypre-2.33.0/src/FEI_mv/femli/mli_solver_sgs.cxx000066400000000000000000000561721477326011500215120ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include #include #include "_hypre_parcsr_mv.h" #include "mli_solver_sgs.h" /****************************************************************************** * symmetric Gauss-Seidel relaxation scheme *****************************************************************************/ /****************************************************************************** * constructor *---------------------------------------------------------------------------*/ MLI_Solver_SGS::MLI_Solver_SGS(char *name) : MLI_Solver(name) { Amat_ = NULL; zeroInitialGuess_ = 0; nSweeps_ = 1; relaxWeights_ = new double[1]; relaxWeights_[0] = 1.0; myColor_ = 0; numColors_ = 1; scheme_ = 1; printRNorm_ = 0; findOmega_ = 0; omegaIncrement_ = 0.05; omegaNumIncr_ = 20; } /****************************************************************************** * destructor *---------------------------------------------------------------------------*/ MLI_Solver_SGS::~MLI_Solver_SGS() { if ( relaxWeights_ != NULL ) delete [] relaxWeights_; relaxWeights_ = NULL; } /****************************************************************************** * set up the smoother *---------------------------------------------------------------------------*/ int MLI_Solver_SGS::setup(MLI_Matrix *mat) { Amat_ = mat; hypre_ParCSRMatrix *A; MPI_Comm comm; if ( scheme_ == 0 ) doProcColoring(); else if ( scheme_ == 1 ) { myColor_ = 0; numColors_ = 1; if ( findOmega_ == 1 ) findOmega(); } else { A = (hypre_ParCSRMatrix *) Amat_->getMatrix(); comm = hypre_ParCSRMatrixComm(A); MPI_Comm_size(comm, &numColors_); MPI_Comm_rank(comm, &myColor_); } return 0; } /****************************************************************************** * apply function *---------------------------------------------------------------------------*/ int MLI_Solver_SGS::solve(MLI_Vector *fIn, MLI_Vector *uIn) { int *ADiagI, *ADiagJ, *AOffdI, *AOffdJ; double *ADiagA, *AOffdA, *uData, *fData; int iStart, iEnd, jj; int i, j, is, localNRows, extNRows, *tmpJ, relaxError=0; int iC, index, nprocs, mypid, nSends, start; double res; double zero = 0.0, relaxWeight, rnorm; double *vBufData=NULL, *tmpData, *vExtData=NULL; MPI_Comm comm; hypre_ParCSRMatrix *A; hypre_CSRMatrix *ADiag, *AOffd; hypre_ParVector *f, *u; hypre_ParCSRCommPkg *commPkg; hypre_ParCSRCommHandle *commHandle; MLI_Vector *mliRvec; hypre_ParVector *hypreR; /*----------------------------------------------------------------- * fetch machine and smoother parameters *-----------------------------------------------------------------*/ A = (hypre_ParCSRMatrix *) Amat_->getMatrix(); comm = hypre_ParCSRMatrixComm(A); commPkg = hypre_ParCSRMatrixCommPkg(A); ADiag = hypre_ParCSRMatrixDiag(A); localNRows = hypre_CSRMatrixNumRows(ADiag); ADiagI = hypre_CSRMatrixI(ADiag); ADiagJ = hypre_CSRMatrixJ(ADiag); ADiagA = hypre_CSRMatrixData(ADiag); AOffd = hypre_ParCSRMatrixOffd(A); extNRows = hypre_CSRMatrixNumCols(AOffd); AOffdI = hypre_CSRMatrixI(AOffd); AOffdJ = hypre_CSRMatrixJ(AOffd); AOffdA = hypre_CSRMatrixData(AOffd); u = (hypre_ParVector *) uIn->getVector(); uData = hypre_VectorData(hypre_ParVectorLocalVector(u)); f = (hypre_ParVector *) fIn->getVector(); fData = hypre_VectorData(hypre_ParVectorLocalVector(f)); MPI_Comm_size(comm,&nprocs); MPI_Comm_rank(comm,&mypid); if ( printRNorm_ == 1 ) { mliRvec = Amat_->createVector(); hypreR = (hypre_ParVector *) mliRvec->getVector(); } /*----------------------------------------------------------------- * setting up for interprocessor communication *-----------------------------------------------------------------*/ if (nprocs > 1) { nSends = hypre_ParCSRCommPkgNumSends(commPkg); if ( nSends > 0 ) vBufData = new double[hypre_ParCSRCommPkgSendMapStart(commPkg,nSends)]; else vBufData = NULL; if ( extNRows > 0 ) vExtData = new double[extNRows]; else vExtData = NULL; } /*----------------------------------------------------------------- * perform SGS sweeps *-----------------------------------------------------------------*/ #if 0 if ( relaxWeights_ != NULL && relaxWeights_[0] != 0.0 && relaxWeights_[0] != 1.0 ) printf("\t SGS smoother : relax weight != 1.0 (%e).\n",relaxWeights_[0]); #endif relaxWeight = 1.0; for( is = 0; is < nSweeps_; is++ ) { if ( relaxWeights_ != NULL ) relaxWeight = relaxWeights_[is]; if ( relaxWeight <= 0.0 ) relaxWeight = 1.0; /*----------------------------------------------------------------- * forward sweep *-----------------------------------------------------------------*/ for ( iC = 0; iC < numColors_; iC++ ) { if (nprocs > 1) { if ( zeroInitialGuess_ == 0 ) { index = 0; for (i = 0; i < nSends; i++) { start = hypre_ParCSRCommPkgSendMapStart(commPkg, i); for (j=start;j 1) ) { iStart = AOffdI[i]; iEnd = AOffdI[i+1]; tmpJ = &(AOffdJ[iStart]); tmpData = &(AOffdA[iStart]); for (jj = iStart; jj < iEnd; jj++) res -= (*tmpData++) * vExtData[*tmpJ++]; } uData[i] += relaxWeight * res / ADiagA[ADiagI[i]]; } else printf("MLI_Solver_SGS error : diag = 0.\n"); } } zeroInitialGuess_ = 0; } /*----------------------------------------------------------------- * backward sweep *-----------------------------------------------------------------*/ for ( iC = numColors_-1; iC >= 0; iC-- ) { if ( (numColors_ > 1) && (nprocs > 1) ) { if ( zeroInitialGuess_ == 0 ) { index = 0; for (i = 0; i < nSends; i++) { start = hypre_ParCSRCommPkgSendMapStart(commPkg, i); for (j=start;j -1; i--) { if ( ADiagA[ADiagI[i]] != zero) { res = fData[i]; iStart = ADiagI[i]; iEnd = ADiagI[i+1]; tmpJ = &(ADiagJ[iStart]); tmpData = &(ADiagA[iStart]); for (jj = iStart; jj < iEnd; jj++) res -= (*tmpData++) * uData[*tmpJ++]; if ( (zeroInitialGuess_ == 0 ) && (nprocs > 1) ) { iStart = AOffdI[i]; iEnd = AOffdI[i+1]; tmpJ = &(AOffdJ[iStart]); tmpData = &(AOffdA[iStart]); for (jj = iStart; jj < iEnd; jj++) res -= (*tmpData++) * vExtData[*tmpJ++]; } uData[i] += relaxWeight * res / ADiagA[ADiagI[i]]; } } } } if ( printRNorm_ == 1 ) { hypre_ParVectorCopy( f, hypreR ); hypre_ParCSRMatrixMatvec( -1.0, A, u, 1.0, hypreR ); rnorm = sqrt(hypre_ParVectorInnerProd( hypreR, hypreR )); if ( mypid == 0 ) printf("\tMLI_Solver_SGS iter = %4d, rnorm = %e (omega=%e)\n", is, rnorm, relaxWeight); } } if ( printRNorm_ == 1 ) delete mliRvec; /*----------------------------------------------------------------- * clean up and return *-----------------------------------------------------------------*/ if ( vExtData != NULL ) delete [] vExtData; if ( vBufData != NULL ) delete [] vBufData; return(relaxError); } /****************************************************************************** * set SGS parameters *---------------------------------------------------------------------------*/ int MLI_Solver_SGS::setParams( char *paramString, int argc, char **argv ) { int i; double *weights=NULL; char param1[100], param2[100]; sscanf(paramString, "%s", param1); if ( !strcmp(param1, "numSweeps") ) { if ( argc != 1 ) { printf("MLI_Solver_SGS::setParams ERROR : needs 1 arg.\n"); return 1; } nSweeps_ = *(int*) argv[0]; if ( nSweeps_ < 1 ) nSweeps_ = 1; if ( relaxWeights_ != NULL ) delete [] relaxWeights_; relaxWeights_ = new double[nSweeps_]; for ( i = 0; i < nSweeps_; i++ ) relaxWeights_[i] = 1.0; return 0; } else if ( !strcmp(param1, "relaxWeight") ) { if ( argc != 2 && argc != 1 ) { printf("MLI_Solver_SGS::setParams ERROR : needs 1 or 2 args.\n"); return 1; } if ( argc >= 1 ) nSweeps_ = *(int*) argv[0]; if ( argc == 2 ) weights = (double*) argv[1]; if ( nSweeps_ < 1 ) nSweeps_ = 1; if ( relaxWeights_ != NULL ) delete [] relaxWeights_; relaxWeights_ = NULL; if ( weights != NULL ) { relaxWeights_ = new double[nSweeps_]; for ( i = 0; i < nSweeps_; i++ ) relaxWeights_[i] = weights[i]; } } else if ( !strcmp(param1, "zeroInitialGuess") ) { zeroInitialGuess_ = 1; return 0; } else if ( !strcmp(param1, "setScheme") ) { sscanf(paramString, "%s %s", param1, param2); if ( !strcmp(param2, "multicolor") ) scheme_ = 0; else if ( !strcmp(param2, "parallel") ) scheme_ = 1; else if ( !strcmp(param2, "sequential") ) scheme_ = 2; return 0; } else if ( !strcmp(param1, "printRNorm") ) { printRNorm_ = 1; } else if ( !strcmp(param1, "findOmega") ) { findOmega_ = 1; } else { printf("MLI_Solver_SGS::setParams - parameter not recognized.\n"); printf(" Params = %s\n", paramString); return 1; } return 0; } /****************************************************************************** * set SGS parameters *---------------------------------------------------------------------------*/ int MLI_Solver_SGS::setParams( int nsweeps, double *weights ) { int i; if ( nsweeps <= 0 ) { printf("MLI_Solver_SGS::setParams WARNING : nsweeps set to 1.\n"); nsweeps = 1; } nSweeps_ = nsweeps; if ( relaxWeights_ != NULL ) delete [] relaxWeights_; relaxWeights_ = new double[nsweeps]; if ( weights == NULL ) { printf("MLI_Solver_SGS::setParams - relax_weights set to 1.0.\n"); for ( i = 0; i < nsweeps; i++ ) relaxWeights_[i] = 1.0; } else { for ( i = 0; i < nsweeps; i++ ) { if (weights[i] >= 0. && weights[i] <= 2.) relaxWeights_[i] = weights[i]; else { printf("MLI_Solver_SGS::setParams - some weights set to 0.5.\n"); relaxWeights_[i] = 1.0; } } } return 0; } /****************************************************************************** * color processors *---------------------------------------------------------------------------*/ int MLI_Solver_SGS::doProcColoring() { int nSends, *sendProcs, mypid, nprocs, *commGraphI; int *commGraphJ, *recvCounts, i, j, *colors, *colorsAux; int pIndex, pColor; MPI_Comm comm; hypre_ParCSRMatrix *A; hypre_ParCSRCommPkg *commPkg; A = (hypre_ParCSRMatrix *) Amat_->getMatrix(); comm = hypre_ParCSRMatrixComm(A); commPkg = hypre_ParCSRMatrixCommPkg(A); if ( commPkg == NULL ) { hypre_MatvecCommPkgCreate((hypre_ParCSRMatrix *) A); commPkg = hypre_ParCSRMatrixCommPkg(A); } nSends = hypre_ParCSRCommPkgNumSends(commPkg); sendProcs = hypre_ParCSRCommPkgSendProcs(commPkg); MPI_Comm_rank(comm, &mypid); MPI_Comm_size(comm, &nprocs); commGraphI = new int[nprocs+1]; recvCounts = new int[nprocs]; MPI_Allgather(&nSends, 1, MPI_INT, recvCounts, 1, MPI_INT, comm); commGraphI[0] = 0; for ( i = 1; i <= nprocs; i++ ) commGraphI[i] = commGraphI[i-1] + recvCounts[i-1]; commGraphJ = new int[commGraphI[nprocs]]; MPI_Allgatherv(sendProcs, nSends, MPI_INT, commGraphJ, recvCounts, commGraphI, MPI_INT, comm); delete [] recvCounts; #if 0 if ( mypid == 0 ) { for ( i = 0; i < nprocs; i++ ) for ( j = commGraphI[i]; j < commGraphI[i+1]; j++ ) printf("Graph(%d,%d)\n", i, commGraphJ[j]); } #endif colors = new int[nprocs]; colorsAux = new int[nprocs]; for ( i = 0; i < nprocs; i++ ) colors[i] = colorsAux[i] = -1; for ( i = 0; i < nprocs; i++ ) { for ( j = commGraphI[i]; j < commGraphI[i+1]; j++ ) { pIndex = commGraphJ[j]; pColor = colors[pIndex]; if ( pColor >= 0 ) colorsAux[pColor] = 1; } for ( j = 0; j < nprocs; j++ ) if ( colorsAux[j] < 0 ) break; colors[i] = j; for ( j = commGraphI[i]; j < commGraphI[i+1]; j++ ) { pIndex = commGraphJ[j]; pColor = colors[pIndex]; if ( pColor >= 0 ) colorsAux[pColor] = -1; } } delete [] colorsAux; myColor_ = colors[mypid]; numColors_ = 0; for ( j = 0; j < nprocs; j++ ) if ( colors[j]+1 > numColors_ ) numColors_ = colors[j]+1; delete [] colors; if ( mypid == 0 ) printf("\tMLI_Solver_SGS : number of colors = %d\n", numColors_); return 0; } /****************************************************************************** * search for optimal omega *---------------------------------------------------------------------------*/ int MLI_Solver_SGS::findOmega() { int *ADiagI, *ADiagJ, *AOffdI, *AOffdJ; double *ADiagA, *AOffdA, *uData, *fData; int iStart, iEnd, jj; int i, j, is, iR, localNRows, extNRows, *tmpJ; int index, nprocs, mypid, nSends, start; double res; double zero = 0.0, relaxWeight, rnorm, *relNorms; double *vBufData=NULL, *tmpData, *vExtData=NULL; MPI_Comm comm; hypre_ParCSRMatrix *A; hypre_CSRMatrix *ADiag, *AOffd; hypre_ParCSRCommPkg *commPkg; hypre_ParCSRCommHandle *commHandle; MLI_Vector *mliRvec, *mliFvec, *mliUvec; hypre_ParVector *hypreR, *hypreF, *hypreU; /*----------------------------------------------------------------- * fetch machine and matrix parameters *-----------------------------------------------------------------*/ A = (hypre_ParCSRMatrix *) Amat_->getMatrix(); comm = hypre_ParCSRMatrixComm(A); commPkg = hypre_ParCSRMatrixCommPkg(A); ADiag = hypre_ParCSRMatrixDiag(A); localNRows = hypre_CSRMatrixNumRows(ADiag); ADiagI = hypre_CSRMatrixI(ADiag); ADiagJ = hypre_CSRMatrixJ(ADiag); ADiagA = hypre_CSRMatrixData(ADiag); AOffd = hypre_ParCSRMatrixOffd(A); extNRows = hypre_CSRMatrixNumCols(AOffd); AOffdI = hypre_CSRMatrixI(AOffd); AOffdJ = hypre_CSRMatrixJ(AOffd); AOffdA = hypre_CSRMatrixData(AOffd); MPI_Comm_size(comm,&nprocs); MPI_Comm_rank(comm,&mypid); /*----------------------------------------------------------------- * create temporary vectors *-----------------------------------------------------------------*/ mliUvec = Amat_->createVector(); hypreU = (hypre_ParVector *) mliUvec->getVector(); mliFvec = Amat_->createVector(); hypreF = (hypre_ParVector *) mliFvec->getVector(); mliRvec = Amat_->createVector(); hypreR = (hypre_ParVector *) mliRvec->getVector(); hypre_ParVectorSetRandomValues( hypreF, 23986131 ); fData = hypre_VectorData(hypre_ParVectorLocalVector(hypreF)); uData = hypre_VectorData(hypre_ParVectorLocalVector(hypreU)); /*----------------------------------------------------------------- * setting up for interprocessor communication *-----------------------------------------------------------------*/ if (nprocs > 1) { nSends = hypre_ParCSRCommPkgNumSends(commPkg); if ( nSends > 0 ) vBufData = new double[hypre_ParCSRCommPkgSendMapStart(commPkg,nSends)]; else vBufData = NULL; if ( extNRows > 0 ) vExtData = new double[extNRows]; else vExtData = NULL; } /*----------------------------------------------------------------- * perform SGS sweeps *-----------------------------------------------------------------*/ relNorms = new double[omegaNumIncr_+1]; relNorms[0] = sqrt(hypre_ParVectorInnerProd( hypreF, hypreF )); for( iR = 0; iR < omegaNumIncr_; iR++ ) { relaxWeight = omegaIncrement_ * (iR + 1); hypre_ParVectorSetConstantValues(hypreU, zero); for( is = 0; is < nSweeps_+1; is++ ) { /*-------------------------------------------------------------- * forward sweep *--------------------------------------------------------------*/ if (nprocs > 1) { if ( zeroInitialGuess_ == 0 ) { index = 0; for (i = 0; i < nSends; i++) { start = hypre_ParCSRCommPkgSendMapStart(commPkg, i); for (j=start;j 1) ) { iStart = AOffdI[i]; iEnd = AOffdI[i+1]; tmpJ = &(AOffdJ[iStart]); tmpData = &(AOffdA[iStart]); for (jj = iStart; jj < iEnd; jj++) res -= (*tmpData++) * vExtData[*tmpJ++]; } uData[i] += relaxWeight * res / ADiagA[ADiagI[i]]; } else printf("MLI_Solver_SGS error : diag = 0.\n"); } /*-------------------------------------------------------------- * backward sweep *--------------------------------------------------------------*/ for (i = localNRows-1; i > -1; i--) { if ( ADiagA[ADiagI[i]] != zero) { res = fData[i]; iStart = ADiagI[i]; iEnd = ADiagI[i+1]; tmpJ = &(ADiagJ[iStart]); tmpData = &(ADiagA[iStart]); for (jj = iStart; jj < iEnd; jj++) res -= (*tmpData++) * uData[*tmpJ++]; if ( (zeroInitialGuess_ == 0 ) && (nprocs > 1) ) { iStart = AOffdI[i]; iEnd = AOffdI[i+1]; tmpJ = &(AOffdJ[iStart]); tmpData = &(AOffdA[iStart]); for (jj = iStart; jj < iEnd; jj++) res -= (*tmpData++) * vExtData[*tmpJ++]; } uData[i] += relaxWeight * res / ADiagA[ADiagI[i]]; } } zeroInitialGuess_ = 0; hypre_ParVectorCopy( hypreF, hypreR ); hypre_ParCSRMatrixMatvec( -1.0, A, hypreU, 1.0, hypreR ); rnorm = sqrt(hypre_ParVectorInnerProd( hypreR, hypreR )); if ( rnorm > 1.0e20 ) break; } relNorms[iR+1] = rnorm; } rnorm = relNorms[0]; jj = 0; for ( iR = 1; iR <= omegaNumIncr_; iR++ ) { if ( relNorms[iR] < rnorm ) { rnorm = relNorms[iR]; jj = iR; } } if ( mypid == 0 ) { if ( jj == 0 ) printf("MLI_Solver_SGS::findOmega ERROR - omega = 0.0.\n"); else printf("MLI_Solver_SGS::findOmega - optimal omega = %e(%e)\n", omegaIncrement_*jj,rnorm/relNorms[0]); } if ( relaxWeights_ != NULL ) delete [] relaxWeights_; relaxWeights_ = new double[nSweeps_+1]; for ( i = 0; i < nSweeps_; i++ ) relaxWeights_[i] = omegaIncrement_ * jj; /*----------------------------------------------------------------- * clean up and return *-----------------------------------------------------------------*/ delete mliRvec; delete mliUvec; delete mliFvec; if ( vExtData != NULL ) delete [] vExtData; if ( vBufData != NULL ) delete [] vBufData; delete [] relNorms; return 0; } hypre-2.33.0/src/FEI_mv/femli/mli_solver_sgs.h000066400000000000000000000026211477326011500211250ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #ifndef __MLI_SOLVER_SGS_H__ #define __MLI_SOLVER_SGS_H__ #include #include "_hypre_parcsr_mv.h" #include "mli_matrix.h" #include "mli_vector.h" #include "mli_solver.h" /****************************************************************************** * data structure for the symmetric Gauss Seidel relaxation scheme *---------------------------------------------------------------------------*/ class MLI_Solver_SGS : public MLI_Solver { MLI_Matrix *Amat_; int zeroInitialGuess_; int nSweeps_; double *relaxWeights_; int myColor_; int numColors_; int scheme_; int printRNorm_; int findOmega_; int omegaNumIncr_; double omegaIncrement_; public : MLI_Solver_SGS(char *name); ~MLI_Solver_SGS(); int setup(MLI_Matrix *Amat); int solve(MLI_Vector *f, MLI_Vector *u); int setParams(char *param, int argc, char **argv); int setParams(int nTimes, double *relaxWeights); int doProcColoring(); int findOmega(); }; #endif hypre-2.33.0/src/FEI_mv/femli/mli_solver_superlu.cxx000066400000000000000000000273401477326011500224100ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /* **************************************************************************** * -- SuperLU routine (version 1.1) -- * Univ. of California Berkeley, Xerox Palo Alto Research Center, * and Lawrence Berkeley National Lab. * ************************************************************************* */ #ifdef MLI_SUPERLU #include #include "mli_solver_superlu.h" /* **************************************************************************** * constructor * --------------------------------------------------------------------------*/ MLI_Solver_SuperLU::MLI_Solver_SuperLU(char *name) : MLI_Solver(name) { permR_ = NULL; permC_ = NULL; mliAmat_ = NULL; factorized_ = 0; } /* **************************************************************************** * destructor * --------------------------------------------------------------------------*/ MLI_Solver_SuperLU::~MLI_Solver_SuperLU() { if ( permR_ != NULL ) { Destroy_SuperNode_Matrix(&superLU_Lmat); Destroy_CompCol_Matrix(&superLU_Umat); } if ( permR_ != NULL ) delete [] permR_; if ( permC_ != NULL ) delete [] permC_; } /* **************************************************************************** * setup * --------------------------------------------------------------------------*/ int MLI_Solver_SuperLU::setup( MLI_Matrix *Amat ) { int globalNRows, localNRows, startRow, localNnz, globalNnz; int *csrIA, *csrJA, *gcsrIA, *gcsrJA, *gcscJA, *gcscIA; int nnz, row_num, irow, i, j, rowSize, *cols, *recvCntArray; int *dispArray, itemp, *cntArray, icol, colNum, index; int *etree, permcSpec, lwork, panel_size, relax, info, mypid, nprocs; double *vals, *csrAA, *gcsrAA, *gcscAA, diagPivotThresh; MPI_Comm mpiComm; hypre_ParCSRMatrix *hypreA; SuperMatrix AC; superlu_options_t slu_options; SuperLUStat_t slu_stat; GlobalLU_t Glu; /* --------------------------------------------------------------- * fetch matrix * -------------------------------------------------------------*/ mliAmat_ = Amat; if ( strcmp( mliAmat_->getName(), "HYPRE_ParCSR" ) ) { printf("MLI_Solver_SuperLU::setup ERROR - not HYPRE_ParCSR.\n"); exit(1); } hypreA = (hypre_ParCSRMatrix *) mliAmat_->getMatrix(); /* --------------------------------------------------------------- * fetch matrix * -------------------------------------------------------------*/ mpiComm = hypre_ParCSRMatrixComm( hypreA ); MPI_Comm_rank( mpiComm, &mypid ); MPI_Comm_size( mpiComm, &nprocs ); globalNRows = hypre_ParCSRMatrixGlobalNumRows( hypreA ); localNRows = hypre_ParCSRMatrixNumRows( hypreA ); startRow = hypre_ParCSRMatrixFirstRowIndex( hypreA ); localNnz = 0; for ( irow = 0; irow < localNRows; irow++ ) { row_num = startRow + irow; hypre_ParCSRMatrixGetRow(hypreA, row_num, &rowSize, &cols, NULL); localNnz += rowSize; hypre_ParCSRMatrixRestoreRow(hypreA, row_num, &rowSize, &cols, NULL); } MPI_Allreduce(&localNnz, &globalNnz, 1, MPI_INT, MPI_SUM, mpiComm ); csrIA = new int[localNRows+1]; if ( localNnz > 0 ) csrJA = new int[localNnz]; else csrJA = NULL; if ( localNnz > 0 ) csrAA = new double[localNnz]; else csrAA = NULL; nnz = 0; csrIA[0] = nnz; for ( irow = 0; irow < localNRows; irow++ ) { row_num = startRow + irow; hypre_ParCSRMatrixGetRow(hypreA, row_num, &rowSize, &cols, &vals); for ( i = 0; i < rowSize; i++ ) { csrJA[nnz] = cols[i]; csrAA[nnz++] = vals[i]; } hypre_ParCSRMatrixRestoreRow(hypreA, row_num, &rowSize, &cols, &vals); csrIA[irow+1] = nnz; } /* --------------------------------------------------------------- * collect the whole matrix * -------------------------------------------------------------*/ gcsrIA = new int[globalNRows+1]; gcsrJA = new int[globalNnz]; gcsrAA = new double[globalNnz]; recvCntArray = new int[nprocs]; dispArray = new int[nprocs]; MPI_Allgather(&localNRows,1,MPI_INT,recvCntArray,1,MPI_INT,mpiComm); dispArray[0] = 0; for ( i = 1; i < nprocs; i++ ) dispArray[i] = dispArray[i-1] + recvCntArray[i-1]; csrIA[0] = csrIA[localNRows]; MPI_Allgatherv(csrIA, localNRows, MPI_INT, gcsrIA, recvCntArray, dispArray, MPI_INT, mpiComm); nnz = 0; row_num = 0; for ( i = 0; i < nprocs; i++ ) { if ( recvCntArray[i] > 0 ) { itemp = gcsrIA[row_num]; gcsrIA[row_num] = 0; for ( j = 0; j < recvCntArray[i]; j++ ) gcsrIA[row_num+j] += nnz; nnz += itemp; row_num += recvCntArray[i]; } } gcsrIA[globalNRows] = nnz; MPI_Allgather(&localNnz, 1, MPI_INT, recvCntArray, 1, MPI_INT, mpiComm); dispArray[0] = 0; for ( i = 1; i < nprocs; i++ ) dispArray[i] = dispArray[i-1] + recvCntArray[i-1]; MPI_Allgatherv(csrJA, localNnz, MPI_INT, gcsrJA, recvCntArray, dispArray, MPI_INT, mpiComm); MPI_Allgatherv(csrAA, localNnz, MPI_DOUBLE, gcsrAA, recvCntArray, dispArray, MPI_DOUBLE, mpiComm); delete [] recvCntArray; delete [] dispArray; delete [] csrIA; if ( csrJA != NULL ) delete [] csrJA; if ( csrAA != NULL ) delete [] csrAA; /* --------------------------------------------------------------- * conversion from CSR to CSC * -------------------------------------------------------------*/ cntArray = new int[globalNRows]; for ( irow = 0; irow < globalNRows; irow++ ) cntArray[irow] = 0; for ( irow = 0; irow < globalNRows; irow++ ) { for ( i = gcsrIA[irow]; i < gcsrIA[irow+1]; i++ ) if ( gcsrJA[i] >= 0 && gcsrJA[i] < globalNRows ) cntArray[gcsrJA[i]]++; else { printf("%d : MLI_Solver_SuperLU ERROR : gcsrJA %d %d = %d(%d)\n", mypid, irow, i, gcsrJA[i], globalNRows); exit(1); } } gcscJA = hypre_TAlloc(int, (globalNRows+1) , HYPRE_MEMORY_HOST); gcscIA = hypre_TAlloc(int, globalNnz , HYPRE_MEMORY_HOST); gcscAA = hypre_TAlloc(double, globalNnz , HYPRE_MEMORY_HOST); gcscJA[0] = 0; nnz = 0; for ( icol = 1; icol <= globalNRows; icol++ ) { nnz += cntArray[icol-1]; gcscJA[icol] = nnz; } for ( irow = 0; irow < globalNRows; irow++ ) { for ( i = gcsrIA[irow]; i < gcsrIA[irow+1]; i++ ) { colNum = gcsrJA[i]; index = gcscJA[colNum]++; gcscIA[index] = irow; gcscAA[index] = gcsrAA[i]; } } gcscJA[0] = 0; nnz = 0; for ( icol = 1; icol <= globalNRows; icol++ ) { nnz += cntArray[icol-1]; gcscJA[icol] = nnz; } delete [] cntArray; delete [] gcsrIA; delete [] gcsrJA; delete [] gcsrAA; /* --------------------------------------------------------------- * make SuperMatrix * -------------------------------------------------------------*/ dCreate_CompCol_Matrix(&superLU_Amat, globalNRows, globalNRows, gcscJA[globalNRows], gcscAA, gcscIA, gcscJA, SLU_NC, SLU_D, SLU_GE); etree = new int[globalNRows]; permC_ = new int[globalNRows]; permR_ = new int[globalNRows]; permcSpec = 0; get_perm_c(permcSpec, &superLU_Amat, permC_); slu_options.Fact = DOFACT; slu_options.SymmetricMode = NO; sp_preorder(&slu_options, &superLU_Amat, permC_, etree, &AC); diagPivotThresh = 1.0; panel_size = sp_ienv(1); relax = sp_ienv(2); StatInit(&slu_stat); lwork = 0; slu_options.ColPerm = MY_PERMC; slu_options.DiagPivotThresh = diagPivotThresh; // dgstrf(&slu_options, &AC, dropTol, relax, panel_size, // etree, NULL, lwork, permC_, permR_, &superLU_Lmat, // &superLU_Umat, &slu_stat, &info); dgstrf(&slu_options, &AC, relax, panel_size, etree, NULL, lwork, permC_, permR_, &superLU_Lmat, &superLU_Umat, &Glu, &slu_stat, &info); Destroy_CompCol_Permuted(&AC); Destroy_CompCol_Matrix(&superLU_Amat); delete [] etree; factorized_ = 1; StatFree(&slu_stat); return 0; } /* **************************************************************************** * This subroutine calls the SuperLU subroutine to perform LU * backward substitution * --------------------------------------------------------------------------*/ int MLI_Solver_SuperLU::solve( MLI_Vector *f_in, MLI_Vector *u_in ) { int globalNRows, localNRows, startRow, *recvCntArray; int i, irow, nprocs, *dispArray, info; double *fGlobal; hypre_ParVector *f, *u; double *uData, *fData; SuperMatrix B; MPI_Comm mpiComm; hypre_ParCSRMatrix *hypreA; SuperLUStat_t slu_stat; trans_t trans; /* ------------------------------------------------------------- * check that the factorization has been called * -----------------------------------------------------------*/ if ( ! factorized_ ) { printf("MLI_Solver_SuperLU::Solve ERROR - not factorized yet.\n"); exit(1); } /* ------------------------------------------------------------- * fetch matrix and vector parameters * -----------------------------------------------------------*/ hypreA = (hypre_ParCSRMatrix *) mliAmat_->getMatrix(); mpiComm = hypre_ParCSRMatrixComm( hypreA ); globalNRows = hypre_ParCSRMatrixGlobalNumRows( hypreA ); localNRows = hypre_ParCSRMatrixNumRows( hypreA ); startRow = hypre_ParCSRMatrixFirstRowIndex( hypreA ); u = (hypre_ParVector *) u_in->getVector(); uData = hypre_VectorData(hypre_ParVectorLocalVector(u)); f = (hypre_ParVector *) f_in->getVector(); fData = hypre_VectorData(hypre_ParVectorLocalVector(f)); /* ------------------------------------------------------------- * collect global vector and create a SuperLU dense matrix * -----------------------------------------------------------*/ MPI_Comm_size( mpiComm, &nprocs ); recvCntArray = new int[nprocs]; dispArray = new int[nprocs]; fGlobal = new double[globalNRows]; MPI_Allgather(&localNRows,1,MPI_INT,recvCntArray,1,MPI_INT,mpiComm); dispArray[0] = 0; for ( i = 1; i < nprocs; i++ ) dispArray[i] = dispArray[i-1] + recvCntArray[i-1]; MPI_Allgatherv(fData, localNRows, MPI_DOUBLE, fGlobal, recvCntArray, dispArray, MPI_DOUBLE, mpiComm); dCreate_Dense_Matrix(&B, globalNRows,1,fGlobal,globalNRows,SLU_DN, SLU_D,SLU_GE); /* ------------------------------------------------------------- * solve the problem * -----------------------------------------------------------*/ trans = NOTRANS; StatInit(&slu_stat); dgstrs (trans, &superLU_Lmat, &superLU_Umat, permC_, permR_, &B, &slu_stat, &info); /* ------------------------------------------------------------- * fetch the solution * -----------------------------------------------------------*/ for ( irow = 0; irow < localNRows; irow++ ) uData[irow] = fGlobal[startRow+irow]; /* ------------------------------------------------------------- * clean up * -----------------------------------------------------------*/ delete [] fGlobal; delete [] recvCntArray; delete [] dispArray; Destroy_SuperMatrix_Store(&B); StatFree(&slu_stat); return info; } #endif hypre-2.33.0/src/FEI_mv/femli/mli_solver_superlu.h000066400000000000000000000024241477326011500220310ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #ifdef MLI_SUPERLU #ifndef __MLI_SOLVER_SUPERLU_H__ #define __MLI_SOLVER_SUPERLU_H__ #include #include "slu_ddefs.h" #include "slu_util.h" #include "mli_matrix.h" #include "mli_vector.h" #include "mli_solver.h" /****************************************************************************** * data structure for the SuperLU solution scheme *---------------------------------------------------------------------------*/ class MLI_Solver_SuperLU : public MLI_Solver { MLI_Matrix *mliAmat_; int factorized_; int *permR_; int *permC_; SuperMatrix superLU_Amat; SuperMatrix superLU_Lmat; SuperMatrix superLU_Umat; public : MLI_Solver_SuperLU(char *name); ~MLI_Solver_SuperLU(); int setup(MLI_Matrix *Amat); int solve(MLI_Vector *f, MLI_Vector *u); int setParams(char *paramString, int argc, char **argv) {return -1;} }; #endif #else int bogus; #endif hypre-2.33.0/src/FEI_mv/femli/mli_utils.c000066400000000000000000003212351477326011500200770ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * Utilities functions * *****************************************************************************/ /*-------------------------------------------------------------------------- * include files *--------------------------------------------------------------------------*/ #include #include #include "HYPRE.h" #include "mli_utils.h" #include "HYPRE_IJ_mv.h" #include "../fei-hypre/HYPRE_parcsr_fgmres.h" #include "_hypre_lapack.h" /*-------------------------------------------------------------------------- * external function *--------------------------------------------------------------------------*/ #ifdef __cplusplus extern "C" { #else extern #endif int hypre_BoomerAMGBuildCoarseOperator(hypre_ParCSRMatrix*,hypre_ParCSRMatrix*, hypre_ParCSRMatrix *,hypre_ParCSRMatrix **); void hypre_qsort0(int *, int, int); void hypre_qsort1(int *, double *, int, int); int MLI_Utils_IntTreeUpdate(int treeLeng, int *tree,int *treeInd); #ifdef __cplusplus } #endif #define habs(x) (((x) > 0) ? x : -(x)) /***************************************************************************** * destructor for hypre_ParCSRMatrix conforming to MLI requirements *--------------------------------------------------------------------------*/ int MLI_Utils_HypreParCSRMatrixGetDestroyFunc(MLI_Function *funcPtr) { funcPtr->func_ = (int (*)(void *)) hypre_ParCSRMatrixDestroy; return 0; } /***************************************************************************** * destructor for hypre_CSRMatrix conforming to MLI requirements *--------------------------------------------------------------------------*/ int MLI_Utils_HypreCSRMatrixGetDestroyFunc( MLI_Function *funcPtr ) { funcPtr->func_ = (int (*)(void *)) hypre_CSRMatrixDestroy; return 0; } /***************************************************************************** * destructor for hypre_ParVector conforming to MLI requirements *--------------------------------------------------------------------------*/ int MLI_Utils_HypreParVectorGetDestroyFunc( MLI_Function *funcPtr ) { funcPtr->func_ = (int (*)(void *)) hypre_ParVectorDestroy; return 0; } /***************************************************************************** * destructor for hypre_Vector conforming to MLI requirements *--------------------------------------------------------------------------*/ int MLI_Utils_HypreVectorGetDestroyFunc( MLI_Function *funcPtr ) { funcPtr->func_ = (int (*)(void *)) hypre_SeqVectorDestroy; return 0; } /*************************************************************************** * FormJacobi ( Jmat = I - alpha * Amat ) *--------------------------------------------------------------------------*/ int MLI_Utils_HypreMatrixFormJacobi(void *A, double alpha, void **J) { int *rowPart, mypid, nprocs; int localNRows, startRow, ierr, irow, *rowLengths; int rownum, rowSize, *colInd, *newColInd, newRowSize; int icol, maxnnz; double *colVal, *newColVal, dtemp; MPI_Comm comm; HYPRE_IJMatrix IJmat; hypre_ParCSRMatrix *Amat, *Jmat; /* ----------------------------------------------------------------------- * get matrix parameters * ----------------------------------------------------------------------*/ Amat = (hypre_ParCSRMatrix *) A; comm = hypre_ParCSRMatrixComm(Amat); MPI_Comm_rank(comm, &mypid); MPI_Comm_size(comm, &nprocs); HYPRE_ParCSRMatrixGetRowPartitioning((HYPRE_ParCSRMatrix)Amat,&rowPart); localNRows = rowPart[mypid+1] - rowPart[mypid]; startRow = rowPart[mypid]; /* ----------------------------------------------------------------------- * initialize new matrix * ----------------------------------------------------------------------*/ ierr = HYPRE_IJMatrixCreate(comm, startRow, startRow+localNRows-1, startRow, startRow+localNRows-1, &IJmat); ierr += HYPRE_IJMatrixSetObjectType(IJmat, HYPRE_PARCSR); hypre_assert( !ierr ); maxnnz = 0; rowLengths = hypre_CTAlloc(int, localNRows, HYPRE_MEMORY_HOST); if ( rowLengths == NULL ) { printf("FormJacobi ERROR : memory allocation.\n"); exit(1); } for ( irow = 0; irow < localNRows; irow++ ) { rownum = startRow + irow; hypre_ParCSRMatrixGetRow(Amat, rownum, &rowSize, &colInd, NULL); rowLengths[irow] = rowSize; if ( rowSize <= 0 ) { printf("FormJacobi ERROR : Amat has rowSize <= 0 (%d)\n", rownum); exit(1); } for ( icol = 0; icol < rowSize; icol++ ) if ( colInd[icol] == rownum ) break; if ( icol == rowSize ) rowLengths[irow]++; hypre_ParCSRMatrixRestoreRow(Amat, rownum, &rowSize, &colInd, NULL); maxnnz = ( rowLengths[irow] > maxnnz ) ? rowLengths[irow] : maxnnz; } ierr = HYPRE_IJMatrixSetRowSizes(IJmat, rowLengths); hypre_assert( !ierr ); HYPRE_IJMatrixInitialize(IJmat); /* ----------------------------------------------------------------------- * load the new matrix * ----------------------------------------------------------------------*/ newColInd = hypre_CTAlloc(int, maxnnz, HYPRE_MEMORY_HOST); newColVal = hypre_CTAlloc(double, maxnnz, HYPRE_MEMORY_HOST); for ( irow = 0; irow < localNRows; irow++ ) { rownum = startRow + irow; hypre_ParCSRMatrixGetRow(Amat, rownum, &rowSize, &colInd, &colVal); dtemp = 1.0; for ( icol = 0; icol < rowSize; icol++ ) if ( colInd[icol] == rownum ) {dtemp = colVal[icol]; break;} if ( habs(dtemp) > 1.0e-16 ) dtemp = 1.0 / dtemp; else dtemp = 1.0; for ( icol = 0; icol < rowSize; icol++ ) { newColInd[icol] = colInd[icol]; newColVal[icol] = - alpha * colVal[icol] * dtemp; if ( colInd[icol] == rownum ) newColVal[icol] += 1.0; } newRowSize = rowSize; if ( rowLengths[irow] == rowSize+1 ) { newColInd[newRowSize] = rownum; newColVal[newRowSize++] = 1.0; } hypre_ParCSRMatrixRestoreRow(Amat, rownum, &rowSize, &colInd, &colVal); HYPRE_IJMatrixSetValues(IJmat, 1, &newRowSize,(const int *) &rownum, (const int *) newColInd, (const double *) newColVal); } HYPRE_IJMatrixAssemble(IJmat); /* ----------------------------------------------------------------------- * create new MLI_matrix and then clean up * ----------------------------------------------------------------------*/ HYPRE_IJMatrixGetObject(IJmat, (void **) &Jmat); HYPRE_IJMatrixSetObjectType(IJmat, -1); HYPRE_IJMatrixDestroy(IJmat); hypre_MatvecCommPkgCreate((hypre_ParCSRMatrix *) Jmat); (*J) = (void *) Jmat; hypre_TFree(newColInd , HYPRE_MEMORY_HOST); hypre_TFree(newColVal , HYPRE_MEMORY_HOST); hypre_TFree(rowLengths , HYPRE_MEMORY_HOST); hypre_TFree(rowPart , HYPRE_MEMORY_HOST); return 0; } /*************************************************************************** * Given a local degree of freedom, construct an array for that for all *--------------------------------------------------------------------------*/ int MLI_Utils_GenPartition(MPI_Comm comm, int nlocal, int **rowPart) { int i, nprocs, mypid, *garray, count=0, count2; MPI_Comm_rank(comm, &mypid); MPI_Comm_size(comm, &nprocs); garray = hypre_CTAlloc(int, nprocs+1, HYPRE_MEMORY_HOST); garray[mypid] = nlocal; MPI_Allgather(&nlocal, 1, MPI_INT, garray, 1, MPI_INT, comm); count = 0; for ( i = 0; i < nprocs; i++ ) { count2 = garray[i]; garray[i] = count; count += count2; } garray[nprocs] = count; (*rowPart) = garray; return 0; } /*************************************************************************** * Given matrix A and vector v, scale the vector by (v'*v)/(v'*A*v). *--------------------------------------------------------------------------*/ int MLI_Utils_ScaleVec(hypre_ParCSRMatrix *Amat, hypre_ParVector *vec) { MPI_Comm comm; int mypid, nprocs, *partition; hypre_ParVector *temp; double norm1, norm2; /* ----------------------------------------------------------------- * fetch matrix parameters * ----------------------------------------------------------------*/ comm = hypre_ParCSRMatrixComm(Amat); MPI_Comm_rank(comm, &mypid); MPI_Comm_size(comm, &nprocs); HYPRE_ParCSRMatrixGetRowPartitioning((HYPRE_ParCSRMatrix)Amat,&partition); /* ----------------------------------------------------------------- * create temporary vector * ----------------------------------------------------------------*/ temp = hypre_ParVectorCreate(comm, partition[nprocs], partition); hypre_ParVectorInitialize(temp); /* ----------------------------------------------------------------- * normalize vector * ----------------------------------------------------------------*/ norm2 = hypre_ParVectorInnerProd(vec, vec); hypre_ParVectorScale(1./sqrt(norm2), vec); /* ----------------------------------------------------------------- * multiply by matrix, perform inner product, and scale * ----------------------------------------------------------------*/ norm1 = hypre_ParVectorInnerProd(vec, vec); hypre_ParCSRMatrixMatvec(1.0, Amat, vec, 0.0, temp); norm2 = hypre_ParVectorInnerProd(vec, temp); hypre_ParVectorScale(norm1/norm2, vec); /* printf("Rayleigh quotient: %f\n", norm2/norm1); */ hypre_ParVectorDestroy(temp); return 0; } /*************************************************************************** * Given a matrix, find its maximum eigenvalue *--------------------------------------------------------------------------*/ int MLI_Utils_ComputeSpectralRadius(hypre_ParCSRMatrix *Amat, double *maxEigen) { int mypid, nprocs, *partition, startRow, endRow; int it, maxits=20, ierr; double norm2, lambda; MPI_Comm comm; HYPRE_IJVector IJvec1, IJvec2; HYPRE_ParVector vec1, vec2; /* ----------------------------------------------------------------- * fetch matrix paramters * ----------------------------------------------------------------*/ comm = hypre_ParCSRMatrixComm(Amat); MPI_Comm_rank( comm, &mypid ); MPI_Comm_size( comm, &nprocs ); HYPRE_ParCSRMatrixGetRowPartitioning((HYPRE_ParCSRMatrix)Amat,&partition); startRow = partition[mypid]; endRow = partition[mypid+1]; hypre_TFree(partition, HYPRE_MEMORY_HOST); /* ----------------------------------------------------------------- * create two temporary vectors * ----------------------------------------------------------------*/ ierr = HYPRE_IJVectorCreate(comm, startRow, endRow-1, &IJvec1); ierr += HYPRE_IJVectorSetObjectType(IJvec1, HYPRE_PARCSR); ierr += HYPRE_IJVectorInitialize(IJvec1); ierr += HYPRE_IJVectorAssemble(IJvec1); ierr += HYPRE_IJVectorCreate(comm, startRow, endRow-1, &IJvec2); ierr += HYPRE_IJVectorSetObjectType(IJvec2, HYPRE_PARCSR); ierr += HYPRE_IJVectorInitialize(IJvec2); ierr += HYPRE_IJVectorAssemble(IJvec2); /* ----------------------------------------------------------------- * perform the power iterations * ----------------------------------------------------------------*/ ierr += HYPRE_IJVectorGetObject(IJvec1, (void **) &vec1); ierr += HYPRE_IJVectorGetObject(IJvec2, (void **) &vec2); hypre_assert(!ierr); HYPRE_ParVectorSetRandomValues( vec1, 2934731 ); HYPRE_ParCSRMatrixMatvec(1.0,(HYPRE_ParCSRMatrix) Amat,vec1,0.0,vec2 ); HYPRE_ParVectorInnerProd( vec2, vec2, &norm2); for ( it = 0; it < maxits; it++ ) { HYPRE_ParVectorInnerProd( vec2, vec2, &norm2); HYPRE_ParVectorCopy( vec2, vec1); norm2 = 1.0 / sqrt(norm2); HYPRE_ParVectorScale( norm2, vec1 ); HYPRE_ParCSRMatrixMatvec(1.0,(HYPRE_ParCSRMatrix) Amat,vec1,0.0,vec2 ); HYPRE_ParVectorInnerProd( vec1, vec2, &lambda); } (*maxEigen) = lambda*1.05; HYPRE_IJVectorDestroy(IJvec1); HYPRE_IJVectorDestroy(IJvec2); return 0; } /****************************************************************************** * compute Ritz Values that approximates extreme eigenvalues *--------------------------------------------------------------------------*/ int MLI_Utils_ComputeExtremeRitzValues(hypre_ParCSRMatrix *A, double *ritz, int scaleFlag) { int i, j, k, its, maxIter, nprocs, mypid, localNRows, globalNRows; int startRow, endRow, *partition, *ADiagI, *ADiagJ; double alpha, beta, rho, rhom1, sigma, offdiagNorm, *zData; double rnorm, *alphaArray, *rnormArray, **Tmat, initOffdiagNorm; double app, aqq, arr, ass, apq, sign, tau, t, c, s; double *ADiagA, one=1.0, *srdiag; MPI_Comm comm; hypre_CSRMatrix *ADiag; hypre_ParVector *rVec=NULL, *zVec, *pVec, *apVec; double *pData, *apData; /*----------------------------------------------------------------- * fetch matrix information *-----------------------------------------------------------------*/ comm = hypre_ParCSRMatrixComm(A); MPI_Comm_rank(comm,&mypid); MPI_Comm_size(comm,&nprocs); ADiag = hypre_ParCSRMatrixDiag(A); ADiagA = hypre_CSRMatrixData(ADiag); ADiagI = hypre_CSRMatrixI(ADiag); ADiagJ = hypre_CSRMatrixJ(ADiag); HYPRE_ParCSRMatrixGetRowPartitioning((HYPRE_ParCSRMatrix) A, &partition); startRow = partition[mypid]; endRow = partition[mypid+1] - 1; globalNRows = partition[nprocs]; localNRows = endRow - startRow + 1; hypre_TFree( partition , HYPRE_MEMORY_HOST); maxIter = 5; if ( globalNRows < maxIter ) maxIter = globalNRows; ritz[0] = ritz[1] = 0.0; srdiag = hypre_TAlloc(double, localNRows , HYPRE_MEMORY_HOST); for ( i = 0; i < localNRows; i++ ) { srdiag[i] = 1.0; for ( j = ADiagI[i]; j < ADiagI[i+1]; j++ ) if (ADiagJ[j] == i) {srdiag[i] = ADiagA[j]; break;} if ( srdiag[i] > 0.0 ) srdiag[i] = 1.0 / sqrt(srdiag[i]); else srdiag[i] = 1.0 / sqrt(-srdiag[i]); } /*----------------------------------------------------------------- * allocate space *-----------------------------------------------------------------*/ if ( localNRows > 0 ) { HYPRE_ParCSRMatrixGetRowPartitioning((HYPRE_ParCSRMatrix)A,&partition); rVec = hypre_ParVectorCreate(comm, globalNRows, partition); hypre_ParVectorInitialize(rVec); HYPRE_ParCSRMatrixGetRowPartitioning((HYPRE_ParCSRMatrix)A,&partition); zVec = hypre_ParVectorCreate(comm, globalNRows, partition); hypre_ParVectorInitialize(zVec); HYPRE_ParCSRMatrixGetRowPartitioning((HYPRE_ParCSRMatrix)A,&partition); pVec = hypre_ParVectorCreate(comm, globalNRows, partition); hypre_ParVectorInitialize(pVec); HYPRE_ParCSRMatrixGetRowPartitioning((HYPRE_ParCSRMatrix)A,&partition); apVec = hypre_ParVectorCreate(comm, globalNRows, partition); hypre_ParVectorInitialize(apVec); zData = hypre_VectorData( hypre_ParVectorLocalVector(zVec) ); pData = hypre_VectorData( hypre_ParVectorLocalVector(pVec) ); apData = hypre_VectorData( hypre_ParVectorLocalVector(apVec) ); } HYPRE_ParVectorSetRandomValues((HYPRE_ParVector) rVec, 1209873 ); alphaArray = hypre_TAlloc(double, (maxIter+1) , HYPRE_MEMORY_HOST); rnormArray = hypre_TAlloc(double, (maxIter+1) , HYPRE_MEMORY_HOST); Tmat = hypre_TAlloc(double*, (maxIter+1) , HYPRE_MEMORY_HOST); for ( i = 0; i <= maxIter; i++ ) { Tmat[i] = hypre_TAlloc(double, (maxIter+1) , HYPRE_MEMORY_HOST); for ( j = 0; j <= maxIter; j++ ) Tmat[i][j] = 0.0; Tmat[i][i] = 1.0; } /*----------------------------------------------------------------- * compute initial residual vector norm *-----------------------------------------------------------------*/ hypre_ParVectorSetRandomValues(rVec, 1209837); hypre_ParVectorSetConstantValues(pVec, 0.0); hypre_ParVectorSetConstantValues(zVec, 0.0); rho = hypre_ParVectorInnerProd(rVec, rVec); rnorm = sqrt(rho); rnormArray[0] = rnorm; if ( rnorm == 0.0 ) { printf("MLI_Utils_ComputeExtremeRitzValues : fail for res=0.\n"); hypre_ParVectorDestroy( rVec ); hypre_ParVectorDestroy( pVec ); hypre_ParVectorDestroy( zVec ); hypre_ParVectorDestroy( apVec ); return 1; } /*----------------------------------------------------------------- * main loop *-----------------------------------------------------------------*/ for ( its = 0; its < maxIter; its++ ) { rhom1 = rho; rho = hypre_ParVectorInnerProd(rVec, rVec); if (its == 0) beta = 0.0; else { beta = rho / rhom1; Tmat[its-1][its] = -beta; } HYPRE_ParVectorScale( beta, (HYPRE_ParVector) pVec ); hypre_ParVectorAxpy( one, rVec, pVec ); if (scaleFlag) for ( i = 0; i < localNRows; i++ ) apData[i] = pData[i]*srdiag[i]; else for ( i = 0; i < localNRows; i++ ) apData[i] = pData[i]; hypre_ParCSRMatrixMatvec(one, A, apVec, 0.0, zVec); if (scaleFlag) for ( i = 0; i < localNRows; i++ ) apData[i] = zData[i]*srdiag[i]; else for ( i = 0; i < localNRows; i++ ) apData[i] = zData[i]; sigma = hypre_ParVectorInnerProd(pVec, apVec); alpha = rho / sigma; alphaArray[its] = sigma; hypre_ParVectorAxpy( -alpha, apVec, rVec ); rnorm = sqrt(hypre_ParVectorInnerProd(rVec, rVec)); rnormArray[its+1] = rnorm; if ( rnorm < 1.0E-8 * rnormArray[0] ) { maxIter = its + 1; break; } } /*----------------------------------------------------------------- * construct T *-----------------------------------------------------------------*/ Tmat[0][0] = alphaArray[0]; for ( i = 1; i < maxIter; i++ ) Tmat[i][i]=alphaArray[i]+alphaArray[i-1]*Tmat[i-1][i]*Tmat[i-1][i]; for ( i = 0; i < maxIter; i++ ) { Tmat[i][i+1] *= alphaArray[i]; Tmat[i+1][i] = Tmat[i][i+1]; rnormArray[i] = 1.0 / rnormArray[i]; } for ( i = 0; i < maxIter; i++ ) for ( j = 0; j < maxIter; j++ ) Tmat[i][j] = Tmat[i][j] * rnormArray[i] * rnormArray[j]; /* ----------------------------------------------------------------*/ /* diagonalize T using Jacobi iteration */ /* ----------------------------------------------------------------*/ offdiagNorm = 0.0; for ( i = 0; i < maxIter; i++ ) for ( j = 0; j < i; j++ ) offdiagNorm += (Tmat[i][j] * Tmat[i][j]); offdiagNorm *= 2.0; initOffdiagNorm = offdiagNorm; while ( offdiagNorm > initOffdiagNorm * 1.0E-8 ) { for ( i = 1; i < maxIter; i++ ) { for ( j = 0; j < i; j++ ) { apq = Tmat[i][j]; if ( apq != 0.0 ) { app = Tmat[j][j]; aqq = Tmat[i][i]; tau = ( aqq - app ) / (2.0 * apq); sign = (tau >= 0.0) ? 1.0 : -1.0; t = sign / (tau * sign + sqrt(1.0 + tau * tau)); c = 1.0 / sqrt( 1.0 + t * t ); s = t * c; for ( k = 0; k < maxIter; k++ ) { arr = Tmat[j][k]; ass = Tmat[i][k]; Tmat[j][k] = c * arr - s * ass; Tmat[i][k] = s * arr + c * ass; } for ( k = 0; k < maxIter; k++ ) { arr = Tmat[k][j]; ass = Tmat[k][i]; Tmat[k][j] = c * arr - s * ass; Tmat[k][i] = s * arr + c * ass; } } } } offdiagNorm = 0.0; for ( i = 0; i < maxIter; i++ ) for ( j = 0; j < i; j++ ) offdiagNorm += (Tmat[i][j] * Tmat[i][j]); offdiagNorm *= 2.0; } /* ---------------------------------------------------------------- * search for max and min eigenvalues * ----------------------------------------------------------------*/ t = Tmat[0][0]; for (i = 1; i < maxIter; i++) t = (Tmat[i][i] > t) ? Tmat[i][i] : t; ritz[0] = t * 1.1; t = Tmat[0][0]; for (i = 1; i < maxIter; i++) t = (Tmat[i][i] < t) ? Tmat[i][i] : t; ritz[1] = t / 1.1; /* ----------------------------------------------------------------* * de-allocate storage for temporary vectors * ----------------------------------------------------------------*/ if ( localNRows > 0 ) { hypre_ParVectorDestroy( rVec ); hypre_ParVectorDestroy( zVec ); hypre_ParVectorDestroy( pVec ); hypre_ParVectorDestroy( apVec ); } hypre_TFree(alphaArray, HYPRE_MEMORY_HOST); hypre_TFree(rnormArray, HYPRE_MEMORY_HOST); for (i = 0; i <= maxIter; i++) hypre_TFree(Tmat[i], HYPRE_MEMORY_HOST); hypre_TFree(Tmat, HYPRE_MEMORY_HOST); hypre_TFree(srdiag, HYPRE_MEMORY_HOST); return 0; } /****************************************************************************** * compute matrix max norm *--------------------------------------------------------------------------*/ int MLI_Utils_ComputeMatrixMaxNorm(hypre_ParCSRMatrix *A, double *norm, int scaleFlag) { int i, j, iStart, iEnd, localNRows, *ADiagI, *AOffdI; int mypid; double *ADiagA, *AOffdA, maxVal, rowSum, dtemp; hypre_CSRMatrix *ADiag, *AOffd; MPI_Comm comm; /*----------------------------------------------------------------- * fetch machine and smoother parameters *-----------------------------------------------------------------*/ ADiag = hypre_ParCSRMatrixDiag(A); ADiagA = hypre_CSRMatrixData(ADiag); ADiagI = hypre_CSRMatrixI(ADiag); AOffd = hypre_ParCSRMatrixDiag(A); AOffdA = hypre_CSRMatrixData(AOffd); AOffdI = hypre_CSRMatrixI(AOffd); localNRows = hypre_CSRMatrixNumRows(ADiag); comm = hypre_ParCSRMatrixComm(A); MPI_Comm_rank(comm,&mypid); maxVal = 0.0; for (i = 0; i < localNRows; i++) { rowSum = 0.0; iStart = ADiagI[i]; iEnd = ADiagI[i+1]; for (j = iStart; j < iEnd; j++) rowSum += habs(ADiagA[j]); iStart = AOffdI[i]; iEnd = AOffdI[i+1]; for (j = iStart; j < iEnd; j++) rowSum += habs(AOffdA[j]); if ( scaleFlag == 1 ) { if ( ADiagA[ADiagI[i]] == 0.0) printf("MLI_Utils_ComputeMatrixMaxNorm - zero diagonal.\n"); else rowSum /= ADiagA[ADiagI[i]]; } if ( rowSum > maxVal ) maxVal = rowSum; } MPI_Allreduce(&maxVal, &dtemp, 1, MPI_DOUBLE, MPI_MAX, comm); (*norm) = dtemp; return 0; } /*************************************************************************** * Given a local degree of freedom, construct an array for that for all *--------------------------------------------------------------------------*/ double MLI_Utils_WTime() { clock_t ticks; double seconds; ticks = clock() ; seconds = (double) ticks / (double) CLOCKS_PER_SEC; return seconds; } /*************************************************************************** * Given a Hypre ParCSR matrix, output the matrix to a file *--------------------------------------------------------------------------*/ int MLI_Utils_HypreMatrixPrint(void *in_mat, char *name) { MPI_Comm comm; int i, mypid, localNRows, startRow, *rowPart, rowSize; int j, *colInd, nnz; double *colVal; char fname[200]; FILE *fp; hypre_ParCSRMatrix *mat; HYPRE_ParCSRMatrix hypre_mat; mat = (hypre_ParCSRMatrix *) in_mat; hypre_mat = (HYPRE_ParCSRMatrix) mat; comm = hypre_ParCSRMatrixComm(mat); MPI_Comm_rank( comm, &mypid ); HYPRE_ParCSRMatrixGetRowPartitioning( hypre_mat, &rowPart); localNRows = rowPart[mypid+1] - rowPart[mypid]; startRow = rowPart[mypid]; hypre_TFree(rowPart, HYPRE_MEMORY_HOST); sprintf(fname, "%s.%d", name, mypid); fp = fopen( fname, "w"); nnz = 0; for ( i = startRow; i < startRow+localNRows; i++ ) { HYPRE_ParCSRMatrixGetRow(hypre_mat, i, &rowSize, &colInd, NULL); nnz += rowSize; HYPRE_ParCSRMatrixRestoreRow(hypre_mat, i, &rowSize, &colInd, NULL); } fprintf(fp, "%6d %7d \n", localNRows, nnz); for ( i = startRow; i < startRow+localNRows; i++ ) { HYPRE_ParCSRMatrixGetRow(hypre_mat, i, &rowSize, &colInd, &colVal); for ( j = 0; j < rowSize; j++ ) fprintf(fp, "%6d %6d %25.16e \n", i+1, colInd[j]+1, colVal[j]); HYPRE_ParCSRMatrixRestoreRow(hypre_mat, i, &rowSize, &colInd, &colVal); } fclose(fp); return 0; } /*************************************************************************** * Given 2 Hypre ParCSR matrix A and P, create trans(P) * A * P *--------------------------------------------------------------------------*/ int MLI_Utils_HypreMatrixComputeRAP(void *Pmat, void *Amat, void **RAPmat) { hypre_ParCSRMatrix *hypreP, *hypreA, *hypreRAP; hypreP = (hypre_ParCSRMatrix *) Pmat; hypreA = (hypre_ParCSRMatrix *) Amat; hypre_BoomerAMGBuildCoarseOperator(hypreP, hypreA, hypreP, &hypreRAP); (*RAPmat) = (void *) hypreRAP; return 0; } /*************************************************************************** * Get matrix information of a Hypre ParCSR matrix *--------------------------------------------------------------------------*/ int MLI_Utils_HypreMatrixGetInfo(void *Amat, int *matInfo, double *valInfo) { int mypid, nprocs, icol, isum[4], ibuf[4], *partition, thisNnz; int localNRows, irow, rownum, rowsize, *colind, startrow; int globalNRows, maxNnz, minNnz, totalNnz; double *colval, dsum[2], dbuf[2], maxVal, minVal; MPI_Comm mpiComm; hypre_ParCSRMatrix *hypreA; hypreA = (hypre_ParCSRMatrix *) Amat; mpiComm = hypre_ParCSRMatrixComm(hypreA); MPI_Comm_rank( mpiComm, &mypid); MPI_Comm_size( mpiComm, &nprocs); HYPRE_ParCSRMatrixGetRowPartitioning((HYPRE_ParCSRMatrix) hypreA,&partition); localNRows = partition[mypid+1] - partition[mypid]; startrow = partition[mypid]; globalNRows = partition[nprocs]; hypre_TFree(partition, HYPRE_MEMORY_HOST); maxVal = -1.0E-30; minVal = +1.0E30; maxNnz = 0; minNnz = 1000000; thisNnz = 0; for ( irow = 0; irow < localNRows; irow++ ) { rownum = startrow + irow; hypre_ParCSRMatrixGetRow(hypreA,rownum,&rowsize,&colind,&colval); for ( icol = 0; icol < rowsize; icol++ ) { if ( colval[icol] > maxVal ) maxVal = colval[icol]; if ( colval[icol] < minVal ) minVal = colval[icol]; } if ( rowsize > maxNnz ) maxNnz = rowsize; if ( rowsize < minNnz ) minNnz = rowsize; thisNnz += rowsize; hypre_ParCSRMatrixRestoreRow(hypreA,rownum,&rowsize,&colind,&colval); } dsum[0] = maxVal; dsum[1] = - minVal; MPI_Allreduce( dsum, dbuf, 2, MPI_DOUBLE, MPI_MAX, mpiComm ); maxVal = dbuf[0]; minVal = - dbuf[1]; isum[0] = maxNnz; isum[1] = - minNnz; MPI_Allreduce( isum, ibuf, 2, MPI_INT, MPI_MAX, mpiComm ); maxNnz = ibuf[0]; minNnz = - ibuf[1]; isum[0] = thisNnz % 16; isum[1] = thisNnz >> 4; MPI_Allreduce( isum, ibuf, 2, MPI_INT, MPI_SUM, mpiComm ); totalNnz = ibuf[1] * 16 + ibuf[0]; matInfo[0] = globalNRows; matInfo[1] = maxNnz; matInfo[2] = minNnz; matInfo[3] = totalNnz; valInfo[0] = maxVal; valInfo[1] = minVal; valInfo[2] = 16.0 * ((double) ibuf[1]) + ((double) ibuf[0]); return 0; } /*************************************************************************** * Given a Hypre ParCSR matrix, compress it *--------------------------------------------------------------------------*/ int MLI_Utils_HypreMatrixCompress(void *Amat, int blksize, void **Amat2) { int mypid, *partition, startRow, localNRows; int newLNRows, newStartRow, blksize2; int ierr, *rowLengths, irow, rowNum, rowSize, *colInd; int *newInd, newSize, j, k, nprocs; double *colVal, *newVal, *newVal2; MPI_Comm mpiComm; hypre_ParCSRMatrix *hypreA, *hypreA2; HYPRE_IJMatrix IJAmat2; /* ---------------------------------------------------------------- * fetch information about incoming matrix * ----------------------------------------------------------------*/ hypreA = (hypre_ParCSRMatrix *) Amat; mpiComm = hypre_ParCSRMatrixComm(hypreA); MPI_Comm_rank(mpiComm, &mypid); MPI_Comm_size(mpiComm, &nprocs); HYPRE_ParCSRMatrixGetRowPartitioning((HYPRE_ParCSRMatrix) hypreA,&partition); startRow = partition[mypid]; localNRows = partition[mypid+1] - startRow; hypre_TFree(partition, HYPRE_MEMORY_HOST); if ( blksize < 0 ) blksize2 = - blksize; else blksize2 = blksize; if ( localNRows % blksize2 != 0 ) { printf("MLI_CompressMatrix ERROR : nrows not divisible by blksize.\n"); printf(" nrows, blksize = %d %d\n",localNRows,blksize2); exit(1); } /* ---------------------------------------------------------------- * compute size of new matrix and create the new matrix * ----------------------------------------------------------------*/ newLNRows = localNRows / blksize2; newStartRow = startRow / blksize2; ierr = HYPRE_IJMatrixCreate(mpiComm, newStartRow, newStartRow+newLNRows-1, newStartRow, newStartRow+newLNRows-1, &IJAmat2); ierr += HYPRE_IJMatrixSetObjectType(IJAmat2, HYPRE_PARCSR); hypre_assert(!ierr); /* ---------------------------------------------------------------- * compute the row lengths of the new matrix * ----------------------------------------------------------------*/ if (newLNRows > 0) rowLengths = hypre_TAlloc(int, newLNRows, HYPRE_MEMORY_HOST); else rowLengths = NULL; for ( irow = 0; irow < newLNRows; irow++ ) { rowLengths[irow] = 0; for ( j = 0; j < blksize2; j++) { rowNum = startRow + irow * blksize2 + j; hypre_ParCSRMatrixGetRow(hypreA,rowNum,&rowSize,&colInd,NULL); rowLengths[irow] += rowSize; hypre_ParCSRMatrixRestoreRow(hypreA,rowNum,&rowSize,&colInd,NULL); } } ierr = HYPRE_IJMatrixSetRowSizes(IJAmat2, rowLengths); ierr += HYPRE_IJMatrixInitialize(IJAmat2); hypre_assert(!ierr); /* ---------------------------------------------------------------- * load the compressed matrix * ----------------------------------------------------------------*/ for ( irow = 0; irow < newLNRows; irow++ ) { newInd = hypre_TAlloc(int, rowLengths[irow] , HYPRE_MEMORY_HOST); newVal = hypre_TAlloc(double, rowLengths[irow] , HYPRE_MEMORY_HOST); newVal2 = hypre_TAlloc(double, rowLengths[irow] , HYPRE_MEMORY_HOST); newSize = 0; for ( j = 0; j < blksize2; j++) { rowNum = startRow + irow * blksize2 + j; hypre_ParCSRMatrixGetRow(hypreA,rowNum,&rowSize,&colInd,&colVal); for ( k = 0; k < rowSize; k++ ) { newInd[newSize] = colInd[k] / blksize2; newVal[newSize++] = colVal[k]; } hypre_ParCSRMatrixRestoreRow(hypreA,rowNum,&rowSize, &colInd,&colVal); } if ( newSize > 0 ) { hypre_qsort1(newInd, newVal, 0, newSize-1); if ( blksize > 0 ) { k = 0; newVal[k] = newVal[k] * newVal[k]; for ( j = 1; j < newSize; j++ ) { if (newInd[j] == newInd[k]) newVal[k] += (newVal[j] * newVal[j]); else { newInd[++k] = newInd[j]; newVal[k] = newVal[j] * newVal[j]; } } newSize = k + 1; for ( j = 0; j < newSize; j++ ) newVal[j] = sqrt(newVal[j]); } else { k = 0; newVal[k] = newVal[k]; newVal2[k] = newVal[k]; for ( j = 1; j < newSize; j++ ) { if (newInd[j] == newInd[k]) { newVal2[k] += newVal[j]; if ( habs(newVal[j]) > habs(newVal[k]) ) newVal[k] = newVal[j]; } else { newInd[++k] = newInd[j]; newVal2[k] = newVal[j]; newVal[k] = newVal[j]; } } newSize = k + 1; for ( j = 0; j < newSize; j++ ) { if ( newInd[j] == newStartRow+irow ) newVal[j] = (newVal[j])/((double) blksize2); else newVal[j] = (newVal[j])/((double) blksize2); /* else if ( newVal2[j] >= 0.0 ) newVal[j] = (newVal[j])/((double) blksize2); else newVal[j] = -(newVal[j])/((double) blksize2); */ } } } rowNum = newStartRow + irow; HYPRE_IJMatrixSetValues(IJAmat2, 1, &newSize,(const int *) &rowNum, (const int *) newInd, (const double *) newVal); hypre_TFree(newInd, HYPRE_MEMORY_HOST); hypre_TFree(newVal, HYPRE_MEMORY_HOST); hypre_TFree(newVal2, HYPRE_MEMORY_HOST); } ierr = HYPRE_IJMatrixAssemble(IJAmat2); hypre_assert( !ierr ); HYPRE_IJMatrixGetObject(IJAmat2, (void **) &hypreA2); /*hypre_MatvecCommPkgCreate((hypre_ParCSRMatrix *) hypreA2);*/ HYPRE_IJMatrixSetObjectType( IJAmat2, -1 ); HYPRE_IJMatrixDestroy( IJAmat2 ); hypre_TFree(rowLengths, HYPRE_MEMORY_HOST); (*Amat2) = (void *) hypreA2; return 0; } /*************************************************************************** * Given a Hypre ParCSR matrix, compress it *--------------------------------------------------------------------------*/ int MLI_Utils_HypreBoolMatrixDecompress(void *Smat, int blkSize, void **Smat2, void *Amat) { int mypid, *partition, startRow, localNRows, newLNRows; int newStartRow, maxRowLeng, index, ierr, irow, sRowNum; int *rowLengths=NULL, rowNum, rowSize, *colInd, *sInd=NULL; int *newInd=NULL, newSize, j, k, nprocs, searchInd; int sRowSize; double *newVal=NULL; MPI_Comm mpiComm; hypre_ParCSRMatrix *hypreA, *hypreS, *hypreS2; HYPRE_IJMatrix IJSmat2; /* ---------------------------------------------------------------- * fetch information about incoming matrix * ----------------------------------------------------------------*/ hypreS = (hypre_ParCSRMatrix *) Smat; hypreA = (hypre_ParCSRMatrix *) Amat; mpiComm = hypre_ParCSRMatrixComm(hypreA); MPI_Comm_rank(mpiComm, &mypid); MPI_Comm_size(mpiComm, &nprocs); HYPRE_ParCSRMatrixGetRowPartitioning((HYPRE_ParCSRMatrix) hypreA,&partition); startRow = partition[mypid]; localNRows = partition[mypid+1] - startRow; hypre_TFree(partition, HYPRE_MEMORY_HOST); if ( localNRows % blkSize != 0 ) { printf("MLI_DecompressMatrix ERROR : nrows not divisible by blksize.\n"); printf(" nrows, blksize = %d %d\n",localNRows,blkSize); exit(1); } /* ---------------------------------------------------------------- * compute size of new matrix and create the new matrix * ----------------------------------------------------------------*/ newLNRows = localNRows / blkSize; newStartRow = startRow / blkSize; ierr = HYPRE_IJMatrixCreate(mpiComm, startRow, startRow+localNRows-1, startRow, startRow+localNRows-1, &IJSmat2); ierr += HYPRE_IJMatrixSetObjectType(IJSmat2, HYPRE_PARCSR); hypre_assert(!ierr); /* ---------------------------------------------------------------- * compute the row lengths of the new matrix * ----------------------------------------------------------------*/ if (localNRows > 0) rowLengths = hypre_TAlloc(int, localNRows, HYPRE_MEMORY_HOST); maxRowLeng = 0; for ( irow = 0; irow < localNRows; irow++ ) { rowNum = startRow + irow; hypre_ParCSRMatrixGetRow(hypreA,rowNum,&rowSize,&colInd,NULL); rowLengths[irow] = rowSize; if ( rowSize > maxRowLeng ) maxRowLeng = rowSize; hypre_ParCSRMatrixRestoreRow(hypreA,rowNum,&rowSize,&colInd,NULL); } ierr = HYPRE_IJMatrixSetRowSizes(IJSmat2, rowLengths); ierr += HYPRE_IJMatrixInitialize(IJSmat2); hypre_assert(!ierr); hypre_TFree(rowLengths, HYPRE_MEMORY_HOST); /* ---------------------------------------------------------------- * load the decompressed matrix * ----------------------------------------------------------------*/ if ( maxRowLeng > 0 ) { newInd = hypre_TAlloc(int, maxRowLeng , HYPRE_MEMORY_HOST); newVal = hypre_TAlloc(double, maxRowLeng , HYPRE_MEMORY_HOST); sInd = hypre_TAlloc(int, maxRowLeng , HYPRE_MEMORY_HOST); for ( irow = 0; irow < maxRowLeng; irow++ ) newVal[irow] = 1.0; } for ( irow = 0; irow < newLNRows; irow++ ) { sRowNum = newStartRow + irow; hypre_ParCSRMatrixGetRow(hypreS,sRowNum,&sRowSize,&colInd,NULL); for ( k = 0; k < sRowSize; k++ ) sInd[k] = colInd[k]; hypre_ParCSRMatrixRestoreRow(hypreS,sRowNum,&sRowSize,&colInd,NULL); hypre_qsort0(sInd, 0, sRowSize-1); for ( j = 0; j < blkSize; j++) { rowNum = startRow + irow * blkSize + j; hypre_ParCSRMatrixGetRow(hypreA,rowNum,&rowSize,&colInd,NULL); for ( k = 0; k < rowSize; k++ ) { index = colInd[k] / blkSize; searchInd = MLI_Utils_BinarySearch(index, sInd, sRowSize); if ( searchInd >= 0 && colInd[k] == index*blkSize+j ) newInd[k] = colInd[k]; else newInd[k] = -1; } newSize = 0; for ( k = 0; k < rowSize; k++ ) if ( newInd[k] >= 0 ) newInd[newSize++] = newInd[k]; hypre_ParCSRMatrixRestoreRow(hypreA,rowNum,&rowSize,&colInd,NULL); HYPRE_IJMatrixSetValues(IJSmat2, 1, &newSize,(const int *) &rowNum, (const int *) newInd, (const double *) newVal); } } hypre_TFree(newInd, HYPRE_MEMORY_HOST); hypre_TFree(newVal, HYPRE_MEMORY_HOST); hypre_TFree(sInd, HYPRE_MEMORY_HOST); ierr = HYPRE_IJMatrixAssemble(IJSmat2); hypre_assert( !ierr ); HYPRE_IJMatrixGetObject(IJSmat2, (void **) &hypreS2); HYPRE_IJMatrixSetObjectType( IJSmat2, -1 ); HYPRE_IJMatrixDestroy( IJSmat2 ); (*Smat2) = (void *) hypreS2; return 0; } /*************************************************************************** * perform QR factorization *--------------------------------------------------------------------------*/ int MLI_Utils_QR(double *qArray, double *rArray, int nrows, int ncols) { int icol, irow, pcol, retFlag=0; double innerProd, *currQ, *currR, *prevQ, alpha; #ifdef MLI_DEBUG_DETAILED printf("(before) QR %6d %6d : \n", nrows, ncols); for ( irow = 0; irow < nrows; irow++ ) { for ( icol = 0; icol < ncols; icol++ ) printf(" %13.5e ", qArray[icol*nrows+irow]); printf("\n"); } #endif for ( icol = 0; icol < ncols; icol++ ) { currQ = &qArray[icol*nrows]; currR = &rArray[icol*ncols]; for ( pcol = 0; pcol < icol; pcol++ ) { prevQ = &qArray[pcol*nrows]; alpha = 0.0; for ( irow = 0; irow < nrows; irow++ ) alpha += (currQ[irow] * prevQ[irow]); currR[pcol] = alpha; for ( irow = 0; irow < nrows; irow++ ) currQ[irow] -= ( alpha * prevQ[irow] ); } for ( pcol = icol; pcol < ncols; pcol++ ) currR[pcol] = 0.0; innerProd = 0.0; for ( irow = 0; irow < nrows; irow++ ) innerProd += (currQ[irow] * currQ[irow]); innerProd = sqrt( innerProd ); if ( innerProd < 1.0e-18 ) { return icol + 1; } else { currR[icol] = innerProd; alpha = 1.0 / innerProd; for ( irow = 0; irow < nrows; irow++ ) currQ[irow] = alpha * currQ[irow]; } } #ifdef MLI_DEBUG_DETAILED printf("(after ) Q %6d %6d : \n", nrows, ncols); for ( irow = 0; irow < nrows; irow++ ) { for ( icol = 0; icol < ncols; icol++ ) printf(" %13.5e ", qArray[icol*nrows+irow]); printf("\n"); } printf("(after ) R %6d %6d : \n", nrows, ncols); for ( irow = 0; irow < ncols; irow++ ) { for ( icol = 0; icol < ncols; icol++ ) printf(" %13.5e ", rArray[icol*ncols+irow]); printf("\n"); } #endif return retFlag; } /*************************************************************************** * perform SVD factorization * * Inputs: * uArray = input matrix (array of length m*n) * m = number of rows of input matrix * n = number of cols of input matrix * * Outputs: * uArray = min(m,n) by m; left singular vectors * sArray = min(m,n) singular values (decreasing order) * vtArray = min(m,n) rows of transpose of * * Work space: * workArray = array of length workLen * workLen = suggest 5*(m+n) *--------------------------------------------------------------------------*/ #include "fortran.h" int MLI_Utils_SVD(double *uArray, double *sArray, double *vtArray, double *workArray, int m, int n, int workLen) { #ifndef MIN #define MIN(a,b) ((a)<(b)?(a):(b)) #endif #ifdef HYPRE_USING_ESSL /* undone */ int info; info = -1; #else char jobu = 'O'; /* overwrite input with U */ char jobvt = 'S'; /* return rows of V in vtArray */ int dim = MIN(m,n); int info; hypre_dgesvd(&jobu, &jobvt, &m, &n, uArray, &m, sArray, (double *) NULL, &m, vtArray, &dim, workArray, &workLen, &info); #endif return info; } /****************************************************************************** * Return the left singular vectors of a square matrix *--------------------------------------------------------------------------*/ int MLI_Utils_singular_vectors(int n, double *uArray) { int info; #ifdef HYPRE_USING_ESSL info = -1; #else char jobu = 'O'; /* overwrite input with U */ char jobvt = 'N'; double *sArray = hypre_TAlloc(double, n, HYPRE_MEMORY_HOST); int workLen = 5*n; double *workArray = hypre_TAlloc(double, workLen, HYPRE_MEMORY_HOST); hypre_dgesvd(&jobu, &jobvt, &n, &n, uArray, &n, sArray, NULL, &n, NULL, &n, workArray, &workLen, &info); hypre_TFree(workArray, HYPRE_MEMORY_HOST); hypre_TFree(sArray, HYPRE_MEMORY_HOST); #endif return info; } /****************************************************************************** * MLI_Utils_ComputeLowEnergyLanczos * inputs: * A = matrix * maxIter = number of Lanczos steps * num_vecs_to_return = number of low energy vectors to return * le_vectors = pointer to storage space where vectors will be returned *--------------------------------------------------------------------------*/ int MLI_Utils_ComputeLowEnergyLanczos(hypre_ParCSRMatrix *A, int maxIter, int num_vecs_to_return, double *le_vectors) { int i, j, k, its, nprocs, mypid, localNRows, globalNRows; int startRow, endRow, *partition; double alpha, beta, rho, rhom1, sigma, *zData; double rnorm, *alphaArray, *rnormArray, **Tmat; double one=1.0, *rData; MPI_Comm comm; hypre_ParVector *rVec=NULL, *zVec, *pVec, *apVec; double *lanczos, *lanczos_p, *Umat, *ptr, *Uptr, *curr_le_vector; double rVecNorm; /*----------------------------------------------------------------- * fetch matrix information *-----------------------------------------------------------------*/ comm = hypre_ParCSRMatrixComm(A); MPI_Comm_rank(comm,&mypid); MPI_Comm_size(comm,&nprocs); HYPRE_ParCSRMatrixGetRowPartitioning((HYPRE_ParCSRMatrix) A, &partition); startRow = partition[mypid]; endRow = partition[mypid+1] - 1; globalNRows = partition[nprocs]; localNRows = endRow - startRow + 1; hypre_TFree( partition , HYPRE_MEMORY_HOST); if ( globalNRows < maxIter ) { fprintf(stderr, "Computing Low energy vectors: " "more steps than dim of matrix.\n"); exit(-1); } /*----------------------------------------------------------------- * allocate space *-----------------------------------------------------------------*/ if ( localNRows > 0 ) { HYPRE_ParCSRMatrixGetRowPartitioning((HYPRE_ParCSRMatrix)A,&partition); rVec = hypre_ParVectorCreate(comm, globalNRows, partition); hypre_ParVectorInitialize(rVec); HYPRE_ParCSRMatrixGetRowPartitioning((HYPRE_ParCSRMatrix)A,&partition); zVec = hypre_ParVectorCreate(comm, globalNRows, partition); hypre_ParVectorInitialize(zVec); HYPRE_ParCSRMatrixGetRowPartitioning((HYPRE_ParCSRMatrix)A,&partition); pVec = hypre_ParVectorCreate(comm, globalNRows, partition); hypre_ParVectorInitialize(pVec); HYPRE_ParCSRMatrixGetRowPartitioning((HYPRE_ParCSRMatrix)A,&partition); apVec = hypre_ParVectorCreate(comm, globalNRows, partition); hypre_ParVectorInitialize(apVec); zData = hypre_VectorData( hypre_ParVectorLocalVector(zVec) ); rData = hypre_VectorData( hypre_ParVectorLocalVector(rVec) ); } HYPRE_ParVectorSetRandomValues((HYPRE_ParVector) rVec, 1209873 ); alphaArray = hypre_TAlloc(double, (maxIter+1) , HYPRE_MEMORY_HOST); rnormArray = hypre_TAlloc(double, (maxIter+1) , HYPRE_MEMORY_HOST); Tmat = hypre_TAlloc(double*, (maxIter+1) , HYPRE_MEMORY_HOST); for ( i = 0; i <= maxIter; i++ ) { Tmat[i] = hypre_TAlloc(double, (maxIter+1) , HYPRE_MEMORY_HOST); for ( j = 0; j <= maxIter; j++ ) Tmat[i][j] = 0.0; Tmat[i][i] = 1.0; } /*----------------------------------------------------------------- * compute initial residual vector norm *-----------------------------------------------------------------*/ hypre_ParVectorSetRandomValues(rVec, 1209837); hypre_ParVectorSetConstantValues(pVec, 0.0); hypre_ParVectorSetConstantValues(zVec, 0.0); rho = hypre_ParVectorInnerProd(rVec, rVec); rnorm = sqrt(rho); rnormArray[0] = rnorm; if ( rnorm == 0.0 ) { printf("MLI_Utils_ComputeLowEnergyLanczos : fail for res=0.\n"); hypre_ParVectorDestroy( rVec ); hypre_ParVectorDestroy( pVec ); hypre_ParVectorDestroy( zVec ); hypre_ParVectorDestroy( apVec ); return 1; } /* allocate storage for lanzcos vectors */ lanczos = hypre_TAlloc(double, maxIter*localNRows, HYPRE_MEMORY_HOST); lanczos_p = lanczos; /*----------------------------------------------------------------- * main loop *-----------------------------------------------------------------*/ for ( its = 0; its < maxIter; its++ ) { for ( i = 0; i < localNRows; i++ ) zData[i] = rData[i]; /* scale copy lanczos vector r for use later */ rVecNorm = sqrt(hypre_ParVectorInnerProd(rVec, rVec)); for ( i = 0; i < localNRows; i++ ) *lanczos_p++ = rData[i] / rVecNorm; rhom1 = rho; rho = hypre_ParVectorInnerProd(rVec, zVec); if (its == 0) beta = 0.0; else { beta = rho / rhom1; Tmat[its-1][its] = -beta; } HYPRE_ParVectorScale( beta, (HYPRE_ParVector) pVec ); hypre_ParVectorAxpy( one, zVec, pVec ); hypre_ParCSRMatrixMatvec(one, A, pVec, 0.0, apVec); sigma = hypre_ParVectorInnerProd(pVec, apVec); alpha = rho / sigma; alphaArray[its] = sigma; hypre_ParVectorAxpy( -alpha, apVec, rVec ); rnorm = sqrt(hypre_ParVectorInnerProd(rVec, rVec)); rnormArray[its+1] = rnorm; if ( rnorm < 1.0E-8 * rnormArray[0] ) { maxIter = its + 1; fprintf(stderr, "Computing Low energy vectors: " "too many Lanczos steps for this problem.\n"); exit(-1); break; } } /*----------------------------------------------------------------- * construct T *-----------------------------------------------------------------*/ Tmat[0][0] = alphaArray[0]; for ( i = 1; i < maxIter; i++ ) Tmat[i][i]=alphaArray[i]+alphaArray[i-1]*Tmat[i-1][i]*Tmat[i-1][i]; for ( i = 0; i < maxIter; i++ ) { Tmat[i][i+1] *= alphaArray[i]; Tmat[i+1][i] = Tmat[i][i+1]; rnormArray[i] = 1.0 / rnormArray[i]; } for ( i = 0; i < maxIter; i++ ) for ( j = 0; j < maxIter; j++ ) Tmat[i][j] = Tmat[i][j] * rnormArray[i] * rnormArray[j]; /* ----------------------------------------------------------------*/ /* Compute eigenvectors and eigenvalues of T. */ /* Since we need the smallest eigenvalue eigenvectors, use an SVD */ /* and return all the singular vectors. */ /* ----------------------------------------------------------------*/ Umat = hypre_TAlloc(double, maxIter*maxIter, HYPRE_MEMORY_HOST); ptr = Umat; /* copy Tmat into Umat */ for ( i = 0; i < maxIter; i++ ) for ( j = 0; j < maxIter; j++ ) *ptr++ = Tmat[i][j]; MLI_Utils_singular_vectors(maxIter, Umat); /* ---------------------------------------------------------------- * compute low-energy vectors * ----------------------------------------------------------------*/ if (num_vecs_to_return > maxIter) { fprintf(stderr, "Computing Low energy vectors: " "requested more vectors than number of Lanczos steps.\n"); exit(-1); } for (i=0; i 0 ) { hypre_ParVectorDestroy( rVec ); hypre_ParVectorDestroy( zVec ); hypre_ParVectorDestroy( pVec ); hypre_ParVectorDestroy( apVec ); } hypre_TFree(alphaArray, HYPRE_MEMORY_HOST); hypre_TFree(rnormArray, HYPRE_MEMORY_HOST); for (i = 0; i <= maxIter; i++) hypre_TFree(Tmat[i], HYPRE_MEMORY_HOST); hypre_TFree(Tmat, HYPRE_MEMORY_HOST); return 0; } /*************************************************************************** * read a matrix file and create a hypre_ParCSRMatrix from it *--------------------------------------------------------------------------*/ int MLI_Utils_HypreMatrixReadTuminFormat(char *filename, MPI_Comm mpiComm, int blksize, void **Amat, int scaleFlag, double **scaleVec) { int mypid, nprocs, currProc, globalNRows, localNRows, startRow; int irow, colNum, *inds, *matIA, *matJA, *tempJA, length, rowNum; int j, nnz, currBufSize, *rowLengths, ierr; double colVal, *vals, *matAA, *tempAA, *diag=NULL, *diag2=NULL, scale; FILE *fp; hypre_ParCSRMatrix *hypreA; HYPRE_IJMatrix IJmat; MPI_Comm_rank( mpiComm, &mypid ); MPI_Comm_size( mpiComm, &nprocs ); currProc = 0; while ( currProc < nprocs ) { if ( mypid == currProc ) { fp = fopen( filename, "r" ); if ( fp == NULL ) { printf("MLI_Utils_HypreMatrixReadTuminFormat ERROR : "); printf("file %s not found.\n", filename); exit(1); } fscanf( fp, "%d", &globalNRows ); if ( globalNRows < 0 || globalNRows > 1000000000 ) { printf("MLI_Utils_HypreMatrixRead ERROR : invalid nrows %d.\n", globalNRows); exit(1); } if ( globalNRows % blksize != 0 ) { printf("MLI_Utils_HypreMatrixReadTuminFormat ERROR : "); printf("nrows,blksize (%d,%d) mismatch.\n", globalNRows,blksize); exit(1); } localNRows = globalNRows / blksize / nprocs * blksize; startRow = localNRows * mypid; if ( mypid == nprocs - 1 ) localNRows = globalNRows - startRow; if (scaleFlag) diag = hypre_TAlloc(double, globalNRows, HYPRE_MEMORY_HOST); for ( irow = 0; irow < startRow; irow++ ) { fscanf( fp, "%d", &colNum ); while ( colNum != -1 ) { fscanf( fp, "%lg", &colVal ); fscanf( fp, "%d", &colNum ); if ( scaleFlag && colNum == irow ) diag[irow] = colVal; } } currBufSize = localNRows * 27; matIA = hypre_TAlloc(int, (localNRows+1) , HYPRE_MEMORY_HOST); matJA = hypre_TAlloc(int, currBufSize , HYPRE_MEMORY_HOST); matAA = hypre_TAlloc(double, currBufSize , HYPRE_MEMORY_HOST); nnz = 0; matIA[0] = nnz; for ( irow = startRow; irow < startRow+localNRows; irow++ ) { fscanf( fp, "%d", &colNum ); while ( colNum != -1 ) { fscanf( fp, "%lg", &colVal ); matJA[nnz] = colNum; matAA[nnz++] = colVal; if ( scaleFlag && colNum == irow ) diag[irow] = colVal; if ( nnz >= currBufSize ) { tempJA = matJA; tempAA = matAA; currBufSize += ( 27 * localNRows ); matJA = hypre_TAlloc(int, currBufSize , HYPRE_MEMORY_HOST); matAA = hypre_TAlloc(double, currBufSize , HYPRE_MEMORY_HOST); for ( j = 0; j < nnz; j++ ) { matJA[j] = tempJA[j]; matAA[j] = tempAA[j]; } hypre_TFree(tempJA , HYPRE_MEMORY_HOST); hypre_TFree(tempAA , HYPRE_MEMORY_HOST); } fscanf( fp, "%d", &colNum ); } matIA[irow-startRow+1] = nnz; } for ( irow = startRow+localNRows; irow < globalNRows; irow++ ) { fscanf( fp, "%d", &colNum ); while ( colNum != -1 ) { fscanf( fp, "%lg", &colVal ); fscanf( fp, "%d", &colNum ); if ( scaleFlag && colNum == irow ) diag[irow] = colVal; } } fclose( fp ); } MPI_Barrier( mpiComm ); currProc++; } printf("%5d : MLI_Utils_HypreMatrixReadTuminFormat : nlocal, nnz = %d %d\n", mypid, localNRows, nnz); rowLengths = hypre_TAlloc(int, localNRows , HYPRE_MEMORY_HOST); for ( irow = 0; irow < localNRows; irow++ ) rowLengths[irow] = matIA[irow+1] - matIA[irow]; ierr = HYPRE_IJMatrixCreate(mpiComm, startRow, startRow+localNRows-1, startRow, startRow+localNRows-1, &IJmat); ierr = HYPRE_IJMatrixSetObjectType(IJmat, HYPRE_PARCSR); hypre_assert(!ierr); ierr = HYPRE_IJMatrixSetRowSizes(IJmat, rowLengths); ierr = HYPRE_IJMatrixInitialize(IJmat); hypre_assert(!ierr); for ( irow = 0; irow < localNRows; irow++ ) { length = rowLengths[irow]; rowNum = irow + startRow; inds = &(matJA[matIA[irow]]); vals = &(matAA[matIA[irow]]); if ( scaleFlag ) { scale = 1.0 / sqrt( diag[irow] ); for ( j = 0; j < length; j++ ) vals[j] = vals[j] * scale / ( sqrt(diag[inds[j]]) ); } ierr = HYPRE_IJMatrixSetValues(IJmat, 1, &length,(const int *) &rowNum, (const int *) inds, (const double *) vals); hypre_assert( !ierr ); } hypre_TFree(rowLengths , HYPRE_MEMORY_HOST); hypre_TFree(matIA , HYPRE_MEMORY_HOST); hypre_TFree(matJA , HYPRE_MEMORY_HOST); hypre_TFree(matAA , HYPRE_MEMORY_HOST); ierr = HYPRE_IJMatrixAssemble(IJmat); hypre_assert( !ierr ); HYPRE_IJMatrixGetObject(IJmat, (void**) &hypreA); HYPRE_IJMatrixSetObjectType(IJmat, -1); HYPRE_IJMatrixDestroy(IJmat); (*Amat) = (void *) hypreA; if ( scaleFlag ) { diag2 = hypre_TAlloc(double, localNRows, HYPRE_MEMORY_HOST); for ( irow = 0; irow < localNRows; irow++ ) diag2[irow] = diag[startRow+irow]; hypre_TFree(diag, HYPRE_MEMORY_HOST); } (*scaleVec) = diag2; return ierr; } /*************************************************************************** * read a matrix file and create a hypre_ParCSRMatrix from it *--------------------------------------------------------------------------*/ int MLI_Utils_HypreMatrixReadIJAFormat(char *filename, MPI_Comm mpiComm, int blksize, void **Amat, int scaleFlag, double **scaleVec) { int mypid, nprocs, currProc, globalNRows, localNRows, startRow; int irow, colNum, *inds, *matIA, *matJA, length, rowNum; int j, nnz, currBufSize, *rowLengths, ierr, globalNnz, currRow; double colVal, *vals, *matAA, *diag=NULL, *diag2=NULL, scale; #if 0 char fname[20]; #endif FILE *fp; hypre_ParCSRMatrix *hypreA; HYPRE_IJMatrix IJmat; MPI_Comm_rank( mpiComm, &mypid ); MPI_Comm_size( mpiComm, &nprocs ); currProc = 0; while ( currProc < nprocs ) { if ( mypid == currProc ) { printf("Processor %d reading matrix file %s.\n", mypid, filename); fp = fopen( filename, "r" ); if ( fp == NULL ) { printf("MLI_Utils_HypreMatrixReadIJAFormat ERROR : "); printf("file %s not found.\n", filename); system("ls"); exit(1); } fscanf( fp, "%d %d", &globalNRows, &globalNnz ); if ( globalNRows < 0 || globalNRows > 1000000000 ) { printf("MLI_Utils_HypreMatrixReadIJAFormat ERROR : "); printf("invalid nrows %d.\n", globalNRows); exit(1); } if ( globalNRows % blksize != 0 ) { printf("MLI_Utils_HypreMatrixReadIJAFormat ERROR : nrows,blksize"); printf("(%d,%d) mismatch.\n", globalNRows, blksize); exit(1); } localNRows = globalNRows / blksize / nprocs * blksize; startRow = localNRows * mypid; if ( mypid == nprocs - 1 ) localNRows = globalNRows - startRow; currBufSize = globalNnz / nprocs * 3; matIA = hypre_TAlloc(int, (localNRows+1) , HYPRE_MEMORY_HOST); matJA = hypre_TAlloc(int, currBufSize , HYPRE_MEMORY_HOST); matAA = hypre_TAlloc(double, currBufSize , HYPRE_MEMORY_HOST); if (scaleFlag == 1) diag = hypre_TAlloc(double, globalNRows, HYPRE_MEMORY_HOST); for ( irow = 0; irow < globalNnz; irow++ ) { fscanf( fp, "%d %d %lg", &rowNum, &colNum, &colVal ); rowNum--; if ( scaleFlag == 1 && rowNum == colNum-1 ) diag[rowNum] = colVal; if ( rowNum >= startRow ) break; } nnz = 0; matIA[0] = nnz; matJA[nnz] = colNum - 1; matAA[nnz++] = colVal; currRow = rowNum; for ( j = irow+1; j < globalNnz; j++ ) { fscanf( fp, "%d %d %lg", &rowNum, &colNum, &colVal ); rowNum--; if ( scaleFlag == 1 && rowNum == colNum-1 ) diag[rowNum] = colVal; if ( rowNum >= startRow+localNRows ) break; if ( rowNum != currRow ) { currRow = rowNum; matIA[currRow-startRow] = nnz; } matJA[nnz] = colNum - 1; matAA[nnz++] = colVal; } if ( j == globalNnz ) matIA[rowNum+1-startRow] = nnz; else matIA[rowNum-startRow] = nnz; for ( irow = j+1; irow < globalNnz; irow++ ) { fscanf( fp, "%d %d %lg", &rowNum, &colNum, &colVal ); rowNum--; if ( scaleFlag == 1 && rowNum == colNum-1 ) diag[rowNum] = colVal; } fclose( fp ); printf("Processor %d finished reading matrix file.\n", mypid); } MPI_Barrier( mpiComm ); currProc++; } printf("%5d : MLI_Utils_HypreMatrixRead : nlocal, nnz = %d %d\n", mypid, localNRows, nnz); rowLengths = hypre_TAlloc(int, localNRows , HYPRE_MEMORY_HOST); for ( irow = 0; irow < localNRows; irow++ ) rowLengths[irow] = matIA[irow+1] - matIA[irow]; ierr = HYPRE_IJMatrixCreate(mpiComm, startRow, startRow+localNRows-1, startRow, startRow+localNRows-1, &IJmat); ierr = HYPRE_IJMatrixSetObjectType(IJmat, HYPRE_PARCSR); hypre_assert(!ierr); ierr = HYPRE_IJMatrixSetRowSizes(IJmat, rowLengths); ierr = HYPRE_IJMatrixInitialize(IJmat); hypre_assert(!ierr); for ( irow = 0; irow < localNRows; irow++ ) { length = rowLengths[irow]; rowNum = irow + startRow; inds = &(matJA[matIA[irow]]); vals = &(matAA[matIA[irow]]); if ( scaleFlag == 1 ) { scale = 1.0 / sqrt( diag[rowNum] ); for ( j = 0; j < length; j++ ) { vals[j] = vals[j] * scale / ( sqrt(diag[inds[j]]) ); if ( rowNum == inds[j] && habs(vals[j]-1.0) > 1.0e-6 ) { printf("Proc %d : diag %d = %e != 1.\n",mypid,rowNum,vals[j]); exit(1); } } } ierr = HYPRE_IJMatrixSetValues(IJmat, 1, &length,(const int *) &rowNum, (const int *) inds, (const double *) vals); hypre_assert( !ierr ); } hypre_TFree(rowLengths , HYPRE_MEMORY_HOST); hypre_TFree(matIA , HYPRE_MEMORY_HOST); hypre_TFree(matJA , HYPRE_MEMORY_HOST); hypre_TFree(matAA , HYPRE_MEMORY_HOST); ierr = HYPRE_IJMatrixAssemble(IJmat); hypre_assert( !ierr ); HYPRE_IJMatrixGetObject(IJmat, (void**) &hypreA); HYPRE_IJMatrixSetObjectType(IJmat, -1); HYPRE_IJMatrixDestroy(IJmat); (*Amat) = (void *) hypreA; if ( scaleFlag ) { diag2 = hypre_TAlloc(double, localNRows, HYPRE_MEMORY_HOST); for ( irow = 0; irow < localNRows; irow++ ) diag2[irow] = diag[startRow+irow]; hypre_TFree(diag, HYPRE_MEMORY_HOST); } (*scaleVec) = diag2; #if 0 sprintf(fname, "mat.%d", mypid); fp = fopen(fname, "w"); for ( irow = 0; irow < localNRows; irow++ ) { rowNum = startRow + irow; hypre_ParCSRMatrixGetRow(hypreA, rowNum, &length, &inds, &vals); for ( colNum = 0; colNum < length; colNum++ ) fprintf(fp, "%d %d %e\n", rowNum, inds[colNum], vals[colNum]); hypre_ParCSRMatrixRestoreRow(hypreA, rowNum, &length, &inds, &vals); } fclose(fp); #endif return ierr; } /*************************************************************************** * read matrix files and create a hypre_ParCSRMatrix from them *--------------------------------------------------------------------------*/ int MLI_Utils_HypreParMatrixReadIJAFormat(char *filename, MPI_Comm mpiComm, void **Amat, int scaleFlag, double **scaleVec) { int mypid, nprocs, globalNRows, localNRows, localNnz, startRow; int irow, colNum, *inds, *matIA, *matJA, length, rowNum, index; int j, *rowLengths, ierr, currRow, *rowsArray; double colVal, *vals, *matAA, *diag=NULL, *diag2=NULL, scale; char fname[20]; FILE *fp; hypre_ParCSRMatrix *hypreA; HYPRE_IJMatrix IJmat; MPI_Comm_rank( mpiComm, &mypid ); MPI_Comm_size( mpiComm, &nprocs ); sprintf( fname, "%s.%d", filename, mypid); printf("Processor %d reading matrix file %s.\n", mypid, fname); fp = fopen( fname, "r" ); if ( fp == NULL ) { printf("MLI_Utils_HypreParMatrixReadIJAFormat ERROR : "); printf("file %s not found.\n", filename); exit(1); } fscanf( fp, "%d %d", &localNRows, &localNnz ); printf("%5d : MLI_Utils_HypreParMatrixRead : nlocal, nnz = %d %d\n", mypid, localNRows, localNnz); fflush(stdout); if ( localNRows < 0 || localNnz > 1000000000 ) { printf("MLI_Utils_HypreMatrixReadIJAFormat ERROR : "); printf("invalid nrows %d.\n", localNRows); exit(1); } rowsArray = hypre_TAlloc(int, nprocs , HYPRE_MEMORY_HOST); MPI_Allgather(&localNRows, 1, MPI_INT, rowsArray, 1, MPI_INT, mpiComm); globalNRows = 0; for ( j = 0; j < nprocs; j++ ) { if ( j == mypid ) startRow = globalNRows; globalNRows += rowsArray[j]; } hypre_TFree(rowsArray, HYPRE_MEMORY_HOST); matIA = hypre_TAlloc(int, (localNRows+1) , HYPRE_MEMORY_HOST); matJA = hypre_TAlloc(int, localNnz , HYPRE_MEMORY_HOST); matAA = hypre_TAlloc(double, localNnz , HYPRE_MEMORY_HOST); if (scaleFlag == 1) { diag = hypre_TAlloc(double, globalNRows, HYPRE_MEMORY_HOST); diag2 = hypre_TAlloc(double, globalNRows, HYPRE_MEMORY_HOST); for (irow = 0; irow < globalNRows; irow++) diag[irow] = diag2[irow] = 0.0; } index = 0; matIA[0] = index; currRow = startRow; for ( j = 0; j < localNnz; j++ ) { fscanf( fp, "%d %d %lg", &rowNum, &colNum, &colVal ); rowNum--; if ( scaleFlag == 1 && rowNum == colNum-1 ) diag[rowNum] = colVal; if ( rowNum != currRow ) { currRow = rowNum; matIA[currRow-startRow] = index; } matJA[index] = colNum - 1; matAA[index++] = colVal; } matIA[localNRows] = index; fclose(fp); printf("Processor %d finished reading matrix file.\n", mypid); fflush(stdout); if ( scaleFlag == 1 ) MPI_Allreduce(diag, diag2, globalNRows, MPI_DOUBLE, MPI_SUM, mpiComm); rowLengths = hypre_TAlloc(int, localNRows , HYPRE_MEMORY_HOST); for ( irow = 0; irow < localNRows; irow++ ) rowLengths[irow] = matIA[irow+1] - matIA[irow]; ierr = HYPRE_IJMatrixCreate(mpiComm, startRow, startRow+localNRows-1, startRow, startRow+localNRows-1, &IJmat); ierr = HYPRE_IJMatrixSetObjectType(IJmat, HYPRE_PARCSR); hypre_assert(!ierr); ierr = HYPRE_IJMatrixSetRowSizes(IJmat, rowLengths); ierr = HYPRE_IJMatrixInitialize(IJmat); hypre_assert(!ierr); for ( irow = 0; irow < localNRows; irow++ ) { length = rowLengths[irow]; rowNum = irow + startRow; inds = &(matJA[matIA[irow]]); vals = &(matAA[matIA[irow]]); if ( scaleFlag == 1 ) { scale = 1.0 / sqrt( diag2[rowNum] ); for ( j = 0; j < length; j++ ) { vals[j] = vals[j] * scale / ( sqrt(diag2[inds[j]]) ); if ( rowNum == inds[j] && habs(vals[j]-1.0) > 1.0e-6 ) { printf("Proc %d : diag %d = %e != 1.\n",mypid,rowNum,vals[j]); exit(1); } } } ierr = HYPRE_IJMatrixSetValues(IJmat, 1, &length,(const int *) &rowNum, (const int *) inds, (const double *) vals); hypre_assert( !ierr ); } hypre_TFree(rowLengths, HYPRE_MEMORY_HOST); hypre_TFree(matIA, HYPRE_MEMORY_HOST); hypre_TFree(matJA, HYPRE_MEMORY_HOST); hypre_TFree(matAA, HYPRE_MEMORY_HOST); ierr = HYPRE_IJMatrixAssemble(IJmat); hypre_assert( !ierr ); HYPRE_IJMatrixGetObject(IJmat, (void**) &hypreA); HYPRE_IJMatrixSetObjectType(IJmat, -1); HYPRE_IJMatrixDestroy(IJmat); (*Amat) = (void *) hypreA; if ( scaleFlag == 1 ) { hypre_TFree(diag, HYPRE_MEMORY_HOST); diag = hypre_TAlloc(double, localNRows, HYPRE_MEMORY_HOST); for ( irow = 0; irow < localNRows; irow++ ) diag[irow] = diag2[startRow+irow]; hypre_TFree(diag2, HYPRE_MEMORY_HOST); } (*scaleVec) = diag; return ierr; } /*************************************************************************** * read a matrix file in HB format (sequential) *--------------------------------------------------------------------------*/ int MLI_Utils_HypreMatrixReadHBFormat(char *filename, MPI_Comm mpiComm, void **Amat) { int *matIA, *matJA, *rowLengths, length, rowNum, startRow,*inds; int irow, lineLeng=200, localNRows, localNCols, localNnz, ierr; int rhsl; double *matAA, *vals; char line[200], junk[100]; FILE *fp; hypre_ParCSRMatrix *hypreA; HYPRE_IJMatrix IJmat; fp = fopen(filename, "r"); if (fp == NULL) { printf("file not found.\n"); exit(1); } fgets(line, lineLeng, fp); fgets(line, lineLeng, fp); sscanf(line, "%s %s %s %s %d", junk, junk, junk, junk, &rhsl ); fgets(line, lineLeng, fp); sscanf(line, "%s %d %d %d", junk, &localNRows, &localNCols, &localNnz ); printf("matrix info = %d %d %d\n", localNRows, localNCols, localNnz); fgets(line, lineLeng, fp); if (rhsl) fgets(line, lineLeng, fp); matIA = hypre_TAlloc(int, (localNRows+1) , HYPRE_MEMORY_HOST); matJA = hypre_TAlloc(int, localNnz , HYPRE_MEMORY_HOST); matAA = hypre_TAlloc(double, localNnz , HYPRE_MEMORY_HOST); for (irow = 0; irow <= localNRows; irow++) fscanf(fp, "%d", &matIA[irow]); for (irow = 0; irow < localNnz; irow++) fscanf(fp, "%d", &matJA[irow]); for (irow = 0; irow < localNnz; irow++) fscanf(fp, "%lg", &matAA[irow]); for (irow = 0; irow <= localNRows; irow++) matIA[irow]--; for (irow = 0; irow < localNnz; irow++) matJA[irow]--; if (matAA[0] < 0.0) for (irow = 0; irow < localNnz; irow++) matAA[irow] = -matAA[irow]; fclose(fp); startRow = 0; rowLengths = hypre_TAlloc(int, localNRows , HYPRE_MEMORY_HOST); for ( irow = 0; irow < localNRows; irow++ ) rowLengths[irow] = matIA[irow+1] - matIA[irow]; ierr = HYPRE_IJMatrixCreate(mpiComm, startRow, startRow+localNRows-1, startRow, startRow+localNRows-1, &IJmat); ierr = HYPRE_IJMatrixSetObjectType(IJmat, HYPRE_PARCSR); hypre_assert(!ierr); ierr = HYPRE_IJMatrixSetRowSizes(IJmat, rowLengths); ierr = HYPRE_IJMatrixInitialize(IJmat); hypre_assert(!ierr); for (irow = 0; irow < localNRows; irow++) { length = rowLengths[irow]; rowNum = irow + startRow; inds = &(matJA[matIA[irow]]); vals = &(matAA[matIA[irow]]); ierr = HYPRE_IJMatrixSetValues(IJmat, 1, &length,(const int *) &rowNum, (const int *) inds, (const double *) vals); hypre_assert( !ierr ); } hypre_TFree(rowLengths, HYPRE_MEMORY_HOST); hypre_TFree(matIA, HYPRE_MEMORY_HOST); hypre_TFree(matJA, HYPRE_MEMORY_HOST); hypre_TFree(matAA, HYPRE_MEMORY_HOST); ierr = HYPRE_IJMatrixAssemble(IJmat); hypre_assert( !ierr ); HYPRE_IJMatrixGetObject(IJmat, (void**) &hypreA); HYPRE_IJMatrixSetObjectType(IJmat, -1); HYPRE_IJMatrixDestroy(IJmat); (*Amat) = (void *) hypreA; return ierr; } /*************************************************************************** * read a vector from a file *--------------------------------------------------------------------------*/ int MLI_Utils_DoubleVectorRead(char *filename, MPI_Comm mpiComm, int length, int start, double *vec) { int mypid, nprocs, currProc, globalNRows; int irow, k, k2, base, numparams=2; double value; FILE *fp; MPI_Comm_rank( mpiComm, &mypid ); MPI_Comm_size( mpiComm, &nprocs ); currProc = 0; while ( currProc < nprocs ) { if ( mypid == currProc ) { fp = fopen( filename, "r" ); if ( fp == NULL ) { printf("MLI_Utils_DbleVectorRead ERROR : file not found.\n"); return -1; } fscanf( fp, "%d", &globalNRows ); if ( globalNRows < 0 || globalNRows > 1000000000 ) { printf("MLI_Utils_DoubleVectorRead ERROR : invalid nrows %d.\n", globalNRows); exit(1); } if ( start+length > globalNRows ) { printf("MLI_Utils_DoubleVectorRead ERROR : invalid start %d %d.\n", start, length); exit(1); } fscanf( fp, "%d %lg %d", &k, &value, &k2 ); if ( k == 0 ) base = 0; else base = 1; if ( k2 != 1 && k2 != 2 ) numparams = 3; fclose( fp ); fp = fopen( filename, "r" ); fscanf( fp, "%d", &globalNRows ); for ( irow = 0; irow < start; irow++ ) { fscanf( fp, "%d", &k ); fscanf( fp, "%lg", &value ); if ( numparams == 3 ) fscanf( fp, "%d", &k2 ); } for ( irow = start; irow < start+length; irow++ ) { fscanf( fp, "%d", &k ); if ( irow+base != k ) printf("Utils::VectorRead Warning : index mismatch (%d,%d).\n", irow+base,k); fscanf( fp, "%lg", &value ); if ( numparams == 3 ) fscanf( fp, "%d", &k2 ); vec[irow-start] = value; } fclose( fp ); } MPI_Barrier( mpiComm ); currProc++; } printf("%5d : MLI_Utils_DoubleVectorRead : nlocal, start = %d %d\n", mypid, length, start); return 0; } /*************************************************************************** * read a vector from a file *--------------------------------------------------------------------------*/ int MLI_Utils_DoubleParVectorRead(char *filename, MPI_Comm mpiComm, int length, int start, double *vec) { int mypid, nprocs, localNRows; int irow, k; double value; char fname[20]; FILE *fp; MPI_Comm_rank( mpiComm, &mypid ); MPI_Comm_size( mpiComm, &nprocs ); sprintf( fname, "%s.%d", filename, mypid); fp = fopen( fname, "r" ); if ( fp == NULL ) { printf("MLI_Utils_DoubleParVectorRead ERROR : file %s not found.\n", fname); return -1; } fscanf( fp, "%d", &localNRows ); if ( length != localNRows ) { printf("MLI_Utils_DoubleParVectorRead ERROR : invalid nrows %d (%d).\n", localNRows, length); exit(1); } for ( irow = start; irow < start+length; irow++ ) { fscanf( fp, "%d %lg", &k, &value ); vec[irow-start] = value; } fclose( fp ); return 0; } /*************************************************************************** * conform to the preconditioner set up from HYPRE *--------------------------------------------------------------------------*/ int MLI_Utils_ParCSRMLISetup( HYPRE_Solver solver, HYPRE_ParCSRMatrix A, HYPRE_ParVector b, HYPRE_ParVector x ) { int ierr=0; CMLI *cmli; (void) A; (void) b; (void) x; cmli = (CMLI *) solver; MLI_Setup( cmli ); return ierr; } /*************************************************************************** * conform to the preconditioner apply from HYPRE *--------------------------------------------------------------------------*/ int MLI_Utils_ParCSRMLISolve( HYPRE_Solver solver, HYPRE_ParCSRMatrix A, HYPRE_ParVector b, HYPRE_ParVector x ) { int ierr; CMLI *cmli; CMLI_Vector *csol, *crhs; (void) A; cmli = (CMLI *) solver; csol = MLI_VectorCreate((void*) x, "HYPRE_ParVector", NULL); crhs = MLI_VectorCreate((void*) b, "HYPRE_ParVector", NULL); ierr = MLI_Solve( cmli, csol, crhs ); MLI_VectorDestroy(csol); MLI_VectorDestroy(crhs); return ierr; } /*************************************************************************** * constructor for m-Jacobi preconditioner *--------------------------------------------------------------------------*/ int MLI_Utils_mJacobiCreate(MPI_Comm comm, HYPRE_Solver *solver) { HYPRE_MLI_mJacobi *jacobiPtr; jacobiPtr = hypre_TAlloc(HYPRE_MLI_mJacobi, 1, HYPRE_MEMORY_HOST); if (jacobiPtr == NULL) return 1; jacobiPtr->comm_ = comm; jacobiPtr->diagonal_ = NULL; jacobiPtr->degree_ = 1; jacobiPtr->hypreRes_ = NULL; *solver = (HYPRE_Solver) jacobiPtr; return 0; } /*************************************************************************** * destructor for m-Jacobi preconditioner *--------------------------------------------------------------------------*/ int MLI_Utils_mJacobiDestroy(HYPRE_Solver solver) { HYPRE_MLI_mJacobi *jacobiPtr = (HYPRE_MLI_mJacobi *) solver; if (jacobiPtr == NULL) return 1; hypre_TFree(jacobiPtr->diagonal_, HYPRE_MEMORY_HOST); if (jacobiPtr->hypreRes_ != NULL) HYPRE_ParVectorDestroy(jacobiPtr->hypreRes_); jacobiPtr->diagonal_ = NULL; jacobiPtr->hypreRes_ = NULL; return 0; } /*************************************************************************** * set polynomial degree *--------------------------------------------------------------------------*/ int MLI_Utils_mJacobiSetParams(HYPRE_Solver solver, int degree) { HYPRE_MLI_mJacobi *jacobiPtr = (HYPRE_MLI_mJacobi *) solver; if (jacobiPtr == NULL) return 1; if (degree > 0) jacobiPtr->degree_ = degree; return 0; } /*************************************************************************** * conform to the preconditioner set up from HYPRE *--------------------------------------------------------------------------*/ int MLI_Utils_mJacobiSetup(HYPRE_Solver solver, HYPRE_ParCSRMatrix A, HYPRE_ParVector b, HYPRE_ParVector x) { int i, j, nrows, *AI, *AJ, gnrows, *partition, *newPartition, nprocs; double *AData; hypre_ParCSRMatrix *hypreA; hypre_ParVector *hypreX; HYPRE_MLI_mJacobi *jacobiPtr; jacobiPtr = (HYPRE_MLI_mJacobi *) solver; if (jacobiPtr == NULL) return 1; hypre_TFree(jacobiPtr->diagonal_, HYPRE_MEMORY_HOST); hypreX = (hypre_ParVector *) x; nrows = hypre_VectorSize(hypre_ParVectorLocalVector(hypreX)); jacobiPtr->diagonal_ = hypre_TAlloc(double, nrows , HYPRE_MEMORY_HOST); hypreA = (hypre_ParCSRMatrix *) A; AI = hypre_CSRMatrixI(hypre_ParCSRMatrixDiag(hypreA)); AJ = hypre_CSRMatrixJ(hypre_ParCSRMatrixDiag(hypreA)); AData = hypre_CSRMatrixData(hypre_ParCSRMatrixDiag(hypreA)); for (i = 0; i < nrows; i++) { jacobiPtr->diagonal_[i] = 1.0; for (j = AI[i]; j < AI[i+1]; j++) { if (AJ[j] == i && AData[j] != 0.0) { jacobiPtr->diagonal_[i] = AData[j]; break; } } if (jacobiPtr->diagonal_[i] >= 0.0) { for (j = AI[i]; j < AI[i+1]; j++) if (AJ[j] != i && AData[j] > 0.0) jacobiPtr->diagonal_[i] += AData[j]; } else { for (j = AI[i]; j < AI[i+1]; j++) if (AJ[j] != i && AData[j] < 0.0) jacobiPtr->diagonal_[i] += AData[j]; } jacobiPtr->diagonal_[i] = 1.0 / jacobiPtr->diagonal_[i]; } if (jacobiPtr->hypreRes_ != NULL) HYPRE_ParVectorDestroy(jacobiPtr->hypreRes_); gnrows = hypre_ParVectorGlobalSize(hypreX); partition = hypre_ParVectorPartitioning(hypreX); MPI_Comm_size(jacobiPtr->comm_, &nprocs); newPartition = hypre_TAlloc(int, (nprocs+1) , HYPRE_MEMORY_HOST); for (i = 0; i <= nprocs; i++) newPartition[i] = partition[i]; HYPRE_ParVectorCreate(jacobiPtr->comm_, gnrows, newPartition, &(jacobiPtr->hypreRes_)); HYPRE_ParVectorInitialize(jacobiPtr->hypreRes_); return 0; } /*************************************************************************** * conform to the preconditioner apply from HYPRE *--------------------------------------------------------------------------*/ int MLI_Utils_mJacobiSolve(HYPRE_Solver solver, HYPRE_ParCSRMatrix A, HYPRE_ParVector b, HYPRE_ParVector x) { int i, j, nrows; double *xData, *rData, omega=1; HYPRE_ParVector res; hypre_ParVector *hypreX, *hypreR; HYPRE_MLI_mJacobi *jacobiPtr; jacobiPtr = (HYPRE_MLI_mJacobi *) solver; if (jacobiPtr == NULL) return 1; res = (HYPRE_ParVector) jacobiPtr->hypreRes_; hypreX = (hypre_ParVector *) x; hypreR = (hypre_ParVector *) res; xData = hypre_VectorData(hypre_ParVectorLocalVector(hypreX)); rData = hypre_VectorData(hypre_ParVectorLocalVector(hypreR)); nrows = hypre_VectorSize(hypre_ParVectorLocalVector(hypreX)); HYPRE_ParVectorCopy(b, res); for (j = 0; j < nrows; j++) xData[j] = (rData[j] * jacobiPtr->diagonal_[j]); for (i = 1; i < jacobiPtr->degree_; i++) { HYPRE_ParVectorCopy(b, res); HYPRE_ParCSRMatrixMatvec(-1.0e0, A, x, 1.0, res); for (j = 0; j < nrows; j++) xData[j] += omega * (rData[j] * jacobiPtr->diagonal_[j]); } return 0; } /*************************************************************************** * solve the system using HYPRE pcg *--------------------------------------------------------------------------*/ int MLI_Utils_HyprePCGSolve( CMLI *cmli, HYPRE_Matrix A, HYPRE_Vector b, HYPRE_Vector x ) { int numIterations, maxIter=500, mypid; double tol=1.0e-8, norm, setupTime, solveTime; MPI_Comm mpiComm; HYPRE_Solver pcgSolver, pcgPrecond; HYPRE_ParCSRMatrix hypreA; hypreA = (HYPRE_ParCSRMatrix) A; MLI_SetMaxIterations( cmli, 1 ); HYPRE_ParCSRMatrixGetComm( hypreA , &mpiComm ); HYPRE_ParCSRPCGCreate(mpiComm, &pcgSolver); HYPRE_PCGSetMaxIter(pcgSolver, maxIter ); HYPRE_PCGSetTol(pcgSolver, tol); HYPRE_PCGSetTwoNorm(pcgSolver, 1); HYPRE_PCGSetRelChange(pcgSolver, 1); HYPRE_PCGSetLogging(pcgSolver, 2); pcgPrecond = (HYPRE_Solver) cmli; HYPRE_PCGSetPrecond(pcgSolver, (HYPRE_PtrToSolverFcn) MLI_Utils_ParCSRMLISolve, (HYPRE_PtrToSolverFcn) MLI_Utils_ParCSRMLISetup, pcgPrecond); setupTime = MLI_Utils_WTime(); HYPRE_PCGSetup(pcgSolver, A, b, x); solveTime = MLI_Utils_WTime(); setupTime = solveTime - setupTime; HYPRE_PCGSolve(pcgSolver, A, b, x); solveTime = MLI_Utils_WTime() - solveTime; HYPRE_PCGGetNumIterations(pcgSolver, &numIterations); HYPRE_PCGGetFinalRelativeResidualNorm(pcgSolver, &norm); HYPRE_ParCSRPCGDestroy(pcgSolver); MPI_Comm_rank(mpiComm, &mypid); if ( mypid == 0 ) { printf("\tPCG maximum iterations = %d\n", maxIter); printf("\tPCG convergence tolerance = %e\n", tol); printf("\tPCG number of iterations = %d\n", numIterations); printf("\tPCG final relative residual norm = %e\n", norm); printf("\tPCG setup time = %e seconds\n",setupTime); printf("\tPCG solve time = %e seconds\n",solveTime); #if 0 printf("& %3d & %7.2f & %7.2f & %7.2f \\\\\n",numIterations, setupTime,solveTime,setupTime+solveTime); #endif } return 0; } /*************************************************************************** * solve the system using HYPRE gmres *--------------------------------------------------------------------------*/ int MLI_Utils_HypreGMRESSolve(void *precon, HYPRE_Matrix A, HYPRE_Vector b, HYPRE_Vector x, char *pname) { int numIterations, maxIter=1000, mypid, i, *nSweeps, *rTypes; double tol=1.0e-8, norm, setupTime, solveTime; double *relaxWt, *relaxOmega; MPI_Comm mpiComm; HYPRE_Solver gmresSolver, gmresPrecond; HYPRE_ParCSRMatrix hypreA; CMLI *cmli; hypreA = (HYPRE_ParCSRMatrix) A; HYPRE_ParCSRMatrixGetComm(hypreA , &mpiComm); HYPRE_ParCSRGMRESCreate(mpiComm, &gmresSolver); HYPRE_ParCSRGMRESSetMaxIter(gmresSolver, maxIter); HYPRE_ParCSRGMRESSetTol(gmresSolver, tol); HYPRE_GMRESSetRelChange(gmresSolver, 0); HYPRE_ParCSRGMRESSetPrintLevel(gmresSolver, 2); HYPRE_ParCSRGMRESSetKDim(gmresSolver, 100); if (!strcmp(pname, "boomeramg")) { HYPRE_BoomerAMGCreate(&gmresPrecond); HYPRE_BoomerAMGSetMaxIter(gmresPrecond, 1); HYPRE_BoomerAMGSetCycleType(gmresPrecond, 1); HYPRE_BoomerAMGSetMaxLevels(gmresPrecond, 25); HYPRE_BoomerAMGSetMeasureType(gmresPrecond, 0); HYPRE_BoomerAMGSetDebugFlag(gmresPrecond, 0); HYPRE_BoomerAMGSetPrintLevel(gmresPrecond, 0); HYPRE_BoomerAMGSetCoarsenType(gmresPrecond, 0); HYPRE_BoomerAMGSetStrongThreshold(gmresPrecond, 0.9); nSweeps = hypre_TAlloc(int, 4 , HYPRE_MEMORY_HOST); for (i = 0; i < 4; i++) nSweeps[i] = 1; HYPRE_BoomerAMGSetNumGridSweeps(gmresPrecond, nSweeps); rTypes = hypre_TAlloc(int, 4 , HYPRE_MEMORY_HOST); for (i = 0; i < 4; i++) rTypes[i] = 6; relaxWt = hypre_TAlloc(double, 25 , HYPRE_MEMORY_HOST); for (i = 0; i < 25; i++) relaxWt[i] = 1.0; HYPRE_BoomerAMGSetRelaxWeight(gmresPrecond, relaxWt); relaxOmega = hypre_TAlloc(double, 25 , HYPRE_MEMORY_HOST); for (i = 0; i < 25; i++) relaxOmega[i] = 1.0; HYPRE_BoomerAMGSetOmega(gmresPrecond, relaxOmega); HYPRE_GMRESSetPrecond(gmresSolver, (HYPRE_PtrToSolverFcn) HYPRE_BoomerAMGSolve, (HYPRE_PtrToSolverFcn) HYPRE_BoomerAMGSetup, gmresPrecond); } else if (!strcmp(pname, "mli")) { cmli = (CMLI *) precon; MLI_SetMaxIterations(cmli, 1); gmresPrecond = (HYPRE_Solver) cmli; HYPRE_GMRESSetPrecond(gmresSolver, (HYPRE_PtrToSolverFcn) MLI_Utils_ParCSRMLISolve, (HYPRE_PtrToSolverFcn) MLI_Utils_ParCSRMLISetup, gmresPrecond); } else if (!strcmp(pname, "pJacobi")) { gmresPrecond = (HYPRE_Solver) precon; HYPRE_ParCSRGMRESSetMaxIter(gmresSolver, 10); HYPRE_ParCSRGMRESSetPrintLevel(gmresSolver, 0); HYPRE_GMRESSetPrecond(gmresSolver, (HYPRE_PtrToSolverFcn) MLI_Utils_mJacobiSolve, (HYPRE_PtrToSolverFcn) MLI_Utils_mJacobiSetup, gmresPrecond); } else if (!strcmp(pname, "mJacobi")) { gmresPrecond = (HYPRE_Solver) precon; HYPRE_ParCSRGMRESSetMaxIter(gmresSolver, 5); /* change this in amgcr too */ HYPRE_ParCSRGMRESSetPrintLevel(gmresSolver, 0); HYPRE_GMRESSetPrecond(gmresSolver, (HYPRE_PtrToSolverFcn) MLI_Utils_mJacobiSolve, (HYPRE_PtrToSolverFcn) MLI_Utils_mJacobiSetup, gmresPrecond); } setupTime = MLI_Utils_WTime(); HYPRE_GMRESSetup(gmresSolver, A, b, x); solveTime = MLI_Utils_WTime(); setupTime = solveTime - setupTime; HYPRE_GMRESSolve(gmresSolver, A, b, x); solveTime = MLI_Utils_WTime() - solveTime; HYPRE_ParCSRGMRESGetNumIterations(gmresSolver, &numIterations); HYPRE_ParCSRGMRESGetFinalRelativeResidualNorm(gmresSolver, &norm); HYPRE_ParCSRGMRESDestroy(gmresSolver); MPI_Comm_rank(mpiComm, &mypid); if (mypid == 0 && ((!strcmp(pname, "mli")) || (!strcmp(pname, "boomeramg")))) { printf("\tGMRES Krylov dimension = 200\n"); printf("\tGMRES maximum iterations = %d\n", maxIter); printf("\tGMRES convergence tolerance = %e\n", tol); printf("\tGMRES number of iterations = %d\n", numIterations); printf("\tGMRES final relative residual norm = %e\n", norm); printf("\tGMRES setup time = %e seconds\n",setupTime); printf("\tGMRES solve time = %e seconds\n",solveTime); } return 0; } /*************************************************************************** * solve the system using HYPRE fgmres *--------------------------------------------------------------------------*/ int MLI_Utils_HypreFGMRESSolve(void *precon, HYPRE_Matrix A, HYPRE_Vector b, HYPRE_Vector x, char *pname) { int numIterations, maxIter=1000, mypid, i, *nSweeps, *rTypes; double tol=1.0e-8, norm, setupTime, solveTime; double *relaxWt, *relaxOmega; MPI_Comm mpiComm; HYPRE_Solver gmresSolver, gmresPrecond; HYPRE_ParCSRMatrix hypreA; CMLI *cmli; hypreA = (HYPRE_ParCSRMatrix) A; HYPRE_ParCSRMatrixGetComm(hypreA , &mpiComm); HYPRE_ParCSRFGMRESCreate(mpiComm, &gmresSolver); HYPRE_ParCSRFGMRESSetMaxIter(gmresSolver, maxIter); HYPRE_ParCSRFGMRESSetTol(gmresSolver, tol); HYPRE_ParCSRFGMRESSetLogging(gmresSolver, 2); HYPRE_ParCSRFGMRESSetKDim(gmresSolver, 100); if (!strcmp(pname, "boomeramg")) { HYPRE_BoomerAMGCreate(&gmresPrecond); HYPRE_BoomerAMGSetMaxIter(gmresPrecond, 1); HYPRE_BoomerAMGSetCycleType(gmresPrecond, 1); HYPRE_BoomerAMGSetMaxLevels(gmresPrecond, 25); HYPRE_BoomerAMGSetMeasureType(gmresPrecond, 0); HYPRE_BoomerAMGSetDebugFlag(gmresPrecond, 0); HYPRE_BoomerAMGSetPrintLevel(gmresPrecond, 0); HYPRE_BoomerAMGSetCoarsenType(gmresPrecond, 0); HYPRE_BoomerAMGSetStrongThreshold(gmresPrecond, 0.9); nSweeps = hypre_TAlloc(int, 4 , HYPRE_MEMORY_HOST); for (i = 0; i < 4; i++) nSweeps[i] = 1; HYPRE_BoomerAMGSetNumGridSweeps(gmresPrecond, nSweeps); rTypes = hypre_TAlloc(int, 4 , HYPRE_MEMORY_HOST); for (i = 0; i < 4; i++) rTypes[i] = 6; relaxWt = hypre_TAlloc(double, 25 , HYPRE_MEMORY_HOST); for (i = 0; i < 25; i++) relaxWt[i] = 1.0; HYPRE_BoomerAMGSetRelaxWeight(gmresPrecond, relaxWt); relaxOmega = hypre_TAlloc(double, 25 , HYPRE_MEMORY_HOST); for (i = 0; i < 25; i++) relaxOmega[i] = 1.0; HYPRE_BoomerAMGSetOmega(gmresPrecond, relaxOmega); HYPRE_ParCSRFGMRESSetMaxIter(gmresSolver, maxIter); HYPRE_ParCSRFGMRESSetPrecond(gmresSolver, HYPRE_BoomerAMGSolve, HYPRE_BoomerAMGSetup, gmresPrecond); } else if (!strcmp(pname, "mli")) { cmli = (CMLI *) precon; MLI_SetMaxIterations(cmli, 1); gmresPrecond = (HYPRE_Solver) cmli; HYPRE_ParCSRFGMRESSetPrecond(gmresSolver, MLI_Utils_ParCSRMLISolve, MLI_Utils_ParCSRMLISetup, gmresPrecond); } else if (!strcmp(pname, "pJacobi")) { gmresPrecond = (HYPRE_Solver) precon; HYPRE_ParCSRFGMRESSetMaxIter(gmresSolver, 10); HYPRE_ParCSRFGMRESSetLogging(gmresSolver, 0); HYPRE_ParCSRFGMRESSetPrecond(gmresSolver, MLI_Utils_mJacobiSolve, MLI_Utils_mJacobiSetup, gmresPrecond); } else if (!strcmp(pname, "mJacobi")) { gmresPrecond = (HYPRE_Solver) precon; HYPRE_ParCSRFGMRESSetMaxIter(gmresSolver, 5); /* change this in amgcr too */ HYPRE_ParCSRFGMRESSetLogging(gmresSolver, 0); HYPRE_ParCSRFGMRESSetPrecond(gmresSolver, MLI_Utils_mJacobiSolve, MLI_Utils_mJacobiSetup, gmresPrecond); } setupTime = MLI_Utils_WTime(); HYPRE_ParCSRFGMRESSetup(gmresSolver, hypreA, (HYPRE_ParVector) b, (HYPRE_ParVector) x); solveTime = MLI_Utils_WTime(); setupTime = solveTime - setupTime; HYPRE_ParCSRFGMRESSolve(gmresSolver, hypreA, (HYPRE_ParVector) b, (HYPRE_ParVector) x); solveTime = MLI_Utils_WTime() - solveTime; HYPRE_ParCSRFGMRESGetNumIterations(gmresSolver, &numIterations); HYPRE_ParCSRFGMRESGetFinalRelativeResidualNorm(gmresSolver, &norm); HYPRE_ParCSRFGMRESDestroy(gmresSolver); MPI_Comm_rank(mpiComm, &mypid); if (mypid == 0 && ((!strcmp(pname, "mli")) || (!strcmp(pname, "boomeramg")))) { printf("\tFGMRES Krylov dimension = 200\n"); printf("\tFGMRES maximum iterations = %d\n", maxIter); printf("\tFGMRES convergence tolerance = %e\n", tol); printf("\tFGMRES number of iterations = %d\n", numIterations); printf("\tFGMRES final relative residual norm = %e\n", norm); printf("\tFGMRES setup time = %e seconds\n",setupTime); printf("\tFGMRES solve time = %e seconds\n",solveTime); } return 0; } /*************************************************************************** * solve the system using HYPRE bicgstab *--------------------------------------------------------------------------*/ int MLI_Utils_HypreBiCGSTABSolve( CMLI *cmli, HYPRE_Matrix A, HYPRE_Vector b, HYPRE_Vector x ) { int numIterations, maxIter=500; double tol=1.0e-6, norm, setupTime, solveTime; MPI_Comm mpiComm; HYPRE_Solver cgstabSolver, cgstabPrecond; HYPRE_ParCSRMatrix hypreA; hypreA = (HYPRE_ParCSRMatrix) A; MLI_SetMaxIterations( cmli, 1 ); HYPRE_ParCSRMatrixGetComm( hypreA , &mpiComm ); HYPRE_ParCSRBiCGSTABCreate(mpiComm, &cgstabSolver); HYPRE_BiCGSTABSetMaxIter(cgstabSolver, maxIter ); HYPRE_BiCGSTABSetTol(cgstabSolver, tol); HYPRE_BiCGSTABSetStopCrit(cgstabSolver, 0); HYPRE_BiCGSTABSetLogging(cgstabSolver, 2); cgstabPrecond = (HYPRE_Solver) cmli; HYPRE_BiCGSTABSetPrecond(cgstabSolver, (HYPRE_PtrToSolverFcn) MLI_Utils_ParCSRMLISolve, (HYPRE_PtrToSolverFcn) MLI_Utils_ParCSRMLISetup, cgstabPrecond); setupTime = MLI_Utils_WTime(); HYPRE_BiCGSTABSetup(cgstabSolver, A, b, x); solveTime = MLI_Utils_WTime(); setupTime = solveTime - setupTime; HYPRE_BiCGSTABSolve(cgstabSolver, A, b, x); solveTime = MLI_Utils_WTime() - solveTime; HYPRE_BiCGSTABGetNumIterations(cgstabSolver, &numIterations); HYPRE_BiCGSTABGetFinalRelativeResidualNorm(cgstabSolver, &norm); HYPRE_BiCGSTABDestroy(cgstabSolver); printf("\tBiCGSTAB maximum iterations = %d\n", maxIter); printf("\tBiCGSTAB convergence tolerance = %e\n", tol); printf("\tBiCGSTAB number of iterations = %d\n", numIterations); printf("\tBiCGSTAB final relative residual norm = %e\n", norm); printf("\tBiCGSTAB setup time = %e seconds\n",setupTime); printf("\tBiCGSTAB solve time = %e seconds\n",solveTime); return 0; } /*************************************************************************** *--------------------------------------------------------------------------*/ int MLI_Utils_BinarySearch(int key, int *list, int size) { int nfirst, nlast, nmid, found, index; if (size <= 0) return -1; nfirst = 0; nlast = size - 1; if (key > list[nlast]) return -(nlast+1); if (key < list[nfirst]) return -(nfirst+1); found = 0; while ((found == 0) && ((nlast-nfirst)>1)) { nmid = (nfirst + nlast) / 2; if (key == list[nmid]) {index = nmid; found = 1;} else if (key > list[nmid]) nfirst = nmid; else nlast = nmid; } if (found == 1) return index; else if (key == list[nfirst]) return nfirst; else if (key == list[nlast]) return nlast; else return -(nfirst+1); } /*************************************************************************** * quicksort on integers *--------------------------------------------------------------------------*/ int MLI_Utils_IntQSort2(int *ilist, int *ilist2, int left, int right) { int i, last, mid, itemp; if (left >= right) return 0; mid = (left + right) / 2; itemp = ilist[left]; ilist[left] = ilist[mid]; ilist[mid] = itemp; if ( ilist2 != NULL ) { itemp = ilist2[left]; ilist2[left] = ilist2[mid]; ilist2[mid] = itemp; } last = left; for (i = left+1; i <= right; i++) { if (ilist[i] < ilist[left]) { last++; itemp = ilist[last]; ilist[last] = ilist[i]; ilist[i] = itemp; if ( ilist2 != NULL ) { itemp = ilist2[last]; ilist2[last] = ilist2[i]; ilist2[i] = itemp; } } } itemp = ilist[left]; ilist[left] = ilist[last]; ilist[last] = itemp; if ( ilist2 != NULL ) { itemp = ilist2[left]; ilist2[left] = ilist2[last]; ilist2[last] = itemp; } MLI_Utils_IntQSort2(ilist, ilist2, left, last-1); MLI_Utils_IntQSort2(ilist, ilist2, last+1, right); return 0; } /*************************************************************************** * quicksort on integers and permute doubles *--------------------------------------------------------------------------*/ int MLI_Utils_IntQSort2a(int *ilist, double *dlist, int left, int right) { int i, last, mid, itemp; double dtemp; if (left >= right) return 0; mid = (left + right) / 2; itemp = ilist[left]; ilist[left] = ilist[mid]; ilist[mid] = itemp; if ( dlist != NULL ) { dtemp = dlist[left]; dlist[left] = dlist[mid]; dlist[mid] = dtemp; } last = left; for (i = left+1; i <= right; i++) { if (ilist[i] < ilist[left]) { last++; itemp = ilist[last]; ilist[last] = ilist[i]; ilist[i] = itemp; if ( dlist != NULL ) { dtemp = dlist[last]; dlist[last] = dlist[i]; dlist[i] = dtemp; } } } itemp = ilist[left]; ilist[left] = ilist[last]; ilist[last] = itemp; if ( dlist != NULL ) { dtemp = dlist[left]; dlist[left] = dlist[last]; dlist[last] = dtemp; } MLI_Utils_IntQSort2a(ilist, dlist, left, last-1); MLI_Utils_IntQSort2a(ilist, dlist, last+1, right); return 0; } /*************************************************************************** * quicksort on double and permute integers *--------------------------------------------------------------------------*/ int MLI_Utils_DbleQSort2a(double *dlist, int *ilist, int left, int right) { int i, last, mid, itemp; double dtemp; if (left >= right) return 0; mid = (left + right) / 2; dtemp = dlist[left]; dlist[left] = dlist[mid]; dlist[mid] = dtemp; if ( ilist != NULL ) { itemp = ilist[left]; ilist[left] = ilist[mid]; ilist[mid] = itemp; } last = left; for (i = left+1; i <= right; i++) { if (dlist[i] < dlist[left]) { last++; dtemp = dlist[last]; dlist[last] = dlist[i]; dlist[i] = dtemp; if ( ilist != NULL ) { itemp = ilist[last]; ilist[last] = ilist[i]; ilist[i] = itemp; } } } dtemp = dlist[left]; dlist[left] = dlist[last]; dlist[last] = dtemp; if ( ilist != NULL ) { itemp = ilist[left]; ilist[left] = ilist[last]; ilist[last] = itemp; } MLI_Utils_DbleQSort2a(dlist, ilist, left, last-1); MLI_Utils_DbleQSort2a(dlist, ilist, last+1, right); return 0; } /*************************************************************************** * merge sort on integers *--------------------------------------------------------------------------*/ int MLI_Utils_IntMergeSort(int nList, int *listLengs, int **lists, int **lists2, int *newNListOut, int **newListOut) { int i, totalLeng, *indices, *newList, parseCnt, newListCnt, minInd; int minVal, *tree, *treeInd; #if 0 int sortFlag; #endif totalLeng = 0; for ( i = 0; i < nList; i++ ) totalLeng += listLengs[i]; if ( totalLeng <= 0 ) return 1; #if 0 for ( i = 0; i < nList; i++ ) { sortFlag = 0; for ( j = 1; j < listLengs[i]; j++ ) if ( lists[i][j] < lists[i][j-1] ) { sortFlag = 1; break; } if ( sortFlag == 1 ) MLI_Utils_IntQSort2(lists[i], lists2[i], 0, listLengs[i]-1); } #endif newList = hypre_TAlloc(int, totalLeng , HYPRE_MEMORY_HOST); indices = hypre_TAlloc(int, nList , HYPRE_MEMORY_HOST); tree = hypre_TAlloc(int, nList , HYPRE_MEMORY_HOST); treeInd = hypre_TAlloc(int, nList , HYPRE_MEMORY_HOST); for ( i = 0; i < nList; i++ ) indices[i] = 0; for ( i = 0; i < nList; i++ ) { if ( listLengs[i] > 0 ) { tree[i] = lists[i][0]; treeInd[i] = i; } else { tree[i] = (1 << 30) - 1; treeInd[i] = -1; } } MLI_Utils_IntQSort2(tree, treeInd, 0, nList-1); parseCnt = newListCnt = 0; while ( parseCnt < totalLeng ) { minInd = treeInd[0]; minVal = tree[0]; if ( newListCnt == 0 || minVal != newList[newListCnt-1] ) { newList[newListCnt] = minVal; lists2[minInd][indices[minInd]++] = newListCnt++; } else if ( minVal == newList[newListCnt-1] ) { lists2[minInd][indices[minInd]++] = newListCnt - 1; } if ( indices[minInd] < listLengs[minInd] ) { tree[0] = lists[minInd][indices[minInd]]; treeInd[0] = minInd; } else { tree[0] = (1 << 30) - 1; treeInd[0] = - 1; } MLI_Utils_IntTreeUpdate(nList, tree, treeInd); parseCnt++; } (*newListOut) = newList; (*newNListOut) = newListCnt; hypre_TFree(indices, HYPRE_MEMORY_HOST); hypre_TFree(tree, HYPRE_MEMORY_HOST); hypre_TFree(treeInd, HYPRE_MEMORY_HOST); return 0; } /*************************************************************************** * tree sort on integers *--------------------------------------------------------------------------*/ int MLI_Utils_IntTreeUpdate(int treeLeng, int *tree, int *treeInd) { int i, itemp, seed, next, nextp1, ndigits, minInd, minVal; ndigits = 0; if ( treeLeng > 0 ) ndigits++; itemp = treeLeng; while ( (itemp >>= 1) > 0 ) ndigits++; if ( tree[1] < tree[0] ) { itemp = tree[0]; tree[0] = tree[1]; tree[1] = itemp; itemp = treeInd[0]; treeInd[0] = treeInd[1]; treeInd[1] = itemp; } else return 0; seed = 1; for ( i = 0; i < ndigits-1; i++ ) { next = seed * 2; nextp1 = next + 1; minInd = seed; minVal = tree[seed]; if ( next < treeLeng && tree[next] < minVal ) { minInd = next; minVal = tree[next]; } if ( nextp1 < treeLeng && tree[nextp1] < minVal ) { minInd = next + 1; minVal = tree[nextp1]; } if ( minInd == seed ) return 0; itemp = tree[minInd]; tree[minInd] = tree[seed]; tree[seed] = itemp; itemp = treeInd[minInd]; treeInd[minInd] = treeInd[seed]; treeInd[seed] = itemp; seed = minInd; } return 0; } /* ******************************************************************** */ /* inverse of a dense matrix */ /* -------------------------------------------------------------------- */ int MLI_Utils_DenseMatrixInverse( double **Amat, int ndim, double ***Bmat ) { int i, j, k; double denom, **Cmat, dmax; (*Bmat) = NULL; if ( ndim == 1 ) { if ( habs(Amat[0][0]) <= 1.0e-16 ) return -1; Cmat = hypre_TAlloc(double*, ndim , HYPRE_MEMORY_HOST); for ( i = 0; i < ndim; i++ ) Cmat[i] = hypre_TAlloc(double, ndim , HYPRE_MEMORY_HOST); Cmat[0][0] = 1.0 / Amat[0][0]; (*Bmat) = Cmat; return 0; } else if ( ndim == 2 ) { denom = Amat[0][0] * Amat[1][1] - Amat[0][1] * Amat[1][0]; if ( habs( denom ) <= 1.0e-16 ) return -1; Cmat = hypre_TAlloc(double*, ndim , HYPRE_MEMORY_HOST); for ( i = 0; i < ndim; i++ ) Cmat[i] = hypre_TAlloc(double, ndim , HYPRE_MEMORY_HOST); Cmat[0][0] = Amat[1][1] / denom; Cmat[1][1] = Amat[0][0] / denom; Cmat[0][1] = - ( Amat[0][1] / denom ); Cmat[1][0] = - ( Amat[1][0] / denom ); (*Bmat) = Cmat; return 0; } else { Cmat = hypre_TAlloc(double*, ndim , HYPRE_MEMORY_HOST); for ( i = 0; i < ndim; i++ ) { Cmat[i] = hypre_TAlloc(double, ndim , HYPRE_MEMORY_HOST); for ( j = 0; j < ndim; j++ ) Cmat[i][j] = 0.0; Cmat[i][i] = 1.0; } for ( i = 1; i < ndim; i++ ) { for ( j = 0; j < i; j++ ) { if ( habs(Amat[j][j]) < 1.0e-16 ) return -1; denom = Amat[i][j] / Amat[j][j]; for ( k = 0; k < ndim; k++ ) { Amat[i][k] -= denom * Amat[j][k]; Cmat[i][k] -= denom * Cmat[j][k]; } } } for ( i = ndim-2; i >= 0; i-- ) { for ( j = ndim-1; j >= i+1; j-- ) { if ( habs(Amat[j][j]) < 1.0e-16 ) return -1; denom = Amat[i][j] / Amat[j][j]; for ( k = 0; k < ndim; k++ ) { Amat[i][k] -= denom * Amat[j][k]; Cmat[i][k] -= denom * Cmat[j][k]; } } } for ( i = 0; i < ndim; i++ ) { denom = Amat[i][i]; if ( habs(denom) < 1.0e-16 ) return -1; for ( j = 0; j < ndim; j++ ) Cmat[i][j] /= denom; } for ( i = 0; i < ndim; i++ ) for ( j = 0; j < ndim; j++ ) if ( habs(Cmat[i][j]) < 1.0e-17 ) Cmat[i][j] = 0.0; dmax = 0.0; for ( i = 0; i < ndim; i++ ) { for ( j = 0; j < ndim; j++ ) if ( habs(Cmat[i][j]) > dmax ) dmax = habs(Cmat[i][j]); } (*Bmat) = Cmat; if ( dmax > 1.0e6 ) return 1; else return 0; } } /* ******************************************************************** */ /* matvec given a dense matrix (Amat 2 D array) */ /* -------------------------------------------------------------------- */ int MLI_Utils_DenseMatvec( double **Amat, int ndim, double *x, double *Ax ) { int i, j; double ddata, *matLocal; for ( i = 0; i < ndim; i++ ) { matLocal = Amat[i]; ddata = 0.0; for ( j = 0; j < ndim; j++ ) ddata += *matLocal++ * x[j]; Ax[i] = ddata; } return 0; } hypre-2.33.0/src/FEI_mv/femli/mli_utils.h000066400000000000000000000123371477326011500201040ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * Utility functions * *****************************************************************************/ #ifndef __MLIUTILS__ #define __MLIUTILS__ #include #include "_hypre_utilities.h" #include "_hypre_parcsr_mv.h" #include "krylov.h" #include "_hypre_parcsr_ls.h" typedef struct MLI_Function_Struct MLI_Function; #include "cmli.h" /************************************************************************ * structure for m-Jacobi preconditioner *----------------------------------------------------------------------*/ typedef struct { MPI_Comm comm_; int degree_; double *diagonal_; HYPRE_ParVector hypreRes_; } HYPRE_MLI_mJacobi; /************************************************************************ * place holder for function pointers *----------------------------------------------------------------------*/ struct MLI_Function_Struct { int (*func_)(void*); }; /************************************************************************ * Utility function definitions *----------------------------------------------------------------------*/ #ifdef __cplusplus extern "C" { #endif int MLI_Utils_HypreParCSRMatrixGetDestroyFunc(MLI_Function *funcPtr); int MLI_Utils_HypreCSRMatrixGetDestroyFunc(MLI_Function *funcPtr); int MLI_Utils_HypreParVectorGetDestroyFunc(MLI_Function *funcPtr); int MLI_Utils_HypreVectorGetDestroyFunc(MLI_Function *funcPtr); int MLI_Utils_HypreMatrixFormJacobi(void *A, double, void **J); int MLI_Utils_GenPartition(MPI_Comm comm, int n, int **part); int MLI_Utils_ScaleVec(hypre_ParCSRMatrix *Amat, hypre_ParVector *vec); int MLI_Utils_ComputeSpectralRadius(hypre_ParCSRMatrix *, double *); int MLI_Utils_ComputeExtremeRitzValues(hypre_ParCSRMatrix *, double *, int); int MLI_Utils_ComputeMatrixMaxNorm(hypre_ParCSRMatrix *, double *, int); double MLI_Utils_WTime(); int MLI_Utils_HypreMatrixPrint(void *, char *); int MLI_Utils_HypreMatrixGetInfo(void *, int *, double *); int MLI_Utils_HypreMatrixComputeRAP(void *P, void *A, void **RAP); int MLI_Utils_HypreMatrixCompress(void *A, int blksize, void **A2); int MLI_Utils_HypreBoolMatrixDecompress(void *S, int, void **S2, void *A); int MLI_Utils_QR(double *Q, double *R, int nrows, int ncols); int MLI_Utils_SVD(double *uArray, double *sArray, double *vtArray, double *workArray, int m, int n, int workLen); int MLI_Utils_singular_vectors(int n, double *uArray); int MLI_Utils_ComputeLowEnergyLanczos(hypre_ParCSRMatrix *A, int maxIter, int num_vecs_to_return, double *le_vectors); int MLI_Utils_HypreMatrixReadTuminFormat(char *filename, MPI_Comm comm, int blksize, void **mat, int flag, double **scaleVec); int MLI_Utils_HypreMatrixReadIJAFormat(char *filename, MPI_Comm comm, int blksize, void **mat, int flag, double **scaleVec); int MLI_Utils_HypreParMatrixReadIJAFormat(char *filename, MPI_Comm comm, void **mat, int flag, double **scaleVec); int MLI_Utils_HypreMatrixReadHBFormat(char *filename, MPI_Comm comm, void **mat); int MLI_Utils_DoubleVectorRead(char *, MPI_Comm, int, int, double *vec); int MLI_Utils_DoubleParVectorRead(char *, MPI_Comm, int, int, double *vec); int MLI_Utils_ParCSRMLISetup(HYPRE_Solver, HYPRE_ParCSRMatrix, HYPRE_ParVector, HYPRE_ParVector); int MLI_Utils_ParCSRMLISolve(HYPRE_Solver, HYPRE_ParCSRMatrix, HYPRE_ParVector, HYPRE_ParVector); int MLI_Utils_mJacobiCreate(MPI_Comm, HYPRE_Solver *); int MLI_Utils_mJacobiDestroy(HYPRE_Solver); int MLI_Utils_mJacobiSetParams(HYPRE_Solver, int); int MLI_Utils_mJacobiSetup(HYPRE_Solver, HYPRE_ParCSRMatrix, HYPRE_ParVector, HYPRE_ParVector); int MLI_Utils_mJacobiSolve(HYPRE_Solver, HYPRE_ParCSRMatrix, HYPRE_ParVector, HYPRE_ParVector); int MLI_Utils_HyprePCGSolve(CMLI *, HYPRE_Matrix, HYPRE_Vector, HYPRE_Vector); int MLI_Utils_HypreGMRESSolve(void *, HYPRE_Matrix, HYPRE_Vector, HYPRE_Vector, char *); int MLI_Utils_HypreBiCGSTABSolve(CMLI *, HYPRE_Matrix, HYPRE_Vector, HYPRE_Vector); int MLI_Utils_BinarySearch(int, int *, int); int MLI_Utils_IntQSort2(int *, int *, int, int); int MLI_Utils_IntQSort2a(int *, double *, int, int); int MLI_Utils_DbleQSort2a(double *, int *, int, int); int MLI_Utils_IntMergeSort(int nlist, int *listLengs, int **lists, int **list2, int *newNList, int **newList); int MLI_Utils_DenseMatrixInverse(double **Amat, int ndim, double ***Bmat); int MLI_Utils_DenseMatvec(double **Amat, int ndim, double *x, double *Ax); #ifdef __cplusplus } #endif #endif hypre-2.33.0/src/FEI_mv/femli/mli_utils_fortran.f000066400000000000000000000520341477326011500216330ustar00rootroot00000000000000! Copyright (c) 1998 Lawrence Livermore National Security, LLC and other ! HYPRE Project Developers. See the top-level COPYRIGHT file for details. ! ! SPDX-License-Identifier: (Apache-2.0 OR MIT) ! ********************************************************************** ! * Eispack functions for computing eigenvalues and eigenvectors ! ********************************************************************** ! ********************************************************************** ! this subroutine calls the recommended sequence of ! subroutines from the eigensystem subroutine package (eispack) ! to find the eigenvalues and eigenvectors (if desired) ! of a real symmetric matrix. ! ! on input ! ! nm must be set to the row dimension of the two-dimensional ! array parameters as declared in the calling program ! dimension statement. ! ! n is the order of the matrix a. ! ! a contains the real symmetric matrix. ! ! matz is an integer variable set equal to zero if ! only eigenvalues are desired. otherwise it is set to ! any non-zero integer for both eigenvalues and eigenvectors. ! ! on output ! ! w contains the eigenvalues in ascending order. ! ! z contains the eigenvectors if matz is not zero. ! ! ierr is an integer output variable set equal to an error ! completion code described in the documentation for tqlrat ! and tql2. the normal completion code is zero. ! ! fv1 and fv2 are temporary storage arrays. ! ! questions and comments should be directed to burton s. garbow, ! mathematics and computer science div, argonne national laboratory ! ! this version dated august 1983. ! ! ---------------------------------------------------------------------- ! subroutine mli_computeSpectrum(nm,n,a,w,matz,z,fv1,fv2,ierr) integer n,nm,ierr,matz double precision a(nm,n),w(n),z(nm,n),fv1(n),fv2(n) if (n .le. nm) go to 10 ierr = 10 * n go to 50 ! 10 if (matz .ne. 0) go to 20 ! .......... find eigenvalues only .......... call mli_tred1(nm,n,a,w,fv1,fv2) ! tqlrat encounters catastrophic underflow on the Vax ! call tqlrat(n,w,fv2,ierr) call mli_tql1(n,w,fv1,ierr) go to 50 ! .......... find both eigenvalues and eigenvectors .......... 20 call mli_tred2(nm,n,a,w,fv1,z) call mli_tql2(nm,n,w,fv1,z,ierr) 50 return end ! ********************************************************************** ! ! this subroutine is a translation of the algol procedure tql1, ! num. math. 11, 293-306(1968) by bowdler, martin, reinsch, and ! wilkinson. ! handbook for auto. comp., vol.ii-linear algebra, 227-240(1971). ! ! this subroutine finds the eigenvalues of a symmetric ! tridiagonal matrix by the ql method. ! ! on input ! ! n is the order of the matrix. ! ! d contains the diagonal elements of the input matrix. ! ! e contains the subdiagonal elements of the input matrix ! in its last n-1 positions. e(1) is arbitrary. ! ! on output ! ! d contains the eigenvalues in ascending order. if an ! error exit is made, the eigenvalues are correct and ! ordered for indices 1,2,...ierr-1, but may not be ! the smallest eigenvalues. ! ! e has been destroyed. ! ! ierr is set to ! zero for normal return, ! j if the j-th eigenvalue has not been ! determined after 30 iterations. ! ! calls pythag for dsqrt(a*a + b*b) . ! ! questions and comments should be directed to burton s. garbow, ! mathematics and computer science div, argonne national laboratory ! ! this version dated august 1983. ! ! ---------------------------------------------------------------------- ! subroutine mli_tql1(n,d,e,ierr) integer i,j,l,m,n,ii,l1,l2,mml,ierr double precision d(n),e(n) double precision c,c2,c3,dl1,el1,f,g,h,p,r,s,s2,tst1,tst2 double precision mli_pythag double precision mli_dsign ierr = 0 if (n .eq. 1) go to 1001 ! do 100 i = 2, n e(i-1) = e(i) 100 continue ! f = 0.0d0 tst1 = 0.0d0 e(n) = 0.0d0 ! do 290 l = 1, n j = 0 h = dabs(d(l)) + dabs(e(l)) if (tst1 .lt. h) tst1 = h ! .......... look for small sub-diagonal element .......... do 110 m = l, n tst2 = tst1 + dabs(e(m)) if (tst2 .eq. tst1) go to 120 ! .......... e(n) is always zero, so there is no exit ! through the bottom of the loop .......... 110 continue ! 120 if (m .eq. l) go to 210 130 if (j .eq. 30) go to 1000 j = j + 1 ! .......... form shift .......... l1 = l + 1 l2 = l1 + 1 g = d(l) p = (d(l1) - g) / (2.0d0 * e(l)) r = mli_pythag(p,1.0d0) if (p . ge. 0.e0) then mli_dsign = dabs(r) end if if (p .lt. 0.e0) then mli_dsign = -dabs(r) end if d(l) = e(l) / (p + mli_dsign) d(l1) = e(l) * (p + mli_dsign) dl1 = d(l1) h = g - d(l) if (l2 .gt. n) go to 145 ! do 140 i = l2, n d(i) = d(i) - h 140 continue ! 145 f = f + h ! .......... ql transformation .......... p = d(m) c = 1.0d0 c2 = c el1 = e(l1) s = 0.0d0 mml = m - l ! .......... for i=m-1 step -1 until l do -- .......... do 200 ii = 1, mml c3 = c2 c2 = c s2 = s i = m - ii g = c * e(i) h = c * p r = mli_pythag(p,e(i)) e(i+1) = s * r s = e(i) / r c = p / r p = c * d(i) - s * g d(i+1) = h + s * (c * g + s * d(i)) 200 continue ! p = -s * s2 * c3 * el1 * e(l) / dl1 e(l) = s * p d(l) = c * p tst2 = tst1 + dabs(e(l)) if (tst2 .gt. tst1) go to 130 210 p = d(l) + f ! .......... order eigenvalues .......... if (l .eq. 1) go to 250 ! .......... for i=l step -1 until 2 do -- .......... do 230 ii = 2, l i = l + 2 - ii if (p .ge. d(i-1)) go to 270 d(i) = d(i-1) 230 continue ! 250 i = 1 270 d(i) = p 290 continue ! go to 1001 ! .......... set error -- no convergence to an ! eigenvalue after 30 iterations .......... 1000 ierr = l 1001 return end ! ********************************************************************** ! ! this subroutine is a translation of the algol procedure tql2, ! num. math. 11, 293-306(1968) by bowdler, martin, reinsch, and ! wilkinson. ! handbook for auto. comp., vol.ii-linear algebra, 227-240(1971). ! ! this subroutine finds the eigenvalues and eigenvectors ! of a symmetric tridiagonal matrix by the ql method. ! the eigenvectors of a full symmetric matrix can also ! be found if tred2 has been used to reduce this ! full matrix to tridiagonal form. ! ! on input ! ! nm must be set to the row dimension of two-dimensional ! array parameters as declared in the calling program ! dimension statement. ! ! n is the order of the matrix. ! ! d contains the diagonal elements of the input matrix. ! ! e contains the subdiagonal elements of the input matrix ! in its last n-1 positions. e(1) is arbitrary. ! ! z contains the transformation matrix produced in the ! reduction by tred2, if performed. if the eigenvectors ! of the tridiagonal matrix are desired, z must contain ! the identity matrix. ! ! on output ! ! d contains the eigenvalues in ascending order. if an ! error exit is made, the eigenvalues are correct but ! unordered for indices 1,2,...,ierr-1. ! ! e has been destroyed. ! ! z contains orthonormal eigenvectors of the symmetric ! tridiagonal (or full) matrix. if an error exit is made, ! z contains the eigenvectors associated with the stored ! eigenvalues. ! ! ierr is set to ! zero for normal return, ! j if the j-th eigenvalue has not been ! determined after 30 iterations. ! ! calls pythag for dsqrt(a*a + b*b) . ! ! questions and comments should be directed to burton s. garbow, ! mathematics and computer science div, argonne national laboratory ! ! this version dated august 1983. ! ! ---------------------------------------------------------------------- ! subroutine mli_tql2(nm,n,d,e,z,ierr) integer i,j,k,l,m,n,ii,l1,l2,nm,mml,ierr double precision mli_dsign double precision d(n),e(n),z(nm,n) double precision c,c2,c3,dl1,el1,f,g,h,p,r,s,s2,tst1,tst2 double precision mli_pythag ! ierr = 0 if (n .eq. 1) go to 1001 ! do 100 i = 2, n e(i-1) = e(i) 100 continue ! f = 0.0d0 tst1 = 0.0d0 e(n) = 0.0d0 ! do 240 l = 1, n j = 0 h = dabs(d(l)) + dabs(e(l)) if (tst1 .lt. h) tst1 = h ! .......... look for small sub-diagonal element .......... do 110 m = l, n tst2 = tst1 + dabs(e(m)) if (tst2 .eq. tst1) go to 120 ! .......... e(n) is always zero, so there is no exit ! through the bottom of the loop .......... 110 continue ! 120 if (m .eq. l) go to 220 130 if (j .eq. 30) go to 1000 j = j + 1 ! .......... form shift .......... l1 = l + 1 l2 = l1 + 1 g = d(l) p = (d(l1) - g) / (2.0d0 * e(l)) r = mli_pythag(p,1.0d0) if (p . ge. 0.e0) then mli_dsign = dabs(r) end if if (p .lt. 0.e0) then mli_dsign = -dabs(r) end if d(l) = e(l) / (p + mli_dsign) d(l1) = e(l) * (p + mli_dsign) dl1 = d(l1) h = g - d(l) if (l2 .gt. n) go to 145 ! do 140 i = l2, n d(i) = d(i) - h 140 continue ! 145 f = f + h ! .......... ql transformation .......... p = d(m) c = 1.0d0 c2 = c el1 = e(l1) s = 0.0d0 mml = m - l ! .......... for i=m-1 step -1 until l do -- .......... do 200 ii = 1, mml c3 = c2 c2 = c s2 = s i = m - ii g = c * e(i) h = c * p r = mli_pythag(p,e(i)) e(i+1) = s * r s = e(i) / r c = p / r p = c * d(i) - s * g d(i+1) = h + s * (c * g + s * d(i)) ! .......... form vector .......... do 180 k = 1, n h = z(k,i+1) z(k,i+1) = s * z(k,i) + c * h z(k,i) = c * z(k,i) - s * h 180 continue ! 200 continue ! p = -s * s2 * c3 * el1 * e(l) / dl1 e(l) = s * p d(l) = c * p tst2 = tst1 + dabs(e(l)) if (tst2 .gt. tst1) go to 130 220 d(l) = d(l) + f 240 continue ! .......... order eigenvalues and eigenvectors .......... do 300 ii = 2, n i = ii - 1 k = i p = d(i) ! do 260 j = ii, n if (d(j) .ge. p) go to 260 k = j p = d(j) 260 continue ! if (k .eq. i) go to 300 d(k) = d(i) d(i) = p ! do 280 j = 1, n p = z(j,i) z(j,i) = z(j,k) z(j,k) = p 280 continue ! 300 continue ! go to 1001 ! .......... set error -- no convergence to an ! eigenvalue after 30 iterations .......... 1000 ierr = l 1001 return end ! ********************************************************************** ! ! this subroutine is a translation of the algol procedure tred1, ! num. math. 11, 181-195(1968) by martin, reinsch, and wilkinson. ! handbook for auto. comp., vol.ii-linear algebra, 212-226(1971). ! ! this subroutine reduces a real symmetric matrix ! to a symmetric tridiagonal matrix using ! orthogonal similarity transformations. ! ! on input ! ! nm must be set to the row dimension of two-dimensional ! array parameters as declared in the calling program ! dimension statement. ! ! n is the order of the matrix. ! ! a contains the real symmetric input matrix. only the ! lower triangle of the matrix need be supplied. ! ! on output ! ! a contains information about the orthogonal trans- ! formations used in the reduction in its strict lower ! triangle. the full upper triangle of a is unaltered. ! ! d contains the diagonal elements of the tridiagonal matrix. ! ! e contains the subdiagonal elements of the tridiagonal ! matrix in its last n-1 positions. e(1) is set to zero. ! ! e2 contains the squares of the corresponding elements of e. ! e2 may coincide with e if the squares are not needed. ! ! questions and comments should be directed to burton s. garbow, ! mathematics and computer science div, argonne national laboratory ! ! this version dated august 1983. ! ! ---------------------------------------------------------------------- ! subroutine mli_tred1(nm,n,a,d,e,e2) integer i,j,k,l,n,ii,nm,jp1 double precision mli_dsign double precision a(nm,n),d(n),e(n),e2(n) double precision f,g,h,scale ! do 100 i = 1, n d(i) = a(n,i) a(n,i) = a(i,i) 100 continue ! .......... for i=n step -1 until 1 do -- .......... do 300 ii = 1, n i = n + 1 - ii l = i - 1 h = 0.0d0 scale = 0.0d0 if (l .lt. 1) go to 130 ! .......... scale row (algol tol then not needed) .......... do 120 k = 1, l scale = scale + dabs(d(k)) 120 continue ! if (scale .ne. 0.0d0) go to 140 ! do 125 j = 1, l d(j) = a(l,j) a(l,j) = a(i,j) a(i,j) = 0.0d0 125 continue ! 130 e(i) = 0.0d0 e2(i) = 0.0d0 go to 300 ! 140 do 150 k = 1, l d(k) = d(k) / scale h = h + d(k) * d(k) 150 continue ! e2(i) = scale * scale * h f = d(l) if (f . ge. 0.e0) then mli_dsign = dsqrt(h) end if if (f .lt. 0.e0) then mli_dsign = -dsqrt(h) end if g = -mli_dsign e(i) = scale * g h = h - f * g d(l) = f - g if (l .eq. 1) go to 285 ! .......... form a*u .......... do 170 j = 1, l e(j) = 0.0d0 170 continue ! do 240 j = 1, l f = d(j) g = e(j) + a(j,j) * f jp1 = j + 1 if (l .lt. jp1) go to 220 ! do 200 k = jp1, l g = g + a(k,j) * d(k) e(k) = e(k) + a(k,j) * f 200 continue ! 220 e(j) = g 240 continue ! .......... form p .......... f = 0.0d0 ! do 245 j = 1, l e(j) = e(j) / h f = f + e(j) * d(j) 245 continue ! h = f / (h + h) ! .......... form q .......... do 250 j = 1, l e(j) = e(j) - h * d(j) 250 continue ! .......... form reduced a .......... do 280 j = 1, l f = d(j) g = e(j) ! do 260 k = j, l a(k,j) = a(k,j) - f * e(k) - g * d(k) 260 continue ! 280 continue ! 285 do 290 j = 1, l f = d(j) d(j) = a(l,j) a(l,j) = a(i,j) a(i,j) = f * scale 290 continue ! 300 continue ! return end ! ********************************************************************** ! ! this subroutine is a translation of the algol procedure tred2, ! num. math. 11, 181-195(1968) by martin, reinsch, and wilkinson. ! handbook for auto. comp., vol.ii-linear algebra, 212-226(1971). ! ! this subroutine reduces a real symmetric matrix to a ! symmetric tridiagonal matrix using and accumulating ! orthogonal similarity transformations. ! ! on input ! ! nm must be set to the row dimension of two-dimensional ! array parameters as declared in the calling program ! dimension statement. ! ! n is the order of the matrix. ! ! a contains the real symmetric input matrix. only the ! lower triangle of the matrix need be supplied. ! ! on output ! ! d contains the diagonal elements of the tridiagonal matrix. ! ! e contains the subdiagonal elements of the tridiagonal ! matrix in its last n-1 positions. e(1) is set to zero. ! ! z contains the orthogonal transformation matrix ! produced in the reduction. ! ! a and z may coincide. if distinct, a is unaltered. ! ! questions and comments should be directed to burton s. garbow, ! mathematics and computer science div, argonne national laboratory ! ! this version dated august 1983. ! ! ---------------------------------------------------------------------- ! subroutine mli_tred2(nm,n,a,d,e,z) integer i,j,k,l,n,ii,nm,jp1 double precision mli_dsign double precision a(nm,n),d(n),e(n),z(nm,n) double precision f,g,h,hh,scale do 100 i = 1, n ! do 80 j = i, n z(j,i) = a(j,i) 80 continue ! d(i) = a(n,i) 100 continue ! if (n .eq. 1) go to 510 ! .......... for i=n step -1 until 2 do -- .......... do 300 ii = 2, n i = n + 2 - ii l = i - 1 h = 0.0d0 scale = 0.0d0 if (l .lt. 2) go to 130 ! .......... scale row (algol tol then not needed) .......... do 120 k = 1, l scale = scale + dabs(d(k)) 120 continue ! if (scale .ne. 0.0d0) go to 140 130 e(i) = d(l) ! do 135 j = 1, l d(j) = z(l,j) z(i,j) = 0.0d0 z(j,i) = 0.0d0 135 continue ! go to 290 ! 140 do 150 k = 1, l d(k) = d(k) / scale h = h + d(k) * d(k) 150 continue ! f = d(l) if (f . ge. 0.e0) then mli_dsign = dsqrt(h) end if if (f .lt. 0.e0) then mli_dsign = -dsqrt(h) end if g = -mli_dsign e(i) = scale * g h = h - f * g d(l) = f - g ! .......... form a*u .......... do 170 j = 1, l e(j) = 0.0d0 170 continue ! do 240 j = 1, l f = d(j) z(j,i) = f g = e(j) + z(j,j) * f jp1 = j + 1 if (l .lt. jp1) go to 220 ! do 200 k = jp1, l g = g + z(k,j) * d(k) e(k) = e(k) + z(k,j) * f 200 continue ! 220 e(j) = g 240 continue ! .......... form p .......... f = 0.0d0 ! do 245 j = 1, l e(j) = e(j) / h f = f + e(j) * d(j) 245 continue ! hh = f / (h + h) ! .......... form q .......... do 250 j = 1, l e(j) = e(j) - hh * d(j) 250 continue ! .......... form reduced a .......... do 280 j = 1, l f = d(j) g = e(j) ! do 260 k = j, l z(k,j) = z(k,j) - f * e(k) - g * d(k) 260 continue ! d(j) = z(l,j) z(i,j) = 0.0d0 280 continue ! 290 d(i) = h 300 continue ! .......... accumulation of transformation matrices .......... do 500 i = 2, n l = i - 1 z(n,l) = z(l,l) z(l,l) = 1.0d0 h = d(i) if (h .eq. 0.0d0) go to 380 ! do 330 k = 1, l d(k) = z(k,i) / h 330 continue ! do 360 j = 1, l g = 0.0d0 ! do 340 k = 1, l g = g + z(k,i) * z(k,j) 340 continue ! do 370 k = 1, l z(k,j) = z(k,j) - g * d(k) 370 continue 360 continue ! 380 do 400 k = 1, l z(k,i) = 0.0d0 400 continue ! 500 continue ! 510 do 520 i = 1, n d(i) = z(n,i) z(n,i) = 0.0d0 520 continue ! z(n,n) = 1.0d0 e(1) = 0.0d0 return end ! ********************************************************************** ! finds dsqrt(a**2+b**2) without overflow or destructive underflow ! ---------------------------------------------------------------------- ! double precision function mli_pythag(a,b) double precision a,b ! double precision p,r,s,t,u p = dmax1(dabs(a),dabs(b)) if (p .eq. 0.0d0) go to 20 r = (dmin1(dabs(a),dabs(b))/p)**2 10 continue t = 4.0d0 + r if (t .eq. 4.0d0) go to 20 s = r/t u = 1.0d0 + 2.0d0*s p = u*p r = (s/u)**2 * r go to 10 20 mli_pythag = p return end ! ********************************************************************** double precision function mli_dsign(a,b) double precision a,b if (b .ge. 0.e0) then mli_dsign = dabs(a) return endif if (b .lt. 0.e0) then mli_dsign =-dabs(a) return endif end hypre-2.33.0/src/FEI_mv/femli/mli_vector.cxx000066400000000000000000000132471477326011500206220ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include #include #include #include #include "HYPRE.h" #include "mli_vector.h" #include "HYPRE_IJ_mv.h" #include "_hypre_parcsr_mv.h" #include "mli_utils.h" /****************************************************************************** * constructor *---------------------------------------------------------------------------*/ MLI_Vector::MLI_Vector( void *invec,const char *inName, MLI_Function *funcPtr ) { strncpy(name_, inName, 100); vector_ = invec; if ( funcPtr != NULL ) destroyFunc_ = (int (*)(void*)) funcPtr->func_; else destroyFunc_ = NULL; } /****************************************************************************** * destructor *---------------------------------------------------------------------------*/ MLI_Vector::~MLI_Vector() { if (vector_ != NULL && destroyFunc_ != NULL) destroyFunc_((void*) vector_); vector_ = NULL; destroyFunc_ = NULL; } /****************************************************************************** * get name of the vector *---------------------------------------------------------------------------*/ char *MLI_Vector::getName() { return name_; } /****************************************************************************** * get vector *---------------------------------------------------------------------------*/ void *MLI_Vector::getVector() { return (void *) vector_; } /****************************************************************************** * set vector to a constant *---------------------------------------------------------------------------*/ int MLI_Vector::setConstantValue(double value) { if ( strcmp( name_, "HYPRE_ParVector" ) ) { printf("MLI_Vector::setConstantValue ERROR - type not HYPRE_ParVector\n"); exit(1); } hypre_ParVector *vec = (hypre_ParVector *) vector_; return (hypre_ParVectorSetConstantValues( vec, value )); } /****************************************************************************** * inner product *---------------------------------------------------------------------------*/ int MLI_Vector::copy(MLI_Vector *vec2) { if ( strcmp( name_, "HYPRE_ParVector" ) ) { printf("MLI_Vector::copy ERROR - invalid type (from).\n"); exit(1); } if ( strcmp( vec2->getName(), "HYPRE_ParVector" ) ) { printf("MLI_Vector::copy ERROR - invalid type (to).\n"); exit(1); } hypre_ParVector *hypreV1 = (hypre_ParVector *) vector_; hypre_ParVector *hypreV2 = (hypre_ParVector *) vec2->getVector(); hypre_ParVectorCopy( hypreV1, hypreV2 ); return 0; } /****************************************************************************** * print to a file *---------------------------------------------------------------------------*/ int MLI_Vector::print(char *filename) { if ( strcmp( name_, "HYPRE_ParVector" ) ) { printf("MLI_Vector::innerProduct ERROR - invalid type.\n"); exit(1); } if ( filename == NULL ) return 1; hypre_ParVector *vec = (hypre_ParVector *) vector_; hypre_ParVectorPrint( vec, filename ); return 0; } /****************************************************************************** * inner product *---------------------------------------------------------------------------*/ double MLI_Vector::norm2() { if ( strcmp( name_, "HYPRE_ParVector" ) ) { printf("MLI_Vector::innerProduct ERROR - invalid type.\n"); exit(1); } hypre_ParVector *vec = (hypre_ParVector *) vector_; return (sqrt(hypre_ParVectorInnerProd( vec, vec ))); } /****************************************************************************** * clone a hypre vector *---------------------------------------------------------------------------*/ MLI_Vector *MLI_Vector::clone() { char paramString[100]; MPI_Comm comm; hypre_ParVector *newVec; hypre_Vector *seqVec; int i, nlocals, globalSize, *vpartition, *partitioning; int mypid, nprocs; double *darray; MLI_Function *funcPtr; if ( strcmp( name_, "HYPRE_ParVector" ) ) { printf("MLI_Vector::clone ERROR - invalid type.\n"); exit(1); } hypre_ParVector *vec = (hypre_ParVector *) vector_; comm = hypre_ParVectorComm(vec); MPI_Comm_rank(comm,&mypid); MPI_Comm_size(comm,&nprocs); vpartition = hypre_ParVectorPartitioning(vec); partitioning = hypre_CTAlloc(int,nprocs+1, HYPRE_MEMORY_HOST); for ( i = 0; i < nprocs+1; i++ ) partitioning[i] = vpartition[i]; globalSize = hypre_ParVectorGlobalSize(vec); newVec = hypre_CTAlloc(hypre_ParVector, 1, HYPRE_MEMORY_HOST); hypre_ParVectorComm(newVec) = comm; hypre_ParVectorGlobalSize(newVec) = globalSize; hypre_ParVectorFirstIndex(newVec) = partitioning[mypid]; hypre_ParVectorPartitioning(newVec) = partitioning; hypre_ParVectorOwnsData(newVec) = 1; nlocals = partitioning[mypid+1] - partitioning[mypid]; seqVec = hypre_SeqVectorCreate(nlocals); hypre_SeqVectorInitialize(seqVec); darray = hypre_VectorData(seqVec); for (i = 0; i < nlocals; i++) darray[i] = 0.0; hypre_ParVectorLocalVector(newVec) = seqVec; sprintf(paramString,"HYPRE_ParVector"); funcPtr = new MLI_Function(); MLI_Utils_HypreParVectorGetDestroyFunc(funcPtr); MLI_Vector *mliVec = new MLI_Vector(newVec, paramString, funcPtr); delete funcPtr; return mliVec; } hypre-2.33.0/src/FEI_mv/femli/mli_vector.h000066400000000000000000000027561477326011500202520ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * Header info for the MLI_Vector data structure * *****************************************************************************/ #ifndef __MLIVECTOR_H__ #define __MLIVECTOR_H__ class MLI_Vector; class MLI_Matrix; /*-------------------------------------------------------------------------- * include files *--------------------------------------------------------------------------*/ #include "_hypre_utilities.h" #include "mli_matrix.h" #include "mli_utils.h" /*-------------------------------------------------------------------------- * MLI_Matrix data structure declaration *--------------------------------------------------------------------------*/ class MLI_Vector { char name_[100]; void *vector_; int (*destroyFunc_)(void*); public : MLI_Vector( void *inVec,const char *inName, MLI_Function *funcPtr ); ~MLI_Vector(); char *getName(); void *getVector(); int setConstantValue(double value); int copy(MLI_Vector *vec2); int print(char *filename); double norm2(); MLI_Vector *clone(); }; #endif hypre-2.33.0/src/HYPRE.h000066400000000000000000000024061477326011500145650ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * Header file for HYPRE library * *****************************************************************************/ #ifndef HYPRE_HEADER #define HYPRE_HEADER /*-------------------------------------------------------------------------- * Structures *--------------------------------------------------------------------------*/ /*-------------------------------------------------------------------------- * Constants *--------------------------------------------------------------------------*/ #define HYPRE_UNITIALIZED -999 #define HYPRE_PETSC_MAT_PARILUT_SOLVER 222 #define HYPRE_PARILUT 333 #define HYPRE_STRUCT 1111 #define HYPRE_SSTRUCT 3333 #define HYPRE_PARCSR 5555 #define HYPRE_ISIS 9911 #define HYPRE_PETSC 9933 #define HYPRE_PFMG 10 #define HYPRE_SMG 11 #define HYPRE_Jacobi 17 #endif hypre-2.33.0/src/HYPREf.h000066400000000000000000000033721477326011500147360ustar00rootroot00000000000000! Copyright (c) 1998 Lawrence Livermore National Security, LLC and other ! HYPRE Project Developers. See the top-level COPYRIGHT file for details. ! ! SPDX-License-Identifier: (Apache-2.0 OR MIT) ! -*- fortran -*- !****************************************************************************** ! ! Header file for HYPRE library ! ! **************************************************************************** ! -------------------------------------------------------------------------- ! Structures ! -------------------------------------------------------------------------- ! -------------------------------------------------------------------------- ! Constants ! -------------------------------------------------------------------------- integer HYPRE_UNITIALIZED parameter( HYPRE_UNITIALIZED = -999 ) integer HYPRE_PETSC_MAT_PARILUT_SOLVER parameter( HYPRE_PETSC_MAT_PARILUT_SOLVER = 222 ) integer HYPRE_PARILUT parameter( HYPRE_PARILUT = 333 ) integer HYPRE_STRUCT parameter( HYPRE_STRUCT = 1111 ) integer HYPRE_SSTRUCT parameter( HYPRE_SSTRUCT = 3333 ) integer HYPRE_PARCSR parameter( HYPRE_PARCSR = 5555 ) integer HYPRE_ISIS parameter( HYPRE_ISIS = 9911 ) integer HYPRE_PETSC parameter( HYPRE_PETSC = 9933 ) integer HYPRE_PFMG parameter( HYPRE_PFMG = 10 ) integer HYPRE_SMG parameter( HYPRE_SMG = 11 ) integer HYPRE_MEMORY_HOST parameter( HYPRE_MEMORY_HOST = 0 ) integer HYPRE_MEMORY_DEVICE parameter( HYPRE_MEMORY_DEVICE = 1 ) integer HYPRE_EXEC_HOST parameter( HYPRE_EXEC_HOST = 0 ) integer HYPRE_EXEC_DEVICE parameter( HYPRE_EXEC_DEVICE = 1 ) hypre-2.33.0/src/IJ_mv/000077500000000000000000000000001477326011500145275ustar00rootroot00000000000000hypre-2.33.0/src/IJ_mv/CMakeLists.txt000066400000000000000000000017411477326011500172720ustar00rootroot00000000000000# Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) set(HDRS aux_parcsr_matrix.h aux_par_vector.h HYPRE_IJ_mv.h _hypre_IJ_mv.h IJ_matrix.h IJ_vector.h ) set(SRCS aux_parcsr_matrix.c aux_par_vector.c F90_HYPRE_IJMatrix.c F90_HYPRE_IJVector.c F90_IJMatrix.c HYPRE_IJMatrix.c HYPRE_IJVector.c IJ_assumed_part.c IJMatrix.c IJMatrix_parcsr.c IJVector.c IJVector_parcsr.c IJMatrix_parcsr_device.c IJVector_parcsr_device.c ) target_sources(${PROJECT_NAME} PRIVATE ${SRCS} ${HDRS} ) if (HYPRE_USING_GPU) set(GPU_SRCS IJMatrix_parcsr_device.c IJVector_parcsr_device.c ) convert_filenames_to_full_paths(GPU_SRCS) set(HYPRE_GPU_SOURCES ${HYPRE_GPU_SOURCES} ${GPU_SRCS} PARENT_SCOPE) endif () convert_filenames_to_full_paths(HDRS) set(HYPRE_HEADERS ${HYPRE_HEADERS} ${HDRS} PARENT_SCOPE) hypre-2.33.0/src/IJ_mv/F90_HYPRE_IJMatrix.c000066400000000000000000000311001477326011500177420ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * HYPRE_IJMatrix Fortran interface * *****************************************************************************/ #include "./_hypre_IJ_mv.h" #include "fortran.h" #ifdef __cplusplus extern "C" { #endif /*-------------------------------------------------------------------------- * HYPRE_IJMatrixCreate *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_ijmatrixcreate, HYPRE_IJMATRIXCREATE) ( hypre_F90_Comm *comm, hypre_F90_BigInt *ilower, hypre_F90_BigInt *iupper, hypre_F90_BigInt *jlower, hypre_F90_BigInt *jupper, hypre_F90_Obj *matrix, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_IJMatrixCreate( hypre_F90_PassComm (comm), hypre_F90_PassBigInt (ilower), hypre_F90_PassBigInt (iupper), hypre_F90_PassBigInt (jlower), hypre_F90_PassBigInt (jupper), hypre_F90_PassObjRef (HYPRE_IJMatrix, matrix) ) ); } /*-------------------------------------------------------------------------- * HYPRE_IJMatrixDestroy *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_ijmatrixdestroy, HYPRE_IJMATRIXDESTROY) ( hypre_F90_Obj *matrix, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_IJMatrixDestroy( hypre_F90_PassObj (HYPRE_IJMatrix, matrix) ) ); } /*-------------------------------------------------------------------------- * HYPRE_IJMatrixInitialize *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_ijmatrixinitialize, HYPRE_IJMATRIXINITIALIZE) ( hypre_F90_Obj *matrix, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_IJMatrixInitialize( hypre_F90_PassObj (HYPRE_IJMatrix, matrix) ) ); } /*-------------------------------------------------------------------------- * HYPRE_IJMatrixInitialize_v2 *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_ijmatrixinitialize_v2, HYPRE_IJMATRIXINITIALIZE_V2) ( hypre_F90_Obj *matrix, hypre_F90_Int *memory_location, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_IJMatrixInitialize_v2( hypre_F90_PassObj (HYPRE_IJMatrix, matrix), hypre_F90_PassObj (HYPRE_MemoryLocation, memory_location) ) ); } /*-------------------------------------------------------------------------- * HYPRE_IJMatrixMigrate *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_ijmatrixmigrate, HYPRE_IJMATRIXMIGRATE) ( hypre_F90_Obj *matrix, hypre_F90_Int *memory_location, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_IJMatrixMigrate( hypre_F90_PassObj (HYPRE_IJMatrix, matrix), hypre_F90_PassObj (HYPRE_MemoryLocation, memory_location) ) ); } /*-------------------------------------------------------------------------- * HYPRE_IJMatrixSetValues *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_ijmatrixsetvalues, HYPRE_IJMATRIXSETVALUES) ( hypre_F90_Obj *matrix, hypre_F90_Int *nrows, hypre_F90_IntArray *ncols, hypre_F90_BigIntArray *rows, hypre_F90_BigIntArray *cols, hypre_F90_ComplexArray *values, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_IJMatrixSetValues( hypre_F90_PassObj (HYPRE_IJMatrix, matrix), hypre_F90_PassInt (nrows), hypre_F90_PassIntArray (ncols), hypre_F90_PassBigIntArray (rows), hypre_F90_PassBigIntArray (cols), hypre_F90_PassComplexArray (values) ) ); } /*-------------------------------------------------------------------------- * HYPRE_IJMatrixSetConstantValues *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_ijmatrixsetconstantvalues, HYPRE_IJMATRIXSETCONSTANTVALUES) ( hypre_F90_Obj *matrix, hypre_F90_Complex *value, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_IJMatrixSetConstantValues( hypre_F90_PassObj (HYPRE_IJMatrix, matrix), hypre_F90_PassComplex (value) ) ); } /*-------------------------------------------------------------------------- * HYPRE_IJMatrixAddToValues *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_ijmatrixaddtovalues, HYPRE_IJMATRIXADDTOVALUES) ( hypre_F90_Obj *matrix, hypre_F90_Int *nrows, hypre_F90_IntArray *ncols, hypre_F90_BigIntArray *rows, hypre_F90_BigIntArray *cols, hypre_F90_ComplexArray *values, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_IJMatrixAddToValues( hypre_F90_PassObj (HYPRE_IJMatrix, matrix), hypre_F90_PassInt (nrows), hypre_F90_PassIntArray (ncols), hypre_F90_PassBigIntArray (rows), hypre_F90_PassBigIntArray (cols), hypre_F90_PassComplexArray (values) ) ); } /*-------------------------------------------------------------------------- * HYPRE_IJMatrixAssemble *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_ijmatrixassemble, HYPRE_IJMATRIXASSEMBLE) ( hypre_F90_Obj *matrix, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_IJMatrixAssemble( hypre_F90_PassObj (HYPRE_IJMatrix, matrix) ) ); } /*-------------------------------------------------------------------------- * HYPRE_IJMatrixGetRowCounts *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_ijmatrixgetrowcounts, HYPRE_IJMATRIXGETROWCOUNTS) ( hypre_F90_Obj *matrix, hypre_F90_Int *nrows, hypre_F90_BigIntArray *rows, hypre_F90_IntArray *ncols, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_IJMatrixGetRowCounts( hypre_F90_PassObj (HYPRE_IJMatrix, matrix), hypre_F90_PassInt (nrows), hypre_F90_PassBigIntArray (rows), hypre_F90_PassIntArray (ncols) ) ); } /*-------------------------------------------------------------------------- * HYPRE_IJMatrixGetValues *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_ijmatrixgetvalues, HYPRE_IJMATRIXGETVALUES) ( hypre_F90_Obj *matrix, hypre_F90_Int *nrows, hypre_F90_IntArray *ncols, hypre_F90_BigIntArray *rows, hypre_F90_BigIntArray *cols, hypre_F90_ComplexArray *values, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_IJMatrixGetValues( hypre_F90_PassObj (HYPRE_IJMatrix, matrix), hypre_F90_PassInt (nrows), hypre_F90_PassIntArray (ncols), hypre_F90_PassBigIntArray (rows), hypre_F90_PassBigIntArray (cols), hypre_F90_PassComplexArray (values) ) ); } /*-------------------------------------------------------------------------- * HYPRE_IJMatrixSetObjectType *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_ijmatrixsetobjecttype, HYPRE_IJMATRIXSETOBJECTTYPE) ( hypre_F90_Obj *matrix, hypre_F90_Int *type, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_IJMatrixSetObjectType( hypre_F90_PassObj (HYPRE_IJMatrix, matrix), hypre_F90_PassInt (type) ) ); } /*-------------------------------------------------------------------------- * HYPRE_IJMatrixGetObjectType *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_ijmatrixgetobjecttype, HYPRE_IJMATRIXGETOBJECTTYPE) ( hypre_F90_Obj *matrix, hypre_F90_Int *type, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_IJMatrixGetObjectType( hypre_F90_PassObj (HYPRE_IJMatrix, matrix), hypre_F90_PassIntRef (type) ) ); } /*-------------------------------------------------------------------------- * HYPRE_IJMatrixGetLocalRange *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_ijmatrixgetlocalrange, HYPRE_IJMATRIXGETLOCALRANGE) ( hypre_F90_Obj *matrix, hypre_F90_BigInt *ilower, hypre_F90_BigInt *iupper, hypre_F90_BigInt *jlower, hypre_F90_BigInt *jupper, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_IJMatrixGetLocalRange( hypre_F90_PassObj (HYPRE_IJMatrix, matrix), hypre_F90_PassBigIntRef (ilower), hypre_F90_PassBigIntRef (iupper), hypre_F90_PassBigIntRef (jlower), hypre_F90_PassBigIntRef (jupper) ) ); } /*-------------------------------------------------------------------------- * HYPRE_IJMatrixGetObject *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_ijmatrixgetobject, HYPRE_IJMATRIXGETOBJECT) ( hypre_F90_Obj *matrix, hypre_F90_Obj *object, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_IJMatrixGetObject( hypre_F90_PassObj (HYPRE_IJMatrix, matrix), (void **) object ) ); } /*-------------------------------------------------------------------------- * HYPRE_IJMatrixSetRowSizes *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_ijmatrixsetrowsizes, HYPRE_IJMATRIXSETROWSIZES) ( hypre_F90_Obj *matrix, hypre_F90_IntArray *sizes, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_IJMatrixSetRowSizes( hypre_F90_PassObj (HYPRE_IJMatrix, matrix), hypre_F90_PassIntArray (sizes) ) ); } /*-------------------------------------------------------------------------- * HYPRE_IJMatrixSetDiagOffdSizes *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_ijmatrixsetdiagoffdsizes, HYPRE_IJMATRIXSETDIAGOFFDSIZES) ( hypre_F90_Obj *matrix, hypre_F90_IntArray *diag_sizes, hypre_F90_IntArray *offd_sizes, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_IJMatrixSetDiagOffdSizes( hypre_F90_PassObj (HYPRE_IJMatrix, matrix), hypre_F90_PassIntArray (diag_sizes), hypre_F90_PassIntArray (offd_sizes) ) ); } /*-------------------------------------------------------------------------- * HYPRE_IJMatrixSetMaxOffProcElmts *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_ijmatrixsetmaxoffprocelmt, HYPRE_IJMATRIXSETMAXOFFPROCELMT) ( hypre_F90_Obj *matrix, hypre_F90_Int *max_off_proc_elmts, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_IJMatrixSetMaxOffProcElmts( hypre_F90_PassObj (HYPRE_IJMatrix, matrix), hypre_F90_PassInt (max_off_proc_elmts) ) ); } /*-------------------------------------------------------------------------- * HYPRE_IJMatrixRead *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_ijmatrixread, HYPRE_IJMATRIXREAD) ( char *filename, hypre_F90_Comm *comm, hypre_F90_Int *object_type, hypre_F90_Obj *matrix, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_IJMatrixRead( (char *) filename, hypre_F90_PassComm (comm), hypre_F90_PassInt (object_type), hypre_F90_PassObjRef (HYPRE_IJMatrix, matrix) ) ); } /*-------------------------------------------------------------------------- * HYPRE_IJMatrixPrint *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_ijmatrixprint, HYPRE_IJMATRIXPRINT) ( hypre_F90_Obj *matrix, char *filename, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_IJMatrixPrint( hypre_F90_PassObj (HYPRE_IJMatrix, matrix), (char *) filename ) ); } #ifdef __cplusplus } #endif hypre-2.33.0/src/IJ_mv/F90_HYPRE_IJVector.c000066400000000000000000000230041477326011500177440ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * HYPRE_IJMatrix Fortran interface * *****************************************************************************/ #include "./_hypre_IJ_mv.h" #include "fortran.h" #ifdef __cplusplus extern "C" { #endif /*-------------------------------------------------------------------------- * HYPRE_IJVectorCreate *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_ijvectorcreate, HYPRE_IJVECTORCREATE) ( hypre_F90_Comm *comm, hypre_F90_BigInt *jlower, hypre_F90_BigInt *jupper, hypre_F90_Obj *vector, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_IJVectorCreate( hypre_F90_PassComm (comm), hypre_F90_PassBigInt (jlower), hypre_F90_PassBigInt (jupper), hypre_F90_PassObjRef (HYPRE_IJVector, vector) ) ); } /*-------------------------------------------------------------------------- * HYPRE_IJVectorDestroy *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_ijvectordestroy, HYPRE_IJVECTORDESTROY) ( hypre_F90_Obj *vector, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_IJVectorDestroy( hypre_F90_PassObj (HYPRE_IJVector, vector) ) ); } /*-------------------------------------------------------------------------- * HYPRE_IJVectorInitialize *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_ijvectorinitialize, HYPRE_IJVECTORINITIALIZE) ( hypre_F90_Obj *vector, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_IJVectorInitialize( hypre_F90_PassObj (HYPRE_IJVector, vector) ) ); } /*-------------------------------------------------------------------------- * HYPRE_IJVectorInitialize_v2 *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_ijvectorinitialize_v2, HYPRE_IJVECTORINITIALIZE_V2) ( hypre_F90_Obj *vector, hypre_F90_Int *memory_location, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_IJVectorInitialize_v2( hypre_F90_PassObj (HYPRE_IJVector, vector), hypre_F90_PassObj (HYPRE_MemoryLocation, memory_location) ) ); } /*-------------------------------------------------------------------------- * HYPRE_IJVectorMigrate *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_ijvectormigrate, HYPRE_IJVECTORMIGRATE) ( hypre_F90_Obj *vector, hypre_F90_Int *memory_location, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_IJVectorMigrate( hypre_F90_PassObj (HYPRE_IJVector, vector), hypre_F90_PassObj (HYPRE_MemoryLocation, memory_location) ) ); } /*-------------------------------------------------------------------------- * HYPRE_IJVectorSetValues *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_ijvectorsetvalues, HYPRE_IJVECTORSETVALUES) ( hypre_F90_Obj *vector, hypre_F90_Int *num_values, hypre_F90_BigIntArray *indices, hypre_F90_ComplexArray *values, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_IJVectorSetValues( hypre_F90_PassObj (HYPRE_IJVector, vector), hypre_F90_PassInt (num_values), hypre_F90_PassBigIntArray (indices), hypre_F90_PassComplexArray (values) ) ); } /*-------------------------------------------------------------------------- * HYPRE_IJVectorAddToValues *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_ijvectoraddtovalues, HYPRE_IJVECTORADDTOVALUES) ( hypre_F90_Obj *vector, hypre_F90_Int *num_values, hypre_F90_BigIntArray *indices, hypre_F90_ComplexArray *values, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_IJVectorAddToValues( hypre_F90_PassObj (HYPRE_IJVector, vector), hypre_F90_PassInt (num_values), hypre_F90_PassBigIntArray (indices), hypre_F90_PassComplexArray (values) ) ); } /*-------------------------------------------------------------------------- * HYPRE_IJVectorAssemble *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_ijvectorassemble, HYPRE_IJVECTORASSEMBLE) ( hypre_F90_Obj *vector, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_IJVectorAssemble( hypre_F90_PassObj (HYPRE_IJVector, vector) ) ); } /*-------------------------------------------------------------------------- * HYPRE_IJVectorGetValues *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_ijvectorgetvalues, HYPRE_IJVECTORGETVALUES) ( hypre_F90_Obj *vector, hypre_F90_Int *num_values, hypre_F90_BigIntArray *indices, hypre_F90_ComplexArray *values, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_IJVectorGetValues( hypre_F90_PassObj (HYPRE_IJVector, vector), hypre_F90_PassInt (num_values), hypre_F90_PassBigIntArray (indices), hypre_F90_PassComplexArray (values) ) ); } /*-------------------------------------------------------------------------- * HYPRE_IJVectorSetMaxOffProcElmts *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_ijvectorsetmaxoffprocelmt, HYPRE_IJVECTORSETMAXOFFPROCELMT) ( hypre_F90_Obj *vector, hypre_F90_Int *max_off_proc_elmts, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_IJVectorSetMaxOffProcElmts( hypre_F90_PassObj (HYPRE_IJVector, vector), hypre_F90_PassInt (max_off_proc_elmts) ) ); } /*-------------------------------------------------------------------------- * HYPRE_IJVectorSetObjectType *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_ijvectorsetobjecttype, HYPRE_IJVECTORSETOBJECTTYPE) ( hypre_F90_Obj *vector, hypre_F90_Int *type, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_IJVectorSetObjectType( hypre_F90_PassObj (HYPRE_IJVector, vector), hypre_F90_PassInt (type) ) ); } /*-------------------------------------------------------------------------- * HYPRE_IJVectorGetObjectType *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_ijvectorgetobjecttype, HYPRE_IJVECTORGETOBJECTTYPE) ( hypre_F90_Obj *vector, hypre_F90_Int *type, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) (HYPRE_IJVectorGetObjectType( hypre_F90_PassObj (HYPRE_IJVector, vector), hypre_F90_PassIntRef (type) ) ); } /*-------------------------------------------------------------------------- * HYPRE_IJVectorGetLocalRange *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_ijvectorgetlocalrange, HYPRE_IJVECTORGETLOCALRANGE) ( hypre_F90_Obj *vector, hypre_F90_BigInt *jlower, hypre_F90_BigInt *jupper, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) (HYPRE_IJVectorGetLocalRange( hypre_F90_PassObj (HYPRE_IJVector, vector), hypre_F90_PassBigIntRef (jlower), hypre_F90_PassBigIntRef (jupper) ) ); } /*-------------------------------------------------------------------------- * HYPRE_IJVectorGetObject *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_ijvectorgetobject, HYPRE_IJVECTORGETOBJECT) ( hypre_F90_Obj *vector, hypre_F90_Obj *object, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) (HYPRE_IJVectorGetObject( hypre_F90_PassObj (HYPRE_IJVector, vector), (void **) object ) ); } /*-------------------------------------------------------------------------- * HYPRE_IJVectorRead *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_ijvectorread, HYPRE_IJVECTORREAD) ( char *filename, hypre_F90_Comm *comm, hypre_F90_Int *object_type, hypre_F90_Obj *vector, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) (HYPRE_IJVectorRead( (char *) filename, hypre_F90_PassComm (comm), hypre_F90_PassInt (object_type), hypre_F90_PassObjRef (HYPRE_IJVector, vector) ) ); } /*-------------------------------------------------------------------------- * HYPRE_IJVectorPrint *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_ijvectorprint, HYPRE_IJVECTORPRINT) ( hypre_F90_Obj *vector, char *filename, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) (HYPRE_IJVectorPrint( hypre_F90_PassObj (HYPRE_IJVector, vector), (char *) filename ) ); } #ifdef __cplusplus } #endif hypre-2.33.0/src/IJ_mv/F90_IJMatrix.c000066400000000000000000000022501477326011500167770ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * hypre_IJMatrix Fortran interface * *****************************************************************************/ #include "./_hypre_IJ_mv.h" #include "fortran.h" #ifdef __cplusplus extern "C" { #endif /*-------------------------------------------------------------------------- * hypre_IJMatrixSetObject *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_ijmatrixsetobject, HYPRE_IJMATRIXSETOBJECT) ( hypre_F90_Obj *matrix, hypre_F90_Obj *object, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( hypre_IJMatrixSetObject( hypre_F90_PassObj (HYPRE_IJMatrix, matrix), (void *) *object ) ); } #ifdef __cplusplus } #endif hypre-2.33.0/src/IJ_mv/HYPRE_IJMatrix.c000066400000000000000000001237211477326011500173370ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * HYPRE_IJMatrix interface * *****************************************************************************/ #include "./_hypre_IJ_mv.h" #include "../HYPRE.h" /*-------------------------------------------------------------------------- * HYPRE_IJMatrixCreate *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_IJMatrixCreate( MPI_Comm comm, HYPRE_BigInt ilower, HYPRE_BigInt iupper, HYPRE_BigInt jlower, HYPRE_BigInt jupper, HYPRE_IJMatrix *matrix ) { HYPRE_BigInt info[2]; HYPRE_Int num_procs; HYPRE_Int myid; hypre_IJMatrix *ijmatrix; HYPRE_BigInt row0, col0, rowN, colN; ijmatrix = hypre_CTAlloc(hypre_IJMatrix, 1, HYPRE_MEMORY_HOST); hypre_IJMatrixComm(ijmatrix) = comm; hypre_IJMatrixObject(ijmatrix) = NULL; hypre_IJMatrixTranslator(ijmatrix) = NULL; hypre_IJMatrixAssumedPart(ijmatrix) = NULL; hypre_IJMatrixObjectType(ijmatrix) = HYPRE_UNITIALIZED; hypre_IJMatrixAssembleFlag(ijmatrix) = 0; hypre_IJMatrixPrintLevel(ijmatrix) = 0; hypre_IJMatrixOMPFlag(ijmatrix) = 0; hypre_MPI_Comm_size(comm, &num_procs); hypre_MPI_Comm_rank(comm, &myid); if (ilower > iupper + 1 || ilower < 0) { hypre_error_in_arg(2); hypre_TFree(ijmatrix, HYPRE_MEMORY_HOST); return hypre_error_flag; } if (iupper < -1) { hypre_error_in_arg(3); hypre_TFree(ijmatrix, HYPRE_MEMORY_HOST); return hypre_error_flag; } if (jlower > jupper + 1 || jlower < 0) { hypre_error_in_arg(4); hypre_TFree(ijmatrix, HYPRE_MEMORY_HOST); return hypre_error_flag; } if (jupper < -1) { hypre_error_in_arg(5); hypre_TFree(ijmatrix, HYPRE_MEMORY_HOST); return hypre_error_flag; } hypre_IJMatrixRowPartitioning(ijmatrix)[0] = ilower; hypre_IJMatrixRowPartitioning(ijmatrix)[1] = iupper + 1; hypre_IJMatrixColPartitioning(ijmatrix)[0] = jlower; hypre_IJMatrixColPartitioning(ijmatrix)[1] = jupper + 1; /* now we need the global number of rows and columns as well as the global first row and column index */ /* proc 0 has the first row and col */ if (myid == 0) { info[0] = ilower; info[1] = jlower; } hypre_MPI_Bcast(info, 2, HYPRE_MPI_BIG_INT, 0, comm); row0 = info[0]; col0 = info[1]; /* proc (num_procs-1) has the last row and col */ if (myid == (num_procs - 1)) { info[0] = iupper; info[1] = jupper; } hypre_MPI_Bcast(info, 2, HYPRE_MPI_BIG_INT, num_procs - 1, comm); rowN = info[0]; colN = info[1]; hypre_IJMatrixGlobalFirstRow(ijmatrix) = row0; hypre_IJMatrixGlobalFirstCol(ijmatrix) = col0; hypre_IJMatrixGlobalNumRows(ijmatrix) = rowN - row0 + 1; hypre_IJMatrixGlobalNumCols(ijmatrix) = colN - col0 + 1; *matrix = (HYPRE_IJMatrix) ijmatrix; return hypre_error_flag; } /*-------------------------------------------------------------------------- * HYPRE_IJMatrixPartialClone * * Creates a new IJMatrix with data copied from an existing matrix except * for the members: * 1) hypre_IJMatrixObject * 2) hypre_IJMatrixTranslator * 3) hypre_IJMatrixAssumedPart *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_IJMatrixPartialClone( HYPRE_IJMatrix matrix_in, HYPRE_IJMatrix *matrix_out ) { hypre_IJMatrix *ijmatrix_in = (hypre_IJMatrix *) matrix_in; hypre_IJMatrix *ijmatrix_out; HYPRE_BigInt ilower; HYPRE_BigInt iupper; HYPRE_BigInt jlower; HYPRE_BigInt jupper; if (!ijmatrix_in) { hypre_error_in_arg(1); return hypre_error_flag; } HYPRE_IJMatrixGetLocalRange(ijmatrix_in, &ilower, &iupper, &jlower, &jupper); ijmatrix_out = hypre_CTAlloc(hypre_IJMatrix, 1, HYPRE_MEMORY_HOST); hypre_IJMatrixComm(ijmatrix_out) = hypre_IJMatrixComm(ijmatrix_in); hypre_IJMatrixObject(ijmatrix_out) = NULL; hypre_IJMatrixTranslator(ijmatrix_out) = NULL; hypre_IJMatrixAssumedPart(ijmatrix_out) = NULL; hypre_IJMatrixObjectType(ijmatrix_out) = hypre_IJMatrixObjectType(ijmatrix_in); hypre_IJMatrixAssembleFlag(ijmatrix_out) = 0; hypre_IJMatrixPrintLevel(ijmatrix_out) = hypre_IJMatrixPrintLevel(ijmatrix_in); hypre_IJMatrixOMPFlag(ijmatrix_out) = hypre_IJMatrixOMPFlag(ijmatrix_in); hypre_IJMatrixGlobalFirstRow(ijmatrix_out) = hypre_IJMatrixGlobalFirstRow(ijmatrix_in); hypre_IJMatrixGlobalFirstCol(ijmatrix_out) = hypre_IJMatrixGlobalFirstCol(ijmatrix_in); hypre_IJMatrixGlobalNumRows(ijmatrix_out) = hypre_IJMatrixGlobalNumRows(ijmatrix_in); hypre_IJMatrixGlobalNumCols(ijmatrix_out) = hypre_IJMatrixGlobalNumCols(ijmatrix_in); hypre_IJMatrixRowPartitioning(ijmatrix_out)[0] = ilower; hypre_IJMatrixRowPartitioning(ijmatrix_out)[1] = iupper + 1; hypre_IJMatrixColPartitioning(ijmatrix_out)[0] = jlower; hypre_IJMatrixColPartitioning(ijmatrix_out)[1] = jupper + 1; *matrix_out = (HYPRE_IJMatrix) ijmatrix_out; return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_IJMatrixDestroy( HYPRE_IJMatrix matrix ) { hypre_IJMatrix *ijmatrix = (hypre_IJMatrix *) matrix; if (!ijmatrix) { hypre_error_in_arg(1); return hypre_error_flag; } if (ijmatrix) { if hypre_IJMatrixAssumedPart(ijmatrix) { hypre_AssumedPartitionDestroy((hypre_IJAssumedPart*)hypre_IJMatrixAssumedPart(ijmatrix)); } if ( hypre_IJMatrixObjectType(ijmatrix) == HYPRE_PARCSR ) { hypre_IJMatrixDestroyParCSR( ijmatrix ); } else if ( hypre_IJMatrixObjectType(ijmatrix) != -1 ) { hypre_error_in_arg(1); return hypre_error_flag; } } hypre_TFree(ijmatrix, HYPRE_MEMORY_HOST); return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_IJMatrixInitialize( HYPRE_IJMatrix matrix ) { hypre_IJMatrix *ijmatrix = (hypre_IJMatrix *) matrix; if (!ijmatrix) { hypre_error_in_arg(1); return hypre_error_flag; } if ( hypre_IJMatrixObjectType(ijmatrix) == HYPRE_PARCSR ) { hypre_IJMatrixInitializeParCSR( ijmatrix ) ; } else { hypre_error_in_arg(1); } return hypre_error_flag; } HYPRE_Int HYPRE_IJMatrixInitialize_v2( HYPRE_IJMatrix matrix, HYPRE_MemoryLocation memory_location ) { hypre_IJMatrix *ijmatrix = (hypre_IJMatrix *) matrix; if (!ijmatrix) { hypre_error_in_arg(1); return hypre_error_flag; } if ( hypre_IJMatrixObjectType(ijmatrix) == HYPRE_PARCSR ) { hypre_IJMatrixInitializeParCSR_v2( ijmatrix, memory_location ) ; } else { hypre_error_in_arg(1); } return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_IJMatrixSetPrintLevel( HYPRE_IJMatrix matrix, HYPRE_Int print_level ) { hypre_IJMatrix *ijmatrix = (hypre_IJMatrix *) matrix; if (!ijmatrix) { hypre_error_in_arg(1); return hypre_error_flag; } hypre_IJMatrixPrintLevel(ijmatrix) = (print_level > 0) ? print_level : 0; return hypre_error_flag; } /*-------------------------------------------------------------------------- * This is a helper routine to compute a prefix sum of integer values. * * The current implementation is okay for modest numbers of threads. *--------------------------------------------------------------------------*/ HYPRE_Int hypre_PrefixSumInt(HYPRE_Int nvals, HYPRE_Int *vals, HYPRE_Int *sums) { HYPRE_Int j, nthreads, bsize; nthreads = hypre_NumThreads(); bsize = (nvals + nthreads - 1) / nthreads; /* This distributes the remainder */ if (nvals < nthreads || bsize == 1) { sums[0] = 0; for (j = 1; j < nvals; j++) { sums[j] += sums[j - 1] + vals[j - 1]; } } else { /* Compute preliminary partial sums (in parallel) within each interval */ #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(j) HYPRE_SMP_SCHEDULE #endif for (j = 0; j < nvals; j += bsize) { HYPRE_Int i, n = hypre_min((j + bsize), nvals); sums[j] = 0; for (i = j + 1; i < n; i++) { sums[i] = sums[i - 1] + vals[i - 1]; } } /* Compute final partial sums (in serial) for the first entry of every interval */ for (j = bsize; j < nvals; j += bsize) { sums[j] = sums[j - bsize] + sums[j - 1] + vals[j - 1]; } /* Compute final partial sums (in parallel) for the remaining entries */ #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(j) HYPRE_SMP_SCHEDULE #endif for (j = bsize; j < nvals; j += bsize) { HYPRE_Int i, n = hypre_min((j + bsize), nvals); for (i = j + 1; i < n; i++) { sums[i] += sums[j]; } } } return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_IJMatrixSetValues( HYPRE_IJMatrix matrix, HYPRE_Int nrows, HYPRE_Int *ncols, const HYPRE_BigInt *rows, const HYPRE_BigInt *cols, const HYPRE_Complex *values ) { hypre_IJMatrix *ijmatrix = (hypre_IJMatrix *) matrix; if (nrows == 0) { return hypre_error_flag; } if (!ijmatrix) { hypre_error_in_arg(1); return hypre_error_flag; } /* if (!ncols) { hypre_error_in_arg(3); return hypre_error_flag; } */ if (!rows) { hypre_error_in_arg(4); return hypre_error_flag; } if (!cols) { hypre_error_in_arg(5); return hypre_error_flag; } if (!values) { hypre_error_in_arg(6); return hypre_error_flag; } if ( hypre_IJMatrixObjectType(ijmatrix) != HYPRE_PARCSR ) { hypre_error_in_arg(1); return hypre_error_flag; } HYPRE_IJMatrixSetValues2(matrix, nrows, ncols, rows, NULL, cols, values); return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_IJMatrixSetValues2( HYPRE_IJMatrix matrix, HYPRE_Int nrows, HYPRE_Int *ncols, const HYPRE_BigInt *rows, const HYPRE_Int *row_indexes, const HYPRE_BigInt *cols, const HYPRE_Complex *values ) { hypre_IJMatrix *ijmatrix = (hypre_IJMatrix *) matrix; if (nrows == 0) { return hypre_error_flag; } if (!ijmatrix) { hypre_error_in_arg(1); return hypre_error_flag; } if (nrows < 0) { hypre_error_in_arg(2); return hypre_error_flag; } /* if (!ncols) { hypre_error_in_arg(3); return hypre_error_flag; } */ if (!rows) { hypre_error_in_arg(4); return hypre_error_flag; } if (!cols) { hypre_error_in_arg(6); return hypre_error_flag; } if (!values) { hypre_error_in_arg(7); return hypre_error_flag; } if ( hypre_IJMatrixObjectType(ijmatrix) != HYPRE_PARCSR ) { hypre_error_in_arg(1); return hypre_error_flag; } #if defined(HYPRE_USING_GPU) HYPRE_ExecutionPolicy exec = hypre_GetExecPolicy1( hypre_IJMatrixMemoryLocation(matrix) ); if (exec == HYPRE_EXEC_DEVICE) { hypre_IJMatrixSetAddValuesParCSRDevice(ijmatrix, nrows, ncols, rows, row_indexes, cols, values, "set"); } else #endif { HYPRE_Int *row_indexes_tmp = (HYPRE_Int *) row_indexes; HYPRE_Int *ncols_tmp = ncols; if (!ncols_tmp) { HYPRE_Int i; ncols_tmp = hypre_TAlloc(HYPRE_Int, nrows, HYPRE_MEMORY_HOST); for (i = 0; i < nrows; i++) { ncols_tmp[i] = 1; } } if (!row_indexes) { row_indexes_tmp = hypre_CTAlloc(HYPRE_Int, nrows, HYPRE_MEMORY_HOST); hypre_PrefixSumInt(nrows, ncols_tmp, row_indexes_tmp); } if (hypre_IJMatrixOMPFlag(ijmatrix)) { hypre_IJMatrixSetValuesOMPParCSR(ijmatrix, nrows, ncols_tmp, rows, row_indexes_tmp, cols, values); } else { hypre_IJMatrixSetValuesParCSR(ijmatrix, nrows, ncols_tmp, rows, row_indexes_tmp, cols, values); } if (!ncols) { hypre_TFree(ncols_tmp, HYPRE_MEMORY_HOST); } if (!row_indexes) { hypre_TFree(row_indexes_tmp, HYPRE_MEMORY_HOST); } } HYPRE_PRINT_MEMORY_USAGE(hypre_IJMatrixComm(ijmatrix)); return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_IJMatrixSetConstantValues( HYPRE_IJMatrix matrix, HYPRE_Complex value) { hypre_IJMatrix *ijmatrix = (hypre_IJMatrix *) matrix; if (!ijmatrix) { hypre_error_in_arg(1); return hypre_error_flag; } if ( hypre_IJMatrixObjectType(ijmatrix) == HYPRE_PARCSR ) { return ( hypre_IJMatrixSetConstantValuesParCSR( ijmatrix, value)); } else { hypre_error_in_arg(1); } return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_IJMatrixAddToValues( HYPRE_IJMatrix matrix, HYPRE_Int nrows, HYPRE_Int *ncols, const HYPRE_BigInt *rows, const HYPRE_BigInt *cols, const HYPRE_Complex *values ) { hypre_IJMatrix *ijmatrix = (hypre_IJMatrix *) matrix; if (nrows == 0) { return hypre_error_flag; } if (!ijmatrix) { hypre_error_in_arg(1); return hypre_error_flag; } if (nrows < 0) { hypre_error_in_arg(2); return hypre_error_flag; } /* if (!ncols) { hypre_error_in_arg(3); return hypre_error_flag; } */ if (!rows) { hypre_error_in_arg(4); return hypre_error_flag; } if (!cols) { hypre_error_in_arg(5); return hypre_error_flag; } if (!values) { hypre_error_in_arg(6); return hypre_error_flag; } if ( hypre_IJMatrixObjectType(ijmatrix) != HYPRE_PARCSR ) { hypre_error_in_arg(1); return hypre_error_flag; } HYPRE_IJMatrixAddToValues2(matrix, nrows, ncols, rows, NULL, cols, values); return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_IJMatrixAddToValues2( HYPRE_IJMatrix matrix, HYPRE_Int nrows, HYPRE_Int *ncols, const HYPRE_BigInt *rows, const HYPRE_Int *row_indexes, const HYPRE_BigInt *cols, const HYPRE_Complex *values ) { hypre_IJMatrix *ijmatrix = (hypre_IJMatrix *) matrix; if (nrows == 0) { return hypre_error_flag; } if (!ijmatrix) { hypre_error_in_arg(1); return hypre_error_flag; } if (nrows < 0) { hypre_error_in_arg(2); return hypre_error_flag; } /* if (!ncols) { hypre_error_in_arg(3); return hypre_error_flag; } */ if (!rows) { hypre_error_in_arg(4); return hypre_error_flag; } if (!cols) { hypre_error_in_arg(6); return hypre_error_flag; } if (!values) { hypre_error_in_arg(7); return hypre_error_flag; } if ( hypre_IJMatrixObjectType(ijmatrix) != HYPRE_PARCSR ) { hypre_error_in_arg(1); return hypre_error_flag; } #if defined(HYPRE_USING_GPU) HYPRE_ExecutionPolicy exec = hypre_GetExecPolicy1( hypre_IJMatrixMemoryLocation(matrix) ); if (exec == HYPRE_EXEC_DEVICE) { hypre_IJMatrixSetAddValuesParCSRDevice(ijmatrix, nrows, ncols, rows, row_indexes, cols, values, "add"); } else #endif { HYPRE_Int *row_indexes_tmp = (HYPRE_Int *) row_indexes; HYPRE_Int *ncols_tmp = ncols; if (!ncols_tmp) { HYPRE_Int i; ncols_tmp = hypre_TAlloc(HYPRE_Int, nrows, HYPRE_MEMORY_HOST); for (i = 0; i < nrows; i++) { ncols_tmp[i] = 1; } } if (!row_indexes) { row_indexes_tmp = hypre_CTAlloc(HYPRE_Int, nrows, HYPRE_MEMORY_HOST); hypre_PrefixSumInt(nrows, ncols_tmp, row_indexes_tmp); } if (hypre_IJMatrixOMPFlag(ijmatrix)) { hypre_IJMatrixAddToValuesOMPParCSR(ijmatrix, nrows, ncols_tmp, rows, row_indexes_tmp, cols, values); } else { hypre_IJMatrixAddToValuesParCSR(ijmatrix, nrows, ncols_tmp, rows, row_indexes_tmp, cols, values); } if (!ncols) { hypre_TFree(ncols_tmp, HYPRE_MEMORY_HOST); } if (!row_indexes) { hypre_TFree(row_indexes_tmp, HYPRE_MEMORY_HOST); } } HYPRE_PRINT_MEMORY_USAGE(hypre_IJMatrixComm(ijmatrix)); return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_IJMatrixAssemble( HYPRE_IJMatrix matrix ) { hypre_IJMatrix *ijmatrix = (hypre_IJMatrix *) matrix; if (!ijmatrix) { hypre_error_in_arg(1); return hypre_error_flag; } if (hypre_IJMatrixObjectType(ijmatrix) == HYPRE_PARCSR) { #if defined(HYPRE_USING_GPU) HYPRE_ExecutionPolicy exec = hypre_GetExecPolicy1(hypre_IJMatrixMemoryLocation(matrix)); if (exec == HYPRE_EXEC_DEVICE) { hypre_IJMatrixAssembleParCSRDevice(ijmatrix); } else #endif { hypre_IJMatrixAssembleParCSR(ijmatrix); } } else { hypre_error_in_arg(1); } HYPRE_PRINT_MEMORY_USAGE(hypre_IJMatrixComm(ijmatrix)); return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_IJMatrixGetRowCounts( HYPRE_IJMatrix matrix, HYPRE_Int nrows, HYPRE_BigInt *rows, HYPRE_Int *ncols ) { hypre_IJMatrix *ijmatrix = (hypre_IJMatrix *) matrix; if (nrows == 0) { return hypre_error_flag; } if (!ijmatrix) { hypre_error_in_arg(1); return hypre_error_flag; } if (nrows < 0) { hypre_error_in_arg(2); return hypre_error_flag; } if (!rows) { hypre_error_in_arg(3); return hypre_error_flag; } if (!ncols) { hypre_error_in_arg(4); return hypre_error_flag; } if ( hypre_IJMatrixObjectType(ijmatrix) == HYPRE_PARCSR ) { hypre_IJMatrixGetRowCountsParCSR( ijmatrix, nrows, rows, ncols ); } else { hypre_error_in_arg(1); } return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_IJMatrixGetValues( HYPRE_IJMatrix matrix, HYPRE_Int nrows, HYPRE_Int *ncols, HYPRE_BigInt *rows, HYPRE_BigInt *cols, HYPRE_Complex *values ) { hypre_IJMatrix *ijmatrix = (hypre_IJMatrix *) matrix; if (nrows == 0) { return hypre_error_flag; } if (!ijmatrix) { hypre_error_in_arg(1); return hypre_error_flag; } if (!ncols) { hypre_error_in_arg(3); return hypre_error_flag; } if (!rows) { hypre_error_in_arg(4); return hypre_error_flag; } if (!cols) { hypre_error_in_arg(5); return hypre_error_flag; } if (!values) { hypre_error_in_arg(6); return hypre_error_flag; } if ( hypre_IJMatrixObjectType(ijmatrix) == HYPRE_PARCSR ) { hypre_IJMatrixGetValuesParCSR( ijmatrix, nrows, ncols, rows, NULL, cols, values, 0 ); } else { hypre_error_in_arg(1); } return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_IJMatrixGetValues2( HYPRE_IJMatrix matrix, HYPRE_Int nrows, HYPRE_Int *ncols, HYPRE_BigInt *rows, HYPRE_Int *row_indexes, HYPRE_BigInt *cols, HYPRE_Complex *values ) { hypre_IJMatrix *ijmatrix = (hypre_IJMatrix *) matrix; if (nrows == 0) { return hypre_error_flag; } if (!ijmatrix) { hypre_error_in_arg(1); return hypre_error_flag; } if (!ncols) { hypre_error_in_arg(3); return hypre_error_flag; } if (!rows) { hypre_error_in_arg(4); return hypre_error_flag; } if (!cols) { hypre_error_in_arg(5); return hypre_error_flag; } if (!values) { hypre_error_in_arg(6); return hypre_error_flag; } #if defined(HYPRE_USING_GPU) HYPRE_ExecutionPolicy exec = hypre_GetExecPolicy1( hypre_IJMatrixMemoryLocation(matrix) ); if (exec == HYPRE_EXEC_DEVICE) { hypre_error_w_msg(HYPRE_ERROR_GENERIC, "HYPRE_IJMatrixGetValues not implemented for GPUs!"); } else #endif { if ( hypre_IJMatrixObjectType(ijmatrix) == HYPRE_PARCSR ) { hypre_IJMatrixGetValuesParCSR( ijmatrix, nrows, ncols, rows, row_indexes, cols, values, 0 ); } else { hypre_error_in_arg(1); } } return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_IJMatrixGetValuesAndZeroOut( HYPRE_IJMatrix matrix, HYPRE_Int nrows, HYPRE_Int *ncols, HYPRE_BigInt *rows, HYPRE_Int *row_indexes, HYPRE_BigInt *cols, HYPRE_Complex *values ) { hypre_IJMatrix *ijmatrix = (hypre_IJMatrix *) matrix; if (nrows == 0) { return hypre_error_flag; } if (!ijmatrix) { hypre_error_in_arg(1); return hypre_error_flag; } if (!ncols) { hypre_error_in_arg(3); return hypre_error_flag; } if (!rows) { hypre_error_in_arg(4); return hypre_error_flag; } if (!cols) { hypre_error_in_arg(5); return hypre_error_flag; } if (!values) { hypre_error_in_arg(6); return hypre_error_flag; } #if defined(HYPRE_USING_GPU) HYPRE_ExecutionPolicy exec = hypre_GetExecPolicy1( hypre_IJMatrixMemoryLocation(matrix) ); if (exec == HYPRE_EXEC_DEVICE) { hypre_error_w_msg(HYPRE_ERROR_GENERIC, "HYPRE_IJMatrixGetValues not implemented for GPUs!"); } else #endif { if ( hypre_IJMatrixObjectType(ijmatrix) == HYPRE_PARCSR ) { hypre_IJMatrixGetValuesParCSR( ijmatrix, nrows, ncols, rows, row_indexes, cols, values, 1 ); } else { hypre_error_in_arg(1); } } return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_IJMatrixSetObjectType( HYPRE_IJMatrix matrix, HYPRE_Int type ) { hypre_IJMatrix *ijmatrix = (hypre_IJMatrix *) matrix; if (!ijmatrix) { hypre_error_in_arg(1); return hypre_error_flag; } hypre_IJMatrixObjectType(ijmatrix) = type; return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_IJMatrixGetObjectType( HYPRE_IJMatrix matrix, HYPRE_Int *type ) { hypre_IJMatrix *ijmatrix = (hypre_IJMatrix *) matrix; if (!ijmatrix) { hypre_error_in_arg(1); return hypre_error_flag; } *type = hypre_IJMatrixObjectType(ijmatrix); return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_IJMatrixGetLocalRange( HYPRE_IJMatrix matrix, HYPRE_BigInt *ilower, HYPRE_BigInt *iupper, HYPRE_BigInt *jlower, HYPRE_BigInt *jupper ) { hypre_IJMatrix *ijmatrix = (hypre_IJMatrix *) matrix; HYPRE_BigInt *row_partitioning; HYPRE_BigInt *col_partitioning; if (!ijmatrix) { hypre_error_in_arg(1); return hypre_error_flag; } row_partitioning = hypre_IJMatrixRowPartitioning(ijmatrix); col_partitioning = hypre_IJMatrixColPartitioning(ijmatrix); *ilower = row_partitioning[0]; *iupper = row_partitioning[1] - 1; *jlower = col_partitioning[0]; *jupper = col_partitioning[1] - 1; return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_IJMatrixGetGlobalInfo( HYPRE_IJMatrix matrix, HYPRE_BigInt *global_num_rows, HYPRE_BigInt *global_num_cols, HYPRE_BigInt *global_num_nonzeros ) { hypre_IJMatrix *ijmatrix = (hypre_IJMatrix *) matrix; if (!ijmatrix) { hypre_error_in_arg(1); return hypre_error_flag; } *global_num_rows = hypre_IJMatrixGlobalNumRows(ijmatrix); *global_num_cols = hypre_IJMatrixGlobalNumCols(ijmatrix); if (hypre_IJMatrixObjectType(ijmatrix) == HYPRE_PARCSR) { hypre_ParCSRMatrix *par_matrix = (hypre_ParCSRMatrix *) hypre_IJMatrixObject(ijmatrix); if (!par_matrix) { hypre_error_in_arg(1); return hypre_error_flag; } hypre_ParCSRMatrixSetNumNonzeros(par_matrix); *global_num_nonzeros = hypre_ParCSRMatrixNumNonzeros(par_matrix); } else { hypre_error_in_arg(1); return hypre_error_flag; } return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ /** Returns a pointer to an underlying ijmatrix type used to implement IJMatrix. Assumes that the implementation has an underlying matrix, so it would not work with a direct implementation of IJMatrix. @return integer error code @param IJMatrix [IN] The ijmatrix to be pointed to. */ HYPRE_Int HYPRE_IJMatrixGetObject( HYPRE_IJMatrix matrix, void **object ) { hypre_IJMatrix *ijmatrix = (hypre_IJMatrix *) matrix; if (!ijmatrix) { hypre_error_in_arg(1); return hypre_error_flag; } *object = hypre_IJMatrixObject( ijmatrix ); return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_IJMatrixSetRowSizes( HYPRE_IJMatrix matrix, const HYPRE_Int *sizes ) { hypre_IJMatrix *ijmatrix = (hypre_IJMatrix *) matrix; if (!ijmatrix) { hypre_error_in_arg(1); return hypre_error_flag; } if ( hypre_IJMatrixObjectType(ijmatrix) == HYPRE_PARCSR ) { return ( hypre_IJMatrixSetRowSizesParCSR( ijmatrix, sizes ) ); } else { hypre_error_in_arg(1); } return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_IJMatrixSetDiagOffdSizes( HYPRE_IJMatrix matrix, const HYPRE_Int *diag_sizes, const HYPRE_Int *offdiag_sizes ) { hypre_IJMatrix *ijmatrix = (hypre_IJMatrix *) matrix; if (!ijmatrix) { hypre_error_in_arg(1); return hypre_error_flag; } if ( hypre_IJMatrixObjectType(ijmatrix) == HYPRE_PARCSR ) { hypre_IJMatrixSetDiagOffdSizesParCSR( ijmatrix, diag_sizes, offdiag_sizes ); } else { hypre_error_in_arg(1); } return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_IJMatrixSetMaxOffProcElmts( HYPRE_IJMatrix matrix, HYPRE_Int max_off_proc_elmts) { hypre_IJMatrix *ijmatrix = (hypre_IJMatrix *) matrix; if (!ijmatrix) { hypre_error_in_arg(1); return hypre_error_flag; } if ( hypre_IJMatrixObjectType(ijmatrix) == HYPRE_PARCSR ) { return ( hypre_IJMatrixSetMaxOffProcElmtsParCSR(ijmatrix, max_off_proc_elmts) ); } else { hypre_error_in_arg(1); } return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_IJMatrixSetInitAllocation(hypre_IJMatrix *matrix, HYPRE_Int factor) { hypre_IJMatrix *ijmatrix = (hypre_IJMatrix *) matrix; if (!ijmatrix) { hypre_error_in_arg(1); return hypre_error_flag; } if ( hypre_IJMatrixObjectType(ijmatrix) == HYPRE_PARCSR ) { return ( hypre_IJMatrixSetInitAllocationParCSR(ijmatrix, factor) ); } else { hypre_error_in_arg(1); } return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_IJMatrixSetEarlyAssemble(hypre_IJMatrix *matrix, HYPRE_Int early_assemble) { hypre_IJMatrix *ijmatrix = (hypre_IJMatrix *) matrix; if (!ijmatrix) { hypre_error_in_arg(1); return hypre_error_flag; } if ( hypre_IJMatrixObjectType(ijmatrix) == HYPRE_PARCSR ) { return ( hypre_IJMatrixSetEarlyAssembleParCSR(ijmatrix, early_assemble) ); } else { hypre_error_in_arg(1); } return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_IJMatrixSetGrowFactor(hypre_IJMatrix *matrix, HYPRE_Real factor) { hypre_IJMatrix *ijmatrix = (hypre_IJMatrix *) matrix; if (!ijmatrix) { hypre_error_in_arg(1); return hypre_error_flag; } if ( hypre_IJMatrixObjectType(ijmatrix) == HYPRE_PARCSR ) { return ( hypre_IJMatrixSetGrowFactorParCSR(ijmatrix, factor) ); } else { hypre_error_in_arg(1); } return hypre_error_flag; } /*-------------------------------------------------------------------------- * HYPRE_IJMatrixRead * * Reads data from file in ASCII format and creates an IJMatrix on host memory *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_IJMatrixRead( const char *filename, MPI_Comm comm, HYPRE_Int type, HYPRE_IJMatrix *matrix_ptr ) { hypre_IJMatrixRead(filename, comm, type, matrix_ptr, 0); return hypre_error_flag; } /*-------------------------------------------------------------------------- * HYPRE_IJMatrixReadBinary * * Reads data from file in binary format and creates an IJMatrix * on host memory. *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_IJMatrixReadBinary( const char *filename, MPI_Comm comm, HYPRE_Int type, HYPRE_IJMatrix *matrix_ptr ) { hypre_IJMatrixReadBinary(filename, comm, type, matrix_ptr); return hypre_error_flag; } /*-------------------------------------------------------------------------- * HYPRE_IJMatrixReadMM * * Reads matrix-market data from file in ASCII format and creates an * IJMatrix on host memory. *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_IJMatrixReadMM( const char *filename, MPI_Comm comm, HYPRE_Int type, HYPRE_IJMatrix *matrix_ptr ) { hypre_IJMatrixRead(filename, comm, type, matrix_ptr, 1); return hypre_error_flag; } /*-------------------------------------------------------------------------- * HYPRE_IJMatrixPrint *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_IJMatrixPrint( HYPRE_IJMatrix matrix, const char *filename ) { void *object; if (!matrix) { hypre_error_in_arg(1); return hypre_error_flag; } if ( (hypre_IJMatrixObjectType(matrix) != HYPRE_PARCSR) ) { hypre_error_in_arg(1); return hypre_error_flag; } HYPRE_IJMatrixGetObject(matrix, &object); hypre_ParCSRMatrixPrintIJ((hypre_ParCSRMatrix*) object, 0, 0, filename); return hypre_error_flag; } /*-------------------------------------------------------------------------- * HYPRE_IJMatrixPrintBinary *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_IJMatrixPrintBinary( HYPRE_IJMatrix matrix, const char *filename ) { void *object; if (!matrix) { hypre_error_in_arg(1); return hypre_error_flag; } if ( (hypre_IJMatrixObjectType(matrix) != HYPRE_PARCSR) ) { hypre_error_in_arg(1); return hypre_error_flag; } HYPRE_IJMatrixGetObject(matrix, &object); hypre_ParCSRMatrixPrintBinaryIJ((hypre_ParCSRMatrix*) object, 0, 0, filename); return hypre_error_flag; } /*-------------------------------------------------------------------------- * HYPRE_IJMatrixSetOMPFlag *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_IJMatrixSetOMPFlag( HYPRE_IJMatrix matrix, HYPRE_Int omp_flag ) { hypre_IJMatrix *ijmatrix = (hypre_IJMatrix *) matrix; if (!ijmatrix) { hypre_error_in_arg(1); return hypre_error_flag; } hypre_IJMatrixOMPFlag(ijmatrix) = omp_flag; return hypre_error_flag; } /*-------------------------------------------------------------------------- * HYPRE_IJMatrixTranspose *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_IJMatrixTranspose( HYPRE_IJMatrix matrix_A, HYPRE_IJMatrix *matrix_AT ) { hypre_IJMatrix *ij_A = (hypre_IJMatrix *) matrix_A; hypre_IJMatrix *ij_AT; HYPRE_Int i; if (!ij_A) { hypre_error_in_arg(1); return hypre_error_flag; } ij_AT = hypre_CTAlloc(hypre_IJMatrix, 1, HYPRE_MEMORY_HOST); hypre_IJMatrixComm(ij_AT) = hypre_IJMatrixComm(ij_A); hypre_IJMatrixObject(ij_AT) = NULL; hypre_IJMatrixTranslator(ij_AT) = NULL; hypre_IJMatrixAssumedPart(ij_AT) = NULL; hypre_IJMatrixObjectType(ij_AT) = hypre_IJMatrixObjectType(ij_A); hypre_IJMatrixAssembleFlag(ij_AT) = 1; hypre_IJMatrixPrintLevel(ij_AT) = hypre_IJMatrixPrintLevel(ij_A); hypre_IJMatrixGlobalFirstRow(ij_AT) = hypre_IJMatrixGlobalFirstCol(ij_A); hypre_IJMatrixGlobalFirstCol(ij_AT) = hypre_IJMatrixGlobalFirstRow(ij_A); hypre_IJMatrixGlobalNumRows(ij_AT) = hypre_IJMatrixGlobalNumCols(ij_A); hypre_IJMatrixGlobalNumCols(ij_AT) = hypre_IJMatrixGlobalNumRows(ij_A); for (i = 0; i < 2; i++) { hypre_IJMatrixRowPartitioning(ij_AT)[i] = hypre_IJMatrixColPartitioning(ij_A)[i]; hypre_IJMatrixColPartitioning(ij_AT)[i] = hypre_IJMatrixRowPartitioning(ij_A)[i]; } if (hypre_IJMatrixObjectType(ij_A) == HYPRE_PARCSR) { hypre_IJMatrixTransposeParCSR(ij_A, ij_AT); } else { hypre_error_in_arg(1); } *matrix_AT = (HYPRE_IJMatrix) ij_AT; return hypre_error_flag; } /*-------------------------------------------------------------------------- * HYPRE_IJMatrixNorm * * TODO: Add other norms *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_IJMatrixNorm( HYPRE_IJMatrix matrix, HYPRE_Real *norm ) { hypre_IJMatrix *ijmatrix = (hypre_IJMatrix *) matrix; if (!ijmatrix) { hypre_error_in_arg(1); return hypre_error_flag; } if (hypre_IJMatrixObjectType(ijmatrix) == HYPRE_PARCSR) { hypre_IJMatrixNormParCSR(ijmatrix, norm); } else { hypre_error_in_arg(1); } return hypre_error_flag; } /*-------------------------------------------------------------------------- * HYPRE_IJMatrixAdd *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_IJMatrixAdd( HYPRE_Complex alpha, HYPRE_IJMatrix matrix_A, HYPRE_Complex beta, HYPRE_IJMatrix matrix_B, HYPRE_IJMatrix *matrix_C ) { hypre_IJMatrix *ij_A = (hypre_IJMatrix *) matrix_A; hypre_IJMatrix *ij_B = (hypre_IJMatrix *) matrix_B; hypre_IJMatrix *ij_C; HYPRE_BigInt *row_partitioning_A; HYPRE_BigInt *col_partitioning_A; HYPRE_BigInt *row_partitioning_B; HYPRE_BigInt *col_partitioning_B; HYPRE_Int i; if (!ij_A) { hypre_error_in_arg(1); return hypre_error_flag; } /* Check if A and B have the same row/col partitionings */ row_partitioning_A = hypre_IJMatrixRowPartitioning(ij_A); row_partitioning_B = hypre_IJMatrixRowPartitioning(ij_B); col_partitioning_A = hypre_IJMatrixColPartitioning(ij_A); col_partitioning_B = hypre_IJMatrixColPartitioning(ij_B); for (i = 0; i < 2; i++) { if (row_partitioning_A[i] != row_partitioning_B[i]) { hypre_error_w_msg(HYPRE_ERROR_GENERIC, "Input matrices must have same row partitioning!"); return hypre_error_flag; } if (col_partitioning_A[i] != col_partitioning_B[i]) { hypre_error_w_msg(HYPRE_ERROR_GENERIC, "Input matrices must have same col partitioning!"); return hypre_error_flag; } } ij_C = hypre_CTAlloc(hypre_IJMatrix, 1, HYPRE_MEMORY_HOST); hypre_IJMatrixComm(ij_C) = hypre_IJMatrixComm(ij_A); hypre_IJMatrixObject(ij_C) = NULL; hypre_IJMatrixTranslator(ij_C) = NULL; hypre_IJMatrixAssumedPart(ij_C) = NULL; hypre_IJMatrixObjectType(ij_C) = hypre_IJMatrixObjectType(ij_A); hypre_IJMatrixAssembleFlag(ij_C) = 1; hypre_IJMatrixPrintLevel(ij_C) = hypre_IJMatrixPrintLevel(ij_A); /* Copy row/col partitioning of A to C */ for (i = 0; i < 2; i++) { hypre_IJMatrixRowPartitioning(ij_C)[i] = row_partitioning_A[i]; hypre_IJMatrixColPartitioning(ij_C)[i] = col_partitioning_A[i]; } if (hypre_IJMatrixObjectType(ij_A) == HYPRE_PARCSR) { hypre_IJMatrixAddParCSR(alpha, ij_A, beta, ij_B, ij_C); } else { hypre_error_in_arg(1); } *matrix_C = (HYPRE_IJMatrix) ij_C; return hypre_error_flag; } /*-------------------------------------------------------------------------- * HYPRE_IJMatrixMigrate * * Migrates an IJMatrix to the specified memory location *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_IJMatrixMigrate(HYPRE_IJMatrix matrix, HYPRE_MemoryLocation memory_location) { hypre_IJMatrix *ijmatrix = (hypre_IJMatrix *) matrix; if (!ijmatrix) { hypre_error_in_arg(1); return hypre_error_flag; } /* Only implemented for ParCSR matrices */ if (hypre_IJMatrixObjectType(ijmatrix) == HYPRE_PARCSR) { hypre_IJMatrixMigrateParCSR(ijmatrix, memory_location); } else { hypre_error_in_arg(1); } return hypre_error_flag; } hypre-2.33.0/src/IJ_mv/HYPRE_IJVector.c000066400000000000000000000602311477326011500173310ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * HYPRE_IJVector interface * *****************************************************************************/ #include "./_hypre_IJ_mv.h" #include "../HYPRE.h" /*-------------------------------------------------------------------------- * HYPRE_IJVectorCreate *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_IJVectorCreate( MPI_Comm comm, HYPRE_BigInt jlower, HYPRE_BigInt jupper, HYPRE_IJVector *vector ) { hypre_IJVector *vec; HYPRE_Int num_procs, my_id; HYPRE_BigInt row0, rowN; vec = hypre_CTAlloc(hypre_IJVector, 1, HYPRE_MEMORY_HOST); if (!vec) { hypre_error(HYPRE_ERROR_MEMORY); return hypre_error_flag; } hypre_MPI_Comm_size(comm, &num_procs); hypre_MPI_Comm_rank(comm, &my_id); if (jlower > jupper + 1 || jlower < 0) { hypre_error_in_arg(2); hypre_TFree(vec, HYPRE_MEMORY_HOST); return hypre_error_flag; } if (jupper < -1) { hypre_error_in_arg(3); return hypre_error_flag; } /* now we need the global number of rows as well as the global first row index */ /* proc 0 has the first row */ if (my_id == 0) { row0 = jlower; } hypre_MPI_Bcast(&row0, 1, HYPRE_MPI_BIG_INT, 0, comm); /* proc (num_procs-1) has the last row */ if (my_id == (num_procs - 1)) { rowN = jupper; } hypre_MPI_Bcast(&rowN, 1, HYPRE_MPI_BIG_INT, num_procs - 1, comm); hypre_IJVectorGlobalFirstRow(vec) = row0; hypre_IJVectorGlobalNumRows(vec) = rowN - row0 + 1; hypre_IJVectorComm(vec) = comm; hypre_IJVectorNumComponents(vec) = 1; hypre_IJVectorObjectType(vec) = HYPRE_UNITIALIZED; hypre_IJVectorObject(vec) = NULL; hypre_IJVectorTranslator(vec) = NULL; hypre_IJVectorAssumedPart(vec) = NULL; hypre_IJVectorPrintLevel(vec) = 0; hypre_IJVectorPartitioning(vec)[0] = jlower; hypre_IJVectorPartitioning(vec)[1] = jupper + 1; *vector = (HYPRE_IJVector) vec; return hypre_error_flag; } /*-------------------------------------------------------------------------- * HYPRE_IJVectorSetNumComponents *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_IJVectorSetNumComponents( HYPRE_IJVector vector, HYPRE_Int num_components ) { hypre_IJVector *vec = (hypre_IJVector *) vector; if (!vec) { hypre_error_in_arg(1); return hypre_error_flag; } if (num_components < 0) { hypre_error_in_arg(2); return hypre_error_flag; } hypre_IJVectorNumComponents(vector) = num_components; return hypre_error_flag; } /*-------------------------------------------------------------------------- * HYPRE_IJVectorSetComponent *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_IJVectorSetComponent( HYPRE_IJVector vector, HYPRE_Int component ) { hypre_IJVector *vec = (hypre_IJVector *) vector; if (!vec) { hypre_error_in_arg(1); return hypre_error_flag; } if (hypre_IJVectorObjectType(vec) == HYPRE_PARCSR) { hypre_IJVectorSetComponentPar(vector, component); } else { hypre_error_in_arg(1); return hypre_error_flag; } return hypre_error_flag; } /*-------------------------------------------------------------------------- * HYPRE_IJVectorDestroy *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_IJVectorDestroy( HYPRE_IJVector vector ) { hypre_IJVector *vec = (hypre_IJVector *) vector; if (!vec) { hypre_error_in_arg(1); return hypre_error_flag; } if (hypre_IJVectorAssumedPart(vec)) { hypre_AssumedPartitionDestroy((hypre_IJAssumedPart*)hypre_IJVectorAssumedPart(vec)); } if ( hypre_IJVectorObjectType(vec) == HYPRE_PARCSR ) { hypre_IJVectorDestroyPar(vec); if (hypre_IJVectorTranslator(vec)) { hypre_AuxParVectorDestroy((hypre_AuxParVector *) (hypre_IJVectorTranslator(vec))); } } else if ( hypre_IJVectorObjectType(vec) != -1 ) { hypre_error_in_arg(1); return hypre_error_flag; } hypre_TFree(vec, HYPRE_MEMORY_HOST); return hypre_error_flag; } /*-------------------------------------------------------------------------- * HYPRE_IJVectorInitializeShell *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_IJVectorInitializeShell(HYPRE_IJVector vector) { hypre_IJVector *vec = (hypre_IJVector *) vector; if (!vec) { hypre_error_in_arg(1); return hypre_error_flag; } if ( hypre_IJVectorObjectType(vec) == HYPRE_PARCSR ) { if (!hypre_IJVectorObject(vec)) { hypre_IJVectorCreatePar(vec, hypre_IJVectorPartitioning(vec)); } hypre_IJVectorInitializeParShell(vec); } else { hypre_error_in_arg(1); } return hypre_error_flag; } /*-------------------------------------------------------------------------- * HYPRE_IJVectorSetData *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_IJVectorSetData(HYPRE_IJVector vector, HYPRE_Complex *data) { hypre_IJVector *vec = (hypre_IJVector *) vector; if (!vec) { hypre_error_in_arg(1); return hypre_error_flag; } if ( hypre_IJVectorObjectType(vec) == HYPRE_PARCSR ) { hypre_IJVectorSetParData(vec, data); } else { hypre_error_in_arg(1); } return hypre_error_flag; } /*-------------------------------------------------------------------------- * HYPRE_IJVectorInitialize *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_IJVectorInitialize( HYPRE_IJVector vector ) { hypre_IJVector *vec = (hypre_IJVector *) vector; if (!vec) { hypre_error_in_arg(1); return hypre_error_flag; } if ( hypre_IJVectorObjectType(vec) == HYPRE_PARCSR ) { if (!hypre_IJVectorObject(vec)) { hypre_IJVectorCreatePar(vec, hypre_IJVectorPartitioning(vec)); } hypre_IJVectorInitializePar(vec); } else { hypre_error_in_arg(1); } return hypre_error_flag; } /*-------------------------------------------------------------------------- * HYPRE_IJVectorInitialize_v2 *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_IJVectorInitialize_v2( HYPRE_IJVector vector, HYPRE_MemoryLocation memory_location ) { hypre_IJVector *vec = (hypre_IJVector *) vector; if (!vec) { hypre_error_in_arg(1); return hypre_error_flag; } if ( hypre_IJVectorObjectType(vec) == HYPRE_PARCSR ) { if (!hypre_IJVectorObject(vec)) { hypre_IJVectorCreatePar(vec, hypre_IJVectorPartitioning(vec)); } hypre_IJVectorInitializePar_v2(vec, memory_location); } else { hypre_error_in_arg(1); } return hypre_error_flag; } /*-------------------------------------------------------------------------- * HYPRE_IJVectorSetPrintLevel *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_IJVectorSetPrintLevel( HYPRE_IJVector vector, HYPRE_Int print_level ) { hypre_IJVector *ijvector = (hypre_IJVector *) vector; if (!ijvector) { hypre_error_in_arg(1); return hypre_error_flag; } hypre_IJVectorPrintLevel(ijvector) = (print_level > 0) ? print_level : 0; return hypre_error_flag; } /*-------------------------------------------------------------------------- * HYPRE_IJVectorSetValues *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_IJVectorSetValues( HYPRE_IJVector vector, HYPRE_Int nvalues, const HYPRE_BigInt *indices, const HYPRE_Complex *values ) { hypre_IJVector *vec = (hypre_IJVector *) vector; if (nvalues == 0) { return hypre_error_flag; } if (!vec) { hypre_error_in_arg(1); return hypre_error_flag; } if (nvalues < 0) { hypre_error_in_arg(2); return hypre_error_flag; } if (!values) { hypre_error_in_arg(4); return hypre_error_flag; } if ( hypre_IJVectorObjectType(vec) == HYPRE_PARCSR ) { #if defined(HYPRE_USING_GPU) HYPRE_ExecutionPolicy exec = hypre_GetExecPolicy1( hypre_IJVectorMemoryLocation(vector) ); if (exec == HYPRE_EXEC_DEVICE) { return ( hypre_IJVectorSetAddValuesParDevice(vec, nvalues, indices, values, "set") ); } else #endif { return ( hypre_IJVectorSetValuesPar(vec, nvalues, indices, values) ); } } else { hypre_error_in_arg(1); } return hypre_error_flag; } /*-------------------------------------------------------------------------- * HYPRE_IJVectorSetConstantValues *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_IJVectorSetConstantValues( HYPRE_IJVector vector, HYPRE_Complex value ) { hypre_IJVector *vec = (hypre_IJVector *) vector; if (!vec) { hypre_error_in_arg(1); return hypre_error_flag; } if ( hypre_IJVectorObjectType(vec) == HYPRE_PARCSR ) { return ( hypre_IJVectorSetConstantValuesPar(vec, value) ); } else { hypre_error_in_arg(1); } return hypre_error_flag; } /*-------------------------------------------------------------------------- * HYPRE_IJVectorAddToValues *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_IJVectorAddToValues( HYPRE_IJVector vector, HYPRE_Int nvalues, const HYPRE_BigInt *indices, const HYPRE_Complex *values ) { hypre_IJVector *vec = (hypre_IJVector *) vector; if (nvalues == 0) { return hypre_error_flag; } if (!vec) { hypre_error_in_arg(1); return hypre_error_flag; } if (nvalues < 0) { hypre_error_in_arg(2); return hypre_error_flag; } if (!values) { hypre_error_in_arg(4); return hypre_error_flag; } if ( hypre_IJVectorObjectType(vec) == HYPRE_PARCSR ) { #if defined(HYPRE_USING_GPU) HYPRE_ExecutionPolicy exec = hypre_GetExecPolicy1( hypre_IJVectorMemoryLocation(vector) ); if (exec == HYPRE_EXEC_DEVICE) { return ( hypre_IJVectorSetAddValuesParDevice(vec, nvalues, indices, values, "add") ); } else #endif { return ( hypre_IJVectorAddToValuesPar(vec, nvalues, indices, values) ); } } else { hypre_error_in_arg(1); } return hypre_error_flag; } /*-------------------------------------------------------------------------- * HYPRE_IJVectorAssemble *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_IJVectorAssemble( HYPRE_IJVector vector ) { hypre_IJVector *vec = (hypre_IJVector *) vector; if (!vec) { hypre_error_in_arg(1); return hypre_error_flag; } if ( hypre_IJVectorObjectType(vec) == HYPRE_PARCSR ) { #if defined(HYPRE_USING_GPU) HYPRE_ExecutionPolicy exec = hypre_GetExecPolicy1( hypre_IJVectorMemoryLocation(vector) ); if (exec == HYPRE_EXEC_DEVICE) { return ( hypre_IJVectorAssembleParDevice(vec) ); } else #endif { return ( hypre_IJVectorAssemblePar(vec) ); } } else { hypre_error_in_arg(1); } return hypre_error_flag; } /*-------------------------------------------------------------------------- * HYPRE_IJVectorUpdateValues *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_IJVectorUpdateValues( HYPRE_IJVector vector, HYPRE_Int nvalues, const HYPRE_BigInt *indices, const HYPRE_Complex *values, HYPRE_Int action ) { hypre_IJVector *vec = (hypre_IJVector *) vector; if (nvalues == 0) { return hypre_error_flag; } if (!vec) { hypre_error_in_arg(1); return hypre_error_flag; } if (nvalues < 0) { hypre_error_in_arg(2); return hypre_error_flag; } if (!values) { hypre_error_in_arg(4); return hypre_error_flag; } if ( hypre_IJVectorObjectType(vec) == HYPRE_PARCSR ) { #if defined(HYPRE_USING_GPU) HYPRE_ExecutionPolicy exec = hypre_GetExecPolicy1( hypre_IJVectorMemoryLocation(vector) ); if (exec == HYPRE_EXEC_DEVICE) { return ( hypre_IJVectorUpdateValuesDevice(vec, nvalues, indices, values, action) ); } else #endif { if (action == 1) { return ( hypre_IJVectorSetValuesPar(vec, nvalues, indices, values) ); } else { return ( hypre_IJVectorAddToValuesPar(vec, nvalues, indices, values) ); } } } else { hypre_error_in_arg(1); } return hypre_error_flag; } /*-------------------------------------------------------------------------- * HYPRE_IJVectorGetValues *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_IJVectorGetValues( HYPRE_IJVector vector, HYPRE_Int nvalues, const HYPRE_BigInt *indices, HYPRE_Complex *values ) { hypre_IJVector *vec = (hypre_IJVector *) vector; if (nvalues == 0) { return hypre_error_flag; } if (!vec) { hypre_error_in_arg(1); return hypre_error_flag; } if (nvalues < 0) { hypre_error_in_arg(2); return hypre_error_flag; } if (!values) { hypre_error_in_arg(4); return hypre_error_flag; } if ( hypre_IJVectorObjectType(vec) == HYPRE_PARCSR ) { return ( hypre_IJVectorGetValuesPar(vec, nvalues, indices, values) ); } else { hypre_error_in_arg(1); } return hypre_error_flag; } /*-------------------------------------------------------------------------- * HYPRE_IJVectorSetMaxOffProcElmts *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_IJVectorSetMaxOffProcElmts( HYPRE_IJVector vector, HYPRE_Int max_off_proc_elmts ) { hypre_IJVector *vec = (hypre_IJVector *) vector; if (!vec) { hypre_error_in_arg(1); return hypre_error_flag; } if ( hypre_IJVectorObjectType(vec) == HYPRE_PARCSR ) { return ( hypre_IJVectorSetMaxOffProcElmtsPar(vec, max_off_proc_elmts)); } else { hypre_error_in_arg(1); } return hypre_error_flag; } /*-------------------------------------------------------------------------- * HYPRE_IJVectorSetObjectType *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_IJVectorSetObjectType( HYPRE_IJVector vector, HYPRE_Int type ) { hypre_IJVector *vec = (hypre_IJVector *) vector; if (!vec) { hypre_error_in_arg(1); return hypre_error_flag; } hypre_IJVectorObjectType(vec) = type; return hypre_error_flag; } /*-------------------------------------------------------------------------- * HYPRE_IJVectorGetObjectType *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_IJVectorGetObjectType( HYPRE_IJVector vector, HYPRE_Int *type ) { hypre_IJVector *vec = (hypre_IJVector *) vector; if (!vec) { hypre_error_in_arg(1); return hypre_error_flag; } *type = hypre_IJVectorObjectType(vec); return hypre_error_flag; } /*-------------------------------------------------------------------------- * HYPRE_IJVectorGetLocalRange *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_IJVectorGetLocalRange( HYPRE_IJVector vector, HYPRE_BigInt *jlower, HYPRE_BigInt *jupper ) { hypre_IJVector *vec = (hypre_IJVector *) vector; if (!vec) { hypre_error_in_arg(1); return hypre_error_flag; } *jlower = hypre_IJVectorPartitioning(vec)[0]; *jupper = hypre_IJVectorPartitioning(vec)[1] - 1; return hypre_error_flag; } /*-------------------------------------------------------------------------- * HYPRE_IJVectorGetObject *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_IJVectorGetObject( HYPRE_IJVector vector, void **object ) { hypre_IJVector *vec = (hypre_IJVector *) vector; if (!vec) { hypre_error_in_arg(1); return hypre_error_flag; } *object = hypre_IJVectorObject(vec); return hypre_error_flag; } /*-------------------------------------------------------------------------- * HYPRE_IJVectorRead * create IJVector on host memory *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_IJVectorRead( const char *filename, MPI_Comm comm, HYPRE_Int type, HYPRE_IJVector *vector_ptr ) { HYPRE_IJVector vector; HYPRE_BigInt jlower, jupper, j; HYPRE_Complex value; HYPRE_Int myid, ret; char new_filename[255]; FILE *file; hypre_MPI_Comm_rank(comm, &myid); hypre_sprintf(new_filename, "%s.%05d", filename, myid); if ((file = fopen(new_filename, "r")) == NULL) { hypre_error_in_arg(1); return hypre_error_flag; } hypre_fscanf(file, "%b %b", &jlower, &jupper); HYPRE_IJVectorCreate(comm, jlower, jupper, &vector); HYPRE_IJVectorSetObjectType(vector, type); HYPRE_IJVectorInitialize_v2(vector, HYPRE_MEMORY_HOST); /* It is important to ensure that whitespace follows the index value to help * catch mistakes in the input file. This is done with %*[ \t]. Using a * space here causes an input line with a single decimal value on it to be * read as if it were an integer followed by a decimal value. */ while ( (ret = hypre_fscanf(file, "%b%*[ \t]%le", &j, &value)) != EOF ) { if (ret != 2) { hypre_error_w_msg(HYPRE_ERROR_GENERIC, "Error in IJ vector input file."); return hypre_error_flag; } if (j < jlower || j > jupper) { HYPRE_IJVectorAddToValues(vector, 1, &j, &value); } else { HYPRE_IJVectorSetValues(vector, 1, &j, &value); } } HYPRE_IJVectorAssemble(vector); fclose(file); *vector_ptr = vector; return hypre_error_flag; } /*-------------------------------------------------------------------------- * HYPRE_IJVectorReadBinary *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_IJVectorReadBinary( const char *filename, MPI_Comm comm, HYPRE_Int type, HYPRE_IJVector *vector_ptr ) { return hypre_IJVectorReadBinary(comm, filename, type, vector_ptr); } /*-------------------------------------------------------------------------- * HYPRE_IJVectorPrint *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_IJVectorPrint( HYPRE_IJVector vector, const char *filename ) { MPI_Comm comm; HYPRE_BigInt *partitioning; HYPRE_BigInt jlower, jupper, j; HYPRE_Complex *h_values = NULL, *d_values = NULL, *values = NULL; HYPRE_Int myid, n_local; char new_filename[255]; FILE *file; if (!vector) { hypre_error_in_arg(1); return hypre_error_flag; } comm = hypre_IJVectorComm(vector); hypre_MPI_Comm_rank(comm, &myid); hypre_sprintf(new_filename, "%s.%05d", filename, myid); if ((file = fopen(new_filename, "w")) == NULL) { hypre_error_in_arg(2); return hypre_error_flag; } partitioning = hypre_IJVectorPartitioning(vector); jlower = partitioning[0]; jupper = partitioning[1] - 1; n_local = jupper - jlower + 1; hypre_fprintf(file, "%b %b\n", jlower, jupper); HYPRE_MemoryLocation memory_location = hypre_IJVectorMemoryLocation(vector); d_values = hypre_TAlloc(HYPRE_Complex, n_local, memory_location); HYPRE_IJVectorGetValues(vector, n_local, NULL, d_values); if ( hypre_GetActualMemLocation(memory_location) == hypre_MEMORY_HOST ) { values = d_values; } else { h_values = hypre_TAlloc(HYPRE_Complex, n_local, HYPRE_MEMORY_HOST); hypre_TMemcpy(h_values, d_values, HYPRE_Complex, n_local, HYPRE_MEMORY_HOST, memory_location); values = h_values; } for (j = jlower; j <= jupper; j++) { hypre_fprintf(file, "%b %.14e\n", j, values[j - jlower]); } hypre_TFree(d_values, memory_location); hypre_TFree(h_values, HYPRE_MEMORY_HOST); fclose(file); return hypre_error_flag; } /*-------------------------------------------------------------------------- * HYPRE_IJVectorPrintBinary *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_IJVectorPrintBinary( HYPRE_IJVector vector, const char *filename ) { if (!vector) { hypre_error_in_arg(1); return hypre_error_flag; } if (hypre_IJVectorObjectType(vector) == HYPRE_PARCSR) { hypre_ParVectorPrintBinaryIJ((hypre_ParVector*) hypre_IJVectorObject(vector), filename); } else { hypre_error_in_arg(1); return hypre_error_flag; } return hypre_error_flag; } /*-------------------------------------------------------------------------- * HYPRE_IJVectorInnerProd *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_IJVectorInnerProd( HYPRE_IJVector x, HYPRE_IJVector y, HYPRE_Real *prod ) { hypre_IJVector *xvec = (hypre_IJVector *) x; hypre_IJVector *yvec = (hypre_IJVector *) y; if (!xvec) { hypre_error_in_arg(1); return hypre_error_flag; } if (!yvec) { hypre_error_in_arg(2); return hypre_error_flag; } if (hypre_IJVectorObjectType(xvec) != hypre_IJVectorObjectType(yvec)) { hypre_error_w_msg(HYPRE_ERROR_GENERIC, "Input vectors don't have the same object type!"); return hypre_error_flag; } if (hypre_IJVectorObjectType(xvec) == HYPRE_PARCSR) { hypre_ParVector *par_x = (hypre_ParVector*) hypre_IJVectorObject(xvec); hypre_ParVector *par_y = (hypre_ParVector*) hypre_IJVectorObject(yvec); HYPRE_ParVectorInnerProd(par_x, par_y, prod); } else { hypre_error_in_arg(1); return hypre_error_flag; } return hypre_error_flag; } /*-------------------------------------------------------------------------- * HYPRE_IJVectorMigrate * * Migrates an IJVector to the specified memory location *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_IJVectorMigrate(HYPRE_IJVector vector, HYPRE_MemoryLocation memory_location) { hypre_IJVector *ijvector = (hypre_IJVector *) vector; if (!ijvector) { hypre_error_in_arg(1); return hypre_error_flag; } /* Only implemented for ParVector */ if (hypre_IJVectorObjectType(ijvector) == HYPRE_PARCSR) { hypre_IJVectorMigrateParCSR(ijvector, memory_location); } else { hypre_error_in_arg(1); } return hypre_error_flag; } hypre-2.33.0/src/IJ_mv/HYPRE_IJ_mv.h000066400000000000000000000670441477326011500166660ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #ifndef HYPRE_IJ_MV_HEADER #define HYPRE_IJ_MV_HEADER #include "HYPRE_config.h" #include "HYPRE_utilities.h" #ifdef __cplusplus extern "C" { #endif /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ /** * @defgroup IJSystemInterface IJ System Interface * * A linear-algebraic conceptual interface. This interface represents a * linear-algebraic conceptual view of a linear system. The 'I' and 'J' in the * name are meant to be mnemonic for the traditional matrix notation A(I,J). * * @{ **/ /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ /** * @name IJ Matrices * * @{ **/ struct hypre_IJMatrix_struct; /** * The matrix object. **/ typedef struct hypre_IJMatrix_struct *HYPRE_IJMatrix; /** * Create a matrix object. Each process owns some unique consecutive * range of rows, indicated by the global row indices \e ilower and * \e iupper. The row data is required to be such that the value * of \e ilower on any process \f$p\f$ be exactly one more than the * value of \e iupper on process \f$p-1\f$. Note that the first row of * the global matrix may start with any integer value. In particular, * one may use zero- or one-based indexing. * * For square matrices, \e jlower and \e jupper typically should * match \e ilower and \e iupper, respectively. For rectangular * matrices, \e jlower and \e jupper should define a * partitioning of the columns. This partitioning must be used for * any vector \f$v\f$ that will be used in matrix-vector products with the * rectangular matrix. The matrix data structure may use \e jlower * and \e jupper to store the diagonal blocks (rectangular in * general) of the matrix separately from the rest of the matrix. * * Collective. **/ HYPRE_Int HYPRE_IJMatrixCreate(MPI_Comm comm, HYPRE_BigInt ilower, HYPRE_BigInt iupper, HYPRE_BigInt jlower, HYPRE_BigInt jupper, HYPRE_IJMatrix *matrix); /** * Destroy a matrix object. An object should be explicitly destroyed * using this destructor when the user's code no longer needs direct * access to it. Once destroyed, the object must not be referenced * again. Note that the object may not be deallocated at the * completion of this call, since there may be internal package * references to the object. The object will then be destroyed when * all internal reference counts go to zero. **/ HYPRE_Int HYPRE_IJMatrixDestroy(HYPRE_IJMatrix matrix); /** * Prepare a matrix object for setting coefficient values. This * routine will also re-initialize an already assembled matrix, * allowing users to modify coefficient values. **/ HYPRE_Int HYPRE_IJMatrixInitialize(HYPRE_IJMatrix matrix); /** * Prepare a matrix object for setting coefficient values. This * routine will also re-initialize an already assembled matrix, * allowing users to modify coefficient values. This routine * also specifies the memory location, i.e. host or device. **/ HYPRE_Int HYPRE_IJMatrixInitialize_v2(HYPRE_IJMatrix matrix, HYPRE_MemoryLocation memory_location); /** * Sets values for \e nrows rows or partial rows of the matrix. * The arrays \e ncols * and \e rows are of dimension \e nrows and contain the number * of columns in each row and the row indices, respectively. The * array \e cols contains the column indices for each of the \e * rows, and is ordered by rows. The data in the \e values array * corresponds directly to the column entries in \e cols. Erases * any previous values at the specified locations and replaces them * with new ones, or, if there was no value there before, inserts a * new one if set locally. Note that it is not possible to set values * on other processors. If one tries to set a value from proc i on proc j, * proc i will erase all previous occurrences of this value in its stack * (including values generated with AddToValues), and treat it like * a zero value. The actual value needs to be set on proc j. * * Note that a threaded version (threaded over the number of rows) * will be called if * HYPRE_IJMatrixSetOMPFlag is set to a value != 0. * This requires that rows[i] != rows[j] for i!= j * and is only efficient if a large number of rows is set in one call * to HYPRE_IJMatrixSetValues. * * Not collective. * **/ HYPRE_Int HYPRE_IJMatrixSetValues(HYPRE_IJMatrix matrix, HYPRE_Int nrows, HYPRE_Int *ncols, const HYPRE_BigInt *rows, const HYPRE_BigInt *cols, const HYPRE_Complex *values); /** * Sets all matrix coefficients of an already assembled matrix to * \e value **/ HYPRE_Int HYPRE_IJMatrixSetConstantValues(HYPRE_IJMatrix matrix, HYPRE_Complex value); /** * Adds to values for \e nrows rows or partial rows of the matrix. * Usage details are analogous to \ref HYPRE_IJMatrixSetValues. * Adds to any previous values at the specified locations, or, if * there was no value there before, inserts a new one. * AddToValues can be used to add to values on other processors. * * Note that a threaded version (threaded over the number of rows) * will be called if * HYPRE_IJMatrixSetOMPFlag is set to a value != 0. * This requires that rows[i] != rows[j] for i!= j * and is only efficient if a large number of rows is added in one call * to HYPRE_IJMatrixAddToValues. * * Not collective. * **/ HYPRE_Int HYPRE_IJMatrixAddToValues(HYPRE_IJMatrix matrix, HYPRE_Int nrows, HYPRE_Int *ncols, const HYPRE_BigInt *rows, const HYPRE_BigInt *cols, const HYPRE_Complex *values); /** * Sets values for \e nrows rows or partial rows of the matrix. * * Same as IJMatrixSetValues, but with an additional \e row_indexes array * that provides indexes into the \e cols and \e values arrays. Because * of this, there can be gaps between the row data in these latter two arrays. * **/ HYPRE_Int HYPRE_IJMatrixSetValues2(HYPRE_IJMatrix matrix, HYPRE_Int nrows, HYPRE_Int *ncols, const HYPRE_BigInt *rows, const HYPRE_Int *row_indexes, const HYPRE_BigInt *cols, const HYPRE_Complex *values); /** * Adds to values for \e nrows rows or partial rows of the matrix. * * Same as IJMatrixAddToValues, but with an additional \e row_indexes array * that provides indexes into the \e cols and \e values arrays. Because * of this, there can be gaps between the row data in these latter two arrays. * **/ HYPRE_Int HYPRE_IJMatrixAddToValues2(HYPRE_IJMatrix matrix, HYPRE_Int nrows, HYPRE_Int *ncols, const HYPRE_BigInt *rows, const HYPRE_Int *row_indexes, const HYPRE_BigInt *cols, const HYPRE_Complex *values); /** * Finalize the construction of the matrix before using. **/ HYPRE_Int HYPRE_IJMatrixAssemble(HYPRE_IJMatrix matrix); /** * Gets number of nonzeros elements for \e nrows rows specified in \e rows * and returns them in \e ncols, which needs to be allocated by the * user. **/ HYPRE_Int HYPRE_IJMatrixGetRowCounts(HYPRE_IJMatrix matrix, HYPRE_Int nrows, HYPRE_BigInt *rows, HYPRE_Int *ncols); /** * Gets values for \e nrows rows or partial rows of the matrix. * Usage details are mostly * analogous to \ref HYPRE_IJMatrixSetValues. * Note that if nrows is negative, the routine will return * the column_indices and matrix coefficients of the * (-nrows) rows contained in rows. **/ HYPRE_Int HYPRE_IJMatrixGetValues(HYPRE_IJMatrix matrix, HYPRE_Int nrows, HYPRE_Int *ncols, HYPRE_BigInt *rows, HYPRE_BigInt *cols, HYPRE_Complex *values); /** * Gets values for \e nrows rows or partial rows of the matrix. * * Same as IJMatrixGetValues, but with an additional \e row_indexes array * that provides indexes into the \e cols and \e values arrays. Because * of this, there can be gaps between the row data in these latter two arrays. * **/ HYPRE_Int HYPRE_IJMatrixGetValues2(HYPRE_IJMatrix matrix, HYPRE_Int nrows, HYPRE_Int *ncols, HYPRE_BigInt *rows, HYPRE_Int *row_indexes, HYPRE_BigInt *cols, HYPRE_Complex *values); /** * Gets values for \e nrows rows or partial rows of the matrix * and zeros out those entries in the matrix. * * Same as IJMatrixGetValues2, but zeros out the entries after getting them. * **/ HYPRE_Int HYPRE_IJMatrixGetValuesAndZeroOut(HYPRE_IJMatrix matrix, HYPRE_Int nrows, HYPRE_Int *ncols, HYPRE_BigInt *rows, HYPRE_Int *row_indexes, HYPRE_BigInt *cols, HYPRE_Complex *values); /** * Set the storage type of the matrix object to be constructed. * Currently, \e type can only be \c HYPRE_PARCSR. * * Not collective, but must be the same on all processes. * * @see HYPRE_IJMatrixGetObject **/ HYPRE_Int HYPRE_IJMatrixSetObjectType(HYPRE_IJMatrix matrix, HYPRE_Int type); /** * Get the storage type of the constructed matrix object. **/ HYPRE_Int HYPRE_IJMatrixGetObjectType(HYPRE_IJMatrix matrix, HYPRE_Int *type); /** * Gets range of rows owned by this processor and range * of column partitioning for this processor. **/ HYPRE_Int HYPRE_IJMatrixGetLocalRange(HYPRE_IJMatrix matrix, HYPRE_BigInt *ilower, HYPRE_BigInt *iupper, HYPRE_BigInt *jlower, HYPRE_BigInt *jupper); /** * Gets global information about the matrix, including the total number of rows, * columns, and nonzero elements across all processes. * * @param matrix The IJMatrix object to query. * @param global_num_rows Pointer to store the total number of rows in the matrix. * @param global_num_cols Pointer to store the total number of columns in the matrix. * @param global_num_nonzeros Pointer to store the total number of nonzero elements in the matrix. * * @return HYPRE_Int Error code. * * Collective (must be called by all processes). **/ HYPRE_Int HYPRE_IJMatrixGetGlobalInfo(HYPRE_IJMatrix matrix, HYPRE_BigInt *global_num_rows, HYPRE_BigInt *global_num_cols, HYPRE_BigInt *global_num_nonzeros); /** * Get a reference to the constructed matrix object. * * @see HYPRE_IJMatrixSetObjectType **/ HYPRE_Int HYPRE_IJMatrixGetObject(HYPRE_IJMatrix matrix, void **object); /** * (Optional) Set the max number of nonzeros to expect in each row. * The array \e sizes contains estimated sizes for each row on this * process. This call can significantly improve the efficiency of * matrix construction, and should always be utilized if possible. * * Not collective. **/ HYPRE_Int HYPRE_IJMatrixSetRowSizes(HYPRE_IJMatrix matrix, const HYPRE_Int *sizes); /** * (Optional) Sets the exact number of nonzeros in each row of * the diagonal and off-diagonal blocks. The diagonal block is the * submatrix whose column numbers correspond to rows owned by this * process, and the off-diagonal block is everything else. The arrays * \e diag_sizes and \e offdiag_sizes contain estimated sizes * for each row of the diagonal and off-diagonal blocks, respectively. * This routine can significantly improve the efficiency of matrix * construction, and should always be utilized if possible. * * Not collective. **/ HYPRE_Int HYPRE_IJMatrixSetDiagOffdSizes(HYPRE_IJMatrix matrix, const HYPRE_Int *diag_sizes, const HYPRE_Int *offdiag_sizes); /** * (Optional) Sets the maximum number of elements that are expected to be set * (or added) on other processors from this processor * This routine can significantly improve the efficiency of matrix * construction, and should always be utilized if possible. * * Not collective. **/ HYPRE_Int HYPRE_IJMatrixSetMaxOffProcElmts(HYPRE_IJMatrix matrix, HYPRE_Int max_off_proc_elmts); /** * (Optional, GPU only) Sets the initial memory allocation for matrix * assemble, which factor * local number of rows * Not collective. **/ HYPRE_Int HYPRE_IJMatrixSetInitAllocation(HYPRE_IJMatrix matrix, HYPRE_Int factor); /** * (Optional, GPU only) Sets if matrix assemble routine does reductions * during the accumulation of the entries before calling HYPRE_IJMatrixAssemble. * This early assemble feature may save the peak memory usage but requires * extra work. * Not collective. **/ HYPRE_Int HYPRE_IJMatrixSetEarlyAssemble(HYPRE_IJMatrix matrix, HYPRE_Int early_assemble); /** * (Optional, GPU only) Sets the grow factor of memory in matrix assemble when * running out of memory. * Not collective. **/ HYPRE_Int HYPRE_IJMatrixSetGrowFactor(HYPRE_IJMatrix matrix, HYPRE_Real factor); /** * (Optional) Sets the print level, if the user wants to print * error messages. The default is 0, i.e. no error messages are printed. * **/ HYPRE_Int HYPRE_IJMatrixSetPrintLevel(HYPRE_IJMatrix matrix, HYPRE_Int print_level); /** * (Optional) if set, will use a threaded version of * HYPRE_IJMatrixSetValues and HYPRE_IJMatrixAddToValues. * This is only useful if a large number of rows is set or added to * at once. * * NOTE that the values in the rows array of HYPRE_IJMatrixSetValues * or HYPRE_IJMatrixAddToValues must be different from each other !!! * * This option is VERY inefficient if only a small number of rows * is set or added at once and/or * if reallocation of storage is required and/or * if values are added to off processor values. * **/ HYPRE_Int HYPRE_IJMatrixSetOMPFlag(HYPRE_IJMatrix matrix, HYPRE_Int omp_flag); /** * Read the matrix from file. This is mainly for debugging purposes. **/ HYPRE_Int HYPRE_IJMatrixRead(const char *filename, MPI_Comm comm, HYPRE_Int type, HYPRE_IJMatrix *matrix); /** * Read the matrix from MM file. This is mainly for debugging purposes. **/ HYPRE_Int HYPRE_IJMatrixReadMM(const char *filename, MPI_Comm comm, HYPRE_Int type, HYPRE_IJMatrix *matrix); /** * Print the matrix to file. This is mainly for debugging purposes. **/ HYPRE_Int HYPRE_IJMatrixPrint(HYPRE_IJMatrix matrix, const char *filename); /** * Transpose an IJMatrix. **/ HYPRE_Int HYPRE_IJMatrixTranspose( HYPRE_IJMatrix matrix_A, HYPRE_IJMatrix *matrix_AT ); /** * Computes the infinity norm of an IJMatrix **/ HYPRE_Int HYPRE_IJMatrixNorm( HYPRE_IJMatrix matrix, HYPRE_Real *norm ); /** * Performs C = alpha*A + beta*B **/ HYPRE_Int HYPRE_IJMatrixAdd( HYPRE_Complex alpha, HYPRE_IJMatrix matrix_A, HYPRE_Complex beta, HYPRE_IJMatrix matrix_B, HYPRE_IJMatrix *matrix_C ); /** * Print the matrix to file in binary format. This is mainly for debugging purposes. **/ HYPRE_Int HYPRE_IJMatrixPrintBinary(HYPRE_IJMatrix matrix, const char *filename); /** * Read the matrix from file stored in binary format. This is mainly for debugging purposes. **/ HYPRE_Int HYPRE_IJMatrixReadBinary(const char *filename, MPI_Comm comm, HYPRE_Int type, HYPRE_IJMatrix *matrix_ptr); /** * Migrate the matrix to a given memory location. **/ HYPRE_Int HYPRE_IJMatrixMigrate(HYPRE_IJMatrix matrix, HYPRE_MemoryLocation memory_location); /**@}*/ /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ /** * @name IJ Vectors * * @{ **/ struct hypre_IJVector_struct; /** * The vector object. **/ typedef struct hypre_IJVector_struct *HYPRE_IJVector; /** * Create a vector object. Each process owns some unique consecutive * range of vector unknowns, indicated by the global indices \e * jlower and \e jupper. The data is required to be such that the * value of \e jlower on any process \f$p\f$ be exactly one more than * the value of \e jupper on process \f$p-1\f$. Note that the first * index of the global vector may start with any integer value. In * particular, one may use zero- or one-based indexing. * * Collective. **/ HYPRE_Int HYPRE_IJVectorCreate(MPI_Comm comm, HYPRE_BigInt jlower, HYPRE_BigInt jupper, HYPRE_IJVector *vector); /** * Destroy a vector object. An object should be explicitly destroyed * using this destructor when the user's code no longer needs direct * access to it. Once destroyed, the object must not be referenced * again. Note that the object may not be deallocated at the * completion of this call, since there may be internal package * references to the object. The object will then be destroyed when * all internal reference counts go to zero. **/ HYPRE_Int HYPRE_IJVectorDestroy(HYPRE_IJVector vector); /** * This function should be called before `HYPRE_IJVectorSetData` * if users intend to reuse an existing data pointer, thereby avoiding * unnecessary memory copies. It configures the vector to accept external * data without allocating new storage. **/ HYPRE_Int HYPRE_IJVectorInitializeShell(HYPRE_IJVector vector); /** * This function sets the internal data pointer of the vector to an external * array, allowing direct control over the vector's data storage without * transferring ownership. Users are responsible for managing the memory * of the `data` array, which must remain valid for the vector's lifetime. * * Users should call `HYPRE_IJVectorInitializeShell` before this function * to prepare the vector for external data. The memory location of the `data` * array is expected to be on the host when hypre is configured without GPU * support. If hypre is configured with GPU support, it is assumed that `data` * resides in device memory. **/ HYPRE_Int HYPRE_IJVectorSetData(HYPRE_IJVector vector, HYPRE_Complex *data); /** * Prepare a vector object for setting coefficient values. This * routine will also re-initialize an already assembled vector, * allowing users to modify coefficient values. **/ HYPRE_Int HYPRE_IJVectorInitialize(HYPRE_IJVector vector); /** * Prepare a vector object for setting coefficient values. This * routine will also re-initialize an already assembled vector, * allowing users to modify coefficient values. This routine * also specifies the memory location, i.e. host or device. **/ HYPRE_Int HYPRE_IJVectorInitialize_v2( HYPRE_IJVector vector, HYPRE_MemoryLocation memory_location ); /** * (Optional) Sets the maximum number of elements that are expected to be set * (or added) on other processors from this processor * This routine can significantly improve the efficiency of matrix * construction, and should always be utilized if possible. * * Not collective. **/ HYPRE_Int HYPRE_IJVectorSetMaxOffProcElmts(HYPRE_IJVector vector, HYPRE_Int max_off_proc_elmts); /** * (Optional) Sets the number of components (vectors) of a multivector. A vector * is assumed to have a single component when this function is not called. * This function must be called prior to HYPRE_IJVectorInitialize. **/ HYPRE_Int HYPRE_IJVectorSetNumComponents(HYPRE_IJVector vector, HYPRE_Int num_components); /** * (Optional) Sets the component identifier of a vector with multiple components (multivector). * This can be used for Set/AddTo/Get purposes. **/ HYPRE_Int HYPRE_IJVectorSetComponent(HYPRE_IJVector vector, HYPRE_Int component); /** * Sets values in vector. The arrays \e values and \e indices * are of dimension \e nvalues and contain the vector values to be * set and the corresponding global vector indices, respectively. * Erases any previous values at the specified locations and replaces * them with new ones. Note that it is not possible to set values * on other processors. If one tries to set a value from proc i on proc j, * proc i will erase all previous occurrences of this value in its stack * (including values generated with AddToValues), and treat it like * a zero value. The actual value needs to be set on proc j. * * Not collective. **/ HYPRE_Int HYPRE_IJVectorSetValues(HYPRE_IJVector vector, HYPRE_Int nvalues, const HYPRE_BigInt *indices, const HYPRE_Complex *values); /** * Sets all vector coefficients to \e value **/ HYPRE_Int HYPRE_IJVectorSetConstantValues(HYPRE_IJVector vector, HYPRE_Complex value); /** * Adds to values in vector. Usage details are analogous to * \ref HYPRE_IJVectorSetValues. * Adds to any previous values at the specified locations, or, if * there was no value there before, inserts a new one. * AddToValues can be used to add to values on other processors. * * Not collective. **/ HYPRE_Int HYPRE_IJVectorAddToValues(HYPRE_IJVector vector, HYPRE_Int nvalues, const HYPRE_BigInt *indices, const HYPRE_Complex *values); /** * Finalize the construction of the vector before using. **/ HYPRE_Int HYPRE_IJVectorAssemble(HYPRE_IJVector vector); /** * Update vectors by setting (action 1) or * adding to (action 0) values in 'vector'. * Note that this function cannot update values owned by other processes * and does not allow repeated index values in 'indices'. * * Not collective. **/ HYPRE_Int HYPRE_IJVectorUpdateValues(HYPRE_IJVector vector, HYPRE_Int nvalues, const HYPRE_BigInt *indices, const HYPRE_Complex *values, HYPRE_Int action); /** * Gets values in vector. Usage details are analogous to * \ref HYPRE_IJVectorSetValues. * * Not collective. **/ HYPRE_Int HYPRE_IJVectorGetValues(HYPRE_IJVector vector, HYPRE_Int nvalues, const HYPRE_BigInt *indices, HYPRE_Complex *values); /** * Set the storage type of the vector object to be constructed. * Currently, \e type can only be \c HYPRE_PARCSR. * * Not collective, but must be the same on all processes. * * @see HYPRE_IJVectorGetObject **/ HYPRE_Int HYPRE_IJVectorSetObjectType(HYPRE_IJVector vector, HYPRE_Int type); /** * Get the storage type of the constructed vector object. **/ HYPRE_Int HYPRE_IJVectorGetObjectType(HYPRE_IJVector vector, HYPRE_Int *type); /** * Returns range of the part of the vector owned by this processor. **/ HYPRE_Int HYPRE_IJVectorGetLocalRange(HYPRE_IJVector vector, HYPRE_BigInt *jlower, HYPRE_BigInt *jupper); /** * Get a reference to the constructed vector object. * * @see HYPRE_IJVectorSetObjectType **/ HYPRE_Int HYPRE_IJVectorGetObject(HYPRE_IJVector vector, void **object); /** * (Optional) Sets the print level, if the user wants to print * error messages. The default is 0, i.e. no error messages are printed. * **/ HYPRE_Int HYPRE_IJVectorSetPrintLevel(HYPRE_IJVector vector, HYPRE_Int print_level); /** * Read the vector from file. This is mainly for debugging purposes. **/ HYPRE_Int HYPRE_IJVectorRead(const char *filename, MPI_Comm comm, HYPRE_Int type, HYPRE_IJVector *vector); /** * Read the vector from binary file. This is mainly for debugging purposes. **/ HYPRE_Int HYPRE_IJVectorReadBinary(const char *filename, MPI_Comm comm, HYPRE_Int type, HYPRE_IJVector *vector); /** * Print the vector to file. This is mainly for debugging purposes. **/ HYPRE_Int HYPRE_IJVectorPrint(HYPRE_IJVector vector, const char *filename); /** * Print the vector to binary file. This is mainly for debugging purposes. **/ HYPRE_Int HYPRE_IJVectorPrintBinary(HYPRE_IJVector vector, const char *filename); /** * Computes the inner product between two vectors **/ HYPRE_Int HYPRE_IJVectorInnerProd(HYPRE_IJVector x, HYPRE_IJVector y, HYPRE_Real *prod); /** * Migrate the vector to a given memory location. **/ HYPRE_Int HYPRE_IJVectorMigrate(HYPRE_IJVector vector, HYPRE_MemoryLocation memory_location); /**@}*/ /**@}*/ #ifdef __cplusplus } #endif #endif hypre-2.33.0/src/IJ_mv/IJMatrix.c000066400000000000000000000344421477326011500163710ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * hypre_IJMatrix interface * *****************************************************************************/ #include "_hypre_IJ_mv.h" #include "../HYPRE.h" /*-------------------------------------------------------------------------- * hypre_IJMatrixGetRowPartitioning * * Returns a pointer to the row partitioning of an IJMatrix *--------------------------------------------------------------------------*/ HYPRE_Int hypre_IJMatrixGetRowPartitioning( HYPRE_IJMatrix matrix, HYPRE_BigInt **row_partitioning ) { hypre_IJMatrix *ijmatrix = (hypre_IJMatrix *) matrix; if (!ijmatrix) { hypre_error_w_msg(HYPRE_ERROR_GENERIC, "Variable ijmatrix is NULL -- hypre_IJMatrixGetRowPartitioning\n"); return hypre_error_flag; } if ( hypre_IJMatrixRowPartitioning(ijmatrix)) { *row_partitioning = hypre_IJMatrixRowPartitioning(ijmatrix); } else { hypre_error(HYPRE_ERROR_GENERIC); return hypre_error_flag; } return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_IJMatrixGetColPartitioning * * Returns a pointer to the column partitioning of an IJMatrix *--------------------------------------------------------------------------*/ HYPRE_Int hypre_IJMatrixGetColPartitioning( HYPRE_IJMatrix matrix, HYPRE_BigInt **col_partitioning ) { hypre_IJMatrix *ijmatrix = (hypre_IJMatrix *) matrix; if (!ijmatrix) { hypre_error_w_msg(HYPRE_ERROR_GENERIC, "Variable ijmatrix is NULL -- hypre_IJMatrixGetColPartitioning\n"); return hypre_error_flag; } if ( hypre_IJMatrixColPartitioning(ijmatrix)) { *col_partitioning = hypre_IJMatrixColPartitioning(ijmatrix); } else { hypre_error(HYPRE_ERROR_GENERIC); return hypre_error_flag; } return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_IJMatrixSetObject *--------------------------------------------------------------------------*/ HYPRE_Int hypre_IJMatrixSetObject( HYPRE_IJMatrix matrix, void *object ) { hypre_IJMatrix *ijmatrix = (hypre_IJMatrix *) matrix; if (hypre_IJMatrixObject(ijmatrix) != NULL) { /*hypre_printf("Referencing a new IJMatrix object can orphan an old -- "); hypre_printf("hypre_IJMatrixSetObject\n");*/ hypre_error(HYPRE_ERROR_GENERIC); return hypre_error_flag; } hypre_IJMatrixObject(ijmatrix) = object; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_IJMatrixRead * * Reads a matrix from file, HYPRE's IJ format or MM format. The resulting * IJMatrix is stored on host memory. *--------------------------------------------------------------------------*/ HYPRE_Int hypre_IJMatrixRead( const char *filename, MPI_Comm comm, HYPRE_Int type, HYPRE_IJMatrix *matrix_ptr, HYPRE_Int is_mm ) { HYPRE_IJMatrix matrix; HYPRE_BigInt ilower, iupper, jlower, jupper; HYPRE_BigInt I, J; HYPRE_Int ncols; HYPRE_Complex value; HYPRE_Int myid, ret; HYPRE_Int isSym = 0; char new_filename[255]; FILE *file; hypre_MPI_Comm_rank(comm, &myid); if (is_mm) { hypre_sprintf(new_filename, "%s", filename); } else { hypre_sprintf(new_filename, "%s.%05d", filename, myid); } if ((file = fopen(new_filename, "r")) == NULL) { hypre_error_in_arg(1); return hypre_error_flag; } if (is_mm) { MM_typecode matcode; HYPRE_Int nrow, ncol, nnz; if (hypre_mm_read_banner(file, &matcode) != 0) { hypre_error_w_msg(HYPRE_ERROR_GENERIC, "Could not process Matrix Market banner."); return hypre_error_flag; } if (!hypre_mm_is_valid(matcode)) { hypre_error_w_msg(HYPRE_ERROR_GENERIC, "Invalid Matrix Market file."); return hypre_error_flag; } if ( !( (hypre_mm_is_real(matcode) || hypre_mm_is_integer(matcode)) && hypre_mm_is_coordinate(matcode) && hypre_mm_is_sparse(matcode) ) ) { hypre_error_w_msg(HYPRE_ERROR_GENERIC, "Only sparse real-valued/integer coordinate matrices are supported"); return hypre_error_flag; } if (hypre_mm_is_symmetric(matcode)) { isSym = 1; } if (hypre_mm_read_mtx_crd_size(file, &nrow, &ncol, &nnz) != 0) { hypre_error_w_msg(HYPRE_ERROR_GENERIC, "MM read size error !"); return hypre_error_flag; } ilower = 0; iupper = ilower + nrow - 1; jlower = 0; jupper = jlower + ncol - 1; } else { hypre_fscanf(file, "%b %b %b %b", &ilower, &iupper, &jlower, &jupper); } HYPRE_IJMatrixCreate(comm, ilower, iupper, jlower, jupper, &matrix); HYPRE_IJMatrixSetObjectType(matrix, type); HYPRE_IJMatrixInitialize_v2(matrix, HYPRE_MEMORY_HOST); /* It is important to ensure that whitespace follows the index value to help * catch mistakes in the input file. See comments in IJVectorRead(). */ ncols = 1; while ( (ret = hypre_fscanf(file, "%b %b%*[ \t]%le", &I, &J, &value)) != EOF ) { if (ret != 3) { hypre_error_w_msg(HYPRE_ERROR_GENERIC, "Error in IJ matrix input file."); return hypre_error_flag; } if (is_mm) { I --; J --; } if (I < ilower || I > iupper) { HYPRE_IJMatrixAddToValues(matrix, 1, &ncols, &I, &J, &value); } else { HYPRE_IJMatrixSetValues(matrix, 1, &ncols, &I, &J, &value); } if (isSym && I != J) { if (J < ilower || J > iupper) { HYPRE_IJMatrixAddToValues(matrix, 1, &ncols, &J, &I, &value); } else { HYPRE_IJMatrixSetValues(matrix, 1, &ncols, &J, &I, &value); } } } HYPRE_IJMatrixAssemble(matrix); fclose(file); *matrix_ptr = matrix; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_IJMatrixReadBinary * * Reads a matrix from file stored in binary format. The resulting IJMatrix * is stored on host memory. For information about the metadata contents * contained in the file header, see hypre_ParCSRMatrixPrintBinaryIJ. *--------------------------------------------------------------------------*/ HYPRE_Int hypre_IJMatrixReadBinary( const char *prefixname, MPI_Comm comm, HYPRE_Int type, HYPRE_IJMatrix *matrix_ptr ) { HYPRE_IJMatrix matrix; /* Local buffers */ hypre_uint32 *i32buffer = NULL; hypre_uint64 *i64buffer = NULL; hypre_float *f32buffer = NULL; hypre_double *f64buffer = NULL; /* Matrix buffers */ HYPRE_Int num_nonzeros; HYPRE_BigInt *rows; HYPRE_BigInt *cols; HYPRE_Complex *vals; /* Local variables */ HYPRE_Int one = 1; HYPRE_Int myid; char filename[1024], msg[1024]; HYPRE_BigInt i, ilower, iupper, jlower, jupper; size_t count; hypre_uint64 header[11]; FILE *fp; /* Exit if trying to read from big-endian machine */ if ((*(char*)&one) == 0) { hypre_error_w_msg(HYPRE_ERROR_GENERIC, "Support to big-endian machines is incomplete!"); return hypre_error_flag; } /* Set filename */ hypre_MPI_Comm_rank(comm, &myid); hypre_sprintf(filename, "%s.%05d.bin", prefixname, myid); /* Open file */ if ((fp = fopen(filename, "rb")) == NULL) { hypre_error_w_msg(HYPRE_ERROR_GENERIC, "Could not open input file\n"); return hypre_error_flag; } /*--------------------------------------------- * Read header (88 bytes) from file *---------------------------------------------*/ count = 11; if (fread(header, sizeof(hypre_uint64), count, fp) != count) { hypre_error_w_msg(HYPRE_ERROR_GENERIC, "Could not read header entries\n"); return EXIT_FAILURE; } /* Check for header version */ if (header[0] != 1) { hypre_sprintf(msg, "Unsupported header version: %d", header[0]); hypre_error_w_msg(HYPRE_ERROR_GENERIC, msg); return hypre_error_flag; } /* Check for integer overflow */ if (header[6] > HYPRE_INT_MAX) { hypre_error_w_msg(HYPRE_ERROR_GENERIC, "Detected integer overflow at 7th header entry"); return hypre_error_flag; } num_nonzeros = (HYPRE_Int) header[6]; /* Set variables */ ilower = (HYPRE_BigInt) header[7]; iupper = (HYPRE_BigInt) header[8]; jlower = (HYPRE_BigInt) header[9]; jupper = (HYPRE_BigInt) header[10]; /* Allocate memory for row/col buffers */ if (header[1] == sizeof(hypre_uint32)) { i32buffer = hypre_TAlloc(hypre_uint32, num_nonzeros, HYPRE_MEMORY_HOST); } else if (header[1] == sizeof(hypre_uint64)) { i64buffer = hypre_TAlloc(hypre_uint64, num_nonzeros, HYPRE_MEMORY_HOST); } else { hypre_error_w_msg(HYPRE_ERROR_GENERIC, "Unsupported data type for row/column indices"); return hypre_error_flag; } /* Allocate memory for buffers */ if (header[2] == sizeof(hypre_float)) { f32buffer = hypre_TAlloc(hypre_float, num_nonzeros, HYPRE_MEMORY_HOST); } else if (header[2] == sizeof(hypre_double)) { f64buffer = hypre_TAlloc(hypre_double, num_nonzeros, HYPRE_MEMORY_HOST); } else { hypre_error_w_msg(HYPRE_ERROR_GENERIC, "Unsupported data type for matrix coefficients"); return hypre_error_flag; } /*--------------------------------------------- * Read indices from file *---------------------------------------------*/ count = (size_t) num_nonzeros; rows = hypre_TAlloc(HYPRE_BigInt, num_nonzeros, HYPRE_MEMORY_HOST); if (i32buffer) { if (fread(i32buffer, sizeof(hypre_uint32), count, fp) != count) { hypre_error_w_msg(HYPRE_ERROR_GENERIC, "Could not read all row indices"); return hypre_error_flag; } #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i) HYPRE_SMP_SCHEDULE #endif for (i = 0; i < num_nonzeros; i++) { rows[i] = (HYPRE_BigInt) i32buffer[i]; } } else { if (fread(i64buffer, sizeof(hypre_uint64), count, fp) != count) { hypre_error_w_msg(HYPRE_ERROR_GENERIC, "Could not read all row indices"); return hypre_error_flag; } #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i) HYPRE_SMP_SCHEDULE #endif for (i = 0; i < num_nonzeros; i++) { rows[i] = (HYPRE_BigInt) i64buffer[i]; } } /*--------------------------------------------- * Read column indices from file *---------------------------------------------*/ count = (size_t) num_nonzeros; cols = hypre_TAlloc(HYPRE_BigInt, num_nonzeros, HYPRE_MEMORY_HOST); if (i32buffer) { if (fread(i32buffer, sizeof(hypre_uint32), count, fp) != count) { hypre_error_w_msg(HYPRE_ERROR_GENERIC, "Could not read all column indices"); return hypre_error_flag; } #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i) HYPRE_SMP_SCHEDULE #endif for (i = 0; i < num_nonzeros; i++) { cols[i] = (HYPRE_BigInt) i32buffer[i]; } } else { if (fread(i64buffer, sizeof(hypre_uint64), count, fp) != count) { hypre_error_w_msg(HYPRE_ERROR_GENERIC, "Could not read all column indices"); return hypre_error_flag; } #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i) HYPRE_SMP_SCHEDULE #endif for (i = 0; i < num_nonzeros; i++) { cols[i] = (HYPRE_BigInt) i64buffer[i]; } } /* Free integer buffers */ hypre_TFree(i32buffer, HYPRE_MEMORY_HOST); hypre_TFree(i64buffer, HYPRE_MEMORY_HOST); /*--------------------------------------------- * Read matrix coefficients from file *---------------------------------------------*/ vals = hypre_TAlloc(HYPRE_Complex, num_nonzeros, HYPRE_MEMORY_HOST); if (f32buffer) { if (fread(f32buffer, sizeof(hypre_float), count, fp) != count) { hypre_error_w_msg(HYPRE_ERROR_GENERIC, "Could not read all matrix coefficients"); return hypre_error_flag; } #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i) HYPRE_SMP_SCHEDULE #endif for (i = 0; i < num_nonzeros; i++) { vals[i] = (HYPRE_Complex) f32buffer[i]; } } else { if (fread(f64buffer, sizeof(hypre_double), count, fp) != count) { hypre_error_w_msg(HYPRE_ERROR_GENERIC, "Could not read all matrix coefficients"); return hypre_error_flag; } #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i) HYPRE_SMP_SCHEDULE #endif for (i = 0; i < num_nonzeros; i++) { vals[i] = (HYPRE_Complex) f64buffer[i]; } } /* Close file stream */ fclose(fp); /* Free floating-point buffers */ hypre_TFree(f32buffer, HYPRE_MEMORY_HOST); hypre_TFree(f64buffer, HYPRE_MEMORY_HOST); /*--------------------------------------------- * Build IJMatrix *---------------------------------------------*/ HYPRE_IJMatrixCreate(comm, ilower, iupper, jlower, jupper, &matrix); HYPRE_IJMatrixSetObjectType(matrix, type); HYPRE_IJMatrixInitialize_v2(matrix, HYPRE_MEMORY_HOST); HYPRE_IJMatrixSetValues(matrix, num_nonzeros, NULL, rows, cols, vals); HYPRE_IJMatrixAssemble(matrix); /* Set output pointer */ *matrix_ptr = matrix; /* Free memory */ hypre_TFree(rows, HYPRE_MEMORY_HOST); hypre_TFree(cols, HYPRE_MEMORY_HOST); hypre_TFree(vals, HYPRE_MEMORY_HOST); return hypre_error_flag; } hypre-2.33.0/src/IJ_mv/IJMatrix_isis.c000066400000000000000000000766271477326011500174330ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * IJMatrix_ISIS interface * *****************************************************************************/ #include "_hypre_IJ_mv.h" /****************************************************************************** * * hypre_IJMatrixSetLocalSizeISIS * * sets local number of rows and number of columns of diagonal matrix on * current processor. * *****************************************************************************/ HYPRE_Int hypre_IJMatrixSetLocalSizeISIS(hypre_IJMatrix *matrix, HYPRE_Int local_m, HYPRE_Int local_n) { HYPRE_Int ierr = 0; hypre_AuxParCSRMatrix *aux_data; aux_data = hypre_IJMatrixTranslator(matrix); if (aux_data) { hypre_AuxParCSRMatrixLocalNumRows(aux_data) = local_m; hypre_AuxParCSRMatrixLocalNumCols(aux_data) = local_n; } else { hypre_IJMatrixTranslator(matrix) = hypre_AuxParCSRMatrixCreate(local_m, local_n, NULL); } return ierr; } /****************************************************************************** * * hypre_IJMatrixCreateISIS * * creates AuxParCSRMatrix and ParCSRMatrix if necessary, * generates arrays row_starts and col_starts using either previously * set data local_m and local_n (user defined) or generates them evenly * distributed if not previously defined by user. * *****************************************************************************/ HYPRE_Int hypre_IJMatrixCreateISIS(hypre_IJMatrix *matrix) { MPI_Comm comm = hypre_IJMatrixContext(matrix); HYPRE_BigInt global_m = hypre_IJMatrixM(matrix); HYPRE_BigInt global_n = hypre_IJMatrixN(matrix); hypre_AuxParCSRMatrix *aux_matrix = hypre_IJMatrixTranslator(matrix); HYPRE_Int local_m; HYPRE_Int local_n; HYPRE_Int ierr = 0; HYPRE_BigInt *row_starts; HYPRE_BigInt *col_starts; HYPRE_Int num_cols_offd = 0; HYPRE_Int num_nonzeros_diag = 0; HYPRE_Int num_nonzeros_offd = 0; HYPRE_Int num_procs, my_id; HYPRE_Int equal; HYPRE_Int i; hypre_MPI_Comm_size(comm, &num_procs); hypre_MPI_Comm_rank(comm, &my_id); if (aux_matrix) { local_m = hypre_AuxParCSRMatrixLocalNumRows(aux_matrix); local_n = hypre_AuxParCSRMatrixLocalNumCols(aux_matrix); } else { aux_matrix = hypre_AuxParCSRMatrixCreate(-1, -1, NULL); local_m = -1; local_n = -1; hypre_IJMatrixTranslator(matrix) = aux_matrix; } if (local_m < 0) { row_starts = NULL; } else { row_starts = hypre_CTAlloc(HYPRE_Int, num_procs + 1, HYPRE_MEMORY_HOST); if (my_id == 0 && (HYPRE_BigInt)local_m == global_m) { row_starts[1] = (HYPRE_BigInt)local_m; } else { HYPRE_BigInt big_local_m = (HYPRE_BigInt) local_m; hypre_MPI_Allgather(&big_local_m, 1, HYPRE_MPI_BIG_INT, &row_starts[1], 1, HYPRE_MPI_BIG_INT, comm); } } if (local_n < 0) { col_starts = NULL; } else { col_starts = hypre_CTAlloc(HYPRE_Int, num_procs + 1, HYPRE_MEMORY_HOST); if (my_id == 0 && local_n == global_n) { col_starts[1] = (HYPRE_BigInt)local_n; } else { HYPRE_BigInt big_local_n = (HYPRE_BigInt) local_n; hypre_MPI_Allgather(&big_local_n, 1, HYPRE_MPI_BIG_INT, &col_starts[1], 1, HYPRE_MPI_BIG_INT, comm); } } if (row_starts && col_starts) { equal = 1; for (i = 0; i < num_procs; i++) { row_starts[i + 1] += row_starts[i]; col_starts[i + 1] += col_starts[i]; if (row_starts[i + 1] != col_starts[i + 1]) { equal = 0; } } if (equal) { hypre_TFree(col_starts, HYPRE_MEMORY_HOST); col_starts = row_starts; } } hypre_IJMatrixLocalStorage(matrix) = hypre_ParCSRMatrixCreate(comm, global_m, global_n, row_starts, col_starts, num_cols_offd, num_nonzeros_diag, num_nonzeros_offd); return ierr; } /****************************************************************************** * * hypre_IJMatrixSetRowSizesISIS * *****************************************************************************/ HYPRE_Int hypre_IJMatrixSetRowSizesISIS(hypre_IJMatrix *matrix, HYPRE_Int *sizes) { HYPRE_Int *row_space; HYPRE_Int local_num_rows; HYPRE_Int i; hypre_AuxParCSRMatrix *aux_matrix; aux_matrix = hypre_IJMatrixTranslator(matrix); if (aux_matrix) { local_num_rows = hypre_AuxParCSRMatrixLocalNumRows(aux_matrix); } else { return -1; } row_space = hypre_AuxParCSRMatrixRowSpace(aux_matrix); if (!row_space) { row_space = hypre_CTAlloc(HYPRE_Int, local_num_rows, HYPRE_MEMORY_HOST); } for (i = 0; i < local_num_rows; i++) { row_space[i] = sizes[i]; } hypre_AuxParCSRMatrixRowSpace(aux_matrix) = row_space; return 0; } /****************************************************************************** * * hypre_IJMatrixSetDiagRowSizesISIS * sets diag_i inside the diag part of the ParCSRMatrix, * requires exact sizes for diag * *****************************************************************************/ HYPRE_Int hypre_IJMatrixSetDiagRowSizesISIS(hypre_IJMatrix *matrix, HYPRE_Int *sizes) { HYPRE_Int local_num_rows; HYPRE_Int i; hypre_ParCSRMatrix *par_matrix; hypre_CSRMatrix *diag; HYPRE_Int *diag_i; par_matrix = hypre_IJMatrixLocalStorage(matrix); if (!par_matrix) { return -1; } diag = hypre_ParCSRMatrixDiag(par_matrix); diag_i = hypre_CSRMatrixI(diag); local_num_rows = hypre_CSRMatrixNumRows(diag); if (!diag_i) { diag_i = hypre_CTAlloc(HYPRE_Int, local_num_rows + 1, HYPRE_MEMORY_HOST); } for (i = 0; i < local_num_rows + 1; i++) { diag_i[i] = sizes[i]; } hypre_CSRMatrixI(diag) = diag_i; hypre_CSRMatrixNumNonzeros(diag) = diag_i[local_num_rows]; return 0; } /****************************************************************************** * * hypre_IJMatrixSetOffDiagRowSizesISIS * sets offd_i inside the offd part of the ParCSRMatrix, * requires exact sizes for offd * *****************************************************************************/ HYPRE_Int hypre_IJMatrixSetOffDiagRowSizesISIS(hypre_IJMatrix *matrix, HYPRE_Int *sizes) { HYPRE_Int local_num_rows; HYPRE_Int i; hypre_ParCSRMatrix *par_matrix; hypre_CSRMatrix *offd; HYPRE_Int *offd_i; par_matrix = hypre_IJMatrixLocalStorage(matrix); if (!par_matrix) { return -1; } offd = hypre_ParCSRMatrixOffd(par_matrix); offd_i = hypre_CSRMatrixI(offd); local_num_rows = hypre_CSRMatrixNumRows(offd); if (!offd_i) { offd_i = hypre_CTAlloc(HYPRE_Int, local_num_rows + 1, HYPRE_MEMORY_HOST); } for (i = 0; i < local_num_rows + 1; i++) { offd_i[i] = sizes[i]; } hypre_CSRMatrixI(offd) = offd_i; hypre_CSRMatrixNumNonzeros(offd) = offd_i[local_num_rows]; return 0; } /****************************************************************************** * * hypre_IJMatrixInitializeISIS * * initializes AuxParCSRMatrix and ParCSRMatrix as necessary * *****************************************************************************/ HYPRE_Int hypre_IJMatrixInitializeISIS(hypre_IJMatrix *matrix) { HYPRE_Int ierr = 0; hypre_ParCSRMatrix *par_matrix = hypre_IJMatrixLocalStorage(matrix); hypre_AuxParCSRMatrix *aux_matrix = hypre_IJMatrixTranslator(matrix); HYPRE_Int local_num_rows = hypre_AuxParCSRMatrixLocalNumRows(aux_matrix); HYPRE_Int local_num_cols = hypre_AuxParCSRMatrixLocalNumCols(aux_matrix); HYPRE_Int *row_space = hypre_AuxParCSRMatrixRowSpace(aux_matrix); HYPRE_Int num_nonzeros = hypre_ParCSRMatrixNumNonzeros(par_matrix); HYPRE_Int local_nnz; HYPRE_Int num_procs, my_id; MPI_Comm comm = hypre_IJMatrixContext(matrix); HYPRE_BigInt global_num_rows = hypre_IJMatrixM(matrix); hypre_MPI_Comm_size(comm, &num_procs); hypre_MPI_Comm_rank(comm, &my_id); local_nnz = (num_nonzeros / global_num_rows + 1) * local_num_rows; if (local_num_rows < 0) hypre_AuxParCSRMatrixLocalNumRows(aux_matrix) = hypre_CSRMatrixNumRows(hypre_ParCSRMatrixDiag(par_matrix)); if (local_num_cols < 0) hypre_AuxParCSRMatrixLocalNumCols(aux_matrix) = hypre_CSRMatrixNumCols(hypre_ParCSRMatrixDiag(par_matrix)); ierr = hypre_AuxParCSRMatrixInitialize(aux_matrix); ierr += hypre_ParCSRMatrixBigInitialize(par_matrix); return ierr; } /****************************************************************************** * * hypre_IJMatrixInsertBlockISIS * * inserts a block of values into an IJMatrix, currently it just uses * InsertIJMatrixRowISIS * *****************************************************************************/ HYPRE_Int hypre_IJMatrixInsertBlockISIS(hypre_IJMatrix *matrix, HYPRE_Int m, HYPRE_Int n, HYPRE_BigInt *rows, HYPRE_BigInt *cols, HYPRE_Complex *coeffs) { HYPRE_Int ierr = 0; HYPRE_Int i, in; for (i = 0; i < m; i++) { in = i * n; hypre_IJMatrixInsertRowISIS(matrix, n, rows[i], &cols[in], &coeffs[in]); } return ierr; } /****************************************************************************** * * hypre_IJMatrixAddToBlockISIS * * adds a block of values to an IJMatrix, currently it just uses * AddIJMatrixRowISIS * *****************************************************************************/ HYPRE_Int hypre_IJMatrixAddToBlockISIS(hypre_IJMatrix *matrix, HYPRE_Int m, HYPRE_Int n, HYPRE_BigInt *rows, HYPRE_BigInt *cols, HYPRE_Complex *coeffs) { HYPRE_Int ierr = 0; HYPRE_Int i, in; for (i = 0; i < m; i++) { in = i * n; hypre_IJMatrixAddToRowISIS(matrix, n, rows[i], &cols[in], &coeffs[in]); } return ierr; } /****************************************************************************** * * hypre_IJMatrixInsertRowISIS * * inserts a row into an IJMatrix, * if diag_i and offd_i are known, those values are inserted directly * into the ParCSRMatrix, * if they are not known, an auxiliary structure, AuxParCSRMatrix is used * *****************************************************************************/ HYPRE_Int hypre_IJMatrixInsertRowISIS(hypre_IJMatrix *matrix, HYPRE_Int n, HYPRE_BigInt row, HYPRE_BigInt *indices, HYPRE_Complex *coeffs) { HYPRE_Int ierr = 0; hypre_ParCSRMatrix *par_matrix; hypre_AuxParCSRMatrix *aux_matrix; HYPRE_BigInt *row_starts; HYPRE_BigInt *col_starts; MPI_Comm comm = hypre_IJMatrixContext(matrix); HYPRE_Int num_procs, my_id; HYPRE_Int row_local; HYPRE_BigInt col_0, col_n; HYPRE_Int i, temp; HYPRE_Int *indx_diag, *indx_offd; HYPRE_BigInt **aux_j; HYPRE_BigInt *local_j; HYPRE_Complex **aux_data; HYPRE_Complex *local_data; HYPRE_Int diag_space, offd_space; HYPRE_Int *row_length, *row_space; HYPRE_Int need_aux; HYPRE_Int indx_0; HYPRE_Int diag_indx, offd_indx; hypre_CSRMatrix *diag; HYPRE_Int *diag_i; HYPRE_Int *diag_j; HYPRE_Complex *diag_data; hypre_CSRMatrix *offd; HYPRE_Int *offd_i; HYPRE_BigInt *big_offd_j; HYPRE_Complex *offd_data; hypre_MPI_Comm_size(comm, &num_procs); hypre_MPI_Comm_rank(comm, &my_id); par_matrix = hypre_IJMatrixLocalStorage( matrix ); aux_matrix = hypre_IJMatrixTranslator(matrix); row_space = hypre_AuxParCSRMatrixRowSpace(aux_matrix); row_length = hypre_AuxParCSRMatrixRowLength(aux_matrix); col_n = hypre_ParCSRMatrixFirstColDiag(par_matrix); row_starts = hypre_ParCSRMatrixRowStarts(par_matrix); col_starts = hypre_ParCSRMatrixColStarts(par_matrix); col_0 = col_starts[my_id]; col_n = col_starts[my_id + 1] - 1; need_aux = hypre_AuxParCSRMatrixNeedAux(aux_matrix); if (row >= row_starts[my_id] && row < row_starts[my_id + 1]) { if (need_aux) { row_local = (HYPRE_Int)(row - row_starts[my_id]); /* compute local row number */ aux_j = hypre_AuxParCSRMatrixAuxJ(aux_matrix); aux_data = hypre_AuxParCSRMatrixAuxData(aux_matrix); local_j = aux_j[row_local]; local_data = aux_data[row_local]; row_length[row_local] = n; if ( row_space[row_local] < n) { hypre_TFree(local_j, HYPRE_MEMORY_HOST); hypre_TFree(local_data, HYPRE_MEMORY_HOST); local_j = hypre_CTAlloc(HYPRE_Int, n, HYPRE_MEMORY_HOST); local_data = hypre_CTAlloc(HYPRE_Complex, n, HYPRE_MEMORY_HOST); row_space[row_local] = n; } for (i = 0; i < n; i++) { local_j[i] = indices[i]; local_data[i] = coeffs[i]; } /* make sure first element is diagonal element, if not, find it and exchange it with first element */ if (local_j[0] != row_local) { for (i = 1; i < n; i++) { if (local_j[i] == row_local) { local_j[i] = local_j[0]; local_j[0] = (HYPRE_BigInt)row_local; temp = local_data[0]; local_data[0] = local_data[i]; local_data[i] = temp; break; } } } /* sort data according to column indices, except for first element */ BigQsort1(local_j, local_data, 1, n - 1); } else /* insert immediately into data into ParCSRMatrix structure */ { diag = hypre_ParCSRMatrixDiag(par_matrix); offd = hypre_ParCSRMatrixOffd(par_matrix); diag_i = hypre_CSRMatrixI(diag); diag_j = hypre_CSRMatrixJ(diag); diag_data = hypre_CSRMatrixData(diag); offd_i = hypre_CSRMatrixI(offd); big_offd_j = hypre_CSRMatrixBigJ(offd); offd_data = hypre_CSRMatrixData(offd); offd_indx = offd_i[row_local]; indx_0 = diag_i[row_local]; diag_indx = indx_0 + 1; for (i = 0; i < n; i++) { if (indices[i] < col_0 || indices[i] > col_n)/* insert into offd */ { big_offd_j[offd_indx] = indices[i]; offd_data[offd_indx++] = coeffs[i]; } else if (indices[i] == row) /* diagonal element */ { diag_j[indx_0] = (HYPRE_Int)(indices[i] - col_0); diag_data[indx_0] = coeffs[i]; } else /* insert into diag */ { diag_j[diag_indx] = (HYPRE_Int)(indices[i] - col_0); diag_data[diag_indx++] = coeffs[i]; } } BigQsort1(big_offd_j, offd_data, 0, offd_indx - 1); qsort1(diag_j, diag_data, 1, diag_indx - 1); hypre_AuxParCSRMatrixIndxDiag(aux_matrix)[row_local] = diag_indx; hypre_AuxParCSRMatrixIndxOffd(aux_matrix)[row_local] = offd_indx; } } return ierr; } /****************************************************************************** * * hypre_IJMatrixAddToRowISIS * * adds a row to an IJMatrix before assembly, * *****************************************************************************/ HYPRE_Int hypre_IJMatrixAddToRowISIS(hypre_IJMatrix *matrix, HYPRE_Int n, HYPRE_BigInt row, HYPRE_BigInt *indices, HYPRE_Complex *coeffs) { HYPRE_Int ierr = 0; hypre_ParCSRMatrix *par_matrix; hypre_CSRMatrix *diag, *offd; hypre_AuxParCSRMatrix *aux_matrix; HYPRE_BigInt *row_starts; HYPRE_BigInt *col_starts; MPI_Comm comm = hypre_IJMatrixContext(matrix); HYPRE_Int num_procs, my_id; HYPRE_Int row_local; HYPRE_BigInt col_0, col_n; HYPRE_Int i, temp; HYPRE_Int *indx_diag, *indx_offd; HYPRE_BigInt **aux_j; HYPRE_BigInt *local_j; HYPRE_BigInt *tmp_j, *tmp2_j; HYPRE_Complex **aux_data; HYPRE_Complex *local_data; HYPRE_Complex *tmp_data, *tmp2_data; HYPRE_Int diag_space, offd_space; HYPRE_Int *row_length, *row_space; HYPRE_Int need_aux; HYPRE_Int tmp_indx, indx; HYPRE_Int size, old_size; HYPRE_Int cnt, cnt_diag, cnt_offd, indx_0; HYPRE_Int offd_indx, diag_indx; HYPRE_Int *diag_i; HYPRE_Int *diag_j; HYPRE_Complex *diag_data; HYPRE_Int *offd_i; HYPRE_BigInt *big_offd_j; HYPRE_Complex *offd_data; HYPRE_Int *tmp_diag_i; HYPRE_Int *tmp_diag_j; HYPRE_Complex *tmp_diag_data; HYPRE_Int *tmp_offd_i; HYPRE_BigInt *tmp_offd_j; HYPRE_Complex *tmp_offd_data; hypre_MPI_Comm_size(comm, &num_procs); hypre_MPI_Comm_rank(comm, &my_id); par_matrix = hypre_IJMatrixLocalStorage( matrix ); aux_matrix = hypre_IJMatrixTranslator(matrix); row_space = hypre_AuxParCSRMatrixRowSpace(aux_matrix); row_length = hypre_AuxParCSRMatrixRowLength(aux_matrix); row_starts = hypre_ParCSRMatrixRowStarts(par_matrix); col_starts = hypre_ParCSRMatrixColStarts(par_matrix); col_0 = col_starts[my_id]; col_n = col_starts[my_id + 1] - 1; need_aux = hypre_AuxParCSRMatrixNeedAux(aux_matrix); if (row >= row_starts[my_id] && row < row_starts[my_id + 1]) { if (need_aux) { row_local = (HYPRE_Int)(row - row_starts[my_id]); /* compute local row number */ aux_j = hypre_AuxParCSRMatrixAuxJ(aux_matrix); aux_data = hypre_AuxParCSRMatrixAuxData(aux_matrix); local_j = aux_j[row_local]; local_data = aux_data[row_local]; tmp_j = hypre_CTAlloc(HYPRE_BigInt, n, HYPRE_MEMORY_HOST); tmp_data = hypre_CTAlloc(HYPRE_Complex, n, HYPRE_MEMORY_HOST); tmp_indx = 0; for (i = 0; i < n; i++) { if (indices[i] == row) { local_data[0] += coeffs[i]; } else { tmp_j[tmp_indx] = indices[i]; tmp_data[tmp_indx++] = coeffs[i]; } } BigQsort1(tmp_j, tmp_data, 0, tmp_indx - 1); indx = 0; size = 0; for (i = 1; i < row_length[row_local]; i++) { while (local_j[i] > tmp_j[indx]) { size++; indx++; } if (local_j[i] == tmp_j[indx]) { size++; indx++; } } size += tmp_indx - indx; old_size = row_length[row_local]; row_length[row_local] = size; if ( row_space[row_local] < size) { tmp2_j = hypre_CTAlloc(HYPRE_BigInt, size, HYPRE_MEMORY_HOST); tmp2_data = hypre_CTAlloc(HYPRE_Complex, size, HYPRE_MEMORY_HOST); for (i = 0; i < old_size; i++) { tmp2_j[i] = local_j[i]; tmp2_data[i] = local_data[i]; } hypre_TFree(local_j, HYPRE_MEMORY_HOST); hypre_TFree(local_data, HYPRE_MEMORY_HOST); local_j = tmp2_j; local_data = tmp2_data; row_space[row_local] = n; } /* merge local and tmp into local */ indx = 0; cnt = row_length[row_local]; for (i = 1; i < old_size; i++) { while (local_j[i] > tmp_j[indx]) { local_j[cnt] = tmp_j[indx]; local_data[cnt++] = tmp_data[indx++]; } if (local_j[i] == tmp_j[indx]) { local_j[i] += tmp_j[indx]; local_data[i] += tmp_data[indx++]; } } for (i = indx; i < tmp_indx; i++) { local_j[cnt] = tmp_j[i]; local_data[cnt++] = tmp_data[i]; } /* sort data according to column indices, except for first element */ BigQsort1(local_j, local_data, 1, n - 1); hypre_TFree(tmp_j, HYPRE_MEMORY_HOST); hypre_TFree(tmp_data, HYPRE_MEMORY_HOST); } else /* insert immediately into data into ParCSRMatrix structure */ { offd_indx = hypre_AuxParCSRMatrixIndxOffd(aux_matrix)[row_local]; diag_indx = hypre_AuxParCSRMatrixIndxDiag(aux_matrix)[row_local]; diag = hypre_ParCSRMatrixDiag(par_matrix); diag_i = hypre_CSRMatrixI(diag); diag_j = hypre_CSRMatrixJ(diag); diag_data = hypre_CSRMatrixData(diag); offd = hypre_ParCSRMatrixOffd(par_matrix); offd_i = hypre_CSRMatrixI(offd); big_offd_j = hypre_CSRMatrixBigJ(offd); offd_data = hypre_CSRMatrixData(offd); indx_0 = diag_i[row_local]; diag_indx = indx_0 + 1; tmp_diag_j = hypre_CTAlloc(HYPRE_Int, n, HYPRE_MEMORY_HOST); tmp_diag_data = hypre_CTAlloc(HYPRE_Complex, n, HYPRE_MEMORY_HOST); cnt_diag = 0; tmp_offd_j = hypre_CTAlloc(HYPRE_BigInt, n, HYPRE_MEMORY_HOST); tmp_offd_data = hypre_CTAlloc(HYPRE_Complex, n, HYPRE_MEMORY_HOST); cnt_offd = 0; for (i = 0; i < n; i++) { if (indices[i] < col_0 || indices[i] > col_n)/* insert into offd */ { tmp_offd_j[cnt_offd] = indices[i]; tmp_offd_data[cnt_offd++] = coeffs[i]; } else if (indices[i] == row) /* diagonal element */ { diag_j[indx_0] = (HYPRE_Int)(indices[i] - col_0); diag_data[indx_0] += coeffs[i]; } else /* insert into diag */ { tmp_diag_j[cnt_diag] = (HYPRE_Int)(indices[i] - col_0); tmp_diag_data[cnt_diag++] = coeffs[i]; } } qsort1(tmp_diag_j, tmp_diag_data, 0, cnt_diag - 1); BigQsort1(tmp_offd_j, tmp_offd_data, 0, cnt_offd - 1); diag_indx = hypre_AuxParCSRMatrixIndxDiag(aux_matrix)[row_local]; cnt = diag_indx; indx = 0; for (i = diag_i[row_local] + 1; i < diag_indx; i++) { while (diag_j[i] > tmp_diag_j[indx]) { diag_j[cnt] = tmp_diag_j[indx]; diag_data[cnt++] = tmp_diag_data[indx++]; } if (diag_j[i] == tmp_diag_j[indx]) { diag_j[i] += tmp_diag_j[indx]; diag_data[i] += tmp_diag_data[indx++]; } } for (i = indx; i < cnt_diag; i++) { diag_j[cnt] = tmp_diag_j[i]; diag_data[cnt++] = tmp_diag_data[i]; } /* sort data according to column indices, except for first element */ qsort1(diag_j, diag_data, 1, cnt - 1); hypre_TFree(tmp_diag_j, HYPRE_MEMORY_HOST); hypre_TFree(tmp_diag_data, HYPRE_MEMORY_HOST); hypre_AuxParCSRMatrixIndxOffd(aux_matrix)[row_local] = cnt; offd_indx = hypre_AuxParCSRMatrixIndxOffd(aux_matrix)[row_local]; cnt = offd_indx; indx = 0; for (i = offd_i[row_local] + 1; i < offd_indx; i++) { while (big_offd_j[i] > tmp_offd_j[indx]) { big_offd_j[cnt] = tmp_offd_j[indx]; offd_data[cnt++] = tmp_offd_data[indx++]; } if (big_offd_j[i] == tmp_offd_j[indx]) { big_offd_j[i] += tmp_offd_j[indx]; offd_data[i] += tmp_offd_data[indx++]; } } for (i = indx; i < cnt_offd; i++) { big_offd_j[cnt] = tmp_offd_j[i]; offd_data[cnt++] = tmp_offd_data[i]; } /* sort data according to column indices, except for first element */ BigQsort1(big_offd_j, offd_data, 1, cnt - 1); hypre_TFree(tmp_offd_j, HYPRE_MEMORY_HOST); hypre_TFree(tmp_offd_data, HYPRE_MEMORY_HOST); hypre_AuxParCSRMatrixIndxOffd(aux_matrix)[row_local] = cnt; } } return ierr; } /****************************************************************************** * * hypre_IJMatrixAssembleISIS * * assembles IJMAtrix from AuxParCSRMatrix auxiliary structure *****************************************************************************/ HYPRE_Int hypre_IJMatrixAssembleISIS(hypre_IJMatrix *matrix) { HYPRE_Int ierr = 0; MPI_Comm comm = hypre_IJMatrixContext(matrix); hypre_ParCSRMatrix *par_matrix = hypre_IJMatrixLocalStorage(matrix); hypre_AuxParCSRMatrix *aux_matrix = hypre_IJMatrixTranslator(matrix); hypre_CSRMatrix *diag; hypre_CSRMatrix *offd; HYPRE_Int *diag_i; HYPRE_Int *offd_i; HYPRE_Int *diag_j; HYPRE_Int *offd_j; HYPRE_BigInt *big_offd_j; HYPRE_Complex *diag_data; HYPRE_Complex *offd_data; HYPRE_BigInt *row_starts = hypre_ParCSRMatrixRowStarts(par_matrix); HYPRE_BigInt *col_starts = hypre_ParCSRMatrixColStarts(par_matrix); HYPRE_Int j_indx, cnt, i, j; HYPRE_Int num_cols_offd; HYPRE_BigInt *col_map_offd; HYPRE_Int *row_length; HYPRE_Int *row_space; HYPRE_BigInt **aux_j; HYPRE_Complex **aux_data; HYPRE_Int *indx_diag; HYPRE_Int *indx_offd; HYPRE_Int need_aux = hypre_AuxParCSRMatrixNeedAux(aux_matrix); HYPRE_Int my_id, num_procs; HYPRE_Int num_rows; HYPRE_Int i_diag, i_offd; HYPRE_BigInt *local_j; HYPRE_Complex *local_data; HYPRE_BigInt col_0, col_n; HYPRE_Int nnz_offd; HYPRE_BigInt *aux_offd_j; hypre_MPI_Comm_size(comm, &num_procs); hypre_MPI_Comm_rank(comm, &my_id); num_rows = row_starts[my_id + 1] - row_starts[my_id]; /* move data into ParCSRMatrix if not there already */ if (need_aux) { col_0 = col_starts[my_id]; col_n = col_starts[my_id + 1] - 1; i_diag = 0; i_offd = 0; for (i = 0; i < num_rows; i++) { local_j = aux_j[i]; local_data = aux_data[i]; for (j = 0; j < row_length[i]; j++) { if (local_j[j] < col_0 || local_j[j] > col_n) { i_offd++; } else { i_diag++; } } diag_i[i] = i_diag; offd_i[i] = i_offd; } diag_j = hypre_CTAlloc(HYPRE_Int, i_diag, HYPRE_MEMORY_HOST); diag_data = hypre_CTAlloc(HYPRE_Complex, i_diag, HYPRE_MEMORY_HOST); offd_j = hypre_CTAlloc(HYPRE_BigInt, i_offd, HYPRE_MEMORY_HOST); big_offd_j = hypre_CTAlloc(HYPRE_BigInt, i_offd, HYPRE_MEMORY_HOST); offd_data = hypre_CTAlloc(HYPRE_Complex, i_offd, HYPRE_MEMORY_HOST); i_diag = 0; i_offd = 0; for (i = 0; i < num_rows; i++) { local_j = aux_j[i]; local_data = aux_data[i]; for (j = 0; j < row_length[i]; j++) { if (local_j[j] < col_0 || local_j[j] > col_n) { big_offd_j[i_offd] = local_j[j]; offd_data[i_offd++] = local_data[j]; } else { diag_j[i_diag] = local_j[j]; diag_data[i_diag++] = local_data[j]; } } } hypre_CSRMatrixJ(diag) = diag_j; hypre_CSRMatrixData(diag) = diag_data; hypre_CSRMatrixNumNonzeros(diag) = diag_i[num_rows]; hypre_CSRMatrixBigJ(offd) = big_offd_j; hypre_CSRMatrixJ(offd) = offd_j; hypre_CSRMatrixData(offd) = offd_data; hypre_CSRMatrixNumNonzeros(offd) = offd_i[num_rows]; } /* generate col_map_offd */ nnz_offd = offd_i[num_rows]; aux_offd_j = hypre_CTAlloc(HYPRE_BigInt, nnz_offd, HYPRE_MEMORY_HOST); for (i = 0; i < nnz_offd; i++) { aux_offd_j[i] = big_offd_j[i]; } BigQsort0(aux_offd_j, 0, nnz_offd - 1); num_cols_offd = 1; cnt = 0; for (i = 0; i < nnz_offd - 1; i++) { if (aux_offd_j[i + 1] > aux_offd_j[i]) { cnt++; aux_offd_j[cnt] = aux_offd_j[i + 1]; num_cols_offd++; } } col_map_offd = hypre_CTAlloc(HYPRE_BigInt, num_cols_offd, HYPRE_MEMORY_HOST); for (i = 0; i < num_cols_offd; i++) { col_map_offd[i] = aux_offd_j[i]; } for (i = 0; i < nnz_offd; i++) { offd_j[i] = hypre_BigBinarySearch(col_map_offd, big_offd_j[i], num_cols_offd); } hypre_ParCSRMatrixColMapOffd(par_matrix) = col_map_offd; hypre_CSRMatrixNumCols(offd) = num_cols_offd; hypre_AuxParCSRMatrixDestroy(aux_matrix); hypre_TFree(aux_offd_j, HYPRE_MEMORY_HOST); hypre_TFree(big_offd_j, HYPRE_MEMORY_HOST); hypre_CSRMatrixBigJ(offd) = NULL; return ierr; } /****************************************************************************** * * hypre_IJMatrixDistributeISIS * * takes an IJMatrix generated for one processor and distributes it * across many processors according to row_starts and col_starts, * if row_starts and/or col_starts NULL, it distributes them evenly. * *****************************************************************************/ HYPRE_Int hypre_IJMatrixDistributeISIS(hypre_IJMatrix *matrix, HYPRE_BigInt *row_starts, HYPRE_BigInt *col_starts) { HYPRE_Int ierr = 0; hypre_ParCSRMatrix *old_matrix = hypre_IJMatrixLocalStorage(matrix); hypre_ParCSRMatrix *par_matrix; hypre_CSRMatrix *diag = hypre_ParCSRMatrixDiag(old_matrix); par_matrix = hypre_CSRMatrixToParCSRMatrix(hypre_ParCSRMatrixComm(old_matrix) , diag, row_starts, col_starts); ierr = hypre_ParCSRMatrixDestroy(old_matrix); hypre_IJMatrixLocalStorage(matrix) = par_matrix; return ierr; } /****************************************************************************** * * hypre_IJMatrixApplyISIS * * NOT IMPLEMENTED YET * *****************************************************************************/ HYPRE_Int hypre_IJMatrixApplyISIS(hypre_IJMatrix *matrix, hypre_ParVector *x, hypre_ParVector *b) { HYPRE_Int ierr = 0; return ierr; } /****************************************************************************** * * hypre_IJMatrixDestroyISIS * * frees an IJMatrix * *****************************************************************************/ HYPRE_Int hypre_IJMatrixDestroyISIS(hypre_IJMatrix *matrix) { return hypre_ParCSRMatrixDestroy(hypre_IJMatrixLocalStorage(matrix)); } /****************************************************************************** * * hypre_IJMatrixSetTotalSizeISIS * * sets the total number of nonzeros of matrix, can be somewhat useful * for storage estimates * *****************************************************************************/ HYPRE_Int hypre_IJMatrixSetTotalSizeISIS(hypre_IJMatrix *matrix, HYPRE_Int size) { HYPRE_Int ierr = 0; hypre_ParCSRMatrix *par_matrix; par_matrix = hypre_IJMatrixLocalStorage(matrix); if (!par_matrix) { ierr = hypre_IJMatrixCreateISIS(matrix); par_matrix = hypre_IJMatrixLocalStorage(matrix); } hypre_ParCSRMatrixNumNonzeros(par_matrix) = size; return ierr; } hypre-2.33.0/src/IJ_mv/IJMatrix_parcsr.c000066400000000000000000004704151477326011500177470ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * IJMatrix_ParCSR interface * *****************************************************************************/ #include "_hypre_IJ_mv.h" #include "_hypre_parcsr_mv.h" #include "../HYPRE.h" /****************************************************************************** * * hypre_IJMatrixCreateParCSR * *****************************************************************************/ HYPRE_Int hypre_IJMatrixCreateParCSR(hypre_IJMatrix *matrix) { MPI_Comm comm = hypre_IJMatrixComm(matrix); HYPRE_BigInt *row_partitioning = hypre_IJMatrixRowPartitioning(matrix); HYPRE_BigInt *col_partitioning = hypre_IJMatrixColPartitioning(matrix); hypre_ParCSRMatrix *par_matrix; HYPRE_BigInt row_starts[2]; HYPRE_BigInt col_starts[2]; HYPRE_Int i; if (hypre_IJMatrixGlobalFirstRow(matrix)) { for (i = 0; i < 2; i++) { row_starts[i] = row_partitioning[i] - hypre_IJMatrixGlobalFirstRow(matrix); } } else { for (i = 0; i < 2; i++) { row_starts[i] = row_partitioning[i]; } } if (hypre_IJMatrixGlobalFirstCol(matrix)) { for (i = 0; i < 2; i++) { col_starts[i] = col_partitioning[i] - hypre_IJMatrixGlobalFirstCol(matrix); } } else { for (i = 0; i < 2; i++) { col_starts[i] = col_partitioning[i]; } } par_matrix = hypre_ParCSRMatrixCreate(comm, hypre_IJMatrixGlobalNumRows(matrix), hypre_IJMatrixGlobalNumCols(matrix), row_starts, col_starts, 0, 0, 0); hypre_IJMatrixObject(matrix) = par_matrix; return hypre_error_flag; } /****************************************************************************** * * hypre_IJMatrixSetRowSizesParCSR * *****************************************************************************/ HYPRE_Int hypre_IJMatrixSetRowSizesParCSR(hypre_IJMatrix *matrix, const HYPRE_Int *sizes) { HYPRE_Int local_num_rows, local_num_cols, i, *row_space = NULL; HYPRE_BigInt *row_partitioning = hypre_IJMatrixRowPartitioning(matrix); HYPRE_BigInt *col_partitioning = hypre_IJMatrixColPartitioning(matrix); local_num_rows = (HYPRE_Int)(row_partitioning[1] - row_partitioning[0]); local_num_cols = (HYPRE_Int)(col_partitioning[1] - col_partitioning[0]); hypre_AuxParCSRMatrix *aux_matrix = (hypre_AuxParCSRMatrix *) hypre_IJMatrixTranslator(matrix); if (aux_matrix) { row_space = hypre_AuxParCSRMatrixRowSpace(aux_matrix); } if (!row_space) { row_space = hypre_CTAlloc(HYPRE_Int, local_num_rows, HYPRE_MEMORY_HOST); } for (i = 0; i < local_num_rows; i++) { row_space[i] = sizes[i]; } if (!aux_matrix) { hypre_AuxParCSRMatrixCreate(&aux_matrix, local_num_rows, local_num_cols, row_space); hypre_IJMatrixTranslator(matrix) = aux_matrix; } hypre_AuxParCSRMatrixRowSpace(aux_matrix) = row_space; #if defined(HYPRE_USING_GPU) hypre_AuxParCSRMatrixUsrOnProcElmts(aux_matrix) = 0; for (i = 0; i < local_num_rows; i++) { hypre_AuxParCSRMatrixUsrOnProcElmts(aux_matrix) += sizes[i]; } #endif return hypre_error_flag; } /****************************************************************************** * * hypre_IJMatrixSetDiagOffdSizesParCSR * sets diag_i inside the diag part of the ParCSRMatrix * and offd_i inside the offd part, * requires exact row sizes for diag and offd * *****************************************************************************/ HYPRE_Int hypre_IJMatrixSetDiagOffdSizesParCSR(hypre_IJMatrix *matrix, const HYPRE_Int *diag_sizes, const HYPRE_Int *offd_sizes) { HYPRE_Int local_num_rows, local_num_cols; HYPRE_BigInt *row_partitioning = hypre_IJMatrixRowPartitioning(matrix); HYPRE_BigInt *col_partitioning = hypre_IJMatrixColPartitioning(matrix); local_num_rows = (HYPRE_Int)(row_partitioning[1] - row_partitioning[0]); local_num_cols = (HYPRE_Int)(col_partitioning[1] - col_partitioning[0]); hypre_AuxParCSRMatrix *aux_matrix = (hypre_AuxParCSRMatrix *)hypre_IJMatrixTranslator(matrix); if (!aux_matrix) { hypre_AuxParCSRMatrixCreate(&aux_matrix, local_num_rows, local_num_cols, NULL); hypre_IJMatrixTranslator(matrix) = aux_matrix; } if ( hypre_AuxParCSRMatrixDiagSizes(aux_matrix) == NULL) { hypre_AuxParCSRMatrixDiagSizes(aux_matrix) = hypre_TAlloc(HYPRE_Int, local_num_rows, HYPRE_MEMORY_HOST); } if ( hypre_AuxParCSRMatrixOffdSizes(aux_matrix) == NULL) { hypre_AuxParCSRMatrixOffdSizes(aux_matrix) = hypre_TAlloc(HYPRE_Int, local_num_rows, HYPRE_MEMORY_HOST); } hypre_TMemcpy(hypre_AuxParCSRMatrixDiagSizes(aux_matrix), diag_sizes, HYPRE_Int, local_num_rows, HYPRE_MEMORY_HOST, HYPRE_MEMORY_HOST); hypre_TMemcpy(hypre_AuxParCSRMatrixOffdSizes(aux_matrix), offd_sizes, HYPRE_Int, local_num_rows, HYPRE_MEMORY_HOST, HYPRE_MEMORY_HOST); hypre_AuxParCSRMatrixNeedAux(aux_matrix) = 0; return hypre_error_flag; } /****************************************************************************** * * hypre_IJMatrixSetMaxOnProcElmtsParCSR * *****************************************************************************/ HYPRE_Int hypre_IJMatrixSetMaxOnProcElmtsParCSR(hypre_IJMatrix *matrix, HYPRE_Int max_on_proc_elmts) { #if defined(HYPRE_USING_GPU) MPI_Comm comm = hypre_IJMatrixComm(matrix); HYPRE_BigInt *row_partitioning = hypre_IJMatrixRowPartitioning(matrix); HYPRE_BigInt *col_partitioning = hypre_IJMatrixColPartitioning(matrix); hypre_AuxParCSRMatrix *aux_matrix; HYPRE_Int local_num_rows, local_num_cols, my_id; hypre_MPI_Comm_rank(comm, &my_id); aux_matrix = (hypre_AuxParCSRMatrix *) hypre_IJMatrixTranslator(matrix); if (!aux_matrix) { local_num_rows = (HYPRE_Int)(row_partitioning[1] - row_partitioning[0]); local_num_cols = (HYPRE_Int)(col_partitioning[1] - col_partitioning[0]); hypre_AuxParCSRMatrixCreate(&aux_matrix, local_num_rows, local_num_cols, NULL); hypre_IJMatrixTranslator(matrix) = aux_matrix; } hypre_AuxParCSRMatrixUsrOnProcElmts(aux_matrix) = max_on_proc_elmts; #else HYPRE_UNUSED_VAR(matrix); HYPRE_UNUSED_VAR(max_on_proc_elmts); #endif return hypre_error_flag; } /****************************************************************************** * * hypre_IJMatrixSetMaxOffProcElmtsParCSR * *****************************************************************************/ HYPRE_Int hypre_IJMatrixSetMaxOffProcElmtsParCSR(hypre_IJMatrix *matrix, HYPRE_Int max_off_proc_elmts) { hypre_AuxParCSRMatrix *aux_matrix; HYPRE_Int local_num_rows, local_num_cols, my_id; HYPRE_BigInt *row_partitioning = hypre_IJMatrixRowPartitioning(matrix); HYPRE_BigInt *col_partitioning = hypre_IJMatrixColPartitioning(matrix); MPI_Comm comm = hypre_IJMatrixComm(matrix); hypre_MPI_Comm_rank(comm, &my_id); aux_matrix = (hypre_AuxParCSRMatrix *) hypre_IJMatrixTranslator(matrix); if (!aux_matrix) { local_num_rows = (HYPRE_Int)(row_partitioning[1] - row_partitioning[0]); local_num_cols = (HYPRE_Int)(col_partitioning[1] - col_partitioning[0]); hypre_AuxParCSRMatrixCreate(&aux_matrix, local_num_rows, local_num_cols, NULL); hypre_IJMatrixTranslator(matrix) = aux_matrix; } hypre_AuxParCSRMatrixMaxOffProcElmts(aux_matrix) = max_off_proc_elmts; #if defined(HYPRE_USING_GPU) hypre_AuxParCSRMatrixUsrOffProcElmts(aux_matrix) = max_off_proc_elmts; #endif return hypre_error_flag; } /****************************************************************************** * * hypre_IJMatrixSetInitAllocationParCSR * *****************************************************************************/ HYPRE_Int hypre_IJMatrixSetInitAllocationParCSR(hypre_IJMatrix *matrix, HYPRE_Int factor) { #if defined(HYPRE_USING_GPU) hypre_AuxParCSRMatrix *aux_matrix = (hypre_AuxParCSRMatrix *) hypre_IJMatrixTranslator(matrix); HYPRE_BigInt *row_partitioning = hypre_IJMatrixRowPartitioning(matrix); HYPRE_BigInt *col_partitioning = hypre_IJMatrixColPartitioning(matrix); if (!aux_matrix) { HYPRE_Int local_num_rows = (HYPRE_Int)(row_partitioning[1] - row_partitioning[0]); HYPRE_Int local_num_cols = (HYPRE_Int)(col_partitioning[1] - col_partitioning[0]); hypre_AuxParCSRMatrixCreate(&aux_matrix, local_num_rows, local_num_cols, NULL); hypre_IJMatrixTranslator(matrix) = aux_matrix; } hypre_AuxParCSRMatrixInitAllocFactor(aux_matrix) = factor; #else HYPRE_UNUSED_VAR(matrix); HYPRE_UNUSED_VAR(factor); #endif return hypre_error_flag; } /****************************************************************************** * * hypre_IJMatrixSetEarlyAssembleParCSR * *****************************************************************************/ HYPRE_Int hypre_IJMatrixSetEarlyAssembleParCSR(hypre_IJMatrix *matrix, HYPRE_Int early_assemble) { #if defined(HYPRE_USING_GPU) hypre_AuxParCSRMatrix *aux_matrix = (hypre_AuxParCSRMatrix *) hypre_IJMatrixTranslator(matrix); HYPRE_BigInt *row_partitioning = hypre_IJMatrixRowPartitioning(matrix); HYPRE_BigInt *col_partitioning = hypre_IJMatrixColPartitioning(matrix); if (!aux_matrix) { HYPRE_Int local_num_rows = (HYPRE_Int)(row_partitioning[1] - row_partitioning[0]); HYPRE_Int local_num_cols = (HYPRE_Int)(col_partitioning[1] - col_partitioning[0]); hypre_AuxParCSRMatrixCreate(&aux_matrix, local_num_rows, local_num_cols, NULL); hypre_IJMatrixTranslator(matrix) = aux_matrix; } hypre_AuxParCSRMatrixEarlyAssemble(aux_matrix) = early_assemble; #else HYPRE_UNUSED_VAR(matrix); HYPRE_UNUSED_VAR(early_assemble); #endif return hypre_error_flag; } /****************************************************************************** * * hypre_IJMatrixSetGrowFactorParCSR * *****************************************************************************/ HYPRE_Int hypre_IJMatrixSetGrowFactorParCSR(hypre_IJMatrix *matrix, HYPRE_Real factor) { #if defined(HYPRE_USING_GPU) hypre_AuxParCSRMatrix *aux_matrix = (hypre_AuxParCSRMatrix *) hypre_IJMatrixTranslator(matrix); HYPRE_BigInt *row_partitioning = hypre_IJMatrixRowPartitioning(matrix); HYPRE_BigInt *col_partitioning = hypre_IJMatrixColPartitioning(matrix); if (!aux_matrix) { HYPRE_Int local_num_rows = (HYPRE_Int)(row_partitioning[1] - row_partitioning[0]); HYPRE_Int local_num_cols = (HYPRE_Int)(col_partitioning[1] - col_partitioning[0]); hypre_AuxParCSRMatrixCreate(&aux_matrix, local_num_rows, local_num_cols, NULL); hypre_IJMatrixTranslator(matrix) = aux_matrix; } hypre_AuxParCSRMatrixGrowFactor(aux_matrix) = factor; #else HYPRE_UNUSED_VAR(matrix); HYPRE_UNUSED_VAR(factor); #endif return hypre_error_flag; } /****************************************************************************** * * hypre_IJMatrixInitializeParCSR * * initializes AuxParCSRMatrix and ParCSRMatrix as necessary * *****************************************************************************/ HYPRE_Int hypre_IJMatrixInitializeParCSR(hypre_IJMatrix *matrix) { return hypre_IJMatrixInitializeParCSR_v2(matrix, hypre_HandleMemoryLocation(hypre_handle())); } HYPRE_Int hypre_IJMatrixInitializeParCSR_v2(hypre_IJMatrix *matrix, HYPRE_MemoryLocation memory_location) { hypre_ParCSRMatrix *par_matrix = (hypre_ParCSRMatrix *) hypre_IJMatrixObject(matrix); hypre_AuxParCSRMatrix *aux_matrix = (hypre_AuxParCSRMatrix *) hypre_IJMatrixTranslator(matrix); HYPRE_MemoryLocation memory_location_aux = hypre_GetExecPolicy1(memory_location) == HYPRE_EXEC_HOST ? HYPRE_MEMORY_HOST : HYPRE_MEMORY_DEVICE; if (hypre_IJMatrixAssembleFlag(matrix) == 0) { if (!par_matrix) { hypre_IJMatrixCreateParCSR(matrix); par_matrix = (hypre_ParCSRMatrix *) hypre_IJMatrixObject(matrix); } HYPRE_Int local_num_rows = hypre_ParCSRMatrixNumRows(par_matrix); HYPRE_Int i; hypre_CSRMatrix *diag = hypre_ParCSRMatrixDiag(par_matrix); hypre_CSRMatrix *offd = hypre_ParCSRMatrixOffd(par_matrix); if (!aux_matrix) { hypre_AuxParCSRMatrixCreate(&aux_matrix, local_num_rows, hypre_ParCSRMatrixNumCols(par_matrix), NULL); hypre_IJMatrixTranslator(matrix) = aux_matrix; } hypre_ParCSRMatrixInitialize_v2(par_matrix, memory_location); hypre_AuxParCSRMatrixInitialize_v2(aux_matrix, memory_location_aux); #if defined(HYPRE_USING_GPU) if (hypre_GetExecPolicy1(memory_location_aux) == HYPRE_EXEC_HOST) #endif { if (hypre_AuxParCSRMatrixDiagSizes(aux_matrix)) { for (i = 0; i < local_num_rows; i++) { hypre_CSRMatrixI(diag)[i + 1] = hypre_CSRMatrixI(diag)[i] + hypre_AuxParCSRMatrixDiagSizes(aux_matrix)[i]; } hypre_CSRMatrixNumNonzeros(diag) = hypre_CSRMatrixI(diag)[local_num_rows]; hypre_CSRMatrixInitialize_v2(diag, 0, memory_location); } if (hypre_AuxParCSRMatrixOffdSizes(aux_matrix)) { for (i = 0; i < local_num_rows; i++) { hypre_CSRMatrixI(offd)[i + 1] = hypre_CSRMatrixI(offd)[i] + hypre_AuxParCSRMatrixOffdSizes(aux_matrix)[i]; } hypre_CSRMatrixNumNonzeros(offd) = hypre_CSRMatrixI(offd)[local_num_rows]; hypre_CSRMatrixInitialize_v2(offd, 0, memory_location); } } if (!hypre_AuxParCSRMatrixNeedAux(aux_matrix)) { #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i) HYPRE_SMP_SCHEDULE #endif for (i = 0; i < local_num_rows; i++) { hypre_AuxParCSRMatrixIndxDiag(aux_matrix)[i] = hypre_CSRMatrixI(diag)[i]; hypre_AuxParCSRMatrixIndxOffd(aux_matrix)[i] = hypre_CSRMatrixI(offd)[i]; } } } else if ( memory_location_aux == HYPRE_MEMORY_HOST ) { /* AB 4/06 - the assemble routine destroys the aux matrix - so we need to recreate if initialize is called again */ if (!aux_matrix) { hypre_AuxParCSRMatrixCreate(&aux_matrix, hypre_ParCSRMatrixNumRows(par_matrix), hypre_ParCSRMatrixNumCols(par_matrix), NULL); hypre_AuxParCSRMatrixMemoryLocation(aux_matrix) = HYPRE_MEMORY_HOST; hypre_AuxParCSRMatrixNeedAux(aux_matrix) = 0; hypre_IJMatrixTranslator(matrix) = aux_matrix; } } return hypre_error_flag; } /****************************************************************************** * * hypre_IJMatrixGetRowCountsParCSR * * gets the number of columns for rows specified by the user * *****************************************************************************/ HYPRE_Int hypre_IJMatrixGetRowCountsParCSR( hypre_IJMatrix *matrix, HYPRE_Int nrows, HYPRE_BigInt *rows, HYPRE_Int *ncols) { HYPRE_BigInt row_index; MPI_Comm comm = hypre_IJMatrixComm(matrix); hypre_ParCSRMatrix *par_matrix = (hypre_ParCSRMatrix *) hypre_IJMatrixObject(matrix); HYPRE_BigInt *row_partitioning = hypre_IJMatrixRowPartitioning(matrix); hypre_CSRMatrix *diag = hypre_ParCSRMatrixDiag(par_matrix); HYPRE_Int *diag_i = hypre_CSRMatrixI(diag); hypre_CSRMatrix *offd = hypre_ParCSRMatrixOffd(par_matrix); HYPRE_Int *offd_i = hypre_CSRMatrixI(offd); HYPRE_Int i, my_id, index; HYPRE_Int print_level = hypre_IJMatrixPrintLevel(matrix); hypre_MPI_Comm_rank(comm, &my_id); #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i, row_index) HYPRE_SMP_SCHEDULE #endif for (i = 0; i < nrows; i++) { row_index = rows[i]; if (row_index >= row_partitioning[0] && row_index < row_partitioning[1]) { /* compute local row number */ index = (HYPRE_Int)(row_index - row_partitioning[0]); ncols[i] = diag_i[index + 1] - diag_i[index] + offd_i[index + 1] - offd_i[index]; } else { ncols[i] = 0; if (print_level) { hypre_printf ("Warning! Row %b is not on Proc. %d!\n", row_index, my_id); } } } return hypre_error_flag; } /****************************************************************************** * * hypre_IJMatrixGetValuesParCSR * * gets values of an IJMatrix * *****************************************************************************/ HYPRE_Int hypre_IJMatrixGetValuesParCSR( hypre_IJMatrix *matrix, HYPRE_Int nrows, HYPRE_Int *ncols, HYPRE_BigInt *rows, HYPRE_Int *row_indexes, HYPRE_BigInt *cols, HYPRE_Complex *values, HYPRE_Int zero_out) { MPI_Comm comm = hypre_IJMatrixComm(matrix); hypre_ParCSRMatrix *par_matrix = (hypre_ParCSRMatrix *) hypre_IJMatrixObject(matrix); HYPRE_Int assemble_flag = hypre_IJMatrixAssembleFlag(matrix); hypre_CSRMatrix *diag; HYPRE_Int *diag_i = NULL; HYPRE_Int *diag_j = NULL; HYPRE_Complex *diag_data = NULL; hypre_CSRMatrix *offd; HYPRE_Int *offd_i = NULL; HYPRE_Int *offd_j = NULL; HYPRE_Complex *offd_data = NULL; HYPRE_BigInt *col_map_offd = NULL; HYPRE_BigInt *col_starts = hypre_ParCSRMatrixColStarts(par_matrix); HYPRE_BigInt *row_partitioning = hypre_IJMatrixRowPartitioning(matrix); HYPRE_Int i, j, n, ii, indx; HYPRE_Int num_procs, my_id; HYPRE_BigInt col_0, col_n, row, col_indx, first; HYPRE_Int row_local, row_size; HYPRE_Int warning = 0; HYPRE_Int *counter; HYPRE_Int print_level = hypre_IJMatrixPrintLevel(matrix); hypre_MPI_Comm_size(comm, &num_procs); hypre_MPI_Comm_rank(comm, &my_id); if (assemble_flag == 0) { hypre_error_in_arg(1); if (print_level) { hypre_printf("Error! Matrix not assembled yet! HYPRE_IJMatrixGetValues\n"); } } col_0 = col_starts[0]; col_n = col_starts[1] - 1; first = hypre_IJMatrixGlobalFirstCol(matrix); diag = hypre_ParCSRMatrixDiag(par_matrix); diag_i = hypre_CSRMatrixI(diag); diag_j = hypre_CSRMatrixJ(diag); diag_data = hypre_CSRMatrixData(diag); offd = hypre_ParCSRMatrixOffd(par_matrix); offd_i = hypre_CSRMatrixI(offd); if (num_procs > 1) { offd_j = hypre_CSRMatrixJ(offd); offd_data = hypre_CSRMatrixData(offd); col_map_offd = hypre_ParCSRMatrixColMapOffd(par_matrix); } if (nrows < 0) { nrows = -nrows; counter = hypre_CTAlloc(HYPRE_Int, nrows + 1, HYPRE_MEMORY_HOST); counter[0] = 0; for (i = 0; i < nrows; i++) { counter[i + 1] = counter[i] + ncols[i]; } indx = 0; for (i = 0; i < nrows; i++) { row = rows[i]; if (row >= row_partitioning[0] && row < row_partitioning[1]) { row_local = (HYPRE_Int)(row - row_partitioning[0]); row_size = diag_i[row_local + 1] - diag_i[row_local] + offd_i[row_local + 1] - offd_i[row_local]; if (counter[i] + row_size > counter[nrows]) { hypre_error_in_arg(1); if (print_level) { hypre_printf ("Error! Not enough memory! HYPRE_IJMatrixGetValues\n"); } } if (ncols[i] < row_size) { warning = 1; } for (j = diag_i[row_local]; j < diag_i[row_local + 1]; j++) { cols[indx] = (HYPRE_BigInt)diag_j[j] + col_0; values[indx++] = diag_data[j]; if (zero_out) { diag_data[j] = 0.0; } } for (j = offd_i[row_local]; j < offd_i[row_local + 1]; j++) { cols[indx] = col_map_offd[offd_j[j]]; values[indx++] = offd_data[j]; if (zero_out) { offd_data[j] = 0.0; } } counter[i + 1] = indx; } else { if (print_level) { hypre_printf ("Warning! Row %b is not on Proc. %d!\n", row, my_id); } } } if (warning) { for (i = 0; i < nrows; i++) { ncols[i] = counter[i + 1] - counter[i]; } if (print_level) { hypre_printf ("Warning! ncols has been changed!\n"); } } hypre_TFree(counter, HYPRE_MEMORY_HOST); } else { indx = 0; for (ii = 0; ii < nrows; ii++) { row = rows[ii]; n = ncols[ii]; if (n == 0) /* empty row */ { continue; } indx = (row_indexes) ? row_indexes[ii] : indx; if (row >= row_partitioning[0] && row < row_partitioning[1]) { row_local = (HYPRE_Int)(row - row_partitioning[0]); /* compute local row number */ for (i = 0; i < n; i++) { col_indx = cols[indx] - first; values[indx] = 0.0; if (col_indx < col_0 || col_indx > col_n) /* search in offd */ { for (j = offd_i[row_local]; j < offd_i[row_local + 1]; j++) { if (col_map_offd[offd_j[j]] == col_indx) { values[indx] = offd_data[j]; if (zero_out) { offd_data[j] = 0.0; } break; } } } else /* search in diag */ { col_indx = col_indx - col_0; for (j = diag_i[row_local]; j < diag_i[row_local + 1]; j++) { if (diag_j[j] == (HYPRE_Int)col_indx) { values[indx] = diag_data[j]; if (zero_out) { diag_data[j] = 0.0; } break; } } } indx++; } } else { if (print_level) { hypre_printf ("Warning! Row %b is not on Proc. %d!\n", row, my_id); } } } } return hypre_error_flag; } /****************************************************************************** * * hypre_IJMatrixSetValuesParCSR * * sets values in an IJMatrix before assembly, * *****************************************************************************/ HYPRE_Int hypre_IJMatrixSetValuesParCSR( hypre_IJMatrix *matrix, HYPRE_Int nrows, HYPRE_Int *ncols, const HYPRE_BigInt *rows, const HYPRE_Int *row_indexes, const HYPRE_BigInt *cols, const HYPRE_Complex *values ) { hypre_ParCSRMatrix *par_matrix; hypre_CSRMatrix *diag, *offd; hypre_AuxParCSRMatrix *aux_matrix; HYPRE_BigInt *row_partitioning; HYPRE_BigInt *col_partitioning; MPI_Comm comm = hypre_IJMatrixComm(matrix); HYPRE_Int num_procs, my_id; HYPRE_Int row_local; //HYPRE_Int row_len; HYPRE_BigInt col_0, col_n, row; HYPRE_Int i, ii, j, n, not_found; //HYPRE_Int col_indx, cnt1; HYPRE_BigInt **aux_j; HYPRE_BigInt *local_j; HYPRE_BigInt *tmp_j; HYPRE_Complex **aux_data; HYPRE_Complex *local_data; HYPRE_Complex *tmp_data = NULL; HYPRE_Int diag_space, offd_space; HYPRE_Int *row_length, *row_space; HYPRE_Int need_aux; HYPRE_Int tmp_indx, indx; HYPRE_Int space, size, old_size; HYPRE_Int cnt, cnt_diag, cnt_offd; HYPRE_Int pos_diag, pos_offd; HYPRE_Int len_diag, len_offd; HYPRE_Int offd_indx, diag_indx; HYPRE_Int *diag_i = NULL; HYPRE_Int *diag_j = NULL; HYPRE_Complex *diag_data = NULL; HYPRE_Int *offd_i = NULL; HYPRE_Int *offd_j = NULL; HYPRE_Complex *offd_data = NULL; HYPRE_BigInt first; /*HYPRE_Int current_num_elmts;*/ /*HYPRE_Int max_off_proc_elmts;*/ //HYPRE_Int off_proc_i_indx; //HYPRE_BigInt *off_proc_i; //HYPRE_BigInt *off_proc_j; HYPRE_Int print_level = hypre_IJMatrixPrintLevel(matrix); /*HYPRE_Complex *off_proc_data;*/ hypre_MPI_Comm_size(comm, &num_procs); hypre_MPI_Comm_rank(comm, &my_id); par_matrix = (hypre_ParCSRMatrix *) hypre_IJMatrixObject( matrix ); row_partitioning = hypre_IJMatrixRowPartitioning(matrix); col_partitioning = hypre_IJMatrixColPartitioning(matrix); col_0 = col_partitioning[0]; col_n = col_partitioning[1] - 1; first = hypre_IJMatrixGlobalFirstCol(matrix); if (nrows < 0) { hypre_error_in_arg(2); if (print_level) { hypre_printf("Error! nrows negative! HYPRE_IJMatrixSetValues\n"); } } if (hypre_IJMatrixAssembleFlag(matrix)) /* matrix already assembled*/ { HYPRE_BigInt *col_map_offd = NULL; HYPRE_Int num_cols_offd; HYPRE_Int j_offd; for (ii = 0; ii < nrows; ii++) { row = rows[ii]; n = ncols ? ncols[ii] : 1; if (n == 0) /* empty row */ { continue; } indx = row_indexes[ii]; /* processor owns the row */ if (row >= row_partitioning[0] && row < row_partitioning[1]) { row_local = (HYPRE_Int)(row - row_partitioning[0]); /* compute local row number */ diag = hypre_ParCSRMatrixDiag(par_matrix); diag_i = hypre_CSRMatrixI(diag); diag_j = hypre_CSRMatrixJ(diag); diag_data = hypre_CSRMatrixData(diag); offd = hypre_ParCSRMatrixOffd(par_matrix); offd_i = hypre_CSRMatrixI(offd); num_cols_offd = hypre_CSRMatrixNumCols(offd); if (num_cols_offd) { col_map_offd = hypre_ParCSRMatrixColMapOffd(par_matrix); offd_j = hypre_CSRMatrixJ(offd); offd_data = hypre_CSRMatrixData(offd); } size = diag_i[row_local + 1] - diag_i[row_local] + offd_i[row_local + 1] - offd_i[row_local]; if (n > size) /* Should we change this and allow this? This could be same column index, i.e. only last value is set, previous ones overwritten. */ { hypre_error(HYPRE_ERROR_GENERIC); if (print_level) { hypre_printf (" row %b too long! \n", row); } return hypre_error_flag; } pos_diag = diag_i[row_local]; pos_offd = offd_i[row_local]; len_diag = diag_i[row_local + 1]; len_offd = offd_i[row_local + 1]; not_found = 1; for (i = 0; i < n; i++) { if (cols[indx] < col_0 || cols[indx] > col_n) /* insert into offd */ { j_offd = hypre_BigBinarySearch(col_map_offd, cols[indx] - first, num_cols_offd); if (j_offd == -1) { hypre_error(HYPRE_ERROR_GENERIC); if (print_level) { hypre_printf (" Error, element %b %b does not exist\n", row, cols[indx]); } return hypre_error_flag; } for (j = pos_offd; j < len_offd; j++) { if (offd_j[j] == j_offd) { offd_data[j] = values[indx]; not_found = 0; break; } } if (not_found) { hypre_error(HYPRE_ERROR_GENERIC); if (print_level) { hypre_printf (" Error, element %b %b does not exist\n", row, cols[indx]); } return hypre_error_flag; } not_found = 1; } /* diagonal element */ else if (cols[indx] == row) { if (diag_j[pos_diag] != row_local) { hypre_error(HYPRE_ERROR_GENERIC); if (print_level) { hypre_printf (" Error, element %b %b does not exist\n", row, cols[indx]); } /* return -1;*/ return hypre_error_flag; } diag_data[pos_diag] = values[indx]; } else /* insert into diag */ { for (j = pos_diag; j < len_diag; j++) { if (diag_j[j] == (HYPRE_Int)(cols[indx] - col_0)) { diag_data[j] = values[indx]; not_found = 0; break; } } if (not_found) { hypre_error(HYPRE_ERROR_GENERIC); if (print_level) { hypre_printf (" Error, element %b %b does not exist\n", row, cols[indx]); } /* return -1; */ return hypre_error_flag; } } indx++; } } } } else { aux_matrix = (hypre_AuxParCSRMatrix *) hypre_IJMatrixTranslator(matrix); row_space = hypre_AuxParCSRMatrixRowSpace(aux_matrix); row_length = hypre_AuxParCSRMatrixRowLength(aux_matrix); need_aux = hypre_AuxParCSRMatrixNeedAux(aux_matrix); for (ii = 0; ii < nrows; ii++) { row = rows[ii]; n = ncols ? ncols[ii] : 1; if (n == 0) /* empty row */ { continue; } indx = row_indexes[ii]; /* processor owns the row */ if (row >= row_partitioning[0] && row < row_partitioning[1]) { row_local = (HYPRE_Int)(row - row_partitioning[0]); /* compute local row number */ if (need_aux) { aux_j = hypre_AuxParCSRMatrixAuxJ(aux_matrix); aux_data = hypre_AuxParCSRMatrixAuxData(aux_matrix); local_j = aux_j[row_local]; local_data = aux_data[row_local]; space = row_space[row_local]; old_size = row_length[row_local]; size = space - old_size; if (size < n) { size = n - size; tmp_j = hypre_CTAlloc(HYPRE_BigInt, size, HYPRE_MEMORY_HOST); tmp_data = hypre_CTAlloc(HYPRE_Complex, size, HYPRE_MEMORY_HOST); } else { tmp_j = NULL; } tmp_indx = 0; not_found = 1; size = old_size; for (i = 0; i < n; i++) { for (j = 0; j < old_size; j++) { if (local_j[j] == cols[indx]) { local_data[j] = values[indx]; not_found = 0; break; } } if (not_found) { if (size < space) { local_j[size] = cols[indx]; local_data[size++] = values[indx]; } else { tmp_j[tmp_indx] = cols[indx]; tmp_data[tmp_indx++] = values[indx]; } } not_found = 1; indx++; } row_length[row_local] = size + tmp_indx; if (tmp_indx) { aux_j[row_local] = hypre_TReAlloc(aux_j[row_local], HYPRE_BigInt, size + tmp_indx, HYPRE_MEMORY_HOST); aux_data[row_local] = hypre_TReAlloc(aux_data[row_local], HYPRE_Complex, size + tmp_indx, HYPRE_MEMORY_HOST); row_space[row_local] = size + tmp_indx; local_j = aux_j[row_local]; local_data = aux_data[row_local]; } cnt = size; for (i = 0; i < tmp_indx; i++) { local_j[cnt] = tmp_j[i]; local_data[cnt++] = tmp_data[i]; } if (tmp_j) { hypre_TFree(tmp_j, HYPRE_MEMORY_HOST); hypre_TFree(tmp_data, HYPRE_MEMORY_HOST); } } else /* insert immediately into data in ParCSRMatrix structure */ { HYPRE_BigInt *big_offd_j = NULL; HYPRE_Int col_j; offd_indx = hypre_AuxParCSRMatrixIndxOffd(aux_matrix)[row_local]; diag_indx = hypre_AuxParCSRMatrixIndxDiag(aux_matrix)[row_local]; diag = hypre_ParCSRMatrixDiag(par_matrix); diag_i = hypre_CSRMatrixI(diag); diag_j = hypre_CSRMatrixJ(diag); diag_data = hypre_CSRMatrixData(diag); offd = hypre_ParCSRMatrixOffd(par_matrix); offd_i = hypre_CSRMatrixI(offd); if (num_procs > 1) { big_offd_j = hypre_CSRMatrixBigJ(offd); offd_data = hypre_CSRMatrixData(offd); if (!big_offd_j) { big_offd_j = hypre_CTAlloc(HYPRE_BigInt, offd_i[hypre_CSRMatrixNumRows(offd)], hypre_CSRMatrixMemoryLocation(offd)); hypre_CSRMatrixBigJ(offd) = big_offd_j; } } cnt_diag = diag_indx; cnt_offd = offd_indx; diag_space = diag_i[row_local + 1]; offd_space = offd_i[row_local + 1]; not_found = 1; for (i = 0; i < n; i++) { if (cols[indx] < col_0 || cols[indx] > col_n) /* insert into offd */ { for (j = offd_i[row_local]; j < offd_indx; j++) { if (big_offd_j[j] == cols[indx]) { offd_data[j] = values[indx]; not_found = 0; break; } } if (not_found) { if (cnt_offd < offd_space) { big_offd_j[cnt_offd] = cols[indx]; offd_data[cnt_offd++] = values[indx]; } else { hypre_error(HYPRE_ERROR_GENERIC); if (print_level) { hypre_printf("Error in row %b ! Too many elements!\n", row); } /* return 1; */ return hypre_error_flag; } } not_found = 1; } else /* insert into diag */ { col_j = (HYPRE_Int)(cols[indx] - col_0); for (j = diag_i[row_local]; j < diag_indx; j++) { if (diag_j[j] == col_j) { diag_data[j] = values[indx]; not_found = 0; break; } } if (not_found) { if (cnt_diag < diag_space) { diag_j[cnt_diag] = col_j; diag_data[cnt_diag++] = values[indx]; } else { hypre_error(HYPRE_ERROR_GENERIC); if (print_level) { hypre_printf("Error in row %b ! Too many elements !\n", row); } /* return 1; */ return hypre_error_flag; } } not_found = 1; } indx++; } hypre_AuxParCSRMatrixIndxDiag(aux_matrix)[row_local] = cnt_diag; hypre_AuxParCSRMatrixIndxOffd(aux_matrix)[row_local] = cnt_offd; } } } } HYPRE_PRINT_MEMORY_USAGE(comm); return hypre_error_flag; } /****************************************************************************** * * hypre_IJMatrixSetConstantValuesParCSR * * sets all values in an already assembled IJMatrix to a constant value. * *****************************************************************************/ void hypre_IJMatrixSetConstantValuesParCSRHost( hypre_IJMatrix *matrix, HYPRE_Complex value ) { hypre_ParCSRMatrix *par_matrix = (hypre_ParCSRMatrix *) hypre_IJMatrixObject( matrix ); hypre_CSRMatrix *diag = hypre_ParCSRMatrixDiag(par_matrix); hypre_CSRMatrix *offd = hypre_ParCSRMatrixOffd(par_matrix); HYPRE_Complex *diag_data = hypre_CSRMatrixData(diag); HYPRE_Complex *offd_data = hypre_CSRMatrixData(offd); HYPRE_Int nnz_diag = hypre_CSRMatrixNumNonzeros(diag); HYPRE_Int nnz_offd = hypre_CSRMatrixNumNonzeros(offd); HYPRE_Int ii; #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(ii) HYPRE_SMP_SCHEDULE #endif for (ii = 0; ii < nnz_diag; ii++) { diag_data[ii] = value; } #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(ii) HYPRE_SMP_SCHEDULE #endif for (ii = 0; ii < nnz_offd; ii++) { offd_data[ii] = value; } } HYPRE_Int hypre_IJMatrixSetConstantValuesParCSR( hypre_IJMatrix *matrix, HYPRE_Complex value ) { if (hypre_IJMatrixAssembleFlag(matrix)) /* matrix already assembled*/ { #if defined(HYPRE_USING_GPU) if (hypre_GetExecPolicy1(hypre_IJMatrixMemoryLocation(matrix)) == HYPRE_EXEC_DEVICE) { hypre_IJMatrixSetConstantValuesParCSRDevice(matrix, value); } else #endif { hypre_IJMatrixSetConstantValuesParCSRHost(matrix, value); } } else { hypre_error_w_msg(HYPRE_ERROR_GENERIC, "Matrix not assembled! Required to set constant values!"); } return hypre_error_flag; } /****************************************************************************** * * hypre_IJMatrixAddToValuesParCSR * * adds row values to an IJMatrix * *****************************************************************************/ HYPRE_Int hypre_IJMatrixAddToValuesParCSR( hypre_IJMatrix *matrix, HYPRE_Int nrows, HYPRE_Int *ncols, const HYPRE_BigInt *rows, const HYPRE_Int *row_indexes, const HYPRE_BigInt *cols, const HYPRE_Complex *values ) { hypre_ParCSRMatrix *par_matrix; hypre_CSRMatrix *diag, *offd; hypre_AuxParCSRMatrix *aux_matrix; HYPRE_BigInt *row_partitioning; HYPRE_BigInt *col_partitioning; MPI_Comm comm = hypre_IJMatrixComm(matrix); HYPRE_Int num_procs, my_id; HYPRE_Int row_local; HYPRE_BigInt row; HYPRE_BigInt col_0, col_n; HYPRE_Int i, ii, j, n, not_found; HYPRE_BigInt **aux_j; HYPRE_BigInt *local_j; HYPRE_BigInt *tmp_j; HYPRE_Complex **aux_data; HYPRE_Complex *local_data; HYPRE_Complex *tmp_data = NULL; HYPRE_Int diag_space, offd_space; HYPRE_Int *row_length, *row_space; HYPRE_Int need_aux; HYPRE_Int tmp_indx, indx; HYPRE_Int space, size, old_size; HYPRE_Int cnt, cnt_diag, cnt_offd; HYPRE_Int pos_diag, pos_offd; HYPRE_Int len_diag, len_offd; HYPRE_Int offd_indx, diag_indx; HYPRE_BigInt first; HYPRE_Int *diag_i = NULL; HYPRE_Int *diag_j = NULL; HYPRE_Complex *diag_data = NULL; HYPRE_Int *offd_i = NULL; HYPRE_Int *offd_j = NULL; HYPRE_Complex *offd_data = NULL; HYPRE_Int current_num_elmts; HYPRE_Int max_off_proc_elmts; HYPRE_Int off_proc_i_indx; HYPRE_BigInt *off_proc_i; HYPRE_BigInt *off_proc_j; HYPRE_Complex *off_proc_data; HYPRE_Int print_level = hypre_IJMatrixPrintLevel(matrix); hypre_MPI_Comm_size(comm, &num_procs); hypre_MPI_Comm_rank(comm, &my_id); par_matrix = (hypre_ParCSRMatrix *) hypre_IJMatrixObject( matrix ); row_partitioning = hypre_IJMatrixRowPartitioning(matrix); col_partitioning = hypre_IJMatrixColPartitioning(matrix); col_0 = col_partitioning[0]; col_n = col_partitioning[1] - 1; first = hypre_IJMatrixGlobalFirstCol(matrix); if (hypre_IJMatrixAssembleFlag(matrix)) { HYPRE_Int num_cols_offd; HYPRE_BigInt *col_map_offd = NULL; HYPRE_Int j_offd; /* AB - 4/06 - need to get this object*/ aux_matrix = (hypre_AuxParCSRMatrix *) hypre_IJMatrixTranslator(matrix); for (ii = 0; ii < nrows; ii++) { row = rows[ii]; n = ncols ? ncols[ii] : 1; if (n == 0) /* empty row */ { continue; } indx = row_indexes[ii]; if (row >= row_partitioning[0] && row < row_partitioning[1]) { row_local = (HYPRE_Int)(row - row_partitioning[0]); /* compute local row number */ diag = hypre_ParCSRMatrixDiag(par_matrix); diag_i = hypre_CSRMatrixI(diag); diag_j = hypre_CSRMatrixJ(diag); diag_data = hypre_CSRMatrixData(diag); offd = hypre_ParCSRMatrixOffd(par_matrix); offd_i = hypre_CSRMatrixI(offd); num_cols_offd = hypre_CSRMatrixNumCols(offd); if (num_cols_offd) { col_map_offd = hypre_ParCSRMatrixColMapOffd(par_matrix); offd_j = hypre_CSRMatrixJ(offd); offd_data = hypre_CSRMatrixData(offd); } size = diag_i[row_local + 1] - diag_i[row_local] + offd_i[row_local + 1] - offd_i[row_local]; if (n > size) /* Should we change this and allow this? This could be same column index, i.e. only last value is set, previous ones overwritten. */ { hypre_error(HYPRE_ERROR_GENERIC); if (print_level) { hypre_printf (" row %b too long! \n", row); } return hypre_error_flag; } pos_diag = diag_i[row_local]; pos_offd = offd_i[row_local]; len_diag = diag_i[row_local + 1]; len_offd = offd_i[row_local + 1]; not_found = 1; for (i = 0; i < n; i++) { if (cols[indx] < col_0 || cols[indx] > col_n) /* insert into offd */ { j_offd = hypre_BigBinarySearch(col_map_offd, cols[indx] - first, num_cols_offd); if (j_offd == -1) { hypre_error(HYPRE_ERROR_GENERIC); if (print_level) { hypre_printf (" Error, element %b %b does not exist\n", row, cols[indx]); } return hypre_error_flag; /* return -1; */ } for (j = pos_offd; j < len_offd; j++) { if (offd_j[j] == j_offd) { offd_data[j] += values[indx]; not_found = 0; break; } } if (not_found) { hypre_error(HYPRE_ERROR_GENERIC); if (print_level) { hypre_printf (" Error, element %b %b does not exist\n", row, cols[indx]); } return hypre_error_flag; } not_found = 1; } /* diagonal element */ else if (cols[indx] == row) { if (diag_j[pos_diag] != row_local) { hypre_error(HYPRE_ERROR_GENERIC); if (print_level) { hypre_printf (" Error, element %b %b does not exist\n", row, cols[indx]); } return hypre_error_flag; } diag_data[pos_diag] += values[indx]; } else /* insert into diag */ { for (j = pos_diag; j < len_diag; j++) { if (diag_j[j] == (HYPRE_Int)(cols[indx] - col_0)) { diag_data[j] += values[indx]; not_found = 0; break; } } if (not_found) { hypre_error(HYPRE_ERROR_GENERIC); if (print_level) { hypre_printf (" Error, element %b %b does not exist\n", row, cols[indx]); } return hypre_error_flag; } } indx++; } } /* not my row */ else { if (!aux_matrix) { size = (HYPRE_Int)(row_partitioning[1] - row_partitioning[0]); hypre_AuxParCSRMatrixCreate(&aux_matrix, size, size, NULL); hypre_AuxParCSRMatrixNeedAux(aux_matrix) = 0; hypre_IJMatrixTranslator(matrix) = aux_matrix; } current_num_elmts = hypre_AuxParCSRMatrixCurrentOffProcElmts(aux_matrix); max_off_proc_elmts = hypre_AuxParCSRMatrixMaxOffProcElmts(aux_matrix); off_proc_i_indx = hypre_AuxParCSRMatrixOffProcIIndx(aux_matrix); off_proc_i = hypre_AuxParCSRMatrixOffProcI(aux_matrix); off_proc_j = hypre_AuxParCSRMatrixOffProcJ(aux_matrix); off_proc_data = hypre_AuxParCSRMatrixOffProcData(aux_matrix); if (!max_off_proc_elmts) { max_off_proc_elmts = hypre_max(n, 1000); hypre_AuxParCSRMatrixMaxOffProcElmts(aux_matrix) = max_off_proc_elmts; hypre_AuxParCSRMatrixOffProcI(aux_matrix) = hypre_CTAlloc(HYPRE_BigInt, 2 * max_off_proc_elmts, HYPRE_MEMORY_HOST); hypre_AuxParCSRMatrixOffProcJ(aux_matrix) = hypre_CTAlloc(HYPRE_BigInt, max_off_proc_elmts, HYPRE_MEMORY_HOST); hypre_AuxParCSRMatrixOffProcData(aux_matrix) = hypre_CTAlloc(HYPRE_Complex, max_off_proc_elmts, HYPRE_MEMORY_HOST); off_proc_i = hypre_AuxParCSRMatrixOffProcI(aux_matrix); off_proc_j = hypre_AuxParCSRMatrixOffProcJ(aux_matrix); off_proc_data = hypre_AuxParCSRMatrixOffProcData(aux_matrix); } else if (current_num_elmts + n > max_off_proc_elmts) { max_off_proc_elmts += 3 * n; off_proc_i = hypre_TReAlloc(off_proc_i, HYPRE_BigInt, 2 * max_off_proc_elmts, HYPRE_MEMORY_HOST); off_proc_j = hypre_TReAlloc(off_proc_j, HYPRE_BigInt, max_off_proc_elmts, HYPRE_MEMORY_HOST); off_proc_data = hypre_TReAlloc(off_proc_data, HYPRE_Complex, max_off_proc_elmts, HYPRE_MEMORY_HOST); hypre_AuxParCSRMatrixMaxOffProcElmts(aux_matrix) = max_off_proc_elmts; hypre_AuxParCSRMatrixOffProcI(aux_matrix) = off_proc_i; hypre_AuxParCSRMatrixOffProcJ(aux_matrix) = off_proc_j; hypre_AuxParCSRMatrixOffProcData(aux_matrix) = off_proc_data; } /* AB - 4/6 - the row should be negative to indicate an add */ /* UMY - 12/28/09 - now positive since we eliminated the feature of setting on other processors */ /* off_proc_i[off_proc_i_indx++] = row; */ off_proc_i[off_proc_i_indx++] = row; off_proc_i[off_proc_i_indx++] = n; for (i = 0; i < n; i++) { off_proc_j[current_num_elmts] = cols[indx]; off_proc_data[current_num_elmts++] = values[indx++]; } hypre_AuxParCSRMatrixOffProcIIndx(aux_matrix) = off_proc_i_indx; hypre_AuxParCSRMatrixCurrentOffProcElmts(aux_matrix) = current_num_elmts; } } } /* not assembled */ else { aux_matrix = (hypre_AuxParCSRMatrix *) hypre_IJMatrixTranslator(matrix); row_space = hypre_AuxParCSRMatrixRowSpace(aux_matrix); row_length = hypre_AuxParCSRMatrixRowLength(aux_matrix); need_aux = hypre_AuxParCSRMatrixNeedAux(aux_matrix); for (ii = 0; ii < nrows; ii++) { row = rows[ii]; n = ncols ? ncols[ii] : 1; if (n == 0) /* empty row */ { continue; } indx = row_indexes[ii]; if (row >= row_partitioning[0] && row < row_partitioning[1]) { row_local = (HYPRE_Int)(row - row_partitioning[0]); /* compute local row number */ if (need_aux) { aux_j = hypre_AuxParCSRMatrixAuxJ(aux_matrix); aux_data = hypre_AuxParCSRMatrixAuxData(aux_matrix); local_j = aux_j[row_local]; local_data = aux_data[row_local]; space = row_space[row_local]; old_size = row_length[row_local]; size = space - old_size; if (size < n) { size = n - size; tmp_j = hypre_CTAlloc(HYPRE_BigInt, size, HYPRE_MEMORY_HOST); tmp_data = hypre_CTAlloc(HYPRE_Complex, size, HYPRE_MEMORY_HOST); } else { tmp_j = NULL; } tmp_indx = 0; not_found = 1; size = old_size; for (i = 0; i < n; i++) { for (j = 0; j < old_size; j++) { if (local_j[j] == cols[indx]) { local_data[j] += values[indx]; not_found = 0; break; } } if (not_found) { if (size < space) { local_j[size] = cols[indx]; local_data[size++] = values[indx]; } else { tmp_j[tmp_indx] = cols[indx]; tmp_data[tmp_indx++] = values[indx]; } } not_found = 1; indx++; } row_length[row_local] = size + tmp_indx; if (tmp_indx) { aux_j[row_local] = hypre_TReAlloc(aux_j[row_local], HYPRE_BigInt, size + tmp_indx, HYPRE_MEMORY_HOST); aux_data[row_local] = hypre_TReAlloc(aux_data[row_local], HYPRE_Complex, size + tmp_indx, HYPRE_MEMORY_HOST); row_space[row_local] = size + tmp_indx; local_j = aux_j[row_local]; local_data = aux_data[row_local]; } cnt = size; for (i = 0; i < tmp_indx; i++) { local_j[cnt] = tmp_j[i]; local_data[cnt++] = tmp_data[i]; } if (tmp_j) { hypre_TFree(tmp_j, HYPRE_MEMORY_HOST); hypre_TFree(tmp_data, HYPRE_MEMORY_HOST); } } else /* insert immediately into data in ParCSRMatrix structure */ { HYPRE_BigInt *big_offd_j = NULL; offd_indx = hypre_AuxParCSRMatrixIndxOffd(aux_matrix)[row_local]; diag_indx = hypre_AuxParCSRMatrixIndxDiag(aux_matrix)[row_local]; diag = hypre_ParCSRMatrixDiag(par_matrix); diag_i = hypre_CSRMatrixI(diag); diag_j = hypre_CSRMatrixJ(diag); diag_data = hypre_CSRMatrixData(diag); offd = hypre_ParCSRMatrixOffd(par_matrix); offd_i = hypre_CSRMatrixI(offd); if (num_procs > 1) { big_offd_j = hypre_CSRMatrixBigJ(offd); offd_data = hypre_CSRMatrixData(offd); if (!big_offd_j) { big_offd_j = hypre_CTAlloc(HYPRE_BigInt, offd_i[hypre_CSRMatrixNumRows(offd)], hypre_CSRMatrixMemoryLocation(offd)); hypre_CSRMatrixBigJ(offd) = big_offd_j; } } cnt_diag = diag_indx; cnt_offd = offd_indx; diag_space = diag_i[row_local + 1]; offd_space = offd_i[row_local + 1]; not_found = 1; for (i = 0; i < n; i++) { if (cols[indx] < col_0 || cols[indx] > col_n) /* insert into offd */ { for (j = offd_i[row_local]; j < offd_indx; j++) { if (big_offd_j[j] == cols[indx]) { offd_data[j] += values[indx]; not_found = 0; break; } } if (not_found) { if (cnt_offd < offd_space) { big_offd_j[cnt_offd] = cols[indx]; offd_data[cnt_offd++] = values[indx]; } else { hypre_error(HYPRE_ERROR_GENERIC); if (print_level) { hypre_printf("Error in row %b ! Too many elements!\n", row); } /* return 1;*/ return hypre_error_flag; } } not_found = 1; } else /* insert into diag */ { HYPRE_Int col_j = (HYPRE_Int)( cols[indx] - col_0); for (j = diag_i[row_local]; j < diag_indx; j++) { if (diag_j[j] == col_j) { diag_data[j] += values[indx]; not_found = 0; break; } } if (not_found) { if (cnt_diag < diag_space) { diag_j[cnt_diag] = col_j; diag_data[cnt_diag++] = values[indx]; } else { hypre_error(HYPRE_ERROR_GENERIC); if (print_level) { hypre_printf("Error in row %b ! Too many elements !\n", row); } /* return 1; */ return hypre_error_flag; } } not_found = 1; } indx++; } hypre_AuxParCSRMatrixIndxDiag(aux_matrix)[row_local] = cnt_diag; hypre_AuxParCSRMatrixIndxOffd(aux_matrix)[row_local] = cnt_offd; } } /* not my row */ else { current_num_elmts = hypre_AuxParCSRMatrixCurrentOffProcElmts(aux_matrix); max_off_proc_elmts = hypre_AuxParCSRMatrixMaxOffProcElmts(aux_matrix); off_proc_i_indx = hypre_AuxParCSRMatrixOffProcIIndx(aux_matrix); off_proc_i = hypre_AuxParCSRMatrixOffProcI(aux_matrix); off_proc_j = hypre_AuxParCSRMatrixOffProcJ(aux_matrix); off_proc_data = hypre_AuxParCSRMatrixOffProcData(aux_matrix); if (!max_off_proc_elmts) { max_off_proc_elmts = hypre_max(n, 1000); hypre_AuxParCSRMatrixMaxOffProcElmts(aux_matrix) = max_off_proc_elmts; hypre_AuxParCSRMatrixOffProcI(aux_matrix) = hypre_CTAlloc(HYPRE_BigInt, 2 * max_off_proc_elmts, HYPRE_MEMORY_HOST); hypre_AuxParCSRMatrixOffProcJ(aux_matrix) = hypre_CTAlloc(HYPRE_BigInt, max_off_proc_elmts, HYPRE_MEMORY_HOST); hypre_AuxParCSRMatrixOffProcData(aux_matrix) = hypre_CTAlloc(HYPRE_Complex, max_off_proc_elmts, HYPRE_MEMORY_HOST); off_proc_i = hypre_AuxParCSRMatrixOffProcI(aux_matrix); off_proc_j = hypre_AuxParCSRMatrixOffProcJ(aux_matrix); off_proc_data = hypre_AuxParCSRMatrixOffProcData(aux_matrix); } else if (current_num_elmts + n > max_off_proc_elmts) { max_off_proc_elmts += 3 * n; off_proc_i = hypre_TReAlloc(off_proc_i, HYPRE_BigInt, 2 * max_off_proc_elmts, HYPRE_MEMORY_HOST); off_proc_j = hypre_TReAlloc(off_proc_j, HYPRE_BigInt, max_off_proc_elmts, HYPRE_MEMORY_HOST); off_proc_data = hypre_TReAlloc(off_proc_data, HYPRE_Complex, max_off_proc_elmts, HYPRE_MEMORY_HOST); hypre_AuxParCSRMatrixMaxOffProcElmts(aux_matrix) = max_off_proc_elmts; hypre_AuxParCSRMatrixOffProcI(aux_matrix) = off_proc_i; hypre_AuxParCSRMatrixOffProcJ(aux_matrix) = off_proc_j; hypre_AuxParCSRMatrixOffProcData(aux_matrix) = off_proc_data; } off_proc_i[off_proc_i_indx++] = row; off_proc_i[off_proc_i_indx++] = n; for (i = 0; i < n; i++) { off_proc_j[current_num_elmts] = cols[indx]; off_proc_data[current_num_elmts++] = values[indx++]; } hypre_AuxParCSRMatrixOffProcIIndx(aux_matrix) = off_proc_i_indx; hypre_AuxParCSRMatrixCurrentOffProcElmts(aux_matrix) = current_num_elmts; } } } HYPRE_PRINT_MEMORY_USAGE(comm); return hypre_error_flag; } /****************************************************************************** * * hypre_IJMatrixDestroyParCSR * * frees an IJMatrix * *****************************************************************************/ HYPRE_Int hypre_IJMatrixDestroyParCSR(hypre_IJMatrix *matrix) { hypre_ParCSRMatrixDestroy((hypre_ParCSRMatrix *)hypre_IJMatrixObject(matrix)); hypre_AuxParCSRMatrixDestroy((hypre_AuxParCSRMatrix*)hypre_IJMatrixTranslator(matrix)); /* Reset pointers to NULL */ hypre_IJMatrixObject(matrix) = NULL; hypre_IJMatrixTranslator(matrix) = NULL; return hypre_error_flag; } /****************************************************************************** * * hypre_IJMatrixTransposeParCSR * * Tranposes an IJMatrix of type ParCSRMatrix * *****************************************************************************/ HYPRE_Int hypre_IJMatrixTransposeParCSR( hypre_IJMatrix *matrix_A, hypre_IJMatrix *matrix_AT ) { hypre_ParCSRMatrix *par_A = (hypre_ParCSRMatrix*) hypre_IJMatrixObject(matrix_A); hypre_ParCSRMatrix *par_AT; /* Free old object if existent */ if (hypre_IJMatrixObject(matrix_AT)) { par_AT = (hypre_ParCSRMatrix*) hypre_IJMatrixObject(matrix_AT); hypre_ParCSRMatrixDestroy(par_AT); hypre_IJMatrixObject(matrix_AT) = NULL; } hypre_ParCSRMatrixTranspose(par_A, &par_AT, 1); hypre_ParCSRMatrixSetNumNonzeros(par_AT); hypre_ParCSRMatrixSetDNumNonzeros(par_AT); hypre_MatvecCommPkgCreate(par_AT); hypre_IJMatrixObject(matrix_AT) = (void *) par_AT; return hypre_error_flag; } /****************************************************************************** * * hypre_IJMatrixNormParCSR * * Computes the Infinity norm of an IJMatrix of type ParCSRMatrix * * TODO: Add other norms * *****************************************************************************/ HYPRE_Int hypre_IJMatrixNormParCSR( hypre_IJMatrix *matrix, HYPRE_Real *norm ) { hypre_ParCSRMatrix *par_matrix = (hypre_ParCSRMatrix*) hypre_IJMatrixObject(matrix); hypre_ParCSRMatrixInfNorm(par_matrix, norm); return hypre_error_flag; } /****************************************************************************** * * hypre_IJMatrixAddParCSR * * Performs C = alpha*A + beta*B, where A, B and C are IJMatrices of * type ParCSRMatrix. * *****************************************************************************/ HYPRE_Int hypre_IJMatrixAddParCSR( HYPRE_Complex alpha, hypre_IJMatrix *matrix_A, HYPRE_Complex beta, hypre_IJMatrix *matrix_B, hypre_IJMatrix *matrix_C ) { hypre_ParCSRMatrix *par_A = (hypre_ParCSRMatrix*) hypre_IJMatrixObject(matrix_A); hypre_ParCSRMatrix *par_B = (hypre_ParCSRMatrix*) hypre_IJMatrixObject(matrix_B); hypre_ParCSRMatrix *par_C; /* Free old object if existent */ if (hypre_IJMatrixObject(matrix_C)) { par_C = (hypre_ParCSRMatrix*) hypre_IJMatrixObject(matrix_C); hypre_ParCSRMatrixDestroy(par_C); hypre_IJMatrixObject(matrix_C) = NULL; } hypre_ParCSRMatrixAdd(alpha, par_A, beta, par_B, &par_C); hypre_ParCSRMatrixSetNumNonzeros(par_C); hypre_ParCSRMatrixSetDNumNonzeros(par_C); if (!hypre_ParCSRMatrixCommPkg(par_C)) { hypre_MatvecCommPkgCreate(par_C); } hypre_IJMatrixObject(matrix_C) = (void *) par_C; return hypre_error_flag; } /****************************************************************************** * * hypre_IJMatrixAssembleOffProcValsParCSR * * This is for handling set and get values calls to off-proc. entries - * it is called from matrix assemble. There is an alternate version for * when the assumed partition is being used. * *****************************************************************************/ HYPRE_Int hypre_IJMatrixAssembleOffProcValsParCSR( hypre_IJMatrix *matrix, HYPRE_Int off_proc_i_indx, HYPRE_Int max_off_proc_elmts, HYPRE_Int current_num_elmts, HYPRE_MemoryLocation memory_location, HYPRE_BigInt *off_proc_i, HYPRE_BigInt *off_proc_j, HYPRE_Complex *off_proc_data ) { HYPRE_UNUSED_VAR(max_off_proc_elmts); MPI_Comm comm = hypre_IJMatrixComm(matrix); HYPRE_Int i, j, k, in_i; HYPRE_Int myid; HYPRE_Int proc_id, last_proc, prev_id, tmp_id; HYPRE_Int max_response_size; HYPRE_BigInt global_num_cols; HYPRE_BigInt global_first_col; HYPRE_BigInt global_first_row; HYPRE_Int ex_num_contacts = 0, num_rows = 0; HYPRE_BigInt range_start, range_end; HYPRE_Int num_elements; HYPRE_Int storage; HYPRE_Int indx; HYPRE_BigInt row; HYPRE_Int num_ranges, row_index = 0; HYPRE_Int num_recvs; HYPRE_BigInt upper_bound; HYPRE_Int counter; HYPRE_Int num_real_procs; HYPRE_Int /*current_proc,*/ original_proc_indx; HYPRE_BigInt *row_list = NULL; HYPRE_BigInt *row_list_num_elements = NULL; HYPRE_Int *a_proc_id = NULL, *orig_order = NULL; HYPRE_Int *real_proc_id = NULL, *us_real_proc_id = NULL; HYPRE_Int *ex_contact_procs = NULL, *ex_contact_vec_starts = NULL; HYPRE_BigInt *ex_contact_buf = NULL; HYPRE_Int *recv_starts = NULL; HYPRE_BigInt *response_buf = NULL; HYPRE_Int *response_buf_starts = NULL; HYPRE_Int *num_rows_per_proc = NULL, *num_elements_total = NULL; HYPRE_Int *argsort_contact_procs = NULL; HYPRE_Int obj_size_bytes, complex_size; HYPRE_BigInt big_int_size; HYPRE_Int tmp_int; HYPRE_BigInt tmp_big_int; HYPRE_BigInt *col_ptr; HYPRE_BigInt *big_int_data = NULL; HYPRE_Int big_int_data_size = 0, complex_data_size = 0; void *void_contact_buf = NULL; void *index_ptr; void *recv_data_ptr; HYPRE_Complex tmp_complex; HYPRE_Complex *col_data_ptr; HYPRE_Complex *complex_data = NULL; hypre_DataExchangeResponse response_obj1, response_obj2; hypre_ProcListElements send_proc_obj; hypre_IJAssumedPart *apart; hypre_MPI_Comm_rank(comm, &myid); global_num_cols = hypre_IJMatrixGlobalNumCols(matrix); global_first_col = hypre_IJMatrixGlobalFirstCol(matrix); global_first_row = hypre_IJMatrixGlobalFirstRow(matrix); if (memory_location == HYPRE_MEMORY_DEVICE) { HYPRE_BigInt *tmp = hypre_TAlloc(HYPRE_BigInt, current_num_elmts, HYPRE_MEMORY_HOST); HYPRE_BigInt *off_proc_i_h = hypre_TAlloc(HYPRE_BigInt, 2 * current_num_elmts, HYPRE_MEMORY_HOST); HYPRE_BigInt *off_proc_j_h = hypre_TAlloc(HYPRE_BigInt, current_num_elmts, HYPRE_MEMORY_HOST); HYPRE_Complex *off_proc_data_h = hypre_TAlloc(HYPRE_Complex, current_num_elmts, HYPRE_MEMORY_HOST); hypre_TMemcpy(tmp, off_proc_i, HYPRE_BigInt, current_num_elmts, HYPRE_MEMORY_HOST, HYPRE_MEMORY_DEVICE); hypre_TMemcpy(off_proc_j_h, off_proc_j, HYPRE_BigInt, current_num_elmts, HYPRE_MEMORY_HOST, HYPRE_MEMORY_DEVICE); hypre_TMemcpy(off_proc_data_h, off_proc_data, HYPRE_Complex, current_num_elmts, HYPRE_MEMORY_HOST, HYPRE_MEMORY_DEVICE); for (i = 0; i < current_num_elmts; i++) { #if defined(HYPRE_DEBUG) hypre_assert(tmp[i] < hypre_IJMatrixRowPartitioning(matrix)[0] || tmp[i] >= hypre_IJMatrixRowPartitioning(matrix)[1]); hypre_assert(tmp[i] >= global_first_row && tmp[i] < global_first_row + hypre_IJMatrixGlobalNumRows(matrix)); hypre_assert(off_proc_j_h[i] >= global_first_col && off_proc_j_h[i] < global_first_col + global_num_cols); #endif off_proc_i_h[2 * i] = tmp[i]; off_proc_i_h[2 * i + 1] = 1; } off_proc_i_indx = current_num_elmts * 2; off_proc_i = off_proc_i_h; off_proc_j = off_proc_j_h; off_proc_data = off_proc_data_h; hypre_TFree(tmp, HYPRE_MEMORY_HOST); } /* call hypre_IJMatrixAddToValuesParCSR directly inside this function * with one chunk of data */ HYPRE_Int off_proc_nelm_recv_cur = 0; HYPRE_Int off_proc_nelm_recv_max = 0; HYPRE_BigInt *off_proc_i_recv = NULL; HYPRE_BigInt *off_proc_j_recv = NULL; HYPRE_Complex *off_proc_data_recv = NULL; HYPRE_BigInt *off_proc_i_recv_d = NULL; HYPRE_BigInt *off_proc_j_recv_d = NULL; HYPRE_Complex *off_proc_data_recv_d = NULL; num_rows = off_proc_i_indx / 2; /* verify that we have created the assumed partition */ if (hypre_IJMatrixAssumedPart(matrix) == NULL) { hypre_IJMatrixCreateAssumedPartition(matrix); } apart = (hypre_IJAssumedPart*) hypre_IJMatrixAssumedPart(matrix); /*if (hypre_ParCSRMatrixAssumedPartition(par_matrix) == NULL) { hypre_ParCSRMatrixCreateAssumedPartition(par_matrix); } apart = hypre_ParCSRMatrixAssumedPartition(par_matrix);*/ row_list = hypre_CTAlloc(HYPRE_BigInt, num_rows, HYPRE_MEMORY_HOST); row_list_num_elements = hypre_CTAlloc(HYPRE_BigInt, num_rows, HYPRE_MEMORY_HOST); a_proc_id = hypre_CTAlloc(HYPRE_Int, num_rows, HYPRE_MEMORY_HOST); orig_order = hypre_CTAlloc(HYPRE_Int, num_rows, HYPRE_MEMORY_HOST); real_proc_id = hypre_CTAlloc(HYPRE_Int, num_rows, HYPRE_MEMORY_HOST); /* get the assumed processor id for each row */ if (num_rows > 0 ) { for (i = 0; i < num_rows; i++) { row = off_proc_i[i * 2]; //if (row < 0) row = -row - 1; row_list[i] = row; row_list_num_elements[i] = off_proc_i[i * 2 + 1]; hypre_GetAssumedPartitionProcFromRow(comm, row, global_first_row, global_num_cols, &proc_id); a_proc_id[i] = proc_id; orig_order[i] = i; } /* now we need to find the actual order of each row - sort on row - this will result in proc ids sorted also...*/ hypre_BigQsortb2i(row_list, a_proc_id, orig_order, 0, num_rows - 1); /* calculate the number of contacts */ ex_num_contacts = 1; last_proc = a_proc_id[0]; for (i = 1; i < num_rows; i++) { if (a_proc_id[i] > last_proc) { ex_num_contacts++; last_proc = a_proc_id[i]; } } } /* now we will go through a create a contact list - need to contact assumed processors and find out who the actual row owner is - we will contact with a range (2 numbers) */ ex_contact_procs = hypre_CTAlloc(HYPRE_Int, ex_num_contacts, HYPRE_MEMORY_HOST); ex_contact_vec_starts = hypre_CTAlloc(HYPRE_Int, ex_num_contacts + 1, HYPRE_MEMORY_HOST); ex_contact_buf = hypre_CTAlloc(HYPRE_BigInt, ex_num_contacts * 2, HYPRE_MEMORY_HOST); counter = 0; range_end = -1; for (i = 0; i < num_rows; i++) { if (row_list[i] > range_end) { /* assumed proc */ proc_id = a_proc_id[i]; /* end of prev. range */ if (counter > 0) { ex_contact_buf[counter * 2 - 1] = row_list[i - 1]; } /*start new range*/ ex_contact_procs[counter] = proc_id; ex_contact_vec_starts[counter] = counter * 2; ex_contact_buf[counter * 2] = row_list[i]; counter++; hypre_GetAssumedPartitionRowRange(comm, proc_id, global_first_col, global_num_cols, &range_start, &range_end); } } /* finish the starts */ ex_contact_vec_starts[counter] = counter * 2; /* finish the last range */ if (counter > 0) { ex_contact_buf[counter * 2 - 1] = row_list[num_rows - 1]; } /* don't allocate space for responses */ /* create response object - can use same fill response as used in the commpkg routine */ response_obj1.fill_response = hypre_RangeFillResponseIJDetermineRecvProcs; response_obj1.data1 = apart; /* this is necessary so we can fill responses*/ response_obj1.data2 = NULL; max_response_size = 6; /* 6 means we can fit 3 ranges*/ hypre_DataExchangeList(ex_num_contacts, ex_contact_procs, ex_contact_buf, ex_contact_vec_starts, sizeof(HYPRE_BigInt), sizeof(HYPRE_BigInt), &response_obj1, max_response_size, 1, comm, (void**) &response_buf, &response_buf_starts); /* now response_buf contains a proc_id followed by a range upper bound */ hypre_TFree(ex_contact_procs, HYPRE_MEMORY_HOST); hypre_TFree(ex_contact_buf, HYPRE_MEMORY_HOST); hypre_TFree(ex_contact_vec_starts, HYPRE_MEMORY_HOST); hypre_TFree(a_proc_id, HYPRE_MEMORY_HOST); /*how many ranges were returned?*/ num_ranges = response_buf_starts[ex_num_contacts]; num_ranges = num_ranges / 2; prev_id = -1; j = 0; counter = 0; num_real_procs = 0; /* loop through ranges - create a list of actual processor ids*/ for (i = 0; i < num_ranges; i++) { upper_bound = response_buf[i * 2 + 1]; counter = 0; tmp_id = response_buf[i * 2]; /* loop through row_list entries - counting how many are in the range */ while (j < num_rows && row_list[j] <= upper_bound) { real_proc_id[j] = tmp_id; j++; counter++; } if (counter > 0 && tmp_id != prev_id) { num_real_procs++; } prev_id = tmp_id; } /* now we have the list of real processor ids (real_proc_id) - and the number of distinct ones - so now we can set up data to be sent - we have HYPRE_Int data and HYPRE_Complex data. that we will need to pack together */ /* first find out how many rows and elements we need to send per proc - so we can do storage */ ex_contact_procs = hypre_CTAlloc(HYPRE_Int, num_real_procs, HYPRE_MEMORY_HOST); num_rows_per_proc = hypre_CTAlloc(HYPRE_Int, num_real_procs, HYPRE_MEMORY_HOST); num_elements_total = hypre_CTAlloc(HYPRE_Int, num_real_procs, HYPRE_MEMORY_HOST); counter = 0; if (num_real_procs > 0 ) { ex_contact_procs[0] = real_proc_id[0]; num_rows_per_proc[0] = 1; num_elements_total[0] = row_list_num_elements[orig_order[0]]; /* loop through real procs - these are sorted (row_list is sorted also)*/ for (i = 1; i < num_rows; i++) { if (real_proc_id[i] == ex_contact_procs[counter]) /* same processor */ { num_rows_per_proc[counter] += 1; /*another row */ num_elements_total[counter] += row_list_num_elements[orig_order[i]]; } else /* new processor */ { counter++; ex_contact_procs[counter] = real_proc_id[i]; num_rows_per_proc[counter] = 1; num_elements_total[counter] = row_list_num_elements[orig_order[i]]; } } } /* to pack together, we need to use the largest obj. size of (HYPRE_Int) and (HYPRE_Complex) - if these are much different, then we are wasting some storage, but I do not think that it will be a large amount since this function should not be used on really large amounts of data anyway*/ big_int_size = sizeof(HYPRE_BigInt); complex_size = sizeof(HYPRE_Complex); obj_size_bytes = (HYPRE_Int) hypre_max(big_int_size, complex_size); /* set up data to be sent to send procs */ /* for each proc, ex_contact_buf contains #rows, row #, no. elements, col indicies, col data, row #, no. elements, col indicies, col data, etc. */ /* first calculate total storage and make vec_starts arrays */ storage = 0; ex_contact_vec_starts = hypre_CTAlloc(HYPRE_Int, num_real_procs + 1, HYPRE_MEMORY_HOST); ex_contact_vec_starts[0] = -1; for (i = 0; i < num_real_procs; i++) { storage += 1 + 2 * num_rows_per_proc[i] + 2 * num_elements_total[i]; ex_contact_vec_starts[i + 1] = -storage - 1; /* need negative for next loop */ } hypre_TFree(num_elements_total, HYPRE_MEMORY_HOST); /*void_contact_buf = hypre_TAlloc(char, storage*obj_size_bytes);*/ void_contact_buf = hypre_CTAlloc(char, storage * obj_size_bytes, HYPRE_MEMORY_HOST); index_ptr = void_contact_buf; /* step through with this index */ /* for each proc: #rows, row #, no. elements, col indicies, col data, row #, no. elements, col indicies, col data, etc. */ /* un-sort real_proc_id - we want to access data arrays in order, so cheaper to do this*/ us_real_proc_id = hypre_CTAlloc(HYPRE_Int, num_rows, HYPRE_MEMORY_HOST); for (i = 0; i < num_rows; i++) { us_real_proc_id[orig_order[i]] = real_proc_id[i]; } hypre_TFree(real_proc_id, HYPRE_MEMORY_HOST); counter = 0; /* index into data arrays */ prev_id = -1; for (i = 0; i < num_rows; i++) { proc_id = us_real_proc_id[i]; /* can't use row list[i] - you loose the negative signs that differentiate add/set values */ row = off_proc_i[i * 2]; num_elements = row_list_num_elements[i]; /* find position of this processor */ indx = hypre_BinarySearch(ex_contact_procs, proc_id, num_real_procs); in_i = ex_contact_vec_starts[indx]; index_ptr = (void *) ((char *) void_contact_buf + in_i * obj_size_bytes); /* first time for this processor - add the number of rows to the buffer */ if (in_i < 0) { in_i = -in_i - 1; /* re-calc. index_ptr since in_i was negative */ index_ptr = (void *) ((char *) void_contact_buf + in_i * obj_size_bytes); tmp_int = num_rows_per_proc[indx]; hypre_TMemcpy( index_ptr, &tmp_int, HYPRE_Int, 1, HYPRE_MEMORY_HOST, HYPRE_MEMORY_HOST); index_ptr = (void *) ((char *) index_ptr + obj_size_bytes); in_i++; } /* add row # */ hypre_TMemcpy( index_ptr, &row, HYPRE_BigInt, 1, HYPRE_MEMORY_HOST, HYPRE_MEMORY_HOST); index_ptr = (void *) ((char *) index_ptr + obj_size_bytes); in_i++; /* add number of elements */ hypre_TMemcpy( index_ptr, &num_elements, HYPRE_Int, 1, HYPRE_MEMORY_HOST, HYPRE_MEMORY_HOST); index_ptr = (void *) ((char *) index_ptr + obj_size_bytes); in_i++; /* now add col indices */ for (j = 0; j < num_elements; j++) { tmp_big_int = off_proc_j[counter + j]; /* col number */ hypre_TMemcpy( index_ptr, &tmp_big_int, HYPRE_BigInt, 1, HYPRE_MEMORY_HOST, HYPRE_MEMORY_HOST); index_ptr = (void *) ((char *) index_ptr + obj_size_bytes); in_i ++; } /* now add data */ for (j = 0; j < num_elements; j++) { tmp_complex = off_proc_data[counter++]; /* value */ hypre_TMemcpy( index_ptr, &tmp_complex, HYPRE_Complex, 1, HYPRE_MEMORY_HOST, HYPRE_MEMORY_HOST); index_ptr = (void *) ((char *) index_ptr + obj_size_bytes); in_i++; } /* increment the indexes to keep track of where we are - we * adjust below to be actual starts*/ ex_contact_vec_starts[indx] = in_i; } /* some clean up */ hypre_TFree(response_buf, HYPRE_MEMORY_HOST); hypre_TFree(response_buf_starts, HYPRE_MEMORY_HOST); hypre_TFree(us_real_proc_id, HYPRE_MEMORY_HOST); hypre_TFree(orig_order, HYPRE_MEMORY_HOST); hypre_TFree(row_list, HYPRE_MEMORY_HOST); hypre_TFree(row_list_num_elements, HYPRE_MEMORY_HOST); hypre_TFree(num_rows_per_proc, HYPRE_MEMORY_HOST); for (i = num_real_procs; i > 0; i--) { ex_contact_vec_starts[i] = ex_contact_vec_starts[i - 1]; } ex_contact_vec_starts[0] = 0; /* now send the data */ /***********************************/ /* first get the integer info in send_proc_obj */ /* the response we expect is just a confirmation*/ response_buf = NULL; response_buf_starts = NULL; /*build the response object*/ /* use the send_proc_obj for the info kept from contacts */ /*estimate inital storage allocation */ send_proc_obj.length = 0; send_proc_obj.storage_length = num_real_procs + 5; send_proc_obj.id = hypre_CTAlloc(HYPRE_Int, send_proc_obj.storage_length + 1, HYPRE_MEMORY_HOST); send_proc_obj.vec_starts = hypre_CTAlloc(HYPRE_Int, send_proc_obj.storage_length + 1, HYPRE_MEMORY_HOST); send_proc_obj.vec_starts[0] = 0; send_proc_obj.element_storage_length = storage + 20; send_proc_obj.v_elements = hypre_TAlloc(char, obj_size_bytes * send_proc_obj.element_storage_length, HYPRE_MEMORY_HOST); response_obj2.fill_response = hypre_FillResponseIJOffProcVals; response_obj2.data1 = NULL; response_obj2.data2 = &send_proc_obj; max_response_size = 0; hypre_DataExchangeList(num_real_procs, ex_contact_procs, void_contact_buf, ex_contact_vec_starts, obj_size_bytes, 0, &response_obj2, max_response_size, 2, comm, (void **) &response_buf, &response_buf_starts); hypre_TFree(response_buf, HYPRE_MEMORY_HOST); hypre_TFree(response_buf_starts, HYPRE_MEMORY_HOST); hypre_TFree(ex_contact_procs, HYPRE_MEMORY_HOST); hypre_TFree(void_contact_buf, HYPRE_MEMORY_HOST); hypre_TFree(ex_contact_vec_starts, HYPRE_MEMORY_HOST); /* Now we can unpack the send_proc_objects and call set and add to values functions. We unpack messages in a deterministic order, using processor rank */ num_recvs = send_proc_obj.length; argsort_contact_procs = hypre_CTAlloc(HYPRE_Int, num_recvs, HYPRE_MEMORY_HOST); for (i = 0; i < num_recvs; i++) { argsort_contact_procs[i] = i; } /* This sort's the id array, but the original indices are stored in * argsort_contact_procs */ hypre_qsort2i( send_proc_obj.id, argsort_contact_procs, 0, num_recvs - 1 ); /* alias */ recv_data_ptr = send_proc_obj.v_elements; recv_starts = send_proc_obj.vec_starts; for (i = 0; i < num_recvs; i++) { /* Find the current processor in order, and reset recv_data_ptr to that processor's message */ original_proc_indx = argsort_contact_procs[i]; /*current_proc = send_proc_obj.id[i];*/ indx = recv_starts[original_proc_indx]; recv_data_ptr = (void *) ((char *) send_proc_obj.v_elements + indx * obj_size_bytes); /* get the number of rows for this recv */ hypre_TMemcpy( &num_rows, recv_data_ptr, HYPRE_Int, 1, HYPRE_MEMORY_HOST, HYPRE_MEMORY_HOST); recv_data_ptr = (void *) ((char *)recv_data_ptr + obj_size_bytes); indx++; for (j = 0; j < num_rows; j++) /* for each row: unpack info */ { /* row # */ hypre_TMemcpy( &row, recv_data_ptr, HYPRE_BigInt, 1, HYPRE_MEMORY_HOST, HYPRE_MEMORY_HOST); recv_data_ptr = (void *) ((char *)recv_data_ptr + obj_size_bytes); indx++; /* num elements for this row */ hypre_TMemcpy( &num_elements, recv_data_ptr, HYPRE_Int, 1, HYPRE_MEMORY_HOST, HYPRE_MEMORY_HOST); recv_data_ptr = (void *) ((char *)recv_data_ptr + obj_size_bytes); indx++; /* col indices */ /* Need to check this again !!!! */ if (big_int_size == obj_size_bytes) { col_ptr = (HYPRE_BigInt *) recv_data_ptr; recv_data_ptr = (void *) ((char *)recv_data_ptr + num_elements * obj_size_bytes); } else /* copy data */ { if (big_int_data_size < num_elements) { big_int_data = hypre_TReAlloc(big_int_data, HYPRE_BigInt, num_elements + 10, HYPRE_MEMORY_HOST); } for (k = 0; k < num_elements; k++) { hypre_TMemcpy( &big_int_data[k], recv_data_ptr, HYPRE_BigInt, 1, HYPRE_MEMORY_HOST, HYPRE_MEMORY_HOST); recv_data_ptr = (void *) ((char *)recv_data_ptr + obj_size_bytes); } col_ptr = big_int_data; } /* col data */ if (complex_size == obj_size_bytes) { col_data_ptr = (HYPRE_Complex *) recv_data_ptr; recv_data_ptr = (void *) ((char *)recv_data_ptr + num_elements * obj_size_bytes); } else /* copy data */ { if (complex_data_size < num_elements) { complex_data = hypre_TReAlloc(complex_data, HYPRE_Complex, num_elements + 10, HYPRE_MEMORY_HOST); } for (k = 0; k < num_elements; k++) { hypre_TMemcpy( &complex_data[k], recv_data_ptr, HYPRE_Complex, 1, HYPRE_MEMORY_HOST, HYPRE_MEMORY_HOST); recv_data_ptr = (void *) ((char *)recv_data_ptr + obj_size_bytes); } col_data_ptr = complex_data; } if (memory_location == HYPRE_MEMORY_HOST) { hypre_IJMatrixAddToValuesParCSR(matrix, 1, &num_elements, &row, &row_index, col_ptr, col_data_ptr); } else { HYPRE_Int nelm_new = off_proc_nelm_recv_cur + num_elements; if (nelm_new > off_proc_nelm_recv_max) { off_proc_nelm_recv_max = nelm_new * 2; off_proc_i_recv = hypre_TReAlloc(off_proc_i_recv, HYPRE_BigInt, off_proc_nelm_recv_max, HYPRE_MEMORY_HOST); off_proc_j_recv = hypre_TReAlloc(off_proc_j_recv, HYPRE_BigInt, off_proc_nelm_recv_max, HYPRE_MEMORY_HOST); off_proc_data_recv = hypre_TReAlloc(off_proc_data_recv, HYPRE_Complex, off_proc_nelm_recv_max, HYPRE_MEMORY_HOST); } HYPRE_Int i; for (i = 0; i < num_elements; i++) { off_proc_i_recv[off_proc_nelm_recv_cur + i] = row; } hypre_TMemcpy(off_proc_j_recv + off_proc_nelm_recv_cur, col_ptr, HYPRE_BigInt, num_elements, HYPRE_MEMORY_HOST, HYPRE_MEMORY_HOST); hypre_TMemcpy(off_proc_data_recv + off_proc_nelm_recv_cur, col_data_ptr, HYPRE_Complex, num_elements, HYPRE_MEMORY_HOST, HYPRE_MEMORY_HOST); off_proc_nelm_recv_cur = nelm_new; } indx += (num_elements * 2); } } if (memory_location == HYPRE_MEMORY_DEVICE) { off_proc_i_recv_d = hypre_TAlloc(HYPRE_BigInt, off_proc_nelm_recv_cur, HYPRE_MEMORY_DEVICE); off_proc_j_recv_d = hypre_TAlloc(HYPRE_BigInt, off_proc_nelm_recv_cur, HYPRE_MEMORY_DEVICE); off_proc_data_recv_d = hypre_TAlloc(HYPRE_Complex, off_proc_nelm_recv_cur, HYPRE_MEMORY_DEVICE); hypre_TMemcpy(off_proc_i_recv_d, off_proc_i_recv, HYPRE_BigInt, off_proc_nelm_recv_cur, HYPRE_MEMORY_DEVICE, HYPRE_MEMORY_HOST); hypre_TMemcpy(off_proc_j_recv_d, off_proc_j_recv, HYPRE_BigInt, off_proc_nelm_recv_cur, HYPRE_MEMORY_DEVICE, HYPRE_MEMORY_HOST); hypre_TMemcpy(off_proc_data_recv_d, off_proc_data_recv, HYPRE_Complex, off_proc_nelm_recv_cur, HYPRE_MEMORY_DEVICE, HYPRE_MEMORY_HOST); #if defined(HYPRE_USING_GPU) hypre_IJMatrixSetAddValuesParCSRDevice(matrix, off_proc_nelm_recv_cur, NULL, off_proc_i_recv_d, NULL, off_proc_j_recv_d, off_proc_data_recv_d, "add"); #endif } hypre_TFree(send_proc_obj.v_elements, HYPRE_MEMORY_HOST); hypre_TFree(send_proc_obj.vec_starts, HYPRE_MEMORY_HOST); hypre_TFree(send_proc_obj.id, HYPRE_MEMORY_HOST); hypre_TFree(argsort_contact_procs, HYPRE_MEMORY_HOST); if (big_int_data) { hypre_TFree(big_int_data, HYPRE_MEMORY_HOST); } if (complex_data) { hypre_TFree(complex_data, HYPRE_MEMORY_HOST); } if (memory_location == HYPRE_MEMORY_DEVICE) { hypre_TFree(off_proc_i, HYPRE_MEMORY_HOST); hypre_TFree(off_proc_j, HYPRE_MEMORY_HOST); hypre_TFree(off_proc_data, HYPRE_MEMORY_HOST); } hypre_TFree(off_proc_i_recv, HYPRE_MEMORY_HOST); hypre_TFree(off_proc_j_recv, HYPRE_MEMORY_HOST); hypre_TFree(off_proc_data_recv, HYPRE_MEMORY_HOST); hypre_TFree(off_proc_i_recv_d, HYPRE_MEMORY_DEVICE); hypre_TFree(off_proc_j_recv_d, HYPRE_MEMORY_DEVICE); hypre_TFree(off_proc_data_recv_d, HYPRE_MEMORY_DEVICE); return hypre_error_flag; } /*-------------------------------------------------------------------- * hypre_FillResponseIJOffProcVals * Fill response function for the previous function (2nd data exchange) *--------------------------------------------------------------------*/ HYPRE_Int hypre_FillResponseIJOffProcVals(void *p_recv_contact_buf, HYPRE_Int contact_size, HYPRE_Int contact_proc, void *ro, MPI_Comm comm, void **p_send_response_buf, HYPRE_Int *response_message_size ) { HYPRE_UNUSED_VAR(p_send_response_buf); HYPRE_Int myid; HYPRE_Int index, count, elength; HYPRE_Int object_size; void *index_ptr; hypre_DataExchangeResponse *response_obj = (hypre_DataExchangeResponse*) ro; hypre_ProcListElements *send_proc_obj = (hypre_ProcListElements*) response_obj->data2; object_size = hypre_max(sizeof(HYPRE_BigInt), sizeof(HYPRE_Complex)); hypre_MPI_Comm_rank(comm, &myid ); /*check to see if we need to allocate more space in send_proc_obj for vec starts * and id */ if (send_proc_obj->length == send_proc_obj->storage_length) { send_proc_obj->storage_length += 20; /*add space for 20 more contact*/ send_proc_obj->vec_starts = hypre_TReAlloc(send_proc_obj->vec_starts, HYPRE_Int, send_proc_obj->storage_length + 1, HYPRE_MEMORY_HOST); if ( send_proc_obj->id != NULL) { send_proc_obj->id = hypre_TReAlloc(send_proc_obj->id, HYPRE_Int, send_proc_obj->storage_length + 1, HYPRE_MEMORY_HOST); } } /*initialize*/ count = send_proc_obj->length; index = send_proc_obj->vec_starts[count]; /* current number of elements */ if ( send_proc_obj->id != NULL) { send_proc_obj->id[count] = contact_proc; } /*do we need more storage for the elements?*/ if (send_proc_obj->element_storage_length < index + contact_size) { elength = hypre_max(contact_size, 100); elength += index; send_proc_obj->v_elements = hypre_TReAlloc((char*)send_proc_obj->v_elements, char, elength * object_size, HYPRE_MEMORY_HOST); send_proc_obj->element_storage_length = elength; } /*populate send_proc_obj*/ index_ptr = (void *) ((char *) send_proc_obj->v_elements + index * object_size); hypre_TMemcpy(index_ptr, p_recv_contact_buf, char, object_size * contact_size, HYPRE_MEMORY_HOST, HYPRE_MEMORY_HOST); send_proc_obj->vec_starts[count + 1] = index + contact_size; send_proc_obj->length++; /* output - no message to return (confirmation) */ *response_message_size = 0; return hypre_error_flag; } /*--------------------------------------------------------------------*/ HYPRE_Int hypre_FindProc(HYPRE_BigInt *list, HYPRE_BigInt value, HYPRE_Int list_length) { HYPRE_Int low, high, m; low = 0; high = list_length; if (value >= list[high] || value < list[low]) { return -1; } else { while (low + 1 < high) { m = (low + high) / 2; if (value < list[m]) { high = m; } else if (value >= list[m]) { low = m; } } return low; } } /****************************************************************************** * * hypre_IJMatrixAssembleParCSR * * assembles IJMatrix from AuxParCSRMatrix auxiliary structure *****************************************************************************/ HYPRE_Int hypre_IJMatrixAssembleParCSR(hypre_IJMatrix *matrix) { MPI_Comm comm = hypre_IJMatrixComm(matrix); hypre_ParCSRMatrix *par_matrix = (hypre_ParCSRMatrix*) hypre_IJMatrixObject(matrix); hypre_AuxParCSRMatrix *aux_matrix = (hypre_AuxParCSRMatrix*) hypre_IJMatrixTranslator(matrix); HYPRE_BigInt *row_partitioning = hypre_IJMatrixRowPartitioning(matrix); HYPRE_BigInt *col_partitioning = hypre_IJMatrixColPartitioning(matrix); hypre_CSRMatrix *diag = hypre_ParCSRMatrixDiag(par_matrix); hypre_CSRMatrix *offd = hypre_ParCSRMatrixOffd(par_matrix); HYPRE_Int *diag_i = hypre_CSRMatrixI(diag); HYPRE_Int *offd_i = hypre_CSRMatrixI(offd); HYPRE_Int *diag_j; HYPRE_Int *offd_j = NULL; HYPRE_Complex *diag_data; HYPRE_Complex *offd_data = NULL; HYPRE_Int i, j, j0; HYPRE_Int num_cols_offd; HYPRE_Int *diag_pos; HYPRE_BigInt *col_map_offd; HYPRE_Int *rownnz; HYPRE_Int *row_length; HYPRE_BigInt **aux_j; HYPRE_Complex **aux_data; HYPRE_Int my_id, num_procs; HYPRE_Int num_rows; HYPRE_Int num_rownnz; HYPRE_Int i_diag, i_offd; HYPRE_BigInt col_0, col_n; HYPRE_Int nnz_offd; HYPRE_BigInt *big_offd_j; HYPRE_BigInt *tmp_j; HYPRE_Complex temp; HYPRE_BigInt base = hypre_IJMatrixGlobalFirstCol(matrix); HYPRE_Int off_proc_i_indx; HYPRE_Int max_off_proc_elmts; HYPRE_Int current_num_elmts; HYPRE_BigInt *off_proc_i; HYPRE_BigInt *off_proc_j; HYPRE_Complex *off_proc_data; HYPRE_Int offd_proc_elmts; //HYPRE_Int new_off_proc_i_indx; //HYPRE_Int cancel_indx; //HYPRE_Int col_indx; //HYPRE_Int current_indx; //HYPRE_Int current_i; //HYPRE_Int row_len; HYPRE_Int max_num_threads; HYPRE_Int aux_flag, aux_flag_global; HYPRE_ANNOTATE_FUNC_BEGIN; max_num_threads = hypre_NumThreads(); /* first find out if anyone has an aux_matrix, and create one if you don't * have one, but other procs do */ aux_flag = 0; aux_flag_global = 0; if (aux_matrix) { aux_flag = 1; } hypre_MPI_Allreduce(&aux_flag, &aux_flag_global, 1, HYPRE_MPI_INT, hypre_MPI_SUM, comm); if (aux_flag_global && (!aux_flag)) { hypre_MPI_Comm_rank(comm, &my_id); num_rows = (HYPRE_Int)(row_partitioning[1] - row_partitioning[0]); hypre_AuxParCSRMatrixCreate(&aux_matrix, num_rows, num_rows, NULL); hypre_AuxParCSRMatrixNeedAux(aux_matrix) = 0; hypre_IJMatrixTranslator(matrix) = aux_matrix; } if (aux_matrix) { /* first delete all cancelled elements */ /*cancel_indx = hypre_AuxParCSRMatrixCancelIndx(aux_matrix); if (cancel_indx) { current_num_elmts=hypre_AuxParCSRMatrixCurrentOffProcElmts(aux_matrix); off_proc_i=hypre_AuxParCSRMatrixOffProcI(aux_matrix); off_proc_j=hypre_AuxParCSRMatrixOffProcJ(aux_matrix); off_proc_data=hypre_AuxParCSRMatrixOffProcData(aux_matrix); off_proc_i_indx = hypre_AuxParCSRMatrixOffProcIIndx(aux_matrix); col_indx = 0; current_i = 0; current_indx = 0; new_off_proc_i_indx = off_proc_i_indx; for (i=0; i < off_proc_i_indx; i= i+2) { row_len = off_proc_i[i+1]; for (j=0; j < off_proc_i[i+1]; j++) { if (off_proc_j[col_indx] == -1) { col_indx++; row_len--; current_num_elmts--; } else { off_proc_j[current_indx] = off_proc_j[col_indx]; off_proc_data[current_indx++] = off_proc_data[col_indx++]; } } if (row_len) { off_proc_i[current_i] = off_proc_i[i]; off_proc_i[current_i+1] = row_len; current_i += 2; } else { new_off_proc_i_indx -= 2; } } hypre_AuxParCSRMatrixOffProcIIndx(aux_matrix) = new_off_proc_i_indx; hypre_AuxParCSRMatrixCurrentOffProcElmts(aux_matrix) = current_num_elmts; }*/ off_proc_i_indx = hypre_AuxParCSRMatrixOffProcIIndx(aux_matrix); hypre_MPI_Allreduce(&off_proc_i_indx, &offd_proc_elmts, 1, HYPRE_MPI_INT, hypre_MPI_SUM, comm); if (offd_proc_elmts) { max_off_proc_elmts = hypre_AuxParCSRMatrixMaxOffProcElmts(aux_matrix); current_num_elmts = hypre_AuxParCSRMatrixCurrentOffProcElmts(aux_matrix); off_proc_i = hypre_AuxParCSRMatrixOffProcI(aux_matrix); off_proc_j = hypre_AuxParCSRMatrixOffProcJ(aux_matrix); off_proc_data = hypre_AuxParCSRMatrixOffProcData(aux_matrix); hypre_IJMatrixAssembleOffProcValsParCSR( matrix, off_proc_i_indx, max_off_proc_elmts, current_num_elmts, HYPRE_MEMORY_HOST, off_proc_i, off_proc_j, off_proc_data); } } if (hypre_IJMatrixAssembleFlag(matrix) == 0) { hypre_MPI_Comm_size(comm, &num_procs); hypre_MPI_Comm_rank(comm, &my_id); num_rows = (HYPRE_Int)(row_partitioning[1] - row_partitioning[0]); col_0 = col_partitioning[0]; col_n = col_partitioning[1] - 1; /* move data into ParCSRMatrix if not there already */ if (hypre_AuxParCSRMatrixNeedAux(aux_matrix)) { HYPRE_Int *diag_array; HYPRE_Int *offd_array; /* Update nonzero rows of aux_matrix */ hypre_AuxParCSRMatrixSetRownnz(aux_matrix); aux_j = hypre_AuxParCSRMatrixAuxJ(aux_matrix); aux_data = hypre_AuxParCSRMatrixAuxData(aux_matrix); row_length = hypre_AuxParCSRMatrixRowLength(aux_matrix); num_rownnz = hypre_AuxParCSRMatrixLocalNumRownnz(aux_matrix); rownnz = hypre_AuxParCSRMatrixRownnz(aux_matrix); diag_array = hypre_CTAlloc(HYPRE_Int, max_num_threads, HYPRE_MEMORY_HOST); offd_array = hypre_CTAlloc(HYPRE_Int, max_num_threads, HYPRE_MEMORY_HOST); diag_pos = hypre_TAlloc(HYPRE_Int, num_rownnz, HYPRE_MEMORY_HOST); i_diag = i_offd = 0; #ifdef HYPRE_USING_OPENMP #pragma omp parallel private(i, j, i_diag, i_offd) #endif { HYPRE_BigInt *local_j; HYPRE_Complex *local_data; HYPRE_Int ii, rest, size, ns, ne; HYPRE_Int num_threads, my_thread_num; num_threads = hypre_NumActiveThreads(); my_thread_num = hypre_GetThreadNum(); size = num_rownnz / num_threads; rest = num_rownnz - size * num_threads; if (my_thread_num < rest) { ns = my_thread_num * (size + 1); ne = (my_thread_num + 1) * (size + 1); } else { ns = my_thread_num * size + rest; ne = (my_thread_num + 1) * size + rest; } i_diag = i_offd = 0; for (i = ns; i < ne; i++) { ii = rownnz ? rownnz[i] : i; local_j = aux_j[ii]; local_data = aux_data[ii]; diag_pos[i] = -1; for (j = 0; j < row_length[ii]; j++) { if (local_j[j] < col_0 || local_j[j] > col_n) { i_offd++; } else { i_diag++; if ((HYPRE_Int)(local_j[j] - col_0) == i) { diag_pos[i] = j; } } } } diag_array[my_thread_num] = i_diag; offd_array[my_thread_num] = i_offd; #ifdef HYPRE_USING_OPENMP #pragma omp barrier #endif if (my_thread_num == 0) { i_diag = 0; i_offd = 0; for (i = 0; i < num_threads; i++) { i_diag += diag_array[i]; i_offd += offd_array[i]; diag_array[i] = i_diag; offd_array[i] = i_offd; } diag_i[num_rows] = i_diag; offd_i[num_rows] = i_offd; hypre_TFree(hypre_CSRMatrixJ(diag), hypre_CSRMatrixMemoryLocation(diag)); hypre_TFree(hypre_CSRMatrixData(diag), hypre_CSRMatrixMemoryLocation(diag)); hypre_TFree(hypre_CSRMatrixJ(offd), hypre_CSRMatrixMemoryLocation(offd)); hypre_TFree(hypre_CSRMatrixData(offd), hypre_CSRMatrixMemoryLocation(offd)); hypre_TFree(hypre_CSRMatrixBigJ(offd), hypre_CSRMatrixMemoryLocation(offd)); diag_j = hypre_CTAlloc(HYPRE_Int, i_diag, hypre_CSRMatrixMemoryLocation(diag)); diag_data = hypre_CTAlloc(HYPRE_Complex, i_diag, hypre_CSRMatrixMemoryLocation(diag)); offd_j = hypre_CTAlloc(HYPRE_Int, i_offd, hypre_CSRMatrixMemoryLocation(offd)); offd_data = hypre_CTAlloc(HYPRE_Complex, i_offd, hypre_CSRMatrixMemoryLocation(offd)); big_offd_j = hypre_CTAlloc(HYPRE_BigInt, i_offd, hypre_CSRMatrixMemoryLocation(offd)); } #ifdef HYPRE_USING_OPENMP #pragma omp barrier #endif if (my_thread_num) { i_diag = diag_array[my_thread_num - 1]; i_offd = offd_array[my_thread_num - 1]; } else { i_diag = 0; i_offd = 0; } for (i = ns; i < ne; i++) { ii = rownnz ? rownnz[i] : i; diag_i[ii] = i_diag; offd_i[ii] = i_offd; local_j = aux_j[ii]; local_data = aux_data[ii]; if (diag_pos[i] > -1) { diag_j[i_diag] = (HYPRE_Int)(local_j[diag_pos[i]] - col_0); diag_data[i_diag++] = local_data[diag_pos[i]]; } for (j = 0; j < row_length[ii]; j++) { if (local_j[j] < col_0 || local_j[j] > col_n) { big_offd_j[i_offd] = local_j[j]; offd_data[i_offd++] = local_data[j]; } else if (j != diag_pos[i]) { diag_j[i_diag] = (HYPRE_Int)(local_j[j] - col_0); diag_data[i_diag++] = local_data[j]; } } } /* Correct diag_i and offd_i */ if (rownnz != NULL) { #ifdef HYPRE_USING_OPENMP #pragma omp barrier #endif for (i = ns; i < (ne - 1); i++) { for (ii = rownnz[i] + 1; ii < rownnz[i + 1]; ii++) { diag_i[ii] = diag_i[rownnz[i + 1]]; offd_i[ii] = offd_i[rownnz[i + 1]]; } } if (my_thread_num < (num_threads - 1)) { for (ii = rownnz[ne - 1] + 1; ii < rownnz[ne]; ii++) { diag_i[ii] = diag_i[rownnz[ne]]; offd_i[ii] = offd_i[rownnz[ne]]; } } else { for (ii = rownnz[ne - 1] + 1; ii < num_rows; ii++) { diag_i[ii] = diag_i[num_rows]; offd_i[ii] = offd_i[num_rows]; } } } } /* end parallel region */ hypre_TFree(diag_array, HYPRE_MEMORY_HOST); hypre_TFree(offd_array, HYPRE_MEMORY_HOST); hypre_CSRMatrixJ(diag) = diag_j; hypre_CSRMatrixData(diag) = diag_data; hypre_CSRMatrixNumNonzeros(diag) = diag_i[num_rows]; if (offd_i[num_rows] > 0) { hypre_CSRMatrixJ(offd) = offd_j; hypre_CSRMatrixBigJ(offd) = big_offd_j; hypre_CSRMatrixData(offd) = offd_data; } hypre_CSRMatrixNumNonzeros(offd) = offd_i[num_rows]; hypre_TFree(diag_pos, HYPRE_MEMORY_HOST); } else { /* move diagonal element into first space */ big_offd_j = hypre_CSRMatrixBigJ(offd); diag_j = hypre_CSRMatrixJ(diag); diag_data = hypre_CSRMatrixData(diag); #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private (i,j,j0,temp) #endif for (i = 0; i < num_rows; i++) { j0 = diag_i[i]; for (j = j0; j < diag_i[i + 1]; j++) { if (diag_j[j] == i) { temp = diag_data[j0]; diag_data[j0] = diag_data[j]; diag_data[j] = temp; diag_j[j] = diag_j[j0]; diag_j[j0] = i; break; } } } offd_j = hypre_CSRMatrixJ(offd); if (!offd_j && offd_i[num_rows]) { offd_j = hypre_CTAlloc(HYPRE_Int, offd_i[num_rows], hypre_CSRMatrixMemoryLocation(offd)); hypre_CSRMatrixJ(offd) = offd_j; } } /* generate col_map_offd */ nnz_offd = offd_i[num_rows]; if (nnz_offd) { tmp_j = hypre_CTAlloc(HYPRE_BigInt, nnz_offd, HYPRE_MEMORY_HOST); for (i = 0; i < nnz_offd; i++) { tmp_j[i] = big_offd_j[i]; } hypre_BigQsort0(tmp_j, 0, nnz_offd - 1); num_cols_offd = 1; for (i = 0; i < nnz_offd - 1; i++) { if (tmp_j[i + 1] > tmp_j[i]) { tmp_j[num_cols_offd++] = tmp_j[i + 1]; } } col_map_offd = hypre_CTAlloc(HYPRE_BigInt, num_cols_offd, HYPRE_MEMORY_HOST); for (i = 0; i < num_cols_offd; i++) { col_map_offd[i] = tmp_j[i]; } #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i) #endif for (i = 0; i < nnz_offd; i++) { offd_j[i] = hypre_BigBinarySearch(col_map_offd, big_offd_j[i], num_cols_offd); } if (base) { for (i = 0; i < num_cols_offd; i++) { col_map_offd[i] -= base; } } hypre_ParCSRMatrixColMapOffd(par_matrix) = col_map_offd; hypre_CSRMatrixNumCols(offd) = num_cols_offd; hypre_TFree(tmp_j, HYPRE_MEMORY_HOST); hypre_TFree(big_offd_j, hypre_CSRMatrixMemoryLocation(offd)); hypre_CSRMatrixBigJ(offd) = NULL; } hypre_IJMatrixAssembleFlag(matrix) = 1; /* Generate the nonzero rows in the diag and offd matrices */ hypre_CSRMatrixSetRownnz(diag); hypre_CSRMatrixSetRownnz(offd); } /* Free memory */ hypre_AuxParCSRMatrixDestroy(aux_matrix); hypre_IJMatrixTranslator(matrix) = NULL; HYPRE_PRINT_MEMORY_USAGE(comm); HYPRE_ANNOTATE_FUNC_END; return hypre_error_flag; } /****************************************************************************** * * IJMatrix_ParCSR interface * *****************************************************************************/ #include "_hypre_IJ_mv.h" #include "../HYPRE.h" /****************************************************************************** * * hypre_IJMatrixSetValuesOMPParCSR * * sets values in an IJMatrix before assembly, * use of this routine requires that the values in rows are different from each * other, i.e rows[i] != rows[j] for i != j * to ensure accurate threading * *****************************************************************************/ HYPRE_Int hypre_IJMatrixSetValuesOMPParCSR( hypre_IJMatrix *matrix, HYPRE_Int nrows, HYPRE_Int *ncols, const HYPRE_BigInt *rows, const HYPRE_Int *row_indexes, const HYPRE_BigInt *cols, const HYPRE_Complex *values ) { hypre_ParCSRMatrix *par_matrix; hypre_CSRMatrix *diag, *offd; hypre_AuxParCSRMatrix *aux_matrix; HYPRE_BigInt *row_partitioning; HYPRE_BigInt *col_partitioning; MPI_Comm comm = hypre_IJMatrixComm(matrix); HYPRE_Int num_procs, my_id; HYPRE_BigInt col_0, col_n, first; //HYPRE_Int cancel_indx; HYPRE_BigInt **aux_j = NULL; HYPRE_Complex **aux_data = NULL; HYPRE_Int *row_length, *row_space; HYPRE_Int need_aux; HYPRE_Int *diag_i = NULL; HYPRE_Int *diag_j = NULL; HYPRE_Complex *diag_data = NULL; HYPRE_Int *offd_i = NULL; HYPRE_Int *offd_j = NULL; HYPRE_BigInt *big_offd_j = NULL; HYPRE_Complex *offd_data = NULL; /*HYPRE_Int current_num_elmts;*/ /*HYPRE_Int max_off_proc_elmts;*/ //HYPRE_Int off_proc_i_indx; //HYPRE_BigInt *off_proc_i; //HYPRE_BigInt *off_proc_j; //HYPRE_Int *offproc_cnt; HYPRE_Int print_level = hypre_IJMatrixPrintLevel(matrix); //HYPRE_Int max_num_threads; //HYPRE_Int error_flag = 0; /*HYPRE_Complex *off_proc_data;*/ hypre_MPI_Comm_size(comm, &num_procs); hypre_MPI_Comm_rank(comm, &my_id); //max_num_threads = hypre_NumThreads(); par_matrix = (hypre_ParCSRMatrix *) hypre_IJMatrixObject( matrix ); row_partitioning = hypre_IJMatrixRowPartitioning(matrix); col_partitioning = hypre_IJMatrixColPartitioning(matrix); //offproc_cnt = hypre_CTAlloc(HYPRE_Int, max_num_threads, HYPRE_MEMORY_HOST); col_0 = col_partitioning[0]; col_n = col_partitioning[1] - 1; first = hypre_IJMatrixGlobalFirstCol(matrix); if (nrows < 0) { hypre_error_in_arg(2); if (print_level) { hypre_printf("Error! nrows negative! HYPRE_IJMatrixSetValues\n"); } return hypre_error_flag; } if (hypre_IJMatrixAssembleFlag(matrix)) /* matrix already assembled*/ { HYPRE_BigInt *col_map_offd = NULL; HYPRE_Int num_cols_offd; diag = hypre_ParCSRMatrixDiag(par_matrix); diag_i = hypre_CSRMatrixI(diag); diag_j = hypre_CSRMatrixJ(diag); diag_data = hypre_CSRMatrixData(diag); offd = hypre_ParCSRMatrixOffd(par_matrix); offd_i = hypre_CSRMatrixI(offd); num_cols_offd = hypre_CSRMatrixNumCols(offd); if (num_cols_offd) { col_map_offd = hypre_ParCSRMatrixColMapOffd(par_matrix); offd_j = hypre_CSRMatrixJ(offd); offd_data = hypre_CSRMatrixData(offd); } aux_matrix = (hypre_AuxParCSRMatrix*) hypre_IJMatrixTranslator(matrix); /*if (aux_matrix) { current_num_elmts = hypre_AuxParCSRMatrixCurrentOffProcElmts(aux_matrix); off_proc_i_indx = hypre_AuxParCSRMatrixOffProcIIndx(aux_matrix); off_proc_i = hypre_AuxParCSRMatrixOffProcI(aux_matrix); off_proc_j = hypre_AuxParCSRMatrixOffProcJ(aux_matrix); cancel_indx = hypre_AuxParCSRMatrixCancelIndx(aux_matrix); }*/ #ifdef HYPRE_USING_OPENMP #pragma omp parallel #endif { HYPRE_Int j_offd; HYPRE_Int num_threads, my_thread_num; HYPRE_Int len, rest, ns, ne; HYPRE_Int pos_diag, pos_offd; HYPRE_Int len_diag, len_offd; //HYPRE_Int row_len; HYPRE_Int row_local; HYPRE_Int i, j, ii, n; HYPRE_BigInt row; HYPRE_Int not_found, size, indx; num_threads = hypre_NumActiveThreads(); my_thread_num = hypre_GetThreadNum(); len = nrows / num_threads; rest = nrows - len * num_threads; if (my_thread_num < rest) { ns = my_thread_num * (len + 1); ne = (my_thread_num + 1) * (len + 1); } else { ns = my_thread_num * len + rest; ne = (my_thread_num + 1) * len + rest; } for (ii = ns; ii < ne; ii++) { row = rows[ii]; n = ncols ? ncols[ii] : 1; if (n == 0) /* empty row */ { continue; } indx = row_indexes[ii]; /* processor owns the row */ if (row >= row_partitioning[0] && row < row_partitioning[1]) { row_local = (HYPRE_Int)(row - row_partitioning[0]); /* compute local row number */ size = diag_i[row_local + 1] - diag_i[row_local] + offd_i[row_local + 1] - offd_i[row_local]; if (n > size) { hypre_error(HYPRE_ERROR_GENERIC); #if 0 /* error_flag is currently not used anywhere */ #ifdef HYPRE_USING_OPENMP #pragma omp atomic #endif error_flag++; #endif if (print_level) { hypre_printf (" row %b too long! \n", row); } break; /*return hypre_error_flag; */ } pos_diag = diag_i[row_local]; pos_offd = offd_i[row_local]; len_diag = diag_i[row_local + 1]; len_offd = offd_i[row_local + 1]; not_found = 1; for (i = 0; i < n; i++) { if (cols[indx] < col_0 || cols[indx] > col_n) /* insert into offd */ { j_offd = hypre_BigBinarySearch(col_map_offd, cols[indx] - first, num_cols_offd); if (j_offd == -1) { hypre_error(HYPRE_ERROR_GENERIC); #if 0 /* error_flag is currently not used anywhere */ #ifdef HYPRE_USING_OPENMP #pragma omp atomic #endif error_flag++; #endif if (print_level) { hypre_printf (" Error, element %b %b does not exist\n", row, cols[indx]); } break; /*return hypre_error_flag; */ } for (j = pos_offd; j < len_offd; j++) { if (offd_j[j] == j_offd) { offd_data[j] = values[indx]; not_found = 0; break; } } if (not_found) { hypre_error(HYPRE_ERROR_GENERIC); #if 0 /* error_flag is currently not used anywhere */ #ifdef HYPRE_USING_OPENMP #pragma omp atomic #endif error_flag++; #endif if (print_level) { hypre_printf (" Error, element %b %b does not exist\n", row, cols[indx]); } break; /*return hypre_error_flag;*/ } not_found = 1; } /* diagonal element */ else if (cols[indx] == row) { if (diag_j[pos_diag] != row_local) { hypre_error(HYPRE_ERROR_GENERIC); #if 0 /* error_flag is currently not used anywhere */ #ifdef HYPRE_USING_OPENMP #pragma omp atomic #endif error_flag++; #endif if (print_level) { hypre_printf (" Error, element %b %b does not exist\n", row, cols[indx]); } break; /*return hypre_error_flag; */ } diag_data[pos_diag] = values[indx]; } else /* insert into diag */ { for (j = pos_diag; j < len_diag; j++) { if (diag_j[j] == (HYPRE_Int)(cols[indx] - col_0)) { diag_data[j] = values[indx]; not_found = 0; break; } } if (not_found) { hypre_error(HYPRE_ERROR_GENERIC); #if 0 /* error_flag is currently not used anywhere */ #ifdef HYPRE_USING_OPENMP #pragma omp atomic #endif error_flag++; #endif if (print_level) { hypre_printf (" Error, element %b %b does not exist\n", row, cols[indx]); } break; /*return hypre_error_flag;*/ } } indx++; } } /* processor does not own the row */ //else /*search for previous occurrences and cancel them */ /*{ if (aux_matrix) { col_indx = 0; for (i=0; i < off_proc_i_indx; i=i+2) { row_len = off_proc_i[i+1]; if (off_proc_i[i] == row) { for (j=0; j < n; j++) { cnt1 = col_indx; for (k=0; k < row_len; k++) { if (off_proc_j[cnt1] == cols[j]) { off_proc_j[cnt1++] = -1; offproc_cnt[my_thread_num]++; */ /*cancel_indx++;*/ /* if no repetition allowed */ /* off_proc_j[col_indx] = -1; col_indx -= k; break; */ /*} else { cnt1++; } } } col_indx += row_len; } else { col_indx += row_len; } }*/ /*hypre_AuxParCSRMatrixCancelIndx(aux_matrix) = cancel_indx;*/ //} //} } } /*end parallel region */ } else /* matrix not assembled */ { aux_matrix = (hypre_AuxParCSRMatrix*) hypre_IJMatrixTranslator(matrix); /*if (aux_matrix) { current_num_elmts = hypre_AuxParCSRMatrixCurrentOffProcElmts(aux_matrix); off_proc_i_indx = hypre_AuxParCSRMatrixOffProcIIndx(aux_matrix); off_proc_i = hypre_AuxParCSRMatrixOffProcI(aux_matrix); off_proc_j = hypre_AuxParCSRMatrixOffProcJ(aux_matrix); cancel_indx = hypre_AuxParCSRMatrixCancelIndx(aux_matrix); }*/ row_space = hypre_AuxParCSRMatrixRowSpace(aux_matrix); row_length = hypre_AuxParCSRMatrixRowLength(aux_matrix); need_aux = hypre_AuxParCSRMatrixNeedAux(aux_matrix); if (need_aux) { aux_j = hypre_AuxParCSRMatrixAuxJ(aux_matrix); aux_data = hypre_AuxParCSRMatrixAuxData(aux_matrix); } else { diag = hypre_ParCSRMatrixDiag(par_matrix); diag_i = hypre_CSRMatrixI(diag); diag_j = hypre_CSRMatrixJ(diag); diag_data = hypre_CSRMatrixData(diag); offd = hypre_ParCSRMatrixOffd(par_matrix); offd_i = hypre_CSRMatrixI(offd); if (num_procs > 1) { offd_data = hypre_CSRMatrixData(offd); big_offd_j = hypre_CSRMatrixBigJ(offd); if (!big_offd_j) { big_offd_j = hypre_CTAlloc(HYPRE_BigInt, offd_i[hypre_CSRMatrixNumRows(offd)], hypre_CSRMatrixMemoryLocation(offd)); hypre_CSRMatrixBigJ(offd) = big_offd_j; } } } #ifdef HYPRE_USING_OPENMP #pragma omp parallel #endif { HYPRE_Int num_threads, my_thread_num; HYPRE_Int len, rest, ns, ne; HYPRE_BigInt *tmp_j = NULL; HYPRE_BigInt *local_j = NULL; HYPRE_Complex *tmp_data = NULL; HYPRE_Complex *local_data = NULL; HYPRE_Int tmp_indx; //HYPRE_Int row_len; HYPRE_Int row_local; HYPRE_Int i, j, ii, n; HYPRE_BigInt row; HYPRE_Int not_found, size, indx; HYPRE_Int old_size, space, cnt; num_threads = hypre_NumActiveThreads(); my_thread_num = hypre_GetThreadNum(); len = nrows / num_threads; rest = nrows - len * num_threads; if (my_thread_num < rest) { ns = my_thread_num * (len + 1); ne = (my_thread_num + 1) * (len + 1); } else { ns = my_thread_num * len + rest; ne = (my_thread_num + 1) * len + rest; } for (ii = ns; ii < ne; ii++) { row = rows[ii]; n = ncols ? ncols[ii] : 1; if (n == 0) /* empty row */ { continue; } indx = row_indexes[ii]; /* processor owns the row */ if (row >= row_partitioning[0] && row < row_partitioning[1]) { row_local = (HYPRE_Int)(row - row_partitioning[0]); /* compute local row number */ if (need_aux) { local_j = aux_j[row_local]; local_data = aux_data[row_local]; space = row_space[row_local]; old_size = row_length[row_local]; size = space - old_size; if (size < n) { size = n - size; tmp_j = hypre_CTAlloc(HYPRE_BigInt, size, HYPRE_MEMORY_HOST); tmp_data = hypre_CTAlloc(HYPRE_Complex, size, HYPRE_MEMORY_HOST); } tmp_indx = 0; not_found = 1; size = old_size; for (i = 0; i < n; i++) { for (j = 0; j < old_size; j++) { if (local_j[j] == cols[indx]) { local_data[j] = values[indx]; not_found = 0; break; } } if (not_found) { if (size < space) { local_j[size] = cols[indx]; local_data[size++] = values[indx]; } else { tmp_j[tmp_indx] = cols[indx]; tmp_data[tmp_indx++] = values[indx]; } } not_found = 1; indx++; } row_length[row_local] = size + tmp_indx; if (tmp_indx) { aux_j[row_local] = hypre_TReAlloc(aux_j[row_local], HYPRE_BigInt, size + tmp_indx, HYPRE_MEMORY_HOST); aux_data[row_local] = hypre_TReAlloc(aux_data[row_local], HYPRE_Complex, size + tmp_indx, HYPRE_MEMORY_HOST); row_space[row_local] = size + tmp_indx; local_j = aux_j[row_local]; local_data = aux_data[row_local]; } cnt = size; for (i = 0; i < tmp_indx; i++) { local_j[cnt] = tmp_j[i]; local_data[cnt++] = tmp_data[i]; } if (tmp_j) { hypre_TFree(tmp_j, HYPRE_MEMORY_HOST); hypre_TFree(tmp_data, HYPRE_MEMORY_HOST); } } else /* insert immediately into data in ParCSRMatrix structure */ { HYPRE_Int offd_indx, diag_indx; HYPRE_Int offd_space, diag_space; HYPRE_Int cnt_diag, cnt_offd; offd_indx = hypre_AuxParCSRMatrixIndxOffd(aux_matrix)[row_local]; diag_indx = hypre_AuxParCSRMatrixIndxDiag(aux_matrix)[row_local]; cnt_diag = diag_indx; cnt_offd = offd_indx; diag_space = diag_i[row_local + 1]; offd_space = offd_i[row_local + 1]; not_found = 1; for (i = 0; i < n; i++) { if (cols[indx] < col_0 || cols[indx] > col_n) /* insert into offd */ { for (j = offd_i[row_local]; j < offd_indx; j++) { if (big_offd_j[j] == cols[indx]) { offd_data[j] = values[indx]; not_found = 0; break; } } if (not_found) { if (cnt_offd < offd_space) { big_offd_j[cnt_offd] = cols[indx]; offd_data[cnt_offd++] = values[indx]; } else { hypre_error(HYPRE_ERROR_GENERIC); #if 0 /* error_flag is currently not used anywhere */ #ifdef HYPRE_USING_OPENMP #pragma omp atomic #endif error_flag++; #endif if (print_level) { hypre_printf("Error in row %b ! Too many elements!\n", row); } break; /*return hypre_error_flag;*/ } } not_found = 1; } else /* insert into diag */ { for (j = diag_i[row_local]; j < diag_indx; j++) { if (diag_j[j] == (HYPRE_Int)(cols[indx] - col_0)) { diag_data[j] = values[indx]; not_found = 0; break; } } if (not_found) { if (cnt_diag < diag_space) { diag_j[cnt_diag] = (HYPRE_Int)(cols[indx] - col_0); diag_data[cnt_diag++] = values[indx]; } else { hypre_error(HYPRE_ERROR_GENERIC); #if 0 /* error_flag is currently not used anywhere */ #ifdef HYPRE_USING_OPENMP #pragma omp atomic #endif error_flag++; #endif if (print_level) { hypre_printf("Error in row %b ! Too many elements !\n", row); } break; /*return hypre_error_flag;*/ } } not_found = 1; } indx++; } hypre_AuxParCSRMatrixIndxDiag(aux_matrix)[row_local] = cnt_diag; hypre_AuxParCSRMatrixIndxOffd(aux_matrix)[row_local] = cnt_offd; } } /* processor does not own the row */ /*else { if (aux_matrix) { col_indx = 0; for (i=0; i < off_proc_i_indx; i=i+2) { row_len = off_proc_i[i+1]; if (off_proc_i[i] == row) { for (j=0; j < n; j++) { cnt1 = col_indx; for (k=0; k < row_len; k++) { if (off_proc_j[cnt1] == cols[j]) { off_proc_j[cnt1++] = -1; */ /*cancel_indx++;*/ //offproc_cnt[my_thread_num]++; /* if no repetition allowed */ /* off_proc_j[col_indx] = -1; col_indx -= k; break; */ /* } else { cnt1++; } } } col_indx += row_len; } else { col_indx += row_len; } }*/ /*hypre_AuxParCSRMatrixCancelIndx(aux_matrix) = cancel_indx;*/ /*} }*/ } } /* end parallel region */ } /*if (error_flag) { return hypre_error_flag; } if (aux_matrix) { for (i1=0; i1 < max_num_threads; i1++) { cancel_indx += offproc_cnt[i1]; } hypre_AuxParCSRMatrixCancelIndx(aux_matrix) = cancel_indx; }*/ //hypre_TFree(offproc_cnt, HYPRE_MEMORY_HOST); return hypre_error_flag; } /****************************************************************************** * * hypre_IJMatrixAddToValuesOMPParCSR * * adds row values to an IJMatrix * *****************************************************************************/ HYPRE_Int hypre_IJMatrixAddToValuesOMPParCSR( hypre_IJMatrix *matrix, HYPRE_Int nrows, HYPRE_Int *ncols, const HYPRE_BigInt *rows, const HYPRE_Int *row_indexes, const HYPRE_BigInt *cols, const HYPRE_Complex *values ) { hypre_ParCSRMatrix *par_matrix; hypre_CSRMatrix *diag, *offd; hypre_AuxParCSRMatrix *aux_matrix; HYPRE_BigInt *row_partitioning; HYPRE_BigInt *col_partitioning; MPI_Comm comm = hypre_IJMatrixComm(matrix); HYPRE_Int num_procs, my_id; HYPRE_BigInt col_0, col_n, first; HYPRE_BigInt **aux_j = NULL; HYPRE_Complex **aux_data = NULL; HYPRE_Int *row_length, *row_space; HYPRE_Int need_aux; HYPRE_Int *diag_i = NULL; HYPRE_Int *diag_j = NULL; HYPRE_Complex *diag_data = NULL; HYPRE_Int *offd_i = NULL; HYPRE_Int *offd_j = NULL; HYPRE_BigInt *big_offd_j = NULL; HYPRE_Complex *offd_data = NULL; HYPRE_Int current_num_elmts; HYPRE_Int max_off_proc_elmts; HYPRE_Int off_proc_i_indx; HYPRE_BigInt *off_proc_i; HYPRE_BigInt *off_proc_j; HYPRE_Complex *off_proc_data; HYPRE_Int **offproc_cnt; HYPRE_Int print_level = hypre_IJMatrixPrintLevel(matrix); HYPRE_Int max_num_threads; HYPRE_Int error_flag = 0; HYPRE_Int i1; hypre_MPI_Comm_size(comm, &num_procs); hypre_MPI_Comm_rank(comm, &my_id); max_num_threads = hypre_NumThreads(); par_matrix = (hypre_ParCSRMatrix*) hypre_IJMatrixObject( matrix ); row_partitioning = hypre_IJMatrixRowPartitioning(matrix); col_partitioning = hypre_IJMatrixColPartitioning(matrix); offproc_cnt = hypre_CTAlloc(HYPRE_Int *, max_num_threads, HYPRE_MEMORY_HOST); for (i1 = 0; i1 < max_num_threads; i1++) { offproc_cnt[i1] = NULL; } col_0 = col_partitioning[0]; col_n = col_partitioning[1] - 1; first = hypre_IJMatrixGlobalFirstCol(matrix); if (hypre_IJMatrixAssembleFlag(matrix)) /* matrix already assembled */ { HYPRE_Int num_cols_offd; HYPRE_BigInt *col_map_offd = NULL; diag = hypre_ParCSRMatrixDiag(par_matrix); diag_i = hypre_CSRMatrixI(diag); diag_j = hypre_CSRMatrixJ(diag); diag_data = hypre_CSRMatrixData(diag); offd = hypre_ParCSRMatrixOffd(par_matrix); offd_i = hypre_CSRMatrixI(offd); num_cols_offd = hypre_CSRMatrixNumCols(offd); if (num_cols_offd) { col_map_offd = hypre_ParCSRMatrixColMapOffd(par_matrix); offd_j = hypre_CSRMatrixJ(offd); offd_data = hypre_CSRMatrixData(offd); } aux_matrix = (hypre_AuxParCSRMatrix*) hypre_IJMatrixTranslator(matrix); if (aux_matrix) { current_num_elmts = hypre_AuxParCSRMatrixCurrentOffProcElmts(aux_matrix); off_proc_i_indx = hypre_AuxParCSRMatrixOffProcIIndx(aux_matrix); off_proc_i = hypre_AuxParCSRMatrixOffProcI(aux_matrix); off_proc_j = hypre_AuxParCSRMatrixOffProcJ(aux_matrix); } #ifdef HYPRE_USING_OPENMP #pragma omp parallel #endif { HYPRE_Int j_offd; HYPRE_Int num_threads, my_thread_num; HYPRE_Int len, rest, ns, ne; HYPRE_Int pos_diag, pos_offd; HYPRE_Int len_diag, len_offd; HYPRE_Int row_local; HYPRE_Int i, j, ii, n; HYPRE_BigInt row; HYPRE_Int not_found, size, indx; HYPRE_Int *my_offproc_cnt = NULL; num_threads = hypre_NumActiveThreads(); my_thread_num = hypre_GetThreadNum(); len = nrows / num_threads; rest = nrows - len * num_threads; if (my_thread_num < rest) { ns = my_thread_num * (len + 1); ne = (my_thread_num + 1) * (len + 1); } else { ns = my_thread_num * len + rest; ne = (my_thread_num + 1) * len + rest; } for (ii = ns; ii < ne; ii++) { row = rows[ii]; n = ncols ? ncols[ii] : 1; if (n == 0) /* empty row */ { continue; } indx = row_indexes[ii]; if (row >= row_partitioning[0] && row < row_partitioning[1]) { row_local = (HYPRE_Int)(row - row_partitioning[0]); /* compute local row number */ size = diag_i[row_local + 1] - diag_i[row_local] + offd_i[row_local + 1] - offd_i[row_local]; if (n > size) { hypre_error(HYPRE_ERROR_GENERIC); #ifdef HYPRE_USING_OPENMP #pragma omp atomic #endif error_flag++; if (print_level) { hypre_printf (" row %b too long! \n", row); } break; /*return hypre_error_flag; */ } pos_diag = diag_i[row_local]; pos_offd = offd_i[row_local]; len_diag = diag_i[row_local + 1]; len_offd = offd_i[row_local + 1]; not_found = 1; for (i = 0; i < n; i++) { if (cols[indx] < col_0 || cols[indx] > col_n) /* insert into offd */ { j_offd = hypre_BigBinarySearch(col_map_offd, cols[indx] - first, num_cols_offd); if (j_offd == -1) { hypre_error(HYPRE_ERROR_GENERIC); #ifdef HYPRE_USING_OPENMP #pragma omp atomic #endif error_flag++; if (print_level) { hypre_printf (" Error, element %b %b does not exist\n", row, cols[indx]); } break; /*return hypre_error_flag;*/ } for (j = pos_offd; j < len_offd; j++) { if (offd_j[j] == j_offd) { offd_data[j] += values[indx]; not_found = 0; break; } } if (not_found) { hypre_error(HYPRE_ERROR_GENERIC); #ifdef HYPRE_USING_OPENMP #pragma omp atomic #endif error_flag++; if (print_level) { hypre_printf (" Error, element %b %b does not exist\n", row, cols[indx]); } break; /*return hypre_error_flag;*/ } not_found = 1; } /* diagonal element */ else if (cols[indx] == row) { if (diag_j[pos_diag] != row_local) { hypre_error(HYPRE_ERROR_GENERIC); #ifdef HYPRE_USING_OPENMP #pragma omp atomic #endif error_flag++; if (print_level) { hypre_printf (" Error, element %b %b does not exist\n", row, cols[indx]); } break; /*return hypre_error_flag;*/ } diag_data[pos_diag] += values[indx]; } else /* insert into diag */ { for (j = pos_diag; j < len_diag; j++) { if (diag_j[j] == (HYPRE_Int)(cols[indx] - col_0)) { diag_data[j] += values[indx]; not_found = 0; break; } } if (not_found) { hypre_error(HYPRE_ERROR_GENERIC); #ifdef HYPRE_USING_OPENMP #pragma omp atomic #endif error_flag++; if (print_level) { hypre_printf (" Error, element %b %b does not exist\n", row, cols[indx]); } break; /*return hypre_error_flag;*/ } } indx++; } } /* not my row */ /* need to find solution for threaded version!!!! */ /* could save row number and process later .... */ else { if (!my_offproc_cnt) { my_offproc_cnt = hypre_CTAlloc(HYPRE_Int, 200, HYPRE_MEMORY_HOST); offproc_cnt[my_thread_num] = my_offproc_cnt; my_offproc_cnt[0] = 200; my_offproc_cnt[1] = 2; } i = my_offproc_cnt[1]; if (i + 2 < my_offproc_cnt[0]) { my_offproc_cnt[i] = ii; my_offproc_cnt[i + 1] = indx; my_offproc_cnt[1] += 2; } else { size = my_offproc_cnt[0]; my_offproc_cnt = hypre_TReAlloc(my_offproc_cnt, HYPRE_Int, size + 200, HYPRE_MEMORY_HOST); my_offproc_cnt[0] += 200; my_offproc_cnt[i] = ii; my_offproc_cnt[i + 1] = indx; my_offproc_cnt[1] += 2; } } } } /* end parallel region */ } /* not assembled */ else { aux_matrix = (hypre_AuxParCSRMatrix*) hypre_IJMatrixTranslator(matrix); if (aux_matrix) { current_num_elmts = hypre_AuxParCSRMatrixCurrentOffProcElmts(aux_matrix); off_proc_i_indx = hypre_AuxParCSRMatrixOffProcIIndx(aux_matrix); off_proc_i = hypre_AuxParCSRMatrixOffProcI(aux_matrix); off_proc_j = hypre_AuxParCSRMatrixOffProcJ(aux_matrix); } row_space = hypre_AuxParCSRMatrixRowSpace(aux_matrix); row_length = hypre_AuxParCSRMatrixRowLength(aux_matrix); need_aux = hypre_AuxParCSRMatrixNeedAux(aux_matrix); if (need_aux) { aux_j = hypre_AuxParCSRMatrixAuxJ(aux_matrix); aux_data = hypre_AuxParCSRMatrixAuxData(aux_matrix); } else { diag = hypre_ParCSRMatrixDiag(par_matrix); diag_i = hypre_CSRMatrixI(diag); diag_j = hypre_CSRMatrixJ(diag); diag_data = hypre_CSRMatrixData(diag); offd = hypre_ParCSRMatrixOffd(par_matrix); offd_i = hypre_CSRMatrixI(offd); if (num_procs > 1) { big_offd_j = hypre_CSRMatrixBigJ(offd); offd_data = hypre_CSRMatrixData(offd); if (!big_offd_j) { big_offd_j = hypre_CTAlloc(HYPRE_BigInt, offd_i[hypre_CSRMatrixNumRows(offd)], hypre_CSRMatrixMemoryLocation(offd)); hypre_CSRMatrixBigJ(offd) = big_offd_j; } } } #ifdef HYPRE_USING_OPENMP #pragma omp parallel #endif { HYPRE_Int num_threads, my_thread_num; HYPRE_Int len, rest, ns, ne; HYPRE_BigInt *tmp_j = NULL; HYPRE_BigInt *local_j = NULL; HYPRE_Complex *tmp_data = NULL; HYPRE_Complex *local_data = NULL; HYPRE_Int tmp_indx; HYPRE_Int row_local; HYPRE_BigInt row; HYPRE_Int i, j, ii, n; HYPRE_Int not_found, size, indx; HYPRE_Int old_size, space, cnt; HYPRE_Int *my_offproc_cnt = NULL; num_threads = hypre_NumActiveThreads(); my_thread_num = hypre_GetThreadNum(); len = nrows / num_threads; rest = nrows - len * num_threads; if (my_thread_num < rest) { ns = my_thread_num * (len + 1); ne = (my_thread_num + 1) * (len + 1); } else { ns = my_thread_num * len + rest; ne = (my_thread_num + 1) * len + rest; } for (ii = ns; ii < ne; ii++) { row = rows[ii]; n = ncols ? ncols[ii] : 1; if (n == 0) /* empty row */ { continue; } indx = row_indexes[ii]; if (row >= row_partitioning[0] && row < row_partitioning[1]) { row_local = (HYPRE_Int)(row - row_partitioning[0]); /* compute local row number */ if (need_aux) { local_j = aux_j[row_local]; local_data = aux_data[row_local]; space = row_space[row_local]; old_size = row_length[row_local]; size = space - old_size; if (size < n) { size = n - size; tmp_j = hypre_CTAlloc(HYPRE_BigInt, size, HYPRE_MEMORY_HOST); tmp_data = hypre_CTAlloc(HYPRE_Complex, size, HYPRE_MEMORY_HOST); } tmp_indx = 0; not_found = 1; size = old_size; for (i = 0; i < n; i++) { for (j = 0; j < old_size; j++) { if (local_j[j] == cols[indx]) { local_data[j] += values[indx]; not_found = 0; break; } } if (not_found) { if (size < space) { local_j[size] = cols[indx]; local_data[size++] = values[indx]; } else { tmp_j[tmp_indx] = cols[indx]; tmp_data[tmp_indx++] = values[indx]; } } not_found = 1; indx++; } row_length[row_local] = size + tmp_indx; if (tmp_indx) { aux_j[row_local] = hypre_TReAlloc(aux_j[row_local], HYPRE_BigInt, size + tmp_indx, HYPRE_MEMORY_HOST); aux_data[row_local] = hypre_TReAlloc(aux_data[row_local], HYPRE_Complex, size + tmp_indx, HYPRE_MEMORY_HOST); row_space[row_local] = size + tmp_indx; local_j = aux_j[row_local]; local_data = aux_data[row_local]; } cnt = size; for (i = 0; i < tmp_indx; i++) { local_j[cnt] = tmp_j[i]; local_data[cnt++] = tmp_data[i]; } if (tmp_j) { hypre_TFree(tmp_j, HYPRE_MEMORY_HOST); hypre_TFree(tmp_data, HYPRE_MEMORY_HOST); } } else /* insert immediately into data in ParCSRMatrix structure */ { HYPRE_Int offd_indx, diag_indx; HYPRE_Int offd_space, diag_space; HYPRE_Int cnt_diag, cnt_offd; offd_indx = hypre_AuxParCSRMatrixIndxOffd(aux_matrix)[row_local]; diag_indx = hypre_AuxParCSRMatrixIndxDiag(aux_matrix)[row_local]; cnt_diag = diag_indx; cnt_offd = offd_indx; diag_space = diag_i[row_local + 1]; offd_space = offd_i[row_local + 1]; not_found = 1; for (i = 0; i < n; i++) { if (cols[indx] < col_0 || cols[indx] > col_n) /* insert into offd */ { for (j = offd_i[row_local]; j < offd_indx; j++) { if (big_offd_j[j] == cols[indx]) { offd_data[j] += values[indx]; not_found = 0; break; } } if (not_found) { if (cnt_offd < offd_space) { big_offd_j[cnt_offd] = cols[indx]; offd_data[cnt_offd++] = values[indx]; } else { hypre_error(HYPRE_ERROR_GENERIC); #ifdef HYPRE_USING_OPENMP #pragma omp atomic #endif error_flag++; if (print_level) { hypre_printf("Error in row %b ! Too many elements!\n", row); } break; /*return hypre_error_flag;*/ } } not_found = 1; } else /* insert into diag */ { for (j = diag_i[row_local]; j < diag_indx; j++) { if (diag_j[j] == (HYPRE_Int)(cols[indx] - col_0)) { diag_data[j] += values[indx]; not_found = 0; break; } } if (not_found) { if (cnt_diag < diag_space) { diag_j[cnt_diag] = (HYPRE_Int)(cols[indx] - col_0); diag_data[cnt_diag++] = values[indx]; } else { hypre_error(HYPRE_ERROR_GENERIC); #ifdef HYPRE_USING_OPENMP #pragma omp atomic #endif error_flag++; if (print_level) { hypre_printf("Error in row %b ! Too many elements !\n", row); } break; /*return hypre_error_flag;*/ } } not_found = 1; } indx++; } hypre_AuxParCSRMatrixIndxDiag(aux_matrix)[row_local] = cnt_diag; hypre_AuxParCSRMatrixIndxOffd(aux_matrix)[row_local] = cnt_offd; } } /* not my row */ else { if (!my_offproc_cnt) { my_offproc_cnt = hypre_CTAlloc(HYPRE_Int, 200, HYPRE_MEMORY_HOST); offproc_cnt[my_thread_num] = my_offproc_cnt; my_offproc_cnt[0] = 200; my_offproc_cnt[1] = 2; } i = my_offproc_cnt[1]; if (i + 2 < my_offproc_cnt[0]) { my_offproc_cnt[i] = ii; my_offproc_cnt[i + 1] = indx; my_offproc_cnt[1] += 2; } else { size = my_offproc_cnt[0]; my_offproc_cnt = hypre_TReAlloc(my_offproc_cnt, HYPRE_Int, size + 200, HYPRE_MEMORY_HOST); offproc_cnt[my_thread_num] = my_offproc_cnt; my_offproc_cnt[0] += 200; my_offproc_cnt[i] = ii; my_offproc_cnt[i + 1] = indx; my_offproc_cnt[1] += 2; } } } } /*end parallel region */ } if (error_flag) { return hypre_error_flag; } if (!aux_matrix) { HYPRE_Int size = (HYPRE_Int)(row_partitioning[1] - row_partitioning[0]); hypre_AuxParCSRMatrixCreate(&aux_matrix, size, size, NULL); hypre_AuxParCSRMatrixNeedAux(aux_matrix) = 0; hypre_IJMatrixTranslator(matrix) = aux_matrix; } for (i1 = 0; i1 < max_num_threads; i1++) { if (offproc_cnt[i1]) { HYPRE_Int *my_offproc_cnt = offproc_cnt[i1]; HYPRE_Int i, i2, ii, n, indx; HYPRE_BigInt row; for (i2 = 2; i2 < my_offproc_cnt[1]; i2 += 2) { ii = my_offproc_cnt[i2]; row = rows[ii]; n = ncols ? ncols[ii] : 1; if (n == 0) /* empty row */ { continue; } indx = my_offproc_cnt[i2 + 1]; current_num_elmts = hypre_AuxParCSRMatrixCurrentOffProcElmts(aux_matrix); max_off_proc_elmts = hypre_AuxParCSRMatrixMaxOffProcElmts(aux_matrix); off_proc_i_indx = hypre_AuxParCSRMatrixOffProcIIndx(aux_matrix); off_proc_i = hypre_AuxParCSRMatrixOffProcI(aux_matrix); off_proc_j = hypre_AuxParCSRMatrixOffProcJ(aux_matrix); off_proc_data = hypre_AuxParCSRMatrixOffProcData(aux_matrix); if (!max_off_proc_elmts) { max_off_proc_elmts = hypre_max(n, 1000); hypre_AuxParCSRMatrixMaxOffProcElmts(aux_matrix) = max_off_proc_elmts; hypre_AuxParCSRMatrixOffProcI(aux_matrix) = hypre_CTAlloc(HYPRE_BigInt, 2 * max_off_proc_elmts, HYPRE_MEMORY_HOST); hypre_AuxParCSRMatrixOffProcJ(aux_matrix) = hypre_CTAlloc(HYPRE_BigInt, max_off_proc_elmts, HYPRE_MEMORY_HOST); hypre_AuxParCSRMatrixOffProcData(aux_matrix) = hypre_CTAlloc(HYPRE_Complex, max_off_proc_elmts, HYPRE_MEMORY_HOST); off_proc_i = hypre_AuxParCSRMatrixOffProcI(aux_matrix); off_proc_j = hypre_AuxParCSRMatrixOffProcJ(aux_matrix); off_proc_data = hypre_AuxParCSRMatrixOffProcData(aux_matrix); } else if (current_num_elmts + n > max_off_proc_elmts) { max_off_proc_elmts += 3 * n; off_proc_i = hypre_TReAlloc(off_proc_i, HYPRE_BigInt, 2 * max_off_proc_elmts, HYPRE_MEMORY_HOST); off_proc_j = hypre_TReAlloc(off_proc_j, HYPRE_BigInt, max_off_proc_elmts, HYPRE_MEMORY_HOST); off_proc_data = hypre_TReAlloc(off_proc_data, HYPRE_Complex, max_off_proc_elmts, HYPRE_MEMORY_HOST); hypre_AuxParCSRMatrixMaxOffProcElmts(aux_matrix) = max_off_proc_elmts; hypre_AuxParCSRMatrixOffProcI(aux_matrix) = off_proc_i; hypre_AuxParCSRMatrixOffProcJ(aux_matrix) = off_proc_j; hypre_AuxParCSRMatrixOffProcData(aux_matrix) = off_proc_data; } off_proc_i[off_proc_i_indx++] = row; off_proc_i[off_proc_i_indx++] = n; for (i = 0; i < n; i++) { off_proc_j[current_num_elmts] = cols[indx]; off_proc_data[current_num_elmts++] = values[indx++]; } hypre_AuxParCSRMatrixOffProcIIndx(aux_matrix) = off_proc_i_indx; hypre_AuxParCSRMatrixCurrentOffProcElmts(aux_matrix) = current_num_elmts; } hypre_TFree(offproc_cnt[i1], HYPRE_MEMORY_HOST); } } hypre_TFree(offproc_cnt, HYPRE_MEMORY_HOST); return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_IJMatrixMigrateParCSR *--------------------------------------------------------------------------*/ HYPRE_Int hypre_IJMatrixMigrateParCSR(hypre_IJMatrix *matrix, HYPRE_MemoryLocation memory_location) { hypre_ParCSRMatrix *par_matrix = (hypre_ParCSRMatrix *) hypre_IJMatrixObject(matrix); /* Migrate the ParCSR matrix */ hypre_ParCSRMatrixMigrate(par_matrix, memory_location); return hypre_error_flag; } hypre-2.33.0/src/IJ_mv/IJMatrix_parcsr_device.c000066400000000000000000001377741477326011500212760ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * IJMatrix_ParCSR interface * *****************************************************************************/ #include "_hypre_onedpl.hpp" #include "_hypre_IJ_mv.h" #include "_hypre_utilities.hpp" #if defined(HYPRE_USING_GPU) __global__ void hypreGPUKernel_IJMatrixValues_dev1(hypre_DeviceItem &item, HYPRE_Int n, HYPRE_Int *rowind, HYPRE_Int *row_ptr, HYPRE_Int *row_len, HYPRE_Int *mark) { HYPRE_Int global_thread_id = hypre_gpu_get_grid_thread_id<1, 1>(item); if (global_thread_id < n) { HYPRE_Int row = rowind[global_thread_id]; if (global_thread_id < read_only_load(&row_ptr[row]) + read_only_load(&row_len[row])) { mark[global_thread_id] = 0; } else { mark[global_thread_id] = -1; } } } HYPRE_Int hypre_AuxParCSRMatrixStackReallocate(hypre_AuxParCSRMatrix *aux_matrix, HYPRE_BigInt new_stack_max) { HYPRE_BigInt stack_max = hypre_AuxParCSRMatrixMaxStackElmts(aux_matrix); hypre_AuxParCSRMatrixStackI(aux_matrix) = hypre_TReAlloc_v2(hypre_AuxParCSRMatrixStackI(aux_matrix), HYPRE_BigInt, stack_max, HYPRE_BigInt, new_stack_max, HYPRE_MEMORY_DEVICE); hypre_AuxParCSRMatrixStackJ(aux_matrix) = hypre_TReAlloc_v2(hypre_AuxParCSRMatrixStackJ(aux_matrix), HYPRE_BigInt, stack_max, HYPRE_BigInt, new_stack_max, HYPRE_MEMORY_DEVICE); hypre_AuxParCSRMatrixStackData(aux_matrix) = hypre_TReAlloc_v2(hypre_AuxParCSRMatrixStackData(aux_matrix), HYPRE_Complex, stack_max, HYPRE_Complex, new_stack_max, HYPRE_MEMORY_DEVICE); hypre_AuxParCSRMatrixStackSorA(aux_matrix) = hypre_TReAlloc_v2(hypre_AuxParCSRMatrixStackSorA(aux_matrix), char, stack_max, char, new_stack_max, HYPRE_MEMORY_DEVICE); hypre_AuxParCSRMatrixMaxStackElmts(aux_matrix) = new_stack_max; return hypre_error_flag; } inline void hypre_AuxParCSRMatrixStackPrintInfo(hypre_IJMatrix *matrix) { static HYPRE_Int counter = 0; hypre_AuxParCSRMatrix *aux_matrix = (hypre_AuxParCSRMatrix *) hypre_IJMatrixTranslator(matrix); hypre_ParPrintf(hypre_IJMatrixComm(matrix), " %d, %d, %d\n", ++counter, hypre_AuxParCSRMatrixMaxStackElmts(aux_matrix), hypre_AuxParCSRMatrixCurrentStackElmts(aux_matrix)); } /* E.g. nrows = 3 * ncols = 2 3 4 * rows = 10 20 30 * rows_indexes = 0 4 9 * (0 1 2 3 | 4 5 6 7 8 | 9 10 11 12 13) * cols = x x ! ! | * * * ! ! | + + + + ! * values = . . ! ! | . . . ! ! | . . . . ! */ HYPRE_Int hypre_IJMatrixSetAddValuesParCSRDevice( hypre_IJMatrix *matrix, HYPRE_Int nrows, HYPRE_Int *ncols, /* if NULL, == all ones */ const HYPRE_BigInt *rows, const HYPRE_Int *row_indexes, /* if NULL, == ex_scan of ncols, i.e, no gap */ const HYPRE_BigInt *cols, const HYPRE_Complex *values, const char *action ) { HYPRE_BigInt *row_partitioning = hypre_IJMatrixRowPartitioning(matrix); HYPRE_BigInt *col_partitioning = hypre_IJMatrixColPartitioning(matrix); HYPRE_BigInt row_start = row_partitioning[0]; HYPRE_BigInt row_end = row_partitioning[1]; HYPRE_BigInt col_start = col_partitioning[0]; HYPRE_BigInt col_end = col_partitioning[1]; HYPRE_Int num_local_rows = row_end - row_start; HYPRE_Int num_local_cols = col_end - col_start; const char SorA = action[0] == 's' ? 1 : 0; hypre_AuxParCSRMatrix *aux_matrix = (hypre_AuxParCSRMatrix *) hypre_IJMatrixTranslator(matrix); HYPRE_Int nelms; HYPRE_Int *row_ptr = NULL; HYPRE_Int early_assemble_flag = 0; /* expand rows into full expansion of rows based on ncols * if ncols == NULL, ncols is all ones, so rows are indeed full expansion */ if (ncols) { row_ptr = hypre_TAlloc(HYPRE_Int, nrows + 1, HYPRE_MEMORY_DEVICE); hypre_TMemcpy(row_ptr, ncols, HYPRE_Int, nrows, HYPRE_MEMORY_DEVICE, HYPRE_MEMORY_DEVICE); /* RL: have to init the last entry !!! */ hypre_Memset(row_ptr + nrows, 0, sizeof(HYPRE_Int), HYPRE_MEMORY_DEVICE); hypreDevice_IntegerExclusiveScan(nrows + 1, row_ptr); hypre_TMemcpy(&nelms, row_ptr + nrows, HYPRE_Int, 1, HYPRE_MEMORY_HOST, HYPRE_MEMORY_DEVICE); } else { nelms = nrows; } if (nelms <= 0) { hypre_TFree(row_ptr, HYPRE_MEMORY_DEVICE); return hypre_error_flag; } if (!aux_matrix) { hypre_AuxParCSRMatrixCreate(&aux_matrix, num_local_rows, num_local_cols, NULL); hypre_AuxParCSRMatrixInitialize_v2(aux_matrix, HYPRE_MEMORY_DEVICE); hypre_IJMatrixTranslator(matrix) = aux_matrix; } HYPRE_BigInt stack_elmts_max = hypre_AuxParCSRMatrixMaxStackElmts(aux_matrix); HYPRE_BigInt stack_elmts_current = hypre_AuxParCSRMatrixCurrentStackElmts(aux_matrix); HYPRE_BigInt stack_elmts_required = stack_elmts_current + (HYPRE_BigInt) nelms; HYPRE_BigInt *stack_i = hypre_AuxParCSRMatrixStackI(aux_matrix); HYPRE_BigInt *stack_j = hypre_AuxParCSRMatrixStackJ(aux_matrix); HYPRE_Complex *stack_data = hypre_AuxParCSRMatrixStackData(aux_matrix); char *stack_sora = hypre_AuxParCSRMatrixStackSorA(aux_matrix); HYPRE_Int early_assemble = hypre_AuxParCSRMatrixEarlyAssemble(aux_matrix); if ( stack_elmts_max < stack_elmts_required ) { HYPRE_BigInt stack_elmts_max_new = 0; if (stack_elmts_max == 0) { /* intial allocation */ if ( hypre_AuxParCSRMatrixUsrOnProcElmts (aux_matrix) > 0 && hypre_AuxParCSRMatrixUsrOffProcElmts(aux_matrix) > 0 ) { stack_elmts_max_new = hypre_AuxParCSRMatrixUsrOnProcElmts (aux_matrix) + hypre_AuxParCSRMatrixUsrOffProcElmts(aux_matrix); } else { stack_elmts_max_new = num_local_rows * hypre_AuxParCSRMatrixInitAllocFactor(aux_matrix); } stack_elmts_max_new = hypre_max(stack_elmts_required, stack_elmts_max_new); } else { if (early_assemble) { stack_elmts_max_new = stack_elmts_required; early_assemble_flag = 1; } else { stack_elmts_max_new = stack_elmts_required * hypre_AuxParCSRMatrixGrowFactor(aux_matrix); } } hypre_AuxParCSRMatrixStackReallocate(aux_matrix, stack_elmts_max_new); stack_i = hypre_AuxParCSRMatrixStackI(aux_matrix); stack_j = hypre_AuxParCSRMatrixStackJ(aux_matrix); stack_data = hypre_AuxParCSRMatrixStackData(aux_matrix); stack_sora = hypre_AuxParCSRMatrixStackSorA(aux_matrix); stack_elmts_max = hypre_AuxParCSRMatrixMaxStackElmts(aux_matrix); } hypreDevice_CharFilln(stack_sora + stack_elmts_current, nelms, SorA); if (ncols) { hypreDevice_CsrRowPtrsToIndicesWithRowNum(nrows, nelms, row_ptr, (HYPRE_BigInt *) rows, stack_i + stack_elmts_current); } else { hypre_TMemcpy(stack_i + stack_elmts_current, rows, HYPRE_BigInt, nelms, HYPRE_MEMORY_DEVICE, HYPRE_MEMORY_DEVICE); } if (row_indexes) { HYPRE_Int len, len1; hypre_TMemcpy(&len1, &row_indexes[nrows - 1], HYPRE_Int, 1, HYPRE_MEMORY_HOST, HYPRE_MEMORY_DEVICE); if (ncols) { hypre_TMemcpy(&len, &ncols[nrows - 1], HYPRE_Int, 1, HYPRE_MEMORY_HOST, HYPRE_MEMORY_DEVICE); } else { len = 1; } /* this is the *effective* length of cols and values */ len += len1; HYPRE_Int *indicator = hypre_CTAlloc(HYPRE_Int, len, HYPRE_MEMORY_DEVICE); hypreDevice_CsrRowPtrsToIndices_v2(nrows - 1, len1, (HYPRE_Int *) row_indexes, indicator); /* mark unwanted elements as -1 */ dim3 bDim = hypre_GetDefaultDeviceBlockDimension(); dim3 gDim = hypre_GetDefaultDeviceGridDimension(len1, "thread", bDim); HYPRE_GPU_LAUNCH( hypreGPUKernel_IJMatrixValues_dev1, gDim, bDim, len1, indicator, (HYPRE_Int *) row_indexes, ncols, indicator ); #if defined(HYPRE_USING_SYCL) auto zip_in = oneapi::dpl::make_zip_iterator(cols, values); auto zip_out = oneapi::dpl::make_zip_iterator(stack_j + stack_elmts_current, stack_data + stack_elmts_current); auto new_end = hypreSycl_copy_if( zip_in, zip_in + len, indicator, zip_out, is_nonnegative() ); HYPRE_Int nnz_tmp = std::get<0>(new_end.base()) - (stack_j + stack_elmts_current); #else auto new_end = HYPRE_THRUST_CALL( copy_if, thrust::make_zip_iterator(thrust::make_tuple(cols, values)), thrust::make_zip_iterator(thrust::make_tuple(cols + len, values + len)), indicator, thrust::make_zip_iterator(thrust::make_tuple(stack_j + stack_elmts_current, stack_data + stack_elmts_current)), is_nonnegative() ); HYPRE_Int nnz_tmp = thrust::get<0>(new_end.get_iterator_tuple()) - (stack_j + stack_elmts_current); #endif hypre_assert(nnz_tmp == nelms); hypre_TFree(indicator, HYPRE_MEMORY_DEVICE); } else { hypre_TMemcpy(stack_j + stack_elmts_current, cols, HYPRE_BigInt, nelms, HYPRE_MEMORY_DEVICE, HYPRE_MEMORY_DEVICE); hypre_TMemcpy(stack_data + stack_elmts_current, values, HYPRE_Complex, nelms, HYPRE_MEMORY_DEVICE, HYPRE_MEMORY_DEVICE); } stack_elmts_current += (HYPRE_BigInt) nelms; hypre_AuxParCSRMatrixCurrentStackElmts(aux_matrix) = stack_elmts_current; /* for debug */ // hypre_AuxParCSRMatrixStackPrintInfo(matrix); if (early_assemble_flag) { hypre_IJMatrixAssembleCompressDevice(matrix, 0); stack_elmts_current = hypre_AuxParCSRMatrixCurrentStackElmts(aux_matrix); stack_elmts_max = hypre_AuxParCSRMatrixMaxStackElmts(aux_matrix); HYPRE_BigInt stack_elmts_max_new = stack_elmts_current * hypre_AuxParCSRMatrixGrowFactor( aux_matrix); if (stack_elmts_max_new != stack_elmts_max) { hypre_AuxParCSRMatrixStackReallocate(aux_matrix, stack_elmts_max_new); } //hypre_AuxParCSRMatrixStackPrintInfo(matrix); } hypre_TFree(row_ptr, HYPRE_MEMORY_DEVICE); return hypre_error_flag; } #if defined(HYPRE_USING_SYCL) template struct hypre_IJMatrixAssembleFunctor { typedef std::tuple Tuple; Tuple operator()(const Tuple& x, const Tuple& y ) const { return std::make_tuple( hypre_max(std::get<0>(x), std::get<0>(y)), std::get<1>(x) + std::get<1>(y) ); } }; #else template struct hypre_IJMatrixAssembleFunctor : public thrust::binary_function< thrust::tuple, thrust::tuple, thrust::tuple > { typedef thrust::tuple Tuple; __device__ Tuple operator()(const Tuple& x, const Tuple& y ) { return thrust::make_tuple( hypre_max(thrust::get<0>(x), thrust::get<0>(y)), thrust::get<1>(x) + thrust::get<1>(y) ); } }; #endif /* This helper routine is used in hypre_IJMatrixAssembleParCSRDevice on on-proc entries: * 1. sort (X0, A0) with key (I0, J0) * put the diagonal first by hypreDevice_StableSortTupleByTupleKey(..., 2) * see the comments in cuda_utils.c * 2. for each segment in (I0, J0), zero out in A0 all before the last `set' * 3. reduce A0 [with sum] and reduce X0 [with max] * The reason of using max for X0 is that once an entry has a set (1), which may be * combined with adds, should continue to be considered as a set. * This is the correct behavior when combined with existing CSR * On entry * N: size of I, J, X, A * On return * N: the number of entries in I, J, X, A, after reduction * Note: (I, J, X, A) have length "size" */ HYPRE_Int hypre_IJMatrixAssembleSortAndReduce1(HYPRE_Int *Nptr, HYPRE_BigInt **Iptr, HYPRE_BigInt **Jptr, char **Xptr, HYPRE_Complex **Aptr, HYPRE_Int size) { HYPRE_Int N0 = *Nptr; HYPRE_BigInt *I0 = *Iptr; HYPRE_BigInt *J0 = *Jptr; char *X0 = *Xptr; HYPRE_Complex *A0 = *Aptr; hypreDevice_StableSortTupleByTupleKey(N0, I0, J0, X0, A0, 2); HYPRE_BigInt *I = hypre_TAlloc(HYPRE_BigInt, size, HYPRE_MEMORY_DEVICE); HYPRE_BigInt *J = hypre_TAlloc(HYPRE_BigInt, size, HYPRE_MEMORY_DEVICE); char *X = hypre_TAlloc(char, size, HYPRE_MEMORY_DEVICE); HYPRE_Complex *A = hypre_TAlloc(HYPRE_Complex, size, HYPRE_MEMORY_DEVICE); /* dim3 bDim = hypre_GetDefaultDeviceBlockDimension(); dim3 gDim = hypre_GetDefaultDeviceGridDimension(N0, "thread", bDim); HYPRE_GPU_LAUNCH( hypreGPUKernel_IJMatrixAssembleSortAndReduce1, gDim, bDim, N0, I0, J0, X0, A0 ); */ /* output X: 0: keep, 1: zero-out */ #if defined(HYPRE_USING_SYCL) HYPRE_ONEDPL_CALL( oneapi::dpl::exclusive_scan_by_segment, oneapi::dpl::make_reverse_iterator( oneapi::dpl::make_zip_iterator(I0 + N0, J0 + N0)), /* key begin */ oneapi::dpl::make_reverse_iterator( oneapi::dpl::make_zip_iterator(I0, J0)), /* key end */ oneapi::dpl::make_reverse_iterator(X0 + N0), /* input value begin */ oneapi::dpl::make_reverse_iterator(X + N0), /* output value begin */ char(0), /* init */ std::equal_to< std::tuple >(), oneapi::dpl::maximum() ); hypreSycl_transform_if(A0, A0 + N0, X, A0, [] (const auto & x) {return 0.0;}, [] (const auto & x) {return x;} ); auto I0_J0_zip = oneapi::dpl::make_zip_iterator(I0, J0); auto new_end = HYPRE_ONEDPL_CALL( oneapi::dpl::reduce_by_segment, I0_J0_zip, /* keys_first */ I0_J0_zip + N0, /* keys_last */ oneapi::dpl::make_zip_iterator(X0, A0), /* values_first */ oneapi::dpl::make_zip_iterator(I, J), /* keys_output */ oneapi::dpl::make_zip_iterator(X, A), /* values_output */ std::equal_to< std::tuple >(), /* binary_pred */ hypre_IJMatrixAssembleFunctor() /* binary_op */); *Nptr = std::get<0>(new_end.first.base()) - I; #else HYPRE_THRUST_CALL( exclusive_scan_by_key, thrust::make_reverse_iterator(thrust::make_zip_iterator(thrust::make_tuple(I0 + N0, J0 + N0))), thrust::make_reverse_iterator(thrust::make_zip_iterator(thrust::make_tuple(I0, J0))), thrust::make_reverse_iterator(thrust::device_pointer_cast(X0) + N0), thrust::make_reverse_iterator(thrust::device_pointer_cast(X) + N0), char(0), thrust::equal_to< thrust::tuple >(), thrust::maximum() ); HYPRE_THRUST_CALL(replace_if, A0, A0 + N0, X, thrust::identity(), 0.0); auto new_end = HYPRE_THRUST_CALL( reduce_by_key, thrust::make_zip_iterator(thrust::make_tuple(I0, J0 )), /* keys_first */ thrust::make_zip_iterator(thrust::make_tuple(I0 + N0, J0 + N0)), /* keys_last */ thrust::make_zip_iterator(thrust::make_tuple(X0, A0 )), /* values_first */ thrust::make_zip_iterator(thrust::make_tuple(I, J )), /* keys_output */ thrust::make_zip_iterator(thrust::make_tuple(X, A )), /* values_output */ thrust::equal_to< thrust::tuple >(), /* binary_pred */ hypre_IJMatrixAssembleFunctor() /* binary_op */); *Nptr = thrust::get<0>(new_end.first.get_iterator_tuple()) - I; #endif hypre_TFree(I0, HYPRE_MEMORY_DEVICE); hypre_TFree(J0, HYPRE_MEMORY_DEVICE); hypre_TFree(X0, HYPRE_MEMORY_DEVICE); hypre_TFree(A0, HYPRE_MEMORY_DEVICE); *Iptr = I; *Jptr = J; *Xptr = X; *Aptr = A; return hypre_error_flag; } #if defined(HYPRE_USING_SYCL) template struct hypre_IJMatrixAssembleFunctor2 { typedef std::tuple Tuple; __device__ Tuple operator()(const Tuple& x, const Tuple& y) const { const char tx = std::get<0>(x); const char ty = std::get<0>(y); const HYPRE_Complex vx = std::get<1>(x); const HYPRE_Complex vy = std::get<1>(y); const HYPRE_Complex vz = tx == 0 && ty == 0 ? vx + vy : tx ? vx : vy; return std::make_tuple(0, vz); } }; #else template struct hypre_IJMatrixAssembleFunctor2 : public thrust::binary_function< thrust::tuple, thrust::tuple, thrust::tuple > { typedef thrust::tuple Tuple; __device__ Tuple operator()(const Tuple& x, const Tuple& y) { const char tx = thrust::get<0>(x); const char ty = thrust::get<0>(y); const HYPRE_Complex vx = thrust::get<1>(x); const HYPRE_Complex vy = thrust::get<1>(y); const HYPRE_Complex vz = tx == 0 && ty == 0 ? vx + vy : tx ? vx : vy; return thrust::make_tuple(0, vz); } }; #endif /* This helper routine is for combining new entries with existing CSR. * Opt = 2 for diag part to keep diagonal first = 0 for offd part */ HYPRE_Int hypre_IJMatrixAssembleSortAndReduce2(HYPRE_Int *Nptr, HYPRE_Int **Iptr, HYPRE_Int **Jptr, char *X0, HYPRE_Complex **Aptr, HYPRE_Int opt) { HYPRE_Int N0 = *Nptr; HYPRE_Int *I0 = *Iptr; HYPRE_Int *J0 = *Jptr; HYPRE_Complex *A0 = *Aptr; hypreDevice_StableSortTupleByTupleKey(N0, I0, J0, X0, A0, opt); HYPRE_Int *I = hypre_TAlloc(HYPRE_Int, N0, HYPRE_MEMORY_DEVICE); HYPRE_Int *J = hypre_TAlloc(HYPRE_Int, N0, HYPRE_MEMORY_DEVICE); /* RL: no need to have X. No use before the free at the end */ char *X = hypre_TAlloc(char, N0, HYPRE_MEMORY_DEVICE); HYPRE_Complex *A = hypre_TAlloc(HYPRE_Complex, N0, HYPRE_MEMORY_DEVICE); #if defined(HYPRE_USING_SYCL) auto new_end = HYPRE_ONEDPL_CALL( oneapi::dpl::reduce_by_segment, oneapi::dpl::make_zip_iterator(I0, J0), /* keys_first */ oneapi::dpl::make_zip_iterator(I0 + N0, J0 + N0), /* keys_last */ oneapi::dpl::make_zip_iterator(X0, A0), /* values_first */ oneapi::dpl::make_zip_iterator(I, J), /* keys_output */ oneapi::dpl::make_zip_iterator(X, A), /* values_output */ std::equal_to< std::tuple >(), /* binary_pred */ hypre_IJMatrixAssembleFunctor2() /* binary_op */); HYPRE_Int N = std::get<0>(new_end.first.base()) - I; #else auto new_end = HYPRE_THRUST_CALL( reduce_by_key, thrust::make_zip_iterator(thrust::make_tuple(I0, J0 )), /* keys_first */ thrust::make_zip_iterator(thrust::make_tuple(I0 + N0, J0 + N0)), /* keys_last */ thrust::make_zip_iterator(thrust::make_tuple(X0, A0 )), /* values_first */ thrust::make_zip_iterator(thrust::make_tuple(I, J )), /* keys_output */ thrust::make_zip_iterator(thrust::make_tuple(X, A )), /* values_output */ thrust::equal_to< thrust::tuple >(), /* binary_pred */ hypre_IJMatrixAssembleFunctor2() /* binary_op */); HYPRE_Int N = thrust::get<0>(new_end.first.get_iterator_tuple()) - I; #endif hypre_TFree(I0, HYPRE_MEMORY_DEVICE); hypre_TFree(J0, HYPRE_MEMORY_DEVICE); hypre_TFree(A0, HYPRE_MEMORY_DEVICE); J = hypre_TReAlloc_v2(J, HYPRE_Int, N0, HYPRE_Int, N, HYPRE_MEMORY_DEVICE); A = hypre_TReAlloc_v2(A, HYPRE_Complex, N0, HYPRE_Complex, N, HYPRE_MEMORY_DEVICE); *Nptr = N; *Iptr = I; *Jptr = J; *Aptr = A; hypre_TFree(X, HYPRE_MEMORY_DEVICE); return hypre_error_flag; } /* This is used on off-proc entries before sending them to other procs * 1. StableSort * 2. Zero out all prior to the last set (including the set itself), since off-proc set is not allowed * 3. Reduce A (sum) by key (I, J). * 4. Remove numerical zeros * On return: * N1 is the new length of I, J and A * Content of X0 is destroyed * Note: * No need to reduce X, since all should be add */ HYPRE_Int hypre_IJMatrixAssembleSortAndReduce3(HYPRE_Int N0, HYPRE_BigInt *I0, HYPRE_BigInt *J0, char *X0, HYPRE_Complex *A0, HYPRE_Int *N1) { hypreDevice_StableSortTupleByTupleKey(N0, I0, J0, X0, A0, 0); HYPRE_BigInt *I = hypre_TAlloc(HYPRE_BigInt, N0, HYPRE_MEMORY_DEVICE); HYPRE_BigInt *J = hypre_TAlloc(HYPRE_BigInt, N0, HYPRE_MEMORY_DEVICE); HYPRE_Complex *A = hypre_TAlloc(HYPRE_Complex, N0, HYPRE_MEMORY_DEVICE); #if defined(HYPRE_USING_SYCL) HYPRE_ONEDPL_CALL( oneapi::dpl::inclusive_scan_by_segment, oneapi::dpl::make_reverse_iterator( oneapi::dpl::make_zip_iterator(I0 + N0, J0 + N0)), /* key begin */ oneapi::dpl::make_reverse_iterator( oneapi::dpl::make_zip_iterator(I0, J0)), /* key end */ oneapi::dpl::make_reverse_iterator(X0 + N0), /* input value begin */ oneapi::dpl::make_reverse_iterator(X0 + N0), /* output value begin */ std::equal_to< std::tuple >(), oneapi::dpl::maximum() ); hypreSycl_transform_if(A0, A0 + N0, X0, A0, [] (const auto & x) {return 0.0;}, [] (const auto & x) {return x;} ); auto I0_J0_zip = oneapi::dpl::make_zip_iterator(I0, J0); auto new_end = HYPRE_ONEDPL_CALL( oneapi::dpl::reduce_by_segment, I0_J0_zip, /* keys_first */ I0_J0_zip + N0, /* keys_last */ A0, /* values_first */ oneapi::dpl::make_zip_iterator(I, J), /* keys_output */ A, /* values_output */ std::equal_to< std::tuple >() /* binary_pred */); #else /* output in X0: 0: keep, 1: zero-out */ HYPRE_THRUST_CALL( inclusive_scan_by_key, thrust::make_reverse_iterator(thrust::make_zip_iterator(thrust::make_tuple(I0 + N0, J0 + N0))), thrust::make_reverse_iterator(thrust::make_zip_iterator(thrust::make_tuple(I0, J0))), thrust::make_reverse_iterator(thrust::device_pointer_cast(X0) + N0), thrust::make_reverse_iterator(thrust::device_pointer_cast(X0) + N0), thrust::equal_to< thrust::tuple >(), thrust::maximum() ); HYPRE_THRUST_CALL(replace_if, A0, A0 + N0, X0, thrust::identity(), 0.0); auto new_end = HYPRE_THRUST_CALL( reduce_by_key, thrust::make_zip_iterator(thrust::make_tuple(I0, J0 )), /* keys_first */ thrust::make_zip_iterator(thrust::make_tuple(I0 + N0, J0 + N0)), /* keys_last */ A0, /* values_first */ thrust::make_zip_iterator(thrust::make_tuple(I, J )), /* keys_output */ A, /* values_output */ thrust::equal_to< thrust::tuple >() /* binary_pred */); #endif HYPRE_Int Nt = new_end.second - A; hypre_assert(Nt <= N0); /* remove numrical zeros */ #if defined(HYPRE_USING_SYCL) auto new_end2 = hypreSycl_copy_if( oneapi::dpl::make_zip_iterator(I, J, A), oneapi::dpl::make_zip_iterator(I + Nt, J + Nt, A + Nt), A, oneapi::dpl::make_zip_iterator(I0, J0, A0), [] (const auto & x) {return x;}); *N1 = std::get<0>(new_end2.base()) - I0; #else auto new_end2 = HYPRE_THRUST_CALL( copy_if, thrust::make_zip_iterator(thrust::make_tuple(I, J, A)), thrust::make_zip_iterator(thrust::make_tuple(I + Nt, J + Nt, A + Nt)), A, thrust::make_zip_iterator(thrust::make_tuple(I0, J0, A0)), thrust::identity() ); *N1 = thrust::get<0>(new_end2.get_iterator_tuple()) - I0; #endif hypre_assert(*N1 <= Nt); hypre_TFree(I, HYPRE_MEMORY_DEVICE); hypre_TFree(J, HYPRE_MEMORY_DEVICE); hypre_TFree(A, HYPRE_MEMORY_DEVICE); return hypre_error_flag; } HYPRE_Int hypre_IJMatrixAssembleCommunicate(hypre_IJMatrix *matrix) { MPI_Comm comm = hypre_IJMatrixComm(matrix); HYPRE_BigInt *row_partitioning = hypre_IJMatrixRowPartitioning(matrix); HYPRE_BigInt row_start = row_partitioning[0]; HYPRE_BigInt row_end = row_partitioning[1]; hypre_AuxParCSRMatrix *aux_matrix = (hypre_AuxParCSRMatrix*) hypre_IJMatrixTranslator(matrix); HYPRE_Int nelms = hypre_AuxParCSRMatrixCurrentStackElmts(aux_matrix); HYPRE_BigInt *stack_i = hypre_AuxParCSRMatrixStackI(aux_matrix); HYPRE_BigInt *stack_j = hypre_AuxParCSRMatrixStackJ(aux_matrix); HYPRE_Complex *stack_data = hypre_AuxParCSRMatrixStackData(aux_matrix); char *stack_sora = hypre_AuxParCSRMatrixStackSorA(aux_matrix); in_range pred(row_start, row_end - 1); #if defined(HYPRE_USING_SYCL) HYPRE_Int nelms_on = HYPRE_ONEDPL_CALL(std::count_if, stack_i, stack_i + nelms, pred); #else HYPRE_Int nelms_on = HYPRE_THRUST_CALL(count_if, stack_i, stack_i + nelms, pred); #endif HYPRE_Int nelms_off = nelms - nelms_on; HYPRE_Int nelms_off_max; hypre_MPI_Allreduce(&nelms_off, &nelms_off_max, 1, HYPRE_MPI_INT, hypre_MPI_MAX, comm); /* communicate for aux off-proc and add to remote aux on-proc */ if (nelms_off_max) { HYPRE_Int new_nnz = 0; HYPRE_BigInt *off_proc_i = NULL; HYPRE_BigInt *off_proc_j = NULL; HYPRE_Complex *off_proc_data = NULL; if (nelms_off) { /* copy off-proc entries out of stack and remove from stack */ off_proc_i = hypre_TAlloc(HYPRE_BigInt, nelms_off, HYPRE_MEMORY_DEVICE); off_proc_j = hypre_TAlloc(HYPRE_BigInt, nelms_off, HYPRE_MEMORY_DEVICE); off_proc_data = hypre_TAlloc(HYPRE_Complex, nelms_off, HYPRE_MEMORY_DEVICE); char *off_proc_sora = hypre_TAlloc(char, nelms_off, HYPRE_MEMORY_DEVICE); char *is_on_proc = hypre_TAlloc(char, nelms, HYPRE_MEMORY_DEVICE); #if defined(HYPRE_USING_SYCL) HYPRE_ONEDPL_CALL(std::transform, stack_i, stack_i + nelms, is_on_proc, pred); auto zip_in = oneapi::dpl::make_zip_iterator(stack_i, stack_j, stack_data, stack_sora); auto zip_out = oneapi::dpl::make_zip_iterator(off_proc_i, off_proc_j, off_proc_data, off_proc_sora); auto new_end1 = hypreSycl_copy_if( zip_in, /* first */ zip_in + nelms, /* last */ is_on_proc, /* stencil */ zip_out, /* result */ [] (const auto & x) {return !x;} ); hypre_assert(std::get<0>(new_end1.base()) - off_proc_i == nelms_off); /* remove off-proc entries from stack */ auto new_end2 = hypreSycl_remove_if( zip_in, /* first */ zip_in + nelms, /* last */ is_on_proc, /* stencil */ [] (const auto & x) {return !x;} ); hypre_assert(std::get<0>(new_end2.base()) - stack_i == nelms_on); #else HYPRE_THRUST_CALL(transform, stack_i, stack_i + nelms, is_on_proc, pred); auto new_end1 = HYPRE_THRUST_CALL( copy_if, thrust::make_zip_iterator(thrust::make_tuple(stack_i, stack_j, stack_data, stack_sora )), /* first */ thrust::make_zip_iterator(thrust::make_tuple(stack_i + nelms, stack_j + nelms, stack_data + nelms, stack_sora + nelms)), /* last */ is_on_proc, /* stencil */ thrust::make_zip_iterator(thrust::make_tuple(off_proc_i, off_proc_j, off_proc_data, off_proc_sora)), /* result */ thrust::not1(thrust::identity()) ); hypre_assert(thrust::get<0>(new_end1.get_iterator_tuple()) - off_proc_i == nelms_off); /* remove off-proc entries from stack */ auto new_end2 = HYPRE_THRUST_CALL( remove_if, thrust::make_zip_iterator(thrust::make_tuple(stack_i, stack_j, stack_data, stack_sora )), /* first */ thrust::make_zip_iterator(thrust::make_tuple(stack_i + nelms, stack_j + nelms, stack_data + nelms, stack_sora + nelms)), /* last */ is_on_proc, /* stencil */ thrust::not1(thrust::identity()) ); hypre_assert(thrust::get<0>(new_end2.get_iterator_tuple()) - stack_i == nelms_on); #endif hypre_AuxParCSRMatrixCurrentStackElmts(aux_matrix) = nelms_on; hypre_TFree(is_on_proc, HYPRE_MEMORY_DEVICE); hypre_IJMatrixAssembleSortAndReduce3(nelms_off, off_proc_i, off_proc_j, off_proc_sora, off_proc_data, &new_nnz); hypre_TFree(off_proc_sora, HYPRE_MEMORY_DEVICE); } /* send new_i/j/data to remote processes and the receivers call addtovalues */ hypre_IJMatrixAssembleOffProcValsParCSR(matrix, -1, -1, new_nnz, HYPRE_MEMORY_DEVICE, off_proc_i, off_proc_j, off_proc_data); hypre_TFree(off_proc_i, HYPRE_MEMORY_DEVICE); hypre_TFree(off_proc_j, HYPRE_MEMORY_DEVICE); hypre_TFree(off_proc_data, HYPRE_MEMORY_DEVICE); } return hypre_error_flag; } HYPRE_Int hypre_IJMatrixAssembleCompressDevice(hypre_IJMatrix *matrix, HYPRE_Int reduce_stack_size) { hypre_AuxParCSRMatrix *aux_matrix = (hypre_AuxParCSRMatrix*) hypre_IJMatrixTranslator(matrix); HYPRE_Int nelms = hypre_AuxParCSRMatrixCurrentStackElmts(aux_matrix); HYPRE_BigInt *stack_i = hypre_AuxParCSRMatrixStackI(aux_matrix); HYPRE_BigInt *stack_j = hypre_AuxParCSRMatrixStackJ(aux_matrix); HYPRE_Complex *stack_data = hypre_AuxParCSRMatrixStackData(aux_matrix); char *stack_sora = hypre_AuxParCSRMatrixStackSorA(aux_matrix); #if defined(HYPRE_DEBUG) /* in the final assembly, at this stage, the stack should only have on-proc elements */ if (reduce_stack_size) { HYPRE_BigInt *row_partitioning = hypre_IJMatrixRowPartitioning(matrix); HYPRE_BigInt row_start = row_partitioning[0]; HYPRE_BigInt row_end = row_partitioning[1]; in_range pred(row_start, row_end - 1); #if defined(HYPRE_USING_SYCL) HYPRE_Int tmp = HYPRE_ONEDPL_CALL(std::count_if, stack_i, stack_i + nelms, pred); #else HYPRE_Int tmp = HYPRE_THRUST_CALL(count_if, stack_i, stack_i + nelms, pred); #endif hypre_assert(nelms == tmp); } #endif if (nelms) { if (reduce_stack_size) { hypre_AuxParCSRMatrixMaxStackElmts(aux_matrix) = nelms; } hypre_IJMatrixAssembleSortAndReduce1(&nelms, &stack_i, &stack_j, &stack_sora, &stack_data, hypre_AuxParCSRMatrixMaxStackElmts(aux_matrix)); hypre_AuxParCSRMatrixCurrentStackElmts(aux_matrix) = nelms; hypre_AuxParCSRMatrixStackI(aux_matrix) = stack_i; hypre_AuxParCSRMatrixStackJ(aux_matrix) = stack_j; hypre_AuxParCSRMatrixStackData(aux_matrix) = stack_data; hypre_AuxParCSRMatrixStackSorA(aux_matrix) = stack_sora; } return hypre_error_flag; } HYPRE_Int hypre_IJMatrixAssembleParCSRDevice(hypre_IJMatrix *matrix) { HYPRE_BigInt *row_partitioning = hypre_IJMatrixRowPartitioning(matrix); HYPRE_BigInt *col_partitioning = hypre_IJMatrixColPartitioning(matrix); HYPRE_BigInt row_start = row_partitioning[0]; HYPRE_BigInt row_end = row_partitioning[1]; HYPRE_BigInt col_start = col_partitioning[0]; HYPRE_BigInt col_end = col_partitioning[1]; HYPRE_BigInt col_first = hypre_IJMatrixGlobalFirstCol(matrix); HYPRE_Int nrows = row_end - row_start; HYPRE_Int ncols = col_end - col_start; hypre_ParCSRMatrix *par_matrix = (hypre_ParCSRMatrix*) hypre_IJMatrixObject(matrix); hypre_AuxParCSRMatrix *aux_matrix = (hypre_AuxParCSRMatrix*) hypre_IJMatrixTranslator(matrix); if (!aux_matrix) { return hypre_error_flag; } if (!par_matrix) { return hypre_error_flag; } hypre_IJMatrixAssembleCommunicate(matrix); hypre_IJMatrixAssembleCompressDevice(matrix, 1); // hypre_AuxParCSRMatrixStackPrintInfo(matrix); HYPRE_Int nelms = hypre_AuxParCSRMatrixCurrentStackElmts(aux_matrix); HYPRE_BigInt *stack_i = hypre_AuxParCSRMatrixStackI(aux_matrix); HYPRE_BigInt *stack_j = hypre_AuxParCSRMatrixStackJ(aux_matrix); HYPRE_Complex *stack_data = hypre_AuxParCSRMatrixStackData(aux_matrix); char *stack_sora = hypre_AuxParCSRMatrixStackSorA(aux_matrix); if (nelms) { /* adjust row indices from global to local */ HYPRE_Int *stack_i_local = hypre_TAlloc(HYPRE_Int, nelms, HYPRE_MEMORY_DEVICE); #if defined(HYPRE_USING_SYCL) HYPRE_ONEDPL_CALL( std::transform, stack_i, stack_i + nelms, stack_i_local, [row_start = row_start] (const auto & x) {return x - row_start;} ); #else HYPRE_THRUST_CALL( transform, stack_i, stack_i + nelms, stack_i_local, _1 - row_start ); #endif /* adjust column indices wrt the global first index */ if (col_first) { #if defined(HYPRE_USING_SYCL) HYPRE_ONEDPL_CALL( std::transform, stack_j, stack_j + nelms, stack_j, [col_first = col_first] (const auto & x) {return x - col_first;} ); #else HYPRE_THRUST_CALL( transform, stack_j, stack_j + nelms, stack_j, _1 - col_first ); #endif } HYPRE_Int num_cols_offd_new; HYPRE_BigInt *col_map_offd_new; HYPRE_Int *col_map_offd_map; HYPRE_Int diag_nnz_new; HYPRE_Int *diag_i_new = NULL; HYPRE_Int *diag_j_new = NULL; HYPRE_Complex *diag_a_new = NULL; char *diag_sora_new = NULL; HYPRE_Int offd_nnz_new; HYPRE_Int *offd_i_new = NULL; HYPRE_Int *offd_j_new = NULL; HYPRE_Complex *offd_a_new = NULL; char *offd_sora_new = NULL; HYPRE_Int diag_nnz_existed = hypre_CSRMatrixNumNonzeros(hypre_ParCSRMatrixDiag(par_matrix)); HYPRE_Int offd_nnz_existed = hypre_CSRMatrixNumNonzeros(hypre_ParCSRMatrixOffd(par_matrix)); hypre_CSRMatrixSplitDevice_core( 0, nrows, nelms, NULL, stack_j, NULL, NULL, col_start - col_first, col_end - col_first - 1, -1, NULL, NULL, NULL, NULL, &diag_nnz_new, NULL, NULL, NULL, NULL, &offd_nnz_new, NULL, NULL, NULL, NULL ); if (diag_nnz_new) { diag_i_new = hypre_TAlloc(HYPRE_Int, diag_nnz_existed + diag_nnz_new, HYPRE_MEMORY_DEVICE); diag_j_new = hypre_TAlloc(HYPRE_Int, diag_nnz_existed + diag_nnz_new, HYPRE_MEMORY_DEVICE); diag_a_new = hypre_TAlloc(HYPRE_Complex, diag_nnz_existed + diag_nnz_new, HYPRE_MEMORY_DEVICE); if (diag_nnz_existed) { diag_sora_new = hypre_TAlloc(char, diag_nnz_existed + diag_nnz_new, HYPRE_MEMORY_DEVICE); } } if (offd_nnz_new) { offd_i_new = hypre_TAlloc(HYPRE_Int, offd_nnz_existed + offd_nnz_new, HYPRE_MEMORY_DEVICE); offd_j_new = hypre_TAlloc(HYPRE_Int, offd_nnz_existed + offd_nnz_new, HYPRE_MEMORY_DEVICE); offd_a_new = hypre_TAlloc(HYPRE_Complex, offd_nnz_existed + offd_nnz_new, HYPRE_MEMORY_DEVICE); if (offd_nnz_existed) { offd_sora_new = hypre_TAlloc(char, offd_nnz_existed + offd_nnz_new, HYPRE_MEMORY_DEVICE); } } /* split IJ into diag and offd */ hypre_CSRMatrixSplitDevice_core( 1, nrows, nelms, stack_i_local, stack_j, stack_data, diag_nnz_existed || offd_nnz_existed ? stack_sora : NULL, col_start - col_first, col_end - col_first - 1, hypre_CSRMatrixNumCols(hypre_ParCSRMatrixOffd(par_matrix)), hypre_ParCSRMatrixDeviceColMapOffd(par_matrix), &col_map_offd_map, &num_cols_offd_new, &col_map_offd_new, &diag_nnz_new, diag_i_new + diag_nnz_existed, diag_j_new + diag_nnz_existed, diag_a_new + diag_nnz_existed, diag_nnz_existed ? diag_sora_new + diag_nnz_existed : NULL, &offd_nnz_new, offd_i_new + offd_nnz_existed, offd_j_new + offd_nnz_existed, offd_a_new + offd_nnz_existed, offd_nnz_existed ? offd_sora_new + offd_nnz_existed : NULL ); hypre_TFree(stack_i_local, HYPRE_MEMORY_DEVICE); /* expand the existing Parcsr's diag/offd and compress with the stack */ if (diag_nnz_new > 0) { HYPRE_Int diag_nnz = diag_nnz_existed + diag_nnz_new; if (diag_nnz_existed) { /* the existing parcsr should come first and the entries are "add" */ hypreDevice_CsrRowPtrsToIndices_v2(nrows, diag_nnz_existed, hypre_CSRMatrixI(hypre_ParCSRMatrixDiag(par_matrix)), diag_i_new); hypre_TMemcpy(diag_j_new, hypre_CSRMatrixJ(hypre_ParCSRMatrixDiag(par_matrix)), HYPRE_Int, diag_nnz_existed, HYPRE_MEMORY_DEVICE, HYPRE_MEMORY_DEVICE); hypre_TMemcpy(diag_a_new, hypre_CSRMatrixData(hypre_ParCSRMatrixDiag(par_matrix)), HYPRE_Complex, diag_nnz_existed, HYPRE_MEMORY_DEVICE, HYPRE_MEMORY_DEVICE); hypreDevice_CharFilln(diag_sora_new, diag_nnz_existed, 0); hypre_IJMatrixAssembleSortAndReduce2(&diag_nnz, &diag_i_new, &diag_j_new, diag_sora_new, &diag_a_new, 2); } hypre_CSRMatrix *diag = hypre_CSRMatrixCreate(nrows, ncols, diag_nnz); hypre_CSRMatrixI(diag) = hypreDevice_CsrRowIndicesToPtrs(nrows, diag_nnz, diag_i_new); hypre_CSRMatrixJ(diag) = diag_j_new; hypre_CSRMatrixData(diag) = diag_a_new; hypre_CSRMatrixMemoryLocation(diag) = HYPRE_MEMORY_DEVICE; hypre_TFree(diag_i_new, HYPRE_MEMORY_DEVICE); hypre_TFree(diag_sora_new, HYPRE_MEMORY_DEVICE); hypre_CSRMatrixDestroy(hypre_ParCSRMatrixDiag(par_matrix)); hypre_ParCSRMatrixDiag(par_matrix) = diag; } if (offd_nnz_new > 0) { HYPRE_Int offd_nnz = offd_nnz_existed + offd_nnz_new; if (offd_nnz_existed) { /* the existing parcsr should come first and the entries are "add" */ hypreDevice_CsrRowPtrsToIndices_v2(nrows, offd_nnz_existed, hypre_CSRMatrixI(hypre_ParCSRMatrixOffd(par_matrix)), offd_i_new); /* adjust with the new col_map_offd_map */ #if defined(HYPRE_USING_SYCL) hypreSycl_gather( hypre_CSRMatrixJ(hypre_ParCSRMatrixOffd(par_matrix)), hypre_CSRMatrixJ(hypre_ParCSRMatrixOffd(par_matrix)) + offd_nnz_existed, col_map_offd_map, offd_j_new ); #else HYPRE_THRUST_CALL( gather, hypre_CSRMatrixJ(hypre_ParCSRMatrixOffd(par_matrix)), hypre_CSRMatrixJ(hypre_ParCSRMatrixOffd(par_matrix)) + offd_nnz_existed, col_map_offd_map, offd_j_new ); #endif hypre_TMemcpy(offd_a_new, hypre_CSRMatrixData(hypre_ParCSRMatrixOffd(par_matrix)), HYPRE_Complex, offd_nnz_existed, HYPRE_MEMORY_DEVICE, HYPRE_MEMORY_DEVICE); hypreDevice_CharFilln(offd_sora_new, offd_nnz_existed, 0); hypre_IJMatrixAssembleSortAndReduce2(&offd_nnz, &offd_i_new, &offd_j_new, offd_sora_new, &offd_a_new, 0); } hypre_CSRMatrix *offd = hypre_CSRMatrixCreate(nrows, num_cols_offd_new, offd_nnz); hypre_CSRMatrixI(offd) = hypreDevice_CsrRowIndicesToPtrs(nrows, offd_nnz, offd_i_new); hypre_CSRMatrixJ(offd) = offd_j_new; hypre_CSRMatrixData(offd) = offd_a_new; hypre_CSRMatrixMemoryLocation(offd) = HYPRE_MEMORY_DEVICE; hypre_TFree(offd_i_new, HYPRE_MEMORY_DEVICE); hypre_TFree(offd_sora_new, HYPRE_MEMORY_DEVICE); hypre_CSRMatrixDestroy(hypre_ParCSRMatrixOffd(par_matrix)); hypre_ParCSRMatrixOffd(par_matrix) = offd; hypre_TFree(hypre_ParCSRMatrixDeviceColMapOffd(par_matrix), HYPRE_MEMORY_DEVICE); hypre_ParCSRMatrixDeviceColMapOffd(par_matrix) = col_map_offd_new; hypre_TFree(hypre_ParCSRMatrixColMapOffd(par_matrix), HYPRE_MEMORY_HOST); hypre_ParCSRMatrixColMapOffd(par_matrix) = hypre_TAlloc(HYPRE_BigInt, num_cols_offd_new, HYPRE_MEMORY_HOST); hypre_TMemcpy(hypre_ParCSRMatrixColMapOffd(par_matrix), col_map_offd_new, HYPRE_BigInt, num_cols_offd_new, HYPRE_MEMORY_HOST, HYPRE_MEMORY_DEVICE); col_map_offd_new = NULL; } hypre_TFree(col_map_offd_map, HYPRE_MEMORY_DEVICE); hypre_TFree(col_map_offd_new, HYPRE_MEMORY_DEVICE); } /* if (nelms) */ hypre_IJMatrixAssembleFlag(matrix) = 1; hypre_AuxParCSRMatrixDestroy(aux_matrix); hypre_IJMatrixTranslator(matrix) = NULL; return hypre_error_flag; } HYPRE_Int hypre_IJMatrixSetConstantValuesParCSRDevice( hypre_IJMatrix *matrix, HYPRE_Complex value ) { hypre_ParCSRMatrix *par_matrix = (hypre_ParCSRMatrix *) hypre_IJMatrixObject( matrix ); hypre_CSRMatrix *diag = hypre_ParCSRMatrixDiag(par_matrix); hypre_CSRMatrix *offd = hypre_ParCSRMatrixOffd(par_matrix); HYPRE_Complex *diag_data = hypre_CSRMatrixData(diag); HYPRE_Complex *offd_data = hypre_CSRMatrixData(offd); HYPRE_Int nnz_diag = hypre_CSRMatrixNumNonzeros(diag); HYPRE_Int nnz_offd = hypre_CSRMatrixNumNonzeros(offd); hypreDevice_ComplexFilln( diag_data, nnz_diag, value ); hypreDevice_ComplexFilln( offd_data, nnz_offd, value ); return hypre_error_flag; } #endif hypre-2.33.0/src/IJ_mv/IJMatrix_petsc.c000066400000000000000000000766121477326011500175740ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * IJMatrix_PETSc interface * *****************************************************************************/ #include "_hypre_IJ_mv.h" /****************************************************************************** * * hypre_IJMatrixSetLocalSizePETSc * * sets local number of rows and number of columns of diagonal matrix on * current processor. * *****************************************************************************/ HYPRE_Int hypre_IJMatrixSetLocalSizePETSc(hypre_IJMatrix *matrix, HYPRE_Int local_m, HYPRE_Int local_n) { HYPRE_Int ierr = 0; hypre_AuxParCSRMatrix *aux_data; aux_data = hypre_IJMatrixTranslator(matrix); if (aux_data) { hypre_AuxParCSRMatrixLocalNumRows(aux_data) = local_m; hypre_AuxParCSRMatrixLocalNumCols(aux_data) = local_n; } else { hypre_IJMatrixTranslator(matrix) = hypre_AuxParCSRMatrixCreate(local_m, local_n, NULL); } return ierr; } /****************************************************************************** * * hypre_IJMatrixCreatePETSc * * creates AuxParCSRMatrix and ParCSRMatrix if necessary, * generates arrays row_starts and col_starts using either previously * set data local_m and local_n (user defined) or generates them evenly * distributed if not previously defined by user. * *****************************************************************************/ HYPRE_Int hypre_IJMatrixCreatePETSc(hypre_IJMatrix *matrix) { MPI_Comm comm = hypre_IJMatrixContext(matrix); HYPRE_BigInt global_m = hypre_IJMatrixM(matrix); HYPRE_BigInt global_n = hypre_IJMatrixN(matrix); hypre_AuxParCSRMatrix *aux_matrix = hypre_IJMatrixTranslator(matrix); HYPRE_Int local_m; HYPRE_Int local_n; HYPRE_Int ierr = 0; HYPRE_BigInt *row_starts; HYPRE_BigInt *col_starts; HYPRE_Int num_cols_offd = 0; HYPRE_Int num_nonzeros_diag = 0; HYPRE_Int num_nonzeros_offd = 0; HYPRE_Int num_procs, my_id; HYPRE_Int equal; HYPRE_Int i; hypre_MPI_Comm_size(comm, &num_procs); hypre_MPI_Comm_rank(comm, &my_id); if (aux_matrix) { local_m = hypre_AuxParCSRMatrixLocalNumRows(aux_matrix); local_n = hypre_AuxParCSRMatrixLocalNumCols(aux_matrix); } else { aux_matrix = hypre_AuxParCSRMatrixCreate(-1, -1, NULL); local_m = -1; local_n = -1; hypre_IJMatrixTranslator(matrix) = aux_matrix; } if (local_m < 0) { row_starts = NULL; } else { row_starts = hypre_CTAlloc(HYPRE_BigInt, num_procs + 1, HYPRE_MEMORY_HOST); if (my_id == 0 && local_m == global_m) { row_starts[1] = (HYRE_BigInt)local_m; } else { HYPRE_BigInt big_local_m = (HYPRE_BigInt) local_m; hypre_MPI_Allgather(&big_local_m, 1, HYPRE_MPI_BIG_INT, &row_starts[1], 1, HYPRE_MPI_BIG_INT, comm); } } if (local_n < 0) { col_starts = NULL; } else { col_starts = hypre_CTAlloc(HYPRE_BigInt, num_procs + 1, HYPRE_MEMORY_HOST); if (my_id == 0 && local_n == global_n) { col_starts[1] = (HYPRE_BigInt) local_n; } else { HYPRE_BigInt big_local_n = (HYPRE_BigInt) local_n; hypre_MPI_Allgather(&big_local_n, 1, HYPRE_MPI_BIG_INT, &col_starts[1], 1, HYPRE_MPI_BIG_INT, comm); } } if (row_starts && col_starts) { equal = 1; for (i = 0; i < num_procs; i++) { row_starts[i + 1] += row_starts[i]; col_starts[i + 1] += col_starts[i]; if (row_starts[i + 1] != col_starts[i + 1]) { equal = 0; } } if (equal) { hypre_TFree(col_starts, HYPRE_MEMORY_HOST); col_starts = row_starts; } } hypre_IJMatrixLocalStorage(matrix) = hypre_ParCSRMatrixCreate(comm, global_m, global_n, row_starts, col_starts, num_cols_offd, num_nonzeros_diag, num_nonzeros_offd); return ierr; } /****************************************************************************** * * hypre_IJMatrixSetRowSizesPETSc * *****************************************************************************/ HYPRE_Int hypre_IJMatrixSetRowSizesPETSc(hypre_IJMatrix *matrix, HYPRE_Int *sizes) { HYPRE_Int *row_space; HYPRE_Int local_num_rows; HYPRE_Int i; hypre_AuxParCSRMatrix *aux_matrix; aux_matrix = hypre_IJMatrixTranslator(matrix); if (aux_matrix) { local_num_rows = hypre_AuxParCSRMatrixLocalNumRows(aux_matrix); } else { return -1; } row_space = hypre_AuxParCSRMatrixRowSpace(aux_matrix); if (!row_space) { row_space = hypre_CTAlloc(HYPRE_Int, local_num_rows, HYPRE_MEMORY_HOST); } for (i = 0; i < local_num_rows; i++) { row_space[i] = sizes[i]; } hypre_AuxParCSRMatrixRowSpace(aux_matrix) = row_space; return 0; } /****************************************************************************** * * hypre_IJMatrixSetDiagRowSizesPETSc * sets diag_i inside the diag part of the ParCSRMatrix, * requires exact sizes for diag * *****************************************************************************/ HYPRE_Int hypre_IJMatrixSetDiagRowSizesPETSc(hypre_IJMatrix *matrix, HYPRE_Int *sizes) { HYPRE_Int local_num_rows; HYPRE_Int i; hypre_ParCSRMatrix *par_matrix; hypre_CSRMatrix *diag; HYPRE_Int *diag_i; par_matrix = hypre_IJMatrixLocalStorage(matrix); if (!par_matrix) { return -1; } diag = hypre_ParCSRMatrixDiag(par_matrix); diag_i = hypre_CSRMatrixI(diag); local_num_rows = hypre_CSRMatrixNumRows(diag); if (!diag_i) { diag_i = hypre_CTAlloc(HYPRE_Int, local_num_rows + 1, HYPRE_MEMORY_HOST); } for (i = 0; i < local_num_rows + 1; i++) { diag_i[i] = sizes[i]; } hypre_CSRMatrixI(diag) = diag_i; hypre_CSRMatrixNumNonzeros(diag) = diag_i[local_num_rows]; return 0; } /****************************************************************************** * * hypre_IJMatrixSetOffDiagRowSizesPETSc * sets offd_i inside the offd part of the ParCSRMatrix, * requires exact sizes for offd * *****************************************************************************/ HYPRE_Int hypre_IJMatrixSetOffDiagRowSizesPETSc(hypre_IJMatrix *matrix, HYPRE_Int *sizes) { HYPRE_Int local_num_rows; HYPRE_Int i; hypre_ParCSRMatrix *par_matrix; hypre_CSRMatrix *offd; HYPRE_Int *offd_i; par_matrix = hypre_IJMatrixLocalStorage(matrix); if (!par_matrix) { return -1; } offd = hypre_ParCSRMatrixOffd(par_matrix); offd_i = hypre_CSRMatrixI(offd); local_num_rows = hypre_CSRMatrixNumRows(offd); if (!offd_i) { offd_i = hypre_CTAlloc(HYPRE_Int, local_num_rows + 1, HYPRE_MEMORY_HOST); } for (i = 0; i < local_num_rows + 1; i++) { offd_i[i] = sizes[i]; } hypre_CSRMatrixI(offd) = offd_i; hypre_CSRMatrixNumNonzeros(offd) = offd_i[local_num_rows]; return 0; } /****************************************************************************** * * hypre_IJMatrixInitializePETSc * * initializes AuxParCSRMatrix and ParCSRMatrix as necessary * *****************************************************************************/ HYPRE_Int hypre_IJMatrixInitializePETSc(hypre_IJMatrix *matrix) { HYPRE_Int ierr = 0; hypre_ParCSRMatrix *par_matrix = hypre_IJMatrixLocalStorage(matrix); hypre_AuxParCSRMatrix *aux_matrix = hypre_IJMatrixTranslator(matrix); HYPRE_Int local_num_rows = hypre_AuxParCSRMatrixLocalNumRows(aux_matrix); HYPRE_Int local_num_cols = hypre_AuxParCSRMatrixLocalNumCols(aux_matrix); HYPRE_Int *row_space = hypre_AuxParCSRMatrixRowSpace(aux_matrix); HYPRE_Int num_nonzeros = hypre_ParCSRMatrixNumNonzeros(par_matrix); HYPRE_Int local_nnz; HYPRE_Int num_procs, my_id; MPI_Comm comm = hypre_IJMatrixContext(matrix); HYPRE_BigInt global_num_rows = hypre_IJMatrixM(matrix); hypre_MPI_Comm_size(comm, &num_procs); hypre_MPI_Comm_rank(comm, &my_id); local_nnz = (num_nonzeros / global_num_rows + 1) * local_num_rows; if (local_num_rows < 0) hypre_AuxParCSRMatrixLocalNumRows(aux_matrix) = hypre_CSRMatrixNumRows(hypre_ParCSRMatrixDiag(par_matrix)); if (local_num_cols < 0) hypre_AuxParCSRMatrixLocalNumCols(aux_matrix) = hypre_CSRMatrixNumCols(hypre_ParCSRMatrixDiag(par_matrix)); ierr = hypre_AuxParCSRMatrixInitialize(aux_matrix); ierr += hypre_ParCSRMatrixBigInitialize(par_matrix); return ierr; } /****************************************************************************** * * hypre_IJMatrixInsertBlockPETSc * * inserts a block of values into an IJMatrix, currently it just uses * InsertIJMatrixRowPETSc * *****************************************************************************/ HYPRE_Int hypre_IJMatrixInsertBlockPETSc(hypre_IJMatrix *matrix, HYPRE_Int m, HYPRE_Int n, HYPRE_BigInt *rows, HYPRE_BigInt *cols, HYPRE_Complex *coeffs) { HYPRE_Int ierr = 0; HYPRE_Int i, in; for (i = 0; i < m; i++) { in = i * n; hypre_IJMatrixInsertRowPETSc(matrix, n, rows[i], &cols[in], &coeffs[in]); } return ierr; } /****************************************************************************** * * hypre_IJMatrixAddToBlockPETSc * * adds a block of values to an IJMatrix, currently it just uses * IJMatrixAddToRowPETSc * *****************************************************************************/ HYPRE_Int hypre_IJMatrixAddToBlockPETSc(hypre_IJMatrix *matrix, HYPRE_Int m, HYPRE_Int n, HYPRE_BigInt *rows, HYPRE_BigInt *cols, HYPRE_Complex *coeffs) { HYPRE_Int ierr = 0; HYPRE_Int i, in; for (i = 0; i < m; i++) { in = i * n; hypre_IJMatrixAddToRowPETSc(matrix, n, rows[i], &cols[in], &coeffs[in]); } return ierr; } /****************************************************************************** * * hypre_IJMatrixInsertRowPETSc * * inserts a row into an IJMatrix, * if diag_i and offd_i are known, those values are inserted directly * into the ParCSRMatrix, * if they are not known, an auxiliary structure, AuxParCSRMatrix is used * *****************************************************************************/ HYPRE_Int hypre_IJMatrixInsertRowPETSc(hypre_IJMatrix *matrix, HYPRE_Int n, HYPRE_BigInt row, HYPRE_BigInt *indices, HYPRE_Complex *coeffs) { HYPRE_Int ierr = 0; hypre_ParCSRMatrix *par_matrix; hypre_AuxParCSRMatrix *aux_matrix; HYPRE_BigInt *row_starts; HYPRE_BigInt *col_starts; MPI_Comm comm = hypre_IJMatrixContext(matrix); HYPRE_Int num_procs, my_id; HYPRE_Int row_local; HYPRE_BigInt col_0, col_n; HYPRE_Int i, temp; HYPRE_Int *indx_diag, *indx_offd; HYPRE_BigInt **aux_j; HYPRE_BigInt *local_j; HYPRE_Complex **aux_data; HYPRE_Complex *local_data; HYPRE_Int diag_space, offd_space; HYPRE_Int *row_length, *row_space; HYPRE_Int need_aux; HYPRE_Int indx_0; HYPRE_Int diag_indx, offd_indx; hypre_CSRMatrix *diag; HYPRE_Int *diag_i; HYPRE_Int *diag_j; HYPRE_Complex *diag_data; hypre_CSRMatrix *offd; HYPRE_Int *offd_i; HYPRE_BigInt *big_offd_j; HYPRE_Complex *offd_data; hypre_MPI_Comm_size(comm, &num_procs); hypre_MPI_Comm_rank(comm, &my_id); par_matrix = hypre_IJMatrixLocalStorage( matrix ); aux_matrix = hypre_IJMatrixTranslator(matrix); row_space = hypre_AuxParCSRMatrixRowSpace(aux_matrix); row_length = hypre_AuxParCSRMatrixRowLength(aux_matrix); col_n = hypre_ParCSRMatrixFirstColDiag(par_matrix); row_starts = hypre_ParCSRMatrixRowStarts(par_matrix); col_starts = hypre_ParCSRMatrixColStarts(par_matrix); col_0 = col_starts[my_id]; col_n = col_starts[my_id + 1] - 1; need_aux = hypre_AuxParCSRMatrixNeedAux(aux_matrix); if (row >= row_starts[my_id] && row < row_starts[my_id + 1]) { if (need_aux) { row_local = (HYPRE_Int)(row - row_starts[my_id]); /* compute local row number */ aux_j = hypre_AuxParCSRMatrixAuxJ(aux_matrix); aux_data = hypre_AuxParCSRMatrixAuxData(aux_matrix); local_j = aux_j[row_local]; local_data = aux_data[row_local]; row_length[row_local] = n; if ( row_space[row_local] < n) { hypre_TFree(local_j, HYPRE_MEMORY_HOST); hypre_TFree(local_data, HYPRE_MEMORY_HOST); local_j = hypre_CTAlloc(HYPRE_Int, n, HYPRE_MEMORY_HOST); local_data = hypre_CTAlloc(HYPRE_Complex, n, HYPRE_MEMORY_HOST); row_space[row_local] = n; } for (i = 0; i < n; i++) { local_j[i] = indices[i]; local_data[i] = coeffs[i]; } /* make sure first element is diagonal element, if not, find it and exchange it with first element */ if (local_j[0] != row_local) { for (i = 1; i < n; i++) { if (local_j[i] == row_local) { local_j[i] = local_j[0]; local_j[0] = (HYPRE_BigInt)row_local; temp = local_data[0]; local_data[0] = local_data[i]; local_data[i] = temp; break; } } } /* sort data according to column indices, except for first element */ BigQsort1(local_j, local_data, 1, n - 1); } else /* insert immediately into data into ParCSRMatrix structure */ { diag = hypre_ParCSRMatrixDiag(par_matrix); offd = hypre_ParCSRMatrixOffd(par_matrix); diag_i = hypre_CSRMatrixI(diag); diag_j = hypre_CSRMatrixJ(diag); diag_data = hypre_CSRMatrixData(diag); offd_i = hypre_CSRMatrixI(offd); big_offd_j = hypre_CSRMatrixBigJ(offd); offd_data = hypre_CSRMatrixData(offd); offd_indx = offd_i[row_local]; indx_0 = diag_i[row_local]; diag_indx = indx_0 + 1; for (i = 0; i < n; i++) { if (indices[i] < col_0 || indices[i] > col_n)/* insert into offd */ { big_offd_j[offd_indx] = indices[i]; offd_data[offd_indx++] = coeffs[i]; } else if (indices[i] == row) /* diagonal element */ { diag_j[indx_0] = (HYPRE_Int)(indices[i] - col_0); diag_data[indx_0] = coeffs[i]; } else /* insert into diag */ { diag_j[diag_indx] = (HYPRE_Int)(indices[i] - col_0); diag_data[diag_indx++] = coeffs[i]; } } BigQsort1(big_offd_j, offd_data, 0, offd_indx - 1); qsort1(diag_j, diag_data, 1, diag_indx - 1); hypre_AuxParCSRMatrixIndxDiag(aux_matrix)[row_local] = diag_indx; hypre_AuxParCSRMatrixIndxOffd(aux_matrix)[row_local] = offd_indx; } } return ierr; } /****************************************************************************** * * hypre_IJMatrixAddToRowPETSc * * adds a row to an IJMatrix before assembly, * *****************************************************************************/ HYPRE_Int hypre_IJMatrixAddToRowPETSc(hypre_IJMatrix *matrix, HYPRE_Int n, HYPRE_BigInt row, HYPRE_BigInt *indices, HYPRE_Complex *coeffs) { HYPRE_Int ierr = 0; hypre_ParCSRMatrix *par_matrix; hypre_CSRMatrix *diag, *offd; hypre_AuxParCSRMatrix *aux_matrix; HYPRE_BigInt *row_starts; HYPRE_BigInt *col_starts; MPI_Comm comm = hypre_IJMatrixContext(matrix); HYPRE_Int num_procs, my_id; HYPRE_Int row_local; HYPRE_BigInt col_0, col_n; HYPRE_Int i, temp; HYPRE_Int *indx_diag, *indx_offd; HYPRE_BigInt **aux_j; HYPRE_BigInt *local_j; HYPRE_BigInt *tmp_j, *tmp2_j; HYPRE_Complex **aux_data; HYPRE_Complex *local_data; HYPRE_Complex *tmp_data, *tmp2_data; HYPRE_Int diag_space, offd_space; HYPRE_Int *row_length, *row_space; HYPRE_Int need_aux; HYPRE_Int tmp_indx, indx; HYPRE_Int size, old_size; HYPRE_Int cnt, cnt_diag, cnt_offd, indx_0; HYPRE_Int offd_indx, diag_indx; HYPRE_Int *diag_i; HYPRE_Int *diag_j; HYPRE_Complex *diag_data; HYPRE_Int *offd_i; HYPRE_BigInt *big_offd_j; HYPRE_Complex *offd_data; HYPRE_Int *tmp_diag_i; HYPRE_Int *tmp_diag_j; HYPRE_Complex *tmp_diag_data; HYPRE_Int *tmp_offd_i; HYPRE_BigInt *tmp_offd_j; HYPRE_Complex *tmp_offd_data; hypre_MPI_Comm_size(comm, &num_procs); hypre_MPI_Comm_rank(comm, &my_id); par_matrix = hypre_IJMatrixLocalStorage( matrix ); aux_matrix = hypre_IJMatrixTranslator(matrix); row_space = hypre_AuxParCSRMatrixRowSpace(aux_matrix); row_length = hypre_AuxParCSRMatrixRowLength(aux_matrix); row_starts = hypre_ParCSRMatrixRowStarts(par_matrix); col_starts = hypre_ParCSRMatrixColStarts(par_matrix); col_0 = col_starts[my_id]; col_n = col_starts[my_id + 1] - 1; need_aux = hypre_AuxParCSRMatrixNeedAux(aux_matrix); if (row >= row_starts[my_id] && row < row_starts[my_id + 1]) { if (need_aux) { row_local = row - row_starts[my_id]; /* compute local row number */ aux_j = hypre_AuxParCSRMatrixAuxJ(aux_matrix); aux_data = hypre_AuxParCSRMatrixAuxData(aux_matrix); local_j = aux_j[row_local]; local_data = aux_data[row_local]; tmp_j = hypre_CTAlloc(HYPRE_BigInt, n, HYPRE_MEMORY_HOST); tmp_data = hypre_CTAlloc(HYPRE_Complex, n, HYPRE_MEMORY_HOST); tmp_indx = 0; for (i = 0; i < n; i++) { if (indices[i] == row) { local_data[0] += coeffs[i]; } else { tmp_j[tmp_indx] = indices[i]; tmp_data[tmp_indx++] = coeffs[i]; } } BigQsort1(tmp_j, tmp_data, 0, tmp_indx - 1); indx = 0; size = 0; for (i = 1; i < row_length[row_local]; i++) { while (local_j[i] > tmp_j[indx]) { size++; indx++; } if (local_j[i] == tmp_j[indx]) { size++; indx++; } } size += tmp_indx - indx; old_size = row_length[row_local]; row_length[row_local] = size; if ( row_space[row_local] < size) { tmp2_j = hypre_CTAlloc(HYPRE_BigInt, size, HYPRE_MEMORY_HOST); tmp2_data = hypre_CTAlloc(HYPRE_Complex, size, HYPRE_MEMORY_HOST); for (i = 0; i < old_size; i++) { tmp2_j[i] = local_j[i]; tmp2_data[i] = local_data[i]; } hypre_TFree(local_j, HYPRE_MEMORY_HOST); hypre_TFree(local_data, HYPRE_MEMORY_HOST); local_j = tmp2_j; local_data = tmp2_data; row_space[row_local] = n; } /* merge local and tmp into local */ indx = 0; cnt = row_length[row_local]; for (i = 1; i < old_size; i++) { while (local_j[i] > tmp_j[indx]) { local_j[cnt] = tmp_j[indx]; local_data[cnt++] = tmp_data[indx++]; } if (local_j[i] == tmp_j[indx]) { local_j[i] += tmp_j[indx]; local_data[i] += tmp_data[indx++]; } } for (i = indx; i < tmp_indx; i++) { local_j[cnt] = tmp_j[i]; local_data[cnt++] = tmp_data[i]; } /* sort data according to column indices, except for first element */ BigQsort1(local_j, local_data, 1, n - 1); hypre_TFree(tmp_j, HYPRE_MEMORY_HOST); hypre_TFree(tmp_data, HYPRE_MEMORY_HOST); } else /* insert immediately into data into ParCSRMatrix structure */ { offd_indx = hypre_AuxParCSRMatrixIndxOffd(aux_matrix)[row_local]; diag_indx = hypre_AuxParCSRMatrixIndxDiag(aux_matrix)[row_local]; diag = hypre_ParCSRMatrixDiag(par_matrix); diag_i = hypre_CSRMatrixI(diag); diag_j = hypre_CSRMatrixJ(diag); diag_data = hypre_CSRMatrixData(diag); offd = hypre_ParCSRMatrixOffd(par_matrix); offd_i = hypre_CSRMatrixI(offd); big_offd_j = hypre_CSRMatrixBigJ(offd); offd_data = hypre_CSRMatrixData(offd); indx_0 = diag_i[row_local]; diag_indx = indx_0 + 1; tmp_diag_j = hypre_CTAlloc(HYPRE_Int, n, HYPRE_MEMORY_HOST); tmp_diag_data = hypre_CTAlloc(HYPRE_Complex, n, HYPRE_MEMORY_HOST); cnt_diag = 0; tmp_offd_j = hypre_CTAlloc(HYPRE_BigInt, n, HYPRE_MEMORY_HOST); tmp_offd_data = hypre_CTAlloc(HYPRE_Complex, n, HYPRE_MEMORY_HOST); cnt_offd = 0; for (i = 0; i < n; i++) { if (indices[i] < col_0 || indices[i] > col_n)/* insert into offd */ { tmp_offd_j[cnt_offd] = indices[i]; tmp_offd_data[cnt_offd++] = coeffs[i]; } else if (indices[i] == row) /* diagonal element */ { diag_j[indx_0] = (HYPRE_Int)(indices[i] - col_0); diag_data[indx_0] += coeffs[i]; } else /* insert into diag */ { tmp_diag_j[cnt_diag] = (HYPRE_Int)(indices[i] - col_0); tmp_diag_data[cnt_diag++] = coeffs[i]; } } qsort1(tmp_diag_j, tmp_diag_data, 0, cnt_diag - 1); BigQsort1(tmp_offd_j, tmp_offd_data, 0, cnt_offd - 1); diag_indx = hypre_AuxParCSRMatrixIndxDiag(aux_matrix)[row_local]; cnt = diag_indx; indx = 0; for (i = diag_i[row_local] + 1; i < diag_indx; i++) { while (diag_j[i] > tmp_diag_j[indx]) { diag_j[cnt] = tmp_diag_j[indx]; diag_data[cnt++] = tmp_diag_data[indx++]; } if (diag_j[i] == tmp_diag_j[indx]) { diag_j[i] += tmp_diag_j[indx]; diag_data[i] += tmp_diag_data[indx++]; } } for (i = indx; i < cnt_diag; i++) { diag_j[cnt] = tmp_diag_j[i]; diag_data[cnt++] = tmp_diag_data[i]; } /* sort data according to column indices, except for first element */ qsort1(diag_j, diag_data, 1, cnt - 1); hypre_TFree(tmp_diag_j, HYPRE_MEMORY_HOST); hypre_TFree(tmp_diag_data, HYPRE_MEMORY_HOST); hypre_AuxParCSRMatrixIndxOffd(aux_matrix)[row_local] = cnt; offd_indx = hypre_AuxParCSRMatrixIndxOffd(aux_matrix)[row_local]; cnt = offd_indx; indx = 0; for (i = offd_i[row_local] + 1; i < offd_indx; i++) { while (big_offd_j[i] > tmp_offd_j[indx]) { big_offd_j[cnt] = tmp_offd_j[indx]; offd_data[cnt++] = tmp_offd_data[indx++]; } if (big_offd_j[i] == tmp_offd_j[indx]) { big_offd_j[i] += tmp_offd_j[indx]; offd_data[i] += tmp_offd_data[indx++]; } } for (i = indx; i < cnt_offd; i++) { big_offd_j[cnt] = tmp_offd_j[i]; offd_data[cnt++] = tmp_offd_data[i]; } /* sort data according to column indices, except for first element */ BigQsort1(big_offd_j, offd_data, 1, cnt - 1); hypre_TFree(tmp_offd_j, HYPRE_MEMORY_HOST); hypre_TFree(tmp_offd_data, HYPRE_MEMORY_HOST); hypre_AuxParCSRMatrixIndxOffd(aux_matrix)[row_local] = cnt; } } return ierr; } /****************************************************************************** * * hypre_IJMatrixAssemblePETSc * * assembles IJMAtrix from AuxParCSRMatrix auxiliary structure *****************************************************************************/ HYPRE_Int hypre_IJMatrixAssemblePETSc(hypre_IJMatrix *matrix) { HYPRE_Int ierr = 0; MPI_Comm comm = hypre_IJMatrixContext(matrix); hypre_ParCSRMatrix *par_matrix = hypre_IJMatrixLocalStorage(matrix); hypre_AuxParCSRMatrix *aux_matrix = hypre_IJMatrixTranslator(matrix); hypre_CSRMatrix *diag; hypre_CSRMatrix *offd; HYPRE_Int *diag_i; HYPRE_Int *offd_i; HYPRE_Int *diag_j; HYPRE_Int *offd_j; HYPRE_BigInt *big_offd_j; HYPRE_Complex *diag_data; HYPRE_Complex *offd_data; HYPRE_BigInt *row_starts = hypre_ParCSRMatrixRowStarts(par_matrix); HYPRE_BigInt *col_starts = hypre_ParCSRMatrixColStarts(par_matrix); HYPRE_Int j_indx, cnt, i, j; HYPRE_Int num_cols_offd; HYPRE_BigInt *col_map_offd; HYPRE_Int *row_length; HYPRE_Int *row_space; HYPRE_BigInt **aux_j; HYPRE_Complex **aux_data; HYPRE_Int *indx_diag; HYPRE_Int *indx_offd; HYPRE_Int need_aux = hypre_AuxParCSRMatrixNeedAux(aux_matrix); HYPRE_Int my_id, num_procs; HYPRE_Int num_rows; HYPRE_Int i_diag, i_offd; HYPRE_BigInt *local_j; HYPRE_Complex *local_data; HYPRE_BigInt col_0, col_n; HYPRE_Int nnz_offd; HYPRE_BigInt *aux_offd_j; hypre_MPI_Comm_size(comm, &num_procs); hypre_MPI_Comm_rank(comm, &my_id); num_rows = (HYPRE_Int)(row_starts[my_id + 1] - row_starts[my_id]); /* move data into ParCSRMatrix if not there already */ if (need_aux) { col_0 = col_starts[my_id]; col_n = col_starts[my_id + 1] - 1; i_diag = 0; i_offd = 0; for (i = 0; i < num_rows; i++) { local_j = aux_j[i]; local_data = aux_data[i]; for (j = 0; j < row_length[i]; j++) { if (local_j[j] < col_0 || local_j[j] > col_n) { i_offd++; } else { i_diag++; } } diag_i[i] = i_diag; offd_i[i] = i_offd; } diag_j = hypre_CTAlloc(HYPRE_Int, i_diag, HYPRE_MEMORY_HOST); diag_data = hypre_CTAlloc(HYPRE_Complex, i_diag, HYPRE_MEMORY_HOST); big_offd_j = hypre_CTAlloc(HYPRE_BigInt, i_offd, HYPRE_MEMORY_HOST); offd_j = hypre_CTAlloc(HYPRE_Int, i_offd, HYPRE_MEMORY_HOST); offd_data = hypre_CTAlloc(HYPRE_Complex, i_offd, HYPRE_MEMORY_HOST); i_diag = 0; i_offd = 0; for (i = 0; i < num_rows; i++) { local_j = aux_j[i]; local_data = aux_data[i]; for (j = 0; j < row_length[i]; j++) { if (local_j[j] < col_0 || local_j[j] > col_n) { big_offd_j[i_offd] = local_j[j]; offd_data[i_offd++] = local_data[j]; } else { diag_j[i_diag] = local_j[j]; diag_data[i_diag++] = local_data[j]; } } } hypre_CSRMatrixJ(diag) = diag_j; hypre_CSRMatrixData(diag) = diag_data; hypre_CSRMatrixNumNonzeros(diag) = diag_i[num_rows]; hypre_CSRMatrixJ(offd) = offd_j; hypre_CSRMatrixBigJ(offd) = big_offd_j; hypre_CSRMatrixData(offd) = offd_data; hypre_CSRMatrixNumNonzeros(offd) = offd_i[num_rows]; } /* generate col_map_offd */ nnz_offd = offd_i[num_rows]; aux_offd_j = hypre_CTAlloc(HYPRE_BigInt, nnz_offd, HYPRE_MEMORY_HOST); for (i = 0; i < nnz_offd; i++) { aux_offd_j[i] = big_offd_j[i]; } BigQsort0(aux_offd_j, 0, nnz_offd - 1); num_cols_offd = 1; cnt = 0; for (i = 0; i < nnz_offd - 1; i++) { if (aux_offd_j[i + 1] > aux_offd_j[i]) { cnt++; aux_offd_j[cnt] = aux_offd_j[i + 1]; num_cols_offd++; } } col_map_offd = hypre_CTAlloc(HYPRE_Int, num_cols_offd, HYPRE_MEMORY_HOST); for (i = 0; i < num_cols_offd; i++) { col_map_offd[i] = aux_offd_j[i]; } for (i = 0; i < nnz_offd; i++) { offd_j[i] = hypre_BigBinarySearch(col_map_offd, big_offd_j[i], num_cols_offd); } hypre_ParCSRMatrixColMapOffd(par_matrix) = col_map_offd; hypre_CSRMatrixNumCols(offd) = num_cols_offd; hypre_AuxParCSRMatrixDestroy(aux_matrix); hypre_TFree(aux_offd_j, HYPRE_MEMORY_HOST); hypre_TFree(big_offd_j, HYPRE_MEMORY_HOST); hypre_CSRMatrixBigJ(offd) = NULL; return ierr; } /****************************************************************************** * * hypre_IJMatrixDistributePETSc * * takes an IJMatrix generated for one processor and distributes it * across many processors according to row_starts and col_starts, * if row_starts and/or col_starts NULL, it distributes them evenly. * *****************************************************************************/ HYPRE_Int hypre_IJMatrixDistributePETSc(hypre_IJMatrix *matrix, HYPRE_BigInt *row_starts, HYPRE_BigInt *col_starts) { HYPRE_Int ierr = 0; hypre_ParCSRMatrix *old_matrix = hypre_IJMatrixLocalStorage(matrix); hypre_ParCSRMatrix *par_matrix; hypre_CSRMatrix *diag = hypre_ParCSRMatrixDiag(old_matrix); par_matrix = hypre_CSRMatrixToParCSRMatrix(hypre_ParCSRMatrixComm(old_matrix) , diag, row_starts, col_starts); ierr = hypre_ParCSRMatrixDestroy(old_matrix); hypre_IJMatrixLocalStorage(matrix) = par_matrix; return ierr; } /****************************************************************************** * * hypre_IJMatrixApplyPETSc * * NOT IMPLEMENTED YET * *****************************************************************************/ HYPRE_Int hypre_IJMatrixApplyPETSc(hypre_IJMatrix *matrix, hypre_ParVector *x, hypre_ParVector *b) { HYPRE_Int ierr = 0; return ierr; } /****************************************************************************** * * hypre_IJMatrixDestroyPETSc * * frees an IJMatrix * *****************************************************************************/ HYPRE_Int hypre_IJMatrixDestroyPETSc(hypre_IJMatrix *matrix) { return hypre_ParCSRMatrixDestroy(hypre_IJMatrixLocalStorage(matrix)); } /****************************************************************************** * * hypre_IJMatrixSetTotalSizePETSc * * sets the total number of nonzeros of matrix, can be somewhat useful * for storage estimates * *****************************************************************************/ HYPRE_Int hypre_IJMatrixSetTotalSizePETSc(hypre_IJMatrix *matrix, HYPRE_Int size) { HYPRE_Int ierr = 0; hypre_ParCSRMatrix *par_matrix; par_matrix = hypre_IJMatrixLocalStorage(matrix); if (!par_matrix) { ierr = hypre_IJMatrixCreatePETSc(matrix); par_matrix = hypre_IJMatrixLocalStorage(matrix); } hypre_ParCSRMatrixNumNonzeros(par_matrix) = size; return ierr; } hypre-2.33.0/src/IJ_mv/IJVector.c000066400000000000000000000171741477326011500163720ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * hypre_IJVector interface * *****************************************************************************/ #include "./_hypre_IJ_mv.h" #include "../HYPRE.h" /*-------------------------------------------------------------------------- * hypre_IJVectorDistribute *--------------------------------------------------------------------------*/ HYPRE_Int hypre_IJVectorDistribute( HYPRE_IJVector vector, const HYPRE_Int *vec_starts ) { hypre_IJVector *vec = (hypre_IJVector *) vector; if (vec == NULL) { hypre_printf("Vector variable is NULL -- hypre_IJVectorDistribute\n"); exit(1); } if ( hypre_IJVectorObjectType(vec) == HYPRE_PARCSR ) { return ( hypre_IJVectorDistributePar(vec, vec_starts) ); } else { hypre_printf("Unrecognized object type -- hypre_IJVectorDistribute\n"); exit(1); } return -99; } /*-------------------------------------------------------------------------- * hypre_IJVectorZeroValues *--------------------------------------------------------------------------*/ HYPRE_Int hypre_IJVectorZeroValues( HYPRE_IJVector vector ) { hypre_IJVector *vec = (hypre_IJVector *) vector; if (vec == NULL) { hypre_printf("Vector variable is NULL -- hypre_IJVectorZeroValues\n"); exit(1); } /* if ( hypre_IJVectorObjectType(vec) == HYPRE_PETSC ) return( hypre_IJVectorZeroValuesPETSc(vec) ); else if ( hypre_IJVectorObjectType(vec) == HYPRE_ISIS ) return( hypre_IJVectorZeroValuesISIS(vec) ); else */ if ( hypre_IJVectorObjectType(vec) == HYPRE_PARCSR ) { return ( hypre_IJVectorZeroValuesPar(vec) ); } else { hypre_printf("Unrecognized object type -- hypre_IJVectorZeroValues\n"); exit(1); } return -99; } /*-------------------------------------------------------------------------- * hypre_IJVectorReadBinary * * Reads a vector from file stored in binary format. The resulting IJVector * is stored on host memory. For information about the metadata contents * contained in the file header, see hypre_ParVectorPrintBinaryIJ. *--------------------------------------------------------------------------*/ HYPRE_Int hypre_IJVectorReadBinary( MPI_Comm comm, const char *filename, HYPRE_Int type, HYPRE_IJVector *vector_ptr ) { /* Vector variables */ HYPRE_IJVector vector; HYPRE_BigInt partitioning[2]; HYPRE_BigInt global_size; HYPRE_Int size; HYPRE_Int num_components; HYPRE_Int total_size; HYPRE_Int storage_method; /* Buffers */ hypre_float *f32buffer = NULL; hypre_double *f64buffer = NULL; HYPRE_Complex *buffer; /* Local variables */ FILE *fp; char new_filename[HYPRE_MAX_FILE_NAME_LEN]; char msg[HYPRE_MAX_MSG_LEN]; hypre_uint64 header[8]; HYPRE_Int myid; size_t count; HYPRE_Int i, c; HYPRE_Int one = 1; /* Exit if trying to read from big-endian machine */ if ((*(char*)&one) == 0) { hypre_error_w_msg(HYPRE_ERROR_GENERIC, "Support to big-endian machines is incomplete!"); return hypre_error_flag; } /* Open binary file */ hypre_MPI_Comm_rank(comm, &myid); hypre_sprintf(new_filename, "%s.%05d.bin", filename, myid); if ((fp = fopen(new_filename, "r")) == NULL) { hypre_error_w_msg(HYPRE_ERROR_GENERIC, "Could not open input file!"); return hypre_error_flag; } /*--------------------------------------------- * Read header (64 bytes) *---------------------------------------------*/ count = 8; if (fread((void*) header, sizeof(hypre_uint64), count, fp) != count) { hypre_error_w_msg(HYPRE_ERROR_GENERIC, "Could not read header entries\n"); return hypre_error_flag; } /* Check for header version */ if (header[0] != 1) { hypre_sprintf(msg, "Unsupported header version: %d", header[0]); hypre_error_w_msg(HYPRE_ERROR_GENERIC, msg); return hypre_error_flag; } /* Set local variables */ partitioning[0] = (HYPRE_BigInt) header[2]; partitioning[1] = (HYPRE_BigInt) header[3]; global_size = (HYPRE_BigInt) header[4]; size = (HYPRE_Int) header[5]; num_components = (HYPRE_Int) header[6]; storage_method = (HYPRE_Int) header[7]; total_size = size * num_components; /* Sanity checks */ if (storage_method == 1) { hypre_error_w_msg(HYPRE_ERROR_GENERIC, "row-wise ordering is not supported!\n"); return hypre_error_flag; } if (size > global_size) { hypre_error_w_msg(HYPRE_ERROR_GENERIC, "Invalid vector size!\n"); return hypre_error_flag; } /*--------------------------------------------- * Read data *---------------------------------------------*/ /* Allocate memory for buffers */ count = total_size; buffer = hypre_TAlloc(HYPRE_Complex, total_size, HYPRE_MEMORY_HOST); /* Read data */ if (header[1] == sizeof(hypre_float)) { f32buffer = hypre_TAlloc(hypre_float, total_size, HYPRE_MEMORY_HOST); if (fread((void*) f32buffer, sizeof(hypre_float), count, fp) != count) { hypre_error_w_msg(HYPRE_ERROR_GENERIC, "Could not read all vector coefficients"); return hypre_error_flag; } #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i) HYPRE_SMP_SCHEDULE #endif for (i = 0; i < total_size; i++) { buffer[i] = (HYPRE_Complex) f32buffer[i]; } } else if (header[1] == sizeof(hypre_double)) { f64buffer = hypre_TAlloc(hypre_double, total_size, HYPRE_MEMORY_HOST); if (fread((void*) f64buffer, sizeof(hypre_double), count, fp) != count) { hypre_error_w_msg(HYPRE_ERROR_GENERIC, "Could not read all vector coefficients"); return hypre_error_flag; } #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i) HYPRE_SMP_SCHEDULE #endif for (i = 0; i < total_size; i++) { buffer[i] = (HYPRE_Complex) f64buffer[i]; } } else { hypre_error_w_msg(HYPRE_ERROR_GENERIC, "Unsupported data type for vector entries"); return hypre_error_flag; } /* Close file */ fclose(fp); /*--------------------------------------------- * Create vector *---------------------------------------------*/ HYPRE_IJVectorCreate(comm, partitioning[0], partitioning[1] - 1, &vector); HYPRE_IJVectorSetObjectType(vector, type); HYPRE_IJVectorSetNumComponents(vector, num_components); HYPRE_IJVectorInitialize_v2(vector, HYPRE_MEMORY_HOST); for (c = 0; c < num_components; c++) { HYPRE_IJVectorSetComponent(vector, c); HYPRE_IJVectorSetValues(vector, size, NULL, buffer + c * size); } HYPRE_IJVectorAssemble(vector); *vector_ptr = vector; /*--------------------------------------------- * Finalize *---------------------------------------------*/ hypre_TFree(f32buffer, HYPRE_MEMORY_HOST); hypre_TFree(f64buffer, HYPRE_MEMORY_HOST); hypre_TFree(buffer, HYPRE_MEMORY_HOST); return hypre_error_flag; } hypre-2.33.0/src/IJ_mv/IJVector_parcsr.c000066400000000000000000001240341477326011500177360ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * IJVector_Par interface * *****************************************************************************/ #include "_hypre_IJ_mv.h" #include "../HYPRE.h" /****************************************************************************** * * hypre_IJVectorCreatePar * * creates ParVector if necessary, and leaves a pointer to it as the * hypre_IJVector object * *****************************************************************************/ HYPRE_Int hypre_IJVectorCreatePar(hypre_IJVector *vector, HYPRE_BigInt *IJpartitioning) { MPI_Comm comm = hypre_IJVectorComm(vector); HYPRE_BigInt global_n, partitioning[2], jmin; HYPRE_Int j; jmin = hypre_IJVectorGlobalFirstRow(vector); global_n = hypre_IJVectorGlobalNumRows(vector); /* Shift to zero-based partitioning for ParVector object */ for (j = 0; j < 2; j++) { partitioning[j] = IJpartitioning[j] - jmin; } hypre_IJVectorObject(vector) = (void*) hypre_ParVectorCreate(comm, global_n, partitioning); return hypre_error_flag; } /****************************************************************************** * * hypre_IJVectorDestroyPar * * frees ParVector local storage of an IJVectorPar * *****************************************************************************/ HYPRE_Int hypre_IJVectorDestroyPar(hypre_IJVector *vector) { return hypre_ParVectorDestroy((hypre_ParVector*)hypre_IJVectorObject(vector)); } /****************************************************************************** * * hypre_IJVectorInitializePar * * initializes ParVector of IJVectorPar * *****************************************************************************/ /*-------------------------------------------------------------------------- * hypre_IJVectorInitializeParShell *--------------------------------------------------------------------------*/ HYPRE_Int hypre_IJVectorInitializeParShell(hypre_IJVector *vector) { MPI_Comm comm = hypre_IJVectorComm(vector); hypre_ParVector *par_vector = (hypre_ParVector*) hypre_IJVectorObject(vector); HYPRE_Int print_level = hypre_IJVectorPrintLevel(vector); HYPRE_Int num_vectors = hypre_IJVectorNumComponents(vector); HYPRE_BigInt *partitioning = hypre_ParVectorPartitioning(par_vector); hypre_Vector *local_vector = hypre_ParVectorLocalVector(par_vector); HYPRE_Int my_id; hypre_MPI_Comm_rank(comm, &my_id); if (!partitioning) { if (print_level) { hypre_printf("No ParVector partitioning for initialization -- "); hypre_printf("hypre_IJVectorInitializePar\n"); } hypre_error_in_arg(1); return hypre_error_flag; } hypre_VectorNumVectors(local_vector) = num_vectors; hypre_VectorSize(local_vector) = (HYPRE_Int)(partitioning[1] - partitioning[0]); return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_IJVectorSetParData *--------------------------------------------------------------------------*/ HYPRE_Int hypre_IJVectorSetParData(hypre_IJVector *vector, HYPRE_Complex *data) { hypre_ParVector *par_vector = (hypre_ParVector*) hypre_IJVectorObject(vector); hypre_ParVectorSetData(par_vector, data); return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_IJVectorInitializePar *--------------------------------------------------------------------------*/ HYPRE_Int hypre_IJVectorInitializePar(hypre_IJVector *vector) { return hypre_IJVectorInitializePar_v2(vector, hypre_IJVectorMemoryLocation(vector)); } /*-------------------------------------------------------------------------- * hypre_IJVectorInitializePar_v2 *--------------------------------------------------------------------------*/ HYPRE_Int hypre_IJVectorInitializePar_v2(hypre_IJVector *vector, HYPRE_MemoryLocation memory_location) { hypre_ParVector *par_vector; hypre_AuxParVector *aux_vector; /* Set up the basic structure and metadata for the vector */ hypre_IJVectorInitializeParShell(vector); par_vector = (hypre_ParVector*) hypre_IJVectorObject(vector); aux_vector = (hypre_AuxParVector*) hypre_IJVectorTranslator(vector); /* Check if auxiliary vectors needs to be created */ if (!aux_vector) { hypre_AuxParVectorCreate(&aux_vector); hypre_IJVectorTranslator(vector) = aux_vector; } /* Memory allocations */ hypre_ParVectorInitialize_v2(par_vector, memory_location); hypre_AuxParVectorInitialize_v2(aux_vector, memory_location); return hypre_error_flag; } /****************************************************************************** * * hypre_IJVectorSetMaxOffProcElmtsPar * *****************************************************************************/ HYPRE_Int hypre_IJVectorSetMaxOffProcElmtsPar(hypre_IJVector *vector, HYPRE_Int max_off_proc_elmts) { hypre_AuxParVector *aux_vector; aux_vector = (hypre_AuxParVector*) hypre_IJVectorTranslator(vector); if (!aux_vector) { hypre_AuxParVectorCreate(&aux_vector); hypre_IJVectorTranslator(vector) = aux_vector; } hypre_AuxParVectorMaxOffProcElmts(aux_vector) = max_off_proc_elmts; #if defined(HYPRE_USING_GPU) hypre_AuxParVectorUsrOffProcElmts(aux_vector) = max_off_proc_elmts; #endif return hypre_error_flag; } /****************************************************************************** * * hypre_IJVectorDistributePar * * takes an IJVector generated for one processor and distributes it * across many processors according to vec_starts, * if vec_starts is NULL, it distributes them evenly? * *****************************************************************************/ HYPRE_Int hypre_IJVectorDistributePar(hypre_IJVector *vector, const HYPRE_Int *vec_starts) { hypre_ParVector *old_vector = (hypre_ParVector*) hypre_IJVectorObject(vector); hypre_ParVector *par_vector; HYPRE_Int print_level = hypre_IJVectorPrintLevel(vector); if (!old_vector) { if (print_level) { hypre_printf("old_vector == NULL -- "); hypre_printf("hypre_IJVectorDistributePar\n"); hypre_printf("**** Vector storage is either unallocated or orphaned ****\n"); } hypre_error_in_arg(1); return hypre_error_flag; } par_vector = hypre_VectorToParVector(hypre_ParVectorComm(old_vector), hypre_ParVectorLocalVector(old_vector), (HYPRE_BigInt *)vec_starts); if (!par_vector) { if (print_level) { hypre_printf("par_vector == NULL -- "); hypre_printf("hypre_IJVectorDistributePar\n"); hypre_printf("**** Vector storage is unallocated ****\n"); } hypre_error_in_arg(1); } hypre_ParVectorDestroy(old_vector); hypre_IJVectorObject(vector) = par_vector; return hypre_error_flag; } /****************************************************************************** * * hypre_IJVectorZeroValuesPar * * zeroes all local components of an IJVectorPar * *****************************************************************************/ HYPRE_Int hypre_IJVectorZeroValuesPar(hypre_IJVector *vector) { hypre_IJVectorSetConstantValuesPar(vector, 0.0); return hypre_error_flag; } /****************************************************************************** * * hypre_IJVectorSetComponentPar * * Set the component identifier of a vector with multiple components * (multivector) * *****************************************************************************/ HYPRE_Int hypre_IJVectorSetComponentPar(hypre_IJVector *vector, HYPRE_Int component) { HYPRE_Int print_level = hypre_IJVectorPrintLevel(vector); hypre_ParVector *par_vector = (hypre_ParVector*) hypre_IJVectorObject(vector); HYPRE_Int num_vectors = hypre_ParVectorNumVectors(par_vector); if (component < 0 || component > num_vectors) { if (print_level) { hypre_printf("component < 0 || component > num_vectors -- "); hypre_printf("hypre_IJVectorSetComponentPar\n"); } hypre_error_in_arg(2); return hypre_error_flag; } else { hypre_ParVectorSetComponent(par_vector, component); } return hypre_error_flag; } /****************************************************************************** * * hypre_IJVectorSetValuesPar * * sets a potentially noncontiguous set of components of an IJVectorPar * *****************************************************************************/ HYPRE_Int hypre_IJVectorSetValuesPar(hypre_IJVector *vector, HYPRE_Int num_values, const HYPRE_BigInt *indices, const HYPRE_Complex *values) { HYPRE_Int my_id; HYPRE_Int j, k; HYPRE_BigInt i, vec_start, vec_stop; HYPRE_Complex *data; HYPRE_Int print_level = hypre_IJVectorPrintLevel(vector); HYPRE_BigInt *IJpartitioning = hypre_IJVectorPartitioning(vector); hypre_ParVector *par_vector = (hypre_ParVector*) hypre_IJVectorObject(vector); MPI_Comm comm = hypre_IJVectorComm(vector); HYPRE_Int component; hypre_Vector *local_vector; HYPRE_Int vecoffset; HYPRE_Int vecstride; HYPRE_Int idxstride; /* If no components are to be set, perform no checking and return */ if (num_values < 1) { return 0; } hypre_MPI_Comm_rank(comm, &my_id); /* If par_vector == NULL or partitioning == NULL or local_vector == NULL let user know of catastrophe and exit */ if (!par_vector) { if (print_level) { hypre_printf("par_vector == NULL -- "); hypre_printf("hypre_IJVectorSetValuesPar\n"); hypre_printf("**** Vector storage is either unallocated or orphaned ****\n"); } hypre_error_in_arg(1); return hypre_error_flag; } local_vector = hypre_ParVectorLocalVector(par_vector); if (!local_vector) { if (print_level) { hypre_printf("local_vector == NULL -- "); hypre_printf("hypre_IJVectorSetValuesPar\n"); hypre_printf("**** Vector local data is either unallocated or orphaned ****\n"); } hypre_error_in_arg(1); return hypre_error_flag; } vec_start = IJpartitioning[0]; vec_stop = IJpartitioning[1] - 1; if (vec_start > vec_stop) { if (print_level) { hypre_printf("vec_start > vec_stop -- "); hypre_printf("hypre_IJVectorSetValuesPar\n"); hypre_printf("**** This vector partitioning should not occur ****\n"); } hypre_error_in_arg(1); return hypre_error_flag; } /* Determine whether indices points to local indices only, and if not, store indices and values in auxiliary vector structure. If indices == NULL, assume that num_values components are to be set in a block starting at vec_start. NOTE: If indices == NULL off proc values are ignored!!! */ data = hypre_VectorData(local_vector); component = hypre_VectorComponent(local_vector); vecstride = hypre_VectorVectorStride(local_vector); idxstride = hypre_VectorIndexStride(local_vector); vecoffset = component * vecstride; if (indices) { for (j = 0; j < num_values; j++) { i = indices[j]; if (vec_start <= i && i <= vec_stop) { k = (HYPRE_Int)(i - vec_start); data[vecoffset + k * idxstride] = values[j]; } } } else { if (num_values > (HYPRE_Int)(vec_stop - vec_start) + 1) { if (print_level) { hypre_printf("Warning! Indices beyond local range not identified!\n "); hypre_printf("Off processor values have been ignored!\n"); } num_values = (HYPRE_Int)(vec_stop - vec_start) + 1; } #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(j) HYPRE_SMP_SCHEDULE #endif for (j = 0; j < num_values; j++) { data[vecoffset + j * idxstride] = values[j]; } } return hypre_error_flag; } /****************************************************************************** * * hypre_IJVectorSetConstantValuesPar * * sets all vector coefficients to a given value * *****************************************************************************/ HYPRE_Int hypre_IJVectorSetConstantValuesPar(hypre_IJVector *vector, HYPRE_Complex value) { HYPRE_Int print_level = hypre_IJVectorPrintLevel(vector); hypre_ParVector *par_vector = (hypre_ParVector*) hypre_IJVectorObject(vector); /* Sanity check for par_vector */ if (!par_vector) { if (print_level) { hypre_printf("par_vector == NULL -- "); hypre_printf("hypre_IJVectorSetValuesPar\n"); hypre_printf("**** Vector storage is either unallocated or orphaned ****\n"); } hypre_error_in_arg(1); return hypre_error_flag; } /* Set vector coefficients to "value" */ hypre_ParVectorSetConstantValues(par_vector, value); return hypre_error_flag; } /****************************************************************************** * * hypre_IJVectorAddToValuesPar * * adds to a potentially noncontiguous set of IJVectorPar components * *****************************************************************************/ HYPRE_Int hypre_IJVectorAddToValuesPar(hypre_IJVector *vector, HYPRE_Int num_values, const HYPRE_BigInt *indices, const HYPRE_Complex *values) { MPI_Comm comm = hypre_IJVectorComm(vector); hypre_ParVector *par_vector = (hypre_ParVector*) hypre_IJVectorObject(vector); hypre_AuxParVector *aux_vector = (hypre_AuxParVector*) hypre_IJVectorTranslator(vector); HYPRE_BigInt *IJpartitioning = hypre_IJVectorPartitioning(vector); HYPRE_Int print_level = hypre_IJVectorPrintLevel(vector); hypre_Vector *local_vector; HYPRE_Int idxstride, vecstride; HYPRE_Int component, vecoffset; HYPRE_Int num_vectors; HYPRE_Int my_id; HYPRE_Int j; HYPRE_BigInt big_i, vec_start, vec_stop; HYPRE_Complex *data; /* If no components are to be retrieved, perform no checking and return */ if (num_values < 1) { return hypre_error_flag; } hypre_MPI_Comm_rank(comm, &my_id); /* If par_vector == NULL or partitioning == NULL or local_vector == NULL let user know of catastrophe and exit */ if (!par_vector) { if (print_level) { hypre_printf("par_vector == NULL -- "); hypre_printf("hypre_IJVectorAddToValuesPar\n"); hypre_printf("**** Vector storage is either unallocated or orphaned ****\n"); } hypre_error_in_arg(1); return hypre_error_flag; } local_vector = hypre_ParVectorLocalVector(par_vector); if (!local_vector) { if (print_level) { hypre_printf("local_vector == NULL -- "); hypre_printf("hypre_IJVectorAddToValuesPar\n"); hypre_printf("**** Vector local data is either unallocated or orphaned ****\n"); } hypre_error_in_arg(1); return hypre_error_flag; } vec_start = IJpartitioning[0]; vec_stop = IJpartitioning[1] - 1; if (vec_start > vec_stop) { if (print_level) { hypre_printf("vec_start > vec_stop -- "); hypre_printf("hypre_IJVectorAddToValuesPar\n"); hypre_printf("**** This vector partitioning should not occur ****\n"); } hypre_error_in_arg(1); return hypre_error_flag; } data = hypre_VectorData(local_vector); num_vectors = hypre_VectorNumVectors(local_vector); component = hypre_VectorComponent(local_vector); vecstride = hypre_VectorVectorStride(local_vector); idxstride = hypre_VectorIndexStride(local_vector); vecoffset = component * vecstride; if (indices) { HYPRE_Int current_num_elmts = hypre_AuxParVectorCurrentOffProcElmts(aux_vector); HYPRE_Int max_off_proc_elmts = hypre_AuxParVectorMaxOffProcElmts(aux_vector); HYPRE_BigInt *off_proc_i = hypre_AuxParVectorOffProcI(aux_vector); HYPRE_Complex *off_proc_data = hypre_AuxParVectorOffProcData(aux_vector); HYPRE_Int k; for (j = 0; j < num_values; j++) { big_i = indices[j]; if (big_i < vec_start || big_i > vec_stop) { /* if elements outside processor boundaries, store in off processor stash */ if (!max_off_proc_elmts) { max_off_proc_elmts = 100; hypre_AuxParVectorMaxOffProcElmts(aux_vector) = max_off_proc_elmts; hypre_AuxParVectorOffProcI(aux_vector) = hypre_CTAlloc(HYPRE_BigInt, max_off_proc_elmts, HYPRE_MEMORY_HOST); hypre_AuxParVectorOffProcData(aux_vector) = hypre_CTAlloc(HYPRE_Complex, max_off_proc_elmts, HYPRE_MEMORY_HOST); off_proc_i = hypre_AuxParVectorOffProcI(aux_vector); off_proc_data = hypre_AuxParVectorOffProcData(aux_vector); } else if (current_num_elmts + 1 > max_off_proc_elmts) { max_off_proc_elmts += 10; off_proc_i = hypre_TReAlloc(off_proc_i, HYPRE_BigInt, max_off_proc_elmts, HYPRE_MEMORY_HOST); off_proc_data = hypre_TReAlloc(off_proc_data, HYPRE_Complex, max_off_proc_elmts, HYPRE_MEMORY_HOST); hypre_AuxParVectorMaxOffProcElmts(aux_vector) = max_off_proc_elmts; hypre_AuxParVectorOffProcI(aux_vector) = off_proc_i; hypre_AuxParVectorOffProcData(aux_vector) = off_proc_data; } off_proc_i[current_num_elmts] = big_i; off_proc_data[current_num_elmts++] = values[j]; hypre_AuxParVectorCurrentOffProcElmts(aux_vector) = current_num_elmts; } else /* local values are added to the vector */ { k = (HYPRE_Int)(big_i - vec_start); data[vecoffset + k * idxstride] += values[j]; } } if (current_num_elmts > 0 && num_vectors > 1) { hypre_error_w_msg(HYPRE_ERROR_GENERIC, "Off processor AddToValues not implemented for multivectors!\n"); return hypre_error_flag; } } else { if (num_values > (HYPRE_Int)(vec_stop - vec_start) + 1) { if (print_level) { hypre_printf("Warning! Indices beyond local range not identified!\n "); hypre_printf("Off processor values have been ignored!\n"); } num_values = (HYPRE_Int)(vec_stop - vec_start) + 1; } #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(j) HYPRE_SMP_SCHEDULE #endif for (j = 0; j < num_values; j++) { data[vecoffset + j * idxstride] += values[j]; } } return hypre_error_flag; } /****************************************************************************** * * hypre_IJVectorAssemblePar * * currently tests existence of of ParVector object and its partitioning * *****************************************************************************/ HYPRE_Int hypre_IJVectorAssemblePar(hypre_IJVector *vector) { hypre_ParVector *par_vector = (hypre_ParVector*) hypre_IJVectorObject(vector); hypre_AuxParVector *aux_vector = (hypre_AuxParVector*) hypre_IJVectorTranslator(vector); MPI_Comm comm = hypre_IJVectorComm(vector); HYPRE_Int print_level = hypre_IJVectorPrintLevel(vector); if (!par_vector) { if (print_level) { hypre_printf("par_vector == NULL -- "); hypre_printf("hypre_IJVectorAssemblePar\n"); hypre_printf("**** Vector storage is either unallocated or orphaned ****\n"); } hypre_error_in_arg(1); } if (aux_vector) { HYPRE_Int off_proc_elmts, current_num_elmts; HYPRE_Int max_off_proc_elmts; HYPRE_BigInt *off_proc_i; HYPRE_Complex *off_proc_data; current_num_elmts = hypre_AuxParVectorCurrentOffProcElmts(aux_vector); hypre_MPI_Allreduce(¤t_num_elmts, &off_proc_elmts, 1, HYPRE_MPI_INT, hypre_MPI_SUM, comm); if (off_proc_elmts) { max_off_proc_elmts = hypre_AuxParVectorMaxOffProcElmts(aux_vector); off_proc_i = hypre_AuxParVectorOffProcI(aux_vector); off_proc_data = hypre_AuxParVectorOffProcData(aux_vector); hypre_IJVectorAssembleOffProcValsPar(vector, max_off_proc_elmts, current_num_elmts, HYPRE_MEMORY_HOST, off_proc_i, off_proc_data); hypre_TFree(hypre_AuxParVectorOffProcI(aux_vector), HYPRE_MEMORY_HOST); hypre_TFree(hypre_AuxParVectorOffProcData(aux_vector), HYPRE_MEMORY_HOST); hypre_AuxParVectorMaxOffProcElmts(aux_vector) = 0; hypre_AuxParVectorCurrentOffProcElmts(aux_vector) = 0; } } return hypre_error_flag; } /****************************************************************************** * * hypre_IJVectorGetValuesPar * * get a potentially noncontiguous set of IJVectorPar components * *****************************************************************************/ HYPRE_Int hypre_IJVectorGetValuesPar(hypre_IJVector *vector, HYPRE_Int num_values, const HYPRE_BigInt *indices, HYPRE_Complex *values) { HYPRE_Int my_id; MPI_Comm comm = hypre_IJVectorComm(vector); HYPRE_BigInt *IJpartitioning = hypre_IJVectorPartitioning(vector); HYPRE_BigInt vec_start; HYPRE_BigInt vec_stop; HYPRE_BigInt jmin = hypre_IJVectorGlobalFirstRow(vector); hypre_ParVector *par_vector = (hypre_ParVector*) hypre_IJVectorObject(vector); HYPRE_Int print_level = hypre_IJVectorPrintLevel(vector); /* If no components are to be retrieved, perform no checking and return */ if (num_values < 1) { return 0; } hypre_MPI_Comm_rank(comm, &my_id); /* If par_vector == NULL or partitioning == NULL or local_vector == NULL let user know of catastrophe and exit */ if (!par_vector) { if (print_level) { hypre_printf("par_vector == NULL -- "); hypre_printf("hypre_IJVectorGetValuesPar\n"); hypre_printf("**** Vector storage is either unallocated or orphaned ****\n"); } hypre_error_in_arg(1); return hypre_error_flag; } hypre_Vector *local_vector = hypre_ParVectorLocalVector(par_vector); if (!local_vector) { if (print_level) { hypre_printf("local_vector == NULL -- "); hypre_printf("hypre_IJVectorGetValuesPar\n"); hypre_printf("**** Vector local data is either unallocated or orphaned ****\n"); } hypre_error_in_arg(1); return hypre_error_flag; } vec_start = IJpartitioning[0]; vec_stop = IJpartitioning[1]; if (vec_start > vec_stop) { if (print_level) { hypre_printf("vec_start > vec_stop -- "); hypre_printf("hypre_IJVectorGetValuesPar\n"); hypre_printf("**** This vector partitioning should not occur ****\n"); } hypre_error_in_arg(1); return hypre_error_flag; } hypre_ParVectorGetValues2(par_vector, num_values, (HYPRE_BigInt *) indices, jmin, values); return hypre_error_flag; } /****************************************************************************** * hypre_IJVectorAssembleOffProcValsPar * * This is for handling set and get values calls to off-proc. entries - it is * called from assemble. There is an alternate version for when the assumed * partition is being used. *****************************************************************************/ HYPRE_Int hypre_IJVectorAssembleOffProcValsPar( hypre_IJVector *vector, HYPRE_Int max_off_proc_elmts, HYPRE_Int current_num_elmts, HYPRE_MemoryLocation memory_location, HYPRE_BigInt *off_proc_i, HYPRE_Complex *off_proc_data) { HYPRE_UNUSED_VAR(max_off_proc_elmts); HYPRE_Int myid; HYPRE_BigInt global_first_row, global_num_rows; HYPRE_Int i, j, in, k; HYPRE_Int proc_id, last_proc, prev_id, tmp_id; HYPRE_Int max_response_size; HYPRE_Int ex_num_contacts = 0; HYPRE_BigInt range_start, range_end; HYPRE_Int storage; HYPRE_Int indx; HYPRE_BigInt row; HYPRE_Int num_ranges, row_count; HYPRE_Int num_recvs; HYPRE_Int counter; HYPRE_BigInt upper_bound; HYPRE_Int num_real_procs; HYPRE_BigInt *row_list = NULL; HYPRE_Int *a_proc_id = NULL, *orig_order = NULL; HYPRE_Int *real_proc_id = NULL, *us_real_proc_id = NULL; HYPRE_Int *ex_contact_procs = NULL, *ex_contact_vec_starts = NULL; HYPRE_Int *recv_starts = NULL; HYPRE_BigInt *response_buf = NULL; HYPRE_Int *response_buf_starts = NULL; HYPRE_Int *num_rows_per_proc = NULL; HYPRE_Int tmp_int; HYPRE_Int obj_size_bytes, big_int_size, complex_size; HYPRE_Int first_index; void *void_contact_buf = NULL; void *index_ptr; void *recv_data_ptr; HYPRE_Complex tmp_complex; HYPRE_BigInt *ex_contact_buf = NULL; HYPRE_Complex *vector_data; HYPRE_Complex value; hypre_DataExchangeResponse response_obj1, response_obj2; hypre_ProcListElements send_proc_obj; MPI_Comm comm = hypre_IJVectorComm(vector); hypre_ParVector *par_vector = (hypre_ParVector*) hypre_IJVectorObject(vector); hypre_IJAssumedPart *apart; hypre_MPI_Comm_rank(comm, &myid); global_num_rows = hypre_IJVectorGlobalNumRows(vector); global_first_row = hypre_IJVectorGlobalFirstRow(vector); if (memory_location == HYPRE_MEMORY_DEVICE) { HYPRE_BigInt *off_proc_i_h = hypre_TAlloc(HYPRE_BigInt, current_num_elmts, HYPRE_MEMORY_HOST); HYPRE_Complex *off_proc_data_h = hypre_TAlloc(HYPRE_Complex, current_num_elmts, HYPRE_MEMORY_HOST); hypre_TMemcpy(off_proc_i_h, off_proc_i, HYPRE_BigInt, current_num_elmts, HYPRE_MEMORY_HOST, HYPRE_MEMORY_DEVICE); hypre_TMemcpy(off_proc_data_h, off_proc_data, HYPRE_Complex, current_num_elmts, HYPRE_MEMORY_HOST, HYPRE_MEMORY_DEVICE); off_proc_i = off_proc_i_h; off_proc_data = off_proc_data_h; } /* call hypre_IJVectorAddToValuesParCSR directly inside this function * with one chunk of data */ HYPRE_Int off_proc_nelm_recv_cur = 0; HYPRE_Int off_proc_nelm_recv_max = 0; HYPRE_BigInt *off_proc_i_recv = NULL; HYPRE_Complex *off_proc_data_recv = NULL; HYPRE_BigInt *off_proc_i_recv_d = NULL; HYPRE_Complex *off_proc_data_recv_d = NULL; /* verify that we have created the assumed partition */ if (hypre_IJVectorAssumedPart(vector) == NULL) { hypre_IJVectorCreateAssumedPartition(vector); } apart = (hypre_IJAssumedPart*) hypre_IJVectorAssumedPart(vector); /* get the assumed processor id for each row */ a_proc_id = hypre_CTAlloc(HYPRE_Int, current_num_elmts, HYPRE_MEMORY_HOST); orig_order = hypre_CTAlloc(HYPRE_Int, current_num_elmts, HYPRE_MEMORY_HOST); real_proc_id = hypre_CTAlloc(HYPRE_Int, current_num_elmts, HYPRE_MEMORY_HOST); row_list = hypre_CTAlloc(HYPRE_BigInt, current_num_elmts, HYPRE_MEMORY_HOST); if (current_num_elmts > 0) { for (i = 0; i < current_num_elmts; i++) { row = off_proc_i[i]; row_list[i] = row; hypre_GetAssumedPartitionProcFromRow(comm, row, global_first_row, global_num_rows, &proc_id); a_proc_id[i] = proc_id; orig_order[i] = i; } /* now we need to find the actual order of each row - sort on row - this will result in proc ids sorted also...*/ hypre_BigQsortb2i(row_list, a_proc_id, orig_order, 0, current_num_elmts - 1); /* calculate the number of contacts */ ex_num_contacts = 1; last_proc = a_proc_id[0]; for (i = 1; i < current_num_elmts; i++) { if (a_proc_id[i] > last_proc) { ex_num_contacts++; last_proc = a_proc_id[i]; } } } /* now we will go through a create a contact list - need to contact assumed processors and find out who the actual row owner is - we will contact with a range (2 numbers) */ ex_contact_procs = hypre_CTAlloc(HYPRE_Int, ex_num_contacts, HYPRE_MEMORY_HOST); ex_contact_vec_starts = hypre_CTAlloc(HYPRE_Int, ex_num_contacts + 1, HYPRE_MEMORY_HOST); ex_contact_buf = hypre_CTAlloc(HYPRE_BigInt, ex_num_contacts * 2, HYPRE_MEMORY_HOST); counter = 0; range_end = -1; for (i = 0; i < current_num_elmts; i++) { if (row_list[i] > range_end) { /* assumed proc */ proc_id = a_proc_id[i]; /* end of prev. range */ if (counter > 0) { ex_contact_buf[counter * 2 - 1] = row_list[i - 1]; } /*start new range*/ ex_contact_procs[counter] = proc_id; ex_contact_vec_starts[counter] = counter * 2; ex_contact_buf[counter * 2] = row_list[i]; counter++; hypre_GetAssumedPartitionRowRange(comm, proc_id, global_first_row, global_num_rows, &range_start, &range_end); } } /*finish the starts*/ ex_contact_vec_starts[counter] = counter * 2; /*finish the last range*/ if (counter > 0) { ex_contact_buf[counter * 2 - 1] = row_list[current_num_elmts - 1]; } /* create response object - can use same fill response as used in the commpkg routine */ response_obj1.fill_response = hypre_RangeFillResponseIJDetermineRecvProcs; response_obj1.data1 = apart; /* this is necessary so we can fill responses*/ response_obj1.data2 = NULL; max_response_size = 6; /* 6 means we can fit 3 ranges*/ hypre_DataExchangeList(ex_num_contacts, ex_contact_procs, ex_contact_buf, ex_contact_vec_starts, sizeof(HYPRE_BigInt), sizeof(HYPRE_BigInt), &response_obj1, max_response_size, 4, comm, (void**) &response_buf, &response_buf_starts); /* now response_buf contains a proc_id followed by an upper bound for the range. */ hypre_TFree(ex_contact_procs, HYPRE_MEMORY_HOST); hypre_TFree(ex_contact_buf, HYPRE_MEMORY_HOST); hypre_TFree(ex_contact_vec_starts, HYPRE_MEMORY_HOST); hypre_TFree(a_proc_id, HYPRE_MEMORY_HOST); a_proc_id = NULL; /*how many ranges were returned?*/ num_ranges = response_buf_starts[ex_num_contacts]; num_ranges = num_ranges / 2; prev_id = -1; j = 0; counter = 0; num_real_procs = 0; /* loop through ranges - create a list of actual processor ids*/ for (i = 0; i < num_ranges; i++) { upper_bound = response_buf[i * 2 + 1]; counter = 0; tmp_id = (HYPRE_Int)response_buf[i * 2]; /* loop through row_list entries - counting how many are in the range */ while (j < current_num_elmts && row_list[j] <= upper_bound) { real_proc_id[j] = tmp_id; j++; counter++; } if (counter > 0 && tmp_id != prev_id) { num_real_procs++; } prev_id = tmp_id; } /* now we have the list of real procesors ids (real_proc_id) - and the number of distinct ones - so now we can set up data to be sent - we have HYPRE_Int and HYPRE_Complex data. (row number and value) - we will send everything as a void since we may not know the rel sizes of ints and doubles */ /* first find out how many elements to send per proc - so we can do storage */ complex_size = sizeof(HYPRE_Complex); big_int_size = sizeof(HYPRE_BigInt); obj_size_bytes = hypre_max(big_int_size, complex_size); ex_contact_procs = hypre_CTAlloc(HYPRE_Int, num_real_procs, HYPRE_MEMORY_HOST); num_rows_per_proc = hypre_CTAlloc(HYPRE_Int, num_real_procs, HYPRE_MEMORY_HOST); counter = 0; if (num_real_procs > 0 ) { ex_contact_procs[0] = real_proc_id[0]; num_rows_per_proc[0] = 1; /* loop through real procs - these are sorted (row_list is sorted also)*/ for (i = 1; i < current_num_elmts; i++) { if (real_proc_id[i] == ex_contact_procs[counter]) /* same processor */ { num_rows_per_proc[counter] += 1; /*another row */ } else /* new processor */ { counter++; ex_contact_procs[counter] = real_proc_id[i]; num_rows_per_proc[counter] = 1; } } } /* calculate total storage and make vec_starts arrays */ storage = 0; ex_contact_vec_starts = hypre_CTAlloc(HYPRE_Int, num_real_procs + 1, HYPRE_MEMORY_HOST); ex_contact_vec_starts[0] = -1; for (i = 0; i < num_real_procs; i++) { storage += 1 + 2 * num_rows_per_proc[i]; ex_contact_vec_starts[i + 1] = -storage - 1; /* need negative for next loop */ } /*void_contact_buf = hypre_TAlloc(char, storage*obj_size_bytes);*/ void_contact_buf = hypre_CTAlloc(char, storage * obj_size_bytes, HYPRE_MEMORY_HOST); index_ptr = void_contact_buf; /* step through with this index */ /* set up data to be sent to send procs */ /* for each proc, ex_contact_buf_d contains #rows, row #, data, etc. */ /* un-sort real_proc_id - we want to access data arrays in order */ us_real_proc_id = hypre_CTAlloc(HYPRE_Int, current_num_elmts, HYPRE_MEMORY_HOST); for (i = 0; i < current_num_elmts; i++) { us_real_proc_id[orig_order[i]] = real_proc_id[i]; } hypre_TFree(real_proc_id, HYPRE_MEMORY_HOST); prev_id = -1; for (i = 0; i < current_num_elmts; i++) { proc_id = us_real_proc_id[i]; /* can't use row list[i] - you loose the negative signs that differentiate add/set values */ row = off_proc_i[i]; /* find position of this processor */ indx = hypre_BinarySearch(ex_contact_procs, proc_id, num_real_procs); in = ex_contact_vec_starts[indx]; index_ptr = (void *) ((char *) void_contact_buf + in * obj_size_bytes); /* first time for this processor - add the number of rows to the buffer */ if (in < 0) { in = -in - 1; /* re-calc. index_ptr since in_i was negative */ index_ptr = (void *) ((char *) void_contact_buf + in * obj_size_bytes); tmp_int = num_rows_per_proc[indx]; hypre_TMemcpy(index_ptr, &tmp_int, HYPRE_Int, 1, HYPRE_MEMORY_HOST, HYPRE_MEMORY_HOST); index_ptr = (void *) ((char *) index_ptr + obj_size_bytes); in++; } /* add row # */ hypre_TMemcpy(index_ptr, &row, HYPRE_BigInt, 1, HYPRE_MEMORY_HOST, HYPRE_MEMORY_HOST); index_ptr = (void *) ((char *) index_ptr + obj_size_bytes); in++; /* add value */ tmp_complex = off_proc_data[i]; hypre_TMemcpy(index_ptr, &tmp_complex, HYPRE_Complex, 1, HYPRE_MEMORY_HOST, HYPRE_MEMORY_HOST); index_ptr = (void *) ((char *) index_ptr + obj_size_bytes); in++; /* increment the indexes to keep track of where we are - fix later */ ex_contact_vec_starts[indx] = in; } /* some clean up */ hypre_TFree(response_buf, HYPRE_MEMORY_HOST); hypre_TFree(response_buf_starts, HYPRE_MEMORY_HOST); hypre_TFree(us_real_proc_id, HYPRE_MEMORY_HOST); hypre_TFree(orig_order, HYPRE_MEMORY_HOST); hypre_TFree(row_list, HYPRE_MEMORY_HOST); hypre_TFree(num_rows_per_proc, HYPRE_MEMORY_HOST); for (i = num_real_procs; i > 0; i--) { ex_contact_vec_starts[i] = ex_contact_vec_starts[i - 1]; } ex_contact_vec_starts[0] = 0; /* now send the data */ /***********************************/ /* now get the info in send_proc_obj_d */ /* the response we expect is just a confirmation*/ response_buf = NULL; response_buf_starts = NULL; /*build the response object*/ /* use the send_proc_obj for the info kept from contacts */ /*estimate inital storage allocation */ send_proc_obj.length = 0; send_proc_obj.storage_length = num_real_procs + 5; send_proc_obj.id = NULL; /* don't care who sent it to us */ send_proc_obj.vec_starts = hypre_CTAlloc(HYPRE_Int, send_proc_obj.storage_length + 1, HYPRE_MEMORY_HOST); send_proc_obj.vec_starts[0] = 0; send_proc_obj.element_storage_length = storage + 20; send_proc_obj.v_elements = hypre_TAlloc(char, obj_size_bytes * send_proc_obj.element_storage_length, HYPRE_MEMORY_HOST); response_obj2.fill_response = hypre_FillResponseIJOffProcVals; response_obj2.data1 = NULL; response_obj2.data2 = &send_proc_obj; max_response_size = 0; hypre_DataExchangeList(num_real_procs, ex_contact_procs, void_contact_buf, ex_contact_vec_starts, obj_size_bytes, 0, &response_obj2, max_response_size, 5, comm, (void **) &response_buf, &response_buf_starts); /***********************************/ hypre_TFree(response_buf, HYPRE_MEMORY_HOST); hypre_TFree(response_buf_starts, HYPRE_MEMORY_HOST); hypre_TFree(ex_contact_procs, HYPRE_MEMORY_HOST); hypre_TFree(void_contact_buf, HYPRE_MEMORY_HOST); hypre_TFree(ex_contact_vec_starts, HYPRE_MEMORY_HOST); /* Now we can unpack the send_proc_objects and either set or add to the vector data */ num_recvs = send_proc_obj.length; /* alias */ recv_data_ptr = send_proc_obj.v_elements; recv_starts = send_proc_obj.vec_starts; vector_data = hypre_VectorData(hypre_ParVectorLocalVector(par_vector)); first_index = hypre_ParVectorFirstIndex(par_vector); for (i = 0; i < num_recvs; i++) { indx = recv_starts[i]; /* get the number of rows for this recv */ hypre_TMemcpy(&row_count, recv_data_ptr, HYPRE_Int, 1, HYPRE_MEMORY_HOST, HYPRE_MEMORY_HOST); recv_data_ptr = (void *) ((char *)recv_data_ptr + obj_size_bytes); indx++; for (j = 0; j < row_count; j++) /* for each row: unpack info */ { /* row # */ hypre_TMemcpy(&row, recv_data_ptr, HYPRE_BigInt, 1, HYPRE_MEMORY_HOST, HYPRE_MEMORY_HOST); recv_data_ptr = (void *) ((char *)recv_data_ptr + obj_size_bytes); indx++; /* value */ hypre_TMemcpy(&value, recv_data_ptr, HYPRE_Complex, 1, HYPRE_MEMORY_HOST, HYPRE_MEMORY_HOST); recv_data_ptr = (void *) ((char *)recv_data_ptr + obj_size_bytes); indx++; if (memory_location == HYPRE_MEMORY_HOST) { k = (HYPRE_Int)(row - first_index - global_first_row); vector_data[k] += value; } else { if (off_proc_nelm_recv_cur >= off_proc_nelm_recv_max) { off_proc_nelm_recv_max = 2 * (off_proc_nelm_recv_cur + 1); off_proc_i_recv = hypre_TReAlloc(off_proc_i_recv, HYPRE_BigInt, off_proc_nelm_recv_max, HYPRE_MEMORY_HOST); off_proc_data_recv = hypre_TReAlloc(off_proc_data_recv, HYPRE_Complex, off_proc_nelm_recv_max, HYPRE_MEMORY_HOST); } off_proc_i_recv[off_proc_nelm_recv_cur] = row; off_proc_data_recv[off_proc_nelm_recv_cur] = value; off_proc_nelm_recv_cur ++; } } } if (memory_location == HYPRE_MEMORY_DEVICE) { off_proc_i_recv_d = hypre_TAlloc(HYPRE_BigInt, off_proc_nelm_recv_cur, HYPRE_MEMORY_DEVICE); off_proc_data_recv_d = hypre_TAlloc(HYPRE_Complex, off_proc_nelm_recv_cur, HYPRE_MEMORY_DEVICE); hypre_TMemcpy(off_proc_i_recv_d, off_proc_i_recv, HYPRE_BigInt, off_proc_nelm_recv_cur, HYPRE_MEMORY_DEVICE, HYPRE_MEMORY_HOST); hypre_TMemcpy(off_proc_data_recv_d, off_proc_data_recv, HYPRE_Complex, off_proc_nelm_recv_cur, HYPRE_MEMORY_DEVICE, HYPRE_MEMORY_HOST); #if defined(HYPRE_USING_GPU) hypre_IJVectorSetAddValuesParDevice(vector, off_proc_nelm_recv_cur, off_proc_i_recv_d, off_proc_data_recv_d, "add"); #endif } hypre_TFree(send_proc_obj.v_elements, HYPRE_MEMORY_HOST); hypre_TFree(send_proc_obj.vec_starts, HYPRE_MEMORY_HOST); if (memory_location == HYPRE_MEMORY_DEVICE) { hypre_TFree(off_proc_i, HYPRE_MEMORY_HOST); hypre_TFree(off_proc_data, HYPRE_MEMORY_HOST); } hypre_TFree(off_proc_i_recv, HYPRE_MEMORY_HOST); hypre_TFree(off_proc_data_recv, HYPRE_MEMORY_HOST); hypre_TFree(off_proc_i_recv_d, HYPRE_MEMORY_DEVICE); hypre_TFree(off_proc_data_recv_d, HYPRE_MEMORY_DEVICE); return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_IJVectorMigrateParCSR *--------------------------------------------------------------------------*/ HYPRE_Int hypre_IJVectorMigrateParCSR(hypre_IJVector *vector, HYPRE_MemoryLocation memory_location) { hypre_ParVector *par_vector = (hypre_ParVector *) hypre_IJVectorObject(vector); /* Migrate the ParVector */ hypre_ParVectorMigrate(par_vector, memory_location); return hypre_error_flag; } hypre-2.33.0/src/IJ_mv/IJVector_parcsr_device.c000066400000000000000000000663401477326011500212620ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * IJVector_ParCSR interface * *****************************************************************************/ #include "_hypre_onedpl.hpp" #include "_hypre_IJ_mv.h" #include "_hypre_utilities.hpp" #if defined(HYPRE_USING_GPU) /*-------------------------------------------------------------------- * hypre_IJVectorAssembleFunctor *--------------------------------------------------------------------*/ #if defined(HYPRE_USING_SYCL) template struct hypre_IJVectorAssembleFunctor { typedef std::tuple Tuple; __device__ Tuple operator() (const Tuple& x, const Tuple& y ) const { return std::make_tuple( hypre_max(std::get<0>(x), std::get<0>(y)), std::get<1>(x) + std::get<1>(y) ); } }; #else template struct hypre_IJVectorAssembleFunctor : public thrust::binary_function< thrust::tuple, thrust::tuple, thrust::tuple > { typedef thrust::tuple Tuple; __device__ Tuple operator() (const Tuple& x, const Tuple& y ) { return thrust::make_tuple( hypre_max(thrust::get<0>(x), thrust::get<0>(y)), thrust::get<1>(x) + thrust::get<1>(y) ); } }; #endif /*-------------------------------------------------------------------- * hypre_IJVectorAssembleSortAndReduce1 * * helper routine used in hypre_IJVectorAssembleParCSRDevice: * 1. sort (X0, A0) with key I0 * 2. for each segment in I0, zero out in A0 all before the last `set' * 3. reduce A0 [with sum] and reduce X0 [with max] * * N0: input size; N1: size after reduction (<= N0) * Note: (I1, X1, A1) are not resized to N1 but have size N0 *--------------------------------------------------------------------*/ HYPRE_Int hypre_IJVectorAssembleSortAndReduce1( HYPRE_Int N0, HYPRE_BigInt *I0, char *X0, HYPRE_Complex *A0, HYPRE_Int *N1, HYPRE_BigInt **I1, char **X1, HYPRE_Complex **A1 ) { #if defined(HYPRE_USING_SYCL) auto zipped_begin = oneapi::dpl::make_zip_iterator(I0, X0, A0); HYPRE_ONEDPL_CALL( std::stable_sort, zipped_begin, zipped_begin + N0, [](auto lhs, auto rhs) { return std::get<0>(lhs) < std::get<0>(rhs); } ); #else HYPRE_THRUST_CALL( stable_sort_by_key, I0, I0 + N0, thrust::make_zip_iterator(thrust::make_tuple(X0, A0)) ); #endif HYPRE_BigInt *I = hypre_TAlloc(HYPRE_BigInt, N0, HYPRE_MEMORY_DEVICE); char *X = hypre_TAlloc(char, N0, HYPRE_MEMORY_DEVICE); HYPRE_Complex *A = hypre_TAlloc(HYPRE_Complex, N0, HYPRE_MEMORY_DEVICE); /* output X: 0: keep, 1: zero-out */ #if defined(HYPRE_USING_SYCL) HYPRE_ONEDPL_CALL( oneapi::dpl::exclusive_scan_by_segment, oneapi::dpl::make_reverse_iterator(I0 + N0), /* key begin */ oneapi::dpl::make_reverse_iterator(I0), /* key end */ oneapi::dpl::make_reverse_iterator(X0 + N0), /* input value begin */ oneapi::dpl::make_reverse_iterator(X + N0), /* output value begin */ char(0), /* init */ std::equal_to(), oneapi::dpl::maximum() ); hypreSycl_transform_if(A0, A0 + N0, X, A0, [] (const auto & x) {return 0.0;}, [] (const auto & x) {return x;} ); auto new_end = HYPRE_ONEDPL_CALL( oneapi::dpl::reduce_by_segment, I0, /* keys_first */ I0 + N0, /* keys_last */ oneapi::dpl::make_zip_iterator(X0, A0), /* values_first */ I, /* keys_output */ oneapi::dpl::make_zip_iterator(X, A), /* values_output */ std::equal_to(), /* binary_pred */ hypre_IJVectorAssembleFunctor() /* binary_op */); #else HYPRE_THRUST_CALL( exclusive_scan_by_key, thrust::make_reverse_iterator(thrust::device_pointer_cast(I0) + N0), /* key begin */ thrust::make_reverse_iterator(thrust::device_pointer_cast(I0)), /* key end */ thrust::make_reverse_iterator(thrust::device_pointer_cast(X0) + N0), /* input value begin */ thrust::make_reverse_iterator(thrust::device_pointer_cast(X) + N0), /* output value begin */ char(0), /* init */ thrust::equal_to(), thrust::maximum() ); HYPRE_THRUST_CALL(replace_if, A0, A0 + N0, X, thrust::identity(), 0.0); auto new_end = HYPRE_THRUST_CALL( reduce_by_key, I0, /* keys_first */ I0 + N0, /* keys_last */ thrust::make_zip_iterator(thrust::make_tuple(X0, A0 )), /* values_first */ I, /* keys_output */ thrust::make_zip_iterator(thrust::make_tuple(X, A )), /* values_output */ thrust::equal_to(), /* binary_pred */ hypre_IJVectorAssembleFunctor() /* binary_op */); #endif *N1 = new_end.first - I; *I1 = I; *X1 = X; *A1 = A; return hypre_error_flag; } /*-------------------------------------------------------------------- * hypre_IJVectorAssembleSortAndReduce3 *--------------------------------------------------------------------*/ HYPRE_Int hypre_IJVectorAssembleSortAndReduce3( HYPRE_Int N0, HYPRE_BigInt *I0, char *X0, HYPRE_Complex *A0, HYPRE_Int *N1 ) { #if defined(HYPRE_USING_SYCL) auto zipped_begin = oneapi::dpl::make_zip_iterator(I0, X0, A0); HYPRE_ONEDPL_CALL( std::stable_sort, zipped_begin, zipped_begin + N0, [](auto lhs, auto rhs) { return std::get<0>(lhs) < std::get<0>(rhs); } ); #else HYPRE_THRUST_CALL( stable_sort_by_key, I0, I0 + N0, thrust::make_zip_iterator(thrust::make_tuple(X0, A0)) ); #endif HYPRE_BigInt *I = hypre_TAlloc(HYPRE_BigInt, N0, HYPRE_MEMORY_DEVICE); HYPRE_Complex *A = hypre_TAlloc(HYPRE_Complex, N0, HYPRE_MEMORY_DEVICE); /* output in X0: 0: keep, 1: zero-out */ #if defined(HYPRE_USING_SYCL) HYPRE_ONEDPL_CALL( oneapi::dpl::inclusive_scan_by_segment, oneapi::dpl::make_reverse_iterator(I0 + N0), /* key begin */ oneapi::dpl::make_reverse_iterator(I0), /* key end */ oneapi::dpl::make_reverse_iterator(X0 + N0), /* input value begin */ oneapi::dpl::make_reverse_iterator(X0 + N0), /* output value begin */ std::equal_to(), oneapi::dpl::maximum() ); hypreSycl_transform_if(A0, A0 + N0, X0, A0, [] (const auto & x) {return 0.0;}, [] (const auto & x) {return x;} ); auto new_end = HYPRE_ONEDPL_CALL( oneapi::dpl::reduce_by_segment, I0, /* keys_first */ I0 + N0, /* keys_last */ A0, /* values_first */ I, /* keys_output */ A ); /* values_output */ #else HYPRE_THRUST_CALL( inclusive_scan_by_key, thrust::make_reverse_iterator(thrust::device_pointer_cast(I0) + N0), /* key begin */ thrust::make_reverse_iterator(thrust::device_pointer_cast(I0)), /* key end */ thrust::make_reverse_iterator(thrust::device_pointer_cast(X0) + N0), /* input value begin */ thrust::make_reverse_iterator(thrust::device_pointer_cast(X0) + N0), /* output value begin */ thrust::equal_to(), thrust::maximum() ); HYPRE_THRUST_CALL(replace_if, A0, A0 + N0, X0, thrust::identity(), 0.0); auto new_end = HYPRE_THRUST_CALL( reduce_by_key, I0, /* keys_first */ I0 + N0, /* keys_last */ A0, /* values_first */ I, /* keys_output */ A /* values_output */); #endif HYPRE_Int Nt = new_end.second - A; hypre_assert(Nt <= N0); /* remove numerical zeros */ #if defined(HYPRE_USING_SYCL) auto new_end2 = hypreSycl_copy_if( oneapi::dpl::make_zip_iterator(I, A), oneapi::dpl::make_zip_iterator(I, A) + Nt, A, oneapi::dpl::make_zip_iterator(I0, A0), [] (const auto & x) {return x;} ); *N1 = std::get<0>(new_end2.base()) - I0; #else auto new_end2 = HYPRE_THRUST_CALL( copy_if, thrust::make_zip_iterator(thrust::make_tuple(I, A)), thrust::make_zip_iterator(thrust::make_tuple(I, A)) + Nt, A, thrust::make_zip_iterator(thrust::make_tuple(I0, A0)), thrust::identity() ); *N1 = thrust::get<0>(new_end2.get_iterator_tuple()) - I0; #endif hypre_assert(*N1 <= Nt); hypre_TFree(I, HYPRE_MEMORY_DEVICE); hypre_TFree(A, HYPRE_MEMORY_DEVICE); return hypre_error_flag; } /*-------------------------------------------------------------------- * hypreGPUKernel_IJVectorAssemblePar * * y[map[i]-offset] = x[i] or y[map[i]] += x[i] depending on SorA, * same index cannot appear more than once in map *--------------------------------------------------------------------*/ __global__ void hypreGPUKernel_IJVectorAssemblePar( hypre_DeviceItem &item, HYPRE_Int n, HYPRE_Complex *x, HYPRE_BigInt *map, HYPRE_BigInt offset, char *SorA, HYPRE_Complex *y ) { HYPRE_Int i = hypre_gpu_get_grid_thread_id<1, 1>(item); if (i >= n) { return; } if (SorA[i]) { y[map[i] - offset] = x[i]; } else { y[map[i] - offset] += x[i]; } } /*-------------------------------------------------------------------- * hypre_IJVectorSetAddValuesParDevice *--------------------------------------------------------------------*/ HYPRE_Int hypre_IJVectorSetAddValuesParDevice(hypre_IJVector *vector, HYPRE_Int num_values, const HYPRE_BigInt *indices, const HYPRE_Complex *values, const char *action) { HYPRE_BigInt *IJpartitioning = hypre_IJVectorPartitioning(vector); HYPRE_BigInt vec_start = IJpartitioning[0]; hypre_ParVector *par_vector = (hypre_ParVector*) hypre_IJVectorObject(vector); hypre_Vector *local_vector = hypre_ParVectorLocalVector(par_vector); HYPRE_Int size = hypre_VectorSize(local_vector); HYPRE_Int num_vectors = hypre_VectorNumVectors(local_vector); HYPRE_Int component = hypre_VectorComponent(local_vector); HYPRE_Int vecstride = hypre_VectorVectorStride(local_vector); const char SorA = action[0] == 's' ? 1 : 0; if (num_values <= 0) { return hypre_error_flag; } /* this is a special use to set/add local values */ if (!indices) { HYPRE_Int num_values2 = hypre_min(size, num_values); HYPRE_BigInt *indices2 = hypre_TAlloc(HYPRE_BigInt, num_values2, HYPRE_MEMORY_DEVICE); #if defined(HYPRE_USING_SYCL) hypreSycl_sequence(indices2, indices2 + num_values2, vec_start); #else HYPRE_THRUST_CALL(sequence, indices2, indices2 + num_values2, vec_start); #endif hypre_IJVectorSetAddValuesParDevice(vector, num_values2, indices2, values, action); hypre_TFree(indices2, HYPRE_MEMORY_DEVICE); return hypre_error_flag; } hypre_AuxParVector *aux_vector = (hypre_AuxParVector*) hypre_IJVectorTranslator(vector); if (!aux_vector) { hypre_AuxParVectorCreate(&aux_vector); hypre_AuxParVectorInitialize_v2(aux_vector, HYPRE_MEMORY_DEVICE); hypre_IJVectorTranslator(vector) = aux_vector; } HYPRE_Int stack_elmts_max = hypre_AuxParVectorMaxStackElmts(aux_vector); HYPRE_Int stack_elmts_current = hypre_AuxParVectorCurrentStackElmts(aux_vector); HYPRE_Int stack_elmts_required = stack_elmts_current + num_values; HYPRE_BigInt *stack_i = hypre_AuxParVectorStackI(aux_vector); HYPRE_BigInt *stack_voff = hypre_AuxParVectorStackVoff(aux_vector); HYPRE_Complex *stack_data = hypre_AuxParVectorStackData(aux_vector); char *stack_sora = hypre_AuxParVectorStackSorA(aux_vector); if (stack_elmts_max < stack_elmts_required) { HYPRE_Int stack_elmts_max_new = size * hypre_AuxParVectorInitAllocFactor(aux_vector); if (hypre_AuxParVectorUsrOffProcElmts(aux_vector) >= 0) { stack_elmts_max_new += hypre_AuxParVectorUsrOffProcElmts(aux_vector); } stack_elmts_max_new = hypre_max(stack_elmts_max * hypre_AuxParVectorGrowFactor(aux_vector), stack_elmts_max_new); stack_elmts_max_new = hypre_max(stack_elmts_required, stack_elmts_max_new); stack_i = hypre_TReAlloc_v2(stack_i, HYPRE_BigInt, stack_elmts_max, HYPRE_BigInt, stack_elmts_max_new, HYPRE_MEMORY_DEVICE); stack_data = hypre_TReAlloc_v2(stack_data, HYPRE_Complex, stack_elmts_max, HYPRE_Complex, stack_elmts_max_new, HYPRE_MEMORY_DEVICE); stack_sora = hypre_TReAlloc_v2(stack_sora, char, stack_elmts_max, char, stack_elmts_max_new, HYPRE_MEMORY_DEVICE); if (num_vectors > 1) { stack_voff = hypre_TReAlloc_v2(stack_voff, HYPRE_BigInt, stack_elmts_max, HYPRE_BigInt, stack_elmts_max_new, HYPRE_MEMORY_DEVICE); } hypre_AuxParVectorStackI(aux_vector) = stack_i; hypre_AuxParVectorStackVoff(aux_vector) = stack_voff; hypre_AuxParVectorStackData(aux_vector) = stack_data; hypre_AuxParVectorStackSorA(aux_vector) = stack_sora; hypre_AuxParVectorMaxStackElmts(aux_vector) = stack_elmts_max_new; } hypreDevice_CharFilln(stack_sora + stack_elmts_current, num_values, SorA); if (num_vectors > 1) { hypreDevice_BigIntFilln(stack_voff + stack_elmts_current, num_values, (HYPRE_BigInt) component * vecstride); } hypre_TMemcpy(stack_i + stack_elmts_current, indices, HYPRE_BigInt, num_values, HYPRE_MEMORY_DEVICE, HYPRE_MEMORY_DEVICE); hypre_TMemcpy(stack_data + stack_elmts_current, values, HYPRE_Complex, num_values, HYPRE_MEMORY_DEVICE, HYPRE_MEMORY_DEVICE); hypre_AuxParVectorCurrentStackElmts(aux_vector) += num_values; return hypre_error_flag; } /****************************************************************************** * hypre_IJVectorAssembleParDevice *****************************************************************************/ HYPRE_Int hypre_IJVectorAssembleParDevice(hypre_IJVector *vector) { MPI_Comm comm = hypre_IJVectorComm(vector); hypre_ParVector *par_vector = (hypre_ParVector*) hypre_IJVectorObject(vector); hypre_AuxParVector *aux_vector = (hypre_AuxParVector*) hypre_IJVectorTranslator(vector); HYPRE_BigInt *IJpartitioning = hypre_IJVectorPartitioning(vector); HYPRE_BigInt vec_start = IJpartitioning[0]; HYPRE_BigInt vec_stop = IJpartitioning[1] - 1; hypre_Vector *local_vector = hypre_ParVectorLocalVector(par_vector); HYPRE_Int num_vectors = hypre_VectorNumVectors(local_vector); HYPRE_Complex *data = hypre_VectorData(local_vector); if (!aux_vector) { return hypre_error_flag; } if (!par_vector) { return hypre_error_flag; } HYPRE_Int nelms = hypre_AuxParVectorCurrentStackElmts(aux_vector); HYPRE_BigInt *stack_i = hypre_AuxParVectorStackI(aux_vector); HYPRE_BigInt *stack_voff = hypre_AuxParVectorStackVoff(aux_vector); HYPRE_Complex *stack_data = hypre_AuxParVectorStackData(aux_vector); char *stack_sora = hypre_AuxParVectorStackSorA(aux_vector); in_range pred(vec_start, vec_stop); #if defined(HYPRE_USING_SYCL) HYPRE_Int nelms_on = HYPRE_ONEDPL_CALL(std::count_if, stack_i, stack_i + nelms, pred); #else HYPRE_Int nelms_on = HYPRE_THRUST_CALL(count_if, stack_i, stack_i + nelms, pred); #endif HYPRE_Int nelms_off = nelms - nelms_on; HYPRE_Int nelms_off_max; hypre_MPI_Allreduce(&nelms_off, &nelms_off_max, 1, HYPRE_MPI_INT, hypre_MPI_MAX, comm); /* communicate for aux off-proc and add to remote aux on-proc */ if (nelms_off_max) { HYPRE_Int new_nnz = 0; HYPRE_BigInt *off_proc_i = NULL; HYPRE_Complex *off_proc_data = NULL; if (num_vectors > 1) { hypre_error_w_msg(HYPRE_ERROR_GENERIC, "Off proc IJVectorAssembleParDevice not implemented for multivectors!\n"); return hypre_error_flag; } if (nelms_off) { /* copy off-proc entries out of stack and remove from stack */ off_proc_i = hypre_TAlloc(HYPRE_BigInt, nelms_off, HYPRE_MEMORY_DEVICE); off_proc_data = hypre_TAlloc(HYPRE_Complex, nelms_off, HYPRE_MEMORY_DEVICE); char *off_proc_sora = hypre_TAlloc(char, nelms_off, HYPRE_MEMORY_DEVICE); char *is_on_proc = hypre_TAlloc(char, nelms, HYPRE_MEMORY_DEVICE); #if defined(HYPRE_USING_SYCL) HYPRE_ONEDPL_CALL(std::transform, stack_i, stack_i + nelms, is_on_proc, pred); auto zip_in = oneapi::dpl::make_zip_iterator(stack_i, stack_data, stack_sora); auto zip_out = oneapi::dpl::make_zip_iterator(off_proc_i, off_proc_data, off_proc_sora); auto new_end1 = hypreSycl_copy_if( zip_in, /* first */ zip_in + nelms, /* last */ is_on_proc, /* stencil */ zip_out, /* result */ [] (const auto & x) {return !x;} ); hypre_assert(std::get<0>(new_end1.base()) - off_proc_i == nelms_off); /* remove off-proc entries from stack */ auto new_end2 = hypreSycl_remove_if( zip_in, /* first */ zip_in + nelms, /* last */ is_on_proc, /* stencil */ [] (const auto & x) {return !x;} ); hypre_assert(std::get<0>(new_end2.base()) - stack_i == nelms_on); #else HYPRE_THRUST_CALL(transform, stack_i, stack_i + nelms, is_on_proc, pred); auto new_end1 = HYPRE_THRUST_CALL( copy_if, thrust::make_zip_iterator(thrust::make_tuple(stack_i, stack_data, stack_sora )), /* first */ thrust::make_zip_iterator(thrust::make_tuple(stack_i + nelms, stack_data + nelms, stack_sora + nelms)), /* last */ is_on_proc, /* stencil */ thrust::make_zip_iterator(thrust::make_tuple(off_proc_i, off_proc_data, off_proc_sora)), /* result */ HYPRE_THRUST_NOT(thrust::identity()) ); hypre_assert(thrust::get<0>(new_end1.get_iterator_tuple()) - off_proc_i == nelms_off); /* remove off-proc entries from stack */ auto new_end2 = HYPRE_THRUST_CALL( remove_if, thrust::make_zip_iterator(thrust::make_tuple(stack_i, stack_data, stack_sora )), /* first */ thrust::make_zip_iterator(thrust::make_tuple(stack_i + nelms, stack_data + nelms, stack_sora + nelms)), /* last */ is_on_proc, /* stencil */ HYPRE_THRUST_NOT(thrust::identity()) ); hypre_assert(thrust::get<0>(new_end2.get_iterator_tuple()) - stack_i == nelms_on); #endif hypre_AuxParVectorCurrentStackElmts(aux_vector) = nelms_on; hypre_TFree(is_on_proc, HYPRE_MEMORY_DEVICE); /* sort and reduce */ hypre_IJVectorAssembleSortAndReduce3(nelms_off, off_proc_i, off_proc_sora, off_proc_data, &new_nnz); hypre_TFree(off_proc_sora, HYPRE_MEMORY_DEVICE); } /* send off_proc_i/data to remote processes and the receivers call addtovalues */ hypre_IJVectorAssembleOffProcValsPar(vector, -1, new_nnz, HYPRE_MEMORY_DEVICE, off_proc_i, off_proc_data); hypre_TFree(off_proc_i, HYPRE_MEMORY_DEVICE); hypre_TFree(off_proc_data, HYPRE_MEMORY_DEVICE); } /* Note: the stack might have been changed in hypre_IJVectorAssembleOffProcValsPar, * so must get the size and the pointers again */ nelms = hypre_AuxParVectorCurrentStackElmts(aux_vector); stack_i = hypre_AuxParVectorStackI(aux_vector); stack_voff = hypre_AuxParVectorStackVoff(aux_vector); stack_data = hypre_AuxParVectorStackData(aux_vector); stack_sora = hypre_AuxParVectorStackSorA(aux_vector); #ifdef HYPRE_DEBUG /* the stack should only have on-proc elements now */ #if defined(HYPRE_USING_SYCL) HYPRE_Int tmp = HYPRE_ONEDPL_CALL(std::count_if, stack_i, stack_i + nelms, pred); #else HYPRE_Int tmp = HYPRE_THRUST_CALL(count_if, stack_i, stack_i + nelms, pred); #endif hypre_assert(nelms == tmp); #endif if (nelms) { HYPRE_Int new_nnz; HYPRE_BigInt *new_i; HYPRE_Complex *new_data; char *new_sora; /* Shift stack_i with multivector component offsets */ if (num_vectors > 1) { hypreDevice_BigIntAxpyn(stack_voff, nelms, stack_i, stack_i, 1); } /* sort and reduce */ hypre_IJVectorAssembleSortAndReduce1(nelms, stack_i, stack_sora, stack_data, &new_nnz, &new_i, &new_sora, &new_data); /* set/add to local vector */ dim3 bDim = hypre_GetDefaultDeviceBlockDimension(); dim3 gDim = hypre_GetDefaultDeviceGridDimension(new_nnz, "thread", bDim); HYPRE_GPU_LAUNCH( hypreGPUKernel_IJVectorAssemblePar, gDim, bDim, new_nnz, new_data, new_i, vec_start, new_sora, data ); hypre_TFree(new_i, HYPRE_MEMORY_DEVICE); hypre_TFree(new_data, HYPRE_MEMORY_DEVICE); hypre_TFree(new_sora, HYPRE_MEMORY_DEVICE); } hypre_AuxParVectorDestroy(aux_vector); hypre_IJVectorTranslator(vector) = NULL; return hypre_error_flag; } __global__ void hypreCUDAKernel_IJVectorUpdateValues( hypre_DeviceItem &item, HYPRE_Int n, const HYPRE_Complex *x, const HYPRE_BigInt *indices, HYPRE_BigInt start, HYPRE_BigInt stop, HYPRE_Int action, HYPRE_Complex *y ) { HYPRE_Int i = hypre_gpu_get_grid_thread_id<1, 1>(item); if (i >= n) { return; } HYPRE_Int j; if (indices) { j = (HYPRE_Int) (read_only_load(&indices[i]) - start); } else { j = i; } if (j < 0 || j > (HYPRE_Int) (stop - start)) { return; } if (action) { y[j] = x[i]; } else { y[j] += x[i]; } } HYPRE_Int hypre_IJVectorUpdateValuesDevice( hypre_IJVector *vector, HYPRE_Int num_values, const HYPRE_BigInt *indices, const HYPRE_Complex *values, HYPRE_Int action) { HYPRE_BigInt *IJpartitioning = hypre_IJVectorPartitioning(vector); HYPRE_BigInt vec_start = IJpartitioning[0]; HYPRE_BigInt vec_stop = IJpartitioning[1] - 1; if (!indices) { num_values = vec_stop - vec_start + 1; } if (num_values <= 0) { return hypre_error_flag; } /* set/add to local vector */ dim3 bDim = hypre_GetDefaultDeviceBlockDimension(); dim3 gDim = hypre_GetDefaultDeviceGridDimension(num_values, "thread", bDim); hypre_ParVector *par_vector = (hypre_ParVector*) hypre_IJVectorObject(vector); HYPRE_GPU_LAUNCH( hypreCUDAKernel_IJVectorUpdateValues, gDim, bDim, num_values, values, indices, vec_start, vec_stop, action, hypre_VectorData(hypre_ParVectorLocalVector(par_vector)) ); return hypre_error_flag; } #endif hypre-2.33.0/src/IJ_mv/IJ_assumed_part.c000066400000000000000000000123701477326011500177470ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /*---------------------------------------------------- * Functions for the IJ assumed partition fir IJ_Matrix *-----------------------------------------------------*/ #include "_hypre_IJ_mv.h" /*------------------------------------------------------------------ * hypre_IJMatrixCreateAssumedPartition - * Each proc gets it own range. Then * each needs to reconcile its actual range with its assumed * range - the result is essentila a partition of its assumed range - * this is the assumed partition. *--------------------------------------------------------------------*/ HYPRE_Int hypre_IJMatrixCreateAssumedPartition( hypre_IJMatrix *matrix) { HYPRE_BigInt global_num_rows; HYPRE_BigInt global_first_row; HYPRE_Int myid; HYPRE_BigInt row_start = 0, row_end = 0; HYPRE_BigInt *row_partitioning = hypre_IJMatrixRowPartitioning(matrix); MPI_Comm comm; hypre_IJAssumedPart *apart; global_num_rows = hypre_IJMatrixGlobalNumRows(matrix); global_first_row = hypre_IJMatrixGlobalFirstRow(matrix); comm = hypre_IJMatrixComm(matrix); /* find out my actual range of rows and rowumns */ row_start = row_partitioning[0]; row_end = row_partitioning[1] - 1; hypre_MPI_Comm_rank(comm, &myid ); /* allocate space */ apart = hypre_CTAlloc(hypre_IJAssumedPart, 1, HYPRE_MEMORY_HOST); /* get my assumed partitioning - we want row partitioning of the matrix for off processor values - so we use the row start and end Note that this is different from the assumed partitioning for the parcsr matrix which needs it for matvec multiplications and therefore needs to do it for the col partitioning */ hypre_GetAssumedPartitionRowRange( comm, myid, global_first_row, global_num_rows, &(apart->row_start), &(apart->row_end)); /*allocate some space for the partition of the assumed partition */ apart->length = 0; /*room for 10 owners of the assumed partition*/ apart->storage_length = 10; /*need to be >=1 */ apart->proc_list = hypre_TAlloc(HYPRE_Int, apart->storage_length, HYPRE_MEMORY_HOST); apart->row_start_list = hypre_TAlloc(HYPRE_BigInt, apart->storage_length, HYPRE_MEMORY_HOST); apart->row_end_list = hypre_TAlloc(HYPRE_BigInt, apart->storage_length, HYPRE_MEMORY_HOST); /* now we want to reconcile our actual partition with the assumed partition */ hypre_LocateAssumedPartition(comm, row_start, row_end, global_first_row, global_num_rows, apart, myid); /* this partition will be saved in the matrix data structure until the matrix is destroyed */ hypre_IJMatrixAssumedPart(matrix) = apart; return hypre_error_flag; } /*-------------------------------------------------------------------- * hypre_IJVectorCreateAssumedPartition - * Essentially the same as for a matrix! * Each proc gets it own range. Then * each needs to reconcile its actual range with its assumed * range - the result is essentila a partition of its assumed range - * this is the assumed partition. *--------------------------------------------------------------------*/ HYPRE_Int hypre_IJVectorCreateAssumedPartition( hypre_IJVector *vector) { HYPRE_BigInt global_num, global_first_row; HYPRE_Int myid; HYPRE_BigInt start, end; HYPRE_BigInt *partitioning = hypre_IJVectorPartitioning(vector); MPI_Comm comm; hypre_IJAssumedPart *apart; global_num = hypre_IJVectorGlobalNumRows(vector); global_first_row = hypre_IJVectorGlobalFirstRow(vector); comm = hypre_ParVectorComm(vector); /* find out my actualy range of rows */ start = partitioning[0]; end = partitioning[1] - 1; hypre_MPI_Comm_rank(comm, &myid); /* allocate space */ apart = hypre_CTAlloc(hypre_IJAssumedPart, 1, HYPRE_MEMORY_HOST); /* get my assumed partitioning - we want partitioning of the vector that the matrix multiplies - so we use the col start and end */ hypre_GetAssumedPartitionRowRange(comm, myid, global_first_row, global_num, &(apart->row_start), &(apart->row_end)); /*allocate some space for the partition of the assumed partition */ apart->length = 0; /*room for 10 owners of the assumed partition*/ apart->storage_length = 10; /*need to be >=1 */ apart->proc_list = hypre_TAlloc(HYPRE_Int, apart->storage_length, HYPRE_MEMORY_HOST); apart->row_start_list = hypre_TAlloc(HYPRE_BigInt, apart->storage_length, HYPRE_MEMORY_HOST); apart->row_end_list = hypre_TAlloc(HYPRE_BigInt, apart->storage_length, HYPRE_MEMORY_HOST); /* now we want to reconcile our actual partition with the assumed partition */ hypre_LocateAssumedPartition(comm, start, end, global_first_row, global_num, apart, myid); /* this partition will be saved in the vector data structure until the vector is destroyed */ hypre_IJVectorAssumedPart(vector) = apart; return hypre_error_flag; } hypre-2.33.0/src/IJ_mv/IJ_matrix.h000066400000000000000000000076271477326011500166020ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * Header info for the hypre_IJMatrix structures * *****************************************************************************/ #ifndef hypre_IJ_MATRIX_HEADER #define hypre_IJ_MATRIX_HEADER /*-------------------------------------------------------------------------- * hypre_IJMatrix: *--------------------------------------------------------------------------*/ typedef struct hypre_IJMatrix_struct { MPI_Comm comm; HYPRE_BigInt row_partitioning[2]; /* distribution of rows across processors */ HYPRE_BigInt col_partitioning[2]; /* distribution of columns */ HYPRE_Int object_type; /* Indicates the type of "object" */ void *object; /* Structure for storing local portion */ void *translator; /* optional storage_type specific structure for holding additional local info */ void *assumed_part; /* IJMatrix assumed partition */ HYPRE_Int assemble_flag; /* indicates whether matrix has been assembled */ HYPRE_BigInt global_first_row; /* these four data items are necessary */ HYPRE_BigInt global_first_col; /* to be able to avoid using the global */ HYPRE_BigInt global_num_rows; /* global partition */ HYPRE_BigInt global_num_cols; HYPRE_Int omp_flag; HYPRE_Int print_level; } hypre_IJMatrix; /*-------------------------------------------------------------------------- * Accessor macros: hypre_IJMatrix *--------------------------------------------------------------------------*/ #define hypre_IJMatrixComm(matrix) ((matrix) -> comm) #define hypre_IJMatrixRowPartitioning(matrix) ((matrix) -> row_partitioning) #define hypre_IJMatrixColPartitioning(matrix) ((matrix) -> col_partitioning) #define hypre_IJMatrixObjectType(matrix) ((matrix) -> object_type) #define hypre_IJMatrixObject(matrix) ((matrix) -> object) #define hypre_IJMatrixTranslator(matrix) ((matrix) -> translator) #define hypre_IJMatrixAssumedPart(matrix) ((matrix) -> assumed_part) #define hypre_IJMatrixAssembleFlag(matrix) ((matrix) -> assemble_flag) #define hypre_IJMatrixGlobalFirstRow(matrix) ((matrix) -> global_first_row) #define hypre_IJMatrixGlobalFirstCol(matrix) ((matrix) -> global_first_col) #define hypre_IJMatrixGlobalNumRows(matrix) ((matrix) -> global_num_rows) #define hypre_IJMatrixGlobalNumCols(matrix) ((matrix) -> global_num_cols) #define hypre_IJMatrixOMPFlag(matrix) ((matrix) -> omp_flag) #define hypre_IJMatrixPrintLevel(matrix) ((matrix) -> print_level) static inline HYPRE_MAYBE_UNUSED_FUNC HYPRE_MemoryLocation hypre_IJMatrixMemoryLocation(hypre_IJMatrix *matrix) { if ( hypre_IJMatrixObject(matrix) && hypre_IJMatrixObjectType(matrix) == HYPRE_PARCSR) { return hypre_ParCSRMatrixMemoryLocation( (hypre_ParCSRMatrix *) hypre_IJMatrixObject(matrix) ); } return HYPRE_MEMORY_UNDEFINED; } /*-------------------------------------------------------------------------- * prototypes for operations on local objects *--------------------------------------------------------------------------*/ #ifdef PETSC_AVAILABLE /* IJMatrix_petsc.c */ HYPRE_Int hypre_GetIJMatrixParCSRMatrix( HYPRE_IJMatrix IJmatrix, Mat *reference ) #endif #ifdef ISIS_AVAILABLE /* IJMatrix_isis.c */ HYPRE_Int hypre_GetIJMatrixISISMatrix( HYPRE_IJMatrix IJmatrix, RowMatrix *reference ) #endif #endif /* #ifndef hypre_IJ_MATRIX_HEADER */ hypre-2.33.0/src/IJ_mv/IJ_vector.h000066400000000000000000000061211477326011500165640ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * Header info for the hypre_IJMatrix structures * *****************************************************************************/ #ifndef hypre_IJ_VECTOR_HEADER #define hypre_IJ_VECTOR_HEADER /*-------------------------------------------------------------------------- * hypre_IJVector: *--------------------------------------------------------------------------*/ typedef struct hypre_IJVector_struct { MPI_Comm comm; HYPRE_BigInt partitioning[2]; /* Indicates partitioning over tasks */ HYPRE_Int num_components; /* Number of components of a multivector */ HYPRE_Int object_type; /* Indicates the type of "local storage" */ void *object; /* Structure for storing local portion */ void *translator; /* Structure for storing off processor information */ void *assumed_part; /* IJ Vector assumed partition */ HYPRE_BigInt global_first_row; /* these for data items are necessary */ HYPRE_BigInt global_num_rows; /* to be able to avoid using the global partition */ HYPRE_Int print_level; } hypre_IJVector; /*-------------------------------------------------------------------------- * Accessor macros: hypre_IJVector *--------------------------------------------------------------------------*/ #define hypre_IJVectorComm(vector) ((vector) -> comm) #define hypre_IJVectorPartitioning(vector) ((vector) -> partitioning) #define hypre_IJVectorNumComponents(vector) ((vector) -> num_components) #define hypre_IJVectorObjectType(vector) ((vector) -> object_type) #define hypre_IJVectorObject(vector) ((vector) -> object) #define hypre_IJVectorTranslator(vector) ((vector) -> translator) #define hypre_IJVectorAssumedPart(vector) ((vector) -> assumed_part) #define hypre_IJVectorGlobalFirstRow(vector) ((vector) -> global_first_row) #define hypre_IJVectorGlobalNumRows(vector) ((vector) -> global_num_rows) #define hypre_IJVectorPrintLevel(vector) ((vector) -> print_level) static inline HYPRE_MAYBE_UNUSED_FUNC HYPRE_MemoryLocation hypre_IJVectorMemoryLocation(hypre_IJVector *vector) { if ( hypre_IJVectorObject(vector) && hypre_IJVectorObjectType(vector) == HYPRE_PARCSR) { return hypre_ParVectorMemoryLocation( (hypre_ParVector *) hypre_IJVectorObject(vector) ); } return HYPRE_MEMORY_UNDEFINED; } /*-------------------------------------------------------------------------- * prototypes for operations on local objects *--------------------------------------------------------------------------*/ /* #include "./internal_protos.h" */ #endif /* #ifndef hypre_IJ_VECTOR_HEADER */ hypre-2.33.0/src/IJ_mv/Makefile000066400000000000000000000041321477326011500161670ustar00rootroot00000000000000# Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) include ../config/Makefile.config CINCLUDES = ${INCLUDES} ${MPIINCLUDE} C_COMPILE_FLAGS =\ -I..\ -I$(srcdir)/..\ -I$(srcdir)/../utilities\ -I$(srcdir)/../struct_mv\ -I$(srcdir)/../seq_mv\ -I$(srcdir)/../seq_block_mv\ -I$(srcdir)/../parcsr_mv\ -I$(srcdir)/../parcsr_ls\ ${CINCLUDES} HEADERS =\ aux_parcsr_matrix.h\ aux_par_vector.h\ HYPRE_IJ_mv.h\ _hypre_IJ_mv.h\ IJ_matrix.h\ IJ_vector.h EXTRA_FILES =\ IJMatrix_isis.c\ IJMatrix_petsc.c FILES =\ aux_parcsr_matrix.c\ aux_par_vector.c\ F90_HYPRE_IJMatrix.c\ F90_HYPRE_IJVector.c\ F90_IJMatrix.c\ HYPRE_IJMatrix.c\ HYPRE_IJVector.c\ IJ_assumed_part.c\ IJMatrix.c\ IJMatrix_parcsr.c\ IJVector.c\ IJVector_parcsr.c CUFILES =\ IJMatrix_parcsr_device.c\ IJVector_parcsr_device.c COBJS = ${FILES:.c=.o} CUOBJS = ${CUFILES:.c=.obj} OBJS = ${COBJS} ${CUOBJS} SONAME = libHYPRE_IJ_mv-${HYPRE_RELEASE_VERSION}${HYPRE_LIB_SUFFIX} ################################################################## # Targets ################################################################## all: libHYPRE_IJ_mv${HYPRE_LIB_SUFFIX} cp -fR $(srcdir)/HYPRE_*.h $(HYPRE_BUILD_DIR)/include cp -fR $(srcdir)/_hypre_IJ_mv.h $(HYPRE_BUILD_DIR)/include # cp -fR libHYPRE* $(HYPRE_BUILD_DIR)/lib install: libHYPRE_IJ_mv${HYPRE_LIB_SUFFIX} cp -fR $(srcdir)/HYPRE_*.h $(HYPRE_INC_INSTALL) cp -fR $(srcdir)/_hypre_IJ_mv.h $(HYPRE_INC_INSTALL) # cp -fR libHYPRE* $(HYPRE_LIB_INSTALL) clean: rm -f *.o *.obj libHYPRE* rm -rf pchdir tca.map *inslog* distclean: clean ################################################################## # Rules ################################################################## libHYPRE_IJ_mv.a: ${OBJS} @echo "Building $@ ... " ${AR} $@ ${OBJS} ${RANLIB} $@ libHYPRE_IJ_mv.so libHYPRE_IJ_mv.dylib: ${OBJS} @echo "Building $@ ... " ${BUILD_CC_SHARED} -o ${SONAME} ${OBJS} ${SHARED_SET_SONAME}${SONAME} ln -s -f ${SONAME} $@ ${OBJS}: ${HEADERS} hypre-2.33.0/src/IJ_mv/_hypre_IJ_mv.h000066400000000000000000001123411477326011500172540ustar00rootroot00000000000000 /*** DO NOT EDIT THIS FILE DIRECTLY (use 'headers' to generate) ***/ #ifndef hypre_IJ_HEADER #define hypre_IJ_HEADER #include #include "_hypre_parcsr_mv.h" #include "HYPRE_IJ_mv.h" #include "HYPRE.h" #ifdef __cplusplus extern "C" { #endif /****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * Header info for Auxiliary Parallel CSR Matrix data structures * * Note: this matrix currently uses 0-based indexing. * *****************************************************************************/ #ifndef hypre_AUX_PARCSR_MATRIX_HEADER #define hypre_AUX_PARCSR_MATRIX_HEADER /*-------------------------------------------------------------------------- * Auxiliary Parallel CSR Matrix *--------------------------------------------------------------------------*/ typedef struct { HYPRE_Int local_num_rows; /* defines number of rows on this processor */ HYPRE_Int local_num_rownnz; /* defines number of nonzero rows on this processor */ HYPRE_Int local_num_cols; /* defines number of cols of diag */ HYPRE_Int need_aux; /* if need_aux = 1, aux_j, aux_data are used to generate the parcsr matrix (default), for need_aux = 0, data is put directly into parcsr structure (requires the knowledge of offd_i and diag_i ) */ HYPRE_Int *rownnz; /* row_nnz[i] contains the i-th nonzero row id */ HYPRE_Int *row_length; /* row_length[i] contains number of stored elements in i-th row */ HYPRE_Int *row_space; /* row_space[i] contains space allocated to i-th row */ HYPRE_Int *diag_sizes; /* user input row lengths of diag */ HYPRE_Int *offd_sizes; /* user input row lengths of diag */ HYPRE_BigInt **aux_j; /* contains collected column indices */ HYPRE_Complex **aux_data; /* contains collected data */ HYPRE_Int *indx_diag; /* indx_diag[i] points to first empty space of portion in diag_j , diag_data assigned to row i */ HYPRE_Int *indx_offd; /* indx_offd[i] points to first empty space of portion in offd_j , offd_data assigned to row i */ HYPRE_Int max_off_proc_elmts; /* length of off processor stash set for SetValues and AddTOValues */ HYPRE_Int current_off_proc_elmts; /* current no. of elements stored in stash */ HYPRE_Int off_proc_i_indx; /* pointer to first empty space in set_off_proc_i_set */ HYPRE_BigInt *off_proc_i; /* length 2*num_off_procs_elmts, contains info pairs (code, no. of elmts) where code contains global row no. if SetValues, and (-global row no. -1) if AddToValues */ HYPRE_BigInt *off_proc_j; /* contains column indices * ( global col id.) if SetValues, * (-global col id. -1) if AddToValues */ HYPRE_Complex *off_proc_data; /* contains corresponding data */ HYPRE_MemoryLocation memory_location; #if defined(HYPRE_USING_GPU) HYPRE_BigInt max_stack_elmts; HYPRE_BigInt current_stack_elmts; HYPRE_BigInt *stack_i; HYPRE_BigInt *stack_j; HYPRE_Complex *stack_data; char *stack_sora; /* Set (1) or Add (0) */ HYPRE_Int usr_on_proc_elmts; /* user given num elmt on-proc */ HYPRE_Int usr_off_proc_elmts; /* user given num elmt off-proc */ HYPRE_Int early_assemble; HYPRE_Int init_alloc_factor; HYPRE_Real grow_factor; #endif } hypre_AuxParCSRMatrix; /*-------------------------------------------------------------------------- * Accessor functions for the Parallel CSR Matrix structure *--------------------------------------------------------------------------*/ #define hypre_AuxParCSRMatrixLocalNumRows(matrix) ((matrix) -> local_num_rows) #define hypre_AuxParCSRMatrixLocalNumRownnz(matrix) ((matrix) -> local_num_rownnz) #define hypre_AuxParCSRMatrixLocalNumCols(matrix) ((matrix) -> local_num_cols) #define hypre_AuxParCSRMatrixNeedAux(matrix) ((matrix) -> need_aux) #define hypre_AuxParCSRMatrixRownnz(matrix) ((matrix) -> rownnz) #define hypre_AuxParCSRMatrixRowLength(matrix) ((matrix) -> row_length) #define hypre_AuxParCSRMatrixRowSpace(matrix) ((matrix) -> row_space) #define hypre_AuxParCSRMatrixAuxJ(matrix) ((matrix) -> aux_j) #define hypre_AuxParCSRMatrixAuxData(matrix) ((matrix) -> aux_data) #define hypre_AuxParCSRMatrixIndxDiag(matrix) ((matrix) -> indx_diag) #define hypre_AuxParCSRMatrixIndxOffd(matrix) ((matrix) -> indx_offd) #define hypre_AuxParCSRMatrixDiagSizes(matrix) ((matrix) -> diag_sizes) #define hypre_AuxParCSRMatrixOffdSizes(matrix) ((matrix) -> offd_sizes) #define hypre_AuxParCSRMatrixMaxOffProcElmts(matrix) ((matrix) -> max_off_proc_elmts) #define hypre_AuxParCSRMatrixCurrentOffProcElmts(matrix) ((matrix) -> current_off_proc_elmts) #define hypre_AuxParCSRMatrixOffProcIIndx(matrix) ((matrix) -> off_proc_i_indx) #define hypre_AuxParCSRMatrixOffProcI(matrix) ((matrix) -> off_proc_i) #define hypre_AuxParCSRMatrixOffProcJ(matrix) ((matrix) -> off_proc_j) #define hypre_AuxParCSRMatrixOffProcData(matrix) ((matrix) -> off_proc_data) #define hypre_AuxParCSRMatrixMemoryLocation(matrix) ((matrix) -> memory_location) #if defined(HYPRE_USING_GPU) #define hypre_AuxParCSRMatrixMaxStackElmts(matrix) ((matrix) -> max_stack_elmts) #define hypre_AuxParCSRMatrixCurrentStackElmts(matrix) ((matrix) -> current_stack_elmts) #define hypre_AuxParCSRMatrixStackI(matrix) ((matrix) -> stack_i) #define hypre_AuxParCSRMatrixStackJ(matrix) ((matrix) -> stack_j) #define hypre_AuxParCSRMatrixStackData(matrix) ((matrix) -> stack_data) #define hypre_AuxParCSRMatrixStackSorA(matrix) ((matrix) -> stack_sora) #define hypre_AuxParCSRMatrixUsrOnProcElmts(matrix) ((matrix) -> usr_on_proc_elmts) #define hypre_AuxParCSRMatrixUsrOffProcElmts(matrix) ((matrix) -> usr_off_proc_elmts) #define hypre_AuxParCSRMatrixEarlyAssemble(matrix) ((matrix) -> early_assemble) #define hypre_AuxParCSRMatrixInitAllocFactor(matrix) ((matrix) -> init_alloc_factor) #define hypre_AuxParCSRMatrixGrowFactor(matrix) ((matrix) -> grow_factor) #endif #endif /* #ifndef hypre_AUX_PARCSR_MATRIX_HEADER */ /****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * Header info for Auxiliary Parallel Vector data structures * * Note: this vector currently uses 0-based indexing. * *****************************************************************************/ #ifndef hypre_AUX_PAR_VECTOR_HEADER #define hypre_AUX_PAR_VECTOR_HEADER /*-------------------------------------------------------------------------- * Auxiliary Parallel Vector *--------------------------------------------------------------------------*/ typedef struct { HYPRE_Int max_off_proc_elmts; /* length of off processor stash for SetValues and AddToValues*/ HYPRE_Int current_off_proc_elmts; /* current no. of elements stored in stash */ HYPRE_BigInt *off_proc_i; /* contains column indices */ HYPRE_Complex *off_proc_data; /* contains corresponding data */ HYPRE_MemoryLocation memory_location; #if defined(HYPRE_USING_GPU) HYPRE_Int max_stack_elmts; /* length of stash for SetValues and AddToValues*/ HYPRE_Int current_stack_elmts; /* current no. of elements stored in stash */ HYPRE_BigInt *stack_i; /* contains row indices */ HYPRE_BigInt *stack_voff; /* contains vector offsets for multivectors */ HYPRE_Complex *stack_data; /* contains corresponding data */ char *stack_sora; HYPRE_Int usr_off_proc_elmts; /* the num of off-proc elements usr guided */ HYPRE_Real init_alloc_factor; HYPRE_Real grow_factor; #endif } hypre_AuxParVector; /*-------------------------------------------------------------------------- * Accessor functions for the Parallel Vector structure *--------------------------------------------------------------------------*/ #define hypre_AuxParVectorMaxOffProcElmts(vector) ((vector) -> max_off_proc_elmts) #define hypre_AuxParVectorCurrentOffProcElmts(vector) ((vector) -> current_off_proc_elmts) #define hypre_AuxParVectorOffProcI(vector) ((vector) -> off_proc_i) #define hypre_AuxParVectorOffProcData(vector) ((vector) -> off_proc_data) #define hypre_AuxParVectorMemoryLocation(vector) ((vector) -> memory_location) #if defined(HYPRE_USING_GPU) #define hypre_AuxParVectorMaxStackElmts(vector) ((vector) -> max_stack_elmts) #define hypre_AuxParVectorCurrentStackElmts(vector) ((vector) -> current_stack_elmts) #define hypre_AuxParVectorStackI(vector) ((vector) -> stack_i) #define hypre_AuxParVectorStackVoff(vector) ((vector) -> stack_voff) #define hypre_AuxParVectorStackData(vector) ((vector) -> stack_data) #define hypre_AuxParVectorStackSorA(vector) ((vector) -> stack_sora) #define hypre_AuxParVectorUsrOffProcElmts(vector) ((vector) -> usr_off_proc_elmts) #define hypre_AuxParVectorInitAllocFactor(vector) ((vector) -> init_alloc_factor) #define hypre_AuxParVectorGrowFactor(vector) ((vector) -> grow_factor) #endif #endif /* #ifndef hypre_AUX_PAR_VECTOR_HEADER */ /****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * Header info for the hypre_IJMatrix structures * *****************************************************************************/ #ifndef hypre_IJ_MATRIX_HEADER #define hypre_IJ_MATRIX_HEADER /*-------------------------------------------------------------------------- * hypre_IJMatrix: *--------------------------------------------------------------------------*/ typedef struct hypre_IJMatrix_struct { MPI_Comm comm; HYPRE_BigInt row_partitioning[2]; /* distribution of rows across processors */ HYPRE_BigInt col_partitioning[2]; /* distribution of columns */ HYPRE_Int object_type; /* Indicates the type of "object" */ void *object; /* Structure for storing local portion */ void *translator; /* optional storage_type specific structure for holding additional local info */ void *assumed_part; /* IJMatrix assumed partition */ HYPRE_Int assemble_flag; /* indicates whether matrix has been assembled */ HYPRE_BigInt global_first_row; /* these four data items are necessary */ HYPRE_BigInt global_first_col; /* to be able to avoid using the global */ HYPRE_BigInt global_num_rows; /* global partition */ HYPRE_BigInt global_num_cols; HYPRE_Int omp_flag; HYPRE_Int print_level; } hypre_IJMatrix; /*-------------------------------------------------------------------------- * Accessor macros: hypre_IJMatrix *--------------------------------------------------------------------------*/ #define hypre_IJMatrixComm(matrix) ((matrix) -> comm) #define hypre_IJMatrixRowPartitioning(matrix) ((matrix) -> row_partitioning) #define hypre_IJMatrixColPartitioning(matrix) ((matrix) -> col_partitioning) #define hypre_IJMatrixObjectType(matrix) ((matrix) -> object_type) #define hypre_IJMatrixObject(matrix) ((matrix) -> object) #define hypre_IJMatrixTranslator(matrix) ((matrix) -> translator) #define hypre_IJMatrixAssumedPart(matrix) ((matrix) -> assumed_part) #define hypre_IJMatrixAssembleFlag(matrix) ((matrix) -> assemble_flag) #define hypre_IJMatrixGlobalFirstRow(matrix) ((matrix) -> global_first_row) #define hypre_IJMatrixGlobalFirstCol(matrix) ((matrix) -> global_first_col) #define hypre_IJMatrixGlobalNumRows(matrix) ((matrix) -> global_num_rows) #define hypre_IJMatrixGlobalNumCols(matrix) ((matrix) -> global_num_cols) #define hypre_IJMatrixOMPFlag(matrix) ((matrix) -> omp_flag) #define hypre_IJMatrixPrintLevel(matrix) ((matrix) -> print_level) static inline HYPRE_MAYBE_UNUSED_FUNC HYPRE_MemoryLocation hypre_IJMatrixMemoryLocation(hypre_IJMatrix *matrix) { if ( hypre_IJMatrixObject(matrix) && hypre_IJMatrixObjectType(matrix) == HYPRE_PARCSR) { return hypre_ParCSRMatrixMemoryLocation( (hypre_ParCSRMatrix *) hypre_IJMatrixObject(matrix) ); } return HYPRE_MEMORY_UNDEFINED; } /*-------------------------------------------------------------------------- * prototypes for operations on local objects *--------------------------------------------------------------------------*/ #ifdef PETSC_AVAILABLE /* IJMatrix_petsc.c */ HYPRE_Int hypre_GetIJMatrixParCSRMatrix( HYPRE_IJMatrix IJmatrix, Mat *reference ) #endif #ifdef ISIS_AVAILABLE /* IJMatrix_isis.c */ HYPRE_Int hypre_GetIJMatrixISISMatrix( HYPRE_IJMatrix IJmatrix, RowMatrix *reference ) #endif #endif /* #ifndef hypre_IJ_MATRIX_HEADER */ /****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * Header info for the hypre_IJMatrix structures * *****************************************************************************/ #ifndef hypre_IJ_VECTOR_HEADER #define hypre_IJ_VECTOR_HEADER /*-------------------------------------------------------------------------- * hypre_IJVector: *--------------------------------------------------------------------------*/ typedef struct hypre_IJVector_struct { MPI_Comm comm; HYPRE_BigInt partitioning[2]; /* Indicates partitioning over tasks */ HYPRE_Int num_components; /* Number of components of a multivector */ HYPRE_Int object_type; /* Indicates the type of "local storage" */ void *object; /* Structure for storing local portion */ void *translator; /* Structure for storing off processor information */ void *assumed_part; /* IJ Vector assumed partition */ HYPRE_BigInt global_first_row; /* these for data items are necessary */ HYPRE_BigInt global_num_rows; /* to be able to avoid using the global partition */ HYPRE_Int print_level; } hypre_IJVector; /*-------------------------------------------------------------------------- * Accessor macros: hypre_IJVector *--------------------------------------------------------------------------*/ #define hypre_IJVectorComm(vector) ((vector) -> comm) #define hypre_IJVectorPartitioning(vector) ((vector) -> partitioning) #define hypre_IJVectorNumComponents(vector) ((vector) -> num_components) #define hypre_IJVectorObjectType(vector) ((vector) -> object_type) #define hypre_IJVectorObject(vector) ((vector) -> object) #define hypre_IJVectorTranslator(vector) ((vector) -> translator) #define hypre_IJVectorAssumedPart(vector) ((vector) -> assumed_part) #define hypre_IJVectorGlobalFirstRow(vector) ((vector) -> global_first_row) #define hypre_IJVectorGlobalNumRows(vector) ((vector) -> global_num_rows) #define hypre_IJVectorPrintLevel(vector) ((vector) -> print_level) static inline HYPRE_MAYBE_UNUSED_FUNC HYPRE_MemoryLocation hypre_IJVectorMemoryLocation(hypre_IJVector *vector) { if ( hypre_IJVectorObject(vector) && hypre_IJVectorObjectType(vector) == HYPRE_PARCSR) { return hypre_ParVectorMemoryLocation( (hypre_ParVector *) hypre_IJVectorObject(vector) ); } return HYPRE_MEMORY_UNDEFINED; } /*-------------------------------------------------------------------------- * prototypes for operations on local objects *--------------------------------------------------------------------------*/ /* #include "./internal_protos.h" */ #endif /* #ifndef hypre_IJ_VECTOR_HEADER */ /****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /* aux_parcsr_matrix.c */ HYPRE_Int hypre_AuxParCSRMatrixCreate ( hypre_AuxParCSRMatrix **aux_matrix, HYPRE_Int local_num_rows, HYPRE_Int local_num_cols, HYPRE_Int *sizes ); HYPRE_Int hypre_AuxParCSRMatrixDestroy ( hypre_AuxParCSRMatrix *matrix ); HYPRE_Int hypre_AuxParCSRMatrixSetRownnz ( hypre_AuxParCSRMatrix *matrix ); HYPRE_Int hypre_AuxParCSRMatrixInitialize ( hypre_AuxParCSRMatrix *matrix ); HYPRE_Int hypre_AuxParCSRMatrixInitialize_v2( hypre_AuxParCSRMatrix *matrix, HYPRE_MemoryLocation memory_location ); /* aux_par_vector.c */ HYPRE_Int hypre_AuxParVectorCreate ( hypre_AuxParVector **aux_vector ); HYPRE_Int hypre_AuxParVectorDestroy ( hypre_AuxParVector *vector ); HYPRE_Int hypre_AuxParVectorInitialize ( hypre_AuxParVector *vector ); HYPRE_Int hypre_AuxParVectorInitialize_v2( hypre_AuxParVector *vector, HYPRE_MemoryLocation memory_location ); /* IJ_assumed_part.c */ HYPRE_Int hypre_IJMatrixCreateAssumedPartition ( hypre_IJMatrix *matrix ); HYPRE_Int hypre_IJVectorCreateAssumedPartition ( hypre_IJVector *vector ); /* IJMatrix.c */ HYPRE_Int hypre_IJMatrixGetRowPartitioning ( HYPRE_IJMatrix matrix, HYPRE_BigInt **row_partitioning ); HYPRE_Int hypre_IJMatrixGetColPartitioning ( HYPRE_IJMatrix matrix, HYPRE_BigInt **col_partitioning ); HYPRE_Int hypre_IJMatrixSetObject ( HYPRE_IJMatrix matrix, void *object ); HYPRE_Int hypre_IJMatrixRead( const char *filename, MPI_Comm comm, HYPRE_Int type, HYPRE_IJMatrix *matrix_ptr, HYPRE_Int is_mm ); HYPRE_Int hypre_IJMatrixReadBinary( const char *prefixname, MPI_Comm comm, HYPRE_Int type, HYPRE_IJMatrix *matrix_ptr ); /* IJMatrix_isis.c */ HYPRE_Int hypre_IJMatrixSetLocalSizeISIS ( hypre_IJMatrix *matrix, HYPRE_Int local_m, HYPRE_Int local_n ); HYPRE_Int hypre_IJMatrixCreateISIS ( hypre_IJMatrix *matrix ); HYPRE_Int hypre_IJMatrixSetRowSizesISIS ( hypre_IJMatrix *matrix, HYPRE_Int *sizes ); HYPRE_Int hypre_IJMatrixSetDiagRowSizesISIS ( hypre_IJMatrix *matrix, HYPRE_Int *sizes ); HYPRE_Int hypre_IJMatrixSetOffDiagRowSizesISIS ( hypre_IJMatrix *matrix, HYPRE_Int *sizes ); HYPRE_Int hypre_IJMatrixInitializeISIS ( hypre_IJMatrix *matrix ); HYPRE_Int hypre_IJMatrixInsertBlockISIS ( hypre_IJMatrix *matrix, HYPRE_Int m, HYPRE_Int n, HYPRE_Int *rows, HYPRE_Int *cols, HYPRE_Complex *coeffs ); HYPRE_Int hypre_IJMatrixAddToBlockISIS ( hypre_IJMatrix *matrix, HYPRE_Int m, HYPRE_Int n, HYPRE_BigInt *rows, HYPRE_BigInt *cols, HYPRE_Complex *coeffs ); HYPRE_Int hypre_IJMatrixInsertRowISIS ( hypre_IJMatrix *matrix, HYPRE_Int n, HYPRE_BigInt row, HYPRE_BigInt *indices, HYPRE_Complex *coeffs ); HYPRE_Int hypre_IJMatrixAddToRowISIS ( hypre_IJMatrix *matrix, HYPRE_Int n, HYPRE_BigInt row, HYPRE_BigInt *indices, HYPRE_Complex *coeffs ); HYPRE_Int hypre_IJMatrixAssembleISIS ( hypre_IJMatrix *matrix ); HYPRE_Int hypre_IJMatrixDistributeISIS ( hypre_IJMatrix *matrix, HYPRE_BigInt *row_starts, HYPRE_BigInt *col_starts ); HYPRE_Int hypre_IJMatrixApplyISIS ( hypre_IJMatrix *matrix, hypre_ParVector *x, hypre_ParVector *b ); HYPRE_Int hypre_IJMatrixDestroyISIS ( hypre_IJMatrix *matrix ); HYPRE_Int hypre_IJMatrixSetTotalSizeISIS ( hypre_IJMatrix *matrix, HYPRE_Int size ); /* IJMatrix_parcsr.c */ HYPRE_Int hypre_IJMatrixCreateParCSR ( hypre_IJMatrix *matrix ); HYPRE_Int hypre_IJMatrixSetRowSizesParCSR ( hypre_IJMatrix *matrix, const HYPRE_Int *sizes ); HYPRE_Int hypre_IJMatrixSetDiagOffdSizesParCSR ( hypre_IJMatrix *matrix, const HYPRE_Int *diag_sizes, const HYPRE_Int *offdiag_sizes ); HYPRE_Int hypre_IJMatrixSetMaxOffProcElmtsParCSR ( hypre_IJMatrix *matrix, HYPRE_Int max_off_proc_elmts ); HYPRE_Int hypre_IJMatrixSetInitAllocationParCSR(hypre_IJMatrix *matrix, HYPRE_Int factor); HYPRE_Int hypre_IJMatrixSetEarlyAssembleParCSR(hypre_IJMatrix *matrix, HYPRE_Int early_assemble); HYPRE_Int hypre_IJMatrixSetGrowFactorParCSR(hypre_IJMatrix *matrix, HYPRE_Real factor); HYPRE_Int hypre_IJMatrixInitializeParCSR ( hypre_IJMatrix *matrix ); HYPRE_Int hypre_IJMatrixGetRowCountsParCSR ( hypre_IJMatrix *matrix, HYPRE_Int nrows, HYPRE_BigInt *rows, HYPRE_Int *ncols ); HYPRE_Int hypre_IJMatrixGetValuesParCSR ( hypre_IJMatrix *matrix, HYPRE_Int nrows, HYPRE_Int *ncols, HYPRE_BigInt *rows, HYPRE_Int *row_indexes, HYPRE_BigInt *cols, HYPRE_Complex *values, HYPRE_Int zero_out ); HYPRE_Int hypre_IJMatrixSetValuesParCSR ( hypre_IJMatrix *matrix, HYPRE_Int nrows, HYPRE_Int *ncols, const HYPRE_BigInt *rows, const HYPRE_Int *row_indexes, const HYPRE_BigInt *cols, const HYPRE_Complex *values ); HYPRE_Int hypre_IJMatrixSetAddValuesParCSRDevice ( hypre_IJMatrix *matrix, HYPRE_Int nrows, HYPRE_Int *ncols, const HYPRE_BigInt *rows, const HYPRE_Int *row_indexes, const HYPRE_BigInt *cols, const HYPRE_Complex *values, const char *action ); HYPRE_Int hypre_IJMatrixSetConstantValuesParCSR ( hypre_IJMatrix *matrix, HYPRE_Complex value ); HYPRE_Int hypre_IJMatrixAddToValuesParCSR ( hypre_IJMatrix *matrix, HYPRE_Int nrows, HYPRE_Int *ncols, const HYPRE_BigInt *rows, const HYPRE_Int *row_indexes, const HYPRE_BigInt *cols, const HYPRE_Complex *values ); HYPRE_Int hypre_IJMatrixDestroyParCSR ( hypre_IJMatrix *matrix ); HYPRE_Int hypre_IJMatrixTransposeParCSR ( hypre_IJMatrix *matrix_A, hypre_IJMatrix *matrix_AT ); HYPRE_Int hypre_IJMatrixNormParCSR ( hypre_IJMatrix *matrix, HYPRE_Real *norm ); HYPRE_Int hypre_IJMatrixAddParCSR ( HYPRE_Complex alpha, hypre_IJMatrix *matrix_A, HYPRE_Complex beta, hypre_IJMatrix *matrix_B, hypre_IJMatrix *matrix_C ); HYPRE_Int hypre_IJMatrixAssembleOffProcValsParCSR ( hypre_IJMatrix *matrix, HYPRE_Int off_proc_i_indx, HYPRE_Int max_off_proc_elmts, HYPRE_Int current_num_elmts, HYPRE_MemoryLocation memory_location, HYPRE_BigInt *off_proc_i, HYPRE_BigInt *off_proc_j, HYPRE_Complex *off_proc_data ); HYPRE_Int hypre_FillResponseIJOffProcVals ( void *p_recv_contact_buf, HYPRE_Int contact_size, HYPRE_Int contact_proc, void *ro, MPI_Comm comm, void **p_send_response_buf, HYPRE_Int *response_message_size ); HYPRE_Int hypre_FindProc ( HYPRE_BigInt *list, HYPRE_BigInt value, HYPRE_Int list_length ); HYPRE_Int hypre_IJMatrixAssembleParCSR ( hypre_IJMatrix *matrix ); HYPRE_Int hypre_IJMatrixSetValuesOMPParCSR ( hypre_IJMatrix *matrix, HYPRE_Int nrows, HYPRE_Int *ncols, const HYPRE_BigInt *rows, const HYPRE_Int *row_indexes, const HYPRE_BigInt *cols, const HYPRE_Complex *values ); HYPRE_Int hypre_IJMatrixAddToValuesOMPParCSR ( hypre_IJMatrix *matrix, HYPRE_Int nrows, HYPRE_Int *ncols, const HYPRE_BigInt *rows, const HYPRE_Int *row_indexes, const HYPRE_BigInt *cols, const HYPRE_Complex *values ); HYPRE_Int hypre_IJMatrixAssembleParCSRDevice(hypre_IJMatrix *matrix); HYPRE_Int hypre_IJMatrixInitializeParCSR_v2(hypre_IJMatrix *matrix, HYPRE_MemoryLocation memory_location); HYPRE_Int hypre_IJMatrixSetConstantValuesParCSRDevice( hypre_IJMatrix *matrix, HYPRE_Complex value ); HYPRE_Int hypre_IJMatrixMigrateParCSR(hypre_IJMatrix *matrix, HYPRE_MemoryLocation memory_location); HYPRE_Int hypre_IJMatrixAssembleCommunicate(hypre_IJMatrix *matrix); HYPRE_Int hypre_IJMatrixAssembleCompressDevice(hypre_IJMatrix *matrix, HYPRE_Int reduce_stack_size); /* IJMatrix_petsc.c */ HYPRE_Int hypre_IJMatrixSetLocalSizePETSc ( hypre_IJMatrix *matrix, HYPRE_Int local_m, HYPRE_Int local_n ); HYPRE_Int hypre_IJMatrixCreatePETSc ( hypre_IJMatrix *matrix ); HYPRE_Int hypre_IJMatrixSetRowSizesPETSc ( hypre_IJMatrix *matrix, HYPRE_Int *sizes ); HYPRE_Int hypre_IJMatrixSetDiagRowSizesPETSc ( hypre_IJMatrix *matrix, HYPRE_Int *sizes ); HYPRE_Int hypre_IJMatrixSetOffDiagRowSizesPETSc ( hypre_IJMatrix *matrix, HYPRE_Int *sizes ); HYPRE_Int hypre_IJMatrixInitializePETSc ( hypre_IJMatrix *matrix ); HYPRE_Int hypre_IJMatrixInsertBlockPETSc ( hypre_IJMatrix *matrix, HYPRE_Int m, HYPRE_Int n, HYPRE_BigInt *rows, HYPRE_BigInt *cols, HYPRE_Complex *coeffs ); HYPRE_Int hypre_IJMatrixAddToBlockPETSc ( hypre_IJMatrix *matrix, HYPRE_Int m, HYPRE_Int n, HYPRE_Int *rows, HYPRE_Int *cols, HYPRE_Complex *coeffs ); HYPRE_Int hypre_IJMatrixInsertRowPETSc ( hypre_IJMatrix *matrix, HYPRE_Int n, HYPRE_BigInt row, HYPRE_BigInt *indices, HYPRE_Complex *coeffs ); HYPRE_Int hypre_IJMatrixAddToRowPETSc ( hypre_IJMatrix *matrix, HYPRE_Int n, HYPRE_BigInt row, HYPRE_BigInt *indices, HYPRE_Complex *coeffs ); HYPRE_Int hypre_IJMatrixAssemblePETSc ( hypre_IJMatrix *matrix ); HYPRE_Int hypre_IJMatrixDistributePETSc ( hypre_IJMatrix *matrix, HYPRE_BigInt *row_starts, HYPRE_BigInt *col_starts ); HYPRE_Int hypre_IJMatrixApplyPETSc ( hypre_IJMatrix *matrix, hypre_ParVector *x, hypre_ParVector *b ); HYPRE_Int hypre_IJMatrixDestroyPETSc ( hypre_IJMatrix *matrix ); HYPRE_Int hypre_IJMatrixSetTotalSizePETSc ( hypre_IJMatrix *matrix, HYPRE_Int size ); /* IJVector.c */ HYPRE_Int hypre_IJVectorDistribute ( HYPRE_IJVector vector, const HYPRE_Int *vec_starts ); HYPRE_Int hypre_IJVectorZeroValues ( HYPRE_IJVector vector ); HYPRE_Int hypre_IJVectorReadBinary ( MPI_Comm comm, const char *filename, HYPRE_Int type, HYPRE_IJVector *vector_ptr ); /* IJVector_parcsr.c */ HYPRE_Int hypre_IJVectorCreatePar ( hypre_IJVector *vector, HYPRE_BigInt *IJpartitioning ); HYPRE_Int hypre_IJVectorDestroyPar ( hypre_IJVector *vector ); HYPRE_Int hypre_IJVectorInitializeParShell (hypre_IJVector *vector ); HYPRE_Int hypre_IJVectorSetParData( hypre_IJVector *vector, HYPRE_Complex *data ); HYPRE_Int hypre_IJVectorInitializePar ( hypre_IJVector *vector ); HYPRE_Int hypre_IJVectorInitializePar_v2(hypre_IJVector *vector, HYPRE_MemoryLocation memory_location); HYPRE_Int hypre_IJVectorSetMaxOffProcElmtsPar ( hypre_IJVector *vector, HYPRE_Int max_off_proc_elmts ); HYPRE_Int hypre_IJVectorDistributePar ( hypre_IJVector *vector, const HYPRE_Int *vec_starts ); HYPRE_Int hypre_IJVectorZeroValuesPar ( hypre_IJVector *vector ); HYPRE_Int hypre_IJVectorSetComponentPar ( hypre_IJVector *vector, HYPRE_Int component); HYPRE_Int hypre_IJVectorSetValuesPar ( hypre_IJVector *vector, HYPRE_Int num_values, const HYPRE_BigInt *indices, const HYPRE_Complex *values ); HYPRE_Int hypre_IJVectorSetConstantValuesPar ( hypre_IJVector *vector, HYPRE_Complex value ); HYPRE_Int hypre_IJVectorAddToValuesPar ( hypre_IJVector *vector, HYPRE_Int num_values, const HYPRE_BigInt *indices, const HYPRE_Complex *values ); HYPRE_Int hypre_IJVectorAssemblePar ( hypre_IJVector *vector ); HYPRE_Int hypre_IJVectorGetValuesPar ( hypre_IJVector *vector, HYPRE_Int num_values, const HYPRE_BigInt *indices, HYPRE_Complex *values ); HYPRE_Int hypre_IJVectorAssembleOffProcValsPar ( hypre_IJVector *vector, HYPRE_Int max_off_proc_elmts, HYPRE_Int current_num_elmts, HYPRE_MemoryLocation memory_location, HYPRE_BigInt *off_proc_i, HYPRE_Complex *off_proc_data ); HYPRE_Int hypre_IJVectorSetAddValuesParDevice(hypre_IJVector *vector, HYPRE_Int num_values, const HYPRE_BigInt *indices, const HYPRE_Complex *values, const char *action); HYPRE_Int hypre_IJVectorAssembleParDevice(hypre_IJVector *vector); HYPRE_Int hypre_IJVectorUpdateValuesDevice( hypre_IJVector *vector, HYPRE_Int num_values, const HYPRE_BigInt *indices, const HYPRE_Complex *values, HYPRE_Int action); HYPRE_Int hypre_IJVectorMigrateParCSR(hypre_IJVector *vector, HYPRE_MemoryLocation memory_location); /* HYPRE_IJMatrix.c */ HYPRE_Int HYPRE_IJMatrixCreate ( MPI_Comm comm, HYPRE_BigInt ilower, HYPRE_BigInt iupper, HYPRE_BigInt jlower, HYPRE_BigInt jupper, HYPRE_IJMatrix *matrix ); HYPRE_Int HYPRE_IJMatrixPartialClone ( HYPRE_IJMatrix matrix_in, HYPRE_IJMatrix *matrix_out ); HYPRE_Int HYPRE_IJMatrixDestroy ( HYPRE_IJMatrix matrix ); HYPRE_Int HYPRE_IJMatrixInitialize ( HYPRE_IJMatrix matrix ); HYPRE_Int HYPRE_IJMatrixSetPrintLevel ( HYPRE_IJMatrix matrix, HYPRE_Int print_level ); HYPRE_Int HYPRE_IJMatrixSetValues ( HYPRE_IJMatrix matrix, HYPRE_Int nrows, HYPRE_Int *ncols, const HYPRE_BigInt *rows, const HYPRE_BigInt *cols, const HYPRE_Complex *values ); HYPRE_Int HYPRE_IJMatrixSetConstantValues ( HYPRE_IJMatrix matrix, HYPRE_Complex value ); HYPRE_Int HYPRE_IJMatrixAddToValues ( HYPRE_IJMatrix matrix, HYPRE_Int nrows, HYPRE_Int *ncols, const HYPRE_BigInt *rows, const HYPRE_BigInt *cols, const HYPRE_Complex *values ); HYPRE_Int HYPRE_IJMatrixAssemble ( HYPRE_IJMatrix matrix ); HYPRE_Int HYPRE_IJMatrixGetRowCounts ( HYPRE_IJMatrix matrix, HYPRE_Int nrows, HYPRE_BigInt *rows, HYPRE_Int *ncols ); HYPRE_Int HYPRE_IJMatrixGetValues ( HYPRE_IJMatrix matrix, HYPRE_Int nrows, HYPRE_Int *ncols, HYPRE_BigInt *rows, HYPRE_BigInt *cols, HYPRE_Complex *values ); HYPRE_Int HYPRE_IJMatrixSetObjectType ( HYPRE_IJMatrix matrix, HYPRE_Int type ); HYPRE_Int HYPRE_IJMatrixGetObjectType ( HYPRE_IJMatrix matrix, HYPRE_Int *type ); HYPRE_Int HYPRE_IJMatrixGetLocalRange ( HYPRE_IJMatrix matrix, HYPRE_BigInt *ilower, HYPRE_BigInt *iupper, HYPRE_BigInt *jlower, HYPRE_BigInt *jupper ); HYPRE_Int HYPRE_IJMatrixGetObject ( HYPRE_IJMatrix matrix, void **object ); HYPRE_Int HYPRE_IJMatrixSetRowSizes ( HYPRE_IJMatrix matrix, const HYPRE_Int *sizes ); HYPRE_Int HYPRE_IJMatrixSetDiagOffdSizes ( HYPRE_IJMatrix matrix, const HYPRE_Int *diag_sizes, const HYPRE_Int *offdiag_sizes ); HYPRE_Int HYPRE_IJMatrixSetMaxOffProcElmts ( HYPRE_IJMatrix matrix, HYPRE_Int max_off_proc_elmts ); HYPRE_Int HYPRE_IJMatrixRead ( const char *filename, MPI_Comm comm, HYPRE_Int type, HYPRE_IJMatrix *matrix_ptr ); HYPRE_Int HYPRE_IJMatrixReadBinary ( const char *filename, MPI_Comm comm, HYPRE_Int type, HYPRE_IJMatrix *matrix_ptr ); HYPRE_Int HYPRE_IJMatrixReadMM( const char *filename, MPI_Comm comm, HYPRE_Int type, HYPRE_IJMatrix *matrix_ptr ); HYPRE_Int HYPRE_IJMatrixPrint ( HYPRE_IJMatrix matrix, const char *filename ); HYPRE_Int HYPRE_IJMatrixPrintBinary ( HYPRE_IJMatrix matrix, const char *filename ); HYPRE_Int HYPRE_IJMatrixSetOMPFlag ( HYPRE_IJMatrix matrix, HYPRE_Int omp_flag ); HYPRE_Int HYPRE_IJMatrixTranspose ( HYPRE_IJMatrix matrix_A, HYPRE_IJMatrix *matrix_AT ); HYPRE_Int HYPRE_IJMatrixNorm ( HYPRE_IJMatrix matrix, HYPRE_Real *norm ); HYPRE_Int HYPRE_IJMatrixAdd ( HYPRE_Complex alpha, HYPRE_IJMatrix matrix_A, HYPRE_Complex beta, HYPRE_IJMatrix matrix_B, HYPRE_IJMatrix *matrix_C ); /* HYPRE_IJVector.c */ HYPRE_Int HYPRE_IJVectorCreate ( MPI_Comm comm, HYPRE_BigInt jlower, HYPRE_BigInt jupper, HYPRE_IJVector *vector ); HYPRE_Int HYPRE_IJVectorSetNumComponents ( HYPRE_IJVector vector, HYPRE_Int num_components ); HYPRE_Int HYPRE_IJVectorSetComponent ( HYPRE_IJVector vector, HYPRE_Int component ); HYPRE_Int HYPRE_IJVectorDestroy ( HYPRE_IJVector vector ); HYPRE_Int HYPRE_IJVectorInitialize ( HYPRE_IJVector vector ); HYPRE_Int HYPRE_IJVectorSetPrintLevel ( HYPRE_IJVector vector, HYPRE_Int print_level ); HYPRE_Int HYPRE_IJVectorSetValues ( HYPRE_IJVector vector, HYPRE_Int nvalues, const HYPRE_BigInt *indices, const HYPRE_Complex *values ); HYPRE_Int HYPRE_IJVectorSetConstantValues ( HYPRE_IJVector vector, HYPRE_Complex value ); HYPRE_Int HYPRE_IJVectorAddToValues ( HYPRE_IJVector vector, HYPRE_Int nvalues, const HYPRE_BigInt *indices, const HYPRE_Complex *values ); HYPRE_Int HYPRE_IJVectorAssemble ( HYPRE_IJVector vector ); HYPRE_Int HYPRE_IJVectorGetValues ( HYPRE_IJVector vector, HYPRE_Int nvalues, const HYPRE_BigInt *indices, HYPRE_Complex *values ); HYPRE_Int HYPRE_IJVectorSetMaxOffProcElmts ( HYPRE_IJVector vector, HYPRE_Int max_off_proc_elmts ); HYPRE_Int HYPRE_IJVectorSetObjectType ( HYPRE_IJVector vector, HYPRE_Int type ); HYPRE_Int HYPRE_IJVectorGetObjectType ( HYPRE_IJVector vector, HYPRE_Int *type ); HYPRE_Int HYPRE_IJVectorGetLocalRange ( HYPRE_IJVector vector, HYPRE_BigInt *jlower, HYPRE_BigInt *jupper ); HYPRE_Int HYPRE_IJVectorGetObject ( HYPRE_IJVector vector, void **object ); HYPRE_Int HYPRE_IJVectorRead ( const char *filename, MPI_Comm comm, HYPRE_Int type, HYPRE_IJVector *vector_ptr ); HYPRE_Int HYPRE_IJVectorReadBinary ( const char *filename, MPI_Comm comm, HYPRE_Int type, HYPRE_IJVector *vector_ptr ); HYPRE_Int HYPRE_IJVectorPrint ( HYPRE_IJVector vector, const char *filename ); HYPRE_Int HYPRE_IJVectorPrintBinary ( HYPRE_IJVector vector, const char *filename ); HYPRE_Int HYPRE_IJVectorInnerProd ( HYPRE_IJVector x, HYPRE_IJVector y, HYPRE_Real *prod ); #ifdef __cplusplus } #endif #endif hypre-2.33.0/src/IJ_mv/aux_par_vector.c000066400000000000000000000100231477326011500177100ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * Member functions for hypre_AuxParVector class. * *****************************************************************************/ #include "_hypre_IJ_mv.h" #include "aux_par_vector.h" /*-------------------------------------------------------------------------- * hypre_AuxParVectorCreate *--------------------------------------------------------------------------*/ HYPRE_Int hypre_AuxParVectorCreate( hypre_AuxParVector **aux_vector_ptr) { hypre_AuxParVector *aux_vector; aux_vector = hypre_CTAlloc(hypre_AuxParVector, 1, HYPRE_MEMORY_HOST); /* set defaults */ hypre_AuxParVectorMaxOffProcElmts(aux_vector) = 0; hypre_AuxParVectorCurrentOffProcElmts(aux_vector) = 0; /* stash for setting or adding off processor values */ hypre_AuxParVectorOffProcI(aux_vector) = NULL; hypre_AuxParVectorOffProcData(aux_vector) = NULL; hypre_AuxParVectorMemoryLocation(aux_vector) = HYPRE_MEMORY_HOST; #if defined(HYPRE_USING_GPU) hypre_AuxParVectorMaxStackElmts(aux_vector) = 0; hypre_AuxParVectorCurrentStackElmts(aux_vector) = 0; hypre_AuxParVectorStackI(aux_vector) = NULL; hypre_AuxParVectorStackVoff(aux_vector) = NULL; hypre_AuxParVectorStackData(aux_vector) = NULL; hypre_AuxParVectorStackSorA(aux_vector) = NULL; hypre_AuxParVectorUsrOffProcElmts(aux_vector) = -1; hypre_AuxParVectorInitAllocFactor(aux_vector) = 1.5; hypre_AuxParVectorGrowFactor(aux_vector) = 2.0; #endif *aux_vector_ptr = aux_vector; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_AuxParVectorDestroy *--------------------------------------------------------------------------*/ HYPRE_Int hypre_AuxParVectorDestroy( hypre_AuxParVector *aux_vector ) { if (aux_vector) { hypre_TFree(hypre_AuxParVectorOffProcI(aux_vector), HYPRE_MEMORY_HOST); hypre_TFree(hypre_AuxParVectorOffProcData(aux_vector), HYPRE_MEMORY_HOST); #if defined(HYPRE_USING_GPU) HYPRE_MemoryLocation memory_location = hypre_AuxParVectorMemoryLocation(aux_vector); hypre_TFree(hypre_AuxParVectorStackI(aux_vector), memory_location); hypre_TFree(hypre_AuxParVectorStackVoff(aux_vector), memory_location); hypre_TFree(hypre_AuxParVectorStackData(aux_vector), memory_location); hypre_TFree(hypre_AuxParVectorStackSorA(aux_vector), memory_location); #endif hypre_TFree(aux_vector, HYPRE_MEMORY_HOST); } return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_AuxParVectorInitialize_v2 *--------------------------------------------------------------------------*/ HYPRE_Int hypre_AuxParVectorInitialize_v2( hypre_AuxParVector *aux_vector, HYPRE_MemoryLocation memory_location ) { hypre_AuxParVectorMemoryLocation(aux_vector) = memory_location; if (memory_location == HYPRE_MEMORY_HOST) { /* CPU assembly */ /* allocate stash for setting or adding off processor values */ HYPRE_Int max_off_proc_elmts = hypre_AuxParVectorMaxOffProcElmts(aux_vector); if (max_off_proc_elmts > 0) { hypre_AuxParVectorOffProcI(aux_vector) = hypre_CTAlloc(HYPRE_BigInt, max_off_proc_elmts, HYPRE_MEMORY_HOST); hypre_AuxParVectorOffProcData(aux_vector) = hypre_CTAlloc(HYPRE_Complex, max_off_proc_elmts, HYPRE_MEMORY_HOST); } } return hypre_error_flag; } hypre-2.33.0/src/IJ_mv/aux_par_vector.h000066400000000000000000000067571477326011500177400ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * Header info for Auxiliary Parallel Vector data structures * * Note: this vector currently uses 0-based indexing. * *****************************************************************************/ #ifndef hypre_AUX_PAR_VECTOR_HEADER #define hypre_AUX_PAR_VECTOR_HEADER /*-------------------------------------------------------------------------- * Auxiliary Parallel Vector *--------------------------------------------------------------------------*/ typedef struct { HYPRE_Int max_off_proc_elmts; /* length of off processor stash for SetValues and AddToValues*/ HYPRE_Int current_off_proc_elmts; /* current no. of elements stored in stash */ HYPRE_BigInt *off_proc_i; /* contains column indices */ HYPRE_Complex *off_proc_data; /* contains corresponding data */ HYPRE_MemoryLocation memory_location; #if defined(HYPRE_USING_GPU) HYPRE_Int max_stack_elmts; /* length of stash for SetValues and AddToValues*/ HYPRE_Int current_stack_elmts; /* current no. of elements stored in stash */ HYPRE_BigInt *stack_i; /* contains row indices */ HYPRE_BigInt *stack_voff; /* contains vector offsets for multivectors */ HYPRE_Complex *stack_data; /* contains corresponding data */ char *stack_sora; HYPRE_Int usr_off_proc_elmts; /* the num of off-proc elements usr guided */ HYPRE_Real init_alloc_factor; HYPRE_Real grow_factor; #endif } hypre_AuxParVector; /*-------------------------------------------------------------------------- * Accessor functions for the Parallel Vector structure *--------------------------------------------------------------------------*/ #define hypre_AuxParVectorMaxOffProcElmts(vector) ((vector) -> max_off_proc_elmts) #define hypre_AuxParVectorCurrentOffProcElmts(vector) ((vector) -> current_off_proc_elmts) #define hypre_AuxParVectorOffProcI(vector) ((vector) -> off_proc_i) #define hypre_AuxParVectorOffProcData(vector) ((vector) -> off_proc_data) #define hypre_AuxParVectorMemoryLocation(vector) ((vector) -> memory_location) #if defined(HYPRE_USING_GPU) #define hypre_AuxParVectorMaxStackElmts(vector) ((vector) -> max_stack_elmts) #define hypre_AuxParVectorCurrentStackElmts(vector) ((vector) -> current_stack_elmts) #define hypre_AuxParVectorStackI(vector) ((vector) -> stack_i) #define hypre_AuxParVectorStackVoff(vector) ((vector) -> stack_voff) #define hypre_AuxParVectorStackData(vector) ((vector) -> stack_data) #define hypre_AuxParVectorStackSorA(vector) ((vector) -> stack_sora) #define hypre_AuxParVectorUsrOffProcElmts(vector) ((vector) -> usr_off_proc_elmts) #define hypre_AuxParVectorInitAllocFactor(vector) ((vector) -> init_alloc_factor) #define hypre_AuxParVectorGrowFactor(vector) ((vector) -> grow_factor) #endif #endif /* #ifndef hypre_AUX_PAR_VECTOR_HEADER */ hypre-2.33.0/src/IJ_mv/aux_parcsr_matrix.c000066400000000000000000000330641477326011500204340ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * Member functions for hypre_AuxParCSRMatrix class. * *****************************************************************************/ #include "_hypre_IJ_mv.h" #include "aux_parcsr_matrix.h" /*-------------------------------------------------------------------------- * hypre_AuxParCSRMatrixCreate *--------------------------------------------------------------------------*/ HYPRE_Int hypre_AuxParCSRMatrixCreate( hypre_AuxParCSRMatrix **aux_matrix, HYPRE_Int local_num_rows, HYPRE_Int local_num_cols, HYPRE_Int *sizes ) { hypre_AuxParCSRMatrix *matrix; matrix = hypre_CTAlloc(hypre_AuxParCSRMatrix, 1, HYPRE_MEMORY_HOST); hypre_AuxParCSRMatrixLocalNumRows(matrix) = local_num_rows; hypre_AuxParCSRMatrixLocalNumRownnz(matrix) = local_num_rows; hypre_AuxParCSRMatrixLocalNumCols(matrix) = local_num_cols; hypre_AuxParCSRMatrixRowSpace(matrix) = sizes; /* set defaults */ hypre_AuxParCSRMatrixNeedAux(matrix) = 1; hypre_AuxParCSRMatrixMaxOffProcElmts(matrix) = 0; hypre_AuxParCSRMatrixCurrentOffProcElmts(matrix) = 0; hypre_AuxParCSRMatrixOffProcIIndx(matrix) = 0; hypre_AuxParCSRMatrixRownnz(matrix) = NULL; hypre_AuxParCSRMatrixRowLength(matrix) = NULL; hypre_AuxParCSRMatrixAuxJ(matrix) = NULL; hypre_AuxParCSRMatrixAuxData(matrix) = NULL; hypre_AuxParCSRMatrixIndxDiag(matrix) = NULL; hypre_AuxParCSRMatrixIndxOffd(matrix) = NULL; hypre_AuxParCSRMatrixDiagSizes(matrix) = NULL; hypre_AuxParCSRMatrixOffdSizes(matrix) = NULL; /* stash for setting or adding on/off-proc values */ hypre_AuxParCSRMatrixOffProcI(matrix) = NULL; hypre_AuxParCSRMatrixOffProcJ(matrix) = NULL; hypre_AuxParCSRMatrixOffProcData(matrix) = NULL; hypre_AuxParCSRMatrixMemoryLocation(matrix) = HYPRE_MEMORY_HOST; #if defined(HYPRE_USING_GPU) hypre_AuxParCSRMatrixMaxStackElmts(matrix) = 0; hypre_AuxParCSRMatrixCurrentStackElmts(matrix) = 0; hypre_AuxParCSRMatrixStackI(matrix) = NULL; hypre_AuxParCSRMatrixStackJ(matrix) = NULL; hypre_AuxParCSRMatrixStackData(matrix) = NULL; hypre_AuxParCSRMatrixStackSorA(matrix) = NULL; hypre_AuxParCSRMatrixUsrOnProcElmts(matrix) = -1; hypre_AuxParCSRMatrixUsrOffProcElmts(matrix) = -1; hypre_AuxParCSRMatrixInitAllocFactor(matrix) = 0; hypre_AuxParCSRMatrixEarlyAssemble(matrix) = 0; hypre_AuxParCSRMatrixGrowFactor(matrix) = 2.0; #endif *aux_matrix = matrix; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_AuxParCSRMatrixDestroy *--------------------------------------------------------------------------*/ HYPRE_Int hypre_AuxParCSRMatrixDestroy( hypre_AuxParCSRMatrix *matrix ) { HYPRE_Int num_rownnz; HYPRE_Int num_rows; HYPRE_Int *rownnz; HYPRE_Int i; if (matrix) { rownnz = hypre_AuxParCSRMatrixRownnz(matrix); num_rownnz = hypre_AuxParCSRMatrixLocalNumRownnz(matrix); num_rows = hypre_AuxParCSRMatrixLocalNumRows(matrix); if (hypre_AuxParCSRMatrixAuxJ(matrix)) { if (hypre_AuxParCSRMatrixRownnz(matrix)) { for (i = 0; i < num_rownnz; i++) { hypre_TFree(hypre_AuxParCSRMatrixAuxJ(matrix)[rownnz[i]], HYPRE_MEMORY_HOST); } } else { for (i = 0; i < num_rows; i++) { hypre_TFree(hypre_AuxParCSRMatrixAuxJ(matrix)[i], HYPRE_MEMORY_HOST); } } hypre_TFree(hypre_AuxParCSRMatrixAuxJ(matrix), HYPRE_MEMORY_HOST); } if (hypre_AuxParCSRMatrixAuxData(matrix)) { if (hypre_AuxParCSRMatrixRownnz(matrix)) { for (i = 0; i < num_rownnz; i++) { hypre_TFree(hypre_AuxParCSRMatrixAuxData(matrix)[rownnz[i]], HYPRE_MEMORY_HOST); } hypre_TFree(hypre_AuxParCSRMatrixAuxData(matrix), HYPRE_MEMORY_HOST); } else { for (i = 0; i < num_rows; i++) { hypre_TFree(hypre_AuxParCSRMatrixAuxData(matrix)[i], HYPRE_MEMORY_HOST); } hypre_TFree(hypre_AuxParCSRMatrixAuxData(matrix), HYPRE_MEMORY_HOST); } } hypre_TFree(hypre_AuxParCSRMatrixRownnz(matrix), HYPRE_MEMORY_HOST); hypre_TFree(hypre_AuxParCSRMatrixRowLength(matrix), HYPRE_MEMORY_HOST); hypre_TFree(hypre_AuxParCSRMatrixRowSpace(matrix), HYPRE_MEMORY_HOST); hypre_TFree(hypre_AuxParCSRMatrixIndxDiag(matrix), HYPRE_MEMORY_HOST); hypre_TFree(hypre_AuxParCSRMatrixIndxOffd(matrix), HYPRE_MEMORY_HOST); hypre_TFree(hypre_AuxParCSRMatrixDiagSizes(matrix), HYPRE_MEMORY_HOST); hypre_TFree(hypre_AuxParCSRMatrixOffdSizes(matrix), HYPRE_MEMORY_HOST); hypre_TFree(hypre_AuxParCSRMatrixOffProcI(matrix), HYPRE_MEMORY_HOST); hypre_TFree(hypre_AuxParCSRMatrixOffProcJ(matrix), HYPRE_MEMORY_HOST); hypre_TFree(hypre_AuxParCSRMatrixOffProcData(matrix), HYPRE_MEMORY_HOST); #if defined(HYPRE_USING_GPU) hypre_TFree(hypre_AuxParCSRMatrixStackI(matrix), hypre_AuxParCSRMatrixMemoryLocation(matrix)); hypre_TFree(hypre_AuxParCSRMatrixStackJ(matrix), hypre_AuxParCSRMatrixMemoryLocation(matrix)); hypre_TFree(hypre_AuxParCSRMatrixStackData(matrix), hypre_AuxParCSRMatrixMemoryLocation(matrix)); hypre_TFree(hypre_AuxParCSRMatrixStackSorA(matrix), hypre_AuxParCSRMatrixMemoryLocation(matrix)); #endif hypre_TFree(matrix, HYPRE_MEMORY_HOST); } return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_AuxParCSRMatrixSetRownnz *--------------------------------------------------------------------------*/ HYPRE_Int hypre_AuxParCSRMatrixSetRownnz( hypre_AuxParCSRMatrix *matrix ) { HYPRE_Int local_num_rows = hypre_AuxParCSRMatrixLocalNumRows(matrix); HYPRE_Int *row_space = hypre_AuxParCSRMatrixRowSpace(matrix); HYPRE_Int num_rownnz_old = hypre_AuxParCSRMatrixLocalNumRownnz(matrix); HYPRE_Int *rownnz_old = hypre_AuxParCSRMatrixRownnz(matrix); HYPRE_Int *rownnz; HYPRE_Int i, ii, local_num_rownnz; /* Count number of nonzero rows */ local_num_rownnz = 0; #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i) reduction(+:local_num_rownnz) HYPRE_SMP_SCHEDULE #endif for (i = 0; i < local_num_rows; i++) { if (row_space[i] > 0) { local_num_rownnz++; } } if (local_num_rownnz != local_num_rows) { rownnz = hypre_CTAlloc(HYPRE_Int, local_num_rownnz, HYPRE_MEMORY_HOST); /* Find nonzero rows */ local_num_rownnz = 0; for (i = 0; i < local_num_rows; i++) { if (row_space[i] > 0) { rownnz[local_num_rownnz++] = i; } } /* Free memory if necessary */ if (rownnz_old && rownnz && (local_num_rownnz < num_rownnz_old)) { ii = 0; for (i = 0; i < num_rownnz_old; i++) { if (rownnz_old[i] == rownnz[ii]) { ii++; } else { hypre_TFree(hypre_AuxParCSRMatrixAuxJ(matrix)[rownnz_old[i]], HYPRE_MEMORY_HOST); hypre_TFree(hypre_AuxParCSRMatrixAuxData(matrix)[rownnz_old[i]], HYPRE_MEMORY_HOST); } if (ii == local_num_rownnz) { i = i + 1; for (; i < num_rownnz_old; i++) { hypre_TFree(hypre_AuxParCSRMatrixAuxJ(matrix)[rownnz_old[i]], HYPRE_MEMORY_HOST); hypre_TFree(hypre_AuxParCSRMatrixAuxData(matrix)[rownnz_old[i]], HYPRE_MEMORY_HOST); } break; } } } hypre_TFree(rownnz_old, HYPRE_MEMORY_HOST); hypre_AuxParCSRMatrixLocalNumRownnz(matrix) = local_num_rownnz; hypre_AuxParCSRMatrixRownnz(matrix) = rownnz; } else { hypre_TFree(rownnz_old, HYPRE_MEMORY_HOST); hypre_AuxParCSRMatrixLocalNumRownnz(matrix) = local_num_rows; hypre_AuxParCSRMatrixRownnz(matrix) = NULL; } return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_AuxParCSRMatrixInitialize_v2 *--------------------------------------------------------------------------*/ HYPRE_Int hypre_AuxParCSRMatrixInitialize_v2( hypre_AuxParCSRMatrix *matrix, HYPRE_MemoryLocation memory_location ) { HYPRE_Int local_num_rows = hypre_AuxParCSRMatrixLocalNumRows(matrix); HYPRE_Int max_off_proc_elmts = hypre_AuxParCSRMatrixMaxOffProcElmts(matrix); hypre_AuxParCSRMatrixMemoryLocation(matrix) = memory_location; if (local_num_rows < 0) { return -1; } if (local_num_rows == 0) { return 0; } #if defined(HYPRE_USING_GPU) if (memory_location != HYPRE_MEMORY_HOST) { /* GPU assembly */ hypre_AuxParCSRMatrixNeedAux(matrix) = 1; } else #endif { /* CPU assembly */ /* allocate stash for setting or adding off processor values */ if (max_off_proc_elmts > 0) { hypre_AuxParCSRMatrixOffProcI(matrix) = hypre_CTAlloc(HYPRE_BigInt, 2 * max_off_proc_elmts, HYPRE_MEMORY_HOST); hypre_AuxParCSRMatrixOffProcJ(matrix) = hypre_CTAlloc(HYPRE_BigInt, max_off_proc_elmts, HYPRE_MEMORY_HOST); hypre_AuxParCSRMatrixOffProcData(matrix) = hypre_CTAlloc(HYPRE_Complex, max_off_proc_elmts, HYPRE_MEMORY_HOST); } if (hypre_AuxParCSRMatrixNeedAux(matrix)) { HYPRE_Int *row_space = hypre_AuxParCSRMatrixRowSpace(matrix); HYPRE_Int *rownnz = hypre_AuxParCSRMatrixRownnz(matrix); HYPRE_BigInt **aux_j = hypre_CTAlloc(HYPRE_BigInt *, local_num_rows, HYPRE_MEMORY_HOST); HYPRE_Complex **aux_data = hypre_CTAlloc(HYPRE_Complex *, local_num_rows, HYPRE_MEMORY_HOST); HYPRE_Int local_num_rownnz; HYPRE_Int i, ii; if (row_space) { /* Count number of nonzero rows */ local_num_rownnz = 0; for (i = 0; i < local_num_rows; i++) { if (row_space[i] > 0) { local_num_rownnz++; } } if (local_num_rownnz != local_num_rows) { rownnz = hypre_CTAlloc(HYPRE_Int, local_num_rownnz, HYPRE_MEMORY_HOST); /* Find nonzero rows */ local_num_rownnz = 0; for (i = 0; i < local_num_rows; i++) { if (row_space[i] > 0) { rownnz[local_num_rownnz++] = i; } } hypre_AuxParCSRMatrixLocalNumRownnz(matrix) = local_num_rownnz; hypre_AuxParCSRMatrixRownnz(matrix) = rownnz; } } if (!hypre_AuxParCSRMatrixRowLength(matrix)) { hypre_AuxParCSRMatrixRowLength(matrix) = hypre_CTAlloc(HYPRE_Int, local_num_rows, HYPRE_MEMORY_HOST); } if (row_space) { if (local_num_rownnz != local_num_rows) { for (i = 0; i < local_num_rownnz; i++) { ii = rownnz[i]; aux_j[ii] = hypre_CTAlloc(HYPRE_BigInt, row_space[ii], HYPRE_MEMORY_HOST); aux_data[ii] = hypre_CTAlloc(HYPRE_Complex, row_space[ii], HYPRE_MEMORY_HOST); } } else { for (i = 0; i < local_num_rows; i++) { aux_j[i] = hypre_CTAlloc(HYPRE_BigInt, row_space[i], HYPRE_MEMORY_HOST); aux_data[i] = hypre_CTAlloc(HYPRE_Complex, row_space[i], HYPRE_MEMORY_HOST); } } } else { row_space = hypre_CTAlloc(HYPRE_Int, local_num_rows, HYPRE_MEMORY_HOST); for (i = 0; i < local_num_rows; i++) { row_space[i] = 30; aux_j[i] = hypre_CTAlloc(HYPRE_BigInt, row_space[i], HYPRE_MEMORY_HOST); aux_data[i] = hypre_CTAlloc(HYPRE_Complex, row_space[i], HYPRE_MEMORY_HOST); } hypre_AuxParCSRMatrixRowSpace(matrix) = row_space; } hypre_AuxParCSRMatrixAuxJ(matrix) = aux_j; hypre_AuxParCSRMatrixAuxData(matrix) = aux_data; } else { hypre_AuxParCSRMatrixIndxDiag(matrix) = hypre_CTAlloc(HYPRE_Int, local_num_rows, HYPRE_MEMORY_HOST); hypre_AuxParCSRMatrixIndxOffd(matrix) = hypre_CTAlloc(HYPRE_Int, local_num_rows, HYPRE_MEMORY_HOST); } } return hypre_error_flag; } HYPRE_Int hypre_AuxParCSRMatrixInitialize(hypre_AuxParCSRMatrix *matrix) { if (matrix) { return hypre_AuxParCSRMatrixInitialize_v2(matrix, hypre_AuxParCSRMatrixMemoryLocation(matrix)); } return -2; } hypre-2.33.0/src/IJ_mv/aux_parcsr_matrix.h000066400000000000000000000166161477326011500204450ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * Header info for Auxiliary Parallel CSR Matrix data structures * * Note: this matrix currently uses 0-based indexing. * *****************************************************************************/ #ifndef hypre_AUX_PARCSR_MATRIX_HEADER #define hypre_AUX_PARCSR_MATRIX_HEADER /*-------------------------------------------------------------------------- * Auxiliary Parallel CSR Matrix *--------------------------------------------------------------------------*/ typedef struct { HYPRE_Int local_num_rows; /* defines number of rows on this processor */ HYPRE_Int local_num_rownnz; /* defines number of nonzero rows on this processor */ HYPRE_Int local_num_cols; /* defines number of cols of diag */ HYPRE_Int need_aux; /* if need_aux = 1, aux_j, aux_data are used to generate the parcsr matrix (default), for need_aux = 0, data is put directly into parcsr structure (requires the knowledge of offd_i and diag_i ) */ HYPRE_Int *rownnz; /* row_nnz[i] contains the i-th nonzero row id */ HYPRE_Int *row_length; /* row_length[i] contains number of stored elements in i-th row */ HYPRE_Int *row_space; /* row_space[i] contains space allocated to i-th row */ HYPRE_Int *diag_sizes; /* user input row lengths of diag */ HYPRE_Int *offd_sizes; /* user input row lengths of diag */ HYPRE_BigInt **aux_j; /* contains collected column indices */ HYPRE_Complex **aux_data; /* contains collected data */ HYPRE_Int *indx_diag; /* indx_diag[i] points to first empty space of portion in diag_j , diag_data assigned to row i */ HYPRE_Int *indx_offd; /* indx_offd[i] points to first empty space of portion in offd_j , offd_data assigned to row i */ HYPRE_Int max_off_proc_elmts; /* length of off processor stash set for SetValues and AddTOValues */ HYPRE_Int current_off_proc_elmts; /* current no. of elements stored in stash */ HYPRE_Int off_proc_i_indx; /* pointer to first empty space in set_off_proc_i_set */ HYPRE_BigInt *off_proc_i; /* length 2*num_off_procs_elmts, contains info pairs (code, no. of elmts) where code contains global row no. if SetValues, and (-global row no. -1) if AddToValues */ HYPRE_BigInt *off_proc_j; /* contains column indices * ( global col id.) if SetValues, * (-global col id. -1) if AddToValues */ HYPRE_Complex *off_proc_data; /* contains corresponding data */ HYPRE_MemoryLocation memory_location; #if defined(HYPRE_USING_GPU) HYPRE_BigInt max_stack_elmts; HYPRE_BigInt current_stack_elmts; HYPRE_BigInt *stack_i; HYPRE_BigInt *stack_j; HYPRE_Complex *stack_data; char *stack_sora; /* Set (1) or Add (0) */ HYPRE_Int usr_on_proc_elmts; /* user given num elmt on-proc */ HYPRE_Int usr_off_proc_elmts; /* user given num elmt off-proc */ HYPRE_Int early_assemble; HYPRE_Int init_alloc_factor; HYPRE_Real grow_factor; #endif } hypre_AuxParCSRMatrix; /*-------------------------------------------------------------------------- * Accessor functions for the Parallel CSR Matrix structure *--------------------------------------------------------------------------*/ #define hypre_AuxParCSRMatrixLocalNumRows(matrix) ((matrix) -> local_num_rows) #define hypre_AuxParCSRMatrixLocalNumRownnz(matrix) ((matrix) -> local_num_rownnz) #define hypre_AuxParCSRMatrixLocalNumCols(matrix) ((matrix) -> local_num_cols) #define hypre_AuxParCSRMatrixNeedAux(matrix) ((matrix) -> need_aux) #define hypre_AuxParCSRMatrixRownnz(matrix) ((matrix) -> rownnz) #define hypre_AuxParCSRMatrixRowLength(matrix) ((matrix) -> row_length) #define hypre_AuxParCSRMatrixRowSpace(matrix) ((matrix) -> row_space) #define hypre_AuxParCSRMatrixAuxJ(matrix) ((matrix) -> aux_j) #define hypre_AuxParCSRMatrixAuxData(matrix) ((matrix) -> aux_data) #define hypre_AuxParCSRMatrixIndxDiag(matrix) ((matrix) -> indx_diag) #define hypre_AuxParCSRMatrixIndxOffd(matrix) ((matrix) -> indx_offd) #define hypre_AuxParCSRMatrixDiagSizes(matrix) ((matrix) -> diag_sizes) #define hypre_AuxParCSRMatrixOffdSizes(matrix) ((matrix) -> offd_sizes) #define hypre_AuxParCSRMatrixMaxOffProcElmts(matrix) ((matrix) -> max_off_proc_elmts) #define hypre_AuxParCSRMatrixCurrentOffProcElmts(matrix) ((matrix) -> current_off_proc_elmts) #define hypre_AuxParCSRMatrixOffProcIIndx(matrix) ((matrix) -> off_proc_i_indx) #define hypre_AuxParCSRMatrixOffProcI(matrix) ((matrix) -> off_proc_i) #define hypre_AuxParCSRMatrixOffProcJ(matrix) ((matrix) -> off_proc_j) #define hypre_AuxParCSRMatrixOffProcData(matrix) ((matrix) -> off_proc_data) #define hypre_AuxParCSRMatrixMemoryLocation(matrix) ((matrix) -> memory_location) #if defined(HYPRE_USING_GPU) #define hypre_AuxParCSRMatrixMaxStackElmts(matrix) ((matrix) -> max_stack_elmts) #define hypre_AuxParCSRMatrixCurrentStackElmts(matrix) ((matrix) -> current_stack_elmts) #define hypre_AuxParCSRMatrixStackI(matrix) ((matrix) -> stack_i) #define hypre_AuxParCSRMatrixStackJ(matrix) ((matrix) -> stack_j) #define hypre_AuxParCSRMatrixStackData(matrix) ((matrix) -> stack_data) #define hypre_AuxParCSRMatrixStackSorA(matrix) ((matrix) -> stack_sora) #define hypre_AuxParCSRMatrixUsrOnProcElmts(matrix) ((matrix) -> usr_on_proc_elmts) #define hypre_AuxParCSRMatrixUsrOffProcElmts(matrix) ((matrix) -> usr_off_proc_elmts) #define hypre_AuxParCSRMatrixEarlyAssemble(matrix) ((matrix) -> early_assemble) #define hypre_AuxParCSRMatrixInitAllocFactor(matrix) ((matrix) -> init_alloc_factor) #define hypre_AuxParCSRMatrixGrowFactor(matrix) ((matrix) -> grow_factor) #endif #endif /* #ifndef hypre_AUX_PARCSR_MATRIX_HEADER */ hypre-2.33.0/src/IJ_mv/headers000077500000000000000000000030471477326011500160740ustar00rootroot00000000000000#!/bin/bash # Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) INTERNAL_HEADER=_hypre_IJ_mv.h #=========================================================================== # Include guards and other includes #=========================================================================== cat > $INTERNAL_HEADER <<@ /*** DO NOT EDIT THIS FILE DIRECTLY (use 'headers' to generate) ***/ #ifndef hypre_IJ_HEADER #define hypre_IJ_HEADER #include #include "_hypre_parcsr_mv.h" #include "HYPRE_IJ_mv.h" #include "HYPRE.h" #ifdef __cplusplus extern "C" { #endif @ #=========================================================================== # Structures and prototypes #=========================================================================== cat aux_parcsr_matrix.h >> $INTERNAL_HEADER cat aux_par_vector.h >> $INTERNAL_HEADER cat IJ_matrix.h >> $INTERNAL_HEADER cat IJ_vector.h >> $INTERNAL_HEADER cat protos.h >> $INTERNAL_HEADER #../utilities/protos aux_*.c >> $INTERNAL_HEADER #../utilities/protos IJ*.c >> $INTERNAL_HEADER #../utilities/protos HYPRE_IJ*.c >> $INTERNAL_HEADER #=========================================================================== # Include guards #=========================================================================== cat >> $INTERNAL_HEADER <<@ #ifdef __cplusplus } #endif #endif @ hypre-2.33.0/src/IJ_mv/protos.h000066400000000000000000000461211477326011500162320ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /* aux_parcsr_matrix.c */ HYPRE_Int hypre_AuxParCSRMatrixCreate ( hypre_AuxParCSRMatrix **aux_matrix, HYPRE_Int local_num_rows, HYPRE_Int local_num_cols, HYPRE_Int *sizes ); HYPRE_Int hypre_AuxParCSRMatrixDestroy ( hypre_AuxParCSRMatrix *matrix ); HYPRE_Int hypre_AuxParCSRMatrixSetRownnz ( hypre_AuxParCSRMatrix *matrix ); HYPRE_Int hypre_AuxParCSRMatrixInitialize ( hypre_AuxParCSRMatrix *matrix ); HYPRE_Int hypre_AuxParCSRMatrixInitialize_v2( hypre_AuxParCSRMatrix *matrix, HYPRE_MemoryLocation memory_location ); /* aux_par_vector.c */ HYPRE_Int hypre_AuxParVectorCreate ( hypre_AuxParVector **aux_vector ); HYPRE_Int hypre_AuxParVectorDestroy ( hypre_AuxParVector *vector ); HYPRE_Int hypre_AuxParVectorInitialize ( hypre_AuxParVector *vector ); HYPRE_Int hypre_AuxParVectorInitialize_v2( hypre_AuxParVector *vector, HYPRE_MemoryLocation memory_location ); /* IJ_assumed_part.c */ HYPRE_Int hypre_IJMatrixCreateAssumedPartition ( hypre_IJMatrix *matrix ); HYPRE_Int hypre_IJVectorCreateAssumedPartition ( hypre_IJVector *vector ); /* IJMatrix.c */ HYPRE_Int hypre_IJMatrixGetRowPartitioning ( HYPRE_IJMatrix matrix, HYPRE_BigInt **row_partitioning ); HYPRE_Int hypre_IJMatrixGetColPartitioning ( HYPRE_IJMatrix matrix, HYPRE_BigInt **col_partitioning ); HYPRE_Int hypre_IJMatrixSetObject ( HYPRE_IJMatrix matrix, void *object ); HYPRE_Int hypre_IJMatrixRead( const char *filename, MPI_Comm comm, HYPRE_Int type, HYPRE_IJMatrix *matrix_ptr, HYPRE_Int is_mm ); HYPRE_Int hypre_IJMatrixReadBinary( const char *prefixname, MPI_Comm comm, HYPRE_Int type, HYPRE_IJMatrix *matrix_ptr ); /* IJMatrix_isis.c */ HYPRE_Int hypre_IJMatrixSetLocalSizeISIS ( hypre_IJMatrix *matrix, HYPRE_Int local_m, HYPRE_Int local_n ); HYPRE_Int hypre_IJMatrixCreateISIS ( hypre_IJMatrix *matrix ); HYPRE_Int hypre_IJMatrixSetRowSizesISIS ( hypre_IJMatrix *matrix, HYPRE_Int *sizes ); HYPRE_Int hypre_IJMatrixSetDiagRowSizesISIS ( hypre_IJMatrix *matrix, HYPRE_Int *sizes ); HYPRE_Int hypre_IJMatrixSetOffDiagRowSizesISIS ( hypre_IJMatrix *matrix, HYPRE_Int *sizes ); HYPRE_Int hypre_IJMatrixInitializeISIS ( hypre_IJMatrix *matrix ); HYPRE_Int hypre_IJMatrixInsertBlockISIS ( hypre_IJMatrix *matrix, HYPRE_Int m, HYPRE_Int n, HYPRE_Int *rows, HYPRE_Int *cols, HYPRE_Complex *coeffs ); HYPRE_Int hypre_IJMatrixAddToBlockISIS ( hypre_IJMatrix *matrix, HYPRE_Int m, HYPRE_Int n, HYPRE_BigInt *rows, HYPRE_BigInt *cols, HYPRE_Complex *coeffs ); HYPRE_Int hypre_IJMatrixInsertRowISIS ( hypre_IJMatrix *matrix, HYPRE_Int n, HYPRE_BigInt row, HYPRE_BigInt *indices, HYPRE_Complex *coeffs ); HYPRE_Int hypre_IJMatrixAddToRowISIS ( hypre_IJMatrix *matrix, HYPRE_Int n, HYPRE_BigInt row, HYPRE_BigInt *indices, HYPRE_Complex *coeffs ); HYPRE_Int hypre_IJMatrixAssembleISIS ( hypre_IJMatrix *matrix ); HYPRE_Int hypre_IJMatrixDistributeISIS ( hypre_IJMatrix *matrix, HYPRE_BigInt *row_starts, HYPRE_BigInt *col_starts ); HYPRE_Int hypre_IJMatrixApplyISIS ( hypre_IJMatrix *matrix, hypre_ParVector *x, hypre_ParVector *b ); HYPRE_Int hypre_IJMatrixDestroyISIS ( hypre_IJMatrix *matrix ); HYPRE_Int hypre_IJMatrixSetTotalSizeISIS ( hypre_IJMatrix *matrix, HYPRE_Int size ); /* IJMatrix_parcsr.c */ HYPRE_Int hypre_IJMatrixCreateParCSR ( hypre_IJMatrix *matrix ); HYPRE_Int hypre_IJMatrixSetRowSizesParCSR ( hypre_IJMatrix *matrix, const HYPRE_Int *sizes ); HYPRE_Int hypre_IJMatrixSetDiagOffdSizesParCSR ( hypre_IJMatrix *matrix, const HYPRE_Int *diag_sizes, const HYPRE_Int *offdiag_sizes ); HYPRE_Int hypre_IJMatrixSetMaxOffProcElmtsParCSR ( hypre_IJMatrix *matrix, HYPRE_Int max_off_proc_elmts ); HYPRE_Int hypre_IJMatrixSetInitAllocationParCSR(hypre_IJMatrix *matrix, HYPRE_Int factor); HYPRE_Int hypre_IJMatrixSetEarlyAssembleParCSR(hypre_IJMatrix *matrix, HYPRE_Int early_assemble); HYPRE_Int hypre_IJMatrixSetGrowFactorParCSR(hypre_IJMatrix *matrix, HYPRE_Real factor); HYPRE_Int hypre_IJMatrixInitializeParCSR ( hypre_IJMatrix *matrix ); HYPRE_Int hypre_IJMatrixGetRowCountsParCSR ( hypre_IJMatrix *matrix, HYPRE_Int nrows, HYPRE_BigInt *rows, HYPRE_Int *ncols ); HYPRE_Int hypre_IJMatrixGetValuesParCSR ( hypre_IJMatrix *matrix, HYPRE_Int nrows, HYPRE_Int *ncols, HYPRE_BigInt *rows, HYPRE_Int *row_indexes, HYPRE_BigInt *cols, HYPRE_Complex *values, HYPRE_Int zero_out ); HYPRE_Int hypre_IJMatrixSetValuesParCSR ( hypre_IJMatrix *matrix, HYPRE_Int nrows, HYPRE_Int *ncols, const HYPRE_BigInt *rows, const HYPRE_Int *row_indexes, const HYPRE_BigInt *cols, const HYPRE_Complex *values ); HYPRE_Int hypre_IJMatrixSetAddValuesParCSRDevice ( hypre_IJMatrix *matrix, HYPRE_Int nrows, HYPRE_Int *ncols, const HYPRE_BigInt *rows, const HYPRE_Int *row_indexes, const HYPRE_BigInt *cols, const HYPRE_Complex *values, const char *action ); HYPRE_Int hypre_IJMatrixSetConstantValuesParCSR ( hypre_IJMatrix *matrix, HYPRE_Complex value ); HYPRE_Int hypre_IJMatrixAddToValuesParCSR ( hypre_IJMatrix *matrix, HYPRE_Int nrows, HYPRE_Int *ncols, const HYPRE_BigInt *rows, const HYPRE_Int *row_indexes, const HYPRE_BigInt *cols, const HYPRE_Complex *values ); HYPRE_Int hypre_IJMatrixDestroyParCSR ( hypre_IJMatrix *matrix ); HYPRE_Int hypre_IJMatrixTransposeParCSR ( hypre_IJMatrix *matrix_A, hypre_IJMatrix *matrix_AT ); HYPRE_Int hypre_IJMatrixNormParCSR ( hypre_IJMatrix *matrix, HYPRE_Real *norm ); HYPRE_Int hypre_IJMatrixAddParCSR ( HYPRE_Complex alpha, hypre_IJMatrix *matrix_A, HYPRE_Complex beta, hypre_IJMatrix *matrix_B, hypre_IJMatrix *matrix_C ); HYPRE_Int hypre_IJMatrixAssembleOffProcValsParCSR ( hypre_IJMatrix *matrix, HYPRE_Int off_proc_i_indx, HYPRE_Int max_off_proc_elmts, HYPRE_Int current_num_elmts, HYPRE_MemoryLocation memory_location, HYPRE_BigInt *off_proc_i, HYPRE_BigInt *off_proc_j, HYPRE_Complex *off_proc_data ); HYPRE_Int hypre_FillResponseIJOffProcVals ( void *p_recv_contact_buf, HYPRE_Int contact_size, HYPRE_Int contact_proc, void *ro, MPI_Comm comm, void **p_send_response_buf, HYPRE_Int *response_message_size ); HYPRE_Int hypre_FindProc ( HYPRE_BigInt *list, HYPRE_BigInt value, HYPRE_Int list_length ); HYPRE_Int hypre_IJMatrixAssembleParCSR ( hypre_IJMatrix *matrix ); HYPRE_Int hypre_IJMatrixSetValuesOMPParCSR ( hypre_IJMatrix *matrix, HYPRE_Int nrows, HYPRE_Int *ncols, const HYPRE_BigInt *rows, const HYPRE_Int *row_indexes, const HYPRE_BigInt *cols, const HYPRE_Complex *values ); HYPRE_Int hypre_IJMatrixAddToValuesOMPParCSR ( hypre_IJMatrix *matrix, HYPRE_Int nrows, HYPRE_Int *ncols, const HYPRE_BigInt *rows, const HYPRE_Int *row_indexes, const HYPRE_BigInt *cols, const HYPRE_Complex *values ); HYPRE_Int hypre_IJMatrixAssembleParCSRDevice(hypre_IJMatrix *matrix); HYPRE_Int hypre_IJMatrixInitializeParCSR_v2(hypre_IJMatrix *matrix, HYPRE_MemoryLocation memory_location); HYPRE_Int hypre_IJMatrixSetConstantValuesParCSRDevice( hypre_IJMatrix *matrix, HYPRE_Complex value ); HYPRE_Int hypre_IJMatrixMigrateParCSR(hypre_IJMatrix *matrix, HYPRE_MemoryLocation memory_location); HYPRE_Int hypre_IJMatrixAssembleCommunicate(hypre_IJMatrix *matrix); HYPRE_Int hypre_IJMatrixAssembleCompressDevice(hypre_IJMatrix *matrix, HYPRE_Int reduce_stack_size); /* IJMatrix_petsc.c */ HYPRE_Int hypre_IJMatrixSetLocalSizePETSc ( hypre_IJMatrix *matrix, HYPRE_Int local_m, HYPRE_Int local_n ); HYPRE_Int hypre_IJMatrixCreatePETSc ( hypre_IJMatrix *matrix ); HYPRE_Int hypre_IJMatrixSetRowSizesPETSc ( hypre_IJMatrix *matrix, HYPRE_Int *sizes ); HYPRE_Int hypre_IJMatrixSetDiagRowSizesPETSc ( hypre_IJMatrix *matrix, HYPRE_Int *sizes ); HYPRE_Int hypre_IJMatrixSetOffDiagRowSizesPETSc ( hypre_IJMatrix *matrix, HYPRE_Int *sizes ); HYPRE_Int hypre_IJMatrixInitializePETSc ( hypre_IJMatrix *matrix ); HYPRE_Int hypre_IJMatrixInsertBlockPETSc ( hypre_IJMatrix *matrix, HYPRE_Int m, HYPRE_Int n, HYPRE_BigInt *rows, HYPRE_BigInt *cols, HYPRE_Complex *coeffs ); HYPRE_Int hypre_IJMatrixAddToBlockPETSc ( hypre_IJMatrix *matrix, HYPRE_Int m, HYPRE_Int n, HYPRE_Int *rows, HYPRE_Int *cols, HYPRE_Complex *coeffs ); HYPRE_Int hypre_IJMatrixInsertRowPETSc ( hypre_IJMatrix *matrix, HYPRE_Int n, HYPRE_BigInt row, HYPRE_BigInt *indices, HYPRE_Complex *coeffs ); HYPRE_Int hypre_IJMatrixAddToRowPETSc ( hypre_IJMatrix *matrix, HYPRE_Int n, HYPRE_BigInt row, HYPRE_BigInt *indices, HYPRE_Complex *coeffs ); HYPRE_Int hypre_IJMatrixAssemblePETSc ( hypre_IJMatrix *matrix ); HYPRE_Int hypre_IJMatrixDistributePETSc ( hypre_IJMatrix *matrix, HYPRE_BigInt *row_starts, HYPRE_BigInt *col_starts ); HYPRE_Int hypre_IJMatrixApplyPETSc ( hypre_IJMatrix *matrix, hypre_ParVector *x, hypre_ParVector *b ); HYPRE_Int hypre_IJMatrixDestroyPETSc ( hypre_IJMatrix *matrix ); HYPRE_Int hypre_IJMatrixSetTotalSizePETSc ( hypre_IJMatrix *matrix, HYPRE_Int size ); /* IJVector.c */ HYPRE_Int hypre_IJVectorDistribute ( HYPRE_IJVector vector, const HYPRE_Int *vec_starts ); HYPRE_Int hypre_IJVectorZeroValues ( HYPRE_IJVector vector ); HYPRE_Int hypre_IJVectorReadBinary ( MPI_Comm comm, const char *filename, HYPRE_Int type, HYPRE_IJVector *vector_ptr ); /* IJVector_parcsr.c */ HYPRE_Int hypre_IJVectorCreatePar ( hypre_IJVector *vector, HYPRE_BigInt *IJpartitioning ); HYPRE_Int hypre_IJVectorDestroyPar ( hypre_IJVector *vector ); HYPRE_Int hypre_IJVectorInitializeParShell (hypre_IJVector *vector ); HYPRE_Int hypre_IJVectorSetParData( hypre_IJVector *vector, HYPRE_Complex *data ); HYPRE_Int hypre_IJVectorInitializePar ( hypre_IJVector *vector ); HYPRE_Int hypre_IJVectorInitializePar_v2(hypre_IJVector *vector, HYPRE_MemoryLocation memory_location); HYPRE_Int hypre_IJVectorSetMaxOffProcElmtsPar ( hypre_IJVector *vector, HYPRE_Int max_off_proc_elmts ); HYPRE_Int hypre_IJVectorDistributePar ( hypre_IJVector *vector, const HYPRE_Int *vec_starts ); HYPRE_Int hypre_IJVectorZeroValuesPar ( hypre_IJVector *vector ); HYPRE_Int hypre_IJVectorSetComponentPar ( hypre_IJVector *vector, HYPRE_Int component); HYPRE_Int hypre_IJVectorSetValuesPar ( hypre_IJVector *vector, HYPRE_Int num_values, const HYPRE_BigInt *indices, const HYPRE_Complex *values ); HYPRE_Int hypre_IJVectorSetConstantValuesPar ( hypre_IJVector *vector, HYPRE_Complex value ); HYPRE_Int hypre_IJVectorAddToValuesPar ( hypre_IJVector *vector, HYPRE_Int num_values, const HYPRE_BigInt *indices, const HYPRE_Complex *values ); HYPRE_Int hypre_IJVectorAssemblePar ( hypre_IJVector *vector ); HYPRE_Int hypre_IJVectorGetValuesPar ( hypre_IJVector *vector, HYPRE_Int num_values, const HYPRE_BigInt *indices, HYPRE_Complex *values ); HYPRE_Int hypre_IJVectorAssembleOffProcValsPar ( hypre_IJVector *vector, HYPRE_Int max_off_proc_elmts, HYPRE_Int current_num_elmts, HYPRE_MemoryLocation memory_location, HYPRE_BigInt *off_proc_i, HYPRE_Complex *off_proc_data ); HYPRE_Int hypre_IJVectorSetAddValuesParDevice(hypre_IJVector *vector, HYPRE_Int num_values, const HYPRE_BigInt *indices, const HYPRE_Complex *values, const char *action); HYPRE_Int hypre_IJVectorAssembleParDevice(hypre_IJVector *vector); HYPRE_Int hypre_IJVectorUpdateValuesDevice( hypre_IJVector *vector, HYPRE_Int num_values, const HYPRE_BigInt *indices, const HYPRE_Complex *values, HYPRE_Int action); HYPRE_Int hypre_IJVectorMigrateParCSR(hypre_IJVector *vector, HYPRE_MemoryLocation memory_location); /* HYPRE_IJMatrix.c */ HYPRE_Int HYPRE_IJMatrixCreate ( MPI_Comm comm, HYPRE_BigInt ilower, HYPRE_BigInt iupper, HYPRE_BigInt jlower, HYPRE_BigInt jupper, HYPRE_IJMatrix *matrix ); HYPRE_Int HYPRE_IJMatrixPartialClone ( HYPRE_IJMatrix matrix_in, HYPRE_IJMatrix *matrix_out ); HYPRE_Int HYPRE_IJMatrixDestroy ( HYPRE_IJMatrix matrix ); HYPRE_Int HYPRE_IJMatrixInitialize ( HYPRE_IJMatrix matrix ); HYPRE_Int HYPRE_IJMatrixSetPrintLevel ( HYPRE_IJMatrix matrix, HYPRE_Int print_level ); HYPRE_Int HYPRE_IJMatrixSetValues ( HYPRE_IJMatrix matrix, HYPRE_Int nrows, HYPRE_Int *ncols, const HYPRE_BigInt *rows, const HYPRE_BigInt *cols, const HYPRE_Complex *values ); HYPRE_Int HYPRE_IJMatrixSetConstantValues ( HYPRE_IJMatrix matrix, HYPRE_Complex value ); HYPRE_Int HYPRE_IJMatrixAddToValues ( HYPRE_IJMatrix matrix, HYPRE_Int nrows, HYPRE_Int *ncols, const HYPRE_BigInt *rows, const HYPRE_BigInt *cols, const HYPRE_Complex *values ); HYPRE_Int HYPRE_IJMatrixAssemble ( HYPRE_IJMatrix matrix ); HYPRE_Int HYPRE_IJMatrixGetRowCounts ( HYPRE_IJMatrix matrix, HYPRE_Int nrows, HYPRE_BigInt *rows, HYPRE_Int *ncols ); HYPRE_Int HYPRE_IJMatrixGetValues ( HYPRE_IJMatrix matrix, HYPRE_Int nrows, HYPRE_Int *ncols, HYPRE_BigInt *rows, HYPRE_BigInt *cols, HYPRE_Complex *values ); HYPRE_Int HYPRE_IJMatrixSetObjectType ( HYPRE_IJMatrix matrix, HYPRE_Int type ); HYPRE_Int HYPRE_IJMatrixGetObjectType ( HYPRE_IJMatrix matrix, HYPRE_Int *type ); HYPRE_Int HYPRE_IJMatrixGetLocalRange ( HYPRE_IJMatrix matrix, HYPRE_BigInt *ilower, HYPRE_BigInt *iupper, HYPRE_BigInt *jlower, HYPRE_BigInt *jupper ); HYPRE_Int HYPRE_IJMatrixGetObject ( HYPRE_IJMatrix matrix, void **object ); HYPRE_Int HYPRE_IJMatrixSetRowSizes ( HYPRE_IJMatrix matrix, const HYPRE_Int *sizes ); HYPRE_Int HYPRE_IJMatrixSetDiagOffdSizes ( HYPRE_IJMatrix matrix, const HYPRE_Int *diag_sizes, const HYPRE_Int *offdiag_sizes ); HYPRE_Int HYPRE_IJMatrixSetMaxOffProcElmts ( HYPRE_IJMatrix matrix, HYPRE_Int max_off_proc_elmts ); HYPRE_Int HYPRE_IJMatrixRead ( const char *filename, MPI_Comm comm, HYPRE_Int type, HYPRE_IJMatrix *matrix_ptr ); HYPRE_Int HYPRE_IJMatrixReadBinary ( const char *filename, MPI_Comm comm, HYPRE_Int type, HYPRE_IJMatrix *matrix_ptr ); HYPRE_Int HYPRE_IJMatrixReadMM( const char *filename, MPI_Comm comm, HYPRE_Int type, HYPRE_IJMatrix *matrix_ptr ); HYPRE_Int HYPRE_IJMatrixPrint ( HYPRE_IJMatrix matrix, const char *filename ); HYPRE_Int HYPRE_IJMatrixPrintBinary ( HYPRE_IJMatrix matrix, const char *filename ); HYPRE_Int HYPRE_IJMatrixSetOMPFlag ( HYPRE_IJMatrix matrix, HYPRE_Int omp_flag ); HYPRE_Int HYPRE_IJMatrixTranspose ( HYPRE_IJMatrix matrix_A, HYPRE_IJMatrix *matrix_AT ); HYPRE_Int HYPRE_IJMatrixNorm ( HYPRE_IJMatrix matrix, HYPRE_Real *norm ); HYPRE_Int HYPRE_IJMatrixAdd ( HYPRE_Complex alpha, HYPRE_IJMatrix matrix_A, HYPRE_Complex beta, HYPRE_IJMatrix matrix_B, HYPRE_IJMatrix *matrix_C ); /* HYPRE_IJVector.c */ HYPRE_Int HYPRE_IJVectorCreate ( MPI_Comm comm, HYPRE_BigInt jlower, HYPRE_BigInt jupper, HYPRE_IJVector *vector ); HYPRE_Int HYPRE_IJVectorSetNumComponents ( HYPRE_IJVector vector, HYPRE_Int num_components ); HYPRE_Int HYPRE_IJVectorSetComponent ( HYPRE_IJVector vector, HYPRE_Int component ); HYPRE_Int HYPRE_IJVectorDestroy ( HYPRE_IJVector vector ); HYPRE_Int HYPRE_IJVectorInitialize ( HYPRE_IJVector vector ); HYPRE_Int HYPRE_IJVectorSetPrintLevel ( HYPRE_IJVector vector, HYPRE_Int print_level ); HYPRE_Int HYPRE_IJVectorSetValues ( HYPRE_IJVector vector, HYPRE_Int nvalues, const HYPRE_BigInt *indices, const HYPRE_Complex *values ); HYPRE_Int HYPRE_IJVectorSetConstantValues ( HYPRE_IJVector vector, HYPRE_Complex value ); HYPRE_Int HYPRE_IJVectorAddToValues ( HYPRE_IJVector vector, HYPRE_Int nvalues, const HYPRE_BigInt *indices, const HYPRE_Complex *values ); HYPRE_Int HYPRE_IJVectorAssemble ( HYPRE_IJVector vector ); HYPRE_Int HYPRE_IJVectorGetValues ( HYPRE_IJVector vector, HYPRE_Int nvalues, const HYPRE_BigInt *indices, HYPRE_Complex *values ); HYPRE_Int HYPRE_IJVectorSetMaxOffProcElmts ( HYPRE_IJVector vector, HYPRE_Int max_off_proc_elmts ); HYPRE_Int HYPRE_IJVectorSetObjectType ( HYPRE_IJVector vector, HYPRE_Int type ); HYPRE_Int HYPRE_IJVectorGetObjectType ( HYPRE_IJVector vector, HYPRE_Int *type ); HYPRE_Int HYPRE_IJVectorGetLocalRange ( HYPRE_IJVector vector, HYPRE_BigInt *jlower, HYPRE_BigInt *jupper ); HYPRE_Int HYPRE_IJVectorGetObject ( HYPRE_IJVector vector, void **object ); HYPRE_Int HYPRE_IJVectorRead ( const char *filename, MPI_Comm comm, HYPRE_Int type, HYPRE_IJVector *vector_ptr ); HYPRE_Int HYPRE_IJVectorReadBinary ( const char *filename, MPI_Comm comm, HYPRE_Int type, HYPRE_IJVector *vector_ptr ); HYPRE_Int HYPRE_IJVectorPrint ( HYPRE_IJVector vector, const char *filename ); HYPRE_Int HYPRE_IJVectorPrintBinary ( HYPRE_IJVector vector, const char *filename ); HYPRE_Int HYPRE_IJVectorInnerProd ( HYPRE_IJVector x, HYPRE_IJVector y, HYPRE_Real *prod ); hypre-2.33.0/src/Makefile000066400000000000000000000163201477326011500151650ustar00rootroot00000000000000# Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) default: all # Include all variables defined by configure include config/Makefile.config # Tolerance level for checkpar tests # The value of the variable can be set when calling `make checkpar` HYPRE_CHECKPAR_TOL ?= 1e-6 # These are the directories for internal blas, lapack and general utilities HYPRE_BASIC_DIRS =\ blas\ lapack\ utilities #These are the directories for multivector HYPRE_MULTIVEC_DIRS =\ multivector # These are the directories for the generic Krylov solvers HYPRE_KRYLOV_DIRS =\ krylov #These are the directories for the IJ interface HYPRE_IJ_DIRS =\ seq_mv\ seq_block_mv\ parcsr_mv\ parcsr_block_mv\ distributed_matrix\ IJ_mv\ matrix_matrix\ parcsr_ls #These are the directories for the structured interface HYPRE_STRUCT_DIRS =\ struct_mv\ struct_ls #These are the directories for the semi-structured interface HYPRE_SSTRUCT_DIRS =\ sstruct_mv\ sstruct_ls #These are the directories for the distributed_ls codes HYPRE_DISTRIBUTED_LS_DIRS = ${HYPRE_DISTRIBUTED_LS_DIR} #These are the directories for the FEI HYPRE_FEI_DIRS = ${HYPRE_FEI_SRC_DIR} #This is the lib directory HYPRE_LIBS_DIRS = lib #This is the documentation directory HYPRE_DOCS_DIRS = docs #This is the test-driver directory HYPRE_TEST_DIRS = test #This is the examples directory HYPRE_EXAMPLE_DIRS = examples # These are directories that are officially in HYPRE HYPRE_DIRS =\ ${HYPRE_BASIC_DIRS}\ ${HYPRE_MULTIVEC_DIRS}\ ${HYPRE_KRYLOV_DIRS}\ ${HYPRE_IJ_DIRS}\ ${HYPRE_STRUCT_DIRS}\ ${HYPRE_SSTRUCT_DIRS}\ ${HYPRE_DISTRIBUTED_LS_DIRS}\ ${HYPRE_FEI_DIRS}\ ${HYPRE_LIBS_DIRS} # These are directories that are not yet officially in HYPRE HYPRE_EXTRA_DIRS =\ ${HYPRE_DOCS_DIRS}\ ${HYPRE_TEST_DIRS}\ seq_ls/pamg ################################################################# # Targets ################################################################# all: @ \ mkdir -p ${HYPRE_BUILD_DIR}/include; \ mkdir -p ${HYPRE_BUILD_DIR}/lib; \ cp -fR HYPRE_config.h ${HYPRE_BUILD_DIR}/include/.; \ cp -fR $(srcdir)/HYPRE.h ${HYPRE_BUILD_DIR}/include/.; \ cp -fR $(srcdir)/HYPREf.h ${HYPRE_BUILD_DIR}/include/.; \ for i in ${HYPRE_DIRS}; \ do \ echo "Making $$i ..."; \ (cd $$i && $(MAKE) $@) || exit 1; \ echo ""; \ done help: @echo " " @echo "************************************************************" @echo " HYPRE Make System Targets" @echo " (using GNU-standards)" @echo " " @echo "all:" @echo " default target in all directories" @echo " compile the entire program" @echo " does not rebuild documentation" @echo " " @echo "help:" @echo " prints details of each target" @echo " " @echo "install:" @echo " compile the program and copy executables, libraries, etc" @echo " to the file names where they reside for actual use" @echo " executes mkinstalldirs script to create directories needed" @echo " " @echo "clean:" @echo " deletes all files from the current directory that are normally" @echo " created by building the program" @echo " " @echo "distclean:" @echo " deletes all files from the current directory that are" @echo " created by configuring or building the program" @echo " " @echo "tags:" @echo " runs etags to create tags table" @echo " file is named TAGS and is saved in current directory" @echo " " @echo "test:" @echo " depends on the all target to be completed" @echo " removes existing temporary installation sub-directory" @echo " creates a temporary installation sub-directory" @echo " copies all libHYPRE* and *.h files to the temporary locations" @echo " builds the test drivers; linking to the temporary installation" @echo " directories to simulate how application codes will link to HYPRE" @echo " " @echo "check:" @echo " runs a small driver test to verify a working library" @echo " use CHECKRUN= if needed combined with" @echo " PARMS='-P px py pz' where px*py*pz must be number of" @echo " processes set in CHECKRUN" @echo " " @echo " " @echo "checkpar:" @echo " runs several regression test to verify a working library." @echo " Use parameter CHECKRUN='' if needed." @echo " If CHECKRUN is not set, 'mpirun -np' is used." @echo " " @echo " " @echo "************************************************************" test: all @ \ echo "Making test drivers ..."; \ (cd test; $(MAKE) clean; $(MAKE) all) check: @ \ echo "Checking the library ..."; \ set -e; \ (cd test; $(MAKE) all); \ (cd test; $(CHECKRUN) ./ij $(PARMS) 2> ij.err); \ (cd test; $(CHECKRUN) ./struct $(PARMS) 2> struct.err); \ (cd test; cp -f TEST_sstruct/sstruct.in.default .; $(CHECKRUN) ./sstruct $(PARMS) 2> sstruct.err); \ (cd test; ls -l ij.err struct.err sstruct.err) checkpar: @ \ echo "Checking the library ..."; \ set -e; \ (cd test; $(MAKE) all); \ echo "Testing IJ ..."; \ (cd test; ./runtest.sh -atol $(HYPRE_CHECKPAR_TOL) -mpi "$(CHECKRUN)" TEST_ij/solvers.sh); \ (cd test; ./checktest.sh); \ (cd test; ./cleantest.sh); \ echo "Testing Struct ..."; \ (cd test; ./runtest.sh -atol $(HYPRE_CHECKPAR_TOL) -mpi "$(CHECKRUN)" TEST_struct/solvers.sh); \ (cd test; ./checktest.sh); \ (cd test; ./cleantest.sh); \ echo "Testing SStruct ..."; \ (cd test; ./runtest.sh -atol $(HYPRE_CHECKPAR_TOL) -mpi "$(CHECKRUN)" TEST_sstruct/solvers.sh); \ (cd test; ./checktest.sh); \ (cd test; ./cleantest.sh); install: all @ \ echo "Installing hypre ..."; \ ${HYPRE_SRC_TOP_DIR}/config/mkinstalldirs ${HYPRE_LIB_INSTALL} ${HYPRE_INC_INSTALL}; \ HYPRE_PWD=`pwd`; \ cd ${HYPRE_BUILD_DIR}/lib; HYPRE_FROMDIR=`pwd`; \ cd $$HYPRE_PWD; \ cd ${HYPRE_LIB_INSTALL}; HYPRE_TODIR=`pwd`; \ if [ "$$HYPRE_FROMDIR" != "$$HYPRE_TODIR" ]; \ then \ cp -fR $$HYPRE_FROMDIR/* $$HYPRE_TODIR; \ fi; \ cd ${HYPRE_BUILD_DIR}/include; HYPRE_FROMDIR=`pwd`; \ cd $$HYPRE_PWD; \ cd ${HYPRE_INC_INSTALL}; HYPRE_TODIR=`pwd`; \ if [ "$$HYPRE_FROMDIR" != "$$HYPRE_TODIR" ]; \ then \ cp -fR $$HYPRE_FROMDIR/* $$HYPRE_TODIR; \ fi; \ cd $$HYPRE_PWD; \ chmod -R a+rX,u+w,go-w ${HYPRE_LIB_INSTALL}; \ chmod -R a+rX,u+w,go-w ${HYPRE_INC_INSTALL}; \ echo clean: @ \ rm -Rf hypre; \ for i in ${HYPRE_DIRS} ${HYPRE_EXTRA_DIRS} ${HYPRE_EXAMPLE_DIRS}; \ do \ if [ -f $$i/Makefile ]; \ then \ echo "Cleaning $$i ..."; \ (cd $$i && $(MAKE) $@) || exit 1; \ fi; \ done rm -rf tca.map pchdir *inslog* distclean: @ \ rm -Rf hypre; \ for i in ${HYPRE_DIRS} ${HYPRE_EXTRA_DIRS} ${HYPRE_EXAMPLE_DIRS} examples/docs; \ do \ if [ -d $$i ]; \ then \ echo "Dist-Cleaning $$i ..."; \ (cd $$i && $(MAKE) $@) || exit 1; \ fi; \ done rm -rf tca.map pchdir *inslog* rm -rf ./config/Makefile.config rm -rf ./TAGS rm -rf ./autom4te.cache rm -rf ./config.log rm -rf ./config.status rm -rf ./HYPRE_config.h tags: find . -name "*.c" -o -name "*.C" -o -name "*.h" -o \ -name "*.c??" -o -name "*.h??" -o -name "*.f" | etags - hypre-2.33.0/src/blas/000077500000000000000000000000001477326011500144445ustar00rootroot00000000000000hypre-2.33.0/src/blas/CMakeLists.txt000066400000000000000000000012301477326011500172000ustar00rootroot00000000000000# Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) set(HDRS _hypre_blas.h f2c.h hypre_blas.h ) set(SRCS dasum.c daxpy.c dcopy.c ddot.c dgemm.c dgemv.c dger.c dnrm2.c drot.c dscal.c dswap.c dsymm.c dsymv.c dsyr2.c dsyr2k.c dsyrk.c dtrmm.c dtrmv.c dtrsm.c dtrsv.c f2c.c idamax.c lsame.c xerbla.c ) target_sources(${PROJECT_NAME} PRIVATE ${SRCS} ${HDRS} ) convert_filenames_to_full_paths(HDRS) set(HYPRE_HEADERS ${HYPRE_HEADERS} ${HDRS} PARENT_SCOPE) hypre-2.33.0/src/blas/COPYING000066400000000000000000000031071477326011500155000ustar00rootroot00000000000000Copyright (c) 1992-2008 The University of Tennessee. All rights reserved. $COPYRIGHT$ Additional copyrights may follow $HEADER$ Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer listed in this license in the documentation and/or other materials provided with the distribution. - Neither the name of the copyright holders nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "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 THE COPYRIGHT OWNER OR 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. hypre-2.33.0/src/blas/Makefile000066400000000000000000000023301477326011500161020ustar00rootroot00000000000000# Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) ### Internal BLAS routines may be compiled in this sub-directory ### Generally, the Makefile in the utilities subdirectory controls ### the inclusion of these routines based on the configure options. ### include ../config/Makefile.config C_COMPILE_FLAGS = ${INCLUDES} -I.. -I../utilities BLAS_HEADERS = f2c.h hypre_blas.h BLAS_FILES = \ dasum.c\ daxpy.c\ dcopy.c\ ddot.c\ dgemm.c\ dgemv.c\ dger.c\ dnrm2.c\ drot.c\ dscal.c\ dswap.c\ dsymm.c\ dsymv.c\ dsyr2.c\ dsyr2k.c\ dsyrk.c\ dtrmm.c\ dtrmv.c\ dtrsm.c\ dtrsv.c\ f2c.c\ idamax.c\ lsame.c\ xerbla.c OBJS = ${BLAS_FILES:.c=.o} ################################################################## # Targets ################################################################## all: ${OBJS} install: all cp -fR $(srcdir)/_hypre_blas.h $(HYPRE_INC_INSTALL) clean: rm -rf *.o distclean: clean ################################################################## # Rules ################################################################## ${OBJS}: ${BLAS_HEADERS} hypre-2.33.0/src/blas/README000066400000000000000000000033051477326011500153250ustar00rootroot00000000000000# Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) HYPRE BLAS README file The source in the HYPRE BLAS and LAPACK is taken from CLAPACK and most recently based on release 3.2.1 (though many of the files here are much older). To add a new BLAS or LAPACK routine, copy the file to the appropriate directory, then do the following: - Add the University of Tennessee copyright statement to the top of the file - Add C include guards at the beginning and end of the file to allow for C++ compilation - Change the 'blaswrap.h' include file to either 'hypre_blas.h' or 'hypre_lapack.h' - Change 'int' to 'integer' to avoid errors in the autotest check-int script - Add 'const' in front of 'char *' in prototypes as required by C++ (use the warnings from the C++ compiler to determine where the changes are needed) - Add the #define name changes to 'hypre_blas.h' and/or 'hypre_lapack.h'. Organize things alphabetically and by routine type. Note that the blas renaming needs to be replicated in 'hypre_lapack.h'. - Create a hypre_ prototype for the main BLAS and LAPACK routines in either '_hypre_blas.h' or '_hypre_lapack.h'. Do not create prototypes for auxiliary routines or f2c-library routines. - To determine which routines are auxiliary routines, look at the comments in the C files (search for 'auxiliary'). - Add the filename in Makefile - Remove any instance of the 'static' identifier in local variables. 'static' variables are initialized only once and shared between all threads executing the code; thus, they lead to code that may not be thread-safe. hypre-2.33.0/src/blas/_hypre_blas.h000066400000000000000000000162231477326011500171100ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * Header file for HYPRE BLAS * *****************************************************************************/ #ifndef HYPRE_BLAS_H #define HYPRE_BLAS_H #include "_hypre_utilities.h" #include "fortran.h" #include #ifdef __cplusplus extern "C" { #endif /*-------------------------------------------------------------------------- * Change all 'hypre_' names based on using HYPRE or external library *--------------------------------------------------------------------------*/ #ifndef HYPRE_USING_HYPRE_BLAS #if defined(HYPRE_SINGLE) #define hypre_dasum hypre_F90_NAME_BLAS(sasum ,SASUM ) #define hypre_daxpy hypre_F90_NAME_BLAS(saxpy ,SAXPY ) #define hypre_dcopy hypre_F90_NAME_BLAS(scopy ,SCOPY ) #define hypre_ddot hypre_F90_NAME_BLAS(sdot ,SDOT ) #define hypre_dgemm hypre_F90_NAME_BLAS(sgemm ,SGEMM ) #define hypre_dgemv hypre_F90_NAME_BLAS(sgemv ,SGEMV ) #define hypre_dger hypre_F90_NAME_BLAS(sger ,SGER ) #define hypre_dnrm2 hypre_F90_NAME_BLAS(snrm2 ,SNRM2 ) #define hypre_drot hypre_F90_NAME_BLAS(srot ,SROT ) #define hypre_dscal hypre_F90_NAME_BLAS(sscal ,SSCAL ) #define hypre_dswap hypre_F90_NAME_BLAS(sswap ,SSWAP ) #define hypre_dsymm hypre_F90_NAME_BLAS(ssymm ,SSYMM ) #define hypre_dsymv hypre_F90_NAME_BLAS(ssymv ,SSYMV ) #define hypre_dsyr2 hypre_F90_NAME_BLAS(ssyr2 ,SSYR2 ) #define hypre_dsyr2k hypre_F90_NAME_BLAS(ssyr2k,SSYR2K) #define hypre_dsyrk hypre_F90_NAME_BLAS(ssyrk ,SSYRK ) #define hypre_dtrmm hypre_F90_NAME_BLAS(strmm ,STRMM ) #define hypre_dtrmv hypre_F90_NAME_BLAS(strmv ,STRMV ) #define hypre_dtrsm hypre_F90_NAME_BLAS(strsm ,STRSM ) #define hypre_dtrsv hypre_F90_NAME_BLAS(strsv ,STRSV ) #define hypre_idamax hypre_F90_NAME_BLAS(isamax,ISAMAX) #else #define hypre_dasum hypre_F90_NAME_BLAS(dasum ,DASUM ) #define hypre_daxpy hypre_F90_NAME_BLAS(daxpy ,DAXPY ) #define hypre_dcopy hypre_F90_NAME_BLAS(dcopy ,DCOPY ) #define hypre_ddot hypre_F90_NAME_BLAS(ddot ,DDOT ) #define hypre_dgemm hypre_F90_NAME_BLAS(dgemm ,DGEMM ) #define hypre_dgemv hypre_F90_NAME_BLAS(dgemv ,DGEMV ) #define hypre_dger hypre_F90_NAME_BLAS(dger ,DGER ) #define hypre_dnrm2 hypre_F90_NAME_BLAS(dnrm2 ,DNRM2 ) #define hypre_drot hypre_F90_NAME_BLAS(drot ,DROT ) #define hypre_dscal hypre_F90_NAME_BLAS(dscal ,DSCAL ) #define hypre_dswap hypre_F90_NAME_BLAS(dswap ,DSWAP ) #define hypre_dsymm hypre_F90_NAME_BLAS(dsymm ,DSYMM ) #define hypre_dsymv hypre_F90_NAME_BLAS(dsymv ,DSYMV ) #define hypre_dsyr2 hypre_F90_NAME_BLAS(dsyr2 ,DSYR2 ) #define hypre_dsyr2k hypre_F90_NAME_BLAS(dsyr2k,DSYR2K) #define hypre_dsyrk hypre_F90_NAME_BLAS(dsyrk ,DSYRK ) #define hypre_dtrmm hypre_F90_NAME_BLAS(dtrmm ,DTRMM ) #define hypre_dtrmv hypre_F90_NAME_BLAS(dtrmv ,DTRMV ) #define hypre_dtrsm hypre_F90_NAME_BLAS(dtrsm ,DTRSM ) #define hypre_dtrsv hypre_F90_NAME_BLAS(dtrsv ,DTRSV ) #define hypre_idamax hypre_F90_NAME_BLAS(idamax,IDAMAX) #endif #endif /*-------------------------------------------------------------------------- * Prototypes *--------------------------------------------------------------------------*/ /* dasum.c */ HYPRE_Real hypre_dasum ( HYPRE_Int *n , HYPRE_Real *dx , HYPRE_Int *incx ); /* daxpy.c */ HYPRE_Int hypre_daxpy ( HYPRE_Int *n , HYPRE_Real *da , HYPRE_Real *dx , HYPRE_Int *incx , HYPRE_Real *dy , HYPRE_Int *incy ); /* dcopy.c */ HYPRE_Int hypre_dcopy ( HYPRE_Int *n , HYPRE_Real *dx , HYPRE_Int *incx , HYPRE_Real *dy , HYPRE_Int *incy ); /* ddot.c */ HYPRE_Real hypre_ddot ( HYPRE_Int *n , HYPRE_Real *dx , HYPRE_Int *incx , HYPRE_Real *dy , HYPRE_Int *incy ); /* dgemm.c */ HYPRE_Int hypre_dgemm ( const char *transa , const char *transb , HYPRE_Int *m , HYPRE_Int *n , HYPRE_Int *k , HYPRE_Real *alpha , HYPRE_Real *a , HYPRE_Int *lda , HYPRE_Real *b , HYPRE_Int *ldb , HYPRE_Real *beta , HYPRE_Real *c , HYPRE_Int *ldc ); /* dgemv.c */ HYPRE_Int hypre_dgemv ( const char *trans , HYPRE_Int *m , HYPRE_Int *n , HYPRE_Real *alpha , HYPRE_Real *a , HYPRE_Int *lda , HYPRE_Real *x , HYPRE_Int *incx , HYPRE_Real *beta , HYPRE_Real *y , HYPRE_Int *incy ); /* dger.c */ HYPRE_Int hypre_dger ( HYPRE_Int *m , HYPRE_Int *n , HYPRE_Real *alpha , HYPRE_Real *x , HYPRE_Int *incx , HYPRE_Real *y , HYPRE_Int *incy , HYPRE_Real *a , HYPRE_Int *lda ); /* dnrm2.c */ HYPRE_Real hypre_dnrm2 ( HYPRE_Int *n , HYPRE_Real *dx , HYPRE_Int *incx ); /* drot.c */ HYPRE_Int hypre_drot ( HYPRE_Int *n , HYPRE_Real *dx , HYPRE_Int *incx , HYPRE_Real *dy , HYPRE_Int *incy , HYPRE_Real *c , HYPRE_Real *s ); /* dscal.c */ HYPRE_Int hypre_dscal ( HYPRE_Int *n , HYPRE_Real *da , HYPRE_Real *dx , HYPRE_Int *incx ); /* dswap.c */ HYPRE_Int hypre_dswap ( HYPRE_Int *n , HYPRE_Real *dx , HYPRE_Int *incx , HYPRE_Real *dy , HYPRE_Int *incy ); /* dsymm.c */ HYPRE_Int hypre_dsymm ( const char *side , const char *uplo , HYPRE_Int *m , HYPRE_Int *n , HYPRE_Real *alpha , HYPRE_Real *a , HYPRE_Int *lda , HYPRE_Real *b , HYPRE_Int *ldb , HYPRE_Real *beta , HYPRE_Real *c__ , HYPRE_Int *ldc ); /* dsymv.c */ HYPRE_Int hypre_dsymv ( const char *uplo , HYPRE_Int *n , HYPRE_Real *alpha , HYPRE_Real *a , HYPRE_Int *lda , HYPRE_Real *x , HYPRE_Int *incx , HYPRE_Real *beta , HYPRE_Real *y , HYPRE_Int *incy ); /* dsyr2.c */ HYPRE_Int hypre_dsyr2 ( const char *uplo , HYPRE_Int *n , HYPRE_Real *alpha , HYPRE_Real *x , HYPRE_Int *incx , HYPRE_Real *y , HYPRE_Int *incy , HYPRE_Real *a , HYPRE_Int *lda ); /* dsyr2k.c */ HYPRE_Int hypre_dsyr2k ( const char *uplo , const char *trans , HYPRE_Int *n , HYPRE_Int *k , HYPRE_Real *alpha , HYPRE_Real *a , HYPRE_Int *lda , HYPRE_Real *b , HYPRE_Int *ldb , HYPRE_Real *beta , HYPRE_Real *c__ , HYPRE_Int *ldc ); /* dsyrk.c */ HYPRE_Int hypre_dsyrk ( const char *uplo , const char *trans , HYPRE_Int *n , HYPRE_Int *k , HYPRE_Real *alpha , HYPRE_Real *a , HYPRE_Int *lda , HYPRE_Real *beta , HYPRE_Real *c , HYPRE_Int *ldc ); /* dtrmm.c */ HYPRE_Int hypre_dtrmm ( const char *side , const char *uplo , const char *transa , const char *diag , HYPRE_Int *m , HYPRE_Int *n , HYPRE_Real *alpha , HYPRE_Real *a , HYPRE_Int *lda , HYPRE_Real *b , HYPRE_Int *ldb ); /* dtrmv.c */ HYPRE_Int hypre_dtrmv ( const char *uplo , const char *trans , const char *diag , HYPRE_Int *n , HYPRE_Real *a , HYPRE_Int *lda , HYPRE_Real *x , HYPRE_Int *incx ); /* dtrsm.c */ HYPRE_Int hypre_dtrsm ( const char *side , const char *uplo , const char *transa , const char *diag , HYPRE_Int *m , HYPRE_Int *n , HYPRE_Real *alpha , HYPRE_Real *a , HYPRE_Int *lda , HYPRE_Real *b , HYPRE_Int *ldb ); /* dtrsv.c */ HYPRE_Int hypre_dtrsv ( const char *uplo , const char *trans , const char *diag , HYPRE_Int *n , HYPRE_Real *a , HYPRE_Int *lda , HYPRE_Real *x , HYPRE_Int *incx ); /* idamax.c */ HYPRE_Int hypre_idamax ( HYPRE_Int *n , HYPRE_Real *dx , HYPRE_Int *incx ); #ifdef __cplusplus } #endif #endif hypre-2.33.0/src/blas/dasum.c000066400000000000000000000035211477326011500157220ustar00rootroot00000000000000/* Copyright (c) 1992-2008 The University of Tennessee. All rights reserved. * See file COPYING in this directory for details. */ #ifdef __cplusplus extern "C" { #endif /* -- translated by f2c (version 19940927). You must link the resulting object file with the libraries: -lf2c -lm (in that order) */ #include "f2c.h" #include "hypre_blas.h" doublereal dasum_(integer *n, doublereal *dx, integer *incx) { /* System generated locals */ doublereal ret_val, d__1, d__2, d__3, d__4, d__5, d__6; /* Local variables */ integer i, m; doublereal dtemp; integer nincx, mp1; /* takes the sum of the absolute values. jack dongarra, linpack, 3/11/78. modified 3/93 to return if incx .le. 0. modified 12/3/93, array(1) declarations changed to array(*) Parameter adjustments Function Body */ #define DX(I) dx[(I)-1] ret_val = 0.; dtemp = 0.; if (*n <= 0 || *incx <= 0) { return ret_val; } if (*incx == 1) { goto L20; } /* code for increment not equal to 1 */ nincx = *n * *incx; for (i = 1; *incx < 0 ? i >= nincx : i <= nincx; i += *incx) { dtemp += (d__1 = DX(i), abs(d__1)); /* L10: */ } ret_val = dtemp; return ret_val; /* code for increment equal to 1 clean-up loop */ L20: m = *n % 6; if (m == 0) { goto L40; } for (i = 1; i <= m; ++i) { dtemp += (d__1 = DX(i), abs(d__1)); /* L30: */ } if (*n < 6) { goto L60; } L40: mp1 = m + 1; for (i = mp1; i <= *n; i += 6) { dtemp = dtemp + (d__1 = DX(i), abs(d__1)) + (d__2 = DX(i + 1), abs( d__2)) + (d__3 = DX(i + 2), abs(d__3)) + (d__4 = DX(i + 3), abs(d__4)) + (d__5 = DX(i + 4), abs(d__5)) + (d__6 = DX(i + 5) , abs(d__6)); /* L50: */ } L60: ret_val = dtemp; return ret_val; } /* dasum_ */ #ifdef __cplusplus } #endif hypre-2.33.0/src/blas/daxpy.c000066400000000000000000000034721477326011500157430ustar00rootroot00000000000000/* Copyright (c) 1992-2008 The University of Tennessee. All rights reserved. * See file COPYING in this directory for details. */ #ifdef __cplusplus extern "C" { #endif /* -- translated by f2c (version 19940927). You must link the resulting object file with the libraries: -lf2c -lm (in that order) */ #include "f2c.h" #include "hypre_blas.h" /* Subroutine */ integer daxpy_(integer *n, doublereal *da, doublereal *dx, integer *incx, doublereal *dy, integer *incy) { /* System generated locals */ /* Local variables */ integer i, m, ix, iy, mp1; /* constant times a vector plus a vector. uses unrolled loops for increments equal to one. jack dongarra, linpack, 3/11/78. modified 12/3/93, array(1) declarations changed to array(*) Parameter adjustments Function Body */ #define DY(I) dy[(I)-1] #define DX(I) dx[(I)-1] if (*n <= 0) { return 0; } if (*da == 0.) { return 0; } if (*incx == 1 && *incy == 1) { goto L20; } /* code for unequal increments or equal increments not equal to 1 */ ix = 1; iy = 1; if (*incx < 0) { ix = (-(*n) + 1) * *incx + 1; } if (*incy < 0) { iy = (-(*n) + 1) * *incy + 1; } for (i = 1; i <= *n; ++i) { DY(iy) += *da * DX(ix); ix += *incx; iy += *incy; /* L10: */ } return 0; /* code for both increments equal to 1 clean-up loop */ L20: m = *n % 4; if (m == 0) { goto L40; } for (i = 1; i <= m; ++i) { DY(i) += *da * DX(i); /* L30: */ } if (*n < 4) { return 0; } L40: mp1 = m + 1; for (i = mp1; i <= *n; i += 4) { DY(i) += *da * DX(i); DY(i + 1) += *da * DX(i + 1); DY(i + 2) += *da * DX(i + 2); DY(i + 3) += *da * DX(i + 3); /* L50: */ } return 0; } /* daxpy_ */ #ifdef __cplusplus } #endif hypre-2.33.0/src/blas/dcopy.c000066400000000000000000000035161477326011500157330ustar00rootroot00000000000000/* Copyright (c) 1992-2008 The University of Tennessee. All rights reserved. * See file COPYING in this directory for details. */ #ifdef __cplusplus extern "C" { #endif /* dcopy.f -- translated by f2c (version 19960315). You must link the resulting object file with the libraries: -lf2c -lm (in that order) */ #include "f2c.h" #include "hypre_blas.h" /* Subroutine */ integer dcopy_(integer* n, doublereal* dx,integer* incx,doublereal* dy,integer* incy) { /* System generated locals */ integer i__1; /* Local variables */ integer i__, m, ix, iy, mp1; /* copies a vector, x, to a vector, y. */ /* uses unrolled loops for increments equal to one. */ /* jack dongarra, linpack, 3/11/78. */ /* Parameter adjustments */ --dy; --dx; /* Function Body */ if (*n <= 0) { return 0; } if (*incx == 1 && *incy == 1) { goto L20; } /* code for unequal increments or equal increments */ /* not equal to 1 */ ix = 1; iy = 1; if (*incx < 0) { ix = (-(*n) + 1) * *incx + 1; } if (*incy < 0) { iy = (-(*n) + 1) * *incy + 1; } i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { dy[iy] = dx[ix]; ix += *incx; iy += *incy; /* L10: */ } return 0; /* code for both increments equal to 1 */ /* clean-up loop */ L20: m = *n % 7; if (m == 0) { goto L40; } i__1 = m; for (i__ = 1; i__ <= i__1; ++i__) { dy[i__] = dx[i__]; /* L30: */ } if (*n < 7) { return 0; } L40: mp1 = m + 1; i__1 = *n; for (i__ = mp1; i__ <= i__1; i__ += 7) { dy[i__] = dx[i__]; dy[i__ + 1] = dx[i__ + 1]; dy[i__ + 2] = dx[i__ + 2]; dy[i__ + 3] = dx[i__ + 3]; dy[i__ + 4] = dx[i__ + 4]; dy[i__ + 5] = dx[i__ + 5]; dy[i__ + 6] = dx[i__ + 6]; /* L50: */ } return 0; } /* dcopy_ */ #ifdef __cplusplus } #endif hypre-2.33.0/src/blas/ddot.c000066400000000000000000000037111477326011500155440ustar00rootroot00000000000000/* Copyright (c) 1992-2008 The University of Tennessee. All rights reserved. * See file COPYING in this directory for details. */ #ifdef __cplusplus extern "C" { #endif /* ddot.f -- translated by f2c (version 19960315). You must link the resulting object file with the libraries: -lf2c -lm (in that order) */ #include "f2c.h" #include "hypre_blas.h" doublereal ddot_(integer*n,doublereal* dx,integer* incx,doublereal* dy,integer* incy) { /* System generated locals */ integer i__1; doublereal ret_val; /* Local variables */ integer i__, m; doublereal dtemp; integer ix, iy, mp1; /* forms the dot product of two vectors. */ /* uses unrolled loops for increments equal to one. */ /* jack dongarra, linpack, 3/11/78. */ /* Parameter adjustments */ --dy; --dx; /* Function Body */ ret_val = 0.; dtemp = 0.; if (*n <= 0) { return ret_val; } if (*incx == 1 && *incy == 1) { goto L20; } /* code for unequal increments or equal increments */ /* not equal to 1 */ ix = 1; iy = 1; if (*incx < 0) { ix = (-(*n) + 1) * *incx + 1; } if (*incy < 0) { iy = (-(*n) + 1) * *incy + 1; } i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { dtemp += dx[ix] * dy[iy]; ix += *incx; iy += *incy; /* L10: */ } ret_val = dtemp; return ret_val; /* code for both increments equal to 1 */ /* clean-up loop */ L20: m = *n % 5; if (m == 0) { goto L40; } i__1 = m; for (i__ = 1; i__ <= i__1; ++i__) { dtemp += dx[i__] * dy[i__]; /* L30: */ } if (*n < 5) { goto L60; } L40: mp1 = m + 1; i__1 = *n; for (i__ = mp1; i__ <= i__1; i__ += 5) { dtemp = dtemp + dx[i__] * dy[i__] + dx[i__ + 1] * dy[i__ + 1] + dx[ i__ + 2] * dy[i__ + 2] + dx[i__ + 3] * dy[i__ + 3] + dx[i__ + 4] * dy[i__ + 4]; /* L50: */ } L60: ret_val = dtemp; return ret_val; } /* ddot_ */ #ifdef __cplusplus } #endif hypre-2.33.0/src/blas/dgemm.c000066400000000000000000000212151477326011500157020ustar00rootroot00000000000000/* Copyright (c) 1992-2008 The University of Tennessee. All rights reserved. * See file COPYING in this directory for details. */ #ifdef __cplusplus extern "C" { #endif /* -- translated by f2c (version 19940927). You must link the resulting object file with the libraries: -lf2c -lm (in that order) */ #include "f2c.h" #include "hypre_blas.h" /* Subroutine */ integer dgemm_(const char *transa,const char *transb, integer *m, integer * n, integer *k, doublereal *alpha, doublereal *a, integer *lda, doublereal *b, integer *ldb, doublereal *beta, doublereal *c, integer *ldc) { /* System generated locals */ /* Local variables */ integer info; logical nota, notb; doublereal temp; integer i, j, l; extern logical lsame_(const char *,const char *); integer nrowa, nrowb; extern /* Subroutine */ integer xerbla_(const char *, integer *); /* Purpose ======= DGEMM performs one of the matrix-matrix operations C := alpha*op( A )*op( B ) + beta*C, where op( X ) is one of op( X ) = X or op( X ) = X', alpha and beta are scalars, and A, B and C are matrices, with op( A ) an m by k matrix, op( B ) a k by n matrix and C an m by n matrix. Parameters ========== TRANSA - CHARACTER*1. On entry, TRANSA specifies the form of op( A ) to be used in the matrix multiplication as follows: TRANSA = 'N' or 'n', op( A ) = A. TRANSA = 'T' or 't', op( A ) = A'. TRANSA = 'C' or 'c', op( A ) = A'. Unchanged on exit. TRANSB - CHARACTER*1. On entry, TRANSB specifies the form of op( B ) to be used in the matrix multiplication as follows: TRANSB = 'N' or 'n', op( B ) = B. TRANSB = 'T' or 't', op( B ) = B'. TRANSB = 'C' or 'c', op( B ) = B'. Unchanged on exit. M - INTEGER. On entry, M specifies the number of rows of the matrix op( A ) and of the matrix C. M must be at least zero. Unchanged on exit. N - INTEGER. On entry, N specifies the number of columns of the matrix op( B ) and the number of columns of the matrix C. N must be at least zero. Unchanged on exit. K - INTEGER. On entry, K specifies the number of columns of the matrix op( A ) and the number of rows of the matrix op( B ). K must be at least zero. Unchanged on exit. ALPHA - DOUBLE PRECISION. On entry, ALPHA specifies the scalar alpha. Unchanged on exit. A - DOUBLE PRECISION array of DIMENSION ( LDA, ka ), where ka is k when TRANSA = 'N' or 'n', and is m otherwise. Before entry with TRANSA = 'N' or 'n', the leading m by k part of the array A must contain the matrix A, otherwise the leading k by m part of the array A must contain the matrix A. Unchanged on exit. LDA - INTEGER. On entry, LDA specifies the first dimension of A as declared in the calling (sub) program. When TRANSA = 'N' or 'n' then LDA must be at least max( 1, m ), otherwise LDA must be at least max( 1, k ). Unchanged on exit. B - DOUBLE PRECISION array of DIMENSION ( LDB, kb ), where kb is n when TRANSB = 'N' or 'n', and is k otherwise. Before entry with TRANSB = 'N' or 'n', the leading k by n part of the array B must contain the matrix B, otherwise the leading n by k part of the array B must contain the matrix B. Unchanged on exit. LDB - INTEGER. On entry, LDB specifies the first dimension of B as declared in the calling (sub) program. When TRANSB = 'N' or 'n' then LDB must be at least max( 1, k ), otherwise LDB must be at least max( 1, n ). Unchanged on exit. BETA - DOUBLE PRECISION. On entry, BETA specifies the scalar beta. When BETA is supplied as zero then C need not be set on input. Unchanged on exit. C - DOUBLE PRECISION array of DIMENSION ( LDC, n ). Before entry, the leading m by n part of the array C must contain the matrix C, except when beta is zero, in which case C need not be set on entry. On exit, the array C is overwritten by the m by n matrix ( alpha*op( A )*op( B ) + beta*C ). LDC - INTEGER. On entry, LDC specifies the first dimension of C as declared in the calling (sub) program. LDC must be at least max( 1, m ). Unchanged on exit. Level 3 Blas routine. -- Written on 8-February-1989. Jack Dongarra, Argonne National Laboratory. Iain Duff, AERE Harwell. Jeremy Du Croz, Numerical Algorithms Group Ltd. Sven Hammarling, Numerical Algorithms Group Ltd. Set NOTA and NOTB as true if A and B respectively are not transposed and set NROWA, NCOLA and NROWB as the number of rows and columns of A and the number of rows of B respectively. Parameter adjustments Function Body */ #define A(I,J) a[(I)-1 + ((J)-1)* ( *lda)] #define B(I,J) b[(I)-1 + ((J)-1)* ( *ldb)] #define C(I,J) c[(I)-1 + ((J)-1)* ( *ldc)] nota = lsame_(transa, "N"); notb = lsame_(transb, "N"); if (nota) { nrowa = *m; } else { nrowa = *k; } if (notb) { nrowb = *k; } else { nrowb = *n; } /* Test the input parameters. */ info = 0; if (! nota && ! lsame_(transa, "C") && ! lsame_(transa, "T")) { info = 1; } else if (! notb && ! lsame_(transb, "C") && ! lsame_(transb, "T")) { info = 2; } else if (*m < 0) { info = 3; } else if (*n < 0) { info = 4; } else if (*k < 0) { info = 5; } else if (*lda < max(1,nrowa)) { info = 8; } else if (*ldb < max(1,nrowb)) { info = 10; } else if (*ldc < max(1,*m)) { info = 13; } if (info != 0) { xerbla_("DGEMM ", &info); return 0; } /* Quick return if possible. */ if (*m == 0 || *n == 0 || ((*alpha == 0. || *k == 0) && (*beta == 1.))) { return 0; } /* And if alpha.eq.zero. */ if (*alpha == 0.) { if (*beta == 0.) { for (j = 1; j <= *n; ++j) { for (i = 1; i <= *m; ++i) { C(i,j) = 0.; /* L10: */ } /* L20: */ } } else { for (j = 1; j <= *n; ++j) { for (i = 1; i <= *m; ++i) { C(i,j) = *beta * C(i,j); /* L30: */ } /* L40: */ } } return 0; } /* Start the operations. */ if (notb) { if (nota) { /* Form C := alpha*A*B + beta*C. */ for (j = 1; j <= *n; ++j) { if (*beta == 0.) { for (i = 1; i <= *m; ++i) { C(i,j) = 0.; /* L50: */ } } else if (*beta != 1.) { for (i = 1; i <= *m; ++i) { C(i,j) = *beta * C(i,j); /* L60: */ } } for (l = 1; l <= *k; ++l) { if (B(l,j) != 0.) { temp = *alpha * B(l,j); for (i = 1; i <= *m; ++i) { C(i,j) += temp * A(i,l); /* L70: */ } } /* L80: */ } /* L90: */ } } else { /* Form C := alpha*A'*B + beta*C */ for (j = 1; j <= *n; ++j) { for (i = 1; i <= *m; ++i) { temp = 0.; for (l = 1; l <= *k; ++l) { temp += A(l,i) * B(l,j); /* L100: */ } if (*beta == 0.) { C(i,j) = *alpha * temp; } else { C(i,j) = *alpha * temp + *beta * C(i,j); } /* L110: */ } /* L120: */ } } } else { if (nota) { /* Form C := alpha*A*B' + beta*C */ for (j = 1; j <= *n; ++j) { if (*beta == 0.) { for (i = 1; i <= *m; ++i) { C(i,j) = 0.; /* L130: */ } } else if (*beta != 1.) { for (i = 1; i <= *m; ++i) { C(i,j) = *beta * C(i,j); /* L140: */ } } for (l = 1; l <= *k; ++l) { if (B(j,l) != 0.) { temp = *alpha * B(j,l); for (i = 1; i <= *m; ++i) { C(i,j) += temp * A(i,l); /* L150: */ } } /* L160: */ } /* L170: */ } } else { /* Form C := alpha*A'*B' + beta*C */ for (j = 1; j <= *n; ++j) { for (i = 1; i <= *m; ++i) { temp = 0.; for (l = 1; l <= *k; ++l) { temp += A(l,i) * B(j,l); /* L180: */ } if (*beta == 0.) { C(i,j) = *alpha * temp; } else { C(i,j) = *alpha * temp + *beta * C(i,j); } /* L190: */ } /* L200: */ } } } return 0; /* End of DGEMM . */ } /* dgemm_ */ #ifdef __cplusplus } #endif hypre-2.33.0/src/blas/dgemv.c000066400000000000000000000150461477326011500157200ustar00rootroot00000000000000/* Copyright (c) 1992-2008 The University of Tennessee. All rights reserved. * See file COPYING in this directory for details. */ #ifdef __cplusplus extern "C" { #endif /* -- translated by f2c (version 19940927). You must link the resulting object file with the libraries: -lf2c -lm (in that order) */ #include "f2c.h" #include "hypre_blas.h" /* Subroutine */ integer dgemv_(const char *trans, integer *m, integer *n, doublereal * alpha, doublereal *a, integer *lda, doublereal *x, integer *incx, doublereal *beta, doublereal *y, integer *incy) { /* System generated locals */ /* Local variables */ integer info; doublereal temp; integer lenx, leny, i, j; extern logical lsame_(const char *,const char *); integer ix, iy, jx, jy, kx, ky; extern /* Subroutine */ integer xerbla_(const char *, integer *); /* Purpose ======= DGEMV performs one of the matrix-vector operations y := alpha*A*x + beta*y, or y := alpha*A'*x + beta*y, where alpha and beta are scalars, x and y are vectors and A is an m by n matrix. Parameters ========== TRANS - CHARACTER*1. On entry, TRANS specifies the operation to be performed as follows: TRANS = 'N' or 'n' y := alpha*A*x + beta*y. TRANS = 'T' or 't' y := alpha*A'*x + beta*y. TRANS = 'C' or 'c' y := alpha*A'*x + beta*y. Unchanged on exit. M - INTEGER. On entry, M specifies the number of rows of the matrix A. M must be at least zero. Unchanged on exit. N - INTEGER. On entry, N specifies the number of columns of the matrix A. N must be at least zero. Unchanged on exit. ALPHA - DOUBLE PRECISION. On entry, ALPHA specifies the scalar alpha. Unchanged on exit. A - DOUBLE PRECISION array of DIMENSION ( LDA, n ). Before entry, the leading m by n part of the array A must contain the matrix of coefficients. Unchanged on exit. LDA - INTEGER. On entry, LDA specifies the first dimension of A as declared in the calling (sub) program. LDA must be at least max( 1, m ). Unchanged on exit. X - DOUBLE PRECISION array of DIMENSION at least ( 1 + ( n - 1 )*abs( INCX ) ) when TRANS = 'N' or 'n' and at least ( 1 + ( m - 1 )*abs( INCX ) ) otherwise. Before entry, the incremented array X must contain the vector x. Unchanged on exit. INCX - INTEGER. On entry, INCX specifies the increment for the elements of X. INCX must not be zero. Unchanged on exit. BETA - DOUBLE PRECISION. On entry, BETA specifies the scalar beta. When BETA is supplied as zero then Y need not be set on input. Unchanged on exit. Y - DOUBLE PRECISION array of DIMENSION at least ( 1 + ( m - 1 )*abs( INCY ) ) when TRANS = 'N' or 'n' and at least ( 1 + ( n - 1 )*abs( INCY ) ) otherwise. Before entry with BETA non-zero, the incremented array Y must contain the vector y. On exit, Y is overwritten by the updated vector y. INCY - INTEGER. On entry, INCY specifies the increment for the elements of Y. INCY must not be zero. Unchanged on exit. Level 2 Blas routine. -- Written on 22-October-1986. Jack Dongarra, Argonne National Lab. Jeremy Du Croz, Nag Central Office. Sven Hammarling, Nag Central Office. Richard Hanson, Sandia National Labs. Test the input parameters. Parameter adjustments Function Body */ #define X(I) x[(I)-1] #define Y(I) y[(I)-1] #define A(I,J) a[(I)-1 + ((J)-1)* ( *lda)] info = 0; if (! lsame_(trans, "N") && ! lsame_(trans, "T") && ! lsame_(trans, "C")) { info = 1; } else if (*m < 0) { info = 2; } else if (*n < 0) { info = 3; } else if (*lda < max(1,*m)) { info = 6; } else if (*incx == 0) { info = 8; } else if (*incy == 0) { info = 11; } if (info != 0) { xerbla_("DGEMV ", &info); return 0; } /* Quick return if possible. */ if (*m == 0 || *n == 0 || ((*alpha == 0.) && (*beta == 1.))) { return 0; } /* Set LENX and LENY, the lengths of the vectors x and y, and set up the start points in X and Y. */ if (lsame_(trans, "N")) { lenx = *n; leny = *m; } else { lenx = *m; leny = *n; } if (*incx > 0) { kx = 1; } else { kx = 1 - (lenx - 1) * *incx; } if (*incy > 0) { ky = 1; } else { ky = 1 - (leny - 1) * *incy; } /* Start the operations. In this version the elements of A are accessed sequentially with one pass through A. First form y := beta*y. */ if (*beta != 1.) { if (*incy == 1) { if (*beta == 0.) { for (i = 1; i <= leny; ++i) { Y(i) = 0.; /* L10: */ } } else { for (i = 1; i <= leny; ++i) { Y(i) = *beta * Y(i); /* L20: */ } } } else { iy = ky; if (*beta == 0.) { for (i = 1; i <= leny; ++i) { Y(iy) = 0.; iy += *incy; /* L30: */ } } else { for (i = 1; i <= leny; ++i) { Y(iy) = *beta * Y(iy); iy += *incy; /* L40: */ } } } } if (*alpha == 0.) { return 0; } if (lsame_(trans, "N")) { /* Form y := alpha*A*x + y. */ jx = kx; if (*incy == 1) { for (j = 1; j <= *n; ++j) { if (X(jx) != 0.) { temp = *alpha * X(jx); for (i = 1; i <= *m; ++i) { Y(i) += temp * A(i,j); /* L50: */ } } jx += *incx; /* L60: */ } } else { for (j = 1; j <= *n; ++j) { if (X(jx) != 0.) { temp = *alpha * X(jx); iy = ky; for (i = 1; i <= *m; ++i) { Y(iy) += temp * A(i,j); iy += *incy; /* L70: */ } } jx += *incx; /* L80: */ } } } else { /* Form y := alpha*A'*x + y. */ jy = ky; if (*incx == 1) { for (j = 1; j <= *n; ++j) { temp = 0.; for (i = 1; i <= *m; ++i) { temp += A(i,j) * X(i); /* L90: */ } Y(jy) += *alpha * temp; jy += *incy; /* L100: */ } } else { for (j = 1; j <= *n; ++j) { temp = 0.; ix = kx; for (i = 1; i <= *m; ++i) { temp += A(i,j) * X(ix); ix += *incx; /* L110: */ } Y(jy) += *alpha * temp; jy += *incy; /* L120: */ } } } return 0; /* End of DGEMV . */ } /* dgemv_ */ #ifdef __cplusplus } #endif hypre-2.33.0/src/blas/dger.c000066400000000000000000000103711477326011500155330ustar00rootroot00000000000000/* Copyright (c) 1992-2008 The University of Tennessee. All rights reserved. * See file COPYING in this directory for details. */ #ifdef __cplusplus extern "C" { #endif #include "f2c.h" #include "hypre_blas.h" /* Subroutine */ integer dger_(integer *m, integer *n, doublereal *alpha, doublereal *x, integer *incx, doublereal *y, integer *incy, doublereal *a, integer *lda) { /* System generated locals */ integer a_dim1, a_offset, i__1, i__2; /* Local variables */ integer info; doublereal temp; integer i__, j, ix, jy, kx; extern /* Subroutine */ integer xerbla_(const char *, integer *); #define a_ref(a_1,a_2) a[(a_2)*a_dim1 + a_1] /* Purpose ======= DGER performs the rank 1 operation A := alpha*x*y' + A, where alpha is a scalar, x is an m element vector, y is an n element vector and A is an m by n matrix. Parameters ========== M - INTEGER. On entry, M specifies the number of rows of the matrix A. M must be at least zero. Unchanged on exit. N - INTEGER. On entry, N specifies the number of columns of the matrix A. N must be at least zero. Unchanged on exit. ALPHA - DOUBLE PRECISION. On entry, ALPHA specifies the scalar alpha. Unchanged on exit. X - DOUBLE PRECISION array of dimension at least ( 1 + ( m - 1 )*abs( INCX ) ). Before entry, the incremented array X must contain the m element vector x. Unchanged on exit. INCX - INTEGER. On entry, INCX specifies the increment for the elements of X. INCX must not be zero. Unchanged on exit. Y - DOUBLE PRECISION array of dimension at least ( 1 + ( n - 1 )*abs( INCY ) ). Before entry, the incremented array Y must contain the n element vector y. Unchanged on exit. INCY - INTEGER. On entry, INCY specifies the increment for the elements of Y. INCY must not be zero. Unchanged on exit. A - DOUBLE PRECISION array of DIMENSION ( LDA, n ). Before entry, the leading m by n part of the array A must contain the matrix of coefficients. On exit, A is overwritten by the updated matrix. LDA - INTEGER. On entry, LDA specifies the first dimension of A as declared in the calling (sub) program. LDA must be at least max( 1, m ). Unchanged on exit. Level 2 Blas routine. -- Written on 22-October-1986. Jack Dongarra, Argonne National Lab. Jeremy Du Croz, Nag Central Office. Sven Hammarling, Nag Central Office. Richard Hanson, Sandia National Labs. Test the input parameters. Parameter adjustments */ --x; --y; a_dim1 = *lda; a_offset = 1 + a_dim1 * 1; a -= a_offset; /* Function Body */ info = 0; if (*m < 0) { info = 1; } else if (*n < 0) { info = 2; } else if (*incx == 0) { info = 5; } else if (*incy == 0) { info = 7; } else if (*lda < max(1,*m)) { info = 9; } if (info != 0) { xerbla_("DGER ", &info); return 0; } /* Quick return if possible. */ if (*m == 0 || *n == 0 || *alpha == 0.) { return 0; } /* Start the operations. In this version the elements of A are accessed sequentially with one pass through A. */ if (*incy > 0) { jy = 1; } else { jy = 1 - (*n - 1) * *incy; } if (*incx == 1) { i__1 = *n; for (j = 1; j <= i__1; ++j) { if (y[jy] != 0.) { temp = *alpha * y[jy]; i__2 = *m; for (i__ = 1; i__ <= i__2; ++i__) { a_ref(i__, j) = a_ref(i__, j) + x[i__] * temp; /* L10: */ } } jy += *incy; /* L20: */ } } else { if (*incx > 0) { kx = 1; } else { kx = 1 - (*m - 1) * *incx; } i__1 = *n; for (j = 1; j <= i__1; ++j) { if (y[jy] != 0.) { temp = *alpha * y[jy]; ix = kx; i__2 = *m; for (i__ = 1; i__ <= i__2; ++i__) { a_ref(i__, j) = a_ref(i__, j) + x[ix] * temp; ix += *incx; /* L30: */ } } jy += *incy; /* L40: */ } } return 0; /* End of DGER . */ } /* dger_ */ #undef a_ref #ifdef __cplusplus } #endif hypre-2.33.0/src/blas/dnrm2.c000066400000000000000000000121041477326011500156300ustar00rootroot00000000000000/* Copyright (c) 1992-2008 The University of Tennessee. All rights reserved. * See file COPYING in this directory for details. */ #ifdef __cplusplus extern "C" { #endif /* dnrm2.f -- translated by f2c (version 19960315). You must link the resulting object file with the libraries: -lf2c -lm (in that order) */ #include "f2c.h" #include "hypre_blas.h" doublereal dnrm2_(integer*n,doublereal* dx,integer* incx) { /* Initialized data */ doublereal zero = 0.; doublereal one = 1.; doublereal cutlo = 8.232e-11; doublereal cuthi = 1.304e19; /* Format strings */ /* System generated locals */ integer i__1; doublereal ret_val, d__1; /* Builtin functions */ /*doublereal sqrt(doublereal);*/ /* Local variables */ doublereal xmax = zero; integer next, i__, j, ix; doublereal hitest, sum; /* Parameter adjustments */ --dx; /* Function Body */ /* euclidean norm of the n-vector stored in dx() with storage */ /* increment incx . */ /* if n .le. 0 return with result = 0. */ /* if n .ge. 1 then incx must be .ge. 1 */ /* c.l.lawson, 1978 jan 08 */ /* modified to correct failure to update ix, 1/25/92. */ /* modified 3/93 to return if incx .le. 0. */ /* four phase method using two built-in constants that are */ /* hopefully applicable to all machines. */ /* cutlo = maximum of dsqrt(u/eps) over all known machines. */ /* cuthi = minimum of dsqrt(v) over all known machines. */ /* where */ /* eps = smallest no. such that eps + 1. .gt. 1. */ /* u = smallest positive no. (underflow limit) */ /* v = largest no. (overflow limit) */ /* brief outline of algorithm.. */ /* phase 1 scans zero components. */ /* move to phase 2 when a component is nonzero and .le. cutlo */ /* move to phase 3 when a component is .gt. cutlo */ /* move to phase 4 when a component is .ge. cuthi/m */ /* where m = n for x() real and m = 2*n for complex. */ /* values for cutlo and cuthi.. */ /* from the environmental parameters listed in the imsl converter */ /* document the limiting values are as follows.. */ /* cutlo, s.p. u/eps = 2**(-102) for honeywell. close seconds are */ /* univac and dec at 2**(-103) */ /* thus cutlo = 2**(-51) = 4.44089e-16 */ /* cuthi, s.p. v = 2**127 for univac, honeywell, and dec. */ /* thus cuthi = 2**(63.5) = 1.30438e19 */ /* cutlo, d.p. u/eps = 2**(-67) for honeywell and dec. */ /* thus cutlo = 2**(-33.5) = 8.23181d-11 */ /* cuthi, d.p. same as s.p. cuthi = 1.30438d19 */ /* data cutlo, cuthi / 8.232d-11, 1.304d19 / */ /* data cutlo, cuthi / 4.441e-16, 1.304e19 / */ if (*n > 0 && *incx > 0) { goto L10; } ret_val = zero; goto L300; L10: next = 0; sum = zero; i__ = 1; ix = 1; /* begin main loop */ L20: switch ((integer)next) { case 0: goto L30; case 1: goto L50; case 2: goto L70; case 3: goto L110; } L30: if ((d__1 = dx[i__], abs(d__1)) > cutlo) { goto L85; } next = 1; xmax = zero; /* phase 1. sum is zero */ L50: if (dx[i__] == zero) { goto L200; } if ((d__1 = dx[i__], abs(d__1)) > cutlo) { goto L85; } /* prepare for phase 2. */ next = 2; goto L105; /* prepare for phase 4. */ L100: ix = j; next = 3; sum = sum / dx[i__] / dx[i__]; L105: xmax = (d__1 = dx[i__], abs(d__1)); goto L115; /* phase 2. sum is small. */ /* scale to avoid destructive underflow. */ L70: if ((d__1 = dx[i__], abs(d__1)) > cutlo) { goto L75; } /* common code for phases 2 and 4. */ /* in phase 4 sum is large. scale to avoid overflow. */ L110: if ((d__1 = dx[i__], abs(d__1)) <= xmax) { goto L115; } /* Computing 2nd power */ d__1 = xmax / dx[i__]; sum = one + sum * (d__1 * d__1); xmax = (d__1 = dx[i__], abs(d__1)); goto L200; L115: /* Computing 2nd power */ d__1 = dx[i__] / xmax; sum += d__1 * d__1; goto L200; /* prepare for phase 3. */ L75: sum = sum * xmax * xmax; /* for real or d.p. set hitest = cuthi/n */ /* for complex set hitest = cuthi/(2*n) */ L85: hitest = cuthi / (doublereal) (*n); /* phase 3. sum is mid-range. no scaling. */ i__1 = *n; for (j = ix; j <= i__1; ++j) { if ((d__1 = dx[i__], abs(d__1)) >= hitest) { goto L100; } /* Computing 2nd power */ d__1 = dx[i__]; sum += d__1 * d__1; i__ += *incx; /* L95: */ } ret_val = sqrt(sum); goto L300; L200: ++ix; i__ += *incx; if (ix <= *n) { goto L20; } /* end of main loop. */ /* compute square root and adjust for scaling. */ ret_val = xmax * sqrt(sum); L300: return ret_val; } /* dnrm2_ */ #ifdef __cplusplus } #endif hypre-2.33.0/src/blas/drot.c000066400000000000000000000031301477326011500155550ustar00rootroot00000000000000/* Copyright (c) 1992-2008 The University of Tennessee. All rights reserved. * See file COPYING in this directory for details. */ #ifdef __cplusplus extern "C" { #endif /* -- translated by f2c (version 19940927). You must link the resulting object file with the libraries: -lf2c -lm (in that order) */ #include "f2c.h" #include "hypre_blas.h" /* Subroutine */ integer drot_(integer *n, doublereal *dx, integer *incx, doublereal *dy, integer *incy, doublereal *c, doublereal *s) { /* System generated locals */ /* Local variables */ integer i; doublereal dtemp; integer ix, iy; /* applies a plane rotation. jack dongarra, linpack, 3/11/78. modified 12/3/93, array(1) declarations changed to array(*) Parameter adjustments Function Body */ #define DY(I) dy[(I)-1] #define DX(I) dx[(I)-1] if (*n <= 0) { return 0; } if (*incx == 1 && *incy == 1) { goto L20; } /* code for unequal increments or equal increments not equal to 1 */ ix = 1; iy = 1; if (*incx < 0) { ix = (-(*n) + 1) * *incx + 1; } if (*incy < 0) { iy = (-(*n) + 1) * *incy + 1; } for (i = 1; i <= *n; ++i) { dtemp = *c * DX(ix) + *s * DY(iy); DY(iy) = *c * DY(iy) - *s * DX(ix); DX(ix) = dtemp; ix += *incx; iy += *incy; /* L10: */ } return 0; /* code for both increments equal to 1 */ L20: for (i = 1; i <= *n; ++i) { dtemp = *c * DX(i) + *s * DY(i); DY(i) = *c * DY(i) - *s * DX(i); DX(i) = dtemp; /* L30: */ } return 0; } /* drot_ */ #ifdef __cplusplus } #endif hypre-2.33.0/src/blas/dscal.c000066400000000000000000000031741477326011500157030ustar00rootroot00000000000000/* Copyright (c) 1992-2008 The University of Tennessee. All rights reserved. * See file COPYING in this directory for details. */ #ifdef __cplusplus extern "C" { #endif /* -- translated by f2c (version 19940927). You must link the resulting object file with the libraries: -lf2c -lm (in that order) */ #include "f2c.h" #include "hypre_blas.h" /* Subroutine */ integer dscal_(integer *n, doublereal *da, doublereal *dx, integer *incx) { /* System generated locals */ /* Local variables */ integer i, m, nincx, mp1; /* scales a vector by a constant. uses unrolled loops for increment equal to one. jack dongarra, linpack, 3/11/78. modified 3/93 to return if incx .le. 0. modified 12/3/93, array(1) declarations changed to array(*) Parameter adjustments Function Body */ #define DX(I) dx[(I)-1] if (*n <= 0 || *incx <= 0) { return 0; } if (*incx == 1) { goto L20; } /* code for increment not equal to 1 */ nincx = *n * *incx; for (i = 1; *incx < 0 ? i >= nincx : i <= nincx; i += *incx) { DX(i) = *da * DX(i); /* L10: */ } return 0; /* code for increment equal to 1 clean-up loop */ L20: m = *n % 5; if (m == 0) { goto L40; } for (i = 1; i <= m; ++i) { DX(i) = *da * DX(i); /* L30: */ } if (*n < 5) { return 0; } L40: mp1 = m + 1; for (i = mp1; i <= *n; i += 5) { DX(i) = *da * DX(i); DX(i + 1) = *da * DX(i + 1); DX(i + 2) = *da * DX(i + 2); DX(i + 3) = *da * DX(i + 3); DX(i + 4) = *da * DX(i + 4); /* L50: */ } return 0; } /* dscal_ */ #ifdef __cplusplus } #endif hypre-2.33.0/src/blas/dswap.c000066400000000000000000000035111477326011500157260ustar00rootroot00000000000000/* Copyright (c) 1992-2008 The University of Tennessee. All rights reserved. * See file COPYING in this directory for details. */ #ifdef __cplusplus extern "C" { #endif #include "f2c.h" #include "hypre_blas.h" /* Subroutine */ integer dswap_(integer *n, doublereal *dx, integer *incx, doublereal *dy, integer *incy) { /* System generated locals */ integer i__1; /* Local variables */ integer i__, m; doublereal dtemp; integer ix, iy, mp1; /* interchanges two vectors. uses unrolled loops for increments equal one. jack dongarra, linpack, 3/11/78. modified 12/3/93, array(1) declarations changed to array(*) Parameter adjustments */ --dy; --dx; /* Function Body */ if (*n <= 0) { return 0; } if (*incx == 1 && *incy == 1) { goto L20; } /* code for unequal increments or equal increments not equal to 1 */ ix = 1; iy = 1; if (*incx < 0) { ix = (-(*n) + 1) * *incx + 1; } if (*incy < 0) { iy = (-(*n) + 1) * *incy + 1; } i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { dtemp = dx[ix]; dx[ix] = dy[iy]; dy[iy] = dtemp; ix += *incx; iy += *incy; /* L10: */ } return 0; /* code for both increments equal to 1 clean-up loop */ L20: m = *n % 3; if (m == 0) { goto L40; } i__1 = m; for (i__ = 1; i__ <= i__1; ++i__) { dtemp = dx[i__]; dx[i__] = dy[i__]; dy[i__] = dtemp; /* L30: */ } if (*n < 3) { return 0; } L40: mp1 = m + 1; i__1 = *n; for (i__ = mp1; i__ <= i__1; i__ += 3) { dtemp = dx[i__]; dx[i__] = dy[i__]; dy[i__] = dtemp; dtemp = dx[i__ + 1]; dx[i__ + 1] = dy[i__ + 1]; dy[i__ + 1] = dtemp; dtemp = dx[i__ + 2]; dx[i__ + 2] = dy[i__ + 2]; dy[i__ + 2] = dtemp; /* L50: */ } return 0; } /* dswap_ */ #ifdef __cplusplus } #endif hypre-2.33.0/src/blas/dsymm.c000066400000000000000000000231121477326011500157400ustar00rootroot00000000000000/* Copyright (c) 1992-2008 The University of Tennessee. All rights reserved. * See file COPYING in this directory for details. */ #ifdef __cplusplus extern "C" { #endif #include "f2c.h" #include "hypre_blas.h" /* Subroutine */ integer dsymm_(const char *side,const char *uplo, integer *m, integer *n, doublereal *alpha, doublereal *a, integer *lda, doublereal *b, integer *ldb, doublereal *beta, doublereal *c__, integer *ldc) { /* System generated locals */ integer a_dim1, a_offset, b_dim1, b_offset, c_dim1, c_offset, i__1, i__2, i__3; /* Local variables */ integer info; doublereal temp1, temp2; integer i__, j, k; extern logical lsame_(const char *,const char *); integer nrowa; logical upper; extern /* Subroutine */ integer xerbla_(const char *, integer *); #define a_ref(a_1,a_2) a[(a_2)*a_dim1 + a_1] #define b_ref(a_1,a_2) b[(a_2)*b_dim1 + a_1] #define c___ref(a_1,a_2) c__[(a_2)*c_dim1 + a_1] /* Purpose ======= DSYMM performs one of the matrix-matrix operations C := alpha*A*B + beta*C, or C := alpha*B*A + beta*C, where alpha and beta are scalars, A is a symmetric matrix and B and C are m by n matrices. Parameters ========== SIDE - CHARACTER*1. On entry, SIDE specifies whether the symmetric matrix A appears on the left or right in the operation as follows: SIDE = 'L' or 'l' C := alpha*A*B + beta*C, SIDE = 'R' or 'r' C := alpha*B*A + beta*C, Unchanged on exit. UPLO - CHARACTER*1. On entry, UPLO specifies whether the upper or lower triangular part of the symmetric matrix A is to be referenced as follows: UPLO = 'U' or 'u' Only the upper triangular part of the symmetric matrix is to be referenced. UPLO = 'L' or 'l' Only the lower triangular part of the symmetric matrix is to be referenced. Unchanged on exit. M - INTEGER. On entry, M specifies the number of rows of the matrix C. M must be at least zero. Unchanged on exit. N - INTEGER. On entry, N specifies the number of columns of the matrix C. N must be at least zero. Unchanged on exit. ALPHA - DOUBLE PRECISION. On entry, ALPHA specifies the scalar alpha. Unchanged on exit. A - DOUBLE PRECISION array of DIMENSION ( LDA, ka ), where ka is m when SIDE = 'L' or 'l' and is n otherwise. Before entry with SIDE = 'L' or 'l', the m by m part of the array A must contain the symmetric matrix, such that when UPLO = 'U' or 'u', the leading m by m upper triangular part of the array A must contain the upper triangular part of the symmetric matrix and the strictly lower triangular part of A is not referenced, and when UPLO = 'L' or 'l', the leading m by m lower triangular part of the array A must contain the lower triangular part of the symmetric matrix and the strictly upper triangular part of A is not referenced. Before entry with SIDE = 'R' or 'r', the n by n part of the array A must contain the symmetric matrix, such that when UPLO = 'U' or 'u', the leading n by n upper triangular part of the array A must contain the upper triangular part of the symmetric matrix and the strictly lower triangular part of A is not referenced, and when UPLO = 'L' or 'l', the leading n by n lower triangular part of the array A must contain the lower triangular part of the symmetric matrix and the strictly upper triangular part of A is not referenced. Unchanged on exit. LDA - INTEGER. On entry, LDA specifies the first dimension of A as declared in the calling (sub) program. When SIDE = 'L' or 'l' then LDA must be at least max( 1, m ), otherwise LDA must be at least max( 1, n ). Unchanged on exit. B - DOUBLE PRECISION array of DIMENSION ( LDB, n ). Before entry, the leading m by n part of the array B must contain the matrix B. Unchanged on exit. LDB - INTEGER. On entry, LDB specifies the first dimension of B as declared in the calling (sub) program. LDB must be at least max( 1, m ). Unchanged on exit. BETA - DOUBLE PRECISION. On entry, BETA specifies the scalar beta. When BETA is supplied as zero then C need not be set on input. Unchanged on exit. C - DOUBLE PRECISION array of DIMENSION ( LDC, n ). Before entry, the leading m by n part of the array C must contain the matrix C, except when beta is zero, in which case C need not be set on entry. On exit, the array C is overwritten by the m by n updated matrix. LDC - INTEGER. On entry, LDC specifies the first dimension of C as declared in the calling (sub) program. LDC must be at least max( 1, m ). Unchanged on exit. Level 3 Blas routine. -- Written on 8-February-1989. Jack Dongarra, Argonne National Laboratory. Iain Duff, AERE Harwell. Jeremy Du Croz, Numerical Algorithms Group Ltd. Sven Hammarling, Numerical Algorithms Group Ltd. Set NROWA as the number of rows of A. Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1 * 1; a -= a_offset; b_dim1 = *ldb; b_offset = 1 + b_dim1 * 1; b -= b_offset; c_dim1 = *ldc; c_offset = 1 + c_dim1 * 1; c__ -= c_offset; /* Function Body */ if (lsame_(side, "L")) { nrowa = *m; } else { nrowa = *n; } upper = lsame_(uplo, "U"); /* Test the input parameters. */ info = 0; if (! lsame_(side, "L") && ! lsame_(side, "R")) { info = 1; } else if (! upper && ! lsame_(uplo, "L")) { info = 2; } else if (*m < 0) { info = 3; } else if (*n < 0) { info = 4; } else if (*lda < max(1,nrowa)) { info = 7; } else if (*ldb < max(1,*m)) { info = 9; } else if (*ldc < max(1,*m)) { info = 12; } if (info != 0) { xerbla_("DSYMM ", &info); return 0; } /* Quick return if possible. */ if ((*m == 0 || *n == 0) || (*alpha == 0. && *beta == 1.)) { return 0; } /* And when alpha.eq.zero. */ if (*alpha == 0.) { if (*beta == 0.) { i__1 = *n; for (j = 1; j <= i__1; ++j) { i__2 = *m; for (i__ = 1; i__ <= i__2; ++i__) { c___ref(i__, j) = 0.; /* L10: */ } /* L20: */ } } else { i__1 = *n; for (j = 1; j <= i__1; ++j) { i__2 = *m; for (i__ = 1; i__ <= i__2; ++i__) { c___ref(i__, j) = *beta * c___ref(i__, j); /* L30: */ } /* L40: */ } } return 0; } /* Start the operations. */ if (lsame_(side, "L")) { /* Form C := alpha*A*B + beta*C. */ if (upper) { i__1 = *n; for (j = 1; j <= i__1; ++j) { i__2 = *m; for (i__ = 1; i__ <= i__2; ++i__) { temp1 = *alpha * b_ref(i__, j); temp2 = 0.; i__3 = i__ - 1; for (k = 1; k <= i__3; ++k) { c___ref(k, j) = c___ref(k, j) + temp1 * a_ref(k, i__); temp2 += b_ref(k, j) * a_ref(k, i__); /* L50: */ } if (*beta == 0.) { c___ref(i__, j) = temp1 * a_ref(i__, i__) + *alpha * temp2; } else { c___ref(i__, j) = *beta * c___ref(i__, j) + temp1 * a_ref(i__, i__) + *alpha * temp2; } /* L60: */ } /* L70: */ } } else { i__1 = *n; for (j = 1; j <= i__1; ++j) { for (i__ = *m; i__ >= 1; --i__) { temp1 = *alpha * b_ref(i__, j); temp2 = 0.; i__2 = *m; for (k = i__ + 1; k <= i__2; ++k) { c___ref(k, j) = c___ref(k, j) + temp1 * a_ref(k, i__); temp2 += b_ref(k, j) * a_ref(k, i__); /* L80: */ } if (*beta == 0.) { c___ref(i__, j) = temp1 * a_ref(i__, i__) + *alpha * temp2; } else { c___ref(i__, j) = *beta * c___ref(i__, j) + temp1 * a_ref(i__, i__) + *alpha * temp2; } /* L90: */ } /* L100: */ } } } else { /* Form C := alpha*B*A + beta*C. */ i__1 = *n; for (j = 1; j <= i__1; ++j) { temp1 = *alpha * a_ref(j, j); if (*beta == 0.) { i__2 = *m; for (i__ = 1; i__ <= i__2; ++i__) { c___ref(i__, j) = temp1 * b_ref(i__, j); /* L110: */ } } else { i__2 = *m; for (i__ = 1; i__ <= i__2; ++i__) { c___ref(i__, j) = *beta * c___ref(i__, j) + temp1 * b_ref( i__, j); /* L120: */ } } i__2 = j - 1; for (k = 1; k <= i__2; ++k) { if (upper) { temp1 = *alpha * a_ref(k, j); } else { temp1 = *alpha * a_ref(j, k); } i__3 = *m; for (i__ = 1; i__ <= i__3; ++i__) { c___ref(i__, j) = c___ref(i__, j) + temp1 * b_ref(i__, k); /* L130: */ } /* L140: */ } i__2 = *n; for (k = j + 1; k <= i__2; ++k) { if (upper) { temp1 = *alpha * a_ref(j, k); } else { temp1 = *alpha * a_ref(k, j); } i__3 = *m; for (i__ = 1; i__ <= i__3; ++i__) { c___ref(i__, j) = c___ref(i__, j) + temp1 * b_ref(i__, k); /* L150: */ } /* L160: */ } /* L170: */ } } return 0; /* End of DSYMM . */ } /* dsymm_ */ #undef c___ref #undef b_ref #undef a_ref #ifdef __cplusplus } #endif hypre-2.33.0/src/blas/dsymv.c000066400000000000000000000156231477326011500157610ustar00rootroot00000000000000/* Copyright (c) 1992-2008 The University of Tennessee. All rights reserved. * See file COPYING in this directory for details. */ #ifdef __cplusplus extern "C" { #endif /* -- translated by f2c (version 19940927). You must link the resulting object file with the libraries: -lf2c -lm (in that order) */ #include "f2c.h" #include "hypre_blas.h" /* Subroutine */ integer dsymv_(const char *uplo, integer *n, doublereal *alpha, doublereal *a, integer *lda, doublereal *x, integer *incx, doublereal *beta, doublereal *y, integer *incy) { /* System generated locals */ /* Local variables */ integer info; doublereal temp1, temp2; integer i, j; extern logical lsame_(const char *,const char *); integer ix, iy, jx, jy, kx, ky; extern /* Subroutine */ integer xerbla_(const char *, integer *); /* Purpose ======= DSYMV performs the matrix-vector operation y := alpha*A*x + beta*y, where alpha and beta are scalars, x and y are n element vectors and A is an n by n symmetric matrix. Parameters ========== UPLO - CHARACTER*1. On entry, UPLO specifies whether the upper or lower triangular part of the array A is to be referenced as follows: UPLO = 'U' or 'u' Only the upper triangular part of A is to be referenced. UPLO = 'L' or 'l' Only the lower triangular part of A is to be referenced. Unchanged on exit. N - INTEGER. On entry, N specifies the order of the matrix A. N must be at least zero. Unchanged on exit. ALPHA - DOUBLE PRECISION. On entry, ALPHA specifies the scalar alpha. Unchanged on exit. A - DOUBLE PRECISION array of DIMENSION ( LDA, n ). Before entry with UPLO = 'U' or 'u', the leading n by n upper triangular part of the array A must contain the upper triangular part of the symmetric matrix and the strictly lower triangular part of A is not referenced. Before entry with UPLO = 'L' or 'l', the leading n by n lower triangular part of the array A must contain the lower triangular part of the symmetric matrix and the strictly upper triangular part of A is not referenced. Unchanged on exit. LDA - INTEGER. On entry, LDA specifies the first dimension of A as declared in the calling (sub) program. LDA must be at least max( 1, n ). Unchanged on exit. X - DOUBLE PRECISION array of dimension at least ( 1 + ( n - 1 )*abs( INCX ) ). Before entry, the incremented array X must contain the n element vector x. Unchanged on exit. INCX - INTEGER. On entry, INCX specifies the increment for the elements of X. INCX must not be zero. Unchanged on exit. BETA - DOUBLE PRECISION. On entry, BETA specifies the scalar beta. When BETA is supplied as zero then Y need not be set on input. Unchanged on exit. Y - DOUBLE PRECISION array of dimension at least ( 1 + ( n - 1 )*abs( INCY ) ). Before entry, the incremented array Y must contain the n element vector y. On exit, Y is overwritten by the updated vector y. INCY - INTEGER. On entry, INCY specifies the increment for the elements of Y. INCY must not be zero. Unchanged on exit. Level 2 Blas routine. -- Written on 22-October-1986. Jack Dongarra, Argonne National Lab. Jeremy Du Croz, Nag Central Office. Sven Hammarling, Nag Central Office. Richard Hanson, Sandia National Labs. Test the input parameters. Parameter adjustments Function Body */ #define X(I) x[(I)-1] #define Y(I) y[(I)-1] #define A(I,J) a[(I)-1 + ((J)-1)* ( *lda)] info = 0; if (! lsame_(uplo, "U") && ! lsame_(uplo, "L")) { info = 1; } else if (*n < 0) { info = 2; } else if (*lda < max(1,*n)) { info = 5; } else if (*incx == 0) { info = 7; } else if (*incy == 0) { info = 10; } if (info != 0) { xerbla_("DSYMV ", &info); return 0; } /* Quick return if possible. */ if (*n == 0 || (*alpha == 0. && *beta == 1.)) { return 0; } /* Set up the start points in X and Y. */ if (*incx > 0) { kx = 1; } else { kx = 1 - (*n - 1) * *incx; } if (*incy > 0) { ky = 1; } else { ky = 1 - (*n - 1) * *incy; } /* Start the operations. In this version the elements of A are accessed sequentially with one pass through the triangular part of A. First form y := beta*y. */ if (*beta != 1.) { if (*incy == 1) { if (*beta == 0.) { for (i = 1; i <= *n; ++i) { Y(i) = 0.; /* L10: */ } } else { for (i = 1; i <= *n; ++i) { Y(i) = *beta * Y(i); /* L20: */ } } } else { iy = ky; if (*beta == 0.) { for (i = 1; i <= *n; ++i) { Y(iy) = 0.; iy += *incy; /* L30: */ } } else { for (i = 1; i <= *n; ++i) { Y(iy) = *beta * Y(iy); iy += *incy; /* L40: */ } } } } if (*alpha == 0.) { return 0; } if (lsame_(uplo, "U")) { /* Form y when A is stored in upper triangle. */ if (*incx == 1 && *incy == 1) { for (j = 1; j <= *n; ++j) { temp1 = *alpha * X(j); temp2 = 0.; for (i = 1; i <= j-1; ++i) { Y(i) += temp1 * A(i,j); temp2 += A(i,j) * X(i); /* L50: */ } Y(j) = Y(j) + temp1 * A(j,j) + *alpha * temp2; /* L60: */ } } else { jx = kx; jy = ky; for (j = 1; j <= *n; ++j) { temp1 = *alpha * X(jx); temp2 = 0.; ix = kx; iy = ky; for (i = 1; i <= j-1; ++i) { Y(iy) += temp1 * A(i,j); temp2 += A(i,j) * X(ix); ix += *incx; iy += *incy; /* L70: */ } Y(jy) = Y(jy) + temp1 * A(j,j) + *alpha * temp2; jx += *incx; jy += *incy; /* L80: */ } } } else { /* Form y when A is stored in lower triangle. */ if (*incx == 1 && *incy == 1) { for (j = 1; j <= *n; ++j) { temp1 = *alpha * X(j); temp2 = 0.; Y(j) += temp1 * A(j,j); for (i = j + 1; i <= *n; ++i) { Y(i) += temp1 * A(i,j); temp2 += A(i,j) * X(i); /* L90: */ } Y(j) += *alpha * temp2; /* L100: */ } } else { jx = kx; jy = ky; for (j = 1; j <= *n; ++j) { temp1 = *alpha * X(jx); temp2 = 0.; Y(jy) += temp1 * A(j,j); ix = jx; iy = jy; for (i = j + 1; i <= *n; ++i) { ix += *incx; iy += *incy; Y(iy) += temp1 * A(i,j); temp2 += A(i,j) * X(ix); /* L110: */ } Y(jy) += *alpha * temp2; jx += *incx; jy += *incy; /* L120: */ } } } return 0; /* End of DSYMV . */ } /* dsymv_ */ #ifdef __cplusplus } #endif hypre-2.33.0/src/blas/dsyr2.c000066400000000000000000000147101477326011500156560ustar00rootroot00000000000000/* Copyright (c) 1992-2008 The University of Tennessee. All rights reserved. * See file COPYING in this directory for details. */ #ifdef __cplusplus extern "C" { #endif /* -- translated by f2c (version 19940927). You must link the resulting object file with the libraries: -lf2c -lm (in that order) */ #include "f2c.h" #include "hypre_blas.h" /* Subroutine */ integer dsyr2_(const char *uplo, integer *n, doublereal *alpha, doublereal *x, integer *incx, doublereal *y, integer *incy, doublereal *a, integer *lda) { /* System generated locals */ /* Local variables */ integer info; doublereal temp1, temp2; integer i, j; extern logical lsame_(const char *,const char *); integer ix, iy, jx = 0, jy = 0, kx = 0, ky = 0; extern /* Subroutine */ integer xerbla_(const char *, integer *); /* Purpose ======= DSYR2 performs the symmetric rank 2 operation A := alpha*x*y' + alpha*y*x' + A, where alpha is a scalar, x and y are n element vectors and A is an n by n symmetric matrix. Parameters ========== UPLO - CHARACTER*1. On entry, UPLO specifies whether the upper or lower triangular part of the array A is to be referenced as follows: UPLO = 'U' or 'u' Only the upper triangular part of A is to be referenced. UPLO = 'L' or 'l' Only the lower triangular part of A is to be referenced. Unchanged on exit. N - INTEGER. On entry, N specifies the order of the matrix A. N must be at least zero. Unchanged on exit. ALPHA - DOUBLE PRECISION. On entry, ALPHA specifies the scalar alpha. Unchanged on exit. X - DOUBLE PRECISION array of dimension at least ( 1 + ( n - 1 )*abs( INCX ) ). Before entry, the incremented array X must contain the n element vector x. Unchanged on exit. INCX - INTEGER. On entry, INCX specifies the increment for the elements of X. INCX must not be zero. Unchanged on exit. Y - DOUBLE PRECISION array of dimension at least ( 1 + ( n - 1 )*abs( INCY ) ). Before entry, the incremented array Y must contain the n element vector y. Unchanged on exit. INCY - INTEGER. On entry, INCY specifies the increment for the elements of Y. INCY must not be zero. Unchanged on exit. A - DOUBLE PRECISION array of DIMENSION ( LDA, n ). Before entry with UPLO = 'U' or 'u', the leading n by n upper triangular part of the array A must contain the upper triangular part of the symmetric matrix and the strictly lower triangular part of A is not referenced. On exit, the upper triangular part of the array A is overwritten by the upper triangular part of the updated matrix. Before entry with UPLO = 'L' or 'l', the leading n by n lower triangular part of the array A must contain the lower triangular part of the symmetric matrix and the strictly upper triangular part of A is not referenced. On exit, the lower triangular part of the array A is overwritten by the lower triangular part of the updated matrix. LDA - INTEGER. On entry, LDA specifies the first dimension of A as declared in the calling (sub) program. LDA must be at least max( 1, n ). Unchanged on exit. Level 2 Blas routine. -- Written on 22-October-1986. Jack Dongarra, Argonne National Lab. Jeremy Du Croz, Nag Central Office. Sven Hammarling, Nag Central Office. Richard Hanson, Sandia National Labs. Test the input parameters. Parameter adjustments Function Body */ #define X(I) x[(I)-1] #define Y(I) y[(I)-1] #define A(I,J) a[(I)-1 + ((J)-1)* ( *lda)] info = 0; if (! lsame_(uplo, "U") && ! lsame_(uplo, "L")) { info = 1; } else if (*n < 0) { info = 2; } else if (*incx == 0) { info = 5; } else if (*incy == 0) { info = 7; } else if (*lda < max(1,*n)) { info = 9; } if (info != 0) { xerbla_("DSYR2 ", &info); return 0; } /* Quick return if possible. */ if (*n == 0 || *alpha == 0.) { return 0; } /* Set up the start points in X and Y if the increments are not both unity. */ if (*incx != 1 || *incy != 1) { if (*incx > 0) { kx = 1; } else { kx = 1 - (*n - 1) * *incx; } if (*incy > 0) { ky = 1; } else { ky = 1 - (*n - 1) * *incy; } jx = kx; jy = ky; } /* Start the operations. In this version the elements of A are accessed sequentially with one pass through the triangular part of A. */ if (lsame_(uplo, "U")) { /* Form A when A is stored in the upper triangle. */ if (*incx == 1 && *incy == 1) { for (j = 1; j <= *n; ++j) { if (X(j) != 0. || Y(j) != 0.) { temp1 = *alpha * Y(j); temp2 = *alpha * X(j); for (i = 1; i <= j; ++i) { A(i,j) = A(i,j) + X(i) * temp1 + Y(i) * temp2; /* L10: */ } } /* L20: */ } } else { for (j = 1; j <= *n; ++j) { if (X(jx) != 0. || Y(jy) != 0.) { temp1 = *alpha * Y(jy); temp2 = *alpha * X(jx); ix = kx; iy = ky; for (i = 1; i <= j; ++i) { A(i,j) = A(i,j) + X(ix) * temp1 + Y(iy) * temp2; ix += *incx; iy += *incy; /* L30: */ } } jx += *incx; jy += *incy; /* L40: */ } } } else { /* Form A when A is stored in the lower triangle. */ if (*incx == 1 && *incy == 1) { for (j = 1; j <= *n; ++j) { if (X(j) != 0. || Y(j) != 0.) { temp1 = *alpha * Y(j); temp2 = *alpha * X(j); for (i = j; i <= *n; ++i) { A(i,j) = A(i,j) + X(i) * temp1 + Y(i) * temp2; /* L50: */ } } /* L60: */ } } else { for (j = 1; j <= *n; ++j) { if (X(jx) != 0. || Y(jy) != 0.) { temp1 = *alpha * Y(jy); temp2 = *alpha * X(jx); ix = jx; iy = jy; for (i = j; i <= *n; ++i) { A(i,j) = A(i,j) + X(ix) * temp1 + Y(iy) * temp2; ix += *incx; iy += *incy; /* L70: */ } } jx += *incx; jy += *incy; /* L80: */ } } } return 0; /* End of DSYR2 . */ } /* dsyr2_ */ #ifdef __cplusplus } #endif hypre-2.33.0/src/blas/dsyr2k.c000066400000000000000000000245721477326011500160400ustar00rootroot00000000000000/* Copyright (c) 1992-2008 The University of Tennessee. All rights reserved. * See file COPYING in this directory for details. */ #ifdef __cplusplus extern "C" { #endif #include "f2c.h" #include "hypre_blas.h" /* Subroutine */ integer dsyr2k_(const char *uplo,const char *trans, integer *n, integer *k, doublereal *alpha, doublereal *a, integer *lda, doublereal *b, integer *ldb, doublereal *beta, doublereal *c__, integer *ldc) { /* System generated locals */ integer a_dim1, a_offset, b_dim1, b_offset, c_dim1, c_offset, i__1, i__2, i__3; /* Local variables */ integer info; doublereal temp1, temp2; integer i__, j, l; extern logical lsame_(const char *,const char *); integer nrowa; logical upper; extern /* Subroutine */ integer xerbla_(const char *, integer *); #define a_ref(a_1,a_2) a[(a_2)*a_dim1 + a_1] #define b_ref(a_1,a_2) b[(a_2)*b_dim1 + a_1] #define c___ref(a_1,a_2) c__[(a_2)*c_dim1 + a_1] /* Purpose ======= DSYR2K performs one of the symmetric rank 2k operations C := alpha*A*B' + alpha*B*A' + beta*C, or C := alpha*A'*B + alpha*B'*A + beta*C, where alpha and beta are scalars, C is an n by n symmetric matrix and A and B are n by k matrices in the first case and k by n matrices in the second case. Parameters ========== UPLO - CHARACTER*1. On entry, UPLO specifies whether the upper or lower triangular part of the array C is to be referenced as follows: UPLO = 'U' or 'u' Only the upper triangular part of C is to be referenced. UPLO = 'L' or 'l' Only the lower triangular part of C is to be referenced. Unchanged on exit. TRANS - CHARACTER*1. On entry, TRANS specifies the operation to be performed as follows: TRANS = 'N' or 'n' C := alpha*A*B' + alpha*B*A' + beta*C. TRANS = 'T' or 't' C := alpha*A'*B + alpha*B'*A + beta*C. TRANS = 'C' or 'c' C := alpha*A'*B + alpha*B'*A + beta*C. Unchanged on exit. N - INTEGER. On entry, N specifies the order of the matrix C. N must be at least zero. Unchanged on exit. K - INTEGER. On entry with TRANS = 'N' or 'n', K specifies the number of columns of the matrices A and B, and on entry with TRANS = 'T' or 't' or 'C' or 'c', K specifies the number of rows of the matrices A and B. K must be at least zero. Unchanged on exit. ALPHA - DOUBLE PRECISION. On entry, ALPHA specifies the scalar alpha. Unchanged on exit. A - DOUBLE PRECISION array of DIMENSION ( LDA, ka ), where ka is k when TRANS = 'N' or 'n', and is n otherwise. Before entry with TRANS = 'N' or 'n', the leading n by k part of the array A must contain the matrix A, otherwise the leading k by n part of the array A must contain the matrix A. Unchanged on exit. LDA - INTEGER. On entry, LDA specifies the first dimension of A as declared in the calling (sub) program. When TRANS = 'N' or 'n' then LDA must be at least max( 1, n ), otherwise LDA must be at least max( 1, k ). Unchanged on exit. B - DOUBLE PRECISION array of DIMENSION ( LDB, kb ), where kb is k when TRANS = 'N' or 'n', and is n otherwise. Before entry with TRANS = 'N' or 'n', the leading n by k part of the array B must contain the matrix B, otherwise the leading k by n part of the array B must contain the matrix B. Unchanged on exit. LDB - INTEGER. On entry, LDB specifies the first dimension of B as declared in the calling (sub) program. When TRANS = 'N' or 'n' then LDB must be at least max( 1, n ), otherwise LDB must be at least max( 1, k ). Unchanged on exit. BETA - DOUBLE PRECISION. On entry, BETA specifies the scalar beta. Unchanged on exit. C - DOUBLE PRECISION array of DIMENSION ( LDC, n ). Before entry with UPLO = 'U' or 'u', the leading n by n upper triangular part of the array C must contain the upper triangular part of the symmetric matrix and the strictly lower triangular part of C is not referenced. On exit, the upper triangular part of the array C is overwritten by the upper triangular part of the updated matrix. Before entry with UPLO = 'L' or 'l', the leading n by n lower triangular part of the array C must contain the lower triangular part of the symmetric matrix and the strictly upper triangular part of C is not referenced. On exit, the lower triangular part of the array C is overwritten by the lower triangular part of the updated matrix. LDC - INTEGER. On entry, LDC specifies the first dimension of C as declared in the calling (sub) program. LDC must be at least max( 1, n ). Unchanged on exit. Level 3 Blas routine. -- Written on 8-February-1989. Jack Dongarra, Argonne National Laboratory. Iain Duff, AERE Harwell. Jeremy Du Croz, Numerical Algorithms Group Ltd. Sven Hammarling, Numerical Algorithms Group Ltd. Test the input parameters. Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1 * 1; a -= a_offset; b_dim1 = *ldb; b_offset = 1 + b_dim1 * 1; b -= b_offset; c_dim1 = *ldc; c_offset = 1 + c_dim1 * 1; c__ -= c_offset; /* Function Body */ if (lsame_(trans, "N")) { nrowa = *n; } else { nrowa = *k; } upper = lsame_(uplo, "U"); info = 0; if (! upper && ! lsame_(uplo, "L")) { info = 1; } else if (! lsame_(trans, "N") && ! lsame_(trans, "T") && ! lsame_(trans, "C")) { info = 2; } else if (*n < 0) { info = 3; } else if (*k < 0) { info = 4; } else if (*lda < max(1,nrowa)) { info = 7; } else if (*ldb < max(1,nrowa)) { info = 9; } else if (*ldc < max(1,*n)) { info = 12; } if (info != 0) { xerbla_("DSYR2K", &info); return 0; } /* Quick return if possible. */ if (*n == 0 || ((*alpha == 0. || *k == 0) && (*beta == 1.))) { return 0; } /* And when alpha.eq.zero. */ if (*alpha == 0.) { if (upper) { if (*beta == 0.) { i__1 = *n; for (j = 1; j <= i__1; ++j) { i__2 = j; for (i__ = 1; i__ <= i__2; ++i__) { c___ref(i__, j) = 0.; /* L10: */ } /* L20: */ } } else { i__1 = *n; for (j = 1; j <= i__1; ++j) { i__2 = j; for (i__ = 1; i__ <= i__2; ++i__) { c___ref(i__, j) = *beta * c___ref(i__, j); /* L30: */ } /* L40: */ } } } else { if (*beta == 0.) { i__1 = *n; for (j = 1; j <= i__1; ++j) { i__2 = *n; for (i__ = j; i__ <= i__2; ++i__) { c___ref(i__, j) = 0.; /* L50: */ } /* L60: */ } } else { i__1 = *n; for (j = 1; j <= i__1; ++j) { i__2 = *n; for (i__ = j; i__ <= i__2; ++i__) { c___ref(i__, j) = *beta * c___ref(i__, j); /* L70: */ } /* L80: */ } } } return 0; } /* Start the operations. */ if (lsame_(trans, "N")) { /* Form C := alpha*A*B' + alpha*B*A' + C. */ if (upper) { i__1 = *n; for (j = 1; j <= i__1; ++j) { if (*beta == 0.) { i__2 = j; for (i__ = 1; i__ <= i__2; ++i__) { c___ref(i__, j) = 0.; /* L90: */ } } else if (*beta != 1.) { i__2 = j; for (i__ = 1; i__ <= i__2; ++i__) { c___ref(i__, j) = *beta * c___ref(i__, j); /* L100: */ } } i__2 = *k; for (l = 1; l <= i__2; ++l) { if (a_ref(j, l) != 0. || b_ref(j, l) != 0.) { temp1 = *alpha * b_ref(j, l); temp2 = *alpha * a_ref(j, l); i__3 = j; for (i__ = 1; i__ <= i__3; ++i__) { c___ref(i__, j) = c___ref(i__, j) + a_ref(i__, l) * temp1 + b_ref(i__, l) * temp2; /* L110: */ } } /* L120: */ } /* L130: */ } } else { i__1 = *n; for (j = 1; j <= i__1; ++j) { if (*beta == 0.) { i__2 = *n; for (i__ = j; i__ <= i__2; ++i__) { c___ref(i__, j) = 0.; /* L140: */ } } else if (*beta != 1.) { i__2 = *n; for (i__ = j; i__ <= i__2; ++i__) { c___ref(i__, j) = *beta * c___ref(i__, j); /* L150: */ } } i__2 = *k; for (l = 1; l <= i__2; ++l) { if (a_ref(j, l) != 0. || b_ref(j, l) != 0.) { temp1 = *alpha * b_ref(j, l); temp2 = *alpha * a_ref(j, l); i__3 = *n; for (i__ = j; i__ <= i__3; ++i__) { c___ref(i__, j) = c___ref(i__, j) + a_ref(i__, l) * temp1 + b_ref(i__, l) * temp2; /* L160: */ } } /* L170: */ } /* L180: */ } } } else { /* Form C := alpha*A'*B + alpha*B'*A + C. */ if (upper) { i__1 = *n; for (j = 1; j <= i__1; ++j) { i__2 = j; for (i__ = 1; i__ <= i__2; ++i__) { temp1 = 0.; temp2 = 0.; i__3 = *k; for (l = 1; l <= i__3; ++l) { temp1 += a_ref(l, i__) * b_ref(l, j); temp2 += b_ref(l, i__) * a_ref(l, j); /* L190: */ } if (*beta == 0.) { c___ref(i__, j) = *alpha * temp1 + *alpha * temp2; } else { c___ref(i__, j) = *beta * c___ref(i__, j) + *alpha * temp1 + *alpha * temp2; } /* L200: */ } /* L210: */ } } else { i__1 = *n; for (j = 1; j <= i__1; ++j) { i__2 = *n; for (i__ = j; i__ <= i__2; ++i__) { temp1 = 0.; temp2 = 0.; i__3 = *k; for (l = 1; l <= i__3; ++l) { temp1 += a_ref(l, i__) * b_ref(l, j); temp2 += b_ref(l, i__) * a_ref(l, j); /* L220: */ } if (*beta == 0.) { c___ref(i__, j) = *alpha * temp1 + *alpha * temp2; } else { c___ref(i__, j) = *beta * c___ref(i__, j) + *alpha * temp1 + *alpha * temp2; } /* L230: */ } /* L240: */ } } } return 0; /* End of DSYR2K. */ } /* dsyr2k_ */ #undef c___ref #undef b_ref #undef a_ref #ifdef __cplusplus } #endif hypre-2.33.0/src/blas/dsyrk.c000066400000000000000000000201011477326011500157360ustar00rootroot00000000000000/* Copyright (c) 1992-2008 The University of Tennessee. All rights reserved. * See file COPYING in this directory for details. */ #ifdef __cplusplus extern "C" { #endif /* -- translated by f2c (version 19940927). You must link the resulting object file with the libraries: -lf2c -lm (in that order) */ #include "f2c.h" #include "hypre_blas.h" /* Subroutine */ integer dsyrk_(const char *uplo,const char *trans, integer *n, integer *k, doublereal *alpha, doublereal *a, integer *lda, doublereal *beta, doublereal *c, integer *ldc) { /* System generated locals */ /* Local variables */ integer info; doublereal temp; integer i, j, l; extern logical lsame_(const char *,const char *); integer nrowa; logical upper; extern /* Subroutine */ integer xerbla_(const char *, integer *); /* Purpose ======= DSYRK performs one of the symmetric rank k operations C := alpha*A*A' + beta*C, or C := alpha*A'*A + beta*C, where alpha and beta are scalars, C is an n by n symmetric matrix and A is an n by k matrix in the first case and a k by n matrix in the second case. Parameters ========== UPLO - CHARACTER*1. On entry, UPLO specifies whether the upper or lower triangular part of the array C is to be referenced as follows: UPLO = 'U' or 'u' Only the upper triangular part of C is to be referenced. UPLO = 'L' or 'l' Only the lower triangular part of C is to be referenced. Unchanged on exit. TRANS - CHARACTER*1. On entry, TRANS specifies the operation to be performed as follows: TRANS = 'N' or 'n' C := alpha*A*A' + beta*C. TRANS = 'T' or 't' C := alpha*A'*A + beta*C. TRANS = 'C' or 'c' C := alpha*A'*A + beta*C. Unchanged on exit. N - INTEGER. On entry, N specifies the order of the matrix C. N must be at least zero. Unchanged on exit. K - INTEGER. On entry with TRANS = 'N' or 'n', K specifies the number of columns of the matrix A, and on entry with TRANS = 'T' or 't' or 'C' or 'c', K specifies the number of rows of the matrix A. K must be at least zero. Unchanged on exit. ALPHA - DOUBLE PRECISION. On entry, ALPHA specifies the scalar alpha. Unchanged on exit. A - DOUBLE PRECISION array of DIMENSION ( LDA, ka ), where ka is k when TRANS = 'N' or 'n', and is n otherwise. Before entry with TRANS = 'N' or 'n', the leading n by k part of the array A must contain the matrix A, otherwise the leading k by n part of the array A must contain the matrix A. Unchanged on exit. LDA - INTEGER. On entry, LDA specifies the first dimension of A as declared in the calling (sub) program. When TRANS = 'N' or 'n' then LDA must be at least max( 1, n ), otherwise LDA must be at least max( 1, k ). Unchanged on exit. BETA - DOUBLE PRECISION. On entry, BETA specifies the scalar beta. Unchanged on exit. C - DOUBLE PRECISION array of DIMENSION ( LDC, n ). Before entry with UPLO = 'U' or 'u', the leading n by n upper triangular part of the array C must contain the upper triangular part of the symmetric matrix and the strictly lower triangular part of C is not referenced. On exit, the upper triangular part of the array C is overwritten by the upper triangular part of the updated matrix. Before entry with UPLO = 'L' or 'l', the leading n by n lower triangular part of the array C must contain the lower triangular part of the symmetric matrix and the strictly upper triangular part of C is not referenced. On exit, the lower triangular part of the array C is overwritten by the lower triangular part of the updated matrix. LDC - INTEGER. On entry, LDC specifies the first dimension of C as declared in the calling (sub) program. LDC must be at least max( 1, n ). Unchanged on exit. Level 3 Blas routine. -- Written on 8-February-1989. Jack Dongarra, Argonne National Laboratory. Iain Duff, AERE Harwell. Jeremy Du Croz, Numerical Algorithms Group Ltd. Sven Hammarling, Numerical Algorithms Group Ltd. Test the input parameters. Parameter adjustments Function Body */ #define A(I,J) a[(I)-1 + ((J)-1)* ( *lda)] #define C(I,J) c[(I)-1 + ((J)-1)* ( *ldc)] if (lsame_(trans, "N")) { nrowa = *n; } else { nrowa = *k; } upper = lsame_(uplo, "U"); info = 0; if (! upper && ! lsame_(uplo, "L")) { info = 1; } else if (! lsame_(trans, "N") && ! lsame_(trans, "T") && ! lsame_(trans, "C")) { info = 2; } else if (*n < 0) { info = 3; } else if (*k < 0) { info = 4; } else if (*lda < max(1,nrowa)) { info = 7; } else if (*ldc < max(1,*n)) { info = 10; } if (info != 0) { xerbla_("DSYRK ", &info); return 0; } /* Quick return if possible. */ if (*n == 0 || ((*alpha == 0. || *k == 0) && (*beta == 1.))) { return 0; } /* And when alpha.eq.zero. */ if (*alpha == 0.) { if (upper) { if (*beta == 0.) { for (j = 1; j <= *n; ++j) { for (i = 1; i <= j; ++i) { C(i,j) = 0.; /* L10: */ } /* L20: */ } } else { for (j = 1; j <= *n; ++j) { for (i = 1; i <= j; ++i) { C(i,j) = *beta * C(i,j); /* L30: */ } /* L40: */ } } } else { if (*beta == 0.) { for (j = 1; j <= *n; ++j) { for (i = j; i <= *n; ++i) { C(i,j) = 0.; /* L50: */ } /* L60: */ } } else { for (j = 1; j <= *n; ++j) { for (i = j; i <= *n; ++i) { C(i,j) = *beta * C(i,j); /* L70: */ } /* L80: */ } } } return 0; } /* Start the operations. */ if (lsame_(trans, "N")) { /* Form C := alpha*A*A' + beta*C. */ if (upper) { for (j = 1; j <= *n; ++j) { if (*beta == 0.) { for (i = 1; i <= j; ++i) { C(i,j) = 0.; /* L90: */ } } else if (*beta != 1.) { for (i = 1; i <= j; ++i) { C(i,j) = *beta * C(i,j); /* L100: */ } } for (l = 1; l <= *k; ++l) { if (A(j,l) != 0.) { temp = *alpha * A(j,l); for (i = 1; i <= j; ++i) { C(i,j) += temp * A(i,l); /* L110: */ } } /* L120: */ } /* L130: */ } } else { for (j = 1; j <= *n; ++j) { if (*beta == 0.) { for (i = j; i <= *n; ++i) { C(i,j) = 0.; /* L140: */ } } else if (*beta != 1.) { for (i = j; i <= *n; ++i) { C(i,j) = *beta * C(i,j); /* L150: */ } } for (l = 1; l <= *k; ++l) { if (A(j,l) != 0.) { temp = *alpha * A(j,l); for (i = j; i <= *n; ++i) { C(i,j) += temp * A(i,l); /* L160: */ } } /* L170: */ } /* L180: */ } } } else { /* Form C := alpha*A'*A + beta*C. */ if (upper) { for (j = 1; j <= *n; ++j) { for (i = 1; i <= j; ++i) { temp = 0.; for (l = 1; l <= *k; ++l) { temp += A(l,i) * A(l,j); /* L190: */ } if (*beta == 0.) { C(i,j) = *alpha * temp; } else { C(i,j) = *alpha * temp + *beta * C(i,j); } /* L200: */ } /* L210: */ } } else { for (j = 1; j <= *n; ++j) { for (i = j; i <= *n; ++i) { temp = 0.; for (l = 1; l <= *k; ++l) { temp += A(l,i) * A(l,j); /* L220: */ } if (*beta == 0.) { C(i,j) = *alpha * temp; } else { C(i,j) = *alpha * temp + *beta * C(i,j); } /* L230: */ } /* L240: */ } } } return 0; /* End of DSYRK . */ } /* dsyrk_ */ #ifdef __cplusplus } #endif hypre-2.33.0/src/blas/dtrmm.c000066400000000000000000000245071477326011500157430ustar00rootroot00000000000000/* Copyright (c) 1992-2008 The University of Tennessee. All rights reserved. * See file COPYING in this directory for details. */ #ifdef __cplusplus extern "C" { #endif #include "f2c.h" #include "hypre_blas.h" /* Subroutine */ integer dtrmm_(const char *side,const char *uplo,const char *transa,const char *diag, integer *m, integer *n, doublereal *alpha, doublereal *a, integer * lda, doublereal *b, integer *ldb) { /* System generated locals */ integer a_dim1, a_offset, b_dim1, b_offset, i__1, i__2, i__3; /* Local variables */ integer info; doublereal temp; integer i__, j, k; logical lside; extern logical lsame_(const char *,const char *); integer nrowa; logical upper; extern /* Subroutine */ integer xerbla_(const char *, integer *); logical nounit; #define a_ref(a_1,a_2) a[(a_2)*a_dim1 + a_1] #define b_ref(a_1,a_2) b[(a_2)*b_dim1 + a_1] /* Purpose ======= DTRMM performs one of the matrix-matrix operations B := alpha*op( A )*B, or B := alpha*B*op( A ), where alpha is a scalar, B is an m by n matrix, A is a unit, or non-unit, upper or lower triangular matrix and op( A ) is one of op( A ) = A or op( A ) = A'. Parameters ========== SIDE - CHARACTER*1. On entry, SIDE specifies whether op( A ) multiplies B from the left or right as follows: SIDE = 'L' or 'l' B := alpha*op( A )*B. SIDE = 'R' or 'r' B := alpha*B*op( A ). Unchanged on exit. UPLO - CHARACTER*1. On entry, UPLO specifies whether the matrix A is an upper or lower triangular matrix as follows: UPLO = 'U' or 'u' A is an upper triangular matrix. UPLO = 'L' or 'l' A is a lower triangular matrix. Unchanged on exit. TRANSA - CHARACTER*1. On entry, TRANSA specifies the form of op( A ) to be used in the matrix multiplication as follows: TRANSA = 'N' or 'n' op( A ) = A. TRANSA = 'T' or 't' op( A ) = A'. TRANSA = 'C' or 'c' op( A ) = A'. Unchanged on exit. DIAG - CHARACTER*1. On entry, DIAG specifies whether or not A is unit triangular as follows: DIAG = 'U' or 'u' A is assumed to be unit triangular. DIAG = 'N' or 'n' A is not assumed to be unit triangular. Unchanged on exit. M - INTEGER. On entry, M specifies the number of rows of B. M must be at least zero. Unchanged on exit. N - INTEGER. On entry, N specifies the number of columns of B. N must be at least zero. Unchanged on exit. ALPHA - DOUBLE PRECISION. On entry, ALPHA specifies the scalar alpha. When alpha is zero then A is not referenced and B need not be set before entry. Unchanged on exit. A - DOUBLE PRECISION array of DIMENSION ( LDA, k ), where k is m when SIDE = 'L' or 'l' and is n when SIDE = 'R' or 'r'. Before entry with UPLO = 'U' or 'u', the leading k by k upper triangular part of the array A must contain the upper triangular matrix and the strictly lower triangular part of A is not referenced. Before entry with UPLO = 'L' or 'l', the leading k by k lower triangular part of the array A must contain the lower triangular matrix and the strictly upper triangular part of A is not referenced. Note that when DIAG = 'U' or 'u', the diagonal elements of A are not referenced either, but are assumed to be unity. Unchanged on exit. LDA - INTEGER. On entry, LDA specifies the first dimension of A as declared in the calling (sub) program. When SIDE = 'L' or 'l' then LDA must be at least max( 1, m ), when SIDE = 'R' or 'r' then LDA must be at least max( 1, n ). Unchanged on exit. B - DOUBLE PRECISION array of DIMENSION ( LDB, n ). Before entry, the leading m by n part of the array B must contain the matrix B, and on exit is overwritten by the transformed matrix. LDB - INTEGER. On entry, LDB specifies the first dimension of B as declared in the calling (sub) program. LDB must be at least max( 1, m ). Unchanged on exit. Level 3 Blas routine. -- Written on 8-February-1989. Jack Dongarra, Argonne National Laboratory. Iain Duff, AERE Harwell. Jeremy Du Croz, Numerical Algorithms Group Ltd. Sven Hammarling, Numerical Algorithms Group Ltd. Test the input parameters. Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1 * 1; a -= a_offset; b_dim1 = *ldb; b_offset = 1 + b_dim1 * 1; b -= b_offset; /* Function Body */ lside = lsame_(side, "L"); if (lside) { nrowa = *m; } else { nrowa = *n; } nounit = lsame_(diag, "N"); upper = lsame_(uplo, "U"); info = 0; if (! lside && ! lsame_(side, "R")) { info = 1; } else if (! upper && ! lsame_(uplo, "L")) { info = 2; } else if (! lsame_(transa, "N") && ! lsame_(transa, "T") && ! lsame_(transa, "C")) { info = 3; } else if (! lsame_(diag, "U") && ! lsame_(diag, "N")) { info = 4; } else if (*m < 0) { info = 5; } else if (*n < 0) { info = 6; } else if (*lda < max(1,nrowa)) { info = 9; } else if (*ldb < max(1,*m)) { info = 11; } if (info != 0) { xerbla_("DTRMM ", &info); return 0; } /* Quick return if possible. */ if (*n == 0) { return 0; } /* And when alpha.eq.zero. */ if (*alpha == 0.) { i__1 = *n; for (j = 1; j <= i__1; ++j) { i__2 = *m; for (i__ = 1; i__ <= i__2; ++i__) { b_ref(i__, j) = 0.; /* L10: */ } /* L20: */ } return 0; } /* Start the operations. */ if (lside) { if (lsame_(transa, "N")) { /* Form B := alpha*A*B. */ if (upper) { i__1 = *n; for (j = 1; j <= i__1; ++j) { i__2 = *m; for (k = 1; k <= i__2; ++k) { if (b_ref(k, j) != 0.) { temp = *alpha * b_ref(k, j); i__3 = k - 1; for (i__ = 1; i__ <= i__3; ++i__) { b_ref(i__, j) = b_ref(i__, j) + temp * a_ref( i__, k); /* L30: */ } if (nounit) { temp *= a_ref(k, k); } b_ref(k, j) = temp; } /* L40: */ } /* L50: */ } } else { i__1 = *n; for (j = 1; j <= i__1; ++j) { for (k = *m; k >= 1; --k) { if (b_ref(k, j) != 0.) { temp = *alpha * b_ref(k, j); b_ref(k, j) = temp; if (nounit) { b_ref(k, j) = b_ref(k, j) * a_ref(k, k); } i__2 = *m; for (i__ = k + 1; i__ <= i__2; ++i__) { b_ref(i__, j) = b_ref(i__, j) + temp * a_ref( i__, k); /* L60: */ } } /* L70: */ } /* L80: */ } } } else { /* Form B := alpha*A'*B. */ if (upper) { i__1 = *n; for (j = 1; j <= i__1; ++j) { for (i__ = *m; i__ >= 1; --i__) { temp = b_ref(i__, j); if (nounit) { temp *= a_ref(i__, i__); } i__2 = i__ - 1; for (k = 1; k <= i__2; ++k) { temp += a_ref(k, i__) * b_ref(k, j); /* L90: */ } b_ref(i__, j) = *alpha * temp; /* L100: */ } /* L110: */ } } else { i__1 = *n; for (j = 1; j <= i__1; ++j) { i__2 = *m; for (i__ = 1; i__ <= i__2; ++i__) { temp = b_ref(i__, j); if (nounit) { temp *= a_ref(i__, i__); } i__3 = *m; for (k = i__ + 1; k <= i__3; ++k) { temp += a_ref(k, i__) * b_ref(k, j); /* L120: */ } b_ref(i__, j) = *alpha * temp; /* L130: */ } /* L140: */ } } } } else { if (lsame_(transa, "N")) { /* Form B := alpha*B*A. */ if (upper) { for (j = *n; j >= 1; --j) { temp = *alpha; if (nounit) { temp *= a_ref(j, j); } i__1 = *m; for (i__ = 1; i__ <= i__1; ++i__) { b_ref(i__, j) = temp * b_ref(i__, j); /* L150: */ } i__1 = j - 1; for (k = 1; k <= i__1; ++k) { if (a_ref(k, j) != 0.) { temp = *alpha * a_ref(k, j); i__2 = *m; for (i__ = 1; i__ <= i__2; ++i__) { b_ref(i__, j) = b_ref(i__, j) + temp * b_ref( i__, k); /* L160: */ } } /* L170: */ } /* L180: */ } } else { i__1 = *n; for (j = 1; j <= i__1; ++j) { temp = *alpha; if (nounit) { temp *= a_ref(j, j); } i__2 = *m; for (i__ = 1; i__ <= i__2; ++i__) { b_ref(i__, j) = temp * b_ref(i__, j); /* L190: */ } i__2 = *n; for (k = j + 1; k <= i__2; ++k) { if (a_ref(k, j) != 0.) { temp = *alpha * a_ref(k, j); i__3 = *m; for (i__ = 1; i__ <= i__3; ++i__) { b_ref(i__, j) = b_ref(i__, j) + temp * b_ref( i__, k); /* L200: */ } } /* L210: */ } /* L220: */ } } } else { /* Form B := alpha*B*A'. */ if (upper) { i__1 = *n; for (k = 1; k <= i__1; ++k) { i__2 = k - 1; for (j = 1; j <= i__2; ++j) { if (a_ref(j, k) != 0.) { temp = *alpha * a_ref(j, k); i__3 = *m; for (i__ = 1; i__ <= i__3; ++i__) { b_ref(i__, j) = b_ref(i__, j) + temp * b_ref( i__, k); /* L230: */ } } /* L240: */ } temp = *alpha; if (nounit) { temp *= a_ref(k, k); } if (temp != 1.) { i__2 = *m; for (i__ = 1; i__ <= i__2; ++i__) { b_ref(i__, k) = temp * b_ref(i__, k); /* L250: */ } } /* L260: */ } } else { for (k = *n; k >= 1; --k) { i__1 = *n; for (j = k + 1; j <= i__1; ++j) { if (a_ref(j, k) != 0.) { temp = *alpha * a_ref(j, k); i__2 = *m; for (i__ = 1; i__ <= i__2; ++i__) { b_ref(i__, j) = b_ref(i__, j) + temp * b_ref( i__, k); /* L270: */ } } /* L280: */ } temp = *alpha; if (nounit) { temp *= a_ref(k, k); } if (temp != 1.) { i__1 = *m; for (i__ = 1; i__ <= i__1; ++i__) { b_ref(i__, k) = temp * b_ref(i__, k); /* L290: */ } } /* L300: */ } } } } return 0; /* End of DTRMM . */ } /* dtrmm_ */ #undef b_ref #undef a_ref #ifdef __cplusplus } #endif hypre-2.33.0/src/blas/dtrmv.c000066400000000000000000000167171477326011500157600ustar00rootroot00000000000000/* Copyright (c) 1992-2008 The University of Tennessee. All rights reserved. * See file COPYING in this directory for details. */ #ifdef __cplusplus extern "C" { #endif #include "f2c.h" #include "hypre_blas.h" /* Subroutine */ integer dtrmv_(const char *uplo,const char *trans,const char *diag, integer *n, doublereal *a, integer *lda, doublereal *x, integer *incx) { /* System generated locals */ integer a_dim1, a_offset, i__1, i__2; /* Local variables */ integer info; doublereal temp; integer i__, j; extern logical lsame_(const char *,const char *); integer ix, jx, kx = 0; extern /* Subroutine */ integer xerbla_(const char *, integer *); logical nounit; #define a_ref(a_1,a_2) a[(a_2)*a_dim1 + a_1] /* Purpose ======= DTRMV performs one of the matrix-vector operations x := A*x, or x := A'*x, where x is an n element vector and A is an n by n unit, or non-unit, upper or lower triangular matrix. Parameters ========== UPLO - CHARACTER*1. On entry, UPLO specifies whether the matrix is an upper or lower triangular matrix as follows: UPLO = 'U' or 'u' A is an upper triangular matrix. UPLO = 'L' or 'l' A is a lower triangular matrix. Unchanged on exit. TRANS - CHARACTER*1. On entry, TRANS specifies the operation to be performed as follows: TRANS = 'N' or 'n' x := A*x. TRANS = 'T' or 't' x := A'*x. TRANS = 'C' or 'c' x := A'*x. Unchanged on exit. DIAG - CHARACTER*1. On entry, DIAG specifies whether or not A is unit triangular as follows: DIAG = 'U' or 'u' A is assumed to be unit triangular. DIAG = 'N' or 'n' A is not assumed to be unit triangular. Unchanged on exit. N - INTEGER. On entry, N specifies the order of the matrix A. N must be at least zero. Unchanged on exit. A - DOUBLE PRECISION array of DIMENSION ( LDA, n ). Before entry with UPLO = 'U' or 'u', the leading n by n upper triangular part of the array A must contain the upper triangular matrix and the strictly lower triangular part of A is not referenced. Before entry with UPLO = 'L' or 'l', the leading n by n lower triangular part of the array A must contain the lower triangular matrix and the strictly upper triangular part of A is not referenced. Note that when DIAG = 'U' or 'u', the diagonal elements of A are not referenced either, but are assumed to be unity. Unchanged on exit. LDA - INTEGER. On entry, LDA specifies the first dimension of A as declared in the calling (sub) program. LDA must be at least max( 1, n ). Unchanged on exit. X - DOUBLE PRECISION array of dimension at least ( 1 + ( n - 1 )*abs( INCX ) ). Before entry, the incremented array X must contain the n element vector x. On exit, X is overwritten with the tranformed vector x. INCX - INTEGER. On entry, INCX specifies the increment for the elements of X. INCX must not be zero. Unchanged on exit. Level 2 Blas routine. -- Written on 22-October-1986. Jack Dongarra, Argonne National Lab. Jeremy Du Croz, Nag Central Office. Sven Hammarling, Nag Central Office. Richard Hanson, Sandia National Labs. Test the input parameters. Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1 * 1; a -= a_offset; --x; /* Function Body */ info = 0; if (! lsame_(uplo, "U") && ! lsame_(uplo, "L")) { info = 1; } else if (! lsame_(trans, "N") && ! lsame_(trans, "T") && ! lsame_(trans, "C")) { info = 2; } else if (! lsame_(diag, "U") && ! lsame_(diag, "N")) { info = 3; } else if (*n < 0) { info = 4; } else if (*lda < max(1,*n)) { info = 6; } else if (*incx == 0) { info = 8; } if (info != 0) { xerbla_("DTRMV ", &info); return 0; } /* Quick return if possible. */ if (*n == 0) { return 0; } nounit = lsame_(diag, "N"); /* Set up the start point in X if the increment is not unity. This will be ( N - 1 )*INCX too small for descending loops. */ if (*incx <= 0) { kx = 1 - (*n - 1) * *incx; } else if (*incx != 1) { kx = 1; } /* Start the operations. In this version the elements of A are accessed sequentially with one pass through A. */ if (lsame_(trans, "N")) { /* Form x := A*x. */ if (lsame_(uplo, "U")) { if (*incx == 1) { i__1 = *n; for (j = 1; j <= i__1; ++j) { if (x[j] != 0.) { temp = x[j]; i__2 = j - 1; for (i__ = 1; i__ <= i__2; ++i__) { x[i__] += temp * a_ref(i__, j); /* L10: */ } if (nounit) { x[j] *= a_ref(j, j); } } /* L20: */ } } else { jx = kx; i__1 = *n; for (j = 1; j <= i__1; ++j) { if (x[jx] != 0.) { temp = x[jx]; ix = kx; i__2 = j - 1; for (i__ = 1; i__ <= i__2; ++i__) { x[ix] += temp * a_ref(i__, j); ix += *incx; /* L30: */ } if (nounit) { x[jx] *= a_ref(j, j); } } jx += *incx; /* L40: */ } } } else { if (*incx == 1) { for (j = *n; j >= 1; --j) { if (x[j] != 0.) { temp = x[j]; i__1 = j + 1; for (i__ = *n; i__ >= i__1; --i__) { x[i__] += temp * a_ref(i__, j); /* L50: */ } if (nounit) { x[j] *= a_ref(j, j); } } /* L60: */ } } else { kx += (*n - 1) * *incx; jx = kx; for (j = *n; j >= 1; --j) { if (x[jx] != 0.) { temp = x[jx]; ix = kx; i__1 = j + 1; for (i__ = *n; i__ >= i__1; --i__) { x[ix] += temp * a_ref(i__, j); ix -= *incx; /* L70: */ } if (nounit) { x[jx] *= a_ref(j, j); } } jx -= *incx; /* L80: */ } } } } else { /* Form x := A'*x. */ if (lsame_(uplo, "U")) { if (*incx == 1) { for (j = *n; j >= 1; --j) { temp = x[j]; if (nounit) { temp *= a_ref(j, j); } for (i__ = j - 1; i__ >= 1; --i__) { temp += a_ref(i__, j) * x[i__]; /* L90: */ } x[j] = temp; /* L100: */ } } else { jx = kx + (*n - 1) * *incx; for (j = *n; j >= 1; --j) { temp = x[jx]; ix = jx; if (nounit) { temp *= a_ref(j, j); } for (i__ = j - 1; i__ >= 1; --i__) { ix -= *incx; temp += a_ref(i__, j) * x[ix]; /* L110: */ } x[jx] = temp; jx -= *incx; /* L120: */ } } } else { if (*incx == 1) { i__1 = *n; for (j = 1; j <= i__1; ++j) { temp = x[j]; if (nounit) { temp *= a_ref(j, j); } i__2 = *n; for (i__ = j + 1; i__ <= i__2; ++i__) { temp += a_ref(i__, j) * x[i__]; /* L130: */ } x[j] = temp; /* L140: */ } } else { jx = kx; i__1 = *n; for (j = 1; j <= i__1; ++j) { temp = x[jx]; ix = jx; if (nounit) { temp *= a_ref(j, j); } i__2 = *n; for (i__ = j + 1; i__ <= i__2; ++i__) { ix += *incx; temp += a_ref(i__, j) * x[ix]; /* L150: */ } x[jx] = temp; jx += *incx; /* L160: */ } } } } return 0; /* End of DTRMV . */ } /* dtrmv_ */ #undef a_ref #ifdef __cplusplus } #endif hypre-2.33.0/src/blas/dtrsm.c000066400000000000000000000234021477326011500157420ustar00rootroot00000000000000/* Copyright (c) 1992-2008 The University of Tennessee. All rights reserved. * See file COPYING in this directory for details. */ #ifdef __cplusplus extern "C" { #endif /* -- translated by f2c (version 19940927). You must link the resulting object file with the libraries: -lf2c -lm (in that order) */ #include "f2c.h" #include "hypre_blas.h" /* Subroutine */ integer dtrsm_(const char *side,const char *uplo,const char *transa,const char *diag, integer *m, integer *n, doublereal *alpha, doublereal *a, integer * lda, doublereal *b, integer *ldb) { /* System generated locals */ /* Local variables */ integer info; doublereal temp; integer i, j, k; logical lside; extern logical lsame_(const char *,const char *); integer nrowa; logical upper; extern /* Subroutine */ integer xerbla_(const char *, integer *); logical nounit; /* Purpose ======= DTRSM solves one of the matrix equations op( A )*X = alpha*B, or X*op( A ) = alpha*B, where alpha is a scalar, X and B are m by n matrices, A is a unit, or non-unit, upper or lower triangular matrix and op( A ) is one of op( A ) = A or op( A ) = A'. The matrix X is overwritten on B. Parameters ========== SIDE - CHARACTER*1. On entry, SIDE specifies whether op( A ) appears on the left or right of X as follows: SIDE = 'L' or 'l' op( A )*X = alpha*B. SIDE = 'R' or 'r' X*op( A ) = alpha*B. Unchanged on exit. UPLO - CHARACTER*1. On entry, UPLO specifies whether the matrix A is an upper or lower triangular matrix as follows: UPLO = 'U' or 'u' A is an upper triangular matrix. UPLO = 'L' or 'l' A is a lower triangular matrix. Unchanged on exit. TRANSA - CHARACTER*1. On entry, TRANSA specifies the form of op( A ) to be used in the matrix multiplication as follows: TRANSA = 'N' or 'n' op( A ) = A. TRANSA = 'T' or 't' op( A ) = A'. TRANSA = 'C' or 'c' op( A ) = A'. Unchanged on exit. DIAG - CHARACTER*1. On entry, DIAG specifies whether or not A is unit triangular as follows: DIAG = 'U' or 'u' A is assumed to be unit triangular. DIAG = 'N' or 'n' A is not assumed to be unit triangular. Unchanged on exit. M - INTEGER. On entry, M specifies the number of rows of B. M must be at least zero. Unchanged on exit. N - INTEGER. On entry, N specifies the number of columns of B. N must be at least zero. Unchanged on exit. ALPHA - DOUBLE PRECISION. On entry, ALPHA specifies the scalar alpha. When alpha is zero then A is not referenced and B need not be set before entry. Unchanged on exit. A - DOUBLE PRECISION array of DIMENSION ( LDA, k ), where k is m when SIDE = 'L' or 'l' and is n when SIDE = 'R' or 'r'. Before entry with UPLO = 'U' or 'u', the leading k by k upper triangular part of the array A must contain the upper triangular matrix and the strictly lower triangular part of A is not referenced. Before entry with UPLO = 'L' or 'l', the leading k by k lower triangular part of the array A must contain the lower triangular matrix and the strictly upper triangular part of A is not referenced. Note that when DIAG = 'U' or 'u', the diagonal elements of A are not referenced either, but are assumed to be unity. Unchanged on exit. LDA - INTEGER. On entry, LDA specifies the first dimension of A as declared in the calling (sub) program. When SIDE = 'L' or 'l' then LDA must be at least max( 1, m ), when SIDE = 'R' or 'r' then LDA must be at least max( 1, n ). Unchanged on exit. B - DOUBLE PRECISION array of DIMENSION ( LDB, n ). Before entry, the leading m by n part of the array B must contain the right-hand side matrix B, and on exit is overwritten by the solution matrix X. LDB - INTEGER. On entry, LDB specifies the first dimension of B as declared in the calling (sub) program. LDB must be at least max( 1, m ). Unchanged on exit. Level 3 Blas routine. -- Written on 8-February-1989. Jack Dongarra, Argonne National Laboratory. Iain Duff, AERE Harwell. Jeremy Du Croz, Numerical Algorithms Group Ltd. Sven Hammarling, Numerical Algorithms Group Ltd. Test the input parameters. Parameter adjustments Function Body */ #define A(I,J) a[(I)-1 + ((J)-1)* ( *lda)] #define B(I,J) b[(I)-1 + ((J)-1)* ( *ldb)] lside = lsame_(side, "L"); if (lside) { nrowa = *m; } else { nrowa = *n; } nounit = lsame_(diag, "N"); upper = lsame_(uplo, "U"); info = 0; if (! lside && ! lsame_(side, "R")) { info = 1; } else if (! upper && ! lsame_(uplo, "L")) { info = 2; } else if (! lsame_(transa, "N") && ! lsame_(transa, "T") && ! lsame_(transa, "C")) { info = 3; } else if (! lsame_(diag, "U") && ! lsame_(diag, "N")) { info = 4; } else if (*m < 0) { info = 5; } else if (*n < 0) { info = 6; } else if (*lda < max(1,nrowa)) { info = 9; } else if (*ldb < max(1,*m)) { info = 11; } if (info != 0) { xerbla_("DTRSM ", &info); return 0; } /* Quick return if possible. */ if (*n == 0) { return 0; } /* And when alpha.eq.zero. */ if (*alpha == 0.) { for (j = 1; j <= *n; ++j) { for (i = 1; i <= *m; ++i) { B(i,j) = 0.; /* L10: */ } /* L20: */ } return 0; } /* Start the operations. */ if (lside) { if (lsame_(transa, "N")) { /* Form B := alpha*inv( A )*B. */ if (upper) { for (j = 1; j <= *n; ++j) { if (*alpha != 1.) { for (i = 1; i <= *m; ++i) { B(i,j) = *alpha * B(i,j); /* L30: */ } } for (k = *m; k >= 1; --k) { if (B(k,j) != 0.) { if (nounit) { B(k,j) /= A(k,k); } for (i = 1; i <= k-1; ++i) { B(i,j) -= B(k,j) * A(i,k); /* L40: */ } } /* L50: */ } /* L60: */ } } else { for (j = 1; j <= *n; ++j) { if (*alpha != 1.) { for (i = 1; i <= *m; ++i) { B(i,j) = *alpha * B(i,j); /* L70: */ } } for (k = 1; k <= *m; ++k) { if (B(k,j) != 0.) { if (nounit) { B(k,j) /= A(k,k); } for (i = k + 1; i <= *m; ++i) { B(i,j) -= B(k,j) * A(i,k); /* L80: */ } } /* L90: */ } /* L100: */ } } } else { /* Form B := alpha*inv( A' )*B. */ if (upper) { for (j = 1; j <= *n; ++j) { for (i = 1; i <= *m; ++i) { temp = *alpha * B(i,j); for (k = 1; k <= i-1; ++k) { temp -= A(k,i) * B(k,j); /* L110: */ } if (nounit) { temp /= A(i,i); } B(i,j) = temp; /* L120: */ } /* L130: */ } } else { for (j = 1; j <= *n; ++j) { for (i = *m; i >= 1; --i) { temp = *alpha * B(i,j); for (k = i + 1; k <= *m; ++k) { temp -= A(k,i) * B(k,j); /* L140: */ } if (nounit) { temp /= A(i,i); } B(i,j) = temp; /* L150: */ } /* L160: */ } } } } else { if (lsame_(transa, "N")) { /* Form B := alpha*B*inv( A ). */ if (upper) { for (j = 1; j <= *n; ++j) { if (*alpha != 1.) { for (i = 1; i <= *m; ++i) { B(i,j) = *alpha * B(i,j); /* L170: */ } } for (k = 1; k <= j-1; ++k) { if (A(k,j) != 0.) { for (i = 1; i <= *m; ++i) { B(i,j) -= A(k,j) * B(i,k); /* L180: */ } } /* L190: */ } if (nounit) { temp = 1. / A(j,j); for (i = 1; i <= *m; ++i) { B(i,j) = temp * B(i,j); /* L200: */ } } /* L210: */ } } else { for (j = *n; j >= 1; --j) { if (*alpha != 1.) { for (i = 1; i <= *m; ++i) { B(i,j) = *alpha * B(i,j); /* L220: */ } } for (k = j + 1; k <= *n; ++k) { if (A(k,j) != 0.) { for (i = 1; i <= *m; ++i) { B(i,j) -= A(k,j) * B(i,k); /* L230: */ } } /* L240: */ } if (nounit) { temp = 1. / A(j,j); for (i = 1; i <= *m; ++i) { B(i,j) = temp * B(i,j); /* L250: */ } } /* L260: */ } } } else { /* Form B := alpha*B*inv( A' ). */ if (upper) { for (k = *n; k >= 1; --k) { if (nounit) { temp = 1. / A(k,k); for (i = 1; i <= *m; ++i) { B(i,k) = temp * B(i,k); /* L270: */ } } for (j = 1; j <= k-1; ++j) { if (A(j,k) != 0.) { temp = A(j,k); for (i = 1; i <= *m; ++i) { B(i,j) -= temp * B(i,k); /* L280: */ } } /* L290: */ } if (*alpha != 1.) { for (i = 1; i <= *m; ++i) { B(i,k) = *alpha * B(i,k); /* L300: */ } } /* L310: */ } } else { for (k = 1; k <= *n; ++k) { if (nounit) { temp = 1. / A(k,k); for (i = 1; i <= *m; ++i) { B(i,k) = temp * B(i,k); /* L320: */ } } for (j = k + 1; j <= *n; ++j) { if (A(j,k) != 0.) { temp = A(j,k); for (i = 1; i <= *m; ++i) { B(i,j) -= temp * B(i,k); /* L330: */ } } /* L340: */ } if (*alpha != 1.) { for (i = 1; i <= *m; ++i) { B(i,k) = *alpha * B(i,k); /* L350: */ } } /* L360: */ } } } } return 0; /* End of DTRSM . */ } /* dtrsm_ */ #ifdef __cplusplus } #endif hypre-2.33.0/src/blas/dtrsv.c000066400000000000000000000165641477326011500157660ustar00rootroot00000000000000/* Copyright (c) 1992-2008 The University of Tennessee. All rights reserved. * See file COPYING in this directory for details. */ #ifdef __cplusplus extern "C" { #endif /* -- translated by f2c (version 19940927). You must link the resulting object file with the libraries: -lf2c -lm (in that order) */ #include "f2c.h" #include "hypre_blas.h" /* Subroutine */ integer dtrsv_(const char *uplo,const char *trans,const char *diag, integer *n, doublereal *a, integer *lda, doublereal *x, integer *incx) { /* System generated locals */ /* Local variables */ integer info; doublereal temp; integer i, j; extern logical lsame_(const char *,const char *); integer ix, jx, kx = 0; extern /* Subroutine */ integer xerbla_(const char *, integer *); logical nounit; /* Purpose ======= DTRSV solves one of the systems of equations A*x = b, or A'*x = b, where b and x are n element vectors and A is an n by n unit, or non-unit, upper or lower triangular matrix. No test for singularity or near-singularity is included in this routine. Such tests must be performed before calling this routine. Parameters ========== UPLO - CHARACTER*1. On entry, UPLO specifies whether the matrix is an upper or lower triangular matrix as follows: UPLO = 'U' or 'u' A is an upper triangular matrix. UPLO = 'L' or 'l' A is a lower triangular matrix. Unchanged on exit. TRANS - CHARACTER*1. On entry, TRANS specifies the equations to be solved as follows: TRANS = 'N' or 'n' A*x = b. TRANS = 'T' or 't' A'*x = b. TRANS = 'C' or 'c' A'*x = b. Unchanged on exit. DIAG - CHARACTER*1. On entry, DIAG specifies whether or not A is unit triangular as follows: DIAG = 'U' or 'u' A is assumed to be unit triangular. DIAG = 'N' or 'n' A is not assumed to be unit triangular. Unchanged on exit. N - INTEGER. On entry, N specifies the order of the matrix A. N must be at least zero. Unchanged on exit. A - DOUBLE PRECISION array of DIMENSION ( LDA, n ). Before entry with UPLO = 'U' or 'u', the leading n by n upper triangular part of the array A must contain the upper triangular matrix and the strictly lower triangular part of A is not referenced. Before entry with UPLO = 'L' or 'l', the leading n by n lower triangular part of the array A must contain the lower triangular matrix and the strictly upper triangular part of A is not referenced. Note that when DIAG = 'U' or 'u', the diagonal elements of A are not referenced either, but are assumed to be unity. Unchanged on exit. LDA - INTEGER. On entry, LDA specifies the first dimension of A as declared in the calling (sub) program. LDA must be at least max( 1, n ). Unchanged on exit. X - DOUBLE PRECISION array of dimension at least ( 1 + ( n - 1 )*abs( INCX ) ). Before entry, the incremented array X must contain the n element right-hand side vector b. On exit, X is overwritten with the solution vector x. INCX - INTEGER. On entry, INCX specifies the increment for the elements of X. INCX must not be zero. Unchanged on exit. Level 2 Blas routine. -- Written on 22-October-1986. Jack Dongarra, Argonne National Lab. Jeremy Du Croz, Nag Central Office. Sven Hammarling, Nag Central Office. Richard Hanson, Sandia National Labs. Test the input parameters. Parameter adjustments Function Body */ #define X(I) x[(I)-1] #define A(I,J) a[(I)-1 + ((J)-1)* ( *lda)] info = 0; if (! lsame_(uplo, "U") && ! lsame_(uplo, "L")) { info = 1; } else if (! lsame_(trans, "N") && ! lsame_(trans, "T") && ! lsame_(trans, "C")) { info = 2; } else if (! lsame_(diag, "U") && ! lsame_(diag, "N")) { info = 3; } else if (*n < 0) { info = 4; } else if (*lda < max(1,*n)) { info = 6; } else if (*incx == 0) { info = 8; } if (info != 0) { xerbla_("DTRSV ", &info); return 0; } /* Quick return if possible. */ if (*n == 0) { return 0; } nounit = lsame_(diag, "N"); /* Set up the start point in X if the increment is not unity. This will be ( N - 1 )*INCX too small for descending loops. */ if (*incx <= 0) { kx = 1 - (*n - 1) * *incx; } else if (*incx != 1) { kx = 1; } /* Start the operations. In this version the elements of A are accessed sequentially with one pass through A. */ if (lsame_(trans, "N")) { /* Form x := inv( A )*x. */ if (lsame_(uplo, "U")) { if (*incx == 1) { for (j = *n; j >= 1; --j) { if (X(j) != 0.) { if (nounit) { X(j) /= A(j,j); } temp = X(j); for (i = j - 1; i >= 1; --i) { X(i) -= temp * A(i,j); /* L10: */ } } /* L20: */ } } else { jx = kx + (*n - 1) * *incx; for (j = *n; j >= 1; --j) { if (X(jx) != 0.) { if (nounit) { X(jx) /= A(j,j); } temp = X(jx); ix = jx; for (i = j - 1; i >= 1; --i) { ix -= *incx; X(ix) -= temp * A(i,j); /* L30: */ } } jx -= *incx; /* L40: */ } } } else { if (*incx == 1) { for (j = 1; j <= *n; ++j) { if (X(j) != 0.) { if (nounit) { X(j) /= A(j,j); } temp = X(j); for (i = j + 1; i <= *n; ++i) { X(i) -= temp * A(i,j); /* L50: */ } } /* L60: */ } } else { jx = kx; for (j = 1; j <= *n; ++j) { if (X(jx) != 0.) { if (nounit) { X(jx) /= A(j,j); } temp = X(jx); ix = jx; for (i = j + 1; i <= *n; ++i) { ix += *incx; X(ix) -= temp * A(i,j); /* L70: */ } } jx += *incx; /* L80: */ } } } } else { /* Form x := inv( A' )*x. */ if (lsame_(uplo, "U")) { if (*incx == 1) { for (j = 1; j <= *n; ++j) { temp = X(j); for (i = 1; i <= j-1; ++i) { temp -= A(i,j) * X(i); /* L90: */ } if (nounit) { temp /= A(j,j); } X(j) = temp; /* L100: */ } } else { jx = kx; for (j = 1; j <= *n; ++j) { temp = X(jx); ix = kx; for (i = 1; i <= j-1; ++i) { temp -= A(i,j) * X(ix); ix += *incx; /* L110: */ } if (nounit) { temp /= A(j,j); } X(jx) = temp; jx += *incx; /* L120: */ } } } else { if (*incx == 1) { for (j = *n; j >= 1; --j) { temp = X(j); for (i = *n; i >= j+1; --i) { temp -= A(i,j) * X(i); /* L130: */ } if (nounit) { temp /= A(j,j); } X(j) = temp; /* L140: */ } } else { kx += (*n - 1) * *incx; jx = kx; for (j = *n; j >= 1; --j) { temp = X(jx); ix = kx; for (i = *n; i >= j+1; --i) { temp -= A(i,j) * X(ix); ix -= *incx; /* L150: */ } if (nounit) { temp /= A(j,j); } X(jx) = temp; jx -= *incx; /* L160: */ } } } } return 0; /* End of DTRSV . */ } /* dtrsv_ */ #ifdef __cplusplus } #endif hypre-2.33.0/src/blas/f2c.c000066400000000000000000000044531477326011500152700ustar00rootroot00000000000000/* Copyright (c) 1992-2008 The University of Tennessee. All rights reserved. * See file COPYING in this directory for details. */ #ifdef __cplusplus #define REGISTER #else #define REGISTER register #endif #ifdef __cplusplus extern "C" { #endif /*----------------------------------------------------------------------------- * Contains functions found in the f2c library to avoid needing -lf2c *-----------------------------------------------------------------------------*/ #include "f2c.h" #include "hypre_blas.h" /* compare two strings */ integer s_cmp(char *a0,const char *b0, ftnlen la, ftnlen lb) { REGISTER unsigned char *a, *aend, *b, *bend; a = (unsigned char *)a0; b = (unsigned char *)b0; aend = a + la; bend = b + lb; if(la <= lb) { while(a < aend) if(*a != *b) return( *a - *b ); else { ++a; ++b; } while(b < bend) if(*b != ' ') return( ' ' - *b ); else ++b; } else { while(b < bend) if(*a == *b) { ++a; ++b; } else return( *a - *b ); while(a < aend) if(*a != ' ') return(*a - ' '); else ++a; } return(0); } /* assign strings: a = b */ integer s_copy(char *a,const char *b, ftnlen la, ftnlen lb) { REGISTER char *aend, *bend; aend = a + la; if(la <= lb) while(a < aend) *a++ = *b++; else { bend = (char*)b + lb; while(b < bend) *a++ = *b++; while(a < aend) *a++ = ' '; } return(0); } integer s_cat(char *lp, char *rpp[], ftnlen rnp[], ftnlen *np, ftnlen ll) { ftnlen i, n, nc; char *f__rp; n = (integer)*np; for(i = 0 ; i < n ; ++i) { nc = ll; if(rnp[i] < nc) nc = rnp[i]; ll -= nc; f__rp = rpp[i]; while(--nc >= 0) *lp++ = *f__rp++; } while(--ll >= 0) *lp++ = ' '; return 0; } #define log10e 0.43429448190325182765 #undef abs #include "math.h" doublereal d_lg10(doublereal *x) { return( log10e * log(*x) ); } doublereal d_sign(doublereal *a, doublereal *b) { doublereal x; x = (*a >= 0 ? *a : - *a); return( *b >= 0 ? x : -x); } doublereal pow_di(doublereal *ap, integer *bp) { doublereal pow, x; integer n; pow = 1; x = *ap; n = *bp; if(n != 0) { if(n < 0) { n = -n; x = 1/x; } for( ; ; ) { if(n & 01) pow *= x; if(n >>= 1) x *= x; else break; } } return(pow); } #undef abs #include "math.h" doublereal pow_dd(doublereal *ap, doublereal *bp) { return(pow(*ap, *bp) ); } #ifdef __cplusplus } #endif hypre-2.33.0/src/blas/f2c.h000066400000000000000000000142541477326011500152750ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /* f2c.h -- Standard Fortran to C header file */ /** barf [ba:rf] 2. "He suggested using FORTRAN, and everybody barfed." - From The Shogakukan DICTIONARY OF NEW ENGLISH (Second edition) */ #ifndef F2C_INCLUDE #define F2C_INCLUDE /* MPI is not needed here, so don't include mpi.h */ #include "HYPRE_config.h" #ifndef HYPRE_SEQUENTIAL #define HYPRE_SEQUENTIAL #endif #include "_hypre_utilities.h" #include "math.h" #define sqrt hypre_sqrt #define log hypre_log #define pow hypre_pow #ifdef HYPRE_BIGINT typedef long long int HYPRE_LongInt; typedef unsigned long long int HYPRE_ULongInt; #else typedef long int HYPRE_LongInt; typedef unsigned long int HYPRE_ULongInt; #endif /* F2C_INTEGER will normally be `HYPRE_Int' but would be `long' on 16-bit systems */ /* we assume short, float are OK */ /* integer changed to HYPRE_Int - edmond 1/12/00 */ typedef HYPRE_Int integer; typedef HYPRE_ULongInt uinteger; typedef char *address; typedef short int shortint; typedef float real; typedef HYPRE_Real doublereal; typedef struct { real r, i; } complex; typedef struct { doublereal r, i; } doublecomplex; typedef HYPRE_LongInt logical; typedef short int shortlogical; typedef char logical1; typedef char integer1; /* integer*8 support from f2c not currently supported: */ #if 0 typedef @F2C_LONGINT@ /* long long */ longint; /* system-dependent */ typedef unsigned @F2C_LONGINT@ ulongint; /* system-dependent */ #define qbit_clear(a,b) ((a) & ~((ulongint)1 << (b))) #define qbit_set(a,b) ((a) | ((ulongint)1 << (b))) #endif /* typedef long long HYPRE_Int longint; */ /* RDF: removed */ #define TRUE_ (1) #define FALSE_ (0) /* Extern is for use with -E */ #ifndef Extern #define Extern extern #endif /* I/O stuff */ #ifdef f2c_i2 #error f2c_i2 will not work with g77!!!! /* for -i2 */ typedef short flag; typedef short ftnlen; typedef short ftnint; #else typedef HYPRE_LongInt /* HYPRE_Int or long HYPRE_Int */ flag; typedef HYPRE_Int /* HYPRE_Int or long HYPRE_Int */ ftnlen; /* changed by edmond */ typedef HYPRE_LongInt /* HYPRE_Int or long HYPRE_Int */ ftnint; #endif /*external read, write*/ typedef struct { flag cierr; ftnint ciunit; flag ciend; char *cifmt; ftnint cirec; } cilist; /*internal read, write*/ typedef struct { flag icierr; char *iciunit; flag iciend; char *icifmt; ftnint icirlen; ftnint icirnum; } icilist; /*open*/ typedef struct { flag oerr; ftnint ounit; char *ofnm; ftnlen ofnmlen; char *osta; char *oacc; char *ofm; ftnint orl; char *oblnk; } olist; /*close*/ typedef struct { flag cerr; ftnint cunit; char *csta; } cllist; /*rewind, backspace, endfile*/ typedef struct { flag aerr; ftnint aunit; } alist; /* inquire */ typedef struct { flag inerr; ftnint inunit; char *infile; ftnlen infilen; ftnint *inex; /*parameters in standard's order*/ ftnint *inopen; ftnint *innum; ftnint *innamed; char *inname; ftnlen innamlen; char *inacc; ftnlen inacclen; char *inseq; ftnlen inseqlen; char *indir; ftnlen indirlen; char *infmt; ftnlen infmtlen; char *inform; ftnint informlen; char *inunf; ftnlen inunflen; ftnint *inrecl; ftnint *innrec; char *inblank; ftnlen inblanklen; } inlist; #define VOID void union Multitype { /* for multiple entry points */ integer1 g; shortint h; integer i; /* longint j; */ real r; doublereal d; complex c; doublecomplex z; }; typedef union Multitype Multitype; /*typedef long HYPRE_Int Long;*/ /* No longer used; formerly in Namelist */ struct Vardesc { /* for Namelist */ char *name; char *addr; ftnlen *dims; HYPRE_Int type; }; typedef struct Vardesc Vardesc; struct Namelist { char *name; Vardesc **vars; HYPRE_Int nvars; }; typedef struct Namelist Namelist; /* The following undefs are to prevent conflicts with external libraries */ #undef abs #define abs(x) ((x) >= 0 ? (x) : -(x)) #define dabs(x) (doublereal)abs(x) #ifndef min #define min(a,b) ((a) <= (b) ? (a) : (b)) #define max(a,b) ((a) >= (b) ? (a) : (b)) #endif #define dmin(a,b) (doublereal)min(a,b) #define dmax(a,b) (doublereal)max(a,b) #define bit_test(a,b) ((a) >> (b) & 1) #define bit_clear(a,b) ((a) & ~((uinteger)1 << (b))) #define bit_set(a,b) ((a) | ((uinteger)1 << (b))) /* procedure parameter types for -A and -C++ */ #define F2C_proc_par_types 1 #ifdef __cplusplus typedef HYPRE_Int /* Unknown procedure type */ (*U_fp)(...); typedef shortint (*J_fp)(...); typedef integer (*I_fp)(...); typedef real (*R_fp)(...); typedef doublereal (*D_fp)(...), (*E_fp)(...); typedef /* Complex */ VOID (*C_fp)(...); typedef /* Double Complex */ VOID (*Z_fp)(...); typedef logical (*L_fp)(...); typedef shortlogical (*K_fp)(...); typedef /* Character */ VOID (*H_fp)(...); typedef /* Subroutine */ HYPRE_Int (*S_fp)(...); #else typedef HYPRE_Int /* Unknown procedure type */ (*U_fp)(void); typedef shortint (*J_fp)(void); typedef integer (*I_fp)(void); typedef real (*R_fp)(void); typedef doublereal (*D_fp)(void), (*E_fp)(void); typedef /* Complex */ VOID (*C_fp)(void); typedef /* Double Complex */ VOID (*Z_fp)(void); typedef logical (*L_fp)(void); typedef shortlogical (*K_fp)(void); typedef /* Character */ VOID (*H_fp)(void); typedef /* Subroutine */ HYPRE_Int (*S_fp)(void); #endif /* E_fp is for real functions when -R is not specified */ typedef VOID C_f; /* complex function */ typedef VOID H_f; /* character function */ typedef VOID Z_f; /* HYPRE_Real complex function */ typedef doublereal E_f; /* real function with -R not specified */ /* undef any lower-case symbols that your C compiler predefines, e.g.: */ #ifndef Skip_f2c_Undefs /* (No such symbols should be defined in a strict ANSI C compiler. We can avoid trouble with f2c-translated code by using gcc -ansi [-traditional].) */ #undef cray #undef gcos #undef mc68010 #undef mc68020 #undef mips #undef pdp11 #undef sgi #undef sparc #undef sun #undef sun2 #undef sun3 #undef sun4 #undef u370 #undef u3b #undef u3b2 #undef u3b5 #undef unix #undef vax #endif #endif hypre-2.33.0/src/blas/hypre_blas.h000066400000000000000000000031541477326011500167500ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /***** DO NOT use this file outside of the BLAS directory *****/ /*-------------------------------------------------------------------------- * This header renames the functions in BLAS to avoid conflicts *--------------------------------------------------------------------------*/ /* blas */ #define dasum_ hypre_dasum #define daxpy_ hypre_daxpy #define dcopy_ hypre_dcopy #define ddot_ hypre_ddot #define dgemm_ hypre_dgemm #define dgemv_ hypre_dgemv #define dger_ hypre_dger #define dnrm2_ hypre_dnrm2 #define drot_ hypre_drot #define dscal_ hypre_dscal #define dswap_ hypre_dswap #define dsymm_ hypre_dsymm #define dsymv_ hypre_dsymv #define dsyr2_ hypre_dsyr2 #define dsyr2k_ hypre_dsyr2k #define dsyrk_ hypre_dsyrk #define dtrmm_ hypre_dtrmm #define dtrmv_ hypre_dtrmv #define dtrsm_ hypre_dtrsm #define dtrsv_ hypre_dtrsv #define idamax_ hypre_idamax /* f2c library routines */ #define s_cmp hypre_s_cmp #define s_copy hypre_s_copy #define s_cat hypre_s_cat #define d_lg10 hypre_d_lg10 #define d_sign hypre_d_sign #define pow_dd hypre_pow_dd #define pow_di hypre_pow_di /* these auxiliary routines have a different definition in LAPACK */ #define lsame_ hypre_blas_lsame #define xerbla_ hypre_blas_xerbla hypre-2.33.0/src/blas/idamax.c000066400000000000000000000031411477326011500160520ustar00rootroot00000000000000/* Copyright (c) 1992-2008 The University of Tennessee. All rights reserved. * See file COPYING in this directory for details. */ #ifdef __cplusplus extern "C" { #endif /* -- translated by f2c (version 19940927). You must link the resulting object file with the libraries: -lf2c -lm (in that order) */ #include "f2c.h" #include "hypre_blas.h" integer idamax_(integer *n, doublereal *dx, integer *incx) { /* System generated locals */ integer ret_val; doublereal d__1; /* Local variables */ doublereal dmax__; integer i, ix; /* finds the index of element having max. absolute value. jack dongarra, linpack, 3/11/78. modified 3/93 to return if incx .le. 0. modified 12/3/93, array(1) declarations changed to array(*) Parameter adjustments Function Body */ #define DX(I) dx[(I)-1] ret_val = 0; if (*n < 1 || *incx <= 0) { return ret_val; } ret_val = 1; if (*n == 1) { return ret_val; } if (*incx == 1) { goto L20; } /* code for increment not equal to 1 */ ix = 1; dmax__ = abs(DX(1)); ix += *incx; for (i = 2; i <= *n; ++i) { if ((d__1 = DX(ix), abs(d__1)) <= dmax__) { goto L5; } ret_val = i; dmax__ = (d__1 = DX(ix), abs(d__1)); L5: ix += *incx; /* L10: */ } return ret_val; /* code for increment equal to 1 */ L20: dmax__ = abs(DX(1)); for (i = 2; i <= *n; ++i) { if ((d__1 = DX(i), abs(d__1)) <= dmax__) { goto L30; } ret_val = i; dmax__ = (d__1 = DX(i), abs(d__1)); L30: ; } return ret_val; } /* idamax_ */ #ifdef __cplusplus } #endif hypre-2.33.0/src/blas/lsame.c000066400000000000000000000061611477326011500157150ustar00rootroot00000000000000/* Copyright (c) 1992-2008 The University of Tennessee. All rights reserved. * See file COPYING in this directory for details. */ #ifdef __cplusplus extern "C" { #endif /* lsame.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "hypre_blas.h" logical lsame_(const char *ca, const char *cb) { /* System generated locals */ logical ret_val; /* Local variables */ integer inta, intb, zcode; /* -- LAPACK auxiliary routine (version 3.1) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* LSAME returns .TRUE. if CA is the same letter as CB regardless of */ /* case. */ /* Arguments */ /* ========= */ /* CA (input) CHARACTER*1 */ /* CB (input) CHARACTER*1 */ /* CA and CB specify the single characters to be compared. */ /* ===================================================================== */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* Test if the characters are equal */ ret_val = *(unsigned char *)ca == *(unsigned char *)cb; if (ret_val) { return ret_val; } /* Now test for equivalence if both characters are alphabetic. */ zcode = 'Z'; /* Use 'Z' rather than 'A' so that ASCII can be detected on Prime */ /* machines, on which ICHAR returns a value with bit 8 set. */ /* ICHAR('A') on Prime machines returns 193 which is the same as */ /* ICHAR('A') on an EBCDIC machine. */ inta = *(unsigned char *)ca; intb = *(unsigned char *)cb; if (zcode == 90 || zcode == 122) { /* ASCII is assumed - ZCODE is the ASCII code of either lower or */ /* upper case 'Z'. */ if (inta >= 97 && inta <= 122) { inta += -32; } if (intb >= 97 && intb <= 122) { intb += -32; } } else if (zcode == 233 || zcode == 169) { /* EBCDIC is assumed - ZCODE is the EBCDIC code of either lower or */ /* upper case 'Z'. */ if ((inta >= 129 && inta <= 137) || (inta >= 145 && inta <= 153) || (inta >= 162 && inta <= 169)) { inta += 64; } if ((intb >= 129 && intb <= 137) || (intb >= 145 && intb <= 153) || (intb >= 162 && intb <= 169)) { intb += 64; } } else if (zcode == 218 || zcode == 250) { /* ASCII is assumed, on Prime machines - ZCODE is the ASCII code */ /* plus 128 of either lower or upper case 'Z'. */ if (inta >= 225 && inta <= 250) { inta += -32; } if (intb >= 225 && intb <= 250) { intb += -32; } } ret_val = inta == intb; /* RETURN */ /* End of LSAME */ return ret_val; } /* lsame_ */ #ifdef __cplusplus } #endif hypre-2.33.0/src/blas/xerbla.c000066400000000000000000000047451477326011500160770ustar00rootroot00000000000000/* Copyright (c) 1992-2008 The University of Tennessee. All rights reserved. * See file COPYING in this directory for details. */ #ifdef __cplusplus extern "C" { #endif /* xerbla.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "hypre_blas.h" /* Table of constant values */ /* integer c__1 = 1;*/ /* Subroutine */ integer xerbla_(const char *srname, integer *info) { /* Format strings */ /* char fmt_9999[] = "(\002 ** On entry to \002,a,\002 parameter num" "ber \002,i2,\002 had \002,\002an illegal value\002)"; */ /* Builtin functions */ integer s_wsfe(cilist *), i_len_trim(char *, ftnlen), do_fio(integer *, char *, ftnlen);//, e_wsfe(void); /* Subroutine */ integer s_stop(char *, ftnlen); /* Fortran I/O blocks */ /* cilist io___1 = { 0, 6, 0, fmt_9999, 0 };*/ /* -- LAPACK auxiliary routine (preliminary version) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* XERBLA is an error handler for the LAPACK routines. */ /* It is called by an LAPACK routine if an input parameter has an */ /* invalid value. A message is printed and execution stops. */ /* Installers may consider modifying the STOP statement in order to */ /* call system-specific exception-handling facilities. */ /* Arguments */ /* ========= */ /* SRNAME (input) CHARACTER*(*) */ /* The name of the routine which called XERBLA. */ /* INFO (input) INTEGER */ /* The position of the invalid parameter in the parameter list */ /* of the calling routine. */ /* ===================================================================== */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ hypre_printf("** On entry to %6s, parameter number %2i had an illegal value\n", srname, *info); /* End of XERBLA */ return 0; } /* xerbla_ */ #ifdef __cplusplus } #endif hypre-2.33.0/src/config/000077500000000000000000000000001477326011500147705ustar00rootroot00000000000000hypre-2.33.0/src/config/HYPREConfig.cmake.in000066400000000000000000000173401477326011500204210ustar00rootroot00000000000000# Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) @PACKAGE_INIT@ include(CMakeFindDependencyMacro) function(find_hypre_dependency name) string(TOUPPER ${name} UPPER_NAME) if(HYPRE_ENABLE_${UPPER_NAME}) find_dependency(${name} REQUIRED HINTS ${HYPRE_DEPENDENCY_DIRS}) if(${name}_FOUND) message(STATUS "Found ${UPPER_NAME}: ${${name}_DIR}") else() message(FATAL_ERROR "${UPPER_NAME} not found.") endif() endif() endfunction() set(HYPRE_DEPENDENCY_DIRS "@HYPRE_DEPENDENCY_DIRS@") set(HYPRE_ENABLE_BIGINT @HYPRE_ENABLE_BIGINT@) set(HYPRE_ENABLE_MIXEDINT @HYPRE_ENABLE_MIXEDINT@) set(HYPRE_ENABLE_SINGLE @HYPRE_ENABLE_SINGLE@) set(HYPRE_ENABLE_LONG_DOUBLE @HYPRE_ENABLE_LONG_DOUBLE@) set(HYPRE_ENABLE_COMPLEX @HYPRE_ENABLE_COMPLEX@) set(HYPRE_ENABLE_HYPRE_BLAS @HYPRE_ENABLE_HYPRE_BLAS@) set(HYPRE_ENABLE_HYPRE_LAPACK @HYPRE_ENABLE_HYPRE_LAPACK@) set(HYPRE_ENABLE_PERSISTENT_COMM @HYPRE_ENABLE_PERSISTENT_COMM@) set(HYPRE_ENABLE_FEI @HYPRE_ENABLE_FEI@) set(HYPRE_ENABLE_MPI @HYPRE_ENABLE_MPI@) set(HYPRE_ENABLE_OPENMP @HYPRE_ENABLE_OPENMP@) set(HYPRE_ENABLE_HOPSCOTCH @HYPRE_ENABLE_HOPSCOTCH@) set(HYPRE_ENABLE_PRINT_ERRORS @HYPRE_ENABLE_PRINT_ERRORS@) set(HYPRE_ENABLE_TIMING @HYPRE_ENABLE_TIMING@) set(HYPRE_ENABLE_HOST_MEMORY @HYPRE_ENABLE_HOST_MEMORY@) set(HYPRE_ENABLE_TEST_USING_HOST @HYPRE_ENABLE_TEST_USING_HOST@) set(HYPRE_ENABLE_CUDA @HYPRE_ENABLE_CUDA@) set(HYPRE_ENABLE_HIP @HYPRE_ENABLE_HIP@) set(HYPRE_ENABLE_SYCL @HYPRE_ENABLE_SYCL@) set(HYPRE_ENABLE_UNIFIED_MEMORY @HYPRE_ENABLE_UNIFIED_MEMORY@) set(HYPRE_ENABLE_CUDA_STREAMS @HYPRE_ENABLE_CUDA_STREAMS@) set(HYPRE_ENABLE_DEVICE_POOL @HYPRE_ENABLE_DEVICE_POOL@) set(HYPRE_ENABLE_DEVICE_MALLOC_ASYNC @HYPRE_ENABLE_DEVICE_MALLOC_ASYNC@) set(HYPRE_ENABLE_THRUST_ASYNC @HYPRE_ENABLE_THRUST_ASYNC@) set(HYPRE_ENABLE_CUSPARSE @HYPRE_ENABLE_CUSPARSE@) set(HYPRE_ENABLE_CUBLAS @HYPRE_ENABLE_CUBLAS@) set(HYPRE_ENABLE_CURAND @HYPRE_ENABLE_CURAND@) set(HYPRE_ENABLE_CUSOLVER @HYPRE_ENABLE_CUSOLVER@) set(HYPRE_ENABLE_GPU_AWARE_MPI @HYPRE_ENABLE_GPU_AWARE_MPI@) set(HYPRE_ENABLE_GPU_PROFILING @HYPRE_ENABLE_GPU_PROFILING@) set(HYPRE_ENABLE_ROCSPARSE @HYPRE_ENABLE_ROCSPARSE@) set(HYPRE_ENABLE_ROCBLAS @HYPRE_ENABLE_ROCBLAS@) set(HYPRE_ENABLE_ROCRAND @HYPRE_ENABLE_ROCRAND@) set(HYPRE_ENABLE_ROCSOLVER @HYPRE_ENABLE_ROCSOLVER@) set(HYPRE_ENABLE_ONEMKLSPARSE @HYPRE_ENABLE_ONEMKLSPARSE@) set(HYPRE_ENABLE_ONEMKLBLAS @HYPRE_ENABLE_ONEMKLBLAS@) set(HYPRE_ENABLE_ONEMKLRAND @HYPRE_ENABLE_ONEMKLRAND@) set(HYPRE_BUILD_EXAMPLES @HYPRE_BUILD_EXAMPLES@) set(HYPRE_BUILD_TESTS @HYPRE_BUILD_TESTS@) set(HYPRE_ENABLE_DSUPERLU @HYPRE_ENABLE_DSUPERLU@) set(HYPRE_ENABLE_MAGMA @HYPRE_ENABLE_MAGMA@) set(HYPRE_ENABLE_CALIPER @HYPRE_ENABLE_CALIPER@) set(HYPRE_ENABLE_UMPIRE @HYPRE_ENABLE_UMPIRE@) set(HYPRE_ENABLE_UMPIRE_HOST @HYPRE_ENABLE_UMPIRE_HOST@) set(HYPRE_ENABLE_UMPIRE_DEVICE @HYPRE_ENABLE_UMPIRE_DEVICE@) set(HYPRE_ENABLE_UMPIRE_UM @HYPRE_ENABLE_UMPIRE_UM@) set(HYPRE_ENABLE_UMPIRE_PINNED @HYPRE_ENABLE_UMPIRE_PINNED@) set(HYPRE_HAVE_MPI_COMM_F2C @HYPRE_HAVE_MPI_COMM_F2C@) list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}") if (UNIX) list(APPEND TPL_LIBRARIES m) endif() if(NOT HYPRE_ENABLE_HYPRE_BLAS) find_dependency(BLAS) endif() if(NOT HYPRE_ENABLE_HYPRE_LAPACK) find_dependency(LAPACK) endif() if(HYPRE_ENABLE_MPI) enable_language(C) find_dependency(MPI @MPI_C_VERSION@ COMPONENTS C) endif() if(HYPRE_ENABLE_OPENMP) find_dependency(OpenMP) endif() find_hypre_dependency(caliper) find_hypre_dependency(dsuperlu) find_hypre_dependency(magma) find_hypre_dependency(umpire) if(HYPRE_ENABLE_CUDA OR HYPRE_ENABLE_HIP OR HYPRE_ENABLE_SYCL) # List of required GPU libraries set(REQUIRED_GPU_COMPONENTS) if(HYPRE_ENABLE_CUDA) list(APPEND REQUIRED_GPU_COMPONENTS cudart) if(HYPRE_ENABLE_CUSPARSE) list(APPEND REQUIRED_GPU_COMPONENTS cusparse) endif() if(HYPRE_ENABLE_CUBLAS) list(APPEND REQUIRED_GPU_COMPONENTS cublas) endif() if(HYPRE_ENABLE_CURAND) list(APPEND REQUIRED_GPU_COMPONENTS curand) endif() if(HYPRE_ENABLE_CUSOLVER) list(APPEND REQUIRED_GPU_COMPONENTS cusolver) endif() elseif(HYPRE_ENABLE_HIP) if(HYPRE_ENABLE_ROCSPARSE) list(APPEND REQUIRED_GPU_COMPONENTS rocsparse) endif() if(HYPRE_ENABLE_ROCBLAS) list(APPEND REQUIRED_GPU_COMPONENTS rocblas) endif() if(HYPRE_ENABLE_ROCRAND) list(APPEND REQUIRED_GPU_COMPONENTS rocrand) endif() if(HYPRE_ENABLE_ROCSOLVER) list(APPEND REQUIRED_GPU_COMPONENTS rocsolver) endif() elseif(HYPRE_ENABLE_SYCL) if(HYPRE_ENABLE_ONEMKLSPARSE) list(APPEND REQUIRED_GPU_COMPONENTS onemklsparse) endif() if(HYPRE_ENABLE_ONEMKLBLAS) list(APPEND REQUIRED_GPU_COMPONENTS onemklblas) endif() if(HYPRE_ENABLE_ONEMKLRAND) list(APPEND REQUIRED_GPU_COMPONENTS onemklrand) endif() endif() if(REQUIRED_GPU_COMPONENTS) if(HYPRE_ENABLE_CUDA) set(GPU_TOOLKIT_NAME "CUDA") message(STATUS "Finding CUDA Toolkit components: ${REQUIRED_GPU_COMPONENTS}") find_dependency(CUDAToolkit REQUIRED COMPONENTS ${REQUIRED_GPU_COMPONENTS}) set(GPU_TOOLKIT_FOUND ${CUDAToolkit_FOUND}) set(GPU_TOOLKIT_VERSION ${CUDAToolkit_VERSION}) elseif(HYPRE_ENABLE_HIP) # Add HIP root to prefix path to find ROCm components if(DEFINED ROCM_PATH) set(HIP_PATH ${ROCM_PATH}) elseif(DEFINED ENV{ROCM_PATH}) set(HIP_PATH $ENV{ROCM_PATH}) elseif(DEFINED rocm_ROOT) set(HIP_PATH ${rocm_ROOT}) elseif(DEFINED ENV{ROCM_ROOT}) set(HIP_PATH $ENV{ROCM_ROOT}) elseif(DEFINED hip_ROOT) set(HIP_PATH ${hip_ROOT}) elseif(DEFINED ENV{hip_ROOT}) set(HIP_PATH $ENV{hip_ROOT}) elseif(EXISTS "/opt/rocm") set(HIP_PATH "/opt/rocm") else() message(WARNING "ROCM_PATH or HIP_PATH not set. Linking to ROCm libraries may not work.") endif() # Add HIP path to prefix path to find ROCm components list(APPEND CMAKE_PREFIX_PATH "${HIP_PATH}") set(GPU_TOOLKIT_NAME "HIP") message(STATUS "Finding HIP Toolkit components: ${REQUIRED_GPU_COMPONENTS}") find_dependency(hip REQUIRED) set(GPU_TOOLKIT_FOUND ${hip_FOUND}) set(GPU_TOOLKIT_VERSION ${hip_VERSION}) # Find ROCm components foreach(component ${REQUIRED_GPU_COMPONENTS}) find_dependency(${component} REQUIRED) endforeach() elseif(HYPRE_ENABLE_SYCL) set(GPU_TOOLKIT_NAME "Intel DPC++") message(STATUS "Finding Intel DPC++ Toolkit components: ${REQUIRED_GPU_COMPONENTS}") find_dependency(IntelDPCPP REQUIRED) set(GPU_TOOLKIT_FOUND ${IntelDPCPP_FOUND}) set(GPU_TOOLKIT_VERSION ${IntelDPCPP_VERSION}) endif() if(GPU_TOOLKIT_FOUND) message(STATUS "GPU Toolkit found: ${GPU_TOOLKIT_NAME} ${GPU_TOOLKIT_VERSION}") set(MISSING_COMPONENTS) foreach(component ${REQUIRED_GPU_COMPONENTS}) if(HYPRE_ENABLE_CUDA AND NOT TARGET CUDA::${component}) list(APPEND MISSING_COMPONENTS ${component}) elseif(HYPRE_ENABLE_HIP AND NOT TARGET roc::${component}) list(APPEND MISSING_COMPONENTS ${component}) elseif(HYPRE_ENABLE_SYCL AND NOT TARGET sycl::${component}) list(APPEND MISSING_COMPONENTS ${component}) endif() endforeach() if(MISSING_COMPONENTS) message(FATAL_ERROR "Required GPU components not found: ${MISSING_COMPONENTS}") else() message(STATUS "Required GPU components found: ${REQUIRED_GPU_COMPONENTS}") endif() else() message(FATAL_ERROR "GPU Toolkit not found.") endif() endif() endif() include("${CMAKE_CURRENT_LIST_DIR}/HYPRETargets.cmake") hypre-2.33.0/src/config/HYPRE_config.h.cmake.in000066400000000000000000000120311477326011500210360ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #define HYPRE_RELEASE_NAME "@CMAKE_PROJECT_NAME@" #define HYPRE_RELEASE_VERSION "@HYPRE_VERSION@" #define HYPRE_RELEASE_NUMBER @HYPRE_NUMBER@ #define HYPRE_RELEASE_DATE "@HYPRE_DATE@" #define HYPRE_RELEASE_TIME "@HYPRE_TIME@" #define HYPRE_RELEASE_BUGS "@HYPRE_BUGS@" #cmakedefine HYPRE_DEVELOP_STRING "@HYPRE_DEVELOP_STRING@" #cmakedefine HYPRE_DEVELOP_NUMBER @HYPRE_DEVELOP_NUMBER@ #cmakedefine HYPRE_DEVELOP_BRANCH "@HYPRE_DEVELOP_BRANCH@" #cmakedefine HYPRE_BRANCH_NAME "@HYPRE_BRANCH_NAME@" /* Use long long int for HYPRE_BigInt */ #cmakedefine HYPRE_MIXEDINT 1 /* Use long long int for HYPRE_BigInt and HYPRE_Int*/ #cmakedefine HYPRE_BIGINT 1 /* Use single precision values for HYPRE_Real */ #cmakedefine HYPRE_SINGLE 1 /* Use quad precision values for HYPRE_Real */ #cmakedefine HYPRE_LONG_DOUBLE 1 /* Use complex values */ #cmakedefine HYPRE_COMPLEX 1 /* Use cudaMallocAsync */ #cmakedefine HYPRE_USING_DEVICE_MALLOC_ASYNC 1 /* Use Thrust par_nosync policy */ #cmakedefine HYPRE_ENABLE_THRUST_ASYNC 1 /* Use GPU-aware MPI */ #cmakedefine HYPRE_USING_GPU_AWARE_MPI 1 /* Debug mode */ #cmakedefine HYPRE_DEBUG 1 /* Define to be the max dimension size (must be at least 3) */ #define HYPRE_MAXDIM 3 /* Use persistent communication */ #cmakedefine HYPRE_USING_PERSISTENT_COMM 1 /* Use hopscotch hashing */ #cmakedefine HYPRE_USING_HOPSCOTCH 1 /* Compile without MPI */ #cmakedefine HYPRE_SEQUENTIAL 1 /* Use HYPRE timing routines */ #cmakedefine HYPRE_TIMING 1 /* Use internal BLAS library */ #cmakedefine HYPRE_USING_HYPRE_BLAS 1 /* Use internal LAPACK library */ #cmakedefine HYPRE_USING_HYPRE_LAPACK 1 /* Print HYPRE errors */ #cmakedefine HYPRE_PRINT_ERRORS 1 /* Use OpenMP */ #cmakedefine HYPRE_USING_OPENMP 1 /* Use Caliper instrumentation */ #cmakedefine HYPRE_USING_CALIPER 1 /* Use UMPIRE */ #cmakedefine HYPRE_USING_UMPIRE 1 /* Use UMPIRE for device memory */ #cmakedefine HYPRE_USING_UMPIRE_DEVICE 1 /* Use UMPIRE for host memory */ #cmakedefine HYPRE_USING_UMPIRE_HOST 1 /* Use UMPIRE for pinned memory */ #cmakedefine HYPRE_USING_UMPIRE_PINNED 1 /* Use UMPIRE for unified memory */ #cmakedefine HYPRE_USING_UMPIRE_UM 1 /* Use if executing on device with CUDA */ #cmakedefine HYPRE_USING_CUDA 1 /* Use if executing on device with SYCL */ #cmakedefine HYPRE_USING_SYCL 1 /* Use rocBLAS */ #cmakedefine HYPRE_USING_ROCBLAS 1 /* Use rocRAND */ #cmakedefine HYPRE_USING_ROCRAND 1 /* Use rocSPARSE */ #cmakedefine HYPRE_USING_ROCSPARSE 1 /* Use rocSOLVER */ #cmakedefine HYPRE_USING_ROCSOLVER 1 /* Use rocTX profiling */ #cmakedefine HYPRE_USING_ROCTX 1 /* Use cuBLAS */ #cmakedefine HYPRE_USING_CUBLAS 1 /* Use CUDA streams */ #cmakedefine HYPRE_USING_CUDA_STREAMS 1 /* Use cuRAND */ #cmakedefine HYPRE_USING_CURAND 1 /* Use cuSPARSE */ #cmakedefine HYPRE_USING_CUSPARSE 1 /* Use cuSOLVER */ #cmakedefine HYPRE_USING_CUSOLVER 1 /* Use if using host memory only */ #cmakedefine HYPRE_USING_HOST_MEMORY 1 /* Use device memory pool */ #cmakedefine HYPRE_USING_DEVICE_POOL 1 /* Use unified memory */ #cmakedefine HYPRE_USING_UNIFIED_MEMORY 1 /* Use device memory without UM */ #cmakedefine HYPRE_USING_DEVICE_MEMORY 1 /* Use if executing on device with OpenMP */ #cmakedefine HYPRE_USING_DEVICE_OPENMP 1 /* Use if executing on GPU device */ #cmakedefine HYPRE_USING_GPU 1 /* Use if executing hypre tests on host (CPU) */ #cmakedefine HYPRE_TEST_USING_HOST 1 /* Use HIP */ #cmakedefine HYPRE_USING_HIP 1 /* Use NVTX */ #cmakedefine HYPRE_USING_NVTX 1 /* Use oneMLK spasre */ #cmakedefine HYPRE_USING_ONEMKLSPARSE 1 /* Use oneMLK blas */ #cmakedefine HYPRE_USING_ONEMKLBLAS 1 /* Use oneMLK rand */ #cmakedefine HYPRE_USING_ONEMKLRAND 1 /* Use SuperLU_Dist */ #cmakedefine HYPRE_USING_DSUPERLU 1 /* Use MAGMA */ #cmakedefine HYPRE_USING_MAGMA 1 /* Use SuperLU */ #cmakedefine HAVE_SUPERLU 1 /* Use MPI */ #cmakedefine HYPRE_HAVE_MPI 1 /* Use MPI_Comm_f2c */ #cmakedefine HYPRE_HAVE_MPI_COMM_F2C 1 /* Define as follows to set the Fortran name mangling scheme: * 0 = unspecified * 1 = no underscores * 2 = one underscore * 3 = two underscores * 4 = caps, no underscores * 5 = one underscore before and after */ #define HYPRE_FMANGLE @HYPRE_FMANGLE@ /* Define as in HYPRE_FMANGLE to set the BLAS name mangling scheme */ #define HYPRE_FMANGLE_BLAS @HYPRE_FMANGLE_BLAS@ /* Define as in HYPRE_FMANGLE to set the LAPACK name mangling scheme */ #define HYPRE_FMANGLE_LAPACK @HYPRE_FMANGLE_LAPACK@ /* Define to a macro mangling the given C identifier (in lower and upper * case), which must not contain underscores, for linking with Fortran. */ #define HYPRE_F77_FUNC(name,NAME) name ## _ /* As F77_FUNC, but for C identifiers containing underscores. */ #define HYPRE_F77_FUNC_(name,NAME) name ## __ hypre-2.33.0/src/config/HYPRE_config.h.in000066400000000000000000000171761477326011500177760ustar00rootroot00000000000000/* config/HYPRE_config.h.in. Generated from configure.in by autoheader. */ /* Define to dummy `main' function (if any) required to link to the Fortran libraries. */ #undef FC_DUMMY_MAIN /* Define if F77 and FC dummy `main' functions are identical. */ #undef FC_DUMMY_MAIN_EQ_F77 /* Define to a macro mangling the given C identifier (in lower and upper case), which must not contain underscores, for linking with Fortran. */ #undef FC_FUNC /* As FC_FUNC, but for C identifiers containing underscores. */ #undef FC_FUNC_ /* Define to 1 if you have the header file. */ #undef HAVE_INTTYPES_H /* Define to 1 if using MLI */ #undef HAVE_MLI /* Define to 1 if you have the `MPI_Comm_f2c' function. */ #undef HAVE_MPI_COMM_F2C /* Define to 1 if you have the header file. */ #undef HAVE_STDINT_H /* Define to 1 if you have the header file. */ #undef HAVE_STDIO_H /* Define to 1 if you have the header file. */ #undef HAVE_STDLIB_H /* Define to 1 if you have the header file. */ #undef HAVE_STRINGS_H /* Define to 1 if you have the header file. */ #undef HAVE_STRING_H /* Define to 1 if using SuperLU */ #undef HAVE_SUPERLU /* Define to 1 if you have the header file. */ #undef HAVE_SYS_STAT_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_TYPES_H /* Define to 1 if you have the header file. */ #undef HAVE_UNISTD_H /* Define to 1 for Alpha platforms */ #undef HYPRE_ALPHA /* Define to 1 if using long long int for HYPRE_Int and HYPRE_BigInt */ #undef HYPRE_BIGINT /* Feature branch string */ #undef HYPRE_BRANCH_NAME /* Define to 1 if using complex values */ #undef HYPRE_COMPLEX /* Define to 1 if in debug mode */ #undef HYPRE_DEBUG /* Main development branch? */ #undef HYPRE_DEVELOP_BRANCH /* Develop branch commit number */ #undef HYPRE_DEVELOP_NUMBER /* Develop branch string */ #undef HYPRE_DEVELOP_STRING /* Define to 1 if using OpenMP on device [target alloc version] */ #undef HYPRE_DEVICE_OPENMP_ALLOC /* Define to 1 if strictly checking OpenMP offload directives */ #undef HYPRE_DEVICE_OPENMP_CHECK /* Define as follows to set the Fortran name mangling scheme: 0 = unspecified; 1 = no underscores; 2 = one underscore; 3 = two underscores; 4 = caps, no underscores; 5 = one underscore before and after */ #undef HYPRE_FMANGLE /* BLAS mangling */ #undef HYPRE_FMANGLE_BLAS /* LAPACK mangling */ #undef HYPRE_FMANGLE_LAPACK /* Define to 1 if an MPI library is found */ #undef HYPRE_HAVE_MPI /* Define to 1 if the routine MPI_Comm_f2c is found */ #undef HYPRE_HAVE_MPI_COMM_F2C /* Define to 1 for HP platforms */ #undef HYPRE_HPPA /* Define to 1 for IRIX64 platforms */ #undef HYPRE_IRIX64 /* Define to 1 for Linux platform */ #undef HYPRE_LINUX /* Define to 1 for Linux on platforms running any version of CHAOS */ #undef HYPRE_LINUX_CHAOS /* Define to 1 if using quad precision values for HYPRE_Real */ #undef HYPRE_LONG_DOUBLE /* Define to be the max dimension size (must be at least 3) */ #undef HYPRE_MAXDIM /* Define to 1 if using long long int for HYPRE_BigInt */ #undef HYPRE_MIXEDINT /* Print HYPRE errors */ #undef HYPRE_PRINT_ERRORS /* Bug reports */ #undef HYPRE_RELEASE_BUGS /* Date of release */ #undef HYPRE_RELEASE_DATE /* Release name */ #undef HYPRE_RELEASE_NAME /* Release number */ #undef HYPRE_RELEASE_NUMBER /* Time of release */ #undef HYPRE_RELEASE_TIME /* Release version */ #undef HYPRE_RELEASE_VERSION /* Define to 1 for RS6000 platforms */ #undef HYPRE_RS6000 /* Disable MPI, enable serial codes. */ #undef HYPRE_SEQUENTIAL /* Define to 1 if using single precision values for HYPRE_Real */ #undef HYPRE_SINGLE /* Define to 1 for Solaris. */ #undef HYPRE_SOLARIS /* Define to 1 if want to use host in hypre tests */ #undef HYPRE_TEST_USING_HOST /* Using HYPRE timing routines */ #undef HYPRE_TIMING /* Define to 1 if Caliper instrumentation is enabled */ #undef HYPRE_USING_CALIPER /* Define to 1 if using cuBLAS */ #undef HYPRE_USING_CUBLAS /* Define to 1 if executing on device with CUDA */ #undef HYPRE_USING_CUDA /* Define to 1 if using streams */ #undef HYPRE_USING_CUDA_STREAMS /* Define to 1 if using cuRAND */ #undef HYPRE_USING_CURAND /* Define to 1 if using cuSOLVER */ #undef HYPRE_USING_CUSOLVER /* Define to 1 if using cuSPARSE */ #undef HYPRE_USING_CUSPARSE /* Define to 1 if using device async malloc */ #undef HYPRE_USING_DEVICE_MALLOC_ASYNC /* Define to 1 if using device memory without UM */ #undef HYPRE_USING_DEVICE_MEMORY /* Define to 1 if executing on device with OpenMP */ #undef HYPRE_USING_DEVICE_OPENMP /* Define to 1 if using device pooling allocator */ #undef HYPRE_USING_DEVICE_POOL /* Define to 1 if using DSuperLU */ #undef HYPRE_USING_DSUPERLU /* Using dxml for Blas */ #undef HYPRE_USING_DXML /* Using ESSL for Lapack */ #undef HYPRE_USING_ESSL /* Define to 1 if executing on GPU device */ #undef HYPRE_USING_GPU /* Define to 1 if using GPU aware MPI */ #undef HYPRE_USING_GPU_AWARE_MPI /* HIP being used */ #undef HYPRE_USING_HIP /* Define to 1 if using hopscotch hashing */ #undef HYPRE_USING_HOPSCOTCH /* Define to 1 if using host memory only */ #undef HYPRE_USING_HOST_MEMORY /* Using internal HYPRE routines */ #undef HYPRE_USING_HYPRE_BLAS /* Using internal HYPRE routines */ #undef HYPRE_USING_HYPRE_LAPACK /* Define to 1 if executing on host/device with KOKKOS */ #undef HYPRE_USING_KOKKOS /* Define to 1 if MAGMA is enabled */ #undef HYPRE_USING_MAGMA /* Define to 1 if want to track memory operations in hypre */ #undef HYPRE_USING_MEMORY_TRACKER /* Define to 1 if Node Aware MPI library is used */ #undef HYPRE_USING_NODE_AWARE_MPI /* Define to 1 if using NVIDIA Tools Extension (NVTX) */ #undef HYPRE_USING_NVTX /* onemkl::BLAS being used */ #undef HYPRE_USING_ONEMKLBLAS /* onemkl::rng being used */ #undef HYPRE_USING_ONEMKLRAND /* onemkl::SPARSE being used */ #undef HYPRE_USING_ONEMKLSPARSE /* Enable OpenMP support */ #undef HYPRE_USING_OPENMP /* Define to 1 if using persistent communication */ #undef HYPRE_USING_PERSISTENT_COMM /* Define to 1 if executing on host/device with RAJA */ #undef HYPRE_USING_RAJA /* rocBLAS being used */ #undef HYPRE_USING_ROCBLAS /* rocRAND being used */ #undef HYPRE_USING_ROCRAND /* rocSOLVER being used */ #undef HYPRE_USING_ROCSOLVER /* rocSPARSE being used */ #undef HYPRE_USING_ROCSPARSE /* Define to 1 if using AMD rocTX profiling */ #undef HYPRE_USING_ROCTX /* SYCL being used */ #undef HYPRE_USING_SYCL /* Define to 1 if using thrust par_nosync policy */ #undef HYPRE_USING_THRUST_NOSYNC /* Define to 1 if using UMPIRE */ #undef HYPRE_USING_UMPIRE /* Define to 1 if using UMPIRE for device memory */ #undef HYPRE_USING_UMPIRE_DEVICE /* Define to 1 if using UMPIRE for host memory */ #undef HYPRE_USING_UMPIRE_HOST /* Define to 1 if using UMPIRE for pinned memory */ #undef HYPRE_USING_UMPIRE_PINNED /* Define to 1 if using UMPIRE for unified memory */ #undef HYPRE_USING_UMPIRE_UM /* Define to 1 if using unified memory */ #undef HYPRE_USING_UNIFIED_MEMORY /* Define to the address where bug reports for this package should be sent. */ #undef PACKAGE_BUGREPORT /* Define to the full name of this package. */ #undef PACKAGE_NAME /* Define to the full name and version of this package. */ #undef PACKAGE_STRING /* Define to the one symbol short name of this package. */ #undef PACKAGE_TARNAME /* Define to the home page for this package. */ #undef PACKAGE_URL /* Define to the version of this package. */ #undef PACKAGE_VERSION /* Define to 1 if all of the C90 standard headers exist (not just the ones required in a freestanding environment). This macro is provided for backward compatibility; new code need not use it. */ #undef STDC_HEADERS hypre-2.33.0/src/config/Makefile.config.in000066400000000000000000000155751477326011500203160ustar00rootroot00000000000000# Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) ############################################################################### ## All configurable variables are defined in the file named Makefile.config.in ## When Autoconf is run, it will create a file named Makefile.config which ## will have all of the configurable variables replaced with their values. ############################################################################### @SET_MAKE@ srcdir = @srcdir@ top_srcdir = @top_srcdir@ prefix = @prefix@ exec_prefix = @exec_prefix@ VPATH = @srcdir@ HYPRE_RELEASE_NAME = @HYPRE_NAME@ HYPRE_RELEASE_VERSION = @HYPRE_VERSION@ HYPRE_RELEASE_DATE = @HYPRE_DATE@ HYPRE_RELEASE_TIME = @HYPRE_TIME@ HYPRE_RELEASE_BUGS = @HYPRE_BUGS@ HYPRE_SRC_TOP_DIR = @HYPRE_SRCDIR@ HYPRE_BUILD_DIR = @HYPRE_SRCDIR@/hypre HYPRE_INSTALL_DIR = @HYPRE_INSTALLDIR@ HYPRE_LIB_INSTALL = @HYPRE_LIBINSTALL@ HYPRE_INC_INSTALL = @HYPRE_INCINSTALL@ HYPRE_LIB_SUFFIX = @HYPRE_LIBSUFFIX@ .SUFFIXES: .SUFFIXES: .o .obj .f .c .C .cxx .cc FC = @FC@ FFLAGS = @FFLAGS@ @FCFLAGS@ $(FC_COMPILE_FLAGS) CC = @CC@ CFLAGS = @CFLAGS@ @DEFS@ $(C_COMPILE_FLAGS) CXX = @CXX@ CXXFLAGS = @CXXFLAGS@ @DEFS@ $(CXX_COMPILE_FLAGS) CUCC = @CUCC@ ${CUDA_ARCH} CUFLAGS = @CUFLAGS@ @DEFS@ ${C_COMPILE_FLAGS} .f.o: $(FC) $(FFLAGS) -c $< .c.o: $(CC) $(CFLAGS) -c $< .C.o: $(CXX) $(CXXFLAGS) -c $< .cxx.o: $(CXX) $(CXXFLAGS) -c $< .cc.o: $(CXX) $(CXXFLAGS) -c $< ifeq ($(CUCC), ) .c.obj: $(CC) $(CFLAGS) -c $< -o $@ else .c.obj: $(CUCC) $(CUFLAGS) -c $< -o $@ endif LINK_FC = @LINK_FC@ LINK_CC = @LINK_CC@ LINK_CXX = @LINK_CXX@ BUILD_FC_SHARED = @BUILD_FC_SHARED@ BUILD_CC_SHARED = @BUILD_CC_SHARED@ BUILD_CXX_SHARED = @BUILD_CXX_SHARED@ SHARED_COMPILE_FLAG = @SHARED_COMPILE_FLAG@ SHARED_BUILD_FLAG = @SHARED_BUILD_FLAG@ SHARED_SET_SONAME = @SHARED_SET_SONAME@ SHARED_OPTIONS = @SHARED_OPTIONS@ BUILD_PYTHON = @BUILD_PYTHON@ PYTHON = @PYTHON@ BUILD_JAVA = @BUILD_JAVA@ AR = @AR@ RANLIB = @RANLIB@ LDFLAGS = @LDFLAGS@ LIBS = @LIBS@ ${CALIPER_LIBS} ${HYPRE_CUDA_LIBS} ${HYPRE_HIP_LIBS} ${HYPRE_SYCL_LIBS} ${HYPRE_RAJA_LIB_DIR} ${HYPRE_RAJA_LIB} ${HYPRE_KOKKOS_LIB_DIR} ${HYPRE_KOKKOS_LIB} ${HYPRE_UMPIRE_LIB_DIR} ${HYPRE_UMPIRE_LIB} ${HYPRE_MAGMA_LIB_DIR} ${HYPRE_MAGMA_LIB} FLIBS = @FLIBS@ INCLUDES = ${CALIPER_INCLUDE} ${HYPRE_CUDA_INCLUDE} ${HYPRE_HIP_INCLUDE} ${HYPRE_SYCL_INCLUDE} ${HYPRE_RAJA_INCLUDE} ${HYPRE_KOKKOS_INCLUDE} ${HYPRE_UMPIRE_INCLUDE} ${HYPRE_MAGMA_INCLUDE} ${HYPRE_NAP_INCLUDE} ################################################################## ## LAPACK Library Flags ################################################################## LAPACKLIBS = @LAPACKLIBS@ LAPACKLIBDIRS = @LAPACKLIBDIRS@ ################################################################## ## BLAS Library Flags ################################################################## BLASLIBS = @BLASLIBS@ BLASLIBDIRS = @BLASLIBDIRS@ ################################################################## ## MPI options ################################################################## MPIINCLUDE = @MPIINCLUDE@ MPILIBDIRS = @MPILIBDIRS@ MPILIBS = @MPILIBS@ MPIFLAGS = @MPIFLAGS@ ################################################################## ## Node Aware MPI options ################################################################## HYPRE_NAP_INCLUDE = @HYPRE_NAP_INCLUDE@ ################################################################## ## CUDA options ################################################################## HYPRE_CUDA_PATH = @HYPRE_CUDA_PATH@ HYPRE_CUDA_INCLUDE = @HYPRE_CUDA_INCLUDE@ HYPRE_CUDA_LIBS = @HYPRE_CUDA_LIBS@ CUDA_ARCH = @HYPRE_CUDA_GENCODE@ ################################################################## ## HIP options ################################################################## HYPRE_HIP_INCLUDE = @HYPRE_HIP_INCL@ HYPRE_HIP_LIBS = @HYPRE_HIP_LIBS@ ################################################################## ## SYCL options ################################################################## HYPRE_SYCL_INCLUDE=@HYPRE_SYCL_INCL@ HYPRE_SYCL_LIBS=@HYPRE_SYCL_LIBS@ ################################################################## ## Caliper options ################################################################## CALIPER_INCLUDE = @CALIPER_INCLUDE@ CALIPER_LIBS = @CALIPER_LIBS@ ################################################################## ## Euclid, ParaSails, pilut options ################################################################## HYPRE_DISTRIBUTED_LS_DIR = @HYPRE_DISTRIBUTED_LS_DIR@ HYPRE_EUCLID_FILES = @HYPRE_EUCLID_FILES@ HYPRE_PARASAILS_FILES = @HYPRE_PARASAILS_FILES@ HYPRE_PILUT_FILES = @HYPRE_PILUT_FILES@ ################################################################## ## MAGMA options ################################################################## HYPRE_MAGMA_LIB_DIR = @HYPRE_MAGMA_LIB_DIR@ HYPRE_MAGMA_INCLUDE = @HYPRE_MAGMA_INCLUDE@ HYPRE_MAGMA_LIB = @HYPRE_MAGMA_LIB@ ################################################################## ## SuperLU options ################################################################## SUPERLU_INCLUDE = @SUPERLU_INCLUDE@ SUPERLU_LIBS = @SUPERLU_LIBS@ ################################################################## ## DsuperLU options ################################################################## DSUPERLU_INCLUDE = @DSUPERLU_INCLUDE@ DSUPERLU_LIBS = @DSUPERLU_LIBS@ ################################################################## ## FEI options ################################################################## HYPRE_FEI_SRC_DIR = @HYPRE_FEI_SRC_DIR@ HYPRE_FEI_BASE_DIR = @HYPRE_FEI_BASE_DIR@ HYPRE_FEI_SUBDIRS = @HYPRE_FEI_SUBDIRS@ HYPRE_FEI_HYPRE_FILES = @HYPRE_FEI_HYPRE_FILES@ HYPRE_FEI_FEMLI_FILES = @HYPRE_FEI_FEMLI_FILES@ ################################################################## ## RAJA options ################################################################## HYPRE_RAJA_LIB_DIR = @HYPRE_RAJA_LIB_DIR@ HYPRE_RAJA_INCLUDE = @HYPRE_RAJA_INCLUDE@ HYPRE_RAJA_LIB = @HYPRE_RAJA_LIB@ ################################################################## ## kokkos options ################################################################## HYPRE_KOKKOS_SRC_DIR = @HYPRE_KOKKOS_SRC_DIR@ HYPRE_KOKKOS_LIB_DIR = @HYPRE_KOKKOS_LIB_DIR@ HYPRE_KOKKOS_INCLUDE = @HYPRE_KOKKOS_INCLUDE@ HYPRE_KOKKOS_LIB = @HYPRE_KOKKOS_LIB@ ################################################################## ## UMPIRE options ################################################################## HYPRE_UMPIRE_LIB_DIR = @HYPRE_UMPIRE_LIB_DIR@ HYPRE_UMPIRE_INCLUDE = @HYPRE_UMPIRE_INCLUDE@ HYPRE_UMPIRE_LIB = @HYPRE_UMPIRE_LIB@ hypre-2.33.0/src/config/astyle-apply.sh000077500000000000000000000034651477326011500177630ustar00rootroot00000000000000#!/bin/bash # Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) scriptname=`basename $0 .sh` # Check number of arguments if [ $# -lt 1 ]; then echo "Need at least one argument" exit fi # Echo usage information case $1 in -h|-help) cat < $scriptname.files # Apply indentation style to source files astyle_result=$(astyle --options=config/astylerc $(cat $scriptname.files)) if [ -n "$astyle_result" ]; then echo "Please make sure changes are committed" else echo "No source files were changed" fi # Run headers scripts for i in $(find . -name 'headers') do dir=$(dirname $i) (cd $dir; ./headers) done rm -f $scriptname.files hypre-2.33.0/src/config/astylerc000066400000000000000000000011151477326011500165370ustar00rootroot00000000000000# Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) # Formatting options for Artistic Style --style=allman --indent=spaces=3 --keep-one-line-statements --keep-one-line-blocks --pad-header --max-code-length=100 --max-continuation-indent=100 --min-conditional-indent=0 --indent-col1-comments --indent-labels --break-after-logical --add-braces --indent-switches --convert-tabs --lineend=linux --suffix=none --preserve-date --formatted --pad-oper hypre-2.33.0/src/config/cmake/000077500000000000000000000000001477326011500160505ustar00rootroot00000000000000hypre-2.33.0/src/config/cmake/HYPRE_CMakeUtilities.cmake000066400000000000000000000535611477326011500227070ustar00rootroot00000000000000# Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) # Function to set hypre build options function(set_hypre_option category name description default_value) option(${name} "${description}" ${default_value}) if (${category} STREQUAL "CUDA" OR ${category} STREQUAL "HIP" OR ${category} STREQUAL "SYCL") if (HYPRE_ENABLE_${category} STREQUAL "ON") set(GPU_OPTIONS ${GPU_OPTIONS} ${name} PARENT_SCOPE) endif() else() set(${category}_OPTIONS ${${category}_OPTIONS} ${name} PARENT_SCOPE) endif() endfunction() # Function to set internal hypre build options function(set_internal_hypre_option var_prefix var_name) if(HYPRE_ENABLE_${var_name}) if(var_prefix STREQUAL "") set(HYPRE_${var_name} ON CACHE INTERNAL "") else() set(HYPRE_${var_prefix}_${var_name} ON CACHE INTERNAL "") endif() endif() endfunction() # Function to setup git version info function(setup_git_version_info HYPRE_GIT_DIR) set(GIT_VERSION_FOUND FALSE PARENT_SCOPE) if (EXISTS "${HYPRE_GIT_DIR}") execute_process(COMMAND git -C ${HYPRE_GIT_DIR} describe --match v* --long --abbrev=9 OUTPUT_VARIABLE develop_string OUTPUT_STRIP_TRAILING_WHITESPACE RESULT_VARIABLE git_result) if (git_result EQUAL 0) set(GIT_VERSION_FOUND TRUE PARENT_SCOPE) execute_process(COMMAND git -C ${HYPRE_GIT_DIR} describe --match v* --abbrev=0 OUTPUT_VARIABLE develop_lastag OUTPUT_STRIP_TRAILING_WHITESPACE) execute_process(COMMAND git -C ${HYPRE_GIT_DIR} rev-list --count ${develop_lastag}..HEAD OUTPUT_VARIABLE develop_number OUTPUT_STRIP_TRAILING_WHITESPACE) execute_process(COMMAND git -C ${HYPRE_GIT_DIR} rev-parse --abbrev-ref HEAD OUTPUT_VARIABLE develop_branch OUTPUT_STRIP_TRAILING_WHITESPACE) set(HYPRE_DEVELOP_STRING ${develop_string} PARENT_SCOPE) set(HYPRE_DEVELOP_NUMBER ${develop_number} PARENT_SCOPE) set(HYPRE_BRANCH_NAME ${develop_branch} PARENT_SCOPE) if (develop_branch MATCHES "master") set(HYPRE_DEVELOP_BRANCH ${develop_branch} PARENT_SCOPE) endif () endif() endif() endfunction() # Function to check if two options have the same value function(ensure_options_match option1 option2) if(DEFINED CACHE{${option1}} AND DEFINED CACHE{${option2}}) #if ((${option1} AND NOT ${option2}) OR (NOT ${option1} AND ${option2})) if(NOT (${option1} STREQUAL ${option2}) AND NOT (${option1} STREQUAL "OFF" AND ${option2} STREQUAL "OFF")) # Save the value of the conflicting options set(saved_value1 "${${option1}}") set(saved_value2 "${${option2}}") # Unset conflicting options unset(${option1} CACHE) unset(${option2} CACHE) message(FATAL_ERROR "Incompatible options: ${option1} (${saved_value1}) and ${option2} (${saved_value2}) must have the same value. Unsetting both options.") endif() endif() endfunction() # Function to check if two options have different values function(ensure_options_differ option1 option2) if(DEFINED ${option1} AND DEFINED ${option2}) if(${option1} AND ${${option2}}) # Save the value of the conflicting options set(saved_value1 "${${option1}}") set(saved_value2 "${${option2}}") # Unset conflicting options unset(${option1} CACHE) unset(${option2} CACHE) message(FATAL_ERROR "Error: ${option1} (${saved_value1}) and ${option2} (${saved_value2}) are mutually exclusive. Only one can be set to ON. Unsetting both options.") endif() endif() endfunction() # Helper function to process Fortran mangling scheme function(process_fmangling_scheme varname description) set(mangling_map UNSPECIFIED 0 NONE 1 ONE_UNDERSCORE 2 TWO_UNDERSCORES 3 CAPS 4 PRE_POST_UNDERSCORE 5 ) list(LENGTH mangling_map map_length) math(EXPR last_index "${map_length} - 1") # Check if varname is a numeric value if (HYPRE_ENABLE_${varname} MATCHES "^[0-9]+$") foreach(i RANGE 0 ${last_index} 2) math(EXPR next_index "${i} + 1") list(GET mangling_map ${next_index} value) if (HYPRE_ENABLE_${varname} STREQUAL ${value}) list(GET mangling_map ${i} key) message(STATUS "HYPRE_ENABLE_${varname} corresponds to Fortran ${description} mangling scheme: ${key}") set(HYPRE_${varname} ${value} CACHE INTERNAL "Set the Fortran ${description} mangling scheme") return() endif() endforeach() endif() # Check if varname matches any string key foreach(i RANGE 0 ${last_index} 2) list(GET mangling_map ${i} key) math(EXPR next_index "${i} + 1") list(GET mangling_map ${next_index} value) if (HYPRE_ENABLE_${varname} MATCHES ${key}) if (NOT HYPRE_ENABLE_${varname} MATCHES "UNSPECIFIED") message(STATUS "Using Fortran ${description} mangling scheme: ${key}") endif() set(HYPRE_${varname} ${value} CACHE INTERNAL "Set the Fortran ${description} mangling scheme") return() endif() endforeach() # Default case message(STATUS "Unknown value for HYPRE_ENABLE_${varname}. Defaulting to UNSPECIFIED (0)") set(HYPRE_${varname} 0 CACHE INTERNAL "Set the Fortran ${description} mangling scheme") endfunction() # Function to configure MPI target function(configure_mpi_target) find_package(MPI REQUIRED) target_link_libraries(${PROJECT_NAME} PUBLIC MPI::MPI_C) # Determine the correct MPI include directory if(MPI_CXX_INCLUDE_DIR) set(MPI_INCLUDE_DIR ${MPI_CXX_INCLUDE_DIR}) elseif(MPI_CXX_INCLUDE_PATH) set(MPI_INCLUDE_DIR ${MPI_CXX_INCLUDE_PATH}) elseif(MPI_CXX_COMPILER_INCLUDE_DIR) set(MPI_INCLUDE_DIR ${MPI_CXX_COMPILER_INCLUDE_DIR}) elseif(MPI_C_COMPILER_INCLUDE_DIR) set(MPI_INCLUDE_DIR ${MPI_C_COMPILER_INCLUDE_DIR}) elseif(MPI_C_INCLUDE_DIR) set(MPI_INCLUDE_DIR ${MPI_C_INCLUDE_DIR}) elseif(MPI_C_INCLUDE_PATH) set(MPI_INCLUDE_DIR ${MPI_C_INCLUDE_PATH}) elseif(MPI_INCLUDE_PATH) set(MPI_INCLUDE_DIR ${MPI_INCLUDE_PATH}) elseif(MPICH_DIR) set(MPI_INCLUDE_DIR ${MPICH_DIR}/include) elseif(DEFINED ENV{MPICH_DIR}) set(MPI_INCLUDE_DIR $ENV{MPICH_DIR}/include) else() message(WARNING "MPI include directory not found. Please specify -DMPI_INCLUDE_DIR or the compilation may fail.") endif() if (HYPRE_ENABLE_CUDA OR HYPRE_ENABLE_HIP OR HYPRE_ENABLE_SYCL) message(STATUS "Adding MPI include directory: ${MPI_INCLUDE_DIR}") target_include_directories(${PROJECT_NAME} PUBLIC ${MPI_INCLUDE_DIR}) endif () message(STATUS "MPI execution command: ${MPIEXEC_EXECUTABLE}") set(CMAKE_REQUIRED_LIBRARIES ${CMAKE_REQUIRED_LIBRARIES} MPI::MPI_C) # Check if MPI supports the MPI_Comm_f2c function include(CheckCSourceCompiles) check_c_source_compiles(" #include int main() { MPI_Comm c = MPI_Comm_f2c(0); return 0; } " HYPRE_HAVE_MPI_COMM_F2C) # Define a pattern for LTO-related flags (compiler-specific) set(LTO_FLAG_PATTERNS ".*lto.*" ".*ipo.*" ".*-fthinlto.*" ".*fat-lto-objects.*") # Remove LTO-related flags from MPI target properties if applicable foreach (mpi_target MPI::MPI_C MPI::MPI_CXX) if (TARGET ${mpi_target}) get_target_property(target_options ${mpi_target} INTERFACE_COMPILE_OPTIONS) if (target_options) #message(STATUS "target_options: ${target_options}") set(original_options "${target_options}") # Save for comparison list(APPEND target_options) # Ensure it's treated as a list # Remove matching flags set(removed_flags "") list(APPEND removed_flags) foreach (pattern IN LISTS LTO_FLAG_PATTERNS) foreach (flag IN LISTS target_options) if("${flag}" MATCHES "${pattern}") list(REMOVE_ITEM target_options "${flag}") list(APPEND removed_flags "${flag}") endif() endforeach() endforeach() #message(STATUS "removed_flags: ${removed_flags}") list(LENGTH removed_flags removed_flags_length) if (removed_flags_length GREATER 0) set(target_options "${target_options}" CACHE STRING "Updated ${target_options} without LTO-related flags" FORCE) set_target_properties(${mpi_target} PROPERTIES INTERFACE_COMPILE_OPTIONS "${target_options}") message(STATUS "Removed LTO-related flags from ${mpi_target}: ${removed_flags}") endif() endif() endif() endforeach() endfunction() # Function to get dependency library version function(get_library_version LIBNAME) if(TARGET ${LIBNAME}::${LIBNAME}) get_target_property(LIB_VERSION ${LIBNAME}::${LIBNAME} VERSION) endif() if(NOT LIB_VERSION) if(DEFINED ${LIBNAME}_VERSION) set(LIB_VERSION "${${LIBNAME}_VERSION}") elseif(DEFINED ${LIBNAME}_VERSION_STRING) set(LIB_VERSION "${${LIBNAME}_VERSION_STRING}") elseif(DEFINED ${LIBNAME}_VERSION_MAJOR AND DEFINED ${LIBNAME}_VERSION_MINOR) set(LIB_VERSION "${${LIBNAME}_VERSION_MAJOR}.${${LIBNAME}_VERSION_MINOR}") if(DEFINED ${LIBNAME}_VERSION_PATCH) set(LIB_VERSION "${LIB_VERSION}.${${LIBNAME}_VERSION_PATCH}") endif() endif() endif() if(LIB_VERSION) message(STATUS " ${LIBNAME} version: ${LIB_VERSION}") else() message(STATUS " ${LIBNAME} version: unknown") endif() endfunction() # Macro to extract language flags macro(get_language_flags in_var out_var lang_type) string(REGEX MATCHALL "\\$<\\$:([^>]*)>" matches "${in_var}") if(matches) string(REGEX REPLACE "\\$<\\$:" "" temp "${matches}") string(REGEX REPLACE ">" "" temp "${temp}") set(${out_var} ${temp}) else() set(${out_var} "") endif() endmacro() # Function to handle TPL (Third-Party Library) setup function(setup_tpl LIBNAME) string(TOUPPER ${LIBNAME} LIBNAME_UPPER) # Note we need to check for "USING" instead of "WITH" because # we want to allow for post-processing of build options via cmake if(HYPRE_USING_${LIBNAME_UPPER}) if(TPL_${LIBNAME_UPPER}_LIBRARIES AND TPL_${LIBNAME_UPPER}_INCLUDE_DIRS) # Use specified TPL libraries and include dirs foreach(dir ${TPL_${LIBNAME_UPPER}_INCLUDE_DIRS}) if(NOT EXISTS ${dir}) message(FATAL_ERROR "${LIBNAME_UPPER} include directory not found: ${dir}") endif() endforeach() foreach(lib ${TPL_${LIBNAME_UPPER}_LIBRARIES}) if(EXISTS ${lib}) message(STATUS "${LIBNAME_UPPER} library found: ${lib}") get_filename_component(LIB_DIR "${lib}" DIRECTORY) set_property(TARGET ${PROJECT_NAME} APPEND PROPERTY INSTALL_RPATH "${LIB_DIR}") else() message(WARNING "${LIBNAME_UPPER} library not found at specified path: ${lib}") endif() endforeach() target_link_libraries(${PROJECT_NAME} PUBLIC ${TPL_${LIBNAME_UPPER}_LIBRARIES}) target_include_directories(${PROJECT_NAME} PUBLIC ${TPL_${LIBNAME_UPPER}_INCLUDE_DIRS}) else() # Use find_package find_package(${LIBNAME} REQUIRED CONFIG) if(${LIBNAME}_FOUND) list(APPEND HYPRE_DEPENDENCY_DIRS "${${LIBNAME}_ROOT}") set(HYPRE_DEPENDENCY_DIRS "${HYPRE_DEPENDENCY_DIRS}" CACHE INTERNAL "" FORCE) if(${LIBNAME} STREQUAL "caliper") set(HYPRE_NEEDS_CXX TRUE PARENT_SCOPE) endif() if(TARGET ${LIBNAME}::${LIBNAME}) target_link_libraries(${PROJECT_NAME} PUBLIC ${LIBNAME}::${LIBNAME}) message(STATUS "Found ${LIBNAME} target: ${LIBNAME}::${LIBNAME}") elseif(TARGET ${LIBNAME}) target_link_libraries(${PROJECT_NAME} PUBLIC ${LIBNAME}) message(STATUS "Found ${LIBNAME} target: ${LIBNAME}") else() message(FATAL_ERROR "${LIBNAME} target not found. Please check your ${LIBNAME} installation") endif() else() message(FATAL_ERROR "${LIBNAME_UPPER} target not found. Please check your ${LIBNAME_UPPER} installation") endif() # Display library info get_library_version(${LIBNAME}) if(DEFINED ${LIBNAME}_DIR) message(STATUS " Config directory: ${${LIBNAME}_DIR}") endif() endif() message(STATUS "Enabled support for using ${LIBNAME_UPPER}") if(${LIBNAME_UPPER} STREQUAL "SUPERLU" OR ${LIBNAME_UPPER} STREQUAL "DSUPERLU" OR ${LIBNAME_UPPER} STREQUAL "UMPIRE") target_link_libraries(${PROJECT_NAME} PUBLIC stdc++) endif() set(${LIBNAME_UPPER}_FOUND TRUE PARENT_SCOPE) endif() endfunction() # Function to setup TPL or internal library implementation function(setup_tpl_or_internal LIB_NAME) string(TOUPPER ${LIB_NAME} LIB_NAME_UPPER) if(HYPRE_USING_HYPRE_${LIB_NAME_UPPER}) # Use internal library add_subdirectory(${LIB_NAME}) message(STATUS "Using internal ${LIB_NAME_UPPER}") target_include_directories(${PROJECT_NAME} PUBLIC $ $ ) else() # Use external library if(TPL_${LIB_NAME_UPPER}_LIBRARIES) # Use specified TPL libraries message(STATUS "Enabled support for using external ${LIB_NAME_UPPER}.") foreach(lib ${TPL_${LIB_NAME_UPPER}_LIBRARIES}) if(EXISTS ${lib}) message(STATUS "${LIB_NAME_UPPER} library found: ${lib}") else() message(WARNING "${LIB_NAME_UPPER} library not found at specified path: ${lib}") endif() endforeach() target_link_libraries(${PROJECT_NAME} PUBLIC ${TPL_${LIB_NAME_UPPER}_LIBRARIES}) else() # Find system library find_package(${LIB_NAME_UPPER} REQUIRED) if(${LIB_NAME_UPPER}_FOUND) message(STATUS "Using system ${LIB_NAME_UPPER}") if(TARGET ${LIB_NAME_UPPER}::${LIB_NAME_UPPER}) target_link_libraries(${PROJECT_NAME} PUBLIC ${LIB_NAME_UPPER}::${LIB_NAME_UPPER}) else() target_link_libraries(${PROJECT_NAME} PUBLIC ${${LIB_NAME_UPPER}_LIBRARIES}) endif() else() message(FATAL_ERROR "${LIB_NAME_UPPER} not found") endif() endif() endif() endfunction() # Function to setup FEI (to be phased out) function(setup_fei) if (HYPRE_USING_FEI) set(HYPRE_NEEDS_CXX TRUE PARENT_SCOPE) if (NOT TPL_FEI_INCLUDE_DIRS) message(FATAL_ERROR "TPL_FEI_INCLUDE_DIRS option should be set for FEI support.") endif () foreach (dir ${TPL_FEI_INCLUDE_DIRS}) if (NOT EXISTS ${dir}) message(FATAL_ERROR "FEI include directory not found: ${dir}") endif () target_compile_options(${PROJECT_NAME} PUBLIC -I${dir}) endforeach () message(STATUS "Enabled support for using FEI.") set(FEI_FOUND TRUE PARENT_SCOPE) target_include_directories(${PROJECT_NAME} PUBLIC ${TPL_FEI_INCLUDE_DIRS}) endif() endfunction() # A handy function to add the current source directory to a local # filename. To be used for creating a list of sources. function(convert_filenames_to_full_paths NAMES) unset(tmp_names) foreach(name ${${NAMES}}) list(APPEND tmp_names ${CMAKE_CURRENT_SOURCE_DIR}/${name}) endforeach() set(${NAMES} ${tmp_names} PARENT_SCOPE) endfunction() # A function to add hypre subdirectories to the build function(add_hypre_subdirectories DIRS) foreach(DIR IN LISTS DIRS) add_subdirectory(${DIR}) target_include_directories(${PROJECT_NAME} PRIVATE $) endforeach() endfunction() # A function to add each executable in the list to the build with the # correct flags, includes, and linkage. function(add_hypre_executables EXE_SRCS) # Add one executable per cpp file foreach(SRC_FILE IN LISTS ${EXE_SRCS}) get_filename_component(SRC_FILENAME ${SRC_FILE} NAME) # If CUDA is enabled, tag source files to be compiled with nvcc. if (HYPRE_USING_CUDA) set_source_files_properties(${SRC_FILENAME} PROPERTIES LANGUAGE CUDA) endif () # If HIP is enabled, tag source files to be compiled with hipcc/clang if (HYPRE_USING_HIP) set_source_files_properties(${SRC_FILENAME} PROPERTIES LANGUAGE HIP) endif () # If SYCL is enabled, tag source files to be compiled with dpcpp. if (HYPRE_USING_SYCL) set_source_files_properties(${SRC_FILENAME} PROPERTIES LANGUAGE CXX) endif () # Get executable name string(REPLACE ".c" "" EXE_NAME ${SRC_FILENAME}) # Add the executable add_executable(${EXE_NAME} ${SRC_FILE}) # Link with HYPRE and inherit its compile properties target_link_libraries(${EXE_NAME} PUBLIC HYPRE) # For Unix systems, also link with math library if (UNIX) target_link_libraries(${EXE_NAME} PUBLIC m) endif () # Explicitly specify the linker if ((HYPRE_USING_CUDA AND NOT HYPRE_ENABLE_LTO) OR HYPRE_USING_HIP OR HYPRE_USING_SYCL) set_target_properties(${EXE_NAME} PROPERTIES LINKER_LANGUAGE CXX) endif () # Turn on LTO if requested if (HYPRE_ENABLE_LTO) set_target_properties(${EXE_NAME} PROPERTIES INTERPROCEDURAL_OPTIMIZATION TRUE) endif () # Inherit compile definitions and options from HYPRE target get_target_property(HYPRE_COMPILE_OPTS HYPRE COMPILE_OPTIONS) #message(STATUS "${EXE_NAME}: ${HYPRE_COMPILE_OPTS}") if (HYPRE_COMPILE_OPTS) if (HYPRE_USING_CUDA OR HYPRE_USING_HIP OR HYPRE_USING_SYCL) get_language_flags("${HYPRE_COMPILE_OPTS}" CXX_OPTS "CXX") target_compile_options(${EXE_NAME} PRIVATE $<$:${CXX_OPTS}>) #message(STATUS "Added CXX compile options: ${CXX_OPTS} to ${EXE_NAME}") else () get_language_flags("${HYPRE_COMPILE_OPTS}" C_OPTS "C") target_compile_options(${EXE_NAME} PRIVATE $<$:${C_OPTS}>) #message(STATUS "Added C compile options: ${C_OPTS} to ${EXE_NAME}") endif () endif () # Copy executable to original source directory add_custom_command(TARGET ${EXE_NAME} POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy $ ${CMAKE_CURRENT_SOURCE_DIR} COMMENT "Copied ${EXE_NAME} to ${CMAKE_CURRENT_SOURCE_DIR}" ) endforeach (SRC_FILE) endfunction () # Function to add a tags target if etags is found function(add_hypre_target_tags) find_program(ETAGS_EXECUTABLE etags) if(ETAGS_EXECUTABLE) add_custom_target(tags COMMAND find ${CMAKE_CURRENT_SOURCE_DIR} -type f "(" -name "*.h" -o -name "*.c" -o -name "*.cpp" -o -name "*.hpp" -o -name "*.cxx" -o -name "*.f" -o -name "*.f90" ")" -not -path "*/build/*" -print | ${ETAGS_EXECUTABLE} --declarations --ignore-indentation --no-members - WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} COMMENT "Generating TAGS file with etags" VERBATIM ) endif() endfunction() # Function to add a distclean target function(add_hypre_target_distclean) add_custom_target(distclean COMMAND find ${CMAKE_BINARY_DIR} -mindepth 1 -delete COMMAND find ${CMAKE_SOURCE_DIR} -name "*.o" -type f -delete COMMAND find ${CMAKE_SOURCE_DIR} -name "*.mod" -type f -delete COMMAND find ${CMAKE_SOURCE_DIR} -name "*~" -type f -delete COMMAND find ${CMAKE_SOURCE_DIR}/test -name "*.out*" -type f -delete COMMAND find ${CMAKE_SOURCE_DIR}/test -name "*.err*" -type f -delete COMMAND find ${CMAKE_SOURCE_DIR}/examples -type f -name "ex[0-9]" -name "ex[10-19]" -delete COMMAND find ${CMAKE_SOURCE_DIR}/test -type f -name "ij|struct|sstruct|ams_driver|maxwell_unscalled|struct_migrate|sstruct_fac|ij_assembly" -delete WORKING_DIRECTORY ${CMAKE_BINARY_DIR} COMMENT "Removing all build artifacts and generated files" VERBATIM ) endfunction() # Function to add an uninstall target function(add_hypre_target_uninstall) add_custom_target(uninstall COMMAND ${CMAKE_COMMAND} -E remove_directory "${CMAKE_INSTALL_PREFIX}" COMMAND ${CMAKE_COMMAND} -E echo "Removed installation directory: ${CMAKE_INSTALL_PREFIX}" WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} COMMENT "Uninstalling HYPRE" VERBATIM ) endfunction() # Function to print the status of build options function(print_option_status) # Define column widths set(COLUMN1_WIDTH 40) set(COLUMN2_WIDTH 10) math(EXPR HEADER1_PAD "${COLUMN1_WIDTH} - 3") math(EXPR HEADER2_PAD "${COLUMN2_WIDTH} - 1") # Create separator line string(REPEAT "-" ${HEADER1_PAD} SEPARATOR1) string(REPEAT "-" ${HEADER2_PAD} SEPARATOR2) set(separator "+${SEPARATOR1}+${SEPARATOR2}+") # Function to print a block of options function(print_option_block title options) message(STATUS "") message(STATUS " ${title}:") message(STATUS " ${separator}") message(STATUS " | Option | Status |") message(STATUS " ${separator}") foreach(opt ${options}) if(${${opt}}) set(status "ON") else() set(status "OFF") endif() string(LENGTH "${opt}" opt_length) math(EXPR padding "${COLUMN1_WIDTH} - ${opt_length} - 5") if(${padding} GREATER 0) string(REPEAT " " ${padding} pad_spaces) else() set(pad_spaces "") endif() string(LENGTH "${status}" status_length) math(EXPR status_padding "${COLUMN2_WIDTH} - ${status_length} - 3") if(${status_padding} GREATER 0) string(REPEAT " " ${status_padding} status_pad_spaces) else() set(status_pad_spaces "") endif() message(STATUS " | ${opt}${pad_spaces} | ${status}${status_pad_spaces} |") endforeach() message(STATUS " ${separator}") endfunction() message(STATUS "") message(STATUS "HYPRE Configuration Summary:") # Print BASE_OPTIONS print_option_block("Base Options" "${BASE_OPTIONS}") # Print GPU_OPTIONS if(HYPRE_ENABLE_CUDA OR HYPRE_ENABLE_HIP OR HYPRE_ENABLE_SYCL) print_option_block("GPU Options" "${GPU_OPTIONS}") endif() # Print TPL_OPTIONS print_option_block("Third-Party Library Options" "${TPL_OPTIONS}") message(STATUS "") endfunction() hypre-2.33.0/src/config/cmake/HYPRE_SetupCUDAToolkit.cmake000066400000000000000000000235671477326011500231410ustar00rootroot00000000000000# Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) message(STATUS "Enabling CUDA toolkit") # Check for CUDA_PATH, CUDA_HOME or CUDA_DIR if(DEFINED CUDAToolkit_ROOT) set(CUDA_DIR ${CUDAToolkit_ROOT}) elseif(DEFINED ENV{CUDAToolkit_ROOT}) set(CUDA_DIR $ENV{CUDAToolkit_ROOT}) elseif(DEFINED CUDA_DIR) set(CUDA_DIR ${CUDA_DIR}) elseif(DEFINED ENV{CUDA_DIR}) set(CUDA_DIR $ENV{CUDA_DIR}) elseif(DEFINED CUDA_PATH) set(CUDA_DIR ${CUDA_PATH}) elseif(DEFINED ENV{CUDA_PATH}) set(CUDA_DIR $ENV{CUDA_PATH}) elseif(DEFINED CUDA_HOME) set(CUDA_DIR ${CUDA_HOME}) elseif(DEFINED ENV{CUDA_HOME}) set(CUDA_DIR $ENV{CUDA_HOME}) elseif(EXISTS "/opt/cuda") set(CUDA_DIR "/opt/cuda") elseif(EXISTS "/usr/bin/nvcc") set(CUDA_DIR "/usr") else() message(FATAL_ERROR "CUDA_PATH or CUDA_HOME not set. Please set one of them to point to your CUDA installation.") endif() message(STATUS "Using CUDA installation: ${CUDA_DIR}") # Specify the path to the custom nvcc compiler if(WIN32) set(CMAKE_CUDA_COMPILER "${CUDA_DIR}/bin/nvcc.exe" CACHE FILEPATH "CUDA compiler") else() set(CMAKE_CUDA_COMPILER "${CUDA_DIR}/bin/nvcc" CACHE FILEPATH "CUDA compiler") endif() # Specify the CUDA Toolkit root directory set(CUDAToolkit_ROOT "${CUDA_DIR}" CACHE PATH "Path to the CUDA toolkit") # Optionally, prioritize the custom CUDA path in CMAKE_PREFIX_PATH list(APPEND CMAKE_PREFIX_PATH "${CUDA_DIR}") # Set CUDA standard to match C++ standard if not already set if(NOT DEFINED CMAKE_CUDA_STANDARD) set(CMAKE_CUDA_STANDARD ${CMAKE_CXX_STANDARD}) endif() set(CMAKE_CUDA_STANDARD_REQUIRED ON) set(CMAKE_CUDA_EXTENSIONS OFF) # Visual Studio does not support CMAKE_CUDA_HOST_COMPILER if (NOT MSVC) set(CMAKE_CUDA_HOST_COMPILER ${CMAKE_CXX_COMPILER} CACHE STRING "CXX compiler used by CUDA" FORCE) endif() # Check if CUDA is available and enable it if found include(CheckLanguage) check_language(CUDA) if(DEFINED CMAKE_CUDA_COMPILER) enable_language(CUDA) else() message(FATAL_ERROR "CUDA language not found. Please check your CUDA installation.") endif() # Find the CUDA Toolkit find_package(CUDAToolkit REQUIRED) # Add a dummy cuda target if it doesn't exist (avoid error when building with BLT dependencies) if(NOT TARGET cuda) add_library(cuda INTERFACE) endif() # Detection CUDA architecture if not given by the user if(NOT DEFINED CMAKE_CUDA_ARCHITECTURES OR CMAKE_CUDA_ARCHITECTURES STREQUAL "52") message(STATUS "Detecting CUDA GPU architectures using nvidia-smi...") # Platform-specific NVIDIA smi command if (WIN32) # Try multiple possible locations on Windows find_program(NVIDIA_SMI_CMD NAMES nvidia-smi.exe PATHS "${CUDA_DIR}/bin" "$ENV{ProgramFiles}/NVIDIA Corporation/NVSMI" "$ENV{ProgramFiles}/NVIDIA GPU Computing Toolkit/CUDA/v*/bin" "$ENV{ProgramW6432}/NVIDIA Corporation/NVSMI" NO_DEFAULT_PATH ) if(NOT NVIDIA_SMI_CMD) find_program(NVIDIA_SMI_CMD nvidia-smi.exe) endif() message(STATUS "Found nvidia-smi: ${NVIDIA_SMI_CMD}") else() set(NVIDIA_SMI_CMD "nvidia-smi") endif() if(NOT NVIDIA_SMI_CMD) message(WARNING "nvidia-smi not found. Using default CUDA architecture 70.") set(CMAKE_CUDA_ARCHITECTURES "70" CACHE STRING "Default CUDA architectures" FORCE) else() # Execute nvidia-smi to get GPU compute capabilities execute_process( COMMAND ${NVIDIA_SMI_CMD} --query-gpu=compute_cap --format=csv,noheader OUTPUT_VARIABLE NVIDIA_SMI_OUTPUT RESULT_VARIABLE NVIDIA_SMI_RESULT ERROR_VARIABLE NVIDIA_SMI_ERROR OUTPUT_STRIP_TRAILING_WHITESPACE ) if(NOT NVIDIA_SMI_RESULT EQUAL 0) message(WARNING "${NVIDIA_SMI_CMD} failed to execute: ${NVIDIA_SMI_ERROR}") set(CMAKE_CUDA_ARCHITECTURES "70" CACHE STRING "Default CUDA architectures" FORCE) message(STATUS "Setting CMAKE_CUDA_ARCHITECTURES to default '70'") else() # Clean the output (remove extra newlines and spaces) string(STRIP "${NVIDIA_SMI_OUTPUT}" CUDA_ARCHS) # Remove trailing/leading whitespaces string(REPLACE "." "" CUDA_ARCHS "${CUDA_ARCHS}") # Replace '.' with nothing to format '7.0' as '70' string(REPLACE "\n" ";" CUDA_ARCHS "${CUDA_ARCHS}") # Replace newline with semicolon for list format # Remove any duplicates CUDA archictectures list(REMOVE_DUPLICATES CUDA_ARCHS) if(CUDA_ARCHS) string(REPLACE ";" "," CUDA_ARCHS_STR "${CUDA_ARCHS}") set(CMAKE_CUDA_ARCHITECTURES "${CUDA_ARCHS_STR}" CACHE STRING "Detected CUDA architectures" FORCE) message(STATUS "Detected CUDA GPU architectures: ${CMAKE_CUDA_ARCHITECTURES}") else() message(WARNING "No GPUs detected. Setting CMAKE_CUDA_ARCHITECTURES to default '70'") set(CMAKE_CUDA_ARCHITECTURES "70" CACHE STRING "Default CUDA architectures" FORCE) endif() endif() endif() else() # Remove duplicates from the pre-set CMAKE_CUDA_ARCHITECTURES string(REPLACE "," ";" CUDA_ARCH_LIST "${CMAKE_CUDA_ARCHITECTURES}") list(REMOVE_DUPLICATES CUDA_ARCH_LIST) string(REPLACE ";" "," CUDA_ARCH_STR "${CUDA_ARCH_LIST}") set(CMAKE_CUDA_ARCHITECTURES "${CUDA_ARCH_STR}" CACHE STRING "Detected CUDA architectures" FORCE) message(STATUS "CMAKE_CUDA_ARCHITECTURES is already set to: ${CMAKE_CUDA_ARCHITECTURES}") endif() # Set the CUDA architectures to the HYPRE target set_property(TARGET HYPRE PROPERTY CUDA_ARCHITECTURES "${CMAKE_CUDA_ARCHITECTURES}") # Show CUDA Toolkit location if(CUDAToolkit_FOUND) if (CUDAToolkit_ROOT) message(STATUS "CUDA Toolkit found at: ${CUDAToolkit_ROOT}") endif() message(STATUS "CUDA Toolkit version: ${CUDAToolkit_VERSION}") message(STATUS "CUDA Toolkit include directory: ${CUDAToolkit_INCLUDE_DIRS}") message(STATUS "CUDA Toolkit library directory: ${CUDAToolkit_LIBRARY_DIR}") else() message(FATAL_ERROR "CUDA Toolkit not found") endif() # Check for Thrust headers find_path(THRUST_INCLUDE_DIR thrust/version.h HINTS ${CUDAToolkit_INCLUDE_DIRS} ${CUDAToolkit_INCLUDE_DIRS}/cuda-thrust PATH_SUFFIXES thrust NO_DEFAULT_PATH ) if(THRUST_INCLUDE_DIR) message(STATUS "CUDA Thrust headers found in: ${THRUST_INCLUDE_DIR}") else() message(FATAL_ERROR "CUDA Thrust headers not found! Please specify -DTHRUST_INCLUDE_DIR.") endif() # Collection of CUDA optional libraries set(CUDA_LIBS "") # Function to handle CUDA libraries function(find_and_add_cuda_library LIB_NAME HYPRE_ENABLE_VAR) string(TOUPPER ${LIB_NAME} LIB_NAME_UPPER) if(${HYPRE_ENABLE_VAR}) set(HYPRE_USING_${LIB_NAME_UPPER} ON CACHE INTERNAL "") # Use CUDAToolkit to find the component find_package(CUDAToolkit REQUIRED COMPONENTS ${LIB_NAME}) if(TARGET CUDA::${LIB_NAME}) message(STATUS "Found ${LIB_NAME_UPPER} library") list(APPEND CUDA_LIBS CUDA::${LIB_NAME}) else() message(STATUS "CUDA::${LIB_NAME} target not found. Attempting manual linking.") find_library(${LIB_NAME}_LIBRARY ${LIB_NAME} HINTS ${CUDAToolkit_LIBRARY_DIR}) if(${LIB_NAME}_LIBRARY) message(STATUS "Found ${LIB_NAME_UPPER} library: ${${LIB_NAME}_LIBRARY}") add_library(CUDA::${LIB_NAME} UNKNOWN IMPORTED) set_target_properties(CUDA::${LIB_NAME} PROPERTIES IMPORTED_LOCATION "${${LIB_NAME}_LIBRARY}" INTERFACE_INCLUDE_DIRECTORIES "${CUDAToolkit_INCLUDE_DIRS}") list(APPEND CUDA_LIBS CUDA::${LIB_NAME}) else() message(FATAL_ERROR "Could not find ${LIB_NAME_UPPER} library. Please check your CUDA installation.") endif() endif() set(CUDA_LIBS ${CUDA_LIBS} PARENT_SCOPE) endif() endfunction() # Handle CUDA libraries list(APPEND CUDA_LIBS CUDA::cudart) # Add cudart first since other CUDA libraries may depend on it find_and_add_cuda_library(cusparse HYPRE_ENABLE_CUSPARSE) find_and_add_cuda_library(curand HYPRE_ENABLE_CURAND) find_and_add_cuda_library(cublas HYPRE_ENABLE_CUBLAS) find_and_add_cuda_library(cublasLt HYPRE_ENABLE_CUBLAS) find_and_add_cuda_library(cusolver HYPRE_ENABLE_CUSOLVER) # Handle GPU Profiling with nvToolsExt if(HYPRE_ENABLE_GPU_PROFILING) find_library(NVTX_LIBRARY nvToolsExt HINTS ${CUDA_TOOLKIT_ROOT_DIR} PATH_SUFFIXES lib64 lib) if(NVTX_LIBRARY) message(STATUS "Found NVTX library") set(HYPRE_USING_NVTX ON CACHE BOOL "" FORCE) list(APPEND CUDA_LIBS ${NVTX_LIBRARY}) else() message(FATAL_ERROR "NVTX library not found! Make sure CUDA is installed correctly.") endif() endif() # Add CUDA Toolkit include directories to the target target_include_directories(HYPRE PUBLIC ${CUDAToolkit_INCLUDE_DIRS}) # Add Thrust include directory target_include_directories(HYPRE PUBLIC ${THRUST_INCLUDE_DIR}) # Link CUDA libraries to the target target_link_libraries(HYPRE PUBLIC ${CUDA_LIBS}) message(STATUS "Linking to CUDA libraries: ${CUDA_LIBS}") # Set additional CUDA compiler flags set(CMAKE_CUDA_FLAGS "${CMAKE_CUDA_FLAGS} --extended-lambda") # Ensure LTO-specific flags are included if (HYPRE_ENABLE_LTO AND CUDAToolkit_VERSION VERSION_LESS 11.2) # See https://developer.nvidia.com/blog/improving-gpu-app-performance-with-cuda-11-2-device-lto message(WARNING "Device LTO not available on CUDAToolkit_VERSION (${CUDAToolkit_VERSION}) < 11.2. Turning it off...") elseif (HYPRE_ENABLE_LTO AND CMAKE_VERSION VERSION_LESS 3.25) # See https://gitlab.kitware.com/cmake/cmake/-/commit/96bc59b1ca01be231347404d178445263687dd22 message(WARNING "Device LTO not available with CUDA on CMAKE_VERSION (${CMAKE_VERSION}) < 3.25. Turning it off...") elseif (HYPRE_ENABLE_LTO) message(STATUS "Enabling Device LTO") # Enable LTO for the target set_target_properties(${PROJECT_NAME} PROPERTIES CUDA_SEPARABLE_COMPILATION ON CUDA_RESOLVE_DEVICE_SYMBOLS ON ) endif() # Print CUDA info message(STATUS "CUDA C++ standard: ${CMAKE_CUDA_STANDARD}") message(STATUS "CUDA architectures: ${CMAKE_CUDA_ARCHITECTURES}") message(STATUS "CUDA flags: ${CMAKE_CUDA_FLAGS}") hypre-2.33.0/src/config/cmake/HYPRE_SetupGPUToolkit.cmake000066400000000000000000000065101477326011500230450ustar00rootroot00000000000000# Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) # Enable CXX language enable_language(CXX) set(CMAKE_CXX_STANDARD_REQUIRED ON) if(HYPRE_ENABLE_SYCL) # We enforce the use of Intel's oneAPI DPC++/C++ Compiler if(NOT CMAKE_CXX_COMPILER MATCHES "dpcpp|icpx") message(FATAL_ERROR "SYCL requires DPC++ or Intel C++ compiler") endif() # Enforce C++17 at least for SYCL if(NOT DEFINED CMAKE_CXX_STANDARD OR CMAKE_CXX_STANDARD LESS 17) set(CMAKE_CXX_STANDARD 17) endif() else() # Enforce C++14 at least for CUDA and HIP if(NOT DEFINED CMAKE_CXX_STANDARD OR CMAKE_CXX_STANDARD LESS 14) set(CMAKE_CXX_STANDARD 14) endif() endif() # Set C++ standard for HYPRE set_property(TARGET HYPRE PROPERTY CXX_STANDARD ${CMAKE_CXX_STANDARD}) # Add C++ standard library to interface if(MSVC OR (CMAKE_CXX_COMPILER_ID MATCHES "Intel" AND WIN32)) # MSVC and Intel on Windows link the C++ standard library automatically message(STATUS "${CMAKE_CXX_COMPILER_ID} on Windows: C++ standard library linked automatically") elseif(CMAKE_CXX_COMPILER_ID MATCHES "Clang|AppleClang" AND APPLE) # Apple Clang specifically uses c++ target_link_libraries(HYPRE INTERFACE "-lc++") elseif(CMAKE_CXX_COMPILER_ID MATCHES "XL|XLClang") # IBM XL C++ needs `-libmc++` target_link_libraries(HYPRE INTERFACE "-libmc++ -lstdc++") else() # Most other compilers use stdc++ if(NOT (MSVC OR (CMAKE_CXX_COMPILER_ID MATCHES "Intel" AND WIN32))) target_link_libraries(HYPRE INTERFACE "-lstdc++") if(NOT CMAKE_CXX_COMPILER_ID MATCHES "GNU|Clang|AppleClang|Intel|PGI|NVHPC|XL|XLClang") message(WARNING "Unknown compiler: ${CMAKE_CXX_COMPILER_ID}. Attempting to link -lstdc++") endif() endif() endif() message(STATUS "C++ standard library configuration completed for ${CMAKE_CXX_COMPILER_ID}") # Print C++ info message(STATUS "Enabling support for CXX.") message(STATUS "Using CXX standard: C++${CMAKE_CXX_STANDARD}") # Set GPU-related variables set(HYPRE_USING_GPU ON CACHE INTERNAL "") set(HYPRE_USING_HOST_MEMORY OFF CACHE INTERNAL "") set(HYPRE_ENABLE_HOST_MEMORY OFF CACHE BOOL "Use host memory" FORCE) if(HYPRE_ENABLE_UNIFIED_MEMORY) set(HYPRE_USING_UNIFIED_MEMORY ON CACHE INTERNAL "") else() set(HYPRE_USING_DEVICE_MEMORY ON CACHE INTERNAL "") endif() # Check if examples are enabled, but not unified memory if(HYPRE_BUILD_EXAMPLES AND NOT HYPRE_ENABLE_UNIFIED_MEMORY) message(WARNING "Running the examples on GPUs requires Unified Memory!\nExamples will not be built!\n") set(HYPRE_BUILD_EXAMPLES OFF CACHE BOOL "" FORCE) endif() # Add any extra CXX compiler flags if(NOT HYPRE_WITH_EXTRA_CXXFLAGS STREQUAL "") string(REPLACE " " ";" HYPRE_WITH_EXTRA_CXXFLAGS_LIST ${HYPRE_WITH_EXTRA_CXXFLAGS}) target_compile_options(HYPRE PRIVATE $<$:${HYPRE_WITH_EXTRA_CXXFLAGS_LIST}>) endif() # Include the toolkit setup file for the selected GPU architecture if(HYPRE_ENABLE_CUDA) include(HYPRE_SetupCUDAToolkit) elseif(HYPRE_ENABLE_HIP) include(HYPRE_SetupHIPToolkit) elseif(HYPRE_ENABLE_SYCL) include(HYPRE_SetupSYCLToolkit) set(EXPORT_DEVICE_LIBS ${EXPORT_INTERFACE_SYCL_LIBS}) else() message(FATAL_ERROR "Neither CUDA nor HIP nor SYCL is enabled. Please enable one of them.") endif() hypre-2.33.0/src/config/cmake/HYPRE_SetupHIPToolkit.cmake000066400000000000000000000164641477326011500230430ustar00rootroot00000000000000# Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) # Check for ROCM_PATH or HIP_PATH message(STATUS "Enabling HIP toolkit") if(DEFINED ROCM_PATH) set(HIP_PATH ${ROCM_PATH}) elseif(DEFINED ENV{ROCM_PATH}) set(HIP_PATH $ENV{ROCM_PATH}) elseif(DEFINED ENV{HIP_PATH}) set(HIP_PATH $ENV{HIP_PATH}) elseif(EXISTS "/opt/rocm") set(HIP_PATH "/opt/rocm") else() message(FATAL_ERROR "ROCM_PATH or HIP_PATH not set. Please set one of them to point to your ROCm installation.") endif() message(STATUS "Using ROCm installation: ${HIP_PATH}") # Add HIP_PATH to CMAKE_PREFIX_PATH list(APPEND CMAKE_PREFIX_PATH ${HIP_PATH}) # Set HIP standard to match C++ standard if not already set if(NOT DEFINED CMAKE_HIP_STANDARD) set(CMAKE_HIP_STANDARD ${CMAKE_CXX_STANDARD} CACHE STRING "C++ standard for HIP" FORCE) endif() set(CMAKE_HIP_STANDARD_REQUIRED ON CACHE BOOL "Require C++ standard for HIP" FORCE) # Check if HIP is available and enable it if found include(CheckLanguage) check_language(HIP) if(CMAKE_HIP_COMPILER) enable_language(HIP) else() message(FATAL_ERROR "HIP language not found. Please check your HIP/ROCm installation.") endif() # Find HIP package find_package(hip REQUIRED CONFIG) # Minimum supported HIP version for HYPRE set(REQUIRED_HIP_VERSION "5.2.0") if(NOT DEFINED hip_VERSION) message(WARNING "Cannot detect HIP version from the 'hip' package. Skipping the minimum version check. " "Proceed at your own risk!!!") else() if(hip_VERSION VERSION_LESS REQUIRED_HIP_VERSION) message(FATAL_ERROR "HYPRE requires HIP >= ${REQUIRED_HIP_VERSION}, but found ${hip_VERSION}.") endif() endif() # Function to detect GPU architectures using rocm-smi if(NOT DEFINED CMAKE_HIP_ARCHITECTURES) message(STATUS "Detecting GPU architectures using rocm-smi...") # Execute rocm-smi to get GPU architecture info execute_process( COMMAND rocm-smi --showUniqueId --format=json OUTPUT_VARIABLE ROCM_SMI_OUTPUT RESULT_VARIABLE ROCM_SMI_RESULT ERROR_VARIABLE ROCM_SMI_ERROR OUTPUT_STRIP_TRAILING_WHITESPACE ) if(NOT ROCM_SMI_RESULT EQUAL 0) message(WARNING "rocm-smi failed to execute: ${ROCM_SMI_ERROR}") set(CMAKE_HIP_ARCHITECTURES "gfx90a" CACHE STRING "Default HIP architectures" FORCE) message(STATUS "Setting CMAKE_HIP_ARCHITECTURES to default 'gfx90a'") return() endif() # Parse JSON output to extract GPU architectures include(Jsoncpp) jsoncpp_parse(json_output "${ROCM_SMI_OUTPUT}") # Extract GPU architecture codes set(GPU_ARCHS "") foreach(gpu ${json_output@/gpu/@}) get_property(gpu_arch PROPERTY GPU ARCHITECTURE "${gpu}") if(NOT gpu_arch STREQUAL "") list(APPEND GPU_ARCHS ${gpu_arch}) endif() endforeach() list(REMOVE_DUPLICATES GPU_ARCHS) if(GPU_ARCHS) string(REPLACE ";" "," GPU_ARCHS_STR "${GPU_ARCHS}") set(CMAKE_HIP_ARCHITECTURES "${GPU_ARCHS_STR}" CACHE STRING "Detected HIP architectures" FORCE) message(STATUS "Detected GPU architectures: ${CMAKE_HIP_ARCHITECTURES}") else() message(WARNING "No GPUs detected. Setting CMAKE_HIP_ARCHITECTURES to default 'gfx90a'") set(CMAKE_HIP_ARCHITECTURES "gfx90a" CACHE STRING "Default HIP architectures" FORCE) endif() else() # Remove duplicates from the pre-set CMAKE_HIP_ARCHITECTURES string(REPLACE "," ";" HIP_ARCH_LIST "${CMAKE_HIP_ARCHITECTURES}") list(REMOVE_DUPLICATES HIP_ARCH_LIST) string(REPLACE ";" "," HIP_ARCH_STR "${HIP_ARCH_LIST}") set(CMAKE_HIP_ARCHITECTURES "${HIP_ARCH_STR}" CACHE STRING "Detected HIP architectures" FORCE) message(STATUS "CMAKE_HIP_ARCHITECTURES is already set to: ${CMAKE_HIP_ARCHITECTURES}") endif() set_property(TARGET ${PROJECT_NAME} PROPERTY HIP_ARCHITECTURES "${CMAKE_HIP_ARCHITECTURES}") # Collection of ROCm optional libraries set(ROCM_LIBS "") # Function to find and add libraries function(find_and_add_rocm_library LIB_NAME) string(TOUPPER ${LIB_NAME} LIB_NAME_UPPER) set(HYPRE_ENABLE_VAR "HYPRE_ENABLE_${LIB_NAME_UPPER}") if(${HYPRE_ENABLE_VAR}) set(HYPRE_USING_${LIB_NAME_UPPER} ON CACHE INTERNAL "") find_package(${LIB_NAME} REQUIRED) if(TARGET roc::${LIB_NAME}) message(STATUS "Found target: ${${LIB_NAME}_LIBRARY}") list(APPEND ROCM_LIBS ${${LIB_NAME}_LIBRARY}) else() #message(WARNING "roc::${LIB_NAME} target not found. Attempting manual linking.") find_library(${LIB_NAME}_LIBRARY ${LIB_NAME} HINTS ${HIP_PATH}/lib ${HIP_PATH}/lib64) if(${LIB_NAME}_LIBRARY) message(STATUS "Found ${LIB_NAME} library: ${${LIB_NAME}_LIBRARY}") add_library(roc::${LIB_NAME} UNKNOWN IMPORTED) set_target_properties(roc::${LIB_NAME} PROPERTIES IMPORTED_LOCATION "${${LIB_NAME}_LIBRARY}" INTERFACE_INCLUDE_DIRECTORIES "${HIP_PATH}/include") list(APPEND ROCM_LIBS roc::${LIB_NAME}) else() message(FATAL_ERROR "Could not find ${LIB_NAME} library. Please check your ROCm installation.") endif() endif() set(ROCM_LIBS ${ROCM_LIBS} PARENT_SCOPE) endif() endfunction() # Find and add libraries find_and_add_rocm_library(rocblas) find_and_add_rocm_library(rocsparse) find_and_add_rocm_library(rocrand) find_and_add_rocm_library(rocsolver) if(HYPRE_ENABLE_GPU_PROFILING) set(HYPRE_USING_ROCTRACER ON CACHE BOOL "" FORCE) find_library(ROCTRACER_LIBRARY NAMES libroctracer64.so PATHS ${HIP_PATH}/lib ${HIP_PATH}/lib64 NO_DEFAULT_PATH) if(ROCTRACER_LIBRARY) message(STATUS "ROCm tracer library found in ${ROCTRACER_LIBRARY}") list(APPEND ROCM_LIBS ${ROCTRACER_LIBRARY}) else() message(WARNING "ROCm tracer library not found. GPU profiling may not work correctly.") endif() endif() # Add HIP include directory target_include_directories(${PROJECT_NAME} PUBLIC ${HIP_PATH}/include) # Link HIP libraries to the target target_link_libraries(${PROJECT_NAME} PUBLIC ${ROCM_LIBS}) message(STATUS "Linking to ROCm libraries: ${ROCM_LIBS}") # Turn on Position Independent Code (PIC) by default set_target_properties(${PROJECT_NAME} PROPERTIES POSITION_INDEPENDENT_CODE TRUE) # Signal to downstream targets that they need PIC set_target_properties(${PROJECT_NAME} PROPERTIES INTERFACE_POSITION_INDEPENDENT_CODE TRUE) # Ensure LTO-specific flags are included if (HYPRE_ENABLE_LTO AND NOT MSVC) if (CMAKE_C_COMPILER_ID MATCHES "Clang") message(STATUS "Enabling Device LTO") else () message(FATAL_ERROR "HIP Device LTO available only with Clang") endif () # HIP compilation options target_compile_options(${PROJECT_NAME} PRIVATE $<$:-fgpu-rdc -foffload-lto> $<$:-foffload-lto> INTERFACE $<$:-foffload-lto> $<$:-foffload-lto> ) # Link options need to be more specific target_link_options(${PROJECT_NAME} PRIVATE -fgpu-rdc -foffload-lto --hip-link -Wl,--no-as-needed # Ensure all symbols are kept INTERFACE -foffload-lto ) endif () # Print HIP info if (DEFINED hip_VERSION) message(STATUS "HIP version: ${hip_VERSION}") endif() message(STATUS "HIP C++ standard: ${CMAKE_HIP_STANDARD}") message(STATUS "HIP architectures: ${CMAKE_HIP_ARCHITECTURES}") if (DEFINED CMAKE_HIP_FLAGS) message(STATUS "HIP common flags: ${CMAKE_HIP_FLAGS}") endif() hypre-2.33.0/src/config/cmake/HYPRE_SetupSYCLToolkit.cmake000066400000000000000000000076501477326011500231720ustar00rootroot00000000000000# Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) # This handles the non-compiler aspect of the SYCL toolkit. message(STATUS "Enabling SYCL toolkit") # limit C++ errors to one if(CMAKE_CXX_COMPILER_ID MATCHES "Intel|Clang") target_compile_options(${PROJECT_NAME} PRIVATE $<$:-ferror-limit=1>) endif() # Find Intel SYCL find_package(IntelSYCL REQUIRED) # Set up SYCL flags if(IntelSYCL_FOUND) # Standard SYCL flags target_compile_options(${PROJECT_NAME} PUBLIC $<$:-fsycl>) target_compile_options(${PROJECT_NAME} PUBLIC $<$:-fsycl-unnamed-lambda>) target_link_options(${PROJECT_NAME} PUBLIC -fsycl) target_link_options(${PROJECT_NAME} PUBLIC -fsycl-device-code-split=per_kernel) target_link_options(${PROJECT_NAME} PUBLIC -Wl,--no-relax) # Use either user-specified target or IntelSYCL's default if(HYPRE_SYCL_TARGET) target_compile_options(${PROJECT_NAME} PUBLIC $<$:-fsycl-targets=${HYPRE_SYCL_TARGET}>) target_link_options(${PROJECT_NAME} PUBLIC -fsycl-targets=${HYPRE_SYCL_TARGET}) elseif(INTEL_SYCL_TARGETS) target_compile_options(${PROJECT_NAME} PUBLIC $<$:-fsycl-targets=${INTEL_SYCL_TARGETS}>) target_link_options(${PROJECT_NAME} PUBLIC -fsycl-targets=${INTEL_SYCL_TARGETS}) endif() # Use either user-specified backend or IntelSYCL's default if(HYPRE_SYCL_TARGET_BACKEND) target_compile_options(${PROJECT_NAME} PUBLIC $<$:-Xsycl-target-backend=${HYPRE_SYCL_TARGET_BACKEND}>) target_link_options(${PROJECT_NAME} PUBLIC -Xsycl-target-backend=${HYPRE_SYCL_TARGET_BACKEND}) elseif(INTEL_SYCL_BACKEND) target_compile_options(${PROJECT_NAME} PUBLIC $<$:-Xsycl-target-backend=${INTEL_SYCL_BACKEND}>) target_link_options(${PROJECT_NAME} PUBLIC -Xsycl-target-backend=${INTEL_SYCL_BACKEND}) endif() endif() # Find Intel DPCT if(NOT DEFINED DPCTROOT) if(DEFINED ENV{DPCTROOT}) set(DPCTROOT $ENV{DPCTROOT}) elseif(DEFINED ENV{DPCT_BUNDLE_ROOT}) set(DPCTROOT $ENV{DPCT_BUNDLE_ROOT}) elseif(DEFINED ENV{ONEAPI_ROOT} AND EXISTS "$ENV{ONEAPI_ROOT}/dpcpp-ct/latest") set(DPCTROOT "$ENV{ONEAPI_ROOT}/dpcpp-ct/latest") endif() endif() # Check if DPCT is found if(NOT EXISTS "${DPCTROOT}/include/dpct/dpct.hpp") message(FATAL_ERROR "Could not find DPCT installation. Please set DPCTROOT") endif() # Add DPCT include directory target_include_directories(${PROJECT_NAME} PUBLIC "${DPCTROOT}/include") message(STATUS "DPCT include directory: ${DPCTROOT}/include") if (HYPRE_ENABLE_ONEMKLSPARSE) set(HYPRE_USING_ONEMKLSPARSE ON CACHE BOOL "" FORCE) endif() if (HYPRE_ENABLE_ONEMKLBLAS) set(HYPRE_USING_ONEMKLBLAS ON CACHE BOOL "" FORCE) endif() if (HYPRE_ENABLE_ONEMKLRAND) set(HYPRE_USING_ONEMKLRAND ON CACHE BOOL "" FORCE) endif() # Setup MKL if (HYPRE_USING_ONEMKLSPARSE OR HYPRE_USING_ONEMKLBLAS OR HYPRE_USING_ONEMKLRAND) # Find MKL set(MKL_LINK dynamic) set(MKL_THREADING sequential) #set(ENABLE_TRY_SYCL_COMPILE ON) # This option slows down the build find_package(MKL CONFIG REQUIRED HINTS "$ENV{MKLROOT}/lib/cmake/mkl") # Add all required MKL components explicitly target_link_libraries(${PROJECT_NAME} PUBLIC $ $ $ $ $ $ $ ) # Ensure compile options and include directories are properly propagated target_compile_options(${PROJECT_NAME} PUBLIC $ ) target_include_directories(${PROJECT_NAME} PUBLIC $ ) endif() hypre-2.33.0/src/config/config.guess000077500000000000000000001414221477326011500173140ustar00rootroot00000000000000#! /bin/sh # Attempt to guess a canonical system name. # Copyright 1992-2023 Free Software Foundation, Inc. # shellcheck disable=SC2006,SC2268 # see below for rationale timestamp='2023-01-01' # This file is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, see . # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that # program. This Exception is an additional permission under section 7 # of the GNU General Public License, version 3 ("GPLv3"). # # Originally written by Per Bothner; maintained since 2000 by Ben Elliston. # # You can get the latest version of this script from: # https://git.savannah.gnu.org/cgit/config.git/plain/config.guess # # Please send patches to . # The "shellcheck disable" line above the timestamp inhibits complaints # about features and limitations of the classic Bourne shell that were # superseded or lifted in POSIX. However, this script identifies a wide # variety of pre-POSIX systems that do not have POSIX shells at all, and # even some reasonably current systems (Solaris 10 as case-in-point) still # have a pre-POSIX /bin/sh. me=`echo "$0" | sed -e 's,.*/,,'` usage="\ Usage: $0 [OPTION] Output the configuration name of the system \`$me' is run on. Options: -h, --help print this help, then exit -t, --time-stamp print date of last modification, then exit -v, --version print version number, then exit Report bugs and patches to ." version="\ GNU config.guess ($timestamp) Originally written by Per Bothner. Copyright 1992-2023 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." help=" Try \`$me --help' for more information." # Parse command line while test $# -gt 0 ; do case $1 in --time-stamp | --time* | -t ) echo "$timestamp" ; exit ;; --version | -v ) echo "$version" ; exit ;; --help | --h* | -h ) echo "$usage"; exit ;; -- ) # Stop option processing shift; break ;; - ) # Use stdin as input. break ;; -* ) echo "$me: invalid option $1$help" >&2 exit 1 ;; * ) break ;; esac done if test $# != 0; then echo "$me: too many arguments$help" >&2 exit 1 fi # Just in case it came from the environment. GUESS= # CC_FOR_BUILD -- compiler used by this script. Note that the use of a # compiler to aid in system detection is discouraged as it requires # temporary files to be created and, as you can see below, it is a # headache to deal with in a portable fashion. # Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still # use `HOST_CC' if defined, but it is deprecated. # Portable tmp directory creation inspired by the Autoconf team. tmp= # shellcheck disable=SC2172 trap 'test -z "$tmp" || rm -fr "$tmp"' 0 1 2 13 15 set_cc_for_build() { # prevent multiple calls if $tmp is already set test "$tmp" && return 0 : "${TMPDIR=/tmp}" # shellcheck disable=SC2039,SC3028 { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } || { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir "$tmp" 2>/dev/null) ; } || { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir "$tmp" 2>/dev/null) && echo "Warning: creating insecure temp directory" >&2 ; } || { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } dummy=$tmp/dummy case ${CC_FOR_BUILD-},${HOST_CC-},${CC-} in ,,) echo "int x;" > "$dummy.c" for driver in cc gcc c89 c99 ; do if ($driver -c -o "$dummy.o" "$dummy.c") >/dev/null 2>&1 ; then CC_FOR_BUILD=$driver break fi done if test x"$CC_FOR_BUILD" = x ; then CC_FOR_BUILD=no_compiler_found fi ;; ,,*) CC_FOR_BUILD=$CC ;; ,*,*) CC_FOR_BUILD=$HOST_CC ;; esac } # This is needed to find uname on a Pyramid OSx when run in the BSD universe. # (ghazi@noc.rutgers.edu 1994-08-24) if test -f /.attbin/uname ; then PATH=$PATH:/.attbin ; export PATH fi UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown case $UNAME_SYSTEM in Linux|GNU|GNU/*) LIBC=unknown set_cc_for_build cat <<-EOF > "$dummy.c" #include #if defined(__UCLIBC__) LIBC=uclibc #elif defined(__dietlibc__) LIBC=dietlibc #elif defined(__GLIBC__) LIBC=gnu #else #include /* First heuristic to detect musl libc. */ #ifdef __DEFINED_va_list LIBC=musl #endif #endif EOF cc_set_libc=`$CC_FOR_BUILD -E "$dummy.c" 2>/dev/null | grep '^LIBC' | sed 's, ,,g'` eval "$cc_set_libc" # Second heuristic to detect musl libc. if [ "$LIBC" = unknown ] && command -v ldd >/dev/null && ldd --version 2>&1 | grep -q ^musl; then LIBC=musl fi # If the system lacks a compiler, then just pick glibc. # We could probably try harder. if [ "$LIBC" = unknown ]; then LIBC=gnu fi ;; esac # Note: order is significant - the case branches are not exclusive. case $UNAME_MACHINE:$UNAME_SYSTEM:$UNAME_RELEASE:$UNAME_VERSION in *:NetBSD:*:*) # NetBSD (nbsd) targets should (where applicable) match one or # more of the tuples: *-*-netbsdelf*, *-*-netbsdaout*, # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently # switched to ELF, *-*-netbsd* would select the old # object file format. This provides both forward # compatibility and a consistent mechanism for selecting the # object file format. # # Note: NetBSD doesn't particularly care about the vendor # portion of the name. We always set it to "unknown". UNAME_MACHINE_ARCH=`(uname -p 2>/dev/null || \ /sbin/sysctl -n hw.machine_arch 2>/dev/null || \ /usr/sbin/sysctl -n hw.machine_arch 2>/dev/null || \ echo unknown)` case $UNAME_MACHINE_ARCH in aarch64eb) machine=aarch64_be-unknown ;; armeb) machine=armeb-unknown ;; arm*) machine=arm-unknown ;; sh3el) machine=shl-unknown ;; sh3eb) machine=sh-unknown ;; sh5el) machine=sh5le-unknown ;; earmv*) arch=`echo "$UNAME_MACHINE_ARCH" | sed -e 's,^e\(armv[0-9]\).*$,\1,'` endian=`echo "$UNAME_MACHINE_ARCH" | sed -ne 's,^.*\(eb\)$,\1,p'` machine=${arch}${endian}-unknown ;; *) machine=$UNAME_MACHINE_ARCH-unknown ;; esac # The Operating System including object format, if it has switched # to ELF recently (or will in the future) and ABI. case $UNAME_MACHINE_ARCH in earm*) os=netbsdelf ;; arm*|i386|m68k|ns32k|sh3*|sparc|vax) set_cc_for_build if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ELF__ then # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout). # Return netbsd for either. FIX? os=netbsd else os=netbsdelf fi ;; *) os=netbsd ;; esac # Determine ABI tags. case $UNAME_MACHINE_ARCH in earm*) expr='s/^earmv[0-9]/-eabi/;s/eb$//' abi=`echo "$UNAME_MACHINE_ARCH" | sed -e "$expr"` ;; esac # The OS release # Debian GNU/NetBSD machines have a different userland, and # thus, need a distinct triplet. However, they do not need # kernel version information, so it can be replaced with a # suitable tag, in the style of linux-gnu. case $UNAME_VERSION in Debian*) release='-gnu' ;; *) release=`echo "$UNAME_RELEASE" | sed -e 's/[-_].*//' | cut -d. -f1,2` ;; esac # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM: # contains redundant information, the shorter form: # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used. GUESS=$machine-${os}${release}${abi-} ;; *:Bitrig:*:*) UNAME_MACHINE_ARCH=`arch | sed 's/Bitrig.//'` GUESS=$UNAME_MACHINE_ARCH-unknown-bitrig$UNAME_RELEASE ;; *:OpenBSD:*:*) UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'` GUESS=$UNAME_MACHINE_ARCH-unknown-openbsd$UNAME_RELEASE ;; *:SecBSD:*:*) UNAME_MACHINE_ARCH=`arch | sed 's/SecBSD.//'` GUESS=$UNAME_MACHINE_ARCH-unknown-secbsd$UNAME_RELEASE ;; *:LibertyBSD:*:*) UNAME_MACHINE_ARCH=`arch | sed 's/^.*BSD\.//'` GUESS=$UNAME_MACHINE_ARCH-unknown-libertybsd$UNAME_RELEASE ;; *:MidnightBSD:*:*) GUESS=$UNAME_MACHINE-unknown-midnightbsd$UNAME_RELEASE ;; *:ekkoBSD:*:*) GUESS=$UNAME_MACHINE-unknown-ekkobsd$UNAME_RELEASE ;; *:SolidBSD:*:*) GUESS=$UNAME_MACHINE-unknown-solidbsd$UNAME_RELEASE ;; *:OS108:*:*) GUESS=$UNAME_MACHINE-unknown-os108_$UNAME_RELEASE ;; macppc:MirBSD:*:*) GUESS=powerpc-unknown-mirbsd$UNAME_RELEASE ;; *:MirBSD:*:*) GUESS=$UNAME_MACHINE-unknown-mirbsd$UNAME_RELEASE ;; *:Sortix:*:*) GUESS=$UNAME_MACHINE-unknown-sortix ;; *:Twizzler:*:*) GUESS=$UNAME_MACHINE-unknown-twizzler ;; *:Redox:*:*) GUESS=$UNAME_MACHINE-unknown-redox ;; mips:OSF1:*.*) GUESS=mips-dec-osf1 ;; alpha:OSF1:*:*) # Reset EXIT trap before exiting to avoid spurious non-zero exit code. trap '' 0 case $UNAME_RELEASE in *4.0) UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'` ;; *5.*) UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'` ;; esac # According to Compaq, /usr/sbin/psrinfo has been available on # OSF/1 and Tru64 systems produced since 1995. I hope that # covers most systems running today. This code pipes the CPU # types through head -n 1, so we only detect the type of CPU 0. ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1` case $ALPHA_CPU_TYPE in "EV4 (21064)") UNAME_MACHINE=alpha ;; "EV4.5 (21064)") UNAME_MACHINE=alpha ;; "LCA4 (21066/21068)") UNAME_MACHINE=alpha ;; "EV5 (21164)") UNAME_MACHINE=alphaev5 ;; "EV5.6 (21164A)") UNAME_MACHINE=alphaev56 ;; "EV5.6 (21164PC)") UNAME_MACHINE=alphapca56 ;; "EV5.7 (21164PC)") UNAME_MACHINE=alphapca57 ;; "EV6 (21264)") UNAME_MACHINE=alphaev6 ;; "EV6.7 (21264A)") UNAME_MACHINE=alphaev67 ;; "EV6.8CB (21264C)") UNAME_MACHINE=alphaev68 ;; "EV6.8AL (21264B)") UNAME_MACHINE=alphaev68 ;; "EV6.8CX (21264D)") UNAME_MACHINE=alphaev68 ;; "EV6.9A (21264/EV69A)") UNAME_MACHINE=alphaev69 ;; "EV7 (21364)") UNAME_MACHINE=alphaev7 ;; "EV7.9 (21364A)") UNAME_MACHINE=alphaev79 ;; esac # A Pn.n version is a patched version. # A Vn.n version is a released version. # A Tn.n version is a released field test version. # A Xn.n version is an unreleased experimental baselevel. # 1.2 uses "1.2" for uname -r. OSF_REL=`echo "$UNAME_RELEASE" | sed -e 's/^[PVTX]//' | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz` GUESS=$UNAME_MACHINE-dec-osf$OSF_REL ;; Amiga*:UNIX_System_V:4.0:*) GUESS=m68k-unknown-sysv4 ;; *:[Aa]miga[Oo][Ss]:*:*) GUESS=$UNAME_MACHINE-unknown-amigaos ;; *:[Mm]orph[Oo][Ss]:*:*) GUESS=$UNAME_MACHINE-unknown-morphos ;; *:OS/390:*:*) GUESS=i370-ibm-openedition ;; *:z/VM:*:*) GUESS=s390-ibm-zvmoe ;; *:OS400:*:*) GUESS=powerpc-ibm-os400 ;; arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) GUESS=arm-acorn-riscix$UNAME_RELEASE ;; arm*:riscos:*:*|arm*:RISCOS:*:*) GUESS=arm-unknown-riscos ;; SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) GUESS=hppa1.1-hitachi-hiuxmpp ;; Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*) # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE. case `(/bin/universe) 2>/dev/null` in att) GUESS=pyramid-pyramid-sysv3 ;; *) GUESS=pyramid-pyramid-bsd ;; esac ;; NILE*:*:*:dcosx) GUESS=pyramid-pyramid-svr4 ;; DRS?6000:unix:4.0:6*) GUESS=sparc-icl-nx6 ;; DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*) case `/usr/bin/uname -p` in sparc) GUESS=sparc-icl-nx7 ;; esac ;; s390x:SunOS:*:*) SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'` GUESS=$UNAME_MACHINE-ibm-solaris2$SUN_REL ;; sun4H:SunOS:5.*:*) SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'` GUESS=sparc-hal-solaris2$SUN_REL ;; sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'` GUESS=sparc-sun-solaris2$SUN_REL ;; i86pc:AuroraUX:5.*:* | i86xen:AuroraUX:5.*:*) GUESS=i386-pc-auroraux$UNAME_RELEASE ;; i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*) set_cc_for_build SUN_ARCH=i386 # If there is a compiler, see if it is configured for 64-bit objects. # Note that the Sun cc does not turn __LP64__ into 1 like gcc does. # This test works for both compilers. if test "$CC_FOR_BUILD" != no_compiler_found; then if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \ (CCOPTS="" $CC_FOR_BUILD -m64 -E - 2>/dev/null) | \ grep IS_64BIT_ARCH >/dev/null then SUN_ARCH=x86_64 fi fi SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'` GUESS=$SUN_ARCH-pc-solaris2$SUN_REL ;; sun4*:SunOS:6*:*) # According to config.sub, this is the proper way to canonicalize # SunOS6. Hard to guess exactly what SunOS6 will be like, but # it's likely to be more like Solaris than SunOS4. SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'` GUESS=sparc-sun-solaris3$SUN_REL ;; sun4*:SunOS:*:*) case `/usr/bin/arch -k` in Series*|S4*) UNAME_RELEASE=`uname -v` ;; esac # Japanese Language versions have a version number like `4.1.3-JL'. SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/-/_/'` GUESS=sparc-sun-sunos$SUN_REL ;; sun3*:SunOS:*:*) GUESS=m68k-sun-sunos$UNAME_RELEASE ;; sun*:*:4.2BSD:*) UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null` test "x$UNAME_RELEASE" = x && UNAME_RELEASE=3 case `/bin/arch` in sun3) GUESS=m68k-sun-sunos$UNAME_RELEASE ;; sun4) GUESS=sparc-sun-sunos$UNAME_RELEASE ;; esac ;; aushp:SunOS:*:*) GUESS=sparc-auspex-sunos$UNAME_RELEASE ;; # The situation for MiNT is a little confusing. The machine name # can be virtually everything (everything which is not # "atarist" or "atariste" at least should have a processor # > m68000). The system name ranges from "MiNT" over "FreeMiNT" # to the lowercase version "mint" (or "freemint"). Finally # the system name "TOS" denotes a system which is actually not # MiNT. But MiNT is downward compatible to TOS, so this should # be no problem. atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*) GUESS=m68k-atari-mint$UNAME_RELEASE ;; atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) GUESS=m68k-atari-mint$UNAME_RELEASE ;; *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) GUESS=m68k-atari-mint$UNAME_RELEASE ;; milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) GUESS=m68k-milan-mint$UNAME_RELEASE ;; hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) GUESS=m68k-hades-mint$UNAME_RELEASE ;; *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) GUESS=m68k-unknown-mint$UNAME_RELEASE ;; m68k:machten:*:*) GUESS=m68k-apple-machten$UNAME_RELEASE ;; powerpc:machten:*:*) GUESS=powerpc-apple-machten$UNAME_RELEASE ;; RISC*:Mach:*:*) GUESS=mips-dec-mach_bsd4.3 ;; RISC*:ULTRIX:*:*) GUESS=mips-dec-ultrix$UNAME_RELEASE ;; VAX*:ULTRIX*:*:*) GUESS=vax-dec-ultrix$UNAME_RELEASE ;; 2020:CLIX:*:* | 2430:CLIX:*:*) GUESS=clipper-intergraph-clix$UNAME_RELEASE ;; mips:*:*:UMIPS | mips:*:*:RISCos) set_cc_for_build sed 's/^ //' << EOF > "$dummy.c" #ifdef __cplusplus #include /* for printf() prototype */ int main (int argc, char *argv[]) { #else int main (argc, argv) int argc; char *argv[]; { #endif #if defined (host_mips) && defined (MIPSEB) #if defined (SYSTYPE_SYSV) printf ("mips-mips-riscos%ssysv\\n", argv[1]); exit (0); #endif #if defined (SYSTYPE_SVR4) printf ("mips-mips-riscos%ssvr4\\n", argv[1]); exit (0); #endif #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD) printf ("mips-mips-riscos%sbsd\\n", argv[1]); exit (0); #endif #endif exit (-1); } EOF $CC_FOR_BUILD -o "$dummy" "$dummy.c" && dummyarg=`echo "$UNAME_RELEASE" | sed -n 's/\([0-9]*\).*/\1/p'` && SYSTEM_NAME=`"$dummy" "$dummyarg"` && { echo "$SYSTEM_NAME"; exit; } GUESS=mips-mips-riscos$UNAME_RELEASE ;; Motorola:PowerMAX_OS:*:*) GUESS=powerpc-motorola-powermax ;; Motorola:*:4.3:PL8-*) GUESS=powerpc-harris-powermax ;; Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*) GUESS=powerpc-harris-powermax ;; Night_Hawk:Power_UNIX:*:*) GUESS=powerpc-harris-powerunix ;; m88k:CX/UX:7*:*) GUESS=m88k-harris-cxux7 ;; m88k:*:4*:R4*) GUESS=m88k-motorola-sysv4 ;; m88k:*:3*:R3*) GUESS=m88k-motorola-sysv3 ;; AViiON:dgux:*:*) # DG/UX returns AViiON for all architectures UNAME_PROCESSOR=`/usr/bin/uname -p` if test "$UNAME_PROCESSOR" = mc88100 || test "$UNAME_PROCESSOR" = mc88110 then if test "$TARGET_BINARY_INTERFACE"x = m88kdguxelfx || \ test "$TARGET_BINARY_INTERFACE"x = x then GUESS=m88k-dg-dgux$UNAME_RELEASE else GUESS=m88k-dg-dguxbcs$UNAME_RELEASE fi else GUESS=i586-dg-dgux$UNAME_RELEASE fi ;; M88*:DolphinOS:*:*) # DolphinOS (SVR3) GUESS=m88k-dolphin-sysv3 ;; M88*:*:R3*:*) # Delta 88k system running SVR3 GUESS=m88k-motorola-sysv3 ;; XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3) GUESS=m88k-tektronix-sysv3 ;; Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD) GUESS=m68k-tektronix-bsd ;; *:IRIX*:*:*) IRIX_REL=`echo "$UNAME_RELEASE" | sed -e 's/-/_/g'` GUESS=mips-sgi-irix$IRIX_REL ;; ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX. GUESS=romp-ibm-aix # uname -m gives an 8 hex-code CPU id ;; # Note that: echo "'`uname -s`'" gives 'AIX ' i*86:AIX:*:*) GUESS=i386-ibm-aix ;; ia64:AIX:*:*) if test -x /usr/bin/oslevel ; then IBM_REV=`/usr/bin/oslevel` else IBM_REV=$UNAME_VERSION.$UNAME_RELEASE fi GUESS=$UNAME_MACHINE-ibm-aix$IBM_REV ;; *:AIX:2:3) if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then set_cc_for_build sed 's/^ //' << EOF > "$dummy.c" #include main() { if (!__power_pc()) exit(1); puts("powerpc-ibm-aix3.2.5"); exit(0); } EOF if $CC_FOR_BUILD -o "$dummy" "$dummy.c" && SYSTEM_NAME=`"$dummy"` then GUESS=$SYSTEM_NAME else GUESS=rs6000-ibm-aix3.2.5 fi elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then GUESS=rs6000-ibm-aix3.2.4 else GUESS=rs6000-ibm-aix3.2 fi ;; *:AIX:*:[4567]) IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'` if /usr/sbin/lsattr -El "$IBM_CPU_ID" | grep ' POWER' >/dev/null 2>&1; then IBM_ARCH=rs6000 else IBM_ARCH=powerpc fi if test -x /usr/bin/lslpp ; then IBM_REV=`/usr/bin/lslpp -Lqc bos.rte.libc | \ awk -F: '{ print $3 }' | sed s/[0-9]*$/0/` else IBM_REV=$UNAME_VERSION.$UNAME_RELEASE fi GUESS=$IBM_ARCH-ibm-aix$IBM_REV ;; *:AIX:*:*) GUESS=rs6000-ibm-aix ;; ibmrt:4.4BSD:*|romp-ibm:4.4BSD:*) GUESS=romp-ibm-bsd4.4 ;; ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and GUESS=romp-ibm-bsd$UNAME_RELEASE # 4.3 with uname added to ;; # report: romp-ibm BSD 4.3 *:BOSX:*:*) GUESS=rs6000-bull-bosx ;; DPX/2?00:B.O.S.:*:*) GUESS=m68k-bull-sysv3 ;; 9000/[34]??:4.3bsd:1.*:*) GUESS=m68k-hp-bsd ;; hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*) GUESS=m68k-hp-bsd4.4 ;; 9000/[34678]??:HP-UX:*:*) HPUX_REV=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*.[0B]*//'` case $UNAME_MACHINE in 9000/31?) HP_ARCH=m68000 ;; 9000/[34]??) HP_ARCH=m68k ;; 9000/[678][0-9][0-9]) if test -x /usr/bin/getconf; then sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null` sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null` case $sc_cpu_version in 523) HP_ARCH=hppa1.0 ;; # CPU_PA_RISC1_0 528) HP_ARCH=hppa1.1 ;; # CPU_PA_RISC1_1 532) # CPU_PA_RISC2_0 case $sc_kernel_bits in 32) HP_ARCH=hppa2.0n ;; 64) HP_ARCH=hppa2.0w ;; '') HP_ARCH=hppa2.0 ;; # HP-UX 10.20 esac ;; esac fi if test "$HP_ARCH" = ""; then set_cc_for_build sed 's/^ //' << EOF > "$dummy.c" #define _HPUX_SOURCE #include #include int main () { #if defined(_SC_KERNEL_BITS) long bits = sysconf(_SC_KERNEL_BITS); #endif long cpu = sysconf (_SC_CPU_VERSION); switch (cpu) { case CPU_PA_RISC1_0: puts ("hppa1.0"); break; case CPU_PA_RISC1_1: puts ("hppa1.1"); break; case CPU_PA_RISC2_0: #if defined(_SC_KERNEL_BITS) switch (bits) { case 64: puts ("hppa2.0w"); break; case 32: puts ("hppa2.0n"); break; default: puts ("hppa2.0"); break; } break; #else /* !defined(_SC_KERNEL_BITS) */ puts ("hppa2.0"); break; #endif default: puts ("hppa1.0"); break; } exit (0); } EOF (CCOPTS="" $CC_FOR_BUILD -o "$dummy" "$dummy.c" 2>/dev/null) && HP_ARCH=`"$dummy"` test -z "$HP_ARCH" && HP_ARCH=hppa fi ;; esac if test "$HP_ARCH" = hppa2.0w then set_cc_for_build # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating # 32-bit code. hppa64-hp-hpux* has the same kernel and a compiler # generating 64-bit code. GNU and HP use different nomenclature: # # $ CC_FOR_BUILD=cc ./config.guess # => hppa2.0w-hp-hpux11.23 # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess # => hppa64-hp-hpux11.23 if echo __LP64__ | (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | grep -q __LP64__ then HP_ARCH=hppa2.0w else HP_ARCH=hppa64 fi fi GUESS=$HP_ARCH-hp-hpux$HPUX_REV ;; ia64:HP-UX:*:*) HPUX_REV=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*.[0B]*//'` GUESS=ia64-hp-hpux$HPUX_REV ;; 3050*:HI-UX:*:*) set_cc_for_build sed 's/^ //' << EOF > "$dummy.c" #include int main () { long cpu = sysconf (_SC_CPU_VERSION); /* The order matters, because CPU_IS_HP_MC68K erroneously returns true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct results, however. */ if (CPU_IS_PA_RISC (cpu)) { switch (cpu) { case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break; case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break; case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break; default: puts ("hppa-hitachi-hiuxwe2"); break; } } else if (CPU_IS_HP_MC68K (cpu)) puts ("m68k-hitachi-hiuxwe2"); else puts ("unknown-hitachi-hiuxwe2"); exit (0); } EOF $CC_FOR_BUILD -o "$dummy" "$dummy.c" && SYSTEM_NAME=`"$dummy"` && { echo "$SYSTEM_NAME"; exit; } GUESS=unknown-hitachi-hiuxwe2 ;; 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:*) GUESS=hppa1.1-hp-bsd ;; 9000/8??:4.3bsd:*:*) GUESS=hppa1.0-hp-bsd ;; *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*) GUESS=hppa1.0-hp-mpeix ;; hp7??:OSF1:*:* | hp8?[79]:OSF1:*:*) GUESS=hppa1.1-hp-osf ;; hp8??:OSF1:*:*) GUESS=hppa1.0-hp-osf ;; i*86:OSF1:*:*) if test -x /usr/sbin/sysversion ; then GUESS=$UNAME_MACHINE-unknown-osf1mk else GUESS=$UNAME_MACHINE-unknown-osf1 fi ;; parisc*:Lites*:*:*) GUESS=hppa1.1-hp-lites ;; C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) GUESS=c1-convex-bsd ;; C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*) if getsysinfo -f scalar_acc then echo c32-convex-bsd else echo c2-convex-bsd fi exit ;; C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*) GUESS=c34-convex-bsd ;; C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) GUESS=c38-convex-bsd ;; C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) GUESS=c4-convex-bsd ;; CRAY*Y-MP:*:*:*) CRAY_REL=`echo "$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'` GUESS=ymp-cray-unicos$CRAY_REL ;; CRAY*[A-Z]90:*:*:*) echo "$UNAME_MACHINE"-cray-unicos"$UNAME_RELEASE" \ | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \ -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \ -e 's/\.[^.]*$/.X/' exit ;; CRAY*TS:*:*:*) CRAY_REL=`echo "$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'` GUESS=t90-cray-unicos$CRAY_REL ;; CRAY*T3E:*:*:*) CRAY_REL=`echo "$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'` GUESS=alphaev5-cray-unicosmk$CRAY_REL ;; CRAY*SV1:*:*:*) CRAY_REL=`echo "$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'` GUESS=sv1-cray-unicos$CRAY_REL ;; *:UNICOS/mp:*:*) CRAY_REL=`echo "$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'` GUESS=craynv-cray-unicosmp$CRAY_REL ;; F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*) FUJITSU_PROC=`uname -m | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz` FUJITSU_SYS=`uname -p | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/\///'` FUJITSU_REL=`echo "$UNAME_RELEASE" | sed -e 's/ /_/'` GUESS=${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL} ;; 5000:UNIX_System_V:4.*:*) FUJITSU_SYS=`uname -p | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/\///'` FUJITSU_REL=`echo "$UNAME_RELEASE" | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/ /_/'` GUESS=sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL} ;; i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) GUESS=$UNAME_MACHINE-pc-bsdi$UNAME_RELEASE ;; sparc*:BSD/OS:*:*) GUESS=sparc-unknown-bsdi$UNAME_RELEASE ;; *:BSD/OS:*:*) GUESS=$UNAME_MACHINE-unknown-bsdi$UNAME_RELEASE ;; arm:FreeBSD:*:*) UNAME_PROCESSOR=`uname -p` set_cc_for_build if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ARM_PCS_VFP then FREEBSD_REL=`echo "$UNAME_RELEASE" | sed -e 's/[-(].*//'` GUESS=$UNAME_PROCESSOR-unknown-freebsd$FREEBSD_REL-gnueabi else FREEBSD_REL=`echo "$UNAME_RELEASE" | sed -e 's/[-(].*//'` GUESS=$UNAME_PROCESSOR-unknown-freebsd$FREEBSD_REL-gnueabihf fi ;; *:FreeBSD:*:*) UNAME_PROCESSOR=`/usr/bin/uname -p` case $UNAME_PROCESSOR in amd64) UNAME_PROCESSOR=x86_64 ;; i386) UNAME_PROCESSOR=i586 ;; esac FREEBSD_REL=`echo "$UNAME_RELEASE" | sed -e 's/[-(].*//'` GUESS=$UNAME_PROCESSOR-unknown-freebsd$FREEBSD_REL ;; i*:CYGWIN*:*) GUESS=$UNAME_MACHINE-pc-cygwin ;; *:MINGW64*:*) GUESS=$UNAME_MACHINE-pc-mingw64 ;; *:MINGW*:*) GUESS=$UNAME_MACHINE-pc-mingw32 ;; *:MSYS*:*) GUESS=$UNAME_MACHINE-pc-msys ;; i*:PW*:*) GUESS=$UNAME_MACHINE-pc-pw32 ;; *:SerenityOS:*:*) GUESS=$UNAME_MACHINE-pc-serenity ;; *:Interix*:*) case $UNAME_MACHINE in x86) GUESS=i586-pc-interix$UNAME_RELEASE ;; authenticamd | genuineintel | EM64T) GUESS=x86_64-unknown-interix$UNAME_RELEASE ;; IA64) GUESS=ia64-unknown-interix$UNAME_RELEASE ;; esac ;; i*:UWIN*:*) GUESS=$UNAME_MACHINE-pc-uwin ;; amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*) GUESS=x86_64-pc-cygwin ;; prep*:SunOS:5.*:*) SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'` GUESS=powerpcle-unknown-solaris2$SUN_REL ;; *:GNU:*:*) # the GNU system GNU_ARCH=`echo "$UNAME_MACHINE" | sed -e 's,[-/].*$,,'` GNU_REL=`echo "$UNAME_RELEASE" | sed -e 's,/.*$,,'` GUESS=$GNU_ARCH-unknown-$LIBC$GNU_REL ;; *:GNU/*:*:*) # other systems with GNU libc and userland GNU_SYS=`echo "$UNAME_SYSTEM" | sed 's,^[^/]*/,,' | tr "[:upper:]" "[:lower:]"` GNU_REL=`echo "$UNAME_RELEASE" | sed -e 's/[-(].*//'` GUESS=$UNAME_MACHINE-unknown-$GNU_SYS$GNU_REL-$LIBC ;; x86_64:[Mm]anagarm:*:*|i?86:[Mm]anagarm:*:*) GUESS="$UNAME_MACHINE-pc-managarm-mlibc" ;; *:[Mm]anagarm:*:*) GUESS="$UNAME_MACHINE-unknown-managarm-mlibc" ;; *:Minix:*:*) GUESS=$UNAME_MACHINE-unknown-minix ;; aarch64:Linux:*:*) GUESS=$UNAME_MACHINE-unknown-linux-$LIBC ;; aarch64_be:Linux:*:*) UNAME_MACHINE=aarch64_be GUESS=$UNAME_MACHINE-unknown-linux-$LIBC ;; alpha:Linux:*:*) case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' /proc/cpuinfo 2>/dev/null` in EV5) UNAME_MACHINE=alphaev5 ;; EV56) UNAME_MACHINE=alphaev56 ;; PCA56) UNAME_MACHINE=alphapca56 ;; PCA57) UNAME_MACHINE=alphapca56 ;; EV6) UNAME_MACHINE=alphaev6 ;; EV67) UNAME_MACHINE=alphaev67 ;; EV68*) UNAME_MACHINE=alphaev68 ;; esac objdump --private-headers /bin/sh | grep -q ld.so.1 if test "$?" = 0 ; then LIBC=gnulibc1 ; fi GUESS=$UNAME_MACHINE-unknown-linux-$LIBC ;; arc:Linux:*:* | arceb:Linux:*:* | arc32:Linux:*:* | arc64:Linux:*:*) GUESS=$UNAME_MACHINE-unknown-linux-$LIBC ;; arm*:Linux:*:*) set_cc_for_build if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ARM_EABI__ then GUESS=$UNAME_MACHINE-unknown-linux-$LIBC else if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ARM_PCS_VFP then GUESS=$UNAME_MACHINE-unknown-linux-${LIBC}eabi else GUESS=$UNAME_MACHINE-unknown-linux-${LIBC}eabihf fi fi ;; avr32*:Linux:*:*) GUESS=$UNAME_MACHINE-unknown-linux-$LIBC ;; cris:Linux:*:*) GUESS=$UNAME_MACHINE-axis-linux-$LIBC ;; crisv32:Linux:*:*) GUESS=$UNAME_MACHINE-axis-linux-$LIBC ;; e2k:Linux:*:*) GUESS=$UNAME_MACHINE-unknown-linux-$LIBC ;; frv:Linux:*:*) GUESS=$UNAME_MACHINE-unknown-linux-$LIBC ;; hexagon:Linux:*:*) GUESS=$UNAME_MACHINE-unknown-linux-$LIBC ;; i*86:Linux:*:*) GUESS=$UNAME_MACHINE-pc-linux-$LIBC ;; ia64:Linux:*:*) GUESS=$UNAME_MACHINE-unknown-linux-$LIBC ;; k1om:Linux:*:*) GUESS=$UNAME_MACHINE-unknown-linux-$LIBC ;; loongarch32:Linux:*:* | loongarch64:Linux:*:*) GUESS=$UNAME_MACHINE-unknown-linux-$LIBC ;; m32r*:Linux:*:*) GUESS=$UNAME_MACHINE-unknown-linux-$LIBC ;; m68*:Linux:*:*) GUESS=$UNAME_MACHINE-unknown-linux-$LIBC ;; mips:Linux:*:* | mips64:Linux:*:*) set_cc_for_build IS_GLIBC=0 test x"${LIBC}" = xgnu && IS_GLIBC=1 sed 's/^ //' << EOF > "$dummy.c" #undef CPU #undef mips #undef mipsel #undef mips64 #undef mips64el #if ${IS_GLIBC} && defined(_ABI64) LIBCABI=gnuabi64 #else #if ${IS_GLIBC} && defined(_ABIN32) LIBCABI=gnuabin32 #else LIBCABI=${LIBC} #endif #endif #if ${IS_GLIBC} && defined(__mips64) && defined(__mips_isa_rev) && __mips_isa_rev>=6 CPU=mipsisa64r6 #else #if ${IS_GLIBC} && !defined(__mips64) && defined(__mips_isa_rev) && __mips_isa_rev>=6 CPU=mipsisa32r6 #else #if defined(__mips64) CPU=mips64 #else CPU=mips #endif #endif #endif #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) MIPS_ENDIAN=el #else #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) MIPS_ENDIAN= #else MIPS_ENDIAN= #endif #endif EOF cc_set_vars=`$CC_FOR_BUILD -E "$dummy.c" 2>/dev/null | grep '^CPU\|^MIPS_ENDIAN\|^LIBCABI'` eval "$cc_set_vars" test "x$CPU" != x && { echo "$CPU${MIPS_ENDIAN}-unknown-linux-$LIBCABI"; exit; } ;; mips64el:Linux:*:*) GUESS=$UNAME_MACHINE-unknown-linux-$LIBC ;; openrisc*:Linux:*:*) GUESS=or1k-unknown-linux-$LIBC ;; or32:Linux:*:* | or1k*:Linux:*:*) GUESS=$UNAME_MACHINE-unknown-linux-$LIBC ;; padre:Linux:*:*) GUESS=sparc-unknown-linux-$LIBC ;; parisc64:Linux:*:* | hppa64:Linux:*:*) GUESS=hppa64-unknown-linux-$LIBC ;; parisc:Linux:*:* | hppa:Linux:*:*) # Look for CPU level case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in PA7*) GUESS=hppa1.1-unknown-linux-$LIBC ;; PA8*) GUESS=hppa2.0-unknown-linux-$LIBC ;; *) GUESS=hppa-unknown-linux-$LIBC ;; esac ;; ppc64:Linux:*:*) GUESS=powerpc64-unknown-linux-$LIBC ;; ppc:Linux:*:*) GUESS=powerpc-unknown-linux-$LIBC ;; ppc64le:Linux:*:*) GUESS=powerpc64le-unknown-linux-$LIBC ;; ppcle:Linux:*:*) GUESS=powerpcle-unknown-linux-$LIBC ;; riscv32:Linux:*:* | riscv32be:Linux:*:* | riscv64:Linux:*:* | riscv64be:Linux:*:*) GUESS=$UNAME_MACHINE-unknown-linux-$LIBC ;; s390:Linux:*:* | s390x:Linux:*:*) GUESS=$UNAME_MACHINE-ibm-linux-$LIBC ;; sh64*:Linux:*:*) GUESS=$UNAME_MACHINE-unknown-linux-$LIBC ;; sh*:Linux:*:*) GUESS=$UNAME_MACHINE-unknown-linux-$LIBC ;; sparc:Linux:*:* | sparc64:Linux:*:*) GUESS=$UNAME_MACHINE-unknown-linux-$LIBC ;; tile*:Linux:*:*) GUESS=$UNAME_MACHINE-unknown-linux-$LIBC ;; vax:Linux:*:*) GUESS=$UNAME_MACHINE-dec-linux-$LIBC ;; x86_64:Linux:*:*) set_cc_for_build CPU=$UNAME_MACHINE LIBCABI=$LIBC if test "$CC_FOR_BUILD" != no_compiler_found; then ABI=64 sed 's/^ //' << EOF > "$dummy.c" #ifdef __i386__ ABI=x86 #else #ifdef __ILP32__ ABI=x32 #endif #endif EOF cc_set_abi=`$CC_FOR_BUILD -E "$dummy.c" 2>/dev/null | grep '^ABI' | sed 's, ,,g'` eval "$cc_set_abi" case $ABI in x86) CPU=i686 ;; x32) LIBCABI=${LIBC}x32 ;; esac fi GUESS=$CPU-pc-linux-$LIBCABI ;; xtensa*:Linux:*:*) GUESS=$UNAME_MACHINE-unknown-linux-$LIBC ;; i*86:DYNIX/ptx:4*:*) # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. # earlier versions are messed up and put the nodename in both # sysname and nodename. GUESS=i386-sequent-sysv4 ;; i*86:UNIX_SV:4.2MP:2.*) # Unixware is an offshoot of SVR4, but it has its own version # number series starting with 2... # I am not positive that other SVR4 systems won't match this, # I just have to hope. -- rms. # Use sysv4.2uw... so that sysv4* matches it. GUESS=$UNAME_MACHINE-pc-sysv4.2uw$UNAME_VERSION ;; i*86:OS/2:*:*) # If we were able to find `uname', then EMX Unix compatibility # is probably installed. GUESS=$UNAME_MACHINE-pc-os2-emx ;; i*86:XTS-300:*:STOP) GUESS=$UNAME_MACHINE-unknown-stop ;; i*86:atheos:*:*) GUESS=$UNAME_MACHINE-unknown-atheos ;; i*86:syllable:*:*) GUESS=$UNAME_MACHINE-pc-syllable ;; i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.[02]*:*) GUESS=i386-unknown-lynxos$UNAME_RELEASE ;; i*86:*DOS:*:*) GUESS=$UNAME_MACHINE-pc-msdosdjgpp ;; i*86:*:4.*:*) UNAME_REL=`echo "$UNAME_RELEASE" | sed 's/\/MP$//'` if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then GUESS=$UNAME_MACHINE-univel-sysv$UNAME_REL else GUESS=$UNAME_MACHINE-pc-sysv$UNAME_REL fi ;; i*86:*:5:[678]*) # UnixWare 7.x, OpenUNIX and OpenServer 6. case `/bin/uname -X | grep "^Machine"` in *486*) UNAME_MACHINE=i486 ;; *Pentium) UNAME_MACHINE=i586 ;; *Pent*|*Celeron) UNAME_MACHINE=i686 ;; esac GUESS=$UNAME_MACHINE-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION} ;; i*86:*:3.2:*) if test -f /usr/options/cb.name; then UNAME_REL=`sed -n 's/.*Version //p' /dev/null >/dev/null ; then UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')` (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486 (/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \ && UNAME_MACHINE=i586 (/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \ && UNAME_MACHINE=i686 (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \ && UNAME_MACHINE=i686 GUESS=$UNAME_MACHINE-pc-sco$UNAME_REL else GUESS=$UNAME_MACHINE-pc-sysv32 fi ;; pc:*:*:*) # Left here for compatibility: # uname -m prints for DJGPP always 'pc', but it prints nothing about # the processor, so we play safe by assuming i586. # Note: whatever this is, it MUST be the same as what config.sub # prints for the "djgpp" host, or else GDB configure will decide that # this is a cross-build. GUESS=i586-pc-msdosdjgpp ;; Intel:Mach:3*:*) GUESS=i386-pc-mach3 ;; paragon:*:*:*) GUESS=i860-intel-osf1 ;; i860:*:4.*:*) # i860-SVR4 if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then GUESS=i860-stardent-sysv$UNAME_RELEASE # Stardent Vistra i860-SVR4 else # Add other i860-SVR4 vendors below as they are discovered. GUESS=i860-unknown-sysv$UNAME_RELEASE # Unknown i860-SVR4 fi ;; mini*:CTIX:SYS*5:*) # "miniframe" GUESS=m68010-convergent-sysv ;; mc68k:UNIX:SYSTEM5:3.51m) GUESS=m68k-convergent-sysv ;; M680?0:D-NIX:5.3:*) GUESS=m68k-diab-dnix ;; M68*:*:R3V[5678]*:*) test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;; 3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0) OS_REL='' test -r /etc/.relid \ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4.3"$OS_REL"; exit; } /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ && { echo i586-ncr-sysv4.3"$OS_REL"; exit; } ;; 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*) /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4; exit; } ;; NCR*:*:4.2:* | MPRAS*:*:4.2:*) OS_REL='.3' test -r /etc/.relid \ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4.3"$OS_REL"; exit; } /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ && { echo i586-ncr-sysv4.3"$OS_REL"; exit; } /bin/uname -p 2>/dev/null | /bin/grep pteron >/dev/null \ && { echo i586-ncr-sysv4.3"$OS_REL"; exit; } ;; m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*) GUESS=m68k-unknown-lynxos$UNAME_RELEASE ;; mc68030:UNIX_System_V:4.*:*) GUESS=m68k-atari-sysv4 ;; TSUNAMI:LynxOS:2.*:*) GUESS=sparc-unknown-lynxos$UNAME_RELEASE ;; rs6000:LynxOS:2.*:*) GUESS=rs6000-unknown-lynxos$UNAME_RELEASE ;; PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.[02]*:*) GUESS=powerpc-unknown-lynxos$UNAME_RELEASE ;; SM[BE]S:UNIX_SV:*:*) GUESS=mips-dde-sysv$UNAME_RELEASE ;; RM*:ReliantUNIX-*:*:*) GUESS=mips-sni-sysv4 ;; RM*:SINIX-*:*:*) GUESS=mips-sni-sysv4 ;; *:SINIX-*:*:*) if uname -p 2>/dev/null >/dev/null ; then UNAME_MACHINE=`(uname -p) 2>/dev/null` GUESS=$UNAME_MACHINE-sni-sysv4 else GUESS=ns32k-sni-sysv fi ;; PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort # says GUESS=i586-unisys-sysv4 ;; *:UNIX_System_V:4*:FTX*) # From Gerald Hewes . # How about differentiating between stratus architectures? -djm GUESS=hppa1.1-stratus-sysv4 ;; *:*:*:FTX*) # From seanf@swdc.stratus.com. GUESS=i860-stratus-sysv4 ;; i*86:VOS:*:*) # From Paul.Green@stratus.com. GUESS=$UNAME_MACHINE-stratus-vos ;; *:VOS:*:*) # From Paul.Green@stratus.com. GUESS=hppa1.1-stratus-vos ;; mc68*:A/UX:*:*) GUESS=m68k-apple-aux$UNAME_RELEASE ;; news*:NEWS-OS:6*:*) GUESS=mips-sony-newsos6 ;; R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*) if test -d /usr/nec; then GUESS=mips-nec-sysv$UNAME_RELEASE else GUESS=mips-unknown-sysv$UNAME_RELEASE fi ;; BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. GUESS=powerpc-be-beos ;; BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only. GUESS=powerpc-apple-beos ;; BePC:BeOS:*:*) # BeOS running on Intel PC compatible. GUESS=i586-pc-beos ;; BePC:Haiku:*:*) # Haiku running on Intel PC compatible. GUESS=i586-pc-haiku ;; ppc:Haiku:*:*) # Haiku running on Apple PowerPC GUESS=powerpc-apple-haiku ;; *:Haiku:*:*) # Haiku modern gcc (not bound by BeOS compat) GUESS=$UNAME_MACHINE-unknown-haiku ;; SX-4:SUPER-UX:*:*) GUESS=sx4-nec-superux$UNAME_RELEASE ;; SX-5:SUPER-UX:*:*) GUESS=sx5-nec-superux$UNAME_RELEASE ;; SX-6:SUPER-UX:*:*) GUESS=sx6-nec-superux$UNAME_RELEASE ;; SX-7:SUPER-UX:*:*) GUESS=sx7-nec-superux$UNAME_RELEASE ;; SX-8:SUPER-UX:*:*) GUESS=sx8-nec-superux$UNAME_RELEASE ;; SX-8R:SUPER-UX:*:*) GUESS=sx8r-nec-superux$UNAME_RELEASE ;; SX-ACE:SUPER-UX:*:*) GUESS=sxace-nec-superux$UNAME_RELEASE ;; Power*:Rhapsody:*:*) GUESS=powerpc-apple-rhapsody$UNAME_RELEASE ;; *:Rhapsody:*:*) GUESS=$UNAME_MACHINE-apple-rhapsody$UNAME_RELEASE ;; arm64:Darwin:*:*) GUESS=aarch64-apple-darwin$UNAME_RELEASE ;; *:Darwin:*:*) UNAME_PROCESSOR=`uname -p` case $UNAME_PROCESSOR in unknown) UNAME_PROCESSOR=powerpc ;; esac if command -v xcode-select > /dev/null 2> /dev/null && \ ! xcode-select --print-path > /dev/null 2> /dev/null ; then # Avoid executing cc if there is no toolchain installed as # cc will be a stub that puts up a graphical alert # prompting the user to install developer tools. CC_FOR_BUILD=no_compiler_found else set_cc_for_build fi if test "$CC_FOR_BUILD" != no_compiler_found; then if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \ (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \ grep IS_64BIT_ARCH >/dev/null then case $UNAME_PROCESSOR in i386) UNAME_PROCESSOR=x86_64 ;; powerpc) UNAME_PROCESSOR=powerpc64 ;; esac fi # On 10.4-10.6 one might compile for PowerPC via gcc -arch ppc if (echo '#ifdef __POWERPC__'; echo IS_PPC; echo '#endif') | \ (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \ grep IS_PPC >/dev/null then UNAME_PROCESSOR=powerpc fi elif test "$UNAME_PROCESSOR" = i386 ; then # uname -m returns i386 or x86_64 UNAME_PROCESSOR=$UNAME_MACHINE fi GUESS=$UNAME_PROCESSOR-apple-darwin$UNAME_RELEASE ;; *:procnto*:*:* | *:QNX:[0123456789]*:*) UNAME_PROCESSOR=`uname -p` if test "$UNAME_PROCESSOR" = x86; then UNAME_PROCESSOR=i386 UNAME_MACHINE=pc fi GUESS=$UNAME_PROCESSOR-$UNAME_MACHINE-nto-qnx$UNAME_RELEASE ;; *:QNX:*:4*) GUESS=i386-pc-qnx ;; NEO-*:NONSTOP_KERNEL:*:*) GUESS=neo-tandem-nsk$UNAME_RELEASE ;; NSE-*:NONSTOP_KERNEL:*:*) GUESS=nse-tandem-nsk$UNAME_RELEASE ;; NSR-*:NONSTOP_KERNEL:*:*) GUESS=nsr-tandem-nsk$UNAME_RELEASE ;; NSV-*:NONSTOP_KERNEL:*:*) GUESS=nsv-tandem-nsk$UNAME_RELEASE ;; NSX-*:NONSTOP_KERNEL:*:*) GUESS=nsx-tandem-nsk$UNAME_RELEASE ;; *:NonStop-UX:*:*) GUESS=mips-compaq-nonstopux ;; BS2000:POSIX*:*:*) GUESS=bs2000-siemens-sysv ;; DS/*:UNIX_System_V:*:*) GUESS=$UNAME_MACHINE-$UNAME_SYSTEM-$UNAME_RELEASE ;; *:Plan9:*:*) # "uname -m" is not consistent, so use $cputype instead. 386 # is converted to i386 for consistency with other x86 # operating systems. if test "${cputype-}" = 386; then UNAME_MACHINE=i386 elif test "x${cputype-}" != x; then UNAME_MACHINE=$cputype fi GUESS=$UNAME_MACHINE-unknown-plan9 ;; *:TOPS-10:*:*) GUESS=pdp10-unknown-tops10 ;; *:TENEX:*:*) GUESS=pdp10-unknown-tenex ;; KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*) GUESS=pdp10-dec-tops20 ;; XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*) GUESS=pdp10-xkl-tops20 ;; *:TOPS-20:*:*) GUESS=pdp10-unknown-tops20 ;; *:ITS:*:*) GUESS=pdp10-unknown-its ;; SEI:*:*:SEIUX) GUESS=mips-sei-seiux$UNAME_RELEASE ;; *:DragonFly:*:*) DRAGONFLY_REL=`echo "$UNAME_RELEASE" | sed -e 's/[-(].*//'` GUESS=$UNAME_MACHINE-unknown-dragonfly$DRAGONFLY_REL ;; *:*VMS:*:*) UNAME_MACHINE=`(uname -p) 2>/dev/null` case $UNAME_MACHINE in A*) GUESS=alpha-dec-vms ;; I*) GUESS=ia64-dec-vms ;; V*) GUESS=vax-dec-vms ;; esac ;; *:XENIX:*:SysV) GUESS=i386-pc-xenix ;; i*86:skyos:*:*) SKYOS_REL=`echo "$UNAME_RELEASE" | sed -e 's/ .*$//'` GUESS=$UNAME_MACHINE-pc-skyos$SKYOS_REL ;; i*86:rdos:*:*) GUESS=$UNAME_MACHINE-pc-rdos ;; i*86:Fiwix:*:*) GUESS=$UNAME_MACHINE-pc-fiwix ;; *:AROS:*:*) GUESS=$UNAME_MACHINE-unknown-aros ;; x86_64:VMkernel:*:*) GUESS=$UNAME_MACHINE-unknown-esx ;; amd64:Isilon\ OneFS:*:*) GUESS=x86_64-unknown-onefs ;; *:Unleashed:*:*) GUESS=$UNAME_MACHINE-unknown-unleashed$UNAME_RELEASE ;; esac # Do we have a guess based on uname results? if test "x$GUESS" != x; then echo "$GUESS" exit fi # No uname command or uname output not recognized. set_cc_for_build cat > "$dummy.c" < #include #endif #if defined(ultrix) || defined(_ultrix) || defined(__ultrix) || defined(__ultrix__) #if defined (vax) || defined (__vax) || defined (__vax__) || defined(mips) || defined(__mips) || defined(__mips__) || defined(MIPS) || defined(__MIPS__) #include #if defined(_SIZE_T_) || defined(SIGLOST) #include #endif #endif #endif main () { #if defined (sony) #if defined (MIPSEB) /* BFD wants "bsd" instead of "newsos". Perhaps BFD should be changed, I don't know.... */ printf ("mips-sony-bsd\n"); exit (0); #else #include printf ("m68k-sony-newsos%s\n", #ifdef NEWSOS4 "4" #else "" #endif ); exit (0); #endif #endif #if defined (NeXT) #if !defined (__ARCHITECTURE__) #define __ARCHITECTURE__ "m68k" #endif int version; version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`; if (version < 4) printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version); else printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version); exit (0); #endif #if defined (MULTIMAX) || defined (n16) #if defined (UMAXV) printf ("ns32k-encore-sysv\n"); exit (0); #else #if defined (CMU) printf ("ns32k-encore-mach\n"); exit (0); #else printf ("ns32k-encore-bsd\n"); exit (0); #endif #endif #endif #if defined (__386BSD__) printf ("i386-pc-bsd\n"); exit (0); #endif #if defined (sequent) #if defined (i386) printf ("i386-sequent-dynix\n"); exit (0); #endif #if defined (ns32000) printf ("ns32k-sequent-dynix\n"); exit (0); #endif #endif #if defined (_SEQUENT_) struct utsname un; uname(&un); if (strncmp(un.version, "V2", 2) == 0) { printf ("i386-sequent-ptx2\n"); exit (0); } if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */ printf ("i386-sequent-ptx1\n"); exit (0); } printf ("i386-sequent-ptx\n"); exit (0); #endif #if defined (vax) #if !defined (ultrix) #include #if defined (BSD) #if BSD == 43 printf ("vax-dec-bsd4.3\n"); exit (0); #else #if BSD == 199006 printf ("vax-dec-bsd4.3reno\n"); exit (0); #else printf ("vax-dec-bsd\n"); exit (0); #endif #endif #else printf ("vax-dec-bsd\n"); exit (0); #endif #else #if defined(_SIZE_T_) || defined(SIGLOST) struct utsname un; uname (&un); printf ("vax-dec-ultrix%s\n", un.release); exit (0); #else printf ("vax-dec-ultrix\n"); exit (0); #endif #endif #endif #if defined(ultrix) || defined(_ultrix) || defined(__ultrix) || defined(__ultrix__) #if defined(mips) || defined(__mips) || defined(__mips__) || defined(MIPS) || defined(__MIPS__) #if defined(_SIZE_T_) || defined(SIGLOST) struct utsname *un; uname (&un); printf ("mips-dec-ultrix%s\n", un.release); exit (0); #else printf ("mips-dec-ultrix\n"); exit (0); #endif #endif #endif #if defined (alliant) && defined (i860) printf ("i860-alliant-bsd\n"); exit (0); #endif exit (1); } EOF $CC_FOR_BUILD -o "$dummy" "$dummy.c" 2>/dev/null && SYSTEM_NAME=`"$dummy"` && { echo "$SYSTEM_NAME"; exit; } # Apollos put the system type in the environment. test -d /usr/apollo && { echo "$ISP-apollo-$SYSTYPE"; exit; } echo "$0: unable to guess system type" >&2 case $UNAME_MACHINE:$UNAME_SYSTEM in mips:Linux | mips64:Linux) # If we got here on MIPS GNU/Linux, output extra information. cat >&2 <&2 <&2 </dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null` /bin/uname -X = `(/bin/uname -X) 2>/dev/null` hostinfo = `(hostinfo) 2>/dev/null` /bin/universe = `(/bin/universe) 2>/dev/null` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null` /bin/arch = `(/bin/arch) 2>/dev/null` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null` UNAME_MACHINE = "$UNAME_MACHINE" UNAME_RELEASE = "$UNAME_RELEASE" UNAME_SYSTEM = "$UNAME_SYSTEM" UNAME_VERSION = "$UNAME_VERSION" EOF fi exit 1 # Local variables: # eval: (add-hook 'before-save-hook 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" # End: hypre-2.33.0/src/config/config.sub000077500000000000000000001057521477326011500167650ustar00rootroot00000000000000#! /bin/sh # Configuration validation subroutine script. # Copyright 1992-2023 Free Software Foundation, Inc. # shellcheck disable=SC2006,SC2268 # see below for rationale timestamp='2023-01-21' # This file is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, see . # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that # program. This Exception is an additional permission under section 7 # of the GNU General Public License, version 3 ("GPLv3"). # Please send patches to . # # Configuration subroutine to validate and canonicalize a configuration type. # Supply the specified configuration type as an argument. # If it is invalid, we print an error message on stderr and exit with code 1. # Otherwise, we print the canonical config type on stdout and succeed. # You can get the latest version of this script from: # https://git.savannah.gnu.org/cgit/config.git/plain/config.sub # This file is supposed to be the same for all GNU packages # and recognize all the CPU types, system types and aliases # that are meaningful with *any* GNU software. # Each package is responsible for reporting which valid configurations # it does not support. The user should be able to distinguish # a failure to support a valid configuration from a meaningless # configuration. # The goal of this file is to map all the various variations of a given # machine specification into a single specification in the form: # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM # or in some cases, the newer four-part form: # CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM # It is wrong to echo any other type of specification. # The "shellcheck disable" line above the timestamp inhibits complaints # about features and limitations of the classic Bourne shell that were # superseded or lifted in POSIX. However, this script identifies a wide # variety of pre-POSIX systems that do not have POSIX shells at all, and # even some reasonably current systems (Solaris 10 as case-in-point) still # have a pre-POSIX /bin/sh. me=`echo "$0" | sed -e 's,.*/,,'` usage="\ Usage: $0 [OPTION] CPU-MFR-OPSYS or ALIAS Canonicalize a configuration name. Options: -h, --help print this help, then exit -t, --time-stamp print date of last modification, then exit -v, --version print version number, then exit Report bugs and patches to ." version="\ GNU config.sub ($timestamp) Copyright 1992-2023 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." help=" Try \`$me --help' for more information." # Parse command line while test $# -gt 0 ; do case $1 in --time-stamp | --time* | -t ) echo "$timestamp" ; exit ;; --version | -v ) echo "$version" ; exit ;; --help | --h* | -h ) echo "$usage"; exit ;; -- ) # Stop option processing shift; break ;; - ) # Use stdin as input. break ;; -* ) echo "$me: invalid option $1$help" >&2 exit 1 ;; *local*) # First pass through any local machine types. echo "$1" exit ;; * ) break ;; esac done case $# in 0) echo "$me: missing argument$help" >&2 exit 1;; 1) ;; *) echo "$me: too many arguments$help" >&2 exit 1;; esac # Split fields of configuration type # shellcheck disable=SC2162 saved_IFS=$IFS IFS="-" read field1 field2 field3 field4 <&2 exit 1 ;; *-*-*-*) basic_machine=$field1-$field2 basic_os=$field3-$field4 ;; *-*-*) # Ambiguous whether COMPANY is present, or skipped and KERNEL-OS is two # parts maybe_os=$field2-$field3 case $maybe_os in nto-qnx* | linux-* | uclinux-uclibc* \ | uclinux-gnu* | kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* \ | netbsd*-eabi* | kopensolaris*-gnu* | cloudabi*-eabi* \ | storm-chaos* | os2-emx* | rtmk-nova* | managarm-*) basic_machine=$field1 basic_os=$maybe_os ;; android-linux) basic_machine=$field1-unknown basic_os=linux-android ;; *) basic_machine=$field1-$field2 basic_os=$field3 ;; esac ;; *-*) # A lone config we happen to match not fitting any pattern case $field1-$field2 in decstation-3100) basic_machine=mips-dec basic_os= ;; *-*) # Second component is usually, but not always the OS case $field2 in # Prevent following clause from handling this valid os sun*os*) basic_machine=$field1 basic_os=$field2 ;; zephyr*) basic_machine=$field1-unknown basic_os=$field2 ;; # Manufacturers dec* | mips* | sequent* | encore* | pc533* | sgi* | sony* \ | att* | 7300* | 3300* | delta* | motorola* | sun[234]* \ | unicom* | ibm* | next | hp | isi* | apollo | altos* \ | convergent* | ncr* | news | 32* | 3600* | 3100* \ | hitachi* | c[123]* | convex* | sun | crds | omron* | dg \ | ultra | tti* | harris | dolphin | highlevel | gould \ | cbm | ns | masscomp | apple | axis | knuth | cray \ | microblaze* | sim | cisco \ | oki | wec | wrs | winbond) basic_machine=$field1-$field2 basic_os= ;; *) basic_machine=$field1 basic_os=$field2 ;; esac ;; esac ;; *) # Convert single-component short-hands not valid as part of # multi-component configurations. case $field1 in 386bsd) basic_machine=i386-pc basic_os=bsd ;; a29khif) basic_machine=a29k-amd basic_os=udi ;; adobe68k) basic_machine=m68010-adobe basic_os=scout ;; alliant) basic_machine=fx80-alliant basic_os= ;; altos | altos3068) basic_machine=m68k-altos basic_os= ;; am29k) basic_machine=a29k-none basic_os=bsd ;; amdahl) basic_machine=580-amdahl basic_os=sysv ;; amiga) basic_machine=m68k-unknown basic_os= ;; amigaos | amigados) basic_machine=m68k-unknown basic_os=amigaos ;; amigaunix | amix) basic_machine=m68k-unknown basic_os=sysv4 ;; apollo68) basic_machine=m68k-apollo basic_os=sysv ;; apollo68bsd) basic_machine=m68k-apollo basic_os=bsd ;; aros) basic_machine=i386-pc basic_os=aros ;; aux) basic_machine=m68k-apple basic_os=aux ;; balance) basic_machine=ns32k-sequent basic_os=dynix ;; blackfin) basic_machine=bfin-unknown basic_os=linux ;; cegcc) basic_machine=arm-unknown basic_os=cegcc ;; convex-c1) basic_machine=c1-convex basic_os=bsd ;; convex-c2) basic_machine=c2-convex basic_os=bsd ;; convex-c32) basic_machine=c32-convex basic_os=bsd ;; convex-c34) basic_machine=c34-convex basic_os=bsd ;; convex-c38) basic_machine=c38-convex basic_os=bsd ;; cray) basic_machine=j90-cray basic_os=unicos ;; crds | unos) basic_machine=m68k-crds basic_os= ;; da30) basic_machine=m68k-da30 basic_os= ;; decstation | pmax | pmin | dec3100 | decstatn) basic_machine=mips-dec basic_os= ;; delta88) basic_machine=m88k-motorola basic_os=sysv3 ;; dicos) basic_machine=i686-pc basic_os=dicos ;; djgpp) basic_machine=i586-pc basic_os=msdosdjgpp ;; ebmon29k) basic_machine=a29k-amd basic_os=ebmon ;; es1800 | OSE68k | ose68k | ose | OSE) basic_machine=m68k-ericsson basic_os=ose ;; gmicro) basic_machine=tron-gmicro basic_os=sysv ;; go32) basic_machine=i386-pc basic_os=go32 ;; h8300hms) basic_machine=h8300-hitachi basic_os=hms ;; h8300xray) basic_machine=h8300-hitachi basic_os=xray ;; h8500hms) basic_machine=h8500-hitachi basic_os=hms ;; harris) basic_machine=m88k-harris basic_os=sysv3 ;; hp300 | hp300hpux) basic_machine=m68k-hp basic_os=hpux ;; hp300bsd) basic_machine=m68k-hp basic_os=bsd ;; hppaosf) basic_machine=hppa1.1-hp basic_os=osf ;; hppro) basic_machine=hppa1.1-hp basic_os=proelf ;; i386mach) basic_machine=i386-mach basic_os=mach ;; isi68 | isi) basic_machine=m68k-isi basic_os=sysv ;; m68knommu) basic_machine=m68k-unknown basic_os=linux ;; magnum | m3230) basic_machine=mips-mips basic_os=sysv ;; merlin) basic_machine=ns32k-utek basic_os=sysv ;; mingw64) basic_machine=x86_64-pc basic_os=mingw64 ;; mingw32) basic_machine=i686-pc basic_os=mingw32 ;; mingw32ce) basic_machine=arm-unknown basic_os=mingw32ce ;; monitor) basic_machine=m68k-rom68k basic_os=coff ;; morphos) basic_machine=powerpc-unknown basic_os=morphos ;; moxiebox) basic_machine=moxie-unknown basic_os=moxiebox ;; msdos) basic_machine=i386-pc basic_os=msdos ;; msys) basic_machine=i686-pc basic_os=msys ;; mvs) basic_machine=i370-ibm basic_os=mvs ;; nacl) basic_machine=le32-unknown basic_os=nacl ;; ncr3000) basic_machine=i486-ncr basic_os=sysv4 ;; netbsd386) basic_machine=i386-pc basic_os=netbsd ;; netwinder) basic_machine=armv4l-rebel basic_os=linux ;; news | news700 | news800 | news900) basic_machine=m68k-sony basic_os=newsos ;; news1000) basic_machine=m68030-sony basic_os=newsos ;; necv70) basic_machine=v70-nec basic_os=sysv ;; nh3000) basic_machine=m68k-harris basic_os=cxux ;; nh[45]000) basic_machine=m88k-harris basic_os=cxux ;; nindy960) basic_machine=i960-intel basic_os=nindy ;; mon960) basic_machine=i960-intel basic_os=mon960 ;; nonstopux) basic_machine=mips-compaq basic_os=nonstopux ;; os400) basic_machine=powerpc-ibm basic_os=os400 ;; OSE68000 | ose68000) basic_machine=m68000-ericsson basic_os=ose ;; os68k) basic_machine=m68k-none basic_os=os68k ;; paragon) basic_machine=i860-intel basic_os=osf ;; parisc) basic_machine=hppa-unknown basic_os=linux ;; psp) basic_machine=mipsallegrexel-sony basic_os=psp ;; pw32) basic_machine=i586-unknown basic_os=pw32 ;; rdos | rdos64) basic_machine=x86_64-pc basic_os=rdos ;; rdos32) basic_machine=i386-pc basic_os=rdos ;; rom68k) basic_machine=m68k-rom68k basic_os=coff ;; sa29200) basic_machine=a29k-amd basic_os=udi ;; sei) basic_machine=mips-sei basic_os=seiux ;; sequent) basic_machine=i386-sequent basic_os= ;; sps7) basic_machine=m68k-bull basic_os=sysv2 ;; st2000) basic_machine=m68k-tandem basic_os= ;; stratus) basic_machine=i860-stratus basic_os=sysv4 ;; sun2) basic_machine=m68000-sun basic_os= ;; sun2os3) basic_machine=m68000-sun basic_os=sunos3 ;; sun2os4) basic_machine=m68000-sun basic_os=sunos4 ;; sun3) basic_machine=m68k-sun basic_os= ;; sun3os3) basic_machine=m68k-sun basic_os=sunos3 ;; sun3os4) basic_machine=m68k-sun basic_os=sunos4 ;; sun4) basic_machine=sparc-sun basic_os= ;; sun4os3) basic_machine=sparc-sun basic_os=sunos3 ;; sun4os4) basic_machine=sparc-sun basic_os=sunos4 ;; sun4sol2) basic_machine=sparc-sun basic_os=solaris2 ;; sun386 | sun386i | roadrunner) basic_machine=i386-sun basic_os= ;; sv1) basic_machine=sv1-cray basic_os=unicos ;; symmetry) basic_machine=i386-sequent basic_os=dynix ;; t3e) basic_machine=alphaev5-cray basic_os=unicos ;; t90) basic_machine=t90-cray basic_os=unicos ;; toad1) basic_machine=pdp10-xkl basic_os=tops20 ;; tpf) basic_machine=s390x-ibm basic_os=tpf ;; udi29k) basic_machine=a29k-amd basic_os=udi ;; ultra3) basic_machine=a29k-nyu basic_os=sym1 ;; v810 | necv810) basic_machine=v810-nec basic_os=none ;; vaxv) basic_machine=vax-dec basic_os=sysv ;; vms) basic_machine=vax-dec basic_os=vms ;; vsta) basic_machine=i386-pc basic_os=vsta ;; vxworks960) basic_machine=i960-wrs basic_os=vxworks ;; vxworks68) basic_machine=m68k-wrs basic_os=vxworks ;; vxworks29k) basic_machine=a29k-wrs basic_os=vxworks ;; xbox) basic_machine=i686-pc basic_os=mingw32 ;; ymp) basic_machine=ymp-cray basic_os=unicos ;; *) basic_machine=$1 basic_os= ;; esac ;; esac # Decode 1-component or ad-hoc basic machines case $basic_machine in # Here we handle the default manufacturer of certain CPU types. It is in # some cases the only manufacturer, in others, it is the most popular. w89k) cpu=hppa1.1 vendor=winbond ;; op50n) cpu=hppa1.1 vendor=oki ;; op60c) cpu=hppa1.1 vendor=oki ;; ibm*) cpu=i370 vendor=ibm ;; orion105) cpu=clipper vendor=highlevel ;; mac | mpw | mac-mpw) cpu=m68k vendor=apple ;; pmac | pmac-mpw) cpu=powerpc vendor=apple ;; # Recognize the various machine names and aliases which stand # for a CPU type and a company and sometimes even an OS. 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc) cpu=m68000 vendor=att ;; 3b*) cpu=we32k vendor=att ;; bluegene*) cpu=powerpc vendor=ibm basic_os=cnk ;; decsystem10* | dec10*) cpu=pdp10 vendor=dec basic_os=tops10 ;; decsystem20* | dec20*) cpu=pdp10 vendor=dec basic_os=tops20 ;; delta | 3300 | motorola-3300 | motorola-delta \ | 3300-motorola | delta-motorola) cpu=m68k vendor=motorola ;; dpx2*) cpu=m68k vendor=bull basic_os=sysv3 ;; encore | umax | mmax) cpu=ns32k vendor=encore ;; elxsi) cpu=elxsi vendor=elxsi basic_os=${basic_os:-bsd} ;; fx2800) cpu=i860 vendor=alliant ;; genix) cpu=ns32k vendor=ns ;; h3050r* | hiux*) cpu=hppa1.1 vendor=hitachi basic_os=hiuxwe2 ;; hp3k9[0-9][0-9] | hp9[0-9][0-9]) cpu=hppa1.0 vendor=hp ;; hp9k2[0-9][0-9] | hp9k31[0-9]) cpu=m68000 vendor=hp ;; hp9k3[2-9][0-9]) cpu=m68k vendor=hp ;; hp9k6[0-9][0-9] | hp6[0-9][0-9]) cpu=hppa1.0 vendor=hp ;; hp9k7[0-79][0-9] | hp7[0-79][0-9]) cpu=hppa1.1 vendor=hp ;; hp9k78[0-9] | hp78[0-9]) # FIXME: really hppa2.0-hp cpu=hppa1.1 vendor=hp ;; hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893) # FIXME: really hppa2.0-hp cpu=hppa1.1 vendor=hp ;; hp9k8[0-9][13679] | hp8[0-9][13679]) cpu=hppa1.1 vendor=hp ;; hp9k8[0-9][0-9] | hp8[0-9][0-9]) cpu=hppa1.0 vendor=hp ;; i*86v32) cpu=`echo "$1" | sed -e 's/86.*/86/'` vendor=pc basic_os=sysv32 ;; i*86v4*) cpu=`echo "$1" | sed -e 's/86.*/86/'` vendor=pc basic_os=sysv4 ;; i*86v) cpu=`echo "$1" | sed -e 's/86.*/86/'` vendor=pc basic_os=sysv ;; i*86sol2) cpu=`echo "$1" | sed -e 's/86.*/86/'` vendor=pc basic_os=solaris2 ;; j90 | j90-cray) cpu=j90 vendor=cray basic_os=${basic_os:-unicos} ;; iris | iris4d) cpu=mips vendor=sgi case $basic_os in irix*) ;; *) basic_os=irix4 ;; esac ;; miniframe) cpu=m68000 vendor=convergent ;; *mint | mint[0-9]* | *MiNT | *MiNT[0-9]*) cpu=m68k vendor=atari basic_os=mint ;; news-3600 | risc-news) cpu=mips vendor=sony basic_os=newsos ;; next | m*-next) cpu=m68k vendor=next case $basic_os in openstep*) ;; nextstep*) ;; ns2*) basic_os=nextstep2 ;; *) basic_os=nextstep3 ;; esac ;; np1) cpu=np1 vendor=gould ;; op50n-* | op60c-*) cpu=hppa1.1 vendor=oki basic_os=proelf ;; pa-hitachi) cpu=hppa1.1 vendor=hitachi basic_os=hiuxwe2 ;; pbd) cpu=sparc vendor=tti ;; pbb) cpu=m68k vendor=tti ;; pc532) cpu=ns32k vendor=pc532 ;; pn) cpu=pn vendor=gould ;; power) cpu=power vendor=ibm ;; ps2) cpu=i386 vendor=ibm ;; rm[46]00) cpu=mips vendor=siemens ;; rtpc | rtpc-*) cpu=romp vendor=ibm ;; sde) cpu=mipsisa32 vendor=sde basic_os=${basic_os:-elf} ;; simso-wrs) cpu=sparclite vendor=wrs basic_os=vxworks ;; tower | tower-32) cpu=m68k vendor=ncr ;; vpp*|vx|vx-*) cpu=f301 vendor=fujitsu ;; w65) cpu=w65 vendor=wdc ;; w89k-*) cpu=hppa1.1 vendor=winbond basic_os=proelf ;; none) cpu=none vendor=none ;; leon|leon[3-9]) cpu=sparc vendor=$basic_machine ;; leon-*|leon[3-9]-*) cpu=sparc vendor=`echo "$basic_machine" | sed 's/-.*//'` ;; *-*) # shellcheck disable=SC2162 saved_IFS=$IFS IFS="-" read cpu vendor <&2 exit 1 ;; esac ;; esac # Here we canonicalize certain aliases for manufacturers. case $vendor in digital*) vendor=dec ;; commodore*) vendor=cbm ;; *) ;; esac # Decode manufacturer-specific aliases for certain operating systems. if test x$basic_os != x then # First recognize some ad-hoc cases, or perhaps split kernel-os, or else just # set os. case $basic_os in gnu/linux*) kernel=linux os=`echo "$basic_os" | sed -e 's|gnu/linux|gnu|'` ;; os2-emx) kernel=os2 os=`echo "$basic_os" | sed -e 's|os2-emx|emx|'` ;; nto-qnx*) kernel=nto os=`echo "$basic_os" | sed -e 's|nto-qnx|qnx|'` ;; *-*) # shellcheck disable=SC2162 saved_IFS=$IFS IFS="-" read kernel os <&2 exit 1 ;; esac # As a final step for OS-related things, validate the OS-kernel combination # (given a valid OS), if there is a kernel. case $kernel-$os in linux-gnu* | linux-dietlibc* | linux-android* | linux-newlib* \ | linux-musl* | linux-relibc* | linux-uclibc* | linux-mlibc* ) ;; uclinux-uclibc* ) ;; managarm-mlibc* | managarm-kernel* ) ;; -dietlibc* | -newlib* | -musl* | -relibc* | -uclibc* | -mlibc* ) # These are just libc implementations, not actual OSes, and thus # require a kernel. echo "Invalid configuration \`$1': libc \`$os' needs explicit kernel." 1>&2 exit 1 ;; -kernel* ) echo "Invalid configuration \`$1': \`$os' needs explicit kernel." 1>&2 exit 1 ;; *-kernel* ) echo "Invalid configuration \`$1': \`$kernel' does not support \`$os'." 1>&2 exit 1 ;; kfreebsd*-gnu* | kopensolaris*-gnu*) ;; vxworks-simlinux | vxworks-simwindows | vxworks-spe) ;; nto-qnx*) ;; os2-emx) ;; *-eabi* | *-gnueabi*) ;; -*) # Blank kernel with real OS is always fine. ;; *-*) echo "Invalid configuration \`$1': Kernel \`$kernel' not known to work with OS \`$os'." 1>&2 exit 1 ;; esac # Here we handle the case where we know the os, and the CPU type, but not the # manufacturer. We pick the logical manufacturer. case $vendor in unknown) case $cpu-$os in *-riscix*) vendor=acorn ;; *-sunos*) vendor=sun ;; *-cnk* | *-aix*) vendor=ibm ;; *-beos*) vendor=be ;; *-hpux*) vendor=hp ;; *-mpeix*) vendor=hp ;; *-hiux*) vendor=hitachi ;; *-unos*) vendor=crds ;; *-dgux*) vendor=dg ;; *-luna*) vendor=omron ;; *-genix*) vendor=ns ;; *-clix*) vendor=intergraph ;; *-mvs* | *-opened*) vendor=ibm ;; *-os400*) vendor=ibm ;; s390-* | s390x-*) vendor=ibm ;; *-ptx*) vendor=sequent ;; *-tpf*) vendor=ibm ;; *-vxsim* | *-vxworks* | *-windiss*) vendor=wrs ;; *-aux*) vendor=apple ;; *-hms*) vendor=hitachi ;; *-mpw* | *-macos*) vendor=apple ;; *-*mint | *-mint[0-9]* | *-*MiNT | *-MiNT[0-9]*) vendor=atari ;; *-vos*) vendor=stratus ;; esac ;; esac echo "$cpu-$vendor-${kernel:+$kernel-}$os" exit # Local variables: # eval: (add-hook 'before-save-hook 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" # End: hypre-2.33.0/src/config/configure.in000066400000000000000000003124101477326011500173020ustar00rootroot00000000000000dnl Copyright (c) 1998 Lawrence Livermore National Security, LLC and other dnl HYPRE Project Developers. See the top-level COPYRIGHT file for details. dnl dnl SPDX-License-Identifier: (Apache-2.0 OR MIT) dnl ********************************************************************* dnl * File Name: configure.in dnl * dnl * This file is read when autoconf is run and the configure script is dnl * generated. dnl * Configure.in is structured as follows: dnl * initialization information dnl * determine the current architecture dnl * set user specified compilers and any other user specified options dnl * dnl * For the given the architecture, an optimal compiler is dnl * found (if not specified by the user). If the architecture is dnl * unknown or none of the preferred compilers are available then dnl * default compilers are found. dnl * dnl * For each chosen compiler, the appropriate flags are set for dnl * optimization, debugging, MPI and pthreading (as required) and the dnl * C preprocessor is checked. dnl * dnl * Finally, library flags are added and AC_SUBST is used to export dnl * all necessary macro values. dnl ********************************************************************* dnl ********************************************************************* dnl * NOTES: dnl * dnl * Several macros first check whether the compiler works, including: dnl * AC_CHECK_LIB, AC_CHECK_FUNC, AC_CHECK_FUNCS, dnl * AC_PROG_CC, AC_PROG_CPP, AC_PROG_CXX, AC_PROG_CXXCPP, dnl * AC_PROG_FC, AC_FC_WRAPPERS, dnl * AC_HYPRE_CHECK_MPI, AC_HYPRE_FIND_G2C, dnl * AC_HYPRE_FIND_BLAS, AC_HYPRE_FIND_LAPACK dnl * dnl * The following macros require a Fortran compiler and are protected dnl * below by checking the hypre_using_fortran variable: dnl * AC_PROG_FC, AC_FC_WRAPPERS, dnl * AC_HYPRE_FIND_BLAS, AC_HYPRE_FIND_LAPACK dnl ********************************************************************* dnl ********************************************************************* dnl * Initialization Information dnl * Set package information so it only has to be modified in one place dnl ********************************************************************* m4_define([M4_HYPRE_NAME], [hypre]) m4_define([M4_HYPRE_VERSION], [2.33.0]) m4_define([M4_HYPRE_NUMBER], [23300]) m4_define([M4_HYPRE_DATE], [2025/04/03]) m4_define([M4_HYPRE_TIME], [00:00:00]) m4_define([M4_HYPRE_BUGS], [https://github.com/hypre-space/hypre/issues]) m4_define([M4_HYPRE_SRCDIR], [`pwd`]) m4_include([config/hypre_blas_macros.m4]) m4_include([config/hypre_lapack_macros.m4]) m4_include([config/hypre_macros_misc.m4]) AC_PREREQ([2.69]) AC_REVISION($Id$) AC_INIT(M4_HYPRE_NAME, M4_HYPRE_VERSION) AC_CONFIG_HEADERS([HYPRE_config.h:config/HYPRE_config.h.in]) AC_COPYRIGHT([Copyright (c) 1998 Lawrence Livermore National Security, LLC and other HYPRE Project Developers. See the top-level COPYRIGHT file for details.]) AC_CONFIG_AUX_DIR(config) AC_CONFIG_SRCDIR([HYPRE.h]) dnl m4_pattern_allow([AC_HYPRE_[A-Z_]+]) dnl * Change default prefix from /usr/local to ./hypre dnl * Note that $ expansion of shell variables doesn't work with this AC macro. AC_PREFIX_DEFAULT([M4_HYPRE_SRCDIR/hypre]) dnl ********************************************************************* dnl * Initialize some variables dnl * dnl * For some reason, this type of variable initialization doesn't work dnl * if done before AC_INIT above. To keep the release info at the top dnl * of the file, 'm4_define' is used to define m4 macros first. dnl ********************************************************************* HYPRE_NAME="M4_HYPRE_NAME" HYPRE_VERSION="M4_HYPRE_VERSION" HYPRE_NUMBER=M4_HYPRE_NUMBER HYPRE_DATE="M4_HYPRE_DATE" HYPRE_TIME="M4_HYPRE_TIME" HYPRE_BUGS="M4_HYPRE_BUGS" HYPRE_SRCDIR="M4_HYPRE_SRCDIR" AC_DEFINE_UNQUOTED(HYPRE_RELEASE_NAME, ["$HYPRE_NAME"], [Release name]) AC_DEFINE_UNQUOTED(HYPRE_RELEASE_VERSION, ["$HYPRE_VERSION"], [Release version]) AC_DEFINE_UNQUOTED(HYPRE_RELEASE_NUMBER, [$HYPRE_NUMBER], [Release number]) AC_DEFINE_UNQUOTED(HYPRE_RELEASE_DATE, ["$HYPRE_DATE"], [Date of release]) AC_DEFINE_UNQUOTED(HYPRE_RELEASE_TIME, ["$HYPRE_TIME"], [Time of release]) AC_DEFINE_UNQUOTED(HYPRE_RELEASE_BUGS, ["$HYPRE_BUGS"], [Bug reports]) AC_SUBST(HYPRE_NAME) AC_SUBST(HYPRE_VERSION) AC_SUBST(HYPRE_NUMBER) AC_SUBST(HYPRE_DATE) AC_SUBST(HYPRE_TIME) AC_SUBST(HYPRE_BUGS) AC_SUBST(HYPRE_SRCDIR) AS_IF([test -d "$HYPRE_SRCDIR/../.git"], [ develop_string=$(git -C $HYPRE_SRCDIR describe --match 'v*' --long --abbrev=9) develop_lastag=$(git -C $HYPRE_SRCDIR describe --match 'v*' --abbrev=0) develop_number=$(git -C $HYPRE_SRCDIR rev-list --count $develop_lastag..HEAD) develop_branch=$(git -C $HYPRE_SRCDIR rev-parse --abbrev-ref HEAD) AS_IF([test -n "$develop_string"], [ AC_DEFINE_UNQUOTED(HYPRE_DEVELOP_STRING, ["$develop_string"], [Develop branch string]) AC_DEFINE_UNQUOTED(HYPRE_DEVELOP_NUMBER, [$develop_number], [Develop branch commit number]) AC_DEFINE_UNQUOTED(HYPRE_BRANCH_NAME, ["$develop_branch"], [Feature branch string]) AS_IF([test "x$develop_branch" = "xmaster"], [AC_DEFINE_UNQUOTED(HYPRE_DEVELOP_BRANCH, ["$develop_branch"], [Main development branch?])], [AC_MSG_NOTICE([NOTE: On branch $develop_branch, not the main development branch])] ) ], [AC_MSG_NOTICE([NOTE: Could not describe development branch])] ) ], [AC_MSG_NOTICE([NOTE: Could not find .git directory])] ) dnl ********************************************************************* dnl * Clear variables defined by AC_INIT to avoid name conflicts with dnl * other packages. dnl ********************************************************************* PACKAGE_DATE= PACKAGE_TIME= PACKAGE_DATETIME= PACKAGE_NAME= PACKAGE_VERSION= PACKAGE_STRING= PACKAGE_TARNAME= PACKAGE_BUGREPORT= dnl ********************************************************************* dnl * Initialize hypre variables dnl ********************************************************************* hypre_user_chose_mpi=no hypre_user_chose_blas=no hypre_user_chose_lapack=no hypre_user_chose_raja=no hypre_using_raja=no hypre_user_chose_kokkos=no hypre_using_kokkos=no hypre_using_c=yes hypre_using_cxx=yes hypre_using_mpi=yes hypre_using_distributed_ls=yes hypre_using_superlu=no hypre_using_dsuperlu=no hypre_using_fei=no hypre_using_mli=no hypre_using_openmp=no hypre_using_device_openmp=no hypre_using_cuda=no hypre_using_gpu=no hypre_using_um=no hypre_gpu_mpi=no hypre_using_gpu_profiling=no hypre_using_cuda_streams=no hypre_using_cusparse=no hypre_using_cublas=no hypre_using_curand=no hypre_using_cusolver=no hypre_using_device_pool=no hypre_using_device_malloc_async=no hypre_using_thrust_nosync=no hypre_using_umpire=no hypre_using_umpire_host=no hypre_using_umpire_device=no hypre_using_umpire_um=no hypre_using_umpire_pinned=no hypre_using_caliper=no hypre_user_gave_caliper_lib=no hypre_user_gave_caliper_inc=no hypre_found_cuda=no hypre_using_node_aware_mpi=no hypre_using_memory_tracker=no hypre_test_using_host=no hypre_cxxstd=11 dnl ********************************************************************* dnl * Initialize hypre-MAGMA variables dnl ********************************************************************* hypre_using_magma=no hypre_user_gave_magma_inc=no hypre_user_gave_magma_lib=no hypre_user_gave_magma_libs=no hypre_user_gave_magma_lib_dirs=no dnl ********************************************************************* dnl * Initialize hypre-HIP variables dnl ********************************************************************* hypre_using_hip=no hypre_using_rocsparse=no hypre_using_rocblas=no hypre_using_rocsolver=no hypre_using_rocrand=no hypre_found_hip=no dnl ********************************************************************* dnl * Initialize hypre-SYCL variables dnl ********************************************************************* hypre_using_sycl=no hypre_using_onemklsparse=no hypre_using_onemklblas=no hypre_using_onemklrand=no hypre_found_mkl=no dnl ********************************************************************* dnl * Initialize flag-check variables dnl ********************************************************************* hypre_blas_lib_old_style=no hypre_blas_lib_dir_old_style=no hypre_lapack_lib_old_style=no hypre_lapack_lib_dir_old_style=no dnl ********************************************************************* dnl * Determine BUILD, HOST, and TARGET types dnl ********************************************************************* if test "x$build_alias" = "x" then AC_CANONICAL_BUILD fi if test "x$host_alias" = "x" then AC_CANONICAL_HOST fi if test "x$target_alias" = "x" then target_alias=$host_alias fi dnl ********************************************************************* dnl * Define optional features dnl ********************************************************************* AC_ARG_ENABLE(debug, AS_HELP_STRING([--enable-debug], [Set compiler flags for debugging.]), [case "${enableval}" in yes) hypre_using_debug=yes ;; no) hypre_using_debug=no ;; *) AC_MSG_ERROR([Bad value ${enableval} for --enable-debug]) ;; esac], [hypre_using_debug=no] ) AC_ARG_ENABLE(shared, AS_HELP_STRING([--enable-shared], [Build shared libraries (default is NO).]), [case "${enableval}" in yes) hypre_using_shared=yes ;; no) hypre_using_shared=no ;; *) AC_MSG_ERROR([Bad value ${enableval} for --enable-shared]) ;; esac], [hypre_using_shared=no] ) AC_ARG_ENABLE(mixedint, AS_HELP_STRING([--enable-mixedint], [Use long long int for HYPRE_BigInt and int for HYPRE_Int (default is int for both). Note: This option disables Euclid, ParaSails, pilut and CGC coarsening.]), [case "${enableval}" in yes) hypre_using_fei=no hypre_using_mixedint=yes hypre_using_distributed_ls=no ;; no) hypre_using_mixedint=no hypre_using_distributed_ls=yes ;; *) AC_MSG_ERROR([Bad value ${enableval} for --enable-mixedint]) ;; esac], [hypre_using_mixedint=no] ) if test "$hypre_using_mixedint" = "yes" then AC_DEFINE(HYPRE_MIXEDINT, 1, [Define to 1 if using long long int for HYPRE_BigInt]) fi AC_ARG_ENABLE(bigint, AS_HELP_STRING([--enable-bigint], [Use long long int for HYPRE_Int (default is NO).]), [case "${enableval}" in yes) hypre_using_fei=no hypre_using_bigint=yes ;; no) hypre_using_bigint=no ;; *) AC_MSG_ERROR([Bad value ${enableval} for --enable-bigint]) ;; esac], [hypre_using_bigint=no] ) if test "$hypre_using_bigint" = "yes" then AC_DEFINE(HYPRE_BIGINT, 1, [Define to 1 if using long long int for HYPRE_Int and HYPRE_BigInt]) fi AC_ARG_ENABLE(single, AS_HELP_STRING([--enable-single], [Use single precision values (default is NO).]), [case "${enableval}" in yes) hypre_using_fei=no hypre_using_single=yes ;; no) hypre_using_single=no ;; *) AC_MSG_ERROR([Bad value ${enableval} for --enable-single]) ;; esac], [hypre_using_single=no] ) if test "$hypre_using_single" = "yes" then AC_DEFINE(HYPRE_SINGLE, 1, [Define to 1 if using single precision values for HYPRE_Real]) fi AC_ARG_ENABLE(longdouble, AS_HELP_STRING([--enable-longdouble], [Use long double precision values (default is NO).]), [case "${enableval}" in yes) hypre_using_fei=no hypre_using_longdouble=yes ;; no) hypre_using_longdouble=no ;; *) AC_MSG_ERROR([Bad value ${enableval} for --enable-longdouble]) ;; esac], [hypre_using_longdouble=no] ) if test "$hypre_using_longdouble" = "yes" then AC_DEFINE(HYPRE_LONG_DOUBLE, 1, [Define to 1 if using quad precision values for HYPRE_Real]) fi AC_ARG_ENABLE(complex, AS_HELP_STRING([--enable-complex], [Use complex values (default is NO).]), [case "${enableval}" in yes) hypre_using_fei=no hypre_using_complex=yes ;; no) hypre_using_complex=no ;; *) AC_MSG_ERROR([Bad value ${enableval} for --enable-complex]) ;; esac], [hypre_using_complex=no] ) if test "$hypre_using_complex" = "yes" then AC_DEFINE(HYPRE_COMPLEX, 1, [Define to 1 if using complex values]) fi AC_ARG_ENABLE(maxdim, AS_HELP_STRING([--enable-maxdim=MAXDIM], [Change max dimension size to MAXDIM (default is 3). Currently must be at least 3.]), [hypre_maxdim=${enableval}], [hypre_maxdim=3] ) AC_DEFINE_UNQUOTED(HYPRE_MAXDIM, [$hypre_maxdim], [Define to be the max dimension size (must be at least 3)]) AC_ARG_ENABLE(persistent, AS_HELP_STRING([--enable-persistent], [Uses persistent communication (default is NO).]), [case "${enableval}" in yes) hypre_using_persistent=yes ;; no) hypre_using_persistent=no ;; *) AC_MSG_ERROR([Bad value ${enableval} for --enable-persistent]) ;; esac], [hypre_using_persistent=no] ) if test "$hypre_using_persistent" = "yes" then AC_DEFINE(HYPRE_USING_PERSISTENT_COMM, 1, [Define to 1 if using persistent communication]) fi AC_ARG_ENABLE(hopscotch, AS_HELP_STRING([--enable-hopscotch], [Uses hopscotch hashing if configured with OpenMP and atomic capability available(default is NO).]), [case "${enableval}" in yes) hypre_using_hopscotch=yes ;; no) hypre_using_hopscotch=no ;; *) AC_MSG_ERROR([Bad value ${enableval} for --enable-hopscotch]) ;; esac], [hypre_using_hopscotch=no] ) if test "$hypre_using_hopscotch" = "yes" then AC_DEFINE(HYPRE_USING_HOPSCOTCH, 1, [Define to 1 if using hopscotch hashing]) fi AC_ARG_ENABLE(fortran, AS_HELP_STRING([--enable-fortran], [Require a working Fortran compiler (default is YES).]), [case "${enableval}" in yes) hypre_using_fortran=yes ;; no) hypre_using_fortran=no ;; *) hypre_using_fortran=yes ;; esac], [hypre_using_fortran=yes] ) AC_ARG_ENABLE(unified-memory, AS_HELP_STRING([--enable-unified-memory], [Use unified memory for allocating the memory (default is NO).]), [case "${enableval}" in yes) hypre_using_um=yes ;; no) hypre_using_um=no ;; *) hypre_using_um=no ;; esac], [hypre_using_um=no] ) AC_ARG_ENABLE(device-memory-pool, AS_HELP_STRING([--enable-device-memory-pool], [Use device pooling allocator (default is NO).]), [case "${enableval}" in yes) hypre_using_device_pool=yes ;; no) hypre_using_device_pool=no ;; *) hypre_using_device_pool=no ;; esac], [hypre_using_device_pool=no] ) AC_ARG_ENABLE(device-malloc-async, AS_HELP_STRING([--enable-device-malloc-async], [Use device async malloc (default is NO).]), [case "${enableval}" in yes) hypre_using_device_malloc_async=yes ;; no) hypre_using_device_malloc_async=no ;; *) hypre_using_device_malloc_async=no ;; esac], [hypre_using_device_malloc_async=no] ) AC_ARG_ENABLE(thrust-nosync, AS_HELP_STRING([--enable-thrust-nosync], [Use thrust par_nosync policy (default is NO).]), [case "${enableval}" in yes) hypre_using_thrust_nosync=yes ;; no) hypre_using_thrust_nosync=no ;; *) hypre_using_thrust_nosync=no ;; esac], [hypre_using_thrust_nosync=no] ) AC_ARG_ENABLE(gpu-profiling, AS_HELP_STRING([--enable-gpu-profiling], [Use NVTX on CUDA, rocTX on HIP (default is NO).]), [case "${enableval}" in yes) hypre_using_gpu_profiling=yes ;; no) hypre_using_gpu_profiling=no ;; *) hypre_using_gpu_profiling=no ;; esac], [hypre_using_gpu_profiling=no] ) AC_ARG_ENABLE(gpu-aware-mpi, AS_HELP_STRING([--enable-gpu-aware-mpi], [Use GPU memory aware MPI]), [case "${enableval}" in yes) hypre_gpu_mpi=yes ;; no) hypre_gpu_mpi=no ;; *) AC_MSG_ERROR([Bad value ${enableval} for --enable-gpu-aware-mpi]) ;; esac], [hypre_gpu_mpi=no] ) dnl * The AC_DEFINE is below, after hypre_using_mpi is completely set dnl * Need to change to a new approach that always defines variable to some value dnl ********************************************************************* dnl * Determine if user provided LD flags dnl ********************************************************************* if test "x$LDFLAGS" = "x" then hypre_user_chose_ldflags=no else hypre_user_chose_ldflags=yes fi dnl ********************************************************************* dnl * Determine if user provided C compiler or flags dnl ********************************************************************* if test "x$CC" = "x" then hypre_user_chose_ccompilers=no else hypre_user_chose_ccompilers=yes fi if test "x$CFLAGS" = "x" then hypre_user_chose_cflags=no else hypre_user_chose_cflags=yes fi dnl ********************************************************************* dnl * Determine if user provided CXX compiler or flags dnl ********************************************************************* if test "x$CXX" = "x" then hypre_user_chose_cxxcompilers=no else hypre_user_chose_cxxcompilers=yes fi if test "x$CXXFLAGS" = "x" then hypre_user_chose_cxxflags=no else hypre_user_chose_cxxflags=yes fi dnl ********************************************************************* dnl * Determine if user provided CUDA compiler or flags dnl ********************************************************************* AC_ARG_VAR([CUDA_HOME], [CUDA home directory]) AC_ARG_VAR([HYPRE_CUDA_SM], [CUDA architecture]) AC_ARG_VAR([CUCC], [CUDA compiler command]) AC_ARG_VAR([CUFLAGS], [CUDA compiler flags]) if test "x$CUCC" = "x" then hypre_user_chose_cudacompilers=no else hypre_user_chose_cudacompilers=yes fi if test "x$CUFLAGS" = "x" then hypre_user_chose_cuflags=no else hypre_user_chose_cuflags=yes fi dnl ********************************************************************* dnl * Determine if user provided fortran compiler or flags dnl ********************************************************************* if test "x$F77" != "x" && test "x$FC" = "x" then FC="$F77" fi if test "x$FC" = "x" then hypre_user_chose_fcompilers=no else hypre_user_chose_fcompilers=yes fi if test "x$F77FLAGS" != "x" then FCFLAGS="$F77FLAGS $FCFLAGS" fi if test "x$FFLAGS" = "x" || test "x$FCFLAGS" = "x" then hypre_user_chose_fflags=no else hypre_user_chose_fflags=yes fi dnl ********************************************************************* dnl * Set default AR value if not defined by the user dnl ********************************************************************* if test "x$AR" = "x" then AR="ar -rcu" fi AC_ARG_WITH(cxxstandard, AS_HELP_STRING([--with-cxxstandard=val], [User specifies c++ starndard in val.]), [hypre_cxxstd=$withval] ) dnl ********************************************************************* dnl * If the user has specified a c, c++, or fortran compiler on the dnl * command line, that compiler will be used. No checks are done dnl * to assure this compiler is present or working. Additionally, dnl * if the user indicated any MPI include, library, or directory dnl * to use with the chosen compiler those options are identified dnl * and the appropriate macros are assigned values. dnl ********************************************************************* AC_ARG_WITH(LD, AS_HELP_STRING([--with-LD=ARG], [Set linker to ARG. The environment variable 'LD' will be overridden.]), [LD=$withval] ) AC_ARG_WITH(LDFLAGS, AS_HELP_STRING([--with-LDFLAGS=ARG], [User can manually set linker flags. The 'LDFLAGS' environment variable will be overridden.]), [LDFLAGS=$withval] ) AC_ARG_WITH(extra-CFLAGS, AS_HELP_STRING([--with-extra-CFLAGS=ARG], [Define extra C compile flag, where ARG is a space-separated list (enclosed in quotes) of directories.]), [EXTRA_CFLAGS=$withval] ) AC_ARG_WITH(extra-CXXFLAGS, AS_HELP_STRING([--with-extra-CXXFLAGS=ARG], [Define extra C++ compile flag, where ARG is a space-separated list (enclosed in quotes) of directories.]), [EXTRA_CXXFLAGS=$withval] ) AC_ARG_WITH(extra-CUFLAGS, AS_HELP_STRING([--with-extra-CUFLAGS=ARG], [Define extra CUDA compile flag, where ARG is a space-separated list (enclosed in quotes) of directories.]), [EXTRA_CUFLAGS=$withval] ) AC_ARG_WITH(extra-BUILDFLAGS, AS_HELP_STRING([--with-extra-BUILDFLAGS=ARG], [Define extra library build flag, where ARG is a space-separated list (enclosed in quotes) of directories.]), [EXTRA_BUILDFLAGS=$withval] ) AC_ARG_WITH(extra-incpath, AS_HELP_STRING([--with-extra-incpath=PATH], [Define extra include path, where PATH is a space-separated list (enclosed in quotes) of directories.]), [CCFLAGS="${CCFLAGS} -I`echo ${withval}|sed 's/ /\ -I/g'`"] ) AC_ARG_WITH(extra-ldpath, AS_HELP_STRING([--with-extra-ldpath=PATH], [Define extra ld path, where PATH is a space-separated list (enclosed in quotes) of directories.]), [LDFLAGS="-L`echo ${withval}|sed 's/ /\ -L/g'` ${LDFLAGS}"] ) AC_ARG_WITH(strict-checking, AS_HELP_STRING([--with-strict-checking], [Compiles without MPI ('--without-MPI') and tries to find a compiler option that warns of as many non-ISO features as possible.]), [case "${withval}" in yes) hypre_user_chose_ccompilers=yes hypre_user_chose_cflags=yes hypre_user_chose_cxxcompilers=yes hypre_user_chose_cxxflags=yes hypre_user_chose_fcompilers=yes hypre_user_chose_fflags=yes hypre_using_debug=yes hypre_using_mpi=no AC_CHECK_PROGS(CC, [gcc g++ icc icpc pgcc pgCC xlc xlC kcc KCC], [""]) if test "x$CC" = "x" then hypre_using_c=no CFLAGS="" elif test "x$GCC" = "xyes" || test "x$CC" = "xgcc"; then FFLAGS="-g -Wall" CFLAGS="-g -Wall -std=gnu99 -pedantic -Wfloat-conversion -fsingle-precision-constant" CXXFLAGS="-g -Wall -Wshadow -fno-implicit-templates" CXXFLAGS="$CXXFLAGS -Woverloaded-virtual -ansi -pedantic" elif test "x$CC" = "xicc"; then FFLAGS="-g -Wall" CFLAGS="-g -Xc -Wall -x c" CXXFLAGS="-g -Xc -Wall -x c++" elif test "x$CC" = "xpgcc"; then FFLAGS="-g -Wall" CFLAGS="-g -Xa -Minform,inform" CXXFLAGS="-g -A --display_error_number -Minform,inform" elif test "x$CC" = "xxlc"; then FFLAGS="-g -Wall" CFLAGS="-g -qinfo=dcl:eff:pro:rea:ret:use" CXXFLAGS="-g -qinfo=dcl:eff:obs:pro:rea:ret:use" elif test "x$CC" = "xKCC" || test "x$CC" = "xkcc"; then FFLAGS="-g -Wall" CFLAGS="-g --c --strict --lint --display_error_number" CFLAGS="$CFLAGS --diag_suppress 45,236,450,826" CFLAGS="$CFLAGS,1018,1021,1022,1023,1024,1030,1041" CXXFLAGS="-g --strict --lint --display_error_number" CXXFLAGS="$CXXFLAGS --diag_suppress 381,450,1023,1024" fi AC_CHECK_PROGS(CXX, [g++ gcc icpc icc pgCC pgcc xlC xlc KCC kcc], [""]) if test "x$CXX" = "x" then hypre_using_cxx=no CXXFLAGS="" fi if test "$hypre_using_fortran" = "yes" then AC_CHECK_PROGS(FC, [g77 ifort pgf77 xlf], [""]) if test "x$FC" = "x" then hypre_using_fortran=no FFLAGS="" fi fi AC_DEFINE(HYPRE_SEQUENTIAL,1,[No MPI being used]) ;; esac] ) dnl ***** MPI AC_ARG_WITH(MPI-include, AS_HELP_STRING([--with-MPI-include=DIR], [User specifies that mpi.h is in DIR. The options --with-MPI-include --with-MPI-libs and --with-MPI-lib-dirs must be used together.]), [for mpi_dir in $withval; do MPIINCLUDE="$MPIINCLUDE -I$mpi_dir" done; hypre_user_chose_mpi=yes], [hypre_user_chose_mpi=no] ) AC_ARG_WITH(MPI-libs, AS_HELP_STRING([--with-MPI-libs=LIBS], [LIBS is space-separated list (enclosed in quotes) of library names needed for MPI, e.g. "nsl socket mpi". The options --with-MPI-include --with-MPI-libs and --with-MPI-lib-dirs must be used together.]), [for mpi_lib in $withval; do MPILIBS="$MPILIBS -l$mpi_lib" done; hypre_user_chose_mpi=yes] ) AC_ARG_WITH(MPI-lib-dirs, AS_HELP_STRING([--with-MPI-lib-dirs=DIRS], [DIRS is space-separated list (enclosed in quotes) of directories containing the libraries specified by --with-MPI-libs, e.g "usr/lib /usr/local/mpi/lib". The options --with-MPI-include --with-MPI-libs and --with-MPI-lib-dirs must be used together.]), [for mpi_lib_dir in $withval; do MPILIBDIRS="-L$mpi_lib_dir $MPILIBDIRS" done; hypre_user_chose_mpi=yes] ) AC_ARG_WITH(MPI-flags, AS_HELP_STRING([--with-MPI-flags=FLAGS], [FLAGS is a space separated list (enclosed in quotes) of whatever flags other than -l and -L are needed to link with MPI libraries-- Does not de-activate autosearch for other MPI information. May be used with the other three MPI options or alone in conjunction with the automatic MPI search.]), [case "${withval}" in yes) MPIFLAGS="" ;; no) MPIFLAGS="" ;; *) MPIFLAGS=$withval ;; esac], [MPIFLAGS=""] ) dnl ***** Node Aware MPI AC_ARG_WITH(node-aware-mpi, AS_HELP_STRING([--with-node-aware-mpi], [Use Node Aware MPI (default is NO).]), [case "$withval" in yes) hypre_using_node_aware_mpi=yes;; no) hypre_using_node_aware_mpi=no ;; *) hypre_using_node_aware_mpi=no ;; esac], [hypre_using_node_aware_mpi=no] ) AC_ARG_WITH(node-aware-mpi-include, AS_HELP_STRING([--with-node-aware-mpi-include=DIR], [User specifies that nap_comm.hpp is in DIR.]), [for nap_dir in $withval; do HYPRE_NAP_INCLUDE="$HYPRE_NAP_INCLUDE -I$nap_dir" done; hypre_using_node_aware_mpi=yes] ) dnl ***** memory tracker AC_ARG_WITH(memory_tracker, AS_HELP_STRING([--with-memory-tracker], [Use memory tracker in hypre (default is NO).]), [case "$withval" in yes) hypre_using_memory_tracker=yes;; no) hypre_using_memory_tracker=no ;; *) hypre_using_memory_tracker=no ;; esac], [hypre_using_memory_tracker=no] ) dnl ***** hypre tests using host memory AC_ARG_WITH(test_using_host, AS_HELP_STRING([--with-test-using-host], [Use host memory in hypre test drivers (default is NO).]), [case "$withval" in yes) hypre_test_using_host=yes;; no) hypre_test_using_host=no ;; *) hypre_test_using_host=no ;; esac], [hypre_test_using_host=no] ) dnl ***** BLAS AC_ARG_WITH(blas-lib, AS_HELP_STRING([--with-blas-lib=LIBS], [LIBS is space-separated linkable list (enclosed in quotes) of libraries needed for BLAS. OK to use -L and -l flags in the list]), [for blas_lib in $withval; do dnl [libprefix=`echo $blas_lib | cut -c1-2`] dnl if test $libprefix = "-L" dnl then dnl BLASLIBDIRS="$blas_lib $BLASLIBDIRS" dnl else BLASLIBS="$BLASLIBS $blas_lib" dnl fi done; hypre_user_chose_blas=yes] ) AC_ARG_WITH(blas-libs, AS_HELP_STRING([--with-blas-libs=LIBS], [LIBS is space-separated list (enclosed in quotes) of libraries needed for BLAS (base name only). The options --with-blas-libs and --with-blas-lib-dirs must be used together.]), [for blas_lib in $withval; do BLASLIBS="$BLASLIBS -l$blas_lib" done; hypre_user_chose_blas=yes hypre_blas_lib_old_style=yes] ) AC_ARG_WITH(blas-lib-dirs, AS_HELP_STRING([--with-blas-lib-dirs=DIRS], [DIRS is space-separated list (enclosed in quotes) of directories containing the libraries specified by --with-blas-libs, e.g "usr/lib /usr/local/blas/lib". The options --with-blas-libs and --with-blas-lib-dirs must be used together.]), [for blas_lib_dir in $withval; do BLASLIBDIRS="-L$blas_lib_dir $BLASLIBDIRS" done; hypre_user_chose_blas=yes hypre_blas_lib_dir_old_style=yes] ) dnl ***** LAPACK AC_ARG_WITH(lapack-lib, AS_HELP_STRING([--with-lapack-lib=LIBS], [LIBS is space-separated linkable list (enclosed in quotes) of libraries needed for LAPACK. OK to use -L and -l flags in the list]), [for lapack_lib in $withval; do dnl [libprefix=`echo $lapack_lib | cut -c1-2`] dnl if test $libprefix = "-L" dnl then dnl LAPACKLIBDIRS="$lapack_lib $LAPACKLIBDIRS" dnl else LAPACKLIBS="$LAPACKLIBS $lapack_lib" dnl fi done; hypre_user_chose_lapack=yes] ) AC_ARG_WITH(lapack-libs, AS_HELP_STRING([--with-lapack-libs=LIBS], [LIBS is space-separated list (enclosed in quotes) of libraries needed for LAPACK (base name only). The options --with-lapack-libs and --with-lapack-lib-dirs must be used together.]), [for lapack_lib in $withval; do LAPACKLIBS="$LAPACKLIBS -l$lapack_lib" done; hypre_user_chose_lapack=yes hypre_lapack_lib_old_style=yes] ) AC_ARG_WITH(lapack-lib-dirs, AS_HELP_STRING([--with-lapack-lib-dirs=DIRS], [DIRS is space-separated list (enclosed in quotes) of directories containing the libraries specified by --with-lapack-libs, e.g "usr/lib /usr/local/lapack/lib". The options --with-lapack-libs and --with-lapack-lib-dirs must be used together.]), [for lapack_lib_dir in $withval; do LAPACKLIBDIRS="-L$lapack_lib_dir $LAPACKLIBDIRS" done; hypre_user_chose_lapack=yes hypre_lapack_lib_dir_old_style=yes] ) dnl * Define a generic macro to set hypre_fmangle based on withval AC_DEFUN([AC_HYPRE_SET_FMANGLE], [ case "$withval" in no-underscores) hypre_fmangle=1 ;; one-underscore) hypre_fmangle=2 ;; two-underscores) hypre_fmangle=3 ;; caps-no-underscores) hypre_fmangle=4 ;; one-before-after) hypre_fmangle=5 ;; esac ]) dnl * Define --with-fmangle AC_ARG_WITH(fmangle, AS_HELP_STRING([--with-fmangle=FMANGLE], [FMANGLE contains a string indicating the type of name mangling to use when calling hypre from Fortran. It can be set to: "no-underscores", "one-underscore", "two-underscores", "caps-no-underscores", and "one-before-after".]), [hypre_fmangle=0; AC_HYPRE_SET_FMANGLE], [hypre_fmangle=0] ) AC_DEFINE_UNQUOTED(HYPRE_FMANGLE, [$hypre_fmangle], [Define as follows to set the Fortran name mangling scheme: 0 = unspecified; 1 = no underscores; 2 = one underscore; 3 = two underscores; 4 = caps, no underscores; 5 = one underscore before and after]) dnl * Define a generic macro to set hypre_fmangle_blaslapack based on withval AC_DEFUN([AC_HYPRE_SET_FMANGLE_BLAS], [ case "$withval" in no-underscores) hypre_fmangle_blas=1 ;; one-underscore) hypre_fmangle_blas=2 ;; two-underscores) hypre_fmangle_blas=3 ;; caps-no-underscores) hypre_fmangle_blas=4 ;; one-before-after) hypre_fmangle_blas=5 ;; esac ]) dnl * Define --with-fmangle-blas AC_ARG_WITH(fmangle-blas, AS_HELP_STRING([--with-fmangle-blas=FMANGLE], [Name mangling for BLAS. See --with-fmangle.]), [hypre_fmangle_blas=0; AC_HYPRE_SET_FMANGLE_BLAS], [hypre_fmangle_blas=0] ) AC_DEFINE_UNQUOTED(HYPRE_FMANGLE_BLAS, [$hypre_fmangle_blas], [BLAS mangling]) dnl * Define a generic macro to set hypre_fmangle_blaslapack based on withval dnl * This could use the same variable for blas, but it is redefined here for the dnl * rare case that blas/ lapack manglings could be different AC_DEFUN([AC_HYPRE_SET_FMANGLE_LAPACK], [ case "$withval" in no-underscores) hypre_fmangle_lapack=1 ;; one-underscore) hypre_fmangle_lapack=2 ;; two-underscores) hypre_fmangle_lapack=3 ;; caps-no-underscores) hypre_fmangle_lapack=4 ;; one-before-after) hypre_fmangle_lapack=5 ;; esac ]) dnl * Define --with-fmangle-lapack AC_ARG_WITH(fmangle-lapack, AS_HELP_STRING([--with-fmangle-lapack=FMANGLE], [Name mangling for LAPACK. See --with-fmangle.]), [hypre_fmangle_lapack=0; AC_HYPRE_SET_FMANGLE_LAPACK], [hypre_fmangle_lapack=0] ) AC_DEFINE_UNQUOTED(HYPRE_FMANGLE_LAPACK, [$hypre_fmangle_lapack], [LAPACK mangling]) AC_ARG_WITH(print-errors, AS_HELP_STRING([--with-print-errors], [Print HYPRE errors.]), [if test "$withval" = "yes" then AC_DEFINE(HYPRE_PRINT_ERRORS,1,[Print HYPRE errors]) fi] ) AC_ARG_WITH(timing, AS_HELP_STRING([--with-timing], [Use HYPRE timing routines.]), [if test "$withval" = "yes" then AC_DEFINE(HYPRE_TIMING,1,[Using HYPRE timing routines]) fi] ) AC_ARG_WITH(openmp, AS_HELP_STRING([--with-openmp], [Use OpenMP. This may affect which compiler is chosen.]), [case "${withval}" in yes) hypre_using_openmp=yes;; no) hypre_using_openmp=no ;; esac], [hypre_using_openmp=no] ) AC_ARG_WITH(device-openmp, AS_HELP_STRING([--with-device-openmp], [Use OpenMP 4.5 Device Directives. This may affect which compiler is chosen.]), [case "${withval}" in yes) hypre_using_device_openmp=yes ;; no) hypre_using_device_openmp=no ;; esac], [hypre_using_device_openmp=no] ) dnl ***** SuperLU AC_ARG_WITH(superlu, AS_HELP_STRING([--with-superlu], [Use external SuperLU library.]), [case "${withval}" in no) hypre_using_superlu=no ;; *) hypre_using_superlu=yes ;; esac] ) AS_IF([test "x$with_superlu" = "xyes"], [AC_DEFINE(HAVE_SUPERLU, 1, [Define to 1 if using SuperLU])], []) AC_ARG_WITH(superlu-include, AS_HELP_STRING([--with-superlu-include=DIR], [Directory where SuperLU is installed.]), [for superlu_inc_dir in $withval; do SUPERLU_INCLUDE="-I$superlu_inc_dir $SUPERLU_INCLUDE" done] ) AC_ARG_WITH(superlu-lib, AS_HELP_STRING([--with-superlu-lib=LIBS], [LIBS is space-separated linkable list (enclosed in quotes) of libraries needed for SuperLU. OK to use -L and -l flags in the list]), [for superlu_lib in $withval; do SUPERLU_LIBS="$SUPERLU_LIBS $superlu_lib" done] ) dnl ***** DSuperLU AC_ARG_WITH(dsuperlu, AS_HELP_STRING([--with-dsuperlu], [Use external DSuperLU library.]), [case "${withval}" in no) hypre_using_dsuperlu=no ;; *) hypre_using_dsuperlu=yes ;; esac] ) AS_IF([test "x$with_dsuperlu" = "xyes"], [AC_DEFINE(HYPRE_USING_DSUPERLU, 1, [Define to 1 if using DSuperLU])], []) AC_ARG_WITH(dsuperlu-include, AS_HELP_STRING([--with-dsuperlu-include=DIR], [Directory where DSuperLU is installed.]), [for dsuperlu_inc_dir in $withval; do DSUPERLU_INCLUDE="-I$dsuperlu_inc_dir $DSUPERLU_INCLUDE" done] ) AC_ARG_WITH(dsuperlu-lib, AS_HELP_STRING([--with-dsuperlu-lib=LIBS], [LIBS is space-separated linkable list (enclosed in quotes) of libraries needed for DSuperLU. OK to use -L and -l flags in the list]), [for dsuperlu_lib in $withval; do DSUPERLU_LIBS="$DSUPERLU_LIBS $dsuperlu_lib" done] ) dnl ***** FEI AC_ARG_WITH(fei-inc-dir, AS_HELP_STRING([--with-fei-inc-dir=DIR], [DIR is the directory containing the FEI distribution.]), [HYPRE_FEI_BASE_DIR="$withval"; hypre_using_fei=yes] ) dnl ***** MLI AC_ARG_WITH(mli, AS_HELP_STRING([--with-mli], [Use MLI]), [case "${withval}" in no) hypre_using_mli=no ;; *) hypre_using_mli=yes ;; esac] ) dnl ***** MPI AC_ARG_WITH(MPI, AS_HELP_STRING([--with-MPI], [DEFAULT: Compile with MPI. Selecting --without-MPI may affect which compiler is chosen.]), [case "$withval" in no) hypre_using_mpi=no ;; *) hypre_using_mpi=yes ;; esac] ) dnl ***** CUDA AC_ARG_WITH(cuda, AS_HELP_STRING([--with-cuda], [Use CUDA. Require cuda-8.0 or higher (default is NO).]), [case "$withval" in yes) hypre_using_cuda=yes ;; no) hypre_using_cuda=no ;; *) hypre_using_cuda=no ;; esac], [hypre_using_cuda=no] ) dnl ***** HIP AC_ARG_WITH(hip, AS_HELP_STRING([--with-hip], [Use HIP for AMD GPUs. (default is NO).]), [case "$withval" in yes) hypre_using_hip=yes ;; no) hypre_using_hip=no ;; *) hypre_using_hip=no ;; esac], [hypre_using_hip=no] ) AC_ARG_ENABLE(rocsparse, AS_HELP_STRING([--enable-rocsparse], [Use rocSPARSE (default is YES with HIP, otherwise NO).]), [case "${enableval}" in yes) hypre_using_rocsparse=yes ;; no) hypre_using_rocsparse=no ;; *) hypre_using_rocsparse=yes ;; esac], [case "$hypre_using_hip" in yes) hypre_using_rocsparse=yes ;; no) hypre_using_rocsparse=no ;; *) hypre_using_rocsparse=no ;; esac] ) AC_ARG_ENABLE(rocblas, AS_HELP_STRING([--enable-rocblas], [Use rocBLAS (default is NO).]), [case "${enableval}" in yes) hypre_using_rocblas=yes ;; no) hypre_using_rocblas=no ;; *) hypre_using_rocblas=no ;; esac], [hypre_using_rocblas=no] ) AC_ARG_ENABLE(rocsolver, AS_HELP_STRING([--enable-rocsolver], [Use rocSOLVER (default is NO).]), [case "${enableval}" in yes) hypre_using_rocsolver=yes; hypre_using_rocblas=yes ;; no) hypre_using_rocsolver=no ;; *) hypre_using_rocsolver=no ;; esac], [hypre_using_rocsolver=no] ) AC_ARG_ENABLE(rocrand, AS_HELP_STRING([--enable-rocrand], [Use rocRAND (default is YES with HIP, otherwise NO).]), [case "${enableval}" in yes) hypre_using_rocrand=yes ;; no) hypre_using_rocrand=no ;; *) hypre_using_rocrand=yes ;; esac], [case "$hypre_using_hip" in yes) hypre_using_rocrand=yes ;; no) hypre_using_rocrand=no ;; *) hypre_using_rocrand=no ;; esac] ) dnl ***** SYCL AC_ARG_WITH(sycl, AS_HELP_STRING([--with-sycl], [Use SYCL for Intel GPUs. (default is NO).]), [case "$withval" in yes) hypre_using_sycl=yes ;; no) hypre_using_sycl=no ;; *) hypre_using_sycl=no ;; esac], [hypre_using_sycl=no] ) dnl ***** CUDA options AC_ARG_WITH(cuda-home, AS_HELP_STRING([--with-cuda-home=DIR], [User specifies CUDA_HOME in DIR.]), [for cuda_dir in $withval; do CUDA_HOME="$cuda_dir" done; hypre_using_cuda=yes] ) AC_ARG_WITH(gpu-arch, AS_HELP_STRING([--with-gpu-arch=ARG], [User specifies NVIDIA GPU architecture that the CUDA files will be compiled for in ARG, where ARG is a space-separated list (enclosed in quotes) of numbers.]), [ if test "x${withval}" != "x" then if test "x${HYPRE_CUDA_SM}" = "x" then HYPRE_CUDA_SM="${withval}" fi fi ] ) AC_ARG_ENABLE(cublas, AS_HELP_STRING([--enable-cublas], [Use cuBLAS (default is YES with CUDA, otherwise NO).]), [case "${enableval}" in yes) hypre_using_cublas=yes ;; no) hypre_using_cublas=no ;; *) hypre_using_cublas=no ;; esac], [case "$hypre_using_cuda" in yes) hypre_using_cublas=yes ;; no) hypre_using_cublas=no ;; *) hypre_using_cublas=no ;; esac] ) AC_ARG_ENABLE(curand, AS_HELP_STRING([--enable-curand], [Use cuRAND (default is YES with CUDA, otherwise NO).]), [case "${enableval}" in yes) hypre_using_curand=yes ;; no) hypre_using_curand=no ;; *) hypre_using_curand=no ;; esac], [case "$hypre_using_cuda" in yes) hypre_using_curand=yes ;; no) hypre_using_curand=no ;; *) hypre_using_curand=no ;; esac] ) AC_ARG_ENABLE(cuda-streams, AS_HELP_STRING([--enable-cuda-streams], [Use CUDA streams (default is YES with CUDA, otherwise NO).]), [case "${enableval}" in yes) hypre_using_cuda_streams=yes ;; no) hypre_using_cuda_streams=no ;; *) hypre_using_cuda_streams=yes ;; esac], [case "$hypre_using_cuda" in yes) hypre_using_cuda_streams=yes ;; no) hypre_using_cuda_streams=no ;; *) hypre_using_cuda_streams=yes ;; esac], ) AC_ARG_ENABLE(cusparse, AS_HELP_STRING([--enable-cusparse], [Use cuSPARSE (default is YES with CUDA, otherwise NO).]), [case "${enableval}" in yes) hypre_using_cusparse=yes ;; no) hypre_using_cusparse=no ;; *) hypre_using_cusparse=no ;; esac], [case "$hypre_using_cuda" in yes) hypre_using_cusparse=yes ;; no) hypre_using_cusparse=no ;; *) hypre_using_cusparse=no ;; esac], ) AC_ARG_ENABLE(cusolver, AS_HELP_STRING([--enable-cusolver], [Use cuSOLVER (default is NO).]), [case "${enableval}" in yes) hypre_using_cusolver=yes ;; no) hypre_using_cusolver=no ;; *) hypre_using_cusolver=no ;; esac], [hypre_using_cusolver=no] ) dnl ***** SYCL options AC_ARG_WITH(sycl-target, AS_HELP_STRING([--with-sycl-target=ARG], [User specifies sycl targets for AOT compilation in ARG, where ARG is a comma-separated list (enclosed in quotes), e.g. "spir64_gen".]), [ if test "x${withval}" != "x" then if test "x${HYPRE_SYCL_TARGET}" = "x" then HYPRE_SYCL_TARGET="${withval}" fi fi ] ) AC_ARG_WITH(sycl-target-backend, AS_HELP_STRING([--with-sycl-target-backend=ARG], [User specifies additional options for the sycl target backend for AOT compilation in ARG, where ARG contains the desired options (enclosed in double+single quotes), e.g. --with-sycl-target-backend="'-device 12.1.0,12.4.0'".]), [ if test "x${withval}" != "x" then if test "x${HYPRE_SYCL_TARGET_BACKEND}" = "x" then HYPRE_SYCL_TARGET_BACKEND="${withval}" fi fi ] ) AC_ARG_ENABLE(onemklsparse, AS_HELP_STRING([--enable-onemklsparse], [Use oneMKL sparse (default is YES).]), [case "${enableval}" in yes) hypre_using_onemklsparse=yes ;; no) hypre_using_onemklsparse=no ;; *) hypre_using_onemklsparse=yes ;; esac], [hypre_using_onemklsparse=yes] ) AC_ARG_ENABLE(onemklblas, AS_HELP_STRING([--enable-onemklblas], [Use oneMKL blas (default is YES).]), [case "${enableval}" in yes) hypre_using_onemklblas=yes ;; no) hypre_using_onemklblas=no ;; *) hypre_using_onemklblas=yes ;; esac], [hypre_using_onemklblas=yes] ) AC_ARG_ENABLE(onemklrand, AS_HELP_STRING([--enable-onemklrand], [Use oneMKL rand (default is YES).]), [case "${enableval}" in yes) hypre_using_onemklrand=yes ;; no) hypre_using_onemklrand=no ;; *) hypre_using_onemklrand=yes ;; esac], [hypre_using_onemklrand=yes] ) dnl ***** RAJA AC_ARG_WITH(raja, AS_HELP_STRING([--with-raja], [Use RAJA. Require RAJA package to be compiled properly (default is NO).]), [case "$withval" in yes) hypre_using_raja=yes;; no) hypre_using_raja=no ;; *) hypre_using_raja=no ;; esac], [hypre_using_raja=no] ) AC_ARG_WITH(raja-include, AS_HELP_STRING([--with-raja-include=DIR], [User specifies that RAJA/*.h is in DIR. The options --with-raja-include --with-raja-libs and --with-raja-lib-dirs must be used together.]), [for raja_dir in $withval; do HYPRE_RAJA_INCLUDE="-I$raja_dir $HYPRE_RAJA_INCLUDE" done; hypre_user_chose_raja=yes] ) AC_ARG_WITH(raja-lib, AS_HELP_STRING([--with-raja-lib=LIBS], [LIBS is space-separated linkable list (enclosed in quotes) of libraries needed for RAJA. OK to use -L and -l flags in the list]), [for raja_lib in $withval; do HYPRE_RAJA_LIB="$raja_lib $HYPRE_RAJA_LIB" done; hypre_user_chose_raja=yes] ) AC_ARG_WITH(raja-libs, AS_HELP_STRING([--with-raja-libs=LIBS], [LIBS is space-separated list (enclosed in quotes) of libraries needed for RAJA (base name only). The options --with-raja-libs and --with-raja-lib-dirs must be used together.]), [for raja_lib in $withval; do HYPRE_RAJA_LIB="-l$raja_lib $HYPRE_RAJA_LIB" done; hypre_user_chose_raja=yes] ) AC_ARG_WITH(raja-lib-dirs, AS_HELP_STRING([--with-raja-lib-dirs=DIRS], [DIRS is space-separated list (enclosed in quotes) of directories containing the libraries specified by --with-raja-libs, e.g "usr/lib /usr/local/lib". The options --with-raja-libs and --raja-blas-lib-dirs must be used together.]), [for raja_lib_dir in $withval; do HYPRE_RAJA_LIB_DIR="-L$raja_lib_dir $HYPRE_RAJA_LIB_DIR" done; hypre_user_chose_raja=yes] ) dnl ***** Kokkos AC_ARG_WITH(kokkos, AS_HELP_STRING([--with-kokkos], [Use Kokkos. Require kokkos package to be compiled properly(default is NO).]), [case "$withval" in yes) hypre_using_kokkos=yes ;; no) hypre_using_kokkos=no ;; *) hypre_using_kokkos=no ;; esac], [hypre_using_kokkos=no] ) AC_ARG_WITH(kokkos-include, AS_HELP_STRING([--with-kokkos-include=DIR], [User specifies that KOKKOS headers is in DIR. The options --with-kokkos-include --with-kokkos-libs and --with-kokkos-dirs must be used together.]), [for kokkos_dir in $withval; do HYPRE_KOKKOS_INCLUDE="-I$kokkos_dir $HYPRE_KOKKOS_INCLUDE" done; hypre_user_chose_kokkos=yes] ) AC_ARG_WITH(kokkos-lib, AS_HELP_STRING([--with-kokkos-lib=LIBS], [LIBS is space-separated linkable list (enclosed in quotes) of libraries needed for KOKKOS. OK to use -L and -l flags in the list]), [for kokkos_lib in $withval; do HYPRE_KOKKOS_LIB="$kokkos_lib $HYPRE_KOKKOS_LIB" done; hypre_user_chose_kokkos=yes] ) AC_ARG_WITH(kokkos-libs, AS_HELP_STRING([--with-kokkos-libs=LIBS], [LIBS is space-separated list (enclosed in quotes) of libraries needed for KOKKOS (base name only). The options --with-kokkos-libs and --with-kokkos-dirs must be used together.]), [for kokkos_lib in $withval; do HYPRE_KOKKOS_LIB="-l$kokkos_lib $HYPRE_KOKKOS_LIB" done; hypre_user_chose_kokkos=yes] ) AC_ARG_WITH(kokkos-lib-dirs, AS_HELP_STRING([--with-kokkos-lib-dirs=DIRS], [DIRS is space-separated list (enclosed in quotes) of directories containing the libraries and Makefile.kokkos is assumed to be in DIRS/../ . The options --with-kokkos-libs and --with-kokkos-dirs must be used together.]), [for kokkos_lib_dir in $withval; do HYPRE_KOKKOS_LIB_DIR="-L$kokkos_lib_dir $HYPRE_KOKKOS_LIB_DIR" done; hypre_user_chose_kokkos=yes] ) dnl **** Umpire AC_ARG_WITH(umpire-host, AS_HELP_STRING([--with-umpire-host], [Use Umpire Allocator for host memory (default is NO).]), [case "${withval}" in yes) hypre_using_umpire_host=yes ;; no) hypre_using_umpire_host=no ;; *) hypre_using_umpire_host=no ;; esac], [hypre_using_umpire_host=no] ) AC_ARG_WITH(umpire-device, AS_HELP_STRING([--with-umpire-device], [Use Umpire Allocator for device memory (default is NO).]), [case "${withval}" in yes) hypre_using_umpire_device=yes ;; no) hypre_using_umpire_device=no ;; *) hypre_using_umpire_device=no ;; esac], [hypre_using_umpire_device=no] ) AC_ARG_WITH(umpire-um, AS_HELP_STRING([--with-umpire-um], [Use Umpire Allocator for unified memory (default is NO).]), [case "${withval}" in yes) hypre_using_umpire_um=yes ;; no) hypre_using_umpire_um=no ;; *) hypre_using_umpire_um=no ;; esac], [hypre_using_umpire_um=no] ) AC_ARG_WITH(umpire-pinned, AS_HELP_STRING([--with-umpire-pinned], [Use Umpire Allocator for pinned memory (default is NO).]), [case "${withval}" in yes) hypre_using_umpire_pinned=yes ;; no) hypre_using_umpire_pinned=no ;; *) hypre_using_umpire_pinned=no ;; esac], [hypre_using_umpire_pinned=no] ) dnl the default setting with Umpire, for device and um AC_ARG_WITH(umpire, AS_HELP_STRING([--with-umpire], [Use Umpire Allocator for device and unified memory (default is NO).]), [case "${withval}" in yes) hypre_using_umpire_device=yes hypre_using_umpire_um=yes ;; no) ;; *) ;; esac], [] ) AC_ARG_WITH(umpire-include, AS_HELP_STRING([--with-umpire-include=DIR], [User specifies that UMPIRE headers is in DIR. The options --with-umpire-include --with-umpire-libs and --with-umpire-dirs must be used together.]), [for umpire_dir in $withval; do HYPRE_UMPIRE_INCLUDE="-I$umpire_dir $HYPRE_UMPIRE_INCLUDE" done; ] ) AC_ARG_WITH(umpire-lib, AS_HELP_STRING([--with-umpire-lib=LIBS], [LIBS is space-separated linkable list (enclosed in quotes) of libraries needed for UMPIRE. OK to use -L and -l flags in the list]), [for umpire_lib in $withval; do HYPRE_UMPIRE_LIB="$umpire_lib $HYPRE_UMPIRE_LIB" done; ] ) AC_ARG_WITH(umpire-libs, AS_HELP_STRING([--with-umpire-libs=LIBS], [LIBS is space-separated list (enclosed in quotes) of libraries needed for UMPIRE (base name only). The options --with-umpire-libs and --with-umpire-dirs must be used together.]), [for umpire_lib in $withval; do HYPRE_UMPIRE_LIB="-l$umpire_lib $HYPRE_UMPIRE_LIB" done; ] ) AC_ARG_WITH(umpire-lib-dirs, AS_HELP_STRING([--with-umpire-lib-dirs=DIRS], [DIRS is space-separated list (enclosed in quotes) of directories containing the libraries specified by --with-umpire-libs, e.g "usr/lib /usr/local/lib". The options --with-umpire-libs and --with-umpire-dirs must be used together.]), [for umpire_lib_dir in $withval; do HYPRE_UMPIRE_LIB_DIR="-L$umpire_lib_dir $HYPRE_UMPIRE_LIB_DIR" done; ] ) dnl ***** MAGMA AC_ARG_WITH(magma, AS_HELP_STRING([--with-magma], [Use MAGMA (Matrix Algebra for GPUs and Multicore Architectures).]), [case "${withval}" in yes) hypre_using_magma=yes;; no) hypre_using_magma=no ;; *) hypre_using_magma=no ;; esac], [hypre_using_magma=no] ) AS_IF([test "x$with_magma" = "xyes"], [AC_DEFINE(HYPRE_USING_MAGMA, 1, [Define to 1 if MAGMA is enabled])], []) AC_ARG_WITH(magma-include, AS_HELP_STRING([--with-magma-include=DIR], [User specifies that MAGMA headers are in DIR. The options --with-magma-include --with-magma-libs and --with-magma-dirs must be used together.]), [for magma_dir in $withval; do HYPRE_MAGMA_INCLUDE="-I$magma_dir $HYPRE_MAGMA_INCLUDE" done; hypre_user_gave_magma_inc=yes] ) AC_ARG_WITH(magma-lib, AS_HELP_STRING([--with-magma-lib=LIBS], [LIBS is space-separated linkable list (enclosed in quotes) of libraries needed for MAGMA. OK to use -L and -l flags in the list]), [for magma_lib in $withval; do HYPRE_MAGMA_LIB="$magma_lib $HYPRE_MAGMA_LIB" done; hypre_user_gave_magma_lib=yes] ) AC_ARG_WITH(magma-libs, AS_HELP_STRING([--with-magma-libs=LIBS], [LIBS is space-separated list (enclosed in quotes) of libraries needed for MAGMA (base name only). The options --with-magma-libs and --with-magma-lib-dirs must be used together.]), [for magma_lib in $withval; do HYPRE_MAGMA_LIB="-l$magma_lib $HYPRE_MAGMA_LIB" done; hypre_user_gave_magma_libs=yes] ) AC_ARG_WITH(magma-lib-dirs, AS_HELP_STRING([--with-magma-lib-dirs=DIRS], [DIRS is space-separated list (enclosed in quotes) of directories containing the libraries specified by --with-magma-libs, e.g "usr/lib /usr/local/lib". The options --with-magma-libs and --with-magma-lib-dirs must be used together.]), [for magma_lib_dir in $withval; do HYPRE_MAGMA_LIB_DIR="-L$magma_lib_dir $HYPRE_MAGMA_LIB_DIR" done; hypre_user_gave_magma_lib_dirs=yes] ) dnl ***** Caliper AC_ARG_WITH(caliper, AS_HELP_STRING([--with-caliper], [Use Caliper instrumentation (default is NO).]), [case "$withval" in yes) hypre_using_caliper=yes;; *) hypre_using_caliper=no ;; esac], [hypre_using_caliper=no]) AS_IF([test "x$with_caliper" = "xyes"], [AC_DEFINE(HYPRE_USING_CALIPER, 1, [Define to 1 if Caliper instrumentation is enabled])], []) AC_ARG_WITH(caliper-include, AS_HELP_STRING([--with-caliper-include=DIR], [Directory where Caliper is installed.]), [for caliper_inc_dir in $withval; do CALIPER_INCLUDE="-I$caliper_inc_dir $CALIPER_INCLUDE" done; hypre_user_gave_caliper_inc=yes] ) AC_ARG_WITH(caliper-lib, AS_HELP_STRING([--with-caliper-lib=LIBS], [LIBS is space-separated linkable list (enclosed in quotes) of libraries needed for Caliper. OK to use -L and -l flags in the list]), [for caliper_lib in $withval; do CALIPER_LIBS="$CALIPER_LIBS $caliper_lib" done; hypre_user_gave_caliper_lib=yes] ) dnl ********************************************************************* dnl * Select compilers if not already defined by command line options dnl ********************************************************************* if test "$hypre_user_chose_ccompilers" = "no" then if test "$hypre_using_mpi" = "no" then if test "$hypre_using_openmp" = "yes" then AC_CHECK_PROGS(CC, [xlc_r xlC_r xlc xlC icx icc icpc icpx gcc g++ pgcc pgCC cc CC kcc KCC]) else AC_CHECK_PROGS(CC, [xlc xlC icx icc icpc icpx gcc g++ pgcc pgCC cc CC kcc KCC]) fi else if test "$hypre_using_openmp" = "yes" then AC_CHECK_PROGS(CC, [mpxlc mpixlc_r mpixlc mpiicx mpiicc mpigcc mpipgcc mpipgicc mpicc]) else AC_CHECK_PROGS(CC, [mpxlc mpixlc mpiicx mpiicc mpigcc mpipgcc mpipgicc mpicc]) fi fi if test "x$CC" = "x" then hypre_using_c=no fi fi if test "$hypre_user_chose_cxxcompilers" = "no" then if test "$hypre_using_mpi" = "no" then if test "$hypre_using_openmp" = "yes" then AC_CHECK_PROGS(CXX, [xlC_r xlc_r xlC xlc icpx icx icpc icc g++ gcc pgCC pgcc pgc++ CC cc KCC kcc]) else AC_CHECK_PROGS(CXX, [xlC xlc icpx icx icpc icc g++ gcc pgCC pgcc pgc++ CC cc KCC kcc]) fi else if test "$hypre_using_openmp" = "yes" then AC_CHECK_PROGS(CXX, [CC mpxlC mpixlcxx_r mpixlcxx mpixlC mpiicpx mpiicpc mpig++ mpic++ mpicxx mpiCC mpipgCC mpipgic++]) else AC_CHECK_PROGS(CXX, [CC mpxlC mpixlcxx mpixlC mpiicpx mpiicpc mpig++ mpic++ mpicxx mpiCC mpipgCC mpipgic++]) fi fi if test "x$CXX" = "x" then hypre_using_cxx=no fi fi if test "$hypre_using_fortran" = "yes" -a "$hypre_user_chose_fcompilers" = "no" then if test "$hypre_using_mpi" = "no" then if test "$hypre_using_openmp" = "yes" then AC_CHECK_PROGS(FC, [xlf_r ifx ifort gfortran g77 g95 pgf77 pgfortran f77]) else AC_CHECK_PROGS(FC, [xlf ifx ifort gfortran g77 g95 pgf77 pgfortran f77]) fi else if test "$hypre_using_openmp" = "yes" then AC_CHECK_PROGS(FC, [mpxlf mpixlf77_r mpiifx mpiifort mpif77 mpipgf77 mpipgifort]) else AC_CHECK_PROGS(FC, [mpxlf mpixlf77 mpiifx mpiifort mpif77 mpipgf77 mpipgifort]) fi fi if test "x$FC" = "x" then hypre_using_fortran=no fi fi if [test "x$hypre_using_cuda" = "xyes" && test "x$hypre_using_device_openmp" = "xyes"] then AC_MSG_ERROR([--with-cuda and --with-device-openmp are mutually exclusive]) fi if [test "x$hypre_using_cuda" = "xyes" && test "x$hypre_using_hip" = "xyes"] then AC_MSG_ERROR([--with-cuda and --with-hip are mutually exclusive]) fi if [test "x$hypre_using_cuda" = "xyes" && test "x$hypre_using_sycl" = "xyes"] then AC_MSG_ERROR([--with-cuda and --with-sycl are mutually exclusive]) fi if [test "x$hypre_using_hip" = "xyes" && test "x$hypre_using_device_openmp" = "xyes"] then AC_MSG_ERROR([--with-hip and --with-device-openmp are mutually exclusive]) fi if [test "x$hypre_using_hip" = "xyes" && test "x$hypre_using_sycl" = "xyes"] then AC_MSG_ERROR([--with-hip and --with-sycl are mutually exclusive]) fi if [test "x$hypre_using_sycl" = "xyes" && test "x$hypre_using_device_openmp" = "xyes"] then AC_MSG_ERROR([--with-sycl and --with-device-openmp are mutually exclusive]) fi if test "$hypre_user_chose_cudacompilers" = "no" then if test "$hypre_using_device_openmp" = "yes" then if test "x$hypre_using_kokkos" = "xyes" then if test "$hypre_using_mpi" = "no" then AC_CHECK_PROGS(CUCC, [clang++-gpu icpx]) else AC_CHECK_PROGS(CUCC, [mpiclang++-gpu mpiicpx]) fi else if test "$hypre_using_mpi" = "no" then AC_CHECK_PROGS(CUCC, [xlc-gpu clang-gpu icx]) else AC_CHECK_PROGS(CUCC, [mpixlc-gpu mpiclang-gpu mpiicx]) fi fi fi if test "$hypre_using_cuda" = "yes" then AC_CHECK_PROGS(CUCC, nvcc, [""], ["${CUDA_HOME}/bin"]) CUCC="\${HYPRE_CUDA_PATH}/bin/${CUCC} -ccbin=\${CXX}" fi if test "$hypre_using_hip" = "yes" then AC_CHECK_PROGS(CUCC, hipcc) fi if test "$hypre_using_sycl" = "yes" then AC_CHECK_PROGS(CUCC, icpx) fi fi dnl ********************************************************************* dnl * Check for general programs dnl ********************************************************************* AC_PROG_MAKE_SET AC_PROG_RANLIB dnl AC_PROG_INSTALL dnl AC_PROG_AWK dnl AC_PROG_LN_S dnl ********************************************************************* dnl * Check for compiler related programs dnl * Most of these AC_PROG_ macros check to see if the compilers works. dnl ********************************************************************* if test "$hypre_using_c" = "yes" then AC_PROG_CC fi if test "$hypre_using_cxx" = "yes" then AC_PROG_CXX fi if test "$hypre_using_fortran" = "yes" then AC_PROG_FC AC_FC_WRAPPERS fi dnl ********************************************************************* dnl * For MPI, set the following: dnl ********************************************************************* if test "$hypre_using_mpi" = "no" then AC_DEFINE(HYPRE_SEQUENTIAL, 1, [Disable MPI, enable serial codes.]) else AC_HYPRE_CHECK_MPI([LIBS="$LIBS $MPILIBS"]) AC_CHECK_FUNCS([MPI_Comm_f2c]) AC_CACHE_CHECK([whether MPI_Comm_f2c is a macro], hypre_cv_func_MPI_Comm_f2c_macro, [AC_EGREP_CPP([mpi_header_defines_MPI_Comm_f2c], [ #include #ifdef MPI_Comm_f2c mpi_header_defines_MPI_Comm_f2c #endif], hypre_cv_func_MPI_Comm_f2c_macro=yes, hypre_cv_func_MPI_Comm_f2c_macro=no)]) if test $ac_cv_func_MPI_Comm_f2c = yes \ || test $hypre_cv_func_MPI_Comm_f2c_macro = yes; then AC_DEFINE(HYPRE_HAVE_MPI_COMM_F2C,1,[Define to 1 if the routine MPI_Comm_f2c is found]) fi fi if test "$hypre_using_node_aware_mpi" = "yes" then AC_DEFINE(HYPRE_USING_NODE_AWARE_MPI, 1, [Define to 1 if Node Aware MPI library is used]) fi if test "$hypre_using_memory_tracker" = "yes" then AC_DEFINE(HYPRE_USING_MEMORY_TRACKER, 1, [Define to 1 if want to track memory operations in hypre]) fi if test "$hypre_test_using_host" = "yes" then AC_DEFINE(HYPRE_TEST_USING_HOST, 1, [Define to 1 if want to use host in hypre tests]) fi dnl ********************************************************************* dnl * Define appropriate variables if user set blas to either essl or dxml dnl ********************************************************************* if test "$hypre_user_chose_blas" = "yes" then for blas_lib in $BLASLIBS; do if test $blas_lib = "-ldxml" then AC_DEFINE(HYPRE_USING_DXML, 1, [Using DXML for BLAS]) fi if test $blas_lib = "-lessl" then AC_DEFINE(HYPRE_USING_ESSL, 1, [Using ESSL for BLAS]) fi done fi dnl ********************************************************************* dnl * Find BLAS library if not already set by the user dnl * If user specified --without-blas or a system one cannot be found, dnl * default to internal HYPRE routines dnl ********************************************************************* if test "$hypre_user_chose_blas" = "no" then hypre_using_hypre_blas=yes if test "$hypre_using_fortran" = "yes" then AC_HYPRE_FIND_BLAS if test "$BLASLIBS" = "null" then AC_MSG_WARN([***************************************]) AC_MSG_WARN([Cannot find BLAS library]) AC_MSG_WARN([ configuring --without-blas]) AC_MSG_WARN([***************************************]) elif test "$BLASLIBS" != "internal" then hypre_using_hypre_blas=no fi fi if test "$hypre_using_hypre_blas" = "yes" then BLASLIBDIRS="" BLASLIBS="" AC_DEFINE(HYPRE_USING_HYPRE_BLAS, 1, [Using internal HYPRE routines]) fi fi dnl ********************************************************************* dnl * Define appropriate variables if user set lapack to essl dnl ********************************************************************* if test "$hypre_user_chose_lapack" = "yes" then for lapack_lib in $LAPACKLIBS; do if test $lapack_lib = "-lessl" then AC_DEFINE(HYPRE_USING_ESSL, 1, [Using ESSL for Lapack]) fi done fi dnl ********************************************************************* dnl * Find LAPACK library if not already set by the user dnl * If user specified --without-lapack or a system one cannot be found, dnl * default to internal HYPRE routines dnl ********************************************************************* if test "$hypre_user_chose_lapack" = "no" then hypre_using_hypre_lapack=yes if test "$hypre_using_fortran" = "yes" then AC_HYPRE_FIND_LAPACK if test "$LAPACKLIBS" = "null" then AC_MSG_WARN([***************************************]) AC_MSG_WARN([Cannot find LAPACK library]) AC_MSG_WARN([ configuring --without-lapack]) AC_MSG_WARN([***************************************]) elif test "$LAPACKLIBS" != "internal" then hypre_using_hypre_lapack=no fi fi if test "$hypre_using_hypre_lapack" = "yes" then LAPACKLIBDIRS="" LAPACKLIBS="" AC_DEFINE(HYPRE_USING_HYPRE_LAPACK, 1, [Using internal HYPRE routines]) fi fi dnl ********************************************************************* dnl * Determine if FEI and MLI are needed. dnl * Note that MLI requires both FEI and SuperLU. dnl ********************************************************************* if test "$hypre_using_fei" = "yes" then HYPRE_FEI_SRC_DIR="$HYPRE_SRCDIR/FEI_mv" HYPRE_FEI_SUBDIRS="fei-hypre" HYPRE_FEI_HYPRE_FILES="$HYPRE_SRCDIR/FEI_mv/fei-hypre/*.o" HYPRE_FEI_FEMLI_FILES= if test "$hypre_using_mli" = "yes" then if test "$hypre_using_superlu" = "yes" then HYPRE_FEI_SUBDIRS="femli $HYPRE_FEI_SUBDIRS" HYPRE_FEI_FEMLI_FILES="$HYPRE_SRCDIR/FEI_mv/femli/*.o" AC_DEFINE(HAVE_MLI, 1, [Define to 1 if using MLI]) fi fi AC_CHECK_LIB(stdc++, __gxx_personality_v0, LIBS="$LIBS -lstdc++") else HYPRE_FEI_SRC_DIR= HYPRE_FEI_BASE_DIR= HYPRE_FEI_HYPRE_FILES= HYPRE_FEI_FEMLI_FILES= fi dnl ********************************************************************* dnl * Determine if Euclid, ParaSails, and Pilut are needed dnl ********************************************************************* if test "$hypre_using_distributed_ls" = "yes" then HYPRE_DISTRIBUTED_LS_DIR="$HYPRE_SRCDIR/distributed_ls" HYPRE_EUCLID_FILES="$HYPRE_SRCDIR/distributed_ls/Euclid/*.o" HYPRE_PARASAILS_FILES="$HYPRE_SRCDIR/distributed_ls/ParaSails/*.o" HYPRE_PILUT_FILES="$HYPRE_SRCDIR/distributed_ls/pilut/*.o" else HYPRE_DISTRIBUTED_LS_DIR= HYPRE_EUCLID_FILES= HYPRE_PARASAILS_FILES= HYPRE_PILUT_FILES= fi dnl ********************************************************************* dnl * Set debug/optimization flags dnl ********************************************************************* if test "$hypre_using_debug" = "yes" then AC_HYPRE_DEBUG_FLAGS AC_DEFINE([HYPRE_DEBUG], 1, [Define to 1 if in debug mode]) else AC_HYPRE_OPTIMIZATION_FLAGS fi CFLAGS="${CFLAGS} ${EXTRA_CFLAGS}" CXXFLAGS="${CXXFLAGS} ${EXTRA_CXXFLAGS}" dnl ********************************************************************* dnl * Set large page option that is needed by all AIX platforms. dnl ********************************************************************* hypre_platform=`uname` case $hypre_platform in AIX* | aix* | Aix*) LDFLAGS="${LDFLAGS} -blpdata" CFLAGS="${CFLAGS} -blpdata" CXXFLAGS="${CXXFLAGS} -blpdata" FFLAGS="${FFLAGS} -blpdata" ;; esac dnl ********************************************************************* dnl * Set default link commands and suffix values dnl ********************************************************************* dnl LINK_F77="${F77}" LINK_FC='${FC}' LINK_CC='${CC}' LINK_CXX='${CXX}' HYPRE_LIBSUFFIX=".a" BUILD_PYTHON=0 PYTHON="" if test "$hypre_using_python" = "yes" then BUILD_PYTHON=1 PYTHON="${hypre_python}" fi BUILD_JAVA=0 if test "$hypre_using_java" = "yes" then BUILD_JAVA=1 fi dnl ********************************************************************* dnl * FIND libraries needed to link with hypre dnl ********************************************************************* AC_CHECK_LIB(m, cabs, LIBS="$LIBS -lm") dnl * Commenting this out because it doesn't really behave correctly. dnl * This should probably be deleted altogether at some point. (RDF) dnl AC_HYPRE_FIND_G2C dnl ********************************************************************* dnl * Check working user provided blas and lapack libraries dnl ********************************************************************* if test "$hypre_user_chose_blas" = "yes"; then if test "$hypre_blas_lib_old_style" = "yes" -a "$hypre_blas_lib_dir_old_style" = "no"; then AC_MSG_ERROR([*********** Unspecified BLASLIBDIRS error: ****************************** --with-blas-libs set without setting corresponding --with-blas-lib-dirs. Please specify directory paths to preferred blas libraries. Otherwise use --with-blas to search for library on the system. See "configure --help" for usage details. ********************************************************************],[9]) fi if test "$hypre_blas_lib_old_style" = "no" -a "$hypre_blas_lib_dir_old_style" = "yes"; then AC_MSG_ERROR([*********** Unspecified BLASLIB error: ********************************** --with-blas-lib-dirs set without setting corresponding --with-blas-libs. Please specify base names of preferred blas libraries in the provided dir paths. Otherwise use --with-blas to search for library on the system. See "configure --help" for usage details. ********************************************************************],[9]) fi dnl AC_HYPRE_CHECK_USER_BLASLIBS fi if test "$hypre_user_chose_lapack" = "yes"; then if test "$hypre_lapack_lib_old_style" = "yes" -a "$hypre_lapack_lib_dir_old_style" = "no"; then AC_MSG_ERROR([*********** Unspecified LAPACKLIBDIRS error: ****************************** --with-lapack-libs set without setting corresponding --with-lapack-lib-dirs. Please specify directory paths to preferred lapack libraries. Otherwise use --with-lapack to search for library on the system. See "configure --help" for usage details. ********************************************************************],[9]) fi if test "$hypre_lapack_lib_old_style" = "no" -a "$hypre_lapack_lib_dir_old_style" = "yes"; then AC_MSG_ERROR([*********** Unspecified LAPACKLIB error: ********************************** --with-lapack-lib-dirs set without setting corresponding --with-lapack-libs. Please specify base names of preferred lapack libraries in the provided dir paths. Otherwise use --with-lapack to search for library on the system. See "configure --help" for usage details. ********************************************************************],[9]) fi dnl AC_HYPRE_CHECK_USER_LAPACKLIBS fi dnl ********************************************************************* dnl * Set flags if needed to enable shared libraries and Python, Java dnl ********************************************************************* if test "$hypre_using_shared" = "yes" then HYPRE_LIBSUFFIX=".so" SHARED_SET_SONAME="-Wl,-soname," SHARED_OPTIONS="-Wl,-z,defs" dnl if test "$hypre_using_cuda" = "yes" dnl then dnl SHARED_SET_SONAME="-Xlinker=-soname," dnl SHARED_OPTIONS="-Xlinker=-z,defs" dnl else dnl SHARED_SET_SONAME="-Wl,-soname," dnl SHARED_OPTIONS="-Wl,-z,defs" dnl fi SHARED_COMPILE_FLAG="-fPIC" case $hypre_platform in AIX* | aix* | Aix*) SHARED_COMPILE_FLAG="-qmkshrobj" SHARED_BUILD_FLAG="-G" dnl LINK_F77="${F77} -brtl" LINK_FC='${FC} -brtl' LINK_CC='${CC} -brtl' LINK_CXX='${CXX} -brtl' ;; DARWIN* | darwin* | Darwin*) SHARED_BUILD_FLAG="-dynamiclib -undefined dynamic_lookup" HYPRE_LIBSUFFIX=".dylib" SHARED_SET_SONAME="-install_name @rpath/" SHARED_OPTIONS="-undefined error" ;; *) SHARED_BUILD_FLAG="-shared" ;; esac SHARED_BUILD_FLAG="${SHARED_BUILD_FLAG} ${EXTRA_BUILDFLAGS}" FFLAGS="${FFLAGS} ${SHARED_COMPILE_FLAG}" CFLAGS="${CFLAGS} ${SHARED_COMPILE_FLAG}" CXXFLAGS="${CXXFLAGS} ${SHARED_COMPILE_FLAG}" dnl BUILD_F77_SHARED="${F77} ${SHARED_BUILD_FLAG}" BUILD_FC_SHARED="\${FC} ${SHARED_BUILD_FLAG}" if test "$hypre_using_fei" = "yes" then BUILD_CC_SHARED="\${CXX} ${SHARED_BUILD_FLAG}" else BUILD_CC_SHARED="\${CC} ${SHARED_BUILD_FLAG}" fi BUILD_CXX_SHARED="\${CXX} ${SHARED_BUILD_FLAG}" if test "$hypre_using_cuda" == "yes" || test "$hypre_using_hip" == "yes" || test "$hypre_using_kokkos" == "yes" then dnl BUILD_CC_SHARED="\${CUCC} ${SHARED_BUILD_FLAG}" BUILD_CC_SHARED="\${CXX} ${SHARED_BUILD_FLAG}" fi dnl TODO HIP fi dnl ********************************************************************* dnl * Warn if caliper options are incomplete dnl ********************************************************************* if test "$hypre_using_caliper" = "yes" then if test "$hypre_user_gave_caliper_inc" != "yes" then AC_MSG_WARN([*******************************************************]) AC_MSG_WARN([Configuring with --with-caliper=yes without providing]) AC_MSG_WARN([--with-caliper-include=.]) AC_MSG_WARN([Using default user include path.]) AC_MSG_WARN([NOTE: Caliper annotations may not work.]) AC_MSG_WARN([*******************************************************]) fi if test "$hypre_user_gave_caliper_lib" != "yes" then AC_MSG_WARN([*******************************************************]) AC_MSG_WARN([Configuring with --with-caliper=yes without providing]) AC_MSG_WARN([--with-caliper-lib=.]) AC_MSG_WARN([Using default user library path.]) AC_MSG_WARN([NOTE: Caliper annotations may not work.]) AC_MSG_WARN([*******************************************************]) fi fi dnl ********************************************************************* dnl * Warn if MAGMA options are incomplete dnl ********************************************************************* if test "x$hypre_using_magma" = "xyes" then if test "x$hypre_user_gave_magma_inc" != "xyes" then AC_MSG_WARN([*******************************************************]) AC_MSG_WARN([Configuring with --with-magma=yes without providing]) AC_MSG_WARN([--with-magma-include=.]) AC_MSG_WARN([Using default user include path.]) AC_MSG_WARN([NOTE: MAGMA may not work.]) AC_MSG_WARN([*******************************************************]) fi if [test "x$hypre_user_gave_magma_lib" != "xyes"] then AC_MSG_WARN([*******************************************************]) AC_MSG_WARN([Configuring with --with-magma=yes without providing]) AC_MSG_WARN([--with-magma-lib=.]) AC_MSG_WARN([Using default user library path.]) AC_MSG_WARN([NOTE: MAGMA may not work.]) AC_MSG_WARN([*******************************************************]) fi fi dnl ********************************************************************* dnl * Check for unified memory dnl ********************************************************************* if [test "x$hypre_using_um" = "xyes"] then if [test "x$hypre_using_cuda" != "xyes" && test "x$hypre_using_device_openmp" != "xyes" && test "x$hypre_using_hip" != "xyes" && test "x$hypre_using_sycl" != "xyes"] then AC_MSG_ERROR([Asked for unified memory, but not using CUDA, HIP, SYCL, or device OpenMP!]) fi fi dnl ********************************************************************* dnl * Check for CUDA header dnl ********************************************************************* if [test "$hypre_using_cuda" = "yes"] then AC_CHECK_HEADER(["${CUDA_HOME}/include/cuda.h"], [hypre_found_cuda=yes; HYPRE_CUDA_PATH=${CUDA_HOME}]) if test "x$hypre_found_cuda" != "xyes" then AC_CHECK_HEADER(["${CUDA_PATH}/include/cuda.h"], [hypre_found_cuda=yes; HYPRE_CUDA_PATH=${CUDA_PATH}]) fi if test "x$hypre_found_cuda" != "xyes" then AC_MSG_ERROR([unable to find cuda.h ... Ensure that CUDA_HOME or CUDA_PATH is set]) fi fi dnl ********************************************************************* dnl * Check for cuSPARSE header dnl ********************************************************************* if [test "$hypre_using_cusparse" = "yes"] then AC_CHECK_FILE([${HYPRE_CUDA_PATH}/include/cusparse.h], [hypre_found_cusparse=yes; HYPRE_VENDOR_MATH_PATH=${HYPRE_CUDA_PATH}]) if test "x$hypre_found_cusparse" != "xyes" then AC_CHECK_FILE([${HYPRE_CUDA_PATH}/../math_libs/include/cusparse.h], [hypre_found_cusparse=yes; HYPRE_VENDOR_MATH_PATH=$(readlink -f ${HYPRE_CUDA_PATH}/../math_libs); AC_MSG_NOTICE([setting vendor math path to ${HYPRE_VENDOR_MATH_PATH}])]) fi if test "x$hypre_found_cusparse" != "xyes" then AC_CHECK_FILE([${HYPRE_CUDA_PATH}/../../math_libs/include/cusparse.h], [hypre_found_cusparse=yes; HYPRE_VENDOR_MATH_PATH=$(readlink -f ${HYPRE_CUDA_PATH}/../../math_libs); AC_MSG_NOTICE([setting vendor math path to ${HYPRE_VENDOR_MATH_PATH}])]) fi if test "x$hypre_found_cusparse" != "xyes" then AC_MSG_ERROR([unable to find cusparse.h ...]) fi fi dnl ********************************************************************* dnl * Check for cuBLAS header dnl ********************************************************************* if [test "$hypre_using_cublas" = "yes"] then AC_CHECK_FILE([${HYPRE_CUDA_PATH}/include/cublas.h], [hypre_found_cublas=yes; HYPRE_VENDOR_MATH_PATH=${HYPRE_CUDA_PATH}]) if test "x$hypre_found_cublas" != "xyes" && test "x${HYPRE_VENDOR_MATH_PATH}" != "x" then AC_CHECK_FILE([${HYPRE_VENDOR_MATH_PATH}/include/cublas.h], [hypre_found_cublas=yes;]) fi if test "x$hypre_found_cublas" != "xyes" then AC_CHECK_FILE([${HYPRE_CUDA_PATH}/../math_libs/include/cublas.h], [hypre_found_cublas=yes; HYPRE_VENDOR_MATH_PATH=$(readlink -f ${HYPRE_CUDA_PATH}/../math_libs); AC_MSG_NOTICE([setting vendor math path to ${HYPRE_VENDOR_MATH_PATH}])]) fi if test "x$hypre_found_cublas" != "xyes" then AC_CHECK_FILE([${HYPRE_CUDA_PATH}/../../math_libs/include/cublas.h], [hypre_found_cublas=yes; HYPRE_VENDOR_MATH_PATH=$(readlink -f ${HYPRE_CUDA_PATH}/../../math_libs); AC_MSG_NOTICE([setting vendor math path to ${HYPRE_VENDOR_MATH_PATH}])]) fi if test "x$hypre_found_cublas" != "xyes" then AC_MSG_ERROR([unable to find cublas.h ...]) fi fi dnl ********************************************************************* dnl * Check for cuSOLVER header dnl ********************************************************************* if [test "$hypre_using_cusolver" = "yes"] then AC_CHECK_FILE([${HYPRE_CUDA_PATH}/include/cusolverDn.h], [hypre_found_cusolver=yes; HYPRE_VENDOR_MATH_PATH=${HYPRE_CUDA_PATH}]) if test "x$hypre_found_cusolver" != "xyes" && test "x${HYPRE_VENDOR_MATH_PATH}" != "x" then AC_CHECK_FILE([${HYPRE_VENDOR_MATH_PATH}/include/cusolverDn.h], [hypre_found_cusolver=yes;]) fi if test "x$hypre_found_cusolver" != "xyes" then AC_CHECK_FILE([${HYPRE_CUDA_PATH}/../math_libs/include/cusolverDn.h], [hypre_found_cusolver=yes; HYPRE_VENDOR_MATH_PATH=$(readlink -f ${HYPRE_CUDA_PATH}/../math_libs); AC_MSG_NOTICE([setting vendor math path to ${HYPRE_VENDOR_MATH_PATH}])]) fi if test "x$hypre_found_cusolver" != "xyes" then AC_CHECK_FILE([${HYPRE_CUDA_PATH}/../../math_libs/include/cusolverDn.h], [hypre_found_cusolver=yes; HYPRE_VENDOR_MATH_PATH=$(readlink -f ${HYPRE_CUDA_PATH}/../../math_libs); AC_MSG_NOTICE([setting vendor math path to ${HYPRE_VENDOR_MATH_PATH}])]) fi if test "x$hypre_found_cusolver" != "xyes" then AC_MSG_ERROR([unable to find cusolverDn.h ...]) fi fi dnl ********************************************************************* dnl * Check for HIP header dnl ********************************************************************* dnl If the user has requested to use HIP, we first check the environment dnl for ROCM_PATH to point at the ROCm installation. If that is not found, dnl then we default to `/opt/rocm`. dnl dnl TODO: Add an ARG_WITH for rocm so the user can control the ROCm path dnl through the configure line AS_IF([ test x"$hypre_using_hip" == x"yes" ], [ AS_IF([ test -n "$ROCM_PATH"], [ HYPRE_ROCM_PREFIX=$ROCM_PATH ], [ HYPRE_ROCM_PREFIX=/opt/rocm ]) AC_SUBST(HYPRE_ROCM_PREFIX) AC_CHECK_HEADER( ["${HYPRE_ROCM_PREFIX}/include/hip/hip_common.h"], [hypre_found_hip=yes], [AC_MSG_ERROR([unable to find ${HYPRE_ROCM_PREFIX}/include/hip/hip_common.h ... Ensure ROCm is installed and set ROCM_PATH environment variable to ROCm installation path.])] )], []) dnl ********************************************************************* dnl * Set raja options dnl ********************************************************************* if test "x$hypre_using_raja" = "xyes" then AC_DEFINE(HYPRE_USING_RAJA, 1, [Define to 1 if executing on host/device with RAJA]) if test "$hypre_user_chose_cxxflags" = "no" then if test "$hypre_using_cuda" != "yes" then if [test "$CXX" = "mpixlC" || test "$CXX" = "xlC_r"] then CXXFLAGS="${CXXFLAGS} -+ -std=c++${hypre_cxxstd}" fi fi fi dnl let CC be CXX CC=${CXX} LINK_CC=${LINK_CXX} CFLAGS=${CXXFLAGS} fi dnl ********************************************************************* dnl * Set kokkos options dnl ********************************************************************* if test "x$hypre_using_kokkos" = "xyes" then AC_DEFINE(HYPRE_USING_KOKKOS, 1, [Define to 1 if executing on host/device with KOKKOS]) if test "$hypre_user_chose_cxxflags" = "no" then CXXFLAGS="${CXXFLAGS} -std=c++${hypre_cxxstd}" if [test "$CXX" = "mpiclang++" || test "$CXX" = "mpiclang++-gpu" || test "$CXX" = "clang++" || test "$CXX" = "clang++-gpu" || test "$CXX" = "icpx" || test "$CXX" = "mpiicpx"] then CXXFLAGS="${CXXFLAGS} -x c++" fi if [test "$CXX" = "mpixlC" || test "$CXX" = "mpixlC-gpu" || test "$CXX" = "xlC" || test "$CXX" = "xlC-gpu"] then CXXFLAGS="${CXXFLAGS} -+" fi fi dnl let CC be CXX dnl CC=${CXX} LINK_CC=${LINK_CXX} dnl CFLAGS=${CXXFLAGS} fi dnl ********************************************************************* dnl * Set umpire options dnl ********************************************************************* if test "x$hypre_using_umpire_host" = "xyes" then hypre_using_umpire=yes AC_DEFINE(HYPRE_USING_UMPIRE_HOST, 1, [Define to 1 if using UMPIRE for host memory]) fi if test "x$hypre_using_umpire_device" = "xyes" then hypre_using_umpire=yes AC_DEFINE(HYPRE_USING_UMPIRE_DEVICE, 1, [Define to 1 if using UMPIRE for device memory]) fi if test "x$hypre_using_umpire_um" = "xyes" then hypre_using_umpire=yes AC_DEFINE(HYPRE_USING_UMPIRE_UM, 1, [Define to 1 if using UMPIRE for unified memory]) fi if test "x$hypre_using_umpire_pinned" = "xyes" then hypre_using_umpire=yes AC_DEFINE(HYPRE_USING_UMPIRE_PINNED, 1, [Define to 1 if using UMPIRE for pinned memory]) fi if test "x$hypre_using_umpire" = "xyes" then AC_DEFINE(HYPRE_USING_UMPIRE, 1, [Define to 1 if using UMPIRE]) fi dnl ********************************************************************* dnl * Set CUDA options dnl ********************************************************************* if test "$hypre_using_cuda" = "yes" then AC_DEFINE(HYPRE_USING_GPU, 1, [Define to 1 if executing on GPU device]) AC_DEFINE(HYPRE_USING_CUDA, 1, [Define to 1 if executing on device with CUDA]) LINK_CC=${LINK_CXX} dnl LINK_CC='${CUCC}' dnl LINK_CXX='${CUCC}' dnl CUDA SM if test "x$HYPRE_CUDA_SM" = "x" then HYPRE_CUDA_SM=70 fi HYPRE_CUDA_GENCODE="" for sm in ${HYPRE_CUDA_SM}; do HYPRE_CUDA_GENCODE="${HYPRE_CUDA_GENCODE}-gencode arch=compute_${sm},code=sm_${sm} " done if test "$hypre_user_chose_cuflags" = "no" then CUFLAGS="-lineinfo -expt-extended-lambda -std=c++${hypre_cxxstd} --x cu" if test "$hypre_using_debug" = "yes" then CUFLAGS="-g -O0 ${CUFLAGS}" else CUFLAGS="-O2 ${CUFLAGS}" fi dnl if [test "${CXX}" = "mpixlC" || test "${CXX}" = "xlC_r" || test "${CXX}" = "xlC"] dnl then dnl CUFLAGS="${CUFLAGS} -Xcompiler \"-Wno-deprecated-register -Wenum-compare\"" dnl fi CUFLAGS="${CUFLAGS} -Xcompiler \"${CXXFLAGS}\"" fi dnl if test "$hypre_using_shared" = "yes" dnl then dnl CUFLAGS="${CUFLAGS} -Xcompiler ${SHARED_COMPILE_FLAG}" dnl fi dnl CFLAGS=${CXXFLAGS} dnl LDFLAGS="-Xcompiler \"${LDFLAGS}\"" HYPRE_CUDA_INCLUDE='-I${HYPRE_CUDA_PATH}/include' HYPRE_CUDA_LIBS='-L${HYPRE_CUDA_PATH}/lib64 -lcudart' AS_IF([test x"$hypre_using_cusparse" == x"yes" || test x"$hypre_using_cublas" == x"yes" || test x"$hypre_using_cusolver" == x"yes"], [AS_IF([test "x$HYPRE_CUDA_PATH" != "x$HYPRE_VENDOR_MATH_PATH"], [HYPRE_CUDA_INCLUDE+=" -I${HYPRE_VENDOR_MATH_PATH}/include" HYPRE_CUDA_LIBS+=" -L${HYPRE_VENDOR_MATH_PATH}/lib64"])]) if test "$hypre_using_gpu_profiling" = "yes" then AC_DEFINE(HYPRE_USING_NVTX, 1, [Define to 1 if using NVIDIA Tools Extension (NVTX)]) HYPRE_CUDA_LIBS+=" -lnvToolsExt" fi if test "$hypre_using_cusparse" = "yes" then AC_DEFINE(HYPRE_USING_CUSPARSE, 1, [Define to 1 if using cuSPARSE]) HYPRE_CUDA_LIBS+=" -lcusparse" fi if test "$hypre_using_cublas" = "yes" then AC_DEFINE(HYPRE_USING_CUBLAS, 1, [Define to 1 if using cuBLAS]) HYPRE_CUDA_LIBS+=" -lcublas" fi if test "$hypre_using_curand" = "yes" then AC_DEFINE(HYPRE_USING_CURAND, 1, [Define to 1 if using cuRAND]) HYPRE_CUDA_LIBS+=" -lcurand" fi if test "$hypre_using_cusolver" = "yes" then AC_DEFINE(HYPRE_USING_CUSOLVER, 1, [Define to 1 if using cuSOLVER]) HYPRE_CUDA_LIBS+=" -lcusolver" fi if test "$hypre_using_device_pool" = "yes" then AC_DEFINE(HYPRE_USING_DEVICE_POOL, 1, [Define to 1 if using device pooling allocator]) fi if test "$hypre_using_device_malloc_async" = "yes" then AC_DEFINE(HYPRE_USING_DEVICE_MALLOC_ASYNC, 1, [Define to 1 if using device async malloc]) fi if test "$hypre_using_thrust_nosync" = "yes" then AC_DEFINE(HYPRE_USING_THRUST_NOSYNC, 1, [Define to 1 if using thrust par_nosync policy]) fi if test "x$hypre_using_cuda_streams" = "xyes" then AC_DEFINE([HYPRE_USING_CUDA_STREAMS], 1, [Define to 1 if using streams]) fi fi dnl ********************************************************************* dnl * Set HIP options dnl ********************************************************************* AS_IF([test x"$hypre_using_hip" == x"yes"], [ AC_DEFINE(HYPRE_USING_GPU, 1, [Define to 1 if executing on GPU device]) AC_DEFINE(HYPRE_USING_HIP, 1, [HIP being used]) dnl hipcc is just a perl script that wraps things like detection dnl of the AMD GPU and the actual invocation of the clang compiler dnl from ROCm that supports HIP and all the command line foo needed dnl by the compiler. You can force hipcc to emit what it actually does dnl by setting HIPCC_VERBOSE=7 in your environment. dnl AC_CHECK_PROGS(HIPCC, hipcc) dnl (Ab)Using CUCC when compiling HIP dnl At this time, we need the linker to be hipcc in order to link dnl in device code. LINK_CC=${LINK_CXX} dnl LINK_CC='${CUCC}' dnl LINK_CXX='${CUCC}' if test "x${HYPRE_CUDA_SM}" != "x" then HYPRE_CUDA_GENCODE="--offload-arch=" for sm in ${HYPRE_CUDA_SM}; do HYPRE_CUDA_GENCODE="${HYPRE_CUDA_GENCODE}${sm}," done HYPRE_CUDA_GENCODE="`echo ${HYPRE_CUDA_GENCODE}|sed 's/,$//'`" fi dnl The "-x hip" is necessary to override the detection of .c files which clang dnl interprets as C and therefore invokes the C compiler rather than the HIP part dnl of clang. Put HIPCXXFLAGS at the end so the user can override from dnl from the configure line. HIPCXXFLAGS="-x hip -std=c++14 ${HIPCXXFLAGS}" dnl If not in debug mode, at least -O2, but the user can override with dnl with HIPCXXFLAGS on the configure line. If in debug mode, -O0 -Wall dnl plus flags for debugging symbols AS_IF([test x"$hypre_using_debug" == x"yes"], [HIPCXXFLAGS="-O1 -Wall -g -ggdb ${HIPCXXFLAGS}"], [HIPCXXFLAGS="-O2 ${HIPCXXFLAGS}"],) dnl If we're doing a shared build, we need the compile flag for it dnl Note we're not just using CXXFLAGS here because that can suck other dnl things that don't play nice, like openmp. if test "$hypre_using_shared" = "yes" then HIPCXXFLAGS="${SHARED_COMPILE_FLAG} ${HIPCXXFLAGS}" fi dnl (Ab)Use CUFLAGS to capture HIP compilation flags dnl Put HIPCXXFLAGS at the end so the user can override the optimization level. if test "$hypre_user_chose_cuflags" = "no" then CUFLAGS="${HIPCPPFLAGS} ${HIPCXXFLAGS}" fi dnl PB: ROCm 5.2 parked all the headers in /opt/rocm-X.Y/include so we just point there. dnl This is backwards compatible to previous ROCm versions. dnl These are header-only so no linking needed. HYPRE_HIP_INCL="-I${HYPRE_ROCM_PREFIX}/include" dnl HIP library HYPRE_HIP_LIBS="-L${HYPRE_ROCM_PREFIX}/lib -lamdhip64" dnl rocSPARSE, for things like dcsrmv on AMD GPUs AS_IF([test x"$hypre_using_rocsparse" == x"yes"], [AC_DEFINE(HYPRE_USING_ROCSPARSE, 1, [rocSPARSE being used]) HYPRE_HIP_LIBS+=" -lrocsparse" ]) dnl rocBLAS: basic linear algebra operations on AMD GPUs AS_IF([test x"$hypre_using_rocblas" == x"yes"], [AC_DEFINE(HYPRE_USING_ROCBLAS, 1, [rocBLAS being used]) HYPRE_HIP_LIBS+=" -lrocblas" ]) dnl rocSOLVER: dense linear solvers on AMD GPUs (requires rocBLAS) AS_IF([test x"$hypre_using_rocsolver" == x"yes"], [AC_DEFINE(HYPRE_USING_ROCSOLVER, 1, [rocSOLVER being used]) HYPRE_HIP_LIBS+=" -lrocsolver" ]) dnl rocRAND: random number generation on AMD GPUs AS_IF([test x"$hypre_using_rocrand" == x"yes"], [AC_DEFINE(HYPRE_USING_ROCRAND, 1, [rocRAND being used]) HYPRE_HIP_LIBS+=" -lrocrand" ]) dnl rocTX tracing API AS_IF([test x"$hypre_using_gpu_profiling" == x"yes"], [AC_DEFINE(HYPRE_USING_ROCTX, 1, [Define to 1 if using AMD rocTX profiling]) HYPRE_HIP_LIBS+=" -lroctx64" ]) AS_IF([test x"$hypre_using_cuda_streams" == x"yes"], [AC_DEFINE(HYPRE_USING_CUDA_STREAMS, 1, [Define to 1 if using streams]) ]) ]) dnl AS_IF([test x"$hypre_using_hip" == x"yes"] dnl ********************************************************************* dnl * Set SYCL options dnl ********************************************************************* AS_IF([test x"$hypre_using_sycl" == x"yes"], [ AC_DEFINE(HYPRE_USING_GPU, 1, [Define to 1 if executing on GPU device]) AC_DEFINE(HYPRE_USING_SYCL, 1, [SYCL being used]) dnl (Ab)Using CUCC when compiling SYCL LINK_CC=${CUCC} LINK_CXX=${CUCC} SYCLFLAGS="-fsycl -fsycl-unnamed-lambda" if test "$hypre_using_debug" = "yes" then dnl WM: remove the -g flag for debug mode because it currently causes errors on JLSE SYCLFLAGS="-Wall ${SYCLFLAGS}" else SYCLFLAGS="-O3 ${SYCLFLAGS}" fi LDFLAGS+=" -fsycl -fsycl-device-code-split=per_kernel -Wl,--no-relax" dnl AOT compilation for specific devices if test "x${HYPRE_SYCL_TARGET}" != "x" then LDFLAGS+=" -fsycl-targets=${HYPRE_SYCL_TARGET}" fi if test "x${HYPRE_SYCL_TARGET_BACKEND}" != "x" then LDFLAGS+=" -Xsycl-target-backend ${HYPRE_SYCL_TARGET_BACKEND}" fi dnl Shared build needs the sycl compiler if test "$hypre_using_shared" = "yes" then SYCLFLAGS="${SHARED_COMPILE_FLAG} ${SYCLFLAGS}" BUILD_CC_SHARED="\${CUCC} ${SHARED_BUILD_FLAG}" fi dnl (Ab)Use CUFLAGS to capture SYCL compilation flags if test "$hypre_user_chose_cuflags" = "no" then CUFLAGS="${SYCLFLAGS}" fi AS_IF([test x"$hypre_using_onemklsparse" == x"yes" || test x"$hypre_using_onemklblas" == x"yes" || test x"$hypre_using_onemklrand" == x"yes"], [AC_CHECK_HEADER(["${MKLROOT}/include/mkl.h"], [hypre_found_mkl=yes], AC_MSG_ERROR([unable to find oneMKL ... Ensure that MKLROOT is set])) HYPRE_SYCL_LIBS="${HYPRE_SYCL_LIBS} -qmkl -Wl,-export-dynamic -Wl,--start-group -Wl,--end-group -lsycl -lOpenCL -lpthread -lm -ldl" HYPRE_SYCL_INCL="${HYPRE_SYCL_INCL} -qmkl -I${DPLROOT}/include -DMKL_ILP64 -I${MKLROOT}/include" ]) AS_IF([test x"$hypre_using_onemklsparse" == x"yes"], [AC_DEFINE(HYPRE_USING_ONEMKLSPARSE, 1, [onemkl::SPARSE being used])]) AS_IF([test x"$hypre_using_onemklblas" == x"yes"], [AC_DEFINE(HYPRE_USING_ONEMKLBLAS, 1, [onemkl::BLAS being used])]) AS_IF([test x"$hypre_using_onemklrand" == x"yes"], [AC_DEFINE(HYPRE_USING_ONEMKLRAND, 1, [onemkl::rng being used])]) dnl SYCL should always use streams AC_DEFINE(HYPRE_USING_CUDA_STREAMS, 1, [Define to 1 if using streams]) ]) dnl AS_IF([test x"$hypre_using_sycl" == x"yes"] dnl ********************************************************************* dnl * Set unified memory options dnl ********************************************************************* if test "$hypre_using_um" != "yes" then dnl Without UM if test "$hypre_using_cuda" = "yes" then AC_MSG_NOTICE([***********************************************************************]) AC_MSG_NOTICE([Configuring with --with-cuda=yes without unified memory.]) AC_MSG_NOTICE([It only works for structured solvers and selected unstructured solvers]) AC_MSG_NOTICE([Use --enable-unified-memory to compile with unified memory.]) AC_MSG_NOTICE([***********************************************************************]) fi if test "$hypre_using_hip" = "yes" then AC_MSG_NOTICE([***********************************************************************]) AC_MSG_NOTICE([Configuring with --with-hip=yes without unified memory.]) AC_MSG_NOTICE([It only works for structured solvers and selected unstructured solvers]) AC_MSG_NOTICE([Use --enable-unified-memory to compile with unified memory.]) AC_MSG_NOTICE([***********************************************************************]) fi if test "$hypre_using_sycl" = "yes" then AC_MSG_NOTICE([***********************************************************]) AC_MSG_NOTICE([Configuring with --with-sycl=yes without unified memory.]) AC_MSG_NOTICE([It only works for struct interface.]) AC_MSG_NOTICE([Use --enable-unified-memory to compile with unified memory.]) AC_MSG_NOTICE([***********************************************************]) fi if test "$hypre_using_device_openmp" = "yes" then AC_MSG_NOTICE([***********************************************************************]) AC_MSG_NOTICE([Configuring with --with-device-openmp=yes without unified memory.]) AC_MSG_NOTICE([It only works for structured solvers and selected unstructured solvers]) AC_MSG_NOTICE([Use --enable-unified-memory to compile with unified memory.]) AC_MSG_NOTICE([***********************************************************************]) fi fi dnl ********************************************************************* dnl * Set OpenMP options dnl ********************************************************************* if test "$hypre_using_openmp" = "yes" then AC_DEFINE([HYPRE_USING_OPENMP],1,[Enable OpenMP support]) fi dnl ********************************************************************* dnl * Set Device OpenMP options dnl ********************************************************************* if test "$hypre_using_device_openmp" = "yes" then AC_DEFINE(HYPRE_USING_DEVICE_OPENMP, 1, [Define to 1 if executing on device with OpenMP]) AC_DEFINE(HYPRE_DEVICE_OPENMP_ALLOC, 1, [Define to 1 if using OpenMP on device [target alloc version]]) dnl AC_DEFINE(HYPRE_DEVICE_OPENMP_MAPPED, 1, [Define to 1 if using OpenMP on device [target mapped version]]) if test "$hypre_user_chose_cuflags" = "no" then CUFLAGS="${CXXFLAGS} ${CUFLAGS}" dnl if [test "$CUCC" = "clang-gpu" || test "$CUCC" = "mpiclang-gpu" || test "$CUCC" = "clang++-gpu" || test "$CUCC" = "mpiclang++-gpu"] dnl then # dnl this is too old #CUFLAGS+=" -fopenmp-nonaliased-maps" dnl fi if [test "$CUCC" = "icx" || test "$CUCC" = "icpx" || test "$CUCC" = "mpiicx" || test "$CUCC" = "mpiicpx"] then CUFLAGS+="-qopenmp -fopenmp-targets=spir64" fi fi if test "$hypre_user_chose_ldflags" = "no" then if [test "$CUCC" = "icx" || test "$CUCC" = "icpx" || test "$CUCC" = "mpiicx" || test "$CUCC" = "mpiicpx"] then LDFLAGS+="-qopenmp -fopenmp-targets=spir64" fi fi if test "$hypre_using_debug" = "yes" then AC_DEFINE(HYPRE_DEVICE_OPENMP_CHECK, 1, [Define to 1 if strictly checking OpenMP offload directives]) fi dnl let CC be CXX dnl CC=${CXX} LINK_CC='${CUCC}' LINK_CXX='${CUCC}' dnl CXXFLAGS="-x c++ ${CXXFLAGS}" dnl CFLAGS=${CXXFLAGS} fi dnl ********************************************************************* dnl * Set memory env dnl ********************************************************************* if test "x$hypre_using_um" = "xyes" then AC_DEFINE([HYPRE_USING_UNIFIED_MEMORY],1,[Define to 1 if using unified memory]) else if [test "x$hypre_using_cuda" = "xyes" || test "x$hypre_using_device_openmp" = "xyes" || test "x$hypre_using_hip" = "xyes" || test "x$hypre_using_sycl" = "xyes"] then AC_DEFINE([HYPRE_USING_DEVICE_MEMORY],1,[Define to 1 if using device memory without UM]) else AC_DEFINE([HYPRE_USING_HOST_MEMORY],1,[Define to 1 if using host memory only]) fi fi if test "$hypre_gpu_mpi" = "yes" then AC_DEFINE([HYPRE_USING_GPU_AWARE_MPI],1,[Define to 1 if using GPU aware MPI]) fi CUFLAGS="${CUFLAGS} ${EXTRA_CUFLAGS}" dnl ********************************************************************* dnl * Set installation directories dnl ********************************************************************* HYPRE_INSTALLDIR="${prefix}" HYPRE_LIBINSTALL="${libdir}" HYPRE_INCINSTALL="${includedir}" dnl ********************************************************************* dnl * Define machine architecture dnl ********************************************************************* AC_HYPRE_SET_ARCH dnl ********************************************************************* dnl * AC_SUBST performs the variable substitutions so they may be used in dnl * the Makefile.in files. Some macros call AC_SUBST for some of these dnl * variables, but it does no damage to call it again. dnl ********************************************************************* dnl ********************************************************************* dnl * compilers and load flags dnl ********************************************************************* AC_SUBST(CC) AC_SUBST(CXX) dnl AC_SUBST(F77) AC_SUBST(FC) AC_SUBST(CFLAGS) AC_SUBST(CXXFLAGS) dnl AC_SUBST(F77FLAGS) AC_SUBST(FCFLAGS) AC_SUBST(FFLAGS) AC_SUBST(LDFLAGS) dnl AC_SUBST(LINK_F77) AC_SUBST(LINK_FC) AC_SUBST(LINK_CC) AC_SUBST(LINK_CXX) dnl AC_SUBST(BUILD_F77_SHARED) AC_SUBST(BUILD_FC_SHARED) AC_SUBST(BUILD_CC_SHARED) AC_SUBST(BUILD_CXX_SHARED) AC_SUBST(SHARED_COMPILE_FLAG) AC_SUBST(SHARED_BUILD_FLAG) AC_SUBST(SHARED_SET_SONAME) AC_SUBST(SHARED_OPTIONS) AC_SUBST(BUILD_PYTHON) AC_SUBST(PYTHON) AC_SUBST(BUILD_JAVA) dnl ********************************************************************* dnl * Installation Directories dnl ********************************************************************* AC_SUBST(HYPRE_INSTALLDIR) AC_SUBST(HYPRE_LIBINSTALL) AC_SUBST(HYPRE_INCINSTALL) dnl ********************************************************************* dnl * General purpose header files, libraries and directories dnl ********************************************************************* AC_SUBST(LIBS) AC_SUBST(FLIBS) AC_SUBST(FCLIBS) dnl ********************************************************************* dnl * suffix for hypre libraries dnl ********************************************************************* AC_SUBST(HYPRE_LIBSUFFIX) dnl ********************************************************************* dnl * MPI-related header files and libraries and directories for dnl * those libraries dnl ********************************************************************* AC_SUBST(MPIINCLUDE) AC_SUBST(MPILIBS) AC_SUBST(MPILIBDIRS) AC_SUBST(MPIFLAGS) dnl ********************************************************************* dnl * distributed_ls related files, libraries and directories dnl ********************************************************************* AC_SUBST(HYPRE_DISTRIBUTED_LS_DIR) AC_SUBST(HYPRE_EUCLID_FILES) AC_SUBST(HYPRE_PARASAILS_FILES) AC_SUBST(HYPRE_PILUT_FILES) dnl ********************************************************************* dnl * Node_Aware_MPI dnl ********************************************************************* AC_SUBST(HYPRE_NAP_INCLUDE) dnl ********************************************************************* dnl * FEI-related files, libraries and directories dnl ********************************************************************* AC_SUBST(HYPRE_FEI_SRC_DIR) AC_SUBST(HYPRE_FEI_BASE_DIR) AC_SUBST(HYPRE_FEI_SUBDIRS) AC_SUBST(HYPRE_FEI_HYPRE_FILES) AC_SUBST(HYPRE_FEI_FEMLI_FILES) dnl ********************************************************************* dnl * BLAS & LAPACK related information dnl ********************************************************************* AC_SUBST(BLASLIBDIRS) AC_SUBST(BLASLIBS) AC_SUBST(LAPACKLIBDIRS) AC_SUBST(LAPACKLIBS) dnl ********************************************************************* dnl * RAJA information dnl ********************************************************************* AC_SUBST(HYPRE_RAJA_LIB_DIR) AC_SUBST(HYPRE_RAJA_INCLUDE) AC_SUBST(HYPRE_RAJA_LIB) dnl ********************************************************************* dnl * KOKKOS information dnl ********************************************************************* AC_SUBST(HYPRE_KOKKOS_SRC_DIR) AC_SUBST(HYPRE_KOKKOS_LIB_DIR) AC_SUBST(HYPRE_KOKKOS_INCLUDE) AC_SUBST(HYPRE_KOKKOS_LIB) dnl ********************************************************************* dnl * UMPIRE information dnl ********************************************************************* AC_SUBST(HYPRE_UMPIRE_LIB_DIR) AC_SUBST(HYPRE_UMPIRE_INCLUDE) AC_SUBST(HYPRE_UMPIRE_LIB) dnl ********************************************************************* dnl * CUDA stuff dnl ********************************************************************* AC_SUBST(CUFLAGS) AC_SUBST(CUCC) AC_SUBST(HYPRE_CUDA_GENCODE) AC_SUBST(HYPRE_CUDA_PATH) AC_SUBST(HYPRE_CUDA_INCLUDE) AC_SUBST(HYPRE_CUDA_LIBS) dnl ********************************************************************* dnl * HIP stuff dnl ********************************************************************* AC_SUBST(HYPRE_HIP_INCL) AC_SUBST(HYPRE_HIP_LIBS) dnl ********************************************************************* dnl * SYCL stuff dnl ********************************************************************* AC_SUBST(HYPRE_SYCL_INCL) AC_SUBST(HYPRE_SYCL_LIBS) dnl ********************************************************************* dnl * Caliper instrumentation dnl ********************************************************************* AC_SUBST(CALIPER_INCLUDE) AC_SUBST(CALIPER_LIBS) dnl ********************************************************************* dnl * MAGMA dnl ********************************************************************* AC_SUBST(HYPRE_MAGMA_LIB_DIR) AC_SUBST(HYPRE_MAGMA_INCLUDE) AC_SUBST(HYPRE_MAGMA_LIB) dnl ********************************************************************* dnl * SuperLU dnl ********************************************************************* AC_SUBST(SUPERLU_INCLUDE) AC_SUBST(SUPERLU_LIBS) dnl ********************************************************************* dnl * DSuperLU dnl ********************************************************************* AC_SUBST(DSUPERLU_INCLUDE) AC_SUBST(DSUPERLU_LIBS) dnl ********************************************************************* dnl * ar & ranlib substitution dnl ********************************************************************* AC_SUBST(AR) AC_SUBST(RANLIB) dnl ********************************************************************* dnl * Define the files to be configured and made dnl ********************************************************************* AC_CONFIG_FILES([config/Makefile.config]) AC_OUTPUT hypre-2.33.0/src/config/githooks/000077500000000000000000000000001477326011500166175ustar00rootroot00000000000000hypre-2.33.0/src/config/githooks/README.md000066400000000000000000000011341477326011500200750ustar00rootroot00000000000000 This directory contains recommended git hooks for hypre: ### The hooks (currently only one) * `pre-commit` is a hook that is applied before each commit that runs `astyle` to format code according to hypre coding style guidelines. ### Setup To setup the git hooks, copy the hooks to the `.git/hooks` directory (or create a symbolic link to them, e.g., `ln -s ../../src/config/githooks/pre-commit .`). hypre-2.33.0/src/config/githooks/pre-commit000077500000000000000000000004621477326011500206230ustar00rootroot00000000000000#!/bin/bash # Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) # Apply code formatting ( cd $(git rev-parse --show-toplevel)/src; ./config/astyle-apply.sh . ) hypre-2.33.0/src/config/hypre_blas_macros.m4000066400000000000000000000270541477326011500207360ustar00rootroot00000000000000dnl Copyright (c) 1998 Lawrence Livermore National Security, LLC and other dnl HYPRE Project Developers. See the top-level COPYRIGHT file for details. dnl dnl SPDX-License-Identifier: (Apache-2.0 OR MIT) dnl @synopsis AC_HYPRE_FIND_BLAS([ACTION-IF-FOUND[, ACTION-IF-NOT-FOUND]]) dnl dnl This macro looks for a library that implements the BLAS dnl linear-algebra interface (see http://www.netlib.org/blas/). dnl On success, it sets the BLASLIBS output variable to dnl hold the requisite library linkages. dnl dnl To link with BLAS, you should link with: dnl dnl $BLASLIBS $LIBS $FCLIBS dnl dnl in that order. FCLIBS is the output variable of the dnl AC_FC_LIBRARY_LDFLAGS macro, and is sometimes necessary in order to link dnl with fortran libraries. dnl dnl Many libraries are searched for, from ATLAS to CXML to ESSL. dnl The user may specify a BLAS library by using the --with-blas-libs= dnl and --with-blas-lib-dirs= options. In order to link successfully, dnl however, be aware that you will probably need to use the same Fortran dnl compiler (which can be set via the FC env. var.) as was used to compile dnl the BLAS library. dnl dnl ACTION-IF-FOUND is a list of shell commands to run if a BLAS dnl library is found, and ACTION-IF-NOT-FOUND is a list of commands dnl to run it if it is not found. dnl dnl This macro requires autoconf 2.50 or later. dnl dnl @version $Id$ dnl @author Steven G. Johnson AC_DEFUN([AC_HYPRE_FIND_BLAS], [ AC_REQUIRE([AC_FC_LIBRARY_LDFLAGS]) #*************************************************************** # Initialize return variables #*************************************************************** BLASLIBS="null" BLASLIBDIRS="null" AC_ARG_WITH(blas, [AS_HELP_STRING([--with-blas], [Find a system-provided BLAS library])]) case $with_blas in yes) ;; *) BLASLIBS="internal" ;; esac #*************************************************************** # Save incoming LIBS and LDFLAGS values to be restored #*************************************************************** hypre_save_LIBS="$LIBS" hypre_save_LDFLGS="$LDFLAGS" LIBS="$LIBS $FLIBS" #*************************************************************** # Set possible BLAS library names #*************************************************************** BLAS_LIB_NAMES="blas essl dxml cxml mkl scs atlas complib.sgimath sunmath" #*************************************************************** # Set search paths for BLAS library #*************************************************************** temp_FLAGS="-L/usr/lib -L/usr/local/lib -L/lib -L/opt/intel/mkl70/lib/32" LDFLAGS="$temp_FLAGS $LDFLAGS" #*************************************************************** # Check for function dgemm in BLAS_LIB_NAMES #*************************************************************** if test "$BLASLIBS" = "null"; then AC_FC_FUNC(dgemm) for lib in $BLAS_LIB_NAMES; do AC_CHECK_LIB($lib, $dgemm, [BLASLIBS=$lib]) done fi #*************************************************************** # Set path to selected BLAS library #*************************************************************** BLAS_SEARCH_DIRS="/usr/lib /usr/local/lib /lib" if test "$BLASLIBS" != "null"; then for dir in $BLAS_SEARCH_DIRS; do if test "$BLASLIBDIRS" = "null" -a -f $dir/lib$BLASLIBS.a; then BLASLIBDIRS=$dir fi if test "$BLASLIBDIRS" = "null" -a -f $dir/lib$BLASLIBS.so; then BLASLIBDIRS=$dir fi done fi #*************************************************************** # Set variables if ATLAS or DXML libraries are used #*************************************************************** if test "$BLASLIBS" = "dxml"; then AC_DEFINE(HYPRE_USING_DXML, 1, [Using dxml for Blas]) fi if test "$BLASLIBS" = "essl"; then AC_DEFINE(HYPRE_USING_ESSL, 1, [Using essl for Blas]) fi #*************************************************************** # Add -L and -l prefixes if values found #*************************************************************** if test "$BLASLIBS" != "null" -a "$BLASLIBS" != "internal"; then BLASLIBS="-l$BLASLIBS" fi if test "$BLASLIBDIRS" != "null"; then BLASLIBDIRS="-L$BLASLIBDIRS" fi #*************************************************************** # Restore incoming LIBS and LDFLAGS values #*************************************************************** LIBS="$hypre_save_LIBS" LDFLAGS="$hypre_save_LDFLGS" ])dnl AC_HYPRE_FIND_BLAS dnl @synopsis AC_HYPRE_CHECK_USER_BLASLIBS dnl dnl This macro checks that the user-provided blas library is dnl linkable. Configure fails with an error message if this dnl check fails. dnl dnl To link with BLAS, you should link with: dnl dnl $BLASLIBS $LIBS $FCLIBS dnl dnl in that order. FCLIBS is the output variable of the dnl AC_FC_LIBRARY_LDFLAGS macro, and is sometimes necessary in order to link dnl with Fortran libraries. dnl dnl The user may specify a BLAS library by using the --with-blas-lib=, or dnl --with-blas-libs= and --with-blas-lib-dirs= options. In order to link successfully, dnl however, be aware that you will probably need to use the same Fortran dnl compiler (which can be set via the FC env. var.) as was used to compile dnl the BLAS library. dnl dnl @author Daniel Osei-Kuffuor AC_DEFUN([AC_HYPRE_CHECK_USER_BLASLIBS], [ AC_REQUIRE([AC_FC_LIBRARY_LDFLAGS]) dnl ************************************************************** dnl Define some variables dnl ************************************************************** hypre_blas_link_ok="" dnl ************************************************************** dnl Get fortran linker name for test function (dgemm in this case) dnl ************************************************************** dnl AC_FC_FUNC(dgemm) if test $hypre_fmangle_blas = 1 then BLASFUNC="dgemm" elif test $hypre_fmangle_blas = 2 then BLASFUNC="dgemm_" elif test $hypre_fmangle_blas = 3 then BLASFUNC="dgemm__" elif test $hypre_fmangle_blas = 4 then BLASFUNC="DGEMM" else BLASFUNC="dgemm dgemm_ dgemm__ DGEMM" hypre_fmangle_blas=0 fi dnl ************************************************************** dnl Get user provided path-to-blas library dnl ************************************************************** dnl LDBLASLIBDIRS="$BLASLIBDIRS" USERBLASLIBS="$BLASLIBS" USERBLASLIBDIRS="$BLASLIBDIRS" BLASLIBPATHS="$BLASLIBDIRS" BLASLIBNAMES="" SUFFIXES="" dnl Case where explicit path could be given by the user for blas_lib in $BLASLIBS; do [blas_lib_name=${blas_lib##*-l}] if test $blas_lib = $blas_lib_name; then dnl if test -f $blas_lib; dnl then dnl [libsuffix=${blas_lib##*.}] dnl SUFFIXES="$SUFFIXES $libsuffix" dnl [dir_path=${blas_lib%/*}] dnl BLASLIBPATHS="-L$dir_path $BLASLIBPATHS" dnl [blas_lib_name=${blas_lib_name%%.*}] dnl [blas_lib_name=${blas_lib_name##*/}] dnl [blas_lib_name=${blas_lib_name#*lib}] dnl BLASLIBNAMES="$BLASLIBNAMES $blas_lib_name" dnl else dnl AC_MSG_ERROR([**************** Invalid path to blas library error: *************************** dnl User set BLAS library path using either --with-blas-lib=, or dnl --with-blas-libs= and --with-blas_dirs=, dnl but the path " $blas_lib " dnl in the user-provided path for --with-blas-libs does not exist. Please dnl check that the provided path is correct. dnl *****************************************************************************************],[9]) dnl fi [libsuffix=${blas_lib##*.}] SUFFIXES="$SUFFIXES $libsuffix" if test "$libsuffix" = "a" -o "$libsuffix" = "so" ; then dnl if test -f $blas_lib; dnl then [dir_path=${blas_lib#*/}] [dir_path=${blas_lib%/*}] BLASLIBPATHS="$BLASLIBPATHS -L/$dir_path" [blas_lib_name=${blas_lib_name%.*}] [blas_lib_name=${blas_lib_name##*/}] [blas_lib_name=${blas_lib_name#*lib}] BLASLIBNAMES="$BLASLIBNAMES $blas_lib_name" dnl else dnl AC_MSG_ERROR([**************** Invalid path to blas library error: *************************** dnl User set BLAS library path using either --with-blas-lib=, or dnl --with-blas-libs= and --with-blas_dirs=, dnl but the path " $blas_lib " dnl in the user-provided path for --with-blas-libs does not exist. Please dnl check that the provided path is correct. dnl *****************************************************************************************],[9]) dnl fi else BLASLIBPATHS="$dir_path $BLASLIBPATHS" fi else BLASLIBNAMES="$BLASLIBNAMES $blas_lib_name" fi done dnl ************************************************************** dnl Save current LIBS and LDFLAGS to be restored later dnl ************************************************************** hypre_saved_LIBS="$LIBS" hypre_saved_LDFLAGS="$LDFLAGS" LIBS="$LIBS $FCLIBS" LDFLAGS="$BLASLIBPATHS $LDFLAGS" dnl echo LDFLAGS=$LDFLAGS dnl echo LIBS=$LIBS dnl echo BLASLIBPATHS=$BLASLIBPATHS dnl ************************************************************** dnl Check for dgemm in linkable list of libraries dnl ************************************************************** if test "x$BLASLIBNAMES" != "x"; then hypre_blas_link_ok=no fi for blas_lib in $BLASLIBNAMES; do dnl ************************************************************** dnl Check if library works and print result dnl ************************************************************** for func in $BLASFUNC; do AC_CHECK_LIB($blas_lib, $func, [hypre_blas_link_ok=yes]) if test "$hypre_blas_link_ok" = "yes"; then break 2 fi done done if test "$hypre_blas_link_ok" = "no"; then AC_MSG_ERROR([**************** Non-linkable blas library error: *************************** User set BLAS library path using either --with-blas-lib=, or --with-blas-libs= and --with-blas_dirs=, but $USERBLASLIBDIRS $USERBLASLIBS provided cannot be used. See "configure --help" for usage details. *****************************************************************************************],[9]) fi dnl ************************************************************** dnl set HYPRE_FMANGLE_BLAS flag if not set dnl ************************************************************** if test "$hypre_blas_link_ok" = "yes" -a "$hypre_fmangle_blas" = "0" then if test "$func" = "dgemm" then hypre_fmangle_blas=1 elif test "$func" = "dgemm_" then hypre_fmangle_blas=2 elif test "$func" = "dgemm__" then hypre_fmangle_blas=3 else hypre_fmangle_blas=4 fi AC_DEFINE_UNQUOTED(HYPRE_FMANGLE_BLAS, [$hypre_fmangle_blas], [Define as in HYPRE_FMANGLE to set the BLAS name mangling scheme]) fi dnl ************************************************************** dnl Restore LIBS and LDFLAGS dnl ************************************************************** LIBS="$hypre_saved_LIBS" LDFLAGS="$hypre_saved_LDFLAGS" dnl fi ]) dnl Done with macro AC_HYPRE_CHECK_USER_BLASLIBS hypre-2.33.0/src/config/hypre_lapack_macros.m4000066400000000000000000000254511477326011500212470ustar00rootroot00000000000000dnl Copyright (c) 1998 Lawrence Livermore National Security, LLC and other dnl HYPRE Project Developers. See the top-level COPYRIGHT file for details. dnl dnl SPDX-License-Identifier: (Apache-2.0 OR MIT) dnl @synopsis AC_HYPRE_FIND_LAPACK([ACTION-IF-FOUND[, ACTION-IF-NOT-FOUND]]) dnl dnl This macro looks for a library that implements the LAPACK dnl linear-algebra interface (see http://www.netlib.org/lapack/). dnl On success, it sets the LAPACKLIBS output variable to dnl hold the requisite library linkages. dnl dnl To link with LAPACK, you should link with: dnl dnl $LAPACKLIBS $BLASLIBS $LIBS $FCLIBS dnl dnl in that order. BLASLIBS is either the output variable of the HYPRE_FIND_BLAS dnl macro (which is called by configure before this macro) or the user-defined dnl blas library. FCLIBS is the output variable of the AC_FC_LIBRARY_LDFLAGS dnl macro, which is sometimes necessary in order to link with Fortran libraries. dnl dnl The user may use --with-lapack-libs= and --with-lapack-lib-dirs= dnl in order to use a specific LAPACK library . In order to link successfully, dnl however, be aware that you will probably need to use the same Fortran compiler dnl (which can be set via the FC env. var.) as was used to compile the LAPACK and dnl BLAS libraries. dnl dnl ACTION-IF-FOUND is a list of shell commands to run if a LAPACK dnl library is found, and ACTION-IF-NOT-FOUND is a list of commands dnl to run it if it is not found. dnl dnl @version $Id$ dnl @author Steven G. Johnson AC_DEFUN([AC_HYPRE_FIND_LAPACK], [ AC_REQUIRE([AC_FC_LIBRARY_LDFLAGS]) #*************************************************************** # Initialize return variables #*************************************************************** LAPACKLIBS="null" LAPACKLIBDIRS="null" AC_ARG_WITH(lapack, [AS_HELP_STRING([--with-lapack], [Find a system-provided LAPACK library])]) case $with_lapack in yes) ;; *) LAPACKLIBS="internal" ;; esac #*************************************************************** # Save incoming LIBS and LDFLAGS values to be restored #*************************************************************** hypre_save_LIBS="$LIBS" hypre_save_LDFLGS="$LDFLAGS" LIBS="$LIBS $FCLIBS" #*************************************************************** # Set possible LAPACK library names #*************************************************************** LAPACK_LIB_NAMES="lapack lapack_rs6k" #*************************************************************** # Set search paths for LAPACK library #*************************************************************** temp_FLAGS="-L/usr/lib -L/usr/local/lib -L/lib" LDFLAGS="$temp_FLAGS $LDFLAGS" #*************************************************************** # Check for function dsygv in LAPACK_LIB_NAMES #*************************************************************** if test "$LAPACKLIBS" = "null"; then AC_FC_FUNC(dsygv) for lib in $LAPACK_LIB_NAMES; do AC_CHECK_LIB($lib, $dsygv, [LAPACKLIBS=$lib], [], [-lblas]) done fi #*************************************************************** # Set path to selected LAPACK library #*************************************************************** LAPACK_SEARCH_DIRS="/usr/lib /usr/local/lib /lib" if test "$LAPACKLIBS" != "null"; then for dir in $LAPACK_SEARCH_DIRS; do if test "$LAPACKLIBDIRS" = "null" -a -f $dir/lib$LAPACKLIBS.a; then LAPACKLIBDIRS=$dir fi if test "$LAPACKLIBDIRS" = "null" -a -f $dir/lib$LAPACKLIBS.so; then LAPACKLIBDIRS=$dir fi done fi #*************************************************************** # Add -L and -l prefixes if values found #*************************************************************** if test "$LAPACKLIBS" != "null" -a "$LAPACKLIBS" != "internal"; then LAPACKLIBS="-l$LAPACKLIBS" fi if test "$LAPACKLIBDIRS" != "null"; then LAPACKLIBDIRS="-L$LAPACKLIBDIRS" fi #*************************************************************** # Restore incoming LIBS and LDFLAGS values #*************************************************************** LIBS="$hypre_save_LIBS" LDFLAGS="$hypre_save_LDFLGS" ])dnl AC_HYPRE_FIND_LAPACK dnl @synopsis AC_HYPRE_CHECK_USER_LAPACKLIBS dnl dnl This macro checks that the user-provided blas library is dnl linkable. Configure fails with an error message if this dnl check fails. dnl dnl To link with LAPACK, you should link with: dnl dnl $LAPACKLIBS $BLASLIBS $LIBS $FCLIBS dnl dnl in that order. FCLIBS is the output variable of the dnl AC_FC_LIBRARY_LDFLAGS macro, and is sometimes necessary in order to link dnl with Fortran libraries. dnl dnl The user may specify a BLAS library by using the --with-lapack-lib=, or dnl --with-lapack-libs= and --with-lapack-lib-dirs= options. In order to link successfully, dnl however, be aware that you will probably need to use the same Fortran dnl compiler (which can be set via the FC env. var.) as was used to compile dnl the BLAS library. dnl dnl @author Daniel Osei-Kuffuor AC_DEFUN([AC_HYPRE_CHECK_USER_LAPACKLIBS], [ AC_REQUIRE([AC_FC_LIBRARY_LDFLAGS]) dnl ************************************************************** dnl Define some variables dnl ************************************************************** hypre_lapack_link_ok="" dnl ************************************************************** dnl Get fortran linker name for test function (dsygv in this case) dnl ************************************************************** dnl AC_FC_FUNC(dsygv) if test $hypre_fmangle_lapack = 1 then LAPACKFUNC="dsygv" elif test $hypre_fmangle_lapack = 2 then LAPACKFUNC="dsygv_" elif test $hypre_fmangle_lapack = 3 then LAPACKFUNC="dsygv__" elif test $hypre_fmangle_lapack = 4 then LAPACKFUNC="DSYGV" else LAPACKFUNC="dsygv dsygv_ dsygv__ DSYGV" hypre_fmangle_lapack=0 fi dnl ************************************************************** dnl Get user provided path-to-lapack library dnl ************************************************************** dnl LDLAPACKLIBDIRS="$LAPACKLIBDIRS" USERLAPACKLIBS="$LAPACKLIBS" USERLAPACKLIBDIRS="$LAPACKLIBDIRS" LAPACKLIBPATHS="" LAPACKLIBNAMES="" SUFFIXES="" dnl Case where explicit path could be given by the user for lapack_lib in $LAPACKLIBS; do [lapack_lib_name=${lapack_lib##*-l}] if test $lapack_lib = $lapack_lib_name; then dnl if test -f $lapack_lib; dnl then dnl [libsuffix=${lapack_lib##*.}] dnl SUFFIXES="$SUFFIXES $libsuffix" dnl [dir_path=${lapack_lib%/*}] dnl LAPACKLIBPATHS="-L$dir_path $LAPACKLIBPATHS" dnl [lapack_lib_name=${lapack_lib_name%%.*}] dnl [lapack_lib_name=${lapack_lib_name##*/}] dnl [lapack_lib_name=${lapack_lib_name#*lib}] dnl LAPACKLIBNAMES="$LAPACKLIBNAMES $lapack_lib_name" dnl else dnl AC_MSG_ERROR([**************** Invalid path to lapack library error: *************************** dnl User set LAPACK library path using either --with-lapack-lib=, or dnl --with-lapack-libs= and --with-lapack_dirs=, dnl but the path " $lapack_lib " dnl in the user-provided path for --with-lapack-libs does not exist. Please dnl check that the provided path is correct. dnl *****************************************************************************************],[9]) dnl fi [libsuffix=${lapack_lib##*.}] SUFFIXES="$SUFFIXES $libsuffix" if test "$libsuffix" = "a" -o "$libsuffix" = "so" ; then dnl if test -f $lapack_lib; dnl then [dir_path=${lapack_lib#*/}] [dir_path=${lapack_lib%/*}] LAPACKLIBPATHS="$LAPACKLIBPATHS -L/$dir_path" [lapack_lib_name=${lapack_lib_name%.*}] [lapack_lib_name=${lapack_lib_name##*/}] [lapack_lib_name=${lapack_lib_name#*lib}] LAPACKLIBNAMES="$LAPACKLIBNAMES $lapack_lib_name" else LAPACKLIBPATHS="$dir_path $LAPACKLIBPATHS" fi else LAPACKLIBNAMES="$LAPACKLIBNAMES $lapack_lib_name" fi done dnl ************************************************************** dnl Save current LIBS and LDFLAGS to be restored later dnl ************************************************************** hypre_saved_LIBS="$LIBS" hypre_saved_LDFLAGS="$LDFLAGS" LIBS="$LIBS $FCLIBS" LDFLAGS="$LAPACKLIBDIRS $LDFLAGS" dnl ************************************************************** dnl Check for dsygv in linkable list of libraries dnl ************************************************************** if test "x$LAPACKLIBNAMES" != "x"; then hypre_lapack_link_ok=no fi for lapack_lib in $LAPACKLIBNAMES; do dnl ************************************************************** dnl Check if library works and print result dnl ************************************************************** for func in $LAPACKFUNC; do AC_CHECK_LIB($lapack_lib, $func, [hypre_lapack_link_ok=yes],[],[-lblas]) if test "$hypre_lapack_link_ok" = "yes"; then break 2 fi done done if test "$hypre_lapack_link_ok" = "no"; then AC_MSG_ERROR([**************** Non-linkable lapack library error: *************************** User set LAPACK library path using either --with-lapack-lib=, or --with-lapack-libs= and --with-lapack_dirs=, but $USERLAPACKLIBDIRS $USERLAPACKLIBS provided cannot be used. See "configure --help" for usage details. *****************************************************************************************],[9]) fi dnl ************************************************************** dnl set HYPRE_FMANGLE_LAPACK flag if not set dnl ************************************************************** if test "$hypre_lapack_link_ok" = "yes" -a "$hypre_fmangle_lapack" = "0" then if test "$func" = "dsygv" then hypre_fmangle_lapack=1 elif test "$func" = "dsygv_" then hypre_fmangle_lapack=2 elif test "$func" = "dsygv__" then hypre_fmangle_lapack=3 else hypre_fmangle_lapack=4 fi AC_DEFINE_UNQUOTED(HYPRE_FMANGLE_LAPACK, [$hypre_fmangle_lapack], [Define as in HYPRE_FMANGLE to set the LAPACK name mangling scheme]) fi dnl ************************************************************** dnl Restore LIBS and LDFLAGS dnl ************************************************************** LIBS="$hypre_saved_LIBS" LDFLAGS="$hypre_saved_LDFLAGS" dnl fi ]) dnl Done with macro AC_HYPRE_CHECK_USER_LAPACKLIBS hypre-2.33.0/src/config/hypre_macros_misc.m4000066400000000000000000000320571477326011500207470ustar00rootroot00000000000000dnl Copyright (c) 1998 Lawrence Livermore National Security, LLC and other dnl HYPRE Project Developers. See the top-level COPYRIGHT file for details. dnl dnl SPDX-License-Identifier: (Apache-2.0 OR MIT) dnl ********************************************************************** dnl * AC_HYPRE_CHECK_MPI dnl * dnl try to determine what the MPI flags should be dnl AC_HYPRE_CHECK_MPI([ACTION-IF-FOUND[, ACTION-IF-NOT-FOUND]]) dnl ACTION-IF-FOUND is a list of shell commands to run dnl if an MPI library is found, and dnl ACTION-IF-NOT-FOUND is a list of commands to run it dnl if it is not found. If ACTION-IF-FOUND is not specified, dnl the default action will define HAVE_MPI. dnl ********************************************************************** AC_DEFUN([AC_HYPRE_CHECK_MPI], [AC_PREREQ([2.69])dnl AC_PREREQ([2.69]) dnl for AC_LANG_CASE if test x = x"$MPILIBS"; then AC_LANG_CASE([C], [AC_CHECK_FUNC(MPI_Init, [MPILIBS=" "])], [C++], [AC_CHECK_FUNC(MPI_Init, [MPILIBS=" "])], [Fortran 77], [AC_MSG_CHECKING([for MPI_Init]) AC_LINK_IFELSE([AC_LANG_PROGRAM([[]], [[ call MPI_Init]])],[MPILIBS=" " AC_MSG_RESULT(yes)],[AC_MSG_RESULT(no)])]) fi if test x = x"$MPILIBS"; then AC_CHECK_LIB(mpi, MPI_Init, [MPILIBS="-lmpi"]) fi if test x = x"$MPILIBS"; then AC_CHECK_LIB(mpich, MPI_Init, [MPILIBS="-lmpich"]) fi dnl We have to use AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[]])],[],[]) and not dnl AC_CHECK_HEADER because the latter uses $CPP, not $CC (which may be mpicc). AC_LANG_CASE([C], [if test x != x"$MPILIBS"; then AC_MSG_CHECKING([for mpi.h]) AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include ]], [[]])],[AC_MSG_RESULT(yes)],[MPILIBS="" AC_MSG_RESULT(no)]) fi], [C++], [if test x != x"$MPILIBS"; then AC_MSG_CHECKING([for mpi.h]) AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include ]], [[]])],[AC_MSG_RESULT(yes)],[MPILIBS="" AC_MSG_RESULT(no)]) fi]) AC_SUBST(MPILIBS) # Finally, execute ACTION-IF-FOUND/ACTION-IF-NOT-FOUND: if test x = x"$MPILIBS"; then $2 : else AC_DEFINE(HYPRE_HAVE_MPI,1,[Define to 1 if an MPI library is found]) $1 : fi ]) dnl ********************************************************************** dnl * AC_HYPRE_FIND_G2C dnl * try to find libg2c.a dnl ********************************************************************** AC_DEFUN([AC_HYPRE_FIND_G2C], [ dnl AC_REQUIRE([AC_FC_LIBRARY_LDFLAGS]) hypre_save_LIBS="$LIBS" LIBS="$LIBS $FLIBS" found_g2c=no dnl * This setting of LDFLAGS is not the right way to go (RDF) g2c_GCC_PATH="-L/usr/lib/gcc-lib/i386-redhat-linux/3.2.3" g2c_SEARCH_PATHS="$g2c_GCC_PATH -L/usr/lib -L/usr/local/lib -L/usr/apps/lib -L/lib" LDFLAGS="$g2c_SEARCH_PATHS $LDFLAGS" AC_CHECK_LIB(g2c, e_wsfe, [found_g2c=yes]) if test "$found_g2c" = "yes"; then LIBS="-lg2c $hypre_save_LIBS" else LIBS="$hypre_save_LIBS" fi ]) dnl ********************************************************************** dnl * AC_HYPRE_OPTIMIZATION_FLAGS dnl * dnl * Set compile FLAGS for optimization dnl ********************************************************************** AC_DEFUN([AC_HYPRE_OPTIMIZATION_FLAGS], [AC_PREREQ([2.69])dnl if test "x${hypre_user_chose_cflags}" = "xno" then case `basename ${CC}` in gcc|mpigcc|mpicc) CFLAGS="-O2" if test "$hypre_using_openmp" = "yes" ; then CFLAGS+=" -fopenmp" LDFLAGS+=" -fopenmp" fi ;; icc|mpiicc|icx|mpiicx) CFLAGS="-O2" if test "$hypre_using_openmp" = "yes" ; then CFLAGS+=" -qopenmp" LDFLAGS+=" -qopenmp" fi ;; pgcc|mpipgcc|mpipgicc) CFLAGS="-fast" if test "$hypre_using_openmp" = "yes" ; then CFLAGS+=" -mp" LDFLAGS+=" -mp" fi ;; cc|xlc|xlc_r|mpxlc|mpixlc|mpixlc_r|mpixlc-gpu|mpcc) CFLAGS="-O2" if test "$hypre_using_openmp" = "yes" ; then CFLAGS+=" -qsmp=omp" LDFLAGS+=" -qsmp=omp" fi ;; KCC|mpiKCC) CFLAGS="-fast +K3" ;; *) CFLAGS="-O" ;; esac fi if test "x${hypre_user_chose_cxxflags}" = "xno" then case `basename ${CXX}` in g++|gCC|mpig++|mpicxx|mpic++|mpiCC) CXXFLAGS="-O2" if test "$hypre_using_openmp" = "yes" ; then CXXFLAGS+=" -fopenmp" fi ;; icpc|icc|mpiicpc|mpiicc|icpx|mpiicpx) CXXFLAGS="-O2" if test "$hypre_using_openmp" = "yes" ; then CXXFLAGS+=" -qopenmp" fi ;; pgCC|mpipgCC|pgc++|mpipgic++) CXXFLAGS="-fast" if test "$hypre_using_openmp" = "yes" ; then CXXFLAGS+=" -mp" fi ;; CC|cxx|xlC|xlC_r|mpxlC|mpixlC|mpixlC-gpu|mpixlcxx|mpixlcxx_r|mpCC) CXXFLAGS="-O2" if test "$hypre_using_openmp" = "yes" ; then CXXFLAGS+=" -qsmp=omp" fi ;; KCC|mpiKCC) CXXFLAGS="-fast +K3" ;; *) CXXFLAGS="-O" ;; esac fi if test "$hypre_using_fortran" = "yes" -a "x${hypre_user_chose_fflags}" = "xno" then case `basename ${FC}` in g77|gfortran|mpigfortran|mpif77) FFLAGS="-O2" if test "$hypre_using_openmp" = "yes" ; then FFLAGS+=" -fopenmp" fi ;; ifort|mpiifort) FFLAGS="-O2" if test "$hypre_using_openmp" = "yes" ; then FFLAGS+=" -qopenmp" fi ;; pgf77|mpipgf77|pgfortran|mpipgifort) FFLAGS="-fast" if test "$hypre_using_openmp" = "yes" ; then FFLAGS+=" -mp" fi ;; f77|f90|xlf|xlf_r|mpxlf|mpixlf77|mpixlf77_r) FFLAGS="-O2" if test "$hypre_using_openmp" = "yes" ; then FFLAGS+=" -qsmp=omp" fi ;; kf77|mpikf77) FFLAGS="-fast +K3" ;; *) FFLAGS="-O" ;; esac fi]) dnl ********************************************************************** dnl * AC_HYPRE_DEBUG_FLAGS dnl * dnl * Set compile FLAGS for debug dnl ********************************************************************** AC_DEFUN([AC_HYPRE_DEBUG_FLAGS], [AC_PREREQ([2.69])dnl if test "x${hypre_user_chose_cflags}" = "xno" then case `basename ${CC}` in gcc|mpigcc|mpicc) CFLAGS="-O0 -g -Wall" if test "$hypre_using_openmp" = "yes" ; then CFLAGS+=" -fopenmp" LDFLAGS+=" -fopenmp" fi ;; icc|mpiicc|icx|mpiicx) CFLAGS="-O0 -g -Wall" if test "$hypre_using_openmp" = "yes" ; then CFLAGS+=" -qopenmp" LDFLAGS+=" -qopenmp" fi ;; pgcc|mpipgcc|mpipgicc) CFLAGS="-O0 -g -Wall" if test "$hypre_using_openmp" = "yes" ; then CFLAGS+=" -mp" LDFLAGS+=" -mp" fi ;; cc|xlc|mpxlc|mpixlc|mpcc) CFLAGS="-O0 -g -Wall" if test "$hypre_using_openmp" = "yes" ; then CFLAGS+=" -qsmp=omp" LDFLAGS+=" -qsmp=omp" fi ;; KCC|mpiKCC) CFLAGS="--c -g +K3" ;; *) CFLAGS="-g" ;; esac fi if test "x${hypre_user_chose_cxxflags}" = "xno" then case `basename ${CXX}` in g++|gCC|mpig++|mpicxx|mpic++|mpiCC) CXXFLAGS="-O0 -g -Wall" if test "$hypre_using_openmp" = "yes" ; then CXXFLAGS+=" -fopenmp" fi ;; icpc|icc|mpiicpc|mpiicc|icpx|mpiicpx) CXXFLAGS="-O0 -g -Wall" if test "$hypre_using_openmp" = "yes" ; then CXXFLAGS+=" -qopenmp" fi ;; pgCC|mpipgCC|pgc++|mpipgic++) CXXFLAGS="-O0 -g -Wall" if test "$hypre_using_openmp" = "yes" ; then CXXFLAGS+=" -mp" fi ;; CC|cxx|xlC|mpxlC|mpixlcxx|mpCC) CXXFLAGS="-O0 -g" if test "$hypre_using_openmp" = "yes" ; then CXXFLAGS+=" -qsmp=omp" fi ;; KCC|mpiKCC) CXXFLAGS="-g +K3" ;; *) CXXFLAGS="-g" ;; esac fi if test "$hypre_using_fortran" = "yes" -a "x${hypre_user_chose_fflags}" = "xno" then case `basename ${FC}` in g77|gfortran|mpigfortran|mpif77) FFLAGS="-g -Wall" if test "$hypre_using_openmp" = "yes" ; then FFLAGS="$FFLAGS -fopenmp" fi ;; ifort|mpiifort|ifx|mpiifx) FFLAGS="-g" if test "$hypre_using_openmp" = "yes" ; then FFLAGS="$FFLAGS -qopenmp" fi ;; pgf77|mpipgf77|pgfortran|mpipgifort) FFLAGS="-g" if test "$hypre_using_openmp" = "yes" ; then FFLAGS="$FFLAGS -mp" fi ;; f77|f90|xlf|mpxlf|mpixlf77) FFLAGS="-g" if test "$hypre_using_openmp" = "yes" ; then FFLAGS="$FFLAGS -qsmp=omp" fi ;; kf77|mpikf77) FFLAGS="-g +K3" ;; *) FFLAGS="-g" ;; esac fi]) dnl ********************************************************************** dnl * AC_HYPRE_SET_ARCH dnl * Defines the architecture of the platform on which the code is to run. dnl * Cross-compiling is indicated by the host and build platforms being dnl * different values, which are usually user supplied on the command line. dnl * When cross-compiling is detected the values supplied will be used dnl * directly otherwise the needed values will be determined as follows: dnl * dnl * Find the hostname and assign it to an exported macro $HOSTNAME. dnl * Guesses a one-word name for the current architecture, unless ARCH dnl * has been preset. This is an alternative to the built-in macro dnl * AC_CANONICAL_HOST, which gives a three-word name. Uses the utility dnl * 'tarch', which is a Bourne shell script that should be in the same dnl * directory as the configure script. If tarch is not present or if it dnl * fails, ARCH is set to the value, if any, of shell variable HOSTTYPE, dnl * otherwise ARCH is set to "unknown". dnl ********************************************************************** AC_DEFUN([AC_HYPRE_SET_ARCH], [ if test $host_alias = $build_alias then AC_MSG_CHECKING(the hostname) hypre_hostname=hostname HOSTNAME="`$hypre_hostname`" dnl * if $HOSTNAME is still empty, give it the value "unknown". if test -z "$HOSTNAME" then HOSTNAME=unknown AC_MSG_WARN(hostname is unknown) else AC_MSG_RESULT($HOSTNAME) fi AC_MSG_CHECKING(the architecture) dnl * the environment variable $ARCH may already be set; if so use its dnl * value, otherwise go through this procedure if test -z "$ARCH"; then dnl * search for the tool "tarch". It should be in the same dnl * directory as configure.in, but a couple of other places will dnl * be checked. hypre_tarch stores a relative path for "tarch". hypre_tarch_dir= for hypre_dir in $srcdir $srcdir/.. $srcdir/../.. $srcdir/config; do if test -f $hypre_dir/tarch; then hypre_tarch_dir=$hypre_dir hypre_tarch=$hypre_tarch_dir/tarch break fi done dnl * if tarch was not found or doesn't work, try using env variable dnl * $HOSTTYPE if test -z "$hypre_tarch_dir"; then AC_MSG_WARN(cannot find tarch, using \$HOSTTYPE as the architecture) HYPRE_ARCH=$HOSTTYPE else HYPRE_ARCH="`$hypre_tarch`" if test -z "$HYPRE_ARCH" || test "$HYPRE_ARCH" = "unknown"; then HYPRE_ARCH=$HOSTTYPE fi fi dnl * if $HYPRE_ARCH is still empty, give it the value "unknown". if test -z "$HYPRE_ARCH"; then HYPRE_ARCH=unknown AC_MSG_WARN(architecture is unknown) else AC_MSG_RESULT($HYPRE_ARCH) fi else HYPRE_ARCH=$ARCH AC_MSG_RESULT($HYPRE_ARCH) fi else HYPRE_ARCH=$host_alias HOSTNAME=unknown fi dnl * dnl * define type of architecture case $HYPRE_ARCH in alpha) AC_DEFINE(HYPRE_ALPHA,1,[Define to 1 for Alpha platforms]) ;; sun* | solaris*) AC_DEFINE(HYPRE_SOLARIS,1,[Define to 1 for Solaris.]) ;; hp* | HP*) AC_DEFINE(HYPRE_HPPA,1,[Define to 1 for HP platforms]) ;; rs6000 | RS6000 | *bgl* | *BGL* | ppc64*) AC_DEFINE(HYPRE_RS6000,1,[Define to 1 for RS6000 platforms]) ;; IRIX64) AC_DEFINE(HYPRE_IRIX64,1,[Define to 1 for IRIX64 platforms]) ;; Linux | linux | LINUX) if test -r /etc/home.config then systemtype=`grep ^SYS_TYPE /etc/home.config | cut -d" " -f2` case $systemtype in chaos*) AC_DEFINE(HYPRE_LINUX_CHAOS,1,[Define to 1 for Linux on platforms running any version of CHAOS]) ;; *) AC_DEFINE(HYPRE_LINUX,1,[Define to 1 for Linux platform]) ;; esac else AC_DEFINE(HYPRE_LINUX,1,[Define to 1 for Linux platform]) fi ;; esac dnl * dnl * return architecture and host name values AC_SUBST(HYPRE_ARCH) AC_SUBST(HOSTNAME) ])dnl hypre-2.33.0/src/config/install-sh000077500000000000000000000224431477326011500170010ustar00rootroot00000000000000#!/bin/bash # install - install a program, script, or datafile scriptversion=2004-04-01.17 # This originates from X11R5 (mit/util/scripts/install.sh), which was # later released in X11R6 (xc/config/util/install.sh) with the # following copyright and license. # # Copyright (C) 1994 X Consortium # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to # deal in the Software without restriction, including without limitation the # rights to use, copy, modify, merge, publish, distribute, sublicense, and/or # sell copies of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in # all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN # AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC- # TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # # Except as contained in this notice, the name of the X Consortium shall not # be used in advertising or otherwise to promote the sale, use or other deal- # ings in this Software without prior written authorization from the X Consor- # tium. # # # FSF changes to this file are in the public domain. # # Calling this script install-sh is preferred over install.sh, to prevent # `make' implicit rules from creating a file called install from it # when there is no Makefile. # # This script is compatible with the BSD install script, but was written # from scratch. It can only install one file at a time, a restriction # shared with many OS's install programs. # set DOITPROG to echo to test this script # Don't use :- since 4.3BSD and earlier shells don't like it. doit="${DOITPROG-}" # put in absolute paths if you don't have them in your path; or use env. vars. mvprog="${MVPROG-mv}" cpprog="${CPPROG-cp}" chmodprog="${CHMODPROG-chmod}" chownprog="${CHOWNPROG-chown}" chgrpprog="${CHGRPPROG-chgrp}" stripprog="${STRIPPROG-strip}" rmprog="${RMPROG-rm}" mkdirprog="${MKDIRPROG-mkdir}" transformbasename= transform_arg= instcmd="$mvprog" chmodcmd="$chmodprog 0755" chowncmd= chgrpcmd= stripcmd= rmcmd="$rmprog -f" mvcmd="$mvprog" src= dst= dir_arg= usage="Usage: $0 [OPTION]... SRCFILE DSTFILE or: $0 [OPTION]... SRCFILES... DIRECTORY or: $0 -d DIRECTORIES... In the first form, install SRCFILE to DSTFILE, removing SRCFILE by default. In the second, create the directory path DIR. Options: -b=TRANSFORMBASENAME -c copy source (using $cpprog) instead of moving (using $mvprog). -d create directories instead of installing files. -g GROUP $chgrp installed files to GROUP. -m MODE $chmod installed files to MODE. -o USER $chown installed files to USER. -s strip installed files (using $stripprog). -t=TRANSFORM --help display this help and exit. --version display version info and exit. Environment variables override the default commands: CHGRPPROG CHMODPROG CHOWNPROG CPPROG MKDIRPROG MVPROG RMPROG STRIPPROG " while test -n "$1"; do case $1 in -b=*) transformbasename=`echo $1 | sed 's/-b=//'` shift continue;; -c) instcmd=$cpprog shift continue;; -d) dir_arg=true shift continue;; -g) chgrpcmd="$chgrpprog $2" shift shift continue;; --help) echo "$usage"; exit 0;; -m) chmodcmd="$chmodprog $2" shift shift continue;; -o) chowncmd="$chownprog $2" shift shift continue;; -s) stripcmd=$stripprog shift continue;; -t=*) transformarg=`echo $1 | sed 's/-t=//'` shift continue;; --version) echo "$0 $scriptversion"; exit 0;; *) # When -d is used, all remaining arguments are directories to create. test -n "$dir_arg" && break # Otherwise, the last argument is the destination. Remove it from $@. for arg do if test -n "$dstarg"; then # $@ is not empty: it contains at least $arg. set fnord "$@" "$dstarg" shift # fnord fi shift # arg dstarg=$arg done break;; esac done if test -z "$1"; then if test -z "$dir_arg"; then echo "$0: no input file specified." >&2 exit 1 fi # It's OK to call `install-sh -d' without argument. # This can happen when creating conditional directories. exit 0 fi for src do # Protect names starting with `-'. case $src in -*) src=./$src ;; esac if test -n "$dir_arg"; then dst=$src src= if test -d "$dst"; then instcmd=: chmodcmd= else instcmd=$mkdirprog fi else # Waiting for this to be detected by the "$instcmd $src $dsttmp" command # might cause directories to be created, which would be especially bad # if $src (and thus $dsttmp) contains '*'. if test ! -f "$src" && test ! -d "$src"; then echo "$0: $src does not exist." >&2 exit 1 fi if test -z "$dstarg"; then echo "$0: no destination specified." >&2 exit 1 fi dst=$dstarg # Protect names starting with `-'. case $dst in -*) dst=./$dst ;; esac # If destination is a directory, append the input filename; won't work # if double slashes aren't ignored. if test -d "$dst"; then dst=$dst/`basename "$src"` fi fi # This sed command emulates the dirname command. dstdir=`echo "$dst" | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'` # Make sure that the destination directory exists. # Skip lots of stat calls in the usual case. if test ! -d "$dstdir"; then defaultIFS=' ' IFS="${IFS-$defaultIFS}" oIFS=$IFS # Some sh's can't handle IFS=/ for some reason. IFS='%' set - `echo "$dstdir" | sed -e 's@/@%@g' -e 's@^%@/@'` IFS=$oIFS pathcomp= while test $# -ne 0 ; do pathcomp=$pathcomp$1 shift if test ! -d "$pathcomp"; then $mkdirprog "$pathcomp" || lasterr=$? # mkdir can fail with a `File exist' error in case several # install-sh are creating the directory concurrently. This # is OK. test ! -d "$pathcomp" && { (exit ${lasterr-1}); exit; } fi pathcomp=$pathcomp/ done fi if test -n "$dir_arg"; then $doit $instcmd "$dst" \ && { test -z "$chowncmd" || $doit $chowncmd "$dst"; } \ && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } \ && { test -z "$stripcmd" || $doit $stripcmd "$dst"; } \ && { test -z "$chmodcmd" || $doit $chmodcmd "$dst"; } else # If we're going to rename the final executable, determine the name now. if test -z "$transformarg"; then dstfile=`basename "$dst"` else dstfile=`basename "$dst" $transformbasename \ | sed $transformarg`$transformbasename fi # don't allow the sed command to completely eliminate the filename. test -z "$dstfile" && dstfile=`basename "$dst"` # Make a couple of temp file names in the proper directory. dsttmp=$dstdir/_inst.$$_ rmtmp=$dstdir/_rm.$$_ # Trap to clean up those temp files at exit. trap 'status=$?; rm -f "$dsttmp" "$rmtmp" && exit $status' 0 trap '(exit $?); exit' 1 2 13 15 # Move or copy the file name to the temp name $doit $instcmd "$src" "$dsttmp" && # and set any options; do chmod last to preserve setuid bits. # # If any of these fail, we abort the whole thing. If we want to # ignore errors from any of these, just make sure not to ignore # errors from the above "$doit $instcmd $src $dsttmp" command. # { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } \ && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } \ && { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } \ && { test -z "$chmodcmd" || $doit $chmodcmd "$dsttmp"; } && # Now rename the file to the real destination. { $doit $mvcmd -f "$dsttmp" "$dstdir/$dstfile" 2>/dev/null \ || { # The rename failed, perhaps because mv can't rename something else # to itself, or perhaps because mv is so ancient that it does not # support -f. # Now remove or move aside any old file at destination location. # We try this two ways since rm can't unlink itself on some # systems and the destination file might be busy for other # reasons. In this case, the final cleanup might fail but the new # file should still install successfully. { if test -f "$dstdir/$dstfile"; then $doit $rmcmd -f "$dstdir/$dstfile" 2>/dev/null \ || $doit $mvcmd -f "$dstdir/$dstfile" "$rmtmp" 2>/dev/null \ || { echo "$0: cannot unlink or rename $dstdir/$dstfile" >&2 (exit 1); exit } else : fi } && # Now rename the file to the real destination. $doit $mvcmd "$dsttmp" "$dstdir/$dstfile" } } fi || { (exit 1); exit; } done # The final little trick to "correctly" pass the exit status to the exit trap. { (exit 0); exit } # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-end: "$" # End: hypre-2.33.0/src/config/mkinstalldirs000077500000000000000000000065371477326011500176110ustar00rootroot00000000000000#! /bin/bash # mkinstalldirs --- make directory hierarchy scriptversion=2004-02-15.20 # Original author: Noah Friedman # Created: 1993-05-16 # Public domain. # # This file is maintained in Automake, please report # bugs to or send patches to # . errstatus=0 dirmode="" usage="\ Usage: mkinstalldirs [-h] [--help] [--version] [-m MODE] DIR ... Create each directory DIR (with mode MODE, if specified), including all leading file name components. Report bugs to ." # process command line arguments while test $# -gt 0 ; do case $1 in -h | --help | --h*) # -h for help echo "$usage" exit 0 ;; -m) # -m PERM arg shift test $# -eq 0 && { echo "$usage" 1>&2; exit 1; } dirmode=$1 shift ;; --version) echo "$0 $scriptversion" exit 0 ;; --) # stop option processing shift break ;; -*) # unknown option echo "$usage" 1>&2 exit 1 ;; *) # first non-opt arg break ;; esac done for file do if test -d "$file"; then shift else break fi done case $# in 0) exit 0 ;; esac # Solaris 8's mkdir -p isn't thread-safe. If you mkdir -p a/b and # mkdir -p a/c at the same time, both will detect that a is missing, # one will create a, then the other will try to create a and die with # a "File exists" error. This is a problem when calling mkinstalldirs # from a parallel make. We use --version in the probe to restrict # ourselves to GNU mkdir, which is thread-safe. case $dirmode in '') if mkdir -p --version . >/dev/null 2>&1 && test ! -d ./--version; then echo "mkdir -p -- $*" exec mkdir -p -- "$@" else # On NextStep and OpenStep, the `mkdir' command does not # recognize any option. It will interpret all options as # directories to create, and then abort because `.' already # exists. test -d ./-p && rmdir ./-p test -d ./--version && rmdir ./--version fi ;; *) if mkdir -m "$dirmode" -p --version . >/dev/null 2>&1 && test ! -d ./--version; then echo "mkdir -m $dirmode -p -- $*" exec mkdir -m "$dirmode" -p -- "$@" else # Clean up after NextStep and OpenStep mkdir. for d in ./-m ./-p ./--version "./$dirmode"; do test -d $d && rmdir $d done fi ;; esac for file do set fnord `echo ":$file" | sed -ne 's/^:\//#/;s/^://;s/\// /g;s/^#/\//;p'` shift pathcomp= for d do pathcomp="$pathcomp$d" case $pathcomp in -*) pathcomp=./$pathcomp ;; esac if test ! -d "$pathcomp"; then echo "mkdir $pathcomp" mkdir "$pathcomp" || lasterr=$? if test ! -d "$pathcomp"; then errstatus=$lasterr else if test ! -z "$dirmode"; then echo "chmod $dirmode $pathcomp" lasterr="" chmod "$dirmode" "$pathcomp" || lasterr=$? if test ! -z "$lasterr"; then errstatus=$lasterr fi fi fi fi pathcomp="$pathcomp/" done done exit $errstatus # Local Variables: # mode: shell-script # sh-indentation: 2 # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-end: "$" # End: hypre-2.33.0/src/config/update-cmake.py000077500000000000000000000074331477326011500177140ustar00rootroot00000000000000# Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) import argparse import os def extract_files_from_section(input_text, section_start): files = [] collect_files = False for line in input_text.splitlines(): if line.strip().startswith(section_start): collect_files = True continue if collect_files: if line.strip() == "": break # Assuming an empty line marks the end of the section # Extract the file name, assuming no spaces in file names file_name = line.strip().split("\\")[0] # Filter only source files if file_name.endswith('.c') or file_name.endswith('.cpp'): files.append(file_name) return files def are_files_in_list(file_list_a, file_list_b): return [fn for fn in file_list_a if fn not in file_list_b] def add_missing_files(file_content, section_start, missing_files): lines = file_content.split('\n') updated_lines = [] in_section_start = -1 in_section_end = -1 # Identify the start and end of the SRCS block for i, line in enumerate(lines): trimmed_line = line.strip() if trimmed_line.startswith(section_start): in_section_start = i if in_section_start != -1 and trimmed_line.endswith(")") and in_section_end == -1: in_section_end = i break if in_section_start == -1 or in_section_end == -1: print("Error: Could not find a complete SRCS block in file B.") return file_content # Add all lines up to the end of the section, excluding the closing parenthesis updated_lines.extend(lines[:in_section_end]) # Add missing files for missing_file in missing_files: updated_lines.append(f" {missing_file}") # Add closing parenthesis updated_lines.append(lines[in_section_end]) # Add remaining lines updated_lines.extend(lines[in_section_end + 1:]) updated_content = '\n'.join(updated_lines) return updated_content def process(args, section_A, section_B): # Read file contents file_A_path = os.path.join(args.folder, "Makefile") file_B_path = os.path.join(args.folder, "CMakeLists.txt") with open(file_A_path, 'r') as file_A, open(file_B_path, 'r') as file_B: file_A_content = file_A.read() file_B_content = file_B.read() # Extract files files_A = extract_files_from_section(file_A_content, section_A) files_B = extract_files_from_section(file_B_content, section_B) if args.verbose: print(f"{files_A = }\n") print(f"{files_B = }") # Check if all files in A are in B missing = are_files_in_list(files_A, files_B) if missing: print("\nAdded to FILE B:", missing) new_file_B_content = add_missing_files(file_B_content, section_B, missing) with open(file_B_path, 'w') as file_B: file_B.write(new_file_B_content) def main(): parser = argparse.ArgumentParser(description="Check and update CMakeLists based on the contents of Makefile") parser.add_argument("-f", "--folder", required=True, help="Folder path") parser.add_argument("-v", "--verbose", action="store_true", help="Turn on verbose mode") args = parser.parse_args() # Validate folder path args.folder = os.path.normpath(args.folder) if not os.path.isdir(args.folder): print("The specified folder does not exist or is not a directory.") return # Process source files process(args, "FILES =", "set(SRCS") # Process GPU source files process(args, "CUFILES =", "set(GPU_SRCS") # Done! print(f"Done with {args.folder = }...") if __name__ == "__main__": main() hypre-2.33.0/src/config/update-cmake.sh000077500000000000000000000012561477326011500176730ustar00rootroot00000000000000#!/bin/bash # Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) # Usage: # ./update-cmake.sh # # The script checks for missing source files listed in various CMakeLists.txt # by looking at the respective Makefile. If any files are missing, they are added # to CMakeLists.txt DIRNAME=$(dirname $0) FOLDERS=(blas examples IJ_mv krylov lapack parcsr_block_mv parcsr_ls parcsr_mv seq_block_mv seq_mv sstruct_ls sstruct_mv test utilities) for FOLDER in ${FOLDERS[@]}; do python3 ${DIRNAME}/update-cmake.py -f ${DIRNAME}/../${FOLDER} done hypre-2.33.0/src/config/update.sh000077500000000000000000000041511477326011500166120ustar00rootroot00000000000000#!/bin/bash # Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) currentdir=`pwd` currentdir=`basename $currentdir` if [ "$currentdir" != "src" ]; then echo "ERROR: Run this script from the 'src' directory (i.e., 'config/update.sh')." exit fi source config/version.sh # Check that the version number is not smaller than before currentnum=`grep "HYPRE_NUMBER=" configure | cut -d= -f 2` if [ $hypre_number -lt $currentnum ]; then echo "ERROR: HYPRE version number is smaller than the current version!" exit elif [ $hypre_number -gt $currentnum ]; then echo "HYPRE version number is greater than the current version" else echo "HYPRE version number is the same as the current version" fi ##### Update release information and configure script for Linux build system # NOTE: Using '#' as delimiter in sed to allow for '/' in reldate cat config/configure.in | sed -e 's#m4_define.*HYPRE_VERS[^)]*#m4_define([M4_HYPRE_VERSION], ['$hypre_version']#' | sed -e 's#m4_define.*HYPRE_NUMB[^)]*#m4_define([M4_HYPRE_NUMBER], ['$hypre_number']#' | sed -e 's#m4_define.*HYPRE_DATE[^)]*#m4_define([M4_HYPRE_DATE], ['$hypre_reldate']#' \ > config/configure.in.tmp mv config/configure.in.tmp config/configure.in ln -s -f config/configure.in . rm -rf aclocal.m4 configure autom4te.cache autoconf --include=config autoheader configure.in rm configure.in cat >> configure < HYPRE_config.h rm -f HYPRE_config.h.tmp EOF ##### Update release information for CMake build system # NOTE: Using '#' as delimiter in sed to allow for '/' in reldate cat CMakeLists.txt | sed -e 's#set(HYPRE_VERS[^)]*#set(HYPRE_VERSION '$hypre_version'#' | sed -e 's#set(HYPRE_NUMB[^)]*#set(HYPRE_NUMBER '$hypre_number'#' | sed -e 's#set(HYPRE_DATE[^)]*#set(HYPRE_DATE '$hypre_reldate'#' \ > CMakeLists.txt.tmp mv CMakeLists.txt.tmp CMakeLists.txt ##### Update release information in documentation (cd docs; ./update-release.sh) hypre-2.33.0/src/config/version.sh000077500000000000000000000007411477326011500170160ustar00rootroot00000000000000#!/bin/bash # Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) hypre_version="2.33.0" hypre_reldate="2025/04/03" hypre_major=`echo $hypre_version | cut -d. -f 1` hypre_minor=`echo $hypre_version | cut -d. -f 2` hypre_patch=`echo $hypre_version | cut -d. -f 3` let hypre_number="$hypre_major*10000 + $hypre_minor*100 + $hypre_patch" hypre-2.33.0/src/configure000077500000000000000000012515761477326011500154530ustar00rootroot00000000000000#! /bin/sh # From configure.in Id. # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.71 for hypre 2.33.0. # # # Copyright (C) 1992-1996, 1998-2017, 2020-2021 Free Software Foundation, # Inc. # # # This configure script is free software; the Free Software Foundation # gives unlimited permission to copy, distribute and modify it. # # Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh as_nop=: if test ${ZSH_VERSION+y} && (emulate sh) >/dev/null 2>&1 then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else $as_nop case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi # Reset variables that may have inherited troublesome values from # the environment. # IFS needs to be set, to space, tab, and newline, in precisely that order. # (If _AS_PATH_WALK were called with IFS unset, it would have the # side effect of setting IFS to empty, thus disabling word splitting.) # Quoting is to prevent editors from complaining about space-tab. as_nl=' ' export as_nl IFS=" "" $as_nl" PS1='$ ' PS2='> ' PS4='+ ' # Ensure predictable behavior from utilities with locale-dependent output. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # We cannot yet rely on "unset" to work, but we need these variables # to be unset--not just set to an empty or harmless value--now, to # avoid bugs in old shells (e.g. pre-3.0 UWIN ksh). This construct # also avoids known problems related to "unset" and subshell syntax # in other old shells (e.g. bash 2.01 and pdksh 5.2.14). for as_var in BASH_ENV ENV MAIL MAILPATH CDPATH do eval test \${$as_var+y} \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done # Ensure that fds 0, 1, and 2 are open. if (exec 3>&0) 2>/dev/null; then :; else exec 0&1) 2>/dev/null; then :; else exec 1>/dev/null; fi if (exec 3>&2) ; then :; else exec 2>/dev/null; fi # The user is always right. if ${PATH_SEPARATOR+false} :; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac test -r "$as_dir$0" && as_myself=$as_dir$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then printf "%s\n" "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Use a proper internal environment variable to ensure we don't fall # into an infinite loop, continuously re-executing ourselves. if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then _as_can_reexec=no; export _as_can_reexec; # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. printf "%s\n" "$0: could not re-execute with $CONFIG_SHELL" >&2 exit 255 fi # We don't want this to propagate to other subprocesses. { _as_can_reexec=; unset _as_can_reexec;} if test "x$CONFIG_SHELL" = x; then as_bourne_compatible="as_nop=: if test \${ZSH_VERSION+y} && (emulate sh) >/dev/null 2>&1 then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which # is contrary to our usage. Disable this feature. alias -g '\${1+\"\$@\"}'='\"\$@\"' setopt NO_GLOB_SUBST else \$as_nop case \`(set -o) 2>/dev/null\` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi " as_required="as_fn_return () { (exit \$1); } as_fn_success () { as_fn_return 0; } as_fn_failure () { as_fn_return 1; } as_fn_ret_success () { return 0; } as_fn_ret_failure () { return 1; } exitcode=0 as_fn_success || { exitcode=1; echo as_fn_success failed.; } as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } if ( set x; as_fn_ret_success y && test x = \"\$1\" ) then : else \$as_nop exitcode=1; echo positional parameters were not saved. fi test x\$exitcode = x0 || exit 1 blah=\$(echo \$(echo blah)) test x\"\$blah\" = xblah || exit 1 test -x / || exit 1" as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1 test \$(( 1 + 1 )) = 2 || exit 1" if (eval "$as_required") 2>/dev/null then : as_have_required=yes else $as_nop as_have_required=no fi if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null then : else $as_nop as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_found=false for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac as_found=: case $as_dir in #( /*) for as_base in sh bash ksh sh5; do # Try only shells that exist, to save several forks. as_shell=$as_dir$as_base if { test -f "$as_shell" || test -f "$as_shell.exe"; } && as_run=a "$as_shell" -c "$as_bourne_compatible""$as_required" 2>/dev/null then : CONFIG_SHELL=$as_shell as_have_required=yes if as_run=a "$as_shell" -c "$as_bourne_compatible""$as_suggested" 2>/dev/null then : break 2 fi fi done;; esac as_found=false done IFS=$as_save_IFS if $as_found then : else $as_nop if { test -f "$SHELL" || test -f "$SHELL.exe"; } && as_run=a "$SHELL" -c "$as_bourne_compatible""$as_required" 2>/dev/null then : CONFIG_SHELL=$SHELL as_have_required=yes fi fi if test "x$CONFIG_SHELL" != x then : export CONFIG_SHELL # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. printf "%s\n" "$0: could not re-execute with $CONFIG_SHELL" >&2 exit 255 fi if test x$as_have_required = xno then : printf "%s\n" "$0: This script requires a shell more modern than all" printf "%s\n" "$0: the shells that I found on your system." if test ${ZSH_VERSION+y} ; then printf "%s\n" "$0: In particular, zsh $ZSH_VERSION has bugs and should" printf "%s\n" "$0: be upgraded to zsh 4.3.4 or later." else printf "%s\n" "$0: Please tell bug-autoconf@gnu.org about your system, $0: including any error possibly output before this $0: message. Then install a modern shell, or manually run $0: the script under such a shell if you do have one." fi exit 1 fi fi fi SHELL=${CONFIG_SHELL-/bin/sh} export SHELL # Unset more variables known to interfere with behavior of common tools. CLICOLOR_FORCE= GREP_OPTIONS= unset CLICOLOR_FORCE GREP_OPTIONS ## --------------------- ## ## M4sh Shell Functions. ## ## --------------------- ## # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_nop # --------- # Do nothing but, unlike ":", preserve the value of $?. as_fn_nop () { return $? } as_nop=as_fn_nop # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`printf "%s\n" "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || printf "%s\n" X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null then : eval 'as_fn_append () { eval $1+=\$2 }' else $as_nop as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null then : eval 'as_fn_arith () { as_val=$(( $* )) }' else $as_nop as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith # as_fn_nop # --------- # Do nothing but, unlike ":", preserve the value of $?. as_fn_nop () { return $? } as_nop=as_fn_nop # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi printf "%s\n" "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || printf "%s\n" X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits as_lineno_1=$LINENO as_lineno_1a=$LINENO as_lineno_2=$LINENO as_lineno_2a=$LINENO eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) sed -n ' p /[$]LINENO/= ' <$as_myself | sed ' s/[$]LINENO.*/&-/ t lineno b :lineno N :loop s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ t loop s/-\n.*// ' >$as_me.lineno && chmod +x "$as_me.lineno" || { printf "%s\n" "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } # If we had to re-execute with $CONFIG_SHELL, we're ensured to have # already done that, so ensure we don't try to do so again and fall # in an infinite loop. This has already happened in practice. _as_can_reexec=no; export _as_can_reexec # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the # original and so on. Autoconf is especially sensitive to this). . "./$as_me.lineno" # Exit status is that of the last command. exit } # Determine whether it's possible to make 'echo' print without a newline. # These variables are no longer used directly by Autoconf, but are AC_SUBSTed # for compatibility with existing Makefiles. ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac # For backward compatibility with old third-party macros, we provide # the shell variables $as_echo and $as_echo_n. New code should use # AS_ECHO(["message"]) and AS_ECHO_N(["message"]), respectively. as_echo='printf %s\n' as_echo_n='printf %s' rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" test -n "$DJDIR" || exec 7<&0 &1 # Name of the host. # hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, # so uname gets run too. ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` # # Initializations. # ac_default_prefix=/usr/local ac_clean_files= ac_config_libobj_dir=. LIBOBJS= cross_compiling=no subdirs= MFLAGS= MAKEFLAGS= # Identity of this package. PACKAGE_NAME='hypre' PACKAGE_TARNAME='hypre' PACKAGE_VERSION='2.33.0' PACKAGE_STRING='hypre 2.33.0' PACKAGE_BUGREPORT='' PACKAGE_URL='' ac_unique_file="HYPRE.h" ac_default_prefix=`pwd`/hypre # Factoring default headers for most tests. ac_includes_default="\ #include #ifdef HAVE_STDIO_H # include #endif #ifdef HAVE_STDLIB_H # include #endif #ifdef HAVE_STRING_H # include #endif #ifdef HAVE_INTTYPES_H # include #endif #ifdef HAVE_STDINT_H # include #endif #ifdef HAVE_STRINGS_H # include #endif #ifdef HAVE_SYS_TYPES_H # include #endif #ifdef HAVE_SYS_STAT_H # include #endif #ifdef HAVE_UNISTD_H # include #endif" ac_header_c_list= ac_subst_vars='LTLIBOBJS LIBOBJS AR DSUPERLU_LIBS DSUPERLU_INCLUDE SUPERLU_LIBS SUPERLU_INCLUDE HYPRE_MAGMA_LIB HYPRE_MAGMA_INCLUDE HYPRE_MAGMA_LIB_DIR CALIPER_LIBS CALIPER_INCLUDE HYPRE_SYCL_LIBS HYPRE_SYCL_INCL HYPRE_HIP_LIBS HYPRE_HIP_INCL HYPRE_CUDA_LIBS HYPRE_CUDA_INCLUDE HYPRE_CUDA_PATH HYPRE_CUDA_GENCODE HYPRE_UMPIRE_LIB HYPRE_UMPIRE_INCLUDE HYPRE_UMPIRE_LIB_DIR HYPRE_KOKKOS_LIB HYPRE_KOKKOS_INCLUDE HYPRE_KOKKOS_LIB_DIR HYPRE_KOKKOS_SRC_DIR HYPRE_RAJA_LIB HYPRE_RAJA_INCLUDE HYPRE_RAJA_LIB_DIR LAPACKLIBS LAPACKLIBDIRS BLASLIBS BLASLIBDIRS HYPRE_FEI_FEMLI_FILES HYPRE_FEI_HYPRE_FILES HYPRE_FEI_SUBDIRS HYPRE_FEI_BASE_DIR HYPRE_FEI_SRC_DIR HYPRE_NAP_INCLUDE HYPRE_PILUT_FILES HYPRE_PARASAILS_FILES HYPRE_EUCLID_FILES HYPRE_DISTRIBUTED_LS_DIR MPIFLAGS MPILIBDIRS MPIINCLUDE HYPRE_LIBSUFFIX FLIBS HYPRE_INCINSTALL HYPRE_LIBINSTALL HYPRE_INSTALLDIR BUILD_JAVA PYTHON BUILD_PYTHON SHARED_OPTIONS SHARED_SET_SONAME SHARED_BUILD_FLAG SHARED_COMPILE_FLAG BUILD_CXX_SHARED BUILD_CC_SHARED BUILD_FC_SHARED LINK_CXX LINK_CC LINK_FC FFLAGS HOSTNAME HYPRE_ARCH HYPRE_ROCM_PREFIX EGREP GREP CPP MPILIBS FCLIBS ac_ct_FC FCFLAGS ac_ct_CXX CXXFLAGS OBJEXT EXEEXT ac_ct_CC CPPFLAGS LDFLAGS CFLAGS RANLIB SET_MAKE FC CXX CC CUFLAGS CUCC HYPRE_CUDA_SM CUDA_HOME host_os host_vendor host_cpu host build_os build_vendor build_cpu build HYPRE_SRCDIR HYPRE_BUGS HYPRE_TIME HYPRE_DATE HYPRE_NUMBER HYPRE_VERSION HYPRE_NAME target_alias host_alias build_alias LIBS ECHO_T ECHO_N ECHO_C DEFS mandir localedir libdir psdir pdfdir dvidir htmldir infodir docdir oldincludedir includedir runstatedir localstatedir sharedstatedir sysconfdir datadir datarootdir libexecdir sbindir bindir program_transform_name prefix exec_prefix PACKAGE_URL PACKAGE_BUGREPORT PACKAGE_STRING PACKAGE_VERSION PACKAGE_TARNAME PACKAGE_NAME PATH_SEPARATOR SHELL' ac_subst_files='' ac_user_opts=' enable_option_checking enable_debug enable_shared enable_mixedint enable_bigint enable_single enable_longdouble enable_complex enable_maxdim enable_persistent enable_hopscotch enable_fortran enable_unified_memory enable_device_memory_pool enable_device_malloc_async enable_thrust_nosync enable_gpu_profiling enable_gpu_aware_mpi with_cxxstandard with_LD with_LDFLAGS with_extra_CFLAGS with_extra_CXXFLAGS with_extra_CUFLAGS with_extra_BUILDFLAGS with_extra_incpath with_extra_ldpath with_strict_checking with_MPI_include with_MPI_libs with_MPI_lib_dirs with_MPI_flags with_node_aware_mpi with_node_aware_mpi_include with_memory_tracker with_test_using_host with_blas_lib with_blas_libs with_blas_lib_dirs with_lapack_lib with_lapack_libs with_lapack_lib_dirs with_fmangle with_fmangle_blas with_fmangle_lapack with_print_errors with_timing with_openmp with_device_openmp with_superlu with_superlu_include with_superlu_lib with_dsuperlu with_dsuperlu_include with_dsuperlu_lib with_fei_inc_dir with_mli with_MPI with_cuda with_hip enable_rocsparse enable_rocblas enable_rocsolver enable_rocrand with_sycl with_cuda_home with_gpu_arch enable_cublas enable_curand enable_cuda_streams enable_cusparse enable_cusolver with_sycl_target with_sycl_target_backend enable_onemklsparse enable_onemklblas enable_onemklrand with_raja with_raja_include with_raja_lib with_raja_libs with_raja_lib_dirs with_kokkos with_kokkos_include with_kokkos_lib with_kokkos_libs with_kokkos_lib_dirs with_umpire_host with_umpire_device with_umpire_um with_umpire_pinned with_umpire with_umpire_include with_umpire_lib with_umpire_libs with_umpire_lib_dirs with_magma with_magma_include with_magma_lib with_magma_libs with_magma_lib_dirs with_caliper with_caliper_include with_caliper_lib with_blas with_lapack ' ac_precious_vars='build_alias host_alias target_alias CUDA_HOME HYPRE_CUDA_SM CUCC CUFLAGS CC CFLAGS LDFLAGS LIBS CPPFLAGS CXX CXXFLAGS CCC FC FCFLAGS CPP' # Initialize some variables set by options. ac_init_help= ac_init_version=false ac_unrecognized_opts= ac_unrecognized_sep= # The variables have the same names as the options, with # dashes changed to underlines. cache_file=/dev/null exec_prefix=NONE no_create= no_recursion= prefix=NONE program_prefix=NONE program_suffix=NONE program_transform_name=s,x,x, silent= site= srcdir= verbose= x_includes=NONE x_libraries=NONE # Installation directory options. # These are left unexpanded so users can "make install exec_prefix=/foo" # and all the variables that are supposed to be based on exec_prefix # by default will actually change. # Use braces instead of parens because sh, perl, etc. also accept them. # (The list follows the same order as the GNU Coding Standards.) bindir='${exec_prefix}/bin' sbindir='${exec_prefix}/sbin' libexecdir='${exec_prefix}/libexec' datarootdir='${prefix}/share' datadir='${datarootdir}' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' runstatedir='${localstatedir}/run' includedir='${prefix}/include' oldincludedir='/usr/include' docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' infodir='${datarootdir}/info' htmldir='${docdir}' dvidir='${docdir}' pdfdir='${docdir}' psdir='${docdir}' libdir='${exec_prefix}/lib' localedir='${datarootdir}/locale' mandir='${datarootdir}/man' ac_prev= ac_dashdash= for ac_option do # If the previous option needs an argument, assign it. if test -n "$ac_prev"; then eval $ac_prev=\$ac_option ac_prev= continue fi case $ac_option in *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; *=) ac_optarg= ;; *) ac_optarg=yes ;; esac case $ac_dashdash$ac_option in --) ac_dashdash=yes ;; -bindir | --bindir | --bindi | --bind | --bin | --bi) ac_prev=bindir ;; -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) bindir=$ac_optarg ;; -build | --build | --buil | --bui | --bu) ac_prev=build_alias ;; -build=* | --build=* | --buil=* | --bui=* | --bu=*) build_alias=$ac_optarg ;; -cache-file | --cache-file | --cache-fil | --cache-fi \ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) ac_prev=cache_file ;; -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) cache_file=$ac_optarg ;; --config-cache | -C) cache_file=config.cache ;; -datadir | --datadir | --datadi | --datad) ac_prev=datadir ;; -datadir=* | --datadir=* | --datadi=* | --datad=*) datadir=$ac_optarg ;; -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ | --dataroo | --dataro | --datar) ac_prev=datarootdir ;; -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) datarootdir=$ac_optarg ;; -disable-* | --disable-*) ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: \`$ac_useropt'" ac_useropt_orig=$ac_useropt ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=no ;; -docdir | --docdir | --docdi | --doc | --do) ac_prev=docdir ;; -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) docdir=$ac_optarg ;; -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) ac_prev=dvidir ;; -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) dvidir=$ac_optarg ;; -enable-* | --enable-*) ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: \`$ac_useropt'" ac_useropt_orig=$ac_useropt ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=\$ac_optarg ;; -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ | --exec | --exe | --ex) ac_prev=exec_prefix ;; -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ | --exec=* | --exe=* | --ex=*) exec_prefix=$ac_optarg ;; -gas | --gas | --ga | --g) # Obsolete; use --with-gas. with_gas=yes ;; -help | --help | --hel | --he | -h) ac_init_help=long ;; -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) ac_init_help=recursive ;; -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) ac_init_help=short ;; -host | --host | --hos | --ho) ac_prev=host_alias ;; -host=* | --host=* | --hos=* | --ho=*) host_alias=$ac_optarg ;; -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) ac_prev=htmldir ;; -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ | --ht=*) htmldir=$ac_optarg ;; -includedir | --includedir | --includedi | --included | --include \ | --includ | --inclu | --incl | --inc) ac_prev=includedir ;; -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ | --includ=* | --inclu=* | --incl=* | --inc=*) includedir=$ac_optarg ;; -infodir | --infodir | --infodi | --infod | --info | --inf) ac_prev=infodir ;; -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) infodir=$ac_optarg ;; -libdir | --libdir | --libdi | --libd) ac_prev=libdir ;; -libdir=* | --libdir=* | --libdi=* | --libd=*) libdir=$ac_optarg ;; -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ | --libexe | --libex | --libe) ac_prev=libexecdir ;; -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ | --libexe=* | --libex=* | --libe=*) libexecdir=$ac_optarg ;; -localedir | --localedir | --localedi | --localed | --locale) ac_prev=localedir ;; -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) localedir=$ac_optarg ;; -localstatedir | --localstatedir | --localstatedi | --localstated \ | --localstate | --localstat | --localsta | --localst | --locals) ac_prev=localstatedir ;; -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) localstatedir=$ac_optarg ;; -mandir | --mandir | --mandi | --mand | --man | --ma | --m) ac_prev=mandir ;; -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) mandir=$ac_optarg ;; -nfp | --nfp | --nf) # Obsolete; use --without-fp. with_fp=no ;; -no-create | --no-create | --no-creat | --no-crea | --no-cre \ | --no-cr | --no-c | -n) no_create=yes ;; -no-recursion | --no-recursion | --no-recursio | --no-recursi \ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) no_recursion=yes ;; -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ | --oldin | --oldi | --old | --ol | --o) ac_prev=oldincludedir ;; -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) oldincludedir=$ac_optarg ;; -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) ac_prev=prefix ;; -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) prefix=$ac_optarg ;; -program-prefix | --program-prefix | --program-prefi | --program-pref \ | --program-pre | --program-pr | --program-p) ac_prev=program_prefix ;; -program-prefix=* | --program-prefix=* | --program-prefi=* \ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) program_prefix=$ac_optarg ;; -program-suffix | --program-suffix | --program-suffi | --program-suff \ | --program-suf | --program-su | --program-s) ac_prev=program_suffix ;; -program-suffix=* | --program-suffix=* | --program-suffi=* \ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) program_suffix=$ac_optarg ;; -program-transform-name | --program-transform-name \ | --program-transform-nam | --program-transform-na \ | --program-transform-n | --program-transform- \ | --program-transform | --program-transfor \ | --program-transfo | --program-transf \ | --program-trans | --program-tran \ | --progr-tra | --program-tr | --program-t) ac_prev=program_transform_name ;; -program-transform-name=* | --program-transform-name=* \ | --program-transform-nam=* | --program-transform-na=* \ | --program-transform-n=* | --program-transform-=* \ | --program-transform=* | --program-transfor=* \ | --program-transfo=* | --program-transf=* \ | --program-trans=* | --program-tran=* \ | --progr-tra=* | --program-tr=* | --program-t=*) program_transform_name=$ac_optarg ;; -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) ac_prev=pdfdir ;; -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) pdfdir=$ac_optarg ;; -psdir | --psdir | --psdi | --psd | --ps) ac_prev=psdir ;; -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) psdir=$ac_optarg ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) silent=yes ;; -runstatedir | --runstatedir | --runstatedi | --runstated \ | --runstate | --runstat | --runsta | --runst | --runs \ | --run | --ru | --r) ac_prev=runstatedir ;; -runstatedir=* | --runstatedir=* | --runstatedi=* | --runstated=* \ | --runstate=* | --runstat=* | --runsta=* | --runst=* | --runs=* \ | --run=* | --ru=* | --r=*) runstatedir=$ac_optarg ;; -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) ac_prev=sbindir ;; -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ | --sbi=* | --sb=*) sbindir=$ac_optarg ;; -sharedstatedir | --sharedstatedir | --sharedstatedi \ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ | --sharedst | --shareds | --shared | --share | --shar \ | --sha | --sh) ac_prev=sharedstatedir ;; -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ | --sha=* | --sh=*) sharedstatedir=$ac_optarg ;; -site | --site | --sit) ac_prev=site ;; -site=* | --site=* | --sit=*) site=$ac_optarg ;; -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ac_prev=srcdir ;; -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) srcdir=$ac_optarg ;; -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ | --syscon | --sysco | --sysc | --sys | --sy) ac_prev=sysconfdir ;; -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) sysconfdir=$ac_optarg ;; -target | --target | --targe | --targ | --tar | --ta | --t) ac_prev=target_alias ;; -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) target_alias=$ac_optarg ;; -v | -verbose | --verbose | --verbos | --verbo | --verb) verbose=yes ;; -version | --version | --versio | --versi | --vers | -V) ac_init_version=: ;; -with-* | --with-*) ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: \`$ac_useropt'" ac_useropt_orig=$ac_useropt ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=\$ac_optarg ;; -without-* | --without-*) ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: \`$ac_useropt'" ac_useropt_orig=$ac_useropt ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=no ;; --x) # Obsolete; use --with-x. with_x=yes ;; -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ | --x-incl | --x-inc | --x-in | --x-i) ac_prev=x_includes ;; -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) x_includes=$ac_optarg ;; -x-libraries | --x-libraries | --x-librarie | --x-librari \ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) ac_prev=x_libraries ;; -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) x_libraries=$ac_optarg ;; -*) as_fn_error $? "unrecognized option: \`$ac_option' Try \`$0 --help' for more information" ;; *=*) ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` # Reject names that are not valid shell variable names. case $ac_envvar in #( '' | [0-9]* | *[!_$as_cr_alnum]* ) as_fn_error $? "invalid variable name: \`$ac_envvar'" ;; esac eval $ac_envvar=\$ac_optarg export $ac_envvar ;; *) # FIXME: should be removed in autoconf 3.0. printf "%s\n" "$as_me: WARNING: you should use --build, --host, --target" >&2 expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && printf "%s\n" "$as_me: WARNING: invalid host type: $ac_option" >&2 : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" ;; esac done if test -n "$ac_prev"; then ac_option=--`echo $ac_prev | sed 's/_/-/g'` as_fn_error $? "missing argument to $ac_option" fi if test -n "$ac_unrecognized_opts"; then case $enable_option_checking in no) ;; fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; *) printf "%s\n" "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; esac fi # Check all directory arguments for consistency. for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ datadir sysconfdir sharedstatedir localstatedir includedir \ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ libdir localedir mandir runstatedir do eval ac_val=\$$ac_var # Remove trailing slashes. case $ac_val in */ ) ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` eval $ac_var=\$ac_val;; esac # Be sure to have absolute directory names. case $ac_val in [\\/$]* | ?:[\\/]* ) continue;; NONE | '' ) case $ac_var in *prefix ) continue;; esac;; esac as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" done # There might be people who depend on the old broken behavior: `$host' # used to hold the argument of --host etc. # FIXME: To remove some day. build=$build_alias host=$host_alias target=$target_alias # FIXME: To remove some day. if test "x$host_alias" != x; then if test "x$build_alias" = x; then cross_compiling=maybe elif test "x$build_alias" != "x$host_alias"; then cross_compiling=yes fi fi ac_tool_prefix= test -n "$host_alias" && ac_tool_prefix=$host_alias- test "$silent" = yes && exec 6>/dev/null ac_pwd=`pwd` && test -n "$ac_pwd" && ac_ls_di=`ls -di .` && ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || as_fn_error $? "working directory cannot be determined" test "X$ac_ls_di" = "X$ac_pwd_ls_di" || as_fn_error $? "pwd does not report name of working directory" # Find the source files, if location was not specified. if test -z "$srcdir"; then ac_srcdir_defaulted=yes # Try the directory containing this script, then the parent directory. ac_confdir=`$as_dirname -- "$as_myself" || $as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_myself" : 'X\(//\)[^/]' \| \ X"$as_myself" : 'X\(//\)$' \| \ X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || printf "%s\n" X"$as_myself" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` srcdir=$ac_confdir if test ! -r "$srcdir/$ac_unique_file"; then srcdir=.. fi else ac_srcdir_defaulted=no fi if test ! -r "$srcdir/$ac_unique_file"; then test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" fi ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" ac_abs_confdir=`( cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" pwd)` # When building in place, set srcdir=. if test "$ac_abs_confdir" = "$ac_pwd"; then srcdir=. fi # Remove unnecessary trailing slashes from srcdir. # Double slashes in file names in object file debugging info # mess up M-x gdb in Emacs. case $srcdir in */) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; esac for ac_var in $ac_precious_vars; do eval ac_env_${ac_var}_set=\${${ac_var}+set} eval ac_env_${ac_var}_value=\$${ac_var} eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} eval ac_cv_env_${ac_var}_value=\$${ac_var} done # # Report the --help message. # if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF \`configure' configures hypre 2.33.0 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... To assign environment variables (e.g., CC, CFLAGS...), specify them as VAR=VALUE. See below for descriptions of some of the useful variables. Defaults for the options are specified in brackets. Configuration: -h, --help display this help and exit --help=short display options specific to this package --help=recursive display the short help of all the included packages -V, --version display version information and exit -q, --quiet, --silent do not print \`checking ...' messages --cache-file=FILE cache test results in FILE [disabled] -C, --config-cache alias for \`--cache-file=config.cache' -n, --no-create do not create output files --srcdir=DIR find the sources in DIR [configure dir or \`..'] Installation directories: --prefix=PREFIX install architecture-independent files in PREFIX [$ac_default_prefix] --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX [PREFIX] By default, \`make install' will install all the files in \`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify an installation prefix other than \`$ac_default_prefix' using \`--prefix', for instance \`--prefix=\$HOME'. For better control, use the options below. Fine tuning of the installation directories: --bindir=DIR user executables [EPREFIX/bin] --sbindir=DIR system admin executables [EPREFIX/sbin] --libexecdir=DIR program executables [EPREFIX/libexec] --sysconfdir=DIR read-only single-machine data [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] --localstatedir=DIR modifiable single-machine data [PREFIX/var] --runstatedir=DIR modifiable per-process data [LOCALSTATEDIR/run] --libdir=DIR object code libraries [EPREFIX/lib] --includedir=DIR C header files [PREFIX/include] --oldincludedir=DIR C header files for non-gcc [/usr/include] --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] --datadir=DIR read-only architecture-independent data [DATAROOTDIR] --infodir=DIR info documentation [DATAROOTDIR/info] --localedir=DIR locale-dependent data [DATAROOTDIR/locale] --mandir=DIR man documentation [DATAROOTDIR/man] --docdir=DIR documentation root [DATAROOTDIR/doc/hypre] --htmldir=DIR html documentation [DOCDIR] --dvidir=DIR dvi documentation [DOCDIR] --pdfdir=DIR pdf documentation [DOCDIR] --psdir=DIR ps documentation [DOCDIR] _ACEOF cat <<\_ACEOF System types: --build=BUILD configure for building on BUILD [guessed] --host=HOST cross-compile to build programs to run on HOST [BUILD] _ACEOF fi if test -n "$ac_init_help"; then case $ac_init_help in short | recursive ) echo "Configuration of hypre 2.33.0:";; esac cat <<\_ACEOF Optional Features: --disable-option-checking ignore unrecognized --enable/--with options --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) --enable-FEATURE[=ARG] include FEATURE [ARG=yes] --enable-debug Set compiler flags for debugging. --enable-shared Build shared libraries (default is NO). --enable-mixedint Use long long int for HYPRE_BigInt and int for HYPRE_Int (default is int for both). Note: This option disables Euclid, ParaSails, pilut and CGC coarsening. --enable-bigint Use long long int for HYPRE_Int (default is NO). --enable-single Use single precision values (default is NO). --enable-longdouble Use long double precision values (default is NO). --enable-complex Use complex values (default is NO). --enable-maxdim=MAXDIM Change max dimension size to MAXDIM (default is 3). Currently must be at least 3. --enable-persistent Uses persistent communication (default is NO). --enable-hopscotch Uses hopscotch hashing if configured with OpenMP and atomic capability available(default is NO). --enable-fortran Require a working Fortran compiler (default is YES). --enable-unified-memory Use unified memory for allocating the memory (default is NO). --enable-device-memory-pool Use device pooling allocator (default is NO). --enable-device-malloc-async Use device async malloc (default is NO). --enable-thrust-nosync Use thrust par_nosync policy (default is NO). --enable-gpu-profiling Use NVTX on CUDA, rocTX on HIP (default is NO). --enable-gpu-aware-mpi Use GPU memory aware MPI --enable-rocsparse Use rocSPARSE (default is YES with HIP, otherwise NO). --enable-rocblas Use rocBLAS (default is NO). --enable-rocsolver Use rocSOLVER (default is NO). --enable-rocrand Use rocRAND (default is YES with HIP, otherwise NO). --enable-cublas Use cuBLAS (default is YES with CUDA, otherwise NO). --enable-curand Use cuRAND (default is YES with CUDA, otherwise NO). --enable-cuda-streams Use CUDA streams (default is YES with CUDA, otherwise NO). --enable-cusparse Use cuSPARSE (default is YES with CUDA, otherwise NO). --enable-cusolver Use cuSOLVER (default is NO). --enable-onemklsparse Use oneMKL sparse (default is YES). --enable-onemklblas Use oneMKL blas (default is YES). --enable-onemklrand Use oneMKL rand (default is YES). Optional Packages: --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) --with-cxxstandard=val User specifies c++ starndard in val. --with-LD=ARG Set linker to ARG. The environment variable 'LD' will be overridden. --with-LDFLAGS=ARG User can manually set linker flags. The 'LDFLAGS' environment variable will be overridden. --with-extra-CFLAGS=ARG Define extra C compile flag, where ARG is a space-separated list (enclosed in quotes) of directories. --with-extra-CXXFLAGS=ARG Define extra C++ compile flag, where ARG is a space-separated list (enclosed in quotes) of directories. --with-extra-CUFLAGS=ARG Define extra CUDA compile flag, where ARG is a space-separated list (enclosed in quotes) of directories. --with-extra-BUILDFLAGS=ARG Define extra library build flag, where ARG is a space-separated list (enclosed in quotes) of directories. --with-extra-incpath=PATH Define extra include path, where PATH is a space-separated list (enclosed in quotes) of directories. --with-extra-ldpath=PATH Define extra ld path, where PATH is a space-separated list (enclosed in quotes) of directories. --with-strict-checking Compiles without MPI ('--without-MPI') and tries to find a compiler option that warns of as many non-ISO features as possible. --with-MPI-include=DIR User specifies that mpi.h is in DIR. The options --with-MPI-include --with-MPI-libs and --with-MPI-lib-dirs must be used together. --with-MPI-libs=LIBS LIBS is space-separated list (enclosed in quotes) of library names needed for MPI, e.g. "nsl socket mpi". The options --with-MPI-include --with-MPI-libs and --with-MPI-lib-dirs must be used together. --with-MPI-lib-dirs=DIRS DIRS is space-separated list (enclosed in quotes) of directories containing the libraries specified by --with-MPI-libs, e.g "usr/lib /usr/local/mpi/lib". The options --with-MPI-include --with-MPI-libs and --with-MPI-lib-dirs must be used together. --with-MPI-flags=FLAGS FLAGS is a space separated list (enclosed in quotes) of whatever flags other than -l and -L are needed to link with MPI libraries-- Does not de-activate autosearch for other MPI information. May be used with the other three MPI options or alone in conjunction with the automatic MPI search. --with-node-aware-mpi Use Node Aware MPI (default is NO). --with-node-aware-mpi-include=DIR User specifies that nap_comm.hpp is in DIR. --with-memory-tracker Use memory tracker in hypre (default is NO). --with-test-using-host Use host memory in hypre test drivers (default is NO). --with-blas-lib=LIBS LIBS is space-separated linkable list (enclosed in quotes) of libraries needed for BLAS. OK to use -L and -l flags in the list --with-blas-libs=LIBS LIBS is space-separated list (enclosed in quotes) of libraries needed for BLAS (base name only). The options --with-blas-libs and --with-blas-lib-dirs must be used together. --with-blas-lib-dirs=DIRS DIRS is space-separated list (enclosed in quotes) of directories containing the libraries specified by --with-blas-libs, e.g "usr/lib /usr/local/blas/lib". The options --with-blas-libs and --with-blas-lib-dirs must be used together. --with-lapack-lib=LIBS LIBS is space-separated linkable list (enclosed in quotes) of libraries needed for LAPACK. OK to use -L and -l flags in the list --with-lapack-libs=LIBS LIBS is space-separated list (enclosed in quotes) of libraries needed for LAPACK (base name only). The options --with-lapack-libs and --with-lapack-lib-dirs must be used together. --with-lapack-lib-dirs=DIRS DIRS is space-separated list (enclosed in quotes) of directories containing the libraries specified by --with-lapack-libs, e.g "usr/lib /usr/local/lapack/lib". The options --with-lapack-libs and --with-lapack-lib-dirs must be used together. --with-fmangle=FMANGLE FMANGLE contains a string indicating the type of name mangling to use when calling hypre from Fortran. It can be set to: "no-underscores", "one-underscore", "two-underscores", "caps-no-underscores", and "one-before-after". --with-fmangle-blas=FMANGLE Name mangling for BLAS. See --with-fmangle. --with-fmangle-lapack=FMANGLE Name mangling for LAPACK. See --with-fmangle. --with-print-errors Print HYPRE errors. --with-timing Use HYPRE timing routines. --with-openmp Use OpenMP. This may affect which compiler is chosen. --with-device-openmp Use OpenMP 4.5 Device Directives. This may affect which compiler is chosen. --with-superlu Use external SuperLU library. --with-superlu-include=DIR Directory where SuperLU is installed. --with-superlu-lib=LIBS LIBS is space-separated linkable list (enclosed in quotes) of libraries needed for SuperLU. OK to use -L and -l flags in the list --with-dsuperlu Use external DSuperLU library. --with-dsuperlu-include=DIR Directory where DSuperLU is installed. --with-dsuperlu-lib=LIBS LIBS is space-separated linkable list (enclosed in quotes) of libraries needed for DSuperLU. OK to use -L and -l flags in the list --with-fei-inc-dir=DIR DIR is the directory containing the FEI distribution. --with-mli Use MLI --with-MPI DEFAULT: Compile with MPI. Selecting --without-MPI may affect which compiler is chosen. --with-cuda Use CUDA. Require cuda-8.0 or higher (default is NO). --with-hip Use HIP for AMD GPUs. (default is NO). --with-sycl Use SYCL for Intel GPUs. (default is NO). --with-cuda-home=DIR User specifies CUDA_HOME in DIR. --with-gpu-arch=ARG User specifies NVIDIA GPU architecture that the CUDA files will be compiled for in ARG, where ARG is a space-separated list (enclosed in quotes) of numbers. --with-sycl-target=ARG User specifies sycl targets for AOT compilation in ARG, where ARG is a comma-separated list (enclosed in quotes), e.g. "spir64_gen". --with-sycl-target-backend=ARG User specifies additional options for the sycl target backend for AOT compilation in ARG, where ARG contains the desired options (enclosed in double+single quotes), e.g. --with-sycl-target-backend="'-device 12.1.0,12.4.0'". --with-raja Use RAJA. Require RAJA package to be compiled properly (default is NO). --with-raja-include=DIR User specifies that RAJA/*.h is in DIR. The options --with-raja-include --with-raja-libs and --with-raja-lib-dirs must be used together. --with-raja-lib=LIBS LIBS is space-separated linkable list (enclosed in quotes) of libraries needed for RAJA. OK to use -L and -l flags in the list --with-raja-libs=LIBS LIBS is space-separated list (enclosed in quotes) of libraries needed for RAJA (base name only). The options --with-raja-libs and --with-raja-lib-dirs must be used together. --with-raja-lib-dirs=DIRS DIRS is space-separated list (enclosed in quotes) of directories containing the libraries specified by --with-raja-libs, e.g "usr/lib /usr/local/lib". The options --with-raja-libs and --raja-blas-lib-dirs must be used together. --with-kokkos Use Kokkos. Require kokkos package to be compiled properly(default is NO). --with-kokkos-include=DIR User specifies that KOKKOS headers is in DIR. The options --with-kokkos-include --with-kokkos-libs and --with-kokkos-dirs must be used together. --with-kokkos-lib=LIBS LIBS is space-separated linkable list (enclosed in quotes) of libraries needed for KOKKOS. OK to use -L and -l flags in the list --with-kokkos-libs=LIBS LIBS is space-separated list (enclosed in quotes) of libraries needed for KOKKOS (base name only). The options --with-kokkos-libs and --with-kokkos-dirs must be used together. --with-kokkos-lib-dirs=DIRS DIRS is space-separated list (enclosed in quotes) of directories containing the libraries and Makefile.kokkos is assumed to be in DIRS/../ . The options --with-kokkos-libs and --with-kokkos-dirs must be used together. --with-umpire-host Use Umpire Allocator for host memory (default is NO). --with-umpire-device Use Umpire Allocator for device memory (default is NO). --with-umpire-um Use Umpire Allocator for unified memory (default is NO). --with-umpire-pinned Use Umpire Allocator for pinned memory (default is NO). --with-umpire Use Umpire Allocator for device and unified memory (default is NO). --with-umpire-include=DIR User specifies that UMPIRE headers is in DIR. The options --with-umpire-include --with-umpire-libs and --with-umpire-dirs must be used together. --with-umpire-lib=LIBS LIBS is space-separated linkable list (enclosed in quotes) of libraries needed for UMPIRE. OK to use -L and -l flags in the list --with-umpire-libs=LIBS LIBS is space-separated list (enclosed in quotes) of libraries needed for UMPIRE (base name only). The options --with-umpire-libs and --with-umpire-dirs must be used together. --with-umpire-lib-dirs=DIRS DIRS is space-separated list (enclosed in quotes) of directories containing the libraries specified by --with-umpire-libs, e.g "usr/lib /usr/local/lib". The options --with-umpire-libs and --with-umpire-dirs must be used together. --with-magma Use MAGMA (Matrix Algebra for GPUs and Multicore Architectures). --with-magma-include=DIR User specifies that MAGMA headers are in DIR. The options --with-magma-include --with-magma-libs and --with-magma-dirs must be used together. --with-magma-lib=LIBS LIBS is space-separated linkable list (enclosed in quotes) of libraries needed for MAGMA. OK to use -L and -l flags in the list --with-magma-libs=LIBS LIBS is space-separated list (enclosed in quotes) of libraries needed for MAGMA (base name only). The options --with-magma-libs and --with-magma-lib-dirs must be used together. --with-magma-lib-dirs=DIRS DIRS is space-separated list (enclosed in quotes) of directories containing the libraries specified by --with-magma-libs, e.g "usr/lib /usr/local/lib". The options --with-magma-libs and --with-magma-lib-dirs must be used together. --with-caliper Use Caliper instrumentation (default is NO). --with-caliper-include=DIR Directory where Caliper is installed. --with-caliper-lib=LIBS LIBS is space-separated linkable list (enclosed in quotes) of libraries needed for Caliper. OK to use -L and -l flags in the list --with-blas Find a system-provided BLAS library --with-lapack Find a system-provided LAPACK library Some influential environment variables: CUDA_HOME CUDA home directory HYPRE_CUDA_SM CUDA architecture CUCC CUDA compiler command CUFLAGS CUDA compiler flags CC C compiler command CFLAGS C compiler flags LDFLAGS linker flags, e.g. -L if you have libraries in a nonstandard directory LIBS libraries to pass to the linker, e.g. -l CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if you have headers in a nonstandard directory CXX C++ compiler command CXXFLAGS C++ compiler flags FC Fortran compiler command FCFLAGS Fortran compiler flags CPP C preprocessor Use these variables to override the choices made by `configure' or to help it to find libraries and programs with nonstandard names/locations. Report bugs to the package provider. _ACEOF ac_status=$? fi if test "$ac_init_help" = "recursive"; then # If there are subdirs, report their specific --help. for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue test -d "$ac_dir" || { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || continue ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`printf "%s\n" "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`printf "%s\n" "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix cd "$ac_dir" || { ac_status=$?; continue; } # Check for configure.gnu first; this name is used for a wrapper for # Metaconfig's "Configure" on case-insensitive file systems. if test -f "$ac_srcdir/configure.gnu"; then echo && $SHELL "$ac_srcdir/configure.gnu" --help=recursive elif test -f "$ac_srcdir/configure"; then echo && $SHELL "$ac_srcdir/configure" --help=recursive else printf "%s\n" "$as_me: WARNING: no configuration information is in $ac_dir" >&2 fi || ac_status=$? cd "$ac_pwd" || { ac_status=$?; break; } done fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF hypre configure 2.33.0 generated by GNU Autoconf 2.71 Copyright (C) 2021 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. Copyright (c) 1998 Lawrence Livermore National Security, LLC and other HYPRE Project Developers. See the top-level COPYRIGHT file for details. _ACEOF exit fi ## ------------------------ ## ## Autoconf initialization. ## ## ------------------------ ## # ac_fn_c_try_compile LINENO # -------------------------- # Try to compile conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext conftest.beam if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext then : ac_retval=0 else $as_nop printf "%s\n" "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_compile # ac_fn_cxx_try_compile LINENO # ---------------------------- # Try to compile conftest.$ac_ext, and return whether this succeeded. ac_fn_cxx_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext conftest.beam if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_cxx_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext then : ac_retval=0 else $as_nop printf "%s\n" "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_cxx_try_compile # ac_fn_fc_try_compile LINENO # --------------------------- # Try to compile conftest.$ac_ext, and return whether this succeeded. ac_fn_fc_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext conftest.beam if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_fc_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext then : ac_retval=0 else $as_nop printf "%s\n" "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_fc_try_compile # ac_fn_c_try_link LINENO # ----------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_link () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext conftest.beam conftest$ac_exeext if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_link") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || test -x conftest$ac_exeext } then : ac_retval=0 else $as_nop printf "%s\n" "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would # interfere with the next link command; also delete a directory that is # left behind by Apple's compiler. We do this before executing the actions. rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_link # ac_fn_c_check_func LINENO FUNC VAR # ---------------------------------- # Tests whether FUNC exists, setting the cache variable VAR accordingly ac_fn_c_check_func () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 printf %s "checking for $2... " >&6; } if eval test \${$3+y} then : printf %s "(cached) " >&6 else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Define $2 to an innocuous variant, in case declares $2. For example, HP-UX 11i declares gettimeofday. */ #define $2 innocuous_$2 /* System header to define __stub macros and hopefully few prototypes, which can conflict with char $2 (); below. */ #include #undef $2 /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $2 (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined __stub_$2 || defined __stub___$2 choke me #endif #ifdef FC_DUMMY_MAIN #ifndef FC_DUMMY_MAIN_EQ_F77 # ifdef __cplusplus extern "C" # endif int FC_DUMMY_MAIN() { return 1; } #endif #endif int main (void) { return $2 (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO" then : eval "$3=yes" else $as_nop eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext fi eval ac_res=\$$3 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 printf "%s\n" "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_func # ac_fn_c_try_cpp LINENO # ---------------------- # Try to preprocess conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_cpp () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } > conftest.i && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.err } then : ac_retval=0 else $as_nop printf "%s\n" "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_cpp # ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES # ------------------------------------------------------- # Tests whether HEADER exists and can be compiled using the include files in # INCLUDES, setting the cache variable VAR accordingly. ac_fn_c_check_header_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 printf %s "checking for $2... " >&6; } if eval test \${$3+y} then : printf %s "(cached) " >&6 else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_c_try_compile "$LINENO" then : eval "$3=yes" else $as_nop eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi eval ac_res=\$$3 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 printf "%s\n" "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_header_compile ac_configure_args_raw= for ac_arg do case $ac_arg in *\'*) ac_arg=`printf "%s\n" "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac as_fn_append ac_configure_args_raw " '$ac_arg'" done case $ac_configure_args_raw in *$as_nl*) ac_safe_unquote= ;; *) ac_unsafe_z='|&;<>()$`\\"*?[ '' ' # This string ends in space, tab. ac_unsafe_a="$ac_unsafe_z#~" ac_safe_unquote="s/ '\\([^$ac_unsafe_a][^$ac_unsafe_z]*\\)'/ \\1/g" ac_configure_args_raw=` printf "%s\n" "$ac_configure_args_raw" | sed "$ac_safe_unquote"`;; esac cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. It was created by hypre $as_me 2.33.0, which was generated by GNU Autoconf 2.71. Invocation command line was $ $0$ac_configure_args_raw _ACEOF exec 5>>config.log { cat <<_ASUNAME ## --------- ## ## Platform. ## ## --------- ## hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` /bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` /bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` /usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` /bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` /bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` _ASUNAME as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac printf "%s\n" "PATH: $as_dir" done IFS=$as_save_IFS } >&5 cat >&5 <<_ACEOF ## ----------- ## ## Core tests. ## ## ----------- ## _ACEOF # Keep a trace of the command line. # Strip out --no-create and --no-recursion so they do not pile up. # Strip out --silent because we don't want to record it for future runs. # Also quote any args containing shell meta-characters. # Make two passes to allow for proper duplicate-argument suppression. ac_configure_args= ac_configure_args0= ac_configure_args1= ac_must_keep_next=false for ac_pass in 1 2 do for ac_arg do case $ac_arg in -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) continue ;; *\'*) ac_arg=`printf "%s\n" "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac case $ac_pass in 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; 2) as_fn_append ac_configure_args1 " '$ac_arg'" if test $ac_must_keep_next = true; then ac_must_keep_next=false # Got value, back to normal. else case $ac_arg in *=* | --config-cache | -C | -disable-* | --disable-* \ | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ | -with-* | --with-* | -without-* | --without-* | --x) case "$ac_configure_args0 " in "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; esac ;; -* ) ac_must_keep_next=true ;; esac fi as_fn_append ac_configure_args " '$ac_arg'" ;; esac done done { ac_configure_args0=; unset ac_configure_args0;} { ac_configure_args1=; unset ac_configure_args1;} # When interrupted or exit'd, cleanup temporary files, and complete # config.log. We remove comments because anyway the quotes in there # would cause problems or look ugly. # WARNING: Use '\'' to represent an apostrophe within the trap. # WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. trap 'exit_status=$? # Sanitize IFS. IFS=" "" $as_nl" # Save into config.log some information that might help in debugging. { echo printf "%s\n" "## ---------------- ## ## Cache variables. ## ## ---------------- ##" echo # The following way of writing the cache mishandles newlines in values, ( for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 printf "%s\n" "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( *${as_nl}ac_space=\ *) sed -n \ "s/'\''/'\''\\\\'\'''\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" ;; #( *) sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) echo printf "%s\n" "## ----------------- ## ## Output variables. ## ## ----------------- ##" echo for ac_var in $ac_subst_vars do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`printf "%s\n" "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac printf "%s\n" "$ac_var='\''$ac_val'\''" done | sort echo if test -n "$ac_subst_files"; then printf "%s\n" "## ------------------- ## ## File substitutions. ## ## ------------------- ##" echo for ac_var in $ac_subst_files do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`printf "%s\n" "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac printf "%s\n" "$ac_var='\''$ac_val'\''" done | sort echo fi if test -s confdefs.h; then printf "%s\n" "## ----------- ## ## confdefs.h. ## ## ----------- ##" echo cat confdefs.h echo fi test "$ac_signal" != 0 && printf "%s\n" "$as_me: caught signal $ac_signal" printf "%s\n" "$as_me: exit $exit_status" } >&5 rm -f core *.core core.conftest.* && rm -f -r conftest* confdefs* conf$$* $ac_clean_files && exit $exit_status ' 0 for ac_signal in 1 2 13 15; do trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal done ac_signal=0 # confdefs.h avoids OS command line length limits that DEFS can exceed. rm -f -r conftest* confdefs.h printf "%s\n" "/* confdefs.h */" > confdefs.h # Predefined preprocessor variables. printf "%s\n" "#define PACKAGE_NAME \"$PACKAGE_NAME\"" >>confdefs.h printf "%s\n" "#define PACKAGE_TARNAME \"$PACKAGE_TARNAME\"" >>confdefs.h printf "%s\n" "#define PACKAGE_VERSION \"$PACKAGE_VERSION\"" >>confdefs.h printf "%s\n" "#define PACKAGE_STRING \"$PACKAGE_STRING\"" >>confdefs.h printf "%s\n" "#define PACKAGE_BUGREPORT \"$PACKAGE_BUGREPORT\"" >>confdefs.h printf "%s\n" "#define PACKAGE_URL \"$PACKAGE_URL\"" >>confdefs.h # Let the site file select an alternate cache file if it wants to. # Prefer an explicitly selected file to automatically selected ones. if test -n "$CONFIG_SITE"; then ac_site_files="$CONFIG_SITE" elif test "x$prefix" != xNONE; then ac_site_files="$prefix/share/config.site $prefix/etc/config.site" else ac_site_files="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site" fi for ac_site_file in $ac_site_files do case $ac_site_file in #( */*) : ;; #( *) : ac_site_file=./$ac_site_file ;; esac if test -f "$ac_site_file" && test -r "$ac_site_file"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 printf "%s\n" "$as_me: loading site script $ac_site_file" >&6;} sed 's/^/| /' "$ac_site_file" >&5 . "$ac_site_file" \ || { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "failed to load site script $ac_site_file See \`config.log' for more details" "$LINENO" 5; } fi done if test -r "$cache_file"; then # Some versions of bash will fail to source /dev/null (special files # actually), so we avoid doing that. DJGPP emulates it as a regular file. if test /dev/null != "$cache_file" && test -f "$cache_file"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 printf "%s\n" "$as_me: loading cache $cache_file" >&6;} case $cache_file in [\\/]* | ?:[\\/]* ) . "$cache_file";; *) . "./$cache_file";; esac fi else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 printf "%s\n" "$as_me: creating cache $cache_file" >&6;} >$cache_file fi # Test code for whether the C compiler supports C89 (global declarations) ac_c_conftest_c89_globals=' /* Does the compiler advertise C89 conformance? Do not test the value of __STDC__, because some compilers set it to 0 while being otherwise adequately conformant. */ #if !defined __STDC__ # error "Compiler does not advertise C89 conformance" #endif #include #include struct stat; /* Most of the following tests are stolen from RCS 5.7 src/conf.sh. */ struct buf { int x; }; struct buf * (*rcsopen) (struct buf *, struct stat *, int); static char *e (p, i) char **p; int i; { return p[i]; } static char *f (char * (*g) (char **, int), char **p, ...) { char *s; va_list v; va_start (v,p); s = g (p, va_arg (v,int)); va_end (v); return s; } /* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has function prototypes and stuff, but not \xHH hex character constants. These do not provoke an error unfortunately, instead are silently treated as an "x". The following induces an error, until -std is added to get proper ANSI mode. Curiously \x00 != x always comes out true, for an array size at least. It is necessary to write \x00 == 0 to get something that is true only with -std. */ int osf4_cc_array ['\''\x00'\'' == 0 ? 1 : -1]; /* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters inside strings and character constants. */ #define FOO(x) '\''x'\'' int xlc6_cc_array[FOO(a) == '\''x'\'' ? 1 : -1]; int test (int i, double x); struct s1 {int (*f) (int a);}; struct s2 {int (*f) (double a);}; int pairnames (int, char **, int *(*)(struct buf *, struct stat *, int), int, int);' # Test code for whether the C compiler supports C89 (body of main). ac_c_conftest_c89_main=' ok |= (argc == 0 || f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]); ' # Test code for whether the C compiler supports C99 (global declarations) ac_c_conftest_c99_globals=' // Does the compiler advertise C99 conformance? #if !defined __STDC_VERSION__ || __STDC_VERSION__ < 199901L # error "Compiler does not advertise C99 conformance" #endif #include extern int puts (const char *); extern int printf (const char *, ...); extern int dprintf (int, const char *, ...); extern void *malloc (size_t); // Check varargs macros. These examples are taken from C99 6.10.3.5. // dprintf is used instead of fprintf to avoid needing to declare // FILE and stderr. #define debug(...) dprintf (2, __VA_ARGS__) #define showlist(...) puts (#__VA_ARGS__) #define report(test,...) ((test) ? puts (#test) : printf (__VA_ARGS__)) static void test_varargs_macros (void) { int x = 1234; int y = 5678; debug ("Flag"); debug ("X = %d\n", x); showlist (The first, second, and third items.); report (x>y, "x is %d but y is %d", x, y); } // Check long long types. #define BIG64 18446744073709551615ull #define BIG32 4294967295ul #define BIG_OK (BIG64 / BIG32 == 4294967297ull && BIG64 % BIG32 == 0) #if !BIG_OK #error "your preprocessor is broken" #endif #if BIG_OK #else #error "your preprocessor is broken" #endif static long long int bignum = -9223372036854775807LL; static unsigned long long int ubignum = BIG64; struct incomplete_array { int datasize; double data[]; }; struct named_init { int number; const wchar_t *name; double average; }; typedef const char *ccp; static inline int test_restrict (ccp restrict text) { // See if C++-style comments work. // Iterate through items via the restricted pointer. // Also check for declarations in for loops. for (unsigned int i = 0; *(text+i) != '\''\0'\''; ++i) continue; return 0; } // Check varargs and va_copy. static bool test_varargs (const char *format, ...) { va_list args; va_start (args, format); va_list args_copy; va_copy (args_copy, args); const char *str = ""; int number = 0; float fnumber = 0; while (*format) { switch (*format++) { case '\''s'\'': // string str = va_arg (args_copy, const char *); break; case '\''d'\'': // int number = va_arg (args_copy, int); break; case '\''f'\'': // float fnumber = va_arg (args_copy, double); break; default: break; } } va_end (args_copy); va_end (args); return *str && number && fnumber; } ' # Test code for whether the C compiler supports C99 (body of main). ac_c_conftest_c99_main=' // Check bool. _Bool success = false; success |= (argc != 0); // Check restrict. if (test_restrict ("String literal") == 0) success = true; char *restrict newvar = "Another string"; // Check varargs. success &= test_varargs ("s, d'\'' f .", "string", 65, 34.234); test_varargs_macros (); // Check flexible array members. struct incomplete_array *ia = malloc (sizeof (struct incomplete_array) + (sizeof (double) * 10)); ia->datasize = 10; for (int i = 0; i < ia->datasize; ++i) ia->data[i] = i * 1.234; // Check named initializers. struct named_init ni = { .number = 34, .name = L"Test wide string", .average = 543.34343, }; ni.number = 58; int dynamic_array[ni.number]; dynamic_array[0] = argv[0][0]; dynamic_array[ni.number - 1] = 543; // work around unused variable warnings ok |= (!success || bignum == 0LL || ubignum == 0uLL || newvar[0] == '\''x'\'' || dynamic_array[ni.number - 1] != 543); ' # Test code for whether the C compiler supports C11 (global declarations) ac_c_conftest_c11_globals=' // Does the compiler advertise C11 conformance? #if !defined __STDC_VERSION__ || __STDC_VERSION__ < 201112L # error "Compiler does not advertise C11 conformance" #endif // Check _Alignas. char _Alignas (double) aligned_as_double; char _Alignas (0) no_special_alignment; extern char aligned_as_int; char _Alignas (0) _Alignas (int) aligned_as_int; // Check _Alignof. enum { int_alignment = _Alignof (int), int_array_alignment = _Alignof (int[100]), char_alignment = _Alignof (char) }; _Static_assert (0 < -_Alignof (int), "_Alignof is signed"); // Check _Noreturn. int _Noreturn does_not_return (void) { for (;;) continue; } // Check _Static_assert. struct test_static_assert { int x; _Static_assert (sizeof (int) <= sizeof (long int), "_Static_assert does not work in struct"); long int y; }; // Check UTF-8 literals. #define u8 syntax error! char const utf8_literal[] = u8"happens to be ASCII" "another string"; // Check duplicate typedefs. typedef long *long_ptr; typedef long int *long_ptr; typedef long_ptr long_ptr; // Anonymous structures and unions -- taken from C11 6.7.2.1 Example 1. struct anonymous { union { struct { int i; int j; }; struct { int k; long int l; } w; }; int m; } v1; ' # Test code for whether the C compiler supports C11 (body of main). ac_c_conftest_c11_main=' _Static_assert ((offsetof (struct anonymous, i) == offsetof (struct anonymous, w.k)), "Anonymous union alignment botch"); v1.i = 2; v1.w.k = 5; ok |= v1.i != 5; ' # Test code for whether the C compiler supports C11 (complete). ac_c_conftest_c11_program="${ac_c_conftest_c89_globals} ${ac_c_conftest_c99_globals} ${ac_c_conftest_c11_globals} int main (int argc, char **argv) { int ok = 0; ${ac_c_conftest_c89_main} ${ac_c_conftest_c99_main} ${ac_c_conftest_c11_main} return ok; } " # Test code for whether the C compiler supports C99 (complete). ac_c_conftest_c99_program="${ac_c_conftest_c89_globals} ${ac_c_conftest_c99_globals} int main (int argc, char **argv) { int ok = 0; ${ac_c_conftest_c89_main} ${ac_c_conftest_c99_main} return ok; } " # Test code for whether the C compiler supports C89 (complete). ac_c_conftest_c89_program="${ac_c_conftest_c89_globals} int main (int argc, char **argv) { int ok = 0; ${ac_c_conftest_c89_main} return ok; } " # Test code for whether the C++ compiler supports C++98 (global declarations) ac_cxx_conftest_cxx98_globals=' // Does the compiler advertise C++98 conformance? #if !defined __cplusplus || __cplusplus < 199711L # error "Compiler does not advertise C++98 conformance" #endif // These inclusions are to reject old compilers that // lack the unsuffixed header files. #include #include // and are *not* freestanding headers in C++98. extern void assert (int); namespace std { extern int strcmp (const char *, const char *); } // Namespaces, exceptions, and templates were all added after "C++ 2.0". using std::exception; using std::strcmp; namespace { void test_exception_syntax() { try { throw "test"; } catch (const char *s) { // Extra parentheses suppress a warning when building autoconf itself, // due to lint rules shared with more typical C programs. assert (!(strcmp) (s, "test")); } } template struct test_template { T const val; explicit test_template(T t) : val(t) {} template T add(U u) { return static_cast(u) + val; } }; } // anonymous namespace ' # Test code for whether the C++ compiler supports C++98 (body of main) ac_cxx_conftest_cxx98_main=' assert (argc); assert (! argv[0]); { test_exception_syntax (); test_template tt (2.0); assert (tt.add (4) == 6.0); assert (true && !false); } ' # Test code for whether the C++ compiler supports C++11 (global declarations) ac_cxx_conftest_cxx11_globals=' // Does the compiler advertise C++ 2011 conformance? #if !defined __cplusplus || __cplusplus < 201103L # error "Compiler does not advertise C++11 conformance" #endif namespace cxx11test { constexpr int get_val() { return 20; } struct testinit { int i; double d; }; class delegate { public: delegate(int n) : n(n) {} delegate(): delegate(2354) {} virtual int getval() { return this->n; }; protected: int n; }; class overridden : public delegate { public: overridden(int n): delegate(n) {} virtual int getval() override final { return this->n * 2; } }; class nocopy { public: nocopy(int i): i(i) {} nocopy() = default; nocopy(const nocopy&) = delete; nocopy & operator=(const nocopy&) = delete; private: int i; }; // for testing lambda expressions template Ret eval(Fn f, Ret v) { return f(v); } // for testing variadic templates and trailing return types template auto sum(V first) -> V { return first; } template auto sum(V first, Args... rest) -> V { return first + sum(rest...); } } ' # Test code for whether the C++ compiler supports C++11 (body of main) ac_cxx_conftest_cxx11_main=' { // Test auto and decltype auto a1 = 6538; auto a2 = 48573953.4; auto a3 = "String literal"; int total = 0; for (auto i = a3; *i; ++i) { total += *i; } decltype(a2) a4 = 34895.034; } { // Test constexpr short sa[cxx11test::get_val()] = { 0 }; } { // Test initializer lists cxx11test::testinit il = { 4323, 435234.23544 }; } { // Test range-based for int array[] = {9, 7, 13, 15, 4, 18, 12, 10, 5, 3, 14, 19, 17, 8, 6, 20, 16, 2, 11, 1}; for (auto &x : array) { x += 23; } } { // Test lambda expressions using cxx11test::eval; assert (eval ([](int x) { return x*2; }, 21) == 42); double d = 2.0; assert (eval ([&](double x) { return d += x; }, 3.0) == 5.0); assert (d == 5.0); assert (eval ([=](double x) mutable { return d += x; }, 4.0) == 9.0); assert (d == 5.0); } { // Test use of variadic templates using cxx11test::sum; auto a = sum(1); auto b = sum(1, 2); auto c = sum(1.0, 2.0, 3.0); } { // Test constructor delegation cxx11test::delegate d1; cxx11test::delegate d2(); cxx11test::delegate d3(45); } { // Test override and final cxx11test::overridden o1(55464); } { // Test nullptr char *c = nullptr; } { // Test template brackets test_template<::test_template> v(test_template(12)); } { // Unicode literals char const *utf8 = u8"UTF-8 string \u2500"; char16_t const *utf16 = u"UTF-8 string \u2500"; char32_t const *utf32 = U"UTF-32 string \u2500"; } ' # Test code for whether the C compiler supports C++11 (complete). ac_cxx_conftest_cxx11_program="${ac_cxx_conftest_cxx98_globals} ${ac_cxx_conftest_cxx11_globals} int main (int argc, char **argv) { int ok = 0; ${ac_cxx_conftest_cxx98_main} ${ac_cxx_conftest_cxx11_main} return ok; } " # Test code for whether the C compiler supports C++98 (complete). ac_cxx_conftest_cxx98_program="${ac_cxx_conftest_cxx98_globals} int main (int argc, char **argv) { int ok = 0; ${ac_cxx_conftest_cxx98_main} return ok; } " as_fn_append ac_header_c_list " stdio.h stdio_h HAVE_STDIO_H" as_fn_append ac_header_c_list " stdlib.h stdlib_h HAVE_STDLIB_H" as_fn_append ac_header_c_list " string.h string_h HAVE_STRING_H" as_fn_append ac_header_c_list " inttypes.h inttypes_h HAVE_INTTYPES_H" as_fn_append ac_header_c_list " stdint.h stdint_h HAVE_STDINT_H" as_fn_append ac_header_c_list " strings.h strings_h HAVE_STRINGS_H" as_fn_append ac_header_c_list " sys/stat.h sys_stat_h HAVE_SYS_STAT_H" as_fn_append ac_header_c_list " sys/types.h sys_types_h HAVE_SYS_TYPES_H" as_fn_append ac_header_c_list " unistd.h unistd_h HAVE_UNISTD_H" # Auxiliary files required by this configure script. ac_aux_files="config.guess config.sub" # Locations in which to look for auxiliary files. ac_aux_dir_candidates="${srcdir}/config" # Search for a directory containing all of the required auxiliary files, # $ac_aux_files, from the $PATH-style list $ac_aux_dir_candidates. # If we don't find one directory that contains all the files we need, # we report the set of missing files from the *first* directory in # $ac_aux_dir_candidates and give up. ac_missing_aux_files="" ac_first_candidate=: printf "%s\n" "$as_me:${as_lineno-$LINENO}: looking for aux files: $ac_aux_files" >&5 as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_found=false for as_dir in $ac_aux_dir_candidates do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac as_found=: printf "%s\n" "$as_me:${as_lineno-$LINENO}: trying $as_dir" >&5 ac_aux_dir_found=yes ac_install_sh= for ac_aux in $ac_aux_files do # As a special case, if "install-sh" is required, that requirement # can be satisfied by any of "install-sh", "install.sh", or "shtool", # and $ac_install_sh is set appropriately for whichever one is found. if test x"$ac_aux" = x"install-sh" then if test -f "${as_dir}install-sh"; then printf "%s\n" "$as_me:${as_lineno-$LINENO}: ${as_dir}install-sh found" >&5 ac_install_sh="${as_dir}install-sh -c" elif test -f "${as_dir}install.sh"; then printf "%s\n" "$as_me:${as_lineno-$LINENO}: ${as_dir}install.sh found" >&5 ac_install_sh="${as_dir}install.sh -c" elif test -f "${as_dir}shtool"; then printf "%s\n" "$as_me:${as_lineno-$LINENO}: ${as_dir}shtool found" >&5 ac_install_sh="${as_dir}shtool install -c" else ac_aux_dir_found=no if $ac_first_candidate; then ac_missing_aux_files="${ac_missing_aux_files} install-sh" else break fi fi else if test -f "${as_dir}${ac_aux}"; then printf "%s\n" "$as_me:${as_lineno-$LINENO}: ${as_dir}${ac_aux} found" >&5 else ac_aux_dir_found=no if $ac_first_candidate; then ac_missing_aux_files="${ac_missing_aux_files} ${ac_aux}" else break fi fi fi done if test "$ac_aux_dir_found" = yes; then ac_aux_dir="$as_dir" break fi ac_first_candidate=false as_found=false done IFS=$as_save_IFS if $as_found then : else $as_nop as_fn_error $? "cannot find required auxiliary files:$ac_missing_aux_files" "$LINENO" 5 fi # These three variables are undocumented and unsupported, # and are intended to be withdrawn in a future Autoconf release. # They can cause serious problems if a builder's source tree is in a directory # whose full name contains unusual characters. if test -f "${ac_aux_dir}config.guess"; then ac_config_guess="$SHELL ${ac_aux_dir}config.guess" fi if test -f "${ac_aux_dir}config.sub"; then ac_config_sub="$SHELL ${ac_aux_dir}config.sub" fi if test -f "$ac_aux_dir/configure"; then ac_configure="$SHELL ${ac_aux_dir}configure" fi # Check that the precious variables saved in the cache have kept the same # value. ac_cache_corrupted=false for ac_var in $ac_precious_vars; do eval ac_old_set=\$ac_cv_env_${ac_var}_set eval ac_new_set=\$ac_env_${ac_var}_set eval ac_old_val=\$ac_cv_env_${ac_var}_value eval ac_new_val=\$ac_env_${ac_var}_value case $ac_old_set,$ac_new_set in set,) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 printf "%s\n" "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} ac_cache_corrupted=: ;; ,set) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 printf "%s\n" "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} ac_cache_corrupted=: ;; ,);; *) if test "x$ac_old_val" != "x$ac_new_val"; then # differences in whitespace do not lead to failure. ac_old_val_w=`echo x $ac_old_val` ac_new_val_w=`echo x $ac_new_val` if test "$ac_old_val_w" != "$ac_new_val_w"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 printf "%s\n" "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} ac_cache_corrupted=: else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 printf "%s\n" "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} eval $ac_var=\$ac_old_val fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 printf "%s\n" "$as_me: former value: \`$ac_old_val'" >&2;} { printf "%s\n" "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 printf "%s\n" "$as_me: current value: \`$ac_new_val'" >&2;} fi;; esac # Pass precious variables to config.status. if test "$ac_new_set" = set; then case $ac_new_val in *\'*) ac_arg=$ac_var=`printf "%s\n" "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; *) ac_arg=$ac_var=$ac_new_val ;; esac case " $ac_configure_args " in *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. *) as_fn_append ac_configure_args " '$ac_arg'" ;; esac fi done if $ac_cache_corrupted; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 printf "%s\n" "$as_me: error: changes in the environment can compromise the build" >&2;} as_fn_error $? "run \`${MAKE-make} distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 fi ## -------------------- ## ## Main body of script. ## ## -------------------- ## ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_config_headers="$ac_config_headers HYPRE_config.h:config/HYPRE_config.h.in" HYPRE_NAME="hypre" HYPRE_VERSION="2.33.0" HYPRE_NUMBER=23300 HYPRE_DATE="2025/04/03" HYPRE_TIME="00:00:00" HYPRE_BUGS="https://github.com/hypre-space/hypre/issues" HYPRE_SRCDIR="`pwd`" printf "%s\n" "#define HYPRE_RELEASE_NAME \"$HYPRE_NAME\"" >>confdefs.h printf "%s\n" "#define HYPRE_RELEASE_VERSION \"$HYPRE_VERSION\"" >>confdefs.h printf "%s\n" "#define HYPRE_RELEASE_NUMBER $HYPRE_NUMBER" >>confdefs.h printf "%s\n" "#define HYPRE_RELEASE_DATE \"$HYPRE_DATE\"" >>confdefs.h printf "%s\n" "#define HYPRE_RELEASE_TIME \"$HYPRE_TIME\"" >>confdefs.h printf "%s\n" "#define HYPRE_RELEASE_BUGS \"$HYPRE_BUGS\"" >>confdefs.h if test -d "$HYPRE_SRCDIR/../.git" then : develop_string=$(git -C $HYPRE_SRCDIR describe --match 'v*' --long --abbrev=9) develop_lastag=$(git -C $HYPRE_SRCDIR describe --match 'v*' --abbrev=0) develop_number=$(git -C $HYPRE_SRCDIR rev-list --count $develop_lastag..HEAD) develop_branch=$(git -C $HYPRE_SRCDIR rev-parse --abbrev-ref HEAD) if test -n "$develop_string" then : printf "%s\n" "#define HYPRE_DEVELOP_STRING \"$develop_string\"" >>confdefs.h printf "%s\n" "#define HYPRE_DEVELOP_NUMBER $develop_number" >>confdefs.h printf "%s\n" "#define HYPRE_BRANCH_NAME \"$develop_branch\"" >>confdefs.h if test "x$develop_branch" = "xmaster" then : printf "%s\n" "#define HYPRE_DEVELOP_BRANCH \"$develop_branch\"" >>confdefs.h else $as_nop { printf "%s\n" "$as_me:${as_lineno-$LINENO}: NOTE: On branch $develop_branch, not the main development branch" >&5 printf "%s\n" "$as_me: NOTE: On branch $develop_branch, not the main development branch" >&6;} fi else $as_nop { printf "%s\n" "$as_me:${as_lineno-$LINENO}: NOTE: Could not describe development branch" >&5 printf "%s\n" "$as_me: NOTE: Could not describe development branch" >&6;} fi else $as_nop { printf "%s\n" "$as_me:${as_lineno-$LINENO}: NOTE: Could not find .git directory" >&5 printf "%s\n" "$as_me: NOTE: Could not find .git directory" >&6;} fi PACKAGE_DATE= PACKAGE_TIME= PACKAGE_DATETIME= PACKAGE_NAME= PACKAGE_VERSION= PACKAGE_STRING= PACKAGE_TARNAME= PACKAGE_BUGREPORT= hypre_user_chose_mpi=no hypre_user_chose_blas=no hypre_user_chose_lapack=no hypre_user_chose_raja=no hypre_using_raja=no hypre_user_chose_kokkos=no hypre_using_kokkos=no hypre_using_c=yes hypre_using_cxx=yes hypre_using_mpi=yes hypre_using_distributed_ls=yes hypre_using_superlu=no hypre_using_dsuperlu=no hypre_using_fei=no hypre_using_mli=no hypre_using_openmp=no hypre_using_device_openmp=no hypre_using_cuda=no hypre_using_gpu=no hypre_using_um=no hypre_gpu_mpi=no hypre_using_gpu_profiling=no hypre_using_cuda_streams=no hypre_using_cusparse=no hypre_using_cublas=no hypre_using_curand=no hypre_using_cusolver=no hypre_using_device_pool=no hypre_using_device_malloc_async=no hypre_using_thrust_nosync=no hypre_using_umpire=no hypre_using_umpire_host=no hypre_using_umpire_device=no hypre_using_umpire_um=no hypre_using_umpire_pinned=no hypre_using_caliper=no hypre_user_gave_caliper_lib=no hypre_user_gave_caliper_inc=no hypre_found_cuda=no hypre_using_node_aware_mpi=no hypre_using_memory_tracker=no hypre_test_using_host=no hypre_cxxstd=11 hypre_using_magma=no hypre_user_gave_magma_inc=no hypre_user_gave_magma_lib=no hypre_user_gave_magma_libs=no hypre_user_gave_magma_lib_dirs=no hypre_using_hip=no hypre_using_rocsparse=no hypre_using_rocblas=no hypre_using_rocsolver=no hypre_using_rocrand=no hypre_found_hip=no hypre_using_sycl=no hypre_using_onemklsparse=no hypre_using_onemklblas=no hypre_using_onemklrand=no hypre_found_mkl=no hypre_blas_lib_old_style=no hypre_blas_lib_dir_old_style=no hypre_lapack_lib_old_style=no hypre_lapack_lib_dir_old_style=no if test "x$build_alias" = "x" then # Make sure we can run config.sub. $SHELL "${ac_aux_dir}config.sub" sun4 >/dev/null 2>&1 || as_fn_error $? "cannot run $SHELL ${ac_aux_dir}config.sub" "$LINENO" 5 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking build system type" >&5 printf %s "checking build system type... " >&6; } if test ${ac_cv_build+y} then : printf %s "(cached) " >&6 else $as_nop ac_build_alias=$build_alias test "x$ac_build_alias" = x && ac_build_alias=`$SHELL "${ac_aux_dir}config.guess"` test "x$ac_build_alias" = x && as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5 ac_cv_build=`$SHELL "${ac_aux_dir}config.sub" $ac_build_alias` || as_fn_error $? "$SHELL ${ac_aux_dir}config.sub $ac_build_alias failed" "$LINENO" 5 fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5 printf "%s\n" "$ac_cv_build" >&6; } case $ac_cv_build in *-*-*) ;; *) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;; esac build=$ac_cv_build ac_save_IFS=$IFS; IFS='-' set x $ac_cv_build shift build_cpu=$1 build_vendor=$2 shift; shift # Remember, the first character of IFS is used to create $*, # except with old shells: build_os=$* IFS=$ac_save_IFS case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac fi if test "x$host_alias" = "x" then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking host system type" >&5 printf %s "checking host system type... " >&6; } if test ${ac_cv_host+y} then : printf %s "(cached) " >&6 else $as_nop if test "x$host_alias" = x; then ac_cv_host=$ac_cv_build else ac_cv_host=`$SHELL "${ac_aux_dir}config.sub" $host_alias` || as_fn_error $? "$SHELL ${ac_aux_dir}config.sub $host_alias failed" "$LINENO" 5 fi fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5 printf "%s\n" "$ac_cv_host" >&6; } case $ac_cv_host in *-*-*) ;; *) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;; esac host=$ac_cv_host ac_save_IFS=$IFS; IFS='-' set x $ac_cv_host shift host_cpu=$1 host_vendor=$2 shift; shift # Remember, the first character of IFS is used to create $*, # except with old shells: host_os=$* IFS=$ac_save_IFS case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac fi if test "x$target_alias" = "x" then target_alias=$host_alias fi # Check whether --enable-debug was given. if test ${enable_debug+y} then : enableval=$enable_debug; case "${enableval}" in yes) hypre_using_debug=yes ;; no) hypre_using_debug=no ;; *) as_fn_error $? "Bad value ${enableval} for --enable-debug" "$LINENO" 5 ;; esac else $as_nop hypre_using_debug=no fi # Check whether --enable-shared was given. if test ${enable_shared+y} then : enableval=$enable_shared; case "${enableval}" in yes) hypre_using_shared=yes ;; no) hypre_using_shared=no ;; *) as_fn_error $? "Bad value ${enableval} for --enable-shared" "$LINENO" 5 ;; esac else $as_nop hypre_using_shared=no fi # Check whether --enable-mixedint was given. if test ${enable_mixedint+y} then : enableval=$enable_mixedint; case "${enableval}" in yes) hypre_using_fei=no hypre_using_mixedint=yes hypre_using_distributed_ls=no ;; no) hypre_using_mixedint=no hypre_using_distributed_ls=yes ;; *) as_fn_error $? "Bad value ${enableval} for --enable-mixedint" "$LINENO" 5 ;; esac else $as_nop hypre_using_mixedint=no fi if test "$hypre_using_mixedint" = "yes" then printf "%s\n" "#define HYPRE_MIXEDINT 1" >>confdefs.h fi # Check whether --enable-bigint was given. if test ${enable_bigint+y} then : enableval=$enable_bigint; case "${enableval}" in yes) hypre_using_fei=no hypre_using_bigint=yes ;; no) hypre_using_bigint=no ;; *) as_fn_error $? "Bad value ${enableval} for --enable-bigint" "$LINENO" 5 ;; esac else $as_nop hypre_using_bigint=no fi if test "$hypre_using_bigint" = "yes" then printf "%s\n" "#define HYPRE_BIGINT 1" >>confdefs.h fi # Check whether --enable-single was given. if test ${enable_single+y} then : enableval=$enable_single; case "${enableval}" in yes) hypre_using_fei=no hypre_using_single=yes ;; no) hypre_using_single=no ;; *) as_fn_error $? "Bad value ${enableval} for --enable-single" "$LINENO" 5 ;; esac else $as_nop hypre_using_single=no fi if test "$hypre_using_single" = "yes" then printf "%s\n" "#define HYPRE_SINGLE 1" >>confdefs.h fi # Check whether --enable-longdouble was given. if test ${enable_longdouble+y} then : enableval=$enable_longdouble; case "${enableval}" in yes) hypre_using_fei=no hypre_using_longdouble=yes ;; no) hypre_using_longdouble=no ;; *) as_fn_error $? "Bad value ${enableval} for --enable-longdouble" "$LINENO" 5 ;; esac else $as_nop hypre_using_longdouble=no fi if test "$hypre_using_longdouble" = "yes" then printf "%s\n" "#define HYPRE_LONG_DOUBLE 1" >>confdefs.h fi # Check whether --enable-complex was given. if test ${enable_complex+y} then : enableval=$enable_complex; case "${enableval}" in yes) hypre_using_fei=no hypre_using_complex=yes ;; no) hypre_using_complex=no ;; *) as_fn_error $? "Bad value ${enableval} for --enable-complex" "$LINENO" 5 ;; esac else $as_nop hypre_using_complex=no fi if test "$hypre_using_complex" = "yes" then printf "%s\n" "#define HYPRE_COMPLEX 1" >>confdefs.h fi # Check whether --enable-maxdim was given. if test ${enable_maxdim+y} then : enableval=$enable_maxdim; hypre_maxdim=${enableval} else $as_nop hypre_maxdim=3 fi printf "%s\n" "#define HYPRE_MAXDIM $hypre_maxdim" >>confdefs.h # Check whether --enable-persistent was given. if test ${enable_persistent+y} then : enableval=$enable_persistent; case "${enableval}" in yes) hypre_using_persistent=yes ;; no) hypre_using_persistent=no ;; *) as_fn_error $? "Bad value ${enableval} for --enable-persistent" "$LINENO" 5 ;; esac else $as_nop hypre_using_persistent=no fi if test "$hypre_using_persistent" = "yes" then printf "%s\n" "#define HYPRE_USING_PERSISTENT_COMM 1" >>confdefs.h fi # Check whether --enable-hopscotch was given. if test ${enable_hopscotch+y} then : enableval=$enable_hopscotch; case "${enableval}" in yes) hypre_using_hopscotch=yes ;; no) hypre_using_hopscotch=no ;; *) as_fn_error $? "Bad value ${enableval} for --enable-hopscotch" "$LINENO" 5 ;; esac else $as_nop hypre_using_hopscotch=no fi if test "$hypre_using_hopscotch" = "yes" then printf "%s\n" "#define HYPRE_USING_HOPSCOTCH 1" >>confdefs.h fi # Check whether --enable-fortran was given. if test ${enable_fortran+y} then : enableval=$enable_fortran; case "${enableval}" in yes) hypre_using_fortran=yes ;; no) hypre_using_fortran=no ;; *) hypre_using_fortran=yes ;; esac else $as_nop hypre_using_fortran=yes fi # Check whether --enable-unified-memory was given. if test ${enable_unified_memory+y} then : enableval=$enable_unified_memory; case "${enableval}" in yes) hypre_using_um=yes ;; no) hypre_using_um=no ;; *) hypre_using_um=no ;; esac else $as_nop hypre_using_um=no fi # Check whether --enable-device-memory-pool was given. if test ${enable_device_memory_pool+y} then : enableval=$enable_device_memory_pool; case "${enableval}" in yes) hypre_using_device_pool=yes ;; no) hypre_using_device_pool=no ;; *) hypre_using_device_pool=no ;; esac else $as_nop hypre_using_device_pool=no fi # Check whether --enable-device-malloc-async was given. if test ${enable_device_malloc_async+y} then : enableval=$enable_device_malloc_async; case "${enableval}" in yes) hypre_using_device_malloc_async=yes ;; no) hypre_using_device_malloc_async=no ;; *) hypre_using_device_malloc_async=no ;; esac else $as_nop hypre_using_device_malloc_async=no fi # Check whether --enable-thrust-nosync was given. if test ${enable_thrust_nosync+y} then : enableval=$enable_thrust_nosync; case "${enableval}" in yes) hypre_using_thrust_nosync=yes ;; no) hypre_using_thrust_nosync=no ;; *) hypre_using_thrust_nosync=no ;; esac else $as_nop hypre_using_thrust_nosync=no fi # Check whether --enable-gpu-profiling was given. if test ${enable_gpu_profiling+y} then : enableval=$enable_gpu_profiling; case "${enableval}" in yes) hypre_using_gpu_profiling=yes ;; no) hypre_using_gpu_profiling=no ;; *) hypre_using_gpu_profiling=no ;; esac else $as_nop hypre_using_gpu_profiling=no fi # Check whether --enable-gpu-aware-mpi was given. if test ${enable_gpu_aware_mpi+y} then : enableval=$enable_gpu_aware_mpi; case "${enableval}" in yes) hypre_gpu_mpi=yes ;; no) hypre_gpu_mpi=no ;; *) as_fn_error $? "Bad value ${enableval} for --enable-gpu-aware-mpi" "$LINENO" 5 ;; esac else $as_nop hypre_gpu_mpi=no fi if test "x$LDFLAGS" = "x" then hypre_user_chose_ldflags=no else hypre_user_chose_ldflags=yes fi if test "x$CC" = "x" then hypre_user_chose_ccompilers=no else hypre_user_chose_ccompilers=yes fi if test "x$CFLAGS" = "x" then hypre_user_chose_cflags=no else hypre_user_chose_cflags=yes fi if test "x$CXX" = "x" then hypre_user_chose_cxxcompilers=no else hypre_user_chose_cxxcompilers=yes fi if test "x$CXXFLAGS" = "x" then hypre_user_chose_cxxflags=no else hypre_user_chose_cxxflags=yes fi if test "x$CUCC" = "x" then hypre_user_chose_cudacompilers=no else hypre_user_chose_cudacompilers=yes fi if test "x$CUFLAGS" = "x" then hypre_user_chose_cuflags=no else hypre_user_chose_cuflags=yes fi if test "x$F77" != "x" && test "x$FC" = "x" then FC="$F77" fi if test "x$FC" = "x" then hypre_user_chose_fcompilers=no else hypre_user_chose_fcompilers=yes fi if test "x$F77FLAGS" != "x" then FCFLAGS="$F77FLAGS $FCFLAGS" fi if test "x$FFLAGS" = "x" || test "x$FCFLAGS" = "x" then hypre_user_chose_fflags=no else hypre_user_chose_fflags=yes fi if test "x$AR" = "x" then AR="ar -rcu" fi # Check whether --with-cxxstandard was given. if test ${with_cxxstandard+y} then : withval=$with_cxxstandard; hypre_cxxstd=$withval fi # Check whether --with-LD was given. if test ${with_LD+y} then : withval=$with_LD; LD=$withval fi # Check whether --with-LDFLAGS was given. if test ${with_LDFLAGS+y} then : withval=$with_LDFLAGS; LDFLAGS=$withval fi # Check whether --with-extra-CFLAGS was given. if test ${with_extra_CFLAGS+y} then : withval=$with_extra_CFLAGS; EXTRA_CFLAGS=$withval fi # Check whether --with-extra-CXXFLAGS was given. if test ${with_extra_CXXFLAGS+y} then : withval=$with_extra_CXXFLAGS; EXTRA_CXXFLAGS=$withval fi # Check whether --with-extra-CUFLAGS was given. if test ${with_extra_CUFLAGS+y} then : withval=$with_extra_CUFLAGS; EXTRA_CUFLAGS=$withval fi # Check whether --with-extra-BUILDFLAGS was given. if test ${with_extra_BUILDFLAGS+y} then : withval=$with_extra_BUILDFLAGS; EXTRA_BUILDFLAGS=$withval fi # Check whether --with-extra-incpath was given. if test ${with_extra_incpath+y} then : withval=$with_extra_incpath; CCFLAGS="${CCFLAGS} -I`echo ${withval}|sed 's/ /\ -I/g'`" fi # Check whether --with-extra-ldpath was given. if test ${with_extra_ldpath+y} then : withval=$with_extra_ldpath; LDFLAGS="-L`echo ${withval}|sed 's/ /\ -L/g'` ${LDFLAGS}" fi # Check whether --with-strict-checking was given. if test ${with_strict_checking+y} then : withval=$with_strict_checking; case "${withval}" in yes) hypre_user_chose_ccompilers=yes hypre_user_chose_cflags=yes hypre_user_chose_cxxcompilers=yes hypre_user_chose_cxxflags=yes hypre_user_chose_fcompilers=yes hypre_user_chose_fflags=yes hypre_using_debug=yes hypre_using_mpi=no for ac_prog in gcc g++ icc icpc pgcc pgCC xlc xlC kcc KCC do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_CC+y} then : printf %s "(cached) " >&6 else $as_nop if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_CC="$ac_prog" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 printf "%s\n" "$CC" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi test -n "$CC" && break done test -n "$CC" || CC="""" if test "x$CC" = "x" then hypre_using_c=no CFLAGS="" elif test "x$GCC" = "xyes" || test "x$CC" = "xgcc"; then FFLAGS="-g -Wall" CFLAGS="-g -Wall -std=gnu99 -pedantic -Wfloat-conversion -fsingle-precision-constant" CXXFLAGS="-g -Wall -Wshadow -fno-implicit-templates" CXXFLAGS="$CXXFLAGS -Woverloaded-virtual -ansi -pedantic" elif test "x$CC" = "xicc"; then FFLAGS="-g -Wall" CFLAGS="-g -Xc -Wall -x c" CXXFLAGS="-g -Xc -Wall -x c++" elif test "x$CC" = "xpgcc"; then FFLAGS="-g -Wall" CFLAGS="-g -Xa -Minform,inform" CXXFLAGS="-g -A --display_error_number -Minform,inform" elif test "x$CC" = "xxlc"; then FFLAGS="-g -Wall" CFLAGS="-g -qinfo=dcl:eff:pro:rea:ret:use" CXXFLAGS="-g -qinfo=dcl:eff:obs:pro:rea:ret:use" elif test "x$CC" = "xKCC" || test "x$CC" = "xkcc"; then FFLAGS="-g -Wall" CFLAGS="-g --c --strict --lint --display_error_number" CFLAGS="$CFLAGS --diag_suppress 45,236,450,826" CFLAGS="$CFLAGS,1018,1021,1022,1023,1024,1030,1041" CXXFLAGS="-g --strict --lint --display_error_number" CXXFLAGS="$CXXFLAGS --diag_suppress 381,450,1023,1024" fi for ac_prog in g++ gcc icpc icc pgCC pgcc xlC xlc KCC kcc do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_CXX+y} then : printf %s "(cached) " >&6 else $as_nop if test -n "$CXX"; then ac_cv_prog_CXX="$CXX" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_CXX="$ac_prog" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CXX=$ac_cv_prog_CXX if test -n "$CXX"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CXX" >&5 printf "%s\n" "$CXX" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi test -n "$CXX" && break done test -n "$CXX" || CXX="""" if test "x$CXX" = "x" then hypre_using_cxx=no CXXFLAGS="" fi if test "$hypre_using_fortran" = "yes" then for ac_prog in g77 ifort pgf77 xlf do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_FC+y} then : printf %s "(cached) " >&6 else $as_nop if test -n "$FC"; then ac_cv_prog_FC="$FC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_FC="$ac_prog" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi FC=$ac_cv_prog_FC if test -n "$FC"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $FC" >&5 printf "%s\n" "$FC" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi test -n "$FC" && break done test -n "$FC" || FC="""" if test "x$FC" = "x" then hypre_using_fortran=no FFLAGS="" fi fi printf "%s\n" "#define HYPRE_SEQUENTIAL 1" >>confdefs.h ;; esac fi # Check whether --with-MPI-include was given. if test ${with_MPI_include+y} then : withval=$with_MPI_include; for mpi_dir in $withval; do MPIINCLUDE="$MPIINCLUDE -I$mpi_dir" done; hypre_user_chose_mpi=yes else $as_nop hypre_user_chose_mpi=no fi # Check whether --with-MPI-libs was given. if test ${with_MPI_libs+y} then : withval=$with_MPI_libs; for mpi_lib in $withval; do MPILIBS="$MPILIBS -l$mpi_lib" done; hypre_user_chose_mpi=yes fi # Check whether --with-MPI-lib-dirs was given. if test ${with_MPI_lib_dirs+y} then : withval=$with_MPI_lib_dirs; for mpi_lib_dir in $withval; do MPILIBDIRS="-L$mpi_lib_dir $MPILIBDIRS" done; hypre_user_chose_mpi=yes fi # Check whether --with-MPI-flags was given. if test ${with_MPI_flags+y} then : withval=$with_MPI_flags; case "${withval}" in yes) MPIFLAGS="" ;; no) MPIFLAGS="" ;; *) MPIFLAGS=$withval ;; esac else $as_nop MPIFLAGS="" fi # Check whether --with-node-aware-mpi was given. if test ${with_node_aware_mpi+y} then : withval=$with_node_aware_mpi; case "$withval" in yes) hypre_using_node_aware_mpi=yes;; no) hypre_using_node_aware_mpi=no ;; *) hypre_using_node_aware_mpi=no ;; esac else $as_nop hypre_using_node_aware_mpi=no fi # Check whether --with-node-aware-mpi-include was given. if test ${with_node_aware_mpi_include+y} then : withval=$with_node_aware_mpi_include; for nap_dir in $withval; do HYPRE_NAP_INCLUDE="$HYPRE_NAP_INCLUDE -I$nap_dir" done; hypre_using_node_aware_mpi=yes fi # Check whether --with-memory_tracker was given. if test ${with_memory_tracker+y} then : withval=$with_memory_tracker; case "$withval" in yes) hypre_using_memory_tracker=yes;; no) hypre_using_memory_tracker=no ;; *) hypre_using_memory_tracker=no ;; esac else $as_nop hypre_using_memory_tracker=no fi # Check whether --with-test_using_host was given. if test ${with_test_using_host+y} then : withval=$with_test_using_host; case "$withval" in yes) hypre_test_using_host=yes;; no) hypre_test_using_host=no ;; *) hypre_test_using_host=no ;; esac else $as_nop hypre_test_using_host=no fi # Check whether --with-blas-lib was given. if test ${with_blas_lib+y} then : withval=$with_blas_lib; for blas_lib in $withval; do BLASLIBS="$BLASLIBS $blas_lib" done; hypre_user_chose_blas=yes fi # Check whether --with-blas-libs was given. if test ${with_blas_libs+y} then : withval=$with_blas_libs; for blas_lib in $withval; do BLASLIBS="$BLASLIBS -l$blas_lib" done; hypre_user_chose_blas=yes hypre_blas_lib_old_style=yes fi # Check whether --with-blas-lib-dirs was given. if test ${with_blas_lib_dirs+y} then : withval=$with_blas_lib_dirs; for blas_lib_dir in $withval; do BLASLIBDIRS="-L$blas_lib_dir $BLASLIBDIRS" done; hypre_user_chose_blas=yes hypre_blas_lib_dir_old_style=yes fi # Check whether --with-lapack-lib was given. if test ${with_lapack_lib+y} then : withval=$with_lapack_lib; for lapack_lib in $withval; do LAPACKLIBS="$LAPACKLIBS $lapack_lib" done; hypre_user_chose_lapack=yes fi # Check whether --with-lapack-libs was given. if test ${with_lapack_libs+y} then : withval=$with_lapack_libs; for lapack_lib in $withval; do LAPACKLIBS="$LAPACKLIBS -l$lapack_lib" done; hypre_user_chose_lapack=yes hypre_lapack_lib_old_style=yes fi # Check whether --with-lapack-lib-dirs was given. if test ${with_lapack_lib_dirs+y} then : withval=$with_lapack_lib_dirs; for lapack_lib_dir in $withval; do LAPACKLIBDIRS="-L$lapack_lib_dir $LAPACKLIBDIRS" done; hypre_user_chose_lapack=yes hypre_lapack_lib_dir_old_style=yes fi # Check whether --with-fmangle was given. if test ${with_fmangle+y} then : withval=$with_fmangle; hypre_fmangle=0; case "$withval" in no-underscores) hypre_fmangle=1 ;; one-underscore) hypre_fmangle=2 ;; two-underscores) hypre_fmangle=3 ;; caps-no-underscores) hypre_fmangle=4 ;; one-before-after) hypre_fmangle=5 ;; esac else $as_nop hypre_fmangle=0 fi printf "%s\n" "#define HYPRE_FMANGLE $hypre_fmangle" >>confdefs.h # Check whether --with-fmangle-blas was given. if test ${with_fmangle_blas+y} then : withval=$with_fmangle_blas; hypre_fmangle_blas=0; case "$withval" in no-underscores) hypre_fmangle_blas=1 ;; one-underscore) hypre_fmangle_blas=2 ;; two-underscores) hypre_fmangle_blas=3 ;; caps-no-underscores) hypre_fmangle_blas=4 ;; one-before-after) hypre_fmangle_blas=5 ;; esac else $as_nop hypre_fmangle_blas=0 fi printf "%s\n" "#define HYPRE_FMANGLE_BLAS $hypre_fmangle_blas" >>confdefs.h # Check whether --with-fmangle-lapack was given. if test ${with_fmangle_lapack+y} then : withval=$with_fmangle_lapack; hypre_fmangle_lapack=0; case "$withval" in no-underscores) hypre_fmangle_lapack=1 ;; one-underscore) hypre_fmangle_lapack=2 ;; two-underscores) hypre_fmangle_lapack=3 ;; caps-no-underscores) hypre_fmangle_lapack=4 ;; one-before-after) hypre_fmangle_lapack=5 ;; esac else $as_nop hypre_fmangle_lapack=0 fi printf "%s\n" "#define HYPRE_FMANGLE_LAPACK $hypre_fmangle_lapack" >>confdefs.h # Check whether --with-print-errors was given. if test ${with_print_errors+y} then : withval=$with_print_errors; if test "$withval" = "yes" then printf "%s\n" "#define HYPRE_PRINT_ERRORS 1" >>confdefs.h fi fi # Check whether --with-timing was given. if test ${with_timing+y} then : withval=$with_timing; if test "$withval" = "yes" then printf "%s\n" "#define HYPRE_TIMING 1" >>confdefs.h fi fi # Check whether --with-openmp was given. if test ${with_openmp+y} then : withval=$with_openmp; case "${withval}" in yes) hypre_using_openmp=yes;; no) hypre_using_openmp=no ;; esac else $as_nop hypre_using_openmp=no fi # Check whether --with-device-openmp was given. if test ${with_device_openmp+y} then : withval=$with_device_openmp; case "${withval}" in yes) hypre_using_device_openmp=yes ;; no) hypre_using_device_openmp=no ;; esac else $as_nop hypre_using_device_openmp=no fi # Check whether --with-superlu was given. if test ${with_superlu+y} then : withval=$with_superlu; case "${withval}" in no) hypre_using_superlu=no ;; *) hypre_using_superlu=yes ;; esac fi if test "x$with_superlu" = "xyes" then : printf "%s\n" "#define HAVE_SUPERLU 1" >>confdefs.h fi # Check whether --with-superlu-include was given. if test ${with_superlu_include+y} then : withval=$with_superlu_include; for superlu_inc_dir in $withval; do SUPERLU_INCLUDE="-I$superlu_inc_dir $SUPERLU_INCLUDE" done fi # Check whether --with-superlu-lib was given. if test ${with_superlu_lib+y} then : withval=$with_superlu_lib; for superlu_lib in $withval; do SUPERLU_LIBS="$SUPERLU_LIBS $superlu_lib" done fi # Check whether --with-dsuperlu was given. if test ${with_dsuperlu+y} then : withval=$with_dsuperlu; case "${withval}" in no) hypre_using_dsuperlu=no ;; *) hypre_using_dsuperlu=yes ;; esac fi if test "x$with_dsuperlu" = "xyes" then : printf "%s\n" "#define HYPRE_USING_DSUPERLU 1" >>confdefs.h fi # Check whether --with-dsuperlu-include was given. if test ${with_dsuperlu_include+y} then : withval=$with_dsuperlu_include; for dsuperlu_inc_dir in $withval; do DSUPERLU_INCLUDE="-I$dsuperlu_inc_dir $DSUPERLU_INCLUDE" done fi # Check whether --with-dsuperlu-lib was given. if test ${with_dsuperlu_lib+y} then : withval=$with_dsuperlu_lib; for dsuperlu_lib in $withval; do DSUPERLU_LIBS="$DSUPERLU_LIBS $dsuperlu_lib" done fi # Check whether --with-fei-inc-dir was given. if test ${with_fei_inc_dir+y} then : withval=$with_fei_inc_dir; HYPRE_FEI_BASE_DIR="$withval"; hypre_using_fei=yes fi # Check whether --with-mli was given. if test ${with_mli+y} then : withval=$with_mli; case "${withval}" in no) hypre_using_mli=no ;; *) hypre_using_mli=yes ;; esac fi # Check whether --with-MPI was given. if test ${with_MPI+y} then : withval=$with_MPI; case "$withval" in no) hypre_using_mpi=no ;; *) hypre_using_mpi=yes ;; esac fi # Check whether --with-cuda was given. if test ${with_cuda+y} then : withval=$with_cuda; case "$withval" in yes) hypre_using_cuda=yes ;; no) hypre_using_cuda=no ;; *) hypre_using_cuda=no ;; esac else $as_nop hypre_using_cuda=no fi # Check whether --with-hip was given. if test ${with_hip+y} then : withval=$with_hip; case "$withval" in yes) hypre_using_hip=yes ;; no) hypre_using_hip=no ;; *) hypre_using_hip=no ;; esac else $as_nop hypre_using_hip=no fi # Check whether --enable-rocsparse was given. if test ${enable_rocsparse+y} then : enableval=$enable_rocsparse; case "${enableval}" in yes) hypre_using_rocsparse=yes ;; no) hypre_using_rocsparse=no ;; *) hypre_using_rocsparse=yes ;; esac else $as_nop case "$hypre_using_hip" in yes) hypre_using_rocsparse=yes ;; no) hypre_using_rocsparse=no ;; *) hypre_using_rocsparse=no ;; esac fi # Check whether --enable-rocblas was given. if test ${enable_rocblas+y} then : enableval=$enable_rocblas; case "${enableval}" in yes) hypre_using_rocblas=yes ;; no) hypre_using_rocblas=no ;; *) hypre_using_rocblas=no ;; esac else $as_nop hypre_using_rocblas=no fi # Check whether --enable-rocsolver was given. if test ${enable_rocsolver+y} then : enableval=$enable_rocsolver; case "${enableval}" in yes) hypre_using_rocsolver=yes; hypre_using_rocblas=yes ;; no) hypre_using_rocsolver=no ;; *) hypre_using_rocsolver=no ;; esac else $as_nop hypre_using_rocsolver=no fi # Check whether --enable-rocrand was given. if test ${enable_rocrand+y} then : enableval=$enable_rocrand; case "${enableval}" in yes) hypre_using_rocrand=yes ;; no) hypre_using_rocrand=no ;; *) hypre_using_rocrand=yes ;; esac else $as_nop case "$hypre_using_hip" in yes) hypre_using_rocrand=yes ;; no) hypre_using_rocrand=no ;; *) hypre_using_rocrand=no ;; esac fi # Check whether --with-sycl was given. if test ${with_sycl+y} then : withval=$with_sycl; case "$withval" in yes) hypre_using_sycl=yes ;; no) hypre_using_sycl=no ;; *) hypre_using_sycl=no ;; esac else $as_nop hypre_using_sycl=no fi # Check whether --with-cuda-home was given. if test ${with_cuda_home+y} then : withval=$with_cuda_home; for cuda_dir in $withval; do CUDA_HOME="$cuda_dir" done; hypre_using_cuda=yes fi # Check whether --with-gpu-arch was given. if test ${with_gpu_arch+y} then : withval=$with_gpu_arch; if test "x${withval}" != "x" then if test "x${HYPRE_CUDA_SM}" = "x" then HYPRE_CUDA_SM="${withval}" fi fi fi # Check whether --enable-cublas was given. if test ${enable_cublas+y} then : enableval=$enable_cublas; case "${enableval}" in yes) hypre_using_cublas=yes ;; no) hypre_using_cublas=no ;; *) hypre_using_cublas=no ;; esac else $as_nop case "$hypre_using_cuda" in yes) hypre_using_cublas=yes ;; no) hypre_using_cublas=no ;; *) hypre_using_cublas=no ;; esac fi # Check whether --enable-curand was given. if test ${enable_curand+y} then : enableval=$enable_curand; case "${enableval}" in yes) hypre_using_curand=yes ;; no) hypre_using_curand=no ;; *) hypre_using_curand=no ;; esac else $as_nop case "$hypre_using_cuda" in yes) hypre_using_curand=yes ;; no) hypre_using_curand=no ;; *) hypre_using_curand=no ;; esac fi # Check whether --enable-cuda-streams was given. if test ${enable_cuda_streams+y} then : enableval=$enable_cuda_streams; case "${enableval}" in yes) hypre_using_cuda_streams=yes ;; no) hypre_using_cuda_streams=no ;; *) hypre_using_cuda_streams=yes ;; esac else $as_nop case "$hypre_using_cuda" in yes) hypre_using_cuda_streams=yes ;; no) hypre_using_cuda_streams=no ;; *) hypre_using_cuda_streams=yes ;; esac fi # Check whether --enable-cusparse was given. if test ${enable_cusparse+y} then : enableval=$enable_cusparse; case "${enableval}" in yes) hypre_using_cusparse=yes ;; no) hypre_using_cusparse=no ;; *) hypre_using_cusparse=no ;; esac else $as_nop case "$hypre_using_cuda" in yes) hypre_using_cusparse=yes ;; no) hypre_using_cusparse=no ;; *) hypre_using_cusparse=no ;; esac fi # Check whether --enable-cusolver was given. if test ${enable_cusolver+y} then : enableval=$enable_cusolver; case "${enableval}" in yes) hypre_using_cusolver=yes ;; no) hypre_using_cusolver=no ;; *) hypre_using_cusolver=no ;; esac else $as_nop hypre_using_cusolver=no fi # Check whether --with-sycl-target was given. if test ${with_sycl_target+y} then : withval=$with_sycl_target; if test "x${withval}" != "x" then if test "x${HYPRE_SYCL_TARGET}" = "x" then HYPRE_SYCL_TARGET="${withval}" fi fi fi # Check whether --with-sycl-target-backend was given. if test ${with_sycl_target_backend+y} then : withval=$with_sycl_target_backend; if test "x${withval}" != "x" then if test "x${HYPRE_SYCL_TARGET_BACKEND}" = "x" then HYPRE_SYCL_TARGET_BACKEND="${withval}" fi fi fi # Check whether --enable-onemklsparse was given. if test ${enable_onemklsparse+y} then : enableval=$enable_onemklsparse; case "${enableval}" in yes) hypre_using_onemklsparse=yes ;; no) hypre_using_onemklsparse=no ;; *) hypre_using_onemklsparse=yes ;; esac else $as_nop hypre_using_onemklsparse=yes fi # Check whether --enable-onemklblas was given. if test ${enable_onemklblas+y} then : enableval=$enable_onemklblas; case "${enableval}" in yes) hypre_using_onemklblas=yes ;; no) hypre_using_onemklblas=no ;; *) hypre_using_onemklblas=yes ;; esac else $as_nop hypre_using_onemklblas=yes fi # Check whether --enable-onemklrand was given. if test ${enable_onemklrand+y} then : enableval=$enable_onemklrand; case "${enableval}" in yes) hypre_using_onemklrand=yes ;; no) hypre_using_onemklrand=no ;; *) hypre_using_onemklrand=yes ;; esac else $as_nop hypre_using_onemklrand=yes fi # Check whether --with-raja was given. if test ${with_raja+y} then : withval=$with_raja; case "$withval" in yes) hypre_using_raja=yes;; no) hypre_using_raja=no ;; *) hypre_using_raja=no ;; esac else $as_nop hypre_using_raja=no fi # Check whether --with-raja-include was given. if test ${with_raja_include+y} then : withval=$with_raja_include; for raja_dir in $withval; do HYPRE_RAJA_INCLUDE="-I$raja_dir $HYPRE_RAJA_INCLUDE" done; hypre_user_chose_raja=yes fi # Check whether --with-raja-lib was given. if test ${with_raja_lib+y} then : withval=$with_raja_lib; for raja_lib in $withval; do HYPRE_RAJA_LIB="$raja_lib $HYPRE_RAJA_LIB" done; hypre_user_chose_raja=yes fi # Check whether --with-raja-libs was given. if test ${with_raja_libs+y} then : withval=$with_raja_libs; for raja_lib in $withval; do HYPRE_RAJA_LIB="-l$raja_lib $HYPRE_RAJA_LIB" done; hypre_user_chose_raja=yes fi # Check whether --with-raja-lib-dirs was given. if test ${with_raja_lib_dirs+y} then : withval=$with_raja_lib_dirs; for raja_lib_dir in $withval; do HYPRE_RAJA_LIB_DIR="-L$raja_lib_dir $HYPRE_RAJA_LIB_DIR" done; hypre_user_chose_raja=yes fi # Check whether --with-kokkos was given. if test ${with_kokkos+y} then : withval=$with_kokkos; case "$withval" in yes) hypre_using_kokkos=yes ;; no) hypre_using_kokkos=no ;; *) hypre_using_kokkos=no ;; esac else $as_nop hypre_using_kokkos=no fi # Check whether --with-kokkos-include was given. if test ${with_kokkos_include+y} then : withval=$with_kokkos_include; for kokkos_dir in $withval; do HYPRE_KOKKOS_INCLUDE="-I$kokkos_dir $HYPRE_KOKKOS_INCLUDE" done; hypre_user_chose_kokkos=yes fi # Check whether --with-kokkos-lib was given. if test ${with_kokkos_lib+y} then : withval=$with_kokkos_lib; for kokkos_lib in $withval; do HYPRE_KOKKOS_LIB="$kokkos_lib $HYPRE_KOKKOS_LIB" done; hypre_user_chose_kokkos=yes fi # Check whether --with-kokkos-libs was given. if test ${with_kokkos_libs+y} then : withval=$with_kokkos_libs; for kokkos_lib in $withval; do HYPRE_KOKKOS_LIB="-l$kokkos_lib $HYPRE_KOKKOS_LIB" done; hypre_user_chose_kokkos=yes fi # Check whether --with-kokkos-lib-dirs was given. if test ${with_kokkos_lib_dirs+y} then : withval=$with_kokkos_lib_dirs; for kokkos_lib_dir in $withval; do HYPRE_KOKKOS_LIB_DIR="-L$kokkos_lib_dir $HYPRE_KOKKOS_LIB_DIR" done; hypre_user_chose_kokkos=yes fi # Check whether --with-umpire-host was given. if test ${with_umpire_host+y} then : withval=$with_umpire_host; case "${withval}" in yes) hypre_using_umpire_host=yes ;; no) hypre_using_umpire_host=no ;; *) hypre_using_umpire_host=no ;; esac else $as_nop hypre_using_umpire_host=no fi # Check whether --with-umpire-device was given. if test ${with_umpire_device+y} then : withval=$with_umpire_device; case "${withval}" in yes) hypre_using_umpire_device=yes ;; no) hypre_using_umpire_device=no ;; *) hypre_using_umpire_device=no ;; esac else $as_nop hypre_using_umpire_device=no fi # Check whether --with-umpire-um was given. if test ${with_umpire_um+y} then : withval=$with_umpire_um; case "${withval}" in yes) hypre_using_umpire_um=yes ;; no) hypre_using_umpire_um=no ;; *) hypre_using_umpire_um=no ;; esac else $as_nop hypre_using_umpire_um=no fi # Check whether --with-umpire-pinned was given. if test ${with_umpire_pinned+y} then : withval=$with_umpire_pinned; case "${withval}" in yes) hypre_using_umpire_pinned=yes ;; no) hypre_using_umpire_pinned=no ;; *) hypre_using_umpire_pinned=no ;; esac else $as_nop hypre_using_umpire_pinned=no fi # Check whether --with-umpire was given. if test ${with_umpire+y} then : withval=$with_umpire; case "${withval}" in yes) hypre_using_umpire_device=yes hypre_using_umpire_um=yes ;; no) ;; *) ;; esac fi # Check whether --with-umpire-include was given. if test ${with_umpire_include+y} then : withval=$with_umpire_include; for umpire_dir in $withval; do HYPRE_UMPIRE_INCLUDE="-I$umpire_dir $HYPRE_UMPIRE_INCLUDE" done; fi # Check whether --with-umpire-lib was given. if test ${with_umpire_lib+y} then : withval=$with_umpire_lib; for umpire_lib in $withval; do HYPRE_UMPIRE_LIB="$umpire_lib $HYPRE_UMPIRE_LIB" done; fi # Check whether --with-umpire-libs was given. if test ${with_umpire_libs+y} then : withval=$with_umpire_libs; for umpire_lib in $withval; do HYPRE_UMPIRE_LIB="-l$umpire_lib $HYPRE_UMPIRE_LIB" done; fi # Check whether --with-umpire-lib-dirs was given. if test ${with_umpire_lib_dirs+y} then : withval=$with_umpire_lib_dirs; for umpire_lib_dir in $withval; do HYPRE_UMPIRE_LIB_DIR="-L$umpire_lib_dir $HYPRE_UMPIRE_LIB_DIR" done; fi # Check whether --with-magma was given. if test ${with_magma+y} then : withval=$with_magma; case "${withval}" in yes) hypre_using_magma=yes;; no) hypre_using_magma=no ;; *) hypre_using_magma=no ;; esac else $as_nop hypre_using_magma=no fi if test "x$with_magma" = "xyes" then : printf "%s\n" "#define HYPRE_USING_MAGMA 1" >>confdefs.h fi # Check whether --with-magma-include was given. if test ${with_magma_include+y} then : withval=$with_magma_include; for magma_dir in $withval; do HYPRE_MAGMA_INCLUDE="-I$magma_dir $HYPRE_MAGMA_INCLUDE" done; hypre_user_gave_magma_inc=yes fi # Check whether --with-magma-lib was given. if test ${with_magma_lib+y} then : withval=$with_magma_lib; for magma_lib in $withval; do HYPRE_MAGMA_LIB="$magma_lib $HYPRE_MAGMA_LIB" done; hypre_user_gave_magma_lib=yes fi # Check whether --with-magma-libs was given. if test ${with_magma_libs+y} then : withval=$with_magma_libs; for magma_lib in $withval; do HYPRE_MAGMA_LIB="-l$magma_lib $HYPRE_MAGMA_LIB" done; hypre_user_gave_magma_libs=yes fi # Check whether --with-magma-lib-dirs was given. if test ${with_magma_lib_dirs+y} then : withval=$with_magma_lib_dirs; for magma_lib_dir in $withval; do HYPRE_MAGMA_LIB_DIR="-L$magma_lib_dir $HYPRE_MAGMA_LIB_DIR" done; hypre_user_gave_magma_lib_dirs=yes fi # Check whether --with-caliper was given. if test ${with_caliper+y} then : withval=$with_caliper; case "$withval" in yes) hypre_using_caliper=yes;; *) hypre_using_caliper=no ;; esac else $as_nop hypre_using_caliper=no fi if test "x$with_caliper" = "xyes" then : printf "%s\n" "#define HYPRE_USING_CALIPER 1" >>confdefs.h fi # Check whether --with-caliper-include was given. if test ${with_caliper_include+y} then : withval=$with_caliper_include; for caliper_inc_dir in $withval; do CALIPER_INCLUDE="-I$caliper_inc_dir $CALIPER_INCLUDE" done; hypre_user_gave_caliper_inc=yes fi # Check whether --with-caliper-lib was given. if test ${with_caliper_lib+y} then : withval=$with_caliper_lib; for caliper_lib in $withval; do CALIPER_LIBS="$CALIPER_LIBS $caliper_lib" done; hypre_user_gave_caliper_lib=yes fi if test "$hypre_user_chose_ccompilers" = "no" then if test "$hypre_using_mpi" = "no" then if test "$hypre_using_openmp" = "yes" then for ac_prog in xlc_r xlC_r xlc xlC icx icc icpc icpx gcc g++ pgcc pgCC cc CC kcc KCC do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_CC+y} then : printf %s "(cached) " >&6 else $as_nop if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_CC="$ac_prog" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 printf "%s\n" "$CC" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi test -n "$CC" && break done else for ac_prog in xlc xlC icx icc icpc icpx gcc g++ pgcc pgCC cc CC kcc KCC do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_CC+y} then : printf %s "(cached) " >&6 else $as_nop if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_CC="$ac_prog" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 printf "%s\n" "$CC" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi test -n "$CC" && break done fi else if test "$hypre_using_openmp" = "yes" then for ac_prog in mpxlc mpixlc_r mpixlc mpiicx mpiicc mpigcc mpipgcc mpipgicc mpicc do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_CC+y} then : printf %s "(cached) " >&6 else $as_nop if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_CC="$ac_prog" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 printf "%s\n" "$CC" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi test -n "$CC" && break done else for ac_prog in mpxlc mpixlc mpiicx mpiicc mpigcc mpipgcc mpipgicc mpicc do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_CC+y} then : printf %s "(cached) " >&6 else $as_nop if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_CC="$ac_prog" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 printf "%s\n" "$CC" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi test -n "$CC" && break done fi fi if test "x$CC" = "x" then hypre_using_c=no fi fi if test "$hypre_user_chose_cxxcompilers" = "no" then if test "$hypre_using_mpi" = "no" then if test "$hypre_using_openmp" = "yes" then for ac_prog in xlC_r xlc_r xlC xlc icpx icx icpc icc g++ gcc pgCC pgcc pgc++ CC cc KCC kcc do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_CXX+y} then : printf %s "(cached) " >&6 else $as_nop if test -n "$CXX"; then ac_cv_prog_CXX="$CXX" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_CXX="$ac_prog" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CXX=$ac_cv_prog_CXX if test -n "$CXX"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CXX" >&5 printf "%s\n" "$CXX" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi test -n "$CXX" && break done else for ac_prog in xlC xlc icpx icx icpc icc g++ gcc pgCC pgcc pgc++ CC cc KCC kcc do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_CXX+y} then : printf %s "(cached) " >&6 else $as_nop if test -n "$CXX"; then ac_cv_prog_CXX="$CXX" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_CXX="$ac_prog" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CXX=$ac_cv_prog_CXX if test -n "$CXX"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CXX" >&5 printf "%s\n" "$CXX" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi test -n "$CXX" && break done fi else if test "$hypre_using_openmp" = "yes" then for ac_prog in CC mpxlC mpixlcxx_r mpixlcxx mpixlC mpiicpx mpiicpc mpig++ mpic++ mpicxx mpiCC mpipgCC mpipgic++ do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_CXX+y} then : printf %s "(cached) " >&6 else $as_nop if test -n "$CXX"; then ac_cv_prog_CXX="$CXX" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_CXX="$ac_prog" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CXX=$ac_cv_prog_CXX if test -n "$CXX"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CXX" >&5 printf "%s\n" "$CXX" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi test -n "$CXX" && break done else for ac_prog in CC mpxlC mpixlcxx mpixlC mpiicpx mpiicpc mpig++ mpic++ mpicxx mpiCC mpipgCC mpipgic++ do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_CXX+y} then : printf %s "(cached) " >&6 else $as_nop if test -n "$CXX"; then ac_cv_prog_CXX="$CXX" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_CXX="$ac_prog" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CXX=$ac_cv_prog_CXX if test -n "$CXX"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CXX" >&5 printf "%s\n" "$CXX" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi test -n "$CXX" && break done fi fi if test "x$CXX" = "x" then hypre_using_cxx=no fi fi if test "$hypre_using_fortran" = "yes" -a "$hypre_user_chose_fcompilers" = "no" then if test "$hypre_using_mpi" = "no" then if test "$hypre_using_openmp" = "yes" then for ac_prog in xlf_r ifx ifort gfortran g77 g95 pgf77 pgfortran f77 do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_FC+y} then : printf %s "(cached) " >&6 else $as_nop if test -n "$FC"; then ac_cv_prog_FC="$FC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_FC="$ac_prog" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi FC=$ac_cv_prog_FC if test -n "$FC"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $FC" >&5 printf "%s\n" "$FC" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi test -n "$FC" && break done else for ac_prog in xlf ifx ifort gfortran g77 g95 pgf77 pgfortran f77 do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_FC+y} then : printf %s "(cached) " >&6 else $as_nop if test -n "$FC"; then ac_cv_prog_FC="$FC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_FC="$ac_prog" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi FC=$ac_cv_prog_FC if test -n "$FC"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $FC" >&5 printf "%s\n" "$FC" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi test -n "$FC" && break done fi else if test "$hypre_using_openmp" = "yes" then for ac_prog in mpxlf mpixlf77_r mpiifx mpiifort mpif77 mpipgf77 mpipgifort do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_FC+y} then : printf %s "(cached) " >&6 else $as_nop if test -n "$FC"; then ac_cv_prog_FC="$FC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_FC="$ac_prog" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi FC=$ac_cv_prog_FC if test -n "$FC"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $FC" >&5 printf "%s\n" "$FC" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi test -n "$FC" && break done else for ac_prog in mpxlf mpixlf77 mpiifx mpiifort mpif77 mpipgf77 mpipgifort do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_FC+y} then : printf %s "(cached) " >&6 else $as_nop if test -n "$FC"; then ac_cv_prog_FC="$FC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_FC="$ac_prog" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi FC=$ac_cv_prog_FC if test -n "$FC"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $FC" >&5 printf "%s\n" "$FC" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi test -n "$FC" && break done fi fi if test "x$FC" = "x" then hypre_using_fortran=no fi fi if test "x$hypre_using_cuda" = "xyes" && test "x$hypre_using_device_openmp" = "xyes" then as_fn_error $? "--with-cuda and --with-device-openmp are mutually exclusive" "$LINENO" 5 fi if test "x$hypre_using_cuda" = "xyes" && test "x$hypre_using_hip" = "xyes" then as_fn_error $? "--with-cuda and --with-hip are mutually exclusive" "$LINENO" 5 fi if test "x$hypre_using_cuda" = "xyes" && test "x$hypre_using_sycl" = "xyes" then as_fn_error $? "--with-cuda and --with-sycl are mutually exclusive" "$LINENO" 5 fi if test "x$hypre_using_hip" = "xyes" && test "x$hypre_using_device_openmp" = "xyes" then as_fn_error $? "--with-hip and --with-device-openmp are mutually exclusive" "$LINENO" 5 fi if test "x$hypre_using_hip" = "xyes" && test "x$hypre_using_sycl" = "xyes" then as_fn_error $? "--with-hip and --with-sycl are mutually exclusive" "$LINENO" 5 fi if test "x$hypre_using_sycl" = "xyes" && test "x$hypre_using_device_openmp" = "xyes" then as_fn_error $? "--with-sycl and --with-device-openmp are mutually exclusive" "$LINENO" 5 fi if test "$hypre_user_chose_cudacompilers" = "no" then if test "$hypre_using_device_openmp" = "yes" then if test "x$hypre_using_kokkos" = "xyes" then if test "$hypre_using_mpi" = "no" then for ac_prog in clang++-gpu icpx do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_CUCC+y} then : printf %s "(cached) " >&6 else $as_nop if test -n "$CUCC"; then ac_cv_prog_CUCC="$CUCC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_CUCC="$ac_prog" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CUCC=$ac_cv_prog_CUCC if test -n "$CUCC"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CUCC" >&5 printf "%s\n" "$CUCC" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi test -n "$CUCC" && break done else for ac_prog in mpiclang++-gpu mpiicpx do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_CUCC+y} then : printf %s "(cached) " >&6 else $as_nop if test -n "$CUCC"; then ac_cv_prog_CUCC="$CUCC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_CUCC="$ac_prog" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CUCC=$ac_cv_prog_CUCC if test -n "$CUCC"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CUCC" >&5 printf "%s\n" "$CUCC" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi test -n "$CUCC" && break done fi else if test "$hypre_using_mpi" = "no" then for ac_prog in xlc-gpu clang-gpu icx do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_CUCC+y} then : printf %s "(cached) " >&6 else $as_nop if test -n "$CUCC"; then ac_cv_prog_CUCC="$CUCC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_CUCC="$ac_prog" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CUCC=$ac_cv_prog_CUCC if test -n "$CUCC"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CUCC" >&5 printf "%s\n" "$CUCC" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi test -n "$CUCC" && break done else for ac_prog in mpixlc-gpu mpiclang-gpu mpiicx do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_CUCC+y} then : printf %s "(cached) " >&6 else $as_nop if test -n "$CUCC"; then ac_cv_prog_CUCC="$CUCC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_CUCC="$ac_prog" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CUCC=$ac_cv_prog_CUCC if test -n "$CUCC"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CUCC" >&5 printf "%s\n" "$CUCC" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi test -n "$CUCC" && break done fi fi fi if test "$hypre_using_cuda" = "yes" then for ac_prog in nvcc do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_CUCC+y} then : printf %s "(cached) " >&6 else $as_nop if test -n "$CUCC"; then ac_cv_prog_CUCC="$CUCC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in "${CUDA_HOME}/bin" do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_CUCC="$ac_prog" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CUCC=$ac_cv_prog_CUCC if test -n "$CUCC"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CUCC" >&5 printf "%s\n" "$CUCC" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi test -n "$CUCC" && break done test -n "$CUCC" || CUCC="""" CUCC="\${HYPRE_CUDA_PATH}/bin/${CUCC} -ccbin=\${CXX}" fi if test "$hypre_using_hip" = "yes" then for ac_prog in hipcc do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_CUCC+y} then : printf %s "(cached) " >&6 else $as_nop if test -n "$CUCC"; then ac_cv_prog_CUCC="$CUCC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_CUCC="$ac_prog" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CUCC=$ac_cv_prog_CUCC if test -n "$CUCC"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CUCC" >&5 printf "%s\n" "$CUCC" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi test -n "$CUCC" && break done fi if test "$hypre_using_sycl" = "yes" then for ac_prog in icpx do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_CUCC+y} then : printf %s "(cached) " >&6 else $as_nop if test -n "$CUCC"; then ac_cv_prog_CUCC="$CUCC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_CUCC="$ac_prog" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CUCC=$ac_cv_prog_CUCC if test -n "$CUCC"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CUCC" >&5 printf "%s\n" "$CUCC" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi test -n "$CUCC" && break done fi fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 printf %s "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } set x ${MAKE-make} ac_make=`printf "%s\n" "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` if eval test \${ac_cv_prog_make_${ac_make}_set+y} then : printf %s "(cached) " >&6 else $as_nop cat >conftest.make <<\_ACEOF SHELL = /bin/sh all: @echo '@@@%%%=$(MAKE)=@@@%%%' _ACEOF # GNU make sometimes prints "make[1]: Entering ...", which would confuse us. case `${MAKE-make} -f conftest.make 2>/dev/null` in *@@@%%%=?*=@@@%%%*) eval ac_cv_prog_make_${ac_make}_set=yes;; *) eval ac_cv_prog_make_${ac_make}_set=no;; esac rm -f conftest.make fi if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 printf "%s\n" "yes" >&6; } SET_MAKE= else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } SET_MAKE="MAKE=${MAKE-make}" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. set dummy ${ac_tool_prefix}ranlib; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_RANLIB+y} then : printf %s "(cached) " >&6 else $as_nop if test -n "$RANLIB"; then ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi RANLIB=$ac_cv_prog_RANLIB if test -n "$RANLIB"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5 printf "%s\n" "$RANLIB" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi fi if test -z "$ac_cv_prog_RANLIB"; then ac_ct_RANLIB=$RANLIB # Extract the first word of "ranlib", so it can be a program name with args. set dummy ranlib; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_RANLIB+y} then : printf %s "(cached) " >&6 else $as_nop if test -n "$ac_ct_RANLIB"; then ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_RANLIB="ranlib" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB if test -n "$ac_ct_RANLIB"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5 printf "%s\n" "$ac_ct_RANLIB" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi if test "x$ac_ct_RANLIB" = x; then RANLIB=":" else case $cross_compiling:$ac_tool_warned in yes:) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac RANLIB=$ac_ct_RANLIB fi else RANLIB="$ac_cv_prog_RANLIB" fi if test "$hypre_using_c" = "yes" then ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. set dummy ${ac_tool_prefix}gcc; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_CC+y} then : printf %s "(cached) " >&6 else $as_nop if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}gcc" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 printf "%s\n" "$CC" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_CC+y} then : printf %s "(cached) " >&6 else $as_nop if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="gcc" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 printf "%s\n" "$ac_ct_CC" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi else CC="$ac_cv_prog_CC" fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. set dummy ${ac_tool_prefix}cc; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_CC+y} then : printf %s "(cached) " >&6 else $as_nop if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}cc" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 printf "%s\n" "$CC" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi fi fi if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_CC+y} then : printf %s "(cached) " >&6 else $as_nop if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else ac_prog_rejected=no as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then if test "$as_dir$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue fi ac_cv_prog_CC="cc" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS if test $ac_prog_rejected = yes; then # We found a bogon in the path, so make sure we never use it. set dummy $ac_cv_prog_CC shift if test $# != 0; then # We chose a different compiler from the bogus one. # However, it has the same basename, so the bogon will be chosen # first if we set CC to just the basename; use the full file name. shift ac_cv_prog_CC="$as_dir$ac_word${1+' '}$@" fi fi fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 printf "%s\n" "$CC" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then for ac_prog in cl.exe do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_CC+y} then : printf %s "(cached) " >&6 else $as_nop if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 printf "%s\n" "$CC" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi test -n "$CC" && break done fi if test -z "$CC"; then ac_ct_CC=$CC for ac_prog in cl.exe do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_CC+y} then : printf %s "(cached) " >&6 else $as_nop if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="$ac_prog" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 printf "%s\n" "$ac_ct_CC" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi test -n "$ac_ct_CC" && break done if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi fi fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}clang", so it can be a program name with args. set dummy ${ac_tool_prefix}clang; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_CC+y} then : printf %s "(cached) " >&6 else $as_nop if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}clang" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 printf "%s\n" "$CC" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "clang", so it can be a program name with args. set dummy clang; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_CC+y} then : printf %s "(cached) " >&6 else $as_nop if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="clang" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 printf "%s\n" "$ac_ct_CC" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi else CC="$ac_cv_prog_CC" fi fi test -z "$CC" && { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "no acceptable C compiler found in \$PATH See \`config.log' for more details" "$LINENO" 5; } # Provide some information about the compiler. printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion -version; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { ; return 0; } _ACEOF ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" # Try to create an executable without -o first, disregard a.out. # It will help us diagnose broken compilers, and finding out an intuition # of exeext. { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5 printf %s "checking whether the C compiler works... " >&6; } ac_link_default=`printf "%s\n" "$ac_link" | sed 's/ -o *conftest[^ ]*//'` # The possible output files: ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" ac_rmfiles= for ac_file in $ac_files do case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; * ) ac_rmfiles="$ac_rmfiles $ac_file";; esac done rm -f $ac_rmfiles if { { ac_try="$ac_link_default" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_link_default") 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } then : # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. # So ignore a value of `no', otherwise this would lead to `EXEEXT = no' # in a Makefile. We should not override ac_cv_exeext if it was cached, # so that the user can short-circuit this test for compilers unknown to # Autoconf. for ac_file in $ac_files '' do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; [ab].out ) # We found the default executable, but exeext='' is most # certainly right. break;; *.* ) if test ${ac_cv_exeext+y} && test "$ac_cv_exeext" != no; then :; else ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` fi # We set ac_cv_exeext here because the later test for it is not # safe: cross compilers may not add the suffix if given an `-o' # argument, so we may need to know it at that point already. # Even if this section looks crufty: it has the advantage of # actually working. break;; * ) break;; esac done test "$ac_cv_exeext" = no && ac_cv_exeext= else $as_nop ac_file='' fi if test -z "$ac_file" then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } printf "%s\n" "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "C compiler cannot create executables See \`config.log' for more details" "$LINENO" 5; } else $as_nop { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 printf "%s\n" "yes" >&6; } fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5 printf %s "checking for C compiler default output file name... " >&6; } { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 printf "%s\n" "$ac_file" >&6; } ac_exeext=$ac_cv_exeext rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out ac_clean_files=$ac_clean_files_save { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 printf %s "checking for suffix of executables... " >&6; } if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } then : # If both `conftest.exe' and `conftest' are `present' (well, observable) # catch `conftest.exe'. For instance with Cygwin, `ls conftest' will # work properly (i.e., refer to `conftest.exe'), while it won't with # `rm'. for ac_file in conftest.exe conftest conftest.*; do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` break;; * ) break;; esac done else $as_nop { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of executables: cannot compile and link See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest conftest$ac_cv_exeext { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 printf "%s\n" "$ac_cv_exeext" >&6; } rm -f conftest.$ac_ext EXEEXT=$ac_cv_exeext ac_exeext=$EXEEXT cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main (void) { FILE *f = fopen ("conftest.out", "w"); return ferror (f) || fclose (f) != 0; ; return 0; } _ACEOF ac_clean_files="$ac_clean_files conftest.out" # Check that the compiler produces executables we can run. If not, either # the compiler is broken, or we cross compile. { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 printf %s "checking whether we are cross compiling... " >&6; } if test "$cross_compiling" != yes; then { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if { ac_try='./conftest$ac_cv_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then cross_compiling=no else if test "$cross_compiling" = maybe; then cross_compiling=yes else { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "cannot run C compiled programs. If you meant to cross compile, use \`--host'. See \`config.log' for more details" "$LINENO" 5; } fi fi fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 printf "%s\n" "$cross_compiling" >&6; } rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out ac_clean_files=$ac_clean_files_save { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 printf %s "checking for suffix of object files... " >&6; } if test ${ac_cv_objext+y} then : printf %s "(cached) " >&6 else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { ; return 0; } _ACEOF rm -f conftest.o conftest.obj if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } then : for ac_file in conftest.o conftest.obj conftest.*; do test -f "$ac_file" || continue; case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` break;; esac done else $as_nop printf "%s\n" "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of object files: cannot compile See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest.$ac_cv_objext conftest.$ac_ext fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 printf "%s\n" "$ac_cv_objext" >&6; } OBJEXT=$ac_cv_objext ac_objext=$OBJEXT { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the compiler supports GNU C" >&5 printf %s "checking whether the compiler supports GNU C... " >&6; } if test ${ac_cv_c_compiler_gnu+y} then : printf %s "(cached) " >&6 else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : ac_compiler_gnu=yes else $as_nop ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 printf "%s\n" "$ac_cv_c_compiler_gnu" >&6; } ac_compiler_gnu=$ac_cv_c_compiler_gnu if test $ac_compiler_gnu = yes; then GCC=yes else GCC= fi ac_test_CFLAGS=${CFLAGS+y} ac_save_CFLAGS=$CFLAGS { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 printf %s "checking whether $CC accepts -g... " >&6; } if test ${ac_cv_prog_cc_g+y} then : printf %s "(cached) " >&6 else $as_nop ac_save_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes ac_cv_prog_cc_g=no CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : ac_cv_prog_cc_g=yes else $as_nop CFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : else $as_nop ac_c_werror_flag=$ac_save_c_werror_flag CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : ac_cv_prog_cc_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ac_c_werror_flag=$ac_save_c_werror_flag fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 printf "%s\n" "$ac_cv_prog_cc_g" >&6; } if test $ac_test_CFLAGS; then CFLAGS=$ac_save_CFLAGS elif test $ac_cv_prog_cc_g = yes; then if test "$GCC" = yes; then CFLAGS="-g -O2" else CFLAGS="-g" fi else if test "$GCC" = yes; then CFLAGS="-O2" else CFLAGS= fi fi ac_prog_cc_stdc=no if test x$ac_prog_cc_stdc = xno then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC option to enable C11 features" >&5 printf %s "checking for $CC option to enable C11 features... " >&6; } if test ${ac_cv_prog_cc_c11+y} then : printf %s "(cached) " >&6 else $as_nop ac_cv_prog_cc_c11=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_c_conftest_c11_program _ACEOF for ac_arg in '' -std=gnu11 do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO" then : ac_cv_prog_cc_c11=$ac_arg fi rm -f core conftest.err conftest.$ac_objext conftest.beam test "x$ac_cv_prog_cc_c11" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC fi if test "x$ac_cv_prog_cc_c11" = xno then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 printf "%s\n" "unsupported" >&6; } else $as_nop if test "x$ac_cv_prog_cc_c11" = x then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 printf "%s\n" "none needed" >&6; } else $as_nop { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c11" >&5 printf "%s\n" "$ac_cv_prog_cc_c11" >&6; } CC="$CC $ac_cv_prog_cc_c11" fi ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c11 ac_prog_cc_stdc=c11 fi fi if test x$ac_prog_cc_stdc = xno then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC option to enable C99 features" >&5 printf %s "checking for $CC option to enable C99 features... " >&6; } if test ${ac_cv_prog_cc_c99+y} then : printf %s "(cached) " >&6 else $as_nop ac_cv_prog_cc_c99=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_c_conftest_c99_program _ACEOF for ac_arg in '' -std=gnu99 -std=c99 -c99 -qlanglvl=extc1x -qlanglvl=extc99 -AC99 -D_STDC_C99= do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO" then : ac_cv_prog_cc_c99=$ac_arg fi rm -f core conftest.err conftest.$ac_objext conftest.beam test "x$ac_cv_prog_cc_c99" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC fi if test "x$ac_cv_prog_cc_c99" = xno then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 printf "%s\n" "unsupported" >&6; } else $as_nop if test "x$ac_cv_prog_cc_c99" = x then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 printf "%s\n" "none needed" >&6; } else $as_nop { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c99" >&5 printf "%s\n" "$ac_cv_prog_cc_c99" >&6; } CC="$CC $ac_cv_prog_cc_c99" fi ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c99 ac_prog_cc_stdc=c99 fi fi if test x$ac_prog_cc_stdc = xno then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC option to enable C89 features" >&5 printf %s "checking for $CC option to enable C89 features... " >&6; } if test ${ac_cv_prog_cc_c89+y} then : printf %s "(cached) " >&6 else $as_nop ac_cv_prog_cc_c89=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_c_conftest_c89_program _ACEOF for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO" then : ac_cv_prog_cc_c89=$ac_arg fi rm -f core conftest.err conftest.$ac_objext conftest.beam test "x$ac_cv_prog_cc_c89" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC fi if test "x$ac_cv_prog_cc_c89" = xno then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 printf "%s\n" "unsupported" >&6; } else $as_nop if test "x$ac_cv_prog_cc_c89" = x then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 printf "%s\n" "none needed" >&6; } else $as_nop { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 printf "%s\n" "$ac_cv_prog_cc_c89" >&6; } CC="$CC $ac_cv_prog_cc_c89" fi ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c89 ac_prog_cc_stdc=c89 fi fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu fi if test "$hypre_using_cxx" = "yes" then ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu if test -z "$CXX"; then if test -n "$CCC"; then CXX=$CCC else if test -n "$ac_tool_prefix"; then for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC clang++ do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_CXX+y} then : printf %s "(cached) " >&6 else $as_nop if test -n "$CXX"; then ac_cv_prog_CXX="$CXX" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_CXX="$ac_tool_prefix$ac_prog" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CXX=$ac_cv_prog_CXX if test -n "$CXX"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CXX" >&5 printf "%s\n" "$CXX" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi test -n "$CXX" && break done fi if test -z "$CXX"; then ac_ct_CXX=$CXX for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC clang++ do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_CXX+y} then : printf %s "(cached) " >&6 else $as_nop if test -n "$ac_ct_CXX"; then ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CXX="$ac_prog" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CXX=$ac_cv_prog_ac_ct_CXX if test -n "$ac_ct_CXX"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CXX" >&5 printf "%s\n" "$ac_ct_CXX" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi test -n "$ac_ct_CXX" && break done if test "x$ac_ct_CXX" = x; then CXX="g++" else case $cross_compiling:$ac_tool_warned in yes:) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CXX=$ac_ct_CXX fi fi fi fi # Provide some information about the compiler. printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for C++ compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the compiler supports GNU C++" >&5 printf %s "checking whether the compiler supports GNU C++... " >&6; } if test ${ac_cv_cxx_compiler_gnu+y} then : printf %s "(cached) " >&6 else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO" then : ac_compiler_gnu=yes else $as_nop ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ac_cv_cxx_compiler_gnu=$ac_compiler_gnu fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cxx_compiler_gnu" >&5 printf "%s\n" "$ac_cv_cxx_compiler_gnu" >&6; } ac_compiler_gnu=$ac_cv_cxx_compiler_gnu if test $ac_compiler_gnu = yes; then GXX=yes else GXX= fi ac_test_CXXFLAGS=${CXXFLAGS+y} ac_save_CXXFLAGS=$CXXFLAGS { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $CXX accepts -g" >&5 printf %s "checking whether $CXX accepts -g... " >&6; } if test ${ac_cv_prog_cxx_g+y} then : printf %s "(cached) " >&6 else $as_nop ac_save_cxx_werror_flag=$ac_cxx_werror_flag ac_cxx_werror_flag=yes ac_cv_prog_cxx_g=no CXXFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO" then : ac_cv_prog_cxx_g=yes else $as_nop CXXFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO" then : else $as_nop ac_cxx_werror_flag=$ac_save_cxx_werror_flag CXXFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO" then : ac_cv_prog_cxx_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ac_cxx_werror_flag=$ac_save_cxx_werror_flag fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_g" >&5 printf "%s\n" "$ac_cv_prog_cxx_g" >&6; } if test $ac_test_CXXFLAGS; then CXXFLAGS=$ac_save_CXXFLAGS elif test $ac_cv_prog_cxx_g = yes; then if test "$GXX" = yes; then CXXFLAGS="-g -O2" else CXXFLAGS="-g" fi else if test "$GXX" = yes; then CXXFLAGS="-O2" else CXXFLAGS= fi fi ac_prog_cxx_stdcxx=no if test x$ac_prog_cxx_stdcxx = xno then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CXX option to enable C++11 features" >&5 printf %s "checking for $CXX option to enable C++11 features... " >&6; } if test ${ac_cv_prog_cxx_11+y} then : printf %s "(cached) " >&6 else $as_nop ac_cv_prog_cxx_11=no ac_save_CXX=$CXX cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_cxx_conftest_cxx11_program _ACEOF for ac_arg in '' -std=gnu++11 -std=gnu++0x -std=c++11 -std=c++0x -qlanglvl=extended0x -AA do CXX="$ac_save_CXX $ac_arg" if ac_fn_cxx_try_compile "$LINENO" then : ac_cv_prog_cxx_cxx11=$ac_arg fi rm -f core conftest.err conftest.$ac_objext conftest.beam test "x$ac_cv_prog_cxx_cxx11" != "xno" && break done rm -f conftest.$ac_ext CXX=$ac_save_CXX fi if test "x$ac_cv_prog_cxx_cxx11" = xno then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 printf "%s\n" "unsupported" >&6; } else $as_nop if test "x$ac_cv_prog_cxx_cxx11" = x then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 printf "%s\n" "none needed" >&6; } else $as_nop { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_cxx11" >&5 printf "%s\n" "$ac_cv_prog_cxx_cxx11" >&6; } CXX="$CXX $ac_cv_prog_cxx_cxx11" fi ac_cv_prog_cxx_stdcxx=$ac_cv_prog_cxx_cxx11 ac_prog_cxx_stdcxx=cxx11 fi fi if test x$ac_prog_cxx_stdcxx = xno then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CXX option to enable C++98 features" >&5 printf %s "checking for $CXX option to enable C++98 features... " >&6; } if test ${ac_cv_prog_cxx_98+y} then : printf %s "(cached) " >&6 else $as_nop ac_cv_prog_cxx_98=no ac_save_CXX=$CXX cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_cxx_conftest_cxx98_program _ACEOF for ac_arg in '' -std=gnu++98 -std=c++98 -qlanglvl=extended -AA do CXX="$ac_save_CXX $ac_arg" if ac_fn_cxx_try_compile "$LINENO" then : ac_cv_prog_cxx_cxx98=$ac_arg fi rm -f core conftest.err conftest.$ac_objext conftest.beam test "x$ac_cv_prog_cxx_cxx98" != "xno" && break done rm -f conftest.$ac_ext CXX=$ac_save_CXX fi if test "x$ac_cv_prog_cxx_cxx98" = xno then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 printf "%s\n" "unsupported" >&6; } else $as_nop if test "x$ac_cv_prog_cxx_cxx98" = x then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 printf "%s\n" "none needed" >&6; } else $as_nop { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_cxx98" >&5 printf "%s\n" "$ac_cv_prog_cxx_cxx98" >&6; } CXX="$CXX $ac_cv_prog_cxx_cxx98" fi ac_cv_prog_cxx_stdcxx=$ac_cv_prog_cxx_cxx98 ac_prog_cxx_stdcxx=cxx98 fi fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu fi if test "$hypre_using_fortran" = "yes" then ac_ext=${ac_fc_srcext-f} ac_compile='$FC -c $FCFLAGS $ac_fcflags_srcext conftest.$ac_ext >&5' ac_link='$FC -o conftest$ac_exeext $FCFLAGS $LDFLAGS $ac_fcflags_srcext conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_fc_compiler_gnu if test -n "$ac_tool_prefix"; then for ac_prog in gfortran g95 xlf95 f95 fort ifort ifc efc pgfortran pgf95 lf95 ftn nagfor xlf90 f90 pgf90 pghpf epcf90 g77 xlf f77 frt pgf77 cf77 fort77 fl32 af77 do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_FC+y} then : printf %s "(cached) " >&6 else $as_nop if test -n "$FC"; then ac_cv_prog_FC="$FC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_FC="$ac_tool_prefix$ac_prog" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi FC=$ac_cv_prog_FC if test -n "$FC"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $FC" >&5 printf "%s\n" "$FC" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi test -n "$FC" && break done fi if test -z "$FC"; then ac_ct_FC=$FC for ac_prog in gfortran g95 xlf95 f95 fort ifort ifc efc pgfortran pgf95 lf95 ftn nagfor xlf90 f90 pgf90 pghpf epcf90 g77 xlf f77 frt pgf77 cf77 fort77 fl32 af77 do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_FC+y} then : printf %s "(cached) " >&6 else $as_nop if test -n "$ac_ct_FC"; then ac_cv_prog_ac_ct_FC="$ac_ct_FC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_FC="$ac_prog" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_FC=$ac_cv_prog_ac_ct_FC if test -n "$ac_ct_FC"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_FC" >&5 printf "%s\n" "$ac_ct_FC" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi test -n "$ac_ct_FC" && break done if test "x$ac_ct_FC" = x; then FC="" else case $cross_compiling:$ac_tool_warned in yes:) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac FC=$ac_ct_FC fi fi # Provide some information about the compiler. printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for Fortran compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done rm -f a.out # If we don't use `.F' as extension, the preprocessor is not run on the # input file. (Note that this only needs to work for GNU compilers.) ac_save_ext=$ac_ext ac_ext=F { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the compiler supports GNU Fortran" >&5 printf %s "checking whether the compiler supports GNU Fortran... " >&6; } if test ${ac_cv_fc_compiler_gnu+y} then : printf %s "(cached) " >&6 else $as_nop cat > conftest.$ac_ext <<_ACEOF program main #ifndef __GNUC__ choke me #endif end _ACEOF if ac_fn_fc_try_compile "$LINENO" then : ac_compiler_gnu=yes else $as_nop ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ac_cv_fc_compiler_gnu=$ac_compiler_gnu fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_fc_compiler_gnu" >&5 printf "%s\n" "$ac_cv_fc_compiler_gnu" >&6; } ac_compiler_gnu=$ac_cv_fc_compiler_gnu ac_ext=$ac_save_ext ac_test_FCFLAGS=${FCFLAGS+y} ac_save_FCFLAGS=$FCFLAGS FCFLAGS= { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $FC accepts -g" >&5 printf %s "checking whether $FC accepts -g... " >&6; } if test ${ac_cv_prog_fc_g+y} then : printf %s "(cached) " >&6 else $as_nop FCFLAGS=-g cat > conftest.$ac_ext <<_ACEOF program main end _ACEOF if ac_fn_fc_try_compile "$LINENO" then : ac_cv_prog_fc_g=yes else $as_nop ac_cv_prog_fc_g=no fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_fc_g" >&5 printf "%s\n" "$ac_cv_prog_fc_g" >&6; } if test $ac_test_FCFLAGS; then FCFLAGS=$ac_save_FCFLAGS elif test $ac_cv_prog_fc_g = yes; then if test "x$ac_cv_fc_compiler_gnu" = xyes; then FCFLAGS="-g -O2" else FCFLAGS="-g" fi else if test "x$ac_cv_fc_compiler_gnu" = xyes; then FCFLAGS="-O2" else FCFLAGS= fi fi if test $ac_compiler_gnu = yes; then GFC=yes else GFC= fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_ext=${ac_fc_srcext-f} ac_compile='$FC -c $FCFLAGS $ac_fcflags_srcext conftest.$ac_ext >&5' ac_link='$FC -o conftest$ac_exeext $FCFLAGS $LDFLAGS $ac_fcflags_srcext conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_fc_compiler_gnu { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to get verbose linking output from $FC" >&5 printf %s "checking how to get verbose linking output from $FC... " >&6; } if test ${ac_cv_prog_fc_v+y} then : printf %s "(cached) " >&6 else $as_nop cat > conftest.$ac_ext <<_ACEOF program main end _ACEOF if ac_fn_fc_try_compile "$LINENO" then : ac_cv_prog_fc_v= # Try some options frequently used verbose output for ac_verb in -v -verbose --verbose -V -\#\#\#; do cat > conftest.$ac_ext <<_ACEOF program main end _ACEOF # Compile and link our simple test program by passing a flag (argument # 1 to this macro) to the Fortran compiler in order to get # "verbose" output that we can then parse for the Fortran linker # flags. ac_save_FCFLAGS=$FCFLAGS FCFLAGS="$FCFLAGS $ac_verb" eval "set x $ac_link" shift printf "%s\n" "$as_me:${as_lineno-$LINENO}: $*" >&5 # gfortran 4.3 outputs lines setting COLLECT_GCC_OPTIONS, COMPILER_PATH, # LIBRARY_PATH; skip all such settings. ac_fc_v_output=`eval $ac_link 5>&1 2>&1 | sed '/^Driving:/d; /^Configured with:/d; '"/^[_$as_cr_Letters][_$as_cr_alnum]*=/d"` printf "%s\n" "$ac_fc_v_output" >&5 FCFLAGS=$ac_save_FCFLAGS rm -rf conftest* # On HP/UX there is a line like: "LPATH is: /foo:/bar:/baz" where # /foo, /bar, and /baz are search directories for the Fortran linker. # Here, we change these into -L/foo -L/bar -L/baz (and put it first): ac_fc_v_output="`echo $ac_fc_v_output | grep 'LPATH is:' | sed 's|.*LPATH is\(: *[^ ]*\).*|\1|;s|: */| -L/|g'` $ac_fc_v_output" # FIXME: we keep getting bitten by quoted arguments; a more general fix # that detects unbalanced quotes in FLIBS should be implemented # and (ugh) tested at some point. case $ac_fc_v_output in # With xlf replace commas with spaces, # and remove "-link" and closing parenthesis. *xlfentry*) ac_fc_v_output=`echo $ac_fc_v_output | sed ' s/,/ /g s/ -link / /g s/) *$// ' ` ;; # With Intel ifc, ignore the quoted -mGLOB_options_string stuff (quoted # $LIBS confuse us, and the libraries appear later in the output anyway). *mGLOB_options_string*) ac_fc_v_output=`echo $ac_fc_v_output | sed 's/"-mGLOB[^"]*"/ /g'` ;; # Portland Group compiler has singly- or doubly-quoted -cmdline argument # Singly-quoted arguments were reported for versions 5.2-4 and 6.0-4. # Doubly-quoted arguments were reported for "PGF90/x86 Linux/x86 5.0-2". *-cmdline\ * | *-ignore\ * | *-def\ *) ac_fc_v_output=`echo $ac_fc_v_output | sed "\ s/-cmdline *'[^']*'/ /g; s/-cmdline *\"[^\"]*\"/ /g s/-ignore *'[^']*'/ /g; s/-ignore *\"[^\"]*\"/ /g s/-def *'[^']*'/ /g; s/-def *\"[^\"]*\"/ /g"` ;; # If we are using fort77 (the f2c wrapper) then filter output and delete quotes. *fort77*f2c*gcc*) ac_fc_v_output=`echo "$ac_fc_v_output" | sed -n ' /:[ ]\+Running[ ]\{1,\}"gcc"/{ /"-c"/d /[.]c"*/d s/^.*"gcc"/"gcc"/ s/"//gp }'` ;; # If we are using Cray Fortran then delete quotes. *cft90*) ac_fc_v_output=`echo $ac_fc_v_output | sed 's/"//g'` ;; esac # look for -l* and *.a constructs in the output for ac_arg in $ac_fc_v_output; do case $ac_arg in [\\/]*.a | ?:[\\/]*.a | -[lLRu]*) ac_cv_prog_fc_v=$ac_verb break 2 ;; esac done done if test -z "$ac_cv_prog_fc_v"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: cannot determine how to obtain linking information from $FC" >&5 printf "%s\n" "$as_me: WARNING: cannot determine how to obtain linking information from $FC" >&2;} fi else $as_nop { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: compilation failed" >&5 printf "%s\n" "$as_me: WARNING: compilation failed" >&2;} fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_fc_v" >&5 printf "%s\n" "$ac_cv_prog_fc_v" >&6; } { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for Fortran libraries of $FC" >&5 printf %s "checking for Fortran libraries of $FC... " >&6; } if test ${ac_cv_fc_libs+y} then : printf %s "(cached) " >&6 else $as_nop if test "x$FCLIBS" != "x"; then ac_cv_fc_libs="$FCLIBS" # Let the user override the test. else cat > conftest.$ac_ext <<_ACEOF program main end _ACEOF # Compile and link our simple test program by passing a flag (argument # 1 to this macro) to the Fortran compiler in order to get # "verbose" output that we can then parse for the Fortran linker # flags. ac_save_FCFLAGS=$FCFLAGS FCFLAGS="$FCFLAGS $ac_cv_prog_fc_v" eval "set x $ac_link" shift printf "%s\n" "$as_me:${as_lineno-$LINENO}: $*" >&5 # gfortran 4.3 outputs lines setting COLLECT_GCC_OPTIONS, COMPILER_PATH, # LIBRARY_PATH; skip all such settings. ac_fc_v_output=`eval $ac_link 5>&1 2>&1 | sed '/^Driving:/d; /^Configured with:/d; '"/^[_$as_cr_Letters][_$as_cr_alnum]*=/d"` printf "%s\n" "$ac_fc_v_output" >&5 FCFLAGS=$ac_save_FCFLAGS rm -rf conftest* # On HP/UX there is a line like: "LPATH is: /foo:/bar:/baz" where # /foo, /bar, and /baz are search directories for the Fortran linker. # Here, we change these into -L/foo -L/bar -L/baz (and put it first): ac_fc_v_output="`echo $ac_fc_v_output | grep 'LPATH is:' | sed 's|.*LPATH is\(: *[^ ]*\).*|\1|;s|: */| -L/|g'` $ac_fc_v_output" # FIXME: we keep getting bitten by quoted arguments; a more general fix # that detects unbalanced quotes in FLIBS should be implemented # and (ugh) tested at some point. case $ac_fc_v_output in # With xlf replace commas with spaces, # and remove "-link" and closing parenthesis. *xlfentry*) ac_fc_v_output=`echo $ac_fc_v_output | sed ' s/,/ /g s/ -link / /g s/) *$// ' ` ;; # With Intel ifc, ignore the quoted -mGLOB_options_string stuff (quoted # $LIBS confuse us, and the libraries appear later in the output anyway). *mGLOB_options_string*) ac_fc_v_output=`echo $ac_fc_v_output | sed 's/"-mGLOB[^"]*"/ /g'` ;; # Portland Group compiler has singly- or doubly-quoted -cmdline argument # Singly-quoted arguments were reported for versions 5.2-4 and 6.0-4. # Doubly-quoted arguments were reported for "PGF90/x86 Linux/x86 5.0-2". *-cmdline\ * | *-ignore\ * | *-def\ *) ac_fc_v_output=`echo $ac_fc_v_output | sed "\ s/-cmdline *'[^']*'/ /g; s/-cmdline *\"[^\"]*\"/ /g s/-ignore *'[^']*'/ /g; s/-ignore *\"[^\"]*\"/ /g s/-def *'[^']*'/ /g; s/-def *\"[^\"]*\"/ /g"` ;; # If we are using fort77 (the f2c wrapper) then filter output and delete quotes. *fort77*f2c*gcc*) ac_fc_v_output=`echo "$ac_fc_v_output" | sed -n ' /:[ ]\+Running[ ]\{1,\}"gcc"/{ /"-c"/d /[.]c"*/d s/^.*"gcc"/"gcc"/ s/"//gp }'` ;; # If we are using Cray Fortran then delete quotes. *cft90*) ac_fc_v_output=`echo $ac_fc_v_output | sed 's/"//g'` ;; esac ac_cv_fc_libs= # Save positional arguments (if any) ac_save_positional="$@" set X $ac_fc_v_output while test $# != 1; do shift ac_arg=$1 case $ac_arg in [\\/]*.a | ?:[\\/]*.a) ac_exists=false for ac_i in $ac_cv_fc_libs; do if test x"$ac_arg" = x"$ac_i"; then ac_exists=true break fi done if test x"$ac_exists" = xtrue then : else $as_nop ac_cv_fc_libs="$ac_cv_fc_libs $ac_arg" fi ;; -bI:*) ac_exists=false for ac_i in $ac_cv_fc_libs; do if test x"$ac_arg" = x"$ac_i"; then ac_exists=true break fi done if test x"$ac_exists" = xtrue then : else $as_nop if test "$ac_compiler_gnu" = yes; then for ac_link_opt in $ac_arg; do ac_cv_fc_libs="$ac_cv_fc_libs -Xlinker $ac_link_opt" done else ac_cv_fc_libs="$ac_cv_fc_libs $ac_arg" fi fi ;; # Ignore these flags. -lang* | -lcrt*.o | -lc | -lgcc* | -lSystem | -libmil | -little \ |-LANG:=* | -LIST:* | -LNO:* | -link) ;; -lkernel32) # Ignore this library only on Windows-like systems. case $host_os in cygwin* | msys* ) ;; *) ac_exists=false for ac_i in $ac_cv_fc_libs; do if test x"$ac_arg" = x"$ac_i"; then ac_exists=true break fi done if test x"$ac_exists" = xtrue then : else $as_nop ac_cv_fc_libs="$ac_cv_fc_libs $ac_arg" fi ;; esac ;; -[LRuYz]) # These flags, when seen by themselves, take an argument. # We remove the space between option and argument and re-iterate # unless we find an empty arg or a new option (starting with -) case $2 in "" | -*);; *) ac_arg="$ac_arg$2" shift; shift set X $ac_arg "$@" ;; esac ;; -YP,*) for ac_j in `printf "%s\n" "$ac_arg" | sed -e 's/-YP,/-L/;s/:/ -L/g'`; do ac_exists=false for ac_i in $ac_cv_fc_libs; do if test x"$ac_j" = x"$ac_i"; then ac_exists=true break fi done if test x"$ac_exists" = xtrue then : else $as_nop ac_arg="$ac_arg $ac_j" ac_cv_fc_libs="$ac_cv_fc_libs $ac_j" fi done ;; -[lLR]*) ac_exists=false for ac_i in $ac_cv_fc_libs; do if test x"$ac_arg" = x"$ac_i"; then ac_exists=true break fi done if test x"$ac_exists" = xtrue then : else $as_nop ac_cv_fc_libs="$ac_cv_fc_libs $ac_arg" fi ;; -zallextract*| -zdefaultextract) ac_cv_fc_libs="$ac_cv_fc_libs $ac_arg" ;; -mllvm) ${2+shift};; # Defend against 'clang -mllvm -loopopt=0'. # Ignore everything else. esac done # restore positional arguments set X $ac_save_positional; shift # We only consider "LD_RUN_PATH" on Solaris systems. If this is seen, # then we insist that the "run path" must be an absolute path (i.e. it # must begin with a "/"). case `(uname -sr) 2>/dev/null` in "SunOS 5"*) ac_ld_run_path=`printf "%s\n" "$ac_fc_v_output" | sed -n 's,^.*LD_RUN_PATH *= *\(/[^ ]*\).*$,-R\1,p'` test "x$ac_ld_run_path" != x && if test "$ac_compiler_gnu" = yes; then for ac_link_opt in $ac_ld_run_path; do ac_cv_fc_libs="$ac_cv_fc_libs -Xlinker $ac_link_opt" done else ac_cv_fc_libs="$ac_cv_fc_libs $ac_ld_run_path" fi ;; esac fi # test "x$[]_AC_LANG_PREFIX[]LIBS" = "x" fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_fc_libs" >&5 printf "%s\n" "$ac_cv_fc_libs" >&6; } FCLIBS="$ac_cv_fc_libs" ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_ext=${ac_fc_srcext-f} ac_compile='$FC -c $FCFLAGS $ac_fcflags_srcext conftest.$ac_ext >&5' ac_link='$FC -o conftest$ac_exeext $FCFLAGS $LDFLAGS $ac_fcflags_srcext conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_fc_compiler_gnu { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for dummy main to link with Fortran libraries" >&5 printf %s "checking for dummy main to link with Fortran libraries... " >&6; } if test ${ac_cv_fc_dummy_main+y} then : printf %s "(cached) " >&6 else $as_nop ac_fc_dm_save_LIBS=$LIBS LIBS="$LIBS $FCLIBS" ac_fortran_dm_var=FC_DUMMY_MAIN ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu # First, try linking without a dummy main: cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef FC_DUMMY_MAIN #ifndef FC_DUMMY_MAIN_EQ_F77 # ifdef __cplusplus extern "C" # endif int FC_DUMMY_MAIN() { return 1; } #endif #endif int main (void) { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO" then : ac_cv_fortran_dummy_main=none else $as_nop ac_cv_fortran_dummy_main=unknown fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext if test $ac_cv_fortran_dummy_main = unknown; then for ac_func in MAIN__ MAIN_ __main MAIN _MAIN __MAIN main_ main__ _main; do cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #define $ac_fortran_dm_var $ac_func #ifdef FC_DUMMY_MAIN #ifndef FC_DUMMY_MAIN_EQ_F77 # ifdef __cplusplus extern "C" # endif int FC_DUMMY_MAIN() { return 1; } #endif #endif int main (void) { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO" then : ac_cv_fortran_dummy_main=$ac_func; break fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext done fi ac_ext=${ac_fc_srcext-f} ac_compile='$FC -c $FCFLAGS $ac_fcflags_srcext conftest.$ac_ext >&5' ac_link='$FC -o conftest$ac_exeext $FCFLAGS $LDFLAGS $ac_fcflags_srcext conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_fc_compiler_gnu ac_cv_fc_dummy_main=$ac_cv_fortran_dummy_main rm -rf conftest* LIBS=$ac_fc_dm_save_LIBS fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_fc_dummy_main" >&5 printf "%s\n" "$ac_cv_fc_dummy_main" >&6; } FC_DUMMY_MAIN=$ac_cv_fc_dummy_main if test "$FC_DUMMY_MAIN" != unknown then : if test $FC_DUMMY_MAIN != none; then printf "%s\n" "#define FC_DUMMY_MAIN $FC_DUMMY_MAIN" >>confdefs.h if test "x$ac_cv_fc_dummy_main" = "x$ac_cv_f77_dummy_main"; then printf "%s\n" "#define FC_DUMMY_MAIN_EQ_F77 1" >>confdefs.h fi fi else $as_nop { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "linking to Fortran libraries from C fails See \`config.log' for more details" "$LINENO" 5; } fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_ext=${ac_fc_srcext-f} ac_compile='$FC -c $FCFLAGS $ac_fcflags_srcext conftest.$ac_ext >&5' ac_link='$FC -o conftest$ac_exeext $FCFLAGS $LDFLAGS $ac_fcflags_srcext conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_fc_compiler_gnu { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for Fortran name-mangling scheme" >&5 printf %s "checking for Fortran name-mangling scheme... " >&6; } if test ${ac_cv_fc_mangling+y} then : printf %s "(cached) " >&6 else $as_nop cat > conftest.$ac_ext <<_ACEOF subroutine foobar() return end subroutine foo_bar() return end _ACEOF if ac_fn_fc_try_compile "$LINENO" then : mv conftest.$ac_objext cfortran_test.$ac_objext ac_save_LIBS=$LIBS LIBS="cfortran_test.$ac_objext $LIBS $FCLIBS" ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_success=no for ac_foobar in foobar FOOBAR; do for ac_underscore in "" "_"; do ac_func="$ac_foobar$ac_underscore" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ char $ac_func (); #ifdef FC_DUMMY_MAIN #ifndef FC_DUMMY_MAIN_EQ_F77 # ifdef __cplusplus extern "C" # endif int FC_DUMMY_MAIN() { return 1; } #endif #endif int main (void) { return $ac_func (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO" then : ac_success=yes; break 2 fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext done done ac_ext=${ac_fc_srcext-f} ac_compile='$FC -c $FCFLAGS $ac_fcflags_srcext conftest.$ac_ext >&5' ac_link='$FC -o conftest$ac_exeext $FCFLAGS $LDFLAGS $ac_fcflags_srcext conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_fc_compiler_gnu if test "$ac_success" = "yes"; then case $ac_foobar in foobar) ac_case=lower ac_foo_bar=foo_bar ;; FOOBAR) ac_case=upper ac_foo_bar=FOO_BAR ;; esac ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_success_extra=no for ac_extra in "" "_"; do ac_func="$ac_foo_bar$ac_underscore$ac_extra" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ char $ac_func (); #ifdef FC_DUMMY_MAIN #ifndef FC_DUMMY_MAIN_EQ_F77 # ifdef __cplusplus extern "C" # endif int FC_DUMMY_MAIN() { return 1; } #endif #endif int main (void) { return $ac_func (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO" then : ac_success_extra=yes; break fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext done ac_ext=${ac_fc_srcext-f} ac_compile='$FC -c $FCFLAGS $ac_fcflags_srcext conftest.$ac_ext >&5' ac_link='$FC -o conftest$ac_exeext $FCFLAGS $LDFLAGS $ac_fcflags_srcext conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_fc_compiler_gnu if test "$ac_success_extra" = "yes"; then ac_cv_fc_mangling="$ac_case case" if test -z "$ac_underscore"; then ac_cv_fc_mangling="$ac_cv_fc_mangling, no underscore" else ac_cv_fc_mangling="$ac_cv_fc_mangling, underscore" fi if test -z "$ac_extra"; then ac_cv_fc_mangling="$ac_cv_fc_mangling, no extra underscore" else ac_cv_fc_mangling="$ac_cv_fc_mangling, extra underscore" fi else ac_cv_fc_mangling="unknown" fi else ac_cv_fc_mangling="unknown" fi LIBS=$ac_save_LIBS rm -rf conftest* rm -f cfortran_test* else $as_nop { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compile a simple Fortran program See \`config.log' for more details" "$LINENO" 5; } fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_fc_mangling" >&5 printf "%s\n" "$ac_cv_fc_mangling" >&6; } ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_ext=${ac_fc_srcext-f} ac_compile='$FC -c $FCFLAGS $ac_fcflags_srcext conftest.$ac_ext >&5' ac_link='$FC -o conftest$ac_exeext $FCFLAGS $LDFLAGS $ac_fcflags_srcext conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_fc_compiler_gnu case $ac_cv_fc_mangling in "lower case, no underscore, no extra underscore") printf "%s\n" "#define FC_FUNC(name,NAME) name" >>confdefs.h printf "%s\n" "#define FC_FUNC_(name,NAME) name" >>confdefs.h ;; "lower case, no underscore, extra underscore") printf "%s\n" "#define FC_FUNC(name,NAME) name" >>confdefs.h printf "%s\n" "#define FC_FUNC_(name,NAME) name ## _" >>confdefs.h ;; "lower case, underscore, no extra underscore") printf "%s\n" "#define FC_FUNC(name,NAME) name ## _" >>confdefs.h printf "%s\n" "#define FC_FUNC_(name,NAME) name ## _" >>confdefs.h ;; "lower case, underscore, extra underscore") printf "%s\n" "#define FC_FUNC(name,NAME) name ## _" >>confdefs.h printf "%s\n" "#define FC_FUNC_(name,NAME) name ## __" >>confdefs.h ;; "upper case, no underscore, no extra underscore") printf "%s\n" "#define FC_FUNC(name,NAME) NAME" >>confdefs.h printf "%s\n" "#define FC_FUNC_(name,NAME) NAME" >>confdefs.h ;; "upper case, no underscore, extra underscore") printf "%s\n" "#define FC_FUNC(name,NAME) NAME" >>confdefs.h printf "%s\n" "#define FC_FUNC_(name,NAME) NAME ## _" >>confdefs.h ;; "upper case, underscore, no extra underscore") printf "%s\n" "#define FC_FUNC(name,NAME) NAME ## _" >>confdefs.h printf "%s\n" "#define FC_FUNC_(name,NAME) NAME ## _" >>confdefs.h ;; "upper case, underscore, extra underscore") printf "%s\n" "#define FC_FUNC(name,NAME) NAME ## _" >>confdefs.h printf "%s\n" "#define FC_FUNC_(name,NAME) NAME ## __" >>confdefs.h ;; *) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: unknown Fortran name-mangling scheme" >&5 printf "%s\n" "$as_me: WARNING: unknown Fortran name-mangling scheme" >&2;} ;; esac ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu fi if test "$hypre_using_mpi" = "no" then printf "%s\n" "#define HYPRE_SEQUENTIAL 1" >>confdefs.h else if test x = x"$MPILIBS"; then ac_fn_c_check_func "$LINENO" "MPI_Init" "ac_cv_func_MPI_Init" if test "x$ac_cv_func_MPI_Init" = xyes then : MPILIBS=" " fi fi if test x = x"$MPILIBS"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for MPI_Init in -lmpi" >&5 printf %s "checking for MPI_Init in -lmpi... " >&6; } if test ${ac_cv_lib_mpi_MPI_Init+y} then : printf %s "(cached) " >&6 else $as_nop ac_check_lib_save_LIBS=$LIBS LIBS="-lmpi $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ char MPI_Init (); #ifdef FC_DUMMY_MAIN #ifndef FC_DUMMY_MAIN_EQ_F77 # ifdef __cplusplus extern "C" # endif int FC_DUMMY_MAIN() { return 1; } #endif #endif int main (void) { return MPI_Init (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO" then : ac_cv_lib_mpi_MPI_Init=yes else $as_nop ac_cv_lib_mpi_MPI_Init=no fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_mpi_MPI_Init" >&5 printf "%s\n" "$ac_cv_lib_mpi_MPI_Init" >&6; } if test "x$ac_cv_lib_mpi_MPI_Init" = xyes then : MPILIBS="-lmpi" fi fi if test x = x"$MPILIBS"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for MPI_Init in -lmpich" >&5 printf %s "checking for MPI_Init in -lmpich... " >&6; } if test ${ac_cv_lib_mpich_MPI_Init+y} then : printf %s "(cached) " >&6 else $as_nop ac_check_lib_save_LIBS=$LIBS LIBS="-lmpich $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ char MPI_Init (); #ifdef FC_DUMMY_MAIN #ifndef FC_DUMMY_MAIN_EQ_F77 # ifdef __cplusplus extern "C" # endif int FC_DUMMY_MAIN() { return 1; } #endif #endif int main (void) { return MPI_Init (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO" then : ac_cv_lib_mpich_MPI_Init=yes else $as_nop ac_cv_lib_mpich_MPI_Init=no fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_mpich_MPI_Init" >&5 printf "%s\n" "$ac_cv_lib_mpich_MPI_Init" >&6; } if test "x$ac_cv_lib_mpich_MPI_Init" = xyes then : MPILIBS="-lmpich" fi fi if test x != x"$MPILIBS"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for mpi.h" >&5 printf %s "checking for mpi.h... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #ifdef FC_DUMMY_MAIN #ifndef FC_DUMMY_MAIN_EQ_F77 # ifdef __cplusplus extern "C" # endif int FC_DUMMY_MAIN() { return 1; } #endif #endif int main (void) { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 printf "%s\n" "yes" >&6; } else $as_nop MPILIBS="" { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi # Finally, execute ACTION-IF-FOUND/ACTION-IF-NOT-FOUND: if test x = x"$MPILIBS"; then : else printf "%s\n" "#define HYPRE_HAVE_MPI 1" >>confdefs.h LIBS="$LIBS $MPILIBS" : fi ac_fn_c_check_func "$LINENO" "MPI_Comm_f2c" "ac_cv_func_MPI_Comm_f2c" if test "x$ac_cv_func_MPI_Comm_f2c" = xyes then : printf "%s\n" "#define HAVE_MPI_COMM_F2C 1" >>confdefs.h fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5 printf %s "checking how to run the C preprocessor... " >&6; } # On Suns, sometimes $CPP names a directory. if test -n "$CPP" && test -d "$CPP"; then CPP= fi if test -z "$CPP"; then if test ${ac_cv_prog_CPP+y} then : printf %s "(cached) " >&6 else $as_nop # Double quotes because $CC needs to be expanded for CPP in "$CC -E" "$CC -E -traditional-cpp" cpp /lib/cpp do ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO" then : else $as_nop # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO" then : # Broken: success on invalid input. continue else $as_nop # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok then : break fi done ac_cv_prog_CPP=$CPP fi CPP=$ac_cv_prog_CPP else ac_cv_prog_CPP=$CPP fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 printf "%s\n" "$CPP" >&6; } ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO" then : else $as_nop # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO" then : # Broken: success on invalid input. continue else $as_nop # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok then : else $as_nop { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "C preprocessor \"$CPP\" fails sanity check See \`config.log' for more details" "$LINENO" 5; } fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 printf %s "checking for grep that handles long lines and -e... " >&6; } if test ${ac_cv_path_GREP+y} then : printf %s "(cached) " >&6 else $as_nop if test -z "$GREP"; then ac_path_GREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_prog in grep ggrep do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_GREP="$as_dir$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_GREP" || continue # Check for GNU ac_path_GREP and select it if it is found. # Check for GNU $ac_path_GREP case `"$ac_path_GREP" --version 2>&1` in *GNU*) ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; *) ac_count=0 printf %s 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" printf "%s\n" 'GREP' >> "conftest.nl" "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_GREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_GREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_GREP"; then as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_GREP=$GREP fi fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 printf "%s\n" "$ac_cv_path_GREP" >&6; } GREP="$ac_cv_path_GREP" { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 printf %s "checking for egrep... " >&6; } if test ${ac_cv_path_EGREP+y} then : printf %s "(cached) " >&6 else $as_nop if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 then ac_cv_path_EGREP="$GREP -E" else if test -z "$EGREP"; then ac_path_EGREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_prog in egrep do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_EGREP="$as_dir$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_EGREP" || continue # Check for GNU ac_path_EGREP and select it if it is found. # Check for GNU $ac_path_EGREP case `"$ac_path_EGREP" --version 2>&1` in *GNU*) ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; *) ac_count=0 printf %s 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" printf "%s\n" 'EGREP' >> "conftest.nl" "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_EGREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_EGREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_EGREP"; then as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_EGREP=$EGREP fi fi fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 printf "%s\n" "$ac_cv_path_EGREP" >&6; } EGREP="$ac_cv_path_EGREP" { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether MPI_Comm_f2c is a macro" >&5 printf %s "checking whether MPI_Comm_f2c is a macro... " >&6; } if test ${hypre_cv_func_MPI_Comm_f2c_macro+y} then : printf %s "(cached) " >&6 else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #ifdef MPI_Comm_f2c mpi_header_defines_MPI_Comm_f2c #endif _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "mpi_header_defines_MPI_Comm_f2c" >/dev/null 2>&1 then : hypre_cv_func_MPI_Comm_f2c_macro=yes else $as_nop hypre_cv_func_MPI_Comm_f2c_macro=no fi rm -rf conftest* fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $hypre_cv_func_MPI_Comm_f2c_macro" >&5 printf "%s\n" "$hypre_cv_func_MPI_Comm_f2c_macro" >&6; } if test $ac_cv_func_MPI_Comm_f2c = yes \ || test $hypre_cv_func_MPI_Comm_f2c_macro = yes; then printf "%s\n" "#define HYPRE_HAVE_MPI_COMM_F2C 1" >>confdefs.h fi fi if test "$hypre_using_node_aware_mpi" = "yes" then printf "%s\n" "#define HYPRE_USING_NODE_AWARE_MPI 1" >>confdefs.h fi if test "$hypre_using_memory_tracker" = "yes" then printf "%s\n" "#define HYPRE_USING_MEMORY_TRACKER 1" >>confdefs.h fi if test "$hypre_test_using_host" = "yes" then printf "%s\n" "#define HYPRE_TEST_USING_HOST 1" >>confdefs.h fi if test "$hypre_user_chose_blas" = "yes" then for blas_lib in $BLASLIBS; do if test $blas_lib = "-ldxml" then printf "%s\n" "#define HYPRE_USING_DXML 1" >>confdefs.h fi if test $blas_lib = "-lessl" then printf "%s\n" "#define HYPRE_USING_ESSL 1" >>confdefs.h fi done fi if test "$hypre_user_chose_blas" = "no" then hypre_using_hypre_blas=yes if test "$hypre_using_fortran" = "yes" then #*************************************************************** # Initialize return variables #*************************************************************** BLASLIBS="null" BLASLIBDIRS="null" # Check whether --with-blas was given. if test ${with_blas+y} then : withval=$with_blas; fi case $with_blas in yes) ;; *) BLASLIBS="internal" ;; esac #*************************************************************** # Save incoming LIBS and LDFLAGS values to be restored #*************************************************************** hypre_save_LIBS="$LIBS" hypre_save_LDFLGS="$LDFLAGS" LIBS="$LIBS $FLIBS" #*************************************************************** # Set possible BLAS library names #*************************************************************** BLAS_LIB_NAMES="blas essl dxml cxml mkl scs atlas complib.sgimath sunmath" #*************************************************************** # Set search paths for BLAS library #*************************************************************** temp_FLAGS="-L/usr/lib -L/usr/local/lib -L/lib -L/opt/intel/mkl70/lib/32" LDFLAGS="$temp_FLAGS $LDFLAGS" #*************************************************************** # Check for function dgemm in BLAS_LIB_NAMES #*************************************************************** if test "$BLASLIBS" = "null"; then ac_ext=${ac_fc_srcext-f} ac_compile='$FC -c $FCFLAGS $ac_fcflags_srcext conftest.$ac_ext >&5' ac_link='$FC -o conftest$ac_exeext $FCFLAGS $LDFLAGS $ac_fcflags_srcext conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_fc_compiler_gnu case $ac_cv_fc_mangling in upper*) ac_val="DGEMM" ;; lower*) ac_val="dgemm" ;; *) ac_val="unknown" ;; esac case $ac_cv_fc_mangling in *," underscore"*) ac_val="$ac_val"_ ;; esac dgemm="$ac_val" ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu for lib in $BLAS_LIB_NAMES; do as_ac_Lib=`printf "%s\n" "ac_cv_lib_$lib""_$dgemm" | $as_tr_sh` { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $dgemm in -l$lib" >&5 printf %s "checking for $dgemm in -l$lib... " >&6; } if eval test \${$as_ac_Lib+y} then : printf %s "(cached) " >&6 else $as_nop ac_check_lib_save_LIBS=$LIBS LIBS="-l$lib $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ char $dgemm (); #ifdef FC_DUMMY_MAIN #ifndef FC_DUMMY_MAIN_EQ_F77 # ifdef __cplusplus extern "C" # endif int FC_DUMMY_MAIN() { return 1; } #endif #endif int main (void) { return $dgemm (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO" then : eval "$as_ac_Lib=yes" else $as_nop eval "$as_ac_Lib=no" fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi eval ac_res=\$$as_ac_Lib { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 printf "%s\n" "$ac_res" >&6; } if eval test \"x\$"$as_ac_Lib"\" = x"yes" then : BLASLIBS=$lib fi done fi #*************************************************************** # Set path to selected BLAS library #*************************************************************** BLAS_SEARCH_DIRS="/usr/lib /usr/local/lib /lib" if test "$BLASLIBS" != "null"; then for dir in $BLAS_SEARCH_DIRS; do if test "$BLASLIBDIRS" = "null" -a -f $dir/lib$BLASLIBS.a; then BLASLIBDIRS=$dir fi if test "$BLASLIBDIRS" = "null" -a -f $dir/lib$BLASLIBS.so; then BLASLIBDIRS=$dir fi done fi #*************************************************************** # Set variables if ATLAS or DXML libraries are used #*************************************************************** if test "$BLASLIBS" = "dxml"; then printf "%s\n" "#define HYPRE_USING_DXML 1" >>confdefs.h fi if test "$BLASLIBS" = "essl"; then printf "%s\n" "#define HYPRE_USING_ESSL 1" >>confdefs.h fi #*************************************************************** # Add -L and -l prefixes if values found #*************************************************************** if test "$BLASLIBS" != "null" -a "$BLASLIBS" != "internal"; then BLASLIBS="-l$BLASLIBS" fi if test "$BLASLIBDIRS" != "null"; then BLASLIBDIRS="-L$BLASLIBDIRS" fi #*************************************************************** # Restore incoming LIBS and LDFLAGS values #*************************************************************** LIBS="$hypre_save_LIBS" LDFLAGS="$hypre_save_LDFLGS" if test "$BLASLIBS" = "null" then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: ***************************************" >&5 printf "%s\n" "$as_me: WARNING: ***************************************" >&2;} { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: Cannot find BLAS library" >&5 printf "%s\n" "$as_me: WARNING: Cannot find BLAS library" >&2;} { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: configuring --without-blas" >&5 printf "%s\n" "$as_me: WARNING: configuring --without-blas" >&2;} { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: ***************************************" >&5 printf "%s\n" "$as_me: WARNING: ***************************************" >&2;} elif test "$BLASLIBS" != "internal" then hypre_using_hypre_blas=no fi fi if test "$hypre_using_hypre_blas" = "yes" then BLASLIBDIRS="" BLASLIBS="" printf "%s\n" "#define HYPRE_USING_HYPRE_BLAS 1" >>confdefs.h fi fi if test "$hypre_user_chose_lapack" = "yes" then for lapack_lib in $LAPACKLIBS; do if test $lapack_lib = "-lessl" then printf "%s\n" "#define HYPRE_USING_ESSL 1" >>confdefs.h fi done fi if test "$hypre_user_chose_lapack" = "no" then hypre_using_hypre_lapack=yes if test "$hypre_using_fortran" = "yes" then #*************************************************************** # Initialize return variables #*************************************************************** LAPACKLIBS="null" LAPACKLIBDIRS="null" # Check whether --with-lapack was given. if test ${with_lapack+y} then : withval=$with_lapack; fi case $with_lapack in yes) ;; *) LAPACKLIBS="internal" ;; esac #*************************************************************** # Save incoming LIBS and LDFLAGS values to be restored #*************************************************************** hypre_save_LIBS="$LIBS" hypre_save_LDFLGS="$LDFLAGS" LIBS="$LIBS $FCLIBS" #*************************************************************** # Set possible LAPACK library names #*************************************************************** LAPACK_LIB_NAMES="lapack lapack_rs6k" #*************************************************************** # Set search paths for LAPACK library #*************************************************************** temp_FLAGS="-L/usr/lib -L/usr/local/lib -L/lib" LDFLAGS="$temp_FLAGS $LDFLAGS" #*************************************************************** # Check for function dsygv in LAPACK_LIB_NAMES #*************************************************************** if test "$LAPACKLIBS" = "null"; then ac_ext=${ac_fc_srcext-f} ac_compile='$FC -c $FCFLAGS $ac_fcflags_srcext conftest.$ac_ext >&5' ac_link='$FC -o conftest$ac_exeext $FCFLAGS $LDFLAGS $ac_fcflags_srcext conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_fc_compiler_gnu case $ac_cv_fc_mangling in upper*) ac_val="DSYGV" ;; lower*) ac_val="dsygv" ;; *) ac_val="unknown" ;; esac case $ac_cv_fc_mangling in *," underscore"*) ac_val="$ac_val"_ ;; esac dsygv="$ac_val" ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu for lib in $LAPACK_LIB_NAMES; do as_ac_Lib=`printf "%s\n" "ac_cv_lib_$lib""_$dsygv" | $as_tr_sh` { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $dsygv in -l$lib" >&5 printf %s "checking for $dsygv in -l$lib... " >&6; } if eval test \${$as_ac_Lib+y} then : printf %s "(cached) " >&6 else $as_nop ac_check_lib_save_LIBS=$LIBS LIBS="-l$lib -lblas $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ char $dsygv (); #ifdef FC_DUMMY_MAIN #ifndef FC_DUMMY_MAIN_EQ_F77 # ifdef __cplusplus extern "C" # endif int FC_DUMMY_MAIN() { return 1; } #endif #endif int main (void) { return $dsygv (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO" then : eval "$as_ac_Lib=yes" else $as_nop eval "$as_ac_Lib=no" fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi eval ac_res=\$$as_ac_Lib { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 printf "%s\n" "$ac_res" >&6; } if eval test \"x\$"$as_ac_Lib"\" = x"yes" then : LAPACKLIBS=$lib fi done fi #*************************************************************** # Set path to selected LAPACK library #*************************************************************** LAPACK_SEARCH_DIRS="/usr/lib /usr/local/lib /lib" if test "$LAPACKLIBS" != "null"; then for dir in $LAPACK_SEARCH_DIRS; do if test "$LAPACKLIBDIRS" = "null" -a -f $dir/lib$LAPACKLIBS.a; then LAPACKLIBDIRS=$dir fi if test "$LAPACKLIBDIRS" = "null" -a -f $dir/lib$LAPACKLIBS.so; then LAPACKLIBDIRS=$dir fi done fi #*************************************************************** # Add -L and -l prefixes if values found #*************************************************************** if test "$LAPACKLIBS" != "null" -a "$LAPACKLIBS" != "internal"; then LAPACKLIBS="-l$LAPACKLIBS" fi if test "$LAPACKLIBDIRS" != "null"; then LAPACKLIBDIRS="-L$LAPACKLIBDIRS" fi #*************************************************************** # Restore incoming LIBS and LDFLAGS values #*************************************************************** LIBS="$hypre_save_LIBS" LDFLAGS="$hypre_save_LDFLGS" if test "$LAPACKLIBS" = "null" then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: ***************************************" >&5 printf "%s\n" "$as_me: WARNING: ***************************************" >&2;} { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: Cannot find LAPACK library" >&5 printf "%s\n" "$as_me: WARNING: Cannot find LAPACK library" >&2;} { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: configuring --without-lapack" >&5 printf "%s\n" "$as_me: WARNING: configuring --without-lapack" >&2;} { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: ***************************************" >&5 printf "%s\n" "$as_me: WARNING: ***************************************" >&2;} elif test "$LAPACKLIBS" != "internal" then hypre_using_hypre_lapack=no fi fi if test "$hypre_using_hypre_lapack" = "yes" then LAPACKLIBDIRS="" LAPACKLIBS="" printf "%s\n" "#define HYPRE_USING_HYPRE_LAPACK 1" >>confdefs.h fi fi if test "$hypre_using_fei" = "yes" then HYPRE_FEI_SRC_DIR="$HYPRE_SRCDIR/FEI_mv" HYPRE_FEI_SUBDIRS="fei-hypre" HYPRE_FEI_HYPRE_FILES="$HYPRE_SRCDIR/FEI_mv/fei-hypre/*.o" HYPRE_FEI_FEMLI_FILES= if test "$hypre_using_mli" = "yes" then if test "$hypre_using_superlu" = "yes" then HYPRE_FEI_SUBDIRS="femli $HYPRE_FEI_SUBDIRS" HYPRE_FEI_FEMLI_FILES="$HYPRE_SRCDIR/FEI_mv/femli/*.o" printf "%s\n" "#define HAVE_MLI 1" >>confdefs.h fi fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for __gxx_personality_v0 in -lstdc++" >&5 printf %s "checking for __gxx_personality_v0 in -lstdc++... " >&6; } if test ${ac_cv_lib_stdcpp___gxx_personality_v0+y} then : printf %s "(cached) " >&6 else $as_nop ac_check_lib_save_LIBS=$LIBS LIBS="-lstdc++ $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ char __gxx_personality_v0 (); #ifdef FC_DUMMY_MAIN #ifndef FC_DUMMY_MAIN_EQ_F77 # ifdef __cplusplus extern "C" # endif int FC_DUMMY_MAIN() { return 1; } #endif #endif int main (void) { return __gxx_personality_v0 (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO" then : ac_cv_lib_stdcpp___gxx_personality_v0=yes else $as_nop ac_cv_lib_stdcpp___gxx_personality_v0=no fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_stdcpp___gxx_personality_v0" >&5 printf "%s\n" "$ac_cv_lib_stdcpp___gxx_personality_v0" >&6; } if test "x$ac_cv_lib_stdcpp___gxx_personality_v0" = xyes then : LIBS="$LIBS -lstdc++" fi else HYPRE_FEI_SRC_DIR= HYPRE_FEI_BASE_DIR= HYPRE_FEI_HYPRE_FILES= HYPRE_FEI_FEMLI_FILES= fi if test "$hypre_using_distributed_ls" = "yes" then HYPRE_DISTRIBUTED_LS_DIR="$HYPRE_SRCDIR/distributed_ls" HYPRE_EUCLID_FILES="$HYPRE_SRCDIR/distributed_ls/Euclid/*.o" HYPRE_PARASAILS_FILES="$HYPRE_SRCDIR/distributed_ls/ParaSails/*.o" HYPRE_PILUT_FILES="$HYPRE_SRCDIR/distributed_ls/pilut/*.o" else HYPRE_DISTRIBUTED_LS_DIR= HYPRE_EUCLID_FILES= HYPRE_PARASAILS_FILES= HYPRE_PILUT_FILES= fi if test "$hypre_using_debug" = "yes" then if test "x${hypre_user_chose_cflags}" = "xno" then case `basename ${CC}` in gcc|mpigcc|mpicc) CFLAGS="-O0 -g -Wall" if test "$hypre_using_openmp" = "yes" ; then CFLAGS+=" -fopenmp" LDFLAGS+=" -fopenmp" fi ;; icc|mpiicc|icx|mpiicx) CFLAGS="-O0 -g -Wall" if test "$hypre_using_openmp" = "yes" ; then CFLAGS+=" -qopenmp" LDFLAGS+=" -qopenmp" fi ;; pgcc|mpipgcc|mpipgicc) CFLAGS="-O0 -g -Wall" if test "$hypre_using_openmp" = "yes" ; then CFLAGS+=" -mp" LDFLAGS+=" -mp" fi ;; cc|xlc|mpxlc|mpixlc|mpcc) CFLAGS="-O0 -g -Wall" if test "$hypre_using_openmp" = "yes" ; then CFLAGS+=" -qsmp=omp" LDFLAGS+=" -qsmp=omp" fi ;; KCC|mpiKCC) CFLAGS="--c -g +K3" ;; *) CFLAGS="-g" ;; esac fi if test "x${hypre_user_chose_cxxflags}" = "xno" then case `basename ${CXX}` in g++|gCC|mpig++|mpicxx|mpic++|mpiCC) CXXFLAGS="-O0 -g -Wall" if test "$hypre_using_openmp" = "yes" ; then CXXFLAGS+=" -fopenmp" fi ;; icpc|icc|mpiicpc|mpiicc|icpx|mpiicpx) CXXFLAGS="-O0 -g -Wall" if test "$hypre_using_openmp" = "yes" ; then CXXFLAGS+=" -qopenmp" fi ;; pgCC|mpipgCC|pgc++|mpipgic++) CXXFLAGS="-O0 -g -Wall" if test "$hypre_using_openmp" = "yes" ; then CXXFLAGS+=" -mp" fi ;; CC|cxx|xlC|mpxlC|mpixlcxx|mpCC) CXXFLAGS="-O0 -g" if test "$hypre_using_openmp" = "yes" ; then CXXFLAGS+=" -qsmp=omp" fi ;; KCC|mpiKCC) CXXFLAGS="-g +K3" ;; *) CXXFLAGS="-g" ;; esac fi if test "$hypre_using_fortran" = "yes" -a "x${hypre_user_chose_fflags}" = "xno" then case `basename ${FC}` in g77|gfortran|mpigfortran|mpif77) FFLAGS="-g -Wall" if test "$hypre_using_openmp" = "yes" ; then FFLAGS="$FFLAGS -fopenmp" fi ;; ifort|mpiifort|ifx|mpiifx) FFLAGS="-g" if test "$hypre_using_openmp" = "yes" ; then FFLAGS="$FFLAGS -qopenmp" fi ;; pgf77|mpipgf77|pgfortran|mpipgifort) FFLAGS="-g" if test "$hypre_using_openmp" = "yes" ; then FFLAGS="$FFLAGS -mp" fi ;; f77|f90|xlf|mpxlf|mpixlf77) FFLAGS="-g" if test "$hypre_using_openmp" = "yes" ; then FFLAGS="$FFLAGS -qsmp=omp" fi ;; kf77|mpikf77) FFLAGS="-g +K3" ;; *) FFLAGS="-g" ;; esac fi printf "%s\n" "#define HYPRE_DEBUG 1" >>confdefs.h else if test "x${hypre_user_chose_cflags}" = "xno" then case `basename ${CC}` in gcc|mpigcc|mpicc) CFLAGS="-O2" if test "$hypre_using_openmp" = "yes" ; then CFLAGS+=" -fopenmp" LDFLAGS+=" -fopenmp" fi ;; icc|mpiicc|icx|mpiicx) CFLAGS="-O2" if test "$hypre_using_openmp" = "yes" ; then CFLAGS+=" -qopenmp" LDFLAGS+=" -qopenmp" fi ;; pgcc|mpipgcc|mpipgicc) CFLAGS="-fast" if test "$hypre_using_openmp" = "yes" ; then CFLAGS+=" -mp" LDFLAGS+=" -mp" fi ;; cc|xlc|xlc_r|mpxlc|mpixlc|mpixlc_r|mpixlc-gpu|mpcc) CFLAGS="-O2" if test "$hypre_using_openmp" = "yes" ; then CFLAGS+=" -qsmp=omp" LDFLAGS+=" -qsmp=omp" fi ;; KCC|mpiKCC) CFLAGS="-fast +K3" ;; *) CFLAGS="-O" ;; esac fi if test "x${hypre_user_chose_cxxflags}" = "xno" then case `basename ${CXX}` in g++|gCC|mpig++|mpicxx|mpic++|mpiCC) CXXFLAGS="-O2" if test "$hypre_using_openmp" = "yes" ; then CXXFLAGS+=" -fopenmp" fi ;; icpc|icc|mpiicpc|mpiicc|icpx|mpiicpx) CXXFLAGS="-O2" if test "$hypre_using_openmp" = "yes" ; then CXXFLAGS+=" -qopenmp" fi ;; pgCC|mpipgCC|pgc++|mpipgic++) CXXFLAGS="-fast" if test "$hypre_using_openmp" = "yes" ; then CXXFLAGS+=" -mp" fi ;; CC|cxx|xlC|xlC_r|mpxlC|mpixlC|mpixlC-gpu|mpixlcxx|mpixlcxx_r|mpCC) CXXFLAGS="-O2" if test "$hypre_using_openmp" = "yes" ; then CXXFLAGS+=" -qsmp=omp" fi ;; KCC|mpiKCC) CXXFLAGS="-fast +K3" ;; *) CXXFLAGS="-O" ;; esac fi if test "$hypre_using_fortran" = "yes" -a "x${hypre_user_chose_fflags}" = "xno" then case `basename ${FC}` in g77|gfortran|mpigfortran|mpif77) FFLAGS="-O2" if test "$hypre_using_openmp" = "yes" ; then FFLAGS+=" -fopenmp" fi ;; ifort|mpiifort) FFLAGS="-O2" if test "$hypre_using_openmp" = "yes" ; then FFLAGS+=" -qopenmp" fi ;; pgf77|mpipgf77|pgfortran|mpipgifort) FFLAGS="-fast" if test "$hypre_using_openmp" = "yes" ; then FFLAGS+=" -mp" fi ;; f77|f90|xlf|xlf_r|mpxlf|mpixlf77|mpixlf77_r) FFLAGS="-O2" if test "$hypre_using_openmp" = "yes" ; then FFLAGS+=" -qsmp=omp" fi ;; kf77|mpikf77) FFLAGS="-fast +K3" ;; *) FFLAGS="-O" ;; esac fi fi CFLAGS="${CFLAGS} ${EXTRA_CFLAGS}" CXXFLAGS="${CXXFLAGS} ${EXTRA_CXXFLAGS}" hypre_platform=`uname` case $hypre_platform in AIX* | aix* | Aix*) LDFLAGS="${LDFLAGS} -blpdata" CFLAGS="${CFLAGS} -blpdata" CXXFLAGS="${CXXFLAGS} -blpdata" FFLAGS="${FFLAGS} -blpdata" ;; esac LINK_FC='${FC}' LINK_CC='${CC}' LINK_CXX='${CXX}' HYPRE_LIBSUFFIX=".a" BUILD_PYTHON=0 PYTHON="" if test "$hypre_using_python" = "yes" then BUILD_PYTHON=1 PYTHON="${hypre_python}" fi BUILD_JAVA=0 if test "$hypre_using_java" = "yes" then BUILD_JAVA=1 fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for cabs in -lm" >&5 printf %s "checking for cabs in -lm... " >&6; } if test ${ac_cv_lib_m_cabs+y} then : printf %s "(cached) " >&6 else $as_nop ac_check_lib_save_LIBS=$LIBS LIBS="-lm $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ char cabs (); #ifdef FC_DUMMY_MAIN #ifndef FC_DUMMY_MAIN_EQ_F77 # ifdef __cplusplus extern "C" # endif int FC_DUMMY_MAIN() { return 1; } #endif #endif int main (void) { return cabs (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO" then : ac_cv_lib_m_cabs=yes else $as_nop ac_cv_lib_m_cabs=no fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_m_cabs" >&5 printf "%s\n" "$ac_cv_lib_m_cabs" >&6; } if test "x$ac_cv_lib_m_cabs" = xyes then : LIBS="$LIBS -lm" fi if test "$hypre_user_chose_blas" = "yes"; then if test "$hypre_blas_lib_old_style" = "yes" -a "$hypre_blas_lib_dir_old_style" = "no"; then as_fn_error 9 "*********** Unspecified BLASLIBDIRS error: ****************************** --with-blas-libs set without setting corresponding --with-blas-lib-dirs. Please specify directory paths to preferred blas libraries. Otherwise use --with-blas to search for library on the system. See \"configure --help\" for usage details. ********************************************************************" "$LINENO" 5 fi if test "$hypre_blas_lib_old_style" = "no" -a "$hypre_blas_lib_dir_old_style" = "yes"; then as_fn_error 9 "*********** Unspecified BLASLIB error: ********************************** --with-blas-lib-dirs set without setting corresponding --with-blas-libs. Please specify base names of preferred blas libraries in the provided dir paths. Otherwise use --with-blas to search for library on the system. See \"configure --help\" for usage details. ********************************************************************" "$LINENO" 5 fi fi if test "$hypre_user_chose_lapack" = "yes"; then if test "$hypre_lapack_lib_old_style" = "yes" -a "$hypre_lapack_lib_dir_old_style" = "no"; then as_fn_error 9 "*********** Unspecified LAPACKLIBDIRS error: ****************************** --with-lapack-libs set without setting corresponding --with-lapack-lib-dirs. Please specify directory paths to preferred lapack libraries. Otherwise use --with-lapack to search for library on the system. See \"configure --help\" for usage details. ********************************************************************" "$LINENO" 5 fi if test "$hypre_lapack_lib_old_style" = "no" -a "$hypre_lapack_lib_dir_old_style" = "yes"; then as_fn_error 9 "*********** Unspecified LAPACKLIB error: ********************************** --with-lapack-lib-dirs set without setting corresponding --with-lapack-libs. Please specify base names of preferred lapack libraries in the provided dir paths. Otherwise use --with-lapack to search for library on the system. See \"configure --help\" for usage details. ********************************************************************" "$LINENO" 5 fi fi if test "$hypre_using_shared" = "yes" then HYPRE_LIBSUFFIX=".so" SHARED_SET_SONAME="-Wl,-soname," SHARED_OPTIONS="-Wl,-z,defs" SHARED_COMPILE_FLAG="-fPIC" case $hypre_platform in AIX* | aix* | Aix*) SHARED_COMPILE_FLAG="-qmkshrobj" SHARED_BUILD_FLAG="-G" LINK_FC='${FC} -brtl' LINK_CC='${CC} -brtl' LINK_CXX='${CXX} -brtl' ;; DARWIN* | darwin* | Darwin*) SHARED_BUILD_FLAG="-dynamiclib -undefined dynamic_lookup" HYPRE_LIBSUFFIX=".dylib" SHARED_SET_SONAME="-install_name @rpath/" SHARED_OPTIONS="-undefined error" ;; *) SHARED_BUILD_FLAG="-shared" ;; esac SHARED_BUILD_FLAG="${SHARED_BUILD_FLAG} ${EXTRA_BUILDFLAGS}" FFLAGS="${FFLAGS} ${SHARED_COMPILE_FLAG}" CFLAGS="${CFLAGS} ${SHARED_COMPILE_FLAG}" CXXFLAGS="${CXXFLAGS} ${SHARED_COMPILE_FLAG}" BUILD_FC_SHARED="\${FC} ${SHARED_BUILD_FLAG}" if test "$hypre_using_fei" = "yes" then BUILD_CC_SHARED="\${CXX} ${SHARED_BUILD_FLAG}" else BUILD_CC_SHARED="\${CC} ${SHARED_BUILD_FLAG}" fi BUILD_CXX_SHARED="\${CXX} ${SHARED_BUILD_FLAG}" if test "$hypre_using_cuda" == "yes" || test "$hypre_using_hip" == "yes" || test "$hypre_using_kokkos" == "yes" then BUILD_CC_SHARED="\${CXX} ${SHARED_BUILD_FLAG}" fi fi if test "$hypre_using_caliper" = "yes" then if test "$hypre_user_gave_caliper_inc" != "yes" then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: *******************************************************" >&5 printf "%s\n" "$as_me: WARNING: *******************************************************" >&2;} { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: Configuring with --with-caliper=yes without providing" >&5 printf "%s\n" "$as_me: WARNING: Configuring with --with-caliper=yes without providing" >&2;} { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: --with-caliper-include=." >&5 printf "%s\n" "$as_me: WARNING: --with-caliper-include=." >&2;} { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: Using default user include path." >&5 printf "%s\n" "$as_me: WARNING: Using default user include path." >&2;} { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: NOTE: Caliper annotations may not work." >&5 printf "%s\n" "$as_me: WARNING: NOTE: Caliper annotations may not work." >&2;} { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: *******************************************************" >&5 printf "%s\n" "$as_me: WARNING: *******************************************************" >&2;} fi if test "$hypre_user_gave_caliper_lib" != "yes" then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: *******************************************************" >&5 printf "%s\n" "$as_me: WARNING: *******************************************************" >&2;} { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: Configuring with --with-caliper=yes without providing" >&5 printf "%s\n" "$as_me: WARNING: Configuring with --with-caliper=yes without providing" >&2;} { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: --with-caliper-lib=." >&5 printf "%s\n" "$as_me: WARNING: --with-caliper-lib=." >&2;} { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: Using default user library path." >&5 printf "%s\n" "$as_me: WARNING: Using default user library path." >&2;} { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: NOTE: Caliper annotations may not work." >&5 printf "%s\n" "$as_me: WARNING: NOTE: Caliper annotations may not work." >&2;} { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: *******************************************************" >&5 printf "%s\n" "$as_me: WARNING: *******************************************************" >&2;} fi fi if test "x$hypre_using_magma" = "xyes" then if test "x$hypre_user_gave_magma_inc" != "xyes" then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: *******************************************************" >&5 printf "%s\n" "$as_me: WARNING: *******************************************************" >&2;} { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: Configuring with --with-magma=yes without providing" >&5 printf "%s\n" "$as_me: WARNING: Configuring with --with-magma=yes without providing" >&2;} { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: --with-magma-include=." >&5 printf "%s\n" "$as_me: WARNING: --with-magma-include=." >&2;} { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: Using default user include path." >&5 printf "%s\n" "$as_me: WARNING: Using default user include path." >&2;} { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: NOTE: MAGMA may not work." >&5 printf "%s\n" "$as_me: WARNING: NOTE: MAGMA may not work." >&2;} { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: *******************************************************" >&5 printf "%s\n" "$as_me: WARNING: *******************************************************" >&2;} fi if test "x$hypre_user_gave_magma_lib" != "xyes" then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: *******************************************************" >&5 printf "%s\n" "$as_me: WARNING: *******************************************************" >&2;} { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: Configuring with --with-magma=yes without providing" >&5 printf "%s\n" "$as_me: WARNING: Configuring with --with-magma=yes without providing" >&2;} { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: --with-magma-lib=." >&5 printf "%s\n" "$as_me: WARNING: --with-magma-lib=." >&2;} { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: Using default user library path." >&5 printf "%s\n" "$as_me: WARNING: Using default user library path." >&2;} { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: NOTE: MAGMA may not work." >&5 printf "%s\n" "$as_me: WARNING: NOTE: MAGMA may not work." >&2;} { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: *******************************************************" >&5 printf "%s\n" "$as_me: WARNING: *******************************************************" >&2;} fi fi if test "x$hypre_using_um" = "xyes" then if test "x$hypre_using_cuda" != "xyes" && test "x$hypre_using_device_openmp" != "xyes" && test "x$hypre_using_hip" != "xyes" && test "x$hypre_using_sycl" != "xyes" then as_fn_error $? "Asked for unified memory, but not using CUDA, HIP, SYCL, or device OpenMP!" "$LINENO" 5 fi fi if test "$hypre_using_cuda" = "yes" then ac_header= ac_cache= for ac_item in $ac_header_c_list do if test $ac_cache; then ac_fn_c_check_header_compile "$LINENO" $ac_header ac_cv_header_$ac_cache "$ac_includes_default" if eval test \"x\$ac_cv_header_$ac_cache\" = xyes; then printf "%s\n" "#define $ac_item 1" >> confdefs.h fi ac_header= ac_cache= elif test $ac_header; then ac_cache=$ac_item else ac_header=$ac_item fi done if test $ac_cv_header_stdlib_h = yes && test $ac_cv_header_string_h = yes then : printf "%s\n" "#define STDC_HEADERS 1" >>confdefs.h fi as_ac_Header=`printf "%s\n" "ac_cv_header_"${CUDA_HOME}/include/cuda.h"" | $as_tr_sh` ac_fn_c_check_header_compile "$LINENO" ""${CUDA_HOME}/include/cuda.h"" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes" then : hypre_found_cuda=yes; HYPRE_CUDA_PATH=${CUDA_HOME} fi if test "x$hypre_found_cuda" != "xyes" then as_ac_Header=`printf "%s\n" "ac_cv_header_"${CUDA_PATH}/include/cuda.h"" | $as_tr_sh` ac_fn_c_check_header_compile "$LINENO" ""${CUDA_PATH}/include/cuda.h"" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes" then : hypre_found_cuda=yes; HYPRE_CUDA_PATH=${CUDA_PATH} fi fi if test "x$hypre_found_cuda" != "xyes" then as_fn_error $? "unable to find cuda.h ... Ensure that CUDA_HOME or CUDA_PATH is set" "$LINENO" 5 fi fi if test "$hypre_using_cusparse" = "yes" then as_ac_File=`printf "%s\n" "ac_cv_file_${HYPRE_CUDA_PATH}/include/cusparse.h" | $as_tr_sh` { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for ${HYPRE_CUDA_PATH}/include/cusparse.h" >&5 printf %s "checking for ${HYPRE_CUDA_PATH}/include/cusparse.h... " >&6; } if eval test \${$as_ac_File+y} then : printf %s "(cached) " >&6 else $as_nop test "$cross_compiling" = yes && as_fn_error $? "cannot check for file existence when cross compiling" "$LINENO" 5 if test -r "${HYPRE_CUDA_PATH}/include/cusparse.h"; then eval "$as_ac_File=yes" else eval "$as_ac_File=no" fi fi eval ac_res=\$$as_ac_File { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 printf "%s\n" "$ac_res" >&6; } if eval test \"x\$"$as_ac_File"\" = x"yes" then : hypre_found_cusparse=yes; HYPRE_VENDOR_MATH_PATH=${HYPRE_CUDA_PATH} fi if test "x$hypre_found_cusparse" != "xyes" then as_ac_File=`printf "%s\n" "ac_cv_file_${HYPRE_CUDA_PATH}/../math_libs/include/cusparse.h" | $as_tr_sh` { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for ${HYPRE_CUDA_PATH}/../math_libs/include/cusparse.h" >&5 printf %s "checking for ${HYPRE_CUDA_PATH}/../math_libs/include/cusparse.h... " >&6; } if eval test \${$as_ac_File+y} then : printf %s "(cached) " >&6 else $as_nop test "$cross_compiling" = yes && as_fn_error $? "cannot check for file existence when cross compiling" "$LINENO" 5 if test -r "${HYPRE_CUDA_PATH}/../math_libs/include/cusparse.h"; then eval "$as_ac_File=yes" else eval "$as_ac_File=no" fi fi eval ac_res=\$$as_ac_File { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 printf "%s\n" "$ac_res" >&6; } if eval test \"x\$"$as_ac_File"\" = x"yes" then : hypre_found_cusparse=yes; HYPRE_VENDOR_MATH_PATH=$(readlink -f ${HYPRE_CUDA_PATH}/../math_libs); { printf "%s\n" "$as_me:${as_lineno-$LINENO}: setting vendor math path to ${HYPRE_VENDOR_MATH_PATH}" >&5 printf "%s\n" "$as_me: setting vendor math path to ${HYPRE_VENDOR_MATH_PATH}" >&6;} fi fi if test "x$hypre_found_cusparse" != "xyes" then as_ac_File=`printf "%s\n" "ac_cv_file_${HYPRE_CUDA_PATH}/../../math_libs/include/cusparse.h" | $as_tr_sh` { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for ${HYPRE_CUDA_PATH}/../../math_libs/include/cusparse.h" >&5 printf %s "checking for ${HYPRE_CUDA_PATH}/../../math_libs/include/cusparse.h... " >&6; } if eval test \${$as_ac_File+y} then : printf %s "(cached) " >&6 else $as_nop test "$cross_compiling" = yes && as_fn_error $? "cannot check for file existence when cross compiling" "$LINENO" 5 if test -r "${HYPRE_CUDA_PATH}/../../math_libs/include/cusparse.h"; then eval "$as_ac_File=yes" else eval "$as_ac_File=no" fi fi eval ac_res=\$$as_ac_File { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 printf "%s\n" "$ac_res" >&6; } if eval test \"x\$"$as_ac_File"\" = x"yes" then : hypre_found_cusparse=yes; HYPRE_VENDOR_MATH_PATH=$(readlink -f ${HYPRE_CUDA_PATH}/../../math_libs); { printf "%s\n" "$as_me:${as_lineno-$LINENO}: setting vendor math path to ${HYPRE_VENDOR_MATH_PATH}" >&5 printf "%s\n" "$as_me: setting vendor math path to ${HYPRE_VENDOR_MATH_PATH}" >&6;} fi fi if test "x$hypre_found_cusparse" != "xyes" then as_fn_error $? "unable to find cusparse.h ..." "$LINENO" 5 fi fi if test "$hypre_using_cublas" = "yes" then as_ac_File=`printf "%s\n" "ac_cv_file_${HYPRE_CUDA_PATH}/include/cublas.h" | $as_tr_sh` { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for ${HYPRE_CUDA_PATH}/include/cublas.h" >&5 printf %s "checking for ${HYPRE_CUDA_PATH}/include/cublas.h... " >&6; } if eval test \${$as_ac_File+y} then : printf %s "(cached) " >&6 else $as_nop test "$cross_compiling" = yes && as_fn_error $? "cannot check for file existence when cross compiling" "$LINENO" 5 if test -r "${HYPRE_CUDA_PATH}/include/cublas.h"; then eval "$as_ac_File=yes" else eval "$as_ac_File=no" fi fi eval ac_res=\$$as_ac_File { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 printf "%s\n" "$ac_res" >&6; } if eval test \"x\$"$as_ac_File"\" = x"yes" then : hypre_found_cublas=yes; HYPRE_VENDOR_MATH_PATH=${HYPRE_CUDA_PATH} fi if test "x$hypre_found_cublas" != "xyes" && test "x${HYPRE_VENDOR_MATH_PATH}" != "x" then as_ac_File=`printf "%s\n" "ac_cv_file_${HYPRE_VENDOR_MATH_PATH}/include/cublas.h" | $as_tr_sh` { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for ${HYPRE_VENDOR_MATH_PATH}/include/cublas.h" >&5 printf %s "checking for ${HYPRE_VENDOR_MATH_PATH}/include/cublas.h... " >&6; } if eval test \${$as_ac_File+y} then : printf %s "(cached) " >&6 else $as_nop test "$cross_compiling" = yes && as_fn_error $? "cannot check for file existence when cross compiling" "$LINENO" 5 if test -r "${HYPRE_VENDOR_MATH_PATH}/include/cublas.h"; then eval "$as_ac_File=yes" else eval "$as_ac_File=no" fi fi eval ac_res=\$$as_ac_File { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 printf "%s\n" "$ac_res" >&6; } if eval test \"x\$"$as_ac_File"\" = x"yes" then : hypre_found_cublas=yes; fi fi if test "x$hypre_found_cublas" != "xyes" then as_ac_File=`printf "%s\n" "ac_cv_file_${HYPRE_CUDA_PATH}/../math_libs/include/cublas.h" | $as_tr_sh` { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for ${HYPRE_CUDA_PATH}/../math_libs/include/cublas.h" >&5 printf %s "checking for ${HYPRE_CUDA_PATH}/../math_libs/include/cublas.h... " >&6; } if eval test \${$as_ac_File+y} then : printf %s "(cached) " >&6 else $as_nop test "$cross_compiling" = yes && as_fn_error $? "cannot check for file existence when cross compiling" "$LINENO" 5 if test -r "${HYPRE_CUDA_PATH}/../math_libs/include/cublas.h"; then eval "$as_ac_File=yes" else eval "$as_ac_File=no" fi fi eval ac_res=\$$as_ac_File { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 printf "%s\n" "$ac_res" >&6; } if eval test \"x\$"$as_ac_File"\" = x"yes" then : hypre_found_cublas=yes; HYPRE_VENDOR_MATH_PATH=$(readlink -f ${HYPRE_CUDA_PATH}/../math_libs); { printf "%s\n" "$as_me:${as_lineno-$LINENO}: setting vendor math path to ${HYPRE_VENDOR_MATH_PATH}" >&5 printf "%s\n" "$as_me: setting vendor math path to ${HYPRE_VENDOR_MATH_PATH}" >&6;} fi fi if test "x$hypre_found_cublas" != "xyes" then as_ac_File=`printf "%s\n" "ac_cv_file_${HYPRE_CUDA_PATH}/../../math_libs/include/cublas.h" | $as_tr_sh` { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for ${HYPRE_CUDA_PATH}/../../math_libs/include/cublas.h" >&5 printf %s "checking for ${HYPRE_CUDA_PATH}/../../math_libs/include/cublas.h... " >&6; } if eval test \${$as_ac_File+y} then : printf %s "(cached) " >&6 else $as_nop test "$cross_compiling" = yes && as_fn_error $? "cannot check for file existence when cross compiling" "$LINENO" 5 if test -r "${HYPRE_CUDA_PATH}/../../math_libs/include/cublas.h"; then eval "$as_ac_File=yes" else eval "$as_ac_File=no" fi fi eval ac_res=\$$as_ac_File { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 printf "%s\n" "$ac_res" >&6; } if eval test \"x\$"$as_ac_File"\" = x"yes" then : hypre_found_cublas=yes; HYPRE_VENDOR_MATH_PATH=$(readlink -f ${HYPRE_CUDA_PATH}/../../math_libs); { printf "%s\n" "$as_me:${as_lineno-$LINENO}: setting vendor math path to ${HYPRE_VENDOR_MATH_PATH}" >&5 printf "%s\n" "$as_me: setting vendor math path to ${HYPRE_VENDOR_MATH_PATH}" >&6;} fi fi if test "x$hypre_found_cublas" != "xyes" then as_fn_error $? "unable to find cublas.h ..." "$LINENO" 5 fi fi if test "$hypre_using_cusolver" = "yes" then as_ac_File=`printf "%s\n" "ac_cv_file_${HYPRE_CUDA_PATH}/include/cusolverDn.h" | $as_tr_sh` { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for ${HYPRE_CUDA_PATH}/include/cusolverDn.h" >&5 printf %s "checking for ${HYPRE_CUDA_PATH}/include/cusolverDn.h... " >&6; } if eval test \${$as_ac_File+y} then : printf %s "(cached) " >&6 else $as_nop test "$cross_compiling" = yes && as_fn_error $? "cannot check for file existence when cross compiling" "$LINENO" 5 if test -r "${HYPRE_CUDA_PATH}/include/cusolverDn.h"; then eval "$as_ac_File=yes" else eval "$as_ac_File=no" fi fi eval ac_res=\$$as_ac_File { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 printf "%s\n" "$ac_res" >&6; } if eval test \"x\$"$as_ac_File"\" = x"yes" then : hypre_found_cusolver=yes; HYPRE_VENDOR_MATH_PATH=${HYPRE_CUDA_PATH} fi if test "x$hypre_found_cusolver" != "xyes" && test "x${HYPRE_VENDOR_MATH_PATH}" != "x" then as_ac_File=`printf "%s\n" "ac_cv_file_${HYPRE_VENDOR_MATH_PATH}/include/cusolverDn.h" | $as_tr_sh` { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for ${HYPRE_VENDOR_MATH_PATH}/include/cusolverDn.h" >&5 printf %s "checking for ${HYPRE_VENDOR_MATH_PATH}/include/cusolverDn.h... " >&6; } if eval test \${$as_ac_File+y} then : printf %s "(cached) " >&6 else $as_nop test "$cross_compiling" = yes && as_fn_error $? "cannot check for file existence when cross compiling" "$LINENO" 5 if test -r "${HYPRE_VENDOR_MATH_PATH}/include/cusolverDn.h"; then eval "$as_ac_File=yes" else eval "$as_ac_File=no" fi fi eval ac_res=\$$as_ac_File { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 printf "%s\n" "$ac_res" >&6; } if eval test \"x\$"$as_ac_File"\" = x"yes" then : hypre_found_cusolver=yes; fi fi if test "x$hypre_found_cusolver" != "xyes" then as_ac_File=`printf "%s\n" "ac_cv_file_${HYPRE_CUDA_PATH}/../math_libs/include/cusolverDn.h" | $as_tr_sh` { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for ${HYPRE_CUDA_PATH}/../math_libs/include/cusolverDn.h" >&5 printf %s "checking for ${HYPRE_CUDA_PATH}/../math_libs/include/cusolverDn.h... " >&6; } if eval test \${$as_ac_File+y} then : printf %s "(cached) " >&6 else $as_nop test "$cross_compiling" = yes && as_fn_error $? "cannot check for file existence when cross compiling" "$LINENO" 5 if test -r "${HYPRE_CUDA_PATH}/../math_libs/include/cusolverDn.h"; then eval "$as_ac_File=yes" else eval "$as_ac_File=no" fi fi eval ac_res=\$$as_ac_File { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 printf "%s\n" "$ac_res" >&6; } if eval test \"x\$"$as_ac_File"\" = x"yes" then : hypre_found_cusolver=yes; HYPRE_VENDOR_MATH_PATH=$(readlink -f ${HYPRE_CUDA_PATH}/../math_libs); { printf "%s\n" "$as_me:${as_lineno-$LINENO}: setting vendor math path to ${HYPRE_VENDOR_MATH_PATH}" >&5 printf "%s\n" "$as_me: setting vendor math path to ${HYPRE_VENDOR_MATH_PATH}" >&6;} fi fi if test "x$hypre_found_cusolver" != "xyes" then as_ac_File=`printf "%s\n" "ac_cv_file_${HYPRE_CUDA_PATH}/../../math_libs/include/cusolverDn.h" | $as_tr_sh` { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for ${HYPRE_CUDA_PATH}/../../math_libs/include/cusolverDn.h" >&5 printf %s "checking for ${HYPRE_CUDA_PATH}/../../math_libs/include/cusolverDn.h... " >&6; } if eval test \${$as_ac_File+y} then : printf %s "(cached) " >&6 else $as_nop test "$cross_compiling" = yes && as_fn_error $? "cannot check for file existence when cross compiling" "$LINENO" 5 if test -r "${HYPRE_CUDA_PATH}/../../math_libs/include/cusolverDn.h"; then eval "$as_ac_File=yes" else eval "$as_ac_File=no" fi fi eval ac_res=\$$as_ac_File { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 printf "%s\n" "$ac_res" >&6; } if eval test \"x\$"$as_ac_File"\" = x"yes" then : hypre_found_cusolver=yes; HYPRE_VENDOR_MATH_PATH=$(readlink -f ${HYPRE_CUDA_PATH}/../../math_libs); { printf "%s\n" "$as_me:${as_lineno-$LINENO}: setting vendor math path to ${HYPRE_VENDOR_MATH_PATH}" >&5 printf "%s\n" "$as_me: setting vendor math path to ${HYPRE_VENDOR_MATH_PATH}" >&6;} fi fi if test "x$hypre_found_cusolver" != "xyes" then as_fn_error $? "unable to find cusolverDn.h ..." "$LINENO" 5 fi fi if test x"$hypre_using_hip" == x"yes" then : if test -n "$ROCM_PATH" then : HYPRE_ROCM_PREFIX=$ROCM_PATH else $as_nop HYPRE_ROCM_PREFIX=/opt/rocm fi as_ac_Header=`printf "%s\n" "ac_cv_header_"${HYPRE_ROCM_PREFIX}/include/hip/hip_common.h"" | $as_tr_sh` ac_fn_c_check_header_compile "$LINENO" ""${HYPRE_ROCM_PREFIX}/include/hip/hip_common.h"" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes" then : hypre_found_hip=yes else $as_nop as_fn_error $? "unable to find ${HYPRE_ROCM_PREFIX}/include/hip/hip_common.h ... Ensure ROCm is installed and set ROCM_PATH environment variable to ROCm installation path." "$LINENO" 5 fi fi if test "x$hypre_using_raja" = "xyes" then printf "%s\n" "#define HYPRE_USING_RAJA 1" >>confdefs.h if test "$hypre_user_chose_cxxflags" = "no" then if test "$hypre_using_cuda" != "yes" then if test "$CXX" = "mpixlC" || test "$CXX" = "xlC_r" then CXXFLAGS="${CXXFLAGS} -+ -std=c++${hypre_cxxstd}" fi fi fi CC=${CXX} LINK_CC=${LINK_CXX} CFLAGS=${CXXFLAGS} fi if test "x$hypre_using_kokkos" = "xyes" then printf "%s\n" "#define HYPRE_USING_KOKKOS 1" >>confdefs.h if test "$hypre_user_chose_cxxflags" = "no" then CXXFLAGS="${CXXFLAGS} -std=c++${hypre_cxxstd}" if test "$CXX" = "mpiclang++" || test "$CXX" = "mpiclang++-gpu" || test "$CXX" = "clang++" || test "$CXX" = "clang++-gpu" || test "$CXX" = "icpx" || test "$CXX" = "mpiicpx" then CXXFLAGS="${CXXFLAGS} -x c++" fi if test "$CXX" = "mpixlC" || test "$CXX" = "mpixlC-gpu" || test "$CXX" = "xlC" || test "$CXX" = "xlC-gpu" then CXXFLAGS="${CXXFLAGS} -+" fi fi LINK_CC=${LINK_CXX} fi if test "x$hypre_using_umpire_host" = "xyes" then hypre_using_umpire=yes printf "%s\n" "#define HYPRE_USING_UMPIRE_HOST 1" >>confdefs.h fi if test "x$hypre_using_umpire_device" = "xyes" then hypre_using_umpire=yes printf "%s\n" "#define HYPRE_USING_UMPIRE_DEVICE 1" >>confdefs.h fi if test "x$hypre_using_umpire_um" = "xyes" then hypre_using_umpire=yes printf "%s\n" "#define HYPRE_USING_UMPIRE_UM 1" >>confdefs.h fi if test "x$hypre_using_umpire_pinned" = "xyes" then hypre_using_umpire=yes printf "%s\n" "#define HYPRE_USING_UMPIRE_PINNED 1" >>confdefs.h fi if test "x$hypre_using_umpire" = "xyes" then printf "%s\n" "#define HYPRE_USING_UMPIRE 1" >>confdefs.h fi if test "$hypre_using_cuda" = "yes" then printf "%s\n" "#define HYPRE_USING_GPU 1" >>confdefs.h printf "%s\n" "#define HYPRE_USING_CUDA 1" >>confdefs.h LINK_CC=${LINK_CXX} if test "x$HYPRE_CUDA_SM" = "x" then HYPRE_CUDA_SM=70 fi HYPRE_CUDA_GENCODE="" for sm in ${HYPRE_CUDA_SM}; do HYPRE_CUDA_GENCODE="${HYPRE_CUDA_GENCODE}-gencode arch=compute_${sm},code=sm_${sm} " done if test "$hypre_user_chose_cuflags" = "no" then CUFLAGS="-lineinfo -expt-extended-lambda -std=c++${hypre_cxxstd} --x cu" if test "$hypre_using_debug" = "yes" then CUFLAGS="-g -O0 ${CUFLAGS}" else CUFLAGS="-O2 ${CUFLAGS}" fi CUFLAGS="${CUFLAGS} -Xcompiler \"${CXXFLAGS}\"" fi HYPRE_CUDA_INCLUDE='-I${HYPRE_CUDA_PATH}/include' HYPRE_CUDA_LIBS='-L${HYPRE_CUDA_PATH}/lib64 -lcudart' if test x"$hypre_using_cusparse" == x"yes" || test x"$hypre_using_cublas" == x"yes" || test x"$hypre_using_cusolver" == x"yes" then : if test "x$HYPRE_CUDA_PATH" != "x$HYPRE_VENDOR_MATH_PATH" then : HYPRE_CUDA_INCLUDE+=" -I${HYPRE_VENDOR_MATH_PATH}/include" HYPRE_CUDA_LIBS+=" -L${HYPRE_VENDOR_MATH_PATH}/lib64" fi fi if test "$hypre_using_gpu_profiling" = "yes" then printf "%s\n" "#define HYPRE_USING_NVTX 1" >>confdefs.h HYPRE_CUDA_LIBS+=" -lnvToolsExt" fi if test "$hypre_using_cusparse" = "yes" then printf "%s\n" "#define HYPRE_USING_CUSPARSE 1" >>confdefs.h HYPRE_CUDA_LIBS+=" -lcusparse" fi if test "$hypre_using_cublas" = "yes" then printf "%s\n" "#define HYPRE_USING_CUBLAS 1" >>confdefs.h HYPRE_CUDA_LIBS+=" -lcublas" fi if test "$hypre_using_curand" = "yes" then printf "%s\n" "#define HYPRE_USING_CURAND 1" >>confdefs.h HYPRE_CUDA_LIBS+=" -lcurand" fi if test "$hypre_using_cusolver" = "yes" then printf "%s\n" "#define HYPRE_USING_CUSOLVER 1" >>confdefs.h HYPRE_CUDA_LIBS+=" -lcusolver" fi if test "$hypre_using_device_pool" = "yes" then printf "%s\n" "#define HYPRE_USING_DEVICE_POOL 1" >>confdefs.h fi if test "$hypre_using_device_malloc_async" = "yes" then printf "%s\n" "#define HYPRE_USING_DEVICE_MALLOC_ASYNC 1" >>confdefs.h fi if test "$hypre_using_thrust_nosync" = "yes" then printf "%s\n" "#define HYPRE_USING_THRUST_NOSYNC 1" >>confdefs.h fi if test "x$hypre_using_cuda_streams" = "xyes" then printf "%s\n" "#define HYPRE_USING_CUDA_STREAMS 1" >>confdefs.h fi fi if test x"$hypre_using_hip" == x"yes" then : printf "%s\n" "#define HYPRE_USING_GPU 1" >>confdefs.h printf "%s\n" "#define HYPRE_USING_HIP 1" >>confdefs.h LINK_CC=${LINK_CXX} if test "x${HYPRE_CUDA_SM}" != "x" then HYPRE_CUDA_GENCODE="--offload-arch=" for sm in ${HYPRE_CUDA_SM}; do HYPRE_CUDA_GENCODE="${HYPRE_CUDA_GENCODE}${sm}," done HYPRE_CUDA_GENCODE="`echo ${HYPRE_CUDA_GENCODE}|sed 's/,$//'`" fi HIPCXXFLAGS="-x hip -std=c++14 ${HIPCXXFLAGS}" if test x"$hypre_using_debug" == x"yes" then : HIPCXXFLAGS="-O1 -Wall -g -ggdb ${HIPCXXFLAGS}" elif HIPCXXFLAGS="-O2 ${HIPCXXFLAGS}" then : fi if test "$hypre_using_shared" = "yes" then HIPCXXFLAGS="${SHARED_COMPILE_FLAG} ${HIPCXXFLAGS}" fi if test "$hypre_user_chose_cuflags" = "no" then CUFLAGS="${HIPCPPFLAGS} ${HIPCXXFLAGS}" fi HYPRE_HIP_INCL="-I${HYPRE_ROCM_PREFIX}/include" HYPRE_HIP_LIBS="-L${HYPRE_ROCM_PREFIX}/lib -lamdhip64" if test x"$hypre_using_rocsparse" == x"yes" then : printf "%s\n" "#define HYPRE_USING_ROCSPARSE 1" >>confdefs.h HYPRE_HIP_LIBS+=" -lrocsparse" fi if test x"$hypre_using_rocblas" == x"yes" then : printf "%s\n" "#define HYPRE_USING_ROCBLAS 1" >>confdefs.h HYPRE_HIP_LIBS+=" -lrocblas" fi if test x"$hypre_using_rocsolver" == x"yes" then : printf "%s\n" "#define HYPRE_USING_ROCSOLVER 1" >>confdefs.h HYPRE_HIP_LIBS+=" -lrocsolver" fi if test x"$hypre_using_rocrand" == x"yes" then : printf "%s\n" "#define HYPRE_USING_ROCRAND 1" >>confdefs.h HYPRE_HIP_LIBS+=" -lrocrand" fi if test x"$hypre_using_gpu_profiling" == x"yes" then : printf "%s\n" "#define HYPRE_USING_ROCTX 1" >>confdefs.h HYPRE_HIP_LIBS+=" -lroctx64" fi if test x"$hypre_using_cuda_streams" == x"yes" then : printf "%s\n" "#define HYPRE_USING_CUDA_STREAMS 1" >>confdefs.h fi fi if test x"$hypre_using_sycl" == x"yes" then : printf "%s\n" "#define HYPRE_USING_GPU 1" >>confdefs.h printf "%s\n" "#define HYPRE_USING_SYCL 1" >>confdefs.h LINK_CC=${CUCC} LINK_CXX=${CUCC} SYCLFLAGS="-fsycl -fsycl-unnamed-lambda" if test "$hypre_using_debug" = "yes" then SYCLFLAGS="-Wall ${SYCLFLAGS}" else SYCLFLAGS="-O3 ${SYCLFLAGS}" fi LDFLAGS+=" -fsycl -fsycl-device-code-split=per_kernel -Wl,--no-relax" if test "x${HYPRE_SYCL_TARGET}" != "x" then LDFLAGS+=" -fsycl-targets=${HYPRE_SYCL_TARGET}" fi if test "x${HYPRE_SYCL_TARGET_BACKEND}" != "x" then LDFLAGS+=" -Xsycl-target-backend ${HYPRE_SYCL_TARGET_BACKEND}" fi if test "$hypre_using_shared" = "yes" then SYCLFLAGS="${SHARED_COMPILE_FLAG} ${SYCLFLAGS}" BUILD_CC_SHARED="\${CUCC} ${SHARED_BUILD_FLAG}" fi if test "$hypre_user_chose_cuflags" = "no" then CUFLAGS="${SYCLFLAGS}" fi if test x"$hypre_using_onemklsparse" == x"yes" || test x"$hypre_using_onemklblas" == x"yes" || test x"$hypre_using_onemklrand" == x"yes" then : as_ac_Header=`printf "%s\n" "ac_cv_header_"${MKLROOT}/include/mkl.h"" | $as_tr_sh` ac_fn_c_check_header_compile "$LINENO" ""${MKLROOT}/include/mkl.h"" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes" then : hypre_found_mkl=yes else $as_nop as_fn_error $? "unable to find oneMKL ... Ensure that MKLROOT is set" "$LINENO" 5 fi HYPRE_SYCL_LIBS="${HYPRE_SYCL_LIBS} -qmkl -Wl,-export-dynamic -Wl,--start-group -Wl,--end-group -lsycl -lOpenCL -lpthread -lm -ldl" HYPRE_SYCL_INCL="${HYPRE_SYCL_INCL} -qmkl -I${DPLROOT}/include -DMKL_ILP64 -I${MKLROOT}/include" fi if test x"$hypre_using_onemklsparse" == x"yes" then : printf "%s\n" "#define HYPRE_USING_ONEMKLSPARSE 1" >>confdefs.h fi if test x"$hypre_using_onemklblas" == x"yes" then : printf "%s\n" "#define HYPRE_USING_ONEMKLBLAS 1" >>confdefs.h fi if test x"$hypre_using_onemklrand" == x"yes" then : printf "%s\n" "#define HYPRE_USING_ONEMKLRAND 1" >>confdefs.h fi printf "%s\n" "#define HYPRE_USING_CUDA_STREAMS 1" >>confdefs.h fi if test "$hypre_using_um" != "yes" then if test "$hypre_using_cuda" = "yes" then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: ***********************************************************************" >&5 printf "%s\n" "$as_me: ***********************************************************************" >&6;} { printf "%s\n" "$as_me:${as_lineno-$LINENO}: Configuring with --with-cuda=yes without unified memory." >&5 printf "%s\n" "$as_me: Configuring with --with-cuda=yes without unified memory." >&6;} { printf "%s\n" "$as_me:${as_lineno-$LINENO}: It only works for structured solvers and selected unstructured solvers" >&5 printf "%s\n" "$as_me: It only works for structured solvers and selected unstructured solvers" >&6;} { printf "%s\n" "$as_me:${as_lineno-$LINENO}: Use --enable-unified-memory to compile with unified memory." >&5 printf "%s\n" "$as_me: Use --enable-unified-memory to compile with unified memory." >&6;} { printf "%s\n" "$as_me:${as_lineno-$LINENO}: ***********************************************************************" >&5 printf "%s\n" "$as_me: ***********************************************************************" >&6;} fi if test "$hypre_using_hip" = "yes" then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: ***********************************************************************" >&5 printf "%s\n" "$as_me: ***********************************************************************" >&6;} { printf "%s\n" "$as_me:${as_lineno-$LINENO}: Configuring with --with-hip=yes without unified memory." >&5 printf "%s\n" "$as_me: Configuring with --with-hip=yes without unified memory." >&6;} { printf "%s\n" "$as_me:${as_lineno-$LINENO}: It only works for structured solvers and selected unstructured solvers" >&5 printf "%s\n" "$as_me: It only works for structured solvers and selected unstructured solvers" >&6;} { printf "%s\n" "$as_me:${as_lineno-$LINENO}: Use --enable-unified-memory to compile with unified memory." >&5 printf "%s\n" "$as_me: Use --enable-unified-memory to compile with unified memory." >&6;} { printf "%s\n" "$as_me:${as_lineno-$LINENO}: ***********************************************************************" >&5 printf "%s\n" "$as_me: ***********************************************************************" >&6;} fi if test "$hypre_using_sycl" = "yes" then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: ***********************************************************" >&5 printf "%s\n" "$as_me: ***********************************************************" >&6;} { printf "%s\n" "$as_me:${as_lineno-$LINENO}: Configuring with --with-sycl=yes without unified memory." >&5 printf "%s\n" "$as_me: Configuring with --with-sycl=yes without unified memory." >&6;} { printf "%s\n" "$as_me:${as_lineno-$LINENO}: It only works for struct interface." >&5 printf "%s\n" "$as_me: It only works for struct interface." >&6;} { printf "%s\n" "$as_me:${as_lineno-$LINENO}: Use --enable-unified-memory to compile with unified memory." >&5 printf "%s\n" "$as_me: Use --enable-unified-memory to compile with unified memory." >&6;} { printf "%s\n" "$as_me:${as_lineno-$LINENO}: ***********************************************************" >&5 printf "%s\n" "$as_me: ***********************************************************" >&6;} fi if test "$hypre_using_device_openmp" = "yes" then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: ***********************************************************************" >&5 printf "%s\n" "$as_me: ***********************************************************************" >&6;} { printf "%s\n" "$as_me:${as_lineno-$LINENO}: Configuring with --with-device-openmp=yes without unified memory." >&5 printf "%s\n" "$as_me: Configuring with --with-device-openmp=yes without unified memory." >&6;} { printf "%s\n" "$as_me:${as_lineno-$LINENO}: It only works for structured solvers and selected unstructured solvers" >&5 printf "%s\n" "$as_me: It only works for structured solvers and selected unstructured solvers" >&6;} { printf "%s\n" "$as_me:${as_lineno-$LINENO}: Use --enable-unified-memory to compile with unified memory." >&5 printf "%s\n" "$as_me: Use --enable-unified-memory to compile with unified memory." >&6;} { printf "%s\n" "$as_me:${as_lineno-$LINENO}: ***********************************************************************" >&5 printf "%s\n" "$as_me: ***********************************************************************" >&6;} fi fi if test "$hypre_using_openmp" = "yes" then printf "%s\n" "#define HYPRE_USING_OPENMP 1" >>confdefs.h fi if test "$hypre_using_device_openmp" = "yes" then printf "%s\n" "#define HYPRE_USING_DEVICE_OPENMP 1" >>confdefs.h printf "%s\n" "#define HYPRE_DEVICE_OPENMP_ALLOC 1" >>confdefs.h if test "$hypre_user_chose_cuflags" = "no" then CUFLAGS="${CXXFLAGS} ${CUFLAGS}" # dnl this is too old #CUFLAGS+=" -fopenmp-nonaliased-maps" if test "$CUCC" = "icx" || test "$CUCC" = "icpx" || test "$CUCC" = "mpiicx" || test "$CUCC" = "mpiicpx" then CUFLAGS+="-qopenmp -fopenmp-targets=spir64" fi fi if test "$hypre_user_chose_ldflags" = "no" then if test "$CUCC" = "icx" || test "$CUCC" = "icpx" || test "$CUCC" = "mpiicx" || test "$CUCC" = "mpiicpx" then LDFLAGS+="-qopenmp -fopenmp-targets=spir64" fi fi if test "$hypre_using_debug" = "yes" then printf "%s\n" "#define HYPRE_DEVICE_OPENMP_CHECK 1" >>confdefs.h fi LINK_CC='${CUCC}' LINK_CXX='${CUCC}' fi if test "x$hypre_using_um" = "xyes" then printf "%s\n" "#define HYPRE_USING_UNIFIED_MEMORY 1" >>confdefs.h else if test "x$hypre_using_cuda" = "xyes" || test "x$hypre_using_device_openmp" = "xyes" || test "x$hypre_using_hip" = "xyes" || test "x$hypre_using_sycl" = "xyes" then printf "%s\n" "#define HYPRE_USING_DEVICE_MEMORY 1" >>confdefs.h else printf "%s\n" "#define HYPRE_USING_HOST_MEMORY 1" >>confdefs.h fi fi if test "$hypre_gpu_mpi" = "yes" then printf "%s\n" "#define HYPRE_USING_GPU_AWARE_MPI 1" >>confdefs.h fi CUFLAGS="${CUFLAGS} ${EXTRA_CUFLAGS}" HYPRE_INSTALLDIR="${prefix}" HYPRE_LIBINSTALL="${libdir}" HYPRE_INCINSTALL="${includedir}" if test $host_alias = $build_alias then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking the hostname" >&5 printf %s "checking the hostname... " >&6; } hypre_hostname=hostname HOSTNAME="`$hypre_hostname`" if test -z "$HOSTNAME" then HOSTNAME=unknown { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: hostname is unknown" >&5 printf "%s\n" "$as_me: WARNING: hostname is unknown" >&2;} else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $HOSTNAME" >&5 printf "%s\n" "$HOSTNAME" >&6; } fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking the architecture" >&5 printf %s "checking the architecture... " >&6; } if test -z "$ARCH"; then hypre_tarch_dir= for hypre_dir in $srcdir $srcdir/.. $srcdir/../.. $srcdir/config; do if test -f $hypre_dir/tarch; then hypre_tarch_dir=$hypre_dir hypre_tarch=$hypre_tarch_dir/tarch break fi done if test -z "$hypre_tarch_dir"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: cannot find tarch" >&5 printf "%s\n" "$as_me: WARNING: cannot find tarch" >&2;} HYPRE_ARCH=$HOSTTYPE else HYPRE_ARCH="`$hypre_tarch`" if test -z "$HYPRE_ARCH" || test "$HYPRE_ARCH" = "unknown"; then HYPRE_ARCH=$HOSTTYPE fi fi if test -z "$HYPRE_ARCH"; then HYPRE_ARCH=unknown { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: architecture is unknown" >&5 printf "%s\n" "$as_me: WARNING: architecture is unknown" >&2;} else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $HYPRE_ARCH" >&5 printf "%s\n" "$HYPRE_ARCH" >&6; } fi else HYPRE_ARCH=$ARCH { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $HYPRE_ARCH" >&5 printf "%s\n" "$HYPRE_ARCH" >&6; } fi else HYPRE_ARCH=$host_alias HOSTNAME=unknown fi case $HYPRE_ARCH in alpha) printf "%s\n" "#define HYPRE_ALPHA 1" >>confdefs.h ;; sun* | solaris*) printf "%s\n" "#define HYPRE_SOLARIS 1" >>confdefs.h ;; hp* | HP*) printf "%s\n" "#define HYPRE_HPPA 1" >>confdefs.h ;; rs6000 | RS6000 | *bgl* | *BGL* | ppc64*) printf "%s\n" "#define HYPRE_RS6000 1" >>confdefs.h ;; IRIX64) printf "%s\n" "#define HYPRE_IRIX64 1" >>confdefs.h ;; Linux | linux | LINUX) if test -r /etc/home.config then systemtype=`grep ^SYS_TYPE /etc/home.config | cut -d" " -f2` case $systemtype in chaos*) printf "%s\n" "#define HYPRE_LINUX_CHAOS 1" >>confdefs.h ;; *) printf "%s\n" "#define HYPRE_LINUX 1" >>confdefs.h ;; esac else printf "%s\n" "#define HYPRE_LINUX 1" >>confdefs.h fi ;; esac ac_config_files="$ac_config_files config/Makefile.config" cat >confcache <<\_ACEOF # This file is a shell script that caches the results of configure # tests run on this system so they can be shared between configure # scripts and configure runs, see configure's option --config-cache. # It is not useful on other systems. If it contains results you don't # want to keep, you may remove or edit it. # # config.status only pays attention to the cache file if you give it # the --recheck option to rerun configure. # # `ac_cv_env_foo' variables (set or unset) will be overridden when # loading this file, other *unset* `ac_cv_foo' will be assigned the # following values. _ACEOF # The following way of writing the cache mishandles newlines in values, # but we know of no workaround that is simple, portable, and efficient. # So, we kill variables containing newlines. # Ultrix sh set writes to stderr and can't be redirected directly, # and sets the high bit in the cache file unless we assign to the vars. ( for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 printf "%s\n" "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space=' '; set) 2>&1` in #( *${as_nl}ac_space=\ *) # `set' does not quote correctly, so add quotes: double-quote # substitution turns \\\\ into \\, and sed turns \\ into \. sed -n \ "s/'/'\\\\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" ;; #( *) # `set' quotes correctly as required by POSIX, so do not add quotes. sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) | sed ' /^ac_cv_env_/b end t clear :clear s/^\([^=]*\)=\(.*[{}].*\)$/test ${\1+y} || &/ t end s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ :end' >>confcache if diff "$cache_file" confcache >/dev/null 2>&1; then :; else if test -w "$cache_file"; then if test "x$cache_file" != "x/dev/null"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 printf "%s\n" "$as_me: updating cache $cache_file" >&6;} if test ! -f "$cache_file" || test -h "$cache_file"; then cat confcache >"$cache_file" else case $cache_file in #( */* | ?:*) mv -f confcache "$cache_file"$$ && mv -f "$cache_file"$$ "$cache_file" ;; #( *) mv -f confcache "$cache_file" ;; esac fi fi else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 printf "%s\n" "$as_me: not updating unwritable cache $cache_file" >&6;} fi fi rm -f confcache test "x$prefix" = xNONE && prefix=$ac_default_prefix # Let make expand exec_prefix. test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' DEFS=-DHAVE_CONFIG_H ac_libobjs= ac_ltlibobjs= U= for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue # 1. Remove the extension, and $U if already installed. ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' ac_i=`printf "%s\n" "$ac_i" | sed "$ac_script"` # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR # will be set to the directory where LIBOBJS objects are built. as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' done LIBOBJS=$ac_libobjs LTLIBOBJS=$ac_ltlibobjs : "${CONFIG_STATUS=./config.status}" ac_write_fail=0 ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files $CONFIG_STATUS" { printf "%s\n" "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 printf "%s\n" "$as_me: creating $CONFIG_STATUS" >&6;} as_write_fail=0 cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 #! $SHELL # Generated by $as_me. # Run this file to recreate the current configuration. # Compiler output produced by configure, useful for debugging # configure, is in config.log if it exists. debug=false ac_cs_recheck=false ac_cs_silent=false SHELL=\${CONFIG_SHELL-$SHELL} export SHELL _ASEOF cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh as_nop=: if test ${ZSH_VERSION+y} && (emulate sh) >/dev/null 2>&1 then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else $as_nop case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi # Reset variables that may have inherited troublesome values from # the environment. # IFS needs to be set, to space, tab, and newline, in precisely that order. # (If _AS_PATH_WALK were called with IFS unset, it would have the # side effect of setting IFS to empty, thus disabling word splitting.) # Quoting is to prevent editors from complaining about space-tab. as_nl=' ' export as_nl IFS=" "" $as_nl" PS1='$ ' PS2='> ' PS4='+ ' # Ensure predictable behavior from utilities with locale-dependent output. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # We cannot yet rely on "unset" to work, but we need these variables # to be unset--not just set to an empty or harmless value--now, to # avoid bugs in old shells (e.g. pre-3.0 UWIN ksh). This construct # also avoids known problems related to "unset" and subshell syntax # in other old shells (e.g. bash 2.01 and pdksh 5.2.14). for as_var in BASH_ENV ENV MAIL MAILPATH CDPATH do eval test \${$as_var+y} \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done # Ensure that fds 0, 1, and 2 are open. if (exec 3>&0) 2>/dev/null; then :; else exec 0&1) 2>/dev/null; then :; else exec 1>/dev/null; fi if (exec 3>&2) ; then :; else exec 2>/dev/null; fi # The user is always right. if ${PATH_SEPARATOR+false} :; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac test -r "$as_dir$0" && as_myself=$as_dir$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then printf "%s\n" "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi printf "%s\n" "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null then : eval 'as_fn_append () { eval $1+=\$2 }' else $as_nop as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null then : eval 'as_fn_arith () { as_val=$(( $* )) }' else $as_nop as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || printf "%s\n" X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits # Determine whether it's possible to make 'echo' print without a newline. # These variables are no longer used directly by Autoconf, but are AC_SUBSTed # for compatibility with existing Makefiles. ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac # For backward compatibility with old third-party macros, we provide # the shell variables $as_echo and $as_echo_n. New code should use # AS_ECHO(["message"]) and AS_ECHO_N(["message"]), respectively. as_echo='printf %s\n' as_echo_n='printf %s' rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`printf "%s\n" "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || printf "%s\n" X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" exec 6>&1 ## ----------------------------------- ## ## Main body of $CONFIG_STATUS script. ## ## ----------------------------------- ## _ASEOF test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Save the log message, to keep $0 and so on meaningful, and to # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" This file was extended by hypre $as_me 2.33.0, which was generated by GNU Autoconf 2.71. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS CONFIG_LINKS = $CONFIG_LINKS CONFIG_COMMANDS = $CONFIG_COMMANDS $ $0 $@ on `(hostname || uname -n) 2>/dev/null | sed 1q` " _ACEOF case $ac_config_files in *" "*) set x $ac_config_files; shift; ac_config_files=$*;; esac case $ac_config_headers in *" "*) set x $ac_config_headers; shift; ac_config_headers=$*;; esac cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # Files that config.status was made for. config_files="$ac_config_files" config_headers="$ac_config_headers" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 ac_cs_usage="\ \`$as_me' instantiates files and other configuration actions from templates according to the current configuration. Unless the files and actions are specified as TAGs, all are instantiated by default. Usage: $0 [OPTION]... [TAG]... -h, --help print this help, then exit -V, --version print version number and configuration settings, then exit --config print configuration, then exit -q, --quiet, --silent do not print progress messages -d, --debug don't remove temporary files --recheck update $as_me by reconfiguring in the same conditions --file=FILE[:TEMPLATE] instantiate the configuration file FILE --header=FILE[:TEMPLATE] instantiate the configuration header FILE Configuration files: $config_files Configuration headers: $config_headers Report bugs to the package provider." _ACEOF ac_cs_config=`printf "%s\n" "$ac_configure_args" | sed "$ac_safe_unquote"` ac_cs_config_escaped=`printf "%s\n" "$ac_cs_config" | sed "s/^ //; s/'/'\\\\\\\\''/g"` cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config='$ac_cs_config_escaped' ac_cs_version="\\ hypre config.status 2.33.0 configured by $0, generated by GNU Autoconf 2.71, with options \\"\$ac_cs_config\\" Copyright (C) 2021 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." ac_pwd='$ac_pwd' srcdir='$srcdir' test -n "\$AWK" || AWK=awk _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # The default lists apply if the user does not specify any file. ac_need_defaults=: while test $# != 0 do case $1 in --*=?*) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` ac_shift=: ;; --*=) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg= ac_shift=: ;; *) ac_option=$1 ac_optarg=$2 ac_shift=shift ;; esac case $ac_option in # Handling of the options. -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) ac_cs_recheck=: ;; --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) printf "%s\n" "$ac_cs_version"; exit ;; --config | --confi | --conf | --con | --co | --c ) printf "%s\n" "$ac_cs_config"; exit ;; --debug | --debu | --deb | --de | --d | -d ) debug=: ;; --file | --fil | --fi | --f ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`printf "%s\n" "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; '') as_fn_error $? "missing file argument" ;; esac as_fn_append CONFIG_FILES " '$ac_optarg'" ac_need_defaults=false;; --header | --heade | --head | --hea ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`printf "%s\n" "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; esac as_fn_append CONFIG_HEADERS " '$ac_optarg'" ac_need_defaults=false;; --he | --h) # Conflict between --help and --header as_fn_error $? "ambiguous option: \`$1' Try \`$0 --help' for more information.";; --help | --hel | -h ) printf "%s\n" "$ac_cs_usage"; exit ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil | --si | --s) ac_cs_silent=: ;; # This is an error. -*) as_fn_error $? "unrecognized option: \`$1' Try \`$0 --help' for more information." ;; *) as_fn_append ac_config_targets " $1" ac_need_defaults=false ;; esac shift done ac_configure_extra_args= if $ac_cs_silent; then exec 6>/dev/null ac_configure_extra_args="$ac_configure_extra_args --silent" fi _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 if \$ac_cs_recheck; then set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion shift \printf "%s\n" "running CONFIG_SHELL=$SHELL \$*" >&6 CONFIG_SHELL='$SHELL' export CONFIG_SHELL exec "\$@" fi _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 exec 5>>config.log { echo sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX ## Running $as_me. ## _ASBOX printf "%s\n" "$ac_log" } >&5 _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Handling of arguments. for ac_config_target in $ac_config_targets do case $ac_config_target in "HYPRE_config.h") CONFIG_HEADERS="$CONFIG_HEADERS HYPRE_config.h:config/HYPRE_config.h.in" ;; "config/Makefile.config") CONFIG_FILES="$CONFIG_FILES config/Makefile.config" ;; *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; esac done # If the user did not use the arguments to specify the items to instantiate, # then the envvar interface is used. Set only those that are not. # We use the long form for the default assignment because of an extremely # bizarre bug on SunOS 4.1.3. if $ac_need_defaults; then test ${CONFIG_FILES+y} || CONFIG_FILES=$config_files test ${CONFIG_HEADERS+y} || CONFIG_HEADERS=$config_headers fi # Have a temporary directory for convenience. Make it in the build tree # simply because there is no reason against having it here, and in addition, # creating and moving files from /tmp can sometimes cause problems. # Hook for its removal unless debugging. # Note that there is a small window in which the directory will not be cleaned: # after its creation but before its name has been assigned to `$tmp'. $debug || { tmp= ac_tmp= trap 'exit_status=$? : "${ac_tmp:=$tmp}" { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status ' 0 trap 'as_fn_exit 1' 1 2 13 15 } # Create a (secure) tmp directory for tmp files. { tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && test -d "$tmp" } || { tmp=./conf$$-$RANDOM (umask 077 && mkdir "$tmp") } || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 ac_tmp=$tmp # Set up the scripts for CONFIG_FILES section. # No need to generate them if there are no CONFIG_FILES. # This happens for instance with `./config.status config.h'. if test -n "$CONFIG_FILES"; then ac_cr=`echo X | tr X '\015'` # On cygwin, bash can eat \r inside `` if the user requested igncr. # But we know of no other shell where ac_cr would be empty at this # point, so we can use a bashism as a fallback. if test "x$ac_cr" = x; then eval ac_cr=\$\'\\r\' fi ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then ac_cs_awk_cr='\\r' else ac_cs_awk_cr=$ac_cr fi echo 'BEGIN {' >"$ac_tmp/subs1.awk" && _ACEOF { echo "cat >conf$$subs.awk <<_ACEOF" && echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && echo "_ACEOF" } >conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` ac_delim='%!_!# ' for ac_last_try in false false false false false :; do . ./conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` if test $ac_delim_n = $ac_delim_num; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done rm -f conf$$subs.sh cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && _ACEOF sed -n ' h s/^/S["/; s/!.*/"]=/ p g s/^[^!]*!// :repl t repl s/'"$ac_delim"'$// t delim :nl h s/\(.\{148\}\)..*/\1/ t more1 s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ p n b repl :more1 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t nl :delim h s/\(.\{148\}\)..*/\1/ t more2 s/["\\]/\\&/g; s/^/"/; s/$/"/ p b :more2 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t delim ' >$CONFIG_STATUS || ac_write_fail=1 rm -f conf$$subs.awk cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACAWK cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && for (key in S) S_is_set[key] = 1 FS = "" } { line = $ 0 nfields = split(line, field, "@") substed = 0 len = length(field[1]) for (i = 2; i < nfields; i++) { key = field[i] keylen = length(key) if (S_is_set[key]) { value = S[key] line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) len += length(value) + length(field[++i]) substed = 1 } else len += 1 + keylen } print line } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" else cat fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 _ACEOF # VPATH may cause trouble with some makes, so we remove sole $(srcdir), # ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and # trailing colons and then remove the whole line if VPATH becomes empty # (actually we leave an empty line to preserve line numbers). if test "x$srcdir" = x.; then ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ h s/// s/^/:/ s/[ ]*$/:/ s/:\$(srcdir):/:/g s/:\${srcdir}:/:/g s/:@srcdir@:/:/g s/^:*// s/:*$// x s/\(=[ ]*\).*/\1/ G s/\n// s/^[^=]*=[ ]*$// }' fi cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 fi # test -n "$CONFIG_FILES" # Set up the scripts for CONFIG_HEADERS section. # No need to generate them if there are no CONFIG_HEADERS. # This happens for instance with `./config.status Makefile'. if test -n "$CONFIG_HEADERS"; then cat >"$ac_tmp/defines.awk" <<\_ACAWK || BEGIN { _ACEOF # Transform confdefs.h into an awk script `defines.awk', embedded as # here-document in config.status, that substitutes the proper values into # config.h.in to produce config.h. # Create a delimiter string that does not exist in confdefs.h, to ease # handling of long lines. ac_delim='%!_!# ' for ac_last_try in false false :; do ac_tt=`sed -n "/$ac_delim/p" confdefs.h` if test -z "$ac_tt"; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done # For the awk script, D is an array of macro values keyed by name, # likewise P contains macro parameters if any. Preserve backslash # newline sequences. ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]* sed -n ' s/.\{148\}/&'"$ac_delim"'/g t rset :rset s/^[ ]*#[ ]*define[ ][ ]*/ / t def d :def s/\\$// t bsnl s/["\\]/\\&/g s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ D["\1"]=" \3"/p s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2"/p d :bsnl s/["\\]/\\&/g s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ D["\1"]=" \3\\\\\\n"\\/p t cont s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p t cont d :cont n s/.\{148\}/&'"$ac_delim"'/g t clear :clear s/\\$// t bsnlc s/["\\]/\\&/g; s/^/"/; s/$/"/p d :bsnlc s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p b cont ' >$CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 for (key in D) D_is_set[key] = 1 FS = "" } /^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ { line = \$ 0 split(line, arg, " ") if (arg[1] == "#") { defundef = arg[2] mac1 = arg[3] } else { defundef = substr(arg[1], 2) mac1 = arg[2] } split(mac1, mac2, "(") #) macro = mac2[1] prefix = substr(line, 1, index(line, defundef) - 1) if (D_is_set[macro]) { # Preserve the white space surrounding the "#". print prefix "define", macro P[macro] D[macro] next } else { # Replace #undef with comments. This is necessary, for example, # in the case of _POSIX_SOURCE, which is predefined and required # on some systems where configure will not decide to define it. if (defundef == "undef") { print "/*", prefix defundef, macro, "*/" next } } } { print } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 as_fn_error $? "could not setup config headers machinery" "$LINENO" 5 fi # test -n "$CONFIG_HEADERS" eval set X " :F $CONFIG_FILES :H $CONFIG_HEADERS " shift for ac_tag do case $ac_tag in :[FHLC]) ac_mode=$ac_tag; continue;; esac case $ac_mode$ac_tag in :[FHL]*:*);; :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; :[FH]-) ac_tag=-:-;; :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; esac ac_save_IFS=$IFS IFS=: set x $ac_tag IFS=$ac_save_IFS shift ac_file=$1 shift case $ac_mode in :L) ac_source=$1;; :[FH]) ac_file_inputs= for ac_f do case $ac_f in -) ac_f="$ac_tmp/stdin";; *) # Look for the file first in the build tree, then in the source tree # (if the path is not absolute). The absolute path cannot be DOS-style, # because $ac_f cannot contain `:'. test -f "$ac_f" || case $ac_f in [\\/$]*) false;; *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; esac || as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; esac case $ac_f in *\'*) ac_f=`printf "%s\n" "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac as_fn_append ac_file_inputs " '$ac_f'" done # Let's still pretend it is `configure' which instantiates (i.e., don't # use $as_me), people would be surprised to read: # /* config.h. Generated by config.status. */ configure_input='Generated from '` printf "%s\n" "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' `' by configure.' if test x"$ac_file" != x-; then configure_input="$ac_file. $configure_input" { printf "%s\n" "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 printf "%s\n" "$as_me: creating $ac_file" >&6;} fi # Neutralize special characters interpreted by sed in replacement strings. case $configure_input in #( *\&* | *\|* | *\\* ) ac_sed_conf_input=`printf "%s\n" "$configure_input" | sed 's/[\\\\&|]/\\\\&/g'`;; #( *) ac_sed_conf_input=$configure_input;; esac case $ac_tag in *:-:* | *:-) cat >"$ac_tmp/stdin" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; esac ;; esac ac_dir=`$as_dirname -- "$ac_file" || $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$ac_file" : 'X\(//\)[^/]' \| \ X"$ac_file" : 'X\(//\)$' \| \ X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || printf "%s\n" X"$ac_file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir="$ac_dir"; as_fn_mkdir_p ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`printf "%s\n" "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`printf "%s\n" "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix case $ac_mode in :F) # # CONFIG_FILE # _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # If the template does not know about datarootdir, expand it. # FIXME: This hack should be removed a few years after 2.60. ac_datarootdir_hack=; ac_datarootdir_seen= ac_sed_dataroot=' /datarootdir/ { p q } /@datadir@/p /@docdir@/p /@infodir@/p /@localedir@/p /@mandir@/p' case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in *datarootdir*) ac_datarootdir_seen=yes;; *@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 printf "%s\n" "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_datarootdir_hack=' s&@datadir@&$datadir&g s&@docdir@&$docdir&g s&@infodir@&$infodir&g s&@localedir@&$localedir&g s&@mandir@&$mandir&g s&\\\${datarootdir}&$datarootdir&g' ;; esac _ACEOF # Neutralize VPATH when `$srcdir' = `.'. # Shell code in configure.ac might set extrasub. # FIXME: do we really want to maintain this feature? cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_sed_extra="$ac_vpsub $extrasub _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 :t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b s|@configure_input@|$ac_sed_conf_input|;t t s&@top_builddir@&$ac_top_builddir_sub&;t t s&@top_build_prefix@&$ac_top_build_prefix&;t t s&@srcdir@&$ac_srcdir&;t t s&@abs_srcdir@&$ac_abs_srcdir&;t t s&@top_srcdir@&$ac_top_srcdir&;t t s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t s&@builddir@&$ac_builddir&;t t s&@abs_builddir@&$ac_abs_builddir&;t t s&@abs_top_builddir@&$ac_abs_top_builddir&;t t $ac_datarootdir_hack " eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ "$ac_tmp/out"`; test -z "$ac_out"; } && { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&5 printf "%s\n" "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&2;} rm -f "$ac_tmp/stdin" case $ac_file in -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; esac \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; :H) # # CONFIG_HEADER # if test x"$ac_file" != x-; then { printf "%s\n" "/* $configure_input */" >&1 \ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" } >"$ac_tmp/config.h" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5 printf "%s\n" "$as_me: $ac_file is unchanged" >&6;} else rm -f "$ac_file" mv "$ac_tmp/config.h" "$ac_file" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 fi else printf "%s\n" "/* $configure_input */" >&1 \ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \ || as_fn_error $? "could not create -" "$LINENO" 5 fi ;; esac done # for ac_tag as_fn_exit 0 _ACEOF ac_clean_files=$ac_clean_files_save test $ac_write_fail = 0 || as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 # configure is writing to config.log, and then calls config.status. # config.status does its own redirection, appending to config.log. # Unfortunately, on DOS this fails, as config.log is still kept open # by configure, so config.status won't be able to write to it; its # output is simply discarded. So we exec the FD to /dev/null, # effectively closing config.log, so it can be properly (re)opened and # appended to by config.status. When coming back to configure, we # need to make the FD available again. if test "$no_create" != yes; then ac_cs_success=: ac_config_status_args= test "$silent" = yes && ac_config_status_args="$ac_config_status_args --quiet" exec 5>/dev/null $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false exec 5>>config.log # Use ||, not &&, to avoid exiting from the if with $? = 1, which # would make configure fail if this is the last instruction. $ac_cs_success || as_fn_exit 1 fi if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 printf "%s\n" "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} fi mv HYPRE_config.h HYPRE_config.h.tmp sed 's/FC_FUNC/HYPRE_FC_FUNC/g' < HYPRE_config.h.tmp > HYPRE_config.h rm -f HYPRE_config.h.tmp hypre-2.33.0/src/distributed_ls/000077500000000000000000000000001477326011500165435ustar00rootroot00000000000000hypre-2.33.0/src/distributed_ls/CMakeLists.txt000066400000000000000000000005321477326011500213030ustar00rootroot00000000000000# Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) set(HDRS "") add_subdirectory(Euclid) add_subdirectory(ParaSails) add_subdirectory(pilut) set(HYPRE_HEADERS ${HYPRE_HEADERS} ${HDRS} PARENT_SCOPE) hypre-2.33.0/src/distributed_ls/Euclid/000077500000000000000000000000001477326011500177505ustar00rootroot00000000000000hypre-2.33.0/src/distributed_ls/Euclid/CMakeLists.txt000066400000000000000000000012401477326011500225050ustar00rootroot00000000000000# Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) set(SRCS blas_dh.c Euclid_apply.c Euclid_dh.c ExternalRows_dh.c Factor_dh.c getRow_dh.c globalObjects.c Hash_dh.c Hash_i_dh.c ilu_mpi_bj.c ilu_mpi_pilu.c ilu_seq.c io_dh.c krylov_dh.c Mat_dh.c mat_dh_private.c MatGenFD.c Mem_dh.c Numbering_dh.c Parser_dh.c shellSort_dh.c sig_dh.c SortedList_dh.c SortedSet_dh.c SubdomainGraph_dh.c TimeLog_dh.c Timer_dh.c Vec_dh.c ) target_sources(${PROJECT_NAME} PRIVATE ${SRCS} ) hypre-2.33.0/src/distributed_ls/Euclid/Euclid_apply.c000066400000000000000000000101461477326011500225300ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "_hypre_Euclid.h" /* #include "Euclid_dh.h" */ /* #include "Mat_dh.h" */ /* #include "Factor_dh.h" */ /* #include "Parser_dh.h" */ /* #include "TimeLog_dh.h" */ /* #include "SubdomainGraph_dh.h" */ static void scale_rhs_private(Euclid_dh ctx, HYPRE_Real *rhs); static void permute_vec_n2o_private(Euclid_dh ctx, HYPRE_Real *xIN, HYPRE_Real *xOUT); static void permute_vec_o2n_private(Euclid_dh ctx, HYPRE_Real *xIN, HYPRE_Real *xOUT); #undef __FUNC__ #define __FUNC__ "Euclid_dhApply" void Euclid_dhApply(Euclid_dh ctx, HYPRE_Real *rhs, HYPRE_Real *lhs) { START_FUNC_DH HYPRE_Real *rhs_, *lhs_; HYPRE_Real t1, t2; t1 = hypre_MPI_Wtime(); /* default settings; for everything except PILU */ ctx->from = 0; ctx->to = ctx->m; /* case 1: no preconditioning */ if (! strcmp(ctx->algo_ilu, "none") || ! strcmp(ctx->algo_par, "none")) { HYPRE_Int i, m = ctx->m; for (i=0; isg != NULL) { /* hypre_printf("@@@@@@@@@@@@@@@@@ permute_vec_n2o_private\n"); */ permute_vec_n2o_private(ctx, rhs, lhs); CHECK_V_ERROR; rhs_ = lhs; lhs_ = ctx->work2; } else { rhs_ = rhs; lhs_ = lhs; } /* scale rhs vector */ if (ctx->isScaled) { /* hypre_printf("@@@@@@@@@@@@@@@@@ scale_rhs_private\n"); */ scale_rhs_private(ctx, rhs_); CHECK_V_ERROR; } /* note: rhs_ is permuted, scaled; the input, "rhs" vector has not been disturbed. */ /*---------------------------------------------------------------- * big switch to choose the appropriate triangular solve *----------------------------------------------------------------*/ /* sequential and mpi block jacobi cases */ if (np_dh == 1 || ! strcmp(ctx->algo_par, "bj") ) { Factor_dhSolveSeq(rhs_, lhs_, ctx); CHECK_V_ERROR; } /* pilu case */ else { Factor_dhSolve(rhs_, lhs_, ctx); CHECK_V_ERROR; } /*---------------------------------------------------------------- * unpermute lhs vector * (note: don't need to unscale, because we were clever) *----------------------------------------------------------------*/ if (ctx->sg != NULL) { permute_vec_o2n_private(ctx, lhs_, lhs); CHECK_V_ERROR; } END_OF_FUNCTION: ; t2 = hypre_MPI_Wtime(); /* collective timing for triangular solves */ ctx->timing[TRI_SOLVE_T] += (t2 - t1); /* collective timing for setup+krylov+triSolves (intent is to time linear solve, but this is at best probelematical!) */ ctx->timing[TOTAL_SOLVE_TEMP_T] = t2 - ctx->timing[SOLVE_START_T]; /* total triangular solve count */ ctx->its += 1; ctx->itsTotal += 1; END_FUNC_DH } #undef __FUNC__ #define __FUNC__ "scale_rhs_private" void scale_rhs_private(Euclid_dh ctx, HYPRE_Real *rhs) { START_FUNC_DH HYPRE_Int i, m = ctx->m; REAL_DH *scale = ctx->scale; /* if matrix was scaled, must scale the rhs */ if (scale != NULL) { #ifdef USING_OPENMP_DH #pragma omp for schedule(static) #endif for (i=0; im; HYPRE_Int *o2n = ctx->sg->o2n_col; for (i=0; im; HYPRE_Int *n2o = ctx->sg->n2o_row; for (i=0; iisSetup = false; ctx->rho_init = 2.0; ctx->rho_final = 0.0; ctx->m = 0; ctx->n = 0; ctx->rhs = NULL; ctx->A = NULL; ctx->F = NULL; ctx->sg = NULL; ctx->scale = NULL; ctx->isScaled = false; ctx->work = NULL; ctx->work2 = NULL; ctx->from = 0; ctx->to = 0; strcpy(ctx->algo_par, "pilu"); strcpy(ctx->algo_ilu, "iluk"); ctx->level = 1; ctx->droptol = DEFAULT_DROP_TOL; ctx->sparseTolA = 0.0; ctx->sparseTolF = 0.0; ctx->pivotMin = 0.0; ctx->pivotFix = PIVOT_FIX_DEFAULT; ctx->maxVal = 0.0; ctx->slist = NULL; ctx->extRows = NULL; strcpy(ctx->krylovMethod, "bicgstab"); ctx->maxIts = 200; ctx->rtol = 1e-5; ctx->atol = HYPRE_REAL_MIN; ctx->its = 0; ctx->itsTotal = 0; ctx->setupCount = 0; ctx->logging = 0; ctx->printStats = (Parser_dhHasSwitch(parser_dh, "-printStats")); { HYPRE_Int i; for (i=0; itiming[i] = 0.0; for (i=0; istats[i] = 0.0; } ctx->timingsWereReduced = false; ++ref_counter; END_FUNC_DH } #undef __FUNC__ #define __FUNC__ "Euclid_dhDestroy" void Euclid_dhDestroy(Euclid_dh ctx) { START_FUNC_DH if (Parser_dhHasSwitch(parser_dh, "-eu_stats") || ctx->logging) { /* insert switch so memory report will also be printed */ Parser_dhInsert(parser_dh, "-eu_mem", "1"); CHECK_V_ERROR; Euclid_dhPrintHypreReport(ctx, stdout); CHECK_V_ERROR; } if (ctx->setupCount > 1 && ctx->printStats) { Euclid_dhPrintStatsShorter(ctx, stdout); CHECK_V_ERROR; } if (ctx->F != NULL) { Factor_dhDestroy(ctx->F); CHECK_V_ERROR; } if (ctx->sg != NULL) { SubdomainGraph_dhDestroy(ctx->sg); CHECK_V_ERROR; } if (ctx->scale != NULL) { FREE_DH(ctx->scale); CHECK_V_ERROR; } if (ctx->work != NULL) { FREE_DH(ctx->work); CHECK_V_ERROR; } if (ctx->work2 != NULL) { FREE_DH(ctx->work2); CHECK_V_ERROR; } if (ctx->slist != NULL) { SortedList_dhDestroy(ctx->slist); CHECK_V_ERROR; } if (ctx->extRows != NULL) { ExternalRows_dhDestroy(ctx->extRows); CHECK_V_ERROR; } FREE_DH(ctx); CHECK_V_ERROR; --ref_counter; END_FUNC_DH } /* on entry, "A" must have been set. If this context is being reused, user must ensure ??? */ #undef __FUNC__ #define __FUNC__ "Euclid_dhSetup" void Euclid_dhSetup(Euclid_dh ctx) { START_FUNC_DH HYPRE_Int m, n, beg_row; HYPRE_Real t1; bool isSetup = ctx->isSetup; bool bj = false; /*---------------------------------------------------- * If Euclid was previously setup, print summary of * what happened during previous setup/solve *----------------------------------------------------*/ if (ctx->setupCount && ctx->printStats) { Euclid_dhPrintStatsShorter(ctx, stdout); CHECK_V_ERROR; ctx->its = 0; } /*---------------------------------------------------- * zero array for statistical reporting *----------------------------------------------------*/ { HYPRE_Int i; for (i=0; istats[i] = 0.0; } /*---------------------------------------------------- * internal timing *----------------------------------------------------*/ ctx->timing[SOLVE_START_T] = hypre_MPI_Wtime(); /* sum timing from last linear solve cycle, if any */ ctx->timing[TOTAL_SOLVE_T] += ctx->timing[TOTAL_SOLVE_TEMP_T]; ctx->timing[TOTAL_SOLVE_TEMP_T] = 0.0; if (ctx->F != NULL) { Factor_dhDestroy(ctx->F); CHECK_V_ERROR; ctx->F = NULL; } if (ctx->A == NULL) { SET_V_ERROR("must set ctx->A before calling init"); } EuclidGetDimensions(ctx->A, &beg_row, &m, &n); CHECK_V_ERROR; ctx->m = m; ctx->n = n; if (Parser_dhHasSwitch(parser_dh, "-print_size")) { printf_dh("setting up linear system; global rows: %i local rows: %i (on P_0)\n", n,m); } hypre_sprintf(msgBuf_dh, "localRow= %i; globalRows= %i; beg_row= %i", m, n, beg_row); SET_INFO(msgBuf_dh); bj = Parser_dhHasSwitch(parser_dh, "-bj"); /*------------------------------------------------------------------------ * Setup the SubdomainGraph, which contains connectivity and * and permutation information. If this context is being reused, * this may already have been done; if being resused, the underlying * subdomain graph cannot change (user's responsibility?) *------------------------------------------------------------------------*/ if (ctx->sg == NULL) { HYPRE_Int blocks = np_dh; t1 = hypre_MPI_Wtime(); if (np_dh == 1) { Parser_dhReadInt(parser_dh, "-blocks", &blocks); CHECK_V_ERROR; SubdomainGraph_dhCreate(&(ctx->sg)); CHECK_V_ERROR; SubdomainGraph_dhInit(ctx->sg, blocks, bj, ctx->A); CHECK_V_ERROR; } else { SubdomainGraph_dhCreate(&(ctx->sg)); CHECK_V_ERROR; SubdomainGraph_dhInit(ctx->sg, -1, bj, ctx->A); CHECK_V_ERROR; } ctx->timing[SUB_GRAPH_T] += (hypre_MPI_Wtime() - t1); } /* SubdomainGraph_dhDump(ctx->sg, "SG.dump"); CHECK_V_ERROR; */ /*---------------------------------------------------- * for debugging *----------------------------------------------------*/ if (Parser_dhHasSwitch(parser_dh, "-doNotFactor")) { goto END_OF_FUNCTION; } /*---------------------------------------------------- * query parser for runtime parameters *----------------------------------------------------*/ if (! isSetup) { get_runtime_params_private(ctx); CHECK_V_ERROR; } if (! strcmp(ctx->algo_par, "bj")) bj = false; /*--------------------------------------------------------- * allocate and initialize storage for row-scaling * (ctx->isScaled is set in get_runtime_params_private(); ) *---------------------------------------------------------*/ if (ctx->scale == NULL) { ctx->scale = (REAL_DH*)MALLOC_DH(m*sizeof(REAL_DH)); CHECK_V_ERROR; } { HYPRE_Int i; for (i=0; iscale[i] = 1.0; } /*------------------------------------------------------------------ * allocate work vectors; used in factorization and triangular solves; *------------------------------------------------------------------*/ if ( ctx->work == NULL) { ctx->work = (REAL_DH*)MALLOC_DH(m*sizeof(REAL_DH)); CHECK_V_ERROR; } if ( ctx->work2 == NULL) { ctx->work2 = (REAL_DH*)MALLOC_DH(m*sizeof(REAL_DH)); CHECK_V_ERROR; } /*----------------------------------------------------------------- * perform the incomplete factorization (this should be, at least * for higher level ILUK, the most time-intensive portion of setup) *-----------------------------------------------------------------*/ t1 = hypre_MPI_Wtime(); factor_private(ctx); CHECK_V_ERROR; ctx->timing[FACTOR_T] += (hypre_MPI_Wtime() - t1); /*-------------------------------------------------------------- * invert diagonals, for faster triangular solves *--------------------------------------------------------------*/ if (strcmp(ctx->algo_par, "none")) { invert_diagonals_private(ctx); CHECK_V_ERROR; } /*-------------------------------------------------------------- * compute rho_final: global ratio of nzF/nzA * also, if -sparseA > 0, compute ratio of nzA * used in factorization *--------------------------------------------------------------*/ /* for some reason compute_rho_private() was expensive, so now it's an option, unless there's only one mpi task. */ if (Parser_dhHasSwitch(parser_dh, "-computeRho") || np_dh == 1) { if (strcmp(ctx->algo_par, "none")) { t1 = hypre_MPI_Wtime(); compute_rho_private(ctx); CHECK_V_ERROR; ctx->timing[COMPUTE_RHO_T] += (hypre_MPI_Wtime() - t1); } } /*-------------------------------------------------------------- * if using PILU, set up persistent comms and global-to-local * number scheme, for efficient triangular solves. * (Thanks to Edmond Chow for these algorithmic ideas.) *--------------------------------------------------------------*/ if (! strcmp(ctx->algo_par, "pilu") && np_dh > 1) { t1 = hypre_MPI_Wtime(); Factor_dhSolveSetup(ctx->F, ctx->sg); CHECK_V_ERROR; ctx->timing[SOLVE_SETUP_T] += (hypre_MPI_Wtime() - t1); } END_OF_FUNCTION: ; /*------------------------------------------------------- * internal timing *-------------------------------------------------------*/ ctx->timing[SETUP_T] += (hypre_MPI_Wtime() - ctx->timing[SOLVE_START_T]); ctx->setupCount += 1; ctx->isSetup = true; END_FUNC_DH } #undef __FUNC__ #define __FUNC__ "get_runtime_params_private" void get_runtime_params_private(Euclid_dh ctx) { START_FUNC_DH char *tmp; /* params for use of internal solvers */ Parser_dhReadInt(parser_dh, "-maxIts",&(ctx->maxIts)); Parser_dhReadDouble(parser_dh, "-rtol", &(ctx->rtol)); Parser_dhReadDouble(parser_dh, "-atol", &(ctx->atol)); /* parallelization strategy (bj, pilu, none) */ tmp = NULL; Parser_dhReadString(parser_dh, "-par", &tmp); if (tmp != NULL) { strcpy(ctx->algo_par, tmp); } if (Parser_dhHasSwitch(parser_dh, "-bj")) { strcpy(ctx->algo_par, "bj"); } /* factorization parameters */ Parser_dhReadDouble(parser_dh, "-rho", &(ctx->rho_init)); /* inital storage allocation for factor */ Parser_dhReadInt(parser_dh, "-level", &ctx->level); Parser_dhReadInt(parser_dh, "-pc_ilu_levels", &ctx->level); if (Parser_dhHasSwitch(parser_dh, "-ilut")) { Parser_dhReadDouble(parser_dh, "-ilut", &ctx->droptol); ctx->isScaled = true; strcpy(ctx->algo_ilu, "ilut"); } /* make sure both algo_par and algo_ilu are set to "none," if at least one is. */ if (! strcmp(ctx->algo_par, "none")) { strcpy(ctx->algo_ilu, "none"); } else if (! strcmp(ctx->algo_ilu, "none")) { strcpy(ctx->algo_par, "none"); } Parser_dhReadDouble(parser_dh, "-sparseA",&(ctx->sparseTolA)); /* sparsify A before factoring */ Parser_dhReadDouble(parser_dh, "-sparseF",&(ctx->sparseTolF)); /* sparsify after factoring */ Parser_dhReadDouble(parser_dh, "-pivotMin", &(ctx->pivotMin)); /* adjust pivots if smaller than this */ Parser_dhReadDouble(parser_dh, "-pivotFix", &(ctx->pivotFix)); /* how to adjust pivots */ /* set row scaling for mandatory cases */ if (ctx->sparseTolA || ! strcmp(ctx->algo_ilu, "ilut")) { ctx->isScaled = true; } /* solve method */ tmp = NULL; Parser_dhReadString(parser_dh, "-ksp_type", &tmp); if (tmp != NULL) { strcpy(ctx->krylovMethod, tmp); /* for compatibility with PETSc */ if (! strcmp(ctx->krylovMethod, "bcgs")) { strcpy(ctx->krylovMethod, "bicgstab"); } } END_FUNC_DH } #undef __FUNC__ #define __FUNC__ "invert_diagonals_private" void invert_diagonals_private(Euclid_dh ctx) { START_FUNC_DH REAL_DH *aval = ctx->F->aval; HYPRE_Int *diag = ctx->F->diag; if (aval == NULL || diag == NULL) { SET_INFO("can't invert diags; either F->aval or F->diag is NULL"); } else { HYPRE_Int i, m = ctx->F->m; for (i=0; iF != NULL) { HYPRE_Real bufLocal[3], bufGlobal[3]; HYPRE_Int m = ctx->m; ctx->stats[NZF_STATS] = (HYPRE_Real)ctx->F->rp[m]; bufLocal[0] = ctx->stats[NZA_STATS]; /* nzA */ bufLocal[1] = ctx->stats[NZF_STATS]; /* nzF */ bufLocal[2] = ctx->stats[NZA_USED_STATS]; /* nzA used */ if (np_dh == 1) { bufGlobal[0] = bufLocal[0]; bufGlobal[1] = bufLocal[1]; bufGlobal[2] = bufLocal[2]; } else { hypre_MPI_Reduce(bufLocal, bufGlobal, 3, hypre_MPI_REAL, hypre_MPI_SUM, 0, comm_dh); } if (myid_dh == 0) { /* compute rho */ if (bufGlobal[0] && bufGlobal[1]) { ctx->rho_final = bufGlobal[1]/bufGlobal[0]; } else { ctx->rho_final = -1; } /* compute ratio of nonzeros in A that were used */ if (bufGlobal[0] && bufGlobal[2]) { ctx->stats[NZA_RATIO_STATS] = 100.0*bufGlobal[2]/bufGlobal[0]; } else { ctx->stats[NZA_RATIO_STATS] = 100.0; } } } END_FUNC_DH } #undef __FUNC__ #define __FUNC__ "factor_private" void factor_private(Euclid_dh ctx) { START_FUNC_DH /*------------------------------------------------------------- * special case, for testing/debugging: no preconditioning *-------------------------------------------------------------*/ if (! strcmp(ctx->algo_par, "none")) { goto DO_NOTHING; } /*------------------------------------------------------------- * Initialize object to hold factor. *-------------------------------------------------------------*/ { HYPRE_Int br = 0; HYPRE_Int id = np_dh; if (ctx->sg != NULL) { br = ctx->sg->beg_rowP[myid_dh]; id = ctx->sg->o2n_sub[myid_dh]; } Factor_dhInit(ctx->A, true, true, ctx->rho_init, id, br, &(ctx->F)); CHECK_V_ERROR; ctx->F->bdry_count = ctx->sg->bdry_count[myid_dh]; ctx->F->first_bdry = ctx->F->m - ctx->F->bdry_count; if (! strcmp(ctx->algo_par, "bj")) ctx->F->blockJacobi = true; if (Parser_dhHasSwitch(parser_dh, "-bj")) ctx->F->blockJacobi = true; } /*------------------------------------------------------------- * single mpi task with single or multiple subdomains *-------------------------------------------------------------*/ if (np_dh == 1) { /* ILU(k) factorization */ if (! strcmp(ctx->algo_ilu, "iluk")) { ctx->from = 0; ctx->to = ctx->m; /* only for debugging: use ilu_mpi_pilu */ if (Parser_dhHasSwitch(parser_dh, "-mpi")) { if (ctx->sg != NULL && ctx->sg->blocks > 1) { SET_V_ERROR("only use -mpi, which invokes ilu_mpi_pilu(), for np = 1 and -blocks 1"); } iluk_mpi_pilu(ctx); CHECK_V_ERROR; } /* "normal" operation */ else { iluk_seq_block(ctx); CHECK_V_ERROR; /* note: iluk_seq_block() performs block jacobi iluk if ctx->algo_par == bj. */ } } /* ILUT factorization */ else if (! strcmp(ctx->algo_ilu, "ilut")) { ctx->from = 0; ctx->to = ctx->m; ilut_seq(ctx); CHECK_V_ERROR; } /* all other factorization methods */ else { hypre_sprintf(msgBuf_dh, "factorization method: %s is not implemented", ctx->algo_ilu); SET_V_ERROR(msgBuf_dh); } } /*------------------------------------------------------------- * multiple mpi tasks with multiple subdomains *-------------------------------------------------------------*/ else { /* block jacobi */ if (! strcmp(ctx->algo_par, "bj")) { ctx->from = 0; ctx->to = ctx->m; iluk_mpi_bj(ctx); CHECK_V_ERROR; } /* iluk */ else if (! strcmp(ctx->algo_ilu, "iluk")) { bool bj = ctx->F->blockJacobi; /* for debugging */ /* printf_dh("\n@@@ starting ilu_mpi_pilu @@@\n"); */ SortedList_dhCreate(&(ctx->slist)); CHECK_V_ERROR; SortedList_dhInit(ctx->slist, ctx->sg); CHECK_V_ERROR; ExternalRows_dhCreate(&(ctx->extRows)); CHECK_V_ERROR; ExternalRows_dhInit(ctx->extRows, ctx); CHECK_V_ERROR; /* factor interior rows */ ctx->from = 0; ctx->to = ctx->F->first_bdry; /* if (Parser_dhHasSwitch(parser_dh, "-test")) { hypre_printf("[%i] Euclid_dh :: TESTING ilu_seq\n", myid_dh); iluk_seq(ctx); CHECK_V_ERROR; } else { iluk_mpi_pilu(ctx); CHECK_V_ERROR; } */ iluk_seq(ctx); CHECK_V_ERROR; /* get external rows from lower ordered neighbors in the subdomain graph; these rows are needed for factoring this subdomain's boundary rows. */ if (! bj) { ExternalRows_dhRecvRows(ctx->extRows); CHECK_V_ERROR; } /* factor boundary rows */ ctx->from = ctx->F->first_bdry; ctx->to = ctx->F->m; iluk_mpi_pilu(ctx); CHECK_V_ERROR; /* send this processor's boundary rows to higher ordered neighbors in the subdomain graph. */ if (! bj) { ExternalRows_dhSendRows(ctx->extRows); CHECK_V_ERROR; } /* discard column indices in factor if they would alter the subdomain graph (any such elements are in upper triangular portion of the row) */ SortedList_dhDestroy(ctx->slist); CHECK_V_ERROR; ctx->slist = NULL; ExternalRows_dhDestroy(ctx->extRows); CHECK_V_ERROR; ctx->extRows = NULL; } /* all other factorization methods */ else { hypre_sprintf(msgBuf_dh, "factorization method: %s is not implemented", ctx->algo_ilu); SET_V_ERROR(msgBuf_dh); } } DO_NOTHING: ; END_FUNC_DH } #if 0 #undef __FUNC__ #define __FUNC__ "discard_indices_private" void discard_indices_private(Euclid_dh ctx) { START_FUNC_DH #if 0 HYPRE_Int *rp = ctx->F->rp, *cval = ctx->F->cval; HYPRE_Real *aval = ctx->F->aval; HYPRE_Int m = F->m, *nabors = ctx->nabors, nc = ctx->naborCount; HYPRE_Int i, j, k, idx, count = 0, start_of_row; HYPRE_Int beg_row = ctx->beg_row, end_row = beg_row + m; HYPRE_Int *diag = ctx->F->diag; /* if col is not locally owned, and doesn't belong to a * nabor in the (original) subdomain graph, we need to discard * the column index and associated value. First, we'll flag all * such indices for deletion. */ for (i=0; i= end_row) { bool flag = true; HYPRE_Int owner = find_owner_private_mpi(ctx, col); CHECK_V_ERROR; for (k=0; kA; if (! strcmp(ctx->krylovMethod, "cg")) { cg_euclid(A, ctx, x->vals, b->vals, &itsOUT); ERRCHKA; } else if (! strcmp(ctx->krylovMethod, "bicgstab")) { bicgstab_euclid(A, ctx, x->vals, b->vals, &itsOUT); ERRCHKA; } else { hypre_sprintf(msgBuf_dh, "unknown krylov solver: %s", ctx->krylovMethod); SET_V_ERROR(msgBuf_dh); } *its = itsOUT; END_FUNC_DH } #undef __FUNC__ #define __FUNC__ "Euclid_dhPrintStats" void Euclid_dhPrintStats(Euclid_dh ctx, FILE *fp) { START_FUNC_DH HYPRE_Real *timing; HYPRE_Int nz; nz = Factor_dhReadNz(ctx->F); CHECK_V_ERROR; timing = ctx->timing; /* add in timing from lasst setup (if any) */ ctx->timing[TOTAL_SOLVE_T] += ctx->timing[TOTAL_SOLVE_TEMP_T]; ctx->timing[TOTAL_SOLVE_TEMP_T] = 0.0; reduce_timings_private(ctx); CHECK_V_ERROR; fprintf_dh(fp, "\n==================== Euclid report (start) ====================\n"); fprintf_dh(fp, "\nruntime parameters\n"); fprintf_dh(fp, "------------------\n"); fprintf_dh(fp, " setups: %i\n", ctx->setupCount); fprintf_dh(fp, " tri solves: %i\n", ctx->itsTotal); fprintf_dh(fp, " parallelization method: %s\n", ctx->algo_par); fprintf_dh(fp, " factorization method: %s\n", ctx->algo_ilu); fprintf_dh(fp, " matrix was row scaled: %i\n", ctx->isScaled); fprintf_dh(fp, " matrix row count: %i\n", ctx->n); fprintf_dh(fp, " nzF: %i\n", nz); fprintf_dh(fp, " rho: %g\n", ctx->rho_final); fprintf_dh(fp, " level: %i\n", ctx->level); fprintf_dh(fp, " sparseA: %g\n", ctx->sparseTolA); fprintf_dh(fp, "\nEuclid timing report\n"); fprintf_dh(fp, "--------------------\n"); fprintf_dh(fp, " solves total: %0.2f (see docs)\n", timing[TOTAL_SOLVE_T]); fprintf_dh(fp, " tri solves: %0.2f\n", timing[TRI_SOLVE_T]); fprintf_dh(fp, " setups: %0.2f\n", timing[SETUP_T]); fprintf_dh(fp, " subdomain graph setup: %0.2f\n", timing[SUB_GRAPH_T]); fprintf_dh(fp, " factorization: %0.2f\n", timing[FACTOR_T]); fprintf_dh(fp, " solve setup: %0.2f\n", timing[SOLVE_SETUP_T]); fprintf_dh(fp, " rho: %0.2f\n", ctx->timing[COMPUTE_RHO_T]); fprintf_dh(fp, " misc (should be small): %0.2f\n", timing[SETUP_T] - (timing[SUB_GRAPH_T]+timing[FACTOR_T]+ timing[SOLVE_SETUP_T]+timing[COMPUTE_RHO_T])); if (ctx->sg != NULL) { SubdomainGraph_dhPrintStats(ctx->sg, fp); CHECK_V_ERROR; SubdomainGraph_dhPrintRatios(ctx->sg, fp); CHECK_V_ERROR; } fprintf_dh(fp, "\nApplicable if Euclid's internal solvers were used:\n"); fprintf_dh(fp, "---------------------------------------------------\n"); fprintf_dh(fp, " solve method: %s\n", ctx->krylovMethod); fprintf_dh(fp, " maxIts: %i\n", ctx->maxIts); fprintf_dh(fp, " rtol: %g\n", ctx->rtol); fprintf_dh(fp, " atol: %g\n", ctx->atol); fprintf_dh(fp, "\n==================== Euclid report (end) ======================\n"); END_FUNC_DH } /* nzA ratio and rho refer to most recent solve, if more than one solve (call to Setup) was performed. Other stats are cumulative. */ #undef __FUNC__ #define __FUNC__ "Euclid_dhPrintStatsShort" void Euclid_dhPrintStatsShort(Euclid_dh ctx, HYPRE_Real setup, HYPRE_Real solve, FILE *fp) { START_FUNC_DH HYPRE_Real *timing = ctx->timing; /* HYPRE_Real *stats = ctx->stats; */ /* HYPRE_Real setup_factor; */ /* HYPRE_Real setup_other; */ HYPRE_Real apply_total; HYPRE_Real apply_per_it; /* HYPRE_Real nzUsedRatio; */ HYPRE_Real perIt; HYPRE_Int blocks = np_dh; if (np_dh == 1) blocks = ctx->sg->blocks; reduce_timings_private(ctx); CHECK_V_ERROR; /* setup_factor = timing[FACTOR_T]; */ /* setup_other = timing[SETUP_T] - setup_factor; */ apply_total = timing[TRI_SOLVE_T]; apply_per_it = apply_total/(HYPRE_Real)ctx->its; /* nzUsedRatio = stats[NZA_RATIO_STATS]; */ perIt = solve/(HYPRE_Real)ctx->its; fprintf_dh(fp, "\n"); fprintf_dh(fp, "%6s %6s %6s %6s %6s %6s %6s %6s %6s %6s XX\n", "method", "subdms", "level", "its", "setup", "solve", "total", "perIt", "perIt", "rows"); fprintf_dh(fp, "------ ----- ----- ----- ----- ----- ----- ----- ----- ----- XX\n"); fprintf_dh(fp, "%6s %6i %6i %6i %6.2f %6.2f %6.2f %6.4f %6.5f %6g XXX\n", ctx->algo_par, /* parallelization strategy [pilu, bj] */ blocks, /* number of subdomains */ ctx->level, /* level, for ILU(k) */ ctx->its, /* iterations */ setup, /* total setup time, from caller */ solve, /* total setup time, from caller */ setup+solve, /* total time, from caller */ perIt, /* time per iteration, solver+precond. */ apply_per_it, /* time per iteration, solver+precond. */ (HYPRE_Real)ctx->n /* global unknnowns */ ); #if 0 fprintf_dh(fp, "\n"); fprintf_dh(fp, "%6s %6s %6s %6s %6s %6s %6s %6s %6s %6s %6s %6s %6s XX\n", "", "","","","","setup","setup","","","","","",""); fprintf_dh(fp, "%6s %6s %6s %6s %6s %6s %6s %6s %6s %6s %6s %6s %6s XX\n", "method", "subdms", "level", "its", "total", "factor", "other", "apply", "perIt", "rho", "A_tol", "A_%", "rows"); fprintf_dh(fp, "------ ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- XX\n"); fprintf_dh(fp, "%6s %6i %6i %6i %6.2f %6.2f %6.2f %6.2f %6.4f %6.1f %6g %6.2f %6g XXX\n", ctx->algo_par, /* parallelization strategy [pilu, bj] */ blocks, /* number of subdomains */ ctx->level, /* level, for ILU(k) */ ctx->its, /* iterations */ setup, /* total setup time, from caller */ solve, /* total setup time, from caller */ setup_factor, /* pc solve: factorization */ setup_other, /* pc setup: other */ apply_total, /* triangular solve time */ apply_per_it, /* time for one triangular solve */ ctx->rho_final, /* rho */ ctx->sparseTolA, /* sparseA tolerance */ nzUsedRatio, /* percent of A that was used */ (HYPRE_Real)ctx->n /* global unknnowns */ ); #endif #if 0 /* special: for scalability studies */ fprintf_dh(fp, "\n%6s %6s %6s %6s %6s %6s WW\n", "method", "level", "subGph", "factor", "solveS", "perIt"); fprintf_dh(fp, "------ ----- ----- ----- ----- ----- WW\n"); fprintf_dh(fp, "%6s %6i %6.2f %6.2f %6.2f %6.4f WWW\n", ctx->algo_par, ctx->level, timing[SUB_GRAPH_T], timing[FACTOR_T], timing[SOLVE_SETUP_T], apply_per_it); #endif END_FUNC_DH } /* its during last solve; rho; nzaUsed */ #undef __FUNC__ #define __FUNC__ "Euclid_dhPrintStatsShorter" void Euclid_dhPrintStatsShorter(Euclid_dh ctx, FILE *fp) { START_FUNC_DH HYPRE_Real *stats = ctx->stats; HYPRE_Int its = ctx->its; HYPRE_Real rho = ctx->rho_final; HYPRE_Real nzUsedRatio = stats[NZA_RATIO_STATS]; fprintf_dh(fp, "\nStats from last linear solve: YY\n"); fprintf_dh(fp, "%6s %6s %6s YY\n", "its", "rho","A_%"); fprintf_dh(fp, " ----- ----- ----- YY\n"); fprintf_dh(fp, "%6i %6.2f %6.2f YYY\n", its, rho, nzUsedRatio); END_FUNC_DH } #undef __FUNC__ #define __FUNC__ "Euclid_dhPrintScaling" void Euclid_dhPrintScaling(Euclid_dh ctx, FILE *fp) { START_FUNC_DH HYPRE_Int i, m = ctx->m; if (m > 10) m = 10; if (ctx->scale == NULL) { SET_V_ERROR("ctx->scale is NULL; was Euclid_dhSetup() called?"); } hypre_fprintf(fp, "\n---------- 1st %i row scaling values:\n", m); for (i=0; iscale[i]); } END_FUNC_DH } #undef __FUNC__ #define __FUNC__ "reduce_timings_private" void reduce_timings_private(Euclid_dh ctx) { START_FUNC_DH if (np_dh > 1) { HYPRE_Real bufOUT[TIMING_BINS]; hypre_TMemcpy(bufOUT, ctx->timing, HYPRE_Real, TIMING_BINS, HYPRE_MEMORY_HOST, HYPRE_MEMORY_HOST); hypre_MPI_Reduce(bufOUT, ctx->timing, TIMING_BINS, hypre_MPI_REAL, hypre_MPI_MAX, 0, comm_dh); } ctx->timingsWereReduced = true; END_FUNC_DH } #undef __FUNC__ #define __FUNC__ "Euclid_dhPrintHypreReport" void Euclid_dhPrintHypreReport(Euclid_dh ctx, FILE *fp) { START_FUNC_DH HYPRE_Real *timing; HYPRE_Int nz; nz = Factor_dhReadNz(ctx->F); CHECK_V_ERROR; timing = ctx->timing; /* add in timing from lasst setup (if any) */ ctx->timing[TOTAL_SOLVE_T] += ctx->timing[TOTAL_SOLVE_TEMP_T]; ctx->timing[TOTAL_SOLVE_TEMP_T] = 0.0; reduce_timings_private(ctx); CHECK_V_ERROR; if (myid_dh == 0) { hypre_fprintf(fp, "@@@@@@@@@@@@@@@@@@@@@@ Euclid statistical report (start)\n"); fprintf_dh(fp, "\nruntime parameters\n"); fprintf_dh(fp, "------------------\n"); fprintf_dh(fp, " setups: %i\n", ctx->setupCount); fprintf_dh(fp, " tri solves: %i\n", ctx->itsTotal); fprintf_dh(fp, " parallelization method: %s\n", ctx->algo_par); fprintf_dh(fp, " factorization method: %s\n", ctx->algo_ilu); if (! strcmp(ctx->algo_ilu, "iluk")) { fprintf_dh(fp, " level: %i\n", ctx->level); } if (ctx->isScaled) { fprintf_dh(fp, " matrix was row scaled\n"); } fprintf_dh(fp, " global matrix row count: %i\n", ctx->n); fprintf_dh(fp, " nzF: %i\n", nz); fprintf_dh(fp, " rho: %g\n", ctx->rho_final); fprintf_dh(fp, " sparseA: %g\n", ctx->sparseTolA); fprintf_dh(fp, "\nEuclid timing report\n"); fprintf_dh(fp, "--------------------\n"); fprintf_dh(fp, " solves total: %0.2f (see docs)\n", timing[TOTAL_SOLVE_T]); fprintf_dh(fp, " tri solves: %0.2f\n", timing[TRI_SOLVE_T]); fprintf_dh(fp, " setups: %0.2f\n", timing[SETUP_T]); fprintf_dh(fp, " subdomain graph setup: %0.2f\n", timing[SUB_GRAPH_T]); fprintf_dh(fp, " factorization: %0.2f\n", timing[FACTOR_T]); fprintf_dh(fp, " solve setup: %0.2f\n", timing[SOLVE_SETUP_T]); fprintf_dh(fp, " rho: %0.2f\n", ctx->timing[COMPUTE_RHO_T]); fprintf_dh(fp, " misc (should be small): %0.2f\n", timing[SETUP_T] - (timing[SUB_GRAPH_T]+timing[FACTOR_T]+ timing[SOLVE_SETUP_T]+timing[COMPUTE_RHO_T])); if (ctx->sg != NULL) { SubdomainGraph_dhPrintStats(ctx->sg, fp); CHECK_V_ERROR; SubdomainGraph_dhPrintRatios(ctx->sg, fp); CHECK_V_ERROR; } hypre_fprintf(fp, "@@@@@@@@@@@@@@@@@@@@@@ Euclid statistical report (end)\n"); } END_FUNC_DH } #undef __FUNC__ #define __FUNC__ "Euclid_dhPrintTestData" void Euclid_dhPrintTestData(Euclid_dh ctx, FILE *fp) { START_FUNC_DH /* Print data that should remain that will hopefully remain the same for any platform. Possibly "tri solves" may change . . . */ if (myid_dh == 0) { hypre_fprintf(fp, " setups: %i\n", ctx->setupCount); hypre_fprintf(fp, " tri solves: %i\n", ctx->its); hypre_fprintf(fp, " parallelization method: %s\n", ctx->algo_par); hypre_fprintf(fp, " factorization method: %s\n", ctx->algo_ilu); hypre_fprintf(fp, " level: %i\n", ctx->level); hypre_fprintf(fp, " row scaling: %i\n", ctx->isScaled); } SubdomainGraph_dhPrintRatios(ctx->sg, fp); CHECK_V_ERROR; END_FUNC_DH } hypre-2.33.0/src/distributed_ls/Euclid/Euclid_dh.h000066400000000000000000000141421477326011500220030ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #ifndef EUCLID_MPI_INTERFACE_DH #define EUCLID_MPI_INTERFACE_DH #define DEFAULT_DROP_TOL 0.01 /* #include "euclid_common.h" */ /*====================================================================== * Naming convention: functions ending in _mpi are located in * src/Euclid_mpi.c; those ending in _seq are in src/Euclid_seq.c; * most others should be in Euclid_all.c. * * Exceptions: all Apply() (triangular solves) are in src/Euclid_apply.c; * except for the Apply for MPI PILU, which is called * Mat_dhSolve, and is in src/Mat_dh.c * * Users should only need to call functions with names of the form * Euclid_dhXXX (public functions). * * Some of the functions whose names are of the form XXX_private_XXX, * as could easily be static functions; similarly, the enums and * structs do need to be public. They are, primarily, for ease in * debugging and ready reference. * * Exceptions: the apply_private functions aren't listed here --- they're * all static in src/Euclid_apply.c *======================================================================*/ extern void Euclid_dhCreate(Euclid_dh *ctxOUT); extern void Euclid_dhDestroy(Euclid_dh ctx); extern void Euclid_dhSetup(Euclid_dh ctx); extern void Euclid_dhSolve(Euclid_dh ctx, Vec_dh lhs, Vec_dh rhs, HYPRE_Int *its); extern void Euclid_dhApply(Euclid_dh ctx, HYPRE_Real *lhs, HYPRE_Real *rhs); extern void Euclid_dhPrintTestData(Euclid_dh ctx, FILE *fp); extern void Euclid_dhPrintScaling(Euclid_dh ctx, FILE *fp); extern void Euclid_dhPrintStatsShort(Euclid_dh ctx, HYPRE_Real setup, HYPRE_Real solve, FILE *fp); extern void Euclid_dhPrintStatsShorter(Euclid_dh ctx, FILE *fp); /* on-line reporting, for making quick tables */ extern void Euclid_dhPrintHypreReport(Euclid_dh ctx, FILE *fp); extern void Euclid_dhPrintStats(Euclid_dh ctx, FILE *fp); /* prints same info as Euclid_dhPrintParams(), but also prints timing information, number of iterations, etc; may be called after solve is completed. */ #ifdef HYPRE_MODE /* is this still needed? */ extern void Euclid_dhInputHypreMat(Euclid_dh ctx, HYPRE_ParCSRMatrix A); #endif /*---------------------------------------------------------------------- * Private data structures *----------------------------------------------------------------------*/ #define MAX_OPT_LEN 20 /* for internal timing */ #define TIMING_BINS 10 enum{ SOLVE_START_T, TRI_SOLVE_T, /* triangular solves */ SETUP_T, /* total setup */ SUB_GRAPH_T, /* setup SubdomainGraph_dh */ FACTOR_T, /* factorization */ SOLVE_SETUP_T, /* setup for solves */ COMPUTE_RHO_T, /* note: SETUP_T - (FACTOR_T + SUB_GRAPH_T) should be small! */ TOTAL_SOLVE_TEMP_T, TOTAL_SOLVE_T }; /* for statistical reporting */ #define STATS_BINS 10 enum{ NZA_STATS, /* cumulative nonzeros for all systems solved */ NZF_STATS, /* cumulative nonzeros for all systems solved */ NZA_USED_STATS, /* cumulative nonzeros NOT dropped by sparseA */ NZA_RATIO_STATS /* NZA_USED_STATS/NZA_STATS, over all processors */ }; /* primary data structure: this is monstrously long; but it works. Users must ensure the following fields are initialized prior to calling Euclid_dhSetup(): m, n, beg_row, A */ struct _mpi_interface_dh { bool isSetup; HYPRE_Real rho_init; HYPRE_Real rho_final; /* Memory allocation for factor; will initially allocate space for rho_init*nzA nonzeros; rho_final is computed after factorization, and is the minimum that rho_init whoulc have been to avoid memory reallocation; rho_final is a maximum across all processors. */ HYPRE_Int m; /* local rows in matrix */ HYPRE_Int n; /* global rows in matrix */ HYPRE_Real *rhs; /* used for debugging; this vector is not owned! */ void *A; /* PETSc, HYPRE, Euclid, or other matrix object. */ Factor_dh F; /* data structure for the factor, F = L+U-I */ SubdomainGraph_dh sg; REAL_DH *scale; /* row scaling vector */ bool isScaled; /* set at runtime, turns scaling on or off */ /* workspace for factorization and triangular solves */ HYPRE_Real *work; HYPRE_Real *work2; HYPRE_Int from, to; /* which local rows to factor or solve */ /* runtime parameters (mostly) */ char algo_par[MAX_OPT_LEN]; /* parallelization strategy */ char algo_ilu[MAX_OPT_LEN]; /* ILU factorization method */ HYPRE_Int level; /* for ILU(k) */ HYPRE_Real droptol; /* for ILUT */ HYPRE_Real sparseTolA; /* for sparsifying A */ HYPRE_Real sparseTolF; /* for sparsifying the factors */ HYPRE_Real pivotMin; /* if pivots are <= to this value, fix 'em */ HYPRE_Real pivotFix; /* multiplier for adjusting small pivots */ HYPRE_Real maxVal; /* largest abs. value in matrix */ /* data structures for parallel ilu (pilu) */ SortedList_dh slist; ExternalRows_dh extRows; /* for use with Euclid's internal krylov solvers; */ char krylovMethod[MAX_OPT_LEN]; HYPRE_Int maxIts; HYPRE_Real rtol; HYPRE_Real atol; HYPRE_Int its; /* number of times preconditioner was applied since last call to Setup */ HYPRE_Int itsTotal; /* cululative number of times preconditioner was applied */ /* internal statistics */ HYPRE_Int setupCount; HYPRE_Int logging; /* added in support of Hypre */ HYPRE_Real timing[TIMING_BINS]; HYPRE_Real stats[STATS_BINS]; bool timingsWereReduced; bool printStats; /* if true, on 2nd and subsequent calls to Setup, calls Euclid_dhPrintStatsShorter(). Intent is to print out stats for each setup phase when using Euclid, e.g, for nonlinear solves. */ }; #endif /* #ifndef EUCLID_MPI_INTERFACE_DH */ hypre-2.33.0/src/distributed_ls/Euclid/ExternalRows_dh.c000066400000000000000000000444741477326011500232410ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "_hypre_Euclid.h" /* #include "ExternalRows_dh.h" */ /* #include "Factor_dh.h" */ /* #include "Euclid_dh.h" */ /* #include "SubdomainGraph_dh.h" */ /* #include "Mem_dh.h" */ /* #include "Parser_dh.h" */ /* #include "Hash_dh.h" */ /* tags for MPI comms */ enum{ ROW_CT_TAG, NZ_CT_TAG, ROW_LENGTH_TAG, ROW_NUMBER_TAG, CVAL_TAG, FILL_TAG, AVAL_TAG }; #undef __FUNC__ #define __FUNC__ "ExternalRows_dhCreate" void ExternalRows_dhCreate(ExternalRows_dh *er) { START_FUNC_DH struct _extrows_dh* tmp = (struct _extrows_dh*)MALLOC_DH(sizeof(struct _extrows_dh)); CHECK_V_ERROR; *er = tmp; if (MAX_MPI_TASKS < np_dh) { SET_V_ERROR("MAX_MPI_TASKS is too small; change, then recompile!"); } { HYPRE_Int i; for (i=0; ircv_row_lengths[i] = NULL; tmp->rcv_row_numbers[i] = NULL; } } tmp->cvalExt = NULL; tmp->fillExt = NULL; tmp->avalExt = NULL; tmp->my_row_counts = NULL; tmp->my_row_numbers = NULL; tmp->cvalSend = NULL; tmp->fillSend = NULL; tmp->avalSend = NULL; tmp->rowLookup = NULL; tmp->sg = NULL; tmp->F = NULL; tmp->debug = Parser_dhHasSwitch(parser_dh, "-debug_ExtRows"); END_FUNC_DH } #undef __FUNC__ #define __FUNC__ "ExternalRows_dhDestroy" void ExternalRows_dhDestroy(ExternalRows_dh er) { START_FUNC_DH HYPRE_Int i; for (i=0; ircv_row_lengths[i] != NULL) { FREE_DH(er->rcv_row_lengths[i]); CHECK_V_ERROR; } if (er->rcv_row_numbers[i] != NULL) { FREE_DH(er->rcv_row_numbers[i]); CHECK_V_ERROR; } } if (er->cvalExt != NULL) { FREE_DH(er->cvalExt); CHECK_V_ERROR; } if (er->fillExt != NULL) { FREE_DH(er->fillExt); CHECK_V_ERROR; } if (er->avalExt != NULL) { FREE_DH(er->avalExt); CHECK_V_ERROR; } if (er->my_row_counts != NULL) { FREE_DH(er->my_row_counts); CHECK_V_ERROR; } if (er->my_row_numbers != NULL) { FREE_DH(er->my_row_numbers); CHECK_V_ERROR; } if (er->cvalSend != NULL) { FREE_DH(er->cvalSend); CHECK_V_ERROR; } if (er->fillSend != NULL) { FREE_DH(er->fillSend); CHECK_V_ERROR; } if (er->avalSend != NULL) { FREE_DH(er->avalSend); CHECK_V_ERROR; } if (er->rowLookup != NULL) { Hash_dhDestroy(er->rowLookup); CHECK_V_ERROR; } FREE_DH(er); CHECK_V_ERROR; END_FUNC_DH } #undef __FUNC__ #define __FUNC__ "ExternalRows_dhInit" void ExternalRows_dhInit(ExternalRows_dh er, Euclid_dh ctx) { START_FUNC_DH er->sg = ctx->sg; er->F = ctx->F; END_FUNC_DH } /*===================================================================== * method for accessing external rows *=====================================================================*/ #undef __FUNC__ #define __FUNC__ "ExternalRows_dhGetRow" void ExternalRows_dhGetRow(ExternalRows_dh er, HYPRE_Int globalRow, HYPRE_Int *len, HYPRE_Int **cval, HYPRE_Int **fill, REAL_DH **aval) { START_FUNC_DH if (er->rowLookup == NULL) { *len = 0; } else { HashData *r = NULL; r = Hash_dhLookup(er->rowLookup, globalRow); CHECK_V_ERROR; if (r != NULL) { *len = r->iData; if (cval != NULL) *cval = r->iDataPtr; if (fill != NULL) *fill = r->iDataPtr2; if (aval != NULL) *aval = r->fDataPtr; } else { *len = 0; } } END_FUNC_DH } /*===================================================================== * methods for receiving external rows from lower-ordered subdomains *=====================================================================*/ static void rcv_ext_storage_private(ExternalRows_dh extRows); static void build_hash_table_private(ExternalRows_dh er); static void rcv_external_rows_private(ExternalRows_dh er); static void allocate_ext_row_storage_private(ExternalRows_dh er); static void print_received_rows_private(ExternalRows_dh er); #undef __FUNC__ #define __FUNC__ "ExternalRows_dhRecvRows" void ExternalRows_dhRecvRows(ExternalRows_dh er) { START_FUNC_DH bool debug = false; if (logFile != NULL && er->debug) debug = true; if (er->sg->loCount > 0) { /* get number of rows and length of each row to be received from each lower ordered nabor. (allocates: *rcv_row_lengths[], *rcv_row_numbers[]) */ rcv_ext_storage_private(er); CHECK_V_ERROR; /* allocate data structures for receiving the rows (no comms) (allocates: cvalExt, fillExt, avalExt) (no communications) */ allocate_ext_row_storage_private(er); CHECK_V_ERROR; /* construct hash table for external row lookup (no comms) (Creates/allocates: rowLookup) (no communications) */ build_hash_table_private(er); CHECK_V_ERROR; /* receive the actual row structures and values from lower ordered neighbors */ rcv_external_rows_private(er); CHECK_V_ERROR; if (debug) { print_received_rows_private(er); CHECK_V_ERROR; } } END_FUNC_DH } #undef __FUNC__ #define __FUNC__ "rcv_ext_storage_private" void rcv_ext_storage_private(ExternalRows_dh er) { START_FUNC_DH HYPRE_Int i; HYPRE_Int loCount = er->sg->loCount, *loNabors = er->sg->loNabors; HYPRE_Int *rcv_row_counts = er->rcv_row_counts; HYPRE_Int *rcv_nz_counts = er->rcv_nz_counts; HYPRE_Int **lengths = er->rcv_row_lengths, **numbers = er->rcv_row_numbers; bool debug = false; if (logFile != NULL && er->debug) debug = true; /* get number of rows, and total nonzeros, that each lo-nabor will send */ for (i=0; ireq1+i); hypre_MPI_Irecv(rcv_nz_counts+i, 1, HYPRE_MPI_INT, nabor, NZ_CT_TAG, comm_dh, er->req2+i); } hypre_MPI_Waitall(loCount, er->req1, er->status); hypre_MPI_Waitall(loCount, er->req2, er->status); if (debug) { hypre_fprintf(logFile, "\nEXR rcv_ext_storage_private:: \nEXR "); for (i=0; i ", loNabors[i], rcv_row_counts[i], rcv_nz_counts[i]); } } /* get lengths and global number of each row to be received */ for (i=0; ireq1+i); hypre_MPI_Irecv(numbers[i], nz, HYPRE_MPI_INT, nabor, ROW_NUMBER_TAG, comm_dh, er->req2+i); } hypre_MPI_Waitall(loCount, er->req1, er->status); hypre_MPI_Waitall(loCount, er->req2, er->status); if (debug) { HYPRE_Int j, nz; for (i=0; i to be received from P_%i\nEXR ", loNabors[i]); nz = rcv_row_counts[i]; for (j=0; j ", numbers[i][j], lengths[i][j]); hypre_fprintf(logFile, "\n"); } } END_FUNC_DH } /* allocates: cvalExt, fillExt, avalExt */ #undef __FUNC__ #define __FUNC__ "allocate_ext_row_storage_private" void allocate_ext_row_storage_private(ExternalRows_dh er) { START_FUNC_DH HYPRE_Int i, nz = 0; HYPRE_Int loCount = er->sg->loCount; HYPRE_Int *rcv_nz_counts = er->rcv_nz_counts; /* count total number of nonzeros to be received */ for (i=0; icvalExt = (HYPRE_Int*)MALLOC_DH(nz*sizeof(HYPRE_Int)); CHECK_V_ERROR; er->fillExt = (HYPRE_Int*)MALLOC_DH(nz*sizeof(HYPRE_Int)); CHECK_V_ERROR; er->avalExt = (REAL_DH*)MALLOC_DH(nz*sizeof(REAL_DH)); CHECK_V_ERROR; END_FUNC_DH } #undef __FUNC__ #define __FUNC__ "build_hash_table_private" void build_hash_table_private(ExternalRows_dh er) { START_FUNC_DH HYPRE_Int loCount = er->sg->loCount; HYPRE_Int i, j, offset, rowCt = 0; Hash_dh table; HashData record; HYPRE_Int *extRowCval = er->cvalExt, *extRowFill = er->fillExt; REAL_DH *extRowAval = er->avalExt; HYPRE_Int *rcv_row_counts = er->rcv_row_counts; HYPRE_Int **rcv_row_numbers = er->rcv_row_numbers; HYPRE_Int **rcv_row_lengths = er->rcv_row_lengths; /* count total number of rows to be received */ for (i=0; irowLookup = table; offset = 0; /* loop over lower ordered nabors in subdomain graph */ for (i=0; ircv_nz_counts; HYPRE_Int i, loCount = er->sg->loCount, *loNabors = er->sg->loNabors; HYPRE_Int nabor, nz = 0, offset = 0; HYPRE_Int *extRowCval = er->cvalExt, *extRowFill = er->fillExt; HYPRE_Real *extRowAval = er->avalExt; /* start receives of external rows */ nz = 0; for (i=0; ireq1+i); hypre_MPI_Irecv(extRowFill+offset, nz, HYPRE_MPI_INT, nabor, FILL_TAG, comm_dh, er->req2+i); hypre_MPI_Irecv(extRowAval+offset, nz, hypre_MPI_REAL, nabor, AVAL_TAG, comm_dh, er->req3+i); offset += nz; } /* wait for external rows to arrive */ hypre_MPI_Waitall(loCount, er->req1, er->status); hypre_MPI_Waitall(loCount, er->req2, er->status); hypre_MPI_Waitall(loCount, er->req3, er->status); END_FUNC_DH } #undef __FUNC__ #define __FUNC__ "print_received_rows_private" void print_received_rows_private(ExternalRows_dh er) { START_FUNC_DH bool noValues = (Parser_dhHasSwitch(parser_dh, "-noValues")); HYPRE_Int i, j, k, rwCt, idx = 0, nabor; HYPRE_Int loCount = er->sg->loCount, *loNabors = er->sg->loNabors; HYPRE_Int n = er->F->n; hypre_fprintf(logFile, "\nEXR ================= received rows, printed from buffers ==============\n"); /* loop over nabors from whom we received rows */ for (i=0; ircv_row_counts[i]; nabor = loNabors[i]; hypre_fprintf(logFile, "\nEXR Rows received from P_%i:\n", nabor); /* loop over each row to be received from this nabor */ for (j=0; jrcv_row_numbers[i][j]; HYPRE_Int rowLen = er->rcv_row_lengths[i][j]; hypre_fprintf(logFile, "EXR %i :: ", 1+rowNum); for (k=0; kcvalExt[idx], er->fillExt[idx]); } else { hypre_fprintf(logFile, "%i,%i,%g ; ", er->cvalExt[idx], er->fillExt[idx], er->avalExt[idx]); } ++idx; } hypre_fprintf(logFile, "\n"); } } hypre_fprintf(logFile, "\nEXR =============== received rows, printed from hash table =============\n"); for (i=0; i 0) { hypre_fprintf(logFile, "EXR %i :: ", i+1); for (j=0; jsg->hiCount > 0) { /* send number of rows and length of each row to be sent to each higher ordered nabor. */ send_ext_storage_private(er); CHECK_V_ERROR; /* send the row's colum indices, fill levels, and values */ send_external_rows_private(er); CHECK_V_ERROR; waitfor_sends_private(er); CHECK_V_ERROR; } END_FUNC_DH } #undef __FUNC__ #define __FUNC__ "send_ext_storage_private" void send_ext_storage_private(ExternalRows_dh er) { START_FUNC_DH HYPRE_Int nz, i, j; HYPRE_Int *nzCounts, *nzNumbers; HYPRE_Int hiCount = er->sg->hiCount, *hiNabors = er->sg->hiNabors; HYPRE_Int *rp = er->F->rp, *diag = er->F->diag; HYPRE_Int m = er->F->m; HYPRE_Int beg_row = er->F->beg_row; HYPRE_Int rowCount = er->F->bdry_count; /* number of boundary rows */ HYPRE_Int first_bdry = er->F->first_bdry; bool debug = false; if (logFile != NULL && er->debug) debug = true; /* allocate storage to hold nz counts for each row */ nzCounts = er->my_row_counts = (HYPRE_Int*)MALLOC_DH(rowCount*sizeof(HYPRE_Int)); CHECK_V_ERROR; nzNumbers = er->my_row_numbers = (HYPRE_Int*)MALLOC_DH(rowCount*sizeof(HYPRE_Int)); CHECK_V_ERROR; /* count nonzeros in upper triangular portion of each boundary row */ nz = 0; for (i=first_bdry, j=0; inzSend = nz; if (debug) { hypre_fprintf(logFile, "EXR send_ext_storage_private:: rowCount = %i\n", rowCount); hypre_fprintf(logFile, "EXR send_ext_storage_private:: nz Count = %i\n", nz); } /* send number of rows, and total nonzeros, to higher ordered nabors */ for (i=0; ireq1+i); hypre_MPI_Isend(&nz, 1, HYPRE_MPI_INT, nabor, NZ_CT_TAG, comm_dh, er->req2+i); } /* set up array for global row numbers */ for (i=0, j=first_bdry; jreq3+i); hypre_MPI_Isend(nzCounts, rowCount, HYPRE_MPI_INT, nabor, ROW_LENGTH_TAG, comm_dh, er->req4+i); } END_FUNC_DH } #undef __FUNC__ #define __FUNC__ "send_external_rows_private" void send_external_rows_private(ExternalRows_dh er) { START_FUNC_DH HYPRE_Int i, j, hiCount = er->sg->hiCount, *hiNabors = er->sg->hiNabors; HYPRE_Int offset, nz = er->nzSend; HYPRE_Int *cvalSend, *fillSend; REAL_DH *avalSend; HYPRE_Int *cval = er->F->cval, *fill = er->F->fill; HYPRE_Int m = er->F->m; HYPRE_Int *rp = er->F->rp, *diag = er->F->diag; HYPRE_Int first_bdry = er->F->first_bdry; REAL_DH *aval = er->F->aval; bool debug = false; if (logFile != NULL && er->debug) debug = true; /* allocate buffers to hold upper triangular portion of boundary rows */ cvalSend = er->cvalSend = (HYPRE_Int*)MALLOC_DH(nz*sizeof(HYPRE_Int)); CHECK_V_ERROR; fillSend = er->fillSend = (HYPRE_Int*)MALLOC_DH(nz*sizeof(HYPRE_Int)); CHECK_V_ERROR; avalSend = er->avalSend = (HYPRE_Real*)MALLOC_DH(nz*sizeof(HYPRE_Real)); CHECK_V_ERROR; /* copy upper triangular portion of boundary rows HYPRE_Int send buffers */ offset = 0; for (i=first_bdry, j=0; iF->beg_row; HYPRE_Int idx = 0; bool noValues = (Parser_dhHasSwitch(parser_dh, "-noValues")); hypre_fprintf(logFile, "\nEXR ======================= send buffers ======================\n"); for (i=first_bdry, j=0; icval_req+i); hypre_MPI_Isend(fillSend, nz, HYPRE_MPI_INT, nabor, FILL_TAG, comm_dh, er->fill_req+i); hypre_MPI_Isend(avalSend, nz, hypre_MPI_REAL, nabor, AVAL_TAG, comm_dh, er->aval_req+i); } END_FUNC_DH } #undef __FUNC__ #define __FUNC__ "waitfor_sends_private" void waitfor_sends_private(ExternalRows_dh er) { START_FUNC_DH hypre_MPI_Status *status = er->status; HYPRE_Int hiCount = er->sg->hiCount; if (hiCount) { hypre_MPI_Waitall(hiCount, er->req1, status); hypre_MPI_Waitall(hiCount, er->req2, status); hypre_MPI_Waitall(hiCount, er->req3, status); hypre_MPI_Waitall(hiCount, er->req4, status); hypre_MPI_Waitall(hiCount, er->cval_req, status); hypre_MPI_Waitall(hiCount, er->fill_req, status); hypre_MPI_Waitall(hiCount, er->aval_req, status); } END_FUNC_DH } hypre-2.33.0/src/distributed_ls/Euclid/ExternalRows_dh.h000066400000000000000000000057531477326011500232430ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /* for internal use */ #ifndef EXTERNAL_ROWS_DH_H #define EXTERNAL_ROWS_DH_H /* #include "euclid_common.h" */ extern void ExternalRows_dhCreate(ExternalRows_dh *er); extern void ExternalRows_dhDestroy(ExternalRows_dh er); extern void ExternalRows_dhInit(ExternalRows_dh er, Euclid_dh ctx); extern void ExternalRows_dhRecvRows(ExternalRows_dh extRows); extern void ExternalRows_dhSendRows(ExternalRows_dh extRows); extern void ExternalRows_dhGetRow(ExternalRows_dh er, HYPRE_Int globalRow, HYPRE_Int *len, HYPRE_Int **cval, HYPRE_Int **fill, REAL_DH **aval); struct _extrows_dh { SubdomainGraph_dh sg; /* not owned! */ Factor_dh F; /* not owned! */ hypre_MPI_Status status[MAX_MPI_TASKS]; hypre_MPI_Request req1[MAX_MPI_TASKS]; hypre_MPI_Request req2[MAX_MPI_TASKS]; hypre_MPI_Request req3[MAX_MPI_TASKS]; hypre_MPI_Request req4[MAX_MPI_TASKS]; hypre_MPI_Request cval_req[MAX_MPI_TASKS]; hypre_MPI_Request fill_req[MAX_MPI_TASKS]; hypre_MPI_Request aval_req[MAX_MPI_TASKS]; /*------------------------------------------------------------------------ * data structures for receiving, storing, and accessing external rows * from lower-ordered nabors *------------------------------------------------------------------------*/ /* for reception of row counts, row numbers, and row lengths: */ HYPRE_Int rcv_row_counts[MAX_MPI_TASKS]; /* P_i will send rcv_row_counts[i] rows */ HYPRE_Int rcv_nz_counts[MAX_MPI_TASKS]; /* P_i's rows contain rcv_nz_counts[i] nonzeros */ HYPRE_Int *rcv_row_lengths[MAX_MPI_TASKS]; /* rcv_row_lengths[i][] lists the length of each row */ HYPRE_Int *rcv_row_numbers[MAX_MPI_TASKS]; /* rcv_row_lengths[i][] lists the length of each row */ /* for reception of the actual rows: */ HYPRE_Int *cvalExt; HYPRE_Int *fillExt; REAL_DH *avalExt; /* table for accessing the rows */ Hash_dh rowLookup; /*-------------------------------------------------------------------------- * data structures for sending boundary rows to higher-ordered nabors *--------------------------------------------------------------------------*/ /* for sending row counts, numbers, and lengths: */ HYPRE_Int *my_row_counts; /* my_row_counts[i] = nzcount in upper tri portion o */ HYPRE_Int *my_row_numbers; /* my_row_numbers[i] = global row number of local ro */ /* for sending the actual rows: */ HYPRE_Int nzSend; /* total entries in upper tri portions of bdry rows */ HYPRE_Int *cvalSend; HYPRE_Int *fillSend; REAL_DH *avalSend; bool debug; }; #endif hypre-2.33.0/src/distributed_ls/Euclid/Factor_dh.c000066400000000000000000001067231477326011500220160ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "_hypre_Euclid.h" /* #include "Factor_dh.h" */ /* #include "Vec_dh.h" */ /* #include "Mat_dh.h" */ /* #include "SubdomainGraph_dh.h" */ /* #include "TimeLog_dh.h" */ /* #include "Mem_dh.h" */ /* #include "Numbering_dh.h" */ /* #include "Hash_i_dh.h" */ /* #include "Parser_dh.h" */ /* #include "mat_dh_private.h" */ /* #include "getRow_dh.h" */ /* #include "Euclid_dh.h" */ /* #include "io_dh.h" */ /* suppress compiler complaints */ void Factor_dh_junk(void) { } static void adjust_bj_private(Factor_dh mat); static void unadjust_bj_private(Factor_dh mat); #undef __FUNC__ #define __FUNC__ "Factor_dhCreate" void Factor_dhCreate(Factor_dh *mat) { START_FUNC_DH HYPRE_Int i; struct _factor_dh* tmp; if (np_dh > MAX_MPI_TASKS) { SET_V_ERROR("you must change MAX_MPI_TASKS and recompile!"); } tmp = (struct _factor_dh*)MALLOC_DH(sizeof(struct _factor_dh)); CHECK_V_ERROR; *mat = tmp; tmp->m = 0; tmp->n = 0; tmp->id = myid_dh; tmp->beg_row = 0; tmp->first_bdry = 0; tmp->bdry_count = 0; tmp->blockJacobi = false; tmp->rp = NULL; tmp->cval = NULL; tmp->aval = NULL; tmp->fill = NULL; tmp->diag = NULL; tmp->alloc = 0; tmp->work_y_lo = tmp->work_x_hi = NULL; tmp->sendbufLo = tmp->sendbufHi = NULL; tmp->sendindLo = tmp->sendindHi = NULL; tmp->num_recvLo = tmp->num_recvHi = 0; tmp->num_sendLo = tmp->num_sendHi = 0; tmp->sendlenLo = tmp->sendlenHi = 0; tmp->solveIsSetup = false; tmp->numbSolve = NULL; tmp->debug = Parser_dhHasSwitch(parser_dh, "-debug_Factor"); /* initialize MPI request to null */ for(i=0; irecv_reqLo[i] = hypre_MPI_REQUEST_NULL; tmp->recv_reqHi[i] = hypre_MPI_REQUEST_NULL; tmp->send_reqLo[i] = hypre_MPI_REQUEST_NULL; tmp->send_reqHi[i] = hypre_MPI_REQUEST_NULL; tmp->requests[i] = hypre_MPI_REQUEST_NULL; } /* Factor_dhZeroTiming(tmp); CHECK_V_ERROR; */ END_FUNC_DH } #undef __FUNC__ #define __FUNC__ "Factor_dhDestroy" void Factor_dhDestroy(Factor_dh mat) { START_FUNC_DH HYPRE_Int i; if (mat->rp != NULL) { FREE_DH(mat->rp); CHECK_V_ERROR; } if (mat->cval != NULL) { FREE_DH(mat->cval); CHECK_V_ERROR; } if (mat->aval != NULL) { FREE_DH(mat->aval); CHECK_V_ERROR; } if (mat->diag != NULL) { FREE_DH(mat->diag); CHECK_V_ERROR; } if (mat->fill != NULL) { FREE_DH(mat->fill); CHECK_V_ERROR; } if (mat->work_y_lo != NULL) { FREE_DH(mat->work_y_lo); CHECK_V_ERROR; } if (mat->work_x_hi != NULL) { FREE_DH(mat->work_x_hi); CHECK_V_ERROR; } if (mat->sendbufLo != NULL) { FREE_DH(mat->sendbufLo); CHECK_V_ERROR; } if (mat->sendbufHi != NULL) { FREE_DH(mat->sendbufHi); CHECK_V_ERROR; } if (mat->sendindLo != NULL) { FREE_DH(mat->sendindLo); CHECK_V_ERROR; } if (mat->sendindHi != NULL) { FREE_DH(mat->sendindHi); CHECK_V_ERROR; } if (mat->numbSolve != NULL) { Numbering_dhDestroy(mat->numbSolve); CHECK_V_ERROR; } /* cleanup MPI requests */ for(i=0; irecv_reqLo[i] != hypre_MPI_REQUEST_NULL) hypre_MPI_Request_free(&(mat->recv_reqLo[i])); if(mat->recv_reqHi[i] != hypre_MPI_REQUEST_NULL) hypre_MPI_Request_free(&(mat->recv_reqHi[i])); if(mat->send_reqLo[i] != hypre_MPI_REQUEST_NULL) hypre_MPI_Request_free(&(mat->send_reqLo[i])); if(mat->send_reqHi[i] != hypre_MPI_REQUEST_NULL) hypre_MPI_Request_free(&(mat->send_reqHi[i])); if(mat->requests[i] != hypre_MPI_REQUEST_NULL) hypre_MPI_Request_free(&(mat->requests[i])); } FREE_DH(mat); CHECK_V_ERROR; END_FUNC_DH } #undef __FUNC__ #define __FUNC__ "create_fake_mat_private" static void create_fake_mat_private(Factor_dh mat, Mat_dh *matFakeIN) { START_FUNC_DH Mat_dh matFake; Mat_dhCreate(matFakeIN); CHECK_V_ERROR; matFake = *matFakeIN; matFake->m = mat->m; matFake->n = mat->n; matFake->rp = mat->rp; matFake->cval = mat->cval; matFake->aval = mat->aval; matFake->beg_row = mat->beg_row; END_FUNC_DH } #undef __FUNC__ #define __FUNC__ "destroy_fake_mat_private" static void destroy_fake_mat_private(Mat_dh matFake) { START_FUNC_DH matFake->rp = NULL; matFake->cval = NULL; matFake->aval = NULL; Mat_dhDestroy(matFake); CHECK_V_ERROR; END_FUNC_DH } #undef __FUNC__ #define __FUNC__ "Factor_dhReadNz" HYPRE_Int Factor_dhReadNz(Factor_dh mat) { START_FUNC_DH HYPRE_Int ierr, retval = mat->rp[mat->m]; HYPRE_Int nz = retval; ierr = hypre_MPI_Allreduce(&nz, &retval, 1, HYPRE_MPI_INT, hypre_MPI_SUM, comm_dh); CHECK_MPI_ERROR(ierr); END_FUNC_VAL(retval) } #undef __FUNC__ #define __FUNC__ "Factor_dhPrintRows" void Factor_dhPrintRows(Factor_dh mat, FILE *fp) { START_FUNC_DH HYPRE_Int beg_row = mat->beg_row; HYPRE_Int m = mat->m, i, j; bool noValues; noValues = (Parser_dhHasSwitch(parser_dh, "-noValues")); if (mat->aval == NULL) noValues = true; if (mat->blockJacobi) { adjust_bj_private(mat); CHECK_V_ERROR; } hypre_fprintf(fp, "\n----------------------- Factor_dhPrintRows ------------------\n"); if (mat->blockJacobi) { hypre_fprintf(fp, "@@@ Block Jacobi ILU; adjusted values from zero-based @@@\n"); } for (i=0; irp[i]; jrp[i+1]; ++j) { if (noValues) { hypre_fprintf(fp, "%i ", 1+mat->cval[j]); } else { hypre_fprintf(fp, "%i,%g ; ", 1+mat->cval[j], mat->aval[j]); } } hypre_fprintf(fp, "\n"); } if (mat->blockJacobi) { unadjust_bj_private(mat); CHECK_V_ERROR; } END_FUNC_DH } #undef __FUNC__ #define __FUNC__ "Factor_dhPrintDiags" void Factor_dhPrintDiags(Factor_dh mat, FILE *fp) { START_FUNC_DH HYPRE_Int beg_row = mat->beg_row; HYPRE_Int m = mat->m, i, pe, *diag = mat->diag; REAL_DH *aval = mat->aval; fprintf_dh(fp, "\n----------------------- Factor_dhPrintDiags ------------------\n"); fprintf_dh(fp, "(grep for 'ZERO')\n"); for (pe=0; peid == pe) { hypre_fprintf(fp, "----- subdomain: %i processor: %i\n", pe, myid_dh); for (i=0; im, *work, *rp = mat->rp, *cval = mat->cval; if (np_dh > 1) SET_V_ERROR("only implemented for single mpi task"); work = (HYPRE_Int*)MALLOC_DH(m*sizeof(HYPRE_Int)); CHECK_V_ERROR; fp=openFile_dh(filename, "w"); CHECK_V_ERROR; for (i=0; im, *rp = mat->rp; HYPRE_Int beg_row = mat->beg_row; REAL_DH *aval = mat->aval; bool noValues; FILE *fp; if (mat->blockJacobi) { adjust_bj_private(mat); CHECK_V_ERROR; } noValues = (Parser_dhHasSwitch(parser_dh, "-noValues")); if (noValues) aval = NULL; for (pe=0; peid == pe) { if (pe == 0) { fp=openFile_dh(filename, "w"); CHECK_V_ERROR; } else { fp=openFile_dh(filename, "a"); CHECK_V_ERROR; } for (i=0; icval[j]); } else { hypre_fprintf(fp, TRIPLES_FORMAT, 1+i+beg_row, 1+mat->cval[j], aval[j]); } } } closeFile_dh(fp); CHECK_V_ERROR; } } if (mat->blockJacobi) { unadjust_bj_private(mat); CHECK_V_ERROR; } END_FUNC_DH } /*-------------------------------------------------------------------------------- * Functions to setup the matrix for triangular solves. These are similar to * MatVecSetup(), except that there are two cases: subdomains ordered lower than * ourselves, and subdomains ordered higher than ourselves. This SolveSetup * is used for Parallel ILU (PILU). The following are adopted/modified from * Edmond Chow's ParaSails *--------------------------------------------------------------------------------*/ /* adopted from Edmond Chow's ParaSails */ /* 1. start receives of node data to be received from other processors; 2. send to other processors the list of nodes this processor needs to receive from them. Returns: the number of processors from whom nodes will be received. */ #undef __FUNC__ #define __FUNC__ "setup_receives_private" static HYPRE_Int setup_receives_private(Factor_dh mat, HYPRE_Int *beg_rows, HYPRE_Int *end_rows, HYPRE_Real *recvBuf, hypre_MPI_Request *req, HYPRE_Int *reqind, HYPRE_Int reqlen, HYPRE_Int *outlist, bool debug) { HYPRE_UNUSED_VAR(mat); START_FUNC_DH HYPRE_Int i, j, this_pe, num_recv = 0; hypre_MPI_Request request; if (debug) { hypre_fprintf(logFile, "\nFACT ========================================================\n"); hypre_fprintf(logFile, "FACT STARTING: setup_receives_private\n"); } for (i=0; i= end_rows[this_pe]) { break; } } if (debug) { HYPRE_Int k; hypre_fprintf(logFile, "FACT need nodes from P_%i: ", this_pe); for (k=i; kbeg_row; hypre_MPI_Request *requests = mat->requests, *sendReq; hypre_MPI_Status *statuses = mat->status; bool isHigher; HYPRE_Int *rcvBuf; HYPRE_Real *sendBuf; HYPRE_Int myidNEW = o2n_subdomain[myid_dh]; HYPRE_Int count; if (debug) { hypre_fprintf(logFile, "FACT \nSTARTING: setup_sends_private\n"); } /* Determine size of and allocate sendbuf and sendind */ sendlenLo = sendlenHi = 0; for (i=0; isendlenLo = sendlenLo; mat->sendlenHi = sendlenHi; mat->sendbufLo = (HYPRE_Real *)MALLOC_DH(sendlenLo * sizeof(HYPRE_Real)); CHECK_V_ERROR; mat->sendbufHi = (HYPRE_Real *)MALLOC_DH(sendlenHi * sizeof(HYPRE_Real)); CHECK_V_ERROR; mat->sendindLo = (HYPRE_Int *)MALLOC_DH(sendlenLo * sizeof(HYPRE_Int)); CHECK_V_ERROR; mat->sendindHi = (HYPRE_Int *)MALLOC_DH(sendlenHi * sizeof(HYPRE_Int)); CHECK_V_ERROR; count = 0; /* number of calls to hypre_MPI_Irecv() */ jLo = jHi = 0; mat->num_sendLo = 0; mat->num_sendHi = 0; for (i=0; isendindHi[jHi]; sendBuf = &mat->sendbufHi[jHi]; sendReq = &mat->send_reqHi[mat->num_sendHi]; mat->num_sendHi++; jHi += inlist[i]; } else { rcvBuf = &mat->sendindLo[jLo]; sendBuf = &mat->sendbufLo[jLo]; sendReq = &mat->send_reqLo[mat->num_sendLo]; mat->num_sendLo++; jLo += inlist[i]; } /* matching receive, for list of unknowns that will be sent, during the triangular solves, from ourselves to P_i */ hypre_MPI_Irecv(rcvBuf, inlist[i], HYPRE_MPI_INT, i, 444, comm_dh, requests+count); ++count; /* Set up the send */ hypre_MPI_Send_init(sendBuf, inlist[i], hypre_MPI_REAL, i, 555, comm_dh, sendReq); } } /* note: count = mat->num_sendLo = mat->num_sendHi */ hypre_MPI_Waitall(count, requests, statuses); if (debug) { HYPRE_Int j; jLo = jHi = 0; hypre_fprintf(logFile, "\nFACT columns that I must send to other subdomains:\n"); for (i=0; isendindHi[jHi]; jHi += inlist[i]; } else { rcvBuf = &mat->sendindLo[jLo]; jLo += inlist[i]; } hypre_fprintf(logFile, "FACT send to P_%i: ", i); for (j=0; jsendlenLo; i++) mat->sendindLo[i] -= first; for (i=0; isendlenHi; i++) mat->sendindHi[i] -= first; END_FUNC_DH } #undef __FUNC__ #define __FUNC__ "Factor_dhSolveSetup" void Factor_dhSolveSetup(Factor_dh mat, SubdomainGraph_dh sg) { START_FUNC_DH HYPRE_Int *outlist, *inlist; HYPRE_Int i, row, *rp = mat->rp, *cval = mat->cval; Numbering_dh numb; HYPRE_Int m = mat->m; /* HYPRE_Int firstLocalRow = mat->beg_row; */ HYPRE_Int *beg_rows = sg->beg_rowP, *row_count = sg->row_count, *end_rows; Mat_dh matFake; bool debug = false; HYPRE_Real *recvBuf; if (mat->debug && logFile != NULL) debug = true; end_rows = (HYPRE_Int *)MALLOC_DH(np_dh*sizeof(HYPRE_Int)); CHECK_V_ERROR; outlist = (HYPRE_Int *)MALLOC_DH(np_dh*sizeof(HYPRE_Int)); CHECK_V_ERROR; inlist = (HYPRE_Int *)MALLOC_DH(np_dh*sizeof(HYPRE_Int)); CHECK_V_ERROR; for (i=0; inumbSolve)); CHECK_V_ERROR; numb = mat->numbSolve; Numbering_dhSetup(numb, matFake); CHECK_V_ERROR; destroy_fake_mat_private(matFake); CHECK_V_ERROR; if (debug) { hypre_fprintf(stderr, "Numbering_dhSetup completed\n"); } /* Allocate recvbuf; recvbuf has numlocal entries saved for local part of x */ i = m+numb->num_ext; mat->work_y_lo = (HYPRE_Real*)MALLOC_DH(i*sizeof(HYPRE_Real)); CHECK_V_ERROR; mat->work_x_hi = (HYPRE_Real*)MALLOC_DH(i*sizeof(HYPRE_Real)); CHECK_V_ERROR; if (debug) { hypre_fprintf(logFile, "FACT num_extLo= %i num_extHi= %i\n", numb->num_extLo, numb->num_extHi); } mat->num_recvLo = 0; mat->num_recvHi = 0; if (numb->num_extLo) { recvBuf = mat->work_y_lo + m; mat->num_recvLo = setup_receives_private(mat, beg_rows, end_rows, recvBuf, mat->recv_reqLo, numb->idx_extLo, numb->num_extLo, outlist, debug); CHECK_V_ERROR; } if (numb->num_extHi) { recvBuf = mat->work_x_hi + m + numb->num_extLo; mat->num_recvHi = setup_receives_private(mat, beg_rows, end_rows, recvBuf, mat->recv_reqHi, numb->idx_extHi, numb->num_extHi, outlist, debug); CHECK_V_ERROR; } hypre_MPI_Alltoall(outlist, 1, HYPRE_MPI_INT, inlist, 1, HYPRE_MPI_INT, comm_dh); /* At this point, inlist[j] contains the number of indices that this processor must send to P_j. Processors next need to exchange the actual lists of required indices; this is done in setup_sends_private() */ setup_sends_private(mat, inlist, sg->o2n_sub, debug); CHECK_V_ERROR; /* Convert column indices in each row to local indices */ for (row=0; rowm; ++ii) { hypre_fprintf(logFile, "local row %i :: ", ii+1); for (jj=mat->rp[ii]; jjrp[ii+1]; ++jj) { hypre_fprintf(logFile, "%i ", 1+mat->cval[jj]); } hypre_fprintf(logFile, "\n"); } hypre_fprintf(logFile, "\n"); fflush(logFile); } END_FUNC_DH } /* solve for MPI implementation of PILU. This function is so similar to MatVec, that I put it here, instead of with the other solves located in Euclid_apply.c. */ static void forward_solve_private(HYPRE_Int m, HYPRE_Int from, HYPRE_Int to, HYPRE_Int *rp, HYPRE_Int *cval, HYPRE_Int *diag, HYPRE_Real *aval, HYPRE_Real *rhs, HYPRE_Real *work_y, bool debug); static void backward_solve_private(HYPRE_Int m, HYPRE_Int from, HYPRE_Int to, HYPRE_Int *rp, HYPRE_Int *cval, HYPRE_Int *diag, HYPRE_Real *aval, HYPRE_Real *work_y, HYPRE_Real *work_x, bool debug); static HYPRE_Int beg_rowG; #undef __FUNC__ #define __FUNC__ "Factor_dhSolve" void Factor_dhSolve(HYPRE_Real *rhs, HYPRE_Real *lhs, Euclid_dh ctx) { START_FUNC_DH Factor_dh mat = ctx->F; HYPRE_Int from, to; HYPRE_Int ierr, i, m = mat->m, first_bdry = mat->first_bdry; HYPRE_Int offsetLo = mat->numbSolve->num_extLo; HYPRE_Int offsetHi = mat->numbSolve->num_extHi; HYPRE_Int *rp = mat->rp, *cval = mat->cval, *diag = mat->diag; HYPRE_Real *aval = mat->aval; HYPRE_Int *sendindLo = mat->sendindLo, *sendindHi = mat->sendindHi; HYPRE_Int sendlenLo = mat->sendlenLo, sendlenHi = mat->sendlenHi; HYPRE_Real *sendbufLo = mat->sendbufLo, *sendbufHi = mat->sendbufHi; HYPRE_Real *work_y = mat->work_y_lo; HYPRE_Real *work_x = mat->work_x_hi; bool debug = false; if (mat->debug && logFile != NULL) debug = true; if (debug) beg_rowG = ctx->F->beg_row; /* for (i=0; inum_recvLo, mat->num_recvHi); } /* start receives from higher and lower ordered subdomains */ if (mat->num_recvLo) { hypre_MPI_Startall(mat->num_recvLo, mat->recv_reqLo); } if (mat->num_recvHi) { hypre_MPI_Startall(mat->num_recvHi, mat->recv_reqHi); } /*------------------------------------------------------------- * PART 1: Forward Solve Ly = rhs for y ('y' is called 'work') *-------------------------------------------------------------*/ /* forward triangular solve on interior nodes */ from = 0; to = first_bdry; if (from != to) { forward_solve_private(m, from, to, rp, cval, diag, aval, rhs, work_y, debug); CHECK_V_ERROR; } /* wait for receives from lower ordered subdomains, then complete forward solve on boundary nodes. */ if (mat->num_recvLo) { hypre_MPI_Waitall(mat->num_recvLo, mat->recv_reqLo, mat->status); /* debug block */ if (debug) { hypre_fprintf(logFile, "FACT got 'y' values from lower neighbors; work buffer:\n "); for (i=0; inum_sendHi) { /* copy elements to send buffer */ for (i=0; inum_sendHi, mat->send_reqHi); /* debug block */ if (debug) { hypre_fprintf(logFile, "\nFACT sending 'y' values to higher neighbor:\nFACT "); for (i=0; inum_recvHi) { ierr = hypre_MPI_Waitall(mat->num_recvHi, mat->recv_reqHi, mat->status); CHECK_MPI_V_ERROR(ierr); /* debug block */ if (debug) { hypre_fprintf(logFile, "FACT got 'x' values from higher neighbors:\n "); for (i=m+offsetLo; inum_sendLo) { /* copy elements to send buffer */ for (i=0; inum_sendLo, mat->send_reqLo); CHECK_MPI_V_ERROR(ierr); /* debug block */ if (debug) { hypre_fprintf(logFile, "\nFACT sending 'x' values to lower neighbor:\nFACT "); for (i=0; inum_sendLo) { ierr = hypre_MPI_Waitall(mat->num_sendLo, mat->send_reqLo, mat->status); CHECK_MPI_V_ERROR(ierr); } if (mat->num_sendHi) { ierr = hypre_MPI_Waitall(mat->num_sendHi, mat->send_reqHi, mat->status); CHECK_MPI_V_ERROR(ierr); } END_FUNC_DH } #undef __FUNC__ #define __FUNC__ "forward_solve_private" void forward_solve_private(HYPRE_Int m, HYPRE_Int from, HYPRE_Int to, HYPRE_Int *rp, HYPRE_Int *cval, HYPRE_Int *diag, HYPRE_Real *aval, HYPRE_Real *rhs, HYPRE_Real *work_y, bool debug) { START_FUNC_DH HYPRE_Int i, j, idx; if (debug) { hypre_fprintf(logFile, "\nFACT starting forward_solve_private; from= %i; to= %i, m= %i\n", 1+from, 1+to, m); } /* if (from == 0) { work_y[0] = rhs[0]; if (debug) { hypre_fprintf(logFile, "FACT work_y[%i] = %g\n------------\n", 1+beg_rowG, work_y[0]); } } else { --from; } */ if (debug) { for (i=from; i=to; --i) { HYPRE_Int len = rp[i+1] - diag[i] - 1; HYPRE_Int *col = cval + diag[i] + 1; HYPRE_Real *val = aval + diag[i] + 1; HYPRE_Real sum = work_y[i]; hypre_fprintf(logFile, "FACT solving for work_x[%i]\n", i+1+beg_rowG); for (j=0; j=to; --i) { HYPRE_Int len = rp[i+1] - diag[i] - 1; HYPRE_Int *col = cval + diag[i] + 1; HYPRE_Real *val = aval + diag[i] + 1; HYPRE_Real sum = work_y[i]; for (j=0; jm = m; F->n = n; F->beg_row = beg_rowP; F->id = id; F->alloc = alloc; F->rp = (HYPRE_Int*)MALLOC_DH((m+1)*sizeof(HYPRE_Int)); CHECK_V_ERROR; F->rp[0] = 0; F->cval = (HYPRE_Int*)MALLOC_DH(alloc*sizeof(HYPRE_Int)); CHECK_V_ERROR; F->diag = (HYPRE_Int*)MALLOC_DH(m*sizeof(HYPRE_Int)); CHECK_V_ERROR; if (fillFlag) { F->fill = (HYPRE_Int*)MALLOC_DH(alloc*sizeof(HYPRE_Int)); CHECK_V_ERROR; } if (avalFlag) { F->aval = (REAL_DH*)MALLOC_DH(alloc*sizeof(REAL_DH)); CHECK_V_ERROR; } END_FUNC_DH } #undef __FUNC__ #define __FUNC__ "Factor_dhReallocate" void Factor_dhReallocate(Factor_dh F, HYPRE_Int used, HYPRE_Int additional) { START_FUNC_DH HYPRE_Int alloc = F->alloc; if (used+additional > F->alloc) { HYPRE_Int *tmpI; while (alloc < used+additional) alloc *= 2; F->alloc = alloc; tmpI = F->cval; F->cval = (HYPRE_Int*)MALLOC_DH(alloc*sizeof(HYPRE_Int)); CHECK_V_ERROR; hypre_TMemcpy(F->cval, tmpI, HYPRE_Int, used, HYPRE_MEMORY_HOST, HYPRE_MEMORY_HOST); FREE_DH(tmpI); CHECK_V_ERROR; if (F->fill != NULL) { tmpI = F->fill; F->fill = (HYPRE_Int*)MALLOC_DH(alloc*sizeof(HYPRE_Int)); CHECK_V_ERROR; hypre_TMemcpy(F->fill, tmpI, HYPRE_Int, used, HYPRE_MEMORY_HOST, HYPRE_MEMORY_HOST); FREE_DH(tmpI); CHECK_V_ERROR; } if (F->aval != NULL) { REAL_DH *tmpF = F->aval; F->aval = (REAL_DH*)MALLOC_DH(alloc*sizeof(REAL_DH)); CHECK_V_ERROR; hypre_TMemcpy(F->aval, tmpF, REAL_DH, used, HYPRE_MEMORY_HOST, HYPRE_MEMORY_HOST); FREE_DH(tmpF); CHECK_V_ERROR; } } END_FUNC_DH } #undef __FUNC__ #define __FUNC__ "Factor_dhTranspose" void Factor_dhTranspose(Factor_dh A, Factor_dh *Bout) { START_FUNC_DH Factor_dh B; if (np_dh > 1) { SET_V_ERROR("only for sequential"); } Factor_dhCreate(&B); CHECK_V_ERROR; *Bout = B; B->m = B->n = A->m; if (B->aval == NULL) { mat_dh_transpose_private(A->m, A->rp, &B->rp, A->cval, &B->cval, A->aval, NULL); CHECK_V_ERROR; } else { mat_dh_transpose_private(A->m, A->rp, &B->rp, A->cval, &B->cval, A->aval, &B->aval); CHECK_V_ERROR; } END_FUNC_DH } /* this could be done using OpenMP, but I took it out for now */ #undef __FUNC__ #define __FUNC__ "Factor_dhSolveSeq" void Factor_dhSolveSeq(HYPRE_Real *rhs, HYPRE_Real *lhs, Euclid_dh ctx) { START_FUNC_DH Factor_dh F = ctx->F; HYPRE_Int *rp, *cval, *diag; HYPRE_Int i, j, *vi, nz, m = F->m; REAL_DH *aval, *work; /* REAL_DH *scale; */ REAL_DH *v, sum; bool debug = false; if (ctx->F->debug && logFile != NULL) debug = true; rp = F->rp; cval = F->cval; aval = F->aval; diag = F->diag; /* scale = ctx->scale; */ work = ctx->work; if (debug) { hypre_fprintf(logFile, "\nFACT ============================================================\n"); hypre_fprintf(logFile, "FACT starting Factor_dhSolveSeq\n"); /* forward solve lower triangle */ hypre_fprintf(logFile, "\nFACT STARTING FORWARD SOLVE\n------------\n"); work[0] = rhs[0]; hypre_fprintf(logFile, "FACT work[0] = %g\n------------\n", work[0]); for ( i=1; i=0; i-- ){ v = aval + diag[i] + 1; vi = cval + diag[i] + 1; nz = rp[i+1] - diag[i] - 1; hypre_fprintf(logFile, "FACT solving for lhs[%i]\n", i+1); sum = work[i]; for (j=0; j=0; i-- ){ v = aval + diag[i] + 1; vi = cval + diag[i] + 1; nz = rp[i+1] - diag[i] - 1; sum = work[i]; while (nz--) sum -= (*v++ * work[*vi++]); lhs[i] = work[i] = sum*aval[diag[i]]; } } END_FUNC_DH } /*--------------------------------------------------------------- * next two are used by Factor_dhPrintXXX methods *---------------------------------------------------------------*/ #undef __FUNC__ #define __FUNC__ "adjust_bj_private" void adjust_bj_private(Factor_dh mat) { START_FUNC_DH HYPRE_Int i; HYPRE_Int nz = mat->rp[mat->m]; HYPRE_Int beg_row = mat->beg_row; for (i=0; icval[i] += beg_row; END_FUNC_DH } #undef __FUNC__ #define __FUNC__ "unadjust_bj_private" void unadjust_bj_private(Factor_dh mat) { START_FUNC_DH HYPRE_Int i; HYPRE_Int nz = mat->rp[mat->m]; HYPRE_Int beg_row = mat->beg_row; for (i=0; icval[i] -= beg_row; END_FUNC_DH } #undef __FUNC__ #define __FUNC__ "Factor_dhMaxPivotInverse" HYPRE_Real Factor_dhMaxPivotInverse(Factor_dh mat) { START_FUNC_DH HYPRE_Int i, m = mat->m, *diags = mat->diag; REAL_DH *aval = mat->aval; HYPRE_Real minGlobal = 0.0, min = aval[diags[0]]; HYPRE_Real retval; for (i=0; irp[mat->m]; REAL_DH *aval = mat->aval; for (i=0; im; Vec_dh lhs, rhs; Vec_dhCreate(&lhs); CHECK_ERROR(-1); Vec_dhInit(lhs, m); CHECK_ERROR(-1); Vec_dhDuplicate(lhs,&rhs); CHECK_ERROR(-1); Vec_dhSet(rhs, 1.0); CHECK_ERROR(-1); Euclid_dhApply(ctx, rhs->vals, lhs->vals); CHECK_ERROR(-1); x = lhs->vals; for (i=0; isize = 0; tmp->count = 0; tmp->curMark = CUR_MARK_INIT + 1; tmp->data = NULL; Hash_dhInit_private(*h,size); CHECK_V_ERROR; END_FUNC_DH } #undef __FUNC__ #define __FUNC__ "Hash_dhDestroy" void Hash_dhDestroy(Hash_dh h) { START_FUNC_DH if (h->data != NULL) { FREE_DH(h->data); CHECK_V_ERROR; } FREE_DH(h); CHECK_V_ERROR; END_FUNC_DH } #undef __FUNC__ #define __FUNC__ "Hash_dhReset" void Hash_dhReset(Hash_dh h) { START_FUNC_DH h->count = 0; h->curMark += 1; END_FUNC_DH } #undef __FUNC__ #define __FUNC__ "Hash_dhInit_private" void Hash_dhInit_private(Hash_dh h, HYPRE_Int s) { START_FUNC_DH HYPRE_Int i; HYPRE_Int size = 16; HashRecord *data; /* want table size to be a power of 2: */ while (size < s) size *= 2; /* rule-of-thumb: ensure there's some padding */ if ( (size-s) < (.1 * size) ) { size *= 2; } h->size = size; /* hypre_sprintf(msgBuf_dh, "requested size = %i; allocated size = %i", s, size); SET_INFO(msgBuf_dh); */ /* allocate and zero the hash table */ data = h->data = (HashRecord*)MALLOC_DH(size*sizeof(HashRecord)); CHECK_V_ERROR; for (i=0; icurMark; HYPRE_Int size = h->size; HashData *retval = NULL; HashRecord *data = h->data; HASH_1(key, size, &start) for (i=0; isize; HYPRE_Int curMark = h->curMark; HashRecord *data; data = h->data; /* check for overflow */ h->count += 1; if (h->count == h->size) { SET_V_ERROR("hash table overflow; rehash need implementing!"); } HASH_1(key, size, &start) for (i=0; isize; HYPRE_Int curMark = h->curMark; HashRecord *data = h->data; hypre_fprintf(fp, "\n--------------------------- hash table \n"); for (i=0; i pairs! */ typedef struct _hash_node { HYPRE_Int iData; /* integer */ HYPRE_Real fData; /* float */ HYPRE_Int *iDataPtr; /* pointer to integer */ HYPRE_Int *iDataPtr2; /* pointer to integer */ HYPRE_Real *fDataPtr; /* pointer to float */ } HashData; typedef struct _hash_node_private HashRecord; /* data structure for the hash table; do not directly access */ struct _hash_dh { HYPRE_Int size; /* total slots in table */ HYPRE_Int count; /* number of insertions in table */ HYPRE_Int curMark; HashRecord *data; }; extern void Hash_dhCreate(Hash_dh *h, HYPRE_Int size); extern void Hash_dhDestroy(Hash_dh h); extern void Hash_dhInsert(Hash_dh h, HYPRE_Int key, HashData *data); extern HashData *Hash_dhLookup(Hash_dh h, HYPRE_Int key); /* returns NULL if record isn't found. */ extern void Hash_dhReset(Hash_dh h); extern void Hash_dhPrint(Hash_dh h, FILE *fp); #define HASH_1(k,size,idxOut) \ { *idxOut = k % size; } #define HASH_2(k,size,idxOut) \ { \ HYPRE_Int r = k % (size-13); \ r = (r % 2) ? r : r+1; \ *idxOut = r; \ } #endif hypre-2.33.0/src/distributed_ls/Euclid/Hash_i_dh.c000066400000000000000000000147751477326011500220000ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "_hypre_Euclid.h" /* #include "Hash_i_dh.h" */ /* #include "Parser_dh.h" */ /* #include "Mem_dh.h" */ #define DEFAULT_TABLE_SIZE 16 static void rehash_private(Hash_i_dh h); /*-------------------------------------------------------------- * hash functions (HYPRE_Real hashing is used) *--------------------------------------------------------------*/ #define HASH_1(k,size,idxOut) \ { *idxOut = k % size; } #define HASH_2(k,size,idxOut) \ { \ HYPRE_Int r = k % (size-13); \ r = (r % 2) ? r : r+1; \ *idxOut = r; \ } /*-------------------------------------------------------------- * class structure *--------------------------------------------------------------*/ typedef struct _hash_i_node_private Hash_i_Record; struct _hash_i_node_private { HYPRE_Int key; HYPRE_Int mark; HYPRE_Int data; }; struct _hash_i_dh { HYPRE_Int size; /* total slots in table */ HYPRE_Int count; /* number of items inserted in table */ HYPRE_Int curMark;/* used by Reset */ Hash_i_Record *data; }; /*-------------------------------------------------------------- * class methods follow *--------------------------------------------------------------*/ #undef __FUNC__ #define __FUNC__ "Hash_i_dhCreate" void Hash_i_dhCreate(Hash_i_dh *h, HYPRE_Int sizeIN) { START_FUNC_DH HYPRE_Int i, size; Hash_i_Record *tmp2; struct _hash_i_dh* tmp; size = DEFAULT_TABLE_SIZE; if (sizeIN == -1) { sizeIN = size = DEFAULT_TABLE_SIZE; } tmp = (struct _hash_i_dh*)MALLOC_DH( sizeof(struct _hash_i_dh)); CHECK_V_ERROR; *h = tmp; tmp->size = 0; tmp->count = 0; tmp->curMark = 0; tmp->data = NULL; /* determine initial hash table size. If this is too small, it will be dynamically enlarged as needed by Hash_i_dhInsert() See "HYPRE_Real hashing," p. 255, "Algorithms," Cormen, et. al. */ while (size < sizeIN) size *= 2; /* want table size to be a power of 2: */ /* rule-of-thumb: ensure there's at least 10% padding */ if ( (size-sizeIN) < (.1 * size) ) { size *= 2; } tmp->size = size; /* allocate and zero the hash table */ tmp2 = tmp->data = (Hash_i_Record*)MALLOC_DH(size*sizeof(Hash_i_Record)); CHECK_V_ERROR; for (i=0; idata != NULL) { FREE_DH(h->data); CHECK_V_ERROR; } FREE_DH(h); CHECK_V_ERROR; END_FUNC_DH } #undef __FUNC__ #define __FUNC__ "Hash_i_dhReset" void Hash_i_dhReset(Hash_i_dh h) { START_FUNC_DH h->count = 0; h->curMark += 1; END_FUNC_DH } #undef __FUNC__ #define __FUNC__ "Hash_i_dhLookup" HYPRE_Int Hash_i_dhLookup(Hash_i_dh h, HYPRE_Int key) { START_FUNC_DH HYPRE_Int idx, inc, i, start; HYPRE_Int curMark = h->curMark; HYPRE_Int size = h->size; HYPRE_Int retval = -1; Hash_i_Record *data = h->data; HASH_1(key, size, &start) HASH_2(key, size, &inc) /*hypre_printf("Hash_i_dhLookup:: key: %i tableSize: %i start: %i inc: %i\n", key, size, start, inc); */ for (i=0; icurMark; Hash_i_Record *data; bool success = false; if (dataIN < 0) { hypre_sprintf(msgBuf_dh, "data = %i must be >= 0", dataIN); SET_V_ERROR(msgBuf_dh); } /* enlarge table if necessary */ if (h->count >= 0.9 * h->size) { rehash_private(h); CHECK_V_ERROR; } size = h->size; data = h->data; h->count += 1; /* for this insertion */ HASH_1(key, size, &start) HASH_2(key, size, &inc) /*hypre_printf("Hash_i_dhInsert:: tableSize= %i start= %i inc= %i\n", size, start, inc); */ for (i=0; i already inserted", key, dataIN); SET_V_ERROR(msgBuf_dh); } if (data[idx].mark < curMark) { data[idx].key = key; data[idx].mark = curMark; data[idx].data = dataIN; success = true; break; } } if (! success) { /* should be impossible to be here, I think . . . */ hypre_sprintf(msgBuf_dh, "Failed to insert key= %i, data= %i", key, dataIN); } END_FUNC_DH } #undef __FUNC__ #define __FUNC__ "rehash_private" void rehash_private(Hash_i_dh h) { START_FUNC_DH HYPRE_Int i, old_size = h->size, new_size = old_size*2, oldCurMark = h->curMark; Hash_i_Record *oldData = h->data, *newData; hypre_sprintf(msgBuf_dh, "rehashing; old_size= %i, new_size= %i", old_size, new_size); SET_INFO(msgBuf_dh); /* allocate new data table, and install it in the Hash_i_dh object; essentially, we reinitialize the hash object. */ newData = (Hash_i_Record*)MALLOC_DH(new_size*sizeof(Hash_i_Record)); CHECK_V_ERROR; for (i=0; isize = new_size; h->data = newData; h->count = 0; h->curMark = 0; for (i=h->count; i pairs from old table to new table; wouldn't have been called) it's simplest to sweep through the old table. */ for (i=0; i is already inserted; grows hash table if out of space. */ extern HYPRE_Int Hash_i_dhLookup(Hash_i_dh h, HYPRE_Int key); /* returns "data" associated with "key," or -1 if "key" is not found. */ #endif hypre-2.33.0/src/distributed_ls/Euclid/Makefile000066400000000000000000000043241477326011500214130ustar00rootroot00000000000000# Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) include ../../config/Makefile.config CINCLUDES = ${INCLUDES} ${MPIINCLUDE} C_COMPILE_FLAGS = \ -I../..\ -I$(srcdir)\ -I$(srcdir)/../..\ -I$(srcdir)/../../utilities\ -I$(srcdir)/../../parcsr_mv\ -I$(srcdir)/../../seq_mv\ -I$(srcdir)/../../distributed_matrix\ -I$(srcdir)/../../hypre/include\ ${CINCLUDES} HEADERS =\ blas_dh.h\ euclid_common.h\ euclid_config.h\ Euclid_dh.h\ ExternalRows_dh.h\ Factor_dh.h\ getRow_dh.h\ guards_dh.h\ Hash_dh.h\ Hash_i_dh.h\ ilu_dh.h\ io_dh.h\ krylov_dh.h\ macros_dh.h\ Mat_dh.h\ mat_dh_private.h\ MatGenFD.h\ Mem_dh.h\ Numbering_dh.h\ Parser_dh.h\ shellSort_dh.h\ sig_dh.h\ SortedList_dh.h\ SortedSet_dh.h\ SubdomainGraph_dh.h\ TimeLog_dh.h\ Timer_dh.h\ Vec_dh.h FILES =\ blas_dh.c\ Euclid_apply.c\ Euclid_dh.c\ ExternalRows_dh.c\ Factor_dh.c\ getRow_dh.c\ globalObjects.c\ Hash_dh.c\ Hash_i_dh.c\ ilu_mpi_bj.c\ ilu_mpi_pilu.c\ ilu_seq.c\ io_dh.c\ krylov_dh.c\ Mat_dh.c\ mat_dh_private.c\ MatGenFD.c\ Mem_dh.c\ Numbering_dh.c\ Parser_dh.c\ shellSort_dh.c\ sig_dh.c\ SortedList_dh.c\ SortedSet_dh.c\ SubdomainGraph_dh.c\ TimeLog_dh.c\ Timer_dh.c\ Vec_dh.c OBJS = ${FILES:.c=.o} SONAME = libHYPRE_Euclid-${HYPRE_RELEASE_VERSION}${HYPRE_LIB_SUFFIX} ################################################################## # Targets ################################################################## all: libHYPRE_Euclid${HYPRE_LIB_SUFFIX} # cp -fR libHYPRE* $(HYPRE_BUILD_DIR)/lib install: libHYPRE_Euclid${HYPRE_LIB_SUFFIX} # cp -fR libHYPRE* $(HYPRE_LIB_INSTALL) clean: rm -f *.o libHYPRE* rm -rf pchdir tca.map *inslog* distclean: clean ################################################################## # Rules ################################################################## libHYPRE_Euclid.a: ${OBJS} @echo "Building $@ ... " ${AR} $@ ${OBJS} ${RANLIB} $@ libHYPRE_Euclid.so libHYPRE_Euclid.dylib: ${OBJS} @echo "Building $@ ... " ${BUILD_CC_SHARED} -o ${SONAME} ${OBJS} ${SHARED_SET_SONAME}${SONAME} ln -s -f ${SONAME} $@ ${OBJS}: ${HEADERS} hypre-2.33.0/src/distributed_ls/Euclid/MatGenFD.c000066400000000000000000000614021477326011500215040ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "_hypre_Euclid.h" /* #include "MatGenFD.h" */ /* #include "Mat_dh.h" */ /* #include "Vec_dh.h" */ /* #include "Parser_dh.h" */ /* #include "Mem_dh.h" */ /* #include "graphColor_dh.h" */ static bool isThreeD; /* handles for values in the 5-point (2D) or 7-point (for 3D) stencil */ #define FRONT(a) a[5] #define SOUTH(a) a[3] #define WEST(a) a[1] #define CENTER(a) a[0] #define EAST(a) a[2] #define NORTH(a) a[4] #define BACK(a) a[6] #define RHS(a) a[7] static void setBoundary_private(HYPRE_Int node, HYPRE_Int *cval, HYPRE_Real *aval, HYPRE_Int len, HYPRE_Real *rhs, HYPRE_Real bc, HYPRE_Real coeff, HYPRE_Real ctr, HYPRE_Int nabor); static void generateStriped(MatGenFD mg, HYPRE_Int *rp, HYPRE_Int *cval, HYPRE_Real *aval, Mat_dh A, Vec_dh b); static void generateBlocked(MatGenFD mg, HYPRE_Int *rp, HYPRE_Int *cval, HYPRE_Real *aval, Mat_dh A, Vec_dh b); static void getstencil(MatGenFD g, HYPRE_Int ix, HYPRE_Int iy, HYPRE_Int iz); #if 0 static void fdaddbc(HYPRE_Int nx, HYPRE_Int ny, HYPRE_Int nz, HYPRE_Int *rp, HYPRE_Int *cval, HYPRE_Int *diag, HYPRE_Real *aval, HYPRE_Real *rhs, HYPRE_Real h, MatGenFD mg); #endif #undef __FUNC__ #define __FUNC__ "MatGenFDCreate" void MatGenFD_Create(MatGenFD *mg) { START_FUNC_DH struct _matgenfd* tmp =(struct _matgenfd*)MALLOC_DH(sizeof(struct _matgenfd)); CHECK_V_ERROR; *mg = tmp; tmp->debug = Parser_dhHasSwitch(parser_dh, "-debug_matgen"); tmp->m = 9; tmp->px = tmp->py = 1; tmp->pz = 0; Parser_dhReadInt(parser_dh,"-m",&tmp->m); Parser_dhReadInt(parser_dh,"-px",&tmp->px); Parser_dhReadInt(parser_dh,"-py",&tmp->py); Parser_dhReadInt(parser_dh,"-pz",&tmp->pz); if (tmp->px < 1) tmp->px = 1; if (tmp->py < 1) tmp->py = 1; if (tmp->pz < 0) tmp->pz = 0; tmp->threeD = false; if (tmp->pz) { tmp->threeD = true; } else { tmp->pz = 1; } if (Parser_dhHasSwitch(parser_dh,"-threeD")) tmp->threeD = true; tmp->a = tmp->b = tmp->c = 1.0; tmp->d = tmp->e = tmp->f = 0.0; tmp->g = tmp->h = 0.0; Parser_dhReadDouble(parser_dh,"-dx",&tmp->a); Parser_dhReadDouble(parser_dh,"-dy",&tmp->b); Parser_dhReadDouble(parser_dh,"-dz",&tmp->c); Parser_dhReadDouble(parser_dh,"-cx",&tmp->d); Parser_dhReadDouble(parser_dh,"-cy",&tmp->e); Parser_dhReadDouble(parser_dh,"-cz",&tmp->f); tmp->a = -1*hypre_abs(tmp->a); tmp->b = -1*hypre_abs(tmp->b); tmp->c = -1*hypre_abs(tmp->c); tmp->allocateMem = true; tmp->A = tmp->B = tmp->C = tmp->D = tmp->E = tmp->F = tmp->G = tmp->H = konstant; tmp->bcX1 = tmp->bcX2 = tmp->bcY1 = tmp->bcY2 = tmp->bcZ1 = tmp->bcZ2 = 0.0; Parser_dhReadDouble(parser_dh,"-bcx1",&tmp->bcX1); Parser_dhReadDouble(parser_dh,"-bcx2",&tmp->bcX2); Parser_dhReadDouble(parser_dh,"-bcy1",&tmp->bcY1); Parser_dhReadDouble(parser_dh,"-bcy2",&tmp->bcY2); Parser_dhReadDouble(parser_dh,"-bcz1",&tmp->bcZ1); Parser_dhReadDouble(parser_dh,"-bcz2",&tmp->bcZ2); END_FUNC_DH } #undef __FUNC__ #define __FUNC__ "MatGenFD_Destroy" void MatGenFD_Destroy(MatGenFD mg) { START_FUNC_DH FREE_DH(mg); CHECK_V_ERROR; END_FUNC_DH } #undef __FUNC__ #define __FUNC__ "MatGenFD_Run" void MatGenFD_Run(MatGenFD mg, HYPRE_Int id, HYPRE_Int np, Mat_dh *AOut, Vec_dh *rhsOut) { /* What this function does: * 0. creates return objects (A and rhs) * 1. computes "nice to have" values; * 2. allocates storage, if required; * 3. calls generateBlocked() or generateStriped(). * 4. initializes variable in A and rhs. */ START_FUNC_DH Mat_dh A; Vec_dh rhs; bool threeD = mg->threeD; HYPRE_Int nnz; HYPRE_Int m = mg->m; /* local unknowns */ bool debug = false, striped; if (mg->debug && logFile != NULL) debug = true; striped = Parser_dhHasSwitch(parser_dh,"-striped"); /* 0. create objects */ Mat_dhCreate(AOut); CHECK_V_ERROR; Vec_dhCreate(rhsOut); CHECK_V_ERROR; A = *AOut; rhs = *rhsOut; /* ensure that processor grid contains the same number of nodes as there are processors. */ if (! Parser_dhHasSwitch(parser_dh, "-noChecks")) { if (!striped) { HYPRE_Int npTest = mg->px*mg->py; if (threeD) npTest *= mg->pz; if (npTest != np) { hypre_sprintf(msgBuf_dh, "numbers don't match: np_dh = %i, px*py*pz = %i", np, npTest); SET_V_ERROR(msgBuf_dh); } } } /* 1. compute "nice to have" values */ /* each proc's subgrid dimension */ mg->cc = m; if (threeD) { m = mg->m = m*m*m; } else { m = mg->m = m*m; } mg->first = id*m; mg->hh = 1.0/(mg->px*mg->cc - 1); if (debug) { hypre_sprintf(msgBuf_dh, "cc (local grid dimension) = %i", mg->cc); SET_INFO(msgBuf_dh); if (threeD) { hypre_sprintf(msgBuf_dh, "threeD = true"); } else { hypre_sprintf(msgBuf_dh, "threeD = false"); } SET_INFO(msgBuf_dh); hypre_sprintf(msgBuf_dh, "np= %i id= %i", np, id); SET_INFO(msgBuf_dh); } mg->id = id; mg->np = np; nnz = threeD ? m*7 : m*5; /* 2. allocate storage */ if (mg->allocateMem) { A->rp = (HYPRE_Int*)MALLOC_DH((m+1)*sizeof(HYPRE_Int)); CHECK_V_ERROR; A->rp[0] = 0; A->cval = (HYPRE_Int*)MALLOC_DH(nnz*sizeof(HYPRE_Int)); CHECK_V_ERROR A->aval = (HYPRE_Real*)MALLOC_DH(nnz*sizeof(HYPRE_Real)); CHECK_V_ERROR; /* rhs->vals = (HYPRE_Real*)MALLOC_DH(m*sizeof(HYPRE_Real)); CHECK_V_ERROR; */ } /* 4. initialize variables in A and rhs */ rhs->n = m; A->m = m; A->n = m*mg->np; A->beg_row = mg->first; /* 3. generate matrix */ isThreeD = threeD; /* yuck! used in box_XX() */ if (Parser_dhHasSwitch(parser_dh,"-striped")) { generateStriped(mg, A->rp, A->cval, A->aval, A, rhs); CHECK_V_ERROR; } else { generateBlocked(mg, A->rp, A->cval, A->aval, A, rhs); CHECK_V_ERROR; } /* add in bdry conditions */ /* only implemented for 2D mats! */ if (! threeD) { /* fdaddbc(nx, ny, nz, rp, cval, diag, aval, rhs, h, mg); */ } END_FUNC_DH } #undef __FUNC__ #define __FUNC__ "generateStriped" void generateStriped(MatGenFD mg, HYPRE_Int *rp, HYPRE_Int *cval, HYPRE_Real *aval, Mat_dh A, Vec_dh b) { START_FUNC_DH HYPRE_Int mGlobal; HYPRE_Int m = mg->m; HYPRE_Int beg_row, end_row; HYPRE_Int i, j, k, row; bool threeD = mg->threeD; HYPRE_Int idx = 0; HYPRE_Real *stencil = mg->stencil; bool debug = false; HYPRE_Int plane, nodeRemainder; HYPRE_Int naborx1 = 0, naborx2 = 0, nabory1 = 0, nabory2 = 0; HYPRE_Real *rhs; bool applyBdry = true; HYPRE_Real hhalf; HYPRE_Real bcx1 = mg->bcX1; HYPRE_Real bcx2 = mg->bcX2; HYPRE_Real bcy1 = mg->bcY1; HYPRE_Real bcy2 = mg->bcY2; /* HYPRE_Real bcz1 = mg->bcZ1; */ /* HYPRE_Real bcz2 = mg->bcZ2; */ HYPRE_Int nx, ny; printf_dh("@@@ using striped partitioning\n"); if (mg->debug && logFile != NULL) debug = true; /* recompute values (yuck!) */ m = 9; Parser_dhReadInt(parser_dh,"-m", &m); /* global grid dimension */ mGlobal = m*m; /* global unkknowns */ if (threeD) mGlobal *= m; i = mGlobal/mg->np; /* unknowns per processor */ beg_row = i*mg->id; /* global number of 1st local row */ end_row = beg_row + i; if (mg->id == mg->np-1) end_row = mGlobal; nx = ny = m; mg->hh = 1.0/(m-1); hhalf = 0.5 * mg->hh; A->n = m*m; A->m = end_row - beg_row; A->beg_row = beg_row; Vec_dhInit(b, A->m); CHECK_V_ERROR; rhs = b->vals; plane = m*m; if (debug) { hypre_fprintf(logFile, "generateStriped: beg_row= %i; end_row= %i; m= %i\n", beg_row+1, end_row+1, m); } for (row = beg_row; row 0) { cval[idx] = row - plane; aval[idx++] = BACK(stencil); } } /* south */ if (j > 0) { nabory1 = cval[idx] = row - m; aval[idx++] = SOUTH(stencil); } /* west */ if (i > 0) { naborx1 = cval[idx] = row - 1; aval[idx++] = WEST(stencil); } /* center node */ cval[idx] = row; aval[idx++] = CENTER(stencil); /* east */ if (i < m-1) { naborx2 = cval[idx] = row + 1; aval[idx++] = EAST(stencil); } /* north */ if (j < m-1) { nabory2 = cval[idx] = row + m; aval[idx++] = NORTH(stencil); } /* up plane */ if (threeD) { if (k < m-1) { cval[idx] = row + plane; aval[idx++] = FRONT(stencil); } } rhs[localRow] = 0.0; ++localRow; rp[localRow] = idx; /* apply boundary conditions; only for 2D! */ if (!threeD && applyBdry) { HYPRE_Int offset = rp[localRow-1]; HYPRE_Int len = rp[localRow] - rp[localRow-1]; HYPRE_Real ctr, coeff; /* hypre_fprintf(logFile, "globalRow = %i; naborx2 = %i\n", row+1, row); */ if (i == 0) { /* if x1 */ coeff = mg->A(mg->a, i+hhalf,j,k); ctr = mg->A(mg->a, i-hhalf,j,k); setBoundary_private(row, cval+offset, aval+offset, len, &(rhs[localRow-1]), bcx1, coeff, ctr, naborx2); } else if (i == nx-1) { /* if x2 */ coeff = mg->A(mg->a, i-hhalf,j,k); ctr = mg->A(mg->a, i+hhalf,j,k); setBoundary_private(row, cval+offset, aval+offset, len, &(rhs[localRow-1]), bcx2, coeff, ctr, naborx1); } else if (j == 0) { /* if y1 */ coeff = mg->B(mg->b, i, j+hhalf,k); ctr = mg->B(mg->b, i, j-hhalf,k); setBoundary_private(row, cval+offset, aval+offset, len, &(rhs[localRow-1]), bcy1, coeff, ctr, nabory2); } else if (j == ny-1) { /* if y2 */ coeff = mg->B(mg->b, i, j-hhalf,k); ctr = mg->B(mg->b, i, j+hhalf,k); setBoundary_private(row, cval+offset, aval+offset, len, &(rhs[localRow-1]), bcy2, coeff, ctr, nabory1); } } } END_FUNC_DH } /* zero-based (from Edmond Chow) */ /* x,y,z - coordinates of row, wrt naturally ordered grid nz, ny, nz - local grid dimensions, wrt 0 P, Q - subdomain grid dimensions in x and y directions */ HYPRE_Int rownum(const bool threeD, const HYPRE_Int x, const HYPRE_Int y, const HYPRE_Int z, const HYPRE_Int nx, const HYPRE_Int ny, const HYPRE_Int nz, HYPRE_Int P, HYPRE_Int Q) { HYPRE_Int p, q, r; HYPRE_Int lowerx, lowery, lowerz; HYPRE_Int id, startrow; /* compute x,y,z coordinates of subdomain to which this row belongs. */ p = x/nx; q = y/ny; r = z/nz; /* if (myid_dh == 0) hypre_printf("nx= %i ny= %i nz= %i\n", nx, ny, nz); if (myid_dh == 0) hypre_printf("x= %i y= %i z= %i threeD= %i p= %i q= %i r= %i\n", x,y,z,threeD, p,q,r); */ /* compute the subdomain (processor) of the subdomain to which this row belongs. */ if (threeD) { id = r*P*Q+q*P+p; } else { id = q*P+p; } /* if (myid_dh == 0) hypre_printf(" id= %i\n", id); */ /* smallest row in the subdomain */ startrow = id*(nx*ny*nz); /* x,y, and z coordinates of local grid of unknowns */ lowerx = nx*p; lowery = ny*q; lowerz = nz*r; if (threeD) { return startrow + nx*ny*(z-lowerz) + nx*(y-lowery) + (x-lowerx); } else { return startrow + nx*(y-lowery) + (x-lowerx); } } void getstencil(MatGenFD g, HYPRE_Int ix, HYPRE_Int iy, HYPRE_Int iz) { HYPRE_Int k; HYPRE_Real h = g->hh; HYPRE_Real hhalf = h*0.5; HYPRE_Real x = h*ix; HYPRE_Real y = h*iy; HYPRE_Real z = h*iz; HYPRE_Real cntr = 0.0; HYPRE_Real *stencil = g->stencil; HYPRE_Real coeff; bool threeD = g->threeD; for (k=0; k<8; ++k) stencil[k] = 0.0; /* differentiation wrt x */ coeff = g->A(g->a, x+hhalf,y,z); EAST(stencil) += coeff; cntr += coeff; coeff = g->A(g->a, x-hhalf,y,z); WEST(stencil) += coeff; cntr += coeff; coeff = g->D(g->d, x,y,z)*hhalf; EAST(stencil) += coeff; WEST(stencil) -= coeff; /* differentiation wrt y */ coeff = g->B(g->b,x,y+hhalf,z); NORTH(stencil) += coeff; cntr += coeff; coeff = g->B(g->b,x,y-hhalf,z); SOUTH(stencil) += coeff; cntr += coeff; coeff = g->E(g->e,x,y,z)*hhalf; NORTH(stencil) += coeff; SOUTH(stencil) -= coeff; /* differentiation wrt z */ if (threeD) { coeff = g->C(g->c,x,y,z+hhalf); BACK(stencil) += coeff; cntr += coeff; coeff = g->C(g->c,x,y,z-hhalf); FRONT(stencil) += coeff; cntr += coeff; coeff = g->F(g->f,x,y,z)*hhalf; BACK(stencil) += coeff; FRONT(stencil) -= coeff; } /* contribution from function G: */ coeff = g->G(g->g,x,y,z); CENTER(stencil) = h*h*coeff - cntr; RHS(stencil) = h*h*g->H(g->h,x,y,z); } HYPRE_Real konstant(HYPRE_Real coeff, HYPRE_Real x, HYPRE_Real y, HYPRE_Real z) { HYPRE_UNUSED_VAR(coeff); HYPRE_UNUSED_VAR(x); HYPRE_UNUSED_VAR(y); HYPRE_UNUSED_VAR(z); return coeff; } HYPRE_Real e2_xy(HYPRE_Real coeff, HYPRE_Real x, HYPRE_Real y, HYPRE_Real z) { HYPRE_UNUSED_VAR(z); return hypre_exp(coeff*x*y); } HYPRE_Real boxThreeD(HYPRE_Real coeff, HYPRE_Real x, HYPRE_Real y, HYPRE_Real z); /* returns diffusivity constant -bd1 if the point (x,y,z) is inside the box whose upper left and lower right points are (-bx1,-by1), (-bx2,-by2); else, returns diffusivity constant -bd2 */ HYPRE_Real box_1(HYPRE_Real coeff, HYPRE_Real x, HYPRE_Real y, HYPRE_Real z) { static bool setup = false; HYPRE_Real retval = coeff; /* dffusivity constants */ static HYPRE_Real dd1 = BOX1_DD; static HYPRE_Real dd2 = BOX2_DD; static HYPRE_Real dd3 = BOX3_DD; /* boxes */ static HYPRE_Real ax1 = BOX1_X1, ay1 = BOX1_Y1; static HYPRE_Real ax2 = BOX1_X2, ay2 = BOX1_Y2; static HYPRE_Real bx1 = BOX2_X1, by1 = BOX2_Y1; static HYPRE_Real bx2 = BOX2_X2, by2 = BOX2_Y2; static HYPRE_Real cx1 = BOX3_X1, cy1 = BOX3_Y1; static HYPRE_Real cx2 = BOX3_X2, cy2 = BOX3_Y2; if (isThreeD) { return(boxThreeD(coeff,x,y,z)); } /* 1st time through, parse for dffusivity constants */ if (!setup ) { dd1 = 0.1; dd2 = 0.1; dd3 = 10; Parser_dhReadDouble(parser_dh,"-dd1",&dd1); Parser_dhReadDouble(parser_dh,"-dd2",&dd2); Parser_dhReadDouble(parser_dh,"-dd3",&dd3); Parser_dhReadDouble(parser_dh,"-box1x1",&cx1); Parser_dhReadDouble(parser_dh,"-box1x2",&cx2); setup = true; } /* determine if point is inside box a */ if (x > ax1 && x < ax2 && y > ay1 && y < ay2) { retval = dd1*coeff; } /* determine if point is inside box b */ if (x > bx1 && x < bx2 && y > by1 && y < by2) { retval = dd2*coeff; } /* determine if point is inside box c */ if (x > cx1 && x < cx2 && y > cy1 && y < cy2) { retval = dd3*coeff; } return retval; } HYPRE_Real boxThreeD(HYPRE_Real coeff, HYPRE_Real x, HYPRE_Real y, HYPRE_Real z) { static bool setup = false; HYPRE_Real retval = coeff; /* dffusivity constants */ static HYPRE_Real dd1 = 100; /* boxes */ static HYPRE_Real x1 = .2, x2 = .8; static HYPRE_Real y1 = .3, y2 = .7; static HYPRE_Real z1 = .4, z2 = .6; /* 1st time through, parse for diffusivity constants */ if (!setup ) { Parser_dhReadDouble(parser_dh,"-dd1",&dd1); setup = true; } /* determine if point is inside the box */ if (x > x1 && x < x2 && y > y1 && y < y2 && z > z1 && z < z2) { retval = dd1*coeff; } return retval; } #if 0 HYPRE_Real box_1(HYPRE_Real coeff, HYPRE_Real x, HYPRE_Real y, HYPRE_Real z) { static HYPRE_Real x1, x2, y1, y2; static HYPRE_Real d1, d2; bool setup = false; HYPRE_Real retval; /* 1st time through, parse for constants and bounding box definition */ if (!setup ) { x1 = .25; x2 = .75; y1 = .25; y2 = .75; d1 = 1; d2 = 2; Parser_dhReadDouble(parser_dh,"-bx1",&x1); Parser_dhReadDouble(parser_dh,"-bx2",&x2); Parser_dhReadDouble(parser_dh,"-by1",&y1); Parser_dhReadDouble(parser_dh,"-by2",&y2); Parser_dhReadDouble(parser_dh,"-bd1",&d1); Parser_dhReadDouble(parser_dh,"-bd2",&d2); setup = true; } retval = d2; /* determine if point is inside box */ if (x > x1 && x < x2 && y > y1 && y < y2) { retval = d1; } return -1*retval; } #endif /* divide square into 4 quadrants; return one of 2 constants depending on the quadrant (checkerboard) */ HYPRE_Real box_2(HYPRE_Real coeff, HYPRE_Real x, HYPRE_Real y, HYPRE_Real z) { HYPRE_UNUSED_VAR(coeff); HYPRE_UNUSED_VAR(z); bool setup = false; static HYPRE_Real d1, d2; HYPRE_Real retval; if (!setup ) { d1 = 1; d2 = 2; Parser_dhReadDouble(parser_dh,"-bd1",&d1); Parser_dhReadDouble(parser_dh,"-bd2",&d2); } retval = d2; if (x < .5 && y < .5) retval = d1; if (x > .5 && y > .5) retval = d1; return -1*retval; } #undef __FUNC__ #define __FUNC__ "generateBlocked" void generateBlocked(MatGenFD mg, HYPRE_Int *rp, HYPRE_Int *cval, HYPRE_Real *aval, Mat_dh A, Vec_dh b) { START_FUNC_DH bool applyBdry = true; HYPRE_Real *stencil = mg->stencil; HYPRE_Int id = mg->id; bool threeD = mg->threeD; HYPRE_Int px = mg->px, py = mg->py, pz = mg->pz; /* processor grid dimensions */ HYPRE_Int p, q, r; /* this proc's position in processor grid */ HYPRE_Int cc = mg->cc; /* local grid dimension (grid of unknowns) */ HYPRE_Int nx = cc, ny = cc, nz = cc; HYPRE_Int lowerx, upperx, lowery, uppery, lowerz, upperz; HYPRE_Int startRow; HYPRE_Int x, y, z; bool debug = false; HYPRE_Int idx = 0, localRow = 0; /* nabor; */ HYPRE_Int naborx1 = 0, naborx2 = 0, nabory1 = 0, nabory2 = 0, naborz1, naborz2; HYPRE_Real *rhs; HYPRE_Real hhalf = 0.5 * mg->hh; HYPRE_Real bcx1 = mg->bcX1; HYPRE_Real bcx2 = mg->bcX2; HYPRE_Real bcy1 = mg->bcY1; HYPRE_Real bcy2 = mg->bcY2; /* HYPRE_Real bcz1 = mg->bcZ1; */ /* HYPRE_Real bcz2 = mg->bcZ2; */ Vec_dhInit(b, A->m); CHECK_V_ERROR; rhs = b->vals; if (mg->debug && logFile != NULL) debug = true; if (! threeD) nz = 1; /* compute p,q,r from P,Q,R and myid */ p = id % px; q = (( id - p)/px) % py; r = ( id - p - px*q)/( px*py ); if (debug) { hypre_sprintf(msgBuf_dh, "this proc's position in subdomain grid: p= %i q= %i r= %i", p,q,r); SET_INFO(msgBuf_dh); } /* compute ilower and iupper from p,q,r and nx,ny,nz */ /* zero-based */ lowerx = nx*p; upperx = lowerx + nx; lowery = ny*q; uppery = lowery + ny; lowerz = nz*r; upperz = lowerz + nz; if (debug) { hypre_sprintf(msgBuf_dh, "local grid parameters: lowerx= %i upperx= %i", lowerx, upperx); SET_INFO(msgBuf_dh); hypre_sprintf(msgBuf_dh, "local grid parameters: lowery= %i uppery= %i", lowery, uppery); SET_INFO(msgBuf_dh); hypre_sprintf(msgBuf_dh, "local grid parameters: lowerz= %i upperz= %i", lowerz, upperz); SET_INFO(msgBuf_dh); } startRow = mg->first; rp[0] = 0; for (z=lowerz; z 0) { naborz1 = rownum(threeD, x,y,z-1,nx,ny,nz,px,py); cval[idx] = naborz1; aval[idx++] = FRONT(stencil); } } /* south */ if (y > 0) { nabory1 = rownum(threeD, x,y-1,z,nx,ny,nz,px,py); cval[idx] = nabory1; aval[idx++] = SOUTH(stencil); } /* west */ if (x > 0) { naborx1 = rownum(threeD, x-1,y,z,nx,ny,nz,px,py); cval[idx] = naborx1; aval[idx++] = WEST(stencil); /*hypre_fprintf(logFile, "--- row: %i; naborx1= %i\n", localRow+startRow+1, 1+naborx1); */ } /* else { hypre_fprintf(logFile, "--- row: %i; x >= nx*px-1; naborx1 has old value: %i\n", localRow+startRow+1,1+naborx1); } */ /* center node */ cval[idx] = localRow+startRow; aval[idx++] = CENTER(stencil); /* east */ if (x < nx*px-1) { naborx2 = rownum(threeD,x+1,y,z,nx,ny,nz,px,py); cval[idx] = naborx2; aval[idx++] = EAST(stencil); } /* else { hypre_fprintf(logFile, "--- row: %i; x >= nx*px-1; nobors2 has old value: %i\n", localRow+startRow,1+naborx2); } */ /* north */ if (y < ny*py-1) { nabory2 = rownum(threeD,x,y+1,z,nx,ny,nz,px,py); cval[idx] = nabory2; aval[idx++] = NORTH(stencil); } /* up plane */ if (threeD) { if (z < nz*pz-1) { naborz2 = rownum(threeD,x,y,z+1,nx,ny,nz,px,py); cval[idx] = naborz2; aval[idx++] = BACK(stencil); } } /* rhs[rhsIdx++] = RHS(stencil); */ rhs[localRow] = 0.0; ++localRow; rp[localRow] = idx; /* apply boundary conditions; only for 2D! */ if (!threeD && applyBdry) { HYPRE_Int globalRow = localRow+startRow-1; HYPRE_Int offset = rp[localRow-1]; HYPRE_Int len = rp[localRow] - rp[localRow-1]; HYPRE_Real ctr, coeff; /* hypre_fprintf(logFile, "globalRow = %i; naborx2 = %i\n", globalRow+1, naborx2+1); */ if (x == 0) { /* if x1 */ coeff = mg->A(mg->a, x+hhalf,y,z); ctr = mg->A(mg->a, x-hhalf,y,z); setBoundary_private(globalRow, cval+offset, aval+offset, len, &(rhs[localRow-1]), bcx1, coeff, ctr, naborx2); } else if (x == nx*px-1) { /* if x2 */ coeff = mg->A(mg->a, x-hhalf,y,z); ctr = mg->A(mg->a, x+hhalf,y,z); setBoundary_private(globalRow, cval+offset, aval+offset, len, &(rhs[localRow-1]), bcx2, coeff, ctr, naborx1); } else if (y == 0) { /* if y1 */ coeff = mg->B(mg->b, x, y+hhalf,z); ctr = mg->B(mg->b, x, y-hhalf,z); setBoundary_private(globalRow, cval+offset, aval+offset, len, &(rhs[localRow-1]), bcy1, coeff, ctr, nabory2); } else if (y == ny*py-1) { /* if y2 */ coeff = mg->B(mg->b, x, y-hhalf,z); ctr = mg->B(mg->b, x, y+hhalf,z); setBoundary_private(globalRow, cval+offset, aval+offset, len, &(rhs[localRow-1]), bcy2, coeff, ctr, nabory1); } else if (threeD) { if (z == 0) { coeff = mg->B(mg->b, x, y, z+hhalf); ctr = mg->B(mg->b, x, y, z-hhalf); setBoundary_private(globalRow, cval+offset, aval+offset, len, &(rhs[localRow-1]), bcy1, coeff, ctr, naborz2); } else if (z == nz*nx-1) { coeff = mg->B(mg->b, x, y, z-hhalf); ctr = mg->B(mg->b, x, y, z+hhalf); setBoundary_private(globalRow, cval+offset, aval+offset, len, &(rhs[localRow-1]), bcy1, coeff, ctr, naborz1); } } } } } } END_FUNC_DH } #undef __FUNC__ #define __FUNC__ "setBoundary_private" void setBoundary_private(HYPRE_Int node, HYPRE_Int *cval, HYPRE_Real *aval, HYPRE_Int len, HYPRE_Real *rhs, HYPRE_Real bc, HYPRE_Real coeff, HYPRE_Real ctr, HYPRE_Int nabor) { START_FUNC_DH HYPRE_Int i; /* case 1: Dirichlet Boundary condition */ if (bc >= 0) { /* set all values to zero, set the diagonal to 1.0, set rhs to "bc" */ *rhs = bc; for (i=0; i -py -pz defaults: -px 1 -py 1 -pz 0 grid topology -m if pz=0, each processor has a square grid of dimension m*m, hence there are m*m*px*py unknowns. if pz > 0, each local grid is of dimension m*m*m, hence there are m*m*m*px*py*pz unknowns. diffusion coefficients (default is 1.0): -dx -dy -dz convection coefficients (default is 0.0) -cx -cy -cz grid dimension; if more than one mpi process, this is the local size for each processor: -m boundary conditions: This is very primitive; boundary conditions can only be generated for 2D grids; the condition along each side is either dirichlet (constant), if bcXX >= 0, or neuman, if bcXX < 0. -bcx1 -bcx2 -bcy1 -bcy2 Misc. -debug_matgen -striped (may not work?) =====================================================================*/ /* #include "euclid_common.h" */ struct _matgenfd { bool allocateMem; /* If true, memory is allocated when run() is called, in which case * the caller is responsible for calling FREE_DH for the rp, cval, * aval, and rhs arrays. If false, caller is assumed to have * allocated memory when run is called. * Default is "true" */ HYPRE_Int px, py, pz; /* Processor graph dimensions */ bool threeD; HYPRE_Int m; /* number of matrix rows in local matrix */ HYPRE_Int cc; /* Dimension of each processor's subgrid */ HYPRE_Real hh; /* Grid spacing; this is constant, equal to 1.0/(px*cc-1) */ HYPRE_Int id; /* the processor whose submatrix is to be generated */ HYPRE_Int np; /* number of subdomains (processors, mpi tasks) */ HYPRE_Real stencil[8]; /* derivative coefficients; a,b,c are 2nd derivatives, * c,d,e are 1st derivatives; f,g,h not currently used. */ HYPRE_Real a, b, c, d, e, f, g, h; HYPRE_Int first; /* global number of first locally owned row */ bool debug; /* boundary conditions; if value is < 0, neumen; else, dirichelet */ HYPRE_Real bcX1, bcX2; HYPRE_Real bcY1, bcY2; HYPRE_Real bcZ1, bcZ2; /* The following return coefficients; default is konstant() */ HYPRE_Real (*A)(HYPRE_Real coeff, HYPRE_Real x, HYPRE_Real y, HYPRE_Real z); HYPRE_Real (*B)(HYPRE_Real coeff, HYPRE_Real x, HYPRE_Real y, HYPRE_Real z); HYPRE_Real (*C)(HYPRE_Real coeff, HYPRE_Real x, HYPRE_Real y, HYPRE_Real z); HYPRE_Real (*D)(HYPRE_Real coeff, HYPRE_Real x, HYPRE_Real y, HYPRE_Real z); HYPRE_Real (*E)(HYPRE_Real coeff, HYPRE_Real x, HYPRE_Real y, HYPRE_Real z); HYPRE_Real (*F)(HYPRE_Real coeff, HYPRE_Real x, HYPRE_Real y, HYPRE_Real z); HYPRE_Real (*G)(HYPRE_Real coeff, HYPRE_Real x, HYPRE_Real y, HYPRE_Real z); HYPRE_Real (*H)(HYPRE_Real coeff, HYPRE_Real x, HYPRE_Real y, HYPRE_Real z); }; extern void MatGenFD_Create(MatGenFD *mg); extern void MatGenFD_Destroy(MatGenFD mg); extern void MatGenFD_Run(MatGenFD mg, HYPRE_Int id, HYPRE_Int np, Mat_dh *A, Vec_dh *rhs); /* =========== coefficient functions ============== */ extern HYPRE_Real konstant(HYPRE_Real coeff, HYPRE_Real x, HYPRE_Real y, HYPRE_Real z); extern HYPRE_Real e2_xy(HYPRE_Real coeff, HYPRE_Real x, HYPRE_Real y, HYPRE_Real z); /* 3 boxes nested inside the unit square domain. diffusivity constants are: -dd1, -dd2, -dd3. */ /* box placement */ #define BOX1_X1 0.1 #define BOX1_X2 0.4 #define BOX1_Y1 0.1 #define BOX1_Y2 0.4 #define BOX2_X1 0.6 #define BOX2_X2 0.9 #define BOX2_Y1 0.1 #define BOX2_Y2 0.4 #define BOX3_X1 0.2 #define BOX3_X2 0.8 #define BOX3_Y1 0.6 #define BOX3_Y2 0.8 /* default diffusivity */ #define BOX1_DD 10 #define BOX2_DD 100 #define BOX3_DD 50 extern HYPRE_Real box_1(HYPRE_Real coeff, HYPRE_Real x, HYPRE_Real y, HYPRE_Real z); /* -bd2 is diffusion coeff outside box; -bd1 is diffusion coeff inside box. */ extern HYPRE_Real box_2(HYPRE_Real coeff, HYPRE_Real x, HYPRE_Real y, HYPRE_Real z); #endif hypre-2.33.0/src/distributed_ls/Euclid/Mat_dh.c000066400000000000000000001255461477326011500213250ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "_hypre_Euclid.h" /* #include "Mat_dh.h" */ /* #include "getRow_dh.h" */ /* #include "SubdomainGraph_dh.h" */ /* #include "TimeLog_dh.h" */ /* #include "Mem_dh.h" */ /* #include "Numbering_dh.h" */ /* #include "Parser_dh.h" */ /* #include "mat_dh_private.h" */ /* #include "io_dh.h" */ /* #include "Hash_i_dh.h" */ static void setup_matvec_sends_private(Mat_dh mat, HYPRE_Int *inlist); static void setup_matvec_receives_private(Mat_dh mat, HYPRE_Int *beg_rows, HYPRE_Int *end_rows, HYPRE_Int reqlen, HYPRE_Int *reqind, HYPRE_Int *outlist); #if 0 partial (?) implementation below; not used anyplace, I think; for future expansion? [mar 21, 2K+1] static void Mat_dhAllocate_getRow_private(Mat_dh A); #endif static bool commsOnly = false; /* experimental, for matvec functions */ #undef __FUNC__ #define __FUNC__ "Mat_dhCreate" void Mat_dhCreate(Mat_dh *mat) { START_FUNC_DH struct _mat_dh* tmp = (struct _mat_dh*)MALLOC_DH(sizeof(struct _mat_dh)); CHECK_V_ERROR; *mat = tmp; commsOnly = Parser_dhHasSwitch(parser_dh, "-commsOnly"); if (myid_dh == 0 && commsOnly == true) { /* hypre_printf("\n@@@ commsOnly == true for matvecs! @@@\n"); */ fflush(stdout); } tmp->m = 0; tmp->n = 0; tmp->beg_row = 0; tmp->bs = 1; tmp->rp = NULL; tmp->len = NULL; tmp->cval = NULL; tmp->aval = NULL; tmp->diag = NULL; tmp->fill = NULL; tmp->owner = true; tmp->len_private = 0; tmp->rowCheckedOut = -1; tmp->cval_private = NULL; tmp->aval_private = NULL; tmp->row_perm = NULL; tmp->num_recv = 0; tmp->num_send = 0; tmp->recv_req = NULL; tmp->send_req = NULL; tmp->status = NULL; tmp->recvbuf = NULL; tmp->sendbuf = NULL; tmp->sendind = NULL; tmp->sendlen = 0; tmp->recvlen = 0; tmp->numb = NULL; tmp->matvecIsSetup = false; Mat_dhZeroTiming(tmp); CHECK_V_ERROR; tmp->matvec_timing = true; tmp->debug = Parser_dhHasSwitch(parser_dh, "-debug_Mat"); END_FUNC_DH } #undef __FUNC__ #define __FUNC__ "Mat_dhDestroy" void Mat_dhDestroy(Mat_dh mat) { START_FUNC_DH HYPRE_Int i; if (mat->owner) { if (mat->rp != NULL) { FREE_DH(mat->rp); CHECK_V_ERROR; } if (mat->len != NULL) { FREE_DH(mat->len); CHECK_V_ERROR; } if (mat->cval != NULL) { FREE_DH(mat->cval); CHECK_V_ERROR; } if (mat->aval != NULL) { FREE_DH(mat->aval); CHECK_V_ERROR; } if (mat->diag != NULL) { FREE_DH(mat->diag); CHECK_V_ERROR; } if (mat->fill != NULL) { FREE_DH(mat->fill); CHECK_V_ERROR; } if (mat->cval_private != NULL) { FREE_DH(mat->cval_private); CHECK_V_ERROR; } if (mat->aval_private != NULL) { FREE_DH(mat->aval_private); CHECK_V_ERROR; } if (mat->row_perm != NULL) { FREE_DH(mat->row_perm); CHECK_V_ERROR; } } for (i=0; inum_recv; i++) hypre_MPI_Request_free(&mat->recv_req[i]); for (i=0; inum_send; i++) hypre_MPI_Request_free(&mat->send_req[i]); if (mat->recv_req != NULL) { FREE_DH(mat->recv_req); CHECK_V_ERROR; } if (mat->send_req != NULL) { FREE_DH(mat->send_req); CHECK_V_ERROR; } if (mat->status != NULL) { FREE_DH(mat->status); CHECK_V_ERROR; } if (mat->recvbuf != NULL) { FREE_DH(mat->recvbuf); CHECK_V_ERROR; } if (mat->sendbuf != NULL) { FREE_DH(mat->sendbuf); CHECK_V_ERROR; } if (mat->sendind != NULL) { FREE_DH(mat->sendind); CHECK_V_ERROR; } if (mat->matvecIsSetup) { Mat_dhMatVecSetdown(mat); CHECK_V_ERROR; } if (mat->numb != NULL) { Numbering_dhDestroy(mat->numb); CHECK_V_ERROR; } FREE_DH(mat); CHECK_V_ERROR; END_FUNC_DH } /* this should put the cval array back the way it was! */ #undef __FUNC__ #define __FUNC__ "Mat_dhMatVecSetDown" void Mat_dhMatVecSetdown(Mat_dh mat) { HYPRE_UNUSED_VAR(mat); START_FUNC_DH if (ignoreMe) SET_V_ERROR("not implemented"); END_FUNC_DH } /* adopted from Edmond Chow's ParaSails */ #undef __FUNC__ #define __FUNC__ "Mat_dhMatVecSetup" void Mat_dhMatVecSetup(Mat_dh mat) { START_FUNC_DH if (np_dh == 1) { goto DO_NOTHING; } else { HYPRE_Int *outlist, *inlist; HYPRE_Int ierr, i, row, *rp = mat->rp, *cval = mat->cval; Numbering_dh numb; HYPRE_Int m = mat->m; HYPRE_Int firstLocal = mat->beg_row; HYPRE_Int lastLocal = firstLocal+m; HYPRE_Int *beg_rows, *end_rows; mat->recv_req = (hypre_MPI_Request *)MALLOC_DH(np_dh * sizeof(hypre_MPI_Request)); CHECK_V_ERROR; mat->send_req = (hypre_MPI_Request *)MALLOC_DH(np_dh * sizeof(hypre_MPI_Request)); CHECK_V_ERROR; mat->status = (hypre_MPI_Status *)MALLOC_DH(np_dh * sizeof(hypre_MPI_Status)); CHECK_V_ERROR; beg_rows = (HYPRE_Int*)MALLOC_DH(np_dh*sizeof(HYPRE_Int)); CHECK_V_ERROR; end_rows = (HYPRE_Int*)MALLOC_DH(np_dh*sizeof(HYPRE_Int)); CHECK_V_ERROR; if (np_dh == 1) { /* this is for debugging purposes in some of the drivers */ beg_rows[0] = 0; end_rows[0] = m; } else { ierr = hypre_MPI_Allgather(&firstLocal, 1, HYPRE_MPI_INT, beg_rows, 1, HYPRE_MPI_INT, comm_dh); CHECK_MPI_V_ERROR(ierr); ierr = hypre_MPI_Allgather(&lastLocal, 1, HYPRE_MPI_INT, end_rows, 1, HYPRE_MPI_INT, comm_dh); CHECK_MPI_V_ERROR(ierr); } outlist = (HYPRE_Int *)MALLOC_DH(np_dh*sizeof(HYPRE_Int)); CHECK_V_ERROR; inlist = (HYPRE_Int *)MALLOC_DH(np_dh*sizeof(HYPRE_Int)); CHECK_V_ERROR; for (i=0; inumb)); CHECK_V_ERROR; numb = mat->numb; Numbering_dhSetup(numb, mat); CHECK_V_ERROR; setup_matvec_receives_private(mat, beg_rows, end_rows, numb->num_ext, numb->idx_ext, outlist); CHECK_V_ERROR; if (np_dh == 1) { /* this is for debugging purposes in some of the drivers */ inlist[0] = outlist[0]; } else { ierr = hypre_MPI_Alltoall(outlist, 1, HYPRE_MPI_INT, inlist, 1, HYPRE_MPI_INT, comm_dh); CHECK_MPI_V_ERROR(ierr); } setup_matvec_sends_private(mat, inlist); CHECK_V_ERROR; /* Convert to local indices */ for (row=0; rowm; mat->num_recv = 0; /* Allocate recvbuf */ /* recvbuf has numlocal entries saved for local part of x, used in matvec */ mat->recvbuf = (HYPRE_Real*)MALLOC_DH((reqlen+m) * sizeof(HYPRE_Real)); for (i=0; i end_rows[this_pe]) break; } /* Request rows in reqind[i..j-1] */ ierr = hypre_MPI_Isend(&reqind[i], j-i, HYPRE_MPI_INT, this_pe, 444, comm_dh, &request); CHECK_MPI_V_ERROR(ierr); ierr = hypre_MPI_Request_free(&request); CHECK_MPI_V_ERROR(ierr); /* Count of number of number of indices needed from this_pe */ outlist[this_pe] = j-i; ierr = hypre_MPI_Recv_init(&mat->recvbuf[i+m], j-i, hypre_MPI_REAL, this_pe, 555, comm_dh, &mat->recv_req[mat->num_recv]); CHECK_MPI_V_ERROR(ierr); mat->num_recv++; mat->recvlen += j-i; /* only used for statistical reporting */ } END_FUNC_DH } /* adopted from Edmond Chow's ParaSails */ #undef __FUNC__ #define __FUNC__ "setup_matvec_sends_private" void setup_matvec_sends_private(Mat_dh mat, HYPRE_Int *inlist) { START_FUNC_DH HYPRE_Int ierr, i, j, sendlen, first = mat->beg_row; hypre_MPI_Request *requests; hypre_MPI_Status *statuses; requests = (hypre_MPI_Request *) MALLOC_DH(np_dh * sizeof(hypre_MPI_Request)); CHECK_V_ERROR; statuses = (hypre_MPI_Status *) MALLOC_DH(np_dh * sizeof(hypre_MPI_Status)); CHECK_V_ERROR; /* Determine size of and allocate sendbuf and sendind */ sendlen = 0; for (i=0; isendlen = sendlen; mat->sendbuf = (HYPRE_Real *)MALLOC_DH(sendlen * sizeof(HYPRE_Real)); CHECK_V_ERROR; mat->sendind = (HYPRE_Int *)MALLOC_DH(sendlen * sizeof(HYPRE_Int)); CHECK_V_ERROR; j = 0; mat->num_send = 0; for (i=0; isendind[j], inlist[i], HYPRE_MPI_INT, i, 444, comm_dh, &requests[mat->num_send]); CHECK_MPI_V_ERROR(ierr); /* Set up the send */ ierr = hypre_MPI_Send_init(&mat->sendbuf[j], inlist[i], hypre_MPI_REAL, i, 555, comm_dh, &mat->send_req[mat->num_send]); CHECK_MPI_V_ERROR(ierr); mat->num_send++; j += inlist[i]; } } /* total bytes to be sent during matvec */ mat->time[MATVEC_WORDS] = j; ierr = hypre_MPI_Waitall(mat->num_send, requests, statuses); CHECK_MPI_V_ERROR(ierr); /* convert global indices to local indices */ /* these are all indices on this processor */ for (i=0; isendlen; i++) mat->sendind[i] -= first; FREE_DH(requests); FREE_DH(statuses); END_FUNC_DH } /* unthreaded MPI version */ #undef __FUNC__ #define __FUNC__ "Mat_dhMatVec" void Mat_dhMatVec(Mat_dh mat, HYPRE_Real *x, HYPRE_Real *b) { START_FUNC_DH if (np_dh == 1) { Mat_dhMatVec_uni(mat, x, b); CHECK_V_ERROR; } else { HYPRE_Int ierr, i, row, m = mat->m; HYPRE_Int *rp = mat->rp, *cval = mat->cval; HYPRE_Real *aval = mat->aval; HYPRE_Int *sendind = mat->sendind; HYPRE_Int sendlen = mat->sendlen; HYPRE_Real *sendbuf = mat->sendbuf; HYPRE_Real *recvbuf = mat->recvbuf; HYPRE_Real t1 = 0, t2 = 0, t3 = 0, t4 = 0; bool timeFlag = mat->matvec_timing; if (timeFlag) t1 = hypre_MPI_Wtime(); /* Put components of x into the right outgoing buffers */ if (! commsOnly) { for (i=0; itime[MATVEC_TIME] += (t2 - t1); } ierr = hypre_MPI_Startall(mat->num_recv, mat->recv_req); CHECK_MPI_V_ERROR(ierr); ierr = hypre_MPI_Startall(mat->num_send, mat->send_req); CHECK_MPI_V_ERROR(ierr); ierr = hypre_MPI_Waitall(mat->num_recv, mat->recv_req, mat->status); CHECK_MPI_V_ERROR(ierr); ierr = hypre_MPI_Waitall(mat->num_send, mat->send_req, mat->status); CHECK_MPI_V_ERROR(ierr); if (timeFlag) { t3 = hypre_MPI_Wtime(); mat->time[MATVEC_MPI_TIME] += (t3 - t2); } /* Copy local part of x into top part of recvbuf */ if (! commsOnly) { for (i=0; itime[MATVEC_TOTAL_TIME] += (t4 - t1); mat->time[MATVEC_TIME] += (t4 - t3); } } END_FUNC_DH } /* OpenMP/MPI version */ #undef __FUNC__ #define __FUNC__ "Mat_dhMatVec_omp" void Mat_dhMatVec_omp(Mat_dh mat, HYPRE_Real *x, HYPRE_Real *b) { START_FUNC_DH HYPRE_Int ierr, i, row, m = mat->m; HYPRE_Int *rp = mat->rp, *cval = mat->cval; HYPRE_Real *aval = mat->aval; HYPRE_Int *sendind = mat->sendind; HYPRE_Int sendlen = mat->sendlen; HYPRE_Real *sendbuf = mat->sendbuf; HYPRE_Real *recvbuf = mat->recvbuf; HYPRE_Real t1 = 0, t2 = 0, t3 = 0, t4 = 0, tx = 0; HYPRE_Real *val, temp; HYPRE_Int len, *ind; bool timeFlag = mat->matvec_timing; if (timeFlag) t1 = hypre_MPI_Wtime(); /* Put components of x into the right outgoing buffers */ #ifdef USING_OPENMP_DH #pragma omp parallel for schedule(runtime) private(i) #endif for (i=0; itime[MATVEC_TIME] += (t2 - t1); } ierr = hypre_MPI_Startall(mat->num_recv, mat->recv_req); CHECK_MPI_V_ERROR(ierr); ierr = hypre_MPI_Startall(mat->num_send, mat->send_req); CHECK_MPI_V_ERROR(ierr); ierr = hypre_MPI_Waitall(mat->num_recv, mat->recv_req, mat->status); CHECK_MPI_V_ERROR(ierr); ierr = hypre_MPI_Waitall(mat->num_send, mat->send_req, mat->status); CHECK_MPI_V_ERROR(ierr); if (timeFlag) { t3 = hypre_MPI_Wtime(); mat->time[MATVEC_MPI_TIME] += (t3 - t2); } /* Copy local part of x into top part of recvbuf */ #ifdef USING_OPENMP_DH #pragma omp parallel for schedule(runtime) private(i) #endif for (i=0; itime[MATVEC_MPI_TIME2] += (tx - t1); } /* do the multiply */ #ifdef USING_OPENMP_DH #pragma omp parallel for schedule(runtime) private(row,i,len,ind,val,temp) #endif for (row=0; rowtime[MATVEC_TOTAL_TIME] += (t4 - t1); mat->time[MATVEC_TIME] += (t4 - t3); } END_FUNC_DH } /* OpenMP/single primary task version */ #undef __FUNC__ #define __FUNC__ "Mat_dhMatVec_uni_omp" void Mat_dhMatVec_uni_omp(Mat_dh mat, HYPRE_Real *x, HYPRE_Real *b) { START_FUNC_DH HYPRE_Int i, row, m = mat->m; HYPRE_Int *rp = mat->rp, *cval = mat->cval; HYPRE_Real *aval = mat->aval; HYPRE_Real t1 = 0, t2 = 0; bool timeFlag = mat->matvec_timing; if (timeFlag) { t1 = hypre_MPI_Wtime(); } /* do the multiply */ #ifdef USING_OPENMP_DH #pragma omp parallel for schedule(runtime) private(row,i) #endif for (row=0; rowtime[MATVEC_TIME] += (t2 - t1); mat->time[MATVEC_TOTAL_TIME] += (t2 - t1); } END_FUNC_DH } /* unthreaded, single-task version */ #undef __FUNC__ #define __FUNC__ "Mat_dhMatVec_uni" void Mat_dhMatVec_uni(Mat_dh mat, HYPRE_Real *x, HYPRE_Real *b) { START_FUNC_DH HYPRE_Int i, row, m = mat->m; HYPRE_Int *rp = mat->rp, *cval = mat->cval; HYPRE_Real *aval = mat->aval; HYPRE_Real t1 = 0, t2 = 0; bool timeFlag = mat->matvec_timing; if (timeFlag) t1 = hypre_MPI_Wtime(); for (row=0; rowtime[MATVEC_TIME] += (t2 - t1); mat->time[MATVEC_TOTAL_TIME] += (t2 - t1); } END_FUNC_DH } #undef __FUNC__ #define __FUNC__ "Mat_dhReadNz" HYPRE_Int Mat_dhReadNz(Mat_dh mat) { START_FUNC_DH HYPRE_Int ierr, retval = mat->rp[mat->m]; HYPRE_Int nz = retval; ierr = hypre_MPI_Allreduce(&nz, &retval, 1, HYPRE_MPI_INT, hypre_MPI_SUM, comm_dh); CHECK_MPI_ERROR(ierr); END_FUNC_VAL(retval) } #if 0 #undef __FUNC__ #define __FUNC__ "Mat_dhAllocate_getRow_private" void Mat_dhAllocate_getRow_private(Mat_dh A) { START_FUNC_DH HYPRE_Int i, *rp = A->rp, len = 0; HYPRE_Int m = A->m; /* find longest row in matrix */ for (i=0; ibs; /* free any previously allocated private storage */ if (len > A->len_private) { if (A->cval_private != NULL) { FREE_DH(A->cval_private); CHECK_V_ERROR; } if (A->aval_private != NULL) { FREE_DH(A->aval_private); CHECK_V_ERROR; } } /* allocate private storage */ A->cval_private = (HYPRE_Int*)MALLOC_DH(len*sizeof(HYPRE_Int)); CHECK_V_ERROR; A->aval_private = (HYPRE_Real*)MALLOC_DH(len*sizeof(HYPRE_Real)); CHECK_V_ERROR; A->len_private = len; END_FUNC_DH } #endif #undef __FUNC__ #define __FUNC__ "Mat_dhZeroTiming" void Mat_dhZeroTiming(Mat_dh mat) { START_FUNC_DH HYPRE_Int i; for (i=0; itime[i] = 0; mat->time_max[i] = 0; mat->time_min[i] = 0; } END_FUNC_DH } #undef __FUNC__ #define __FUNC__ "Mat_dhReduceTiming" void Mat_dhReduceTiming(Mat_dh mat) { START_FUNC_DH if (mat->time[MATVEC_MPI_TIME]) { mat->time[MATVEC_RATIO] = mat->time[MATVEC_TIME] / mat->time[MATVEC_MPI_TIME]; } hypre_MPI_Allreduce(mat->time, mat->time_min, MAT_DH_BINS, hypre_MPI_REAL, hypre_MPI_MIN, comm_dh); hypre_MPI_Allreduce(mat->time, mat->time_max, MAT_DH_BINS, hypre_MPI_REAL, hypre_MPI_MAX, comm_dh); END_FUNC_DH } #undef __FUNC__ #define __FUNC__ "Mat_dhPermute" void Mat_dhPermute(Mat_dh A, HYPRE_Int *n2o, Mat_dh *Bout) { START_FUNC_DH Mat_dh B; HYPRE_Int i, j, *RP = A->rp, *CVAL = A->cval; HYPRE_Int *o2n, *rp, *cval, m = A->m, nz = RP[m]; HYPRE_Real *aval, *AVAL = A->aval; Mat_dhCreate(&B); CHECK_V_ERROR; B->m = B->n = m; *Bout = B; /* form inverse permutation */ o2n = (HYPRE_Int*)MALLOC_DH(m*sizeof(HYPRE_Int)); CHECK_V_ERROR; for (i=0; irp = (HYPRE_Int*)MALLOC_DH((m+1)*sizeof(HYPRE_Int)); CHECK_V_ERROR; cval = B->cval = (HYPRE_Int*)MALLOC_DH(nz*sizeof(HYPRE_Int)); CHECK_V_ERROR; aval = B->aval = (HYPRE_Real*)MALLOC_DH(nz*sizeof(HYPRE_Real)); CHECK_V_ERROR; /* form new rp array */ rp[0] = 0; for (i=0; io2n_sub[id]; } for (pe=0; pem, A->beg_row, A->rp, A->cval, A->aval, NULL, NULL, NULL, fp); CHECK_V_ERROR; } else { HYPRE_Int beg_row = sg->beg_rowP[myid_dh]; mat_dh_print_graph_private(A->m, beg_row, A->rp, A->cval, A->aval, sg->n2o_row, sg->o2n_col, sg->o2n_ext, fp); CHECK_V_ERROR; } } } END_FUNC_DH } #undef __FUNC__ #define __FUNC__ "Mat_dhPrintRows" void Mat_dhPrintRows(Mat_dh A, SubdomainGraph_dh sg, FILE *fp) { START_FUNC_DH bool noValues; HYPRE_Int m = A->m, *rp = A->rp, *cval = A->cval; HYPRE_Real *aval = A->aval; noValues = (Parser_dhHasSwitch(parser_dh, "-noValues")); if (noValues) aval = NULL; /*---------------------------------------------------------------- * case 1: print local portion of unpermuted matrix *----------------------------------------------------------------*/ if (sg == NULL) { HYPRE_Int i, j; HYPRE_Int beg_row = A->beg_row; hypre_fprintf(fp, "\n----- A, unpermuted ------------------------------------\n"); for (i=0; iblocks; ++i) { HYPRE_Int oldBlock = sg->n2o_sub[i]; /* here, 'beg_row' and 'end_row' refer to rows in the original ordering of A. */ HYPRE_Int beg_row = sg->beg_row[oldBlock]; HYPRE_Int end_row = beg_row + sg->row_count[oldBlock]; hypre_fprintf(fp, "\n"); hypre_fprintf(fp, "\n----- A, permuted, single mpi task ------------------\n"); hypre_fprintf(fp, "---- new subdomain: %i; old subdomain: %i\n", i, oldBlock); hypre_fprintf(fp, " old beg_row: %i; new beg_row: %i\n", sg->beg_row[oldBlock], sg->beg_rowP[oldBlock]); hypre_fprintf(fp, " local rows in this block: %i\n", sg->row_count[oldBlock]); hypre_fprintf(fp, " bdry rows in this block: %i\n", sg->bdry_count[oldBlock]); hypre_fprintf(fp, " 1st bdry row= %i \n", 1+end_row-sg->bdry_count[oldBlock]); for (oldRow=beg_row; oldRowo2n_col[cval[k]]); } else { hypre_fprintf(fp, "%i,%g ; ", 1+sg->o2n_col[cval[k]], aval[k]); } } hypre_fprintf(fp, "\n"); Mat_dhRestoreRow(A, oldRow, &len, &cval, &aval); CHECK_V_ERROR; } } } /*---------------------------------------------------------------- * case 3: multiple mpi tasks, one subdomain per task *----------------------------------------------------------------*/ else { Hash_i_dh hash = sg->o2n_ext; HYPRE_Int *o2n_col = sg->o2n_col, *n2o_row = sg->n2o_row; HYPRE_Int beg_row = sg->beg_row[myid_dh]; HYPRE_Int beg_rowP = sg->beg_rowP[myid_dh]; HYPRE_Int i, j; for (i=0; i= beg_row && col < beg_row+m) { col = o2n_col[col-beg_row] + beg_rowP; } /* case ii: column is external */ else { HYPRE_Int tmp = col; tmp = Hash_i_dhLookup(hash, col); CHECK_V_ERROR; if (tmp == -1) { hypre_sprintf(msgBuf_dh, "nonlocal column= %i not in hash table", 1+col); SET_V_ERROR(msgBuf_dh); } else { col = tmp; } } if (noValues) { hypre_fprintf(fp, "%i ", 1+col); } else { hypre_fprintf(fp, "%i,%g ; ", 1+col, aval[j]); } } hypre_fprintf(fp, "\n"); } } END_FUNC_DH } #undef __FUNC__ #define __FUNC__ "Mat_dhPrintTriples" void Mat_dhPrintTriples(Mat_dh A, SubdomainGraph_dh sg, char *filename) { START_FUNC_DH HYPRE_Int m = A->m, *rp = A->rp, *cval = A->cval; HYPRE_Real *aval = A->aval; bool noValues; bool matlab; FILE *fp; noValues = (Parser_dhHasSwitch(parser_dh, "-noValues")); if (noValues) aval = NULL; matlab = (Parser_dhHasSwitch(parser_dh, "-matlab")); /*---------------------------------------------------------------- * case 1: unpermuted matrix, single or multiple mpi tasks *----------------------------------------------------------------*/ if (sg == NULL) { HYPRE_Int i, j, pe; HYPRE_Int beg_row = A->beg_row; HYPRE_Real val; for (pe=0; peblocks; ++i) { HYPRE_Int oldBlock = sg->n2o_sub[i]; HYPRE_Int beg_row = sg->beg_rowP[oldBlock]; HYPRE_Int end_row = beg_row + sg->row_count[oldBlock]; for (j=beg_row; jn2o_row[j]; Mat_dhGetRow(A, oldRow, &len, &cval, &aval); CHECK_V_ERROR; if (noValues) { for (k=0; ko2n_col[cval[k]]); } ++idx; } else { for (k=0; ko2n_col[cval[k]], val); } ++idx; } Mat_dhRestoreRow(A, oldRow, &len, &cval, &aval); CHECK_V_ERROR; } } } /*---------------------------------------------------------------- * case 3: multiple mpi tasks, one subdomain per task *----------------------------------------------------------------*/ else { Hash_i_dh hash = sg->o2n_ext; HYPRE_Int *o2n_col = sg->o2n_col, *n2o_row = sg->n2o_row; HYPRE_Int beg_row = sg->beg_row[myid_dh]; HYPRE_Int beg_rowP = sg->beg_rowP[myid_dh]; HYPRE_Int i, j, pe; HYPRE_Int id = sg->o2n_sub[myid_dh]; for (pe=0; pe= beg_row && col < beg_row+m) { col = o2n_col[col-beg_row] + beg_rowP; } /* case ii: column is external */ else { HYPRE_Int tmp = col; tmp = Hash_i_dhLookup(hash, col); CHECK_V_ERROR; if (tmp == -1) { hypre_sprintf(msgBuf_dh, "nonlocal column= %i not in hash table", 1+col); SET_V_ERROR(msgBuf_dh); } else { col = tmp; } } if (noValues) { hypre_fprintf(fp, "%i %i\n", 1+i+beg_rowP, 1+col); } else { hypre_fprintf(fp, TRIPLES_FORMAT, 1+i+beg_rowP, 1+col, val); } } } closeFile_dh(fp); CHECK_V_ERROR; } } } END_FUNC_DH } /* seq only */ #undef __FUNC__ #define __FUNC__ "Mat_dhPrintCSR" void Mat_dhPrintCSR(Mat_dh A, SubdomainGraph_dh sg, char *filename) { START_FUNC_DH FILE *fp; if (np_dh > 1) { SET_V_ERROR("only implemented for a single mpi task"); } if (sg != NULL) { SET_V_ERROR("not implemented for reordered matrix (SubdomainGraph_dh should be NULL)"); } fp=openFile_dh(filename, "w"); CHECK_V_ERROR; if (sg == NULL) { mat_dh_print_csr_private(A->m, A->rp, A->cval, A->aval, fp); CHECK_V_ERROR; } else { mat_dh_print_csr_private(A->m, A->rp, A->cval, A->aval, fp); CHECK_V_ERROR; } closeFile_dh(fp); CHECK_V_ERROR; END_FUNC_DH } /* seq */ /* no reordering */ #undef __FUNC__ #define __FUNC__ "Mat_dhPrintBIN" void Mat_dhPrintBIN(Mat_dh A, SubdomainGraph_dh sg, char *filename) { START_FUNC_DH if (np_dh > 1) { SET_V_ERROR("only implemented for a single MPI task"); } /* if (n2o != NULL || o2n != NULL || hash != NULL) { */ if (sg != NULL) { SET_V_ERROR("not implemented for reordering; ensure sg=NULL"); } io_dh_print_ebin_mat_private(A->m, A->beg_row, A->rp, A->cval, A->aval, NULL, NULL, NULL, filename); CHECK_V_ERROR; END_FUNC_DH } /*---------------------------------------------------------------------- * Read methods *----------------------------------------------------------------------*/ /* seq only */ #undef __FUNC__ #define __FUNC__ "Mat_dhReadCSR" void Mat_dhReadCSR(Mat_dh *mat, char *filename) { START_FUNC_DH Mat_dh A; FILE *fp; if (np_dh > 1) { SET_V_ERROR("only implemented for a single MPI task"); } fp=openFile_dh(filename, "r"); CHECK_V_ERROR; Mat_dhCreate(&A); CHECK_V_ERROR; mat_dh_read_csr_private(&A->m, &A->rp, &A->cval, &A->aval, fp); CHECK_V_ERROR; A->n = A->m; *mat = A; closeFile_dh(fp); CHECK_V_ERROR; END_FUNC_DH } /* seq only */ #undef __FUNC__ #define __FUNC__ "Mat_dhReadTriples" void Mat_dhReadTriples(Mat_dh *mat, HYPRE_Int ignore, char *filename) { START_FUNC_DH FILE *fp = NULL; Mat_dh A = NULL; if (np_dh > 1) { SET_V_ERROR("only implemented for a single MPI task"); } fp=openFile_dh(filename, "r"); CHECK_V_ERROR; Mat_dhCreate(&A); CHECK_V_ERROR; mat_dh_read_triples_private(ignore, &A->m, &A->rp, &A->cval, &A->aval, fp); CHECK_V_ERROR; A->n = A->m; *mat = A; closeFile_dh(fp); CHECK_V_ERROR; END_FUNC_DH } /* here we pass the private function a filename, instead of an open file, the reason being that Euclid's binary format is more complicated, i.e, the other "Read" methods are only for a single mpi task. */ #undef __FUNC__ #define __FUNC__ "Mat_dhReadBIN" void Mat_dhReadBIN(Mat_dh *mat, char *filename) { START_FUNC_DH Mat_dh A; if (np_dh > 1) { SET_V_ERROR("only implemented for a single MPI task"); } Mat_dhCreate(&A); CHECK_V_ERROR; io_dh_read_ebin_mat_private(&A->m, &A->rp, &A->cval, &A->aval, filename); CHECK_V_ERROR; A->n = A->m; *mat = A; END_FUNC_DH } #undef __FUNC__ #define __FUNC__ "Mat_dhTranspose" void Mat_dhTranspose(Mat_dh A, Mat_dh *Bout) { START_FUNC_DH Mat_dh B; if (np_dh > 1) { SET_V_ERROR("only for sequential"); } Mat_dhCreate(&B); CHECK_V_ERROR; *Bout = B; B->m = B->n = A->m; mat_dh_transpose_private(A->m, A->rp, &B->rp, A->cval, &B->cval, A->aval, &B->aval); CHECK_V_ERROR; END_FUNC_DH } #undef __FUNC__ #define __FUNC__ "Mat_dhMakeStructurallySymmetric" void Mat_dhMakeStructurallySymmetric(Mat_dh A) { START_FUNC_DH if (np_dh > 1) { SET_V_ERROR("only for sequential"); } make_symmetric_private(A->m, &A->rp, &A->cval, &A->aval); CHECK_V_ERROR; END_FUNC_DH } void insert_diags_private(Mat_dh A, HYPRE_Int ct); /* inserts diagonal if not explicitly present; sets diagonal value in row i to sum of absolute values of all elts in row i. */ #undef __FUNC__ #define __FUNC__ "Mat_dhFixDiags" void Mat_dhFixDiags(Mat_dh A) { START_FUNC_DH HYPRE_Int i, j; HYPRE_Int *rp = A->rp, *cval = A->cval, m = A->m; HYPRE_Int ct = 0; /* number of missing diagonals */ HYPRE_Real *aval = A->aval; /* determine if any diagonals are missing */ for (i=0; irp; cval = A->cval; aval = A->aval; } /* set the value of all diagonal elements */ for (i=0; irp, *CVAL = A->cval; HYPRE_Int *rp, *cval, m = A->m; HYPRE_Real *aval, *AVAL = A->aval; HYPRE_Int nz = RP[m] + ct; HYPRE_Int i, j, idx = 0; rp = A->rp = (HYPRE_Int*)MALLOC_DH((m+1)*sizeof(HYPRE_Int)); CHECK_V_ERROR; cval = A->cval = (HYPRE_Int*)MALLOC_DH(nz*sizeof(HYPRE_Int)); CHECK_V_ERROR; aval = A->aval = (HYPRE_Real*)MALLOC_DH(nz*sizeof(HYPRE_Real)); CHECK_V_ERROR; rp[0] = 0; for (i=0; im; HYPRE_Int *rp = A->rp, *cval = A->cval; HYPRE_Real *aval = A->aval; hypre_fprintf(fp, "=================== diagonal elements ====================\n"); for (i=0; ibeg_row; if (row > B->m) { hypre_sprintf(msgBuf_dh, "requested globalRow= %i, which is local row= %i, but only have %i rows!", globalRow, row, B->m); SET_V_ERROR(msgBuf_dh); } *len = B->rp[row+1] - B->rp[row]; if (ind != NULL) *ind = B->cval + B->rp[row]; if (val != NULL) *val = B->aval + B->rp[row]; END_FUNC_DH } #undef __FUNC__ #define __FUNC__ "Mat_dhRestoreRow" void Mat_dhRestoreRow(Mat_dh B, HYPRE_Int row, HYPRE_Int *len, HYPRE_Int **ind, HYPRE_Real **val) { HYPRE_UNUSED_VAR(B); HYPRE_UNUSED_VAR(row); HYPRE_UNUSED_VAR(len); HYPRE_UNUSED_VAR(ind); HYPRE_UNUSED_VAR(val); START_FUNC_DH END_FUNC_DH } #undef __FUNC__ #define __FUNC__ "Mat_dhRowPermute" void Mat_dhRowPermute(Mat_dh mat) { HYPRE_UNUSED_VAR(mat); START_FUNC_DH if (ignoreMe) SET_V_ERROR("turned off; compilation problem on blue"); #if 0 HYPRE_Int i, j, m = mat->m, nz = mat->rp[m]; HYPRE_Int *o2n, *cval; HYPRE_Int algo = 1; HYPRE_Real *r1, *c1; bool debug = mat->debug; bool isNatural; Mat_dh B; #if 0 * = 1 : Compute a row permutation of the matrix so that the * permuted matrix has as many entries on its diagonal as * possible. The values on the diagonal are of arbitrary size. * HSL subroutine MC21A/AD is used for this. * = 2 : Compute a row permutation of the matrix so that the smallest * value on the diagonal of the permuted matrix is maximized. * = 3 : Compute a row permutation of the matrix so that the smallest * value on the diagonal of the permuted matrix is maximized. * The algorithm differs from the one used for JOB = 2 and may * have quite a different performance. * = 4 : Compute a row permutation of the matrix so that the sum * of the diagonal entries of the permuted matrix is maximized. * = 5 : Compute a row permutation of the matrix so that the product * of the diagonal entries of the permuted matrix is maximized * and vectors to scale the matrix so that the nonzero diagonal * entries of the permuted matrix are one in absolute value and * all the off-diagonal entries are less than or equal to one in * absolute value. #endif Parser_dhReadInt(parser_dh, "-rowPermute", &algo); CHECK_V_ERROR; if (algo < 1) algo = 1; if (algo > 5) algo = 1; hypre_sprintf(msgBuf_dh, "calling row permutation with algo= %i", algo); SET_INFO(msgBuf_dh); r1 = (HYPRE_Real*)MALLOC_DH(m*sizeof(HYPRE_Real)); CHECK_V_ERROR; c1 = (HYPRE_Real*)MALLOC_DH(m*sizeof(HYPRE_Real)); CHECK_V_ERROR; if (mat->row_perm == NULL) { mat->row_perm = o2n = (HYPRE_Int*)MALLOC_DH(m*sizeof(HYPRE_Int)); CHECK_V_ERROR; } else { o2n = mat->row_perm; } Mat_dhTranspose(mat, &B); CHECK_V_ERROR; /* get row permutation and scaling vectors */ dldperm(algo, m, nz, B->rp, B->cval, B->aval, o2n, r1, c1); /* permute column indices, then turn the matrix rightside up */ cval = B->cval; for (i=0; irp, *cval = B->cval; HYPRE_Real *aval = B->aval; if (algo == 5) { hypre_printf("@@@ [%i] Mat_dhRowPermute :: scaling matrix rows and columns!\n", myid_dh); /* scale matrix */ for (i=0; im, B->rp, B->cval, B->aval, mat->rp, mat->cval, mat->aval); CHECK_V_ERROR; } Mat_dhDestroy(B); CHECK_V_ERROR; FREE_DH(r1); CHECK_V_ERROR; FREE_DH(c1); CHECK_V_ERROR; #endif END_FUNC_DH } /*==============================================================================*/ #undef __FUNC__ #define __FUNC__ "Mat_dhPartition" void build_adj_lists_private(Mat_dh mat, HYPRE_Int **rpOUT, HYPRE_Int **cvalOUT) { START_FUNC_DH HYPRE_Int m = mat->m; HYPRE_Int *RP = mat->rp, *CVAL = mat->cval; HYPRE_Int nz = RP[m]; HYPRE_Int i, j, *rp, *cval, idx = 0; rp = *rpOUT = (HYPRE_Int *)MALLOC_DH((m+1)*sizeof(HYPRE_Int)); CHECK_V_ERROR; cval = *cvalOUT = (HYPRE_Int *)MALLOC_DH(nz*sizeof(HYPRE_Int)); CHECK_V_ERROR; rp[0] = 0; /* assume symmetry for now! */ for (i=0; im; HYPRE_Int i, cutEdgeCount; HYPRE_Real zero = 0.0; HYPRE_Int metisOpts[5] = {0, 0, 0, 0, 0}; HYPRE_Int *rp, *cval; /* allocate storage for returned arrays */ beg_row = *beg_rowOUT = (HYPRE_Int *)MALLOC_DH(blocks*sizeof(HYPRE_Int)); CHECK_V_ERROR; row_count = *row_countOUT = (HYPRE_Int *)MALLOC_DH(blocks*sizeof(HYPRE_Int)); CHECK_V_ERROR; *n2oOUT = n2o = (HYPRE_Int *)MALLOC_DH(m*sizeof(HYPRE_Int)); CHECK_V_ERROR; *o2nOUT = o2n = (HYPRE_Int *)MALLOC_DH(m*sizeof(HYPRE_Int)); CHECK_V_ERROR; #if 0 ============================================================= Metis arguments: n - number of nodes rp[], cval[] NULL, NULL, 0 /*no edge or vertex weights*/ 0 /*use zero-based numbering*/ blocksIN, options[5] = 0 :: 0/1 use defauls; use uptions 1..4 1 :: edgecutOUT, part[] ============================================================= #endif /* form the graph representation that metis wants */ build_adj_lists_private(mat, &rp, &cval); CHECK_V_ERROR; part = (HYPRE_Int *)MALLOC_DH(m*sizeof(HYPRE_Int)); CHECK_V_ERROR; /* get parition vector from metis */ METIS_PartGraphKway(&m, rp, cval, NULL, NULL, &zero, &zero, &blocks, metisOpts, &cutEdgeCount, part); FREE_DH(rp); CHECK_V_ERROR; FREE_DH(cval); CHECK_V_ERROR; if (mat->debug) { printf_dh("\nmetis partitioning vector; blocks= %i\n", blocks); for (i=0; idebug) { printf_dh("\nrow_counts: "); for (i=0; imalloc has been called. */ HYPRE_Real freeCount; /* number of times mem_dh->free has been called. */ }; #undef __FUNC__ #define __FUNC__ "Mem_dhCreate" void Mem_dhCreate(Mem_dh *m) { START_FUNC_DH struct _mem_dh *tmp = (struct _mem_dh*)PRIVATE_MALLOC(sizeof(struct _mem_dh)); CHECK_V_ERROR; *m = tmp; tmp->maxMem = 0.0; tmp->curMem = 0.0; tmp->totalMem = 0.0; tmp->mallocCount = 0.0; tmp->freeCount = 0.0; END_FUNC_DH } #undef __FUNC__ #define __FUNC__ "Mem_dhDestroy" void Mem_dhDestroy(Mem_dh m) { START_FUNC_DH if (Parser_dhHasSwitch(parser_dh, "-eu_mem")) { Mem_dhPrint(m, stdout, false); CHECK_V_ERROR; } PRIVATE_FREE(m); END_FUNC_DH } #undef __FUNC__ #define __FUNC__ "Mem_dhMalloc" void* Mem_dhMalloc(Mem_dh m, size_t size) { START_FUNC_DH_2 void *retval; memRecord_dh *tmp; size_t s = size + 2*sizeof(memRecord_dh); void *address; address = PRIVATE_MALLOC(s); if (address == NULL) { hypre_sprintf(msgBuf_dh, "PRIVATE_MALLOC failed; totalMem = %g; requested additional = %i", m->totalMem, (HYPRE_Int)s); SET_ERROR(NULL, msgBuf_dh); } retval = (char*)address + sizeof(memRecord_dh); /* we prepend and postpend a private record to the * requested chunk of memory; this permits tracking the * sizes of freed memory, along with other rudimentary * error checking. This is modeled after the PETSc code. */ tmp = (memRecord_dh*)address; tmp->size = (HYPRE_Real) s; m->mallocCount += 1; m->totalMem += (HYPRE_Real)s; m->curMem += (HYPRE_Real)s; m->maxMem = MAX(m->maxMem, m->curMem); END_FUNC_VAL_2( retval ) } #undef __FUNC__ #define __FUNC__ "Mem_dhFree" void Mem_dhFree(Mem_dh m, void *ptr) { HYPRE_UNUSED_VAR(m); START_FUNC_DH_2 HYPRE_Real size; char *tmp = (char*)ptr; memRecord_dh *rec; tmp -= sizeof(memRecord_dh); rec = (memRecord_dh*)tmp; size = rec->size; mem_dh->curMem -= size; mem_dh->freeCount += 1; PRIVATE_FREE(tmp); END_FUNC_DH_2 } #undef __FUNC__ #define __FUNC__ "Mem_dhPrint" void Mem_dhPrint(Mem_dh m, FILE* fp, bool allPrint) { START_FUNC_DH_2 if (fp == NULL) SET_V_ERROR("fp == NULL"); if (myid_dh == 0 || allPrint) { HYPRE_Real tmp; hypre_fprintf(fp, "---------------------- Euclid memory report (start)\n"); hypre_fprintf(fp, "malloc calls = %g\n", m->mallocCount); hypre_fprintf(fp, "free calls = %g\n", m->freeCount); hypre_fprintf(fp, "curMem = %g Mbytes (should be zero)\n", m->curMem/1000000); tmp = m->totalMem / 1000000; hypre_fprintf(fp, "total allocated = %g Mbytes\n", tmp); hypre_fprintf(fp, "max malloc = %g Mbytes (max allocated at any point in time)\n", m->maxMem/1000000); hypre_fprintf(fp, "\n"); hypre_fprintf(fp, "---------------------- Euclid memory report (end)\n"); } END_FUNC_DH_2 } hypre-2.33.0/src/distributed_ls/Euclid/Mem_dh.h000066400000000000000000000015631477326011500213170ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #ifndef MEM_DH_DH #define MEM_DH_DH /* #include "euclid_common.h" */ extern void Mem_dhCreate(Mem_dh *m); extern void Mem_dhDestroy(Mem_dh m); extern void *Mem_dhMalloc(Mem_dh m, size_t size); extern void Mem_dhFree(Mem_dh m, void *ptr); /* preceeding two are called via the macros MALLOC_DH and FREE_DH; see "euclid_config.h" */ extern void Mem_dhPrint(Mem_dh m, FILE* fp, bool allPrint); /* prints memory usage statistics; "allPrint" is only meaningful when running in MPI mode. */ #endif hypre-2.33.0/src/distributed_ls/Euclid/Numbering_dh.c000066400000000000000000000127611477326011500225240ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "_hypre_Euclid.h" /* #include "Numbering_dh.h" */ /* #include "Mat_dh.h" */ /* #include "Hash_i_dh.h" */ /* #include "Mem_dh.h" */ /* #include "shellSort_dh.h" */ /* #include "Parser_dh.h" */ #undef __FUNC__ #define __FUNC__ "Numbering_dhCreate" void Numbering_dhCreate(Numbering_dh *numb) { START_FUNC_DH struct _numbering_dh* tmp = (struct _numbering_dh*)MALLOC_DH(sizeof(struct _numbering_dh)); CHECK_V_ERROR; *numb = tmp; tmp->size = 0; tmp->first = 0; tmp->m = 0; tmp->num_ext = 0; tmp->num_extLo = 0; tmp->num_extHi = 0; tmp->idx_ext = NULL; tmp->idx_extLo = NULL; tmp->idx_extHi = NULL; tmp->idx_ext = NULL; tmp->debug = Parser_dhHasSwitch(parser_dh, "-debug_Numbering"); END_FUNC_DH } #undef __FUNC__ #define __FUNC__ "Numbering_dhDestroy" void Numbering_dhDestroy(Numbering_dh numb) { START_FUNC_DH if (numb->global_to_local != NULL) { Hash_i_dhDestroy(numb->global_to_local); CHECK_V_ERROR; } if (numb->idx_ext != NULL) { FREE_DH(numb->idx_ext); CHECK_V_ERROR; } FREE_DH(numb); CHECK_V_ERROR; END_FUNC_DH } /* The internal indices are numbered 0 to nlocal-1 so they do not need to be sorted. The external indices are sorted so that the indices from a given processor are stored contiguously. Then in the matvec, no reordering of the data is needed. */ #undef __FUNC__ #define __FUNC__ "Numbering_dhSetup" void Numbering_dhSetup(Numbering_dh numb, Mat_dh mat) { START_FUNC_DH HYPRE_Int i, len, *cval = mat->cval; HYPRE_Int num_ext, num_extLo, num_extHi; HYPRE_Int m = mat->m, size; Hash_i_dh global_to_local_hash; HYPRE_Int first = mat->beg_row, last = first+m; HYPRE_Int *idx_ext; HYPRE_Int data; /* HYPRE_Int debug = false; */ /* if (logFile != NULL && numb->debug) debug = true; */ numb->first = first; numb->m = m; /* Allocate space for look-up tables */ /* initial guess: there are at most 'm' external indices */ numb->size = size = m; Hash_i_dhCreate(&(numb->global_to_local), m); CHECK_V_ERROR; global_to_local_hash = numb->global_to_local; idx_ext = numb->idx_ext = (HYPRE_Int*)MALLOC_DH(size*sizeof(HYPRE_Int)); CHECK_V_ERROR; /* find all external indices; at the end of this block, idx_ext[] will contain an unsorted list of external indices. */ len = mat->rp[m]; num_ext = num_extLo = num_extHi = 0; for (i=0; i= last) { /* if index hasn't been previously inserted, do so now. */ data = Hash_i_dhLookup(global_to_local_hash, cval[i]); CHECK_V_ERROR; if (data == -1) { /* index hasn't been inserted, so do so now */ /* reallocate idx_ext array if we're out of space. The global_to_local hash table may also need to be enlarged, but the hash object will take care of that. */ /* RL : why ``m+num_ext'' instead of ``num_ext+1'' ??? */ if (m+num_ext >= size) { HYPRE_Int newSize = (HYPRE_Int)hypre_max(m+num_ext+1, size*1.5); /* heuristic */ HYPRE_Int *tmp = (HYPRE_Int*)MALLOC_DH(newSize*sizeof(HYPRE_Int)); CHECK_V_ERROR; hypre_TMemcpy(tmp, idx_ext, size, size, HYPRE_MEMORY_HOST, HYPRE_MEMORY_HOST); FREE_DH(idx_ext); CHECK_V_ERROR; size = numb->size = newSize; numb->idx_ext = idx_ext = tmp; SET_INFO("reallocated ext_idx[]"); } /* insert external index */ Hash_i_dhInsert(global_to_local_hash, index, num_ext); CHECK_V_ERROR; idx_ext[num_ext] = index; num_ext++; if (index < first) { num_extLo++; } else { num_extHi++; } } } } numb->num_ext = num_ext; numb->num_extLo = num_extLo; numb->num_extHi = num_extHi; numb->idx_extLo = idx_ext; numb->idx_extHi = idx_ext + num_extLo; /* sort the list of external indices, then redo the hash table; the table is used to convert external indices in Numbering_dhGlobalToLocal() */ shellSort_int(num_ext, idx_ext); Hash_i_dhReset(global_to_local_hash); CHECK_V_ERROR; for (i=0; ifirst; HYPRE_Int last = first + numb->m; HYPRE_Int data; Hash_i_dh global_to_local = numb->global_to_local; for (i=0; i= first && idxGlobal < last) { local[i] = idxGlobal - first; /* note: for matvec setup, numb->num_extLo = 0. */ } else { data = Hash_i_dhLookup(global_to_local, idxGlobal); CHECK_V_ERROR; if (data == -1) { hypre_sprintf(msgBuf_dh, "global index %i not found in map\n", idxGlobal); SET_V_ERROR(msgBuf_dh); } else { local[i] = data; } } } END_FUNC_DH } hypre-2.33.0/src/distributed_ls/Euclid/Numbering_dh.h000066400000000000000000000036641477326011500225330ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #ifndef NUMBERING_DH_H #define NUMBERING_DH_H /* code and algorithms in this class adopted from Edmond Chow's ParaSails */ /* #include "euclid_common.h" */ struct _numbering_dh { HYPRE_Int size; /* max number of indices that can be stored; (length of idx_ext[]) */ HYPRE_Int first; /* global number of 1st local index (row) */ HYPRE_Int m; /* number of local indices (number of local rows in mat) */ HYPRE_Int *idx_ext; /* sorted list of external indices */ HYPRE_Int *idx_extLo; /* sorted list of external indices that are < first */ HYPRE_Int *idx_extHi; /* sorted list of external indices that are >= first+m */ HYPRE_Int num_ext; /* number of external (non-local) indices = num_extLo+num_extHi */ HYPRE_Int num_extLo; /* number of external indices < first */ HYPRE_Int num_extHi; /* number of external indices >= first+num_loc */ Hash_i_dh global_to_local; bool debug; }; extern void Numbering_dhCreate(Numbering_dh *numb); extern void Numbering_dhDestroy(Numbering_dh numb); /* must be called before calling Numbering_dhGlobalToLocal() or Numbering_dhLocalToGlobal(). */ extern void Numbering_dhSetup(Numbering_dh numb, Mat_dh mat); /* input: global_in[len], which contains global row numbers. output: local_out[len], containing corresponding local numbers. note: global_in[] and local_out[] may be identical. */ extern void Numbering_dhGlobalToLocal(Numbering_dh numb, HYPRE_Int len, HYPRE_Int *global_in, HYPRE_Int *local_out); #endif hypre-2.33.0/src/distributed_ls/Euclid/Parser_dh.c000066400000000000000000000205261477326011500220300ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "_hypre_Euclid.h" /* #include "Parser_dh.h" */ /* #include "Mem_dh.h" */ typedef struct _optionsNode OptionsNode; struct _parser_dh { OptionsNode *head; OptionsNode *tail; }; struct _optionsNode { char *name; char *value; OptionsNode *next; }; static bool find(Parser_dh p,const char *option, OptionsNode** ptr); static void init_from_default_settings_private(Parser_dh p); #undef __FUNC__ #define __FUNC__ "Parser_dhCreate" void Parser_dhCreate(Parser_dh *p) { START_FUNC_DH OptionsNode *ptr; /* allocate storage for object */ struct _parser_dh* tmp = (struct _parser_dh*)MALLOC_DH(sizeof(struct _parser_dh)); CHECK_V_ERROR; *p = tmp; /* consruct header node */ tmp->head = tmp->tail = (OptionsNode*)MALLOC_DH(sizeof(OptionsNode)); CHECK_V_ERROR; ptr = tmp->head; ptr->next = NULL; ptr->name = (char*)MALLOC_DH(6*sizeof(char)); CHECK_V_ERROR; ptr->value = (char*)MALLOC_DH(6*sizeof(char)); CHECK_V_ERROR; strcpy(ptr->name, "JUNK"); strcpy(ptr->value, "JUNK"); END_FUNC_DH } #undef __FUNC__ #define __FUNC__ "Parser_dhDestroy" void Parser_dhDestroy(Parser_dh p) { START_FUNC_DH OptionsNode *ptr2 = p->head, *ptr1 = ptr2; if (ptr1 != NULL) { do { ptr2 = ptr2->next; FREE_DH(ptr1->name); FREE_DH(ptr1->value); FREE_DH(ptr1); ptr1 = ptr2; } while (ptr1 != NULL); } FREE_DH(p); END_FUNC_DH } #undef __FUNC__ #define __FUNC__ "Parser_dhUpdateFromFile" void Parser_dhUpdateFromFile(Parser_dh p,const char *filename) { START_FUNC_DH_2 char line[80], name[80], value[80]; FILE *fp; if ((fp = fopen(filename, "r")) == NULL) { hypre_sprintf(msgBuf_dh, "can't open >>%s<< for reading", filename); SET_INFO(msgBuf_dh); } else { hypre_sprintf(msgBuf_dh, "updating parser from file: >>%s<<", filename); SET_INFO(msgBuf_dh); while (!feof(fp)) { if (fgets(line, 80, fp) == NULL) break; if (line[0] != '#') { if (hypre_sscanf(line, "%s %s", name, value) != 2) break; Parser_dhInsert(p, name, value); } } fclose(fp); } END_FUNC_DH_2 } #undef __FUNC__ #define __FUNC__ "Parser_dhInit" void Parser_dhInit(Parser_dh p, HYPRE_Int argc, char *argv[]) { START_FUNC_DH_2 HYPRE_Int j; /* read option names and values from default database */ /* Parser_dhUpdateFromFile(p, MASTER_OPTIONS_LIST); CHECK_V_ERROR; */ init_from_default_settings_private(p); CHECK_V_ERROR; /* attempt to update from "./database" in local directory */ Parser_dhUpdateFromFile(p, "./database"); CHECK_V_ERROR; /* attempt to update from specified file */ for (j=1; jvalue, "0")) { has_switch = false; } else if (! strcmp(node->value, "false")) { has_switch = false; } else if (! strcmp(node->value, "False")) { has_switch = false; } else if (! strcmp(node->value, "FALSE")) { has_switch = false; } else { has_switch = true; } } END_FUNC_VAL_2(has_switch) } /* returns false if option isn't found, or if * its value is zero. */ #undef __FUNC__ #define __FUNC__ "Parser_dhReadInt" bool Parser_dhReadInt(Parser_dh p,const char* in, HYPRE_Int* out) { START_FUNC_DH_2 bool has_switch = false; OptionsNode *node; if (p != NULL && find(p,in,&node)) { *out = atoi(node->value); if (! strcmp(node->value, "0")) { has_switch = false; } else { has_switch = true; } } END_FUNC_VAL_2(has_switch) } #undef __FUNC__ #define __FUNC__ "Parser_dhReadDouble" bool Parser_dhReadDouble(Parser_dh p,const char* in, HYPRE_Real *out) { START_FUNC_DH_2 bool optionExists = false; OptionsNode *node; if (p != NULL && find(p,in,&node)) { *out = (HYPRE_Real)atof(node->value); optionExists = true; } END_FUNC_VAL_2(optionExists) } #undef __FUNC__ #define __FUNC__ "Parser_dhReadString" bool Parser_dhReadString(Parser_dh p,const char* in, char **out) { START_FUNC_DH_2 bool optionExists = false; OptionsNode *node; if (p != NULL && find(p,in,&node)) { *out = node->value; optionExists = true; } END_FUNC_VAL_2(optionExists) } #undef __FUNC__ #define __FUNC__ "Parser_dhPrint" void Parser_dhPrint(Parser_dh p, FILE *fp, bool allPrint) { START_FUNC_DH_2 OptionsNode *ptr = p->head; if (fp == NULL) SET_V_ERROR("fp == NULL"); if (myid_dh == 0 || allPrint) { hypre_fprintf(fp, "------------------------ registered options:\n"); if (ptr == NULL) { hypre_fprintf(fp, "Parser object is invalid; nothing to print!\n"); } else { ptr = ptr->next; while (ptr != NULL) { hypre_fprintf(fp, " %s %s\n", ptr->name, ptr->value); fflush(fp); ptr = ptr->next; } } hypre_fprintf(fp, "\n"); fflush(fp); } END_FUNC_DH_2 } #undef __FUNC__ #define __FUNC__ "Parser_dhInsert" void Parser_dhInsert(Parser_dh p,const char *option,const char *value) { START_FUNC_DH_2 OptionsNode *node; HYPRE_Int length; if (p == NULL) goto PARSER_NOT_INITED; /* if option is already in the list, update its value */ if (find(p, option,&node)) { HYPRE_Int length2 = strlen(node->value)+1; length = strlen(value)+1; if (length2 < length) { FREE_DH(node->value); node->value = (char*)MALLOC_DH(length*sizeof(char)); CHECK_V_ERROR; } strcpy(node->value, value); } /* otherwise, add a new node to the list */ else { node = p->tail; p->tail = node->next = (OptionsNode*)MALLOC_DH(sizeof(OptionsNode)); CHECK_V_ERROR; node = node->next; length = strlen(option)+1; node->name = (char*)MALLOC_DH(length*sizeof(char)); CHECK_V_ERROR; strcpy(node->name, option); length = strlen(value)+1; node->value = (char*)MALLOC_DH(length*sizeof(char)); CHECK_V_ERROR; strcpy(node->value, value); node->next = NULL; } PARSER_NOT_INITED: ; END_FUNC_DH_2 } #undef __FUNC__ #define __FUNC__ "find" bool find(Parser_dh p,const char *option, OptionsNode** ptr) { START_FUNC_DH_2 OptionsNode *tmpPtr = p->head; bool foundit = false; while (tmpPtr != NULL) { if (strcmp(tmpPtr->name,option) == 0) { foundit = true; *ptr = tmpPtr; break; } tmpPtr = tmpPtr->next; } END_FUNC_VAL_2(foundit) } #undef __FUNC__ #define __FUNC__ "init_from_default_settings_private" void init_from_default_settings_private(Parser_dh p) { START_FUNC_DH_2 /* default is to intercept certain signals (floating point error, segmentation violation, etc.) */ Parser_dhInsert(p, "-sig_dh", "1"); CHECK_V_ERROR; /* used by MetGenFD */ Parser_dhInsert(p, "-px", "1"); CHECK_V_ERROR; Parser_dhInsert(p, "-py", "1"); CHECK_V_ERROR; Parser_dhInsert(p, "-pz", "0"); CHECK_V_ERROR; Parser_dhInsert(p, "-m", "4"); CHECK_V_ERROR; Parser_dhInsert(p, "-xx_coeff", "-1.0"); CHECK_V_ERROR; Parser_dhInsert(p, "-yy_coeff", "-1.0"); CHECK_V_ERROR; Parser_dhInsert(p, "-zz_coeff", "-1.0"); CHECK_V_ERROR; Parser_dhInsert(p, "-level", "1"); CHECK_V_ERROR; Parser_dhInsert(p, "-printStats", "0"); CHECK_V_ERROR; END_FUNC_DH_2 } hypre-2.33.0/src/distributed_ls/Euclid/Parser_dh.h000066400000000000000000000053241477326011500220340ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #ifndef PARSER_DH_DH #define PARSER_DH_DH /* #include "euclid_common.h" */ extern void Parser_dhCreate(Parser_dh *p); extern void Parser_dhDestroy(Parser_dh p); extern bool Parser_dhHasSwitch(Parser_dh p, const char *in); extern bool Parser_dhReadString(Parser_dh p, const char *in, char **out); extern bool Parser_dhReadInt(Parser_dh p, const char *in, HYPRE_Int *out); extern bool Parser_dhReadDouble(Parser_dh p, const char *in, HYPRE_Real *out); /* if the flag (char *in) is found, these four return true and set "out" accordingly. If not found, they return false, and "out" is unaltered. */ extern void Parser_dhPrint(Parser_dh p, FILE *fp, bool allPrint); /* Outputs all pairs. "bool allPrint" is * only meaningful when Euclid is compiled in MPI mode */ extern void Parser_dhInsert(Parser_dh p, const char *name, const char *value); /* For inserting a new pair, or altering * the value of an existing pair from within user apps. */ extern void Parser_dhUpdateFromFile(Parser_dh p, const char *name); extern void Parser_dhInit(Parser_dh p, HYPRE_Int argc, char *argv[]); /* Init enters pairs in its internal database in the following order: (1) $PCPACK_DIR/options_database (2) "database" in local directory, if the file exists (3) "pathname/foo" if argv[] contains a pair of entries: -db_filename pathname/foo (4) flag,value pairs from the command line (ie, argv) If a flag already exists, its value is updated if it is encountered a second time. WARNING! to enter a negative value, you must use two dashes, e.g: -myvalue --0.1 otherwise, if you code "-myvalue -0.1" you will have entered the pair of entries <-myvalue, 1>, <-0.1, 1>. Yuck!@# But this works, since Euclid doesn't use negative numbers much. If the 2nd entry is missing, a value of "1" is assumed (this only works on the command line; for files, you must explicitly code a value. See $PCPACK_DIR/options_database for samples. The following will cause Parser_dhHasSwitch(p, "-phoo") to return false: -phoo 0 -phoo false -phoo False -phoo FALSE any other value, including something silly like -phoo 0.0 will return true. */ #endif hypre-2.33.0/src/distributed_ls/Euclid/README.hypre000066400000000000000000000052771477326011500217710ustar00rootroot00000000000000# Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) driver.c is the same as linear_solvers/test/IJ_linear_evolvers.c, but with added "-solver " switches for Euclid: 43=Euclid-PCG 44=Euclid-GMRES 45=Euclid-BICGSTAB ------------------------------------------------------------------- Euclid recognizes the following command-line switches: -printMemReport prints a summary of Euclid's memory usage. Useful for optimizing switches, e.g, executing: >IJ_ls -nodes 1 -solver 43 -27pt -n 40 40 40 \ -printMemReport shows a maximum dynamic allocation of 98.93 Mbytes; adding the switch "-rho 2.3" (see below) >IJ_ls -nodes 1 -solver 43 -27pt -n 40 40 40 \ -printMemReport -rho 2.3 reduces maximum allocation to 49.93 Mbytes. -eu_double preconditioner is computed in double precision; default is to use single precision. Note that single precision reduces memory requirements while making better use of the memory hierarchy; hence, it may lead to faster solution times, even if it increases iterations. -level sets the level for ILU(k) factorization; must be 0 or greater; default is 1. -sparseA controls sparsification: values in A that are smaller (in absolute value) than are discarded before factorization; default is 0.0, or no dropping. -doNotScale default behavior is to scale matrix rows so that the largest entry in each row is +1 or -1; use this switch to turn off scaling (but note that the sparsification strategy really only makes sense when rows are scaled.) -iluNONE turns off preconditioning (mainly for testing/debugging). -rho determines initial storage allocation for the ILU factors; initial allocation is (number of non-zeros in A)*rho; default is 2.0; Euclid will reallocate during factorization if initial allocation is insufficient; carefull setting of this parameter, based on previous solutions, can increase memory usage; the "ideal" value that should have been set is printed when HYPRE_ParCSREuclidPrintParams() is called. -printMat Causes both preconditioner and input matrix to be printed to files (F.trip, A.trip) in format; this is primarily for debugging, e.g, for examining preconditioner patterns using spy() in matlab. ------------------------------------------------------------------- hypre-2.33.0/src/distributed_ls/Euclid/SortedList_dh.c000066400000000000000000000270651477326011500226750ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "_hypre_Euclid.h" /* #include "SortedList_dh.h" */ /* #include "Mem_dh.h" */ /* #include "Parser_dh.h" */ /* #include "Hash_i_dh.h" */ /* #include "SubdomainGraph_dh.h" */ struct _sortedList_dh { HYPRE_Int m; /* number of local rows */ HYPRE_Int row; /* local number of row being factored */ HYPRE_Int beg_row; /* global number of first locally owned row, wrt A */ HYPRE_Int beg_rowP; /* global number of first locally owned row, wrt F */ HYPRE_Int count; /* number of items entered in the list, plus 1 (for header node) */ HYPRE_Int countMax; /* same as count, but includes number of items that my have been deleted from calling SortedList_dhEnforceConstraint() */ HYPRE_Int *o2n_local; /* not owned! */ Hash_i_dh o2n_external; /* not owned! */ SRecord *list; /* the sorted list */ HYPRE_Int alloc; /* allocated length of list */ HYPRE_Int getLower; /* index used for returning lower tri elts */ HYPRE_Int get; /* index of returning all elts; */ bool debug; }; static void lengthen_list_private(SortedList_dh sList); #undef __FUNC__ #define __FUNC__ "SortedList_dhCreate" void SortedList_dhCreate(SortedList_dh *sList) { START_FUNC_DH struct _sortedList_dh* tmp = (struct _sortedList_dh*)MALLOC_DH( sizeof(struct _sortedList_dh)); CHECK_V_ERROR; *sList = tmp; tmp->m = 0; tmp->row = -1; tmp->beg_row = 0; tmp->count = 1; tmp->countMax = 1; tmp->o2n_external = NULL; tmp->o2n_local = NULL; tmp->get = 0; tmp->getLower = 0; tmp->alloc = 0; tmp->list = NULL; tmp->debug = Parser_dhHasSwitch(parser_dh, "-debug_SortedList"); END_FUNC_DH } #undef __FUNC__ #define __FUNC__ "SortedList_dhDestroy" void SortedList_dhDestroy(SortedList_dh sList) { START_FUNC_DH if (sList->list != NULL) { FREE_DH(sList->list); CHECK_V_ERROR; } FREE_DH(sList); CHECK_V_ERROR; END_FUNC_DH } #undef __FUNC__ #define __FUNC__ "SortedList_dhInit" void SortedList_dhInit(SortedList_dh sList, SubdomainGraph_dh sg) { START_FUNC_DH sList->o2n_local = sg->o2n_col; sList->m = sg->m; sList->beg_row = sg->beg_row[myid_dh]; sList->beg_rowP = sg->beg_rowP[myid_dh]; sList->count = 1; /* "1" is for the header node */ sList->countMax = 1; /* "1" is for the header node */ sList->o2n_external = sg->o2n_ext; /* heuristic: "m" should be a good number of nodes */ sList->alloc = sList->m + 5; sList->list = (SRecord*)MALLOC_DH(sList->alloc*sizeof(SRecord)); sList->list[0].col = INT_MAX; sList->list[0].next = 0; END_FUNC_DH } #undef __FUNC__ #define __FUNC__ "SortedList_dhReset" void SortedList_dhReset(SortedList_dh sList, HYPRE_Int row) { START_FUNC_DH sList->row = row; sList->count = 1; sList->countMax = 1; sList->get = 0; sList->getLower = 0; sList->list[0].next = 0; END_FUNC_DH } #undef __FUNC__ #define __FUNC__ "SortedList_dhReadCount" HYPRE_Int SortedList_dhReadCount(SortedList_dh sList) { START_FUNC_DH END_FUNC_VAL(sList->count-1) } #undef __FUNC__ #define __FUNC__ "SortedList_dhResetGetSmallest" void SortedList_dhResetGetSmallest(SortedList_dh sList) { START_FUNC_DH sList->getLower = 0; sList->get = 0; END_FUNC_DH } #undef __FUNC__ #define __FUNC__ "SortedList_dhGetSmallest" SRecord * SortedList_dhGetSmallest(SortedList_dh sList) { START_FUNC_DH SRecord *node = NULL; SRecord *list = sList->list; HYPRE_Int get = sList->get; get = list[get].next; if (list[get].col < INT_MAX) { node = &(list[get]); sList->get = get; } END_FUNC_VAL(node) } #undef __FUNC__ #define __FUNC__ "SortedList_dhGetSmallestLowerTri" SRecord * SortedList_dhGetSmallestLowerTri(SortedList_dh sList) { START_FUNC_DH SRecord *node = NULL; SRecord *list = sList->list; HYPRE_Int getLower = sList->getLower; HYPRE_Int globalRow = sList->row + sList->beg_rowP; getLower = list[getLower].next; if (list[getLower].col < globalRow) { node = &(list[getLower]); sList->getLower = getLower; } END_FUNC_VAL(node) } #undef __FUNC__ #define __FUNC__ "SortedList_dhPermuteAndInsert" bool SortedList_dhPermuteAndInsert(SortedList_dh sList, SRecord *sr, HYPRE_Real thresh) { START_FUNC_DH bool wasInserted = false; HYPRE_Int col = sr->col; HYPRE_Real testVal = hypre_abs(sr->val); HYPRE_Int beg_row = sList->beg_row, end_row = beg_row + sList->m; HYPRE_Int beg_rowP = sList->beg_rowP; /* insertion of local indices */ if (col >= beg_row && col < end_row) { /* convert to local indexing and permute */ col -= beg_row; col = sList->o2n_local[col]; /* sparsification */ if (testVal > thresh || col == sList->row) { col += beg_rowP; } else { col = -1; /* hypre_fprintf(logFile, "local row: %i DROPPED: col= %i val= %g (thresh= %g)\n", sList->row+1, sr->col+1, testVal, thresh); */ } } /* insertion of external indices */ else { /* sparsification for external indices */ if (testVal < thresh) goto END_OF_FUNCTION; /* permute column index */ if (sList->o2n_external == NULL) { col = -1; } else { HYPRE_Int tmp = Hash_i_dhLookup(sList->o2n_external, col); CHECK_ERROR(-1); if (tmp == -1) { col = -1; } else { col = tmp; } } } if (col != -1) { sr->col = col; SortedList_dhInsert(sList, sr); CHECK_ERROR(-1); wasInserted = true; } END_OF_FUNCTION: ; END_FUNC_VAL(wasInserted) } #undef __FUNC__ #define __FUNC__ "SortedList_dhInsertOrUpdate" void SortedList_dhInsertOrUpdate(SortedList_dh sList, SRecord *sr) { START_FUNC_DH SRecord *node = SortedList_dhFind(sList, sr); CHECK_V_ERROR; if (node == NULL) { SortedList_dhInsert(sList, sr); CHECK_V_ERROR; } else { node->level = MIN(sr->level, node->level); } END_FUNC_DH } /* note: this does NOT check to see if item was already inserted! */ #undef __FUNC__ #define __FUNC__ "SortedList_dhInsert" void SortedList_dhInsert(SortedList_dh sList, SRecord *sr) { START_FUNC_DH HYPRE_Int prev, next; HYPRE_Int ct, col = sr->col; SRecord *list = sList->list; /* lengthen list if out of space */ if (sList->countMax == sList->alloc) { lengthen_list_private(sList); CHECK_V_ERROR; list = sList->list; } /* add new node to end of list */ ct = sList->countMax; sList->countMax += 1; sList->count += 1; list[ct].col = col; list[ct].level = sr->level; list[ct].val = sr->val; /* splice new node into list */ prev = 0; next = list[0].next; while (col > list[next].col) { prev = next; next = list[next].next; } list[prev].next = ct; list[ct].next = next; END_FUNC_DH } #undef __FUNC__ #define __FUNC__ "SortedList_dhFind" SRecord * SortedList_dhFind(SortedList_dh sList, SRecord *sr) { START_FUNC_DH HYPRE_Int i, count = sList->countMax; HYPRE_Int c = sr->col; SRecord *s = sList->list; SRecord *node = NULL; /* no need to traverse list in sorted order */ for (i=1; ilist; HYPRE_Int size = sList->alloc = 2*sList->alloc; SET_INFO("lengthening list"); sList->list = (SRecord*)MALLOC_DH(size * sizeof(SRecord)); hypre_TMemcpy(sList->list, tmp, SRecord, sList->countMax, HYPRE_MEMORY_HOST, HYPRE_MEMORY_HOST); SET_INFO("doubling size of sList->list"); FREE_DH(tmp); CHECK_V_ERROR; END_FUNC_DH } /*===================================================================== * functions for enforcing subdomain constraint *=====================================================================*/ static bool check_constraint_private(SubdomainGraph_dh sg, HYPRE_Int thisSubdomain, HYPRE_Int col); void delete_private(SortedList_dh sList, HYPRE_Int col); #undef __FUNC__ #define __FUNC__ "SortedList_dhEnforceConstraint" void SortedList_dhEnforceConstraint(SortedList_dh sList, SubdomainGraph_dh sg) { START_FUNC_DH HYPRE_Int thisSubdomain = myid_dh; HYPRE_Int col, count; HYPRE_Int beg_rowP = sList->beg_rowP; HYPRE_Int end_rowP = beg_rowP + sList->m; bool debug = false; if (Parser_dhHasSwitch(parser_dh, "-debug_SortedList")) debug = true; if (debug) { hypre_fprintf(logFile, "SLIST ======= enforcing constraint for row= %i\n", 1+sList->row); hypre_fprintf(logFile, "\nSLIST ---- before checking: "); count = SortedList_dhReadCount(sList); CHECK_V_ERROR; while (count--) { SRecord *sr = SortedList_dhGetSmallest(sList); CHECK_V_ERROR; hypre_fprintf(logFile, "%i ", sr->col+1); } hypre_fprintf(logFile, "\n"); sList->get = 0; } /* for each column index in the list */ count = SortedList_dhReadCount(sList); CHECK_V_ERROR; while (count--) { SRecord *sr = SortedList_dhGetSmallest(sList); CHECK_V_ERROR; col = sr->col; if (debug) { hypre_fprintf(logFile, "SLIST next col= %i\n", col+1); } /* if corresponding row is nonlocal */ if (col < beg_rowP || col >= end_rowP) { if (debug) { hypre_fprintf(logFile, "SLIST external col: %i ; ", 1+col); } /* if entry would violate subdomain constraint, discard it (snip it out of the list) */ if (check_constraint_private(sg, thisSubdomain, col)) { delete_private(sList, col); CHECK_V_ERROR; sList->count -= 1; if (debug) { hypre_fprintf(logFile, " deleted\n"); } } else { if (debug) { hypre_fprintf(logFile, " kept\n"); } } } } sList->get = 0; if (debug) { hypre_fprintf(logFile, "SLIST---- after checking: "); count = SortedList_dhReadCount(sList); CHECK_V_ERROR; while (count--) { SRecord *sr = SortedList_dhGetSmallest(sList); CHECK_V_ERROR; hypre_fprintf(logFile, "%i ", sr->col+1); } hypre_fprintf(logFile, "\n"); fflush(logFile); sList->get = 0; } END_FUNC_DH } /* this is similar to a function in ilu_seq.c */ #undef __FUNC__ #define __FUNC__ "check_constraint_private" bool check_constraint_private(SubdomainGraph_dh sg, HYPRE_Int p1, HYPRE_Int j) { START_FUNC_DH bool retval = false; HYPRE_Int i, p2; HYPRE_Int *nabors, count; p2 = SubdomainGraph_dhFindOwner(sg, j, true); nabors = sg->adj + sg->ptrs[p1]; count = sg->ptrs[p1+1] - sg->ptrs[p1]; for (i=0; ilist; HYPRE_Int next; /* find node preceeding the node to be snipped out */ /* 'list[curNode].next' is array index of the next node in the list */ while (list[list[curNode].next].col != col) { curNode = list[curNode].next; } /* mark node to be deleted as inactive (needed for Find()) */ next = list[curNode].next; list[next].col = -1; /* snip */ next = list[next].next; list[curNode].next = next; END_FUNC_DH } hypre-2.33.0/src/distributed_ls/Euclid/SortedList_dh.h000066400000000000000000000062461477326011500227000ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #ifndef SORTEDLIST_DH_H #define SORTEDLIST_DH_H /* for private use by mpi factorization algorithms */ /* #include "euclid_common.h" */ typedef struct _srecord { HYPRE_Int col; HYPRE_Int level; HYPRE_Real val; HYPRE_Int next; } SRecord; extern void SortedList_dhCreate(SortedList_dh *sList); extern void SortedList_dhDestroy(SortedList_dh sList); extern void SortedList_dhInit(SortedList_dh sList, SubdomainGraph_dh sg); extern void SortedList_dhEnforceConstraint(SortedList_dh sList, SubdomainGraph_dh sg); extern void SortedList_dhReset(SortedList_dh sList, HYPRE_Int row); extern HYPRE_Int SortedList_dhReadCount(SortedList_dh sList); /* returns number of records inserted since last reset */ extern void SortedList_dhResetGetSmallest(SortedList_dh sList); /* resets index used for SortedList_dhGetSmallestLowerTri(). */ extern SRecord * SortedList_dhGetSmallest(SortedList_dh sList); /* returns record with smallest column value that hasn't been retrieved via this method since last call to SortedList_dhReset() or SortedList_dhResetGetSmallest(). If all records have been retrieved, returns NULL. */ extern SRecord * SortedList_dhGetSmallestLowerTri(SortedList_dh sList); /* returns record with smallest column value that hasn't been retrieved via this method since last call to reset. Only returns records where SRecord sr.col < row (per Init). If all records have been retrieved, returns NULL. */ extern void SortedList_dhInsert(SortedList_dh sList, SRecord *sr); /* unilateral insert (does not check to see if item is already in list); does not permute sr->col; used in numeric factorization routines. */ extern void SortedList_dhInsertOrUpdateVal(SortedList_dh sList, SRecord *sr); /* unilateral insert: does not check to see if already inserted; does not permute sr->col; used in numeric factorization routines. */ extern bool SortedList_dhPermuteAndInsert(SortedList_dh sList, SRecord *sr, HYPRE_Real thresh); /* permutes sr->col, and inserts record in sorted list. Note: the contents of the passed variable "sr" may be changed. Note: this performs sparsification */ extern void SortedList_dhInsertOrUpdate(SortedList_dh sList, SRecord *sr); /* if a record with identical sr->col was inserted, updates sr->level to smallest of the two values; otherwise, inserts the record. Unlike SortedList_dhPermuteAndInsert, does not permute sr->col. Note: the contents of the passed variable "sr" may be changed. Warning: do not call SortedList_dhGetSmallestLowerTri() again until reset is called. */ extern SRecord * SortedList_dhFind(SortedList_dh sList, SRecord *sr); /* returns NULL if no record is found containing sr->col */ extern void SortedList_dhUpdateVal(SortedList_dh sList, SRecord *sr); #endif hypre-2.33.0/src/distributed_ls/Euclid/SortedSet_dh.c000066400000000000000000000042711477326011500225070ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "_hypre_Euclid.h" /* #include "SortedSet_dh.h" */ /* #include "shellSort_dh.h" */ /* #include "Mem_dh.h" */ #undef __FUNC__ #define __FUNC__ "SortedSet_dhCreate" void SortedSet_dhCreate(SortedSet_dh *ss, HYPRE_Int size) { START_FUNC_DH struct _sortedset_dh* tmp = (struct _sortedset_dh*)MALLOC_DH(sizeof(struct _sortedset_dh)); CHECK_V_ERROR; *ss= tmp; tmp->n = size; tmp->list = (HYPRE_Int*)MALLOC_DH(size*sizeof(HYPRE_Int)); CHECK_V_ERROR; tmp->count = 0; END_FUNC_DH } #undef __FUNC__ #define __FUNC__ "SortedSet_dhDestroy" void SortedSet_dhDestroy(SortedSet_dh ss) { START_FUNC_DH if (ss->list != NULL) { FREE_DH(ss->list); CHECK_V_ERROR; } FREE_DH(ss); CHECK_V_ERROR; END_FUNC_DH } #undef __FUNC__ #define __FUNC__ "SortedSet_dhInsert" void SortedSet_dhInsert(SortedSet_dh ss, HYPRE_Int idx) { START_FUNC_DH bool isInserted = false; HYPRE_Int ct = ss->count; HYPRE_Int *list = ss->list; HYPRE_Int i, n = ss->n; /* determine if item was already inserted */ for (i=0; ilist = tmp; ss->n *= 2; } list[ct] = idx; ss->count += 1; } END_FUNC_DH } #undef __FUNC__ #define __FUNC__ "SortedSet_dhGetList" void SortedSet_dhGetList(SortedSet_dh ss, HYPRE_Int **list, HYPRE_Int *count) { START_FUNC_DH shellSort_int(ss->count, ss->list); *list = ss->list; *count = ss->count; END_FUNC_DH } hypre-2.33.0/src/distributed_ls/Euclid/SortedSet_dh.h000066400000000000000000000016231477326011500225120ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #ifndef SORTED_SET_DH #define SORTED_SET_DH /* #include "euclid_common.h" */ struct _sortedset_dh { HYPRE_Int n; /* max items that can be stored */ HYPRE_Int *list; /* list of inserted elements */ HYPRE_Int count; /* the number of elements in the list */ }; extern void SortedSet_dhCreate(SortedSet_dh *ss, HYPRE_Int initialSize); extern void SortedSet_dhDestroy(SortedSet_dh ss); extern void SortedSet_dhInsert(SortedSet_dh ss, HYPRE_Int idx); extern void SortedSet_dhGetList(SortedSet_dh ss, HYPRE_Int **list, HYPRE_Int *count); #endif hypre-2.33.0/src/distributed_ls/Euclid/SubdomainGraph_dh.c000066400000000000000000001557721477326011500235130ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "_hypre_Euclid.h" /* #include "SubdomainGraph_dh.h" */ /* #include "getRow_dh.h" */ /* #include "Mem_dh.h" */ /* #include "Parser_dh.h" */ /* #include "Hash_i_dh.h" */ /* #include "mat_dh_private.h" */ /* #include "io_dh.h" */ /* #include "SortedSet_dh.h" */ /* #include "shellSort_dh.h" */ #ifndef WIN32 /* for debugging only! */ #include #endif static void init_seq_private(SubdomainGraph_dh s, HYPRE_Int blocks, bool bj, void *A); static void init_mpi_private(SubdomainGraph_dh s, HYPRE_Int blocks, bool bj, void *A); /* static void partition_metis_private(SubdomainGraph_dh s, void *A); grep for same below! */ static void allocate_storage_private(SubdomainGraph_dh s, HYPRE_Int blocks, HYPRE_Int m, bool bj); static void form_subdomaingraph_mpi_private(SubdomainGraph_dh s); static void form_subdomaingraph_seq_private(SubdomainGraph_dh s, HYPRE_Int m, void *A); static void find_all_neighbors_sym_private(SubdomainGraph_dh s, HYPRE_Int m, void *A); static void find_all_neighbors_unsym_private(SubdomainGraph_dh s, HYPRE_Int m, void *A); static void find_bdry_nodes_sym_private(SubdomainGraph_dh s, HYPRE_Int m, void* A, HYPRE_Int *interiorNodes, HYPRE_Int *bdryNodes, HYPRE_Int *interiorCount, HYPRE_Int *bdryCount); static void find_bdry_nodes_unsym_private(SubdomainGraph_dh s, HYPRE_Int m, void* A, HYPRE_Int *interiorNodes, HYPRE_Int *bdryNodes, HYPRE_Int *interiorCount, HYPRE_Int *bdryCount); static void find_bdry_nodes_seq_private(SubdomainGraph_dh s, HYPRE_Int m, void* A); /* above also forms n2o[] and o2n[] */ static void find_ordered_neighbors_private(SubdomainGraph_dh s); static void color_subdomain_graph_private(SubdomainGraph_dh s); static void adjust_matrix_perms_private(SubdomainGraph_dh s, HYPRE_Int m); #undef __FUNC__ #define __FUNC__ "SubdomainGraph_dhCreate" void SubdomainGraph_dhCreate(SubdomainGraph_dh *s) { START_FUNC_DH struct _subdomain_dh* tmp = (struct _subdomain_dh*)MALLOC_DH(sizeof(struct _subdomain_dh)); CHECK_V_ERROR; *s = tmp; tmp->blocks = 1; tmp->ptrs = tmp->adj = NULL; tmp->colors = 1; tmp->colorVec = NULL; tmp->o2n_sub = tmp->n2o_sub = NULL; tmp->beg_row = tmp->beg_rowP = NULL; tmp->bdry_count = tmp->row_count = NULL; tmp->loNabors = tmp->hiNabors = tmp->allNabors = NULL; tmp->loCount = tmp->hiCount = tmp->allCount = 0; tmp->m = 0; tmp->n2o_row = tmp->o2n_col = NULL; tmp->o2n_ext = tmp->n2o_ext = NULL; tmp->doNotColor = Parser_dhHasSwitch(parser_dh, "-doNotColor"); tmp->debug = Parser_dhHasSwitch(parser_dh, "-debug_SubGraph"); { HYPRE_Int i; for (i=0; itiming[i] = 0.0; } END_FUNC_DH } #undef __FUNC__ #define __FUNC__ "SubdomainGraph_dhDestroy" void SubdomainGraph_dhDestroy(SubdomainGraph_dh s) { START_FUNC_DH if (s->ptrs != NULL) { FREE_DH(s->ptrs); CHECK_V_ERROR; } if (s->adj != NULL) { FREE_DH(s->adj); CHECK_V_ERROR; } if (s->colorVec != NULL) { FREE_DH(s->colorVec); CHECK_V_ERROR; } if (s->o2n_sub != NULL) { FREE_DH(s->o2n_sub); CHECK_V_ERROR; } if (s->n2o_sub != NULL) { FREE_DH(s->n2o_sub); CHECK_V_ERROR; } if (s->beg_row != NULL) { FREE_DH(s->beg_row); CHECK_V_ERROR; } if (s->beg_rowP != NULL) { FREE_DH(s->beg_rowP); CHECK_V_ERROR; } if (s->row_count != NULL) { FREE_DH(s->row_count); CHECK_V_ERROR; } if (s->bdry_count != NULL) { FREE_DH(s->bdry_count); CHECK_V_ERROR; } if (s->loNabors != NULL) { FREE_DH(s->loNabors); CHECK_V_ERROR; } if (s->hiNabors != NULL) { FREE_DH(s->hiNabors); CHECK_V_ERROR; } if (s->allNabors != NULL) { FREE_DH(s->allNabors); CHECK_V_ERROR; } if (s->n2o_row != NULL) { FREE_DH(s->n2o_row); CHECK_V_ERROR; } if (s->o2n_col != NULL) { FREE_DH(s->o2n_col); CHECK_V_ERROR; } if (s->o2n_ext != NULL) { Hash_i_dhDestroy(s->o2n_ext); CHECK_V_ERROR; } if (s->n2o_ext != NULL) { Hash_i_dhDestroy(s->n2o_ext); CHECK_V_ERROR; } FREE_DH(s); CHECK_V_ERROR; END_FUNC_DH } #undef __FUNC__ #define __FUNC__ "SubdomainGraph_dhInit" void SubdomainGraph_dhInit(SubdomainGraph_dh s, HYPRE_Int blocks, bool bj, void *A) { START_FUNC_DH HYPRE_Real t1 = hypre_MPI_Wtime(); if (blocks < 1) blocks = 1; if (np_dh == 1 || blocks > 1) { s->blocks = blocks; init_seq_private(s, blocks, bj, A); CHECK_V_ERROR; } else { s->blocks = np_dh; init_mpi_private(s, np_dh, bj, A); CHECK_V_ERROR; } s->timing[TOTAL_SGT] += (hypre_MPI_Wtime() - t1); END_FUNC_DH } #undef __FUNC__ #define __FUNC__ "SubdomainGraph_dhFindOwner" HYPRE_Int SubdomainGraph_dhFindOwner(SubdomainGraph_dh s, HYPRE_Int idx, bool permuted) { START_FUNC_DH HYPRE_Int sd; HYPRE_Int *beg_row = s->beg_row; HYPRE_Int *row_count = s->row_count; HYPRE_Int owner = -1, blocks = s->blocks; if (permuted) beg_row = s->beg_rowP; /* determine the subdomain that contains "idx" */ for (sd=0; sd= beg_row[sd] && idx < beg_row[sd]+row_count[sd]) { owner = sd; break; } } if (owner == -1) { hypre_fprintf(stderr, "@@@ failed to find owner for idx = %i @@@\n", idx); hypre_fprintf(stderr, "blocks= %i\n", blocks); hypre_sprintf(msgBuf_dh, "failed to find owner for idx = %i", idx); SET_ERROR(-1, msgBuf_dh); } END_FUNC_VAL(owner) } #undef __FUNC__ #define __FUNC__ "SubdomainGraph_dhPrintStatsLong" void SubdomainGraph_dhPrintStatsLong(SubdomainGraph_dh s, FILE *fp) { START_FUNC_DH HYPRE_Int i, j, k; HYPRE_Real max = 0, min = (HYPRE_Real) INT_MAX; hypre_fprintf(fp, "\n------------- SubdomainGraph_dhPrintStatsLong -----------\n"); hypre_fprintf(fp, "colors used = %i\n", s->colors); hypre_fprintf(fp, "subdomain count = %i\n", s->blocks); hypre_fprintf(fp, "\ninterior/boundary node ratios:\n"); for (i=0; iblocks; ++i) { HYPRE_Int inNodes = s->row_count[i] - s->bdry_count[i]; HYPRE_Int bdNodes = s->bdry_count[i]; HYPRE_Real ratio; if (bdNodes == 0) { ratio = -1; } else { ratio = (HYPRE_Real)inNodes/(HYPRE_Real)bdNodes; } max = MAX(max, ratio); min = MIN(min, ratio); hypre_fprintf(fp, " P_%i: first= %3i rowCount= %3i interior= %3i bdry= %3i ratio= %0.1f\n", i, 1+s->beg_row[i], s->row_count[i], inNodes, bdNodes, ratio); } hypre_fprintf(fp, "\nmax interior/bdry ratio = %.1f\n", max); hypre_fprintf(fp, "min interior/bdry ratio = %.1f\n", min); /*----------------------------------------- * subdomain graph *-----------------------------------------*/ if (s->adj != NULL) { hypre_fprintf(fp, "\nunpermuted subdomain graph: \n"); for (i=0; iblocks; ++i) { hypre_fprintf(fp, "%i :: ", i); for (j=s->ptrs[i]; jptrs[i+1]; ++j) { hypre_fprintf(fp, "%i ", s->adj[j]); } hypre_fprintf(fp, "\n"); } } /*----------------------------------------- * subdomain permutation *-----------------------------------------*/ hypre_fprintf(fp, "\no2n subdomain permutation:\n"); for (i=0; iblocks; ++i) { hypre_fprintf(fp, " %i %i\n", i, s->o2n_sub[i]); } hypre_fprintf(fp, "\n"); if (np_dh > 1) { /*----------------------------------------- * local n2o_row permutation *-----------------------------------------*/ hypre_fprintf(fp, "\nlocal n2o_row permutation:\n "); for (i=0; irow_count[myid_dh]; ++i) { hypre_fprintf(fp, "%i ", s->n2o_row[i]); } hypre_fprintf(fp, "\n"); /*----------------------------------------- * local n2o permutation *-----------------------------------------*/ hypre_fprintf(fp, "\nlocal o2n_col permutation:\n "); for (i=0; irow_count[myid_dh]; ++i) { hypre_fprintf(fp, "%i ", s->o2n_col[i]); } hypre_fprintf(fp, "\n"); } else { /*----------------------------------------- * local n2o_row permutation *-----------------------------------------*/ hypre_fprintf(fp, "\nlocal n2o_row permutation:\n"); hypre_fprintf(fp, "--------------------------\n"); for (k=0; kblocks; ++k) { HYPRE_Int beg_row = s->beg_row[k]; HYPRE_Int end_row = beg_row + s->row_count[k]; for (i=beg_row; in2o_row[i]); } hypre_fprintf(fp, "\n"); } /*----------------------------------------- * local n2o permutation *-----------------------------------------*/ hypre_fprintf(fp, "\nlocal o2n_col permutation:\n"); hypre_fprintf(fp, "--------------------------\n"); for (k=0; kblocks; ++k) { HYPRE_Int beg_row = s->beg_row[k]; HYPRE_Int end_row = beg_row + s->row_count[k]; for (i=beg_row; io2n_col[i]); } hypre_fprintf(fp, "\n"); } } END_FUNC_DH } #undef __FUNC__ #define __FUNC__ "init_seq_private" void init_seq_private(SubdomainGraph_dh s, HYPRE_Int blocks, bool bj, void *A) { START_FUNC_DH HYPRE_Int m, n, beg_row; HYPRE_Real t1; /*------------------------------------------------------- * get number of local rows (m), global rows (n), and * global numbering of first locally owned row * (for sequential, beg_row=0 and m == n *-------------------------------------------------------*/ EuclidGetDimensions(A, &beg_row, &m, &n); CHECK_V_ERROR; s->m = n; /*------------------------------------------------------- * allocate storage for all data structures * EXCEPT s->adj and hash tables. * (but note that hash tables aren't used for sequential) *-------------------------------------------------------*/ allocate_storage_private(s,blocks,m, bj); CHECK_V_ERROR; /*------------------------------------------------------------- * Fill in: beg_row[] * beg_rowP[] * row_count[] * At this point, beg_rowP[] is a copy of beg_row[]) *-------------------------------------------------------------*/ { HYPRE_Int i; HYPRE_Int rpp = m/blocks; if (rpp*blocks < m) ++rpp; s->beg_row[0] = 0; for (i=1; ibeg_row[i] = rpp + s->beg_row[i-1]; for (i=0; irow_count[i] = rpp; s->row_count[blocks-1] = m - rpp*(blocks-1); } hypre_TMemcpy(s->beg_rowP, s->beg_row, HYPRE_Int, blocks, HYPRE_MEMORY_HOST, HYPRE_MEMORY_HOST); /*----------------------------------------------------------------- * Find all neighboring processors in subdomain graph. * This block fills in: allNabors[] *-----------------------------------------------------------------*/ /* NA for sequential! */ /*------------------------------------------------------- * Count number of interior nodes for each subdomain; * also, form permutation vector to order boundary * nodes last in each subdomain. * This block fills in: bdry_count[] * n2o_col[] * o2n_row[] *-------------------------------------------------------*/ t1 = hypre_MPI_Wtime(); if (!bj) { find_bdry_nodes_seq_private(s, m, A); CHECK_V_ERROR; } else { HYPRE_Int i; for (i=0; in2o_row[i] = i; s->o2n_col[i] = i; } } s->timing[ORDER_BDRY_SGT] += (hypre_MPI_Wtime() - t1); /*------------------------------------------------------- * Form subdomain graph, * then color and reorder subdomain graph. * This block fills in: ptr[] * adj[] * o2n_sub[] * n2o_sub[] * beg_rowP[] *-------------------------------------------------------*/ t1 = hypre_MPI_Wtime(); if (! bj) { form_subdomaingraph_seq_private(s, m, A); CHECK_V_ERROR; if (s->doNotColor) { HYPRE_Int i; printf_dh("subdomain coloring and reordering is OFF\n"); for (i=0; io2n_sub[i] = i; s->n2o_sub[i] = i; s->colorVec[i] = 0; } } else { SET_INFO("subdomain coloring and reordering is ON"); color_subdomain_graph_private(s); CHECK_V_ERROR; } } /* bj setup */ else { HYPRE_Int i; for (i=0; io2n_sub[i] = i; s->n2o_sub[i] = i; } } s->timing[FORM_GRAPH_SGT] += (hypre_MPI_Wtime() - t1); /*------------------------------------------------------- * Here's a step we DON'T do for the parallel case: * we need to adjust the matrix row and column perms * to reflect subdomain reordering (for the parallel * case, these permutation vectors are purely local and * zero-based) *-------------------------------------------------------*/ if (!bj) { adjust_matrix_perms_private(s, m); CHECK_V_ERROR; } /*------------------------------------------------------- * Build lists of lower and higher ordered neighbors. * This block fills in: loNabors[] * hiNabors[] *-------------------------------------------------------*/ /* NA for sequential */ /*------------------------------------------------------- * Exchange boundary node permutation information with * neighboring processors in the subdomain graph. * This block fills in: o2n_ext (hash table) * n2o_ext (hash table) *-------------------------------------------------------*/ /* NA for sequential */ END_FUNC_DH } #if 0 #undef __FUNC__ #define __FUNC__ "partition_metis_private" void partition_metis_private(SubdomainGraph_dh s, void *A) { START_FUNC_DH if (ignoreMe) SET_V_ERROR("not implemented"); END_FUNC_DH } #endif #undef __FUNC__ #define __FUNC__ "allocate_storage_private" void allocate_storage_private(SubdomainGraph_dh s, HYPRE_Int blocks, HYPRE_Int m, bool bj) { START_FUNC_DH if (!bj) { s->ptrs = (HYPRE_Int*)MALLOC_DH((blocks+1)*sizeof(HYPRE_Int)); CHECK_V_ERROR; s->ptrs[0] = 0; s->colorVec = (HYPRE_Int*)MALLOC_DH(blocks*sizeof(HYPRE_Int)); CHECK_V_ERROR; s->loNabors = (HYPRE_Int*)MALLOC_DH(np_dh*sizeof(HYPRE_Int)); CHECK_V_ERROR; s->hiNabors = (HYPRE_Int*)MALLOC_DH(np_dh*sizeof(HYPRE_Int)); CHECK_V_ERROR; s->allNabors = (HYPRE_Int*)MALLOC_DH(np_dh*sizeof(HYPRE_Int)); CHECK_V_ERROR; } s->n2o_row = (HYPRE_Int*)MALLOC_DH(m*sizeof(HYPRE_Int)); CHECK_V_ERROR; s->o2n_col = (HYPRE_Int*)MALLOC_DH(m*sizeof(HYPRE_Int)); CHECK_V_ERROR; /* these are probably only needed for single mpi task -- ?? */ /* nope; beg_row and row_ct are needed by ilu_mpi_bj; yuck! */ s->beg_row = (HYPRE_Int*)MALLOC_DH((blocks)*sizeof(HYPRE_Int)); CHECK_V_ERROR; s->beg_rowP = (HYPRE_Int*)MALLOC_DH((blocks)*sizeof(HYPRE_Int)); CHECK_V_ERROR; s->row_count = (HYPRE_Int*)MALLOC_DH(blocks*sizeof(HYPRE_Int)); CHECK_V_ERROR; s->bdry_count = (HYPRE_Int*)MALLOC_DH(blocks*sizeof(HYPRE_Int)); CHECK_V_ERROR; s->o2n_sub = (HYPRE_Int*)MALLOC_DH(blocks*sizeof(HYPRE_Int)); CHECK_V_ERROR; s->n2o_sub = (HYPRE_Int*)MALLOC_DH(blocks*sizeof(HYPRE_Int)); CHECK_V_ERROR; END_FUNC_DH } /*-----------------------------------------------------------------*/ #undef __FUNC__ #define __FUNC__ "init_mpi_private" void init_mpi_private(SubdomainGraph_dh s, HYPRE_Int blocks, bool bj, void *A) { START_FUNC_DH HYPRE_Int m, n, beg_row; bool symmetric; HYPRE_Real t1; symmetric = Parser_dhHasSwitch(parser_dh, "-sym"); CHECK_V_ERROR; if (Parser_dhHasSwitch(parser_dh, "-makeSymmetric")) { symmetric = true; } /*------------------------------------------------------- * get number of local rows (m), global rows (n), and * global numbering of first locally owned row *-------------------------------------------------------*/ EuclidGetDimensions(A, &beg_row, &m, &n); CHECK_V_ERROR; s->m = m; /*------------------------------------------------------- * allocate storage for all data structures * EXCEPT s->adj and hash tables. *-------------------------------------------------------*/ allocate_storage_private(s, blocks, m, bj); CHECK_V_ERROR; /*------------------------------------------------------------- * Fill in: beg_row[] * beg_rowP[] * row_count[] * At this point, beg_rowP[] is a copy of beg_row[]) *-------------------------------------------------------------*/ if (!bj) { hypre_MPI_Allgather(&beg_row, 1, HYPRE_MPI_INT, s->beg_row, 1, HYPRE_MPI_INT, comm_dh); hypre_MPI_Allgather(&m, 1, HYPRE_MPI_INT, s->row_count, 1, HYPRE_MPI_INT, comm_dh); hypre_TMemcpy(s->beg_rowP, s->beg_row, HYPRE_Int, np_dh, HYPRE_MEMORY_HOST, HYPRE_MEMORY_HOST); } else { s->beg_row[myid_dh] = beg_row; s->beg_rowP[myid_dh] = beg_row; s->row_count[myid_dh] = m; } /*----------------------------------------------------------------- * Find all neighboring processors in subdomain graph. * This block fills in: allNabors[] *-----------------------------------------------------------------*/ if (! bj) { t1 = hypre_MPI_Wtime(); if (symmetric) { find_all_neighbors_sym_private(s, m, A); CHECK_V_ERROR; } else { find_all_neighbors_unsym_private(s, m, A); CHECK_V_ERROR; } s->timing[FIND_NABORS_SGT] += (hypre_MPI_Wtime() - t1); } /*----------------------------------------------------------------- * determine which rows are boundary rows, and which are interior * rows; also, form permutation vector to order interior * nodes first within each subdomain * This block fills in: bdry_count[] * n2o_col[] * o2n_row[] *-----------------------------------------------------------------*/ t1 = hypre_MPI_Wtime(); if (!bj) { HYPRE_Int *interiorNodes, *bdryNodes; HYPRE_Int interiorCount = 0, bdryCount; HYPRE_Int *o2n = s->o2n_col, idx; HYPRE_Int i; interiorNodes = (HYPRE_Int*)MALLOC_DH(m*sizeof(HYPRE_Int)); CHECK_V_ERROR; bdryNodes = (HYPRE_Int*)MALLOC_DH(m*sizeof(HYPRE_Int)); CHECK_V_ERROR; /* divide this subdomain's rows into interior and boundary rows; the returned lists are with respect to local numbering. */ if (symmetric) { find_bdry_nodes_sym_private(s, m, A, interiorNodes, bdryNodes, &interiorCount, &bdryCount); CHECK_V_ERROR; } else { find_bdry_nodes_unsym_private(s, m, A, interiorNodes, bdryNodes, &interiorCount, &bdryCount); CHECK_V_ERROR; } /* exchange number of boundary rows with all neighbors */ hypre_MPI_Allgather(&bdryCount, 1, HYPRE_MPI_INT, s->bdry_count, 1, HYPRE_MPI_INT, comm_dh); /* form local permutation */ idx = 0; for (i=0; in2o_row); CHECK_V_ERROR; FREE_DH(interiorNodes); CHECK_V_ERROR; FREE_DH(bdryNodes); CHECK_V_ERROR; } /* bj setup */ else { HYPRE_Int *o2n = s->o2n_col, *n2o = s->n2o_row; HYPRE_Int i, m = s->m; for (i=0; itiming[ORDER_BDRY_SGT] += (hypre_MPI_Wtime() - t1); /*------------------------------------------------------- * Form subdomain graph, * then color and reorder subdomain graph. * This block fills in: ptr[] * adj[] * o2n_sub[] * n2o_sub[] * beg_rowP[] *-------------------------------------------------------*/ if (!bj) { t1 = hypre_MPI_Wtime(); form_subdomaingraph_mpi_private(s); CHECK_V_ERROR; if (s->doNotColor) { HYPRE_Int i; printf_dh("subdomain coloring and reordering is OFF\n"); for (i=0; io2n_sub[i] = i; s->n2o_sub[i] = i; s->colorVec[i] = 0; } } else { SET_INFO("subdomain coloring and reordering is ON"); color_subdomain_graph_private(s); CHECK_V_ERROR; } s->timing[FORM_GRAPH_SGT] += (hypre_MPI_Wtime() - t1); } /*------------------------------------------------------- * Build lists of lower and higher ordered neighbors. * This block fills in: loNabors[] * hiNabors[] *-------------------------------------------------------*/ if (!bj) { find_ordered_neighbors_private(s); CHECK_V_ERROR; } /*------------------------------------------------------- * Exchange boundary node permutation information with * neighboring processors in the subdomain graph. * This block fills in: o2n_ext (hash table) * n2o_ext (hash table) *-------------------------------------------------------*/ if (!bj) { t1 = hypre_MPI_Wtime(); SubdomainGraph_dhExchangePerms(s); CHECK_V_ERROR; s->timing[EXCHANGE_PERMS_SGT] += (hypre_MPI_Wtime() - t1); } END_FUNC_DH } #undef __FUNC__ #define __FUNC__ "SubdomainGraph_dhExchangePerms" void SubdomainGraph_dhExchangePerms(SubdomainGraph_dh s) { START_FUNC_DH hypre_MPI_Request *recv_req = NULL, *send_req = NULL; hypre_MPI_Status *status = NULL; HYPRE_Int *nabors = s->allNabors, naborCount = s->allCount; HYPRE_Int i, j, *sendBuf = NULL, *recvBuf = NULL, *naborIdx = NULL, nz; HYPRE_Int m = s->row_count[myid_dh]; HYPRE_Int beg_row = s->beg_row[myid_dh]; HYPRE_Int beg_rowP = s->beg_rowP[myid_dh]; HYPRE_Int *bdryNodeCounts = s->bdry_count; HYPRE_Int myBdryCount = s->bdry_count[myid_dh]; bool debug = false; HYPRE_Int myFirstBdry = m - myBdryCount; HYPRE_Int *n2o_row = s->n2o_row; Hash_i_dh n2o_table, o2n_table; if (logFile != NULL && s->debug) debug = true; /* allocate send buffer, and copy permutation info to buffer; each entry is a pair. */ sendBuf = (HYPRE_Int*)MALLOC_DH(2*myBdryCount*sizeof(HYPRE_Int)); CHECK_V_ERROR; if (debug) { hypre_fprintf(logFile, "\nSUBG myFirstBdry= %i myBdryCount= %i m= %i beg_rowP= %i\n", 1+ myFirstBdry, myBdryCount, m, 1+beg_rowP); fflush(logFile); } for (i=myFirstBdry, j=0; jn2o_ext = n2o_table; s->o2n_ext = o2n_table; /* insert non-local boundary node permutations in lookup tables */ for (i=0; iallNabors, nct = s->allCount; HYPRE_Int *idxAll = NULL; HYPRE_Int i, j, nz, *adj, *ptrs = s->ptrs; hypre_MPI_Request *recvReqs = NULL, sendReq; hypre_MPI_Status *statuses = NULL, status; /* all processors tell root how many nabors they have */ if (myid_dh == 0) { idxAll = (HYPRE_Int*)MALLOC_DH(np_dh*sizeof(HYPRE_Int)); CHECK_V_ERROR; } hypre_MPI_Gather(&nct, 1, HYPRE_MPI_INT, idxAll, 1, HYPRE_MPI_INT, 0, comm_dh); /* root counts edges in graph, and broacasts to all */ if (myid_dh == 0) { nz = 0; for (i=0; iadj = (HYPRE_Int*)MALLOC_DH(nz*sizeof(HYPRE_Int)); CHECK_V_ERROR; /* root receives adjacency lists from all processors */ if (myid_dh == 0) { recvReqs = (hypre_MPI_Request*)MALLOC_DH(np_dh*sizeof(hypre_MPI_Request)); CHECK_V_ERROR; statuses = (hypre_MPI_Status*)MALLOC_DH(np_dh*sizeof(hypre_MPI_Status)); CHECK_V_ERROR; /* first, set up row pointer array */ ptrs[0] = 0; for (j=0; jblocks; HYPRE_Int *cval, len, *adj; HYPRE_Int idx = 0, *ptrs = s->ptrs; /* allocate storage for adj[]; since this function is intended for debugging/testing, and the number of blocks should be relatively small, we'll punt and allocate the maximum possibly needed. */ adj = s->adj = (HYPRE_Int*)MALLOC_DH(blocks*blocks*sizeof(HYPRE_Int)); CHECK_V_ERROR; dense = (HYPRE_Int*)MALLOC_DH(blocks*blocks*sizeof(HYPRE_Int)); CHECK_V_ERROR; for (i=0; ibeg_row[i]; HYPRE_Int end_row = beg_row + s->row_count[i]; for (row=beg_row; row= end_row) { HYPRE_Int owner = SubdomainGraph_dhFindOwner(s, col, false); CHECK_V_ERROR; dense[i*blocks+owner] = 1; dense[owner*blocks+i] = 1; } } EuclidRestoreRow(A, row, &len, &cval, NULL); CHECK_V_ERROR; } } /* form sparse csr representation of subdomain graph from dense representation */ ptrs[0] = 0; for (i=0; iallNabors; marker = (HYPRE_Int*)MALLOC_DH(m*sizeof(HYPRE_Int)); CHECK_V_ERROR; for (i=0; ibeg_row[myid_dh]; end_row = beg_row + s->row_count[myid_dh]; for (row=beg_row; row= end_row) { HYPRE_Int owner = SubdomainGraph_dhFindOwner(s, col, false); CHECK_V_ERROR; if (! marker[owner]) { marker[owner] = 1; nabors[ct++] = owner; } } } EuclidRestoreRow(A, row, &len, &cval, NULL); CHECK_V_ERROR; } s->allCount = ct; /* hypre_fprintf(logFile, "@@@@@ allCount= %i\n", ct); */ if (marker != NULL) { FREE_DH(marker); CHECK_V_ERROR; } END_FUNC_DH } #undef __FUNC__ #define __FUNC__ "find_all_neighbors_unsym_private" void find_all_neighbors_unsym_private(SubdomainGraph_dh s, HYPRE_Int m, void *A) { HYPRE_UNUSED_VAR(m); START_FUNC_DH HYPRE_Int i, j, row, beg_row, end_row; HYPRE_Int *marker; HYPRE_Int *cval, len, idx = 0; HYPRE_Int nz, *nabors = s->allNabors, *myNabors; myNabors = (HYPRE_Int*)MALLOC_DH(np_dh*sizeof(HYPRE_Int)); CHECK_V_ERROR; marker = (HYPRE_Int*)MALLOC_DH(np_dh*sizeof(HYPRE_Int)); CHECK_V_ERROR; for (i=0; ibeg_row[myid_dh]; end_row = beg_row + s->row_count[myid_dh]; /*for each locally owned row ... */ for (row=beg_row; row= end_row) { HYPRE_Int owner = SubdomainGraph_dhFindOwner(s, col, false); CHECK_V_ERROR; /*if I've not yet done so ... */ if (! marker[owner]) { marker[owner] = 1; /*append the non-local row's owner in to the list of my nabors in the subdomain graph */ myNabors[idx++] = owner; } } } EuclidRestoreRow(A, row, &len, &cval, NULL); CHECK_V_ERROR; } /* at this point, idx = the number of my neighbors in the subdomain graph; equivalently, idx is the number of meaningfull slots in the myNabors array. -dah 1/31/06 */ /* at this point: marker[j] = 0 indicates that processor j is NOT my nabor marker[j] = 1 indicates that processor j IS my nabor however, there may be some nabors that can't be discovered in the above loop "//for each locally owned row;" this can happen if the matrix is structurally unsymmetric. -dah 1/31/06 */ /* hypre_fprintf(stderr, "[%i] marker: ", myid_dh); for (j=0; jallCount = nz; hypre_TMemcpy(nabors, myNabors, HYPRE_Int, nz, HYPRE_MEMORY_HOST, HYPRE_MEMORY_HOST); if (marker != NULL) { FREE_DH(marker); CHECK_V_ERROR; } if (myNabors != NULL) { FREE_DH(myNabors); CHECK_V_ERROR; } END_FUNC_DH } /*================================================================*/ #undef __FUNC__ #define __FUNC__ "find_bdry_nodes_sym_private" void find_bdry_nodes_sym_private(SubdomainGraph_dh s, HYPRE_Int m, void* A, HYPRE_Int *interiorNodes, HYPRE_Int *bdryNodes, HYPRE_Int *interiorCount, HYPRE_Int *bdryCount) { HYPRE_UNUSED_VAR(m); START_FUNC_DH HYPRE_Int beg_row = s->beg_row[myid_dh]; HYPRE_Int end_row = beg_row + s->row_count[myid_dh]; HYPRE_Int row, inCt = 0, bdCt = 0; HYPRE_Int j; HYPRE_Int *cval; /* determine if the row is a boundary row */ for (row=beg_row; row= end_row) { isBdry = true; break; } } EuclidRestoreRow(A, row, &len, &cval, NULL); CHECK_V_ERROR; if (isBdry) { bdryNodes[bdCt++] = row-beg_row; } else { interiorNodes[inCt++] = row-beg_row; } } *interiorCount = inCt; *bdryCount = bdCt; END_FUNC_DH } #define BDRY_NODE_TAG 42 #undef __FUNC__ #define __FUNC__ "find_bdry_nodes_unsym_private" void find_bdry_nodes_unsym_private(SubdomainGraph_dh s, HYPRE_Int m, void* A, HYPRE_Int *interiorNodes, HYPRE_Int *boundaryNodes, HYPRE_Int *interiorCount, HYPRE_Int *bdryCount) { START_FUNC_DH HYPRE_Int beg_row = s->beg_row[myid_dh]; HYPRE_Int end_row = beg_row + s->row_count[myid_dh]; HYPRE_Int i, j, row, max; HYPRE_Int *cval; HYPRE_Int *list, count; HYPRE_Int *rpIN = NULL, *rpOUT = NULL; HYPRE_Int *sendBuf, *recvBuf; HYPRE_Int *marker, inCt, bdCt; HYPRE_Int *bdryNodes, nz; HYPRE_Int sendCt, recvCt; hypre_MPI_Request *sendReq, *recvReq; hypre_MPI_Status *status; SortedSet_dh ss; SortedSet_dhCreate(&ss, m); CHECK_V_ERROR; /*----------------------------------------------------- * identify all boundary nodes possible using locally * owned adjacency lists *-----------------------------------------------------*/ for (row=beg_row; row= end_row) { isBdry = true; /* this row is a boundary node */ SortedSet_dhInsert(ss, col); CHECK_V_ERROR; /* the row "col" is also a boundary node */ } } EuclidRestoreRow(A, row, &len, &cval, NULL); CHECK_V_ERROR; if (isBdry) { SortedSet_dhInsert(ss, row); CHECK_V_ERROR; } } /*----------------------------------------------------- * scan the sorted list to determine what boundary * node information to send to whom *-----------------------------------------------------*/ sendBuf = (HYPRE_Int*)MALLOC_DH(np_dh*sizeof(HYPRE_Int)); CHECK_V_ERROR; recvBuf = (HYPRE_Int*)MALLOC_DH(np_dh*sizeof(HYPRE_Int)); CHECK_V_ERROR; rpOUT = (HYPRE_Int*)MALLOC_DH((np_dh+1)*sizeof(HYPRE_Int)); CHECK_V_ERROR; rpOUT[0] = 0; for (i=0; ibeg_row[owner] + s->row_count[owner]; /* determine the other boundary nodes that belong to owner */ while ( (i < count) && (list[i] < last) ) ++i; ++sendCt; rpOUT[sendCt] = i; sendBuf[owner] = rpOUT[sendCt]-rpOUT[sendCt-1]; } /*----------------------------------------------------- * processors tell each other how much information * each will send to whom *-----------------------------------------------------*/ hypre_MPI_Alltoall(sendBuf, 1, HYPRE_MPI_INT, recvBuf, 1, HYPRE_MPI_INT, comm_dh); CHECK_V_ERROR; /*----------------------------------------------------- * exchange boundary node information * (note that we also exchange information with ourself!) *-----------------------------------------------------*/ /* first, set up data structures to hold incoming information */ rpIN = (HYPRE_Int*)MALLOC_DH((np_dh+1)*sizeof(HYPRE_Int)); CHECK_V_ERROR; rpIN[0] = 0; nz = 0; recvCt = 0; for (i=0; iloNabors; HYPRE_Int *hiNabors = s->hiNabors; HYPRE_Int *allNabors = s->allNabors, allCount = s->allCount; HYPRE_Int loCt = 0, hiCt = 0; HYPRE_Int *o2n = s->o2n_sub; HYPRE_Int i, myNewId = o2n[myid_dh]; for (i=0; iloCount = loCt; s->hiCount = hiCt; END_FUNC_DH } #undef __FUNC__ #define __FUNC__ "color_subdomain_graph_private" void color_subdomain_graph_private(SubdomainGraph_dh s) { START_FUNC_DH HYPRE_Int i, n = np_dh; HYPRE_Int *rp = s->ptrs, *cval = s->adj; HYPRE_Int j, *marker, thisNodesColor, *colorCounter; HYPRE_Int *o2n = s->o2n_sub; HYPRE_Int *color = s->colorVec; if (np_dh == 1) n = s->blocks; marker = (HYPRE_Int*)MALLOC_DH((n+1)*sizeof(HYPRE_Int)); colorCounter = (HYPRE_Int*)MALLOC_DH((n+1)*sizeof(HYPRE_Int)); for (i=0; i<=n; ++i) { marker[i] = -1; colorCounter[i] = 0; } /*------------------------------------------------------------------ * color the nodes *------------------------------------------------------------------*/ for (i=0; io2n_sub, s->n2o_sub); CHECK_V_ERROR; /*------------------------------------------------------------------ * count the number of colors used *------------------------------------------------------------------*/ { HYPRE_Int ct = 0; for (j=0; jcolors = ct; } /*------------------------------------------------------------------ * (re)build the beg_rowP array *------------------------------------------------------------------*/ { HYPRE_Int sum = 0; for (i=0; in2o_sub[i]; s->beg_rowP[old] = sum; sum += s->row_count[old]; } } FREE_DH(marker); CHECK_V_ERROR; FREE_DH(colorCounter); CHECK_V_ERROR; END_FUNC_DH } #undef __FUNC__ #define __FUNC__ "SubdomainGraph_dhDump" void SubdomainGraph_dhDump(SubdomainGraph_dh s, char *filename) { START_FUNC_DH HYPRE_Int i; HYPRE_Int sCt = np_dh; FILE *fp; if (np_dh == 1) sCt = s->blocks; /* --------------------------------------------------------- * for seq and par runs, 1st processor prints information * that is common to all processors * ---------------------------------------------------------*/ fp=openFile_dh(filename, "w"); CHECK_V_ERROR; /* write subdomain ordering permutations */ hypre_fprintf(fp, "----- colors used\n"); hypre_fprintf(fp, "%i\n", s->colors); if (s->colorVec == NULL) { hypre_fprintf(fp, "s->colorVec == NULL\n"); } else { hypre_fprintf(fp, "----- colorVec\n"); for (i=0; icolorVec[i]); } hypre_fprintf(fp, "\n"); } if (s->o2n_sub == NULL || s->o2n_sub == NULL) { hypre_fprintf(fp, "s->o2n_sub == NULL || s->o2n_sub == NULL\n"); } else { hypre_fprintf(fp, "----- o2n_sub\n"); for (i=0; io2n_sub[i]); } hypre_fprintf(fp, "\n"); hypre_fprintf(fp, "----- n2o_sub\n"); for (i=0; in2o_sub[i]); } hypre_fprintf(fp, "\n"); } /* write begin row arrays */ if (s->beg_row == NULL || s->beg_rowP == NULL) { hypre_fprintf(fp, "s->beg_row == NULL || s->beg_rowP == NULL\n"); } else { hypre_fprintf(fp, "----- beg_row\n"); for (i=0; ibeg_row[i]); } hypre_fprintf(fp, "\n"); hypre_fprintf(fp, "----- beg_rowP\n"); for (i=0; ibeg_rowP[i]); } hypre_fprintf(fp, "\n"); } /* write row count and bdry count arrays */ if (s->row_count == NULL || s->bdry_count == NULL) { hypre_fprintf(fp, "s->row_count == NULL || s->bdry_count == NULL\n"); } else { hypre_fprintf(fp, "----- row_count\n"); for (i=0; irow_count[i]); } hypre_fprintf(fp, "\n"); hypre_fprintf(fp, "----- bdry_count\n"); for (i=0; ibdry_count[i]); } hypre_fprintf(fp, "\n"); } /* write subdomain graph */ if (s->ptrs == NULL || s->adj == NULL) { hypre_fprintf(fp, "s->ptrs == NULL || s->adj == NULL\n"); } else { HYPRE_Int j; HYPRE_Int ct; hypre_fprintf(fp, "----- subdomain graph\n"); for (i=0; iptrs[i+1] - s->ptrs[i]; if (ct) { shellSort_int(ct, s->adj+s->ptrs[i]); CHECK_V_ERROR; } for (j=s->ptrs[i]; jptrs[i+1]; ++j) { hypre_fprintf(fp, "%i ", s->adj[j]); } hypre_fprintf(fp, "\n"); } } closeFile_dh(fp); CHECK_V_ERROR; /* --------------------------------------------------------- * next print info that differs across processors for par * trials. deal with this as two cases: seq and par * ---------------------------------------------------------*/ if (s->beg_rowP == NULL) { SET_V_ERROR("s->beg_rowP == NULL; can't continue"); } if (s->row_count == NULL) { SET_V_ERROR("s->row_count == NULL; can't continue"); } if (s->o2n_sub == NULL) { SET_V_ERROR("s->o2n_sub == NULL; can't continue"); } if (np_dh == 1) { fp=openFile_dh(filename, "a"); CHECK_V_ERROR; /* write n2o_row and o2n_col */ if (s->n2o_row == NULL|| s->o2n_col == NULL) { hypre_fprintf(fp, "s->n2o_row == NULL|| s->o2n_col == NULL\n"); } else { hypre_fprintf(fp, "----- n2o_row\n"); for (i=0; im; ++i) { hypre_fprintf(fp, "%i ", 1+s->n2o_row[i]); } hypre_fprintf(fp, "\n"); #if 0 /* note: this won't match the parallel case, since parallel permutation vecs are zero-based and purely local */ hypre_fprintf(fp, "----- o2n_col\n"); for (i=0; ibeg_row[i]; HYPRE_Int er = br + s->row_count[i]; for (j=br; jo2n_col[j]); } hypre_fprintf(fp, "\n"); } hypre_fprintf(fp, "\n"); #endif } closeFile_dh(fp); CHECK_V_ERROR; } /* parallel case */ else { HYPRE_Int id = s->n2o_sub[myid_dh]; HYPRE_Int m = s->m; HYPRE_Int pe; HYPRE_Int beg_row = 0; if (s->beg_row != 0) beg_row = s->beg_row[myid_dh]; /* write n2o_row */ for (pe=0; pen2o_row[i]+beg_row); } if (id == np_dh - 1) hypre_fprintf(fp, "\n"); closeFile_dh(fp); CHECK_V_ERROR; } } #if 0 /* write o2n_col */ for (pe=0; peo2n_col[i]+beg_row); } hypre_fprintf(fp, "\n"); if (myid_dh == np_dh - 1) hypre_fprintf(fp, "\n"); closeFile_dh(fp); CHECK_V_ERROR; } } #endif } END_FUNC_DH } #undef __FUNC__ #define __FUNC__ "find_bdry_nodes_seq_private" void find_bdry_nodes_seq_private(SubdomainGraph_dh s, HYPRE_Int m, void* A) { START_FUNC_DH HYPRE_Int i, j, row, blocks = s->blocks; HYPRE_Int *cval, *tmp; tmp = (HYPRE_Int*)MALLOC_DH(m*sizeof(HYPRE_Int)); CHECK_V_ERROR; for (i=0; ibeg_row[i]; HYPRE_Int end_row = beg_row + s->row_count[i]; for (row=beg_row; row= end_row) { tmp[col] = 1; isBdry = true; } } if (isBdry) tmp[row] = 1; EuclidRestoreRow(A, row, &len, &cval, NULL); CHECK_V_ERROR; } } /*------------------------------------------ * fill in the bdry_count[] array *------------------------------------------ */ for (i=0; ibeg_row[i]; HYPRE_Int end_row = beg_row + s->row_count[i]; HYPRE_Int ct = 0; for (row=beg_row; rowbdry_count[i] = ct; } /*------------------------------------------ * form the o2n_col[] permutation *------------------------------------------ */ for (i=0; ibeg_row[i]; HYPRE_Int end_row = beg_row + s->row_count[i]; HYPRE_Int interiorIDX = beg_row; HYPRE_Int bdryIDX = end_row - s->bdry_count[i]; for (row=beg_row; rowo2n_col[row] = bdryIDX++; } else { s->o2n_col[row] = interiorIDX++; } } } /* invert permutation */ invert_perm(m, s->o2n_col, s->n2o_row); CHECK_V_ERROR; FREE_DH(tmp); CHECK_V_ERROR; END_FUNC_DH } #undef __FUNC__ #define __FUNC__ "SubdomainGraph_dhPrintSubdomainGraph" void SubdomainGraph_dhPrintSubdomainGraph(SubdomainGraph_dh s, FILE *fp) { START_FUNC_DH if (myid_dh == 0) { HYPRE_Int i, j; hypre_fprintf(fp, "\n-----------------------------------------------------\n"); hypre_fprintf(fp, "SubdomainGraph, and coloring and ordering information\n"); hypre_fprintf(fp, "-----------------------------------------------------\n"); hypre_fprintf(fp, "colors used: %i\n", s->colors); hypre_fprintf(fp, "o2n ordering vector: "); for (i=0; iblocks; ++i) hypre_fprintf(fp, "%i ", s->o2n_sub[i]); hypre_fprintf(fp, "\ncoloring vector (node, color): \n"); for (i=0; iblocks; ++i) hypre_fprintf(fp, " %i, %i\n", i, s->colorVec[i]); hypre_fprintf(fp, "\n"); hypre_fprintf(fp, "Adjacency lists:\n"); for (i=0; iblocks; ++i) { hypre_fprintf(fp, " P_%i :: ", i); for (j=s->ptrs[i]; jptrs[i+1]; ++j) { hypre_fprintf(fp, "%i ", s->adj[j]); } hypre_fprintf(fp, "\n"); } hypre_fprintf(fp, "-----------------------------------------------------\n"); } END_FUNC_DH } #undef __FUNC__ #define __FUNC__ "adjust_matrix_perms_private" void adjust_matrix_perms_private(SubdomainGraph_dh s, HYPRE_Int m) { START_FUNC_DH HYPRE_Int i, j, blocks = s->blocks; HYPRE_Int *o2n = s->o2n_col; for (i=0; ibeg_row[i]; HYPRE_Int end_row = beg_row + s->row_count[i]; HYPRE_Int adjust = s->beg_rowP[i] - s->beg_row[i]; for (j=beg_row; jo2n_col, s->n2o_row); CHECK_V_ERROR; END_FUNC_DH } #undef __FUNC__ #define __FUNC__ "SubdomainGraph_dhPrintRatios" void SubdomainGraph_dhPrintRatios(SubdomainGraph_dh s, FILE *fp) { START_FUNC_DH HYPRE_Int i; HYPRE_Int blocks = np_dh; HYPRE_Real ratio[25]; if (myid_dh == 0) { if (np_dh == 1) blocks = s->blocks; if (blocks > 25) blocks = 25; hypre_fprintf(fp, "\n"); hypre_fprintf(fp, "Subdomain interior/boundary node ratios\n"); hypre_fprintf(fp, "---------------------------------------\n"); /* compute ratios */ for (i=0; ibdry_count[i] == 0) { ratio[i] = -1; } else { ratio[i] = (HYPRE_Real)(s->row_count[i] - s->bdry_count[i])/(HYPRE_Real)s->bdry_count[i]; } } /* sort ratios */ shellSort_float(blocks, ratio); /* print ratios */ if (blocks <= 20) { /* print all ratios */ HYPRE_Int j = 0; for (i=0; itiming; fprintf_dh(fp, "\nSubdomainGraph timing report\n"); fprintf_dh(fp, "-----------------------------\n"); fprintf_dh(fp, "total setup time: %0.2f\n", timing[TOTAL_SGT]); fprintf_dh(fp, " find neighbors in subdomain graph: %0.2f\n", timing[FIND_NABORS_SGT]); fprintf_dh(fp, " locally order interiors and bdry: %0.2f\n", timing[ORDER_BDRY_SGT]); fprintf_dh(fp, " form and color subdomain graph: %0.2f\n", timing[FORM_GRAPH_SGT]); fprintf_dh(fp, " exchange bdry permutations: %0.2f\n", timing[EXCHANGE_PERMS_SGT]); fprintf_dh(fp, " everything else (should be small): %0.2f\n", timing[TOTAL_SGT] - (timing[FIND_NABORS_SGT]+ timing[ORDER_BDRY_SGT]+timing[FORM_GRAPH_SGT]+ timing[EXCHANGE_PERMS_SGT])); END_FUNC_DH } hypre-2.33.0/src/distributed_ls/Euclid/SubdomainGraph_dh.h000066400000000000000000000113461477326011500235040ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #ifndef SUBDOMAIN_GRAPH_DH #define SUBDOMAIN_GRAPH_DH /* #include "euclid_common.h" */ #define MAX_SUBDOMAIN_COLOR 100 /* could be done better: if we can't color the subdomain graph with this many colors, an error is thrown in SubdomainGraph_dhColor(). */ /* for internal timing */ #define TIMING_BINS_SG 10 enum{ TOTAL_SGT, /* total Init (setup) time */ FIND_NABORS_SGT, ORDER_BDRY_SGT, FORM_GRAPH_SGT, EXCHANGE_PERMS_SGT }; struct _subdomain_dh { HYPRE_Int blocks; /* number of subdomains */ HYPRE_Int *ptrs, *adj; /* csr structure for representing subdomain graph */ HYPRE_Int *o2n_sub; /* subdomain graph permutation; */ HYPRE_Int *n2o_sub; /* inverse permutation; */ HYPRE_Int colors; /* number of colors used for coloring the subdomain graph */ bool doNotColor; /* if true, subdomain graph is not colored and reordered */ HYPRE_Int *colorVec; /* if colorVec[i] = x, then subdomain i was colored "x". this array is probably only useful for debugging. */ HYPRE_Int *beg_row; /* global ordering of first local row owned by P_i */ HYPRE_Int *beg_rowP; /* global ordering of first local row owned by P_i after subdomain reordering */ HYPRE_Int *row_count; /* P_i owns row_count[i] local rows */ HYPRE_Int *bdry_count; /* bdry_count[i] of P_i's rows are boundary rows */ /* Nearest neighbors in subdomain graph, before reordering; "self" is not included. Not used for sequential case. */ HYPRE_Int *loNabors, loCount; HYPRE_Int *hiNabors, hiCount; HYPRE_Int *allNabors, allCount; /* permutation information for global unknowns (matrix rows) */ HYPRE_Int m; /* length of n2o_row and o2n_col */ HYPRE_Int *n2o_row; /* permutation for locally owned matrix rows */ HYPRE_Int *o2n_col; /* permutation for locally owned matrix columns */ Hash_i_dh o2n_ext; /* permutation for external columns */ Hash_i_dh n2o_ext; /* inverse permutation for external columns */ HYPRE_Real timing[TIMING_BINS_SG]; bool debug; }; extern void SubdomainGraph_dhCreate(SubdomainGraph_dh *s); extern void SubdomainGraph_dhDestroy(SubdomainGraph_dh s); extern void SubdomainGraph_dhInit(SubdomainGraph_dh s, HYPRE_Int blocks, bool bj, void *A); /* Partitions matrix A into the specified number of blocks, if there is a single MPI task; for mpi use, "blocks" must be the same as the number of mpi tasks; for sequential, it may vary. On completion, the subdomain graph will be fully formed, (all fields valid); o2n_row[] and n2o_col[] will be permutations for the locally owned portion of A such that A's interior nodes are ordered first. This function may call a partitioner, such as METIS (currently, only for sequential). On completion, "o2n" contains a natural ordering, beg_row is identical to beg_rowP, and_rowP is identical to end_rowP. if "bj" is true, the following setup steps are NOT performed: form subdomain graph; find neighbors; order boundary nodes */ extern void SubdomainGraph_dhColor(SubdomainGraph_dh s); /* Colors and orders subdomain graph; on completion, o2n[], beg_rowP[], and end_rowP[] may be altered. */ extern HYPRE_Int SubdomainGraph_dhFindOwner(SubdomainGraph_dh s, HYPRE_Int idx, bool permuted); /* Returns the subdomain block to which row idx belongs, or throws an error. If "permuted" is true, it's assumed the graph has been permuted (i.e., 'globally reordering phase' in PILU algorithm). */ extern void SubdomainGraph_dhExchangePerms(SubdomainGraph_dh s); /* exchange permutation information for external columns with nearest neighbors; caller must ensure SubdomainGraph_dhInit() has completed before calling. */ extern void SubdomainGraph_dhPrintSubdomainGraph(SubdomainGraph_dh s, FILE *fp); extern void SubdomainGraph_dhPrintStatsLong(SubdomainGraph_dh s, FILE *fp); /* similar to Short, but prints complete list of interior/bdry node ratios; also prints subdomain permutation */ extern void SubdomainGraph_dhDump(SubdomainGraph_dh s, char *filename); /* for testing */ extern void SubdomainGraph_dhPrintRatios(SubdomainGraph_dh s, FILE *fp); /* prints ratios of interior/boundary node for all subdomains */ extern void SubdomainGraph_dhPrintStats(SubdomainGraph_dh sg, FILE *fp); #endif hypre-2.33.0/src/distributed_ls/Euclid/TimeLog_dh.c000066400000000000000000000070431477326011500221330ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "_hypre_Euclid.h" /* #include "TimeLog_dh.h" */ /* #include "Timer_dh.h" */ /* #include "Mem_dh.h" */ #define MAX_TIME_MARKS 100 #define MAX_DESC_LENGTH 60 struct _timeLog_dh { HYPRE_Int first; HYPRE_Int last; HYPRE_Real time[MAX_TIME_MARKS]; char desc[MAX_TIME_MARKS][MAX_DESC_LENGTH]; Timer_dh timer; }; #undef __FUNC__ #define __FUNC__ "TimeLog_dhCreate" void TimeLog_dhCreate(TimeLog_dh *t) { START_FUNC_DH HYPRE_Int i; struct _timeLog_dh* tmp = (struct _timeLog_dh*)MALLOC_DH(sizeof(struct _timeLog_dh)); CHECK_V_ERROR; *t = tmp; tmp->first = tmp->last = 0; Timer_dhCreate(&tmp->timer); for (i=0; idesc[i], "X"); END_FUNC_DH } #undef __FUNC__ #define __FUNC__ "TimeLog_dhDestroy" void TimeLog_dhDestroy(TimeLog_dh t) { START_FUNC_DH Timer_dhDestroy(t->timer); FREE_DH(t); END_FUNC_DH } #undef __FUNC__ #define __FUNC__ "TimeLog_dhStart" void TimeLog_dhStart(TimeLog_dh t) { START_FUNC_DH Timer_dhStart(t->timer); END_FUNC_DH } #undef __FUNC__ #define __FUNC__ "TimeLog_dhStop" void TimeLog_dhStop(TimeLog_dh t) { START_FUNC_DH Timer_dhStop(t->timer); END_FUNC_DH } #undef __FUNC__ #define __FUNC__ "TimeLog_dhMark" void TimeLog_dhMark(TimeLog_dh t, const char *desc) { START_FUNC_DH if (t->last < MAX_TIME_MARKS - 3) { /* SET_V_ERROR("overflow; please increase MAX_TIME_MARKS and recompile"); */ Timer_dhStop(t->timer); t->time[t->last] = Timer_dhReadWall(t->timer); Timer_dhStart(t->timer); hypre_sprintf(t->desc[t->last], "%s", desc); t->last += 1; } END_FUNC_DH } #undef __FUNC__ #define __FUNC__ "TimeLog_dhReset" void TimeLog_dhReset(TimeLog_dh t) { START_FUNC_DH if (t->last < MAX_TIME_MARKS - 2) { HYPRE_Real total = 0.0; HYPRE_Int i, first = t->first, last = t->last; for (i=first; itime[i]; t->time[last] = total; hypre_sprintf(t->desc[last], "========== totals, and reset ==========\n"); t->last += 1; t->first = t->last; Timer_dhStart(t->timer); } END_FUNC_DH } #undef __FUNC__ #define __FUNC__ "TimeLog_dhPrint" void TimeLog_dhPrint(TimeLog_dh t, FILE *fp, bool allPrint) { START_FUNC_DH HYPRE_Int i; HYPRE_Real total = 0.0; HYPRE_Real timeMax[MAX_TIME_MARKS]; HYPRE_Real timeMin[MAX_TIME_MARKS]; static bool wasSummed = false; if (! wasSummed) { for (i=t->first; ilast; ++i) total += t->time[i]; t->time[t->last] = total; hypre_sprintf(t->desc[t->last], "========== totals, and reset ==========\n"); t->last += 1; hypre_MPI_Allreduce(t->time, timeMax, t->last, hypre_MPI_REAL, hypre_MPI_MAX, comm_dh); hypre_MPI_Allreduce(t->time, timeMin, t->last, hypre_MPI_REAL, hypre_MPI_MIN, comm_dh); wasSummed = true; } if (fp != NULL) { if (myid_dh == 0 || allPrint) { hypre_fprintf(fp,"\n----------------------------------------- timing report\n"); hypre_fprintf(fp, "\n self max min\n"); for (i=0; ilast; ++i) { hypre_fprintf(fp, "%7.3f %7.3f %7.3f #%s\n", t->time[i], timeMax[i], timeMin[i], t->desc[i]); } fflush(fp); } } /* if (fp != NULL) */ END_FUNC_DH } hypre-2.33.0/src/distributed_ls/Euclid/TimeLog_dh.h000066400000000000000000000016261477326011500221410ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /* Euclid employs a global object: TimeLog_dh timlog_dh; for recording timing information. */ #ifndef TIMELOG_DH_DH #define TIMELOG_DH_DH /* #include "euclid_common.h" */ extern void TimeLog_dhCreate(TimeLog_dh *t); extern void TimeLog_dhDestroy(TimeLog_dh t); extern void TimeLog_dhStart(TimeLog_dh t); extern void TimeLog_dhStop(TimeLog_dh t); extern void TimeLog_dhReset(TimeLog_dh t); extern void TimeLog_dhMark(TimeLog_dh t, const char *description); extern void TimeLog_dhPrint(TimeLog_dh t, FILE *fp, bool allPrint); #endif hypre-2.33.0/src/distributed_ls/Euclid/Timer_dh.c000066400000000000000000000120571477326011500216540ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "_hypre_Euclid.h" /* #include "Timer_dh.h" */ /* #include "Mem_dh.h" */ #undef __FUNC__ #define __FUNC__ "Timer_dhCreate" void Timer_dhCreate(Timer_dh *t) { START_FUNC_DH struct _timer_dh* tmp = (struct _timer_dh*)MALLOC_DH(sizeof(struct _timer_dh)); CHECK_V_ERROR; *t = tmp; tmp->isRunning = false; tmp->begin_wall = 0.0; tmp->end_wall = 0.0; #ifdef EUCLID_TIMING tmp->sc_clk_tck = sysconf(_SC_CLK_TCK); #else tmp->sc_clk_tck = CLOCKS_PER_SEC; #endif #if defined(EUCLID_TIMING) hypre_sprintf(msgBuf_dh, "using EUCLID_TIMING; _SC_CLK_TCK = %i", (HYPRE_Int)tmp->sc_clk_tck); SET_INFO(msgBuf_dh); #elif defined(hypre_MPI_TIMING) SET_INFO("using MPI timing") #else SET_INFO("using JUNK timing") #endif END_FUNC_DH } #undef __FUNC__ #define __FUNC__ "Timer_dhDestroy" void Timer_dhDestroy(Timer_dh t) { START_FUNC_DH FREE_DH(t); END_FUNC_DH } /*------------------------------------------------------------------------------- * EUCLID_TIMING timing methods; these use times() to record * both wall and cpu time. *-------------------------------------------------------------------------------*/ #ifdef EUCLID_TIMING #undef __FUNC__ #define __FUNC__ "Timer_dhStart" void Timer_dhStart(Timer_dh t) { START_FUNC_DH t->begin_wall = times(&(t->begin_cpu)); t->isRunning = true; END_FUNC_DH } #undef __FUNC__ #define __FUNC__ "Timer_dhStop" void Timer_dhStop(Timer_dh t) { START_FUNC_DH t->end_wall = times(&(t->end_cpu)); t->isRunning = false; END_FUNC_DH } #undef __FUNC__ #define __FUNC__ "Timer_dhReadWall" HYPRE_Real Timer_dhReadWall(Timer_dh t) { START_FUNC_DH HYPRE_Real retval = 0.0; hypre_longint sc_clk_tck = t->sc_clk_tck; if (t->isRunning) t->end_wall = times(&(t->end_cpu)); retval = (HYPRE_Real)(t->end_wall - t->begin_wall) / (HYPRE_Real)sc_clk_tck; END_FUNC_VAL(retval) } #undef __FUNC__ #define __FUNC__ "Timer_dhReadCPU" HYPRE_Real Timer_dhReadCPU(Timer_dh t) { START_FUNC_DH HYPRE_Real retval; hypre_longint sc_clk_tck = t->sc_clk_tck; if (t->isRunning) t->end_wall = times(&(t->end_cpu)); retval = (HYPRE_Real)(t->end_cpu.tms_utime - t->begin_cpu.tms_utime + t->end_cpu.tms_stime - t->begin_cpu.tms_stime + t->end_cpu.tms_cutime - t->begin_cpu.tms_cutime + t->end_cpu.tms_cstime - t->begin_cpu.tms_cstime) /(HYPRE_Real)sc_clk_tck; END_FUNC_VAL(retval) } #undef __FUNC__ #define __FUNC__ "Timer_dhReadUsage" HYPRE_Real Timer_dhReadUsage(Timer_dh t) { START_FUNC_DH HYPRE_Real cpu = Timer_dhReadCPU(t); HYPRE_Real wall = Timer_dhReadWall(t); HYPRE_Real retval = 100.0*cpu/wall; END_FUNC_VAL(retval); } /*------------------------------------------------------------------------------- * Parallel timing functions; these use hypre_MPI_Wtime() to record * wall-clock time only. *-------------------------------------------------------------------------------*/ #elif defined(hypre_MPI_TIMING) #undef __FUNC__ #define __FUNC__ "Timer_dhStart" void Timer_dhStart(Timer_dh t) { START_FUNC_DH t->begin_wall = hypre_MPI_Wtime(); t->isRunning = true; END_FUNC_DH } #undef __FUNC__ #define __FUNC__ "Timer_dhStop" void Timer_dhStop(Timer_dh t) { START_FUNC_DH t->end_wall = hypre_MPI_Wtime(); t->isRunning = false; END_FUNC_DH } #undef __FUNC__ #define __FUNC__ "Timer_dhReadWall" HYPRE_Real Timer_dhReadWall(Timer_dh t) { START_FUNC_DH HYPRE_Real retval; if (t->isRunning) t->end_wall = hypre_MPI_Wtime(); retval = t->end_wall - t->begin_wall; END_FUNC_VAL(retval) } #undef __FUNC__ #define __FUNC__ "Timer_dhReadCPU" HYPRE_Real Timer_dhReadCPU(Timer_dh t) { START_FUNC_DH END_FUNC_VAL(-1.0) } #undef __FUNC__ #define __FUNC__ "Timer_dhReadUsage" HYPRE_Real Timer_dhReadUsage(Timer_dh t) { START_FUNC_DH END_FUNC_VAL(-1.0); } /*------------------------------------------------------------------------------- * junk timing methods -- these do nothing! *-------------------------------------------------------------------------------*/ #else #undef __FUNC__ #define __FUNC__ "Timer_dhStart" void Timer_dhStart(Timer_dh t) { HYPRE_UNUSED_VAR(t); START_FUNC_DH END_FUNC_DH } #undef __FUNC__ #define __FUNC__ "Timer_dhStop" void Timer_dhStop(Timer_dh t) { HYPRE_UNUSED_VAR(t); START_FUNC_DH END_FUNC_DH } #undef __FUNC__ #define __FUNC__ "Timer_dhReadWall" HYPRE_Real Timer_dhReadWall(Timer_dh t) { HYPRE_UNUSED_VAR(t); START_FUNC_DH END_FUNC_VAL(-1.0) } #undef __FUNC__ #define __FUNC__ "Timer_dhReadCPU" HYPRE_Real Timer_dhReadCPU(Timer_dh t) { HYPRE_UNUSED_VAR(t); START_FUNC_DH END_FUNC_VAL(-1.0) } #undef __FUNC__ #define __FUNC__ "Timer_dhReadUsage" HYPRE_Real Timer_dhReadUsage(Timer_dh t) { HYPRE_UNUSED_VAR(t); START_FUNC_DH END_FUNC_VAL(-1.0); } #endif hypre-2.33.0/src/distributed_ls/Euclid/Timer_dh.h000066400000000000000000000047771477326011500216730ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #ifndef TIMER_DH_H #define TIMER_DH_H /* #include "euclid_common.h" */ /*--------------------------------------------------------------*/ /* Stuph in this block isn't really needed for multi-processor * runs, since recording CPU time probably isn't useful. * if EUCLID_TIMING is defined in $PCPACK_DIR/bmake_XXX/common, * the times() function is used; * then hypre_MPI_Wtime() is used in preference to times(). * * You may need to fiddle with some of these includes, depending * on your system. Make sure and check the logFile to ensure * that CLK_TCK was properly defined. See Timer_dhCreate() * for additional details. * * if "JUNK_TIMING" is defined during compilation, timing functions * either do nothing, or return -1.0; this is primarily for debugging. */ #include "HYPRE_config.h" #ifdef EUCLID_TIMING #include #include #include #elif !defined(JUNK_TIMING) #include #ifndef WIN32 #include /* needed for sysconf(_SC_CLK_TCK) */ #endif #endif /* ??? may be needed for some compilers/platforms? #include #include #include */ /*--------------------------------------------------------------*/ struct _timer_dh { bool isRunning; hypre_longint sc_clk_tck; HYPRE_Real begin_wall; HYPRE_Real end_wall; #ifdef EUCLID_TIMING struct tms begin_cpu; struct tms end_cpu; #endif }; extern void Timer_dhCreate(Timer_dh *t); extern void Timer_dhDestroy(Timer_dh t); extern void Timer_dhStart(Timer_dh t); extern void Timer_dhStop(Timer_dh t); extern HYPRE_Real Timer_dhReadCPU(Timer_dh t); extern HYPRE_Real Timer_dhReadWall(Timer_dh t); extern HYPRE_Real Timer_dhReadUsage(Timer_dh t); /* notes: (1) unless compiled with EUCLID_TIMING defined, readCPU and readUseage return -1.0. (2) whenever start() is called, the timer is reset; you don't need to call stop() first. (3) if stop() HAS been called, the readXX functions return timings between start() and stop(); , if start() was called but not stop(), they sample the time then return; if start() was never called, they return junk. */ #endif hypre-2.33.0/src/distributed_ls/Euclid/Vec_dh.c000066400000000000000000000161101477326011500213030ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include #include "_hypre_Euclid.h" /* #include "Vec_dh.h" */ /* #include "Mem_dh.h" */ /* #include "SubdomainGraph_dh.h" */ /* #include "io_dh.h" */ #undef __FUNC__ #define __FUNC__ "Vec_dhCreate" void Vec_dhCreate(Vec_dh *v) { START_FUNC_DH struct _vec_dh* tmp = (struct _vec_dh*)MALLOC_DH(sizeof(struct _vec_dh)); CHECK_V_ERROR; *v = tmp; tmp->n = 0; tmp->vals = NULL; END_FUNC_DH } #undef __FUNC__ #define __FUNC__ "Vec_dhDestroy" void Vec_dhDestroy(Vec_dh v) { START_FUNC_DH if (v->vals != NULL) { FREE_DH(v->vals); CHECK_V_ERROR; } FREE_DH(v); CHECK_V_ERROR; END_FUNC_DH } #undef __FUNC__ #define __FUNC__ "Vec_dhInit" void Vec_dhInit(Vec_dh v, HYPRE_Int size) { START_FUNC_DH v->n = size; v->vals = (HYPRE_Real*)MALLOC_DH(size*sizeof(HYPRE_Real)); CHECK_V_ERROR; END_FUNC_DH } #undef __FUNC__ #define __FUNC__ "Vec_dhCopy" void Vec_dhCopy(Vec_dh x, Vec_dh y) { START_FUNC_DH if (x->vals == NULL) SET_V_ERROR("x->vals is NULL"); if (y->vals == NULL) SET_V_ERROR("y->vals is NULL"); if (x->n != y->n) SET_V_ERROR("x and y are different lengths"); hypre_TMemcpy(y->vals, x->vals, HYPRE_Real, x->n, HYPRE_MEMORY_HOST, HYPRE_MEMORY_HOST); END_FUNC_DH } #undef __FUNC__ #define __FUNC__ "Vec_dhDuplicate" void Vec_dhDuplicate(Vec_dh v, Vec_dh *out) { START_FUNC_DH Vec_dh tmp; HYPRE_Int size = v->n; if (v->vals == NULL) SET_V_ERROR("v->vals is NULL"); Vec_dhCreate(out); CHECK_V_ERROR; tmp = *out; tmp->n = size; tmp->vals = (HYPRE_Real*)MALLOC_DH(size*sizeof(HYPRE_Real)); CHECK_V_ERROR; END_FUNC_DH } #undef __FUNC__ #define __FUNC__ "Vec_dhSet" void Vec_dhSet(Vec_dh v, HYPRE_Real value) { START_FUNC_DH HYPRE_Int i, m = v->n; HYPRE_Real *vals = v->vals; if (v->vals == NULL) SET_V_ERROR("v->vals is NULL"); for (i=0; in; HYPRE_Real max = 0.0; HYPRE_Real *vals = v->vals; if (v->vals == NULL) SET_V_ERROR("v->vals is NULL"); for (i=0; ivals; HYPRE_Int pe, i, m = v->n; FILE *fp; if (v->vals == NULL) SET_V_ERROR("v->vals is NULL"); /*-------------------------------------------------------- * case 1: no permutation information *--------------------------------------------------------*/ if (sg == NULL) { for (pe=0; peblocks; ++i) { HYPRE_Int oldBlock = sg->n2o_sub[i]; HYPRE_Int beg_row = sg->beg_rowP[oldBlock]; HYPRE_Int end_row = beg_row + sg->row_count[oldBlock]; hypre_printf("seq: block= %i beg= %i end= %i\n", oldBlock, beg_row, end_row); for (j=beg_row; jo2n_sub[myid_dh]; for (pe=0; pe 1) { SET_V_ERROR("only implemented for a single MPI task"); } if (sg != NULL) { SET_V_ERROR("not implemented for reordered vector; ensure sg=NULL"); } io_dh_print_ebin_vec_private(v->n, 0, v->vals, NULL, NULL, NULL, filename); CHECK_V_ERROR; END_FUNC_DH } #define MAX_JUNK 200 #undef __FUNC__ #define __FUNC__ "Vec_dhRead" void Vec_dhRead(Vec_dh *vout, HYPRE_Int ignore, char *filename) { START_FUNC_DH Vec_dh tmp = 0; FILE *fp; HYPRE_Int items, n, i; HYPRE_Real *v, w; char junk[MAX_JUNK]; Vec_dhCreate(&tmp); CHECK_V_ERROR; *vout = tmp; if (np_dh > 1) { SET_V_ERROR("only implemented for a single MPI task"); } fp=openFile_dh(filename, "w"); CHECK_V_ERROR; /* skip over file lines */ if (ignore) { hypre_printf("Vec_dhRead:: ignoring following header lines:\n"); hypre_printf("--------------------------------------------------------------\n"); for (i=0; in = n; v = tmp->vals = (HYPRE_Real*)MALLOC_DH(n*sizeof(HYPRE_Real)); CHECK_V_ERROR; /* reset file, and skip over header again */ rewind(fp); rewind(fp); for (i=0; in, &tmp->vals, filename); CHECK_V_ERROR; END_FUNC_DH } hypre-2.33.0/src/distributed_ls/Euclid/Vec_dh.h000066400000000000000000000026571477326011500213230ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #ifndef VEC_DH_H #define VEC_DH_H /* #include "euclid_common.h" */ struct _vec_dh { HYPRE_Int n; HYPRE_Real *vals; }; extern void Vec_dhCreate(Vec_dh *v); extern void Vec_dhDestroy(Vec_dh v); extern void Vec_dhInit(Vec_dh v, HYPRE_Int size); /* allocates storage, but does not initialize values */ extern void Vec_dhDuplicate(Vec_dh v, Vec_dh *out); /* creates vec and allocates storage, but neither * initializes nor copies values */ extern void Vec_dhCopy(Vec_dh x, Vec_dh y); /* copies values from x to y; * y must have proper storage allocated, * e.g, through previous call to Vec_dhDuplicate, * or Vec_dhCreate and Vec_dhInit. */ extern void Vec_dhSet(Vec_dh v, HYPRE_Real value); extern void Vec_dhSetRand(Vec_dh v); extern void Vec_dhRead(Vec_dh *v, HYPRE_Int ignore, char *filename); extern void Vec_dhReadBIN(Vec_dh *v, char *filename); extern void Vec_dhPrint(Vec_dh v, SubdomainGraph_dh sg, char *filename); extern void Vec_dhPrintBIN(Vec_dh v, SubdomainGraph_dh sg, char *filename); #endif hypre-2.33.0/src/distributed_ls/Euclid/_hypre_Euclid.h000066400000000000000000002167421477326011500227100ustar00rootroot00000000000000 /*** DO NOT EDIT THIS FILE DIRECTLY (use 'headers' to generate) ***/ #ifndef hypre_EUCLID_HEADER #define hypre_EUCLID_HEADER #define USING_MPI #define HYPRE_GET_ROW #define HYPRE_MODE #define OPTIMIZED_DH #if defined(HYPRE_MODE) #include "HYPRE_parcsr_mv.h" #include "HYPRE_config.h" #include "HYPRE_distributed_matrix_mv.h" #include "_hypre_utilities.h" #elif defined(PETSC_MODE) #include "petsc_config.h" #endif #ifdef __cplusplus extern "C" { #endif /****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #ifndef EUCLID_CONF_DH #define EUCLID_CONF_DH #define MAX_MPI_TASKS 50000 #define PETSC_EUCLID_ERR_CODE PETSC_ERR_LIB /* for use in printTriples functions */ #define TRIPLES_FORMAT "%i %i %1.8e\n" /* #define TRIPLES_FORMAT "%i %i %1.19e\n" */ #undef PRIVATE_TIMING_DH /* primarily for experimental purposes; if defined, TimeLog_dh marks are entered in Mat_dh and Euclid_apply modules. */ /* top-level error handlers. redefine to do what you want, or don't use it at all. Intended usage for calling Euclid functions from main is: Euclid_dhPhoo(); ERRCHKA; */ #ifdef USING_MPI #define EUCLID_EXIT hypre_MPI_Abort(comm_dh, -1) #else #define EUCLID_EXIT exit(-1); #endif #define EXIT_NOW(msg) \ { setError_dh(msg, __FUNC__, __FILE__, __LINE__); \ ERRCHKA; \ } #define ERRCHKA \ if (errFlag_dh) { \ setError_dh("", __FUNC__, __FILE__, __LINE__); \ if (logFile != NULL) { \ printErrorMsg(logFile); \ closeLogfile_dh(); \ } \ printErrorMsg(stderr); \ if (myid_dh == 0) { \ Mem_dhPrint(mem_dh, stderr, false); \ } \ EUCLID_EXIT; \ } /* let Euclid do its thing, before handing off to PETSc; this is only used in main(), after a call to a function from the PETSc library. */ #define ERRCHKA_CHKERRA(ierr) \ if (errFlag_dh) { \ setError_dh("", __FUNC__, __FILE__, __LINE__); \ if (logFile != NULL) { \ printErrorMsg(logFile); \ hypre_fprintf(logFile, "\n[%i] ierr = %i, errFlag_dh = %i\n", myid_dh, ierr, errFlag_dh); \ closeLogfile_dh(); \ } \ printErrorMsg(stderr); \ hypre_fprintf(stderr, "\n[%i] ierr = %i, errFlag_dh = %i\n", myid_dh, ierr, errFlag_dh); \ CHKERRA(ierr); \ } #define MAX_SUBDOMAINS 20 /* The maximum number of subdomains into which the matrix may be partitioned. Rule of thumb: MAX_SUBDOMAINS >= number of threads. Note: this is only for shared-memory. */ #define PIVOT_FIX_DEFAULT 1e-3 /*--------------------------------------------------------------------- * Memory management. These macros work with functions in Mem_dh.c; * Change if you want to use some memory management and reporting schemes * other than that supplied with Euclid. These depend on the global * object "Mem_dh mem_dh" which is defined in globalObjects.c (yuck!) ---------------------------------------------------------------------*/ #undef USE_PETSC_MALLOC #ifdef USE_PETSC_MALLOC #define MALLOC_DH(s) PetscMalloc(s) #define FREE_DH(p) PetscFree(p) #else #define MALLOC_DH(s) Mem_dhMalloc(mem_dh, (s)) #define FREE_DH(p) Mem_dhFree(mem_dh, p) #endif /* The actual calls used by Mem_dh objects to allocate/free memory * from the heap. */ #define PRIVATE_MALLOC(size) ( hypre_TAlloc(char, size, HYPRE_MEMORY_HOST) ) #define PRIVATE_FREE(ptr) ( hypre_TFree(ptr, HYPRE_MEMORY_HOST) ) /*------------------ Memory management end -----------------------------*/ /* Developer's note: there must be a XXX_GET_ROW defined, e.g: #define HYPRE_GET_ROW #define PETSC_GET_ROW #define EUCLID_GET_ROW This is currently accomplished in the makefile system; If you're building an interface to a solver package, you need to write EUCLID_GET_ROW() functions: see src/getRow.c */ #endif /****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #ifndef MACROS_DH #define MACROS_DH #ifndef FMAX #define FMAX(a,b) ((FABS(a)) > (FABS(b)) ? (FABS(a)) : (FABS(b))) #endif #ifndef MAX #define MAX(a,b) ((a) > (b) ? (a) : (b)) #endif #ifndef MIN #define MIN(a,b) ((a)<(b)?(a):(b)) #endif #ifndef ABS #define ABS(x) (((x)<0)?(-(x)):(x)) #endif #ifndef FABS #define FABS(a) ((a) < 0 ? -(a) : a) #endif /* used in Mat_SEQ_PrintTriples, so matlab won't discard zeros (yuck!) */ #define _MATLAB_ZERO_ HYPRE_REAL_MIN /*---------------------------------------------------------------------- * macros for error handling everyplace except in main. *---------------------------------------------------------------------- */ /* for future expansion: should check that "ptr" points to a valid memory address, if not null. */ #define ASSERT_DH(ptr) \ { \ if (ptr == NULL) { \ hypre_sprintf(msgBuf_dh, "%s is NULL", ptr); \ SET_V_ERROR(msgBuf_dh); \ } \ } #if 0 #define CHECK_MPI_V_ERROR(errCode) \ { \ if (errCode) { \ HYPRE_Int len; \ hypre_MPI_Error_string(errCode, msgBuf_dh, &len); \ setError_dh(msgBuf_dh, __FUNC__, __FILE__, __LINE__); \ return; \ } \ } #define CHECK_MPI_ERROR(errCode) \ { \ if (errCode) { \ HYPRE_Int len; \ hypre_MPI_Error_string(errCode, msgBuf_dh, &len); \ setError_dh(msgBuf_dh, __FUNC__, __FILE__, __LINE__); \ return(errCode); \ } \ } #endif #define CHECK_MPI_V_ERROR(errCode) \ { \ if (errCode) { \ setError_dh("MPI error!", __FUNC__, __FILE__, __LINE__); \ return; \ } \ } #define CHECK_MPI_ERROR(errCode) \ { \ if (errCode) { \ setError_dh("MPI error!", __FUNC__, __FILE__, __LINE__); \ return(errCode); \ } \ } #define SET_V_ERROR(msg) \ { setError_dh(msg, __FUNC__, __FILE__, __LINE__); \ return; \ } #define SET_ERROR(retval, msg) \ { setError_dh(msg, __FUNC__, __FILE__, __LINE__); \ return (retval); \ } #define CHECK_V_ERROR \ if (errFlag_dh) { \ setError_dh("", __FUNC__, __FILE__, __LINE__); \ return; \ } #define CHECK_ERROR(retval) \ if (errFlag_dh) { \ setError_dh("", __FUNC__, __FILE__, __LINE__); \ return (retval); \ } /*---------------------------------------------------------------------- * informational macros *---------------------------------------------------------------------- */ #define SET_INFO(msg) setInfo_dh(msg, __FUNC__, __FILE__, __LINE__); /*---------------------------------------------------------------------- * macros for tracking the function call stack *---------------------------------------------------------------------- */ #ifdef OPTIMIZED_DH #define START_FUNC_DH \ dh_StartFunc(__FUNC__, __FILE__, __LINE__, 1); \ { #define END_FUNC_DH \ } \ dh_EndFunc(__FUNC__, 1); #define END_FUNC_VAL(a) \ dh_EndFunc(__FUNC__, 1); \ return a ; \ } #define START_FUNC_DH_2 /**/ #define END_FUNC_DH_2 /**/ #define END_FUNC_VAL_2(a) return a ; #else #define START_FUNC_DH \ dh_StartFunc(__FUNC__, __FILE__, __LINE__, 1); \ if (logFuncsToStderr || logFuncsToFile)\ Error_dhStartFunc(__FUNC__, __FILE__, __LINE__); \ { #define END_FUNC_DH \ dh_EndFunc(__FUNC__, 1); \ if (logFuncsToStderr || logFuncsToFile) \ Error_dhEndFunc(__FUNC__); \ return; \ } \ #define START_FUNC_DH_2 \ dh_StartFunc(__FUNC__, __FILE__, __LINE__, 2); \ if (logFuncsToStderr || logFuncsToFile)\ Error_dhStartFunc(__FUNC__, __FILE__, __LINE__); \ { #define END_FUNC_DH_2 \ dh_EndFunc(__FUNC__, 2); \ if (logFuncsToStderr || logFuncsToFile) \ Error_dhEndFunc(__FUNC__); \ return; \ } \ #define END_FUNC_VAL(retval) \ dh_EndFunc(__FUNC__, 1); \ if (logFuncsToStderr || logFuncsToFile) \ Error_dhEndFunc(__FUNC__); \ return(retval); \ } \ #define END_FUNC_VAL_2(retval) \ dh_EndFunc(__FUNC__, 2); \ if (logFuncsToStderr || logFuncsToFile) \ Error_dhEndFunc(__FUNC__); \ return(retval); \ } \ #endif #endif /* #ifndef MACROS_DH */ /****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #ifndef COMMON_DH #define COMMON_DH #include #include #include #include #include #include #include #define REAL_DH HYPRE_Real /*----------------------------------------------------------------------- * compile-time dependent includes from other libraries. * maintainer's note: this is the only place where non-Euclid * files are included. *-----------------------------------------------------------------------*/ #if ( !defined(FAKE_MPI) && defined(USING_MPI) && \ !defined(HYPRE_MODE) && !defined(PETSC_MODE) ) #include #endif #if defined(FAKE_MPI) #include "fake_mpi.h" #endif #if defined(USING_OPENMP) && !defined(HYPRE_MODE) #include #endif /*----------------------------------------------------------------------- * Euclid includes *-----------------------------------------------------------------------*/ /* #include "euclid_config.h" */ /* #include "macros_dh.h" */ /* macros for error checking, etc */ /*----------------------------------------------------------- * Euclid classes *-----------------------------------------------------------*/ typedef struct _matgenfd* MatGenFD; typedef struct _subdomain_dh* SubdomainGraph_dh; typedef struct _timer_dh* Timer_dh; typedef struct _parser_dh* Parser_dh; typedef struct _timeLog_dh* TimeLog_dh; typedef struct _mem_dh* Mem_dh; typedef struct _mat_dh* Mat_dh; typedef struct _factor_dh* Factor_dh; typedef struct _vec_dh* Vec_dh; typedef struct _numbering_dh* Numbering_dh; typedef struct _hash_dh* Hash_dh; typedef struct _hash_i_dh* Hash_i_dh; typedef struct _mpi_interface_dh* Euclid_dh; typedef struct _sortedList_dh* SortedList_dh; typedef struct _extrows_dh* ExternalRows_dh; typedef struct _stack_dh* Stack_dh; typedef struct _queue_dh* Queue_dh; typedef struct _sortedset_dh* SortedSet_dh; /* typedef struct _localPerm_dh* LocalPerm_dh; typedef struct _procGrid_dh* ProcGrid_dh; typedef struct _globalPerm_dh* GlobalPerm_dh; typedef struct _apply_dh* Apply_dh; typedef struct _externalRows_dh* ExternalRows_dh; */ /* ------------------------------------------------------------------ * Globally scoped variables, error handling functions, etc. * These are all defined in /src/globalObjects.c * ------------------------------------------------------------------*/ extern Parser_dh parser_dh; /* for setting/getting runtime options */ extern TimeLog_dh tlog_dh; /* internal timing functionality */ extern Mem_dh mem_dh; /* memory management */ extern FILE *logFile; extern HYPRE_Int np_dh; /* number of processors and subdomains */ extern HYPRE_Int myid_dh; /* rank of this processor (and subdomain) */ extern MPI_Comm comm_dh; extern bool ignoreMe; /* used to stop compiler complaints */ extern HYPRE_Int ref_counter; /* for internal use only! Reference counter to ensure that global objects are not destroyed when Euclid's destructor is called, and more than one instance of Euclid has been instantiated. */ /* Error and message handling. These are accessed through * macros defined in "macros_dh.h" */ extern bool errFlag_dh; extern void setInfo_dh(const char *msg, const char *function, const char *file, HYPRE_Int line); extern void setError_dh(const char *msg, const char *function, const char *file, HYPRE_Int line); extern void printErrorMsg(FILE *fp); #ifndef hypre_MPI_MAX_ERROR_STRING #define hypre_MPI_MAX_ERROR_STRING 256 #endif #define MSG_BUF_SIZE_DH MAX(1024, hypre_MPI_MAX_ERROR_STRING) extern char msgBuf_dh[MSG_BUF_SIZE_DH]; /* Each processor (may) open a logfile. * The bools are switches for controlling the amount of informational * output, and where it gets written to. Function trace logging is only * enabled when compiled with the debugging (-g) option. */ extern void openLogfile_dh(HYPRE_Int argc, char *argv[]); extern void closeLogfile_dh(void); extern bool logInfoToStderr; extern bool logInfoToFile; extern bool logFuncsToStderr; extern bool logFuncsToFile; extern void Error_dhStartFunc(char *function, char *file, HYPRE_Int line); extern void Error_dhEndFunc(char *function); extern void dh_StartFunc(const char *function, const char *file, HYPRE_Int line, HYPRE_Int priority); extern void dh_EndFunc(const char *function, HYPRE_Int priority); extern void printFunctionStack(FILE *fp); extern void EuclidInitialize(HYPRE_Int argc, char *argv[], char *help); /* instantiates global objects */ extern void EuclidFinalize(void); /* deletes global objects */ extern bool EuclidIsInitialized(void); extern void printf_dh(const char *fmt, ...); extern void fprintf_dh(FILE *fp, const char *fmt, ...); /* echo command line invocation to stdout. The "prefix" string is for grepping; it may be NULL. */ extern void echoInvocation_dh(MPI_Comm comm, char *prefix, HYPRE_Int argc, char *argv[]); #endif /****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /* for internal use */ #ifndef EXTERNAL_ROWS_DH_H #define EXTERNAL_ROWS_DH_H /* #include "euclid_common.h" */ extern void ExternalRows_dhCreate(ExternalRows_dh *er); extern void ExternalRows_dhDestroy(ExternalRows_dh er); extern void ExternalRows_dhInit(ExternalRows_dh er, Euclid_dh ctx); extern void ExternalRows_dhRecvRows(ExternalRows_dh extRows); extern void ExternalRows_dhSendRows(ExternalRows_dh extRows); extern void ExternalRows_dhGetRow(ExternalRows_dh er, HYPRE_Int globalRow, HYPRE_Int *len, HYPRE_Int **cval, HYPRE_Int **fill, REAL_DH **aval); struct _extrows_dh { SubdomainGraph_dh sg; /* not owned! */ Factor_dh F; /* not owned! */ hypre_MPI_Status status[MAX_MPI_TASKS]; hypre_MPI_Request req1[MAX_MPI_TASKS]; hypre_MPI_Request req2[MAX_MPI_TASKS]; hypre_MPI_Request req3[MAX_MPI_TASKS]; hypre_MPI_Request req4[MAX_MPI_TASKS]; hypre_MPI_Request cval_req[MAX_MPI_TASKS]; hypre_MPI_Request fill_req[MAX_MPI_TASKS]; hypre_MPI_Request aval_req[MAX_MPI_TASKS]; /*------------------------------------------------------------------------ * data structures for receiving, storing, and accessing external rows * from lower-ordered nabors *------------------------------------------------------------------------*/ /* for reception of row counts, row numbers, and row lengths: */ HYPRE_Int rcv_row_counts[MAX_MPI_TASKS]; /* P_i will send rcv_row_counts[i] rows */ HYPRE_Int rcv_nz_counts[MAX_MPI_TASKS]; /* P_i's rows contain rcv_nz_counts[i] nonzeros */ HYPRE_Int *rcv_row_lengths[MAX_MPI_TASKS]; /* rcv_row_lengths[i][] lists the length of each row */ HYPRE_Int *rcv_row_numbers[MAX_MPI_TASKS]; /* rcv_row_lengths[i][] lists the length of each row */ /* for reception of the actual rows: */ HYPRE_Int *cvalExt; HYPRE_Int *fillExt; REAL_DH *avalExt; /* table for accessing the rows */ Hash_dh rowLookup; /*-------------------------------------------------------------------------- * data structures for sending boundary rows to higher-ordered nabors *--------------------------------------------------------------------------*/ /* for sending row counts, numbers, and lengths: */ HYPRE_Int *my_row_counts; /* my_row_counts[i] = nzcount in upper tri portion o */ HYPRE_Int *my_row_numbers; /* my_row_numbers[i] = global row number of local ro */ /* for sending the actual rows: */ HYPRE_Int nzSend; /* total entries in upper tri portions of bdry rows */ HYPRE_Int *cvalSend; HYPRE_Int *fillSend; REAL_DH *avalSend; bool debug; }; #endif /****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #ifndef FACTOR_DH #define FACTOR_DH /* #include "euclid_common.h" */ struct _factor_dh { /* dimensions of local rectangular submatrix; global matrix is n*n */ HYPRE_Int m, n; HYPRE_Int id; /* this subdomain's id after reordering */ HYPRE_Int beg_row; /* global number of 1st locally owned row */ HYPRE_Int first_bdry; /* local number of first boundary row */ HYPRE_Int bdry_count; /* m - first_boundary */ /* if true, factorization was block jacobi, in which case all column indices are zero-based; else, they are global. */ bool blockJacobi; /* sparse row-oriented storage for locally owned submatrix */ HYPRE_Int *rp; HYPRE_Int *cval; REAL_DH *aval; HYPRE_Int *fill; HYPRE_Int *diag; HYPRE_Int alloc; /* currently allocated length of cval, aval, and fill arrays */ /* used for PILU solves (Apply) */ HYPRE_Int num_recvLo, num_recvHi; HYPRE_Int num_sendLo, num_sendHi; /* used in destructor */ HYPRE_Real *work_y_lo; /* recv values from lower nabors; also used as work vector when solving Ly=b for y. */ HYPRE_Real *work_x_hi; /* recv values from higher nabors; also used as work vector when solving Ux=y for x. */ HYPRE_Real *sendbufLo, *sendbufHi; HYPRE_Int *sendindLo, *sendindHi; HYPRE_Int sendlenLo, sendlenHi; bool solveIsSetup; Numbering_dh numbSolve; hypre_MPI_Request recv_reqLo[MAX_MPI_TASKS], recv_reqHi[MAX_MPI_TASKS]; /* used for persistent comms */ hypre_MPI_Request send_reqLo[MAX_MPI_TASKS], send_reqHi[MAX_MPI_TASKS]; /* used for persistent comms */ hypre_MPI_Request requests[MAX_MPI_TASKS]; hypre_MPI_Status status[MAX_MPI_TASKS]; bool debug; }; extern void Factor_dhCreate(Factor_dh *mat); extern void Factor_dhDestroy(Factor_dh mat); extern void Factor_dhTranspose(Factor_dh matIN, Factor_dh *matOUT); extern void Factor_dhInit(void *A, bool fillFlag, bool avalFlag, HYPRE_Real rho, HYPRE_Int id, HYPRE_Int beg_rowP, Factor_dh *F); extern void Factor_dhReallocate(Factor_dh F, HYPRE_Int used, HYPRE_Int additional); /* ensures fill, cval, and aval arrays can accomodate at least "c" additional entrie */ /* adopted from ParaSails, by Edmond Chow */ extern void Factor_dhSolveSetup(Factor_dh mat, SubdomainGraph_dh sg); extern void Factor_dhSolve(HYPRE_Real *rhs, HYPRE_Real *lhs, Euclid_dh ctx); extern void Factor_dhSolveSeq(HYPRE_Real *rhs, HYPRE_Real *lhs, Euclid_dh ctx); /* functions for monitoring stability */ extern HYPRE_Real Factor_dhCondEst(Factor_dh mat, Euclid_dh ctx); extern HYPRE_Real Factor_dhMaxValue(Factor_dh mat); extern HYPRE_Real Factor_dhMaxPivotInverse(Factor_dh mat); extern HYPRE_Int Factor_dhReadNz(Factor_dh mat); extern void Factor_dhPrintTriples(Factor_dh mat, char *filename); extern void Factor_dhPrintGraph(Factor_dh mat, char *filename); /* seq only */ extern void Factor_dhPrintDiags(Factor_dh mat, FILE *fp); extern void Factor_dhPrintRows(Factor_dh mat, FILE *fp); /* prints local matrix to logfile, if open */ #endif /****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #ifndef VEC_DH_H #define VEC_DH_H /* #include "euclid_common.h" */ struct _vec_dh { HYPRE_Int n; HYPRE_Real *vals; }; extern void Vec_dhCreate(Vec_dh *v); extern void Vec_dhDestroy(Vec_dh v); extern void Vec_dhInit(Vec_dh v, HYPRE_Int size); /* allocates storage, but does not initialize values */ extern void Vec_dhDuplicate(Vec_dh v, Vec_dh *out); /* creates vec and allocates storage, but neither * initializes nor copies values */ extern void Vec_dhCopy(Vec_dh x, Vec_dh y); /* copies values from x to y; * y must have proper storage allocated, * e.g, through previous call to Vec_dhDuplicate, * or Vec_dhCreate and Vec_dhInit. */ extern void Vec_dhSet(Vec_dh v, HYPRE_Real value); extern void Vec_dhSetRand(Vec_dh v); extern void Vec_dhRead(Vec_dh *v, HYPRE_Int ignore, char *filename); extern void Vec_dhReadBIN(Vec_dh *v, char *filename); extern void Vec_dhPrint(Vec_dh v, SubdomainGraph_dh sg, char *filename); extern void Vec_dhPrintBIN(Vec_dh v, SubdomainGraph_dh sg, char *filename); #endif /****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #ifndef MATGENFD_DH_DH #define MATGENFD_DH_DH /*===================================================================== option summary: --------------- processor topology -px -py -pz defaults: -px 1 -py 1 -pz 0 grid topology -m if pz=0, each processor has a square grid of dimension m*m, hence there are m*m*px*py unknowns. if pz > 0, each local grid is of dimension m*m*m, hence there are m*m*m*px*py*pz unknowns. diffusion coefficients (default is 1.0): -dx -dy -dz convection coefficients (default is 0.0) -cx -cy -cz grid dimension; if more than one mpi process, this is the local size for each processor: -m boundary conditions: This is very primitive; boundary conditions can only be generated for 2D grids; the condition along each side is either dirichlet (constant), if bcXX >= 0, or neuman, if bcXX < 0. -bcx1 -bcx2 -bcy1 -bcy2 Misc. -debug_matgen -striped (may not work?) =====================================================================*/ /* #include "euclid_common.h" */ struct _matgenfd { bool allocateMem; /* If true, memory is allocated when run() is called, in which case * the caller is responsible for calling FREE_DH for the rp, cval, * aval, and rhs arrays. If false, caller is assumed to have * allocated memory when run is called. * Default is "true" */ HYPRE_Int px, py, pz; /* Processor graph dimensions */ bool threeD; HYPRE_Int m; /* number of matrix rows in local matrix */ HYPRE_Int cc; /* Dimension of each processor's subgrid */ HYPRE_Real hh; /* Grid spacing; this is constant, equal to 1.0/(px*cc-1) */ HYPRE_Int id; /* the processor whose submatrix is to be generated */ HYPRE_Int np; /* number of subdomains (processors, mpi tasks) */ HYPRE_Real stencil[8]; /* derivative coefficients; a,b,c are 2nd derivatives, * c,d,e are 1st derivatives; f,g,h not currently used. */ HYPRE_Real a, b, c, d, e, f, g, h; HYPRE_Int first; /* global number of first locally owned row */ bool debug; /* boundary conditions; if value is < 0, neumen; else, dirichelet */ HYPRE_Real bcX1, bcX2; HYPRE_Real bcY1, bcY2; HYPRE_Real bcZ1, bcZ2; /* The following return coefficients; default is konstant() */ HYPRE_Real (*A)(HYPRE_Real coeff, HYPRE_Real x, HYPRE_Real y, HYPRE_Real z); HYPRE_Real (*B)(HYPRE_Real coeff, HYPRE_Real x, HYPRE_Real y, HYPRE_Real z); HYPRE_Real (*C)(HYPRE_Real coeff, HYPRE_Real x, HYPRE_Real y, HYPRE_Real z); HYPRE_Real (*D)(HYPRE_Real coeff, HYPRE_Real x, HYPRE_Real y, HYPRE_Real z); HYPRE_Real (*E)(HYPRE_Real coeff, HYPRE_Real x, HYPRE_Real y, HYPRE_Real z); HYPRE_Real (*F)(HYPRE_Real coeff, HYPRE_Real x, HYPRE_Real y, HYPRE_Real z); HYPRE_Real (*G)(HYPRE_Real coeff, HYPRE_Real x, HYPRE_Real y, HYPRE_Real z); HYPRE_Real (*H)(HYPRE_Real coeff, HYPRE_Real x, HYPRE_Real y, HYPRE_Real z); }; extern void MatGenFD_Create(MatGenFD *mg); extern void MatGenFD_Destroy(MatGenFD mg); extern void MatGenFD_Run(MatGenFD mg, HYPRE_Int id, HYPRE_Int np, Mat_dh *A, Vec_dh *rhs); /* =========== coefficient functions ============== */ extern HYPRE_Real konstant(HYPRE_Real coeff, HYPRE_Real x, HYPRE_Real y, HYPRE_Real z); extern HYPRE_Real e2_xy(HYPRE_Real coeff, HYPRE_Real x, HYPRE_Real y, HYPRE_Real z); /* 3 boxes nested inside the unit square domain. diffusivity constants are: -dd1, -dd2, -dd3. */ /* box placement */ #define BOX1_X1 0.1 #define BOX1_X2 0.4 #define BOX1_Y1 0.1 #define BOX1_Y2 0.4 #define BOX2_X1 0.6 #define BOX2_X2 0.9 #define BOX2_Y1 0.1 #define BOX2_Y2 0.4 #define BOX3_X1 0.2 #define BOX3_X2 0.8 #define BOX3_Y1 0.6 #define BOX3_Y2 0.8 /* default diffusivity */ #define BOX1_DD 10 #define BOX2_DD 100 #define BOX3_DD 50 extern HYPRE_Real box_1(HYPRE_Real coeff, HYPRE_Real x, HYPRE_Real y, HYPRE_Real z); /* -bd2 is diffusion coeff outside box; -bd1 is diffusion coeff inside box. */ extern HYPRE_Real box_2(HYPRE_Real coeff, HYPRE_Real x, HYPRE_Real y, HYPRE_Real z); #endif /****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #ifndef MAT_DH_DH #define MAT_DH_DH /* #include "euclid_common.h" */ /* this stuff for experimental internal timing */ #define MAT_DH_BINS 10 #define MATVEC_TIME 0 /* time to actually perform matvec */ #define MATVEC_MPI_TIME 1 /* time for comms + vector copying needed */ #define MATVEC_MPI_TIME2 5 /* time for comms, + vector copying needed */ #define MATVEC_TOTAL_TIME 2 /* MATVEC_TIME+MATVEC_MPI_TIME */ #define MATVEC_RATIO 3 /* computation/communication ratio */ #define MATVEC_WORDS 4 /* total words sent to other procs. */ struct _mat_dh { HYPRE_Int m, n; /* dimensions of local rectangular submatrix; * the global matrix is n by n. */ HYPRE_Int beg_row; /* global number of 1st locally owned row */ HYPRE_Int bs; /* block size */ /* sparse row-oriented storage for locally owned submatrix */ HYPRE_Int *rp; HYPRE_Int *len; /* length of each row; only used for MPI triangular solves */ HYPRE_Int *cval; HYPRE_Int *fill; HYPRE_Int *diag; HYPRE_Real *aval; bool owner; /* for MPI triangular solves */ /* working space for getRow */ HYPRE_Int len_private; HYPRE_Int rowCheckedOut; HYPRE_Int *cval_private; HYPRE_Real *aval_private; /* row permutations to increase positive definiteness */ HYPRE_Int *row_perm; /* for timing matvecs in experimental studies */ HYPRE_Real time[MAT_DH_BINS]; HYPRE_Real time_max[MAT_DH_BINS]; HYPRE_Real time_min[MAT_DH_BINS]; bool matvec_timing; /* used for MatVecs */ HYPRE_Int num_recv; HYPRE_Int num_send; /* used in destructor */ hypre_MPI_Request *recv_req; hypre_MPI_Request *send_req; HYPRE_Real *recvbuf, *sendbuf; HYPRE_Int *sendind; HYPRE_Int sendlen; HYPRE_Int recvlen; bool matvecIsSetup; Numbering_dh numb; hypre_MPI_Status *status; bool debug; }; extern void Mat_dhCreate(Mat_dh *mat); extern void Mat_dhDestroy(Mat_dh mat); extern void Mat_dhTranspose(Mat_dh matIN, Mat_dh *matOUT); extern void Mat_dhMakeStructurallySymmetric(Mat_dh A); /* adopted from ParaSails, by Edmond Chow */ extern void Mat_dhMatVecSetup(Mat_dh mat); extern void Mat_dhMatVecSetdown(Mat_dh mat); /*========================================================================*/ /* notes: if not compiled with OpenMP, Mat_dhMatVec() and Mat_dhMatVec_omp() perform identically; similarly for Mat_dhMatVec_uni() and Mat_dhMatVec_uni_omp() */ extern void Mat_dhMatVec(Mat_dh mat, HYPRE_Real *lhs, HYPRE_Real *rhs); /* unthreaded MPI version */ extern void Mat_dhMatVec_omp(Mat_dh mat, HYPRE_Real *lhs, HYPRE_Real *rhs); /* OpenMP/MPI version */ extern void Mat_dhMatVec_uni(Mat_dh mat, HYPRE_Real *lhs, HYPRE_Real *rhs); /* unthreaded, single-task version */ extern void Mat_dhMatVec_uni_omp(Mat_dh mat, HYPRE_Real *lhs, HYPRE_Real *rhs); /* OpenMP/single primary task version */ extern HYPRE_Int Mat_dhReadNz(Mat_dh mat); /* for next five, SubdomainGraph_dh() may be NULL; if not null, caller must ensure it has been properly initialized; if not null, matrix is permuted before printing. note: use "-matlab" when calling Mat_dhPrintTriples, to insert small value in place of 0. Mat_dhPrintCSR only implemented for single cpu, no reordering. */ extern void Mat_dhPrintGraph(Mat_dh mat, SubdomainGraph_dh sg, FILE *fp); extern void Mat_dhPrintRows(Mat_dh mat, SubdomainGraph_dh sg, FILE *fp); extern void Mat_dhPrintCSR(Mat_dh mat, SubdomainGraph_dh sg, char *filename); extern void Mat_dhPrintTriples(Mat_dh mat, SubdomainGraph_dh sg, char *filename); extern void Mat_dhPrintBIN(Mat_dh mat, SubdomainGraph_dh sg, char *filename); extern void Mat_dhReadCSR(Mat_dh *mat, char *filename); extern void Mat_dhReadTriples(Mat_dh *mat, HYPRE_Int ignore, char *filename); extern void Mat_dhReadBIN(Mat_dh *mat, char *filename); extern void Mat_dhPermute(Mat_dh Ain, HYPRE_Int *pIN, Mat_dh *Bout); /* for single cpu only! */ extern void Mat_dhFixDiags(Mat_dh A); /* inserts diagonal if not explicitly present; sets diagonal value in row i to sum of absolute values of all elts in row i. */ extern void Mat_dhPrintDiags(Mat_dh A, FILE *fp); extern void Mat_dhGetRow(Mat_dh B, HYPRE_Int globalRow, HYPRE_Int *len, HYPRE_Int **ind, HYPRE_Real **val); extern void Mat_dhRestoreRow(Mat_dh B, HYPRE_Int row, HYPRE_Int *len, HYPRE_Int **ind, HYPRE_Real **val); /* partition matrix into "k" blocks. User must free storage. */ extern void Mat_dhPartition(Mat_dh mat, HYPRE_Int k, HYPRE_Int **beg_rowOUT, HYPRE_Int **row_countOUT, HYPRE_Int **n2oOUT, HYPRE_Int **o2nOUT); extern void Mat_dhZeroTiming(Mat_dh mat); extern void Mat_dhReduceTiming(Mat_dh mat); extern void Mat_dhRowPermute(Mat_dh); extern void dldperm(HYPRE_Int job, HYPRE_Int n, HYPRE_Int nnz, HYPRE_Int colptr[], HYPRE_Int adjncy[], HYPRE_Real nzval[], HYPRE_Int *perm, HYPRE_Real u[], HYPRE_Real v[]); #endif /****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #ifndef SUBDOMAIN_GRAPH_DH #define SUBDOMAIN_GRAPH_DH /* #include "euclid_common.h" */ #define MAX_SUBDOMAIN_COLOR 100 /* could be done better: if we can't color the subdomain graph with this many colors, an error is thrown in SubdomainGraph_dhColor(). */ /* for internal timing */ #define TIMING_BINS_SG 10 enum{ TOTAL_SGT, /* total Init (setup) time */ FIND_NABORS_SGT, ORDER_BDRY_SGT, FORM_GRAPH_SGT, EXCHANGE_PERMS_SGT }; struct _subdomain_dh { HYPRE_Int blocks; /* number of subdomains */ HYPRE_Int *ptrs, *adj; /* csr structure for representing subdomain graph */ HYPRE_Int *o2n_sub; /* subdomain graph permutation; */ HYPRE_Int *n2o_sub; /* inverse permutation; */ HYPRE_Int colors; /* number of colors used for coloring the subdomain graph */ bool doNotColor; /* if true, subdomain graph is not colored and reordered */ HYPRE_Int *colorVec; /* if colorVec[i] = x, then subdomain i was colored "x". this array is probably only useful for debugging. */ HYPRE_Int *beg_row; /* global ordering of first local row owned by P_i */ HYPRE_Int *beg_rowP; /* global ordering of first local row owned by P_i after subdomain reordering */ HYPRE_Int *row_count; /* P_i owns row_count[i] local rows */ HYPRE_Int *bdry_count; /* bdry_count[i] of P_i's rows are boundary rows */ /* Nearest neighbors in subdomain graph, before reordering; "self" is not included. Not used for sequential case. */ HYPRE_Int *loNabors, loCount; HYPRE_Int *hiNabors, hiCount; HYPRE_Int *allNabors, allCount; /* permutation information for global unknowns (matrix rows) */ HYPRE_Int m; /* length of n2o_row and o2n_col */ HYPRE_Int *n2o_row; /* permutation for locally owned matrix rows */ HYPRE_Int *o2n_col; /* permutation for locally owned matrix columns */ Hash_i_dh o2n_ext; /* permutation for external columns */ Hash_i_dh n2o_ext; /* inverse permutation for external columns */ HYPRE_Real timing[TIMING_BINS_SG]; bool debug; }; extern void SubdomainGraph_dhCreate(SubdomainGraph_dh *s); extern void SubdomainGraph_dhDestroy(SubdomainGraph_dh s); extern void SubdomainGraph_dhInit(SubdomainGraph_dh s, HYPRE_Int blocks, bool bj, void *A); /* Partitions matrix A into the specified number of blocks, if there is a single MPI task; for mpi use, "blocks" must be the same as the number of mpi tasks; for sequential, it may vary. On completion, the subdomain graph will be fully formed, (all fields valid); o2n_row[] and n2o_col[] will be permutations for the locally owned portion of A such that A's interior nodes are ordered first. This function may call a partitioner, such as METIS (currently, only for sequential). On completion, "o2n" contains a natural ordering, beg_row is identical to beg_rowP, and_rowP is identical to end_rowP. if "bj" is true, the following setup steps are NOT performed: form subdomain graph; find neighbors; order boundary nodes */ extern void SubdomainGraph_dhColor(SubdomainGraph_dh s); /* Colors and orders subdomain graph; on completion, o2n[], beg_rowP[], and end_rowP[] may be altered. */ extern HYPRE_Int SubdomainGraph_dhFindOwner(SubdomainGraph_dh s, HYPRE_Int idx, bool permuted); /* Returns the subdomain block to which row idx belongs, or throws an error. If "permuted" is true, it's assumed the graph has been permuted (i.e., 'globally reordering phase' in PILU algorithm). */ extern void SubdomainGraph_dhExchangePerms(SubdomainGraph_dh s); /* exchange permutation information for external columns with nearest neighbors; caller must ensure SubdomainGraph_dhInit() has completed before calling. */ extern void SubdomainGraph_dhPrintSubdomainGraph(SubdomainGraph_dh s, FILE *fp); extern void SubdomainGraph_dhPrintStatsLong(SubdomainGraph_dh s, FILE *fp); /* similar to Short, but prints complete list of interior/bdry node ratios; also prints subdomain permutation */ extern void SubdomainGraph_dhDump(SubdomainGraph_dh s, char *filename); /* for testing */ extern void SubdomainGraph_dhPrintRatios(SubdomainGraph_dh s, FILE *fp); /* prints ratios of interior/boundary node for all subdomains */ extern void SubdomainGraph_dhPrintStats(SubdomainGraph_dh sg, FILE *fp); #endif /****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /* Euclid employs a global object: TimeLog_dh timlog_dh; for recording timing information. */ #ifndef TIMELOG_DH_DH #define TIMELOG_DH_DH /* #include "euclid_common.h" */ extern void TimeLog_dhCreate(TimeLog_dh *t); extern void TimeLog_dhDestroy(TimeLog_dh t); extern void TimeLog_dhStart(TimeLog_dh t); extern void TimeLog_dhStop(TimeLog_dh t); extern void TimeLog_dhReset(TimeLog_dh t); extern void TimeLog_dhMark(TimeLog_dh t, const char *description); extern void TimeLog_dhPrint(TimeLog_dh t, FILE *fp, bool allPrint); #endif /****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #ifndef SORTED_SET_DH #define SORTED_SET_DH /* #include "euclid_common.h" */ struct _sortedset_dh { HYPRE_Int n; /* max items that can be stored */ HYPRE_Int *list; /* list of inserted elements */ HYPRE_Int count; /* the number of elements in the list */ }; extern void SortedSet_dhCreate(SortedSet_dh *ss, HYPRE_Int initialSize); extern void SortedSet_dhDestroy(SortedSet_dh ss); extern void SortedSet_dhInsert(SortedSet_dh ss, HYPRE_Int idx); extern void SortedSet_dhGetList(SortedSet_dh ss, HYPRE_Int **list, HYPRE_Int *count); #endif /****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #ifndef MEM_DH_DH #define MEM_DH_DH /* #include "euclid_common.h" */ extern void Mem_dhCreate(Mem_dh *m); extern void Mem_dhDestroy(Mem_dh m); extern void *Mem_dhMalloc(Mem_dh m, size_t size); extern void Mem_dhFree(Mem_dh m, void *ptr); /* preceeding two are called via the macros MALLOC_DH and FREE_DH; see "euclid_config.h" */ extern void Mem_dhPrint(Mem_dh m, FILE* fp, bool allPrint); /* prints memory usage statistics; "allPrint" is only meaningful when running in MPI mode. */ #endif /****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #ifndef SUPPORT_DH #define SUPPORT_DH /* #include "euclid_common.h" */ extern void shellSort_int(const HYPRE_Int n, HYPRE_Int *x); extern void shellSort_float(HYPRE_Int n, HYPRE_Real *v); /* extern void shellSort_int_int(const HYPRE_Int n, HYPRE_Int *x, HYPRE_Int *y); extern void shellSort_int_float(HYPRE_Int n, HYPRE_Int *x, HYPRE_Real *v); extern void shellSort_int_int_float(HYPRE_Int n, HYPRE_Int *x, HYPRE_Int *y, HYPRE_Real *v); */ #endif /****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #ifndef NUMBERING_DH_H #define NUMBERING_DH_H /* code and algorithms in this class adopted from Edmond Chow's ParaSails */ /* #include "euclid_common.h" */ struct _numbering_dh { HYPRE_Int size; /* max number of indices that can be stored; (length of idx_ext[]) */ HYPRE_Int first; /* global number of 1st local index (row) */ HYPRE_Int m; /* number of local indices (number of local rows in mat) */ HYPRE_Int *idx_ext; /* sorted list of external indices */ HYPRE_Int *idx_extLo; /* sorted list of external indices that are < first */ HYPRE_Int *idx_extHi; /* sorted list of external indices that are >= first+m */ HYPRE_Int num_ext; /* number of external (non-local) indices = num_extLo+num_extHi */ HYPRE_Int num_extLo; /* number of external indices < first */ HYPRE_Int num_extHi; /* number of external indices >= first+num_loc */ Hash_i_dh global_to_local; bool debug; }; extern void Numbering_dhCreate(Numbering_dh *numb); extern void Numbering_dhDestroy(Numbering_dh numb); /* must be called before calling Numbering_dhGlobalToLocal() or Numbering_dhLocalToGlobal(). */ extern void Numbering_dhSetup(Numbering_dh numb, Mat_dh mat); /* input: global_in[len], which contains global row numbers. output: local_out[len], containing corresponding local numbers. note: global_in[] and local_out[] may be identical. */ extern void Numbering_dhGlobalToLocal(Numbering_dh numb, HYPRE_Int len, HYPRE_Int *global_in, HYPRE_Int *local_out); #endif /****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /* This is similar to the Hash_i_dh class (woe, for a lack of templates); this this class is for hashing data consisting of single, non-negative integers. */ #ifndef HASH_I_DH #define HASH_I_DH /* #include "euclid_common.h" */ /* class methods note: all parameters are inputs; the only output is the "HYPRE_Int" returned by Hash_i_dhLookup. */ extern void Hash_i_dhCreate(Hash_i_dh *h, HYPRE_Int size); /* For proper operation, "size," which is the minimal size of the hash table, must be a power of 2. Or, pass "-1" to use the default. */ extern void Hash_i_dhDestroy(Hash_i_dh h); extern void Hash_i_dhReset(Hash_i_dh h); extern void Hash_i_dhInsert(Hash_i_dh h, HYPRE_Int key, HYPRE_Int data); /* throws error if is already inserted; grows hash table if out of space. */ extern HYPRE_Int Hash_i_dhLookup(Hash_i_dh h, HYPRE_Int key); /* returns "data" associated with "key," or -1 if "key" is not found. */ #endif /****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #ifndef TIMER_DH_H #define TIMER_DH_H /* #include "euclid_common.h" */ /*--------------------------------------------------------------*/ /* Stuph in this block isn't really needed for multi-processor * runs, since recording CPU time probably isn't useful. * if EUCLID_TIMING is defined in $PCPACK_DIR/bmake_XXX/common, * the times() function is used; * then hypre_MPI_Wtime() is used in preference to times(). * * You may need to fiddle with some of these includes, depending * on your system. Make sure and check the logFile to ensure * that CLK_TCK was properly defined. See Timer_dhCreate() * for additional details. * * if "JUNK_TIMING" is defined during compilation, timing functions * either do nothing, or return -1.0; this is primarily for debugging. */ #include "HYPRE_config.h" #ifdef EUCLID_TIMING #include #include #include #elif !defined(JUNK_TIMING) #include #ifndef WIN32 #include /* needed for sysconf(_SC_CLK_TCK) */ #endif #endif /* ??? may be needed for some compilers/platforms? #include #include #include */ /*--------------------------------------------------------------*/ struct _timer_dh { bool isRunning; hypre_longint sc_clk_tck; HYPRE_Real begin_wall; HYPRE_Real end_wall; #ifdef EUCLID_TIMING struct tms begin_cpu; struct tms end_cpu; #endif }; extern void Timer_dhCreate(Timer_dh *t); extern void Timer_dhDestroy(Timer_dh t); extern void Timer_dhStart(Timer_dh t); extern void Timer_dhStop(Timer_dh t); extern HYPRE_Real Timer_dhReadCPU(Timer_dh t); extern HYPRE_Real Timer_dhReadWall(Timer_dh t); extern HYPRE_Real Timer_dhReadUsage(Timer_dh t); /* notes: (1) unless compiled with EUCLID_TIMING defined, readCPU and readUseage return -1.0. (2) whenever start() is called, the timer is reset; you don't need to call stop() first. (3) if stop() HAS been called, the readXX functions return timings between start() and stop(); , if start() was called but not stop(), they sample the time then return; if start() was never called, they return junk. */ #endif /****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #ifndef PARSER_DH_DH #define PARSER_DH_DH /* #include "euclid_common.h" */ extern void Parser_dhCreate(Parser_dh *p); extern void Parser_dhDestroy(Parser_dh p); extern bool Parser_dhHasSwitch(Parser_dh p, const char *in); extern bool Parser_dhReadString(Parser_dh p, const char *in, char **out); extern bool Parser_dhReadInt(Parser_dh p, const char *in, HYPRE_Int *out); extern bool Parser_dhReadDouble(Parser_dh p, const char *in, HYPRE_Real *out); /* if the flag (char *in) is found, these four return true and set "out" accordingly. If not found, they return false, and "out" is unaltered. */ extern void Parser_dhPrint(Parser_dh p, FILE *fp, bool allPrint); /* Outputs all pairs. "bool allPrint" is * only meaningful when Euclid is compiled in MPI mode */ extern void Parser_dhInsert(Parser_dh p, const char *name, const char *value); /* For inserting a new pair, or altering * the value of an existing pair from within user apps. */ extern void Parser_dhUpdateFromFile(Parser_dh p, const char *name); extern void Parser_dhInit(Parser_dh p, HYPRE_Int argc, char *argv[]); /* Init enters pairs in its internal database in the following order: (1) $PCPACK_DIR/options_database (2) "database" in local directory, if the file exists (3) "pathname/foo" if argv[] contains a pair of entries: -db_filename pathname/foo (4) flag,value pairs from the command line (ie, argv) If a flag already exists, its value is updated if it is encountered a second time. WARNING! to enter a negative value, you must use two dashes, e.g: -myvalue --0.1 otherwise, if you code "-myvalue -0.1" you will have entered the pair of entries <-myvalue, 1>, <-0.1, 1>. Yuck!@# But this works, since Euclid doesn't use negative numbers much. If the 2nd entry is missing, a value of "1" is assumed (this only works on the command line; for files, you must explicitly code a value. See $PCPACK_DIR/options_database for samples. The following will cause Parser_dhHasSwitch(p, "-phoo") to return false: -phoo 0 -phoo false -phoo False -phoo FALSE any other value, including something silly like -phoo 0.0 will return true. */ #endif /****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #ifndef SORTEDLIST_DH_H #define SORTEDLIST_DH_H /* for private use by mpi factorization algorithms */ /* #include "euclid_common.h" */ typedef struct _srecord { HYPRE_Int col; HYPRE_Int level; HYPRE_Real val; HYPRE_Int next; } SRecord; extern void SortedList_dhCreate(SortedList_dh *sList); extern void SortedList_dhDestroy(SortedList_dh sList); extern void SortedList_dhInit(SortedList_dh sList, SubdomainGraph_dh sg); extern void SortedList_dhEnforceConstraint(SortedList_dh sList, SubdomainGraph_dh sg); extern void SortedList_dhReset(SortedList_dh sList, HYPRE_Int row); extern HYPRE_Int SortedList_dhReadCount(SortedList_dh sList); /* returns number of records inserted since last reset */ extern void SortedList_dhResetGetSmallest(SortedList_dh sList); /* resets index used for SortedList_dhGetSmallestLowerTri(). */ extern SRecord * SortedList_dhGetSmallest(SortedList_dh sList); /* returns record with smallest column value that hasn't been retrieved via this method since last call to SortedList_dhReset() or SortedList_dhResetGetSmallest(). If all records have been retrieved, returns NULL. */ extern SRecord * SortedList_dhGetSmallestLowerTri(SortedList_dh sList); /* returns record with smallest column value that hasn't been retrieved via this method since last call to reset. Only returns records where SRecord sr.col < row (per Init). If all records have been retrieved, returns NULL. */ extern void SortedList_dhInsert(SortedList_dh sList, SRecord *sr); /* unilateral insert (does not check to see if item is already in list); does not permute sr->col; used in numeric factorization routines. */ extern void SortedList_dhInsertOrUpdateVal(SortedList_dh sList, SRecord *sr); /* unilateral insert: does not check to see if already inserted; does not permute sr->col; used in numeric factorization routines. */ extern bool SortedList_dhPermuteAndInsert(SortedList_dh sList, SRecord *sr, HYPRE_Real thresh); /* permutes sr->col, and inserts record in sorted list. Note: the contents of the passed variable "sr" may be changed. Note: this performs sparsification */ extern void SortedList_dhInsertOrUpdate(SortedList_dh sList, SRecord *sr); /* if a record with identical sr->col was inserted, updates sr->level to smallest of the two values; otherwise, inserts the record. Unlike SortedList_dhPermuteAndInsert, does not permute sr->col. Note: the contents of the passed variable "sr" may be changed. Warning: do not call SortedList_dhGetSmallestLowerTri() again until reset is called. */ extern SRecord * SortedList_dhFind(SortedList_dh sList, SRecord *sr); /* returns NULL if no record is found containing sr->col */ extern void SortedList_dhUpdateVal(SortedList_dh sList, SRecord *sr); #endif /****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #ifndef HASH_D_DH #define HASH_D_DH /* todo: rehash should be implemented in Hash_dhInsert(); as of now, an error is set if the table overflows. */ /* #include "euclid_common.h" */ /* This should be done with templates, if this were in C++; for now, a record contains every type of entry we might need; this is a waste of memory, when one is only intersted in hashing pairs! */ typedef struct _hash_node { HYPRE_Int iData; /* integer */ HYPRE_Real fData; /* float */ HYPRE_Int *iDataPtr; /* pointer to integer */ HYPRE_Int *iDataPtr2; /* pointer to integer */ HYPRE_Real *fDataPtr; /* pointer to float */ } HashData; typedef struct _hash_node_private HashRecord; /* data structure for the hash table; do not directly access */ struct _hash_dh { HYPRE_Int size; /* total slots in table */ HYPRE_Int count; /* number of insertions in table */ HYPRE_Int curMark; HashRecord *data; }; extern void Hash_dhCreate(Hash_dh *h, HYPRE_Int size); extern void Hash_dhDestroy(Hash_dh h); extern void Hash_dhInsert(Hash_dh h, HYPRE_Int key, HashData *data); extern HashData *Hash_dhLookup(Hash_dh h, HYPRE_Int key); /* returns NULL if record isn't found. */ extern void Hash_dhReset(Hash_dh h); extern void Hash_dhPrint(Hash_dh h, FILE *fp); #define HASH_1(k,size,idxOut) \ { *idxOut = k % size; } #define HASH_2(k,size,idxOut) \ { \ HYPRE_Int r = k % (size-13); \ r = (r % 2) ? r : r+1; \ *idxOut = r; \ } #endif /****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #ifndef MAT_DH_PRIVATE #define MAT_DH_PRIVATE /* Functions called by Mat_dh, Factor_dh, and possibly others. Also, a few handy functions for dealing with permutations, etc. */ /* #include "euclid_common.h" */ extern HYPRE_Int mat_find_owner(HYPRE_Int *beg_rows, HYPRE_Int *end_rows, HYPRE_Int index); extern void mat_dh_transpose_private(HYPRE_Int m, HYPRE_Int *rpIN, HYPRE_Int **rpOUT, HYPRE_Int *cvalIN, HYPRE_Int **cvalOUT, HYPRE_Real *avalIN, HYPRE_Real **avalOUT); /* same as above, but memory for output was already allocated */ extern void mat_dh_transpose_reuse_private(HYPRE_Int m, HYPRE_Int *rpIN, HYPRE_Int *cvalIN, HYPRE_Real *avalIN, HYPRE_Int *rpOUT, HYPRE_Int *cvalOUT, HYPRE_Real *avalOUT); /*------------------------------------------------------------------------- * utility functions for reading and writing matrices in various formats. * currently recognized filetypes (formats) are: * trip * csr * petsc * the "ignore" parameter is only used for the matrix "trip" format, * and the vector "csr" and "trip" formats (which are misnamed, and identical); * the intention is to skip over the first "ignore" lines of the file; * this is a hack to enable reading of Matrix Market, etc, formats. *-------------------------------------------------------------------------*/ extern void readMat(Mat_dh *Aout, char *fileType, char *fileName, HYPRE_Int ignore); extern void readVec(Vec_dh *bout, char *fileType, char *fileName, HYPRE_Int ignore); extern void writeMat(Mat_dh Ain, char *fileType, char *fileName); extern void writeVec(Vec_dh b, char *fileType, char *fileName); /* Next function is primarily (?) for testing/development/debugging. P_0 reads and partitions the matrix, then distributes amongst the other processors. */ extern void readMat_par(Mat_dh *Aout, char *fileType, char *fileName, HYPRE_Int ignore); extern void profileMat(Mat_dh A); /* writes structural and numerical symmetry and other info to stdout; for a single mpi task only. */ /*-------------------------------------------------------------------------* * functions called by public Mat_dh class methods. * * (following notes need to be updated!) * * m is number of local rows; * beg_row is global number of 1st locally owned row; * m, beg_row, rp, cval may not be null (caller's responsiblity); * if n2o is NULL, it's assumed that o2n is NULL; * if * * error thrown: * if a nonlocal column (a column index that is less than beg_row, * or >= beg_row+m), and can't be located in hash table. * * print_triples_private() and print_mat_private() are 1-based. * *-------------------------------------------------------------------------*/ /* seq or mpi */ extern void mat_dh_print_graph_private(HYPRE_Int m, HYPRE_Int beg_row, HYPRE_Int *rp, HYPRE_Int *cval, HYPRE_Real *aval, HYPRE_Int *n2o, HYPRE_Int *o2n, Hash_i_dh hash, FILE* fp); /* seq; reordering not implemented */ /* see io_dh.h HYPRE_Int *rp, HYPRE_Int *cval, HYPRE_Real *aval, HYPRE_Int *n2o, HYPRE_Int *o2n, Hash_i_dh hash, char *filename); */ /* seq only */ extern void mat_dh_print_csr_private(HYPRE_Int m, HYPRE_Int *rp, HYPRE_Int *cval, HYPRE_Real *aval, FILE* fp); /* seq only */ extern void mat_dh_read_csr_private(HYPRE_Int *m, HYPRE_Int **rp, HYPRE_Int **cval, HYPRE_Real **aval, FILE* fp); /* seq only */ extern void mat_dh_read_triples_private(HYPRE_Int ignore, HYPRE_Int *m, HYPRE_Int **rp, HYPRE_Int **cval, HYPRE_Real **aval, FILE* fp); /* seq or mpi */ /* see io_dh.h HYPRE_Real **aval, char *filename); */ /*-------------------------------------------------------------------------*/ extern void create_nat_ordering_private(HYPRE_Int m, HYPRE_Int **p); extern void destroy_nat_ordering_private(HYPRE_Int *p); extern void invert_perm(HYPRE_Int m, HYPRE_Int *pIN, HYPRE_Int *pOUT); extern void make_full_private(HYPRE_Int m, HYPRE_Int **rp, HYPRE_Int **cval, HYPRE_Real **aval); /* converts upper or lower triangular to full; may bomb if input is not triangular! */ extern void make_symmetric_private(HYPRE_Int m, HYPRE_Int **rp, HYPRE_Int **cval, HYPRE_Real **aval); /* pads with zeros to make structurally symmetric. */ extern void make_symmetric_private(HYPRE_Int m, HYPRE_Int **rp, HYPRE_Int **cval, HYPRE_Real **aval); #endif /****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #ifndef GET_ROW_DH #define GET_ROW_DH /* #include "euclid_common.h" */ /* "row" refers to global row number */ extern void EuclidGetDimensions(void *A, HYPRE_Int *beg_row, HYPRE_Int *rowsLocal, HYPRE_Int *rowsGlobal); extern void EuclidGetRow(void *A, HYPRE_Int row, HYPRE_Int *len, HYPRE_Int **ind, HYPRE_Real **val); extern void EuclidRestoreRow(void *A, HYPRE_Int row, HYPRE_Int *len, HYPRE_Int **ind, HYPRE_Real **val); extern HYPRE_Int EuclidReadLocalNz(void *A); extern void PrintMatUsingGetRow(void* A, HYPRE_Int beg_row, HYPRE_Int m, HYPRE_Int *n2o_row, HYPRE_Int *n2o_col, char *filename); #endif /****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #ifndef ILU_MPI_DH #define ILU_MPI_DH /* #include "euclid_common.h" */ void reallocate_private(HYPRE_Int row, HYPRE_Int newEntries, HYPRE_Int *nzHave, HYPRE_Int **rp, HYPRE_Int **cval, float **aval, HYPRE_Real **avalD, HYPRE_Int **fill); extern void ilu_mpi_pilu(Euclid_dh ctx); /* driver for comms intermingled with factorization */ extern void iluk_mpi_pilu(Euclid_dh ctx); /* the factorization algorithm */ extern void compute_scaling_private(HYPRE_Int row, HYPRE_Int len, HYPRE_Real *AVAL, Euclid_dh ctx); extern void iluk_mpi_bj(Euclid_dh ctx); extern void iluk_seq(Euclid_dh ctx); extern void iluk_seq_block(Euclid_dh ctx); /* for sequential or parallel block jacobi. If used for block jacobi, column indices are referenced to 0 on return; make sure and add beg_row to these values before printing the matrix! 1st version is for single precision, 2nd is for HYPRE_Real. */ extern void ilut_seq(Euclid_dh ctx); #endif /****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #ifndef EUCLID_MPI_INTERFACE_DH #define EUCLID_MPI_INTERFACE_DH #define DEFAULT_DROP_TOL 0.01 /* #include "euclid_common.h" */ /*====================================================================== * Naming convention: functions ending in _mpi are located in * src/Euclid_mpi.c; those ending in _seq are in src/Euclid_seq.c; * most others should be in Euclid_all.c. * * Exceptions: all Apply() (triangular solves) are in src/Euclid_apply.c; * except for the Apply for MPI PILU, which is called * Mat_dhSolve, and is in src/Mat_dh.c * * Users should only need to call functions with names of the form * Euclid_dhXXX (public functions). * * Some of the functions whose names are of the form XXX_private_XXX, * as could easily be static functions; similarly, the enums and * structs do need to be public. They are, primarily, for ease in * debugging and ready reference. * * Exceptions: the apply_private functions aren't listed here --- they're * all static in src/Euclid_apply.c *======================================================================*/ extern void Euclid_dhCreate(Euclid_dh *ctxOUT); extern void Euclid_dhDestroy(Euclid_dh ctx); extern void Euclid_dhSetup(Euclid_dh ctx); extern void Euclid_dhSolve(Euclid_dh ctx, Vec_dh lhs, Vec_dh rhs, HYPRE_Int *its); extern void Euclid_dhApply(Euclid_dh ctx, HYPRE_Real *lhs, HYPRE_Real *rhs); extern void Euclid_dhPrintTestData(Euclid_dh ctx, FILE *fp); extern void Euclid_dhPrintScaling(Euclid_dh ctx, FILE *fp); extern void Euclid_dhPrintStatsShort(Euclid_dh ctx, HYPRE_Real setup, HYPRE_Real solve, FILE *fp); extern void Euclid_dhPrintStatsShorter(Euclid_dh ctx, FILE *fp); /* on-line reporting, for making quick tables */ extern void Euclid_dhPrintHypreReport(Euclid_dh ctx, FILE *fp); extern void Euclid_dhPrintStats(Euclid_dh ctx, FILE *fp); /* prints same info as Euclid_dhPrintParams(), but also prints timing information, number of iterations, etc; may be called after solve is completed. */ #ifdef HYPRE_MODE /* is this still needed? */ extern void Euclid_dhInputHypreMat(Euclid_dh ctx, HYPRE_ParCSRMatrix A); #endif /*---------------------------------------------------------------------- * Private data structures *----------------------------------------------------------------------*/ #define MAX_OPT_LEN 20 /* for internal timing */ #define TIMING_BINS 10 enum{ SOLVE_START_T, TRI_SOLVE_T, /* triangular solves */ SETUP_T, /* total setup */ SUB_GRAPH_T, /* setup SubdomainGraph_dh */ FACTOR_T, /* factorization */ SOLVE_SETUP_T, /* setup for solves */ COMPUTE_RHO_T, /* note: SETUP_T - (FACTOR_T + SUB_GRAPH_T) should be small! */ TOTAL_SOLVE_TEMP_T, TOTAL_SOLVE_T }; /* for statistical reporting */ #define STATS_BINS 10 enum{ NZA_STATS, /* cumulative nonzeros for all systems solved */ NZF_STATS, /* cumulative nonzeros for all systems solved */ NZA_USED_STATS, /* cumulative nonzeros NOT dropped by sparseA */ NZA_RATIO_STATS /* NZA_USED_STATS/NZA_STATS, over all processors */ }; /* primary data structure: this is monstrously long; but it works. Users must ensure the following fields are initialized prior to calling Euclid_dhSetup(): m, n, beg_row, A */ struct _mpi_interface_dh { bool isSetup; HYPRE_Real rho_init; HYPRE_Real rho_final; /* Memory allocation for factor; will initially allocate space for rho_init*nzA nonzeros; rho_final is computed after factorization, and is the minimum that rho_init whoulc have been to avoid memory reallocation; rho_final is a maximum across all processors. */ HYPRE_Int m; /* local rows in matrix */ HYPRE_Int n; /* global rows in matrix */ HYPRE_Real *rhs; /* used for debugging; this vector is not owned! */ void *A; /* PETSc, HYPRE, Euclid, or other matrix object. */ Factor_dh F; /* data structure for the factor, F = L+U-I */ SubdomainGraph_dh sg; REAL_DH *scale; /* row scaling vector */ bool isScaled; /* set at runtime, turns scaling on or off */ /* workspace for factorization and triangular solves */ HYPRE_Real *work; HYPRE_Real *work2; HYPRE_Int from, to; /* which local rows to factor or solve */ /* runtime parameters (mostly) */ char algo_par[MAX_OPT_LEN]; /* parallelization strategy */ char algo_ilu[MAX_OPT_LEN]; /* ILU factorization method */ HYPRE_Int level; /* for ILU(k) */ HYPRE_Real droptol; /* for ILUT */ HYPRE_Real sparseTolA; /* for sparsifying A */ HYPRE_Real sparseTolF; /* for sparsifying the factors */ HYPRE_Real pivotMin; /* if pivots are <= to this value, fix 'em */ HYPRE_Real pivotFix; /* multiplier for adjusting small pivots */ HYPRE_Real maxVal; /* largest abs. value in matrix */ /* data structures for parallel ilu (pilu) */ SortedList_dh slist; ExternalRows_dh extRows; /* for use with Euclid's internal krylov solvers; */ char krylovMethod[MAX_OPT_LEN]; HYPRE_Int maxIts; HYPRE_Real rtol; HYPRE_Real atol; HYPRE_Int its; /* number of times preconditioner was applied since last call to Setup */ HYPRE_Int itsTotal; /* cululative number of times preconditioner was applied */ /* internal statistics */ HYPRE_Int setupCount; HYPRE_Int logging; /* added in support of Hypre */ HYPRE_Real timing[TIMING_BINS]; HYPRE_Real stats[STATS_BINS]; bool timingsWereReduced; bool printStats; /* if true, on 2nd and subsequent calls to Setup, calls Euclid_dhPrintStatsShorter(). Intent is to print out stats for each setup phase when using Euclid, e.g, for nonlinear solves. */ }; #endif /* #ifndef EUCLID_MPI_INTERFACE_DH */ /****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #ifndef THREADED_KRYLOV_H #define THREADED_KRYLOV_H /* #include "blas_dh.h" */ extern void bicgstab_euclid(Mat_dh A, Euclid_dh ctx, HYPRE_Real *x, HYPRE_Real *b, HYPRE_Int *itsOUT); extern void cg_euclid(Mat_dh A, Euclid_dh ctx, HYPRE_Real *x, HYPRE_Real *b, HYPRE_Int *itsOUT); #endif /****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /* Note: this module contains functionality for reading/writing Euclid's binary io format, and opening and closing files. Additional io can be found in in mat_dh_private, which contains private functions for reading/writing various matrix and vector formats; functions in that module are called by public class methods of the Mat_dh and Vec_dh classes. */ #ifndef IO_DH #define IO_DH /* #include "euclid_common.h" */ /*-------------------------------------------------------------------------- * open and close files, with error checking *--------------------------------------------------------------------------*/ extern FILE * openFile_dh(const char *filenameIN, const char *modeIN); extern void closeFile_dh(FILE *fpIN); /*--------------------------------------------------------------------------- * binary io; these are called by functions in mat_dh_private *---------------------------------------------------------------------------*/ bool isSmallEndian(void); /* seq only ?? */ extern void io_dh_print_ebin_mat_private(HYPRE_Int m, HYPRE_Int beg_row, HYPRE_Int *rp, HYPRE_Int *cval, HYPRE_Real *aval, HYPRE_Int *n2o, HYPRE_Int *o2n, Hash_i_dh hash, char *filename); /* seq only ?? */ extern void io_dh_read_ebin_mat_private(HYPRE_Int *m, HYPRE_Int **rp, HYPRE_Int **cval, HYPRE_Real **aval, char *filename); /* seq only */ extern void io_dh_print_ebin_vec_private(HYPRE_Int n, HYPRE_Int beg_row, HYPRE_Real *vals, HYPRE_Int *n2o, HYPRE_Int *o2n, Hash_i_dh hash, char *filename); /* seq only */ extern void io_dh_read_ebin_vec_private(HYPRE_Int *n, HYPRE_Real **vals, char *filename); #endif /****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #ifndef THREADED_BLAS_DH #define THREADED_BLAS_DH /* notes: 1. all calls are threaded with OpenMP. 2. for mpi MatVec, see "Mat_dhMatvec()" in Mat_dh.h 3. MPI calls use hypre_MPI_COMM_WORLD for the communicator, where applicable. */ /* #include "euclid_common.h" */ #ifdef SEQUENTIAL_MODE #define MatVec matvec_euclid_seq #endif extern void matvec_euclid_seq(HYPRE_Int n, HYPRE_Int *rp, HYPRE_Int *cval, HYPRE_Real *aval, HYPRE_Real *x, HYPRE_Real *y); extern HYPRE_Real InnerProd(HYPRE_Int local_n, HYPRE_Real *x, HYPRE_Real *y); extern HYPRE_Real Norm2(HYPRE_Int local_n, HYPRE_Real *x); extern void Axpy(HYPRE_Int n, HYPRE_Real alpha, HYPRE_Real *x, HYPRE_Real *y); extern HYPRE_Real Norm2(HYPRE_Int n, HYPRE_Real *x); extern void CopyVec(HYPRE_Int n, HYPRE_Real *xIN, HYPRE_Real *yOUT); extern void ScaleVec(HYPRE_Int n, HYPRE_Real alpha, HYPRE_Real *x); #endif #ifdef __cplusplus } #endif #endif hypre-2.33.0/src/distributed_ls/Euclid/blas_dh.c000066400000000000000000000065201477326011500215130ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "_hypre_Euclid.h" /* #include "blas_dh.h" */ #undef __FUNC__ #define __FUNC__ "matvec_euclid_seq" void matvec_euclid_seq(HYPRE_Int n, HYPRE_Int *rp, HYPRE_Int *cval, HYPRE_Real *aval, HYPRE_Real *x, HYPRE_Real *y) { START_FUNC_DH HYPRE_Int i, j; HYPRE_Int from, to, col; HYPRE_Real sum; if (np_dh > 1) SET_V_ERROR("only for sequential case!\n"); #ifdef USING_OPENMP_DH #pragma omp parallel private(j, col, sum, from, to) \ default(shared) \ firstprivate(n, rp, cval, aval, x, y) #endif { #ifdef USING_OPENMP_DH #pragma omp for schedule(static) #endif for (i=0; i 1) { hypre_MPI_Allreduce(&local_result, &result, 1, hypre_MPI_REAL, hypre_MPI_SUM, comm_dh); } else { result = local_result; } END_FUNC_VAL(result) } #undef __FUNC__ #define __FUNC__ "Norm2" HYPRE_Real Norm2(HYPRE_Int n, HYPRE_Real *x) { START_FUNC_DH HYPRE_Real result, local_result = 0.0; HYPRE_Int i; #ifdef USING_OPENMP_DH #pragma omp parallel for schedule(static) firstprivate(x) \ private(i) \ reduction(+:local_result) #endif for (i=0; i 1) { hypre_MPI_Allreduce(&local_result, &result, 1, hypre_MPI_REAL, hypre_MPI_SUM, comm_dh); } else { result = local_result; } result = hypre_sqrt(result); END_FUNC_VAL(result) } hypre-2.33.0/src/distributed_ls/Euclid/blas_dh.h000066400000000000000000000023671477326011500215250ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #ifndef THREADED_BLAS_DH #define THREADED_BLAS_DH /* notes: 1. all calls are threaded with OpenMP. 2. for mpi MatVec, see "Mat_dhMatvec()" in Mat_dh.h 3. MPI calls use hypre_MPI_COMM_WORLD for the communicator, where applicable. */ /* #include "euclid_common.h" */ #ifdef SEQUENTIAL_MODE #define MatVec matvec_euclid_seq #endif extern void matvec_euclid_seq(HYPRE_Int n, HYPRE_Int *rp, HYPRE_Int *cval, HYPRE_Real *aval, HYPRE_Real *x, HYPRE_Real *y); extern HYPRE_Real InnerProd(HYPRE_Int local_n, HYPRE_Real *x, HYPRE_Real *y); extern HYPRE_Real Norm2(HYPRE_Int local_n, HYPRE_Real *x); extern void Axpy(HYPRE_Int n, HYPRE_Real alpha, HYPRE_Real *x, HYPRE_Real *y); extern HYPRE_Real Norm2(HYPRE_Int n, HYPRE_Real *x); extern void CopyVec(HYPRE_Int n, HYPRE_Real *xIN, HYPRE_Real *yOUT); extern void ScaleVec(HYPRE_Int n, HYPRE_Real alpha, HYPRE_Real *x); #endif hypre-2.33.0/src/distributed_ls/Euclid/euclid_common.h000066400000000000000000000127211477326011500227410ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #ifndef COMMON_DH #define COMMON_DH #include #include #include #include #include #include #include #define REAL_DH HYPRE_Real /*----------------------------------------------------------------------- * compile-time dependent includes from other libraries. * maintainer's note: this is the only place where non-Euclid * files are included. *-----------------------------------------------------------------------*/ #if ( !defined(FAKE_MPI) && defined(USING_MPI) && \ !defined(HYPRE_MODE) && !defined(PETSC_MODE) ) #include #endif #if defined(FAKE_MPI) #include "fake_mpi.h" #endif #if defined(USING_OPENMP) && !defined(HYPRE_MODE) #include #endif /*----------------------------------------------------------------------- * Euclid includes *-----------------------------------------------------------------------*/ /* #include "euclid_config.h" */ /* #include "macros_dh.h" */ /* macros for error checking, etc */ /*----------------------------------------------------------- * Euclid classes *-----------------------------------------------------------*/ typedef struct _matgenfd* MatGenFD; typedef struct _subdomain_dh* SubdomainGraph_dh; typedef struct _timer_dh* Timer_dh; typedef struct _parser_dh* Parser_dh; typedef struct _timeLog_dh* TimeLog_dh; typedef struct _mem_dh* Mem_dh; typedef struct _mat_dh* Mat_dh; typedef struct _factor_dh* Factor_dh; typedef struct _vec_dh* Vec_dh; typedef struct _numbering_dh* Numbering_dh; typedef struct _hash_dh* Hash_dh; typedef struct _hash_i_dh* Hash_i_dh; typedef struct _mpi_interface_dh* Euclid_dh; typedef struct _sortedList_dh* SortedList_dh; typedef struct _extrows_dh* ExternalRows_dh; typedef struct _stack_dh* Stack_dh; typedef struct _queue_dh* Queue_dh; typedef struct _sortedset_dh* SortedSet_dh; /* typedef struct _localPerm_dh* LocalPerm_dh; typedef struct _procGrid_dh* ProcGrid_dh; typedef struct _globalPerm_dh* GlobalPerm_dh; typedef struct _apply_dh* Apply_dh; typedef struct _externalRows_dh* ExternalRows_dh; */ /* ------------------------------------------------------------------ * Globally scoped variables, error handling functions, etc. * These are all defined in /src/globalObjects.c * ------------------------------------------------------------------*/ extern Parser_dh parser_dh; /* for setting/getting runtime options */ extern TimeLog_dh tlog_dh; /* internal timing functionality */ extern Mem_dh mem_dh; /* memory management */ extern FILE *logFile; extern HYPRE_Int np_dh; /* number of processors and subdomains */ extern HYPRE_Int myid_dh; /* rank of this processor (and subdomain) */ extern MPI_Comm comm_dh; extern bool ignoreMe; /* used to stop compiler complaints */ extern HYPRE_Int ref_counter; /* for internal use only! Reference counter to ensure that global objects are not destroyed when Euclid's destructor is called, and more than one instance of Euclid has been instantiated. */ /* Error and message handling. These are accessed through * macros defined in "macros_dh.h" */ extern bool errFlag_dh; extern void setInfo_dh(const char *msg, const char *function, const char *file, HYPRE_Int line); extern void setError_dh(const char *msg, const char *function, const char *file, HYPRE_Int line); extern void printErrorMsg(FILE *fp); #ifndef hypre_MPI_MAX_ERROR_STRING #define hypre_MPI_MAX_ERROR_STRING 256 #endif #define MSG_BUF_SIZE_DH MAX(1024, hypre_MPI_MAX_ERROR_STRING) extern char msgBuf_dh[MSG_BUF_SIZE_DH]; /* Each processor (may) open a logfile. * The bools are switches for controlling the amount of informational * output, and where it gets written to. Function trace logging is only * enabled when compiled with the debugging (-g) option. */ extern void openLogfile_dh(HYPRE_Int argc, char *argv[]); extern void closeLogfile_dh(void); extern bool logInfoToStderr; extern bool logInfoToFile; extern bool logFuncsToStderr; extern bool logFuncsToFile; extern void Error_dhStartFunc(char *function, char *file, HYPRE_Int line); extern void Error_dhEndFunc(char *function); extern void dh_StartFunc(const char *function, const char *file, HYPRE_Int line, HYPRE_Int priority); extern void dh_EndFunc(const char *function, HYPRE_Int priority); extern void printFunctionStack(FILE *fp); extern void EuclidInitialize(HYPRE_Int argc, char *argv[], char *help); /* instantiates global objects */ extern void EuclidFinalize(void); /* deletes global objects */ extern bool EuclidIsInitialized(void); extern void printf_dh(const char *fmt, ...); extern void fprintf_dh(FILE *fp, const char *fmt, ...); /* echo command line invocation to stdout. The "prefix" string is for grepping; it may be NULL. */ extern void echoInvocation_dh(MPI_Comm comm, char *prefix, HYPRE_Int argc, char *argv[]); #endif hypre-2.33.0/src/distributed_ls/Euclid/euclid_config.h000066400000000000000000000072221477326011500227160ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #ifndef EUCLID_CONF_DH #define EUCLID_CONF_DH #define MAX_MPI_TASKS 50000 #define PETSC_EUCLID_ERR_CODE PETSC_ERR_LIB /* for use in printTriples functions */ #define TRIPLES_FORMAT "%i %i %1.8e\n" /* #define TRIPLES_FORMAT "%i %i %1.19e\n" */ #undef PRIVATE_TIMING_DH /* primarily for experimental purposes; if defined, TimeLog_dh marks are entered in Mat_dh and Euclid_apply modules. */ /* top-level error handlers. redefine to do what you want, or don't use it at all. Intended usage for calling Euclid functions from main is: Euclid_dhPhoo(); ERRCHKA; */ #ifdef USING_MPI #define EUCLID_EXIT hypre_MPI_Abort(comm_dh, -1) #else #define EUCLID_EXIT exit(-1); #endif #define EXIT_NOW(msg) \ { setError_dh(msg, __FUNC__, __FILE__, __LINE__); \ ERRCHKA; \ } #define ERRCHKA \ if (errFlag_dh) { \ setError_dh("", __FUNC__, __FILE__, __LINE__); \ if (logFile != NULL) { \ printErrorMsg(logFile); \ closeLogfile_dh(); \ } \ printErrorMsg(stderr); \ if (myid_dh == 0) { \ Mem_dhPrint(mem_dh, stderr, false); \ } \ EUCLID_EXIT; \ } /* let Euclid do its thing, before handing off to PETSc; this is only used in main(), after a call to a function from the PETSc library. */ #define ERRCHKA_CHKERRA(ierr) \ if (errFlag_dh) { \ setError_dh("", __FUNC__, __FILE__, __LINE__); \ if (logFile != NULL) { \ printErrorMsg(logFile); \ hypre_fprintf(logFile, "\n[%i] ierr = %i, errFlag_dh = %i\n", myid_dh, ierr, errFlag_dh); \ closeLogfile_dh(); \ } \ printErrorMsg(stderr); \ hypre_fprintf(stderr, "\n[%i] ierr = %i, errFlag_dh = %i\n", myid_dh, ierr, errFlag_dh); \ CHKERRA(ierr); \ } #define MAX_SUBDOMAINS 20 /* The maximum number of subdomains into which the matrix may be partitioned. Rule of thumb: MAX_SUBDOMAINS >= number of threads. Note: this is only for shared-memory. */ #define PIVOT_FIX_DEFAULT 1e-3 /*--------------------------------------------------------------------- * Memory management. These macros work with functions in Mem_dh.c; * Change if you want to use some memory management and reporting schemes * other than that supplied with Euclid. These depend on the global * object "Mem_dh mem_dh" which is defined in globalObjects.c (yuck!) ---------------------------------------------------------------------*/ #undef USE_PETSC_MALLOC #ifdef USE_PETSC_MALLOC #define MALLOC_DH(s) PetscMalloc(s) #define FREE_DH(p) PetscFree(p) #else #define MALLOC_DH(s) Mem_dhMalloc(mem_dh, (s)) #define FREE_DH(p) Mem_dhFree(mem_dh, p) #endif /* The actual calls used by Mem_dh objects to allocate/free memory * from the heap. */ #define PRIVATE_MALLOC(size) ( hypre_TAlloc(char, size, HYPRE_MEMORY_HOST) ) #define PRIVATE_FREE(ptr) ( hypre_TFree(ptr, HYPRE_MEMORY_HOST) ) /*------------------ Memory management end -----------------------------*/ /* Developer's note: there must be a XXX_GET_ROW defined, e.g: #define HYPRE_GET_ROW #define PETSC_GET_ROW #define EUCLID_GET_ROW This is currently accomplished in the makefile system; If you're building an interface to a solver package, you need to write EUCLID_GET_ROW() functions: see src/getRow.c */ #endif hypre-2.33.0/src/distributed_ls/Euclid/getRow_dh.c000066400000000000000000000240311477326011500220360ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "_hypre_Euclid.h" /* #include "getRow_dh.h" */ /* #include "Mat_dh.h" */ /* #include "Euclid_dh.h" */ /* #include "Mem_dh.h" */ /*------------------------------------------------------------------- * HYPRE *-------------------------------------------------------------------*/ #if defined(HYPRE_GET_ROW) #undef __FUNC__ #define __FUNC__ "EuclidGetRow (HYPRE_GET_ROW)" void EuclidGetRow(void *A, HYPRE_Int row, HYPRE_Int *len, HYPRE_Int **ind, HYPRE_Real **val) { START_FUNC_DH HYPRE_Int ierr; HYPRE_ParCSRMatrix mat = (HYPRE_ParCSRMatrix) A; ierr = HYPRE_ParCSRMatrixGetRow(mat, row, len, (HYPRE_BigInt **) ind, val); if (ierr) { hypre_sprintf(msgBuf_dh, "HYPRE_ParCSRMatrixRestoreRow(row= %i) returned %i", row+1, ierr); SET_V_ERROR(msgBuf_dh); } END_FUNC_DH } #undef __FUNC__ #define __FUNC__ "EuclidRestoreRow (HYPRE_GET_ROW)" void EuclidRestoreRow(void *A, HYPRE_Int row, HYPRE_Int *len, HYPRE_Int **ind, HYPRE_Real **val) { START_FUNC_DH HYPRE_Int ierr; HYPRE_ParCSRMatrix mat = (HYPRE_ParCSRMatrix) A; ierr = HYPRE_ParCSRMatrixRestoreRow(mat, row, len, (HYPRE_BigInt **) ind, val); if (ierr) { hypre_sprintf(msgBuf_dh, "HYPRE_ParCSRMatrixRestoreRow(row= %i) returned %i", row+1, ierr); SET_V_ERROR(msgBuf_dh); } END_FUNC_DH } #undef __FUNC__ #define __FUNC__ "EuclidGetDimensions (HYPRE)" void EuclidGetDimensions(void *A, HYPRE_Int *beg_row, HYPRE_Int *rowsLocal, HYPRE_Int *rowsGlobal) { START_FUNC_DH HYPRE_Int ierr; HYPRE_BigInt m, n, row_start, row_end, col_start, col_end; HYPRE_ParCSRMatrix mat = (HYPRE_ParCSRMatrix) A; ierr = HYPRE_ParCSRMatrixGetDims(mat, &m, &n); if (ierr) { hypre_sprintf(msgBuf_dh, "HYPRE_ParCSRMatrixGetDims() returned %i", ierr); SET_V_ERROR(msgBuf_dh); } ierr = HYPRE_ParCSRMatrixGetLocalRange(mat, &row_start, &row_end, &col_start, &col_end); if (ierr) { hypre_sprintf(msgBuf_dh, "HYPRE_ParCSRMatrixGetLocalRange() returned %i", ierr); SET_V_ERROR(msgBuf_dh); } /* hypre_fprintf(stderr, "\n##### [%i] EuclidGetDimensions: m= %i n= %i beg_row= %i row_end= %i col_start= %i col_end= %i\n", myid_dh, m,n,row_start,row_end,col_start,col_end); */ *beg_row = row_start; *rowsLocal = (row_end - row_start + 1); *rowsGlobal = n; END_FUNC_DH } /* #undef __FUNC__ #define __FUNC__ "EuclidReadLocalNz (HYPRE)" HYPRE_Int EuclidReadLocalNz(void *A) { START_FUNC_DH if (ignoreMe) SET_V_ERROR("not implemented"); return(0); END_FUNC_DH } */ /*------------------------------------------------------------------- * PETSc *-------------------------------------------------------------------*/ #elif defined(PETSC_GET_ROW) #undef __FUNC__ #define __FUNC__ "EuclidGetRow (PETSC_GET_ROW)" void EuclidGetRow(void *Ain, HYPRE_Int row, HYPRE_Int *len, HYPRE_Int **ind, HYPRE_Real **val) { START_FUNC_DH Mat A = Ain; HYPRE_Int ierr; ierr = MatGetRow(A, row, len, ind, val); if (ierr) { hypre_sprintf(msgBuf_dh, "PETSc's MatGetRow bombed for row= %i", row); SET_V_ERROR(msgBuf_dh); } END_FUNC_DH } #undef __FUNC__ #define __FUNC__ "EuclidRestoreRow (PETSC_GET_ROW)" void EuclidRestoreRow(void *Ain, HYPRE_Int row, HYPRE_Int *len, HYPRE_Int **ind, HYPRE_Real **val) { START_FUNC_DH Mat A = (Mat)Ain; HYPRE_Int ierr; ierr = MatRestoreRow(A, row, len, ind, val); if (ierr) { hypre_sprintf(msgBuf_dh, "PETSc's MatRestoreRow bombed for row= %i", row); SET_V_ERROR(msgBuf_dh); } END_FUNC_DH } #undef __FUNC__ #define __FUNC__ "EuclidGetDimensions (PETSC)" void EuclidGetDimensions(void *Ain, HYPRE_Int *beg_row, HYPRE_Int *rowsLocal, HYPRE_Int *rowsGlobal) { START_FUNC_DH Mat A = (Mat)Ain; HYPRE_Int first, ierr, last; HYPRE_Int rows, cols; ierr = MatGetOwnershipRange(A, &first, &last); if (ierr) { hypre_sprintf(msgBuf_dh, "PETSc's MatGetOwnershipRange failed"); SET_V_ERROR(msgBuf_dh); } ierr = MatGetSize(A, &rows, &cols); if (ierr) { hypre_sprintf(msgBuf_dh, "PETSc'MatGetSize failed"); SET_V_ERROR(msgBuf_dh); } if (rows != cols) { hypre_sprintf(msgBuf_dh, "matrix is not square; global dimensions: rows = %i, cols = %i", rows, cols); SET_V_ERROR(msgBuf_dh); } *beg_row = first; *rowsLocal = last - first; *rowsGlobal = rows; END_FUNC_DH } #undef __FUNC__ #define __FUNC__ "EuclidReadLocalNz (PETSC)" HYPRE_Int EuclidReadLocalNz(void *Ain) { START_FUNC_DH Mat A = (Mat)Ain; HYPRE_Int m, n, ierr; ierr = MatGetLocalSize(Ain, &m, &n); if (ierr) SET_ERROR(-1, "PETSc::MatGetLocalSize failed!\n"); END_FUNC_VAL(m) } /*------------------------------------------------------------------- * Euclid *-------------------------------------------------------------------*/ #elif defined(EUCLID_GET_ROW) #undef __FUNC__ #define __FUNC__ "EuclidGetRow (EUCLID_GET_ROW)" void EuclidGetRow(void *A, HYPRE_Int globalRow, HYPRE_Int *len, HYPRE_Int **ind, HYPRE_Real **val) { START_FUNC_DH Mat_dh B = (Mat_dh)A; HYPRE_Int row = globalRow - B->beg_row; if (row > B->m) { hypre_sprintf(msgBuf_dh, "requested globalRow= %i, which is local row= %i, but only have %i rows!", globalRow, row, B->m); SET_V_ERROR(msgBuf_dh); } *len = B->rp[row+1] - B->rp[row]; if (ind != NULL) *ind = B->cval + B->rp[row]; if (val != NULL) *val = B->aval + B->rp[row]; END_FUNC_DH } #undef __FUNC__ #define __FUNC__ "EuclidRestoreRow (EUCLID_GET_ROW)" void EuclidRestoreRow(void *A, HYPRE_Int row, HYPRE_Int *len, HYPRE_Int **ind, HYPRE_Real **val) { START_FUNC_DH END_FUNC_DH } #undef __FUNC__ #define __FUNC__ "EuclidGetDimensions (EUCLID)" void EuclidGetDimensions(void *A, HYPRE_Int *beg_row, HYPRE_Int *rowsLocal, HYPRE_Int *rowsGlobal) { START_FUNC_DH Mat_dh B = (Mat_dh)A; *beg_row = B->beg_row; *rowsLocal = B->m; *rowsGlobal = B->n; END_FUNC_DH } #undef __FUNC__ #define __FUNC__ "EuclidReadLocalNz (EUCLID)" HYPRE_Int EuclidReadLocalNz(void *A) { START_FUNC_DH Mat_dh B = (Mat_dh)A; HYPRE_Int nz = B->rp[B->m]; END_FUNC_VAL(nz) } /*------------------------------------------------------------------- * Default *-------------------------------------------------------------------*/ #else #undef __FUNC__ #define __FUNC__ "EuclidGetRow (ERROR)" void EuclidGetRow(void *A, HYPRE_Int row, HYPRE_Int *len, HYPRE_Int **ind, HYPRE_Real **val) { START_FUNC_DH SET_ERROR(EUCLID_ERROR, "Oops; missing XXX_GET_ROW definition!"); END_FUNC_DH } #undef __FUNC__ #define __FUNC__ "EuclidRestoreRow (ERROR)" void EuclidRestoreRow(void *A, HYPRE_Int row, HYPRE_Int *len, HYPRE_Int **ind, HYPRE_Real **val) { START_FUNC_DH SET_ERROR(EUCLID_ERROR, "Oops; missing XXX_GET_ROW definition!"); END_FUNC_DH } #undef __FUNC__ #define __FUNC__ "EuclidGetDimensions (ERROR)" void EuclidGetDimensions(void *A, HYPRE_Int *beg_row, HYPRE_Int *rowsLocal, HYPRE_Int *rowsGlobal) { START_FUNC_DH SET_ERROR(EUCLID_ERROR, "Oops; missing XXX_GET_ROW definition!"); END_FUNC_DH } #undef __FUNC__ #define __FUNC__ "EuclidReadLocalNz (ERROR)" HYPRE_Int EuclidReadLocalNz(void *A) { START_FUNC_DH SET_ERROR(EUCLID_ERROR, "Oops; missing XXX_GET_ROW definition!"); END_FUNC_DH } #endif /*------------------------------------------------------------------- * end of GET_ROW definitions *-------------------------------------------------------------------*/ #undef __FUNC__ #define __FUNC__ "PrintMatUsingGetRow" void PrintMatUsingGetRow(void* A, HYPRE_Int beg_row, HYPRE_Int m, HYPRE_Int *n2o_row, HYPRE_Int *n2o_col, char *filename) { START_FUNC_DH FILE *fp; HYPRE_Int *o2n_col = NULL, pe, i, j, *cval, len; HYPRE_Int newCol, newRow; HYPRE_Real *aval; /* form inverse column permutation */ if (n2o_col != NULL) { o2n_col = (HYPRE_Int*)MALLOC_DH(m*sizeof(HYPRE_Int)); CHECK_V_ERROR; for (i=0; im = end_row - beg_row + 1; ctx->n = M; ctx->A = (void*)A; END_FUNC_DH } #endif hypre-2.33.0/src/distributed_ls/Euclid/getRow_dh.h000066400000000000000000000017521477326011500220500ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #ifndef GET_ROW_DH #define GET_ROW_DH /* #include "euclid_common.h" */ /* "row" refers to global row number */ extern void EuclidGetDimensions(void *A, HYPRE_Int *beg_row, HYPRE_Int *rowsLocal, HYPRE_Int *rowsGlobal); extern void EuclidGetRow(void *A, HYPRE_Int row, HYPRE_Int *len, HYPRE_Int **ind, HYPRE_Real **val); extern void EuclidRestoreRow(void *A, HYPRE_Int row, HYPRE_Int *len, HYPRE_Int **ind, HYPRE_Real **val); extern HYPRE_Int EuclidReadLocalNz(void *A); extern void PrintMatUsingGetRow(void* A, HYPRE_Int beg_row, HYPRE_Int m, HYPRE_Int *n2o_row, HYPRE_Int *n2o_col, char *filename); #endif hypre-2.33.0/src/distributed_ls/Euclid/globalObjects.c000066400000000000000000000261061477326011500226730ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "_hypre_Euclid.h" /* Contains definitions of globally scoped objects; * Also, functions for error handling and message logging. */ /* #include "euclid_common.h" */ /* #include "Parser_dh.h" */ /* #include "Mem_dh.h" */ /* #include "TimeLog_dh.h" */ extern void sigRegister_dh(void); /* use sig_dh.h if not for euclid_signals_len */ /*------------------------------------------------------------------------- * Globally scoped variables, flags, and objects *-------------------------------------------------------------------------*/ bool errFlag_dh = false; /* set to "true" by functions encountering errors */ Parser_dh parser_dh = NULL; /* for setting/getting runtime options */ TimeLog_dh tlog_dh = NULL; /* internal timing functionality */ Mem_dh mem_dh = NULL; /* memory management */ FILE *logFile = NULL; char msgBuf_dh[MSG_BUF_SIZE_DH]; /* for internal use */ HYPRE_Int np_dh = 1; /* number of processors and subdomains */ HYPRE_Int myid_dh = 0; /* rank of this processor (and subdomain) */ MPI_Comm comm_dh = 0; /* Each processor (may) open a logfile. * The bools are switches for controlling the amount of informational * output, and where it gets written to. Function logging is only enabled * when compiled with the debugging (-g) option. */ void openLogfile_dh(HYPRE_Int argc, char *argv[]); void closeLogfile_dh(void); bool logInfoToStderr = false; bool logInfoToFile = true; bool logFuncsToStderr = false; bool logFuncsToFile = false; bool ignoreMe = true; HYPRE_Int ref_counter = 0; /*------------------------------------------------------------------------- * End of global definitions. * Error and info functions follow. *-------------------------------------------------------------------------*/ #define MAX_MSG_SIZE 1024 #define MAX_STACK_SIZE 20 static char errMsg_private[MAX_STACK_SIZE][MAX_MSG_SIZE]; static HYPRE_Int errCount_private = 0; static char calling_stack[MAX_STACK_SIZE][MAX_MSG_SIZE]; /* static HYPRE_Int priority_private[MAX_STACK_SIZE]; */ static HYPRE_Int calling_stack_count = 0; /* static char errMsg[MAX_MSG_SIZE]; */ void openLogfile_dh(HYPRE_Int argc, char *argv[]) { char buf[1024]; /* this doesn't really belong here, but it's gotta go someplace! */ /* strcpy(errMsg, "error msg was never set -- ??"); */ if (logFile != NULL) return; /* set default logging filename */ hypre_sprintf(buf, "logFile"); /* set user supplied logging filename, if one was specified */ if (argc && argv != NULL) { HYPRE_Int j; for (j=1; j%s< for writing; continuing anyway\n", buf); } } } void closeLogfile_dh(void) { if (logFile != NULL) { if (fclose(logFile)) { hypre_fprintf(stderr, "Error closing logFile\n"); } logFile = NULL; } } void setInfo_dh(const char *msg,const char *function,const char *file, HYPRE_Int line) { if (logInfoToFile && logFile != NULL) { hypre_fprintf(logFile, "INFO: %s;\n function= %s file=%s line=%i\n", msg, function, file, line); fflush(logFile); } if (logInfoToStderr) { hypre_fprintf(stderr, "INFO: %s;\n function= %s file=%s line=%i\n", msg, function, file, line); } } /*---------------------------------------------------------------------- * Error handling stuph follows *----------------------------------------------------------------------*/ void dh_StartFunc(const char *function,const char *file, HYPRE_Int line, HYPRE_Int priority) { if (priority == 1) { hypre_sprintf(calling_stack[calling_stack_count], "[%i] %s file= %s line= %i", myid_dh, function, file, line); /* priority_private[calling_stack_count] = priority; */ ++calling_stack_count; if (calling_stack_count == MAX_STACK_SIZE) { hypre_fprintf(stderr, "_____________ dh_StartFunc: OVERFLOW _____________________\n"); if (logFile != NULL) { hypre_fprintf(logFile, "_____________ dh_StartFunc: OVERFLOW _____________________\n"); } --calling_stack_count; } } } void dh_EndFunc(const char *function, HYPRE_Int priority) { HYPRE_UNUSED_VAR(function); if (priority == 1) { --calling_stack_count; if (calling_stack_count < 0) { calling_stack_count = 0; hypre_fprintf(stderr, "_____________ dh_EndFunc: UNDERFLOW _____________________\n"); if (logFile != NULL) { hypre_fprintf(logFile, "_____________ dh_EndFunc: UNDERFLOW _____________________\n"); } } } } void setError_dh(const char *msg,const char *function,const char *file, HYPRE_Int line) { errFlag_dh = true; if (! strcmp(msg, "")) { hypre_sprintf(errMsg_private[errCount_private], "[%i] called from: %s file= %s line= %i", myid_dh, function, file, line); } else { hypre_sprintf(errMsg_private[errCount_private], "[%i] ERROR: %s\n %s file= %s line= %i\n", myid_dh, msg, function, file, line); } ++errCount_private; /* shouldn't do things like this; but we're not building for the ages: all the world's a stage, this is merely a prop to be bonfired at play's end. */ if (errCount_private == MAX_STACK_SIZE) --errCount_private; } void printErrorMsg(FILE *fp) { if (! errFlag_dh) { hypre_fprintf(fp, "errFlag_dh is not set; nothing to print!\n"); fflush(fp); } else { HYPRE_Int i; hypre_fprintf(fp, "\n============= error stack trace ====================\n"); for (i=0; i MAX_ERROR_SPACES-1) nesting = MAX_ERROR_SPACES-1; spaces[INDENT_DH*nesting] = '\0'; if (logFuncsToStderr) { hypre_fprintf(stderr, "%s(%i) %s [file= %s line= %i]\n", spaces, nesting, function, file, line); } if (logFuncsToFile && logFile != NULL) { hypre_fprintf(logFile, "%s(%i) %s [file= %s line= %i]\n", spaces, nesting, function, file, line); fflush(logFile); } } void Error_dhEndFunc(char *function) { HYPRE_UNUSED_VAR(function); nesting -= 1; if (nesting < 0) nesting = 0; spaces[INDENT_DH*nesting] = '\0'; } /*---------------------------------------------------------------------- * Euclid initialization and shutdown *----------------------------------------------------------------------*/ static bool EuclidIsActive = false; #undef __FUNC__ #define __FUNC__ "EuclidIsInitialized" bool EuclidIsInitialized(void) { return EuclidIsActive; } #undef __FUNC__ #define __FUNC__ "EuclidInitialize" void EuclidInitialize(HYPRE_Int argc, char *argv[], char *help) { if (! EuclidIsActive) { hypre_MPI_Comm_size(comm_dh, &np_dh); hypre_MPI_Comm_rank(comm_dh, &myid_dh); openLogfile_dh(argc, argv); if (mem_dh == NULL) { Mem_dhCreate(&mem_dh); CHECK_V_ERROR; } if (tlog_dh == NULL) { TimeLog_dhCreate(&tlog_dh); CHECK_V_ERROR; } if (parser_dh == NULL) { Parser_dhCreate(&parser_dh); CHECK_V_ERROR; } Parser_dhInit(parser_dh, argc, argv); CHECK_V_ERROR; if (Parser_dhHasSwitch(parser_dh, "-sig_dh")) { sigRegister_dh(); CHECK_V_ERROR; } if (Parser_dhHasSwitch(parser_dh, "-help")) { if (myid_dh == 0) hypre_printf("%s\n\n", help); EUCLID_EXIT; } if (Parser_dhHasSwitch(parser_dh, "-logFuncsToFile")) { logFuncsToFile = true; } if (Parser_dhHasSwitch(parser_dh, "-logFuncsToStderr")) { logFuncsToStderr = true; } EuclidIsActive = true; } } /* to do: should restore the signal handler that we preempted above! */ #undef __FUNC__ #define __FUNC__ "EuclidFinalize" void EuclidFinalize(void) { if (ref_counter) return; if (EuclidIsActive) { if (parser_dh != NULL) { Parser_dhDestroy(parser_dh); CHECK_V_ERROR; } if (tlog_dh != NULL) { TimeLog_dhDestroy(tlog_dh); CHECK_V_ERROR; } if (logFile != NULL) { Mem_dhPrint(mem_dh, logFile, true); CHECK_V_ERROR; } /* Mem_dhPrint(mem_dh, stderr, false); CHECK_V_ERROR; */ if (mem_dh != NULL) { Mem_dhDestroy(mem_dh); CHECK_V_ERROR; } if (logFile != NULL) { closeLogfile_dh(); CHECK_V_ERROR; } EuclidIsActive = false; } } /*---------------------------------------------------------------------- * msc. support functions *----------------------------------------------------------------------*/ #undef __FUNC__ #define __FUNC__ "printf_dh" void printf_dh(const char *fmt, ...) { START_FUNC_DH va_list args; char *buf = msgBuf_dh; va_start(args, fmt); vsprintf(buf, fmt, args); if (myid_dh == 0) { hypre_fprintf(stdout, "%s", buf); } va_end(args); END_FUNC_DH } #undef __FUNC__ #define __FUNC__ "fprintf_dh" void fprintf_dh(FILE *fp,const char *fmt, ...) { START_FUNC_DH va_list args; char *buf = msgBuf_dh; va_start(args, fmt); vsprintf(buf, fmt, args); if (myid_dh == 0) { hypre_fprintf(fp, "%s", buf); } va_end(args); END_FUNC_DH } #undef __FUNC__ #define __FUNC__ "echoInvocation_dh" void echoInvocation_dh(MPI_Comm comm, char *prefix, HYPRE_Int argc, char *argv[]) { START_FUNC_DH HYPRE_Int i, id; hypre_MPI_Comm_rank(comm, &id); if (prefix != NULL) { printf_dh("\n%s ", prefix); } else { printf_dh("\n"); } printf_dh("program invocation: "); for (i=0; i $INTERNAL_HEADER <<@ /*** DO NOT EDIT THIS FILE DIRECTLY (use 'headers' to generate) ***/ #ifndef hypre_EUCLID_HEADER #define hypre_EUCLID_HEADER #define USING_MPI #define HYPRE_GET_ROW #define HYPRE_MODE #define OPTIMIZED_DH #if defined(HYPRE_MODE) #include "HYPRE_parcsr_mv.h" #include "HYPRE_config.h" #include "HYPRE_distributed_matrix_mv.h" #include "_hypre_utilities.h" #elif defined(PETSC_MODE) #include "petsc_config.h" #endif #ifdef __cplusplus extern "C" { #endif @ #=========================================================================== # Structures and prototypes #=========================================================================== cat euclid_config.h >> $INTERNAL_HEADER cat macros_dh.h >> $INTERNAL_HEADER cat euclid_common.h >> $INTERNAL_HEADER # cat sig_dh.h >> $INTERNAL_HEADER cat ExternalRows_dh.h >> $INTERNAL_HEADER cat Factor_dh.h >> $INTERNAL_HEADER cat Vec_dh.h >> $INTERNAL_HEADER cat MatGenFD.h >> $INTERNAL_HEADER cat Mat_dh.h >> $INTERNAL_HEADER cat SubdomainGraph_dh.h >> $INTERNAL_HEADER cat TimeLog_dh.h >> $INTERNAL_HEADER cat SortedSet_dh.h >> $INTERNAL_HEADER cat Mem_dh.h >> $INTERNAL_HEADER cat shellSort_dh.h >> $INTERNAL_HEADER cat Numbering_dh.h >> $INTERNAL_HEADER cat Hash_i_dh.h >> $INTERNAL_HEADER cat Timer_dh.h >> $INTERNAL_HEADER cat Parser_dh.h >> $INTERNAL_HEADER cat SortedList_dh.h >> $INTERNAL_HEADER cat Hash_dh.h >> $INTERNAL_HEADER cat mat_dh_private.h >> $INTERNAL_HEADER cat getRow_dh.h >> $INTERNAL_HEADER cat ilu_dh.h >> $INTERNAL_HEADER cat Euclid_dh.h >> $INTERNAL_HEADER cat krylov_dh.h >> $INTERNAL_HEADER cat io_dh.h >> $INTERNAL_HEADER cat blas_dh.h >> $INTERNAL_HEADER #=========================================================================== # Include guards #=========================================================================== cat >> $INTERNAL_HEADER <<@ #ifdef __cplusplus } #endif #endif @ hypre-2.33.0/src/distributed_ls/Euclid/ilu_dh.h000066400000000000000000000025001477326011500213620ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #ifndef ILU_MPI_DH #define ILU_MPI_DH /* #include "euclid_common.h" */ void reallocate_private(HYPRE_Int row, HYPRE_Int newEntries, HYPRE_Int *nzHave, HYPRE_Int **rp, HYPRE_Int **cval, float **aval, HYPRE_Real **avalD, HYPRE_Int **fill); extern void ilu_mpi_pilu(Euclid_dh ctx); /* driver for comms intermingled with factorization */ extern void iluk_mpi_pilu(Euclid_dh ctx); /* the factorization algorithm */ extern void compute_scaling_private(HYPRE_Int row, HYPRE_Int len, HYPRE_Real *AVAL, Euclid_dh ctx); extern void iluk_mpi_bj(Euclid_dh ctx); extern void iluk_seq(Euclid_dh ctx); extern void iluk_seq_block(Euclid_dh ctx); /* for sequential or parallel block jacobi. If used for block jacobi, column indices are referenced to 0 on return; make sure and add beg_row to these values before printing the matrix! 1st version is for single precision, 2nd is for HYPRE_Real. */ extern void ilut_seq(Euclid_dh ctx); #endif hypre-2.33.0/src/distributed_ls/Euclid/ilu_mpi_bj.c000066400000000000000000000230631477326011500222310ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "_hypre_Euclid.h" /* to do: re-integrate fix-smalll-pivots */ /* #include "ilu_dh.h" */ /* #include "Mem_dh.h" */ /* #include "Parser_dh.h" */ /* #include "Euclid_dh.h" */ /* #include "getRow_dh.h" */ /* #include "Factor_dh.h" */ /* #include "SubdomainGraph_dh.h" */ HYPRE_Int symbolic_row_private(HYPRE_Int localRow, HYPRE_Int beg_row, HYPRE_Int end_row, HYPRE_Int *list, HYPRE_Int *marker, HYPRE_Int *tmpFill, HYPRE_Int len, HYPRE_Int *CVAL, HYPRE_Real *AVAL, HYPRE_Int *o2n_col, Euclid_dh ctx); static HYPRE_Int numeric_row_private(HYPRE_Int localRow, HYPRE_Int beg_row, HYPRE_Int end_row, HYPRE_Int len, HYPRE_Int *CVAL, HYPRE_Real *AVAL, REAL_DH *work, HYPRE_Int *o2n_col, Euclid_dh ctx); /* all non-local column indices are discarded in symbolic_row_private() */ #undef __FUNC__ #define __FUNC__ "iluk_mpi_bj" void iluk_mpi_bj(Euclid_dh ctx) { START_FUNC_DH HYPRE_Int *rp, *cval, *diag; HYPRE_Int *CVAL; HYPRE_Int i, j, len, count, col, idx = 0; HYPRE_Int *list, *marker, *fill, *tmpFill; HYPRE_Int temp, m, from = ctx->from, to = ctx->to; HYPRE_Int *n2o_row, *o2n_col; HYPRE_Int first_row, last_row; HYPRE_Real *AVAL; REAL_DH *work, *aval; Factor_dh F = ctx->F; SubdomainGraph_dh sg = ctx->sg; if (ctx->F == NULL) { SET_V_ERROR("ctx->F is NULL"); } if (ctx->F->rp == NULL) { SET_V_ERROR("ctx->F->rp is NULL"); } /* printf_dh("====================== starting iluk_mpi_bj; level= %i\n\n", ctx->level); */ m = F->m; rp = F->rp; cval = F->cval; fill = F->fill; diag = F->diag; aval = F->aval; work = ctx->work; n2o_row = sg->n2o_row; o2n_col = sg->o2n_col; /* allocate and initialize working space */ list = (HYPRE_Int*)MALLOC_DH((m+1)*sizeof(HYPRE_Int)); CHECK_V_ERROR; marker = (HYPRE_Int*)MALLOC_DH(m*sizeof(HYPRE_Int)); CHECK_V_ERROR; tmpFill = (HYPRE_Int*)MALLOC_DH(m*sizeof(HYPRE_Int)); CHECK_V_ERROR; for (i=0; ibeg_row[myid_dh]; last_row = first_row + sg->row_count[myid_dh]; for (i=from; iA, globalRow, &len, &CVAL, &AVAL); CHECK_V_ERROR; /* compute scaling value for row(i) */ if (ctx->isScaled) { compute_scaling_private(i, len, AVAL, ctx); CHECK_V_ERROR; } /* Compute symbolic factor for row(i); this also performs sparsification */ count = symbolic_row_private(i, first_row, last_row, list, marker, tmpFill, len, CVAL, AVAL, o2n_col, ctx); CHECK_V_ERROR; /* Ensure adequate storage; reallocate, if necessary. */ if (idx + count > F->alloc) { Factor_dhReallocate(F, idx, count); CHECK_V_ERROR; SET_INFO("REALLOCATED from lu_mpi_bj"); cval = F->cval; fill = F->fill; aval = F->aval; } /* Copy factored symbolic row to permanent storage */ col = list[m]; while (count--) { cval[idx] = col; fill[idx] = tmpFill[col]; ++idx; col = list[col]; } /* add row-pointer to start of next row. */ rp[i+1] = idx; /* Insert pointer to diagonal */ temp = rp[i]; while (cval[temp] != i) ++temp; diag[i] = temp; /* compute numeric factor for current row */ numeric_row_private(i, first_row, last_row, len, CVAL, AVAL, work, o2n_col, ctx); CHECK_V_ERROR EuclidRestoreRow(ctx->A, globalRow, &len, &CVAL, &AVAL); CHECK_V_ERROR; /* Copy factored numeric row to permanent storage, and re-zero work vector */ for (j=rp[i]; jlevel, m = ctx->F->m; HYPRE_Int *cval = ctx->F->cval, *diag = ctx->F->diag, *rp = ctx->F->rp; HYPRE_Int *fill = ctx->F->fill; HYPRE_Int count = 0; HYPRE_Int j, node, tmp, col, head; HYPRE_Int fill1, fill2; HYPRE_Real val; HYPRE_Real thresh = ctx->sparseTolA; REAL_DH scale; scale = ctx->scale[localRow]; ctx->stats[NZA_STATS] += (HYPRE_Real)len; /* Insert col indices in linked list, and values in work vector. * List[m] points to the first (smallest) col in the linked list. * Column values are adjusted from global to local numbering. */ list[m] = m; for (j=0; j= beg_row && col < end_row) { col -= beg_row; /* adjust column to local zero-based */ col = o2n_col[col]; /* permute column */ if (hypre_abs(scale*val) > thresh || col == localRow) { /* sparsification */ ++count; while (col > list[tmp]) tmp = list[tmp]; list[col] = list[tmp]; list[tmp] = col; tmpFill[col] = 0; marker[col] = localRow; } } } /* insert diag if not already present */ if (marker[localRow] != localRow) { /* ctx->symbolicZeroDiags += 1; */ tmp = m; while (localRow > list[tmp]) tmp = list[tmp]; list[localRow] = list[tmp]; list[tmp] = localRow; tmpFill[localRow] = 0; marker[localRow] = localRow; ++count; } ctx->stats[NZA_USED_STATS] += (HYPRE_Real)count; /* update row from previously factored rows */ head = m; if (level > 0) { while (list[head] < localRow) { node = list[head]; fill1 = tmpFill[node]; if (fill1 < level) { for (j = diag[node]+1; j list[tmp]) tmp = list[tmp]; list[col] = list[tmp]; list[tmp] = col; ++count; /* increment fill count */ } /* if previously-discovered fill, update the entry's level. */ else { tmpFill[col] = (fill2 < tmpFill[col]) ? fill2 : tmpFill[col]; } } } } head = list[head]; /* advance to next item in linked list */ } } END_FUNC_VAL(count) } #undef __FUNC__ #define __FUNC__ "numeric_row_private" HYPRE_Int numeric_row_private(HYPRE_Int localRow, HYPRE_Int beg_row, HYPRE_Int end_row, HYPRE_Int len, HYPRE_Int *CVAL, HYPRE_Real *AVAL, REAL_DH *work, HYPRE_Int *o2n_col, Euclid_dh ctx) { START_FUNC_DH HYPRE_Real pc, pv, multiplier; HYPRE_Int j, k, col, row; HYPRE_Int *rp = ctx->F->rp, *cval = ctx->F->cval; HYPRE_Int *diag = ctx->F->diag; HYPRE_Real val; REAL_DH *aval = ctx->F->aval, scale; scale = ctx->scale[localRow]; /* zero work vector */ /* note: indices in col[] are already permuted, and are local (zero-based) */ for (j=rp[localRow]; j= beg_row && col < end_row) { col -= beg_row; /* adjust column to local zero-based */ col = o2n_col[col]; /* we permute the indices from A */ work[col] = val*scale; } } for (j=rp[localRow]; jfrom, to = ctx->to; HYPRE_Int i, m; HYPRE_Int *n2o_row; /* *o2n_col; */ HYPRE_Int *rp, *cval, *diag, *fill; HYPRE_Int beg_row, beg_rowP, end_rowP; SubdomainGraph_dh sg = ctx->sg; HYPRE_Int *CVAL, len, idx = 0, count; HYPRE_Real *AVAL; REAL_DH *aval; Factor_dh F = ctx->F; SortedList_dh slist = ctx->slist; ExternalRows_dh extRows = ctx->extRows; bool bj, noValues, debug = false; /* for debugging */ if (logFile != NULL && Parser_dhHasSwitch(parser_dh, "-debug_ilu")) debug = true; noValues = Parser_dhHasSwitch(parser_dh, "-noValues"); bj = ctx->F->blockJacobi; m = F->m; rp = F->rp; cval = F->cval; fill = F->fill; diag = F->diag; aval = F->aval; /* work = ctx->work; */ n2o_row = sg->n2o_row; /* o2n_col = sg->o2n_col; */ if (from != 0) idx = rp[from]; /* global numbers of first and last locally owned rows, with respect to A */ beg_row = sg->beg_row[myid_dh]; /* end_row = beg_row + sg->row_count[myid_dh]; */ /* global number or first locally owned row, after reordering */ beg_rowP = sg->beg_rowP[myid_dh]; end_rowP = beg_rowP + sg->row_count[myid_dh]; /* loop over rows to be factored (i references local rows) */ for (i=from; iA, globalRow, &len, &CVAL, &AVAL); CHECK_V_ERROR; if (debug) { HYPRE_Int h; hypre_fprintf(logFile, "ILU_pilu EuclidGetRow:\n"); for (h=0; hisScaled) { compute_scaling_private(i, len, AVAL, ctx); CHECK_V_ERROR; } SortedList_dhReset(slist, i); CHECK_V_ERROR; /* Compute symbolic factor for row(i); this also performs sparsification */ iluk_symbolic_row_private(i, len, CVAL, AVAL, extRows, slist, ctx, debug); CHECK_V_ERROR; /* enforce subdomain constraint */ SortedList_dhEnforceConstraint(slist, sg); /* compute numeric factor for row */ if (! noValues) { iluk_numeric_row_private(i, extRows, slist, ctx, debug); CHECK_V_ERROR; } EuclidRestoreRow(ctx->A, globalRow, &len, &CVAL, &AVAL); CHECK_V_ERROR; /* Ensure adequate storage; reallocate, if necessary. */ count = SortedList_dhReadCount(slist); CHECK_V_ERROR; /* Ensure adequate storage; reallocate, if necessary. */ if (idx + count > F->alloc) { Factor_dhReallocate(F, idx, count); CHECK_V_ERROR; SET_INFO("REALLOCATED from ilu_mpi_pilu"); cval = F->cval; fill = F->fill; aval = F->aval; } /* Copy factor to permanent storage */ if (bj) { /* for debugging: blockJacobi case */ HYPRE_Int col; while (count--) { SRecord *sr = SortedList_dhGetSmallest(slist); CHECK_V_ERROR; col = sr->col; if (col >= beg_rowP && col < end_rowP) { cval[idx] = col; if (noValues) { aval[idx] = 0.0; } else { aval[idx] = sr->val; } fill[idx] = sr->level; ++idx; } } } if (debug) { hypre_fprintf(logFile, "ILU_pilu "); while (count--) { SRecord *sr = SortedList_dhGetSmallest(slist); CHECK_V_ERROR; cval[idx] = sr->col; aval[idx] = sr->val; fill[idx] = sr->level; hypre_fprintf(logFile, "%i,%i,%g ; ", 1+cval[idx], fill[idx], aval[idx]); ++idx; } hypre_fprintf(logFile, "\n"); } else { while (count--) { SRecord *sr = SortedList_dhGetSmallest(slist); CHECK_V_ERROR; cval[idx] = sr->col; aval[idx] = sr->val; fill[idx] = sr->level; ++idx; } } /* add row-pointer to start of next row. */ rp[i+1] = idx; /* Insert pointer to diagonal */ { HYPRE_Int temp = rp[i]; bool flag = true; while (temp < idx) { if (cval[temp] == i+beg_rowP) { diag[i] = temp; flag = false; break; } ++temp; } if (flag) { if (logFile != NULL) { HYPRE_Int k; hypre_fprintf(logFile, "Failed to find diag in localRow %i (globalRow %i; ct= %i)\n ", 1+i, i+1+beg_rowP, rp[i+1] - rp[i]); for (k=rp[i]; klevel, m = ctx->m; HYPRE_Int beg_row = ctx->sg->beg_row[myid_dh]; HYPRE_Int beg_rowP = ctx->sg->beg_rowP[myid_dh]; HYPRE_Int *cval = ctx->F->cval, *diag = ctx->F->diag; HYPRE_Int *rp = ctx->F->rp, *fill = ctx->F->fill; HYPRE_Int j, node, col; HYPRE_Int end_rowP = beg_rowP + m; HYPRE_Int level_1, level_2; HYPRE_Int *cvalPtr, *fillPtr; SRecord sr, *srPtr; REAL_DH scale, *avalPtr; HYPRE_Real thresh = ctx->sparseTolA; bool wasInserted; HYPRE_Int count = 0; scale = ctx->scale[localRow]; ctx->stats[NZA_STATS] += (HYPRE_Real)len; /* insert col indices in sorted linked list */ sr.level = 0; for (j=0; j thresh) { */ wasInserted = SortedList_dhPermuteAndInsert(slist, &sr, thresh); CHECK_V_ERROR; if (wasInserted) ++count; /* } */ if (debug) { hypre_fprintf(logFile, "ILU_pilu inserted from A: col= %i val= %g\n", 1+CVAL[j], sr.val); } } /* ensure diagonal entry is inserted */ sr.val = 0.0; sr.col = localRow+beg_rowP; srPtr = SortedList_dhFind(slist, &sr); CHECK_V_ERROR; if (srPtr == NULL) { SortedList_dhInsert(slist, &sr); CHECK_V_ERROR; ++count; if (debug) { hypre_fprintf(logFile, "ILU_pilu inserted missing diagonal: %i\n", 1+localRow+beg_row); } } ctx->stats[NZA_USED_STATS] += (HYPRE_Real)count; /* update row from previously factored rows */ sr.val = 0.0; if (level > 0) { while(1) { srPtr = SortedList_dhGetSmallestLowerTri(slist); CHECK_V_ERROR; if (srPtr == NULL) break; node = srPtr->col; if (debug) { hypre_fprintf(logFile, "ILU_pilu sf updating from row: %i\n", 1+srPtr->col); } level_1 = srPtr->level; if (level_1 < level) { /* case 1: locally owned row */ if (node >= beg_rowP && node < end_rowP) { node -= beg_rowP; len = rp[node+1] - diag[node] - 1; cvalPtr = cval + diag[node] + 1; fillPtr = fill + diag[node] + 1; } /* case 2: external row */ else { len = 0; ExternalRows_dhGetRow(extRows, node, &len, &cvalPtr, &fillPtr, &avalPtr); CHECK_V_ERROR; if (debug && len == 0) { hypre_fprintf(stderr, "ILU_pilu sf failed to get extern row: %i\n", 1+node); } } /* merge in strict upper triangular portion of row */ for (j = 0; jm; HYPRE_Int beg_rowP = ctx->sg->beg_rowP[myid_dh]; HYPRE_Int end_rowP = beg_rowP + m; HYPRE_Int len, row; HYPRE_Int *rp = ctx->F->rp, *cval = ctx->F->cval, *diag = ctx->F->diag; REAL_DH *avalPtr, *aval = ctx->F->aval; HYPRE_Int *cvalPtr; HYPRE_Real multiplier, pc, pv; SRecord sr, *srPtr; /* note: non-zero entries from A were inserted in list during iluk_symbolic_row_private */ SortedList_dhResetGetSmallest(slist); CHECK_V_ERROR; while (1) { srPtr = SortedList_dhGetSmallestLowerTri(slist); CHECK_V_ERROR; if (srPtr == NULL) break; /* update new_row's values from upper triangular portion of previously factored row */ row = srPtr->col; if (row >= beg_rowP && row < end_rowP) { HYPRE_Int local_row = row - beg_rowP; len = rp[local_row+1] - diag[local_row]; cvalPtr = cval + diag[local_row]; avalPtr = aval + diag[local_row]; } else { len = 0; ExternalRows_dhGetRow(extRows, row, &len, &cvalPtr, NULL, &avalPtr); CHECK_V_ERROR; if (debug && len == 0) { hypre_fprintf(stderr, "ILU_pilu failed to get extern row: %i\n", 1+row); } } if (len) { /* first, form and store pivot */ sr.col = row; srPtr = SortedList_dhFind(slist, &sr); CHECK_V_ERROR; if (srPtr == NULL) { hypre_sprintf(msgBuf_dh, "find failed for sr.col = %i while factoring local row= %i \n", 1+sr.col, new_row+1); SET_V_ERROR(msgBuf_dh); } pc = srPtr->val; if (pc != 0.0) { pv = *avalPtr++; --len; ++cvalPtr; multiplier = pc / pv; srPtr->val = multiplier; if (debug) { hypre_fprintf(logFile, "ILU_pilu nf updating from row: %i; multiplier = %g\n", 1+srPtr->col, multiplier); } /* second, update from strict upper triangular portion of row */ while (len--) { sr.col = *cvalPtr++; sr.val = *avalPtr++; srPtr = SortedList_dhFind(slist, &sr); CHECK_V_ERROR; if (srPtr != NULL) { srPtr->val -= (multiplier * sr.val); } } } else { if (debug) { hypre_fprintf(logFile, "ILU_pilu NO UPDATE from row: %i; srPtr->val = 0.0\n", 1+srPtr->col); } } } } END_FUNC_DH } hypre-2.33.0/src/distributed_ls/Euclid/ilu_seq.c000066400000000000000000000604341477326011500215640ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "_hypre_Euclid.h" /* to do: re-integrate fix-smalll-pivots */ /* #include "ilu_dh.h" */ /* #include "Mem_dh.h" */ /* #include "Parser_dh.h" */ /* #include "Euclid_dh.h" */ /* #include "getRow_dh.h" */ /* #include "Factor_dh.h" */ /* #include "SubdomainGraph_dh.h" */ static bool check_constraint_private(Euclid_dh ctx, HYPRE_Int b, HYPRE_Int j); static HYPRE_Int symbolic_row_private(HYPRE_Int localRow, HYPRE_Int *list, HYPRE_Int *marker, HYPRE_Int *tmpFill, HYPRE_Int len, HYPRE_Int *CVAL, HYPRE_Real *AVAL, HYPRE_Int *o2n_col, Euclid_dh ctx, bool debug); static HYPRE_Int numeric_row_private(HYPRE_Int localRow, HYPRE_Int len, HYPRE_Int *CVAL, HYPRE_Real *AVAL, REAL_DH *work, HYPRE_Int *o2n_col, Euclid_dh ctx, bool debug); #undef __FUNC__ #define __FUNC__ "compute_scaling_private" void compute_scaling_private(HYPRE_Int row, HYPRE_Int len, HYPRE_Real *AVAL, Euclid_dh ctx) { START_FUNC_DH HYPRE_Real tmp = 0.0; HYPRE_Int j; for (j=0; jscale[row] = 1.0/tmp; } END_FUNC_DH } #if 0 /* not used ? */ #undef __FUNC__ #define __FUNC__ "fixPivot_private" HYPRE_Real fixPivot_private(HYPRE_Int row, HYPRE_Int len, float *vals) { START_FUNC_DH HYPRE_Int i; float max = 0.0; bool debug = false; for (i=0; ipivotFix) } #endif #undef __FUNC__ #define __FUNC__ "iluk_seq" void iluk_seq(Euclid_dh ctx) { START_FUNC_DH HYPRE_Int *rp, *cval, *diag; HYPRE_Int *CVAL; HYPRE_Int i, j, len, count, col, idx = 0; HYPRE_Int *list, *marker, *fill, *tmpFill; HYPRE_Int temp, m, from = ctx->from, to = ctx->to; HYPRE_Int *n2o_row, *o2n_col, beg_row, beg_rowP; HYPRE_Real *AVAL; REAL_DH *work, *aval; Factor_dh F = ctx->F; SubdomainGraph_dh sg = ctx->sg; bool debug = false; if (logFile != NULL && Parser_dhHasSwitch(parser_dh, "-debug_ilu")) debug = true; m = F->m; rp = F->rp; cval = F->cval; fill = F->fill; diag = F->diag; aval = F->aval; work = ctx->work; count = rp[from]; if (sg == NULL) { SET_V_ERROR("subdomain graph is NULL"); } n2o_row = ctx->sg->n2o_row; o2n_col = ctx->sg->o2n_col; beg_row = ctx->sg->beg_row[myid_dh]; beg_rowP = ctx->sg->beg_rowP[myid_dh]; /* allocate and initialize working space */ list = (HYPRE_Int*)MALLOC_DH((m+1)*sizeof(HYPRE_Int)); CHECK_V_ERROR; marker = (HYPRE_Int*)MALLOC_DH(m*sizeof(HYPRE_Int)); CHECK_V_ERROR; tmpFill = (HYPRE_Int*)MALLOC_DH(m*sizeof(HYPRE_Int)); CHECK_V_ERROR; for (i=0; ilevel); */ /*---------- main loop ----------*/ for (i=from; ibeg_rowP[myid_dh], ctx->level); } EuclidGetRow(ctx->A, globalRow, &len, &CVAL, &AVAL); CHECK_V_ERROR; /* compute scaling value for row(i) */ if (ctx->isScaled) { compute_scaling_private(i, len, AVAL, ctx); CHECK_V_ERROR; } /* Compute symbolic factor for row(i); this also performs sparsification */ count = symbolic_row_private(i, list, marker, tmpFill, len, CVAL, AVAL, o2n_col, ctx, debug); CHECK_V_ERROR; /* Ensure adequate storage; reallocate, if necessary. */ if (idx + count > F->alloc) { Factor_dhReallocate(F, idx, count); CHECK_V_ERROR; SET_INFO("REALLOCATED from ilu_seq"); cval = F->cval; fill = F->fill; aval = F->aval; } /* Copy factored symbolic row to permanent storage */ col = list[m]; while (count--) { cval[idx] = col; fill[idx] = tmpFill[col]; ++idx; /*hypre_fprintf(logFile, " col= %i\n", 1+col); */ col = list[col]; } /* add row-pointer to start of next row. */ rp[i+1] = idx; /* Insert pointer to diagonal */ temp = rp[i]; while (cval[temp] != i) ++temp; diag[i] = temp; /*hypre_fprintf(logFile, " diag[i]= %i\n", diag); */ /* compute numeric factor for current row */ numeric_row_private(i, len, CVAL, AVAL, work, o2n_col, ctx, debug); CHECK_V_ERROR EuclidRestoreRow(ctx->A, globalRow, &len, &CVAL, &AVAL); CHECK_V_ERROR; /* Copy factored numeric row to permanent storage, and re-zero work vector */ if (debug) { hypre_fprintf(logFile, "ILU_seq: "); for (j=rp[i]; jF; SubdomainGraph_dh sg = ctx->sg; bool bj = false, constrained = false; //HYPRE_Int discard = 0; HYPRE_Int gr = -1; /* globalRow */ bool debug = false; if (logFile != NULL && Parser_dhHasSwitch(parser_dh, "-debug_ilu")) debug = true; /*hypre_fprintf(stderr, "====================== starting iluk_seq_block; level= %i\n\n", ctx->level); */ if (!strcmp(ctx->algo_par, "bj")) bj = true; constrained = ! Parser_dhHasSwitch(parser_dh, "-unconstrained"); m = F->m; rp = F->rp; cval = F->cval; fill = F->fill; diag = F->diag; aval = F->aval; work = ctx->work; if (sg != NULL) { n2o_row = sg->n2o_row; o2n_col = sg->o2n_col; row_count = sg->row_count; /* beg_row = sg->beg_row ; */ beg_rowP = sg->beg_rowP; n2o_sub = sg->n2o_sub; blocks = sg->blocks; } else { dummy = (HYPRE_Int*)MALLOC_DH(m*sizeof(HYPRE_Int)); CHECK_V_ERROR; for (i=0; iA, row, &len, &CVAL, &AVAL); CHECK_V_ERROR; /* compute scaling value for row(i) */ if (ctx->isScaled) { compute_scaling_private(i, len, AVAL, ctx); CHECK_V_ERROR; } /* Compute symbolic factor for row(i); this also performs sparsification */ count = symbolic_row_private(i, list, marker, tmpFill, len, CVAL, AVAL, o2n_col, ctx, debug); CHECK_V_ERROR; /* Ensure adequate storage; reallocate, if necessary. */ if (idx + count > F->alloc) { Factor_dhReallocate(F, idx, count); CHECK_V_ERROR; SET_INFO("REALLOCATED from ilu_seq"); cval = F->cval; fill = F->fill; aval = F->aval; } /* Copy factored symbolic row to permanent storage */ col = list[m]; while (count--) { /* constrained pilu */ if (constrained && !bj) { if (col >= first_row && col < end_row) { cval[idx] = col; fill[idx] = tmpFill[col]; ++idx; } else { if (check_constraint_private(ctx, curBlock, col)) { cval[idx] = col; fill[idx] = tmpFill[col]; ++idx; } else { //++discard; } } col = list[col]; } /* block jacobi case */ else if (bj) { if (col >= first_row && col < end_row) { cval[idx] = col; fill[idx] = tmpFill[col]; ++idx; } else { //++discard; } col = list[col]; } /* general case */ else { cval[idx] = col; fill[idx] = tmpFill[col]; ++idx; col = list[col]; } } /* add row-pointer to start of next row. */ rp[i+1] = idx; /* Insert pointer to diagonal */ temp = rp[i]; while (cval[temp] != i) ++temp; diag[i] = temp; /* compute numeric factor for current row */ numeric_row_private(i, len, CVAL, AVAL, work, o2n_col, ctx, debug); CHECK_V_ERROR EuclidRestoreRow(ctx->A, row, &len, &CVAL, &AVAL); CHECK_V_ERROR; /* Copy factored numeric row to permanent storage, and re-zero work vector */ if (debug) { hypre_fprintf(logFile, "ILU_seq: "); for (j=rp[i]; jlevel, m = ctx->F->m; HYPRE_Int *cval = ctx->F->cval, *diag = ctx->F->diag, *rp = ctx->F->rp; HYPRE_Int *fill = ctx->F->fill; HYPRE_Int count = 0; HYPRE_Int j, node, tmp, col, head; HYPRE_Int fill1, fill2, beg_row; HYPRE_Real val; HYPRE_Real thresh = ctx->sparseTolA; REAL_DH scale; scale = ctx->scale[localRow]; ctx->stats[NZA_STATS] += (HYPRE_Real)len; beg_row = ctx->sg->beg_row[myid_dh]; /* Insert col indices in linked list, and values in work vector. * List[m] points to the first (smallest) col in the linked list. * Column values are adjusted from global to local numbering. */ list[m] = m; for (j=0; j thresh || col == localRow) { /* sparsification */ ++count; while (col > list[tmp]) tmp = list[tmp]; list[col] = list[tmp]; list[tmp] = col; tmpFill[col] = 0; marker[col] = localRow; } } /* insert diag if not already present */ if (marker[localRow] != localRow) { tmp = m; while (localRow > list[tmp]) tmp = list[tmp]; list[localRow] = list[tmp]; list[tmp] = localRow; tmpFill[localRow] = 0; marker[localRow] = localRow; ++count; } ctx->stats[NZA_USED_STATS] += (HYPRE_Real)count; /* update row from previously factored rows */ head = m; if (level > 0) { while (list[head] < localRow) { node = list[head]; fill1 = tmpFill[node]; if (debug) { hypre_fprintf(logFile, "ILU_seq sf updating from row: %i\n", 1+node); } if (fill1 < level) { for (j = diag[node]+1; j list[tmp]) tmp = list[tmp]; list[col] = list[tmp]; list[tmp] = col; ++count; /* increment fill count */ } /* if previously-discovered fill, update the entry's level. */ else { tmpFill[col] = (fill2 < tmpFill[col]) ? fill2 : tmpFill[col]; } } } } /* fill1 < level */ head = list[head]; /* advance to next item in linked list */ } } END_FUNC_VAL(count) } #undef __FUNC__ #define __FUNC__ "numeric_row_private" HYPRE_Int numeric_row_private(HYPRE_Int localRow, HYPRE_Int len, HYPRE_Int *CVAL, HYPRE_Real *AVAL, REAL_DH *work, HYPRE_Int *o2n_col, Euclid_dh ctx, bool debug) { START_FUNC_DH HYPRE_Real pc, pv, multiplier; HYPRE_Int j, k, col, row; HYPRE_Int *rp = ctx->F->rp, *cval = ctx->F->cval; HYPRE_Int *diag = ctx->F->diag; HYPRE_Int beg_row; HYPRE_Real val; REAL_DH *aval = ctx->F->aval, scale; scale = ctx->scale[localRow]; beg_row = ctx->sg->beg_row[myid_dh]; /* zero work vector */ /* note: indices in col[] are already permuted. */ for (j=rp[localRow]; jF; SubdomainGraph_dh sg = ctx->sg; bool debug = false; if (logFile != NULL && Parser_dhHasSwitch(parser_dh, "-debug_ilu")) debug = true; m = F->m; rp = F->rp; cval = F->cval; diag = F->diag; aval = F->aval; work = ctx->work; from = ctx->from; to = ctx->to; count = rp[from]; droptol = ctx->droptol; if (sg == NULL) { SET_V_ERROR("subdomain graph is NULL"); } n2o_row = ctx->sg->n2o_row; o2n_col = ctx->sg->o2n_col; beg_row = ctx->sg->beg_row[myid_dh]; beg_rowP = ctx->sg->beg_rowP[myid_dh]; /* allocate and initialize working space */ list = (HYPRE_Int*)MALLOC_DH((m+1)*sizeof(HYPRE_Int)); CHECK_V_ERROR; marker = (HYPRE_Int*)MALLOC_DH(m*sizeof(HYPRE_Int)); CHECK_V_ERROR; for (i=0; iA, globalRow, &len, &CVAL, &AVAL); CHECK_V_ERROR; /* compute scaling value for row(i) */ compute_scaling_private(i, len, AVAL, ctx); CHECK_V_ERROR; /* compute factor for row i */ count = ilut_row_private(i, list, o2n_col, marker, len, CVAL, AVAL, work, ctx, debug); CHECK_V_ERROR; EuclidRestoreRow(ctx->A, globalRow, &len, &CVAL, &AVAL); CHECK_V_ERROR; /* Ensure adequate storage; reallocate, if necessary. */ if (idx + count > F->alloc) { Factor_dhReallocate(F, idx, count); CHECK_V_ERROR; SET_INFO("REALLOCATED from ilu_seq"); cval = F->cval; aval = F->aval; } /* Copy factored row to permanent storage, apply 2nd drop test, and re-zero work vector */ col = list[m]; while (count--) { val = work[col]; if (col == i || hypre_abs(val) > droptol) { cval[idx] = col; aval[idx++] = val; work[col] = 0.0; } col = list[col]; } /* add row-pointer to start of next row. */ rp[i+1] = idx; /* Insert pointer to diagonal */ temp = rp[i]; while (cval[temp] != i) ++temp; diag[i] = temp; /* check for zero diagonal */ if (! aval[diag[i]]) { hypre_sprintf(msgBuf_dh, "zero diagonal in local row %i", i+1); SET_V_ERROR(msgBuf_dh); } } /* --------- main loop end --------- */ /* adjust column indices back to global */ if (beg_rowP) { HYPRE_Int start = rp[from]; HYPRE_Int stop = rp[to]; for (i=start; iF; HYPRE_Int j, col, m = ctx->m, *rp = F->rp, *cval = F->cval; HYPRE_Int tmp, *diag = F->diag; HYPRE_Int head; HYPRE_Int count = 0, beg_row; HYPRE_Real val; HYPRE_Real mult, *aval = F->aval; HYPRE_Real scale, pv, pc; HYPRE_Real droptol = ctx->droptol; HYPRE_Real thresh = ctx->sparseTolA; scale = ctx->scale[localRow]; ctx->stats[NZA_STATS] += (HYPRE_Real)len; beg_row = ctx->sg->beg_row[myid_dh]; /* Insert col indices in linked list, and values in work vector. * List[m] points to the first (smallest) col in the linked list. * Column values are adjusted from global to local numbering. */ list[m] = m; for (j=0; j thresh || col == localRow) { /* sparsification */ ++count; while (col > list[tmp]) tmp = list[tmp]; list[col] = list[tmp]; list[tmp] = col; work[col] = val; marker[col] = localRow; } } /* insert diag if not already present */ if (marker[localRow] != localRow) { tmp = m; while (localRow > list[tmp]) tmp = list[tmp]; list[localRow] = list[tmp]; list[tmp] = localRow; marker[localRow] = localRow; ++count; } /* update current row from previously factored rows */ head = m; while (list[head] < localRow) { HYPRE_Int row = list[head]; /* get the multiplier, and apply 1st drop tolerance test */ pc = work[row]; if (pc != 0.0) { pv = aval[diag[row]]; /* diagonal (pivot) of previously factored row */ mult = pc / pv; /* update localRow from previously factored "row" */ if (hypre_abs(mult) > droptol) { work[row] = mult; for (j=diag[row]+1; j list[tmp]) tmp = list[tmp]; list[col] = list[tmp]; list[tmp] = col; ++count; /* increment fill count */ } } } } head = list[head]; /* advance to next item in linked list */ } END_FUNC_VAL(count) } #undef __FUNC__ #define __FUNC__ "check_constraint_private" bool check_constraint_private(Euclid_dh ctx, HYPRE_Int p1, HYPRE_Int j) { START_FUNC_DH bool retval = false; HYPRE_Int i, p2; HYPRE_Int *nabors, count; SubdomainGraph_dh sg = ctx->sg; if (sg == NULL) { SET_ERROR(-1, "ctx->sg == NULL"); } p2 = SubdomainGraph_dhFindOwner(ctx->sg, j, true); nabors = sg->adj + sg->ptrs[p1]; count = sg->ptrs[p1+1] - sg->ptrs[p1]; /* hypre_printf("p1= %i, p2= %i; p1's nabors: ", p1, p2); for (i=0; im; bool monitor; HYPRE_Int maxIts = ctx->maxIts; HYPRE_Real atol = ctx->atol, rtol = ctx->rtol; /* scalars */ HYPRE_Real alpha, alpha_1 = 1.0, beta_1, widget, widget_1 = 1.0, rho_1, rho_2 = 1.0, s_norm, eps, exit_a, b_iprod, r_iprod; /* vectors */ HYPRE_Real *t, *s, *s_hat, *v, *p, *p_hat, *r, *r_hat; monitor = Parser_dhHasSwitch(parser_dh, "-monitor"); /* allocate working space */ t = (HYPRE_Real*)MALLOC_DH(m*sizeof(HYPRE_Real)); s = (HYPRE_Real*)MALLOC_DH(m*sizeof(HYPRE_Real)); s_hat = (HYPRE_Real*)MALLOC_DH(m*sizeof(HYPRE_Real)); v = (HYPRE_Real*)MALLOC_DH(m*sizeof(HYPRE_Real)); p = (HYPRE_Real*)MALLOC_DH(m*sizeof(HYPRE_Real)); p_hat = (HYPRE_Real*)MALLOC_DH(m*sizeof(HYPRE_Real)); r = (HYPRE_Real*)MALLOC_DH(m*sizeof(HYPRE_Real)); r_hat = (HYPRE_Real*)MALLOC_DH(m*sizeof(HYPRE_Real)); /* r = b - Ax */ Mat_dhMatVec(A, x, s); /* s = Ax */ CopyVec(m, b, r); /* r = b */ Axpy(m, -1.0, s, r); /* r = b-Ax */ CopyVec(m, r, r_hat); /* r_hat = r */ /* compute stopping criteria */ b_iprod = InnerProd(m, b, b); CHECK_V_ERROR; exit_a = atol*atol*b_iprod; CHECK_V_ERROR; /* absolute stopping criteria */ eps = rtol*rtol*b_iprod; /* relative stoping criteria (residual reduction) */ its = 0; while(1) { ++its; rho_1 = InnerProd(m, r_hat, r); if (rho_1 == 0) { SET_V_ERROR("(r_hat . r) = 0; method fails"); } if (its == 1) { CopyVec(m, r, p); /* p = r_0 */ CHECK_V_ERROR; } else { beta_1 = (rho_1/rho_2)*(alpha_1/widget_1); /* p_i = r_(i-1) + beta_(i-1)*( p_(i-1) - w_(i-1)*v_(i-1) ) */ Axpy(m, -widget_1, v, p); CHECK_V_ERROR; ScaleVec(m, beta_1, p); CHECK_V_ERROR; Axpy(m, 1.0, r, p); CHECK_V_ERROR; } /* solve M*p_hat = p_i */ Euclid_dhApply(ctx, p, p_hat); CHECK_V_ERROR; /* v_i = A*p_hat */ Mat_dhMatVec(A, p_hat, v); CHECK_V_ERROR; /* alpha_i = rho_(i-1) / (r_hat^T . v_i ) */ { HYPRE_Real tmp = InnerProd(m, r_hat, v); CHECK_V_ERROR; alpha = rho_1/tmp; } /* s = r_(i-1) - alpha_i*v_i */ CopyVec(m, r, s); CHECK_V_ERROR; Axpy(m, -alpha, v, s); CHECK_V_ERROR; /* check norm of s; if small enough: * set x_i = x_(i-1) + alpha_i*p_i and stop. * (Actually, we use the square of the norm) */ s_norm = InnerProd(m, s, s); if (s_norm < exit_a) { SET_INFO("reached absolute stopping criteria"); break; } /* solve M*s_hat = s */ Euclid_dhApply(ctx, s, s_hat); CHECK_V_ERROR; /* t = A*s_hat */ Mat_dhMatVec(A, s_hat, t); CHECK_V_ERROR; /* w_i = (t . s)/(t . t) */ { HYPRE_Real tmp1, tmp2; tmp1 = InnerProd(m, t, s); CHECK_V_ERROR; tmp2 = InnerProd(m, t, t); CHECK_V_ERROR; widget = tmp1/tmp2; } /* x_i = x_(i-1) + alpha_i*p_hat + w_i*s_hat */ Axpy(m, alpha, p_hat, x); CHECK_V_ERROR; Axpy(m, widget, s_hat, x); CHECK_V_ERROR; /* r_i = s - w_i*t */ CopyVec(m, s, r); CHECK_V_ERROR; Axpy(m, -widget, t, r); CHECK_V_ERROR; /* check convergence; continue if necessary; * for continuation it is necessary thea w != 0. */ r_iprod = InnerProd(m, r, r); CHECK_V_ERROR; if (r_iprod < eps) { SET_INFO("stipulated residual reduction achieved"); break; } /* monitor convergence */ if (monitor && myid_dh == 0) { hypre_fprintf(stderr, "[it = %i] %e\n", its, hypre_sqrt(r_iprod/b_iprod)); } /* prepare for next iteration */ rho_2 = rho_1; widget_1 = widget; alpha_1 = alpha; if (its >= maxIts) { its = -its; break; } } *itsOUT = its; FREE_DH(t); FREE_DH(s); FREE_DH(s_hat); FREE_DH(v); FREE_DH(p); FREE_DH(p_hat); FREE_DH(r); FREE_DH(r_hat); END_FUNC_DH } #undef __FUNC__ #define __FUNC__ "cg_euclid" void cg_euclid(Mat_dh A, Euclid_dh ctx, HYPRE_Real *x, HYPRE_Real *b, HYPRE_Int *itsOUT) { START_FUNC_DH HYPRE_Int its, m = A->m; HYPRE_Real *p, *r, *s; HYPRE_Real alpha, beta, gamma, gamma_old, eps, bi_prod, i_prod; bool monitor; HYPRE_Int maxIts = ctx->maxIts; /* HYPRE_Real atol = ctx->atol */ HYPRE_Real rtol = ctx->rtol; monitor = Parser_dhHasSwitch(parser_dh, "-monitor"); /* compute square of absolute stopping threshold */ /* bi_prod = */ bi_prod = InnerProd(m, b, b); CHECK_V_ERROR; eps = (rtol*rtol)*bi_prod; p = (HYPRE_Real *) MALLOC_DH(m * sizeof(HYPRE_Real)); s = (HYPRE_Real *) MALLOC_DH(m * sizeof(HYPRE_Real)); r = (HYPRE_Real *) MALLOC_DH(m * sizeof(HYPRE_Real)); /* r = b - Ax */ Mat_dhMatVec(A, x, r); /* r = Ax */ CHECK_V_ERROR; ScaleVec(m, -1.0, r); /* r = b */ CHECK_V_ERROR; Axpy(m, 1.0, b, r); /* r = r + b */ CHECK_V_ERROR; /* solve Mp = r */ Euclid_dhApply(ctx, r, p); CHECK_V_ERROR; /* gamma = */ gamma = InnerProd(m, r, p); CHECK_V_ERROR; its = 0; while (1) { ++its; /* s = A*p */ Mat_dhMatVec(A, p, s); CHECK_V_ERROR; /* alpha = gamma / */ { HYPRE_Real tmp = InnerProd(m, s, p); CHECK_V_ERROR; alpha = gamma / tmp; gamma_old = gamma; } /* x = x + alpha*p */ Axpy(m, alpha, p, x); CHECK_V_ERROR; /* r = r - alpha*s */ Axpy(m, -alpha, s, r); CHECK_V_ERROR; /* solve Ms = r */ Euclid_dhApply(ctx, r, s); CHECK_V_ERROR; /* gamma = */ gamma = InnerProd(m, r, s); CHECK_V_ERROR; /* set i_prod for convergence test */ i_prod = InnerProd(m, r, r); CHECK_V_ERROR; if (monitor && myid_dh == 0) { hypre_fprintf(stderr, "iter = %i rel. resid. norm: %e\n", its, hypre_sqrt(i_prod/bi_prod)); } /* check for convergence */ if (i_prod < eps) break; /* beta = gamma / gamma_old */ beta = gamma / gamma_old; /* p = s + beta p */ ScaleVec(m, beta, p); CHECK_V_ERROR; Axpy(m, 1.0, s, p); CHECK_V_ERROR; if (its >= maxIts) { its = -its; break; } } *itsOUT = its; FREE_DH(p); FREE_DH(s); FREE_DH(r); END_FUNC_DH } hypre-2.33.0/src/distributed_ls/Euclid/krylov_dh.h000066400000000000000000000014121477326011500221200ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #ifndef THREADED_KRYLOV_H #define THREADED_KRYLOV_H /* #include "blas_dh.h" */ extern void bicgstab_euclid(Mat_dh A, Euclid_dh ctx, HYPRE_Real *x, HYPRE_Real *b, HYPRE_Int *itsOUT); extern void cg_euclid(Mat_dh A, Euclid_dh ctx, HYPRE_Real *x, HYPRE_Real *b, HYPRE_Int *itsOUT); #endif hypre-2.33.0/src/distributed_ls/Euclid/macros_dh.h000066400000000000000000000114441477326011500220640ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #ifndef MACROS_DH #define MACROS_DH #ifndef FMAX #define FMAX(a,b) ((FABS(a)) > (FABS(b)) ? (FABS(a)) : (FABS(b))) #endif #ifndef MAX #define MAX(a,b) ((a) > (b) ? (a) : (b)) #endif #ifndef MIN #define MIN(a,b) ((a)<(b)?(a):(b)) #endif #ifndef ABS #define ABS(x) (((x)<0)?(-(x)):(x)) #endif #ifndef FABS #define FABS(a) ((a) < 0 ? -(a) : a) #endif /* used in Mat_SEQ_PrintTriples, so matlab won't discard zeros (yuck!) */ #define _MATLAB_ZERO_ HYPRE_REAL_MIN /*---------------------------------------------------------------------- * macros for error handling everyplace except in main. *---------------------------------------------------------------------- */ /* for future expansion: should check that "ptr" points to a valid memory address, if not null. */ #define ASSERT_DH(ptr) \ { \ if (ptr == NULL) { \ hypre_sprintf(msgBuf_dh, "%s is NULL", ptr); \ SET_V_ERROR(msgBuf_dh); \ } \ } #if 0 #define CHECK_MPI_V_ERROR(errCode) \ { \ if (errCode) { \ HYPRE_Int len; \ hypre_MPI_Error_string(errCode, msgBuf_dh, &len); \ setError_dh(msgBuf_dh, __FUNC__, __FILE__, __LINE__); \ return; \ } \ } #define CHECK_MPI_ERROR(errCode) \ { \ if (errCode) { \ HYPRE_Int len; \ hypre_MPI_Error_string(errCode, msgBuf_dh, &len); \ setError_dh(msgBuf_dh, __FUNC__, __FILE__, __LINE__); \ return(errCode); \ } \ } #endif #define CHECK_MPI_V_ERROR(errCode) \ { \ if (errCode) { \ setError_dh("MPI error!", __FUNC__, __FILE__, __LINE__); \ return; \ } \ } #define CHECK_MPI_ERROR(errCode) \ { \ if (errCode) { \ setError_dh("MPI error!", __FUNC__, __FILE__, __LINE__); \ return(errCode); \ } \ } #define SET_V_ERROR(msg) \ { setError_dh(msg, __FUNC__, __FILE__, __LINE__); \ return; \ } #define SET_ERROR(retval, msg) \ { setError_dh(msg, __FUNC__, __FILE__, __LINE__); \ return (retval); \ } #define CHECK_V_ERROR \ if (errFlag_dh) { \ setError_dh("", __FUNC__, __FILE__, __LINE__); \ return; \ } #define CHECK_ERROR(retval) \ if (errFlag_dh) { \ setError_dh("", __FUNC__, __FILE__, __LINE__); \ return (retval); \ } /*---------------------------------------------------------------------- * informational macros *---------------------------------------------------------------------- */ #define SET_INFO(msg) setInfo_dh(msg, __FUNC__, __FILE__, __LINE__); /*---------------------------------------------------------------------- * macros for tracking the function call stack *---------------------------------------------------------------------- */ #ifdef OPTIMIZED_DH #define START_FUNC_DH \ dh_StartFunc(__FUNC__, __FILE__, __LINE__, 1); \ { #define END_FUNC_DH \ } \ dh_EndFunc(__FUNC__, 1); #define END_FUNC_VAL(a) \ dh_EndFunc(__FUNC__, 1); \ return a ; \ } #define START_FUNC_DH_2 /**/ #define END_FUNC_DH_2 /**/ #define END_FUNC_VAL_2(a) return a ; #else #define START_FUNC_DH \ dh_StartFunc(__FUNC__, __FILE__, __LINE__, 1); \ if (logFuncsToStderr || logFuncsToFile)\ Error_dhStartFunc(__FUNC__, __FILE__, __LINE__); \ { #define END_FUNC_DH \ dh_EndFunc(__FUNC__, 1); \ if (logFuncsToStderr || logFuncsToFile) \ Error_dhEndFunc(__FUNC__); \ return; \ } \ #define START_FUNC_DH_2 \ dh_StartFunc(__FUNC__, __FILE__, __LINE__, 2); \ if (logFuncsToStderr || logFuncsToFile)\ Error_dhStartFunc(__FUNC__, __FILE__, __LINE__); \ { #define END_FUNC_DH_2 \ dh_EndFunc(__FUNC__, 2); \ if (logFuncsToStderr || logFuncsToFile) \ Error_dhEndFunc(__FUNC__); \ return; \ } \ #define END_FUNC_VAL(retval) \ dh_EndFunc(__FUNC__, 1); \ if (logFuncsToStderr || logFuncsToFile) \ Error_dhEndFunc(__FUNC__); \ return(retval); \ } \ #define END_FUNC_VAL_2(retval) \ dh_EndFunc(__FUNC__, 2); \ if (logFuncsToStderr || logFuncsToFile) \ Error_dhEndFunc(__FUNC__); \ return(retval); \ } \ #endif #endif /* #ifndef MACROS_DH */ hypre-2.33.0/src/distributed_ls/Euclid/mat_dh_private.c000066400000000000000000001315461477326011500231140ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "_hypre_Euclid.h" /* #include "mat_dh_private.h" */ /* #include "Parser_dh.h" */ /* #include "Hash_i_dh.h" */ /* #include "Mat_dh.h" */ /* #include "Mem_dh.h" */ /* #include "Vec_dh.h" */ #ifdef PETSC_MODE #include "euclid_petsc.h" #endif #define IS_UPPER_TRI 97 #define IS_LOWER_TRI 98 #define IS_FULL 99 static HYPRE_Int isTriangular(HYPRE_Int m, HYPRE_Int *rp, HYPRE_Int *cval); /* Instantiates Aout; allocates storage for rp, cval, and aval arrays; uses rowLengths[] and rowToBlock[] data to fill in rp[]. */ static void mat_par_read_allocate_private(Mat_dh *Aout, HYPRE_Int n, HYPRE_Int *rowLengths, HYPRE_Int *rowToBlock); /* Currently, divides (partitions)matrix by contiguous sections of rows. For future expansion: use metis. */ void mat_partition_private(Mat_dh A, HYPRE_Int blocks, HYPRE_Int *o2n_row, HYPRE_Int *rowToBlock); static void convert_triples_to_scr_private(HYPRE_Int m, HYPRE_Int nz, HYPRE_Int *I, HYPRE_Int *J, HYPRE_Real *A, HYPRE_Int *rp, HYPRE_Int *cval, HYPRE_Real *aval); #if 0 #undef __FUNC__ #define __FUNC__ "mat_dh_print_graph_private" void mat_dh_print_graph_private(HYPRE_Int m, HYPRE_Int beg_row, HYPRE_Int *rp, HYPRE_Int *cval, HYPRE_Real *aval, HYPRE_Int *n2o, HYPRE_Int *o2n, Hash_i_dh hash, FILE* fp) { START_FUNC_DH HYPRE_Int i, j, row, col; HYPRE_Real val; bool private_n2o = false; bool private_hash = false; if (n2o == NULL) { private_n2o = true; create_nat_ordering_private(m, &n2o); CHECK_V_ERROR; create_nat_ordering_private(m, &o2n); CHECK_V_ERROR; } if (hash == NULL) { private_hash = true; Hash_i_dhCreate(&hash, -1); CHECK_V_ERROR; } for (i=0; i= beg_row+m) { HYPRE_Int tmp = col; /* nonlocal column: get permutation from hash table */ tmp = Hash_i_dhLookup(hash, col); CHECK_V_ERROR; if (tmp == -1) { hypre_sprintf(msgBuf_dh, "beg_row= %i m= %i; nonlocal column= %i not in hash table", beg_row, m, col); SET_V_ERROR(msgBuf_dh); } else { col = tmp; } } else { col = o2n[col]; } if (aval == NULL) { val = _MATLAB_ZERO_; } else { val = aval[j]; } hypre_fprintf(fp, "%i %i %g\n", 1+row+beg_row, 1+col, val); } } if (private_n2o) { destroy_nat_ordering_private(n2o); CHECK_V_ERROR; destroy_nat_ordering_private(o2n); CHECK_V_ERROR; } if (private_hash) { Hash_i_dhDestroy(hash); CHECK_V_ERROR; } END_FUNC_DH } #endif /* currently only for unpermuted */ #undef __FUNC__ #define __FUNC__ "mat_dh_print_graph_private" void mat_dh_print_graph_private(HYPRE_Int m, HYPRE_Int beg_row, HYPRE_Int *rp, HYPRE_Int *cval, HYPRE_Real *aval, HYPRE_Int *n2o, HYPRE_Int *o2n, Hash_i_dh hash, FILE* fp) { HYPRE_UNUSED_VAR(aval); START_FUNC_DH HYPRE_Int i, j, row, col; bool private_n2o = false; bool private_hash = false; HYPRE_Int *work = NULL; work = (HYPRE_Int*)MALLOC_DH(m*sizeof(HYPRE_Int)); CHECK_V_ERROR; if (n2o == NULL) { private_n2o = true; create_nat_ordering_private(m, &n2o); CHECK_V_ERROR; create_nat_ordering_private(m, &o2n); CHECK_V_ERROR; } if (hash == NULL) { private_hash = true; Hash_i_dhCreate(&hash, -1); CHECK_V_ERROR; } for (i=0; i= beg_row || col < beg_row+m) { col = o2n[col]; } /* nonlocal column: get permutation from hash table */ else { HYPRE_Int tmp = col; tmp = Hash_i_dhLookup(hash, col); CHECK_V_ERROR; if (tmp == -1) { hypre_sprintf(msgBuf_dh, "beg_row= %i m= %i; nonlocal column= %i not in hash table", beg_row, m, col); SET_V_ERROR(msgBuf_dh); } else { col = tmp; } } work[col] = 1; } for (j=0; j m) m = i; if (j > n) n = j; } if (myid_dh == 0) { hypre_printf("mat_dh_read_triples_private: m= %i nz= %i\n", m, nz); } /* reset file, and skip over header again */ rewind(fp); for (i=0; i triples into arrays */ while (!feof(fp)) { items = hypre_fscanf(fp,"%d %d %lg",&i,&j,&v); if (items < 3) break; j--; i--; I[idx] = i; J[idx] = j; A[idx] = v; ++idx; } /* convert from triples to sparse-compressed-row storage */ convert_triples_to_scr_private(m, nz, I, J, A, rp, cval, aval); CHECK_V_ERROR; /* if matrix is triangular */ { HYPRE_Int type; type = isTriangular(m, rp, cval); CHECK_V_ERROR; if (type == IS_UPPER_TRI) { hypre_printf("CAUTION: matrix is upper triangular; converting to full\n"); } else if (type == IS_LOWER_TRI) { hypre_printf("CAUTION: matrix is lower triangular; converting to full\n"); } if (type == IS_UPPER_TRI || type == IS_LOWER_TRI) { make_full_private(m, &rp, &cval, &aval); CHECK_V_ERROR; } } *rpOUT = rp; *cvalOUT = cval; *avalOUT = aval; FREE_DH(I); CHECK_V_ERROR; FREE_DH(J); CHECK_V_ERROR; FREE_DH(A); CHECK_V_ERROR; END_FUNC_DH } #undef __FUNC__ #define __FUNC__ "convert_triples_to_scr_private" void convert_triples_to_scr_private(HYPRE_Int m, HYPRE_Int nz, HYPRE_Int *I, HYPRE_Int *J, HYPRE_Real *A, HYPRE_Int *rp, HYPRE_Int *cval, HYPRE_Real *aval) { START_FUNC_DH HYPRE_Int i; HYPRE_Int *rowCounts; rowCounts = (HYPRE_Int*)MALLOC_DH((m+1)*sizeof(HYPRE_Int)); CHECK_V_ERROR; for (i=0; im == 0) { SET_V_ERROR("row count = 0; something's wrong!"); } if (fixDiags) { fix_diags_private(*Aout); CHECK_V_ERROR; } END_FUNC_DH } #undef __FUNC__ #define __FUNC__ "fix_diags_private" void fix_diags_private(Mat_dh A) { START_FUNC_DH HYPRE_Int i, j, m = A->m, *rp = A->rp, *cval = A->cval; HYPRE_Real *aval = A->aval; bool insertDiags = false; /* verify that all diagonals are present */ for (i=0; irp; cval = A->cval; aval = A->aval; } /* set value of all diags to largest absolute value in each row */ for (i=0; irp, *CVAL = A->cval, m = A->m; HYPRE_Int *rp, *cval; HYPRE_Real *AVAL = A->aval, *aval; HYPRE_Int i, j, nz = RP[m]+m; HYPRE_Int idx = 0; rp = A->rp = (HYPRE_Int *)MALLOC_DH((1+m)*sizeof(HYPRE_Int)); CHECK_V_ERROR; cval = A->cval = (HYPRE_Int *)MALLOC_DH(nz*sizeof(HYPRE_Int)); CHECK_V_ERROR; aval = A->aval = (HYPRE_Real *)MALLOC_DH(nz*sizeof(HYPRE_Real)); CHECK_V_ERROR; rp[0] = 0; for (i=0; im, Ain->n, Ain->beg_row, Ain->rp, Ain->cval, Ain->aval, &Apetsc); if (ierr) { SET_V_ERROR("buildPetscMat failed!"); } ierr = ViewerBinaryOpen_DH(comm_dh, fn, BINARY_CREATE_DH, &viewer); if (ierr) { SET_V_ERROR("ViewerBinaryOpen failed! [PETSc lib]"); } ierr = MatView(Apetsc, viewer); if (ierr) { SET_V_ERROR("MatView failed! [PETSc lib]"); } ierr = ViewerDestroy_DH(viewer); if (ierr) { SET_V_ERROR("ViewerDestroy failed! [PETSc lib]"); } ierr = MatDestroy(Apetsc); if (ierr) { SET_V_ERROR("MatDestroy failed! [PETSc lib]"); } } #else else if (!strcmp(ft, "petsc")) { hypre_sprintf(msgBuf_dh, "must recompile Euclid using petsc mode!"); SET_V_ERROR(msgBuf_dh); } #endif else { hypre_sprintf(msgBuf_dh, "unknown filetype: -ftout %s", ft); SET_V_ERROR(msgBuf_dh); } END_FUNC_DH } #undef __FUNC__ #define __FUNC__ "writeVec" void writeVec(Vec_dh bin, char *ft, char *fn) { START_FUNC_DH if (fn == NULL) { SET_V_ERROR("passed NULL filename; can't open for writing!"); } if (!strcmp(ft, "csr") || !strcmp(ft, "trip")) { Vec_dhPrint(bin, NULL, fn); CHECK_V_ERROR; } else if (!strcmp(ft, "ebin")) { Vec_dhPrintBIN(bin, NULL, fn); CHECK_V_ERROR; } #ifdef PETSC_MODE else if (!strcmp(ft, "petsc")) { Viewer_DH viewer; HYPRE_Int ierr; Vec bb; ierr = buildPetscVec(bin->n, bin->n, 0, bin->vals, &bb); if (ierr) { SET_V_ERROR("buildPetscVec failed!"); } ierr = ViewerBinaryOpen_DH(comm_dh, fn, BINARY_CREATE_DH, &viewer); if (ierr) { SET_V_ERROR("ViewerBinaryOpen failed! [PETSc lib]"); } ierr = VecView(bb, viewer); if (ierr) { SET_V_ERROR("VecView failed! [PETSc lib]"); } ierr = ViewerDestroy_DH(viewer); if (ierr) { SET_V_ERROR("ViewerDestroy failed! [PETSc lib]"); } ierr = VecDestroy(bb); if (ierr) { SET_V_ERROR("VecDestroy failed! [PETSc lib]"); } } #else else if (!strcmp(ft, "petsc")) { hypre_sprintf(msgBuf_dh, "must recompile Euclid using petsc mode!"); SET_V_ERROR(msgBuf_dh); } #endif else { hypre_sprintf(msgBuf_dh, "unknown filetype: -ftout %s", ft); SET_V_ERROR(msgBuf_dh); } END_FUNC_DH } #undef __FUNC__ #define __FUNC__ "isTriangular" HYPRE_Int isTriangular(HYPRE_Int m, HYPRE_Int *rp, HYPRE_Int *cval) { START_FUNC_DH HYPRE_Int row, j; HYPRE_Int type; bool type_lower = false, type_upper = false; if (np_dh > 1) { SET_ERROR(-1, "only implemented for a single cpu"); } for (row=0; row row) type_upper = true; } if (type_lower && type_upper) break; } if (type_lower && type_upper) { type = IS_FULL; } else if (type_lower) { type = IS_LOWER_TRI; } else { type = IS_UPPER_TRI; } END_FUNC_VAL(type) } /*-----------------------------------------------------------------------------------*/ static void mat_dh_transpose_reuse_private_private( bool allocateMem, HYPRE_Int m, HYPRE_Int *rpIN, HYPRE_Int *cvalIN, HYPRE_Real *avalIN, HYPRE_Int **rpOUT, HYPRE_Int **cvalOUT, HYPRE_Real **avalOUT); #undef __FUNC__ #define __FUNC__ "mat_dh_transpose_reuse_private" void mat_dh_transpose_reuse_private(HYPRE_Int m, HYPRE_Int *rpIN, HYPRE_Int *cvalIN, HYPRE_Real *avalIN, HYPRE_Int *rpOUT, HYPRE_Int *cvalOUT, HYPRE_Real *avalOUT) { START_FUNC_DH mat_dh_transpose_reuse_private_private(false, m, rpIN, cvalIN, avalIN, &rpOUT, &cvalOUT, &avalOUT); CHECK_V_ERROR; END_FUNC_DH } #undef __FUNC__ #define __FUNC__ "mat_dh_transpose_private" void mat_dh_transpose_private(HYPRE_Int m, HYPRE_Int *RP, HYPRE_Int **rpOUT, HYPRE_Int *CVAL, HYPRE_Int **cvalOUT, HYPRE_Real *AVAL, HYPRE_Real **avalOUT) { START_FUNC_DH mat_dh_transpose_reuse_private_private(true, m, RP, CVAL, AVAL, rpOUT, cvalOUT, avalOUT); CHECK_V_ERROR; END_FUNC_DH } #undef __FUNC__ #define __FUNC__ "mat_dh_transpose_private_private" void mat_dh_transpose_reuse_private_private(bool allocateMem, HYPRE_Int m, HYPRE_Int *RP, HYPRE_Int *CVAL, HYPRE_Real *AVAL, HYPRE_Int **rpOUT, HYPRE_Int **cvalOUT, HYPRE_Real **avalOUT) { START_FUNC_DH HYPRE_Int *rp, *cval, *tmp; HYPRE_Int i, j, nz = RP[m]; HYPRE_Real *aval = NULL; if (allocateMem) { rp = *rpOUT = (HYPRE_Int *)MALLOC_DH((1+m)*sizeof(HYPRE_Int)); CHECK_V_ERROR; cval = *cvalOUT = (HYPRE_Int *)MALLOC_DH(nz*sizeof(HYPRE_Int)); CHECK_V_ERROR; if (avalOUT != NULL) { aval = *avalOUT = (HYPRE_Real*)MALLOC_DH(nz*sizeof(HYPRE_Real)); CHECK_V_ERROR; } } else { rp = *rpOUT; cval = *cvalOUT; if (avalOUT != NULL) aval = *avalOUT; } tmp = (HYPRE_Int *)MALLOC_DH((1+m)*sizeof(HYPRE_Int)); CHECK_V_ERROR; for (i=0; i<=m; ++i) tmp[i] = 0; for (i=0; i= beg_rows[pe] && index < end_rows[pe]) { owner = pe; break; } } if (owner == -1) { hypre_sprintf(msgBuf_dh, "failed to find owner for index= %i", index); SET_ERROR(-1, msgBuf_dh); } END_FUNC_VAL(owner) } #define AVAL_TAG 2 #define CVAL_TAG 3 void partition_and_distribute_private(Mat_dh A, Mat_dh *Bout); void partition_and_distribute_metis_private(Mat_dh A, Mat_dh *Bout); #undef __FUNC__ #define __FUNC__ "readMat_par" void readMat_par(Mat_dh *Aout, char *fileType, char *fileName, HYPRE_Int ignore) { START_FUNC_DH Mat_dh A = NULL; if (myid_dh == 0) { HYPRE_Int tmp = np_dh; np_dh = 1; readMat(&A, fileType, fileName, ignore); CHECK_V_ERROR; np_dh = tmp; } if (np_dh == 1) { *Aout = A; } else { if (Parser_dhHasSwitch(parser_dh, "-metis")) { partition_and_distribute_metis_private(A, Aout); CHECK_V_ERROR; } else { partition_and_distribute_private(A, Aout); CHECK_V_ERROR; } } if (np_dh > 1 && A != NULL) { Mat_dhDestroy(A); CHECK_V_ERROR; } if (Parser_dhHasSwitch(parser_dh, "-printMAT")) { char xname[] = "A", *name = xname; Parser_dhReadString(parser_dh, "-printMat", &name); Mat_dhPrintTriples(*Aout, NULL, name); CHECK_V_ERROR; printf_dh("\n@@@ readMat_par: printed mat to %s\n\n", xname); } END_FUNC_DH } /* this is bad code! */ #undef __FUNC__ #define __FUNC__ "partition_and_distribute_metis_private" void partition_and_distribute_metis_private(Mat_dh A, Mat_dh *Bout) { START_FUNC_DH Mat_dh B = NULL; Mat_dh C = NULL; HYPRE_Int i, m; HYPRE_Int *rowLengths = NULL; HYPRE_Int *o2n_row = NULL, *n2o_col = NULL, *rowToBlock = NULL; HYPRE_Int *beg_row = NULL, *row_count = NULL; hypre_MPI_Request *send_req = NULL; hypre_MPI_Request *rcv_req = NULL; hypre_MPI_Status *send_status = NULL; hypre_MPI_Status *rcv_status = NULL; hypre_MPI_Barrier(comm_dh); printf_dh("@@@ partitioning with metis\n"); /* broadcast number of rows to all processors */ if (myid_dh == 0) m = A->m; hypre_MPI_Bcast(&m, 1, HYPRE_MPI_INT, 0, hypre_MPI_COMM_WORLD); /* broadcast number of nonzeros in each row to all processors */ rowLengths = (HYPRE_Int*)MALLOC_DH(m*sizeof(HYPRE_Int)); CHECK_V_ERROR; rowToBlock = (HYPRE_Int*)MALLOC_DH(m*sizeof(HYPRE_Int)); CHECK_V_ERROR; if (myid_dh == 0) { HYPRE_Int *tmp = A->rp; for (i=0; icval, *rp = C->rp; HYPRE_Real *aval = C->aval; send_req = (hypre_MPI_Request*)MALLOC_DH(2*m*sizeof(hypre_MPI_Request)); CHECK_V_ERROR; send_status = (hypre_MPI_Status*)MALLOC_DH(2*m*sizeof(hypre_MPI_Status)); CHECK_V_ERROR; for (i=0; icval; HYPRE_Int *rp = B->rp; HYPRE_Real *aval = B->aval; m = B->m; rcv_req = (hypre_MPI_Request*)MALLOC_DH(2*m*sizeof(hypre_MPI_Request)); CHECK_V_ERROR; rcv_status = (hypre_MPI_Status*)MALLOC_DH(2*m*sizeof(hypre_MPI_Status)); CHECK_V_ERROR; for (i=0; im, rcv_req, rcv_status); /* clean up */ if (rowLengths != NULL) { FREE_DH(rowLengths); CHECK_V_ERROR; } if (o2n_row != NULL) { FREE_DH(o2n_row); CHECK_V_ERROR; } if (n2o_col != NULL) { FREE_DH(n2o_col); CHECK_V_ERROR; } if (rowToBlock != NULL) {FREE_DH(rowToBlock); CHECK_V_ERROR; } if (send_req != NULL) { FREE_DH(send_req); CHECK_V_ERROR; } if (rcv_req != NULL) { FREE_DH(rcv_req); CHECK_V_ERROR; } if (send_status != NULL) { FREE_DH(send_status); CHECK_V_ERROR; } if (rcv_status != NULL) { FREE_DH(rcv_status); CHECK_V_ERROR; } if (beg_row != NULL) { FREE_DH(beg_row); CHECK_V_ERROR; } if (row_count != NULL) { FREE_DH(row_count); CHECK_V_ERROR; } if (C != NULL) { Mat_dhDestroy(C); ERRCHKA; } *Bout = B; END_FUNC_DH } #undef __FUNC__ #define __FUNC__ "partition_and_distribute_private" void partition_and_distribute_private(Mat_dh A, Mat_dh *Bout) { START_FUNC_DH Mat_dh B = NULL; HYPRE_Int i, m; HYPRE_Int *rowLengths = NULL; HYPRE_Int *o2n_row = NULL, *n2o_col = NULL, *rowToBlock = NULL; hypre_MPI_Request *send_req = NULL; hypre_MPI_Request *rcv_req = NULL; hypre_MPI_Status *send_status = NULL; hypre_MPI_Status *rcv_status = NULL; hypre_MPI_Barrier(comm_dh); /* broadcast number of rows to all processors */ if (myid_dh == 0) m = A->m; hypre_MPI_Bcast(&m, 1, HYPRE_MPI_INT, 0, hypre_MPI_COMM_WORLD); /* broadcast number of nonzeros in each row to all processors */ rowLengths = (HYPRE_Int*)MALLOC_DH(m*sizeof(HYPRE_Int)); CHECK_V_ERROR; if (myid_dh == 0) { HYPRE_Int *tmp = A->rp; for (i=0; icval, *rp = A->rp; HYPRE_Real *aval = A->aval; send_req = (hypre_MPI_Request*)MALLOC_DH(2*m*sizeof(hypre_MPI_Request)); CHECK_V_ERROR; send_status = (hypre_MPI_Status*)MALLOC_DH(2*m*sizeof(hypre_MPI_Status)); CHECK_V_ERROR; for (i=0; icval; HYPRE_Int *rp = B->rp; HYPRE_Real *aval = B->aval; m = B->m; rcv_req = (hypre_MPI_Request*)MALLOC_DH(2*m*sizeof(hypre_MPI_Request)); CHECK_V_ERROR; rcv_status = (hypre_MPI_Status*)MALLOC_DH(2*m*sizeof(hypre_MPI_Status)); CHECK_V_ERROR; for (i=0; im, rcv_req, rcv_status); /* clean up */ if (rowLengths != NULL) { FREE_DH(rowLengths); CHECK_V_ERROR; } if (o2n_row != NULL) { FREE_DH(o2n_row); CHECK_V_ERROR; } if (n2o_col != NULL) { FREE_DH(n2o_col); CHECK_V_ERROR; } if (rowToBlock != NULL) {FREE_DH(rowToBlock); CHECK_V_ERROR; } if (send_req != NULL) { FREE_DH(send_req); CHECK_V_ERROR; } if (rcv_req != NULL) { FREE_DH(rcv_req); CHECK_V_ERROR; } if (send_status != NULL) { FREE_DH(send_status); CHECK_V_ERROR; } if (rcv_status != NULL) { FREE_DH(rcv_status); CHECK_V_ERROR; } *Bout = B; END_FUNC_DH } #undef __FUNC__ #define __FUNC__ "mat_par_read_allocate_private" void mat_par_read_allocate_private(Mat_dh *Aout, HYPRE_Int n, HYPRE_Int *rowLengths, HYPRE_Int *rowToBlock) { START_FUNC_DH Mat_dh A; HYPRE_Int i, m, nz, beg_row, *rp, idx; Mat_dhCreate(&A); CHECK_V_ERROR; *Aout = A; A->n = n; /* count number of rows owned by this processor */ m = 0; for (i=0; im = m; /* compute global numbering of first locally owned row */ beg_row = 0; for (i=0; ibeg_row = beg_row; /* allocate storage for row-pointer array */ A->rp = rp = (HYPRE_Int*)MALLOC_DH((m+1)*sizeof(HYPRE_Int)); CHECK_V_ERROR; rp[0] = 0; /* count number of nonzeros owned by this processor, and form rp array */ nz = 0; idx = 1; for (i=0; icval = (HYPRE_Int*)MALLOC_DH(nz*sizeof(HYPRE_Int)); CHECK_V_ERROR; A->aval = (HYPRE_Real*)MALLOC_DH(nz*sizeof(HYPRE_Real)); CHECK_V_ERROR; END_FUNC_DH } #undef __FUNC__ #define __FUNC__ "mat_partition_private" void mat_partition_private(Mat_dh A, HYPRE_Int blocks, HYPRE_Int *o2n_row, HYPRE_Int *rowToBlock) { START_FUNC_DH HYPRE_Int i, j, n = A->n; HYPRE_Int rpb = n/blocks; /* rows per block (except possibly last block) */ HYPRE_Int idx = 0; while (rpb*blocks < n) ++rpb; if (rpb*(blocks-1) == n) { --rpb; printf_dh("adjusted rpb to: %i\n", rpb); } for (i=0; i 0) { SET_V_ERROR("only for a single MPI task!"); } m = A->m; hypre_printf("\nYY----------------------------------------------------\n"); /* count number of explicit zeros */ nz = A->rp[m]; for (i=0; iaval[i] == 0) ++zeroCount; } hypre_printf("YY row count: %i\n", m); hypre_printf("YY nz count: %i\n", nz); hypre_printf("YY explicit zeros: %i (entire matrix)\n", zeroCount); /* count number of missing or zero diagonals */ { HYPRE_Int m_diag = 0, z_diag = 0; for (i=0; irp[i]; jrp[i+1]; ++j) { HYPRE_Int col = A->cval[j]; /* row has an explicit diagonal element */ if (col == i) { HYPRE_Real val = A->aval[j]; flag = false; if (val == 0.0) ++z_diag; break; } } /* row has an implicit zero diagonal element */ if (flag) ++m_diag; } hypre_printf("YY missing diagonals: %i\n", m_diag); hypre_printf("YY explicit zero diags: %i\n", z_diag); } /* check to see if matrix is triangular */ type = isTriangular(m, A->rp, A->cval); CHECK_V_ERROR; if (type == IS_UPPER_TRI) { hypre_printf("YY matrix is upper triangular\n"); is_Triangular = true; goto END_OF_FUNCTION; } else if (type == IS_LOWER_TRI) { hypre_printf("YY matrix is lower triangular\n"); is_Triangular = true; goto END_OF_FUNCTION; } /* if not triangular, count nz in each triangle */ { HYPRE_Int unz = 0, lnz = 0; for (i=0; irp[i]; jrp[i+1]; ++j) { HYPRE_Int col = A->cval[j]; if (col < i) ++lnz; if (col > i) ++unz; } } hypre_printf("YY strict upper triangular nonzeros: %i\n", unz); hypre_printf("YY strict lower triangular nonzeros: %i\n", lnz); } Mat_dhTranspose(A, &B); CHECK_V_ERROR; /* check for structural and numerical symmetry */ work1 = (HYPRE_Int*)MALLOC_DH(m*sizeof(HYPRE_Int)); CHECK_V_ERROR; work2 = (HYPRE_Real*)MALLOC_DH(m*sizeof(HYPRE_Real)); CHECK_V_ERROR; for (i=0; irp[i]; jrp[i+1]; ++j) { HYPRE_Int col = A->cval[j]; HYPRE_Real val = A->aval[j]; work1[col] = i; work2[col] = val; } for (j=B->rp[i]; jrp[i+1]; ++j) { HYPRE_Int col = B->cval[j]; HYPRE_Real val = B->aval[j]; if (work1[col] != i) { isStructurallySymmetric = false; isNumericallySymmetric = false; goto END_OF_FUNCTION; } if (work2[col] != val) { isNumericallySymmetric = false; work2[col] = 0.0; } } } END_OF_FUNCTION: ; if (! is_Triangular) { hypre_printf("YY matrix is NOT triangular\n"); if (isStructurallySymmetric) { hypre_printf("YY matrix IS structurally symmetric\n"); } else { hypre_printf("YY matrix is NOT structurally symmetric\n"); } if (isNumericallySymmetric) { hypre_printf("YY matrix IS numerically symmetric\n"); } else { hypre_printf("YY matrix is NOT numerically symmetric\n"); } } if (work1 != NULL) { FREE_DH(work1); CHECK_V_ERROR; } if (work2 != NULL) { FREE_DH(work2); CHECK_V_ERROR; } if (B != NULL) { Mat_dhDestroy(B); CHECK_V_ERROR; } hypre_printf("YY----------------------------------------------------\n"); END_FUNC_DH } hypre-2.33.0/src/distributed_ls/Euclid/mat_dh_private.h000066400000000000000000000120721477326011500231110ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #ifndef MAT_DH_PRIVATE #define MAT_DH_PRIVATE /* Functions called by Mat_dh, Factor_dh, and possibly others. Also, a few handy functions for dealing with permutations, etc. */ /* #include "euclid_common.h" */ extern HYPRE_Int mat_find_owner(HYPRE_Int *beg_rows, HYPRE_Int *end_rows, HYPRE_Int index); extern void mat_dh_transpose_private(HYPRE_Int m, HYPRE_Int *rpIN, HYPRE_Int **rpOUT, HYPRE_Int *cvalIN, HYPRE_Int **cvalOUT, HYPRE_Real *avalIN, HYPRE_Real **avalOUT); /* same as above, but memory for output was already allocated */ extern void mat_dh_transpose_reuse_private(HYPRE_Int m, HYPRE_Int *rpIN, HYPRE_Int *cvalIN, HYPRE_Real *avalIN, HYPRE_Int *rpOUT, HYPRE_Int *cvalOUT, HYPRE_Real *avalOUT); /*------------------------------------------------------------------------- * utility functions for reading and writing matrices in various formats. * currently recognized filetypes (formats) are: * trip * csr * petsc * the "ignore" parameter is only used for the matrix "trip" format, * and the vector "csr" and "trip" formats (which are misnamed, and identical); * the intention is to skip over the first "ignore" lines of the file; * this is a hack to enable reading of Matrix Market, etc, formats. *-------------------------------------------------------------------------*/ extern void readMat(Mat_dh *Aout, char *fileType, char *fileName, HYPRE_Int ignore); extern void readVec(Vec_dh *bout, char *fileType, char *fileName, HYPRE_Int ignore); extern void writeMat(Mat_dh Ain, char *fileType, char *fileName); extern void writeVec(Vec_dh b, char *fileType, char *fileName); /* Next function is primarily (?) for testing/development/debugging. P_0 reads and partitions the matrix, then distributes amongst the other processors. */ extern void readMat_par(Mat_dh *Aout, char *fileType, char *fileName, HYPRE_Int ignore); extern void profileMat(Mat_dh A); /* writes structural and numerical symmetry and other info to stdout; for a single mpi task only. */ /*-------------------------------------------------------------------------* * functions called by public Mat_dh class methods. * * (following notes need to be updated!) * * m is number of local rows; * beg_row is global number of 1st locally owned row; * m, beg_row, rp, cval may not be null (caller's responsiblity); * if n2o is NULL, it's assumed that o2n is NULL; * if * * error thrown: * if a nonlocal column (a column index that is less than beg_row, * or >= beg_row+m), and can't be located in hash table. * * print_triples_private() and print_mat_private() are 1-based. * *-------------------------------------------------------------------------*/ /* seq or mpi */ extern void mat_dh_print_graph_private(HYPRE_Int m, HYPRE_Int beg_row, HYPRE_Int *rp, HYPRE_Int *cval, HYPRE_Real *aval, HYPRE_Int *n2o, HYPRE_Int *o2n, Hash_i_dh hash, FILE* fp); /* seq; reordering not implemented */ /* see io_dh.h HYPRE_Int *rp, HYPRE_Int *cval, HYPRE_Real *aval, HYPRE_Int *n2o, HYPRE_Int *o2n, Hash_i_dh hash, char *filename); */ /* seq only */ extern void mat_dh_print_csr_private(HYPRE_Int m, HYPRE_Int *rp, HYPRE_Int *cval, HYPRE_Real *aval, FILE* fp); /* seq only */ extern void mat_dh_read_csr_private(HYPRE_Int *m, HYPRE_Int **rp, HYPRE_Int **cval, HYPRE_Real **aval, FILE* fp); /* seq only */ extern void mat_dh_read_triples_private(HYPRE_Int ignore, HYPRE_Int *m, HYPRE_Int **rp, HYPRE_Int **cval, HYPRE_Real **aval, FILE* fp); /* seq or mpi */ /* see io_dh.h HYPRE_Real **aval, char *filename); */ /*-------------------------------------------------------------------------*/ extern void create_nat_ordering_private(HYPRE_Int m, HYPRE_Int **p); extern void destroy_nat_ordering_private(HYPRE_Int *p); extern void invert_perm(HYPRE_Int m, HYPRE_Int *pIN, HYPRE_Int *pOUT); extern void make_full_private(HYPRE_Int m, HYPRE_Int **rp, HYPRE_Int **cval, HYPRE_Real **aval); /* converts upper or lower triangular to full; may bomb if input is not triangular! */ extern void make_symmetric_private(HYPRE_Int m, HYPRE_Int **rp, HYPRE_Int **cval, HYPRE_Real **aval); /* pads with zeros to make structurally symmetric. */ extern void make_symmetric_private(HYPRE_Int m, HYPRE_Int **rp, HYPRE_Int **cval, HYPRE_Real **aval); #endif hypre-2.33.0/src/distributed_ls/Euclid/shellSort_dh.c000066400000000000000000000034741477326011500225560ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "_hypre_Euclid.h" /* shell sort adopted from Edmond Chow */ /* #include "shellSort_dh.h" */ #undef __FUNC__ #define __FUNC__ "shellSort_int" void shellSort_int(const HYPRE_Int n, HYPRE_Int *x) { START_FUNC_DH HYPRE_Int m, max, j, k, itemp; m = n/2; while (m > 0) { max = n - m; for (j=0; j=0; k-=m) { if (x[k+m] >= x[k]) break; itemp = x[k+m]; x[k+m] = x[k]; x[k] = itemp; } } m = m/2; } END_FUNC_DH } #undef __FUNC__ #define __FUNC__ "shellSort_float" void shellSort_float(const HYPRE_Int n, HYPRE_Real *x) { START_FUNC_DH HYPRE_Int m, max, j, k; HYPRE_Real itemp; m = n/2; while (m > 0) { max = n - m; for (j=0; j=0; k-=m) { if (x[k+m] >= x[k]) break; itemp = x[k+m]; x[k+m] = x[k]; x[k] = itemp; } } m = m/2; } END_FUNC_DH } #if 0 #undef __FUNC__ #define __FUNC__ "shellSort_int_float" void shellSort_int_float(HYPRE_Int n, HYPRE_Int *x, VAL_DH *xVals) { START_FUNC_DH HYPRE_Int m, max, j, k, itemp; VAL_DH atemp; m = n/2; while (m > 0) { max = n - m; for (j=0; j=0; k-=m) { if (x[k+m] >= x[k]) break; itemp = x[k+m]; atemp = xVals[k+m]; x[k+m] = x[k]; /* xVals[k+m] = xVals[k]; */ x[k] = itemp; xVals[k] = atemp; } } m = m/2; } END_FUNC_DH } #endif hypre-2.33.0/src/distributed_ls/Euclid/shellSort_dh.h000066400000000000000000000014551477326011500225600ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #ifndef SUPPORT_DH #define SUPPORT_DH /* #include "euclid_common.h" */ extern void shellSort_int(const HYPRE_Int n, HYPRE_Int *x); extern void shellSort_float(HYPRE_Int n, HYPRE_Real *v); /* extern void shellSort_int_int(const HYPRE_Int n, HYPRE_Int *x, HYPRE_Int *y); extern void shellSort_int_float(HYPRE_Int n, HYPRE_Int *x, HYPRE_Real *v); extern void shellSort_int_int_float(HYPRE_Int n, HYPRE_Int *x, HYPRE_Int *y, HYPRE_Real *v); */ #endif hypre-2.33.0/src/distributed_ls/Euclid/sig_dh.c000066400000000000000000000060401477326011500213510ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "_hypre_Euclid.h" /* #include "sig_dh.h" */ /* #include "Parser_dh.h" */ /* #include "euclid_common.h" */ /* RDF: This next code was in 'sig_dh.h' but only used in this file. Because of * the global variables 'euclid_signals_len' and 'euclid_signals', it was easier * to put the source directly here instead. */ /* END 'sig_dh.h' code */ #include extern void sigRegister_dh(void); extern void sigHandler_dh(hypre_int sig); /* list of signals the Euclid will handle */ #ifdef WIN32 hypre_int euclid_signals_len = 2; hypre_int euclid_signals[] = { SIGSEGV, SIGFPE }; #else hypre_int euclid_signals_len = 3; hypre_int euclid_signals[] = { SIGSEGV, SIGFPE, SIGBUS }; #endif /* signal names and explanatory messages */ static const char *SIGNAME[] = { "Unknown signal", "HUP (Hangup detected on controlling terminal or death of controlling process)", "INT: Interrupt from keyboard", "QUIT: Quit from keyboard", "ILL: Illegal Instruction", "TRAP", "ABRT: Abort signal", "EMT", "FPE (Floating Point Exception)", "KILL: Kill signal", "BUS (Bus Error, possibly illegal memory access)", "SEGV (Segmentation Violation (memory access out of range?))", "SYS", "PIPE: Broken pipe: write to pipe with no readers", "ALRM: Timer signal", "TERM: Termination signal", "URG", "STOP", "TSTP", "CONT", "CHLD" }; /* END 'sig_dh.h' code */ #undef __FUNC__ #define __FUNC__ "sigHandler_dh" void sigHandler_dh(hypre_int sig) { hypre_fprintf(stderr, "\n[%i] Euclid Signal Handler got: %s\n", myid_dh, SIGNAME[sig]); hypre_fprintf(stderr, "[%i] ========================================================\n", myid_dh); hypre_fprintf(stderr, "[%i] function calling sequence that led to the exception:\n", myid_dh); hypre_fprintf(stderr, "[%i] ========================================================\n", myid_dh); printFunctionStack(stderr); hypre_fprintf(stderr, "\n\n"); if (logFile != NULL) { hypre_fprintf(logFile, "\n[%i] Euclid Signal Handler got: %s\n", myid_dh, SIGNAME[sig]); hypre_fprintf(logFile, "[%i] ========================================================\n", myid_dh); hypre_fprintf(logFile, "[%i] function calling sequence that led to the exception:\n", myid_dh); hypre_fprintf(logFile, "[%i] ========================================================\n", myid_dh); printFunctionStack(logFile); hypre_fprintf(logFile, "\n\n"); } EUCLID_EXIT; } #undef __FUNC__ #define __FUNC__ "sigRegister_dh" void sigRegister_dh(void) { if (Parser_dhHasSwitch(parser_dh, "-sig_dh")) { hypre_int i; for (i=0; i extern void sigRegister_dh(); extern void sigHandler_dh(hypre_int sig); /* list of signals the Euclid will handle */ #ifdef WIN32 hypre_int euclid_signals_len = 2; hypre_int euclid_signals[] = { SIGSEGV, SIGFPE }; #else hypre_int euclid_signals_len = 3; hypre_int euclid_signals[] = { SIGSEGV, SIGFPE, SIGBUS }; #endif /* signal names and explanatory messages */ static char *SIGNAME[] = { "Unknown signal", "HUP (Hangup detected on controlling terminal or death of controlling process)", "INT: Interrupt from keyboard", "QUIT: Quit from keyboard", "ILL: Illegal Instruction", "TRAP", "ABRT: Abort signal", "EMT", "FPE (Floating Point Exception)", "KILL: Kill signal", "BUS (Bus Error, possibly illegal memory access)", "SEGV (Segmentation Violation (memory access out of range?))", "SYS", "PIPE: Broken pipe: write to pipe with no readers", "ALRM: Timer signal", "TERM: Termination signal", "URG", "STOP", "TSTP", "CONT", "CHLD" }; #endif hypre-2.33.0/src/distributed_ls/Makefile000066400000000000000000000016121477326011500202030ustar00rootroot00000000000000# Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) include ../config/Makefile.config HYPRE_DIST_LS_DIRS =\ pilut\ ParaSails\ Euclid all: @ \ for i in ${HYPRE_DIST_LS_DIRS}; \ do \ if [ -d $$i ]; \ then \ echo "Making $$i ..."; \ (cd $$i && $(MAKE) $@) || exit 1; \ fi; \ done install: @ \ for i in ${HYPRE_DIST_LS_DIRS}; \ do \ if [ -d $$i ]; \ then \ echo "Making $$i ..."; \ (cd $$i && $(MAKE) $@) || exit 1; \ fi; \ done clean: @ \ for i in ${HYPRE_DIST_LS_DIRS}; \ do \ if [ -d $$i ]; \ then \ (cd $$i && $(MAKE) $@) || exit 1; \ fi; \ done distclean: @ \ for i in ${HYPRE_DIST_LS_DIRS}; \ do \ if [ -d $$i ]; \ then \ (cd $$i && $(MAKE) $@) || exit 1; \ fi; \ done hypre-2.33.0/src/distributed_ls/ParaSails/000077500000000000000000000000001477326011500204225ustar00rootroot00000000000000hypre-2.33.0/src/distributed_ls/ParaSails/CMakeLists.txt000066400000000000000000000006721477326011500231670ustar00rootroot00000000000000# Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) set(SRCS ConjGrad.c DiagScale.c FGmres.c Hash.c hypre_ParaSails.c LoadBal.c Matrix.c Mem.c Numbering.c OrderStat.c ParaSails.c PrunedRows.c RowPatt.c StoredRows.c ) target_sources(${PROJECT_NAME} PRIVATE ${SRCS} ) hypre-2.33.0/src/distributed_ls/ParaSails/Common.h000066400000000000000000000026221477326011500220250ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * Common.h header file - common definitions and parameters; also hides * HYPRE-specific definitions * *****************************************************************************/ #include #if 1 /* HYPRE */ #include "HYPRE_config.h" #include "_hypre_utilities.h" #include "fortran.h" #ifdef HYPRE_USING_ESSL #define ESSL #endif #else /* not HYPRE */ #include "mpi.h" #endif #ifndef _COMMON_H #define _COMMON_H #define PARASAILS_MAXLEN 300000 /* maximum nz in a pattern - can grow */ #define PARASAILS_NROWS 300000 /* maximum rows stored per proc - can grow */ #ifndef ABS #define ABS(x) (((x)<0)?(-(x)):(x)) #endif #ifndef MAX #define MAX(a,b) ((a)>(b)?(a):(b)) #endif #ifndef MIN #define MIN(a,b) ((a)<(b)?(a):(b)) #endif #define PARASAILS_EXIT \ { \ hypre_fprintf(stderr, "Exiting...\n"); \ fflush(NULL); \ hypre_MPI_Abort(hypre_MPI_COMM_WORLD, -1); \ } #endif /* _COMMON_H */ hypre-2.33.0/src/distributed_ls/ParaSails/ConjGrad.c000066400000000000000000000112351477326011500222570ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * ConjGrad - Preconditioned conjugate gradient algorithm using the * ParaSails preconditioner. * *****************************************************************************/ #include "math.h" #include "Common.h" #include "Matrix.h" #include "ParaSails.h" #include "_hypre_blas.h" static HYPRE_Real InnerProd(HYPRE_Int n, HYPRE_Real *x, HYPRE_Real *y, MPI_Comm comm) { HYPRE_Real local_result, result; HYPRE_Int one = 1; local_result = hypre_ddot(&n, x, &one, y, &one); hypre_MPI_Allreduce(&local_result, &result, 1, hypre_MPI_REAL, hypre_MPI_SUM, comm); return result; } static void CopyVector(HYPRE_Int n, HYPRE_Real *x, HYPRE_Real *y) { HYPRE_Int one = 1; hypre_F90_NAME_BLAS(dcopy, DCOPY)(&n, x, &one, y, &one); } static void ScaleVector(HYPRE_Int n, HYPRE_Real alpha, HYPRE_Real *x) { HYPRE_Int one = 1; hypre_F90_NAME_BLAS(dscal, DSCAL)(&n, &alpha, x, &one); } static void Axpy(HYPRE_Int n, HYPRE_Real alpha, HYPRE_Real *x, HYPRE_Real *y) { HYPRE_Int one = 1; hypre_F90_NAME_BLAS(daxpy, DAXPY)(&n, &alpha, x, &one, y, &one); } /*-------------------------------------------------------------------------- * PCG_ParaSails - PCG solver using ParaSails. * Use NULL for ps if to get unpreconditioned solve. * Solver will stop at step 500 if rel. resid. norm reduction is not less * than 0.1 at that point. *--------------------------------------------------------------------------*/ void PCG_ParaSails(Matrix *mat, ParaSails *ps, HYPRE_Real *b, HYPRE_Real *x, HYPRE_Real tol, HYPRE_Int max_iter) { HYPRE_Real *p, *s, *r; HYPRE_Real alpha, beta; HYPRE_Real gamma, gamma_old; HYPRE_Real bi_prod, i_prod, eps; HYPRE_Int i = 0; HYPRE_Int mype; /* local problem size */ HYPRE_Int n = mat->end_row - mat->beg_row + 1; MPI_Comm comm = mat->comm; hypre_MPI_Comm_rank(comm, &mype); /* compute square of absolute stopping threshold */ /* bi_prod = */ bi_prod = InnerProd(n, b, b, comm); eps = (tol*tol)*bi_prod; /* Check to see if the rhs vector b is zero */ if (bi_prod == 0.0) { /* Set x equal to zero and return */ CopyVector(n, b, x); return; } p = hypre_TAlloc(HYPRE_Real, n , HYPRE_MEMORY_HOST); s = hypre_TAlloc(HYPRE_Real, n , HYPRE_MEMORY_HOST); r = hypre_TAlloc(HYPRE_Real, n , HYPRE_MEMORY_HOST); /* r = b - Ax */ MatrixMatvec(mat, x, r); /* r = Ax */ ScaleVector(n, -1.0, r); /* r = -r */ Axpy(n, 1.0, b, r); /* r = r + b */ /* p = C*r */ if (ps != NULL) ParaSailsApply(ps, r, p); else CopyVector(n, r, p); /* gamma = */ gamma = InnerProd(n, r, p, comm); while ((i+1) <= max_iter) { i++; /* s = A*p */ MatrixMatvec(mat, p, s); /* alpha = gamma / */ alpha = gamma / InnerProd(n, s, p, comm); gamma_old = gamma; /* x = x + alpha*p */ Axpy(n, alpha, p, x); /* r = r - alpha*s */ Axpy(n, -alpha, s, r); /* s = C*r */ if (ps != NULL) ParaSailsApply(ps, r, s); else CopyVector(n, r, s); /* gamma = */ gamma = InnerProd(n, r, s, comm); /* set i_prod for convergence test */ i_prod = InnerProd(n, r, r, comm); #ifdef PARASAILS_CG_PRINT if (mype == 0 && i % 100 == 0) hypre_printf("Iter (%d): rel. resid. norm: %e\n", i, hypre_sqrt(i_prod/bi_prod)); #endif /* check for convergence */ if (i_prod < eps) break; /* non-convergence test */ if (i >= 1000 && i_prod/bi_prod > 0.01) { if (mype == 0) hypre_printf("Aborting solve due to slow or no convergence.\n"); break; } /* beta = gamma / gamma_old */ beta = gamma / gamma_old; /* p = s + beta p */ ScaleVector(n, beta, p); Axpy(n, 1.0, s, p); } hypre_TFree(p, HYPRE_MEMORY_HOST); hypre_TFree(s, HYPRE_MEMORY_HOST); /* compute exact relative residual norm */ MatrixMatvec(mat, x, r); /* r = Ax */ ScaleVector(n, -1.0, r); /* r = -r */ Axpy(n, 1.0, b, r); /* r = r + b */ i_prod = InnerProd(n, r, r, comm); hypre_TFree(r, HYPRE_MEMORY_HOST); if (mype == 0) hypre_printf("Iter (%4d): computed rrn : %e\n", i, hypre_sqrt(i_prod/bi_prod)); } hypre-2.33.0/src/distributed_ls/ParaSails/ConjGrad.h000066400000000000000000000015531477326011500222660ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * ConjGrad.h header file. * *****************************************************************************/ #ifndef _CONJGRAD_H #define _CONJGRAD_H void PCG_ParaSails(Matrix *mat, ParaSails *ps, HYPRE_Real *b, HYPRE_Real *x, HYPRE_Real tol, HYPRE_Int max_iter); void FGMRES_ParaSails(Matrix *mat, ParaSails *ps, HYPRE_Real *b, HYPRE_Real *x, HYPRE_Int dim, HYPRE_Real tol, HYPRE_Int max_iter); #endif /* _CONJGRAD_H */ hypre-2.33.0/src/distributed_ls/ParaSails/DiagScale.c000066400000000000000000000217421477326011500224100ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * DiagScale - Diagonal scaling. * *****************************************************************************/ #include #include "math.h" #include "Common.h" #include "Matrix.h" #include "RowPatt.h" #include "DiagScale.h" #include "OrderStat.h" #include "Mem.h" HYPRE_Int FindNumReplies(MPI_Comm comm, HYPRE_Int *replies_list); #define DIAG_VALS_TAG 225 #define DIAG_INDS_TAG 226 /*-------------------------------------------------------------------------- * ExchangeDiagEntries - Given a list of indices of diagonal entries required * by this processor, "reqind" of length "reqlen", return a list of * corresponding diagonal entries, "diags". Used internally only by * DiagScaleCreate. * * comm - MPI communicator (input) * mat - matrix used to map row and column numbers to processors (input) * reqlen - length of request list (input) * reqind - list of indices (input) * diags - corresponding list of diagonal entries (output) * num_requests - number of requests (output) * requests - request handles, used to check that all responses are back * (output) * replies_list - array that indicates who we sent message to (output) *--------------------------------------------------------------------------*/ static void ExchangeDiagEntries(MPI_Comm comm, Matrix *mat, HYPRE_Int reqlen, HYPRE_Int *reqind, HYPRE_Real *diags, HYPRE_Int *num_requests, hypre_MPI_Request *requests, HYPRE_Int *replies_list) { hypre_MPI_Request request; HYPRE_Int i, j, this_pe; hypre_shell_sort(reqlen, reqind); *num_requests = 0; for (i=0; ibeg_rows[this_pe] || reqind[j] > mat->end_rows[this_pe]) break; } /* Post receive for diagonal values */ hypre_MPI_Irecv(&diags[i], j-i, hypre_MPI_REAL, this_pe, DIAG_VALS_TAG, comm, &requests[*num_requests]); /* Request rows in reqind[i..j-1] */ hypre_MPI_Isend(&reqind[i], j-i, HYPRE_MPI_INT, this_pe, DIAG_INDS_TAG, comm, &request); hypre_MPI_Request_free(&request); (*num_requests)++; if (replies_list != NULL) replies_list[this_pe] = 1; } } /*-------------------------------------------------------------------------- * ExchangeDiagEntriesServer - Receive requests for diagonal entries and * send replies. Used internally only by DiagScaleCreate. * * comm - MPI communicator (input) * mat - matrix used to map row and column numbers to processors (input) * local_diags - local diagonal entries (input) * num_requests - number of requests to be received (input) *--------------------------------------------------------------------------*/ static void ExchangeDiagEntriesServer(MPI_Comm comm, Matrix *mat, HYPRE_Real *local_diags, HYPRE_Int num_requests, Mem *mem, hypre_MPI_Request *requests) { hypre_MPI_Status status; HYPRE_Int *recvbuf; HYPRE_Real *sendbuf; HYPRE_Int i, j, source, count; /* recvbuf contains requested indices */ /* sendbuf contains corresponding diagonal entries */ for (i=0; ibeg_row]; /* Use ready-mode send, since receives already posted */ hypre_MPI_Irsend(sendbuf, count, hypre_MPI_REAL, source, DIAG_VALS_TAG, comm, &requests[i]); } } /*-------------------------------------------------------------------------- * DiagScaleCreate - Return (a pointer to) a diagonal scaling object. * Scale using the diagonal of A. Use the list of external indices * from the numbering object "numb". *--------------------------------------------------------------------------*/ DiagScale *DiagScaleCreate(Matrix *A, Numbering *numb) { hypre_MPI_Request *requests; hypre_MPI_Status *statuses; HYPRE_Int npes, row, j, num_requests, num_replies, *replies_list; HYPRE_Int len, *ind; HYPRE_Real *val, *temp; Mem *mem; hypre_MPI_Request *requests2; DiagScale *p = hypre_TAlloc(DiagScale, 1, HYPRE_MEMORY_HOST); /* Storage for local diagonal entries */ p->local_diags = (HYPRE_Real *) hypre_TAlloc(HYPRE_Real, (A->end_row - A->beg_row + 1) , HYPRE_MEMORY_HOST); /* Extract the local diagonal entries */ for (row=0; row<=A->end_row - A->beg_row; row++) { MatrixGetRow(A, row, &len, &ind, &val); p->local_diags[row] = 1.0; /* in case no diag entry */ for (j=0; jlocal_diags[row] = 1.0 / hypre_sqrt(ABS(val[j])); break; } } } /* Get the list of diagonal indices that we need. This is simply the external indices */ /* ExchangeDiagEntries will sort the list - so give it a copy */ len = numb->num_ind - numb->num_loc; ind = NULL; p->ext_diags = NULL; if (len) { ind = hypre_TAlloc(HYPRE_Int, len , HYPRE_MEMORY_HOST); hypre_TMemcpy(ind, &numb->local_to_global[numb->num_loc], HYPRE_Int, len, HYPRE_MEMORY_HOST, HYPRE_MEMORY_HOST); /* buffer for receiving diagonal values from other processors */ p->ext_diags = hypre_TAlloc(HYPRE_Real, len , HYPRE_MEMORY_HOST); } hypre_MPI_Comm_size(A->comm, &npes); requests = hypre_TAlloc(hypre_MPI_Request, npes , HYPRE_MEMORY_HOST); statuses = hypre_TAlloc(hypre_MPI_Status, npes , HYPRE_MEMORY_HOST); replies_list = hypre_CTAlloc(HYPRE_Int, npes, HYPRE_MEMORY_HOST); ExchangeDiagEntries(A->comm, A, len, ind, p->ext_diags, &num_requests, requests, replies_list); num_replies = FindNumReplies(A->comm, replies_list); hypre_TFree(replies_list,HYPRE_MEMORY_HOST); mem = MemCreate(); requests2 = NULL; if (num_replies) requests2 = hypre_TAlloc(hypre_MPI_Request, num_replies , HYPRE_MEMORY_HOST); ExchangeDiagEntriesServer(A->comm, A, p->local_diags, num_replies, mem, requests2); /* Wait for all replies */ hypre_MPI_Waitall(num_requests, requests, statuses); hypre_TFree(requests,HYPRE_MEMORY_HOST); p->offset = A->end_row - A->beg_row + 1; /* ind contains global indices corresponding to order that entries are stored in ext_diags. Reorder ext_diags in original ordering */ NumberingGlobalToLocal(numb, len, ind, ind); temp = NULL; if (len) temp = hypre_TAlloc(HYPRE_Real, len , HYPRE_MEMORY_HOST); for (j=0; joffset] = p->ext_diags[j]; hypre_TFree(ind,HYPRE_MEMORY_HOST); hypre_TFree(p->ext_diags,HYPRE_MEMORY_HOST); p->ext_diags = temp; /* Wait for all sends */ hypre_MPI_Waitall(num_replies, requests2, statuses); hypre_TFree(requests2,HYPRE_MEMORY_HOST); MemDestroy(mem); hypre_TFree(statuses,HYPRE_MEMORY_HOST); return p; } /*-------------------------------------------------------------------------- * DiagScaleDestroy - Destroy a diagonal scale object. *--------------------------------------------------------------------------*/ void DiagScaleDestroy(DiagScale *p) { hypre_TFree(p->local_diags,HYPRE_MEMORY_HOST); hypre_TFree(p->ext_diags,HYPRE_MEMORY_HOST); hypre_TFree(p,HYPRE_MEMORY_HOST); } /*-------------------------------------------------------------------------- * DiagScaleGet - Returns scale factor given a row number in local indexing. * The factor is the reciprocal of the square root of the diagonal entry. *--------------------------------------------------------------------------*/ HYPRE_Real DiagScaleGet(DiagScale *p, HYPRE_Int index) { if (index < p->offset) { return p->local_diags[index]; } else { return p->ext_diags[index - p->offset]; } } hypre-2.33.0/src/distributed_ls/ParaSails/DiagScale.h000066400000000000000000000020551477326011500224110ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * DiagScale.h header file. * *****************************************************************************/ #include #include "Hash.h" #include "Matrix.h" #include "Numbering.h" #ifndef _DIAGSCALE_H #define _DIAGSCALE_H typedef struct { HYPRE_Int offset; /* number of on-processor entries */ HYPRE_Real *local_diags; /* on-processor entries */ HYPRE_Real *ext_diags; /* off-processor entries */ } DiagScale; DiagScale *DiagScaleCreate(Matrix *A, Numbering *numb); void DiagScaleDestroy(DiagScale *p); HYPRE_Real DiagScaleGet(DiagScale *p, HYPRE_Int index); #endif /* _DIAGSCALE_H */ hypre-2.33.0/src/distributed_ls/ParaSails/FGmres.c000066400000000000000000000136601477326011500217570ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * FlexGmres - Preconditioned flexible GMRES algorithm using the * ParaSails preconditioner. * *****************************************************************************/ #include "math.h" #include "Common.h" #include "Matrix.h" #include "ParaSails.h" #include "_hypre_blas.h" static HYPRE_Real InnerProd(HYPRE_Int n, HYPRE_Real *x, HYPRE_Real *y, MPI_Comm comm) { HYPRE_Real local_result, result; HYPRE_Int one = 1; local_result = hypre_ddot(&n, x, &one, y, &one); hypre_MPI_Allreduce(&local_result, &result, 1, hypre_MPI_REAL, hypre_MPI_SUM, comm); return result; } static void CopyVector(HYPRE_Int n, HYPRE_Real *x, HYPRE_Real *y) { HYPRE_Int one = 1; hypre_dcopy(&n, x, &one, y, &one); } static void ScaleVector(HYPRE_Int n, HYPRE_Real alpha, HYPRE_Real *x) { HYPRE_Int one = 1; hypre_dscal(&n, &alpha, x, &one); } static void Axpy(HYPRE_Int n, HYPRE_Real alpha, HYPRE_Real *x, HYPRE_Real *y) { HYPRE_Int one = 1; hypre_daxpy(&n, &alpha, x, &one, y, &one); } /* simulate 2-D arrays at the cost of some arithmetic */ #define V(i) (&V[(i)*n]) #define W(i) (&W[(i)*n]) #define H(i,j) (H[(j)*m1+(i)]) static void GeneratePlaneRotation(HYPRE_Real dx, HYPRE_Real dy, HYPRE_Real *cs, HYPRE_Real *sn) { if (dy == 0.0) { *cs = 1.0; *sn = 0.0; } else if (ABS(dy) > ABS(dx)) { HYPRE_Real temp = dx / dy; *sn = 1.0 / hypre_sqrt( 1.0 + temp*temp ); *cs = temp * *sn; } else { HYPRE_Real temp = dy / dx; *cs = 1.0 / hypre_sqrt( 1.0 + temp*temp ); *sn = temp * *cs; } } static void ApplyPlaneRotation(HYPRE_Real *dx, HYPRE_Real *dy, HYPRE_Real cs, HYPRE_Real sn) { HYPRE_Real temp = cs * *dx + sn * *dy; *dy = -sn * *dx + cs * *dy; *dx = temp; } void FGMRES_ParaSails(Matrix *mat, ParaSails *ps, HYPRE_Real *b, HYPRE_Real *x, HYPRE_Int dim, HYPRE_Real tol, HYPRE_Int max_iter) { HYPRE_Int mype; HYPRE_Int iter; HYPRE_Real rel_resid; HYPRE_Real *H = hypre_TAlloc(HYPRE_Real, dim*(dim+1) , HYPRE_MEMORY_HOST); /* local problem size */ HYPRE_Int n = mat->end_row - mat->beg_row + 1; HYPRE_Int m1 = dim+1; /* used inside H macro */ HYPRE_Int i, j, k; HYPRE_Real beta, resid0; HYPRE_Real *s = hypre_TAlloc(HYPRE_Real, (dim+1) , HYPRE_MEMORY_HOST); HYPRE_Real *cs = hypre_TAlloc(HYPRE_Real, dim , HYPRE_MEMORY_HOST); HYPRE_Real *sn = hypre_TAlloc(HYPRE_Real, dim , HYPRE_MEMORY_HOST); HYPRE_Real *V = hypre_TAlloc(HYPRE_Real, n*(dim+1) , HYPRE_MEMORY_HOST); HYPRE_Real *W = hypre_TAlloc(HYPRE_Real, n*dim , HYPRE_MEMORY_HOST); MPI_Comm comm = mat->comm; hypre_MPI_Comm_rank(comm, &mype); iter = 0; do { /* compute initial residual and its norm */ MatrixMatvec(mat, x, V(0)); /* V(0) = A*x */ Axpy(n, -1.0, b, V(0)); /* V(0) = V(0) - b */ beta = hypre_sqrt(InnerProd(n, V(0), V(0), comm)); /* beta = norm(V(0)) */ ScaleVector(n, -1.0/beta, V(0)); /* V(0) = -V(0)/beta */ /* save very first residual norm */ if (iter == 0) resid0 = beta; for (i = 1; i < dim+1; i++) s[i] = 0.0; s[0] = beta; i = -1; do { i++; iter++; if (ps != NULL) ParaSailsApply(ps, V(i), W(i)); else CopyVector(n, V(i), W(i)); MatrixMatvec(mat, W(i), V(i+1)); for (k = 0; k <= i; k++) { H(k, i) = InnerProd(n, V(i+1), V(k), comm); /* V(i+1) -= H(k, i) * V(k); */ Axpy(n, -H(k,i), V(k), V(i+1)); } H(i+1, i) = hypre_sqrt(InnerProd(n, V(i+1), V(i+1), comm)); /* V(i+1) = V(i+1) / H(i+1, i) */ ScaleVector(n, 1.0 / H(i+1, i), V(i+1)); for (k = 0; k < i; k++) ApplyPlaneRotation(&H(k,i), &H(k+1,i), cs[k], sn[k]); GeneratePlaneRotation(H(i,i), H(i+1,i), &cs[i], &sn[i]); ApplyPlaneRotation(&H(i,i), &H(i+1,i), cs[i], sn[i]); ApplyPlaneRotation(&s[i], &s[i+1], cs[i], sn[i]); rel_resid = ABS(s[i+1]) / resid0; #ifdef PARASAILS_CG_PRINT if (mype == 0 && iter % 10 == 0) hypre_printf("Iter (%d): rel. resid. norm: %e\n", iter, rel_resid); #endif if (rel_resid <= tol) break; } while (i+1 < dim && iter+1 <= max_iter); /* solve upper triangular system in place */ for (j = i; j >= 0; j--) { s[j] /= H(j,j); for (k = j-1; k >= 0; k--) s[k] -= H(k,j) * s[j]; } /* update the solution */ for (j = 0; j <= i; j++) { /* x = x + s[j] * W(j) */ Axpy(n, s[j], W(j), x); } } while (rel_resid > tol && iter+1 <= max_iter); /* compute exact residual norm reduction */ MatrixMatvec(mat, x, V(0)); /* V(0) = A*x */ Axpy(n, -1.0, b, V(0)); /* V(0) = V(0) - b */ beta = hypre_sqrt(InnerProd(n, V(0), V(0), comm)); /* beta = norm(V(0)) */ rel_resid = beta / resid0; if (mype == 0) hypre_printf("Iter (%d): computed rrn : %e\n", iter, rel_resid); hypre_TFree(H, HYPRE_MEMORY_HOST); hypre_TFree(s, HYPRE_MEMORY_HOST); hypre_TFree(cs, HYPRE_MEMORY_HOST); hypre_TFree(sn, HYPRE_MEMORY_HOST); hypre_TFree(V, HYPRE_MEMORY_HOST); hypre_TFree(W, HYPRE_MEMORY_HOST); } hypre-2.33.0/src/distributed_ls/ParaSails/Hash.c000066400000000000000000000120751477326011500214560ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * in the table (also known as a closed table). Conflicts are resolved with * * We allow rehashing the data into a larger or smaller table, and thus * allow a data item (an integer, but a pointer would be more general) * to be stored with each key in the table. (If we only return the * storage location of the key in the table (the implied index), then * rehashing would change the implied indices.) * * The modulus function is used as the hash function. * The keys must not equal HASH_EMPTY, which is -1. * The integer data associated with a key must not equal HASH_NOTFOUND, * which is -1. * *****************************************************************************/ #include #include "Common.h" #include "Hash.h" /*-------------------------------------------------------------------------- * HashCreate - Return (a pointer to) a hash table of size "size". * "size" should be prime, if possible. *--------------------------------------------------------------------------*/ Hash *HashCreate(HYPRE_Int size) { HYPRE_Int i, *p; Hash *h = hypre_TAlloc(Hash, 1, HYPRE_MEMORY_HOST); h->size = size; h->num = 0; h->keys = hypre_TAlloc(HYPRE_Int, size , HYPRE_MEMORY_HOST); h->table = hypre_TAlloc(HYPRE_Int, size , HYPRE_MEMORY_HOST); h->data = hypre_TAlloc(HYPRE_Int, size , HYPRE_MEMORY_HOST); /* Initialize the table to empty */ p = h->table; for (i=0; ikeys,HYPRE_MEMORY_HOST); hypre_TFree(h->table,HYPRE_MEMORY_HOST); hypre_TFree(h->data,HYPRE_MEMORY_HOST); hypre_TFree(h,HYPRE_MEMORY_HOST); } /*-------------------------------------------------------------------------- * HashLookup - Look up the "key" in hash table "h" and return the data * associated with the key, or return HASH_NOTFOUND. *--------------------------------------------------------------------------*/ HYPRE_Int HashLookup(Hash *h, HYPRE_Int key) { HYPRE_Int loc; /* loc = key % h->size; */ HYPRE_Real keyd = key * 0.6180339887; loc = (HYPRE_Int) (h->size * (keyd - (HYPRE_Int) keyd)); while (h->table[loc] != key) { if (h->table[loc] == HASH_EMPTY) return HASH_NOTFOUND; loc = (loc + 1) % h->size; } return h->data[loc]; } /*-------------------------------------------------------------------------- * HashInsert - Insert "key" with data "data" into hash table "h". * If the key is already in the hash table, the data item is replaced. *--------------------------------------------------------------------------*/ void HashInsert(Hash *h, HYPRE_Int key, HYPRE_Int data) { HYPRE_Int loc; /* loc = key % h->size; */ HYPRE_Real keyd = (HYPRE_Real) key * 0.6180339887; loc = (HYPRE_Int) ((HYPRE_Real) h->size * (keyd - (HYPRE_Int) keyd)); while (h->table[loc] != key) { if (h->table[loc] == HASH_EMPTY) { hypre_assert(h->num < h->size); h->keys[h->num++] = key; h->table[loc] = key; break; } loc = (loc + 1) % h->size; } h->data[loc] = data; } /*-------------------------------------------------------------------------- * HashRehash - Given two hash tables, put the entries in one table into * the other. *--------------------------------------------------------------------------*/ void HashRehash(Hash *oldHash, Hash *newHash) { HYPRE_Int i, data; for (i=0; inum; i++) { data = HashLookup(oldHash, oldHash->keys[i]); HashInsert(newHash, oldHash->keys[i], data); } } /*-------------------------------------------------------------------------- * HashReset - Reset the hash table to all empty. *--------------------------------------------------------------------------*/ void HashReset(Hash *h) { HYPRE_Int i, *p; h->num = 0; p = h->table; for (i=0; isize; i++) *p++ = HASH_EMPTY; } /*-------------------------------------------------------------------------- * HashPrint - Print hash table to stdout. *--------------------------------------------------------------------------*/ void HashPrint(Hash *h) { HYPRE_Int i, j, *p; HYPRE_Int lines = h->size/38; hypre_printf("Hash size: %d\n", h->size); p = h->table; for (i=0; i #ifndef _HASH_H #define _HASH_H #define HASH_EMPTY -1 /* keys cannot equal HASH_EMPTY */ #define HASH_NOTFOUND -1 /* data items cannot equal HASH_NOTFOUND */ typedef struct { HYPRE_Int size; /* size of hash table */ HYPRE_Int num; /* number of entries in hash table */ HYPRE_Int *keys; /* list of keys, used for rehashing */ HYPRE_Int *table; /* the hash table storing the keys */ HYPRE_Int *data; /* data associated with each entry in the table */ } Hash; Hash *HashCreate(HYPRE_Int size); void HashDestroy(Hash *h); HYPRE_Int HashLookup(Hash *h, HYPRE_Int key); void HashInsert(Hash *h, HYPRE_Int key, HYPRE_Int data); void HashRehash(Hash *old, Hash *); void HashReset(Hash *h); void HashPrint(Hash *h); #endif /* _HASH_H */ hypre-2.33.0/src/distributed_ls/ParaSails/LoadBal.c000066400000000000000000000332361477326011500220730ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * LoadBal - Load balancing module for ParaSails. * *****************************************************************************/ #include #include "Common.h" #include "Matrix.h" #include "Numbering.h" #include "LoadBal.h" /*-------------------------------------------------------------------------- * LoadBalInit - determine the amount of work to be donated and received by * each processor, given the amount of work that each processor has * ("local_cost"). The number of processors that this processor will donate * to is "num_given" and the number of processors from which this processor * will receive is "num_taken". Additional donor information is stored in * "donor_data_pe" and "donor_data_cost". * * local_cost - amount of work that this processor has * beta - target load balance factor *--------------------------------------------------------------------------*/ void LoadBalInit(MPI_Comm comm, HYPRE_Real local_cost, HYPRE_Real beta, HYPRE_Int *num_given, HYPRE_Int *donor_data_pe, HYPRE_Real *donor_data_cost, HYPRE_Int *num_taken) { HYPRE_Int mype, npes; HYPRE_Real *cost, average, upper, move, accept; HYPRE_Int i, jj, j; *num_given = 0; *num_taken = 0; if (beta == 0.0) return; hypre_MPI_Comm_rank(comm, &mype); hypre_MPI_Comm_size(comm, &npes); cost = hypre_TAlloc(HYPRE_Real, npes , HYPRE_MEMORY_HOST); hypre_MPI_Allgather(&local_cost, 1, hypre_MPI_REAL, cost, 1, hypre_MPI_REAL, comm); /* Compute the average cost */ average = 0.0; for (i=0; i upper) { move = cost[i] - upper; /* for j=[i+1:n 1:i-1] */ for (jj=i+1; jj<=i+npes; jj++) { j = jj % npes; if (j == i) continue; if (cost[j] < average) { accept = upper - cost[j]; /* If we are sender, record it */ if (mype == i) { donor_data_pe[*num_given] = j; donor_data_cost[*num_given] = MIN(move, accept); (*num_given)++; } /* If we are receiver, record it */ if (mype == j) { (*num_taken)++; } if (move <= accept) { cost[i] = cost[i] - move; cost[j] = cost[j] + move; #ifdef PARASAILS_DEBUG if (mype == 0) hypre_printf("moved from %d to %d (%7.1e)\n", i,j,move); #endif /*nummoves = nummoves + 1;*/ break; } else { cost[i] = cost[i] - accept; cost[j] = cost[j] + accept; #ifdef PARASAILS_DEBUG if (mype == 0) hypre_printf("moved from %d to %d (%7.1e)\n", i,j,accept); #endif /*nummoves = nummoves + 1;*/ move = cost[i] - upper; } } } } } hypre_TFree(cost,HYPRE_MEMORY_HOST); } /*-------------------------------------------------------------------------- * LoadBalDonorSend - send the indices of the donated rows. * The message structure is: beg_row, end_row, len1, indices1, len2, .... * Caller must free the allocated buffers. *--------------------------------------------------------------------------*/ void LoadBalDonorSend(MPI_Comm comm, Matrix *mat, Numbering *numb, HYPRE_Int num_given, const HYPRE_Int *donor_data_pe, const HYPRE_Real *donor_data_cost, DonorData *donor_data, HYPRE_Int *local_beg_row, hypre_MPI_Request *request) { HYPRE_Int send_beg_row, send_end_row; HYPRE_Int i, row; HYPRE_Real accum; HYPRE_Int buflen; HYPRE_Int *bufferp; HYPRE_Int len, *ind; HYPRE_Real *val; send_end_row = mat->beg_row - 1; /* imaginary end of previous block */ for (i=0; iend_row); MatrixGetRow(mat, send_end_row - mat->beg_row, &len, &ind, &val); accum += (HYPRE_Real) len*len*len; buflen += (len+1); /* additional one for row length */ } while (accum < donor_data_cost[i]); /* Create entry in donor_data structure */ donor_data[i].pe = donor_data_pe[i]; donor_data[i].beg_row = send_beg_row; donor_data[i].end_row = send_end_row; donor_data[i].buffer = hypre_TAlloc(HYPRE_Int, (buflen) , HYPRE_MEMORY_HOST); /* Construct send buffer */ bufferp = donor_data[i].buffer; *bufferp++ = send_beg_row; *bufferp++ = send_end_row; for (row=send_beg_row; row<=send_end_row; row++) { MatrixGetRow(mat, row - mat->beg_row, &len, &ind, &val); *bufferp++ = len; /* memcpy(bufferp, ind, len*sizeof(HYPRE_Int)); */ /* copy into buffer */ NumberingLocalToGlobal(numb, len, ind, bufferp); bufferp += len; } hypre_MPI_Isend(donor_data[i].buffer, buflen, HYPRE_MPI_INT, donor_data[i].pe, LOADBAL_REQ_TAG, comm, &request[i]); } *local_beg_row = send_end_row + 1; } /*-------------------------------------------------------------------------- * LoadBalRecipRecv - receive the indices of the donated rows. * The message structure is: beg_row, end_row, len1, indices1, len2, .... *--------------------------------------------------------------------------*/ void LoadBalRecipRecv(MPI_Comm comm, Numbering *numb, HYPRE_Int num_taken, RecipData *recip_data) { HYPRE_Int i, row; HYPRE_Int count; hypre_MPI_Status status; HYPRE_Int *buffer, *bufferp; HYPRE_Int beg_row, end_row; HYPRE_Int len; for (i=0; iend_row - mat->beg_row; row++) { MatrixGetRow(mat, row, &len, &ind, &val); buflen += len; } recip_data[i].buffer = hypre_TAlloc(HYPRE_Real, buflen , HYPRE_MEMORY_HOST); /* Construct send buffer */ bufferp = recip_data[i].buffer; for (row=0; row<=mat->end_row - mat->beg_row; row++) { MatrixGetRow(mat, row, &len, &ind, &val); hypre_TMemcpy(bufferp, val, HYPRE_Real, len, HYPRE_MEMORY_HOST, HYPRE_MEMORY_HOST); /* copy into buffer */ bufferp += len; } hypre_MPI_Isend(recip_data[i].buffer, buflen, hypre_MPI_REAL, recip_data[i].pe, LOADBAL_REP_TAG, comm, &request[i]); MatrixDestroy(mat); } } /*-------------------------------------------------------------------------- * LoadBalDonorRecv - receive the computed values of the donated rows. * Traverse all the donated local matrices. * Assume indices are in the same order. *--------------------------------------------------------------------------*/ void LoadBalDonorRecv(MPI_Comm comm, Matrix *mat, HYPRE_Int num_given, DonorData *donor_data) { HYPRE_Int i, j, row; HYPRE_Int source, count; hypre_MPI_Status status; HYPRE_Real *buffer, *bufferp; HYPRE_Int len, *ind; HYPRE_Real *val; for (i=0; ibeg_row, &len, &ind, &val); hypre_TMemcpy(val, bufferp, HYPRE_Real, len, HYPRE_MEMORY_HOST, HYPRE_MEMORY_HOST); /* copy into matrix */ bufferp += len; } hypre_TFree(buffer,HYPRE_MEMORY_HOST); } } /*-------------------------------------------------------------------------- * LoadBalDonate *--------------------------------------------------------------------------*/ LoadBal *LoadBalDonate(MPI_Comm comm, Matrix *mat, Numbering *numb, HYPRE_Real local_cost, HYPRE_Real beta) { LoadBal *p; HYPRE_Int i, npes; HYPRE_Int *donor_data_pe; HYPRE_Real *donor_data_cost; hypre_MPI_Request *requests = NULL; hypre_MPI_Status *statuses = NULL; p = hypre_TAlloc(LoadBal, 1, HYPRE_MEMORY_HOST); hypre_MPI_Comm_size(comm, &npes); donor_data_pe = hypre_TAlloc(HYPRE_Int, npes , HYPRE_MEMORY_HOST); donor_data_cost = hypre_TAlloc(HYPRE_Real, npes , HYPRE_MEMORY_HOST); LoadBalInit(comm, local_cost, beta, &p->num_given, donor_data_pe, donor_data_cost, &p->num_taken); p->recip_data = NULL; p->donor_data = NULL; if (p->num_taken) p->recip_data = hypre_TAlloc(RecipData, p->num_taken , HYPRE_MEMORY_HOST); if (p->num_given) { p->donor_data = hypre_TAlloc(DonorData, p->num_given , HYPRE_MEMORY_HOST); requests = hypre_TAlloc(hypre_MPI_Request, p->num_given , HYPRE_MEMORY_HOST); statuses = hypre_TAlloc(hypre_MPI_Status, p->num_given , HYPRE_MEMORY_HOST); } LoadBalDonorSend(comm, mat, numb, p->num_given, donor_data_pe, donor_data_cost, p->donor_data, &p->beg_row, requests); hypre_TFree(donor_data_pe,HYPRE_MEMORY_HOST); hypre_TFree(donor_data_cost,HYPRE_MEMORY_HOST); LoadBalRecipRecv(comm, numb, p->num_taken, p->recip_data); hypre_MPI_Waitall(p->num_given, requests, statuses); hypre_TFree(requests,HYPRE_MEMORY_HOST); hypre_TFree(statuses,HYPRE_MEMORY_HOST); /* Free the send buffers which were allocated by LoadBalDonorSend */ for (i=0; inum_given; i++) hypre_TFree(p->donor_data[i].buffer,HYPRE_MEMORY_HOST); return p; } /*-------------------------------------------------------------------------- * LoadBalReturn *--------------------------------------------------------------------------*/ void LoadBalReturn(LoadBal *p, MPI_Comm comm, Matrix *mat) { HYPRE_Int i; hypre_MPI_Request *requests = NULL; hypre_MPI_Status *statuses = NULL; if (p->num_taken) { requests = hypre_TAlloc(hypre_MPI_Request, p->num_taken , HYPRE_MEMORY_HOST); statuses = hypre_TAlloc(hypre_MPI_Status, p->num_taken , HYPRE_MEMORY_HOST); } LoadBalRecipSend(comm, p->num_taken, p->recip_data, requests); LoadBalDonorRecv(comm, mat, p->num_given, p->donor_data); hypre_MPI_Waitall(p->num_taken, requests, statuses); hypre_TFree(requests,HYPRE_MEMORY_HOST); hypre_TFree(statuses,HYPRE_MEMORY_HOST); /* Free the send buffers which were allocated by LoadBalRecipSend */ for (i=0; inum_taken; i++) hypre_TFree(p->recip_data[i].buffer,HYPRE_MEMORY_HOST); hypre_TFree(p->donor_data,HYPRE_MEMORY_HOST); hypre_TFree(p->recip_data,HYPRE_MEMORY_HOST); hypre_TFree(p,HYPRE_MEMORY_HOST); } hypre-2.33.0/src/distributed_ls/ParaSails/LoadBal.h000066400000000000000000000024231477326011500220720ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * LoadBal.h header file. * *****************************************************************************/ #ifndef _LOADBAL_H #define _LOADBAL_H #define LOADBAL_REQ_TAG 888 #define LOADBAL_REP_TAG 889 typedef struct { HYPRE_Int pe; HYPRE_Int beg_row; HYPRE_Int end_row; HYPRE_Int *buffer; } DonorData; typedef struct { HYPRE_Int pe; Matrix *mat; HYPRE_Real *buffer; } RecipData; typedef struct { HYPRE_Int num_given; HYPRE_Int num_taken; DonorData *donor_data; RecipData *recip_data; HYPRE_Int beg_row; /* local beginning row, after all donated rows */ } LoadBal; LoadBal *LoadBalDonate(MPI_Comm comm, Matrix *mat, Numbering *numb, HYPRE_Real local_cost, HYPRE_Real beta); void LoadBalReturn(LoadBal *p, MPI_Comm comm, Matrix *mat); #endif /* _LOADBAL_H */ hypre-2.33.0/src/distributed_ls/ParaSails/Makefile000066400000000000000000000033671477326011500220730ustar00rootroot00000000000000# Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) include ../../config/Makefile.config CINCLUDES = ${INCLUDES} ${MPIINCLUDE} C_COMPILE_FLAGS = \ -I../..\ -I$(srcdir)\ -I$(srcdir)/../..\ -I$(srcdir)/../../blas\ -I$(srcdir)/../../lapack\ -I$(srcdir)/../../utilities\ -I$(srcdir)/../../distributed_matrix\ ${CINCLUDES} HEADERS =\ Common.h\ ConjGrad.h\ DiagScale.h\ Hash.h\ hypre_ParaSails.h\ LoadBal.h\ Matrix.h\ Mem.h\ Numbering.h\ OrderStat.h\ ParaSails.h\ PrunedRows.h\ RowPatt.h\ StoredRows.h FILES =\ ConjGrad.c\ DiagScale.c\ FGmres.c\ Hash.c\ hypre_ParaSails.c\ LoadBal.c\ Matrix.c\ Mem.c\ Numbering.c\ OrderStat.c\ ParaSails.c\ PrunedRows.c\ RowPatt.c\ StoredRows.c OBJS = ${FILES:.c=.o} SONAME = libHYPRE_ParaSails-${HYPRE_RELEASE_VERSION}${HYPRE_LIB_SUFFIX} ################################################################## # Targets ################################################################## all: libHYPRE_ParaSails${HYPRE_LIB_SUFFIX} # cp -fR libHYPRE* $(HYPRE_BUILD_DIR)/lib install: libHYPRE_ParaSails${HYPRE_LIB_SUFFIX} # cp -fR libHYPRE* $(HYPRE_LIB_INSTALL) clean: rm -f *.o libHYPRE* rm -rf pchdir tca.map *inslog* distclean: clean ################################################################## # Rules ################################################################## libHYPRE_ParaSails.a: ${OBJS} @echo "Building $@ ... " ${AR} $@ ${OBJS} ${RANLIB} $@ libHYPRE_ParaSails.so libHYPRE_ParaSails.dylib: ${OBJS} @echo "Building $@ ... " ${BUILD_CC_SHARED} -o ${SONAME} ${OBJS} ${SHARED_SET_SONAME}${SONAME} ln -s -f ${SONAME} $@ ${OBJS}: ${HEADERS} hypre-2.33.0/src/distributed_ls/ParaSails/Matrix.c000066400000000000000000000634311477326011500220410ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * Matrix - Matrix stored and accessible by rows. Indices and values for * the matrix nonzeros are copied into the matrix a row at a time, in any * order using the MatrixGetRow function. The MatrixPutRow function returns * a pointer to the indices and values of a row. The matrix has a set of * row and column indices such that these indices begin at "beg" and end * at "end", where 0 <= "beg" <= "end". In other words, the matrix indices * have any nonnegative base value, and the base values of the row and column * indices must agree. * *****************************************************************************/ #include //#include #include "Common.h" #include "Matrix.h" #include "Numbering.h" #define MAX_NZ_PER_ROW 1000 /*-------------------------------------------------------------------------- * MatrixCreate - Return (a pointer to) a matrix object. *--------------------------------------------------------------------------*/ Matrix *MatrixCreate(MPI_Comm comm, HYPRE_Int beg_row, HYPRE_Int end_row) { HYPRE_Int num_rows, mype, npes; Matrix *mat = hypre_TAlloc(Matrix, 1, HYPRE_MEMORY_HOST); mat->comm = comm; mat->beg_row = beg_row; mat->end_row = end_row; mat->mem = (Mem *) MemCreate(); num_rows = mat->end_row - mat->beg_row + 1; mat->lens = (HYPRE_Int *) MemAlloc(mat->mem, num_rows * sizeof(HYPRE_Int)); mat->inds = (HYPRE_Int **) MemAlloc(mat->mem, num_rows * sizeof(HYPRE_Int *)); mat->vals = (HYPRE_Real **) MemAlloc(mat->mem, num_rows * sizeof(HYPRE_Real *)); /* Send beg_row and end_row to all processors */ /* This is needed in order to map row numbers to processors */ hypre_MPI_Comm_rank(comm, &mype); hypre_MPI_Comm_size(comm, &npes); mat->beg_rows = (HYPRE_Int *) MemAlloc(mat->mem, npes * sizeof(HYPRE_Int)); mat->end_rows = (HYPRE_Int *) MemAlloc(mat->mem, npes * sizeof(HYPRE_Int)); hypre_MPI_Allgather(&beg_row, 1, HYPRE_MPI_INT, mat->beg_rows, 1, HYPRE_MPI_INT, comm); hypre_MPI_Allgather(&end_row, 1, HYPRE_MPI_INT, mat->end_rows, 1, HYPRE_MPI_INT, comm); mat->num_recv = 0; mat->num_send = 0; mat->recv_req = NULL; mat->send_req = NULL; mat->recv_req2 = NULL; mat->send_req2 = NULL; mat->statuses = NULL; mat->sendind = NULL; mat->sendbuf = NULL; mat->recvbuf = NULL; mat->numb = NULL; return mat; } /*-------------------------------------------------------------------------- * MatrixCreateLocal - Return (a pointer to) a matrix object. * The matrix created by this call is a local matrix, not a global matrix. *--------------------------------------------------------------------------*/ Matrix *MatrixCreateLocal(HYPRE_Int beg_row, HYPRE_Int end_row) { HYPRE_Int num_rows; Matrix *mat = hypre_TAlloc(Matrix, 1, HYPRE_MEMORY_HOST); mat->comm = hypre_MPI_COMM_NULL; mat->beg_row = beg_row; mat->end_row = end_row; mat->mem = (Mem *) MemCreate(); num_rows = mat->end_row - mat->beg_row + 1; mat->lens = (HYPRE_Int *) MemAlloc(mat->mem, num_rows * sizeof(HYPRE_Int)); mat->inds = (HYPRE_Int **) MemAlloc(mat->mem, num_rows * sizeof(HYPRE_Int *)); mat->vals = (HYPRE_Real **) MemAlloc(mat->mem, num_rows * sizeof(HYPRE_Real *)); /* Send beg_row and end_row to all processors */ /* This is needed in order to map row numbers to processors */ mat->beg_rows = NULL; mat->end_rows = NULL; mat->num_recv = 0; mat->num_send = 0; mat->recv_req = NULL; mat->send_req = NULL; mat->recv_req2 = NULL; mat->send_req2 = NULL; mat->statuses = NULL; mat->sendind = NULL; mat->sendbuf = NULL; mat->recvbuf = NULL; mat->numb = NULL; return mat; } /*-------------------------------------------------------------------------- * MatrixDestroy - Destroy a matrix object "mat". *--------------------------------------------------------------------------*/ void MatrixDestroy(Matrix *mat) { HYPRE_Int i; for (i=0; inum_recv; i++) hypre_MPI_Request_free(&mat->recv_req[i]); for (i=0; inum_send; i++) hypre_MPI_Request_free(&mat->send_req[i]); for (i=0; inum_send; i++) hypre_MPI_Request_free(&mat->recv_req2[i]); for (i=0; inum_recv; i++) hypre_MPI_Request_free(&mat->send_req2[i]); hypre_TFree(mat->recv_req,HYPRE_MEMORY_HOST); hypre_TFree(mat->send_req,HYPRE_MEMORY_HOST); hypre_TFree(mat->recv_req2,HYPRE_MEMORY_HOST); hypre_TFree(mat->send_req2,HYPRE_MEMORY_HOST); hypre_TFree(mat->statuses,HYPRE_MEMORY_HOST); hypre_TFree(mat->sendind,HYPRE_MEMORY_HOST); hypre_TFree(mat->sendbuf,HYPRE_MEMORY_HOST); hypre_TFree(mat->recvbuf,HYPRE_MEMORY_HOST); MemDestroy(mat->mem); if (mat->numb) NumberingDestroy(mat->numb); hypre_TFree(mat,HYPRE_MEMORY_HOST); } /*-------------------------------------------------------------------------- * MatrixSetRow - Set a row in a matrix. Only local rows can be set. * Once a row has been set, it should not be set again, or else the * memory used by the existing row will not be recovered until * the matrix is destroyed. "row" is in global coordinate numbering. *--------------------------------------------------------------------------*/ void MatrixSetRow(Matrix *mat, HYPRE_Int row, HYPRE_Int len, HYPRE_Int *ind, HYPRE_Real *val) { row -= mat->beg_row; mat->lens[row] = len; mat->inds[row] = (HYPRE_Int *) MemAlloc(mat->mem, len*sizeof(HYPRE_Int)); mat->vals[row] = (HYPRE_Real *) MemAlloc(mat->mem, len*sizeof(HYPRE_Real)); if (ind != NULL) { //hypre_TMemcpy(mat->inds[row], ind, HYPRE_Int, len, HYPRE_MEMORY_HOST, HYPRE_MEMORY_HOST); memcpy(mat->inds[row], ind, sizeof(HYPRE_Int) * len); } if (val != NULL) { //hypre_TMemcpy(mat->vals[row], val, HYPRE_Real, len, HYPRE_MEMORY_HOST, HYPRE_MEMORY_HOST); memcpy(mat->vals[row], val, sizeof(HYPRE_Real) * len); } } /*-------------------------------------------------------------------------- * MatrixGetRow - Get a *local* row in a matrix. *--------------------------------------------------------------------------*/ void MatrixGetRow(Matrix *mat, HYPRE_Int row, HYPRE_Int *lenp, HYPRE_Int **indp, HYPRE_Real **valp) { *lenp = mat->lens[row]; *indp = mat->inds[row]; *valp = mat->vals[row]; } /*-------------------------------------------------------------------------- * MatrixRowPe - Map "row" to a processor number. *--------------------------------------------------------------------------*/ HYPRE_Int MatrixRowPe(Matrix *mat, HYPRE_Int row) { HYPRE_Int npes, pe; HYPRE_Int *beg = mat->beg_rows; HYPRE_Int *end = mat->end_rows; hypre_MPI_Comm_size(mat->comm, &npes); for (pe=0; pe= beg[pe] && row <= end[pe]) return pe; } hypre_printf("MatrixRowPe: could not map row %d.\n", row); PARASAILS_EXIT; return -1; /* for picky compilers */ } /*-------------------------------------------------------------------------- * MatrixNnz - Return total number of nonzeros in preconditioner. *--------------------------------------------------------------------------*/ HYPRE_Int MatrixNnz(Matrix *mat) { HYPRE_Int num_local, i, total, alltotal; num_local = mat->end_row - mat->beg_row + 1; total = 0; for (i=0; ilens[i]; hypre_MPI_Allreduce(&total, &alltotal, 1, HYPRE_MPI_INT, hypre_MPI_SUM, mat->comm); return alltotal; } /*-------------------------------------------------------------------------- * MatrixPrint - Print a matrix to a file "filename". Each processor * appends to the file in order, but the file is overwritten if it exists. *--------------------------------------------------------------------------*/ void MatrixPrint(Matrix *mat, char *filename) { HYPRE_Int mype, npes, pe; HYPRE_Int row, i, len, *ind; HYPRE_Real *val; hypre_MPI_Comm_rank(mat->comm, &mype); hypre_MPI_Comm_size(mat->comm, &npes); for (pe=0; pecomm); if (mype == pe) { FILE *file = fopen(filename, (pe==0 ? "w" : "a")); hypre_assert(file != NULL); for (row=0; row<=mat->end_row - mat->beg_row; row++) { MatrixGetRow(mat, row, &len, &ind, &val); for (i=0; ibeg_row, mat->numb->local_to_global[ind[i]], val[i]); } fclose(file); } } } /*-------------------------------------------------------------------------- * MatrixReadMaster - MatrixRead routine for processor 0. Internal use. *--------------------------------------------------------------------------*/ static void MatrixReadMaster(Matrix *mat, char *filename) { MPI_Comm comm = mat->comm; HYPRE_Int mype, npes; FILE *file; HYPRE_Int ret; HYPRE_Int num_rows, curr_proc; HYPRE_Int row, col; HYPRE_Real value; hypre_longint offset; hypre_longint outbuf; HYPRE_Int curr_row; HYPRE_Int len; HYPRE_Int ind[MAX_NZ_PER_ROW]; HYPRE_Real val[MAX_NZ_PER_ROW]; char line[100]; HYPRE_Int oldrow; hypre_MPI_Request request; hypre_MPI_Status status; hypre_MPI_Comm_size(mat->comm, &npes); hypre_MPI_Comm_rank(mat->comm, &mype); file = fopen(filename, "r"); hypre_assert(file != NULL); if (fgets(line, 100, file) == NULL) { hypre_fprintf(stderr, "Error reading file.\n"); PARASAILS_EXIT; } #ifdef EMSOLVE ret = hypre_sscanf(line, "%*d %d %*d %*d", &num_rows); for (row=0; rowbeg_rows[curr_proc]) { hypre_MPI_Wait(&request, &status); outbuf = offset; hypre_MPI_Isend(&outbuf, 1, hypre_MPI_LONG, curr_proc, 0, comm, &request); curr_proc++; } offset = ftell(file); oldrow = row; hypre_fscanf(file, "%d %d %lf", &row, &col, &value); if (oldrow > row) { hypre_fprintf(stderr, "Matrix file is not sorted by rows.\n"); PARASAILS_EXIT; } } /* Now read our own part */ rewind(file); if (fgets(line, 100, file) == NULL) { hypre_fprintf(stderr, "Error reading file.\n"); PARASAILS_EXIT; } #ifdef EMSOLVE ret = hypre_sscanf(line, "%*d %d %*d %*d", &num_rows); for (row=0; rowend_row) { if (row != curr_row) { /* store this row */ MatrixSetRow(mat, curr_row, len, ind, val); curr_row = row; /* reset row pointer */ len = 0; } if (len >= MAX_NZ_PER_ROW) { hypre_fprintf(stderr, "The matrix has exceeded %d\n", MAX_NZ_PER_ROW); hypre_fprintf(stderr, "nonzeros per row. Internal buffers must be\n"); hypre_fprintf(stderr, "increased to continue.\n"); PARASAILS_EXIT; } ind[len] = col; val[len] = value; len++; ret = hypre_fscanf(file, "%d %d %lf", &row, &col, &value); } /* Store the final row */ if (ret == EOF || row > mat->end_row) MatrixSetRow(mat, mat->end_row, len, ind, val); fclose(file); hypre_MPI_Wait(&request, &status); } /*-------------------------------------------------------------------------- * MatrixReadSlave - MatrixRead routine for other processors. Internal use. *--------------------------------------------------------------------------*/ static void MatrixReadSlave(Matrix *mat, char *filename) { MPI_Comm comm = mat->comm; hypre_MPI_Status status; HYPRE_Int mype; FILE *file; HYPRE_Int ret; HYPRE_Int row, col; HYPRE_Real value; hypre_longint offset; HYPRE_Int curr_row; HYPRE_Int len; HYPRE_Int ind[MAX_NZ_PER_ROW]; HYPRE_Real val[MAX_NZ_PER_ROW]; HYPRE_Real time0, time1; file = fopen(filename, "r"); hypre_assert(file != NULL); hypre_MPI_Comm_rank(mat->comm, &mype); hypre_MPI_Recv(&offset, 1, hypre_MPI_LONG, 0, 0, comm, &status); time0 = hypre_MPI_Wtime(); ret = fseek(file, offset, SEEK_SET); hypre_assert(ret == 0); ret = hypre_fscanf(file, "%d %d %lf", &row, &col, &value); curr_row = row; len = 0; while (ret != EOF && row <= mat->end_row) { if (row != curr_row) { /* store this row */ MatrixSetRow(mat, curr_row, len, ind, val); curr_row = row; /* reset row pointer */ len = 0; } if (len >= MAX_NZ_PER_ROW) { hypre_fprintf(stderr, "The matrix has exceeded %d\n", MAX_NZ_PER_ROW); hypre_fprintf(stderr, "nonzeros per row. Internal buffers must be\n"); hypre_fprintf(stderr, "increased to continue.\n"); PARASAILS_EXIT; } ind[len] = col; val[len] = value; len++; ret = hypre_fscanf(file, "%d %d %lf", &row, &col, &value); } /* Store the final row */ if (ret == EOF || row > mat->end_row) MatrixSetRow(mat, mat->end_row, len, ind, val); fclose(file); time1 = hypre_MPI_Wtime(); hypre_printf("%d: Time for slave read: %f\n", mype, time1-time0); } /*-------------------------------------------------------------------------- * MatrixRead - Read a matrix file "filename" from disk and store in the * matrix "mat" which has already been created using MatrixCreate. The format * assumes no nonzero rows, the rows are in order, and there will be at least * one row per processor. *--------------------------------------------------------------------------*/ void MatrixRead(Matrix *mat, char *filename) { HYPRE_Int mype; HYPRE_Real time0, time1; hypre_MPI_Comm_rank(mat->comm, &mype); time0 = hypre_MPI_Wtime(); if (mype == 0) MatrixReadMaster(mat, filename); else MatrixReadSlave(mat, filename); time1 = hypre_MPI_Wtime(); hypre_printf("%d: Time for reading matrix: %f\n", mype, time1-time0); MatrixComplete(mat); } /*-------------------------------------------------------------------------- * RhsRead - Read a right-hand side file "filename" from disk and store in the * location pointed to by "rhs". "mat" is needed to provide the partitioning * information. The expected format is: a header line (n, nrhs) followed * by n values. Also allows isis format, indicated by 1 HYPRE_Int in first line. *--------------------------------------------------------------------------*/ void RhsRead(HYPRE_Real *rhs, Matrix *mat, char *filename) { FILE *file; hypre_MPI_Status status; HYPRE_Int mype, npes; HYPRE_Int num_rows, num_local, pe, i, converted; HYPRE_Real *buffer = NULL; HYPRE_Int buflen = 0; char line[100]; HYPRE_Int dummy; hypre_MPI_Comm_size(mat->comm, &npes); hypre_MPI_Comm_rank(mat->comm, &mype); num_local = mat->end_row - mat->beg_row + 1; if (mype != 0) { hypre_MPI_Recv(rhs, num_local, hypre_MPI_REAL, 0, 0, mat->comm, &status); return; } file = fopen(filename, "r"); hypre_assert(file != NULL); if (fgets(line, 100, file) == NULL) { hypre_fprintf(stderr, "Error reading file.\n"); PARASAILS_EXIT; } converted = hypre_sscanf(line, "%d %d", &num_rows, &dummy); hypre_assert(num_rows == mat->end_rows[npes-1]); /* Read own rows first */ for (i=0; iend_rows[pe] - mat->beg_rows[pe]+ 1; if (buflen < num_local) { hypre_TFree(buffer,HYPRE_MEMORY_HOST); buflen = num_local; buffer = hypre_TAlloc(HYPRE_Real, buflen , HYPRE_MEMORY_HOST); } for (i=0; icomm); } hypre_TFree(buffer,HYPRE_MEMORY_HOST); } /*-------------------------------------------------------------------------- * SetupReceives *--------------------------------------------------------------------------*/ static void SetupReceives(Matrix *mat, HYPRE_Int reqlen, HYPRE_Int *reqind, HYPRE_Int *outlist) { HYPRE_Int i, j, this_pe, mype; hypre_MPI_Request request; MPI_Comm comm = mat->comm; HYPRE_Int num_local = mat->end_row - mat->beg_row + 1; hypre_MPI_Comm_rank(comm, &mype); mat->num_recv = 0; /* Allocate recvbuf */ /* recvbuf has numlocal entires saved for local part of x, used in matvec */ mat->recvlen = reqlen; /* used for the transpose multiply */ mat->recvbuf = hypre_TAlloc(HYPRE_Real, (reqlen+num_local) , HYPRE_MEMORY_HOST); for (i=0; ibeg_rows[this_pe] || reqind[j] > mat->end_rows[this_pe]) break; } /* Request rows in reqind[i..j-1] */ hypre_MPI_Isend(&reqind[i], j-i, HYPRE_MPI_INT, this_pe, 444, comm, &request); hypre_MPI_Request_free(&request); /* Count of number of number of indices needed from this_pe */ outlist[this_pe] = j-i; hypre_MPI_Recv_init(&mat->recvbuf[i+num_local], j-i, hypre_MPI_REAL, this_pe, 555, comm, &mat->recv_req[mat->num_recv]); hypre_MPI_Send_init(&mat->recvbuf[i+num_local], j-i, hypre_MPI_REAL, this_pe, 666, comm, &mat->send_req2[mat->num_recv]); mat->num_recv++; } } /*-------------------------------------------------------------------------- * SetupSends * This function will wait for all receives to complete. *--------------------------------------------------------------------------*/ static void SetupSends(Matrix *mat, HYPRE_Int *inlist) { HYPRE_Int i, j, mype, npes; hypre_MPI_Request *requests; hypre_MPI_Status *statuses; MPI_Comm comm = mat->comm; hypre_MPI_Comm_rank(comm, &mype); hypre_MPI_Comm_size(comm, &npes); requests = hypre_TAlloc(hypre_MPI_Request, npes , HYPRE_MEMORY_HOST); statuses = hypre_TAlloc(hypre_MPI_Status, npes , HYPRE_MEMORY_HOST); /* Determine size of and allocate sendbuf and sendind */ mat->sendlen = 0; for (i=0; isendlen += inlist[i]; mat->sendbuf = NULL; mat->sendind = NULL; if (mat->sendlen) { mat->sendbuf = hypre_TAlloc(HYPRE_Real, mat->sendlen , HYPRE_MEMORY_HOST); mat->sendind = hypre_TAlloc(HYPRE_Int, mat->sendlen , HYPRE_MEMORY_HOST); } j = 0; mat->num_send = 0; for (i=0; isendind[j], inlist[i], HYPRE_MPI_INT, i, 444, comm, &requests[mat->num_send]); /* Set up the send */ hypre_MPI_Send_init(&mat->sendbuf[j], inlist[i], hypre_MPI_REAL, i, 555, comm, &mat->send_req[mat->num_send]); /* Set up the receive for the transpose */ hypre_MPI_Recv_init(&mat->sendbuf[j], inlist[i], hypre_MPI_REAL, i, 666, comm, &mat->recv_req2[mat->num_send]); mat->num_send++; j += inlist[i]; } } hypre_MPI_Waitall(mat->num_send, requests, statuses); hypre_TFree(requests,HYPRE_MEMORY_HOST); hypre_TFree(statuses,HYPRE_MEMORY_HOST); /* convert global indices to local indices */ /* these are all indices on this processor */ for (i=0; isendlen; i++) mat->sendind[i] -= mat->beg_row; } /*-------------------------------------------------------------------------- * MatrixComplete *--------------------------------------------------------------------------*/ void MatrixComplete(Matrix *mat) { HYPRE_Int mype, npes; HYPRE_Int *outlist, *inlist; HYPRE_Int row, len, *ind; HYPRE_Real *val; hypre_MPI_Comm_rank(mat->comm, &mype); hypre_MPI_Comm_size(mat->comm, &npes); mat->recv_req = hypre_TAlloc(hypre_MPI_Request, npes , HYPRE_MEMORY_HOST); mat->send_req = hypre_TAlloc(hypre_MPI_Request, npes , HYPRE_MEMORY_HOST); mat->recv_req2 = hypre_TAlloc(hypre_MPI_Request, npes , HYPRE_MEMORY_HOST); mat->send_req2 = hypre_TAlloc(hypre_MPI_Request, npes , HYPRE_MEMORY_HOST); mat->statuses = hypre_TAlloc(hypre_MPI_Status, npes , HYPRE_MEMORY_HOST); outlist = hypre_CTAlloc(HYPRE_Int, npes, HYPRE_MEMORY_HOST); inlist = hypre_CTAlloc(HYPRE_Int, npes, HYPRE_MEMORY_HOST); /* Create Numbering object */ mat->numb = NumberingCreate(mat, PARASAILS_NROWS); SetupReceives(mat, mat->numb->num_ind - mat->numb->num_loc, &mat->numb->local_to_global[mat->numb->num_loc], outlist); hypre_MPI_Alltoall(outlist, 1, HYPRE_MPI_INT, inlist, 1, HYPRE_MPI_INT, mat->comm); SetupSends(mat, inlist); hypre_TFree(outlist,HYPRE_MEMORY_HOST); hypre_TFree(inlist,HYPRE_MEMORY_HOST); /* Convert to local indices */ for (row=0; row<=mat->end_row - mat->beg_row; row++) { MatrixGetRow(mat, row, &len, &ind, &val); NumberingGlobalToLocal(mat->numb, len, ind, ind); } } /*-------------------------------------------------------------------------- * MatrixMatvec * Can be done in place. *--------------------------------------------------------------------------*/ void MatrixMatvec(Matrix *mat, HYPRE_Real *x, HYPRE_Real *y) { HYPRE_Int row, i, len, *ind; HYPRE_Real *val, temp; HYPRE_Int num_local = mat->end_row - mat->beg_row + 1; /* Set up persistent communications */ /* Assumes MatrixComplete has been called */ /* Put components of x into the right outgoing buffers */ for (i=0; isendlen; i++) mat->sendbuf[i] = x[mat->sendind[i]]; hypre_MPI_Startall(mat->num_recv, mat->recv_req); hypre_MPI_Startall(mat->num_send, mat->send_req); /* Copy local part of x into top part of recvbuf */ for (i=0; irecvbuf[i] = x[i]; hypre_MPI_Waitall(mat->num_recv, mat->recv_req, mat->statuses); /* do the multiply */ #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(row,len,ind,val,temp,i) schedule(static) #endif for (row=0; row<=mat->end_row - mat->beg_row; row++) { MatrixGetRow(mat, row, &len, &ind, &val); temp = 0.0; for (i=0; irecvbuf[ind[i]]; } y[row] = temp; } hypre_MPI_Waitall(mat->num_send, mat->send_req, mat->statuses); } void MatrixMatvecSerial(Matrix *mat, HYPRE_Real *x, HYPRE_Real *y) { HYPRE_Int row, i, len, *ind; HYPRE_Real *val, temp; HYPRE_Int num_local = mat->end_row - mat->beg_row + 1; /* Set up persistent communications */ /* Assumes MatrixComplete has been called */ /* Put components of x into the right outgoing buffers */ for (i=0; isendlen; i++) mat->sendbuf[i] = x[mat->sendind[i]]; hypre_MPI_Startall(mat->num_recv, mat->recv_req); hypre_MPI_Startall(mat->num_send, mat->send_req); /* Copy local part of x into top part of recvbuf */ for (i=0; irecvbuf[i] = x[i]; hypre_MPI_Waitall(mat->num_recv, mat->recv_req, mat->statuses); /* do the multiply */ for (row=0; row<=mat->end_row - mat->beg_row; row++) { MatrixGetRow(mat, row, &len, &ind, &val); temp = 0.0; for (i=0; irecvbuf[ind[i]]; } y[row] = temp; } hypre_MPI_Waitall(mat->num_send, mat->send_req, mat->statuses); } /*-------------------------------------------------------------------------- * MatrixMatvecTrans * Can be done in place. *--------------------------------------------------------------------------*/ void MatrixMatvecTrans(Matrix *mat, HYPRE_Real *x, HYPRE_Real *y) { HYPRE_Int row, i, len, *ind; HYPRE_Real *val; HYPRE_Int num_local = mat->end_row - mat->beg_row + 1; /* Set up persistent communications */ /* Assumes MatrixComplete has been called */ /* Post receives for local parts of the solution y */ hypre_MPI_Startall(mat->num_send, mat->recv_req2); /* initialize accumulator buffer to zero */ for (i=0; irecvlen+num_local; i++) mat->recvbuf[i] = 0.0; /* do the multiply */ for (row=0; row<=mat->end_row - mat->beg_row; row++) { MatrixGetRow(mat, row, &len, &ind, &val); for (i=0; irecvbuf[ind[i]] += val[i] * x[row]; } } /* Now can send nonlocal parts of solution to other procs */ hypre_MPI_Startall(mat->num_recv, mat->send_req2); /* copy local part of solution into y */ for (i=0; irecvbuf[i]; /* alternatively, loop over a wait any */ hypre_MPI_Waitall(mat->num_send, mat->recv_req2, mat->statuses); /* add all the incoming partial sums to y */ for (i=0; isendlen; i++) y[mat->sendind[i]] += mat->sendbuf[i]; hypre_MPI_Waitall(mat->num_recv, mat->send_req2, mat->statuses); } hypre-2.33.0/src/distributed_ls/ParaSails/Matrix.h000066400000000000000000000042611477326011500220420ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * Matrix.h header file. * *****************************************************************************/ #include #include "Common.h" #include "Mem.h" #ifndef _MATRIX_H #define _MATRIX_H #ifdef __cplusplus extern "C" { #endif typedef struct { MPI_Comm comm; HYPRE_Int beg_row; HYPRE_Int end_row; HYPRE_Int *beg_rows; HYPRE_Int *end_rows; Mem *mem; HYPRE_Int *lens; HYPRE_Int **inds; HYPRE_Real **vals; HYPRE_Int num_recv; HYPRE_Int num_send; HYPRE_Int sendlen; HYPRE_Int recvlen; HYPRE_Int *sendind; HYPRE_Real *sendbuf; HYPRE_Real *recvbuf; hypre_MPI_Request *recv_req; hypre_MPI_Request *send_req; hypre_MPI_Request *recv_req2; hypre_MPI_Request *send_req2; hypre_MPI_Status *statuses; struct numbering *numb; } Matrix; Matrix *MatrixCreate(MPI_Comm comm, HYPRE_Int beg_row, HYPRE_Int end_row); Matrix *MatrixCreateLocal(HYPRE_Int beg_row, HYPRE_Int end_row); void MatrixDestroy(Matrix *mat); void MatrixSetRow(Matrix *mat, HYPRE_Int row, HYPRE_Int len, HYPRE_Int *ind, HYPRE_Real *val); void MatrixGetRow(Matrix *mat, HYPRE_Int row, HYPRE_Int *lenp, HYPRE_Int **indp, HYPRE_Real **valp); HYPRE_Int MatrixRowPe(Matrix *mat, HYPRE_Int row); void MatrixPrint(Matrix *mat, char *filename); void MatrixRead(Matrix *mat, char *filename); void RhsRead(HYPRE_Real *rhs, Matrix *mat, char *filename); HYPRE_Int MatrixNnz(Matrix *mat); void MatrixComplete(Matrix *mat); void MatrixMatvec(Matrix *mat, HYPRE_Real *x, HYPRE_Real *y); void MatrixMatvecSerial(Matrix *mat, HYPRE_Real *x, HYPRE_Real *y); void MatrixMatvecTrans(Matrix *mat, HYPRE_Real *x, HYPRE_Real *y); #ifdef __cplusplus } #endif #endif /* _MATRIX_H */ hypre-2.33.0/src/distributed_ls/ParaSails/Mem.c000066400000000000000000000117471477326011500213160ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * Mem - Memory pool for aggregate data with unknown total size at creation. * For example, a sparse matrix may be constructed one row at a time, which * do not need to be stored contiguously in memory. MemAlloc may be called * for each row that needs to be stored, and space is allocated from the * memory pool (individual requests are not made to the operating system). * Memory from the memory pool is freed entirely at once. * * Memory is requested from the operating system in blocks of 1 Mbyte * by default. This default must be changed if requests of more than * 1 Mbyte will be made, or if large requests (e.g., 0.5 Mbytes) will * be made, in order to efficiently use the memory block. Up to 1000 * blocks can be allocated, by default, giving a total of 1 Gbyte of * memory. Actual storage will be less, and this can be determined by * a call to MemStat. * * If much less than 1 Mbyte is required or if the exact size of the * aggregate data is known, this these routines should not be used. * * Note that the size requested will be rounded up to the nearest multiple * of a pointer size, i.e., the memory is pointer size aligned. * *****************************************************************************/ #include #include "Common.h" #include "Mem.h" /*-------------------------------------------------------------------------- * MemCreate - Return (a pointer to) a memory pool object. *--------------------------------------------------------------------------*/ Mem *MemCreate(void) { Mem *m = hypre_TAlloc(Mem, 1, HYPRE_MEMORY_HOST); m->num_blocks = 0; /* number of blocks allocated */ m->bytes_left = 0; /* bytes left in current block */ m->total_bytes = 0; /* total number of bytes stored */ m->bytes_alloc = 0; /* total number of bytes allocated */ m->num_over = 0; /* number of blocks larger than blocksize */ return m; } /*-------------------------------------------------------------------------- * MemDestroy - Destroy a memory pool object "m", and release all allocated * memory to the operating system. *--------------------------------------------------------------------------*/ void MemDestroy(Mem *m) { HYPRE_Int i; /* Free all blocks of memory */ for (i=0; inum_blocks; i++) { hypre_TFree(m->blocks[i], HYPRE_MEMORY_HOST); } hypre_TFree(m, HYPRE_MEMORY_HOST); } /*-------------------------------------------------------------------------- * MemAlloc - Return "size" bytes from the memory pool "m". This function * will return to the operating system on the following conditions: * 1) max block size exceeded, 2) max number of blocks exceeded, * 3) memory exhausted. *--------------------------------------------------------------------------*/ char *MemAlloc(Mem *m, HYPRE_Int size) { HYPRE_Int req; char *p; /* Align on 16-byte boundary */ size = ((size + 15) / 16) * 16; if (m->bytes_left < size) { /* Allocate a new block */ if (m->num_blocks+1 > MEM_MAXBLOCKS) { hypre_printf("MemAlloc: max number of blocks %d exceeded.\n", MEM_MAXBLOCKS); PARASAILS_EXIT; } /* Size of requested block */ req = MAX(size, MEM_BLOCKSIZE); m->avail = hypre_TAlloc(char, req, HYPRE_MEMORY_HOST); if (m->avail == NULL) { hypre_printf("MemAlloc: request for %d bytes failed.\n", req); PARASAILS_EXIT; } m->blocks[m->num_blocks] = m->avail; m->num_blocks++; m->bytes_left = req; m->total_bytes += size; m->bytes_alloc += req; if (req > MEM_BLOCKSIZE) m->num_over++; } p = m->avail; m->avail += size; m->bytes_left -= size; m->total_bytes += size; return p; } /*-------------------------------------------------------------------------- * MemStat - Print statistics about memory pool "m" to stream "stream" with * a descriptive message "msg". *--------------------------------------------------------------------------*/ void MemStat(Mem *m, FILE *stream, char *msg) { hypre_fprintf(stream, "****** Mem: %s ******\n", msg); hypre_fprintf(stream, "num_blocks : %d\n", m->num_blocks); hypre_fprintf(stream, "num_over : %d\n", m->num_over); hypre_fprintf(stream, "total_bytes: %ld\n", m->total_bytes); hypre_fprintf(stream, "bytes_alloc: %ld\n", m->bytes_alloc); if (m->bytes_alloc != 0) hypre_fprintf(stream, "efficiency : %f\n", m->total_bytes / (HYPRE_Real) m->bytes_alloc); hypre_fprintf(stream, "*********************\n"); fflush(stream); } hypre-2.33.0/src/distributed_ls/ParaSails/Mem.h000066400000000000000000000020271477326011500213120ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * Mem.h header file. * *****************************************************************************/ #include #ifndef _MEM_H #define _MEM_H #define MEM_BLOCKSIZE (2*1024*1024) #define MEM_MAXBLOCKS 1024 typedef struct { HYPRE_Int num_blocks; HYPRE_Int bytes_left; hypre_longint total_bytes; hypre_longint bytes_alloc; HYPRE_Int num_over; char *avail; char *blocks[MEM_MAXBLOCKS]; } Mem; Mem *MemCreate(void); void MemDestroy(Mem *m); char *MemAlloc(Mem *m, HYPRE_Int size); void MemStat(Mem *m, FILE *stream, char *msg); #endif /* _MEM_H */ hypre-2.33.0/src/distributed_ls/ParaSails/Numbering.c000066400000000000000000000166631477326011500225300ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * Numbering - An object that maintains a mapping to and from global indices * and local indices. The local indices are numbered: * * 0 .. num_loc - 1 <--- locally owned indices * num_loc .. num_ind - 1 <--- external indices * * Implementation: Mapping from a local index to a global index is performed * through an array. Mapping from a global index to a local index is more * difficult. If the global index is determined to be owned by the local * processor, then a conversion is performed; else the local index is * looked up in a hash table. * *****************************************************************************/ #include //#include #include "Common.h" #include "Numbering.h" #include "OrderStat.h" /*-------------------------------------------------------------------------- * NumberingCreate - Return (a pointer to) a numbering object * for a given matrix. The "size" parameter is the initial number of * external indices that can be stored, and will grow if necessary. * (Implementation note: the hash table size is kept approximately twice * this number.) * * The numbering is created such that the local indices from a given processor * are contiguous. This is required by the mat-vec routine. *--------------------------------------------------------------------------*/ Numbering *NumberingCreate(Matrix *mat, HYPRE_Int size) { Numbering *numb = hypre_TAlloc(Numbering, 1, HYPRE_MEMORY_HOST); HYPRE_Int row, i, len, *ind; HYPRE_Real *val; HYPRE_Int num_external = 0; numb->size = size; numb->beg_row = mat->beg_row; numb->end_row = mat->end_row; numb->num_loc = mat->end_row - mat->beg_row + 1; numb->num_ind = mat->end_row - mat->beg_row + 1; numb->local_to_global = hypre_TAlloc(HYPRE_Int, (numb->num_loc+size) , HYPRE_MEMORY_HOST); numb->hash = HashCreate(2*size+1); /* Set up the local part of local_to_global */ for (i=0; inum_loc; i++) numb->local_to_global[i] = mat->beg_row + i; /* Fill local_to_global array */ for (row=0; row<=mat->end_row - mat->beg_row; row++) { MatrixGetRow(mat, row, &len, &ind, &val); for (i=0; ibeg_row || ind[i] > mat->end_row) { if (HashLookup(numb->hash, ind[i]) == HASH_NOTFOUND) { if (num_external >= numb->size) { Hash *newHash; /* allocate more space for numbering */ numb->size *= 2; numb->local_to_global = (HYPRE_Int *) hypre_TReAlloc(numb->local_to_global,HYPRE_Int, (numb->num_loc+numb->size), HYPRE_MEMORY_HOST); newHash = HashCreate(2*numb->size+1); HashRehash(numb->hash, newHash); HashDestroy(numb->hash); numb->hash = newHash; } HashInsert(numb->hash, ind[i], num_external); numb->local_to_global[numb->num_loc+num_external] = ind[i]; num_external++; } } } } /* Sort the indices */ hypre_shell_sort(num_external, &numb->local_to_global[numb->num_loc]); /* Redo the hash table for the sorted indices */ HashReset(numb->hash); for (i=0; ihash, numb->local_to_global[i+numb->num_loc], i+numb->num_loc); numb->num_ind += num_external; return numb; } /*-------------------------------------------------------------------------- * NumberingCreateCopy - Create a new numbering object, and take as initial * contents the "orig" numbering object. *--------------------------------------------------------------------------*/ Numbering *NumberingCreateCopy(Numbering *orig) { Numbering *numb = hypre_TAlloc(Numbering, 1, HYPRE_MEMORY_HOST); numb->size = orig->size; numb->beg_row = orig->beg_row; numb->end_row = orig->end_row; numb->num_loc = orig->num_loc; numb->num_ind = orig->num_ind; numb->local_to_global = hypre_TAlloc(HYPRE_Int, (numb->num_loc+numb->size) , HYPRE_MEMORY_HOST); hypre_TMemcpy(numb->local_to_global, orig->local_to_global, HYPRE_Int, numb->num_ind, HYPRE_MEMORY_HOST, HYPRE_MEMORY_HOST); numb->hash = HashCreate(2*numb->size+1); HashRehash(orig->hash, numb->hash); return numb; } /*-------------------------------------------------------------------------- * NumberingDestroy - Destroy a numbering object. *--------------------------------------------------------------------------*/ void NumberingDestroy(Numbering *numb) { hypre_TFree(numb->local_to_global,HYPRE_MEMORY_HOST); HashDestroy(numb->hash); hypre_TFree(numb,HYPRE_MEMORY_HOST); } /*-------------------------------------------------------------------------- * NumberingLocalToGlobal - Convert an array of indices to global coordinate * numbering. May be done in place. *--------------------------------------------------------------------------*/ void NumberingLocalToGlobal(Numbering *numb, HYPRE_Int len, HYPRE_Int *local, HYPRE_Int *global) { HYPRE_Int i; for (i=0; ilocal_to_global[local[i]]; } /*-------------------------------------------------------------------------- * NumberingGlobalToLocal - Convert an array of indices to local coordinate * numbering. If the global coordinate number does not exist, it is added * to the numbering object. May be done in place. *--------------------------------------------------------------------------*/ void NumberingGlobalToLocal(Numbering *numb, HYPRE_Int len, HYPRE_Int *global, HYPRE_Int *local) { HYPRE_Int i, l; for (i=0; ibeg_row || global[i] > numb->end_row) { l = HashLookup(numb->hash, global[i]); if (l == HASH_NOTFOUND) { if (numb->num_ind >= numb->num_loc + numb->size) { Hash *newHash; /* allocate more space for numbering */ numb->size *= 2; #ifdef PARASAILS_DEBUG hypre_printf("Numbering resize %d\n", numb->size); #endif numb->local_to_global = hypre_TReAlloc(numb->local_to_global, HYPRE_Int, numb->num_loc + numb->size, HYPRE_MEMORY_HOST); newHash = HashCreate(2*numb->size+1); HashRehash(numb->hash, newHash); HashDestroy(numb->hash); numb->hash = newHash; } HashInsert(numb->hash, global[i], numb->num_ind); numb->local_to_global[numb->num_ind] = global[i]; local[i] = numb->num_ind; numb->num_ind++; } else { local[i] = l; } } else { local[i] = global[i] - numb->beg_row; } } } hypre-2.33.0/src/distributed_ls/ParaSails/Numbering.h000066400000000000000000000025451477326011500225270ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * Numbering.h header file. * *****************************************************************************/ #include #include "Common.h" #include "Matrix.h" #include "Hash.h" #ifndef _NUMBERING_H #define _NUMBERING_H struct numbering { HYPRE_Int size; /* max number of indices that can be stored */ HYPRE_Int beg_row; HYPRE_Int end_row; HYPRE_Int num_loc; /* number of local indices */ HYPRE_Int num_ind; /* number of indices */ HYPRE_Int *local_to_global; Hash *hash; }; typedef struct numbering Numbering; Numbering *NumberingCreate(Matrix *m, HYPRE_Int size); Numbering *NumberingCreateCopy(Numbering *orig); void NumberingDestroy(Numbering *numb); void NumberingLocalToGlobal(Numbering *numb, HYPRE_Int len, HYPRE_Int *local, HYPRE_Int *global); void NumberingGlobalToLocal(Numbering *numb, HYPRE_Int len, HYPRE_Int *global, HYPRE_Int *local); #endif /* _NUMBERING_H */ hypre-2.33.0/src/distributed_ls/ParaSails/OrderStat.c000066400000000000000000000067001477326011500225000ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * OrderStat - Utility functions for selecting the i-th order statistic, * i.e., the i-th smallest element in a list of n elements. There is one * user function in this file: randomized_select(a, p, r, i), which * selects the i-th order statistic from the HYPRE_Real precision array a[p:r]. The contents of the array are altered by the function. * * Reference: Cormen, Leiserson, Rivest, Introduction to Algorithms, p. 187. * *****************************************************************************/ #include #include "OrderStat.h" /*-------------------------------------------------------------------------- * partition - Return q such that a[p:q] has no element greater than * elements in a[q+1:r]. *--------------------------------------------------------------------------*/ static HYPRE_Int partition(HYPRE_Real *a, HYPRE_Int p, HYPRE_Int r) { HYPRE_Real x, temp; HYPRE_Int i, j; x = a[p]; i = p - 1; j = r + 1; while (1) { do j--; while (a[j] > x); do i++; while (a[i] < x); if (i < j) { temp = a[i]; a[i] = a[j]; a[j] = temp; } else return j; } } /*-------------------------------------------------------------------------- * randomized_partition - Randomizies the partitioning function by selecting * a random pivot element. *--------------------------------------------------------------------------*/ static HYPRE_Int randomized_partition(HYPRE_Real *a, HYPRE_Int p, HYPRE_Int r) { HYPRE_Real temp; HYPRE_Int i; /* select a random number in [p,r] */ i = p + (rand() % (r-p+1)); temp = a[i]; a[i] = a[p]; a[p] = temp; return partition(a, p, r); } /*-------------------------------------------------------------------------- * randomized_select - Return the i-th smallest element of the HYPRE_Real * precision array a[p:r]. The contents of the array are altered on return. * "i" should range from 1 to r-p+1. *--------------------------------------------------------------------------*/ HYPRE_Real randomized_select(HYPRE_Real *a, HYPRE_Int p, HYPRE_Int r, HYPRE_Int i) { HYPRE_Int q, k; if (p == r) return a[p]; q = randomized_partition(a, p, r); /* number of elements in the first list */ k = q - p + 1; if (i <= k) return randomized_select(a, p, q, i); else return randomized_select(a, q+1, r, i-k); } /*-------------------------------------------------------------------------- * hypre_shell_sort - sorts x[0:n-1] in place, ascending order *--------------------------------------------------------------------------*/ void hypre_shell_sort(const HYPRE_Int n, HYPRE_Int x[]) { HYPRE_Int m, max, j, k, itemp; m = n/2; while (m > 0) { max = n - m; for (j=0; j=0; k-=m) { if (x[k+m] >= x[k]) break; itemp = x[k+m]; x[k+m] = x[k]; x[k] = itemp; } } m = m/2; } } hypre-2.33.0/src/distributed_ls/ParaSails/OrderStat.h000066400000000000000000000014371477326011500225070ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * OrderStat.h header file. * *****************************************************************************/ #ifndef _ORDERSTAT_H #define _ORDERSTAT_H #include "_hypre_utilities.h" HYPRE_Real randomized_select(HYPRE_Real *a, HYPRE_Int p, HYPRE_Int r, HYPRE_Int i); void hypre_shell_sort(const HYPRE_Int n, HYPRE_Int x[]); #endif /* _ORDERSTAT_H */ hypre-2.33.0/src/distributed_ls/ParaSails/ParaSails.c000066400000000000000000002036131477326011500224520ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * ParaSails - Parallel sparse approximate inverse least squares. * *****************************************************************************/ #include "HYPRE_config.h" #include #include #include #include "Common.h" #include "Matrix.h" #include "Numbering.h" #include "RowPatt.h" #include "StoredRows.h" #include "PrunedRows.h" #include "OrderStat.h" #include "LoadBal.h" #include "ParaSails.h" #include "_hypre_lapack.h" #define ROW_PRUNED_REQ_TAG 221 #define ROW_STORED_REQ_TAG 222 #define ROW_REPI_TAG 223 #define ROW_REPV_TAG 224 #ifdef ESSL #include #endif #if 0 /* no longer need this since using 'memset' now */ #ifdef WIN32 static void bzero(char *a, HYPRE_Int n) {HYPRE_Int i; for (i=0; ibeg_rows[this_pe] || reqind[j] > mat->end_rows[this_pe]) break; } /* Request rows in reqind[i..j-1] */ hypre_MPI_Isend(&reqind[i], j-i, HYPRE_MPI_INT, this_pe, tag, comm, &request); hypre_MPI_Request_free(&request); (*num_requests)++; if (replies_list != NULL) replies_list[this_pe] = 1; } } /*-------------------------------------------------------------------------- * ReceiveRequest - Receive a request sent with SendRequests by another * processor. This function should be placed inside a loop which is * executed once for every request that this processor expects to receive. * This is the number of requests this processor made in SendRequests * in the symmetric case. * * comm - MPI communicator (input) * source - number of the processor that sent the message (output) * buffer - buffer provided by the user. On output, it contains a * list of indices. Buffer will be reallocated if too small * (input/output) * buflen - size of the buffer (input). Size will be updated if buffer * is too small (input/output) * count - number of indices in the output buffer (output) *--------------------------------------------------------------------------*/ static void ReceiveRequest(MPI_Comm comm, HYPRE_Int *source, HYPRE_Int tag, HYPRE_Int **buffer, HYPRE_Int *buflen, HYPRE_Int *count) { hypre_MPI_Status status; hypre_MPI_Probe(hypre_MPI_ANY_SOURCE, tag, comm, &status); *source = status.hypre_MPI_SOURCE; hypre_MPI_Get_count(&status, HYPRE_MPI_INT, count); if (*count > *buflen) { hypre_TFree(*buffer,HYPRE_MEMORY_HOST); *buflen = *count; *buffer = hypre_TAlloc(HYPRE_Int, *buflen , HYPRE_MEMORY_HOST); } hypre_MPI_Recv(*buffer, *count, HYPRE_MPI_INT, *source, tag, comm, &status); } /*-------------------------------------------------------------------------- * SendReplyPrunedRows - Send a reply of pruned rows for each request * received by this processor using ReceiveRequest. * * comm - MPI communicator (input) * dest - pe to send to (input) * buffer - list of indices (input) * count - number of indices in buffer (input) * pruned_rows - the pruned_rows object where the pruned rows reside (input) * mem - pointer to memory object used for reply buffers (input) * request - request handle of send (output) * * The function allocates space for each send buffer using "mem", and the * caller must free this space when all the sends have completed.. * * The reply has the following structure for the integer data in indbuf: * num_rows, index_1, ..., index_n, len_1, row_1_indices, len_2, indices, ... *--------------------------------------------------------------------------*/ static void SendReplyPrunedRows(MPI_Comm comm, Numbering *numb, HYPRE_Int dest, HYPRE_Int *buffer, HYPRE_Int count, PrunedRows *pruned_rows, Mem *mem, hypre_MPI_Request *request) { HYPRE_Int sendbacksize, j; HYPRE_Int len, *ind, *indbuf, *indbufp; HYPRE_Int temp; /* Determine the size of the integer message we need to send back */ sendbacksize = count+1; /* length of header part */ for (j=0; jnum_loc); ind += len; } } /*-------------------------------------------------------------------------- * SendReplyStoredRows - Send a reply of stored rows for each request * received by this processor using ReceiveRequest. * * comm - MPI communicator (input) * dest - pe to send to (input) * buffer - list of indices (input) * count - number of indices in buffer (input) * stored_rows - the stored_rows object where the rows reside (input) * mem - pointer to memory object used for reply buffers (input) * request - request handle of send (output) * * The function allocates space for each send buffer using "mem", and the * caller must free this space when all the sends have completed.. * * The reply has the following structure for the integer data in indbuf: * num_rows, index_1, ..., index_n, len_1, row_1_indices, len_2, indices, ... * * The reply has the following structure for the value data: * row_1_values, row_2_values, ... *--------------------------------------------------------------------------*/ static void SendReplyStoredRows(MPI_Comm comm, Numbering *numb, HYPRE_Int dest, HYPRE_Int *buffer, HYPRE_Int count, StoredRows *stored_rows, Mem *mem, hypre_MPI_Request *request) { HYPRE_Int sendbacksize, j; HYPRE_Int len, *ind, *indbuf, *indbufp; HYPRE_Real *val, *valbuf, *valbufp; HYPRE_Int temp; /* Determine the size of the integer message we need to send back */ sendbacksize = count+1; /* length of header part */ for (j=0; jend_row - M->beg_row; row++) { PrunedRowsGet(pruned_rows, row, &len, &ind); RowPattMergeExt(patt, len, ind, numb->num_loc); } /* Loop to construct pattern of pruned rows on this processor */ bufferlen = 10; /* size will grow if get a long msg */ buffer = hypre_TAlloc(HYPRE_Int, bufferlen , HYPRE_MEMORY_HOST); for (level=1; level<=num_levels; level++) { mem = (Mem *) MemCreate(); /* Get list of indices that were just merged */ RowPattPrevLevel(patt, &len, &ind); /* Convert local row numbers to global row numbers */ NumberingLocalToGlobal(numb, len, ind, ind); replies_list = hypre_CTAlloc(HYPRE_Int, npes, HYPRE_MEMORY_HOST); SendRequests(comm, ROW_PRUNED_REQ_TAG, M, len, ind, &num_requests, replies_list); num_replies = FindNumReplies(comm, replies_list); hypre_TFree(replies_list,HYPRE_MEMORY_HOST); for (i=0; iend_row - M->beg_row; row++) { PrunedRowsGet(pruned_rows_global, row, &len, &ind); RowPattMergeExt(patt, len, ind, numb->num_loc); } /* Loop to construct pattern of pruned rows on this processor */ bufferlen = 10; /* size will grow if get a long msg */ buffer = hypre_TAlloc(HYPRE_Int, bufferlen , HYPRE_MEMORY_HOST); for (level=0; level<=num_levels; level++) /* MUST DO THIS AT LEAST ONCE */ { mem = (Mem *) MemCreate(); /* Get list of indices that were just merged */ RowPattPrevLevel(patt, &len, &ind); /* Convert local row numbers to global row numbers */ NumberingLocalToGlobal(numb, len, ind, ind); replies_list = hypre_CTAlloc(HYPRE_Int, npes, HYPRE_MEMORY_HOST); SendRequests(comm, ROW_PRUNED_REQ_TAG, M, len, ind, &num_requests, replies_list); num_replies = FindNumReplies(comm, replies_list); hypre_TFree(replies_list,HYPRE_MEMORY_HOST); for (i=0; iend_row - M->beg_row; row++) { PrunedRowsGet(pruned_rows_local, row, &len, &ind); RowPattMergeExt(patt, len, ind, numb->num_loc); } /* Compute powers with local matrix - no communication is needed */ for (level=1; level<=num_levels; level++) { HYPRE_Int lenprev, *indprev; /* Get the indices that were just added */ RowPattPrevLevel(patt, &lenprev, &indprev); for (i=0; inum_loc); } } /* Now get rows from pruned_rows_global */ bufferlen = 10; /* size will grow if get a long msg */ buffer = hypre_TAlloc(HYPRE_Int, bufferlen , HYPRE_MEMORY_HOST); /* DO THIS ONCE */ { mem = (Mem *) MemCreate(); /* Get list of indices - these are all nonlocal indices */ RowPattGet(patt, &len, &ind); /* Convert local row numbers to global row numbers */ NumberingLocalToGlobal(numb, len, ind, ind); replies_list = hypre_CTAlloc(HYPRE_Int, npes, HYPRE_MEMORY_HOST); SendRequests(comm, ROW_PRUNED_REQ_TAG, M, len, ind, &num_requests, replies_list); num_replies = FindNumReplies(comm, replies_list); hypre_TFree(replies_list,HYPRE_MEMORY_HOST); for (i=0; ibeg_row; row<=M->end_row; row++) */ /* We need the additional rows if we need to Rescale */ /* i.e., if filter is nonzero and we are in symmetric case */ for (row=M->beg_row; row<=M->end_row; row++) { MatrixGetRow(M, row - M->beg_row, &len, &ind, &val); RowPattMergeExt(patt, len, ind, numb->num_loc); } /* Merge patterns for load balancing recipient rows */ for (i=0; inum_taken; i++) { for (row=0; row <= load_bal->recip_data[i].mat->end_row - load_bal->recip_data[i].mat->beg_row; row++) { MatrixGetRow(load_bal->recip_data[i].mat, row, &len, &ind, &val); RowPattMergeExt(patt, len, ind, numb->num_loc); } } RowPattGet(patt, &len, &ind); /* Convert local row numbers to global row numbers */ NumberingLocalToGlobal(numb, len, ind, ind); replies_list = hypre_CTAlloc(HYPRE_Int, npes, HYPRE_MEMORY_HOST); SendRequests(comm, ROW_STORED_REQ_TAG, A, len, ind, &num_requests, replies_list); num_replies = FindNumReplies(comm, replies_list); hypre_TFree(replies_list,HYPRE_MEMORY_HOST); if (num_replies) { requests = hypre_TAlloc(hypre_MPI_Request, num_replies , HYPRE_MEMORY_HOST); statuses = hypre_TAlloc(hypre_MPI_Status, num_replies , HYPRE_MEMORY_HOST); } bufferlen = 10; /* size will grow if get a long msg */ buffer = hypre_TAlloc(HYPRE_Int, bufferlen , HYPRE_MEMORY_HOST); for (i=0; icomm, &npes); *costp = 0.0; row_patt = RowPattCreate(PARASAILS_MAXLEN); for (row=0; row<=M->end_row - M->beg_row; row++) { /* Get initial pattern for row */ PrunedRowsGet(pruned_rows, row, &len, &ind); RowPattMerge(row_patt, len, ind); /* Loop */ for (level=1; level<=num_levels; level++) { /* Get the indices that were just added */ RowPattPrevLevel(row_patt, &lenprev, &indprev); for (i=0; ilocal_to_global[ind[i]] <= numb->local_to_global[row]) ind[j++] = ind[i]; } len = j; } /* Store structure of row in matrix M */ /* Following statement allocates space but does not store values */ MatrixSetRow(M, row+M->beg_row, len, ind, NULL); (*costp) += (HYPRE_Real) len*len*len; #ifdef PARASAILS_DEBUG nnz += len; #endif } #ifdef PARASAILS_DEBUG { HYPRE_Int mype; hypre_MPI_Comm_rank(hypre_MPI_COMM_WORLD, &mype); hypre_printf("%d: nnz: %10d ********* cost %7.1e\n", mype, nnz, *costp); fflush(stdout); } #endif RowPattDestroy(row_patt); } /*-------------------------------------------------------------------------- * ConstructPatternForEachRowExt - extended version * * pruned_rows - pruned rows, used for constructing row patterns (input) * num_levels - number of levels in pattern (input) * M - matrix where the row patterns will be stored (input/output). * This is the approximate inverse with lower triangular pattern *--------------------------------------------------------------------------*/ static void ConstructPatternForEachRowExt(HYPRE_Int symmetric, PrunedRows *pruned_rows_global, PrunedRows *pruned_rows_local, HYPRE_Int num_levels, Numbering *numb, Matrix *M, HYPRE_Real *costp) { HYPRE_Int row, len, *ind, level, lenprev, *indprev; HYPRE_Int i, j; RowPatt *row_patt; RowPatt *row_patt2; HYPRE_Int npes; #ifdef PARASAILS_DEBUG HYPRE_Int nnz = 0; #endif hypre_MPI_Comm_size(M->comm, &npes); *costp = 0.0; row_patt = RowPattCreate(PARASAILS_MAXLEN); row_patt2 = RowPattCreate(PARASAILS_MAXLEN); for (row=0; row<=M->end_row - M->beg_row; row++) { /* Get initial pattern for row */ PrunedRowsGet(pruned_rows_global, row, &len, &ind); RowPattMerge(row_patt, len, ind); /* Loop */ for (level=0; level<=num_levels; level++) /* at least once */ { /* Get the indices that were just added */ RowPattPrevLevel(row_patt, &lenprev, &indprev); for (i=0; ilocal_to_global[ind[i]] <= numb->local_to_global[row]) ind[j++] = ind[i]; } len = j; } /* Store structure of row in matrix M */ /* Following statement allocates space but does not store values */ MatrixSetRow(M, row+M->beg_row, len, ind, NULL); (*costp) += (HYPRE_Real) len*len*len; #ifdef PARASAILS_DEBUG nnz += len; #endif } #ifdef PARASAILS_DEBUG { HYPRE_Int mype; hypre_MPI_Comm_rank(hypre_MPI_COMM_WORLD, &mype); hypre_printf("%d: nnz: %10d ********* cost %7.1e\n", mype, nnz, *costp); fflush(stdout); } #endif RowPattDestroy(row_patt); RowPattDestroy(row_patt2); } /*-------------------------------------------------------------------------- * ComputeValuesSym *--------------------------------------------------------------------------*/ static HYPRE_Int ComputeValuesSym(StoredRows *stored_rows, Matrix *mat, HYPRE_Int local_beg_row, Numbering *numb, HYPRE_Int symmetric) { HYPRE_Int *marker; HYPRE_Int row, maxlen, len, *ind; HYPRE_Real *val; HYPRE_Real *ahat, *ahatp; HYPRE_Int i, j, len2, *ind2, loc; HYPRE_Real *val2, temp; HYPRE_Int error = 0; #ifdef PARASAILS_DEBUG HYPRE_Real time0, time1; HYPRE_Real timet = 0.0, timea = 0.0; HYPRE_Real ahatcost = 0.0; #endif #ifndef ESSL char uplo = 'L'; HYPRE_Int one = 1; HYPRE_Int info; #endif /* Allocate and initialize full length marker array */ marker = hypre_TAlloc(HYPRE_Int, numb->num_ind , HYPRE_MEMORY_HOST); for (i=0; inum_ind; i++) marker[i] = -1; /* Determine the length of the longest row of M on this processor */ /* This determines the maximum storage required for the ahat matrix */ maxlen = 0; for (row=local_beg_row; row<=mat->end_row; row++) { MatrixGetRow(mat, row - mat->beg_row, &len, &ind, &val); maxlen = (len > maxlen ? len : maxlen); } #ifdef ESSL ahat = hypre_TAlloc(HYPRE_Real, maxlen*(maxlen+1)/2 , HYPRE_MEMORY_HOST); #else ahat = hypre_TAlloc(HYPRE_Real, maxlen*maxlen , HYPRE_MEMORY_HOST); #endif /* Compute values for row "row" of approximate inverse */ for (row=local_beg_row; row<=mat->end_row; row++) { /* Retrieve local indices */ MatrixGetRow(mat, row - mat->beg_row, &len, &ind, &val); /* Fill marker array in locations of local indices */ for (i=0; i 0); #ifdef ESSL for (j=0; j= i) ahatp[loc - i] = val2[j]; } ahatp += (len-i); #else for (j=0; jend_row-local_beg_row+1, maxlen); fflush(stdout); } #endif return error; } /*-------------------------------------------------------------------------- * ComputeValuesNonsym *--------------------------------------------------------------------------*/ static HYPRE_Int ComputeValuesNonsym(StoredRows *stored_rows, Matrix *mat, HYPRE_Int local_beg_row, Numbering *numb) { HYPRE_Int *marker; HYPRE_Real *ahat, *ahatp, *bhat; HYPRE_Real *work; HYPRE_Int ahat_size = 10000, bhat_size = 1000, work_size = 2000*64; HYPRE_Int row, len, *ind; HYPRE_Real *val; HYPRE_Int i, j, len2, *ind2, loc; HYPRE_Real *val2; #ifdef PARASAILS_DEBUG HYPRE_Real time0, time1; HYPRE_Real timet = 0.0, timea = 0.0; #endif HYPRE_Int npat; HYPRE_Int pattsize = 1000; HYPRE_Int *patt = hypre_TAlloc(HYPRE_Int, pattsize, HYPRE_MEMORY_HOST); HYPRE_Int info; HYPRE_Int error = 0; #ifndef ESSL char trans = 'N'; HYPRE_Int one = 1; #endif /* Allocate and initialize marker array */ /* Since numb already knows about the indices of the external rows that will be needed, numb_ind is the maximum size of the marker array */ marker = hypre_TAlloc(HYPRE_Int, numb->num_ind , HYPRE_MEMORY_HOST); for (i=0; inum_ind; i++) marker[i] = -1; bhat = hypre_TAlloc(HYPRE_Real, bhat_size , HYPRE_MEMORY_HOST); ahat = hypre_TAlloc(HYPRE_Real, ahat_size , HYPRE_MEMORY_HOST); work = hypre_CTAlloc(HYPRE_Real, work_size, HYPRE_MEMORY_HOST); /* Compute values for row "row" of approximate inverse */ for (row=local_beg_row; row<=mat->end_row; row++) { #ifdef PARASAILS_DEBUG time0 = hypre_MPI_Wtime(); #endif /* Retrieve local indices */ MatrixGetRow(mat, row - mat->beg_row, &len, &ind, &val); npat = 0; /* Put the diagonal entry into the marker array */ NumberingGlobalToLocal(numb, 1, &row, &loc); marker[loc] = npat; patt[npat++] = loc; /* Fill marker array */ for (i=0; i 0); for (j=0; j= pattsize) { pattsize = npat*2; patt = hypre_TReAlloc(patt,HYPRE_Int, pattsize, HYPRE_MEMORY_HOST); } patt[npat++] = ind2[j]; } } } if (len*npat > ahat_size) { hypre_TFree(ahat,HYPRE_MEMORY_HOST); ahat_size = len*npat; ahat = hypre_TAlloc(HYPRE_Real, ahat_size , HYPRE_MEMORY_HOST); } /* Initialize ahat to zero */ /* bzero((char *) ahat, len*npat * sizeof(HYPRE_Real));*/ memset(ahat, 0, len*npat * sizeof(HYPRE_Real)); /* Form ahat matrix, entries correspond to indices in "ind" only */ ahatp = ahat; for (i=0; i bhat_size) { hypre_TFree(bhat,HYPRE_MEMORY_HOST); bhat_size = npat; bhat = hypre_TAlloc(HYPRE_Real, bhat_size , HYPRE_MEMORY_HOST); } /* Set the right-hand side, bhat */ /* bzero((char *) bhat, npat*sizeof(HYPRE_Real));*/ memset(bhat, 0, npat*sizeof(HYPRE_Real)); NumberingGlobalToLocal(numb, 1, &row, &loc); loc = marker[loc]; hypre_assert(loc != -1); bhat[loc] = 1.0; /* Reset marker array */ for (i=0; iend_row - A->beg_row; row++) { MatrixGetRow(A, row, &len, &ind, &val); if (len > buflen) { hypre_TFree(buffer,HYPRE_MEMORY_HOST); buflen = len; buffer = hypre_TAlloc(HYPRE_Real, buflen , HYPRE_MEMORY_HOST); } /* Copy the scaled absolute values into a work buffer */ temp = DiagScaleGet(diag_scale, row); for (i=0; iend_rows[npes-1] - A->beg_rows[0] + 1); } /*-------------------------------------------------------------------------- * SelectFilter - Similar to SelectThresh, but on the preconditioner. * Assumes matrix is in local indexing. *--------------------------------------------------------------------------*/ static HYPRE_Real SelectFilter(MPI_Comm comm, Matrix *M, DiagScale *diag_scale, HYPRE_Real param, HYPRE_Int symmetric) { HYPRE_Int row, len, *ind, i, npes; HYPRE_Real *val; HYPRE_Real localsum = 0.0, sum; HYPRE_Real temp = 1.0; /* Buffer for storing the values in each row when computing the i-th smallest element - buffer will grow if necessary */ HYPRE_Real *buffer; HYPRE_Int buflen = 10; buffer = hypre_TAlloc(HYPRE_Real, buflen , HYPRE_MEMORY_HOST); for (row=0; row<=M->end_row - M->beg_row; row++) { MatrixGetRow(M, row, &len, &ind, &val); if (len > buflen) { hypre_TFree(buffer,HYPRE_MEMORY_HOST); buflen = len; buffer = hypre_TAlloc(HYPRE_Real, buflen , HYPRE_MEMORY_HOST); } if (symmetric == 0) temp = 1. / DiagScaleGet(diag_scale, row); /* Copy the scaled absolute values into a work buffer */ for (i=0; iend_rows[npes-1] - M->beg_rows[0] + 1); } /*-------------------------------------------------------------------------- * FilterValues - Filter the values in a preconditioner matrix. * M - original matrix, in local ordering * F - new matrix, that has been created already * Also, return the cost estimate, in case SetupValues is called again * with load balancing - the old cost estimate would be incorrect. *--------------------------------------------------------------------------*/ static void FilterValues(Matrix *M, Matrix *F, DiagScale *diag_scale, HYPRE_Real filter, HYPRE_Int symmetric, HYPRE_Real *newcostp) { HYPRE_Int i, j; HYPRE_Int row, len, *ind; HYPRE_Real *val, temp = 1.0; HYPRE_Real cost = 0.0; for (row=0; row<=M->end_row - M->beg_row; row++) { MatrixGetRow(M, row, &len, &ind, &val); j = 0; for (i=0; i= filter || row == ind[i]) { val[j] = val[i]; ind[j] = ind[i]; j++; } } MatrixSetRow(F, row+F->beg_row, j, ind, val); cost += (HYPRE_Real) j*j*j; } *newcostp = cost; } /*-------------------------------------------------------------------------- * Rescale - Rescaling to be used after filtering, in symmetric case. *--------------------------------------------------------------------------*/ static void Rescale(Matrix *M, StoredRows *stored_rows, HYPRE_Int num_ind) { HYPRE_Int len, *ind, len2, *ind2; HYPRE_Real *val, *val2, *w; HYPRE_Int row, j, i; HYPRE_Real accum, prod; /* Allocate full-length workspace */ w = hypre_CTAlloc(HYPRE_Real, num_ind, HYPRE_MEMORY_HOST); /* Loop over rows */ for (row=0; row<=M->end_row - M->beg_row; row++) { MatrixGetRow(M, row, &len, &ind, &val); accum = 0.0; /* Loop over nonzeros in row */ for (j=0; jsymmetric = sym; ps->thresh = 0.1; ps->num_levels = 1; ps->filter = 0.0; ps->loadbal_beta = 0.0; ps->cost = 0.0; ps->setup_pattern_time = 0.0; ps->setup_values_time = 0.0; ps->numb = NULL; ps->M = NULL; ps->comm = comm; ps->beg_row = beg_row; ps->end_row = end_row; hypre_MPI_Comm_size(comm, &npes); ps->beg_rows = hypre_TAlloc(HYPRE_Int, npes , HYPRE_MEMORY_HOST); ps->end_rows = hypre_TAlloc(HYPRE_Int, npes , HYPRE_MEMORY_HOST); hypre_MPI_Allgather(&beg_row, 1, HYPRE_MPI_INT, ps->beg_rows, 1, HYPRE_MPI_INT, comm); hypre_MPI_Allgather(&end_row, 1, HYPRE_MPI_INT, ps->end_rows, 1, HYPRE_MPI_INT, comm); return ps; } /*-------------------------------------------------------------------------- * ParaSailsDestroy - Deallocate a ParaSails data structure. *--------------------------------------------------------------------------*/ void ParaSailsDestroy(ParaSails *ps) { if (ps == NULL) return; if (ps->numb) NumberingDestroy(ps->numb); if (ps->M) MatrixDestroy(ps->M); hypre_TFree(ps->beg_rows,HYPRE_MEMORY_HOST); hypre_TFree(ps->end_rows,HYPRE_MEMORY_HOST); hypre_TFree(ps,HYPRE_MEMORY_HOST); } /*-------------------------------------------------------------------------- * ParaSailsSetupPattern - Set up a pattern for the ParaSails preconditioner. *--------------------------------------------------------------------------*/ void ParaSailsSetupPattern(ParaSails *ps, Matrix *A, HYPRE_Real thresh, HYPRE_Int num_levels) { DiagScale *diag_scale; PrunedRows *pruned_rows; HYPRE_Real time0, time1; time0 = hypre_MPI_Wtime(); ps->thresh = thresh; ps->num_levels = num_levels; if (ps->numb) NumberingDestroy(ps->numb); ps->numb = NumberingCreateCopy(A->numb); if (ps->M) MatrixDestroy(ps->M); ps->M = MatrixCreate(ps->comm, ps->beg_row, ps->end_row); diag_scale = DiagScaleCreate(A, A->numb); if (ps->thresh < 0.0) ps->thresh = SelectThresh(ps->comm, A, diag_scale, -ps->thresh); pruned_rows = PrunedRowsCreate(A, PARASAILS_NROWS, diag_scale, ps->thresh); ExchangePrunedRows(ps->comm, A, ps->numb, pruned_rows, ps->num_levels); ConstructPatternForEachRow(ps->symmetric, pruned_rows, ps->num_levels, ps->numb, ps->M, &ps->cost); DiagScaleDestroy(diag_scale); PrunedRowsDestroy(pruned_rows); time1 = hypre_MPI_Wtime(); ps->setup_pattern_time = time1 - time0; } /*-------------------------------------------------------------------------- * ParaSailsSetupPatternExt - Set up a pattern for the ParaSails preconditioner. * Extended version. *--------------------------------------------------------------------------*/ void ParaSailsSetupPatternExt(ParaSails *ps, Matrix *A, HYPRE_Real thresh_global, HYPRE_Real thresh_local, HYPRE_Int num_levels) { DiagScale *diag_scale; PrunedRows *pruned_rows_global; PrunedRows *pruned_rows_local; HYPRE_Real time0, time1; time0 = hypre_MPI_Wtime(); ps->thresh = thresh_global*1000000.+thresh_local; /* dummy */ ps->num_levels = num_levels; if (ps->numb) NumberingDestroy(ps->numb); ps->numb = NumberingCreateCopy(A->numb); if (ps->M) MatrixDestroy(ps->M); ps->M = MatrixCreate(ps->comm, ps->beg_row, ps->end_row); diag_scale = DiagScaleCreate(A, A->numb); if (ps->thresh < 0.0) ps->thresh = SelectThresh(ps->comm, A, diag_scale, -ps->thresh); pruned_rows_global = PrunedRowsCreate(A, PARASAILS_NROWS, diag_scale, thresh_global); pruned_rows_local = PrunedRowsCreate(A, PARASAILS_NROWS, diag_scale, thresh_local); ExchangePrunedRowsExt(ps->comm, A, ps->numb, pruned_rows_global, pruned_rows_local, ps->num_levels); ExchangePrunedRowsExt2(ps->comm, A, ps->numb, pruned_rows_global, pruned_rows_local, ps->num_levels); ConstructPatternForEachRowExt(ps->symmetric, pruned_rows_global, pruned_rows_local, ps->num_levels, ps->numb, ps->M, &ps->cost); DiagScaleDestroy(diag_scale); PrunedRowsDestroy(pruned_rows_global); PrunedRowsDestroy(pruned_rows_local); time1 = hypre_MPI_Wtime(); ps->setup_pattern_time = time1 - time0; } /*-------------------------------------------------------------------------- * ParaSailsSetupValues - Compute the numerical values of the ParaSails * preconditioner, for the pattern set up using ParaSailsSetupPattern. * This function may be called repeatedly with different input matrices * "A", for which a preconditioner is constructed. *--------------------------------------------------------------------------*/ HYPRE_Int ParaSailsSetupValues(ParaSails *ps, Matrix *A, HYPRE_Real filter) { LoadBal *load_bal; StoredRows *stored_rows; HYPRE_Int row, len, *ind; HYPRE_Real *val; HYPRE_Int i; HYPRE_Real time0, time1; MPI_Comm comm = ps->comm; HYPRE_Int error = 0, error_sum; time0 = hypre_MPI_Wtime(); /* * If the preconditioner matrix has its own numbering object, then we * assume it is in its own local numbering, and we change the numbering * in the matrix to the ParaSails numbering. */ if (ps->M->numb != NULL) { /* Make a new numbering object in case pattern of A has changed */ if (ps->numb) NumberingDestroy(ps->numb); ps->numb = NumberingCreateCopy(A->numb); for (row=0; row<=ps->M->end_row - ps->M->beg_row; row++) { MatrixGetRow(ps->M, row, &len, &ind, &val); NumberingLocalToGlobal(ps->M->numb, len, ind, ind); NumberingGlobalToLocal(ps->numb, len, ind, ind); } } load_bal = LoadBalDonate(ps->comm, ps->M, ps->numb, ps->cost, ps->loadbal_beta); stored_rows = StoredRowsCreate(A, PARASAILS_NROWS); ExchangeStoredRows(ps->comm, A, ps->M, ps->numb, stored_rows, load_bal); if (ps->symmetric) { error += ComputeValuesSym(stored_rows, ps->M, load_bal->beg_row, ps->numb, ps->symmetric); for (i=0; inum_taken; i++) { error += ComputeValuesSym(stored_rows, load_bal->recip_data[i].mat, load_bal->recip_data[i].mat->beg_row, ps->numb, ps->symmetric); } } else { error += ComputeValuesNonsym(stored_rows, ps->M, load_bal->beg_row, ps->numb); for (i=0; inum_taken; i++) { error += ComputeValuesNonsym(stored_rows, load_bal->recip_data[i].mat, load_bal->recip_data[i].mat->beg_row, ps->numb); } } time1 = hypre_MPI_Wtime(); ps->setup_values_time = time1 - time0; LoadBalReturn(load_bal, ps->comm, ps->M); /* check if there was an error in computing the approximate inverse */ hypre_MPI_Allreduce(&error, &error_sum, 1, HYPRE_MPI_INT, hypre_MPI_SUM, comm); if (error_sum != 0) { hypre_printf("Hypre-ParaSails detected a problem. The input matrix\n"); hypre_printf("may not be full-rank, or if you are using the SPD version,\n"); hypre_printf("the input matrix may not be positive definite.\n"); hypre_printf("This error is being returned to the calling function.\n"); return error_sum; } /* Filtering */ ps->filter = filter; if (ps->filter != 0.0) { DiagScale *diag_scale = DiagScaleCreate(A, ps->numb); Matrix *filtered_matrix = MatrixCreate(ps->comm, ps->beg_row, ps->end_row); if (ps->filter < 0.0) ps->filter = SelectFilter(ps->comm, ps->M, diag_scale, -ps->filter, ps->symmetric); FilterValues(ps->M, filtered_matrix, diag_scale, ps->filter, ps->symmetric, &ps->cost); DiagScaleDestroy(diag_scale); MatrixDestroy(ps->M); ps->M = filtered_matrix; /* Rescale if factored preconditioner */ if (ps->symmetric != 0) Rescale(ps->M, stored_rows, ps->numb->num_ind); } /* * If the preconditioner matrix has its own numbering object, then we * change the numbering in the matrix to this numbering. If not, then * we put the preconditioner matrix in global numbering, and call * MatrixComplete (to create numbering object, convert the indices, * and create the matvec info). */ if (ps->M->numb != NULL) { /* Convert to own numbering system */ for (row=0; row<=ps->M->end_row - ps->M->beg_row; row++) { MatrixGetRow(ps->M, row, &len, &ind, &val); NumberingLocalToGlobal(ps->numb, len, ind, ind); NumberingGlobalToLocal(ps->M->numb, len, ind, ind); } } else { /* Convert to global numbering system and call MatrixComplete */ for (row=0; row<=ps->M->end_row - ps->M->beg_row; row++) { MatrixGetRow(ps->M, row, &len, &ind, &val); NumberingLocalToGlobal(ps->numb, len, ind, ind); } MatrixComplete(ps->M); } StoredRowsDestroy(stored_rows); return 0; } /*-------------------------------------------------------------------------- * ParaSailsApply - Apply the ParaSails preconditioner * * ps - input ParaSails object * u - input array of doubles * v - output array of doubles * * Although this computation can be done in place, it typically will not * be used this way, since the caller usually needs to preserve the input * vector. *--------------------------------------------------------------------------*/ void ParaSailsApply(ParaSails *ps, HYPRE_Real *u, HYPRE_Real *v) { if (ps->symmetric) { MatrixMatvec(ps->M, u, v); /* need to preserve u */ MatrixMatvecTrans(ps->M, v, v); /* do the second mult in place */ } else { MatrixMatvec(ps->M, u, v); } } /*-------------------------------------------------------------------------- * ParaSailsApplyTrans - Apply the ParaSails preconditioner, transposed * * ps - input ParaSails object * u - input array of doubles * v - output array of doubles * * Although this computation can be done in place, it typically will not * be used this way, since the caller usually needs to preserve the input * vector. *--------------------------------------------------------------------------*/ void ParaSailsApplyTrans(ParaSails *ps, HYPRE_Real *u, HYPRE_Real *v) { if (ps->symmetric) { MatrixMatvec(ps->M, u, v); /* need to preserve u */ MatrixMatvecTrans(ps->M, v, v); /* do the second mult in place */ } else { MatrixMatvecTrans(ps->M, u, v); } } /*-------------------------------------------------------------------------- * ParaSailsStatsPattern - Print some statistics about ParaSailsSetupPattern. * Returns a cost, which can be used to preempt ParaSailsSetupValues if the * cost is too high. *--------------------------------------------------------------------------*/ HYPRE_Real ParaSailsStatsPattern(ParaSails *ps, Matrix *A) { HYPRE_Int mype, npes; HYPRE_Int n, nnzm, nnza; MPI_Comm comm = ps->comm; HYPRE_Real max_pattern_time, max_cost, ave_cost; hypre_MPI_Comm_rank(comm, &mype); hypre_MPI_Comm_size(comm, &npes); nnzm = MatrixNnz(ps->M); nnza = MatrixNnz(A); if (ps->symmetric) { n = ps->end_rows[npes-1] - ps->beg_rows[0] + 1; nnza = (nnza - n) / 2 + n; } hypre_MPI_Allreduce(&ps->setup_pattern_time, &max_pattern_time, 1, hypre_MPI_REAL, hypre_MPI_MAX, comm); hypre_MPI_Allreduce(&ps->cost, &max_cost, 1, hypre_MPI_REAL, hypre_MPI_MAX, comm); hypre_MPI_Allreduce(&ps->cost, &ave_cost, 1, hypre_MPI_REAL, hypre_MPI_SUM, comm); ave_cost = ave_cost / (HYPRE_Real) npes; if (mype) return ave_cost; if (ps->symmetric == 0) max_cost *= 8.0; /* nonsymmetric method is harder */ hypre_printf("** ParaSails Setup Pattern Statistics ***********\n"); hypre_printf("symmetric : %d\n", ps->symmetric); hypre_printf("thresh : %f\n", ps->thresh); hypre_printf("num_levels : %d\n", ps->num_levels); hypre_printf("Max cost (average) : %7.1e (%7.1e)\n", max_cost, ave_cost); hypre_printf("Nnz (ratio) : %d (%5.2f)\n", nnzm, nnzm/(HYPRE_Real)nnza); hypre_printf("Max setup pattern time: %8.1f\n", max_pattern_time); hypre_printf("*************************************************\n"); fflush(stdout); return ave_cost; } /*-------------------------------------------------------------------------- * ParaSailsStatsValues - Print some statistics about ParaSailsSetupValues. *--------------------------------------------------------------------------*/ void ParaSailsStatsValues(ParaSails *ps, Matrix *A) { HYPRE_Int mype, npes; HYPRE_Int n, nnzm, nnza; MPI_Comm comm = ps->comm; HYPRE_Real max_values_time; HYPRE_Real temp, *setup_times = NULL; HYPRE_Int i; hypre_MPI_Comm_rank(comm, &mype); hypre_MPI_Comm_size(comm, &npes); nnzm = MatrixNnz(ps->M); nnza = MatrixNnz(A); if (ps->symmetric) { n = ps->end_rows[npes-1] - ps->beg_rows[0] + 1; nnza = (nnza - n) / 2 + n; } hypre_MPI_Allreduce(&ps->setup_values_time, &max_values_time, 1, hypre_MPI_REAL, hypre_MPI_MAX, comm); if (!mype) setup_times = hypre_TAlloc(HYPRE_Real, npes , HYPRE_MEMORY_HOST); temp = ps->setup_pattern_time + ps->setup_values_time; hypre_MPI_Gather(&temp, 1, hypre_MPI_REAL, setup_times, 1, hypre_MPI_REAL, 0, comm); if (mype) return; hypre_printf("** ParaSails Setup Values Statistics ************\n"); hypre_printf("filter : %f\n", ps->filter); hypre_printf("loadbal : %f\n", ps->loadbal_beta); hypre_printf("Final Nnz (ratio) : %d (%5.2f)\n", nnzm, nnzm/(HYPRE_Real)nnza); hypre_printf("Max setup values time : %8.1f\n", max_values_time); hypre_printf("*************************************************\n"); hypre_printf("Setup (pattern and values) times:\n"); temp = 0.0; for (i=0; i #include "Common.h" #include "Mem.h" #include "Matrix.h" #include "DiagScale.h" #include "PrunedRows.h" /*-------------------------------------------------------------------------- * PrunedRowsCreate - Return (a pointer to) a pruned rows object. * * mat - matrix used to construct the local pruned rows (input) * assumes the matrix uses local indexing * size - number of unique local indices on this processor; * an array of this size will be allocated to access the * pruned rows (input) - includes the number of local nodes * diag_scale - diagonal scale object used to scale the thresholding (input) * thresh - threshold for pruning the matrix (input) * * The local pruned rows are stored in the first part of the len and ind * arrays. *--------------------------------------------------------------------------*/ PrunedRows *PrunedRowsCreate(Matrix *mat, HYPRE_Int size, DiagScale *diag_scale, HYPRE_Real thresh) { HYPRE_Int row, len, *ind, count, j, *data; HYPRE_Real *val, temp; PrunedRows *p = hypre_TAlloc(PrunedRows, 1, HYPRE_MEMORY_HOST); p->mem = MemCreate(); p->size = MAX(size, mat->end_row - mat->beg_row + 1); p->len = hypre_TAlloc(HYPRE_Int, p->size , HYPRE_MEMORY_HOST); p->ind = hypre_TAlloc(HYPRE_Int *, p->size , HYPRE_MEMORY_HOST); /* Prune and store the rows on the local processor */ for (row=0; row<=mat->end_row - mat->beg_row; row++) { MatrixGetRow(mat, row, &len, &ind, &val); count = 1; /* automatically include the diagonal */ for (j=0; j= thresh && ind[j] != row) count++; } p->ind[row] = (HYPRE_Int *) MemAlloc(p->mem, count*sizeof(HYPRE_Int)); p->len[row] = count; data = p->ind[row]; *data++ = row; /* the diagonal entry */ for (j=0; j= thresh && ind[j] != row) *data++ = ind[j]; } } return p; } /*-------------------------------------------------------------------------- * PrunedRowsDestroy - Destroy a pruned rows object "p". *--------------------------------------------------------------------------*/ void PrunedRowsDestroy(PrunedRows *p) { MemDestroy(p->mem); hypre_TFree(p->len,HYPRE_MEMORY_HOST); hypre_TFree(p->ind,HYPRE_MEMORY_HOST); hypre_TFree(p,HYPRE_MEMORY_HOST); } /*-------------------------------------------------------------------------- * PrunedRowsAllocInd - Return space allocated for "len" indices in the * pruned rows object "p". The indices may span several rows. *--------------------------------------------------------------------------*/ HYPRE_Int *PrunedRowsAlloc(PrunedRows *p, HYPRE_Int len) { return (HYPRE_Int *) MemAlloc(p->mem, len*sizeof(HYPRE_Int)); } /*-------------------------------------------------------------------------- * PrunedRowsPut - Given a pruned row (len, ind), store it as row "index" in * the pruned rows object "p". Only nonlocal pruned rows should be put using * this interface; the local pruned rows are put using the create function. *--------------------------------------------------------------------------*/ void PrunedRowsPut(PrunedRows *p, HYPRE_Int index, HYPRE_Int len, HYPRE_Int *ind) { if (index >= p->size) { p->size = index*2; #ifdef PARASAILS_DEBUG hypre_printf("StoredRows resize %d\n", p->size); #endif p->len = hypre_TReAlloc(p->len,HYPRE_Int, p->size , HYPRE_MEMORY_HOST); p->ind = hypre_TReAlloc(p->ind,HYPRE_Int *, p->size , HYPRE_MEMORY_HOST); } p->len[index] = len; p->ind[index] = ind; } /*-------------------------------------------------------------------------- * PrunedRowsGet - Return the row with index "index" through the pointers * "lenp" and "indp" in the pruned rows object "p". *--------------------------------------------------------------------------*/ void PrunedRowsGet(PrunedRows *p, HYPRE_Int index, HYPRE_Int *lenp, HYPRE_Int **indp) { *lenp = p->len[index]; *indp = p->ind[index]; } hypre-2.33.0/src/distributed_ls/ParaSails/PrunedRows.h000066400000000000000000000023221477326011500227020ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * PrunedRows.h header file. * *****************************************************************************/ #include #include "Mem.h" #include "DiagScale.h" #ifndef _PRUNEDROWS_H #define _PRUNEDROWS_H typedef struct { Mem *mem; /* storage for arrays, indices, and values */ HYPRE_Int size; HYPRE_Int *len; HYPRE_Int **ind; } PrunedRows; PrunedRows *PrunedRowsCreate(Matrix *mat, HYPRE_Int size, DiagScale *diag_scale, HYPRE_Real thresh); void PrunedRowsDestroy(PrunedRows *p); HYPRE_Int *PrunedRowsAlloc(PrunedRows *p, HYPRE_Int len); void PrunedRowsPut(PrunedRows *p, HYPRE_Int index, HYPRE_Int len, HYPRE_Int *ind); void PrunedRowsGet(PrunedRows *p, HYPRE_Int index, HYPRE_Int *lenp, HYPRE_Int **indp); #endif /* _PRUNEDROWS_H */ hypre-2.33.0/src/distributed_ls/ParaSails/RowPatt.c000066400000000000000000000144561477326011500222000ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * RowPatt - Pattern of a row, and functions to manipulate the pattern of * a row, particularly merging a pattern with a set of nonzero indices. * * Implementation and Notes: a full-length array is used to mark nonzeros * in the pattern. Indices must not equal -1, which is the "empty" marker * used in the full length array. It is expected that RowPatt will only be * presented with local indices, otherwise the full length array may be very * large. * *****************************************************************************/ #include #include "Common.h" #include "RowPatt.h" /*-------------------------------------------------------------------------- * resize - local function for automatically increasing the size of RowPatt *--------------------------------------------------------------------------*/ static void resize(RowPatt *p, HYPRE_Int newlen) { HYPRE_Int oldlen, i; #ifdef PARASAILS_DEBUG hypre_printf("RowPatt resize %d\n", newlen); #endif oldlen = p->maxlen; p->maxlen = newlen; p->ind = hypre_TReAlloc(p->ind,HYPRE_Int, p->maxlen , HYPRE_MEMORY_HOST); p->mark = hypre_TReAlloc(p->mark,HYPRE_Int, p->maxlen , HYPRE_MEMORY_HOST); /* initialize the new portion of the mark array */ for (i=oldlen; imaxlen; i++) p->mark[i] = -1; } /*-------------------------------------------------------------------------- * RowPattCreate - Return (a pointer to) a pattern of a row with a maximum * of "maxlen" nonzeros. *--------------------------------------------------------------------------*/ RowPatt *RowPattCreate(HYPRE_Int maxlen) { HYPRE_Int i; RowPatt *p = hypre_TAlloc(RowPatt, 1, HYPRE_MEMORY_HOST); p->maxlen = maxlen; p->len = 0; p->prev_len = 0; p->ind = hypre_TAlloc(HYPRE_Int, maxlen , HYPRE_MEMORY_HOST); p->mark = hypre_TAlloc(HYPRE_Int, maxlen , HYPRE_MEMORY_HOST); p->buffer = NULL; p->buflen = 0; for (i=0; imark[i] = -1; return p; } /*-------------------------------------------------------------------------- * RowPattDestroy - Destroy a row pattern object "p". *--------------------------------------------------------------------------*/ void RowPattDestroy(RowPatt *p) { hypre_TFree(p->ind,HYPRE_MEMORY_HOST); hypre_TFree(p->mark,HYPRE_MEMORY_HOST); hypre_TFree(p->buffer,HYPRE_MEMORY_HOST); hypre_TFree(p,HYPRE_MEMORY_HOST); } /*-------------------------------------------------------------------------- * RowPattReset - Empty the pattern of row pattern object "p". *--------------------------------------------------------------------------*/ void RowPattReset(RowPatt *p) { HYPRE_Int i; for (i=0; ilen; i++) p->mark[p->ind[i]] = -1; p->len = 0; p->prev_len = 0; } /*-------------------------------------------------------------------------- * RowPattMerge - Merge the "len" nonzeros in array "ind" with pattern "p". *--------------------------------------------------------------------------*/ void RowPattMerge(RowPatt *p, HYPRE_Int len, HYPRE_Int *ind) { HYPRE_Int i; for (i=0; i= p->maxlen) resize(p, ind[i]*2); if (p->mark[ind[i]] == -1) { hypre_assert(p->len < p->maxlen); p->mark[ind[i]] = p->len; p->ind[p->len] = ind[i]; p->len++; } } } /*-------------------------------------------------------------------------- * RowPattMergeExt - Merge the external nonzeros in the array "ind" of * length "len" with the pattern "p". The external indices are those * that are less than "beg" or greater than "end". *--------------------------------------------------------------------------*/ void RowPattMergeExt(RowPatt *p, HYPRE_Int len, HYPRE_Int *ind, HYPRE_Int num_loc) { HYPRE_Int i; for (i=0; i= p->maxlen) resize(p, ind[i]*2); if (p->mark[ind[i]] == -1) { hypre_assert(p->len < p->maxlen); p->mark[ind[i]] = p->len; p->ind[p->len] = ind[i]; p->len++; } } } /*-------------------------------------------------------------------------- * RowPattGet - Return the pattern of "p". The length and pointer to the * pattern indices are returned through the parameters "lenp" and "indp". * A copy of the indices is returned; this copy is destroyed on the next * call to RowPattGet or RowPattPrevLevel. *--------------------------------------------------------------------------*/ void RowPattGet(RowPatt *p, HYPRE_Int *lenp, HYPRE_Int **indp) { HYPRE_Int len; len = p->len; if (len > p->buflen) { hypre_TFree(p->buffer,HYPRE_MEMORY_HOST); p->buflen = len + 100; p->buffer = hypre_TAlloc(HYPRE_Int, p->buflen , HYPRE_MEMORY_HOST); } hypre_TMemcpy(p->buffer, p->ind, HYPRE_Int, len, HYPRE_MEMORY_HOST, HYPRE_MEMORY_HOST); *lenp = len; *indp = p->buffer; } /*-------------------------------------------------------------------------- * RowPattPrevLevel - Return the new indices added to the pattern of "p" * since the last call to RowPattPrevLevel (or all the indices if never * called). The length and pointer to the pattern indices are returned * through the parameters "lenp" and "indp". * A copy of the indices is returned; this copy is destroyed on the next * call to RowPattGet or RowPattPrevLevel. *--------------------------------------------------------------------------*/ void RowPattPrevLevel(RowPatt *p, HYPRE_Int *lenp, HYPRE_Int **indp) { HYPRE_Int len; len = p->len - p->prev_len; if (len > p->buflen) { hypre_TFree(p->buffer,HYPRE_MEMORY_HOST); p->buflen = len + 100; p->buffer = hypre_TAlloc(HYPRE_Int, p->buflen , HYPRE_MEMORY_HOST); } hypre_TMemcpy(p->buffer, &p->ind[p->prev_len], HYPRE_Int, len, HYPRE_MEMORY_HOST, HYPRE_MEMORY_HOST); *lenp = len; *indp = p->buffer; p->prev_len = p->len; } hypre-2.33.0/src/distributed_ls/ParaSails/RowPatt.h000066400000000000000000000023761477326011500222030ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * RowPatt.h header file. * *****************************************************************************/ #include #ifndef _ROWPATT_H #define _ROWPATT_H typedef struct { HYPRE_Int maxlen; HYPRE_Int len; HYPRE_Int prev_len; HYPRE_Int *ind; HYPRE_Int *mark; HYPRE_Int *buffer; /* buffer used for outputting indices */ HYPRE_Int buflen; /* length of this buffer */ } RowPatt; RowPatt *RowPattCreate(HYPRE_Int maxlen); void RowPattDestroy(RowPatt *p); void RowPattReset(RowPatt *p); void RowPattMerge(RowPatt *p, HYPRE_Int len, HYPRE_Int *ind); void RowPattMergeExt(RowPatt *p, HYPRE_Int len, HYPRE_Int *ind, HYPRE_Int num_loc); void RowPattGet(RowPatt *p, HYPRE_Int *lenp, HYPRE_Int **indp); void RowPattPrevLevel(RowPatt *p, HYPRE_Int *lenp, HYPRE_Int **indp); #endif /* _ROWPATT_H */ hypre-2.33.0/src/distributed_ls/ParaSails/StoredRows.c000066400000000000000000000123541477326011500227060ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * StoredRows - Local storage of rows from other processors. Although only * off-processor rows are stored, if an on-processor row is requested, it * is returned by referring to the local matrix. Local indexing is used to * access the stored rows. * *****************************************************************************/ #include #include "Common.h" #include "Mem.h" #include "Matrix.h" #include "StoredRows.h" /*-------------------------------------------------------------------------- * StoredRowsCreate - Return (a pointer to) a stored rows object. * * mat - matrix used for returning on-processor rows (input) * size - the maximum number of (off-processor) rows that can be stored * (input). See below for more a precise description. * * A slot is available for "size" off-processor rows. The slot for the * row with local index i is (i - num_loc). Therefore, if max_i is the * largest local index expected, then size should be set to * (max_i - num_loc + 1). StoredRows will automatically increase its * size if a row with a larger local index needs to be put in StoredRows. *--------------------------------------------------------------------------*/ StoredRows *StoredRowsCreate(Matrix *mat, HYPRE_Int size) { StoredRows *p = hypre_TAlloc(StoredRows, 1, HYPRE_MEMORY_HOST); p->mat = mat; p->mem = MemCreate(); p->size = size; p->num_loc = mat->end_row - mat->beg_row + 1; p->len = hypre_CTAlloc(HYPRE_Int, size, HYPRE_MEMORY_HOST); p->ind = hypre_TAlloc(HYPRE_Int *, size , HYPRE_MEMORY_HOST); p->val = hypre_TAlloc(HYPRE_Real *, size , HYPRE_MEMORY_HOST); p->count = 0; return p; } /*-------------------------------------------------------------------------- * StoredRowsDestroy - Destroy a stored rows object "p". *--------------------------------------------------------------------------*/ void StoredRowsDestroy(StoredRows *p) { MemDestroy(p->mem); hypre_TFree(p->len,HYPRE_MEMORY_HOST); hypre_TFree(p->ind,HYPRE_MEMORY_HOST); hypre_TFree(p->val,HYPRE_MEMORY_HOST); hypre_TFree(p,HYPRE_MEMORY_HOST); } /*-------------------------------------------------------------------------- * StoredRowsAllocInd - Return space allocated for "len" indices in the * stored rows object "p". The indices may span several rows. *--------------------------------------------------------------------------*/ HYPRE_Int *StoredRowsAllocInd(StoredRows *p, HYPRE_Int len) { return (HYPRE_Int *) MemAlloc(p->mem, len*sizeof(HYPRE_Int)); } /*-------------------------------------------------------------------------- * StoredRowsAllocVal - Return space allocated for "len" values in the * stored rows object "p". The values may span several rows. *--------------------------------------------------------------------------*/ HYPRE_Real *StoredRowsAllocVal(StoredRows *p, HYPRE_Int len) { return (HYPRE_Real *) MemAlloc(p->mem, len*sizeof(HYPRE_Real)); } /*-------------------------------------------------------------------------- * StoredRowsPut - Given a row (len, ind, val), store it as row "index" in * the stored rows object "p". Only nonlocal stored rows should be put using * this interface; the local stored rows are put using the create function. *--------------------------------------------------------------------------*/ void StoredRowsPut(StoredRows *p, HYPRE_Int index, HYPRE_Int len, HYPRE_Int *ind, HYPRE_Real *val) { HYPRE_Int i = index - p->num_loc; /* Reallocate if necessary */ if (i >= p->size) { HYPRE_Int j; HYPRE_Int newsize; newsize = i*2; #ifdef PARASAILS_DEBUG hypre_printf("StoredRows resize %d\n", newsize); #endif p->len = hypre_TReAlloc(p->len,HYPRE_Int, newsize , HYPRE_MEMORY_HOST); p->ind = hypre_TReAlloc(p->ind,HYPRE_Int *, newsize , HYPRE_MEMORY_HOST); p->val = hypre_TReAlloc(p->val,HYPRE_Real *, newsize , HYPRE_MEMORY_HOST); /* set lengths to zero */ for (j=p->size; jlen[j] = 0; p->size = newsize; } /* check that row has not been put already */ hypre_assert(p->len[i] == 0); p->len[i] = len; p->ind[i] = ind; p->val[i] = val; p->count++; } /*-------------------------------------------------------------------------- * StoredRowsGet - Return the row with index "index" through the pointers * "lenp", "indp" and "valp" in the stored rows object "p". *--------------------------------------------------------------------------*/ void StoredRowsGet(StoredRows *p, HYPRE_Int index, HYPRE_Int *lenp, HYPRE_Int **indp, HYPRE_Real **valp) { if (index < p->num_loc) { MatrixGetRow(p->mat, index, lenp, indp, valp); } else { index = index - p->num_loc; *lenp = p->len[index]; *indp = p->ind[index]; *valp = p->val[index]; } } hypre-2.33.0/src/distributed_ls/ParaSails/StoredRows.h000066400000000000000000000026711477326011500227140ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * StoredRows.h header file. * *****************************************************************************/ #include #include "Mem.h" #include "Matrix.h" #ifndef _STOREDROWS_H #define _STOREDROWS_H typedef struct { Matrix *mat; /* the matrix corresponding to the rows stored here */ Mem *mem; /* storage for arrays, indices, and values */ HYPRE_Int size; HYPRE_Int num_loc; HYPRE_Int *len; HYPRE_Int **ind; HYPRE_Real **val; HYPRE_Int count; } StoredRows; StoredRows *StoredRowsCreate(Matrix *mat, HYPRE_Int size); void StoredRowsDestroy(StoredRows *p); HYPRE_Int *StoredRowsAllocInd(StoredRows *p, HYPRE_Int len); HYPRE_Real *StoredRowsAllocVal(StoredRows *p, HYPRE_Int len); void StoredRowsPut(StoredRows *p, HYPRE_Int index, HYPRE_Int len, HYPRE_Int *ind, HYPRE_Real *val); void StoredRowsGet(StoredRows *p, HYPRE_Int index, HYPRE_Int *lenp, HYPRE_Int **indp, HYPRE_Real **valp); #endif /* _STOREDROWS_H */ hypre-2.33.0/src/distributed_ls/ParaSails/convert.c000066400000000000000000000061131477326011500222470ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include /* Convert - conversion routines from triangular formats */ /* assumes the matrix has a diagonal */ #define MM_MAX_LINE_LENGTH 1000 HYPRE_Int convert(FILE *infile, FILE *outfile) { char line[MM_MAX_LINE_LENGTH]; HYPRE_Int num_items_read, ret; HYPRE_Int M, N, nz, nnz; hypre_longint offset; HYPRE_Int *counts, *pointers; HYPRE_Int row, col; HYPRE_Real value; HYPRE_Int *ind; HYPRE_Real *val; HYPRE_Int i, j; /* skip the comment section */ do { if (fgets(line, MM_MAX_LINE_LENGTH, infile) == NULL) return -1; } while (line[0] == '%'); hypre_sscanf(line, "%d %d %d", &M, &N, &nz); hypre_printf("%d %d %d\n", M, N, nz); nnz = 2*nz - M; /* save this position in the file */ offset = ftell(infile); /* allocate space for row counts */ counts = hypre_CTAlloc(HYPRE_Int, M+1, HYPRE_MEMORY_HOST); pointers = hypre_TAlloc(HYPRE_Int, (M+1) , HYPRE_MEMORY_HOST); /* read the entire matrix */ ret = hypre_fscanf(infile, "%d %d %lf\n", &row, &col, &value); while (ret != EOF) { counts[row]++; if (row != col) /* do not count the diagonal twice */ counts[col]++; ret = hypre_fscanf(infile, "%d %d %lf\n", &row, &col, &value); } /* allocate space for whole matrix */ ind = hypre_TAlloc(HYPRE_Int, nnz , HYPRE_MEMORY_HOST); val = hypre_TAlloc(HYPRE_Real, nnz , HYPRE_MEMORY_HOST); /* set pointer to beginning of each row */ pointers[1] = 0; for (i=2; i<=M; i++) pointers[i] = pointers[i-1] + counts[i-1]; /* traverse matrix again, putting in the values */ fseek(infile, offset, SEEK_SET); ret = hypre_fscanf(infile, "%d %d %lf\n", &row, &col, &value); while (ret != EOF) { val[pointers[row]] = value; ind[pointers[row]++] = col; if (row != col) { val[pointers[col]] = value; ind[pointers[col]++] = row; } ret = hypre_fscanf(infile, "%d %d %lf\n", &row, &col, &value); } /* print out the matrix to the output file */ hypre_fprintf(outfile, "%d %d %d\n", M, M, nnz); for (i=1; i<=M; i++) for (j=0; jend_row - mat->beg_row + 1; /* compute number of nonzeros on local matrix */ total = 0; for (i=0; ilens[i]; /* each processor prints out its own info */ hypre_printf("%4d: nrows %d, nnz %d, send %d (%d), recv %d (%d)\n", mype, num_local, total, mat->num_send, mat->sendlen, mat->num_recv, mat->recvlen); } static void matvec_timing(MPI_Comm comm, Matrix *mat) { HYPRE_Real time0, time1; HYPRE_Real trial1, trial2, trial3, trial4, trial5, trial6; HYPRE_Real *temp1, *temp2; HYPRE_Int i, mype; HYPRE_Int n = mat->end_row - mat->beg_row + 1; temp1 = hypre_CTAlloc(HYPRE_Real, n, HYPRE_MEMORY_HOST); temp2 = hypre_CTAlloc(HYPRE_Real, n, HYPRE_MEMORY_HOST); /* warm-up */ hypre_MPI_Barrier(comm); for (i=0; i<100; i++) MatrixMatvec(mat, temp1, temp2); hypre_MPI_Barrier(comm); time0 = hypre_MPI_Wtime(); for (i=0; i<100; i++) MatrixMatvec(mat, temp1, temp2); hypre_MPI_Barrier(comm); time1 = hypre_MPI_Wtime(); trial1 = time1-time0; hypre_MPI_Barrier(comm); time0 = hypre_MPI_Wtime(); for (i=0; i<100; i++) MatrixMatvec(mat, temp1, temp2); hypre_MPI_Barrier(comm); time1 = hypre_MPI_Wtime(); trial2 = time1-time0; hypre_MPI_Barrier(comm); time0 = hypre_MPI_Wtime(); for (i=0; i<100; i++) MatrixMatvec(mat, temp1, temp2); hypre_MPI_Barrier(comm); time1 = hypre_MPI_Wtime(); trial3 = time1-time0; hypre_MPI_Barrier(comm); time0 = hypre_MPI_Wtime(); for (i=0; i<100; i++) MatrixMatvecSerial(mat, temp1, temp2); hypre_MPI_Barrier(comm); time1 = hypre_MPI_Wtime(); trial4 = time1-time0; hypre_MPI_Barrier(comm); time0 = hypre_MPI_Wtime(); for (i=0; i<100; i++) MatrixMatvecSerial(mat, temp1, temp2); hypre_MPI_Barrier(comm); time1 = hypre_MPI_Wtime(); trial5 = time1-time0; hypre_MPI_Barrier(comm); time0 = hypre_MPI_Wtime(); for (i=0; i<100; i++) MatrixMatvecSerial(mat, temp1, temp2); hypre_MPI_Barrier(comm); time1 = hypre_MPI_Wtime(); trial6 = time1-time0; hypre_MPI_Comm_rank(comm, &mype); if (mype == 0) hypre_printf("Timings: %f %f %f Serial: %f %f %f\n", trial1, trial2, trial3, trial4, trial5, trial6); fflush(stdout); /* this is all we wanted, so don't waste any more cycles */ exit(0); } #endif /*-------------------------------------------------------------------------- * convert_matrix - Create and convert distributed matrix to native * data structure of ParaSails *--------------------------------------------------------------------------*/ static Matrix *convert_matrix(MPI_Comm comm, HYPRE_DistributedMatrix distmat) { HYPRE_Int row; HYPRE_BigInt beg_row, end_row, dummy; HYPRE_Int len; HYPRE_BigInt *ind; HYPRE_Real *val; Matrix *mat; HYPRE_DistributedMatrixGetLocalRange(distmat, &beg_row, &end_row, &dummy, &dummy); mat = MatrixCreate(comm, beg_row, end_row); for (row=beg_row; row<=end_row; row++) { HYPRE_DistributedMatrixGetRow(distmat, row, &len, &ind, &val); MatrixSetRow(mat, row, len, (HYPRE_Int*) ind, val); HYPRE_DistributedMatrixRestoreRow(distmat, row, &len, &ind, &val); } MatrixComplete(mat); #ifdef BALANCE_INFO matvec_timing(comm, mat); balance_info(comm, mat); #endif return mat; } /*-------------------------------------------------------------------------- * hypre_ParaSailsCreate - Return a ParaSails preconditioner object "obj" *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ParaSailsCreate(MPI_Comm comm, hypre_ParaSails *obj) { hypre_ParaSails_struct *internal; internal = (hypre_ParaSails_struct *) hypre_CTAlloc(hypre_ParaSails_struct, 1, HYPRE_MEMORY_HOST); internal->comm = comm; internal->ps = NULL; *obj = (hypre_ParaSails) internal; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_ParaSailsDestroy - Destroy a ParaSails object "ps". *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ParaSailsDestroy(hypre_ParaSails obj) { hypre_ParaSails_struct *internal = (hypre_ParaSails_struct *) obj; ParaSailsDestroy(internal->ps); hypre_TFree(internal, HYPRE_MEMORY_HOST); return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_ParaSailsSetup - This function should be used if the preconditioner * pattern and values are set up with the same distributed matrix. *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ParaSailsSetup(hypre_ParaSails obj, HYPRE_DistributedMatrix distmat, HYPRE_Int sym, HYPRE_Real thresh, HYPRE_Int nlevels, HYPRE_Real filter, HYPRE_Real loadbal, HYPRE_Int logging) { /* HYPRE_Real cost; */ Matrix *mat; hypre_ParaSails_struct *internal = (hypre_ParaSails_struct *) obj; HYPRE_Int err; mat = convert_matrix(internal->comm, distmat); ParaSailsDestroy(internal->ps); internal->ps = ParaSailsCreate(internal->comm, mat->beg_row, mat->end_row, sym); ParaSailsSetupPattern(internal->ps, mat, thresh, nlevels); if (logging) /* cost = */ ParaSailsStatsPattern(internal->ps, mat); internal->ps->loadbal_beta = loadbal; err = ParaSailsSetupValues(internal->ps, mat, filter); if (logging) ParaSailsStatsValues(internal->ps, mat); MatrixDestroy(mat); if (err) { hypre_error(HYPRE_ERROR_GENERIC); } return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_ParaSailsSetupPattern - Set up pattern using a distributed matrix. *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ParaSailsSetupPattern(hypre_ParaSails obj, HYPRE_DistributedMatrix distmat, HYPRE_Int sym, HYPRE_Real thresh, HYPRE_Int nlevels, HYPRE_Int logging) { /* HYPRE_Real cost; */ Matrix *mat; hypre_ParaSails_struct *internal = (hypre_ParaSails_struct *) obj; mat = convert_matrix(internal->comm, distmat); ParaSailsDestroy(internal->ps); internal->ps = ParaSailsCreate(internal->comm, mat->beg_row, mat->end_row, sym); ParaSailsSetupPattern(internal->ps, mat, thresh, nlevels); if (logging) /* cost = */ ParaSailsStatsPattern(internal->ps, mat); MatrixDestroy(mat); return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_ParaSailsSetupValues - Set up values using a distributed matrix. *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ParaSailsSetupValues(hypre_ParaSails obj, HYPRE_DistributedMatrix distmat, HYPRE_Real filter, HYPRE_Real loadbal, HYPRE_Int logging) { Matrix *mat; hypre_ParaSails_struct *internal = (hypre_ParaSails_struct *) obj; HYPRE_Int err; mat = convert_matrix(internal->comm, distmat); internal->ps->loadbal_beta = loadbal; internal->ps->setup_pattern_time = 0.0; err = ParaSailsSetupValues(internal->ps, mat, filter); if (logging) ParaSailsStatsValues(internal->ps, mat); MatrixDestroy(mat); if (err) { hypre_error(HYPRE_ERROR_GENERIC); } return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_ParaSailsApply - Apply the ParaSails preconditioner to an array * "u", and return the result in the array "v". *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ParaSailsApply(hypre_ParaSails obj, HYPRE_Real *u, HYPRE_Real *v) { hypre_ParaSails_struct *internal = (hypre_ParaSails_struct *) obj; ParaSailsApply(internal->ps, u, v); return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_ParaSailsApplyTrans - Apply the ParaSails preconditioner, transposed * to an array "u", and return the result in the array "v". *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ParaSailsApplyTrans(hypre_ParaSails obj, HYPRE_Real *u, HYPRE_Real *v) { hypre_ParaSails_struct *internal = (hypre_ParaSails_struct *) obj; ParaSailsApplyTrans(internal->ps, u, v); return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_ParaSailsIJMatrix - Return the IJ matrix which is the sparse * approximate inverse (or its factor). This matrix is a copy of the * matrix that is in ParaSails Matrix format. *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ParaSailsBuildIJMatrix(hypre_ParaSails obj, HYPRE_IJMatrix *pij_A) { hypre_ParaSails_struct *internal = (hypre_ParaSails_struct *) obj; ParaSails *ps = internal->ps; Matrix *mat = internal->ps->M; HYPRE_Int *col_inds, *diag_sizes, *offdiag_sizes, local_row, j; HYPRE_BigInt i; HYPRE_Int size; HYPRE_Real *values; HYPRE_IJMatrixCreate( ps->comm, ps->beg_row, ps->end_row, ps->beg_row, ps->end_row, pij_A ); HYPRE_IJMatrixSetObjectType( *pij_A, HYPRE_PARCSR ); diag_sizes = hypre_CTAlloc(HYPRE_Int, ps->end_row - ps->beg_row + 1, HYPRE_MEMORY_HOST); offdiag_sizes = hypre_CTAlloc(HYPRE_Int, ps->end_row - ps->beg_row + 1, HYPRE_MEMORY_HOST); local_row = 0; for (i=ps->beg_row; i<= ps->end_row; i++) { MatrixGetRow(mat, local_row, &size, &col_inds, &values); NumberingLocalToGlobal(ps->numb, size, col_inds, col_inds); for (j=0; j < size; j++) { if (col_inds[j] < ps->beg_row || col_inds[j] > ps->end_row) offdiag_sizes[local_row]++; else diag_sizes[local_row]++; } local_row++; } HYPRE_IJMatrixSetDiagOffdSizes( *pij_A, (const HYPRE_Int *) diag_sizes, (const HYPRE_Int *) offdiag_sizes ); hypre_TFree(diag_sizes, HYPRE_MEMORY_HOST); hypre_TFree(offdiag_sizes, HYPRE_MEMORY_HOST); HYPRE_IJMatrixInitialize( *pij_A ); local_row = 0; for (i=ps->beg_row; i<= ps->end_row; i++) { MatrixGetRow(mat, local_row, &size, &col_inds, &values); HYPRE_IJMatrixSetValues( *pij_A, 1, &size, &i, (const HYPRE_BigInt *) col_inds, (const HYPRE_Real *) values ); NumberingGlobalToLocal(ps->numb, size, col_inds, col_inds); local_row++; } HYPRE_IJMatrixAssemble( *pij_A ); return hypre_error_flag; } hypre-2.33.0/src/distributed_ls/ParaSails/hypre_ParaSails.h000066400000000000000000000030551477326011500236640ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * hypre_ParaSails.h header file. * *****************************************************************************/ #include "HYPRE_distributed_matrix_protos.h" #include "../../IJ_mv/HYPRE_IJ_mv.h" typedef void *hypre_ParaSails; HYPRE_Int hypre_ParaSailsCreate(MPI_Comm comm, hypre_ParaSails *obj); HYPRE_Int hypre_ParaSailsDestroy(hypre_ParaSails ps); HYPRE_Int hypre_ParaSailsSetup(hypre_ParaSails obj, HYPRE_DistributedMatrix distmat, HYPRE_Int sym, HYPRE_Real thresh, HYPRE_Int nlevels, HYPRE_Real filter, HYPRE_Real loadbal, HYPRE_Int logging); HYPRE_Int hypre_ParaSailsSetupPattern(hypre_ParaSails obj, HYPRE_DistributedMatrix distmat, HYPRE_Int sym, HYPRE_Real thresh, HYPRE_Int nlevels, HYPRE_Int logging); HYPRE_Int hypre_ParaSailsSetupValues(hypre_ParaSails obj, HYPRE_DistributedMatrix distmat, HYPRE_Real filter, HYPRE_Real loadbal, HYPRE_Int logging); HYPRE_Int hypre_ParaSailsApply(hypre_ParaSails ps, HYPRE_Real *u, HYPRE_Real *v); HYPRE_Int hypre_ParaSailsApplyTrans(hypre_ParaSails ps, HYPRE_Real *u, HYPRE_Real *v); HYPRE_Int hypre_ParaSailsBuildIJMatrix(hypre_ParaSails obj, HYPRE_IJMatrix *pij_A); hypre-2.33.0/src/distributed_ls/ParaSails/permute.c000066400000000000000000000061571477326011500222600ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include /* Permute - permute matrix */ /* Usage: permute permfile infile outfile */ /* where perm is new2old, the inverse permutation, or the matlab permutation */ /* 0-based ordering vectors */ #define MM_MAX_LINE_LENGTH 80 HYPRE_Int permute(FILE *permfile, FILE *infile, FILE *outfile) { char line[MM_MAX_LINE_LENGTH]; HYPRE_Int ret; HYPRE_Int M, N, nnz; HYPRE_Int *old2new, *new2old; HYPRE_Int row; HYPRE_Int *ptr, *ind; HYPRE_Real *val; HYPRE_Int i, j; HYPRE_Int oldrow, k; /* skip the comment section */ do { if (fgets(line, MM_MAX_LINE_LENGTH, infile) == NULL) return -1; } while (line[0] == '%'); hypre_sscanf(line, "%d %d %d", &M, &N, &nnz); hypre_printf("%d %d %d\n", M, N, nnz); /* allocate space for whole matrix */ ptr = hypre_TAlloc(HYPRE_Int, (M+1) , HYPRE_MEMORY_HOST); ind = hypre_TAlloc(HYPRE_Int, nnz , HYPRE_MEMORY_HOST); val = hypre_TAlloc(HYPRE_Real, nnz , HYPRE_MEMORY_HOST); /* read the entire matrix */ k = 0; ptr[0] = 0; oldrow = 1; /* input row numbers are 1-based */ ret = hypre_fscanf(infile, "%d %d %lf", &row, &ind[k], &val[k]); while (ret != EOF) { if (row != oldrow) { /* set beginning of new row */ ptr[oldrow] = k; oldrow = row; } k++; ret = hypre_fscanf(infile, "%d %d %lf", &row, &ind[k], &val[k]); } /* set end of last row */ ptr[M] = k; /* allocate space for permutation vectors */ new2old = hypre_TAlloc(HYPRE_Int, M , HYPRE_MEMORY_HOST); old2new = hypre_TAlloc(HYPRE_Int, M , HYPRE_MEMORY_HOST); /* read the new2old permutation vector, 0-based */ for (i=0; i #endif */ #include "HYPRE.h" #include "HYPRE_DistributedMatrixPilutSolver_types.h" #include "HYPRE_distributed_matrix_types.h" #include "HYPRE_distributed_matrix_protos.h" #include "macros.h" /*contains some macros that are used here */ /*-------------------------------------------------------------------------- * Global variables for the pilut solver *--------------------------------------------------------------------------*/ typedef struct { MPI_Comm hypre_MPI_communicator; HYPRE_Int _mype, _npes; HYPRE_Real _secpertick; HYPRE_Int _Mfactor; HYPRE_Int *_jr, *_jw, _lastjr, *_lr, _lastlr; /* Work space */ HYPRE_Real *_w; /* Work space */ HYPRE_Int _firstrow, _lastrow; /* Matrix distribution parameters */ timer _SerTmr, _ParTmr; HYPRE_Int _nrows, _lnrows, _ndone, _ntogo, _nleft; /* Various values used throught out */ HYPRE_Int _maxnz; HYPRE_Int *_map; /* Map used for marking rows in the set */ HYPRE_Int *_vrowdist; HYPRE_Int logging; /* if 0, turn off all printings */ /* Buffers for point to point communication */ HYPRE_Int _pilu_recv[MAX_NPES]; HYPRE_Int _pilu_send[MAX_NPES]; HYPRE_Int _lu_recv[MAX_NPES]; #ifdef HYPRE_TIMING /* factorization */ HYPRE_Int CCI_timer; HYPRE_Int SS_timer; HYPRE_Int SFR_timer; HYPRE_Int CR_timer; HYPRE_Int FL_timer; HYPRE_Int SLUD_timer; HYPRE_Int SLUM_timer; HYPRE_Int UL_timer; HYPRE_Int FNR_timer; HYPRE_Int SDSeptimer; HYPRE_Int SDKeeptimer; HYPRE_Int SDUSeptimer; HYPRE_Int SDUKeeptimer; /* solves */ HYPRE_Int Ll_timer; HYPRE_Int Lp_timer; HYPRE_Int Up_timer; HYPRE_Int Ul_timer; #endif } hypre_PilutSolverGlobals; /* DEFINES for global variables */ #define pilut_comm (globals->hypre_MPI_communicator) #define mype (globals->_mype) #define npes (globals->_npes) #define secpertick (globals->_secpertick) #define Mfactor (globals->_Mfactor) #define jr (globals->_jr) #define jw (globals->_jw) #define lastjr (globals->_lastjr) #define hypre_lr (globals->_lr) #define lastlr (globals->_lastlr) #define w (globals->_w) #define firstrow (globals->_firstrow) #define lastrow (globals->_lastrow) #define SerTmr (globals->_SerTmr) #define ParTmr (globals->_ParTmr) #define nrows (globals->_nrows) #define lnrows (globals->_lnrows) #define ndone (globals->_ndone) #define ntogo (globals->_ntogo) #define nleft (globals->_nleft) #define global_maxnz (globals->_maxnz) #define pilut_map (globals->_map) #define vrowdist (globals->_vrowdist) #define pilu_recv (globals->_pilu_recv) #define pilu_send (globals->_pilu_send) #define lu_recv (globals->_lu_recv) #include "./const.h" /*-------------------------------------------------------------------------- * pilut structures *--------------------------------------------------------------------------*/ #include "./struct.h" /*-------------------------------------------------------------------------- * hypre_DistributedMatrixPilutSolver *--------------------------------------------------------------------------*/ typedef struct { /* Input parameters */ MPI_Comm comm; HYPRE_DistributedMatrix Matrix; HYPRE_Int gmaxnz; HYPRE_Real tol; HYPRE_Int max_its; /* Structure that is used internally and built from matrix */ DataDistType *DataDist; /* Data that is passed from the factor to the solve */ FactorMatType *FactorMat; hypre_PilutSolverGlobals *globals; } hypre_DistributedMatrixPilutSolver; /*-------------------------------------------------------------------------- * Accessor functions for the hypre_DistributedMatrixPilutSolver structure *--------------------------------------------------------------------------*/ #define hypre_DistributedMatrixPilutSolverComm(solver) ((solver) -> comm) #define hypre_DistributedMatrixPilutSolverDataDist(solver) ((solver) -> DataDist) #define hypre_DistributedMatrixPilutSolverMatrix(solver) ((solver) -> Matrix) #define hypre_DistributedMatrixPilutSolverGmaxnz(solver) ((solver) -> gmaxnz) #define hypre_DistributedMatrixPilutSolverTol(solver) ((solver) -> tol) #define hypre_DistributedMatrixPilutSolverMaxIts(solver) ((solver) -> max_its) #define hypre_DistributedMatrixPilutSolverFactorMat(solver) ((solver) -> FactorMat) #define hypre_DistributedMatrixPilutSolverGlobals(solver) ((solver) -> globals) /* Include internal prototypes */ #include "./internal_protos.h" #endif hypre-2.33.0/src/distributed_ls/pilut/HYPRE_DistributedMatrixPilutSolver.c000066400000000000000000000413521477326011500267000ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /* Include headers for problem and solver data structure */ #include "./DistributedMatrixPilutSolver.h" /*-------------------------------------------------------------------------- * HYPRE_NewDistributedMatrixPilutSolver *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_NewDistributedMatrixPilutSolver( MPI_Comm comm, HYPRE_DistributedMatrix matrix, HYPRE_DistributedMatrixPilutSolver *new_solver ) /* Allocates and Initializes solver structure */ { hypre_DistributedMatrixPilutSolver *solver; hypre_PilutSolverGlobals *globals; HYPRE_Int nprocs, myid; FactorMatType *ldu; /* Allocate structure for holding solver data */ solver = (hypre_DistributedMatrixPilutSolver *) hypre_CTAlloc( hypre_DistributedMatrixPilutSolver, 1, HYPRE_MEMORY_HOST); /* Initialize components of solver */ hypre_DistributedMatrixPilutSolverComm(solver) = comm; hypre_DistributedMatrixPilutSolverDataDist(solver) = (DataDistType *) hypre_CTAlloc( DataDistType, 1 , HYPRE_MEMORY_HOST); /* Structure for holding "global variables"; makes code thread safe(r) */ globals = hypre_DistributedMatrixPilutSolverGlobals(solver) = (hypre_PilutSolverGlobals *) hypre_CTAlloc( hypre_PilutSolverGlobals, 1 , HYPRE_MEMORY_HOST); jr = NULL; hypre_lr = NULL; jw = NULL; w = NULL; globals->logging = 0; /* Set some variables in the "global variables" section */ pilut_comm = comm; hypre_MPI_Comm_size( comm, &nprocs ); npes = nprocs; hypre_MPI_Comm_rank( comm, &myid ); mype = myid; #ifdef HYPRE_TIMING globals->CCI_timer = hypre_InitializeTiming( "hypre_ComputeCommInfo" ); globals->SS_timer = hypre_InitializeTiming( "hypre_SelectSet" ); globals->SFR_timer = hypre_InitializeTiming( "hypre_SendFactoredRows" ); globals->CR_timer = hypre_InitializeTiming( "hypre_ComputeRmat" ); globals->FL_timer = hypre_InitializeTiming( "hypre_FactorLocal" ); globals->SLUD_timer = hypre_InitializeTiming( "SeparateLU_byDIAG" ); globals->SLUM_timer = hypre_InitializeTiming( "SeparateLU_byMIS" ); globals->UL_timer = hypre_InitializeTiming( "hypre_UpdateL" ); globals->FNR_timer = hypre_InitializeTiming( "hypre_FormNRmat" ); globals->Ll_timer = hypre_InitializeTiming( "Local part of front solve" ); globals->Lp_timer = hypre_InitializeTiming( "Parallel part of front solve" ); globals->Up_timer = hypre_InitializeTiming( "Parallel part of back solve" ); globals->Ul_timer = hypre_InitializeTiming( "Local part of back solve" ); #endif /* Data distribution structure */ DataDistTypeRowdist(hypre_DistributedMatrixPilutSolverDataDist(solver)) = (HYPRE_Int *) hypre_CTAlloc( HYPRE_Int, nprocs+1 , HYPRE_MEMORY_HOST); hypre_DistributedMatrixPilutSolverFactorMat(solver) = (FactorMatType *) hypre_CTAlloc( FactorMatType, 1 , HYPRE_MEMORY_HOST); ldu = hypre_DistributedMatrixPilutSolverFactorMat(solver); ldu->lsrowptr = NULL; ldu->lerowptr = NULL; ldu->lcolind = NULL; ldu->lvalues = NULL; ldu->usrowptr = NULL; ldu->uerowptr = NULL; ldu->ucolind = NULL; ldu->uvalues = NULL; ldu->dvalues = NULL; ldu->nrm2s = NULL; ldu->perm = NULL; ldu->iperm = NULL; /* Note that because we allow matrix to be NULL at this point so that it can be set later with a SetMatrix call, we do nothing with matrix except insert it into the structure */ hypre_DistributedMatrixPilutSolverMatrix(solver) = matrix; /* Defaults for Parameters controlling the incomplete factorization */ hypre_DistributedMatrixPilutSolverGmaxnz(solver) = 20; /* Maximum nonzeroes per row of factor */ hypre_DistributedMatrixPilutSolverTol(solver) = 0.000001; /* Drop tolerance for factor */ /* Return created structure to calling routine */ *new_solver = ( (HYPRE_DistributedMatrixPilutSolver) solver ); return hypre_error_flag; } /*-------------------------------------------------------------------------- * HYPRE_FreeDistributedMatrixPilutSolver *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_FreeDistributedMatrixPilutSolver ( HYPRE_DistributedMatrixPilutSolver in_ptr ) { FactorMatType *ldu; hypre_DistributedMatrixPilutSolver *solver = (hypre_DistributedMatrixPilutSolver *) in_ptr; #ifdef HYPRE_TIMING hypre_PilutSolverGlobals *globals; globals = hypre_DistributedMatrixPilutSolverGlobals(solver); #endif hypre_TFree( DataDistTypeRowdist(hypre_DistributedMatrixPilutSolverDataDist(solver)), HYPRE_MEMORY_HOST); hypre_TFree( hypre_DistributedMatrixPilutSolverDataDist(solver) , HYPRE_MEMORY_HOST); /* Free malloced members of the FactorMat member */ ldu = hypre_DistributedMatrixPilutSolverFactorMat(solver); hypre_TFree( ldu->lcolind , HYPRE_MEMORY_HOST); hypre_TFree( ldu->ucolind , HYPRE_MEMORY_HOST); hypre_TFree( ldu->lvalues , HYPRE_MEMORY_HOST); hypre_TFree( ldu->uvalues , HYPRE_MEMORY_HOST); hypre_TFree( ldu->lrowptr , HYPRE_MEMORY_HOST); hypre_TFree( ldu->urowptr , HYPRE_MEMORY_HOST); hypre_TFree( ldu->dvalues , HYPRE_MEMORY_HOST); hypre_TFree( ldu->nrm2s , HYPRE_MEMORY_HOST); hypre_TFree( ldu->perm , HYPRE_MEMORY_HOST); hypre_TFree( ldu->iperm , HYPRE_MEMORY_HOST); hypre_TFree( ldu->gatherbuf , HYPRE_MEMORY_HOST); hypre_TFree( ldu->lx , HYPRE_MEMORY_HOST); hypre_TFree( ldu->ux , HYPRE_MEMORY_HOST); /* Beginning of TriSolveCommType freeing */ hypre_TFree( ldu->lcomm.raddr , HYPRE_MEMORY_HOST); hypre_TFree( ldu->ucomm.raddr , HYPRE_MEMORY_HOST); hypre_TFree( ldu->lcomm.spes , HYPRE_MEMORY_HOST); hypre_TFree( ldu->ucomm.spes , HYPRE_MEMORY_HOST); hypre_TFree( ldu->lcomm.sptr , HYPRE_MEMORY_HOST); hypre_TFree( ldu->ucomm.sptr , HYPRE_MEMORY_HOST); hypre_TFree( ldu->lcomm.sindex , HYPRE_MEMORY_HOST); hypre_TFree( ldu->ucomm.sindex , HYPRE_MEMORY_HOST); hypre_TFree( ldu->lcomm.auxsptr , HYPRE_MEMORY_HOST); hypre_TFree( ldu->ucomm.auxsptr , HYPRE_MEMORY_HOST); hypre_TFree( ldu->lcomm.rpes , HYPRE_MEMORY_HOST); hypre_TFree( ldu->ucomm.rpes , HYPRE_MEMORY_HOST); hypre_TFree( ldu->lcomm.rdone , HYPRE_MEMORY_HOST); hypre_TFree( ldu->ucomm.rdone , HYPRE_MEMORY_HOST); hypre_TFree( ldu->lcomm.rnum , HYPRE_MEMORY_HOST); hypre_TFree( ldu->ucomm.rnum , HYPRE_MEMORY_HOST); /* End of TriSolveCommType freeing */ hypre_TFree( hypre_DistributedMatrixPilutSolverFactorMat(solver) , HYPRE_MEMORY_HOST); /* End of FactorMat member */ #ifdef HYPRE_TIMING hypre_FinalizeTiming( globals->CCI_timer ); hypre_FinalizeTiming( globals->SS_timer ); hypre_FinalizeTiming( globals->SFR_timer ); hypre_FinalizeTiming( globals->CR_timer ); hypre_FinalizeTiming( globals->FL_timer ); hypre_FinalizeTiming( globals->SLUD_timer ); hypre_FinalizeTiming( globals->SLUM_timer ); hypre_FinalizeTiming( globals->UL_timer ); hypre_FinalizeTiming( globals->FNR_timer ); hypre_FinalizeTiming( globals->Ll_timer ); hypre_FinalizeTiming( globals->Lp_timer ); hypre_FinalizeTiming( globals->Up_timer ); hypre_FinalizeTiming( globals->Ul_timer ); #endif hypre_TFree( hypre_DistributedMatrixPilutSolverGlobals(solver) , HYPRE_MEMORY_HOST); hypre_TFree(solver, HYPRE_MEMORY_HOST); return(0); } /*-------------------------------------------------------------------------- * HYPRE_DistributedMatrixPilutSolverInitialize *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_DistributedMatrixPilutSolverInitialize( HYPRE_DistributedMatrixPilutSolver solver ) { HYPRE_UNUSED_VAR(solver); return(0); } /*-------------------------------------------------------------------------- * HYPRE_DistributedMatrixPilutSolverSetMatrix *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_DistributedMatrixPilutSolverSetMatrix( HYPRE_DistributedMatrixPilutSolver in_ptr, HYPRE_DistributedMatrix matrix ) { hypre_DistributedMatrixPilutSolver *solver = (hypre_DistributedMatrixPilutSolver *) in_ptr; hypre_DistributedMatrixPilutSolverMatrix( solver ) = matrix; return hypre_error_flag; } /*-------------------------------------------------------------------------- * HYPRE_DistributedMatrixPilutSolverGetMatrix *--------------------------------------------------------------------------*/ HYPRE_DistributedMatrix HYPRE_DistributedMatrixPilutSolverGetMatrix( HYPRE_DistributedMatrixPilutSolver in_ptr ) { hypre_DistributedMatrixPilutSolver *solver = (hypre_DistributedMatrixPilutSolver *) in_ptr; return( hypre_DistributedMatrixPilutSolverMatrix( solver ) ); } /*-------------------------------------------------------------------------- * HYPRE_DistributedMatrixPilutSolverSetFirstLocalRow *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_DistributedMatrixPilutSolverSetNumLocalRow( HYPRE_DistributedMatrixPilutSolver in_ptr, HYPRE_Int FirstLocalRow ) { hypre_DistributedMatrixPilutSolver *solver = (hypre_DistributedMatrixPilutSolver *) in_ptr; hypre_PilutSolverGlobals *globals = hypre_DistributedMatrixPilutSolverGlobals(solver); DataDistTypeRowdist(hypre_DistributedMatrixPilutSolverDataDist( solver ))[mype] = FirstLocalRow; return hypre_error_flag; } /*-------------------------------------------------------------------------- * HYPRE_DistributedMatrixPilutSolverSetFactorRowSize * Sets the maximum number of entries to be kept in the incomplete factors * This number applies both to the row of L, and also separately to the * row of U. *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_DistributedMatrixPilutSolverSetFactorRowSize( HYPRE_DistributedMatrixPilutSolver in_ptr, HYPRE_Int size ) { hypre_DistributedMatrixPilutSolver *solver = (hypre_DistributedMatrixPilutSolver *) in_ptr; hypre_DistributedMatrixPilutSolverGmaxnz( solver ) = size; return hypre_error_flag; } /*-------------------------------------------------------------------------- * HYPRE_DistributedMatrixPilutSolverSetDropTolerance *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_DistributedMatrixPilutSolverSetDropTolerance( HYPRE_DistributedMatrixPilutSolver in_ptr, HYPRE_Real tolerance ) { hypre_DistributedMatrixPilutSolver *solver = (hypre_DistributedMatrixPilutSolver *) in_ptr; hypre_DistributedMatrixPilutSolverTol( solver ) = tolerance; return hypre_error_flag; } /*-------------------------------------------------------------------------- * HYPRE_DistributedMatrixPilutSolverSetMaxIts *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_DistributedMatrixPilutSolverSetMaxIts( HYPRE_DistributedMatrixPilutSolver in_ptr, HYPRE_Int its ) { hypre_DistributedMatrixPilutSolver *solver = (hypre_DistributedMatrixPilutSolver *) in_ptr; hypre_DistributedMatrixPilutSolverMaxIts( solver ) = its; return hypre_error_flag; } HYPRE_Int HYPRE_DistributedMatrixPilutSolverSetLogging( HYPRE_DistributedMatrixPilutSolver in_ptr, HYPRE_Int logging ) { hypre_DistributedMatrixPilutSolver *solver = (hypre_DistributedMatrixPilutSolver *) in_ptr; hypre_PilutSolverGlobals *globals = hypre_DistributedMatrixPilutSolverGlobals(solver); if (globals) { globals->logging = logging; } return hypre_error_flag; } /*-------------------------------------------------------------------------- * HYPRE_DistributedMatrixPilutSolverSetup *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_DistributedMatrixPilutSolverSetup( HYPRE_DistributedMatrixPilutSolver in_ptr ) { HYPRE_Int nprocs, *rowdist, ierr; HYPRE_BigInt m, n, start, end, col0, coln; hypre_DistributedMatrixPilutSolver *solver = (hypre_DistributedMatrixPilutSolver *) in_ptr; hypre_PilutSolverGlobals *globals = hypre_DistributedMatrixPilutSolverGlobals(solver); if(hypre_DistributedMatrixPilutSolverMatrix(solver) == NULL ) { hypre_error_in_arg(1); /* hypre_printf("Cannot call setup to solver until matrix has been set\n");*/ /* return hypre_error_flag; */ } /* Set up the DataDist structure */ HYPRE_DistributedMatrixGetDims( hypre_DistributedMatrixPilutSolverMatrix(solver), &m, &n); DataDistTypeNrows( hypre_DistributedMatrixPilutSolverDataDist( solver ) ) = m; HYPRE_DistributedMatrixGetLocalRange( hypre_DistributedMatrixPilutSolverMatrix(solver), &start, &end, &col0, &coln); DataDistTypeLnrows(hypre_DistributedMatrixPilutSolverDataDist( solver )) = end - start + 1; /* Set up DataDist entry in distributed_solver */ /* This requires that each processor know which rows are owned by each proc */ nprocs = npes; rowdist = DataDistTypeRowdist( hypre_DistributedMatrixPilutSolverDataDist( solver ) ); hypre_MPI_Allgather( &start, 1, HYPRE_MPI_INT, rowdist, 1, HYPRE_MPI_INT, hypre_DistributedMatrixPilutSolverComm(solver) ); rowdist[ nprocs ] = n; #ifdef HYPRE_TIMING { HYPRE_Int ilut_timer; ilut_timer = hypre_InitializeTiming( "hypre_ILUT factorization" ); hypre_BeginTiming( ilut_timer ); #endif /* Perform approximate factorization */ ierr = hypre_ILUT( hypre_DistributedMatrixPilutSolverDataDist (solver), hypre_DistributedMatrixPilutSolverMatrix (solver), hypre_DistributedMatrixPilutSolverFactorMat (solver), hypre_DistributedMatrixPilutSolverGmaxnz (solver), hypre_DistributedMatrixPilutSolverTol (solver), hypre_DistributedMatrixPilutSolverGlobals (solver) ); #ifdef HYPRE_TIMING hypre_EndTiming( ilut_timer ); /* hypre_FinalizeTiming( ilut_timer ); */ } #endif if (ierr) { hypre_error(HYPRE_ERROR_GENERIC); /* return hypre_error_flag; */ } #ifdef HYPRE_TIMING { HYPRE_Int Setup_timer; Setup_timer = hypre_InitializeTiming( "hypre_SetUpLUFactor: setup for triangular solvers"); hypre_BeginTiming( Setup_timer ); #endif ierr = hypre_SetUpLUFactor( hypre_DistributedMatrixPilutSolverDataDist (solver), hypre_DistributedMatrixPilutSolverFactorMat (solver), hypre_DistributedMatrixPilutSolverGmaxnz (solver), hypre_DistributedMatrixPilutSolverGlobals (solver) ); #ifdef HYPRE_TIMING hypre_EndTiming( Setup_timer ); /* hypre_FinalizeTiming( Setup_timer ); */ } #endif if (ierr) { hypre_error(HYPRE_ERROR_GENERIC); /* return hypre_error_flag; */ } #ifdef HYPRE_DEBUG HYPRE_Int logging = globals ? globals->logging : 0; if (logging) { fflush(stdout); hypre_printf("Nlevels: %d\n", hypre_DistributedMatrixPilutSolverFactorMat (solver)->nlevels); } #endif return hypre_error_flag; } /*-------------------------------------------------------------------------- * HYPRE_DistributedMatrixPilutSolverSolve *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_DistributedMatrixPilutSolverSolve( HYPRE_DistributedMatrixPilutSolver in_ptr, HYPRE_Real *x, HYPRE_Real *b ) { hypre_DistributedMatrixPilutSolver *solver = (hypre_DistributedMatrixPilutSolver *) in_ptr; /******** NOTE: Since I am using this currently as a preconditioner, I am only doing a single front and back solve. To be a general-purpose solver, this call should really be in a loop checking convergence and counting iterations. AC - 2/12/98 */ /* It should be obvious, but the current treatment of vectors is pretty insufficient. -AC 2/12/98 */ #ifdef HYPRE_TIMING { HYPRE_Int LDUSolve_timer; LDUSolve_timer = hypre_InitializeTiming( "hypre_ILUT application" ); hypre_BeginTiming( LDUSolve_timer ); #endif hypre_LDUSolve( hypre_DistributedMatrixPilutSolverDataDist (solver), hypre_DistributedMatrixPilutSolverFactorMat (solver), x, b, hypre_DistributedMatrixPilutSolverGlobals (solver) ); #ifdef HYPRE_TIMING hypre_EndTiming( LDUSolve_timer ); /* hypre_FinalizeTiming ( LDUSolve_timer ); */ } #endif return hypre_error_flag; } hypre-2.33.0/src/distributed_ls/pilut/HYPRE_DistributedMatrixPilutSolver_protos.h000066400000000000000000000034551477326011500303150ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /* HYPRE_DistributedMatrixPilutSolver.c */ HYPRE_Int HYPRE_NewDistributedMatrixPilutSolver (MPI_Comm comm , HYPRE_DistributedMatrix matrix, HYPRE_DistributedMatrixPilutSolver *solver ); HYPRE_Int HYPRE_FreeDistributedMatrixPilutSolver (HYPRE_DistributedMatrixPilutSolver in_ptr ); HYPRE_Int HYPRE_DistributedMatrixPilutSolverInitialize (HYPRE_DistributedMatrixPilutSolver solver ); HYPRE_Int HYPRE_DistributedMatrixPilutSolverSetMatrix (HYPRE_DistributedMatrixPilutSolver in_ptr , HYPRE_DistributedMatrix matrix ); HYPRE_DistributedMatrix HYPRE_DistributedMatrixPilutSolverGetMatrix (HYPRE_DistributedMatrixPilutSolver in_ptr ); HYPRE_Int HYPRE_DistributedMatrixPilutSolverSetNumLocalRow (HYPRE_DistributedMatrixPilutSolver in_ptr , HYPRE_Int FirstLocalRow ); HYPRE_Int HYPRE_DistributedMatrixPilutSolverSetFactorRowSize (HYPRE_DistributedMatrixPilutSolver in_ptr , HYPRE_Int size ); HYPRE_Int HYPRE_DistributedMatrixPilutSolverSetDropTolerance (HYPRE_DistributedMatrixPilutSolver in_ptr , HYPRE_Real tolerance ); HYPRE_Int HYPRE_DistributedMatrixPilutSolverSetMaxIts (HYPRE_DistributedMatrixPilutSolver in_ptr , HYPRE_Int its ); HYPRE_Int HYPRE_DistributedMatrixPilutSolverSetup (HYPRE_DistributedMatrixPilutSolver in_ptr ); HYPRE_Int HYPRE_DistributedMatrixPilutSolverSolve (HYPRE_DistributedMatrixPilutSolver in_ptr , HYPRE_Real *x , HYPRE_Real *b ); HYPRE_Int HYPRE_DistributedMatrixPilutSolverSetLogging( HYPRE_DistributedMatrixPilutSolver in_ptr, HYPRE_Int logging ); hypre-2.33.0/src/distributed_ls/pilut/HYPRE_DistributedMatrixPilutSolver_types.h000066400000000000000000000013751477326011500301320ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * Header info for the hypre_DistributedMatrix structures * *****************************************************************************/ #ifndef HYPRE_DISTRIBUTED_MATRIX_SOLVER_PILUT_TYPES_HEADER #define HYPRE_DISTRIBUTED_MATRIX_SOLVER_PILUT_TYPES_HEADER typedef void *HYPRE_DistributedMatrixPilutSolver; #endif hypre-2.33.0/src/distributed_ls/pilut/Makefile000066400000000000000000000036761477326011500213540ustar00rootroot00000000000000# Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) include ../../config/Makefile.config CINCLUDES = ${INCLUDES} ${MPIINCLUDE} C_COMPILE_FLAGS = \ -I../..\ -I$(srcdir)\ -I$(srcdir)/../..\ -I$(srcdir)/../../blas\ -I$(srcdir)/../../utilities\ -I$(srcdir)/../../distributed_matrix\ ${CINCLUDES} HEADERS = \ HYPRE_DistributedMatrixPilutSolver_protos.h\ HYPRE_DistributedMatrixPilutSolver_types.h\ DistributedMatrixPilutSolver.h\ const.h\ ilu.h\ internal_protos.h\ macros.h\ struct.h FILES =\ comm.c\ debug.c\ distributed_qsort.c\ distributed_qsort_si.c\ HYPRE_DistributedMatrixPilutSolver.c\ ilut.c\ parilut.c\ parutil.c\ pblas1.c\ serilut.c\ trifactor.c\ util.c OBJS = ${FILES:.c=.o} SONAME = libHYPRE_DistributedMatrixPilutSolver-${HYPRE_RELEASE_VERSION}${HYPRE_LIB_SUFFIX} ################################################################## # Targets ################################################################## all: libHYPRE_DistributedMatrixPilutSolver${HYPRE_LIB_SUFFIX} cp -fR $(srcdir)/HYPRE_*.h $(HYPRE_BUILD_DIR)/include # cp -fR libHYPRE* $(HYPRE_BUILD_DIR)/lib install: libHYPRE_DistributedMatrixPilutSolver${HYPRE_LIB_SUFFIX} cp -fR $(srcdir)/HYPRE_*.h $(HYPRE_INC_INSTALL) # cp -fR libHYPRE* $(HYPRE_LIB_INSTALL) clean: rm -f *.o libHYPRE* rm -rf pchdir tca.map *inslog* distclean: clean ################################################################## # Main rules ################################################################## libHYPRE_DistributedMatrixPilutSolver.a: ${OBJS} @echo "Building $@ ... " ${AR} $@ ${OBJS} ${RANLIB} $@ libHYPRE_DistributedMatrixPilutSolver.so libHYPRE_DistributedMatrixPilutSolver.dylib: ${OBJS} @echo "Building $@ ... " ${BUILD_CC_SHARED} -o ${SONAME} ${OBJS} ${SHARED_SET_SONAME}${SONAME} ln -s -f ${SONAME} $@ ${OBJS}: ${HEADERS} hypre-2.33.0/src/distributed_ls/pilut/comm.c000066400000000000000000000063571477326011500210120ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /* * comm.c * * This function provides a communication function interface to * T3D's pvm * * 7/8 * - MPI and verified * 7/11 * - removed shmem validation */ #include "HYPRE_config.h" #include /* #include */ #include #include "DistributedMatrixPilutSolver.h" /************************************************************************* * High level collective routines **************************************************************************/ /************************************************************************* * This function computes the max of a single element **************************************************************************/ HYPRE_Int hypre_GlobalSEMax(HYPRE_Int value, MPI_Comm hypre_MPI_Context ) { HYPRE_Int max; hypre_MPI_Allreduce( &value, &max, 1, HYPRE_MPI_INT, hypre_MPI_MAX, hypre_MPI_Context ); return max; } /************************************************************************* * This function computes the max of a single element **************************************************************************/ HYPRE_Int hypre_GlobalSEMin(HYPRE_Int value, MPI_Comm hypre_MPI_Context) { HYPRE_Int min; hypre_MPI_Allreduce( &value, &min, 1, HYPRE_MPI_INT, hypre_MPI_MIN, hypre_MPI_Context ); return min; } /************************************************************************* * This function computes the max of a single element **************************************************************************/ HYPRE_Int hypre_GlobalSESum(HYPRE_Int value, MPI_Comm hypre_MPI_Context) { HYPRE_Int sum; hypre_MPI_Allreduce( &value, &sum, 1, HYPRE_MPI_INT, hypre_MPI_SUM, hypre_MPI_Context ); return sum; } /************************************************************************* * This function computes the max of a single element **************************************************************************/ HYPRE_Real hypre_GlobalSEMaxDouble(HYPRE_Real value, MPI_Comm hypre_MPI_Context) { HYPRE_Real max; hypre_MPI_Allreduce( &value, &max, 1, hypre_MPI_REAL, hypre_MPI_MAX, hypre_MPI_Context ); return max; } /************************************************************************* * This function computes the max of a single element **************************************************************************/ HYPRE_Real hypre_GlobalSEMinDouble(HYPRE_Real value, MPI_Comm hypre_MPI_Context) { HYPRE_Real min; hypre_MPI_Allreduce( &value, &min, 1, hypre_MPI_REAL, hypre_MPI_MIN, hypre_MPI_Context ); return min; } /************************************************************************* * This function computes the max of a single element **************************************************************************/ HYPRE_Real hypre_GlobalSESumDouble(HYPRE_Real value, MPI_Comm hypre_MPI_Context) { HYPRE_Real sum; hypre_MPI_Allreduce( &value, &sum, 1, hypre_MPI_REAL, hypre_MPI_SUM, hypre_MPI_Context ); return sum; } hypre-2.33.0/src/distributed_ls/pilut/const.h000066400000000000000000000017301477326011500212000ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #ifndef CONST_H #define CONST_H /* * const.h * * This file contains MPI specific tag constants for send/recvs * In the LDU solves, the lower 16bits are used for the nlevel */ enum Tags { /* io.c */ TAG_CSR_dist, TAG_CSR_rowdist, TAG_CSR_rowptr, TAG_CSR_colind, TAG_CSR_values, /* matvec.c */ TAG_MV_rind, TAG_MVGather, /* parilut.c */ TAG_Comm_rrowind, TAG_Send_colind, TAG_Send_values, /* trifactor.c */ TAG_SetUp_rind, TAG_SetUp_reord, TAG_SetUp_rnum, TAG_LDU_lx = 0x0100, /* uses low 16bits */ TAG_LDU_ux = 0x0200 /* uses low 16bits */ }; #endif hypre-2.33.0/src/distributed_ls/pilut/debug.c000066400000000000000000000170451477326011500211410ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /* * debug.c * * This file implements some debugging utilities. * I use checksums to compare entire arrays easily. Note that the * perm and iperm arrays always have the same checksum, even * though they are in a different order. * * Started 7/8/97 * Mark * */ #undef NDEBUG #include "./DistributedMatrixPilutSolver.h" /************************************************************************* * This function prints a message and file/line number **************************************************************************/ void hypre_PrintLine(const char *str, hypre_PilutSolverGlobals *globals) { HYPRE_Int logging = globals ? globals->logging : 0; if (logging) { hypre_printf("PE %d ---- %-27s (%s, %d)\n", mype, str, __FILE__, __LINE__); } fflush(stdout); } /************************************************************************* * This function exits if i is not in [low, up) **************************************************************************/ void hypre_CheckBounds(HYPRE_Int low, HYPRE_Int i ,HYPRE_Int up, hypre_PilutSolverGlobals *globals) { if ((i < low) || (i >= up)) hypre_errexit("PE %d Bad bound: %d <= %d < %d (%s %d)\n", mype, low, i, up, __FILE__, __LINE__ ); } /************************************************************************* * This function prints a checksum for an HYPRE_Int (HYPRE_Int) array **************************************************************************/ hypre_longint hypre_IDX_Checksum(const HYPRE_Int *v, HYPRE_Int len, const char *msg, HYPRE_Int tag, hypre_PilutSolverGlobals *globals) { HYPRE_Int logging = globals ? globals->logging : 0; static HYPRE_Int numChk = 0; HYPRE_Int i; hypre_ulongint sum = 0; for (i=0; ilogging : 0; static HYPRE_Int numChk = 0; HYPRE_Int i; hypre_ulongint sum = 0; for (i=0; ilogging : 0; static HYPRE_Int numChk = 0; HYPRE_Int i; hypre_ulongint sum = 0; HYPRE_Int *vv = (HYPRE_Int*)v; for (i=0; ilogging : 0; HYPRE_Int i; static HYPRE_Int numChk = 0; /* for safety */ if ( rmat == NULL || rmat->rmat_rnz == NULL || rmat->rmat_rrowlen == NULL || rmat->rmat_rcolind == NULL || rmat->rmat_rvalues == NULL ) { if (logging) { hypre_printf("PE %d [r%3d] rmat checksum -- not initializied\n", mype, numChk); fflush(stdout); } numChk++; return 0; } if (logging) { /* print ints */ hypre_printf("PE %d [r%3d] rmat checksum -- ndone %d ntogo %d nlevel %d\n", mype, numChk, rmat->rmat_ndone, rmat->rmat_ntogo, rmat->rmat_nlevel); fflush(stdout); } /* print checksums for each array */ hypre_IDX_Checksum(rmat->rmat_rnz, rmat->rmat_ntogo, "rmat->rmat_rnz", numChk, globals); hypre_IDX_Checksum(rmat->rmat_rrowlen, rmat->rmat_ntogo, "rmat->rmat_rrowlen", numChk, globals); for (i=0; irmat_ntogo; i++) { hypre_IDX_Checksum(rmat->rmat_rcolind[i], rmat->rmat_rrowlen[i], "rmat->rmat_rcolind", i, globals); hypre_FP_Checksum(rmat->rmat_rvalues[i], rmat->rmat_rrowlen[i], "rmat->rmat_rvalues", i, globals); } return 1; } /************************************************************************* * This function prints checksums for some arrays of the LDU struct **************************************************************************/ hypre_longint hypre_LDU_Checksum(const FactorMatType *ldu, hypre_PilutSolverGlobals *globals) { HYPRE_Int logging = globals ? globals->logging : 0; HYPRE_Int i, j; hypre_ulongint lisum=0, ldsum=0, uisum=0, udsum=0, dsum=0; static HYPRE_Int numChk = 0; if (ldu->lsrowptr == NULL || ldu->lerowptr == NULL || ldu->lcolind == NULL || ldu->lvalues == NULL || ldu->usrowptr == NULL || ldu->uerowptr == NULL || ldu->ucolind == NULL || ldu->uvalues == NULL || ldu->dvalues == NULL || ldu->nrm2s == NULL) { hypre_printf("PE %d [S%3d] LDU check -- not initializied\n", mype, numChk); fflush(stdout); return 0; } for (i=0; ilsrowptr[i]; jlerowptr[i]; j++) { lisum += ldu->lcolind[j]; ldsum += (hypre_longint)ldu->lvalues[j]; } for (j=ldu->usrowptr[i]; juerowptr[i]; j++) { uisum += ldu->ucolind[j]; udsum += (hypre_longint)ldu->uvalues[j]; } if (ldu->usrowptr[i] < ldu->uerowptr[i]) dsum += (hypre_longint)ldu->dvalues[i]; } if (logging) { hypre_printf("PE %d [S%3d] LDU check [%16lx %16lx] [%16lx] [%16lx %16lx]\n", mype, numChk, lisum, ldsum, dsum, uisum, udsum); fflush(stdout); } hypre_FP_Checksum(ldu->nrm2s, lnrows, "2-norms", numChk, globals); return 1; } /************************************************************************* * This function prints a vector on each processor **************************************************************************/ void hypre_PrintVector(HYPRE_Int *v, HYPRE_Int n, char *msg, hypre_PilutSolverGlobals *globals) { HYPRE_Int logging = globals ? globals->logging : 0; HYPRE_Int i, penum; for (penum=0; penum /* only for type declarations */ #include "_hypre_utilities.h" #define THRESH 4 /* threshold for insertion */ #define MTHRESH 6 /* threshold for median */ static HYPRE_Int (*qcmp) (char*,char*); /* the comparison routine */ static HYPRE_Int qsz; /* size of each record */ static void qst(char *, char *); static HYPRE_Int thresh; /* THRESHold in chars */ static HYPRE_Int mthresh; /* MTHRESHold in chars */ /* * hypre_tex_qsort: * First, set up some global parameters for qst to share. Then, quicksort * with qst(), and then a cleanup insertion sort ourselves. Sound simple? * It's not... */ void hypre_tex_qsort(char* base,HYPRE_Int n,HYPRE_Int size, HYPRE_Int (*compar) (char*,char*)) { REGISTER char *i; REGISTER char *j; REGISTER char *lo; REGISTER char *hi; REGISTER char *min; REGISTER char c; char *max; if (n <= 1) return; qsz = size; qcmp = compar; thresh = qsz * THRESH; mthresh = qsz * MTHRESH; max = base + n * qsz; if (n >= THRESH) { qst(base, max); hi = base + thresh; } else { hi = max; } /* First put smallest element, which must be in the first THRESH, in the first position as a sentinel. This is done just by searching the first THRESH elements (or the first n if n < THRESH), finding the min, and swapping it into the first position. */ for (j = lo = base; (lo += qsz) < hi;) { if ((*qcmp) (j, lo) > 0) j = lo; } if (j != base) { /* swap j into place */ for (i = base, hi = base + qsz; i < hi;) { c = *j; *j++ = *i; *i++ = c; } } /* With our sentinel in place, we now run the following hyper-fast insertion sort. For each remaining element, min, from [1] to [n-1], set hi to the index of the element AFTER which this one goes. Then, do the standard insertion sort shift on a character at a time basis for each element in the frob. */ for (min = base; (hi = min += qsz) < max;) { while ((*qcmp) (hi -= qsz, min) > 0); if ((hi += qsz) != min) { for (lo = min + qsz; --lo >= min;) { c = *lo; for (i = j = lo; (j -= qsz) >= hi; i = j) *i = *j; *i = c; } } } } /* * qst: * Do a quicksort * First, find the median element, and put that one in the first place as the * discriminator. (This "median" is just the median of the first, last and * middle elements). (Using this median instead of the first element is a big * win). Then, the usual partitioning/swapping, followed by moving the * discriminator into the right place. Then, figure out the sizes of the two * partions, do the smaller one recursively and the larger one via a repeat of * this code. Stopping when there are less than THRESH elements in a partition * and cleaning up with an insertion sort (in our caller) is a huge win. * All data swaps are done in-line, which is space-losing but time-saving. * (And there are only three places where this is done). */ static void qst(char *base, char *max) { REGISTER char *i; REGISTER char *j; REGISTER char *jj; REGISTER char *mid; REGISTER HYPRE_Int ii; REGISTER char c; char *tmp; HYPRE_Int lo; HYPRE_Int hi; lo = max - base; /* number of elements as chars */ do { /* At the top here, lo is the number of characters of elements in the current partition. (Which should be max - base). Find the median of the first, last, and middle element and make that the middle element. Set j to largest of first and middle. If max is larger than that guy, then it's that guy, else compare max with loser of first and take larger. Things are set up to prefer the middle, then the first in case of ties. */ mid = i = base + qsz * ((unsigned) (lo / qsz) >> 1); if (lo >= mthresh) { j = ((*qcmp) ((jj = base), i) > 0 ? jj : i); if ((*qcmp) (j, (tmp = max - qsz)) > 0) { j = (j == jj ? i : jj); /* switch to first loser */ if ((*qcmp) (j, tmp) < 0) j = tmp; } if (j != i) { ii = qsz; do { c = *i; *i++ = *j; *j++ = c; } while (--ii); } } /* Semi-standard quicksort partitioning/swapping */ for (i = base, j = max - qsz;;) { while (i < mid && (*qcmp) (i, mid) <= 0) i += qsz; while (j > mid) { if ((*qcmp) (mid, j) <= 0) { j -= qsz; continue; } tmp = i + qsz; /* value of i after swap */ if (i == mid) { /* j <-> mid, new mid is j */ mid = jj = j; } else { /* i <-> j */ jj = j; j -= qsz; } goto swap; } if (i == mid) { break; } else { /* i <-> mid, new mid is i */ jj = mid; tmp = mid = i; /* value of i after swap */ j -= qsz; } swap: ii = qsz; do { c = *i; *i++ = *jj; *jj++ = c; } while (--ii); i = tmp; } /* Look at sizes of the two partitions, do the smaller one first by recursion, then do the larger one by making sure lo is its size, base and max are update correctly, and branching back. But only repeat (recursively or by branching) if the partition is of at least size THRESH. */ i = (j = mid) + qsz; if ((lo = j - base) <= (hi = max - i)) { if (lo >= thresh) qst(base, j); base = i; lo = hi; } else { if (hi >= thresh) qst(i, max); max = j; } } while (lo >= thresh); } hypre-2.33.0/src/distributed_ls/pilut/distributed_qsort_si.c000066400000000000000000000230331477326011500243120ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #ifdef __cplusplus #define REGISTER #else #define REGISTER register #endif /* * distributed_qsort.c: * Our own version of the system qsort routine which is faster by an average * of 25%, with lows and highs of 10% and 50%. * The THRESHold below is the insertion sort threshold, and has been adjusted * for records of size 48 bytes. * The MTHREShold is where we stop finding a better median. */ #include /* only for type declarations */ #include /* only for type declarations */ #include "ilu.h" #define THRESH 1 /* threshold for insertion */ #define MTHRESH 6 /* threshold for median */ static void siqst(HYPRE_Int *, HYPRE_Int *); static void sdqst(HYPRE_Int *, HYPRE_Int *); /* * hypre_tex_qsort: * First, set up some global parameters for qst to share. Then, quicksort * with qst(), and then a cleanup insertion sort ourselves. Sound simple? * It's not... */ void hypre_sincsort_fast(HYPRE_Int n, HYPRE_Int *base) { REGISTER HYPRE_Int *i; REGISTER HYPRE_Int *j; REGISTER HYPRE_Int *lo; REGISTER HYPRE_Int *hi; REGISTER HYPRE_Int *min; REGISTER HYPRE_Int c; HYPRE_Int *max; if (n <= 1) return; max = base + n; if (n >= THRESH) { siqst(base, max); hi = base + THRESH; } else hi = max; /* First put smallest element, which must be in the first THRESH, in the first position as a sentinel. This is done just by searching the first THRESH elements (or the first n if n < THRESH), finding the min, and swapping it into the first position. */ for (j = lo = base; lo++ < hi;) { if (*j > *lo) j = lo; } if (j != base) { /* swap j into place */ c = *base; *base = *j; *j = c; } /* With our sentinel in place, we now run the following hyper-fast insertion sort. For each remaining element, min, from [1] to [n-1], set hi to the index of the element AFTER which this one goes. Then, do the standard insertion sort shift on a character at a time basis for each element in the frob. */ for (min = base; (hi = min += 1) < max;) { while (*(--hi) > *min); if ((hi += 1) != min) { for (lo = min + 1; --lo >= min;) { c = *lo; for (i = j = lo; (j -= 1) >= hi; i = j) *i = *j; *i = c; } } } } /* * qst: * Do a quicksort * First, find the median element, and put that one in the first place as the * discriminator. (This "median" is just the median of the first, last and * middle elements). (Using this median instead of the first element is a big * win). Then, the usual partitioning/swapping, followed by moving the * discriminator into the right place. Then, figure out the sizes of the two * partions, do the smaller one recursively and the larger one via a repeat of * this code. Stopping when there are less than THRESH elements in a partition * and cleaning up with an insertion sort (in our caller) is a huge win. * All data swaps are done in-line, which is space-losing but time-saving. * (And there are only three places where this is done). */ static void siqst(HYPRE_Int *base, HYPRE_Int *max) { REGISTER HYPRE_Int *i; REGISTER HYPRE_Int *j; REGISTER HYPRE_Int *jj; REGISTER HYPRE_Int *mid; REGISTER HYPRE_Int c; HYPRE_Int *tmp; HYPRE_Int lo; HYPRE_Int hi; lo = max - base; /* number of elements as shorts */ do { /* At the top here, lo is the number of characters of elements in the current partition. (Which should be max - base). Find the median of the first, last, and middle element and make that the middle element. Set j to largest of first and middle. If max is larger than that guy, then it's that guy, else compare max with loser of first and take larger. Things are set up to prefer the middle, then the first in case of ties. */ mid = base + ((unsigned) lo>>1); if (lo >= MTHRESH) { j = (*base > *mid ? base : mid); tmp = max - 1; if (*j > *tmp) { j = (j == base ? mid : base); /* switch to first loser */ if (*j < *tmp) j = tmp; } if (j != mid) { /* SWAP */ c = *mid; *mid = *j; *j = c; } } /* Semi-standard quicksort partitioning/swapping */ for (i = base, j = max - 1;;) { while (i < mid && *i <= *mid) i++; while (j > mid) { if (*mid <= *j) { j--; continue; } tmp = i + 1; /* value of i after swap */ if (i == mid) /* j <-> mid, new mid is j */ mid = jj = j; else /* i <-> j */ jj = j--; goto swap; } if (i == mid) break; else { /* i <-> mid, new mid is i */ jj = mid; tmp = mid = i; /* value of i after swap */ j--; } swap: c = *i; *i = *jj; *jj = c; i = tmp; } /* Look at sizes of the two partitions, do the smaller one first by recursion, then do the larger one by making sure lo is its size, base and max are update correctly, and branching back. But only repeat (recursively or by branching) if the partition is of at least size THRESH. */ i = (j = mid) + 1; if ((lo = j - base) <= (hi = max - i)) { if (lo >= THRESH) siqst(base, j); base = i; lo = hi; } else { if (hi >= THRESH) siqst(i, max); max = j; } } while (lo >= THRESH); } /************************************************************************* * A decreasing sort of HYPRE_Int ints **************************************************************************/ void hypre_sdecsort_fast(HYPRE_Int n, HYPRE_Int *base) { REGISTER HYPRE_Int *i; REGISTER HYPRE_Int *j; REGISTER HYPRE_Int *lo; REGISTER HYPRE_Int *hi; REGISTER HYPRE_Int *min; REGISTER HYPRE_Int c; HYPRE_Int *max; if (n <= 1) return; max = base + n; if (n >= THRESH) { sdqst(base, max); hi = base + THRESH; } else hi = max; /* First put smallest element, which must be in the first THRESH, in the first position as a sentinel. This is done just by searching the first THRESH elements (or the first n if n < THRESH), finding the min, and swapping it into the first position. */ for (j = lo = base; lo++ < hi;) { if (*j < *lo) j = lo; } if (j != base) { /* swap j into place */ c = *base; *base = *j; *j = c; } /* With our sentinel in place, we now run the following hyper-fast insertion sort. For each remaining element, min, from [1] to [n-1], set hi to the index of the element AFTER which this one goes. Then, do the standard insertion sort shift on a character at a time basis for each element in the frob. */ for (min = base; (hi = min += 1) < max;) { while (*(--hi) < *min); if ((hi += 1) != min) { for (lo = min + 1; --lo >= min;) { c = *lo; for (i = j = lo; (j -= 1) >= hi; i = j) *i = *j; *i = c; } } } } static void sdqst(HYPRE_Int *base, HYPRE_Int *max) { REGISTER HYPRE_Int *i; REGISTER HYPRE_Int *j; REGISTER HYPRE_Int *jj; REGISTER HYPRE_Int *mid; REGISTER HYPRE_Int c; HYPRE_Int *tmp; HYPRE_Int lo; HYPRE_Int hi; lo = max - base; /* number of elements as shorts */ do { /* At the top here, lo is the number of characters of elements in the current partition. (Which should be max - base). Find the median of the first, last, and middle element and make that the middle element. Set j to largest of first and middle. If max is larger than that guy, then it's that guy, else compare max with loser of first and take larger. Things are set up to prefer the middle, then the first in case of ties. */ mid = base + ((unsigned) lo>>1); if (lo >= MTHRESH) { j = (*base < *mid ? base : mid); tmp = max - 1; if (*j < *tmp) { j = (j == base ? mid : base); /* switch to first loser */ if (*j > *tmp) j = tmp; } if (j != mid) { /* SWAP */ c = *mid; *mid = *j; *j = c; } } /* Semi-standard quicksort partitioning/swapping */ for (i = base, j = max - 1;;) { while (i < mid && *i >= *mid) i++; while (j > mid) { if (*mid >= *j) { j--; continue; } tmp = i + 1; /* value of i after swap */ if (i == mid) /* j <-> mid, new mid is j */ mid = jj = j; else /* i <-> j */ jj = j--; goto swap; } if (i == mid) break; else { /* i <-> mid, new mid is i */ jj = mid; tmp = mid = i; /* value of i after swap */ j--; } swap: c = *i; *i = *jj; *jj = c; i = tmp; } /* Look at sizes of the two partitions, do the smaller one first by recursion, then do the larger one by making sure lo is its size, base and max are update correctly, and branching back. But only repeat (recursively or by branching) if the partition is of at least size THRESH. */ i = (j = mid) + 1; if ((lo = j - base) <= (hi = max - i)) { if (lo >= THRESH) sdqst(base, j); base = i; lo = hi; } else { if (hi >= THRESH) sdqst(i, max); max = j; } } while (lo >= THRESH); } hypre-2.33.0/src/distributed_ls/pilut/ilu.h000066400000000000000000000013441477326011500206440ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #ifndef ILU_H #define ILU_H /* * ilu.h * * This file includes all necessary header files * * Started 9/27/95 * George * * $Id$ */ #include #include #include #include #include #include #include #include "_hypre_utilities.h" #include "macros.h" #include "struct.h" #include "const.h" #endif hypre-2.33.0/src/distributed_ls/pilut/ilut.c000066400000000000000000000131011477326011500210150ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /* * ilut.c * * This file contains the top level code for the parallel hypre_ILUT algorithms * * Started 11/29/95 * George * * $Id$ */ #include #include "./DistributedMatrixPilutSolver.h" /************************************************************************* * This function is the entry point of the hypre_ILUT factorization **************************************************************************/ HYPRE_Int hypre_ILUT(DataDistType *ddist, HYPRE_DistributedMatrix matrix, FactorMatType *ldu, HYPRE_Int maxnz, HYPRE_Real tol, hypre_PilutSolverGlobals *globals ) { HYPRE_Int i, ierr = 0; ReduceMatType rmat; HYPRE_Int dummy_row_ptr[2], size; HYPRE_Real *values; #ifdef HYPRE_DEBUG HYPRE_Int logging = globals ? globals->logging : 0; if (logging) { hypre_printf("hypre_ILUT, maxnz = %d\n ", maxnz); } #endif /* Allocate memory for ldu */ if (ldu->lsrowptr) hypre_TFree(ldu->lsrowptr, HYPRE_MEMORY_HOST); ldu->lsrowptr = hypre_idx_malloc(ddist->ddist_lnrows, "hypre_ILUT: ldu->lsrowptr"); if (ldu->lerowptr) hypre_TFree(ldu->lerowptr, HYPRE_MEMORY_HOST); ldu->lerowptr = hypre_idx_malloc(ddist->ddist_lnrows, "hypre_ILUT: ldu->lerowptr"); if (ldu->lcolind) hypre_TFree(ldu->lcolind, HYPRE_MEMORY_HOST); ldu->lcolind = hypre_idx_malloc_init(maxnz*ddist->ddist_lnrows, 0, "hypre_ILUT: ldu->lcolind"); if (ldu->lvalues) hypre_TFree(ldu->lvalues, HYPRE_MEMORY_HOST); ldu->lvalues = hypre_fp_malloc_init(maxnz*ddist->ddist_lnrows, 0, "hypre_ILUT: ldu->lvalues"); if (ldu->usrowptr) hypre_TFree(ldu->usrowptr, HYPRE_MEMORY_HOST); ldu->usrowptr = hypre_idx_malloc(ddist->ddist_lnrows, "hypre_ILUT: ldu->usrowptr"); if (ldu->uerowptr) hypre_TFree(ldu->uerowptr, HYPRE_MEMORY_HOST); ldu->uerowptr = hypre_idx_malloc(ddist->ddist_lnrows, "hypre_ILUT: ldu->uerowptr"); if (ldu->ucolind) hypre_TFree(ldu->ucolind, HYPRE_MEMORY_HOST); ldu->ucolind = hypre_idx_malloc_init(maxnz*ddist->ddist_lnrows, 0, "hypre_ILUT: ldu->ucolind"); if (ldu->uvalues) hypre_TFree(ldu->uvalues, HYPRE_MEMORY_HOST); ldu->uvalues = hypre_fp_malloc_init(maxnz*ddist->ddist_lnrows, 0.0, "hypre_ILUT: ldu->uvalues"); if (ldu->dvalues) hypre_TFree(ldu->dvalues, HYPRE_MEMORY_HOST); ldu->dvalues = hypre_fp_malloc(ddist->ddist_lnrows, "hypre_ILUT: ldu->dvalues"); if (ldu->nrm2s) hypre_TFree(ldu->nrm2s, HYPRE_MEMORY_HOST); ldu->nrm2s = hypre_fp_malloc_init(ddist->ddist_lnrows, 0.0, "hypre_ILUT: ldu->nrm2s"); if (ldu->perm) hypre_TFree(ldu->perm, HYPRE_MEMORY_HOST); ldu->perm = hypre_idx_malloc_init(ddist->ddist_lnrows, 0, "hypre_ILUT: ldu->perm"); if (ldu->iperm) hypre_TFree(ldu->iperm, HYPRE_MEMORY_HOST); ldu->iperm = hypre_idx_malloc_init(ddist->ddist_lnrows, 0, "hypre_ILUT: ldu->iperm"); firstrow = ddist->ddist_rowdist[mype]; dummy_row_ptr[ 0 ] = 0; /* Initialize ldu */ for (i=0; iddist_lnrows; i++) { ldu->lsrowptr[i] = ldu->lerowptr[i] = ldu->usrowptr[i] = ldu->uerowptr[i] = maxnz*i; ierr = HYPRE_DistributedMatrixGetRow( matrix, firstrow+i, &size, NULL, &values); /* if (ierr) return(ierr);*/ dummy_row_ptr[ 1 ] = size; hypre_ComputeAdd2Nrms( 1, dummy_row_ptr, values, &(ldu->nrm2s[i]) ); ierr = HYPRE_DistributedMatrixRestoreRow( matrix, firstrow+i, &size, NULL, &values); } /* Factor the internal nodes first */ hypre_MPI_Barrier( pilut_comm ); #ifdef HYPRE_TIMING { HYPRE_Int SerILUT_timer; SerILUT_timer = hypre_InitializeTiming( "Sequential hypre_ILUT done on each proc" ); hypre_BeginTiming( SerILUT_timer ); #endif hypre_SerILUT(ddist, matrix, ldu, &rmat, maxnz, tol, globals); hypre_MPI_Barrier( pilut_comm ); #ifdef HYPRE_TIMING hypre_EndTiming( SerILUT_timer ); /* hypre_FinalizeTiming( SerILUT_timer ); */ } #endif /* Factor the interface nodes */ #ifdef HYPRE_TIMING { HYPRE_Int ParILUT_timer; ParILUT_timer = hypre_InitializeTiming( "Parallel portion of hypre_ILUT factorization" ); hypre_BeginTiming( ParILUT_timer ); #endif hypre_ParILUT(ddist, ldu, &rmat, maxnz, tol, globals); hypre_MPI_Barrier( pilut_comm ); #ifdef HYPRE_TIMING hypre_EndTiming( ParILUT_timer ); /* hypre_FinalizeTiming( ParILUT_timer ); */ } #endif /*hypre_free_multi(rmat.rmat_rnz, rmat.rmat_rrowlen, rmat.rmat_rcolind, rmat.rmat_rvalues, -1);*/ hypre_TFree(rmat.rmat_rnz, HYPRE_MEMORY_HOST); hypre_TFree(rmat.rmat_rrowlen, HYPRE_MEMORY_HOST); hypre_TFree(rmat.rmat_rcolind, HYPRE_MEMORY_HOST); hypre_TFree(rmat.rmat_rvalues, HYPRE_MEMORY_HOST); return( ierr ); } /************************************************************************* * This function computes the 2 norms of the rows and adds them into the * nrm2s array ... Changed to "Add" by AJC, Dec 22 1997. **************************************************************************/ void hypre_ComputeAdd2Nrms(HYPRE_Int num_rows, HYPRE_Int *rowptr, HYPRE_Real *values, HYPRE_Real *nrm2s) { HYPRE_Int i, j, n; HYPRE_Real sum; for (i=0; i directly instead */ /* #ifdef MACHINE_IS_CRAY #ifdef USE_SHORT #define SNRM2 SNRM2 #define SDOT SDOT #define SCOPY SCOPY #else #define SNRM2 DNRM2 #define SDOT DDOT #define SCOPY DCOPY #endif #else #ifdef MACHINE_IS_SOLARIS #include "_hypre_blas.h" #ifdef USE_SHORT #define SNRM2 hypre_snrm2 #define SDOT hypre_sdot #define SCOPY hypre_scopy #else #define SNRM2 hypre_dnrm2 #define SDOT hypre_ddot #define SCOPY hypre_dcopy #endif #else #ifdef USE_SHORT #define SNRM2 SNRM2 #define SDOT SDOT #define SCOPY SCOPY #else #define SNRM2 DNRM2 #define SDOT DDOT #define SCOPY DCOPY #endif #endif #endif */ /********************************************************************* * Utility Macros **********************************************************************/ /* MPI and Cray native timers. Note MPI uses doubles while Cray uses longs */ #if defined(MACHINE_IS_CRAY) && MACHINE_IS_CRAY # define cleartimer(tmr) (tmr = 0) # define starttimer(tmr) (tmr -= rtclock()) # define stoptimer(tmr) (tmr += rtclock()) # define gettimer(tmr) ((HYPRE_Real) tmr*_secpertick) typedef hypre_longint timer ; #else # define cleartimer(tmr) (tmr = 0.0) # define starttimer(tmr) (tmr -= hypre_MPI_Wtime()) # define stoptimer(tmr) (tmr += hypre_MPI_Wtime()) # define gettimer(tmr) (tmr) typedef HYPRE_Real timer ; #endif /* This random seed maybe should be dynamic? That produces * different results each run though--is that what we want?? */ #define RandomSeed() (srand(mype+1111)) #define SWAP(a, b, tmp) do {(tmp) = (a); (a) = (b); (b) = (tmp);} while(0) #define MAX(a, b) ((a) >= (b) ? (a) : (b)) #define MIN(a, b) ((a) >= (b) ? (b) : (a)) /* used in parilut.c. The LSB is MIS flag, all higher bits are the row index. */ #define IsInMIS(a) (((a)&1) == 1) #define StripMIS(a) (((a)>>1)) #define IsLocal(a) (((a)&1) == 0) #define StripLocal(a) (((a)>>1)) #endif hypre-2.33.0/src/distributed_ls/pilut/parilut.c000066400000000000000000001332131477326011500215270ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /* * parilut.c * * This file implements the parallel phase of the hypre_ILUT algorithm * * Started 10/21/95 * George * * Taken over by MRGates 7/1/97. * * 7/8 * - added rowlen to rmat and verified * 7/11 * - MPI and validated * - fixed one more problem with rowlen (a rcolind--) * 7/25 * - replaced George's reduction and second drop functions with my own * The biggest difference is since I allow non-diagonal MIS sets then * there is fill into L and the L must be processed in the correct * order. Therefore I reverted to using the workspace as in serilut. * (Note that this changes our answer so it is hard to verify.) * - seperated the second drop function into four stages: * 1) drop below rtol * 2) seperate LU entries * 3) update L for the row * 4) form nrmat or DU for the row * 7/28 * - finished the local factorization to reduce non-diagonal sets. * This allows fillin, but the remote reduction still does not since * all the necesary rows are not recieved yet (and thus it doesn't * know what rows are actually in the MIS--otherwise we could just * ignore MIS fillin for the moment). * 7/29 * - send all factored rows, not just the requested ones (changes hypre_EraseMap also) * - add the (maxnz+2) factor to the map, so for outside nodes, l is the exact index * - removed inrval, instead using the new permutation to know what rows are MIS * - removed map from the cinfo, since it was never refered to but globally * 8/1 * - implemented split PE numbering. change VPE(x) to (x) to get back unsplit numbering. * 8/6 * - Removed split PE numbering. After further testing, this does not seem to be an * improvement, since it increases the number of levels. See par_split.c for that code. */ #include "./DistributedMatrixPilutSolver.h" #include "ilu.h" /************************************************************************* * This function performs hypre_ILUT on the boundary nodes via MIS computation **************************************************************************/ void hypre_ParILUT(DataDistType *ddist, FactorMatType *ldu, ReduceMatType *rmat, HYPRE_Int gmaxnz, HYPRE_Real tol, hypre_PilutSolverGlobals *globals ) { HYPRE_Int nmis, nlevel; CommInfoType cinfo; HYPRE_Int *perm, *iperm, *newiperm, *newperm; ReduceMatType *rmats[2], nrmat; #ifdef HYPRE_DEBUG hypre_PrintLine("hypre_ILUT start", globals); #endif /* Initialize globals */ global_maxnz = gmaxnz; nrows = ddist->ddist_nrows; lnrows = ddist->ddist_lnrows; firstrow = ddist->ddist_rowdist[mype]; lastrow = ddist->ddist_rowdist[mype+1]; perm = ldu->perm; iperm = ldu->iperm; ndone = rmat->rmat_ndone; ntogo = rmat->rmat_ntogo; nleft = hypre_GlobalSESum(ntogo, pilut_comm); rmats[0] = rmat; rmats[1] = &nrmat; /* Initialize and allocate structures, including global workspace */ hypre_ParINIT( &nrmat, &cinfo, ddist->ddist_rowdist, globals ); /* Copy the old perm into new perm vectors at the begining. * After that this is done more or less automatically */ newperm = hypre_idx_malloc(lnrows, "hypre_ParILUT: newperm"); newiperm = hypre_idx_malloc(lnrows, "hypre_ParILUT: newiperm"); hypre_memcpy_idx(newperm, perm, lnrows); hypre_memcpy_idx(newiperm, iperm, lnrows); ldu->nnodes[0] = ndone; nlevel = 0; while( nleft > 0 ) { /* hypre_printf("PE %d Nlevel: %d, Nleft: %d, (%d,%d)\n", * mype, nlevel, nleft, ndone, ntogo); fflush(stdout); */ hypre_ComputeCommInfo(rmats[nlevel%2], &cinfo, ddist->ddist_rowdist, globals ); nmis = hypre_SelectSet(rmats[nlevel%2], &cinfo, perm, iperm, newperm, newiperm, globals ); hypre_FactorLocal(ldu, rmats[nlevel%2], rmats[(nlevel+1)%2], &cinfo, perm, iperm, newperm, newiperm, nmis, tol, globals ); fflush(stdout); hypre_MPI_Barrier(pilut_comm); hypre_SendFactoredRows(ldu, &cinfo, newperm, nmis, globals); fflush(stdout); hypre_MPI_Barrier(pilut_comm); hypre_ComputeRmat(ldu, rmats[nlevel%2], rmats[(nlevel+1)%2], &cinfo, perm, iperm, newperm, newiperm, nmis, tol, globals); hypre_EraseMap(&cinfo, newperm, nmis, globals); /* copy the new portion of the permutation, and the entire inverse * (since updates to the inverse are scattered throughout.) */ hypre_memcpy_idx(perm+ndone, newperm+ndone, ntogo ); hypre_memcpy_idx(iperm, newiperm, lnrows); /* setup next rmat */ nlevel++; ndone = rmats[nlevel%2]->rmat_ndone = ndone+nmis; ntogo = rmats[nlevel%2]->rmat_ntogo = ntogo-nmis; nleft = hypre_GlobalSESum(ntogo, pilut_comm); if (nlevel > MAXNLEVEL) hypre_errexit("Maximum number of levels exceeded!\n", globals); ldu->nnodes[nlevel] = ndone; } ldu->nlevels = nlevel; /*hypre_free_multi(jr, jw, lr, w, map, nrmat.rmat_rnz, nrmat.rmat_rrowlen, nrmat.rmat_rcolind, nrmat.rmat_rvalues, cinfo.gatherbuf, cinfo.rrowind, cinfo.rnbrind, cinfo.rnbrptr, cinfo.snbrind, cinfo.srowind, cinfo.snbrptr, cinfo.incolind, cinfo.invalues, newperm, newiperm, vrowdist, -1);*/ hypre_TFree(jr, HYPRE_MEMORY_HOST); hypre_TFree(jw, HYPRE_MEMORY_HOST); hypre_TFree(hypre_lr, HYPRE_MEMORY_HOST); hypre_TFree(w, HYPRE_MEMORY_HOST); hypre_TFree(pilut_map, HYPRE_MEMORY_HOST); hypre_TFree(nrmat.rmat_rnz, HYPRE_MEMORY_HOST); hypre_TFree(nrmat.rmat_rrowlen, HYPRE_MEMORY_HOST); hypre_TFree(nrmat.rmat_rcolind, HYPRE_MEMORY_HOST); hypre_TFree(nrmat.rmat_rvalues, HYPRE_MEMORY_HOST); hypre_TFree(cinfo.gatherbuf, HYPRE_MEMORY_HOST); hypre_TFree(cinfo.rrowind, HYPRE_MEMORY_HOST); hypre_TFree(cinfo.rnbrind, HYPRE_MEMORY_HOST); hypre_TFree(cinfo.rnbrptr, HYPRE_MEMORY_HOST); hypre_TFree(cinfo.snbrind, HYPRE_MEMORY_HOST); hypre_TFree(cinfo.srowind, HYPRE_MEMORY_HOST); hypre_TFree(cinfo.snbrptr, HYPRE_MEMORY_HOST); hypre_TFree(cinfo.incolind, HYPRE_MEMORY_HOST); hypre_TFree(cinfo.invalues, HYPRE_MEMORY_HOST); hypre_TFree(newperm, HYPRE_MEMORY_HOST); hypre_TFree(newiperm, HYPRE_MEMORY_HOST); hypre_TFree(vrowdist, HYPRE_MEMORY_HOST); jr = NULL; jw = NULL; hypre_lr = NULL; w = NULL; #ifdef HYPRE_DEBUG hypre_PrintLine("hypre_ParILUT done", globals); #endif } /************************************************************************* * This function determines communication info. It assumes (and leaves) * the map in a zero state. If memory requirements increase, it will * free and reallocate memory for send/recieve buffers. Usually memory * doesn't increase since the problem size is decreasing each iteration. * * The rrowind and srowind now have two bits packed into them, so * (rowind>>2) is the index, rowind & 0x1 is lo, rowind & 0x2 is hi, * where lo==1 means the lower half has this nonzero col index, hi==1 means * the upper half has this nonzero col index. **************************************************************************/ void hypre_ComputeCommInfo(ReduceMatType *rmat, CommInfoType *cinfo, HYPRE_Int *rowdist, hypre_PilutSolverGlobals *globals) { HYPRE_Int i, ir, j, k, penum; HYPRE_Int nrecv, nsend, rnnbr, snnbr, maxnrecv, maxnsend; HYPRE_Int *rnz, *rcolind; HYPRE_Int *rrowind, *rnbrptr, *rnbrind, *srowind, *snbrind, *snbrptr; hypre_MPI_Status Status ; hypre_MPI_Request *index_requests; #ifdef HYPRE_DEBUG hypre_PrintLine("hypre_ComputeCommInfo", globals); #endif #ifdef HYPRE_TIMING hypre_BeginTiming( globals->CCI_timer ); #endif rnz = rmat->rmat_rnz; rnbrind = cinfo->rnbrind; rnbrptr = cinfo->rnbrptr; rrowind = cinfo->rrowind; snbrind = cinfo->snbrind; snbrptr = cinfo->snbrptr; /* Determine the indices that are needed */ nrecv = 0; for (ir=0; irrmat_rcolind[ir]; for (j=1; j= lastrow) && pilut_map[k] == 0) { pilut_map[k] = 1; rrowind[nrecv++] = k; } } } /* Sort the indices to be received in increasing order */ hypre_sincsort_fast(nrecv, rrowind); /* Determine processor boundaries in the rowind */ rnnbr = 0; rnbrptr[0] = 0; for (penum=0, j=0; penum= rowdist[penum+1]) break; } if (j-k > 0) { /* Something for pe penum */ rnbrind[rnnbr] = penum; rnbrptr[++rnnbr] = j; } } cinfo->rnnbr = rnnbr; /* reset the map afterwards */ for (i=0; imaxntogo = hypre_GlobalSEMax(ntogo, pilut_comm); maxnrecv = rnnbr*(cinfo->maxntogo); /*hypre_GlobalSEMax(nrecv);*/ /* If memory requirements change, allocate new memory. * The first iteration this always occurs -- see hypre_ParINIT */ if (cinfo->maxnrecv < maxnrecv) { hypre_TFree(cinfo->incolind, HYPRE_MEMORY_HOST); hypre_TFree(cinfo->invalues, HYPRE_MEMORY_HOST); cinfo->incolind = hypre_idx_malloc(maxnrecv*(global_maxnz+2)+1, "hypre_ComputeCommInfo: cinfo->incolind"); cinfo->invalues = hypre_fp_malloc(maxnrecv*(global_maxnz+2)+1, "hypre_ComputeCommInfo: cinfo->invalues"); cinfo->maxnrecv = maxnrecv; } hypre_assert( cinfo->incolind != NULL ); hypre_assert( cinfo->invalues != NULL ); /* Zero our send buffer */ for(i=0; i 0) { nsend += pilu_recv[penum]; snbrind[snnbr] = penum; snbrptr[++snnbr] = nsend; } } cinfo->snnbr = snnbr; /* Allocate requests */ index_requests = hypre_CTAlloc( hypre_MPI_Request, snnbr , HYPRE_MEMORY_HOST); maxnsend = hypre_GlobalSEMax(nsend, pilut_comm); /* If memory requirements change, allocate new memory. * The first iteration this always occurs -- see hypre_ParINIT */ if (cinfo->maxnsend < maxnsend) { hypre_TFree(cinfo->srowind, HYPRE_MEMORY_HOST); cinfo->srowind = hypre_idx_malloc(maxnsend, "hypre_ComputeCommInfo: cinfo->srowind"); cinfo->maxnsend = maxnsend; } hypre_assert( cinfo->srowind != NULL ); srowind = cinfo->srowind; /* issue asynchronous recieves */ for (i=0; iCCI_timer ); #endif /* clean up memory */ hypre_TFree(index_requests, HYPRE_MEMORY_HOST); } /************************************************************************* * This function returns what virtual PE the given row idx is located on. **************************************************************************/ HYPRE_Int hypre_Idx2PE(HYPRE_Int idx, hypre_PilutSolverGlobals *globals) { HYPRE_Int penum = 0; while (idx >= vrowdist[penum+1]) { /* idx >= lastrow? */ penum++; hypre_assert( penum < npes ); } return penum; } /************************************************************************* * This function computes a set that is independant between PEs but may * contain dependencies within a PE. This variant simply gives rows to * the lowest PE possible, which creates some load imbalancing between * the highest and lowest PEs. It also forms the new permutation and * marks the _local_ rows that are in the set (but not remote rows). * For historical reasons the set is called a maximal indep. set (MIS). **************************************************************************/ HYPRE_Int hypre_SelectSet(ReduceMatType *rmat, CommInfoType *cinfo, HYPRE_Int *perm, HYPRE_Int *iperm, HYPRE_Int *newperm, HYPRE_Int *newiperm, hypre_PilutSolverGlobals *globals) { HYPRE_UNUSED_VAR(iperm); HYPRE_Int ir, i, j, k, l, num; HYPRE_Int nnz, snnbr; HYPRE_Int *rcolind, *snbrind, *snbrptr, *srowind; #ifdef HYPRE_DEBUG hypre_PrintLine("hypre_SelectSet", globals); #endif #ifdef HYPRE_TIMING hypre_BeginTiming( globals->SS_timer ); #endif snnbr = cinfo->snnbr; snbrind = cinfo->snbrind; snbrptr = cinfo->snbrptr; srowind = cinfo->srowind; /* determine local rows that do not have non-zeros on higher numbered PEs. */ num = 0; for (ir=0; irrmat_rcolind[ir]; nnz = rmat->rmat_rnz[ir]; for (j=1; j= lastrow) && mype > hypre_Idx2PE(rcolind[j], globals)) break ; } if ( j == nnz ) { /* passed test; put into set */ jw[num++] = i; pilut_map[i] = 1; /* local doesn't need info in high bits */ } } /* check for asymetries -- the triangular solves depend on the set being block diagonal */ for (k=0; kSS_timer ); #endif #ifndef NDEBUG /* DEBUGGING: check map is zero outside of local rows */ for (i=0; iSFR_timer ); #endif snnbr = cinfo->snnbr; snbrind = cinfo->snbrind; rnnbr = cinfo->rnnbr; rnbrind = cinfo->rnbrind; rnbrptr = cinfo->rnbrptr; /* NOTE we cast a (HYPRE_Real*) to an (HYPRE_Int*) */ sgatherbuf = (HYPRE_Int *)cinfo->gatherbuf; dgatherbuf = cinfo->gatherbuf; incolind = cinfo->incolind; invalues = cinfo->invalues; usrowptr = ldu->usrowptr; uerowptr = ldu->uerowptr; ucolind = ldu->ucolind; uvalues = ldu->uvalues; dvalues = ldu->dvalues; /* Allocate requests */ index_requests = hypre_CTAlloc( hypre_MPI_Request, rnnbr , HYPRE_MEMORY_HOST); value_requests = hypre_CTAlloc( hypre_MPI_Request, rnnbr , HYPRE_MEMORY_HOST); /* Issue asynchronous receives for rows from other processors. Asynchronous receives needed to avoid overflowing comm buffers. */ j = 0; cnt = (cinfo->maxntogo)*(global_maxnz+2) ; for (i=0; imaxntogo)*(global_maxnz+2) ; for (i=0; imaxnrecv)*(global_maxnz+2)+2, globals); } #ifdef HYPRE_TIMING hypre_EndTiming( globals->SFR_timer ); #endif /* clean up memory */ hypre_TFree(index_requests, HYPRE_MEMORY_HOST); hypre_TFree(value_requests, HYPRE_MEMORY_HOST); } /************************************************************************* * This function creates the new reduce matrix. It takes as input the * current reduced matrix and the outside nodes sent from other PEs. * Also both the old permutation (which applies to this rmat) and the new * permutation (which applies to the new rmat) are taken as input. After * each row is computed, the number of non-zeros is kept the same. * * Note that all fill elements into the L portion mus fill unto the same * processor as the row being subtracted is, since it is block diagonal. **************************************************************************/ void hypre_ComputeRmat(FactorMatType *ldu, ReduceMatType *rmat, ReduceMatType *nrmat, CommInfoType *cinfo, HYPRE_Int *perm, HYPRE_Int *iperm, HYPRE_Int *newperm, HYPRE_Int *newiperm, HYPRE_Int nmis, HYPRE_Real tol, hypre_PilutSolverGlobals *globals) { HYPRE_UNUSED_VAR(perm); HYPRE_Int i, ir, inr, start, k, kk, l, m, end, nnz; HYPRE_Int *usrowptr, *uerowptr, *ucolind, *incolind, *rcolind, rrowlen; HYPRE_Real *uvalues, *nrm2s, *invalues, *rvalues, *dvalues; HYPRE_Real mult, rtol; #ifdef HYPRE_DEBUG hypre_PrintLine("hypre_ComputeRmat", globals); #endif #ifdef HYPRE_TIMING hypre_BeginTiming( globals->CR_timer ); #endif usrowptr = ldu->usrowptr; uerowptr = ldu->uerowptr; ucolind = ldu->ucolind; uvalues = ldu->uvalues; dvalues = ldu->dvalues; nrm2s = ldu->nrm2s; incolind = cinfo->incolind; invalues = cinfo->invalues; /* OK, now reduce the remaining rows. * inr counts the rows actually factored as an index for the nrmat */ inr = 0; for (ir=ndone+nmis; irrmat_rnz[k]; rmat->rmat_rnz[k] = 0; rcolind = rmat->rmat_rcolind[k]; rmat->rmat_rcolind[k] = NULL; rvalues = rmat->rmat_rvalues[k]; rmat->rmat_rvalues[k] = NULL; rrowlen = rmat->rmat_rrowlen[k]; rmat->rmat_rrowlen[k] = 0; /* Initialize workspace and determine the L indices (ie., MIS). * The L indices are stored as either the row's new local permutation * or the permuted order we recieved the row. The LSB is a flag * for being local (==0) or remote (==1). */ jr[rcolind[0]] = 0; /* store diagonal first */ jw[0] = rcolind[0]; w[0] = rvalues[0]; lastlr = 0; for (lastjr=1; lastjr= firstrow && rcolind[lastjr] < lastrow) hypre_lr[lastlr] = (newiperm[rcolind[lastjr]-firstrow] << 1); else { hypre_lr[lastlr] = pilut_map[rcolind[lastjr]]; /* map[] == (l<<1) | 1 */ hypre_assert(incolind[StripMIS(pilut_map[rcolind[lastjr]])+1] == rcolind[lastjr]); } lastlr++; } jr[rcolind[lastjr]] = lastjr; jw[lastjr] = rcolind[lastjr]; w[lastjr] = rvalues[lastjr]; } hypre_assert(lastjr == nnz); hypre_assert(lastjr > 0); /* Go through the L nonzeros and pull in the contributions */ while( lastlr != 0 ) { k = hypre_ExtractMinLR( globals ); if ( IsLocal(k) ) { /* Local node -- row is in DU */ hypre_CheckBounds(0, StripLocal(k), lnrows, globals); kk = newperm[ StripLocal(k) ]; /* remove the local bit (LSB) */ k = kk+firstrow; hypre_CheckBounds(0, kk, lnrows, globals); hypre_CheckBounds(0, jr[k], lastjr, globals); hypre_assert(jw[jr[k]] == k); mult = w[jr[k]]*dvalues[kk]; w[jr[k]] = mult; if (hypre_abs(mult) < rtol) continue; /* First drop test */ for (l=usrowptr[kk]; l= firstrow && ucolind[l] < lastrow); hypre_lr[lastlr] = (newiperm[ucolind[l]-firstrow] << 1); lastlr++; } /* Create fill */ jr[ucolind[l]] = lastjr; jw[lastjr] = ucolind[l]; w[lastjr] = -mult*uvalues[l]; lastjr++; } else w[m] -= mult*uvalues[l]; } } else { /* Outside node -- row is in incolind/invalues */ start = StripLocal(k); /* Remove the local bit (LSB) */ end = start + incolind[start]; /* get length */ start++; k = incolind[start]; /* get diagonal colind == row index */ hypre_CheckBounds(0, k, nrows, globals); hypre_CheckBounds(0, jr[k], lastjr, globals); hypre_assert(jw[jr[k]] == k); mult = w[jr[k]]*invalues[start]; w[jr[k]] = mult; if (hypre_abs(mult) < rtol) continue; /* First drop test */ for (l=++start; l<=end; l++) { hypre_CheckBounds(0, incolind[l], nrows, globals); m = jr[incolind[l]]; if (m == -1) { if (hypre_abs(mult*invalues[l]) < rtol) continue; /* Don't worry. The fill has too small of a value */ /* record L elements -- these must be remote */ if (IsInMIS(pilut_map[incolind[l]])) { hypre_assert(incolind[l] < firstrow || incolind[l] >= lastrow); hypre_lr[lastlr] = pilut_map[incolind[l]]; /* map[] == (l<<1) | 1 */ lastlr++; } /* Create fill */ jr[incolind[l]] = lastjr; jw[lastjr] = incolind[l]; w[lastjr] = -mult*invalues[l]; lastjr++; } else w[m] -= mult*invalues[l]; } } } /* L non-zeros */ /* perform SecondDrops and store in appropriate places */ hypre_SecondDropSmall( rtol, globals ); m = hypre_SeperateLU_byMIS( globals); hypre_UpdateL( i, m, ldu, globals ); hypre_FormNRmat( inr++, m, nrmat, global_maxnz, rrowlen, rcolind, rvalues, globals ); /* hypre_FormNRmat( inr++, m, nrmat, 3*global_maxnz, rcolind, rvalues, globals ); */ } #ifdef HYPRE_TIMING hypre_EndTiming( globals->CR_timer ); #endif } /************************************************************************* * This function performs a serial hypre_ILUT on the local MIS rows, then calls * hypre_SecondDrop to drop some elements and create LDU. If the set is truly * independant, then this just puts the row into DU. If there are * dependencies within a PE this factors those, adding to L, and forms DU. **************************************************************************/ void hypre_FactorLocal(FactorMatType *ldu, ReduceMatType *rmat, ReduceMatType *nrmat, CommInfoType *cinfo, HYPRE_Int *perm, HYPRE_Int *iperm, HYPRE_Int *newperm, HYPRE_Int *newiperm, HYPRE_Int nmis, HYPRE_Real tol, hypre_PilutSolverGlobals *globals) { HYPRE_UNUSED_VAR(cinfo); HYPRE_Int i, ir, k, kk, l, m, nnz, diag; HYPRE_Int *usrowptr, *uerowptr, *ucolind, *rcolind; HYPRE_Real *uvalues, *nrm2s, *rvalues, *dvalues; HYPRE_Real mult, rtol; #ifdef HYPRE_DEBUG hypre_PrintLine("hypre_FactorLocal", globals); #endif #ifdef HYPRE_TIMING hypre_BeginTiming( globals->FL_timer ); #endif hypre_assert( rmat != nrmat ); hypre_assert( perm != newperm ); hypre_assert( iperm != newiperm ); usrowptr = ldu->usrowptr; uerowptr = ldu->uerowptr; ucolind = ldu->ucolind; uvalues = ldu->uvalues; dvalues = ldu->dvalues; nrm2s = ldu->nrm2s; /* OK, now factor the nmis rows */ for (ir=ndone; irrmat_rnz[k]; rcolind = rmat->rmat_rcolind[k]; rvalues = rmat->rmat_rvalues[k]; /* Initialize workspace and determines the L indices. * Since there are only local nodes, we just store the * row's new permutation into lr, without any flags. */ jr[rcolind[0]] = 0; /* store diagonal first */ jw[0] = rcolind[0]; w[0] = rvalues[0]; hypre_assert(jw[0] == i+firstrow); lastlr = 0; for (lastjr=1; lastjr= firstrow && rcolind[lastjr] < lastrow && newiperm[rcolind[lastjr]-firstrow] < diag) { hypre_lr[lastlr] = newiperm[rcolind[lastjr]-firstrow]; lastlr++; } jr[rcolind[lastjr]] = lastjr; jw[lastjr] = rcolind[lastjr]; w[lastjr] = rvalues[lastjr]; } /* Go through the L nonzeros and pull in the contributions */ while( lastlr != 0 ) { k = hypre_ExtractMinLR(globals); hypre_CheckBounds(0, k, lnrows, globals); kk = newperm[ k ]; k = kk+firstrow; hypre_CheckBounds(0, kk, lnrows, globals); hypre_CheckBounds(0, jr[k], lastjr, globals); hypre_assert(jw[jr[k]] == k); mult = w[jr[k]]*dvalues[kk]; w[jr[k]] = mult; if (hypre_abs(mult) < rtol) continue; /* First drop test */ for (l=usrowptr[kk]; l= firstrow && ucolind[l] < lastrow && newiperm[ucolind[l]-firstrow] < diag) { hypre_assert(IsInMIS(pilut_map[ucolind[l]])); hypre_lr[lastlr] = newiperm[ucolind[l]-firstrow]; lastlr++; } /* Create fill */ jr[ucolind[l]] = lastjr; jw[lastjr] = ucolind[l]; w[lastjr] = -mult*uvalues[l]; lastjr++; } else w[m] -= mult*uvalues[l]; } } /* L non-zeros */ /* perform SecondDrops and store in appropriate places */ hypre_SecondDropSmall( rtol, globals ); m = hypre_SeperateLU_byDIAG( diag, newiperm, globals ); hypre_UpdateL( i, m, ldu, globals ); hypre_FormDU( i, m, ldu, rcolind, rvalues, tol, globals ); } #ifdef HYPRE_TIMING hypre_EndTiming( globals->FL_timer ); #endif } /************************************************************************* * This function drops small values from the workspace, and also resets * the jr[] array to all -1's. **************************************************************************/ void hypre_SecondDropSmall( HYPRE_Real rtol, hypre_PilutSolverGlobals *globals ) { HYPRE_Int i; /* Reset the jr array. */ for (i=0; iSLUD_timer ); #endif /* Perform a Qsort type pass to seperate L and U (rmat) entries. */ if (lastjr == 1) last = first = 1; else { last = 1; first = lastjr-1; while (true) { while (last < first && /* while (last < first AND [last] is in L) */ (jw[last] >= firstrow && jw[last] < lastrow && newiperm[jw[last]-firstrow] < diag)) last++; while (last < first && /* while (last < first AND [first] is not in L) */ ! (jw[first] >= firstrow && jw[first] < lastrow && newiperm[jw[first]-firstrow] < diag)) first--; if (last < first) { SWAP(jw[first], jw[last], itmp); SWAP( w[first], w[last], dtmp); last++; first--; } if (last == first) { if ((jw[last] >= firstrow && /* if [last] is in L */ jw[last] < lastrow && newiperm[jw[last]-firstrow] < diag)) { first++; last++; } break; } else if (last > first) { first++; break; } } } #ifndef NDEBUG /* DEBUGGING: verify sorting to some extent */ for (itmp=1; itmp= firstrow && /* [itmp] is in L -- must be MIS */ jw[itmp] < lastrow && newiperm[jw[itmp]-firstrow] < diag)); hypre_assert(IsInMIS(pilut_map[jw[itmp]])); } for (itmp=first; itmp= firstrow && /* [itmp] is not in L -- may be MIS still */ jw[itmp] < lastrow && newiperm[jw[itmp]-firstrow] < diag)); } hypre_assert(last == first); #endif #ifdef HYPRE_TIMING hypre_EndTiming( globals->SLUD_timer ); #endif return first; } /***************************************************************** * This function seperates the L and U portions of the workspace * and returns the point at which they seperate, so * L entries are between [1 .. point) * U or rmat entries are [point .. lastjr) * We assume the diagonal D is index [0]. * * This version simply uses the MIS to determine entries in L. * This is suitable for reductions involving rows on other PEs, * where -every- row in the MIS will be part of L. ******************************************************************/ HYPRE_Int hypre_SeperateLU_byMIS( hypre_PilutSolverGlobals *globals ) { HYPRE_Int first, last, itmp; HYPRE_Real dtmp; #ifdef HYPRE_TIMING hypre_BeginTiming( globals->SLUM_timer ); #endif /* Perform a Qsort type pass to seperate L and U (rmat) entries. */ if (lastjr == 1) last = first = 1; else { last = 1; first = lastjr-1; while (true) { while (last < first && IsInMIS(pilut_map[jw[last ]])) /* and [last] is in L */ last++; while (last < first && ! IsInMIS(pilut_map[jw[first]])) /* and [first] is not in L */ first--; if (last < first) { SWAP(jw[first], jw[last], itmp); SWAP( w[first], w[last], dtmp); last++; first--; } if (last == first) { if (IsInMIS(pilut_map[jw[last]])) { first++; last++; } break; } else if (last > first) { first++; break; } } } #ifndef NDEBUG /* DEBUGGING: verify sorting to some extent */ for (itmp=1; itmpSLUM_timer ); #endif return first; } /************************************************************************* * This function updates the L part of the given row, assuming that the * workspace has already been split into L and U entries. L may already * be partially or completely full--this fills it and then starts to * replace the min value. **************************************************************************/ void hypre_UpdateL(HYPRE_Int lrow, HYPRE_Int last, FactorMatType *ldu, hypre_PilutSolverGlobals *globals) { HYPRE_Int i, j, min, start, end; HYPRE_Int *lcolind; HYPRE_Real *lvalues; #ifdef HYPRE_TIMING hypre_BeginTiming( globals->UL_timer ); #endif lcolind = ldu->lcolind; lvalues = ldu->lvalues; start = ldu->lsrowptr[lrow]; end = ldu->lerowptr[lrow]; /* The entries between [1, last) are part of L */ for (i=1; ilerowptr[lrow] = end; hypre_CheckBounds(0, end-start, global_maxnz+1, globals); #ifdef HYPRE_TIMING hypre_EndTiming( globals->UL_timer ); #endif } /************************************************************************* * This function forms the new reduced row corresponding to * the given row, assuming that the * workspace has already been split into L and U (rmat) entries. It reuses * the memory for the row in the reduced matrix, storing the new row into * nrmat->*[rrow]. * New version allows new row to be larger than original row, so it does not * necessarily reuse the same memory. AC 3-18 **************************************************************************/ void hypre_FormNRmat(HYPRE_Int rrow, HYPRE_Int first, ReduceMatType *nrmat, HYPRE_Int max_rowlen, HYPRE_Int in_rowlen, HYPRE_Int *in_colind, HYPRE_Real *in_values, hypre_PilutSolverGlobals *globals ) { HYPRE_Int nz, max, j, out_rowlen, *rcolind; HYPRE_Real *rvalues; #ifdef HYPRE_TIMING hypre_BeginTiming( globals->FNR_timer ); #endif hypre_assert(in_colind[0] == jw[0]); /* diagonal at the beginning */ /* check to see if we need to reallocate space */ out_rowlen = hypre_min( max_rowlen, lastjr-first+1 ); if( out_rowlen > in_rowlen ) { /*hypre_free_multi( in_colind, in_values, -1 );*/ hypre_TFree(in_colind, HYPRE_MEMORY_HOST); hypre_TFree(in_values, HYPRE_MEMORY_HOST); in_colind = NULL; in_values = NULL; rcolind = hypre_idx_malloc( out_rowlen, "FornNRmat: rcolind"); rvalues = hypre_fp_malloc( out_rowlen, "FornNRmat: rvalues"); }else { rcolind = in_colind; rvalues = in_values; } rcolind[0] = jw[0]; rvalues[0] = w[0]; /* The entries [first, lastjr) are part of U (rmat) */ if (lastjr-first+1 <= max_rowlen) { /* Simple copy */ for (nz=1, j=first; j hypre_abs(w[max])) max = j; } rcolind[nz] = jw[max]; /* store max */ rvalues[nz] = w[max]; jw[max] = jw[--lastjr]; /* swap max out */ w[max] = w[ lastjr]; } hypre_assert(nz == out_rowlen); } hypre_assert(nz <= max_rowlen); /* link the reused storage to the new reduced system */ nrmat->rmat_rnz[rrow] = nz; nrmat->rmat_rrowlen[rrow] = out_rowlen; nrmat->rmat_rcolind[rrow] = rcolind; nrmat->rmat_rvalues[rrow] = rvalues; #ifdef HYPRE_TIMING hypre_EndTiming( globals->FNR_timer ); #endif } /************************************************************************* * This function forms the DU part of the given row, assuming that the * workspace has already been split into L and U entries. It disposes of * the memory used by the row in the reduced matrix. **************************************************************************/ void hypre_FormDU(HYPRE_Int lrow, HYPRE_Int first, FactorMatType *ldu, HYPRE_Int *rcolind, HYPRE_Real *rvalues, HYPRE_Real tol, hypre_PilutSolverGlobals *globals ) { HYPRE_Int nz, max, j, end; HYPRE_Int *ucolind, *uerowptr; HYPRE_Real *uvalues; ucolind = ldu->ucolind; uerowptr = ldu->uerowptr; uvalues = ldu->uvalues; /* * Take care of the diagonal */ if (w[0] == 0.0) { hypre_printf("Zero pivot in row %d, adding e to proceed!\n", lrow); ldu->dvalues[lrow] = 1.0/tol; } else ldu->dvalues[lrow] = 1.0/w[0]; /* * Take care of the elements of U * Note U is completely empty beforehand. */ end = ldu->uerowptr[lrow]; hypre_assert(ldu->usrowptr[lrow] == ldu->uerowptr[lrow]); for (nz=0; nzfirst; nz++) { /* The entries [first, lastjr) are part of U */ max = first; for (j=first+1; j hypre_abs(w[max])) max = j; } ucolind[end] = jw[max]; /* store max */ uvalues[end] = w[max]; end++; jw[max] = jw[--lastjr]; /* swap max out */ w[max] = w[ lastjr]; } uerowptr[lrow] = end; /* free the row storage */ hypre_TFree( rcolind ,HYPRE_MEMORY_HOST); hypre_TFree( rvalues ,HYPRE_MEMORY_HOST); } /************************************************************************* * This function zeros the map for all local rows and rows we recieved. * During debugging it checks the entire map to ensure other entries remain * zero as expected. cinfo->rnbrptr[i] has the _actual_ number of rows * recieved from PE rnbrind[i], which is set in hypre_SendFactoredRows. **************************************************************************/ void hypre_EraseMap(CommInfoType *cinfo, HYPRE_Int *newperm, HYPRE_Int nmis, hypre_PilutSolverGlobals *globals) { HYPRE_Int i, j, k, cnt, rnnbr; HYPRE_Int *rnbrptr, *incolind; rnnbr = cinfo->rnnbr; rnbrptr = cinfo->rnbrptr; incolind = cinfo->incolind; #ifdef HYPRE_DEBUG hypre_PrintLine("hypre_EraseMap", globals); #endif /* clear map of all MIS rows */ for (i=ndone; imaxntogo)*(global_maxnz+2) ; for (i=0; irmat_rnz = hypre_idx_malloc(ntogo, "hypre_ParILUT: nrmat->rmat_rnz" ); nrmat->rmat_rrowlen = hypre_idx_malloc(ntogo, "hypre_ParILUT: nrmat->rmat_rrowlen"); nrmat->rmat_rcolind = (HYPRE_Int **) hypre_mymalloc( sizeof(HYPRE_Int*)*ntogo, "hypre_ParILUT: nrmat->rmat_rcolind"); nrmat->rmat_rvalues = (HYPRE_Real **) hypre_mymalloc( sizeof(HYPRE_Real*) *ntogo, "hypre_ParILUT: nrmat->rmat_rvalues"); for ( i=0; i < ntogo; i++ ) { nrmat->rmat_rcolind[ i ] = NULL; nrmat->rmat_rvalues[ i ] = NULL; } /* Allocate work space */ hypre_TFree(jr, HYPRE_MEMORY_HOST); jr = hypre_idx_malloc_init(nrows, -1, "hypre_ParILUT: jr"); hypre_TFree(hypre_lr, HYPRE_MEMORY_HOST); hypre_lr = hypre_idx_malloc_init(nleft, -1, "hypre_ParILUT: lr"); hypre_TFree(jw, HYPRE_MEMORY_HOST); jw = hypre_idx_malloc(nleft, "hypre_ParILUT: jw"); hypre_TFree(w, HYPRE_MEMORY_HOST); w = hypre_fp_malloc(nleft, "hypre_ParILUT: w"); /* ---- hypre_ComputeCommInfo ---- */ /* Allocate global map */ pilut_map = hypre_idx_malloc_init(nrows, 0, "hypre_ComputeCommInfo: map"); /* Allocate cinfo */ cinfo->rnbrind = hypre_idx_malloc(npes, "hypre_ComputeCommInfo: cinfo->rnbrind"); cinfo->rrowind = hypre_idx_malloc(nleft, "hypre_ComputeCommInfo: cinfo->rrowind"); cinfo->rnbrptr = hypre_idx_malloc(npes+1, "hypre_ComputeCommInfo: cinfo->rnbrptr"); cinfo->snbrind = hypre_idx_malloc(npes, "hypre_ComputeCommInfo: cinfo->snbrind"); cinfo->snbrptr = hypre_idx_malloc(npes+1, "hypre_ComputeCommInfo: cinfo->snbrptr"); /* force allocates within hypre_ComputeCommInfo */ cinfo->incolind = NULL; cinfo->invalues = NULL; cinfo->srowind = NULL; cinfo->maxnrecv = 0; cinfo->maxnsend = 0; /* ---- ComputeMIS ---- */ /*cinfo->gatherbuf = hypre_fp_malloc(ntogo*(global_maxnz+2), "ComputeMIS: gatherbuf");*/ /* RDF: There is a purify UMR problem that a calloc gets rid of. * Don't know if this is actually an indication of a bug */ cinfo->gatherbuf = hypre_CTAlloc(HYPRE_Real, ntogo*(global_maxnz+2), HYPRE_MEMORY_HOST); } hypre-2.33.0/src/distributed_ls/pilut/parutil.c000066400000000000000000000136621477326011500215340ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /* * parutil.c * * This file contains utility functions * * Started 8/28/94 * George * * $Id$ * */ #include "ilu.h" #include "DistributedMatrixPilutSolver.h" /************************************************************************* * This function prints an error message and exits **************************************************************************/ void hypre_errexit(const char *f_str, ...) { va_list argp; /*hypre_fprintf(stdout,"[%3d]", mype);*/ va_start(argp, f_str); vfprintf(stdout, f_str, argp); va_end(argp); hypre_fprintf(stdout,"\n"); fflush(stdout); abort(); } /************************************************************************* * This makes life easier by aborting all threads together, and printing * some diagnostic with the PE. **************************************************************************/ void hypre_my_abort( HYPRE_Int inSignal, hypre_PilutSolverGlobals *globals ) { hypre_printf( "PE %d caught sig %d\n", mype, inSignal ); fflush(stdout); hypre_MPI_Abort( pilut_comm, inSignal ); } /************************************************************************* * The following function allocates an array of ints **************************************************************************/ HYPRE_Int *hypre_idx_malloc(HYPRE_Int n,const char *msg) { HYPRE_Int *ptr; if (n == 0) return NULL; ptr = hypre_TAlloc(HYPRE_Int, n, HYPRE_MEMORY_HOST); if (ptr == NULL) { hypre_errexit("***Memory allocation failed for %s. Requested size: %d bytes", msg, n*sizeof(HYPRE_Int)); } return ptr; } /************************************************************************* * The follwoing function allocates an array of ints and initializes **************************************************************************/ HYPRE_Int *hypre_idx_malloc_init(HYPRE_Int n, HYPRE_Int ival,const char *msg) { HYPRE_Int *ptr; HYPRE_Int i; if (n == 0) return NULL; ptr = hypre_TAlloc(HYPRE_Int, n, HYPRE_MEMORY_HOST); if (ptr == NULL) { hypre_errexit("***Memory allocation failed for %s. Requested size: %d bytes", msg, n*sizeof(HYPRE_Int)); } for (i=0; iddist_lnrows), x, &incx); return hypre_sqrt(hypre_GlobalSESumDouble(sum*sum, pilut_comm)); } /************************************************************************* * This function computes the dot product of 2 vectors. * The result is returned at all the processors **************************************************************************/ HYPRE_Real hypre_p_ddot(DataDistType *ddist, HYPRE_Real *x, HYPRE_Real *y, hypre_PilutSolverGlobals *globals) { HYPRE_Int incx=1; return hypre_GlobalSESumDouble(hypre_ddot(&(ddist->ddist_lnrows), x, &incx, y, &incx), pilut_comm ); } /************************************************************************* * This function performs y = alpha*x, where alpha resides on pe 0 **************************************************************************/ void hypre_p_daxy(DataDistType *ddist, HYPRE_Real alpha, HYPRE_Real *x, HYPRE_Real *y) { HYPRE_Int i, local_lnrows=ddist->ddist_lnrows; for (i=0; iddist_lnrows; for (i=0; iddist_lnrows; for (i=0; iddist_lnrows; i++) hypre_printf("%d:%f, ", ddist->ddist_rowdist[mype]+i, x[i]); if (pe == npes-1) hypre_printf("\n"); } hypre_MPI_Barrier( pilut_comm ); } fflush(stdout); hypre_MPI_Barrier( pilut_comm ); return 0; } hypre-2.33.0/src/distributed_ls/pilut/serilut.c000066400000000000000000000566111477326011500215440ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /* * serilut.c * * This file implements hypre_ILUT in the local part of the matrix * * Started 10/18/95 * George * * 7/8 MRG * - added rrowlen and verified * 7/22 MRG * - removed hypre_SelectInterior function form hypre_SerILUT code * - changed FindMinGreater to hypre_ExtractMinLR * - changed lr to using permutation; this allows reorderings like RCM. * * 12/4 AJC * - Changed code to handle modified matrix storage format with multiple blocks * * 1/13 AJC * - Modified code with macros to allow both 0 and 1-based indexing * * $Id$ * */ #include "ilu.h" #include "DistributedMatrixPilutSolver.h" /************************************************************************* * This function takes a matrix and performs an hypre_ILUT of the internal nodes **************************************************************************/ HYPRE_Int hypre_SerILUT(DataDistType *ddist, HYPRE_DistributedMatrix matrix, FactorMatType *ldu, ReduceMatType *rmat, HYPRE_Int maxnz, HYPRE_Real tol, hypre_PilutSolverGlobals *globals) { HYPRE_Int i, ii, j, k, kk, l, m, ierr, diag_present; HYPRE_Int *perm, *iperm, *usrowptr, *uerowptr, *ucolind; HYPRE_Int row_size; HYPRE_BigInt *col_ind; HYPRE_Real *values, *uvalues, *dvalues, *nrm2s; HYPRE_Int nlocal, nbnd; HYPRE_Real mult, rtol; HYPRE_Int *structural_union; nrows = ddist->ddist_nrows; lnrows = ddist->ddist_lnrows; firstrow = ddist->ddist_rowdist[mype]; lastrow = ddist->ddist_rowdist[mype+1]; usrowptr = ldu->usrowptr; uerowptr = ldu->uerowptr; ucolind = ldu->ucolind; uvalues = ldu->uvalues; dvalues = ldu->dvalues; nrm2s = ldu->nrm2s; perm = ldu->perm; iperm = ldu->iperm; /* Allocate work space */ hypre_TFree(jr, HYPRE_MEMORY_HOST); jr = hypre_idx_malloc_init(nrows, -1, "hypre_SerILUT: jr"); hypre_TFree(hypre_lr, HYPRE_MEMORY_HOST); hypre_lr = hypre_idx_malloc_init(nrows, -1, "hypre_SerILUT: lr"); hypre_TFree(jw, HYPRE_MEMORY_HOST); jw = hypre_idx_malloc(nrows, "hypre_SerILUT: jw"); hypre_TFree(w, HYPRE_MEMORY_HOST); w = hypre_fp_malloc(nrows, "hypre_SerILUT: w" ); /* Find structural union of local rows */ #ifdef HYPRE_TIMING { HYPRE_Int FSUtimer; FSUtimer = hypre_InitializeTiming( "hypre_FindStructuralUnion"); hypre_BeginTiming( FSUtimer ); #endif ierr = hypre_FindStructuralUnion( matrix, &structural_union, globals ); #ifdef HYPRE_TIMING hypre_EndTiming( FSUtimer ); /* hypre_FinalizeTiming( FSUtimer ); */ } #endif /* if(ierr) return(ierr);*/ /* Exchange structural unions with other processors */ ierr = hypre_ExchangeStructuralUnions( ddist, &structural_union, globals ); /* if(ierr) return(ierr); */ /* Select the rows to be factored */ #ifdef HYPRE_TIMING { HYPRE_Int SItimer; SItimer = hypre_InitializeTiming( "hypre_SelectInterior"); hypre_BeginTiming( SItimer ); #endif nlocal = hypre_SelectInterior( lnrows, matrix, structural_union, perm, iperm, globals ); #ifdef HYPRE_TIMING hypre_EndTiming( SItimer ); /* hypre_FinalizeTiming( SItimer ); */ } #endif /* Structural Union no longer required */ hypre_TFree( structural_union , HYPRE_MEMORY_HOST); nbnd = lnrows - nlocal ; #ifdef HYPRE_DEBUG HYPRE_Int logging = globals ? globals->logging : 0; if (logging) { hypre_printf("nbnd = %d, lnrows=%d, nlocal=%d\n", nbnd, lnrows, nlocal ); } #endif ldu->nnodes[0] = nlocal; #ifdef HYPRE_TIMING globals->SDSeptimer = hypre_InitializeTiming("hypre_SecondDrop Separation"); globals->SDKeeptimer = hypre_InitializeTiming("hypre_SecondDrop extraction of kept elements"); globals->SDUSeptimer = hypre_InitializeTiming("hypre_SecondDropUpdate Separation"); globals->SDUKeeptimer = hypre_InitializeTiming("hypre_SecondDropUpdate extraction of kept elements"); #endif #ifdef HYPRE_TIMING { HYPRE_Int LFtimer; LFtimer = hypre_InitializeTiming( "Local factorization computational stage"); hypre_BeginTiming( LFtimer ); #endif /* myprintf("Nlocal: %d, Nbnd: %d\n", nlocal, nbnd); */ /*******************************************************************/ /* Go and factor the nlocal rows */ /*******************************************************************/ for (ii=0; iirmat_rnz = hypre_idx_malloc(nbnd, "hypre_SerILUT: rmat->rmat_rnz" ); rmat->rmat_rrowlen = hypre_idx_malloc(nbnd, "hypre_SerILUT: rmat->rmat_rrowlen"); rmat->rmat_rcolind = (HYPRE_Int **)hypre_mymalloc(sizeof(HYPRE_Int *)*nbnd, "hypre_SerILUT: rmat->rmat_rcolind"); rmat->rmat_rvalues = (HYPRE_Real **)hypre_mymalloc(sizeof(HYPRE_Real *)*nbnd, "hypre_SerILUT: rmat->rmat_rvalues"); rmat->rmat_ndone = nlocal; rmat->rmat_ntogo = nbnd; for (ii=nlocal; ii= firstrow && col_ind[j] < lastrow && iperm[col_ind[j]-firstrow] < nlocal) hypre_lr[lastlr++] = iperm[col_ind[j]-firstrow]; /* Copy the L elements separately */ if (col_ind[j] != i+firstrow) { /* Off-diagonal element */ jr[col_ind[j]] = lastjr; jw[lastjr] = col_ind[j]; w[lastjr] = values[j]; lastjr++; } else { /* Put the diagonal element at the begining */ diag_present = 1; jr[i+firstrow] = 0; jw[0] = i+firstrow; w[0] = values[j]; } } if( !diag_present ) /* No diagonal element was found; insert a zero */ { jr[i+firstrow] = 0; jw[0] = i+firstrow; w[0] = 0.0; } ierr = HYPRE_DistributedMatrixRestoreRow( matrix, firstrow+i, &row_size, &col_ind, &values); k = -1; while (lastlr != 0) { kk = perm[hypre_ExtractMinLR(globals)]; k = kk+firstrow; mult = w[jr[k]]*dvalues[kk]; w[jr[k]] = mult; if (hypre_abs(mult) < rtol) continue;/* First drop test */ for (l=usrowptr[kk]; l= lastrow) { newperm[local_num_rows-nbnd-1] = i; newiperm[i] = local_num_rows-nbnd-1; nbnd++; break_loop = 1; } } HYPRE_DistributedMatrixRestoreRow( matrix, firstrow+i, &row_size, &col_ind, &values); if ( break_loop == 0 ) { newperm[nlocal] = i; newiperm[i] = nlocal; nlocal++; } } } return nlocal; } /************************************************************************* * hypre_FindStructuralUnion * Produces a vector of length n that marks the union of the nonzero * structure of all locally stored rows, not including locally stored columns. **************************************************************************/ HYPRE_Int hypre_FindStructuralUnion( HYPRE_DistributedMatrix matrix, HYPRE_Int **structural_union, hypre_PilutSolverGlobals *globals ) { HYPRE_Int ierr=0, i, j, row_size; HYPRE_BigInt *col_ind; /* Allocate and clear structural_union vector */ *structural_union = hypre_CTAlloc( HYPRE_Int, nrows , HYPRE_MEMORY_HOST); /* Loop through rows */ for ( i=0; i< lnrows; i++ ) { /* Get row structure; no values needed */ ierr = HYPRE_DistributedMatrixGetRow( matrix, firstrow+i, &row_size, &col_ind, NULL ); /* if (ierr) return(ierr); */ /* Loop through nonzeros in this row */ for ( j=0; j= lastrow) { (*structural_union)[ col_ind[j] ] = 1; } } /* Restore row structure */ ierr = HYPRE_DistributedMatrixRestoreRow( matrix, firstrow+i, &row_size, &col_ind, NULL ); /* if (ierr) return(ierr); */ } return(ierr); } /************************************************************************* * hypre_ExchangeStructuralUnions * Exchanges structural union vectors with other processors and produces * a vector the size of the number of locally stored rows that marks * whether any exterior processor has a nonzero in the column corresponding * to each row. This is used to determine if a local row might have to * update an off-processor row. **************************************************************************/ HYPRE_Int hypre_ExchangeStructuralUnions( DataDistType *ddist, HYPRE_Int **structural_union, hypre_PilutSolverGlobals *globals ) { HYPRE_UNUSED_VAR(ddist); HYPRE_Int ierr=0, *recv_unions; /* allocate space for receiving unions */ recv_unions = hypre_CTAlloc( HYPRE_Int, nrows , HYPRE_MEMORY_HOST); hypre_MPI_Allreduce( *structural_union, recv_unions, nrows, HYPRE_MPI_INT, hypre_MPI_LOR, pilut_comm ); /* free and reallocate structural union so that is of local size */ hypre_TFree( *structural_union , HYPRE_MEMORY_HOST); *structural_union = hypre_TAlloc( HYPRE_Int, lnrows , HYPRE_MEMORY_HOST); hypre_memcpy_int( *structural_union, &recv_unions[firstrow], lnrows ); /* deallocate recv_unions */ hypre_TFree( recv_unions , HYPRE_MEMORY_HOST); return(ierr); } /************************************************************************* * This function applies the second droping rule where maxnz elements * greater than tol are kept. The elements are stored into LDU. **************************************************************************/ void hypre_SecondDrop(HYPRE_Int maxnz, HYPRE_Real tol, HYPRE_Int row, HYPRE_Int *perm, HYPRE_Int *iperm, FactorMatType *ldu, hypre_PilutSolverGlobals *globals) { HYPRE_UNUSED_VAR(iperm); HYPRE_UNUSED_VAR(perm); HYPRE_Int i, j; HYPRE_Int diag, lrow; HYPRE_Int first, last, itmp; HYPRE_Real dtmp; /* Reset the jr array, it is not needed any more */ for (i=0; idvalues[lrow] = 1.0/w[0]; else { /* zero pivot */ hypre_printf("Zero pivot in row %d, adding e to proceed!\n", row); ldu->dvalues[lrow] = 1.0/tol; } jw[0] = jw[--lastjr]; w[0] = w[lastjr]; /* First go and remove any off diagonal elements bellow the tolerance */ for (i=0; iSDSeptimer ); #endif if (lastjr == 0) last = first = 0; else { /* Perform a Qsort type pass to seperate L and U entries */ last = 0, first = lastjr-1; while (1) { while (last < first && iperm[jw[last]-firstrow] < diag) last++; while (last < first && iperm[jw[first]-firstrow] > diag) first--; if (last < first) { SWAP(jw[first], jw[last], itmp); SWAP(w[first], w[last], dtmp); last++; first--; } if (last == first) { if (iperm[jw[last]-firstrow] < diag) { first++; last++; } break; } else if (last > first) { first++; break; } } } #ifdef HYPRE_TIMING hypre_EndTiming( globals->SDSeptimer ); #endif /***************************************************************** * The entries between [0, last) are part of L * The entries [first, lastjr) are part of U ******************************************************************/ #ifdef HYPRE_TIMING hypre_BeginTiming(globals-> SDKeeptimer ); #endif /* Now, I want to keep maxnz elements of L. Go and extract them */ hypre_DoubleQuickSplit( w, jw, last, maxnz ); /* if (ierr) return; */ for ( j= hypre_max(0,last-maxnz); j< last; j++ ) { ldu->lcolind[ldu->lerowptr[lrow]] = jw[ j ]; ldu->lvalues[ldu->lerowptr[lrow]++] = w[ j ]; } /* This was the previous insertion sort that was replaced with the QuickSplit routine above. AJC, 5/00 for (nz=0; nz0; nz++) { for (max=0, j=1; j hypre_abs(w[max])) max = j; } ldu->lcolind[ldu->lerowptr[lrow]] = jw[max]; ldu->lvalues[ldu->lerowptr[lrow]] = w[max]; ldu->lerowptr[lrow]++; jw[max] = jw[--last]; w[max] = w[last]; } */ /* Now, I want to keep maxnz elements of U. Go and extract them */ hypre_DoubleQuickSplit( w+first, jw+first, lastjr-first, maxnz ); /* if (ierr) return; */ for ( j=hypre_max(first, lastjr-maxnz); j< lastjr; j++ ) { ldu->ucolind[ldu->uerowptr[lrow]] = jw[ j ]; ldu->uvalues[ldu->uerowptr[lrow]++] = w[ j ]; } /* This was the previous insertion sort that was replaced with the QuickSplit routine above. AJC, 5/00 for (nz=0; nzfirst; nz++) { for (max=first, j=first+1; j hypre_abs(w[max])) max = j; } ldu->ucolind[ldu->uerowptr[lrow]] = jw[max]; ldu->uvalues[ldu->uerowptr[lrow]] = w[max]; ldu->uerowptr[lrow]++; jw[max] = jw[--lastjr]; w[max] = w[lastjr]; } */ #ifdef HYPRE_TIMING hypre_EndTiming( globals->SDKeeptimer ); #endif } /************************************************************************* * This function applyies the second droping rule whre maxnz elements * greater than tol are kept. The elements are stored into L and the Rmat. * This version keeps only maxnzkeep **************************************************************************/ void hypre_SecondDropUpdate(HYPRE_Int maxnz, HYPRE_Int maxnzkeep, HYPRE_Real tol, HYPRE_Int row, HYPRE_Int nlocal, HYPRE_Int *perm, HYPRE_Int *iperm, FactorMatType *ldu, ReduceMatType *rmat, hypre_PilutSolverGlobals *globals ) { HYPRE_UNUSED_VAR(perm); HYPRE_Int i, j, nl; HYPRE_Int max, nz, lrow, rrow; HYPRE_Int last, first, itmp; HYPRE_Real dtmp; /* Reset the jr array, it is not needed any more */ for (i=0; iSDUSeptimer ); #endif if (lastjr == 1) last = first = 1; else { /* Perform a Qsort type pass to seperate L and U entries */ last = 1, first = lastjr-1; while (1) { while (last < first && /* and [last] is L */ jw[last] >= firstrow && jw[last] < lastrow && iperm[jw[last]-firstrow] < nlocal) last++; while (last < first && /* and [first] is not L */ !(jw[first] >= firstrow && jw[first] < lastrow && iperm[jw[first]-firstrow] < nlocal)) first--; if (last < first) { SWAP(jw[first], jw[last], itmp); SWAP( w[first], w[last], dtmp); last++; first--; } if (last == first) { if (jw[last] >= firstrow && jw[last] < lastrow && iperm[jw[last]-firstrow] < nlocal) { first++; last++; } break; } else if (last > first) { first++; break; } } } #ifdef HYPRE_TIMING hypre_EndTiming( globals->SDUSeptimer ); #endif /***************************************************************** * The entries between [1, last) are part of L * The entries [first, lastjr) are part of U ******************************************************************/ #ifdef HYPRE_TIMING hypre_BeginTiming( globals->SDUKeeptimer ); #endif /* Keep large maxnz elements of L */ hypre_DoubleQuickSplit( w+1, jw+1, last-1, maxnz ); /* if (ierr) return; */ for ( j= hypre_max(1,last-maxnz); j< last; j++ ) { ldu->lcolind[ldu->lerowptr[lrow]] = jw[ j ]; ldu->lvalues[ldu->lerowptr[lrow]++] = w[ j ]; } /* This was the previous insertion sort that was replaced with the QuickSplit routine above. AJC, 5/00 for (nz=0; nz1; nz++) { for (max=1, j=2; j hypre_abs(w[max])) max = j; } ldu->lcolind[ldu->lerowptr[lrow]] = jw[max]; ldu->lvalues[ldu->lerowptr[lrow]] = w[max]; ldu->lerowptr[lrow]++; jw[max] = jw[--last]; w[max] = w[last]; } */ /* Allocate appropriate amount of memory for the reduced row */ nl = MIN(lastjr-first+1, maxnzkeep); rmat->rmat_rnz[rrow] = nl; rmat->rmat_rcolind[rrow] = hypre_idx_malloc(nl, "hypre_SecondDropUpdate: rmat->rmat_rcolind[rrow]"); rmat->rmat_rvalues[rrow] = hypre_fp_malloc(nl, "hypre_SecondDropUpdate: rmat->rmat_rvalues[rrow]"); rmat->rmat_rrowlen[rrow] = nl; rmat->rmat_rcolind[rrow][0] = row; /* Put the diagonal at the begining */ rmat->rmat_rvalues[rrow][0] = w[0]; if (nl == lastjr-first+1) { /* Simple copy */ for (i=1,j=first; jrmat_rcolind[rrow][i] = jw[j]; rmat->rmat_rvalues[rrow][i] = w[j]; } } else { /* Keep large nl elements in the reduced row */ for (nz=1; nz hypre_abs(w[max])) max = j; } rmat->rmat_rcolind[rrow][nz] = jw[max]; rmat->rmat_rvalues[rrow][nz] = w[max]; jw[max] = jw[--lastjr]; w[max] = w[lastjr]; } } #ifdef HYPRE_TIMING hypre_EndTiming( globals->SDUKeeptimer ); #endif } hypre-2.33.0/src/distributed_ls/pilut/struct.h000066400000000000000000000172641477326011500214070ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #ifndef STRUCT_H #define STRUCT_H /* * struct.h * * This file contains data structures for ILU routines. * * Started 9/26/95 * George * * 7/8 * - change to generic HYPRE_Int and HYPRE_Real (in all files) and verified * - added rrowlen to rmat and verified * 7/9 * - add recv info to the LDU communication struct TriSolveCommType * 7/29 * - add maxntogo and remove unused out and address buffers from cinfo * - rearranged all structures to have ptrs first, then ints, ints, structs. * This is under the assumption that that is the most likely order * for things to be natural word length, so reduces padding. * * $Id$ */ #ifndef __cplusplus /* In C++, bool is built-in, no need to define it */ #if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L && __STDC_VERSION__ < 202311L /* C99 - C11: Use stdbool.h */ #include #elif defined(__STDC_VERSION__) && __STDC_VERSION__ < 199901L /* Pre-C99: Define bool manually */ #ifndef bool #ifdef Boolean typedef Boolean bool; #else typedef unsigned char bool; #endif #endif #ifndef true #define true 1 #endif #ifndef false #define false 0 #endif #endif #endif /* ifndef __cplusplus */ /************************************************************************* * This data structure holds the data distribution **************************************************************************/ struct distdef { HYPRE_Int ddist_nrows; /* The order of the distributed matrix */ HYPRE_Int ddist_lnrows; /* The local number of rows */ HYPRE_Int *ddist_rowdist; /* How the rows are distributed among processors */ }; typedef struct distdef DataDistType; #define DataDistTypeNrows(data_dist) ((data_dist)-> ddist_nrows) #define DataDistTypeLnrows(data_dist) ((data_dist)-> ddist_lnrows) #define DataDistTypeRowdist(data_dist) ((data_dist)-> ddist_rowdist) /************************************************************************* * The following data structure stores info for a communication phase during * the triangular solvers. **************************************************************************/ struct cphasedef { HYPRE_Real **raddr; /* A rnbrpes+1 list of addresses to recv data into */ HYPRE_Int *spes; /* A snbrpes list of PEs to send data */ HYPRE_Int *sptr; /* An snbrpes+1 list indexing sindex for each spes[i] */ HYPRE_Int *sindex; /* The packets to send per PE */ HYPRE_Int *auxsptr; /* Auxiliary send ptr, used at intermediate points */ HYPRE_Int *rpes; /* A rnbrpes list of PEs to recv data */ HYPRE_Int *rdone; /* A rnbrpes list of # elements recv'd in this hypre_LDUSolve */ HYPRE_Int *rnum; /* A nlevels x npes array of the number of elements to recieve */ HYPRE_Int snbrpes; /* The total number of neighboring PEs (to send to) */ HYPRE_Int rnbrpes; /* The total number of neighboring PEs (to recv from) */ }; typedef struct cphasedef TriSolveCommType; /************************************************************************* * This data structure holds the factored matrix **************************************************************************/ struct factormatdef { HYPRE_Int *lsrowptr; /* Pointers to the locally stored rows start */ HYPRE_Int *lerowptr; /* Pointers to the locally stored rows end */ HYPRE_Int *lcolind; /* Array of column indices of lnrows */ HYPRE_Real *lvalues; /* Array of locally stored values */ HYPRE_Int *lrowptr; HYPRE_Int *usrowptr; /* Pointers to the locally stored rows start */ HYPRE_Int *uerowptr; /* Pointers to the locally stored rows end */ HYPRE_Int *ucolind; /* Array of column indices of lnrows */ HYPRE_Real *uvalues; /* Array of locally stored values */ HYPRE_Int *urowptr; HYPRE_Real *dvalues; /* Diagonal values */ HYPRE_Real *nrm2s; /* Array of the 2-norms of the rows for tolerance testing */ HYPRE_Int *perm; /* perm and invperm arrays for factorization */ HYPRE_Int *iperm; /* Communication info for triangular system solution */ HYPRE_Real *gatherbuf; /* maxsend*snbrpes buffer for sends */ HYPRE_Real *lx; HYPRE_Real *ux; HYPRE_Int lxlen, uxlen; HYPRE_Int nlevels; /* The number of reductions performed */ HYPRE_Int nnodes[MAXNLEVEL]; /* The number of nodes at each reduction level */ TriSolveCommType lcomm; /* Communication info during the Lx=y solve */ TriSolveCommType ucomm; /* Communication info during the Ux=y solve */ }; typedef struct factormatdef FactorMatType; /************************************************************************* * This data structure holds the reduced matrix **************************************************************************/ struct reducematdef { HYPRE_Int *rmat_rnz; /* Pointers to the locally stored rows */ HYPRE_Int *rmat_rrowlen; /* Length allocated for each row */ HYPRE_Int **rmat_rcolind; /* Array of column indices of lnrows */ HYPRE_Real **rmat_rvalues; /* Array of locally stored values */ HYPRE_Int rmat_ndone; /* The number of vertices factored so far */ HYPRE_Int rmat_ntogo; /* The number of vertices not factored. This is the size of rmat */ HYPRE_Int rmat_nlevel; /* The number of reductions performed so far */ }; typedef struct reducematdef ReduceMatType; /************************************************************************* * This data structure stores information about the send in each phase * of parallel hypre_ILUT **************************************************************************/ struct comminfodef { HYPRE_Real *gatherbuf; /* Assembly buffer for sending colind & values */ HYPRE_Int *incolind; /* Receive buffer for colind */ HYPRE_Real *invalues; /* Receive buffer for values */ HYPRE_Int *rnbrind; /* The neighbor processors */ HYPRE_Int *rrowind; /* The indices that are received */ HYPRE_Int *rnbrptr; /* Array of size rnnbr+1 into rrowind */ HYPRE_Int *snbrind; /* The neighbor processors */ HYPRE_Int *srowind; /* The indices that are sent */ HYPRE_Int *snbrptr; /* Array of size snnbr+1 into srowind */ HYPRE_Int maxnsend; /* The maximum number of rows being sent */ HYPRE_Int maxnrecv; /* The maximum number of rows being received */ HYPRE_Int maxntogo; /* The maximum number of rows left on any PE */ HYPRE_Int rnnbr; /* Number of neighbor processors */ HYPRE_Int snnbr; /* Number of neighbor processors */ }; typedef struct comminfodef CommInfoType; /************************************************************************* * The following data structure stores communication info for mat-vec **************************************************************************/ struct mvcommdef { HYPRE_Int *spes; /* Array of PE numbers */ HYPRE_Int *sptr; /* Array of send indices */ HYPRE_Int *sindex; /* Array that stores the actual indices */ HYPRE_Int *rpes; HYPRE_Real **raddr; HYPRE_Real *bsec; /* Stores the actual b vector */ HYPRE_Real *gatherbuf; /* Used to gather the outgoing packets */ HYPRE_Int *perm; /* Used to map the LIND back to GIND */ HYPRE_Int snpes; /* Number of send PE's */ HYPRE_Int rnpes; }; typedef struct mvcommdef MatVecCommType; /************************************************************************* * The following data structure stores key-value pair **************************************************************************/ struct KeyValueType { HYPRE_Int key; HYPRE_Int val; }; typedef struct KeyValueType KeyValueType; #endif hypre-2.33.0/src/distributed_ls/pilut/trifactor.c000066400000000000000000000503771477326011500220550ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /* * trifactor.c * * This file contains a number of fuction that are used in solving * the triangular systems resulting from the hypre_ILUT * * Started 11/13/95 * George * * 7/8 * - seperate hypre_SetUpFactor from hypre_SetUpLUFactor and verify * 7/9 * - MPI support, adding to the comm structure * - timing of the hypre_LDUSolve. The computation is very scalable, but the * communication and sync is not. Partially this comes from sending * zero length messages. I'll fix that. * 7/10 * - MPI and validation. Doesn't seem to work with Edinburgh, but * I haven't the slightest idea why not. (Artifact of running * along with shmem?) * 7/11 * - cleaned up code a little. Added timer macros. * * $Id$ */ #include "ilu.h" #include "DistributedMatrixPilutSolver.h" /************************************************************************* * This function performs the forward and backward substitution. * It solves the system LDUx = b. **************************************************************************/ void hypre_LDUSolve(DataDistType *ddist, FactorMatType *ldu, HYPRE_Real *x, HYPRE_Real *b, hypre_PilutSolverGlobals *globals) { HYPRE_Int ii, i, j, l, TAG; HYPRE_Int nlevels, snbrpes, rnbrpes; HYPRE_Int *perm, *iperm, *nnodes, *rowptr, *colind, *spes, *sptr, *sindex, *auxsptr, *rpes, *rdone, *rnum; HYPRE_Real *lx, *ux, *values, *dvalues, *gatherbuf, **raddr, xx; hypre_MPI_Status Status; hypre_MPI_Request *receive_requests; /* hypre_PrintLine("hypre_LDUSolve start", globals); */ lnrows = ddist->ddist_lnrows; perm = ldu->perm; iperm = ldu->iperm; nnodes = ldu->nnodes; nlevels = ldu->nlevels; dvalues = ldu->dvalues; gatherbuf = ldu->gatherbuf; lx = ldu->lx; ux = ldu->ux; /****************************************************************** * Do the L(lx) = b, first *******************************************************************/ snbrpes = ldu->lcomm.snbrpes; spes = ldu->lcomm.spes; sptr = ldu->lcomm.sptr; sindex = ldu->lcomm.sindex; auxsptr = ldu->lcomm.auxsptr; if( sptr != NULL ) hypre_memcpy_idx(auxsptr, sptr, snbrpes+1); rnbrpes = ldu->lcomm.rnbrpes; raddr = ldu->lcomm.raddr; rpes = ldu->lcomm.rpes; rdone = ldu->lcomm.rdone; for (i=0; ilrowptr; colind = ldu->lcolind; values = ldu->lvalues; #ifdef HYPRE_TIMING hypre_BeginTiming( globals->Ll_timer ); #endif /* Do the local first. * For forward substitution we do local+1st MIS == nnodes[1] (NOT [0]!) */ for (i=0; iLl_timer ); #endif /* Allocate requests */ receive_requests = hypre_CTAlloc( hypre_MPI_Request, npes , HYPRE_MEMORY_HOST); #ifdef HYPRE_TIMING hypre_BeginTiming( globals->Lp_timer ); #endif /* Do the distributed next */ for (ii=1; iilcomm.rnum[(ii-1)*rnbrpes]) ; /* Recv the required lx elements from the appropriate processors */ for (i=0; i 0 ) { /* Something to recv */ hypre_MPI_Irecv( raddr[i]+rdone[i], rnum[i], hypre_MPI_REAL, rpes[i], TAG, pilut_comm, &receive_requests[i] ); rdone[i] += rnum[i] ; } } /* Send the required lx elements to the appropriate processors */ for (i=0; i auxsptr[i] && sindex[auxsptr[i]] 0 ) { /* Something to recv */ hypre_MPI_Wait( &receive_requests[i], &Status); } } /* solve for this MIS set * by construction all remote lx elements needed are filled in */ for (i=nnodes[ii]; iLp_timer ); #endif /****************************************************************** * Do the U(ly) = (lx), next *******************************************************************/ snbrpes = ldu->ucomm.snbrpes; spes = ldu->ucomm.spes; sptr = ldu->ucomm.sptr; sindex = ldu->ucomm.sindex; auxsptr = ldu->ucomm.auxsptr; hypre_memcpy_idx(auxsptr, sptr, snbrpes+1); rnbrpes = ldu->ucomm.rnbrpes; raddr = ldu->ucomm.raddr; rpes = ldu->ucomm.rpes; rdone = ldu->ucomm.rdone; for (i=0; iurowptr; colind = ldu->ucolind; values = ldu->uvalues; #ifdef HYPRE_TIMING hypre_BeginTiming( globals->Up_timer ); #endif /* Do the distributed */ for (ii=nlevels; ii>0; ii--) { /* Solve for this MIS set * by construction all remote lx elements needed are filled in */ for (i=nnodes[ii]-1; i>=nnodes[ii-1]; i--) { xx = 0.0; for (j=rowptr[i]; jucomm.rnum[(ii-1)*rnbrpes]); /* Recv the required ux elements from the appropriate processors */ for (i=0; i 0 ) { /* Something to recv */ hypre_MPI_Irecv( raddr[i]+rdone[i], rnum[i], hypre_MPI_REAL, rpes[i], TAG, pilut_comm, &receive_requests[ i ] ); rdone[i] += rnum[i] ; } } /* Send the required ux elements to the appropriate processors */ for (i=0; i auxsptr[i] && sindex[auxsptr[i]]>=nnodes[ii-1]) { /* Something to send */ for (j=auxsptr[i], l=0; j=nnodes[ii-1]; j++, l++) gatherbuf[l] = ux[sindex[j]]; hypre_MPI_Send( gatherbuf, l, hypre_MPI_REAL, spes[i], TAG, pilut_comm ); auxsptr[i] = j; } } /* Finish receives */ for (i=0; i 0 ) { /* Something to recv */ hypre_MPI_Wait( &receive_requests[ i ], &Status ); } } } #ifdef HYPRE_TIMING hypre_EndTiming( globals->Up_timer ); #endif #ifdef HYPRE_TIMING hypre_BeginTiming( globals->Ul_timer ); #endif /* Do the local next */ for (i=nnodes[0]-1; i>=0; i--) { xx = 0.0; for (j=rowptr[i]; jUl_timer ); #endif /* Permute the solution to back to x */ for (i=0; iddist_nrows, "hypre_SetUpLUFactor: rind" ); imap = hypre_idx_malloc_init(ddist->ddist_nrows, -1, "hypre_SetUpLUFactor: imap"); /* This is the global maximum for both L and U */ maxsend = 0; #ifdef HYPRE_TIMING { HYPRE_Int Ltimer; Ltimer = hypre_InitializeTiming( "hypre_SetUpFactor for L" ); hypre_BeginTiming( Ltimer ); #endif /* Work on L first */ hypre_SetUpFactor( ddist, ldu, maxnz, petotal, rind, imap, &maxsend, true, globals ); #ifdef HYPRE_TIMING hypre_EndTiming( Ltimer ); /* hypre_FinalizeTiming( Ltimer ); */ } #endif #ifdef HYPRE_TIMING { HYPRE_Int Utimer; Utimer = hypre_InitializeTiming( "hypre_SetUpFactor for U" ); hypre_BeginTiming( Utimer ); #endif /* Now work on U */ hypre_SetUpFactor( ddist, ldu, maxnz, petotal, rind, imap, &maxsend, false, globals ); #ifdef HYPRE_TIMING hypre_EndTiming( Utimer ); /* hypre_FinalizeTiming( Utimer ); */ } #endif /* Allocate memory for the gather buffer. This is an overestimate */ ldu->gatherbuf = hypre_fp_malloc(maxsend, "hypre_SetUpLUFactor: ldu->gatherbuf"); /*hypre_free_multi(petotal, rind, imap, -1);*/ hypre_TFree(petotal, HYPRE_MEMORY_HOST); hypre_TFree(rind, HYPRE_MEMORY_HOST); hypre_TFree(imap, HYPRE_MEMORY_HOST); return(0); } /************************************************************************* * This function sets-up the communication parameters for the forward * and backward substitution, and relabels the L and U matrices. * This function is called twice--once for L and once for U. DoingL * differentiates the two calls for the minor differences between them. * These differences are marked by **** in comments **************************************************************************/ void hypre_SetUpFactor(DataDistType *ddist, FactorMatType *ldu, HYPRE_Int maxnz, HYPRE_Int *petotal, HYPRE_Int *rind, HYPRE_Int *imap, HYPRE_Int *maxsendP, HYPRE_Int DoingL, hypre_PilutSolverGlobals *globals ) { HYPRE_Int i, ii, j, k, l, nlevels, nrecv, nsend, snbrpes, rnbrpes; HYPRE_Int *rowdist, *sptr, *sindex, *spes, *rpes, *perm, *iperm, *newrowptr, *newcolind, *srowptr, *erowptr, *colind, *rnum ; HYPRE_Real *newvalues, *values, *x, **raddr; TriSolveCommType *TriSolveComm; hypre_MPI_Status Status; hypre_MPI_Request *receive_requests; hypre_MPI_Datatype MyColType_rnbr; /* data common to L and U */ lnrows = ddist->ddist_lnrows; nlevels = ldu->nlevels; rowdist = ddist->ddist_rowdist; firstrow = rowdist[mype]; lastrow = rowdist[mype+1]; perm = ldu->perm; iperm = ldu->iperm; /**** choose between L and U data ****/ srowptr = (DoingL ? ldu->lsrowptr : ldu->usrowptr); erowptr = (DoingL ? ldu->lerowptr : ldu->uerowptr); colind = (DoingL ? ldu->lcolind : ldu->ucolind ); values = (DoingL ? ldu->lvalues : ldu->uvalues ); TriSolveComm = (DoingL ? &(ldu->lcomm) : &(ldu->ucomm)); /* Determine the needed indices for L (U) */ nrecv = 0; for (ii=ldu->nnodes[0]; ii= lastrow) && imap[k] == -1) { rind[nrecv++] = k; imap[k] = -2; } } } hypre_sincsort_fast(nrecv, rind); /**** select between L and U "x" vectors ****/ if ( DoingL ) { ldu->lxlen = hypre_GlobalSEMax(lnrows+nrecv, pilut_comm ); x = ldu->lx = hypre_fp_malloc_init(ldu->lxlen, 0, "hypre_SetUpFactor: ldu->lx"); } else { ldu->uxlen = hypre_GlobalSEMax(lnrows+nrecv, pilut_comm); x = ldu->ux = hypre_fp_malloc_init(ldu->uxlen, 0, "hypre_SetUpFactor: ldu->ux"); } /* Determine processor boundaries */ j = 0; for (i=0; i= rowdist[i+1]) break; } petotal[i] = j-k; } /* Tell the processors how many elements I'll be sending */ rnbrpes = 0; for (i=0; i 0) { rnbrpes++; } } TriSolveComm->rnbrpes = rnbrpes ; hypre_MPI_Alltoall( petotal, 1, HYPRE_MPI_INT, lu_recv, 1, HYPRE_MPI_INT, pilut_comm ); /* Determine to how many processors you will be sending data */ snbrpes = 0; nsend = 0; for (i=0; i 0) { snbrpes++; nsend += lu_recv[i]; if ((*maxsendP) < lu_recv[i]) (*maxsendP) = lu_recv[i]; } } TriSolveComm->snbrpes = snbrpes; /* Allocate sufficient memory for the various data structures for TriSolveComm */ TriSolveComm->auxsptr = hypre_idx_malloc(snbrpes+1, "hypre_SetUpFactor: TriSolveComm->auxsptr"); spes = TriSolveComm->spes = hypre_idx_malloc(snbrpes, "hypre_SetUpFactor: TriSolveComm->spes" ); sptr = TriSolveComm->sptr = hypre_idx_malloc(snbrpes+1, "hypre_SetUpFactor: TriSolveComm->sptr" ); sindex = TriSolveComm->sindex = hypre_idx_malloc(hypre_GlobalSEMax(nsend, pilut_comm), "hypre_SetUpFactor: TriSolveComm->sindex"); TriSolveComm->rdone = hypre_idx_malloc(rnbrpes, "hypre_SetUpFactor: TriSolveComm->rpes"); rpes = TriSolveComm->rpes = hypre_idx_malloc(rnbrpes, "hypre_SetUpFactor: TriSolveComm->rpes" ); raddr = TriSolveComm->raddr = (HYPRE_Real**) hypre_mymalloc( sizeof(HYPRE_Real*)*(rnbrpes+1), "hypre_SetUpFactor: TriSolveComm->raddr"); /* Save send addresses, lengths, and construct spes */ snbrpes = 0; for (i=0; i 0) { spes[snbrpes] = i; sptr[snbrpes] = lu_recv[i]; snbrpes++; lu_recv[i] = 0; } } hypre_assert( TriSolveComm->snbrpes == snbrpes ); /* Create a sptr array into sindex */ for (i=1; i0; i--) sptr[i] = sptr[i-1]; sptr[0] = 0; /* Allocate requests */ receive_requests = hypre_CTAlloc( hypre_MPI_Request, npes , HYPRE_MEMORY_HOST); /* Start asynchronous receives */ for (i=0; i 0) { hypre_MPI_Send( rind+k, petotal[i], HYPRE_MPI_INT , i, TAG_SetUp_rind, pilut_comm ); /* recv info for hypre_LDUSolve */ raddr[rnbrpes] = x + k + lnrows; rpes [rnbrpes] = i; rnbrpes++; k += petotal[i]; hypre_assert( k < ddist->ddist_nrows ); } } /* this last one is to compute (raddr[i+1] - raddr[i]) */ raddr[rnbrpes] = x + k + lnrows; hypre_assert( TriSolveComm->rnbrpes == rnbrpes ); /* complete asynchronous receives */ for (i=0; i 0) { hypre_MPI_Irecv( rind+k, petotal[i], HYPRE_MPI_INT, i, TAG_SetUp_reord, pilut_comm, &receive_requests[i] ); k += petotal[i]; } } /* Write them back to the processors that send them to me */ for (i=0; i 0) { hypre_MPI_Wait( &receive_requests[i], &Status ); } } /* Apply the iperm[] onto the sindex for easy indexing during solution */ for (i=0; irnum = hypre_idx_malloc(nlevels * rnbrpes, "hypre_SetUpFactor: TriSolveComm->rnum"); rnum = hypre_idx_malloc(nlevels, "hypre_SetUpFactor: rnum" ); hypre_memcpy_idx(TriSolveComm->auxsptr, sptr, snbrpes+1); /**** send the number of elements we are going to send to each PE. **** Note the inner for loop has no body, and L and U differ slightly. **** For L, rnum[nlevels-1] is undefined and rnum only has (nlevels-1) entries ****/ for (i=0; iauxsptr[i], l=0; jnnodes[ii]; j++, l++) ; rnum[ii-1] = l; TriSolveComm->auxsptr[i] = j; } rnum[nlevels-1] = 0; /* never used */ } else { for (ii=nlevels; ii>0; ii--) { for (j=TriSolveComm->auxsptr[i], l=0; j=ldu->nnodes[ii-1]; j++, l++) ; rnum[ii-1] = l; TriSolveComm->auxsptr[i] = j; } } hypre_MPI_Send( rnum, nlevels, HYPRE_MPI_INT, spes[i], TAG_SetUp_rnum, pilut_comm ); } if (rnum) hypre_TFree(rnum,HYPRE_MEMORY_HOST); /* recieve data as columns rather than rows */ hypre_MPI_Type_vector( nlevels, 1, rnbrpes, HYPRE_MPI_INT, &MyColType_rnbr ); hypre_MPI_Type_commit( &MyColType_rnbr ); /* receive each column */ for (i=0; irnum+i, 1, MyColType_rnbr, rpes[i], TAG_SetUp_rnum, pilut_comm, &Status ); } hypre_MPI_Type_free( &MyColType_rnbr ); /* Now, go and create the renumbered L (U) that is also in CSR format */ newrowptr = hypre_idx_malloc(lnrows+1, "hypre_SetUpFactor: rowptr"); newcolind = hypre_idx_malloc(lnrows*maxnz, "hypre_SetUpFactor: colind"); newvalues = hypre_fp_malloc(lnrows*maxnz, "hypre_SetUpFactor: values"); newrowptr[0] = 0; k = 0; for (ii=0; iilsrowptr, ldu->lerowptr, ldu->lcolind, ldu->lvalues, -1);*/ hypre_TFree(ldu->lsrowptr, HYPRE_MEMORY_HOST); hypre_TFree(ldu->lerowptr, HYPRE_MEMORY_HOST); hypre_TFree(ldu->lcolind, HYPRE_MEMORY_HOST); hypre_TFree(ldu->lvalues, HYPRE_MEMORY_HOST); ldu->lrowptr = newrowptr; ldu->lcolind = newcolind; ldu->lvalues = newvalues; } else { /* Use uvalues as a buffer to permute the dvalues */ for (i=0; idvalues[perm[i]]; hypre_memcpy_fp(ldu->dvalues, values, lnrows); /* Free memory that stored the U so far and relink the data structures */ /*hypre_free_multi(ldu->usrowptr, ldu->uerowptr, ldu->ucolind, ldu->uvalues, -1);*/ hypre_TFree(ldu->usrowptr, HYPRE_MEMORY_HOST); hypre_TFree(ldu->uerowptr, HYPRE_MEMORY_HOST); hypre_TFree(ldu->ucolind, HYPRE_MEMORY_HOST); hypre_TFree(ldu->uvalues, HYPRE_MEMORY_HOST); ldu->urowptr = newrowptr; ldu->ucolind = newcolind; ldu->uvalues = newvalues; } /* clean up memory */ hypre_TFree(receive_requests, HYPRE_MEMORY_HOST); /* Reset the imap by only touching the appropriate elements */ for (i=0; i hypre_abs(val[max])) max = j; } if (max != i) { SWAP(idx[i], idx[max], tmpidx); SWAP(val[i], val[max], tmpval); } } } /************************************************************************* * This function takes an (idx, val) array and compacts it so that every * entry with idx[] = -1, gets removed. It returns the new count **************************************************************************/ HYPRE_Int hypre_CompactIdx(HYPRE_Int n, HYPRE_Int *idx, HYPRE_Real *val) { HYPRE_Int i, j; j = n-1; for (i=0; i i && idx[j] == -1) j--; if (j > i) { idx[i] = idx[j]; val[i] = val[j]; j--; } else { n = i; break; } } if (i == j) { n = i+1; break; } } return n; } /************************************************************************* * This function prints an (idx, val) pair **************************************************************************/ void hypre_PrintIdxVal(HYPRE_Int n, HYPRE_Int *idx, HYPRE_Real *val) { HYPRE_Int i; hypre_printf("%3d ", n); for (i=0; ikey - n1->key; } /************************************************************************* * This function sorts an array of type KeyValueType in increasing order **************************************************************************/ void hypre_SortKeyValueNodesDec(KeyValueType *nodes, HYPRE_Int n) { hypre_tex_qsort((char *)nodes, (size_t)n, (size_t)sizeof(KeyValueType), (HYPRE_Int (*) (char*,char*))hypre_DecKeyValueCmp); } /************************************************************************* * This function sums the entries in an array **************************************************************************/ HYPRE_Int hypre_sasum(HYPRE_Int n, HYPRE_Int *x) { HYPRE_Int sum = 0; HYPRE_Int i; for (i=0; iGetRow_timer = hypre_InitializeTiming( "GetRow" ); #endif return matrix; } /*-------------------------------------------------------------------------- * hypre_DistributedMatrixDestroy *--------------------------------------------------------------------------*/ HYPRE_Int hypre_DistributedMatrixDestroy( hypre_DistributedMatrix *matrix ) { if ( hypre_DistributedMatrixLocalStorageType(matrix) == HYPRE_PETSC ) hypre_DistributedMatrixDestroyPETSc( matrix ); else if ( hypre_DistributedMatrixLocalStorageType(matrix) == HYPRE_ISIS ) hypre_FreeDistributedMatrixISIS( matrix ); else if ( hypre_DistributedMatrixLocalStorageType(matrix) == HYPRE_PARCSR ) hypre_DistributedMatrixDestroyParCSR( matrix ); else return(-1); #ifdef HYPRE_TIMING hypre_FinalizeTiming ( matrix->GetRow_timer ); #endif hypre_TFree(matrix, HYPRE_MEMORY_HOST); return(0); } /*-------------------------------------------------------------------------- * hypre_DistributedMatrixLimitedDestroy *--------------------------------------------------------------------------*/ HYPRE_Int hypre_DistributedMatrixLimitedDestroy( hypre_DistributedMatrix *matrix ) { hypre_TFree(matrix, HYPRE_MEMORY_HOST); return(0); } /*-------------------------------------------------------------------------- * hypre_DistributedMatrixInitialize *--------------------------------------------------------------------------*/ HYPRE_Int hypre_DistributedMatrixInitialize( hypre_DistributedMatrix *matrix ) { HYPRE_Int ierr = 0; if ( hypre_DistributedMatrixLocalStorageType(matrix) == HYPRE_PETSC ) return( 0 ); else if ( hypre_DistributedMatrixLocalStorageType(matrix) == HYPRE_ISIS ) ierr = hypre_InitializeDistributedMatrixISIS(matrix); else if ( hypre_DistributedMatrixLocalStorageType(matrix) == HYPRE_PARCSR ) ierr = hypre_DistributedMatrixInitializeParCSR(matrix); else ierr = -1; return( ierr ); } /*-------------------------------------------------------------------------- * hypre_DistributedMatrixAssemble *--------------------------------------------------------------------------*/ HYPRE_Int hypre_DistributedMatrixAssemble( hypre_DistributedMatrix *matrix ) { if( (hypre_DistributedMatrixLocalStorageType(matrix) != HYPRE_PETSC ) && (hypre_DistributedMatrixLocalStorageType(matrix) != HYPRE_ISIS ) && (hypre_DistributedMatrixLocalStorageType(matrix) != HYPRE_PARCSR ) ) return(-1); if( hypre_DistributedMatrixLocalStorage(matrix) == NULL ) return(-1); if( (hypre_DistributedMatrixM(matrix) < 0 ) || (hypre_DistributedMatrixN(matrix) < 0 ) ) return(-1); return(0); } /*-------------------------------------------------------------------------- * Get/Sets that are independent of underlying storage type *--------------------------------------------------------------------------*/ /*-------------------------------------------------------------------------- * hypre_DistributedMatrixSetLocalStorageType *--------------------------------------------------------------------------*/ HYPRE_Int hypre_DistributedMatrixSetLocalStorageType( hypre_DistributedMatrix *matrix, HYPRE_Int type ) { HYPRE_Int ierr=0; hypre_DistributedMatrixLocalStorageType(matrix) = type; return(ierr); } /*-------------------------------------------------------------------------- * hypre_DistributedMatrixGetLocalStorageType *--------------------------------------------------------------------------*/ HYPRE_Int hypre_DistributedMatrixGetLocalStorageType( hypre_DistributedMatrix *matrix ) { HYPRE_Int ierr=0; ierr = hypre_DistributedMatrixLocalStorageType(matrix); return(ierr); } /*-------------------------------------------------------------------------- * hypre_DistributedMatrixSetLocalStorage *--------------------------------------------------------------------------*/ HYPRE_Int hypre_DistributedMatrixSetLocalStorage( hypre_DistributedMatrix *matrix, void *local_storage ) { HYPRE_Int ierr=0; hypre_DistributedMatrixLocalStorage(matrix) = local_storage; return(ierr); } /*-------------------------------------------------------------------------- * hypre_DistributedMatrixGetLocalStorage *--------------------------------------------------------------------------*/ void * hypre_DistributedMatrixGetLocalStorage( hypre_DistributedMatrix *matrix ) { return( hypre_DistributedMatrixLocalStorage(matrix) ); } /*-------------------------------------------------------------------------- * hypre_DistributedMatrixSetTranslator *--------------------------------------------------------------------------*/ HYPRE_Int hypre_DistributedMatrixSetTranslator( hypre_DistributedMatrix *matrix, void *translator ) { hypre_DistributedMatrixTranslator(matrix) = translator; return(0); } /*-------------------------------------------------------------------------- * hypre_DistributedMatrixGetTranslator *--------------------------------------------------------------------------*/ void * hypre_DistributedMatrixGetTranslator( hypre_DistributedMatrix *matrix ) { return( hypre_DistributedMatrixTranslator(matrix) ); } /*-------------------------------------------------------------------------- * hypre_DistributedMatrixSetAuxiliaryData *--------------------------------------------------------------------------*/ HYPRE_Int hypre_DistributedMatrixSetAuxiliaryData( hypre_DistributedMatrix *matrix, void *auxiliary_data ) { hypre_DistributedMatrixAuxiliaryData(matrix) = auxiliary_data; return(0); } /*-------------------------------------------------------------------------- * hypre_DistributedMatrixGetAuxiliaryData *--------------------------------------------------------------------------*/ void * hypre_DistributedMatrixGetAuxiliaryData( hypre_DistributedMatrix *matrix ) { return( hypre_DistributedMatrixAuxiliaryData(matrix) ); } /*-------------------------------------------------------------------------- * Optional routines that depend on underlying storage type *--------------------------------------------------------------------------*/ /*-------------------------------------------------------------------------- * hypre_DistributedMatrixPrint *--------------------------------------------------------------------------*/ HYPRE_Int hypre_DistributedMatrixPrint( hypre_DistributedMatrix *matrix ) { if ( hypre_DistributedMatrixLocalStorageType(matrix) == HYPRE_PETSC ) return( hypre_DistributedMatrixPrintPETSc( matrix ) ); else if ( hypre_DistributedMatrixLocalStorageType(matrix) == HYPRE_ISIS ) return( hypre_PrintDistributedMatrixISIS( matrix ) ); else if ( hypre_DistributedMatrixLocalStorageType(matrix) == HYPRE_PARCSR ) return( hypre_DistributedMatrixPrintParCSR( matrix ) ); else return(-1); } /*-------------------------------------------------------------------------- * hypre_DistributedMatrixGetLocalRange *--------------------------------------------------------------------------*/ HYPRE_Int hypre_DistributedMatrixGetLocalRange( hypre_DistributedMatrix *matrix, HYPRE_BigInt *row_start, HYPRE_BigInt *row_end, HYPRE_BigInt *col_start, HYPRE_BigInt *col_end ) { if ( hypre_DistributedMatrixLocalStorageType(matrix) == HYPRE_PETSC ) return( hypre_DistributedMatrixGetLocalRangePETSc( matrix, row_start, row_end ) ); else if ( hypre_DistributedMatrixLocalStorageType(matrix) == HYPRE_ISIS ) return( hypre_GetDistributedMatrixLocalRangeISIS( matrix, row_start, row_end ) ); else if ( hypre_DistributedMatrixLocalStorageType(matrix) == HYPRE_PARCSR ) return( hypre_DistributedMatrixGetLocalRangeParCSR( matrix, row_start, row_end, col_start, col_end ) ); else return(-1); } /*-------------------------------------------------------------------------- * hypre_DistributedMatrixGetRow *--------------------------------------------------------------------------*/ HYPRE_Int hypre_DistributedMatrixGetRow( hypre_DistributedMatrix *matrix, HYPRE_BigInt row, HYPRE_Int *size, HYPRE_BigInt **col_ind, HYPRE_Real **values ) { HYPRE_Int ierr = 0; #ifdef HYPRE_TIMING hypre_BeginTiming( matrix->GetRow_timer ); #endif if ( hypre_DistributedMatrixLocalStorageType(matrix) == HYPRE_PETSC ) { ierr = hypre_DistributedMatrixGetRowPETSc( matrix, row, size, col_ind, values ); } else if ( hypre_DistributedMatrixLocalStorageType(matrix) == HYPRE_ISIS ) { ierr = hypre_GetDistributedMatrixRowISIS( matrix, row, size, col_ind, values ); } else if ( hypre_DistributedMatrixLocalStorageType(matrix) == HYPRE_PARCSR ) { ierr = hypre_DistributedMatrixGetRowParCSR( matrix, row, size, col_ind, values ); } else ierr = -1; #ifdef HYPRE_TIMING hypre_EndTiming( matrix->GetRow_timer ); #endif return( ierr ); } /*-------------------------------------------------------------------------- * hypre_DistributedMatrixRestoreRow *--------------------------------------------------------------------------*/ HYPRE_Int hypre_DistributedMatrixRestoreRow( hypre_DistributedMatrix *matrix, HYPRE_BigInt row, HYPRE_Int *size, HYPRE_BigInt **col_ind, HYPRE_Real **values ) { HYPRE_Int ierr = 0; #ifdef HYPRE_TIMING hypre_BeginTiming( matrix->GetRow_timer ); #endif if ( hypre_DistributedMatrixLocalStorageType(matrix) == HYPRE_PETSC ) ierr = hypre_DistributedMatrixRestoreRowPETSc( matrix, row, size, col_ind, values ); else if ( hypre_DistributedMatrixLocalStorageType(matrix) == HYPRE_ISIS ) ierr = hypre_RestoreDistributedMatrixRowISIS( matrix, row, size, col_ind, values ); else if ( hypre_DistributedMatrixLocalStorageType(matrix) == HYPRE_PARCSR ) ierr = hypre_DistributedMatrixRestoreRowParCSR( matrix, row, size, col_ind, values ); else ierr = -1; #ifdef HYPRE_TIMING hypre_EndTiming( matrix->GetRow_timer ); #endif return( ierr ); } hypre-2.33.0/src/distributed_matrix/distributed_matrix.h000066400000000000000000000050701477326011500235120ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * Header info for the hypre_DistributedMatrix structures * *****************************************************************************/ #ifndef hypre_DISTRIBUTED_MATRIX_HEADER #define hypre_DISTRIBUTED_MATRIX_HEADER #include "_hypre_utilities.h" /*-------------------------------------------------------------------------- * hypre_DistributedMatrix: *--------------------------------------------------------------------------*/ typedef struct { MPI_Comm context; HYPRE_BigInt M, N; /* number of rows and cols in matrix */ void *auxiliary_data; /* Placeholder for implmentation specific data */ void *local_storage; /* Structure for storing local portion */ HYPRE_Int local_storage_type; /* Indicates the type of "local storage" */ void *translator; /* optional storage_type specfic structure for holding additional local info */ #ifdef HYPRE_TIMING HYPRE_Int GetRow_timer; #endif } hypre_DistributedMatrix; /*-------------------------------------------------------------------------- * Accessor macros: hypre_DistributedMatrix *--------------------------------------------------------------------------*/ #define hypre_DistributedMatrixContext(matrix) ((matrix) -> context) #define hypre_DistributedMatrixM(matrix) ((matrix) -> M) #define hypre_DistributedMatrixN(matrix) ((matrix) -> N) #define hypre_DistributedMatrixAuxiliaryData(matrix) ((matrix) -> auxiliary_data) #define hypre_DistributedMatrixLocalStorageType(matrix) ((matrix) -> local_storage_type) #define hypre_DistributedMatrixTranslator(matrix) ((matrix) -> translator) #define hypre_DistributedMatrixLocalStorage(matrix) ((matrix) -> local_storage) /*-------------------------------------------------------------------------- * prototypes for operations on local objects *--------------------------------------------------------------------------*/ #include "HYPRE_distributed_matrix_mv.h" #include "internal_protos.h" #endif hypre-2.33.0/src/distributed_matrix/distributed_matrix_ISIS.c000066400000000000000000000132751477326011500243420ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /* THIS IS A C++ FILE, since it needs to call ISIS++ with objects */ #ifdef ISIS_AVAILABLE #include "iostream.h" #include "RowMatrix.h" /* ISIS++ header file */ #endif #include "./distributed_matrix.h" #ifdef ISIS_AVAILABLE extern "C" { typedef struct { HYPRE_BigInt *ind; HYPRE_Real *val; } RowBuf; #endif /*-------------------------------------------------------------------------- * hypre_InitializeDistributedMatrixISIS *--------------------------------------------------------------------------*/ /* matrix must be set before calling this function*/ HYPRE_Int hypre_InitializeDistributedMatrixISIS(hypre_DistributedMatrix *dm) { #ifdef ISIS_AVAILABLE RowMatrix *mat = (RowMatrix *) hypre_DistributedMatrixLocalStorage(dm); const Map& map = mat->getMap(); HYPRE_BigInt num_rows = mat->getMap().n(); HYPRE_BigInt num_cols = mat->getMap().n(); hypre_DistributedMatrixM(dm) = num_rows; hypre_DistributedMatrixN(dm) = num_cols; /* allocate space for row buffers */ RowBuf *rowbuf = new RowBuf; rowbuf->ind = new HYPRE_BigInt[num_cols]; rowbuf->val = new HYPRE_Real[num_cols]; dm->auxiliary_data = (void *) rowbuf; #else HYPRE_UNUSED_VAR(dm); #endif return 0; } /*-------------------------------------------------------------------------- * hypre_FreeDistributedMatrixISIS *--------------------------------------------------------------------------*/ HYPRE_Int hypre_FreeDistributedMatrixISIS( hypre_DistributedMatrix *dm) { #ifdef ISIS_AVAILABLE RowBuf *rowbuf = (RowBuf *) dm->auxiliary_data; delete rowbuf->ind; delete rowbuf->val; delete rowbuf; #else HYPRE_UNUSED_VAR(dm); #endif return 0; } /*-------------------------------------------------------------------------- * hypre_PrintDistributedMatrixISIS *--------------------------------------------------------------------------*/ HYPRE_Int hypre_PrintDistributedMatrixISIS( hypre_DistributedMatrix *dm ) { HYPRE_UNUSED_VAR(dm); #ifdef ISIS_AVAILABLE cout << "hypre_PrintDistributedMatrixISIS not implemented" << endl; #endif return -1; } /*-------------------------------------------------------------------------- * hypre_GetDistributedMatrixLocalRangeISIS *--------------------------------------------------------------------------*/ HYPRE_Int hypre_GetDistributedMatrixLocalRangeISIS( hypre_DistributedMatrix *dm, HYPRE_BigInt *start, HYPRE_BigInt *end ) { #ifdef ISIS_AVAILABLE RowMatrix *mat = (RowMatrix *) hypre_DistributedMatrixLocalStorage(dm); *start = mat->getMap().startRow() - 1; /* convert to 0-based */ *end = mat->getMap().endRow(); /* endRow actually returns 1 less */ cout << "LocalRangeISIS " << *start << " " << *end << endl; #else HYPRE_UNUSED_VAR(dm); HYPRE_UNUSED_VAR(start); HYPRE_UNUSED_VAR(end); #endif return 0; } /*-------------------------------------------------------------------------- * hypre_GetDistributedMatrixRowISIS *--------------------------------------------------------------------------*/ /* semantics: buffers returned will be overwritten on next call to this get function */ HYPRE_Int hypre_GetDistributedMatrixRowISIS( hypre_DistributedMatrix *dm, HYPRE_BigInt row, HYPRE_Int *size, HYPRE_BigInt **col_ind, HYPRE_Real **values ) { #ifdef ISIS_AVAILABLE RowMatrix *mat = (RowMatrix *) hypre_DistributedMatrixLocalStorage(dm); RowBuf *rowbuf; HYPRE_Int i, temp; rowbuf = (RowBuf *) dm->auxiliary_data; mat->getRow(row+1, temp, rowbuf->val, rowbuf->ind); #if 0 /* add diagonal element if necessary */ { HYPRE_Int *p; HYPRE_Int found = 0; for (i=0, p=rowbuf->ind; iind[temp] = row+1; rowbuf->val[temp] = 1.; /* pick a value */ temp++; } } #endif /* set pointers to local buffers */ if (col_ind != NULL) { HYPRE_BigInt *p; *size = temp; *col_ind = rowbuf->ind; /* need to convert to 0-based indexing for output */ for (i=0, p=*col_ind; ival; *size = temp; } #else HYPRE_UNUSED_VAR(dm); HYPRE_UNUSED_VAR(row); HYPRE_UNUSED_VAR(size); HYPRE_UNUSED_VAR(col_ind); HYPRE_UNUSED_VAR(values); #endif return 0; } /*-------------------------------------------------------------------------- * hypre_RestoreDistributedMatrixRowISIS *--------------------------------------------------------------------------*/ HYPRE_Int hypre_RestoreDistributedMatrixRowISIS( hypre_DistributedMatrix *dm, HYPRE_BigInt row, HYPRE_Int *size, HYPRE_BigInt **col_ind, HYPRE_Real **values ) { /* does nothing, since we use local buffers */ HYPRE_UNUSED_VAR(dm); HYPRE_UNUSED_VAR(row); HYPRE_UNUSED_VAR(size); HYPRE_UNUSED_VAR(col_ind); HYPRE_UNUSED_VAR(values); return 0; } #ifdef ISIS_AVAILABLE } /* extern "C" */ #endif hypre-2.33.0/src/distributed_matrix/distributed_matrix_ISIS.cc000066400000000000000000000121121477326011500244720ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /* THIS IS A C++ FILE, since it needs to call ISIS++ with objects */ #ifdef ISIS_AVAILABLE #include "iostream.h" #include "RowMatrix.h" // ISIS++ header file #endif #include "./distributed_matrix.h" #ifdef ISIS_AVAILABLE extern "C" { typedef struct { HYPRE_BigInt *ind; HYPRE_Real *val; } RowBuf; #endif /*-------------------------------------------------------------------------- * hypre_InitializeDistributedMatrixISIS *--------------------------------------------------------------------------*/ /* matrix must be set before calling this function*/ HYPRE_Int hypre_InitializeDistributedMatrixISIS(hypre_DistributedMatrix *dm) { #ifdef ISIS_AVAILABLE RowMatrix *mat = (RowMatrix *) hypre_DistributedMatrixLocalStorage(dm); const Map& map = mat->getMap(); HYPRE_BigInt num_rows = mat->getMap().n(); HYPRE_BigInt num_cols = mat->getMap().n(); hypre_DistributedMatrixM(dm) = num_rows; hypre_DistributedMatrixN(dm) = num_cols; /* allocate space for row buffers */ RowBuf *rowbuf = new RowBuf; rowbuf->ind = new HYPRE_Int[num_cols]; rowbuf->val = new HYPRE_Real[num_cols]; dm->auxiliary_data = (void *) rowbuf; #endif return 0; } /*-------------------------------------------------------------------------- * hypre_FreeDistributedMatrixISIS *--------------------------------------------------------------------------*/ HYPRE_Int hypre_FreeDistributedMatrixISIS( hypre_DistributedMatrix *dm) { #ifdef ISIS_AVAILABLE RowBuf *rowbuf = (RowBuf *) dm->auxiliary_data; delete rowbuf->ind; delete rowbuf->val; delete rowbuf; #endif return 0; } /*-------------------------------------------------------------------------- * hypre_PrintDistributedMatrixISIS *--------------------------------------------------------------------------*/ HYPRE_Int hypre_PrintDistributedMatrixISIS( hypre_DistributedMatrix *matrix ) { #ifdef ISIS_AVAILABLE cout << "hypre_PrintDistributedMatrixISIS not implemented" << endl; #endif return -1; } /*-------------------------------------------------------------------------- * hypre_GetDistributedMatrixLocalRangeISIS *--------------------------------------------------------------------------*/ HYPRE_Int hypre_GetDistributedMatrixLocalRangeISIS( hypre_DistributedMatrix *dm, HYPRE_BigInt *start, HYPRE_BigInt *end ) { #ifdef ISIS_AVAILABLE RowMatrix *mat = (RowMatrix *) hypre_DistributedMatrixLocalStorage(dm); *start = mat->getMap().startRow() - 1; // convert to 0-based *end = mat->getMap().endRow(); // endRow actually returns 1 less cout << "LocalRangeISIS " << *start << " " << *end << endl; #endif return 0; } /*-------------------------------------------------------------------------- * hypre_GetDistributedMatrixRowISIS *--------------------------------------------------------------------------*/ /* semantics: buffers returned will be overwritten on next call to // this get function */ HYPRE_Int hypre_GetDistributedMatrixRowISIS( hypre_DistributedMatrix *dm, HYPRE_BigInt row, HYPRE_Int *size, HYPRE_BigInt **col_ind, HYPRE_Real **values ) { #ifdef ISIS_AVAILABLE RowMatrix *mat = (RowMatrix *) hypre_DistributedMatrixLocalStorage(dm); RowBuf *rowbuf; HYPRE_Int i, temp; rowbuf = (RowBuf *) dm->auxiliary_data; mat->getRow(row+1, temp, rowbuf->val, rowbuf->ind); #if 0 // add diagonal element if necessary { HYPRE_Int *p; HYPRE_Int found = 0; for (i=0, p=rowbuf->ind; iind[temp] = row+1; rowbuf->val[temp] = 1.; // pick a value temp++; } } #endif // set pointers to local buffers if (col_ind != NULL) { HYPRE_BigInt *p; *size = temp; *col_ind = rowbuf->ind; // need to convert to 0-based indexing for output for (i=0, p=*col_ind; ival; *size = temp; } #endif return 0; } /*-------------------------------------------------------------------------- * hypre_RestoreDistributedMatrixRowISIS *--------------------------------------------------------------------------*/ HYPRE_Int hypre_RestoreDistributedMatrixRowISIS( hypre_DistributedMatrix *dm, HYPRE_BigInt row, HYPRE_Int *size, HYPRE_BigInt **col_ind, HYPRE_Real **values ) { /* does nothing, since we use local buffers */ return 0; } #ifdef ISIS_AVAILABLE } // extern "C" #endif hypre-2.33.0/src/distributed_matrix/distributed_matrix_PETSc.c000066400000000000000000000112401477326011500244770ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * Member functions for hypre_DistributedMatrix class for PETSc storage scheme. * *****************************************************************************/ #include "./distributed_matrix.h" /* Public headers and prototypes for PETSc matrix library */ #ifdef PETSC_AVAILABLE #include "sles.h" #endif /*-------------------------------------------------------------------------- * hypre_DistributedMatrixDestroyPETSc * Internal routine for freeing a matrix stored in PETSc form. *--------------------------------------------------------------------------*/ HYPRE_Int hypre_DistributedMatrixDestroyPETSc( hypre_DistributedMatrix *dm ) { #ifdef PETSC_AVAILABLE Mat PETSc_matrix = (Mat) hypre_DistributedMatrixLocalStorage(dm); MatDestroy( PETSc_matrix ); #else HYPRE_UNUSED_VAR(dm); #endif return(0); } /*-------------------------------------------------------------------------- * Optional routines that depend on underlying storage type *--------------------------------------------------------------------------*/ /*-------------------------------------------------------------------------- * hypre_DistributedMatrixPrintPETSc * Internal routine for printing a matrix stored in PETSc form. *--------------------------------------------------------------------------*/ HYPRE_Int hypre_DistributedMatrixPrintPETSc( hypre_DistributedMatrix *dm ) { HYPRE_Int ierr=0; #ifdef PETSC_AVAILABLE Mat PETSc_matrix = (Mat) hypre_DistributedMatrixLocalStorage(dm); ierr = MatView( PETSc_matrix, VIEWER_STDOUT_WORLD ); #else HYPRE_UNUSED_VAR(dm); #endif return(ierr); } /*-------------------------------------------------------------------------- * hypre_DistributedMatrixGetLocalRangePETSc *--------------------------------------------------------------------------*/ HYPRE_Int hypre_DistributedMatrixGetLocalRangePETSc( hypre_DistributedMatrix *dm, HYPRE_BigInt *start, HYPRE_BigInt *end ) { HYPRE_Int ierr=0; #ifdef PETSC_AVAILABLE Mat PETSc_matrix = (Mat) hypre_DistributedMatrixLocalStorage(dm); if (!PETSc_matrix) return(-1); ierr = MatGetOwnershipRange( PETSc_matrix, start, end ); CHKERRA(ierr); /* Since PETSc's MatGetOwnershipRange actually returns end = "one more than the global index of the last local row", we need to subtract one; hypre assumes we return the index of the last row itself. */ *end = *end - 1; #else HYPRE_UNUSED_VAR(dm); HYPRE_UNUSED_VAR(start); HYPRE_UNUSED_VAR(end); #endif return(ierr); } /*-------------------------------------------------------------------------- * hypre_DistributedMatrixGetRowPETSc *--------------------------------------------------------------------------*/ HYPRE_Int hypre_DistributedMatrixGetRowPETSc( hypre_DistributedMatrix *dm, HYPRE_BigInt row, HYPRE_Int *size, HYPRE_BigInt **col_ind, HYPRE_Real **values ) { HYPRE_Int ierr=0; #ifdef PETSC_AVAILABLE Mat PETSc_matrix = (Mat) hypre_DistributedMatrixLocalStorage(dm); if (!PETSc_matrix) return(-1); ierr = MatGetRow( PETSc_matrix, row, size, col_ind, values); CHKERRA(ierr); #else HYPRE_UNUSED_VAR(dm); HYPRE_UNUSED_VAR(row); HYPRE_UNUSED_VAR(size); HYPRE_UNUSED_VAR(col_ind); HYPRE_UNUSED_VAR(values); #endif return(ierr); } /*-------------------------------------------------------------------------- * hypre_DistributedMatrixRestoreRowPETSc *--------------------------------------------------------------------------*/ HYPRE_Int hypre_DistributedMatrixRestoreRowPETSc( hypre_DistributedMatrix *dm, HYPRE_BigInt row, HYPRE_Int *size, HYPRE_BigInt **col_ind, HYPRE_Real **values ) { HYPRE_Int ierr=0; #ifdef PETSC_AVAILABLE Mat PETSc_matrix = (Mat) hypre_DistributedMatrixLocalStorage(dm); if (PETSc_matrix == NULL) return(-1); ierr = MatRestoreRow( PETSc_matrix, row, size, col_ind, values); CHKERRA(ierr); #else HYPRE_UNUSED_VAR(dm); HYPRE_UNUSED_VAR(row); HYPRE_UNUSED_VAR(size); HYPRE_UNUSED_VAR(col_ind); HYPRE_UNUSED_VAR(values); #endif return(ierr); } hypre-2.33.0/src/distributed_matrix/distributed_matrix_parcsr.c000066400000000000000000000115131477326011500250560ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * Member functions for hypre_DistributedMatrix class for par_csr storage scheme. * *****************************************************************************/ #include "./distributed_matrix.h" #include "HYPRE_parcsr_mv.h" /*-------------------------------------------------------------------------- * hypre_DistributedMatrixDestroyParCSR * Internal routine for freeing a matrix stored in Parcsr form. *--------------------------------------------------------------------------*/ HYPRE_Int hypre_DistributedMatrixDestroyParCSR( hypre_DistributedMatrix *dm ) { HYPRE_UNUSED_VAR(dm); return(0); } /*-------------------------------------------------------------------------- * hypre_DistributedMatrixInitializeParCSR *--------------------------------------------------------------------------*/ /* matrix must be set before calling this function*/ HYPRE_Int hypre_DistributedMatrixInitializeParCSR(hypre_DistributedMatrix *dm) { HYPRE_UNUSED_VAR(dm); return 0; } /*-------------------------------------------------------------------------- * Optional routines that depend on underlying storage type *--------------------------------------------------------------------------*/ /*-------------------------------------------------------------------------- * hypre_DistributedMatrixPrintParCSR * Internal routine for printing a matrix stored in Parcsr form. *--------------------------------------------------------------------------*/ HYPRE_Int hypre_DistributedMatrixPrintParCSR( hypre_DistributedMatrix *dm ) { HYPRE_Int ierr=0; HYPRE_ParCSRMatrix Parcsr_matrix = (HYPRE_ParCSRMatrix) hypre_DistributedMatrixLocalStorage(dm); HYPRE_ParCSRMatrixPrint( Parcsr_matrix, "STDOUT" ); return(ierr); } /*-------------------------------------------------------------------------- * hypre_DistributedMatrixGetLocalRangeParCSR *--------------------------------------------------------------------------*/ HYPRE_Int hypre_DistributedMatrixGetLocalRangeParCSR( hypre_DistributedMatrix *dm, HYPRE_BigInt *row_start, HYPRE_BigInt *row_end, HYPRE_BigInt *col_start, HYPRE_BigInt *col_end ) { HYPRE_Int ierr=0; HYPRE_ParCSRMatrix Parcsr_matrix = (HYPRE_ParCSRMatrix) hypre_DistributedMatrixLocalStorage(dm); if (!Parcsr_matrix) return(-1); ierr = HYPRE_ParCSRMatrixGetLocalRange( Parcsr_matrix, row_start, row_end, col_start, col_end ); return(ierr); } /*-------------------------------------------------------------------------- * hypre_DistributedMatrixGetRowParCSR *--------------------------------------------------------------------------*/ HYPRE_Int hypre_DistributedMatrixGetRowParCSR( hypre_DistributedMatrix *dm, HYPRE_BigInt row, HYPRE_Int *size, HYPRE_BigInt **col_ind, HYPRE_Real **values ) { HYPRE_Int ierr = 0; HYPRE_ParCSRMatrix Parcsr_matrix = (HYPRE_ParCSRMatrix) hypre_DistributedMatrixLocalStorage(dm); if (!Parcsr_matrix) return(-1); ierr = HYPRE_ParCSRMatrixGetRow( Parcsr_matrix, row, size, col_ind, values); // RL: if HYPRE_ParCSRMatrixGetRow was on device, need the next line to guarantee it's done #if defined(HYPRE_USING_GPU) hypre_SyncComputeStream(); #endif return(ierr); } /*-------------------------------------------------------------------------- * hypre_DistributedMatrixRestoreRowParCSR *--------------------------------------------------------------------------*/ HYPRE_Int hypre_DistributedMatrixRestoreRowParCSR( hypre_DistributedMatrix *dm, HYPRE_BigInt row, HYPRE_Int *size, HYPRE_BigInt **col_ind, HYPRE_Real **values ) { HYPRE_Int ierr; HYPRE_ParCSRMatrix Parcsr_matrix = (HYPRE_ParCSRMatrix) hypre_DistributedMatrixLocalStorage(dm); if (Parcsr_matrix == NULL) return(-1); ierr = HYPRE_ParCSRMatrixRestoreRow( Parcsr_matrix, row, size, col_ind, values); return(ierr); } hypre-2.33.0/src/distributed_matrix/internal_protos.h000066400000000000000000000143611477326011500230310ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /* HYPRE_distributed_matrix.c */ HYPRE_Int HYPRE_DistributedMatrixCreate (MPI_Comm context, HYPRE_DistributedMatrix *matrix ); HYPRE_Int HYPRE_DistributedMatrixDestroy (HYPRE_DistributedMatrix matrix ); HYPRE_Int HYPRE_DistributedMatrixLimitedDestroy (HYPRE_DistributedMatrix matrix ); HYPRE_Int HYPRE_DistributedMatrixInitialize (HYPRE_DistributedMatrix matrix ); HYPRE_Int HYPRE_DistributedMatrixAssemble (HYPRE_DistributedMatrix matrix ); HYPRE_Int HYPRE_DistributedMatrixSetLocalStorageType (HYPRE_DistributedMatrix matrix , HYPRE_Int type ); HYPRE_Int HYPRE_DistributedMatrixGetLocalStorageType (HYPRE_DistributedMatrix matrix ); HYPRE_Int HYPRE_DistributedMatrixSetLocalStorage (HYPRE_DistributedMatrix matrix , void *LocalStorage ); void *HYPRE_DistributedMatrixGetLocalStorage (HYPRE_DistributedMatrix matrix ); HYPRE_Int HYPRE_DistributedMatrixSetTranslator (HYPRE_DistributedMatrix matrix , void *Translator ); void *HYPRE_DistributedMatrixGetTranslator (HYPRE_DistributedMatrix matrix ); HYPRE_Int HYPRE_DistributedMatrixSetAuxiliaryData (HYPRE_DistributedMatrix matrix , void *AuxiliaryData ); void *HYPRE_DistributedMatrixGetAuxiliaryData (HYPRE_DistributedMatrix matrix ); MPI_Comm HYPRE_DistributedMatrixGetContext (HYPRE_DistributedMatrix matrix ); HYPRE_Int HYPRE_DistributedMatrixGetDims (HYPRE_DistributedMatrix matrix , HYPRE_BigInt *M , HYPRE_BigInt *N ); HYPRE_Int HYPRE_DistributedMatrixSetDims (HYPRE_DistributedMatrix matrix , HYPRE_BigInt M , HYPRE_BigInt N ); HYPRE_Int HYPRE_DistributedMatrixPrint (HYPRE_DistributedMatrix matrix ); HYPRE_Int HYPRE_DistributedMatrixGetLocalRange (HYPRE_DistributedMatrix matrix , HYPRE_BigInt *row_start , HYPRE_BigInt *row_end, HYPRE_BigInt *col_start, HYPRE_BigInt *col_end ); HYPRE_Int HYPRE_DistributedMatrixGetRow (HYPRE_DistributedMatrix matrix , HYPRE_BigInt row , HYPRE_Int *size , HYPRE_BigInt **col_ind , HYPRE_Real **values ); HYPRE_Int HYPRE_DistributedMatrixRestoreRow (HYPRE_DistributedMatrix matrix , HYPRE_BigInt row , HYPRE_Int *size , HYPRE_BigInt **col_ind , HYPRE_Real **values ); /* distributed_matrix.c */ hypre_DistributedMatrix *hypre_DistributedMatrixCreate (MPI_Comm context ); HYPRE_Int hypre_DistributedMatrixDestroy (hypre_DistributedMatrix *matrix ); HYPRE_Int hypre_DistributedMatrixLimitedDestroy (hypre_DistributedMatrix *matrix ); HYPRE_Int hypre_DistributedMatrixInitialize (hypre_DistributedMatrix *matrix ); HYPRE_Int hypre_DistributedMatrixAssemble (hypre_DistributedMatrix *matrix ); HYPRE_Int hypre_DistributedMatrixSetLocalStorageType (hypre_DistributedMatrix *matrix , HYPRE_Int type ); HYPRE_Int hypre_DistributedMatrixGetLocalStorageType (hypre_DistributedMatrix *matrix ); HYPRE_Int hypre_DistributedMatrixSetLocalStorage (hypre_DistributedMatrix *matrix , void *local_storage ); void *hypre_DistributedMatrixGetLocalStorage (hypre_DistributedMatrix *matrix ); HYPRE_Int hypre_DistributedMatrixSetTranslator (hypre_DistributedMatrix *matrix , void *translator ); void *hypre_DistributedMatrixGetTranslator (hypre_DistributedMatrix *matrix ); HYPRE_Int hypre_DistributedMatrixSetAuxiliaryData (hypre_DistributedMatrix *matrix , void *auxiliary_data ); void *hypre_DistributedMatrixGetAuxiliaryData (hypre_DistributedMatrix *matrix ); HYPRE_Int hypre_DistributedMatrixPrint (hypre_DistributedMatrix *matrix ); HYPRE_Int hypre_DistributedMatrixGetLocalRange (hypre_DistributedMatrix *matrix , HYPRE_BigInt *row_start , HYPRE_BigInt *row_end, HYPRE_BigInt *col_start, HYPRE_BigInt *col_end ); HYPRE_Int hypre_DistributedMatrixGetRow (hypre_DistributedMatrix *matrix , HYPRE_BigInt row , HYPRE_Int *size , HYPRE_BigInt **col_ind , HYPRE_Real **values ); HYPRE_Int hypre_DistributedMatrixRestoreRow (hypre_DistributedMatrix *matrix , HYPRE_BigInt row , HYPRE_Int *size , HYPRE_BigInt **col_ind , HYPRE_Real **values ); /* distributed_matrix_ISIS.c */ HYPRE_Int hypre_InitializeDistributedMatrixISIS(hypre_DistributedMatrix *dm); HYPRE_Int hypre_FreeDistributedMatrixISIS( hypre_DistributedMatrix *dm); HYPRE_Int hypre_PrintDistributedMatrixISIS( hypre_DistributedMatrix *matrix ); HYPRE_Int hypre_GetDistributedMatrixLocalRangeISIS( hypre_DistributedMatrix *dm, HYPRE_BigInt *start, HYPRE_BigInt *end ); HYPRE_Int hypre_GetDistributedMatrixRowISIS( hypre_DistributedMatrix *dm, HYPRE_BigInt row, HYPRE_Int *size, HYPRE_BigInt **col_ind, HYPRE_Real **values ); HYPRE_Int hypre_RestoreDistributedMatrixRowISIS( hypre_DistributedMatrix *dm, HYPRE_BigInt row, HYPRE_Int *size, HYPRE_BigInt **col_ind, HYPRE_Real **values ); /* distributed_matrix_PETSc.c */ HYPRE_Int hypre_DistributedMatrixDestroyPETSc (hypre_DistributedMatrix *distributed_matrix ); HYPRE_Int hypre_DistributedMatrixPrintPETSc (hypre_DistributedMatrix *matrix ); HYPRE_Int hypre_DistributedMatrixGetLocalRangePETSc (hypre_DistributedMatrix *matrix , HYPRE_BigInt *start , HYPRE_BigInt *end ); HYPRE_Int hypre_DistributedMatrixGetRowPETSc (hypre_DistributedMatrix *matrix , HYPRE_BigInt row , HYPRE_Int *size , HYPRE_BigInt **col_ind , HYPRE_Real **values ); HYPRE_Int hypre_DistributedMatrixRestoreRowPETSc (hypre_DistributedMatrix *matrix , HYPRE_BigInt row , HYPRE_Int *size , HYPRE_BigInt **col_ind , HYPRE_Real **values ); /* distributed_matrix_parcsr.c */ HYPRE_Int hypre_DistributedMatrixDestroyParCSR ( hypre_DistributedMatrix *distributed_matrix ); HYPRE_Int hypre_DistributedMatrixInitializeParCSR ( hypre_DistributedMatrix *matrix ); HYPRE_Int hypre_DistributedMatrixPrintParCSR ( hypre_DistributedMatrix *matrix ); HYPRE_Int hypre_DistributedMatrixGetLocalRangeParCSR ( hypre_DistributedMatrix *matrix , HYPRE_BigInt *row_start , HYPRE_BigInt *row_end , HYPRE_BigInt *col_start , HYPRE_BigInt *col_end ); HYPRE_Int hypre_DistributedMatrixGetRowParCSR ( hypre_DistributedMatrix *matrix , HYPRE_BigInt row , HYPRE_Int *size , HYPRE_BigInt **col_ind , HYPRE_Real **values ); HYPRE_Int hypre_DistributedMatrixRestoreRowParCSR ( hypre_DistributedMatrix *matrix , HYPRE_BigInt row , HYPRE_Int *size , HYPRE_BigInt **col_ind , HYPRE_Real **values ); hypre-2.33.0/src/docs/000077500000000000000000000000001477326011500144535ustar00rootroot00000000000000hypre-2.33.0/src/docs/Makefile000066400000000000000000000041101477326011500161070ustar00rootroot00000000000000# Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) include ../config/Makefile.config .SUFFIXES: .SUFFIXES: .c .dxx .html .tex ################################################################## # Targets ################################################################## all: usr install: all @ \ test ! -d ${HYPRE_INSTALL_DIR}/docs && \ mkdir -m 755 -p ${HYPRE_INSTALL_DIR}/docs; \ for dir in HYPRE_usr_manual HYPRE_ref_manual; do \ if test -d $$dir; then \ test ! -d ${HYPRE_INSTALL_DIR}/docs/$$dir && \ mkdir -m 755 -p ${HYPRE_INSTALL_DIR}/docs/$$dir; \ for file in $$dir/*; do \ cp -fp $$file ${HYPRE_INSTALL_DIR}/docs/$$file; \ done; \ fi; \ done; \ for file in HYPRE_usr_manual.pdf HYPRE_ref_manual.pdf; do \ test -f $$file && cp -fp $$file ${HYPRE_INSTALL_DIR}/docs/$$file; \ done clean: @cd usr-manual; make clean @cd ref-manual; make clean @/bin/rm -fr usr-manual-html ref-manual-html @/bin/rm -fr usr-manual.pdf ref-manual.pdf distclean: clean ################################################################## # Rules ################################################################## usr: ref @cd usr-manual; make html; make latexpdf @mv usr-manual/_build/html usr-manual-html @mv usr-manual/_build/latex/hypre.pdf usr-manual.pdf ref: @cd ref-manual; make @mv ref-manual/html ref-manual-html @mv ref-manual/latex/refman.pdf ref-manual.pdf ########## vref_manual.tex: vref_manual.dxx doc++ -t -o vref_manual.tex vref_manual.dxx mv vref_manual.tex vref_manual.tmp sed 's/HYPRE\\_Int\([^a-zA-Z_0-9]\)/int\1/g' vref_manual.tmp > vref_manual.tex vref_manual.dxx: ref_manual.dxx @ \ sed -e '/HYPRECopyright/r copyright.txt' -e 's/HYPRECopyright//g' -e 's/HYPREVersion/$(HYPRE_RELEASE_VERSION)/g' ref_manual.dxx > vref_manual.dxx ########## version.tex: @ \ echo "\def\HYPREVersion{$(HYPRE_RELEASE_VERSION)}" > version.tex; \ echo "\def\HYPREVersionDate{$(HYPRE_RELEASE_DATE)}" >> version.tex hypre-2.33.0/src/docs/README.md000066400000000000000000000067401477326011500157410ustar00rootroot00000000000000 # Writing hypre documentation The hypre documentation is written in reStructuredText and built through a combination of Sphinx, doxygen, and breathe. The User Manual source files are in the directory `usr-manual` with top-level file `index.rst`. The Reference Manual is in `ref-manual`, but the actual content is in the hypre header files. ## Installing the utilities needed to build the documentation Building the documentation requires a number of things to be installed. To help keep everything consistent and manageable, it is best to create a Python virtual environment (venv) that contains all of the python packages that are required. This venv can be turned on and off as needed. The following will install the venv in the directory `~/python-hypre`: mkdir ~/python-hypre cd ~/python-hypre python3 -m venv env This creates a subdirectory called `env` that will contain the venv packages. The following will install the various packages that are needed: cd ~/python-hypre source env/bin/activate pip install --upgrade pip pip install sphinx pip install breathe deactivate Unfortunately, Sphinx uses a lot of latex packages, so it may be necessary to install a pretty complete version of TexLive. This installation takes a while, but since we all use latex extensively, it's worth doing this for other reasons. First, download the following and untar it somewhere: http://mirror.ctan.org/systems/texlive/tlnet/install-tl-unx.tar.gz tar xzf install-tl-unx.tar.gz Now, `cd` into the untarred directory created above, type the following perl command, then use the sequence of menu commands to change the install directory to your home directory (here, it's set to `~/texlive/2019`) and install: perl install-tl D 1 ~/texlive/2019 R I Add `~/texlive/2019/bin/x86_64-linux` to your `PATH` and do `which pdflatex` to verify that you did it correctly. ## Building the documentation To build the documentation, first activate the virtual environment: source ~/python-hypre/env/bin/activate Now, just type `make` in the `src/docs` directory to build the documentation. When you are finished editing and building, turn off the virtual environment: deactivate To view the output, open a browser and navigate to the following links to see the user and reference manuals (adjust the path as needed): file:///home/falgout2/hypre/src/docs/usr-manual-html/index.html file:///home/falgout2/hypre/src/docs/ref-manual-html/index.html Alternatively, run a (local) webserver: python3 -m http.server --directory usr-manual-html and open http://localhost:8000 in a browser. ## Some useful links Sphinx: - http://www.sphinx-doc.org/en/stable/ - http://www.sphinx-doc.org/en/stable/examples.html - https://alabaster.readthedocs.io/en/latest/index.html reStructuredText: - https://docutils.sourceforge.io/rst.html Doxygen: - http://www.doxygen.nl/manual/index.html Breathe: - https://breathe.readthedocs.io/en/latest/index.html ## Some notes on customization After compilation, the CSS style files that control the HTML formatting will be in the folder `usr-manual-html/_static`. To override any of these settings, add the appropriate lines to the file `usr-manual/_static/custom.css`. Use the web to get information on CSS. hypre-2.33.0/src/docs/copyright.txt000066400000000000000000000002751477326011500172300ustar00rootroot00000000000000Copyright (c) 1998 Lawrence Livermore National Security, LLC and other HYPRE Project Developers. See the top-level COPYRIGHT file for details. SPDX-License-Identifier: (Apache-2.0 OR MIT) hypre-2.33.0/src/docs/hypre-wwords.png000066400000000000000000000711401477326011500176360ustar00rootroot00000000000000‰PNG  IHDR´â¼”°sBIT|dˆ pHYs``ÝÍ$tEXtSoftwarewww.inkscape.org›î< IDATxœìyœåùÀ¿ï$»,—‚ˆxpyD4Ìpx‚x âÑzÅ m½Pkµµö§Öª­Újmk­µZzÔVmëÙZ£ÖûªŠ÷‰F0^("  »IæýýñN–l6»™™Lvx¿ŸO>»3™yçÉ5ïó>§R¢ÑÔ›t"¹;p2°-0&•uVt³HF³Vïn4k.éDÒ¾ œŒòvÏÑ“¿F£Ñt?ZÐDN:‘À¡ÀE@²ìé?w½DF£)G+šHI'’ûã*<ýpm×J¤Ñh4šJh@ éDr?à`ÇN»4•u¾î"‘4FÓ ZЄÆ3õœŒ¯rø|຺ ¥Ñh4_h@˜t"Ž@Müå>þޏDÿi4MÏA+ߤÉFàhàgÀNý¸±.Bi4&ZÐT%H޾ 1ÄoSYge´Ri4¦´ ©H:‘쉚ø; ì«Æ'ÀM‘¥Ñh4šÈÐ €¦ éDr"jÒŸ ô‹`È_§²NKãh4&B´  Hü0#ö#àæÇÓh4MDh@C:‘Ü4E<ôÅ©¬“‹xLF£ÑD€ÑÝhz?$úÉÿ}àï©Ñh4šˆÐ€µË27¦Ml~;yWÈ‹SY'õ F£‰­¬…X–¹'p°)&]Œp#»Ä»À?#M£Ñh4‘£]k–ež<„§JàÞ†H¿ ¿JeB”j4&Z´°aYæHàw•ž[$`^4߆w€;"I£Ñh4uC+k}€XGO."Šk\”Ê:Ñ94FS´°aÛ‡N"ó#˜µ3Àݵ£Ñh4šz£€µÓPåyÛ±Ž¬9àÂTÖ‰<@£Ñh4Ñ£€µ ÛÎ,n)ßoÕfx øOM#h4¦ËÐ ÀÚÉ‹å;6ÐPÛ˜zõ¯Ñh4«ZX;iלgT¡¦¹ûÍTÖ¹¯–4FÓµh`í¤]Ùßñµ)Ör²F£Ñhº­¬lWº1Ü…Aáçÿ7RYçþš%Òh4M—¢€µ“‰¥zõ¯Ñh4kZX˰,³% @o cÂ+¯§²Î‘¦Ñh4š.E+kë7v(HÃuaíâh4¦;Ð ÀÚDZÅ€‰áWÿ¯¦²Î#‘H£Ñh4]ŽVÖ",Ë ì[ÜÞ¦ éÞýa"i4¦›Ð ÀÚÅÑxõ~ `R>ôìÿJ*ë<•PF£éz´°–`YfpFqÛ,HêÕ¿F£Ñ¬µh`íá;À°âÆ.áWÿ/§²ÎÑH¤Ñh4šnC+k–e àœâö–®dC½ú×h4šµ­¬$‹5¬þ_JeG"‘H£Ñh4ÝŠVÖZWÿÃ\¾íï…Q£Ñh4šîG+k8–eîìTÜ®aõÿb*ë<‰PF£év´°æÓºú,a+7´ðËhÄÑh4MO ÞÝhê‡e™°_q{—¼D„ê…TÖy<"±4šŠ¤É~À4T¦É«Ž+€!À`¤÷Ì>椲ΗQ]S£YÐ ÀšMëêÝÚšþèÕ¿¦n¤ÉþÀéÀÿƒ€ýkoà `{ÔÄßTå´B:‘|¸x8•u a¯¯Ñ¬.h` Ų̑ÀÅí ’X¸¡žOe'¢‘J£iK:‘LWCKv¿bœMPÙ.»½óÎ?ø4HžÊ:·•CSéD2l ,NeåÝ-ÏšŽVÖ\~‚÷ùö–°]øà¿º®þÓ‰ä0Ô*m;`S`”¹v X,öï &‡—wSY'|5ƒÚdŽ¡V¨;KSYçâîcuÆ›°¯RžþÏ1ú'GÛBXW;6nK'’Ûçhk@ô¤Iõ»É*×Ì”"÷Ž™¼ ÌöþÚÀ“©¬>IÓ!e·ÜC5uÄkú3è °{^²G8à¹TÖÙ5JÙÒ‰äPàP`/Ô¤?$äPïnNe‰×)éD²/jÂ9uÃ*b¦²ÎÌ®au'HÀßý+òn*댪2ÆpàÇÀI”´¶®O¥²Î7u¾Î‡±=pˆ÷H„ªø»¿A+fµ£-k&§áMþ À„ð¾ÿ £Æ›ô&ÍJmsàZà¢t"ùƒTÖùwcVÄ»y\ŠòQ—3 è‘ €'{`]TàÛº¨Ió+TðÛ¼TÖÉu‘,;K¸JÀøNëðsL'’;g¢È®ºwM~CI® H6¢¬LÛ¿\';ÏR¶ jÂ?˜¶nž°÷SӉ䩬óyc®µh À†e™ý€ &ÿýr¡>ãgSYg·°rÔiÒï \Ê:¿‰zàt"¹5pêFÖßê® ‰éDr$Ê’²-ªÚã@ÚNöýé<ÝWŸo¬G¶‡çæù=pd•C À©¬óQÙù?&¹nžÈ´Ø5•užf¸ŽI'’Pî»ë¡\Lëc *r%àïw¥‘N$¡:O×ñRÛ¦²Îâ:^cF[Ö<¾7ùÇ€Ãûþ/ z‚ç×=œ®™ôKÀ¯Ó‰äÒTÖ¹:ŠÓ‰dpp6*¡ÇN$-à|`O*[$‚ € }}Ó‰äëÀ©©¬8¯œt"Ùø©„s…g‘ªÂý¥“:‘ü ˜ÜÙIË|h>2àS!X&àk¡´‰&©4¡®dǼdp¸Ÿƒü-HŽIeæP#T!H®ƒ²2œRÜŠØ>Ïïƒr‰¤P±)¥÷ö–t"ùppO*ëÌ)9ODK“N$7B)/§}+#¡°B°h94/‚fº2¶žd`Ìßw¤”M[PŸšh À„×ò÷w:‘œ\láó”)©¬ód-×ôC:‘Üå;?‚ú*Wï£âV†9Ùs;ŽZõpêäTÖy&H®\ œ '¯¼ožÃ†ÿ·bë‚䜬šØû§²ÎƒáN­L:‘\Ïpžâ^ÆÉ©¬sc•1öGTú}¯ßž–Çg×âBK'’#P)Ç'P!ûb…@¾k1Û€¬!XYáãÀ “ó’m‚»,'D¡°®h ÀšÅÑx“¿ìZçÈÿt"9øÊWÙU«ýΈºSíÀJ¤ÉÁ¨££žúi˜ëÁ{¯ ö¿6G­ä¹T¼ ÉãPæß-^ó-`z:‘üðk”ù»pb‚gc‚y!꘾üÅÓâ2 øÏc?T‚šñÌä§£âu:2ñ/:LEôÜlW¡üëAã=>CC L:‘Üõû?š sÉ|Óã;&Dµ°} ,poƒ`¹|ï:†©£­¬1x-ÏnÝ.HÖ 7ÿÿ/•užéì€t"¹/jÅ:F ŽÎZ(ù¹p¹Ññ͸3>qŽo<ø7‘ÖB¥ÕhE<ÿP&hßç•ñð«&¦6€·b‚çâ‚E5ªš_¸½Áà”7h-ôýªÒ9éDrJ¹úЯÊá·u” ŸN$O.ó1Fg¼œÊ:ó‚œäYh.CUml÷~èYfÞ `™)åñ¸`˜ ›ú/[ÞYP©¦´°æp0°¨¥øn¯þ½ˆÞÃPÿ¸°ƒw£ƒœN$“n0)dcŒEõLûë–ÉóÖƒ_‰®ïÛ‘­v@:‘ÜeºŽ"*ZGOÌ2÷7(ß¾Ç\àYà#Tã¨Ì†MQßB%ÀtÈg¼L fnžN$G‡IùL'’;ßC¹Éü*r×W§Ê=u|PÊøðý nžt"y$*.cƒòç– xH­ø+ÚB€Xš ØÔ¶ŸÎžôRO‡¦²N]õÕ­¬9œWü'Yìôt*ë<[ºÃ›øG™ÕýúÄ»“þéDr“TÖéÔ,ïù/áQÛï .7Ë27><'ï#Ù¶ãû bðY:‘LEùø­z n¼¢&” ªbà¶ù ³ó,ËÜe8—N&‡'ÛdÐ(>S>Ó‰äúÀ±¨ÚÉ`—á¥TÖ™Q6ÞÆ+Oô–lp¬R ¨âF—9ɳò\G+ˆÞˆ  V¨¹ÿC࿨8ƒ9À'¶YdYæú¨Õúx`oTkEæSw+¦±z'§¯R= e­C+k–e~ •/ ÀnÕüO'’c›Pifò•€9†Z¡-G­– µë#¡¯„þ¶p%ëwMÌi§%DÓ‰än4`ÓBùO;c;Ë<úМ¼eLA†¬Þ\3¥²Î å;Ó‰ä!ÀÝt˜Ÿ ¸»Ñà ÁóÀï€m;ãëÛcÛ™ùÀÅ–e>ŒŠ›Ø°Òqͨ‰fd°ºr~V›SP«ýƒŸArCéÆU£’ß,øwoÞ Ô …FØÿà)«Þë9UÂ%¢Bdÿ2w7|d°ø3p·mgœJcÙvf!ð8ð¸e™—@ÕuhGS°ûÄ%ò6¢ÒE§¢búKQ± š2´°fp~ñŸQ®d£p…2ŸLeç 5}ë—””.%dc‚÷ ‰íß'+,a\A²s^Ö˦ýU*ë|Ué‰t"¹*È隷©`'Ó<ïÈœüõáÛ6×Jž Eo¼zwГÿK1Áã âáø­mg¦‡Ƕ3¯Y–9x“b>4#ƒ½×ÓÛ҉䶨 g*°Q@QËYÜ*¶'•“·Žs9¦–7þ+ÁòÅ‚]OŸí¼é÷œt"iàælWé'þ‘ÿj0>Z*ø=p‹mg|Wäô”¹ŸX–Y@ÕxhC@¥li:‘<eUØ•öJÚÉ©¬óa ×´°šcYæîÀNÅí|ÿBk Üõ¨Hð6,ÊoúF¬ÕÔ˜Bù¼k¦æ\Ö‰~ž›S¾Ã ò;QÂå"úÒ±‘(–eëK®?:çž´q÷V:ÿs*ë´[Á½gˆ [¸²®õ¾ðX\<ÿFLœbÛ™LcÚvfŽe™?G™¯ÛñIpM° H€ê_ÕýôÖTÖYqÈèÑëYàµÑ¹i-ƒ-̶>}¶³ÄÏñžÛï—~ë@á{9&V<Ú NËÁͶ©å{€Á”²vç—ð·TÖ¹3¨Pk ZXýi]ýoæJ†…û)>¼“N$oEù,Û0×€gâ‚Ù† ªùzŽÿl0øA‹uþ`»àµ<ü"Ö)O±fÀ²Ì^›¸¤È¹ûôÞàfམà=– X‰*š’G¹TúIÉp ÛæCç´WâMàç%r5¡êŽâÀTŽ09Ú¾˜kPx(nœñÐÌL$…œÊ¸å‡oçÊÊ«Í×ÈËã¿‹hï¥7LKŽž¸GA>1ÔíÜåPX0@2.•õ=ùÌÁ} °K¥ßKx2.žy..µíÌ¢Zdó°o(Q¬6r‰ÊU8 UcAÓZX±,s"°Gq{rˆ»™Ç.¼g¨¢i­¬P+2^µ›øW PÑ×_xÛë¡rÔ¡|®UçÛÏ x-¦±"äþÒ Ë2÷Ü7.~¼‰+yÏÌ7 QPY§aâþ©I°,sÀ®|úðœ×GªxŠGã'&è¨v«r¹੸àÄ—¬sQ…n¾öäºåŸí*Ð+Ý h@¥˜FɧË‹š™y;Ò=l;ãZ–yUbY|2»t㥘3¡ £LÏ|ö‘¸Ø{¼üã:5zÉ\XÚ»ù­—O"™Ì þ×$+—ï̓œçüù™—Õ"W)¶É[–ù%% @ÀÌŒŽhŽ,~Ÿ5•Ñ ÀêMkäÿð`y³å|¯ôN#7½¨ÞoÔ4>Õí àIÛÎtš7lYæÆ¨´ÄCQ½Ù;ä•x¤ @3ödh-êóH\PªÌ6TdÖøh®Z°,s¨UÏœ“Ãc(+Ë3qQ9¤¹Z€‡ã'¶Ô¤,GMþó<¹Î¦B:¨ôdŒRøB0g‰cï›9³bÜF„ü/¢qlË2 JîAƒØûK¾•“‘X² †î™—WF œ¶p@*ë¼ãçà?Œ}òp¸¶IV6ùç!¿LpÐųf>T»h«°,sh †uasW²yx+f9?-ϢдG+«)–eާ$%grxßV÷4 fb9p+pƒmg|Õ#/â)××Z–™þFAX …ê´QPÞ#4Ë.°ÌQeh+V“˜ƒñµ·GÉ£*©ƲLsbA>»oN\!àNIŠ–p§)G”Ý,Oêèà%úQ– ^Þ@²Û÷gͬK}ý2ÞB×µ±rœhç_Ðdœ*¸Õzê‹1A\ÂÞüI6ëìù¾dvï–§ôV²̆Csò¿c]¹wGmV°çñï¶Ï ƒ“cSÎÛWFÞlãþ¨z‚¬éh`õ¥uõ¿± ‰¢Æ?pW£1wà ௶©yUfÛ™´e™o¯S¡Œm5©„¬Z؆¯÷ÏÐyç>@e/4#Û.Ƨ©¬x½bYæä’ûwÏËþŸª*ÝRÁ¿GÝ@Û`†ÿ´®Lek+ì?µÐüAùC"0ÏJ¸³ŽIeðQ+±q€Ïÿ#Côïè¹ïa@& ‚eïi0X\²<ÿJÀWBðnëG‡7~Øìþh°d¾Ÿ”·ï&Gï·_AÞ»‘Û©A¡`À!a&¯Ïôƒö†Ãç¨ÒÆQ'®h`õäçxNí!Ru8«…Y†x÷? bòv&”9Û'7¢ª Ž,¢_4«€?~l0ù¼mgZ,Ë<øk¥rjLk¤X–yp9ÊDû§Å‚_Øvf©Ÿsm;ó¦e™Ç ²Zë¿+HBÖ ¸Uç¡Òµ¤e™§£üÜmrÚ‡ÕÞ=ôfß c9©xï n£ó”³Hy:.x:î+ófNö;é]g¾Ÿq§%GŸÿ­¼üUÿêa ?JeGýŒé•(žÄª [º¶|õk¨Én^sµG+«–enNIIË]óµ-Ü·•+~ÞY×Ê3ž ö Ê€^Dò%ü¸Ö¶3Ë€§ËžûÊòÐÎ͘£f À—à5j*V=›fׂۙ^̶3ó-Ë|¯„j_ ßçw~!Ýá$lÛ™Ë2_@r¶2¢¶iûvàĨúχ ÍO¥· d‚ž·W^žûl\¼O…ýdt«¸¿AeßøàKàÛ^õÃN±,ÓØÜ•7MÍËãûTÝ—§²N»×YÄóãgÕ„¿3]Û¬ €,mP­/Û¾zmF+«çâç$Á¬aõ¿nY_rBÞJ\C£©x÷§TÖYVé ÛÎ,³,óIT>{j žÿ€›QmrŸŽðJ¢†¥µóÙþyIïàoß³À>o–m*»õF…ÿ¾}ü¤»&Ë2€¥ûÆÍÜ™Ê:n n°Téö¥OFô=&<Ð ^~#&nF¥ÆYÞ#Iû"D_ûuTz·Ë2×ÝHrß¡9¹›Éÿ^J:‹I'’›±jÂ߃®iMÝŽ<ð!ÈÆxn¿œÜ³«âHÖD´°aYæ0ÔD¨ÕX›„7Ñ¥“?¨ÕJjð_YŠê‰ÞÏRAÈÕÑî·ÀÕ¨Îu×_aY¦‰—Ù,È0Êß‹À~º¶1ÿ›µÕN¸&•õg¢®Ihó96Ø'q{Éÿ/P¦,][‘fÈdˆ©·:3ï-βL j¡"臗Ùv¦j×FË2ëI>ªÅݼõ¯Ì»¨ø  Hî…šôkªHøÔP“þ|lòð°ÿ_œ™zò¯­¬^´¦ 06üjìÇwÃj¬MSHÖ¾rºÚG•³ŠÙ Ü9|Yl;ó:* ¢V®eù98¸éÿU`ߎúË—ã¹-ÚLr5ÔMX \öäˆØ¦t£¯×œÊ'³ËáÚ—‰Vßã•°$“Ι=³£F:.*þ#‹*;ì Ë2÷^Gò¯ãZÜuÖ­.b8:•u¾N'’#Pµ{T9'r$*#éý˜àC>2ey¢¡,i¾âg4£€ÕË2‡ :Œ°K¾ƒŠÕY†Šìõ5DL›妮ć9²3–ãMŠU¨X ¬ ]5cYæ4`J/à¨7h·´·€}RY'È skJú&¬'kòÿ_žÊ:í¬?]L›4JË d=»½l{déÆV…Ú¾ÇÍðQì\­…uP,Ë<¨äßǵ¸qŸi¶¦²Î«éDr?àïtRG#jŠU+üÖdåPÖ¾ŸF©´¶¢€Õ‡ŸàÅõ—5Õd?>•ufE&U0¶(݈ÀüÏ”ŸŠÊN.€¥uŒË27@52â°Éà`}Ø+•u¼ìA¥Â¹Yˆ?%­ÞìTº1Îÿïg9íÓW'”nÔRPj%¼Ý¤òì#ý.Y–¹O“äîi97¾¿—ú*ŽæÛÎDª$­íh`5À²Ìõ(ÉÉžTa?¸{ü©–enìXÜŽÀü¿•R燊€s”ºlõü Xoϼd«`ïÙ,`J*ë„ :<¾øOo Û†W8×Q€fWaYæV”On(aÿÖŒ?¥²Î‚’±†Àªj}ýeø"\95ùïÐ2SË2'7½ÇåÜFŸ­Á—gçàÙ†’ßh”|-ÔÊþ¯…ø—Oø+QqO¡Ê¿âµÖDŒVVNÇËýî#aûp«±¯©Ðç½ 9„’97óÿ_ü69¡ €ÑÅE€Â`Yæw#GdÐVÏï{xJ¯¹3(nO(Ȱ¥Zçwj¤]º löTúf)m²X&Ââ Ó“ë0ùOŒÃÇ´¸½‡úTrZ`–+xª©æÂ˜«hFMøðALð¹è4á6Êã5é¿`ÛÒ×h ‡cYæ:ÀiÅíÂߌÊ:~£ÖëÁa¥5šÿ›QUñüRÑ2†¢HÝË2·nÚPÂ!¹@“ÿGÀÅæ>!h]ý7;†_ý_œÊ:+ªV?¼`Æ£ŠÛC¤Ê ðÉåL[³pz;„PÆ%ÌÁî!Ü2â}_Þ''ûÉJh„íkíóCEçMúó ½ßÕ¸8á?ãÕðÐt1ZèùœŠW¿¼I†öÅfQñºχ½kq»IÖÜRöo¦*[j‘ Î €e™é>’ÞGµ¸A”¾OP“K(eϲÌÀÔâöø‚¤o¸êC:¨ÀØÅL¢$ho²ÿÂY +Kwx®„Vùvy¦øp\H·L‡x)¢nåÊu'DÜ®¹Ú¦æ}¢Ró:ã=VMøOÛvfAç‡kº­ô`,ËìC‰Ù~B!´î©¬AÐ{hÚ˜ÿw ÿ:@­þ𜊋‘žªX–Ù øCÌI¨V‡ZùTÃåOÁs7ÀÎáƒÿ.ì!ZŽ-þ³„Ñþ'ÇßUÈ”i]ýÇPÖ¸ü)•už sbGX–9 xbÉ €–"ßH`¾ç¿/¦æU¹¡|ŠšìŸBµïN룦´г9 ªŽíÄp7¸+B™ÂÐjþo ô³Èõ!ê}W¬_Óƒ]×ÈI6õ`¶åó/ìE=Å£µ àè‚ Û­ÍþVލðO)nïîõß.vÁ{oZ]#c ’u‚¿7Ÿ? |V'X–¹)ð¤CϹa*CvÈ/pï}/5oEçoÞ"T®'§l;3;:I4õB+=ï†sVq{‡|è ¹ º±ö:–e®L.noþu€òå_⼊ßóžhðšð¿{^²Eijå_kzçÑ”kÚ9¼¢ö‹Òìç¼ÔÙ€«ÿßTˆ]8¯…­&…³Œ\e½zË2û›LÎËš«.)KÍ[Öù„¿xŽUfý·t¤þê‡Vz.'ƒú&…»¿šÊ:÷E)TŽÀ[lÇý:Š\&ª,5(”‰3R,ËÜ øÃvÉÁ"Õ§¤²N¦Æk JÎÍ]ÉÆá&”× P©®^x«ÿ“‹ÛVÿs€›ÊÆ2(yo®dHð¯ñ»À-Ïêœk€Q#]‚fˆ°¼,5oqçoP3ð«&üWl;Ó\<šÐ @IJÌ8jõ¨ì-s/ˆJ¦0x¯£µåìøpfÓ"KËBž[Ù^–yQ÷²·,s à®­];À¿w°w*ë¼[7v ÿêÎïN‹S ­«ÿÍÜ@}N«/“¢$-r—p«ÿ_¤²NdÕë,Ë< ˜ÖGÂá972ûž!x¤A¥æuBxƒUþtÛÎtkFA¸ IDAT‡&z´Ð39¯sYŒÐ7œé~{yבïà51ý:ŠÔRN6ê€HÍÿ–e® Ü?Üeàá-¾óÊ¿FÕö5"1ZûÜs• ÓSY瑈ä Méê¿HùW¨nJe*ìoíŒ7Ô Õøç-àîÀgu€§,^pp.˜R-G;žü3xA{¨Ô¼.©tÙ•ˆ[æ¨ÛQg˜cºë¸(ÇzLHéÿÛ#n™#PJCC•‡ŸcücUYÊZfZW%]s¾”b½žhäšìòélŽù\à‹]½ÿ™w<5v¯bäm׿v)Å ·þû=#·rR²ãü÷91ól¨‹77ôZqÊ©7_»¤ïÀ0™ ²iÁ‡ÃúðʱåOœþæc$O•w“­fž3íŠvÛ*]»Ú¢‹ ´=jØ¢¹#Î~íaú䫿ļÏÝø­So|ܾsj½>@Ó‚†®óÞ '·4ã)¬EÁ=Wð“Ûž3e.«~¯¢ì¿ûj:§ßÇoMhXúÅhLù,û¾÷ZUÙ—ô°ü´“o|hyïþÅUºhX¶`ƒ>óf©†8BðãþÍ6Ÿ‹o»êÀŸ¼ü´5eA×Ðá>)c½?Ïncäšûï3k:Ǽr YÞ>š?L9 „@ÆâÍnCï¥n¯>Ë }—ËX<Pž0ŸSTã”þdbÔÀÛÀYrÚˆÇYä´Uó¡Ë|?žÒ¥ÂÑ8Õjl Á—ãöÀ.{¿ú½N¯ÄŒM·á©±{}'ð‰Q"‹Æ þE²÷ §„ê®]Žê½¤ïÀ³ªY™•ƒ7eåàöL Ù7!„nF‡•§k@l6=w¦¯É?oä7S/l˜±éøãªì“•ƒG²rðH6›ÿÖSÿ<Æ››mËÓc¦UýÈú³|ø8@½–½ß¿²ÊÑ …àÒÃ.è·¼wÿ©åÏåúæ«QƒùùŒÿôÝ@²8ÃLž¶¦DW^WVl¸%ƒ–.äÈ7‚[îÚã$Vl4ª¸Ù •e482ù4=™y(·ð-ršjíÕã]žÒÑB$ÍÛºqËœJÊJh…|ãfwüä!Ý„4âŒÿf9.þ,ð5ž3å&à‹ ×‰úáK£žøÎt†- g5_Òo mw`¨s«wÃ9º®»Ad2ô]ù5¿¸ó|Ö_Z½.J>çw‡]ÀŒMÇW=6,‡O¿#Ôy·MŽL‰„˜[àÔ¯ÄÕíõÿ™8•YC“U›:ýD@cØ?ö8¾úA!8ò¹ÒàCa,Åfòî&£ª¨YÓø?õ9mD›ª¨q/ÂÕ諸’°æ›å#<×ìüüÉxÁFØ«9¸³ñÁ3_>ú‡kÍGËK˜·£æ×î64ù¾â…^ýb…¦þñB¯¾q·±O¼ñ«Ï&6,[t±4b‹sôü iû«xa³mŸ“_/z§Qq)DaÄ)þXõ¿ j[”<§þùæuc+–n,cq¤Cq¤'ðZdÁ:Ñ,˜ò-üüî ¾ š% FœË976ß.’kWbø‚Øqö‹Ï{i«I¼¿Q¢ú]È/ÿ‡Íæ¿_õ¸‡lÆ»]õ¸_|Ä„YÏ’áÕÄŽ¾‹ l²èö˜ñxàóž¿oä²hz4.ª‹ârÚˆŠ+ɸmg\TŠGsµÑ¼T¡0fïî6½‡3Çw#É‚ÄgÏV$ps£±ðf=d*ÇÈ­¤qÉüNI$…¬Nö•€Wß}j—-ß}j—PTaÝ @Óô[Ùìõ·Q&d,F‰‚+>+{^íÈqÊŒ'I~þaÕë¹ÂàšÉGc¯»>M >¤\‘!CŠXÉ5ã ‚µŸ~gஂÛwk^Ñ­l´xG>[½Q.ÖÀ•MÁ¨n:ýö@ï‚î>Í÷ñA8ê÷eÙ(eEco^ØjçºÈ£é‘<†òóÛÈàzXcÌñ^šZOQ`6¦¤Ïøn!òågÆó{J#€É5äý?¯Z_¼&BÔq`å¢9ô©ñ}>0'ÙÆÇ{#{â’…/üÍ_ø»ÿ ÑF9iUFbqd¬A=Œ82®þ.˜ôA§÷ŠŠ¼8,ÉW_~Lÿ¯>óÆ-¿õÿ8n¬i4 ãñÖk׃†BŽŸÜû;}Xwþ¹û4><¢êqÃÌaâ;ÓÉñŒ¹{qQ’˜7›‰³‚É0=¹Í ‘5ûÓô\2¨‰ßWX¨'¶É£ZQv{~«e™­¡þ£\‰Ï>Þ¥6qå6 > {-0Sð‚Š¶ ÷:øRÀ›±új3½Bè&9`ebíž—lïsò¿·Aðv˜÷AJD!‡(ä|…ì~+ç»PN+à¥Ïßaøï—á)eJB›‡zÎ-U&Z•¥L¬R,ÔsÇ:ϳùgÙªW·‡nÍc[î@ÃÒ/Ú+-eÊÉá}ÿùXœ;v;¦ú!8æé›C÷丽#–DÓØ ð»YNá»ÞÄZ­ô,ËÜ hµÏ…©êÜvü»ÎÛõ 9ò‡×G¾5û @ßõv¬#™æÂ¿ˆF‰Ù8±t|¡Ú*¯¬Dåuq5µKú­ò'ûDÝ• €RնʱªÕã:¡DA‰HÿÞ¶ ÙŇ»és÷/œÍ;¹ƒ#D«R0Á¤¥Á:ÕN<ŒØ›÷3¤bQ¢¼xÿ»žÒ"+(>nkÊØ3XÍ$ ÀÜõ‡1{“­Ÿ§Y-øøðûò??h gp^ñŸÍ\É°à«æpQ”…ä—ÅF…/% àÄá^|JÍX–Ù›2 ‘p ý%oÛvfbÀëž7 r¸ß*âš×bâAü)Þ£—÷hìàoñÿ~À<Åd×¼ïâC­äÿÅ{Ž¿icö÷ñÞ.ð÷FƒÎ ò¯RNöhi^Z<‡A¯Wì ‚¾×îçðFCC¾¼Š‚ÑÁsm”–Üx\Y\b«¬.«,'5¶×ÒÁnΗÓFÏeöÐ @7cYæÀ^ÅíÉáœÞ7§²ÎQÉË2wB™ÿÚVÿDßLfÝòaÌÿ_9Ø«ò÷Ð(W?,ç{¢=ëÌÙ3/?3„p>eú=0`]©J4e‰àÎ¥‚è\Ñðû\ãÛén½%|'çV½™­ô&ÿ¥>gôõ%Xß›çクë ™…ð õœ/?bÀâ"•§"B”¸l*¹m<«‡÷¼ï…lè…oÂmè…Œ7âÆ{á6ô*y®—÷\Éþ²c¤Xëêû<òó7•¡€îçüâ?Ã]‚´-Ò \©DáøEñŸ„+~ú~ƒè›É¬S¾#l ¯£ã}›»Ò:²Eú-=|^*ë\R6?2 ~PÜÞ%ï[®R–­/9Ͷ3 #Í7–e6ëÏ Øòðœd@•Ÿ„Ü31qÅç‚éXÑ€*ÃåŠ 2—#”5°gH…z™€/ºÊP#%"ßB,dzmèËñ JB£÷Ó*E"ÞØF©¨¨dTT8ÔXõ \ ÀLà§rÚˆ‡£°Û_ÑÚŒe™cQMX€Ð¾ÿëSY'|¢}X–¹#°Oq{÷ÚVÿõh_Ü対Æm#\v;ªEúý¡ý*•u~Z2œrÐ_*¿y®Len™ül;“³,ój`Ë)yI¢ºÒ,sÝ;3ïêì Ë2¯À›ü…ˆ‹è#9³®% ȱxÕ&Ç$ƒB~_?4De.ò²Z Ü<±æ<4vB±Å éY.Z•„ÆÞšúQèÕB¯¾êÿâ¶÷×mêK¡Wß ÊÄç¨Ö_ƒøùA+ÝK«ïc¶ ¾úÿ¸$R‰ÂѺúß<\ C‘SYç¡H$jK{ |$¿€k7q9ô˜—Ç_šÊ:¿¬~Xx,Ëü¨¸=©à[1)åK n ?X–y&pø¤¼dWÊæY©¬SmòBIûàÝ‚ÇE| üÙ¶35§I[–¹ð»âvH% €1yâ/fÍü»WÃ¥4V¤n›Þ@Ÿ’¿¥ÒçzNðH„[@´|ƒÑòMÍc¹ ½)4õmUZl´`‰¹×s_o2Z ¿ÍQÖÝ?—Êi#–×|Ñ h ›°,s+àÐâv˜¼àêTÖù<2¡Bàݬ¾]Ü®qõ^õCBÑNhª£À²ÌË6”œr\ÎÅgæõ•©¬snh‰üsÞ{ÑWÂá>«ß§²N·u‰³,sWàÒí ’}ýÉe*ëüÑÇq?EMN¬'alðßã…©¬Sµ˜šO.Á›$דÊ5XOBk —bÁ·`i ãåv¦$t´íw_q»Ç¹¹4,[¸øMß¹™«çÞqEë÷GÜ2§Ð[N±¤žrh ûøÞt [¿á,~µP!h]ýoæJF„¿Y=•Ê:OG"Q{ÚÅÔP¥S…˲Ì_®/9kZ‹Koéu©¬sFxqüaYf?àôâöNé×2QÊ|àêè¤ †×æ÷®1?Ð_6ÅÍ@ÕXJË2Sbõïª4u*ËJ‚iÇÕ°ú>IeOk*bl;³•û¶½·/¼œZ•‹þÀÀ’Ç oâåP-eÛ™EåOÊi#|Uç­­t–en |·¸4ØÈãŠT֩먖eާ$†¡ÆÕÿùÕ M—X,Ë6G™óË›‡Ü œcÛ™ê«êŒVº‡sñÞûõ¤Jñ È—(ßPwÓºúéªGHLeà]hüS! 4Ë2°Žä²ã[\Öñ÷qþø~ÛaYfJV 2ÌëŸÜTþñ*oÝÜ•;Om©º:—À©¬ó'Ÿc¯O‰bõÿr*뤃ҡ,;­Ýž†»J!©Ðùá]A:‘Üõ;¸-êÉ¿žØv&‡ºø ^¥$Œmgž«rJ—¡€.ƲÌM€iÅí7PÚòÒè¤ Ž—ÁpPq»†Õ¿D•°¬'Q)hýnYæqý$×ßâú½aßq­ƒÎø>°¨×=1ܪò¢TÖé® ×oæÊï|·J6…„¼€cRYçÎcÿϤ; Üê?ÊØ6]•B, Êé‘ @:‘Œ£â}ÎGU”¾¾{%ª/^ºì3Þ£G¡€®ç§x)9ë† 6úœnôÖp^ ÒpWùÿCòŸTÖ©w÷Âöu‰ûeùJŲÌÃ{Kþ:­Åëûó^àèMÆâùAZÜž—a^ûl"òqŲÌË·)È“Ìu^¯ Í1Ø?•už0ö J²"v ^áÑTÖù_°S:”¥0µtßY³P±lw’N$·D­úwðvÝ”Ê: ºQ¤µ­t!–en€Z¡n8—t—¶ˆe™&pHqÛOmûp)q#Ô/â¸]¼[H @“Ÿe™û÷‚ێ˹±!þÞ‚ÿGt±¹óDT§IQÁ!øeW),¥Œ±Ì ÷ÊË3«¥úå`YLNe7^¢µ&º_ÝK¨@Þ¨Øå7ÔvÃÚíCýj!"Ò‰¤X §÷‚ß/ÛÈR¢œjº­t-gâ}ùû¿áÌ¥g˜ËZWÿÃ\•û’ÛSYljLªÊ´3ÿCèB@­ €e™{6¿Žmq6ñw£~ 8,•u|ôæ‹/XéœâööyIŸà¯;Ü¡X¾ØÑ4Ï9"/9ºÊo¤>o„I©¬ó~ñ-ˈJ‹B)ãwGl¹jÓ>p7’¶Ík¢vÒ‰äÄføk”v$jŽLeºä·kü¡€.»áü°¸²˯#Ì5…e™Ià°âv 5ÿóÀ…ˆTŠ @S¸B@_X–9)÷Õ"›|æh? ¤ºá³;ꇾs¸Õÿ×]¨XÊ>£Í³ŽÉ»¿«VNz¹`z?É!!MÈgà¹†Ö ®Œç‰0kŲÌõ(©¥0<¼R]ÊQ –t"9TÂeŽ,³¸å€ï„°Øh"¦ÇJXù1*§”>R­Æòð·¨… Áùxß›MÂU/,rkÐU[HÚùÿ¿‘úå|aYæ¶1xèÈÙ×gÜÃtà€TÖ‰¦ç­O,ËŒQ ¶]AÒ/Ük¶Ò‰d—Ý'ŽN޾þ;9÷²Î&ÿÈyý®³K˜Éß«ˆøãâö®ùÀÊøM©¬ó^ÐëvÂ.”¹©j¨¦YÊ^À]—’N${§É_HÈ 8²ìéàðTÖ‰ºß‡&ÚÐX–Ùø¿âöN¦0÷E]i>®„e™£€#ŠÛ5Dþçz×¼/ÒÎ`@¨Ép¡=<'×åoòøv*ëÔ·Hye¾‹gŽ¡šþ„¤j%ùn4bUæâ­Fðü¡¹ug9þŸ VÌ5Ä>ÏšYK*Õÿá}/BôCøøU ׮Ĥòk¥ü ÜÅ`~H'’G—Ã+|ŽÍÀ¡©¬ó`WÉ£émè~ˆàÓD¨",³€Û"–) ­«ÿ]ð9 VâŸ]ؾ¸Ð_†ûâ¿Çœ“ƒªù¥=fßJe./»êåÍ·–U_a-E¾_ýðܸerêHWÎ3;™ü]क़øäžcD-“¿×ž¹µ"â.ÁWÿW¥²NÔÑõ;•ïè]é¨pœßV€t"¹W:‘œÜçv*c°¯žü{ÚPg¼(ôÖ",ò2L+Ún‰Â.ŲÌðâv ¾ÿ]·ú‡ @ØÉp‡‚ìï3Õo°w*ëDZ,‡£@):!»L–rz:‘¼=jŸm:‘\ÿÁß6«ªIVb±€‡ãâ±wbâ Ûά¬ñ²?FUm£Ÿ„탭þ£V·‘á¥ÿmW¾¿†J•ålŽjrtmd#z¤ɾ¨Ú§Ñ6À¯ Íðz/åëqi‰k;Z¨?­EX U„eð¯ˆe Ãyx­R7”°UøÕÿ©¬Ó•%07(ß±nHóªÏÉÿ `¯TÖé–",^×·ÖÕÿØ‚d@í“I øK:‘Ü1ŠÆt"¹p|.ê#+i‚ʳ{3&rÿ‹‹>›ÉÜTëu=W\kß…]‚â^šÊ:Q7gÙ–²¬Ô‘÷î½:HöMeHz‡¤ÉÍPõN ƒ Û"_ n^OòýÕ©ÒßÚ„Vêˆe™”ä¹î. ë‚®ŽÂ.DzÌÍ£ŠÛ»‡ë]PäñÒt"iû¥²N¤+«†–ïX·~ïæ2”Ù¿;k|XÙê¿È6À‹éDòûaÓßÒ‰ähTÙÝc¾¥Ý½<o|jp¨mg> s½ œ†çŠë<wpUDr”2¶|G„«ÿ"¸4H&€sSY§]ó?¤É)( Ê~Tñ¢­ù‰!~üÓÙ3¯ s-M× €ú2 ØÔ=)øêÿ•TÖy b™Âðs¼ïÊp K™N$7DEï ¼HĦÕÚ)Ój§8¨¤6µ–U6 ’AÑN&Û¯¦É+Qn©ªÁéD²Õ0êGÀäjÇ¿ožˆ‹Â\ƒ Kl;‰ëËë†ØêŠ›¼â¯ê”É1°|G¡íº ߎM'’ÿEUv|¸³òÎéDrª3á^Þcc?™/h±cb¿kß™é»*£¦{Ð @°,3NIÖ¶áÒ°êÙ!Ï^çÂÖå“k[ý\ä=@YyÿKý&¨¤D¿Â* òšëÕÎØ–e~µRGéê¿”ª~þ©éDr*رøX $€­P1[›áã>ó‰Ç" eÛ™W#–ûGÀ €¾RYãEun¬Êw¬¾„±ú¡UÅóÀM'’ Qmžç‹P ÉFÞc0û¹gbâã—bbâgfzdM[´P?¾ l ¡Ó°žMeÇ«Vw~†÷=,Ág|5¾n®Leº¦—QÑùõäTÖ¹7êACкúO$Ô×qÔŒó¡™/àÉÁ,CÜœnÛ™HÓ&-Ëì‹RZµúèc¿¬Ü‡N$7Ie(ÚíVô¡/ªŸPŠŠ‘ÙSË@_ x-&îü_\|×¶3Ýê²ÔøG+uÀKÃj­>® Ãø{Âê8% w­qõ/á‹f¸¡IMü_Ö,`¼Œ A€‘^æÜTÖ©×êÐ7–eN&·w ¡¨ý«A°¥ªAU  °c‚Œ!øLy’_~nÛ™zYP~¬jR ‘†û@:‘„Ê„9¥YÈÖΰH†…«VÙ¥ä€ãâë×cbê3™ÌCÝ-&Z¨‡¢ÌŸ¨‰3 ¦²NOèý3¼ e%Œ 914Cöù¸øôÙ¸˜X€»l;S÷ÉßccÊL˜a‹uÀåu ^ J«Â8Ê•l°’Ü{†àí˜àí¼ì“—ùM]#  ¸#–ÈĶ!˜·*|ìmà|ÛÎÔ-ÎŲÌ>ÀYÅí«€[Ò‰ä{¨à·bè@TùìûR-¨_@ddb‚'ãâ•…‚ƒm[›üWG´PZÓ°Ì‚d½‘ÿ‘JË2‡¢Ò|åÂRÞ3€àÕ¸à™˜È¯\\dÛ™¨ "iº­Dˆˆµcq;@ VøA*ë̯‡\!8Ï7ÙDç)Só¼Wþc/aû àÏÀu¶ù¢î’vNÔ€À©¬Ó•“X5ZWÿ#]põ?3&V|.¢,=¬šôÿÜkÛ™…_Ë2›(Yýï ÷Á¼§â¢×Œ˜XßUÁƒõôÈwX4j¾PÖ™d7)+¼¼¤”úG€3l;3«[„ÑÔ­DKk Ö–®dã*7ã/+JŽ:¸µÆ´,s Êo ¨¾äåAS.0+&x%¦ ·xd€+P«¼®î{ßQzØ'•u¾ªAžH±,s<*0 Õ1?PÊAŒAå…ï‹êþ†nŸôË8 •ËNÕKpKà]Cð\\0Çh-xó&ðGà•:ÊùªÓâ–•žüwƒàX)M{`_,ðBLðj\Тd;Ó¶3º‰ÏˆV"²Ì) ÄêÌ÷¿X(³«G¾egîë ùð# q£X4'|f@Ö¼,Só¾Eù÷{BÍ‚r¢²|†jîóy­EL«Â9Ì…Í‚÷g¸ùÔÙŽ}*ØÀm^Äüv¨ê•UxôB­}TáïÜž æ5Ø9§¸½}^Ò·ƒ·ÆEùÚŸ‹ >­»@¹®ž©·¬¶‘–e^‰²šµ#ü£Ñàø7plGP ˜¼¥¬y_WÙv¦[Ûkê‡V¢£Õ÷¿©+^áǺDÀ³qÁ1±¸ ´ê5ù{ÀK÷½¼o– (©Éºøp¥mgœ.2QZ‚jcÚUí‹}aY¦ \ÜùߌºÁ·bÛ™oP1«;'à•àŽQ¹wx#&˜W‹”úÙv&ê@¿jÜ üX¯Ò“-À­ å%£ 5Wâló Á;1øÀHõ3ÿ*=³»]xš:£€°,s[”ù€I%ë ‰úa½W?4þœjÛ™žâï/å$¼‚)E$Êbáñ9ª­èõ¶YÐ¥’IJ̰aùþ€e€Wû§²ÎÛ‰%çáù¦7v•Ë) ×§²Î'‘KÕÍx%¸[}ÿ›»²Ígþ¥ªXÇë«‚U?®þÒ]m¶ùƲÌëQ=7*²RÀ] ‚õâ‚IyÉøà½ õ{žgÀ,C0+&˜¿ê·ÝŒJm½Ì¶3ï‡Z³¢€h8¯tc)™c5kÁÂU7š3m;óïîÐ'Çv°ð'àöä߯ÆFÐ6:†JiôI8<•užV¬Ú±,sK`jq{r𠱯K¢”©q0²¸“Ê\• ^‹Á‡j• ð:ðàß=Äuq1*€xÏÎúRÀ ‚§â‚¤«jŒ ”0PJJUë ,ê±T–yÛ_ õú—µ5!,®G¹<>«ÓkÓôP„Œ¾.úZ…gŠ}›’Ha¥E<¿~‹Z5÷ØÉÓ+›»œU…^V R·n°íÌKÝ&XH,Ëœ€ê2¨Ïä°œô[ÍPÇõ„”ÌJX–y+ž²6D©ÍnP³ð%©¬Óájsu\o•º IDATÅ+Á=¯ g‘²ßã“Àïl;Óã:Õy.¸G€]ÂŽG)>X€jo|Né[{Ñ€Úù9eiBÞÍf1p*ˆ&Òæ&õÀ¶3-–eþè ¼¼jÛ™z´?í*6)Ýø¶ÿÉàÌ<ùo†j4„êÎøê{¹&ÒZ‚»©ûþ\jۙ׺\*Ÿx®€ýPJÀNaƨ2ù»(¥øT1¦oÂ\C³æ €°,s JL±×³íLIóƒmgþÔÝ2DHkàä¼d‚ÿÉÿ’TÖ¹²>"E¹ÔÖñ©¬Ó•嘻’3˶—·—Ûv¦Þ]'#Á¶3˼ÒΣ2¶¯qȯQ•8ïìé±;š®E+µqʵ¼eZü+êGÖ…Y»š °}A²§ÿù;(‹çèIX–9 Õ‰Õq!Г•›Ðxæóâdùp#p‡mg–wŸTáðî÷÷X–¹;p0Õܪ³V-À|`*nç~à©.®¾¨YÐ @m<€*2ݶ3-Ý-ŒFaYæ`¿ÑÉ9ß“ÿtàøTß¿çàõgX/\wÆKRYgµ›ýà™Ï÷–Úvæ­î–'*¼ÉOX–Ù F j²/>uAs%̈́ԬQx `ÛÔ•;ÛR½‡G˜˜Ê:‹ê)[-X–¹ʽÔÊI¶ ¦Ì6ïaeŒ5M7QgT¦ûñrÀïÞØeç£üOþ‹€ýzòäïqÞä¿®$L“˜‹õä¯ÑhJÑ €fÀ²LÜ4H²ÿ±9×oÛ×f •Ê:6dé X–9˜’þ »ïÿ!*>E£ÑhZÑ €fMá²þ’ãŽkq;¬û^†Dùü§×W¬H8¯IO Û_ý_”Ê:ºž»F£iƒÔ¬öX–yN“ä'ǵ¸ ô?7þ"•uX‘àug<µ¸½sÁ·k£È»À?k•c÷Ýw/Z´à)Eë¢AñüÛo¿mW:^!LÓ±,³/ª;¤ß̆"užl¿š_ºtÅ{¦iî!„ØdÄm¶m¿ÐÐÐpëÊÒÆW³fΜ9À4Í …G! øgÆŒš¦y$%­›…ïõïßÿI!VY?Ô~®ÇâcÆŒ>HJvB,jnÎÝ4{öì…I?f̘‰®ëîXÜ6 ¹Â¶¿$“Éíc11IJ¹‘apÿŒ3Ÿ+?wìØÑ»H)ÆJ)FJ){s¥÷_«÷š¶&­Ÿ¼mÏüó˜1cÖ—²0EJ¹£”böÌ™3¯—Rº¦i'?¤m·ÊeRr}&cÿ³dÜá†ÁRŠ‘à>BÎxûmç¡Uòí[(N*•ÙuÝ Ø#„Ø Ü½ÀÈ …›Ç™3uêÔØ;ïÌü¡”¢ôÚÿijjúª¹¹ypwã)僙L¦%‘H¬Ó«W¯ÉÀn†ÁBÄ®™1cF›Þ&Éd2‹Å¾ îP s¥”e2™W‹ÇŒ¿õÈ\.–*=/—Ëý³wïÞ½òùü.†ÁŽRŠO¥”W•[x¼sw¶BB|&¥xѶíÇË?/€qã¶Þ²PˆïrSƒ€ùRŠ—3™Ì#•Ž_›Ñ €fµÂë¿ðÈÎy¹ÎÎþWÄ8&•u>¬Ÿd‘ó`}Pöá½ Š<‘Ê:2H¬TÖ9+è ¦iî,ÄªÉ @yg¿~}_’«bä¾Àv¦i&…àïB”tÇ20fŒyœ"×-œ7nÜÖ; û'm'Ã#—/_z"0¸dß )Åù|î=ƒ¤„ÆÆ†Í6`[Y…0ÍÑ‚­‹û¤7™æè€cU4ërê¨Q£†• ˲Žù3Þy!Ô5AþÆ4ÍS2™ÌMêÜŒ[5>w™¦™wÝÂ5êu „Ó4盦ù¾ÜRAÔþÀcÇ&M)ßÁ~RSï±(ÊŽe™Øvæ@€B¡p’\Q2ÎÒ†^r]¹Y±bOÓ4ôÆ?”Žß‡£¶Ùf›ÁÞñǺ®ñ?S ÃS‹ÇkZЬxõýåÊMS¹@Mpþü¢NbÕ‹ïC@þß)øê`8°/* o>¸Óã˜1c,àÛe»Pb®/áEÓ4‡—ßè¥ä÷–eM([¥–²CÛMñ‡O>ùäp!YvÜ0hï‘R¾Øñ+0ʤd|…_Ëf³Í³f9 ÁJö,%g—¿**H»UØ·²©©é]!d»˜ !¸UùƒX,6dÙd,¯úÿöÎX"yzž·åv€3>Œcp–eÖ °J<¼ÈØã?/ב0ÀÁc·ms<3_u5õž¿2}²\•ž&âK¡~Ñ/ÏårH)§kòV€ƒwJ!È{ëÖ­» `}•œ&’Ÿð/M¾&ϯÖÓ4G3«žfü–Hž¬ëa®iš Ìê Y>kРA7©+U"ü5‘HàXM~CiËC…§·¶¶®(§HoØvfœm·Ý°¾"þ³mg.d†~Úb±ã8Kô¾x]yÊÇiu,»¿Âdež¯¯ˆz  ÏáM>[ÁD|'ÜâÁ/c±>H®})‘Hôg.Û¢yÂÿ\zT1ÍBô0‹; Ø&úm:íü’k‚ÚÌx¡§§GA %Âïl;ófÖcCZ:;;ÃtØ @ÈNM)¿ÿÇG» ·åœ Ïø¯Ø^}ÛNœ U…wôï?ä æ˜ÅmWŒYܶͫž‘#GðéAÿÌOP³Ÿ¦þD>Ÿ_Ð÷U1]‹ÅN$ÂÁ¡Â8+›Í¾oU€oìß¿ÿçXA!‘'¥X`E›1uKóåžuçj@ì­©æóùâ…@3f¼”Je^Z½zõÌØ7 _`¦Bf€i¾mg.‘’úkí»€˜4|øð}|[í#Mð¿ÕRŒDÜkFŽÙ_Û;î0Ms €á±”’Ïr]á@óÐaJ6›5¡NV Bã€èZ@9iÁs]·“ÙóBÆc<³¼T‹•†–ÏgøHMÿv!p>€¾ñûDâ;Bˆ^M"ÙœËõþ~,„ϺB¡0Ų¬O3ãUŸ¦÷íÛ÷\MƒaD§˜¦9 íïw#D!œ„ì´”òû÷gœðݼÜÖ}ðéc·ÍÛ.ÛNø“MF«ÉeÔn£ý_E@Æ óÇ,n;ñ¿©qP(—B].>¦Ç@ètݹBàOP½No×ÔÄg D!,²ÓbY椾ŒK—°í¦¿³¸íj˜=´žàEÔï sg= hYæÙ¦Þ7ï%9‰º­|ï,€¹Â+Zçõ¶íüÇ©r ùeúl–Òy¶mÿÑ4ͧˆðÕ’”/†ñU)Ýå>¶I›p5¿,%=l[JnÌçómñxl)Ô•êDfÌ!R÷y‰Ä¨¼ºzõª7áÅ5”®ÜdÛ¶rL0ˆe%hl@ôªm;‡'“‰o0ÓÌ`— ÃáºÆo|³ú¨l‚™aÑeŸxߌmg,˪?Ž™”€S)¹±¦¦¦³X,,‡bÌérÛ¶'™¦ùm¿š‰DCmmí¿6lèZå4]ËÌ#Âój§px<=—Ë.â¡áIDÆ̲ 0}"Q/¥\G„¥ÄHÉGöéÓ§#—Ë.G Ç9Žó :4ÇÏøC+}À^cOzŠEwÿH$²ÀoBI³½£‰JöÈÞh´fÿ ¬ªô„d2q63mUÒ$f\â8Nµ8”ݖвSbYæ1àÒïþ#㿚=´~áì¡õKô‹†Þ¾øN‡e™€Ÿ•~oty«Œ?h57Ä„l‰Ðm.pðcü XÌ_Åøceww÷–e%ƒÆˆh¼ëºç `ütK‰›¥, À{&“É,ìÓ§æÿ ÿœëÊë+¬R_J§ÓÿX½zõPŒ?Š®ë^W­ÿ¦iÐiª”š½6…îaxDÊhÀ7ªµ§é?‰DÖ|fP.%&033“¿ðL&“YXa%¿®P(üÉoSßË*NÛ]]]ã …BÜPaœžsçÕl6û-¨Û39×åÉÌîåPc9f§Óé!p1ÔÀ¹™Læ•\®÷<¨Ñÿ¯;ŽóŒiš5–e]ÇÞôO9 °~@d€eœ¥¥p€?···¿_!(ðíÞÞÜýÌjì¦U3þž'Gß‚©ÊÃ0nÛJÝÝŠ0@ÈN‡e™ãh›gìûßå±ÓgÝ6fqÛΚeítø«)à³[qÌq™žŒ¼+ð€ lÛyý¿í„išµD›‹yÐYÓ4¯ õø…‹ÅþšËeoU´ ·‰!Ìò‹Z;ÍcÇŽ5˜érMÿîh¤ÄñA¹²™ˆÈ²W¨ŽÊ-§!?e5Vt‘ã8³-ËúÀJKLãyTww'@ã*µ],º‹„(^F´Ù•à­x<~¿iš5¦ »6÷Åm5jT€/ÔššÚÑѱÁ4ÍÉ0ZíšGÔ­ "L ûBÙÚB6—úA„M^ )ñnMMpÝâYzûMMM{2o.1í?¡yÈ!ñÚÚ¾júã½| õ÷zUž”’)½¬¶Ã×­^½úÐ&m̘lšæÇˆÔ @fLŽÅb'h±"EÃp'¡ ‰DâdÂÍñéÌ¢l ¥\eÛ©]NBv2,Ëà¶/o}Šß-±^@ÜL”G¯ïø±?/ýnº¼Åª†]ü%B° z Àå¶í<øaõ…ˆÐ^цH$rKCCÃ"èAãs¹Ü·¡®:óDÆd)¥žævã8/òJ€‚GÀd±('ý ê*5N·=ešæ‰ÌHä[LC\__¿a팿hçíç+òg…Ë¥tÏJ™1Éqìy–e]ð'ú¯E"‘³.!á d§¡”ß¿ÁeckVÀ[ ž±Ÿ àÉxÕ_âTëSåÝ‹þ!¼¡Þ0ÀxÛv>´w3M³†ˆ´ 0þÓÂ… ×%“æïX%3c)3Í"â´¦¯a9)]ý¨]ÓL¬ Dàáy€¾©Êy‚]wón±¨aÝ­ýof¾×_i>¨+„l–ˆÄ+ëêêî´,+ x}ØÜ'÷x)…^Ÿ`a·WëOµ•ü‚ V%“ÉáÐ jö³–_*ŒŸªHͨB2™Ü‹H/|µi•‘¦>~ìØ±À—kú“ÚÛÛ¿ (—®+ωÅb}>O{·)RÊÑzí)yBSSÓzP 3¦ !dMA1÷ûy  œFhN&ë¿(ú`æ?x¿¸ )nà0Э*á d§ ”߉ø˜Â¶ÿ•@a…ÀÒ´ U­9 Å¶Y~O· ›¢Ì?ΨXÖ8cþ!¬#Ì‚·êßB%¾ÿ "ú¶ºâE¾Pp¯ollÄ Ý%>‰ˆN8膕BD&äóù¯éçæK×u3B\†Àw3–¸÷ƒ•ÒoÉà9²? »µùþúú„ÛÞÞ6ASo"óWÉÀŒ[[ZZz-Ëú…¦o×Ôì1/—ËN×ôËrãyÿý•§WZÉ{÷ÊK¡x=ÈqçIÓ4¿pð(¤+%š £lkcq&“y¤Ú³Ë‹)y«|Ó4σ:û—ã8ñ7 ÈWvwwßY[[«¹øñd[[Ûb˲¦L:Ô ˆ›©'.z"“Éd,+ñ€ä½…BaJ,½GÓ*NÛ~?ƒÆ¿×0Œë¥¤A/3^rçU˲ÎX‰ 2ªÆŠ„„A€!;–eðê¾^”[=+-h„YQÂâ"úÇ1ôåʇ¨úŸ3aYæ×8Vw@`Û#`¾A˜x J©u„cmÛ»Œ¿Ðƒ°ÜÝÑÑñN¡¿jP઺ººiŽ¢ÍN¥R‹„à ß+< 7 ã¹h4ºŒßÓ”'Í;·XÅ=®£M‹Åó ¥´èŒöö¶4ʲóÑo\×=~µÅBð‚d2q6ÀÁ @ йù|VÊÛX(nªÖ(Tó\Û~‰å“4õ¹#FŒø³^%Ç3óf5}13&0—g€Q£Fõ)/¦$›ÇŽk©‰R;剅hJ¿~}ŽÖã&ˆ°Ÿiš³>_kç6)e(›´÷‰LvÝâ­šúßÇyÙ²¬³ì£Q÷:¢ø+ù½¼ ‰;)Ø>3žËd27&‰ÏèÞ%f\àöAoÊüê^ŸÐ²£™x¹ÙûTp}3€µ´„G¢„æ¸À½5„”jü;᥼m²mçÓ¶íèh;%–eŽðÙ ¬‡€#„7 ÀCmÛ¹u{ â^û£¯¿Þþ†ˆ`P`·bª¾:'Âóñxü ˲~MDWÑ»Í"WÙ¶}”†žàå)Å|¿@Ð&˜1¥¥¥¥WJÒÒ{îñjý÷ÌÝÚýüñú{.Ìfs€aÈgõëPož?±íÌÏ=W¾RŸ V?Šè¿MYåt:m€ã8KàMV•îŸO„©Ìø¼ëº}¡mm0ÓõzÙÜ•â˜1±Ê*ÿúÅ‹çÊlÒm .\5Û`éÚ ”ÕFà{™ó{êI€ü€MÝ»äyBòùüB”o P>{¾5—ËÏÌÇX«é‹ >îŠÅb_˜;wn±¼ï!AB@ÈòÌ+H¾²TÓjÃ%°†€DX!Pi•xF€Y¶í´~$þð9¿ŠüYÚ¶£çÊß.X–ÕÏx¼&ÔLDÂ4'å̸Ë0 ƒŠEc(Ñf¹”¸&ŸÏþÀÕ¦»‰ÄD¿¬k0x­[ãl×uOÐåÿ€9!ÄT¯b©ö¿¯ÌUÉàtG±èÞ/„8ÒÏ]° ÀC€øÍâÅ‹sJµÍ·,ëT"þ3†ÁËd¸ÀfÌ1 cF*•êôúF§kýyjáÂö¥U†ÉdÒbÆ~Á1bƵ›ÿÍlšæW„ÀµÌ8Þø÷XN„§˜iz:m§À4ÍïúyðK¹ð7–rTâý÷W~ÉßbXDX“Íæî¶,k¼BAËíÜê{[>»†a\ïÝËd¦z1"¼ÈL³˜y©ïÝYæ¿Fd‚ëºg)ƒN?¦á3D¨ Ž_ɲhÑ¢ÕÉdýhfq €¼Éf7¼#ÏH‰û'ójé¾ÖÖÖ–e àZ€€Wr#€åýM÷¾Tª­j}ˆ•0`ÈÁ²ÌxÕê•ú¬ÄRl6ú¯~€îNôï=lÞSfx†ÿÛvþgJI&MG;²··á›¸™qŽã8U#ç·ý¹‰3™éÞ€¨èºò R®€Ñ£GG¶f58tèÐXirðQ³#Ÿ½5líþ· 2$¾-{¶U?D%œ„ì,Ë|eîŠ,Ãf£ÿÏíÛ«Ë2ãðJ¼`ºm;olñ¦Ë2ßFù~{,3.sgê‡õLÿÈ\ Ê^;ßkÛ™oW½)$$@¸²ã8` ×–c³Ñå£éÎG‹m;YG~ âÿD|3Ý µ ¸Ì˜'„¸Ø¶½=ð Ó4׎Ìm1QPHHÈf @ÈŽb¼=pò^²mGŽ ù Ḭ̂,ëYf>ZˆR‘~‹Y<ë8ö{Ûã™ÌÜÀ&ƒODïl)QPHHÈfÂ-€Ýð`HHHHHÈnH¸²•466*ò”¤<|1³Xp°6½‰¸‡né¨ P:‚ÉZ>úšmÛ-b·CB*NBBBB¶?sa0áЪÚÚ=ذ¡ëExgìDxháÂö¥~A›>¶ùºÎ¶í‰Þ¿ùÊà}ÍÈGE8 Ù ü´È?V¥tcWWW#†X_’2{‰njkkÿಀ—ÂwäÈÆèà}®Ù. ©@8 Ù„e™·mg«#öí¹çžk·”$Æ4ÍZ)å€B¡°bk’Ý455í±qãÆA[«ßÐÐÐ×u݃ zg[“ÕŒ1b@±Xì®ôÓ4kÀqœnðÒ"S0-ò†H$2ÕO™Û_¿¿ry]ž^_{`ÀõÑïÇÇêëëÿ=sæÌmJ =lذÑh´«ZÚ`À?!òƒÖ­Ë®ØÖ¤:[¿Édr/)e¿x<þnkkka[ÚÙ¾„§BBv#,˼^Ý„=Žð{xu À˸x„m;+“Ióý¤6D¹IDATfL èg…0L)åyŸ @/Ÿ‘Ngæ””’Éäç˜åðªð•Œx   u7w"‘)]D„/2cxÇC …Ì|¹ã8Ï«ïa È4›³)²¥”çe2™W¼~$Nb¦·J€Ž$â3™q"€ Drl:Ý6LÓü<Mx¤÷n˜!%Î'Â(‰Žx’ü°”b^°oRò—„ ©F V`s±QãX)Ý—l*„C„qé´sQ"‘ø2 pé3€<€×˜ñ#ÇqRþ8œð]öó®+5 ñcf|Õ/ð”cÆ×‚cè•Z¦  X¢÷u"qQ:~a ãw( Ç4^%Ë3Îfw4Mó+Dø€¯`s^I„v)q•ã8!d‡zBBv,ËŒÂË™4JOëÆxP@v€ÏŒ;ö1füjºÇ¥tï…Z^·³H˜cšf­˜ÁŒ¯Wèhx& ff9tèÐX<»Múh븑655íÛÚÚZðWû3ˆp’ZŒ¸Qú+íå¿W|ß<•G«÷‰aL&"Â3—¾÷`Æ÷´AÍr˜/Üë£ÑèÔ`ûDxE1HKN¤ô‘2»ß…š0é­ššø¬‘#GöO$á Áš÷>5Ž"ÂÓöõD|%Ÿ3þnâ~‡*Ƅ࡞ojjÚ#ŸÏÞE„Ó*´‡0ËYMMMŸlmm-èãnj羖ˆ‚¥ŒkˆÈ€áÇ÷‹F#wáÔ²–ÁŒ©¯¯ÿt)UsÈŽ#ô„„ì&X–ù]Ó5qUh€}úÀhòÊWµ`ÆIÅbqn4y Þª°ÄZxEv”{\Wî»Ç{¬Ïå²0*piƒ¯[ÔÂ80¾—Ëe_phàR¼…ŒÞþ‘Häf9Oï**Ìúr$yµX,¼µlmð9}¿ßÐug‚íÉ“™ÅÏ4Uh¤”|„4Om.ŠD"w‹…x^‰]ðÊ%+Ÿ‘ÆÇ]×mô'ø~Ì8<g*Œßz¿í=´ödæÁƯâçO„ööæîŠÇcó¸Ôë÷'®õç8ÇqžÑÛ ùh ó„„ìøÅ‡´’¬X/å²¾¯¼Ä¶D¬—îð$ÊË·®Ïåró"‘È$¨Æ¿…Ÿ ÂAef¼ÑÖÖön.—k†büiÆ>€ª`y*•êÌf³¿ƒb¼È)Šû¤—~¯½½}9 õr¼.‡7é R ¢Öb±x3TãŸð0¼IIÐøKÃp'0óO¡ÛÛnŸcÛÎaþ®=ãIÛvȶC¯µ÷~,»½XÌ_ÅøÓü~ýê>ЭZ[KR©ÔJ½$3O"¼ÂL×"d§  Ùű,ó”Wl¶,3àRM>Cˆ0:($rÇ‘H$?%e‡™¦üq}µàhË2³Deß1÷à ~;AËfH§ÓÿÐûjšæA^ÐÚf˜½@~ZðÒl!DVJwl%}Ý83ã±b±°>|GíM`f™LšWäü ¸%ð<'Aùd/H±ÞÄñÚµf=zt`e¼‰p3>¥3šýRǺ!¾×/€t¢ÚŽ7~Dªá&Â}õe–Á =Ü`Yfe6€ÂúøaSÁ%u[ˆ9ŽÝnY‰s+„œ@„¾‘H͉ ,X¥_ Ùñ„€]}Eú’m;-΀ºç]0I7"þ‘N·½hYõ§úÇÊJ¸&VXmÞj=uÕÎRò! ï·ÛvûTçr­%õõõ³’ÉäçV& Ìh–Ò½¬’~%·¹b|4j\ 5èðßÌ|¯iš‡1ãóª¾l?†Á¿Àí %]¡½[[&“yV¯^}4o‘QÑ[QÅ»!‰h‚ÿù(ϰí¶ÇLÓ<ê)¥Û†À"‰ß â} &FêÍç ƒ-Z´Ú4Í›ˆ ´{+‹ºµµµ`šæ‰Dêx‰z?YRpü–ŒQpGGÇÑåGðè0@~ àdy,?(ŸÏ71K-²ž>CħiãýofXWWgtuuíÔöÇûmüÞëîî9 Z†@?Ë_pu"n€v¬À ¶í[©Gè ÙE±,sP¶:÷Wóe«Û§ #² eµHÄ«ÿ†††½¡­™qÝÌ™3]×ugáÝÒÀ$“ɽ˜+ïçr¹A}"z4™LîUau~Cggg¶Â6Ek>/_è¼_ùøñÕŒCCC_f¹Xm‡÷Õ&(%Ú*µ²c =!!»(–eNüB_à@x)çjêG{.~%HííX,~`µüíV‹«úõ«Û¿»»û f™Vµé+Ì|8~®Â,¥¬'ÔaÆI’š~W,œÏç0Ë7اfÆiD4à‰ý ‘Htp¡P¨#›¼ñYRR"ÜÐÏåó…ý Ãèkâ â˜ñ"Ê|O@¿èºò ¶¶¶eɤù;f%’ÆàT*Õã¥ÝÅKÁÑ`ÆD|R¥Õv%ï†üE×¥Ïá—ñêX,¾ooï!Ȇ2Á¡ˆ¸‘¿ è¯eÆ`)å>†!:PæÝ ´ñëŠÅâƒ[[[ƒÅŠ6aYÖ…ßu3c‡—'(¢Ñ¶mÏ«ÔNÈŽ#ô„„ì‚X–¹7€qšx €ãÜ©É_&mkçøqý–‹·è«QÌjiiée–×iòlÛþ+‘¾Úåi©Tª¿†j¼æg2™Çý\òAýé­­­ë™åÕPƒÔþÑÓÓó$_¬éÿiáÂ…ëˆøRŒ?3–°÷ƒD¸HëçúšššFÃ#`ü‰ðN>Ÿ¿`-‘?ÐÖÖ¶Ì4ÍZfµJ 3îóÞ­üäžÏd2¯ôM~{gggVüFë×3®K¯è•‰pSkkëF!Hò³mÛ~ÒOaÔÌqœnÃ×Aýî­§§ç‰òñߪÿ-uýÇYSž˜g†Æç$ô„„ì‚X–y €«>PÑ+O{@ÇWÚ /UÂÓI&“Ùe»&n<×PE+è¿ð{ðŠÊlê‘i…l±htªêô"3¿M¤Ámt]yˆaÇüç€<_(‡0s¾¦&º =ifœoÆ)Ý·*½[9ôSm?2‘hH§Ó¶iš§a–vÓJ"ÜG$ïR¤¡Np¾LD+*xIžx€“Âu†1¥,žÎŒàĪ´Ú®­äÝ0 ù²>~DXÈLË´ÄB9f4ÑQ•Ư££ãJ#bYÖ€u·þ?t©|O#™J¥V"d§#ô„„ìbX–٪랫¢~q¿~u‹ô½p"L­füÀu]£‚xTãßÅŒ3lÛ~•ë |N3þ:3Nw¸nT ,¢œÑŒÿJ€Æ´··¿éu rOGGÇ;Ñhô¨i«êêê¦I)G¡œÍ(c]¡P¸µ<1žJ§Ó6c+´µ·”ØP~,ضý7×u+ä`á/B5þo3ã„b±¸Š—(šŒÛ¼Õ6]õ,ÿ²ö~°Òøy™ãßÍŒ33™LG…ñ»»šñ÷ÚâÁć#`ü™ñ‘ÿ—p²ëñC¨õé7ø²à9mÀ$Ûvníêê‡Í%u 7© Fº—‘Éd2O«r9ÏŒ9Ì8ÔqœÇÀ7–lIßuå¡¶m?âë/ñ£É+¹({˜1Ýuå!¶mÿ-‘Hœ¬å'BMÓ¬Õ¢òÁŒ)---½ðréeÆ>¡Šù–H$’D•Ô¾Þ¿iï }ì%¢Gõc¥„=™LfáƯ  ?‹î!Žã¼LDgA«D‰D&6l ÀJà!&Í;·èߨ<~O‰ÃÇy¸Òø†;±Â}›ˆÇãÏ´ Êå÷ý£ŒG¥Óé%[j'dÇn„„ìBX–Y ›ÊÅð ýå–e~À©ð À<ÛvÞðeæM†ˆVlížm"‘IDMDôI"^ ð[€ñb:^[I¿¡¡þH×Ö6è›®+Ž$âOÑûRb€¹Aï„ßæ¥ß…àõétæéúúú}„JâŸx<þti_Û4Íã„@ƒ”x=ÏÏårqfV2 ø+¼T¼›òQζíGK¿›¦Y oõ»w@g3¿@U@"’Žã<䟩/?f^%„쬭í?ן¤øï—ø¬ëÒ¦ €aðªT*ó\}}ýþBˆ£‚­««›¼×²¬¤|Iûò}"~KJñ¢ã8k>hüð‘0Mó«Ì|°èÇLo3óÒžžž–j'Bv. @HÈ.„e™ß‡Ÿ•Î'`ˆm;Uݹ!!!»'á@HÈ.‚e™^ÚÜ w‡Æ?$$¤á $d×á@Ý˰ŽÜÝ—ÿ ‰·8àš3IEND®B`‚hypre-2.33.0/src/docs/hypre.bib000066400000000000000000000377231477326011500162740ustar00rootroot00000000000000% Copyright (c) 1998 Lawrence Livermore National Security, LLC and other % HYPRE Project Developers. See the top-level COPYRIGHT file for details. % % SPDX-License-Identifier: (Apache-2.0 OR MIT) @techreport {GKarypis_VKumar_1998, author = "Karypis, G. and Kumar, V.", title = "Parallel Threshold-based {ILU} Factorization", number = "061", institution = "University of Minnesota, Department of Computer Science/Army HPC Research Center, Minneapolis, MN 5455", year = "1998" } @article{VEHenson_UMYang_2002, author = "V. E. Henson and U. M. Yang", title = "Boomer{AMG}: a Parallel Algebraic Multigrid Solver and Preconditioner", journal = "Applied Numerical Mathematics", volume = "41", number = "5", pages = "155--177", note = "Also available as LLNL technical report UCRL-JC-141495", year = "2002" } @article{Griebel_2, author = "M. Griebel and B. Metsch and M. A. Schweitzer", title = "Coarse grid classification - {P}art {II}: {A}utomatic coarse grid agglomeration for parallel {AMG}", note = "Preprint No. 271, Sonderforschungsbereich 611, Universit{\"a}t Bonn, 2006." } @article{Griebela_1, author = "M. Griebel and B. Metsch and M. A. Schweitzer", title = "Coarse grid classification: {A} parallel coarsening scheme for algebraic multigrid methods", journal = "Numerical Linear Algebra with Applications", volume = "13", number = "2--3", pages = "193--214", note = "Also available as SFB 611 preprint No. 225, Universit{\"{a}}t Bonn, 2005.", year = "2006" } @article{EChow_2000, author = "E. Chow", title = "A Priori Sparsity Patterns for Parallel Sparse Approximate Inverse Preconditioners", journal = "{SIAM} J. Sci. Comput.", volume = "21", pages = "1804--1822", year = "2000", } @inproceedings{EChow_AJCleary_RDFalgout_1998, author = "E.~Chow and A.~J.~Cleary and R.~D.~Falgout", title = "Design of the {\sl hypre} preconditioner library", booktitle = "Proc. of the {SIAM} Workshop on Object Oriented Methods for Inter-operable Scientific and Engineering Computing", editor = "Mike Henderson and Chris Anderson and Steve Lyons", publisher = "{SIAM}", address = "Philadelphia, PA", note = "Held at the IBM T.J. Watson Research Center, Yorktown Heights, New York, October 21-23, 1998. Also available as LLNL technical report UCRL-JC-132025", year = "1998" } @incollection{RDFalgout_JEJones_UMYang_2004TA, author = "R.~D.~Falgout and J.~E.~Jones and U.~M.~Yang", title = "The Design and Implementation of {\sl hypre}, a Library of Parallel High Performance Preconditioners", booktitle = "Numerical Solution of Partial Differential Equations on Parallel Computers", editor = "A.~M.~Bruaset and A.~Tveito", publisher = "Springer--Verlag", pages = "267--294", note = " Also available as LLNL technical report UCRL-JRNL-205459", year = "2006" } @article{RDFalgout_JEJones_UMYang_2005a, author = "R.~D.~Falgout and J.~E.~Jones and U.~M.~Yang", title = "Conceptual Interfaces in {\sl hypre}", journal = "Future Generation Computer Systems", volume = "22", pages = "239--251", note = "Special issue on PDE software. Also available as LLNL technical report UCRL-JC-148957", year = "2006" } @article{RDFalgout_JEJones_UMYang_2005b, author = "R.~D.~Falgout and J.~E.~Jones and U.~M.~Yang", title = "Pursuing Scalability for {\sl hypre}'s Conceptual Interfaces", journal = "{ACM} Trans. Math. Softw.", volume = "31", number = "3", month = "September", pages = "326--350", note = "Also available as LLNL technical report UCRL-JRNL-205407", year = "2005" } @article{YSaad_1994, author = "Y. Saad", title = "{ILUT}: {A} dual threshold incomplete {LU} factorization", journal = "Numer. Linear Algebra Appl.", volume = "1", pages = "387--402", year = "1994" } @book{YSaad_1996, author = "Yousef Saad", title = "Iterative Methods for Sparse Linear Systems", publisher = "PWS Publishing Co.", address = "Boston, MA", year = "1996" } @techreport{FEI-ref, title = "An annotated reference guide to the {F}inite {E}lement {I}nterface {(FEI)} Specification, {V}ersion 1.0", author = "R. L. Clay et al.", institution = "Sandia National Laboratories", address = "Livermore, CA", number = "SAND99-8229", year = "1999" } @article{SSchaffer_1998a, author = "S.~Schaffer", title = "A semi-coarsening multigrid method for elliptic partial differential equations with highly discontinuous and anisotropic coefficients", journal = "{SIAM} J. Sci. Comput.", volume = "20", number = "1", pages = "228--242", year = "1998" } @article{PNBrown_RDFalgout_JEJones_2000, author = "P.~N.~Brown and R.~D.~Falgout and J.~E.~Jones", title = "Semicoarsening multigrid on distributed memory machines", journal = "{SIAM} J. Sci. Comput.", volume = "21", number = "5", pages = "1823--1834", note = "Special issue on the Fifth Copper Mountain Conference on Iterative Methods. Also available as LLNL technical report UCRL-JC-130720", year = "2000" } @article{SFAshby_RDFalgout_1996, author = "S.~F.~Ashby and R.~D.~Falgout", title = "A Parallel Multigrid Preconditioned Conjugate Gradient Algorithm for Groundwater Flow Simulations", journal = "Nuclear Science and Engineering", month = "September", volume = "124", number = "1", pages = "145--159", note = "Also available as LLNL Technical Report UCRL-JC-122359", year = "1996" } @inproceedings{RDFalgout_JEJones_2000, author = "R.~D.~Falgout and J.~E.~Jones", title = "Multigrid on massively parallel architectures", booktitle = "Multigrid Methods VI", editor = "E.~Dick and K.~Riemslagh and J.~Vierendeels", series = "Lecture Notes in Computational Science and Engineering", volume = "14", pages = "101--107", publisher = "Springer", address = "Berlin", note = "Proc. of the Sixth European Multigrid Conference held in Gent, Belgium, September 27-30, 1999. Also available as LLNL technical report UCRL-JC-133948", year = "2000" } @article{JEMorel_RMRoberts_MJShashkov_1998, author = "J.E.~Morel and Randy~M.~Roberts and Mikhail~J.~Shashkov", title = "A local support-operators diffusion discretization scheme for quadrilateral {\it r-z} meshes", journal = "J. Comp. Physics", volume = "144", pages = "17--51", year = "1998" } @inproceedings{DHysom_APothen_1999, author = "Hysom, D. and Pothen, A.", title = "Efficient Parallel Computation of {ILU}(k) Preconditioners", booktitle = "Proceedings of Supercomputing '99", month = "November", publisher = "ACM", note = "Published on {CDROM}, {ISBN} \#1-58113-091-0, {ACM} Order \#415990, {IEEE} Computer Society Press Order \# RS00197", year = "1999" } @article {DHysom_APothen_2001, author = "Hysom, D. and Pothen, A.", title = "A Scalable Parallel Algorithm for Incomplete Factor Preconditioning", journal = "{SIAM} J. Sci. Comput.", volume = "22", number = "6", pages = "2194--2215", year = "2001" } @book{SFMcCormick_1989a, author = "S. F. McCormick", title = "Multilevel Adaptive Methods for Partial Differential Equations", series = "Frontiers in Applied Mathematics", volume = "6", publisher = "{SIAM} Books", address = "Philadelphia", year = "1989", } @incollection{Ruge_Stueben_1987, author = "J. W. Ruge and K. St{\"u}ben", title = "Algebraic multigrid ({AMG})", booktitle = "Multigrid Methods", series = "Frontiers in Applied Mathematics", volume = "3", editor = "S. F. McCormick", publisher = "SIAM", address = "Philadelphia, PA", pages = "73--130", year = "1987" } @article{DeSterck_Yang_Heys_2004, author = "H.~{De Sterck} and U.~M. Yang and J.~Heys", title = "Reducing complexity in parallel algebraic multigrid preconditioners", journal = "SIAM Journal on Matrix Analysis and Applications", volume = "27", pages = "1019--1039", note = "Also available as LLNL technical report UCRL-JRNL-206780", year = "2006" } @article{DeSterck_Falgout_Nolting_Yang_2008, author = "H.~{De Sterck} and R.~Falgout and J.~Nolting and U.~M. Yang", title = "Distance-Two Interpolation for Parallel algebraic Multigrid", journal = "Numer. Linear Algebra Appl.", volume = "15", pages = "115--139", note = "Also available as LLNL technical report UCRL-JRNL-230844", year = "2008" } @article{UMYang_2010, author = "U.~M. Yang", title = "On Long Range interpolation Operators for Aggressive Coarsening", journal = "Numer. Linear Algebra Appl.", volume = "17", pages = "453--472", note = "Also available as LLNL technical report LLLNL-JRNL-417371", year = "2010" } @article{Baker_Kolev_UMYang_2010, author = "A.~Baker and T.~Kolev and U.~M. Yang", title = "Improving Algebraic Multigrid Interpolation Operators for Linear Elasticity Problems", journal = "Numer. Linear Algebra Appl.", volume = "17", pages = "495--517", note = "Also available as LLNL technical report LLLNL-JRNL-412928", year = "2010" } @article{Vassilevski_UMYang_2014, author = "P.~Vassilevski and U.~M. Yang", title = "Reducing Communication in Algebraic Multigrid Using Additive Variants", journal = "Numer. Linear Algebra Appl.", volume = "21", pages = "275--296", note = "Also available as LLNL technical report LLLNL-JRNL-637872", year = "2014" } @article{Baker_Falgout_Kolev_UMYang_2011, author = "A.~Baker and R.~Falgout and T.~Kolev and U.~M. Yang", title = "Multigrid Smoothers for Ultra-Parallel Computing", journal = "SIAM J. on Sci. Comp.", volume = "33", pages = "2864--2887", note = "Also available as LLNL technical report LLLNL-JRNL-473191", year = "2011" } @incollection{Stueben_1999, author = "K.~St{\"u}ben", title = "Algebraic multigrid ({AMG}): an introduction with applications", booktitle = "Multigrid", editor = "U.~Trottenberg and C.~Oosterlee and A.~Sch{\"u}ller", publisher = "Academic Press", year = "2001" } @article{UMYang_2004, author = "U.~M.~Yang", title = "On the use of relaxation parameters in hybrid smoothers", journal = "Numerical Linear Algebra with Applications", volume = "11", pages = "155--172", year = "2004" } @incollection{UMYang_2005, author = "U.~M.~Yang", title = "Parallel Algebraic Multigrid Methods - High Performance Preconditioners", booktitle = "Numerical Solution of Partial Differential Equations on Parallel Computers", editor = "A.~M.~Bruaset and A. Tveito", publisher = "Springer-Verlag", note = "Also available as LLNL technical report UCRL-BOOK-208032", pages = "209--236", year = "2006" } @article {xu_H_curl, author = "R.~Hiptmair and J.~Xu", title = "Nodal auxiliary space preconditioning in ${H}(curl)$ and ${H}(div)$ spaces", journal = "Numer. Math.", note = "to appear", year = "2006" } @techreport {h_curl_amg_report, author = "Tz.~V. Kolev and P.~S. Vassilevski", title = "Some experience with a ${{\mathbf H}}^1$--based auxiliary space {AMG} for ${H}(curl)$--problems", institution = "LLNL", number = "UCRL-TR-221841", year = "2006" } @techreport {ams_report, author = "Tz.~V. Kolev and P.~S. Vassilevski", title = "Parallel ${{\mathbf H}}^1$-based auxiliary space {AMG} solver for ${H}(curl)$ problems", institution = "LLNL", number = "UCRL-TR-222763", year = "2006" } @article{ams_jcm, author = "Tz. Kolev and P. Vassilevski", title = "Parallel Auxiliary Space {AMG} for {H}(curl) Problems", journal = "J. Comput. Math.", pages = "604--623", volume = "27", note = "Special issue on Adaptive and Multilevel Methods in Electromagnetics. UCRL-JRNL-237306", year = "2009" } @article{ams_hpamr, author = "A. Grayver and Tz. Kolev", title = "Large-scale {3D} geo-electromagnetic modeling using parallel adaptive high-order finite element method", journal = "Geophysics", note = "Also available as LLNL technical report LLNL-JRNL-665742", year = "(submitted)" } @article{JonesLee_2006, author = "J.~Jones and B.~Lee", title = "A Multigrid Method for Variable Coefficient Maxwell's Equations", journal = "{SIAM} J. Sci. Comput.", volume = "27", pages = "1689--1708", year = "2006" } @article{VaMB96, author = "P.~Van{\v e}k and J.~Mandel and M.~Brezina", title = "Algebraic multigrid based on smoothed aggregation for second and fourth order problems", journal = "Computing", volume = "56", pages = "179--196", year = "1996" } @article{VaBM01, author = "P.~Vanek and M.~Brezina and J.~Mandel", title = "Convergence of algebraic multigrid based on smoothed aggregation", journal = "Numerische Mathematik", volume = "88", pages = "559--579", year = "2001" } @Article{assumedpartition06, author = {A.H.~Baker and R.D.~Falgout and U.M.~Yang}, title = {An assumed partition algorithm for determining processor inter-communication}, journal = {Parallel Computing}, year = 2006, volume = 32, pages = {394--414} } @article{LOBPCG_2001, author = "A. Knyazev", title = "Toward the Optimal Preconditioned Eigensolver: Locally Optimal Block Preconditioned Conjugate Gradient Method", journal = "{SIAM} J. Sci. Comput.", volume = "23", number = "2", pages = "517--541", year = "2001", } @article{BLOPEX_2007, author = "A. Knyazev and I. Lashuk and M. Argentati and E. Ovchinnikov", title = "Block Locally Optimal Preconditioned Eigenvalue Xolvers (BLOPEX) in hypre and PETSc", journal = "{SIAM} J. Sci. Comput.", volume = "25", number = "5", pages = "2224--2239", year = "2007", } @misc{BLOPEXWebPage, key = "BLOPEX", title = "{BLOPEX}, parallel preconditioned eigenvalue solvers", note = "\url{http://code.google.com/p/blopex/}" } @misc{CMakeWebPage, key = "CMake", title = "{CMake}, a cross-platform open-source build system", note = "\url{http://www.cmake.org/}" } @article{FaSc2014, author = "Robert D. Falgout and Jacob B. Schroder", title = "Non-Galerkin Coarse Grids for Algebraic Multigrid", journal = "SIAM J. Sci. Comput.", volume = "36", number = "3", pages = "309--334", year = "2014", publisher = "SIAM" } hypre-2.33.0/src/docs/ref-manual/000077500000000000000000000000001477326011500165025ustar00rootroot00000000000000hypre-2.33.0/src/docs/ref-manual/Makefile000066400000000000000000000015611477326011500201450ustar00rootroot00000000000000# Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) PDFLATEX = pdflatex --interaction=nonstopmode ################################################################## # Targets ################################################################## # all: html pdf all: pdf install: clean: @/bin/rm -fr html latex xml distclean: clean ################################################################## # Rules ################################################################## html: doxygen conf.doxygen pdf: html @cd latex; ${PDFLATEX} refman; ${PDFLATEX} refman ########## version.tex: @ \ echo "\def\HYPREVersion{$(HYPRE_RELEASE_VERSION)}" > version.tex; \ echo "\def\HYPREVersionDate{$(HYPRE_RELEASE_DATE)}" >> version.tex hypre-2.33.0/src/docs/ref-manual/conf.doxygen000066400000000000000000003507331477326011500210410ustar00rootroot00000000000000# Doxyfile 1.9.5 # This file describes the settings to be used by the documentation system # doxygen (www.doxygen.org) for a project. # # All text after a double hash (##) is considered a comment and is placed in # front of the TAG it is preceding. # # All text after a single hash (#) is considered a comment and will be ignored. # The format is: # TAG = value [value, ...] # For lists, items can also be appended using: # TAG += value [value, ...] # Values that contain spaces should be placed between quotes (\" \"). # # Note: # # Use doxygen to compare the used configuration file with the template # configuration file: # doxygen -x [configFile] # Use doxygen to compare the used configuration file with the template # configuration file without replacing the environment variables or CMake type # replacement variables: # doxygen -x_noenv [configFile] #--------------------------------------------------------------------------- # Project related configuration options #--------------------------------------------------------------------------- # This tag specifies the encoding used for all characters in the configuration # file that follow. The default is UTF-8 which is also the encoding used for all # text before the first occurrence of this tag. Doxygen uses libiconv (or the # iconv built into libc) for the transcoding. See # https://www.gnu.org/software/libiconv/ for the list of possible encodings. # The default value is: UTF-8. DOXYFILE_ENCODING = UTF-8 # The PROJECT_NAME tag is a single word (or a sequence of words surrounded by # double-quotes, unless you are using Doxywizard) that should identify the # project for which the documentation is generated. This name is used in the # title of most generated pages and in a few other places. # The default value is: My Project. PROJECT_NAME = hypre # The PROJECT_NUMBER tag can be used to enter a project or revision number. This # could be handy for archiving the generated documentation or if some version # control system is used. PROJECT_NUMBER = 2.33.0 # Using the PROJECT_BRIEF tag one can provide an optional one line description # for a project that appears at the top of each page and should give viewer a # quick idea about the purpose of the project. Keep the description short. PROJECT_BRIEF = # With the PROJECT_LOGO tag one can specify a logo or an icon that is included # in the documentation. The maximum height of the logo should not exceed 55 # pixels and the maximum width should not exceed 200 pixels. Doxygen will copy # the logo to the output directory. PROJECT_LOGO = # The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) path # into which the generated documentation will be written. If a relative path is # entered, it will be relative to the location where doxygen was started. If # left blank the current directory will be used. OUTPUT_DIRECTORY = . # If the CREATE_SUBDIRS tag is set to YES then doxygen will create up to 4096 # sub-directories (in 2 levels) under the output directory of each output format # and will distribute the generated files over these directories. Enabling this # option can be useful when feeding doxygen a huge amount of source files, where # putting all generated files in the same directory would otherwise causes # performance problems for the file system. Adapt CREATE_SUBDIRS_LEVEL to # control the number of sub-directories. # The default value is: NO. CREATE_SUBDIRS = NO # Controls the number of sub-directories that will be created when # CREATE_SUBDIRS tag is set to YES. Level 0 represents 16 directories, and every # level increment doubles the number of directories, resulting in 4096 # directories at level 8 which is the default and also the maximum value. The # sub-directories are organized in 2 levels, the first level always has a fixed # numer of 16 directories. # Minimum value: 0, maximum value: 8, default value: 8. # This tag requires that the tag CREATE_SUBDIRS is set to YES. CREATE_SUBDIRS_LEVEL = 8 # If the ALLOW_UNICODE_NAMES tag is set to YES, doxygen will allow non-ASCII # characters to appear in the names of generated files. If set to NO, non-ASCII # characters will be escaped, for example _xE3_x81_x84 will be used for Unicode # U+3044. # The default value is: NO. ALLOW_UNICODE_NAMES = NO # The OUTPUT_LANGUAGE tag is used to specify the language in which all # documentation generated by doxygen is written. Doxygen will use this # information to generate all constant output in the proper language. # Possible values are: Afrikaans, Arabic, Armenian, Brazilian, Bulgarian, # Catalan, Chinese, Chinese-Traditional, Croatian, Czech, Danish, Dutch, English # (United States), Esperanto, Farsi (Persian), Finnish, French, German, Greek, # Hindi, Hungarian, Indonesian, Italian, Japanese, Japanese-en (Japanese with # English messages), Korean, Korean-en (Korean with English messages), Latvian, # Lithuanian, Macedonian, Norwegian, Persian (Farsi), Polish, Portuguese, # Romanian, Russian, Serbian, Serbian-Cyrillic, Slovak, Slovene, Spanish, # Swedish, Turkish, Ukrainian and Vietnamese. # The default value is: English. OUTPUT_LANGUAGE = English # If the BRIEF_MEMBER_DESC tag is set to YES, doxygen will include brief member # descriptions after the members that are listed in the file and class # documentation (similar to Javadoc). Set to NO to disable this. # The default value is: YES. BRIEF_MEMBER_DESC = YES # If the REPEAT_BRIEF tag is set to YES, doxygen will prepend the brief # description of a member or function before the detailed description # # Note: If both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the # brief descriptions will be completely suppressed. # The default value is: YES. REPEAT_BRIEF = YES # This tag implements a quasi-intelligent brief description abbreviator that is # used to form the text in various listings. Each string in this list, if found # as the leading text of the brief description, will be stripped from the text # and the result, after processing the whole list, is used as the annotated # text. Otherwise, the brief description is used as-is. If left blank, the # following values are used ($name is automatically replaced with the name of # the entity):The $name class, The $name widget, The $name file, is, provides, # specifies, contains, represents, a, an and the. ABBREVIATE_BRIEF = # If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then # doxygen will generate a detailed section even if there is only a brief # description. # The default value is: NO. ALWAYS_DETAILED_SEC = NO # If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all # inherited members of a class in the documentation of that class as if those # members were ordinary class members. Constructors, destructors and assignment # operators of the base classes will not be shown. # The default value is: NO. INLINE_INHERITED_MEMB = NO # If the FULL_PATH_NAMES tag is set to YES, doxygen will prepend the full path # before files name in the file list and in the header files. If set to NO the # shortest path that makes the file name unique will be used # The default value is: YES. FULL_PATH_NAMES = NO # The STRIP_FROM_PATH tag can be used to strip a user-defined part of the path. # Stripping is only done if one of the specified strings matches the left-hand # part of the path. The tag can be used to show relative paths in the file list. # If left blank the directory from which doxygen is run is used as the path to # strip. # # Note that you can specify absolute paths here, but also relative paths, which # will be relative from the directory where doxygen is started. # This tag requires that the tag FULL_PATH_NAMES is set to YES. STRIP_FROM_PATH = # The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of the # path mentioned in the documentation of a class, which tells the reader which # header file to include in order to use a class. If left blank only the name of # the header file containing the class definition is used. Otherwise one should # specify the list of include paths that are normally passed to the compiler # using the -I flag. STRIP_FROM_INC_PATH = # If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter (but # less readable) file names. This can be useful is your file systems doesn't # support long names like on DOS, Mac, or CD-ROM. # The default value is: NO. SHORT_NAMES = NO # If the JAVADOC_AUTOBRIEF tag is set to YES then doxygen will interpret the # first line (until the first dot) of a Javadoc-style comment as the brief # description. If set to NO, the Javadoc-style will behave just like regular Qt- # style comments (thus requiring an explicit @brief command for a brief # description.) # The default value is: NO. JAVADOC_AUTOBRIEF = YES # If the JAVADOC_BANNER tag is set to YES then doxygen will interpret a line # such as # /*************** # as being the beginning of a Javadoc-style comment "banner". If set to NO, the # Javadoc-style will behave just like regular comments and it will not be # interpreted by doxygen. # The default value is: NO. JAVADOC_BANNER = NO # If the QT_AUTOBRIEF tag is set to YES then doxygen will interpret the first # line (until the first dot) of a Qt-style comment as the brief description. If # set to NO, the Qt-style will behave just like regular Qt-style comments (thus # requiring an explicit \brief command for a brief description.) # The default value is: NO. QT_AUTOBRIEF = YES # The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make doxygen treat a # multi-line C++ special comment block (i.e. a block of //! or /// comments) as # a brief description. This used to be the default behavior. The new default is # to treat a multi-line C++ comment block as a detailed description. Set this # tag to YES if you prefer the old behavior instead. # # Note that setting this tag to YES also means that rational rose comments are # not recognized any more. # The default value is: NO. MULTILINE_CPP_IS_BRIEF = NO # By default Python docstrings are displayed as preformatted text and doxygen's # special commands cannot be used. By setting PYTHON_DOCSTRING to NO the # doxygen's special commands can be used and the contents of the docstring # documentation blocks is shown as doxygen documentation. # The default value is: YES. PYTHON_DOCSTRING = YES # If the INHERIT_DOCS tag is set to YES then an undocumented member inherits the # documentation from any documented member that it re-implements. # The default value is: YES. INHERIT_DOCS = YES # If the SEPARATE_MEMBER_PAGES tag is set to YES then doxygen will produce a new # page for each member. If set to NO, the documentation of a member will be part # of the file/class/namespace that contains it. # The default value is: NO. SEPARATE_MEMBER_PAGES = NO # The TAB_SIZE tag can be used to set the number of spaces in a tab. Doxygen # uses this value to replace tabs by spaces in code fragments. # Minimum value: 1, maximum value: 16, default value: 4. TAB_SIZE = 4 # This tag can be used to specify a number of aliases that act as commands in # the documentation. An alias has the form: # name=value # For example adding # "sideeffect=@par Side Effects:^^" # will allow you to put the command \sideeffect (or @sideeffect) in the # documentation, which will result in a user-defined paragraph with heading # "Side Effects:". Note that you cannot put \n's in the value part of an alias # to insert newlines (in the resulting output). You can put ^^ in the value part # of an alias to insert a newline as if a physical newline was in the original # file. When you need a literal { or } or , in the value part of an alias you # have to escape them by means of a backslash (\), this can lead to conflicts # with the commands \{ and \} for these it is advised to use the version @{ and # @} or use a double escape (\\{ and \\}) ALIASES = # Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources # only. Doxygen will then generate output that is more tailored for C. For # instance, some of the names that are used will be different. The list of all # members will be omitted, etc. # The default value is: NO. OPTIMIZE_OUTPUT_FOR_C = NO # Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java or # Python sources only. Doxygen will then generate output that is more tailored # for that language. For instance, namespaces will be presented as packages, # qualified scopes will look different, etc. # The default value is: NO. OPTIMIZE_OUTPUT_JAVA = NO # Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran # sources. Doxygen will then generate output that is tailored for Fortran. # The default value is: NO. OPTIMIZE_FOR_FORTRAN = NO # Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL # sources. Doxygen will then generate output that is tailored for VHDL. # The default value is: NO. OPTIMIZE_OUTPUT_VHDL = NO # Set the OPTIMIZE_OUTPUT_SLICE tag to YES if your project consists of Slice # sources only. Doxygen will then generate output that is more tailored for that # language. For instance, namespaces will be presented as modules, types will be # separated into more groups, etc. # The default value is: NO. OPTIMIZE_OUTPUT_SLICE = NO # Doxygen selects the parser to use depending on the extension of the files it # parses. With this tag you can assign which parser to use for a given # extension. Doxygen has a built-in mapping, but you can override or extend it # using this tag. The format is ext=language, where ext is a file extension, and # language is one of the parsers supported by doxygen: IDL, Java, JavaScript, # Csharp (C#), C, C++, Lex, D, PHP, md (Markdown), Objective-C, Python, Slice, # VHDL, Fortran (fixed format Fortran: FortranFixed, free formatted Fortran: # FortranFree, unknown formatted Fortran: Fortran. In the later case the parser # tries to guess whether the code is fixed or free formatted code, this is the # default for Fortran type files). For instance to make doxygen treat .inc files # as Fortran files (default is PHP), and .f files as C (default is Fortran), # use: inc=Fortran f=C. # # Note: For files without extension you can use no_extension as a placeholder. # # Note that for custom extensions you also need to set FILE_PATTERNS otherwise # the files are not read by doxygen. When specifying no_extension you should add # * to the FILE_PATTERNS. # # Note see also the list of default file extension mappings. EXTENSION_MAPPING = # If the MARKDOWN_SUPPORT tag is enabled then doxygen pre-processes all comments # according to the Markdown format, which allows for more readable # documentation. See https://daringfireball.net/projects/markdown/ for details. # The output of markdown processing is further processed by doxygen, so you can # mix doxygen, HTML, and XML commands with Markdown formatting. Disable only in # case of backward compatibilities issues. # The default value is: YES. MARKDOWN_SUPPORT = YES # When the TOC_INCLUDE_HEADINGS tag is set to a non-zero value, all headings up # to that level are automatically included in the table of contents, even if # they do not have an id attribute. # Note: This feature currently applies only to Markdown headings. # Minimum value: 0, maximum value: 99, default value: 5. # This tag requires that the tag MARKDOWN_SUPPORT is set to YES. TOC_INCLUDE_HEADINGS = 5 # When enabled doxygen tries to link words that correspond to documented # classes, or namespaces to their corresponding documentation. Such a link can # be prevented in individual cases by putting a % sign in front of the word or # globally by setting AUTOLINK_SUPPORT to NO. # The default value is: YES. AUTOLINK_SUPPORT = YES # If you use STL classes (i.e. std::string, std::vector, etc.) but do not want # to include (a tag file for) the STL sources as input, then you should set this # tag to YES in order to let doxygen match functions declarations and # definitions whose arguments contain STL classes (e.g. func(std::string); # versus func(std::string) {}). This also make the inheritance and collaboration # diagrams that involve STL classes more complete and accurate. # The default value is: NO. BUILTIN_STL_SUPPORT = NO # If you use Microsoft's C++/CLI language, you should set this option to YES to # enable parsing support. # The default value is: NO. CPP_CLI_SUPPORT = NO # Set the SIP_SUPPORT tag to YES if your project consists of sip (see: # https://www.riverbankcomputing.com/software/sip/intro) sources only. Doxygen # will parse them like normal C++ but will assume all classes use public instead # of private inheritance when no explicit protection keyword is present. # The default value is: NO. SIP_SUPPORT = NO # For Microsoft's IDL there are propget and propput attributes to indicate # getter and setter methods for a property. Setting this option to YES will make # doxygen to replace the get and set methods by a property in the documentation. # This will only work if the methods are indeed getting or setting a simple # type. If this is not the case, or you want to show the methods anyway, you # should set this option to NO. # The default value is: YES. IDL_PROPERTY_SUPPORT = YES # If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC # tag is set to YES then doxygen will reuse the documentation of the first # member in the group (if any) for the other members of the group. By default # all members of a group must be documented explicitly. # The default value is: NO. DISTRIBUTE_GROUP_DOC = NO # If one adds a struct or class to a group and this option is enabled, then also # any nested class or struct is added to the same group. By default this option # is disabled and one has to add nested compounds explicitly via \ingroup. # The default value is: NO. GROUP_NESTED_COMPOUNDS = NO # Set the SUBGROUPING tag to YES to allow class member groups of the same type # (for instance a group of public functions) to be put as a subgroup of that # type (e.g. under the Public Functions section). Set it to NO to prevent # subgrouping. Alternatively, this can be done per class using the # \nosubgrouping command. # The default value is: YES. SUBGROUPING = YES # When the INLINE_GROUPED_CLASSES tag is set to YES, classes, structs and unions # are shown inside the group in which they are included (e.g. using \ingroup) # instead of on a separate page (for HTML and Man pages) or section (for LaTeX # and RTF). # # Note that this feature does not work in combination with # SEPARATE_MEMBER_PAGES. # The default value is: NO. INLINE_GROUPED_CLASSES = NO # When the INLINE_SIMPLE_STRUCTS tag is set to YES, structs, classes, and unions # with only public data fields or simple typedef fields will be shown inline in # the documentation of the scope in which they are defined (i.e. file, # namespace, or group documentation), provided this scope is documented. If set # to NO, structs, classes, and unions are shown on a separate page (for HTML and # Man pages) or section (for LaTeX and RTF). # The default value is: NO. INLINE_SIMPLE_STRUCTS = NO # When TYPEDEF_HIDES_STRUCT tag is enabled, a typedef of a struct, union, or # enum is documented as struct, union, or enum with the name of the typedef. So # typedef struct TypeS {} TypeT, will appear in the documentation as a struct # with name TypeT. When disabled the typedef will appear as a member of a file, # namespace, or class. And the struct will be named TypeS. This can typically be # useful for C code in case the coding convention dictates that all compound # types are typedef'ed and only the typedef is referenced, never the tag name. # The default value is: NO. TYPEDEF_HIDES_STRUCT = NO # The size of the symbol lookup cache can be set using LOOKUP_CACHE_SIZE. This # cache is used to resolve symbols given their name and scope. Since this can be # an expensive process and often the same symbol appears multiple times in the # code, doxygen keeps a cache of pre-resolved symbols. If the cache is too small # doxygen will become slower. If the cache is too large, memory is wasted. The # cache size is given by this formula: 2^(16+LOOKUP_CACHE_SIZE). The valid range # is 0..9, the default is 0, corresponding to a cache size of 2^16=65536 # symbols. At the end of a run doxygen will report the cache usage and suggest # the optimal cache size from a speed point of view. # Minimum value: 0, maximum value: 9, default value: 0. LOOKUP_CACHE_SIZE = 0 # The NUM_PROC_THREADS specifies the number of threads doxygen is allowed to use # during processing. When set to 0 doxygen will based this on the number of # cores available in the system. You can set it explicitly to a value larger # than 0 to get more control over the balance between CPU load and processing # speed. At this moment only the input processing can be done using multiple # threads. Since this is still an experimental feature the default is set to 1, # which effectively disables parallel processing. Please report any issues you # encounter. Generating dot graphs in parallel is controlled by the # DOT_NUM_THREADS setting. # Minimum value: 0, maximum value: 32, default value: 1. NUM_PROC_THREADS = 1 #--------------------------------------------------------------------------- # Build related configuration options #--------------------------------------------------------------------------- # If the EXTRACT_ALL tag is set to YES, doxygen will assume all entities in # documentation are documented, even if no documentation was available. Private # class members and static file members will be hidden unless the # EXTRACT_PRIVATE respectively EXTRACT_STATIC tags are set to YES. # Note: This will also disable the warnings about undocumented members that are # normally produced when WARNINGS is set to YES. # The default value is: NO. EXTRACT_ALL = YES # If the EXTRACT_PRIVATE tag is set to YES, all private members of a class will # be included in the documentation. # The default value is: NO. EXTRACT_PRIVATE = NO # If the EXTRACT_PRIV_VIRTUAL tag is set to YES, documented private virtual # methods of a class will be included in the documentation. # The default value is: NO. EXTRACT_PRIV_VIRTUAL = NO # If the EXTRACT_PACKAGE tag is set to YES, all members with package or internal # scope will be included in the documentation. # The default value is: NO. EXTRACT_PACKAGE = NO # If the EXTRACT_STATIC tag is set to YES, all static members of a file will be # included in the documentation. # The default value is: NO. EXTRACT_STATIC = NO # If the EXTRACT_LOCAL_CLASSES tag is set to YES, classes (and structs) defined # locally in source files will be included in the documentation. If set to NO, # only classes defined in header files are included. Does not have any effect # for Java sources. # The default value is: YES. EXTRACT_LOCAL_CLASSES = NO # This flag is only useful for Objective-C code. If set to YES, local methods, # which are defined in the implementation section but not in the interface are # included in the documentation. If set to NO, only methods in the interface are # included. # The default value is: NO. EXTRACT_LOCAL_METHODS = NO # If this flag is set to YES, the members of anonymous namespaces will be # extracted and appear in the documentation as a namespace called # 'anonymous_namespace{file}', where file will be replaced with the base name of # the file that contains the anonymous namespace. By default anonymous namespace # are hidden. # The default value is: NO. EXTRACT_ANON_NSPACES = NO # If this flag is set to YES, the name of an unnamed parameter in a declaration # will be determined by the corresponding definition. By default unnamed # parameters remain unnamed in the output. # The default value is: YES. RESOLVE_UNNAMED_PARAMS = YES # If the HIDE_UNDOC_MEMBERS tag is set to YES, doxygen will hide all # undocumented members inside documented classes or files. If set to NO these # members will be included in the various overviews, but no documentation # section is generated. This option has no effect if EXTRACT_ALL is enabled. # The default value is: NO. HIDE_UNDOC_MEMBERS = YES # If the HIDE_UNDOC_CLASSES tag is set to YES, doxygen will hide all # undocumented classes that are normally visible in the class hierarchy. If set # to NO, these classes will be included in the various overviews. This option # has no effect if EXTRACT_ALL is enabled. # The default value is: NO. HIDE_UNDOC_CLASSES = YES # If the HIDE_FRIEND_COMPOUNDS tag is set to YES, doxygen will hide all friend # declarations. If set to NO, these declarations will be included in the # documentation. # The default value is: NO. HIDE_FRIEND_COMPOUNDS = NO # If the HIDE_IN_BODY_DOCS tag is set to YES, doxygen will hide any # documentation blocks found inside the body of a function. If set to NO, these # blocks will be appended to the function's detailed documentation block. # The default value is: NO. HIDE_IN_BODY_DOCS = NO # The INTERNAL_DOCS tag determines if documentation that is typed after a # \internal command is included. If the tag is set to NO then the documentation # will be excluded. Set it to YES to include the internal documentation. # The default value is: NO. INTERNAL_DOCS = NO # With the correct setting of option CASE_SENSE_NAMES doxygen will better be # able to match the capabilities of the underlying filesystem. In case the # filesystem is case sensitive (i.e. it supports files in the same directory # whose names only differ in casing), the option must be set to YES to properly # deal with such files in case they appear in the input. For filesystems that # are not case sensitive the option should be set to NO to properly deal with # output files written for symbols that only differ in casing, such as for two # classes, one named CLASS and the other named Class, and to also support # references to files without having to specify the exact matching casing. On # Windows (including Cygwin) and MacOS, users should typically set this option # to NO, whereas on Linux or other Unix flavors it should typically be set to # YES. # Possible values are: SYSTEM, NO and YES. # The default value is: SYSTEM. CASE_SENSE_NAMES = YES # If the HIDE_SCOPE_NAMES tag is set to NO then doxygen will show members with # their full class and namespace scopes in the documentation. If set to YES, the # scope will be hidden. # The default value is: NO. HIDE_SCOPE_NAMES = YES # If the HIDE_COMPOUND_REFERENCE tag is set to NO (default) then doxygen will # append additional text to a page's title, such as Class Reference. If set to # YES the compound reference will be hidden. # The default value is: NO. HIDE_COMPOUND_REFERENCE= NO # If the SHOW_HEADERFILE tag is set to YES then the documentation for a class # will show which file needs to be included to use the class. # The default value is: YES. SHOW_HEADERFILE = YES # If the SHOW_INCLUDE_FILES tag is set to YES then doxygen will put a list of # the files that are included by a file in the documentation of that file. # The default value is: YES. SHOW_INCLUDE_FILES = NO # If the SHOW_GROUPED_MEMB_INC tag is set to YES then Doxygen will add for each # grouped member an include statement to the documentation, telling the reader # which file to include in order to use the member. # The default value is: NO. SHOW_GROUPED_MEMB_INC = NO # If the FORCE_LOCAL_INCLUDES tag is set to YES then doxygen will list include # files with double quotes in the documentation rather than with sharp brackets. # The default value is: NO. FORCE_LOCAL_INCLUDES = NO # If the INLINE_INFO tag is set to YES then a tag [inline] is inserted in the # documentation for inline members. # The default value is: YES. INLINE_INFO = YES # If the SORT_MEMBER_DOCS tag is set to YES then doxygen will sort the # (detailed) documentation of file and class members alphabetically by member # name. If set to NO, the members will appear in declaration order. # The default value is: YES. SORT_MEMBER_DOCS = YES # If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the brief # descriptions of file, namespace and class members alphabetically by member # name. If set to NO, the members will appear in declaration order. Note that # this will also influence the order of the classes in the class list. # The default value is: NO. SORT_BRIEF_DOCS = NO # If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen will sort the # (brief and detailed) documentation of class members so that constructors and # destructors are listed first. If set to NO the constructors will appear in the # respective orders defined by SORT_BRIEF_DOCS and SORT_MEMBER_DOCS. # Note: If SORT_BRIEF_DOCS is set to NO this option is ignored for sorting brief # member documentation. # Note: If SORT_MEMBER_DOCS is set to NO this option is ignored for sorting # detailed member documentation. # The default value is: NO. SORT_MEMBERS_CTORS_1ST = NO # If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the hierarchy # of group names into alphabetical order. If set to NO the group names will # appear in their defined order. # The default value is: NO. SORT_GROUP_NAMES = NO # If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be sorted by # fully-qualified names, including namespaces. If set to NO, the class list will # be sorted only by class name, not including the namespace part. # Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. # Note: This option applies only to the class list, not to the alphabetical # list. # The default value is: NO. SORT_BY_SCOPE_NAME = NO # If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to do proper # type resolution of all parameters of a function it will reject a match between # the prototype and the implementation of a member function even if there is # only one candidate or it is obvious which candidate to choose by doing a # simple string match. By disabling STRICT_PROTO_MATCHING doxygen will still # accept a match between prototype and implementation in such cases. # The default value is: NO. STRICT_PROTO_MATCHING = NO # The GENERATE_TODOLIST tag can be used to enable (YES) or disable (NO) the todo # list. This list is created by putting \todo commands in the documentation. # The default value is: YES. GENERATE_TODOLIST = YES # The GENERATE_TESTLIST tag can be used to enable (YES) or disable (NO) the test # list. This list is created by putting \test commands in the documentation. # The default value is: YES. GENERATE_TESTLIST = YES # The GENERATE_BUGLIST tag can be used to enable (YES) or disable (NO) the bug # list. This list is created by putting \bug commands in the documentation. # The default value is: YES. GENERATE_BUGLIST = YES # The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or disable (NO) # the deprecated list. This list is created by putting \deprecated commands in # the documentation. # The default value is: YES. GENERATE_DEPRECATEDLIST= YES # The ENABLED_SECTIONS tag can be used to enable conditional documentation # sections, marked by \if ... \endif and \cond # ... \endcond blocks. ENABLED_SECTIONS = # The MAX_INITIALIZER_LINES tag determines the maximum number of lines that the # initial value of a variable or macro / define can have for it to appear in the # documentation. If the initializer consists of more lines than specified here # it will be hidden. Use a value of 0 to hide initializers completely. The # appearance of the value of individual variables and macros / defines can be # controlled using \showinitializer or \hideinitializer command in the # documentation regardless of this setting. # Minimum value: 0, maximum value: 10000, default value: 30. MAX_INITIALIZER_LINES = 30 # Set the SHOW_USED_FILES tag to NO to disable the list of files generated at # the bottom of the documentation of classes and structs. If set to YES, the # list will mention the files that were used to generate the documentation. # The default value is: YES. SHOW_USED_FILES = YES # Set the SHOW_FILES tag to NO to disable the generation of the Files page. This # will remove the Files entry from the Quick Index and from the Folder Tree View # (if specified). # The default value is: YES. SHOW_FILES = YES # Set the SHOW_NAMESPACES tag to NO to disable the generation of the Namespaces # page. This will remove the Namespaces entry from the Quick Index and from the # Folder Tree View (if specified). # The default value is: YES. SHOW_NAMESPACES = YES # The FILE_VERSION_FILTER tag can be used to specify a program or script that # doxygen should invoke to get the current version for each file (typically from # the version control system). Doxygen will invoke the program by executing (via # popen()) the command command input-file, where command is the value of the # FILE_VERSION_FILTER tag, and input-file is the name of an input file provided # by doxygen. Whatever the program writes to standard output is used as the file # version. For an example see the documentation. FILE_VERSION_FILTER = # The LAYOUT_FILE tag can be used to specify a layout file which will be parsed # by doxygen. The layout file controls the global structure of the generated # output files in an output format independent way. To create the layout file # that represents doxygen's defaults, run doxygen with the -l option. You can # optionally specify a file name after the option, if omitted DoxygenLayout.xml # will be used as the name of the layout file. See also section "Changing the # layout of pages" for information. # # Note that if you run doxygen from a directory containing a file called # DoxygenLayout.xml, doxygen will parse it automatically even if the LAYOUT_FILE # tag is left empty. LAYOUT_FILE = # The CITE_BIB_FILES tag can be used to specify one or more bib files containing # the reference definitions. This must be a list of .bib files. The .bib # extension is automatically appended if omitted. This requires the bibtex tool # to be installed. See also https://en.wikipedia.org/wiki/BibTeX for more info. # For LaTeX the style of the bibliography can be controlled using # LATEX_BIB_STYLE. To use this feature you need bibtex and perl available in the # search path. See also \cite for info how to create references. CITE_BIB_FILES = #--------------------------------------------------------------------------- # Configuration options related to warning and progress messages #--------------------------------------------------------------------------- # The QUIET tag can be used to turn on/off the messages that are generated to # standard output by doxygen. If QUIET is set to YES this implies that the # messages are off. # The default value is: NO. QUIET = NO # The WARNINGS tag can be used to turn on/off the warning messages that are # generated to standard error (stderr) by doxygen. If WARNINGS is set to YES # this implies that the warnings are on. # # Tip: Turn warnings on while writing the documentation. # The default value is: YES. WARNINGS = YES # If the WARN_IF_UNDOCUMENTED tag is set to YES then doxygen will generate # warnings for undocumented members. If EXTRACT_ALL is set to YES then this flag # will automatically be disabled. # The default value is: YES. WARN_IF_UNDOCUMENTED = YES # If the WARN_IF_DOC_ERROR tag is set to YES, doxygen will generate warnings for # potential errors in the documentation, such as documenting some parameters in # a documented function twice, or documenting parameters that don't exist or # using markup commands wrongly. # The default value is: YES. WARN_IF_DOC_ERROR = YES # If WARN_IF_INCOMPLETE_DOC is set to YES, doxygen will warn about incomplete # function parameter documentation. If set to NO, doxygen will accept that some # parameters have no documentation without warning. # The default value is: YES. WARN_IF_INCOMPLETE_DOC = YES # This WARN_NO_PARAMDOC option can be enabled to get warnings for functions that # are documented, but have no documentation for their parameters or return # value. If set to NO, doxygen will only warn about wrong parameter # documentation, but not about the absence of documentation. If EXTRACT_ALL is # set to YES then this flag will automatically be disabled. See also # WARN_IF_INCOMPLETE_DOC # The default value is: NO. WARN_NO_PARAMDOC = NO # If the WARN_AS_ERROR tag is set to YES then doxygen will immediately stop when # a warning is encountered. If the WARN_AS_ERROR tag is set to FAIL_ON_WARNINGS # then doxygen will continue running as if WARN_AS_ERROR tag is set to NO, but # at the end of the doxygen process doxygen will return with a non-zero status. # Possible values are: NO, YES and FAIL_ON_WARNINGS. # The default value is: NO. WARN_AS_ERROR = NO # The WARN_FORMAT tag determines the format of the warning messages that doxygen # can produce. The string should contain the $file, $line, and $text tags, which # will be replaced by the file and line number from which the warning originated # and the warning text. Optionally the format may contain $version, which will # be replaced by the version of the file (if it could be obtained via # FILE_VERSION_FILTER) # See also: WARN_LINE_FORMAT # The default value is: $file:$line: $text. WARN_FORMAT = "$file:$line: $text" # In the $text part of the WARN_FORMAT command it is possible that a reference # to a more specific place is given. To make it easier to jump to this place # (outside of doxygen) the user can define a custom "cut" / "paste" string. # Example: # WARN_LINE_FORMAT = "'vi $file +$line'" # See also: WARN_FORMAT # The default value is: at line $line of file $file. WARN_LINE_FORMAT = "at line $line of file $file" # The WARN_LOGFILE tag can be used to specify a file to which warning and error # messages should be written. If left blank the output is written to standard # error (stderr). In case the file specified cannot be opened for writing the # warning and error messages are written to standard error. When as file - is # specified the warning and error messages are written to standard output # (stdout). WARN_LOGFILE = #--------------------------------------------------------------------------- # Configuration options related to the input files #--------------------------------------------------------------------------- # The INPUT tag is used to specify the files and/or directories that contain # documented source files. You may enter file names like myfile.cpp or # directories like /usr/src/myproject. Separate the files or directories with # spaces. See also FILE_PATTERNS and EXTENSION_MAPPING # Note: If this tag is empty the current directory is searched. INPUT = \ ../../struct_mv/HYPRE_struct_mv.h \ ../../sstruct_mv/HYPRE_sstruct_mv.h \ ../../IJ_mv/HYPRE_IJ_mv.h \ ../../struct_ls/HYPRE_struct_ls.h \ ../../sstruct_ls/HYPRE_sstruct_ls.h \ ../../parcsr_ls/HYPRE_parcsr_ls.h \ ../../krylov/HYPRE_krylov.h \ ../../krylov/HYPRE_lobpcg.h # This tag can be used to specify the character encoding of the source files # that doxygen parses. Internally doxygen uses the UTF-8 encoding. Doxygen uses # libiconv (or the iconv built into libc) for the transcoding. See the libiconv # documentation (see: # https://www.gnu.org/software/libiconv/) for the list of possible encodings. # See also: INPUT_FILE_ENCODING # The default value is: UTF-8. INPUT_ENCODING = UTF-8 # This tag can be used to specify the character encoding of the source files # that doxygen parses The INPUT_FILE_ENCODING tag can be used to specify # character encoding on a per file pattern basis. Doxygen will compare the file # name with each pattern and apply the encoding instead of the default # INPUT_ENCODING) if there is a match. The character encodings are a list of the # form: pattern=encoding (like *.php=ISO-8859-1). See cfg_input_encoding # "INPUT_ENCODING" for further information on supported encodings. INPUT_FILE_ENCODING = # If the value of the INPUT tag contains directories, you can use the # FILE_PATTERNS tag to specify one or more wildcard patterns (like *.cpp and # *.h) to filter out the source-files in the directories. # # Note that for custom extensions or not directly supported extensions you also # need to set EXTENSION_MAPPING for the extension otherwise the files are not # read by doxygen. # # Note the list of default checked file patterns might differ from the list of # default file extension mappings. # # If left blank the following patterns are tested:*.c, *.cc, *.cxx, *.cpp, # *.c++, *.java, *.ii, *.ixx, *.ipp, *.i++, *.inl, *.idl, *.ddl, *.odl, *.h, # *.hh, *.hxx, *.hpp, *.h++, *.l, *.cs, *.d, *.php, *.php4, *.php5, *.phtml, # *.inc, *.m, *.markdown, *.md, *.mm, *.dox (to be provided as doxygen C # comment), *.py, *.pyw, *.f90, *.f95, *.f03, *.f08, *.f18, *.f, *.for, *.vhd, # *.vhdl, *.ucf, *.qsf and *.ice. FILE_PATTERNS = HYPRE*.h # The RECURSIVE tag can be used to specify whether or not subdirectories should # be searched for input files as well. # The default value is: NO. RECURSIVE = YES # The EXCLUDE tag can be used to specify files and/or directories that should be # excluded from the INPUT source files. This way you can easily exclude a # subdirectory from a directory tree whose root is specified with the INPUT tag. # # Note that relative paths are relative to the directory from which doxygen is # run. EXCLUDE = # The EXCLUDE_SYMLINKS tag can be used to select whether or not files or # directories that are symbolic links (a Unix file system feature) are excluded # from the input. # The default value is: NO. EXCLUDE_SYMLINKS = YES # If the value of the INPUT tag contains directories, you can use the # EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude # certain files from those directories. # # Note that the wildcards are matched against the file with absolute path, so to # exclude all test directories for example use the pattern */test/* EXCLUDE_PATTERNS = # The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names # (namespaces, classes, functions, etc.) that should be excluded from the # output. The symbol name can be a fully qualified name, a word, or if the # wildcard * is used, a substring. Examples: ANamespace, AClass, # ANamespace::AClass, ANamespace::*Test # # Note that the wildcards are matched against the file with absolute path, so to # exclude all test directories use the pattern */test/* EXCLUDE_SYMBOLS = # The EXAMPLE_PATH tag can be used to specify one or more files or directories # that contain example code fragments that are included (see the \include # command). EXAMPLE_PATH = # If the value of the EXAMPLE_PATH tag contains directories, you can use the # EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp and # *.h) to filter out the source-files in the directories. If left blank all # files are included. EXAMPLE_PATTERNS = # If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be # searched for input files to be used with the \include or \dontinclude commands # irrespective of the value of the RECURSIVE tag. # The default value is: NO. EXAMPLE_RECURSIVE = NO # The IMAGE_PATH tag can be used to specify one or more files or directories # that contain images that are to be included in the documentation (see the # \image command). IMAGE_PATH = # The INPUT_FILTER tag can be used to specify a program that doxygen should # invoke to filter for each input file. Doxygen will invoke the filter program # by executing (via popen()) the command: # # # # where is the value of the INPUT_FILTER tag, and is the # name of an input file. Doxygen will then use the output that the filter # program writes to standard output. If FILTER_PATTERNS is specified, this tag # will be ignored. # # Note that the filter must not add or remove lines; it is applied before the # code is scanned, but not when the output code is generated. If lines are added # or removed, the anchors will not be placed correctly. # # Note that doxygen will use the data processed and written to standard output # for further processing, therefore nothing else, like debug statements or used # commands (so in case of a Windows batch file always use @echo OFF), should be # written to standard output. # # Note that for custom extensions or not directly supported extensions you also # need to set EXTENSION_MAPPING for the extension otherwise the files are not # properly processed by doxygen. INPUT_FILTER = # The FILTER_PATTERNS tag can be used to specify filters on a per file pattern # basis. Doxygen will compare the file name with each pattern and apply the # filter if there is a match. The filters are a list of the form: pattern=filter # (like *.cpp=my_cpp_filter). See INPUT_FILTER for further information on how # filters are used. If the FILTER_PATTERNS tag is empty or if none of the # patterns match the file name, INPUT_FILTER is applied. # # Note that for custom extensions or not directly supported extensions you also # need to set EXTENSION_MAPPING for the extension otherwise the files are not # properly processed by doxygen. FILTER_PATTERNS = # If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using # INPUT_FILTER) will also be used to filter the input files that are used for # producing the source files to browse (i.e. when SOURCE_BROWSER is set to YES). # The default value is: NO. FILTER_SOURCE_FILES = NO # The FILTER_SOURCE_PATTERNS tag can be used to specify source filters per file # pattern. A pattern will override the setting for FILTER_PATTERN (if any) and # it is also possible to disable source filtering for a specific pattern using # *.ext= (so without naming a filter). # This tag requires that the tag FILTER_SOURCE_FILES is set to YES. FILTER_SOURCE_PATTERNS = # If the USE_MDFILE_AS_MAINPAGE tag refers to the name of a markdown file that # is part of the input, its contents will be placed on the main page # (index.html). This can be useful if you have a project on for instance GitHub # and want to reuse the introduction page also for the doxygen output. USE_MDFILE_AS_MAINPAGE = # The Fortran standard specifies that for fixed formatted Fortran code all # characters from position 72 are to be considered as comment. A common # extension is to allow longer lines before the automatic comment starts. The # setting FORTRAN_COMMENT_AFTER will also make it possible that longer lines can # be processed before the automatic comment starts. # Minimum value: 7, maximum value: 10000, default value: 72. FORTRAN_COMMENT_AFTER = 72 #--------------------------------------------------------------------------- # Configuration options related to source browsing #--------------------------------------------------------------------------- # If the SOURCE_BROWSER tag is set to YES then a list of source files will be # generated. Documented entities will be cross-referenced with these sources. # # Note: To get rid of all source code in the generated output, make sure that # also VERBATIM_HEADERS is set to NO. # The default value is: NO. SOURCE_BROWSER = NO # Setting the INLINE_SOURCES tag to YES will include the body of functions, # classes and enums directly into the documentation. # The default value is: NO. INLINE_SOURCES = NO # Setting the STRIP_CODE_COMMENTS tag to YES will instruct doxygen to hide any # special comment blocks from generated source code fragments. Normal C, C++ and # Fortran comments will always remain visible. # The default value is: YES. STRIP_CODE_COMMENTS = YES # If the REFERENCED_BY_RELATION tag is set to YES then for each documented # entity all documented functions referencing it will be listed. # The default value is: NO. REFERENCED_BY_RELATION = NO # If the REFERENCES_RELATION tag is set to YES then for each documented function # all documented entities called/used by that function will be listed. # The default value is: NO. REFERENCES_RELATION = NO # If the REFERENCES_LINK_SOURCE tag is set to YES and SOURCE_BROWSER tag is set # to YES then the hyperlinks from functions in REFERENCES_RELATION and # REFERENCED_BY_RELATION lists will link to the source code. Otherwise they will # link to the documentation. # The default value is: YES. REFERENCES_LINK_SOURCE = NO # If SOURCE_TOOLTIPS is enabled (the default) then hovering a hyperlink in the # source code will show a tooltip with additional information such as prototype, # brief description and links to the definition and documentation. Since this # will make the HTML file larger and loading of large files a bit slower, you # can opt to disable this feature. # The default value is: YES. # This tag requires that the tag SOURCE_BROWSER is set to YES. SOURCE_TOOLTIPS = YES # If the USE_HTAGS tag is set to YES then the references to source code will # point to the HTML generated by the htags(1) tool instead of doxygen built-in # source browser. The htags tool is part of GNU's global source tagging system # (see https://www.gnu.org/software/global/global.html). You will need version # 4.8.6 or higher. # # To use it do the following: # - Install the latest version of global # - Enable SOURCE_BROWSER and USE_HTAGS in the configuration file # - Make sure the INPUT points to the root of the source tree # - Run doxygen as normal # # Doxygen will invoke htags (and that will in turn invoke gtags), so these # tools must be available from the command line (i.e. in the search path). # # The result: instead of the source browser generated by doxygen, the links to # source code will now point to the output of htags. # The default value is: NO. # This tag requires that the tag SOURCE_BROWSER is set to YES. USE_HTAGS = NO # If the VERBATIM_HEADERS tag is set the YES then doxygen will generate a # verbatim copy of the header file for each class for which an include is # specified. Set to NO to disable this. # See also: Section \class. # The default value is: YES. VERBATIM_HEADERS = NO #--------------------------------------------------------------------------- # Configuration options related to the alphabetical class index #--------------------------------------------------------------------------- # If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index of all # compounds will be generated. Enable this if the project contains a lot of # classes, structs, unions or interfaces. # The default value is: YES. ALPHABETICAL_INDEX = YES # In case all classes in a project start with a common prefix, all classes will # be put under the same header in the alphabetical index. The IGNORE_PREFIX tag # can be used to specify a prefix (or a list of prefixes) that should be ignored # while generating the index headers. # This tag requires that the tag ALPHABETICAL_INDEX is set to YES. IGNORE_PREFIX = #--------------------------------------------------------------------------- # Configuration options related to the HTML output #--------------------------------------------------------------------------- # If the GENERATE_HTML tag is set to YES, doxygen will generate HTML output # The default value is: YES. GENERATE_HTML = YES # The HTML_OUTPUT tag is used to specify where the HTML docs will be put. If a # relative path is entered the value of OUTPUT_DIRECTORY will be put in front of # it. # The default directory is: html. # This tag requires that the tag GENERATE_HTML is set to YES. HTML_OUTPUT = html # The HTML_FILE_EXTENSION tag can be used to specify the file extension for each # generated HTML page (for example: .htm, .php, .asp). # The default value is: .html. # This tag requires that the tag GENERATE_HTML is set to YES. HTML_FILE_EXTENSION = .html # The HTML_HEADER tag can be used to specify a user-defined HTML header file for # each generated HTML page. If the tag is left blank doxygen will generate a # standard header. # # To get valid HTML the header file that includes any scripts and style sheets # that doxygen needs, which is dependent on the configuration options used (e.g. # the setting GENERATE_TREEVIEW). It is highly recommended to start with a # default header using # doxygen -w html new_header.html new_footer.html new_stylesheet.css # YourConfigFile # and then modify the file new_header.html. See also section "Doxygen usage" # for information on how to generate the default header that doxygen normally # uses. # Note: The header is subject to change so you typically have to regenerate the # default header when upgrading to a newer version of doxygen. For a description # of the possible markers and block names see the documentation. # This tag requires that the tag GENERATE_HTML is set to YES. HTML_HEADER = # The HTML_FOOTER tag can be used to specify a user-defined HTML footer for each # generated HTML page. If the tag is left blank doxygen will generate a standard # footer. See HTML_HEADER for more information on how to generate a default # footer and what special commands can be used inside the footer. See also # section "Doxygen usage" for information on how to generate the default footer # that doxygen normally uses. # This tag requires that the tag GENERATE_HTML is set to YES. HTML_FOOTER = # The HTML_STYLESHEET tag can be used to specify a user-defined cascading style # sheet that is used by each HTML page. It can be used to fine-tune the look of # the HTML output. If left blank doxygen will generate a default style sheet. # See also section "Doxygen usage" for information on how to generate the style # sheet that doxygen normally uses. # Note: It is recommended to use HTML_EXTRA_STYLESHEET instead of this tag, as # it is more robust and this tag (HTML_STYLESHEET) will in the future become # obsolete. # This tag requires that the tag GENERATE_HTML is set to YES. HTML_STYLESHEET = # The HTML_EXTRA_STYLESHEET tag can be used to specify additional user-defined # cascading style sheets that are included after the standard style sheets # created by doxygen. Using this option one can overrule certain style aspects. # This is preferred over using HTML_STYLESHEET since it does not replace the # standard style sheet and is therefore more robust against future updates. # Doxygen will copy the style sheet files to the output directory. # Note: The order of the extra style sheet files is of importance (e.g. the last # style sheet in the list overrules the setting of the previous ones in the # list). For an example see the documentation. # This tag requires that the tag GENERATE_HTML is set to YES. HTML_EXTRA_STYLESHEET = # The HTML_EXTRA_FILES tag can be used to specify one or more extra images or # other source files which should be copied to the HTML output directory. Note # that these files will be copied to the base HTML output directory. Use the # $relpath^ marker in the HTML_HEADER and/or HTML_FOOTER files to load these # files. In the HTML_STYLESHEET file, use the file name only. Also note that the # files will be copied as-is; there are no commands or markers available. # This tag requires that the tag GENERATE_HTML is set to YES. HTML_EXTRA_FILES = # The HTML_COLORSTYLE tag can be used to specify if the generated HTML output # should be rendered with a dark or light theme. Default setting AUTO_LIGHT # enables light output unless the user preference is dark output. Other options # are DARK to always use dark mode, LIGHT to always use light mode, AUTO_DARK to # default to dark mode unless the user prefers light mode, and TOGGLE to let the # user toggle between dark and light mode via a button. # Possible values are: LIGHT Always generate light output., DARK Always generate # dark output., AUTO_LIGHT Automatically set the mode according to the user # preference, use light mode if no preference is set (the default)., AUTO_DARK # Automatically set the mode according to the user preference, use dark mode if # no preference is set. and TOGGLE Allow to user to switch between light and # dark mode via a button.. # The default value is: AUTO_LIGHT. # This tag requires that the tag GENERATE_HTML is set to YES. HTML_COLORSTYLE = AUTO_LIGHT # The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. Doxygen # will adjust the colors in the style sheet and background images according to # this color. Hue is specified as an angle on a color-wheel, see # https://en.wikipedia.org/wiki/Hue for more information. For instance the value # 0 represents red, 60 is yellow, 120 is green, 180 is cyan, 240 is blue, 300 # purple, and 360 is red again. # Minimum value: 0, maximum value: 359, default value: 220. # This tag requires that the tag GENERATE_HTML is set to YES. HTML_COLORSTYLE_HUE = 220 # The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of the colors # in the HTML output. For a value of 0 the output will use gray-scales only. A # value of 255 will produce the most vivid colors. # Minimum value: 0, maximum value: 255, default value: 100. # This tag requires that the tag GENERATE_HTML is set to YES. HTML_COLORSTYLE_SAT = 100 # The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to the # luminance component of the colors in the HTML output. Values below 100 # gradually make the output lighter, whereas values above 100 make the output # darker. The value divided by 100 is the actual gamma applied, so 80 represents # a gamma of 0.8, The value 220 represents a gamma of 2.2, and 100 does not # change the gamma. # Minimum value: 40, maximum value: 240, default value: 80. # This tag requires that the tag GENERATE_HTML is set to YES. HTML_COLORSTYLE_GAMMA = 80 # If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML # page will contain the date and time when the page was generated. Setting this # to YES can help to show when doxygen was last run and thus if the # documentation is up to date. # The default value is: NO. # This tag requires that the tag GENERATE_HTML is set to YES. HTML_TIMESTAMP = NO # If the HTML_DYNAMIC_MENUS tag is set to YES then the generated HTML # documentation will contain a main index with vertical navigation menus that # are dynamically created via JavaScript. If disabled, the navigation index will # consists of multiple levels of tabs that are statically embedded in every HTML # page. Disable this option to support browsers that do not have JavaScript, # like the Qt help browser. # The default value is: YES. # This tag requires that the tag GENERATE_HTML is set to YES. HTML_DYNAMIC_MENUS = YES # If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML # documentation will contain sections that can be hidden and shown after the # page has loaded. # The default value is: NO. # This tag requires that the tag GENERATE_HTML is set to YES. HTML_DYNAMIC_SECTIONS = NO # With HTML_INDEX_NUM_ENTRIES one can control the preferred number of entries # shown in the various tree structured indices initially; the user can expand # and collapse entries dynamically later on. Doxygen will expand the tree to # such a level that at most the specified number of entries are visible (unless # a fully collapsed tree already exceeds this amount). So setting the number of # entries 1 will produce a full collapsed tree by default. 0 is a special value # representing an infinite number of entries and will result in a full expanded # tree by default. # Minimum value: 0, maximum value: 9999, default value: 100. # This tag requires that the tag GENERATE_HTML is set to YES. HTML_INDEX_NUM_ENTRIES = 100 # If the GENERATE_DOCSET tag is set to YES, additional index files will be # generated that can be used as input for Apple's Xcode 3 integrated development # environment (see: # https://developer.apple.com/xcode/), introduced with OSX 10.5 (Leopard). To # create a documentation set, doxygen will generate a Makefile in the HTML # output directory. Running make will produce the docset in that directory and # running make install will install the docset in # ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find it at # startup. See https://developer.apple.com/library/archive/featuredarticles/Doxy # genXcode/_index.html for more information. # The default value is: NO. # This tag requires that the tag GENERATE_HTML is set to YES. GENERATE_DOCSET = NO # This tag determines the name of the docset feed. A documentation feed provides # an umbrella under which multiple documentation sets from a single provider # (such as a company or product suite) can be grouped. # The default value is: Doxygen generated docs. # This tag requires that the tag GENERATE_DOCSET is set to YES. DOCSET_FEEDNAME = "Doxygen generated docs" # This tag determines the URL of the docset feed. A documentation feed provides # an umbrella under which multiple documentation sets from a single provider # (such as a company or product suite) can be grouped. # This tag requires that the tag GENERATE_DOCSET is set to YES. DOCSET_FEEDURL = # This tag specifies a string that should uniquely identify the documentation # set bundle. This should be a reverse domain-name style string, e.g. # com.mycompany.MyDocSet. Doxygen will append .docset to the name. # The default value is: org.doxygen.Project. # This tag requires that the tag GENERATE_DOCSET is set to YES. DOCSET_BUNDLE_ID = org.doxygen.Project # The DOCSET_PUBLISHER_ID tag specifies a string that should uniquely identify # the documentation publisher. This should be a reverse domain-name style # string, e.g. com.mycompany.MyDocSet.documentation. # The default value is: org.doxygen.Publisher. # This tag requires that the tag GENERATE_DOCSET is set to YES. DOCSET_PUBLISHER_ID = org.doxygen.Publisher # The DOCSET_PUBLISHER_NAME tag identifies the documentation publisher. # The default value is: Publisher. # This tag requires that the tag GENERATE_DOCSET is set to YES. DOCSET_PUBLISHER_NAME = Publisher # If the GENERATE_HTMLHELP tag is set to YES then doxygen generates three # additional HTML index files: index.hhp, index.hhc, and index.hhk. The # index.hhp is a project file that can be read by Microsoft's HTML Help Workshop # on Windows. In the beginning of 2021 Microsoft took the original page, with # a.o. the download links, offline the HTML help workshop was already many years # in maintenance mode). You can download the HTML help workshop from the web # archives at Installation executable (see: # http://web.archive.org/web/20160201063255/http://download.microsoft.com/downlo # ad/0/A/9/0A939EF6-E31C-430F-A3DF-DFAE7960D564/htmlhelp.exe). # # The HTML Help Workshop contains a compiler that can convert all HTML output # generated by doxygen into a single compiled HTML file (.chm). Compiled HTML # files are now used as the Windows 98 help format, and will replace the old # Windows help format (.hlp) on all Windows platforms in the future. Compressed # HTML files also contain an index, a table of contents, and you can search for # words in the documentation. The HTML workshop also contains a viewer for # compressed HTML files. # The default value is: NO. # This tag requires that the tag GENERATE_HTML is set to YES. GENERATE_HTMLHELP = NO # The CHM_FILE tag can be used to specify the file name of the resulting .chm # file. You can add a path in front of the file if the result should not be # written to the html output directory. # This tag requires that the tag GENERATE_HTMLHELP is set to YES. CHM_FILE = # The HHC_LOCATION tag can be used to specify the location (absolute path # including file name) of the HTML help compiler (hhc.exe). If non-empty, # doxygen will try to run the HTML help compiler on the generated index.hhp. # The file has to be specified with full path. # This tag requires that the tag GENERATE_HTMLHELP is set to YES. HHC_LOCATION = # The GENERATE_CHI flag controls if a separate .chi index file is generated # (YES) or that it should be included in the main .chm file (NO). # The default value is: NO. # This tag requires that the tag GENERATE_HTMLHELP is set to YES. GENERATE_CHI = NO # The CHM_INDEX_ENCODING is used to encode HtmlHelp index (hhk), content (hhc) # and project file content. # This tag requires that the tag GENERATE_HTMLHELP is set to YES. CHM_INDEX_ENCODING = # The BINARY_TOC flag controls whether a binary table of contents is generated # (YES) or a normal table of contents (NO) in the .chm file. Furthermore it # enables the Previous and Next buttons. # The default value is: NO. # This tag requires that the tag GENERATE_HTMLHELP is set to YES. BINARY_TOC = NO # The TOC_EXPAND flag can be set to YES to add extra items for group members to # the table of contents of the HTML help documentation and to the tree view. # The default value is: NO. # This tag requires that the tag GENERATE_HTMLHELP is set to YES. TOC_EXPAND = NO # If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and # QHP_VIRTUAL_FOLDER are set, an additional index file will be generated that # can be used as input for Qt's qhelpgenerator to generate a Qt Compressed Help # (.qch) of the generated HTML documentation. # The default value is: NO. # This tag requires that the tag GENERATE_HTML is set to YES. GENERATE_QHP = NO # If the QHG_LOCATION tag is specified, the QCH_FILE tag can be used to specify # the file name of the resulting .qch file. The path specified is relative to # the HTML output folder. # This tag requires that the tag GENERATE_QHP is set to YES. QCH_FILE = # The QHP_NAMESPACE tag specifies the namespace to use when generating Qt Help # Project output. For more information please see Qt Help Project / Namespace # (see: # https://doc.qt.io/archives/qt-4.8/qthelpproject.html#namespace). # The default value is: org.doxygen.Project. # This tag requires that the tag GENERATE_QHP is set to YES. QHP_NAMESPACE = org.doxygen.Project # The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating Qt # Help Project output. For more information please see Qt Help Project / Virtual # Folders (see: # https://doc.qt.io/archives/qt-4.8/qthelpproject.html#virtual-folders). # The default value is: doc. # This tag requires that the tag GENERATE_QHP is set to YES. QHP_VIRTUAL_FOLDER = doc # If the QHP_CUST_FILTER_NAME tag is set, it specifies the name of a custom # filter to add. For more information please see Qt Help Project / Custom # Filters (see: # https://doc.qt.io/archives/qt-4.8/qthelpproject.html#custom-filters). # This tag requires that the tag GENERATE_QHP is set to YES. QHP_CUST_FILTER_NAME = # The QHP_CUST_FILTER_ATTRS tag specifies the list of the attributes of the # custom filter to add. For more information please see Qt Help Project / Custom # Filters (see: # https://doc.qt.io/archives/qt-4.8/qthelpproject.html#custom-filters). # This tag requires that the tag GENERATE_QHP is set to YES. QHP_CUST_FILTER_ATTRS = # The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this # project's filter section matches. Qt Help Project / Filter Attributes (see: # https://doc.qt.io/archives/qt-4.8/qthelpproject.html#filter-attributes). # This tag requires that the tag GENERATE_QHP is set to YES. QHP_SECT_FILTER_ATTRS = # The QHG_LOCATION tag can be used to specify the location (absolute path # including file name) of Qt's qhelpgenerator. If non-empty doxygen will try to # run qhelpgenerator on the generated .qhp file. # This tag requires that the tag GENERATE_QHP is set to YES. QHG_LOCATION = # If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files will be # generated, together with the HTML files, they form an Eclipse help plugin. To # install this plugin and make it available under the help contents menu in # Eclipse, the contents of the directory containing the HTML and XML files needs # to be copied into the plugins directory of eclipse. The name of the directory # within the plugins directory should be the same as the ECLIPSE_DOC_ID value. # After copying Eclipse needs to be restarted before the help appears. # The default value is: NO. # This tag requires that the tag GENERATE_HTML is set to YES. GENERATE_ECLIPSEHELP = NO # A unique identifier for the Eclipse help plugin. When installing the plugin # the directory name containing the HTML and XML files should also have this # name. Each documentation set should have its own identifier. # The default value is: org.doxygen.Project. # This tag requires that the tag GENERATE_ECLIPSEHELP is set to YES. ECLIPSE_DOC_ID = org.doxygen.Project # If you want full control over the layout of the generated HTML pages it might # be necessary to disable the index and replace it with your own. The # DISABLE_INDEX tag can be used to turn on/off the condensed index (tabs) at top # of each HTML page. A value of NO enables the index and the value YES disables # it. Since the tabs in the index contain the same information as the navigation # tree, you can set this option to YES if you also set GENERATE_TREEVIEW to YES. # The default value is: NO. # This tag requires that the tag GENERATE_HTML is set to YES. DISABLE_INDEX = NO # The GENERATE_TREEVIEW tag is used to specify whether a tree-like index # structure should be generated to display hierarchical information. If the tag # value is set to YES, a side panel will be generated containing a tree-like # index structure (just like the one that is generated for HTML Help). For this # to work a browser that supports JavaScript, DHTML, CSS and frames is required # (i.e. any modern browser). Windows users are probably better off using the # HTML help feature. Via custom style sheets (see HTML_EXTRA_STYLESHEET) one can # further fine tune the look of the index (see "Fine-tuning the output"). As an # example, the default style sheet generated by doxygen has an example that # shows how to put an image at the root of the tree instead of the PROJECT_NAME. # Since the tree basically has the same information as the tab index, you could # consider setting DISABLE_INDEX to YES when enabling this option. # The default value is: NO. # This tag requires that the tag GENERATE_HTML is set to YES. GENERATE_TREEVIEW = NO # When both GENERATE_TREEVIEW and DISABLE_INDEX are set to YES, then the # FULL_SIDEBAR option determines if the side bar is limited to only the treeview # area (value NO) or if it should extend to the full height of the window (value # YES). Setting this to YES gives a layout similar to # https://docs.readthedocs.io with more room for contents, but less room for the # project logo, title, and description. If either GENERATE_TREEVIEW or # DISABLE_INDEX is set to NO, this option has no effect. # The default value is: NO. # This tag requires that the tag GENERATE_HTML is set to YES. FULL_SIDEBAR = NO # The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values that # doxygen will group on one line in the generated HTML documentation. # # Note that a value of 0 will completely suppress the enum values from appearing # in the overview section. # Minimum value: 0, maximum value: 20, default value: 4. # This tag requires that the tag GENERATE_HTML is set to YES. ENUM_VALUES_PER_LINE = 4 # If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be used # to set the initial width (in pixels) of the frame in which the tree is shown. # Minimum value: 0, maximum value: 1500, default value: 250. # This tag requires that the tag GENERATE_HTML is set to YES. TREEVIEW_WIDTH = 250 # If the EXT_LINKS_IN_WINDOW option is set to YES, doxygen will open links to # external symbols imported via tag files in a separate window. # The default value is: NO. # This tag requires that the tag GENERATE_HTML is set to YES. EXT_LINKS_IN_WINDOW = NO # If the OBFUSCATE_EMAILS tag is set to YES, doxygen will obfuscate email # addresses. # The default value is: YES. # This tag requires that the tag GENERATE_HTML is set to YES. OBFUSCATE_EMAILS = YES # If the HTML_FORMULA_FORMAT option is set to svg, doxygen will use the pdf2svg # tool (see https://github.com/dawbarton/pdf2svg) or inkscape (see # https://inkscape.org) to generate formulas as SVG images instead of PNGs for # the HTML output. These images will generally look nicer at scaled resolutions. # Possible values are: png (the default) and svg (looks nicer but requires the # pdf2svg or inkscape tool). # The default value is: png. # This tag requires that the tag GENERATE_HTML is set to YES. HTML_FORMULA_FORMAT = png # Use this tag to change the font size of LaTeX formulas included as images in # the HTML documentation. When you change the font size after a successful # doxygen run you need to manually remove any form_*.png images from the HTML # output directory to force them to be regenerated. # Minimum value: 8, maximum value: 50, default value: 10. # This tag requires that the tag GENERATE_HTML is set to YES. FORMULA_FONTSIZE = 10 # The FORMULA_MACROFILE can contain LaTeX \newcommand and \renewcommand commands # to create new LaTeX commands to be used in formulas as building blocks. See # the section "Including formulas" for details. FORMULA_MACROFILE = # Enable the USE_MATHJAX option to render LaTeX formulas using MathJax (see # https://www.mathjax.org) which uses client side JavaScript for the rendering # instead of using pre-rendered bitmaps. Use this if you do not have LaTeX # installed or if you want to formulas look prettier in the HTML output. When # enabled you may also need to install MathJax separately and configure the path # to it using the MATHJAX_RELPATH option. # The default value is: NO. # This tag requires that the tag GENERATE_HTML is set to YES. USE_MATHJAX = NO # With MATHJAX_VERSION it is possible to specify the MathJax version to be used. # Note that the different versions of MathJax have different requirements with # regards to the different settings, so it is possible that also other MathJax # settings have to be changed when switching between the different MathJax # versions. # Possible values are: MathJax_2 and MathJax_3. # The default value is: MathJax_2. # This tag requires that the tag USE_MATHJAX is set to YES. MATHJAX_VERSION = MathJax_2 # When MathJax is enabled you can set the default output format to be used for # the MathJax output. For more details about the output format see MathJax # version 2 (see: # http://docs.mathjax.org/en/v2.7-latest/output.html) and MathJax version 3 # (see: # http://docs.mathjax.org/en/latest/web/components/output.html). # Possible values are: HTML-CSS (which is slower, but has the best # compatibility. This is the name for Mathjax version 2, for MathJax version 3 # this will be translated into chtml), NativeMML (i.e. MathML. Only supported # for NathJax 2. For MathJax version 3 chtml will be used instead.), chtml (This # is the name for Mathjax version 3, for MathJax version 2 this will be # translated into HTML-CSS) and SVG. # The default value is: HTML-CSS. # This tag requires that the tag USE_MATHJAX is set to YES. MATHJAX_FORMAT = HTML-CSS # When MathJax is enabled you need to specify the location relative to the HTML # output directory using the MATHJAX_RELPATH option. The destination directory # should contain the MathJax.js script. For instance, if the mathjax directory # is located at the same level as the HTML output directory, then # MATHJAX_RELPATH should be ../mathjax. The default value points to the MathJax # Content Delivery Network so you can quickly see the result without installing # MathJax. However, it is strongly recommended to install a local copy of # MathJax from https://www.mathjax.org before deployment. The default value is: # - in case of MathJax version 2: https://cdn.jsdelivr.net/npm/mathjax@2 # - in case of MathJax version 3: https://cdn.jsdelivr.net/npm/mathjax@3 # This tag requires that the tag USE_MATHJAX is set to YES. MATHJAX_RELPATH = http://cdn.mathjax.org/mathjax/latest # The MATHJAX_EXTENSIONS tag can be used to specify one or more MathJax # extension names that should be enabled during MathJax rendering. For example # for MathJax version 2 (see # https://docs.mathjax.org/en/v2.7-latest/tex.html#tex-and-latex-extensions): # MATHJAX_EXTENSIONS = TeX/AMSmath TeX/AMSsymbols # For example for MathJax version 3 (see # http://docs.mathjax.org/en/latest/input/tex/extensions/index.html): # MATHJAX_EXTENSIONS = ams # This tag requires that the tag USE_MATHJAX is set to YES. MATHJAX_EXTENSIONS = # The MATHJAX_CODEFILE tag can be used to specify a file with javascript pieces # of code that will be used on startup of the MathJax code. See the MathJax site # (see: # http://docs.mathjax.org/en/v2.7-latest/output.html) for more details. For an # example see the documentation. # This tag requires that the tag USE_MATHJAX is set to YES. MATHJAX_CODEFILE = # When the SEARCHENGINE tag is enabled doxygen will generate a search box for # the HTML output. The underlying search engine uses javascript and DHTML and # should work on any modern browser. Note that when using HTML help # (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets (GENERATE_DOCSET) # there is already a search function so this one should typically be disabled. # For large projects the javascript based search engine can be slow, then # enabling SERVER_BASED_SEARCH may provide a better solution. It is possible to # search using the keyboard; to jump to the search box use + S # (what the is depends on the OS and browser, but it is typically # , />stream hÞÔUßkÛ0þWô¸Á‚dY²l(…&[Xa+c ë ôÁKLbHœ»lýïwwÖ)¶—¤Ûú0öð!ßîN§Ïq¤…q‹(ƒÅm-¬VD&Žá#Q’q'¯'“q^KÐ)ØñùþâB^Õ‹¢jD¤b-'ùÃû¢\­‘$±|[´¦Q¬œœnòU-²TNwU3ï~ܬqd‘V ¸'ë4ß–›§Wór[Ôâ¦ø.>ï¶yõšl7ù¶déߌw›åu“oÊyÌš}Ñ,Öòf·ßæRݶ99¥dëxU­6…ENΚbû0rþôP7¦½/šÝ^~õÕ_^B­X<ºô3ø4rø8—ïªÅnYV+y[VWU]yZîëf²Î÷B N¢æCCå‡Ü{ÀÈÙã·³šï J/ä¡—ͺ¾s.ÿÚÂܤ™°00V)B 3C6@Œó ›S­?ȸ¢÷<‡Ç©è, £æœÖ½õò_ÒG‘HA&ú‚Ì{¬Mz2úñåíkâóCmcLXƒbjß ”µïê{õÁYímƒrâxh7G+ZñüØú½¶ŸG¤k… £ÁªÈvw#pdÚ"Px·ÐŸØß;F 30¸3Ì•SpðÔuÒÖœ¨$è¨>ô7}¹§®õåyaêœ= Üëd¾‡Cp¯< Ç€}>¦ç™87³è‡w7ÏCw.†ó`²ƒ½ƒÎ¬Ý3Öñ²°ÉRÏÂ@Ãà¯Xø·Øœd`§Ï°Ñç ø…äkÿ[ò…Ça´ú•|#Ó{Ö‰³/&_ŒÁ@}¦Ux|½Ì…òc2ƒÁÅüº¾¼ò³L~¨÷Ï䈫Á‡y†|»µñ#c½ó{O’¯9òƒ¥3)–õd'_¬¯C„îõs/4ä^.ÔN=Ûféy‰½Â79ͼþ‚ˆe”“0¬;˼:î3ot‚yùòþ9»Ð.øO{”a!×£ŒìÿÒç¶{yÏ2ï)˜ì¨¾Ï¼?`…8 endstream endobj 302 0 obj <>stream H‰¬ÔÍJÄ@ àWÉ lšd’Ì–=ØUð°‚ôDDÙ=(ˆ¯ïlÅËv¶-"sh)C>òÓtw¯/ŸϰÝv‡þ~»Ý;xª‡!9˜ÀÓ º~ è‡ú†þ ¾ê7¯ž€©Ôçx„ÛCÒ]„OÓðê剈©¾¯`L!Zâ9J¯fòï”5²b…¤†$Da«¨Åây+#qA.ä …0_2 Jn(YjÝ#¢¯cØÐJ™£Jƒ*zeئDBGI6gÄ•t²`òÈу©•QæËÆ4…¬Ö*%Å\´„Ç*h³ÔæDuÚ+RBuÕZl7‚FùÕêY‡{µYl7öØ›(zýkÉy·Ü®Öz°@wÓ7£ 3I«m[ÜÜi4ÉÒϾ0.a­,'æf…oeG¶ endstream endobj 303 0 obj <>stream H‰œÔÏJÃ@ðW™Ètþîî@éÁTÁƒ‚ôDD±ñõª k]%—²ù1_¾Ìz½ºš/·À6›³í 𠔃z`)nä âŒ.Ì$·{XÍ;‚y—Án¾A‡·<ñ‡£{˜Ü ]ž`7p~•¯^]<Ü¿¾ÜÁúˆÖJ™j!5Ã¥éˆ9F¶ÞœŠÍœBHal%Ä:&aý‚°£·vÒŒŽY|ɶ–ƒ¬Q†Ìiê •??hTòF<6è¤X  ¨ŸT¹£ZC«d”¢ITBÇLéÇ›HÆk`’>«Óà Ó@¼Úë‘!;s„&Z1rÔlÒ`FPë§›hþ6Æ«S¶|4Þé÷|½ß¤B´Šµeêá" ¨?,$ËþF²âY¥Vœ¤W¥.$é.$_P ]Âο–«ôþŽ2µ¼9v×Q|€ò»,3C endstream endobj 304 0 obj <>stream H‰¬”ÝJÃ@…_e^ ÓùÙÙÙé…©‚$ "нP_ßi„"vm"H.Ø,ßžsfÏwpµÖ×Oïopq±Þ 7[€Íær›+¯À@ù0ˆ1¹…´üÔÂAêp¿‡õ0 cþãp ‚¹ã¦­{XYP4exñ7¨Ò)T‹c-Fa_ÐD Që@ ý'5€ ­µ³Pî@M±T«T¤ o-œ—A¹åûPú*¨‘§lΩ².:Ê Q;D5lRœ|²UB[„-*V¨(jg¡¥3AèÎ5Z.z EÐHcç³´S1,í”2‰6²B¼ÌÚÙ(k_ãµ!³ -3v>Hïð„1¯$“ðdjÍ;!‹€‡ WóI¶ÎøTšæ†Œ[ª]ÒLsnv:§ÔväöR;ádլ滦ôºæ›¨ÿ…u:¦pÉv $Íû ½ù»ƒåX-Ÿ x>stream H‰¬”]JÄ@ ǯ’ t6ÉL2 È>ØUðaéDDqÄë›-+(;»)mÒéÿw À¸²*p¡dZKÇ¬Æ aœb Óx˜ªÀW|ú ó™Åë &x€›í°º}yþüx‚««Õv¼Û@ɰ^_obò‹SX8¡0"wa’$fgY¥Á²r`‘¹P,'…Ag9K“Ê2%5F·>kâ õ$¤@ê‰UÝ-w†Å¬j Oñ„¡±ö:²cXqû‘{_XÃ>­å°ü„´ê©9–NÓlÔ"4©Jqµ¹Œ’Ñ0~}LŒÙ_ ”°3Ç : ¥†™”g(JÞ›Ú:i|ZâžvXÛ}¹˜ÚÚ$¨‰°*ÊÜabýŸ¯­"9YtŽ0 §¸¹½pIk±¨ìíUÌ:C)›à™ýß @?D[ endstream endobj 306 0 obj <>stream H‰¬ÔÍJ1 ðWÉ L7i>Ú€ìÁY+È<‚ˆ(îAA|}3sPqëNd.…iù‘Ó<`|Ò¤µÂ LpWû`sýôøþö›ýx³5Øn/wñçh9IÀ…’™ *CfJE +Ü`3NãÛ`oSQøˆ#ß*'ƒÁRf=É–+5a–‚²¨®¬Þ‡všµaš&/dÈÅr4é«Ô¡#^o˜*‰”Èg“$V•»ÌÒ°mŒ–¡ZRE¤îlW£5jwQñŒî3ÉÙÜõŒZ7s+ZOëf2eçV¡9ýFUâJ9²¡“*7TÔY]$Òš„ãÁ`«Öc•bžåÏ2ðÜ2×A=‹z®Ëº"ZùÏ\[sHJ²èÔ¹ofµZ<ÔÜÙC]ÓÏZcHy׿ú²PÒ’½s ´–mkE•_—s*š‹ýáS€ÎQDP endstream endobj 307 0 obj <>stream H‰””MoA †ÿŠ»ëµ=ã™±TõдH ²7Ê…Q-(Ï&mSeYíe¤µýøãµ `¹x„Ya ·äߺŒâï°„wpu½è_~ûúçî3œõ׋W— ÎÏ/.ýÏ/w¬^ !(‰™2ˆ²ÍF‘aµ†~±$X,Ýê_À€ º„tŽšé*d˜3'+ÀZP4gËrÕܵ”Y$O!š²DàTPcŠt’Ë|_=óÉ +΂'œ Z(™4Åûï s˜ £š0 = ‰£¥£xuŽc¼ ûDÔâmu_£Ý¯~@? •>|ñ¸D†tþbƒaãM@Š#dûŠÑûŸ@L0Öð¾ùùñ® Íï65@í‡áõ®ä=vy`w;ƦjÏu ‚ä5Ÿž‡£PM…ª-¦TÍn‡Û@y”˳v$Ål ÝÉ(™DÅ9ÔÖ½‹x*L¢ò ʽK¨EÓSHqŠd4O²'ƒtô¨{—oeDz]UÚ!ûMóÝ ¶Ó×MÓrhì…Ý´Oòº–Êtâ:ZÂDÑLý<&AM¦eb«öï¢(FßÂ:GJ»Ú‹™«öY)x[TÑ/°Ž'þ 0ÂdHp endstream endobj 308 0 obj <>stream H‰ÜT]KÜPý+çq·˜É̽3÷ćZ°T6Ðí“ÔÚâ ¥¿ã&©·u öÅ<ÜÌ%s>îÉ$ Æ’š"PÈ7h„8Œªß^ãê ÎprÚíÛo_ÜÁáa{Ú½;FM8:Zû“;ˆs±¯ åR+KFT§–dÕ —´ÝšÑ­½ ëîƒ÷~Çä‚‘ÙZáäªk—œqŠRI)VEŒ™BHš(ùO°êÑ~|ô_&ÿmß‹ õWpÈV4 ÖB,¬PLµ¢ßà|q±XJ\È\,—Ÿû÷ïIÿ$a~šŽj¦È~EA,‘J ¹æ°#¦lø9I‹ß†hv¾ aÙ!Xm&¨%Z-i/Á P!Kõïªá¹cþÕ¸C5ËoUõ‰zÙpõQð’Ôá=Ÿp;w‘ •™‹ª9ÕP÷ráxŸdóU’ø<§h¾ZÕ±¾„úhçqg$¥Œˆ¡f›±j††ØÌ9›‰t·>stream H‰ÔSËJÄ@ü•:ªÎtÏt&âÁ¨àAQ6àA<íúÄÄß·“ì¬A£ˆxÐä’&Õ]UýPâºFÁTÈID!Ty…¦ƒ9˜¸âºœáìãj §x÷!#„@ÞÙã¾ö”B¬’$Ì—(›™C33fÍ1EÅ‹¥Ü¡Ï]vù}án¬$ D‘öꇌồ£¿áé33µÔåÁíõóÓ%¶·Ë£æpì"vvv÷ìWg»ÃGqÐà`¨3<Œ{‘„< §P¿ïÅ3ü~ˆŸ ÿ—C<Ån‹òd4Ä”‡X¶-›üö ,ƒ{Að‘$jeÞ#9Ž5Ú%6Üf{·Ú‰Q%ƒ¯*™,gh´ lð4V3VÈ)>stream H‰b``œáèâäÊ$ÀÀ›WRää¥À~ž™ “‹ |@ì¼ü¼T ðí#ˆ¾¬ 2 S/`M.(*Ò€Ø(%µ8HâÌò’ 8c-’” fƒÔ‰d‡9Ù@6_IjHŒÁ9¿ ²(3=£DÁÐÒÒRÁ1%?)U!¸²¸$5·XÁ3/9¿¨ ¿(±$5¨jð»%V*¸'ææ&*é‘èr"(,!¬Ï!à0b;C€äÒ¢2(“‘ɘ ÀIÆ8/ endstream endobj 1 0 obj <>stream hÞ²T0P04P05T0!S}çüÒ¼C}·Ì¢â¬B¾O"‚RYªï_Z’“™—ZlgÔâÒ’ H,Jj¶„¨Ë,ÉIÕø÷Ÿ!˜!‡!“!…!•AÁ¡”!—! È.ò 5Áú]¢ f»e–Äêë»ç‡äÛÙ¢P(Ð endstream endobj 2 0 obj <>stream hÞì™_‹[7Å¿ŠÛ‡öj¤ý%°iiÒ¦!»oË>˜Ô¤M¼¸Þ’|ù¶g®Æ‰‘)+¸P'Ä`îȺ:G£ÑOׯ¦à¼£è‚¯ŽØÅ„ Ž#;JèÇʸ!xS\ U]à’¡p!é…\(7ƒ‹ãBt1äbö'ˆQ0Ø1éLÙ1WŒ+6ì0T‚¨ØIÂ%’K~1 bPŒˆ¦ŒXÅ%ŠèOˆ‚˜Ò@AÔÉ+b‚¹G,ˆð‹0aøEA„_¬è‡cQ ?Nè‡DøÉœ". ?Á¼?Lì~ ó"å”2"ü2æøe˜ ü2æE)’ÖEàW0’T°_ż ~U“†_ż)¸ìQ\¤‚²iR.“CQï”\š|F¬WÊŠqÕe"D½‰¦ ø~Rð~ ó Ô9U˜á…xãrÁ~fHŠšcHÅ:2ºjñn~¡¸°À0v% ‰Å#Õ°®¢]H®à±ù%!BŒT csŠAÝ ºÅ«ðÃFº ‹„ÅUH2àÑ!“뛋KÁM R*Š_!ñ>9lYõ(–^ Ü‘‡'!{ò0 J¬‡*ÀŸ€CØ;ò˜‡½ cF‰Ie&MEPÂZ*q wMH“ÎÊŠR°»¸˜žÝPÒ³òRi·H÷ýÑ"[‹Éb¶X,Ö«ùUó«æWͯÎ~·Ó‹Õvýnw½]¯õÄ¢ë çùúýîÙúNíôrs·þuu¯ÇYÇ\¸_OW»íëyàËÍf÷ä ôüáíŸ7^O»NBzÞçÙôÀk#ê‰×ë‘׆è™×FÒC¯¬§^E½6æs?z=ùs‹ôìÏ­ §nE=ÿsk~Ì-Ñg€®tÎï‡?VÛÝôÓ›×Ûõôã›ÕëíêíþíÏÛÍÃ=:ÿš®îÞüŽå­_í¦k”àéæýt¹ÅoRËðÝÃݳK-ÅÔL-»ÔRK-¯Ô’J-£Ü–›m±Í%7—Ü\rsÉÍ%7—Ü\rs1\ŒƒÅX1TŒÅ81LŒƒÄ1DŒˆžœ94—Ú\js©Vcï-’Å`1ZÜïží·ó¶oÞvÍ›™™™™™ß3£Œ 22ÆÈ##Œ 02¾Èð¢=]{¶>’e~{ªöLEó‹æÍ/ÆOxPäOo¬GŽzÒQO>ê)G=µïa01[V;Sc[/ÛzÙÖ˶^ÞŸ¢ý²õÊþ$¡ÏBâQÏQ D-l^±yÅæ•yÞÛézÊ ÒÉŸQ:çË×|Œr†ñD•'¯<’ /uûooøsz¬ÿŸë>~t9?ÃNUùÿ|†áÞûhùÒw%~•ÆÏ§üççó©*þ 8UåOÿeök­üùcö4•¿¸˜.]ûÉnºš®îWïæŸ†Ÿ>ݼ¿ùÎĵksÖp;ý6ý²ú°yh¿s_ºöóÞƒ´Ô ,4h¿.1XZD^ZD^ZD^ZDYZDYZDYZDYZDYZÄ´´ˆ¡ý-2=s~zñÚEd¨cZš—w»oþþç[Œ Ó GÉþõ:Tµ„>êr§‹ƒºÔéxP'NuÜéÒ .vº<¨ ® ê¨ÓÕAïtäDŽퟷC! {bh™Ô#CƒÌ¤žjÐð£Â’AaO ¥Aa åAaÏ •AaÕAaONðcBéÉ 4(>stream hÞÌY]k\7ý+zl_´>!’Ò–’”†:Ї‡4ÞSׯôÏ·=#Í]ßÕ:km ¥ö½W;çœÑÌh¤ÝKä3DlbÆ%è_4” ×d¼/¸fã Æ¨×j¸VCÞ™®d"(È{ЀγI|>˜TÀç£É|>™\Á‡ÏJ¸+ _MMàc`Œˆaì YÔ†™EœÜøð…@ØXâËÇEž0„ŒA2Œ…"’ ƒ9& ‘|æ” °Ë˜™~cŒ¡`.Ux0Z£À«ñŽ„Õá&¡7^fHøØ“L;2‡¹Üõ^ÜÀ¤=‹(¢æ9ÉB7Š7EÁe ̱&qÓøT€‚ß ‘0WÉ(Øy™A4Ü¢•’a/³LÙ0ƒƒ’d­ÈÒ–l#ˆ—–dNµÍÛp– eÆÄîr æ"Ñ@Œ¸z1s•]AµgAU“*¢åQÙ© 2YfùäÉæY[RÎü¼yvu÷Õ_½yil^µ„Éð« ¤ÔµÛ³Íw—o·OŸ*0@ž¦&qÆI`iÈ#0Oý,“@uè`rs@t€H“À±rR¯œò(p¬œÄ“À±rR˜Ž•“â$p¬œ”&cå¤< +'•IàX9©NÇÊÉnèÆÊÉ4 +'OVŽ+'OVŽë•@O|=¼ÚÙÆÅ¶E>»c¶AmK›z¦c¶¼Ø¶ªÍþ˜­_l[Ùd>fKj[[Þr8fëÛ¸?o+{Ò~°k$ز« À4 Ì‹w=òé˜wc/ ×§ŸU‰HšD†¤ŸDò’'‘þ&‘t€Œ“Hw€LsÈRyY4÷äZßÊåHòËR(D=õ˜qÚ·ùwÌ8îŒ[ :f|P¾·Nzt¶õàiyPÞÏ!ÓAV=O Ÿ?¿ùôç_‹3x‡âZ¬“ó¸Ío7ß^Ÿÿp}¾½¾“3u›Ÿ6/ßýyóñnóêêÝûíø`óüêæý»w·wjÚØù‹7òíšíËG¿½¶œ¾]u޳Í÷·7?,ÀÄÝ0½F½*aR¤„½é/ }iÖK#^šìÒ@—æØ¾¥õëb§üyá§£‹ŸgW—ç[õ³;oÔ[uV}UWÕSuTýT7ÕKu²ûøù ¨ïêºzªŽöeúZ1}˜^ߦW•éeiz]›¾>/Ö–é‹Ñôlz0½…˜ÞƒLob¦wAÓÛ¨é}ØôFnzïÿ¼XßTLÕ$:M¢Óä8MŽÓ$:M¢Ó$:MšÓ¤9- ÷X•‘ ‘ ‘ ‘ ‘ ‘ ‘ ‘ ‘ ‘:î•ÏÓ#Â^…¼ yò*äUÈ«W!¯B¬B¬Ž³òñ#%$?j {­áõöÓZÂÎ:ždN²Î'Y—“¬ë)ÖÁdÍ'YkbÃÒo4±A4±A5±qé_ú¹.lÝß–­ëH¢£ß<´?nF>É:œd§­ûvTe#bŽ–Lt,÷%XÞÛŽ(YžÜŽ„íž<ººÛë"UË&ø8ìuÎÙ€àùö·›Û­q6î$²%§ágW—×›o0¼½Ýür{ywy}ñãÍùvóòöõ¯£ˆ ó"‚/A òôLp¦ð_"’Ó "œOÑRõ–±ip!\QK5[ù3ÙXx>stream hÞìYM«7ü+úÑJên}€ñÁC CÆö!äņðÉ¿O•4óF³öAÙ[~;¥©R·¤ž®uŠÉ—¢¸ ŸŠÄæ$g§‰¸8KÄÕe!n®Ht ßUÉøŒ®)qr„Ñ8¢.&㈹(™#ÙEÍ).ZáHu1H§æb)Í%hÄZ1‘Ø*G’K¡â)N‡#| p“‚aÎDK rÐÄ©.åLü~{÷üþÏçýæÁûúõ‹˜ï›[£7¤PLf|ÊBº(4xg!õ‘ ¦êCæ®L3> _m5¢Á{Å| HwPßú©3ž…A†–Ö„6ÞCçf¬ >>qðf|Ž(¬¯ÑÆ;EÔÆâG«^Q¬ÍGÔµ±xx§×2ÁóqM¾®V¹õ\2WU °Ê¡*Lø¾.Èr•¼ó "ubÀ íÆŒg!NrYhãýZhhúFDÿMÈ÷ ›±ÿ >ìè$Â/Ö$:ã!€&Ë£9ÍH®F1^ŸÈ^økäm&Çyaöý“ñŲ£“²f«`œ*’›ï_Ì: èjz:ã´ÐèŒBo™2z9AæÓŽÎç=øÕBIÆI 2óh­QçQRøÛÑù\`ƒ- q.ʼn]¶T;ÐY@ýra,þ®þ†ÞìUödUtÈ«kЧEޤŒh‘¥t Y r噌óiΙ= šñÞÑíèþ$¯F@Æ)‚™V¥}[ –¸ç5`a€ùòtušëNphu Â,÷ë :,ÑÔ{|8Zß|êb_í¸6ÞI(4ßè&“ù»ïõñÀ³P¯d«ÐÆ; É‚Ë0º®g|Žù\’{!,4:,‘¾*Itɾ¬v[ç¼…Ãè® }}$=úÇŸ"êƒ,w[ƒwîM6W‰2VËä*~€«Ìl,Ûá*~€«DI¡q•?ÀU6öGåp•?ÂUâ¸×2¹Êޝw•h*}ŽåÅUnø®'±Úä+¾ÞYrºk´;Ë _ï,I¬/¾²£ë]¥¢ƒ‹1¿¸Ê _ï*IÌJwW¹á¸Ê‚'W9ð\%ˆ5Éá*~€«DÛZB=\åÀp• ÎAW9ðõ®RZôÆß26[¹áøJTþzúâ+¾ÞW2‚Š:·Û½ ?ÀWöòá+¾ÚWJBUÛ\e¿¾ÒS =€í®rCWúJö8ñÅWnèJ_É7x©¶ùÊ ]ê+ [±ÝVvp©«4öÌuw•]ê*Ý»î®r K]%š½Xmw•]é*Ù©„ÝTp©§Äóã÷¡x K=å&°yʯ.ñ”³£¼ÆO~‡£onü-©æ¾Óõ›ßºþŸµ?ßÞÝÞ=ýöñÓÿƒkƒÿ 0:xû endstream endobj 5 0 obj <>stream 2011-01-27T13:43:29-08:00 2011-01-26T14:24:57-08:00 2011-01-27T13:43:29-08:00 Acrobat PDFMaker 9.1 for PowerPoint uuid:b662ff29-9cfe-4270-82dd-b5b125bf51b5 uuid:71502b45-88a7-4cbc-b7e9-b67720e5e454 application/pdf PowerPoint Presentation TID Adobe PDF Library 9.0 TID endstream endobj 6 0 obj <>stream hÞ2²4U0P0²4S06W°±ÑwÎ/Í+Q0Ô÷ÎL)Ž (Åê‡T¤ê$¦§ÛÙ¡+260€( H,J M BÑ`Œ0í endstream endobj 7 0 obj <>stream hÞTÎÍ ‚@àW™º¨ùÑ2Ci‚„Yø£Þh¨¼q ß> )Z8çã¨,e‚å9/F 냎øowÛs °Þa¯­‡Po•RHµ–‰JVéBl!‚¹5íË–°±ž½¯ìˆeKÉNHÌàÈ ë}Ä+ìþµTÆI¬²¯f»¡…‰ë°7ÆŽ®!Kã䉈×Î_!ü‘Ì< ÷Ÿ£QQ¼=*@´ endstream endobj 8 0 obj <>/Filter/FlateDecode/ID[<9F1EA94298D34A4191A1D95EF0F20284>]/Info 297 0 R/Length 77/Root 299 0 R/Size 298/Type/XRef/W[1 2 1]>>stream hÞbb&F±ó L ŒÏ€ÛW Á1 Äf@‚aH– ¨îˆ+ˆËÀ#ÿ¡pG‰@0Î ƒÑ8%Á´Qÿ /i ^ endstream endobj startxref 116 %%EOF hypre-2.33.0/src/docs/usr-manual/figSStructExample3a.svg000066400000000000000000001076001477326011500231210ustar00rootroot00000000000000 image/svg+xmlpart 0part 1part 2part 3part 4part 5 (9,9) (1,1) 0123 hypre-2.33.0/src/docs/usr-manual/figSStructExample3b.pdf000066400000000000000000000725651477326011500231070ustar00rootroot00000000000000%PDF-1.5 %âãÏÓ 110 0 obj <> endobj 120 0 obj <>/Filter/FlateDecode/ID[<9F1EA94298D34A4191A1D95EF0F20284><5B4FE39C008A294885EC2B38BBD3682B>]/Index[110 18]/Info 109 0 R/Length 65/Prev 29752/Root 111 0 R/Size 128/Type/XRef/W[1 2 1]>>stream hÞbbd``b`ªŒS@D(`>b-ÜQ ® ˆ« $´*€Äþ&F†¿@#Vâ?cÆo€ls endstream endobj startxref 0 %%EOF 127 0 obj <>stream hÞb``à```Êe‚ÈC ¨€ˆY8Å8 ˜Q™á„Ô…“æ. \¢Qk ZvÜj}ÄL ;Cø¬ýpCXÎ@DY Á¿ 0 endstream endobj 111 0 obj <>/Metadata 3 0 R/Outlines 7 0 R/PageLayout/SinglePage/Pages 107 0 R/StructTreeRoot 10 0 R/Type/Catalog>> endobj 112 0 obj <>/ExtGState<>/Font<>/ProcSet[/PDF/Text/ImageC/ImageI]/XObject<>>>/Rotate 0/StructParents 1/Type/Page>> endobj 113 0 obj <>stream hÞÄTÁnÛ0 ý·C'Ë–d($Y³Xº¢ÖEZ¢%Æ;°U¬ýû‘´å¸E‹w Dó‘Ô{¤Kˆ@Æ1È L†‡iž’ÌÀ¸œÏg¶uRcÕÍ=†ª{¤÷¹Xc‘4=¤:?ÓË~Û}ëÄl)®êæ`÷b>ù)߯{äûõ¤(¦à›'Š¥mÿ`jåÄêéèÄÅ£ÿRxëX[®«]ÝdBýÛµ«<È(JÅÜ¿ºr»ó`L">»:KZìí¶…D‰E]ùÙ¬~¼;Ó(š0ˆ£(â÷Œ.ì¡Ü?}X•וû 7õÁV»²dEçpáç×» B·EâÒÛ}¹žVÛ½ƒHÞ~@uâ(•ˆ6åÑ×øÙóW*cu4NJy~çu±\‰‹j]oÊj+nËjZµåð½(›ÖÏw¶ÁËž·çã^Ä7ÛgàþDñðË•Ÿ9 İõÆïÚ»4ÍàZ¬#H|¬QwE–á7a2ë02Æð ‡|:ãôTóžQ.çc`J)Èñµ§ø›1&ec_JÐÚ°OƲ|À²Þ' yTK>á˱ð)μ‘ë59óbóÈŸƒæ1÷ÞO_Ñ8ŽgÂüzŸz*œgL>žZ!Ý×ö3 y2zѸ  :ú õTÁŠô©:(aö}g.$ §UR!­–Fª»«ÈG×?[ÙˆAjHºžAˆ1eŠáŸ]B¹}¾Æ\¥“¡7Çe?}25ZÑK#¡ü,PèØ‚Ø`oÕóøÍÛýi Ãj^1ºûµxxãgñ¦©ü½ŸÆýdòO€úlY endstream endobj 114 0 obj <>stream H‰Œ’aKÃ0†ÿÊ}œÂ®w—¤I`ìÃÖ)û0P,ø¦ ›èðÿ{KÒÚ Ò„òÜ{ïµou÷¶ÿþz…Ù¬Ú,× Ìç‹f P-Ÿ¶' ôÆè|8ïà´=G6xšÑ HÖÁÔ:1 ‚»[ø,˜+˜+Ξ¹g8*XÝk·ý©"QmÒ'q¢«ë(Öx½3’ó"ä`{€j} h>àVuþ‹ª‡~$;IÒHy†ªm Ú°ÃX§~ù&F0°õ0 ´˜ÐMûžõÒ¾“6„µ¾} ‘L¿h´uAe5C4ÔŒ¢u‡NÙªS«'²„T1ê˜cWA=ÛüáYä‚¥˜ÐQÏâz#„¤ 8kS¸r¾Òÿr7ÿÏÀùˆ6:==Õ7ÌC­}bJXŸ¸Ä…ÂÙÌEr—‰ËB®¶ìrGúºëɤÇ`¼#CŽ_DîG€vŒ¶0 endstream endobj 115 0 obj <>stream H‰œ–yTSwÇoÉž•°Ãc [€°5la‘QIBHØADED„ª•2ÖmtFOE.®c­Ö}êÒõ0êè8´׎8GNg¦Óïï÷9÷wïïÝß½÷ó '¥ªµÕ0 Ö ÏJŒÅb¤  2y­.-;!à’ÆK°ZÜ ü‹ž^i½"LÊÀ0ðÿ‰-×é @8(”µrœ;q®ª7èLöœy¥•&†Qëñq¶4±jž½ç|æ9ÚÄ V³)gB£0ñiœWו8#©8wÕ©•õ8_Å٥ʨQãüÜ«QÊj@é&»A)/ÇÙgº>'K‚óÈtÕ;\ú” Ó¥$ÕºF½ZUnÀÜå˜(4TŒ%)ë«”ƒ0C&¯”阤Z£“i˜¿óœ8¦Úbx‘ƒE¡ÁÁBÑ;…ú¯›¿P¦ÞÎӓ̹žAü om?çW= €x¯Íú·¶Ò-Œ¯Àòæ[›Ëû0ñ¾¾øÎ}ø¦y)7ta¾¾õõõ>j¥ÜÇTÐ7úŸ¿@ï¼ÏÇtÜ›ò`qÊ2™±Ê€™ê&¯®ª6ê±ZL®Ä„?â_øóyxg)Ë”z¥ÈçL­UáíÖ*ÔuµSkÿSeØO4?׸¸c¯¯Ø°.òò· åÒR´ ßÞô-•’2ð5ßáÞüÜÏ ú÷Sá>Ó£V­š‹“då`r£¾n~ÏôY &à+`œ;ÂA4ˆÉ 䀰ÈA9Ð=¨- t°lÃ`;»Á~pŒƒÁ ðGp| ®[`Lƒ‡`<¯ "A ˆ YA+äùCb(ЇR¡,¨*T2B-Ð ¨ꇆ¡Ðnè÷ÐQètº}MA ï —0Óal»Á¾°ŽSàx ¬‚kà&¸^Á£ð>ø0|>_ƒ'á‡ð,ÂG!"F$H:Rˆ”!z¤éF‘Qd?r 9‹\A&‘GÈ ”ˆrQ ¢áhš‹ÊÑ´íE‡Ñ]èaô4zBgÐ×Á–àE#H ‹*B=¡‹0HØIøˆp†p0MxJ$ùD1„˜D, V›‰½Ä­ÄÄãÄKÄ»ÄY‰dEò"EÒI2’ÔEÚBÚGúŒt™4MzN¦‘Èþär!YKî ’÷?%_&ß#¿¢°(®”0J:EAi¤ôQÆ(Ç()Ó”WT6U@ æP+¨íÔ!ê~êêmêæD ¥eÒÔ´å´!ÚïhŸÓ¦h/èº']B/¢éëèÒÓ¿¢?a0nŒhF!ÃÀXÇØÍ8ÅøšñÜŒkæc&5S˜µ™˜6»lö˜Iaº2c˜K™MÌAæ!æEæ#…寒°d¬VÖë(ëk–Íe‹Øél »—½‡}Ž}ŸCâ¸qâ9 N'çÎ)Î].ÂuæJ¸rî î÷ wšGä xR^¯‡÷[ÞoÆœchžgÞ`>bþ‰ù$á»ñ¥ü*~ÿ ÿ:ÿ¥…EŒ…ÒbÅ~‹ËÏ,m,£-•–Ý–,¯Y¾´Â¬â­*­6X[ݱF­=­3­ë­·YŸ±~dó ·‘ÛtÛ´¹i ÛzÚfÙ6Û~`{ÁvÖÎÞ.ÑNg·Åî”Ý#{¾}´}…ý€ý§ö¸‘j‡‡ÏþŠ™c1X6„Æfm“Ž;'_9 œr:œ8Ýq¦:‹ËœœO:ϸ8¸¤¹´¸ìu¹éJq»–»nv=ëúÌMà–ï¶ÊmÜí¾ÀR 4 ö n»3Ü£ÜkÜGݯz=Ä•[=¾ô„=ƒ<Ë=GTB(É/ÙSòƒ,]6*›-•–¾W:#—È7Ë*¢ŠÊe¿ò^YDYÙ}U„j£êAyTù`ù#µD=¬þ¶"©b{ųÊôÊ+¬Ê¯: !kJ4Gµm¥ötµ}uCõ%—®K7YV³©fFŸ¢ßY Õ.©=bàá?SŒîƕƩºÈº‘ºçõyõ‡Ø Ú† žkï5%4ý¦m–7Ÿlqlio™Z³lG+ÔZÚz²Í¹­³mzyâò]íÔöÊö?uøuôw|¿"űN»ÎåwW&®ÜÛe֥ﺱ*|ÕöÕèjõê‰5k¶¬yÝ­èþ¢Ç¯g°ç‡^yïkEk‡Öþ¸®lÝD_pß¶õÄõÚõ×7DmØÕÏîoê¿»1mãál {àûMśΠnßLÝlÜ<9”úO¤[þ˜¸™$™™üšhšÕ›B›¯œœ‰œ÷dÒž@ž®ŸŸ‹Ÿú i Ø¡G¡¶¢&¢–££v£æ¤V¤Ç¥8¥©¦¦‹¦ý§n§à¨R¨Ä©7©©ªª««u«é¬\¬Ð­D­¸®-®¡¯¯‹°°u°ê±`±Ö²K²Â³8³®´%´œµµŠ¶¶y¶ð·h·à¸Y¸Ñ¹J¹Âº;ºµ».»§¼!¼›½½¾ ¾„¾ÿ¿z¿õÀpÀìÁgÁãÂ_ÂÛÃXÃÔÄQÄÎÅKÅÈÆFÆÃÇAÇ¿È=ȼÉ:ɹÊ8Ê·Ë6˶Ì5̵Í5͵Î6ζÏ7ϸÐ9кÑ<ѾÒ?ÒÁÓDÓÆÔIÔËÕNÕÑÖUÖØ×\×àØdØèÙlÙñÚvÚûÛ€ÜÜŠÝÝ–ÞÞ¢ß)߯à6à½áDáÌâSâÛãcãëäsäü儿 æ–çç©è2è¼éFéÐê[êåëpëûì†ííœî(î´ï@ïÌðXðåñrñÿòŒóó§ô4ôÂõPõÞömöû÷Šøø¨ù8ùÇúWúçûwüü˜ý)ýºþKþÜÿmÿÿ ÷„óû endstream endobj 116 0 obj <>stream ÿÿÿþþþýýýüüüûûûúúúùùùøøø÷÷÷öööõõõôôôóóóòòòñññðððïïïîîîíííìììëëëêêêéééèèèçççæææåååäääãããâââáááàààßßßÞÞÞÝÝÝÜÜÜÛÛÛÚÚÚÙÙÙØØØ×××ÖÖÖÕÕÕÔÔÔÓÓÓÒÒÒÑÑÑÐÐÐÏÏÏÎÎÎÍÍÍÌÌÌËËËÊÊÊÉÉÉÈÈÈÇÇÇÆÆÆÅÅÅÄÄÄÃÃÃÂÂÂÁÁÁÀÀÀ¿¿¿¾¾¾½½½¼¼¼»»»ººº¹¹¹¸¸¸···¶¶¶µµµ´´´³³³²²²±±±°°°¯¯¯®®®­­­¬¬¬«««ªªª©©©¨¨¨§§§¦¦¦¥¥¥¤¤¤£££¢¢¢¡¡¡   ŸŸŸžžžœœœ›››ššš™™™˜˜˜———–––•••”””“““’’’‘‘‘ŽŽŽŒŒŒ‹‹‹ŠŠŠ‰‰‰ˆˆˆ‡‡‡†††………„„„ƒƒƒ‚‚‚€€€~~~}}}|||{{{zzzyyyxxxwwwvvvuuutttsssrrrqqqpppooonnnmmmlllkkkjjjiiihhhgggfffeeedddcccbbbaaa```___^^^]]]\\\[[[ZZZYYYXXXWWWVVVUUUTTTSSSRRRQQQPPPOOONNNMMMLLLKKKJJJIIIHHHGGGFFFEEEDDDCCCBBBAAA@@@???>>>===<<<;;;:::999888777666555444333222111000///...---,,,+++***)))((('''&&&%%%$$$###"""!!!   endstream endobj 117 0 obj <>stream H‰b``œáèâäÊ$ÀÀ›WRää¥À~ž™ “‹ |@ì¼ü¼T ðí#ˆ¾¬ 2 S/`M.(*Ò€Ø(%µ8HâÌò’ 8c-’” fƒÔ‰d‡9Ù@6_IjHŒÁ9¿ ²(3=£DÁÐÒÒRÁ1%?)U!¸²¸$5·XÁ3/9¿¨ ¿(±$5¨jð»%V*¸'ææ&*é‘èr"(,!¬Ï!à0b;C€äÒ¢2(“‘ɘ ÀIÆ8/ endstream endobj 118 0 obj <>stream H‰ì—yœMçÆÏ½w³X&EIìK¨†(±“ÖŸ†RI‰¦ÖD|‰„!š„˜ÔÖVkKŠR•¤Å‡aÈЈ%hIÁËXgîÌÜûôwîÛ;÷žûžßkÎ\ï÷ç=×yžyÎòœó¾šVÛïEûùY¡xHh´ ‡4ï·ðWiÞ …õ)wÎù3IÖýÜ'ËI²V(Š]ñ})Æu2Ýݤ+ņ…øÂ.Á¶Ä$K°%2®Fóþ‹:ÅÀí)Ó¡RqÚ÷–ñðY‡Øo1U‚í»8WÖŒ¾VÛ¶µ¹²hÓÏ]1ƒÍP&CR_)êwˆðûõ»woY2¶y„QÉ` ¿‘ãJíÈpê7¥‘x:T\ñyuN¿^îÜÖœ~:äbýënÀ=€+ͤÍÛ®ÓìÊå'‘¨énä%u /å“=/%§&Ç%óŒûÉæ½ä{Åf" ? ï³:~Š£1¬†ôbú)fô\úÇd|>ŠŽˆšãŽê'n)lÏ˸—ô¾†TFÛ¥³X'Neºý1›Nt1«é£YHb5Ô´Ypµ0!¯pÜíZ ¤2ÚI`|ÊÁ+ù²%Ú5€Þp®m£:µéüRòiO¬ Fd!´«D0F8/ÕצœÉñ^}Þvi3àjÎjØØ‰¿˜Û>6ò¶ËþðŸbÜÞ{›k‘v5¦×øŸÈßqt;@±Ü/ЅЮväÙD,;oݽúÌíŠ?‹Ýœ~¶È®jB? ¸Ù€·]uÈ®;Ÿ©pgí™Óz›5ÚeKŽÅßÝ^L¹®¸«!´k pÙ!M½n!÷ìßFöäo—6 x‘Ñî9`¾ y{'0*Š·]/Î2|vR¨ì)•EÚ5È©ïöÍlnpaí¢S]z2I”®Cÿ>)¡]1?à|<ŸÛqd™øt%ž6Ù˜Ûµ ØÉç&‹´‹>]‹îÿ¥­ÃÎÛ‚ ·«ä-`tèɤ"£]Úh`&§Ùqµ]é‰o»g9OP*i× ÏO)”¬VP¡ñvµ'¿Æ¡æ’Œ”v•<ƒ«U˜¼bÎÁUO\>puÖ˜ÛUܺ²¹IÅ"íŠÝº×÷§ù”¬GP¡ñvM2"CÍ%)íÒ˜ ™¬ÆëÄÕ­ò€$»]#€ÜÒlnR±H»´ˆ×ks»¶˜zPä §]å³à¬Äâñ=ÐA<Ç) -Bãn×J Õ;Šxþ³ ç—>ÂæÌŽUÚUÏ)YÍ Gn—¾ìã&¾±ïê±±Á×tò‘Ó.m ×Âd0p@ø:96™Õõo».3<ƒiI}ž;fg³æÆ²í*y8üÎnW:ÑŸèÛÐŒ}ã»OqM0Iíj \/Ïa´÷ÎI€q€»ŸgÄÚ®FdÖE<{ãíÕa —5;–m× 6+øa†Û5“–]ÚF/¹4È®»Šs¦âñ ©]¶/×|Ú¸‘]VTÜ2 øƒwÈÚ®ñ@vÚ»5PÓìGȺ—5;VmW<Íø¯˜Qn=pki½þšn6¡³Î1•IíÒFßF™·ù3°JT{8í³¶‹æ›»h3í¢¾ ŒËn$rY³cÑvÙ×R® h´]q9žINüÎí?¢½aä¾ÁL>&dµ«B6Ð×´Kyúú<#¨µ}ܬ“¿ÃÙ®ÈËú¢Ò6ãRSÏî|×…Lΰf»ì‹ »%JßÏ`¾ÏO%ü麓ac-!mK)}î´Ç$æ7Ьvië€M¦MÆ—bµ£è̆ÞÞálWS}ÙEÓû¦ùûå¾ÑÒ°d»J®¡Tó~þg&½”ƒ‘5Åðà²Vóˆ·\šQAf~ÃHk×ó4ó­lÒÃö•øÄ°…Xf»½ ]5;ÎãþãhÙÕéëCµƒ™å±y8ú´+.@ 6‘~5ö®1~½./pÆ,×¼–,ú*6LT›gç{´´vÅÞ&˜ô¨Oáz‹IË—¹³[x»*å¸î&~õÿ8Õ­¼X0³Äß ôàµ÷=ü´kW @S ÿôEàô“þ½æ»‚—+/© .–tn¬né¯Ì¬¼(Ùߣ¥µKŸ±?,Sè+QRL:•Îk×â;,£Ýƒú`Z¬ÏÑ+Ò çï õeוôöÝýÛRbÙLáX ï¦Ezí Ðöv¾GG¿K‰ÖÄfVîÇ÷³XäóSY?²§É4Þ“×Ww1ùÌá©íÎöw¾GËk×0rö;³2Îa`£ t^aï—7ÍEÒ´fЗ]ͧÓ$æE5;4ŽÕÖ]•R¨Ã7 ™h›d8b±Ò ,—þý2޼vU2ý(×£k5FP;¹°vx¿„ÊxZPê­Šû¨^Òçùf±X»Ú¥ÿ©‚À`»¾ÖêÛŽôýš+”L òÚ¥í˜2ÐR[PÙë7÷¢O¿ÐÝí¦"nϯ›“ç}`s˜õ”‡¥Úeå„ûþ-ÆÚ—sûµ9Èò¼ò"BÇÄvщº«›1Ø œ1]/õè4ç°89®Ó½Cº¥¯èÛ‰ÿdq–‚•Ú»ŒV¬ýCÓk—¾ìjèõ¥QU}öëPãI@b»º’õHúr¹À ¦,|íjAN<£Òy@w}°?™ÅY jWµ¯=5BkWîýX ®ê«ºzî¡æ“€ÄvÅ9 &ô(Ú¦,|ízp–òŒÚ’g%ÚÖBgg)X§]].½ :T•±ví>õŽ>ÈŸ·ON·ÂÔPb»´}@f”¸ü#Šö8S¾vmR½£@¦~ gŸPë® 8&»à|µìý¸n†Ú•@sô1ÞáB` m"Ï2“– ™íšGÞ­ÄåGh–Îõbk—#Hòœžv=zãEcn:nMÓ¹F'¾ß3šS”ï€Òëá‡oâ‚ µK_vµð‡zÛ5òFѾRy®9=ÂÈðŒ¶¶æþÉ{‚°º²ØÂ¥&W»š‘ÑÏóÇs€ŸjU¥šø>ËcKg™ýþ†ÀpåÊ_¶ÄP»f™‘Þa©c8©õÊîXh]àTÙåÛèô?„Õ½I=—+Š}®?ÁaÔ ÇKä£>λ¶%+%×±¹>·÷P|¦ivÑ_¹Ž•*4Ô®i÷<)uöâø^×43aˆ?êsª¹/sÿ ]ÒLá¹]ez–-‹-1†Ç¨ÇÄJwwjžÒ)’Ç—ØÄû)ÚÅat¢ <†Ú5zØ]+G‡Iãê™HʃÃçTcùÿÄ6*H}Qq ‰ër¦QC µëáä}*ÈA­ýàþð)ÂÕ®BAízOP[Ÿ´_±¦QCT» ¥55$UPûKÒ®fM£(†¨vJYpÅ&¦Aízƒ7Ž¢ø1\Ô¬JU¤²˜tIñ¦Q?ì}zuË’Jé"&=AÒ¶¼iŠpâOT‘ñBÊ9$­ÊG¡#¦SE )ë2ÇÁG¡#†QGþ-¤ìJÊ“¼aа¢uä”òeRneN£P„uõù]´ˆòmR.玣P„qÔTQ®"áÜqŠ0Âq“JÒND™B ÜqŠpâ$•äW"ÂïH8˜;BNì ’¼. ³e’°{…"Œø•d¶€®œ¾`kÆG¡#>¦’¬ÐUÓÛÕ˜;BNèíÚ* k©·«,{…"Œ˜H%IÐuÕÛU†=ŽBF¼F%¹  HºQìqŠ0bµä²€n8éÒÙÓ(áÄ3Ô’¼¸Ðu“­Ó®ø:¶¢Ž`˜Ê+–Æ:°áÿÙ/Óè(ª4 Wg_Àle“ A… ›ä ˆ,"D„ K@– Œ3‚‘a—M2N„ŒÄ@”M@ÁQâÑÑ€ƒ²ªì(ɰIBÖw¾ª¡»“î¾U}««2ÞçGêVõý¾z»ºžTÝ„¤©+Ö}­oXî4:‚!­Úµ‹ðåÚ²cÂø©oed©^ ÉvAÃõ‘íúQ}™<| 24@Ì’ôôÙ!ls/³ÌkV.ÿ.(ò$˜7ðKÃ/fúÐiõ åÒ]Þ5¥·¦qÊ¡a%ô¨\v·ú®¦²lõeÜ ™ô+pÀÈa'äK8‚mr:ðËûˆ¯–€^ÀDvU§)…ÛÍ£‘_>0£rÐíÙÎ>ŒuÂ.Í<_Œ—zØKÍã•‘ÿ¸ ¥ç‹sh ©7¦¶+žÂ½É£QgjÔU¦äŸ/û4’­NØ¥•Öôÿì=‹<ÒîQ@‰²ìjš}~LDÐ+¦¸ØÕ1µ]ôr'y4šNË®yÐêÛ‡× ]€%luÂ.N×U†zصÈ‘·å®“B¾®iÈèÌlWÓ›Àa.¯Ôûäm«©ÁRÔ)à¶:a—FVÅ]¬CìòýXLÛG¯Ì¦¿Cég´ÅÔÛ廋²õãÑ)¨˜IÛ>7&Òßdjû [¡°KƒlŒÒÁ®û­7ÆÓ…#å½çh/ESLÝ1±]ó)ÚR.£NÝ$iDQ‚¼7öÙ …]šˆ¥EןÊçvÝ9f’=_{%†ÕP˜”†KƒŠF({–”ÍŒ?§×1­]–9”ì —^¡e—ŸôR¡õAè÷Z«0Â.-„äç¢oí9·ë(ø¸†Â,àë€Y7ž×ë pìv…®£`«ø4£e×®%ùêß2MhWƒ¿mpN’ãlCìZN–ǪöœÛu™Å®ÃÕë|r윣]ôÊïŠa.®~Z¬ãlïØ±ÊE¨i54;H¿ÐDŸ>‘¤ök]4ë[CAH!ý <šÓV}nÚ•èêV¼áø¬7®ør`¶O±áeyPí=¤ç¦öœ~t8ô^§ê'h£|ׯS‡ÔóÆ×±ç”«Ë?Ãq¶wìà*Sqjóû_NvvÒl™«fÙ5äÓ…¡åW¿ð!ƒe8Þ ënT’é[²Íd²+¡äjÕ«‡ò銲OîÓM7î|Ûþê3_݈ÏÜZu÷{Ú6±üRÜ­qàÌ (ýY®ÚlWm„É.)2Ôvï®p˜¨l»×ð¥Â.¯Âf—àÿa—Wvý¦vya×o a—WI^5:ƒÀk»¼J·Ë[Aà5„]ÞÅbta³Ë?8ÀሰK pƒ]ä\GÑw cm »w¸µ«óç…© q6¡d¡ïíÃÂ.Ànìò_\Ž­ ”át`½U¯I+…]{\ÛF¥úTîì¦Ê[ˉ4a—@à—v…f™·ä’ú×#hÛ…]{\ڵȋ¨Ú«SŒ¢íÜÜ@a—@àWv=C%ÙìdHRÀ¥Å’°K p »ü®Ö±9œ”¤Ñ%Í%a—@àv ¡OÒm¬J¥ŸÞ‘ÇÂ.À.ìÚFŸô³=ðgÙ®Yå±°K p‡s»ü¯Åa¶G¦]­ f*ca—@àçv5£ŽØ!»pñßÊXØ%¸Ã¹]èƒ »#²]y±Ö±°K p‡s»ZÒµ;"ÛÕ¿r,ìÜáÜ® `ŽÝ‘Á45¦r,ìÜáÜ.i3°ÖnêNšúDåŽ^vY÷þCrò€ö~ì%ï/aš×v^êöÏŽ¥jL¦ &´6:_‚R–mÙq,7·®ÑAX°Ä¿à«_wvu/Çi›3?vúçR žFDëeWDÊqX)Ø6˜Q°èr³L\aí<ÇýLoÒ!ÿ 28ChúÙ³?LæÕ­s¹rÏñê§'~+úµwa—DgžxkÜvciZÄ'@Š$E^›¤“]¿ÿ6œìËTt7M­Ã2Ñ?ªþ4šû;"r¦ÑœBŠÔÀà—/÷Ení"¢Ú_©ë¿^_ÐOÓï®ìòMCÉ+aôôl1zoÙçÝ$©ëMì÷¹sßÅ(}ìš[AMs·¬\ù¾õ V±ÔÂPÅl1( õ$"GîMš±úË2å‹l×p%ÄŽÃé—ɱü%Íßlýgn]’”ðJŽ.Àù·Ú+7zŸK8yã ¼NÐÁ®©å÷}­ï¢ 'ž’ƒ-c(ScWð™æ|| Ì¿ý”6Ö®Øk¨ø‰¯]ýèKÝñ¦Ü¾ú†Ù%IMúÛ'¦j7¤ïخʀ¿]±7ñ?öË<¼¦3ãçæfAKb:ƒÆÎØÕc©*¢Šª­U#RTŠG™i;c}ôÑ´U©eÆày*µŒ!S¥(Ò±Ôdl±µö%Ôµ‹-’Üïüν’po’{î9¿ãœÞû~þÈyÏÉûû½¿÷Üó9ç}‘Z8ÒL7•åã]þô²š¢²bWÚ‚tyâŠ?½TÑÕm v˜eÛ•Ñvõ£ñc$^»ÊÑo9„/ŽøŠ]o»œ.½McÌrè])À6 ÓƒíªsøRb¶«Í©:_:ñ»,+ñG§KµiŒïÝ*·ËzøHEiºb¬]¥vÇÊrÛõ9pÖÜÛ®||Å.) ÖÙ‘c§Û8åv5¦ž/©¨LWŒµ+¸ßRâ¶‹–ô‹ù²é‰ÏØåJ=ãk·½”Ûd—v4ƒÿ0cn«†ÚØ0Ô.y ÷¾Ü`µ+â!ð¶£iiþÁüÑÙ2³ãÃv ¢1&¹í¥Ü®UÀ{Ão@敯WßI1ÃêÅH»ª_ÖÙß1¬võl5í­ú[îH>u¹6[jn|Ø®M@^·½Ûå˜"7BV^§´uÔqtÒX Ú´8ïø°°Ú58goÄÞý2RzþÝõø®]íiˆuî»)¶«uŒ¢cøþ´J’4Î&h+íúȉr4Yí:,’“¯÷–¤&ÙÀq¶ÔÜø¬]§€; Ü÷Sl×8à^Iª¹-ý•ÎSX%r`œ]Ýó ÞœvýŽf+IÖÙ™Íé,ξáJÍŽ¯ÚUf û¦‚ŽŠíÚl#¹Î%ùÉgëš*äÁ0»"¯©~N8튡U—¬ÉgªÉgýèÙ‚+5;>jWD*É5®ˆ”šºæIhw†o®Môw ºL–šÿÂñDí¤cýŠ1Ê®€À•*ùgœvÍ2¤àž­ê8íÉ•™ß´«ÞÀÝþEý'Jˆv lE—_~ë3?׉Qv} غœqÚuXÜd_zU®|zâ vÕ;z©x¾-â;óFp¶èõD_%rÙ:¹Ž¡ënõRÚÕïÇ×TZ¶:B®•0ÙÜ–Îݱ«Ü%àR׎Ð&÷¶|làÜ3¡¤·ØŠ"R÷³ÿçþ¡¹­Oa".Œ.©Þ ν½Á.©bâqyÉÕÜC«Â·玤JBÜw ¼ ,x}ÊAlÉaŠ“«!¸„ÉF¸ô6Æ®¦Å=›{Zª?›Z–"R/ν¿&›¾`­žÂL\x¶„Ûï²+ð »<áUz÷ïñàû¢Ð®ÖÔ-JNØîò†6cìj\œ]¿hN}XD‡*k¬fÚ+Õ³Ë2)y3Á- G>nxMkæ*y@¬Ü(ýª5›Þø–]åV׺{¢Ð®À6G+˜/}êqy:`Œ]Τ×y2ÅÐ|ªÛ[“é}&­3ëð¤ÖŸ²«áIZ¶Ez£Ì.ÿ,`’£yH‰G<®O¼Í®ùÀiGk<ð³|l‚<©uÀ—ìê{¶= Rf—¼íjoo•ÍzÊŒO<.P¼Í®ë*`µ|œ|Á'µøŽ]þŸØp+Úã0evMî•¶·ž¥þuéØÖÖÈã±tÀËìªR¸«M¦ÑÁzrKf]ð»*Ò¯cždUc·qÊìúØíh…ÜÂ$ɲy£Öе>ì=™STþ${«µÅ°ÙÕŸ¦SÏÑLâé0ðAU–ÌÌ´·ßó¹Tî.{kX¨ƒ˜Ç®C( ÷ (²+ð60ýQ{±}øn^3­kãÎS}X׸bØìZ\|Ô옇$Iª{9‘%13um癣˜Ç®EÚå~ΊìªL73ÿÛPîö_š3HkÁYa&»’ >íÙÌÏoO±Ý÷Á•uA,‰™qµk©£˜Ç®È¸w]êþ{­le8ýè{íÒ£¶[ÕNS± „ ušk+C‹Á³ùkw0¥BÁIûåÇÒâM)—$=ïù“æ9æ±K-Êìž>Â.@/ÔÚ•Ja›ùËQ°K`VÂe»:y·ˆÂþÃ_Ž „]³òœlW ÏãÌcWÙlÜ 4º ~ývIï¤0º (ÔÚ5‹ÂÒøË¼»]¿õì±êbWg†mׇ”ãOjƒ¿¢à® ÐŽ‰ì¢O׬'¯T£â.ò$OöòdbÅP»hmUKÒÅ®é@¦EuaRèÞ¼ 6x$ÿEcÚ1‘]+a«át)ªs¾¦ŽŸÏXñb¤]hñ+écýp+ÔÖ•ÏiÚ––RÜœnìR­hÆDv…nÙæ|IÞyuäÈ]“õàHÄŒvÕº$KúØš Ä©®ÌAx®–'30 ÈÐXvLd—d r¾2Ë®!@NyŽDÌgW@:p²œ¤]Û.9G¢úðõ@Þ3KÐŒ™ìreUW™#Ñ`Ÿ£0dkVÖêjI0ή¿Ù-ä†vM.;Z–èïnÜߨPEèÖtW÷ˆ±ÞK}8¦¶+ä6p–%Ó`†½Ñ4=3á•×Ï `I«Ã슶¶·ô°ë¿Àr{£æ¿¯ÍêÖmÿ岞W¸¶]*ÂòiLwösõá<˜Ú®QT܇‰êÓ³ôöË<6Š*Žã³Ýí¶´Rh-…B =T9 H<IË)†£5B£@Zh8#Bˆ­„D þa AÁ‹ri*G”#X*4Ð˺½Ï¯¿Ùni;Ùîì{ÓÙ’÷ù£ó{Û÷ûîïÍÎwÞï̓ù•Ÿ„H/Ü0í°£Ä,wÅÒ¡ë‹34À]¡tdZ&SK¿è# ¾èéÂV ü¢;«M~pž!Ÿ ¾ì®>†×W+«€:ùص¤*™š•«´æùJ:ÙrMæÝ*gti¡)e´v *Ü a”µ™Ía°U=$ic9s±¬ ÿÉyÓKh…wÑ·Î^ÁÛ]¹À¡æÈ’DÑéçžÞü 3Eƒ¸:õä#¥‹>MÊçØ“«‘¬R30‰Qv8iÌuÅiRÌõsvÖZ™ù¸Ã:SMªä;ÀáÙLÜÖ¬rÅo‹¥ˆ3z_Ô[žµèKÑd/ÂIJ~G¿n}† U´elš¹~gÝ»âjq;È[3j«/Ôže-•Äëüçi“*y³ºa‡g3=rW¯ÿPÔ·e^^›Sž¥³¢l`ŠÎM¢Ê‘gÊ»4¸==̨¡¶`ØOHÒú¶,^7ÞÊ,É»b6Ó* ê|ŽÏ:ÃøµÑ­ƒðEë¦é]ÙD௭K’¶+¸‰ Fá™»X±d£á9~r!È à''C׸‹¶®}<õ«yê FÐ%Ei?®‚Ù(ã)(@—¸+Hã«8²™|î„WàˆÑßxg­œ5×£ngI€7C’zýëQ5„·¦í ~æíX Û1È5üUŸªÄrþªA÷â¾· »ŽÈ ݈…(Œ2DxNX º ‘% ¯£tiÆ( ÝËq¼k”vÿ¿òŒÒ|ŸÄ²}V³kÀ þ`áÄ›| endstream endobj 119 0 obj <>stream H‰ì—yTT÷Ç™a•Õ¨ˆZ\×£H¨ˆKzŒžTq)… ·c[%•D¸bLTÐØä$TÄĺ›Q\š˜Ö=cqCŒ6î¸#ˆÈ23ßÞÇÌ›yÌ{t†‘ž÷ùÞï¾{÷ÎïýîýÝŸ‹‹ŠŠŠŠŠ$ÍBŠŠŠRºÞ1sv ***ŠhœR ¼çì(TTTdÓ'ýË倚¸** ‰³LÒž©‰«¢ÒHøñŸ™3:îTWE¥á¡&®ŠJDM\•ˆš¸** 5qUþ‰líÇ‘Ým+µ‰ì(! Šì®©³_5qåâémSÉ#2ܳbQá㞦Ç)§x_ ½ŸM­#0®õI7;×Õ±š¸2iy˜kSkp>¬¢qÑ3µÎA„ÿ>àÇNp¬YfDaŒm½6ÇÓ­„Ò¦:à?/Öѵš¸òˆ¸ cº»M5Í<=ž%ÔC<νÝœƒà<`ƒ=F¶¿0Ï­T0dµèÖwE9ªMžTäÒ‚š¸²UŒò7di¾V ,vp4Nd$®+ÛÜŽç7—€/¤ÚÏNÃãâv’ïØ2”Ä+p칋ò¶±<]×,àŽ¸ä¥¥1 \Z±sâ6™>ݦý²ÛŽSJ7´‹‡ƒ½X‰­Dùë2uc(sSŒSÑ «R³ˆ¸¸aÝìqÞÕ‘Ft‡Ù*Î[÷Q;ŠPMñöòfÚLÊ›x^ \|A®²k6p%H$^<ê¢À§;'î,ÓZ}cÇ)Eô\~Q_íåñö®Žtd!¬Æ8ÙÚƒž“3 *7tä »¦«ªþOtcÝœR&ðs#‘tÔ%X9$o¦o•%n¢E¡òÕÝÅûu#pÞ+ð[´\’ ÏÎΉëѳç4úùsì8¥€®» œO’æ8Oš\UÖýNÊ^qX4NeŽX!Û¸Ÿ"¿ŸS"GU£‡PèËžxvrCFÆö\=Ë›ŠnœX-Ûq(ÕçÙÚD»‡À\‘Ôÿ2ð)W05Кggÿ;nù·ï”V4ÉeÌo(Ü“‘±ñ¼‘ž*Ç8Ê•Z££Š.v멇òqT4ÎD{–ÓKL{Â|Š»9_æ1ŸBŸè„ˆïHlàg(œËIæƒÌ/v°¼¹¼Æ¼õÙŸMó°W®²‰ ¢³HMk7ˆ;qÔ`IzñÍ쟸)ÀcGÝ>=颀ªu/›F]¶0™û[ù²0(ï®ÈÂÿ:°ÂAÑ8•>xÂîl·µL®n4¯~H6m?ý  ÆgtsUŸóÚG^Žu<¶ž‚F™Áõ' G,ÞFͲò+Ÿýw¯âJ$Ÿ ú"¹Ý¬c¦¹9á(gf|n+´I¤\ïf[­Áñ Ö±‹iéÏö¶¾¢z )#GÒ¡xS(ÜE¡Lu°c·K@¦R£ßQ`}EÒÎz`¢â잸n%@Š]gäpØê˻ߌåÍÄ ¤¹Bm>°É!Ñ8ïGˆfŸ¿§Ó#€óN[@»²·„‘C¡÷ª°½‹gÎ[›–­&.ߪÓmX<¾¥ ÅöñÓf½!tB®^ÜöÚ@“‹ut³rS:—Ý7‚–í»ÎÈ¡ó£ø}ÑfÉÆà•¼N§Û¸bJá›—fÿM§ËßL(×öOùTGofGq}xéŠM ][=ïÄ¡@Ë>·½s’ߌ~NŸbX=Ôø),ùݦֳ‘ þû©µ7stºù,pË1ž b5"îë?d™”î¥òS÷8°Ky¼Ì¶÷×ChþW•Ne÷Ä¥–é‰ðÒa?¼ùãœ×ëÏW-&ÇH;>Ï,®ÒñÎß÷ -E™ÖÒ3‘Jk{ÅqÒÙT‡tÞ9€ÖŸ/ÿåf'$î[”­²YÇHv à’o’ö ÇxVepÃE³Øšß‡ý8t%Á8åñP;ú¡Hêz…I¥SÙ=q)•öÛuÂÚp@ (::]\z_ä}˜ÛÃÙíŽpÄ•+¬¦MÏ ì‹ï€#uˆl-ðȳvÏ3­ UÁ5¾Ô^§Uk[Ñ0P¿~T]>oØ89¦3Å9kJtDß K>šÄ½H<‰Õù˜IÜeÐH™¸ü$³%>áÌ ” —,¨+¾¬IWÑa'¶ ”T‚.cß3ÿgxÛ4…k‰½+Amü ’i5¢Œä—–Œˆˆ:õ«‡œ5ï}ç–ŽŒˆHüë]z<äo~áËdzîü؈ˆá3>û•Óº4§ÚüÇ:DÆ´?Ãm«5(Þþš_N¦|F#†ŒHJè#¼Ú¿r`‘@Ædß*æáå”í§Oç,Ý”\\|¨úÎÒ.x¸ÌjÊKÜ8\ «h&T-¬Sœ°d;Ÿöc“~PKÄSÈE'‘tI‡ÖbÅ'ÄL”mX+áœÞµÅ褞ö™µ†”I¶gQô=‹&±…ÍgÊöü ¡úÚPóîòJfj­›iLço<»í´öW°Ç8uÊè.áÚ'&)^JÎâñX­ì×Ô ãìE{MVgè,›Pã˨bQó¼ðб¢ –6©eV¿Ï/Ø&Cºyy|F dɦNyÀ1ó¾6n š¦ã’+ô2oaâÞ¿UМ.à¶Ñ.þTÎç‰ã‰=ÅtÖåkü-’€þå5”ÞÏÙySYX)ù ¥x5¯€Ãq¨±\qƒ7î_1d»Šu‚¾²ý©Î~`Ó•ëÔ§´ _ˆä7©MåÞ_ýçšÖß®·?s6Q_ë#XÃÃÒd…b×­³J™=‘e¥nç«ì lþY¯«vvŠãlá±ZR®íUÍé!í"ô£c"Ý3ÂRÞkjË4‰LÞnáŠÜæãØë.Ú¡×pË\¿}%:í·!‡Ñ’nß§cPØbn&íîéÖ»)n÷¨,NJM'L\¬»(˜†é–sDšûþõx>•­¼×”§ãJý_¶Øóià°TDõÈ·ìwtqN—½+Öy_Ö·êW‹/ïИw/0Z;ŵxíò)«ùÀƒ–\Á#ô¦­\ ÄJz:|-Ž}lޱÂR„;UÍàë,ôµ4²cqö&+ ­Wí€*9‹ºSʃf–¤íqZ6ÖJ{y‡D¿óoF¿Gü sLE»C†V?¥å‹íd„]ÙKri˜£PFÅî[ ßÖ²eä»WiøHÐ.§·$Îqâê¬ï´Ô¬í¶Œ˜c½•À:à„5Þæ3<¨,Y uαçLà¡TDõ‡W©¹‡˜_:IãÒŸzÖõb¥89[ìiÛ$ßf7Zé;ZÑÛ rš%eöB0‹/ú°§ú¢W&|ô@šP8ÓZÎËØšœý‹;_ij¯=r™Áqf–­¿ì.ÒsÿUΪJõ1š5’ª†7øjþ%è-²z»Â¬þl!wç…Þ€a*;˜Ïž'×K¸ï1Î65´ƒT/ö eTæ  Ÿ]*ß­Û)žÊ8 ŠA”¸ã9/¯r—V¬Øo¬Ù\ψ ï—´6`¢I¸â®°!È¢[œÀÒÅÔˆФõI?Š ?Õ§EÅ‘4úšF+$´Âe|«65;Éd÷̘֩M/^’2K¤D÷ã‹FP1¯¾íP¾ÞB¦3M6Y R‰g{¦Ç„üàº¥ç ­j…Áòùþ“³oª]r5ղޕS$4›Ž¶½¨ƒ¤Êúö%–,ˆˆ-‘=ùöÜ÷~Ë{ïÞ÷~/ù%>óýã÷»÷{Ï=ïÜåÜsN¬–£—6;ÿ˜³Êô¦°Œ¿«Dr)'ÛМSÇ9n¸bPå¸[€TÍäѸ7ܶ»áG$9gPödí7Z¾à`õB3Ž}œø€B¥¯ÅsešôFÒk—[ö,tD…¯›p£û€‹ü #l¾×PÕ(t¿ÉsHÙÍáU¸9¬˜ÑäÐéˆ •›¾³ŠÐWj­½¢õhæû®×â·g+ }g¡ŸÔZ}Õj0¥´èZxJ.þ“!ýþR,·O´œiÎï|-=€k¾N)ŠŒ,ËžŸÁ' î  EûZ’*ˆZ€ój™‰’Åç׿ۥ¦’æWY†©÷ ð«Ze`úͦŽNåß)éÈànÔhRËßÙÞÄöæØÇ‰=Ì9|VÈ~k ^µ¡}E|Å“¡þKé ¦iœÔ‡’õѤJwùZò ÝSV !û§yÞQ¥¡ÄF¨§,Á gg Ø_£B.zŸ™[Žc¦³3JN à F¸­× ëå3ARÃûVû«‘?E(×ùAZ:Š'£Ö‘ϵoÝpÚµ‘ ¡XÉuü2¸íwþô™ÙZ’9®úü—ÓZ-´ÐQœ[ÔÊÁšw\JÐö©5ŽCE¯iÁ6ú­vgó[¤¶Çö ¶/Ç>F0¯™¼çj¸kÑò@øqZðFµç>EÔ»"á x[KîJ§“ìGù`ÏÎwòM.ïöÏÚ¥ì&×§ßOnûX´ «¼Âä:táÿ0Aemqú]’Á¬ìh—j ÝäšàOˆÊÍÁ6#5 i§vÈžk¥¬>[™~äùYÆæÖ+{:îe"#UŒ¨¤:ëL6Úk$wwÿϪî9TÜNÌ®ÃÙüê¸É€/3¶òöVª£ÎUQmõjË–°¥ÅJPú|UnÕú,×q–·þjçwP‰ªñ”'eqµLù8n´úã%ÿ  -KÝÅz„±¿iè(õ¼îâfùý{Š1šÚs*Á5Ò–•¡—²Xy!´#fµV̳ÛçìÇ}Í–äºã¸ýÚ¨ºˆ²X¯¬âmfŽÛ”c™ãöá…> Ï­S;–o1£fT¤ªâ{Y—ÜoÌî,ÛQ–,¶…qÞqëj’â_)}œÈ/_.ìÜ‚öc‰{,–IYµÝU+Bµì Òš7iÖkCO¤»8Óôð•´e­8Ú´¿(‡˜'ÿë¡`“ÜÃ`–‹åBZbDÙ‚GP—ñëÓØqŸ’ÓóŽ\qaÚ\ËÀâ6Štt3œY<—vÒ[_èzS3èi~EuØ# —`xô>ëÄËô{ôÀNO5Â75T<ëwAxH„? g½ ¬U1Ãhþ8»ÇùÒ…1ï¸ýi°“JºBy‹2|ü –g‡ ÕU0&¹r¨< $°¯î‚Œb¶©³2wëé“8¡bASaÙÁv»šŠ²kð’^)À\¹IaúkC|1¿èUÏår/F­XPôšx( Ä̦~§§yµm»¯ð£Ç “è*ð6éO¢¿`½j„9n_Yá7L˜}5D8—5—|Ü­®$èÁFc»{иtkÍ;nh‰ñ[`± @¦¨¶¥@0žc­÷¥†ê* À>¹Eao/û*ªÁ‹u¸câ¬ÎVã'¶áBéIôSãK7á¼è±ó:U%ðay—n?8øMÀ%‘„i™÷«hšxY§4s)™D#xl3±©¹Ãtôåa‘ÔˆæñÃÍñ¨¦ši²¦²Vh3}`kœÔ:n{ù£Þ’¼Â]C§ž ¢Än´–Œ€T¯9ð ùÊ•DpoUw = RüãZÎqz ’Ð_\r &­|]ÅöG72Ÿ®­Ëvã¼éáøHnRÄ•.Š"A_×GÕHdÂç8 ©,ÚÒÑá95÷ 4…kµø­Ò4 ÌPšñ =ÎrT쬜àIqö-¹ÉˆqàLÅJ[é&°FÑoÕEÇáJ‡d¬Òò¨çzWýõ&/´‡DrÜD~øc|¥aæá7Ml\@[õ"kÍ R9Rï„qÜ}œvs$½`œNãO>–¡˜Ø†Î^ nò –Âq—RU ¬ÇìèS¢¼¸Á¿BSÈÄšéÒ¡æ)à›2yn;ZkW¹ù@>)ïŒInÛ£ÀN åÏJÓ‚N‹Ò¿íD.unkç³RéEXËcGÌ Ü Ëgέá^Nã’0¹Ù˜¦¼ahTª}Í*´¤yÑÎ.]ƒëa†jÌ!ÙdQJT½‡|ùaéh‡­éè©¡bôhåQÔdÞ)—¶u2Qà|=‡Þ;y[Î,ût,g»§yµ´ä“”Ð¥w±uÂÑY¾£Ø ì({ŠoôZq ©] ÇíL£½Œ,ë¯ vxÝóôQ`«‘2s˜ÂrªAe™ùmHU¹I'õý½žó„û9Ñ6?¾èx²ž=Oý”`­˜ÿA¢ööfm¿Èxê¤Ë•PûP¤äÓµÆPLćò{rRf¶‘}ºþ2êÅÛ•ýÏ 0”z³’€EOrUG/ŒÒ5l1·HC$ ?æ6ÞsÔ8¡dèíp?\õÒP¡Tw 1ÒaMKÊq»¾ÜP„Íö QGòfø.–r À»–³ÝuáHè” mÜ,$<2&›üVë*ñRÙnw\ÜG¬9MæKḞ—µå€Ð\ÀF‘5m9¶E ð²‘2sø”-egYfR@Û1‡›#oeòòa/„„´_ÈüÖ‘ ÉÆžN>–'û,HÊ‹mDçv7[Mq?Ô€Òâã<Ûãœ(«¶Ž¼¨GÎ[æNÁv¡¹ÞŠIgÕUíD ÛèZl¸-zaÉCó,y\š7O—‘l1ie™™,°5Ÿº‡ø*­ŽŸÒ-ªÊÏ7 Â¾º"1ë´§ÈÃÙÎûâñj†sàH;ßd}žRë!g Tû!0ÙÀ¢"`{‘’öÎnÕ4¦µ³éeêá¹ßÙ/ûئª0ŒïNÖuƒ‰˜eÃv7ð“‚²i0óÆ QqYH‡A‡[–”±„D4Y‚’À¦d3‘L4HÆn8]†ntDbBâLj0eƒI…B»žÇ£Ø{Ϲc÷£­©÷÷×½Ï9ç}ßöž{ßç Tw «èöÿâwéùAö…™Í` ¥'¥â»ˆ³€½þ§gÄ9: ä>+]‘_›-_d—dúrï• ¬¸ˆ¶­ešÅW«‰‰‰.*PïLLLÔbY’ïLLL¢Ï? j§C7 endstream endobj 1 0 obj <>stream hÞ2W0P°P0±T°T044R°±ÑwÎ/Í+Q0ÔwË,*.Ê(éû$™!•©úþ¥%9™y©Åvv@ Ž@½ ™€Ä¢T Nsˆ²Ì’œTÿ‚r2RRüJr’€ì" ÏH¬Ý%d1H[fI¬~°¾{~H¾@€›( endstream endobj 2 0 obj <>stream hÞìYmO#7æ§øcû¡»Ûã±%t\_Tqw©¢¨JaKQC‚¶¡‚?ßë3»›Â­ª"ÚqÆ3gÏxCLÖXCdœ…pÆGo‚cCÁ Ɇ ¥¥ç‚Ãã¼`2ÇÑÁ¸¤Hd¼MFƇè`™1ŒON¬ð°‹ÓpÃÖ4ö‰ T,Àó2A’á„Iï ÷YA gÄê’¡)&Z]4AÈ ™’ ÖD²Éš#¤@z’ N!±nˆ&z ´, cg(j(+ ¹3$«–i…eXXzµÌ+,ýÂ2ª¥[aé–Y-ý Kê,%a…¥]X²Zòã–qå~ÈÓÒ”I.ôÖ’XŠ„B¦" \)¼ó£ò‡ééÏÓÓj:Gì©`¤º(r0ŸT˜*÷'³“¿Ê£ù¸žwÆn³ÐÁ°»Oöæ@Ú¯<ݯú”>u Þ…u>mtÛßím·q£ÛäŽÚ›´…O{ñÐnEÇsGâ£>íÝ„N =ä«»’[؆gØò3lãú¶ü‰‚–Ε¸ö¶ô [·®ímù°·EÌt[>8[NªýêY][ðýòITx›¨½ÉùÙ´| uU—¿ÖçóóéÙûÙiU¾«ÿÌ"þn>µHLôŠqÙäÃz‹ÊEŠñÙ‹xæ‚xÍL<Ç"…çg(­Ÿ‰Ëþ‹2 8ÔˆÖ,aç]‘Òº%ÜÆYpø Þ'TX–f=Æ÷\©àtï,Æk<Ä´æYÜÂ~É÷‚L½¾X|öhß*ŸTþ'Àe¸b endstream endobj 3 0 obj <>stream 2011-01-27T13:43:57-08:00 2011-01-26T14:24:57-08:00 2011-01-27T13:43:57-08:00 Acrobat PDFMaker 9.1 for PowerPoint uuid:b662ff29-9cfe-4270-82dd-b5b125bf51b5 uuid:5d048f45-8eb3-4ecf-8bee-de4e05d73c2c application/pdf PowerPoint Presentation TID Adobe PDF Library 9.0 TID endstream endobj 4 0 obj <>stream hÞ240W0P04°P06W°±ÑwÎ/Í+Q0Ô÷ÎL)Ž (Åê‡T¤ê$¦§ÛÙa(24‚( H,J ƒM BÑ`ƒKÎ endstream endobj 5 0 obj <>stream hÞTÎÑ ‚0àWÙ©e†Ò‚„]øSÿHªýñ7 ß> ¡º>/Filter/FlateDecode/ID[<9F1EA94298D34A4191A1D95EF0F20284><5B4FE39C008A294885EC2B38BBD3682B>]/Info 109 0 R/Length 60/Root 111 0 R/Size 110/Type/XRef/W[1 2 1]>>stream hÞbb&Ƙû L ŒÏ[?à7qW€V lÏI ‹F0þCáŽÑ`Zîÿ£ä endstream endobj startxref 116 %%EOF hypre-2.33.0/src/docs/usr-manual/figSStructExample3b.svg000066400000000000000000001655301477326011500231300ustar00rootroot00000000000000 image/svg+xml01230123 hypre-2.33.0/src/docs/usr-manual/figSStructExample3c.pdf000066400000000000000000000402731477326011500230770ustar00rootroot00000000000000%PDF-1.5 %âãÏÓ 310 0 obj <> endobj 323 0 obj <>/Filter/FlateDecode/ID[<9F1EA94298D34A4191A1D95EF0F20284><8E30101C1D97894B8E921816B3FAB23C>]/Index[310 20]/Info 309 0 R/Length 72/Prev 16235/Root 311 0 R/Size 330/Type/XRef/W[1 2 1]>>stream hÞbbd``b`ªŒS@„`N‰­»@b;A¬ B $;b™‰— LŒŒG,Ftâ?ò?㘠endstream endobj startxref 0 %%EOF 329 0 obj <>stream hÞb``àf``*fQeTÀÄ,  ÈbÜPÌÀ¨ÌÀÅòÄIaºjW¯F \þZ¨Þç@ÌÄÀ`0H3Í„›ÂÎÀz¢Š‘ À û l endstream endobj 311 0 obj <>/Metadata 5 0 R/Outlines 9 0 R/PageLayout/SinglePage/Pages 307 0 R/StructTreeRoot 12 0 R/Type/Catalog>> endobj 312 0 obj <>/Font<>/ProcSet[/PDF/Text]>>/Rotate 0/StructParents 2/Type/Page>> endobj 313 0 obj <>stream hÞÔUßkÛ0þWô¸Á‚dY²l(…&[Xa+c ë ôÁKLbHœ»lýïwwÖ)¶—¤Ûú0öð!ßîN§Ï±6B‰X[e°$B[ «‘‰cøHE”$FÜÉëÉdœ×Åtv|¾¿¸Wõ¢¨©XËIþð¾(WëF$I,ß­i+'§›|U‹,•Ó]Ռǻw#kÙD¤UBîÉ:Í·åæéռܵ¸)¾‹Ï»m^½&ÛM¾-$YÀ@ú7ãÝfyÝä›rA³f_4‹µ¼Ùí·ù†T·mNN)Ù:^U«M!F‘“³¦Ø~Œœ?=äiïˇf·—_}5ÆÆ——P+.ý >ÍF‡>Îå»j±[–ÕJÞ–ÕUU—Až–ûº™¬ó½Pƒ“¨ùÐPù!÷pröø­Á¬æûÇ‚Ò 9Bèe³®ïœKÅ¿„¶07i&, ŒUŠÂÌ ãüÈæTë2®hç=Ï!Äqê:Kè¹§uïó üÀ—ôQ$RɆ¾ ók“žŒ~¼AyûšøüPÀÖ ‡˜Ú÷eíû†ú^}pB{Æ œ8Ú ÄÑŠV>stream H‰¬ÔÍJÃ@ðW™ètfvfw¤S$ "Š=(ˆ¯ï¤ê¥Ù6‹”BØó‘ÿúöåùóã ®®Ö»án ›ÍõvxŠ‹!e1Ç=¬‡‘`ã5ŒÃ=|ůpøtL5îo0ÂÜìâ”õÑñi~¼æ:DÄÏŒ)xBK|ŽÒ“•\œ²FU¬Ô„È­‹Zl^nU”A² WuÊ …°3 Ji(E¢oŒî^‰û6´ZÏQµAU=±ls"a†Œ’ìœá'Ê)‚){ñæÌ­‚r¾mLsÈ¢W))–ªÕ³wA«¥ù0· ŠmS ¤ºjäa-Žˆ ^ÿ´¸ú°iV«Åaq#µ‰bŽ¿–2÷qËãjÅC¬¸d34Ì\Ä5],&¸•d“™<*KêÈZ™¸+/V}h+5~ = ¿…*q«µÿE!"^°P±) “V¬.•JÄo¯o† endstream endobj 315 0 obj <>stream H‰¬ÔÏJÃ@ðW™ÈvþìÌî@éÁTÁCÉ#ˆˆb âë»ÉÁJ;´+”\ÉòË~Ùù8)|Á¶kšÁ%©¼Ãp»Vw¯/_ŸÏ°^¯vãý¨Âfs³mO>ÚÚy!dM9+zu`Óä¨Õžö°'„qjoÁ4>¦rd:&­õ,é©%5J=k#-!ºz©]æÐƒ2¨ÉŒŠKÉ;QI–Xô¬J*žŒ³y®‹JmÏ(}jÊq¾Z¨ AN„nÞÎGg¼CG¾Ÿ£¢ÄؤYE4Âöí}©Íq¼3ê2S2sáît‡Ëñj|’Ä™PiQ+yéÛéÐÉZ0/SƒÜU[ÀÕÚ=,—ÃÐÕ\NQ®õwjæ?lTé9E k»9†uć1ýç./ƒA±äT°¨k]@Éä(åz±JTF‚‡Òmh#ñŠ (aÙŸÚå”K­^¢h”.D+sÁŸ n- endstream endobj 316 0 obj <>stream H‰¬”MJA…¯R˜NývwAÈ"dŽ "ŠY(ˆ×·Q!i2‘Ùôbª¾®÷ªßz3¼ÆG ‚‰³‰g.œj!FÌp¿ƒÅ8!ŒSüÓx ˜ŠÁG”<ávCI‡˜à®¶ÑwqýôøþöËåb;Þl¢;¬Vë#"Õ”Y³k6NìRÝ­()CN,v–ª§TrNV¨`\@-Wôâ]P‡,Y­g™Ö`ÖÍBOÓP"ZÄ©O[ª3ÊæöŒ{ž¶D$î¢ÍYNqŒšÄɽÊAÓì(îÜÜû8ÌYë“X%™…˜Z´0úHKœÓO9šë7‡Û›r › ¡s0ųCý3Œ“‘F©1¶ìº\@åÖLX$IAõÚ2êò­×VžþYÏ}ë×õ¤µ#Ruƨ¿îº6ä0K¢jæÜ'áìSÖFrX¤åh¶÷Š;ÓÖ¬Ffá×îÕ0ë7›àS€F^nq endstream endobj 317 0 obj <>stream H‰¬”ÝjA …_E/`YÒŒþ ø"ërá@ñ#”RZê‹B^¿ZC)Ä{¹Y–Ä·:sÎYŽ@Çå ]á~A}"8Á&5~þ—ð}øùãåù;ÜÝmËãzÀnw¿¯“?5»2ôŒš¤U#øv‚ír$X®ÁJÓ«´¼¤)×Ó SµeØÍQêå Ié’Ô”QL•$AZ yDöPð O{©ÙP_eò@KÒ•ÙÒ¸+rkzÝLRåÝMÏÔ›’ègRÛ%UÒÑÉ55λvjõ£ý¨À}°ê êJu©Ø’õ9%ln'Du¤¯Ÿ”]ÏP ³ô‘•†±œ¡Ú€jíÿ­²c™—S'³æss3 êlK4é–ÕÂå_Ëœ«…Iê „V‰Õ«LÃzVl'žÐwÐD«•\Y¨|VLIb*üœ“n#mTI¥íŠL´*ܹ-§úÖ´º¨¥0U]³{eÇýKþ 0+!nA endstream endobj 318 0 obj <>stream H‰¬”MkA†ÿJwÓSýUrÈDA!¢lß‚Y?0¸¢‰²ßêÙe5N»3™Kt×So½U./¯®€ï@€öˆgÇ1döâ"%FΰÝA?l†]ƒÍð ØØÛ‹;Ÿî  :„à là <»±ØýóÏŸ~Þ€‹‹þfxq Q¦TιRE#t˜£e@‹¨„Ùç€þŸ2GàSeÎCC¡x—0 yJ¤¬œþg]cC¦ ó> æƒ›$ o@Ñ¥¿©jJƒ 9Ÿ…¦4Ž-¤>˜lqÌ>«Ê2*ÍÕ6·UžÌdvYx¬ó"`r>stream H‰´T]oA ü+~LPoc¯íݵTõ!i@*¢ÊI>stream H‰ÔTÛJÃ@ý•óX ÙÌì%›…Ò‡¦|¨XðA|j­Z¬  þ¾CnFšˆXÈ2»9s9{fg9!ËA@ž]‚”wxc9"ìåee“•†V‰q²º`k{ «Hûzç§iíQÙ$ˆÆzª­¨TŽQ7fÔ­ÒÕ[j<¨ ÷€Ù+,–Ÿ?Þ¿½Þa2‰—ÙÅL ¦ÓÙ\>­ðR:xMp– ¨k<Ë!—Ç k­2$a˜Ô¨`}tÀzÿçÜd¼—l~Pxüz­b>,¢ÿ¹ˆA+ÚƒMOLÄáÂORÄf⫎ˆ¡1. –ò‹-XWì5¬ñJ{—w¯ˆ}Šb»º':‘^G’²HÐ(6q?Ö5X­ÈÁ(W‚u?8mÀ‘EØ´ØEq؛҈µOw ½ðøÊ>  o´Ü¨»%l5ešåîmPZþÃC¡ù0±ãÐ&µÚ©$È“ô7ÑpQPQÊß§×=¼ƒmSþžøB _1W‚ endstream endobj 321 0 obj <>stream H‰¤”OkA Å¿ŠÎ…Kif!‡nÈ!…âcé©MÿÑZ(ùúy3Nˆk¯ÝƱÁ»xg~Ò{z³—73Ñêêû×?¿oéìlu3__h¦óó·xô‹„_!kžrà“ƒrË©ôûôéŽVóši^c­çwÄÉé;~Ð%Iþ‘é3 ÊЩÐÄOZÓ{º\.o åÅH-Rç¨ U{½Ç"Œ )—ÇÛŒFMê`ë͆Ii2,Çãò¾¼ÙÙ(i¨µ@ëMhø@©oÿk÷i¾/M[§.9ùš4›K*c6/Ф˜g×Ä9MÌ,ÑNÒTö5åÚ’…2Æ%5Žàr\¢¦š$•¶§27ä({„;pF¨pÉ[Í&Ã@aQÍÚEk¿ï-(ï½eoh®ÛgÉkcÖØ¶nl}‚)í ØPlP†€xŒX"зµhÿˆï1ÏT¢ÔÁ ©0öDÐ N)<•Œ,™¼Ú†¶`ÆWYjTm—K\ŽÛ€ò^­_d?öž÷|Áíôçæ 3î.òxÙ ¶%>” tå¬ ‚ŵpÑgÞÀ=Ñ6°i‡vÀXŠEN-#ÂugAJü5~€˜ñR µM¦Mê8ÝÅÄÖŽ‡³Ü„Ãìå~Ѓê¹Vó endstream endobj 322 0 obj <>stream H‰b``œáèâäÊ$ÀÀ›WRää¥À~ž™ “‹ |@ì¼ü¼T ðí#ˆ¾¬ 2 S/`M.(*Ò€Ø(%µ8HâÌò’ 8c-’” fƒÔ‰d‡9Ù@6_IjHŒÁ9¿ ²(3=£DÁÐÒÒRÁ1%?)U!¸²¸$5·XÁ3/9¿¨ ¿(±$5¨jð»%V*¸'ææ&*é‘èr"(,!¬Ï!à0b;C€äÒ¢2(“‘ɘ ÀIÆ8/ endstream endobj 1 0 obj <>stream hÞ²T0P04P05T0!S}çüÒ¼C}·Ì¢â¬B¾O"‚RYªï_Z’“™—ZlgÔâÒ’ H,Jj¶„¨Ë,ÉIÕø÷Ÿ!˜!‡!“!…!•AÁ¡”!—! È.òŒ5Áú]¢ ÀzÜ2KbõƒõÝóCòíì ¢Æ(Õ endstream endobj 2 0 obj <>stream hÞìY]k[Gý+ûØ>´wgwf?Àœ–ö!mb¿?ˆT¤Ç2ª\’?ßöÌÝQª®(^E1\4{W÷œ=sd®)8ï(ºà«#v1!ˆãÈŽ’#/ÅQv|pT\  Žª âáBŠ “.”À.}.D#‹ÃT̸$fÁCÉ1€³c!Á— >$äM ë ø’& ¾„u|©"‚/cQ¤”² ‚¯`]ŸÖEÀW°.J™ª‡GRMºI—=Š‹aö$Áe­OŠˆE“r9hò‚Xñ\r9΋¹Ì„d "n@ëdðI®„bà(rªƒàa—‹×‡• W ú%b¸¸â£Þ b_˜*„Í‚²/.$S".6J\¢>Œ)Æa\\ñeÆŠUI7x$a38ê’!– ¾ŒÅ*( S!7ºdE±‘rõ>¹ŠË£Øz…]„,ŽiCŸsläAq\ä•%&ȳ2 J8‡*”ŒAVI+34EH­â@0qÆ©«¸ªž‘®†s!s…ðÏΦWW¡j¯¼…`ã)E»g‹b1YÌ‹Å:LjÄ[$‹Áb´ÈÅâÌw=½Y¬—w›Ëõr©‹©™×Ë›WËOHjz»º]þ¼¸×vÖg.?Ý/§‹ÍúáÝüàÛÕjóâ6ôúáÃïW^»}ÞŒöûœ¥6ü¼¬v¼X[^¢=¯ƒ¹éuµëuP´íuPµïgB¯?æÞŸGA»EíÿyÄêóHÔt§s~ßý¶Xo¦nÞ?¬—Ó÷7‹÷ëŇííëÕÃ=&ÿ˜.no~Åö–ï6Ó%Jðrõq:_cƒ8­–ëÝÃííéãôñÿ~\_…R¾ ½]_Iþ'i©Ië³dMÜZ8µ6/K­ySëÜÔÚ65ªÔXRcÉ%›4–ÜXrcÉ%7–ÜXrcÉ¥4–ÒXŠ™Ic)¥4–ÒXJc±b—Æb­^‹Ù´¹´™³y³Y³9³³ù2™/“ù2™/“ù2ù­³™¯ys5ožæÍѼñ‘ñ‘ñ‘ñ‘ñ‘ñm-ؘ̀Éü—Ì~ÉÜ—Ì|ɼ—Ìzië¼[ßýìºÆ·u\óÛY{›¤H{3ao&îÍðÞŒìͤ݅·¿ewr75¶ý²í—m¿lûeÛ/Û~ÙöËy—¤oKâÚÏÈ^ d§$¶®Øºb늭+¶®µY»‘õYÃQë8´¦œ~™ŽdŠñè•GôTÿúj¯wž‰pv-åô¡9yر*ÿŸ†ïž¬µ<õS‰ÏÒ¿œòŸüùX•?ý«òÇÿcö¹Vþô3{œÊŸM箽˜.¦‹ûÅÝüªøåËÕÇ«oü·A\ûÌa®§_¦ŸŸVí½÷¹k¯*!H‡” Ú«‘C-"ZD>´ˆ|håÐ"Ê¡E”C‹(‡1´ªÓ+ç§7ï]¤½-é3m•óÛÍWþõ5ž ÓGí]ñ¿Qíÿ3ŸqÒáâ Ž;âb‡“A\èpiG.â|‡+c¸öÒ|Wq¥Ã‘æHƒÀ^14(™ÜK†5“{ÍP< ìEC2ìUCiØË†ò °× •1`ê…CuØ+'øA`¯œ@ƒÀ=¯ ƒÀ^9!{å„Aå¤^9aP9©WNhÊI{å„<ì•ÊPzå„:ì•ý °WN¤A`¯œ{?SqØ+'ò °WN”A`¯œ8¨é••#½rbSN~ ȽrböÊa?ì•Ã4ì•ÃaØ+‡ã pï/öÊaöÊá4ì•ÃyØ+‡•{åð rb¯iÊ){å {åHöÊ‘8ì•#<ÜûãXþ-À¸qÆ endstream endobj 3 0 obj <>stream hÞœY]·ü+|t^fÙü ’a†DÈðƒ¡ÅÚ_îŒÃ pþ|’j²gowVÚãêAš™®*vw‘œ™#â‘„TpPÿ—Â1æŠc \qje[Öq š2Ž(ˆ4 c ™ÁÇr§P|œCiàýšÀÐ2ø؈ GcS³!‰Ø°€㋸,F l#h\,΂-®‘ýHgŠÛÚ€²a¤dg8ÉÑn9çlÈC&µô«ãjíP0W¹q5KY[à,â‡&ÂM¸* ~4&EqÊ…@ – 2”ÕRFn¬V¬æ4F8Gg0gË=ƒ¹ )”Á\QuÊ$ZÞ9éãE&ÂVÜ\‚îS¶®T%–NˆÊJ18š,È;HµÁ ˜[´J€¹% ÎÖu .A£•­Tü¨Ü‚²åUá6ÂJAÅQG#¬TIª!,¥ÉŠYsÐœí ˜‹¹‚¹fƒƒ¹Ù48E3i3³YÑÎÄ6Œ÷еNjÕh)¤d.h9¤l.À¸S±V¢‹©š `àÔPg´1dK‡ÑÎl.0{eVë'Œ,àA‡CFø‘BNb¨2îáG ¹@a¦\;ª…Ü™Q‘Ò™‰B1毿޽BãmÎýc÷êîé«ÿþï/»1ÄÝ›Þ'»üæ:9"nvßß~øø¸ÿæÒX&q ¬s@ÌÌ °Më˜ã$°l4 Ì[ w`{˜¶@™ê¨“@ÙÓ$p뜜'[çä2 Ü:'×9 m“Û$pëœ'[çšnS&C[ç”IçÐp½ñ%žÞbeí•/t)–=¶öÔ _Š¥5¶»¶È¥Ø¸ÆvÛ½›Ç¶Þ·’.ÅÖ5¶®äK±Ûö¶1iä¥bÇm{[ž¦ut£òåÒè¶kÅ‘þ‹ëV”3$M"ù É“H:CÊ$2ž!u iûí™&‘õ ™'‘å Y&‘Ù{O±¯[õ嵂 ¦Þ€J—‚õÜó¯|)XÁ݃U.Ÿù‡Û‹Ùžùiyææ9d=óË$ò̬S3Úž/·È4‰ÌgÈ<‰LgÈ2‰<[S¸Î!ó¹Úòõë‡?*KÅë·¼$D —Åž‘üüíî»û÷?Ü¿ßß?áu€—‚-ìﻟÞýçáãÓîÍÝ»ßöÿÆ­Ý뻇ß~ßÝ<½{|ZƒoúñW{s~qÇìÇâÇêÇ6Žc\÷¿uo[÷­uOZ÷›u/é/…ãè|ÅÏËzîüÉã“ßO~?ùýìú¹ë¿µj®¼¹»}¿÷¼æ( L] £ Á àù{úž½'?r{Ô¹›Ý_>þáb^/‰WÄ âõðrx5Sýùb}tXŸ .4:y`r¡äBé¥9¡õð©g¦m~íšè¯Š¦é豕´ûFØêbßù¤¦%¶ÃùÉ6&º´8» ÞÓýRŠtâ„))œp8?Ý/ea¼yOï—à=ÍȾ­qK –B©ºØWÖqzšO2ä|>`}–á*‹}àÒÒØâsõ³ce»2§1(Ÿ%4¶U¢¡EJuÕÀéI&‘¦Eé‘®AT—½ˆ¨˜,'…bæ%N²Ûy3Z+4…eírÊËd:Û3yB&ëÈ!+;mFã2é£Îv4rT9úȵÑ'GÎuzäÆÖÉà‰{"?Üü‚×û=<îC\Ò)A¦¥–Üçï«»Û÷»oqyÿ¸ûåñöéöþÃßÞïw?=þüÏ­HÔy+Á‰ e:8„¿D¤ä+D¤\!âVåÅÖI©˜KxVÑV¬ROóU¶³!Ͷs» z–PX®ÖOŠ”ho³îëѼÀŒªÈDYºL²é‹³º±¥wr^;çQ&¹.õ ¡E–fŒ8aÍKœÎÄXD ù¬®Ø»ŸçxÝHÌÏòÎx$`[–DÛóìO)ò|v" yZÀW×#Ê„>-€wõic<]§¤/ÙV"méùìÔ´:-`ŒÛÉ×Ú‚G‹¹É'˜9UÛ5“/Q\ìk›(- /IÚû9¬{Z¨¸´ÖfMÛY `¯h­Íq‰ö ÒÌÕãï/'[*œMU'ï¦hxW^”&‹–Wj»~YLåôÛÂÅe‘0M|­ˆí±<+bBô DTbÜ”£\eNäÿ “±¯ endstream endobj 4 0 obj <>stream hÞìZ]o\5ü+þxýqü%¡J ⩈ŠVâñPš¥Š Š‚Tþ=3¶w¯"ä¶wßxÉî¸{gìsŽ=»uÖ)£œõÊ‹WQÎ8¼åÇkTb2^“ –8«h‰‹JØ•°³ªxbÏZáˆ(ë„#AY8••À‘¤lˆÉÊÆÈ‘¢lJñFÙœ0â­²%s³2™#œFáˆðŽ儳õQ¹`ðÇ'å¢Åz8•d9R”˘%>¨\áÄb‰–:å­Å0¦ëáˆ(ïA|Á£•—IʇBž¬|ä|¤(Ÿ8Ã`”¯s`. <Á1z`ƲÅfŽˆW8”xòD¸2‡¤$2$®"%™«ˆFIá*¢UÁpÑ!Ž#^ÉEQÁ31¨ ‘¨BŽ y1p$«GŠ ô. ET4xÔ%‡ cØ! ÑqITô\@®"EWš’Š±~u‘ð¨KEÅl£beÎVa5–áWÉ2ïVb\•<Âæ@š¡u9ª„ÙãMR)2qŠxÔe”\b–¾”XQ_JÔ*`Î,]”RææÌ•0gLÓ!Ä)³Z ˜‹åS`.µÀ\"ËÌZ¨ • ´XÙ „¹²a9Á„Ö£P²Á4=R•-6É×_¾½»þîîúx÷ˆä8üpxõîïû¿oþ|÷þxuüíþᨌ‡7ïû‡Q”:áÃo_ÞÞ|¸;|ƒáãÃᧇ›Ç›»ßß_¯ÞþúâÅ$âE´[ñ.iù fÜ’ˆX_—½&ruuÿñgôA¼¶¬dStÚð/ÃT‚5M`›Êë[LåüÓáêöþýïsPï&d‹Ó ÛÕ­¹…m)ºlxrF)kBwʱ E£-KÎȈçí–…ï(”µI Rdغãˆg!$ÆåU¡Ê» y<ÍÎBånC›Ô²áQíR‡±\þK¨óBÎëÚ†œÓmX» OBuâW…︢¬Ù!qœÔ•¡uŽxò’ÕUÞQ(ê‚ÆSJ'´ïeijPÐ&,‡®òÅ€ý’Іl‰(çzŽxÂéË´-Cã6,VPs"^ã¨@r#žV”ÒzŽ:ïXÞ-ù6`7æzŒxZ‘·ëBwXBÅä3T‡¶eÄÓŠ ½\ w(lÌÂÓ*°5!t1 #œñ,$:¯öºÎ;ùT{ˆqaE¡ Ï9‚Ðj 꼃`‰$fJx eÄ“Ú_Zj¼£ÔÞ†Ô”l:7â9ti½×uÞ9t™½Íb£â†ÂЙ ? ]Yîuw.†qJ­̆ŸCYîuw v0{»6»7;Æg!l±å^×xG!Óz›ã‰+Û€çb°ŸÐëï°aQ^ìm%k\Myÿà$Ã2Zítu–© §X]`¨3à§Bë.=i@Þµ–Šxú)ñnÄ£nÆŸrìÉsB±¯@ºÐÿ[H>Eh(ØëÕªà¦Ï‹›9¡I„ÿ°&Q7®Žýp‚»Â­#ŸÐ$€Ò[Lepn‚’)Àä &zƒÎ½J¾‘>3$ì‰ôÖñ fzY OåÐiÃ5n(\tåšËÖèÕFIÆA ;RâyáÄeLNhÀ.. qˆI÷k½îFg4 Èj*ã(À óŸ鳜ÁLW3Pù†[2ò®àHƒs,ó¶˜b2Ž•'%Ê ¦Žÿ ¦ BæWçO¾aþ£ Rž¥·É.Ïž|côÙxg ü.$æ Món=þf8ùJ^O¿Sê¾²ãý}¥w¸cñ‹´î+;ÞßWzì‚À喙¯ìx_é}ÍJw•]ÀS† Åž²á xJ4°œìæ)¾€§ÄÕTRÙ#ðÅŽ’7Æ“Ÿäû}ÜäWØúAµ¿ÉÕ—À¿0÷]ýðËúCµQ?Þð‡Ò»Ïb(ö‹^«úŸ:*ÁíÍõñÿÁµÁšÌ¤¥ endstream endobj 5 0 obj <>stream 2011-01-27T13:44:18-08:00 2011-01-26T14:24:57-08:00 2011-01-27T13:44:18-08:00 Acrobat PDFMaker 9.1 for PowerPoint uuid:b662ff29-9cfe-4270-82dd-b5b125bf51b5 uuid:3571a9d9-5570-4e1b-86d5-58e7798efc8d application/pdf PowerPoint Presentation TID Adobe PDF Library 9.0 TID endstream endobj 6 0 obj <>stream hÞ260W0P06°P06W°±ÑwÎ/Í+Q0Ô÷ÎL)Ž (Åê‡T¤ê$¦§ÛÙa(24‚( H,J ƒM BÑ`…ÙØ endstream endobj 7 0 obj <>stream hÞTÎÁ ‚@Ð_y;uQ3£V"H ³ðF}‘Tóâ5þ}R´¼pïáF2 Y&ŠÁ‰ýúPbG·»±ãëÉ–Æ¡_nC©”TáZÅa¼Ú,dâIéÍ­i_´Lq Ë}e.È.œˆAÓYSo] *êþµŠâX%_M3uC‹×Qƒo Ž}ÆÇÉ“¨{wEÿG‚f| uŸ£Až¿7â@­ endstream endobj 8 0 obj <>/Filter/FlateDecode/ID[<9F1EA94298D34A4191A1D95EF0F20284><8E30101C1D97894B8E921816B3FAB23C>]/Info 309 0 R/Length 79/Root 311 0 R/Size 310/Type/XRef/W[1 2 1]>>stream hÞbb&F 7&Æç@‚MHplì5@‚ß $±D°Õœd100ÂÆ(ÜQbŒsGÃ`4ÎG‰aB0-‚Gò€æT v endstream endobj startxref 116 %%EOF hypre-2.33.0/src/docs/usr-manual/figSStructExample3c.svg000066400000000000000000001215651477326011500231310ustar00rootroot00000000000000 image/svg+xmlpart 0part 1part 2part 3part 4part 5 (9,9) (1,1) 0123 hypre-2.33.0/src/docs/usr-manual/figSStructGraph1.pdf000066400000000000000000000057001477326011500223740ustar00rootroot00000000000000%PDF-1.3 %Çì¢ 6 0 obj <> stream xœíZ¹®œ» îç)þ:ÅDµ>ÁÒ%.TNîØ…“"¯.ùKãã.p‚Ã>ÃÃ})¿^陯$ðóÓ—Ç×ÇÿR¯_þÅ?¦üøxåt•tý•Ñ{äëOü÷ü÷·GméÊ9—g½¾<øÃzökÌúœ×çÇþÅäO_}òÏ1 ºÖÂ豊ò–Î@Ïeã4IÌØ„¥çư¤]ÿ~MÏôT1µBhÈ1ó4àFÖÚÍxA ÈÕĶU; ¨ÌŽeqÅÑ7|™}Çxã9–by ù¼±×&»7Þ,_UâË ¸‘e,G*¯‚‚–˜á—´"yçç©ßã|£ À{耧yïY6{³¸¸ù'6r%LÔ~5ÑÜ×4¼/á‹ µ·…U=×ÝÈÿÂoxä7üwñe±¬ZžÅcÀw2r­Ã"Q’xx#Èœ õ‚z@‚ž];ˆÛu()°º¸«4ÐQ–^ 9‘|¼ ÌÀ› 1H¬*C€I¼X­õ£_õ~³RéPÿZèSO‚7°VëHNŽC9v©›¥ù@9©—’#ŸS‹\·¡iz2«”wòj• ÏŽZc:*i—ì…Z$œG~_*E’ ­=À¯¥Èr„*/? OÇߤ8#õMµZ[åê ÕÖWÕÀM´UÓÀå®'pôÇ-N-u¯ÒÑf֨ʼn}×/:sT“˜ë!!bLµ¨Q Ô5B9W¤¼h ó 9šûµîF²J_ý>£$(ÉY¿—ø ü·EýR–×/ìJÖ#P:‘(]T¤Hþù÷ÇÏxŒ§†û{‰-ÕµÞ¦8-Ÿ??ÊÒɂò,š¦â¤úHCm£O ­ùVõ³6U³"T­e@‡úƒ ê·l:ô’ëU›ÈF#¬-6ÊÜ>=_œnô[Â0½>6½ÝôšE¥=ÁÌZ@ð”­Þà=¤k\T«ÇËìñXΈqÄþ³äK²õ{¦ƒ6'ý÷ÓAÉ]´Oÿƒ©øUÚû=?Dªò«ØXyúùL·e§ÓfÊ:šœ1W3ÞXëN©¬²ËzC6J—`ç´ar¶+KïNmo]=\ÊVË/¥€ýz¼‡¼Zoújèjrí°•üj _È­¯T·x:–á—!{r…l¾$Ãk¿6Û;Ÿ[Îp¹ýrÈ·MÐvÏ,du·ººë†-Ãu¯-#áDZ-£ïI~Oò{’ÿo’Œ‹W+Û­ŽíRéÀFæŒ|Ýõ'ÜÉ3}Ç'¾‹‰>",_Cq±3êE9y‡£âû–nT¶erì…L˜Ë&"ùF` RßT§Ð¦†¥X ÔìäÊÙ%{¼ŒåêÆéêusêZrmƒƒÎ±Ì€å¸î–Ý΀¥™{ñjâ#f¦œ¶¥ô޵™™ˆ,ùv‚ À÷н¢§u¿ìuî=[ø2/Œê µØðTÑP‹¾Ñ4ëP¯eÙŒ·õ/`璘äòÏ>r}úµC];lµŽu?(¶+ô³?ú:Úñ´ñúÙ%—ã™”áãda˜N»ËÞÝ…Ï ˜@VÄ º"¦°%bNG>à…gkËå±å÷FèK­÷,2õn†[ø¥ÙË`þ³/?kóæ´¯¾«?’>jÎûsñe9ä¯_è)i·!Çí ߀÷ý0ÉòUÊÝ´ñ¸–øŽM&-îOݤ½wBw‚%G»ÝvM»½r˜æNÑ€¬ˆ4E4a b ;ÛvölyÚóˆÕœí1PZ6y(È×°…‰gã“‹ÃÜàuqàÚ³¢Ǽ>ÙìEJé”ÒÆ)¥ö·¤ÌgÉ×äå‘¢R¸w3]ƒ¯.…‡|›^ži ¶…§7ëm> /Contents 6 0 R >> endobj 3 0 obj << /Type /Pages /Kids [ 5 0 R ] /Count 1 >> endobj 1 0 obj <> endobj 4 0 obj <> endobj 8 0 obj <> endobj 9 0 obj <> endobj 2 0 obj <>endobj xref 0 10 0000000000 65535 f 0000002395 00000 n 0000002601 00000 n 0000002336 00000 n 0000002443 00000 n 0000002196 00000 n 0000000015 00000 n 0000002176 00000 n 0000002512 00000 n 0000002563 00000 n trailer << /Size 10 /Root 1 0 R /Info 2 0 R >> startxref 2730 %%EOF hypre-2.33.0/src/docs/usr-manual/figSStructGraph1.svg000066400000000000000000001037221477326011500224250ustar00rootroot00000000000000 image/svg+xmlhypre-2.33.0/src/docs/usr-manual/figSStructGraph2.pdf000066400000000000000000000040161477326011500223740ustar00rootroot00000000000000%PDF-1.3 %Çì¢ 6 0 obj <> stream xœíW¹ŽUÍû+:&hj¹ëX"ÃZD,hØüûÔv—~ˆ@dÞ¼®W{Õ©[·?œpá úß?¾?>ß¾Mçó'ùjúõîD8 ΄ýÓçwòù]>¿)óUND¤+ïùæ‹ÎÚÒÕΗãé@RÆä÷*ÌZEE™)ùµv2M! Ò¦çvD­ X-˜Cñ]DB%‰ó”ªp¹€|4š?«|~>à*TÏù?ñùöÍADI~ºÔ¯SnBM›Úù樭Y8lR˜²úvRÅœ]îl'Ûó›l'•ݳ>u¡-;£¨Á¨™$?™Fl<ê°xJ,ž4è³xîâjH8µ©§¬ŒiÀÉÅ÷¸{ÒpgÜN.6Õ>ئmä¨]ü8 GÚÈ&©·{£rÁÏŒa#ø£tÁç2UH5[É^y'· %F±pTbãõ¬fJoÎuò¡€³Dùõ$#¢‚ipñôoâñ ýlMÔQ#³@©iù‚^تh&ŒC@¦Ê³àŠ>§nZµÁ”y j= ¡“8@à.â‹í. ŠSh sQ›ËÄÀZ¹AñAP¯"µÜxº¤{¢kʱ‚V¨çbïØC5ZQѾ8»ª%„<ûœ…ÐF#“Ÿ0pªn%f¥`‚Ýú€)?ô÷©9\û^àG(XŒØÇ»§ý*ÿ^¥/°êM¦Ur`M‚-F*m±é1oR³qV9l GrËV±¹nc"k2À¤›þƒÚ,’Ìó0àjuALÑf2ئ|é;Ò*8¶û€ÚÄžÛ(Þ«²Ž”]áU‰G(?€ñ|–d’{:̲ªHs“UõË7G½¬Ð&ñ$ éY•B¦ÃZWOúü"϶Kâ€dõPÈúÇ@Æ{V~Ï^yÉ6»ŒQ†k£’‰IâBŸË²Ë›Gv ûŒ(É~jVãIÑ’³³oÚ¨eÚ¦º¼Ru¯U´óŠÃ‚Q‘EHæ´,DÞfÛê>£RMT0âôÚΚ¿hŸ´KÿTê–@PoVrñü_kÁ¯:Ð_ëÿ¯Ö?%õÐɺd§Õ8é‚Wü²KÚø ­Ÿ¡ŠÙÃwÕà…ê.iªrѵë ûž¡ ²FzôÇ®š“¼‰†²Þ}¤Ð¬qn»â –”ûWïöÎSØ×ªt~£méˆä.q×0‰f‡=6œÉWå”èÖY*¾ü8lxÁ&?·ÀÜ.ïy—ØÜa‚J½›üaâ&ï&ìí¨q\CH¡kŒµ ;µ$7Õ4®¹¦šâšïª‹Z’® VûšÙ^Hµæ9ëµûR&y_õê»ñ‹}|^ÏqÃjöº'tÌ[cðÔ}9Ù‚Oc9±"^Ø„öënr*Ù]º¤‘y¢uÍÙhj×MžÆt…5“Þpz÷hpz÷X1Gì‘ FÝyݲ†ÅøÅMôȦeˆküðìÄä{äà‘ÍÌ‚ž™‡ü¬LØK7o³ªͬzD=±> /Contents 6 0 R >> endobj 3 0 obj << /Type /Pages /Kids [ 5 0 R ] /Count 1 >> endobj 1 0 obj <> endobj 4 0 obj <> endobj 8 0 obj <> endobj 9 0 obj <> endobj 2 0 obj <>endobj xref 0 10 0000000000 65535 f 0000001449 00000 n 0000001655 00000 n 0000001390 00000 n 0000001497 00000 n 0000001250 00000 n 0000000015 00000 n 0000001230 00000 n 0000001566 00000 n 0000001617 00000 n trailer << /Size 10 /Root 1 0 R /Info 2 0 R >> startxref 1784 %%EOF hypre-2.33.0/src/docs/usr-manual/figSStructGraph2.svg000066400000000000000000000553251477326011500224330ustar00rootroot00000000000000 image/svg+xmlhypre-2.33.0/src/docs/usr-manual/figSStructGraph3.pdf000066400000000000000000000054431477326011500224020ustar00rootroot00000000000000%PDF-1.3 %Çì¢ 6 0 obj <> stream xœí¹’\50Ÿ¯x1Á VK-é \E†ºˆ8 ”Øþ}Ô§¤Ù5 GqmÍÎëéûP«¥÷þJw¸ÿÙ÷÷ïnïo_¿,כ߿Wç¯×¤+§ë»‰þá×7óóëüür+5]ïåzw›ãNWëåÞ¯··Wó‡>Ÿ?¨ÏïÖÚ$bt)y¢ÛÈ›iyãTI“±2 A5Æ×fIî™%"‹0Hµ0Y.Dd hþˆ„S‡GEXKi÷<iGB½>ÞÒr»âÁëå‹Ð8¼o:ML(¨I,Ï¥‘„ ’Ä$—ήˆ/¹ fœ0‰Ñ¹&¦n Òrµ6h®ywëF]@à®ÔUl®qÊuzIJ»ò¶*ÐHÆÛ™sd“wÚñ .ü\û§~ ~ÞØ‹¸ì .¼Z> ÇÎ,W`!³ÔÄâÐãf?zÐ2÷v¾Ÿú=n†¯&Ãð:Ã#EŸ"à íT5î nþ±³suës nøQY3®xÂAªÏ;jV”ÝÈ…à?È7¼ò •²Ë¥ô%ϲ–^ɰvÆIÅjoF€êR@Œî$‹Ždµpr ´.V•:ÊÒkJë5pD!‰VeP‰K€Ö…ø¨ßàg+õ…Þe¯¤}•CKÖϪ•#ɾ$ù°r/97JФť¹æf=)R÷d.ïäÕÊAîdµ6é0§]²jæpù}¨T+È8ö?–┣-ØwîÓñg)ÎH=©V]ÖY¸¨ZµÑ(ºÙ²ª¤›­L ±îfÜ¢k‰{„–ŽÚe;L1a¬úµ•ÙtןvbA´.UŒÖ€$(–ò,%\깸ëŽw1®´A«Gq8¬l8g´ÚËNü þiQ?”åõfºÒy%"Îq&s‘Ìq槯ní.áþÅ«¹1½¹e)ARoæç¹ÕÉF<¬YfÙć$†¡.8®>”Pë¨ÆÔ|-ò,‹ªjTtÉÕŸÉ@Z²ñЋ®WlBÛºÕÚ¬ÛÁÜz׳lþA×hIhª×‡M/©ÞaÃL“†6ªdže-K‚yoÒ%.¢Õã¥öx,{Ä8bÿ–óÅÙú;Ó›ýõéÀä.êÓ0?óòþ’‡EŠ4ù‘µ–¹zÿ3 鈲ÓÉbÙšœŠ¯¬†3ÖRXy æñuÿÉr4€4“ÎÖK„|Lu»KÀDz¦7Û0µã.Sqs.Êí&!© h{¬pŒzw ±D@-Ör-fy@ õÙò„LFë.¡«•1R>mx>³³•Céç•„á=¡ýÛ5ò-ÄŸf#c)ö+è²+v‡âRïRzë:‘cµÅO:ë"ø†¢MwÁ;ý.b [û*Až!`±°ÛRwý£É"r}³àê /êź•Û•óƒTYçÁp#sæ Π$˜Fë9÷Ч+¤é |ºê[6A«Ík1ªšM#Z×ëK+—|ýdØ{ʄ嫯çâ3‰Q–CNA—«zJÚmÀЪ6b¬zõÝ ó}ÝJ_Dï!C{FÉûÎ;{ŒÙ’2KбuÙ=!µÌ¼ ¸öÖ;¬Ë¢èf=×l–´´Û™/"O{cìÿÇÓkך}‡þÑ—ÿI‚yˆý’ÝÏ9»r”î­¢¼Hã¡eŽéú_£*w=þÊd$Ù·ŠovwA5íÙž°úæãÙ E™/±íÙ¡²È*¡ø®jµpЖ|?di\†^«…²[i­:¼ÀØo­bÿN;­œÛ^-™ì¬v„æ¼Õä„êiu¶Z  Úâa’"Z¦‰Ž\i³22!>DžV£ËŒõ%½Ÿ]z?9›Ë»f?ä U?zÉÛâ ëU JH©ø}%ꉸø±ÍÞƒ„Ö¾zÐÐï Î>¦ uö#žIÊÙ±vöÍj ¸f³ªÛ­~€aÓzU’»0ìÅŽs&µ+$'{¯ãšõ8±,Ky·;©]á•ÁáµPGLLV94E4Í’ˆ¶Yj¹0/V¦"Û‰éKz?Çô¾º};ÿ~ !Èáendstream endobj 7 0 obj 1934 endobj 5 0 obj <> /Contents 6 0 R >> endobj 3 0 obj << /Type /Pages /Kids [ 5 0 R ] /Count 1 >> endobj 1 0 obj <> endobj 4 0 obj <> endobj 8 0 obj <> endobj 9 0 obj <> endobj 2 0 obj <>endobj xref 0 10 0000000000 65535 f 0000002238 00000 n 0000002444 00000 n 0000002179 00000 n 0000002286 00000 n 0000002039 00000 n 0000000015 00000 n 0000002019 00000 n 0000002355 00000 n 0000002406 00000 n trailer << /Size 10 /Root 1 0 R /Info 2 0 R >> startxref 2573 %%EOF hypre-2.33.0/src/docs/usr-manual/figSStructGraph3.svg000066400000000000000000000742071477326011500224340ustar00rootroot00000000000000 image/svg+xmlhypre-2.33.0/src/docs/usr-manual/figSStructGraph4.pdf000066400000000000000000000070561477326011500224050ustar00rootroot00000000000000%PDF-1.3 %Çì¢ 6 0 obj <> stream xœíZ»r%¶ íõ·N¡ ’_à™tñ–žTy¬“Y¶ ÿ~à$µr2“‡o4;Z]O ‚÷»GzÎ$ÿðû/Oß=ýöëúøøÃú5ä×7œ%=þ°ÐzÊß­Ÿ¿­Ÿ¿>Õ–9çò\/OëÃ|æGõy<>=}XëSà'õ»÷¾ˆ]kYè>‹ò^çrpš¤ÅØ„…sã7°¤pÍÏåQU¥$ÔME´f"A2 ÍUÑE,&&±»ÈÿßÿY°•y‹¼žyÑ…áÀYk_º‰Ó‰ÌíñãSzæÒñ¥Ç×_m{ªú¢Œ,kʵ=‹½ Ì6s]I¼‘ÙV¼@Zd¹³Z_ú”eäÑ·OáÊs .)i˜ >DM)ÉAÑW(›Ü>$E¤ ü½´ °O!f×Úiw] ,cž ;!U†FB-ìIêÎy@#ìóh†=b|ÕÅÇÒjnç²káí’Jìþ[„µ»÷䯵YìáêÊÓ=/ë«Z˜ê˜È5Û æó‘Iÿ'O–œ[Ò\-U]±`˜Ru93ÖX§0.nmI¨{6k¶LG"4MÐÃøV5Oò0ꦶä¬u›Öo³;»5º¨ÞÃvåˆê‘<ÕÔ]âÐÕËûÛ̓0§° ŒJg†ví0+вÁŠeÂðEÕ`“»ËusÍ0ÁxzFÛ.Ç( {"»½Õæ(ÄÆ.–X`Â`î¼­ä9w}ðn“UMFàœõ$=÷F{‹Ñ<ˆ÷.æY±/ŠÎZf„Dd±Ï%ÅzluËûH=GxøD–p_‘&t‡5ÙQ*çÅ]øØw¢Éd·Ç4Ú‘kü´„­Í‡Q¶’æÖÈ*[$+iÌŽu'gR{Bn’Šâ:5»·=©¶&µ'Ö0æ©Û&$e ¦>œlÆEÌô ^´Á22ûE‚*à—jýrCúmkï±übùÏšÕÜ*ÚIiVélG_cçÝiøå" ì<;¦ øl‘÷~aχ õ~˜õ~˜í~˜|>ÌŒ~?ÌŒq?ÌLŒí)bæûaf–óafݸŽçYÏg™ÙÌJk²&ß3sÜ3sÚsàåëaf]#Û/Úo˜¬C€|Jíx˜¡Äö@Û(õëa†ÒˆÙÝjUgÊö~iÞ loî+ÊŴ—”É&nðõj—ÓŽY‡q"!ãý0³z#³2æsŸ'è÷}[¬ÛúªQ͵ñ¾¼ô¢ÿ´‡jv>ý{Â0«EßTñ åRïR.zt^6Þ¤†›Û༅f»Ánø¤?ẺþË$LïÏMÀbeÇVwýSˆCßJ¸vÛz³‡nãve`Þ`kfífµ½.xÁl–@Šé¼?—úl‡tB››l×ãʳvŒe›çbÊ6¡îíX^sì/Ë\öýSòYS¬O‚c®>àe½äà.zj:m Ðj6Rìz[¹X#ù¾ÕºH^C¦ÕŠRÎ1ƪ1°%KȱmÛ½ ³¬ÆÅÀà6NZ¯°.‹£šÁ{®–ôtÚ‘ÐUDœÎ8F󸳇oÄã„~Ö×ÿ“KûñÝ/9ºú¬–ž{#ýš4•öý–ÕѪû:Ðjª=a½}Ì뀠åkšP;ÆŠûãAöÙáþ¯ˆð'5ûº˜6uŠGÞÁ{ˆCk­_£˜‚ëÑ(.BE_ìâJBÅ»R³R‰{‚9®:Jœãª³Ä$ïALE j@rf\òvWÇf€.É^!âÆà8½Ml.½kl™©l}}šzô©WÃҮߊŠuôU‚Ø}Qð( ¿™áU37Ã#G¤Ž7¸÷øý*ã÷a)m•ic+nsX6·tÿ[©óÛãÞÅ€PÚ¢ ÆÃd1†êM6ކ‹Ö¿U鲬 » ½8êi¥˜}í7†hçÓ‰% ίíAv1;Bs9ލµÛê‚£O(V jø’Â[Ð_Šð4¬ŒHè"N;Š~=yëÖŸ>»å±¯½ÊÂ-Jš:mùÒJ£º”k 핱^uvÁ€”ÖßxlÞÀñmaÀÅ+­R/BT¢¶ã=34›%9ƒfgnç±o añ£LËø²\ŒîÌ®œð]¹˜å™%å¨×‡ÝÉìŠU>¿#}ø²ê¥)¼ KêuˆD,°Šv>ˆãÑ[½‡÷K ߯¿ÂYendstream endobj 7 0 obj 2713 endobj 5 0 obj <> /Contents 6 0 R >> endobj 3 0 obj << /Type /Pages /Kids [ 5 0 R ] /Count 1 >> endobj 1 0 obj <> endobj 4 0 obj <> endobj 8 0 obj <> endobj 9 0 obj <> endobj 2 0 obj <>endobj xref 0 10 0000000000 65535 f 0000003017 00000 n 0000003223 00000 n 0000002958 00000 n 0000003065 00000 n 0000002818 00000 n 0000000015 00000 n 0000002798 00000 n 0000003134 00000 n 0000003185 00000 n trailer << /Size 10 /Root 1 0 R /Info 2 0 R >> startxref 3352 %%EOF hypre-2.33.0/src/docs/usr-manual/figSStructGraph4.svg000066400000000000000000001130541477326011500224270ustar00rootroot00000000000000 image/svg+xmlhypre-2.33.0/src/docs/usr-manual/figSStructGraph5.pdf000066400000000000000000000070221477326011500223770ustar00rootroot00000000000000%PDF-1.3 %Çì¢ 6 0 obj <> stream xœíZ»’¶ í÷+níbC$H~gÒÅ*=©ò“Ѷ ÿ~à$WR2“‡Ë;šÕ^,ž@ï÷ôœIþá÷Ÿ^ž¾úÝ7õñþÇõkȯo9=Jzüq¡ÿü”¿_?_?{ª-=rÎå¹>^žÖ‡ùÌ>êóx|xz·þ0Ö§ÀOëwï} ºÖ²Ð}å-¼Îåà4I‹± çÆoaI᚟ˣªJI¨š2ŠhÍD‚d(𫢋XLLbw‘ÿø‹`+ó"y=ó¢3 ó־t§™Ûã§§ôÌ¥?âÿJo¾ÞöTõEYÖ”k{{˜læº2’x#³­x´Èrgµ¾ô)ËÈ£oŸÂ•ç0@\RÒ0A}ˆšR’ƒ¢¯P6¹}HŠ.HAù{i`ŸBÌ®µ/Òî:»XÆVÜëoôßÁWá»zæÞöµåÓŽ„$ÍŽÓȶææ{Ðânq¶R„¾Ñ• ^KÁãë'«bœníø@ˆ )/ld­låUr6±oê>{´–¥7‹ ðÀ—Á'ÞÀ_Õþ§¥ŸƒB>ìU—ìn¼Y>«ø–°‘Esbóvßqâ7üÑVäd‘Å[¿û ø†ºxwðÄq2±–ßÁÍünà±>±qU'›~6ÑÌZu^|å¾pRûôBaçz¹ñ¯ø/òïŽüˆ¿iõl(šúgÝKï` œ AÒM±Ër&[q@‚¬›Žu·HJ&ª¿gi #-=r"-A`n‚HÄ ±¬ &q °\ã+_ëüÉL¥KýëDÚAdâs—çžPÏÒ‘µÛÈD¹k½ÊEC!èZâR‹XK±^ix0«¤wòl'F®-:*é”ì‰ZÄW|_e*’$š§ƒ_§bI(ÁÞ«Ý ÿ$Åí©²Õ¶uQ.nÈ6žÕ0l«ÆvØjûnù-ª–. áhÚ9ä=åÎ_ìÌnÝڲ㒢µ¨Q”ÒÎ`eJEÈ‹¦pm÷æ~wrŠI¦MÞ5JÜ´‘˜ñ./'ñ'ð'õ«´|¼_KÉZe'­6´H’¬6ô¯_=õgu÷ç(Þ­ƒéýSÑÔ™¬ù¦œ|^GÄŲè!>=ÙŠ“ì#uµ5çiηªŸuS5KB@Õ¶ èa£É¦K/¹^µ‰pt›µ%z¶ýYÿ ë¼%tÓëÍÀ¡—M/zRí]ÜZ@X ([ݰzHW¿¨VŽVÿ^·¥æãðý‰—Dë:è¿J¾Dûô+ ÅwÚñ¿Åáÿ!v™›ÅJ`]g¡×?`ØZ”“N7SÖ£És5ã8°ž”Ê*m°´7dçÝ}sš#½P8xƒ}Ò©gGE7F‡œÊŒýgƒ$G¸”R@`Ø“·V=G|¶ƒ3(æ8Û1¸rQùq×1œ_˜J[%ãóJˆ“Ù±Î~QÃMvW„¦î7¾¡}ûŸô—ˆêÍ/DTm@ĆOz‘u¢¹žºË¸{»¢þ5ðå$ ep¾Â}B*å û9©Š«‡TK›c QÑ/`zÔ’O8t¤Ñ2†36ðh£Ò«‘Ÿê§V}£C”Æ~ÕÖ+qëצ ÀhïÔpk×Ñ ' n²N计Ç™¼Ú7öZb£"nù§ßÙ»ŒÜÜÓ‹W.UÒ)¬Ñña­Û´Þx›ÝÙ­ÑEõ°+wx@T䩦\Þßn„9…aT:3l´k‡Y– V,†ï(ª¨›ìÜ]Ψ› l† Æ“Ð3Úv9FQØÙí­6Gqð 6v±Äsçm%ϹëƒGp›ì¬jr0ç¬'éiô¸7òØûXŒÞàA¼w1ÏŠ}QtÖ2#$"‹}ž8()Öc«³XÞEê9ÂÃ'²$€ûŠ4¡;ü¨ÉŽR8/îÂǾM&»=¦ÑŽDXã§%lm>Œ²•4·FVÙ"ñXIcv¬;18“Úr“TשٽíIå°5©=±€1OÝÎ0!á(Sn4õád3.B`¦ïy𢠖‘Ù/T)¿DPë—ÒïâX{‹å—ËÕ¬æVÑNJ³Jg;ú;ïN Ä/i`çÙ1HÀg‹¼ð {>ÌX¨÷Ą̃÷ÃÌh÷ÃÌàóafôûafŒûafbhO3ß3³œ3ëÆuËÌfVZ“5ù~˜™ã~˜™Óžƒ/\3ëÙn|Ñ®xÃdäSjÇà %¶ØF©_3”FÌîV«z<ËP¶÷Kóe{ët_Q.¦¾¤L6qƒ¯W»œvÈ:”ˆ Õ™•1Ÿû8AxïÛbÝÖÐWj®÷à= ý‡=T³óé?†ù[­ø+ú¦Š)—âx—rÑ£ó²ñ&5ܤ؇ä-4Û vÃ'ý)bNô_&azn6x+;¶ºëŸú@úVµÞÔ›=t·+óƒÔX3k7«íuÁ f³RLçý¹ŒÐg;¤ÚÜd»Wžµc,Û<S¶ uÇhÇòšcYæ²ïŸ’Ïš²`}ûsõ(ë%w‰ÐSÓi…V³‘b×ÛÈ­ÀÉ÷­ÖEò2­PÔrŽ1V-É XBŽmÛî™e5.·qÒz…uYÕ ÞsͰ¤§ÓΈ„®"âtÆ1šÇŸ=¼x#'ô³†¸þF,íÇ[t¿äè~æØÖ Ë×t vŒ ÷ǃì8¬ÿ=v³¯~ùR'räÝx±G5´ÉúU0Љ¶~©ŒâRSôõ-®T¼ÃÔ‘)•¸Ã(˜ãÚ¢Ä9®-KLò~ÂT¤Ð¨$×hÆ%o]u”hè’ìE!ºÇéÍ`sé½aËLeëëÓÔûÐN½–vý†S¬ ¯ÄDIøÍ ¯šyð¸Ñ8"u¼§½ÅïW¿wû f«”HKZq3ò¹¥³/ØÊ–ßÜw(„2-î&‹Qä«7Ì(ó­CÒeYqu=zQæëi¥‹}­4Š|´æéÄʼsã+x]ÌŽÐ\ŽãfAí¶º Ìó ÅŠA @Rx šàKXž†• ]CÄiGѯoaýÂÂúùs[Þ[ñÚ«,Ü¢¤©Ó–/­4ªK¹Æ Ï^ ëUg Hiý½Æfßü\¼Ò*uñ"I%j;Þ&C³Y’cÈgvævø6Öï)ʸŒ/¾ÅÎì É ß{‹¹œYRŽz}ØÌ®Xàóû·O «^šÂ›°¤^‡HÄ«hÇáƒ8Þ}Õ[x¿¸ð¾{úÃú÷Ü,¸Eendstream endobj 7 0 obj 2685 endobj 5 0 obj <> /Contents 6 0 R >> endobj 3 0 obj << /Type /Pages /Kids [ 5 0 R ] /Count 1 >> endobj 1 0 obj <> endobj 4 0 obj <> endobj 8 0 obj <> endobj 9 0 obj <> endobj 2 0 obj <>endobj xref 0 10 0000000000 65535 f 0000002989 00000 n 0000003195 00000 n 0000002930 00000 n 0000003037 00000 n 0000002790 00000 n 0000000015 00000 n 0000002770 00000 n 0000003106 00000 n 0000003157 00000 n trailer << /Size 10 /Root 1 0 R /Info 2 0 R >> startxref 3324 %%EOF hypre-2.33.0/src/docs/usr-manual/figSStructGraph5.svg000066400000000000000000001123741477326011500224340ustar00rootroot00000000000000 image/svg+xmlhypre-2.33.0/src/docs/usr-manual/figSStructGrid1.pdf000066400000000000000000000212641477326011500222230ustar00rootroot00000000000000%PDF-1.3 %Çì¢ 6 0 obj <> stream xœÍZË®eG Ÿ¯8áCÙõž"!$f¡ï°'((-¢¾ Hü>¶—í]§“@n¢¤¥îíS/?–—]{çÓ½<è^ôÿûõëíÓíwn÷ÿ¼•ÇšëþáF÷¿Ý:;Åv½ÂÇ5âFV¡ôöX"bìXõñöÍodã¥ÏG¿ÿ[¶ýVŽ˜½ÞÿøÛ¿»aÓ?ÝæªqßCÿ~Õ5—¨ÓF[wªŒÑ5õ_utÓFñÅ\uwˆ:ÌE9|UOÞ}gôRÿÝÄ\yl[þÊAìÍU­!߆ÛÖ*mÚè¹Ð\é>|›ýÜw»-±dÎi¶3-’‡QÃ0&ò¸û0Ó¸V_µ§qE»ý Úl‹CåòœkȾ™ó)]'Ãú 7;¿U‡¨Nw~01nŸÄC¬ÿóõëý÷/0"ýååC/ÍÝ1I"R•ïÜõï—×Ûï¿øòåÛ›üXeü寷/HåîÂoUµöÞëûÆßùÙê÷ÿÐþðrÿêÿR“ûR—ˆš¼~šší—P“Šàï™>¾_Íökð¦€]“`õGi?MÍíMK ÚåÔ99¶ÑÎLv¢Ñ- Ÿ*x)¹DE³qLѼ‹\SIFxJÿ‘Å¥%•|­>îáà;uò­¹6c5–qÛ­ò‘Ú¶ýhTÿé—7Ïκ¢kW×üz““æPÔÓØý$òfx"ÑOH»ň»Ä+JwÁÚ(÷¡ÓŠ=.ÁÍFPx tß h‚=ÉG«2y_ÛG­$t•UŒ14À}Ãû½O¬Ü66ýøI¶rø1“õøÞ}ßÙìTÛ]Ån:9´yf{3å%wT¨Œ3ç²Ìvê”SEZPp™J¶n‘YRܰeiÒ¶Ÿ¸ÄoÍsE™Ã·híÞÆð+­»bËÒ±Ù&ŠPwŒ©C1UF)¦9¯äT«;§êC]Ç®uîóÄ:¶[aG£~𦵇}bCmi[­õ´[HâòI%wžzKs¶]ž¬@ ¼Ì;œn1à€â#“\´èqFÞbËÏ‘ ^¨àˆ;0Ãwà)Ú&G×®­âʼOsà(göƒ4˜Ü‰šˆÑœaÂïÚ c¢¦ˆ´cr¯¶©ç\£Öÿ\b]&bª‘{ž× ›èºÔe…ž&‡U¨%-¬ÖD¥ýÕ¶HïÔrxŽ—…_%B§×Å9z"ÂÖýe´äH#–lMpFšIÑ–8àbJhë*G:ÅDM¾pGÖx;&É|—x%#|G25=)1Nug÷(‘dif Õrå±åLd31šyª+3‡±kf¸ž˜¹]’ iò¬HNÉ7°?¹H}“<¿9‡Á£Énðwr¢‘̈X9k"ŽÉ¨ˆrF@²1ð‘\ ô$“+²œã¹ä 2«ƒ¢5+œu8Ϫƒ,Èš„ñj…ìÉ:†ÜÊwÖ?»õü¨ê-MÖ–9QÀ«Ä;ºk½À(àh®ÿ®åvËœ¨Èùü+È¢øâEú_VÂ¥ª—Uý®?µÇ®¹Ž?ßè³ÒN}£¡[„ËÒð–lùMW®]*{Ö¶²N€‘„)Uò{ÜXz}pµÜÀ°ËLlÅä±}ÜxTäáã‘1ja”.¤iÁ¹úqcÜÓBЋÕÍO[–mÒVúî«áôZ\î|5±*ø€Ü–e•Gä‚ó×Â~H¦eiM¼mö–‚& ík·U;Éw·tÛ!"ûÙ[ýÉÞΊ¤cÏM×µæ#fœ7Ì£'Cd•hÄ(4*ÐÁJ=ÑŽ¹âV+c.Fç8VJ4}•:ÎSÉS:´Šf:‹ñi yòß“È '¼TœàòÆáÝÈrï—Ñ@t °â±+}‘-‰ D¾4?בQjwÈ) GV d8ò ——…å@m œ8ªKO¨/ÏŠRü4Í™½ÝµšNˆÒ<ÛÛÁ® ¸·ãÙ¹·»µ[Gp‰ÆZ9¹§åFÝøÎèÆ…yx3¦¼4knihÞÜÒ°¬¹¥aysKÃ3ÍÞÀ„ßê.O^­«ÃëšöWLÖWÌÆWL‘¶ñ ¾r4ÔÂRØß5’¤/}\8&5ƒ<ž1Êݰ’fë.„K‘0èg -3C{$>2‡+2)2KÊšGÞIÅËœdF–­œ[Žlö•žë¾o2Ÿ›<áz%¸ÖÉ3n•sÛœüä>IörŸ%»¹G“ýÜãÎŒdMT²ªÇ1Y×㜬ì8¨O(INw %ç;Ʋ&8³f8B³¦´¨@'¾³9þ³^y~d=Cú\õ¹uUC¤ÞU+‘™QG‘¶W}ªÁoÑ_ˆâãqŽ÷b?_‡QÿG‡Ñ ’ß\ñzCÓëâÇ[«ëJÐÖçÜ6-uáà¶-¯á}íS3É;{5@亽u C·)\œí󠎾-f¥Ãëx)%4ƒaeÃ1iV*Òf4œêMûª#iÆä‹ ‡SNQ寮'ËÎÒ~žϽ°jÚV{¦i°ΚUŸGÓTÝ~Q™Z4ì3ñÎß—O³}3|7Í1›à½SË9Þ×Jy»¯ÝâiƯ:Gʬ=ó}õv컲gÆ;xÕeùaJ‹°,¨º¯‚`ê¹÷añÜîñE¼±„—¦.Tý·Óc«nŸ3³#TÓïSˆã¬õòŒ(¦‡ð˜ÎN@Î$G Áj– qÐ2à8=ŠÔáw@…ðØð–b{xÜôÃ+¸fÃØ[¤ÉðëdÅì&‡yÕx<ÖWcýع–móüh·¢Ð†aë©×ò°‰`Þ „Õl•0<"½¡Ž¹·È¸+<)Mú˜ Ც±‘B¡’Glçˆ'Y¯H[›ZÓ÷Þ@Ö…áL}ǨGÙÔÀœ°p5Ùñ(fÈŽUI(Ìw‹²öÎ4P.¬Žùž2 ãã”"Ÿbvd[ì¹§E¦†6ÈâÐ5ò;lñÜwK“VÒEø'ÈÄœ—]`O-(¡.+£q4qÖ­!ŽIyâ¤CD?ÉÐH*n’h*'a - Z˜äÍÎÖñ~cÓyº³(úY0YL2YhOW:KÔ›Ôß©zŸþï竾í¿T_ýÄ5î$öÁ¥û=‘aé;·¾h ™è·÷x$|Õ¯;ÑäsmþéÖÃz-5ŸáU-ÿ¸3¬G”ÎÈ¿Fyyãôšb‡"wºîzÙ§q%V”Ðcåw¢#½§è4¬ Ôï仄d€6{FË afT´ŒÆx"9ˆ«^B;ý O9ÚQ÷ uJqй‘U¶S&ØNéqIsúÕ2›ŽÝ³ô}—¯¯¸’¬ò,ÏuÍÕ¶ãÚeØ5à:Å:úC‹§n¿êŒ'ý'º:íÓÛHÑô›DAá>7<{…ßü¤ô«k’^wM=&fů¹Îh^‘6PÃ}zþ‡‰¯FWÜ®ÙXNúMº,'´ø}zÙ²ÑbgÛ_ÉŸÿ/•êtendstream endobj 7 0 obj 2685 endobj 5 0 obj <> /Contents 6 0 R >> endobj 3 0 obj << /Type /Pages /Kids [ 5 0 R ] /Count 1 >> endobj 1 0 obj <> endobj 4 0 obj <> endobj 8 0 obj <> endobj 15 0 obj <> endobj 16 0 obj <> endobj 13 0 obj <> endobj 12 0 obj <>stream xœ’[LWÇgÀ]Ƃкle½°'&^±Äzi…ÚZ@±¸®Èꊦ:»3,GçÆÌ¬î²‚ "lFPDAº*ËZé‚Ä(mÕ­>ÔhHmjZÓ¤mlb$}9S‡¤…Fšô­oß9¿ïüÿßåàØ”8 Çñ´¢œ<Ǻ¼ŒÈÒÒ[9¥¦Æ]]º`,--`Û_íRˆ:5FŒ¥G-J·ÒÖízØÔÚt²ñxS{Z¿¿­þŒB Yh.*Dk“C…Å;v¯²[/£„yªnKµí4÷;äàîúu»xÖ1Ž]ü.…ðVv†:[.D~µv´žïì_‰†{‚D²jQBjvLÖ#B-µ@óhš±ãÆ©kG;>í¸üÙ=×φە£Ê±úã5•íµ Ñî{ ÓåÔ–­¶>@ô†}¾mÚAK2ê­ ©`pº‚’³ÑѦG¨Ou˜sWÐW—‡pu+:bÎ7¢DµÀPd[3ö!?×€Œ.m±¥ÑbÃCãØÔçfÔ¢«µ¨!Yÿë{Cª#„¶‡Œ‘×PRb¤9) ÃþxOVA endstream endobj 17 0 obj 1235 endobj 10 0 obj <> endobj 9 0 obj <>stream xœ’_LWÆï€;"ZÛ5 =‰F¡l‰´j‚ñ… ´ !èÆªÑ8»sw÷6³3Ó¹w¥(”¸^–ň1ª‰Q#QúRLcL$1AMÔÓ¾Ú¤MúpG†4#&¾õíÜó{~ß¹çJhI’$é£Ðî¶P¨±vI`úY+S4Éç?u>–œ5Ne¡»Ý˜žÝè«DÁ‹ËJªtaöÐ*çßœV8®\h”‘nI÷ Pu¨sMmm É0S‰ÅÔ744@8ohÆ”ÄtXï]X3ÌÖYìÅXC”h:B_[› ºQST•èÐbyjG2ìYƒ ‰`âˆh ˆºJ1tZ &ŽEÜÁf^€‰­¡Ô‹PˆYŠÎ° Ì¢G´¤šÇ{ù¨¡30-ÃÓžâµê0(£‹˜ akѺv’')t E‡v£‚ЉcIM±`aÏï,®íÿ-!䫯ÞT@hZ†ü¨•"Ùûh RÑUô‡´Nj£eÎ)n¿öç¤_V‹Iû{ù`×¹ËãÙ‹g¯|’9›932:2V.Ö:?fíÌ8«È¦GOñ4?}ºj[_}*͇Ò銾¥Ó™‰»ŸwWð“éÁá”[57PÞíÜv¢¨Lüþº2'ñ'…â ·Éû»†¿â¢äºX7% 'ŸOÞyôø¸]î®v‹¿iUÖ~hã;ùŽó».·üpÔÖn·åæÄç3’s@œôdQêìö…å¹ÍsMÝ{|–º-¾çò”höý%»[ùÝxVÓâ7_V~CGŸ^w÷øÅJî>üYH×~=?ßò顇Çô>î»}äEÏpùÍ­öV¾»wËпJ(í_{þGÇ\¿ÿå©ûü~ÑOÖoõd·Ù{fàRo•}llˆr“™ûãEeÝ9§9'çä‰âgË'ÆKJúL-~£ endstream endobj 18 0 obj 815 endobj 11 0 obj <> endobj 14 0 obj <> endobj 2 0 obj <>endobj xref 0 19 0000000000 65535 f 0000003009 00000 n 0000008297 00000 n 0000002950 00000 n 0000003057 00000 n 0000002790 00000 n 0000000015 00000 n 0000002770 00000 n 0000003126 00000 n 0000005142 00000 n 0000004870 00000 n 0000006062 00000 n 0000003528 00000 n 0000003259 00000 n 0000007176 00000 n 0000003177 00000 n 0000003216 00000 n 0000004849 00000 n 0000006042 00000 n trailer << /Size 19 /Root 1 0 R /Info 2 0 R >> startxref 8426 %%EOF hypre-2.33.0/src/docs/usr-manual/figSStructGrid1.svg000066400000000000000000000455361477326011500222610ustar00rootroot00000000000000 image/svg+xml(1,1) (1,4) (4,1) (4,4) (1,1) (4,4) part 2 part 3 part 4 hypre-2.33.0/src/docs/usr-manual/figSStructGrid2.pdf000066400000000000000000000157411477326011500222270ustar00rootroot00000000000000%PDF-1.3 %Çì¢ 6 0 obj <> stream xœíW[kG ~ß_±I)[Is-”BߟG¿””˜j·Ð¿_iôÍìžS71m ¼«•ftûtñãJ¯d¿x¾{X—ïÞÆõî÷E¿lµTü}ºÓ¿.¹å•s•-® GΫDÞd½_$PÝêÊÊ–•æ–¢Ñ5›ðýñäýòþÕRMKÙÒú§^ýa¡-KéV¼ýñÿÒs³õëÒëK ëßo¶Ã‡ø?뽤ó$pPýÌó¨²í‹ÄÜÙçVÞ,ÝÍhåRLBí6ñ2-åœì•«kà`-OýÔOp ݸ¢Ö¤XÀ¬¥G!ˆ=ô0E2GŒÂY{ml–¤91®–`ŒL`+¿ßdâGòs‘‚›‹/Ï…ƒÖ»™Þ-+w0ŽÇ»‡õû“…Ù¾œÞ/E.-¹ÚW7u Y¼NË«ÛW¯O–°… ìÓ/Ë+6:øÖ5§µVŸãß¾¾8}ûd~8­oÖþ +KÞ’Æ:·­ÉóvÆOØ_j'«}œšC¡p4;ɬ$ΚU¥¨¿ C©&œ³ÉV®Ù¨ä§ ù-E\¶(LV·œ²¡7ä ¾‚ÕôdçæžÿjGE¦IwDÝœaIe?¡­Š¥€Äí5ºö@ “ìð7:{ ¾Ô’&×_«ßGÁ­¯Í ciÞRHe¥ŽÃÝ3)ð´u%JCw³x °¯”ñ’¿G;#8Ý9”Úýh,’ÁOFq\·ˆÐäZï6mÈjXY½²Î-ùpR³y¸—S>ÓÊè꽚ÍêüôE•‚c~êÏY˜ø,JÔÑCªù]ÈBô©Œlxvȱ‚ÜQʇÌÒD†gž"ôhG dY4ä‘ЗÄåŽZ8ª‰òêiàUAmV3­!´VNÍeuÖÀnØðâÕÙšŠù±“ÉôOáj'qQê£*I' <ÖÔã2,‹ðtXáéð,ÂÓáy„§#2‘úÄ@ÜB£³¨†â§GÔ­ì÷œxYï9ó2Þsêe;2¼_ ä€鑨‘$ÕegRܧAÉç•Ô±21,‰Â%ö˜ýâH›•!ÁB»Wޝ¤QYºtþ¨;z³&E¼ÊꔥC5ã$j÷ÎN½³OÀ®ÙG`õì3ð =>Ïþ„˜Ìî…˜ÍÎ£3ölÌ®‰LÍ®Š<ή‹<Ï® „3”Ìž ÍžŒÍ™Ι„ΙÇ:â{Î#àÎ+ÔÇœg^>û¼óÚÚ§¡—Þ>+½2Çõ²ÝgìÙ îûî‹V½°©ÌØ"Bä:wÝ":6ía[Äo6õ›JÅàçË}/PóµEŽ]á¾Ièr¡µ‡O«}Š[ ó\¸¼è¸ }lK?ߥ?±/Í ±'sDâéË_]ÿ‹©Ÿu½üŸóºÌ^—Ùë2{]f¯Ëìu™½.³_Ö2û’¥â+ØhÕ—7úûF0…Vendstream endobj 7 0 obj 1099 endobj 5 0 obj <> /Contents 6 0 R >> endobj 3 0 obj << /Type /Pages /Kids [ 5 0 R ] /Count 1 >> endobj 1 0 obj <> endobj 4 0 obj <> endobj 8 0 obj <> endobj 15 0 obj <> endobj 16 0 obj <> endobj 13 0 obj <> endobj 12 0 obj <>stream xœ’[LUÇg(»Œ–‹²l€^ؓމÖK i4@Ré²¶PÚhgw†ÝSfg†Y»Ë¶K6#Pît).-Ë"´@!-ʦkCå¡?SR¼ÆO,ÑÄ£Ö°¶ò3o—4,õuM ~×ÖÓÖÛÚÙÖŸ2åék’´½‚ QÎ#r¡°ä£êc&Ã4Š9ग़ʛRQßýˆ? ú«›OV²d̹‹áªt…5 oôŒ ‡f&B#~"^N•‚rvïÔã„JRâ!Pœ6pÿú|{àËÍÀô_Ü»ê—Ú¥k;@mã€DL†ÆçfÅXa©PŽ7¬"º¸ÎÝ¢Ä]IGã¾  æ%ŸÚ“ukhR6ëó´3è€Æ®5gŸµwöŘŧÑ=©¯¸òaíj´fîáìÄï«i®ëðL ï•R»:¿¿â ×nôÎÞX!tk?kÕIÖÝërRPÕOP§¡IÖ¹å|¤Ó[Êêê¼qõÓŽîPÏÜðO†utYÙuÕcò-º†.H©J‚òªR¦¼þÞ|Å·+÷ïü¶l¸LµÔKõ„®¿jŒ½³°0óËrš®B9Vô7ýÄK&¨hèþœƒç%¢Æ}küÁÄÓ» cKãáÈ[fåõD´„ÞBúdÝ”„žêçüŸ77,¡sÒûÄÑÊ\£×ÛÑÕ˜æomê® ‰SÞÞ‰° .X¹Èl ·‘½€®^š.™7ôuhtkëS·¿~¸çñß¼“m´fžJj¸»<:¸ ¥.MÚËÞ-®Tô¼!^ýR—‚²9ˆÎµáQìîpGl,†ý à< ¿ endstream endobj 17 0 obj 1083 endobj 10 0 obj <> endobj 9 0 obj <>stream xœ’]LWÇï€;"üêH žD£PVRúa‚±~±AЕ Õ 6mœÝ¹»{›Ù™qî]`)J\/ËbÄÇĨ‘T|)ÆILÐFcâƒúд¯mÒ&}¸#CšÎ‚“¾ùvîùŸ{~ÿsϕТ$IÒ‡BÍÁ½µûHÓ -LÑH$ŸÿÄùHr>.p* ݯÜñ™¡™O}•(tqI©SU‚.Ì|³Âùw¹óÏRçÏeó2ÒMé~ªÞßÞQS[h4Ì”Ebqõ NÁ‚˜’˜ë¼ k†™À:«ƒ¯1Ç%†¶ý;B-P½]ST•èÐdyj[2ìYƒ‰`âˆhóˆºJ1tZÛ)(@M!Џ;‚ͼ[ B©¡³a˜DhI5÷òQCg`Z†§'<ÅkÕfPF#1xĶ`Ó¼GWXžK‰'ƒõ*U#’ÌOóVc Ñ)0ÜÍòœ0•PSSR×keZdÎB’=¶@€…cŠ¥j˜ÎõÍ¿ÊÂ|ðÎÔŠij©¹»Æ\Õ[>akѺV’')´ E‡V£BÐŽcIM±`~Ïÿ/XXÛû-!䫯þ¢&€Ð ´ùQ1*E²÷?Ð"¤¢«èwi­´GŒ”9'¸ýÚŸ“î®öò¡Î3—DzO_Y995<2•æƒéþtEïâ©Ìø°ÝÇ»*øñôÀPÊ­ší/ï‹vl>VT&~{]™“øÓBñ¹ÛèýÝ7Íÿà¢äºX;) '^NÜyüäG»Ü]åhQÖ õïá[ù–³Û.7;lk·ZŠòsâ³iÉ9(Žû²(uvúÂòì—³]Í>aˇÜ&ßKyR}ÉîÆÇ~7ž•Å”xæËÊoèâðÓÂën³_,èÞ£Ÿ…tí—³Óü9Ÿ|tôaÏ“Þ[ß½ê*ÿi“½‰¯çîJân<ú®„ÒºÛó?2êúý¿Þ™|Àݶn|¯'»ÌžSý—zªì££ƒ|€›Ì숕uåœ`N|›“Ç‹_|0>VR‚Ð[d~§ endstream endobj 18 0 obj 815 endobj 11 0 obj <> endobj 14 0 obj <> endobj 2 0 obj <>endobj xref 0 19 0000000000 65535 f 0000001423 00000 n 0000006550 00000 n 0000001364 00000 n 0000001471 00000 n 0000001204 00000 n 0000000015 00000 n 0000001184 00000 n 0000001540 00000 n 0000003395 00000 n 0000003123 00000 n 0000004315 00000 n 0000001933 00000 n 0000001673 00000 n 0000005429 00000 n 0000001591 00000 n 0000001630 00000 n 0000003102 00000 n 0000004295 00000 n trailer << /Size 19 /Root 1 0 R /Info 2 0 R >> startxref 6679 %%EOF hypre-2.33.0/src/docs/usr-manual/figSStructGrid2.svg000066400000000000000000000332271477326011500222540ustar00rootroot00000000000000 image/svg+xml(1,1) (4,4) part 3 (1,1) (4,4) part 3 hypre-2.33.0/src/docs/usr-manual/figSStructGrid3.pdf000066400000000000000000000162421477326011500222250ustar00rootroot00000000000000%PDF-1.3 %Çì¢ 6 0 obj <> stream xœíYKkG¾Ï¯˜£¦ªú} Cn¶ö¨Kp°#Aäò÷SÏžEØ&á •»5UÝ]¯Óº_á„+ȯ¾¿[î—ÞåõæÏ…`ý{ÁõgþûÈ¿/pj%­o–:ꊵÓ)¯w f̧¾Ròv¹ú·2O¤<'G Ó‰eq.e¶<¡\• 7FLŸ »ˆ>©ÀŠ­‰Ž"â­ÏõµÈWìv&užº[RåkSrsfob&’^ Ä¡|­|ÕÙH…bAßš’0*8›ùº[2¶:óèš¡ûa¯SýÓÇ<`¸YîWÔ¨ÅÇû»õÇ3Ç õÉù ö†mb5ú‰õ,â–óÝòêúÕëóÇ%Rböù×å ]œø^VaŒÑã_¿~°úú“<øé¼¾]€µûÏZ¶z*ìÒ:Nƒ×3AÏüµz"ë‡eXÄ»àƒ#R=fÝð‚•ƒÇèwÁ]j]Ñ€µŠ\³¸pH«PÅV5°]™lc4 Íf?UiªÕùŒI9§·jÌSéŠ l @‘Và =ŒŸ]“޶:ûiD)ÆïÞ³žÀéBÊ…®æt[z«Fƒß»íÉ´ïCC*=€e©ûÚj5·tè!LûÙCüIŽw¦„Wì{–u9;GóŒº?%a†GÆìƒôeRþì¤ü­NÉâ3>Ujš »Ê¸L¹—)÷2å^¦Üõ2å^¦ÜË”ûb¦Üÿñtk—Æuýt3!R³kÔ{P oT'+ý5¹Û ;LGiÐúÃt@†òi_ ª§à ´Û§DùósJTN×£tŸëYz$•YQz‰4°¶S¤Éx@×£¼æÓn¿Z÷§éœ½ÓÆ’rjK¥ìl‘Ì +ÉÚ_›t¤§ÊšbÚ»éY×az^5œqqý·¸™}Õ-â fyßD¼{ó¼ˆÐâ6aÔ³""ð_8~ÓSTjZ°ž»<\ÀðMAúÜÄÂ¥0¼h,È¥XôBî´šÜÕ"x~‹t”U$µ“^k=aVõާ7ñy5Úë_i>,;¿‚xW5žºÅ•̹†0”û/‡õm=gëHC³Ñ›´)ð„åWóu¢æêÛ q£iU¸oô^Þxâv;÷–ÿ¨X£endstream endobj 7 0 obj 1366 endobj 5 0 obj <> /Contents 6 0 R >> endobj 3 0 obj << /Type /Pages /Kids [ 5 0 R ] /Count 1 >> endobj 1 0 obj <> endobj 4 0 obj <> endobj 14 0 obj <> endobj 15 0 obj <> endobj 12 0 obj <> endobj 11 0 obj <>stream xœ’[LUÇg(»Œ–‹²l€^ؓމÖK i4@Ré²¥¬à¶ÑÎî »§ÌÎ ;³v—l—"lF ÜéR\Z–EhBZ4”LyHˆM¬Óøàƒ/%¾œ±c¢³`Љo¾}çü¾óÿ—ƒc±1ŽãiE¥³1³:iá•|Ž¡ŠE’¶(Ë”÷âò¾yÿ.åœòÃSÏÓJÍ~¬dpw‚œ î‹ý1ùÍ‹²œ$o¾°­ÖŠOâ÷ñ¿›Ë*Ždffp¼×í¼–““¬^ð'hÚYpP >¦ŽwÒ¬˜ ÎÐ44¨‚ Læü’âp8!) ² Ð¥R“ÛªÖJ fú¨â\€Ù>ÇRP„+dƒ<@ài$@{l4Y€§]N(j  ì.’i ˆ€¬qSQ{õ¾ŠcEÀ»8•;U¢J™8Al.È‹@u4(Ü®QtbÔW€*\•šIq6w´›gL$!+‘öˆQ+ ((ð éU}U)Þ·Jp µï¸gm']C [ºÑ©ìôþÕ5ÉóŒwë-·•õÌŠÍTe¡Óê@ç$Y`är@ 8ESÐíÛ{þ/ßÙÚÿÛ#†aZÞ%’¯ ;ÁÌX>–‚áXœúC°X¬ÛÄø£˜ò˜ Ô–(·(dåLÉÇBøM9S7ÐÝ,y$¿ßÖ`9ôgZšÏøIƒU"šxÔÑZ>óuIÃR_×Äàwm=m½­mýiSÞ¾æ!‰@{ÑK¨å=$ŠË>ª>f2L£¸>ª©¢)õׂb ºùdõ!ûIÆ|» îÚÐ@×XäWÃðFÏèÀpxf"< åt)$ç†ðÈN=.¨¤)^%hƒ÷®Í·¿Ü NñÕÈÝá~©]ºÚÜéÖö7HÄdx|nV•ÖJåèqÃ*¢Kë<-JÂåôD4îÉ`.YB‰¹¨=U·†&e³¾@;ƒhZsîÖãN±W¤ø5ºÇõ•—?¬ÝCÖÌ=˜ø}5Ã} ¾_Ãû¤ôÆÆ®ÎÁÁïo¡DÃÕë½³×WÝÚÏZu’õ!ϺœRõ“ÔihRu¹éôÖòº:ŸD\ù´£;Ü37ü“a]Rv]ñšü‹î¡óRº’¤¼¬”+¯¾3_ùíʽۿ-.Q-õR=¡ë¯co/,Ìü²œ¡«TN£ý@Ð+ñ’ *ºˆ?ëäy‰¨ñÜ¿?ñäÎCÃØÒÄx$:À–†Yyc=-¡¤7>U÷¥ 'ú¹ÀçÍà Bø¬ô.qÔ’oôù:º3­MݵaqÊ×[#vÁ -‹ÌzéÑsèàêÅé²yC_‡F·¶>uëë{½÷Í[¹F[ö©Œ¡†;Ë£ƒ RúÒ¤£üíR‹¢ç ‰ê—º’Í!t.¤<âwG:âã1ìoÛX ¾ endstream endobj 16 0 obj 1082 endobj 9 0 obj <> endobj 8 0 obj <>stream xœ’]hWÇï$îc¿º’`“PjÒ¬¡ñ "jMVÓ®a‰Š¥ÅÙ»»Wfg¦sï&ÙMB4¸Þl6bŠtüX EÅÐúà‹‘R  QQ„>Ô>”öµî˜ âl"Fð­oçžÿ¹ç÷?÷\ -*B’$}ÞlÞªßO’˜nhcŠF¢…ü'ÎÉù°È©.vw¸ã3C3ŸúªQèò’r§¦ ]šùj¥ój…ób™óßòùFYé'é×"T{ ã`]}} Å0Ó‰'4655A$ ohÅ”ÄuøØ :±f˜I¬³؇1°†Ñ0„|jkÚfMQU¢CÐòÔp*âYƒ‰bâ:ˆhóˆºJ1tÚÍ &ŽEÜÅfA€‰­$¡Ô‹Pˆ[ŠÎ° Ì¢Gµ”ZÀ{ù˜¡30-ÃÓ“žâµ ”ѨEL1Üœ÷È +p)ñd0b^¥jDS…iÞjL!:†»YÁ jjJÚãz­L‹ÌYHQ¢Çè°p\±T Ó¹¾…WY˜Þ™Z1M-=wט«zË'Œb-ÖÐN’‘…#©èÐn4A:p<¥)Ìïùý‚…µý¿E"„|µ›ë­DK•¢r${ÿ-B*º†þ‘ÖI{ÅH…s†Û/ýyéçÕbÂ>.éüîêXîòù>ʞϞ­k‹9;;ÆG«r™‘3<ÃÏž­ÙÞÛ˜ÎðÁL¦ªwñTv|Øîã]Uütf`(íÖÌöWöÅ:¶Ÿ*©¿¬ÎKüq±Øä¶øãÏû¦ù¿\”Ýë&EñÄÓ‰»´+ÝÕné¡6eí·¡þ½ü3¾ó®«ÁïÚÚ­¶’‚üØ8-9‡Åi@åÎn_DžÝ2ÛÒµÇ'lùˆô=•'E«ï™ìn}àw9YL‰'¾œü†.Ž>.¾áîñ‹åýrÿŽ®?¼0ÍçSƒ÷OüÖó¨÷Ö7vUþ¸ÍÞÆ×swq·ý‹¤Òþ¥çdÔõûÿº;yß+¹mÝ<¦§ºÌžsýWzj죃|€›Ì<˜(©èÊ;­yñu^/ýcéøXYB¯øf~ endstream endobj 17 0 obj 816 endobj 10 0 obj <> endobj 13 0 obj <> endobj 2 0 obj <>endobj xref 0 18 0000000000 65535 f 0000001690 00000 n 0000006763 00000 n 0000001631 00000 n 0000001738 00000 n 0000001471 00000 n 0000000015 00000 n 0000001451 00000 n 0000003608 00000 n 0000003337 00000 n 0000004529 00000 n 0000002148 00000 n 0000001888 00000 n 0000005642 00000 n 0000001815 00000 n 0000001845 00000 n 0000003316 00000 n 0000004509 00000 n trailer << /Size 18 /Root 1 0 R /Info 2 0 R >> startxref 6892 %%EOF hypre-2.33.0/src/docs/usr-manual/figSStructGrid3.svg000066400000000000000000000434661477326011500222630ustar00rootroot00000000000000 image/svg+xml(1,1) (4,4) part 3 (1,1)(4,4) part 3 hypre-2.33.0/src/docs/usr-manual/figSStructGrid4.pdf000066400000000000000000000201501477326011500222170ustar00rootroot00000000000000%PDF-1.3 %Çì¢ 6 0 obj <> stream xœí[KoW Þß_1K¨ªé±Ï{[©ŠÔ%›Š Z”H…Vê߯ß3(…"$îõœ—ýù³Ço–´Â’ø¯}¾¸½¼¹üð´,¯þ¤Á˜–¿/°üL?¯éç÷KZ{ÍËեͶ@¸–åöÊ:,,Þ\ž½3Úh V”±´ŽN{_€6¢GelSòÚh fl3,“C*]F·e7——ß]*ë7Ë ã{ç·„ô¥e×}µ‰>˜3\M#艿Vy@ÊÌÁ'æ–tµ˜@DÛD%ˆûÒ0?Á"ççÄêdÕ˜®L×Uýº¼¡«ˆµíãÅíòã5™€Ÿ\¿û@ŸU'‘óšqÁÊÿ^ß^=ôøúõ…f¿þõòX®&|Ï©5çïþøÎêçoùÁO×Ë“ÏRë`“š8þŸšåcÕ—çJ§öÞÄ_•ßGx£Uþ “ú 2O˜Í!IV@Ï‚ÏN¾­/± ùƒ§’Ë,ÙZþ:› Ë•¨`[cæ–l˜Æe·Œ˜ŽÑ1e?-Ô?<¹w<å±’®•Móõ z[+™µÍuþ ìË}á H?bu[V ©ä/ˆ*a­%ÖÆÓ’|„›©NÁ–ØÑu*©`#ì±6š™{ê˜6*V TBq­±ƒëH‚1lò¼v]9e¬Ûñde³c:òñµÚ¾½È©²;‹Ut2hcÌÖ"ÊSì°QÏìC6"0Ë©N%`¨‚#ÑTuä&É.6$L˜£åˆ‘™š5VH ‘Þl‹R–Òša—jŠ Ç"E$!Oc º&tUŸÚè¼Sy,ϘÊ_òØíšûÜŸ˜Û´[ÈÑÊø¢i®~?ºC.q·œóþÞD›M2˜ñØZ³e³dVĨ•qºÑÅè0PÿÐ$Å{žßâÑó„Á è~WÌ û]ñäÙÙІÙ+«Ð HEœ{£ãBQŽhq ˜92ÐÃ1ƒ Ï9}a¢ †¨a‡`V-ÏÙF%cob"êT!÷8¯$ÑtÉC6r=³^Ùo‘‰Zâ†YÒ~Ü?Ëaœv–Ã!cnWòÐÞêd>D=‚R®„·èHÝ—¬XÛ<Àh `’%0y•!Hk›@tÜpÇ¥BsL‚Ø.ð Bø†d(|R`òŒz‡„]\€ÔP5ÓO€3m xŒXÔшS^1¬»F„ó‰ûªK0ƒj¼¡·NÑ;ßèýƒ‹Ø6ÁSj7ã0µh°›Ú;¸O½̨¾2ÖT?£ª—ëÁÆŠàjEO09#Ë8^1ü¯ˆŒìÀhÌ¡H޼¢8¬£Q9IcIJ•FOä1­Èqûü'…õGeo*²&ÍñžÉß^rÉÍ€[µüƒÓí¤9ž‘¹û@2)>°{’þKR8eõT<«/ü¨¬3Ç:¼»ÑÔujA7@Ëûf%ÙPKj¥$ß¹¬Ì]ÁÄ”,Ù‹G#²#IMMï ºKW˜Ø’ÈmÚ¸ð(ÉÍÆ$$머‘ªX… tq6ÉÙ^r¦Ž[Xzuu±Ó†D••¶û(zzN&WÜŠX–›Úì.C2ÉIÏC÷KŠdÖ€SfOJhжvJ¶£x·›N9„d;{²=ÑÊY’x¬ê÷ÂëJ±¹œÌ7^ƃ Ge– ù¨j”TIõÓç’Ynésu´·ÝJòæn_¦Žý©`!íZy±­:Óåã.`9FïIV#·R26R¦ÑvÖMŽ,³~êî õNR¬˜ïRm;Ϧ@†z>;בr5Y‘“†¬äÈ0ä%L;\&p”+j“ãÄPR; >9n,*R²Ó8fæ4Ór8MEÇÙœvÀ9 /sšY«T›(¬“«pZlT…ïìˆ*\‡aÊM³b7uÍ‹ÝÔoVì¦~ób7uËé¸ÝòL«æ®«Ýêö›O4¬7Ÿio>Õ°ugå+CCN¸C Š%6$Q]ºn8#&ƒØŽÅ*X £TÂ)Iˆ¬èGEZD×H¸‹ÌIY”ÖdÜãŽ2^Ä$¢FÙˆ¹iͶÒbÝö &°sƒ'L¯àÓ:xÆnedw~2›{™Í‚ÝÌ¢Á~fqcFñF°¦y*XÕü¬k~V6äJ‚Ó CÁù†±È †ÀȆÐÈ)Å3Ðß‘ ÿ‘¯,>"ŸiølùNckˆz[®ÔÈô<ªa»åØC¾ú‚_…Ç‘?¾l…‘?Pap3*­ »èõôŠ«7£HéÿTK[¨fz¶›üöMŸÍ™¤Ï£§þ*Â'' ÌEC½X­·-{Jgé㺳°hVÿ}»µb§HlÆšÇfìt¯öõƒÜÓæÏªÕ«ñ&ª¸ë«Þ]õàÛ¯¾Ñûº>`·7½Îû_'üGëýl§¯µIÌ6£S9ïs¯WÎ&ïrs6yÏ&ïÙä=›¼g“÷lò>H“÷“+سí{¶}϶ïÙö=Û¾gÛ÷lûžmßOmû.WgË÷Z¾lKj+ÒB)ÜEÐJ5'ÔÔ¬(7“ì%,H²S }h¸'¤fÔgR:ÌL¸Û§: Û9ÕùÛô¨ö–ázÒ‹¦ë-ꨌÚ6èÁ:ïÈí8_¢z·_kûÓ¤µ·ÓF©!´%îîÂüá·DMÂÍ=d' ™«öñ]pO¹aYÓ!,/†_LÿÍoz?÷êæqƒÁÕÃÂ@x5` ÒƒÂ @P¾qü&äÓÿß´ÿKR?€ýb«tݽ&­tÔš(ÇÙB"TýI&ªÒš¡ @_j·rÊÆ›õ~Žóu‹ÜÔ¿ ÿ¥#£¼qÓG«¢)þÚäm¶.·‚¯Ïnè+K·2´ X\ÚÏ•åOèï?˜¸ôendstream endobj 7 0 obj 2163 endobj 5 0 obj <> /Contents 6 0 R >> endobj 3 0 obj << /Type /Pages /Kids [ 5 0 R ] /Count 1 >> endobj 1 0 obj <> endobj 4 0 obj <> endobj 8 0 obj <> endobj 15 0 obj <> endobj 16 0 obj <> endobj 13 0 obj <> endobj 12 0 obj <>stream xœ’[LWÇgÀ]¦¡eÙÈzaOšx+”X[[AÛF0(×YÝ¢©Îî Ëѹ13«»¬ ‚6§ ‚tU–¥PÀ b”¶êƒVjjHmjZÓ¤m싦/gtš´³ÐH“¾õí;ç÷ÿÿ»’˜•@$™Qà*Ú°ncV)äYåµ|‘cŠTšƒÞ8ËÒæ“Ú‚ma¢¾SÿþYà™Û´(î™=GËL&z˜V§=¥^Öž¦jO^šVk"‡Éëä_K]%Û—eeeˆRP†¾ ¼ž›› ý¼ïÊ™h':ŠŽ5¯íªê¬ëFÔptplTíƒn[_±Æ~³›õ9‡m)x°6¢±4„Sòðѹ–{xXsY Ìñ"S…Ù•÷g OU\KZ¯×š,«Ý‡?¬šÇôWŽÝúãn¦ÿ$ÜV)…­®®õxOÏ·çpŠýØ©£§îP–{?™IVGZzÄÐO5¦ašk h…Øbõ”8BÔ‘ZÚ¢íc½?Ú'ð!=ñHÐY{Íz7²é©ú«z©¾ü½Ëî¯ï\=ÿûMû!¦±US–ÎòáüøøÅŸofZÜú|Çz&ÜDrBÝÄ®—v𒄨ÊÀÙÁëC/Ý·ÜŒÅ؈p¢¶ïÿ†ç%joã­VÙÌ©Õï J_fÆn¼úÑ_N¢ïl îçl۹߻+S¨ )¢ëÌÁŒÑ¯.Å®#êÖˆ§p¹c¹îÔ7ÛyŽçyR´Ä$C»fT›œHÃ7pê›Ø:×ò§ãÇÖ±ð' ½5ãJtÚ@­(Ëw„B-­u™á¦ú¶ª¨::Q‰(Ÿâ‡e׸I¼[ñ xñÝýJ.Û;ZL–{#羸=ïÁû·ÞÊsxs6ež®¹t³¿gÙn W”¾»¹L·Jöã»îh®Þ1Ç^Äɳc-ÉÉñ7MU7& endstream endobj 17 0 obj 1174 endobj 10 0 obj <> endobj 9 0 obj <>stream xœ’_LWÆï€;"µÚ5 =‰FAVRúÇ£¶‚ +Z£b4ÎîÜݽÍìÌ8÷.°ˆB%®—e1bŒÓÒ Ä¨‘´>ôEŒišHb‚‰êƒi_5ѤwdHÓY0ÒÄ7ßÎ=ß¹ç÷{®„–ä!I’> ¶·5íÝYý‰cº©™) çò5’óqžSžïns'fg?õ•£àزb§¢ý<{h¥óï‡Î?8/V,4JK¿Iæ¡Ê}mû«ª«õ†™´H4Æ ¶®®BIx£@¦$ªÃz/èÀšaƱÎjà[ŒÅ0Dˆ†¡uß7Áæz¨Ü¡)ªJth´<µ5ò¬A„±NqD ´…„ ]%Œ:­ &EÜÆfN€‰­8¡Ô‹PˆZŠÎ° Ì¢‡µ„šÃ{ùˆ¡30-ÃÓãžâµj5(£a‹˜ 12Àû¹ÉÌý±‚’άÓ‡³òDáãå£EEýSÓ~¥ endstream endobj 18 0 obj 815 endobj 11 0 obj <> endobj 14 0 obj <> endobj 2 0 obj <>endobj xref 0 19 0000000000 65535 f 0000002487 00000 n 0000007709 00000 n 0000002428 00000 n 0000002535 00000 n 0000002268 00000 n 0000000015 00000 n 0000002248 00000 n 0000002604 00000 n 0000004554 00000 n 0000004282 00000 n 0000005474 00000 n 0000003001 00000 n 0000002737 00000 n 0000006588 00000 n 0000002655 00000 n 0000002694 00000 n 0000004261 00000 n 0000005454 00000 n trailer << /Size 19 /Root 1 0 R /Info 2 0 R >> startxref 7838 %%EOF hypre-2.33.0/src/docs/usr-manual/figSStructGrid4.svg000066400000000000000000000627131477326011500222600ustar00rootroot00000000000000 image/svg+xml(1,1) (1,4) (1,1) (4,4) part 2 part 3 (1,1) (1,4) (1,1)(4,4) part 2 part 3 hypre-2.33.0/src/docs/usr-manual/figSStructGrid5.pdf000066400000000000000000000217151477326011500222300ustar00rootroot00000000000000%PDF-1.3 %Çì¢ 6 0 obj <> stream xœí\ËŽÇ Ý߯è¥7U¬÷6@ ;[³Ô&p`9Æ )òû!yHv_E9òÌ@†Û‚5Í®‡jô~K×¼%ùc?¿¸¼¿ü黺½û×%]ç˜Û»KÞþqi¹o¹OºÖíáÒW÷—\ó¸ÒF5 ‘Z½N&0vXuùá¼ñ”ÛöÞô¯üÿO|Èhe{}³\û¶ºüý ûìäýåÍ¥×¹åBC~)£+w>µ'[LEN)ÔøÀÓÂô‘Ï7ÿ3Úy,³X2–™C~db;Sù²mBu)[©Ý—©ì*ôª“c(£”gæ‡^œ ÊÔùqµ®|P)2>K N’<6}ÁÌ,UZéiÓ$Û +K9ääayCUÏ/IØÉ¹ ÓTbsÃ"ï.ïYÅ„ýøþaûó›0gys÷ƒâ#Õ0‰ÕW®…Ðäﻇ˫·¯¾¹ûéÂ/ ßýýò* ÝŒø£ÌÖZk~jüí7­~ûA^üånûöW±ImŠJ˜Mš_Æf} 6s×F[¦õO³Y¿m2ÖÅf»¦úelþbmª•Æ§Ž¡n¾4FŒØîMó¤ôç‚ ŽŒ¨’GQ/Ìy«ÃçˆÀAE~ðâÄ#‚P¶VW·aЖ[¶­©T A6Ìãº[¡Ÿ‹@K÷˳û7ožÜ;˼2¯MTóõ:g]PŸûº®Ÿ "O†§ÌüqÌ®‡ÌAíåyƒc­'€‡Z—iI'ãfÁ(Ô“º-„hêŒ=!³‰äm.ÕŒÐTš0z·™cÔõ}X¹tlØñ#ëÊnÇ ’ã[³}GÕSuw!›òdЦ¡˜mš ‰}GˆB8sL݈Á¬§>•YÈ ÎÄS³®›Y%I&ØT7‘Œ§GÌ"‰¾ÂŒn[ÔºÕÞmDÓ_mÆØTw¬úRI&Êò1á¡’s¢òhö©ÏK1UÆÊŠ©òPæa×2ÖñÄÒ—I¡G#*§¥¹|,C©![)å(7‰]'%›òD[â³u×db eZ®tµ9 `žd¤ZÂòj[ºµ Dv) ‡–°hòÝ"´SÒAs4uÌõÊ:j•#‡À"¤Å_X‹ÒmIZ±†¥) Ú”t#GI^²Ê„J1Еí¸ËZ%&³ê.ðš5à’s•“㹬¨™8øEÖŠ4¼&—´ûS&õ÷¶¬x _Ähø©¬ Æ®áárbø>x‰ÈN#n@Šˆ)1â äX$º‰8½Y ƒF#ºAßû`ˆŒ°•EMØ1"*¬ÜnÑøˆX ôD$dYŒæ"þ‘‘­‘9€äÈ+ÀydxAä$øˆe+xOä1øVä¸cþÓkÊ/ÊÞ\d-žã ¼°½½º– ŒîŠâúŸ’nÏñŒü·_hBfÆ' OÒÿÖÎY=UÏ꛼ª×Ub}¼ÑG©=·…‚nf\–º•dš`ÔPzmíRV–0fŽ”BÙ5®O¹k¨šo`Øe& ¶¤t_6®q”énã ¦1ªfä*ÌCÍt±+㸹£««6ÕÛ¸¬´ÝgÅé%Ýh/b…îÐA6Y¦f¦Οû% 9OuëLKg/Nhìжvi¶c7I—´½DŸdå,S2Öð\e]­6¢ÂYÁ|ïe|Vä€*wG dÉ–c 'ÿw£…lǵ”,A‡iöƒv“#Ë´Ÿ†[ÖIÀŠÙ.µ~°l dÀò©Ú¹†ŒTšÑ@Nrd²’#×(p™²£¨MŽCuJýõÉqc^‘’&>³–©VÜiQâgkØÅ×2¼À;×2µ6­vR£VLnÓb£¦ñÎŽh ãðª‘r笚¤Îy5I]²j’ºäÕ$uÍTýãz++Ýhµ ¬v­‹Ûï6[ï6ƒï6…ۺŠ╡¡$: …T;’¸.½î8ãHª<:©ßb”šb%0LZìç$¡4ÐO@Zx†ÔHtð*ð$÷,Nk:î~Ç/|’^6cn:x³­4_·}#ع'Œ¯ˆ#ÆuÄ“ÊbÉñÉtÑËtÑÍ4ÑÏ4n‘Q­QÓ,QÕìQ×ìQÙpPnP1Ý01ß09Á9Ã9¥z:â;ò‘á?ò•ùGä3¸Ïžïà[{6„ëí¹žéyn»çØ›üõ3~Õ8Nþ]ìù*Œò™ £&8¿ªâá‚¢×ÈûK-swÐÚ4ιu¨ëBÁu©_CûR§†“7²lËµŠ¯Ë CµÉ±>ÛÆ!t´¥6K ZÇG)38±g¬¬8¦ÃÍRÛôŠS­hï]8"8M´GÂn!' sÝ>}[”©âó`{®‰UC·Z2 õ€ÕqÖ(ò,8Ê겋ʤ¡7˜opö½|¨ì‹ »¡ŠYê‘;5Ÿcu-§·m®êOÃßÊN³úLÛlõ°ï¬ðVœéßà…—i7†Á%Â̈‚ÂûL06¤k$Ë4úð/–ÐÒ0 @…Ÿëv˜mEí£QØcÔ~0Õ°ûì8J9y¸ÃÌx ‹N@ÎȆ@…ÕH;âÀ¥Ãq˜…©Ýî€á¾ -Áv7» è»epñ†¾Ä¶p“n×É‚ˆSz“ü¢qÜ×ú¾sIKçÙPoEÎ AãS®å.:: ß\jÒLèáÚPÆL[Yc—k’+›ÐqVd¸þ³fu· ' ¡ÌjYwv{f­5`i-SœkÚZkÈÜqÃ1S¾q:ªXQ:Õ1ÇQ¸(mxä 3hÃ*;掙Yýfê(税ùæ< ãýH¹?ùl÷6ßÍ}ÑOsOunàÅΫû·Ëb¾o’FT˜.\?LTyQ¦~S‚fÔÃi†5EœVÖ`Çyb⇰~K@#B)p ² ´E€ Fð&‹Öþ}cåã=莤èG€_D2ËD¢?íI蘢ž$ÿiô0>­Ç÷|Ù·>’}¥DÅï$ÚpivO$Hú†Çµ.ZL¤—bw‡/ÒÝñ"ŸJE9ífÝ—¢u«Ÿrò´æNב+#kkð²Âé!ÈF:îtÍøÒ>¶V¤ÐÃJ=)ohºãïïï»ïMêÏôÝÙoXcéÚi¨¿{ý¿Q;<{㿞ЅéÇ{ø¬´>äË5Þ¾û<Ú±7»ßvì—«¦·íõSíùæ+ù5€ôÕö÷9ßñÅIœïÊÆÖ÷Ïן?:ÄN|ø të¯/زÏyô7kÿm”³ãÿE~ú~ÑŸ*oøŸôÓ³SvêÏNýÙ©?;õg§þìÔ?G§þìÐo÷g‡þìПú³CvèÏýÙ¡šýÙ™?;ó׳3væÏÎüõìÌŸù—ëÌÿß©ßB¯^ú@Ÿë׋øOس¿mv?ÚÀ¿ÑóSvóE$/S{Õa’P ~…H÷ëáúÙ=p¡~eÚ¯'ð¤e©~Ìˎבn£ÒÍÌD‡}š_Áìœæ·7ã£Yðw>Ûôj¢š·3ÖØ$/Õ×Gt¿¯5ýa¿Þ§iûîÀ .Á-cç ‹Ü\J¼{™´_t.ôã»Ðñš5BóÊaØÅøßíùܪ»Å ¯_h ^õõwµ[|Úÿwmÿš`‡l¿³SvoʉZ£äv6~3,k“o÷R‚ðŸå’€BãÝú;·ó±Eé°oÖɤ ô’ƾ‰h{ ÷ÙXnŸ{ÆÆ>Xû¥UaPǹºü[þó_ÏNÓtendstream endobj 7 0 obj 2965 endobj 5 0 obj <> /Contents 6 0 R >> endobj 3 0 obj << /Type /Pages /Kids [ 5 0 R ] /Count 1 >> endobj 1 0 obj <> endobj 4 0 obj <> endobj 8 0 obj <> endobj 15 0 obj <> endobj 16 0 obj <> endobj 13 0 obj <> endobj 12 0 obj <>stream xœ’[LWÇgÀ]ǂкLe½°'&^±Äzi…ÚZÁB±¸¬Èꊦ:»;,GçÆÌ¬î²‚ RØŒ ˆ ‚tU–µÒÄ(mÕ­>ÔhHmjZÓ¤mlb$}9S‡¤…Fšô­oß9¿ïüÿßåàØ”8 ÇñÔœü¼ÂÂÒ‹!KKodóŒ;_¦花tu6®Î‰SçÆk;´ï_ø^8 s±‚Ž„éjZ"Ö1ÇP9ãÏ„×ÔÉêè«j x~ÿk‘½hëâôô¥9¼à¡§Lofff§üCÀzZ‚,Ѓ½4à ,ÍÉ`3M¹Œ¥¡Íž]Ÿ­c(·r WÔ©ÍëÔkÐEs½”ò"`&ÀÅsn(Cž“2À: P@h¤@û\´K@‹,”$=P‘âdÚ d@ÎÅxÝ1{ý¾”çd ˆ¼ÎYèR6^’%—莶õ¹5Êe”ó• Ž_ªgºy—7ÖÍK&S“€Lû䘓n( å×}u)A„ã%x%Èy&Ý—‘öP¢›¡¥qÝØT&ûÿêšÆ?þ–Ïzée‰fJ3¬uz%Pij¬|&(i7ô²`bÏÿå“[û{Ä0ŒD™Z¾b%À°MØfÌŽec&,#1›¦ÿl ÖŠâVüqܪ¸ËqÏâFQc’Z¯Q”Ù«®áçÕtòZðDâSª«]U% ÇRSÖUN…¨PCÄXr$Ьt*-ÍÑŽ'O5olMíõ·ÔU4ÍCùhÝ#j(¿hçžÕ6Kš:?à®ÝZkF-»È®`›ÜS·aÏBÏƾ›ß­ÞŠöP{óÅȯ–Α“Ú;ÃýÑpWHRÍJHÍ á‘ÉzD¨¥äi~M7¶]?}õhÛç£m}Ÿ}Ñuí\¸U9ª«;^ÝVÑZÓ®=áîÁ¹ :œmùË}Dî÷ÕkÓ™“PwuHƒ3””…ŽÎ4=D=ªÌ1ö£ù†2£=k›s K”ݘš§ULO*‡>®˜å¾P>xw úÇý4ïi¸¥\(æššæãß^BI–cgN œ¹G˜þdÔ'Yò «)!]?YŸ†a¦É§æ"é,Þ¿? ‡?i:>9Øù£eÔâûmÕ7¼gw)f-Y[¢kËÖ^u|sïúåßo[ºë+•JÂÔZz‘»<4Ôÿóí4“CÛ„î‘ç‚m~EPlP3ÐyÂvV¢Üw¾ûfôù•G–‹·¢Ý‘Øë¯îýG¿¡YñêÛh3)é|¹ò]…Б½óô‡¯F”ïÌOselٱϵ3+H¼ýÜÔ¯¯Dn*Ä^gî2ë2ͦZX†eYŽÔø©ºvÕ€:2<ÝBÉ+9Óô¥ çä`ðӺΪ!)¼]ùX^’m šškÒ‚ µ'*ÂroàT¹Bx$/,¹ÁŒ UˆDÓЂûûúŠ®ZZš ¦‡Ã½—¾¼;ëñGwÞʲº26¦­ºrûBÇb¾ÕSVü^a‰F –X[!ôú3uEW·¡#d®%¨y†ãØÚ±÷ùyTotjK (Å8ˆ–Ǧ=#Q/Š®Ñ¢†$ý¯ï ©öÚ2F^A‰ ‘¦ÄD û}ÃVB endstream endobj 17 0 obj 1235 endobj 10 0 obj <> endobj 9 0 obj <>stream xœ’]hWÇï$îÓ$~´+ 6é¥&f _Q[MHM»¦KªXSgwîî^™™Î½›dclRƒëÍf#¦HÇÅ *†êƒ/H)(DE)ø >ˆ¾*(øpÇLg1…¾õíÜó?÷üþçž+¡H’¤O‚­¡ïÚwÔî& L×¶0E#‘|~³Br>-p* Ý­îØôàô¾J<»¨Ô©*Ag¦\æ¼]ê¼^ì¼X2×(#]•þ*@Õ{ÚöÖÔÖ 3e‘XœA}CC„Sð^&LIL‡Ï½ k†™À:«ƒï1Ç%†ÐžÁ–F¨Þ®)ªJth¶<5” {Ö H"X§¸¢†ÚÜ"†®F ÖÁv PGˆ¢îŠ`3/ÀÄV‚PêÅ@(Ä,EgXfÑ#ZRÍã½|ÔИ–áé OñZ… ÊhÄ"&jjžóÈâ Ës)ñd0¢^¥jD’ùi>hL!:†»XžÆ jjJÊãz­L‹ÌZHR¢Çæé°pL±T ÓÙ¾ùW™Ÿþ5µbšZjö®1[õOÅZ´®•$ÂI mFBÑ¡Õh€ ´áXRS,˜Ûó æ×öÿ‰òÕWo¨ ´ -B~TŒJ‘ìý´©è"z&­’v‰á2ç·ßøsÒÍåbÜ>,·wüz~4{öä…Ï2'3'††‡FÊÅJçtÖÎŒò‘ŠlzøOóãÇ«¶ôÔ§Ò| Ý—®èY8™²{yg?šîL¹U3}å½ÑŽþ-¿•‰§o*s¿_(Ö»þØ«Þ)þœ‹’ËbÕ„(4~ãνŸírw¹[üC‹²ò§`ß.þ%ßvê«óÍ¿´µk-Ey‡9±nJrö‰£þ€,J¯}ayfãLcçNŸ°åv·Ù÷HžM¾—²»éŽßge1)þñeå÷tqð~áew§_,èÏÛéÒÝSSüŸ¸}äïî{=×<î,ÿ}³½™¯æîÇÄÝ´ôoJë·žÿá×ïrcâ¿UtݺrHOvšÝ'úÎuWÙGFx?7™¹7^TÖ™sšrbN+~øÑØhI BïOê~¤ endstream endobj 18 0 obj 816 endobj 11 0 obj <> endobj 14 0 obj <> endobj 2 0 obj <>endobj xref 0 19 0000000000 65535 f 0000003289 00000 n 0000008578 00000 n 0000003230 00000 n 0000003337 00000 n 0000003070 00000 n 0000000015 00000 n 0000003050 00000 n 0000003406 00000 n 0000005422 00000 n 0000005150 00000 n 0000006343 00000 n 0000003808 00000 n 0000003539 00000 n 0000007457 00000 n 0000003457 00000 n 0000003496 00000 n 0000005129 00000 n 0000006323 00000 n trailer << /Size 19 /Root 1 0 R /Info 2 0 R >> startxref 8707 %%EOF hypre-2.33.0/src/docs/usr-manual/figSStructGrid5.svg000066400000000000000000001046001477326011500222510ustar00rootroot00000000000000 image/svg+xml(1,1) (1,4) (4,1) (4,4) (1,1) (4,4) part 2 part 3 part 4 (1,1)(1,4) (4,1) (4,4) (1,1)(4,4) part 2 part 3 part 4 hypre-2.33.0/src/docs/usr-manual/figSStructGrid6.pdf000066400000000000000000000216461477326011500222340ustar00rootroot00000000000000%PDF-1.3 %Çì¢ 6 0 obj <> stream xœí\MÇ ½Ï¯è£Dã*Ö÷5@` 7g÷¨KàÀJŒ]ÀJäï‡ä#Ù=y-(+e·k‡SÕU,òñ‘Õ\èÖ®yKòÇ~þðxùpùöÏu{ÿÏKºÎ1·÷—¼ýýÒrßrŸt­Û㥯.¹æq¥j!µz,`ìðÔÃåÇßñÂSnÛ¿yÑ?ñÿ?ñ&£•í»Ë˜åÚ·ÕåïGYg.w—^ç– atùi¢Œ®Üyמìa*²#D¦Ä”~¥zÞý×hç±ÌÇ’±ÌòGÖ †°29_¶E¨.U+Õ¡£ûczv=ôª“·c¨¢”g潸”©óÇÕºêA¥Èø,-4Iò±é¬ÌR£•žöcš‚d dU)Ç9yX¾¡ªû—$êä\†Y*±»á‘÷—|Å„ýøáqûÃ=»0gùæþGÅG«a›¯\ ¡Éß÷—7ïÞ|sÿÓ…¿,<~ÿ×Ë›,r3á÷"°Zk­ù±ñwß7³ž$ÙÁ¦†‰d<ÝbItˆxdt[¢Ö­ön#šþj3Ŧ†cÕ/Ud¡,*¹&|TÍ>µó~)¦ÊXY1U>”yXµŒuܱôe§Ð­‘?UÓÒü||†Rãl¥”ã¹™$v›”lÆkIÌÖÝ’ˆ•i¹ÑÕä0€x’‰ê= Ï«oéÖóŒÁä~fÈýUÛבJ3ÈIŽ CVrdò¥.Sv”µÉqb¨N©ß >9n,*R²Ý$fÖ2ÓJ8- Jâl-»àZ†DçZfÖ¦Á.*kÅ䦜 5å;Û¢)ÆæU™r׬ÚI]ój'õ“U;©Ÿ¼ÚIÝ2UßÀ¸ÝÊJ7V-O»Õ%ìwŸ ¬wŸ!ŒwŸ"lÝã|eh(‰H!µÄŽ$®K¯;ΘIUGÇ õ[ŒRS¬†I+‚áœ$Tú H‹È‰‘C‘ä‘ÅiMÇ=î8ãEL!ÊfÌM‡h¶'-ÖmÝ`Û7xÂô 1­ƒgìTÆAvæà'³I°—Ù,ØÍ,ìg7fTokš§‚UÍÁºæç`eÃA¹AIpºa(8ß09Á9Ã9¥z:â;ò‘á?ò•ÅGä3„Ïžï[{6Dèí¹‘éya»çØ›üõ+~U'/öå*Œò+FM~5ÅãE¯‰—Zæ µ)ϹuhèÂÀui\ÃúR§F7²lÏµŠ·Ë CµÉ\˜mã@m©ÏRƒÕñRŠi;öŒ'+¶é³T6½bW+Ú{AÓíLØr’(×íÕ·±ìHõÀσý¹&žºÔ8ÓÐX{"ŸGCU]vQ’4ô3ðÎÞ—=û"Øn¨aV†yäNÍûX]Ëém›«ú§áßÊN³ú™¶ÙêaÝY­ØÓßÁ‹.Ón ƒK„™Á‚¢ûLp6N5Ö:œx,³ ÛÂßXÂJÀŠ~nÛa¾³FáQûÁUÃîSðã(åàäá^T s#à1Œ€œ‘ «‘vÄAK‡ã0 R»ÝÂ}ÁZ‚ín~ÐwËà }‰o&Ý®“—ô&‡yEyÜŸ/Êú¾rIKçÙPoE® á<¦§\Ëýèèàlx'à§&Í„n® e̬••»Ü’\Ù„³"ÃíŸ5«»o8Qˆd^˺²û3k­Ok™âà\ÓÖZ;@æŽæLyÇé¨bCéTdzpQÙðÈfȆU(Ì7³²úÎÔQάŽù< ãý(y<ùl6_ÍcÑwóHumÅ®«Ç·ŸÅbßN¬0ƒ.Ü>N&j¼¨S¿)A3êá4Ç"N+§5ø1(O\tïYA¥ÀM-@e$ ´A ƒ¼ÉØÚßo¬|¼Ý‘ýHˆ‹H&™H4ˆ§= SÔ‹äß!Ƨõø¾\ö­Ïd_iQñ;‰6\šÝ '½ãq­‹“‰ôRÌâðEº;^äS©(§Ý­û£hÝꫜ<­¹ÓµFäÊÈZÇJ^V8=†Ø HÇ®™^ÚÇbE =< ï\gì™gÛí{oúWÚí.l¨´}÷ëÝ©ÕÿÏmzï©/¼Òy¶o.½mÆ/¯Ca›Zïî•t÷Ó«mÛsãûÄÔ•¬ß‰¶ûÛ,nbª}˹‚˦nôó·SR 'G¹3è?k£OnU>ûÛ)ÏÿFÇÙ5•r±ï*/?¤áýeásvºÎN÷Ùé>;Ýg§ûáìtŸî-nÂg‡{{8;Üg‡ûìpŸî³Ã}v¸Ï÷Ët¸ÏÎöÙÙ¾ží³³}v¶¯ggûìl­ÎöÙÑ~mm/3{Õþ a‚H ^uq÷ëáúØxP²ì× DB²R_ÆåNÇëD·‹‹Iéff¢Ã:ͯP¶OóÛ—éÑŒ¼]Ï6혭,£­5ÉKíõDî·óµ&?¬×ûq7m½´AaÚ22g‘êßOI¸Bw/ÓCö_çÂ>¾ /LaYÓ!,¯†_LÿÝo8Ÿ{u÷ø×‡€’D@ÒW…@½@ý»ÿoÚå=ýÿ›öMðC¶_l©«7ÕÄG­Éq;’µAÆ7s)xŒW{Rà£Åx·ÞÌí|,Q:ü›õ_ñ((›¤)ƒ÷Z|ä}¶Qî’c Ó/‡½@ÒŠ.¤ã\}ü{þó5¼¡bendstream endobj 7 0 obj 2928 endobj 5 0 obj <> /Contents 6 0 R >> endobj 3 0 obj << /Type /Pages /Kids [ 5 0 R ] /Count 1 >> endobj 1 0 obj <> endobj 4 0 obj <> endobj 8 0 obj <> endobj 15 0 obj <> endobj 16 0 obj <> endobj 13 0 obj <> endobj 12 0 obj <>stream xœ’[LWÇgÀǂкLe½°'&^±Äzi…ÚZÁ@±¸®Èꊦ:»;,GçÆÌ¬î²‚ ¥°Aéª,k¥ ^£´U´úP£!µ©iiL“¶±‰‘ôåL’viÒ·¾}çü¾óÿ—ƒc“0ÇÓí[ ‹r™%cä7rÖS¨Ð,tÇY¦6×f%h³õíú÷/ü/œ¦ÙXQgÒT-#ëœeªšögÒkÚ‹TmäÕqµF¼¿‰ÿµÀQ¼eafæâ9>Ðõ£uÐ?ØknøNïT-zª¾H/Ñ—¬¾êüæÞõ‹¿ß¶ð4T©U¤¹­ì<qpðòÏ·3ÌN}#ºG µTQµCÝĈÛ8QTÉ ÿÙž›±çWYÏߊõDãlPQ¢¶çý†f$jo£M”D0…JÕ»*©/$½óô‡¯†Õï,OóemÞ¾×½#ƒ¯Ê‚ãÌþôþ¯¯Doªä>WþÛÝ®o°r,Çq<)k‰“ íê~mxhº…R—#jºù JCϩЧõ]Õƒrd›ú¹´4× 6·Ôf„ëŽUF”¾à‰ •ôÊ>XzƒF+…¦ y÷÷^*¾jmm6™õ]øòîŒÇÞy+ÇæÎZŸqºúÊísƒªåVoyÉ{JuJ´ÆÛ £×Ÿi˸¶¢ò ”¤˜ŠˆÑÕ£ï sL¨pé‹L(@‹LˆÑ)Ï(Ô‡b«ô˜)Åøë{Ú#Œ¶‡‰è+(9)ÚœœŒaV_ endstream endobj 17 0 obj 1235 endobj 10 0 obj <> endobj 9 0 obj <>stream xœ’_LWÆï€;"ZíHO¢Q(+kM0þ‡ èBÖX4gwîî^3;3{XŠA‰ëeYŒãX»‘5%êC_Šiš&’˜ Fcâƒö¡i_m¢‰wdˆé,1é[ßÎ=ß¹ç÷{®„ä!I’>oß} ØÜVý ‰cº¾‰) çò_:_HÎÊ<§<ßÝæŽMNoð•£àÕEÅNEúaúÈ2çýgÎÛ%Î?K祥;Òïy¨ò`Û¡ªêê@½a&-1¨­««ƒP>(Ѐ)‰ê°Ö :°f˜q¬³8€1°†Ñ0´Ülª‡Ê]š¢ªD‡FËS[!ÏIëWAİ@›;@ØÐUˆ¡ÓØEAjâ0Q4À]al愘؊J½…¨¥è «À zXK¨9¼—:Ó2<=î)^«Vƒ2¶ˆÉÀ#¶64Îyd1…帔x2¯R5‰Ü45¦Ã],Ç aP 55%éq½V¦Ef-$(Ñ£óôX8ªXª†élßÜ«ÌÏŸL­˜¦–œ½kÌV}äF±©i!ñP‚B›Wth1ê m8šÐ æöüß‚ùµý¿E"„|µ•›ª-C‹¢b${ÿ-@*ºþ–ÖHÍb¸Ä9Ëíwþ¬ôë 1n/î¸xm4sõÂõUé éóCÃC#¥bµs%c§GùHY&5|–§ø¹s[{j“)>êK•õ,œL Ù½¼³ŒŸIõ&ÝŠ™¾ÒÞHGÿÖÓ%â¯wåY‰?Í_¹õþè›Þ)þŠ‹¢[bÍ„È9~ïÑ“Sv©»Â-ü¶IYý]°¯™ïàÛ/í¼Öxù¸­Ým*È9ÌŠS’Ó.Îø²(vöøBòÌ×3õ{}–»¾—ò„hð½–ÝÍün,#‹IñÌ—‘?ÐÅñ§ù·Ü½~±T ßþ"¤›/Mñç|ràáÉÝOzîû£k°ôö{ _ÇÝåÄÝÜú¾¸Ò²ßó?<âúýÞ›¸ÏïülýtBOtšÝçû~ì®°OŽ ð~n2óP¬ ¤3ë4dÅѬ> endobj 14 0 obj <> endobj 2 0 obj <>endobj xref 0 19 0000000000 65535 f 0000003252 00000 n 0000008539 00000 n 0000003193 00000 n 0000003300 00000 n 0000003033 00000 n 0000000015 00000 n 0000003013 00000 n 0000003369 00000 n 0000005385 00000 n 0000005113 00000 n 0000006304 00000 n 0000003771 00000 n 0000003502 00000 n 0000007418 00000 n 0000003420 00000 n 0000003459 00000 n 0000005092 00000 n 0000006284 00000 n trailer << /Size 19 /Root 1 0 R /Info 2 0 R >> startxref 8668 %%EOF hypre-2.33.0/src/docs/usr-manual/figSStructGrid6.svg000066400000000000000000001032411477326011500222520ustar00rootroot00000000000000 image/svg+xml(1,1) (1,4) (4,1) (4,4) (1,1) (4,4) part 2 part 3 part 4 (1,1)(1,4)(4,1)(4,4) (1,1)(4,4) part 2 part 3 part 4 hypre-2.33.0/src/docs/usr-manual/figSStructGridFEM1.pdf000066400000000000000000000326501477326011500225540ustar00rootroot00000000000000%PDF-1.5 %âãÏÓ 193 0 obj <> endobj 206 0 obj <>/Filter/FlateDecode/ID[]/Index[193 20]/Info 192 0 R/Length 69/Prev 13408/Root 194 0 R/Size 213/Type/XRef/W[1 2 1]>>stream hÞbbd``b`ªŒS@„`N‰Œ 1+ëˆ bq€7H¼9Rd100¢ÿ%þÚ  endstream endobj startxref 0 %%EOF 212 0 obj <>stream hÞb``àf``*`¡u ¨€ˆY8Ÿ¡˜Q™‹å‰Ò’{¬§ <åfI€ëÑÚÕûˆ™´—ChžpSØ<| ªÙ Ë´ Î endstream endobj 194 0 obj <>/Metadata 4 0 R/Outlines 8 0 R/PageLayout/SinglePage/Pages 190 0 R/StructTreeRoot 11 0 R/Type/Catalog>> endobj 195 0 obj <>/Font<>/ProcSet[/PDF/Text]>>/Rotate 0/StructParents 3/Type/Page>> endobj 196 0 obj <>stream hÞÔUßkÛ0þWô¸Á‚dY²l(…&[Xa+£ ë ôÁKLbHì’¸lýïwwÖ)Ž—¸l}{ø°ï‡Nw§Ó'­œPB«TD|)™ØÁO$¢$I޼žLÆù¾X‚“…·òj¿(ªFD*Ör’?~,ÊÕºIË÷EkÅÊÉé&_íE–Êi]5ãqýó~d#›ˆ´J(ÀY§ù¶Ü<¿™—Ûb/nŠâ¶ÞæÕ[²ÝäÛB’ ¤ÿ2ëÍòºÉ7åâóœ¼fÍ®hkySï¶ù†Twm^N)Ùº^U«M!F‘“³¦Ø~…$Œœ??ä©ïÊǦÞÉo¾"cãËK¨€.ÃY|¨õ²¬Vò®¬®ª}äi¹Û7“u¾ª·4U~ʽ‡¶VΞ¾7˜Õ|÷TPz!G½lÖû{çRñ/¡­qš k­°JÒ8nm€þdsªõ¿hç5/!ÄqêÚKø¹§õÑ?æAù/éažSɆ¾ ók“#ýx ‚òö5ñþ¡6€1&|ƒbjß ”µïêꃽÚÛ0åÄñÐn ŽVôÅýcë×Úã<"Õk\«€¨(d VPEö°º#ÓÂrÀ³…þÄþÜ1J˜Þ™a®œ‚ƒë®“¶æD%AGõ¡¿ØèË=u­/Ï ÛPçìá\O ó=ìƒ{ÍàY8ìó)=ÏÄÐÌ¢ž]<ݹèÏC€Éö:³ö@̘XÇÈÄ&K=S€¿aâw-û½ÀÀæ,;=LÀFðëÈž»ÿ•|ár­~'ßÈ]ëÄÙW“/Æ` >Ó*\„@¾^æ‹Bù1™Áàb~]_þò³L~¨÷Ïäˆ_ƒs€|»µñ%c½ókÏ’¯9ò…¥=)–õd&_¬¯C„îõs/Ôç^.ÔN=Ûféy‰½Â‹›œg^@IJ ÊIÖ 2¯Ž™7:ü|ø=ô_Îî Ú¿´'r=ÉÈþ•Øîá½È¼ç`²“úcæý%À놆 endstream endobj 197 0 obj <>stream H‰¤”Qk1Ç¿Êÿñîáf3“L’Ò‡n+T¨(—·Ò¹ªX<©m¥_ßÙõzŠÝ®µCÈÌï— I÷êó§ï7ppÐõ§Ç÷À70‚F¬…ĬZ°&’˜rˆ†Í]¿è×T4ëþ‡Š{Ϻ¹o'½¸ÄXi äk!ûük¼ÃÉ™“º?âc…¤F:(X›’ ¡¾@a•”2J"žSH Ìäübªÿ«`ÿj 1Q’À–Ý@•Ø¢X/1야J’f5òc IFVs¶4ô"PU®Vå ÙkìØš`‘4ÎbËV+a ¹€‹ÇÞŒÀå¹XöV…ß‘G ÝÛ=Ѐc­ÍíC­ÛÍWt­ í£/†Ñ6Xí¢{ˆGidüŒD„jÉþJˆ“¡mq¾¸~³Œ‹»e^`yÑ^ûn/†|&óÛ%¼lW»ûøeÆû9A_%ï% góüçbd£sOOܪþ )N’ê É?©‰m<~0 ­• endstream endobj 198 0 obj <>stream H‰ÌSMkA ý+ïhf¬Ñh¾ äÐM -¤4ØC衸iHBZò÷+ywëµã{ØA;«÷¤÷¤½œÝy˜ÇÙïyžaþyõ„ÕÚŽGßH,üŠ™ÌW×8=ë€Å'-κ÷'à€ãã·'zIž(Ð ‘¡cmú¡Öb —¯,”þ:]añîç?ß¶ãXð‚HÏØL¹ TñUZ!jXßbÑ- ÝR›()Ëî£æ_c¼ÕÇE3n°Äù¡LÙK5Âh„=Ð1œ(ÌYÏ7¸Â÷7{Z©41‚hÕÖ& ƒï {k÷åÊS¹\ŠçCKUí`O"Ò$¿,—} pÁçúD1Wòœ´e¨q¦–3E™4ì%‹ÙU"›p¶Ø®¨·M»ÙÇÜ| œI‹NìÛ@G2ÆÕa+ÒÖ £Ñf‘„ )¸›–OÉ·cK¢æÕÒqÞ–×$/)鲦ûL² ñâ‰Ëð–|¨u@ô1iF¹þºOwS&7RõE†W´!Ù÷íùÆ ÖB<î®ó¢ëj³]‡§˜Ç)ž¿8GÑ=7;ªÚQtYôjÚÚ¿ éXûD endstream endobj 199 0 obj <>stream H‰ÜRMK1ý+ï,lv’Él(=4mÁCÙƒ?`Ѫ°Bñï;Ùl¡”zð"ÕC†™dÞ›aÔcQk; g:µ’üìð†\˜#16ÆQ}ÒŒê5õº¦7§LÍ‘ª™C:"h"yºÁ=°S¨ø`3§èa›'%F´¹'äd‚0Ðç»ÉŧÂ^1á¯h®gô:Øf—vû²ÿxÄbÑîòíÊ·\®ÖúR&/éÁÄ4éo§ëà`RGž¸¬#šXÖ¡Í ãµÍ{®ã÷ÿãÏt,ßZt1hù$äº?¢ãåÆMG| 0Ýêí§ endstream endobj 200 0 obj <>stream H‰”“ÝjÜ0F_e® ž4!uZèE a/úK›´4J_¿#e6‰K×øÆ’õ>ŽG†ìc1ƒ‚$ &Áª‚eY€‘+/KZ”Ïî`7ðázØ}ü~ûû×W¸¸Ø]ÏŸ®@./ß_å—xÇ›X!ÈC_à!7yl3ˆº5&.À.èì…Làp»yO0ï°™ìçÏyþŒà}/,0Ôêðs”y‰åZˆØ€›#7-!¥cqEwíáÈx®U–å|{÷ ¨)Á9<²§"…E‡?ŸxKþ‰6½Â­ÊRÚ K° Õ–%Š–JgȪXóå¥Ò…•Z—oç$rb©€dŠ ¬;áQ'\2oã}’F|*ÿ“À$(Z‹CBAãJág8p$nýG[ÕUâžTÍ 4åb§*°ä  õt^…šŸs(òBüÛÖð6Ô†6?ÎõÑÍÀM ¯ãJ/÷‚·îJ6¸ò “—þœ*còç©Y¯¢gWÑZ7T¿ Còùc endstream endobj 201 0 obj <>stream H‰œÓÁJA àWù_Ài’If&Pzp«à¡BÙƒ "+(ˆ¯oÚƒÅ*Ûi™ÃÙ ó%“•døcP¬-Lá9Yf¼bÄ7«˜Ý¾<~Ÿ­†»%²b±¸^Æ›5Þ÷‰U(R ñÑÞ"Èû0C¬¥*,T*¸Õ$Y eÇã³a$ #(UËÀ8ÜC.ãX7'³üp¤QÓâ^{9L-žS”Òß™¢‡ÎxMÊ®…þOÙm,§(µŸRéø’”̺)¶d­MrZ?§É3ó—“SA‰,›ôøEíª©ŠG=½ž¨`úªâÐ^‹òajv.bÏ~Fo®Nr¿…ÚT½å~‹gbpð-À|«ì endstream endobj 202 0 obj <>stream H‰œ”ÛjÜ@ †_E—ÞË:ÎXr‘M -¤4¬¡I.Jhz [ÚВׯ¼Öa“f©}£Ðÿk>i¦»˜¿9899=›\Â/ ü«¸Ü‚ð#7yµÍ Q° • Ò ™DÜ.¡›/æ ¬®‹ù»U™ö VùKh ´E¾Ã" Ï/Ò·{ýõóŸ4;>îÖéÁõ»Š<°Wó°zxE%ƒI1—p:@÷~WŒo‹é†a´îR‡Ha¸…6#@2²•è:R,ì=ˆT ¶Ã®šŸïgÚüž•hv3¼Ý˜Øõ;ÞØV4º°¬Ï-É(ЪHuäj¶Ö¿nf¬MÅõl'>ì!vÚÚLXjEg¦PNÕÀ’‹}†å¢8š0´†Fes¢ËŠÞ×B”=ª‚V¨„Ú¨»ÉÏ<7”ª™Ý2’8xb“\~»WÛæ«!‡US—#ÇŽ²B|Ä/²}BŽ*EHFÕŠy&ynþ'$•s_Ê8¹„^¢†Öÿ!´w ß?†ö•òËF³Û8Â^¾49£ô¯û›RO —?ò4ˇ£¼ðtÀ_GýQ endstream endobj 203 0 obj <>stream H‰ÔRÁJÄ0ý•w:igÒ–=ØUð°ÂÒƒ°èª¸‚‚øûÎ6-[ÕzsH&ɼy/y<ì}J¡B^Ðaƒ«u ”×O»÷{,庽YÁ,——+?yƒô@AªÙ[-SRM)y™íeÛ1ÚLÕ@×Þö!>öGâøXEŽÄ)K’da6±FŸ~âLG΢©¦ O¹ÃëTGŠS!Q…ƒ„d&O"5óQ‚ ¢P›–tˆ·PâªVFã€È1{FŽŠ¼Ó‹i¥b,•I†%î‹<\øeg Ÿõ‚ÿæ^§] <º¸ùÕG ¥’ä?ã¼|<-üì}Ä—kôñ0 endstream endobj 204 0 obj <>stream H‰ÔRÁJ1ý•w¬Âfg&I7 KÝVðP±lÀ¨V-TPß1ÙÔŠôhf†7/3yÓuõª¿]`Ê˜Íæ‹X㤷‚w„'<àM“œÒ œ±¤Ç2Ø;CÁ1M6ûø±lœ÷jYiÅL­Wë[7úh‘4cä ‡0VdŸ‘½*§3¼:fª U~d ©TP"Ù^§iÎh¼îB?€Lã-0ôwÉÅ—–íðßæzÁ ƒ-WªV}óúü©uEG9[GgÅXn]¸,ÿhübu\cQßÿê芎uŒº®ˆ[°äÝäÖxq:‚mMÐ"î1¡«¸·âˆ¨)DÚR¦GLø´¡CÖø„•“X[°•ÃÖ Ë| 0™!ßx endstream endobj 205 0 obj <>stream H‰b``œáèâäÊ$ÀÀ›WRää¥À~ž™ “‹ |@ì¼ü¼T ðí#ˆ¾¬ 2 S/`M.(*Ò€Ø(%µ8HâÌò’ 8c-’” fƒÔ‰d‡9Ù@6_IjHŒÁ9¿ ²(3=£DÁÐÒÒRÁ1%?)U!¸²¸$5·XÁ3/9¿¨ ¿(±$5¨jð»%V*¸'ææ&*é‘èr"(,!¬Ï!à0b;C€äÒ¢2(“‘ɘ ÀIÆ8/ endstream endobj 1 0 obj <>stream hÞ²P0P°T0±T04P044V°±ÑwÎ/Í+Q0ÔwË,*.J(éû$™!•©úþ¥%9™y©Åvv@ Ž Í ©€Ä¢T V ˆºÌ’œTÿ‚r2RRüJr’€ì" ÏD¬ß%ÚÐÒ¬Ç-³$V?Xß=?$ßÎ ÀSö(h endstream endobj 2 0 obj <>stream hÞìZ[OGþ+ç±}(;·3 E‚ô¢Š$E€Ôă [j‰ØhkªäÏ·ýÎÎ,˜A8SY‰b ùŒÇç~·­I‘6dT"mÉzGÎ:ÒLZq$íñ¹2¤éÈxÉX ˜È8 EÆs £É$Åd Y‰,ß8ÀèÈ0Ùä!É {àrH&k%ÄÄ.$²Š8‚ŸÕ€Ð'aj Œ¸gòJz@Æ} €‘¼†²6âÒ)ÀhÈiòbXxãpo= #oá¨ä-„9ð³A”L€àç@äÀÏA?†\?† óq~PFbðóJƒ_ãÀ/D†Qä#”að‹I”&Ÿ„XSPˆD±Ç[ÀbGA‹ …9§Aõ`ÀÏG VŒJ€ /Š‚ƒÐ~ŒBµÀr‰£‡¾ü .)耘ࣥºà„"$0 ZÔ€Ñ\E9jèVÑÀh¨­P-”Šò‚q”<‰ø}HEŸ$¨È5¸,z(›ÀQ+ñSRØÄ»DT‚]P5)áƒ+>Z /&I”48iD9™1fàh­ Çâ2ðN+pr,䬕 ƒqoDÄk ΦîïwGçSt‚:ð† Õô>˜2„ã2Ôšm®ÀÂ7>±ð…_ù]tdz¡_¬Î†¾—‚ÅÕÚÍ»þÃê¨ÿˆbíN–7ýÛÙ­T³àœ}¼í»ÓÕpw9"ž,—«W¯`л»÷ž+)öQˆ”»ŒÔ»¬¼œT¼XJ^^j^cÑË!JÕË!IÙg¯Há'-¥?žÆâOVÊ<9i㉥ˆ¥£~¯ÿ˜ «îÇùõÝÐwßÏg×Ãìýôö§ayw‹Ë¿ºÓ›ùÌë/WÝ\p¸üÐ 0ÑÊz,înnv/»—ÿ÷åâ\úÎç“oÐǧ]þï^>“ld÷Œœ‡çIÀy p1eÀ¨t_ו7õEÝ齫/x_–ë³\Ÿå–b e¬e‘! *ƒ$d¦e (;@YÊä/ƒ¿Ìý2öËÔ/C¿Ìü2òËÄõ*SÿAé2þóy­˜ÓšsR–‘ÊðÍ2R–‘²Œ”e¤Ì>e¦iŸìO%Ë"Uߘ'7^G|Í‹7(¡¾ÔŽwqîâר­a·ßM©Çq;‡¼çŸíaøì‹m-_zTìWÙ?÷ïúóKy~7^Êó/¿Ì~­žßÙ—ñüþ~w \äãÓîôv¶ƒ=<\~8ÿNí¦üÌØ ¸è~éÞÌ>.ïòÊò„fK¼-ƒ°-ƒ´%·­ݶNtÛ:ÑmëD·­y['ò¶NÔù‡¡îˆTw|M:=qªàdGܬ¾ùûŸokºãéqÐcªüÜâžÎWt¶‘Ž+:×Hç*:n¤³o¤3]h¤ÓÅçiÄOñïQUAÕÙçqnþQQp³ÝiîvW«M¸¡à=âêM¸uÈMcÌ¹Ž¹i :×A7Qç:ê¦1ì\‡Ý4ƽ”ûal$T5aj#,j­U#a¬ u#aÝ+ì˜¸ÓƒÜ „Oš…m$¬3ǺFÂ:s,7Ö™c}#a964Ö™cc#a96µÚ:sœj$¬3ÇéFÂ:s\cæØ:s\cæ”5 9ðvCcË_S7{Þm­óƒ«.#‚l:oR§76L[§gë?Ihê”`ßHX§‡FÂ:%86Ö)Á©‘°n&^5ÖÍÄëFÂ'ˇi$œ’Åç~·i0ÓÆá³ç7­fZ9B6}Ó¡¦ªyÌ?›°?,®~^\õ‹FWÚ‹Áß/¢²i^ö‡ýïË¡'µÇÝéj6¬ ²Ón®ÿçåàf~½è^㺺_‡ùj¾¸~»¼ê»7ÃÙo££óò´îâ¹J(ÿ;S°ÛŸÐ–%mZÀ¦åjZœ¦¥hÛ‡®¥gM­hj3ÓcÑÒ¦§¡%G¦ÐOaB6…ctÆý ù?¢b~^C}•wÝVäÿ…¼µù_q•qÈ endstream endobj 3 0 obj <>stream hÞìYMo7 ý+úÕˆ¤> @\EÑ5ê=>¸ñÖ0êîÆHÿ}¥G3¶ ÓC=l4”5ï‰I‘"2αñƒ #~¥` †½ÊÑpV9Iº<9¢b|dCìLp#™è°ŽÙ$Â:“A@ìM!]§$¬/+ '} ӌץ®Áû^AÁE6Þü9)@ȯŠnT;uJ)Ø*Õ™d˜u“’ ëL6Ø à ‡ÊC†£bx6œDgšªÊøqñ:Œ85ŠF(`«VàdŸH2Ö‰Q÷k$$Ì2“Î0L–uFŒäì«¥¨5Eu&œjïŒ- ìUå çÕ0µ;ø|R³Àð¾!ŠñEuÇ ÆŒÁ„j^ì)°Z#&DM³ ¾â<`¿°(tÏø… KŒØ’à!«Õ\ 9Bo‚n!ƒcQ 'åJ@NzVÈ)èY9ƒ€R{rV.X$dåÊ@ÎЛ230(¹8 g =AX-œÕ«WÓ3¿\Nçð©¨Óù ¼¡ÎNÓ»ÝçãÙáóë×uqªÓ&Å6¤6ä6”:`·u 6p¤ ¾ %Ç5óÅôýýáÓÇYNv–ó†ÅÅmYÜT(M…ÒThkMi†(Í¥¢”Ö‹ÜzDú¦Õ<¼ú»ýõûëÝþˆ0&›Sœ~žÞ^ýuøtœ.>^}Øí~?Üaº8^ÝO‹‘ª,RQ…zsw{³Ÿ¾Åôî~úõþöx»¿ùép½›ÞÞ¿ûmM’¢õÃ$’lx‰°'‘\6œÁnï½°­ùóÈWuŸšzl¢rÙk›lÛ8¿Ã6þĦ³»Ã‡?VºVÌ™D²·ò@¡»ôpï'HD ñMEí4\VMŠ4Mp¬H%?Ò$dë5i˜‰Ë6Ï$¶¨&IÄEëF5©¨ ‘š«(‚æù2K =¢³i@»óHÁÖ¤m¤g™¥8 *b§A‰{‰ž!ðyXEì=*UòÍDfié´~XEœ 8BwѣŮqÛ2Æp’ÅûžÄkˆÆÁ£>ᮢÜ;g½Œ¹žJH›bîUPsqJe€†x:‰ëAczÜkû(õ&ËhR„kÓöœˆˆ@é5˜‰±Ÿ¸Í^„4ЦŸÀÔ}4½SÍ u]óhš.£%"n©2\#öweÞ@Âü2'«7Ò¤-ñ$n\%ù™ky$å™oƒ*þ‹—î Õ§f†¨~Œ&¼“—w(²*É QÃ]ö!úñ6X4Ј=´M\»X¿îBÐkåñ&Äõ¨ökÑT´pGu^Zõ¹º=ñ±ïÍ}ýªp"À-Ÿ"¨Zöæ¾×`îlkPôsÌ6þ³êl¿ÑòË´×!x.àêâ7õpûÊÇÞ¿ ¿Á¹©ÿ“Qîn¯wÿOŽMþ-ÀÏ#¥ endstream endobj 4 0 obj <>stream 2011-01-27T13:44:31-08:00 2011-01-26T14:42:54-08:00 2011-01-27T13:44:31-08:00 Acrobat PDFMaker 9.1 for PowerPoint uuid:9a600514-0935-4b2a-9066-71f9c84722b9 uuid:256c9f88-768e-42ba-bc91-f4ac363de605 application/pdf PowerPoint Presentation TID Adobe PDF Library 9.0 TID endstream endobj 5 0 obj <>stream hÞ2´4P0P0´4T06W°±ÑwÎ/Í+Q0Ô÷ÎL)Ž (Åê‡T¤ê$¦§ÛÙa*2…( H,J ƒM BÑ`‡#á endstream endobj 6 0 obj <>stream hÞTÎÝ ‚@àW™;Ý‹rW·Ci ‚„½èVH*'¦•ðí³¢Ëç|•Æ !Ë¢¢÷gâð¸7"ÚÒíîºa ŒÎ·Ôç14›X*%U¼TZÇ =“ë@Ê`jû¢fªœkv¥» C:Wp"KOdKmçETRó¯­T¢u¢¾šejúG®¡ ßÚŠ£'Etlýà –ñÿyþ`4±@¥ endstream endobj 7 0 obj <>/Filter/FlateDecode/ID[]/Info 192 0 R/Length 71/Root 194 0 R/Size 193/Type/XRef/W[1 2 1]>>stream hÞbb&Fѳ L Œ/€{0`+üf ±å ‚ ¨äÌB ‹F0þCáŽ#€`œ;ƒ„`Ú”ÿ ‹ endstream endobj startxref 116 %%EOF hypre-2.33.0/src/docs/usr-manual/figSStructGridFEM1.svg000066400000000000000000000766561477326011500226200ustar00rootroot00000000000000 image/svg+xmlpart 1part 2part 3part 4part 5 part 0 (9,9) (1,1) 0123 hypre-2.33.0/src/docs/usr-manual/figSStructGridFEM2.pdf000066400000000000000000000276261477326011500225640ustar00rootroot00000000000000%PDF-1.5 %âãÏÓ 121 0 obj <> endobj 127 0 obj <>/Filter/FlateDecode/ID[<327E04E173DB4143A28AEB575313AB55>]/Index[121 17]/Info 120 0 R/Length 52/Prev 11858/Root 122 0 R/Size 138/Type/XRef/W[1 2 1]>>stream hÞbbd``b`ŠŒS@„-`¹Û$¾­``bdಉ!þ3úþ0î endstream endobj startxref 0 %%EOF 137 0 obj <>stream hÞb```a``Še!eTÀÈ’åh@cbF[¦ùâ–²P¥š-P-/€˜‰A+B³'Â5³108®†¨bd0/ endstream endobj 122 0 obj <>/Metadata 4 0 R/Outlines 8 0 R/PageLayout/SinglePage/Pages 118 0 R/StructTreeRoot 11 0 R/Type/Catalog>> endobj 123 0 obj <>/ExtGState<>/Font<>/ProcSet[/PDF/Text]>>/Rotate 0/StructParents 4/Type/Page>> endobj 124 0 obj <>stream hÞÔVmkÛ0þ+ú¸ÁR½X²l($k¶ÂúBÖAé/ñ³Ä¶ËÚ¿;Yrl7Iiûa¬ôïEî¤Ó£pF¸ ‡?ŒœÁaÄãŒQ GI¸ö|ø€ Ð×ðáC„;z>™Œã2Y‚7÷§§tt‘_ñºLèø‚^æÅ&^ÓɈ°Ÿ¦W×Ö}u}A8F¤*]ÄåoˆÏ:{Ú&ôì±úUq•Ðy¼›œoëÉÃáá•ø {Ó"8ïMø ñkõ• ”ó$«gž “xû5I—«Šø¾G?'µkà1M§ëxY’0 Ó<«Æãüñn ¤6>Øxæ€{ãÆ›týôa–n’’\&ÈM¾‰³Æwo +ô€Ãد£Á8_/ΫxÎ/f&*ªŠ¤š¯\½hº­óÒŒÑ:t”-× pM£*Ù|‡$d].FcêEº­ò‚þ°Iå™z±W0äxgÙ<_¤Ù’Þ¦Ù(+ÓFŸ¦EYMVq;Þ]Ét-ôýÛ¡~V˜Õ ŽÞ¤×äЋjUÞi)B1â!\4EcF¸xÆâÁ7ŠñiVǃŽ#úÝœ—¤ÁÑl'f-í¦ÑBt¾1“Ä;ç$Ýø0t7G)¿£cœ›ƒbò¶5¹õ›Ú@¤”ÍØØSؽ@]Ø}C{§>X EXb˜œú%àfF\ßSv®êæÁYoãj ¢"Ì0©Ýì6‚C6“ž-ìgÏQšèæêRÐpÝ…_×ì3¿±™ú0^6ƺ=Õu¬ëçC›V;iÎu„vûâöÚ‰ë…}‚û¼ÏîzâXÏbž]_\?´û¢ßÈpçoI«×î»L,¼W2± ËÄ@Åà-Lü©f¿Xd`-Ž°Ç øä+ÿ[ò…Ë!{N¾\v®µ¯Õ»É1œ =¬¹ ùZÝ]“Ÿ#3h\̯ëF×äN7qh· ïÈG‰óù¶ks—ÌÙµ{|-æè.¬YÓ`)KV|?ùb}-"Üq¯U÷š‚úÜë µÀeÛ0Ø1¯a¯æÅõ3¯= ò>ê~ÓÎv”y…×e^~€yÝá÷¤ÿr¶_ж¸—v/ÃB®{Ù¾ÒǶ}x/2ï!‘á^û3æDðó10üYÄY¹‹$›? ‡5eò endstream endobj 125 0 obj <>stream H‰´–MoA †ÿŠ j¼¶Çóa©ê¡iA ²7ÊE´€Z-¨O%i²Ý…”*—ÍîŽýÌ;¯ím^~½ü}ó›³éë8::>™üòƒÄ‚³—Œ%EµP`~ ÍtF0¿¤¹¾,p;ÿÍ+ty»q 1` s†+àDhºyƒ2rMx_à⼇Ó3‡h¶èB7]Jy'A[áMgÛx³é[Œpç«¿A%å5)SYPÌCÐ]„ÒÿDˆZu‰®WF|v%þ #u¨Á²ÂB(Q“Y~¶ÉJ$]+a•MÉ7Ò@˜c@(™¶C)ƽ 8b,¥Ã:0Šìá‰Ç1&H%öq0õë!^ì‰T6»È¿‚øVúÏĻɄòڈ؂=AÉ1¸£*•‡õAªVÂþæƒÞàŽÖ,m“ˆÙä¨î˜ Û££…>%šO ¦CM£eÇÇ-4ïÖ «ÆÕ?ä†lÚ¶2¶þ(@;‡ÉÂ<ÐÞ¹™‘t‘õþª¶¿Ä±€HFcMÐ^ÇÑO7ã0ú5N# ñÇöÍRš ¢Uõz:^¦«©¨fa¹J@ƒ¡f57pôá©zÿ|4æ0²;¯ÃŸ¶;âKWY„Œ‘™,Ô:5LþÇlÈ‘ Õ—jKDõÈE¥´T}³ì|Ž”œˆjÙ z J´Æ_®÷u>n%_=a$‰]>Ùú xxŠv5[+%ÕÞÁãz•×~7•âRªkÄZÄ IHt1X|Ol2T1¯”döû’ªõÙc²l!ï£Ô†q£ endstream endobj 126 0 obj <>stream H‰œ–yTSwÇoÉž•°Ãc [€°5la‘QIBHØADED„ª•2ÖmtFOE.®c­Ö}êÒõ0êè8´׎8GNg¦Óïï÷9÷wïïÝß½÷ó '¥ªµÕ0 Ö ÏJŒÅb¤  2y­.-;!à’ÆK°ZÜ ü‹ž^i½"LÊÀ0ðÿ‰-×é @8(”µrœ;q®ª7èLöœy¥•&†Qëñq¶4±jž½ç|æ9ÚÄ V³)gB£0ñiœWו8#©8wÕ©•õ8_Å٥ʨQãüÜ«QÊj@é&»A)/ÇÙgº>'K‚óÈtÕ;\ú” Ó¥$ÕºF½ZUnÀÜå˜(4TŒ%)ë«”ƒ0C&¯”阤Z£“i˜¿óœ8¦Úbx‘ƒE¡ÁÁBÑ;…ú¯›¿P¦ÞÎӓ̹žAü om?çW= €x¯Íú·¶Ò-Œ¯Àòæ[›Ëû0ñ¾¾øÎ}ø¦y)7ta¾¾õõõ>j¥ÜÇTÐ7úŸ¿@ï¼ÏÇtÜ›ò`qÊ2™±Ê€™ê&¯®ª6ê±ZL®Ä„?â_øóyxg)Ë”z¥ÈçL­UáíÖ*ÔuµSkÿSeØO4?׸¸c¯¯Ø°.òò· åÒR´ ßÞô-•’2ð5ßáÞüÜÏ ú÷Sá>Ó£V­š‹“då`r£¾n~ÏôY &à+`œ;ÂA4ˆÉ 䀰ÈA9Ð=¨- t°lÃ`;»Á~pŒƒÁ ðGp| ®[`Lƒ‡`<¯ "A ˆ YA+äùCb(ЇR¡,¨*T2B-Ð ¨ꇆ¡Ðnè÷ÐQètº}MA ï —0Óal»Á¾°ŽSàx ¬‚kà&¸^Á£ð>ø0|>_ƒ'á‡ð,ÂG!"F$H:Rˆ”!z¤éF‘Qd?r 9‹\A&‘GÈ ”ˆrQ ¢áhš‹ÊÑ´íE‡Ñ]èaô4zBgÐ×Á–àE#H ‹*B=¡‹0HØIøˆp†p0MxJ$ùD1„˜D, V›‰½Ä­ÄÄãÄKÄ»ÄY‰dEò"EÒI2’ÔEÚBÚGúŒt™4MzN¦‘Èþär!YKî ’÷?%_&ß#¿¢°(®”0J:EAi¤ôQÆ(Ç()Ó”WT6U@ æP+¨íÔ!ê~êêmêæD ¥eÒÔ´å´!ÚïhŸÓ¦h/èº']B/¢éëèÒÓ¿¢?a0nŒhF!ÃÀXÇØÍ8ÅøšñÜŒkæc&5S˜µ™˜6»lö˜Iaº2c˜K™MÌAæ!æEæ#…寒°d¬VÖë(ëk–Íe‹Øél »—½‡}Ž}ŸCâ¸qâ9 N'çÎ)Î].ÂuæJ¸rî î÷ wšGä xR^¯‡÷[ÞoÆœchžgÞ`>bþ‰ù$á»ñ¥ü*~ÿ ÿ:ÿ¥…EŒ…ÒbÅ~‹ËÏ,m,£-•–Ý–,¯Y¾´Â¬â­*­6X[ݱF­=­3­ë­·YŸ±~dó ·‘ÛtÛ´¹i ÛzÚfÙ6Û~`{ÁvÖÎÞ.ÑNg·Åî”Ý#{¾}´}…ý€ý§ö¸‘j‡‡ÏþŠ™c1X6„Æfm“Ž;'_9 œr:œ8Ýq¦:‹ËœœO:ϸ8¸¤¹´¸ìu¹éJq»–»nv=ëúÌMà–ï¶ÊmÜí¾ÀR 4 ö n»3Ü£ÜkÜGݯz=Ä•[=¾ô„=ƒ<Ë=GTB(É/ÙSòƒ,]6*›-•–¾W:#—È7Ë*¢ŠÊe¿ò^YDYÙ}U„j£êAyTù`ù#µD=¬þ¶"©b{ųÊôÊ+¬Ê¯: !kJ4Gµm¥ötµ}uCõ%—®K7YV³©fFŸ¢ßY Õ.©=bàá?SŒîƕƩºÈº‘ºçõyõ‡Ø Ú† žkï5%4ý¦m–7Ÿlqlio™Z³lG+ÔZÚz²Í¹­³mzyâò]íÔöÊö?uøuôw|¿"űN»ÎåwW&®ÜÛe֥ﺱ*|ÕöÕèjõê‰5k¶¬yÝ­èþ¢Ç¯g°ç‡^yïkEk‡Öþ¸®lÝD_pß¶õÄõÚõ×7DmØÕÏîoê¿»1mãál {àûMśΠnßLÝlÜ<9”úO¤[þ˜¸™$™™üšhšÕ›B›¯œœ‰œ÷dÒž@ž®ŸŸ‹Ÿú i Ø¡G¡¶¢&¢–££v£æ¤V¤Ç¥8¥©¦¦‹¦ý§n§à¨R¨Ä©7©©ªª««u«é¬\¬Ð­D­¸®-®¡¯¯‹°°u°ê±`±Ö²K²Â³8³®´%´œµµŠ¶¶y¶ð·h·à¸Y¸Ñ¹J¹Âº;ºµ».»§¼!¼›½½¾ ¾„¾ÿ¿z¿õÀpÀìÁgÁãÂ_ÂÛÃXÃÔÄQÄÎÅKÅÈÆFÆÃÇAÇ¿È=ȼÉ:ɹÊ8Ê·Ë6˶Ì5̵Í5͵Î6ζÏ7ϸÐ9кÑ<ѾÒ?ÒÁÓDÓÆÔIÔËÕNÕÑÖUÖØ×\×àØdØèÙlÙñÚvÚûÛ€ÜÜŠÝÝ–ÞÞ¢ß)߯à6à½áDáÌâSâÛãcãëäsäü儿 æ–çç©è2è¼éFéÐê[êåëpëûì†ííœî(î´ï@ïÌðXðåñrñÿòŒóó§ô4ôÂõPõÞömöû÷Šøø¨ù8ùÇúWúçûwüü˜ý)ýºþKþÜÿmÿÿ ÷„óû endstream endobj 1 0 obj <>stream hÞ²P0P°T0±T04P044V°±ÑwÎ/Í+Q0ÔwË,*.J(éû$™!•©úþ¥%9™y©Åvv@ Ž Í ©€Ä¢T V ˆºÌ’œTÿ‚r2RRüJr’€ì" ÏT¬ß%ÚÐȬÇ-³$V?Xß=?$ßÎ ÀSb(` endstream endobj 2 0 obj <>stream hÞìZÛn7ý•ylºË!9¼F;½ p’±>~Pí­kT‘ U.’Ÿo{xQ´»¹­«vÖÎÉ93s8$¥]3“"Ö¤U 6d„%k ±+ñÄý ƒpí´6LI[´küI@#“Æ¡“ +tÍAd`ZÈ„hH;²Úcœ'ëĈDDI,+2ŠÄ.$ *tIò‹$øJ„Hé Ú=9¥ ¤E{„D:V‘c¤f VCz´ÈiÉi(V ¤#gà×Ï 8@9¿xñ ð,œð¬@ Bt’Ú'AÏL€çUJ 0q)/^p0^ÉxÑCÑäÈB(^…äŒ<#Y'º#¯S°ü"Eo@ž‹ƒy ’=C\€':ðÉûd ¼ÀèGW@°M!¢x1¦ VšBЊ¡P0IÇŸU á¤Pp˜ß€?b€«tRÓ =PTˆ?DŠŒÉ@ 1Å™¢? *Z j£HR(:1D@DQE4¥¸ZôG¨˜v"`.LºSÔ1¢>Ó#dP J j:ªUú¤’á´Й,ÓG!VFID´Çç RÑËŒX¤Té²ÛEõU†*c‘@+’«¬ã¹Âr…å ˮʌwÑžÌVÝb}¶ê:*¦½–Ýëõq÷+¶}¹œwÏg·T`Û³7·]{º^Ý]æ/—Ëõ“'ÈçÅÝ«?ÎmœRõª©º5Tü’MË>ÝHZ÷鯥…Ÿ3N+?ݤ}!ßäµ_²N«¿ÄŸÖ¾ÓiÈw&íù.ïùNÒ>2Íñ=ým¶Z·ßß\ß­ºöÛ›Ùõjöj£þ°ZÞÝ¢ñÏöt~s…ôºËu{ Ž–¯Ûèú\Käâ܆/±¼‘·Û/ë!!vOÈ1¯?Ä<ú>Û­åsŸóEnŒ‡þýþüPÌb^ï™ æ÷ÇìÃ0pЦ7&éaïi{z;[äç§GGË×çߨF •«×YˆMâ¢ý©}6{³¼+ƒÓ+–dW¿+@ÜÀîJ¢Ý•D»+‰vWí®$Ê®$Æ|x¶Ç¤Ú“kbý§‡é}Qj;œ¯¿úëï¯1T·'õõËЦ¼/ØXé‘•IVæSV<²²“¬ÔÈJ¦X…8²r“¬ÂÈÊO²ò#«0Éʬâ$+Y±šdfÇf<Él\¬'™Ëƒ'ÕG×O* j•sžcûîð“:ÒÇÍÈ̵|dä¸4OYÞW:'ì>â`œ«–O;ÈË_;×xüä(Xó‘4¤TÝX{Ñ~·¸úqqÕ-Ödµm¬Óo·…öd>»ì^¡«=š//oO׳պ®¸ÙÑñy}Äé«(ß c›'¾¾«Uõ*ñÛý*½JÜý÷I/¶L–˜ÕWynzñ"ë[ÍÍX±qêØ÷J5Öl©Çž{Ùu¿.W©F†ÔG׈Ï@‡ó›ëEû­Ýªýyu³¾Y\?_^uí³ÕÙ/Û"°*4Q§W¿¾aÁié_Um¤_:èÍÓj ÂŽRÑâ§¥bMl OLeëÂHl”Øi> kÄãîÇ7’þ·~¾_¥DýVïf˜AXœJXÆÝ:2‘“€1 ƒ‰¡8.úÀ‘æÆNuTqûްü3°nðm˲é©7 ëzº›ŒÚwã Q^5Š#üؾ>t$Ó‰«¸½m €X¡Ø”̈́ŭ>ØÖ¬nÔTG·ç(¨ ÌQ5F4Hhx«nÂdGw¸Që ,ÒØ¨ƒíëCG2}Ž*nßQ™Žsó’ïéCG~úUÜ^1pN©jìèV«¾>Øvb¼G1Ü^F >Û(ü Š[mPqÉïäl f/›>,ŠÊ¿ßIZQÓ3)˜½L¤l4òÎLƹ¾>ÈFÌ=²)¸CGj81ñMúG4¸QVªjXñtGÀýW??Ü®¿_ÂŽé¿ÚvEÐ;!¼÷[ÑcküG€GÛØ endstream endobj 3 0 obj <>stream hÞ244T0P044R02RÆ &F@ÊDÁÌH™*X˜)3CS m®`hd¦`c£ Ö¤¬œ“™’jg7°‚›„.G endstream endobj 4 0 obj <>stream 2011-01-27T13:44:44-08:00 2011-01-26T14:42:54-08:00 2011-01-27T13:44:44-08:00 Acrobat PDFMaker 9.1 for PowerPoint uuid:9a600514-0935-4b2a-9066-71f9c84722b9 uuid:e72f8fed-fccb-4971-b01a-c3722535b959 application/pdf PowerPoint Presentation TID Adobe PDF Library 9.0 TID endstream endobj 5 0 obj <>stream hÞ24´P0P04´T06W°±ÑwÎ/Í+Q0Ô÷ÎL)Ž (Åê‡T¤ê$¦§ÛÙa(22†( H,J ƒM BÑ`…ÊØ endstream endobj 6 0 obj <>stream hÞTÎË Â0Ð_É®íBó0>)…b Yøi;bP32¦HÿÞ*Eqvî=ŒT‚ –ç¼ìâ)=îMÆ·x»»ÐÀEÁ¸©Ù(!¥j!µVs=«Dˆdl û²!¬]dÖì*wbë©d'$fñ dч˜ñ Ûm)gz¸¯f Û®k±†7ƾ&Gýà‰Œ}¼Bú#™%x@ˆŸG³¢x 0._@  endstream endobj 7 0 obj <>/Filter/FlateDecode/ID[<327E04E173DB4143A28AEB575313AB55>]/Info 120 0 R/Length 67/Root 122 0 R/Size 121/Type/XRef/W[1 2 1]>>stream hÞbb&FQ5&Æ@‚m ˆµHð›X+@+PÉ¥õ@#Œ`ü‡Â%FÁ8— ¦_pÅÿ 2  û endstream endobj startxref 116 %%EOF hypre-2.33.0/src/docs/usr-manual/figSStructGridFEM2.svg000066400000000000000000000210611477326011500225750ustar00rootroot00000000000000 image/svg+xmlpart 0 (9,9) (1,1) hypre-2.33.0/src/docs/usr-manual/figSStructGridFEM3.pdf000066400000000000000000000314561477326011500225610ustar00rootroot00000000000000%PDF-1.5 %âãÏÓ 144 0 obj <> endobj 151 0 obj <>/Filter/FlateDecode/ID[<190631B5C680B64187E7D3EED449D1A4>]/Index[144 15]/Info 143 0 R/Length 56/Prev 12776/Root 145 0 R/Size 159/Type/XRef/W[1 2 1]>>stream hÞbbd``b`ÊŒS@'`Î,gWx}’‰‘AÈb``ÄJüg´ý `ã›ñ endstream endobj startxref 0 %%EOF 158 0 obj <>stream hÞb```e``Jaრ¨€ˆY8ÅX¡˜‘“‡)UÇ3qT±Î¨¦@ÌÄÀ »Bsúõ³10¸Ý€¨bd0¯%ö endstream endobj 145 0 obj <>/Metadata 4 0 R/Outlines 8 0 R/PageLayout/SinglePage/Pages 141 0 R/StructTreeRoot 11 0 R/Type/Catalog>> endobj 146 0 obj <>/Font<>/ProcSet[/PDF/Text]>>/Rotate 0/StructParents 5/Type/Page>> endobj 147 0 obj <>stream hÞÔUmkÛ0þ+ú¸Á‚d½X6”B“-¬°•Ñ„uPúÁKLbHœ’¸lý÷»;ëÇKR¶~ûðD¹îN§Ç‰ÓB‰Ä‘ä°Xa2XœÐ×T$œIšyq/¯G£a±+ç`ÈaãíCWå©..äÕnVÖH”ÑrT<~,«Å²ijäû²5 Œòr¼*;‘gr¼©›ápóó~à¬'›H´J)ÀYÇźZ=¿™Vër'nÊâv³.ê·d»)Ö¥$ Hÿe2nVóë¦XU³ÏSòš4Û²™-åÍf».V¤ºkóòJÉÖõª^¬J1H¼œ4åú+$aåôù±$oL}[=6›­ü*²Î\^B½Øt9ŸÅ‡z¶™WõBÞUõU½«¢<®¶»f´,¶BõN¢;¦ÊOEðÐÎÉÉÓ÷³šnŸJJ/æ¡çÍrwïáþþ%4Ì‚Érá`–œR„̘Ö0ðA6¯ZqE;ïy 1ŽW{ÐYÆÍGx­þc”ø’>ID2ÙÐdÞãà teôã=Ê;ÔÄçÇÚÖÚ¸F=ÄÔ¡(ëÐ7ÔÔg!t°a ʉã¡ÝB­hÅó {Ýa‰ê5®U@TrŒ;¨"·ßÝÀ‘icŒ@9àÝBL¸wŒg wg˜+§àá¹ë´­9UiÔQ}è4cЗ{ê[_ž¶¡Î»=â½AzØ÷šÁ³p Øçczž‰s3‹~xw}ð>stream H‰ÜWÛŠGý•z”‚Uê®®¾?Xv ‡,;àÛA‰ã„¬Iìÿ~NÏhu›F3ØkH$vf˜®sêvªvýío¿þóázüxýbóÝ3zòäé³ Ñ_äÉáë)”ÌbV, ù¨,A“ FÛ;ZonmnÉqÒ\_g/Ft»ù—‘>áôïô Ç8¾qô3õïÈ;Æ3—ðûÝÒ =Äõ•0¦¢Ñ8V*È[d«T\ù*+œ(+ûKT´AÅ{l1>ã0É$6˜å E~"&1 I8€ E¼‰M³‘X8‹—2ùZ9'Õâ{6Ù3Ø—EÁß p¹Qœ)}.\T²À1\ŒwyPgAZÃK/{H)螨 µ÷ Aõ®ábÒƒ‹–Y½©ë1žã|8…çxÙ‡Tkž¡è9–r³!kRdfǘšõ ñ"hCÀŽ—99 e((ND¶)S‡LVpç-ØL/W“©l©‘+§¥êT­„y€Ìéd6T'X:GÅÈšéfÍæj: õ9q³©L(mõev”ϧ­<àíu 7µýXM}ܾ§u×Uìî-Œ:¨ÛÒªO,uŸPTì´G®ªr$ ‰d6LêîèÕâÏŸ>,ÃâïeZ[¾é¾ß¹|@—}ÇÎïà*”«(^††±f5†EVì¿^,}XØ#{½<˜Þ‚*­’ ™£÷ÎBíã„›:ðÇA=ަDVñ˜ç¬.í¢zÜÝ’1¡k£Õ&vµy¿°B…%œ^yv c½€ïèí7í,IÇé©e`]W{=GÇ?òSÑiMìA’8Ñ^šá“7iUúüèHöx.©–®7l {MÈŸ‘ ­iµ $¸.”pTš\XÎ;H'ä)4&›†x‚ q2KÓËì96¢¯¾ê"ƨ;wþëh̽º¸î  >¿ZôÆ_=‘Åaÿq„W^Òû3-Ç„ŠâݪÊwJ¨ªà@çQ™ØÀÙ'Ô1öàXW ÓÝõ–P^’wwP(Œ–áÄp 뻫Õðxx}uliuojÙݺû®7ÒwÀ|Ÿæù?ãß» ‰ÞkøÍdªcââÛd¹žTOøtU©Ž³SŠžŠü¤zʧ«JušßÕA8ÜwÀ•¤zʧÿsªoè_{- endstream endobj 149 0 obj <>stream H‰œ–yTSwÇoÉž•°Ãc [€°5la‘QIBHØADED„ª•2ÖmtFOE.®c­Ö}êÒõ0êè8´׎8GNg¦Óïï÷9÷wïïÝß½÷ó '¥ªµÕ0 Ö ÏJŒÅb¤  2y­.-;!à’ÆK°ZÜ ü‹ž^i½"LÊÀ0ðÿ‰-×é @8(”µrœ;q®ª7èLöœy¥•&†Qëñq¶4±jž½ç|æ9ÚÄ V³)gB£0ñiœWו8#©8wÕ©•õ8_Å٥ʨQãüÜ«QÊj@é&»A)/ÇÙgº>'K‚óÈtÕ;\ú” Ó¥$ÕºF½ZUnÀÜå˜(4TŒ%)ë«”ƒ0C&¯”阤Z£“i˜¿óœ8¦Úbx‘ƒE¡ÁÁBÑ;…ú¯›¿P¦ÞÎӓ̹žAü om?çW= €x¯Íú·¶Ò-Œ¯Àòæ[›Ëû0ñ¾¾øÎ}ø¦y)7ta¾¾õõõ>j¥ÜÇTÐ7úŸ¿@ï¼ÏÇtÜ›ò`qÊ2™±Ê€™ê&¯®ª6ê±ZL®Ä„?â_øóyxg)Ë”z¥ÈçL­UáíÖ*ÔuµSkÿSeØO4?׸¸c¯¯Ø°.òò· åÒR´ ßÞô-•’2ð5ßáÞüÜÏ ú÷Sá>Ó£V­š‹“då`r£¾n~ÏôY &à+`œ;ÂA4ˆÉ 䀰ÈA9Ð=¨- t°lÃ`;»Á~pŒƒÁ ðGp| ®[`Lƒ‡`<¯ "A ˆ YA+äùCb(ЇR¡,¨*T2B-Ð ¨ꇆ¡Ðnè÷ÐQètº}MA ï —0Óal»Á¾°ŽSàx ¬‚kà&¸^Á£ð>ø0|>_ƒ'á‡ð,ÂG!"F$H:Rˆ”!z¤éF‘Qd?r 9‹\A&‘GÈ ”ˆrQ ¢áhš‹ÊÑ´íE‡Ñ]èaô4zBgÐ×Á–àE#H ‹*B=¡‹0HØIøˆp†p0MxJ$ùD1„˜D, V›‰½Ä­ÄÄãÄKÄ»ÄY‰dEò"EÒI2’ÔEÚBÚGúŒt™4MzN¦‘Èþär!YKî ’÷?%_&ß#¿¢°(®”0J:EAi¤ôQÆ(Ç()Ó”WT6U@ æP+¨íÔ!ê~êêmêæD ¥eÒÔ´å´!ÚïhŸÓ¦h/èº']B/¢éëèÒÓ¿¢?a0nŒhF!ÃÀXÇØÍ8ÅøšñÜŒkæc&5S˜µ™˜6»lö˜Iaº2c˜K™MÌAæ!æEæ#…寒°d¬VÖë(ëk–Íe‹Øél »—½‡}Ž}ŸCâ¸qâ9 N'çÎ)Î].ÂuæJ¸rî î÷ wšGä xR^¯‡÷[ÞoÆœchžgÞ`>bþ‰ù$á»ñ¥ü*~ÿ ÿ:ÿ¥…EŒ…ÒbÅ~‹ËÏ,m,£-•–Ý–,¯Y¾´Â¬â­*­6X[ݱF­=­3­ë­·YŸ±~dó ·‘ÛtÛ´¹i ÛzÚfÙ6Û~`{ÁvÖÎÞ.ÑNg·Åî”Ý#{¾}´}…ý€ý§ö¸‘j‡‡ÏþŠ™c1X6„Æfm“Ž;'_9 œr:œ8Ýq¦:‹ËœœO:ϸ8¸¤¹´¸ìu¹éJq»–»nv=ëúÌMà–ï¶ÊmÜí¾ÀR 4 ö n»3Ü£ÜkÜGݯz=Ä•[=¾ô„=ƒ<Ë=GTB(É/ÙSòƒ,]6*›-•–¾W:#—È7Ë*¢ŠÊe¿ò^YDYÙ}U„j£êAyTù`ù#µD=¬þ¶"©b{ųÊôÊ+¬Ê¯: !kJ4Gµm¥ötµ}uCõ%—®K7YV³©fFŸ¢ßY Õ.©=bàá?SŒîƕƩºÈº‘ºçõyõ‡Ø Ú† žkï5%4ý¦m–7Ÿlqlio™Z³lG+ÔZÚz²Í¹­³mzyâò]íÔöÊö?uøuôw|¿"űN»ÎåwW&®ÜÛe֥ﺱ*|ÕöÕèjõê‰5k¶¬yÝ­èþ¢Ç¯g°ç‡^yïkEk‡Öþ¸®lÝD_pß¶õÄõÚõ×7DmØÕÏîoê¿»1mãál {àûMśΠnßLÝlÜ<9”úO¤[þ˜¸™$™™üšhšÕ›B›¯œœ‰œ÷dÒž@ž®ŸŸ‹Ÿú i Ø¡G¡¶¢&¢–££v£æ¤V¤Ç¥8¥©¦¦‹¦ý§n§à¨R¨Ä©7©©ªª««u«é¬\¬Ð­D­¸®-®¡¯¯‹°°u°ê±`±Ö²K²Â³8³®´%´œµµŠ¶¶y¶ð·h·à¸Y¸Ñ¹J¹Âº;ºµ».»§¼!¼›½½¾ ¾„¾ÿ¿z¿õÀpÀìÁgÁãÂ_ÂÛÃXÃÔÄQÄÎÅKÅÈÆFÆÃÇAÇ¿È=ȼÉ:ɹÊ8Ê·Ë6˶Ì5̵Í5͵Î6ζÏ7ϸÐ9кÑ<ѾÒ?ÒÁÓDÓÆÔIÔËÕNÕÑÖUÖØ×\×àØdØèÙlÙñÚvÚûÛ€ÜÜŠÝÝ–ÞÞ¢ß)߯à6à½áDáÌâSâÛãcãëäsäü儿 æ–çç©è2è¼éFéÐê[êåëpëûì†ííœî(î´ï@ïÌðXðåñrñÿòŒóó§ô4ôÂõPõÞömöû÷Šøø¨ù8ùÇúWúçûwüü˜ý)ýºþKþÜÿmÿÿ ÷„óû endstream endobj 150 0 obj <>stream H‰b``œáèâäÊ$ÀÀ›WRää¥À~ž™ “‹ |@ì¼ü¼T ðí#ˆ¾¬ 2 S/`M.(*Ò€Ø(%µ8HâÌò’ 8c-’” fƒÔ‰d‡9Ù@6_IjHŒÁ9¿ ²(3=£DÁÐÒÒRÁ1%?)U!¸²¸$5·XÁ3/9¿¨ ¿(±$5¨jð»%V*¸'ææ&*é‘èr"(,!¬Ï!à0b;C€äÒ¢2(“‘ɘ ÀIÆ8/ endstream endobj 1 0 obj <>stream hÞ²P0P°T0±T04P044V°±ÑwÎ/Í+Q0ÔwË,*.J(éû$™!•©úþ¥%9™y©Åvv@ Ž Í ©€Ä¢T V ˆºÌ’œTÿ‚r2RRüJr’€ì" ÏL¬ß%ÚÐÄ ¬Ç-³$V?Xß=?$ßÎ ÀSá(f endstream endobj 2 0 obj <>stream hÞìZÛn7ý>¶Ýåmx vzAá$5b}0ü ÚªkT‘ U.’Ÿo{†¤,î:N˜ª… D† ÙárÎá gHzWJ )”Z¡Œ0 kŒP$”$/”Ã}©„Âe 4¡µ±BE¡¹»–B;Øh%tp@ÒÂ(C¸) R[H‹›$Ld#x‰~^X`INdF À3 ;½Ûyè//¨Z(Ÿ(/˜”Ï ”·kÊ'Êc¦|F rþ(§ å2ŠË(.£¸Œâ2Š«åžY@ö‡Ñ]EþÉcîíH;š³?ì4üûõyW‘ßo»ŠüsúÿüËŠü~›ÝMäú#‘ŸB÷gýÙÝdžž¬/Þ]|#;M"{Y—ýOýËÉûÅ}~L|$òcëmh[¿-@ÜÀnD»mí¶A´ÛÑnD•_1ô'Bö§7Båÿk@î“6Èþh¶ú꯿¿F_ÝŸ–7*C£ü*àÁÌŒÌL›™™Ù6352£6392slf>e&ãÈÌ·™…‘Yh3ó#³ØfæFfJ¶ÙÑØNµÙóDé6»q¢(Óf7ÎeÛìÆ©¢¨Ínœ+ª)Yâ8WTS²ÄP*S¥Ù¶»Ÿ®{úÒS§xÓGzŽ3B7W\/:9ì>Bðh©Mã ÐÉgõ)³qÙd6ž£šÌÆÓot‹YO¿1Mfã¥ÂØ&³ñRa¨Éì‘oîÓfi¯±Fw†_à“ê,ö#k|GÐ\çU¼ì¿›_ÿ8¿žÎWÈÝÑÃþÓŸÎ&WÓ·¸ÑÏW¿÷g«ÉrUºÌDrrñoõnï,¿.x{Ö«²T[)¥õ£èP¸Êëuµ&Q~ñ½&ùïš?éP~Ž~ùD¡•wð뾡½¯—­}S&˜`;ó&ÄÎ"‰? ÆÈް74åBB­Ò pÓ-šœnNwZx”n:Ù˜n³"‘¡  eºÈž<&1Òu²Õ“„Z‘(ÅኌÀ¿xŠmà‡“o$`Äj><1$¾5ŽûV›6 g#AB¬<¨!q˜UOØÐì#ÖåSFÙ"Cm¸²ØfqC |7<µ5ÊRCRѵ5‰Õ¶C²µÑÜDTAHÙY³AÀûjz<ýu±œ TijB>ÙÑìöfÞ¿@ëtÙÿ¼¼]ÝÎo^-®§ýËåù/äšÄã;œêyöEOVb4·g-`G®hò‹m®XƒÔV®Tµ…ŠdÛ8°[`<îóâ¥:âJ‚'pþÂQ¿ÑeŽÂÒ>¶,áVYQ Œ™ØŸ ÖÚè"ų•¨àÖDÈâ¬;üwÌëÖF/[¾&¡Ö4.ÊË\—ÊÖúˆÚWp«ê`–H6üsÁ‹}PÛ@+QÁ­ˆ‚LÀ*ÊÎà\ CèÔFÕ…f¢Œ;\ot¦ŽË+W¥‰¨}Ž nM”çDEßñe¹ä+}HäÛç¨àVÉ 20»ª‰·YëÃ&~F2dÜÊ#>¬ÿ8BÄ6È8æmö&cVÞÔ°H*ÿa®¨vO2få å…F…´2ã¨íj}à ™Ïð&ãþ#Àý%Z endstream endobj 3 0 obj <>stream hÞì’ÍJC1…_e^À$3“I2  .A±K風.Äz+RAßÞ“ëOº(vëæžÜdò9a˜™1 ¹C”Ø 4“8Öl¤Þ e5h¥lý¼‘%†:™±$²R¡LÖT¨(î‹R± ÍT:_Œ*jY ÕžTª zòÎ×B^ÁÓŠà) Ͳ’ú_%™ÓéiœN7¯·9µ€-³ ™5‡‚Ì%äœÇóay1,WÖ¤¡¢Ä«x¹xÛ¼lãõzq·zÄIœ®7wq¶]>stream 2011-01-27T13:44:55-08:00 2011-01-26T14:42:54-08:00 2011-01-27T13:44:55-08:00 Acrobat PDFMaker 9.1 for PowerPoint uuid:9a600514-0935-4b2a-9066-71f9c84722b9 uuid:42e32da2-f687-4b7e-a025-6bcf800b540b application/pdf PowerPoint Presentation TID Adobe PDF Library 9.0 TID endstream endobj 5 0 obj <>stream hÞ241T0P041R06W°±ÑwÎ/Í+Q0Ô÷ÎL)Ž (Åê‡T¤ê$¦§ÛÙa*2ƒ( H,J ƒM BÑ`‚Í endstream endobj 6 0 obj <>stream hÞTÎ_ ‚0ð¯²7ÝC¹éì"H#öИz£QíÆm~û,¤èñÀ9?ŽT¬(’ªg¤ø¸×<Ùâíný0zmÄz“ )…LR©4W3±Š„ˆ¦Ö¸¯ZÂÆfô®¶ ¶žKvBbŸ@<©±û×–2S*Ï¿š!ìúF®ÃÞ;¸†, £'xrtá ñd†à>|Žò²| 03@§ endstream endobj 7 0 obj <>/Filter/FlateDecode/ID[<190631B5C680B64187E7D3EED449D1A4>]/Info 143 0 R/Length 69/Root 145 0 R/Size 144/Type/XRef/W[1 2 1]>>stream hÞbb&F±s L Œ/€G%`º$øÍ€ÃrPÉyI—F0þCáŽ#€`œ;]Åôî¾ÿîþ ) endstream endobj startxref 116 %%EOF hypre-2.33.0/src/docs/usr-manual/figSStructGridFEM3.svg000066400000000000000000000370221477326011500226020ustar00rootroot00000000000000 image/svg+xmlpart 0 (9,9) (1,1) hypre-2.33.0/src/docs/usr-manual/figSStructGridFEM4.pdf000066400000000000000000000317731477326011500225640ustar00rootroot00000000000000%PDF-1.5 %âãÏÓ 156 0 obj <> endobj 163 0 obj <>/Filter/FlateDecode/ID[<0D447E39610CFD46BF6CA3A1406617FA>]/Index[156 15]/Info 155 0 R/Length 55/Prev 12981/Root 157 0 R/Size 171/Type/XRef/W[1 2 1]>>stream hÞbbd``b`JŒS@'`Î, ®2ør…‰‘AÈb``ÄJügÔû `¶î endstream endobj startxref 0 %%EOF 170 0 obj <>stream hÞb```e``Jdá ¨€ˆY8ÅX¡˜‘“‡)I¿@jªT±®TÓs fb`Ðc‡ÐœƒÙܯBT1²Jo endstream endobj 157 0 obj <>/Metadata 4 0 R/Outlines 8 0 R/PageLayout/SinglePage/Pages 153 0 R/StructTreeRoot 11 0 R/Type/Catalog>> endobj 158 0 obj <>/Font<>/ProcSet[/PDF/Text]>>/Rotate 0/StructParents 6/Type/Page>> endobj 159 0 obj <>stream hÞÔUßkÛ0þWô¸Á‚dY²l(…&[Xa+£ ë ôÁKLbHì’¸lýïwwÖ)Ž—¸l}{øï‡Nw§Óç(1B‰(±"Ê`IDœÂâ„v¸ŒMàm©÷òz2çûb roŽTšTòj¿(ªFD*Ör’?~,ÊÕºIË÷EkÅÊÉé&_íE–Êi]5ãqýó~d#›ˆ´J(ÀY§ù¶Ü<¿™—Ûb/nŠâ¶ÞæÕ[²ÝäÛB’ ¤ÿ2ëÍòºÉ7åâóœ¼fÍ®hkySï¶ù†Twm^N)Ùº^U«M!F‘“³¦Ø~…$Œœ??ä©ïÊǦÞÉo¾"cãËK¨€.ÃY|¨õ²¬Vò®¬®ª}äi¹Û7“u¾ªwÝ 4U~ʽ‡¶VΞ¾7˜Õ|÷TPz!G½lÖû{÷÷/¡­‚QÊ„µVX¥i·6@ ß²9ÕúƒŒ+ÚyÏKqœ:€ÎÒ0n.Ài}ôyP~àKú()ÈdC_y…'ЕÑ÷ (o_ŸjcÂôSû^ ¬}ßPTœ…ÐÞ†1('އvq´¢Ï­ßkóˆT¯q­¢¢a4ØAÙÃînŽLCÊïúû{Ç(azw†¹r ž»NÚš•Õ‡þb£/÷Ôµ¾>stream H‰ÜW]¯ÓFý+ó˜Tx²3û-!Tj%ª^]K<U(¥¨µÐŠ¿ß³vâøÆ‹mè}è%‘ÛÚ³óuæx÷ýï¿ýóáWzøp÷lÿÃRzôèñ“=Ñ_$dð²)²æœrPïX­ Æf:ÜÐnmhet½ÿ‰ {ú„ïè–²eè5uVnH ã™ øýƒ®éŠž>ÊîÞNáÏì |¶$Ùs.ð&}!|ã<ŠŽeÞUàEØ1{ÿ_à3ÛEt_A·ŽƒÍø8ÄÞ³ ûø¥è8À€ñ,³áÓ¨OUÔ„HR*á³Ù×áCÊþgàb¥ØBøZ8ï([öv6ÆéN=\™+^ŠšÐÞÔØULÅÅàÎ.æÈN²38u­Œâ%àžT𢹠©3h 5x…Î>¥YÌ MiÒ•iœbZp˜ÉúYÐ 9U9§ÙÖÙáG\ˆl•ŽÎ™,àF²Í+½lSYc “n—ªq.'»0s9™Ö±9\¢b­t³d³YNg…}n9‹¹“,¦«Óív’ÏÇ-í~>ã <Й:|,¦>ÞÓ®m vûF±Ô¨éKí'×!ôW…9‚øDª‘3¦µ7ôbóç/¶vó÷6lÈl_µ?]>£ëÐ1€“#\2E´€bàdvÑe†Et®·ÿr³»ÉòËíÙüÓvT­•¬ìEL¶¥_2Ü”a> ê8šêÙ©`n³3áÕq€vSÄ$.m ŒV˜ÌÅæiÞ³;+k´ØÝõ„ñÝ À·ôæ»z–4LãtŽŽ–²´°‹®+½îÇÑ‘²Úô¦°Ô¨ë¨>IÖZ¥¯ŽFÁs ¥t%Cè¿&:jÓ lk >HpˆpJ)¬ê·@I¶2Íœõ·ð@H9‡uä€(;)™­Œ´K'ï´2ÓŠø@Q{wÙÑ8+;¢èCXòœÞ_b"9èøQ¯aÊ ò˜% ø X}Ñ-Ù¯„šÐx¼­`ô;úkáñªé÷Ë›±¥ædª9ÞšÓÓéÊvÕÁ£÷¿ñéíL²½ZÌ¡œD!ûÒ=ËáçþmäЯΡMî6ÍÞ—ÎüÛÈaX߇VÙžÊù>åpæà÷2‡WºÏ¦‘:—Ns€|ÂFˆž“RŸHB›2{…(ç¤)I¸1ÛöÝDƒ»AV¸^áSûš6R]:P»²ñx?õÝZ­®^dGƒY;,…ýW€¾U,ê endstream endobj 161 0 obj <>stream H‰b``œáèâäÊ$ÀÀ›WRää¥À~ž™ “‹ |@ì¼ü¼T ðí#ˆ¾¬ 2 S/`M.(*Ò€Ø(%µ8HâÌò’ 8c-’” fƒÔ‰d‡9Ù@6_IjHŒÁ9¿ ²(3=£DÁÐÒÒRÁ1%?)U!¸²¸$5·XÁ3/9¿¨ ¿(±$5¨jð»%V*¸'ææ&*é‘èr"(,!¬Ï!à0b;C€äÒ¢2(“‘ɘ ÀIÆ8/ endstream endobj 162 0 obj <>stream H‰œ–yTSwÇoÉž•°Ãc [€°5la‘QIBHØADED„ª•2ÖmtFOE.®c­Ö}êÒõ0êè8´׎8GNg¦Óïï÷9÷wïïÝß½÷ó '¥ªµÕ0 Ö ÏJŒÅb¤  2y­.-;!à’ÆK°ZÜ ü‹ž^i½"LÊÀ0ðÿ‰-×é @8(”µrœ;q®ª7èLöœy¥•&†Qëñq¶4±jž½ç|æ9ÚÄ V³)gB£0ñiœWו8#©8wÕ©•õ8_Å٥ʨQãüÜ«QÊj@é&»A)/ÇÙgº>'K‚óÈtÕ;\ú” Ó¥$ÕºF½ZUnÀÜå˜(4TŒ%)ë«”ƒ0C&¯”阤Z£“i˜¿óœ8¦Úbx‘ƒE¡ÁÁBÑ;…ú¯›¿P¦ÞÎӓ̹žAü om?çW= €x¯Íú·¶Ò-Œ¯Àòæ[›Ëû0ñ¾¾øÎ}ø¦y)7ta¾¾õõõ>j¥ÜÇTÐ7úŸ¿@ï¼ÏÇtÜ›ò`qÊ2™±Ê€™ê&¯®ª6ê±ZL®Ä„?â_øóyxg)Ë”z¥ÈçL­UáíÖ*ÔuµSkÿSeØO4?׸¸c¯¯Ø°.òò· åÒR´ ßÞô-•’2ð5ßáÞüÜÏ ú÷Sá>Ó£V­š‹“då`r£¾n~ÏôY &à+`œ;ÂA4ˆÉ 䀰ÈA9Ð=¨- t°lÃ`;»Á~pŒƒÁ ðGp| ®[`Lƒ‡`<¯ "A ˆ YA+äùCb(ЇR¡,¨*T2B-Ð ¨ꇆ¡Ðnè÷ÐQètº}MA ï —0Óal»Á¾°ŽSàx ¬‚kà&¸^Á£ð>ø0|>_ƒ'á‡ð,ÂG!"F$H:Rˆ”!z¤éF‘Qd?r 9‹\A&‘GÈ ”ˆrQ ¢áhš‹ÊÑ´íE‡Ñ]èaô4zBgÐ×Á–àE#H ‹*B=¡‹0HØIøˆp†p0MxJ$ùD1„˜D, V›‰½Ä­ÄÄãÄKÄ»ÄY‰dEò"EÒI2’ÔEÚBÚGúŒt™4MzN¦‘Èþär!YKî ’÷?%_&ß#¿¢°(®”0J:EAi¤ôQÆ(Ç()Ó”WT6U@ æP+¨íÔ!ê~êêmêæD ¥eÒÔ´å´!ÚïhŸÓ¦h/èº']B/¢éëèÒÓ¿¢?a0nŒhF!ÃÀXÇØÍ8ÅøšñÜŒkæc&5S˜µ™˜6»lö˜Iaº2c˜K™MÌAæ!æEæ#…寒°d¬VÖë(ëk–Íe‹Øél »—½‡}Ž}ŸCâ¸qâ9 N'çÎ)Î].ÂuæJ¸rî î÷ wšGä xR^¯‡÷[ÞoÆœchžgÞ`>bþ‰ù$á»ñ¥ü*~ÿ ÿ:ÿ¥…EŒ…ÒbÅ~‹ËÏ,m,£-•–Ý–,¯Y¾´Â¬â­*­6X[ݱF­=­3­ë­·YŸ±~dó ·‘ÛtÛ´¹i ÛzÚfÙ6Û~`{ÁvÖÎÞ.ÑNg·Åî”Ý#{¾}´}…ý€ý§ö¸‘j‡‡ÏþŠ™c1X6„Æfm“Ž;'_9 œr:œ8Ýq¦:‹ËœœO:ϸ8¸¤¹´¸ìu¹éJq»–»nv=ëúÌMà–ï¶ÊmÜí¾ÀR 4 ö n»3Ü£ÜkÜGݯz=Ä•[=¾ô„=ƒ<Ë=GTB(É/ÙSòƒ,]6*›-•–¾W:#—È7Ë*¢ŠÊe¿ò^YDYÙ}U„j£êAyTù`ù#µD=¬þ¶"©b{ųÊôÊ+¬Ê¯: !kJ4Gµm¥ötµ}uCõ%—®K7YV³©fFŸ¢ßY Õ.©=bàá?SŒîƕƩºÈº‘ºçõyõ‡Ø Ú† žkï5%4ý¦m–7Ÿlqlio™Z³lG+ÔZÚz²Í¹­³mzyâò]íÔöÊö?uøuôw|¿"űN»ÎåwW&®ÜÛe֥ﺱ*|ÕöÕèjõê‰5k¶¬yÝ­èþ¢Ç¯g°ç‡^yïkEk‡Öþ¸®lÝD_pß¶õÄõÚõ×7DmØÕÏîoê¿»1mãál {àûMśΠnßLÝlÜ<9”úO¤[þ˜¸™$™™üšhšÕ›B›¯œœ‰œ÷dÒž@ž®ŸŸ‹Ÿú i Ø¡G¡¶¢&¢–££v£æ¤V¤Ç¥8¥©¦¦‹¦ý§n§à¨R¨Ä©7©©ªª««u«é¬\¬Ð­D­¸®-®¡¯¯‹°°u°ê±`±Ö²K²Â³8³®´%´œµµŠ¶¶y¶ð·h·à¸Y¸Ñ¹J¹Âº;ºµ».»§¼!¼›½½¾ ¾„¾ÿ¿z¿õÀpÀìÁgÁãÂ_ÂÛÃXÃÔÄQÄÎÅKÅÈÆFÆÃÇAÇ¿È=ȼÉ:ɹÊ8Ê·Ë6˶Ì5̵Í5͵Î6ζÏ7ϸÐ9кÑ<ѾÒ?ÒÁÓDÓÆÔIÔËÕNÕÑÖUÖØ×\×àØdØèÙlÙñÚvÚûÛ€ÜÜŠÝÝ–ÞÞ¢ß)߯à6à½áDáÌâSâÛãcãëäsäü儿 æ–çç©è2è¼éFéÐê[êåëpëûì†ííœî(î´ï@ïÌðXðåñrñÿòŒóó§ô4ôÂõPõÞömöû÷Šøø¨ù8ùÇúWúçûwüü˜ý)ýºþKþÜÿmÿÿ ÷„óû endstream endobj 1 0 obj <>stream hÞ²P0P°T0±T04P044V°±ÑwÎ/Í+Q0ÔwË,*.J(éû$™!•©úþ¥%9™y©Åvv@ Ž Í ©€Ä¢T V ˆºÌ’œTÿ‚r2RRüJr’€ì" Ï\¬ß%ÚТÇ-³$V?Xß=?$ßÎ ÀT9(j endstream endobj 2 0 obj <>stream hÞìZÛn7ý>¶Ýåex vzAá$5by0ü Ú[ר"ª\$?ßö IYkºvèRD€°³äΜ¹p†är¥”Bi¡eÊã@H1BY¡¤õB9<—J(܋Π´6$TšÙµÚ‚O+¡ƒÇE £ˆðP‹†&PËLÂD ~x>/È€a¥ƒ|–LRØÀ ”@5h&Ù+¡ÚFËà žMNÂ(ãA h èÂ)iIP ‚(ì%-œ†«€v 0Õi~ Agð€g(ðz xf¸â(ÂXàY‹6ðœDxΡ <à TÎ{´Ø9à…€6ð"Œ²À‹‘^2ˆ^AÓ Àj¯5+õà³ÂÃÊ@=ƒ Oð.y‚…·$<‹¸`(<‚0h`asÐ <Á‡®`ù¡ðQ¢_dåAÉ8ÔòE…ñüC\‚^àÛà\ ƒÆ]Äüè²0.àç0κ€@‰À·V "?Â8GàðGàEðG 22Z°`œ¢¨‘“‘Y”¢HHJ†b•”àA ØÈèSÚB:‚‡?FŒ’Ä|ÒqJ3#ô¨ÔÒ é/I+8þà…V•¤,÷%‡ÝÛëÎòKŠ7(–˜)†2SU¨.Ô$ŠðäæŠÚB]¡¾ÐKÖX[`m‚=ï'‹a¶<] —-ºF=¯‡÷Ë£áJ¶3Ÿ¯&7\ÓÌsúáfèO–‹Û‹Äøf>_îïß׷ïþ<“\òI =ßh®z¾1\ö|C\÷|c¹ðùÆqåóM*ýä*×>ßðÌ%—ºS<¤;ÍS@!OÙkž²Ÿ<°§É¾¿OËþÇë«ÛÅÐ=¹ZLÞ­š?-æ·7èü«?™^_½ábÙŸ"‡ó÷ýÁb°²¦Ùítº»ì.Ÿ÷rŽ|£/(ߨ½ËÿÝå‹ÉF¹ËÆ-…¾,¯Û¶â»ŸŸÑ(‚e“Vöhe‹–whüH^ lÞôØì¸ÍÛ[¶Re#•Q\FqÅe7ZOœ­‚çFÑt~t?²Ôe¾lÕ²Ÿuø¬Ãg>Ãû êGx¾Î«ŽPvPwˆÜnV¥Ò—´Køº"ÿè~Ïv«Ó–FÅlqúªÃ¿›Ÿ·ùÝB°­Èï^Œ·ùÝ2»ÈïíõüU…σOú“›É,±Îߟ}';mE¾zˆ%&çý/ýËɇùm>/>àÏ0ØMü¦qCÚ4ˆ´iiÓ Ò¦ATù8¿?²?¾*¿ÓŽ™'­oýÁtùÍßÿ| ^Ý—/"÷…ò‘þ˜©ÄL›˜®Ä¨MLUb¶MLVbŽÅìÇÄòד‘˜o •Xhó•Xls•˜’mr¶–Smruž(Ý&W'Š2mru¦(j“«SEÙ6¹:WT[²È:YT[¶ÈPjS¥ñvùïX}aÕ)äþ)Ö:+t[ÉÕL¡“×á)&ŒÐ¦¢N•«ÁÈ6¹:Œj“«Áè¹Xç1Mbõ¤a¨I¬ž4Œm«Óø&±Uvê(ÏŽH…“8ØQ=ÁiVœìpÔs½âL•eãüavùóìr˜-‘Y± ÞÝ­‡¼à] ‡ÃoóÅ dgû“åd±,̤¨Ã*˜>KL¯¯fý t‹þíâzy=»z5¿ú—‹Ó_“’£³|nzþHΗۅ÷©Cè¶,Ꮂ8¢0#!±­1˜Gìº}O‘ÆäÙª¨àîïÿ+À¯‚µŸ endstream endobj 3 0 obj <>stream hÞì•Ën1†_Å/€Ççâ›TU" $$*ºD]DM!A(HðöüÇ:”…K¶,fìãø|¿Ïe"rÁ±£ Åq(Õ ™’ÙÉE6;»Äf—Åìꊨ#®JÄHà(€Ì«˜ˆ= /lóaìS±=XÕl^“j{€Ž Ã3&0l_ ø]°Ú¤«)‹Á0©FÅ“MËNç:}œ>lœ¦»ýöñé+~š6ûãã—éþ´ý~ú³y¦ÞÞ.2ðnÜàJ¥¤½½‚ï¸Pã.Blà} ìëb÷BªìÃ¨Ð™Û •ÐÀTƒËj)ž{%$ä˰ÐÌí„Rj%ACø€n䢽½Šã5:s{¡¹&h8ÔÞ„¸·×By¼Fgn× 4ƒ-TF—+‡Þî…¸ÖW4ÃÌí"BâXÔ'RkÕq¦;ÍÌì¢é±hª|Yľ¨ñHffI,s- ËERêíU4Q^ÍÌ]„4DA1z±Q$|D)x]«pÁŽ4&Ò˜½ûÔÚ×.j%òu¾þŠ^4*b'@V‰X!wA E5(`Ä®äȺ]ª:×ßG¼”#aöq°àF\ÞØ‡àæwæ6Dµáá×6¿mÿXÁ}šî§ûoÛÿ굡« r5!^M¸.“wŽ^Ò°Þ=ý_[ü-ÀöÞ•¶ endstream endobj 4 0 obj <>stream 2011-01-27T13:45:05-08:00 2011-01-26T14:42:54-08:00 2011-01-27T13:45:05-08:00 Acrobat PDFMaker 9.1 for PowerPoint uuid:9a600514-0935-4b2a-9066-71f9c84722b9 uuid:6a6d7f45-6b6f-432d-ba80-d1d8b82d98bb application/pdf PowerPoint Presentation TID Adobe PDF Library 9.0 TID endstream endobj 5 0 obj <>stream hÞ245V0P045Q06W°±ÑwÎ/Í+Q0Ô÷ÎL)Ž (Åê‡T¤ê$¦§ÛÙa*²€( H,J ƒM BÑ`…ÒÜ endstream endobj 6 0 obj <>stream hÞTÎ_ ‚0ð¯²7ÝC¹ÙÖ?DF$ìÁ/0õFRíÆm~û,¤èñÀ9?ŽÔš –eIч3R\ Ovx»;?LÀ…½qb³M…”B¦K©TªÕL¬#!¢©5°vY³/݈mæ’˜Å'ÅΞ”Øþk+¹PZè¯f Û¾‘k±†7ÆŽ]MކÑ<©ºp…øG2Kð>Gyž¿4l@¦ endstream endobj 7 0 obj <>/Filter/FlateDecode/ID[<0D447E39610CFD46BF6CA3A1406617FA>]/Info 155 0 R/Length 69/Root 157 0 R/Size 156/Type/XRef/W[1 2 1]>>stream hÞbb&F±_ L ŒÏ»,`¾$Ì€ÃrPÉ9—F0þCáŽ#€`œ;Ü|Ätî·ÿà. A endstream endobj startxref 116 %%EOF hypre-2.33.0/src/docs/usr-manual/figSStructGridFEM4.svg000066400000000000000000000402511477326011500226010ustar00rootroot00000000000000 image/svg+xmlpart 0 (9,9) (1,1) 0123 hypre-2.33.0/src/docs/usr-manual/figSStructGridFEM5.pdf000066400000000000000000000325041477326011500225560ustar00rootroot00000000000000%PDF-1.5 %âãÏÓ 162 0 obj <> endobj 169 0 obj <>/Filter/FlateDecode/ID[<732DAAD26B22734E98344BFA9D04A5EB>]/Index[162 15]/Info 161 0 R/Length 55/Prev 13310/Root 163 0 R/Size 177/Type/XRef/W[1 2 1]>>stream hÞbbd``b`ÊŒS@'`ά‹A\e ñY›‰‘ÁÈb``ÄJügÔú `½½ð endstream endobj startxref 0 %%EOF 176 0 obj <>stream hÞb```e``Jf‘é ¨€ˆY8ÅX¡˜‘“‡)ÕrÔT¨b½|¨¦@ÌÄÀ ¡¹&Àµ³10x¨bd0”êˆ endstream endobj 163 0 obj <>/Metadata 4 0 R/Outlines 8 0 R/PageLayout/SinglePage/Pages 159 0 R/StructTreeRoot 11 0 R/Type/Catalog>> endobj 164 0 obj <>/Font<>/ProcSet[/PDF/Text]>>/Rotate 0/StructParents 7/Type/Page>> endobj 165 0 obj <>stream hÞÔUmkÛ0þ+ú¸Á‚^,Y6”B“-¬°•Ñ„uPúÁKLbHœ’¸lý÷»;ëÇKR¶~ûð ß‹Îw§Ó#í•PB{-t‹IK"ŒÇÕ m] Nè4óâ^^FÃbWÎAö°ñöá@•‘êâB^ífeÝ­#GÅãDzZ,‘¦‰|_¶¦A¢¼¯ŠÅNä™oêf8Üü¼8ëÉ&´Q)x ë¸XW«ç7Ój]îÄMùCÜnÖEý–l7ź”dé¿LÃÍj~Ý«jöyJ^“f[6³¥¼Ùl×ÅŠTwm^^)Ùº^Õ‹U)ÚËIS®¿BVNŸKòÆÔ·Õc³ÙÊo¡"ë’ËK¨€.ç³øPÏ6óª^È»ª¾ªwU”ÇÕv׌–ÅV¨ÞŸèL ©òS<Œsròô½Á¬¦Û§’Ò‹9Bèy³ÜÝ{8¿ ãŒR.œsÂ)EÈ’¤µøF füAÆí¼ç%Ä8^íAÿ20n>ÂsðyP~àKz­E2ÙÐdÞãà teôã=Ê;ÔÄÿµ¬µqzˆiB/P6¡o¨?¨þ…0Á†1('އv qŒ¢ÿŸ¸°×æ¡U¯q­¢¢c4ØA¹ýînŽLcÊÏú“„sÇ(qzg†¹r ®»IÛšS•FÕ‡þb£/÷Ô·¾>stream H‰ÜWMÔFý+uœ‰pOWõgIˆ ‘‰(h-qÑnY±(Düý¼¶g<»±ØC–EB«»^uUõ{Ï»ÿüãß¿ÓÇ»g?=!¡G?¹ ú›˜,þ1¹œŒ¨fB¼ç£uJW·´»¸´tq‰etyñ YèvÜÐK,5áµ¥kê¢Ü[ƒw6âÿwtIÏéé3 ì&ðnPàÕk0ZàmþBøÆ)yÃKð¾Ïl€4„oWãVÑCÝyâÏ£öÁ8zH_Š.ÑD°Áðbùã<ñj4Ǩ¾”ßš8k–}Üe€à©,Gtí³‘!›} Á“:ÜI·´ûuÏð.îÕÇiÜWïi×¶%©ö ^Z먽¢fÿô‰O¾ÃëŸDÄä3ab {¥ö–^nþúíÃÖmþÙÆ m_·?c5‚زŸvûÛkÚð¶½é“|ÚÎÊĶR§„[Â#RðøÞ«+uUHŒ25lo_¢QìŒË’Xá.vЈèKìÃ^þ6Î$WúÛHy.¯ÞÑ[zóÃi0$j“z*¤&³Dó1XÓG;š„ªNs¥$!›$,‰ ‰|–8fã¸aviR¹FT1~-^uã·]~…žˀ߉`«»©q…$úãy5Ϙ$¤]#¤4\ëÑO²Óúz *>Oqr^ÄLÌ,gÎÑÓAe q.,‚æåƒŠM&Z/êê:3EŠ+•Õš°;YÀ-«Ó3OÙ¬µR* ém>UP¤fw sµ™R!!§qŠ 3sæ1K7›ÕvJ…‹N “|Œ¯ ÷ vÖÏS¡?RJÛ)å¢:¢ûu,̹¨•$H¤j*¶ÓÇþÈ#ôáÆŽ÷pG •¾ë¢Æ'¨®$ØŽä}ÿÕfËn£ôÕö¾¢±RY—L`¶êÊ}Qñ£ØÂyQÇÕ”`<&£ñš7ÓVÏà]¸kË5(Òg£Žµµì=‹‘䊶²±F°³RcM<í’ãyŽÕ‘2–qqëÊ]ãêð^©Ž«IÜ©“—à;jÆ™X¥6éçWGã½Ä2ºÅý…'ìÒ×Tgv„ššmÅŠW>5pªxÖ­ñ+”äªö:œàTãyä€*{.Y­HÚôwZÑ´ò3€böî´²#9+;`Tah,aÉ z?!Åñ}Þ-ù>—ÕÝcØã,Y‹ïÛØm{33Ú~ð¾·ñÔ^Ó†«Kþc>BC·VjkÃðµÒxºa)Üæ 8l£ endstream endobj 167 0 obj <>stream H‰b``œáèâäÊ$ÀÀ›WRää¥À~ž™ “‹ |@ì¼ü¼T ðí#ˆ¾¬ 2 S/`M.(*Ò€Ø(%µ8HâÌò’ 8c-’” fƒÔ‰d‡9Ù@6_IjHŒÁ9¿ ²(3=£DÁÐÒÒRÁ1%?)U!¸²¸$5·XÁ3/9¿¨ ¿(±$5¨jð»%V*¸'ææ&*é‘èr"(,!¬Ï!à0b;C€äÒ¢2(“‘ɘ ÀIÆ8/ endstream endobj 168 0 obj <>stream H‰œ–yTSwÇoÉž•°Ãc [€°5la‘QIBHØADED„ª•2ÖmtFOE.®c­Ö}êÒõ0êè8´׎8GNg¦Óïï÷9÷wïïÝß½÷ó '¥ªµÕ0 Ö ÏJŒÅb¤  2y­.-;!à’ÆK°ZÜ ü‹ž^i½"LÊÀ0ðÿ‰-×é @8(”µrœ;q®ª7èLöœy¥•&†Qëñq¶4±jž½ç|æ9ÚÄ V³)gB£0ñiœWו8#©8wÕ©•õ8_Å٥ʨQãüÜ«QÊj@é&»A)/ÇÙgº>'K‚óÈtÕ;\ú” Ó¥$ÕºF½ZUnÀÜå˜(4TŒ%)ë«”ƒ0C&¯”阤Z£“i˜¿óœ8¦Úbx‘ƒE¡ÁÁBÑ;…ú¯›¿P¦ÞÎӓ̹žAü om?çW= €x¯Íú·¶Ò-Œ¯Àòæ[›Ëû0ñ¾¾øÎ}ø¦y)7ta¾¾õõõ>j¥ÜÇTÐ7úŸ¿@ï¼ÏÇtÜ›ò`qÊ2™±Ê€™ê&¯®ª6ê±ZL®Ä„?â_øóyxg)Ë”z¥ÈçL­UáíÖ*ÔuµSkÿSeØO4?׸¸c¯¯Ø°.òò· åÒR´ ßÞô-•’2ð5ßáÞüÜÏ ú÷Sá>Ó£V­š‹“då`r£¾n~ÏôY &à+`œ;ÂA4ˆÉ 䀰ÈA9Ð=¨- t°lÃ`;»Á~pŒƒÁ ðGp| ®[`Lƒ‡`<¯ "A ˆ YA+äùCb(ЇR¡,¨*T2B-Ð ¨ꇆ¡Ðnè÷ÐQètº}MA ï —0Óal»Á¾°ŽSàx ¬‚kà&¸^Á£ð>ø0|>_ƒ'á‡ð,ÂG!"F$H:Rˆ”!z¤éF‘Qd?r 9‹\A&‘GÈ ”ˆrQ ¢áhš‹ÊÑ´íE‡Ñ]èaô4zBgÐ×Á–àE#H ‹*B=¡‹0HØIøˆp†p0MxJ$ùD1„˜D, V›‰½Ä­ÄÄãÄKÄ»ÄY‰dEò"EÒI2’ÔEÚBÚGúŒt™4MzN¦‘Èþär!YKî ’÷?%_&ß#¿¢°(®”0J:EAi¤ôQÆ(Ç()Ó”WT6U@ æP+¨íÔ!ê~êêmêæD ¥eÒÔ´å´!ÚïhŸÓ¦h/èº']B/¢éëèÒÓ¿¢?a0nŒhF!ÃÀXÇØÍ8ÅøšñÜŒkæc&5S˜µ™˜6»lö˜Iaº2c˜K™MÌAæ!æEæ#…寒°d¬VÖë(ëk–Íe‹Øél »—½‡}Ž}ŸCâ¸qâ9 N'çÎ)Î].ÂuæJ¸rî î÷ wšGä xR^¯‡÷[ÞoÆœchžgÞ`>bþ‰ù$á»ñ¥ü*~ÿ ÿ:ÿ¥…EŒ…ÒbÅ~‹ËÏ,m,£-•–Ý–,¯Y¾´Â¬â­*­6X[ݱF­=­3­ë­·YŸ±~dó ·‘ÛtÛ´¹i ÛzÚfÙ6Û~`{ÁvÖÎÞ.ÑNg·Åî”Ý#{¾}´}…ý€ý§ö¸‘j‡‡ÏþŠ™c1X6„Æfm“Ž;'_9 œr:œ8Ýq¦:‹ËœœO:ϸ8¸¤¹´¸ìu¹éJq»–»nv=ëúÌMà–ï¶ÊmÜí¾ÀR 4 ö n»3Ü£ÜkÜGݯz=Ä•[=¾ô„=ƒ<Ë=GTB(É/ÙSòƒ,]6*›-•–¾W:#—È7Ë*¢ŠÊe¿ò^YDYÙ}U„j£êAyTù`ù#µD=¬þ¶"©b{ųÊôÊ+¬Ê¯: !kJ4Gµm¥ötµ}uCõ%—®K7YV³©fFŸ¢ßY Õ.©=bàá?SŒîƕƩºÈº‘ºçõyõ‡Ø Ú† žkï5%4ý¦m–7Ÿlqlio™Z³lG+ÔZÚz²Í¹­³mzyâò]íÔöÊö?uøuôw|¿"űN»ÎåwW&®ÜÛe֥ﺱ*|ÕöÕèjõê‰5k¶¬yÝ­èþ¢Ç¯g°ç‡^yïkEk‡Öþ¸®lÝD_pß¶õÄõÚõ×7DmØÕÏîoê¿»1mãál {àûMśΠnßLÝlÜ<9”úO¤[þ˜¸™$™™üšhšÕ›B›¯œœ‰œ÷dÒž@ž®ŸŸ‹Ÿú i Ø¡G¡¶¢&¢–££v£æ¤V¤Ç¥8¥©¦¦‹¦ý§n§à¨R¨Ä©7©©ªª««u«é¬\¬Ð­D­¸®-®¡¯¯‹°°u°ê±`±Ö²K²Â³8³®´%´œµµŠ¶¶y¶ð·h·à¸Y¸Ñ¹J¹Âº;ºµ».»§¼!¼›½½¾ ¾„¾ÿ¿z¿õÀpÀìÁgÁãÂ_ÂÛÃXÃÔÄQÄÎÅKÅÈÆFÆÃÇAÇ¿È=ȼÉ:ɹÊ8Ê·Ë6˶Ì5̵Í5͵Î6ζÏ7ϸÐ9кÑ<ѾÒ?ÒÁÓDÓÆÔIÔËÕNÕÑÖUÖØ×\×àØdØèÙlÙñÚvÚûÛ€ÜÜŠÝÝ–ÞÞ¢ß)߯à6à½áDáÌâSâÛãcãëäsäü儿 æ–çç©è2è¼éFéÐê[êåëpëûì†ííœî(î´ï@ïÌðXðåñrñÿòŒóó§ô4ôÂõPõÞömöû÷Šøø¨ù8ùÇúWúçûwüü˜ý)ýºþKþÜÿmÿÿ ÷„óû endstream endobj 1 0 obj <>stream hÞ²P0P°T0±T04P044V°±ÑwÎ/Í+Q0ÔwË,*.J(éû$™!•©úþ¥%9™y©Åvv@ Ž Í ©€Ä¢T V ˆºÌ’œTÿ‚r2RRüJr’€ì" ÏB¬ß%ÚÐ̬Ç-³$V?Xß=?$ßÎ ÀT(h endstream endobj 2 0 obj <>stream hÞìZ[O#7þ+~l:ãã»%„Û‹*v[´ õñ”¢f”†j÷Ï·ýŽíÁê,Ú†j#æØžs¾ãsó8Î )H %ƒ -´1Âh-È ’Ö rx.IšÁb0¥´…bv%…²àS$T…&‹Ь“åçV設Pð â…qüAXé«5ÂRØ€›&P ª@#„µ°“‚jÆ-huÂI÷ 4€FŒGሤ0ó6êA•p “6 ·Âi < ½x:`²À36À3˜/9 ûp9{1eçúÀó“ž·0xóµÀ Ïa´^ lŒ;@%(ì„g¿9%¼’¬7g„×p¶³ ˜¿sÂÃP ¿!ÞƒƒzÏ!hPég0á=œÌ|®»åìñ¸¢e&$ôúÊ“ˆ"ñ ¨åŽœAá‚ó`B`¿2°ŸRq㦃±/枇s  P 4! ˜"R./‚?¢)Á (øá’H¦‚™Áˆ¸ ‚qYƒ¤G,ìa I.°Â#0HæÃ¬‘ÒÌhXŽÇ•á¾gVÃ_îïÞnßý~&¹ä“.zn(®znh.{n®{nX.|n8®|n¤ÒO&rísƒW† (¹üS‹xH-ÅK@ji^²³xÈvòBÀ–¦ù½úu²Xöß^_Ý.†þëëÉÕbònÕýn1¿½ÁàýÉôúæ Ëþ.8œ¿ï0ÁÊšÝN§»Ûîöioçg¼®¼œ|Ã|tØåÿîöb²Ñí²q[®7[w=Ïâû:æÉ¿¤µý?4ÜŒª¶lrË·lqË·ìlŸºìpË·ìoËö¶ìnmÙ[–eÆsÏe(—Q\FqvïêUÅùÑÃÑ ÐÅuÛ—½kÖ᳟uø¬Ãg>Ãû êGx>VŠC!êµ_àØí×ägº>þ³Ï>Ë2 QÙmV·ëþÝîl[žß½¶åùÝùж<¿{ÍnÇó{{ýÿ¹ÂÇÂ'ýÉÍd–NZçïϾ’²"ß½JÄ&çýýëɇùm>6>àcž `Ÿ àŸ Ÿ `žëDó\'šç:‘òa{$d|%(ÿ¼2OÚ—õÓåþõ%xU\þϸ/”æïÄ|%¦ÛÄ\%fÚÄl%fÛÄL%æÚÄtq[`v÷ýøŽSU H¶i ZŽÚäd-×­ü¯ÎX®-\T'µÅ‹êì ¶€QÔ1ªóƒ|›\ Úät-Ûäê|QmùBu¾¨¶|¡:_T[¾ÈÕ¡R¼ý% Ê5¹<<ÅZg…jóštE…NVǧTÔ‰ Û]Ö‰ Ùð(ÿU®NmÛäêDЮM®NíÛäêDСE.Ö놎Mbõ²ad“X†šÄVéa8Ö‘OhWœÉÛê N³âLëÇ9ÃêeaSi™Ç8¿™]~?»fKd}ì‚wwok~_ ‡Ã/óÅ dgû“åd±,̆L‡÷Xúëû`z}5ë_axXô?-®—׳«7óË¡½8ý9)9:Ëgç$}ù½ð6œ÷†r’ûéNyóâRŽÕ‰n®ñÕ9n,$ƒÅòBËg{énÃÆ íîÈGͼ~ÞØÎû‘GÖ#ð“üéÄ oÝù€»‘—ZyGyoiƒ¼wjƒ¼)ñ®3ÍJ´ïìG(ÑÊ´+Ñ!n $mñVÆ^à1þ*Í“¿ê<Åó±µAAÛÝ4ާ˜Æ;<è§ó‹ß*[æZ‰¦Ów*x–EøJ´†IØh6©I¨#KØ’¨³%«D/<°Ä†N6Z’1GJdèÂZé.²%•hé:ÙjIB)!bwEF€×½{v8ÙùFŒ8Ї· ‰»Òü!£^÷î)€ÎF qdÁRO(0¡ÙFg”Oe²‹´]÷î'­i¶€× ”ƒíšC‹YãM£@mékcÆJ —¨k uÁ­ªÜHÙaKÑTäë7ªq¤WTü‘œïðó…KÜ—n9†Û³°–^߹غ("µió5!­i\Ia>n3–Qþл'Î_ê×ý{eŽÂR>¶:,áîïÿ-Àõñ´ endstream endobj 3 0 obj <>stream hÞì–MoÔ0†ÿŠÿŽ=3þ’P¥.â€TDE+q@=”n¨V,»hµHåßóŽSõà²Wi<ÙÌó·ǩ÷Þ8ã=ïîlÈeÜÅ0ÖÞ#^íh©L$µ³I¬v1™a“3… îH! ª}"Æsðjü±À‚¾“ŒŠN¢\Yð;Ã3x1®¢a2®à¡ú%ÁƒA«,Du¢¦'CÞƒ É«¢$Ÿ@F”D¯x,T\DdAXËq`‹2b".šÈ╲°z,^È–$AÙ"u¨#7 ªÕ ‡ÈZ,2ȨEír£Xkr„Îë×ÃjµøÌÅ[…R²qrÉ6ÌöÍðv·~·[»£Ák! †‹Û_ûŸÇár{{7~ÇOÃj»¿û6\oÇ?/Oܳ³Y(Xª`²¨ŽxnÌ…Œ‹6õËTj+ïÊuÖa'‰—Ö^ Á·_¨rg!V°K6:©+³Ý ‰u½BÜF(» öÅYÖ¦çlýl/„ØÛÜ-4q¡kK0 ÖaX(Kk/…B¹­ÐÔLz¯BÔÚK¡ÔߣGn³üÖT C!äZ»¢R^°&n“ _Á,Öæ2[‹§ºÝÙLÌ&›‹M•žщêÏdb6™„<õ"£ð8û8ÆÖ^døÙLÜv~Ø–œkš¤ó“Ù²<ÙËM-ŽòÞù©Ü*ÔŽ ä ψ«@¬Æ¯ûÃhœ K‘Å×`¸ŽçÛÍýnxƒÇãaøtØ7»û÷ûõ8\®¿4Ù¨ ŽOè6âƒÆìZ{¹ N"îÌfâÎBâ²ÕÃ?XÖï(šEÏx+ËæPƱO¤2[ ²±N}aýT{[¦ãó¯öÃË÷ €ØxÝÀO¡@îšU§€›IÁfÕÏ L[ÇJx®FŒâ†Î9Qâ,ðJÏ3ýMToAôvó„«/Ÿ×ÿ1œù8\éŽÛýO&„“ édB9• 'WRN«ä¥ñO!l7ëñÿþ‡¿^*% endstream endobj 4 0 obj <>stream 2011-01-27T13:45:15-08:00 2011-01-26T14:42:54-08:00 2011-01-27T13:45:15-08:00 Acrobat PDFMaker 9.1 for PowerPoint uuid:9a600514-0935-4b2a-9066-71f9c84722b9 uuid:0b0e6283-2143-4e99-9261-c712256f964e application/pdf PowerPoint Presentation TID Adobe PDF Library 9.0 TID endstream endobj 5 0 obj <>stream hÞ24µT0P043P06W°±ÑwÎ/Í+Q0Ô÷ÎL)Ž (Åê‡T¤ê$¦§ÛÙa*2( H,J ƒM BÑ`†Dß endstream endobj 6 0 obj <>stream hÞTÎÝ ‚@àWÙ;Ý‹ÚSûAi ‚„½èVH*'¦•ðí³¢Ëç|HAh‘eªèý™8<îT[ºÝ]7LÑù–:ã<†fi Q q%ñL¯­ƒ©5©r^X³+ÝY¬ç NÄÂÒÙRÛy©Jjþµ%,â’¯f™š¾Æ‘k¨Â7&mÅŽ‡ÑÓR[ÅðG ËøÀÎŽÊ< 02<@¤ endstream endobj 7 0 obj <>/Filter/FlateDecode/ID[<732DAAD26B22734E98344BFA9D04A5EB>]/Info 161 0 R/Length 69/Root 163 0 R/Size 162/Type/XRef/W[1 2 1]>>stream hÞbb&FñÅ L Œ/€»$`)üf@‚a9H‚ ¨ä,3ˆËÀ#ÿ¡pG‰@0ÎYþeº÷ù€Ë M endstream endobj startxref 116 %%EOF hypre-2.33.0/src/docs/usr-manual/figSStructGridFEM5.svg000066400000000000000000000435441477326011500226120ustar00rootroot00000000000000 image/svg+xmlpart 1 part 0 (9,9) (1,1) 0123 hypre-2.33.0/src/docs/usr-manual/figSStructGridFEM6.pdf000066400000000000000000000325351477326011500225630ustar00rootroot00000000000000%PDF-1.5 %âãÏÓ 193 0 obj <> endobj 206 0 obj <>/Filter/FlateDecode/ID[<1ACB8A8AD3FC5E48ABD52BF8742476EC>]/Index[193 20]/Info 192 0 R/Length 71/Prev 13333/Root 194 0 R/Size 213/Type/XRef/W[1 2 1]>>stream hÞbbd``b`ªŒS@„`N‰ÿ@b– ÖU+Äâþ .HÝ›‹ LŒ @#:ñŸQú@€Ð| endstream endobj startxref 0 %%EOF 212 0 obj <>stream hÞb``àf``*f¡% ¨€ˆY8Ÿ¡˜Q™‹å‰ÒŒÛ¬Ý ;^r³(Àõh­…ê}ÄL ÚS!4O+Ü6÷ïUŒ¬›¦ f endstream endobj 194 0 obj <>/Metadata 4 0 R/Outlines 8 0 R/PageLayout/SinglePage/Pages 190 0 R/StructTreeRoot 11 0 R/Type/Catalog>> endobj 195 0 obj <>/Font<>/ProcSet[/PDF/Text]>>/Rotate 0/StructParents 8/Type/Page>> endobj 196 0 obj <>stream hÞÔUßkÛ0þWô¸Á‚dY²l(…&[Xa+£ ë ôÁKLbHì’¸lýïwwÖ)Ž—¸l}{ø°ï‡Nw§Ó'­œPB«TD|)™ØÁO$¢$I޼žLÆù¾X‚“…·òj¿(ªFD*Ör’?~,ÊÕºIË÷EkÅÊÉé&_íE–Êi]5ãqýó~d#›ˆ´J(ÀY§ù¶Ü<¿™—Ûb/nŠâ¶ÞæÕ[²ÝäÛB’ ¤ÿ2ëÍòºÉ7åâóœ¼fÍ®hkySï¶ù†Twm^N)Ùº^U«M!F‘“³¦Ø~…$Œœ??ä©ïÊǦÞÉo¾"cãËK¨€.ÃY|¨õ²¬Vò®¬®ª}äi¹Û7“u¾ª·4U~ʽ‡¶VΞ¾7˜Õ|÷TPz!G½lÖû{çRñ/¡­qš k­°JÒ8nm€þdsªõ¿hç5/!ÄqêÚKø¹§õÑ?æAù/éažSɆ¾ ók“#ýx ‚òö5ñþ¡6€1&|ƒbjß ”µïêꃽÚÛ0åÄñÐn ŽVôÅýcë×Úã<"Õk\«€¨(d VPEö°º#ÓÂrÀ³…þÄþÜ1J˜Þ™a®œ‚ƒë®“¶æD%AGõ¡¿ØèË=u­/Ï ÛPçìá\O ó=ìƒ{ÍàY8ìó)=ÏÄÐÌ¢ž]<ݹèÏC€Éö:³ö@̘XÇÈÄ&K=S€¿aâw-û½ÀÀæ,;=LÀFðëÈž»ÿ•|ár­~'ßÈ]ëÄÙW“/Æ` >Ó*\„@¾^æ‹Bù1™Áàb~]_þò³L~¨÷Ïäˆ_ƒs€|»µñ%c½ókÏ’¯9ò…¥=)–õd&_¬¯C„îõs/Ôç^.ÔN=Ûféy‰½Â‹›œg^@IJ ÊIÖ 2¯Ž™7:ü|ø=ô_Îî Ú¿´'r=ÉÈþ•Øîá½È¼ç`²“úcæý%À놆 endstream endobj 197 0 obj <>stream H‰¤ÔQK1ð¯ò¼{¸ÙL’I2 >¸¶Ð‚R¹¼‰ålK¥'V[üúœ×S¼°öè.„aÉÌ/™Þÿöûþ ŽŽ†³ñÃ)<ŽONGà'Î^F(™¼jÑäÁɇ˜\P¬Öƥø´iXŽçp$x´Œ\ÚT’+‡klª¬ÁŽì›K6þÀxwfÊðŠû|%i¼° iã]9_D¡„‰§øØá™Éì¬"ÿÃ+…7uéè!R jO´Þ 6]ò¡ºO”¬€âÉö§ýø¨¤%%­ýŽŠpÑâ;+ð»lY‰Ð@&7;¤Êž½Kœ-¶þ;îmzd;÷’;©>í0ý‹mê¬Z‡Õ-†Z\¿Z ¨+,¶Ñ#¼EqSÿ)òÞSÉ©À.qTÔ5.gwŸïçaökžf˜_Õ6ÛŠ¸–Ϥ›üzÏëͶÏ«âÝ¥ëè‹hÇGm_–ÿ¯Œï22ÅXzlc,rˆºR™ì?àK“X{{ÂO°Â endstream endobj 198 0 obj <>stream H‰ÌSMOÜ@ ý+>î"×ãñ|Iˆ$¨Š6Äm AÕ"¿ö&éfÃB¯=däLüžýžö Ú•oà±’Xø f2oàø¼X|…ýýÅyszìáààðH/ ‰‚]:”ªJÉÆp5ûuó<³—yšÁüºý¨Pü[踅ÅÉ»×ça(ø¼HÏà3{¦”ÁÁ"5UX=Á¢Y4KMƒeóEs` zÒÇ a [d2"c”bdÁÈ: cp¢0gý>Â=ÜîMH (W1‚`Ý”ZG ßBw¶N¥Ê{©œ3²¾Æ¢V0’ˆTIŸKe¬œÇTÞ©åBÈQÛÕA_¬)QQ³(I̪ØD³ÅvµC¹5gºÍ:æŠÅs"-:²n È&T»mˆŒF›…(šr ?ÇåcÄB¨QÔø¬Zj$N›òš„£ž>i:¦Á$K¯@8÷o})=¢‹I3ºÈu×]º3¹ª+Ò¿Ò€ 5ÉÔ·Ÿ U7+ÂÛöÿ'šî×›µ{‚i˜àÅ?g(ºßfEQ+².Šþ9UûQ+àÝôò endstream endobj 199 0 obj <>stream H‰ÜRMK1ý+ï,ììäc6 ”š¶à¡‚ìÁ°hUX¡‚ø÷l¶PJ=x‘ê!ÃLòæÍÇ ƒ1ê1äEÔšÎÀRçD­$?û<± s$dbœ3ªÏЍ^S¯+¼9ejŽTµÈò1ƒ'’§Üã3…Ú‰ds)z˜à(¤ä’#ÚÜ3r¯0ôùLAð©)¯˜r¯h¦gô:Ôf—vû²ÿxÄbÑîòíÊ·\®ÖúR¦.ð`â zÀÛé*\ Ô±gWV)–UhsÃxmóžkø}ãÿCÃø3 Ëw]E Z> Ûîhx¹ñ_Ñ_ ¶øë@ endstream endobj 200 0 obj <>stream H‰”“Íj1„_¥ÏéíµÔ ƇŒcðÁ³‡<À’Ä1v ×OKÞ1k{Âî2—‘ÔUÔ|S2dw˜‹$i0 V5´(ËbŒ\yYÒ¢ |vp[¸ƒO·3ÀæúÇ÷?¿¿ÂÅÅæv¾¹ ¸¼üx•'wðkŒ7!°BC_àgnòØf3tkL\€]ÐÙ ™Àî 6ó–`ÞælçÏ9ûCôÔ Lµ:<Ž ¯-¹"6àæÈMKHé–{¹¢»váHy®U–å=|ûðÆP€sxdFE ‹nþbøì·èŸÝ¦7v« ”Î%Ø„…jË EK%# *Ö|yG¨4da¥Ö¡[÷r9 T@REPÖyðˆ.)÷òÞ !ŸÊ1|EkQc(h\)üÈ÷;·þƒ­ê*qOGÍ¢šr ±C X²`„B]õ¯yœeÈKð.nZÃÛÀÚ|ßå=—a7-~Ý®ôp¯üÖ9ÉœüÄ¢äe‡¿‡¸˜ü¥-ë1ôäZë‰1àŸR¼õb endstream endobj 201 0 obj <>stream H‰œÓÝJC1 ðWù¿€=Iš~Æ.€ˆ8œ  ¾¾q Ã ÎÂèE¡mè/i*©à Œ-@>v( Ë©dÆ+&lp³áöåùó㠋ŰïVÈŠåòzå;¼ï›‡üÐÞ|‘÷Ë )=5a¡ÚÀ½%ÉZ)wƉ0N~ Óx¹ŒR”ÌòG‘NIŠV³¡0uŸç5^‘ª‡ŠXKʦäIž2(µcÇ9F‹3?ŒR)!†K*½ÏRzœÒ%Ø#§”œ*ªG”Y‹]T¡–*©˜ç±¸|þyü¨CùÐ%?&bˬÉÕ¹6QŽ;¨ÿÿ4¤j=Ç攳¢ò‹ù`À½ýÌ endstream endobj 202 0 obj <>stream H‰œ”OkA Å¿Ê;Ú%–%4³‚CœZHiðBM%4ýC]ÚÐ’¯_­íà 6éîevvõžô“vp_༛2Ü÷Ÿð?rSÖÛ‚•šŠrmÐŽIÙ4"p»Â|±d,–ù–‹7`jއ ù†uì ³B³JZß±Ä5.¯Àüå×ÏÒèôt~µxu+8;;¿È7ÏfcÜí²ñ ®˜‡µã²i¤¹%róó·»Dü1‘yßvý]ê0ô·˜åJý4W¶ݬŠ(UñªB¬¢_áýäçÇûi™üžÖ xú¡½-~d×ìdk7Xñà"º©Y“O5 hs’f¶Ñ¿™L¥Lâ$n¦;ùË~¯ó£Íˆciä"ER5¨æCD9Àq PL3#ãº9Ò”B޵ʜ½iJV¹F±AsŸqnPÒV2z&ÄêðD¦ùøw/ó´-®ûœvttÐ’º9nœ=Ñ‘yŽŽíÓÑp*Z•uPm”5Iè¡™?žŽ6É}­Ã´J0y¥ý½|¿„Ò5*œW6X܆ѕðzÔ’sÉÿú_SæÀ@ù?³<$êqÇDR6€¤)þ 0G«ù½ endstream endobj 203 0 obj <>stream H‰ÜRÑJÃ@ü•y²ÙMv/wPúÐTÁ‡ %~@Ѫ؂‚øûn{ HlÕ.{w3;s7é°ÆõªÊ›çíÇûf³rÕÞ.a æóÅÒwÞ `ul¨fj˜’jJ)$lv(ÛŽÑvC×Þ©1|:åGî•B…Ìѯè&EãwQ9‰¦@,I’…‹D5úç'½tÒ;0šŠaÊpÈ=öc)ŽMDz0‘•Djæ£AE¡6-i_o ÄUÓÏŒ$Æž‘kvD®Š¼œáŸS1´Ê"ý”›<^ùa/2~öö~Í™ž¦ <$¸>›¡ŠRIò¿âoe8müd(ž!¾«ÊìR endstream endobj 204 0 obj <>stream H‰ÔRÁJA ý•w¬Âf“ÌÌî,”º­à¡bÙ? ZµPAAü}ãÎní¡HvB&¼¼Éãe¾h5ÞÁvkeÏøxÂÞ¬(}Yà¢'Çvœ@‚'Ž^¸òØì{ÀOò!X”J T¹`14~È7°&­‡W ‰qèÈ9"gE.gxqÌTŒTù“áÉc÷$Ûë^̓—mÇh;ƒ¡kïÀT|YËÿMÓ :µ\™SåÍëó§Ù3–«övJ1›ÍÏòÐ;%'*—åáƒ_¤‡kÌÊû_ýèa™’­)Ò¢Y¼Ú7Ô›×PÔØ í1á«´6∨‰l(&6¦GLä´æªÄŽBÕ“X7b ­;@— ø`,°Ú÷ endstream endobj 205 0 obj <>stream H‰b``œáèâäÊ$ÀÀ›WRää¥À~ž™ “‹ |@ì¼ü¼T ðí#ˆ¾¬ 2 S/`M.(*Ò€Ø(%µ8HâÌò’ 8c-’” fƒÔ‰d‡9Ù@6_IjHŒÁ9¿ ²(3=£DÁÐÒÒRÁ1%?)U!¸²¸$5·XÁ3/9¿¨ ¿(±$5¨jð»%V*¸'ææ&*é‘èr"(,!¬Ï!à0b;C€äÒ¢2(“‘ɘ ÀIÆ8/ endstream endobj 1 0 obj <>stream hÞ²P0P°T0±T04P044V°±ÑwÎ/Í+Q0ÔwË,*.J(éû$™!•©úþ¥%9™y©Åvv@ Ž Í ©€Ä¢T V ˆºÌ’œTÿ‚r2RRüJr’€ì" ÏR¬ß%ÚÐÒ¬Ç-³$V?Xß=?$ßÎ ÀTŒ(m endstream endobj 2 0 obj <>stream hÞìZmO#7þ+þØ~(ë·ñ‹„N‚ë‹*î®îâC [Š”KÐ6©àÏ·}ÆöBΈœit •"E;^ïÌcûñŒw¼ŽRB ¥…–A(#Œƒ°Â# %É åð\*¡P „Ê ´6V¨(4«k)4AO+¡ƒtx(Œ ¨î-d°P&:´äoIh/¬‡’‚ðud}„± <£ =¤Ô@ZH POÂI é õÒCá:k"$*­„ ZX%œ–Ò¢Þ@:H+œè’36 <+ :I¸ <Âx xý&à9{ày@ÀóõÀc@• P.Dtx‘ïƒð’ŸGHðá¤ðJq§!=Œµ-hÄ@îŒð†;MzNxËà^xB¿Ñ%OPÈcày ”x¡Œª€Î¡ /²±Abr@uà C Šq"$À0•Aã>(H¾×"¾7øñÅâ‡vA¢tn‚J.¢<‡vð<Ú‰Põ‰ü8x¸P¾ªBi‘UAZD‘ýÐÑ€lP WF¨¢]%akÑ‹¤Dp'…YŽ„q+L#†È:Àõšu€êÙÉ1ãD¸!rÀÞ¤$#[©„³ýýîè\1)N®H_d(2f Ó,U‘:ÉXÌÀY–¶ÈÆç6Ø`/ºãÉÐÏgCßsÀ¢j¥æC·8êï¬ÝÉ|Ú¿ŸÜr4³ÎÙýmß.†åeR<™ÏoÞ`<–Ÿþ8—ì©w.hŽw.x.XŽx.‡<Ç<RÐs—„£”-QÙ¥~ùz©/Û£\^q¨°BNÙ*•RÙ!• RÙ•íQÙ•ÍQXÁ‹²j8֌ǚñøÈ8æV?çìx&w°ˆ3aÇü6éw;ú·Ä¼Ý1¿%æõŽù-1¿{Ín‡ùýýî€O\ø‹ñiwz;™¥°‡‡ó»óïäž&‘¯^'A–ÅE÷K÷nr?_æ/Ê|D³!m à7ˆØMI´›’¨ò^ ;²;¾*>!•u2QÓÅ7ýý-tuw\N(>7ÊŸÜÌ\efŲ́2³mf¶2£63S™¹63]™ù63UØŽ¬îŸª?hÊ¢©ÙajÞ?²jr\§:ζ PåÓ°5º¾èj•tÕ:ÝzªuÛ\Ûz®uÛdÛz²uÛlÛz¶uÛtÛzºuÛ|—_± mv²¶‹MveEZ 9Ùfj;ÕfW¯ F'_Ñ_4|²6˜FÃÚcŒm4¬]ÆP£aí3Æ5ÖNc|£aí5&4Öncb›¡®ýÆÊFÃÚq¬j4¬=Ç6zŽ®=Ç6zN>Xfƒ<ñfÍz–£Y73o×éÖþAm1—OÁY?œÖµQ{µ­“ºvÊcÿ¢¡ª‚\£aíä k‡ ÐhX;ÅFÃz)q²Ñ°^Jœj4|’lèFÃÑW\^íÖejÌ1\f~]ê Æ,Ã硯Éâ>½ÚŸõÖfW?Ï®úÙטּ¼{H99§¼ìûßæC/äu§‹É°(ÊVÙ=„]úgÆÁôæzÖ½Eu?t‡›ÅÍìúýüªïÞ g¿¦FŽÎóר‹g¢ ü¿£è¶|Ï)YI·J*5¦Ic ´éÇô²T+иºŒŸ»ËB0~å.Î1Îù8Ÿã\•‰`ÔÃf‚ÿçR†žÎ6šrNÛ¨ûúsfÞ¨Kíº_áTb¥áÓüÏ¡ÒV>¨hëW>ÃhÓÍçºÿîÀãÙ1Å´_àG±ÙVÖ R/X+œn]+þ`~Û² endstream endobj 3 0 obj <>stream hÞìXËn7üþ@¸d?ø VC1"9>(ÖÆ¢¬Aœ¿O5¹ÖpÆÀÕæC.6µSÅên6›ctÁÅH.†ˆ'; GqOuÏä4(žÙ¥ð,.·ÿWWÞ§àJÍxFW+~O†W+íG̲A`ĸ8Úfðb ö6~—m)„7 ¸ñ†‹à‘£-ÌfÈQ›f,•Øfċͨ#›IŽTÏÙQ sq”È\ͶG5aF"¤&›!Ç1Û ;Ư1€¸ ,Åf’c­6“§ qRg“,Õq©jš×jâ"œg^±4'(;aÓ®âDÌ‘ 7Ïjr’ÌXœ$s'¹áT'Ë„“0°5' Wó ©æ¶äš±žä‚¤äÆd±Ã«"5W*˜ûSÅ 9 *™ûÜfŽPR ;m¹ #\£Ù¼‘,Ñp€,l8@ÈpŸ ^E<10ÿ +* «q «qÁŪقäd‰U€œU±9!D±9Aî«W»ï×ß®÷‡7yÉi÷ãîíÕßw=ì.ÿ¼ú¸¿Øÿvw¿wÁëîòáêþáøcáì•d÷~ÿùáÍíͧÃî[Lïïw?ßß<Ü>ýpw½ß½½ÿëë×+ˆŸ'A.œ@rqq÷ù8γ¥¿F/H§¶NË Ÿcý0ª-¶Çe¼»Å2þÀ?v·wßhm˜ ñüHa«”Rž"a†¤Hs4 uP¸bJ*w%‰¼íäò•->L*é˜I(¾,‘}5%_“`{û0«¤¡$1š»ª!€Dëb­t¤àó$!ñÈjøkÅLˆkEÎI‚†8(!QQâ3R¦â˜Q¹e”t±.Ö:ieZ!.” -´X5Š!á©G›EF±-š&C}ÄÝìr Á Ïmr‹Šæ“ö8Ò«âP¤œ½®Øâùhn‚MŽéù¬ìF iö©ÎE¤v<½&bG•Éš ëI§ù+¢ŒâðO±ü…мثmŽE¹Î:¬áY\±1 ‘8uuD{ED(ž³DGÜ‘YÜ€ÉãP·ºµ˜Û²•çiêH“º£rèû2Êh¯‰tÞqGÜaw°$zEsX]ìÕî³DGܨ„kðŒ–ŠJñq±WD}™&ê¸ëzC X} Ú*×`¯‰t>FGÜ‘¨Ç$ÖŒØ×¶å{M”çctÄ’!v`“JÖrRíõASOH†Ž;(‚ã0£þ£…¨‹µÊ8ãVÓ15#,’*?Mb;j^IÇ”h/4è@ÛÁÉ)öJò j:î@„MQ 8cv…AŸÃHÍ^%AbŸ¦‰:îHÄ}¿!ðÏ)$м¢Ž;õøàZ€R[­ňØgÝaïÅi¢mŒ°)*Û%C|ÅÅçQ!*ÂV.ó¡ãnˆ’]x<}ữày‚Géž4:Î"aíYôv‘#řЉÛÍ6Bðí|„î˜Üºv\ŠÏ:ù:︎;½+·=Lv8 p“þb¯+\òiÚsw¨ è ‚ô‹Ù.ò¾}dhæŠ&àîTg«BGÝö²ñ,§A3ÿÅÃÀV†îÓ*C²<Æ%|°×g(ªjäI¢Ž»¾‡ûü„¦ß®!â[Û:C8…8Í_BÂHn¿5MÕwtçµwŸ›ÓoÅY Žwsi_Ž8eÒSMÕìÝ\FËͶuÕ>Ç<á#¦éÏ1››í7Ö~¹þ7S{¨ØãÃ#\ûñ›öí/¸Ÿv—–؇—!ÐÙr6B:¡œ‹Ïöd>Û“ù>stream 2011-01-27T13:45:24-08:00 2011-01-26T14:42:54-08:00 2011-01-27T13:45:24-08:00 Acrobat PDFMaker 9.1 for PowerPoint uuid:9a600514-0935-4b2a-9066-71f9c84722b9 uuid:3b6fa7fb-0c08-4861-93fa-5b9bc449acfc application/pdf PowerPoint Presentation TID Adobe PDF Library 9.0 TID endstream endobj 5 0 obj <>stream hÞ2´4P0P0´4T06W°±ÑwÎ/Í+Q0Ô÷ÎL)Ž (Åê‡T¤ê$¦§ÛÙa*2…( H,J ƒM BÑ`‡#á endstream endobj 6 0 obj <>stream hÞTÎÁ ‚@Ð_y;uQÎLceˆ A0‹~`ÔIå‹×Hø÷YÒò½‡+S²,.z%ÏGÅ{z<]7LÑù–:ã<†f§„”BªµÔZ%z!¶ÁÔ÷EÍT9ÖJwC†t)áB –ÞÈ–ÚÎGqIÍ¿¶‘+¨Y³LM_ãÈ5TáƒS[±ãaôDŸ[Çp&Á2¾°ó¿£Qž5@¨ endstream endobj 7 0 obj <>/Filter/FlateDecode/ID[<1ACB8A8AD3FC5E48ABD52BF8742476EC>]/Info 192 0 R/Length 71/Root 194 0 R/Size 193/Type/XRef/W[1 2 1]>>stream hÞbb&FÑc L Œ/€{9`ãüf ±å ‚¨äÌ ‹F0þCáŽ#€`œ;ƒ„`Ú”ÿš ‹ endstream endobj startxref 116 %%EOF hypre-2.33.0/src/docs/usr-manual/figSStructGridFEM6.svg000066400000000000000000000766531477326011500226220ustar00rootroot00000000000000 image/svg+xmlpart 1part 2part 3part 4part 5 part 0 (9,9) (1,1) 0123 hypre-2.33.0/src/docs/usr-manual/figSStructGridVars.pdf000066400000000000000000000103051477326011500227700ustar00rootroot00000000000000%PDF-1.3 %Çì¢ 6 0 obj <> stream xœÍ˜=o!†ûý”va†oÚHiÒžÒ[¶|…"?ïòç8§¸ZîcØw†gv€{QF“2üêßwÇåe¹ºöêá×’tP¿Rßð~ÂûqñÑè¬(”¬½:vÓ]JÉêy¹YˆòFÑíY"¿‰’Ó‘5MÜíYâÃFÑLäèU&X&ãrŽN—˜TöQçhU¶YUŽIGJ*•¢©•iCênIÉh—á༶%*¶½‡Îê”BÕ[¿5Ev¨³J¡èPœª&8àæœçŽ:¤÷ŸöLÇr–3DQqM{ƒ^ñí0äêõ'ßÀYÍÍbt´IOïÔëÃâélès’›®ðt.Æ»ŠqÿŠqN‚ ê/Œ[†Ê˜Pg"BF \&ºÏ,ð¤Ár„ ™?­ÅpS © ¹Õ&±œ‚69L:ÛR•‘ËêÀñä„ ÜK©`U+P›jû¼¾Âx¾L|d6|dg>¢S>2'|ŒGyðEàèVÀÀ|Ü‘2e5ˆ6¸S@T:¿Åc;dxüìGÆl|`Èݘ ó¹˜ ó¹˜«2M€5$ꆶ.ä^ìv ˆhOòk·|d6|…ñb™ùÏ®NŒ[ø á1eØlùZ—+Ÿ õ¸k@À©Ât¾Qa:_/1·Öá“3øz¾µÆt¼QcOjŒÝÖÀ]Ê¢˜9»“Ô¯É q›Ý¸Ó9»Á3Ý€C¡aºGÁœÐ‘Ç®) 88ÕD3Þ.é¤úu¸QYÜ(,nT–N*‹ÀõÊ"pRYV8©,N K‡›h¦Ò·Kº±òJbeUë‰í‹Z‡“Um°U­³Éª&l²ªMií«š¤uô×Ò:ÁÌËîé°·åyNöÒ¶žcª™öð8u| á'üy+}n›Ë:¿·±¶s¼fI8”ømÖU’9¶!È–-²–r9ÞµS=€%,-q5'aíÔàÔø1g<ññï†Aá™Û9Ñ¥æÍÆÜЧ@0q'íÔ1!˜·Òû¿g a#·ãi¾±VUˆÿw’‘g îWû<§y†µQ®1äöÛYgíݼÑÝ//¨ùõ€þuwT_ËÕ5Õ–‚¡T5‘BýÇ#N¤êp\.n/.O‹ÓÎáòáÇrñÈ6\ù\Õš>·&_ø­éöµµ‘zÛÓ[Ï&3:X‡G_/Oºlª¯õ}áׂ(Hÿendstream endobj 7 0 obj 934 endobj 5 0 obj <> /Contents 6 0 R >> endobj 3 0 obj << /Type /Pages /Kids [ 5 0 R ] /Count 1 >> endobj 1 0 obj <> endobj 4 0 obj <> endobj 11 0 obj <> endobj 12 0 obj <> endobj 9 0 obj <> endobj 8 0 obj <>stream xœ’]lUÇït¡]j©ø±¦¶=Q-­JbR?°¥Rº4µÒ1h§3ww/ÌÎ sïv»»|lY[6½Ýí²+!.ÚÕM€"&ø@kbH !My£>4ê£>h|˜i'1Îv•}óíÜó?÷ÿ;çž+ 5H„GûvlßÕýZënÄô™&*D*å7[ ÖVƒË~Ñ..O,?»¶y?X·Þj¬Aï/ö°õÇCÖïZ¿l(¥„O„ë¨yp`OKkk[§¦G â0x®££†#ð—]˜¿ `+šÄ*k‡70Àà# †þÁW½=мMe™¨Ðm8jhØi ¼DÂ*Å-àÓ PÊ4U&Œh*m‡mD :–ˆ¨•°^Ú@ÇFPêÄ@(ø QeX¦Q%%$—ðNÞ§© tCsô £8VýeT2ˆÎÀ!öwu—{d‘•¸”82h>§RÖ¤Pišû‰JáQVâ c Õ1âp+Ý +-„(Qý«ô60°_4dÓßÒ«¬Îÿ˜ZÔu%²rW[©ºÏ'ŒbÅ×ÞG‚Ã! ZPT¡Oë/ `H (ïù¿«kû‹D­%Úš[Ú‰zÑz´U£Jç 5è(Zžd᜙®5/Æç-OÁ,üžË4ÌJ=øNb,;Î݉D.{*ÏÎ4ñt:›Ê¹SUS©ŸÌ{ÉÔÆÑpRNÖǪ®OžJò0O$cãá7ííu±×Çvû΄/Ì}zañfãˆõ¹G³àÁ™‘Ù³ÅâùYvVorȶT´~+£\æ¤ÕëI¦žíK(“õ±sUÙ©ÜTaê~o(¯\éùÛÁºëšµwxÌ &úâÎ5S8ÿÕéÛük~3qçÈ­èÂá+o}?:Qwyk~+ßÄíGˆýÂ>Pwž^wm¸`uÌý…Êbõ·ß­©AèO¢}°® endstream endobj 13 0 obj 887 endobj 10 0 obj <> endobj 2 0 obj <>endobj xref 0 14 0000000000 65535 f 0000001248 00000 n 0000003806 00000 n 0000001189 00000 n 0000001296 00000 n 0000001038 00000 n 0000000015 00000 n 0000001019 00000 n 0000001701 00000 n 0000001435 00000 n 0000002693 00000 n 0000001373 00000 n 0000001403 00000 n 0000002673 00000 n trailer << /Size 14 /Root 1 0 R /Info 2 0 R >> startxref 3935 %%EOF hypre-2.33.0/src/docs/usr-manual/figSStructGridVars.svg000066400000000000000000000342671477326011500230330ustar00rootroot00000000000000 image/svg+xml(i,j) hypre-2.33.0/src/docs/usr-manual/figSStructStenc0.pdf000066400000000000000000000251051477326011500224070ustar00rootroot00000000000000%PDF-1.3 %Çì¢ 6 0 obj <> stream xœíZKo7 ¾Ï¯˜cRÔS=) ¹襷¶{ôÍÓ»-œè߯$Šr=^£»MR‹ 0(R||úÈÑÎôa6‹Mý×ÿÞ¦‡é»ŸÃüîÓdL8¿›ìü~‚ŒK˜}XRÎ8ô Ìæo§ûo&ga(-ºb*”¦øx˜m Ãîó÷»¨ˆÖÍ»û,{°‰Œf‡Kñã‚8ïÓ+óz÷a‚¢Úý:½ºýX¥vóOÕƒ­¹Æù¯’çå¿SH´¹¥|˜ÀÙš,‰ûé—)€!}.ë‡)ÚVL,µî§€™ŒëŸ=ëÀV{½s_kƒà„§’ì°넟ª¡bGóp2>12ö d: Á*H(«PðY @ºBð Ö2 ÃS­•m ÃOÕP±ãÊþŽ‚;‚ó  Î+œ(n à¢BµŒÂðTkeÛ†ÂðÓ4v  <œ‡‚±Œ‚?‚‰  &*Œ(n `’BµŒÂðTkeÛ†ÂðÓ4~  <œ…B™H„p„2Ò$­`’`\ ×Y–Ϻ^ýpRbÃZûpQ×#W.6ŸU8ŒOjÂÑ45 AÌBP£0©Iz‚˜ƒIŒASÆ„ g`#NÕŒG0ªùÄø‹júE5ü¢ž}QŒ¾(&_ƒ/Œ¹/{nL½t²p¯†ž?šy¬¥ò¼…e-m»NM<ÖõÒ‡›’’ãn¸¨ëÝùjÉÌçâñô°Ó³îxÔEY¼õ²x¶í:=è¢*~¸©ÃLN¹¸ÏÎWûÓҵøä|èµ§Ø2‹‹£âo_Õzý’s¹Jt ÔéÛ¦ßÒܾ~¼õÍã%B”²=!ŸœÉ#£R.T>.'5.!×[¡ÈÊ-©®©8fɘLìk7‘™[\Á“·ÚǸ8¹õÍSÞžA»´éYh۳ѾqPqÈóM¹´å/tÌ>¿âü*æå!§ÆÜŸŒKÏ‘Ç.©D°O“gƒþ)Vaÿ~nx{óuñþÜ-ý¥;º=‘l½¢×KsøP¥2ÆIÚ©>îL6í!Q$º^#]Šœš-ÒƒÃZG÷m¬ËMö¤}¹4Ù4©”_®ß´³<‡šd»çò²FÚçé„'Ô¬€³ í'½‰ ¥€¬­¶!H?Át?=JŽ,¼ïù· ½ÑÙ»Q U猬Ý&…«cgã"µ¤ë˜Û^½É¨$ŠC¶¦ÿâa?AD1ôzcdQ¡æ +Ôkö¨®Î´ü¹vQaCà¯Ø ¬B—œÀœ$:¶£ýðYrPY08Kb U@ì¡Ê˜Y\73Pa^2fÌ[F”yMxwƯÝЮBÿƒö°Ëz,½Èöpò¸VéÚ_©=~+?Y®ýqík<ÛÙŠö¨B?ÃlUsd£z#ÕÙ¨ÎÈF5F6£/0‹¶À¬ºQ4¢è Du£Â$.T¢!D? ¨vÀ¨º£hŒª0¨VÀ :½jôªЋ6@/º½¸C ¡ðâ8‡‹zÖÃ=a¯,éiUòŒ„‰W£¢Ý(•89€ ®˜ˆÑÂJõm’ ý8îéûAöàYQ¾ &ÝiQK„¡2*ƒjÏ "A7hZaeúbË‹Ò #zöƒèMx1DÓ^W¢V¢¿Ü‘~eú•éÿ˜éýª¡"[ÈnB¢WýN\‡¤¬é¡Ð—h>ICRÖÊCíÀfé`Hʺ;ˆ!ˆ¦} )öôÝ¡iÚ˜9ÂXnwYmçïD]ëQm'c¹=$µ?óumµŒåör.r;¨ápFm'ãÓŸqÒL/Yë;ÇP‰uS޼ÄbRŠs‰é=ë'z¥ÊŸ>þ$Ñ¥´¾}ÛMb\×~ßX»Ó®ÞwWÎõ…ýñÂ|A°­DûëaïýS)ly?B ‘0‹1ÙærºŽaÖëÿ‡‹Ãö›†?þ±áû~#Ë­µ£¶ÒÜ*x3õöηþû!‘i%endstream endobj 7 0 obj 1511 endobj 5 0 obj <> /Contents 6 0 R >> endobj 3 0 obj << /Type /Pages /Kids [ 5 0 R ] /Count 1 >> endobj 1 0 obj <> endobj 4 0 obj <> endobj 11 0 obj <> endobj 18 0 obj <> endobj 19 0 obj <> endobj 13 0 obj <> endobj 12 0 obj <>stream xœ’mL[UÇÏ¥ :dÝ‹v):Ú“l*ŒB†KŒeó…—4««¤Á!S³e··§å¸Û{¯÷ÜEHÖ ,`–Ug3F q$šM·8§Ù’%à²}Y¢˜øòÁ˜éý²œ[®¼t˜øÅøíœç÷œÿÿy9(,Ç=R¿ÏßöJCÕG¤: ñ"¬øNý1NßV —ÛŒg©åáå]ëÊAðôú º»¼¿üÓ–|áfýþFýÞ¦U¡4wžû¢T´¶´UVUye%©âX»k}> 'á_6!‚c|¸Ø{£ûVÏüáo»†]Öeêè“ÔxO¿ ¥ã|ó~»£3«7eÙ¡lÑTÉ7MM––ð'º?ÆÉ endstream endobj 20 0 obj 917 endobj 16 0 obj <> endobj 15 0 obj <>stream xœRmLSW¾·µ77“ÕŽhý '‹YT*sCœQÑZÁD*à¢ý¸m¯¹m¯½·Œ®ÊñNE0ˆ|Z†Â‚#.~Eqn:%:&Ä™ép‰þØH¶sµ.Ùi5°ý]Ο÷¼Ï{žç}ßçÄA’¤Ú¶j}Öò˜d†ËcDÖl|w‰c·{˜#M#¥é2i†<¨ v>yžª˜Aè럾.EGG§+F>‹xSús’4òÆKºd+y†ükVfFö옘Ø.ÞëfmvÌOLL&/x…-#°6'xy çâŒSŒ†¢V–c@zær}Ê 0+‰3Z,¬èÜM÷àîÌ@Ïš§ÀÌV—p//ÀìrZX‘u9…8$#xÆÌ9Àä›>Äžq;XAÀ1``s"c¢ °N3籄äqÞêrŠ€w»0îÀ¦Jw ¢`v³¼°bºV÷²GÑnCº‹aà²âJ‹Ëì M3†‰FÖ)‘ÉC:&XXçŒ^¬‹©x7nÁ#°NÛ¸z,p36£ÛÂ1B˜7´•ñùÀ¿¦6ò<ç ¿u…«ÆôYQ`8k\ë0y`0âgzÁØ<œÑ RD#&ø6nÖÿ³ ˆ‰N³‹±º‘åA¬!´D:¡#Vb‘I¬&R ’ˆÀÿ„˜@d7Èùd€üUö¶ì’|’<^ž"×£6¥t$CŸ=)-ž¬êD)RcTPþ¢QñÕN+T=Hv¬÷Î/Óº:í›÷”ìØçÓ$ÿÀà})¢¬ÚV«ïe]\¸4…ÏÊŽVÍ«þ^¡”ö‹ƒRì ‡ÑÕGréú=Ê_‹O,SÃvïWÛ[¸¦Ú 8.b²t9il„saNÝÆÏí[Ïåß„`Ïç¿in­ë¨»B'PŽÄu[V@Z·åâÐÍÆ{í_k:¯uµvCúÆ){ÆX\Z¤ÁSŒIöË¥·¤/£â`¢q}RîGÛ‚2ø”.EžÜ;5x%úüvDŸáå/Ù;Øöܺµ.X5pfÓ¢ôOVó4Œ.Ó¦ƒ´vK×ý«õ·Zº4w®tÞ‚tX%÷¡ycJ×QATY}å…òÓ°EýdáAbA‚)yCtŽÞ¤à"˜Ù´î”õ${Öw¢8:І<‘M—eK†ôâÜ‹ý‡Öjú¢š¸ù#¤ïžÛ´lWiq‰O£DmØš”Ûhz)QØ•÷©Úžª®†ú3P}VÀš’Úž)Þƒ…~\ ¹¾¤üø)+©ÉŠ^jÎ‹ÍØ¡§ÒfÅ#J‰ašüÀÞ@¤ê2Jw÷;t¼)ïv#Ù>uÃC… (Øí/œ¶ænOÕÒªeõƬŒ„#Ü0ÊN} ékí¢¥{¾;´±OнMBüÇdx¬xª ÍT$P\p¦BÚÃ]jñ ªdWi!Ü¥ÞØáø6ÐVv°&º®Ÿ+Þ‹EÕžUueþr…fH’+ãE¹ñ¢FGITƒÙ¨WkBsŸ9ðÍ3Çá’g+$ºNçþí§Û”b“Ô@©}5ôÚðÄ¡òˆ‚øF²ˆ endstream endobj 21 0 obj 1298 endobj 9 0 obj <> endobj 8 0 obj <>stream xœ’{LWÆgXw•×ðRw¯MjPt ø~,•°À ‹ŠšewFwf–™Y–‡BÕZ!­V‚}ˆPªˆò´«µ¥*$bk#Ö†Dã#4jb¬mFmïà%igÁh“þ×?&¹sg¾ï;ç IŒó#H’ŒL6g­]“ka9Fš“,8íi²ÕÉÚ|,V™B*Sý”iœo¼(}±N;05LTôDÃTíýáIÁ ž¬< SÛCv½äß1¹ÙkgÆÆÎN\e"[X$ƒø… ‚‚2𒀕ŒÄò`†z(aœ‚‹cxÙrÈE p°N˜s“Mi) æm§Õngy*ªÔì.P³kcx‰™ ‚œc/À&ðvVf^2‚·%`’‹±±V'`JmŒËf#r¬$©gÀJ P´ò2c²XÞætÛ}öê½Càeà•s*Q¥Ì‚$K6‘uÉ@u4¯LË(YeŸ¯ÄªµÒ.ØÜ¾n^1ÙÊò™RÙçSÀ;+¹œÖ2ÕW•r‰ìh·Äò…¯Ýg‘)´Šv'#êú¦òº?𯮭.—³lô[a´ê•?+KŒÓaÌd¹·²ÎʃLa!0 ÆÎº90¶çÿò×[û{$b|Òüqñsç%$DIDÁDJ„4NLPbá!šÉòyÏo™ß·~irÐÞIJõÖ6…ô¢í$Dã i8¼˜ÆÑÅéâ"3™³ žNáˆ%ˆDÓÔgŠù3{À詪ÞÎé/¡‰C×Дó®ÇG鞦’ E8z³ÉP)É[EH9ÊŽôõ5Ýo24õÕÕµAJµ„J;Ò’¿(Ý=Ðrð¤P”ßéÓ>Ð)ÁÃñÚ‘`]ÎÖª¥•LJ'¶‡À?êæ.ÒþúÝU‚é§g¼gà ì¬:înf;r›r!…ý-¾ºÁqÁløÐmÊY “¨˜[«¿>TAaï¡€ËboæOd¡ï¾Yïk©-™LÏ«­}—¾ÑïÝ áçõÔ“!:u ¤ ž¥.tœúNÚ¶Í𾮂ËÎ2¨‰¶µ‡¶’ð©Ý^N[ ¥xãclN„8†ÂQ—~?íý´õ+ýãë·PDñšaþ-N_ÃÓ'\KwoÙé0”'æa‹¼js,Ï@Šóõ^¾€ªzP¸¡ûÙ1o÷Ë! G4’ûÂÑ£fÝ’Ú²°ÖÕî«÷"£Òç6Ubª¼FŽlùèPíaHøì}÷®š5; 8ldS¹…+MQ>¤QJî“èŠÖ(óQ-ê˜4yÛRu\3uhZüðö¹!x=êaÊ5ãš|m“ž/®„Ü/ª"½ßŸjé…ÔÅ΂ԸÌ8lÆYÎÉqOIŠÆß·¯24‚úÐäDG„ÞAaè1}ºæðî/+{¤#ïÁUÔܼäÌŠŠývêköìª+?"wVÔCªPr³yçC(Ñh<šqÅs2ûkÃÁýÚП;»Îþ}3ýbÒ¢L›1CßTyªÿXCŒêë(²,ËÊôË0:þH™×H*ëQ-ªCÊ»Z“ndùÈ á -ªÖàYZ¦;fi¯êFÆ?¢Q'j_‚Ûµc¹#’DƒÏ5h½ÒO£u]ˆÔâ.ŽÀç®T·}pÒõ£³k5L§’Ò—½SRU×Q¢—¼åŸpbEis~ï–[hÚ®?йÉdx l³«î­ÃÔ$O£’Ûˆòu-P`@ËþÀ@‚øQц‡ endstream endobj 22 0 obj 1328 endobj 14 0 obj <> endobj 17 0 obj <> endobj 10 0 obj <> endobj 2 0 obj <>endobj xref 0 23 0000000000 65535 f 0000001826 00000 n 0000010153 00000 n 0000001767 00000 n 0000001874 00000 n 0000001616 00000 n 0000000015 00000 n 0000001596 00000 n 0000005360 00000 n 0000005077 00000 n 0000009033 00000 n 0000001943 00000 n 0000002381 00000 n 0000002091 00000 n 0000006794 00000 n 0000003672 00000 n 0000003404 00000 n 0000007908 00000 n 0000001996 00000 n 0000002037 00000 n 0000003384 00000 n 0000005056 00000 n 0000006773 00000 n trailer << /Size 23 /Root 1 0 R /Info 2 0 R >> startxref 10282 %%EOF hypre-2.33.0/src/docs/usr-manual/figSStructStenc0.svg000066400000000000000000000575761477326011500224560ustar00rootroot00000000000000 image/svg+xml0 1 2 3 4 5 6 7 8 (0,0); (0,-1); (0,1);(0,0);(0,1); (-1,0); (0,0); (-1,1); (0,1); stencil entries offsets hypre-2.33.0/src/docs/usr-manual/figSStructStenc1.pdf000066400000000000000000000200361477326011500224060ustar00rootroot00000000000000%PDF-1.3 %Çì¢ 6 0 obj <> stream xœ­XËŽ5Ý߯èe@¤)¿í-BbG˜evADD™E`Áïsêe»ï$L¤‰F3wÊ]®Ç©Se÷ýtÐâû|÷xûtûñM>Þÿs ǯøý€ß¿n©œcŒ~´’Ï~<ÞBníŒ&~¼ý~Ët6VÀ×ètN™UZg=bª bêg‚eQ°-Јg^&Ü·¸Éª>­¬=÷‘`) ÄǹÐJ‡Y‰¤ŠÝ¬ëb¤p,¶À*‰ŽotÖØŽù7§ãÍ/·¢$Ö“E`rnìNò1ÃSÈ5ës‘‘¹ÇJd}R× Û`-Îà8–B‡l¯j¾Úc±Ö±š÷ÇØuゥÜE#PþCz³ø5‚Æ™C*ÕSeÆÙ6ŽJä*þ[k!ä úIüCNj›lQ´jvY¢é(†Éê¯T³WIì—`þj{Yµ«F“Ý»¤ ôú,ÓÅeµ§uõ.±ÏÅb w¹ç¢¹¶á¹(mx.ŠUî]±l#oH·m·Ö¡ ²Ý!«¶ËÔUv}*ªoOƒÆb¾hTÕ¶XhdÅb¥Þ$WÏ…ºÖÑs¥Ö5wÂZä‚=U8ŽÔwÇ™ZÞª`’ÕÈu½†n+÷ÝO™–5ç‡ÇYîòp~Yž“†Ãâ§â´ø«(.~+Ê‹ÿZïŽÕ9o~?‹J¾´£Ê«ä¡¸{¥D(Ö,t«DW! %Kjú!ôÓA’'¹…¼!• ÙÕ¥Èü4ö­1t6ˆ¬qD÷]%mÍv“©y£¨>ÍÆ{4–'E~ÅA}\šL+µòÐJ®<• jž£D-\5º LuØn­ÕYÀ.úKŽ*»¾|ÙSB,¤Ñ{4œòŠ•i®Nõ®±{®ÔÕ›caôXQ§‰¢Q}bl­0kà²×Èõ½†bkVØ´ÊÕ´bF¹Ç1ÀGjü‰HRà¼â‰ÔBJØñÎÏ5X‰˜rwVøŸÍ ØÍf¦–0cF4º"ƒput™‡€ò­Ð¸ð±AÌÖBíÂåB{GJ¶W;!vé”äY#ñ4ëkqäK”ù.‹Ô.s erY0Èѳ`„²Í%E/Çëu#GÇv½‰W.mrTù:¾—=eª{SÏH„å3N뙇õÈÌÓzÈP°þšI÷Mü¬7 ]ë\CÞ¥6G«Óœ´UÕýôÙ×…s£wY8§$ÇÅ8EÀù¨è,¶*z‹ËŠî⺢¿zaïíälw ¹Ö¢}JªÛM ûm±o’êÊöm¥JóõPý¢ýÑŸõ®‰^T/¾uÔ»ï9.í©^?ÞiïÞ}¿x÷íöÌw_T× ÃûMÌE3ç[OÄHÜ›s“wíÝ@—Øþ浘ÿYâ¦*›éøåö ñÈ[œ}¼{<~zÀÛDÜâZ9þÄ+MO5‡¢wà°Kã‰Éýðx{õöÕwnù, $h<üq{õúéRà%d›ºð/$ŒÔ¹òDåíwOí¼ý›×^':GLíxÍÑõÉ7 „¾>RÎPSDñu¾Ç‹O~M¨_Žãç‡ã7¼v¿G‡t´oÓ ‰[˜õÁ8ÆŽÃ~ÔtÈ4à®à¶M|¢ÂìÀŠ|á#¿é˜k¶£óÀÀóÀ©Ø,ÐLA…}°Ï °/¥ãô…}ï¿Ì¾ta_Áˆ,Æ>7<“TýñsµºÇ#ð¤üÒô¾ü7p@QGŒ„Æp L¿ÎÉaÀ>÷‘;|¼» <˜>#cflÄ{®‚GÇÙ88IÞQûÑñ<Áˆ-€¼‡p¢R‡º,Ðhèšqì1½ Ï .ƒñ”0Ÿ#R ,0"µO0"¯ç…žwFg¡ G:-4€FI0p/qC# Œô4&à>Óq ê[ÀP¤H|%fD-ó¥[RÔ4¼[¦xÞº%ñ­ãÒ- 夭["4ÊÖ-ê¸tKÀ+AÚº¨+ [Pߢ[pcmŠGz¹LU~•1<°™¿ˆÝ¦|À2©¤Ó1c½áVæÓ#œ…¿Gà+‚à[À£—f;ø]ñܧ¦9O(ÜjtzDÎg¶é±‚z1RMh}$?Ó=j-…,ã€~=ÉûEèzt ¦2x‡Àp4(p¿H5A†×8é.rÑÂ34ƒ°ƒ-¦ÄC# f‡xt¶ ·=¢Á·CvŒ®ä(Ï‘#'¹ F.µƒ¸YâyŒ&éÚ,QßÍ.Ò,$ïN(uÄXåf‰\KáøÐfF°Ü,Ï‹ƒmJú9žcê³°F:­ ^F »ÕÔ¯ãEå2_xÁßoƒ[΋šô c$^xѸ/j•fp^àrSeçEÅi/*xR&/$¢oÁ ùN™¡hÏÒB¯ô Y ™(r>Ÿ`€á È8œÛCv\ЛL=CC}–‰Æ%¨ÃÆ•ãÑÿþùæé…endstream endobj 7 0 obj 1922 endobj 5 0 obj <> /Contents 6 0 R >> endobj 3 0 obj << /Type /Pages /Kids [ 5 0 R ] /Count 1 >> endobj 1 0 obj <> endobj 4 0 obj <> endobj 14 0 obj <> endobj 15 0 obj <> endobj 12 0 obj <> endobj 11 0 obj <>stream xœ’kLW†gXw‘ÛpSwmjPt (ÞK%,¸ÀR•¢fمѹ,;³\ªÖ 9hµì ¡V媫µ¡*4¢µkC¢ñmb¬mFmÎà!igÁh“þëIΜçœ÷ýÞó}$1Á‡ I2"%%/;93ÆÂòŒ47Eäì鲕cm^£L%•i>Êt .À7_”¿X«N˜šü&+z¢išö~ðH@‚§(OÇÕv“dùwt^ΚY11sREg…‹-*–A\RR(¬/ XÉHl‘fª‹R†<#ÈFË0@.f€ƒå`ÎK1¥§‚èdÎj·³Hs©Ôì.Tk&ÖÆ3 8DàÆ€Mì¬ÌŠ‚dɰÉÉØX+˜rãô‚9ÀɸxV’Ô5`%Pä² 2c²XÁƹí^{uß! 2pºD•ó*Q¥Ì¢$K6ë”êh^™6^£\l•½¾«b :Ô“vÑæö¦yÅd++H@fÊe¯O!ì¬ä䬪¯*åt±c%¸%V(zí>¸˜"«ËÎ1Ò˜®÷U^çÿJmu:¹Š±»âØ©Wþ¬,1œÃ˜Åò…n 䈼UYb0LÆÎºy0Þçÿò×]û}$bblܼùñ ‰ DL„¡M„áDILRG…˜@pÄI2€¬#/ù¼éÓèó½&í Pj·¶„´‘ð©ÝYN[ ¥dÃzcL&N€8šÂ‘Wâÿ8íù¬í¤þñÛ(¢8 Í4ÿ«¯èãMÎ å»6ïp*ò±E^µ)F` !Å—ñ\¹€jzQ˜¡çÙQO¤TØ<ÞLî Cé–ÔWì‡=°¡~o£•ˆX·©S•urDëÇ_Ö„ÔñÏ?pï¬Û^·Ý€CG7VZøòTéUA¥ô>‰ (²åÒ.“.o] )èmÛ–v…ô mÍ$D j8²˜ÆQ%®Efgµ! ¬YÉkFͺÖIÈ߯uŸ¿?AüÛÌ…¬ endstream endobj 16 0 obj 1325 endobj 9 0 obj <> endobj 8 0 obj <>stream xœ’]LUÇï°tÙ"ŶºÍ¢²œ¤U¡lI±‰q±~TuÛ•lÖ’ú‘6½»\ç΋ t{Y Cœ¶nJL¨K¢©ÚF­Ú&M@Ó¾4Q|PŸŒÚD4w–ñÁYÐbâ›oçžÿ¹ÿß9÷\•– Aî>¸¿%>Pˆ¤0Ý2D™HÅüNë^Áº¯ÄªvÙÙ3+#+»7T£ð™›,:½2½µ l±~¿ÓºµyÍ('œ>+AµíÑÃuõõfUËè$Ùa@c0„XþV S’Tà'èIJª¥°b4À³ƒÑ!Ad ‘ö§Â¡f¨Ý'‹ñ8Q UwÔH:æ´a"a…â:H¨:ÈkT%N ¢*´öQjX"¢ ¸[ÂZQ€†õ¡Ô‰PHê¢bà8*E’Óñ"ÞÉ'TÅMW=å(ŽUD¥•t¢à#-­k=¢QäRâÈ &œÊ¸*¥‹ÓÜÖ ‘( Üm91 qB5YÌ8\ÇJÓÉj iJ”ä:=:NŠz\ÆtÕ·ø*ëóÁ¿¦5MάÞUW«nó‰A±œhh#©XšBTM‰ ´©AC'Ó²¨ÃÚžÿ[°¾¶ÿ·H„{wcm]`B[ÐV´•£M¨•9_•¢úB(ZUæc•ÖñáÙBÙ¬À–ùµeÿ©ðˆ×n´v·Ýoû–öÜúà‚9w¡æ×›_ó&ÆwxøC‘Ÿwú‡UïçïyÔ¾G²ƒÑûkp(FŽ2OûËŸ|ÿÇeþâåk–Þ›ûywf¼yáãm|Þ|ÕýBçg§ÆÏL¾]“›ÌðñíÖ©q37Å&ªÆ³cÇY–8áßÛۘɲ¡ì@¶ª·ìjnfÔìg]UìõìàHÆöÿ9àëOtîöTò ÕyÝpñ=v³7ù[ÿ"û…ñŠs|ÇEîš_ž¿ôåõ×LŸ½Í..$n%<ð {‚=>ýäÙÖ7™òBè~ì†ëœý´—oæèÓ¥¸0ûÕô"»É®-õ]ë¹Þ»pôÛîß»Mf{ÙwûáçA9Û:c¶×ûÝ¥‹WØÏûúÜKJºKë99ðVßì›bƒL3´ÃE?´(ðó|Òk«î¾ð®¹+»òVKžÉ»gÊ¿¹cfª¢¡¿ê×ŸŽ endstream endobj 17 0 obj 877 endobj 10 0 obj <> endobj 13 0 obj <> endobj 2 0 obj <>endobj xref 0 18 0000000000 65535 f 0000002246 00000 n 0000007655 00000 n 0000002187 00000 n 0000002294 00000 n 0000002027 00000 n 0000000015 00000 n 0000002007 00000 n 0000004439 00000 n 0000004161 00000 n 0000005421 00000 n 0000002729 00000 n 0000002444 00000 n 0000006534 00000 n 0000002371 00000 n 0000002401 00000 n 0000004140 00000 n 0000005401 00000 n trailer << /Size 18 /Root 1 0 R /Info 2 0 R >> startxref 7784 %%EOF hypre-2.33.0/src/docs/usr-manual/figSStructStenc1.svg000066400000000000000000000426671477326011500224520ustar00rootroot00000000000000 image/svg+xml(-1,1)(-1,0)(0,-1) 0 1 2 3 4 5 6 7 8 hypre-2.33.0/src/docs/usr-manual/figSquareHole.pdf000066400000000000000000000262511477326011500217760ustar00rootroot00000000000000%PDF-1.4 %âãÏÓ 4 0 obj <> endobj xref 4 14 0000000016 00000 n 0000000718 00000 n 0000000777 00000 n 0000000999 00000 n 0000001028 00000 n 0000002044 00000 n 0000003003 00000 n 0000003900 00000 n 0000004699 00000 n 0000005444 00000 n 0000006259 00000 n 0000006996 00000 n 0000007750 00000 n 0000000576 00000 n trailer <]>> startxref 0 %%EOF 17 0 obj<>stream xÚb``àf``ªfé&LÀÂÀÄã†bY.þüE7 ´…6ê,‹230hKiF ®0æT endstream endobj 5 0 obj<> endobj 6 0 obj<>/Type/Page>> endobj 7 0 obj<> endobj 8 0 obj<>stream H‰”VQŽä8ýÏ)|Ö`c›kìFS£•ª?fæþÒ>\IìÄ™•V­îêJxÌωCôŸýóÛ×ösûëï~üÞ8üÀï?›?Ï1Æ~}ß^[&ÑP¬’F _Ç®ýã½YÆ›ñõµqŠJ©†’…Jc@n&œk¢zÁÃX%h@0âÇ8-D¥\¼¾¶¤µ9Ë8üÊìç°˜A‰LƒiÜ(&ˆH?bǰqœMi† £áIãî§E lRfÄçýñU¤–ódÜ*U Rb¤˜&а:Ÿ´èvØ'攤¿ùZmއÉ3êæýÑ—äX)[høPk^$öÊr0Î@5/Ô­g„¤À%òtˆi¤ŒÆÌQµV¤¸e£$”H¤ÂAŒ™,;lÁˆ¤‹dŒ92i©MÈ ClÃê£ÆµKzõk±ØßÿäîøÉ ÂFGT¤=%⢛P‹™˜ªJ¹{²ÆDS£Ô³-W/A¨­ãR¥Í‰¼môíPÓÙÈ»fNÊ5‡†nˆ±N­~êü6 öνHÀEQe“ó®¥O/3bÜ1)¢Ì; ÊîBë§¥b"æ.¤; p e®ù%g„ £XöŒ­D€•j®$íƒÉ•\3´tÊû€Y˜€Cf(+#e=÷h#«µ¯ÊûéIï%1™^I^KL®Œ{Þ7ÇÀ5²(Q E›Â’Xto…ÅÓ‘“WL$÷vi¶þù~`òìûì„ð’õ³Žª‰X·~?0y#û$<53Ež"IûéÞL¯EÖû ©q×ÑÊòZšíÒRÏòäëÂŒ_Tp­Ð¿¸:¸´üi•ã0+ `¹d‚à%3Úqª];#ø•ɯGX±?§¥>¢´ku${ey¤ÚK’}Ò—¬·Æ(îÊä#öÅ\Z­«‘SiCG+‰CÐð¨WÖÅÕ©Ù+K?^ñt „Z­±²x:0ñ\¡ÞœM§4ŽV\™€S¤]}p7Ê6ZeòjCU¸  õ}öÅ“fereÁÕ’«„Ï å˜j+˲müa=™§)NÇ„±]Œö©Öu›z\Ÿ`w£ë>Õ§b´ HS™®×qÀÛŸV¡)Âÿ»=í»ÐýÆûÃê4mAË®ÒGµy3‰%¥yœv…e{x„­‹Ðè ö°šÜÖ—ý2Çÿ%@ŽF±O´Åj]iкҬÛÇ£³+õJó¨òuÅ»Ýæk Ã*×LóÞp®Žá_Spr- endstream endobj 9 0 obj<>stream H‰tWK–1Üû}ž@BÊʹÿ6§{¼râ§*~Eá¹®&L¢—Èèþù~ýy9hÎ~Iʸþ¾˜ “ÖK¦ ™àÕ6‹Ð7ÔF=¥“N¹ØP3`“ (¹õAµ¶¿ú!â¡å æ÷‹ÏÿD*•Ôbþ”‹ D¸Wjíbn…JÅ+á6Hù2Fu¥'Z:5nyQRY”¥TbvX¢XF0Q¥¸ÖPÂUàZwÜoê€!ª ohYS‡)`ÓðMm«‰™:pV”)ôÚ©;¬#'ëDÔˆ–¨W¸Œ‘Ól¨@W1èOí‚ +E;fð eý|o´«!­zoò fʤt]SÊÜ«ÿ`µyIµà¼)lñùÞ¸'cÒ¢0~ NÄ"î{ã\±F \¯F<:‘ªQç{ãv[ÁwàÒ:©F}¥€&Ç~dÞÀt8 2IbÍfiÝ¡2mÀZoyJãò³ž}¶µiŸÒuÀªB°þAÌ—†UCŠw'3uàP.˜Ss®iHÿž\ær n®‚šäj±h·P2õ‚aiÑTî.‚Wû¼5™h2ìž5vDhŽg¨ÿòÏ´«#]B¹¾IS•ÝÛ–¹§èŽúâr¼¾;y/wæ^ó†T.ƒ&JxÐgp·™dî¥-üßՇÉ¡ÜÞ•¹Ã&1|íšwy:rÇZ<)sÇCkùãýØAdd—"ý©a ìR’K‡ÀnÂ'UúrÛ–yiÆïȽX8/ÄSÅ×O/Ó0ºøýªEåwr‡FìQ¶t¹›§¯IŸ¼˜˜¶ZÙ°½p¶fk]é¿UÒ¿Èw?gù|gµ¿:œµ–&ºzô8‘â7EŒ™,Vsâ⣠4Òø¹…­„¿N|¨.Ÿ°ã-°ËîÒD´³ÞNØñn°-ZJhÍÌýÁï¬F¼]¾ó …Ú:ÌPà½Åmgåx Œ——*«)ù¬ÔŽÛ㥜Ö`in¾.°õa;G§ÃÆaÍðÚÁñîïÁìOWCxú:¡÷PTlN¶úóÑȰ=XJ(`~hÞ²Žè~!ާ¦ ý–Zi¶u3’ýžŒü ±Ý….uÖ×ï›E!ùÑá—Ö^Ôîyý¿ zÛåý÷üqqrR§ßÛÈòß§Ÿý×?;ãq endstream endobj 10 0 obj<>stream H‰ŒWKrì0Üû:%@èsŽ¹Ã¬âõ»þkdOÊ–ä$«ÉP€ššIïM82E­aß$ÅB©…Šk5|m¢±‘jà(…„ayo\c"ËAŠ%ó¸Øq ’µ{|˜Za‰õ!Žgj jâq9 Y“JRz˜4‹”¡q¥æ¯5ÊÈ#ÖH:Ê’²£”h™b;^ËÀdZeŠ@¾»…©JȬpÊþZߊzÕ_;«A®8©P-Ç‚œ=»Â«2Š^N¹ø»Ìœ(§Àêtœ¹4ʈÔ«¥ã,•²c‚K±‡ò¦bò‘º&4CްT31ƒrxM0ƒ¦‰¶îíq(À%åúi‚ˆD%Ñ ´lž`X,±Ç?4ol·ˆ00ЩgbM¨J0YnB”š#L­wêXP8%†‘‘³V(ƒ¦„ÌâQÆÑG•#jdGÄš12å ·žTôsb¡™{Œ-zàq`èX¬#UªÎãúâ´só ÂGœ+‚±ÑF4ö¡ò&äÚ™8Z… °1Ëh—*¦&ÆòDJÁ®¡]ÒÔ(v2'šÞS®%Ì‘¦ålMò1KÅ{œœ}+µP­H” èí3yŸ¿cJî¥ìS¹ëÍQFv –£ËÀ’”EqÀ1}¦½ ¨ É1(7ï|]·K´Ú3JmÏœÌN3KK‘Eㆌ=u­TÁ4GÇ(ùr“á}t ëðØW°¹”aUûÖÜÙY“1òº:«çƃ¶/– z‹QlÁ¾š<(Éâ4.âVªp?'ëã±8V³âMçkAçLÞ|½ÞJÿ¶$˜ Ëj}N—þñµ½˾5W¯«ÃͰ)ÝcT€ß“@"•ÊÍc0­tå5µÖO[Œ×4×ï~0AÖ½ÞÁ´—צæçàJÀȽ¤»eÿ޹ºÜMû”·;]؃njæ“7–ÊðØiO#<¸aÖqSÃÿ=Íw‡²`ØÇ´GM™øC†ó+„"Ü}l“ö¼rýÇDKBƒÓaÚRóÝqU©wf~Lt>QW§K¦{êõk+HÏü„i~m)£·ß1çþÿOLÛþ 0ÒšpE endstream endobj 11 0 obj<>stream H‰ŒVK²ä Û¿Spþðñ9æ“ûoǘô48©z¬º£R„[NJ~… P*€§ë‡$7MÝ~Šöô÷ÇXš '¬\¡’– b€b½9dœÖ$ì¢À4I»¢´“ˆ2TL¤ˆ 2H…*PIÌÔ¡•É ˜±rÎ;e®‡î  f„‰ºè0„ÒxðW¡ˆ]?*v:gG®‡òàá°L=Û¡©Üo¬”]Aõm7/Ï»YV²['¨5ꇥÁT 2@óÊ7àz¨ºßžŠa­ß•fóÕîÀs©ˆªPl‰*+à]Ï»êƒÕ­ÀJ¦FôeÿÔ¼ôÖ£¾¡ÿl%¯¾šsnf$ums[4ˆ8ÜúúÏ©öRÉç]eß;ŽKŤ(ÙoÌzÄš%t³vìî.D»Á¥¹îçë¡ê ÎÖäv홬éq°Ëp”oÖŽû ê3rAúBó0;o{M\îx ر­]ÜIµéH$«ö‹‰wM(,Ÿ‰Ø±­ >ÔZ‰Í–X½yPµsЖ°ô:*xúÚ±c_Aý=û+[p| |}>¶ó’úÏÑðyMÑï~“º±_í¼!Û·UåR!ër:”kùΗ;öÔ'Kxt‘ølýV¡úïZìÜ×®>YæÇ¦7±úþ¿EN¤þþZäìÜ×®>§v³äµL-‚×>&.~Fk°c_Aý=Å=“ˆ;®u?ûy™Ï©‚½”W­ˆýæçu~Õ1 ²ä¦!µË0ßã‰Ø© >¿lª€å5 Z®:©ÏŸµ"vl+¨;‹M Ëì);«xÄ®U±c_AÝYV<мcd|ñ –úY;9bǾ‚úü¶²ÿUGêtÏLäÚ×ZŸíì¢sû°nÀ:²fÛÙ¿ûÕNP½Ï°Ž›´YAÐÛr:ëD‰Ø›ŸôO€Lk¡ endstream endobj 12 0 obj<>stream H‰Œ–Aš#!…÷} OÀ'( ç˜kLÝ;¨•D)3íª»^^~^P)CøóƒI#Ä¥—pý Q$s"þþ4W!ИA¸¹˜ä0Åþ·»œf®l bce .§]ú`a6WÄî6W‘îGŠ]é.§çrôÁÒ LA!RgIê=A̽GÝå´ã\ŽÞ]jÕ“IT›‹bŒ†FÑ…ùù8£6W"Ó”ƒrã¤Èd@¬øZ“U1WÊ¡hŽ·Çi×B½;ˆ ŠÉQ{Ÿ ©†’ ŠÜ¿Úim—ÔÔÈS ']ö—z¤ÑÓa~Þסšm55°mS±54Û¡¥Ž“Nºì¹Ýƒª€ÙN‡2ìšì–ò^;´ýWÎ õÒ.Ý×y}«r\1Mh9,e¤€Jå2 ûÎq‰jy·Äi#**ñ½É½¶IC•4Òħþ§DòîÌ*}Öq6yíz°¿Ô; ~’ê¨Þav¢í{ˆ y¸œ¶¯ˆíÓlh*D9gµó´„š…ëÁÝ×zÛä5sÙ¶Ü¢ö'Èk§Í}–hWë9çí‹íý£˜m[ —×~}læ|µí&Råjj®L}ØDº)«òqL§ÒI׃»¯u¶¿':«v’[ì8°´1a/}öÚ¾ž -ŸåÅ\*¤t̺#¼§èü|=¨ûJÿg¼ž¦‰ï¤}JQÛÿ©]Xì>”—û„׎÷ª£i ävË…ÚMÈãÍô¹*yí ê~…wS©ÚfQ¿G¦^0g[ ¼Ü½¶G=¢;ö=“#$‹žm¿å1“-ºÜw½ö…õÌîèÝ¥vw"kC±[_^¬/íê|_ßjÕ¾ žáWø0Uk·õJ²µ¿ß|JB˜öæü¼GøÈáŸx›jI endstream endobj 13 0 obj<>stream H‰ŒVË•#! ¼; "ÐCŠcÓØÎÿºBMï4ÞøäqM¹(ô%ªµå€- $ ?>Ts”E.%\*Q@j@Á9ß,‡)k«5c×¢~kåŒ(WÈv"+«‰² Cå›å°ƒÖÆý¬~k©ki’˜?eeýç@(öi,‡´6îgucQmPkÐ[ D쬄v"±{Ëa­Õ½S7V” ¨XIØ: ‹åŠ[îŒå°ƒÖêÞ©wJT–úâÔ ™û£J7„‘Ã×÷½ÆêÚ«ÚI%“JSꦱ%MQ™®æ±ƒÔbÚ‰)— II#D“*-ÍÙóØ^j±î´”8v%½‚¤ÎbEr™êÓc­Õ»S7–¦ªuW¶sgáÔƒ;h­îº±4P¤Ï†ŤD ¦iÌxì µšŸÅïó(õÚÅÒ'ƒ‘Riš ¬Ça?ßÞ²ÓfJ7æDÐêûbܬ §‹ ì µzvêÃ7Ù,&fhüʲ¬"ß¹{°ƒÖÆý¬~WžÖ’Î<Œhš?õ‰)Úç»>ì µºwêwÛè\` ¢³#¾:)¾X3vÐZÝ;õ{0èu ´Ô_C1ÇÿrØAkuïÔ;«éHÀšCÓ±­S3a¿NQ€ã.]ѵӋŸDOÀµ¨Ž-©q’Àúƶ—±% \ RMc7ÌXßFZ4æ kÑÞ+iD…¢aˆRž(MØØïÃ^ß÷žõÝÈAøèe¹{ŠLsgäšTµñÝ}¾Šò®665«&õ¡ï“ÒËaßúÚu ‰j‘N¨¢ÞI EW²>æ²ðØçêÒ¨FÒyMeäã\^t?ãšV·þ›™6zcÆ”…¢îÉ¥öŸ±¶ŸªkŸ}§5ZOGdz¢ƒöݶž÷[Ï~—Ûmg¯¯>¢Ew¶ ‚<¯Ñë³-ê_%è¨Ök÷œÃ/¶íÝÛôƒÅX ä^MM`Øš¡ëþ 0úÇlp endstream endobj 14 0 obj<>stream H‰”VQ²ä üŸSxJTÎ±×ØÜÿwÛhjŸÆÙr¿&ÓÕiHc’¢SJ£¿?¿>+v}Dc!õPñc^;«”JY‚W'.ÖX¹8e,f”Jg-X3)ˆi†®—ö—x'J»ÌìK<ÏJY§Ðo–EJX ‚¿utyÁî´rûdVœÂZž´&ìz©ñ¶¢JâÁ¤š<3=a×'I;ÜzN?ÿŸºÚ¿5;xà«#ëN˜¡o^öŠs¤›'£=yMÐ>Ú»c•¶'Î¥ù`c­X+.*Æ9Žƒ»bûŽmnÅõRD^Ã{V ,‚ã)ÕÿÁ‚íGe³Nªu¶³¶5]¦®ÔBµÂnµè3å+ÖJšÉ*Šì͹ê(éŒm§NN«²3”R=ßÝg7˜E}tVä &¸×!º¢ùpóV‡qÁŽ;½¨ï#šâÉfØÄÆŒ¤¨ƒÃTÿg^(~Š÷¤P+kŽƒ%z×ZŸa*ÑóÚ0°85µé=\±ë¥þÅ_1¦mƒsÛÈqØþ‚úÃÎÑ7sxvã;»Óîï…KÏúSÊ}I᪆g…ÌØ¶‹›ÓÙ]èè¾þ0ñ/m endstream endobj 15 0 obj<>stream H‰”V[Ž1üŸSøÈ`cÃ1¢\#¾ÿoÊýP¶ÝŒäh?V[SSÍtJR­s’¦ª¦?ŸßÉÔ€93yMã#Ù+q«8±¬KºQ¢•)ó¥õÄÆK}²Ør%mIºê¬b|¸U!Å×ÄHúIzBàx†¶)FÅOÒ‚—öÁÊVÉ“HÍ©h!†¸”F^NÒ‚%l¤ñÌ$'é Uúäh§–H?8Ê™”g.Óüƒ´`³¦&ä=áëJv¾`c?<ïð¼ 04¦ORˆº&×Sæçß舷J­&.³“gÍ+6^ªkIOÜÝ O{I ²É¹ëa“”BVcÞ†ïY¹hUqís®”‹©ƒw謕ëy 6æ÷dæB»PéåÖz`ã¥þ¥ø¬à§ÿf×l;S;f6¼m7L!÷šÌ;å|NèŠÅé|g¦«Ï/JùJÖ‚m'+ÈLPÖž¥fE6Ṵ̂¼¥’1MÙnÖ«2 vGg$ózà‚}ÙgëêÖÉ ¤Ú‘¬³¬‹wÕk3¾w^ЛèŠ}.2'[j³Û…‹ÓPµÃoi9cPö3³õÄUýtT€ÁˆŒ=¨eÓ,“Fj’Øç¤Û•¾'6^ÚñÙ F{Jˆù?Ö‚mÞ­-¥Í\™qÍT \ÀGÇ9qŒ›h¸®íâ< y¶°¢ó´NÚu·~c½žƒñE1‚,ˆmˆDÝò¶èžöÌ鉭ÚQoÜØ5H›!yŠ™• ªÀ½ÿ0š•š;UÜ5üR·ý»Ö+¤'…Ó¦÷Öxb㥿»„¬w]{O Þa¢7 tט+±~·ñ¡Œµ¡àÚ:•Ó‰ûrLÞœuVùãÝœ !i²·[ë—z˜ÔÝ J™‘à¹ÂïŸ`aRá'¥¿ -,g@ endstream endobj 16 0 obj<> endobj 1 0 obj<> endobj 2 0 obj<>stream GNU Ghostscript 7.05 2007-09-21T10:29:44-07:00 2006-09-28T13:58:10-07:00 2007-09-21T10:29:44-07:00 application/pdf uuid:6b13c8c1-84ca-4ad7-8399-0e64017645b0 uuid:aa79f992-979e-408d-8bb7-98d8bd6aec6b endstream endobj 3 0 obj<> endobj xref 0 4 0000000000 65535 f 0000007819 00000 n 0000007869 00000 n 0000011176 00000 n trailer <> startxref 116 %%EOF hypre-2.33.0/src/docs/usr-manual/figSquareHole.svg000066400000000000000000005057011477326011500220260ustar00rootroot00000000000000 image/svg+xmlhypre-2.33.0/src/docs/usr-manual/figStructExample1.pdf000066400000000000000000000275471477326011500226200ustar00rootroot00000000000000%PDF-1.3 %Çì¢ 6 0 obj <> stream xœíœAÓä¶q†ïó+æ¸J%c‚ätƒWWù’›­ïfå$EÙ¨¼•È>èï»÷ŬJ´ä~¤à-y· ÑOƒføù><Â}XÿØßߺý|ûÝŸæûüíöó=ä"ÿëûO÷ß¿¥Â$†é¡ÏûÛ·á'™dÞêݧ‡Ü§ÔÖxûtûð݇oÞ~ºÍ§F]k¼ýpûð/¯MëGòˆ©Åíƒ^?˜óT> m•ï¾ym绿®ŸýáíþÇUɰAÏû/·pÿ×ôßOé¿ÿ¼©$•ïª1ýÿ'“Bî¹}{ šXJ'.¸T6qòbáâ¥)^¨x¹Øe+ž³4'©ô;—onC¬Ú|ºM³<ÿ¶RÁºðJ›ü™N3ˆV>šÓü\Ò—]‰amÿ9èc¼§6V%Ÿaýî*äoV1—Íù>=K»øA.—µòSSV^?XËÇ!W¦îÖòi²ßå>­âœ«Ö>}˳¢Ïµ+¯äò¸¶?Ký~ýʧÚý –O‹éOÔþ'¡Þ'ݧ©~·~ð© uÚìúÿ™¡ÉÊÏ„}ü‡³Tþ÷)9ÿ§äs‰ÅdWƒdïAŠ/Èf(#/a,”%LÑÆTÂ3ßJˆ…Vþ·YÞjMR¿ovÍ-OCíqôþSýQ¶V7M2íÇíß«Nµ$<ê·žqÉe[{Ïø,´ž5xF÷€gÌSÃt6ÉF“kÙ(íûfkÙ¬c½šÝL#³©i›m]üåöã?Ù°'y yì ÇŒq <ÓôîdÞ+™d ³™…È,@f!2 ‘Y`1[`1[€ÊBT–Be!* PYˆJ„Å,“HL"1‰À$“X˜Db‰I&‘˜Db‰I$&˜D^ÌöD‚“e¡É²3Ã%Àì=Y:™_C&Ì€&mà+›$Ô&’€tÒ~¼âIê•D”Ä:šM°zÅI 3ÎÖÁ4@×cѤÚÚvq†e- )‰H)Ì„)‰•SH—¹JÿDT.úèf€å¸UfÂåÝ»=gæªof^åŽ †sÊÅý©¹i.Èíuª5U¹™¦“V…FAR¾X3l0Hc*2#›¸Ðâ!x Ú;»8KëFäbû5ÎÙ¸nãØÕéEgNÄ™yæDœ9‘;ˆÜ}ĵ.âZqH‘‡«!"›(¢ù"›Vq­S†¢ŒL¨"leGÐê"ÊΣìZŠn§ì’Ê«ìÎÊή8´Yë FîÙÙö£æ¦¹ ·MµnpÁnDp#ƒÜÈàF7â9â9"´‘¡ÚÈÐF„62´€kd`d‘FY`d¡" Œ,0²€È# Œ,0²ÀÈ" Íy1šj#Oµý¨¹i.Èí¨©ÖÁínÜ\j#I@pcpI@å’ˆà’Xµ 6`¯8 4bfÚ:˜èz,šTûÂ.°F&‘%‘%O@dI¬È’@º Yú'"sÑG72oÄ­22ïÞí92W}ã0ðy1œj.îOÍMsAn¯S­©ÊÍ4´*4 ’òÍÀšaƒAS‘ÙÄ €ÁkÐ6ØÙ%гxnH 7$%7$”È å†„rCéTtªP^H /$’)l-o}BfH(3ä’é ÕZ²Z¯HÙ´By!ïkËìd†2CB™!ÌPfH(3$”Ê e†2CâkÍžXä`ä±7LÚÎÇ'M§ókéD ³è,Dg: ÑYˆÎKÚKÚd"³™…È,@f!2–´H\"q‰Ä%—H\bá‰K$.¸Dâ‰K$.‘¸DàyIÛ Nš…&Í>h0w~8{OšNç×Ò±‰`ºNjºN8]'˜®ó®-«!5«rNUj>¤Ô+bªNjŽ¥RòÎ1Yçöv•9ß#˜b…2$ey¤ÒêL¬,%5å´,k%5k…¼¶Šœ¬“š Cd®'ë„“u‚ɺ²âA ç–‹G£4ëÕØ5å:¼½à)‹/"¼Èð"‹ /2¼ˆëeÄõ2"¸Èà"‚‹ ."¸Èà×KelÊØ”±)cSƦ›26elŠØ”±)cSƦŒM›6ëåÔhÊEžr{’£ŒßÕØ5å:¼½à„7"¼á oDx#ÃÞˆëåˆëåˆàF7"¸‘Ándp×ËÀØc Œ-0¶ÀØBÅ[`l±Æ[`l±Äšõòj4åFžr{’£ìßÕØ5å:¼àYòE0(5èXâŻȉïÞ2x®œe÷\õœ¯õAm§Ó€n¦­LJÉù6W˜3I‚É[(Ch–¡*­ ’€R3[ŽÌ²aR³aˆl«ÈI@©96DæÝs°X{d@“·»ÃéæâþÔ(y{-nGMµnp”/å8v¶ÂRŸ›Hü©I¶ÞòôÇÉ®ËÓþ¹ª·<>YæÅ°¤æ§—%aŠÞD®8ÍÖÛÖÌ4BxÄ`‹&é[üúRŸ—äþ¸"JW«˜-WÚÝžm,xÄ h³>)šnÏKÊ8Lô1æª>zkÆmc]<áéM±¨)WŸ¥dÕë³”J Ÿ\îÌNDOñ›¯L︩×ñí…O_d|ñEÆ+¾Èø"㋸rF\9#£‹Œ.Vt‘ÑEDòÊ© Ož2Û¯—v·ÝüR£Òh€#”± p«ê wò„x¥Xu €®|šÕó~8ý\<†á|m‚ÇMÁŽpG„¶% #Ç&Û.=IA$Bˆ$A ‘$ "ˆ|’ ‚#ÇI¦ "É#öƒaD1ŽHUöñq$åáßßöóµõm³ï}o‘@Õk ªÖ[ QGå2ÕÞ‡nM׃‹JÂÇÁ¡E‘k` Zy0\yŒwþ Á=|âvºGÓÕ†nlèF¢ºèƆnlèFZ–#-˱!²ÈƆl$²±!«Í²¬ [mØjÃV‰­6l•ØjÃV¶Jlµa«ÄV¶Ú°Õ†­¾.ËG¢å‰›‰{Þù7÷ð‰ÛéL×6Ð…®¥NŽ*J‹r”sž÷_n³¬Z¨n˜7)ýŽ¥JßzY\ߥH¿ÐëáùÙĵØ>“¬ª~¦Bmm-¤¦]œ¬ãi–<¾M^khV/0Ûaʸ·âÒ "Ǧx XìRýöf‚Ò÷VˤRëÏ÷0ÜÇáþo÷áþÃmX•·‹ ÜäéùX–eÓ~œí¦›>sØn#0sþÕ(—ÌÙÃ&§9g‡š6ÔsúùŸÜ æìZ“;Éœ}kr2ÑÌ*»ÿå†Ü5­‹±è“‹>Y=÷{S¾ŠyhþÃ7,³Ë$Š(Ъ]&á} Ï´]ÁàºNËú2}œV¹Xa@ m˜íò5nU¾f#«]x­ü ÷gÃm^xÍ GiâQ4çk²üøÙɈ՛¦¸RTkÔ~T3d2ëÅddþ>6FÚoÝ…©u²ÆmÜÑÓ'Ê”çòüQž?ŠóG±e”WCåÕPyhŠÃV6‰²Á”Í©llåÕP’2@E¸ÊàBØa„ÝIØÙ„]QÑMXѵ•Ý^qJh»ÅÜKÙùöæ7_“Þǧ_Ç· ¾i |ID|Ó@ø’ˆø’XñMàKâK"®ž.Ú°½²ekÈ æ]ŒEÄçêW¾Š¸z&Ë`Z%€I€ \à¸5T,·î‹U à¦váÑ®žGñÃéçâQüækÒûüôÃêMSÜ )+«ý:¨fÈh2Ö«!ÉÈ ü}lŒ´Þº:KÙ[ ‡F¡‘ph$I „C#á@W8ÐC#áÐȇX÷•C'¦:ï°ÃÜZf'[ 4¼ÇtÙâáÀH80Œ#áÀHj`$ F‘À¶î vŽËÄcØÍW$÷ñÀi×Ñ}ytÊè”Ñ)£SF§ˆN2:åSyÅTF§ˆN2:etÊè”WLExÊðá)ÂS„' Ož0ôóèç£wäôëøöÁ×O³ß-8ßÚ~šýÌôúiöÓãë§ÙM<ãyè~šýÌôŽœ~ß.øúq{Û»Ÿíäo?nVrý¸ý¹Ñõãö·SžüíÇíÏJ®·?5º~ܾ ç;ñÛÛŸ™^?nz|ý¸ý OÿöãöçäÖÛŸ\?n¾Ó¿ý¸ý9¹õãö'×ÛŸðôo?nNný¸ý‰Áõãö×;¿ÛÛ_k?na®ý¸ýåÎïöãö—ÄÚÛ_—k?n½ó»ý¸ý%±öãöæ:Ù{üë>­âvæÂ¾?Ù™ k~²3Vs™­lÓzTÂ__˜ìÌ…lJNväiòÒíÈ“@U…#7“_EóÆ¢Kî|,ºlç-̦x·ófµ)`™¸(¢@«vâÂûŠ6£·0=G;o! øø¬jý€–±Ónµ|ÞbµŠ­rJÛ:{· ÇeâÜ\¹Kqûü„ÃêMSØIÓ=¨Ö¨ý2(0Ìôb@2.>ü#`Œ³Ýº:J±°S ;µ°S :µ S ;µðb$¼ :µ S :µ°S ;µ°S ÛHp1vjA§vjA§tja§tja§tja§tjA§tja§–—ÅhwnŽËÄ#¸ÁbtnœpÜ>à¶LT·<É:Ë,W2X“¥‡jqË{M–|:Ò-ç«äâoÝZUßrçFüXë`$¯±ì)Æ¿ æA…¥Ú –Y,çmZ°0]FKü-,£0qluôCµ‹¥Ýb9HÞä–Èá*¹3³©ŽÈ„C˜áoÛU˜7Ñ:´= õ öLÁQjÏÉíÈ ×Áí®GÜg zÄ}Nn=â>?¸q›¾ó@ GÜçcÖ#îsC £ •Y–ŠeÂø,V´W,-=ù«Ïjòšàž,Ù_©Ú»<´¹ ã´<ëORÛò¼'ÿ½³Š^öb@ù°WèGÁ_˜•ùË?ƒ–-iï©6Ôiô—à—­ŽÆåšÜ3[bd+9ˆ`g9Àµ À¨òÃ¥ó  ÑåÂà¢HŸ¤éõ˜ö…·/¼}’¾óIÚ™Â4<¦c~kuxäë°žÏùQäí…&XcWuÄ®²š[Q·úV6Õð›yer‡_ªAÁs{æ¼5÷£ý{­ðœ(›—ñ>…í‰Ë3¬o®zÍ\"üNÑú×7ôííç{îëûëûO÷ß¿Ý~÷§Æïo?ÞRE é[¥T-<†T–Ч¿Þ>Ý>ü÷7o?Ý–TøöÃíÃ_WAÃÿè¿°üû­|YÂí£ýèo¯­|æ£ûúÑüxš8`?ßeE’Ú0¥Va†1—¼uëºx»ÿñ¶þù&Óendstream endobj 7 0 obj 5561 endobj 5 0 obj <> /Contents 6 0 R >> endobj 3 0 obj << /Type /Pages /Kids [ 5 0 R ] /Count 1 >> endobj 1 0 obj <> endobj 4 0 obj <> endobj 11 0 obj <> endobj 15 0 obj <> endobj 16 0 obj <> endobj 13 0 obj <> endobj 12 0 obj <>stream xœ“iLgÇgX¡SA¬Ç"DÝ}5Ö#XŠV+•¨]tE¨ÏÙÝa™ÙÎÌÊ.XÀE\6/‡9d +Ç®Ë!‡x€G[R“FÑ6mRkkš¦‡5ÑÔšúá“v1é·~{gþïüÏóžÁ±i!ŽãÑ)9ÉÛc3i %¼±…cL:‘dhcP‹•æãÒ‚i¡JÞ+ß}f–ºKm Ÿ!i"°–¡÷fGÎ’ä™Ò“×&Ýªð³ø§øß˳2v¯ˆ]¹•³:xÚœ'‚U‰‰‰Ààÿ* ™h3 –*‡ÃÃY-+Æ]Ä< äÒ ôY[Ru[ÁòÍ i2Ñ,HáUo3(µTÚH±µär<`&€‘cM´Hs¬6 €‚•2Ò$(»‘²…•ÀJñZ”3 `æIV¤L@äÍ›)ˆWÞçr¬¬<§èEQ¬ôœ Fž¶Š@!ê“S&kóH1ÈhE\®rÓÄmÁn^h"I³)»ä(`¢+C:®beåé‰lÍš§è+O™IÞÄP„o0•©þÀK]“V+ã˜ø–›¸õ‚O‹Å䯥ÓƒMœ…dA:—RAe¢m09çÿêSSûsÄ0ìU#§$-į–Œé±X ¶ ËÄfa³1›®¬ 6 3c×ðø¥™!M*L•¢Ò¡êHI_<&EöâÍE›«Ð7h‘zÏvF<‰ƒ–þѾûý·´¾Ë]]h¬?vÔå./wjE®RXBX:m½ý¾ÀùÏö èäEò9A^³úfÚýK=³_›§µï)U¤µŽ (\…$ƒZ^&ù-yÃÛ_¦>@+Ðô&Úø«îf¼Öɪ-6ó6FŽÊG˦YØr¼Ô¥Pb WZïÅýS]ó´ÔVÓØX×kaCEÓñ޲V—?]¿3Ì_ÝuKK ;ºaÑsútψϜàÑøÝ¡Êh? ŒÏQæ/º7ž¤Î„™ìß›&¯…òrBŽ[óèÂЩÀ9ÍŸw~@:ˆVh©þa¼ÆÍª»[¬ûí®ü²\máÚ9SÜ~(–¥”=°ø†Æ>G%—Q”và陡‰‚Þñy^üDú£=lC¥£À“•'†Pœt=:Þ–Z,…n1Ú_óqe+$º›Kmån§Û©•ç>?P˜i±o…1‘ÊOTà•²¼h¯7Ì?E„û?ŠˆÀ°‹ÿ‹¤ endstream endobj 17 0 obj 1320 endobj 9 0 obj <> endobj 8 0 obj <>stream xœ’oLeÇïZZ Nà6`PžˆQ"›#2Ý€\„A’MŽöÚ¹Þw×B¡  LXpUì #[BŒÎY²ÌH40…m.Fƒ3¼S³ùê9v¼ð Ë0ñïžç÷ý=ßÏïσca ÇñøŠ’ÃÇ+J2«i'%f—I$C[BñLy/.'kä­ò¦2ñ¤çÉ«ºÌ<-£°O’ÃÖc7 /Èèyù¯]ÛN>|Ÿ×`é5Uµ™™YEïh»C¹ùùù Ñž* ˜i; ^VnŠáx'ÅJ9à8EÉAÍP ²æ°¹¬¤bH«•fIPÕJW£Z0ÓŠ© `ãÀl_€…c­´Ds¬˜‰€"OYh’T‹…âCBà)ÁI‹¢z´ìÉJ”H Y 㲆ðjÜÆ±àNÕª¢ZUr¢$Zš—€J¬,6m×(9H)ÄiUœMÍ´rW¨›gšDÒ¬$ªE q)`¥Ež!=*Wµâz«—H³öz(;)XJÜò Me§?ð¯®Ižg<[o¹­¬g|Z)Æ–SN;]"¨âœ$ ʹ|`U”ÝÅØ^ôvÖöÿ‰a˜!wúkyYÙ‹ÅcEb{°h,‹P? †Y±?ñ¼ ŸÖ$kJ4õh F> ýD¿±MùÛôõîóã#ƒc×R}þsýýC (MþxÐïC‰ƒ½ga/ìë3xs=½°»·³7Ѿà›è÷wÀæDx¦·«Ç£7;:lÓÕÿôçò£k±héÿûž¸d’—ˆ™àÌÅkÐ0?k«!Ýö÷ØT’mðîóÚÂçáG}“]†¸ß¾wOW$A{·½]”,'8 lÒyç8{±íÃhàÚÚêK÷Ý…›£—¾J] Þ\ƒëð,½jW)Ñs3ÓËI?U|û†é˜åh“1=ÜH àpE‹ö+E„ýqÇ"ü¢¨+è¥ ÒN­NÍÝ^>åOPv+‘ï–‘iï›;Á·`áèÛ㦠~f¶,Ô  }‹¸\‡ÎYz-Ñ5ê7l5—ê__¯˜t«ú *Ö=Ò+y· Å1¨G è®nPÿ”ŽV´W”RíBØ7K_#üò£‹ð>\è^jÿ®uÙ;{òAKOÂgýá+P‰£•¼:À¾ã$ËnÍqRNžÅáÏ(°®•Ç6J’·T8`Vâ² •¡’fPân´h/Ò£8”ùwñýt®©ûgüÀwG $=F‘¿2Jܹ^WxD,°Õ¦2'îh(·ßøõÇÀÚäõÔËÁ©À4Ä !… Öæ‚·à-ÃÂÕ&ÖÕÌ·žëü´Õèoê†]—øZ‡šøU/âh  §o7ë¯iÈÅt" Ÿˆü幉‘¨( û:Pp endstream endobj 18 0 obj 1086 endobj 10 0 obj <> endobj 14 0 obj <> endobj 2 0 obj <>endobj xref 0 19 0000000000 65535 f 0000005885 00000 n 0000011547 00000 n 0000005826 00000 n 0000005933 00000 n 0000005666 00000 n 0000000015 00000 n 0000005646 00000 n 0000008121 00000 n 0000007833 00000 n 0000009313 00000 n 0000006002 00000 n 0000006406 00000 n 0000006139 00000 n 0000010426 00000 n 0000006055 00000 n 0000006096 00000 n 0000007812 00000 n 0000009292 00000 n trailer << /Size 19 /Root 1 0 R /Info 2 0 R >> startxref 11676 %%EOF hypre-2.33.0/src/docs/usr-manual/figStructExample1.svg000066400000000000000000003444741477326011500226470ustar00rootroot00000000000000 image/svg+xml(-3,1) (6,4) process 0process 1 hypre-2.33.0/src/docs/usr-manual/figStructGrid1.pdf000066400000000000000000000146111477326011500220760ustar00rootroot00000000000000%PDF-1.3 %Çì¢ 6 0 obj <> stream xœíÜA¯Ü¶ðû~Š=:E»%5Ãî5@Q ·Ôïè[Џ ünùú•(Ršÿ,Š¢ö[=I ‚ÄKQ+QüIœ¥èÌ×k¸Åk˜þ©þüzùzùóßùúù·K¸i¢ë_럟/_¯±ìÚþøùõúã˸óXŒ4îs}ùeÜ7“ð¼ß•nrÕÛ}¸¾¼^>|úðÃ˯¾%Í:íðòˇ?=n¢i“ÜòxÀyç tcZ¶D¿Ë§óéßÓ¶¿¼\šÚ§+†[ºþ~‰×¿ÿþ:þû¯‹„ë=ɯ¯ÓGJ:¶øËåãEËždª êÅ~jî¦æ5q‹1ÕºR2• *Vf¨ÌPY¯j:­ÄÛPO;n Z¾‹UËq|SµRLµøSÞZUKí´íà®Åº~{€oðí»­»C•Ø?´ëT¨ß ô=Ó}²vuÊ·lΦG)†iïDuŸ±\ å ×b©›†ƒDíð°¡ÔO…ToMS,u÷²ë0¶ Ôj˜>Î^§âԈЎ¼K]iâ°|³KÝÔ¸4ðúÍuƒ©ëy× k}ÔÖj»a=w¹P{ö²¡µ;ÆõÛ­øº\bXûûó÷ŒÅãÝwøujÀ‡ÿ=øòÿ9øÆ{^î!ÄÂ8_Ò&ÝvC sÏÕ`(½ÐÀ‡8ÜVà!òÔ1Ã\3õt¬¥ÊQ÷«_Q;»?´–”s‡Ö’Ò®0.-.ŸË•”òôy:cÛ TùœsÙ>)f6„1ÛÄ\ZP[sXÚ]>×+ª{•k­ß¯½P]{¨ž·ö^mQíÙÚÖÚë«Ç—Ë/¨ãÀ³‘ÄÉ“j‡œèŸÓ¨ÐmvkÃÆ&M›6 lØ$c“`pK0¸%ðIà“À'O2>Éø°ÜØø°ñaðaðaðaðaãÃÆ‡ƒƒƒƒƒãàöl18òdšÚ§ ÙâÑé6ßnƒÁÄ[±hyÆ¢õ©[ ±Ãn4DcÁo­ØÆñRí@mü`Õ–6­Z­ùs!ØßpÁÆ¡`QÀH0ŒEƒQ°Ñ(Øpl< F¤€!)`L ”Žz[鉵“mäZ÷œPîñÁ{ØåNä›á —í:Äu—ëLìj`@ C¨Žow£øÛÈÝdp­ 7­»¡ííŽSìH–‚ñ)b|ŠŸ"Ƨˆñ¤lÄ82ŽŒÉØŒÄØ}l»–m§“ÉB‘%$ä%Ä'¼5o²7ÙÛìHx“Þ„78áíOøp7Òk'Ûȵî9¡\;ÝQéÔÈe€Ëà–-ƒZ´lÌ2Œ•†Ê hÌ2eË,/5c¤-5X V T R PjœÔ0©QR@R0R RRRŸÍ#GžLS»â4[<:ÝæÛm¢Øˆ¤‘#’bDRŒHŠImDRü)¨øSP1*)F%Ũ¤•ÔF%µQIìOA±QIlTŒJ‚QI0* F%±QIlT•£’`TŒJ‚QI0*‰û)¸‘žX;ÙF®uÏ å¼‡ñPîD¾®‘ppipÑ®C\w¹ÎÄ®2t€ê¸ñV€ÅÍUÇ#fX"ʰD”a‰(ÃQ†%¢ KDÙ¬±fXcͰL”a™(Ã2Qy>þ|nX&Êf™(/ËDÖXÛö©7³Y&ʰLÔÎ2/ó´Ì @Ù,µv—ϰL”Í2Q†e¢ ËD–‰2,µ^_=æèÉ—O—ô¹çi?)lÏÓ~jÙž§}.Ÿ.ésÏÓ~RØž§ýÔ²=Oû\>]Òçž§ý¤°=Oû©e{žö¹|º¤Ï=OûIa{žöSËö<ísùtIŸ{žö“Âö<í§–M×ß/ñ>ŒÓôw?^ki¨ úØju:äëe(dúm[N?×ñÒ)¾F熌£CXOô]‡jm®—¦±¶º]j^ÚݶH¬{Ètœ˜â;ç>ß.å‚keîèvozЗŸÆþŠœˆ:endstream endobj 7 0 obj 2885 endobj 5 0 obj <> /Contents 6 0 R >> endobj 3 0 obj << /Type /Pages /Kids [ 5 0 R ] /Count 1 >> endobj 1 0 obj <> endobj 4 0 obj <> endobj 11 0 obj <> endobj 12 0 obj <> endobj 13 0 obj <> endobj 9 0 obj <> endobj 8 0 obj <>stream xœ’]LUÇgv°B·.µÀMÚ(J U*~´l·  ¡4ieØÝfvfœ™]vù&|„åK…]­ X#)4ÚÆ%bhŠ©–éCÅøÖ˜úä:<8 M1ñÍÜ—{ÏÿÜÿïœ{.ŽEë0Ç÷Ÿ5טL§²ª--‘)–±FâYÊK¸rH§¤F©o¨OzžÓ§b–«± JZ<öÉ¡èõ¤-ò=¯ü¹o×iŸÆçuXFueMfVVv/øDÆá”AnAA¨÷§ 0ÑãàÀËÚÆC³¼à¢99œ¥i ;i`gXTTŸ²”Œ“,e³10‹šZá®×jÆJs ì¼ØÝ°òœ‘ž“rÀI P@h+C±€öZi!"d]Œ$i{ÀHÀ!RœLۀ̆³²n[¯Åí<'Aä5Ý¥)šU/É’UdhÄ “y·FÙIÉ®Äh2àíZ¦·º#Ý<ÓdŠá$ Ó^9©§‘–òi\ÍJ™ÜÃ9öèÙ@¤”hciiÇ7ò*{ýuM ëÛ¹Ëïd=ã3²D³öœrÆUï–@%ï¢8PÎ ¨¤n–Áî ÿ›°7¶ÿ7H ÃÈܼã¯ffŰ$,ÛÅb,KÀ±Xí£`ј û/Ãø’.A—¯+Eƒ‰J/ nBø÷ÐT°‰8ï¹2>¸:|-}`xàrÿ`ÿV>FàPJÀ?Ø ý°¯/­°9×ç‡þvJsÌÂÀD° 6¤ÀnGOMÛn7¶Ù=…]dÄÿå³û8ú{3J9‚Ò R­§µ’j媴‹b§æà½”G¦õcNº£É•vŽ®h¬ËøÕò­É»\»]sÚÓëínM—ª/ZJN«vU66"3‡Œz ÐõµòøfZz üþbò*2+K†éðôØMHÎÏØ«)ã=.âêšóšÉ¦˜yøaßçdòo?ynT„ŽNG‹$[/ðVè…ò×87Öô’|S‹HëY[˜½v+}#<÷þæÂÅ×ÉÁ’0;}cåàýwo¿n.³–^JKD›[©!®F¡ãj‘ÁñWÛ"|Qü$:FQSS³Ë+­A£z@;WB~ßÒ^ß‚o޾=nþ¨.ÈΔì> endobj 2 0 obj <>endobj xref 0 15 0000000000 65535 f 0000003209 00000 n 0000006030 00000 n 0000003150 00000 n 0000003257 00000 n 0000002990 00000 n 0000000015 00000 n 0000002970 00000 n 0000003740 00000 n 0000003452 00000 n 0000004917 00000 n 0000003326 00000 n 0000003379 00000 n 0000003420 00000 n 0000004896 00000 n trailer << /Size 15 /Root 1 0 R /Info 2 0 R >> startxref 6159 %%EOF hypre-2.33.0/src/docs/usr-manual/figStructGrid1.svg000066400000000000000000002076561477326011500221410ustar00rootroot00000000000000 image/svg+xml(-3,1) (2,4) hypre-2.33.0/src/docs/usr-manual/figStructGrid2.pdf000066400000000000000000000110011477326011500220650ustar00rootroot00000000000000%PDF-1.3 %Çì¢ 6 0 obj <> stream xœíšÁn1 @ïós,†$“Äž+BâÖv½Z¨ÚCáÀï“8ö¬½»½ MW£Šn{Û¯»–Í>÷nð½«?üzûÔ=w®bÿ«{î=‰äåö©ÿ¸+²õã©ßÝunÀ196½~rÃúÝSwqsñf÷ÐÅ!BUØ}í.Þõ(X ¶ƒwõ`â8ŸøC•›7Çvn~Ö³O»þ²+±eäß?ïËÁ.»~LPœ\bŸ&Šì[w÷¶ÆäkÄ! ©ÿ]´¿”%¸€"»ú\ŸR.>í-=v×Ð#£FžõƒF2)Éd$ìÇ|v(g%γ¸Í5ð8aŸÆ¦”œ/¯m÷XvieWï¯; Y=+;ïIJ†êŽò5º¦éc9M¡I ê…ÈÚÑïYÏí¶fƒìÎöxBw;ñ„ürmMÓš"¡}]×åÜÕ{Ú‘Λ¥ˆäßQ{‘<`ï"ºÙoZsD¬E±òóœ¶Íâ{9{ìg–}å¬ïy<Ö?¡©Oh@¡…P¨@¡ª> P`@(P @P`@¼XŸ–&•§¼0%ÎÊYP:ªO¨u‚:¬O§ur2õÉ2¤@a#«J²¹@á _(d7%ÙÅ@04I 9,ÞqÀ¬Ç©`œ&¶ï°Ùow;ñ„ürmMÓš"áúä)x9¯iá5%L,yJ¦ÜâQ{à xç ñ›Ökõ-M*+NyaJzñÚ)œïm ÖêÔ|oã´>NGó=„Hh ¡„*Hhêšú„Ph@¡… *P ê(P @P`@ (P`@P`@Á‹õiiRYqÊ SÒãˆ×Néä|oµ>P§æ{§õqÒ_¯˜²|{¢®ªÌW‰ë?sÓHÛ.„‘®ª%î^4 ^_Zäúè¥]#Iä6/§rz ƒæ4}ÿþ'¦NŒYRtsó^×Ò&§Q·Ð2ø > /Contents 6 0 R >> endobj 3 0 obj << /Type /Pages /Kids [ 5 0 R ] /Count 1 >> endobj 1 0 obj <> endobj 4 0 obj <> endobj 11 0 obj <> endobj 12 0 obj <> endobj 13 0 obj <> endobj 9 0 obj <> endobj 8 0 obj <>stream xœ’]LUÇï@»l°B·B•å&5 B‰ØÄ„в)²BÁj“*ÃìÝá6³3ãÜ»Ë.ì „Jº\v¡…»¶ÝBjlJ]b´Æ%ÖДDˆ¶Uã›MôÁdÆg¡)&¾ùvîùŸûÿsÏåÀ¶,ÀqÜ®¦×ZZŽ«lÇ>Dö5R^ÂB&ÿ´ñg<že”f›/˜3ëÃëÏl/î ;ò g8¿~³p{ÄøëaãÞÎM£—â²@yGÛÑŠÊʪzE iX즰¦¶¶v…à}6 ‚E>i$)ªÉ´AÒn½XB°µãwc=,?(ñ–¡K³ÔV—ÕtcÉU@¯¢AióEö`Š™TÃò¨HÀ¼QP@jF¨‚*Ò|˜+†˜@QãeŠ<*Ë‚ä÷dðVޫȪšbé>K±¬ZB‰ a•B‹ØÚàÚì‘vó4Ã%Ø’¡âµ*=ŠàÏLó@£<– ¤(H3œ.=˜¨²¸–•ªáüËâ½ jHä5„ȆoæU¶æƒÿššWU)´qWÙ¨zÀÇ” É[ÝŒ}]~Û/Ãf¥ºaý¯ÁÍ=ÿ·`kmÿo‘[ÍþòŠª}‚]`Èù äX_lp«æTî—ÒãÆ)–Xs$¹/v볉>Û±ÀÙéɱ —Ëb±Ó£ñÑñb}¯ñþX"6ÉÆKÆ¢ñS,ÊFFœuášP” E¢%áœÅØÌh¢Ÿõ”°w£ƒÃ!Óù÷@q¿70XwÒnùŸüØøãz¡¾|GýõÑ¢UÝe,;RéÔ¥ë̾0çíàâ[r/w†Ÿ ÛûrØ{# Ú‹~þ:p­½n‡Ä¡ÂqE`AFÏú¦åK}g‚Ì®ôE4ôià»ÅS—?+»¾q—ýƾ—Ó‡®Úã9%>umeÏ-7ŸwšN8 ô_ÖJ“[ÍÖ÷›õñÏþ%ö;Óó®èO¤õìÙÛ³ó߬¼“(6w›¹¯7ò{ßvf/±§^žvëLHsöûzçjöóCß©ƒ/—?×¹¿Zb?²Å¡åÈW½+á¹7?:8Àžbf6Ÿ{ʯúøæ&Ë!>n:wçÓ·Ø-û'ÚÕ²¿Gí==p±×™ˆŒ±A¦Rõhw¥·/qzJŸp˜Š-âÞ®«¶‚ž¤ÑÔ'm3¹?=43™—À?v*² endstream endobj 14 0 obj 917 endobj 10 0 obj <> endobj 2 0 obj <>endobj xref 0 15 0000000000 65535 f 0000001445 00000 n 0000004102 00000 n 0000001386 00000 n 0000001493 00000 n 0000001226 00000 n 0000000015 00000 n 0000001206 00000 n 0000001967 00000 n 0000001688 00000 n 0000002989 00000 n 0000001562 00000 n 0000001615 00000 n 0000001656 00000 n 0000002969 00000 n trailer << /Size 15 /Root 1 0 R /Info 2 0 R >> startxref 4231 %%EOF hypre-2.33.0/src/docs/usr-manual/figStructGrid2.svg000066400000000000000000000420051477326011500221230ustar00rootroot00000000000000 image/svg+xml(-3,1) hypre-2.33.0/src/docs/usr-manual/figStructGrid3.pdf000066400000000000000000000143001477326011500220730ustar00rootroot00000000000000%PDF-1.3 %Çì¢ 6 0 obj <> stream xœíÝMܸà{ÿ ½AÒ!Åbu] 0ÛîÌÑ·MÖÉÂs°sØ¿¿â§ê-Od°m¬°GÕ"ŧ)²§hõçÅÝýâòŸöó§—ÛçÛ_¤åãnûž{’ÔþýòqßñïÛÆþ¾.!ò–Íåm¿:·|ùçíç?í/Lù…ëz˯ûáßÿþr‹rÛ¶-Û¾ÁËË­þ¬ÿ~º=ÝØíçkYc;g¸åãíóâKýúŸ^–ïŸ÷‚¼_|¸K\ž¾í ˜êqKØ_.÷m]ž_nï>¼ûîù—Ý£$É<ÿãöî/_ï yïÛŽ?çáNaìñöß}}ž_ò¾¿=/?ܤ4Bدh+­õR¶«c•ÃxÝw^¥\Ìïo~Ýó|l–Ôq¤Mó½Ïm˪myd6#(jƒ“¥#•_°)¦’wT¯´¼z…W¯ðêMçm*+¿‹xœ:¦{Ruùä]>:†vÌžn‰ÒG²äeÿúéaGÉω¸Ùr{²ämåÐu¯AÉ—7뎗œÌ•pýÌG²ä•*®ã•=YòråâJÇ+*ßå;Ž|/½ÖzÇQv¹P]zÙÑëíýñêž|—èô»æ nïÝWZ¼ä‚ÿ[Ç[ÿw/£ÿ³—ù- ûu¿ñxc¬.«ö7ÂZ[¬Á¯åê;ôê×û»zÊ ²ÖœÜ®¥C;®5z;Gkäv~×kRÊv½&¥^®n——ír%%·s‰}¿+@e;¥²¿žÉ'Rt>éøTjÐjç“õ.ÛíŠÚQåZÛë[+´s·jå¶Ök5j-ÛêÚZýðø”G„zkx4+"~0PkKý+ß ¦ÍÖ†”M›6l"ØD°‰Ê&ÂÍ-ÂÍ-‚OŸ>|¢ò‰Ê‡ÔÍ”)R>¤|HùøøøøøÞÜÍà ‡LÓšâ4ߢëL›·Ûˆ²I`“À&M›6IÙ$¸­%¸­%ðIà“À'OR>Iùˆº­‰òå#à#à#à#à#ÊG”(1s¶ó°ÂáÓ´¦¸Í·è:Óæí6yö–`&`&`&`&`&`&ÔGÑE̦̦̦“Kõüµl˜M'5›Nc6à£hR³é¤fÓ fÓ½”:N0›Nj6Ôl:Ál:©Ùt‚Ùt‚Ùt‚Ùt‚ÙtR³étÜÖÍà ‡L£?èœæ[tióvR6l"ØD°‰`Á&*›·µ·µ>|"øDð‰Ê'*R·5R>¤|||||Hùò!åCàCàCàCàCàCx[{4+~0þ svšoÑu¦ÍÛmŽÈWŽl:%å=PíImµ'5–÷ µ§àì•W‰5û¶Wbý°~¯÷`֋裄µ^=×j8rzAL`Ô¼ÄHÅÈÄÈÄÈÄÈÄbdbCJ9Ú•S÷Zº³×^ÓÕ¬¬˜¼×âÝöš®ceÅ„½lö W2®d\ \ɸ’q%ãJàJÊ•Œ++W2®d\ɸp Æ5×`\ƒq àŒkP®\ƒq Æ5×®Á¸ã^OÝ êÎ^{MW³²bò^‹wvÛkºŽ•öZ°=Ø3\ŸŠqpã*ÆUŒ«€«(W1®®½-/ÆUŒ+ƒ+W6®l\¹»bL€ &0jÎÊ•Á•+W6® ®l\Ù¸ò«³ã©{AÝÙk¯éjVVLÞkñÎn{M×±²bÂ^ öé¶®å~œ:ÈnÙbõÝ7C쵨wl|W*¹>RÊ T+8NºµƒÊ—–Ü¢kE‹:h£|ñý˜!ÉñŠœøÔÃ1ÀsäÇwf× ÂøzíaˆÇsísÆã¹öù.UØ"ú­Ÿ¦ØÃå$ÇsíKýQ$­ÇsíKõŽçÚ—ªÇÒç‹!‡öe—#¯~ßeO¶¯¼O°¯5j¥ºurí[/G@b\IIÁˆÚ:ã öÐ:­ˆ{hß}Ù"íË/{}jå«I·2+;&ßÙøf¿;)®Í˜~gó›ï¤p}uÅ”;›\‹è48Òp„p„p„p„p„p¤áHц#„#„#„#„#„ . \@¸€pá 4\Ðpá„ .h¸ðõsò‘oö»“Âá ‡éw6¿ÙñN ××(L¹³Éµ¸Hƒ ''''''N4œh8A¸VDû:² ² ²±fcdcdcdãÆÖ~1õaÆ5#####k4þz~9éÎF7ûÛ ÑpmÀ´;“Ýìp'DëQý©v&µ§öíXËû›/GPÌU|i©µ­"¨_õØŽ\àËm]×…|+­æP¯YÜ÷š<©Õ,_Iøëïrª§1£Z—]¸Õ»¤(õz·4û–ËeýBnî&šs·*¿–µ&뺈^ïßétO·ö?¿[TÙSendstream endobj 7 0 obj 2686 endobj 5 0 obj <> /Contents 6 0 R >> endobj 3 0 obj << /Type /Pages /Kids [ 5 0 R ] /Count 1 >> endobj 1 0 obj <> endobj 4 0 obj <> endobj 8 0 obj <> endobj 12 0 obj <> endobj 13 0 obj <> endobj 10 0 obj <> endobj 9 0 obj <>stream xœ’]LUÇgv°B·.µÀMÚ(J U*~Ô¥[( „MZvgw§™gf—]¾ a¹…¥…]­ X#)4ÚÆ%bhŠ©–éCÅøÖ˜úä:<8 M1ñÍÜ—{ÏÿÜÿïœ{.ŽEë0Ç÷›*OŸ©­Êªb\´t´D¦XƉg)/áÊ!’¥¾¡N<é}rLŸŠY®Æ&(iñØ'‡¢×“¶Èô¼òç¾]§|Ÿ×aÕ•5™YYÙ&^ð‰ŒÃ)ƒÜ‚‚ÐàOPDKŒƒ/kÍò‚‹æäðMÙI;ÃÒ ¢úK‰ dœd)›á€YÔÔ wƒV°0Vš“èL`çEÀçlŒÌðœ”NJ€’@[Š´×J !´èb$IÛF‘âdÚd0œ•uÛ"x-nç9"¯é.MѬ*xI–¬"#È@#V™wk””áJŒ&Þ®eÚx«;ÒÍ3M¦N2í•#œØI`)ŸÆÕ¬‘Ù)Á-1œcž DÚA‰6––v|#¯²×øW×” °¾»üNÖ3>#K4kÏ)g\ n Tò.Šå|°€JÚáf)ìú¿ {cûƒÄ0ŒÌÍ;žñjföQ KÂ’±ýX,fÀâ°,‹Õ> Ù°ñ2<€/étùºR4˜¨ôÁà–!„M›‰³ž+ã#«Ã×Ò†.]¼8dD‡•Á8”ðöA?ìïO+lÉõùa—¿ÃŸÒ³00q1ØS`¿³×§¦mwÛížÎÂn2âÿ‹òÙ}ý½¥Aé©ÎÓV Iµrˆ@UÚŠE±Ssð^Ê£¢õcNº³Ù•VË gë6~µ|kò.$×nלòôy{ÚÒ¥êó–’Sª]•MÅÌ!£^t­<¾™„–¿¿˜¼ŠÌÊ’a:<=v’ó3öjÊãxŸK§¸ú–¼²9f~Øÿy'™üÛOžU…¡£ËÑ*ÉÖs¼z¡|Å5Î5_öB’onéo=k s£×n¥o„çÂ?àÏ\¸ø:9£Qf§o¬¼ÿîí×ÍeÖÒ i‰hs+5„ÃÕ(t\5µ/ÂGÅO¢#a5µ15»¼Ò4ªÔ¸Úêð–Ž2ø|sôíqóGõAv¦dç©B(oWêP!›@ Êi}±ýÚ¶©±X‚ÄYÕ¬ß Â¨Hÿ˜Pó— ª3@ ´¦Oé¨~5jR-6 }ûaé;„qot®Ã…®¥Ö»M+-3çx{_žž€¯@5™QóëwÆE•—’‰hpH5ΆïÀ;ä7âõ œ»QhºÔñiSZ°u¨ vBAjœZâ&ªZÄÑ46¨<ÑjÑ#Hl )E!t.DLÄýúÜÄH|<†ýô¥ÿg endstream endobj 14 0 obj 1071 endobj 11 0 obj <> endobj 2 0 obj <>endobj xref 0 15 0000000000 65535 f 0000003010 00000 n 0000005829 00000 n 0000002951 00000 n 0000003058 00000 n 0000002791 00000 n 0000000015 00000 n 0000002771 00000 n 0000003127 00000 n 0000003538 00000 n 0000003249 00000 n 0000004715 00000 n 0000003178 00000 n 0000003217 00000 n 0000004694 00000 n trailer << /Size 15 /Root 1 0 R /Info 2 0 R >> startxref 5958 %%EOF hypre-2.33.0/src/docs/usr-manual/figStructGrid3.svg000066400000000000000000001566241477326011500221410ustar00rootroot00000000000000 image/svg+xml(-3,1) (2,4) hypre-2.33.0/src/docs/usr-manual/figStructGrid4.pdf000066400000000000000000000146141477326011500221040ustar00rootroot00000000000000%PDF-1.3 %Çì¢ 6 0 obj <> stream xœíÜÁŽÜ¸à{?…Ž»AÒ!UÅ*ö5@.¹mŠ¥®4qÞ²KÝÚ¸4óñ“ÇSŽóŽú¨­ÕvÃqîr¡öìeCkwŒÇO·âë~‰¡õæ;žÃå6»Îqñ–w÷9ÄB·]ÆVÑvÌ[oUô¹\yCžã|=PçÈkgÌ[ÍÚ» ­–*Aݯvx=FíàzüÐZRÎZKJ»Âö¹´¸|.WRÊëçõŒm{(8åsÎeûv¤˜Ù°Ål[siAm]Ìaowù\¯¨îU®µþ|í…zìÚCõ¼µ÷j‹jÏÖ¶Ö^?<¾^~ù]ïŒ$†Hî T;ä@_Ö‘`Ø<¬ ›6 lØ$°I`“ŒM‚Á-Áà–À'OŸ>Éø$ãÃfpcãÃÆ‡Á‡Á‡Á‡Á‡6> > > > > >ŒƒÛ½yÄàÈijWœ‚¦Ç£3lÞoƒÁY¾¸[¥hy–¢õY¾[ ¥Ãn4DKÁo­ØÆñRí@mü`Õö6Z­ù[!ØïpÁÆ¡`QÀH0ŒEƒQ°Ñ(Øpl< F¤€!)`L ”Žz½ôÄÚI¹Ö='”{ûà½ÙåNä›á —í:Äu—ëLìj`@ C¨Žow£øÛÈÝdp­ 7­»¡íí¾t?Ùîg|rŸÆ'‡ñÉa<ÛF0Ž{Œãã…1^6c§0vÛîdÛÑdÇ=²8dÙI Á o›…ìDö#{óÞ˜„·-áMMxË>䯽Nzbí¤\ëžÊ}éøà º§S#—.ƒ[¶ jв1Ë0Vf*3 e0Ë@–A,°l¼ÔŒ‘j´Ô`)X)P)H)@©qRäFIIÁHHAHHqP¼7¹3MíŠSÐôxt†Íûm¢Øˆ¤‘#’bDRŒHŠImDRü*¨øUP1*)F%Ũ¤•ÔF%µQIìWA±QIlTŒJ‚QI0* F%±QIlT•£’`TŒJ‚QI0*‰û*ØIO¬ô‘kÝsB¹·Þ›ñPîD¾®‘ppipÑ®C\w¹ÎÄ®2t€ê¸ñV€e[ ʰ”a)(ÃRP†¥  KA–‚²YKͰ–ša9(ÃrP†å òvüíܰ”ÍrPÞ—ƒ2¬¥¶íkf³”a9¨e[Îi-Øz²Yjí.Ÿa9(›å  ËA–ƒ2,eXj½~xl£ÎyÄàÈiìJݳÓ|éðè ›÷Û°±I`“À&M›6ÉØ$Ö k |ø$ðIà“ŒO2>l†56>l|||||Øø°ñaãÃàÃàÃàÃàÃàÃ8¬Ý›G ŽÜ™Æ®Ô=;MGgؼߦ¬{4œºî±xêÚGÆu¸}d T—4²]EÍÇr‡ßÚ®¸·ÿ¬Z#p-.Ûµ¸|,èìßÞ‚CÁ¢€‘(`( ‹£`£Q°á(Øx0 ŒHCRÀ˜0(÷e®“žX;é#«¨ç’ëùà º§#KÇHÇHÇHÇHÇHÇ–ŽqÌd3ùùùùØò±å#;f’å#ËGÈGÈGÈGÈG–,Y>B>B>B>B>B>rcf'=±vÒG–ñÎ%×óÁtN§F.\· lÔ2 ec–a¬Ì0Tf@Ë`–,ƒX6`Ùx©#Õh©ÁR°R RR€R㤆I’’‚‘‘‚â xo18rg»Ê÷ì4=aó~›²f²G$ň¤‘#’bDRŒHj#’âWAů‚ŠQI1*ÕÓà:ÞEÔF%µQIìWA±QIlTŒJRÍ`oo‹`T•ÄF%±QI0* F%Á¨$•£’¸¯‚ôÄÚI9X=—\ÏoÐ}<Ý:ŸŽqÿ5êÒµüµ½\XÊímG¹®¥\ßaÄ­6Ú÷ËoöµÆR–örDËþ3µú­Åî]bŽƒ=þ@m i)þ_ãGy»ÎÐÞ@”^±µ¡œ;À+‰ãèÛ‹ãìÛ Ö¶í]ÇÑòõEH»ªís»â¶gë‘vœÖcí<­G[;ˆm+7%ÛU¯JòQjo$ûá ÐJ_Xx·|jØïðØÙ~²²ìdÙÉ2Ȳ“e'ËN–Ý€Ì0 ³ÓeÐe§ËN—.;]‚™œ.9]rºät tÉé’Ñ%Ð%§KN—œ..9]rºä侸´Ò^\Ÿö;<¶C¶Ÿ¬€¬:Yu² ²êdÕɪ“U7 + Èêtt۹̴ŽþW§«NW`@§+NWœ®4Ý}dÛ&NWŒ®€®8]qºâttÅéŠÓ? ÷Å •¾°ðúèÔ°ßá±²ýdËwfvsvsvs†¹»¹»¹»Wì^Y0ÌØÍæ?ìæ?ìæ?ìæ? óv¯,ØÍØÍØÍØÍæ? ó6óvóvóvóvó†ù»ùÃü‡Í€ÜW€VúÂâÄö̰ßá±²ýd dÙɲ“ee'ËN–,»™a@f§Ë ËN—.;]vº29]rºätÉéè’Ó%£K KN—œ.9]]rºätÉÈ}qh¥/,NlÏ ûÛ!ÛOV@V¬:YYu²êdÕɪduº ºí\nþÃnþÃnþÃ0ÿa÷Ê‚Ýü‡Ýü‡Ýü‡Ýü‡aþÃ0ÿa3ÿa7ÿa7ÿa7ÿa7ÿa˜ÿ°›ÿ0Ìì€ÜW€VúÂâÄö̰ßá±²ýdM†‚‘Òü±²2×_à ³f$3l›‘Ìüq³2dæK3’™?¶ÍHfþ´)±G2óg•ëùà º§‰ÐŸ5'óH„þ¬r#úSÓDè›Ñy$BXš‘ý±mF"ô§M§=¡?«\ÏoÐ}]Òç‘§ý¤°#Oû©eGžö­|º¤Ï#OûIaGžöSËŽ<í[ùtIŸGžö“ÂŽ<í§–yÚ·òé’><í'…yÚÏ,;Ï×4ýv‘0ÝÒ¦»|¤´E•Oe»¬ z½ÜÊÆ­´Vmå˜x=ãÛêý0Kr-ÅTOóQZ+ãÚ˜í7l9Qùé­4×þùÔj5•VÍó<­_´K_l5܄ҲÕÕéÖ/Ë`Žý_‡jm–Û¢¦±¶¹”8ïmÞÊk­•›i©½mwí\]lÚ­Ýt¸O—Ÿ–?ÿk¢4Ûendstream endobj 7 0 obj 2888 endobj 5 0 obj <> /Contents 6 0 R >> endobj 3 0 obj << /Type /Pages /Kids [ 5 0 R ] /Count 1 >> endobj 1 0 obj <> endobj 4 0 obj <> endobj 11 0 obj <> endobj 12 0 obj <> endobj 13 0 obj <> endobj 9 0 obj <> endobj 8 0 obj <>stream xœ’]LUÇgv°B·.µÀMÚ(J U*~ tËÇ‚„B(MZvgw§™gf—]¾ a¹ÀR¡AWëÖHJ¶q‰šbj€‚%FúP1¾5¦>y‡ÎBSL|3÷åÞó?÷ÿ;çž‹c‘: Çñƒu¥gK+3ª'-/‘)–±„ãÊK¸rD§$G¨o¨“OzŸœÐ'cæ«ÑqJJ,öɑȄmò=¯üy`ÏiŸÁtXZMUmzFFf!/xEÆîAv^^hð‚§ (¢%ÆÎ—µ›fyÁIsr8KÓ@vÐÀư4¨¬yÇ\RÒ XÊje8`5µÒÕ ÕÌŒ…æ$:Øx°{`á9+#3<'e P@h C±€öXh!,dŒ$i{ÀHÀ.RœL[̆³°.k¯Åm<'Aä5Ý©)šU%/É’EdhÄÊ"Ó^²ƒ’Ã\‰ÑdÀÛ´L+oq…»y¦ÉÃI@¦=r˜Ó@+# ,åÕ¸š• 2»%¸$†³ïÓ3HÛ)ÑÊÒÒ®oøUöûÿêšÖ»{—ßÍzÆgd‰fmYŒ³Á%*ÞIq ‚ÏfPEÛ],%‚½Aÿ7alÿo†‘Ù9'Ó^MÏ<Ža X"v‹Æ X ‡ÅcÑÚGÁ"1+ö#^Žûñe]œ.WW††â•>Ø6ñï¡é@3qÞ}ebÔuäZêàÈàå¡a#:ª|ì ŽÂá$¿o¨ú`J~K¶×»|¾¤–¨ÅÁÉ@;lL‚=¾Î^¯š²Óal·¹;ó»É°ÿ/Êg÷qô÷V„r ¥¤:w[ $ÕªaUk+EOÏÃ{IŠ6N8èÎfgÊ9^`¸ÂñnãW+·¦îBrývíiwŸ§§-Uª¹h.9­ÚTÙØ„PÔ<2ê5@÷×Êã› hùðû‹‰kȤ,fB3ã7!¹0k«¡Üö÷¸TŠ«oÉi!›£à‡ýŸw’‰¿ýä¾Qڻ쭒l¹À[ ÊWœÜxóHòÍ­"ý­{}q~ìÚ­ÔÍÐüCøü™ _'‡¢4JÜÜÌÕÃ÷ß½ýº©ÜRv)%mm'q¸Nª…û_íKðD±SèXELoNÏ­¬¶Œê!5æ\ uô}sG9| ¾9öö„é£ú;[²ûTA”³„+u¨ÇI 8匾Øym§°±XÄyÕ¤ß$B¨Hÿ˜PsW ªÃO E´®÷Oé¨~-bJ-6 ûaù;„qol nÀÅ®åÖ»M«-³xz_ž œ‚¯@5‘QsëWê¤*ÊÈx44¬ çBwàòñú%ÎÕ(4]îø´)%Ð:Ü;¡ µ-q U/áhTžh5ë‘@Ä7•¢ º$&c~}nr46Ãþïêÿf endstream endobj 14 0 obj 1071 endobj 10 0 obj <> endobj 2 0 obj <>endobj xref 0 15 0000000000 65535 f 0000003212 00000 n 0000006033 00000 n 0000003153 00000 n 0000003260 00000 n 0000002993 00000 n 0000000015 00000 n 0000002973 00000 n 0000003743 00000 n 0000003455 00000 n 0000004920 00000 n 0000003329 00000 n 0000003382 00000 n 0000003423 00000 n 0000004899 00000 n trailer << /Size 15 /Root 1 0 R /Info 2 0 R >> startxref 6162 %%EOF hypre-2.33.0/src/docs/usr-manual/figStructGrid4.svg000066400000000000000000002013771477326011500221360ustar00rootroot00000000000000 image/svg+xml(-3,1) (2,4) hypre-2.33.0/src/docs/usr-manual/figStructGridBoxes.pdf000066400000000000000000000206551477326011500230230ustar00rootroot00000000000000%PDF-1.3 %Çì¢ 6 0 obj <> stream xœÍXËn7 Ý߯˜¥S4ªÞm.Ú]ê»ô¦ph`uºh?¿çš‘tÄAà…7G¢HJâ!©yجq›å¿þ{{z8ýô{Ü>üsrÛoøûˆ¿?O-˜ÔZÛ\HÁäíþÉà§nw§ë“wys±pšÿ§¢,s©9ã1­p¡š8ΩLë æÉÜ–Õ gêû g¦i‚yÒÙ´èïxqe±Ðñ"âÛ,@´LGÇ™! xIa5¢x)E´øÐE/"9åq‘‚–éÚÄÈ¡AñrÑ–7íœÜ´½¸jïdá>­hð ]À?ŠʘWíc›Õ+Z²›Õw”(&ÓýžBß~ê¡#XYôô‡€b ÕnLn'¬ˆ–i4Õ¨x±Iø\DĦK#ÍWS‡„ÂY@CùP8 ä¶ØP8 ¤¼˜P8 Ę1~(œBXL(œ¼›\$X¶ØS bq‡±¦¤°}tr¤ o=ÏJ>½;½ÿAdÒöï×Å  "šX|¿E³EªPoCˇ«{úš³×åªã”øÇXøÔ—œL¶ºC…“%›\Ëæ›5Ñ"ª+ÖZØ­Ø9fËv ¥Î8¦E0J jm Öœª,¨NâÚ8ÏÔè ó1ÜÄÑbsˆ&¹´MAzáK÷ToQS©¯¸ŠœÝã¶§®AÀžY÷l}hØñqk=? Ýu †ºë”%C.FÂ.zã¥PR_lØ<€P:yH.„ldu5œ&¯÷ÑøÜÅ™Ä]5Å‹|Ê÷‘@/c…› †+óe¾X³q®{NÀÚ­x»²ú‹s=zõÓ,¬`'l_ºs²'ñAJ©z{P°®Üsžô3#ãYq¹£‘_…#2êH­µ2’+ƒÕÃfµ½%òH^Î5f*ó:x>øRA ðË# 9WQ0à•h»±ÜL=foÖËÉnê Jq?*A‰;‰*¼¬£¼i¡å­÷ Çj…µu>J@ÕO×êçc¬*.‡(ñZ+¸Á<ÑÖ n0ÉEÏèµsÃGGnTæ<¦8n«Ü`Šq8›:7¨ŒÜ¨Ìy,‡»±Ln¤mø²Üà‹uñúôFʃ¡ÿÜÞo?Ÿñpp2r~~C¸´¤B2Nÿnä|ºº¹zuþx &Ìžßž®^_à@œ:ø‘@ª Ó!?Ïß¼ºX}óI²I5)á4³Ž_šÍO˜qó¼û›)™JÙ^GK^|ÖhyÂhø;>†¸öøE+‹·é “õLþrÞÞœŠ6 oIˆ+ËsÈV{:-ÖHÖh<òGðÂçà«ik¾€cBî°N¸<ÖÜ1øíèB¾[Íuw‹QpVË|.LB±¤½ ô¬ÔR/ŽšC¤-2(¸(¹ß¥d¹Q¼[W~?›¾c.±éðM ¥ù’h±· %سVfSWO ÒV-úÒ¤ ª:;ÖÿŸMᾫÛrV…µšI*Äž‚ÑÖxÌQkij ¶jPS>$šª^æÆºÃógÑõ•¼ÆÆ¦çµ²+=¯9ÔGyM3̘Ù~%U¢É¹äú‹Cèž â¶½•¡Þ ù@ärÌÿ7ÏoBÇ®+û{þc·5ÆØDo'1WlÖo2¸ïlb4Hé.£ D3€&ÀÆgB\d® ±’é&úÇ ´þɨ˜~¢F>k±")ö•­žCÙõåö":“}{‰-*ß2O\ ÓO$1ó©“ ’PÈî2¯P_õ+€5è“ø¹#7ÕÁ¦ 5Р³ýÅùEÕÐ?+èW —k“oґݱ#Õo=d¡]¶‰L ÛšVSzF•ûYUìì_‹PÒ%ö³)™ !°EŸÐ¦}¢»ç>ßàßÿÔ"wendstream endobj 7 0 obj 1447 endobj 5 0 obj <> /Contents 6 0 R >> endobj 3 0 obj << /Type /Pages /Kids [ 5 0 R ] /Count 1 >> endobj 1 0 obj <> endobj 4 0 obj <> endobj 14 0 obj <> endobj 15 0 obj <> endobj 9 0 obj <> endobj 8 0 obj <>stream xœRmLWaeQYVq÷¥ØV‘h…¢V@*uE "ÒF˲;»ŒÙg†•åKPÁç" †ºŠ Tª…V‹Jƒ•jAü®µV“Ú¦¶iú‡&£Mú¯yî»ç¾sν÷áØ Çñ€ôäŒ5º„°µ”•äç& z epçÃĸâ!ÎTHK¤¦Û_Ì÷œ‰éê½'‰_ì`ˆr¡ÿÈÔ©â‹Éâ¯SÆ™x+ÞíÍNKIŸǰyeÎ@DTTÈÊ/Oò”™oÉ´0¬•¤…y •$Me!ArZ¬.1Ì^nÑ 8MÎÉ’½e ižœL ,ã``h#%P ÍÏËy £=ÒÙâ: Y¯Ì%ÞÆÅ#³ÔÛöyŽNTFK!û·žëùÜù- BœÒQ1ªýÙsP釪ª%µúáÙ΋ð"qŠ;¶‰ÎÙÂæï)9”¯qV—ÁRÈ lz¶›´¼qĿɜº‹æÞʘ®ú=ýÕÈçdg"Ä^zÄ&-Hk0öÇj$ÿ¬„0²5V'w<å2ý$T"šüôÎ׬=ÖF‘jä!yÕåÁT"úÃä%1©—¾¿Õ5x§U³Ûaý^¢ïõ’áüfØN žìèÕ¨zú:>^±Ž#SimÙ¹bÂ=Bk{qÔŠjÔ£,Ôy"V)…ε ?? µ8 ”Ùö5Ö9¬uÔ8öìªÚUˆBÅ»ŽZX´»²ªVÂ;51öˆ¼JXVYRd÷êq4írÃ-Ap[eéöukgkC;$ºÛLiz›ùZ«§3í ìDW7ütgs)¡úñ;Ûñµ1ÁÐ\f.äÃÆs¡°ÏÚH7ìÍ…SPÈ‘§mC=]u‡;´÷:»Â'ðݹòQå%«L:Ûz| xxÍ…wVVmÒÈÓ™éÂáuŠ”âÔæçŽðD¾GѬN¤h¹×röê@‘3Pš&ù¬OÔ‡nÖ•¬†ËàÒº÷ög:-m‰ÄK”y]qTZ©FSöußW?Ò_× ož²¾ÂËùö¶÷s·žˆvF÷¡¤¢¤E€þÀªOZ5öëÚÅž!=–mlŸªQ¾²iÈSªU†J´§ÝëÛñâ6ºesC\GHxôœ[^M­áÙ÷Ú!ÁçðÙ§rúQ B(òŠÐyZkj5ˆv~[\b¼ mp)›|îNlªõõŰcL®‰ endstream endobj 16 0 obj 1409 endobj 12 0 obj <> endobj 11 0 obj <>stream xœT}PgÞð¹­|XÓœ¡¶ämÇ;µX§v¼QÎ=¿¨XTŠrØ!ÙÀJ²»ìn4@HB€øä+%ÀÁ’€AH¥ˆzÚÚâ܇Îõîz3žm¯÷5íÍÜïÚõænÁ½™ûïþ{÷}Þ}žç÷>ϼ ,)S(ê£%Ú‚¼œã¤™à^ÙK› ù¼ÎDê—±qB|>A|!Q*•>ýÖúí‰ä°‚ÁUébv6ø|ê®5žyF|˜)þ}õ#6ŸbBñ®â_‹‹J6åälÞG36–¬ªæÁÖÜÜ\PiÿAÀ~‚#«(ð=yqš0ÑŒ™ ø-àA¾šFÒD€Ââ½ùûÀÆ=&Á@R •ÑBK¥ì z‚âˆMÀH³ÀôèèiÊ@ò$Mq[ÀèÇzRg„UO0ËÀfÀ¬™ä8y HT±:Š' €§IéMò¼¼o¤)0,-ãf‘© iŽçô,Éð@V,ÜŸ÷È#_­ã—u9R†m”Oh½eyšÇ¯#)ð„•_Ö©$€ä“Î&ëÊT K®X°p$UõD}3`‰*k0Ü ïò­<™ü×Ô:†1ÙVþ¥WN=Ö'yŽ0·!Í•ÑfŽÐ¹ & ¤Å åü¿ø“Ôþ¿1 {šÒâX¾Î 0ì(¶;€½‰åaÛ°—±½Ø[˜[%·K†ä’¾Ÿ0¸5±! O '¢ö qÁ%ˆ™¯Aa”~ ¥­UÞkÐ:•þpcCÄÝž.¿¿kxpQGŠdå/fý3¡ç®ÕŽ”«ìµtvUµ•;¸q iÕo4ìl:æÅ™Ôé³½-Ð ›¥¤”Æä¨eͬӈ£ô”9´'~ÿÃÏ„‘±à Ä{MÎ6¯»Í©9.ý Yy¯þ¤£¨ö9c„Ÿ~zâo·²3ÄÂÆ%1c\ѳh×׉è.zQuò ‰¯€x…9¾øaäËøMd.ŠÊdþfg«×ãqi\õ­MЛÖñxäâÕ…²ËùÒ‹Òzi‡´íµùÓw.NdG‚C±ëx†ØÖøñAÜ!4 kPR¬Unw£µ*æÇ,c‡x‹§³³'x?†””(n:Ú mÞàÎb.¤Fú6—‡å·kl¯'+!ÎÚC­“2¤—¥bië¾™Ýþh6þ—›·±Íí¸ò !ÈOÎÏL~þ^¶²MÊC·TÁ³ý§! uå’š, µKAÚF}±öű¯âw.ÝŒ_Šz—ýIº”“*†ÅÕŒ·§U¾[—KߨÝðP­®?âh¬„¸‡A¾‘í¹ún‚½Ýヿh÷·¿íëj¨c¶ÞÖ GëÐK(íùD7—_T^³£P3‰R¿[oð”x²Po…*âíç½5­‡j6T2Ÿ¢OAÜR7 tGGþ¨ ýÞ?: O‡#ËžÇò´û«Dô+ô’ª4¶èäX,£‹¾ÀyAóa>x}6vihÆðåñ#rë¥íRîö¥‚û¿^œúúƒlIû…*޲g?½ñ¡‡e÷ÉC»(M³×ÞÒÔ*«,Ø&dÄß t´¥'úlªhJïÅ®Î!臶a÷|ÝDóy0ðÅoÑê?”ý\Êø“æðœ=gð¥+W—~7¥•ž d´^AeÉæ—­Á}º`Ýy¶«¢é !.¥lÛ.%0–î:MPwµügå¿9+…eÐÒÌ9,¼¡Úª…%°,ÌN[ÇÜÑÖ(Ÿ:Ĉƒ§úIXUÔn¿c80RÄê…þÀN<,Ý`Sû¼oÇÙ±V¿žŽS‹MÊ|X¬®/±7h=8‹æSålë]ñYa D™r>Ék•V1)U•Çíözˆ7·tö„ýÓ¡Ï4wQ“”Øl+tݰ\¨€YR¦Ü³ãÒ«»ß9qçöìe¹gM†¶Ø€+Æ(uynnêþÍlå éMt[ôöÛ  I)™x9ifˆ×Z‡ÇÞÿæê'šèÂøØÈJÍÿŒþ)(Äõ(SexËé²É%sö»'kЫêöóçÎutÇn…Cðvµõzú\]Þ·!„FÇ鋿R#%îÔØî¹ÃÖQi'§fR/ø:`¼ûl~mTÚ¢.?p¦¦ÉU³<°Åçì¬ïqœw@Üı¦ê7y}Xøë-Mhªÿ‡ÝµA:«·^p 𜞸ý9ž!?Qg±X@¥BÊÈÓ(mÕHgZ†ýHª>Ž endstream endobj 17 0 obj 1670 endobj 10 0 obj <> endobj 13 0 obj <> endobj 2 0 obj <>endobj xref 0 18 0000000000 65535 f 0000001762 00000 n 0000008054 00000 n 0000001703 00000 n 0000001810 00000 n 0000001552 00000 n 0000000015 00000 n 0000001532 00000 n 0000002264 00000 n 0000001960 00000 n 0000005820 00000 n 0000004043 00000 n 0000003779 00000 n 0000006933 00000 n 0000001887 00000 n 0000001917 00000 n 0000003758 00000 n 0000005799 00000 n trailer << /Size 18 /Root 1 0 R /Info 2 0 R >> startxref 8183 %%EOF hypre-2.33.0/src/docs/usr-manual/figStructGridBoxes.svg000066400000000000000000000650101477326011500230430ustar00rootroot00000000000000 image/svg+xml(-3,2)(6,11)(7,3)(15,8) Index Space hypre-2.33.0/src/docs/usr-manual/figStructStenc0.pdf000066400000000000000000000225221477326011500222640ustar00rootroot00000000000000%PDF-1.3 %Çì¢ 6 0 obj <> stream xœµUËn1 ¼ë+tLŠZ%)êu-ÐHãcni$ˆ[äñÿ¨´Z:ô®7õ¦-|0DΜm=Yph¡}Æïëy2_¾³½{1àrÊöΠ½7 Á±õìR)ÙrŽØeû|cn?ʼOcB7@­óTCC“ñëzg¿nk³zÄàR°ÛÛÖ3$dßqÖ{ç£ÍÁy²Û9ƒóíƒIu..©¶?ÌÙÕs‹m$¸Á<„ñd$Œô'#y YÕúµŒ”F±)8ÎM,äAìÕYcGÌÉUl yW|-Ð#{K$ðy9tu>ï¥'æ·‰#3¨‘‘lÌ£™]ALtP\Ê^úm–pè $ñl¼D?ÕóT›ŠÀ”ÔµköçÛà²î6ð?߯Æg‰Â~ÓþÙ’ôúÍI"Ö·tl t©ÆpIô;ó3;Âÿýü'ÜÅ»K^ÿ°†%h»Þì¶bøg¢”ØÆ¶èm^ú6KÍ×~¬˜RÊ»!!¼Å~‰]–ºK‘,éã4`ÿ¢Ù±AÇ_¦÷ô›Mq¬ÁÄe"8@ŠÍÉ ¸B}3Cýý‹ ž,z¬?.oS¬ë6¸ú«HµÑX÷V¢>Õ·è½è‹D£?|RóõDv×ômk/L íñ+uuÙîÆSÎíôhbAG¶àxRÈÇöîUOR{KÑ>|¸Ì¥áҞ׎Ý'ÉrÐLø(µ6ÍCJ{Ës{µ÷¯ùRêrœ> /Contents 6 0 R >> endobj 3 0 obj << /Type /Pages /Kids [ 5 0 R ] /Count 1 >> endobj 1 0 obj <> endobj 4 0 obj <> endobj 17 0 obj <> endobj 18 0 obj <> endobj 19 0 obj <> endobj 12 0 obj <> endobj 11 0 obj <>stream xœR]LU¾ÃRØ"]Ûê6‹Êr’V…²%`ãbý©ü¤«+Ù¬%õ'm:»{w¹:;3™A v{Y Ó8Z7E*Ä’hª¶Q«i“& i_š(>¨OFm¢/ÍåúÐÙEK“¾™Ü‡sÏwî÷ïœ+ Ò$½­á¶Ž`[ý~’Äú®€!J$ZÈï´î¬J¬j‚Ï®Ž­6n¨FÁ“7YÞJôÞjnk¾t‹uãnëúæ5¢¬pFø¦Õv†ÔÕ×ûZ5­‘D—M~¿"iøV¬“„ ÙA7–5‰e£^ÀŒ. q"au> ´@í^IŒÅˆ 횆R»5’(–u\qEiíQEŽƒ(²Þ{uAWq”ˆàÞ(V €T¬%‰®Û1š(8†DŽJ©XAÞÎÇÙUSlÐpBÔbÖ‹¼…©¬ûƒÛ\‹ª*¥‹o•bÕ-}bèXŠ7td$¥CXIŠ2t(~B'R’¨ÁÚžï,X_Ûÿ[$B¨|»›jëÐ&äB[ÐV´U §ýKP)*G¨ } 8„6á-6á*ž)îvÿ|þÜEzÑù©6ÿªœêQû޽ßç5¦Fè0U õ@—ÓÅ~eû—v†M»¹R6ÜÀÔ2—utt._>'ÐvyÅÁ~Ï?ææMÜÇ{ù ÷,ï¾þÙYsþlÍ_×~`Í”íp²GBìôŽ*îo?:ø8¿/Êýákp BQgçk_ýrã{åÂo5‹ËŸÌN6;5óîœðå6¶`¾^ör÷Û§f&ONX“ΟŸò°íÖ»“fv†NUMf&ŽÒ =vÌ»§¿)¡#™¡LUù¥ìì¸9H{ªè›™á±4÷þ3äŒwï-XÊWçzÕÁvówâïÁ%ú'e•§ÙŽs̱°²pþ»+o˜¾W¼· =OŸ¢OžxúTû;‡Mi1ð;|Õqšïs³Í }½üæ¾?±D¯ÑK#Ë—û®ô/ú©wÌóq³ÙL¦üÂ} äg“bÇsNWOÎjͱƒ¹²ÙŠïš©¬Dè&¦˜ Ø endstream endobj 20 0 obj 882 endobj 15 0 obj <> endobj 14 0 obj <>stream xœRmLSW¾·µ77³«]£õ£=YÌ¢ÂP™âŒÊ¬]qü@´·í5·öÞ2º*CD78Á òi ޏøŹé”èT˜g¦Ãm$úc#ÙÎÕºd§ÕÀöw9Þó>ïyž÷}ŸC“$I’êìõú5ÆU±†ËgÖbzs™c·û˜+Î Å™q–4¬w=}š*›E¿,jäÄᙲû1O䯊NG_yN·l#O‘ÍÉÊÈ™·Òíñ{Y»C “’’€Ù^ @Çð¬ÝÞÀA>ù=NÆ%ăL†‚ƒ6–c@zÖ{Æ”•`N2g²ZYÐ{1šîÃÝY€‘µ0.ž™ ln/àž_€Åí²²ëvññ ™&À{ kâS`a< x¯“åy–v¯É%0V ¸ë²p>kDçmn—<^7ÆÁTén^à-^Ö#¬˜®Ó?ïQp˜„ˆ.Ïb¸m¸Òê¶ø"ÓŒc‚‰uñ@` „ˆŽ™V–÷p&?ÖÅT/mÁdz.û„zð2v“×Ê1|”7²•‰ùÀ¿¦6y<œ?úÖ­×gžálñi¬ÓìãA¦ ?3‚ ÆîãL^"˜0Á° ³þŸ}ALvYÜŒÍË ,b ¡#Ò =ñ>‘I¬#²ˆÕD*ArüOˆIDq\H†È_%¯K.H§H¤)R#jWˆaHÌìw„bÄE#S•](ElR…¥Ïšd?Q=è¤LÙ‹$Gúný2£»Ë±yOéŽOÚäð¼+ÊËk‚‡`úNöùÅËS<Ù9傚ïe ñSaHŒ"áºü@*žC¿«‚uøTÃr5ì𵽕;f®Ë€ á&[Ÿ›Æ†I8æÖoüÜѹõLÁuxö~qö›–¶úÎúKt"åLZ·e%¤õ[Î_oºÓñµ¶ëJw[¤¯pdì%eÅZ<ŸäÀˆT|MüR“Lë“ó>Ø–Àwè°th9šôèΉ¡Kš³×: †?¼àèd;òê×Bºp™jðÔ¦%é­ölÐ2ú,»Òº-Ýw/7ÜhíÖvݺÔuÒQdèG Æ•®¢BUyCչГ°UýhñabQ¢Ù°A“k´…)¸f5¯;a;Ξ\†HÇÛ'²ë³íH/Í;¿)xp¶±_ÕòÛàõ!}û̦»ÊJJZjÇÖ¤ÜD3ûI‘®¼MÕõVw76œ‚ê°Ö–ÖõNóï/ à2˜™H.H˜¶ŠÚiõQóžmÆ=7ËP ôÓ„ö†b”‘aÂÝïÐѤ¸Ýƒ$Ÿ¨ïË”`_áî`ÑŒµ0o{ªŽV®h¸7ne åFPöHêéʱZT¨*š‚U°†î3œ›§KË·š5vŸsaÚqטg°`ZGqÝžª"Z9z ¸rGñtèpBoþÖ­ØHkkwe°*xP›@íÊ>†úݾMˆFs¡É=ÛŽ½õ™fùa™r ³Öj™C‡Ž66in;xÒW:k ö|wd=B¿w“„øIðX T;š-K¤¸ðl™.²‡ÛÔÒgT鮲"¸K½±Óùm¨½|­¦~€+Ù‹EÕ¾ÕõåÁŠ`¥vX”ÊâEyñ¢ÆÆHT‹Ù©kBóŸ8ñÍ7ÇÑ’'«B$ºM†çÿ팦ÛB³ØB©!c35üÒÈäá ¹œ þ/.ˆ endstream endobj 21 0 obj 1298 endobj 9 0 obj <> endobj 8 0 obj <>stream xœ’mlSUÇï¥ôzqsȶ;6”öÄ˶ΦƒM3E‘ &‹]iF§X'äöö´;zßvÏ)k·0 „@s‡²@0G}Á±˜“2?,*$~ FC"¾%~1ͲDÏÝî½í 3ñ›ßžs~ÏùÿŸ—Ã2«W1,ËVBÁ¾R ~´M“ãD”‘T` ÖC¬õð*k£Ë_L/îqod‚c%XžRflñ»òvõçZkþÁe±ãìEö ûW]O÷ õ>_c»¦g ”ì# ©µµÄ2à¶CŒ’*¨u‚ýPÖtªÄvCH $Cîi v¶ƒºm²#t §bNi ˆ$¨bXšäå45ŽÒTìÛ0Ö¡„DÀ´õh:4„±„AÒUã€h©’œŠìû„¦ šÃ‡8Ra ,H'Àq oïX®‘ô‰¤à‹‘ƒ–p2ãš”*ts©˜&Ÿq„uYÌ8¾Ž”n b )ŒÔäŠ{#0`R4â2ÄEÝÂTVúÿêZÔu9S|«³îù#‚¡œð‡KaЭ)¢ BZ+‚.G),¯ù¿|ekÿo øM›673Ì:¦œ©`*áœïÁ¬fdæ[ÆfÙôõ2ëØ‰…Š ÖüÝEï,l"f¤ïË~_—ÝbÚu¼]s³ù·éü[—<ó·¤&mâimø×€'« çÇô½é£¯Nx[¢v„ì|ŧ˜É+æo~AÎÐ*ïÔçòS&ïø˜¹…õ9öD{ŸÛ2’9iN™§FNœÎS¿u­: Ûü`–T¿ñÎÈ“?ÿök©#ÙCÙC^»riß`DI·›5ê²öÿÌÒ_è—õ8Ý-ì$ž2y»ž£{è“wï|6kÞ®¹Ûþ­ÿùÞiŸGíÂZÏ{«ó7._1ù등Ž@(`‡í]^EVEå±åºÏÑÎ[³·ÊéUº¶™ ë+~¢•t^˜Îž9úÁð >û’¹“ßm ž<ìÉ?rjð,™:ÝoòIœBÑÏåYÚBº†Ö~5ðq÷'Þ7GÝßÜšüèÓ/7üðÜõÇžIþ.ϻׯ›1k®^ì‹<½+j º·8Z5gmα֋tDèàh‰õ¬;È-m]zF{ÄMq1»ÁM+¹iÚàþš[Z3'ÐIza‹}Á]6³zr´7ÇßOKKÆGKKæoz5» endstream endobj 22 0 obj 938 endobj 13 0 obj <> endobj 16 0 obj <> endobj 10 0 obj <> endobj 2 0 obj <>endobj xref 0 23 0000000000 65535 f 0000001011 00000 n 0000008887 00000 n 0000000952 00000 n 0000001059 00000 n 0000000801 00000 n 0000000015 00000 n 0000000782 00000 n 0000004485 00000 n 0000004223 00000 n 0000007767 00000 n 0000001562 00000 n 0000001276 00000 n 0000005528 00000 n 0000002818 00000 n 0000002550 00000 n 0000006642 00000 n 0000001128 00000 n 0000001181 00000 n 0000001222 00000 n 0000002530 00000 n 0000004202 00000 n 0000005508 00000 n trailer << /Size 23 /Root 1 0 R /Info 2 0 R >> startxref 9016 %%EOF hypre-2.33.0/src/docs/usr-manual/figStructStenc0.svg000066400000000000000000000331641477326011500223160ustar00rootroot00000000000000 image/svg+xml01234 ( 0, 0) (-1, 0) ( 1, 0)( 0,-1)( 0, 1) stencil entries offsets hypre-2.33.0/src/docs/usr-manual/figStructStenc1.pdf000066400000000000000000000077761477326011500223030ustar00rootroot00000000000000%PDF-1.3 %Çì¢ 6 0 obj <> stream xœÕU=o[1 Üõ+4:EÊ¢>×En©=zsš A<8ú÷{¤ô^á&(2tpb¥#yÒ‘|'ˆ}Ðß\GwrŸ¾'ÿÓ±ÄÿƒKjïÍK¦®kä’h]ž¸-`ßÜr\KÀöÑEîBešO-q8µ3Ä´RsÇFŒa†™ "`báÙ(1íÄ#·BNžíFËr8úÏ;Ü &7¿»spý Ï….'$ÅïŽn³ß\í^YØÝºÍõË-Ö­Åø¨F¢üFøþê%`ÿ¬{×1Qàè9ãsû:Ÿðäám™¾ìü ž¢fñ÷޹ê{2G¡Xõ]uCð8\„:ø°D“1·Nk虲z”F­ûƒãôÅNB(¬j·¦ÈJ¥Šˆ¡VJ¬3ëI®¤)”Ê!´H¥ù3Nø»“ï×÷Á¼ÿG¨Š“–2Êù¸ÚŒ–‰£¬—ÖÈ+"…²öŽºb{‰À«5ý•€9á´Éd¢¶+€‡+~yò赓•Zœ°€RèÖYpcÒ¥ŒXª^G,Ã@R #əߓ‰…œÿ)ÚöïJœç´uH0+trÄÓ¨–ÒS`§BÐÞ„/L‚™×"Þl¬RÙêA «ä@¹LÝ…2FDì”O¡+˜² o”bµP/š.ª+ÏzA¹i7©-lÝTÂxÕfR»G OäÖf²ÐQ{çàW›ÖdŽºW»YwÖUk¦†{+K ™«^ؾÆ  Pœöd4{ÿòIn×¹¤ x¦77©óH’êÍ=¨à*_'V„ä:ôƃLM?¯–ŸèÞx¼[ÄÚUñ!xRÁ¹–n|†Þ@ðäÏ8ÉxËwÁÏÙúŸAÆ6Ù°!ª`É#y2;ÛØo ¢Š¢;Ø’Öfí̓jl¶µ‘FªÃæ8Ƽ9hH=G»àC12Ö1åQUg”æc^>Ë­»Áï75…îjendstream endobj 7 0 obj 725 endobj 5 0 obj <> /Contents 6 0 R >> endobj 3 0 obj << /Type /Pages /Kids [ 5 0 R ] /Count 1 >> endobj 1 0 obj <> endobj 4 0 obj <> endobj 11 0 obj <> endobj 12 0 obj <> endobj 9 0 obj <> endobj 8 0 obj <>stream xœ’]LUÇï°tÙ"ŶºÍ¢²œ¤U¡lI±‰q±~ „tuKÖµ¤~¤Mggï.Wggƹ³À"$Ý^hÀÇÖM‰ bI4UÛ¨UÛ¤ hÚ—&Šê“Q›èƒæÎ2>8 ZL|óíÜó?÷ÿ;çž+ Ò$ÂѧtD›ë‘¦{B†(©˜ßmÝ-X÷”XÕ.û{vutuï¦j>½y‹å¯@§Vg¶„mÖï·[7·®å„sÂg%¨¶#z¸®¾>Тj$; h ƒËÀß ´bJ’ Üç]XVµVŒxc0:1$ˆŒ!ÒñD8ԵͲÚtG¤cNk&V(®ƒ„ªƒ¼~IUâÄ ªB ™‚TÃeÀ=ÖŠB4¬§¥N „BRÇÁP(’œŽñN>¡*hºêè)Gq¬"*5¨¤͇im[ïÑè"—G5áTÆU)]œæ–fˆD¡`à£È‰aˆªÉbÆá:VšNÖZHS¢$7èÐqRÔã2¦k¾ÅWÙ˜þ5µ¨irfí®ºVu‹O ŠåDC;IÅÒ¢jJT ] B¢8™–EÖ÷üß‚µý¿E"„Ü{kë{Ú†¶£Í¨mA•¨Ìù"¨ÅÐB©Ð&¨Â¯´ŽÌÊæ¶Â¯®¸øO…‡¼v£°{ìÛ·¼ïæçÍùó5¿Þøš71¾ËÈü¼Û?¢z?çÈÃö]’ŒÞ[ƒC1r”y:^úäû?.ñ.ýX³¸üÞü‡Ìã¸3³àÍ ïà æ+îç»^?3=qzêíšÜTîäØøØ¤ï´Þœ0sÓl²j";~œeÙ‰þý}™,Îf«úÊ®äfÇÌÖ]Å^ËflÿŸƒ¾D×ÐþO%ÿ¡PØußg·x“¿ ,±_¯8Ëw]à®…•…‹_^{ÕôÙ;ìògCâΗÃÙcìÑ™ÇÏ´½qÌ”Cÿ8ðc×]gí^¾•£O—?âÂÜW3Kì»2¼Üµ÷ZßâÑo{F}ï6™Mì~fßAìŸåÉ”Øþ”ã0>i{½ß]¼p™]ö¼¯Ï¿¨¤»µÞ“ƒoõúÍþÉa6Ä4C;ÜYDñCK?ǧ¼¶êîoâš»²;oµæù‘¼{¶ü›Ûf§+*ú ?ñŸ£ endstream endobj 13 0 obj 876 endobj 10 0 obj <> endobj 2 0 obj <>endobj xref 0 14 0000000000 65535 f 0000001048 00000 n 0000003607 00000 n 0000000989 00000 n 0000001096 00000 n 0000000829 00000 n 0000000015 00000 n 0000000810 00000 n 0000001513 00000 n 0000001235 00000 n 0000002494 00000 n 0000001173 00000 n 0000001203 00000 n 0000002474 00000 n trailer << /Size 14 /Root 1 0 R /Info 2 0 R >> startxref 3736 %%EOF hypre-2.33.0/src/docs/usr-manual/figStructStenc1.svg000066400000000000000000000222571477326011500223200ustar00rootroot00000000000000 image/svg+xml(-1,-1)(0,0) hypre-2.33.0/src/docs/usr-manual/figStructStenc2.pdf000066400000000000000000000135351477326011500222720ustar00rootroot00000000000000%PDF-1.3 %Çì¢ 6 0 obj <> stream xœÍT=oÛ@ ÝïWptІ%ïx_k"@·¦½9‘Àìýû}<É1„¤E†• z$ßQ¼;‘°’ø½ØÝ1œÂ§{£ýÏ ôŒç)˜pí½QÊÜÝF-Æ/æü#|ík¸|®Eà>†¨=qYà¤Kµ¶b,Ø)5w8b”™0C3NÈ< ‘ Œ›Îµr"+º˜Ý‘>OX 6š’_3‰´°`q‰S¡é6ÛÍÍô|1¨ Æô6·¯]ê® øèÀ8¿“¾½yMØžÝwE#i,CÏÃÛzä/Åå}•¾Lô ­(±ÒËÛ÷Aµ4ôTZ²z“ÝQ:ÃBûÐLj#4á8©Îß2„x(à P$AœG¯â£Y¨ù²ùVÇ„Ä$ÞÌÂæÉ4ÆîýШh³/ûQÔóÁoÞŽ­ÑކFxÖ\¼3­r®ä¸`@ÑY™<¢#ƒ n³Ñiäô=Å\¥$Ûø_WE«ÁÁ¸Œ÷χt=ŠâºœR¹—Äfã„Xï°ënòû7+² Rendstream endobj 7 0 obj 489 endobj 5 0 obj <> /Contents 6 0 R >> endobj 3 0 obj << /Type /Pages /Kids [ 5 0 R ] /Count 1 >> endobj 1 0 obj <> endobj 4 0 obj <> endobj 14 0 obj <> endobj 15 0 obj <> endobj 12 0 obj <> endobj 11 0 obj <>stream xœ‘ÁkAÆwÓ*ÁÆj•Š¢Mß©¤&†ì!'I[Š´„˜¨H-lvg“ÑÙ™ugÖ&‚xð > endobj 8 0 obj <>stream xœ’]LUÇï°tÙ"ŶºÍ¢²œ¤U¡lI±‰q±~Tt늛µ?Ò¦³³w—«³3ãÜY`’n/ 4`ˆ£uSbB…XMÕ6jÕ6išö¥‰âƒúdÔ&ú ¹³Œ΂ß|;÷üÏýÿÎ¹ç ¨´ ‚pûãOŠvD듦{B†(©˜ßmÝ)Xw•XÕ.û!{vutuï¦j>µy‹å¯@o®Îl/Û¬ßoµnl]7Ê g…ÏJPm{´£®¾>Ьj$; h ƒËÀß ´`J’ Üã]XVµVŒxc0:1$ˆŒ!ÒþX8Ô µd1' ´êŽIÇœÖ L$¬P\ Uyý’ªÄ‰AT…6À "P KD”÷HX+ аž"”:1 I]T C¢Hr:^Ä;ù„ª éª£§Å±Š¨Ô ’N4b¤¥u½G£S4Š\JÔ„SW¥tqš›š!…‚{Œ"'†!N¨&‹‡ëXi:Yk!M‰’Ü @ÇIQ˘®ù_ec>ø×Ô¢¦É™µ»êZÕM>1(– m$KSˆª)Q65aˆâdZuXßó 6Ööÿ‰rïm¬­ ìAhÚŽ6£r´U¢2ç‹ RC_¥B«  #|¼Ò:>2W(›Ø ¿²ââ?ðÚvÀî±lßò¾œ3çÏÕüzýkÞÄø.¿/òónÿˆêýü#ÚwHv0zw ÅÈQæiñ“ïÿ¸ÈŸ¿øcÍâò{ó2ãÎÌ‚7/|¼ƒ/˜/»ŸëzíôôÄ©©·krS¹“cãc“>¾ÓzcÂÌM³Éª‰ìøq–e'Nø÷÷5f²l8;˜­ê+»œ›3Xw{5;4š±ýú]CûG<•ü‡Bu^`×\|ŸÝìMþ6°Ä~a¼â ßuž»V.|yõÓgï°ËŸ ‰;_ >ÉaÏÿ‚’îÖzO¾Õë7û'‡ÙÓ ­£³ˆâ‡—~–OymÕÝÞÄ5wewÞjÉó#y÷lù7·ÌNWT ôWÝŸ© endstream endobj 17 0 obj 876 endobj 10 0 obj <> endobj 13 0 obj <> endobj 2 0 obj <>endobj xref 0 18 0000000000 65535 f 0000000812 00000 n 0000005414 00000 n 0000000753 00000 n 0000000860 00000 n 0000000593 00000 n 0000000015 00000 n 0000000574 00000 n 0000002199 00000 n 0000001921 00000 n 0000003180 00000 n 0000001255 00000 n 0000001010 00000 n 0000004293 00000 n 0000000937 00000 n 0000000967 00000 n 0000001901 00000 n 0000003160 00000 n trailer << /Size 18 /Root 1 0 R /Info 2 0 R >> startxref 5543 %%EOF hypre-2.33.0/src/docs/usr-manual/figStructStenc2.svg000066400000000000000000000142631477326011500223170ustar00rootroot00000000000000 image/svg+xml(-1,-1)(0,0) 0 hypre-2.33.0/src/docs/usr-manual/figStructStenc3.pdf000066400000000000000000000141471477326011500222730ustar00rootroot00000000000000%PDF-1.3 %Çì¢ 6 0 obj <> stream xœÍUMO\1 ¼çWäUqã8Ÿ×JRoÀ¹-±è¡¿3~oY­€ŠJ=À›uÞØžŒíìcL¢1ñY×í.<†/—%Þý ïñÿ3”$}έÊäšµy^ž~„+À¾‡ýëÞ¶w!ë4i«ùÐ>Ž–q„XmBzØÈ9-€Å,E ‘°bá9¤±ÚE—Ü„Ó(Rß ¿>} ¸~âÞY.’4GÍÍùܼÎ'ý%yz_¦o›x)Zîñù³X|º ªm@SUp©J‘¹Ñ&vêºZ–Ö±ö)Ó°&“Y±¶,#ÇmÐÔ«(‘¥:’v.Žä x æpd€„Dô"š3‰Y<"øí§Wˆ_ž|☌/¿÷ôñ€vI•S ™ Ië³å-ïñ<´‰ýZÔÄ ¼M2怰ïÂô©@6Ã;`¬/óP³{žÜ¼ ç¡÷‘߃닜ÿ)o4U¶Dý›Óœ'%Ô¬¨ •Â'e<ì :q[ÀÎPp@;F­bŽ.µGÚ =bD‰ yGñâ &_¤ÌKJ¤Jµx‰ŒÖžÍ7/;\ Òý呺ôÆäRŠ_Çãw5Š0:«^IU mN%gÉû0)JíºI-±kNŽT¡Áuº SE{l”mQòd÷0e–NFÛÀ˜u²“ÉqDÏiDÔN…œŽ&ki̓ñôïÚt/ úŸ²è²”êÍÂûntHBÛCÐy Âí‰*Z4´]-´É{‚³Ù>825C‹H{°u4¡üÝ=:+5¼Ã¶!k÷óß2hh’W{eÔM>>É«pç’ïˆPendstream endobj 7 0 obj 674 endobj 5 0 obj <> /Contents 6 0 R >> endobj 3 0 obj << /Type /Pages /Kids [ 5 0 R ] /Count 1 >> endobj 1 0 obj <> endobj 4 0 obj <> endobj 14 0 obj <> endobj 15 0 obj <> endobj 12 0 obj <> endobj 11 0 obj <>stream xœ‘ÝKQÀgÔdÉÍÒÒ”RÏ“hk‹B>,ᒰʲ­$aÆìÌÝõÖÌÜiîÜúÀˆZÆÊ(‚¢m!ÈD—^zé¡Þ|¨ÿ !fÖ êÎnhÐ[oçÞß¹çwÎ=¢PW#ˆ¢Ø6:ÇB ¬!z|˜¨Ê8“T,ûì˜{DtÖ¸µÞŒ÷i;³=½§Cˆæö¹A!_.6»n“»µßÝ> endobj 8 0 obj <>stream xœ’_LUÆï°tÙ"ŶºÍ¢²œ¤U¡lI±‰q±þi!¤« ÙÐ’Öš6½»\ç΋ t{Y C­›*Ä’hZÛF­Ú&M@Ó¾4Q|PŸŒÚD4w–ñÁYÐbâ›oçžïÜïwÎ=W@ÅEH„û[÷li©=D’˜î ¢L¤B~§õ `=TdUºì§ì™•‘•Ý*QøÌÆM–¿ ½½2½5/l±~¿×º³yÍ(+œ>+BÕím‡kjkª–ÖI¢Ã€ú`0Ñ4ü­@¦$¡À#NЉeUKbŨƒƒƒÑ!Nd ‘öýáP#Tï“ÅXŒ(Ь;j$uZƒ0‘°Bq ÄUäµHª#QZû(ˆ@5,QÜ-a­ @Ãz’PêÄ@($tQ1p ˆ"É©Xïäãªb€¦«ŽžtÇ*¢RƒJ:Ñ pˆ‘¦æµÑ(p)qdPãNeL•R…iîj†H î6 œ(†¡š,¦®c¥édµ…%Jb'D=&cºê[x•õùà_S‹š&§W磌UwùÄ XŽ×µ’d4E¡MMŠ ´ªACN¤dQ‡µ=ÿ·`}mÿo‘!÷îúêšÀ.„¶ ­h#*E›P9*q¾*FQô…P,4 ª0ÌÇÊ­“óù’Y-óË.þSþ ¯]oìn»ßö-í¹sñ‚9w¡ê×Û_óÆwxøc‘Ÿwú‡Uïçï{Ò~@²ƒmWáP”gžö—?ùþ«üÅ«?V-,}0÷ó8îÌÌ{sÂÇÛø¼ùªûhçg§ÆÏL¾[•ÌžðñíÖ[ãfvŠMTŒgÆN² ;uÊ¿··>aC™LEoÉõį̀ÙϺ*Øë™Á‘´íÿsÀ×ïÜ;ì)ç?ä+s»åâ{ìFoâ·þEö ãeçøŽËÜ5¿<åË›¯™>{›]z$$n%<ОaOO?{¶ùͦ¼úÇŸ¸å:gðòÍ}ºt‰ ³_M/²ÛìúÐRßž›½ Ç¿íñ½ß`6°G™}±”ç’bëóŽÃØ„íõ~wåò5vÍó¡>÷’’êÒzN¼Óã7û&†Ø Ó ípGÅ- ü<ŸôÚª»/¼kîò®œÕ”ãÇrî™Òoî™™*+Cè/îÖŸ endstream endobj 17 0 obj 876 endobj 10 0 obj <> endobj 13 0 obj <> endobj 2 0 obj <>endobj xref 0 18 0000000000 65535 f 0000000997 00000 n 0000005680 00000 n 0000000938 00000 n 0000001045 00000 n 0000000778 00000 n 0000000015 00000 n 0000000759 00000 n 0000002465 00000 n 0000002187 00000 n 0000003446 00000 n 0000001444 00000 n 0000001195 00000 n 0000004559 00000 n 0000001122 00000 n 0000001152 00000 n 0000002167 00000 n 0000003426 00000 n trailer << /Size 18 /Root 1 0 R /Info 2 0 R >> startxref 5809 %%EOF hypre-2.33.0/src/docs/usr-manual/figStructStenc3.svg000066400000000000000000000177271477326011500223300ustar00rootroot00000000000000 image/svg+xml(-1,-1)(0,0) 0 1 hypre-2.33.0/src/docs/usr-manual/figStructStenc4.pdf000066400000000000000000000145371477326011500222770ustar00rootroot00000000000000%PDF-1.3 %Çì¢ 6 0 obj <> stream xœÕVÁn1 ½ç+r,B'qrEB•¸A÷ØÛB+ªöÐrà÷yÏ3;ÛU誛:ób?¿ØžÞÇœ$f~ÖuîûÏ5^oðû-Ôœlε¥ÉµH¯i[¾† À>†ÃcëÛw¡ÈÔÔW󠃩ã±Ú„X›Ø(%/€Å¬5)<;`ÅâäHˆÕ®²Ä&ä>ŠgtXöwñý9Á”wW”? (JOÉiÒwwáìòìÕî&0Db÷%œ½ýuK¸u0ÞШ©=~ùêWÀå÷Þ–š²”(¥;Ÿ/OóÉžŸéÃ.~‚½Xܾ«Æ‡ë Ò4—&™}b§­«–Ô «Í4kÖ4Ö^Ò(q$[KBdmޤ]ª#ù…$ÏÄN‡tˆ§H€æÌI5žüêõÄ?ŸÿûÄÑü@+4¾.ä)›Å^óÂdz*« /ø¡¬üÕö– ÃÏCŸpÒêâr"C/£²Âr¼Ó»GÏ€Q[0êq§9©ÒA5/ANÎݺþˆù—¼qz èŠfÞOO•Τ”I‰¥nŽJ¢Å³Ðö+Ÿ˜&° Ж^[§RÃR³H»£æqYÕ=ñÄ„‡Œ¸£úåÁ'äBKH„Ê­z ­5š¿.z.×)‡á’-YgðT«—Óö<¶"EVün1)3U ­N¥”T4ÚÐT…Ú™¦V£II2œ*R…Ž£ÓU˜’Äb§l‹ §ø Vh52Úúl“•NŽ#zL%¢>rz¹ æò£(€üAióTßв) -S‚M©È\+€ ƒ¶)ë&€Py$€»ì[þKDÝòDédô,Íy4^Pµ>Ò¥üF ^ÛÚôd¡­ðƒ¹a̪òZ™•€ìШh¾F™„·7A\16lpÊ´‚Šˆ´Ó“Œ&0?a.“÷Ù>Ðe3'èoX2è詬öʨ*ãü? zqzghŸã<õw7”ñ;†<êa´¥âXOœ#C ÿ1êŠÅ@EÙs-“¡ÛÕßðdË‰Ê 3K~€.½ÃÀ žÆŠËÃ59¡ôDÍý”/Â'|~E¼Áendstream endobj 7 0 obj 823 endobj 5 0 obj <> /Contents 6 0 R >> endobj 3 0 obj << /Type /Pages /Kids [ 5 0 R ] /Count 1 >> endobj 1 0 obj <> endobj 4 0 obj <> endobj 14 0 obj <> endobj 15 0 obj <> endobj 12 0 obj <> endobj 11 0 obj <>stream xœ’]HQÇgÚ²!ÍJÓ´=O¡­-k$±T„®I «-º–„³3w×[óÕÜ»ºk˜aDÉØEPdKA&A!m½áC/>‘ôQAwt‚š]#ƒÞz»w~wþ¿sî¹<·xÇó|E°c÷î®fo«ˆlnÒ9DEK9¶É^ÇÛëÙì,ŸâÖt¶ï¯õz낺‘6q¢—B} €X~hF'4Øè.ú¢*Ò¨:Ú‹ Ž‘Φp(5Š(ËXƒÓ¥‘dÌ- ÂXBAµ×MPæ7 隌)Ö5âƒF"IXT¥$dä@ÈT1!î0„)jÉ@uÀš¤$åœÞý×5 †©»\u‰Ñ %’‰ ®1ÒÜ2_#íiÎK°‹A»'e]Jæºùèˆ5¥hÎC cb(bÚõºQ†‰ó%$ Ö ö:0QB4e‘|nîVúƒ¿º CIçÿÕó§þø1%H‰ûÚ°Kh×UQƒ6=ahE2Nª0?æùÂÔþoŽÇyüõ[8nW•æ·˜S¸|1;WlŸœ˜-à­¯63»«,jEöôy[Ë©œÊé­Ÿe¯N<¨úòê Y¬^`#ýU#ZÙÝ1£'uúÈÉxõ@Ã'J÷öj(f jÿíìôS6ô˜•WO~»“´×cef×dø åìó­‚£éKÖ¤uyô•,óÙÏ*üÉðqG¡ãç¯Þ°„»×N$O W;«ˆª© U™Ka»ïÏÞ³µ{ë(3 Pˆî´§¶€u±ífž¼µ^U~¾ôíëî—UiG½óæPEöÅÃñ)Kx~?Öâoó;goµª¨ªª Äö,-îÏØÖ)_ÆŠ Ç/qÜ/•^“ endstream endobj 16 0 obj 732 endobj 9 0 obj <> endobj 8 0 obj <>stream xœ’_LUÆï°tÙ"ŶºÍ¢²œ¤ÕBÙ’bãbýÓ‚¤kW²Á’VM›ÎÎÞ]®ÎÎŒ3³À"$Ý^hÀ§ÖM‰ Ò’hÚÚF­Ú&M@Ó¾4Q|PŸŒÚD4w–냳 ÅÄ7ßÎ=ß¹ßïœ{®€Š‹ ÷‡·<ÚW{$±±3dŠ2‘ ùöƒ‚ýP‘]éâOòéåáå]ë*Qøôú ¶¿ ½³<µ9/l²¿×¾³qÕ(+œ>+BÕm­‡jjkª–ÖI¢Ý„ú`0Ñ4ü­@6HBGœ ˪–ÄŠY/` f;†8‘1DÚö…CP½Wc1¢@³î¨‘TÔi ÂDŠk ®ê ¯@R•1‰ªu°× KD”wIX+аž$†áÄ@ Hè¢bâ˜*E’S±ÞÉÇUÅMW=é(ŽUD5LCÒ‰f‚CŒ45¯öh¶‹fkG5îTÆT)U˜æ®fŠD1ÀÄ]fÅ#†&‹i‡ëXi:Yi!e%±F€Ž¢“±±â[x•µùà_S‹š&§Wîª+UwùÄ4°¯k!ÉhÊ€V5)*Т! ­8‘’EV÷üß‚µµý¿E"„Ü»ê«k;Ú„6£õ¨m@å¨Äù"¨EÑB±Ð,¨Â-·ÍäKfºÄn,¹ØOùǽ¼žxïã¾ÅÝw.^°f/TýzûkÖ@Ù6{4òóÿêýüý#Oð$l}¸ ‡¢ä(õ´½úÉ÷\e/_ý±j~ñƒÙKÔã¸S+ïÍ oasÖëî—:Þ:39vz⽪ìDöäÈèȸmµOYÙI:^1–=N3ôÄ ÿžžút†fú3=%׳Ó#Ví¬ of†ÓÜÿg¿¯/Þ1°gÈSÎ~ÈWæzËÅvóFoâ·¾ú eegÙ¶ËÌ5·4wåË›oX>¾…—‰[_ ÷?OŸ¦OM=s¦ùíc–<úÇ»å:Ë÷{ÙF†>]üˆ 3_M-ÐÛôúàbïî›=óG¿íök°èvÊï#ü±Ay.)¶pFǹ×ûÝ•Ë×è5χúì+JªSë>Ùÿn·ßê¤T3µCí;¸ °ólÂËUwoxÓÜå9»)ÇŽäÜÓ¥ßÜ3=YV†Ð_ûAŸ’ endstream endobj 17 0 obj 876 endobj 10 0 obj <> endobj 13 0 obj <> endobj 2 0 obj <>endobj xref 0 18 0000000000 65535 f 0000001146 00000 n 0000005928 00000 n 0000001087 00000 n 0000001194 00000 n 0000000927 00000 n 0000000015 00000 n 0000000908 00000 n 0000002713 00000 n 0000002435 00000 n 0000003694 00000 n 0000001597 00000 n 0000001344 00000 n 0000004807 00000 n 0000001271 00000 n 0000001301 00000 n 0000002415 00000 n 0000003674 00000 n trailer << /Size 18 /Root 1 0 R /Info 2 0 R >> startxref 6057 %%EOF hypre-2.33.0/src/docs/usr-manual/figStructStenc4.svg000066400000000000000000000233471477326011500223240ustar00rootroot00000000000000 image/svg+xml(-1,-1)(0,0) 0 1 2 hypre-2.33.0/src/docs/usr-manual/figStructStenc5.pdf000066400000000000000000000152511477326011500222720ustar00rootroot00000000000000%PDF-1.3 %Çì¢ 6 0 obj <> stream xœÕVMo\7 ¼¿_¡£S4ª(R¢t-Pè-É}s#A|°{èßï õv׋8FöxaËÔòc8)=¤’%~öõö~{Ø~{kéîïMÒ'ü~ܬdŸs$myr­Ò-Ÿ–Ç¿¶wPûs;~í½`û~«25÷]ü ¥£±q¡±ËTñ6±QkY K4Ë Ï¡°ëÂrdƒÆ.›¬ØTyH—Ûûôû9A”‘6(–R’ž ’Ó¬=î·«›«W‡O“AThÞoW¯¿Ün…_)Xnߨ~óêK…›Gî½®–‹Ô$µž÷Ïã)//ßéCz*zõtúkšï6‘>À©°4!ÉÜè;m_µæîX}æ©X‹æÙ°öšGM·›oY¨i-4)W MþA’P/ÀBé  ­€â,Y5]‚ú‡_žþöúÇŽ¨øçŸ#||6¾fñ\uÈVúÞÏ&k¥±w¤r¡‘œ¤h©{àh“¡#B„ߌt½õ »fËË/qøê®VÒÝ6£×`ªoª/PÓGíK@P-+È…Ýç¨bþOÞ8spT«Vµg æj,ŒTA½É?Cúþ±L3rE]*B¯­“©á¹y¢ÜÑ)(±…'ZLx(ˆ;,JŸü¢TºX!ª4‹ƒsF´ŸTÀüêHÒóHꨠGRñìÁ³Y ¥Ë¦>70I^£¶˜¯…,PÖ€Rk®š|h6!w®¹Yr©YF@…!Yè0Á”,ž:i[,€ž*<׿Dt»Ñg›ìb)b*5š“á3¦ïgÁƒ~ô 6/ˆ ­'¤Rpb@ ™ËSP0Pà' c=*O—ý”ÿЍ§üŸ@úÇÀì õ%*. Çô«Æ|Ù Q8Û` ³×5ÔŽE-ƺ Ç(²î‘–eG=ç Ð}0û5øŒ}ÛÙ“hFÔÔ'²®Xx.†õšvgáñ{cðZô²s¢_ãDœÓBÙÝ1ÿ(W>%p°ƒÜ÷ëÖ™Yp…Œ|0³ƒÅËsXLxÉXÕ%êKëxÌYWØÅCóÀ8s‚Cï é)¤:1?ÌuXÛïœFRÊ*444ˆqBbœû¡ˆßR¸Ç£Å äƒwT«.‰ò D)˜§Ž‘}»Ñeóè€xâA…žë.ïˆú±Ç® ¸¹Æ<߯ñNá†2dG¡£­yÅiÄ[hài „àìO–ÑGÔ A…õ§'_ë9 è2æ3`ÀÓØõÊ. í‡óÇGùn{ƒÏ¿À|}¯endstream endobj 7 0 obj 1000 endobj 5 0 obj <> /Contents 6 0 R >> endobj 3 0 obj << /Type /Pages /Kids [ 5 0 R ] /Count 1 >> endobj 1 0 obj <> endobj 4 0 obj <> endobj 14 0 obj <> endobj 15 0 obj <> endobj 12 0 obj <> endobj 11 0 obj <>stream xœ’_lEÇw¹¶®R‹´=hQî~OMëÕË©¦þ -i¸p=.DZVÈÞîÜutÿug–Þµ¡ÁË¥1Ê¡biH¨•Aˆ‰!‘¨¤‰/Æ 1M4f¶]£îµ†šøæÛÌ~f¿Ÿßo~Ãs«8žç¢É]Éäó¡Vy¤SWä(,•ÙÃ΃¼óÐ*g£Ïíw¿YÌ-î®ÜÈÅ&Vß調‰Å7j?×:¿¯qæX;Ê_à¯ð5÷&Ÿk …Z»t#oâì…¶ŽŽHçá[ÁY š¼Å>¤è†Š4†@Á ‚Dog,ÚÍ[Q–±ݦGVÚ+ bXBA-ÑMP–7 隌)Ö5†-D ’°¨ÊIÈ(ƒV0©bB¼5`YSÔ(’ê€5I±ä²ÞûžÑ5 †©{\õˆ•Ð %’‰ ž1±µ{¹F: Ò²—`ƒžñNʺd•»¹Ë¨ˆ5åhÙ“F cb(bÞózQ†‰—J°Ö²+öV0QV4e‘¥Üò­¬ôÿêZ4 %¿ô¯¾tê®S‚”L8ŽÕ´E ©«¢q½bЃdl©°<æÿò•©ý¿9rWiÛô(Ç­åj¹:®ž«ôÞWÁ)ÜE¾†/°×jœW÷O-ÔMñö¯>v{áYÊN îy1êqÛm·Ypolþùré­©‹ù[ß±¨ÍÚÖ”ø)(hþóƞܑ—e‚Ãí}nŠn{)¤¡´-¨Cï—n|Æ̲uÁ™ßΕflÁóØÅ…õEþØ:öË»UOåÛ3ö‰±c'K,ì\kˆX±QW.ІÉ×O¶…óo¿b., ºõìN©¹.»±œÂ|ξxö#Ûàsg;ýfŠÒýOÛ‚ÛRÅv³'ïÜþdξÕx§ëëð®þ!io@!zï;JŸ_š¼b ×§ÓÝ‘xÄM¸;‚ª¢ªª&Çw—=ZrænÖ²«lÍfæ__÷=«góþË…ÓGÞ%g_°· ›ú:ã##ãÇ GŸ>K§GNÚB–X¸ïSe޵3?»—5}9ôaò£à›ã•u_Ýœþàã/6|»ýúcOÄ¥pOàÌè¥kç&fíÆ«RÏìèsýF°f¨èôY±jò>V½zr¼ºšãþFºw endstream endobj 16 0 obj 878 endobj 9 0 obj <> endobj 8 0 obj <>stream xœ’]LUÇï°tÙ"ŶºÍ¢²œ¤U¡lI±‰q±~T¸º’Ͷ?Ò¦³³w—«³3ãÜY`’n/ 4`ˆÓÖM‰ bI4UÛ¨UÛ¤ hÚ—&Šê“Q›èƒæÎ2>8 ZL|óíÜó?÷ÿ;çž+ Ò$ÂÑŽ'6wÔ")L÷„ Q&R1¿Ûº[°î)±ª]ö#öìêèêÞMÕ(|zóË_N­Îl/Û¬ßo·nn]7Ê ç„ÏJPm{´£®¾>Ьj$; h ƒËÀß ´`J’ Üç]XVµVŒ8ˆ1DÆi"j†Ú²ZuG¤cNk&V(®ƒ„ªƒ¼~IUâÄ ªBਆ%"Ê€{$¬…hXOJ…¤.*Žƒ¡Q$9/â|BU ÐtÕÑSŽâXETjPI'š1ÒÒºÞ£Ñ)E.%Ž j©Œ«Rº8Í-͉BÁÀ=F‘Ã'T“ÅŒÃu¬4¬µ¦DInР㤨ÇeL×|‹¯²1ükjQÓäÌÚ]u­êŸˉ†6’Š¥)DÕ”¨@›„0Dq2-‹:¬ïù¿kû‹D¹÷6ÖÖö ´ mG›Q9Ú‚*Q™óEP)Š¡/„R¡UP…>^i™+”Í l…_]qñŸ yíF;`÷ضoyßÍΛóçk~½ñ5ob|—‡?ùy·Dõ~þÎá‡í»$;½·‡bäó´¿üÉ÷\â/^ú±fqù½ù™ÇqgfÁ›>ÞÁÌWÝ/t½qfzâôÔÛ5¹©Ü‰±ñ±Ißiœ0sÓl²j";~ŒeÙñãþý}™,Îf«úÊ®äfÇÌÖ]Å^ÏflÿŸƒ¾D×ÐþO%ÿ¡PØußg7{“¿ ,±_¯8Ëw]à®…•…‹_^{ÍôÙ;ìòçBâÎWÂƒÏ²ÇØ£3Ÿi}ó¨)/†þqàG¯»ÎÚOyùVŽ>]þˆ s_Í,±ìÊðrÿÕÞk}‹G¾íõ½Ûd6±û™}±|”§SbÛ3ŽÃø¤íõ~wñÂevÙó¾>ÿ’’îÖzO ¾Õë7û'‡ÙÓ ­£³ˆâ‡–~ŽOymÕÝÞÄ5wewÞjÉóÃy÷lù7·ÍNWT ô`-Ÿ« endstream endobj 17 0 obj 876 endobj 10 0 obj <> endobj 13 0 obj <> endobj 2 0 obj <>endobj xref 0 18 0000000000 65535 f 0000001324 00000 n 0000006258 00000 n 0000001265 00000 n 0000001372 00000 n 0000001105 00000 n 0000000015 00000 n 0000001085 00000 n 0000003043 00000 n 0000002765 00000 n 0000004024 00000 n 0000001781 00000 n 0000001522 00000 n 0000005137 00000 n 0000001449 00000 n 0000001479 00000 n 0000002745 00000 n 0000004004 00000 n trailer << /Size 18 /Root 1 0 R /Info 2 0 R >> startxref 6387 %%EOF hypre-2.33.0/src/docs/usr-manual/figStructStenc5.svg000066400000000000000000000270221477326011500223170ustar00rootroot00000000000000 image/svg+xml(-1,-1)(0,0) 0 1 2 3 hypre-2.33.0/src/docs/usr-manual/figStructStenc6.pdf000066400000000000000000000156271477326011500223020ustar00rootroot00000000000000%PDF-1.3 %Çì¢ 6 0 obj <> stream xœÕW1oœ7 Ý¿_¡Ñ)U%QZ º%¾Ñ›Ó âÁîпß÷(}w>Ä6·CœC,SG‘Oä#)߇%$~Özs·Ýo¿},áöïMÂWüÿ²•mŒ´ÆÁ5K+ñ¸<üµ]AíÏmÿÚZÂöÝ–ehlKü¥ÝŽ”~¦±dªXØÈ9M…)––]aéâdK.2}Så>ˆßh_nîÂïÜ ¢ôpø¼á€òßT ÒbÂå4j ‡»íâúâÝáëÆËÀ+4Ÿ¶‹÷ßo ·váW %ÖT¿~÷½Âõ÷Þç“ä ¹9žOOãI/8O?æéCø€P´láø³hx¸ÝDZGLE€¥ ƒÌ6°Sת96Ãj#Åš4ŽŠµåØs¸Ù$YBÍR]“r.®É¸$ÔS0W§AHpÄS@q¤¨ÎAýó/OÿxùóG düòχ¯á¢Ó¥£ž² ¢²Sú™Û.51¨•ÔŽõF{ØÞÍÊQòR’¼ y!uínÍeÿކ˭ œ« Ü@䜞y©¥p» ¯FUG2Ô¦Žº«aŽ#·)À©¦éäìÜ7Ï+|þOÖØ•@欉¡l±xrLd#˜!´Ž$´‡ýÂDt)È™ëÈ­ÖÆHu‹Õå†Z Š[≠~{qRÀ&¿H™&¦K¸Jµ8µNˆ—óÙ¦¥§¦ÕAÙ›V²hÎc)Þ¶ÎËþTâ B·ì¹ENŒeu(9ǬÁºÆ"Œi¬%˜ä(ݡ⠣Ðptx†D±Ð¶„'û 2¿Ýl´Y+ˆ{pŸJjŒð Óë£`~Ð0Ó £ÞÛâA<^QÊ<Ð;‡Ø&etÅýêðñ@:2m Fࢌ@©Vž' Š 4‹©–h`:„£’ã,œ!:ëi³)œ„‡×±£á`¤Ì¡V^ Nçôð ÍGz8È"GzÀn^L^ô›Á;Ò2Ö#;ü€Ê#v¬{ïä˜õHŽGvv\¾®NJyD‘ü"E0o­ï!Èê-¾7F@ˆÄØ'†0:çÂÎâ^}r  ¡?tÅÍ›_ <E6^@›h˜³£°±µÂ0Øô¨¡Wæmcâù/=¢ó aiÝ^Ÿ»½§²Ñù( œùî‘ýîxa–FèŒ'K2cÀùÝ‘nÅ3 ÃS,¸ŒUM<›ÿ¥ýÏendstream endobj 7 0 obj 1174 endobj 5 0 obj <> /Contents 6 0 R >> endobj 3 0 obj << /Type /Pages /Kids [ 5 0 R ] /Count 1 >> endobj 1 0 obj <> endobj 4 0 obj <> endobj 14 0 obj <> endobj 15 0 obj <> endobj 12 0 obj <> endobj 11 0 obj <>stream xœ’mlSUÇ若^Ü²íŽ ¥=áò­³é`ÓLQd#“Æ®4£Sœr{ïiwô¾ížSÖnaæe`4Œú‚c!0'e~XTHü@Œ†D|!Küb še‰&ž»Ý%zÛfâ7¿=çüžóÿ?/‡eV¯bX–­Åڣј?†ˆkÓd)D‰Ö`=ÂZ®²6ºì^ûûÅôâ÷F&šZ[[A<þ!`Ä(©‚Z'ØeMW J`7„€ôA@2Ñî¶p¨Ôm—IB*è0MÅÒ@‰PŰ$4ÈË jª„ÒTÛ1Ö¡ˆÀ´õh:4„±„AÒT%@4€TQNI{ç>¡©è†æpÅ!ŽTTÃ‹Ò p£;:–k$})øbä` %œLIS…nî3" Ó¤à‡@BX—…ŒãëHé*–ÂHM®¸7&C’!.ê¦²ÒøWׂ®Ë™â[­˜uß åD ‚”x ƒ.MTÑZAtB ¥°¼æÿò•­ý¿=2 ã6mÞÒÌ0ë˜r¦‚©dxÆã|f5#3—Ù26ËÞ¤o”YÇL,TL°æï.zwa3cý{_ ø;íÓ®ãìš[Í¿Mçßž¸ì¿ó# ™´‰£µÑ_ƒÞ¬Ê_Ó÷¦¾v8álé±cdç«~ÆMNø0ë zp†Vù¦þ8ŸŸ29ÇÇÌ-¬Ï±'ªèÜûž­#™“æ”yjäÄé< X׫ƒ©ð°Í fIõø›gFΚ܅w^OÉÊòÙ•KûcJºÝ¬)¨P—µÿg–þB7¸¬'ènÞðÀ9ð´ÉÙõº‡>uïîg³æš{íß^è÷yÕþ!¬u¿w°:óÊøU“»1ïF‚vÔÞåSdEQT[®íá¼5{»œ^£k›)¿¾â'ZIçùéìÙ£ Ïàs/›;¹Í=m‘¡¡Ñ“‡½ÙãGN ž#“C§ûM.‰S¨çsy–¶Pž®¡µ_ |Üõ‰ï­QwÅ7·'?úôË ?<ãñ'#b Óûîð•ëçÇfÌšk—úbÏìê±yÝW­š³¶äXë%:Âwxh‰õœ;ìYÚ¶ô¬¶ÉMyâvƒ›Vz¦iƒûkÏÒš9žNÒ‹[í‹î²œÕ£½9Ïøƒ´´d|´´”aþœ`» endstream endobj 16 0 obj 938 endobj 9 0 obj <> endobj 8 0 obj <>stream xœ’]LUÇï°tÙ"¥ºÍ¢²œ¤U¡lI±‰q±~ „tu%›µ¤VÓ¦³³w—«³3ãÌ,°I·—0Ä©uSbB…XMÕ6jÕ6išö¥‰âƒúdÔ&ú ¹³\œ-&¾ùvîùŸûÿsÏPi á®è‘p¤9Zˆ¤°±7dŠ2‘Šù=ö=‚}o‰]íâòÙÕÑÕ}›ªQøÌæ-¶¿½¹:³£ l·ßjßÚ¶n”Î Ÿ• ÚŽèáºúú@‹ªet’ì4¡1 B,+Њ ’Tà~'貪¥°b6À³ƒÙ‰!Ad ‘Ž'á¨m–Åxœ(Ц;j$sZƒ0‘°bà:H¨:ÈëT%NL¢*F4 ‚¡a‰ˆ2à kE!ÖSÄ0œˆI]TLS¢Hr:^Ä;ù„ª˜ éª£§űЍ†iH:ÑLpˆ‘Ö¶õÍNÑ,r âÈ &œÊ¸*¥‹ÓÜÖL‘(˜¸Ç,rbâÄÐd1ãp+M'k-¤ ¢$7èÐqRÔã26Ö|‹¯²1ükjQÓäÌÚ]u­ê6Ÿ˜– í$KUS¢íjÂÅÉ´,ê°¾çÿl¬íÿ-!äÞ×X[Ø‹Ðv´mFåh ªDeÎA¥(†¾J…6AFØx¥}bd®P6'ÐvmÅÅ~*<ìå<À{ø÷-ï¿õÁkþBͯ7¿fM”íö°#?ïñ¨ÞÏß9ú¿[âÁè}58#Ǩ§ã¥O¾ÿã2{áò5‹ËïÍH=Ž;µ Þ¼ðñN¶`½â~¾ëõ³Óg¦Þ®ÉMåNMúØ.ûô„•›¦“UÙñ4KOžôèkÌdépv0[ÕWv57;f Ðî*úZvh4Ãýú]CF<•ì‡Bu^ 7\l?oñ&X¢¿PVqŽí¾È\ + —¾¼þªåã;yùs!q×ËáÁgèãô±™'ζ½qÜ’Cÿ8°ã7\çøA/ÛÆÐ§Ë1aî«™%z“^^î¿Ö{½oñØ·=£¾w›¬&úåwþÐPžJ‰íO;ã“ÜëýîÒÅ+ôŠç}}þE%Ý­õž|«×oõOÓ!ª™ÚáÎ"ŠZØy6å媻?¼‰iîÊî¼ÝšgGóîÙòo¨@è/\:Ÿª endstream endobj 17 0 obj 875 endobj 10 0 obj <> endobj 13 0 obj <> endobj 2 0 obj <>endobj xref 0 18 0000000000 65535 f 0000001498 00000 n 0000006496 00000 n 0000001439 00000 n 0000001546 00000 n 0000001279 00000 n 0000000015 00000 n 0000001259 00000 n 0000003282 00000 n 0000003004 00000 n 0000004262 00000 n 0000001960 00000 n 0000001696 00000 n 0000005375 00000 n 0000001623 00000 n 0000001653 00000 n 0000002984 00000 n 0000004242 00000 n trailer << /Size 18 /Root 1 0 R /Info 2 0 R >> startxref 6625 %%EOF hypre-2.33.0/src/docs/usr-manual/figStructStenc6.svg000066400000000000000000000324541477326011500223250ustar00rootroot00000000000000 image/svg+xml(-1,-1)(0,0) 0 1 4 2 3 hypre-2.33.0/src/docs/usr-manual/figStructStenc7.pdf000066400000000000000000000155771477326011500223070ustar00rootroot00000000000000%PDF-1.3 %Çì¢ 6 0 obj <> stream xœÕWÁn\7 ¼¿¯ÐÑ)U%Qº(ô–x¾m£A|°{èïw†Ò{ö"‰Ô=¸6l™ZŠ‘£‘|R”ø½ÆóÝv¿ýò¡„Û¿6 ŸñóçVR´1zÐÇ,­Äcxøc»†ÛïÛþ±µ„é»-ËÐØ–ùN{)ýÂcÙt±:0‘sšÓ,%*"»ÃòÅÊ <–]dæ¦Ë}ßÑ>œï¯'ì ¦ôpú´aòk:i1asµ…ÓÝvusõæôyãf§ÛÕÛ¯§„S»ñ3ëºß¼ùÚáæsos‰IrÜÏÇoãIÏ$O?–é·SxR´láø]4<Ün"­£¦"ÀR…EæD˜©kÔ›a´‡bLGÅØrì9œ7IV£Ð³T÷¤‹{ò6 ÷ÔÌÝqÐ)ª† @pÿôÓ7€x÷úã düñ÷æ3ˆÚ™ÅN[pˆò$ú>#†™Ã£¤vœ&.ÅôAk­_‰ý˜tíÍmÿœ0Rx·µuuᨋ“//·n·ág KÕ‘ µé£žj˜ãÈmHªi&¹X÷Å»†œÿQ4j¨š5±j-/R΃‘,è7ëaHÂx˜/lÓ€ÁÎèKGGµ6Vª[¬h7œ´¸x$®ˆ·o9bòƒ”b¦DªT‹çÑb*`~W’ôQ’:(»$%‹Ö˜<–â¢ty¨0‹Ð-{o¡¯‰U ­%ç˜5X×X„µ3µ“¥;T,d–¯Â(Ë6«€òd_¡B^#¢óƘuð|cžSéQ~Äôï«`^~Ðg 0Û ã4·Åƒ¹¼â vò@Gì”z°MÊ<®û«ÃÅŸ<0è-c F`£¬@©(Vž+ Š 4‹©–`&D¢’—U¸@ô24À÷d^Nå¹2ÔqIŸÐ|Áá9ˆ€¸yqv¼ì lŒ|ʬî4˜õ ÁH/¨B)OˆŸ%îLëûö³ºL÷ÆÝ QÕ`w¯SÛw®öêê± tÅ®›o l±{Ê+@ Zçî§þÊW+Ü= ÍŒØc.ÏKÐù°´v¯ßÛ½åQ)g.ø´3ßN «ïÜc¥:ëIÂÃr\R¾w´Zñ”Âk)¸QM¼“\P ‚)óîCñr‚ЬC0xàLiO!å1Kð€‰«µ®Ëœ3 ¤­Â¥€…cP(‡Ž솼(hQ‹‡“CqÝZç… ùH#Ðî„' —‡ù óîúýtÞ²šóÜß³DÐܡżì…héÉëy½·Û_ý–Θ.ÌÅŸW#¹  }ú#$ôÇû'ÚÔù߆çžo°.{ÇG´ÁŽÏ†6\ Ww9ú ‡Få¾À¤´|Ý8QÎ>_qþ¾å„²ƒ­Îäu <囯—Ž×#¯#1 “Z÷マ'öØm?FŒdsEq©3¿¹<¤ßëè*"õå—º³êÒ*æëGy½½Ç÷?Üæì5endstream endobj 7 0 obj 1148 endobj 5 0 obj <> /Contents 6 0 R >> endobj 3 0 obj << /Type /Pages /Kids [ 5 0 R ] /Count 1 >> endobj 1 0 obj <> endobj 4 0 obj <> endobj 14 0 obj <> endobj 15 0 obj <> endobj 12 0 obj <> endobj 11 0 obj <>stream xœ’[lUÇgXvl-ÒvJ‹²{âCÓvëf ­¦Š"-©4l·›v«X+dvöìöèÜ:ç,ÝmC1›)BÁh,ëKC V–úШø@Œ†D¼&¾ƒ¦i¢‰gÚi¢³[CM|óí;ç÷ÿÿ»–Y»†aY¶rwgk¤»ÓA Ä·hr¬ˆ2’ò¬Îz„µ]cmvÙ}ö÷K©¥=îÍLp¼è!ËSÌŒ/}WºÈn°þ\o-<¼"vœ½Ä^eÿªééz±Öç«oÕô´ý4477ƒhüCÀNˆQBÕN°Êš®@•øA7„€ôCG2áž–`{+¨Ù!‹±RA›áÐp2ꔂH‚*†µ ®@^9IScˆ MÅ~°`JH”LIPσz CCA;1@$ Q%0ˆ*ÉÉXÞÞ¹k*º¡9\qˆ#Ö0Á’tÇðζ•I¿Hò¾9hq'3¦IÉ|7÷‘Š)’÷‰BCX—Å´ãëHé*”ÄHM¬º×&D#&C\ÐÍOeµ?ð¯®E]—Ó…·Z!ë¾?"Êq)Ñ$]š"ª ¤5ƒ è€1”TÀÊšÿËW·öÿöÈ0Œ;аek#Ãl`J™2¦œÎùÌZFf.³%l†½Iß(±Ž˜\,›dÍß]ôîâv!bFö¾â÷uØM¦]ÃÛU·›É½5yÙ³pçGÚnÒžV‡ x2ªpa\ß›:úÚá¸w¨©×Ž]¯úT5yeðÃÜ­/èÁYZáþã|nÚä3»¸1Ëž¬ óïsÛFÓ§ÌióôèÉ39ê·®W’Á›Êʉ5ù o¿ž<’9”9äµË—÷ E”T«Y•W¡.kÿÏ,ý…nrYOÒnÁà`;9ðŒÉÛµÝCŸ¾w÷³9óNÕ½Öoý/ô Jû<êÀ0ÖzÞ;X™»yeâªÉß˜Š¶B;lwzYQ•Ç–ëG{$gÍÝ.¥×èúF*l,û‰–Óa&söè#³øÜËæ.~KoKhxxìÔaOæø‘ÓCçÈÔð™“Oà$êý\ž£MT ëhõWƒw}â}sÌ]öÍí©>ýrÓ»o<ñTHòwxÞ¹rýüø¬YuíRäÙÎ^[н…áЊykk–µ^¢£BG‹¬çÝAnyûòsÚcnzŒ‹ÚunZÎÍÐ:÷×ÜòºyNÑ‹Ûì‹î’Á¬Õ“¥}YnâAZ\41V\Ì0˜» endstream endobj 16 0 obj 939 endobj 9 0 obj <> endobj 8 0 obj <>stream xœ’]LUÇï°tÙ"¥ºÍ¢²œ¤U¡lI±‰q±~Téê–lpIýH›ÎÎÞ]®ÎÎŒsgEHº½,Ѐ!N­›*Ä’hª¶Q«¶Iд/MÔ'£6ÑÍe|p´˜øæÛ¹çîÿwÎ=W@¥%H„»¢Ñp´åp}”¤0Ý2D™HÅüëÁº·ÄªvÙÚ³«£«û6U£ð™Í[,zsufGAØný¾ÕºµmÝ('œ>+AµíGêêëͪ–ÑI²Ó€Æ`0± ü­@ ¦$©ÀýNÐ…eUKaÅh€g0£C‚È"O†CÍP{Pãq¢@«î¨‘tÌi ÂD ÅuPu× ©JœDUh¤ Õ°DDp„µ¢ ë)B©¡ÔEÅÀq0T Š$§ãE¼“O¨Šš®:zÊQ«ˆJ *éD3À!FZZ×{4:E£È¥Ä‘AM8•qUJ§¹­"Q(¸Ç(rbâ„j²˜q¸Ž•¦“µÒ”(É ztœõ¸ŒéšoñU6æƒM-jšœY»«®UÝæƒb9ÑÐFR±4…v5%*Ц! í8™–EÖ÷üß‚µý¿E"„Üûkë{ÚŽv Í¨mA•¨Ìù"¨ÅÐB©Ð*¨Â¯´NŒÌÊæ¶Â¯­¸øO…‡½v£°{ìÛ·¼ÿÖÌù 5¿Þüš71¾ÛÃŒü¼Ç?¢z?çè#öÝ’l¿¯‡bäót¼ôÉ÷\æ/\þ±fqù½ù™ÇqgfÁ›>ÞÉÌWÜÏw½~vzâÌÔÛ5¹©Ü©±ñ±Ißež0sÓl²j";~‚eÙÉ“þ}™,Îf«úÊ®æfÇÌÖ]Å^ËflÿŸƒ¾D×ÐO%ÿ¡PØ ßo7{“¿ ,±_¯8Çw_ä®…•…K_^ÕôÙ;íògC⮗ÇÙãì±™'ζ¾qÜ”Cÿ8ðã7\çìC^¾£O—?âÂÜW3Kì&»:¼Ü­÷zßâ±o{F}ï6™MìfßI쇞å©”Øö´ã0>i{½ß]ºx…]ñ¼¯Ï¿¨¤»µÞSƒoõúÍþÉa6Ä4C;ÒYDñè’ÀÏó)¯­ºûÛ¸æ®ìÎ[-y~4ïž-ÿæŽÙéŠ „þX3Ÿ© endstream endobj 17 0 obj 876 endobj 10 0 obj <> endobj 13 0 obj <> endobj 2 0 obj <>endobj xref 0 18 0000000000 65535 f 0000001472 00000 n 0000006472 00000 n 0000001413 00000 n 0000001520 00000 n 0000001253 00000 n 0000000015 00000 n 0000001233 00000 n 0000003257 00000 n 0000002979 00000 n 0000004238 00000 n 0000001934 00000 n 0000001670 00000 n 0000005351 00000 n 0000001597 00000 n 0000001627 00000 n 0000002959 00000 n 0000004218 00000 n trailer << /Size 18 /Root 1 0 R /Info 2 0 R >> startxref 6601 %%EOF hypre-2.33.0/src/docs/usr-manual/figStructStenc7.svg000066400000000000000000000324541477326011500223260ustar00rootroot00000000000000 image/svg+xml(-1,-1)(0,0) 0 1 4 2 3 hypre-2.33.0/src/docs/usr-manual/hypre-nwords.512.png000066400000000000000000000442211477326011500222170ustar00rootroot00000000000000‰PNG  IHDRšßðösBIT|dˆ pHYsdd"0£tEXtSoftwarewww.inkscape.org›î< IDATxœíg˜ÕÕ€ß+i×lÀ¦ØÆ#Š<—Þ ØtÚÐ!4’B !!$$@ …š‚B„^Cï#¶‡bSŒ ãîÕJ÷ûqGkí®v53iw½÷}=«ÍÜ9«2çÜsOJ) †z“MgöÎv¶¶=wE‹d0 ýšTO `Xsɦ3 àKÀ%ÀþîÙFù CÏc CìdÓüÈtxù·—È`0 1€!V²éÌ!ÀåÀ¶^ž\ßX‰ ƒÁP cb!›Î \ ìÒÍaWÙž»¬A" ƒ¡Œ`ˆŒïê?¸Ø®ÊásßÕ](ƒÁ`0†ÐdÓ™$pZñw\ãïŠ+LðŸÁ`0ôŒ`L6iN¾ lâÔ€›ê"”Á`0"a CU²éÌDà+ÀÉÀº†ø©í¹+ã•Ê`0 µ` CE²éÌPàx´âï.°¯ˆE(ƒÁ`0Ć1 íȦ3»¡•þ±ÀІü±í¹-1Œc0 †1€€l:sðÀŠqØYÀ-1Žg0 †˜0€l:³p00æ¡/·=7ó˜ƒÁ`ˆDO `è|ø•ÿ;ÀŸcÓ`0 1a<ý)­ ©»5‰Ã¾˜½+äå¶ç¶Æ=¨Á`0âÁý)­}³ƒÔóIÁÄ‚b\1¶KÌþÛhƒÁ`ˆ³ÐÏÒ:x8ßTÀ=M±~~d{n!Î ƒÁ/ÆèGHim\Yéµ…æÄómx ¸#–‘ ƒÁP7Œп $»zq‘q\ã‡¶çÆ·˜`0 †º` €~„ãä\º‰ÌAk瀻kÆ`0 õÆý³Ñåy;±–ª9à2ÛscO'0 Cü Ÿá8¹ÅÀ­÷'€ ks¼ü³¦ ƒÁÐ0ŒÐ?y®ãŽQ šjÓÌþ ƒ¡a €þI§æ<[jÒݯٞû¯Z0 Cc1@ÿ¤SÙßíj3.«ådƒÁ`04côOv,ߨ¸ëF×ÿ¯Úž{oÍ ƒ¡¡ ²[ù†™ý CÿÃý )­”ƒlÝxÅöÜÇ"˜Á`0Š1ú‡k•6v.(š£uYíâ ƒ¡'0@ÿã”Ò“&`·è³ÿ—lÏýO, ƒ¡á !¥58¨´½}A1$úòÿe1ˆd0 †Âý‹“ðëý$€I­‘µÿ‹¶çÞ—PƒÁ`h<Æè'Hi5ç–¶­‚b„™ý C¿Åý‡€±¥=£Ïþ_°=÷X$2 Ca €~€”–.,mo^Tl`fÿƒÁЯ1@ÿàP SÚ¨aöÿ¼í¹ÿE"ƒÁ`0ô(Æè´ÍþÇa“èm/‹CƒÁ`0ô<ÆXÑÒÚؽ´]Ãìÿ9ÛsŒE(ƒÁ`0ô8ÆXói›ýT°e1²ðƒxÄ1 Co ÕÓꇔ–.mïÙªцzÖö܇cË`¨H6 LEgš¼ã¸Xlâ?†s€€wmÏý4®k }c¬Ù´Íþ×®­é™ýêF6œ| X¸8¤ÆñvB+þUN+dÓ™û›€lÏ-D½¾ÁÐW0ÀŠ”Ö&Àq¥íÝ Šd´¡þg{î#ñHe0´'›ÎØÀ¯1e»_ˆ0Îht¶ËáÀÞÀ€C$ýó>ʦ3ß±=÷ö°rj#›Î$€ÏlÏ]ÚÓò¬é`ÍåÛøŸï ;Fþ«ëì?›ÎŒEÏÒvÆ£ÐîÚQ@3°øÌ¼…V/3mÏ^Í 6™“èêÀrÛs‡$$¾Âþ `WxùŸÇœœìQW¸:1¸-›Îl\h¼ñ“Mg,ôï~V/ÍŒC‚)ÿ˜9ÀL`†ÿ×µ=7z“¡B©¹‡êˆßôg60`ïVÅ>Ñ €§mÏÝ+NÙ²éÌà(`´Ò_?âPï¿n±=wELâuK6‚V8ç¢oX%¤í¹¹FÈÐ×ɦ3 àëÀOa™i{îUÆØø&ðUÊZ[׉G€ÃmÏ]^çë¬Ñøq;GútÄ¡J¿ûaV;ưfr6¾òov¾öYÂøJÿhà`7♩M®~˜Mg¾f{îßc³"þÍëËÀUè5ꎌz¥MgRh%Yz¬V¼Ÿ£ƒßæØž›o,{(¸NÀvÝÖåç˜MgvÎCºwí‡6VÎiÐõȦ3Íh/ÓöÀú¢²ó=e{¢þ´_æ‰Jéwl69ÎöÜy1ŒÙo1€5 )­¡ÀûÀÐÊÿà|¤Ïø)Ûs'G•£NJ¿+p©í¹?‰{àl:³p#úFÖ_è© ‰Ùtf°3zv5ݾ6«•ýà*C(`ð:ð‹zd{øË›Îœ \ ­Aœg#ÃÒùš«ÑÆ^§·ð=ß3óvÏL9§c‹0>xÙòî‚J Ý` €5‡#€-AOÅ'Ç<û÷#zF+þm£Þ&†98›ÎdÜ$`RÄÆ ë™"öÇÍ3¯?ïÛáU; ›Îì…ŽŽ?œÚå›ÚÕ Ó‚{›KVë“§€YèÆùèYôxtÛë/P%þïã¼ìÎÝ<6›ÎL´=wZ˜“²éÌ´Ò?šà1%7Tgzyê´°2tààLÛs[œ”MgŽGÇeŒêøÚ÷§¹dEÅ¿ŠÅ™ÞOÀøàÙþÝR~êéÛsëj¨÷EŒ°æpqéI¦9ØéñŽ‘Î¾â? íVº&Þ“ ˦3£mÏíÖ-ïù]¢àBQÛï .7)­ŽÉ«{·VìPñP1ø,›Îl| ï±y=hh¼¨J]1ðÇɽÛÝyRZ •íEt£mìTPa?ü1@  ›ÎŒB6_!ü’Èó¶ç¾Ña¼V¤´¡‘p¾í¹×†9ÉÏäøe½EJ(।àá&4â÷¢k(¼ÌqœÜ")­õгõ퀀}»ºÞáÌÉŠi¬~|Å—³€—¨ž…Òï0À€”ÖÐùÂLŽ©æ6Ùøº`O—,ð~BÏЖK…~4ƒ Q0LÁfEÅz‰9í¶„h6Ù¯7%`| Ô>D{v”ÖIGåÕ­[TÄêÍ5óí¹ÏvÜ™MgŽÀ¼¸˜'àîæóÿ®îsœ\ oãäæ—Ki=€^³ß Òq«€°I¸ºrAf›û£ Èž‰xcùÆ/·˜xÈ‚»©èË@« Ð _<Âs zŽÿÿœ¥à Q!²ÿsw5%ø Áà·ÀŽ“›^i,ÇÉ}< <,¥u5ðstD'‡»O¼Z&o3:]ôXtlÀ`1:VÁÐc¬\Rz²EQ±a´B™Úžû4´¥oý€²rÂå¬f$uÚÕ» Ágµ¨`¤‚m Š=ZU½|ÚŸÛžûy¥üÙ/€c¼v¬€Ý-ëâãóêÇ›EoÛ\+­èˆôvøëüwÐåÿ¼žM>Ð?uœÜ3QÇqœÜËRZ»¯ÑELÃ{ Á&áÞëŠémÙtf´Â9Ø0¤¨YÜ ¥•8,¯þº}QPË¿H°t‘`¯sf¸¯='›ÎX¸% ;Vú‰¿—ÜÝ$f-ü ¸Õqr+rúÆÜ·¥´ èíî¶8›Îœ‹ö*ìEg#í Ûsß 5b?Á})­½ÝKÛ5¬ý_m)p7 #ÁÛñ©€çS‚W“‚U/²@è Ÿ™ Á±ù"kůçfwÜáù®àéØX )­ÄzŠNÊ¿ºQÏV:ÿ­í¹nÇo'Ä®›U]ë!,ðPJüïÕ¤8Óqr±TVtœÜl)­ï¡Ý×éj† ¿¡Ñ߉Ï8ú“í¹+h<® ^¶ jãZ[$˜ luÎ wQãýe¿(ø^²‹ÿéù¤Xñ`“8»nqœ\-ߨ;¨h„º1t:¿Œ›mϽ3¬Pýcô}Úfÿ›c£ýÞʦ3Néøâ xÒWÚqéëÙ økS‚¯µãÎì¼Ö ßOÁeuÊS¬ÙÒ0ºHö¸|ñ þ¼ x;)x;¡Ý¬+ÐùÓyôrÊ0¥§`‡ÖÈ9í•x ø^™\Ñu'‹fq˜'JŽv >LP¸?•8÷þi¹X 9uà&t†B§¥¬ÖðcµûeÓ™µ;‰×3rãÉ™‰{XP)Ö–ùÑ †+¶µ½ÀÊDþÕ{Vú½€GSâɧSâ(ÇÉ-¬E6XN™aµa‘¸– §£SR ]` €>Œ”ÖnÀ>¥í)îf>ïáí„.šÖÆr¦¯%;)þÀ\tö<{=tÙÏ‘hhU}ûq^Nê@¬ùWù†”Ö¾¥Ä7Go's.hES™Øš )­á›ÕãÇäÕ¶ƒ•Vö¦nRÐUíÖÏ€à-à±”àô–"1x >±=w™/×eèõÙa ½²M‚&tŠiœ|”`ÉÃ)±ÇýÓroÆ:°ãäŠRZwP%–% 3Ê7^HŠmv)¨°­‡»ã©û›ÄöoU?_KÕfaq3Lšæ÷t&“<1PU.ßÛ ê¤¸ð·oM»º¹Êqœ\«”Ö§”!33ºbp|éûl¨Œ1ú6m‘ÿ‡Ë›íÈWÊ=¡ ­˜N Vè[ÐtDï#À£Ž“›ÓÝ`RZ¡ÓB÷fï’S±+ñ ¿#â/€“þ›”Û#3:k»x®ÙÒ# êGäÕÆI´—åÉ”¨ÒÜ-À©§·Ôd,E+ÿ9¾\ß¡B:¨òeŒÓ˜/˜½Hˆmþ5mZŸy"¦q)­áè’»ÇÑ$X˜€/äkÔÖ>ŸÆîŸW×Ä`œ¶$àPÛsß rðÏ·˜xÆÆpý@UÙ“Ñ ­K‡_>}Úýµ‹¶)­1I3¦ŠŠ ѽ˜¹ c…¡3Æè£HimGYJΔèkÿíX.àoM‚·b)ð'àFÇɪG^Â7®®—Ò²›é"ë¿f{LAy\:0±äRiŽ.CÛeüiIØ®öö(­ÀÇQN”Ò²v+¨§Ê«+ÜÙ”`VÄ7!T"wg Àqn–ÿ×ÕÁ‹b\GY"xa”bòÿMŸ5¤$ ¯£ƒëÚy¹B*Ú¹—Lœ‹.¸ÕvêsIAJÁ1ü×SŒïîõ§ÍtŸ«~éêø19°ßy‚S†¨Ø›mÜWO5cô]Úfÿ!CÔøœÜÕ”øàSÁµÀ'Wó¬ÌqrY)­×€W¨Pƶ­T"V-lÇRÁ¿€'é¾s ëȯB¯LR™lÏ =_‘Òš2\qïÞ­jØÇ ]•n±`ðºMïçèÔ¥aè¶ Ðu=€ këçñ-Ûs;Îê²è NÄÕR.÷ SѨVÄþ2À<:„øô>|NÙﮜR‚ýê”Ù² xÚ_Z `më+ÅEX_Á~z­íÀ×lÏýGµq™hmzb«zqˢ겼t–§`/Ûs_©åðëìç?öÖHÉGèÜCŒÐ‘ÒÊ {l5åý·ñFRäïK‰ï®\ë8¹X[‡ú‘Ø—ÐE$vL7ÍynJ¼„î¶íò lSéàVtíñ j{ëB»ÿ¥´Žþ´H0àw͉Ë¿ZYÇÉu[\Æ÷øü }m‡ýÓºÖöÜë+쿈. ÒŽõcpÏ*¸³ N¶=7zÔJLlâóŸ•úz­ÅÄ è`Ù4%Ú¥Ú~.às!˜ÙöÃ4ÁKg­*~s]ż )o_ÊL<øà‚ºgÃb·…BB— ­üý"<{³Zé×µh”Ï<àÛsãNì oò=üEíõ•îpV Ó’búß›ÄÞ~•zqºšà&_Ï,àç'˜ƒŠüŸãäZ¤´¾ ü±Ò y5¦5„2¤´Î®A»hõ™àûŽ“[ä\Çɽ&¥u2:Ë¡­þû¶EÄšÿ¢‹Y¾ãä””Öyh#³]NûØÚ»‡Þ"à+Q<'õ`£ïÝBÁmtŸr+§§eÞ¼›‡CNŸéÎ2îÔÌÄK¾Ðª~4¬zØÂ7lÏ}0Ș~‰âI¬Vø;ÐØòÕ/£•ÿ‡ ¼fŸÇ} )­ ”•´Ü«µ¶à£O÷\<}Ú‘ýš1â»`_¥ƒ0€X¾„ ß9Nnðx‡×þ†öoÒñF—Gm_ÝŸ1@ßã"üœãuX5ÌþW­_™éÖÚT$ .eKcâ©x÷Ë®Ò}'·DJëQt>{;j žƒà€[€SÑõŽóK¢F¥­óÙ!­ŠAáß¾§Ð}íƒÜ,ÛUvlýû¶øvO))­&`\ù¾q3wÚž[´áF)­Ó€]Ê_Œé{L+ðï&ñ«Iq :5Nú ‹-¾à8¹ª›¤´ÖÞPñ¯£òjråeEKdÓ™MY­ð÷¡1­©;Ñ‚®‘á%xòð¼Ú¯7,%õUŒЇÒ‹V$€žýGõ±)øûÀÆË|ÚqG ë×%¿©rÌST0òµG´íðktçºËk‰¯Ò²ð32Åø{88D÷ÂÑí®_[í„ߨž[Ï%¦jdèÐn›pŸÄíeÏŸ§ƒ²Ÿ@EVA~VB÷'wÚ=_“ÒJ ƒA%:‚~ peµÆHþ¹éuœØRœ0¬úWf&:>£Mg&'¢•~· õ¢ø ±ºôø‡ (Â[Àa·¸ÓŒò¯cô-ÚÒ†+Ø&úlì-§õÀl¬]S–©}æôë®jÿ—QñõÂÏy'÷ : ¢V®íù9"¼ëÿ%à ®úËwÄW8í çÔP7a1pUÔ“cbûò!~sª€Ìè×ÎÛ”dßãUðY &]8cZż}¿Ü®ç?þt\)­ÖRüíÔ–âZkW±8ÉöÜeÙtf:}wŸ*çÄN‘ô®¯ôßOtªñÚ“(~ÆÐ5Æè#Hi­n+ Àž­]Tì¨Îtdo E3íÊÆUØ®_YН«Pqy K5ã3î;8±¥ÈÀpïÛëÀ¶ç†¹an‰_tiÖ£Ïr¯±=·“÷§Á´K£”ÅPÞ³Û;loR¾±e¡¶ïñ*xoìY­…uX¤´¬øû©-ÅTÀ4ÛËlÏ})›Î ü™nêhĉæ _á'aV¢­­pG ÀuÀqg*õWŒÐwø6~œÑ0USMöÓlÏ­Ø®³lV¾ƒûÿ·KEc§Æ%€Å<±à÷·ÿ¹ŽnQŒ ÷Ñç€ýmÏý,äe/ߨ5z‘›O€_F=9Fv/ߨ6øïg)ÓWw-ߨ¥ Ô*xc€.×ëwIJëÀŠ»§æ‹©QÁþÕÿWgÓ™+ÐÙ:uj¡ùLèZ%·þ²î¯ö:ŽæVÇÉÅj$õwŒÐÒZøZi{RAEýàþ¤@H=ÒÚ²uÓÜÿ+Ð)uA¨è¨1G©a³t Áˆ}[[†{ϦûÙž%è°-8tpmç•¶ç.‰zrHimIYðä F÷füÊöÜec­lZÚ¦¢áÊkå¿WHÏLU¤´¦4Ã=§æ‹Í[ƒ/¾“‡§š:Ä6ÄűڥÿnBT«(¹x­ò(ð¢ß>Ø3ÆèœƒŸû=XÁNÑfc˨Ðç½I™ÎÁý“íË{¦ @¢ÁE€¢ ¥58zbA…mõü6°oÐF0®¹.mï=øoðÛh§ÆÊIå!Êf/B§o–Ó.‹e·B´@Üäš`ï:(ÿÝRðï“[ŠƒÆ4rZ`zQðØÀš c®f…€÷Êþ‚î~+:Få1´ÂÎqr&¥¯ —#¥µpvi{÷‚ŠZ7ûǶçZ¯G—oÔèþ_…®Š”Š€û·ÖÝÒÚ¸aGæC)ÿYÀ>¥æ>h›ý7»DŸý_n{îŠê‡Õ¿É¥íõ•ΠÈ5Úè¶eá š1®àäVþa—eºEJkàójh˜¬„fØ©Ö>ß-è`½w|…ÿq¢Û  ]öú1ÿñ”ãäzÔKÔ_1@ïç,üúåUäµXݯGÒìUÚ¨jn){sHåVÙP‹u6üŽŠ÷ V 8±¥Æèû­\"{RZ#€cKÛÛGp{.*06˜I”íí¼pÖ't0õ—Ú\ä;µª(Å”€S#.Ët‰Ÿ"úàVEµö®1·k®Dø0QZÇשyUlú¬Vø;NΔëí #¥5˜2·ý®…È>ºïÛžCÐ{dÚ¹ÿw‰þ€žýÿ4ä9çC½ÕÒÜ“€ Ï+†‡¨V‡žùϪáògâ/7%€Iуÿ.kT£Ÿ*œRzröe…L™¶Ù’È}ëe{îcQNì )­-€GÖV¬{D8OQ`íSófwNÍëÈû¬Vø™à½Þ‰1z7g#A×±xÃq€»b”) mîÿ&ô2F Ü¡ÞwÅ%ì^¼p#°ó¡yÅøàf ÐkþoG½¨”Öà›¥í‰µ[› ü5ªqážž\Ú1ûï»à¿7mK#[k…o>¾ú¬nÒ<š€õÉ£T†ì’ùþ:þ; š·¢û7oí~äï¡¡q —âßpÎ/mïÜÙ{iÖ^GJk=`Ji{§èÿèµü+"œWñ{Þ=~žSönUìÜPZˆžùךÞyeÅšöŒn¨}¿—4û¹?u6äìÿ'bNÅoa+€=¢yF~g½z)­!ÀÀè½[U­}XäGê—Öñ—v¯ð?GWØ|­ôs&R¿ïa €ÞË—@H“¢ÝŒ_²=÷_q ãð'ÛI"ÿ%~%ª.<5tßñX‘Ò:øÙNÅ>á"Õ÷³=7Wãµeç„¢"` YG^!D¥ºzáÏþÏ(mï|ö?øC‡±”½7[sëË™‰nU'¿¶Ø´:C€¥e3üw¢]Ëá ¬@× (Eê¿bŠñô}ŒÐ ‘ÒJ¡g/ìPPQ[æ^—LQðÿ¶–³ÛEs›–X \ñÜÊ€è²Ì‰»‰”ÖfÀ[Tòàë¸K€lÏ}=EWÿ`ÏèÿÝ%=éq*£mö¿YQ…™ýŸ]!^Ʀ,-2âìÿû¶çƦ0¥´N¦Qpt>\Gз‚ÿ6 æuRx‘Õ ÿyÇÉ­Š,°¡Wb €ÞÉIøË’貿x&h/ïÞ×Á IDAT:r~‘‘ÿµ”“; V÷¿”ÖÚÀ½ãŠŒ868¯|º¶ÿK1‰ÑÖç~lQ{"ðŒí¹ÿIžÈ”Ïþ›ÃƒT°=÷ßö·uÆ[ŒÔùuàîÐguo,þN ÓC4øiCVVþE´œ¥uü§'×åÂcGÜ:;¾™GûÇCB©àßqël6š*<ºÚôõ®ŽI±º,e-¤ÖYIcÎWJ¬óÆ}§'ò«FìùÑ N™ötè‹ýúóîxl›ýK©`ÿß•ë¾þŸ¯$ò+×E)v™û§çžŠtñUMVœyÖ-×/2"J&ƒ¸à½‡½ûâÉ_8絇È, Ÿ*?sô–Ó.œúËNÛ*]»Ú¢OŽpwÁ+ÿepkõ±5‘Êßô…³nxÛƒf×z}€ fYëígO/mŸýÆcX ïp\wè·o{|ëýJ' Vÿnú|ÈoîÒ¼x~F!8>÷¾ýrUÙ ±ôì3n|pé a­åã5-ýdÔ gL.]æÜgîbÛ93«ŽWί;ÿå'侟Äòÿ)•´àÝmD~ÕЃ§=Á—^ªd¯tÍ«K®>ð @ ’©•ÅæAK‹Mƒ–›-U‰d1ã}äØî”\]K÷QÞÎWSÇ=Ê ¦ŽSh×PCÓ{Ä­³ÃAqfœî'žBð鶇PExé+Ý^‰7ÆoÏcÛìBèãDnw¨~Šâ€ÏŒ<Ô]{ž8hÑçW?²2+GŽgåÈÎL ÞkÁÈm,'£ÊSŽJ6‘Ütg¾ñÔ”>ÕÌO޽¬éñÛZõà€¬¹ +GnÀ¦s߯zì/¡ÇxmÓx|ëýN¬~dýY6vk–›}ì±ÿ;¯V=^ ÁUG_2té aGu|-?t=òéõýÞ„UþîX‹'ä¾;V?2 B°bÔF.žÏ1¯†w¶ÜµÏé¬5¡´9Ь›|†ÞÌô²ð­jªöcõ‰%5u\ÃŽzá{Q*¢ÐÚ<á¶sþƒR›«d’í—/cƒÏ>}Ç·Þ÷&`1pªz¬w{ëÆ~Ík¾hèîßñ°HçV#UŒ¶ÐýÉÚ£b“aèŠ%|ÿŽKXwIõº(­ÉW})oŒß®ê±Q9æ™;"wÛ”Øì‘XH |ý¾kI¨êþúîv,ÓÇdªwÜÓ›Vç/ûœVý ÿä_i*„»%ºc-fŽÞ¢.òz5ËÐñS?WSǵ«Ššò#\ƒÞì+ k¾[>Æs­îÏŸlÚoµßªð‹ËO.|ðšßYVí“Ëÿ^l˜h2òb^ßd²#/˜Å.3ž }Þó[Nâ ÓÕl ‡¿ðOÆÏ{·êqï­¿)wL>©êqãç½ËÎ3ý7/¥w dX„eì'ï³·óHèóÙî Øe1ôjŠè.Š—ª©ã*Î$SŽ“+¢««U½ú©BµÎ*{ÂíyöÚSd áSpKsb2ðZ=dªD"¿’æEsaÑÜŠ¯g Š #V'û\À‹Þ“ÓÞ“k‘±+ÖŽ`` zúf&¼xg;cB%RH®Þ—H¢’ú/eÇ”^‰$_óq¶XPÝ3R ®ßórCÖbÐÜ™«Ç,»FÛØÉ²×áÂyæDH»P Áí“O©~`Ùð³9÷Tõ:Dùd×þ ‰êŽÐcŸ¾-” Jþº÷ÔPçåÄ'nE„ˆÝXÑ<ˆg·Ü£.òz%¡×ùî µàzXcÜñeÞÞ`”Œ¦¬gùäùòÓ’‚¹½(äESjÈû<%ˆ5׮기âÓTãû|D^±u€÷FÿH)¼p›¾N « 6#¤ •LQLê¿*Ù„J61²P`Òìðu„ž³%K¼ÃÚŸ¾ïY>îêñW_³lÅ–¦Bžoßs%Íâ)þº÷TÞ9®êq›Ì/´gäIkÞ÷ã*âdó¦GòÒ<“™Ìª¦Øšýz/9´â”Ö'bêEïG½‘Òj õß"Z–Âfµ Mâêãq :ÖøÓ¶Œ^L†O¼–¬¯53 ‚m’VÖ(Ö~­Ší*ÿ{šoÖð>ˆbQ, ûµuÍA!sÉAWCz~þ ÆÜ?#ªt팅΄~t4V*zß)ÓŸcÂÇ^Õ+;£·ä¡Ív yÑœv×j_¬vóÌí¡<#­ÉwLî”t '?~K¤óÝö€˜%1ô2æ¢ünQSÇ®7ѯ €Þ‚”Öd Í?¥ªpÛñž;íxý¼GziKiíIYó•}×;±Žâä"ÜIÁràçÀÏ:øÁ½ƒ‹KO6-*ƆŸ5çÆ)PD¾_z²EQ±QôÚä.p»ï¡iE—!Œ_h§ÍDKªp'7%äõ7žÝ¦ Æ0âý×¾œ÷ÌÀiöüG¥çåû†;áÇÀLn \|¨Và‰TïYoÚ¨A*(.ðçæDU Y¨""¿Š}CzFZ€ç½Ïº¯ÅÛ*B_m‰öƒzµ)ŘûÀèHU0VšªœWv\ȘCM?—¨©ã"GY ‡‘ÒÚØ¿´=%Ú¢÷-¶çVy®#RZ»û•¶k™ý3™N@÷¿Ïü0ûÆÇ35îÈàÊäüoÍp¯ùVáÊô3ü¾ök+Ø6Âì±à¶Å‚ßRÝØ¨ÇëMå² RpB¾Xõf¶ÒWþ‹~£”ÿ¥Ëê`Y…èËi³?ÍðϪՌŠJùB"…Jù“MmÏ‹©2HjªiÅÔ@ŠMP©fŠ©›”½6À­l‡cÊ—kú  ×ùߨu cô<—”žl\$Lû׫€Ëc•(?(=Ic¢«ïW‰¿™L' j ! ¿£ã¿6/*¢ÄïŶçVÍጊ”ÖºÀ×JÛ{µª(®÷%ë(ÎqœÜ'1Š?i=àY›“W ¯ò³Q:)®ž'x®è®IО‘0º|¹Ð@Ü$Ðq#QX"t[߯ ­-$`ÆzÕDª‚‘Ðì?¸ÚH5·3** =V=‚VC2 ¸@M÷@\öøÔŸ‘ÒÚÝ„ˆ¼öƒí¹Æ&T¤´vÚ¢Œö®mö_öÅkuÜQo€ŸarÛø¢š||K`%û#ÛsY²`œ‹^`˜"P0b®µ=·G”?èl$)­€ÍökU¤«ÍJÀÉ׿5í®î’Òú%¾ò©@†|o+Î[×·ãTü²!ÛëDü¾¾›y´»8êªW¯G[I®j…U¡—ÀC¡É2àå{.ÚŒ„æA¥0`(…CôóÒ¶ÿ·8p…CÂóÐË« àcô,mkÿaóð³ÿåÀ±J¶µÿ ÑbJ©ÂágSܵuA% –Mq p^€qGR!+Âþî”.eÙ²`Ú(še¼o{nøf"uÆqr+Й=QÛ{ÂÁ©Õ¸†Ž )=†Cb/üø‘ãä:5QSÇ5¤>1z)­ñÀ—JÛÜ¿´=·®? jHiíRÚ®qöIõC"Ó) )­ó×Q\6µ¥Èà`ãÿ8+²$á8 XtÔüÎÑ>«ŸØž[»ÿ3¾ûúî­Šjý£‚eS\i{îw>úfÏ:Ñj"\l{n\k³í–ôj4>ªM”ú“Mg¡ãR~f{n¬…?'WR¢ŸÅ9®ÿ],#*οÿW‡€ÇNHi ¦l&¼{AEùÿg7Å'Upü€Ê?M(ªIǶT+à\Ûspìõ(3¦„Ÿý¿`{n6Ü)]ʲ;ÐÖíiã¢.ÒT½nö_N6Ù ý;¸-nå_Oü¥”ù^md€œãäž®rJÃ0@ƒ‘Ò L-mG)‚¶–Ç'Ux¤´¶ÚúôÖ0ûWè–õ$.@¢ß¥´Nª¸þË-EÖö6Üœs­ƒîø?`èôÇ]£Í*h{ncó»VsæEu—ZºZTÐ*àdÛsï 1ö·ñ]º#lþ½‰3v£]W¥ƒŽDoÃYG²éL ïs º¢ô =+Q}ñÓeŸô½ c4ž ð«Ð®í†3\‡-£mö¿qQ¯ÿG䟶çÖ»{a\KŸvœ©Hi3XñÇÓZŠ"`ªÖ=ÀI1ºŒ»Å_½ ´½K«Šò¿Ï ¦5î°Hi]³CA}õÐ|÷©”X•„ClÏ Ü'ׯ‰Ð–ÁÐöÜ'ÂÒ¥,€cË÷ Ùñ¯½ÎMg6GÏúwöwýÁöÜ=(R¿Æ DJkz6D.ÂrEO­Ã–ÒÚ°KÛûDŸý)3$êqÜ)Þ-¢ ËOJëpÛ©ùb2`ëæÿÇ5ØÝy:°h«s÷h³Ê4Ê`)giýðÀVuÞU¾_yXÒSlÏ}5ä%Új" _Q¡yãâôº1 ¿°ÔîZó1‘MgÄ Á¹á'bu.2ãÔÐxŒÐXÎÃO5ŠX„åCz‡»ìRü4¥±Eû‘ÛmÏuc“ª2Üÿ¹P› ¥µo3üíä–bSÀžGÛžÛ°VÚ~°Ò…¥í[UÐàÄrrÀÝ1Šˆ]-ë¢ã[Õ÷«eÇ´À¼f˜d{î;aÆ—ÒN‹ôì?¤1~wÌž«víGcÉa›Pûµ“Mgv[ 7RlY¶»8ÞöÜMIìï Aø7œ¶öc“¢aùqŒ¹Æ‘Ò²(«_PCÍÿVà²DªFE``´B@ó¤´&¥à_'¶¨s´ìøìN6=£œmö¿¬Šå|q¢õSZ‹WT3¬– žª82¢ ù\ü¥¡µlî½i%Ƭ)­u€/–ïÛ8ºQ]Îfq •l:3¦W'àø¥·óÀ <6†˜éµ…Ö@¾‰Î)ep´",ï7Ç-T.ÁŸýŽV½°ÄŸÂÎÚ"Òiý`­ˆ)­’pÿ -jHÀ¸‡g€CmÏ­©£aX¤´’”¨íXP ö?Ël:Ó°ûÄÔÌÄߟ/^Õòσš“ಓfº{FQþ~EÄo–¶#Ìþÿ`{îÛa¯Û {Òa™ª†jšålæÜ5”l:3(›Î|_—€ã;¼Üc{nÜý> 0€ ¥5 hkî¶{AEéEÿÃFº+!¥µpLi»†ÈÿV Þ5ïKtò$ ’2üD@<&¯Ö hø¼|ÑöÜú)¯Ì—ð]À) Ú:z7 FÏ$gÆ#Ve®Üb⺠þwxQmÑ]Žÿ<ÁŠâÀ˧O«%•ê[øß‹µÂ/Å-~Tõ+1©ã޵‚6~Onc° dә㫀+|Ž«€£lϽ¯QòºÇxÃ×ñ|¢#±C2¸-f™¢p)þwf£"l}öÿ×¶/îd SѾø/&Å)GäÕº[ÄN¾`{î’—ª ?o¾­¬òvÕãQâŒê‡Dç÷›gN£ÔG[u£ü‹ÀóIñÁ?šãjQþ~{æ¶Šˆq¯«Cu½NÀ øÆ¾¤^€l:³6y¸Ù© €ƒŒòï]@ñ£ÐÛŠ°ìÚª¢´¢í‘(ìr¤´¶Ž+m×°ö_ q³¨`DU†;Ô°õ‚;8ÀöÜX+…à` Эí6ÌéŽoeÓ™;lÏ}¹ÖÊɦ3#— n©8¸»ã>ð@J<ôVRî8¹•5^ö›èªm¬¥B7Úù =» ?ýoÇŽûk¨TÙ‘ hîúØFôɦ3Cе ζêê¸x¹ëe‰û;ƨ?mEXšÝÂb½ü-f™¢p þÄy[FŸýßa{n#K`Žê¸cíˆîÕ€Ê>°¿í¹=R„EJKP6ûߦ ^»2IȦ3;ű •MgÖN+À«Ê1 óì^KŠü)ñõ§r¹?Ôz])®­ïž­¡q¯²=7îæ,;BûÁdǵóël:3ÄöÜXz‡dÓ™MÑõ¾LA¶%>üq„â̾Té¯?a €:"¥ÕLYžkÄ4¬K…Ý)­4pBi{ïh½ J<\¾‘Mg¶C»ëÕÖxLÇ«õEa Úíß“5¾$hkmrí³ÿÛ/eÓ™¯ÚžûR”²éÌDtÙÝS€!ݹÞßJ žLŠW?Jp”ãäfE¹^ÎÆ_Цt`dæ×Å$G9ÛtÜãì¿„®Ê¦3ià"Ûs;5Ÿ B6ÙíA9˜*«h+¡8'!Î:oÆ´Þ¶lècÔ—©ÀhÐot„4¬mÏýwÌ2EábôÄ„õ£u.,gsq:BxàY:4A‰‘N@—SÎÚXÞ R›ÚÊ*Ë‚"`u l<—Mg®C¦Uƒ³éL3p(zÆ8¥Úñï$¤Dá×W8N.–¥/¿bÛRÜáÓpT§LŽwj°®«ðà”l:óteǺ+ïœMgÆû–=6 r‘¹‚UnRtÝ[Óž¨]dC=1@ÒJQ–†µC´4¬zvÈ „”ÖàÄÒö”Úfÿ ‰’‹Zÿ&æuÕt6âŸaÐyÍõjg)­/ÛƒžòÅ8û/'‰v£-›ÎLG;–Ÿi`Kt –À¦¸Ï|€‡S‚÷ÂNtœ\$/C7|XtHÈ4\ݹ±tr¡¯– ROU3p¤ÿ(fÓ™OÐmžç ÑïÑôÄ¥[÷~%¦%Ŭ—“ìrÏ´iåzcÔ/ãAß1÷ 3~Êö܇«Vw.ÆÿžŒT0¾Ë?×Úž[×ô2*.Ä~g=ÃöÜ{â4m³ÿ‰ÅÈú. ¶õ‘™+àÑ&Áô„øpŽãäbM›”Ò‚núèÙ§ÚÐÝsuÇ5ìl:3ÞöÜ÷box¥ŸÖÏ('Ž‘l]Ë@Ÿ x-)þ|í[ÓNE2CC0@ðÓ°Úê„o[PQÖ{Ãì%–¼’G>‘ËnÄdè >…v’ RÖƒ¶çö†žÑßÃÿŽŒP°uDŰ ¼gR⣧Sb÷Üå8¹º+Ÿ ½ÍµP\c{n=—/ÂÐf0nQTlò|;!x3)x3 Ï%¶ªÖñE•„ZW|4”>À›À%Ž“«[œ‹”Ö`àüÒv„Ù?À­Ùtæt¹ÞÒéqy|*ö¥ZP¿8€ØÈ%¥Ä3 G9Nθüû ƨmiXV´@¬K«R_¤´Æ¡kÉz #Lñ¼Ÿ`á“)Qô"^~ h”ò‡ îÿ¡‹UàVzI'3)­=É¥í(5I­Ö8%àæf‘ªÛÔÛÛTq¸bD“vWWÕŸË…ÎÝ_$ó¸IÁÜö ímtÈ;'Wïiî™ø^ ÁÑfÿ–ÿ(~a{îs1É7»ÒÎד‚}¢u ­;sÜß$Ô{ q9ðCÇÉÅS¸ØÐpŒ3RZ‡â§öDtÅÞ5Í*f¾‹³¢YJ}óz6%øD°.«ý~á8¹'ê$kWÔ+ð^à«=žYF›Á˜.*F‡¼»IÁG¬¢¥žN‰Ížö V´¬­˜;5r¨bÐP«,òþ"¡‹½wÁ‡è2º·8N®îyá~®ï”¶'E+Á :½óÀ¯lχleTL],ÀIа-ŠëÊr¦/'ÅÇE˜ê8¹‡zZ&Cm ~Ú\±[ûÄƒŽ þ–í¹©‡PaÒ œVÚÞ=@ÊÔR/$/&˵¾h ôsœ\½ýº¢B@Í7Ô§€ãzKa)­]€ýKÛagÿ x,Ì߬€e‚æe‚C¬ ´¢»!ÞÜC%¿0œ¬:·>l î<Ì)%>z+!Îú÷´\\3þŽtÙTè™Tï0Z€—R‚'“¢e…àZàÇŽ“kx‰kCü F¤´öv.mOþãÍ_³=wn=äŠÀyøÅÈÒ½Ût®€gSzýØOØþø pC×ú»"nÀè’¦TbÕh›ýoZTlOÜÆ´¤X1OÄYzX­ôÿÜã8¹Ob¿*RZ)›ýïZP•Û+°H0çÑ”ðfRŒ*êåƒzöLé²hÔ<ß {ÈX!àù¤àymÔÿ8ÏqrqvA4ô0ƈ—¶ÙÿæEEµ~æŸ VŽPœxD/jé÷&ÿ¿ÒöÆÅÎnÓ0=)x)© ·ø¼ü½®Û¸¡ÄYèà@Ûs?¯AžX‘ÒÚV×ÑŸÞ'Ñ:B©]@X€ |¿euz\éwà«ø…k‚”àVÀŒ„à™”`v‚üݯ¡¿Ó/ÖQÎwÑ7¯ôâ?›ƒLˆ^z;4‹<›¼”´èFdç8NîÁ† `hƈ ?k¯Òvwkÿ <žä’âø×Ü¿!_¾ -m”Šæ´%3ðZR°Lë}Ü^߬á’V'.ÀÇèæ>ój(fÚ Î‹0>¼’¸å¬®s8À~Úävè"0•ý-=¢ƒÖfUøûa#Öõƒà7ع°´½c7%¸ À›I­øçëït³òKÇÉ=YoY'§¤´®~[éõVà¶fÁ©-ŠquµûDèe‡×µ7ïsà2à7½ås5Ä1â£íf<¾ WìBOéØgEíNëUÊß/˜òÍò}¯$ï$Ÿ }gôY.%z­ãä¦7TÈpÄQhºWA£ÚBJËŽ(mï>ØtpyùßsóBÍÂõ<_Æ/Á¤r îUÀË)Á³IÁb­ø—·¿ê7÷Ÿ€ëTz1ü¥9Á¡y…,„ËÆ©Æg¦'3’ðnB ´Mt3p±ãäÄx)C/Ä1 ¥µp@i{R™½¬ÐnòçRàéØ?³'×[ÖûËù*~¹Ô }“ð™‹n+zC/pñv‹”VØ ãþe€W‡ØžûfLbÅÉÅø‘x£‹°YøÙÿ ¶ç~»T=Œ_‚»míBQµûÌx9)x5)X©¿×¿~ï8¹¸;ýÂqrË¥´n@×ݨÈ*àïM‚GR‚=ZÛG«g€B—]ÖJ¿ÍëQºÄ­ÀÕŽ“{'ÂІ>ˆ1â¡]Õ¾QJ1;¡×ݤ`áêÍyŽ“û{O“»Øÿp-p{/Z߯ƆÐ>:‰Ni H+pŒí¹ÿ‹W¬Ú‘ÒÚ8¶´!ïõk¾ÔÓœlRÚH*][fRðRR0kõôùàçÀß{‰‹ûrtc¬}»;h‘€ÿ4 K &u‘ F(Ń”ö,z-±ÐŽ%þ¹³mY:%–7 —<>®Óÿf襠F¤´¶Fw;kã—åE<ç?EÏšW5T¸øë¿å¥MW S·ntœÜó=#UM´sÿ à¨|`÷©¾l{î}ñ‹ ãG¦o `Ëð³ÿëza \é8½«l­ãäVJiüسÚñ˼”,×äúy m¹`º½ñozÊóo¼DöIDATaèyŒP;m®ØþÍæ3àjຸ››ÔÇɵHi] B·ç}ÉqrõhÚ(Úûë§9¯7Ôc¨„”Ö¦èFS@¤ÙÿçèïåšH[ îr”_ù'p•ãä^n¸Tñ—F»G£Šò/Ïw ‹1-r Úƒ1j@Jk àè»ßEçÁßì8¹^“2ÇÉýª§eˆ‘6`J«b—àÊÿ Ûs¯­H±pþïv”‚LøñŸÛžûYìRõÎë°½¸¸¦‹Q…ÂqrKüŒ¢#Й ;Õ8ä2à!tõÊûL`Ÿ¡cÔÆ‘hWìR´kñ虩ÝóŒØ© Ø7ø,ùvÊú8ô6¤´ÆRÖŸarøîŒŸ c9Ö8ü¦?%eù2pp‡ãä–öœTÑðïÿþ!¥µ7p.:=s#º/JÔ‚ÔƒŽÛ¹x¬ÁÕ }cÔF6õL Ž[ã‘ÒZ8tbAqh>°ò½îßóµW»æBü ë*Ýh*$WØžÛçb|÷ù>ÀbÇɽÞÓòÄ…ß"ùq)­&`,0è(ÐʾôXØ€æJ†5¡j¯n0ôüZnZT»œÒ¸›ÚL`7Ûs{ºtq—Himˆ^^pd^nÐä3˜ÐËÊ †¤ž5® ††âÏþ±Q‘]¾\ù|±7+Ÿóñ•ÿpÛ„Ÿý_n”¿Á`(dž5)-üi=ŧä‹A¿¬·=·W>‘Ò‰îkÀ^­¡«Á½‡ŽO1 †6Œ`XSøÕZŠNm)2$ØäX§Úžûl}ÅŠ…ó€Á +n~öÿCÛsó±Ke0ú4Æ0ôy¤´.¤8ûÔ–"ÃëÆïÚž{wÅŠ)­ÀY¥í=[/m”˜ ü5^© Ú€1 })­3šàò“òEFWþ¿·=÷ª:Š'çà·èª`Çh³ÿBìR †>1 })­£ðÛã[*w_삇€¯×OªøÒZ‹²îŒ“ *lÞ® ܯTƒaMÁ†>‰”Ö>n;2¯›¯…ï üô†æ/Aø0`°‚×ý½Ìö\S”Ê`0TĆ>‡”Ö@ö VÕ"np°í¹‹ë'Y|øõ Î-mï^PºPpf½¹ó¤Á`èaL%@CŸÂo…ûÀ^­jØîÁgÄEàDÛs?¨Ÿd±ó5`=€ v ?ûÈö\•MgÖ&Úžûí˜e4 }cú RZíPP#÷§d{îÃu+v¤´¡ ÿ°[A­kPÎ!Ùtæ1`/ <—|ƒaÍÀ†>Ÿ÷`¦ Æ¼¾?ÀÃÀåõ‘ªn|X`ÚˆÀFþtƒ˜5©Ó£Á`ˆ`èõøÞþ3¾¨¬cò¡ªà}„vý÷™@8)­fà;¥í]Zƒ¢·ëh~ln{®‰0 í0C¯FJ+ümÃ"»ŸØ* ®8ÎöܾÖÿü4üVÆMè࿈ü8Ïö\/&¹ Æ1 ½¿¾ÿÍë(¾¢¾‰›mÏý_]«¾±sQi{çV´¬q ÌOˆo\<}Úõ1‹g0Ö0Œ`èÍ\3LqòÔ–"CÃO„ç–ždÓ™°°10³wþ;ÝçºðOPV§/¤Ä¢üó⺈g0Ö$„RÑ †z!¥uÑ@¸âôUE6ˆþ}†kcmÏ]”ñ!¥•ÞÒ»‡vTÀ+IÁ#)Q\&ø=p‰ãä>©«°ƒaÀx ½)­ÓpÅñ-ªå°m‡í›z£ò÷9_ù'€=¤9ÎNÀ}©'xø–ãäÞ¨¯ˆƒaM†^…”– ÜxP^1!x‰ßîXŽˆ»¸/ŽãÆuhóÚ˂궫ábÿM œ¤˜ \à8¹¿Õ_JƒÁ°¦a C¯AJk2pçö•Œ˜û^bZÙß Üg{îò8ä«#G™ÒÆž]Ìþ[gR‚§Rby®~î8¹ÞêÑ0 ½czRZÛ÷Ž.2 d¡ŠŸ›`Ö› ±àå”H¬‚ÿõ¡™ñ%¥'ë+ýèÈ´¤à¿)Á"ÁÀw'÷aå3 k Æ0ô8RZÿ°Ö¡­E’Ïk¼„ —„IÑ´J¯¡§ý—Ž­—¼q"¥u0°Mi{“²eUÀkIÁ‹)ÁÁ+èuþ>•Úh0z/Æ0ô(~Ýû,°þ(£«Ôì+o'N¦'«:òð[ÇÉõ•Æ?ß-ßp‚)ø(ï'y˜|¸Õqr}¦¢¡Á`èýÀÐÓÜ lT,y«€E>N¦'à­¤`eçÃf ×ûïvœ\®žÂƉ”ÖžÀ¤ò}Ë<• Ëø^\î8¹>ÑÂØ`0ô-Œ`è1¤´.Ž/mÏJÀÍÍ‚-‹ð©€¹B07A¥Y>€Çj¥ÿfCŽŸot±ÿ?ÀyŽ“3e| CÝ0…€ =‚ô÷2^òx—ÕJÿµºÖ üÔ¿yÀHW¹p­ãäë1Á C¿Áx =ÅO ¦üg±Zé¿RW‰Ë`:ð&ððgÇÉÍêQ‰ C¿Âx =‚”Ö4Êrß;ð>ð7´Ò±qR CÿÁx =Å À·Ð^€7üÇëÀŽ“{·'3 †þÀÿç¨ohØ¥³IEND®B`‚hypre-2.33.0/src/docs/usr-manual/index.rst000066400000000000000000000011751477326011500204040ustar00rootroot00000000000000.. Copyright (c) 1998 Lawrence Livermore National Security, LLC and other HYPRE Project Developers. See the top-level COPYRIGHT file for details. SPDX-License-Identifier: (Apache-2.0 OR MIT) .. hypre documentation master file, created by sphinx-quickstart on Fri Nov 17 15:46:25 2017. You can adapt this file completely to your liking, but it should at least contain the root `toctree` directive. Documentation for hypre ======================= .. include:: ../copyright.txt .. toctree:: :maxdepth: 3 ch-intro ch-struct ch-sstruct ch-fei ch-ij ch-solvers ch-misc ch-references ch-api hypre-2.33.0/src/docs/usr-manual/requirements.txt000066400000000000000000000004121477326011500220200ustar00rootroot00000000000000# Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) sphinx>=5.3 breathe>=4.34 sphinx-rtd-theme>=1.1.1 docutils>=0.17.1 hypre-2.33.0/src/docs/usr-manual/solvers-ads.rst000066400000000000000000000313241477326011500215360ustar00rootroot00000000000000.. Copyright (c) 1998 Lawrence Livermore National Security, LLC and other HYPRE Project Developers. See the top-level COPYRIGHT file for details. SPDX-License-Identifier: (Apache-2.0 OR MIT) .. _ADS: ADS ============================================================================== The Auxiliary-space Divergence Solver (ADS) is a parallel unstructured solver similar to AMS, but targeting :math:`H(div)` instead of :math:`H(curl)` problems. Its usage and options are very similar to those of AMS, and in general the relationship between ADS and AMS is analogous to that between AMS and AMG. Specifically ADS was designed for the scalable solution of linear systems arising in the finite element discretization of the variational problem .. math:: :label: ads-hdiv \mbox{Find } {\mathbf u} \in {\mathbf W}_h \>:\qquad (\alpha\, \nabla \cdot {\mathbf u}, \nabla \cdot {\mathbf v}) + (\beta\, {\mathbf u}, {\mathbf v}) = ({\mathbf f}, {\mathbf v})\,, \qquad \mbox{for all } {\mathbf v} \in {\mathbf W}_h \,, where :math:`{\mathbf W}_h` is the lowest order Raviart-Thomas (face) finite element space, and :math:`\alpha>0` and :math:`\beta>0` are scalar, or SPD matrix variable coefficients. It is based on the auxiliary space methods for :math:`H(div)` problems proposed in [HiXu2006]_. Overview ------------------------------------------------------------------------------ Let :math:`{\mathbf A}` and :math:`{\mathbf b}` be the stiffness matrix and the load vector corresponding to :eq:`ads-hdiv`. Then the resulting linear system of interest reads, .. math:: :label: ads-hdiv-ls {\mathbf A}\, {\mathbf x} = {\mathbf b} \,. The coefficients :math:`\alpha` and :math:`\beta` are naturally associated with the "stiffness" and "mass" terms of :math:`{\mathbf A}`. Besides :math:`{\mathbf A}` and :math:`{\mathbf b}`, ADS requires the following additional user input: #. The discrete curl matrix :math:`C` representing the faces of the mesh in terms of its edges. :math:`C` has as many rows as the number of faces in the mesh, with each row having nonzero entries :math:`+1` and :math:`-1` in the columns corresponding to the edges composing the face. The sign is determined based on the orientation of the edges relative to the face. We require that :math:`C` includes all (interior and boundary) faces and edges. #. The discrete gradient matrix :math:`G` representing the edges of the mesh in terms of its vertices. :math:`G` has as many rows as the number of edges in the mesh, with each row having two nonzero entries: :math:`+1` and :math:`-1` in the columns corresponding to the vertices composing the edge. The sign is determined based on the orientation of the edge. We require that :math:`G` includes all (interior and boundary) edges and vertices. #. Vectors :math:`x`, :math:`y`, and :math:`z` representing the coordinates of the vertices of the mesh. Internally, ADS proceeds with the construction of the following additional objects: * :math:`A_C` -- the curl-curl matrix :math:`C^{\,T} {\mathbf A} C`. * :math:`{\mathbf \Pi}` -- the matrix representation of the interpolation operator from vector linear to face finite elements. * :math:`{\mathbf A}_{{\mathbf \Pi}}` -- the vector nodal matrix :math:`{\mathbf \Pi}^{\,T} {\mathbf A} {\mathbf \Pi}`. * :math:`B_C` and :math:`{\mathbf B}_{{\mathbf \Pi}}` -- efficient (AMS/AMG) solvers for :math:`A_C` and :math:`{\mathbf A}_{{\mathbf \Pi}}`. The solution procedure then is a three-level method using smoothing in the original face space and subspace corrections based on :math:`B_C` and :math:`{\mathbf B}_{{\mathbf \Pi}}`. We can employ a number of options here utilizing various combinations of the smoother and solvers in additive or multiplicative fashion. Sample Usage ------------------------------------------------------------------------------ ADS can be used either as a solver or as a preconditioner. Below we list the sequence of hypre calls needed to create and use it as a solver. We start with the allocation of the ``HYPRE_Solver`` object: .. code-block:: c HYPRE_Solver solver; HYPRE_ADSCreate(&solver); Next, we set a number of solver parameters. Some of them are optional, while others are necessary in order to perform the solver setup. The user is required to provide the discrete curl and gradient matrices :math:`C` and :math:`G`. ADS expects a matrix defined on the whole mesh with no boundary faces, edges or nodes excluded. It is essential to **not** impose any boundary conditions on :math:`C` or :math:`G`. Regardless of which hypre conceptual interface was used to construct the matrices, one can always obtain a ParCSR version of them. This is the expected format in the following functions. .. code-block:: c HYPRE_ADSSetDiscreteCurl(solver, C); HYPRE_ADSSetDiscreteGradient(solver, G); Next, ADS requires the coordinates of the vertices in the mesh as three hypre parallel vectors. The corresponding function call reads: .. code-block:: c HYPRE_ADSSetCoordinateVectors(solver, x, y, z); The remaining solver parameters are optional. For example, the user can choose a different cycle type by calling .. code-block:: c HYPRE_ADSSetCycleType(solver, cycle_type); /* default value: 1 */ The available cycle types in ADS are: * ``cycle_type=1``: multiplicative solver :math:`(01210)` * ``cycle_type=2``: additive solver :math:`(0+1+2)` * ``cycle_type=3``: multiplicative solver :math:`(02120)` * ``cycle_type=4``: additive solver :math:`(010+2)` * ``cycle_type=5``: multiplicative solver :math:`(0102010)` * ``cycle_type=6``: additive solver :math:`(1+020)` * ``cycle_type=7``: multiplicative solver :math:`(0201020)` * ``cycle_type=8``: additive solver :math:`(0(1+2)0)` * ``cycle_type=11``: multiplicative solver :math:`(013454310)` * ``cycle_type=12``: additive solver :math:`(0+1+3+4+5)` * ``cycle_type=13``: multiplicative solver :math:`(034515430)` * ``cycle_type=14``: additive solver :math:`(01(3+4+5)10)` Here we use the following convention for the three subspace correction methods: :math:`0` refers to smoothing, :math:`1` stands for AMS based on :math:`B_C`, and :math:`2` refers to a call to BoomerAMG for :math:`{\mathbf B}_{{\mathbf \Pi}}`. The values :math:`3`, :math:`4` and :math:`5` refer to the scalar subspaces corresponding to the :math:`x`, :math:`y` and :math:`z` components of :math:`\mathbf \Pi`. The abbreviation :math:`xyyz` for :math:`x,y,z \in \{0,1,2,3,4,5\}` refers to a multiplicative subspace correction based on solvers :math:`x`, :math:`y`, :math:`y`, and :math:`z` (in that order). The abbreviation :math:`x+y+z` stands for an additive subspace correction method based on :math:`x`, :math:`y` and :math:`z` solvers. The additive cycles are meant to be used only when ADS is called as a preconditioner. In our experience the choices ``cycle_type=1,5,8,11,13`` often produced fastest solution times, while ``cycle_type=7`` resulted in smallest number of iterations. Additional solver parameters, such as the maximum number of iterations, the convergence tolerance and the output level, can be set with .. code-block:: c HYPRE_ADSSetMaxIter(solver, maxit); /* default value: 20 */ HYPRE_ADSSetTol(solver, tol); /* default value: 1e-6 */ HYPRE_ADSSetPrintLevel(solver, print); /* default value: 1 */ More advanced parameters, affecting the smoothing and the internal AMS and AMG solvers, can be set with the following three functions: .. code-block:: c HYPRE_ADSSetSmoothingOptions(solver, 2, 1, 1.0, 1.0); HYPRE_ADSSetAMSOptions(solver, 11, 10, 1, 3, 0.25, 0, 0); HYPRE_ADSSetAMGOptions(solver, 10, 1, 3, 0.25, 0, 0); We note that the AMS cycle type, which is the second parameter of ``HYPRE_ADSSetAMSOptions`` should be greater than 10, unless the high-order interface of ``HYPRE_ADSSetInterpolations`` described in the next subsection is being used. After the above calls, the solver is ready to be constructed. The user has to provide the stiffness matrix :math:`{\mathbf A}` (in ParCSR format) and the hypre parallel vectors :math:`{\mathbf b}` and :math:`{\mathbf x}`. (The vectors are actually not used in the current ADS setup.) The setup call reads, .. code-block:: c HYPRE_ADSSetup(solver, A, b, x); It is important to note the order of the calling sequence. For example, do **not** call ``HYPRE_ADSSetup`` before calling each of the functions ``HYPRE_ADSSetDiscreteCurl``, ``HYPRE_ADSSetDiscreteGradient`` and ``HYPRE_ADSSetCoordinateVectors``. Once the setup has completed, we can solve the linear system by calling .. code-block:: c HYPRE_ADSSolve(solver, A, b, x); Finally, the solver can be destroyed with .. code-block:: c HYPRE_ADSDestroy(&solver); More details can be found in the files ``ads.h`` and ``ads.c`` located in the ``parcsr_ls`` directory. High-order Discretizations ------------------------------------------------------------------------------ Similarly to AMS, ADS also provides support for (arbitrary) high-order :math:`H(div)` discretizations. Since the robustness of ADS depends on the performance of AMS and BoomerAMG on the associated (high-order) auxiliary subspace problems, we note that the convergence may not be optimal for large polynomial degrees :math:`k \geq 1`. In the high-order ADS interface, the user does not need to provide the coordinates of the vertices, but instead should construct and pass the Raviart-Thomas and Nedelec interpolation matrices :math:`{\mathbf \Pi}_{RT}` and :math:`{\mathbf \Pi}_{ND}` which map (high-order) vector nodal finite elements into the (high-order) Raviart-Thomas and Nedelec space. In other words, these are the (parallel) matrix representation of the interpolation mappings from :math:`\mathrm{P}_k^3 / \mathrm{Q}_k^3` into :math:`\mathrm{RT}_{k-1}` and :math:`\mathrm{ND}_k`, see [HiXu2006]_, [KoVa2009]_. We require these matrices as inputs, since in the high-order case their entries very much depend on the particular choice of the basis functions in the finite element spaces, as well as on the geometry of the mesh elements. The columns of the :math:`{\mathbf \Pi}` matrices should use a node-based numbering, where the :math:`x`/:math:`y`/:math:`z` components of the first node (vertex or high-order degree of freedom) should be listed first, followed by the :math:`x`/:math:`y`/:math:`z` components of the second node and so on (see the documentation of ``HYPRE_BoomerAMGSetDofFunc``). Furthermore, each interpolation matrix can be split into :math:`x`, :math:`y` and :math:`z` components by defining :math:`{\mathbf \Pi}^x \varphi = {\mathbf \Pi} (\varphi,0,0)`, and similarly for :math:`{\mathbf \Pi}^y` and :math:`{\mathbf \Pi}^z`. The discrete gradient and curl matrices :math:`G` and :math:`C` should correspond to the mappings :math:`\varphi \in \mathrm{P}_k^3 / \mathrm{Q}_k^3 \mapsto \nabla \varphi \in \mathrm{ND}_k` and :math:`{\mathbf u} \in \mathrm{ND}_k \mapsto \nabla \times {\mathbf u} \in \mathrm{RT}_{k-1}`, so even though their values are still independent of the mesh coordinates, they will not be :math:`\pm 1`, but will be determined by the particular form of the high-order basis functions and degrees of freedom. With these matrices, the high-order setup procedure is simply .. code-block:: c HYPRE_ADSSetDiscreteCurl(solver, C); HYPRE_ADSSetDiscreteGradient(solver, G); HYPRE_ADSSetInterpolations(solver, RT_Pi, NULL, NULL, NULL, ND_Pi, NULL, NULL, NULL); We remark that the above interface calls can also be used in the lowest-order case (or even other types of discretizations), but we recommend calling the previously described ``HYPRE_ADSSetCoordinateVectors`` instead, since this allows ADS to handle the construction and use of the interpolations internally. Specifying the monolithic :math:`{\mathbf \Pi}_{RT}` limits the ADS cycle type options to those less than 10. Alternatively one can separately specify the :math:`x`, :math:`y` and :math:`z` components of :math:`{\mathbf \Pi}_{RT}`. .. code-block:: c HYPRE_ADSSetInterpolations(solver, NULL, RT_Pix, RT_Piy, RT_Piz, ND_Pi, NULL, NULL, NULL); which enables the use of ADS cycle types with index greater than 10. The same holds for :math:`{\mathbf \Pi}_{ND}` and its components, e.g. to enable the subspace AMS cycle type greater then 10 we need to call .. code-block:: c HYPRE_ADSSetInterpolations(solver, NULL, RT_Pix, RT_Piy, RT_Piz, NULL, ND_Pix, ND_Piy, ND_Piz); Finally, both :math:`{\mathbf \Pi}` and their components can be passed to the solver: .. code-block:: c HYPRE_ADSSetInterpolations(solver, RT_Pi, RT_Pix, RT_Piy, RT_Piz ND_Pi, ND_Pix, ND_Piy, ND_Piz); which will duplicate some memory, but allows for experimentation with all available ADS and AMS cycle types. hypre-2.33.0/src/docs/usr-manual/solvers-ams.rst000066400000000000000000000467231477326011500215600ustar00rootroot00000000000000.. Copyright (c) 1998 Lawrence Livermore National Security, LLC and other HYPRE Project Developers. See the top-level COPYRIGHT file for details. SPDX-License-Identifier: (Apache-2.0 OR MIT) .. _AMS: AMS ============================================================================== AMS (the Auxiliary-space Maxwell Solver) is a parallel unstructured Maxwell solver for edge finite element discretizations of the variational problem .. math:: :label: ams-maxwell \mbox{Find } {\mathbf u} \in {\mathbf V}_h \>:\qquad (\alpha\, \nabla \times {\mathbf u}, \nabla \times {\mathbf v}) + (\beta\, {\mathbf u}, {\mathbf v}) = ({\mathbf f}, {\mathbf v})\,, \qquad \mbox{for all } {\mathbf v} \in {\mathbf V}_h \,. Here :math:`{\mathbf V}_h` is the lowest order Nedelec (edge) finite element space, and :math:`\alpha>0` and :math:`\beta \ge 0` are scalar, or SPD matrix coefficients. AMS was designed to be scalable on problems with variable coefficients, and allows for :math:`\beta` to be zero in part or the whole domain. In either case the resulting problem is only semidefinite, and for solvability the right-hand side should be chosen to satisfy compatibility conditions. AMS is based on the auxiliary space methods for definite Maxwell problems proposed in [HiXu2006]_. For more details, see [KoVa2009]_. Overview ------------------------------------------------------------------------------ Let :math:`{\mathbf A}` and :math:`{\mathbf b}` be the stiffness matrix and the load vector corresponding to :eq:`ams-maxwell`. Then the resulting linear system of interest reads, .. math:: :label: ams-maxwell-ls {\mathbf A}\, {\mathbf x} = {\mathbf b} \,. The coefficients :math:`\alpha` and :math:`\beta` are naturally associated with the "stiffness" and "mass" terms of :math:`{\mathbf A}`. Besides :math:`{\mathbf A}` and :math:`{\mathbf b}`, AMS requires the following additional user input: #. The discrete gradient matrix :math:`G` representing the edges of the mesh in terms of its vertices. :math:`G` has as many rows as the number of edges in the mesh, with each row having two nonzero entries: :math:`+1` and :math:`-1` in the columns corresponding to the vertices composing the edge. The sign is determined based on the orientation of the edge. We require that :math:`G` includes all (interior and boundary) edges and vertices. #. The representations of the constant vector fields :math:`(1,0,0)`, :math:`(0,1,0)`, and :math:`(0,0,1)` in the :math:`{\mathbf V}_h` basis, given as three vectors: :math:`G_x`, :math:`G_y`, and :math:`G_z`. Note that since no boundary conditions are imposed on :math:`G`, the above vectors can be computed as :math:`G_x = G x`, :math:`G_y = G y` and :math:`G_z = G z`, where :math:`x`, :math:`y`, and :math:`z` are vectors representing the coordinates of the vertices of the mesh. In addition to the above quantities, AMS can utilize the following (optional) information: * The Poisson matrices :math:`A_\alpha` and :math:`A_\beta`, corresponding to assembling of the forms :math:`(\alpha\, \nabla u, \nabla v)+(\beta\, u, v)` and :math:`(\beta\, \nabla u, \nabla v)` using standard linear finite elements on the same mesh. Internally, AMS proceeds with the construction of the following additional objects: * :math:`A_G` -- a matrix associated with the mass term which is either :math:`G^T {\mathbf A} G` or the Poisson matrix :math:`A_\beta` (if given). * :math:`{\mathbf \Pi}` -- the matrix representation of the interpolation operator from vector linear to edge finite elements. * :math:`{\mathbf A}_{{\mathbf \Pi}}` -- a matrix associated with the stiffness term which is either :math:`{\mathbf \Pi}^{\,T} {\mathbf A} {\mathbf \Pi}` or a block-diagonal matrix with diagonal blocks :math:`A_\alpha` (if given). * :math:`B_G` and :math:`{\mathbf B}_{{\mathbf \Pi}}` -- efficient (AMG) solvers for :math:`A_G` and :math:`{\mathbf A}_{{\mathbf \Pi}}`. The solution procedure then is a three-level method using smoothing in the original edge space and subspace corrections based on :math:`B_G` and :math:`{\mathbf B}_{{\mathbf \Pi}}`. We can employ a number of options here utilizing various combinations of the smoother and solvers in additive or multiplicative fashion. If :math:`\beta` is identically zero one can skip the subspace correction associated with :math:`G`, in which case the solver is a two-level method. Sample Usage ------------------------------------------------------------------------------ AMS can be used either as a solver or as a preconditioner. Below we list the sequence of hypre calls needed to create and use it as a solver. See example code ``ex15.c`` for a complete implementation. We start with the allocation of the ``HYPRE_Solver`` object: .. code-block:: c HYPRE_Solver solver; HYPRE_AMSCreate(&solver); Next, we set a number of solver parameters. Some of them are optional, while others are necessary in order to perform the solver setup. AMS offers the option to set the space dimension. By default we consider the dimension to be :math:`3`. The only other option is :math:`2`, and it can be set with the function given below. We note that a 3D solver will still work for a 2D problem, but it will be slower and will require more memory than necessary. .. code-block:: c HYPRE_AMSSetDimension(solver, dim); The user is required to provide the discrete gradient matrix :math:`G`. AMS expects a matrix defined on the whole mesh with no boundary edges/nodes excluded. It is essential to **not** impose any boundary conditions on :math:`G`. Regardless of which hypre conceptual interface was used to construct :math:`G`, one can obtain a ParCSR version of it. This is the expected format in the following function. .. code-block:: c HYPRE_AMSSetDiscreteGradient(solver, G); In addition to :math:`G`, we need one additional piece of information in order to construct the solver. The user has the option to choose either the coordinates of the vertices in the mesh or the representations of the constant vector fields in the edge element basis. In both cases three hypre parallel vectors should be provided. For 2D problems, the user can set the third vector to NULL. The corresponding function calls read: .. code-block:: c HYPRE_AMSSetCoordinateVectors(solver,x,y,z); or .. code-block:: c HYPRE_AMSSetEdgeConstantVectors(solver, one_zero_zero, zero_one_zero, zero_zero_one); The vectors ``one_zero_zero``, ``zero_one_zero`` and ``zero_zero_one`` above correspond to the constant vector fields :math:`(1,0,0)`, :math:`(0,1,0)` and :math:`(0,0,1)`. The remaining solver parameters are optional. For example, the user can choose a different cycle type by calling .. code-block:: c HYPRE_AMSSetCycleType(solver, cycle_type); /* default value: 1 */ The available cycle types in AMS are: * ``cycle_type=1``: multiplicative solver :math:`(01210)` * ``cycle_type=2``: additive solver :math:`(0+1+2)` * ``cycle_type=3``: multiplicative solver :math:`(02120)` * ``cycle_type=4``: additive solver :math:`(010+2)` * ``cycle_type=5``: multiplicative solver :math:`(0102010)` * ``cycle_type=6``: additive solver :math:`(1+020)` * ``cycle_type=7``: multiplicative solver :math:`(0201020)` * ``cycle_type=8``: additive solver :math:`(0(1+2)0)` * ``cycle_type=11``: multiplicative solver :math:`(013454310)` * ``cycle_type=12``: additive solver :math:`(0+1+3+4+5)` * ``cycle_type=13``: multiplicative solver :math:`(034515430)` * ``cycle_type=14``: additive solver :math:`(01(3+4+5)10)` Here we use the following convention for the three subspace correction methods: :math:`0` refers to smoothing, :math:`1` stands for BoomerAMG based on :math:`B_G`, and :math:`2` refers to a call to BoomerAMG for :math:`{\mathbf B}_{{\mathbf \Pi}}`. The values :math:`3`, :math:`4` and :math:`5` refer to the scalar subspaces corresponding to the :math:`x`, :math:`y` and :math:`z` components of :math:`\mathbf \Pi`. The abbreviation :math:`xyyz` for :math:`x,y,z \in \{0,1,2,3,4,5\}` refers to a multiplicative subspace correction based on solvers :math:`x`, :math:`y`, :math:`y`, and :math:`z` (in that order). The abbreviation :math:`x+y+z` stands for an additive subspace correction method based on :math:`x`, :math:`y` and :math:`z` solvers. The additive cycles are meant to be used only when AMS is called as a preconditioner. In our experience the choices ``cycle_type=1,5,8,11,13`` often produced fastest solution times, while ``cycle_type=7`` resulted in smallest number of iterations. Additional solver parameters, such as the maximum number of iterations, the convergence tolerance and the output level, can be set with .. code-block:: c HYPRE_AMSSetMaxIter(solver, maxit); /* default value: 20 */ HYPRE_AMSSetTol(solver, tol); /* default value: 1e-6 */ HYPRE_AMSSetPrintLevel(solver, print); /* default value: 1 */ More advanced parameters, affecting the smoothing and the internal AMG solvers, can be set with the following three functions: .. code-block:: c HYPRE_AMSSetSmoothingOptions(solver, 2, 1, 1.0, 1.0); HYPRE_AMSSetAlphaAMGOptions(solver, 10, 1, 3, 0.25, 0, 0); HYPRE_AMSSetBetaAMGOptions(solver, 10, 1, 3, 0.25, 0, 0); For (singular) problems where :math:`\beta = 0` in the whole domain, different (in fact simpler) version of the AMS solver is offered. To allow for this simplification, use the following hypre call .. code-block:: c HYPRE_AMSSetBetaPoissonMatrix(solver, NULL); If :math:`\beta` is zero only in parts of the domain, the problem is still singular, but the AMS solver will try to detect this and construct a non-singular preconditioner. Though this often works well in practice, AMS also provides a more robust version for solving such singular problems to very low convergence tolerances. This version takes advantage of additional information: the list of nodes which are interior to a zero-conductivity region provided by the function .. code-block:: c HYPRE_AMSSetInteriorNodes(solver, HYPRE_ParVector interior_nodes); A node is interior, if its entry in the ``interior_nodes`` array is :math:`1.0`. Based on this array, a restricted discrete gradient operator :math:`G_0` is constructed, and AMS is then defined based on the matrix :math:`{\mathbf A}+\delta G_0^TG_0` which is non-singular, and a small :math:`\delta>0` perturbation of :math:`{\mathbf A}`. When iterating with this preconditioner, it is advantageous to project on the compatible subspace :math:`Ker(G_0^T)`. This can be done periodically, or manually through the functions .. code-block:: c HYPRE_AMSSetProjectionFrequency(solver, int projection_frequency); HYPRE_AMSProjectOutGradients(solver, HYPRE_ParVector x); Two additional matrices are constructed in the setup of the AMS method---one corresponding to the coefficient :math:`\alpha` and another corresponding to :math:`\beta`. This may lead to prohibitively high memory requirements, and the next two function calls may help to save some memory. For example, if the Poisson matrix with coefficient :math:`\beta` (denoted by ``Abeta``) is available then one can avoid one matrix construction by calling .. code-block:: c HYPRE_AMSSetBetaPoissonMatrix(solver, Abeta); Similarly, if the Poisson matrix with coefficient :math:`\alpha` is available (denoted by ``Aalpha``) the second matrix construction can also be avoided by calling .. code-block:: c HYPRE_AMSSetAlphaPoissonMatrix(solver, Aalpha); Note the following regarding these functions: * Both of them change their input. More specifically, the diagonal entries of the input matrix corresponding to eliminated degrees of freedom (due to essential boundary conditions) are penalized. * It is assumed that their essential boundary conditions of :math:`{\mathbf A}`, ``Abeta`` and ``Aalpha`` are on the same part of the boundary. * ``HYPRE_AMSSetAlphaPoissonMatrix`` forces the AMS method to use a simpler, but weaker (in terms of convergence) method. With this option, the multiplicative AMS cycle is not guaranteed to converge with the default parameters. The reason for this is the fact the solver is not variationally obtained from the original matrix (it utilizes the auxiliary Poisson--like matrices ``Abeta`` and ``Aalpha``). Therefore, it is recommended in this case to use AMS as preconditioner only. After the above calls, the solver is ready to be constructed. The user has to provide the stiffness matrix :math:`{\mathbf A}` (in ParCSR format) and the hypre parallel vectors :math:`{\mathbf b}` and :math:`{\mathbf x}`. (The vectors are actually not used in the current AMS setup.) The setup call reads, .. code-block:: c HYPRE_AMSSetup(solver, A, b, x); It is important to note the order of the calling sequence. For example, do **not** call ``HYPRE_AMSSetup`` before calling ``HYPRE_AMSSetDiscreteGradient`` and one of the functions ``HYPRE_AMSSetCoordinateVectors`` or ``HYPRE_AMSSetEdgeConstantVectors``. Once the setup has completed, we can solve the linear system by calling .. code-block:: c HYPRE_AMSSolve(solver, A, b, x); Finally, the solver can be destroyed with .. code-block:: c HYPRE_AMSDestroy(&solver); More details can be found in the files ``ams.h`` and ``ams.c`` located in the ``parcsr_ls`` directory. High-order Discretizations ------------------------------------------------------------------------------ In addition to the interface for the lowest-order Nedelec elements described in the previous subsections, AMS also provides support for (arbitrary) high-order Nedelec element discretizations. Since the robustness of AMS depends on the performance of BoomerAMG on the associated (high-order) auxiliary subspace problems, we note that the convergence may not be optimal for large polynomial degrees :math:`k \geq 1`. In the high-order AMS interface, the user does not need to provide the coordinates of the vertices (or the representations of the constant vector fields in the edge basis), but instead should construct and pass the Nedelec interpolation matrix :math:`{\mathbf \Pi}` which maps (high-order) vector nodal finite elements into the (high-order) Nedelec space. In other words, :math:`{\mathbf \Pi}` is the (parallel) matrix representation of the interpolation mapping from :math:`\mathrm{P}_k^3`/:math:`\mathrm{Q}_k^3` into :math:`\mathrm{ND}_k`, see [HiXu2006]_, [KoVa2009]_. We require this matrix as an input, since in the high-order case its entries very much depend on the particular choice of the basis functions in the edge and nodal spaces, as well as on the geometry of the mesh elements. The columns of :math:`{\mathbf \Pi}` should use a node-based numbering, where the :math:`x`/:math:`y`/:math:`z` components of the first node (vertex or high-order degree of freedom) should be listed first, followed by the :math:`x`/:math:`y`/:math:`z` components of the second node and so on (see the documentation of ``HYPRE_BoomerAMGSetDofFunc``). Similarly to the Nedelec interpolation, the discrete gradient matrix :math:`G` should correspond to the mapping :math:`\varphi \in \mathrm{P}_k^3 / \mathrm{Q}_k^3 \mapsto \nabla \varphi \in \mathrm{ND}_k`, so even though its values are still independent of the mesh coordinates, they will not be :math:`\pm 1`, but will be determined by the particular form of the high-order basis functions and degrees of freedom. With these matrices, the high-order setup procedure is simply .. code-block:: c HYPRE_AMSSetDimension(solver, dim); HYPRE_AMSSetDiscreteGradient(solver, G); HYPRE_AMSSetInterpolations(solver, Pi, NULL, NULL, NULL); We remark that the above interface calls can also be used in the lowest-order case (or even other types of discretizations such as those based on the second family of Nedelec elements), but we recommend calling the previously described ``HYPRE_AMSSetCoordinateVectors`` instead, since this allows AMS to handle the construction and use of :math:`{\mathbf \Pi}` internally. Specifying the monolithic :math:`{\mathbf \Pi}` limits the AMS cycle type options to those less than 10. Alternatively one can separately specify the :math:`x`, :math:`y` and :math:`z` components of :math:`\mathbf \Pi`: .. code-block:: c HYPRE_AMSSetInterpolations(solver, NULL, Pix, Piy, Piz); which enables the use of AMS cycle types with index greater than 10. By definition, :math:`{\mathbf \Pi}^x \varphi = {\mathbf \Pi} (\varphi,0,0)`, and similarly for :math:`{\mathbf \Pi}^y` and :math:`{\mathbf \Pi}^z`. Each of these matrices has the same sparsity pattern as :math:`G`, but their entries depend on the coordinates of the mesh vertices. Finally, both :math:`{\mathbf \Pi}` and its components can be passed to the solver: .. code-block:: c HYPRE_AMSSetInterpolations(solver, Pi, Pix, Piy, Piz); which will duplicate some memory, but allows for experimentation with all available AMS cycle types. Non-conforming AMR Grids ------------------------------------------------------------------------------ AMS could also be applied to problems with adaptive mesh refinement (AMR) posed on non-conforming quadrilateral/hexahedral meshes, see [GrKo2015]_ for more details. On non-conforming grids (assuming also arbitrarily high-order elements), each finite element space has two versions: a conforming one, e.g. :math:`\mathrm{Q}_k^{c} / \mathrm{ND}_k^c`, where the *hanging* degrees of freedom are constrained by the conforming (*real*) degrees of freedom, and a non-conforming one, e.g. :math:`\mathrm{Q}_k^{nc} / \mathrm{ND}_k^{nc}` where the non-conforming degrees of freedom (hanging and real) are unconstrained. These spaces are related with the conforming prolongation and the pure restriction operators :math:`P` and :math:`R`, as well as the conforming and non-conforming version of the discrete gradient operator as follows: .. math:: \begin{array}{ccc} \mathrm{Q}_k^{c} & \xrightarrow{G_{c}} & \mathrm{ND}_k^{c} \\ {\scriptstyle P_{\mathrm{Q}}} \Bigg\downarrow \Bigg\uparrow {\scriptstyle R_{\mathrm{Q}}} && {\scriptstyle P_{\mathrm{ND}}} \Bigg\downarrow \Bigg\uparrow {\scriptstyle R_{\mathrm{ND}}} \\ \mathrm{Q}_k^{nc} & \xrightarrow{G_{nc}} & \mathrm{ND}_k^{nc} \\ \end{array} .. \xymatrix{ \mathrm{Q}_k^{c} \ar[r]^{G_{c}} \ar@<-2pt>[d]_{P_{\mathrm{Q}}} & \mathrm{ND}_k^c \ar@<-2pt>[d]_{P_{\mathrm{ND}}} \\ \mathrm{Q}_k^{nc} \ar[r]^{G_{nc}} \ar@<-2pt>[u]_{R_{\mathrm{Q}}} & \mathrm{ND}_k^{nc} \ar@<-2pt>[u]_{R_{\mathrm{ND}}} } Since the linear system is posed on :math:`\mathrm{ND}_k^c`, the user needs to provide the conforming discrete gradient matrix :math:`G_c` to AMS, using ``HYPRE_AMSSetDiscreteGradient``. This matrix is defined by the requirement that the above diagram commutes from :math:`\mathrm{Q}_k^{c}` to :math:`\mathrm{ND}_k^{nc}`, corresponding to the definition .. math:: G_{c} = R_{\mathrm{ND}}\, G_{nc}\, P_{\mathrm{Q}} \,, i.e. the conforming gradient is computed by starting with a conforming nodal :math:`\mathrm{Q}_k` function, interpolating it in the hanging nodes, computing the gradient locally and representing it in the Nedelec space on each element (the non-conforming discrete gradient :math:`G_{nc}` in the above formula), and disregarding the values in the hanging :math:`\mathrm{ND}_k` degrees of freedom. Similar considerations imply that the conforming Nedelec interpolation matrix :math:`{\mathbf \Pi}_{c}` should be defined as .. math:: {\mathbf \Pi}_{c} = R_{\mathrm{ND}}\, {\mathbf \Pi}_{nc}\, P_{\mathrm{Q}^3} \,, with :math:`{\mathbf \Pi}_{nc}` computed element-wise as in the previous subsection. Note that in the low-order case, :math:`{\mathbf \Pi}_{c}` can be computed internally in AMS based only :math:`G_c` and the conforming coordinates of the vertices :math:`x_c`/:math:`y_c`/:math:`z_c`, see [GrKo2015]_. hypre-2.33.0/src/docs/usr-manual/solvers-boomeramg.rst000066400000000000000000000335121477326011500227400ustar00rootroot00000000000000.. Copyright (c) 1998 Lawrence Livermore National Security, LLC and other HYPRE Project Developers. See the top-level COPYRIGHT file for details. SPDX-License-Identifier: (Apache-2.0 OR MIT) BoomerAMG ============================================================================== BoomerAMG is a parallel implementation of the algebraic multigrid method [RuSt1987]_. It can be used both as a solver or as a preconditioner. The user can choose between various different parallel coarsening techniques, interpolation and relaxation schemes. The default settings for CPUs, HMIS (coarsening 8) combined with a distance-two interpolation (6) truncated to 4 or 5 elements per row, should work fairly well for two- and three-dimensional diffusion problems. Additional reduction in complexity and increased scalability can often be achieved using one or two levels of aggressive coarsening. Parameter Options ------------------------------------------------------------------------------ Various BoomerAMG functions and options are mentioned below. However, for a complete listing and description of all available functions, see the reference manual. BoomerAMG's Create function differs from the synopsis in that it has only one parameter ``HYPRE_BoomerAMGCreate(HYPRE_Solver *solver)``. It uses the communicator of the matrix A. Coarsening Options ------------------------------------------------------------------------------ Coarsening can be set by the user using the function ``HYPRE_BoomerAMGSetCoarsenType``. A detailed description of various coarsening techniques can be found in [HeYa2002]_, [Yang2005]_. Various coarsening techniques are available: * the Cleary-Luby-Jones-Plassman (CLJP) coarsening, * parallel versions of the classical RS coarsening described in [HeYa2002]_. * the Falgout coarsening which is a combination of CLJP and the classical RS coarsening algorithm, * CGC and CGC-E coarsenings [GrMS2006a]_, [GrMS2006b]_, * PMIS and HMIS coarsening algorithms which lead to coarsenings with lower complexities [DeYH2004]_ as well as * aggressive coarsening, which can be applied to any of the coarsening techniques mentioned above a nd thus achieving much lower complexities and lower memory use [Stue1999]_. To use aggressive coarsening users have to set the number of levels to which they want to apply aggressive coarsening (starting with the finest level) via ``HYPRE_BoomerAMGSetAggNumLevels``. Since aggressive coarsening requires long range interpolation, multipass interpolation is always used on levels with aggressive coarsening, unless the user specifies another long-range interpolation suitable for aggressive coarsening via ``HYPRE_BoomerAMGSetAggInterpType``.. Note that the default coarsening for CPUs is HMIS, for GPUs PMIS [DeYH2004]_. Interpolation Options ------------------------------------------------------------------------------ Various interpolation techniques can be set using ``HYPRE_BoomerAMGSetInterpType``: * the "classical" interpolation (0) as defined in [RuSt1987]_, * direct interpolation (3) [Stue1999]_, * standard interpolation (8) [Stue1999]_, * an extended "classical" interpolation, which is a long range interpolation and is recommended to be used with PMIS and HMIS coarsening for harder problems (6) [DFNY2008]_, * distance-two interpolation based on matrix operations (17) [LiSY2021]_, * multipass interpolation (4) [Stue1999]_, * two-stage interpolation [Yang2010]_, * Jacobi interpolation [Stue1999]_, * the "classical" interpolation modified for hyperbolic PDEs (2). Jacobi interpolation is only used to improve certain interpolation operators and can be used with ``HYPRE_BoomerAMGSetPostInterpType``. Since some of the interpolation operators might generate large stencils, it is often possible and recommended to control complexity and truncate the interpolation operators using ``HYPRE_BoomerAMGSetTruncFactor`` and/or ``HYPRE_BoomerAMGSetPMaxElmts``, or ``HYPRE_BoomerAMGSetJacobiTruncTheshold`` (for Jacobi interpolation only). Note that the default interpolation is extended+i interpolation [DFNY2008]_ truncated to 4 elements per row, for CPUs, and a version of this interpolation based on matrix operations for GPUs [LiSY2021]_. Non-Galerkin Options ------------------------------------------------------------------------------ In order to reduce communication, there is a non-Galerkin coarse grid sparsification option available [FaSc2014]_. This option can be used by itself or with existing strategies to reduce communication such as aggressive coarsening and HMIS coarsening. To use, call ``HYPRE_BoomerAMGSetNonGalerkTol``, which gives BoomerAMG a list of level specific non-Galerkin drop tolerances. It is common to drop more aggressively on coarser levels. A common choice of drop-tolerances is :math:`[0.0, 0.01, 0.05]` where the value of 0.0 will skip the non-Galerkin process on the first coarse level (level 1), use a drop-tolerance of 0.01 on the second coarse level (level 2) and then use 0.05 on all subsequent coarse levels. While still experimental, this capability has significantly improved performance on a variety of problems. See the ``ij`` driver for an example usage and the reference manual for more details. Smoother Options ------------------------------------------------------------------------------ A good overview of parallel smoothers and their properties can be found in [BFKY2011]_. Various of the described relaxation techniques are available: * weighted Jacobi relaxation (0), * a hybrid Gauss-Seidel / Jacobi relaxation scheme (3 4), * a symmetric hybrid Gauss-Seidel / Jacobi relaxation scheme (6), * l1-Gauss-Seidel or Jacobi (13 14 18 8), * Chebyshev smoothers (16), * two-stage Gauss-Seidel smoothers (11 12) [BKRHSMTY2021]_, * hybrid block and Schwarz smoothers [Yang2004]_, * Incomplete LU factorization, see :ref:`ilu-amg-smoother`. * Factorized Sparse Approximate Inverse (FSAI), see :ref:`fsai-amg-smoother`. Point relaxation schemes can be set using ``HYPRE_BoomerAMGSetRelaxType`` or, if one wants to specifically set the up cycle, down cycle or the coarsest grid, with ``HYPRE_BoomerAMGSetCycleRelaxType``. To use the more complicated smoothers, e.g. block, Schwarz, ILU smoothers, it is necessary to use ``HYPRE_BoomerAMGSetSmoothType`` and ``HYPRE_BoomerAMGSetSmoothNumLevels``. There are further parameter choices for the individual smoothers, which are described in the reference manual. The default relaxation type is l1-Gauss-Seidel, using a forward solve on the down cycle and a backward solve on the up-cycle, to keep symmetry. Note that if BoomerAMG is used as a preconditioner for conjugate gradient, it is necessary to use a symmetric smoother. Other symmetric options are weighted Jacobi or hybrid symmetric Gauss-Seidel. AMG for systems of PDEs ------------------------------------------------------------------------------ If the users wants to solve systems of PDEs and can provide information on which variables belong to which function, BoomerAMG's systems AMG version can also be used. Functions that enable the user to access the systems AMG version are ``HYPRE_BoomerAMGSetNumFunctions``, ``HYPRE_BoomerAMGSetDofFunc`` and ``HYPRE_BoomerAMGSetNodal``. There are basically two approaches to deal with matrices derived from systems of PDEs. The unknown-based approach (which is the default) treats variables corresponding to the same unknown or function separately, i.e., when coarsening or generating interpolation, connections between variables associated with different unknowns are ignored. This can work well for weakly coupled PDEs, but will be problematic for strongly coupled PDEs. For such problems, we recommend to use hypre's multigrid reduction (MGR) solver. The second approach, called the nodal approach, considers all unknowns at a physical grid point together such that coarsening, interpolation and relaxation occur in a point-wise fashion. It is possible and sometimes prefered to combine nodal coarsening with unknown-based interpolation. For this case, ``HYPRE_BoomerAMGSetNodal`` should be set > 1. For details see the reference manual. If the user can provide the near null-space vectors, such as the rigid body modes for linear elasticity problems, an interpolation is available that will incorporate these vectors with ``HYPRE_BoomerAMGSetInterpVectors`` and ``HYPRE_BoomerAMGSetInterpVecVariant``. This can lead to improved convergence and scalability [BaKY2010]_. Special AMG Cycles ------------------------------------------------------------------------------ The default cycle is a V(1,1)-cycle, however it is possible to change the number of sweeps of the up- and down-cycle as well as the coare grid. One can also choose a W-cycle, however for parallel processing this is not recommended, since it is not scalable. BoomerAMG also provides an additive V(1,1)-cycle as well as a mult-additive V(1,1)-cycle and a simplified versioni [VaYa2014]_. The additive variants can only be used with weighted Jacobi or l1-Jacobi smoothing. .. _ch-boomeramg-gpu: GPU-supported Options ------------------------------------------------------------------------------ In general, CUDA unified memory is required for running BoomerAMG solvers on GPUs. However, hypre can also be built without ``--enable-unified-memory`` if all the selected parameters have GPU-support. The currently available GPU-supported BoomerAMG options include: * Coarsening: PMIS (8) * Interpolation: direct (3), BAMG-direct (15), extended (14), extended+i (6) and extended+e (18) * Aggressive coarsening * Second-stage interpolation with aggressive coarsening: extended (5) and extended+e (7) * Smoother: Jacobi (7), l1-Jacobi (18), hybrid Gauss Seidel/SSOR (3 4 6), two-stage Gauss-Seidel (11,12) [BKRHSMTY2021]_, and Chebyshev (16) * Relaxation order can be 0, lexicographic order, or C/F for (7) and (18) Memory locations and execution policies ------------------------------------------------------------------------------ Hypre provides two user-level memory locations, ``HYPRE_MEMORY_HOST`` and ``HYPRE_MEMORY_DEVICE``, where ``HYPRE_MEMORY_HOST`` is always the CPU memory while ``HYPRE_MEMORY_DEVICE`` can be mapped to different memory spaces based on the configure options of hypre. When built with ``--with-cuda``, ``--with-hip``, ``--with-sycl``, or ``--with-device-openmp``, ``HYPRE_MEMORY_DEVICE`` is the GPU device memory, and when built additionally with ``--enable-unified-memory``, it is the GPU unified memory (UM). For a non-GPU build, ``HYPRE_MEMORY_DEVICE`` is also mapped to the CPU memory. The default memory location of hypre's matrix and vector objects is ``HYPRE_MEMORY_DEVICE``, which can be changed at runtime by ``HYPRE_SetMemoryLocation(...)``. The execution policies define the platform of running computations based on the memory locations of participating objects. The default policy is ``HYPRE_EXEC_HOST``, i.e., executing on the host **if the objects are accessible from the host**. It can be adjusted by ``HYPRE_SetExecutionPolicy(...)``. Clearly, this policy only affects objects in UM, since UM is accessible from **both CPUs and GPUs**. A sample code of setting up IJ matrix :math:`A` and solve :math:`Ax=b` using AMG-preconditioned CG on GPUs is shown below. .. code-block:: c cudaSetDevice(device_id); /* GPU binding */ ... HYPRE_Initialize(); /* must be the first HYPRE function call */ ... /* AMG in GPU memory (default) */ HYPRE_SetMemoryLocation(HYPRE_MEMORY_DEVICE); /* setup AMG on GPUs */ HYPRE_SetExecutionPolicy(HYPRE_EXEC_DEVICE); /* use hypre's SpGEMM instead of vendor implementation */ HYPRE_SetSpGemmUseVendor(FALSE); /* use GPU RNG */ HYPRE_SetUseGpuRand(TRUE); if (useHypreGpuMemPool) { /* use hypre's GPU memory pool */ HYPRE_SetGPUMemoryPoolSize(bin_growth, min_bin, max_bin, max_bytes); } else if (useUmpireGpuMemPool) { /* or use Umpire GPU memory pool */ HYPRE_SetUmpireUMPoolName("HYPRE_UM_POOL_TEST"); HYPRE_SetUmpireDevicePoolName("HYPRE_DEVICE_POOL_TEST"); } ... /* setup IJ matrix A */ HYPRE_IJMatrixCreate(comm, first_row, last_row, first_col, last_col, &ij_A); HYPRE_IJMatrixSetObjectType(ij_A, HYPRE_PARCSR); /* GPU pointers; efficient in large chunks */ HYPRE_IJMatrixAddToValues(ij_A, num_rows, num_cols, rows, cols, data); HYPRE_IJMatrixAssemble(ij_A); HYPRE_IJMatrixGetObject(ij_A, (void **) &parcsr_A); ... /* setup AMG */ HYPRE_ParCSRPCGCreate(comm, &solver); HYPRE_BoomerAMGCreate(&precon); HYPRE_BoomerAMGSetRelaxType(precon, rlx_type); /* 3, 4, 6, 7, 18, 11, 12 */ HYPRE_BoomerAMGSetRelaxOrder(precon, FALSE); /* must be false */ HYPRE_BoomerAMGSetCoarsenType(precon, coarsen_type); /* 8 */ HYPRE_BoomerAMGSetInterpType(precon, interp_type); /* 3, 15, 6, 14, 18 */ HYPRE_BoomerAMGSetAggNumLevels(precon, agg_num_levels); HYPRE_BoomerAMGSetAggInterpType(precon, agg_interp_type); /* 5 or 7 */ HYPRE_BoomerAMGSetKeepTranspose(precon, TRUE); /* keep transpose to avoid SpMTV */ HYPRE_BoomerAMGSetRAP2(precon, FALSE); /* RAP in two multiplications (default: FALSE) */ HYPRE_ParCSRPCGSetPrecond(solver, HYPRE_BoomerAMGSolve, HYPRE_BoomerAMGSetup, precon); HYPRE_PCGSetup(solver, parcsr_A, b, x); ... /* solve */ HYPRE_PCGSolve(solver, parcsr_A, b, x); ... HYPRE_Finalize(); /* must be the last HYPRE function call */ ``HYPRE_Initialize()`` must be called and precede all the other ``HYPRE_`` functions, and ``HYPRE_Finalize()`` must be called before exiting. Miscellaneous ------------------------------------------------------------------------------ For best performance, it might be necessary to set certain parameters, which will affect both coarsening and interpolation. One important parameter is the strong threshold, which can be set using the function ``HYPRE_BoomerAMGSetStrongThreshold``. The default value is 0.25, which appears to be a good choice for diffusion problems. The choice of the strength threshold is problem dependent. For example, elasticity problems often require a larger strength threshold. hypre-2.33.0/src/docs/usr-manual/solvers-euclid.rst000066400000000000000000000240251477326011500222340ustar00rootroot00000000000000.. Copyright (c) 1998 Lawrence Livermore National Security, LLC and other HYPRE Project Developers. See the top-level COPYRIGHT file for details. SPDX-License-Identifier: (Apache-2.0 OR MIT) Euclid ============================================================================== .. warning:: Euclid is not actively supported by the hypre development team. We recommend using :ref:`ilu` for parallel ILU algorithms. This new ILU implementation includes 64-bit integers support (for linear systems with more than 2,147,483,647 global unknowns) through both *mixedint* and *bigint* builds of hypre and NVIDIA/AMD GPUs support through the CUDA/HIP backends. The Euclid library is a scalable implementation of the Parallel ILU algorithm that was presented at SC99 [HyPo1999]_, and published in expanded form in the SIAM Journal on Scientific Computing [HyPo2001]_. By *scalable* we mean that the factorization (setup) and application (triangular solve) timings remain nearly constant when the global problem size is scaled in proportion to the number of processors. As with all ILU preconditioning methods, the number of iterations is expected to increase with global problem size. Experimental results have shown that PILU preconditioning is in general more effective than Block Jacobi preconditioning for minimizing total solution time. For scaled problems, the relative advantage appears to increase as the number of processors is scaled upwards. Euclid may also be used to good advantage as a smoother within multigrid methods. Overview ------------------------------------------------------------------------------ Euclid is best thought of as an "extensible ILU preconditioning framework." *Extensible* means that Euclid can (and eventually will, time and contributing agencies permitting) support many variants of ILU(:math:`k`) and ILUT preconditioning. (The current release includes Block Jacobi ILU(:math:`k`) and Parallel ILU(:math:`k`) methods.) Due to this extensibility, and also because Euclid was developed independently of the hypre project, the methods by which one passes runtime parameters to Euclid preconditioners differ in some respects from the hypre norm. While users can directly set options within their code, options can also be passed to Euclid preconditioners via command line switches and/or small text-based configuration files. The latter strategies have the advantage that users will not need to alter their codes as Euclid's capabilities are extended. The following fragment illustrates the minimum coding required to invoke Euclid preconditioning within hypre application contexts. The next subsection provides examples of the various ways in which Euclid's options can be set. The final subsection lists the options, and provides guidance as to the settings that (in our experience) will likely prove effective for minimizing execution time. .. code-block:: c #include "HYPRE_parcsr_ls.h" HYPRE_Solver eu; HYPRE_Solver pcg_solver; HYPRE_ParVector b, x; HYPRE_ParCSRMatrix A; //Instantiate the preconditioner. HYPRE_EuclidCreate(comm, &eu); //Optionally use the following three methods to set runtime options. // 1. pass options from command line or string array. HYPRE_EuclidSetParams(eu, argc, argv); // 2. pass options from a configuration file. HYPRE_EuclidSetParamsFromFile(eu, "filename"); // 3. pass options using interface functions. HYPRE_EuclidSetLevel(eu, 3); ... //Set Euclid as the preconditioning method for some //other solver, using the function calls HYPRE_EuclidSetup //and HYPRE_EuclidSolve. We assume that the pcg_solver //has been properly initialized. HYPRE_PCGSetPrecond(pcg_solver, (HYPRE_PtrToSolverFcn) HYPRE_EuclidSolve, (HYPRE_PtrToSolverFcn) HYPRE_EuclidSetup, eu); //Solve the system by calling the Setup and Solve methods for, //in this case, the HYPRE_PCG solver. We assume that A, b, and x //have been properly initialized. HYPRE_PCGSetup(pcg_solver, (HYPRE_Matrix)A, (HYPRE_Vector)b, (HYPRE_Vector)x); HYPRE_PCGSolve(pcg_solver, (HYPRE_Matrix)parcsr_A, (HYPRE_Vector)b, (HYPRE_Vector)x); //Destroy the Euclid preconditioning object. HYPRE_EuclidDestroy(eu); Setting Options: Examples ------------------------------------------------------------------------------ For expositional purposes, assume you wish to set the ILU(:math:`k`) factorization level to the value :math:`k = 3`. There are several methods of accomplishing this. Internal to Euclid, options are stored in a simple database that contains (name, value) pairs. Various of Euclid's internal (private) functions query this database to determine, at runtime, what action the user has requested. If you enter the option ``-eu_stats 1``, a report will be printed when Euclid's destructor is called; this report lists (among other statistics) the options that were in effect during the factorization phase. **Method 1.** By default, Euclid always looks for a file titled ``database`` in the working directory. If it finds such a file, it opens it and attempts to parse it as a configuration file. Configuration files should be formatted as follows. .. code-block:: bash >cat database #this is an optional comment -level 3 Any line in a configuration file that contains a "``#``" character in the first column is ignored. All other lines should begin with an option *name*, followed by one or more blanks, followed by the option *value*. Note that option names always begin with a ``-`` character. If you include an option name that is not recognized by Euclid, no harm should ensue. **Method 2.** To pass options on the command line, call .. code-block:: c HYPRE_EuclidSetParams(HYPRE_Solver solver, int argc, char *argv[]); where ``argc`` and ``argv`` carry the usual connotation: ``main(int argc, char *argv[])``. If your hypre application is called ``phoo``, you can then pass options on the command line per the following example. .. code-block:: bash mpirun -np 2 phoo -level 3 Since Euclid looks for the ``database`` file when ``HYPRE_EuclidCreate`` is called, and parses the command line when ``HYPRE_EuclidSetParams`` is called, option values passed on the command line will override any similar settings that may be contained in the ``database`` file. Also, if same option name appears more than once on the command line, the final appearance determines the setting. Some options, such as ``-bj`` (see next subsection) are boolean. Euclid always treats these options as the value ``1`` (true) or ``0`` (false). When passing boolean options from the command line the value may be committed, in which case it assumed to be ``1``. Note, however, that when boolean options are contained in a configuration file, either the ``1`` or ``0`` must stated explicitly. **Method 3.** There are two ways in which you can read in options from a file whose name is other than ``database``. First, you can call ``HYPRE_EuclidSetParamsFromFile`` to specify a configuration filename. Second, if you have passed the command line arguments as described above in Method 2, you can then specify the configuration filename on the command line using the ``-db_filename filename`` option, e.g., .. code-block:: bash mpirun -np 2 phoo -db_filename ../myConfigFile **Method 4.** One can also set parameters via interface functions, e.g .. code-block:: c int HYPRE_EuclidSetLevel(HYPRE_Solver solver, int level); For a full set of functions, see the reference manual. Options Summary ------------------------------------------------------------------------------ * **-level** :math:`\langle int \rangle` Factorization level for ILU(:math:`k`). Default: 1. Guidance: for 2D convection-diffusion and similar problems, fastest solution time is typically obtained with levels 4 through 8. For 3D problems fastest solution time is typically obtained with level 1. * **-bj** Use Block Jacobi ILU preconditioning instead of PILU. Default: 0 (false). Guidance: if subdomains contain relatively few nodes (less than 1,000), or the problem is not well partitioned, Block Jacobi ILU may give faster solution time than PILU. * **-eu_stats** When Euclid's destructor is called a summary of runtime settings and timing information is printed to stdout. Default: 0 (false). The timing marks in the report are the maximum over all processors in the MPI communicator. * **-eu_mem** When Euclid's destructor is called a summary of Euclid's memory usage is printed to stdout. Default: 0 (false). The statistics are for the processor whose rank in ``MPI_COMM_WORLD`` is 0. * **-printTestData** This option is used in our autotest procedures, and should not normally be invoked by users. * **-sparseA** :math:`\langle float \rangle` Drop-tolerance for ILU(:math:`k`) factorization. Default: 0 (no dropping). Entries are treated as zero if their absolute value is less than ``sparseA * max``, where ``max`` is the largest absolute value of any entry in the row. Guidance: try this in conjunction with -rowScale. CAUTION: If the coefficient matrix :math:`A` is symmetric, this setting is likely to cause the filled matrix, :math:`F = L+U-I`, to be non-symmetric. This setting has no effect when ILUT factorization is selected. * **-rowScale** Scale values prior to factorization such that the largest value in any row is +1 or -1. Default: 0 (false). CAUTION: If the coefficient matrix :math:`A` is symmetric, this setting is likely to cause the filled matrix, :math:`F = L+U-I`, to be non-symmetric. Guidance: if the matrix is poorly scaled, turning on row scaling may help convergence. * **-ilut** :math:`\langle float \rangle` Use ILUT factorization instead of the default, ILU(:math:`k`). Here, :math:`\langle float \rangle` is the drop tolerance, which is relative to the largest absolute value of any entry in the row being factored. CAUTION: If the coefficient matrix :math:`A` is symmetric, this setting is likely to cause the filled matrix, :math:`F = L+U-I`, to be non-symmetric. NOTE: this option can only be used sequentially! hypre-2.33.0/src/docs/usr-manual/solvers-fac.rst000066400000000000000000000101451477326011500215160ustar00rootroot00000000000000.. Copyright (c) 1998 Lawrence Livermore National Security, LLC and other HYPRE Project Developers. See the top-level COPYRIGHT file for details. SPDX-License-Identifier: (Apache-2.0 OR MIT) FAC ============================================================================== FAC is a parallel fast adaptive composite grid solver for finite volume, cell-centred discretizations of smooth diffusion coefficient problems. To be precise, it is a FACx algorithm since the patch solves consist of only relaxation sweeps. For details of the basic overall algorithms, see [McCo1989]_. Algorithmic particularities include formation of non-Galerkin coarse-grid operators (i.e., coarse-grid operators underlying refinement patches are automatically generated) and non-stored linear/constant interpolation/restriction operators. Implementation particularities include a processor redistribution of the generated coarse-grid operators so that intra-level communication between adaptive mesh refinement (AMR) levels during the solve phase is kept to a minimum. This redistribution is hidden from the user. The user input is essentially a linear system describing the *composite* operator, and the refinement factors between the AMR levels. To form this composite linear system, the AMR grid is described using semi-structured grid parts. Each AMR level grid corresponds to a separate part so that this level grid is simply a collection of boxes, all with the same refinement factor, i.e., it is a struct grid. However, several restrictions are imposed on the patch (box) refinements. First, a refinement box must cover all underlying coarse cells- i.e., refinement of a partial coarse cell is not permitted. Also, the refined/coarse indices must follow a mapping: with :math:`[r_1,r_2,r_3]` denoting the refinement factor and :math:`[a_1,a_2,a_3] \times [b_1,b_2,b_3]` denoting the coarse subbox to be refined, the mapping to the refined patch is .. math:: [r_1*a_1,r_2*a_2,r_3*a_3] \times [r_1*b_1+ r_1-1, r_2*b_2+ r_2-1,r_3*b_3+ r_3-1]. With the AMR grid constructed under these restrictions, the composite matrix can be formed. Since the AMR levels correspond to semi-structured grid parts, the composite matrix is a semi-structured matrix consisting of structured components within each part, and unstructured components describing the coarse-to-fine/fine-to-coarse connections. The structured and unstructured components can be set using stencils and the ``HYPRE_SStructGraphAddEntries`` routine, respectively. The matrix coefficients can be filled after setting these non-zero patterns. Between each pair of successive AMR levels, the coarse matrix underlying the refinement patch must be the identity and the corresponding rows of the rhs must be zero. These can performed using routines ``HYPRE_SStructFACZeroCFSten`` (to zero off the stencil values reaching from coarse boxes into refinement boxes), ``HYPRE_SStructFACZeroFCSten`` (to zero off the stencil values reaching from refinement boxes into coarse boxes), ``HYPRE_SStructFACZeroAMRMatrixData`` (to set the identity at coarse grid points underlying a refinement patch), and ``HYPRE_SStructFACZeroAMRVectorData`` (to zero off a vector at coarse grid points underlying a refinement patch). These routines can simplify the user's matrix setup. For example, consider two successive AMR levels with the coarser level consisting of one box and the finer level consisting of a collection of boxes. Rather than distinguishly setting the stencil values and the identity in the appropriate locations, the user can set the stencil values on the whole coarse grid using the ``HYPRE_SStructMatrixSetBoxValues`` routine and then zero off the appropriate values using the above zeroing routines. The coarse matrix underlying these patches are algebraically generated by operator-collapsing the refinement patch operator and the fine-to-coarse coefficients (this is why stencil values reaching out of a part must be zeroed). This matrix is re-distributed so that each processor has all of its coarse-grid operator. To solve the coarsest AMR level, a PFMG V cycle is used. Note that a minimum of two AMR levels are needed for this solver. hypre-2.33.0/src/docs/usr-manual/solvers-fei.rst000066400000000000000000000167301477326011500215360ustar00rootroot00000000000000.. Copyright (c) 1998 Lawrence Livermore National Security, LLC and other HYPRE Project Developers. See the top-level COPYRIGHT file for details. SPDX-License-Identifier: (Apache-2.0 OR MIT) .. _LSI_solvers: FEI Solvers ============================================================================== .. warning:: FEI is not actively supported by the hypre development team. For similar functionality, we recommend using :ref:`sec-Block-Structured-Grids-FEM`, which allows the representation of block-structured grid problems via hypre's SStruct interface. After the FEI has been used to assemble the global linear system (as described in Chapter :ref:`ch-FEI`), a number of hypre solvers can be called to perform the solution. This is straightforward, if hypre's FEI has been used. If an external FEI is employed, the user needs to link with hypre's implementation of the ``LinearSystemCore`` class, as described in Section :ref:`LSI_install`. Solver parameters are specified as an array of strings, and a complete list of the available options can be found in the FEI section of the reference manual. They are passed to the FEI as in the following example: .. code-block:: c++ nParams = 5; paramStrings = new char*[nParams]; for (i = 0; i < nParams; i++) } paramStrings[i] = new char[100]; strcpy(paramStrings[0], "solver cg"); strcpy(paramStrings[1], "preconditioner diag"); strcpy(paramStrings[2], "maxiterations 100"); strcpy(paramStrings[3], "tolerance 1.0e-6"); strcpy(paramStrings[4], "outputLevel 1"); feiPtr -> parameters(nParams, paramStrings); To solve the linear system of equations, we call .. code-block:: c++ feiPtr -> solve(&status); where the returned value ``status`` indicates whether the solve was successful. Finally, the solution can be retrieved by the following function call: .. code-block:: c++ feiPtr -> getBlockNodeSolution(elemBlkID, nNodes, nodeIDList, solnOffsets, solnValues); where ``nodeIDList`` is a list of nodes in element block ``elemBlkID``, and ``solnOffsets[i]`` is the index pointing to the first location where the variables at node :math:`i` is returned in ``solnValues``. Solvers Available Only through the FEI ------------------------------------------------------------------------------ While most of the solvers from the previous sections are available through the FEI interface, there are number of additional solvers and preconditioners that are accessible only through the FEI. These solvers are briefly described in this section (see also the reference manual). Sequential and Parallel Solvers ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ hypre currently has many iterative solvers. There is also internally a version of the sequential ``SuperLU`` direct solver (developed at U.C. Berkeley) suitable to small problems (may be up to the size of :math:`10000`). In the following we list some of these internal solvers. #. Additional Krylov solvers (FGMRES, TFQMR, symmetric QMR), #. SuperLU direct solver (sequential), #. SuperLU direct solver with iterative refinement (sequential), Parallel Preconditioners ^^^^^^^^^^^^^^^^^^^^^^^^ The performance of the Krylov solvers can be improved by clever selection of preconditioners. Besides those mentioned previously in this chapter, the following preconditioners are available via the ``LinearSystemCore`` interface: #. the modified version of MLI, which requires the finite element substructure matrices to construct the prolongation operators, #. parallel domain decomposition with inexact local solves (``DDIlut``), #. least-squares polynomial preconditioner, #. :math:`2 \times 2` block preconditioner, and #. :math:`2 \times 2` Uzawa preconditioner. Some of these preconditioners can be tuned by a number of internal parameters modifiable by users. A description of these parameters is given in the reference manual. Matrix Reduction ^^^^^^^^^^^^^^^^ For some structural mechanics problems with multi-point constraints the discretization matrix is indefinite (eigenvalues lie in both sides of the imaginary axis). Indefinite matrices are much more difficult to solve than definite matrices. Methods have been developed to reduce these indefinite matrices to definite matrices. Two matrix reduction algorithms have been implemented in hypre, as presented in the following subsections. Schur Complement Reduction ^^^^^^^^^^^^^^^^^^^^^^^^^^ The incoming linear system of equations is assumed to be in the form: .. math:: \left[ \begin{array}{cc} D & B \\ B^T & 0 \end{array} \right] \left[ \begin{array}{c} x_1 \\ x_2 \end{array} \right] = \left[ \begin{array}{c} b_1 \\ b_2 \end{array} \right] where :math:`D` is a diagonal matrix. After Schur complement reduction is applied, the resulting linear system becomes .. math:: - B^T D^{-1} B x_2 = b_2 - B^T D^{-1} b_1. Slide Surface Reduction ^^^^^^^^^^^^^^^^^^^^^^^ With the presence of slide surfaces, the matrix is in the same form as in the case of Schur complement reduction. Here :math:`A` represents the relationship between the master, slave, and other degrees of freedom. The matrix block :math:`[B^T 0]` corresponds to the constraint equations. The goal of reduction is to eliminate the constraints. As proposed by Manteuffel, the trick is to re-order the system into a :math:`3 \times 3` block matrix. .. math:: \left[ \begin{array}{ccc} A_{11} & A_{12} & N \\ A_{21} & A_{22} & D \\ N_{T} & D & 0 \\ \end{array} \right] = \left[ \begin{array}{ccc} A_{11} & \hat{A}_{12} \\ \hat{A}_{21} & \hat{A}_{22}. \end{array} \right] The reduced system has the form : .. math:: (A_{11} - \hat{A}_{21} \hat{A}_{22}^{-1} \hat{A}_{12}) x_1 = b_1 - \hat{A}_{21} \hat{A}_{22}^{-1} b_2, which is symmetric positive definite (SPD) if the original matrix is PD. In addition, :math:`\hat{A}_{22}^{-1}` is easy to compute. There are three slide surface reduction algorithms in hypre. The first follows the matrix formulation in this section. The second is similar except that it replaces the eliminated slave equations with identity rows so that the degree of freedom at each node is preserved. This is essential for certain block algorithms such as the smoothed aggregation multilevel preconditioners. The third is similar to the second except that it is more general and can be applied to problems with intersecting slide surfaces (sequential only for intersecting slide surfaces). Other Features ^^^^^^^^^^^^^^ To improve the efficiency of the hypre solvers, a few other features have been incorporated. We list a few of these features below : #. Preconditioner reuse - For multiple linear solves with matrices that are slightly perturbed from each other, oftentimes the use of the same preconditioners can save preconditioner setup times but suffer little convergence rate degradation. #. Projection methods - For multiple solves that use the same matrix, previous solution vectors can sometimes be used to give a better initial guess for subsequent solves. Two projection schemes have been implemented in hypre - A-conjugate projection (for SPD matrices) and minimal residual projection (for both SPD and non-SPD matrices). #. The sparsity pattern of the matrix is in general not destroyed after it has been loaded to an hypre matrix. But if the matrix is not to be reused, an option is provided to clean up this pattern matrix to conserve memory usage. hypre-2.33.0/src/docs/usr-manual/solvers-fsai.rst000066400000000000000000000130071477326011500217070ustar00rootroot00000000000000.. Copyright (c) 1998 Lawrence Livermore National Security, LLC and other HYPRE Project Developers. See the top-level COPYRIGHT file for details. SPDX-License-Identifier: (Apache-2.0 OR MIT) .. _fsai: FSAI ============================================================================== FSAI is a parallel implementation of the Factorized Sparse Approximate Inverse preconditioner, initially proposed by [KoYe1993]_. Given a symmetric positive definite matrix :math:`A`, FSAI computes a triangular matrix :math:`G` that approximates the inverse of the lower Cholesky factor (:math:`L`) of :math:`A`. This computation is done by minimizing the Frobenius norm :math:`|| I - G L ||_F` without explicit knowledge of :math:`L`. The resulting preconditioner preserves the positive definiteness of :math:`A` and is given by :math:`M^{-1} = G^{T} G`. One of the critical factors determining the quality of sparse approximate inverse preconditioners lies in choosing the sparsity pattern of :math:`G`. While ParaSails employs *a priori* sparsity patterns, FSAI uses an iterative strategy that generates sparsity patterns on the fly, i.e., while computing their nonzero coefficient values concurrently. At every step of the iterative process, the sparsity pattern of a row of :math:`G` is augmented with a fixed number of entries, leading to the most significant reduction of the conditioning number of :math:`G A G^T`. Such a strategy is also called "adaptive FSAI" or "dynamic FSAI" and it can lead to more robust sparse approximate inverses than ParaSails. For more details on how it works, see [JaFe2015]_. Parameter Settings ------------------------------------------------------------------------------ The accuracy and cost of FSAI are determined by three configurations parameters as shown in the table below ================= ======= ============= ================= ======= param type range sug. values default ================= ======= ============= ================= ======= ``max_steps`` int :math:`\ge 0` 5, 10, 30 5 ``max_step_size`` int :math:`\ge 0` 1, 3, 6 3 ``kap_tolerance`` real :math:`\ge 0` 0.0, 1.E-2, 1.E-3 1.E-3 ================= ======= ============= ================= ======= The first parameter, ``max_steps``, controls the number of maximum steps used in the iterative algorithm. The second parameter, ``max_step_size``, gives the maximum number of indices added to the sparsity pattern of :math:`G` at each step. Lastly, the third parameter, ``kap_tolerance``, is a floating-point value used to stop the inclusion of new indices to the sparsity pattern of :math:`G` when the conditioning number of :math:`G A G^T` stagnates. This can be disabled by setting ``kap_tolerance = 0``. Naturally, the preconditioner quality increases for denser sparsity patterns of :math:`G`, but so do its setup and solve costs. For a reasonable balance between accuracy and cost, we recommend that :math:`max\_steps * max\_step\_size \leq 30`. The configuration parameters of FSAI can be set via the following calls: .. code-block:: c HYPRE_FSAISetMaxSteps(HYPRE_Solver solver, HYPRE_Int max_steps); HYPRE_FSAISetMaxStepSize(HYPRE_Solver solver, HYPRE_Int max_step_size); HYPRE_FSAISetKapTolerance(HYPRE_Solver solver, HYPRE_Real kap_tolerance); .. _fsai-amg-smoother: FSAI as Smoother to BoomerAMG ------------------------------------------------------------------------------ As discussed in [PaFa2019]_, the factorized sparse approximate inverse method can be an effective smoother to AMG for several reasons. Particularly, it leads to a symmetric operator, and thus allows AMG to be used as a preconditioner for the conjugate gradient solver. In hypre, FSAI can be used as a complex smoother to BoomerAMG by calling the functions: .. code-block:: c HYPRE_BoomerAMGSetSmoothType(HYPRE_Solver solver, 4); HYPRE_BoomerAMGSetSmoothNumLevels(HYPRE_Solver solver, HYPRE_Int num_levels); where ``num_levels`` is the last multigrid level where FSAI is used. The configuration parameters of the FSAI smoother, as described above, can be set via the following calls: .. code-block:: c HYPRE_BoomerAMGSetFSAIMaxSteps(HYPRE_Solver solver, HYPRE_Int max_steps); HYPRE_BoomerAMGSetFSAIMaxStepSize(HYPRE_Solver solver, HYPRE_Int max_step_size); HYPRE_BoomerAMGSetFSAIKapTolerance(HYPRE_Solver solver, HYPRE_Real kap_tolerance); Implementation Notes ------------------------------------------------------------------------------ * When the matrix :math:`A` is distributed across MPI tasks, FSAI considers only the block diagonal portions of :math:`A` for computing :math:`G`. The resulting preconditioner is effectively a block-Jacobi sparse approximate inverse in the MPI sense. Although this strategy reduces communication costs, it can degrade convergence performance when several tasks are used, especially when FSAI is employed as a preconditioner to a Krylov solver. * The CPU version of FSAI supports threading via OpenMP. To enable it, users need to compile hypre with OpenMP support via the configure option ``--with-openmp``. In this case, FSAI relies on an implementation of BLAS/LAPACK that is thread-safe. The one distributed internally with hypre fulfills this criterion, but care must be taken when linking hypre to external BLAS/LAPACK libraries. In HPC platforms, we recommend using vendor implementations of BLAS/LAPACK for better setup performance of FSAI, regardless of whether using OpenMP or not. * The GPU version of FSAI is under development. hypre-2.33.0/src/docs/usr-manual/solvers-hybrid.rst000066400000000000000000000037101477326011500222460ustar00rootroot00000000000000.. Copyright (c) 1998 Lawrence Livermore National Security, LLC and other HYPRE Project Developers. See the top-level COPYRIGHT file for details. SPDX-License-Identifier: (Apache-2.0 OR MIT) Hybrid ============================================================================== The hybrid solver is designed to detect whether a multigrid preconditioner is needed when solving a linear system and possibly avoid the expensive setup of a preconditioner if a system can be solved efficiently with a diagonally scaled Krylov solver, e.g. a strongly diagonally dominant system. It first uses a diagonally scaled Krylov solver, which can be chosen by the user (the default is conjugate gradient, but one should use GMRES if the matrix of the linear system to be solved is nonsymmetric). It monitors how fast the Krylov solver converges. If there is not sufficient progress, the algorithm switches to a preconditioned Krylov solver. If used through the ``Struct`` interface, the solver is called StructHybrid and can be used with the preconditioners SMG and PFMG (default). It is called ParCSRHybrid, if used through the ``IJ`` interface and is used here with BoomerAMG. The user can determine the average convergence speed by setting a convergence tolerance :math:`0 \leq \theta < 1` via the routine ``HYPRE_StructHybridSetConvergenceTol`` or ``HYPRE_ParCSRHybridSetConvergenceTol``. The default setting is 0.9. The average convergence factor :math:`\rho_i = \left({{\| r_i \|} \over {\| r_0 \|}}\right)^{1/i}` is monitored within the chosen Krylov solver, where :math:`r_i = b - Ax_{i}` is the :math:`i`-th residual. Convergence is considered too slow when .. math:: \left( 1 - {{|\rho_i - \rho_{i-1}|} \over { \max(\rho_i, \rho_{i-1})}} \right) \rho_i > \theta . When this condition is fulfilled the hybrid solver switches from a diagonally scaled Krylov solver to a preconditioned solver. .. Add blank lines to help with navigation pane formatting | | | | | | | | | | | | hypre-2.33.0/src/docs/usr-manual/solvers-ilu.rst000066400000000000000000000250571477326011500215660ustar00rootroot00000000000000.. Copyright (c) 1998 Lawrence Livermore National Security, LLC and other HYPRE Project Developers. See the top-level COPYRIGHT file for details. SPDX-License-Identifier: (Apache-2.0 OR MIT) .. _ilu: ILU ============================================================================== ILU is a suite of parallel incomplete LU factorization algorithms featuring dual threshold (ILUT) and level-based (ILUK) variants. The implementation is based on a domain decomposition framework for achieving distributed parallelism. ILU can be used as a standalone iterative solver (this is not recommended), preconditioner for Krylov subspace methods, or smoother for multigrid methods such as BoomerAMG and MGR. .. note:: ILU is currently only supported by the IJ interface. Overview ------------------------------------------------------------------------------ ILU utilizes a domain decomposition framework. A basic block-Jacobi approach involves performing inexact solutions within the local domains owned by the processes, using parallel local ILU factorizations. In a more advanced approach, the unknowns are partitioned into interior and interface points, where the interface points separate the interior points in adjacent domains. In an algebraic context, this is equivalent to dividing the matrix rows into local (processor-owned) and external (off-processor-owned) blocks. The overall parallel ILU strategy is a two-level method that consists of ILU solves within the local blocks and a global solve involving the Schur complement system, which various iterative approaches in this framework can solve. User-level functions ------------------------------------------------------------------------------ A list of user-level functions for configuring ILU is given below, where each block of functions is marked as *Required*, *Recommended*, *Optional*, or *Exclusively required*. Note that the last two blocks of function calls are exclusively required, i.e., the first block should be called only when ILU is used as a standalone solver, while the second block should be called only when it is used as a preconditioner to GMRES. In the last case, other Krylov methods can be chosen. We refer the reader to :ref:`ch-Solvers` for more information. .. code-block:: c /* (Required) Create ILU solver */ HYPRE_ILUCreate(&ilu_solver); /* (Recommended) General solver options */ HYPRE_ILUSetType(ilu_solver, ilu_type); /* 0, 1, 10, 11, 20, 21, 30, 31, 40, 41, 50 */ HYPRE_ILUSetMaxIter(ilu_solver, max_iter); HYPRE_ILUSetTol(ilu_solver, tol); HYPRE_ILUSetLocalReordering(ilu_solver, reordering); /* 0: none, 1: RCM */ HYPRE_ILUSetPrintLevel(ilu_solver, print_level); /* (Optional) Function calls for ILUK variants */ HYPRE_ILUSetLevelOfFill(ilu_solver, fill); /* (Optional) Function calls for ILUT variants */ HYPRE_ILUSetMaxNnzPerRow(ilu_solver, max_nnz_row); HYPRE_ILUSetDropThreshold(ilu_solver, threshold); /* (Optional) Function calls for GMRES-ILU or NSH-ILU */ HYPRE_ILUSetNSHDropThreshold(ilu_solver, threshold); HYPRE_ILUSetSchurMaxIter(ilu_solver, schur_max_iter); /* (Optional) Function calls for iterative ILU variants */ HYPRE_ILUSetTriSolve(ilu_solver, 0); HYPRE_ILUSetLowerJacobiIters(ilu_solver, ljac_iters); HYPRE_ILUSetUpperJacobiIters(ilu_solver, ujac_iters); /* (Exclusively required) Function calls for using ILU as standalone solver */ HYPRE_ILUSetup(ilu_solver, parcsr_M, b, x); HYPRE_ILUSolve(ilu_solver, parcsr_A, b, x); /* (Exclusively required) Function calls for using ILU as preconditioner to GMRES */ HYPRE_GMRESSetup(gmres_solver, (HYPRE_Matrix)A, (HYPRE_Vector)b, (HYPRE_Vector)x); HYPRE_GMRESSolve(gmres_solver, (HYPRE_Matrix)A, (HYPRE_Vector)b, (HYPRE_Vector)x); /* (Required) Free memory */ HYPRE_ILUDestroy(ilu_solver); A short explanation for each of those functions and its parameters is given next. * ``HYPRE_ILUCreate`` Create the hypre_ILU solver object. * ``HYPRE_ILUDestroy`` Destroy the hypre_ILU solver object. * ``HYPRE_ILUSetType`` Set the type of ILU factorization. Options are: * 0: Block-Jacobi ILUK (BJ-ILUK). * 1: Block-Jacobi ILUT (BJ-ILUT). * 10: GMRES with ILUK (GMRES-ILUK). * 11: GMRES with ILUT (GMRES-ILUT). * 20: NSH with ILUK (NSH-ILUK). * 21: NSH with ILUT (NSH-ILUT). * 30: RAS with ILUK (RAS-ILUK). * 31: RAS with ILUT (RAS-ILUT). * 40: ddPQ-GMRES with ILUK (ddPQ-GMRES-ILUK). * 41: ddPQ-GMRES with ILUT (ddPQ-GMRES-ILUT). * 50: GMRES with RAP-ILU0 with modified ILU0 (GMRES-RAP-ILU0). * ``HYPRE_ILUSetMaxIter`` Set the maximum number of ILU iterations. We recommend setting this value to one when ILU is used as a preconditioner or smoother. * ``HYPRE_ILUSetTol`` Set the convergence tolerance for ILU. We recommend setting this value to zero when ILU is used as a preconditioner or smoother. * ``HYPRE_ILUSetLocalReordering`` Set the local matrix reordering algorithm. * 0: No reordering. * 1: Reverse Cuthill–McKee (RCM). * ``HYPRE_ILUSetPrintLevel`` Set the verbosity level for algorithm statistics. * 0: No output. * 1: Print setup info. * 2: Print solve info. * 3: Print setup and solve info. * ``HYPRE_ILUSetLevelOfFill`` Set the level of fill used by the level-based ILUK strategy. * ``HYPRE_ILUSetMaxNnzPerRow`` Set the maximum number of nonzero entries per row in the triangular factors for ILUT. * ``HYPRE_ILUSetDropThreshold`` Set the threshold for dropping nonzero entries during the construction of the triangular factors for ILUT. * ``HYPRE_ILUSetNSHDropThreshold`` Set the threshold for dropping nonzero entries during the computation of the approximate inverse matrix via NSH-ILU. * ``HYPRE_ILUSetSchurMaxIter`` Set the maximum number of iterations for solving the Schur complement system (GMRES-ILU or NSH-ILU). * ``HYPRE_ILUSetTriSolve`` Set triangular solve method used in ILU's solve phase. Option zero refers to the iterative approach, which leads to good performance in GPUs, and option one refers to the direct (exact) approach. * ``HYPRE_ILUSetLowerJacobiIters`` Set the number of iterations for solving the lower triangular linear system. This option makes sense when enabling the iterative triangular solve approach. * ``HYPRE_ILUSetUpperJacobiIters`` Same as previous function, but for the upper triangular factor. * ``HYPRE_ILUSetup`` Setup a hypre_ILU solver object. * ``HYPRE_ILUSolve`` Solve the linear system with hypre_ILU. * ``HYPRE_ILUDestroy`` Destroy the hypre_ILU solver object. .. note:: For more details about ILU options and parameters, including their default values, we refer the reader to hypre's reference manual or section :ref:`sec-ParCSR-Solvers`. .. _ilu-amg-smoother: ILU as Smoother for BoomerAMG ------------------------------------------------------------------------------ The following functions can be used to configure ILU as a smoother to BoomerAMG: .. code-block:: c /* (Required) Set ILU as smoother to BoomerAMG */ HYPRE_BoomerAMGSetSmoothType(amg_solver, 5); HYPRE_BoomerAMGSetSmoothNumLevels(amg_solver, num_levels); /* (Optional) General ILU configuration parameters */ HYPRE_BoomerAMGSetILUType(amg_solver, ilu_type); HYPRE_BoomerAMGSetILUMaxIter(amg_solver, ilu_max_iter); HYPRE_BoomerAMGSetILULocalReordering(amg_solver, ilu_reordering); /* (Optional) Function calls for ILUK smoother variants */ HYPRE_BoomerAMGSetILULevel(amg_solver, ilu_fill); /* (Optional) Function calls for ILUT smoother variants */ HYPRE_BoomerAMGSetILUDroptol(amg_solver, ilu_threshold); HYPRE_BoomerAMGSetILUMaxRowNnz(amg_solver, ilu_max_nnz_row); /* (Optional) Function calls for iterative ILU smoother variants */ HYPRE_BoomerAMGSetILUTriSolve(amg_solver, 0); HYPRE_BoomerAMGSetILULowerJacobiIters(amg_solver, ilu_ljac_iters); HYPRE_BoomerAMGSetILUUpperJacobiIters(amg_solver, ilu_ujac_iters); where: * ``HYPRE_BoomerAMGSetSmoothNumLevels`` Enable smoothing in the first ``num_levels`` levels of AMG. * ``HYPRE_BoomerAMGSetILUType`` Set the type of ILU factorization. See ``HYPRE_ILUSetType``. * ``HYPRE_BoomerAMGSetILUMaxIter`` Set the number of ILU smoother sweeps. * ``HYPRE_BoomerAMGSetILULocalReordering`` Set the local matrix reordering algorithm. * ``HYPRE_BoomerAMGSetILULevel`` Set ILUK's fill level. * ``HYPRE_BoomerAMGSetILUDroptol`` Set ILUT's threshold. * ``HYPRE_BoomerAMGSetILUMaxRowNnz`` Set ILUT's maximum number of nonzero entries per row. * ``HYPRE_BoomerAMGSetILUTriSolve`` Set triangular solve method. See ``HYPRE_ILUSetTriSolve``. * ``HYPRE_BoomerAMGSetILULowerJacobiIters`` Set the number of iterations for the L factor. * ``HYPRE_BoomerAMGSetILUUpperJacobiIters`` Same as previous function, but for the U factor. GPU support ------------------------------------------------------------------------------ The addition of GPU support to ILU is ongoing work. A few algorithm types have already been fully ported to the CUDA and HIP backends, i.e., both their setup (factorization) and solve phases are executed on the device. Below is a detailed list of which phases (setup and solve) of the various ILU algorithms have been ported to GPUs. In the table, *UVM-Setup* indicates that the setup phase is executed on the CPU (host); at the same time, the triangular factors are stored in a memory space that is accessible from the GPU (device) via unified memory. This feature must be enabled during hypre's configuration. .. list-table:: :widths: 20 20 20 20 :header-rows: 1 * - - CUDA (NVIDIA GPUs) - HIP (AMD GPUs) - SYCL (Intel GPUs) * - **BJ-ILU0** - Setup and Solve - Setup and Solve - UVM-Setup and Solve * - **BJ-ILU(K/T)** - UVM-Setup and Solve - UVM-Setup and Solve - UVM-Setup and Solve * - **GMRES-ILU0** - Setup and Solve - Setup and Solve - UVM-Setup and Solve * - **GMRES-RAP-ILU0** - UVM-Setup and Solve - UVM-Setup and Solve - UVM-Setup and Solve * - **GMRES-ILU(K/T)** - UVM-Setup and Solve - UVM-Setup and Solve - UVM-Setup and Solve * - **ddPQ-GMRES-ILU(K/T)** - UVM-Setup and Solve - UVM-Setup and Solve - UVM-Setup and Solve * - **NSH-ILU(K/T)** - UVM-Setup and Solve - UVM-Setup and Solve - UVM-Setup and Solve * - **RAS-ILU(K/T)** - UVM-Setup and Solve - UVM-Setup and Solve - UVM-Setup and Solve .. hint:: For better setup performance on GPUs, disable local reordering by passing option zero to ``HYPRE_ILUSetLocalReordering`` or ``HYPRE_BoomerAMGSetILULocalReordering``. This may degrade convergence of the iterative solver. .. note:: hypre must be built with ``cuSPARSE`` support when running ILU on NVIDIA GPUs, ``rocSPARSE`` when running on AMD GPUs, or ``oneMKL sparse`` when running on Intel GPUs. hypre-2.33.0/src/docs/usr-manual/solvers-lobpcg.rst000066400000000000000000000035701477326011500222370ustar00rootroot00000000000000.. Copyright (c) 1998 Lawrence Livermore National Security, LLC and other HYPRE Project Developers. See the top-level COPYRIGHT file for details. SPDX-License-Identifier: (Apache-2.0 OR MIT) LOBPCG Eigensolver ============================================================================== LOBPCG (Locally Optimal Block Preconditioned Conjugate Gradient) is a simple, yet very efficient, algorithm suggested in [Knya2001]_, [KLAO2007]_, [BLOPEWeb]_ for computing several smallest eigenpairs of the symmetric generalized eigenvalue problem :math:`Ax=\lambda Bx` with large, possibly sparse, symmetric matrix :math:`A` and symmetric positive definite matrix :math:`B`. The matrix :math:`A` is not assumed to be positive, which also allows one to use LOBPCG to compute the largest eigenpairs of :math:`Ax=\lambda Bx` simply by solving :math:`-Ax=\mu Bx` for the smallest eigenvalues :math:`\mu=-\lambda`. LOBPCG simultaneously computes several eigenpairs together, which is controlled by the ``blockSize`` parameter, see example ``ex11.c``. The LOBCPG also allows one to impose constraints on the eigenvectors of the form :math:`x^T B y_i=0` for a set of vectors :math:`y_i` given to LOBPCG as input parameters. This makes it possible to compute, e.g., 50 eigenpairs by 5 subsequent calls to LOBPCG with the ``blockSize=10``, using deflation. LOBPCG can use preconditioning in two different ways: by running an inner preconditioned PCG linear solver, or by applying the preconditioner directly to the eigenvector residual (option ``-pcgitr 0``). In all other respects, LOBPCG is similar to the PCG linear solver. The LOBPCG code is available for system interfaces: Struct, SStruct, and IJ. It is also used in the Auxiliary-space Maxwell Eigensolver (AME). The LOBPCG setup is similar to the setup for PCG. .. Add blank lines to help with navigation pane formatting | | | | | | | | | | | | | | | | | hypre-2.33.0/src/docs/usr-manual/solvers-maxwell.rst000066400000000000000000000104231477326011500224350ustar00rootroot00000000000000.. Copyright (c) 1998 Lawrence Livermore National Security, LLC and other HYPRE Project Developers. See the top-level COPYRIGHT file for details. SPDX-License-Identifier: (Apache-2.0 OR MIT) Maxwell ============================================================================== Maxwell is a parallel solver for edge finite element discretization of the curl-curl formulation of the Maxwell equation .. math:: \nabla \times \alpha \nabla \times E + \beta E= f, \beta> 0 on semi-structured grids. Details of the algorithm can be found in [JoLe2006]_. The solver can be viewed as an operator-dependent multiple-coarsening algorithm for the Helmholtz decomposition of the error correction. Input to this solver consist of only the linear system and a gradient operator. In fact, if the orientation of the edge elements conforms to a lexicographical ordering of the nodes of the grid, then the gradient operator can be generated with the routine ``HYPRE_MaxwellGrad``: at grid points :math:`(i,j,k)` and :math:`(i-1,j,k),` the produced gradient operator takes values :math:`1` and :math:`-1` respectively, which is the correct gradient operator for the appropriate edge orientation. Since the gradient operator is normalized (i.e., :math:`h` independent) the edge finite element must also be normalized in the discretization. This solver is currently developed for perfectly conducting boundary condition (Dirichlet). Hence, the rows and columns of the matrix that corresponding to the grid boundary must be set to the identity or zeroed off. This can be achieved with the routines ``HYPRE_SStructMaxwellPhysBdy`` and ``HYPRE_SStructMaxwellEliminateRowsCols``. The former identifies the ranks of the rows that are located on the grid boundary, and the latter adjusts the boundary rows and cols. As usual, the rhs of the linear system must also be zeroed off at the boundary rows. This can be done using ``HYPRE_SStructMaxwellZeroVector``. With the adjusted linear system and a gradient operator, the user can form the Maxwell multigrid solver using several different edge interpolation schemes. For problems with smooth coefficients, the natural Nedelec interpolation operator can be used. This is formed by calling ``HYPRE_SStructMaxwellSetConstantCoef`` with the flag :math:`>0` before setting up the solver, otherwise the default edge interpolation is an operator-collapsing/element-agglomeration scheme. This is suitable for variable coefficients. Also, before setting up the solver, the user must pass the gradient operator, whether user or ``HYPRE_MaxwellGrad`` generated, with ``HYPRE_SStructMaxwellSetGrad``. After these preliminary calls, the Maxwell solver can be setup by calling ``HYPRE_SStructMaxwellSetup``. There are two solver cycling schemes that can be used to solve the linear system. To describe these, one needs to consider the augmented system operator .. math:: \bf{A}= \left [ \begin{array}{ll} A_{ee} & A_{en} \\ A_{ne} & A_{nn} \end{array} \right ], where :math:`A_{ee}` is the stiffness matrix corresponding to the above curl-curl formulation, :math:`A_{nn}` is the nodal Poisson operator created by taking the Galerkin product of :math:`A_{ee}` and the gradient operator, and :math:`A_{ne}` and :math:`A_{en}` are the nodal-edge coupling operators (see [JoLe2006]_). The algorithm for this Maxwell solver is based on forming a multigrid hierarchy to this augmented system using the block-diagonal interpolation operator .. math:: \bf{P}= \left[ \begin{array}{ll} P_e & 0 \\ 0 & P_n \end{array} \right], where :math:`P_e` and :math:`P_n` are respectively the edge and nodal interpolation operators determined individually from :math:`A_{ee}` and :math:`A_{nn}.` Taking a Galerkin product between :math:`\bf{A}` and :math:`\bf{P}` produces the next coarse augmented operator, which also has the nodal-edge coupling operators. Applying this procedure recursively produces nodal-edge coupling operators at all levels. Now, the first solver cycling scheme, ``HYPRE_SStructMaxwellSolve``, keeps these coupling operators on all levels of the V-cycle. The second, cheaper scheme, ``HYPRE_SStructMaxwellSolve2``, keeps the coupling operators only on the finest level, i.e., separate edge and nodal V-cycles that couple only on the finest level. hypre-2.33.0/src/docs/usr-manual/solvers-mgr.rst000066400000000000000000000061201477326011500215500ustar00rootroot00000000000000.. Copyright (c) 1998 Lawrence Livermore National Security, LLC and other HYPRE Project Developers. See the top-level COPYRIGHT file for details. SPDX-License-Identifier: (Apache-2.0 OR MIT) Multigrid Reduction (MGR) ============================================================================== MGR is a parallel multigrid reduction solver and preconditioner designed to take advantage of use-provided information to solve systems of equations with multiple vatiable types. The algorithm is similar to two-stage preconditioner strategies and other reduction techniques like ARMS, but in a standard multigrid framework. The MGR algorithm accepts information about the variables in block form from the user and uses it to define the appropriate C/F splitting for the multigrid scheme. The linear system solve proceeds with an F-relaxation solve on the F points, folowed by a coarse grid correction. The coarse grid solve is handled by scalar AMG (BoomerAMG). MGR provides users with more control over the coarsening process, and can potentially be a starting point for designing multigrid-based physics-based preconditioners. The following represents a minimal set of functions, and some optional functions, to call to use the MGR solver. For simplicity, we ignore the function parameters here, and refer the reader to the reference manual for more details on the parameters and their defaults. * ``HYPRE_MGRCreate:`` Create the MGR solver object. * ``HYPRE_MGRSetCpointsByBlock:`` Set up block data with information about coarse indexes for reduction. Here, the user specifies the number of reduction levels, as well as the the coarse nodes for each level of the reduction. These coarse nodes are indexed by their index in the block of unknowns. This is used internally to tag the appropriate indexes of the linear system matrix as coarse nodes. * (Optional) ``HYPRE_MGRSetReservedCoarseNodes:`` Prescribe a subset of nodes to be kept as coarse nodes until the coarsest level. These nodes are transferred onto the coarsest grid of the BoomerAMG coarse grid solver. * (Optional) ``HYPRE_MGRSetNonCpointsToFpoints:`` Set points not prescribed as C points to be fixed as F points for intermediate levels. Setting this to 1 uses the user input to define the C/F splitting. Otherwise, a BoomerAMG coarsening routine is used to determine the C/F splitting for intermediate levels. * (Optional) ``HYPRE_MGRSetCoarseSolver:`` This function sets the BoomerAMG solver to be used for the solve on the coarse grid. The user can define their own BoomerAMG solver with their preferred options and pass this to the MGR solver. Otherwise, an internal BoomerAMG solver is used as the coarse grid solver instead. * ``HYPRE_MGRSetup:`` Setup and MGR solver object. * ``HYPRE_MGRSolve:`` Solve the linear system. * ``HYPRE_MGRDestroy:`` Destroy the MGR solver object For more details about additional solver options and parameters, please refer to the reference manual. NOTE: The MGR solver is currently only supported by the IJ interface. hypre-2.33.0/src/docs/usr-manual/solvers-mli.rst000066400000000000000000000033441477326011500215510ustar00rootroot00000000000000.. Copyright (c) 1998 Lawrence Livermore National Security, LLC and other HYPRE Project Developers. See the top-level COPYRIGHT file for details. SPDX-License-Identifier: (Apache-2.0 OR MIT) The MLI Package ============================================================================== MLI is an object-oriented module that implements the class of algebraic multigrid algorithms based on Vanek and Brezina's smoothed aggregation method [VaMB1996]_, [VaBM2001]_. There are two main algorithms in this module - the original smoothed aggregation algorithm and the modified version that uses the finite element substructure matrices to construct the prolongation operators. As such, the later algorithm can only be used in the finite element context via the finite element interface. In addition, the nodal coordinates obtained via the finite element interface can be used to construct a better prolongation operator than the pure translation modes. Below is an example on how to set up MLI as a preconditioner for conjugate gradient. .. code-block:: c HYPRE_LSI_MLICreate(MPI_COMM_WORLD, &pcg_precond); HYPRE_LSI_MLISetParams(pcg_precond, "MLI strengthThreshold 0.08"); ... HYPRE_PCGSetPrecond(pcg_solver, (HYPRE_PtrToSolverFcn) HYPRE_LSI_MLISolve, (HYPRE_PtrToSolverFcn) HYPRE_LSI_MLISetup, pcg_precond); Note that parameters are set via ``HYPRE_LSI_MLISetParams``. A list of valid parameters that can be set using this routine can be found in the FEI section of the reference manual. .. Add blank lines to help with navigation pane formatting | | | | | | | | | | | | | | | hypre-2.33.0/src/docs/usr-manual/solvers-parasails.rst000066400000000000000000000145551477326011500227550ustar00rootroot00000000000000.. Copyright (c) 1998 Lawrence Livermore National Security, LLC and other HYPRE Project Developers. See the top-level COPYRIGHT file for details. SPDX-License-Identifier: (Apache-2.0 OR MIT) ParaSails ============================================================================== .. warning:: ParaSails is not actively supported by the hypre development team. We recommend using :ref:`fsai` for parallel sparse approximate inverse algorithms. This new implementation includes NVIDIA/AMD GPU support through the CUDA/HIP backends. ParaSails is a parallel implementation of a sparse approximate inverse preconditioner, using *a priori* sparsity patterns and least-squares (Frobenius norm) minimization. Symmetric positive definite (SPD) problems are handled using a factored SPD sparse approximate inverse. General (nonsymmetric and/or indefinite) problems are handled with an unfactored sparse approximate inverse. It is also possible to precondition nonsymmetric but definite matrices with a factored, SPD preconditioner. ParaSails uses *a priori* sparsity patterns that are patterns of powers of sparsified matrices. ParaSails also uses a post-filtering technique to reduce the cost of applying the preconditioner. In advanced usage not described here, the pattern of the preconditioner can also be reused to generate preconditioners for different matrices in a sequence of linear solves. For more details about the ParaSails algorithm, see [Chow2000]_. Parameter Settings ------------------------------------------------------------------------------ The accuracy and cost of ParaSails are parametrized by the real ``thresh`` and integer ``nlevels`` parameters, :math:`0 \le` ``thresh`` :math:`\le 1`, :math:`0 \le` ``nlevels``. Lower values of ``thresh`` and higher values of ``nlevels`` lead to more accurate, but more expensive preconditioners. More accurate preconditioners are also more expensive per iteration. The default values are ``thresh`` :math:`= 0.1` and ``nlevels`` :math:`= 1`. The parameters are set using ``HYPRE_ParaSailsSetParams``. Mathematically, given a symmetric matrix :math:`A`, the pattern of the approximate inverse is the pattern of :math:`\tilde{A}^m` where :math:`\tilde{A}` is a matrix that has been sparsified from :math:`A`. The sparsification is performed by dropping all entries in a symmetrically diagonally scaled :math:`A` whose values are less than ``thresh`` in magnitude. The parameter ``nlevel`` is equivalent to :math:`m-1`. Filtering is a post-thresholding procedure. For more details about the algorithm, see [Chow2000]_. The storage required for the ParaSails preconditioner depends on the parameters ``thresh`` and ``nlevels``. The default parameters often produce a preconditioner that can be stored in less than the space required to store the original matrix. ParaSails does not need a large amount of intermediate storage in order to construct the preconditioner. ParaSail's Create function differs from the synopsis in the following way: .. code-block:: c int HYPRE_ParaSailsCreate(MPI_Comm comm, HYPRE_Solver *solver, int symmetry); where ``comm`` is the MPI communicator. The value of ``symmetry`` has the following meanings, to indicate the symmetry and definiteness of the problem, and to specify the type of preconditioner to construct: ===== ========================================================================= value meaning ===== ========================================================================= 0 nonsymmetric and/or indefinite problem, and nonsymmetric preconditioner 1 SPD problem, and SPD (factored) preconditioner 2 nonsymmetric, definite problem, and SPD (factored) preconditioner ===== ========================================================================= For more information about the final case, see section :ref:`nearly`. Parameters for setting up the preconditioner are specified using .. code-block:: c int HYPRE_ParaSailsSetParams(HYPRE_Solver solver, double thresh, int nlevel, double filter); The parameters are used to specify the sparsity pattern and filtering value (see above), and are described with suggested values as follows: ========== ======= ============= ============== ======= ============================= param type range sug. values default meaning ========== ======= ============= ============== ======= ============================= ``nlevel`` integer :math:`\ge 0` 0, 1, 2 1 :math:`m=1+` ``nlevel`` ``thresh`` real :math:`\ge 0` 0, 0.1, 0.01 0.1 thresh :math:`=` ``thresh`` \ :math:`< 0` -0.75, -0.90 thresh auto-selected ``filter`` real :math:`\ge 0` 0, 0.05, 0.001 0.05 filter :math:`=` ``filter`` \ :math:`< 0` -0.90 filter auto-selected ========== ======= ============= ============== ======= ============================= When ``thresh`` :math:`< 0`, then a threshold is selected such that ``thresh`` represents the negative of the fraction of nonzero elements that are dropped. For example, if ``thresh`` :math:`= -0.9` then :math:`\tilde{A}` will contain approximately ten percent of the nonzeros in :math:`A`. When ``filter`` :math:`< 0`, then a filter value is selected such that ``filter`` represents the negative of the fraction of nonzero elements that are dropped. For example, if ``filter`` :math:`= -0.9` then approximately 90 percent of the entries in the computed approximate inverse are dropped. .. _nearly: Preconditioning Nearly Symmetric Matrices ------------------------------------------------------------------------------ A nonsymmetric, but definite and nearly symmetric matrix :math:`A` may be preconditioned with a symmetric preconditioner :math:`M`. Using a symmetric preconditioner has a few advantages, such as guaranteeing positive definiteness of the preconditioner, as well as being less expensive to construct. The nonsymmetric matrix :math:`A` must be definite, i.e., :math:`(A+A^T)/2` is SPD, and the *a priori* sparsity pattern to be used must be symmetric. The latter may be guaranteed by 1) constructing the sparsity pattern with a symmetric matrix, or 2) if the matrix is structurally symmetric (has symmetric pattern), then thresholding to construct the pattern is not used (i.e., zero value of the ``thresh`` parameter is used). hypre-2.33.0/src/docs/usr-manual/solvers-pilut.rst000066400000000000000000000051771477326011500221330ustar00rootroot00000000000000.. Copyright (c) 1998 Lawrence Livermore National Security, LLC and other HYPRE Project Developers. See the top-level COPYRIGHT file for details. SPDX-License-Identifier: (Apache-2.0 OR MIT) .. _PILUT: PILUT: Parallel Incomplete Factorization ============================================================================== .. warning:: PILUT is not actively supported by the hypre development team. We recommend using :ref:`ilu` for parallel ILU algorithms. This new ILU implementation includes 64-bit integers support (for linear systems with more than 2,147,483,647 global unknowns) through both *mixedint* and *bigint* builds of hypre and NVIDIA/AMD GPUs support through the CUDA/HIP backends. PILUT is a parallel preconditioner based on Saad's dual-threshold incomplete factorization algorithm. The original version of PILUT was done by Karypis and Kumar [KaKu1998]_ in terms of the Cray SHMEM library. The code was subsequently modified by the hypre team: SHMEM was replaced by MPI; some algorithmic changes were made; and it was software engineered to be interoperable with several matrix implementations, including hypre's ParCSR format, PETSc's matrices, and ISIS++ RowMatrix. The algorithm produces an approximate factorization :math:`L U`, with the preconditioner :math:`M` defined by :math:`M = L U`. .. note:: PILUT produces a nonsymmetric preconditioner even when the original matrix is symmetric. Thus, it is generally inappropriate for preconditioning symmetric methods such as Conjugate Gradient. Parameters: ------------------------------------------------------------------------------ * ``SetMaxNonzerosPerRow( int LFIL ); (Default: 20)`` Set the maximum number of nonzeros to be retained in each row of :math:`L` and :math:`U`. This parameter can be used to control the amount of memory that :math:`L` and :math:`U` occupy. Generally, the larger the value of ``LFIL``, the longer it takes to calculate the preconditioner and to apply the preconditioner and the larger the storage requirements, but this trades off versus a higher quality preconditioner that reduces the number of iterations. * ``SetDropTolerance( double tol ); (Default: 0.0001)`` Set the tolerance (relative to the 2-norm of the row) below which entries in L and U are automatically dropped. PILUT first drops entries based on the drop tolerance, and then retains the largest LFIL elements in each row that remain. Smaller values of ``tol`` lead to more accurate preconditioners, but can also lead to increases in the time to calculate the preconditioner. .. Add blank lines to help with navigation pane formatting | | | | | | | | | | hypre-2.33.0/src/docs/usr-manual/solvers-smg-pfmg.rst000066400000000000000000000042221477326011500225010ustar00rootroot00000000000000.. Copyright (c) 1998 Lawrence Livermore National Security, LLC and other HYPRE Project Developers. See the top-level COPYRIGHT file for details. SPDX-License-Identifier: (Apache-2.0 OR MIT) SMG ============================================================================== SMG is a parallel semicoarsening multigrid solver for the linear systems arising from finite difference, finite volume, or finite element discretizations of the diffusion equation, .. math:: \nabla \cdot ( D \nabla u ) + \sigma u = f on logically rectangular grids. The code solves both 2D and 3D problems with discretization stencils of up to 9-point in 2D and up to 27-point in 3D. See [Scha1998]_, [BrFJ2000]_, [FaJo2000]_ for details on the algorithm and its parallel implementation/performance. SMG is a particularly robust method. The algorithm semicoarsens in the z-direction and uses plane smoothing. The xy plane-solves are effected by one V-cycle of the 2D SMG algorithm, which semicoarsens in the y-direction and uses line smoothing. PFMG ============================================================================== PFMG is a parallel semicoarsening multigrid solver similar to SMG. See [AsFa1996]_, [FaJo2000]_ for details on the algorithm and its parallel implementation/performance. The main difference between the two methods is in the smoother: PFMG uses simple pointwise smoothing. As a result, PFMG is not as robust as SMG, but is much more efficient per V-cycle. SysPFMG ============================================================================== SysPFMG is a parallel semicoarsening multigrid solver for systems of elliptic PDEs. It is a generalization of PFMG, with the interpolation defined only within the same variable. The relaxation is of nodal type- all variables at a given point location are simultaneously solved for in the relaxation. Although SysPFMG is implemented through the SStruct interface, it can be used only for problems with one grid part. Ideally, the solver should handle any of the seven variable types (cell-, node-, xface-, yface-, zface-, xedge-, yedge-, and zedge-based). However, it has been completed only for cell-based variables. hypre-2.33.0/src/docs/usr-manual/solvers-split.rst000066400000000000000000000022111477326011500221130ustar00rootroot00000000000000.. Copyright (c) 1998 Lawrence Livermore National Security, LLC and other HYPRE Project Developers. See the top-level COPYRIGHT file for details. SPDX-License-Identifier: (Apache-2.0 OR MIT) SplitSolve ============================================================================== SplitSolve is a parallel block Gauss-Seidel solver for semi-structured problems with multiple parts. For problems with only one variable, it can be viewed as a domain-decomposition solver with no grid overlapping. Consider a multiple part problem given by the linear system :math:`Ax=b`. Matrix :math:`A` can be decomposed into a structured intra-variable block diagonal component :math:`M` and a component :math:`N` consisting of the inter-variable blocks and any unstructured connections between the parts. SplitSolve performs the iteration .. math:: x_{k+1} = \tilde{M}^{-1} (b + N x_k), where :math:`\tilde{M}^{-1}` is a decoupled block-diagonal V(1,1) cycle, a separate cycle for each part and variable type. There are two V-cycle options, SMG and PFMG. .. Add blank lines to help with navigation pane formatting | | | | | | | | | | | | | | | | | | | | | | hypre-2.33.0/src/docs/usr-manual/zREADME000066400000000000000000000025471477326011500176210ustar00rootroot00000000000000 Sphinx links: http://www.sphinx-doc.org/en/stable/ http://www.sphinx-doc.org/en/stable/examples.html https://alabaster.readthedocs.io/en/latest/index.html # Alibaster theme https://docutils.sourceforge.io/rst.html # reStructuredText reference Doxygen links: http://www.doxygen.nl/manual/index.html Breathe links: https://breathe.readthedocs.io/en/latest/index.html Build commands: make help make html make latexpdf sphinx-build -b html . html sphinx-build -b latex . latex Note: - Added '_static/custom.css' file for customizations (document this somewhere) - To add unicode characters (e.g., umlaut characters), use 'M-x insert-character' in emacs and type in the name of the unicode character (use the web to get a list of names). For example, '00FB' is "umlaut u". Issues and things left to do: - Remember to change 'checklist' in hypre-dev repo when this branch is merged - MathJax is slow to render. Are we okay with that? Is there a better alternative? - How to reference figures? - How to combine images in a figure. Create one PNG file from the combination? - Add the hypre logo somehow - Copyright stuff and date (ref manual) DONE - Copyright stuff (user manual), version numbers DONE - References need to be done DONE - Figure images need to be regenerated from original source files hypre-2.33.0/src/examples/000077500000000000000000000000001477326011500153415ustar00rootroot00000000000000hypre-2.33.0/src/examples/CMakeLists.txt000066400000000000000000000010551477326011500201020ustar00rootroot00000000000000# Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) set(EXAMPLE_SRCS ex1.c ex2.c ex3.c ex4.c ex5.c ex6.c ex7.c ex8.c ex9.c ex11.c ex12.c ex13.c ex14.c ex15.c ex16.c ex17.c ex18.c ) if (HYPRE_BIGINT) list(APPEND EXAMPLE_SRCS ex5big.c ex15big.c ) endif() if (HYPRE_COMPLEX) list(APPEND EXAMPLE_SRCS ex18comp.c ) endif() add_hypre_executables(EXAMPLE_SRCS) hypre-2.33.0/src/examples/Makefile000066400000000000000000000224411477326011500170040ustar00rootroot00000000000000# Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) ######################################################################## # Compiler and external dependences ######################################################################## CC = mpicc F77 = mpif77 CXX = mpicxx F90 = mpif90 CUF = mpixlcuf LINK_CC = ${CC} LINK_CXX = ${CXX} LINK_FC = ${F77} LINK_CUF = ${CUF} XL_DIR=$(dir $(shell which xlc)).. HYPRE_DIR = ../hypre ######################################################################## # CUDA ######################################################################## ifeq ($(use_cuda), 1) CUDA_INCL = -I${CUDA_HOME}/include CUDA_LIBS = -L${CUDA_HOME}/lib64 -lcudart -lcublas -lcusparse -lcurand -lstdc++ -L$(XL_DIR)/xlC/16.1.1/lib -libmc++ CUDA_ARCH = -gencode arch=compute_60,code=sm_60 -gencode arch=compute_70,code=sm_70 NVCC_LDFLAGS = -ccbin=${CXX} ${CUDA_ARCH} COPTS_CUDA = -DHYPRE_EXAMPLE_USING_CUDA FOPTS_CUDA = -DHYPRE_EXAMPLE_USING_CUDA -qsuppress=cmpmsg endif ifeq ($(use_cuf), 1) CUDA_LIBS = -L${CUDA_HOME}/lib64 -lcudart -lcublas -lcusparse -lcurand -lstdc++ -L$(XL_DIR)/xlC/16.1.1/lib -libmc++ endif ######################################################################## # Device OMP ######################################################################## ifeq ($(use_domp), 1) DOMP_LIBS = -L${CUDA_HOME}/lib64 -lcudart -lcublas -lcusparse -lcurand -lstdc++ -L$(XL_DIR)/xlC/16.1.1/lib -libmc++ COPTS_DOMP = -DHYPRE_EXAMPLE_USING_DEVICE_OMP FOPTS_DOMP = -qoffload -W@,-v -qsmp=omp -qinfo=omperrtrace -DHYPRE_EXAMPLE_USING_DEVICE_OMP LOPTS_DOMP = -qoffload -W@,-v -qsmp=omp endif ######################################################################## # Compiling and linking options ######################################################################## CINCLUDES = -I$(HYPRE_DIR)/include $(CUDA_INCL) #CDEFS = -DHYPRE_EXVIS CDEFS = COPTS = -g -Wall $(COPTS_CUDA) $(COPTS_DOMP) FOPTS = -g $(FOPTS_CUDA) $(FOPTS_DOMP) CFLAGS = $(COPTS) $(CINCLUDES) $(CDEFS) FINCLUDES = $(CINCLUDES) FFLAGS = $(FOPTS) $(FINCLUDES) CUFFLAGS = -qcuda CXXOPTS = $(COPTS) -Wno-deprecated CXXINCLUDES = $(CINCLUDES) -I.. CXXDEFS = $(CDEFS) IFLAGS_BXX = CXXFLAGS = $(CXXOPTS) $(CXXINCLUDES) $(CXXDEFS) $(IFLAGS_BXX) IF90FLAGS = F90FLAGS = $(FFLAGS) $(IF90FLAGS) LINKOPTS = $(LOPTS_CUDA) $(LOPTS_DOMP) LIBS = -L$(HYPRE_DIR)/lib -lHYPRE -lm $(CUDA_LIBS) $(DOMP_LIBS) LFLAGS = $(LINKOPTS) $(LIBS) LFLAGS_B =\ -L${HYPRE_DIR}/lib\ -lbHYPREClient-C\ -lbHYPREClient-CX\ -lbHYPREClient-F\ -lbHYPRE\ -lsidl -ldl -lxml2 LFLAGS77 = $(LFLAGS) LFLAGS90 = ######################################################################## # Rules for compiling the source files ######################################################################## .SUFFIXES: .c .f .cuf .cxx .c.o: $(CC) $(CFLAGS) -c $< .f.o: $(F77) $(FFLAGS) -c $< .f.mod: $(F77) $(FFLAGS) -c $< .cuf.o: $(CUF) $(FFLAGS) $(CUFFLAGS) -c $< .cxx.o: $(CXX) $(CXXFLAGS) -c $< ######################################################################## # List of all programs to be compiled ######################################################################## ALLPROGS = ex1 ex2 ex3 ex4 ex5 ex5f ex6 ex7 ex8 ex9 ex11 ex12 ex12f \ ex13 ex14 ex15 ex16 BIGINTPROGS = ex5big ex15big FORTRANPROGS = ex5f ex12f MAXDIMPROGS = ex17 ex18 COMPLEXPROGS = ex18comp all: $(ALLPROGS) default: all gpu: all bigint: $(BIGINTPROGS) fortran: $(FORTRANPROGS) maxdim: $(MAXDIMPROGS) complex: $(COMPLEXPROGS) ######################################################################## # Example 1 ######################################################################## ex1: ex1.o $(LINK_CC) -o $@ $^ $(LFLAGS) ######################################################################## # Example 2 ######################################################################## ex2: ex2.o $(LINK_CC) -o $@ $^ $(LFLAGS) ######################################################################## # Example 3 ######################################################################## ex3: ex3.o $(LINK_CC) -o $@ $^ $(LFLAGS) ######################################################################## # Example 4 ######################################################################## ex4: ex4.o $(LINK_CC) -o $@ $^ $(LFLAGS) ######################################################################## # Example 5 ######################################################################## ex5: ex5.o $(LINK_CC) -o $@ $^ $(LFLAGS) ######################################################################## # Example 5 with 64-bit integers ######################################################################## ex5big: ex5big.o $(LINK_CC) -o $@ $^ $(LFLAGS) ######################################################################## # Example 5 Fortran 77 ######################################################################## ifeq ($(use_cuda), 1) ex5f_cptr.o : ex5f_cptr.f cudaf.mod $(F77) $(FFLAGS) -c $< ex5f: ex5f_cptr.o cudaf.o $(LINK_FC) -o $@ $^ $(LFLAGS77) else ifeq ($(use_cuf), 1) ex5f: ex5cuf.o $(LINK_CUF) -o $@ $^ $(LFLAGS77) else ex5f: ex5f.o $(LINK_FC) -o $@ $^ $(LFLAGS77) endif endif ######################################################################## # Example 6 ######################################################################## ex6: ex6.o $(LINK_CC) -o $@ $^ $(LFLAGS) ######################################################################## # Example 7 ######################################################################## ex7: ex7.o $(LINK_CC) -o $@ $^ $(LFLAGS) ######################################################################## # Example 8 ######################################################################## ex8: ex8.o $(LINK_CC) -o $@ $^ $(LFLAGS) ######################################################################## # Example 9 ######################################################################## ex9: ex9.o $(LINK_CC) -o $@ $^ $(LFLAGS) ######################################################################## # Example 10 ######################################################################## ex10: ex10.o $(LINK_CXX) -o $@ $^ $(LFLAGS) ######################################################################## # Example 11 ######################################################################## ex11: ex11.o $(LINK_CC) -o $@ $^ $(LFLAGS) ######################################################################## # Example 12 ######################################################################## ex12: ex12.o $(LINK_CC) -o $@ $^ $(LFLAGS) ######################################################################## # Example 12 Fortran 77 ######################################################################## ifeq ($(use_cuda), 1) ex12f_cptr.o : ex12f_cptr.f cudaf.mod $(F77) $(FFLAGS) -c $< ex12f: ex12f_cptr.o cudaf.o $(LINK_FC) -o $@ $^ $(LFLAGS77) else ifeq ($(use_cuf), 1) ex12f: ex12cuf.o $(LINK_CUF) -o $@ $^ $(LFLAGS77) else ex12f: ex12f.o $(LINK_FC) -o $@ $^ $(LFLAGS77) endif endif ######################################################################## # Example 13 ######################################################################## ex13: ex13.o $(LINK_CC) -o $@ $^ $(LFLAGS) ######################################################################## # Example 14 ######################################################################## ex14: ex14.o $(LINK_CC) -o $@ $^ $(LFLAGS) ######################################################################## # Example 15 ######################################################################## ex15: ex15.o $(LINK_CC) -o $@ $^ $(LFLAGS) ######################################################################## # Example 15 with 64-bit integers ######################################################################## ex15big: ex15big.o $(LINK_CC) -o $@ $^ $(LFLAGS) ######################################################################## # Example 16 ######################################################################## ex16: ex16.o $(LINK_CC) -o $@ $^ $(LFLAGS) ######################################################################## # Example 17 ######################################################################## ex17: ex17.o $(LINK_CC) -o $@ $^ $(LFLAGS) ######################################################################## # Example 18 ######################################################################## ex18: ex18.o $(LINK_CC) -o $@ $^ $(LFLAGS) ######################################################################## # Example 18 (complex) ######################################################################## ex18comp: ex18comp.o $(LINK_CC) -o $@ $^ $(LFLAGS) ######################################################################## # Clean up ######################################################################## clean: rm -f $(ALLPROGS:=.o) rm -f $(BIGINTPROGS:=.o) rm -f $(FORTRANPROGS:=.o) rm -f $(MAXDIMPROGS:=.o) rm -f $(COMPLEXPROGS:=.o) rm -f cudaf.o cudaf.mod ex*.o cd vis; make clean distclean: clean rm -f $(ALLPROGS) $(ALLPROGS:=*~) rm -f $(BIGINTPROGS) $(BIGINTPROGS:=*~) rm -f $(FORTRANLPROGS) $(FORTRANPROGS:=*~) rm -f $(MAXDIMPROGS) $(MAXDIMPROGS:=*~) rm -f $(COMPLEXPROGS) $(COMPLEXPROGS:=*~) rm -fr README* hypre-2.33.0/src/examples/cudaf.f000066400000000000000000000043071477326011500165760ustar00rootroot00000000000000! Copyright (c) 1998 Lawrence Livermore National Security, LLC and other ! HYPRE Project Developers. See the top-level COPYRIGHT file for details. ! ! SPDX-License-Identifier: (Apache-2.0 OR MIT) ! This file contains the module defining Fortran interfaces for the CUDA Runtime API ! Copied and modified from: ! https://raw.githubusercontent.com/starkiller-astro/XNet/master/source/cudaf.f90 module cudaf ! Interface to CUDA Runtime API use, intrinsic :: iso_c_binding, only: c_int implicit none integer(c_int), parameter :: cudaMemAttachGlobal = 1 integer(c_int), parameter :: cudaMemAttachHost = 2 integer(c_int), parameter :: cudaMemAttachSingle = 4 !include "cudaDeviceProp.fh" interface integer(c_int) function 1 cudaMallocManaged(dPtr, size, flags) 1 bind(c, name="cudaMallocManaged") use, intrinsic :: iso_c_binding type(c_ptr), intent(out) :: dPtr integer(c_size_t), value :: size integer(c_int), value :: flags end function cudaMallocManaged integer(c_int) function 1 cudaFree(dPtr) 1 bind(c, name="cudaFree") use, intrinsic :: iso_c_binding type(c_ptr), value :: dPtr end function cudaFree end interface contains ! wrapper functions integer function 1 device_malloc_managed(nbytes, dPtr) result(stat) use, intrinsic :: iso_c_binding, only: c_size_t, c_ptr use, intrinsic :: iso_fortran_env, only: int64 integer(int64), intent(in) :: nbytes type(c_ptr), intent(inout) :: dPtr stat = cudaMallocManaged(dPtr, int(nbytes,c_size_t), 1 cudaMemAttachGlobal) end function device_malloc_managed ! integer function 1 device_free(dPtr) result(stat) use, intrinsic :: iso_c_binding, only: c_ptr type(c_ptr), intent(inout) :: dPtr stat = cudaFree(dPtr) end function device_free end module cudaf hypre-2.33.0/src/examples/docs/000077500000000000000000000000001477326011500162715ustar00rootroot00000000000000hypre-2.33.0/src/examples/docs/2d-bi.htm000066400000000000000000000004341477326011500177010ustar00rootroot00000000000000Example Codes

2D Biharmonic Equation Example Codes

hypre-2.33.0/src/examples/docs/2d-con-reac-diff.htm000066400000000000000000000005101477326011500216770ustar00rootroot00000000000000Example Codes

2D Convection-Reaction-Diffusion Example Codes

hypre-2.33.0/src/examples/docs/2d-laplace-eig.htm000066400000000000000000000004361477326011500214540ustar00rootroot00000000000000Example Codes

2D Laplace Eigenproblem Example Codes

hypre-2.33.0/src/examples/docs/2d-laplace.htm000066400000000000000000000010451477326011500207070ustar00rootroot00000000000000Example Codes

2D Laplace Example Codes

hypre-2.33.0/src/examples/docs/3d-maxwell.htm000066400000000000000000000004321477326011500207570ustar00rootroot00000000000000Example Codes

3D Definite Maxwell Example Codes

hypre-2.33.0/src/examples/docs/5pt.htm000066400000000000000000000010461477326011500175140ustar00rootroot00000000000000Example Codes

5-Point Stencil Example Codes

hypre-2.33.0/src/examples/docs/9pt.htm000066400000000000000000000004251477326011500175200ustar00rootroot00000000000000Example Codes

9-Point Stencil Example Codes

hypre-2.33.0/src/examples/docs/Makefile000066400000000000000000000004771477326011500177410ustar00rootroot00000000000000######################################################################## # hypre examples documentation ######################################################################## EXAMPLES_DIR = .. all: @./build_doc.sh $(EXAMPLES_DIR) clean: rm -f *.html distclean: clean rm -f *~ rm -rf ../*.html ../README_files hypre-2.33.0/src/examples/docs/README000066400000000000000000000032421477326011500171520ustar00rootroot000000000000001. Requirements. - The code should be well documented with references to the user manual. - The user should be able to download and build the examples independently of hypre (i.e. assuming only that hypre was installed in some directory $HYPRE_DIR). In particular, no assumptions for the locations of the examples or hypre directories should be made. - The examples should mimic an application code, so a user can pick one of them and use it as a starting template. 2. Adding a new example code. - Use the following naming convention: ex.c - Edit the Makefile. - Test if everything builds and runs correctly. - Documentation: create ex.htm in the docs directory, and include it in the appropriate Interface, Equation, Discretization or Solver documentation files. Add a short description in index.htm. Then do "make" to build the documentation in the README_files directory and create/update the README.html in the examples directory. NOTE: To clarify, the docs directory is NOT distributed to users. To test what is in the distribution, do "make" in the docs directory. This updates the examples/README_files directory (which IS distributed) and the file README.html which is created in the *examples* directory (from docs/index.htm - which is why the links in index.htm do not - and should not - work in the docs directory) 3. Maintaining, updating and testing. - Changes in hypre interface should be reflected in the examples. - The outputs of some example runs should be kept as benchmarks. If changes in hypre or the example itself result in different output, this should be recorded. - The examples are part of hypre's regression testing. hypre-2.33.0/src/examples/docs/amg.htm000066400000000000000000000006751477326011500175570ustar00rootroot00000000000000Example Codes

BoomerAMG Example Codes

hypre-2.33.0/src/examples/docs/build_doc.sh000077500000000000000000000020141477326011500205510ustar00rootroot00000000000000#!/bin/bash examplesdir="$1" currentdir=`pwd` # Create the README_files directory if [ ! -d $examplesdir/README_files ]; then mkdir $examplesdir/README_files fi # Syntax highlighting cd $examplesdir/README_files for target in `ls ../*.c`; do $currentdir/code2html.perl -l c -n -o html $target $target.html mv $target.html . done for target in `ls ../*.f*`; do $currentdir/code2html.perl -l f -n -o html $target $target.html mv $target.html . done for target in `ls ../*.cxx`; do $currentdir/code2html.perl -l c++ -n -o html $target $target.html mv $target.html . done cd $currentdir # Copy the example files for file in `ls ex*.htm`; do cp -fp "$file" "$file"l done # Replace the server side includes for file in `ls *.htm`; do $currentdir/replace-ssi.perl "$file" > $examplesdir/README_files/"$file"l done # Copy images cp -fp *.gif $examplesdir/README_files # Remove the html example files rm -f ex*.html # Rename index.html mv $examplesdir/README_files/index.html $examplesdir/README.html hypre-2.33.0/src/examples/docs/c++.htm000066400000000000000000000004121477326011500173500ustar00rootroot00000000000000Example Codes

C++ Example Codes

hypre-2.33.0/src/examples/docs/c.htm000066400000000000000000000013061477326011500172250ustar00rootroot00000000000000Example Codes

C Example Codes

hypre-2.33.0/src/examples/docs/code2html.perl000077500000000000000000005766211477326011500210620ustar00rootroot00000000000000#!/usr/bin/perl -w my $vernr = "0.9.1"; my $monthshort = "Jan"; my $monthlong = "Jan"; my $year = "2002"; ######################################################################## # # # Code2HTML # # --------- # # # # Code2Html, peter@palfrader.org # # # # $Date$ # $Revision$ # $Id$ # # # AUTHOR # # Peter Palfrader. Written in 1999, 2000, 2001, 2002. # # A lot of other people. See CREDITS file. # # # # DESCRIPTION # # code2html is a perlscript which converts a program # # source code to syntax highlighted HTML by applying a set # # of regular expressions depending on the language # # the source code is written. # # # # see the man-page for details, # # # ######################################################################## use strict; use Getopt::Long; my $FILES_DISALLOWED_IN_CGI = 1; # you may set this to false to allow file reading from your hd in # cgi mode. This may be not good if your httpd runs as 'root' (yes, I've # seen this!) and so any user could with some knowledge easily read # your /etc/shadow for example! my $FILES_REDIRECT_DISALLOWED = 1; my $LANG_TEST_LENGTH = 1024; # PP: I think Compress::Zlib could be nice for this. but it's not very widespread :( # PP: A hash would be nicer but then it would not possible to get the keys in this very order (AFAIK) # PP: If names contain meta characters, then those must be metaquoted (if you don't want the meta chars to be meta chars of course) my @CGI_ENCODING = ( ['bzip2' , '/usr/bin/bzip2' , '--stdout' ], ['gzip' , '/bin/gzip' , '--stdout' ], ['compress' , '/usr/bin/compress' , '-c' ] ); # undefine the input record separator so everything gets loaded in one turn undef $/; my $pure_version_message = "Code2Html, version $vernr, $monthshort $year, peter\@palfrader.org"; my $version_message = "$pure_version_message\n"; my $short_short_help = "Try `code2html --help' for more information.\n"; my $short_help = "$pure_version_message Usage: code2html [options] [input_file [output_file]] Convert a program source to syntax highlighted HTML, or any other format for wich rules are defined. -l, --language-mode set language mode --fallback LANG fallback language mode -v, --verbose prints progress information to STDER -n, --linenumbers print out the source code with line numbers -P, --prefix optional prefix to use for linenumber anchors -N, --linknumbers linenumbers will link to themselves -t, --replace-tabs[=TABSTOP-WIDTH] replace with spaces -L, --language-file=LANGUAGE-FILE specify an alternate file for definitions -m, --modes print all available modes -h, --help print this message -V, --version print version -c, --content-type prints a Content-Type header -o, --output-format selects the output-format -H, --no-header don't use the template --template=FILE override template -T, --title set title -w, --linewidth max characters per line -b, --linebreakprefix prefix of the new lines see the man-page code2html for further help "; my $USE_CGI_FOR_ERRORS = 0; # is switched on in parse params if necessary $SIG{'__DIE__'} = sub { if ($USE_CGI_FOR_ERRORS) { print "Content-Type: text/plain\n\n", $0, ': ', $_[0], "\n"; } else { print STDERR $0, ': ', $_[0]; }; exit 1; }; $SIG{'__WARN__'} = sub { unless ($USE_CGI_FOR_ERRORS) { print STDERR $0.': '.$_[0]; }; }; my $DEFAULT_OUTPUTFORMAT='html'; my $DEFAULT_OUTPUTFORMAT_IN_CGI='html'; my $ENTITIES; my %ENTITIES; my %params = &parse_params; if ($params{'what_to_do'} eq 'patch_html') { &patch_html(\%params) } elsif ($params{'what_to_do'} eq 'normal' ) { &main(\%params) } else { die("I don't know what to do :(\n") }; sub main { my %params = %{shift()}; print STDERR "getting patterns...\n" if ($params{'verbose'}); # building up the database # newer entries overwrite old ones my @CONFIG_FILES; push @CONFIG_FILES, "/etc/code2html.config"; push @CONFIG_FILES, $ENV{'HOME'}."/.code2html.config" if (defined($ENV{'HOME'})); push @CONFIG_FILES, split(/:/,$ENV{'CODE2HTML_CONFIG'}) if ($ENV{'CODE2HTML_CONFIG'}); push @CONFIG_FILES, split(/:/,$params{'langfile'}) if defined($params{'langfile'}); my %STYLESHEET = %{ &get_default_stylesheet } ; my %LANGUAGE = %{ &get_default_database } ; for (@CONFIG_FILES) { if ( -r $_){ # if I use `do $_` instead of scalar eval... %LANGUAGE is not exported and imported correctly (read: at all) (PP) unless (scalar eval `cat $_`) { warn "couldn't parse $_: $@" if $@; }; }; }; if (defined($params{'modes'}) && $params{'modes'}) { print "Defined modes: "; print join( ', ', sort keys %LANGUAGE ), ".\n" ; print "Defined outputformats: "; print join( ', ', sort keys %STYLESHEET ), ".\n" ; exit; }; # set outputformat die "Outputformat $params{'outputformat'} not defined" unless defined $STYLESHEET{$params{'outputformat'}}; my %STYLE = % { $STYLESHEET{$params{'outputformat'}} }; # load alternate template if given if (($params{'template'} ne "") && ( ! $params{'noheader'} )) { open (FILE, $params{'template'}) || die ("Could not open template file $params{'template'}: $!"); $STYLE{'template'} = ; close (FILE); }; # set up the global ENTITIES variables ( the scalar and the hash ) from the STYLE definition $ENTITIES = $ { $STYLE{'entities'} }{'listofchars'}; %ENTITIES = % { $ { $STYLE{'entities'} }{'replace_by' } }; # modify the header and footer so that the template variables are set correcly unless ($STYLE{'template'} =~ /^(.*)%%code%%(.*)$/s) { die "template does not contain a %%code%% variable"; }; $STYLE{'header'} = $1; $STYLE{'footer'} = $2; $STYLE{'header'} =~ s/%%title%%/$params{'title'}/g; $STYLE{'footer'} =~ s/%%title%%/$params{'title'}/g; $STYLE{'header'} =~ s/%%version%%/$vernr/g; $STYLE{'footer'} =~ s/%%version%%/$vernr/g; # load the input file and set params{'langmode'} if it is not already. this is done by probing a # set of rules defined in %LANGUAGE my $code_ref; print STDERR "loading input file...\n" if ($params{'verbose'}); $code_ref = &get_input_file(\%params, \%LANGUAGE, $params{'langmode'}, $params{'alt_langmode'}); # select the rules for out language. my $language_rules_ref = $LANGUAGE{ lc($params{'langmode'}) }->{'patterns'}; print STDERR "applying stylesheet...\n" if ($params{'verbose'}); # Apply the Stylesheets # set 'starttag' and 'endtag' for every rule according to its 'style' value # the tags are defined in the stylesheet &apply_stylesheets_to_rules( $language_rules_ref, \%STYLE ); print STDERR "outputting headers...\n" if ($params{'verbose'}); &put_headers(\%params, \%STYLE); my $snippetlist_ref = [] ; print STDERR "creating snippet-list...\n" if $params{'verbose'}; &create_snippetlist( $language_rules_ref, $$code_ref, $snippetlist_ref, \%STYLE); print STDERR "outputting file...\n" if $params{'verbose'}; return &put_output(\%params, $snippetlist_ref, \%STYLE); } sub patch_html { my %params = %{shift()}; my $code; open(FILEHANDLE, $params{'infile'}) || die("While opening '$params{'infile'}' for input: ".$!."\n"); $code = ; close(FILEHANDLE); $code =~ s/.*?//gs; my $counter=0; my @chunks = split ( /()/s , $code); $code = ''; for (@chunks) { $code .= $_; if ($_ =~ //s) { my $cmdline = $1; my $input = $2; $cmdline =~ s/^[ \t]*//g; $cmdline =~ s/[ \t]*$//g; @ARGV = split ( / / , $cmdline); my %new_params = &parse_params; $new_params{'input'} = $input if ($new_params{'infile'} eq "-"); undef $new_params{'outfile'}; ++$counter; $new_params{'line_number_prefix'} = $counter unless (defined $new_params{'line_number_prefix'}); $new_params{'verbose'} = $params{'verbose'}; my $no_header = $new_params{'noheader'}; $new_params{'noheader'} = 1; $new_params{'dont_print_output'} = 1; if ($no_header) { $code .= ''.. &main(\%new_params). ''; } else { $code .= '
'.
			  &main(\%new_params).
			    '
'; }; }; }; open(FILEHANDLE, '>'.$params{'outfile'}) || die("While opening '$params{'outfile'}' for output: ".$!."\n"); print FILEHANDLE $code; close(FILEHANDLE); }; ##################################################################### ################### get_input_data ################################## ##################################################################### # Reads the input data for the cgi script. # in : nothing # out: a hash with the input data sub get_input_data { my $input_data; my %f; if($ENV{'REQUEST_METHOD'} eq 'GET') { $input_data = $ENV{'QUERY_STRING'}; } else { read(STDIN, $input_data, $ENV{'CONTENT_LENGTH'}); }; if ($ENV{'CONTENT_TYPE'} =~ m/^multipart\/form-data; boundary=(.*)$/i) { my $boundary = quotemeta($1); my @blocks = split(/$boundary/, $input_data); for (@blocks) { if (my $dummy = m/name="(.*?)"/i) { my $name = $1; $_ =~ s/\r\n/\n/g; m/\n\n(.*)\n/s; my $value = $1; $f{$name}=$value; }; }; } elsif ($ENV{'CONTENT_TYPE'} =~ m/^multipart\/form-data;$/i) # if the boundary is not in the enviroment variable we'll guess { my $dummy = $input_data =~ m/^(.*?)(\n|\r)/; my $boundary = $1; my @blocks = split(/$boundary/, $input_data); for (@blocks) { if (my $dummy = m/name="(.*?)"/i) { my $name = $1; $_ =~ s/\r\n/\n/g; m/\n\n(.*)\n/s; my $value = $1; $f{$name}=$value; }; }; } else { my @form_fields = split(/&/, $input_data); for (@form_fields) { my ($name, $value) = split(/=/, $_); $value =~ tr/+/ /; $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; $f{$name} = $value; } }; return %f; }; ################################################################################ ####################### parse_params ########################################### ################################################################################ sub parse_params { my %RESULT; if (defined($ENV{'GATEWAY_INTERFACE'}) && (!scalar(@ARGV))) # if there is a CGI enviroment and no parameters/options given { $USE_CGI_FOR_ERRORS = 1; $RESULT{'content-type'} = 1; $RESULT{'what_to_do'} = 'normal'; my %input = &get_input_data; $input{'input-selector'} = $input{'input_selector'} unless (defined $input{'input-selector'}); $input{'no-encoding'} = $input{'no_encoding'} unless (defined $input{'no-encoding'}); $input{'line-numbers'} = $input{'line_numbers'} unless (defined $input{'line-numbers'}); $input{'replace-tabs'} = $input{'replace_tabs'} unless (defined $input{'replace-tabs'}); $input{'language-mode'} = $input{'language_mode'} unless (defined $input{'language-mode'}); $input{'cgi-input1'} = $input{'cgi_input1'} unless (defined $input{'cgi-input1'}); $input{'cgi-input2'} = $input{'cgi_input2'} unless (defined $input{'cgi-input2'}); if ($input{'input-selector'} =~ /^cgi[-_]input[12]$/ ) { my $input_selector = $input{'input-selector'}; die("CGI parse error: $input_selector does not exist!") unless (defined $input{$input_selector}); $RESULT{'input'} = $input{$input_selector}; $RESULT{'title'} = 'code2html result of cgi input form'; } elsif ($input{'input-selector'} eq "file") { die('CGI parse error: option not supported due to security reasons!') if ($FILES_DISALLOWED_IN_CGI); die('CGI parse error: filename not defined!') unless (defined $input{'filename'}); $RESULT{'infile'} = $input{'filename'}; $RESULT{'title'} = $RESULT{'infile'}; } elsif ($input{'input-selector'} eq "REDIRECT_URL") { die('CGI parse error: option not supported due to security reasons!') if ($FILES_REDIRECT_DISALLOWED); die('CGI parse error: ENV: REDIRECT_URL not defined!') unless (defined $ENV{'REDIRECT_URL'}); $RESULT{'infile'} = $ENV{'DOCUMENT_ROOT'}.$ENV{'REDIRECT_URL'}; $RESULT{'title'} = $RESULT{'infile'}; } else { die('CGI parse error: input selector not given!'); }; if ((!defined ($input{'no-encoding'})) || $input{'no-encoding'}) { for (@CGI_ENCODING) { if ( ($ENV{'HTTP_ACCEPT_ENCODING'} =~ m/\b $_->[0] \b/x) && # PP: if supported by the browser (-x $_->[1]) ) # PP: and executable by the script { $RESULT{'encoding'} = $_->[0]; $RESULT{'encoder' } = $_->[1] .' '. $_->[2]; last; }; } }; $RESULT{'linenumbers'} = 'none'; if ($input{'line-numbers'} eq "yes") { $RESULT{'linenumbers'} = 'normal'; }; if ($input{'line-numbers'} eq "link") { $RESULT{'linenumbers'} = 'linked'; }; if (defined($input{'replace_tabs'})) { $RESULT{'replacetabs'} = $input{'replace-tabs'} }; if (defined($input{'fallback'})) { $RESULT{'alt_langmode'} = $input{'fallback'} }; if (defined($input{'language_mode'})) { $RESULT{'langmode'} = $input{'language-mode'} }; if (defined($input{'title'})) { $RESULT{'title'} = $input{'title'} }; $RESULT{'content_type'} = 1; $RESULT{'outputformat'} = $DEFAULT_OUTPUTFORMAT_IN_CGI; $RESULT{'outfile'} = '-'; } else { my $verbose = 0; my $linenumbers = 0; my $linknumbers = 0; my $replace_tabs = 0; my $language_file = ''; my $language_mode = ''; my $modes = 0; my $fallback = ''; my $help = 0; my $version = 0; my $content_type = 0; my $no_header = 0; my $outputformat = $DEFAULT_OUTPUTFORMAT; my $template = ''; my $title = "__NOTHING__$$"; # some magix ;( my $prefix = undef; my $linewidth = undef; my $linebreakprefix = undef; my $linebreakprefixdefault = '» '; my $patch_html; # Get Options does not like - as a parameters (used for STDIN and STDOUT) # So we're using a stupid magix again @ARGV = map { $_ eq '-' ? "__STD__$$" : $_ } @ARGV; Getopt::Long::config('bundling'); unless ( GetOptions( "--verbose" , \$verbose , "-v" , \$verbose , "--linenumbers" , \$linenumbers , "-n" , \$linenumbers , "--linknumbers" , \$linknumbers , "-N" , \$linknumbers , "--prefix=s" , \$prefix , "-P=s" , \$prefix , "--replace-tabs=i" , \$replace_tabs , "--replace_tabs=i" , \$replace_tabs , "-t=i" , \$replace_tabs , "--language-file=s" , \$language_file , "--language_file=s" , \$language_file , "-L=s" , \$language_file , "--language-mode=s" , \$language_mode , "--language_mode=s" , \$language_mode , "-l=s" , \$language_mode , "--title=s" , \$title , "-T=s" , \$title , "--modes" , \$modes , "-m" , \$modes , "--fallback=s" , \$fallback , "--output=s" , \$outputformat , "-o=s" , \$outputformat , "--template=s" , \$template , "--help" , \$help , "-h" , \$help , "--version" , \$version , "-V" , \$version , "--content-type" , \$content_type , "--content_type" , \$content_type , "-c" , \$content_type , "--no-header" , \$no_header , "--no_header" , \$no_header , "-H" , \$no_header , "--patch-html" , \$patch_html , "--patch_html" , \$patch_html , "-p" , \$patch_html , "--linewidth=i" , \$linewidth , "-w=i" , \$linewidth , "--linebreakprefix=s" , \$linebreakprefix , "-b=s" , \$linebreakprefix , ) ) { print STDERR $short_short_help; exit 1; } #reversing magix @ARGV = map { $_ eq "__STD__$$" ? '-' : $_ } @ARGV; if ($help) { print STDERR $short_help; exit 0; }; if ($version) { print $version_message; exit 0; }; if ($patch_html) { $RESULT{'what_to_do'} = 'patch_html'; $RESULT{'verbose'} = $verbose; if (!defined ($RESULT{'infile'} = shift(@ARGV))) { $RESULT{'infile'} = '-' }; if (!defined ($RESULT{'outfile'} = shift(@ARGV))) { $RESULT{'outfile'} = $RESULT{'infile'}}; if (defined (shift(@ARGV))) { print STDERR "too many parameters!\n"; print STDERR $short_help; exit 1; }; } else { $RESULT{'what_to_do'} = 'normal'; $RESULT{'verbose'} = $verbose; if ($linknumbers) { $RESULT{'linenumbers'} = 'linked' } elsif ($linenumbers) { $RESULT{'linenumbers'} = 'normal' } else { $RESULT{'linenumbers'} = 'none' }; $RESULT{'line_number_prefix'} = $prefix; $RESULT{'replacetabs'} = $replace_tabs; $RESULT{'langfile'} = $language_file; $RESULT{'modes'} = $modes; $RESULT{'alt_langmode'} = $fallback; $RESULT{'content_type'} = $content_type; $RESULT{'noheader'} = $no_header; $RESULT{'langmode'} = $language_mode; $RESULT{'template'} = $template; $RESULT{'outputformat'} = $outputformat; $RESULT{'linewidth'} = $linewidth; $RESULT{'linebreakprefix'}= $linebreakprefix; if (defined ($RESULT{'linebreakprefix'}) && !defined ($RESULT{'linewidth'})) { printf (STDERR "--linebreakprefix|-b does not make sense without --linewidth|-w!\n"); print STDERR $short_help; exit 1; } if (defined ($RESULT{'linewidth'})) { if ($RESULT{'linewidth'} <= 0) { printf (STDERR "linewidth must be greater then 0!\n"); print STDERR $short_help; exit 1; } if (!defined ($RESULT{'linebreakprefix'})) { $RESULT{'linebreakprefix'} = $linebreakprefixdefault; } } if (!defined ($RESULT{'infile'} = shift(@ARGV))) { $RESULT{'infile'} = '-'}; if (!defined ($RESULT{'outfile'} = shift(@ARGV))) { $RESULT{'outfile'} = '-'}; if (defined (shift(@ARGV))) { print STDERR "too many parameters!\n"; print STDERR $short_help; exit 1; }; }; #the magix again $RESULT{'title'} = $title eq "__NOTHING__$$" ? ($RESULT{'infile'} eq '-' ? 'STDIN' : $RESULT{'infile'}) : $title; }; return %RESULT; }; ################################################################################ ####################### checkTabulator ######################################### ################################################################################ sub checkTabulator { my ($line, $TABSTOP) = @_; while ((my $at = index($line, "\t")) != -1) { my $cnt = ($TABSTOP - ($at % $TABSTOP)); my $replace_with = ' ' x $cnt if ($cnt); $line =~ s/\t/$replace_with/; }; return $line; } ################################################################################ ####################### splitLine ############################################## ################################################################################ sub splitLine { my ($line, $linewidth, $prefix) = @_; my $length = length ($line); my $pos = 0; while ($length - $pos > $linewidth) { my $maxoff = ($pos + $linewidth > $length) ? ($length - 1) : ($pos + $linewidth); my $newpos = rindex ($line, " ", $maxoff); if ($newpos > $pos) { $pos = $newpos; $line = substr ($line, 0, $pos)."\0$prefix".substr ($line, $pos + 1, $length); } else { $pos = $pos + $linewidth + 1; $line = substr ($line, 0, $pos)."\0$prefix".substr ($line, $pos, $length); } }; return $line; } ################################################################################ ####################### get_input_file ######################################### ################################################################################ sub get_input_file { # in : \%params # in : \%LANGUAGE; # in/out : $langmode; # in/out : $alt_langmode; # returns: input file my %PARAMS = %{$_[0]}; my %LANGUAGE = %{$_[1]}; my $langmode = $_[2]; my $alt_langmode = $_[3]; my $code; if (defined $PARAMS{'input'}) { $code = $PARAMS{'input'}; $code =~ s/\r//g; } else { open(FILEHANDLE, $PARAMS{'infile'}) || die("While opening '$PARAMS{'infile'}' for input: ".$!."\n"); $code = ; close(FILEHANDLE); }; if ($PARAMS{'replacetabs'} != 0) { $code = join ( "\n", map{ &checkTabulator($_, $PARAMS{'replacetabs'}) } my @dummy = split(/\n/, $code) ); }; if (defined ($PARAMS{'linewidth'})) { $code = join ( "\n", map{ &splitLine($_, $PARAMS{'linewidth'}, $PARAMS{'linebreakprefix'}) } my @dummy = split(/\n/, $code) ); }; if ((!defined($langmode)) || ($langmode eq '')) { my $test_code = substr($code, 0, $LANG_TEST_LENGTH); warn("language mode not given. guessing...\n"); $langmode = ''; for (keys %LANGUAGE) { if ( (($LANGUAGE{$_}->{'filename'} ne '') && ($PARAMS{'infile'} =~ m/$LANGUAGE{$_}->{filename}/)) || (($LANGUAGE{$_}->{'regex'} ne '') && ($test_code =~ m/$LANGUAGE{$_}->{regex}/ )) ) { $langmode = $_; last; }; }; if ($langmode eq '') { if ((defined($alt_langmode)) && ($alt_langmode ne '')) { warn("Guessing language mode failed. Using fallback mode: '$alt_langmode'\n"); $langmode = $alt_langmode; $alt_langmode = ''; } else { die("Guessing language mode failed.\n") }; } else { warn("using '$langmode'\n"); }; }; $_[2] = $langmode; $_[3] = $alt_langmode; return \$code; }; ################################################################################ ####################### put_headers ############################################ ################################################################################ sub put_headers { my %PARAMS = %{shift()}; my $STYLE_REF = shift(); if (defined($PARAMS{'outfile'})) { unless ($PARAMS{'outfile'} eq '-'){ open(SAVEOUT, ">&STDOUT"); print SAVEOUT ''; # so perl does not typo warn open (STDOUT, '>'.$PARAMS{'outfile'}) || die("While redirecting STDOUT to '$PARAMS{'outfile'}' for output: ".$!."\n"); }; if (defined $PARAMS{'encoding'}) { $|=1; # PP: so the header is written before the data! # PP: this took me hours of debugging :( print "Content-Type: $$STYLE_REF{'content-type'}\n" if ($PARAMS{'content_type'}); print "Content-Encoding: $PARAMS{'encoding'}\n\n"; open (FILEHANDLE, "|$PARAMS{'encoder'}") || die("While opening '$PARAMS{'encoder'}': ".$!."\n"); } else { open( FILEHANDLE, ">&STDOUT" ) ; print FILEHANDLE "Content-Type: $$STYLE_REF{'content-type'}\n\n" if ($PARAMS{'content_type'}); }; print FILEHANDLE $$STYLE_REF{'header'} unless $PARAMS{'noheader'}; } }; ################################################################################ ####################### apply_stylesheets_to_rules ############################# ################################################################################ sub apply_stylesheets_to_rules { my ( $regexps_ref, $style_ref ) = @_; for ( @$regexps_ref ) { # warn ("Style '".$_->{style}."' not defined in stylesheet.\n") unless defined $ { $$style_ref{'tags'} } { $_->{style} }; if (defined ($ { $$style_ref{'tags'} } { $_->{style} })) { $_->{'starttag'} = $ { $ { $$style_ref{'tags'} } { $_->{style} } } { 'start' }; $_->{'endtag'} = $ { $ { $$style_ref{'tags'} } { $_->{style} } } { 'stop' }; } else { # no style no formating; if style == '' formating is done by childregex warn ("Style '".$_->{style}."' not defined in stylesheet.\n") if ($_->{style} ne ''); $_->{'starttag'} = ''; #$ { $ { $$style_ref{'tags'} } { $_->{style} } } { 'start' }; $_->{'endtag'} = ''; #$ { $ { $$style_ref{'tags'} } { $_->{style} } } { 'stop' }; } apply_stylesheets_to_rules( $_->{childregex}, $style_ref ) if $_->{childregex}; }; }; ################################################################################ ####################### create_snippetlist ##################################### ################################################################################ sub create_snippetlist { my ( $regexps_ref, $code, $snippetlist_ref, $style_ref ) = @_ ; my $length = length( $code ); ## An array of regular expression sturctures, each of which is an ## array. @res is kept sorted by starting position of the RExen and ## then by the position of the regex in the language file. This allows ## us to just evaluate $res[0], and to hand write fast code that typically ## handles 90% of the cases without resorting to the _big_ guns. ## ## FWIW, I pronounce '@res' REEZE, as in the plural of '$re'. ## my @res ; my $pos ; for ( @$regexps_ref ) { pos( $code ) = 0 ; #++$m ; next unless $code =~ m/($_->{regex})/gms ; $pos = pos( $code ) ; # $res[@res] = [ # $_->{regex}, # $ { $ { $$style_ref{'tags'} } { $_->{style} } } { 'start' }, # $ { $ { $$style_ref{'tags'} } { $_->{style} } } { 'stop' }, # $_->{childregex}, # $pos - length( $1 ), # $pos, # scalar( @res ), # ] ; $res[@res] = [ $_->{regex}, $_->{starttag}, $_->{endtag}, $_->{childregex}, $pos - length( $1 ), $pos, scalar( @res ), ] ; } ## 90% of all child regexes end up with 0 or 1 regex that needs to be ## worried about. Trimming out the 0's speeds things up a bit and ## makes the below loop simpler, since there's always at least ## 1 regexp. It donsn't speed things up much by itself: the percentage ## of times this fires is really small. But it does simplify the loop ## below and speed it up. unless ( @res ) { $code =~ s/($ENTITIES)/$ENTITIES{$1}/ge ; push @$snippetlist_ref, $code ; return ; } @res = sort { $a->[4] <=> $b->[4] || $a->[6] <=> $b->[6] } @res ; ## Add a dummy at the end, which makes the logic below simpler / faster. $res[@res] = [ undef, undef, undef, undef, $length, $length, scalar( @res ), ] ; ## These are declared here for (minor) speed improvement. my $re ; my $match_spos ; my $match_pos ; my $re_spos ; my $re_pos ; my $re_num ; my $prefix ; my $snippet ; my $rest ; my $i ; my $l ; my @changed_res ; my $j ; $pos = 0 ; MAIN: while ( $pos < $length ) { $re = $res[0] ; $match_spos = $re->[4] ; $match_pos = $re->[5] ; if ( $match_spos > $pos ) { $prefix = substr( $code, $pos, $match_spos - $pos ) ; $prefix =~ s/($ENTITIES)/$ENTITIES{$1}/ge ; push @$snippetlist_ref, $prefix ; } if ( $match_pos > $match_spos ) { $snippet = substr( $code, $match_spos, $match_pos - $match_spos ) ; if ( @{$re->[3]} ) { push @$snippetlist_ref, $re->[1] ; create_snippetlist( $re->[3], $snippet, $snippetlist_ref, $style_ref ) ; push @$snippetlist_ref, $re->[2] ; } else { $snippet =~ s/($ENTITIES)/$ENTITIES{$1}/ge ; push @$snippetlist_ref, $re->[1], $snippet, $re->[2]; } } $pos = $match_pos ; ## ## Hand coded optimizations. Luckily, the cases that arise most often ## are the easiest to tune. ## # =pod if ( $res[1]->[4] >= $pos ) { ## Only first regex needs to be moved, 2nd and later are still valid. ## This is often 90% of the cases for Perl or C (others not tested, ## just uncomment the $n, $o, and $p lines and try it yourself). #++$n{1} ; #++$m ; pos( $code ) = $pos ; unless ( $code =~ m/($re->[0])/gms ) { #++$o{'0'} ; if ( @res == 2 ) { ## If the only regexp left is the dummy, we're done. $rest = substr( $code, $pos ) ; $rest =~ s/($ENTITIES)/$ENTITIES{$1}/ge ; push @$snippetlist_ref, $rest ; last ; } shift @res ; } else { $re->[5] = $re_pos = pos( $code ) ; $re->[4] = $re_spos = $re_pos - length( $1 ) ; ## Walk down the array looking for $re's new home. ## The first few loop iterations are unrolled and done manually ## for speed, which handles 85 to 90% of the cases where only ## $re needs to be moved. ## ## Here's where that dummy regexp at the end of the array comes ## in handy: we don't need to worry about array size here, since ## it will always be after $re no matter what. The unrolled ## loop stuff is outdented to make the conditionals fit on one ## 80 char line. ## Element 4 in @{$res[x]} is the start position of the match. ## Element 6 is the order in which it was declared in the lang file. $re_num = $re->[6] ; if ( ( $re_spos <=> $res[1]->[4] || $re_num <=> $res[1]->[6] ) <= 0 ) { #++$o{'1'} ; next } $res[0] = $res[1] ; #++$o{'2'} ; if ( ( $re_spos <=> $res[2]->[4] || $re_num <=> $res[2]->[6] ) <= 0 ) { $res[1] = $re ; next ; } $res[1] = $res[2] ; if ( ( $re_spos <=> $res[3]->[4] || $re_num <=> $res[3]->[6] ) <= 0 ) { #++$o{'3'} ; $res[2] = $re ; next ; } $res[2] = $res[3] ; if ( ( $re_spos <=> $res[4]->[4] || $re_num <=> $res[4]->[6] ) <= 0 ) { #++$o{'3'} ; $res[3] = $re ; next ; } $res[3] = $res[4] ; if ( ( $re_spos <=> $res[5]->[4] || $re_num <=> $res[5]->[6] ) <= 0 ) { #++$o{'4'} ; $res[4] = $re ; next ; } $res[4] = $res[5] ; #++$o{'ugh'} ; $i = 6 ; $l = $#res ; for ( ; $i < $l ; ++$i ) { last if ( ( $re_spos <=> $res[$i]->[4] || $re_num <=> $res[$i]->[6] ) <= 0 ) ; $res[$i-1] = $res[$i] ; } #++$p{sprintf( "%2d", $i )} ; $res[$i-1] = $re ; } next ; } # =cut ## ## End optimizations. You can comment them all out and this net ## does all the work, just more slowly. If you do that, then ## you also need to comment out the code below that deals with ## the second entry in @res. ## #my $ni = 0 ; ## First re always needs to be tweaked #++$m ; #++$ni ; pos( $code ) = $pos ; unless ( $code =~ m/($re->[0])/gms ) { if ( @res == 2 ) { ## If the only regexp left is the dummy, we're done. $rest = substr( $code, $pos ) ; $rest =~ s/($ENTITIES)/$ENTITIES{$1}/ge ; push @$snippetlist_ref, $rest ; last ; } shift @res ; @changed_res = () ; $i = 0 ; } else { $re->[5] = $re_pos = pos( $code ) ; $re->[4] = $re_pos - length( $1 ) ; @changed_res = ( $re ) ; $i = 1 ; } ## If the optimizations above are in, the second one always ## needs to be tweaked, too. $re = $res[$i] ; #++$m ; #++$ni ; pos( $code ) = $pos ; unless ( $code =~ m/($re->[0])/gms ) { if ( @res == 2 ) { ## If the only regexp left is the dummy, we're done. $rest = substr( $code, $pos ) ; $rest =~ s/($ENTITIES)/$ENTITIES{$1}/ge ; push @$snippetlist_ref, $rest ; last ; } shift @res ; } else { $re->[5] = $re_pos = pos( $code ) ; $re->[4] = $re_spos = $re_pos - length( $1 ) ; if ( @changed_res && ( $changed_res[0]->[4] <=> $re_spos || $changed_res[0]->[6] <=> $re->[6] ) > 0 ) { unshift @changed_res, $re ; } else { $changed_res[$i] = $re ; } ++$i ; } for ( ; ; ++$i ) { local $_ = $res[$i] ; #++$m ; last if $_->[4] >= $pos ; #++$ni ; #++$m ; pos( $code ) = $pos ; unless ( $code =~ m/($_->[0])/gms ) { if ( @res <= 2 ) { $rest = substr( $code, $pos ) ; $rest =~ s/($ENTITIES)/$ENTITIES{$1}/ge ; push @$snippetlist_ref, $rest ; last MAIN ; } ## If this regex is no longer needed, remove it by not pushing it ## on to @changed_res. This means we need one less slot in @res. shift @res ; redo ; } $_->[5] = $re_pos = pos( $code ) ; $_->[4] = $re_spos = $re_pos - length( $1 ) ; ## Insertion sort in to @changed_res $re_num = $_->[6] ; for ( $j = $#changed_res ; $j > -1 ; --$j ) { last if ( ( $changed_res[$j]->[4] <=> $re_spos || $changed_res[$j]->[6] <=> $re_num ) < 0 ) ; $changed_res[$j+1] = $changed_res[$j] ; } $changed_res[$j+1] = $_ ; } ## Merge sort @changed_res and @res in to @res $j = 0 ; $l = $#res ; for ( @changed_res ) { while ( $i < $l && ( $_->[4] <=> $res[$i]->[4] || $_->[6] <=> $res[$i]->[6] ) > 0 ) { $res[$j++] = $res[$i++] ; } $res[$j++] = $_ ; } # =cut } }; ################################################################################## ######################### create_snippetlist ##################################### ################################################################################## ##sub create_snippetlist ## { ## my ( $regexps_ref, $code, $snippetlist_ref ) = @_ ; ## my $length = length( $code ); ## my @regexps; ## $regexps[scalar(@$regexps_ref)] = undef; ## my $head_ptr = undef; ## my $current_ptr; ## my $help_ptr; ## my $index = 0; ## for (@$regexps_ref) ## { ## $current_ptr = $regexps[$index]; #0: start_ptr 1: length 2: next_ptr, 3: regex, 4:start, 5:end, 6: child 7: index ## $current_ptr->[7] = $index++; ## $current_ptr->[6] = $$_{'childregex'}; ## $current_ptr->[5] = $$_{'endtag'}; ## $current_ptr->[4] = $$_{'starttag'}; ## $current_ptr->[3] = $$_{'regex'}; ## pos( $code ) = 0; ## if ( $code =~ /($current_ptr->[3])/gms ) { $current_ptr->[0] = pos ($code) - length($1); $current_ptr->[1] = length($1); } else {next}; ## if (!defined ($head_ptr) || $current_ptr->[0] < $head_ptr->[0] ) ## { ## $current_ptr->[2] = $head_ptr; ## $head_ptr = $current_ptr; ## } ## else ## { ## $help_ptr = $head_ptr; ## $help_ptr = $help_ptr->[2] ## while (defined ( $help_ptr->[2] ) && ($current_ptr->[0] >= $help_ptr->[2]->[0]) ); #iow: while (defined help->next && current->pos <= help->next->pos) ## $current_ptr->[2] = $help_ptr->[2]; ## $help_ptr->[2] = $current_ptr; ## }; ## }; ## my $endpos = 0; ## my $oldhead; ## my %entities ; ## $entities{'&'} = '&' ; ## $entities{'<'} = '<' ; ## $entities{'>'} = '>' ; ## $entities{'"'} = '"' ; ## my $snippet; ## while (defined $head_ptr) ## { ## if ($head_ptr->[0] - $endpos > 0) { ## $snippet = substr($code, $endpos, $head_ptr->[0] - $endpos); ## $snippet =~ s/($ENTITIES)/$ENTITIES{$1}/ge; #"]); ## push @$snippetlist_ref, $snippet; ## }; ## push @$snippetlist_ref, $head_ptr->[4]; ## &create_snippetlist( $head_ptr->[6], substr($code, $head_ptr->[0], $head_ptr->[1]) , $snippetlist_ref); ## push @$snippetlist_ref, $head_ptr->[5]; ## $endpos = $head_ptr->[0] + $head_ptr->[1]; ## # update & repair list : ## $oldhead = $head_ptr; ## # 1) shift now invalid matches from list ## $help_ptr = $head_ptr; ## $help_ptr = $help_ptr->[2] ## while (defined ( $help_ptr->[2] ) && ($endpos > $help_ptr->[2]->[0]) ); ## $head_ptr = $help_ptr->[2]; ## $help_ptr->[2] = undef; ## # 2) rematch invalid matches and insert them into the list ## while (defined $oldhead) ## { ## $current_ptr = $oldhead; ## $oldhead = $oldhead->[2]; ## pos( $code ) = $endpos; ## if ( $code =~ /($current_ptr->[3])/gms ) { $current_ptr->[0] = pos ($code) - length($1); $current_ptr->[1] = length($1); } else {next}; ## if (!defined ($head_ptr) || ## ($current_ptr->[0] < $head_ptr->[0]) || ## ( ## ( $current_ptr->[0] == $head_ptr->[0]) && ## ( $current_ptr->[7] < $head_ptr->[7]) ## ) ## ) ## { ## $current_ptr->[2] = $head_ptr; ## $head_ptr = $current_ptr; ## } ## else ## { ## $help_ptr = $head_ptr; ## $help_ptr = $help_ptr->[2] ## while (defined ( $help_ptr->[2] ) && ## ( ## ($current_ptr->[0] > $help_ptr->[2]->[0]) || ## ( ## ( $current_ptr->[0] == $help_ptr->[2]->[0]) && ## ( $current_ptr->[7] > $help_ptr->[2]->[7]) ## ) ## ) ## ); #iow: while (defined help->next && current->pos <= help->next->pos) # if two patterns match at the same pos ## # the one that was declared earlier is taken ## $current_ptr->[2] = $help_ptr->[2]; ## $help_ptr->[2] = $current_ptr; ## }; ## }; ## # 3) done ## }; ## $snippet = substr($code, $endpos); $snippet =~ s/($ENTITIES)/$ENTITIES{$1}/ge; #" ]); ## push @$snippetlist_ref, $snippet; ## }; ################################################################################ ####################### put_output ############################################# ################################################################################ sub put_output { my ( $params, $snippetlist_ref, $STYLE_REF ) = @_ ; my $result; my $prefix = ''; $prefix = $params->{'line_number_prefix'}.'_' if defined $params->{'line_number_prefix'}; $result = & { $ { $$STYLE_REF{'linenumbers'} }{$params->{'linenumbers'}} } (join ('', @$snippetlist_ref), $prefix); if (defined ($params{'linewidth'})) { $result =~ tr=\0=\n=; } print FILEHANDLE $result unless (defined $params->{'dont_print_output'} && $params->{'dont_print_output'}); print FILEHANDLE $$STYLE_REF{'footer'} unless $params->{'noheader'}; if (defined($params->{'outfile'})) { unless ($params->{'outfile'} eq '-'){ close (FILEHANDLE); close (STDOUT); open (STDOUT, ">&SAVEOUT"); }; }; return $result; }; ################################################################################ ####################### get_default_stylesheet ################################# ################################################################################ sub get_default_stylesheet { my %STYLESHEET; ########## ########## different color modes for html. # those are named html-dark, html-nobc and html-light. # html-light is also named html # the only difference between html-light and html-nobc is # that html-light defines a body background and text color. # nobc stands for no body colors. $STYLESHEET{'html-light'} = { 'template' => ' %%title%% download the original source code.
%%code%%

syntax highlighted by Code2HTML, v. %%version%% ', 'content-type' => 'text/html', 'entities' => { 'listofchars' => '[<>&"]', # a regex actually 'replace_by' => { '&' => '&', '<' => '<', '>' => '>', '"' => '"' } }, 'linenumbers' => { 'none' => sub { return $_[0]; }, 'normal' => sub { # o as the first parameter is the joined snippetlist # o the second is an optional prefix, needed if more than one block # in a file is highlighted. needed in patch-mode. may be empty # the sub should the return a scalar made up of the joined lines including linenumbers my @lines = split ( /\n/, $_[0] ); my $nr = 0; my $lengthofnr = length(@lines); my $format = qq{%${lengthofnr}u %s\n} ; join ('', map ( {$nr++; sprintf ( $format , $nr, $nr, $_ )} @lines)); }, 'linked' => sub { # this should do the same as above only with linenumbers that link to themselves # If this style does not support this, use the same as above. my @lines = split ( /\n/, $_[0] ); my $nr = 0; my $lengthofnr = length(@lines); my $format = qq{%$ {lengthofnr}u %s\n}; join ('', map ( {$nr++; sprintf ( $format , $nr, $nr, $nr, $_ )} @lines)); } }, 'tags' => { 'comment' => { 'start' => '', 'stop' => '' }, 'doc comment' => { 'start' => '', 'stop' => '' }, 'string' => { 'start' => '', 'stop' => '' }, 'esc string' => { 'start' => '', 'stop' => '' }, 'character' => { 'start' => '', 'stop' => '' }, 'esc character' => { 'start' => '', 'stop' => '' }, 'numeric' => { 'start' => '', 'stop' => '' }, 'identifier' => { 'start' => '', 'stop' => '' }, 'predefined identifier' => { 'start' => '', 'stop' => '' }, 'type' => { 'start' => '', 'stop' => '' }, 'predefined type' => { 'start' => '', 'stop' => '' }, 'reserved word' => { 'start' => '', 'stop' => '' }, 'library function' => { 'start' => '', 'stop' => '' }, 'include' => { 'start' => '', 'stop' => '' }, 'preprocessor' => { 'start' => '', 'stop' => '' }, 'braces' => { 'start' => '', 'stop' => '' }, 'symbol' => { 'start' => '', 'stop' => '' }, 'function header' => { 'start' => '', 'stop' => '' }, 'function header name' => { 'start' => '', 'stop' => '' }, 'function header args' => { 'start' => '', 'stop' => '' }, 'regex' => { 'start' => '', 'stop' => '' }, 'text' => { 'start' => '', 'stop' => ''}, # HTML 'entity' => { 'start' => '', 'stop' => '' }, # MAKEFILE 'assignment' => { 'start' => '', 'stop' => '' }, 'dependency line' => { 'start' => '', 'stop' => '' }, 'dependency target' => { 'start' => '', 'stop' => '' }, 'dependency continuation'=> { 'start' => '', 'stop' => '' }, 'continuation' => { 'start' => '', 'stop' => '' }, 'macro' => { 'start' => '', 'stop' => '' }, 'int macro' => { 'start' => '', 'stop' => '' }, 'esc $$$' => { 'start' => '', 'stop' => '' }, # PATCH 'separator' => { 'start' => '', 'stop' => '' }, 'line spec' => { 'start' => '', 'stop' => '' }, 'deletion' => { 'start' => '', 'stop' => '' }, 'insertion' => { 'start' => '', 'stop' => '' } } }; # html-light is also called html $STYLESHEET{'html'} = $STYLESHEET{'html-light'}; # html-nobc is a modification of html-light # in such a way, that the body tag does not define # a background and a text color # nobc stands for no body colors. %{$STYLESHEET{'html-nobg'}} = %{$STYLESHEET{'html-light'}}; ${ $STYLESHEET{'html-nobg'}} {'template'} = ' %%title%%
%%code%%

syntax highlighted by Code2HTML, v. %%version%% '; # html-dark is a modification of html-light # in such a way, that the body tag does define # different colors and that the colors are different. %{$STYLESHEET{'html-dark'}} = %{$STYLESHEET{'html-light'}}; ${ $STYLESHEET{'html-dark'}} {'template'} = ' %%title%%
%%code%%

syntax highlighted by Code2HTML, v. %%version%% '; ${ $STYLESHEET{'html-dark'}} {'tags'} = { 'comment' => { 'start' => '', 'stop' => '' }, 'doc comment' => { 'start' => '', 'stop' => '' }, 'string' => { 'start' => '', 'stop' => '' }, 'esc string' => { 'start' => '', 'stop' => '' }, 'character' => { 'start' => '', 'stop' => '' }, 'esc character' => { 'start' => '', 'stop' => '' }, 'numeric' => { 'start' => '', 'stop' => '' }, 'identifier' => { 'start' => '', 'stop' => '' }, 'predefined identifier' => { 'start' => '', 'stop' => '' }, 'type' => { 'start' => '', 'stop' => '' }, 'predefined type' => { 'start' => '', 'stop' => '' }, 'reserved word' => { 'start' => '', 'stop' => '' }, 'library function' => { 'start' => '', 'stop' => '' }, 'include' => { 'start' => '', 'stop' => '' }, 'preprocessor' => { 'start' => '', 'stop' => '' }, 'braces' => { 'start' => '', 'stop' => '' }, 'symbol' => { 'start' => '', 'stop' => '' }, 'function header' => { 'start' => '', 'stop' => '' }, 'function header name' => { 'start' => '', 'stop' => '' }, 'function header args' => { 'start' => '', 'stop' => '' }, 'regex' => { 'start' => '', 'stop' => '' }, 'text' => { 'start' => '', 'stop' => ''}, # HTML 'entity' => { 'start' => '', 'stop' => '' }, # MAKEFILE 'assignment' => { 'start' => '', 'stop' => '' }, 'dependency line' => { 'start' => '', 'stop' => '' }, 'dependency target' => { 'start' => '', 'stop' => '' }, 'dependency continuation'=> { 'start' => '', 'stop' => '' }, 'continuation' => { 'start' => '', 'stop' => '' }, 'macro' => { 'start' => '', 'stop' => '' }, 'int macro' => { 'start' => '', 'stop' => '' }, 'esc $$$' => { 'start' => '', 'stop' => '' }, # PATCH 'separator' => { 'start' => '', 'stop' => '' }, 'line spec' => { 'start' => '', 'stop' => '' }, 'deletion' => { 'start' => '', 'stop' => '' }, 'insertion' => { 'start' => '', 'stop' => '' } }; ##### # # nocolor # %{$STYLESHEET{'html-nocolor'}} = %{$STYLESHEET{'html-nobg'}}; ${ $STYLESHEET{'html-nocolor'}} {'tags'} = { 'comment' => { 'start' => '', 'stop' => '' }, 'doc comment' => { 'start' => '', 'stop' => '' }, 'string' => { 'start' => '', 'stop' => '' }, 'esc string' => { 'start' => '', 'stop' => '' }, 'character' => { 'start' => '', 'stop' => '' }, 'esc character' => { 'start' => '', 'stop' => '' }, 'numeric' => { 'start' => '', 'stop' => '' }, 'identifier' => { 'start' => '', 'stop' => '' }, 'predefined identifier' => { 'start' => '', 'stop' => '' }, 'type' => { 'start' => '', 'stop' => '' }, 'predefined type' => { 'start' => '', 'stop' => '' }, 'reserved word' => { 'start' => '', 'stop' => '' }, 'library function' => { 'start' => '', 'stop' => '' }, 'include' => { 'start' => '', 'stop' => '' }, 'preprocessor' => { 'start' => '', 'stop' => '' }, 'braces' => { 'start' => '', 'stop' => '' }, 'symbol' => { 'start' => '', 'stop' => '' }, 'function header' => { 'start' => '', 'stop' => '' }, 'function header name' => { 'start' => '', 'stop' => '' }, 'function header args' => { 'start' => '', 'stop' => '' }, 'regex' => { 'start' => '', 'stop' => '' }, 'text' => { 'start' => '', 'stop' => '' }, # HTML 'entity' => { 'start' => '', 'stop' => '' }, # MAKEFILE 'assignment' => { 'start' => '', 'stop' => '' }, 'dependency line' => { 'start' => '', 'stop' => '' }, 'dependency target' => { 'start' => '', 'stop' => '' }, 'dependency continuation' => { 'start' => '', 'stop' => '' }, 'continuation' => { 'start' => '', 'stop' => '' }, 'macro' => { 'start' => '', 'stop' => '' }, 'int macro' => { 'start' => '', 'stop' => '' }, 'esc $$$' => { 'start' => '', 'stop' => '' }, # PATCH 'separator' => { 'start' => '', 'stop' => '' }, 'line spec' => { 'start' => '', 'stop' => '' }, 'deletion' => { 'start' => '', 'stop' => '' }, 'insertion' => { 'start' => '', 'stop' => '' } }; ##### # # simple # %{$STYLESHEET{'html-simple'}} = %{$STYLESHEET{'html-nocolor'}}; ${ $STYLESHEET{'html-simple'}} {'template'} = ' %%title%%

%%title%%

%%code%%
    
'; # Vincent Sanders # html-fntlck is a modification of html-light # in such a way, that the body tag does define # different colors and that the colors are different. #it is supposed to be the colours i get from emacs default font-lock mode %{$STYLESHEET{'html-fntlck'}} = %{$STYLESHEET{'html-light'}}; ${ $STYLESHEET{'html-fntlck'}} {'template'} = ' %%title%%
%%code%%

syntax highlighted by Code2HTML, v. %%version%% '; ${ $STYLESHEET{'html-fntlck'}} {'tags'} = { 'comment' => { 'start' => '', 'stop' => '' }, 'doc comment' => { 'start' => '', 'stop' => '' }, 'string' => { 'start' => '', 'stop' => '' }, 'esc string' => { 'start' => '', 'stop' => '' }, 'character' => { 'start' => '', 'stop' => '' }, 'esc character' => { 'start' => '', 'stop' => '' }, 'numeric' => { 'start' => '', 'stop' => '' }, 'identifier' => { 'start' => '', 'stop' => '' }, 'predefined identifier' => { 'start' => '', 'stop' => '' }, 'type' => { 'start' => '', 'stop' => '' }, 'predefined type' => { 'start' => '', 'stop' => '' }, 'reserved word' => { 'start' => '', 'stop' => '' }, 'library function' => { 'start' => '', 'stop' => '' }, 'include' => { 'start' => '', 'stop' => '' }, 'preprocessor' => { 'start' => '', 'stop' => '' }, 'braces' => { 'start' => '', 'stop' => '' }, 'symbol' => { 'start' => '', 'stop' => '' }, 'function header' => { 'start' => '', 'stop' => '' }, 'function header name' => { 'start' => '', 'stop' => '' }, 'function header args' => { 'start' => '', 'stop' => '' }, 'regex' => { 'start' => '', 'stop' => '' }, 'text' => { 'start' => '', 'stop' => ''}, # HTML 'entity' => { 'start' => '', 'stop' => '' }, # MAKEFILE 'assignment' => { 'start' => '', 'stop' => '' }, 'dependency line' => { 'start' => '', 'stop' => '' }, 'dependency target' => { 'start' => '', 'stop' => '' }, 'dependency continuation'=> { 'start' => '', 'stop' => '' }, 'continuation' => { 'start' => '', 'stop' => '' }, 'macro' => { 'start' => '', 'stop' => '' }, 'int macro' => { 'start' => '', 'stop' => '' }, 'esc $$$' => { 'start' => '', 'stop' => '' }, # PATCH 'separator' => { 'start' => '', 'stop' => '' }, 'line spec' => { 'start' => '', 'stop' => '' }, 'deletion' => { 'start' => '', 'stop' => '' }, 'insertion' => { 'start' => '', 'stop' => '' } }; return \%STYLESHEET; }; ################################################################################ ####################### get_default_database ################################### ################################################################################ sub get_default_database { my %LANGUAGE; # written by PP $LANGUAGE{'plain'} = { 'filename' => '', 'regex' => '', 'patterns' => [] }; # taken from nedit # modified by PP $LANGUAGE{'ada'} = { 'filename' => '(?i)\\.a(d[asb]?)?$', 'regex' => '', 'patterns' => [ { 'name' => 'Comments', 'regex' => '--.*?$', 'style' => 'comment', 'childregex' => [], }, { 'name' => 'String Literals', 'regex' => '".*?("|$)', 'style' => 'string', 'childregex' => [] }, { 'name' => 'Character Literals', 'regex' => '\'.\'', 'style' => 'character', 'childregex' => [] }, { 'name' => 'Ada Attributes', 'regex' => '\'[a-zA-Z][a-zA-Z_]+\\b', 'style' => 'reserved word', 'childregex' => [] }, { 'name' => 'Numeric Literals', 'regex' => '(((2|8|10|16)#[_0-9a-fA-F]*#)|[0-9.]+)', 'style' => 'numeric', 'childregex' => [] }, { 'name' => 'Withs Pragmas Use', 'regex' => '\\b(?i)((with|pragma|use)[ \\t\\n\\f\\r]+[a-zA-Z0-9_.]+;)+\\b', 'style' => 'include', 'childregex' => [] }, { 'name' => 'Predefined Types', 'regex' => '\\b(?i)(boolean|character|count|duration|float|integer|long_float|long_integer|priority|short_float|short_integer|string)\\b', 'style' => 'predefined type', 'childregex' => [] }, { 'name' => 'Predefined Subtypes', 'regex' => '\\b(?i)field|natural|number_base|positive|priority\\b', 'style' => 'predefined type', 'childregex' => [] }, { 'name' => 'Reserved Words', 'regex' => '\\b(?i)(abort|abs|accept|access|and|array|at|begin|body|case|constant|declare|delay|delta|digits|do|else|elsif|end|entry|exception|exit|for|function|generic|goto|if|in|is|limited|loop|mod|new|not|null|of|or|others|out|package|pragma|private|procedure|raise|range|record|rem|renames|return|reverse|select|separate|subtype|task|terminate|then|type|use|when|while|with|xor)\\b', 'style' => 'reserved word', 'childregex' => [] }, { 'name' => 'Ada 95 Only', 'regex' => '\\b(?i)(abstract|tagged|all|protected|aliased|requeue|until)\\b', 'style' => 'reserved word', 'childregex' => [] }, { 'name' => 'Identifiers', 'regex' => '\\b[a-zA-Z][a-zA-Z0-9_]*\\b', 'style' => 'identifier', 'childregex' => [] }, { 'name' => 'Dot All', 'regex' => '(?i)\\.all\\b', 'style' => 'predefined identifier', 'childregex' => [] } ] }; $LANGUAGE{'ada95'} = $LANGUAGE{'ada'}; # written by JA $LANGUAGE{'awk'} = { 'filename' => '(?i)\\.awk$', 'regex' => '^\\s*#\\s*![^\\s]*awk', 'patterns' => [ { 'name' => 'comment', 'regex' => '#.*?$', 'style' => 'comment', 'childregex' => [] }, { 'name' => 'string', 'regex' => '""|".*?([^\\\\](\\\\\\\\)*)"|"\\\\\\\\"', # 'regex' => '""|"\\\\\\\\"|"[^"\\\\]"|"[^"].*?[^\\\\]"', 'style' => 'string', 'childregex' => [ { 'name' => 'esc character', 'regex' => '\\\\.', 'style' => 'esc character', 'childregex' => [] } ] }, { 'name' => 'string', 'regex' => '\'\'|\'.*?([^\\\\](\\\\\\\\)*)\'|\'\\\\\\\\\'', # 'regex' => '\'\'|\'\\\\\\\\\'|\'[^\'\\\\]\'|\'[^\'].*?[^\\\\]\'', 'style' => 'string', 'childregex' => [ { 'name' => 'esc character', 'regex' => '\\\\.', 'style' => 'esc character', 'childregex' => [] } ] }, { 'name' => 'function header', 'regex' => 'function[\\t ]+([a-zA-Z0-9_]+)[\\t \\n]*(\\{|\\n)', 'style' => 'function header', 'childregex' => [ { 'name' => 'function coloring', 'regex' => '[\\t ]([a-zA-Z0-9_]+)', 'style' => 'function header name', 'childregex' => [] } ] }, { 'name' => 'regex matching I 1', 'regex' => '(\\b| )?(/)(\\\\/|[^/\\n])*(/[gimesox]*)', 'style' => 'regex', 'childregex' => [] }, { 'name' => 'regex matching I 2', 'regex' => '(?:\\b| )(?:(?:m|q|qq)([!"#$%&\'*+-/]))(\\\\\\2|[^\\2\\n])*(\\2[gimesox]*)', 'style' => 'regex', 'childregex' => [] }, { 'name' => 'regex matching II', 'regex' => '(?:\\b| )?(?:s([!"#$%&\'*+-/]))(?:\\\\\\2|[^\\2\\n])*?(\\2)[^(\\2)\\n]*?(\\2[gimesox]*)', 'style' => 'regex', 'childregex' => [] }, { 'name' => 'translate', 'regex' => '(?:\\b| )(?:(?:tr|y)([^\w\s]))(?:\\\\\\2|[^\\2\\n])*?(\\2)[^(\\2)\\n]*?(\\2[gimesox]*)', 'style' => 'regex', 'childregex' => [] }, { 'name' => 'keywords', 'regex' => '\\b(BEGIN|END|ARGC|ARGIND|ARGV|CONVFMT|ENVIRON|ERRNO|FIELDWIDTHS|FILENAME|FNR|FS|IGNORECASE|NF|NR|OFMT|OFS|ORS|RS|RT|RSTART|RLENGTH|SUBSEP)\\b', 'style' => 'reserved word', 'childregex' => [] }, { 'name' => 'keywords 2', 'regex' => '\\b(if|while|do|for|in|break|continue|delete|exit|next|nextfile|function)\\b', 'style' => 'reserved word', 'childregex' => [] }, { 'name' => 'library fns', 'regex' => '\\b(close|getline|print|printf|system|fflush|atan2|cos|exp|int|log|rand|sin|sqrt|srand|gensub|gsub|index|length|split|sprintf|sub|substr|tolower|toupper|systime|strftime)\\b', 'style' => 'library function', 'childregex' => [] }, { 'name' => 'braces and parens', 'regex' => '[\\[\\]\\{\\}\\(\\)]', 'style' => 'braces', 'childregex' => [] }, { 'name' => '<< stuff', 'regex' => '<<\'([^\\n]*)\';.*?^\\2$', 'style' => 'text', 'childregex' => [] }, { 'name' => '<< stuff', 'regex' => '<<([^\\n]*).*?^\\2$', 'style' => 'text', 'childregex' => [] } ] }; # taken from nedit # modified by PP $LANGUAGE{'c'} = { 'filename' => '\\.[ch]$', 'regex' => '', 'patterns' => [ { 'name' => 'doc comment', 'regex' => '/\\*\\*.*?\\*/', 'style' => 'doc comment', 'childregex' => [] }, { 'name' => 'comment', 'regex' => '/\\*.*?\\*/', 'style' => 'comment', 'childregex' => [] }, { 'name' => 'string', 'regex' => '""|".*?([^\\\\](\\\\\\\\)*)"|"\\\\\\\\"', # 'regex' => '""|"\\\\\\\\"|"[^"\\\\]"|"[^"].*?[^\\\\]"', 'style' => 'string', 'childregex' => [ { 'name' => 'esc character', 'regex' => '\\\\.', 'style' => 'esc character', 'childregex' => [] } ] }, { 'name' => 'preprocessor line', 'regex' => '^[ \\t]*#.*?$', 'style' => 'preprocessor', 'childregex' => [ { 'name' => 'string', 'regex' => '""|".*?([^\\\\](\\\\\\\\)*)"|"\\\\\\\\"', # 'regex' => '""|"\\\\\\\\"|"[^"\\\\]"|"[^"].*?[^\\\\]"', 'style' => 'string', 'childregex' => [ { 'name' => 'esc character', 'regex' => '\\\\.', 'style' => 'esc character', 'childregex' => [] } ] }, { 'name' => '', 'regex' => '<.*?>', 'style' => 'string', 'childregex' => [] }, { 'name' => 'comment', 'regex' => '[^/]/\\*.*?\\*/', 'style' => 'comment', 'childregex' => [] } ] }, { 'name' => 'character constant', 'regex' => '\'(\\\\)?.\'', 'style' => 'character', 'childregex' => [ { 'name' => 'esc character', 'regex' => '\\\\.', 'style' => 'esc character', 'childregex' => [] } ] }, { 'name' => 'numeric constant', 'regex' => '\\b((0(x|X)[0-9a-fA-F]*)|(([0-9]+\\.?[0-9]*)|(\\.[0-9]+))((e|E)(\\+|-)?[0-9]+)?)(L|l|UL|ul|u|U|F|f)?\\b', 'style' => 'numeric', 'childregex' => [] }, { 'name' => 'storage keyword', 'regex' => '\\b(const|extern|auto|register|static|unsigned|signed|volatile|char|double|float|int|long|short|void|typedef|struct|union|enum)\\b', 'style' => 'reserved word', 'childregex' => [] }, { 'name' => 'keyword', 'regex' => '\\b(return|goto|if|else|case|default|switch|break|continue|while|do|for|sizeof)\\b', 'style' => 'reserved word', 'childregex' => [] }, { 'name' => 'braces', 'regex' => '[\\{\\}]', 'style' => 'braces', 'childregex' => [] }, { 'name' => 'symbols', 'regex' => '([\\*\\-\\+=:;%&\\|<>\\(\\)\\[\\]!])', 'style' => 'symbol', 'childregex' => [] }, { 'name' => 'identifiers', 'regex' => '([a-zA-Z_][a-zA-Z_0-9]*)', 'style' => 'identifier', 'childregex' => [] } ] }; # taken from nedit # modified by PP $LANGUAGE{'c++'} = { 'filename' => '\\.(c(c|pp|xx)|h(h|pp|xx)|C(C|PP|XX)?|H(H|PP|XX)?|i)$', 'regex' => '', 'patterns' => [ { 'name' => 'doc comment', 'regex' => '/\\*\\*.*?\\*/', 'style' => 'doc comment', 'childregex' => [] }, { 'name' => 'comment', 'regex' => '/\\*.*?\\*/', 'style' => 'comment', 'childregex' => [] }, { 'name' => 'cplus comment', 'regex' => '//.*?$', 'style' => 'comment', 'childregex' => [] }, { 'name' => 'string', 'regex' => '""|"\\\\\\\\"|".*?([^\\\\](\\\\\\\\)*)"', # 'regex' => '""|"\\\\\\\\"|"[^"\\\\]"|"[^"].*?[^\\\\]"', 'style' => 'string', 'childregex' => [ { 'name' => 'esc character', 'regex' => '\\\\.', 'style' => 'esc character', 'childregex' => [] } ] }, { 'name' => 'preprocessor line', 'regex' => '^[ \\t]*#.*?$', 'style' => 'preprocessor', 'childregex' => [ { 'name' => 'string', 'regex' => '""|".*?([^\\\\](\\\\\\\\)*)"|"\\\\\\\\"', # 'regex' => '""|"\\\\\\\\"|"[^"\\\\]"|"[^"].*?[^\\\\]"', 'style' => 'string', 'childregex' => [ { 'name' => 'esc character', 'regex' => '\\\\.', 'style' => 'esc character', 'childregex' => [] } ] }, { 'name' => '', 'regex' => '<.*?>', 'style' => 'string', 'childregex' => [] }, { 'name' => 'comment', 'regex' => '[^/]/\\*.*?\\*/', 'style' => 'comment', 'childregex' => [] }, { 'name' => 'cplus comment', 'regex' => '//.*?$', 'style' => 'comment', 'childregex' => [] } ] }, { 'name' => 'character constant', 'regex' => '\'(\\\\)?.\'', 'style' => 'character', 'childregex' => [ { 'name' => 'esc character', 'regex' => '\\\\.', 'style' => 'esc character', 'childregex' => [] } ] }, { 'name' => 'numeric constant', 'regex' => '\\b((0(x|X)[0-9a-fA-F]*)|(([0-9]+\\.?[0-9]*)|(\\.[0-9]+))((e|E)(\\+|-)?[0-9]+)?)(L|l|UL|ul|u|U|F|f)?\\b', 'style' => 'numeric', 'childregex' => [] }, { 'name' => 'storage keyword', 'regex' => '\\b(class|typename|typeid|template|friend|virtual|inline|explicit|operator|overload|public|private|protected|const|extern|auto|register|static|mutable|unsigned|signed|volatile|char|double|float|int|long|short|bool|wchar_t|void|typedef|struct|union|enum)\\b', 'style' => 'reserved word', 'childregex' => [], }, { 'name' => 'keyword', 'regex' => '\\b(new|delete|this|return|goto|if|else|case|default|switch|break|continue|while|do|for|catch|throw|sizeof|true|false|namespace|using|dynamic_cast|static_cast|reinterpret_cast)\\b', 'style' => 'reserved word', 'childregex' => [] }, { 'name' => 'braces', 'regex' => '[\\{\\}]', 'style' => 'braces', 'childregex' => [] }, { 'name' => 'symbols', 'regex' => '([\\*\\-\\+=:;%&\\|<>\\(\\)\\[\\]!])', 'style' => 'symbol', 'childregex' => [] }, { 'name' => 'identifiers', 'regex' => '([a-zA-Z_][a-zA-Z_0-9]*)', 'style' => 'identifier', 'childregex' => [] } ] }; $LANGUAGE{'cc'} = $LANGUAGE{'c++'}; $LANGUAGE{'cpp'} = $LANGUAGE{'c++'}; $LANGUAGE{'cxx'} = $LANGUAGE{'c++'}; # taken from nedit # modified by tk $LANGUAGE{'f'} = { 'filename' => '\\.(f(f|or|77)|F(F|OR|77))$', 'regex' => '', 'patterns' => [ { 'name' => 'comment', 'regex' => '^[C|c].*?$', 'style' => 'comment', 'childregex' => [] }, { 'name' => 'string', 'regex' => '""|".*?([^\\\\](\\\\\\\\)*)"|"\\\\\\\\"', 'style' => 'string', 'childregex' => [] }, { 'name' => 'numeric constant', 'regex' => '\\b([0-9]+(\\.[0-9]*)?([DEde][-+]?[0-9]*)?|\\.[0-9]+([DEde][-+]?[0-9]*)?)\\b', 'style' => 'numeric', 'childregex' => [] }, { 'name' => 'storage keyword', 'regex' => '\\b(BYTE|[Bb]yte|CHARACTER|[Cc]haracter|COMPLEX|[Cc]omplex|DOUBLE *COMPLEX|[Dd]ouble *[Cc]omplex|DOUBLE *PRECISION|[Dd]ouble *[Pp]recision|DOUBLE|[Dd]ouble|INTEGER|[Ii]nteger|REAL|[Rr]eal)(\\*[0-9]+)?\\b', 'style' => 'reserved word', 'childregex' => [] }, { 'name' => 'keyword', 'regex' => '\\b(ACCEPT|[Aa]ccept|ASSIGN|[Aa]ssign|AUTOMATIC|[Aa]utomatic|BACKSPACE|[Bb]ackspace|BLOCK|[Bb]lock|CALL|[Cc]all|CLOSE|[Cc]lose|COMMON|[Cc]ommon|CONTINUE|[Cc]ontinue|DATA|[Dd]ata|DECODE|[Dd]ecode|DELETE|[Dd]elete|DIMENSION|[Dd]imension|DO|[Dd]o|ELSE|[Ee]lse|ELSEIF|[Ee]lseif|ENCODE|[Ee]ncode|END *FILE|[Ee]nd *[Ff]ile|ENDFILE|[Ee]ndfile|END|[Ee]nd|ENDIF|[Ee]ndif|ENTRY|[Ee]ntry|EQUIVALENCE|[Ee]quivalence|EXIT|[Ee]xit|EXTERNAL|[Ee]xternal|FORMAT|[Ff]ormat|FUNCTION|[Ff]unction|GOTO|[Gg]oto|IF|[Ii]f|IMPLICIT|[Ii]mplicit|INCLUDE|[Ii]nclude|INQUIRE|[Ii]nquire|INTRINSIC|[Ii]ntrinsic|LOGICAL|[Ll]ogical|MAP|[Mm]ap|NONE|[Nn]one|ON|[Oo]n|OPEN|[Oo]pen|PARAMETER|[Pp]arameter|PAUSE|[Pp]ause|POINTER|[Pp]ointer|PRINT|[Pp]rint|PROGRAM|[Pp]rogram|READ|[Rr]ead|RECORD|[Rr]ecord|RETURN|[Rr]eturn|REWIND|[Rr]ewind|SAVE|[Ss]ave|STATIC|[Ss]tatic|STOP|[Ss]top|STRUCTURE|[Ss]tructure|SUBROUTINE|[Ss]ubroutine|SYSTEM|[Ss]ystem|THEN|[Tt]hen|TO|[Tt]o|TYPE|[Tt]ype|UNION|[Uu]nion|UNLOCK|[Uu]nlock|VIRTUAL|[Vv]irtual|VOLATILE|[Vv]olatile|WHILE|[Ww]hile|WRITE|[Ww]rite)\\b', 'style' => 'reserved word', 'childregex' => [] }, { 'name' => 'symbols', 'regex' => '([\\*\\-\\+=:;%&\\|<>\\(\\)\\[\\]!])', 'style' => 'symbol', 'childregex' => [] }, { 'name' => 'identifiers', 'regex' => '([a-zA-Z_][a-zA-Z_0-9]*)', 'style' => 'identifier', 'childregex' => [] } ] }; # written by VRS $LANGUAGE{'gpasm'} = { 'filename' => '(?i)\\.(asm|inc)$', 'regex' => '', 'patterns' => [ { 'name' => 'args', 'regex' => '^.*$', 'style' => 'symbol', 'childregex' => [ { 'name' => 'comment', 'regex' => ';.*?$', 'style' => 'comment', 'childregex' => [] }, { 'name' => 'labels', 'regex' => '^[A-Za-z_][A-Za-z_0-9]*:?', 'style' => 'identifier', 'childregex' => [] }, { 'name' => 'menonics', 'regex' => '^[ \t]+[A-Za-z_][A-Za-z_0-9]*', 'style' => 'reserved word', 'childregex' => [] }, { 'name' => 'string', 'regex' => '""|".*?([^\\\\](\\\\\\\\)*)"|"\\\\\\\\"', 'style' => 'string', 'childregex' => [ { 'name' => 'esc character', 'regex' => '\\\\.', 'style' => 'esc character', 'childregex' => [] } ] } ] } ] }; # written by JA $LANGUAGE{'groff'} = { 'filename' => '\\.groff$', 'regex' => '', 'patterns' => [ { 'name' => 'comment', 'regex' => '\\\\".*?$', 'style' => 'comment', 'childregex' => [] } ] }; # taken from nedit # modified by PP $LANGUAGE{'html'} = { 'filename' => '(?i)\\.html?$', 'regex' => '', 'patterns' => [ { 'name' => 'comment', 'regex' => '', 'style' => 'comment', 'childregex' => [] }, { 'name' => 'entity', 'regex' => '\\&[-.a-zA-Z0-9#]*;?', 'style' => 'entity', 'childregex' => [] }, { 'name' => 'tag', 'regex' => '<(/|!)?[-.a-zA-Z0-9]*.*?>', 'style' => 'predefined identifier', 'childregex' => [ { 'name' => 'double quote string', 'regex' => '".*?"', 'style' => 'string', 'childregex' => [] }, { 'name' => 'single quote string', 'regex' => '\'.*?\'', 'style' => 'string', 'childregex' => [] }, { 'name' => 'brackets', 'regex' => '[<>]', 'style' => 'braces', 'childregex' => [] }, { 'name' => 'attribute', 'regex' => '[^\'" ]+(?=.)', 'style' => 'identifier', 'childregex' => [] } ] } ] }; # taken from nedit # modified by PP $LANGUAGE{'java'} = { 'filename' => '\\.java$', 'regex' => '', 'patterns' => [ { 'name' => 'doc comment', 'regex' => '/\\*\\*.*?\\*/', 'style' => 'doc comment', 'childregex' => [] }, { 'name' => 'comment', 'regex' => '/\\*.*?\\*/', 'style' => 'comment', 'childregex' => [] }, { 'name' => 'cplus comment', 'regex' => '//.*?$', 'style' => 'comment', 'childregex' => [] }, { 'name' => 'string', 'regex' => '""|".*?([^\\\\](\\\\\\\\)*)"|"\\\\\\\\"', # 'regex' => '""|"\\\\\\\\"|"[^"\\\\]"|"[^"].*?[^\\\\]"', 'style' => 'string', 'childregex' => [ { 'name' => 'esc character', 'regex' => '\\\\.', 'style' => 'esc character', 'childregex' => [] } ] }, { 'name' => 'single quoted', 'regex' => '\'\'|\'.*?([^\\\\](\\\\\\\\)*)\'|\'\\\\\\\\\'', # 'regex' => '\'\'|\'\\\\\\\\\'|\'[^\'\\\\]\'|\'[^\'].*?[^\\\\]\'', 'style' => 'string', 'childregex' => [] }, { 'name' => 'numeric constant', 'regex' => '\\b((0(x|X)[0-9a-fA-F]*)|(([0-9]+\\.?[0-9]*)|(\\.[0-9]+))((e|E)(\\+|-)?[0-9]+)?)(L|l|UL|ul|u|U|F|f)?\\b', 'style' => 'numeric', 'childregex' => [] }, { 'name' => 'include', 'regex' => '\\b(import|package)\\b.*?$', 'style' => 'include', 'childregex' => [ { 'name' => 'esc character', 'regex' => '\\\\(.|\\n)', 'style' => 'esc character', 'childregex' => [] }, { 'name' => 'comment', 'regex' => '[^/]/\\*.*?\\*/', 'style' => 'comment', 'childregex' => [] } ] }, { 'name' => 'storage keyword', 'regex' => '\\b(abstract|boolean|byte|char|class|double|extends|final|float|int|interface|long|native|private|protected|public|short|static|transient|synchronized|void|volatile|implements)\\b', 'style' => 'reserved word', 'childregex' => [] }, { 'name' => 'keyword', 'regex' => '\\b(break|case|catch|continue|default|do|else|false|finally|for|if|instanceof|new|null|return|super|switch|this|throw|throws|true|try|while)\\b', 'style' => 'reserved word', 'childregex' => [] }, { 'name' => 'braces and parens', 'regex' => '[\\{\\}\\(\\)\\[\\]]', 'style' => 'braces', 'childregex' => [] }, { 'name' => 'Identifiers', 'regex' => '\\b[a-zA-Z_][a-zA-Z0-9_]*\\b', 'style' => 'identifier', 'childregex' => [] }, { 'name' => 'symbols', 'regex' => '([\\*\\-\\+=:;%&\\|<>!])', 'style' => 'symbol', 'childregex' => [] } ] }; # taken from nedit # modified by PP $LANGUAGE{'javascript'} = { 'filename' => '(?i)\\.js$', 'regex' => '', 'patterns' => [ { 'name' => 'comment', 'regex' => '/\\*.*?\\*/', 'style' => 'comment', 'childregex' => [] }, { 'name' => 'cplus comment', 'regex' => '//.*?$', 'style' => 'comment', 'childregex' => [] }, { 'name' => 'numeric constant', 'regex' => '\\b((0(x|X)[0-9a-fA-F]*)|(([0-9]+\\.?[0-9]*)|(\\.[0-9]+))((e|E)(\\+|-)?[0-9]+)?)(L|l|UL|ul|u|U|F|f)?\\b', 'style' => 'numeric', 'childregex' => [] }, { 'name' => 'events', 'regex' => '\\b(onAbort|onBlur|onClick|onChange|onDblClick|onDragDrop|onError|onFocus|onKeyDown|onKeyPress|onLoad|onMouseDown|onMouseMove|onMouseOut|onMouseOver|onMouseUp|onMove|onResize|onSelect|onSubmit|onUnload)\\b', 'style' => 'reserved word', 'childregex' => [] }, { 'name' => 'braces', 'regex' => '[\\{\\}]', 'style' => 'braces', 'childregex' => [] }, { 'name' => 'statements', 'regex' => '\\b(break|continue|else|for|if|in|new|return|this|typeof|var|while|with)\\b', 'style' => 'reserved word', 'childregex' => [] }, { 'name' => 'function', 'regex' => 'function[\\t ]+([a-zA-Z0-9_]+)[\\t \\(]+.*?[\\n{]', 'style' => 'function header', 'childregex' => [ { 'name' => 'function args', 'regex' => '\\(.*?\\)', 'style' => 'function header args', 'childregex' => [] }, { 'name' => 'function name', 'regex' => '[\\t ][a-zA-Z0-9_]+', 'style' => 'function header name', 'childregex' => [] } ] }, { 'name' => 'built in object type', 'regex' => '\\b(anchor|Applet|Area|Array|button|checkbox|Date|document|elements|FileUpload|form|frame|Function|hidden|history|Image|link|location|Math|navigator|Option|password|Plugin|radio|reset|select|string|submit|text|textarea|window)\\b', 'style' => 'predefined type', 'childregex' => [] }, { 'name' => 'string', 'regex' => '".*?("|$)', 'style' => 'string', 'childregex' => [ { 'name' => 'colors', 'regex' => '(aliceblue|antiquewhite|aqua|aquamarine|azure|beige|bisque|black|blanchedalmond|blue|blueviolet|brown|burlywood|cadetblue|chartreuse|chocolate|coral|cornflowerblue|cornsilk|crimson|cyan|darkblue|darkcyan|darkgoldenrod|darkgray|darkgreen|darkkhaki|darkmagenta|darkolivegreen|darkorange|darkorchid|darkred|darksalmon|darkseagreen|darkslateblue|darkslategray|darkturquoise|darkviolet|deeppink|deepskyblue|dimgray|dodgerblue|firebrick|floralwhite|forestgreen|fuchsia|gainsboro|ghostwhite|gold|goldenrod|gray|green|greenyellow|honeydew|hotpink|indianred|indigo|ivory|khaki|lavender|lavenderblush|lawngreen|lemonchiffon|lightblue|lightcoral|lightcyan|lightgoldenrodyellow|lightgreen|lightgrey|lightpink|lightsalmon|lightseagreen|lightskyblue|lightslategray|lightsteelblue|lightyellow|lime|limegreen|linen|magenta|#008000|mediumaquamarine|mediumblue|mediumorchid|mediumpurple|mediumseagreen|mediumslateblue|mediumspringgreen|mediumturquoise|mediumvioletred|midnightblue|mintcream|mistyrose|moccasin|navajowhite|navy|oldlace|olive|olivedrab|orange|orangered|orchid|palegoldenrod|palegreen|paleturquoise|palevioletred|papayawhip|peachpuff|peru|pink|plum|powderblue|purple|red|rosybrown|royalblue|saddlebrown|salmon|sandybrown|seagreen|seashell|sienna|silver|skyblue|slateblue|slategray|snow|springgreen|steelblue|tan|teal|thistle|tomato|turquoise|violet|wheat|white|whitesmoke|yellow|yellowgreen|#[A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9])', 'style' => 'identifier', 'childregex' => [] } ] }, { 'name' => 'string', 'regex' => '\'.*?(\'|$)', 'style' => 'string', 'childregex' => [ { 'name' => 'colors', 'regex' => '(aliceblue|antiquewhite|aqua|aquamarine|azure|beige|bisque|black|blanchedalmond|blue|blueviolet|brown|burlywood|cadetblue|chartreuse|chocolate|coral|cornflowerblue|cornsilk|crimson|cyan|darkblue|darkcyan|darkgoldenrod|darkgray|darkgreen|darkkhaki|darkmagenta|darkolivegreen|darkorange|darkorchid|darkred|darksalmon|darkseagreen|darkslateblue|darkslategray|darkturquoise|darkviolet|deeppink|deepskyblue|dimgray|dodgerblue|firebrick|floralwhite|forestgreen|fuchsia|gainsboro|ghostwhite|gold|goldenrod|gray|green|greenyellow|honeydew|hotpink|indianred|indigo|ivory|khaki|lavender|lavenderblush|lawngreen|lemonchiffon|lightblue|lightcoral|lightcyan|lightgoldenrodyellow|lightgreen|lightgrey|lightpink|lightsalmon|lightseagreen|lightskyblue|lightslategray|lightsteelblue|lightyellow|lime|limegreen|linen|magenta|#008000|mediumaquamarine|mediumblue|mediumorchid|mediumpurple|mediumseagreen|mediumslateblue|mediumspringgreen|mediumturquoise|mediumvioletred|midnightblue|mintcream|mistyrose|moccasin|navajowhite|navy|oldlace|olive|olivedrab|orange|orangered|orchid|palegoldenrod|palegreen|paleturquoise|palevioletred|papayawhip|peachpuff|peru|pink|plum|powderblue|purple|red|rosybrown|royalblue|saddlebrown|salmon|sandybrown|seagreen|seashell|sienna|silver|skyblue|slateblue|slategray|snow|springgreen|steelblue|tan|teal|thistle|tomato|turquoise|violet|wheat|white|whitesmoke|yellow|yellowgreen|#[A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9])', 'style' => 'identifier', 'childregex' => [], } ] }, { 'name' => 'event capturing', 'regex' => '\\b(captureEvents|releaseEvents|routeEvent|handleEvent)\\b.*?(\\)|$)', 'style' => 'reserved word', 'childregex' => [] }, { 'name' => 'predefined methods', 'regex' => '\\b(abs|acos|alert|anchor|asin|atan|atan2|back|big|blink|blur|bold|ceil|charAt|clear|clearTimeout|click|close|confirm|cos|escape|eval|exp|fixed|floor|focus|fontcolor|fontsize|forward|getDate|getDay|getHours|getMinutes|getMonth|getSeconds|getTime|getTimezoneOffset|getYear|go|indexOf|isNaN|italics|javaEnabled|join|lastIndexOf|link|log|max|min|open|parse|parseFloat|parseInt|pow|prompt|random|reload|replace|reset|reverse|round|scroll|select|setDate|setHours|setMinutes|setMonth|setSeconds|setTimeout|setTime|setYear|sin|small|sort|split|sqrt|strike|sub|submit|substring|sup|taint|tan|toGMTString|toLocaleString|toLowerCase|toString|toUpperCase|unescape|untaint|UTC|write|writeln)\\b', 'style' => 'library function', 'childregex' => [] }, { 'name' => 'properties', 'regex' => '\\b(action|alinkColor|anchors|appCodeName|appName|appVersion|bgColor|border|checked|complete|cookie|defaultChecked|defaultSelected|defaultStatus|defaultValue|description|E|elements|enabledPlugin|encoding|fgColor|filename|forms|frames|hash|height|host|hostname|href|hspace|index|lastModified|length|linkColor|links|LN2|LN10|LOG2E|LOG10E|lowsrc|method|name|opener|options|parent|pathname|PI|port|protocol|prototype|referrer|search|selected|selectedIndex|self|SQRT1_2|SQRT2|src|status|target|text|title|top|type|URL|userAgent|value|vlinkColor|vspace|width|window)\\b', 'style' => 'predefined identifier', 'childregex' => [] }, { 'name' => 'operators', 'regex' => '([=;->/&|])', 'style' => 'symbol', 'childregex' => [] } ] }; $LANGUAGE{'js'} = $LANGUAGE{'javascript'}; # written by Andreas Krennmair # extremely incomplete $LANGUAGE{'lisp'} = { 'filename' => '\\.(lsp|l)$', 'regex' => '', 'patterns' => [ { 'name' => 'parens', 'regex' => '[()]', 'style' => 'braces', 'childregex' => [] }, { 'name' => 'comment', 'regex' => ';.*?$', 'style' => 'comment', 'childregex' => [] }, { 'name' => 'string', 'regex' => '".*?("|$)', 'style' => 'string', 'childregex' => [] }, { 'name' => 'keywords', 'regex' => '\\b(defun |xyz)\\b', 'style' => 'reserved word', 'childregex' => [] }, { 'name' => 'numeric constant', 'regex' => '(#\([0-9]+ [0-9]+\)|[0-9]+)', 'style' => 'numeric', 'childregex' => [] }, { 'name' => 'identifiers', 'regex' => '([-a-zA-Z]+)', 'style' => 'identifier', 'childregex' => [] } ] }; # written by JA $LANGUAGE{'m4'} = { 'filename' => '\\.m4$', 'regex' => '', 'patterns' => [ { 'regex' => 'dnl.*?$', 'style' => 'doc comment', 'childregex' => [] }, { 'regex' => '#.*?$', 'style' => 'comment', 'childregex' => [] }, { 'regex' => '\\b(define|undefine|defn|pushdef|popdef|indir|builtin|changequote|changecom|changeword|m4wrap|m4exit|include|sinclude|divert|undivert|divnum|cleardiv|shift|dumpdef|traceon|traceoff|debugfile|debugmode|len|index|regexp|substr|translit|patsubst|format|incr|decr|syscmd|esyscmd|sysval|maketemp|errprint)\\b', 'style' => 'reserved word', 'childregex' => [] }, { 'regex' => '\\b(ifdef|ifelse|loops)\\b', 'style' => 'reserved word', 'childregex' => [ { 'regex' => '[$]\\$?({[^}]*}|[^a-zA-Z0-9_/\\t\\n\\.,\\\\[\\\\{\\\\(]|[0-9]+|[a-zA-Z_][a-zA-Z0-9_]*)?', 'style' => 'identifier', 'childregex' => [] } ] } ] }; # taken from nedit # modified by PP $LANGUAGE{'make'} = { 'filename' => '[Mm]akefile.*', 'regex' => '', 'patterns' => [ { 'name' => 'Comment', 'regex' => '#.*?$', 'style' => 'comment', 'childregex' => [] }, { 'name' => 'Assignment', 'regex' => '^( *| [ \\t]*)[A-Za-z0-9_+]*[ \\t]*(\\+|:)?=', 'style' => 'assignment', 'childregex' => [] }, { 'name' => 'Dependency Line', 'regex' => '^ *([A-Za-z0-9./$(){} _%+-]|\\n)*::?', 'style' => 'dependency line', 'childregex' => [ { 'name' => 'Dependency Target', 'regex' => '[A-Za-z0-9./$(){} _%+-]+', 'style' => 'dependency target', 'childregex' => [] }, { 'name' => 'Dependency Continuation', 'regex' => '\\\\\\n', 'style' => 'dependency continuation', 'childregex' => [] }, { 'name' => 'comment', 'regex' => '#.*?$', 'style' => 'comment', 'childregex' => [] }, { 'name' => 'macro', 'regex' => '\\$([A-Za-z0-9_]|\\([^)]*\\)|{[^}]*})', 'style' => 'macro', 'childregex' => [] }, { 'name' => 'int macro', 'regex' => '\\$([<@*?%]|\\$@)', 'style' => 'int macro', 'childregex' => [] } ] }, { 'name' => 'Continuation', 'regex' => '\\\\$', 'style' => 'continuation', 'childregex' => [] }, { 'name' => 'Macro', 'regex' => '\\$([A-Za-z0-9_]|\\([^)]*\\)|{[^}]*})', 'style' => 'macro', 'childregex' => [] }, { 'name' => 'Internal Macro', 'regex' => '\\$([<@*?%]|\\$@)', 'style' => 'int macro', 'childregex' => [] }, { 'name' => 'Escaped $$$', 'regex' => '\\$\\$', 'style' => 'esc $$$', 'childregex' => [] }, { 'name' => 'Include', 'regex' => '^include[ \\t]', 'style' => 'include', 'childregex' => [] } ] }; $LANGUAGE{'makefile'} = $LANGUAGE{'make'}; # taken from nedit # modified by PP $LANGUAGE{'pas'} = { 'filename' => '(?i)\\.p(as)?$', 'regex' => '', 'patterns' => [ { 'name' => 'comment1 (* *)', 'regex' => '\\(\\*.*?\\*\\)', 'style' => 'comment', 'childregex' => [] }, { 'name' => 'comment2 { }', 'regex' => '\\{.*?\\}', 'style' => 'comment', 'childregex' => [] }, { 'name' => 'string', 'regex' => '\'.*?(\'|$)', 'style' => 'string', 'childregex' => [] }, { 'name' => 'preprocessor line', 'regex' => '^[ \\t]*#.*?$', 'style' => 'preprocessor', 'childregex' => [ { 'name' => 'comment1 (* *)', 'regex' => '\\(\\*.*?\\*\\)', 'style' => 'comment', 'childregex' => [] }, { 'name' => 'comment2 { }', 'regex' => '\\{.*?\\}', 'style' => 'comment', 'childregex' => [] } ] }, { 'name' => 'character constant', 'regex' => '\'.\'', 'style' => 'character', 'childregex' => [] }, { 'name' => 'numeric constant', 'regex' => '\\b((0(x|X)[0-9a-fA-F]*)|[0-9.]+((e|E)(\\+|-)?)?[0-9]*)(L|l|UL|ul|u|U|F|f)?\\b', 'style' => 'numeric', 'childregex' => [] }, { 'name' => 'storage and ops', 'regex' => '\\b(?i)(and|array|const|div|export|file|function|import|in|label|mod|module|nil|not|only|or|packed|pow|pragma|procedure|program|protected|qualified|record|restricted|set|type|var)\\b', 'style' => 'reserved word', 'childregex' => [] }, { 'name' => 'keywords', 'regex' => '\\b(?i)(begin|case|do|downto|else|end|for|goto|if|of|otherwise|repeat|then|to|until|while|with)\\b', 'style' => 'reserved word', 'childregex' => [] }, { 'name' => 'sumbols', 'regex' => '([\\*\\-\\+=:;<>\\(\\)\\[\\]!]|[^/]/[^/])', 'style' => 'symbol', 'childregex' => [] }, { 'name' => 'identifiers', 'regex' => '([a-zA-Z_][a-zA-Z_0-9.^]*[a-zA-Z_0-9]|[a-zA-Z_][a-zA-Z_0-9]*)', 'style' => 'identifier', 'childregex' => [ { 'regex' => '(\\.|\\^)+', 'style' => 'symbol', 'childregex' => [] } ] } ], }; $LANGUAGE{'pascal'} = $LANGUAGE{'pas'}; # taken from nedit # modified by PP # modified by BS # modified by JD # modified by JP $LANGUAGE{'perl'} = { 'filename' => '(?i)\\.p([lm5]|od)$', 'regex' => '^\\s*#\\s*![^\\s]*perl', 'patterns' => [ { 'name' => 'comment', 'regex' => '(?:#.*?(?:\r?\n\s*)+)+', 'style' => 'comment', 'childregex' => [] }, { 'name' => 'variables', 'regex' => '[\\$@%]\\$?(?:{[^}]*}|[^a-zA-Z0-9_/\\t\\n\\.,\\\\[\\\\{\\\\(]|[0-9]+|[a-zA-Z_][a-zA-Z0-9_]*)?', 'style' => 'identifier', 'childregex' => [] }, { 'name' => '"" string', 'regex' => '""|".*?([^\\\\](\\\\\\\\)*)"|"\\\\\\\\"', # 'regex' => '""|"\\\\\\\\"|"[^"\\\\]"|"[^"].*?[^\\\\]"', 'style' => 'string', 'childregex' => [ { 'name' => 'esc character', 'regex' => '\\\\.', 'style' => 'esc character', 'childregex' => [] }, { 'name' => 'variables', 'regex' => '[\\$@%]\\$?(?:{[^}]*}|[^a-zA-Z0-9_/\\t\\n\\.,\\\\[\\\\{\\\\(]|[0-9]+|[a-zA-Z_][a-zA-Z0-9_]*)?', 'style' => 'identifier', 'childregex' => [] } ] }, { 'name' => '\'\' string', 'regex' => '\'\'|\'.*?([^\\\\](\\\\\\\\)*)\'|\'\\\\\\\\\'', # 'regex' => '\'\'|\'\\\\\\\\\'|\'[^\'\\\\]\'|\'[^\'].*?[^\\\\]\'', 'style' => 'string', 'childregex' => [ { 'name' => 'esc character', 'regex' => '\\\\.', 'style' => 'esc character', 'childregex' => [] } ] }, { 'name' => 'more strings - q// qw//', 'regex' => '(?:\\b| )(?:q|qw)([^\w\s])(?:\\\\\\2|[^\\2\\n])*\\2', 'style' => 'string', 'childregex' => [ { 'name' => 'esc character', 'regex' => '\\\\.', 'style' => 'esc character', 'childregex' => [] } ] }, { 'name' => 'more strings - qq// qx//', 'regex' => '(?:\\b| )(?:qq|qx)([^\w\s])(?:\\\\\\2|[^\\2\\n])*\\2', 'style' => 'string', 'childregex' => [ { 'name' => 'esc character', 'regex' => '\\\\.', 'style' => 'esc character', 'childregex' => [] }, { 'name' => 'variables', 'regex' => '[\\$@%]\\$?(?:{[^}]*}|[^a-zA-Z0-9_/\\t\\n\\.,\\\\[\\\\{\\\\(]|[0-9]+|[a-zA-Z_][a-zA-Z0-9_]*)?', 'style' => 'identifier', 'childregex' => [] } ] }, { 'name' => 'subroutine header', 'regex' => 'sub[\\t ]+(?:[a-zA-Z0-9_]+)[\\t \\n]*(?:\\{|\\(|\\n)', 'style' => 'function header', 'childregex' => [ { 'name' => 'subroutine header coloring', 'regex' => '[\\t ][a-zA-Z0-9_]+', 'style' => 'function header name', 'childregex' => [] } ] }, { 'name' => 'regex matching I', 'regex' => '(?:\\b| )?(?:/(?:\\\\/|[^/\\n])*(?:/[gimesox]*)|s([^\w\s])(?:\\\\\\2|[^\\2\\n])*?(\\2)[^(\\2)\\n]*?(\\2[gimesox]*))', 'style' => 'regex', 'childregex' => [] }, { 'name' => 'regex matching II', 'regex' => '(?:\\b| )(?:m|qq?|tr|y)([^\w\s])(?:\\\\\\2|[^\\2\\n])*(?:\\2[gimesox]*)', 'style' => 'regex', 'childregex' => [] }, { 'name' => 'keywords', 'regex' => '\\b(my|local|new|if|until|while|elsif|else|eval|unless|for|foreach|continue|exit|die|last|goto|next|redo|return|local|exec|do|use|require|package|eval|BEGIN|END|eq|ne|not|\\|\\||\\&\\&|and|or)\\b', 'style' => 'reserved word', 'childregex' => [] }, { 'name' => 'library functions', 'regex' => '\\b(?:a(?:bs|ccept|larm|tan2)|b(?:ind|inmode|less)|c(?:aller|hdir|hmod|homp|hop|hr|hroot|hown|losedir|lose|onnect|os|rypt)|d(?:bmclose|bmopen|efined|elete|ie|ump)|e(?:ach|nd(?:grent|hostent|netent|protoent|pwent|servent)|of|xec|xists|xp)|f(?:ctnl|ileno|lock|ork|ormat|ormline)|g(?:et(?:c|grent|grgid|grnam|hostbyaddr|hostbyname|hostent|login|netbyaddr|netbyname|netent|peername|pgrp|ppid|priority|protobyname|protobynumber|protoent|pwent|pwnam|pwuid|servbyname|servbyport|servent|sockname|sockopt)|lob|mtime|rep)|hex|i(?:mport|ndex|nt|octl)|join|keys|kill|l(?:cfirst|c|ength|ink|isten|og|ocaltime|stat)|m(?:ap|kdir|sgctl|sgget|sgrcv)|no|o(?:ct|pendir|pen|rd)|p(?:ack|ipe|op|os|rintf|rint|ush)|quotemeta|r(?:and|eaddir|ead|eadlink|ecv|ef|ename|eset|everse|ewinddir|index|mdir)|s(?:calar|eekdir|eek|elect|emctl|emget|emop|end|et(?:grent|hostent|netent|pgrp|priority|protoent|pwent|sockopt)|hift|hmctl|hmget|hmread|hmwrite|hutdown|in|leep|ocket|ocketpair|ort|plice|plit|printf|qrt|rand|tat|tudy|ubstr|ymlink|yscall|ysopen|ysread|ystem|yswrite)|t(?:elldir|ell|ie|ied|ime|imes|runcate)|u(?:c|cfirst|mask|ndef|nlink|npack|nshift|ntie|time)|values|vec|w(?:ait|aitpid|antarray|arn|rite)|qw|-[rwxoRWXOezsfdlpSbctugkTBMAC])\\b', 'style' => 'library function', 'childregex' => [] }, { 'name' => 'braces, parens and brakets', 'regex' => '[\\[\\]\\{\\}\\(\\)]', 'style' => 'braces', 'childregex' => [] }, { 'name' => '<< stuff', 'regex' => '<<(?:("|\')([^\\n]*)\\2|\\w*).*?^\\3$', 'style' => 'text', 'childregex' => [] }, { 'name' => 'POD', 'regex' => '^=.*?^(?:=cut|\\Z)', 'style' => 'doc comment', 'childregex' => [] } ] }; # Thanks to Matt Giwer $LANGUAGE{'pov'} = { 'filename' => '(?i)\\.pov$', 'regex' => '', 'patterns' => [ { 'name' => 'doc comment', 'regex' => '/\\*\\*.*?\\*/', 'style' => 'doc comment', 'childregex' => [] }, { 'name' => 'comment', 'regex' => '/\\*.*?\\*/', 'style' => 'comment', 'childregex' => [] }, { 'name' => 'cplus comment', 'regex' => '//.*?$', 'style' => 'comment', 'childregex' => [] }, { 'name' => 'string', 'regex' => '""|".*?([^\\\\](\\\\\\\\)*)"|"\\\\\\\\"', # 'regex' => '""|"\\\\\\\\"|"[^"\\\\]"|"[^"].*?[^\\\\]"', 'style' => 'string', 'childregex' => [ { 'name' => 'esc character', 'regex' => '\\\\.', 'style' => 'esc character', 'childregex' => [] } ] }, { 'name' => 'preprocessor line', 'regex' => '^[ \\t]*#.*?$', 'style' => 'preprocessor', 'childregex' => [ { 'name' => 'string', 'regex' => '""|".*?([^\\\\](\\\\\\\\)*)"|"\\\\\\\\"', # 'regex' => '""|"\\\\\\\\"|"[^"\\\\]"|"[^"].*?[^\\\\]"', 'style' => 'string', 'childregex' => [ { 'name' => 'esc character', 'regex' => '\\\\.', 'style' => 'esc character', 'childregex' => [] } ] }, { 'name' => '', 'regex' => '<.*?>', 'style' => 'string', 'childregex' => [] }, { 'name' => 'comment', 'regex' => '[^/]/\\*.*?\\*/', 'style' => 'comment', 'childregex' => [] }, { 'name' => 'cplus comment', 'regex' => '//.*?$', 'style' => 'comment', 'childregex' => [] } ] }, { 'name' => 'character constant', 'regex' => '\'(\\\\)?.\'', 'style' => 'character', 'childregex' => [ { 'name' => 'esc character', 'regex' => '\\\\.', 'style' => 'esc character', 'childregex' => [] } ] }, { 'name' => 'numeric constant', 'regex' => '\\b((0(x|X)[0-9a-fA-F]*)|(([0-9]+\\.?[0-9]*)|(\\.[0-9]+))((e|E)(\\+|-)?[0-9]+)?)(L|l|UL|ul|u|U|F|f)?\\b', 'style' => 'numeric', 'childregex' => [] }, { 'name' => 'keyword', 'regex' => '\\b(abs|absorption|acos|acosh|adaptive|adc_bailout|agate|agate_turb|all|alpha|ambient|ambient_light|angle|aperture|append|arc_angle|area_light|array|asc|asin|asinh|assumed_gamma|atan|atan2|atanh|average|background|bezier_spline|bicubic_patch|black_hole|blob|blue|blur_samples|bounded_by|box|boxed|bozo|break|brick|brick_size|brightness|brilliance|bumps|bump_map|bump_size|camera|case|caustics|ceil|checker|chr|clipped_by|clock|clock_delta|color|color_map|colour|colour_map|component|composite|concat|cone|confidence|conic_sweep|control0|control1|cos|cosh|count|crackle|crand|cube|cubic|cubic_spline|cubic_wave|cylinder|cylindrical|debug|declare|default|defined|degrees|density|density_file|density_map|dents|difference|diffuse|dimensions|dimension_size|direction|disc|distance|distance_maximum|div|eccentricity|else|emission|end|error|error_bound|exp|extinction|fade_distance|fade_power|falloff|falloff_angle|false|fclose|file_exists|filter|finish|fisheye|flatness|flip|floor|focal_point|fog|fog_alt|fog_offset|fog_type|fopen|frequency|gif|global_settings|gradient|granite|gray_threshold|green|height_field|hexagon|hf_gray_16|hierarchy|hollow|hypercomplex|if|ifdef|iff|ifndef|image_map|include|int|interior|interpolate|intersection|intervals|inverse|ior|irid|irid_wavelength|jitter|julia_fractal|lambda|lathe|leopard|light_source|linear_spline|linear_sweep|local|location|log|looks_like|look_at|low_error_factor|macro|mandel|map_type|marble|material|material_map|matrix|max|max_intersections|max_iteration|max_trace_level|media|media_attenuation|media_interaction|merge|mesh|metallic|min|minimum_reuse|mod|mortar|nearest_count|no|normal|normal_map|no_shadow|number_of_waves|object|octaves|off|offset|omega|omnimax|on|once|onion|open|orthographic|panoramic|perspective|pgm|phase|phong|phong_size|pi|pigment|pigment_map|planar|plane|png|point_at|poly|polygon|poly_wave|pot|pow|ppm|precision|prism|pwr|quadratic_spline|quadric|quartic|quaternion|quick_color|quick_colour|quilted|radial|radians|radiosity|radius|rainbow|ramp_wave|rand|range|ratio|read|reciprocal|recursion_limit|red|reflection|reflection_exponent|refraction|render|repeat|rgb|rgbf|rgbft|rgbt|right|ripples|rotate|roughness|samples|scale|scallop_wave|scattering|seed|shadowless|sin|sine_wave|sinh|sky|sky_sphere|slice|slope_map|smooth|smooth_triangle|sor|specular|sphere|spherical|spiral1|spiral2|spotlight|spotted|sqr|sqrt|statistics|str|strcmp|strength|strlen|strlwr|strupr|sturm|substr|superellipsoid|switch|sys|t|tan|tanh|text|texture|texture_map|tga|thickness|threshold|tightness|tile2|tiles|torus|track|transform|translate|transmit|triangle|triangle_wave|true|ttf|turbulence|turb_depth|type|u|ultra_wide_angle|undef|union|up|use_color|use_colour|use_index|u_steps|v|val|variance|vaxis_rotate|vcross|vdot|version|vlength|vnormalize|vrotate|v_steps|warning|warp|water_level|waves|while|width|wood|wrinkles|write|x|y|yes|z)\\b', 'style' => 'reserved word', 'childregex' => [] }, { 'name' => 'braces', 'regex' => '[\\{\\}]', 'style' => 'braces', 'childregex' => [] }, { 'name' => 'symbols', 'regex' => '([\\*\\-\\+=:;%&\\|<>\\(\\)\\[\\]!])', 'style' => 'symbol', 'childregex' => [] }, { 'name' => 'identifiers', 'regex' => '([a-zA-Z_][a-zA-Z_0-9]*)', 'style' => 'identifier', 'childregex' => [] } ] }; $LANGUAGE{'povray'} = $LANGUAGE{'pov'}; # by Tom Good $LANGUAGE{'python'} = { 'filename' => '(?i)\\.py$', 'regex' => '^\\s*#\\s*![^\\s]*python', 'patterns' => [ { 'name' => 'python comment', 'regex' => '#.*?$', 'style' => 'comment', 'childregex' => [] }, { 'name' => 'single quote string', 'regex' => '\'.*?\'', 'style' => 'string', 'childregex' => [] }, { 'name' => 'string', 'regex' => '""|"\\\\\\\\"|".*?([^\\\\](\\\\\\\\)*)"', 'regex' => '""|".*?([^\\\\](\\\\\\\\)*)"|"\\\\\\\\"', 'regex' => '""|"\\\\\\\\"|"[^"\\\\]"|"[^"].*?[^\\\\]"', 'style' => 'string', 'childregex' => [ { 'name' => 'esc character', 'regex' => '\\\\.', 'style' => 'esc character', 'childregex' => [] } ] }, { 'name' => 'character constant', 'regex' => '\'(\\\\)?.\'', 'style' => 'character', 'childregex' => [ { 'name' => 'esc character', 'regex' => '\\\\.', 'style' => 'esc character', 'childregex' => [] } ] }, { 'name' => 'numeric constant', 'regex' => '\\b((0(x|X)[0-9a-fA-F]*)|(([0-9]+\\.?[0-9]*)|(\\.[0-9]+))((e|E)(\\+|-)?[0-9]+)?)(L|l|UL|ul|u|U|F|f)?\\b', 'style' => 'numeric', 'childregex' => [] }, { 'name' => 'keyword', 'regex' => '\\b(and|assert|break|class|continue|del|elif|else|except|exec|finally|for|from|global|if|import|in|is|lambda|not|or|pass|print|raise|return|try|while)\\b', 'style' => 'reserved word', 'childregex' => [] }, { 'name' => 'braces', 'regex' => '[\\{\\}]', 'style' => 'braces', 'childregex' => [] }, { 'name' => 'symbols', 'regex' => '([\\*\\-\\+=:;%&\\|<>\\(\\)\\[\\]!])', 'style' => 'symbol', 'childregex' => [] }, { 'name' => 'identifiers', 'regex' => '([a-zA-Z_][a-zA-Z_0-9]*)', 'style' => 'identifier', 'childregex' => [] }, { 'name' => 'function', 'regex' => '[\\t ]*def[\\t ]+([a-zA-Z0-9_]+)[\\t \\(]+.*?[\\n{]', 'style' => 'function header', 'childregex' => [ { 'name' => 'function args', 'regex' => '\\(.*?\\)', 'style' => 'function header args', 'childregex' => [] }, { 'name' => 'function name', 'regex' => '[\\t ][a-zA-Z0-9_]+', 'style' => 'function header name', 'childregex' => [] } ] }, { 'name' => 'library functions', 'regex' => '\\b(__import__|abs|apply|buffer|callable|chr|cmp|coerce|compile|complex|delatter|dir|divmod|eval|execfile|filter|float|getattr|globals|hasattr|hash|hex|id|input|int|intern|isinstance|issubclass|len|list|locals|long|map|max|min|oct|open|ord|pow|range|raw_input|reduce|reload|repr|round|setattr|slice|str|tuple|type|unichr|unicode|vars|xrange|zip)\\b', 'style' => 'library function', 'childregex' => [] }, ] }; # by Joshua Swink $LANGUAGE{'ruby'} = { 'filename' => '\\.rb$', 'regex' => '^\\s*#\\s*![^\\s]*\\bruby\\b', 'patterns' => [ { 'name' => 'comment', 'regex' => '(?:#.*?(?:\r?\n\s*)+)+', 'style' => 'comment', 'childregex' => [] }, { 'name' => 'predefined variables', 'regex' => '(?:\\$(?:[!@&`\'+\\d~=/\\\\,;.<>_*\\$?:"]|DEBUG|FILENAME|LOAD_PATH|stdin|stdout|stderr|VERBOSE|-[0adFiIlpv])|\\b(?:TRUE|FALSE|NIL|STDIN|STDOUT|STDERR|ENV|ARGF|ARGV|DATA|RUBY_VERSION|RUBY_RELEASE_DATE|RUBY_PLATFORM)\\b)', 'style' => 'predefined identifier', 'childregex' => [] }, { 'name' => 'variables', 'regex' => '[\\$@](?:{[^}]*}|[^\\w/\\t\\n\\.,\\\\[\\\\{\\\\(]|[0-9]+|[a-zA-Z_][\\w.]*)?', 'style' => 'identifier', 'childregex' => [] }, { 'name' => '"" string', 'regex' => '""|"(?:\\\\\\\\)+"|".*?(?:[^\\\\](?:\\\\\\\\)*)"|%[Qwx]?([^\\w\\[\\](){}<>])\\2|%[Qwx]?([^\\w\\[\\](){}<>]).*?(?:[^\\\\](?:\\\\\\\\)*)\\3|%[Qwx]?([^\\w\\[\\](){}<>])\\\\\\\\\\4|%[Qwx]?\\[\\]|%[Qwx]?\\[.*?([^\\\\](\\\\\\\\)*)\\]|%[Qwx]?\\[\\\\\\\\\\]|%[Qwx]?\\{\\}|%[Qwx]?\\{.*?([^\\\\](\\\\\\\\)*)\\}|%[Qwx]?\\{\\\\\\\\\\}|%[Qwx]?\\(\\)|%[Qwx]?\\(.*?([^\\\\](\\\\\\\\)*)\\)|%[Qwx]?\\(\\\\\\\\\\)|%[Qwx]?<>|%[Qwx]?<.*?([^\\\\](\\\\\\\\)*)>|%[Qwx]?<\\\\\\\\>', 'style' => 'string', 'childregex' => [ { 'name' => 'esc character', 'regex', => '\\\\(?:x[\\da-fA-F]{2}|\d\d\d|c.|M-\\\\C-.|M-.|C-.|.)', 'style' => 'esc character', 'childregex' => [] }, { 'name' => 'string expression', 'regex' => '#[\\$\\@][a-zA-Z_][\\w.]*|#\\{[\\$\\@]?[^\\}]*\\}', 'style' => 'identifier', 'childregex' => [] } ] }, { 'name' => '\'\' string', 'regex' => '\'\'|\'(?:\\\\\\\\)+\'|\'.*?(?:[^\\\\](?:\\\\\\\\)*)\'|%q([^\\w\\[\\](){}<>])\\2|%q([^\\w\\[\\](){}<>]).*?(?:[^\\\\](?:\\\\\\\\)*)\\3|%q([^\\w\\[\\](){}<>])\\\\\\\\\\4|%q\\[\\]|%q\\[.*?([^\\\\](\\\\\\\\)*)\\]|%q\\[\\\\\\\\\\]|%q\\{\\}|%q\\{.*?([^\\\\](\\\\\\\\)*)\\}|%q\\{\\\\\\\\\\}|%q\\(\\)|%q\\(.*?([^\\\\](\\\\\\\\)*)\\)|%q\\(\\\\\\\\\\)|%q<>|%q<.*?([^\\\\](\\\\\\\\)*)>|%q<\\\\\\\\>', 'style' => 'string', 'childregex' => [ { 'name' => 'esc character', 'regex' => '(?:\\\\\'|\\\\\\\\)', 'style' => 'esc character', 'childregex' => [] } ] }, { 'name' => 'subroutine header', 'regex' => 'def[\\t ]+\\w[\\w.]*(?:\\([^)]*\\))?', 'style' => 'function header', 'childregex' => [ { 'name' => 'arg list', 'regex' => '\\(.*\\)', 'style' => 'function header args', 'childregex' => [ { 'name' => 'arg list parens', 'regex' => '[\\(\\)]', 'style' => 'symbol', 'childregex' => [] } ] }, { 'name' => 'subroutine header', 'regex' => '[\\t ]\w+', 'style' => 'function header name', 'childregex' => [] } ] }, { 'name' => 'class header', 'regex' => 'class[\\t ]+\\w+(?:\\s*<\\s*\\w+)?', 'style' => 'function header', 'childregex' => [ { 'name' => 'class ancestor', 'regex' => '<\\s*\\w+', 'style' => 'include', 'childregex' => [ { 'name' => 'inheritance doohickey', 'regex' => '<', 'style' => 'symbol', 'childregex' => [] } ] }, { 'name' => 'class main', 'regex' => '[\\t ]\\w+', 'style' => 'type', 'childregex' => [] } ] }, { 'name' => 'regex matching 0', 'regex' => '(?:%r([^\\w\\[\\](){}<>])\\2|%r([^\\w\\[\\](){}<>]).*?(?:[^\\\\](?:\\\\\\\\)*)\\3|%r([^\\w\\[\\](){}<>])\\\\\\\\\\4|%r\\[\\]|%r\\[.*?([^\\\\](\\\\\\\\)*)\\]|%r\\[\\\\\\\\\\]|%r\\{\\}|%r\\{.*?([^\\\\](\\\\\\\\)*)\\}|%r\\{\\\\\\\\\\}|%r\\(\\)|%r\\(.*?([^\\\\](\\\\\\\\)*)\\)|%r\\(\\\\\\\\\\)|%r<>|%r<.*?([^\\\\](\\\\\\\\)*)>|%r<\\\\\\\\>)[ixpno]*', 'style' => 'regex', 'childregex' => [ { 'name' => 'string expression', 'regex' => '#[\\$\\@][a-zA-Z_][\\w.]*|#\\{[\\$\\@]?[a-zA-Z_][^\\}]*\\}', 'style' => 'identifier', 'childregex' => [] } ] }, { 'name' => 'regex matching I', 'regex' => '(?:\\b| )?(?:/(?:\\\\/|[^/\\n])*(?:/[ixpno]*))', 'style' => 'regex', 'childregex' => [ { 'name' => 'string expression', 'regex' => '#[\\$\\@][a-zA-Z_][\\w.]*|#\\{[\\$\\@]?[a-zA-Z_][^\\}]*\\}', 'style' => 'identifier', 'childregex' => [] } ] }, { 'name' => 'reserved words', 'regex' => '\\b(BEGIN|class|ensure|nil|self|when|END|def|false|not|super|while|alias|defined|for|or|then|yield|and|do|if|redo|true|begin|else|in|rescue|undef|break|elsif|module|retry|unless|case|end|next|return|until)\\b', 'style' => 'reserved word', 'childregex' => [] }, { 'name' => 'kernel module methods', 'regex', => '\\b(Array|Float|Integer|String|at_exit|autoload|binding|caller|catch|chop|chomp|chomp!|eval|exec|exit|fail|fork|format|gets|global_variables|gsub|iterator|lambda|load|local_variables|loop|open|p|print|printf|proc|putc|puts|raise|rand|readline|readlines|require|select|sleep|split|sprintf|srand|sub|syscall|system|test|trace_var|trap|untrace_var)\\b', 'style' => 'library function', 'childregex' => [] }, { 'name' => 'braces, parens and brakets', 'regex' => '[\\[\\]\\{\\}\\(\\)]', 'style' => 'braces', 'childregex' => [] }, { 'name' => '<< stuff', 'regex' => '<<(?:("|\')([^\\n]*)\\2|\\w*).*?^\\3$', 'style' => 'text', 'childregex' => [] }, { 'name' => 'symbols', 'regex' => '(?:[:*-+<>=^!,/]+|\.\.+)', 'style' => 'symbol', 'childregex' => [] }, { 'name' => 'numbers', 'regex' => '\d[\d.]*', 'style' => 'numeric', 'childregex' => [] }, { 'name' => 'embedded documentation', 'regex' => '^=.*?^(?:=end|\\Z)', 'style' => 'doc comment', 'childregex' => [] } ] }; # taken from nedit # modified by PP # very inclomplete! $LANGUAGE{'sql'} = { 'filename' => '(?i)\\.sql$', 'regex' => '', 'patterns' => [ { 'name' => 'keywords I', 'regex' => '(?i)(,|%|<|>|:=|=|\\(|\\)|\\bselect|on|from|order by|desc|where|and|or|not|null|true|false)\\b', 'style' => 'reserved word', 'childregex' => [] }, { 'name' => 'comment I', 'regex' => '--.*?$', 'style' => 'comment', 'childregex' => [] }, { 'name' => 'comment II', 'regex' => '/\\*.*?\\*/', 'style' => 'comment', 'childregex' => [] }, { 'name' => 'string', 'regex' => '\'\'|\'.*?([^\\\\](\\\\\\\\)*)\'|\'\\\\\\\\\'', # 'regex' => '(\'\'|\'[^\'\\\\]\'|\'[^\'].*?[^\\\\]\')', 'style' => 'string', 'childregex' => [] }, { 'name' => 'keywords II', 'regex' => '(?i)end if;|\\b(create|replace|begin|end|function|return|fetch|open|close|into|is|in|when|others|grant|on|to|exception|show|set|out|pragma|as|package)\\b', 'style' => 'reserved word', 'childregex' => [] }, { 'name' => 'keywords III', 'regex' => '(?i)\\balter\\b', 'style' => 'reserved word', 'childregex' => [] }, { 'name' => 'datatypes', 'regex' => '(?i)\\b(integer|blol|date|numeric|character|varying|varchar|char)\\b', 'style' => 'predefined type', 'childregex' => [] }, { 'name' => 'words', 'regex' => '(?i)\\b(constraint|key|references|primary|table|foreign|add|insert|group by)\\b', 'style' => 'reserved word', 'childregex' => [] } ] }; $LANGUAGE{'patch'} = { 'filename' => '(?i)\\.patch$|\\.diff$', 'regex' => '', 'patterns' => [ { 'name' => 'header', 'regex' => '^Index: .*?$|^===== .*?$|^diff .*?$|^--- .*?$|^\+\+\+ .*?$', 'style' => 'separator', 'childregex' => [] }, { 'name' => 'hunk', 'regex' => '^@@ .*?$', 'style' => 'line spec', 'childregex' => [] }, { 'name' => 'from', 'regex' => '^-.*?$', 'style' => 'deletion', 'childregex' => [] }, { 'name' => 'to', 'regex' => '^\+.*?$', 'style' => 'insertion', 'childregex' => [] } ] }; ##### # # LANGUAGE: shell script # $LANGUAGE{'shellscript'} = { 'filename' => '\\.(sh|shell)$', 'regex' => '^\\s*#\\s*![^\\s]*(sh|bash|ash|zsh|ksh)', 'patterns' => [ { 'name' => 'comment', # 'regex' => '^[ \t]*[^$]?\#[^!]?.*?$', 'regex' => '(^| )#([^\\!].)*?$', 'style' => 'comment', 'childregex' => [] }, { 'name' => 'identifier', 'regex' => '[a-zA-Z][a-zA-Z0-9_]*=', 'style' => '', 'childregex' => [ { 'name' => 'identifier', 'regex' => '[a-zA-Z][a-zA-Z0-9_]*', 'style' => 'identifier', 'childregex' => [] } ] }, { 'name' => 'identifier', 'regex' => '\\$([0-9#\\*]|[a-zA-Z][a-zA-Z0-9_]*)', 'style' => 'identifier', 'childregex' => [] }, { 'name' => 'interpreter line', 'regex' => '^[ \t]*#!.*?$', 'style' => 'preprocessor', childregex => [] }, { 'name' => 'string', 'regex' => '""|"(\\\\"|[^\\"])*"', 'style' => 'string', childregex => [ { 'name' => 'identifier', 'regex' => '\\$([0-9#\\*]|[a-zA-Z][a-zA-Z0-9_]*)', 'style' => 'identifier', 'childregex' => [] } ] } ] }; $LANGUAGE{'sh'} = $LANGUAGE{'shellscript'}; return \%LANGUAGE; }; hypre-2.33.0/src/examples/docs/ex1.htm000066400000000000000000000010331477326011500174750ustar00rootroot00000000000000

Example 1

This is a two processor example. Each processor owns one box in the grid. For reference, the two grid boxes are those in the example diagram in the struct interface chapter of the User's Manual. Note that in this example code, we have used the two boxes shown in the diagram as belonging to processor 0 (and given one box to each processor). The solver is PCG with no preconditioner.

We recommend viewing examples 1-4 sequentially for a nice overview/tutorial of the struct interface. hypre-2.33.0/src/examples/docs/ex10.htm000066400000000000000000000010771477326011500175650ustar00rootroot00000000000000

Example 10

This code solves a system corresponding to a discretization of the Laplace equation with zero boundary conditions on the unit square. The domain is split into a n x n grid of quadrilateral elements and each processors owns a horizontal strip of size m x n, where m = n/nprocs. We use bilinear finite element discretization, so there are nodes (vertices) that are shared between neighboring processors. The Finite Element Interface is used to assemble the matrix and solve the problem. Nine different solvers are available. hypre-2.33.0/src/examples/docs/ex11.htm000066400000000000000000000005621477326011500175640ustar00rootroot00000000000000

Example 11

This example solves the 2-D Laplacian eigenvalue problem with zero boundary conditions on an nxn grid. The number of unknowns is N=n^2. The standard 5-point stencil is used, and we solve for the interior nodes only.

We use the same matrix as in Examples 3 and 5. The eigensolver is LOBPCG with AMG preconditioner. hypre-2.33.0/src/examples/docs/ex12.htm000066400000000000000000000010511477326011500175570ustar00rootroot00000000000000

Example 12

The grid layout is the same as ex1, but with nodal unknowns. The solver is PCG preconditioned with either PFMG or BoomerAMG, selected on the command line.

We recommend viewing the Struct examples before viewing this and the other SStruct examples. This is one of the simplest SStruct examples, used primarily to demonstrate how to set up non-cell-centered problems, and to demonstrate how easy it is to switch between structured solvers (PFMG) and solvers designed for more general settings (AMG). hypre-2.33.0/src/examples/docs/ex12f.htm000066400000000000000000000010571477326011500177330ustar00rootroot00000000000000

Example 12 (Fortran version)

The grid layout is the same as ex1, but with nodal unknowns. The solver is PCG preconditioned with either PFMG or BoomerAMG, set in the code.

We recommend viewing the Struct examples before viewing this and the other SStruct examples. This is one of the simplest SStruct examples, used primarily to demonstrate how to set up non-cell-centered problems, and to demonstrate how easy it is to switch between structured solvers (PFMG) and solvers designed for more general settings (AMG). hypre-2.33.0/src/examples/docs/ex13.htm000066400000000000000000000033401477326011500175630ustar00rootroot00000000000000

Example 13

This code solves the 2D Laplace equation using bilinear finite element discretization on a mesh with an "enhanced connectivity" point. Specifically, we solve -Delta u = 1 with zero boundary conditions on a star-shaped domain consisting of identical rhombic parts each meshed with a uniform n x n grid. Every part is assigned to a different processor and all parts meet at the origin, equally subdividing the 2*pi angle there. The case of six processors (parts) looks as follows:

                                    +
                                   / \
                                  /   \
                                 /     \
                       +--------+   1   +---------+
                        \        \     /         /
                         \    2   \   /    0    /
                          \        \ /         /
                           +--------+---------+
                          /        / \         \
                         /    3   /   \    5    \
                        /        /     \         \
                       +--------+   4   +---------+
                                 \     /
                                  \   /
                                   \ /
                                    +

Note that in this problem we use nodal variables, which will be shared between the different parts, so the node at the origin, for example, will belong to all parts.

We recommend viewing the Struct examples before viewing this and the other SStruct examples. The primary role of this particular SStruct example is to demonstrate how to set up non-cell-centered problems, and specifically problems with an "enhanced connectivity" point. hypre-2.33.0/src/examples/docs/ex14.htm000066400000000000000000000005131477326011500175630ustar00rootroot00000000000000

Example 14

This is a version of Example 13, which uses the SStruct FEM input functions instead of stencils to describe a problem on a mesh with an "enhanced connectivity" point. This is the recommended way to set up a finite element problem in the SStruct interface. hypre-2.33.0/src/examples/docs/ex15.htm000066400000000000000000000023141477326011500175650ustar00rootroot00000000000000

Example 15

This code solves a 3D electromagnetic diffusion (definite curl-curl) problem using the lowest order Nedelec, or "edge" finite element discretization on a uniform hexahedral meshing of the unit cube. The right-side corresponds to a unit force and we use uniform zero Dirichlet boundary conditions. The overall problem reads: curl alpha curl E + beta E = 1, with E x n = 0 on the boundary, where alpha and beta are piecewise-constant material coefficients.

The linear system is split in parallel using the SStruct interface with a n x n x n grid on each processors. Note that, the number of processors should therefore be a perfect cube!

This code is mainly meant as an illustration of using the Auxiliary-space Maxwell Solver (AMS) through the SStruct interface. It uses two grids -- one for the nodal and one for the edge variables, and we show how to constructs the rectangular "discrete gradient" matrix that connects them. Finally, this is also an example of setting up a finite element discretization in the SStruct interface, and we recommend viewing Example 13 and Example 14 before viewing this example. hypre-2.33.0/src/examples/docs/ex15big.htm000066400000000000000000000012761477326011500202550ustar00rootroot00000000000000

Example 15 (64-bit version)

This example is a slight modification of Example 15 that illustrates the 64-bit integer support in hypre needed to run problems with more than 2B unknowns.

Specifically, the changes compared to Example 15 are as follows:

  1. All integer arguments to HYPRE functions should be declared of type HYPRE_Int.
  2. Variables of type HYPRE_Int are 64-bit integers, so they should be printed in the %lld format (not %d).

To enable the 64-bit integer support, you need to build hypre with the --enable-bigint option of the configure script. We recommend comparing this example with Example 15. hypre-2.33.0/src/examples/docs/ex16.htm000066400000000000000000000006271477326011500175730ustar00rootroot00000000000000

Example 16

This code solves the 2D Laplace equation using a high order Q3 finite element discretization. Specifically, we solve -Delta u = 1 with zero boundary conditions on a unit square domain meshed with a uniform grid. The mesh is distributed across an N x N process grid, with each processor containing an n x n sub-mesh of data, so the global mesh is nN x nN. hypre-2.33.0/src/examples/docs/ex2.htm000066400000000000000000000007031477326011500175010ustar00rootroot00000000000000

Example 2

This is a two processor example and is similar to the previous structured interface example (Example 1). However, in this case the grid boxes are exactly those in the example diagram in the struct interface chapter of the User's Manual. (Processor 0 owns two boxes and processor 1 owns one box.) The solver is PCG with SMG preconditioner.

We recommend viewing example 1 before viewing this example. hypre-2.33.0/src/examples/docs/ex3.htm000066400000000000000000000022761477326011500175110ustar00rootroot00000000000000

Example 3

This code solves a system corresponding to a discretization of the Laplace equation with zero boundary conditions on the unit square. The domain is split into an N x N processor grid. Thus, the given number of processors should be a perfect square. Each processor's piece of the grid has n x n cells with n x n nodes connected by the standard 5-point stencil. Note that the struct interface assumes a cell-centered grid, and, therefore, the nodes are not shared. This example demonstrates more features than the previous two struct examples (Example 1 and Example 2). Two solvers are available.

To incorporate the boundary conditions, we do the following: Let x_i and x_b be the interior and boundary parts of the solution vector x. We can split the matrix A as

A = [A_ii A_ib; A_bi A_bb].

Let u_0 be the Dirichlet B.C. We can simply say that x_b = u_0. If b_i is the right-hand side, then we just need to solve in the interior:

A_ii x_i = b_i - A_ib u_0.

For this partitcular example, u_0 = 0, so we are just solving A_ii x_i = b_i.

We recommend viewing examples 1 and 2 before viewing this example. hypre-2.33.0/src/examples/docs/ex4.htm000066400000000000000000000030441477326011500175040ustar00rootroot00000000000000

Example 4

This example differs from the previous structured example (Example 3) in that a more sophisticated stencil and boundary conditions are implemented. The method illustrated here to implement the boundary conditions is much more general than that in the previous example. Also symmetric storage is utilized when applicable.

This code solves the convection-reaction-diffusion problem div (-K grad u + B u) + C u = F in the unit square with boundary condition u = U0. The domain is split into N x N processor grid. Thus, the given number of processors should be a perfect square. Each processor has a n x n grid, with nodes connected by a 5-point stencil. Note that the struct interface assumes a cell-centered grid, and, therefore, the nodes are not shared.

To incorporate the boundary conditions, we do the following: Let x_i and x_b be the interior and boundary parts of the solution vector x. If we split the matrix A as

A = [A_ii A_ib; A_bi A_bb],

then we solve

[A_ii 0; 0 I] [x_i ; x_b] = [b_i - A_ib u_0; u_0].

Note that this differs from the previous example in that we are actually solving for the boundary conditions (so they may not be exact as in ex3, where we only solved for the interior). This approach is useful for more general types of b.c.

A number of solvers are available. More information can be found in the Solvers and Preconditioners chapter of the User's Manual.

We recommend viewing examples 1, 2, and 3 before viewing this example. hypre-2.33.0/src/examples/docs/ex5.htm000066400000000000000000000006541477326011500175110ustar00rootroot00000000000000

Example 5

This example solves the 2-D Laplacian problem with zero boundary conditions on an nxn grid. The number of unknowns is N=n^2. The standard 5-point stencil is used, and we solve for the interior nodes only.

This example solves the same problem as Example 3. Available solvers are AMG, PCG, PCG with AMG or Parasails preconditioners, or Flexible GMRES with AMG preconditioner. hypre-2.33.0/src/examples/docs/ex5big.htm000066400000000000000000000012701477326011500201660ustar00rootroot00000000000000

Example 5 (64-bit version)

This example is a slight modification of Example 5 that illustrates the 64-bit integer support in hypre needed to run problems with more than 2B unknowns.

Specifically, the changes compared to Example 5 are as follows:

  1. All integer arguments to HYPRE functions should be declared of type HYPRE_Int.
  2. Variables of type HYPRE_Int are 64-bit integers, so they should be printed in the %lld format (not %d).

To enable the 64-bit integer support, you need to build hypre with the --enable-bigint option of the configure script. We recommend comparing this example with Example 5. hypre-2.33.0/src/examples/docs/ex5f.htm000066400000000000000000000006271477326011500176570ustar00rootroot00000000000000

Example 5 (Fortran version)

This example solves the 2-D Laplacian problem with zero boundary conditions on an nxn grid. The number of unknowns is N=n^2. The standard 5-point stencil is used, and we solve for the interior nodes only.

This example solves the same problem as Example 3. Available solvers are AMG, PCG, and PCG with AMG or Parasails preconditioners. hypre-2.33.0/src/examples/docs/ex6.htm000066400000000000000000000010531477326011500175040ustar00rootroot00000000000000

Example 6

This is a two processor example and is the same problem as is solved with the structured interface in Example 2. (The grid boxes are exactly those in the example diagram in the struct interface chapter of the User's Manual. Processor 0 owns two boxes and processor 1 owns one box.) This is the simplest sstruct example. There is one part and one variable. The solver is PCG with SMG preconditioner. We use a structured solver for this example.

We recommend comparing this example with Example 2. hypre-2.33.0/src/examples/docs/ex7.htm000066400000000000000000000026751477326011500175200ustar00rootroot00000000000000

Example 7

This example uses the sstruct interface to solve the same problem as was solved in Example 4 with the struct interface. Therefore, there is only one part and one variable.

This code solves the convection-reaction-diffusion problem div (-K grad u + B u) + C u = F in the unit square with boundary condition u = U0. The domain is split into N x N processor grid. Thus, the given number of processors should be a perfect square. Each processor has a n x n grid, with nodes connected by a 5-point stencil. We use cell-centered variables, and, therefore, the nodes are not shared.

To incorporate the boundary conditions, we do the following: Let x_i and x_b be the interior and boundary parts of the solution vector x. If we split the matrix A as

A = [A_ii A_ib; A_bi A_bb],

then we solve

[A_ii 0; 0 I] [x_i ; x_b] = [b_i - A_ib u_0; u_0].

Note that this differs from the previous example in that we are actually solving for the boundary conditions (so they may not be exact as in ex3, where we only solved for the interior). This approach is useful for more general types of b.c.

As in the previous example (Example 6), we use a structured solver. A number of structured solvers are available. More information can be found in the Solvers and Preconditioners chapter of the User's Manual.

We recommend viewing Examples 6 before viewing this example. hypre-2.33.0/src/examples/docs/ex8.htm000066400000000000000000000010111477326011500175000ustar00rootroot00000000000000

Example 8

This is a two processor example which solves a similar problem to the one in Example 2, and Example 6 (The grid boxes are exactly those in the example diagram in the struct interface chapter of the User's Manual.)

The difference with the previous examples is that we use three parts, two with a 5-point and one with a 9-point discretization stencil. The solver is PCG with split-SMG preconditioner.

We recommend comparing this example with Example 2 and Example 6. hypre-2.33.0/src/examples/docs/ex9.htm000066400000000000000000000020121477326011500175030ustar00rootroot00000000000000

Example 9

This code solves a system corresponding to a discretization of the biharmonic problem treated as a system of equations on the unit square. Specifically, instead of solving Delta^2(u) = f with zero boundary conditions for u and Delta(u), we solve the system A x = b, where

A = [ Delta -I ; 0 Delta], x = [ u ; v] and b = [ 0 ; f]

The corresponding boundary conditions are u = 0 and v = 0.

The domain is split into an N x N processor grid. Thus, the given number of processors should be a perfect square. Each processor's piece of the grid has n x n cells with n x n nodes. We use cell-centered variables, and, therefore, the nodes are not shared. Note that we have two variables, u and v, and need only one part to describe the domain. We use the standard 5-point stencil to discretize the Laplace operators. The boundary conditions are incorporated as in Example 3.

We recommend viewing Examples 3, 6 and 7 before this example. hypre-2.33.0/src/examples/docs/fe.htm000066400000000000000000000006421477326011500173770ustar00rootroot00000000000000Example Codes

Finite Elements Example Codes

hypre-2.33.0/src/examples/docs/fei.htm000066400000000000000000000004121477326011500175430ustar00rootroot00000000000000Example Codes

FEI Example Codes

hypre-2.33.0/src/examples/docs/flexgmres-amg.htm000066400000000000000000000004311477326011500215370ustar00rootroot00000000000000Example Codes

Flexible GMRES-AMG Example Codes

hypre-2.33.0/src/examples/docs/fortran.htm000066400000000000000000000004621477326011500204600ustar00rootroot00000000000000Example Codes

Fortran Example Codes

hypre-2.33.0/src/examples/docs/gmres-amg.htm000066400000000000000000000004621477326011500206640ustar00rootroot00000000000000Example Codes

GMRES-AMG Example Codes

hypre-2.33.0/src/examples/docs/gmres-euclid.htm000066400000000000000000000004231477326011500213620ustar00rootroot00000000000000Example Codes

GMRES-Euclid Example Codes

hypre-2.33.0/src/examples/docs/gmres-parasails.htm000066400000000000000000000004261477326011500220770ustar00rootroot00000000000000Example Codes

GMRES-ParaSails Example Codes

hypre-2.33.0/src/examples/docs/gmres-pfmg.htm000066400000000000000000000004621477326011500210510ustar00rootroot00000000000000Example Codes

GMRES-PFMG Example Codes

hypre-2.33.0/src/examples/docs/gmres-smg.htm000066400000000000000000000004611477326011500207050ustar00rootroot00000000000000Example Codes

GMRES-SMG Example Codes

hypre-2.33.0/src/examples/docs/gmres-syspfmg.htm000066400000000000000000000004231477326011500216050ustar00rootroot00000000000000Example Codes

GMRES-SysPFMG Example Codes

hypre-2.33.0/src/examples/docs/hypre_wiw.gif000066400000000000000000000235121477326011500210000ustar00rootroot00000000000000GIF89ahª÷ÿÿÿ÷÷÷ïïïçççÞÞÞÖÖÖÎÎÎÆÆÆµµµ­­­¥¥¥œœœ”””ŒŒŒ„„„{{{ssskkkcccZZZRRRJJJBBB999111)))!!!ƽ½µ­­­¥¥÷çç÷ÞÞ911J99kRR)k99!)”BJB÷ÿÿÞççÎÖÖ½ÆÆœ¥¥”œœs{{kssRZZZccBJJ)11µ÷ÿÆ÷ÿ½ï÷19Æï÷”ÞïJ”¥BŒœ¥ÆJZÖ÷ÿBÆç)„œ9½Þ1­ÎsŒµÞµÞ½ï­Ö¥Îk„!)­ç÷„Öï{ÖïcÖ÷ZÆçRÆç){”BÎ÷)œ½1½ç!­Ö½ï½ï­Þµç­Þ¥Ö”½Œµ{œs”RkkÎï9„œJµÖRÎ÷9µÞZs”½”½¥ÖœÎ½÷œÎ„­JcBµÞ)µçŒµZ{BZŒÆÞ{¥¥Þ÷9”½!Œ½9R!1ç÷ÿ1sœ){­Z„¥9k”œ¥­)BZkŒ­9Z{)Jk9kœBcŒ9BcJR„99ZRJsZBccJkJ1Rÿ÷ÿkZk))k9Z½­µ{ks{9Zs1R¥”œR1ç½Î)ÞÆÎs)B„!BïÖÞŒ9Þ¥µïÎÖέµÞœ­J)1Æc{s)Jç½Æµk{”)BJïÆÎœs{Ö„”Î{Œ9µ1J­)Bœ!9c!Œ)”)„!­!¥!R)ï½ÆÎs„Æk{½ZkµRc”9J­!9¥1­1¥)œ!”!Œçµ½½Œ”{JRÆcsÆZk½Rc¥BR9­)ks¥!¥œ”kcç­µÖ”œ½{„ŒJR½JZµBRc!)­1B”!1J­„{B9½ksœJR{)1Zœ”JkZœs!ù,hªÿH° Áƒ*\Ȱ¡Ã‡#JœH±¢Å‹3jÜȱ£Ç CŠI²¤É“(Sª\ɲ¥Ë—0cÊœI³¦Í›8sêÜɳ§ÏŸ@ƒ J´¨Ñ£H“*]Ê´©Ó§P£JJµªÕ«X³jÝʵ«×¯`ÊK¶¬Ù³hÓª]˶­Û·pãÊK·®Ý»xóêÝË·¯ß¿€ L¸°áÈ+^l6,sŒ#+ š ]’3eu >|Ïhí3²pøÂEËw´ëœr=K-¸p³^ëž)@vjÕà¢á˶»¸Ë¹<‡^{95ãÐO˜Õùw8bÌñ¥‹Î}¤oÚÁ±Gÿ n›T÷óC|ËW[ür÷ø°¡Ÿ¯Ñ@„iäÇGOž˜yúNDÀÿücÌxü1‡q6èMª¹Î-fØþCÎ0×>Êhh¢B`á8üE£_8ß°râŒ5!~-ª¦<”@Æ“#vø¬Òã‘ XÌ; b;Ù#NCÌ‹Íá㊔=ªxàmí…ØK”\Îx@÷€fmE–Icÿ° Np⣎›3 °Á?¶¨âxál‰§‰ TIg˜O’9h†*Ξ‚Z.ªáÿÄC ˜äáË¢’Øè0.RŽ‘6h@–bÚ\3g‰ÀiB„ÿp +!”šÒ y]˜ø SVØ„B¬‚Œ:ψ÷M3É`hëHhðÏ8~†c*ÀÊ,ÔÌŠh ðêK³ôÒO›QÇÍgÖÝN?Ñ䲓¶å¸bï,àî–ä —bI k …àJ2¼pÓÜuШcθ Ý‚ 1°Èdjá8“/˜Ã Ūý©_mùÈg“æd ‘Ÿ 6ÿ¹€Š,¾èdŒ°ÞRò7Ÿ-Gçr¨&hC¬›ÅzË,õÚko9¬0Œ+½Ð†O2‰ Ëlø€Î0Ã3 8—2wÛÔ‰ËÏà4C¬˜£ŽpY»{p>à$³¶bû^§*j¾ÿ”Š.Íô¼\m„«öñ»T3” ÅÄQ*¹¤“ìÁŸ ½\3h#tKÔ©Ýö ¶!$#ÜuĈãM1òÈSŒ7»ºÇf9‰pM4*´VÐ,Ø4ÓL:æ\¼Ð,éô|Û4Äï‡Ý•·õcûh9ð©æ‹á@ƒmAœ5>x…!o[mîâ¦+êЦ#ƒ¹Žå<§ï.8Ÿ‘zeÂç">­™ãLj—Æ# 9§ØÂÙC€Œõ mH†à>Ãkä"µBðPsoÌcbÁ=À6¸Ú@ÃwŒ¡~d&œÄ äÊø×{B”ŸüˆÇEûQB4‘ œ­°qäkˆù¶—½]¹èJ.’¡Aÿzs?ÃÉMéè1âaŒþõï@9Š^W4£sáÍ £v½æôC&,ˆ”AÁh܃NüG1g­çhÆÿpTi&V`ãà•þd-@u¯¹/ò18÷Ì!¹ø –¬Õ½à±jÈXWÇÀt<Ï„MÿØÁ& ì©úТܗ6s\„£ß@Ìíi/Ã2ˆ+p¶x`ðè€åt(ÔÄjSŒPµGøØ.ºhÜÖ°# q8s9_ÓÏ¡^¸Çg¼Ê£{TˆÈÆÔCgû`ëö²Xº"”&9û ¸XðÉÉi{™ú¥@(3ÿ:)7¸†øÖ„h¸± !Pþà!P@ÀÀ¡YɈ‘€&¨¡ŽƒŽóè… ^QkÓ¸Ç<ŒAt`Æ(†8\×1ìt¯š56V¡æ³òZÈ„A7!é±cÐÓ™¦È”Œ~’ã<ÖÁ$dZÑõÓÌäÇ2 á¶IV˜KœÂáÅ‚Låàc%HÀj”Á]¹‹æ0Gîú!@Ä ÀP„ËT.XÑŒ~\‡‰iìÐ ¬t¨ü„sGÀ¼ûȳ«.GŸñD<Þio3í¥~€xÜ€í¸M‹ÂC8ìˆ 4ˆtY >ÿµ0Au>,·3 Qƒ÷“Ù6yBðâ7ø`†\=HÇ#ç~†–é)¦²k˜ Aœ•nªD8°Ú>Q´;»N>úvxŒÃR•­ì?‚a„ƒMìÐ<æ´¦õá¨@XpQ×Ý5Ð0mC&!y¨‰<ùVøX‹=@õ¢ lá*&ƒÜ"¸¨QÆÝ’Õ ¬{TLxP)P ŽBZãÇ?4@\("ÀþÁwMØÃÇ,@4vÀR€*æ{d„·t¢-·&á' …Äs¥‚¶¬!Iª-ˆäŠPÀØ[¡4ƒÁß­å1ÿlàPð@f¡Ô,O!01Æñ( ^©q%RŒ‚ôá‚¶ BEèC|Ô^8zበô¯Ïã¡c QÀÃüË¥L¡ñhJ46Š1jŠÔ±AãË 9Sôáâèî"B¡ì©‚’ qŒÃÓÏÐ0k>Tz!š¸E.6Æ5Ÿêl9øhÆZ €æ±ÈI9‡5 ÐÔÓhe=tÀzþºª ÓmšÁ0üãŸH@@4 ž,úSpðáŒc,«â :=(g‡`E¿<²l-÷P“Þ@ã?V° ed.ô $‘Ô‘Ó÷¹â¶[ûCTzô0…ÿú’¾ÙÔ S@W‚´=˜ @p,¹×ž„Èh@lÿGá ÇÓÈ©”ôJÊ:ÃY)m­¤nmüKá4t>0Ù?äµ ›Òñª¶]ƒ8ûMœmp䃰¦¶¥Çñ)Fgˆ"¾ˆ›Iu®xþ÷ˆÄ“HÈ0ÿqÑ݆”mSdtIDÖ«¶)›¨AÚBwå}D‡ r`^ ÄÞÈÚüzÁP#½húz½Ku-ñÐň³¯pöòñÙ{œÂ™£à0Y D¸{úTƒ,Àª )µøxÌÜ@Fg/*"ü>±b¢qôÿôû[›oüŒ €À|ç_à£EZE6žñ.žÁPÒtò8¦ALz=2*b ¦øàUfÆÐX=!k¹i<ƒY  Gb€At´ÖjÍ‘9A%ÿšggÑ<ÿ0S #'‡° šF?  çòb~„TB¢+ñpùõÿÇDwQjf'»GWâ'IkR$ 7_Ar’#ø`x‘j8¢oáÀnA Xg-¹1=R¥æ9yw-ø~"Ò ¤À ð""„*¶·ä0W °h’G 8ZÍñ P v‚®4"9$I¨|K˜t ð!ˆB" ÿ]еU!²^Ñyÿ&Ùq'@t}d—ÕùÀeËA0Æ–=ò "ñP ;ø:PU¥"” ×A%εý#Ç7’$×13„„¸úPwäqÉÐq_W%Øf-Ï0mán, ]ËaZ $Xâ.x2` "HBßÐEz"âÐ òðŠeŒ…A ó0fi†…Q‹+'ËpÁhˆaÒ8€äpó¸vùÐWÁ! He#R EciŸ×Ã!^8-F€}³Ðð@ш ˧óŠ@ Àm»±xÈGø ±ýb…Uý˜y+Y ÿq+àO¨!mWÕcðÅjWHñƒ’æ=`#¼´HZ´pü`„ò6Ñ0 ã°?’5àœFØ$M—E]¹¹’9%üH[Z¦a$Ø ' B€Ï€ˆS8qÄ÷'¸hRx©‰ "&\yÉ6°Gu<ïp%­H’À‰×+Öb¨Ja#üÒtlò§E[Ždÿ‚ aБà¿øsÒâ}mc¹K7BÛ$(Dgb Ò ­™”!8ŒÄÀ!0àðÈÌåÆyœÈ™œÅƒÖC>Õ‡ÙbiÅàw·¸)Qˆ`ø¾Ä.Ðû]¶Á cÿHÂ×xù1˜Á`¡ôw}! ©oè™1À¡ÔKرƒ:pÏÇ\±œþ Ê : JG@z zAp Ê A¡Að?@á„€œÚ¡J ¡>¡Z¡T`¡BðB°¢BPU`0ª2Š3ª4Š8š£Yj R `’=ø€ [€Y`¤Hº£Jº¤Jªl€o ªuwˆp9ª£NŠR€’ 5‹ŒÐ9j¤LÚK0 ^ÚvÀm@¦Lª¤z€™0¥‰ x€xš§zº§|Švðs²ŒÁxªvpö`Ÿø€ nÿ€§]€©]0©EжŸ—`f`fàŽšJ¢:ª¤ZªMpª¨šªªzªaЭúª®êªa0«´Z«¶z«d@«c°«¼JM „€üY  z>p¬>ð=°¬=@‚°ý’ ÜÐWP­m mZ¤Š_Ð_ðyðbcPb0 L’#ï O îú®î:b@ôú¨ÄjÁbÀ«üʯ“p¥¯d@c0°{°bª *·ñ‰ {°;±+¯¡Pw¡‰ð¼ú‡6êöûJ±»«¨€Jv(À±ñÚ« $;±»3[³cÿ@³›³«³³ ³0KA;°»Z²kü™-ps7'Q0oôVR{Të`µµð е]   b+¶¢°f{¶ p¶g;¶b nû¶ ð–æ.†—Ìðxë¶ ¶`«]«a«2 €[ ü¥ ·± C@DkZ0¹LÀ{°¥”ÀYFçeйu𹟛 K ЮïÚ®¨ ¯O éÚj¨€³ý:»´»«çÊY—ú0²¼z LâxªP´µk»èÊAt¨ ¼;»³9 cà¼Ðû¼½ê³F˳Ë;¼Ø;½.KHpE#jÿ¾â‹cP¾å;/@Pà1€µ{+¶ Àöë àŸðÐI0@-`pÀ°Àº´£¥e‰5Á¸v‘­3Nd^wn¸Ó K•À"Ì…PÂ…€Òà ‚ÐÂwðÂi{0ÃRPÃh€ª`†ÇÃ>“¡[Û¯û ¯bðp éª C,¯‡à¥‡ò–°¯Ö[±sÃ@&Åk½\|½K´Ù«¼]ü²?[ÆBK½EK´¾*ÎQ¢ H$T«µ€«fË ¿À¿пŽV…ŽG î°Àã•K¢ÿÖ?¶Pw¬¶D¼bG'ø ìDX8»9ÂPÂSPS0ƒ¤ -,|Ã2컓Žp¨œju ÷ªaq0»¬;¯ðºêv¨+¯¶ƳK½ÕëÅ9+̵ ƹªÁzµØKÑC—A ´V8˜Æ¾ Që+µ…2kT¶Œ¾à@ì¿`‹ÅÄÀ ŒÀ°À`È€È"‚ô–|É—, ËuYöf!2 ²0Ê¥|ÊFp1¼o€ÄÀ€°Ë[?,º%˯¹LÄMœ½ËKÌ1Û³X€¡Xñ2ç&•šñWOèœ×qšd!Þÿ'3‡T@¤™O%â%p‚nLùx\¿{ÜÇçÜI6`Pïli†ÙXÝP Nôc5åþ\ ü ŒÖü¶F•Â"ÜÉž,ʤ¬Ð =×{Ãgpœê¹QÄ-¯îººïŠÌ½Ú&ø(iM9RÓ=ä8 A)ÿ@k¢Ò+?×Qù}¹ÈÙx,T€+3•Jì` ìk "%MËPÿ;LíÔðüI(¨NÁ!ÁYÝÚN$ÖdÊ Ê ½¥mm«ÑK×#k°¿Ú %p™ÂÒa‰#”:â’!|—*kט5¼èHæî†uÈí Dko¦ÿ6—¡"´I€¾0b0™‚϶f»ÇäÜ¿JMÀœóLnŠLÕ®}ßR d=ʨÌÐ\€®ÊÌ]¡’QDRA%¹ZWx›ðÍEHƒ)F5ÐSj' . -›¥É¨AÜ 1•ýâeË=qâ4“שK÷˜»6‘ÙLjÃÍœ}еFÝÞD¦=ÏäµÈøK%úîùÙ·XÝÙN‚%-é‚—oËÕ;G$j…r™=$–Î& fhÁø€– ‚æÉ+‰ÛMEM;µ5^¿Tø!0Wbq}Hvw+øT’‡M‡cbÝ+ÿRk5Õ2 0f¨#êÐæ!Ò‰^ÿ5  myWžÃ(d¹'yzMަáá¡6pé—e+ZÆ’"3°Ó2sËyg~#ö #þ&]|5œ¸ùÒˆr豚.Ñ&ÍÕ¦FŽÌ쉩v¢$*º^6ê’..™ ò q'èÙÕÁšÅx1é$Ð%1° fÈ&êpáñ혦NÛ)P <ÄoÐ)ž¾åãIü‘”•íá –ê„‘r3çâQ‘2×j–·`’Úò“E& ÏDâ“ñ͉&öÐ v¥)Û­"~™×·”ÅÿêÙ€ý`‹A¹åþQÙ&¾ZiØ'Š»¼@@šÍæÒë Í%ï Zm"ÖÆ£ŸñÍPÔ$A´æ‘Ÿñj‘±w; U¯‹{bí¤®™ ‘U«v(áÄ#ÀôîèzMÓA l÷ØGŸrntºŒÂÁZÏ6I„`ãNm2eJÿþî¶¡EPÛ—-Ò2x¶Dð53°3"Ñ)dß\ºÀ3 ­ ²–æÕÇÑR[Bd%÷é 6Tæ2a†AFQ‘ãg…|+=G·1M¤c-h?D‡‚C²ÀÿLæÐO`Ó§€’ '¹æòÝ!+N~A:*5ƒ™Áò½/"ÖEjì^+% $X ÿþé#F,\´p%BŒHÍàEŒ#,tèb4p~3—1D®føÂ5 ǯ„€Œwü›æ1dŘ(üwo˜DC‚ ÷-Ì‹·t¥TI1WN¨Q¥N¥ZÕêÕ« N# "¾dX VèùS¨Èˆ¼š…»6ÕÏb?;®¤ë0\I±8м9×kÄpøxåš•*Õ,sÊ ©\ Îß6Rü“÷î/1|ê¦"à©oØeºsK‡,—9]ØzEc œ8¼beϦ]ÛvÿF ÿæ#mî·T²w²góãJbß`‰ ê'¹ŸÇÿFë×VöäÝ~ëvüªò›C|*‰oÞRì­y'VšrjU(o<èévñ厝ãˆÂG˜Vn3ð@4ȹâ±K"|Ò™‚â ­±aò¹‡«àiœÞ†ºL0Ä`ƒƒ‰qŒ¹'œaÆc‰(pxkHœqŒù‡ªøÇ˜pD ЕUÔy¦ÄŒ÷<òÈ«/C$žn>yAKTSUõ-¾¢ñJ%df#Kžèx gœx  ¬ àI[ć¤ÄZïr„I4剅¢ÕT°ÊWc¼êkTZêŒj§Î> ­É®Ê¢Ÿøy¥QUÛuAìBr|zÁT,p$\y¸!=±&è¨Ððq†¹Ù&[¡¸¾VºÇYˆª¤j‘ ÆM€<ÁÁú Äÿ«)(_Ü L:òG• ÆE:+9Z–èóüî6`ÄœUœ0ƒ;DÕR·ñ° œNÁzá¼Ùp&z L6P%E=xÀP±\àAbU…€pÑ‹p€>‚h°â6P´…¸@Rô°ZL€"  @€˜âýøG—%€I6yÏüÒž¿àC€dd#‰Á µŠHljã+û\($-|d'=ùÉ,! “œÈÿ T€C‡5aJ\)»WfÄ•:L^,AyK\b%£,^`ÔAKªlOãªÂb2t`y@::ŒD øØ•P ÿp¹äf7¡Bøc½ùOG ûP›«"òYHa¹ 4‚“(þã0€@ XiW €`â«,€¢yó( ×Gà‚è(R:è] Q0À;*>Ž¥.ZN BÓ ÞÔ¥M‰ ¨ KKøQ+Üå@*˸ðáDVÜË !ë@°'}r p@B" 0${ˆÀ^*`u€cãÀÕ08…D ø!ïêÈ|"€Ÿÿè* Hó ðþqiv ÿ¼k€a/@À°ÎÄÀ⠘Ň 0Z…\ žLe-F°› 倷ñÿäÔ uT'#“!,O& ¤ªñdx€ž¦0P :ë|íí?60€±5W¢xý‡˜‹Ù@`Ò­…¤‹ÙÅ^W!ÙÝ®¦è>ž0à /4[ûÞ‹8ÀÀ²ÉUÛtªúÄU ë‡QÎ9cuTÀ`€½XQ! À«†‚ˆÎdù”$%Zzà €àøð±JÊ}.Q0 !ˆ(‹Â:…Xà{)±Bت´b¸"P´ Öƒð%ò^WP#´”ó¿´ÿQ˜¶Ne,y "žÀ±, b 0!#î  +fÿð€w@–¤,DÜ%¾5º`®¶{èI@t `.òt` ˆ¨g…H€· 8¬\¡·Å¹È XÑ0ãD“ú3'I‹NcˆáS@…ÂÝ™bê€w h3sPæºÍ±PÒ?24`ÅUÔ(¼%f@cÛ@VLÕ$`pö4@_ÍƱ±{Ma¬&, @t7pEëIú½3†óʉtpã)µÑÊâ†Â"~Œ€W1aU¨ªúd¸ÇÊ€ˆ1Àk\ÑåóÿŸ#ÊÞ(Z!  ÀõÜ_+1 }€ˆ+ b( "¦q­Ä*¨üGpK^:³øwk›MP'#'*èG3JYhJþHAtQ7'z»ˆ(©ýkúè• ù¶¢@cxø°s@ @Û}l<€ÜHöŠˆÀÏç¶Yh€â3…ö€h¯z°9$@á ëGmù?màû™É!ÎHÆ,4Mo2ñðpGž’_`xmÀ^ŠÍ^jw@×¶?;ð6¡QNä u€{è– _î5ô.…ÿc(?4}(À 0÷õ Á@ž ÿ°—+ÇØ4Þ·-ƾçÒÆxÇCVô™ièãä¢gF¥ œJ*@g®ÉÀÜæÆžáyÕÉxìô½pàÎ¶Õ Âõö9ì„M€ûÞFì³+ä5Pˆ² {€è2µ4“;…ðÑ1´8š½ä(‘ñˆ‘i¸‡ ‚!÷ª p™‡x˜€0© €®ã§x¢!º¢ó£'¡yÞ2/ã€ÁŠW+®€‡=9Ú“½ Ó‹’±æ¢5…˜ÌÀ,Ø‹ÒÚ‹÷Iˆ ໼%%š†Ÿ˜D/ ˆŸ‰(…¸>Š Þ%¹æŠ€ÉšP’ D{,ÿäú±èÂ'á ˜<Â8æ’—º¢!¬:2+ˆÐÃ;ÑAÑá€áyï:ÞZ™¨I-, ²(Ì%¸¢ žÀ€øBÛ8–Ç’Ä©`€8 €€:pˆš›ð€ jñSÜ&‚pµP4 ñ€P4ÅeB9S¸#øÅ`×1)x€ +g €€€ÊR5‡E(€HÆÅ-ø„< ·¢":È¡Iô&Þ™‡Ã’ß»€ 49䉈Šn#,(LG}"¡Ñ ¨jÒ’Ã«Šˆ€ Ø€ @C©ð€oSº}|H/¨(oÒ´Y‚HÿŒÌH\€É9€‹RP €˜œÕÒH“<ÉÄù³¡€ˆ€Wc–CI™œI}õ« <ÒCÈ€ ð@š ÊG€6p€j!J†#Ê®³§x€c<ˆ§TÅŸšJ¢3 ‘Æ-J:h€×S€áù›hh³d´–Xõ*¤ØF B*·ä#Q$ÆmtPJ¿LIçž ˆ®W 4žè€õÙ<žfÒ”(€ñÂ+ €í*L§CXÇЀB»&ãÞÒÁïê'èÑ€Ò+â rüKØ„™+¯¯Æô.dê?Þ’€"º!¬88ÿ:ð¢€5“ñ’€p6†T”í²á/K?³Í…Û®¸¢ÊŠMï´ èC ‚ž 8ÂDzßëLH{sŸÍ6´¶´BÁÁÙ0Ì*Vé8WãUL´d® x4.ƒø¡ %!BöÊÇïlPÙ¡N(´;+5 sI‘ãË™€ ÅSc é²ê—ŸÔAïúºz:E!X°úôµS£0Ø.ˆ®°<4¢˜³JíÑ‹°=Ö»¼°€{«5áRQ @’X«ÀÂR÷)þ )Ï€¡‹(ð:7´½5#¹ `® Q#å=æb6ìáXG @>ÿmS¡yÊÑë?PMð®Îš€ªÙMXû3V±Ñ¡€c±0 R˜‰ Þ· )Vë? 1 %®7]?j)ªè²µ6ÝÔy1ÐL(­0’{B°®@ð€p "Aí¹è2ºÅú5‚J€cIR˜S¼“)˳6{Ì0Ï03)—rU4åTh =© dCp™€EŒÔz4VÑ€î T%Á€RE€½8Ô0¡aïR³…k5…@@ZJ®KPhåÔ9¤÷©¿Î´êD¡A¼J€ˆZ +³wÅR×ó® \]0áY0pÑ€ÃúDÿ%ô7^+¶½Ð€ë”,g+úAØÏ»×MmQgIÅDC®èL4úÁ¬ XR…p¬’c=ÕZ«s±s®½ÊD s%ÒQ‰Mi€\:žY%Ùï ™ X@;ü[$ˆÖ4 (¯\ƒ)ž¸Ô\MÐ â H ȳý¡3µ»ÁÊ¢È3Y ³5¸Ç€+¤ O`Ú61=4+¡(¥º½£H‚ˆœ`ðÁM©Ë1*k9ÜHª¸ºˆ\{šÜúÛ8€,ÈåÉE ½¿}<“Ò\ÅÛ¿œ4C]ÖBÅxl]Ù]Ú­]Û½]ÜÍ]ÝÝ]Þí]ßý]'à ^á^â-^ã=^äM^å]^æm^ç}^è^é^ê­^ë½ÞØ ;hypre-2.33.0/src/examples/docs/ij.htm000066400000000000000000000004221477326011500174030ustar00rootroot00000000000000Example Codes

IJ Interface Example Codes

hypre-2.33.0/src/examples/docs/index.htm000066400000000000000000000134311477326011500201140ustar00rootroot00000000000000Example Codes

Hypre example codes

Clicking on any of the categories below displays examples that contain the described feature. Additionally, a comprehensive list of all examples follows the category lists.

The numerical results from most of the example codes below can be examined using the GLVis visualization tool. See the vis sub-directory for more details.

Users are encouraged to submit any example codes that they have created and would like to share. Contact a member of the hypre team.

Interface

Equation (PDE)

Discretization

Solver

Programming language

All example codes

  • Example 1: the simplest Struct example
  • Example 2: a simple two processor Struct example
  • Example 3: a Struct solver for the 5-pt discretization of the 2D Laplace equation
  • Example 4: several Struct solvers for a variable coefficient 2D Convection-Reaction-Diffusion equation
  • Example 5: unstructured solvers for the 5-pt discretization of the 2D Laplace equation
  • Example 5big: a 64-bit version of Example 5
  • Example 5f: Fortran version of Example 5
  • Example 6: a simple two processor SStruct example
  • Example 7: several SStruct solvers for a variable coefficient 2D Convection-Reaction-Diffusion equation
  • Example 8: two processor SStruct example with multiple parts
  • Example 9: a SStruct example for the biharmonic problem treated as a system of equations
  • Example 10: FEI example with bilinear finite elements for the 2D Laplace equation
  • Example 11: eigensolver for the 5-pt discretization of the 2D Laplace equation
  • Example 12: nodal version of Example 1
  • Example 12f: Fortran version of Example 12
  • Example 13: a SStruct example of bilinear finite elements on a mesh with an "enhanced connectivity" point
  • Example 14: version of Example 13 using the SStruct FEM input functions (instead of stencils)
  • Example 15: SStruct solver for a 3D definite Maxwell problem
  • Example 15big: a 64-bit version of Example 15
  • Example 16: a SStruct example of a high order Q3 finite element discretization
hypre-2.33.0/src/examples/docs/lobpcg-amg.htm000066400000000000000000000004211477326011500210100ustar00rootroot00000000000000Example Codes

LOBPGC-AMG Example Codes

hypre-2.33.0/src/examples/docs/pcg-amg.htm000066400000000000000000000005231477326011500203160ustar00rootroot00000000000000Example Codes

PCG-AMG Example Codes

hypre-2.33.0/src/examples/docs/pcg-ams.htm000066400000000000000000000004161477326011500203330ustar00rootroot00000000000000Example Codes

PCG-AMS Example Codes

hypre-2.33.0/src/examples/docs/pcg-euclid.htm000066400000000000000000000004211477326011500210140ustar00rootroot00000000000000Example Codes

PCG-Euclid Example Codes

hypre-2.33.0/src/examples/docs/pcg-parasails.htm000066400000000000000000000004661477326011500215370ustar00rootroot00000000000000Example Codes

PCG-ParaSails Example Codes

hypre-2.33.0/src/examples/docs/pcg-pfmg.htm000066400000000000000000000005231477326011500205030ustar00rootroot00000000000000Example Codes

PCG-PFMG Example Codes

hypre-2.33.0/src/examples/docs/pcg-smg.htm000066400000000000000000000006241477326011500203420ustar00rootroot00000000000000Example Codes

PCG-SMG Example Codes

hypre-2.33.0/src/examples/docs/pcg-split-smg.htm000066400000000000000000000004231477326011500214700ustar00rootroot00000000000000Example Codes

PCG-split-SMG Example Codes

hypre-2.33.0/src/examples/docs/pcg.htm000066400000000000000000000005561477326011500175620ustar00rootroot00000000000000Example Codes

CG Example Codes

hypre-2.33.0/src/examples/docs/pfmg.htm000066400000000000000000000005171477326011500177370ustar00rootroot00000000000000Example Codes

PFMG Example Codes

hypre-2.33.0/src/examples/docs/replace-ssi.perl000077500000000000000000000007731477326011500213760ustar00rootroot00000000000000#!/usr/bin/perl # This replaces the server-side includes. use IO::File; while (<>) { &process_or_include($_); } sub process_or_include { local $_ = shift; if (/^/) { &include($1); } else { &process($_); } } sub include { my $name = shift; my $F = IO::File->new($name) or die "Cannot open $name: $!"; while (<$F>) { &process_or_include($_); } } sub process { my $line = shift; print "$line"; } hypre-2.33.0/src/examples/docs/smg.htm000066400000000000000000000005151477326011500175720ustar00rootroot00000000000000Example Codes

SMG Example Codes

hypre-2.33.0/src/examples/docs/sstruct.htm000066400000000000000000000010541477326011500205120ustar00rootroot00000000000000Example Codes

SStruct Interface Example Codes

hypre-2.33.0/src/examples/docs/struct.htm000066400000000000000000000005741477326011500203350ustar00rootroot00000000000000Example Codes

Struct Interface Example Codes

hypre-2.33.0/src/examples/docs/syspfmg.htm000066400000000000000000000004151477326011500204730ustar00rootroot00000000000000Example Codes

SysPFMG Example Codes

hypre-2.33.0/src/examples/ex.h000066400000000000000000000026411477326011500161310ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /*-------------------------------------------------------------------------- * Header file for examples *--------------------------------------------------------------------------*/ #ifndef HYPRE_EXAMPLES_INCLUDES #define HYPRE_EXAMPLES_INCLUDES #include #if defined(HYPRE_EXAMPLE_USING_CUDA) #include #ifndef HYPRE_USING_UNIFIED_MEMORY #error *** Running the examples on GPUs requires Unified Memory. Please reconfigure and rebuild with --enable-unified-memory *** #endif static inline void* gpu_malloc(size_t size) { void *ptr = NULL; cudaMallocManaged(&ptr, size, cudaMemAttachGlobal); return ptr; } static inline void* gpu_calloc(size_t num, size_t size) { void *ptr = NULL; cudaMallocManaged(&ptr, num * size, cudaMemAttachGlobal); cudaMemset(ptr, 0, num * size); return ptr; } #define malloc(size) gpu_malloc(size) #define calloc(num, size) gpu_calloc(num, size) #define free(ptr) ( cudaFree(ptr), ptr = NULL ) #endif /* #if defined(HYPRE_EXAMPLE_USING_CUDA) */ #endif /* #ifndef HYPRE_EXAMPLES_INCLUDES */ hypre-2.33.0/src/examples/ex1.c000066400000000000000000000302551477326011500162070ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /* Example 1 Interface: Structured interface (Struct) Compile with: make ex1 (may need to edit HYPRE_DIR in Makefile) Sample run: mpirun -np 2 ex1 Description: This is a two processor example. Each processor owns one box in the grid. For reference, the two grid boxes are those in the example diagram in the struct interface chapter of the User's Manual. Note that in this example code, we have used the two boxes shown in the diagram as belonging to processor 0 (and given one box to each processor). The solver is PCG with no preconditioner. We recommend viewing examples 1-4 sequentially for a nice overview/tutorial of the struct interface. */ #include #include #include /* Struct linear solvers header */ #include "HYPRE_struct_ls.h" #include "ex.h" #ifdef HYPRE_EXVIS #include "vis.c" #endif int main (int argc, char *argv[]) { int i, j, myid, num_procs; int vis = 0; HYPRE_StructGrid grid; HYPRE_StructStencil stencil; HYPRE_StructMatrix A; HYPRE_StructVector b; HYPRE_StructVector x; HYPRE_StructSolver solver; /* Initialize MPI */ MPI_Init(&argc, &argv); MPI_Comm_rank(MPI_COMM_WORLD, &myid); MPI_Comm_size(MPI_COMM_WORLD, &num_procs); if (num_procs != 2) { if (myid == 0) { printf("Must run with 2 processors!\n"); } MPI_Finalize(); return (0); } /* Initialize HYPRE */ HYPRE_Initialize(); /* Print GPU info */ /* HYPRE_PrintDeviceInfo(); */ /* Parse command line */ { int arg_index = 0; int print_usage = 0; while (arg_index < argc) { if ( strcmp(argv[arg_index], "-vis") == 0 ) { arg_index++; vis = 1; } else if ( strcmp(argv[arg_index], "-help") == 0 ) { print_usage = 1; break; } else { arg_index++; } } if ((print_usage) && (myid == 0)) { printf("\n"); printf("Usage: %s []\n", argv[0]); printf("\n"); printf(" -vis : save the solution for GLVis visualization\n"); printf("\n"); } if (print_usage) { MPI_Finalize(); return (0); } } /* 1. Set up a grid. Each processor describes the piece of the grid that it owns. */ { /* Create an empty 2D grid object */ HYPRE_StructGridCreate(MPI_COMM_WORLD, 2, &grid); /* Add boxes to the grid */ if (myid == 0) { int ilower[2] = {-3, 1}, iupper[2] = {-1, 2}; HYPRE_StructGridSetExtents(grid, ilower, iupper); } else if (myid == 1) { int ilower[2] = {0, 1}, iupper[2] = {2, 4}; HYPRE_StructGridSetExtents(grid, ilower, iupper); } /* This is a collective call finalizing the grid assembly. The grid is now ``ready to be used'' */ HYPRE_StructGridAssemble(grid); } /* 2. Define the discretization stencil */ { /* Create an empty 2D, 5-pt stencil object */ HYPRE_StructStencilCreate(2, 5, &stencil); /* Define the geometry of the stencil. Each represents a relative offset (in the index space). */ { int entry; int offsets[5][2] = {{0, 0}, {-1, 0}, {1, 0}, {0, -1}, {0, 1}}; /* Assign each of the 5 stencil entries */ for (entry = 0; entry < 5; entry++) { HYPRE_StructStencilSetElement(stencil, entry, offsets[entry]); } } } /* 3. Set up a Struct Matrix */ { /* Create an empty matrix object */ HYPRE_StructMatrixCreate(MPI_COMM_WORLD, grid, stencil, &A); /* Indicate that the matrix coefficients are ready to be set */ HYPRE_StructMatrixInitialize(A); /* Set the matrix coefficients. Each processor assigns coefficients for the boxes in the grid that it owns. Note that the coefficients associated with each stencil entry may vary from grid point to grid point if desired. Here, we first set the same stencil entries for each grid point. Then we make modifications to grid points near the boundary. */ if (myid == 0) { int ilower[2] = {-3, 1}, iupper[2] = {-1, 2}; int stencil_indices[5] = {0, 1, 2, 3, 4}; /* labels for the stencil entries - these correspond to the offsets defined above */ int nentries = 5; int nvalues = 30; /* 6 grid points, each with 5 stencil entries */ /* double values[30]; OK to use constant-length arrays for CPUs */ double *values = (double *) malloc(30 * sizeof(double)); /* We have 6 grid points, each with 5 stencil entries */ for (i = 0; i < nvalues; i += nentries) { values[i] = 4.0; for (j = 1; j < nentries; j++) { values[i + j] = -1.0; } } HYPRE_StructMatrixSetBoxValues(A, ilower, iupper, nentries, stencil_indices, values); free(values); } else if (myid == 1) { int ilower[2] = {0, 1}, iupper[2] = {2, 4}; int stencil_indices[5] = {0, 1, 2, 3, 4}; int nentries = 5; int nvalues = 60; /* 12 grid points, each with 5 stencil entries */ /* double values[60]; OK to use constant-length arrays for CPUs */ double *values = (double *) malloc(60 * sizeof(double)); for (i = 0; i < nvalues; i += nentries) { values[i] = 4.0; for (j = 1; j < nentries; j++) { values[i + j] = -1.0; } } HYPRE_StructMatrixSetBoxValues(A, ilower, iupper, nentries, stencil_indices, values); free(values); } /* Set the coefficients reaching outside of the boundary to 0 */ if (myid == 0) { /* double values[3]; OK to use constant-length arrays for CPUs */ double *values = (double *) malloc(3 * sizeof(double)); for (i = 0; i < 3; i++) { values[i] = 0.0; } { /* values below our box */ int ilower[2] = {-3, 1}, iupper[2] = {-1, 1}; int stencil_indices[1] = {3}; HYPRE_StructMatrixSetBoxValues(A, ilower, iupper, 1, stencil_indices, values); } { /* values to the left of our box */ int ilower[2] = {-3, 1}, iupper[2] = {-3, 2}; int stencil_indices[1] = {1}; HYPRE_StructMatrixSetBoxValues(A, ilower, iupper, 1, stencil_indices, values); } { /* values above our box */ int ilower[2] = {-3, 2}, iupper[2] = {-1, 2}; int stencil_indices[1] = {4}; HYPRE_StructMatrixSetBoxValues(A, ilower, iupper, 1, stencil_indices, values); } free(values); } else if (myid == 1) { /* double values[4]; OK to use constant-length arrays for CPUs */ double *values = (double *) malloc(4 * sizeof(double)); for (i = 0; i < 4; i++) { values[i] = 0.0; } { /* values below our box */ int ilower[2] = {0, 1}, iupper[2] = {2, 1}; int stencil_indices[1] = {3}; HYPRE_StructMatrixSetBoxValues(A, ilower, iupper, 1, stencil_indices, values); } { /* values to the right of our box */ int ilower[2] = {2, 1}, iupper[2] = {2, 4}; int stencil_indices[1] = {2}; HYPRE_StructMatrixSetBoxValues(A, ilower, iupper, 1, stencil_indices, values); } { /* values above our box */ int ilower[2] = {0, 4}, iupper[2] = {2, 4}; int stencil_indices[1] = {4}; HYPRE_StructMatrixSetBoxValues(A, ilower, iupper, 1, stencil_indices, values); } { /* values to the left of our box (that do not border the other box on proc. 0) */ int ilower[2] = {0, 3}, iupper[2] = {0, 4}; int stencil_indices[1] = {1}; HYPRE_StructMatrixSetBoxValues(A, ilower, iupper, 1, stencil_indices, values); } free(values); } /* This is a collective call finalizing the matrix assembly. The matrix is now ``ready to be used'' */ HYPRE_StructMatrixAssemble(A); } /* 4. Set up Struct Vectors for b and x. Each processor sets the vectors corresponding to its boxes. */ { /* Create an empty vector object */ HYPRE_StructVectorCreate(MPI_COMM_WORLD, grid, &b); HYPRE_StructVectorCreate(MPI_COMM_WORLD, grid, &x); /* Indicate that the vector coefficients are ready to be set */ HYPRE_StructVectorInitialize(b); HYPRE_StructVectorInitialize(x); /* Set the vector coefficients */ if (myid == 0) { int ilower[2] = {-3, 1}, iupper[2] = {-1, 2}; /* double values[6]; OK to use constant-length arrays for CPUs */ double *values = (double *) malloc(6 * sizeof(double)); /* 6 grid points */ for (i = 0; i < 6; i ++) { values[i] = 1.0; } HYPRE_StructVectorSetBoxValues(b, ilower, iupper, values); for (i = 0; i < 6; i ++) { values[i] = 0.0; } HYPRE_StructVectorSetBoxValues(x, ilower, iupper, values); free(values); } else if (myid == 1) { int ilower[2] = {0, 1}, iupper[2] = {2, 4}; /* double values[12]; OK to use constant-length arrays for CPUs */ double *values = (double *) malloc(12 * sizeof(double)); /* 12 grid points */ for (i = 0; i < 12; i ++) { values[i] = 1.0; } HYPRE_StructVectorSetBoxValues(b, ilower, iupper, values); for (i = 0; i < 12; i ++) { values[i] = 0.0; } HYPRE_StructVectorSetBoxValues(x, ilower, iupper, values); free(values); } /* This is a collective call finalizing the vector assembly. The vectors are now ``ready to be used'' */ HYPRE_StructVectorAssemble(b); HYPRE_StructVectorAssemble(x); } /* 5. Set up and use a solver (See the Reference Manual for descriptions of all of the options.) */ { /* Create an empty PCG Struct solver */ HYPRE_StructPCGCreate(MPI_COMM_WORLD, &solver); /* Set some parameters */ HYPRE_StructPCGSetTol(solver, 1.0e-06); /* convergence tolerance */ HYPRE_StructPCGSetPrintLevel(solver, 2); /* amount of info. printed */ /* Setup and solve */ HYPRE_StructPCGSetup(solver, A, b, x); HYPRE_StructPCGSolve(solver, A, b, x); } /* Save the solution for GLVis visualization, see vis/glvis-ex1.sh */ if (vis) { #ifdef HYPRE_EXVIS GLVis_PrintStructGrid(grid, "vis/ex1.mesh", myid, NULL, NULL); GLVis_PrintStructVector(x, "vis/ex1.sol", myid); GLVis_PrintData("vis/ex1.data", myid, num_procs); #endif } /* Free memory */ HYPRE_StructGridDestroy(grid); HYPRE_StructStencilDestroy(stencil); HYPRE_StructMatrixDestroy(A); HYPRE_StructVectorDestroy(b); HYPRE_StructVectorDestroy(x); HYPRE_StructPCGDestroy(solver); /* Finalize Hypre */ HYPRE_Finalize(); /* Finalize MPI */ MPI_Finalize(); return (0); } hypre-2.33.0/src/examples/ex10.cxx000066400000000000000000000425321477326011500166500ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /* Example 10 Interface: Finite Element Interface (FEI) Compile with: make ex10 Sample run: mpirun -np 4 ex10 -n 120 -solver 2 To see options: ex10 -help Description: This code solves a system corresponding to a discretization of the Laplace equation -Delta u = 1 with zero boundary conditions on the unit square. The domain is split into a n x n grid of quadrilateral elements and each processors owns a horizontal strip of size m x n, where m = n/nprocs. We use bilinear finite element discretization, so there are nodes (vertices) that are shared between neighboring processors. The Finite Element Interface is used to assemble the matrix and solve the problem. Nine different solvers are available. */ #include #include #include #include "_hypre_utilities.h" #include "LLNL_FEI_Impl.h" #include "ex.h" using namespace std; #include "vis.c" int main(int argc, char *argv[]) { int i, j, k; int nprocs, mypid; int n, m, offset; double h; int solverID; int vis; // Initialize MPI MPI_Init(&argc, &argv); MPI_Comm_size(MPI_COMM_WORLD, &nprocs); MPI_Comm_rank(MPI_COMM_WORLD, &mypid); /* Initialize HYPRE */ HYPRE_Initialize(); /* Print GPU info */ /* HYPRE_PrintDeviceInfo(); */ // Set default parameters n = 4 * nprocs; solverID = 2; vis = 0; // Parse command line { int arg_index = 0; int print_usage = 0; while (arg_index < argc) { if ( strcmp(argv[arg_index], "-n") == 0 ) { arg_index++; n = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-solver") == 0 ) { arg_index++; solverID = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-vis") == 0 ) { arg_index++; vis = 1; } else if ( strcmp(argv[arg_index], "-help") == 0 ) { print_usage = 1; break; } else { arg_index++; } } if ((print_usage) && (mypid == 0)) { printf("\n"); printf("Usage: %s []\n", argv[0]); printf("\n"); printf(" -n : problem size per processor (default: %d)\n", 4 * nprocs); printf(" -solver : solver ID\n"); printf(" 0 - DS-PCG\n"); printf(" 1 - ParaSails-PCG\n"); printf(" 2 - AMG-PCG (default)\n"); printf(" 3 - AMGSA-PCG\n"); printf(" 4 - Euclid-PCG\n"); printf(" 5 - DS-GMRES\n"); printf(" 6 - AMG-GMRES\n"); printf(" 7 - AMGSA-GMRES\n"); printf(" 8 - Euclid-GMRES\n"); printf(" -vis : save the solution for GLVis visualization\n"); printf("\n"); } if (print_usage) { MPI_Finalize(); return (0); } } // Each processor owns a m x n grid of quadrilateral finite elements. // The unknowns are located in the nodes (vertices of the mesh) and // are numbered globally starting from the lower left corner and moving // row-wise to the upper right corner. m = n / nprocs; offset = mypid * (m * (n + 1)); h = 1.0 / n; // mesh size // 1. FEI initialization phase // Instantiate the FEI object LLNL_FEI_Impl *feiPtr = new LLNL_FEI_Impl(MPI_COMM_WORLD); // Set the matrix storage type to HYPRE { char **paramStrings = new char*[1]; paramStrings[0] = new char[100]; strcpy(paramStrings[0], "externalSolver HYPRE"); feiPtr->parameters(1, paramStrings); delete [] paramStrings[0]; delete [] paramStrings; } // The unknowns in FEI are called fields. Each field has an // identifier (fieldID) and rank (fieldSize). int nFields = 1; int *fieldSizes = new int[nFields]; fieldSizes[0] = 1; int *fieldIDs = new int[nFields]; fieldIDs[0] = 0; // Pass the field information to the FEI feiPtr->initFields(nFields, fieldSizes, fieldIDs); // Elements are grouped into blocks (in this case one block), and we // have to describe the number of elements in the block (nElems) as // well as the fields (unknowns) per element. int elemBlkID = 0; int nElems = m * n; int elemNNodes = 4; // number of (shared) nodes per element int *nodeNFields = new int[elemNNodes]; // fields per node int **nodeFieldIDs = new int*[elemNNodes]; // node-fields IDs int elemNFields = 0; // number of (non-shared) fields per element int *elemFieldIDs = NULL; // element-fields IDs for (i = 0; i < elemNNodes; i++) { nodeNFields[i] = 1; nodeFieldIDs[i] = new int[nodeNFields[i]]; nodeFieldIDs[i][0] = fieldIDs[0]; } // Pass the block information to the FEI. The interleave parameter // controls how different fields are ordered in the element matrices. int interleave = 0; feiPtr->initElemBlock(elemBlkID, nElems, elemNNodes, nodeNFields, nodeFieldIDs, elemNFields, elemFieldIDs, interleave); // List the global indexes (IDs) of the nodes in each element int **elemConn = new int*[nElems]; for (i = 0; i < m; i++) for (j = 0; j < n; j++) { elemConn[i * n + j] = new int[elemNNodes]; // element with coordinates (i,j) elemConn[i * n + j][0] = offset + i * (n + 1) + j; // node in the lower left elemConn[i * n + j][1] = elemConn[i * n + j][0] + 1; // node in the lower right elemConn[i * n + j][2] = elemConn[i * n + j][1] + n + 1; // node in the upper right elemConn[i * n + j][3] = elemConn[i * n + j][2] - 1; // node in the upper left } // Pass the element topology information to the FEI for (i = 0; i < nElems; i++) { feiPtr->initElem(elemBlkID, i, elemConn[i]); } // List the global indexes of nodes that are shared between processors int nShared, *SharedIDs, *SharedLengs, **SharedProcs; if (mypid == 0) { // Nodes in the top row are shared nShared = n + 1; SharedIDs = new int[nShared]; for (i = 0; i < nShared; i++) { SharedIDs[i] = offset + m * (n + 1) + i; } SharedLengs = new int[nShared]; for (i = 0; i < nShared; i++) { SharedLengs[i] = 2; } SharedProcs = new int*[nShared]; for (i = 0; i < nShared; i++) { SharedProcs[i] = new int[SharedLengs[i]]; SharedProcs[i][0] = mypid; SharedProcs[i][1] = mypid + 1; } } else if (mypid == nprocs - 1) { // Nodes in the bottom row are shared nShared = n + 1; SharedIDs = new int[nShared]; for (i = 0; i < nShared; i++) { SharedIDs[i] = offset + i; } SharedLengs = new int[nShared]; for (i = 0; i < nShared; i++) { SharedLengs[i] = 2; } SharedProcs = new int*[nShared]; for (i = 0; i < nShared; i++) { SharedProcs[i] = new int[SharedLengs[i]]; SharedProcs[i][0] = mypid - 1; SharedProcs[i][1] = mypid; } } else { // Nodes in the top and bottom rows are shared nShared = 2 * (n + 1); SharedIDs = new int[nShared]; for (i = 0; i < n + 1; i++) { SharedIDs[i] = offset + i; SharedIDs[n + 1 + i] = offset + m * (n + 1) + i; } SharedLengs = new int[nShared]; for (i = 0; i < nShared; i++) { SharedLengs[i] = 2; } SharedProcs = new int*[nShared]; for (i = 0; i < n + 1; i++) { SharedProcs[i] = new int[SharedLengs[i]]; SharedProcs[i][0] = mypid - 1; SharedProcs[i][1] = mypid; SharedProcs[n + 1 + i] = new int[SharedLengs[n + 1 + i]]; SharedProcs[n + 1 + i][0] = mypid; SharedProcs[n + 1 + i][1] = mypid + 1; } } // Pass the shared nodes information to the FEI if (nprocs != 1 && nShared > 0) { feiPtr->initSharedNodes(nShared, SharedIDs, SharedLengs, SharedProcs); } // Finish the FEI initialization phase feiPtr->initComplete(); // 2. FEI load phase // Specify the boundary conditions int nBCs, *BCEqn; double **alpha, **beta, **gamma; if (mypid == 0) { // Nodes in the bottom row and left and right columns nBCs = n + 1 + 2 * m; BCEqn = new int[nBCs]; for (i = 0; i < n + 1; i++) { BCEqn[i] = offset + i; } for (i = 0; i < m; i++) { BCEqn[n + 1 + 2 * i] = offset + (i + 1) * (n + 1); BCEqn[n + 2 + 2 * i] = offset + (i + 1) * (n + 1) + n; } } else if (mypid == nprocs - 1) { // Nodes in the top row and left and right columns nBCs = n + 1 + 2 * m; BCEqn = new int[nBCs]; for (i = 0; i < n + 1; i++) { BCEqn[i] = offset + m * (n + 1) + i; } for (i = 0; i < m; i++) { BCEqn[n + 1 + 2 * i] = offset + i * (n + 1); BCEqn[n + 2 + 2 * i] = offset + i * (n + 1) + n; } } else { // Nodes in the left and right columns nBCs = 2 * (m + 1); BCEqn = new int[nBCs]; for (i = 0; i < m + 1; i++) { BCEqn[2 * i] = offset + i * (n + 1); BCEqn[2 * i + 1] = offset + i * (n + 1) + n; } } // The arrays alpha, beta and gamma specify the type of boundary // condition (essential, natural, mixed). The most general form // for Laplace problems is alpha U + beta dU/dn = gamma. In this // example we impose zero Dirichlet boundary conditions. alpha = new double*[nBCs]; beta = new double*[nBCs]; gamma = new double*[nBCs]; for (i = 0; i < nBCs; i++) { alpha[i] = new double[1]; alpha[i][0] = 1.0; beta[i] = new double[1]; beta[i][0] = 0.0; gamma[i] = new double[1]; gamma[i][0] = 0.0; } // Pass the boundary condition information to the FEI feiPtr->loadNodeBCs(nBCs, BCEqn, fieldIDs[0], alpha, beta, gamma); // Specify element stiffness matrices double ***elemStiff = new double**[nElems]; for (i = 0; i < m; i++) for (j = 0; j < n; j++) { // Element with coordinates (i,j) elemStiff[i * n + j] = new double*[elemNNodes]; for (k = 0; k < elemNNodes; k++) { elemStiff[i * n + j][k] = new double[elemNNodes]; } // Stiffness matrix for the reference square // 3 +---+ 2 // | | // 0 +---+ 1 double **A = elemStiff[i * n + j]; for (k = 0; k < 4; k++) { A[k][k] = 2 / 3.; } A[0][1] = A[1][0] = -1 / 6.; A[0][2] = A[2][0] = -1 / 3.; A[0][3] = A[3][0] = -1 / 6.; A[1][2] = A[2][1] = -1 / 6.; A[1][3] = A[3][1] = -1 / 3.; A[2][3] = A[3][2] = -1 / 6.; } // Specify element load vectors double *elemLoad = new double[nElems * elemNNodes]; for (i = 0; i < nElems * elemNNodes; i++) { elemLoad[i] = h * h / 4; } // Assemble the matrix. The elemFormat parameter describes // the storage (symmetric/non-symmetric, row/column-wise) // of the element stiffness matrices. int elemFormat = 0; for (i = 0; i < nElems; i++) feiPtr->sumInElem(elemBlkID, i, elemConn[i], elemStiff[i], &(elemLoad[i * elemNNodes]), elemFormat); // Finish the FEI load phase feiPtr->loadComplete(); // Clean up for (i = 0; i < nElems; i++) { delete [] elemConn[i]; } delete [] elemConn; for (i = 0; i < nElems; i++) { for (j = 0; j < elemNNodes; j++) { delete [] elemStiff[i][j]; } delete [] elemStiff[i]; } delete [] elemStiff; delete [] elemLoad; delete [] BCEqn; for (i = 0; i < nBCs; i++) { delete [] alpha[i]; delete [] beta[i]; delete [] gamma[i]; } delete [] alpha; delete [] beta; delete [] gamma; if (nShared > 0) { delete [] SharedIDs; delete [] SharedLengs; for (i = 0; i < nShared; i++) { delete [] SharedProcs[i]; } delete [] SharedProcs; } delete [] nodeNFields; for (i = 0; i < elemNNodes; i++) { delete [] nodeFieldIDs[i]; } delete [] nodeFieldIDs; delete [] fieldSizes; delete [] fieldIDs; // 3. Set up problem parameters and pass them to the FEI { int nParams = 19; char **paramStrings = new char*[nParams]; for (i = 0; i < nParams; i++) { paramStrings[i] = new char[100]; } strcpy(paramStrings[0], "outputLevel 2"); switch (solverID) { case 0: strcpy(paramStrings[1], "solver cg"); strcpy(paramStrings[2], "preconditioner diagonal"); break; case 1: strcpy(paramStrings[1], "solver cg"); strcpy(paramStrings[2], "preconditioner parasails"); break; default: case 2: strcpy(paramStrings[1], "solver cg"); strcpy(paramStrings[2], "preconditioner boomeramg"); break; case 3: strcpy(paramStrings[1], "solver cg"); strcpy(paramStrings[2], "preconditioner mli"); break; case 4: strcpy(paramStrings[1], "solver cg"); strcpy(paramStrings[2], "preconditioner euclid"); break; case 5: strcpy(paramStrings[1], "solver gmres"); strcpy(paramStrings[2], "preconditioner diagonal"); break; case 6: strcpy(paramStrings[1], "solver gmres"); strcpy(paramStrings[2], "preconditioner boomeramg"); break; case 7: strcpy(paramStrings[1], "solver gmres"); strcpy(paramStrings[2], "preconditioner mli"); break; case 8: strcpy(paramStrings[1], "solver gmres"); strcpy(paramStrings[2], "preconditioner euclid"); break; } strcpy(paramStrings[3], "maxIterations 100"); strcpy(paramStrings[4], "tolerance 1e-6"); strcpy(paramStrings[5], "gmresDim 30"); strcpy(paramStrings[6], "amgNumSweeps 1"); strcpy(paramStrings[7], "amgCoarsenType hmis"); strcpy(paramStrings[8], "amgRelaxType hybridsym"); strcpy(paramStrings[9], "amgSystemSize 1"); strcpy(paramStrings[10], "amgStrongThreshold 0.25"); strcpy(paramStrings[11], "MLI smoother HSGS"); strcpy(paramStrings[12], "MLI numSweeps 1"); strcpy(paramStrings[13], "MLI smootherWeight 1.0"); strcpy(paramStrings[14], "MLI nodeDOF 1"); strcpy(paramStrings[15], "MLI nullSpaceDim 1"); strcpy(paramStrings[16], "MLI minCoarseSize 50"); strcpy(paramStrings[17], "MLI outputLevel 0"); strcpy(paramStrings[18], "parasailsSymmetric outputLevel 0"); feiPtr->parameters(nParams, paramStrings); for (i = 0; i < nParams; i++) { delete [] paramStrings[i]; } delete [] paramStrings; } // 4. Solve the system int status; feiPtr->solve(&status); // 5. Save the solution for GLVis visualization, see vis/glvis-ex10.sh if (vis) { int numNodes, *nodeIDList, *solnOffsets; double *solnValues; // Get the number of nodes in the element block feiPtr->getNumBlockActNodes(elemBlkID, &numNodes); // Get their global IDs nodeIDList = new int[numNodes]; feiPtr->getBlockNodeIDList(elemBlkID, numNodes, nodeIDList); // Get the values corresponding to nodeIDList solnOffsets = new int[numNodes]; solnValues = new double[numNodes]; feiPtr->getBlockNodeSolution(elemBlkID, numNodes, nodeIDList, solnOffsets, solnValues); // Find the location of the ith local node for (i = 0; i < numNodes; i++) { solnOffsets[nodeIDList[i] - offset] = i; } // Save the ordered nodal values to a file char sol_out[20]; sprintf(sol_out, "%s.%06d", "vis/ex10.sol", mypid); ofstream sol(sol_out); sol << "FiniteElementSpace\n" << "FiniteElementCollection: H1_2D_P1\n" << "VDim: 1\n" << "Ordering: 0\n\n"; for (i = 0; i < numNodes; i++) { sol << solnValues[solnOffsets[i]] << endl; } // Save local finite element mesh GLVis_PrintLocalSquareMesh("vis/ex10.mesh", n, m, h, 0, mypid * h * m, mypid); // additional visualization data if (mypid == 0) { char data_out[20]; sprintf(data_out, "%s", "vis/ex10.data"); ofstream data(data_out); data << "np " << nprocs << endl; } // Clean up delete [] solnValues; delete [] solnOffsets; delete [] nodeIDList; } delete feiPtr; /* Finalize HYPRE */ HYPRE_Finalize(); // Finalize MPI MPI_Finalize(); return (0); } hypre-2.33.0/src/examples/ex11.c000066400000000000000000000250771477326011500162760ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /* Example 11 Interface: Linear-Algebraic (IJ) Compile with: make ex11 Sample run: mpirun -np 4 ex11 Description: This example solves the 2-D Laplacian eigenvalue problem with zero boundary conditions on an nxn grid. The number of unknowns is N=n^2. The standard 5-point stencil is used, and we solve for the interior nodes only. We use the same matrix as in Examples 3 and 5. The eigensolver is LOBPCG with AMG preconditioner. */ #include #include #include #include #include "HYPRE.h" #include "HYPRE_parcsr_ls.h" #include "HYPRE_krylov.h" #include "ex.h" /* lobpcg stuff */ #include "HYPRE_lobpcg.h" #ifdef HYPRE_EXVIS #include "_hypre_utilities.h" #include "vis.c" #endif #define my_min(a,b) (((a)<(b)) ? (a) : (b)) int main (int argc, char *argv[]) { int i; int myid, num_procs; int N, n; int blockSize; int ilower, iupper; int local_size, extra; int vis; HYPRE_IJMatrix A; HYPRE_ParCSRMatrix parcsr_A; HYPRE_IJVector b; HYPRE_ParVector par_b; HYPRE_IJVector x; HYPRE_ParVector par_x; HYPRE_Solver precond, lobpcg_solver; mv_InterfaceInterpreter* interpreter; mv_MultiVectorPtr eigenvectors = NULL; mv_MultiVectorPtr constraints = NULL; HYPRE_MatvecFunctions matvec_fn; /* Initialize MPI */ MPI_Init(&argc, &argv); MPI_Comm_rank(MPI_COMM_WORLD, &myid); MPI_Comm_size(MPI_COMM_WORLD, &num_procs); /* Initialize HYPRE */ HYPRE_Initialize(); /* Print GPU info */ /* HYPRE_PrintDeviceInfo(); */ /* Default problem parameters */ n = 33; blockSize = 10; vis = 0; /* Parse command line */ { int arg_index = 0; int print_usage = 0; while (arg_index < argc) { if ( strcmp(argv[arg_index], "-n") == 0 ) { arg_index++; n = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-blockSize") == 0 ) { arg_index++; blockSize = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-vis") == 0 ) { arg_index++; vis = 1; } else if ( strcmp(argv[arg_index], "-help") == 0 ) { print_usage = 1; break; } else { arg_index++; } } if ((print_usage) && (myid == 0)) { printf("\n"); printf("Usage: %s []\n", argv[0]); printf("\n"); printf(" -n : problem size in each direction (default: 33)\n"); printf(" -blockSize : eigenproblem block size (default: 10)\n"); printf(" -vis : save the solution for GLVis visualization\n"); printf("\n"); } if (print_usage) { MPI_Finalize(); return (0); } } /* Preliminaries: want at least one processor per row */ if (n * n < num_procs) { n = sqrt(num_procs) + 1; } N = n * n; /* global number of rows */ /* Each processor knows only of its own rows - the range is denoted by ilower and iupper. Here we partition the rows. We account for the fact that N may not divide evenly by the number of processors. */ local_size = N / num_procs; extra = N - local_size * num_procs; ilower = local_size * myid; ilower += my_min(myid, extra); iupper = local_size * (myid + 1); iupper += my_min(myid + 1, extra); iupper = iupper - 1; /* How many rows do I have? */ local_size = iupper - ilower + 1; /* Create the matrix. Note that this is a square matrix, so we indicate the row partition size twice (since number of rows = number of cols) */ HYPRE_IJMatrixCreate(MPI_COMM_WORLD, ilower, iupper, ilower, iupper, &A); /* Choose a parallel csr format storage (see the User's Manual) */ HYPRE_IJMatrixSetObjectType(A, HYPRE_PARCSR); /* Initialize before setting coefficients */ HYPRE_IJMatrixInitialize(A); /* Now go through my local rows and set the matrix entries. Each row has at most 5 entries. For example, if n=3: A = [M -I 0; -I M -I; 0 -I M] M = [4 -1 0; -1 4 -1; 0 -1 4] Note that here we are setting one row at a time, though one could set all the rows together (see the User's Manual). */ { int nnz; /* double values[5]; * int cols[5]; OK to use constant-length arrays for CPUs */ double *values = (double *) malloc(5 * sizeof(double)); int *cols = (int *) malloc(5 * sizeof(int)); for (i = ilower; i <= iupper; i++) { nnz = 0; /* The left identity block:position i-n */ if ((i - n) >= 0) { cols[nnz] = i - n; values[nnz] = -1.0; nnz++; } /* The left -1: position i-1 */ if (i % n) { cols[nnz] = i - 1; values[nnz] = -1.0; nnz++; } /* Set the diagonal: position i */ cols[nnz] = i; values[nnz] = 4.0; nnz++; /* The right -1: position i+1 */ if ((i + 1) % n) { cols[nnz] = i + 1; values[nnz] = -1.0; nnz++; } /* The right identity block:position i+n */ if ((i + n) < N) { cols[nnz] = i + n; values[nnz] = -1.0; nnz++; } /* Set the values for row i */ HYPRE_IJMatrixSetValues(A, 1, &nnz, &i, cols, values); } free(values); free(cols); } /* Assemble after setting the coefficients */ HYPRE_IJMatrixAssemble(A); /* Get the parcsr matrix object to use */ HYPRE_IJMatrixGetObject(A, (void**) &parcsr_A); /* Create sample rhs and solution vectors */ HYPRE_IJVectorCreate(MPI_COMM_WORLD, ilower, iupper, &b); HYPRE_IJVectorSetObjectType(b, HYPRE_PARCSR); HYPRE_IJVectorInitialize(b); HYPRE_IJVectorAssemble(b); HYPRE_IJVectorGetObject(b, (void **) &par_b); HYPRE_IJVectorCreate(MPI_COMM_WORLD, ilower, iupper, &x); HYPRE_IJVectorSetObjectType(x, HYPRE_PARCSR); HYPRE_IJVectorInitialize(x); HYPRE_IJVectorAssemble(x); HYPRE_IJVectorGetObject(x, (void **) &par_x); /* Create a preconditioner and solve the eigenproblem */ /* AMG preconditioner */ { HYPRE_BoomerAMGCreate(&precond); HYPRE_BoomerAMGSetPrintLevel(precond, 1); /* print amg solution info */ HYPRE_BoomerAMGSetNumSweeps(precond, 2); /* 2 sweeps of smoothing */ HYPRE_BoomerAMGSetTol(precond, 0.0); /* conv. tolerance zero */ HYPRE_BoomerAMGSetMaxIter(precond, 1); /* do only one iteration! */ } /* LOBPCG eigensolver */ { double mytime = 0.0; double walltime = 0.0; int maxIterations = 100; /* maximum number of iterations */ int pcgMode = 1; /* use rhs as initial guess for inner pcg iterations */ int verbosity = 1; /* print iterations info */ double tol = 1.e-8; /* absolute tolerance (all eigenvalues) */ int lobpcgSeed = 775; /* random seed */ double *eigenvalues = NULL; if (myid != 0) { verbosity = 0; } /* define an interpreter for the ParCSR interface */ interpreter = (mv_InterfaceInterpreter *) calloc(1, sizeof(mv_InterfaceInterpreter)); HYPRE_ParCSRSetupInterpreter(interpreter); HYPRE_ParCSRSetupMatvec(&matvec_fn); /* eigenvectors - create a multivector */ eigenvectors = mv_MultiVectorCreateFromSampleVector(interpreter, blockSize, par_x); mv_MultiVectorSetRandom (eigenvectors, lobpcgSeed); /* eigenvalues - allocate space */ eigenvalues = (double*) calloc( blockSize, sizeof(double) ); HYPRE_LOBPCGCreate(interpreter, &matvec_fn, &lobpcg_solver); HYPRE_LOBPCGSetMaxIter(lobpcg_solver, maxIterations); HYPRE_LOBPCGSetPrecondUsageMode(lobpcg_solver, pcgMode); HYPRE_LOBPCGSetTol(lobpcg_solver, tol); HYPRE_LOBPCGSetPrintLevel(lobpcg_solver, verbosity); /* use a preconditioner */ HYPRE_LOBPCGSetPrecond(lobpcg_solver, (HYPRE_PtrToSolverFcn) HYPRE_BoomerAMGSolve, (HYPRE_PtrToSolverFcn) HYPRE_BoomerAMGSetup, precond); HYPRE_LOBPCGSetup(lobpcg_solver, (HYPRE_Matrix)parcsr_A, (HYPRE_Vector)par_b, (HYPRE_Vector)par_x); mytime -= MPI_Wtime(); HYPRE_LOBPCGSolve(lobpcg_solver, constraints, eigenvectors, eigenvalues ); mytime += MPI_Wtime(); MPI_Allreduce(&mytime, &walltime, 1, MPI_DOUBLE, MPI_MAX, MPI_COMM_WORLD); if (myid == 0) { printf("\nLOBPCG Solve time = %f seconds\n\n", walltime); } /* clean-up */ HYPRE_BoomerAMGDestroy(precond); HYPRE_LOBPCGDestroy(lobpcg_solver); free(eigenvalues); free(interpreter); } /* Save the solution for GLVis visualization, see vis/glvis-ex11.sh */ if (vis) { #ifdef HYPRE_EXVIS FILE *file; char filename[255]; int nvalues = local_size; double *values; /* eigenvectors - get a pointer */ mv_TempMultiVector* tmp = (mv_TempMultiVector*) mv_MultiVectorGetData(eigenvectors); HYPRE_ParVector* pvx = (HYPRE_ParVector*)(tmp -> vector); /* get the local solution */ values = hypre_VectorData(hypre_ParVectorLocalVector( (hypre_ParVector*)pvx[blockSize - 1])); sprintf(filename, "%s.%06d", "vis/ex11.sol", myid); if ((file = fopen(filename, "w")) == NULL) { printf("Error: can't open output file %s\n", filename); MPI_Finalize(); exit(1); } /* save solution */ for (i = 0; i < nvalues; i++) { fprintf(file, "%.14e\n", values[i]); } fflush(file); fclose(file); /* save global finite element mesh */ if (myid == 0) { GLVis_PrintGlobalSquareMesh("vis/ex11.mesh", n - 1); } #endif } /* Clean up */ HYPRE_IJMatrixDestroy(A); HYPRE_IJVectorDestroy(b); HYPRE_IJVectorDestroy(x); /* Finalize HYPRE */ HYPRE_Finalize(); /* Finalize MPI*/ MPI_Finalize(); return (0); } hypre-2.33.0/src/examples/ex12.c000066400000000000000000000444041477326011500162720ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /* Example 12 Interface: Semi-Structured interface (SStruct) Compile with: make ex12 (may need to edit HYPRE_DIR in Makefile) Sample runs: mpirun -np 2 ex12 -pfmg mpirun -np 2 ex12 -boomeramg Description: The grid layout is the same as ex1, but with nodal unknowns. The solver is PCG preconditioned with either PFMG or BoomerAMG, selected on the command line. We recommend viewing the Struct examples before viewing this and the other SStruct examples. This is one of the simplest SStruct examples, used primarily to demonstrate how to set up non-cell-centered problems, and to demonstrate how easy it is to switch between structured solvers (PFMG) and solvers designed for more general settings (AMG). */ #include #include #include #include "HYPRE_sstruct_ls.h" #include "HYPRE_parcsr_ls.h" #include "HYPRE_krylov.h" #include "ex.h" #ifdef HYPRE_EXVIS #include "vis.c" #endif int main (int argc, char *argv[]) { int i, j, myid, num_procs; int vis = 0; HYPRE_SStructGrid grid; HYPRE_SStructGraph graph; HYPRE_SStructStencil stencil; HYPRE_SStructMatrix A; HYPRE_SStructVector b; HYPRE_SStructVector x; /* We only have one part and one variable */ int nparts = 1; int nvars = 1; int part = 0; int var = 0; int precond_id = 1; int object_type = HYPRE_STRUCT; /* Initialize MPI */ MPI_Init(&argc, &argv); MPI_Comm_rank(MPI_COMM_WORLD, &myid); MPI_Comm_size(MPI_COMM_WORLD, &num_procs); /* Initialize HYPRE */ HYPRE_Initialize(); /* Print GPU info */ /* HYPRE_PrintDeviceInfo(); */ if (num_procs != 2) { if (myid == 0) { printf("Must run with 2 processors!\n"); } exit(1); } /* Parse command line */ { int arg_index = 0; int print_usage = 0; while (arg_index < argc) { if ( strcmp(argv[arg_index], "-pfmg") == 0 ) { arg_index++; precond_id = 1; object_type = HYPRE_STRUCT; } else if ( strcmp(argv[arg_index], "-boomeramg") == 0 ) { arg_index++; precond_id = 2; object_type = HYPRE_PARCSR; } else if ( strcmp(argv[arg_index], "-vis") == 0 ) { arg_index++; vis = 1; } else if ( strcmp(argv[arg_index], "-help") == 0 ) { print_usage = 1; break; } else { arg_index++; } } if ((print_usage) && (myid == 0)) { printf("\n"); printf("Usage: %s []\n", argv[0]); printf("\n"); printf(" -pfmg : use the structured PFMG solver (default)\n"); printf(" -boomeramg : use the unstructured BoomerAMG solver\n"); printf(" -vis : save the solution for GLVis visualization\n"); printf("\n"); } if (print_usage) { MPI_Finalize(); return (0); } } /* 1. Set up the grid. Here we use only one part. Each processor describes the piece of the grid that it owns. */ { /* Create an empty 2D grid object */ HYPRE_SStructGridCreate(MPI_COMM_WORLD, 2, nparts, &grid); /* Add boxes to the grid */ if (myid == 0) { int ilower[2] = {-3, 1}, iupper[2] = {-1, 2}; HYPRE_SStructGridSetExtents(grid, part, ilower, iupper); } else if (myid == 1) { int ilower[2] = {0, 1}, iupper[2] = {2, 4}; HYPRE_SStructGridSetExtents(grid, part, ilower, iupper); } /* Set the variable type and number of variables on each part. */ { HYPRE_SStructVariable vartypes[1] = {HYPRE_SSTRUCT_VARIABLE_NODE}; HYPRE_SStructGridSetVariables(grid, part, nvars, vartypes); } /* This is a collective call finalizing the grid assembly. The grid is now ``ready to be used'' */ HYPRE_SStructGridAssemble(grid); } /* 2. Define the discretization stencil */ { /* Create an empty 2D, 5-pt stencil object */ HYPRE_SStructStencilCreate(2, 5, &stencil); /* Define the geometry of the stencil. Each represents a relative offset (in the index space). */ { int entry; int offsets[5][2] = {{0, 0}, {-1, 0}, {1, 0}, {0, -1}, {0, 1}}; /* Assign numerical values to the offsets so that we can easily refer to them - the last argument indicates the variable for which we are assigning this stencil */ for (entry = 0; entry < 5; entry++) { HYPRE_SStructStencilSetEntry(stencil, entry, offsets[entry], var); } } } /* 3. Set up the Graph - this determines the non-zero structure of the matrix and allows non-stencil relationships between the parts */ { /* Create the graph object */ HYPRE_SStructGraphCreate(MPI_COMM_WORLD, grid, &graph); /* See MatrixSetObjectType below */ HYPRE_SStructGraphSetObjectType(graph, object_type); /* Now we need to tell the graph which stencil to use for each variable on each part (we only have one variable and one part) */ HYPRE_SStructGraphSetStencil(graph, part, var, stencil); /* Here we could establish connections between parts if we had more than one part using the graph. For example, we could use HYPRE_GraphAddEntries() routine or HYPRE_GridSetNeighborPart() */ /* Assemble the graph */ HYPRE_SStructGraphAssemble(graph); } /* 4. Set up a SStruct Matrix */ { /* Create an empty matrix object */ HYPRE_SStructMatrixCreate(MPI_COMM_WORLD, graph, &A); /* Set the object type (by default HYPRE_SSTRUCT). This determines the data structure used to store the matrix. For PFMG we need to use HYPRE_STRUCT, and for BoomerAMG we need HYPRE_PARCSR (set above). */ HYPRE_SStructMatrixSetObjectType(A, object_type); /* Get ready to set values */ HYPRE_SStructMatrixInitialize(A); /* Set the matrix coefficients. Each processor assigns coefficients for the boxes in the grid that it owns. Note that the coefficients associated with each stencil entry may vary from grid point to grid point if desired. Here, we first set the same stencil entries for each grid point. Then we make modifications to grid points near the boundary. Note that the ilower values are different from those used in ex1 because of the way nodal variables are referenced. Also note that some of the stencil values are set on both processor 0 and processor 1. See the User and Reference manuals for more details. */ if (myid == 0) { int ilower[2] = {-4, 0}, iupper[2] = {-1, 2}; int stencil_indices[5] = {0, 1, 2, 3, 4}; /* labels for the stencil entries - these correspond to the offsets defined above */ int nentries = 5; int nvalues = 60; /* 12 grid points, each with 5 stencil entries */ /* double values[60]; OK to use constant-length arrays for CPUs */ double *values = (double *) malloc(60 * sizeof(double)); for (i = 0; i < nvalues; i += nentries) { values[i] = 4.0; for (j = 1; j < nentries; j++) { values[i + j] = -1.0; } } HYPRE_SStructMatrixSetBoxValues(A, part, ilower, iupper, var, nentries, stencil_indices, values); free(values); } else if (myid == 1) { int ilower[2] = {-1, 0}, iupper[2] = {2, 4}; int stencil_indices[5] = {0, 1, 2, 3, 4}; int nentries = 5; int nvalues = 100; /* 20 grid points, each with 5 stencil entries */ /* double values[100]; OK to use constant-length array for CPUs */ double *values = (double *) malloc(100 * sizeof(double)); for (i = 0; i < nvalues; i += nentries) { values[i] = 4.0; for (j = 1; j < nentries; j++) { values[i + j] = -1.0; } } HYPRE_SStructMatrixSetBoxValues(A, part, ilower, iupper, var, nentries, stencil_indices, values); free(values); } /* Set the coefficients reaching outside of the boundary to 0. Note that * both ilower *and* iupper may be different from those in ex1. */ if (myid == 0) { /* double values[4]; OK to use constant-length array for CPUs */ double *values = (double *) malloc(4 * sizeof(double)); for (i = 0; i < 4; i++) { values[i] = 0.0; } { /* values below our box */ int ilower[2] = {-4, 0}, iupper[2] = {-1, 0}; int stencil_indices[1] = {3}; HYPRE_SStructMatrixSetBoxValues(A, part, ilower, iupper, var, 1, stencil_indices, values); } { /* values to the left of our box */ int ilower[2] = {-4, 0}, iupper[2] = {-4, 2}; int stencil_indices[1] = {1}; HYPRE_SStructMatrixSetBoxValues(A, part, ilower, iupper, var, 1, stencil_indices, values); } { /* values above our box */ int ilower[2] = {-4, 2}, iupper[2] = {-2, 2}; int stencil_indices[1] = {4}; HYPRE_SStructMatrixSetBoxValues(A, part, ilower, iupper, var, 1, stencil_indices, values); } free(values); } else if (myid == 1) { /* double values[5]; OK to use constant-length array for CPUs */ double *values = (double *) malloc(5 * sizeof(double)); for (i = 0; i < 5; i++) { values[i] = 0.0; } { /* values below our box */ int ilower[2] = {-1, 0}, iupper[2] = {2, 0}; int stencil_indices[1] = {3}; HYPRE_SStructMatrixSetBoxValues(A, part, ilower, iupper, var, 1, stencil_indices, values); } { /* values to the right of our box */ int ilower[2] = {2, 0}, iupper[2] = {2, 4}; int stencil_indices[1] = {2}; HYPRE_SStructMatrixSetBoxValues(A, part, ilower, iupper, var, 1, stencil_indices, values); } { /* values above our box */ int ilower[2] = {-1, 4}, iupper[2] = {2, 4}; int stencil_indices[1] = {4}; HYPRE_SStructMatrixSetBoxValues(A, part, ilower, iupper, var, 1, stencil_indices, values); } { /* values to the left of our box (that do not border the other box on proc. 0) */ int ilower[2] = {-1, 3}, iupper[2] = {-1, 4}; int stencil_indices[1] = {1}; HYPRE_SStructMatrixSetBoxValues(A, part, ilower, iupper, var, 1, stencil_indices, values); } free(values); } /* This is a collective call finalizing the matrix assembly. The matrix is now ``ready to be used'' */ HYPRE_SStructMatrixAssemble(A); } /* 5. Set up SStruct Vectors for b and x. */ { /* Create an empty vector object */ HYPRE_SStructVectorCreate(MPI_COMM_WORLD, grid, &b); HYPRE_SStructVectorCreate(MPI_COMM_WORLD, grid, &x); /* As with the matrix, set the appropriate object type for the vectors */ HYPRE_SStructVectorSetObjectType(b, object_type); HYPRE_SStructVectorSetObjectType(x, object_type); /* Indicate that the vector coefficients are ready to be set */ HYPRE_SStructVectorInitialize(b); HYPRE_SStructVectorInitialize(x); /* Set the vector coefficients. Again, note that the ilower values are different from those used in ex1, and some of the values are set on both processors. */ if (myid == 0) { int ilower[2] = {-4, 0}, iupper[2] = {-1, 2}; /* double values[12]; OK to use constant-length array for CPUs */ double *values = (double *) malloc(12 * sizeof(double)); /* 12 grid points */ for (i = 0; i < 12; i ++) { values[i] = 1.0; } HYPRE_SStructVectorSetBoxValues(b, part, ilower, iupper, var, values); for (i = 0; i < 12; i ++) { values[i] = 0.0; } HYPRE_SStructVectorSetBoxValues(x, part, ilower, iupper, var, values); free(values); } else if (myid == 1) { int ilower[2] = {0, 1}, iupper[2] = {2, 4}; /* double values[20]; OK to use constant-length array for CPUs */ double *values = (double *) malloc(20 * sizeof(double)); /* 20 grid points */ for (i = 0; i < 20; i ++) { values[i] = 1.0; } HYPRE_SStructVectorSetBoxValues(b, part, ilower, iupper, var, values); for (i = 0; i < 20; i ++) { values[i] = 0.0; } HYPRE_SStructVectorSetBoxValues(x, part, ilower, iupper, var, values); free(values); } /* This is a collective call finalizing the vector assembly. The vectors are now ``ready to be used'' */ HYPRE_SStructVectorAssemble(b); HYPRE_SStructVectorAssemble(x); } /* 6. Set up and use a solver (See the Reference Manual for descriptions of all of the options.) */ if (precond_id == 1) /* PFMG */ { HYPRE_StructMatrix sA; HYPRE_StructVector sb; HYPRE_StructVector sx; HYPRE_StructSolver solver; HYPRE_StructSolver precond; /* Because we are using a struct solver, we need to get the object of the matrix and vectors to pass in to the struct solvers */ HYPRE_SStructMatrixGetObject(A, (void **) &sA); HYPRE_SStructVectorGetObject(b, (void **) &sb); HYPRE_SStructVectorGetObject(x, (void **) &sx); /* Create an empty PCG Struct solver */ HYPRE_StructPCGCreate(MPI_COMM_WORLD, &solver); /* Set PCG parameters */ HYPRE_StructPCGSetTol(solver, 1.0e-06); HYPRE_StructPCGSetPrintLevel(solver, 2); HYPRE_StructPCGSetMaxIter(solver, 50); /* Create the Struct PFMG solver for use as a preconditioner */ HYPRE_StructPFMGCreate(MPI_COMM_WORLD, &precond); /* Set PFMG parameters */ HYPRE_StructPFMGSetMaxIter(precond, 1); HYPRE_StructPFMGSetTol(precond, 0.0); HYPRE_StructPFMGSetZeroGuess(precond); HYPRE_StructPFMGSetNumPreRelax(precond, 2); HYPRE_StructPFMGSetNumPostRelax(precond, 2); /* non-Galerkin coarse grid (more efficient for this problem) */ HYPRE_StructPFMGSetRAPType(precond, 1); /* R/B Gauss-Seidel */ HYPRE_StructPFMGSetRelaxType(precond, 2); /* skip relaxation on some levels (more efficient for this problem) */ HYPRE_StructPFMGSetSkipRelax(precond, 1); /* Set preconditioner and solve */ HYPRE_StructPCGSetPrecond(solver, HYPRE_StructPFMGSolve, HYPRE_StructPFMGSetup, precond); HYPRE_StructPCGSetup(solver, sA, sb, sx); HYPRE_StructPCGSolve(solver, sA, sb, sx); /* Free memory */ HYPRE_StructPCGDestroy(solver); HYPRE_StructPFMGDestroy(precond); } else if (precond_id == 2) /* BoomerAMG */ { HYPRE_ParCSRMatrix parA; HYPRE_ParVector parb; HYPRE_ParVector parx; HYPRE_Solver solver; HYPRE_Solver precond; /* Because we are using a struct solver, we need to get the object of the matrix and vectors to pass in to the struct solvers */ HYPRE_SStructMatrixGetObject(A, (void **) &parA); HYPRE_SStructVectorGetObject(b, (void **) &parb); HYPRE_SStructVectorGetObject(x, (void **) &parx); /* Create an empty PCG Struct solver */ HYPRE_ParCSRPCGCreate(MPI_COMM_WORLD, &solver); /* Set PCG parameters */ HYPRE_ParCSRPCGSetTol(solver, 1.0e-06); HYPRE_ParCSRPCGSetPrintLevel(solver, 2); HYPRE_ParCSRPCGSetMaxIter(solver, 50); /* Create the BoomerAMG solver for use as a preconditioner */ HYPRE_BoomerAMGCreate(&precond); /* Set BoomerAMG parameters */ HYPRE_BoomerAMGSetMaxIter(precond, 1); HYPRE_BoomerAMGSetTol(precond, 0.0); HYPRE_BoomerAMGSetPrintLevel(precond, 1); /* print amg solution info */ HYPRE_BoomerAMGSetRelaxType(precond, 6); /* Sym G.S./Jacobi hybrid */ HYPRE_BoomerAMGSetNumSweeps(precond, 1); /* Set preconditioner and solve */ HYPRE_ParCSRPCGSetPrecond(solver, HYPRE_BoomerAMGSolve, HYPRE_BoomerAMGSetup, precond); HYPRE_ParCSRPCGSetup(solver, parA, parb, parx); HYPRE_ParCSRPCGSolve(solver, parA, parb, parx); /* Free memory */ HYPRE_ParCSRPCGDestroy(solver); HYPRE_BoomerAMGDestroy(precond); } /* Save the solution for GLVis visualization, see vis/glvis-ex12.sh */ if (vis) { #ifdef HYPRE_EXVIS /* Gather the solution vector */ HYPRE_SStructVectorGather(x); GLVis_PrintSStructGrid(grid, "vis/ex12.mesh", myid, NULL, NULL); GLVis_PrintSStructVector(x, 0, "vis/ex12.sol", myid); GLVis_PrintData("vis/ex12.data", myid, num_procs); #endif } /* Free memory */ HYPRE_SStructGridDestroy(grid); HYPRE_SStructStencilDestroy(stencil); HYPRE_SStructGraphDestroy(graph); HYPRE_SStructMatrixDestroy(A); HYPRE_SStructVectorDestroy(b); HYPRE_SStructVectorDestroy(x); /* Finalize HYPRE */ HYPRE_Finalize(); /* Finalize MPI */ MPI_Finalize(); return (0); } hypre-2.33.0/src/examples/ex12cuf.cuf000066400000000000000000000406041477326011500173210ustar00rootroot00000000000000! Copyright (c) 1998 Lawrence Livermore National Security, LLC and other ! HYPRE Project Developers. See the top-level COPYRIGHT file for details. ! ! SPDX-License-Identifier: (Apache-2.0 OR MIT) ! ! Example 12 ! ! Interface: Semi-Structured interface (SStruct) ! ! Compile with: make ex12f (may need to edit HYPRE_DIR in Makefile) ! ! Sample runs: mpirun -np 2 ex12f ! ! Description: The grid layout is the same as ex1, but with nodal ! unknowns. The solver is PCG preconditioned with either PFMG or ! BoomerAMG, set with 'precond_id' below. ! ! We recommend viewing the Struct examples before viewing this and ! the other SStruct examples. This is one of the simplest SStruct ! examples, used primarily to demonstrate how to set up ! non-cell-centered problems, and to demonstrate how easy it is to ! switch between structured solvers (PFMG) and solvers designed for ! more general settings (AMG). ! program ex12f implicit none include 'mpif.h' include 'HYPREf.h' integer ierr integer i, j, myid, num_procs integer*8 grid integer*8 graph integer*8 stencil integer*8 A integer*8 b integer*8 x integer nparts integer nvars integer part integer var integer precond_id, object_type integer ilower(2), iupper(2) integer vartypes(1) integer offsets(2,5) integer ent integer nentries, nvalues, stencil_indices(5) double precision tol double precision, managed, allocatable :: values(:) ! This comes from 'sstruct_mv/HYPRE_sstruct_mv.h' integer HYPRE_SSTRUCT_VARIABLE_NODE parameter( HYPRE_SSTRUCT_VARIABLE_NODE = 1 ) integer*8 sA integer*8 sb integer*8 sx integer*8 parA integer*8 parb integer*8 parx integer*8 solver integer*8 precond character*32 matfile allocate(values(100)) ! We only have one part and one variable nparts = 1 nvars = 1 part = 0 var = 0 ! Initialize MPI call MPI_Init(ierr) call MPI_Comm_rank(MPI_COMM_WORLD, myid, ierr) call MPI_Comm_size(MPI_COMM_WORLD, num_procs, ierr) call HYPRE_Initialize(ierr) if (num_procs .ne. 2) then if (myid .eq. 0) then print *, "Must run with 2 processors!" stop endif endif ! Set preconditioner id (PFMG = 1, BoomerAMG = 2) precond_id = 1 if (precond_id .eq. 1) then object_type = HYPRE_STRUCT else if (precond_id .eq. 2) then object_type = HYPRE_PARCSR else if (myid .eq. 0) then print *, "Invalid solver!" stop endif endif !----------------------------------------------------------------------- ! 1. Set up the grid. Here we use only one part. Each processor ! describes the piece of the grid that it owns. !----------------------------------------------------------------------- ! Create an empty 2D grid object call HYPRE_SStructGridCreate(MPI_COMM_WORLD, 2, nparts, grid, & ierr) ! Add boxes to the grid if (myid .eq. 0) then ilower(1) = -3 ilower(2) = 1 iupper(1) = -1 iupper(2) = 2 call HYPRE_SStructGridSetExtents(grid, part, ilower, iupper, & ierr) else if (myid .eq. 1) then ilower(1) = 0 ilower(2) = 1 iupper(1) = 2 iupper(2) = 4 call HYPRE_SStructGridSetExtents(grid, part, ilower, iupper, & ierr) endif ! Set the variable type and number of variables on each part vartypes(1) = HYPRE_SSTRUCT_VARIABLE_NODE call HYPRE_SStructGridSetVariables(grid, part, nvars, vartypes, & ierr) ! This is a collective call finalizing the grid assembly call HYPRE_SStructGridAssemble(grid, ierr) !----------------------------------------------------------------------- ! 2. Define the discretization stencil !----------------------------------------------------------------------- ! Create an empty 2D, 5-pt stencil object call HYPRE_SStructStencilCreate(2, 5, stencil, ierr) ! Define the geometry of the stencil. Each represents a relative ! offset (in the index space). offsets(1,1) = 0 offsets(2,1) = 0 offsets(1,2) = -1 offsets(2,2) = 0 offsets(1,3) = 1 offsets(2,3) = 0 offsets(1,4) = 0 offsets(2,4) = -1 offsets(1,5) = 0 offsets(2,5) = 1 ! Assign numerical values to the offsets so that we can easily refer ! to them - the last argument indicates the variable for which we ! are assigning this stencil do ent = 1, 5 call HYPRE_SStructStencilSetEntry(stencil, & ent-1, offsets(1,ent), var, ierr) enddo !----------------------------------------------------------------------- ! 3. Set up the Graph - this determines the non-zero structure of ! the matrix and allows non-stencil relationships between the parts !----------------------------------------------------------------------- ! Create the graph object call HYPRE_SStructGraphCreate(MPI_COMM_WORLD, grid, graph, ierr) ! See MatrixSetObjectType below call HYPRE_SStructGraphSetObjectType(graph, object_type, ierr) ! Now we need to tell the graph which stencil to use for each ! variable on each part (we only have one variable and one part) call HYPRE_SStructGraphSetStencil(graph, part, var, stencil, ierr) ! Here we could establish connections between parts if we had more ! than one part using the graph. For example, we could use ! HYPRE_GraphAddEntries() routine or HYPRE_GridSetNeighborPart() ! Assemble the graph call HYPRE_SStructGraphAssemble(graph, ierr) !----------------------------------------------------------------------- ! 4. Set up a SStruct Matrix !----------------------------------------------------------------------- ! Create an empty matrix object call HYPRE_SStructMatrixCreate(MPI_COMM_WORLD, graph, A, ierr) ! Set the object type (by default HYPRE_SSTRUCT). This determines ! the data structure used to store the matrix. For PFMG we use ! HYPRE_STRUCT, and for BoomerAMG we use HYPRE_PARCSR (set above). call HYPRE_SStructMatrixSetObjectTyp(A, object_type, ierr) ! Get ready to set values call HYPRE_SStructMatrixInitialize(A, ierr) ! Set the matrix coefficients. Each processor assigns coefficients ! for the boxes in the grid that it owns. Note that the ! coefficients associated with each stencil entry may vary from grid ! point to grid point if desired. Here, we first set the same ! stencil entries for each grid point. Then we make modifications ! to grid points near the boundary. Note that the ilower values are ! different from those used in ex1 because of the way nodal ! variables are referenced. Also note that some of the stencil ! values are set on both processor 0 and processor 1. See the User ! and Reference manuals for more details. ! Stencil entry labels correspond to the offsets defined above do i = 1, 5 stencil_indices(i) = i-1 enddo nentries = 5 if (myid .eq. 0) then ilower(1) = -4 ilower(2) = 0 iupper(1) = -1 iupper(2) = 2 ! 12 grid points, each with 5 stencil entries nvalues = 60 else if (myid .eq. 1) then ilower(1) = -1 ilower(2) = 0 iupper(1) = 2 iupper(2) = 4 ! 12 grid points, each with 5 stencil entries nvalues = 100 endif do i = 1, nvalues, nentries values(i) = 4.0 do j = 1, nentries-1 values(i+j) = -1.0 enddo enddo call HYPRE_SStructMatrixSetBoxValues(A, part, ilower, iupper, & var, nentries, stencil_indices, values, ierr) ! Set the coefficients reaching outside of the boundary to 0. Note ! that both ilower *and* iupper may be different from those in ex1. do i = 1, 5 values(i) = 0.0 enddo if (myid .eq. 0) then ! values below our box ilower(1) = -4 ilower(2) = 0 iupper(1) = -1 iupper(2) = 0 stencil_indices(1) = 3 call HYPRE_SStructMatrixSetBoxValues(A, part, ilower, iupper, & var, 1, stencil_indices, values, ierr) ! values to the left of our box ilower(1) = -4 ilower(2) = 0 iupper(1) = -4 iupper(2) = 2 stencil_indices(1) = 1 call HYPRE_SStructMatrixSetBoxValues(A, part, ilower, iupper, & var, 1, stencil_indices, values, ierr) ! values above our box ilower(1) = -4 ilower(2) = 2 iupper(1) = -2 iupper(2) = 2 stencil_indices(1) = 4 call HYPRE_SStructMatrixSetBoxValues(A, part, ilower, iupper, & var, 1, stencil_indices, values, ierr) else if (myid .eq. 1) then ! values below our box ilower(1) = -1 ilower(2) = 0 iupper(1) = 2 iupper(2) = 0 stencil_indices(1) = 3 call HYPRE_SStructMatrixSetBoxValues(A, part, ilower, iupper, & var, 1, stencil_indices, values, ierr) ! values to the right of our box ilower(1) = 2 ilower(2) = 0 iupper(1) = 2 iupper(2) = 4 stencil_indices(1) = 2 call HYPRE_SStructMatrixSetBoxValues(A, part, ilower, iupper, & var, 1, stencil_indices, values, ierr) ! values above our box ilower(1) = -1 ilower(2) = 4 iupper(1) = 2 iupper(2) = 4 stencil_indices(1) = 4 call HYPRE_SStructMatrixSetBoxValues(A, part, ilower, iupper, & var, 1, stencil_indices, values, ierr) ! values to the left of our box ! (that do not border the other box on proc. 0) ilower(1) = -1 ilower(2) = 3 iupper(1) = -1 iupper(2) = 4 stencil_indices(1) = 1 call HYPRE_SStructMatrixSetBoxValues(A, part, ilower, iupper, & var, 1, stencil_indices, values, ierr) endif ! This is a collective call finalizing the matrix assembly call HYPRE_SStructMatrixAssemble(A, ierr) ! matfile = 'ex12f.out' ! matfile(10:10) = char(0) ! call HYPRE_SStructMatrixPrint(matfile, A, 0, ierr) ! Create an empty vector object call HYPRE_SStructVectorCreate(MPI_COMM_WORLD, grid, b, ierr) call HYPRE_SStructVectorCreate(MPI_COMM_WORLD, grid, x, ierr) ! As with the matrix, set the appropriate object type for the vectors call HYPRE_SStructVectorSetObjectTyp(b, object_type, ierr) call HYPRE_SStructVectorSetObjectTyp(x, object_type, ierr) ! Indicate that the vector coefficients are ready to be set call HYPRE_SStructVectorInitialize(b, ierr) call HYPRE_SStructVectorInitialize(x, ierr) ! Set the vector coefficients. Again, note that the ilower values ! are different from those used in ex1, and some of the values are ! set on both processors. if (myid .eq. 0) then ilower(1) = -4 ilower(2) = 0 iupper(1) = -1 iupper(2) = 2 do i = 1, 12 values(i) = 1.0 enddo call HYPRE_SStructVectorSetBoxValues(b, part, ilower, iupper, & var, values, ierr) do i = 1, 12 values(i) = 0.0 enddo call HYPRE_SStructVectorSetBoxValues(x, part, ilower, iupper, & var, values, ierr) else if (myid .eq. 1) then ilower(1) = 0 ilower(2) = 1 iupper(1) = 2 iupper(2) = 4 do i = 1, 20 values(i) = 1.0 enddo call HYPRE_SStructVectorSetBoxValues(b, part, ilower, iupper, & var, values, ierr) do i = 1, 20 values(i) = 0.0 enddo call HYPRE_SStructVectorSetBoxValues(x, part, ilower, iupper, & var, values, ierr) endif ! This is a collective call finalizing the vector assembly call HYPRE_SStructVectorAssemble(b, ierr) call HYPRE_SStructVectorAssemble(x, ierr) !----------------------------------------------------------------------- ! 6. Set up and use a solver (See the Reference Manual for ! descriptions of all of the options.) !----------------------------------------------------------------------- tol = 1.0E-6 if (precond_id .eq. 1) then ! PFMG ! Because we are using a struct solver, we need to get the object ! of the matrix and vectors to pass in to the struct solvers call HYPRE_SStructMatrixGetObject(A, sA, ierr) call HYPRE_SStructVectorGetObject(b, sb, ierr) call HYPRE_SStructVectorGetObject(x, sx, ierr) ! Create an empty PCG Struct solver call HYPRE_StructPCGCreate(MPI_COMM_WORLD, solver, ierr) ! Set PCG parameters call HYPRE_StructPCGSetTol(solver, tol, ierr) call HYPRE_StructPCGSetPrintLevel(solver, 2, ierr) call HYPRE_StructPCGSetMaxIter(solver, 50, ierr) ! Create the Struct PFMG solver for use as a preconditioner call HYPRE_StructPFMGCreate(MPI_COMM_WORLD, precond, ierr) ! Set PFMG parameters call HYPRE_StructPFMGSetMaxIter(precond, 1, ierr) call HYPRE_StructPFMGSetTol(precond, 0.0d0, ierr) call HYPRE_StructPFMGSetZeroGuess(precond, ierr) call HYPRE_StructPFMGSetNumPreRelax(precond, 2, ierr) call HYPRE_StructPFMGSetNumPostRelax(precond, 2, ierr) ! Non-Galerkin coarse grid (more efficient for this problem) call HYPRE_StructPFMGSetRAPType(precond, 1, ierr) ! R/B Gauss-Seidel call HYPRE_StructPFMGSetRelaxType(precond, 2, ierr) ! Skip relaxation on some levels (more efficient for this problem) call HYPRE_StructPFMGSetSkipRelax(precond, 1, ierr) ! Set preconditioner (PFMG = 1) and solve call HYPRE_StructPCGSetPrecond(solver, 1, precond, ierr) call HYPRE_StructPCGSetup(solver, sA, sb, sx, ierr) call HYPRE_StructPCGSolve(solver, sA, sb, sx, ierr) ! Free memory call HYPRE_StructPCGDestroy(solver, ierr) call HYPRE_StructPFMGDestroy(precond, ierr) else if (precond_id .eq. 2) then ! BoomerAMG ! Because we are using a struct solver, we need to get the object ! of the matrix and vectors to pass in to the struct solvers call HYPRE_SStructMatrixGetObject(A, parA, ierr) call HYPRE_SStructVectorGetObject(b, parb, ierr) call HYPRE_SStructVectorGetObject(x, parx, ierr) ! Create an empty PCG Struct solver call HYPRE_ParCSRPCGCreate(MPI_COMM_WORLD, solver, ierr) ! Set PCG parameters call HYPRE_ParCSRPCGSetTol(solver, tol, ierr) call HYPRE_ParCSRPCGSetPrintLevel(solver, 2, ierr) call HYPRE_ParCSRPCGSetMaxIter(solver, 50, ierr) ! Create the BoomerAMG solver for use as a preconditioner call HYPRE_BoomerAMGCreate(precond, ierr) ! Set BoomerAMG parameters call HYPRE_BoomerAMGSetMaxIter(precond, 1, ierr) call HYPRE_BoomerAMGSetTol(precond, 0.0, ierr) ! Print amg solution info call HYPRE_BoomerAMGSetPrintLevel(precond, 1, ierr) call HYPRE_BoomerAMGSetCoarsenType(precond, 6, ierr) call HYPRE_BoomerAMGSetOldDefault(precond, ierr) ! Sym G.S./Jacobi hybrid call HYPRE_BoomerAMGSetRelaxType(precond, 6, ierr) call HYPRE_BoomerAMGSetNumSweeps(precond, 1, ierr) ! Set preconditioner (BoomerAMG = 2) and solve call HYPRE_ParCSRPCGSetPrecond(solver, 2, precond, ierr) call HYPRE_ParCSRPCGSetup(solver, parA, parb, parx, ierr) call HYPRE_ParCSRPCGSolve(solver, parA, parb, parx, ierr) ! Free memory call HYPRE_ParCSRPCGDestroy(solver, ierr) call HYPRE_BoomerAMGDestroy(precond, ierr) endif ! Free memory call HYPRE_SStructGridDestroy(grid, ierr) call HYPRE_SStructStencilDestroy(stencil, ierr) call HYPRE_SStructGraphDestroy(graph, ierr) call HYPRE_SStructMatrixDestroy(A, ierr) call HYPRE_SStructVectorDestroy(b, ierr) call HYPRE_SStructVectorDestroy(x, ierr) call HYPRE_Finalize(ierr) ! Finalize MPI call MPI_Finalize(ierr) deallocate(values) end hypre-2.33.0/src/examples/ex12f.f000066400000000000000000000421161477326011500164410ustar00rootroot00000000000000! Copyright (c) 1998 Lawrence Livermore National Security, LLC and other ! HYPRE Project Developers. See the top-level COPYRIGHT file for details. ! ! SPDX-License-Identifier: (Apache-2.0 OR MIT) ! ! Example 12 ! ! Interface: Semi-Structured interface (SStruct) ! ! Compile with: make ex12f (may need to edit HYPRE_DIR in Makefile) ! ! Sample runs: mpirun -np 2 ex12f ! ! Description: The grid layout is the same as ex1, but with nodal ! unknowns. The solver is PCG preconditioned with either PFMG or ! BoomerAMG, set with 'precond_id' below. ! ! We recommend viewing the Struct examples before viewing this and ! the other SStruct examples. This is one of the simplest SStruct ! examples, used primarily to demonstrate how to set up ! non-cell-centered problems, and to demonstrate how easy it is to ! switch between structured solvers (PFMG) and solvers designed for ! more general settings (AMG). ! program ex12f implicit none include 'mpif.h' include 'HYPREf.h' integer ierr integer i, j, myid, num_procs integer*8 grid integer*8 graph integer*8 stencil integer*8 A integer*8 b integer*8 x integer nparts integer nvars integer part integer var integer precond_id, object_type integer ilower(2), iupper(2) integer vartypes(1) integer offsets(2,5) integer ent integer nentries, nvalues, stencil_indices(5) double precision tol double precision values(100) ! This comes from 'sstruct_mv/HYPRE_sstruct_mv.h' integer HYPRE_SSTRUCT_VARIABLE_NODE parameter( HYPRE_SSTRUCT_VARIABLE_NODE = 1 ) integer*8 sA integer*8 sb integer*8 sx integer*8 parA integer*8 parb integer*8 parx integer*8 solver integer*8 precond ! character*32 matfile ! We only have one part and one variable nparts = 1 nvars = 1 part = 0 var = 0 ! Initialize MPI call MPI_Init(ierr) call MPI_Comm_rank(MPI_COMM_WORLD, myid, ierr) call MPI_Comm_size(MPI_COMM_WORLD, num_procs, ierr) call HYPRE_Initialize(ierr) if (num_procs .ne. 2) then if (myid .eq. 0) then print *, "Must run with 2 processors!" stop endif endif ! Set preconditioner id (PFMG = 1, BoomerAMG = 2) precond_id = 1 if (precond_id .eq. 1) then object_type = HYPRE_STRUCT else if (precond_id .eq. 2) then object_type = HYPRE_PARCSR else if (myid .eq. 0) then print *, "Invalid solver!" stop endif endif !$omp target enter data map(alloc:values) !----------------------------------------------------------------------- ! 1. Set up the grid. Here we use only one part. Each processor ! describes the piece of the grid that it owns. !----------------------------------------------------------------------- ! Create an empty 2D grid object call HYPRE_SStructGridCreate(MPI_COMM_WORLD, 2, nparts, grid, + ierr) ! Add boxes to the grid if (myid .eq. 0) then ilower(1) = -3 ilower(2) = 1 iupper(1) = -1 iupper(2) = 2 call HYPRE_SStructGridSetExtents(grid, part, ilower, iupper, + ierr) else if (myid .eq. 1) then ilower(1) = 0 ilower(2) = 1 iupper(1) = 2 iupper(2) = 4 call HYPRE_SStructGridSetExtents(grid, part, ilower, iupper, + ierr) endif ! Set the variable type and number of variables on each part vartypes(1) = HYPRE_SSTRUCT_VARIABLE_NODE call HYPRE_SStructGridSetVariables(grid, part, nvars, vartypes, + ierr) ! This is a collective call finalizing the grid assembly call HYPRE_SStructGridAssemble(grid, ierr) !----------------------------------------------------------------------- ! 2. Define the discretization stencil !----------------------------------------------------------------------- ! Create an empty 2D, 5-pt stencil object call HYPRE_SStructStencilCreate(2, 5, stencil, ierr) ! Define the geometry of the stencil. Each represents a relative ! offset (in the index space). offsets(1,1) = 0 offsets(2,1) = 0 offsets(1,2) = -1 offsets(2,2) = 0 offsets(1,3) = 1 offsets(2,3) = 0 offsets(1,4) = 0 offsets(2,4) = -1 offsets(1,5) = 0 offsets(2,5) = 1 ! Assign numerical values to the offsets so that we can easily refer ! to them - the last argument indicates the variable for which we ! are assigning this stencil do ent = 1, 5 call HYPRE_SStructStencilSetEntry(stencil, + ent-1, offsets(1,ent), var, ierr) enddo !----------------------------------------------------------------------- ! 3. Set up the Graph - this determines the non-zero structure of ! the matrix and allows non-stencil relationships between the parts !----------------------------------------------------------------------- ! Create the graph object call HYPRE_SStructGraphCreate(MPI_COMM_WORLD, grid, graph, ierr) ! See MatrixSetObjectType below call HYPRE_SStructGraphSetObjectType(graph, object_type, ierr) ! Now we need to tell the graph which stencil to use for each ! variable on each part (we only have one variable and one part) call HYPRE_SStructGraphSetStencil(graph, part, var, stencil, ierr) ! Here we could establish connections between parts if we had more ! than one part using the graph. For example, we could use ! HYPRE_GraphAddEntries() routine or HYPRE_GridSetNeighborPart() ! Assemble the graph call HYPRE_SStructGraphAssemble(graph, ierr) !----------------------------------------------------------------------- ! 4. Set up a SStruct Matrix !----------------------------------------------------------------------- ! Create an empty matrix object call HYPRE_SStructMatrixCreate(MPI_COMM_WORLD, graph, A, ierr) ! Set the object type (by default HYPRE_SSTRUCT). This determines ! the data structure used to store the matrix. For PFMG we use ! HYPRE_STRUCT, and for BoomerAMG we use HYPRE_PARCSR (set above). call HYPRE_SStructMatrixSetObjectTyp(A, object_type, ierr) ! Get ready to set values call HYPRE_SStructMatrixInitialize(A, ierr) ! Set the matrix coefficients. Each processor assigns coefficients ! for the boxes in the grid that it owns. Note that the ! coefficients associated with each stencil entry may vary from grid ! point to grid point if desired. Here, we first set the same ! stencil entries for each grid point. Then we make modifications ! to grid points near the boundary. Note that the ilower values are ! different from those used in ex1 because of the way nodal ! variables are referenced. Also note that some of the stencil ! values are set on both processor 0 and processor 1. See the User ! and Reference manuals for more details. ! Stencil entry labels correspond to the offsets defined above do i = 1, 5 stencil_indices(i) = i-1 enddo nentries = 5 if (myid .eq. 0) then ilower(1) = -4 ilower(2) = 0 iupper(1) = -1 iupper(2) = 2 ! 12 grid points, each with 5 stencil entries nvalues = 60 else if (myid .eq. 1) then ilower(1) = -1 ilower(2) = 0 iupper(1) = 2 iupper(2) = 4 ! 12 grid points, each with 5 stencil entries nvalues = 100 else nvalues = 0 endif do i = 1, nvalues, nentries values(i) = 4.0 do j = 1, nentries-1 values(i+j) = -1.0 enddo enddo !$omp target update to(values) !$omp target data use_device_ptr(values) call HYPRE_SStructMatrixSetBoxValues(A, part, ilower, iupper, + var, nentries, stencil_indices, values, ierr) !$omp end target data ! Set the coefficients reaching outside of the boundary to 0. Note ! that both ilower *and* iupper may be different from those in ex1. do i = 1, 5 values(i) = 0.0 enddo !$omp target update to(values) !$omp target data use_device_ptr(values) if (myid .eq. 0) then ! values below our box ilower(1) = -4 ilower(2) = 0 iupper(1) = -1 iupper(2) = 0 stencil_indices(1) = 3 call HYPRE_SStructMatrixSetBoxValues(A, part, ilower, iupper, + var, 1, stencil_indices, values, ierr) ! values to the left of our box ilower(1) = -4 ilower(2) = 0 iupper(1) = -4 iupper(2) = 2 stencil_indices(1) = 1 call HYPRE_SStructMatrixSetBoxValues(A, part, ilower, iupper, + var, 1, stencil_indices, values, ierr) ! values above our box ilower(1) = -4 ilower(2) = 2 iupper(1) = -2 iupper(2) = 2 stencil_indices(1) = 4 call HYPRE_SStructMatrixSetBoxValues(A, part, ilower, iupper, + var, 1, stencil_indices, values, ierr) else if (myid .eq. 1) then ! values below our box ilower(1) = -1 ilower(2) = 0 iupper(1) = 2 iupper(2) = 0 stencil_indices(1) = 3 call HYPRE_SStructMatrixSetBoxValues(A, part, ilower, iupper, + var, 1, stencil_indices, values, ierr) ! values to the right of our box ilower(1) = 2 ilower(2) = 0 iupper(1) = 2 iupper(2) = 4 stencil_indices(1) = 2 call HYPRE_SStructMatrixSetBoxValues(A, part, ilower, iupper, + var, 1, stencil_indices, values, ierr) ! values above our box ilower(1) = -1 ilower(2) = 4 iupper(1) = 2 iupper(2) = 4 stencil_indices(1) = 4 call HYPRE_SStructMatrixSetBoxValues(A, part, ilower, iupper, + var, 1, stencil_indices, values, ierr) ! values to the left of our box ! (that do not border the other box on proc. 0) ilower(1) = -1 ilower(2) = 3 iupper(1) = -1 iupper(2) = 4 stencil_indices(1) = 1 call HYPRE_SStructMatrixSetBoxValues(A, part, ilower, iupper, + var, 1, stencil_indices, values, ierr) endif !$omp end target data ! This is a collective call finalizing the matrix assembly call HYPRE_SStructMatrixAssemble(A, ierr) ! matfile = 'ex12f.out' ! matfile(10:10) = char(0) ! call HYPRE_SStructMatrixPrint(matfile, A, 0, ierr) ! Create an empty vector object call HYPRE_SStructVectorCreate(MPI_COMM_WORLD, grid, b, ierr) call HYPRE_SStructVectorCreate(MPI_COMM_WORLD, grid, x, ierr) ! As with the matrix, set the appropriate object type for the vectors call HYPRE_SStructVectorSetObjectTyp(b, object_type, ierr) call HYPRE_SStructVectorSetObjectTyp(x, object_type, ierr) ! Indicate that the vector coefficients are ready to be set call HYPRE_SStructVectorInitialize(b, ierr) call HYPRE_SStructVectorInitialize(x, ierr) ! Set the vector coefficients. Again, note that the ilower values ! are different from those used in ex1, and some of the values are ! set on both processors. if (myid .eq. 0) then ilower(1) = -4 ilower(2) = 0 iupper(1) = -1 iupper(2) = 2 do i = 1, 12 values(i) = 1.0 enddo !$omp target update to(values) !$omp target data use_device_ptr(values) call HYPRE_SStructVectorSetBoxValues(b, part, ilower, iupper, + var, values, ierr) !$omp end target data do i = 1, 12 values(i) = 0.0 enddo !$omp target update to(values) !$omp target data use_device_ptr(values) call HYPRE_SStructVectorSetBoxValues(x, part, ilower, iupper, + var, values, ierr) !$omp end target data else if (myid .eq. 1) then ilower(1) = 0 ilower(2) = 1 iupper(1) = 2 iupper(2) = 4 do i = 1, 20 values(i) = 1.0 enddo !$omp target update to(values) !$omp target data use_device_ptr(values) call HYPRE_SStructVectorSetBoxValues(b, part, ilower, iupper, + var, values, ierr) !$omp end target data do i = 1, 20 values(i) = 0.0 enddo !$omp target update to(values) !$omp target data use_device_ptr(values) call HYPRE_SStructVectorSetBoxValues(x, part, ilower, iupper, + var, values, ierr) !$omp end target data endif ! This is a collective call finalizing the vector assembly call HYPRE_SStructVectorAssemble(b, ierr) call HYPRE_SStructVectorAssemble(x, ierr) !----------------------------------------------------------------------- ! 6. Set up and use a solver (See the Reference Manual for ! descriptions of all of the options.) !----------------------------------------------------------------------- tol = 1.0E-6 if (precond_id .eq. 1) then ! PFMG ! Because we are using a struct solver, we need to get the object ! of the matrix and vectors to pass in to the struct solvers call HYPRE_SStructMatrixGetObject(A, sA, ierr) call HYPRE_SStructVectorGetObject(b, sb, ierr) call HYPRE_SStructVectorGetObject(x, sx, ierr) ! Create an empty PCG Struct solver call HYPRE_StructPCGCreate(MPI_COMM_WORLD, solver, ierr) ! Set PCG parameters call HYPRE_StructPCGSetTol(solver, tol, ierr) call HYPRE_StructPCGSetPrintLevel(solver, 2, ierr) call HYPRE_StructPCGSetMaxIter(solver, 50, ierr) ! Create the Struct PFMG solver for use as a preconditioner call HYPRE_StructPFMGCreate(MPI_COMM_WORLD, precond, ierr) ! Set PFMG parameters call HYPRE_StructPFMGSetMaxIter(precond, 1, ierr) call HYPRE_StructPFMGSetTol(precond, 0.0d0, ierr) call HYPRE_StructPFMGSetZeroGuess(precond, ierr) call HYPRE_StructPFMGSetNumPreRelax(precond, 2, ierr) call HYPRE_StructPFMGSetNumPostRelax(precond, 2, ierr) ! Non-Galerkin coarse grid (more efficient for this problem) call HYPRE_StructPFMGSetRAPType(precond, 1, ierr) ! R/B Gauss-Seidel call HYPRE_StructPFMGSetRelaxType(precond, 2, ierr) ! Skip relaxation on some levels (more efficient for this problem) call HYPRE_StructPFMGSetSkipRelax(precond, 1, ierr) ! Set preconditioner (PFMG = 1) and solve call HYPRE_StructPCGSetPrecond(solver, 1, precond, ierr) call HYPRE_StructPCGSetup(solver, sA, sb, sx, ierr) call HYPRE_StructPCGSolve(solver, sA, sb, sx, ierr) ! Free memory call HYPRE_StructPCGDestroy(solver, ierr) call HYPRE_StructPFMGDestroy(precond, ierr) else if (precond_id .eq. 2) then ! BoomerAMG ! Because we are using a struct solver, we need to get the object ! of the matrix and vectors to pass in to the struct solvers call HYPRE_SStructMatrixGetObject(A, parA, ierr) call HYPRE_SStructVectorGetObject(b, parb, ierr) call HYPRE_SStructVectorGetObject(x, parx, ierr) ! Create an empty PCG Struct solver call HYPRE_ParCSRPCGCreate(MPI_COMM_WORLD, solver, ierr) ! Set PCG parameters call HYPRE_ParCSRPCGSetTol(solver, tol, ierr) call HYPRE_ParCSRPCGSetPrintLevel(solver, 2, ierr) call HYPRE_ParCSRPCGSetMaxIter(solver, 50, ierr) ! Create the BoomerAMG solver for use as a preconditioner call HYPRE_BoomerAMGCreate(precond, ierr) ! Set BoomerAMG parameters call HYPRE_BoomerAMGSetMaxIter(precond, 1, ierr) call HYPRE_BoomerAMGSetTol(precond, 0.0, ierr) ! Print amg solution info call HYPRE_BoomerAMGSetPrintLevel(precond, 1, ierr) call HYPRE_BoomerAMGSetCoarsenType(precond, 6, ierr) call HYPRE_BoomerAMGSetOldDefault(precond, ierr) ! Sym G.S./Jacobi hybrid call HYPRE_BoomerAMGSetRelaxType(precond, 6, ierr) call HYPRE_BoomerAMGSetNumSweeps(precond, 1, ierr) ! Set preconditioner (BoomerAMG = 2) and solve call HYPRE_ParCSRPCGSetPrecond(solver, 2, precond, ierr) call HYPRE_ParCSRPCGSetup(solver, parA, parb, parx, ierr) call HYPRE_ParCSRPCGSolve(solver, parA, parb, parx, ierr) ! Free memory call HYPRE_ParCSRPCGDestroy(solver, ierr) call HYPRE_BoomerAMGDestroy(precond, ierr) endif ! Free memory call HYPRE_SStructGridDestroy(grid, ierr) call HYPRE_SStructStencilDestroy(stencil, ierr) call HYPRE_SStructGraphDestroy(graph, ierr) call HYPRE_SStructMatrixDestroy(A, ierr) call HYPRE_SStructVectorDestroy(b, ierr) call HYPRE_SStructVectorDestroy(x, ierr) call HYPRE_Finalize(ierr) ! Finalize MPI call MPI_Finalize(ierr) end hypre-2.33.0/src/examples/ex12f_cptr.f000066400000000000000000000411721477326011500174720ustar00rootroot00000000000000! Copyright (c) 1998 Lawrence Livermore National Security, LLC and other ! HYPRE Project Developers. See the top-level COPYRIGHT file for details. ! ! SPDX-License-Identifier: (Apache-2.0 OR MIT) ! ! Example 12 ! ! Interface: Semi-Structured interface (SStruct) ! ! Compile with: make ex12f (may need to edit HYPRE_DIR in Makefile) ! ! Sample runs: mpirun -np 2 ex12f ! ! Description: The grid layout is the same as ex1, but with nodal ! unknowns. The solver is PCG preconditioned with either PFMG or ! BoomerAMG, set with 'precond_id' below. ! ! We recommend viewing the Struct examples before viewing this and ! the other SStruct examples. This is one of the simplest SStruct ! examples, used primarily to demonstrate how to set up ! non-cell-centered problems, and to demonstrate how easy it is to ! switch between structured solvers (PFMG) and solvers designed for ! more general settings (AMG). ! program ex12f use, intrinsic :: iso_c_binding use, intrinsic :: iso_fortran_env, only: int64 use cudaf implicit none include 'mpif.h' include 'HYPREf.h' integer ierr integer i, j, myid, num_procs integer*8 grid integer*8 graph integer*8 stencil integer*8 A integer*8 b integer*8 x integer nparts integer nvars integer part integer var integer precond_id, object_type integer ilower(2), iupper(2) integer vartypes(1) integer offsets(2,5) integer ent integer nentries, nvalues, stencil_indices(5) double precision tol double precision, pointer :: values(:) type(c_ptr) :: p_values integer :: stat ! This comes from 'sstruct_mv/HYPRE_sstruct_mv.h' integer HYPRE_SSTRUCT_VARIABLE_NODE parameter( HYPRE_SSTRUCT_VARIABLE_NODE = 1 ) integer*8 sA integer*8 sb integer*8 sx integer*8 parA integer*8 parb integer*8 parx integer*8 solver integer*8 precond character*32 matfile stat = device_malloc_managed(int(100 * 8, int64), p_values) call c_f_pointer(p_values, values, [100]) ! We only have one part and one variable nparts = 1 nvars = 1 part = 0 var = 0 ! Initialize MPI call MPI_Init(ierr) call MPI_Comm_rank(MPI_COMM_WORLD, myid, ierr) call MPI_Comm_size(MPI_COMM_WORLD, num_procs, ierr) call HYPRE_Initialize(ierr) if (num_procs .ne. 2) then if (myid .eq. 0) then print *, "Must run with 2 processors!" stop endif endif ! Set preconditioner id (PFMG = 1, BoomerAMG = 2) precond_id = 1 if (precond_id .eq. 1) then object_type = HYPRE_STRUCT else if (precond_id .eq. 2) then object_type = HYPRE_PARCSR else if (myid .eq. 0) then print *, "Invalid solver!" stop endif endif !----------------------------------------------------------------------- ! 1. Set up the grid. Here we use only one part. Each processor ! describes the piece of the grid that it owns. !----------------------------------------------------------------------- ! Create an empty 2D grid object call HYPRE_SStructGridCreate(MPI_COMM_WORLD, 2, nparts, grid, + ierr) ! Add boxes to the grid if (myid .eq. 0) then ilower(1) = -3 ilower(2) = 1 iupper(1) = -1 iupper(2) = 2 call HYPRE_SStructGridSetExtents(grid, part, ilower, iupper, + ierr) else if (myid .eq. 1) then ilower(1) = 0 ilower(2) = 1 iupper(1) = 2 iupper(2) = 4 call HYPRE_SStructGridSetExtents(grid, part, ilower, iupper, + ierr) endif ! Set the variable type and number of variables on each part vartypes(1) = HYPRE_SSTRUCT_VARIABLE_NODE call HYPRE_SStructGridSetVariables(grid, part, nvars, vartypes, + ierr) ! This is a collective call finalizing the grid assembly call HYPRE_SStructGridAssemble(grid, ierr) !----------------------------------------------------------------------- ! 2. Define the discretization stencil !----------------------------------------------------------------------- ! Create an empty 2D, 5-pt stencil object call HYPRE_SStructStencilCreate(2, 5, stencil, ierr) ! Define the geometry of the stencil. Each represents a relative ! offset (in the index space). offsets(1,1) = 0 offsets(2,1) = 0 offsets(1,2) = -1 offsets(2,2) = 0 offsets(1,3) = 1 offsets(2,3) = 0 offsets(1,4) = 0 offsets(2,4) = -1 offsets(1,5) = 0 offsets(2,5) = 1 ! Assign numerical values to the offsets so that we can easily refer ! to them - the last argument indicates the variable for which we ! are assigning this stencil do ent = 1, 5 call HYPRE_SStructStencilSetEntry(stencil, + ent-1, offsets(1,ent), var, ierr) enddo !----------------------------------------------------------------------- ! 3. Set up the Graph - this determines the non-zero structure of ! the matrix and allows non-stencil relationships between the parts !----------------------------------------------------------------------- ! Create the graph object call HYPRE_SStructGraphCreate(MPI_COMM_WORLD, grid, graph, ierr) ! See MatrixSetObjectType below call HYPRE_SStructGraphSetObjectType(graph, object_type, ierr) ! Now we need to tell the graph which stencil to use for each ! variable on each part (we only have one variable and one part) call HYPRE_SStructGraphSetStencil(graph, part, var, stencil, ierr) ! Here we could establish connections between parts if we had more ! than one part using the graph. For example, we could use ! HYPRE_GraphAddEntries() routine or HYPRE_GridSetNeighborPart() ! Assemble the graph call HYPRE_SStructGraphAssemble(graph, ierr) !----------------------------------------------------------------------- ! 4. Set up a SStruct Matrix !----------------------------------------------------------------------- ! Create an empty matrix object call HYPRE_SStructMatrixCreate(MPI_COMM_WORLD, graph, A, ierr) ! Set the object type (by default HYPRE_SSTRUCT). This determines ! the data structure used to store the matrix. For PFMG we use ! HYPRE_STRUCT, and for BoomerAMG we use HYPRE_PARCSR (set above). call HYPRE_SStructMatrixSetObjectTyp(A, object_type, ierr) ! Get ready to set values call HYPRE_SStructMatrixInitialize(A, ierr) ! Set the matrix coefficients. Each processor assigns coefficients ! for the boxes in the grid that it owns. Note that the ! coefficients associated with each stencil entry may vary from grid ! point to grid point if desired. Here, we first set the same ! stencil entries for each grid point. Then we make modifications ! to grid points near the boundary. Note that the ilower values are ! different from those used in ex1 because of the way nodal ! variables are referenced. Also note that some of the stencil ! values are set on both processor 0 and processor 1. See the User ! and Reference manuals for more details. ! Stencil entry labels correspond to the offsets defined above do i = 1, 5 stencil_indices(i) = i-1 enddo nentries = 5 if (myid .eq. 0) then ilower(1) = -4 ilower(2) = 0 iupper(1) = -1 iupper(2) = 2 ! 12 grid points, each with 5 stencil entries nvalues = 60 else if (myid .eq. 1) then ilower(1) = -1 ilower(2) = 0 iupper(1) = 2 iupper(2) = 4 ! 12 grid points, each with 5 stencil entries nvalues = 100 endif do i = 1, nvalues, nentries values(i) = 4.0 do j = 1, nentries-1 values(i+j) = -1.0 enddo enddo call HYPRE_SStructMatrixSetBoxValues(A, part, ilower, iupper, + var, nentries, stencil_indices, values, ierr) ! Set the coefficients reaching outside of the boundary to 0. Note ! that both ilower *and* iupper may be different from those in ex1. do i = 1, 5 values(i) = 0.0 enddo if (myid .eq. 0) then ! values below our box ilower(1) = -4 ilower(2) = 0 iupper(1) = -1 iupper(2) = 0 stencil_indices(1) = 3 call HYPRE_SStructMatrixSetBoxValues(A, part, ilower, iupper, + var, 1, stencil_indices, values, ierr) ! values to the left of our box ilower(1) = -4 ilower(2) = 0 iupper(1) = -4 iupper(2) = 2 stencil_indices(1) = 1 call HYPRE_SStructMatrixSetBoxValues(A, part, ilower, iupper, + var, 1, stencil_indices, values, ierr) ! values above our box ilower(1) = -4 ilower(2) = 2 iupper(1) = -2 iupper(2) = 2 stencil_indices(1) = 4 call HYPRE_SStructMatrixSetBoxValues(A, part, ilower, iupper, + var, 1, stencil_indices, values, ierr) else if (myid .eq. 1) then ! values below our box ilower(1) = -1 ilower(2) = 0 iupper(1) = 2 iupper(2) = 0 stencil_indices(1) = 3 call HYPRE_SStructMatrixSetBoxValues(A, part, ilower, iupper, + var, 1, stencil_indices, values, ierr) ! values to the right of our box ilower(1) = 2 ilower(2) = 0 iupper(1) = 2 iupper(2) = 4 stencil_indices(1) = 2 call HYPRE_SStructMatrixSetBoxValues(A, part, ilower, iupper, + var, 1, stencil_indices, values, ierr) ! values above our box ilower(1) = -1 ilower(2) = 4 iupper(1) = 2 iupper(2) = 4 stencil_indices(1) = 4 call HYPRE_SStructMatrixSetBoxValues(A, part, ilower, iupper, + var, 1, stencil_indices, values, ierr) ! values to the left of our box ! (that do not border the other box on proc. 0) ilower(1) = -1 ilower(2) = 3 iupper(1) = -1 iupper(2) = 4 stencil_indices(1) = 1 call HYPRE_SStructMatrixSetBoxValues(A, part, ilower, iupper, + var, 1, stencil_indices, values, ierr) endif ! This is a collective call finalizing the matrix assembly call HYPRE_SStructMatrixAssemble(A, ierr) ! matfile = 'ex12f.out' ! matfile(10:10) = char(0) ! call HYPRE_SStructMatrixPrint(matfile, A, 0, ierr) ! Create an empty vector object call HYPRE_SStructVectorCreate(MPI_COMM_WORLD, grid, b, ierr) call HYPRE_SStructVectorCreate(MPI_COMM_WORLD, grid, x, ierr) ! As with the matrix, set the appropriate object type for the vectors call HYPRE_SStructVectorSetObjectTyp(b, object_type, ierr) call HYPRE_SStructVectorSetObjectTyp(x, object_type, ierr) ! Indicate that the vector coefficients are ready to be set call HYPRE_SStructVectorInitialize(b, ierr) call HYPRE_SStructVectorInitialize(x, ierr) ! Set the vector coefficients. Again, note that the ilower values ! are different from those used in ex1, and some of the values are ! set on both processors. if (myid .eq. 0) then ilower(1) = -4 ilower(2) = 0 iupper(1) = -1 iupper(2) = 2 do i = 1, 12 values(i) = 1.0 enddo call HYPRE_SStructVectorSetBoxValues(b, part, ilower, iupper, + var, values, ierr) do i = 1, 12 values(i) = 0.0 enddo call HYPRE_SStructVectorSetBoxValues(x, part, ilower, iupper, + var, values, ierr) else if (myid .eq. 1) then ilower(1) = 0 ilower(2) = 1 iupper(1) = 2 iupper(2) = 4 do i = 1, 20 values(i) = 1.0 enddo call HYPRE_SStructVectorSetBoxValues(b, part, ilower, iupper, + var, values, ierr) do i = 1, 20 values(i) = 0.0 enddo call HYPRE_SStructVectorSetBoxValues(x, part, ilower, iupper, + var, values, ierr) endif ! This is a collective call finalizing the vector assembly call HYPRE_SStructVectorAssemble(b, ierr) call HYPRE_SStructVectorAssemble(x, ierr) !----------------------------------------------------------------------- ! 6. Set up and use a solver (See the Reference Manual for ! descriptions of all of the options.) !----------------------------------------------------------------------- tol = 1.0E-6 if (precond_id .eq. 1) then ! PFMG ! Because we are using a struct solver, we need to get the object ! of the matrix and vectors to pass in to the struct solvers call HYPRE_SStructMatrixGetObject(A, sA, ierr) call HYPRE_SStructVectorGetObject(b, sb, ierr) call HYPRE_SStructVectorGetObject(x, sx, ierr) ! Create an empty PCG Struct solver call HYPRE_StructPCGCreate(MPI_COMM_WORLD, solver, ierr) ! Set PCG parameters call HYPRE_StructPCGSetTol(solver, tol, ierr) call HYPRE_StructPCGSetPrintLevel(solver, 2, ierr) call HYPRE_StructPCGSetMaxIter(solver, 50, ierr) ! Create the Struct PFMG solver for use as a preconditioner call HYPRE_StructPFMGCreate(MPI_COMM_WORLD, precond, ierr) ! Set PFMG parameters call HYPRE_StructPFMGSetMaxIter(precond, 1, ierr) call HYPRE_StructPFMGSetTol(precond, 0.0d0, ierr) call HYPRE_StructPFMGSetZeroGuess(precond, ierr) call HYPRE_StructPFMGSetNumPreRelax(precond, 2, ierr) call HYPRE_StructPFMGSetNumPostRelax(precond, 2, ierr) ! Non-Galerkin coarse grid (more efficient for this problem) call HYPRE_StructPFMGSetRAPType(precond, 1, ierr) ! R/B Gauss-Seidel call HYPRE_StructPFMGSetRelaxType(precond, 2, ierr) ! Skip relaxation on some levels (more efficient for this problem) call HYPRE_StructPFMGSetSkipRelax(precond, 1, ierr) ! Set preconditioner (PFMG = 1) and solve call HYPRE_StructPCGSetPrecond(solver, 1, precond, ierr) call HYPRE_StructPCGSetup(solver, sA, sb, sx, ierr) call HYPRE_StructPCGSolve(solver, sA, sb, sx, ierr) ! Free memory call HYPRE_StructPCGDestroy(solver, ierr) call HYPRE_StructPFMGDestroy(precond, ierr) else if (precond_id .eq. 2) then ! BoomerAMG ! Because we are using a struct solver, we need to get the object ! of the matrix and vectors to pass in to the struct solvers call HYPRE_SStructMatrixGetObject(A, parA, ierr) call HYPRE_SStructVectorGetObject(b, parb, ierr) call HYPRE_SStructVectorGetObject(x, parx, ierr) ! Create an empty PCG Struct solver call HYPRE_ParCSRPCGCreate(MPI_COMM_WORLD, solver, ierr) ! Set PCG parameters call HYPRE_ParCSRPCGSetTol(solver, tol, ierr) call HYPRE_ParCSRPCGSetPrintLevel(solver, 2, ierr) call HYPRE_ParCSRPCGSetMaxIter(solver, 50, ierr) ! Create the BoomerAMG solver for use as a preconditioner call HYPRE_BoomerAMGCreate(precond, ierr) ! Set BoomerAMG parameters call HYPRE_BoomerAMGSetMaxIter(precond, 1, ierr) call HYPRE_BoomerAMGSetTol(precond, 0.0, ierr) ! Print amg solution info call HYPRE_BoomerAMGSetPrintLevel(precond, 1, ierr) call HYPRE_BoomerAMGSetCoarsenType(precond, 6, ierr) call HYPRE_BoomerAMGSetOldDefault(precond, ierr) ! Sym G.S./Jacobi hybrid call HYPRE_BoomerAMGSetRelaxType(precond, 6, ierr) call HYPRE_BoomerAMGSetNumSweeps(precond, 1, ierr) ! Set preconditioner (BoomerAMG = 2) and solve call HYPRE_ParCSRPCGSetPrecond(solver, 2, precond, ierr) call HYPRE_ParCSRPCGSetup(solver, parA, parb, parx, ierr) call HYPRE_ParCSRPCGSolve(solver, parA, parb, parx, ierr) ! Free memory call HYPRE_ParCSRPCGDestroy(solver, ierr) call HYPRE_BoomerAMGDestroy(precond, ierr) endif ! Free memory call HYPRE_SStructGridDestroy(grid, ierr) call HYPRE_SStructStencilDestroy(stencil, ierr) call HYPRE_SStructGraphDestroy(graph, ierr) call HYPRE_SStructMatrixDestroy(A, ierr) call HYPRE_SStructVectorDestroy(b, ierr) call HYPRE_SStructVectorDestroy(x, ierr) call HYPRE_Finalize(ierr) ! Finalize MPI call MPI_Finalize(ierr) stat = device_free(p_values) end hypre-2.33.0/src/examples/ex13.c000066400000000000000000000627611477326011500163010ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /* Example 13 Interface: Semi-Structured interface (SStruct) Compile with: make ex13 Sample run: mpirun -np 6 ex13 -n 10 To see options: ex13 -help Description: This code solves the 2D Laplace equation using bilinear finite element discretization on a mesh with an "enhanced connectivity" point. Specifically, we solve -Delta u = 1 with zero boundary conditions on a star-shaped domain consisting of identical rhombic parts each meshed with a uniform n x n grid. Every part is assigned to a different processor and all parts meet at the origin, equally subdividing the 2*pi angle there. The case of six processors (parts) looks as follows: + / \ / \ / \ +--------+ 1 +---------+ \ \ / / \ 2 \ / 0 / \ \ / / +--------+---------+ / / \ \ / 3 / \ 5 \ / / \ \ +--------+ 4 +---------+ \ / \ / \ / + Note that in this problem we use nodal variables, which are shared between the different parts. The node at the origin, for example, belongs to all parts as illustrated below: . / \ . . / \ / \ o . * .---.---o \ / \ / *---.---. \ \ \ o * / / / .---.---o \ / *---.---. \ \ \ x / / / @---@---x x---z---z @---@---x x---z---z / / / x \ \ \ .---.---a / \ #---.---. / / / a # \ \ \ .---.---a / \ / \ #---.---. a . # \ / \ / . . \ / . We recommend viewing the Struct examples before viewing this and the other SStruct examples. The primary role of this particular SStruct example is to demonstrate a stencil-based way to set up finite element problems in SStruct, and specifically to show how to handle problems with an "enhanced connectivity" point. */ #include #include #include #include #include "HYPRE_sstruct_mv.h" #include "HYPRE_sstruct_ls.h" #include "HYPRE.h" #include "ex.h" #ifndef M_PI #define M_PI 3.14159265358979 #endif #ifdef HYPRE_EXVIS #include "vis.c" #endif /* This routine computes the bilinear finite element stiffness matrix and load vector on a rhombus with angle gamma. Specifically, let R be the rhombus [3]------[2] / / / / [0]------[1] with sides of length h. The finite element stiffness matrix S_ij = (grad phi_i,grad phi_j)_R with bilinear finite element functions {phi_i} has the form / 4-k -1 -2+k -1 \ alpha . | -1 4+k -1 -2-k | | -2+k -1 4-k -1 | \ -1 -2-k -1 4+k / where alpha = 1/(6*sin(gamma)) and k = 3*cos(gamma). The load vector corresponding to a right-hand side of 1 is F_j = (1,phi_j)_R = h^2/4 * sin(gamma) */ void ComputeFEMRhombus (double **S, double F[4], double gamma, double h) { int i, j; double h2_4 = h * h / 4; double sing = sin(gamma); double alpha = 1 / (6 * sing); double k = 3 * cos(gamma); S[0][0] = alpha * (4 - k); S[0][1] = alpha * (-1); S[0][2] = alpha * (-2 + k); S[0][3] = alpha * (-1); S[1][1] = alpha * (4 + k); S[1][2] = alpha * (-1); S[1][3] = alpha * (-2 - k); S[2][2] = alpha * (4 - k); S[2][3] = alpha * (-1); S[3][3] = alpha * (4 + k); /* The stiffness matrix is symmetric */ for (i = 1; i < 4; i++) for (j = 0; j < i; j++) { S[i][j] = S[j][i]; } for (i = 0; i < 4; i++) { F[i] = h2_4 * sing; } } int main (int argc, char *argv[]) { int myid, num_procs; int n; double gamma, h; int vis; HYPRE_SStructGrid grid; HYPRE_SStructGraph graph; HYPRE_SStructStencil stencil; HYPRE_SStructMatrix A; HYPRE_SStructVector b; HYPRE_SStructVector x; HYPRE_Solver solver; /* Initialize MPI */ MPI_Init(&argc, &argv); MPI_Comm_rank(MPI_COMM_WORLD, &myid); MPI_Comm_size(MPI_COMM_WORLD, &num_procs); /* Initialize HYPRE */ HYPRE_Initialize(); /* Print GPU info */ /* HYPRE_PrintDeviceInfo(); */ /* Set default parameters */ n = 10; vis = 0; /* Parse command line */ { int arg_index = 0; int print_usage = 0; while (arg_index < argc) { if ( strcmp(argv[arg_index], "-n") == 0 ) { arg_index++; n = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-vis") == 0 ) { arg_index++; vis = 1; } else if ( strcmp(argv[arg_index], "-help") == 0 ) { print_usage = 1; break; } else { arg_index++; } } if ((print_usage) && (myid == 0)) { printf("\n"); printf("Usage: %s []\n", argv[0]); printf("\n"); printf(" -n : problem size per processor (default: 10)\n"); printf(" -vis : save the solution for GLVis visualization\n"); printf("\n"); } if (print_usage) { MPI_Finalize(); return (0); } } /* Set the rhombus angle, gamma, and the mesh size, h, depending on the number of processors np and the given n */ if (num_procs < 3) { if (myid == 0) { printf("Must run with at least 3 processors!\n"); } MPI_Finalize(); exit(1); } gamma = 2 * M_PI / num_procs; h = 1.0 / n; /* 1. Set up the grid. We will set up the grid so that processor X owns part X. Note that each part has its own index space numbering. Later we relate the parts to each other. */ { int ndim = 2; int nparts = num_procs; /* Create an empty 2D grid object */ HYPRE_SStructGridCreate(MPI_COMM_WORLD, ndim, nparts, &grid); /* Set the extents of the grid - each processor sets its grid boxes. Each part has its own relative index space numbering */ { int part = myid; int ilower[2] = {1, 1}; /* lower-left cell touching the origin */ int iupper[2] = {n, n}; /* upper-right cell */ HYPRE_SStructGridSetExtents(grid, part, ilower, iupper); } /* Set the variable type and number of variables on each part. These need to be set in each part which is neighboring or contains boxes owned by the processor. */ { int i; int nvars = 1; HYPRE_SStructVariable vartypes[1] = {HYPRE_SSTRUCT_VARIABLE_NODE}; for (i = 0; i < nparts; i++) { HYPRE_SStructGridSetVariables(grid, i, nvars, vartypes); } } /* Now we need to set the spatial relation between each of the parts. Since we are using nodal variables, we have to use SetSharedPart to establish the connection at the origin. */ { /* Relation to the clockwise-previous neighbor part, e.g. 0 and 1 for the case of 6 parts. Note that we could have used SetNeighborPart here instead of SetSharedPart. */ { int part = myid; /* the box of cells intersecting the boundary in the current part */ int ilower[2] = {1, 1}, iupper[2] = {1, n}; /* share all data on the left side of the box */ int offset[2] = {-1, 0}; int shared_part = (myid + 1) % num_procs; /* the box of cells intersecting the boundary in the neighbor */ int shared_ilower[2] = {1, 1}, shared_iupper[2] = {n, 1}; /* share all data on the bottom of the box */ int shared_offset[2] = {0, -1}; /* x/y-direction on the current part is -y/x on the neighbor */ int index_map[2] = {1, 0}; int index_dir[2] = {-1, 1}; HYPRE_SStructGridSetSharedPart(grid, part, ilower, iupper, offset, shared_part, shared_ilower, shared_iupper, shared_offset, index_map, index_dir); } /* Relation to the clockwise-following neighbor part, e.g. 0 and 5 for the case of 6 parts. Note that we could have used SetNeighborPart here instead of SetSharedPart. */ { int part = myid; /* the box of cells intersecting the boundary in the current part */ int ilower[2] = {1, 1}, iupper[2] = {n, 1}; /* share all data on the bottom of the box */ int offset[2] = {0, -1}; int shared_part = (myid + num_procs - 1) % num_procs; /* the box of cells intersecting the boundary in the neighbor */ int shared_ilower[2] = {1, 1}, shared_iupper[2] = {1, n}; /* share all data on the left side of the box */ int shared_offset[2] = {-1, 0}; /* x/y-direction on the current part is y/-x on the neighbor */ int index_map[2] = {1, 0}; int index_dir[2] = {1, -1}; HYPRE_SStructGridSetSharedPart(grid, part, ilower, iupper, offset, shared_part, shared_ilower, shared_iupper, shared_offset, index_map, index_dir); } /* Relation to all other parts, e.g. 0 and 2,3,4. This can be described only by SetSharedPart. */ { int part = myid; /* the (one cell) box that touches the origin */ int ilower[2] = {1, 1}, iupper[2] = {1, 1}; /* share all data in the bottom left corner (i.e. the origin) */ int offset[2] = {-1, -1}; int shared_part; /* the box of one cell that touches the origin */ int shared_ilower[2] = {1, 1}, shared_iupper[2] = {1, 1}; /* share all data in the bottom left corner (i.e. the origin) */ int shared_offset[2] = {-1, -1}; /* x/y-direction on the current part is -x/-y on the neighbor, but in this case the arguments are not really important since we are only sharing a point */ int index_map[2] = {0, 1}; int index_dir[2] = {-1, -1}; for (shared_part = 0; shared_part < myid - 1; shared_part++) HYPRE_SStructGridSetSharedPart(grid, part, ilower, iupper, offset, shared_part, shared_ilower, shared_iupper, shared_offset, index_map, index_dir); for (shared_part = myid + 2; shared_part < num_procs; shared_part++) HYPRE_SStructGridSetSharedPart(grid, part, ilower, iupper, offset, shared_part, shared_ilower, shared_iupper, shared_offset, index_map, index_dir); } } /* Now the grid is ready to be used */ HYPRE_SStructGridAssemble(grid); } /* 2. Define the discretization stencils. Since this is a finite element discretization we define here a full 9-point stencil. We will later use four sub-stencils for the rows of the local stiffness matrix. */ { int ndim = 2; int var = 0; int entry; /* Define the geometry of the 9-point stencil */ int stencil_size = 9; int offsets[9][2] = { { 0, 0}, /* [8] [4] [7] */ {-1, 0}, { 1, 0}, /* \ | / */ { 0, -1}, { 0, 1}, /* [1]-[0]-[2] */ {-1, -1}, { 1, -1}, /* / | \ */ { 1, 1}, {-1, 1} /* [5] [3] [6] */ }; HYPRE_SStructStencilCreate(ndim, stencil_size, &stencil); for (entry = 0; entry < stencil_size; entry++) { HYPRE_SStructStencilSetEntry(stencil, entry, offsets[entry], var); } } /* 3. Set up the Graph - this determines the non-zero structure of the matrix. */ { int part; int var = 0; /* Create the graph object */ HYPRE_SStructGraphCreate(MPI_COMM_WORLD, grid, &graph); /* See MatrixSetObjectType below */ HYPRE_SStructGraphSetObjectType(graph, HYPRE_PARCSR); /* Now we need to tell the graph which stencil to use for each variable on each part (we only have one variable) */ for (part = 0; part < num_procs; part++) { HYPRE_SStructGraphSetStencil(graph, part, var, stencil); } /* Assemble the graph */ HYPRE_SStructGraphAssemble(graph); } /* 4. Set up the SStruct Matrix and right-hand side vector */ { int part = myid; int var = 0; /* Create the matrix object */ HYPRE_SStructMatrixCreate(MPI_COMM_WORLD, graph, &A); /* Use a ParCSR storage */ HYPRE_SStructMatrixSetObjectType(A, HYPRE_PARCSR); /* Indicate that the matrix coefficients are ready to be set */ HYPRE_SStructMatrixInitialize(A); /* Create an empty vector object */ HYPRE_SStructVectorCreate(MPI_COMM_WORLD, grid, &b); /* Use a ParCSR storage */ HYPRE_SStructVectorSetObjectType(b, HYPRE_PARCSR); /* Indicate that the vector coefficients are ready to be set */ HYPRE_SStructVectorInitialize(b); /* Set the matrix and vector entries by finite element assembly */ { /* local stifness matrix and load vector */ /* double F[4]; OK to use constant-length arrays for CPUs */ double *F = (double *) malloc(4 * sizeof(double)); /*double S[4][4]; OK to use constant-length arrays for CPUs */ double *S_flat = (double *) malloc(16 * sizeof(double)); double *S[4]; S[0] = S_flat; S[1] = S[0] + 4; S[2] = S[1] + 4; S[3] = S[2] + 4; /* The index of the local nodes 0-3 relative to the cell index, i.e. node k in cell (i,j) is in the upper-right corner of the cell (i,j) + node_index_offset[k]. */ int node_index_offset[4][2] = {{-1, -1}, {0, -1}, {0, 0}, {-1, 0}}; /* The cell sub-stencils of nodes 0-3 indexed from the full stencil, i.e. we take the full stencil in each node of a fixed cell, and restrict it to that as is done in the finite element stiffness matrix: [4] [7] [8] [4] [1]-[0] [0]-[2] | / \ | / | | \ [0]-[2] , [1]-[0] , [5] [3] , [3] [6] Note that the ordering of the local nodes remains fixed, and therefore the above sub-stencil at node k corresponds to the kth row of the local stiffness matrix and the kth entry of the local load vector. */ int node_stencil[4][4] = {{0, 2, 7, 4}, {1, 0, 4, 8}, {5, 3, 0, 1}, {3, 6, 2, 0}}; int i, j, k; int index[2]; int nentries = 4; /* set the values in the interior cells */ { ComputeFEMRhombus(S, F, gamma, h); for (i = 1; i <= n; i++) for (j = 1; j <= n; j++) for (k = 0; k < 4; k++) /* node k in cell (i,j) */ { index[0] = i + node_index_offset[k][0]; index[1] = j + node_index_offset[k][1]; HYPRE_SStructMatrixAddToValues(A, part, index, var, nentries, node_stencil[k], &S[k][0]); HYPRE_SStructVectorAddToValues(b, part, index, var, &F[k]); } } /* cells having nodes 1,2 on the domain boundary */ { ComputeFEMRhombus(S, F, gamma, h); /* eliminate nodes 1,2 from S and F */ for (k = 0; k < 4; k++) { S[1][k] = S[k][1] = 0.0; S[2][k] = S[k][2] = 0.0; } S[1][1] = 1.0; S[2][2] = 1.0; F[1] = 0.0; F[2] = 0.0; for (i = n; i <= n; i++) for (j = 1; j <= n; j++) for (k = 0; k < 4; k++) /* node k in cell (n,j) */ { index[0] = i + node_index_offset[k][0]; index[1] = j + node_index_offset[k][1]; HYPRE_SStructMatrixAddToValues(A, part, index, var, nentries, node_stencil[k], &S[k][0]); HYPRE_SStructVectorAddToValues(b, part, index, var, &F[k]); } } /* cells having nodes 2,3 on the domain boundary */ { ComputeFEMRhombus(S, F, gamma, h); /* eliminate nodes 2,3 from S and F */ for (k = 0; k < 4; k++) { S[2][k] = S[k][2] = 0.0; S[3][k] = S[k][3] = 0.0; } S[2][2] = 1.0; S[3][3] = 1.0; F[2] = 0.0; F[3] = 0.0; for (i = 1; i <= n; i++) for (j = n; j <= n; j++) for (k = 0; k < 4; k++) /* node k in cell (i,n) */ { index[0] = i + node_index_offset[k][0]; index[1] = j + node_index_offset[k][1]; HYPRE_SStructMatrixAddToValues(A, part, index, var, nentries, node_stencil[k], &S[k][0]); HYPRE_SStructVectorAddToValues(b, part, index, var, &F[k]); } } /* cells having nodes 1,2,3 on the domain boundary */ { ComputeFEMRhombus(S, F, gamma, h); /* eliminate nodes 2,3 from S and F */ for (k = 0; k < 4; k++) { S[1][k] = S[k][1] = 0.0; S[2][k] = S[k][2] = 0.0; S[3][k] = S[k][3] = 0.0; } S[1][1] = 1.0; S[2][2] = 1.0; S[3][3] = 1.0; F[1] = 0.0; F[2] = 0.0; F[3] = 0.0; for (i = n; i <= n; i++) for (j = n; j <= n; j++) for (k = 0; k < 4; k++) /* node k in cell (n,n) */ { index[0] = i + node_index_offset[k][0]; index[1] = j + node_index_offset[k][1]; HYPRE_SStructMatrixAddToValues(A, part, index, var, nentries, node_stencil[k], &S[k][0]); HYPRE_SStructVectorAddToValues(b, part, index, var, &F[k]); } } free(F); free(S_flat); } } /* Collective calls finalizing the matrix and vector assembly */ HYPRE_SStructMatrixAssemble(A); HYPRE_SStructVectorAssemble(b); /* 5. Set up SStruct Vector for the solution vector x */ { int part = myid; int var = 0; int nvalues = (n + 1) * (n + 1); double *values; /* Since the SetBoxValues() calls below set the values of the nodes in the upper-right corners of the cells, the nodal box should start from (0,0) instead of (1,1). */ int ilower[2] = {0, 0}; int iupper[2] = {n, n}; values = (double*) calloc(nvalues, sizeof(double)); /* Create an empty vector object */ HYPRE_SStructVectorCreate(MPI_COMM_WORLD, grid, &x); /* Set the object type to ParCSR */ HYPRE_SStructVectorSetObjectType(x, HYPRE_PARCSR); /* Indicate that the vector coefficients are ready to be set */ HYPRE_SStructVectorInitialize(x); /* Set the values for the initial guess */ HYPRE_SStructVectorSetBoxValues(x, part, ilower, iupper, var, values); free(values); /* Finalize the vector assembly */ HYPRE_SStructVectorAssemble(x); } /* 6. Set up and call the solver (Solver options can be found in the Reference Manual.) */ { double final_res_norm; int its; HYPRE_ParCSRMatrix par_A; HYPRE_ParVector par_b; HYPRE_ParVector par_x; /* Extract the ParCSR objects needed in the solver */ HYPRE_SStructMatrixGetObject(A, (void **) &par_A); HYPRE_SStructVectorGetObject(b, (void **) &par_b); HYPRE_SStructVectorGetObject(x, (void **) &par_x); /* Here we construct a BoomerAMG solver. See the other SStruct examples as well as the Reference manual for additional solver choices. */ HYPRE_BoomerAMGCreate(&solver); HYPRE_BoomerAMGSetOldDefault(solver); HYPRE_BoomerAMGSetStrongThreshold(solver, 0.25); HYPRE_BoomerAMGSetTol(solver, 1e-6); HYPRE_BoomerAMGSetPrintLevel(solver, 2); HYPRE_BoomerAMGSetMaxIter(solver, 50); /* call the setup */ HYPRE_BoomerAMGSetup(solver, par_A, par_b, par_x); /* call the solve */ HYPRE_BoomerAMGSolve(solver, par_A, par_b, par_x); /* get some info */ HYPRE_BoomerAMGGetNumIterations(solver, &its); HYPRE_BoomerAMGGetFinalRelativeResidualNorm(solver, &final_res_norm); /* clean up */ HYPRE_BoomerAMGDestroy(solver); /* Gather the solution vector */ HYPRE_SStructVectorGather(x); /* Save the solution for GLVis visualization, see vis/glvis-ex13.sh */ if (vis) { #ifdef HYPRE_EXVIS FILE *file; char filename[255]; int i, part = myid, var = 0; int nvalues = (n + 1) * (n + 1); double *values = (double*) calloc(nvalues, sizeof(double)); int ilower[2] = {0, 0}; int iupper[2] = {n, n}; /* get all local data (including a local copy of the shared values) */ HYPRE_SStructVectorGetBoxValues(x, part, ilower, iupper, var, values); sprintf(filename, "%s.%06d", "vis/ex13.sol", myid); if ((file = fopen(filename, "w")) == NULL) { printf("Error: can't open output file %s\n", filename); MPI_Finalize(); exit(1); } /* finite element space header */ fprintf(file, "FiniteElementSpace\n"); fprintf(file, "FiniteElementCollection: H1_2D_P1\n"); fprintf(file, "VDim: 1\n"); fprintf(file, "Ordering: 0\n\n"); /* save solution */ for (i = 0; i < nvalues; i++) { fprintf(file, "%.14e\n", values[i]); } fflush(file); fclose(file); free(values); /* save local finite element mesh */ GLVis_PrintLocalRhombusMesh("vis/ex13.mesh", n, myid, gamma); /* additional visualization data */ GLVis_PrintData("vis/ex13.data", myid, num_procs); #endif } if (myid == 0) { printf("\n"); printf("Iterations = %d\n", its); printf("Final Relative Residual Norm = %g\n", final_res_norm); printf("\n"); } } /* Free memory */ HYPRE_SStructGridDestroy(grid); HYPRE_SStructStencilDestroy(stencil); HYPRE_SStructGraphDestroy(graph); HYPRE_SStructMatrixDestroy(A); HYPRE_SStructVectorDestroy(b); HYPRE_SStructVectorDestroy(x); /* Finalize HYPRE */ HYPRE_Finalize(); /* Finalize MPI */ MPI_Finalize(); return 0; } hypre-2.33.0/src/examples/ex14.c000066400000000000000000000555741477326011500163060ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /* Example 14 Interface: Semi-Structured interface (SStruct) Compile with: make ex14 Sample run: mpirun -np 6 ex14 -n 10 To see options: ex14 -help Description: This code solves the 2D Laplace equation using bilinear finite element discretization on a mesh with an "enhanced connectivity" point. Specifically, we solve -Delta u = 1 with zero boundary conditions on a star-shaped domain consisting of identical rhombic parts each meshed with a uniform n x n grid. Every part is assigned to a different processor and all parts meet at the origin, equally subdividing the 2*pi angle there. The case of six processors (parts) looks as follows: + / \ / \ / \ +--------+ 1 +---------+ \ \ / / \ 2 \ / 0 / \ \ / / +--------+---------+ / / \ \ / 3 / \ 5 \ / / \ \ +--------+ 4 +---------+ \ / \ / \ / + Note that in this problem we use nodal variables, which are shared between the different parts. The node at the origin, for example, belongs to all parts as illustrated below: . / \ . . / \ / \ o . * .---.---o \ / \ / *---.---. \ \ \ o * / / / .---.---o \ / *---.---. \ \ \ x / / / @---@---x x---z---z @---@---x x---z---z / / / x \ \ \ .---.---a / \ #---.---. / / / a # \ \ \ .---.---a / \ / \ #---.---. a . # \ / \ / . . \ / . This example is a identical to Example 13, except that it uses the SStruct FEM input functions instead of stencils to describe the problem. This is the recommended way to set up a finite element problem in the SStruct interface. */ #include #include #include #include #include "HYPRE_sstruct_mv.h" #include "HYPRE_sstruct_ls.h" #include "HYPRE.h" #include "ex.h" #ifndef M_PI #define M_PI 3.14159265358979 #endif #ifdef HYPRE_EXVIS #include "vis.c" #endif /* This routine computes the bilinear finite element stiffness matrix and load vector on a rhombus with angle gamma. Specifically, let R be the rhombus [3]------[2] / / / / [0]------[1] with sides of length h. The finite element stiffness matrix S_ij = (grad phi_i,grad phi_j)_R with bilinear finite element functions {phi_i} has the form / 4-k -1 -2+k -1 \ alpha . | -1 4+k -1 -2-k | | -2+k -1 4-k -1 | \ -1 -2-k -1 4+k / where alpha = 1/(6*sin(gamma)) and k = 3*cos(gamma). The load vector corresponding to a right-hand side of 1 is F_j = (1,phi_j)_R = h^2/4 * sin(gamma) */ void ComputeFEMRhombus (double **S, double F[4], double gamma, double h) { int i, j; double h2_4 = h * h / 4; double sing = sin(gamma); double alpha = 1 / (6 * sing); double k = 3 * cos(gamma); S[0][0] = alpha * (4 - k); S[0][1] = alpha * (-1); S[0][2] = alpha * (-2 + k); S[0][3] = alpha * (-1); S[1][1] = alpha * (4 + k); S[1][2] = alpha * (-1); S[1][3] = alpha * (-2 - k); S[2][2] = alpha * (4 - k); S[2][3] = alpha * (-1); S[3][3] = alpha * (4 + k); /* The stiffness matrix is symmetric */ for (i = 1; i < 4; i++) for (j = 0; j < i; j++) { S[i][j] = S[j][i]; } for (i = 0; i < 4; i++) { F[i] = h2_4 * sing; } } int main (int argc, char *argv[]) { int myid, num_procs; int n; double gamma, h; int vis; HYPRE_SStructGrid grid; HYPRE_SStructGraph graph; HYPRE_SStructMatrix A; HYPRE_SStructVector b; HYPRE_SStructVector x; HYPRE_Solver solver; /* Initialize MPI */ MPI_Init(&argc, &argv); MPI_Comm_rank(MPI_COMM_WORLD, &myid); MPI_Comm_size(MPI_COMM_WORLD, &num_procs); /* Initialize HYPRE */ HYPRE_Initialize(); /* Print GPU info */ /* HYPRE_PrintDeviceInfo(); */ /* Set default parameters */ n = 10; vis = 0; /* Parse command line */ { int arg_index = 0; int print_usage = 0; while (arg_index < argc) { if ( strcmp(argv[arg_index], "-n") == 0 ) { arg_index++; n = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-vis") == 0 ) { arg_index++; vis = 1; } else if ( strcmp(argv[arg_index], "-help") == 0 ) { print_usage = 1; break; } else { arg_index++; } } if ((print_usage) && (myid == 0)) { printf("\n"); printf("Usage: %s []\n", argv[0]); printf("\n"); printf(" -n : problem size per processor (default: 10)\n"); printf(" -vis : save the solution for GLVis visualization\n"); printf("\n"); } if (print_usage) { MPI_Finalize(); return (0); } } /* Set the rhombus angle, gamma, and the mesh size, h, depending on the number of processors np and the given n */ if (num_procs < 3) { if (myid == 0) { printf("Must run with at least 3 processors!\n"); } MPI_Finalize(); exit(1); } gamma = 2 * M_PI / num_procs; h = 1.0 / n; /* 1. Set up the grid. We will set up the grid so that processor X owns part X. Note that each part has its own index space numbering. Later we relate the parts to each other. */ { int ndim = 2; int nparts = num_procs; /* Create an empty 2D grid object */ HYPRE_SStructGridCreate(MPI_COMM_WORLD, ndim, nparts, &grid); /* Set the extents of the grid - each processor sets its grid boxes. Each part has its own relative index space numbering */ { int part = myid; int ilower[2] = {1, 1}; /* lower-left cell touching the origin */ int iupper[2] = {n, n}; /* upper-right cell */ HYPRE_SStructGridSetExtents(grid, part, ilower, iupper); } /* Set the variable type and number of variables on each part. These need to be set in each part which is neighboring or contains boxes owned by the processor. */ { int i; int nvars = 1; HYPRE_SStructVariable vartypes[1] = {HYPRE_SSTRUCT_VARIABLE_NODE}; for (i = 0; i < nparts; i++) { HYPRE_SStructGridSetVariables(grid, i, nvars, vartypes); } } /* Set the ordering of the variables in the finite element problem. This is done by listing the variable offset directions relative to the element's center. See the Reference Manual for more details. */ { int part = myid; int ordering[12] = { 0, -1, -1, /* [3]------[2] */ 0, +1, -1, /* / / */ 0, +1, +1, /* / / */ 0, -1, +1 /* [0]------[1] */ }; HYPRE_SStructGridSetFEMOrdering(grid, part, ordering); } /* Now we need to set the spatial relation between each of the parts. Since we are using nodal variables, we have to use SetSharedPart to establish the connection at the origin. */ { /* Relation to the clockwise-previous neighbor part, e.g. 0 and 1 for the case of 6 parts. Note that we could have used SetNeighborPart here instead of SetSharedPart. */ { int part = myid; /* the box of cells intersecting the boundary in the current part */ int ilower[2] = {1, 1}, iupper[2] = {1, n}; /* share all data on the left side of the box */ int offset[2] = {-1, 0}; int shared_part = (myid + 1) % num_procs; /* the box of cells intersecting the boundary in the neighbor */ int shared_ilower[2] = {1, 1}, shared_iupper[2] = {n, 1}; /* share all data on the bottom of the box */ int shared_offset[2] = {0, -1}; /* x/y-direction on the current part is -y/x on the neighbor */ int index_map[2] = {1, 0}; int index_dir[2] = {-1, 1}; HYPRE_SStructGridSetSharedPart(grid, part, ilower, iupper, offset, shared_part, shared_ilower, shared_iupper, shared_offset, index_map, index_dir); } /* Relation to the clockwise-following neighbor part, e.g. 0 and 5 for the case of 6 parts. Note that we could have used SetNeighborPart here instead of SetSharedPart. */ { int part = myid; /* the box of cells intersecting the boundary in the current part */ int ilower[2] = {1, 1}, iupper[2] = {n, 1}; /* share all data on the bottom of the box */ int offset[2] = {0, -1}; int shared_part = (myid + num_procs - 1) % num_procs; /* the box of cells intersecting the boundary in the neighbor */ int shared_ilower[2] = {1, 1}, shared_iupper[2] = {1, n}; /* share all data on the left side of the box */ int shared_offset[2] = {-1, 0}; /* x/y-direction on the current part is y/-x on the neighbor */ int index_map[2] = {1, 0}; int index_dir[2] = {1, -1}; HYPRE_SStructGridSetSharedPart(grid, part, ilower, iupper, offset, shared_part, shared_ilower, shared_iupper, shared_offset, index_map, index_dir); } /* Relation to all other parts, e.g. 0 and 2,3,4. This can be described only by SetSharedPart. */ { int part = myid; /* the (one cell) box that touches the origin */ int ilower[2] = {1, 1}, iupper[2] = {1, 1}; /* share all data in the bottom left corner (i.e. the origin) */ int offset[2] = {-1, -1}; int shared_part; /* the box of one cell that touches the origin */ int shared_ilower[2] = {1, 1}, shared_iupper[2] = {1, 1}; /* share all data in the bottom left corner (i.e. the origin) */ int shared_offset[2] = {-1, -1}; /* x/y-direction on the current part is -x/-y on the neighbor, but in this case the arguments are not really important since we are only sharing a point */ int index_map[2] = {0, 1}; int index_dir[2] = {-1, -1}; for (shared_part = 0; shared_part < myid - 1; shared_part++) HYPRE_SStructGridSetSharedPart(grid, part, ilower, iupper, offset, shared_part, shared_ilower, shared_iupper, shared_offset, index_map, index_dir); for (shared_part = myid + 2; shared_part < num_procs; shared_part++) HYPRE_SStructGridSetSharedPart(grid, part, ilower, iupper, offset, shared_part, shared_ilower, shared_iupper, shared_offset, index_map, index_dir); } } /* Now the grid is ready to be used */ HYPRE_SStructGridAssemble(grid); } /* 2. Set up the Graph - this determines the non-zero structure of the matrix. */ { int part; /* Create the graph object */ HYPRE_SStructGraphCreate(MPI_COMM_WORLD, grid, &graph); /* See MatrixSetObjectType below */ HYPRE_SStructGraphSetObjectType(graph, HYPRE_PARCSR); /* Indicate that this problem uses finite element stiffness matrices and load vectors, instead of stencils. */ for (part = 0; part < num_procs; part++) { HYPRE_SStructGraphSetFEM(graph, part); } /* The local stiffness matrix is full, so there is no need to call HYPRE_SStructGraphSetFEMSparsity to set its sparsity pattern. */ /* Assemble the graph */ HYPRE_SStructGraphAssemble(graph); } /* 3. Set up the SStruct Matrix and right-hand side vector */ { int part = myid; /* Create the matrix object */ HYPRE_SStructMatrixCreate(MPI_COMM_WORLD, graph, &A); /* Use a ParCSR storage */ HYPRE_SStructMatrixSetObjectType(A, HYPRE_PARCSR); /* Indicate that the matrix coefficients are ready to be set */ HYPRE_SStructMatrixInitialize(A); /* Create an empty vector object */ HYPRE_SStructVectorCreate(MPI_COMM_WORLD, grid, &b); /* Use a ParCSR storage */ HYPRE_SStructVectorSetObjectType(b, HYPRE_PARCSR); /* Indicate that the vector coefficients are ready to be set */ HYPRE_SStructVectorInitialize(b); /* Set the matrix and vector entries by finite element assembly */ { /* local stifness matrix and load vector */ /* OK to use constant-length arrays for CPUs */ /* double S[4][4], F[4]; */ double *F = (double *) malloc(4 * sizeof(double)); double *S_flat = (double *) malloc(16 * sizeof(double)); double *S[4]; S[0] = S_flat; S[1] = S[0] + 4; S[2] = S[1] + 4; S[3] = S[2] + 4; int i, j, k; int index[2]; /* set the values in the interior cells */ { ComputeFEMRhombus(S, F, gamma, h); for (i = 1; i <= n; i++) for (j = 1; j <= n; j++) { index[0] = i; index[1] = j; HYPRE_SStructMatrixAddFEMValues(A, part, index, &S[0][0]); HYPRE_SStructVectorAddFEMValues(b, part, index, F); } } /* cells having nodes 1,2 on the domain boundary */ { ComputeFEMRhombus(S, F, gamma, h); /* eliminate nodes 1,2 from S and F */ for (k = 0; k < 4; k++) { S[1][k] = S[k][1] = 0.0; S[2][k] = S[k][2] = 0.0; } S[1][1] = 1.0; S[2][2] = 1.0; F[1] = 0.0; F[2] = 0.0; for (i = n; i <= n; i++) for (j = 1; j <= n; j++) { index[0] = i; index[1] = j; HYPRE_SStructMatrixAddFEMValues(A, part, index, &S[0][0]); HYPRE_SStructVectorAddFEMValues(b, part, index, F); } } /* cells having nodes 2,3 on the domain boundary */ { ComputeFEMRhombus(S, F, gamma, h); /* eliminate nodes 2,3 from S and F */ for (k = 0; k < 4; k++) { S[2][k] = S[k][2] = 0.0; S[3][k] = S[k][3] = 0.0; } S[2][2] = 1.0; S[3][3] = 1.0; F[2] = 0.0; F[3] = 0.0; for (i = 1; i <= n; i++) for (j = n; j <= n; j++) { index[0] = i; index[1] = j; HYPRE_SStructMatrixAddFEMValues(A, part, index, &S[0][0]); HYPRE_SStructVectorAddFEMValues(b, part, index, F); } } /* cells having nodes 1,2,3 on the domain boundary */ { ComputeFEMRhombus(S, F, gamma, h); /* eliminate nodes 2,3 from S and F */ for (k = 0; k < 4; k++) { S[1][k] = S[k][1] = 0.0; S[2][k] = S[k][2] = 0.0; S[3][k] = S[k][3] = 0.0; } S[1][1] = 1.0; S[2][2] = 1.0; S[3][3] = 1.0; F[1] = 0.0; F[2] = 0.0; F[3] = 0.0; for (i = n; i <= n; i++) for (j = n; j <= n; j++) { index[0] = i; index[1] = j; HYPRE_SStructMatrixAddFEMValues(A, part, index, &S[0][0]); HYPRE_SStructVectorAddFEMValues(b, part, index, F); } } free(F); free(S_flat); } } /* Collective calls finalizing the matrix and vector assembly */ HYPRE_SStructMatrixAssemble(A); HYPRE_SStructVectorAssemble(b); /* 4. Set up SStruct Vector for the solution vector x */ { int part = myid; int var = 0; int nvalues = (n + 1) * (n + 1); double *values; /* Since the SetBoxValues() calls below set the values of the nodes in the upper-right corners of the cells, the nodal box should start from (0,0) instead of (1,1). */ int ilower[2] = {0, 0}; int iupper[2] = {n, n}; values = (double*) calloc(nvalues, sizeof(double)); /* Create an empty vector object */ HYPRE_SStructVectorCreate(MPI_COMM_WORLD, grid, &x); /* Set the object type to ParCSR */ HYPRE_SStructVectorSetObjectType(x, HYPRE_PARCSR); /* Indicate that the vector coefficients are ready to be set */ HYPRE_SStructVectorInitialize(x); /* Set the values for the initial guess */ HYPRE_SStructVectorSetBoxValues(x, part, ilower, iupper, var, values); free(values); /* Finalize the vector assembly */ HYPRE_SStructVectorAssemble(x); } /* 5. Set up and call the solver (Solver options can be found in the Reference Manual.) */ { double final_res_norm; int its; HYPRE_ParCSRMatrix par_A; HYPRE_ParVector par_b; HYPRE_ParVector par_x; /* Extract the ParCSR objects needed in the solver */ HYPRE_SStructMatrixGetObject(A, (void **) &par_A); HYPRE_SStructVectorGetObject(b, (void **) &par_b); HYPRE_SStructVectorGetObject(x, (void **) &par_x); /* Here we construct a BoomerAMG solver. See the other SStruct examples as well as the Reference manual for additional solver choices. */ HYPRE_BoomerAMGCreate(&solver); HYPRE_BoomerAMGSetOldDefault(solver); HYPRE_BoomerAMGSetStrongThreshold(solver, 0.25); HYPRE_BoomerAMGSetTol(solver, 1e-6); HYPRE_BoomerAMGSetPrintLevel(solver, 2); HYPRE_BoomerAMGSetMaxIter(solver, 50); /* call the setup */ HYPRE_BoomerAMGSetup(solver, par_A, par_b, par_x); /* call the solve */ HYPRE_BoomerAMGSolve(solver, par_A, par_b, par_x); /* get some info */ HYPRE_BoomerAMGGetNumIterations(solver, &its); HYPRE_BoomerAMGGetFinalRelativeResidualNorm(solver, &final_res_norm); /* clean up */ HYPRE_BoomerAMGDestroy(solver); /* Gather the solution vector */ HYPRE_SStructVectorGather(x); /* Save the solution for GLVis visualization, see vis/glvis-ex13.sh */ if (vis) { #ifdef HYPRE_EXVIS FILE *file; char filename[255]; int i, part = myid, var = 0; int nvalues = (n + 1) * (n + 1); double *values = (double*) calloc(nvalues, sizeof(double)); int ilower[2] = {0, 0}; int iupper[2] = {n, n}; /* get all local data (including a local copy of the shared values) */ HYPRE_SStructVectorGetBoxValues(x, part, ilower, iupper, var, values); sprintf(filename, "%s.%06d", "vis/ex14.sol", myid); if ((file = fopen(filename, "w")) == NULL) { printf("Error: can't open output file %s\n", filename); MPI_Finalize(); exit(1); } /* finite element space header */ fprintf(file, "FiniteElementSpace\n"); fprintf(file, "FiniteElementCollection: H1_2D_P1\n"); fprintf(file, "VDim: 1\n"); fprintf(file, "Ordering: 0\n\n"); /* save solution */ for (i = 0; i < nvalues; i++) { fprintf(file, "%.14e\n", values[i]); } fflush(file); fclose(file); free(values); /* save local finite element mesh */ GLVis_PrintLocalRhombusMesh("vis/ex14.mesh", n, myid, gamma); /* additional visualization data */ GLVis_PrintData("vis/ex14.data", myid, num_procs); #endif } if (myid == 0) { printf("\n"); printf("Iterations = %d\n", its); printf("Final Relative Residual Norm = %g\n", final_res_norm); printf("\n"); } } /* Free memory */ HYPRE_SStructGridDestroy(grid); HYPRE_SStructGraphDestroy(graph); HYPRE_SStructMatrixDestroy(A); HYPRE_SStructVectorDestroy(b); HYPRE_SStructVectorDestroy(x); /* Finalize HYPRE */ HYPRE_Finalize(); /* Finalize MPI */ MPI_Finalize(); return 0; } hypre-2.33.0/src/examples/ex15.c000066400000000000000000001211531477326011500162720ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /* Example 15 Interface: Semi-Structured interface (SStruct) Compile with: make ex15 Sample run: mpirun -np 8 ex15 -n 10 To see options: ex15 -help Description: This code solves a 3D electromagnetic diffusion (definite curl-curl) problem using the lowest order Nedelec, or "edge" finite element discretization on a uniform hexahedral meshing of the unit cube. The right-hand-side corresponds to a unit vector force and we use uniform zero Dirichlet boundary conditions. The overall problem reads: curl alpha curl E + beta E = 1, with E x n = 0 on the boundary, where alpha and beta are piecewise-constant material coefficients. The linear system is split in parallel using the SStruct interface with an n x n x n grid on each processors, and similar N x N x N processor grid. Therefore, the number of processors should be a perfect cube. This example code is mainly meant as an illustration of using the Auxiliary-space Maxwell Solver (AMS) through the SStruct interface. It is also an example of setting up a finite element discretization in the SStruct interface, and we recommend viewing Example 13 and Example 14 before viewing this example. */ #include #include #include #include #include "HYPRE_sstruct_mv.h" #include "HYPRE_sstruct_ls.h" #include "HYPRE.h" #include "ex.h" #ifdef HYPRE_EXVIS #include "vis.c" #endif int optionAlpha, optionBeta; /* Curl-curl coefficient alpha = mu^{-1} */ double alpha(double x, double y, double z) { switch (optionAlpha) { case 0: /* uniform coefficient */ return 1.0; case 1: /* smooth coefficient */ return x * x + exp(y) + sin(z); case 2: /* small outside of an interior cube */ if ((fabs(x - 0.5) < 0.25) && (fabs(y - 0.5) < 0.25) && (fabs(z - 0.5) < 0.25)) { return 1.0; } else { return 1.0e-6; } case 3: /* small outside of an interior ball */ if (((x - 0.5) * (x - 0.5) + (y - 0.5) * (y - 0.5) + (z - 0.5) * (z - 0.5)) < 0.0625) { return 1.0; } else { return 1.0e-6; } case 4: /* random coefficient */ return ((double)rand() / RAND_MAX); default: return 1.0; } } /* Mass coefficient beta = sigma */ double beta(double x, double y, double z) { switch (optionBeta) { case 0: /* uniform coefficient */ return 1.0; case 1: /* smooth coefficient */ return x * x + exp(y) + sin(z); case 2:/* small outside of interior cube */ if ((fabs(x - 0.5) < 0.25) && (fabs(y - 0.5) < 0.25) && (fabs(z - 0.5) < 0.25)) { return 1.0; } else { return 1.0e-6; } case 3: /* small outside of an interior ball */ if (((x - 0.5) * (x - 0.5) + (y - 0.5) * (y - 0.5) + (z - 0.5) * (z - 0.5)) < 0.0625) { return 1.0; } else { return 1.0e-6; } case 4: /* random coefficient */ return ((double)rand() / RAND_MAX); default: return 1.0; } } /* This routine computes the lowest order Nedelec, or "edge" finite element stiffness matrix and load vector on a cube of size h. The 12 edges {e_i} are numbered in terms of the vertices as follows: [7]------[6] /| /| e_0 = 01, e_1 = 12, e_2 = 32, e_3 = 03, / | / | e_4 = 45, e_5 = 56, e_6 = 76, e_7 = 47, [4]------[5] | e_8 = 04, e_9 = 15, e_10 = 26, e_11 = 37. | [3]----|-[2] | / | / The edges are oriented from first to the |/ |/ second vertex, e.g. e_0 is from [0] to [1]. [0]------[1] We allow for different scaling of the curl-curl and the mass parts of the matrix with coefficients alpha and beta respectively: S_ij = alpha (curl phi_i,curl phi_j) + beta (phi_i, phi_j). The load vector corresponding to a right-hand side of {1,1,1} is F_j = (1,phi_j) = h^2/4. */ void ComputeFEMND1(double **S, double F[12], double x, double y, double z, double h) { int i, j; double h2_4 = h * h / 4; double cS1 = alpha(x, y, z) / (6.0 * h), cS2 = 2 * cS1, cS4 = 2 * cS2; double cM1 = beta(x, y, z) * h / 36.0, cM2 = 2 * cM1, cM4 = 2 * cM2; S[ 0][ 0] = cS4 + cM4; S[ 0][ 1] = cS2; S[ 0][ 2] = -cS1 + cM2; S[ 0][ 3] = -cS2; S[ 0][ 4] = -cS1 + cM2; S[ 0][ 5] = cS1; S[ 0][ 6] = -cS2 + cM1; S[ 0][ 7] = -cS1; S[ 0][ 8] = -cS2; S[ 0][ 9] = cS2; S[ 0][10] = cS1; S[ 0][11] = -cS1; S[ 1][ 1] = cS4 + cM4; S[ 1][ 2] = -cS2; S[ 1][ 3] = -cS1 + cM2; S[ 1][ 4] = cS1; S[ 1][ 5] = -cS1 + cM2; S[ 1][ 6] = -cS1; S[ 1][ 7] = -cS2 + cM1; S[ 1][ 8] = -cS1; S[ 1][ 9] = -cS2; S[ 1][10] = cS2; S[ 1][11] = cS1; S[ 2][ 2] = cS4 + cM4; S[ 2][ 3] = cS2; S[ 2][ 4] = -cS2 + cM1; S[ 2][ 5] = -cS1; S[ 2][ 6] = -cS1 + cM2; S[ 2][ 7] = cS1; S[ 2][ 8] = -cS1; S[ 2][ 9] = cS1; S[ 2][10] = cS2; S[ 2][11] = -cS2; S[ 3][ 3] = cS4 + cM4; S[ 3][ 4] = -cS1; S[ 3][ 5] = -cS2 + cM1; S[ 3][ 6] = cS1; S[ 3][ 7] = -cS1 + cM2; S[ 3][ 8] = -cS2; S[ 3][ 9] = -cS1; S[ 3][10] = cS1; S[ 3][11] = cS2; S[ 4][ 4] = cS4 + cM4; S[ 4][ 5] = cS2; S[ 4][ 6] = -cS1 + cM2; S[ 4][ 7] = -cS2; S[ 4][ 8] = cS2; S[ 4][ 9] = -cS2; S[ 4][10] = -cS1; S[ 4][11] = cS1; S[ 5][ 5] = cS4 + cM4; S[ 5][ 6] = -cS2; S[ 5][ 7] = -cS1 + cM2; S[ 5][ 8] = cS1; S[ 5][ 9] = cS2; S[ 5][10] = -cS2; S[ 5][11] = -cS1; S[ 6][ 6] = cS4 + cM4; S[ 6][ 7] = cS2; S[ 6][ 8] = cS1; S[ 6][ 9] = -cS1; S[ 6][10] = -cS2; S[ 6][11] = cS2; S[ 7][ 7] = cS4 + cM4; S[ 7][ 8] = cS2; S[ 7][ 9] = cS1; S[ 7][10] = -cS1; S[ 7][11] = -cS2; S[ 8][ 8] = cS4 + cM4; S[ 8][ 9] = -cS1 + cM2; S[ 8][10] = -cS2 + cM1; S[ 8][11] = -cS1 + cM2; S[ 9][ 9] = cS4 + cM4; S[ 9][10] = -cS1 + cM2; S[ 9][11] = -cS2 + cM1; S[10][10] = cS4 + cM4; S[10][11] = -cS1 + cM2; S[11][11] = cS4 + cM4; /* The stiffness matrix is symmetric */ for (i = 1; i < 12; i++) for (j = 0; j < i; j++) { S[i][j] = S[j][i]; } for (i = 0; i < 12; i++) { F[i] = h2_4; } } int main (int argc, char *argv[]) { int myid, num_procs; int n, N, pi, pj, pk; double h; int vis; double tol, theta; int maxit, cycle_type; int rlx_type, rlx_sweeps, rlx_weight, rlx_omega; int amg_coarsen_type, amg_agg_levels, amg_rlx_type; int amg_interp_type, amg_Pmax; int singular_problem ; double mytime = 0.0; double walltime = 0.0; HYPRE_SStructGrid edge_grid; HYPRE_SStructGraph A_graph; HYPRE_SStructMatrix A; HYPRE_SStructVector b; HYPRE_SStructVector x; HYPRE_SStructGrid node_grid; HYPRE_SStructGraph G_graph; HYPRE_SStructStencil G_stencil[3]; HYPRE_SStructMatrix G; HYPRE_SStructVector xcoord, ycoord, zcoord; HYPRE_Solver solver, precond; /* Initialize MPI */ MPI_Init(&argc, &argv); MPI_Comm_rank(MPI_COMM_WORLD, &myid); MPI_Comm_size(MPI_COMM_WORLD, &num_procs); /* Initialize HYPRE */ HYPRE_Initialize(); /* Print GPU info */ /* HYPRE_PrintDeviceInfo(); */ /* Set default parameters */ n = 10; vis = 0; optionAlpha = 0; optionBeta = 0; maxit = 100; tol = 1e-6; cycle_type = 13; rlx_type = 2; rlx_sweeps = 1; rlx_weight = 1.0; rlx_omega = 1.0; amg_coarsen_type = 10; amg_agg_levels = 1; amg_rlx_type = 6; theta = 0.25; amg_interp_type = 6; amg_Pmax = 4; singular_problem = 0; /* Parse command line */ { int arg_index = 0; int print_usage = 0; while (arg_index < argc) { if ( strcmp(argv[arg_index], "-n") == 0 ) { arg_index++; n = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-a") == 0 ) { arg_index++; optionAlpha = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-b") == 0 ) { arg_index++; optionBeta = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-vis") == 0 ) { arg_index++; vis = 1; } else if ( strcmp(argv[arg_index], "-maxit") == 0 ) { arg_index++; maxit = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-tol") == 0 ) { arg_index++; tol = atof(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-type") == 0 ) { arg_index++; cycle_type = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-rlx") == 0 ) { arg_index++; rlx_type = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-rlxn") == 0 ) { arg_index++; rlx_sweeps = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-rlxw") == 0 ) { arg_index++; rlx_weight = atof(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-rlxo") == 0 ) { arg_index++; rlx_omega = atof(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-ctype") == 0 ) { arg_index++; amg_coarsen_type = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-amgrlx") == 0 ) { arg_index++; amg_rlx_type = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-agg") == 0 ) { arg_index++; amg_agg_levels = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-itype") == 0 ) { arg_index++; amg_interp_type = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-pmax") == 0 ) { arg_index++; amg_Pmax = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-sing") == 0 ) { arg_index++; singular_problem = 1; } else if ( strcmp(argv[arg_index], "-theta") == 0 ) { arg_index++; theta = atof(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-help") == 0 ) { print_usage = 1; break; } else { arg_index++; } } if ((print_usage) && (myid == 0)) { printf("\n"); printf("Usage: %s []\n", argv[0]); printf("\n"); printf(" -n : problem size per processor (default: 10)\n"); printf(" -a : choice for the curl-curl coefficient (default: 1)\n"); printf(" -b : choice for the mass coefficient (default: 1)\n"); printf(" -vis : save the solution for GLVis visualization\n"); printf("\n"); printf("PCG-AMS solver options: \n"); printf(" -maxit : maximum number of iterations (100) \n"); printf(" -tol : convergence tolerance (1e-6) \n"); printf(" -type : 3-level cycle type (0-8, 11-14) \n"); printf(" -theta : BoomerAMG threshold (0.25) \n"); printf(" -ctype : BoomerAMG coarsening type \n"); printf(" -agg : Levels of BoomerAMG agg. coarsening \n"); printf(" -amgrlx : BoomerAMG relaxation type \n"); printf(" -itype : BoomerAMG interpolation type \n"); printf(" -pmax : BoomerAMG interpolation truncation \n"); printf(" -rlx : relaxation type \n"); printf(" -rlxn : number of relaxation sweeps \n"); printf(" -rlxw : damping parameter (usually <=1) \n"); printf(" -rlxo : SOR parameter (usually in (0,2)) \n"); printf(" -sing : curl-curl only (singular) problem \n"); printf("\n"); printf("\n"); } if (print_usage) { MPI_Finalize(); return (0); } } /* Figure out the processor grid (N x N x N). The local problem size is n^3, while pi, pj and pk indicate the position in the processor grid. */ N = pow(num_procs, 1.0 / 3.0) + 0.5; if (num_procs != N * N * N) { if (myid == 0) printf("Can't run on %d processors, try %d.\n", num_procs, N * N * N); MPI_Finalize(); exit(1); } h = 1.0 / (N * n); pk = myid / (N * N); pj = myid / N - pk * N; pi = myid - pj * N - pk * N * N; /* Start timing */ mytime -= MPI_Wtime(); /* 1. Set up the edge and nodal grids. Note that we do this simultaneously to make sure that they have the same extents. For simplicity we use only one part to represent the unit cube. */ { int ndim = 3; int nparts = 1; /* Create empty 2D grid objects */ HYPRE_SStructGridCreate(MPI_COMM_WORLD, ndim, nparts, &node_grid); HYPRE_SStructGridCreate(MPI_COMM_WORLD, ndim, nparts, &edge_grid); /* Set the extents of the grid - each processor sets its grid boxes. */ { int part = 0; int ilower[3] = {1 + pi * n, 1 + pj * n, 1 + pk * n}; int iupper[3] = {n + pi * n, n + pj * n, n + pk * n}; HYPRE_SStructGridSetExtents(node_grid, part, ilower, iupper); HYPRE_SStructGridSetExtents(edge_grid, part, ilower, iupper); } /* Set the variable type and number of variables on each grid. */ { int i; int nnodevars = 1; int nedgevars = 3; HYPRE_SStructVariable nodevars[1] = {HYPRE_SSTRUCT_VARIABLE_NODE}; HYPRE_SStructVariable edgevars[3] = {HYPRE_SSTRUCT_VARIABLE_XEDGE, HYPRE_SSTRUCT_VARIABLE_YEDGE, HYPRE_SSTRUCT_VARIABLE_ZEDGE }; for (i = 0; i < nparts; i++) { HYPRE_SStructGridSetVariables(node_grid, i, nnodevars, nodevars); HYPRE_SStructGridSetVariables(edge_grid, i, nedgevars, edgevars); } } /* Since there is only one part, there is no need to call the SetNeighborPart or SetSharedPart functions, which determine the spatial relation between the parts. See Examples 12, 13 and 14 for illustrations of these calls. */ /* Now the grids are ready to be used */ HYPRE_SStructGridAssemble(node_grid); HYPRE_SStructGridAssemble(edge_grid); } /* 2. Create the finite element stiffness matrix A and load vector b. */ { int part = 0; /* this problem has only one part */ /* Set the ordering of the variables in the finite element problem. This is done by listing the variable offset directions relative to the element's center. See the Reference Manual for more details. */ { int ordering[48] = { 0, 0, -1, -1, /* x-edge [0]-[1] */ 1, +1, 0, -1, /* y-edge [1]-[2] */ 0, 0, +1, -1, /* x-edge [3]-[2] [7]------[6] */ 1, -1, 0, -1, /* y-edge [0]-[3] /| /| */ 0, 0, -1, +1, /* x-edge [4]-[5] / | / | */ 1, +1, 0, +1, /* y-edge [5]-[6] [4]------[5] | */ 0, 0, +1, +1, /* x-edge [7]-[6] | [3]----|-[2] */ 1, -1, 0, +1, /* y-edge [4]-[7] | / | / */ 2, -1, -1, 0, /* z-edge [0]-[4] |/ |/ */ 2, +1, -1, 0, /* z-edge [1]-[5] [0]------[1] */ 2, +1, +1, 0, /* z-edge [2]-[6] */ 2, -1, +1, 0 /* z-edge [3]-[7] */ }; HYPRE_SStructGridSetFEMOrdering(edge_grid, part, ordering); } /* Set up the Graph - this determines the non-zero structure of the matrix. */ { int part = 0; /* Create the graph object */ HYPRE_SStructGraphCreate(MPI_COMM_WORLD, edge_grid, &A_graph); /* See MatrixSetObjectType below */ HYPRE_SStructGraphSetObjectType(A_graph, HYPRE_PARCSR); /* Indicate that this problem uses finite element stiffness matrices and load vectors, instead of stencils. */ HYPRE_SStructGraphSetFEM(A_graph, part); /* The edge finite element matrix is full, so there is no need to call the HYPRE_SStructGraphSetFEMSparsity() function. */ /* Assemble the graph */ HYPRE_SStructGraphAssemble(A_graph); } /* Set up the SStruct Matrix and right-hand side vector */ { /* Create the matrix object */ HYPRE_SStructMatrixCreate(MPI_COMM_WORLD, A_graph, &A); /* Use a ParCSR storage */ HYPRE_SStructMatrixSetObjectType(A, HYPRE_PARCSR); /* Indicate that the matrix coefficients are ready to be set */ HYPRE_SStructMatrixInitialize(A); /* Create an empty vector object */ HYPRE_SStructVectorCreate(MPI_COMM_WORLD, edge_grid, &b); /* Use a ParCSR storage */ HYPRE_SStructVectorSetObjectType(b, HYPRE_PARCSR); /* Indicate that the vector coefficients are ready to be set */ HYPRE_SStructVectorInitialize(b); } /* Set the matrix and vector entries by finite element assembly */ { /* local stiffness matrix and load vector */ /* OK to use constant-length arrays for CPUs */ /* double S[12][12], F[12]; */ double *F = (double *) malloc(12 * sizeof(double)); double *S_flat = (double *) malloc(12 * 12 * sizeof(double)); double *S[12]; int i, j, k; int index[3]; for (i = 0; i < 12; i++) { S[i] = &S_flat[i * 12]; } for (i = 1; i <= n; i++) { for (j = 1; j <= n; j++) { for (k = 1; k <= n; k++) { /* Compute the FEM matrix and r.h.s. for cell (i,j,k) with coefficients evaluated at the cell center. */ index[0] = i + pi * n; index[1] = j + pj * n; index[2] = k + pk * n; ComputeFEMND1(S, F, (pi * n + i)*h - h / 2, (pj * n + j)*h - h / 2, (pk * n + k)*h - h / 2, h); /* Eliminate boundary conditions on x = 0 */ if (index[0] == 1) { int ii, jj, bc_edges[4] = { 3, 11, 7, 8 }; for (ii = 0; ii < 4; ii++) { for (jj = 0; jj < 12; jj++) { S[bc_edges[ii]][jj] = S[jj][bc_edges[ii]] = 0.0; } S[bc_edges[ii]][bc_edges[ii]] = 1.0; F[bc_edges[ii]] = 0.0; } } /* Eliminate boundary conditions on y = 0 */ if (index[1] == 1) { int ii, jj, bc_edges[4] = { 0, 9, 4, 8 }; for (ii = 0; ii < 4; ii++) { for (jj = 0; jj < 12; jj++) { S[bc_edges[ii]][jj] = S[jj][bc_edges[ii]] = 0.0; } S[bc_edges[ii]][bc_edges[ii]] = 1.0; F[bc_edges[ii]] = 0.0; } } /* Eliminate boundary conditions on z = 0 */ if (index[2] == 1) { int ii, jj, bc_edges[4] = { 0, 1, 2, 3 }; for (ii = 0; ii < 4; ii++) { for (jj = 0; jj < 12; jj++) { S[bc_edges[ii]][jj] = S[jj][bc_edges[ii]] = 0.0; } S[bc_edges[ii]][bc_edges[ii]] = 1.0; F[bc_edges[ii]] = 0.0; } } /* Eliminate boundary conditions on x = 1 */ if (index[0] == N * n) { int ii, jj, bc_edges[4] = { 1, 10, 5, 9 }; for (ii = 0; ii < 4; ii++) { for (jj = 0; jj < 12; jj++) { S[bc_edges[ii]][jj] = S[jj][bc_edges[ii]] = 0.0; } S[bc_edges[ii]][bc_edges[ii]] = 1.0; F[bc_edges[ii]] = 0.0; } } /* Eliminate boundary conditions on y = 1 */ if (index[1] == N * n) { int ii, jj, bc_edges[4] = { 2, 10, 6, 11 }; for (ii = 0; ii < 4; ii++) { for (jj = 0; jj < 12; jj++) { S[bc_edges[ii]][jj] = S[jj][bc_edges[ii]] = 0.0; } S[bc_edges[ii]][bc_edges[ii]] = 1.0; F[bc_edges[ii]] = 0.0; } } /* Eliminate boundary conditions on z = 1 */ if (index[2] == N * n) { int ii, jj, bc_edges[4] = { 4, 5, 6, 7 }; for (ii = 0; ii < 4; ii++) { for (jj = 0; jj < 12; jj++) { S[bc_edges[ii]][jj] = S[jj][bc_edges[ii]] = 0.0; } S[bc_edges[ii]][bc_edges[ii]] = 1.0; F[bc_edges[ii]] = 0.0; } } /* Assemble the matrix */ HYPRE_SStructMatrixAddFEMValues(A, part, index, &S[0][0]); /* Assemble the vector */ HYPRE_SStructVectorAddFEMValues(b, part, index, F); } } } free(F); free(S_flat); } /* Collective calls finalizing the matrix and vector assembly */ HYPRE_SStructMatrixAssemble(A); HYPRE_SStructVectorAssemble(b); } /* 3. Create the discrete gradient matrix G, which is needed in AMS. */ { int part = 0; int stencil_size = 2; /* Define the discretization stencil relating the edges and nodes of the grid. */ { int ndim = 3; int entry; int var = 0; /* the node variable */ /* The discrete gradient stencils connect edge to node variables. */ int Gx_offsets[2][3] = {{-1, 0, 0}, {0, 0, 0}}; /* x-edge [7]-[6] */ int Gy_offsets[2][3] = {{0, -1, 0}, {0, 0, 0}}; /* y-edge [5]-[6] */ int Gz_offsets[2][3] = {{0, 0, -1}, {0, 0, 0}}; /* z-edge [2]-[6] */ HYPRE_SStructStencilCreate(ndim, stencil_size, &G_stencil[0]); HYPRE_SStructStencilCreate(ndim, stencil_size, &G_stencil[1]); HYPRE_SStructStencilCreate(ndim, stencil_size, &G_stencil[2]); for (entry = 0; entry < stencil_size; entry++) { HYPRE_SStructStencilSetEntry(G_stencil[0], entry, Gx_offsets[entry], var); HYPRE_SStructStencilSetEntry(G_stencil[1], entry, Gy_offsets[entry], var); HYPRE_SStructStencilSetEntry(G_stencil[2], entry, Gz_offsets[entry], var); } } /* Set up the Graph - this determines the non-zero structure of the matrix. */ { int nvars = 3; int var; /* the edge variables */ /* Create the discrete gradient graph object */ HYPRE_SStructGraphCreate(MPI_COMM_WORLD, edge_grid, &G_graph); /* See MatrixSetObjectType below */ HYPRE_SStructGraphSetObjectType(G_graph, HYPRE_PARCSR); /* Since the discrete gradient relates edge and nodal variables (it is a rectangular matrix), we have to specify the domain (column) grid. */ HYPRE_SStructGraphSetDomainGrid(G_graph, node_grid); /* Tell the graph which stencil to use for each edge variable on each part (we only have one part). */ for (var = 0; var < nvars; var++) { HYPRE_SStructGraphSetStencil(G_graph, part, var, G_stencil[var]); } /* Assemble the graph */ HYPRE_SStructGraphAssemble(G_graph); } /* Set up the SStruct Matrix */ { /* Create the matrix object */ HYPRE_SStructMatrixCreate(MPI_COMM_WORLD, G_graph, &G); /* Use a ParCSR storage */ HYPRE_SStructMatrixSetObjectType(G, HYPRE_PARCSR); /* Indicate that the matrix coefficients are ready to be set */ HYPRE_SStructMatrixInitialize(G); } /* Set the discrete gradient values, assuming a "natural" orientation of the edges (i.e. one in agreement with the coordinate directions). */ { int i; int nedges = n * (n + 1) * (n + 1); double *values; int stencil_indices[2] = {0, 1}; /* the nodes of each edge */ values = (double*) calloc(2 * nedges, sizeof(double)); /* The edge orientation is fixed: from first to second node */ for (i = 0; i < nedges; i++) { values[2 * i] = -1.0; values[2 * i + 1] = 1.0; } /* Set the values in the discrete gradient x-edges */ { int var = 0; int ilower[3] = {1 + pi * n, 0 + pj * n, 0 + pk * n}; int iupper[3] = {n + pi * n, n + pj * n, n + pk * n}; HYPRE_SStructMatrixSetBoxValues(G, part, ilower, iupper, var, stencil_size, stencil_indices, values); } /* Set the values in the discrete gradient y-edges */ { int var = 1; int ilower[3] = {0 + pi * n, 1 + pj * n, 0 + pk * n}; int iupper[3] = {n + pi * n, n + pj * n, n + pk * n}; HYPRE_SStructMatrixSetBoxValues(G, part, ilower, iupper, var, stencil_size, stencil_indices, values); } /* Set the values in the discrete gradient z-edges */ { int var = 2; int ilower[3] = {0 + pi * n, 0 + pj * n, 1 + pk * n}; int iupper[3] = {n + pi * n, n + pj * n, n + pk * n}; HYPRE_SStructMatrixSetBoxValues(G, part, ilower, iupper, var, stencil_size, stencil_indices, values); } free(values); } /* Finalize the matrix assembly */ HYPRE_SStructMatrixAssemble(G); } /* 4. Create the vectors of nodal coordinates xcoord, ycoord and zcoord, which are needed in AMS. */ { int i, j, k; int part = 0; int var = 0; /* the node variable */ int index[3]; double *xyzval = (double *) malloc(3 * sizeof(double)); /* Create empty vector objects */ HYPRE_SStructVectorCreate(MPI_COMM_WORLD, node_grid, &xcoord); HYPRE_SStructVectorCreate(MPI_COMM_WORLD, node_grid, &ycoord); HYPRE_SStructVectorCreate(MPI_COMM_WORLD, node_grid, &zcoord); /* Set the object type to ParCSR */ HYPRE_SStructVectorSetObjectType(xcoord, HYPRE_PARCSR); HYPRE_SStructVectorSetObjectType(ycoord, HYPRE_PARCSR); HYPRE_SStructVectorSetObjectType(zcoord, HYPRE_PARCSR); /* Indicate that the vector coefficients are ready to be set */ HYPRE_SStructVectorInitialize(xcoord); HYPRE_SStructVectorInitialize(ycoord); HYPRE_SStructVectorInitialize(zcoord); /* Compute and set the coordinates of the nodes */ for (i = 0; i <= n; i++) for (j = 0; j <= n; j++) for (k = 0; k <= n; k++) { index[0] = i + pi * n; index[1] = j + pj * n; index[2] = k + pk * n; xyzval[0] = index[0] * h; xyzval[1] = index[1] * h; xyzval[2] = index[2] * h; HYPRE_SStructVectorSetValues(xcoord, part, index, var, &xyzval[0]); HYPRE_SStructVectorSetValues(ycoord, part, index, var, &xyzval[1]); HYPRE_SStructVectorSetValues(zcoord, part, index, var, &xyzval[2]); } /* Finalize the vector assembly */ HYPRE_SStructVectorAssemble(xcoord); HYPRE_SStructVectorAssemble(ycoord); HYPRE_SStructVectorAssemble(zcoord); free(xyzval); } /* 5. Set up a SStruct Vector for the solution vector x */ { int part = 0; int nvalues = n * (n + 1) * (n + 1); double *values; values = (double*) calloc(nvalues, sizeof(double)); /* Create an empty vector object */ HYPRE_SStructVectorCreate(MPI_COMM_WORLD, edge_grid, &x); /* Set the object type to ParCSR */ HYPRE_SStructVectorSetObjectType(x, HYPRE_PARCSR); /* Indicate that the vector coefficients are ready to be set */ HYPRE_SStructVectorInitialize(x); /* Set the values for the initial guess x-edge */ { int var = 0; int ilower[3] = {1 + pi * n, 0 + pj * n, 0 + pk * n}; int iupper[3] = {n + pi * n, n + pj * n, n + pk * n}; HYPRE_SStructVectorSetBoxValues(x, part, ilower, iupper, var, values); } /* Set the values for the initial guess y-edge */ { int var = 1; int ilower[3] = {0 + pi * n, 1 + pj * n, 0 + pk * n}; int iupper[3] = {n + pi * n, n + pj * n, n + pk * n}; HYPRE_SStructVectorSetBoxValues(x, part, ilower, iupper, var, values); } /* Set the values for the initial guess z-edge */ { int var = 2; int ilower[3] = {0 + pi * n, 0 + pj * n, 1 + pk * n}; int iupper[3] = {n + pi * n, n + pj * n, n + pk * n}; HYPRE_SStructVectorSetBoxValues(x, part, ilower, iupper, var, values); } free(values); /* Finalize the vector assembly */ HYPRE_SStructVectorAssemble(x); } /* Finalize current timing */ mytime += MPI_Wtime(); MPI_Allreduce(&mytime, &walltime, 1, MPI_DOUBLE, MPI_MAX, MPI_COMM_WORLD); if (myid == 0) { printf("\nSStruct Setup time = %f seconds\n\n", walltime); } /* 6. Set up and call the PCG-AMS solver (Solver options can be found in the Reference Manual.) */ { double final_res_norm; int its; HYPRE_ParCSRMatrix par_A; HYPRE_ParVector par_b; HYPRE_ParVector par_x; HYPRE_ParCSRMatrix par_G; HYPRE_ParVector par_xcoord; HYPRE_ParVector par_ycoord; HYPRE_ParVector par_zcoord; /* Extract the ParCSR objects needed in the solver */ HYPRE_SStructMatrixGetObject(A, (void **) &par_A); HYPRE_SStructVectorGetObject(b, (void **) &par_b); HYPRE_SStructVectorGetObject(x, (void **) &par_x); HYPRE_SStructMatrixGetObject(G, (void **) &par_G); HYPRE_SStructVectorGetObject(xcoord, (void **) &par_xcoord); HYPRE_SStructVectorGetObject(ycoord, (void **) &par_ycoord); HYPRE_SStructVectorGetObject(zcoord, (void **) &par_zcoord); if (myid == 0) { HYPRE_Int numrows, numcols; HYPRE_ParCSRMatrixGetDims(par_A, &numrows, &numcols); printf("Problem size: %d\n\n", numrows); } /* Start timing */ mytime -= MPI_Wtime(); /* Create solver */ HYPRE_ParCSRPCGCreate(MPI_COMM_WORLD, &solver); /* Set some parameters (See Reference Manual for more parameters) */ HYPRE_PCGSetMaxIter(solver, maxit); /* max iterations */ HYPRE_PCGSetTol(solver, tol); /* conv. tolerance */ HYPRE_PCGSetTwoNorm(solver, 0); /* use the two norm as the stopping criteria */ HYPRE_PCGSetPrintLevel(solver, 2); /* print solve info */ HYPRE_PCGSetLogging(solver, 1); /* needed to get run info later */ /* Create AMS preconditioner */ HYPRE_AMSCreate(&precond); /* Set AMS parameters */ HYPRE_AMSSetMaxIter(precond, 1); HYPRE_AMSSetTol(precond, 0.0); HYPRE_AMSSetCycleType(precond, cycle_type); HYPRE_AMSSetPrintLevel(precond, 1); /* Set discrete gradient */ HYPRE_AMSSetDiscreteGradient(precond, par_G); /* Set vertex coordinates */ HYPRE_AMSSetCoordinateVectors(precond, par_xcoord, par_ycoord, par_zcoord); if (singular_problem) { HYPRE_AMSSetBetaPoissonMatrix(precond, NULL); } /* Smoothing and AMG options */ HYPRE_AMSSetSmoothingOptions(precond, rlx_type, rlx_sweeps, rlx_weight, rlx_omega); HYPRE_AMSSetAlphaAMGOptions(precond, amg_coarsen_type, amg_agg_levels, amg_rlx_type, theta, amg_interp_type, amg_Pmax); HYPRE_AMSSetBetaAMGOptions(precond, amg_coarsen_type, amg_agg_levels, amg_rlx_type, theta, amg_interp_type, amg_Pmax); /* Set the PCG preconditioner */ HYPRE_PCGSetPrecond(solver, (HYPRE_PtrToSolverFcn) HYPRE_AMSSolve, (HYPRE_PtrToSolverFcn) HYPRE_AMSSetup, precond); /* Call the setup */ HYPRE_ParCSRPCGSetup(solver, par_A, par_b, par_x); /* Finalize current timing */ mytime += MPI_Wtime(); MPI_Allreduce(&mytime, &walltime, 1, MPI_DOUBLE, MPI_MAX, MPI_COMM_WORLD); if (myid == 0) { printf("\nAMS Setup time = %f seconds\n\n", walltime); } /* Start timing again */ mytime -= MPI_Wtime(); /* Call the solve */ HYPRE_ParCSRPCGSolve(solver, par_A, par_b, par_x); /* Finalize current timing */ mytime += MPI_Wtime(); MPI_Allreduce(&mytime, &walltime, 1, MPI_DOUBLE, MPI_MAX, MPI_COMM_WORLD); if (myid == 0) { printf("\nAMS Solve time = %f seconds\n\n", walltime); } /* Get some info */ HYPRE_PCGGetNumIterations(solver, &its); HYPRE_PCGGetFinalRelativeResidualNorm(solver, &final_res_norm); /* Clean up */ HYPRE_AMSDestroy(precond); HYPRE_ParCSRPCGDestroy(solver); /* Gather the solution vector */ HYPRE_SStructVectorGather(x); /* Save the solution for GLVis visualization, see vis/glvis-ex15.sh */ if (vis) { #ifdef HYPRE_EXVIS FILE *file; char filename[255]; int part = 0; int nvalues = n * (n + 1) * (n + 1); double *xvalues, *yvalues, *zvalues; xvalues = (double*) calloc(nvalues, sizeof(double)); yvalues = (double*) calloc(nvalues, sizeof(double)); zvalues = (double*) calloc(nvalues, sizeof(double)); /* Get local solution in the x-edges */ { int var = 0; int ilower[3] = {1 + pi * n, 0 + pj * n, 0 + pk * n}; int iupper[3] = {n + pi * n, n + pj * n, n + pk * n}; HYPRE_SStructVectorGetBoxValues(x, part, ilower, iupper, var, xvalues); } /* Get local solution in the y-edges */ { int var = 1; int ilower[3] = {0 + pi * n, 1 + pj * n, 0 + pk * n}; int iupper[3] = {n + pi * n, n + pj * n, n + pk * n}; HYPRE_SStructVectorGetBoxValues(x, part, ilower, iupper, var, yvalues); } /* Get local solution in the z-edges */ { int var = 2; int ilower[3] = {0 + pi * n, 0 + pj * n, 1 + pk * n}; int iupper[3] = {n + pi * n, n + pj * n, n + pk * n}; HYPRE_SStructVectorGetBoxValues(x, part, ilower, iupper, var, zvalues); } sprintf(filename, "%s.%06d", "vis/ex15.sol", myid); if ((file = fopen(filename, "w")) == NULL) { printf("Error: can't open output file %s\n", filename); MPI_Finalize(); exit(1); } /* Finite element space header */ fprintf(file, "FiniteElementSpace\n"); fprintf(file, "FiniteElementCollection: Local_Hex_ND1\n"); fprintf(file, "VDim: 1\n"); fprintf(file, "Ordering: 0\n\n"); /* Save solution with replicated shared data, i.e., element by element, using the same numbering as the local finite element unknowns. */ { int i, j, k, s; /* Initial x-, y- and z-edge indices in the values arrays */ int oi[4] = { 0, n, n*(n + 1), n*(n + 1) + n }; /* e_0, e_2, e_4, e_6 */ int oj[4] = { 0, 1, n*(n + 1), n*(n + 1) + 1 }; /* e_3, e_1, e_7, e_5 */ int ok[4] = { 0, 1, n + 1, n + 2 }; /* e_8, e_9, e_11, e_10 */ /* Loop over the cells while updating the above offsets */ for (k = 0; k < n; k++) { for (j = 0; j < n; j++) { for (i = 0; i < n; i++) { fprintf(file, "%.14e\n%.14e\n%.14e\n%.14e\n" "%.14e\n%.14e\n%.14e\n%.14e\n" "%.14e\n%.14e\n%.14e\n%.14e\n", xvalues[oi[0]], yvalues[oj[1]], xvalues[oi[1]], yvalues[oj[0]], xvalues[oi[2]], yvalues[oj[3]], xvalues[oi[3]], yvalues[oj[2]], zvalues[ok[0]], zvalues[ok[1]], zvalues[ok[3]], zvalues[ok[2]]); for (s = 0; s < 4; s++) { oi[s]++, oj[s]++, ok[s]++; } } for (s = 0; s < 4; s++) { oj[s]++, ok[s]++; } } for (s = 0; s < 4; s++) { oi[s] += n, ok[s] += n + 1; } } } fflush(file); fclose(file); free(xvalues); free(yvalues); free(zvalues); /* Save local finite element mesh */ GLVis_PrintLocalCubicMesh("vis/ex15.mesh", n, n, n, h, pi * h * n, pj * h * n, pk * h * n, myid); /* Additional visualization data */ GLVis_PrintData("vis/ex15.data", myid, num_procs); #endif } if (myid == 0) { printf("\n"); printf("Iterations = %d\n", its); printf("Final Relative Residual Norm = %g\n", final_res_norm); printf("\n"); } } /* Free memory */ HYPRE_SStructGridDestroy(edge_grid); HYPRE_SStructGraphDestroy(A_graph); HYPRE_SStructMatrixDestroy(A); HYPRE_SStructVectorDestroy(b); HYPRE_SStructVectorDestroy(x); HYPRE_SStructGridDestroy(node_grid); HYPRE_SStructGraphDestroy(G_graph); HYPRE_SStructStencilDestroy(G_stencil[0]); HYPRE_SStructStencilDestroy(G_stencil[1]); HYPRE_SStructStencilDestroy(G_stencil[2]); HYPRE_SStructMatrixDestroy(G); HYPRE_SStructVectorDestroy(xcoord); HYPRE_SStructVectorDestroy(ycoord); HYPRE_SStructVectorDestroy(zcoord); /* Finalize HYPRE */ HYPRE_Finalize(); /* Finalize MPI */ MPI_Finalize(); return 0; } hypre-2.33.0/src/examples/ex15big.c000066400000000000000000001072711477326011500167610ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /* Example 15big Interface: Semi-Structured interface (SStruct) Compile with: make ex15big Sample run: mpirun -np 8 ex15big -n 10 To see options: ex15big -help Description: This example is a slight modification of Example 15 that illustrates the 64-bit integer support in hypre needed to runproblems with more than 2B unknowns. Specifically, the changes compared to Example 15 are as follows: 1) All integer arguments to HYPRE functions should be declared of type HYPRE_Int. 2) Variables of type HYPRE_Int are 64-bit integers, so they should be printed in the %lld format (not %d). To enable the 64-bit integer support, you need to build hypre with the --enable-bigint option of 'configure'. We recommend comparing this example with Example 15. */ #include #include #include #include #include "HYPRE_sstruct_mv.h" #include "HYPRE_sstruct_ls.h" #include "HYPRE.h" #include "ex.h" int optionAlpha, optionBeta; /* Curl-curl coefficient alpha = mu^{-1} */ double alpha(double x, double y, double z) { switch (optionAlpha) { case 0: /* uniform coefficient */ return 1.0; case 1: /* smooth coefficient */ return x * x + exp(y) + sin(z); case 2: /* small outside of an interior cube */ if ((fabs(x - 0.5) < 0.25) && (fabs(y - 0.5) < 0.25) && (fabs(z - 0.5) < 0.25)) { return 1.0; } else { return 1.0e-6; } case 3: /* small outside of an interior ball */ if (((x - 0.5) * (x - 0.5) + (y - 0.5) * (y - 0.5) + (z - 0.5) * (z - 0.5)) < 0.0625) { return 1.0; } else { return 1.0e-6; } case 4: /* random coefficient */ return ((double)rand() / RAND_MAX); default: return 1.0; } } /* Mass coefficient beta = sigma */ double beta(double x, double y, double z) { switch (optionBeta) { case 0: /* uniform coefficient */ return 1.0; case 1: /* smooth coefficient */ return x * x + exp(y) + sin(z); case 2:/* small outside of interior cube */ if ((fabs(x - 0.5) < 0.25) && (fabs(y - 0.5) < 0.25) && (fabs(z - 0.5) < 0.25)) { return 1.0; } else { return 1.0e-6; } case 3: /* small outside of an interior ball */ if (((x - 0.5) * (x - 0.5) + (y - 0.5) * (y - 0.5) + (z - 0.5) * (z - 0.5)) < 0.0625) { return 1.0; } else { return 1.0e-6; } case 4: /* random coefficient */ return ((double)rand() / RAND_MAX); default: return 1.0; } } /* This routine computes the lowest order Nedelec, or "edge" finite element stiffness matrix and load vector on a cube of size h. The 12 edges {e_i} are numbered in terms of the vertices as follows: [7]------[6] /| /| e_0 = 01, e_1 = 12, e_2 = 32, e_3 = 03, / | / | e_4 = 45, e_5 = 56, e_6 = 76, e_7 = 47, [4]------[5] | e_8 = 04, e_9 = 15, e_10 = 26, e_11 = 37. | [3]----|-[2] | / | / The edges are oriented from first to the |/ |/ second vertex, e.g. e_0 is from [0] to [1]. [0]------[1] We allow for different scaling of the curl-curl and the mass parts of the matrix with coefficients alpha and beta respectively: S_ij = alpha (curl phi_i,curl phi_j) + beta (phi_i, phi_j). The load vector corresponding to a right-hand side of {1,1,1} is F_j = (1,phi_j) = h^2/4. */ void ComputeFEMND1(double S[12][12], double F[12], double x, double y, double z, double h) { int i, j; double h2_4 = h * h / 4; double cS1 = alpha(x, y, z) / (6.0 * h), cS2 = 2 * cS1, cS4 = 2 * cS2; double cM1 = beta(x, y, z) * h / 36.0, cM2 = 2 * cM1, cM4 = 2 * cM2; S[ 0][ 0] = cS4 + cM4; S[ 0][ 1] = cS2; S[ 0][ 2] = -cS1 + cM2; S[ 0][ 3] = -cS2; S[ 0][ 4] = -cS1 + cM2; S[ 0][ 5] = cS1; S[ 0][ 6] = -cS2 + cM1; S[ 0][ 7] = -cS1; S[ 0][ 8] = -cS2; S[ 0][ 9] = cS2; S[ 0][10] = cS1; S[ 0][11] = -cS1; S[ 1][ 1] = cS4 + cM4; S[ 1][ 2] = -cS2; S[ 1][ 3] = -cS1 + cM2; S[ 1][ 4] = cS1; S[ 1][ 5] = -cS1 + cM2; S[ 1][ 6] = -cS1; S[ 1][ 7] = -cS2 + cM1; S[ 1][ 8] = -cS1; S[ 1][ 9] = -cS2; S[ 1][10] = cS2; S[ 1][11] = cS1; S[ 2][ 2] = cS4 + cM4; S[ 2][ 3] = cS2; S[ 2][ 4] = -cS2 + cM1; S[ 2][ 5] = -cS1; S[ 2][ 6] = -cS1 + cM2; S[ 2][ 7] = cS1; S[ 2][ 8] = -cS1; S[ 2][ 9] = cS1; S[ 2][10] = cS2; S[ 2][11] = -cS2; S[ 3][ 3] = cS4 + cM4; S[ 3][ 4] = -cS1; S[ 3][ 5] = -cS2 + cM1; S[ 3][ 6] = cS1; S[ 3][ 7] = -cS1 + cM2; S[ 3][ 8] = -cS2; S[ 3][ 9] = -cS1; S[ 3][10] = cS1; S[ 3][11] = cS2; S[ 4][ 4] = cS4 + cM4; S[ 4][ 5] = cS2; S[ 4][ 6] = -cS1 + cM2; S[ 4][ 7] = -cS2; S[ 4][ 8] = cS2; S[ 4][ 9] = -cS2; S[ 4][10] = -cS1; S[ 4][11] = cS1; S[ 5][ 5] = cS4 + cM4; S[ 5][ 6] = -cS2; S[ 5][ 7] = -cS1 + cM2; S[ 5][ 8] = cS1; S[ 5][ 9] = cS2; S[ 5][10] = -cS2; S[ 5][11] = -cS1; S[ 6][ 6] = cS4 + cM4; S[ 6][ 7] = cS2; S[ 6][ 8] = cS1; S[ 6][ 9] = -cS1; S[ 6][10] = -cS2; S[ 6][11] = cS2; S[ 7][ 7] = cS4 + cM4; S[ 7][ 8] = cS2; S[ 7][ 9] = cS1; S[ 7][10] = -cS1; S[ 7][11] = -cS2; S[ 8][ 8] = cS4 + cM4; S[ 8][ 9] = -cS1 + cM2; S[ 8][10] = -cS2 + cM1; S[ 8][11] = -cS1 + cM2; S[ 9][ 9] = cS4 + cM4; S[ 9][10] = -cS1 + cM2; S[ 9][11] = -cS2 + cM1; S[10][10] = cS4 + cM4; S[10][11] = -cS1 + cM2; S[11][11] = cS4 + cM4; /* The stiffness matrix is symmetric */ for (i = 1; i < 12; i++) for (j = 0; j < i; j++) { S[i][j] = S[j][i]; } for (i = 0; i < 12; i++) { F[i] = h2_4; } } int main (int argc, char *argv[]) { int myid, num_procs; int n, N, pi, pj, pk; double h; double tol, theta; int maxit, cycle_type; int rlx_type, rlx_sweeps, rlx_weight, rlx_omega; int amg_coarsen_type, amg_agg_levels, amg_rlx_type; int amg_interp_type, amg_Pmax; int singular_problem ; double mytime = 0.0; double walltime = 0.0; HYPRE_SStructGrid edge_grid; HYPRE_SStructGraph A_graph; HYPRE_SStructMatrix A; HYPRE_SStructVector b; HYPRE_SStructVector x; HYPRE_SStructGrid node_grid; HYPRE_SStructGraph G_graph; HYPRE_SStructStencil G_stencil[3]; HYPRE_SStructMatrix G; HYPRE_SStructVector xcoord, ycoord, zcoord; HYPRE_Solver solver, precond; /* Initialize MPI */ MPI_Init(&argc, &argv); MPI_Comm_rank(MPI_COMM_WORLD, &myid); MPI_Comm_size(MPI_COMM_WORLD, &num_procs); /* Initialize HYPRE */ HYPRE_Initialize(); /* Print GPU info */ /* HYPRE_PrintDeviceInfo(); */ /* Set default parameters */ n = 10; optionAlpha = 0; optionBeta = 0; maxit = 100; tol = 1e-6; cycle_type = 13; rlx_type = 2; rlx_sweeps = 1; rlx_weight = 1.0; rlx_omega = 1.0; amg_coarsen_type = 10; amg_agg_levels = 1; amg_rlx_type = 6; theta = 0.25; amg_interp_type = 6; amg_Pmax = 4; singular_problem = 0; /* Parse command line */ { int arg_index = 0; int print_usage = 0; while (arg_index < argc) { if ( strcmp(argv[arg_index], "-n") == 0 ) { arg_index++; n = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-a") == 0 ) { arg_index++; optionAlpha = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-b") == 0 ) { arg_index++; optionBeta = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-maxit") == 0 ) { arg_index++; maxit = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-tol") == 0 ) { arg_index++; tol = atof(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-type") == 0 ) { arg_index++; cycle_type = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-rlx") == 0 ) { arg_index++; rlx_type = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-rlxn") == 0 ) { arg_index++; rlx_sweeps = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-rlxw") == 0 ) { arg_index++; rlx_weight = atof(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-rlxo") == 0 ) { arg_index++; rlx_omega = atof(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-ctype") == 0 ) { arg_index++; amg_coarsen_type = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-amgrlx") == 0 ) { arg_index++; amg_rlx_type = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-agg") == 0 ) { arg_index++; amg_agg_levels = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-itype") == 0 ) { arg_index++; amg_interp_type = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-pmax") == 0 ) { arg_index++; amg_Pmax = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-sing") == 0 ) { arg_index++; singular_problem = 1; } else if ( strcmp(argv[arg_index], "-theta") == 0 ) { arg_index++; theta = atof(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-help") == 0 ) { print_usage = 1; break; } else { arg_index++; } } if ((print_usage) && (myid == 0)) { printf("\n"); printf("Usage: %s []\n", argv[0]); printf("\n"); printf(" -n : problem size per processor (default: 10)\n"); printf(" -a : choice for the curl-curl coefficient (default: 1)\n"); printf(" -b : choice for the mass coefficient (default: 1)\n"); printf("\n"); printf("PCG-AMS solver options: \n"); printf(" -maxit : maximum number of iterations (100) \n"); printf(" -tol : convergence tolerance (1e-6) \n"); printf(" -type : 3-level cycle type (0-8, 11-14) \n"); printf(" -theta : BoomerAMG threshold (0.25) \n"); printf(" -ctype : BoomerAMG coarsening type \n"); printf(" -agg : Levels of BoomerAMG agg. coarsening \n"); printf(" -amgrlx : BoomerAMG relaxation type \n"); printf(" -itype : BoomerAMG interpolation type \n"); printf(" -pmax : BoomerAMG interpolation truncation \n"); printf(" -rlx : relaxation type \n"); printf(" -rlxn : number of relaxation sweeps \n"); printf(" -rlxw : damping parameter (usually <=1) \n"); printf(" -rlxo : SOR parameter (usually in (0,2)) \n"); printf(" -sing : curl-curl only (singular) problem \n"); printf("\n"); printf("\n"); } if (print_usage) { MPI_Finalize(); return (0); } } /* Figure out the processor grid (N x N x N). The local problem size is n^3, while pi, pj and pk indicate the position in the processor grid. */ N = pow(num_procs, 1.0 / 3.0) + 0.5; if (num_procs != N * N * N) { if (myid == 0) printf("Can't run on %d processors, try %d.\n", num_procs, N * N * N); MPI_Finalize(); exit(1); } h = 1.0 / (N * n); pk = myid / (N * N); pj = myid / N - pk * N; pi = myid - pj * N - pk * N * N; /* Start timing */ mytime -= MPI_Wtime(); /* 1. Set up the edge and nodal grids. Note that we do this simultaneously to make sure that they have the same extents. For simplicity we use only one part to represent the unit cube. */ { HYPRE_Int ndim = 3; HYPRE_Int nparts = 1; /* Create empty 2D grid objects */ HYPRE_SStructGridCreate(MPI_COMM_WORLD, ndim, nparts, &node_grid); HYPRE_SStructGridCreate(MPI_COMM_WORLD, ndim, nparts, &edge_grid); /* Set the extents of the grid - each processor sets its grid boxes. */ { HYPRE_Int part = 0; HYPRE_Int ilower[3] = {1 + pi * n, 1 + pj * n, 1 + pk * n}; HYPRE_Int iupper[3] = {n + pi * n, n + pj * n, n + pk * n}; HYPRE_SStructGridSetExtents(node_grid, part, ilower, iupper); HYPRE_SStructGridSetExtents(edge_grid, part, ilower, iupper); } /* Set the variable type and number of variables on each grid. */ { HYPRE_Int i; HYPRE_Int nnodevars = 1; HYPRE_Int nedgevars = 3; HYPRE_SStructVariable nodevars[1] = {HYPRE_SSTRUCT_VARIABLE_NODE}; HYPRE_SStructVariable edgevars[3] = {HYPRE_SSTRUCT_VARIABLE_XEDGE, HYPRE_SSTRUCT_VARIABLE_YEDGE, HYPRE_SSTRUCT_VARIABLE_ZEDGE }; for (i = 0; i < nparts; i++) { HYPRE_SStructGridSetVariables(node_grid, i, nnodevars, nodevars); HYPRE_SStructGridSetVariables(edge_grid, i, nedgevars, edgevars); } } /* Since there is only one part, there is no need to call the SetNeighborPart or SetSharedPart functions, which determine the spatial relation between the parts. See Examples 12, 13 and 14 for illustrations of these calls. */ /* Now the grids are ready to be used */ HYPRE_SStructGridAssemble(node_grid); HYPRE_SStructGridAssemble(edge_grid); } /* 2. Create the finite element stiffness matrix A and load vector b. */ { HYPRE_Int part = 0; /* this problem has only one part */ /* Set the ordering of the variables in the finite element problem. This is done by listing the variable offset directions relative to the element's center. See the Reference Manual for more details. */ { HYPRE_Int ordering[48] = { 0, 0, -1, -1, /* x-edge [0]-[1] */ 1, +1, 0, -1, /* y-edge [1]-[2] */ 0, 0, +1, -1, /* x-edge [3]-[2] [7]------[6] */ 1, -1, 0, -1, /* y-edge [0]-[3] /| /| */ 0, 0, -1, +1, /* x-edge [4]-[5] / | / | */ 1, +1, 0, +1, /* y-edge [5]-[6] [4]------[5] | */ 0, 0, +1, +1, /* x-edge [7]-[6] | [3]----|-[2] */ 1, -1, 0, +1, /* y-edge [4]-[7] | / | / */ 2, -1, -1, 0, /* z-edge [0]-[4] |/ |/ */ 2, +1, -1, 0, /* z-edge [1]-[5] [0]------[1] */ 2, +1, +1, 0, /* z-edge [2]-[6] */ 2, -1, +1, 0 /* z-edge [3]-[7] */ }; HYPRE_SStructGridSetFEMOrdering(edge_grid, part, ordering); } /* Set up the Graph - this determines the non-zero structure of the matrix. */ { HYPRE_Int part = 0; /* Create the graph object */ HYPRE_SStructGraphCreate(MPI_COMM_WORLD, edge_grid, &A_graph); /* See MatrixSetObjectType below */ HYPRE_SStructGraphSetObjectType(A_graph, HYPRE_PARCSR); /* Indicate that this problem uses finite element stiffness matrices and load vectors, instead of stencils. */ HYPRE_SStructGraphSetFEM(A_graph, part); /* The edge finite element matrix is full, so there is no need to call the HYPRE_SStructGraphSetFEMSparsity() function. */ /* Assemble the graph */ HYPRE_SStructGraphAssemble(A_graph); } /* Set up the SStruct Matrix and right-hand side vector */ { /* Create the matrix object */ HYPRE_SStructMatrixCreate(MPI_COMM_WORLD, A_graph, &A); /* Use a ParCSR storage */ HYPRE_SStructMatrixSetObjectType(A, HYPRE_PARCSR); /* Indicate that the matrix coefficients are ready to be set */ HYPRE_SStructMatrixInitialize(A); /* Create an empty vector object */ HYPRE_SStructVectorCreate(MPI_COMM_WORLD, edge_grid, &b); /* Use a ParCSR storage */ HYPRE_SStructVectorSetObjectType(b, HYPRE_PARCSR); /* Indicate that the vector coefficients are ready to be set */ HYPRE_SStructVectorInitialize(b); } /* Set the matrix and vector entries by finite element assembly */ { /* local stiffness matrix and load vector */ double S[12][12], F[12]; int i, j, k; HYPRE_Int index[3]; for (i = 1; i <= n; i++) for (j = 1; j <= n; j++) for (k = 1; k <= n; k++) { /* Compute the FEM matrix and r.h.s. for cell (i,j,k) with coefficients evaluated at the cell center. */ index[0] = i + pi * n; index[1] = j + pj * n; index[2] = k + pk * n; ComputeFEMND1(S, F, (pi * n + i)*h - h / 2, (pj * n + j)*h - h / 2, (pk * n + k)*h - h / 2, h); /* Eliminate boundary conditions on x = 0 */ if (index[0] == 1) { int ii, jj, bc_edges[4] = { 3, 11, 7, 8 }; for (ii = 0; ii < 4; ii++) { for (jj = 0; jj < 12; jj++) { S[bc_edges[ii]][jj] = S[jj][bc_edges[ii]] = 0.0; } S[bc_edges[ii]][bc_edges[ii]] = 1.0; F[bc_edges[ii]] = 0.0; } } /* Eliminate boundary conditions on y = 0 */ if (index[1] == 1) { int ii, jj, bc_edges[4] = { 0, 9, 4, 8 }; for (ii = 0; ii < 4; ii++) { for (jj = 0; jj < 12; jj++) { S[bc_edges[ii]][jj] = S[jj][bc_edges[ii]] = 0.0; } S[bc_edges[ii]][bc_edges[ii]] = 1.0; F[bc_edges[ii]] = 0.0; } } /* Eliminate boundary conditions on z = 0 */ if (index[2] == 1) { int ii, jj, bc_edges[4] = { 0, 1, 2, 3 }; for (ii = 0; ii < 4; ii++) { for (jj = 0; jj < 12; jj++) { S[bc_edges[ii]][jj] = S[jj][bc_edges[ii]] = 0.0; } S[bc_edges[ii]][bc_edges[ii]] = 1.0; F[bc_edges[ii]] = 0.0; } } /* Eliminate boundary conditions on x = 1 */ if (index[0] == N * n) { int ii, jj, bc_edges[4] = { 1, 10, 5, 9 }; for (ii = 0; ii < 4; ii++) { for (jj = 0; jj < 12; jj++) { S[bc_edges[ii]][jj] = S[jj][bc_edges[ii]] = 0.0; } S[bc_edges[ii]][bc_edges[ii]] = 1.0; F[bc_edges[ii]] = 0.0; } } /* Eliminate boundary conditions on y = 1 */ if (index[1] == N * n) { int ii, jj, bc_edges[4] = { 2, 10, 6, 11 }; for (ii = 0; ii < 4; ii++) { for (jj = 0; jj < 12; jj++) { S[bc_edges[ii]][jj] = S[jj][bc_edges[ii]] = 0.0; } S[bc_edges[ii]][bc_edges[ii]] = 1.0; F[bc_edges[ii]] = 0.0; } } /* Eliminate boundary conditions on z = 1 */ if (index[2] == N * n) { int ii, jj, bc_edges[4] = { 4, 5, 6, 7 }; for (ii = 0; ii < 4; ii++) { for (jj = 0; jj < 12; jj++) { S[bc_edges[ii]][jj] = S[jj][bc_edges[ii]] = 0.0; } S[bc_edges[ii]][bc_edges[ii]] = 1.0; F[bc_edges[ii]] = 0.0; } } /* Assemble the matrix */ HYPRE_SStructMatrixAddFEMValues(A, part, index, &S[0][0]); /* Assemble the vector */ HYPRE_SStructVectorAddFEMValues(b, part, index, F); } } /* Collective calls finalizing the matrix and vector assembly */ HYPRE_SStructMatrixAssemble(A); HYPRE_SStructVectorAssemble(b); } /* 3. Create the discrete gradient matrix G, which is needed in AMS. */ { HYPRE_Int part = 0; HYPRE_Int stencil_size = 2; /* Define the discretization stencil relating the edges and nodes of the grid. */ { HYPRE_Int ndim = 3; HYPRE_Int entry; HYPRE_Int var = 0; /* the node variable */ /* The discrete gradient stencils connect edge to node variables. */ HYPRE_Int Gx_offsets[2][3] = {{-1, 0, 0}, {0, 0, 0}}; /* x-edge [7]-[6] */ HYPRE_Int Gy_offsets[2][3] = {{0, -1, 0}, {0, 0, 0}}; /* y-edge [5]-[6] */ HYPRE_Int Gz_offsets[2][3] = {{0, 0, -1}, {0, 0, 0}}; /* z-edge [2]-[6] */ HYPRE_SStructStencilCreate(ndim, stencil_size, &G_stencil[0]); HYPRE_SStructStencilCreate(ndim, stencil_size, &G_stencil[1]); HYPRE_SStructStencilCreate(ndim, stencil_size, &G_stencil[2]); for (entry = 0; entry < stencil_size; entry++) { HYPRE_SStructStencilSetEntry(G_stencil[0], entry, Gx_offsets[entry], var); HYPRE_SStructStencilSetEntry(G_stencil[1], entry, Gy_offsets[entry], var); HYPRE_SStructStencilSetEntry(G_stencil[2], entry, Gz_offsets[entry], var); } } /* Set up the Graph - this determines the non-zero structure of the matrix. */ { HYPRE_Int nvars = 3; HYPRE_Int var; /* the edge variables */ /* Create the discrete gradient graph object */ HYPRE_SStructGraphCreate(MPI_COMM_WORLD, edge_grid, &G_graph); /* See MatrixSetObjectType below */ HYPRE_SStructGraphSetObjectType(G_graph, HYPRE_PARCSR); /* Since the discrete gradient relates edge and nodal variables (it is a rectangular matrix), we have to specify the domain (column) grid. */ HYPRE_SStructGraphSetDomainGrid(G_graph, node_grid); /* Tell the graph which stencil to use for each edge variable on each part (we only have one part). */ for (var = 0; var < nvars; var++) { HYPRE_SStructGraphSetStencil(G_graph, part, var, G_stencil[var]); } /* Assemble the graph */ HYPRE_SStructGraphAssemble(G_graph); } /* Set up the SStruct Matrix */ { /* Create the matrix object */ HYPRE_SStructMatrixCreate(MPI_COMM_WORLD, G_graph, &G); /* Use a ParCSR storage */ HYPRE_SStructMatrixSetObjectType(G, HYPRE_PARCSR); /* Indicate that the matrix coefficients are ready to be set */ HYPRE_SStructMatrixInitialize(G); } /* Set the discrete gradient values, assuming a "natural" orientation of the edges (i.e. one in agreement with the coordinate directions). */ { int i; int nedges = n * (n + 1) * (n + 1); double *values; HYPRE_Int stencil_indices[2] = {0, 1}; /* the nodes of each edge */ values = (double*) calloc(2 * nedges, sizeof(double)); /* The edge orientation is fixed: from first to second node */ for (i = 0; i < nedges; i++) { values[2 * i] = -1.0; values[2 * i + 1] = 1.0; } /* Set the values in the discrete gradient x-edges */ { HYPRE_Int var = 0; HYPRE_Int ilower[3] = {1 + pi * n, 0 + pj * n, 0 + pk * n}; HYPRE_Int iupper[3] = {n + pi * n, n + pj * n, n + pk * n}; HYPRE_SStructMatrixSetBoxValues(G, part, ilower, iupper, var, stencil_size, stencil_indices, values); } /* Set the values in the discrete gradient y-edges */ { HYPRE_Int var = 1; HYPRE_Int ilower[3] = {0 + pi * n, 1 + pj * n, 0 + pk * n}; HYPRE_Int iupper[3] = {n + pi * n, n + pj * n, n + pk * n}; HYPRE_SStructMatrixSetBoxValues(G, part, ilower, iupper, var, stencil_size, stencil_indices, values); } /* Set the values in the discrete gradient z-edges */ { HYPRE_Int var = 2; HYPRE_Int ilower[3] = {0 + pi * n, 0 + pj * n, 1 + pk * n}; HYPRE_Int iupper[3] = {n + pi * n, n + pj * n, n + pk * n}; HYPRE_SStructMatrixSetBoxValues(G, part, ilower, iupper, var, stencil_size, stencil_indices, values); } free(values); } /* Finalize the matrix assembly */ HYPRE_SStructMatrixAssemble(G); } /* 4. Create the vectors of nodal coordinates xcoord, ycoord and zcoord, which are needed in AMS. */ { int i, j, k; HYPRE_Int part = 0; HYPRE_Int var = 0; /* the node variable */ HYPRE_Int index[3]; double xval, yval, zval; /* Create empty vector objects */ HYPRE_SStructVectorCreate(MPI_COMM_WORLD, node_grid, &xcoord); HYPRE_SStructVectorCreate(MPI_COMM_WORLD, node_grid, &ycoord); HYPRE_SStructVectorCreate(MPI_COMM_WORLD, node_grid, &zcoord); /* Set the object type to ParCSR */ HYPRE_SStructVectorSetObjectType(xcoord, HYPRE_PARCSR); HYPRE_SStructVectorSetObjectType(ycoord, HYPRE_PARCSR); HYPRE_SStructVectorSetObjectType(zcoord, HYPRE_PARCSR); /* Indicate that the vector coefficients are ready to be set */ HYPRE_SStructVectorInitialize(xcoord); HYPRE_SStructVectorInitialize(ycoord); HYPRE_SStructVectorInitialize(zcoord); /* Compute and set the coordinates of the nodes */ for (i = 0; i <= n; i++) for (j = 0; j <= n; j++) for (k = 0; k <= n; k++) { index[0] = i + pi * n; index[1] = j + pj * n; index[2] = k + pk * n; xval = index[0] * h; yval = index[1] * h; zval = index[2] * h; HYPRE_SStructVectorSetValues(xcoord, part, index, var, &xval); HYPRE_SStructVectorSetValues(ycoord, part, index, var, &yval); HYPRE_SStructVectorSetValues(zcoord, part, index, var, &zval); } /* Finalize the vector assembly */ HYPRE_SStructVectorAssemble(xcoord); HYPRE_SStructVectorAssemble(ycoord); HYPRE_SStructVectorAssemble(zcoord); } /* 5. Set up a SStruct Vector for the solution vector x */ { HYPRE_Int part = 0; int nvalues = n * (n + 1) * (n + 1); double *values; values = (double*) calloc(nvalues, sizeof(double)); /* Create an empty vector object */ HYPRE_SStructVectorCreate(MPI_COMM_WORLD, edge_grid, &x); /* Set the object type to ParCSR */ HYPRE_SStructVectorSetObjectType(x, HYPRE_PARCSR); /* Indicate that the vector coefficients are ready to be set */ HYPRE_SStructVectorInitialize(x); /* Set the values for the initial guess x-edge */ { HYPRE_Int var = 0; HYPRE_Int ilower[3] = {1 + pi * n, 0 + pj * n, 0 + pk * n}; HYPRE_Int iupper[3] = {n + pi * n, n + pj * n, n + pk * n}; HYPRE_SStructVectorSetBoxValues(x, part, ilower, iupper, var, values); } /* Set the values for the initial guess y-edge */ { HYPRE_Int var = 1; HYPRE_Int ilower[3] = {0 + pi * n, 1 + pj * n, 0 + pk * n}; HYPRE_Int iupper[3] = {n + pi * n, n + pj * n, n + pk * n}; HYPRE_SStructVectorSetBoxValues(x, part, ilower, iupper, var, values); } /* Set the values for the initial guess z-edge */ { HYPRE_Int var = 2; HYPRE_Int ilower[3] = {0 + pi * n, 0 + pj * n, 1 + pk * n}; HYPRE_Int iupper[3] = {n + pi * n, n + pj * n, n + pk * n}; HYPRE_SStructVectorSetBoxValues(x, part, ilower, iupper, var, values); } free(values); /* Finalize the vector assembly */ HYPRE_SStructVectorAssemble(x); } /* Finalize current timing */ mytime += MPI_Wtime(); MPI_Allreduce(&mytime, &walltime, 1, MPI_DOUBLE, MPI_MAX, MPI_COMM_WORLD); if (myid == 0) { printf("\nSStruct Setup time = %f seconds\n\n", walltime); } /* 6. Set up and call the PCG-AMS solver (Solver options can be found in the Reference Manual.) */ { double final_res_norm; HYPRE_Int its; HYPRE_ParCSRMatrix par_A; HYPRE_ParVector par_b; HYPRE_ParVector par_x; HYPRE_ParCSRMatrix par_G; HYPRE_ParVector par_xcoord; HYPRE_ParVector par_ycoord; HYPRE_ParVector par_zcoord; /* Extract the ParCSR objects needed in the solver */ HYPRE_SStructMatrixGetObject(A, (void **) &par_A); HYPRE_SStructVectorGetObject(b, (void **) &par_b); HYPRE_SStructVectorGetObject(x, (void **) &par_x); HYPRE_SStructMatrixGetObject(G, (void **) &par_G); HYPRE_SStructVectorGetObject(xcoord, (void **) &par_xcoord); HYPRE_SStructVectorGetObject(ycoord, (void **) &par_ycoord); HYPRE_SStructVectorGetObject(zcoord, (void **) &par_zcoord); if (myid == 0) { HYPRE_Int numrows, numcols; HYPRE_ParCSRMatrixGetDims(par_A, &numrows, &numcols); printf("Problem size: %lld\n\n", numrows); } /* Start timing */ mytime -= MPI_Wtime(); /* Create solver */ HYPRE_ParCSRPCGCreate(MPI_COMM_WORLD, &solver); /* Set some parameters (See Reference Manual for more parameters) */ HYPRE_PCGSetMaxIter(solver, maxit); /* max iterations */ HYPRE_PCGSetTol(solver, tol); /* conv. tolerance */ HYPRE_PCGSetTwoNorm(solver, 0); /* use the two norm as the stopping criteria */ HYPRE_PCGSetPrintLevel(solver, 2); /* print solve info */ HYPRE_PCGSetLogging(solver, 1); /* needed to get run info later */ /* Create AMS preconditioner */ HYPRE_AMSCreate(&precond); /* Set AMS parameters */ HYPRE_AMSSetMaxIter(precond, 1); HYPRE_AMSSetTol(precond, 0.0); HYPRE_AMSSetCycleType(precond, cycle_type); HYPRE_AMSSetPrintLevel(precond, 1); /* Set discrete gradient */ HYPRE_AMSSetDiscreteGradient(precond, par_G); /* Set vertex coordinates */ HYPRE_AMSSetCoordinateVectors(precond, par_xcoord, par_ycoord, par_zcoord); if (singular_problem) { HYPRE_AMSSetBetaPoissonMatrix(precond, NULL); } /* Smoothing and AMG options */ HYPRE_AMSSetSmoothingOptions(precond, rlx_type, rlx_sweeps, rlx_weight, rlx_omega); HYPRE_AMSSetAlphaAMGOptions(precond, amg_coarsen_type, amg_agg_levels, amg_rlx_type, theta, amg_interp_type, amg_Pmax); HYPRE_AMSSetBetaAMGOptions(precond, amg_coarsen_type, amg_agg_levels, amg_rlx_type, theta, amg_interp_type, amg_Pmax); /* Set the PCG preconditioner */ HYPRE_PCGSetPrecond(solver, (HYPRE_PtrToSolverFcn) HYPRE_AMSSolve, (HYPRE_PtrToSolverFcn) HYPRE_AMSSetup, precond); /* Call the setup */ HYPRE_ParCSRPCGSetup(solver, par_A, par_b, par_x); /* Finalize current timing */ mytime += MPI_Wtime(); MPI_Allreduce(&mytime, &walltime, 1, MPI_DOUBLE, MPI_MAX, MPI_COMM_WORLD); if (myid == 0) { printf("\nAMS Setup time = %f seconds\n\n", walltime); } /* Start timing again */ mytime -= MPI_Wtime(); /* Call the solve */ HYPRE_ParCSRPCGSolve(solver, par_A, par_b, par_x); /* Finalize current timing */ mytime += MPI_Wtime(); MPI_Allreduce(&mytime, &walltime, 1, MPI_DOUBLE, MPI_MAX, MPI_COMM_WORLD); if (myid == 0) { printf("\nAMS Solve time = %f seconds\n\n", walltime); } /* Get some info */ HYPRE_PCGGetNumIterations(solver, &its); HYPRE_PCGGetFinalRelativeResidualNorm(solver, &final_res_norm); /* Clean up */ HYPRE_AMSDestroy(precond); HYPRE_ParCSRPCGDestroy(solver); /* Gather the solution vector */ HYPRE_SStructVectorGather(x); if (myid == 0) { printf("\n"); printf("Iterations = %lld\n", its); printf("Final Relative Residual Norm = %g\n", final_res_norm); printf("\n"); } } /* Free memory */ HYPRE_SStructGridDestroy(edge_grid); HYPRE_SStructGraphDestroy(A_graph); HYPRE_SStructMatrixDestroy(A); HYPRE_SStructVectorDestroy(b); HYPRE_SStructVectorDestroy(x); HYPRE_SStructGridDestroy(node_grid); HYPRE_SStructGraphDestroy(G_graph); HYPRE_SStructStencilDestroy(G_stencil[0]); HYPRE_SStructStencilDestroy(G_stencil[1]); HYPRE_SStructStencilDestroy(G_stencil[2]); HYPRE_SStructMatrixDestroy(G); HYPRE_SStructVectorDestroy(xcoord); HYPRE_SStructVectorDestroy(ycoord); HYPRE_SStructVectorDestroy(zcoord); /* Finalize HYPRE */ HYPRE_Finalize(); /* Finalize MPI */ MPI_Finalize(); return 0; } hypre-2.33.0/src/examples/ex16.c000066400000000000000000000501521477326011500162730ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /* Example 16 Interface: Semi-Structured interface (SStruct) Compile with: make ex16 Sample run: mpirun -np 4 ex16 -n 10 To see options: ex16 -help Description: This code solves the 2D Laplace equation using a high order Q3 finite element discretization. Specifically, we solve -Delta u = 1 with zero boundary conditions on a unit square domain meshed with a uniform grid. The mesh is distributed across an N x N process grid, with each processor containing an n x n sub-mesh of data, so the global mesh is nN x nN. */ #include #include #include #include #include "HYPRE_sstruct_mv.h" #include "HYPRE_sstruct_ls.h" #include "HYPRE.h" #include "ex.h" #ifdef HYPRE_EXVIS #include "vis.c" #endif /* This routine computes the stiffness matrix for the Laplacian on a square of size h, using bi-cubic elements with degrees of freedom in lexicographical ordering. So, the element looks as follows: [12]-[13]-[14]-[15] | | [8] [9] [10] [11] | | [4] [5] [6] [7] | | [0]--[1]--[2]--[3] */ void ComputeFEMQ3 (double S[16][16], double F[16], double h) { int i, j; double s = 1.0 / 33600; double h2_64 = h * h / 64; S[ 0][ 0] = 18944 * s; S[ 0][ 1] = -4770 * s; S[ 0][ 2] = 792 * s; S[ 0][ 3] = 574 * s; S[ 0][ 4] = -4770 * s; S[ 0][ 5] = -18711 * s; S[ 0][ 6] = 6075 * s; S[ 0][ 7] = -2439 * s; S[ 0][ 8] = 792 * s; S[ 0][ 9] = 6075 * s; S[ 0][10] = -1944 * s; S[ 0][11] = 747 * s; S[ 0][12] = 574 * s; S[ 0][13] = -2439 * s; S[ 0][14] = 747 * s; S[ 0][15] = -247 * s; S[ 1][ 1] = 75600 * s; S[ 1][ 2] = -25002 * s; S[ 1][ 3] = 792 * s; S[ 1][ 4] = -18711 * s; S[ 1][ 5] = -39852 * s; S[ 1][ 6] = -7047 * s; S[ 1][ 7] = 6075 * s; S[ 1][ 8] = 6075 * s; S[ 1][ 9] = 9720 * s; S[ 1][10] = 3159 * s; S[ 1][11] = -1944 * s; S[ 1][12] = -2439 * s; S[ 1][13] = -108 * s; S[ 1][14] = -2295 * s; S[ 1][15] = 747 * s; S[ 2][ 2] = 75600 * s; S[ 2][ 3] = -4770 * s; S[ 2][ 4] = 6075 * s; S[ 2][ 5] = -7047 * s; S[ 2][ 6] = -39852 * s; S[ 2][ 7] = -18711 * s; S[ 2][ 8] = -1944 * s; S[ 2][ 9] = 3159 * s; S[ 2][10] = 9720 * s; S[ 2][11] = 6075 * s; S[ 2][12] = 747 * s; S[ 2][13] = -2295 * s; S[ 2][14] = -108 * s; S[ 2][15] = -2439 * s; S[ 3][ 3] = 18944 * s; S[ 3][ 4] = -2439 * s; S[ 3][ 5] = 6075 * s; S[ 3][ 6] = -18711 * s; S[ 3][ 7] = -4770 * s; S[ 3][ 8] = 747 * s; S[ 3][ 9] = -1944 * s; S[ 3][10] = 6075 * s; S[ 3][11] = 792 * s; S[ 3][12] = -247 * s; S[ 3][13] = 747 * s; S[ 3][14] = -2439 * s; S[ 3][15] = 574 * s; S[ 4][ 4] = 75600 * s; S[ 4][ 5] = -39852 * s; S[ 4][ 6] = 9720 * s; S[ 4][ 7] = -108 * s; S[ 4][ 8] = -25002 * s; S[ 4][ 9] = -7047 * s; S[ 4][10] = 3159 * s; S[ 4][11] = -2295 * s; S[ 4][12] = 792 * s; S[ 4][13] = 6075 * s; S[ 4][14] = -1944 * s; S[ 4][15] = 747 * s; S[ 5][ 5] = 279936 * s; S[ 5][ 6] = -113724 * s; S[ 5][ 7] = 9720 * s; S[ 5][ 8] = -7047 * s; S[ 5][ 9] = -113724 * s; S[ 5][10] = 24057 * s; S[ 5][11] = 3159 * s; S[ 5][12] = 6075 * s; S[ 5][13] = 9720 * s; S[ 5][14] = 3159 * s; S[ 5][15] = -1944 * s; S[ 6][ 6] = 279936 * s; S[ 6][ 7] = -39852 * s; S[ 6][ 8] = 3159 * s; S[ 6][ 9] = 24057 * s; S[ 6][10] = -113724 * s; S[ 6][11] = -7047 * s; S[ 6][12] = -1944 * s; S[ 6][13] = 3159 * s; S[ 6][14] = 9720 * s; S[ 6][15] = 6075 * s; S[ 7][ 7] = 75600 * s; S[ 7][ 8] = -2295 * s; S[ 7][ 9] = 3159 * s; S[ 7][10] = -7047 * s; S[ 7][11] = -25002 * s; S[ 7][12] = 747 * s; S[ 7][13] = -1944 * s; S[ 7][14] = 6075 * s; S[ 7][15] = 792 * s; S[ 8][ 8] = 75600 * s; S[ 8][ 9] = -39852 * s; S[ 8][10] = 9720 * s; S[ 8][11] = -108 * s; S[ 8][12] = -4770 * s; S[ 8][13] = -18711 * s; S[ 8][14] = 6075 * s; S[ 8][15] = -2439 * s; S[ 9][ 9] = 279936 * s; S[ 9][10] = -113724 * s; S[ 9][11] = 9720 * s; S[ 9][12] = -18711 * s; S[ 9][13] = -39852 * s; S[ 9][14] = -7047 * s; S[ 9][15] = 6075 * s; S[10][10] = 279936 * s; S[10][11] = -39852 * s; S[10][12] = 6075 * s; S[10][13] = -7047 * s; S[10][14] = -39852 * s; S[10][15] = -18711 * s; S[11][11] = 75600 * s; S[11][12] = -2439 * s; S[11][13] = 6075 * s; S[11][14] = -18711 * s; S[11][15] = -4770 * s; S[12][12] = 18944 * s; S[12][13] = -4770 * s; S[12][14] = 792 * s; S[12][15] = 574 * s; S[13][13] = 75600 * s; S[13][14] = -25002 * s; S[13][15] = 792 * s; S[14][14] = 75600 * s; S[14][15] = -4770 * s; S[15][15] = 18944 * s; /* The stiffness matrix is symmetric */ for (i = 1; i < 16; i++) for (j = 0; j < i; j++) { S[i][j] = S[j][i]; } F[ 0] = h2_64; F[ 1] = 3 * h2_64; F[ 2] = 3 * h2_64; F[ 3] = h2_64; F[ 4] = 3 * h2_64; F[ 5] = 9 * h2_64; F[ 6] = 9 * h2_64; F[ 7] = 3 * h2_64; F[ 8] = 3 * h2_64; F[ 9] = 9 * h2_64; F[10] = 9 * h2_64; F[11] = 3 * h2_64; F[12] = h2_64; F[13] = 3 * h2_64; F[14] = 3 * h2_64; F[15] = h2_64; } int main (int argc, char *argv[]) { int myid, num_procs; int n, N, pi, pj; double h; int vis; HYPRE_SStructGrid grid; HYPRE_SStructGraph graph; HYPRE_SStructMatrix A; HYPRE_SStructVector b; HYPRE_SStructVector x; HYPRE_Solver solver; /* Initialize MPI */ MPI_Init(&argc, &argv); MPI_Comm_rank(MPI_COMM_WORLD, &myid); MPI_Comm_size(MPI_COMM_WORLD, &num_procs); /* Initialize HYPRE */ HYPRE_Initialize(); /* Print GPU info */ /* HYPRE_PrintDeviceInfo(); */ /* Set default parameters */ n = 10; vis = 0; /* Parse command line */ { int arg_index = 0; int print_usage = 0; while (arg_index < argc) { if ( strcmp(argv[arg_index], "-n") == 0 ) { arg_index++; n = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-vis") == 0 ) { arg_index++; vis = 1; } else if ( strcmp(argv[arg_index], "-help") == 0 ) { print_usage = 1; break; } else { arg_index++; } } if ((print_usage) && (myid == 0)) { printf("\n"); printf("Usage: %s []\n", argv[0]); printf("\n"); printf(" -n : problem size per processor (default: 10)\n"); printf(" -vis : save the solution for GLVis visualization\n"); printf("\n"); } if (print_usage) { MPI_Finalize(); return (0); } } /* Figure out the processor grid (N x N). The local problem size is n^2, while pi and pj indicate the position in the processor grid. */ N = pow(num_procs, 1.0 / 2.0) + 0.5; if (num_procs != N * N) { if (myid == 0) { printf("Can't run on %d processors, try %d.\n", num_procs, N * N); } MPI_Finalize(); exit(1); } h = 1.0 / (N * n); pj = myid / N; pi = myid - pj * N; /* 1. Set up the grid. For simplicity we use only one part to represent the unit square. */ { int ndim = 2; int nparts = 1; /* Create an empty 2D grid object */ HYPRE_SStructGridCreate(MPI_COMM_WORLD, ndim, nparts, &grid); /* Set the extents of the grid - each processor sets its grid boxes. */ { int part = 0; int ilower[2] = {1 + pi * n, 1 + pj * n}; int iupper[2] = {n + pi * n, n + pj * n}; HYPRE_SStructGridSetExtents(grid, part, ilower, iupper); } /* Set the variable type and number of variables on each part. There is one variable of type NODE, two of type XFACE, two of type YFACE, and four of type CELL. */ { int i; int nvars = 9; HYPRE_SStructVariable vars[9] = {HYPRE_SSTRUCT_VARIABLE_NODE, HYPRE_SSTRUCT_VARIABLE_XFACE, HYPRE_SSTRUCT_VARIABLE_XFACE, HYPRE_SSTRUCT_VARIABLE_YFACE, HYPRE_SSTRUCT_VARIABLE_YFACE, HYPRE_SSTRUCT_VARIABLE_CELL, HYPRE_SSTRUCT_VARIABLE_CELL, HYPRE_SSTRUCT_VARIABLE_CELL, HYPRE_SSTRUCT_VARIABLE_CELL }; for (i = 0; i < nparts; i++) { HYPRE_SStructGridSetVariables(grid, i, nvars, vars); } } /* Set the ordering of the variables in the finite element problem. This is done by listing the variable numbers and offset directions relative to the element's center. See the Reference Manual for more details. The ordering and location of the nine variables in each element is as follows (notation is [order# : variable#]): [12:0]-[13:3]-[14:4]-[15:0] | | | | [8:2] [9:7] [10:8] [11:2] | | | | [4:1] [5:5] [6:6] [7:1] | | | | [0:0]--[1:3]--[2:4]--[3:0] */ { int part = 0; int ordering[48] = { 0, -1, -1, 3, 0, -1, 4, 0, -1, 0, +1, -1, 1, -1, 0, 5, 0, 0, 6, 0, 0, 1, +1, 0, 2, -1, 0, 7, 0, 0, 8, 0, 0, 2, +1, 0, 0, -1, +1, 3, 0, +1, 4, 0, +1, 0, +1, +1 }; HYPRE_SStructGridSetFEMOrdering(grid, part, ordering); } /* Now the grid is ready to be used */ HYPRE_SStructGridAssemble(grid); } /* 2. Set up the Graph - this determines the non-zero structure of the matrix. */ { int part = 0; /* Create the graph object */ HYPRE_SStructGraphCreate(MPI_COMM_WORLD, grid, &graph); /* See MatrixSetObjectType below */ HYPRE_SStructGraphSetObjectType(graph, HYPRE_PARCSR); /* Indicate that this problem uses finite element stiffness matrices and load vectors, instead of stencils. */ HYPRE_SStructGraphSetFEM(graph, part); /* The local stiffness matrix is full, so there is no need to call HYPRE_SStructGraphSetFEMSparsity() to set its sparsity pattern. */ /* Assemble the graph */ HYPRE_SStructGraphAssemble(graph); } /* 3. Set up the SStruct Matrix and right-hand side vector */ { int part = 0; /* Create the matrix object */ HYPRE_SStructMatrixCreate(MPI_COMM_WORLD, graph, &A); /* Use a ParCSR storage */ HYPRE_SStructMatrixSetObjectType(A, HYPRE_PARCSR); /* Indicate that the matrix coefficients are ready to be set */ HYPRE_SStructMatrixInitialize(A); /* Create an empty vector object */ HYPRE_SStructVectorCreate(MPI_COMM_WORLD, grid, &b); /* Use a ParCSR storage */ HYPRE_SStructVectorSetObjectType(b, HYPRE_PARCSR); /* Indicate that the vector coefficients are ready to be set */ HYPRE_SStructVectorInitialize(b); /* Set the matrix and vector entries by finite element assembly */ { /* Local stifness matrix and load vector */ double S[16][16], F[16]; int i, j; int index[2]; for (j = 1; j <= n; j++) { for (i = 1; i <= n; i++) { index[0] = i + pi * n; index[1] = j + pj * n; /* Compute the FEM matrix and rhs */ ComputeFEMQ3(S, F, h); /* Set boundary conditions */ { int ii, jj, bdy, dd; int set_bc[4] = {0, 0, 0, 0}; int bc_dofs[4][4] = { { 0, 4, 8, 12}, /* x = 0 boundary */ { 0, 1, 2, 3}, /* y = 0 boundary */ { 3, 7, 11, 15}, /* x = 1 boundary */ {12, 13, 14, 15} /* y = 1 boundary */ }; /* Determine the boundary conditions to be set */ if (index[0] == 1) { set_bc[0] = 1; } /* x = 0 boundary */ if (index[1] == 1) { set_bc[1] = 1; } /* y = 0 boundary */ if (index[0] == N * n) { set_bc[2] = 1; } /* x = 1 boundary */ if (index[1] == N * n) { set_bc[3] = 1; } /* y = 1 boundary */ /* Modify the FEM matrix and rhs on each boundary by setting rows and columns of S to the identity and F to zero */ for (bdy = 0; bdy < 4; bdy++) { /* Only modify if boundary condition needs to be set */ if (set_bc[bdy]) { for (dd = 0; dd < 4; dd++) { for (jj = 0; jj < 16; jj++) { ii = bc_dofs[bdy][dd]; S[ii][jj] = 0.0; /* row */ S[jj][ii] = 0.0; /* col */ } S[ii][ii] = 1.0; /* diagonal */ F[ii] = 0.0; /* rhs */ } } } } /* Add this elements contribution to the matrix */ HYPRE_SStructMatrixAddFEMValues(A, part, index, &S[0][0]); /* Add this elements contribution to the rhs */ HYPRE_SStructVectorAddFEMValues(b, part, index, F); } } } } /* Collective calls finalizing the matrix and vector assembly */ HYPRE_SStructMatrixAssemble(A); HYPRE_SStructVectorAssemble(b); /* 4. Set up SStruct Vector for the solution vector x */ { int part = 0; int var, nvars = 9; int nvalues = (n + 1) * (n + 1); double *values; values = (double*) calloc(nvalues, sizeof(double)); /* Create an empty vector object */ HYPRE_SStructVectorCreate(MPI_COMM_WORLD, grid, &x); /* Set the object type to ParCSR */ HYPRE_SStructVectorSetObjectType(x, HYPRE_PARCSR); /* Indicate that the vector coefficients are ready to be set */ HYPRE_SStructVectorInitialize(x); /* Set the values for the initial guess one variable at a time. Since the SetBoxValues() calls below set the values to the right and up from the cell center, ilower needs to be adjusted. */ for (var = 0; var < nvars; var++) { int ilower[2] = {1 + pi * n, 1 + pj * n}; int iupper[2] = {n + pi * n, n + pj * n}; switch (var) { case 0: /* NODE */ ilower[0]--; ilower[1]--; break; case 1: case 2: /* XFACE */ ilower[0]--; break; case 3: case 4: /* YFACE */ ilower[1]--; break; } HYPRE_SStructVectorSetBoxValues(x, part, ilower, iupper, var, values); } free(values); /* Finalize the vector assembly */ HYPRE_SStructVectorAssemble(x); } /* 5. Set up and call the solver (Solver options can be found in the Reference Manual.) */ { double final_res_norm; int its; HYPRE_ParCSRMatrix par_A; HYPRE_ParVector par_b; HYPRE_ParVector par_x; /* Extract the ParCSR objects needed in the solver */ HYPRE_SStructMatrixGetObject(A, (void **) &par_A); HYPRE_SStructVectorGetObject(b, (void **) &par_b); HYPRE_SStructVectorGetObject(x, (void **) &par_x); /* Here we construct a BoomerAMG solver. See the other SStruct examples as well as the Reference manual for additional solver choices. */ HYPRE_BoomerAMGCreate(&solver); HYPRE_BoomerAMGSetCoarsenType(solver, 6); HYPRE_BoomerAMGSetStrongThreshold(solver, 0.25); HYPRE_BoomerAMGSetTol(solver, 1e-6); HYPRE_BoomerAMGSetPrintLevel(solver, 2); HYPRE_BoomerAMGSetMaxIter(solver, 50); /* call the setup */ HYPRE_BoomerAMGSetup(solver, par_A, par_b, par_x); /* call the solve */ HYPRE_BoomerAMGSolve(solver, par_A, par_b, par_x); /* get some info */ HYPRE_BoomerAMGGetNumIterations(solver, &its); HYPRE_BoomerAMGGetFinalRelativeResidualNorm(solver, &final_res_norm); /* clean up */ HYPRE_BoomerAMGDestroy(solver); /* Gather the solution vector */ HYPRE_SStructVectorGather(x); /* Save the solution for GLVis visualization, see vis/glvis-ex16.sh */ if (vis) { #ifdef HYPRE_EXVIS FILE *file; char filename[255]; int part = 0; int i, j, k, index[2]; int nvalues = n * n * 16; double X[16], *values; /* GLVis-to-hypre local renumbering */ int g2h[16] = {0, 3, 15, 12, 1, 2, 7, 11, 14, 13, 8, 4, 5, 6, 9, 10}; values = (double*) calloc(nvalues, sizeof(double)); nvalues = 0; for (j = 1; j <= n; j++) { for (i = 1; i <= n; i++) { index[0] = i + pi * n; index[1] = j + pj * n; /* Get local element solution values X */ HYPRE_SStructVectorGetFEMValues(x, part, index, X); /* Copy local solution X into values array */ for (k = 0; k < 16; k++) { values[nvalues] = X[g2h[k]]; nvalues++; } } } sprintf(filename, "%s.%06d", "vis/ex16.sol", myid); if ((file = fopen(filename, "w")) == NULL) { printf("Error: can't open output file %s\n", filename); MPI_Finalize(); exit(1); } /* Finite element space header */ fprintf(file, "FiniteElementSpace\n"); fprintf(file, "FiniteElementCollection: Local_Quad_Q3\n"); fprintf(file, "VDim: 1\n"); fprintf(file, "Ordering: 0\n\n"); /* Save solution with replicated shared data */ for (i = 0; i < nvalues; i++) { fprintf(file, "%.14e\n", values[i]); } fflush(file); fclose(file); free(values); /* Save local finite element mesh */ GLVis_PrintLocalSquareMesh("vis/ex16.mesh", n, n, h, pi * h * n, pj * h * n, myid); /* Additional visualization data */ GLVis_PrintData("vis/ex16.data", myid, num_procs); #endif } if (myid == 0) { printf("\n"); printf("Iterations = %d\n", its); printf("Final Relative Residual Norm = %g\n", final_res_norm); printf("\n"); } } /* Free memory */ HYPRE_SStructGridDestroy(grid); HYPRE_SStructGraphDestroy(graph); HYPRE_SStructMatrixDestroy(A); HYPRE_SStructVectorDestroy(b); HYPRE_SStructVectorDestroy(x); /* Finalize HYPRE */ HYPRE_Finalize(); /* Finalize MPI */ MPI_Finalize(); return 0; } hypre-2.33.0/src/examples/ex17.c000066400000000000000000000226121477326011500162740ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /* Example 17 Interface: Structured interface (Struct) Compile with: make ex17 Sample run: mpirun -np 16 ex17 -n 10 To see options: ex17 -help Description: This code solves an "NDIM-D Laplacian" using CG. */ #include #include #include #include #include "HYPRE_struct_ls.h" #include "ex.h" #define NDIM 4 #define NSTENC (2*NDIM+1) int main (int argc, char *argv[]) { int d, i, j; int myid, num_procs; int n, N, nvol, div, rem; int p[NDIM], ilower[NDIM], iupper[NDIM]; int solver_id; HYPRE_StructGrid grid; HYPRE_StructStencil stencil; HYPRE_StructMatrix A; HYPRE_StructVector b; HYPRE_StructVector x; HYPRE_StructSolver solver; int num_iterations; double final_res_norm; /* Initialize MPI */ MPI_Init(&argc, &argv); MPI_Comm_rank(MPI_COMM_WORLD, &myid); MPI_Comm_size(MPI_COMM_WORLD, &num_procs); /* Initialize HYPRE */ HYPRE_Initialize(); /* Print GPU info */ /* HYPRE_PrintDeviceInfo(); */ /* Set defaults */ n = 10; solver_id = 0; /* Parse command line */ { int arg_index = 0; int print_usage = 0; while (arg_index < argc) { if ( strcmp(argv[arg_index], "-n") == 0 ) { arg_index++; n = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-solver") == 0 ) { arg_index++; solver_id = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-help") == 0 ) { print_usage = 1; break; } else { arg_index++; } } if ((print_usage) && (myid == 0)) { printf("\n"); printf("Usage: %s []\n", argv[0]); printf("\n"); printf(" -n : problem size per processor (default: 33)\n"); printf(" -solver : solver ID\n"); printf(" 0 - CG (default)\n"); printf(" 1 - GMRES\n"); printf("\n"); } if (print_usage) { MPI_Finalize(); return (0); } } nvol = pow(n, NDIM); /* Figure out the processor grid (N x N x N x N). The local problem size for the interior nodes is indicated by n (n x n x n x n). p indicates the position in the processor grid. */ N = pow(num_procs, 1.0 / NDIM) + 1.0e-6; div = pow(N, NDIM); rem = myid; if (num_procs != div) { printf("Num procs is not a perfect NDIM-th root!\n"); MPI_Finalize(); exit(1); } for (d = NDIM - 1; d >= 0; d--) { div /= N; p[d] = rem / div; rem %= div; } /* Figure out the extents of each processor's piece of the grid. */ for (d = 0; d < NDIM; d++) { ilower[d] = p[d] * n; iupper[d] = ilower[d] + n - 1; } /* 1. Set up a grid */ { /* Create an empty 2D grid object */ HYPRE_StructGridCreate(MPI_COMM_WORLD, NDIM, &grid); /* Add a new box to the grid */ HYPRE_StructGridSetExtents(grid, ilower, iupper); /* This is a collective call finalizing the grid assembly. The grid is now ``ready to be used'' */ HYPRE_StructGridAssemble(grid); } /* 2. Define the discretization stencil */ { /* Create an empty NDIM-D, NSTENC-pt stencil object */ HYPRE_StructStencilCreate(NDIM, NSTENC, &stencil); /* Define the geometry of the stencil */ { int entry; int offset[NDIM]; entry = 0; for (d = 0; d < NDIM; d++) { offset[d] = 0; } HYPRE_StructStencilSetElement(stencil, entry++, offset); for (d = 0; d < NDIM; d++) { offset[d] = -1; HYPRE_StructStencilSetElement(stencil, entry++, offset); offset[d] = 1; HYPRE_StructStencilSetElement(stencil, entry++, offset); offset[d] = 0; } } } /* 3. Set up a Struct Matrix */ { int nentries = NSTENC; int nvalues = nentries * nvol; double *values; int stencil_indices[NSTENC]; /* Create an empty matrix object */ HYPRE_StructMatrixCreate(MPI_COMM_WORLD, grid, stencil, &A); /* Indicate that the matrix coefficients are ready to be set */ HYPRE_StructMatrixInitialize(A); values = (double*) calloc(nvalues, sizeof(double)); for (j = 0; j < nentries; j++) { stencil_indices[j] = j; } /* Set the standard stencil at each grid point; fix boundaries later */ for (i = 0; i < nvalues; i += nentries) { values[i] = NSTENC; /* Use absolute row sum */ for (j = 1; j < nentries; j++) { values[i + j] = -1.0; } } HYPRE_StructMatrixSetBoxValues(A, ilower, iupper, nentries, stencil_indices, values); free(values); } /* 4. Incorporate zero boundary conditions: go along each edge of the domain and set the stencil entry that reaches to the boundary to zero.*/ { int bc_ilower[NDIM]; int bc_iupper[NDIM]; int nentries = 1; int nvalues = nentries * nvol / n; /* number of stencil entries times the length of one side of my grid box */ double *values; int stencil_indices[1]; values = (double*) calloc(nvalues, sizeof(double)); for (j = 0; j < nvalues; j++) { values[j] = 0.0; } for (d = 0; d < NDIM; d++) { bc_ilower[d] = ilower[d]; bc_iupper[d] = iupper[d]; } stencil_indices[0] = 1; for (d = 0; d < NDIM; d++) { /* lower boundary in dimension d */ if (p[d] == 0) { bc_iupper[d] = ilower[d]; HYPRE_StructMatrixSetBoxValues(A, bc_ilower, bc_iupper, nentries, stencil_indices, values); bc_iupper[d] = iupper[d]; } stencil_indices[0]++; /* upper boundary in dimension d */ if (p[d] == N - 1) { bc_ilower[d] = iupper[d]; HYPRE_StructMatrixSetBoxValues(A, bc_ilower, bc_iupper, nentries, stencil_indices, values); bc_ilower[d] = ilower[d]; } stencil_indices[0]++; } free(values); } /* This is a collective call finalizing the matrix assembly. The matrix is now ``ready to be used'' */ HYPRE_StructMatrixAssemble(A); /* 5. Set up Struct Vectors for b and x */ { int nvalues = nvol; double *values; values = (double*) calloc(nvalues, sizeof(double)); /* Create an empty vector object */ HYPRE_StructVectorCreate(MPI_COMM_WORLD, grid, &b); HYPRE_StructVectorCreate(MPI_COMM_WORLD, grid, &x); /* Indicate that the vector coefficients are ready to be set */ HYPRE_StructVectorInitialize(b); HYPRE_StructVectorInitialize(x); /* Set the values */ for (i = 0; i < nvalues; i ++) { values[i] = 1.0; } HYPRE_StructVectorSetBoxValues(b, ilower, iupper, values); for (i = 0; i < nvalues; i ++) { values[i] = 0.0; } HYPRE_StructVectorSetBoxValues(x, ilower, iupper, values); free(values); /* This is a collective call finalizing the vector assembly. The vector is now ``ready to be used'' */ HYPRE_StructVectorAssemble(b); HYPRE_StructVectorAssemble(x); } #if 0 HYPRE_StructMatrixPrint("ex17.out.A", A, 0); HYPRE_StructVectorPrint("ex17.out.b", b, 0); HYPRE_StructVectorPrint("ex17.out.x0", x, 0); #endif /* 6. Set up and use a struct solver (Solver options can be found in the Reference Manual.) */ if (solver_id == 0) { HYPRE_StructPCGCreate(MPI_COMM_WORLD, &solver); HYPRE_StructPCGSetMaxIter(solver, 100); HYPRE_StructPCGSetTol(solver, 1.0e-06); HYPRE_StructPCGSetTwoNorm(solver, 1); HYPRE_StructPCGSetRelChange(solver, 0); HYPRE_StructPCGSetPrintLevel(solver, 2); /* print each CG iteration */ HYPRE_StructPCGSetLogging(solver, 1); /* No preconditioner */ HYPRE_StructPCGSetup(solver, A, b, x); HYPRE_StructPCGSolve(solver, A, b, x); /* Get some info on the run */ HYPRE_StructPCGGetNumIterations(solver, &num_iterations); HYPRE_StructPCGGetFinalRelativeResidualNorm(solver, &final_res_norm); /* Clean up */ HYPRE_StructPCGDestroy(solver); } if (myid == 0) { printf("\n"); printf("Iterations = %d\n", num_iterations); printf("Final Relative Residual Norm = %g\n", final_res_norm); printf("\n"); } /* Free memory */ HYPRE_StructGridDestroy(grid); HYPRE_StructStencilDestroy(stencil); HYPRE_StructMatrixDestroy(A); HYPRE_StructVectorDestroy(b); HYPRE_StructVectorDestroy(x); /* Finalize HYPRE */ HYPRE_Finalize(); /* Finalize MPI */ MPI_Finalize(); return (0); } hypre-2.33.0/src/examples/ex18.c000066400000000000000000000320411477326011500162720ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /* Example 18 Interface: SStructured interface (SStruct) Compile with: make ex18 Sample run: mpirun -np 16 ex18 -n 4 To see options: ex18 -help Description: This code solves an "NDIM-D Laplacian" using CG. */ #include #include #include #include #include "HYPRE_sstruct_ls.h" #include "ex.h" #define NDIM 4 #define NPARTS 1 #define NVARS 2 #define NSTENC NVARS*(2*NDIM+1) int main (int argc, char *argv[]) { int d, i, j; int myid, num_procs; int n, N, nvol, div, rem; int p[NDIM], ilower[NDIM], iupper[NDIM]; int solver_id, object_type = HYPRE_SSTRUCT; HYPRE_SStructGrid grid; HYPRE_SStructStencil stencil0, stencil1; HYPRE_SStructGraph graph; HYPRE_SStructMatrix A; HYPRE_SStructVector b; HYPRE_SStructVector x; HYPRE_SStructSolver solver; int num_iterations; double final_res_norm; /* Initialize MPI */ MPI_Init(&argc, &argv); MPI_Comm_rank(MPI_COMM_WORLD, &myid); MPI_Comm_size(MPI_COMM_WORLD, &num_procs); /* Initialize HYPRE */ HYPRE_Initialize(); /* Print GPU info */ /* HYPRE_PrintDeviceInfo(); */ /* Set defaults */ n = 4; solver_id = 0; /* Parse command line */ { int arg_index = 0; int print_usage = 0; while (arg_index < argc) { if ( strcmp(argv[arg_index], "-n") == 0 ) { arg_index++; n = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-solver") == 0 ) { arg_index++; solver_id = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-help") == 0 ) { print_usage = 1; break; } else { arg_index++; } } if ((print_usage) && (myid == 0)) { printf("\n"); printf("Usage: %s []\n", argv[0]); printf("\n"); printf(" -n : problem size per processor (default: 4)\n"); printf(" -solver : solver ID\n"); printf(" 0 - CG (default)\n"); printf(" 1 - GMRES\n"); printf("\n"); } if (print_usage) { MPI_Finalize(); return (0); } } nvol = pow(n, NDIM); /* Figure out the processor grid (N x N x N x N). The local problem size for the interior nodes is indicated by n (n x n x n x n). p indicates the position in the processor grid. */ N = pow(num_procs, 1.0 / NDIM) + 1.0e-6; div = pow(N, NDIM); rem = myid; if (num_procs != div) { printf("Num procs is not a perfect NDIM-th root!\n"); MPI_Finalize(); exit(1); } for (d = NDIM - 1; d >= 0; d--) { div /= N; p[d] = rem / div; rem %= div; } /* Figure out the extents of each processor's piece of the grid. */ for (d = 0; d < NDIM; d++) { ilower[d] = p[d] * n; iupper[d] = ilower[d] + n - 1; } /* 1. Set up a grid */ { int part = 0; HYPRE_SStructVariable vartypes[NVARS] = {HYPRE_SSTRUCT_VARIABLE_CELL, HYPRE_SSTRUCT_VARIABLE_CELL }; /* Create an empty 2D grid object */ HYPRE_SStructGridCreate(MPI_COMM_WORLD, NDIM, NPARTS, &grid); /* Add a new box to the grid */ HYPRE_SStructGridSetExtents(grid, part, ilower, iupper); /* Set the variable type and number of variables on each part. */ HYPRE_SStructGridSetVariables(grid, part, NVARS, vartypes); /* The grid is now ready to use */ HYPRE_SStructGridAssemble(grid); } /* 2. Define the discretization stencil */ { /* Create two empty NDIM-D, NSTENC-pt stencil objects */ HYPRE_SStructStencilCreate(NDIM, NSTENC, &stencil0); HYPRE_SStructStencilCreate(NDIM, NSTENC, &stencil1); /* Define the geometry of the stencil */ { int entry, var0 = 0, var1 = 1; int offset[NDIM]; entry = 0; for (d = 0; d < NDIM; d++) { offset[d] = 0; } HYPRE_SStructStencilSetEntry(stencil0, entry, offset, var0); HYPRE_SStructStencilSetEntry(stencil1, entry, offset, var1); entry++; HYPRE_SStructStencilSetEntry(stencil0, entry, offset, var1); HYPRE_SStructStencilSetEntry(stencil1, entry, offset, var0); entry++; for (d = 0; d < NDIM; d++) { offset[d] = -1; HYPRE_SStructStencilSetEntry(stencil0, entry, offset, var0); HYPRE_SStructStencilSetEntry(stencil1, entry, offset, var1); entry++; HYPRE_SStructStencilSetEntry(stencil0, entry, offset, var1); HYPRE_SStructStencilSetEntry(stencil1, entry, offset, var0); entry++; offset[d] = 1; HYPRE_SStructStencilSetEntry(stencil0, entry, offset, var0); HYPRE_SStructStencilSetEntry(stencil1, entry, offset, var1); entry++; HYPRE_SStructStencilSetEntry(stencil0, entry, offset, var1); HYPRE_SStructStencilSetEntry(stencil1, entry, offset, var0); entry++; offset[d] = 0; } } } /* 3. Set up the Graph */ { int part = 0; int var0 = 0, var1 = 1; /* Create the graph object */ HYPRE_SStructGraphCreate(MPI_COMM_WORLD, grid, &graph); /* Set up the object type (see Matrix and VectorSetObjectType below) */ HYPRE_SStructGraphSetObjectType(graph, object_type); /* Set the stencil */ HYPRE_SStructGraphSetStencil(graph, part, var0, stencil0); HYPRE_SStructGraphSetStencil(graph, part, var1, stencil1); /* Assemble the graph */ HYPRE_SStructGraphAssemble(graph); } /* 4. Set up the Matrix */ { int part = 0; int var0 = 0, var1 = 1; int nentries = NSTENC / NVARS; int nvalues = nentries * nvol; double *values; int stencil_indices[NSTENC]; /* Create an empty matrix object */ HYPRE_SStructMatrixCreate(MPI_COMM_WORLD, graph, &A); /* Set up the object type */ HYPRE_SStructMatrixSetObjectType(A, object_type); /* Get ready to set values */ HYPRE_SStructMatrixInitialize(A); values = (double*) calloc(nvalues, sizeof(double)); /* Set intra-variable values; fix boundaries later */ for (j = 0; j < nentries; j++) { stencil_indices[j] = 2 * j; } for (i = 0; i < nvalues; i += nentries) { values[i] = 1.1 * (NSTENC / NVARS); /* Diagonal: Use absolute row sum */ for (j = 1; j < nentries; j++) { values[i + j] = -1.0; } } HYPRE_SStructMatrixSetBoxValues(A, part, ilower, iupper, var0, nentries, stencil_indices, values); HYPRE_SStructMatrixSetBoxValues(A, part, ilower, iupper, var1, nentries, stencil_indices, values); /* Set inter-variable values; fix boundaries later */ for (j = 0; j < nentries; j++) { stencil_indices[j] = 2 * j + 1; } for (i = 0; i < nvalues; i += nentries) { values[i] = -0.1; for (j = 1; j < nentries; j++) { values[i + j] = -0.1; } } HYPRE_SStructMatrixSetBoxValues(A, part, ilower, iupper, var0, nentries, stencil_indices, values); HYPRE_SStructMatrixSetBoxValues(A, part, ilower, iupper, var1, nentries, stencil_indices, values); free(values); } /* 5. Incorporate zero boundary conditions: go along each edge of the domain and set the stencil entry that reaches to the boundary to zero.*/ { int part = 0; int var0 = 0, var1 = 1; int bc_ilower[NDIM]; int bc_iupper[NDIM]; int nentries = 1; int nvalues = nentries * nvol / n; /* number of stencil entries times the length of one side of my grid box */ double *values; int stencil_indices[1]; values = (double*) calloc(nvalues, sizeof(double)); for (j = 0; j < nvalues; j++) { values[j] = 0.0; } for (d = 0; d < NDIM; d++) { bc_ilower[d] = ilower[d]; bc_iupper[d] = iupper[d]; } stencil_indices[0] = NVARS; for (d = 0; d < NDIM; d++) { /* lower boundary in dimension d */ if (p[d] == 0) { bc_iupper[d] = ilower[d]; for (i = 0; i < NVARS; i++) { HYPRE_SStructMatrixSetBoxValues(A, part, bc_ilower, bc_iupper, var0, nentries, stencil_indices, values); HYPRE_SStructMatrixSetBoxValues(A, part, bc_ilower, bc_iupper, var1, nentries, stencil_indices, values); stencil_indices[0]++; } bc_iupper[d] = iupper[d]; } else { stencil_indices[0] += NVARS; } /* upper boundary in dimension d */ if (p[d] == N - 1) { bc_ilower[d] = iupper[d]; for (i = 0; i < NVARS; i++) { HYPRE_SStructMatrixSetBoxValues(A, part, bc_ilower, bc_iupper, var0, nentries, stencil_indices, values); HYPRE_SStructMatrixSetBoxValues(A, part, bc_ilower, bc_iupper, var1, nentries, stencil_indices, values); stencil_indices[0]++; } bc_ilower[d] = ilower[d]; } else { stencil_indices[0] += NVARS; } } free(values); } /* The matrix is now ready to use */ HYPRE_SStructMatrixAssemble(A); /* 6. Set up Vectors for b and x */ { int part = 0; int var0 = 0, var1 = 1; int nvalues = NVARS * nvol; double *values; values = (double*) calloc(nvalues, sizeof(double)); /* Create an empty vector object */ HYPRE_SStructVectorCreate(MPI_COMM_WORLD, grid, &b); HYPRE_SStructVectorCreate(MPI_COMM_WORLD, grid, &x); /* Set up the object type */ HYPRE_SStructVectorSetObjectType(b, object_type); HYPRE_SStructVectorSetObjectType(x, object_type); /* Indicate that the vector coefficients are ready to be set */ HYPRE_SStructVectorInitialize(b); HYPRE_SStructVectorInitialize(x); /* Set the values */ for (i = 0; i < nvalues; i ++) { values[i] = 1.0; } HYPRE_SStructVectorSetBoxValues(b, part, ilower, iupper, var0, values); HYPRE_SStructVectorSetBoxValues(b, part, ilower, iupper, var1, values); for (i = 0; i < nvalues; i ++) { values[i] = 0.0; } HYPRE_SStructVectorSetBoxValues(x, part, ilower, iupper, var0, values); HYPRE_SStructVectorSetBoxValues(x, part, ilower, iupper, var1, values); free(values); /* The vector is now ready to use */ HYPRE_SStructVectorAssemble(b); HYPRE_SStructVectorAssemble(x); } #if 0 HYPRE_SStructMatrixPrint("ex18.out.A", A, 0); HYPRE_SStructVectorPrint("ex18.out.b", b, 0); HYPRE_SStructVectorPrint("ex18.out.x0", x, 0); #endif /* 7. Set up and use a struct solver */ if (solver_id == 0) { HYPRE_SStructPCGCreate(MPI_COMM_WORLD, &solver); HYPRE_SStructPCGSetMaxIter(solver, 100); HYPRE_SStructPCGSetTol(solver, 1.0e-06); HYPRE_SStructPCGSetTwoNorm(solver, 1); HYPRE_SStructPCGSetRelChange(solver, 0); HYPRE_SStructPCGSetPrintLevel(solver, 2); /* print each CG iteration */ HYPRE_SStructPCGSetLogging(solver, 1); /* No preconditioner */ HYPRE_SStructPCGSetup(solver, A, b, x); HYPRE_SStructPCGSolve(solver, A, b, x); /* Get some info on the run */ HYPRE_SStructPCGGetNumIterations(solver, &num_iterations); HYPRE_SStructPCGGetFinalRelativeResidualNorm(solver, &final_res_norm); /* Clean up */ HYPRE_SStructPCGDestroy(solver); } if (myid == 0) { printf("\n"); printf("Iterations = %d\n", num_iterations); printf("Final Relative Residual Norm = %g\n", final_res_norm); printf("\n"); } /* Free memory */ HYPRE_SStructGridDestroy(grid); HYPRE_SStructGraphDestroy(graph); HYPRE_SStructStencilDestroy(stencil0); HYPRE_SStructStencilDestroy(stencil1); HYPRE_SStructMatrixDestroy(A); HYPRE_SStructVectorDestroy(b); HYPRE_SStructVectorDestroy(x); /* Finalize HYPRE */ HYPRE_Finalize(); /* Finalize MPI */ MPI_Finalize(); return (0); } hypre-2.33.0/src/examples/ex18comp.c000066400000000000000000000327141477326011500171600ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /* Example 18comp Interface: SStructured interface (SStruct) Compile with: make ex18comp Sample run: mpirun -np 16 ex18comp -n 4 To see options: ex18comp -help Description: This code solves a complex "NDIM-D Laplacian" using CG. */ #include #include #include #include #include #include "HYPRE_sstruct_ls.h" #define NDIM 4 #define NPARTS 1 #define NVARS 2 #define NSTENC NVARS*(2*NDIM+1) int main (int argc, char *argv[]) { int d, i, j; int myid, num_procs; int n, N, nvol, div, rem; int p[NDIM], ilower[NDIM], iupper[NDIM]; int solver_id, object_type = HYPRE_SSTRUCT; HYPRE_SStructGrid grid; HYPRE_SStructStencil stencil0, stencil1; HYPRE_SStructGraph graph; HYPRE_SStructMatrix A; HYPRE_SStructVector b; HYPRE_SStructVector x; HYPRE_SStructSolver solver; int num_iterations; double final_res_norm; /* Initialize MPI */ MPI_Init(&argc, &argv); MPI_Comm_rank(MPI_COMM_WORLD, &myid); MPI_Comm_size(MPI_COMM_WORLD, &num_procs); /* Initialize HYPRE */ HYPRE_Initialize(); /* Print GPU info */ /* HYPRE_PrintDeviceInfo(); */ /* Set defaults */ n = 4; solver_id = 0; /* Parse command line */ { int arg_index = 0; int print_usage = 0; while (arg_index < argc) { if ( strcmp(argv[arg_index], "-n") == 0 ) { arg_index++; n = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-solver") == 0 ) { arg_index++; solver_id = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-help") == 0 ) { print_usage = 1; break; } else { arg_index++; } } if ((print_usage) && (myid == 0)) { printf("\n"); printf("Usage: %s []\n", argv[0]); printf("\n"); printf(" -n : problem size per processor (default: 4)\n"); printf(" -solver : solver ID\n"); printf(" 0 - CG (default)\n"); printf(" 1 - GMRES\n"); printf("\n"); } if (print_usage) { MPI_Finalize(); return (0); } } nvol = pow(n, NDIM); /* Figure out the processor grid (N x N x N x N). The local problem size for the interior nodes is indicated by n (n x n x n x n). p indicates the position in the processor grid. */ N = pow(num_procs, 1.0 / NDIM) + 1.0e-6; div = pow(N, NDIM); rem = myid; if (num_procs != div) { printf("Num procs is not a perfect NDIM-th root!\n"); MPI_Finalize(); exit(1); } for (d = NDIM - 1; d >= 0; d--) { div /= N; p[d] = rem / div; rem %= div; } /* Figure out the extents of each processor's piece of the grid. */ for (d = 0; d < NDIM; d++) { ilower[d] = p[d] * n; iupper[d] = ilower[d] + n - 1; } /* 1. Set up a grid */ { int part = 0; HYPRE_SStructVariable vartypes[NVARS] = {HYPRE_SSTRUCT_VARIABLE_CELL, HYPRE_SSTRUCT_VARIABLE_CELL }; /* Create an empty 2D grid object */ HYPRE_SStructGridCreate(MPI_COMM_WORLD, NDIM, NPARTS, &grid); /* Add a new box to the grid */ HYPRE_SStructGridSetExtents(grid, part, ilower, iupper); /* Set the variable type and number of variables on each part. */ HYPRE_SStructGridSetVariables(grid, part, NVARS, vartypes); /* The grid is now ready to use */ HYPRE_SStructGridAssemble(grid); } /* 2. Define the discretization stencil */ { /* Create two empty NDIM-D, NSTENC-pt stencil objects */ HYPRE_SStructStencilCreate(NDIM, NSTENC, &stencil0); HYPRE_SStructStencilCreate(NDIM, NSTENC, &stencil1); /* Define the geometry of the stencil */ { int entry, var0 = 0, var1 = 1; int offset[NDIM]; entry = 0; for (d = 0; d < NDIM; d++) { offset[d] = 0; } HYPRE_SStructStencilSetEntry(stencil0, entry, offset, var0); HYPRE_SStructStencilSetEntry(stencil1, entry, offset, var1); entry++; HYPRE_SStructStencilSetEntry(stencil0, entry, offset, var1); HYPRE_SStructStencilSetEntry(stencil1, entry, offset, var0); entry++; for (d = 0; d < NDIM; d++) { offset[d] = -1; HYPRE_SStructStencilSetEntry(stencil0, entry, offset, var0); HYPRE_SStructStencilSetEntry(stencil1, entry, offset, var1); entry++; HYPRE_SStructStencilSetEntry(stencil0, entry, offset, var1); HYPRE_SStructStencilSetEntry(stencil1, entry, offset, var0); entry++; offset[d] = 1; HYPRE_SStructStencilSetEntry(stencil0, entry, offset, var0); HYPRE_SStructStencilSetEntry(stencil1, entry, offset, var1); entry++; HYPRE_SStructStencilSetEntry(stencil0, entry, offset, var1); HYPRE_SStructStencilSetEntry(stencil1, entry, offset, var0); entry++; offset[d] = 0; } } } /* 3. Set up the Graph */ { int part = 0; int var0 = 0, var1 = 1; /* Create the graph object */ HYPRE_SStructGraphCreate(MPI_COMM_WORLD, grid, &graph); /* Set up the object type (see Matrix and VectorSetObjectType below) */ HYPRE_SStructGraphSetObjectType(graph, object_type); /* Set the stencil */ HYPRE_SStructGraphSetStencil(graph, part, var0, stencil0); HYPRE_SStructGraphSetStencil(graph, part, var1, stencil1); /* Assemble the graph */ HYPRE_SStructGraphAssemble(graph); } /* 4. Set up the Matrix */ { int part = 0; int var0 = 0, var1 = 1; int nentries = NSTENC / NVARS; int nvalues = nentries * nvol; HYPRE_Complex *values; int stencil_indices[NSTENC]; /* Create an empty matrix object */ HYPRE_SStructMatrixCreate(MPI_COMM_WORLD, graph, &A); /* Set up the object type */ HYPRE_SStructMatrixSetObjectType(A, object_type); /* Get ready to set values */ HYPRE_SStructMatrixInitialize(A); values = (HYPRE_Complex*) calloc(nvalues, sizeof(HYPRE_Complex)); /* Set intra-variable values; fix boundaries later */ for (j = 0; j < nentries; j++) { stencil_indices[j] = 2 * j; } for (i = 0; i < nvalues; i += nentries) { values[i] = 1.1 * (NSTENC / NVARS); /* Diagonal: Use absolute row sum */ for (j = 1; j < nentries; j++) { values[i + j] = -1.0; } } HYPRE_SStructMatrixSetBoxValues(A, part, ilower, iupper, var0, nentries, stencil_indices, values); HYPRE_SStructMatrixSetBoxValues(A, part, ilower, iupper, var1, nentries, stencil_indices, values); /* Set inter-variable values; fix boundaries later */ for (j = 0; j < nentries; j++) { stencil_indices[j] = 2 * j + 1; } /* Add an imaginary component and ensure conjugate to below */ for (i = 0; i < nvalues; i += nentries) { for (j = 0; j < nentries; j++) { values[i + j] = (-0.1 + (HYPRE_Complex)I * 0.1); } } HYPRE_SStructMatrixSetBoxValues(A, part, ilower, iupper, var0, nentries, stencil_indices, values); /* Add an imaginary component and ensure conjugate to above */ for (i = 0; i < nvalues; i += nentries) { for (j = 0; j < nentries; j++) { values[i + j] = (HYPRE_Complex)(-0.1 - I * 0.1); } } HYPRE_SStructMatrixSetBoxValues(A, part, ilower, iupper, var1, nentries, stencil_indices, values); free(values); } /* 5. Incorporate zero boundary conditions: go along each edge of the domain and set the stencil entry that reaches to the boundary to zero.*/ { int part = 0; int var0 = 0, var1 = 1; int bc_ilower[NDIM]; int bc_iupper[NDIM]; int nentries = 1; int nvalues = nentries * nvol / n; /* number of stencil entries times the length of one side of my grid box */ HYPRE_Complex *values; int stencil_indices[1]; values = (HYPRE_Complex*) calloc(nvalues, sizeof(HYPRE_Complex)); for (j = 0; j < nvalues; j++) { values[j] = 0.0; } for (d = 0; d < NDIM; d++) { bc_ilower[d] = ilower[d]; bc_iupper[d] = iupper[d]; } stencil_indices[0] = NVARS; for (d = 0; d < NDIM; d++) { /* lower boundary in dimension d */ if (p[d] == 0) { bc_iupper[d] = ilower[d]; for (i = 0; i < NVARS; i++) { HYPRE_SStructMatrixSetBoxValues(A, part, bc_ilower, bc_iupper, var0, nentries, stencil_indices, values); HYPRE_SStructMatrixSetBoxValues(A, part, bc_ilower, bc_iupper, var1, nentries, stencil_indices, values); stencil_indices[0]++; } bc_iupper[d] = iupper[d]; } else { stencil_indices[0] += NVARS; } /* upper boundary in dimension d */ if (p[d] == N - 1) { bc_ilower[d] = iupper[d]; for (i = 0; i < NVARS; i++) { HYPRE_SStructMatrixSetBoxValues(A, part, bc_ilower, bc_iupper, var0, nentries, stencil_indices, values); HYPRE_SStructMatrixSetBoxValues(A, part, bc_ilower, bc_iupper, var1, nentries, stencil_indices, values); stencil_indices[0]++; } bc_ilower[d] = ilower[d]; } else { stencil_indices[0] += NVARS; } } free(values); } /* The matrix is now ready to use */ HYPRE_SStructMatrixAssemble(A); /* 6. Set up Vectors for b and x */ { int part = 0; int var0 = 0, var1 = 1; int nvalues = NVARS * nvol; HYPRE_Complex *values; values = (HYPRE_Complex*) calloc(nvalues, sizeof(HYPRE_Complex)); /* Create an empty vector object */ HYPRE_SStructVectorCreate(MPI_COMM_WORLD, grid, &b); HYPRE_SStructVectorCreate(MPI_COMM_WORLD, grid, &x); /* Set up the object type */ HYPRE_SStructVectorSetObjectType(b, object_type); HYPRE_SStructVectorSetObjectType(x, object_type); /* Indicate that the vector coefficients are ready to be set */ HYPRE_SStructVectorInitialize(b); HYPRE_SStructVectorInitialize(x); /* Set the values */ for (i = 0; i < nvalues; i ++) { values[i] = 1.0; } HYPRE_SStructVectorSetBoxValues(b, part, ilower, iupper, var0, values); HYPRE_SStructVectorSetBoxValues(b, part, ilower, iupper, var1, values); for (i = 0; i < nvalues; i ++) { values[i] = 0.0; } HYPRE_SStructVectorSetBoxValues(x, part, ilower, iupper, var0, values); HYPRE_SStructVectorSetBoxValues(x, part, ilower, iupper, var1, values); free(values); /* The vector is now ready to use */ HYPRE_SStructVectorAssemble(b); HYPRE_SStructVectorAssemble(x); } #if 0 HYPRE_SStructMatrixPrint("ex18comp.out.A", A, 0); HYPRE_SStructVectorPrint("ex18comp.out.b", b, 0); HYPRE_SStructVectorPrint("ex18comp.out.x0", x, 0); #endif /* 7. Set up and use a struct solver */ if (solver_id == 0) { HYPRE_SStructPCGCreate(MPI_COMM_WORLD, &solver); HYPRE_SStructPCGSetMaxIter(solver, 100); HYPRE_SStructPCGSetTol(solver, 1.0e-06); HYPRE_SStructPCGSetTwoNorm(solver, 1); HYPRE_SStructPCGSetRelChange(solver, 0); HYPRE_SStructPCGSetPrintLevel(solver, 2); /* print each CG iteration */ HYPRE_SStructPCGSetLogging(solver, 1); /* No preconditioner */ HYPRE_SStructPCGSetup(solver, A, b, x); HYPRE_SStructPCGSolve(solver, A, b, x); /* Get some info on the run */ HYPRE_SStructPCGGetNumIterations(solver, &num_iterations); HYPRE_SStructPCGGetFinalRelativeResidualNorm(solver, &final_res_norm); /* Clean up */ HYPRE_SStructPCGDestroy(solver); } if (myid == 0) { printf("\n"); printf("Iterations = %d\n", num_iterations); printf("Final Relative Residual Norm = %g\n", final_res_norm); printf("\n"); } /* Free memory */ HYPRE_SStructGridDestroy(grid); HYPRE_SStructGraphDestroy(graph); HYPRE_SStructStencilDestroy(stencil0); HYPRE_SStructStencilDestroy(stencil1); HYPRE_SStructMatrixDestroy(A); HYPRE_SStructVectorDestroy(b); HYPRE_SStructVectorDestroy(x); /* Finalize HYPRE */ HYPRE_Finalize(); /* Finalize MPI */ MPI_Finalize(); return (0); } hypre-2.33.0/src/examples/ex2.c000066400000000000000000000373001477326011500162060ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /* Example 2 Interface: Structured interface (Struct) Compile with: make ex2 Sample run: mpirun -np 2 ex2 Description: This is a two processor example and is similar to the previous structured interface example (Example 1). However, in this case the grid boxes are exactly those in the example diagram in the struct interface chapter of the User's Manual. (Processor 0 owns two boxes and processor 1 owns one box.) The solver is PCG with SMG preconditioner. We recommend viewing example 1 before viewing this example. */ #include #include #include /* Struct linear solvers header */ #include "HYPRE_struct_ls.h" #include "ex.h" #ifdef HYPRE_EXVIS #include "vis.c" #endif int main (int argc, char *argv[]) { int i, j; int myid, num_procs; int vis = 0; HYPRE_StructGrid grid; HYPRE_StructStencil stencil; HYPRE_StructMatrix A; HYPRE_StructVector b; HYPRE_StructVector x; HYPRE_StructSolver solver; HYPRE_StructSolver precond; /* Initialize MPI */ MPI_Init(&argc, &argv); MPI_Comm_rank(MPI_COMM_WORLD, &myid); MPI_Comm_size(MPI_COMM_WORLD, &num_procs); if (num_procs != 2) { if (myid == 0) { printf("Must run with 2 processors!\n"); } MPI_Finalize(); return (0); } /* Initialize HYPRE */ HYPRE_Initialize(); /* Print GPU info */ /* HYPRE_PrintDeviceInfo(); */ /* Parse command line */ { int arg_index = 0; int print_usage = 0; while (arg_index < argc) { if ( strcmp(argv[arg_index], "-vis") == 0 ) { arg_index++; vis = 1; } else if ( strcmp(argv[arg_index], "-help") == 0 ) { print_usage = 1; break; } else { arg_index++; } } if ((print_usage) && (myid == 0)) { printf("\n"); printf("Usage: %s []\n", argv[0]); printf("\n"); printf(" -vis : save the solution for GLVis visualization\n"); printf("\n"); } if (print_usage) { MPI_Finalize(); return (0); } } /* 1. Set up a grid */ { /* Create an empty 2D grid object */ HYPRE_StructGridCreate(MPI_COMM_WORLD, 2, &grid); /* Processor 0 owns two boxes in the grid. */ if (myid == 0) { /* Add a new box to the grid */ { int ilower[2] = {-3, 1}; int iupper[2] = {-1, 2}; HYPRE_StructGridSetExtents(grid, ilower, iupper); } /* Add a new box to the grid */ { int ilower[2] = {0, 1}; int iupper[2] = {2, 4}; HYPRE_StructGridSetExtents(grid, ilower, iupper); } } /* Processor 1 owns one box in the grid. */ else if (myid == 1) { /* Add a new box to the grid */ { int ilower[2] = {3, 1}; int iupper[2] = {6, 4}; HYPRE_StructGridSetExtents(grid, ilower, iupper); } } /* This is a collective call finalizing the grid assembly. The grid is now ``ready to be used'' */ HYPRE_StructGridAssemble(grid); } /* 2. Define the discretization stencil */ { /* Create an empty 2D, 5-pt stencil object */ HYPRE_StructStencilCreate(2, 5, &stencil); /* Define the geometry of the stencil. Each represents a relative offset (in the index space). */ { int entry; int offsets[5][2] = {{0, 0}, {-1, 0}, {1, 0}, {0, -1}, {0, 1}}; /* Assign each of the 5 stencil entries */ for (entry = 0; entry < 5; entry++) { HYPRE_StructStencilSetElement(stencil, entry, offsets[entry]); } } } /* 3. Set up a Struct Matrix */ { /* Create an empty matrix object */ HYPRE_StructMatrixCreate(MPI_COMM_WORLD, grid, stencil, &A); /* Indicate that the matrix coefficients are ready to be set */ HYPRE_StructMatrixInitialize(A); if (myid == 0) { /* Set the matrix coefficients for some set of stencil entries over all the gridpoints in my first box (account for boundary grid points later) */ { int ilower[2] = {-3, 1}; int iupper[2] = {-1, 2}; int nentries = 5; int nvalues = 30; /* 6 grid points, each with 5 stencil entries */ /* double values[30]; OK to use constant-length array for CPUs */ double *values = (double *) malloc(30 * sizeof(double)); int stencil_indices[5]; for (j = 0; j < nentries; j++) /* label the stencil indices - these correspond to the offsets defined above */ { stencil_indices[j] = j; } for (i = 0; i < nvalues; i += nentries) { values[i] = 4.0; for (j = 1; j < nentries; j++) { values[i + j] = -1.0; } } HYPRE_StructMatrixSetBoxValues(A, ilower, iupper, nentries, stencil_indices, values); free(values); } /* Set the matrix coefficients for some set of stencil entries over the gridpoints in my second box */ { int ilower[2] = {0, 1}; int iupper[2] = {2, 4}; int nentries = 5; int nvalues = 60; /* 12 grid points, each with 5 stencil entries */ /* double values[60]; OK to use constant-length array for CPUs */ double *values = (double *) malloc(60 * sizeof(double)); int stencil_indices[5]; for (j = 0; j < nentries; j++) { stencil_indices[j] = j; } for (i = 0; i < nvalues; i += nentries) { values[i] = 4.0; for (j = 1; j < nentries; j++) { values[i + j] = -1.0; } } HYPRE_StructMatrixSetBoxValues(A, ilower, iupper, nentries, stencil_indices, values); free(values); } } else if (myid == 1) { /* Set the matrix coefficients for some set of stencil entries over the gridpoints in my box */ { int ilower[2] = {3, 1}; int iupper[2] = {6, 4}; int nentries = 5; int nvalues = 80; /* 16 grid points, each with 5 stencil entries */ /* double values[80]; OK to use constant-length array for CPUs */ double *values = (double *) malloc(80 * sizeof(double)); int stencil_indices[5]; for (j = 0; j < nentries; j++) { stencil_indices[j] = j; } for (i = 0; i < nvalues; i += nentries) { values[i] = 4.0; for (j = 1; j < nentries; j++) { values[i + j] = -1.0; } } HYPRE_StructMatrixSetBoxValues(A, ilower, iupper, nentries, stencil_indices, values); free(values); } } /* For each box, set any coefficients that reach outside of the boundary to 0 */ if (myid == 0) { int maxnvalues = 6; /* double values[6]; OK to use constant-length array for CPUs */ double *values = (double *) malloc(6 * sizeof(double)); for (i = 0; i < maxnvalues; i++) { values[i] = 0.0; } { /* Values below our first AND second box */ int ilower[2] = {-3, 1}; int iupper[2] = { 2, 1}; int stencil_indices[1] = {3}; HYPRE_StructMatrixSetBoxValues(A, ilower, iupper, 1, stencil_indices, values); } { /* Values to the left of our first box */ int ilower[2] = {-3, 1}; int iupper[2] = {-3, 2}; int stencil_indices[1] = {1}; HYPRE_StructMatrixSetBoxValues(A, ilower, iupper, 1, stencil_indices, values); } { /* Values above our first box */ int ilower[2] = {-3, 2}; int iupper[2] = {-1, 2}; int stencil_indices[1] = {4}; HYPRE_StructMatrixSetBoxValues(A, ilower, iupper, 1, stencil_indices, values); } { /* Values to the left of our second box (that do not border the first box). */ int ilower[2] = { 0, 3}; int iupper[2] = { 0, 4}; int stencil_indices[1] = {1}; HYPRE_StructMatrixSetBoxValues(A, ilower, iupper, 1, stencil_indices, values); } { /* Values above our second box */ int ilower[2] = { 0, 4}; int iupper[2] = { 2, 4}; int stencil_indices[1] = {4}; HYPRE_StructMatrixSetBoxValues(A, ilower, iupper, 1, stencil_indices, values); } free(values); } else if (myid == 1) { int maxnvalues = 4; /* double values[4]; OK to use constant-length array for CPUs */ double *values = (double *) malloc(4 * sizeof(double)); for (i = 0; i < maxnvalues; i++) { values[i] = 0.0; } { /* Values below our box */ int ilower[2] = { 3, 1}; int iupper[2] = { 6, 1}; int stencil_indices[1] = {3}; HYPRE_StructMatrixSetBoxValues(A, ilower, iupper, 1, stencil_indices, values); } { /* Values to the right of our box */ int ilower[2] = { 6, 1}; int iupper[2] = { 6, 4}; int stencil_indices[1] = {2}; HYPRE_StructMatrixSetBoxValues(A, ilower, iupper, 1, stencil_indices, values); } { /* Values above our box */ int ilower[2] = { 3, 4}; int iupper[2] = { 6, 4}; int stencil_indices[1] = {4}; HYPRE_StructMatrixSetBoxValues(A, ilower, iupper, 1, stencil_indices, values); } free(values); } /* This is a collective call finalizing the matrix assembly. The matrix is now ``ready to be used'' */ HYPRE_StructMatrixAssemble(A); } /* 4. Set up Struct Vectors for b and x */ { /* Create an empty vector object */ HYPRE_StructVectorCreate(MPI_COMM_WORLD, grid, &b); HYPRE_StructVectorCreate(MPI_COMM_WORLD, grid, &x); /* Indicate that the vector coefficients are ready to be set */ HYPRE_StructVectorInitialize(b); HYPRE_StructVectorInitialize(x); if (myid == 0) { /* Set the vector coefficients over the gridpoints in my first box */ { int ilower[2] = {-3, 1}; int iupper[2] = {-1, 2}; int nvalues = 6; /* 6 grid points */ /* double values[6]; OK to use constant-length array for CPUs */ double *values = (double *) malloc(6 * sizeof(double)); for (i = 0; i < nvalues; i ++) { values[i] = 1.0; } HYPRE_StructVectorSetBoxValues(b, ilower, iupper, values); for (i = 0; i < nvalues; i ++) { values[i] = 0.0; } HYPRE_StructVectorSetBoxValues(x, ilower, iupper, values); free(values); } /* Set the vector coefficients over the gridpoints in my second box */ { int ilower[2] = { 0, 1}; int iupper[2] = { 2, 4}; int nvalues = 12; /* 12 grid points */ /* double values[12]; OK to use constant-length array for CPUs */ double *values = (double *) malloc(12 * sizeof(double)); for (i = 0; i < nvalues; i ++) { values[i] = 1.0; } HYPRE_StructVectorSetBoxValues(b, ilower, iupper, values); for (i = 0; i < nvalues; i ++) { values[i] = 0.0; } HYPRE_StructVectorSetBoxValues(x, ilower, iupper, values); free(values); } } else if (myid == 1) { /* Set the vector coefficients over the gridpoints in my box */ { int ilower[2] = { 3, 1}; int iupper[2] = { 6, 4}; int nvalues = 16; /* 16 grid points */ /* double values[16]; OK to use constant-length array for CPUs */ double *values = (double *) malloc(16 * sizeof(double)); for (i = 0; i < nvalues; i ++) { values[i] = 1.0; } HYPRE_StructVectorSetBoxValues(b, ilower, iupper, values); for (i = 0; i < nvalues; i ++) { values[i] = 0.0; } HYPRE_StructVectorSetBoxValues(x, ilower, iupper, values); free(values); } } /* This is a collective call finalizing the vector assembly. The vectors are now ``ready to be used'' */ HYPRE_StructVectorAssemble(b); HYPRE_StructVectorAssemble(x); } /* 5. Set up and use a solver (See the Reference Manual for descriptions of all of the options.) */ { /* Create an empty PCG Struct solver */ HYPRE_StructPCGCreate(MPI_COMM_WORLD, &solver); /* Set PCG parameters */ HYPRE_StructPCGSetTol(solver, 1.0e-06); HYPRE_StructPCGSetPrintLevel(solver, 2); HYPRE_StructPCGSetMaxIter(solver, 50); /* Use symmetric SMG as preconditioner */ HYPRE_StructSMGCreate(MPI_COMM_WORLD, &precond); HYPRE_StructSMGSetMaxIter(precond, 1); HYPRE_StructSMGSetTol(precond, 0.0); HYPRE_StructSMGSetZeroGuess(precond); HYPRE_StructSMGSetNumPreRelax(precond, 1); HYPRE_StructSMGSetNumPostRelax(precond, 1); /* Set preconditioner and solve */ HYPRE_StructPCGSetPrecond(solver, HYPRE_StructSMGSolve, HYPRE_StructSMGSetup, precond); HYPRE_StructPCGSetup(solver, A, b, x); HYPRE_StructPCGSolve(solver, A, b, x); } /* Save the solution for GLVis visualization, see vis/glvis-ex2.sh */ if (vis) { #ifdef HYPRE_EXVIS GLVis_PrintStructGrid(grid, "vis/ex2.mesh", myid, NULL, NULL); GLVis_PrintStructVector(x, "vis/ex2.sol", myid); GLVis_PrintData("vis/ex2.data", myid, num_procs); #endif } /* Free memory */ HYPRE_StructGridDestroy(grid); HYPRE_StructStencilDestroy(stencil); HYPRE_StructMatrixDestroy(A); HYPRE_StructVectorDestroy(b); HYPRE_StructVectorDestroy(x); HYPRE_StructPCGDestroy(solver); HYPRE_StructSMGDestroy(precond); /* Finalize HYPRE */ HYPRE_Finalize(); /* Finalize MPI */ MPI_Finalize(); return (0); } hypre-2.33.0/src/examples/ex3.c000066400000000000000000000341661477326011500162160ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /* Example 3 Interface: Structured interface (Struct) Compile with: make ex3 Sample run: mpirun -np 16 ex3 -n 33 -solver 0 -v 1 1 To see options: ex3 -help Description: This code solves a system corresponding to a discretization of the Laplace equation -Delta u = 1 with zero boundary conditions on the unit square. The domain is split into an N x N processor grid. Thus, the given number of processors should be a perfect square. Each processor's piece of the grid has n x n cells with n x n nodes connected by the standard 5-point stencil. Note that the struct interface assumes a cell-centered grid, and, therefore, the nodes are not shared. This example demonstrates more features than the previous two struct examples (Example 1 and Example 2). Two solvers are available. To incorporate the boundary conditions, we do the following: Let x_i and x_b be the interior and boundary parts of the solution vector x. We can split the matrix A as A = [A_ii A_ib; A_bi A_bb]. Let u_0 be the Dirichlet B.C. We can simply say that x_b = u_0. If b_i is the right-hand side, then we just need to solve in the interior: A_ii x_i = b_i - A_ib u_0. For this partitcular example, u_0 = 0, so we are just solving A_ii x_i = b_i. We recommend viewing examples 1 and 2 before viewing this example. */ #include #include #include #include #include "HYPRE_struct_ls.h" #include "ex.h" #ifdef HYPRE_EXVIS #include "vis.c" #endif int main (int argc, char *argv[]) { int i, j; int myid, num_procs; int n, N, pi, pj; double h, h2; int ilower[2], iupper[2]; int solver_id; int n_pre, n_post; HYPRE_StructGrid grid; HYPRE_StructStencil stencil; HYPRE_StructMatrix A; HYPRE_StructVector b; HYPRE_StructVector x; HYPRE_StructSolver solver; HYPRE_StructSolver precond; int num_iterations; double final_res_norm; int vis; /* Initialize MPI */ MPI_Init(&argc, &argv); MPI_Comm_rank(MPI_COMM_WORLD, &myid); MPI_Comm_size(MPI_COMM_WORLD, &num_procs); /* Set defaults */ n = 33; solver_id = 0; n_pre = 1; n_post = 1; vis = 0; /* Parse command line */ { int arg_index = 0; int print_usage = 0; while (arg_index < argc) { if ( strcmp(argv[arg_index], "-n") == 0 ) { arg_index++; n = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-solver") == 0 ) { arg_index++; solver_id = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-v") == 0 ) { arg_index++; n_pre = atoi(argv[arg_index++]); n_post = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-vis") == 0 ) { arg_index++; vis = 1; } else if ( strcmp(argv[arg_index], "-help") == 0 ) { print_usage = 1; break; } else { arg_index++; } } if ((print_usage) && (myid == 0)) { printf("\n"); printf("Usage: %s []\n", argv[0]); printf("\n"); printf(" -n : problem size per processor (default: 33)\n"); printf(" -solver : solver ID\n"); printf(" 0 - PCG with SMG precond (default)\n"); printf(" 1 - SMG\n"); printf(" -v : number of pre and post relaxations (default: 1 1)\n"); printf(" -vis : save the solution for GLVis visualization\n"); printf("\n"); } if (print_usage) { MPI_Finalize(); return (0); } } /* Initialize HYPRE */ HYPRE_Initialize(); /* Print GPU info */ /* HYPRE_PrintDeviceInfo(); */ /* Figure out the processor grid (N x N). The local problem size for the interior nodes is indicated by n (n x n). pi and pj indicate position in the processor grid. */ N = sqrt(num_procs); h = 1.0 / (N * n + 1); /* note that when calculating h we must remember to count the boundary nodes */ h2 = h * h; pj = myid / N; pi = myid - pj * N; /* Figure out the extents of each processor's piece of the grid. */ ilower[0] = pi * n; ilower[1] = pj * n; iupper[0] = ilower[0] + n - 1; iupper[1] = ilower[1] + n - 1; /* 1. Set up a grid */ { /* Create an empty 2D grid object */ HYPRE_StructGridCreate(MPI_COMM_WORLD, 2, &grid); /* Add a new box to the grid */ HYPRE_StructGridSetExtents(grid, ilower, iupper); /* This is a collective call finalizing the grid assembly. The grid is now ``ready to be used'' */ HYPRE_StructGridAssemble(grid); } /* 2. Define the discretization stencil */ { /* Create an empty 2D, 5-pt stencil object */ HYPRE_StructStencilCreate(2, 5, &stencil); /* Define the geometry of the stencil */ { int entry; int offsets[5][2] = {{0, 0}, {-1, 0}, {1, 0}, {0, -1}, {0, 1}}; for (entry = 0; entry < 5; entry++) { HYPRE_StructStencilSetElement(stencil, entry, offsets[entry]); } } } /* 3. Set up a Struct Matrix */ { int nentries = 5; int nvalues = nentries * n * n; double *values; int stencil_indices[5]; /* Create an empty matrix object */ HYPRE_StructMatrixCreate(MPI_COMM_WORLD, grid, stencil, &A); /* Indicate that the matrix coefficients are ready to be set */ HYPRE_StructMatrixInitialize(A); values = (double*) calloc(nvalues, sizeof(double)); for (j = 0; j < nentries; j++) { stencil_indices[j] = j; } /* Set the standard stencil at each grid point, we will fix the boundaries later */ for (i = 0; i < nvalues; i += nentries) { values[i] = 4.0; for (j = 1; j < nentries; j++) { values[i + j] = -1.0; } } HYPRE_StructMatrixSetBoxValues(A, ilower, iupper, nentries, stencil_indices, values); free(values); } /* 4. Incorporate the zero boundary conditions: go along each edge of the domain and set the stencil entry that reaches to the boundary to zero.*/ { int bc_ilower[2]; int bc_iupper[2]; int nentries = 1; int nvalues = nentries * n; /* number of stencil entries times the length of one side of my grid box */ double *values; int stencil_indices[1]; values = (double*) calloc(nvalues, sizeof(double)); for (j = 0; j < nvalues; j++) { values[j] = 0.0; } /* Recall: pi and pj describe position in the processor grid */ if (pj == 0) { /* Bottom row of grid points */ bc_ilower[0] = pi * n; bc_ilower[1] = pj * n; bc_iupper[0] = bc_ilower[0] + n - 1; bc_iupper[1] = bc_ilower[1]; stencil_indices[0] = 3; HYPRE_StructMatrixSetBoxValues(A, bc_ilower, bc_iupper, nentries, stencil_indices, values); } if (pj == N - 1) { /* upper row of grid points */ bc_ilower[0] = pi * n; bc_ilower[1] = pj * n + n - 1; bc_iupper[0] = bc_ilower[0] + n - 1; bc_iupper[1] = bc_ilower[1]; stencil_indices[0] = 4; HYPRE_StructMatrixSetBoxValues(A, bc_ilower, bc_iupper, nentries, stencil_indices, values); } if (pi == 0) { /* Left row of grid points */ bc_ilower[0] = pi * n; bc_ilower[1] = pj * n; bc_iupper[0] = bc_ilower[0]; bc_iupper[1] = bc_ilower[1] + n - 1; stencil_indices[0] = 1; HYPRE_StructMatrixSetBoxValues(A, bc_ilower, bc_iupper, nentries, stencil_indices, values); } if (pi == N - 1) { /* Right row of grid points */ bc_ilower[0] = pi * n + n - 1; bc_ilower[1] = pj * n; bc_iupper[0] = bc_ilower[0]; bc_iupper[1] = bc_ilower[1] + n - 1; stencil_indices[0] = 2; HYPRE_StructMatrixSetBoxValues(A, bc_ilower, bc_iupper, nentries, stencil_indices, values); } free(values); } /* This is a collective call finalizing the matrix assembly. The matrix is now ``ready to be used'' */ HYPRE_StructMatrixAssemble(A); /* 5. Set up Struct Vectors for b and x */ { int nvalues = n * n; double *values; values = (double*) calloc(nvalues, sizeof(double)); /* Create an empty vector object */ HYPRE_StructVectorCreate(MPI_COMM_WORLD, grid, &b); HYPRE_StructVectorCreate(MPI_COMM_WORLD, grid, &x); /* Indicate that the vector coefficients are ready to be set */ HYPRE_StructVectorInitialize(b); HYPRE_StructVectorInitialize(x); /* Set the values */ for (i = 0; i < nvalues; i ++) { values[i] = h2; } HYPRE_StructVectorSetBoxValues(b, ilower, iupper, values); for (i = 0; i < nvalues; i ++) { values[i] = 0.0; } HYPRE_StructVectorSetBoxValues(x, ilower, iupper, values); free(values); /* This is a collective call finalizing the vector assembly. The vector is now ``ready to be used'' */ HYPRE_StructVectorAssemble(b); HYPRE_StructVectorAssemble(x); } /* 6. Set up and use a struct solver (Solver options can be found in the Reference Manual.) */ if (solver_id == 0) { HYPRE_StructPCGCreate(MPI_COMM_WORLD, &solver); HYPRE_StructPCGSetMaxIter(solver, 50 ); HYPRE_StructPCGSetTol(solver, 1.0e-06 ); HYPRE_StructPCGSetTwoNorm(solver, 1 ); HYPRE_StructPCGSetRelChange(solver, 0 ); HYPRE_StructPCGSetPrintLevel(solver, 2 ); /* print each CG iteration */ HYPRE_StructPCGSetLogging(solver, 1); /* Use symmetric SMG as preconditioner */ HYPRE_StructSMGCreate(MPI_COMM_WORLD, &precond); HYPRE_StructSMGSetMemoryUse(precond, 0); HYPRE_StructSMGSetMaxIter(precond, 1); HYPRE_StructSMGSetTol(precond, 0.0); HYPRE_StructSMGSetZeroGuess(precond); HYPRE_StructSMGSetNumPreRelax(precond, 1); HYPRE_StructSMGSetNumPostRelax(precond, 1); /* Set the preconditioner and solve */ HYPRE_StructPCGSetPrecond(solver, HYPRE_StructSMGSolve, HYPRE_StructSMGSetup, precond); HYPRE_StructPCGSetup(solver, A, b, x); HYPRE_StructPCGSolve(solver, A, b, x); /* Get some info on the run */ HYPRE_StructPCGGetNumIterations(solver, &num_iterations); HYPRE_StructPCGGetFinalRelativeResidualNorm(solver, &final_res_norm); /* Clean up */ HYPRE_StructPCGDestroy(solver); HYPRE_StructSMGDestroy(precond); } if (solver_id == 1) { HYPRE_StructSMGCreate(MPI_COMM_WORLD, &solver); HYPRE_StructSMGSetMemoryUse(solver, 0); HYPRE_StructSMGSetMaxIter(solver, 50); HYPRE_StructSMGSetTol(solver, 1.0e-06); HYPRE_StructSMGSetRelChange(solver, 0); HYPRE_StructSMGSetNumPreRelax(solver, n_pre); HYPRE_StructSMGSetNumPostRelax(solver, n_post); /* Logging must be on to get iterations and residual norm info below */ HYPRE_StructSMGSetLogging(solver, 1); /* Setup and solve */ HYPRE_StructSMGSetup(solver, A, b, x); HYPRE_StructSMGSolve(solver, A, b, x); /* Get some info on the run */ HYPRE_StructSMGGetNumIterations(solver, &num_iterations); HYPRE_StructSMGGetFinalRelativeResidualNorm(solver, &final_res_norm); /* Clean up */ HYPRE_StructSMGDestroy(solver); } /* Save the solution for GLVis visualization, see vis/glvis-ex3.sh */ if (vis) { #ifdef HYPRE_EXVIS FILE *file; char filename[255]; int k, nvalues = n * n; double *values = (double*) calloc(nvalues, sizeof(double)); /* get the local solution */ HYPRE_StructVectorGetBoxValues(x, ilower, iupper, values); sprintf(filename, "%s.%06d", "vis/ex3.sol", myid); if ((file = fopen(filename, "w")) == NULL) { printf("Error: can't open output file %s\n", filename); MPI_Finalize(); exit(1); } /* save solution with global unknown numbers */ k = 0; for (j = 0; j < n; j++) for (i = 0; i < n; i++) { fprintf(file, "%06d %.14e\n", pj * N * n * n + pi * n + j * N * n + i, values[k++]); } fflush(file); fclose(file); free(values); /* save global finite element mesh */ if (myid == 0) { GLVis_PrintGlobalSquareMesh("vis/ex3.mesh", N * n - 1); } #endif } if (myid == 0) { printf("\n"); printf("Iterations = %d\n", num_iterations); printf("Final Relative Residual Norm = %g\n", final_res_norm); printf("\n"); } /* Free memory */ HYPRE_StructGridDestroy(grid); HYPRE_StructStencilDestroy(stencil); HYPRE_StructMatrixDestroy(A); HYPRE_StructVectorDestroy(b); HYPRE_StructVectorDestroy(x); /* Finalize HYPRE */ HYPRE_Finalize(); /* Finalize MPI */ MPI_Finalize(); return (0); } hypre-2.33.0/src/examples/ex4.c000066400000000000000000001126401477326011500162110ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /* Example 4 Interface: Structured interface (Struct) Compile with: make ex4 Sample run: mpirun -np 16 ex4 -n 33 -solver 10 -K 3 -B 0 -C 1 -U0 2 -F 4 To see options: ex4 -help Description: This example differs from the previous structured example (Example 3) in that a more sophisticated stencil and boundary conditions are implemented. The method illustrated here to implement the boundary conditions is much more general than that in the previous example. Also symmetric storage is utilized when applicable. This code solves the convection-reaction-diffusion problem div (-K grad u + B u) + C u = F in the unit square with boundary condition u = U0. The domain is split into N x N processor grid. Thus, the given number of processors should be a perfect square. Each processor has a n x n grid, with nodes connected by a 5-point stencil. Note that the struct interface assumes a cell-centered grid, and, therefore, the nodes are not shared. To incorporate the boundary conditions, we do the following: Let x_i and x_b be the interior and boundary parts of the solution vector x. If we split the matrix A as A = [A_ii A_ib; A_bi A_bb], then we solve [A_ii 0; 0 I] [x_i ; x_b] = [b_i - A_ib u_0; u_0]. Note that this differs from the previous example in that we are actually solving for the boundary conditions (so they may not be exact as in ex3, where we only solved for the interior). This approach is useful for more general types of b.c. A number of solvers are available. More information can be found in the Solvers and Preconditioners chapter of the User's Manual. We recommend viewing examples 1, 2, and 3 before viewing this example. */ #include #include #include #include #include "HYPRE_krylov.h" #include "HYPRE_struct_ls.h" #include "ex.h" #ifdef M_PI #define PI M_PI #else #define PI 3.14159265358979 #endif #ifdef HYPRE_EXVIS #include "vis.c" #endif /* Macro to evaluate a function F in the grid point (i,j) */ #define Eval(F,i,j) (F( (ilower[0]+(i))*h, (ilower[1]+(j))*h )) #define bcEval(F,i,j) (F( (bc_ilower[0]+(i))*h, (bc_ilower[1]+(j))*h )) int optionK, optionB, optionC, optionU0, optionF; /* Diffusion coefficient */ double K(double x, double y) { switch (optionK) { case 0: return 1.0; case 1: return x * x + exp(y); case 2: if ((fabs(x - 0.5) < 0.25) && (fabs(y - 0.5) < 0.25)) { return 100.0; } else { return 1.0; } case 3: if (((x - 0.5) * (x - 0.5) + (y - 0.5) * (y - 0.5)) < 0.0625) { return 10.0; } else { return 1.0; } default: return 1.0; } } /* Convection vector, first component */ double B1(double x, double y) { switch (optionB) { case 0: return 0.0; case 1: return -0.1; case 2: return 0.25; case 3: return 1.0; default: return 0.0; } } /* Convection vector, second component */ double B2(double x, double y) { switch (optionB) { case 0: return 0.0; case 1: return 0.1; case 2: return -0.25; case 3: return 1.0; default: return 0.0; } } /* Reaction coefficient */ double C(double x, double y) { switch (optionC) { case 0: return 0.0; case 1: return 10.0; case 2: return 100.0; default: return 0.0; } } /* Boundary condition */ double U0(double x, double y) { switch (optionU0) { case 0: return 0.0; case 1: return (x + y) / 100; case 2: return (sin(5 * PI * x) + sin(5 * PI * y)) / 1000; default: return 0.0; } } /* Right-hand side */ double F(double x, double y) { switch (optionF) { case 0: return 1.0; case 1: return 0.0; case 2: return 2 * PI * PI * sin(PI * x) * sin(PI * y); case 3: if ((fabs(x - 0.5) < 0.25) && (fabs(y - 0.5) < 0.25)) { return -1.0; } else { return 1.0; } case 4: if (((x - 0.5) * (x - 0.5) + (y - 0.5) * (y - 0.5)) < 0.0625) { return -1.0; } else { return 1.0; } default: return 1.0; } } int main (int argc, char *argv[]) { int i, j, k; int myid, num_procs; int n, N, pi, pj; double h, h2; int ilower[2], iupper[2]; int solver_id; int n_pre, n_post; int rap, relax, skip, sym; double mytime = 0.0; double walltime = 0.0; int num_iterations; double final_res_norm; int vis; HYPRE_StructGrid grid; HYPRE_StructStencil stencil; HYPRE_StructMatrix A; HYPRE_StructVector b; HYPRE_StructVector x; HYPRE_StructSolver solver; HYPRE_StructSolver precond; /* Initialize MPI */ MPI_Init(&argc, &argv); MPI_Comm_rank(MPI_COMM_WORLD, &myid); MPI_Comm_size(MPI_COMM_WORLD, &num_procs); /* Initialize HYPRE */ HYPRE_Initialize(); /* Print GPU info */ /* HYPRE_PrintDeviceInfo(); */ /* Set default parameters */ n = 33; optionK = 0; optionB = 0; optionC = 0; optionU0 = 0; optionF = 0; solver_id = 10; n_pre = 1; n_post = 1; rap = 0; relax = 1; skip = 0; sym = 0; vis = 0; /* Parse command line */ { int arg_index = 0; int print_usage = 0; while (arg_index < argc) { if ( strcmp(argv[arg_index], "-n") == 0 ) { arg_index++; n = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-K") == 0 ) { arg_index++; optionK = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-B") == 0 ) { arg_index++; optionB = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-C") == 0 ) { arg_index++; optionC = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-U0") == 0 ) { arg_index++; optionU0 = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-F") == 0 ) { arg_index++; optionF = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-solver") == 0 ) { arg_index++; solver_id = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-v") == 0 ) { arg_index++; n_pre = atoi(argv[arg_index++]); n_post = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-rap") == 0 ) { arg_index++; rap = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-relax") == 0 ) { arg_index++; relax = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-skip") == 0 ) { arg_index++; skip = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-sym") == 0 ) { arg_index++; sym = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-vis") == 0 ) { arg_index++; vis = 1; } else if ( strcmp(argv[arg_index], "-help") == 0 ) { print_usage = 1; break; } else { arg_index++; } } if ((print_usage) && (myid == 0)) { printf("\n"); printf("Usage: %s []\n", argv[0]); printf("\n"); printf(" -n : problem size per processor (default: 8)\n"); printf(" -K : choice for the diffusion coefficient (default: 1)\n"); printf(" -B : choice for the convection vector (default: 0)\n"); printf(" -C : choice for the reaction coefficient (default: 0)\n"); printf(" -U0 : choice for the boundary condition (default: 0)\n"); printf(" -F : choice for the right-hand side (default: 1) \n"); printf(" -solver : solver ID\n"); printf(" 0 - SMG \n"); printf(" 1 - PFMG\n"); printf(" 10 - CG with SMG precond (default)\n"); printf(" 11 - CG with PFMG precond\n"); printf(" 17 - CG with 2-step Jacobi\n"); printf(" 18 - CG with diagonal scaling\n"); printf(" 19 - CG\n"); printf(" 30 - GMRES with SMG precond\n"); printf(" 31 - GMRES with PFMG precond\n"); printf(" 37 - GMRES with 2-step Jacobi\n"); printf(" 38 - GMRES with diagonal scaling\n"); printf(" 39 - GMRES\n"); printf(" -v : number of pre and post relaxations\n"); printf(" -rap : coarse grid operator type\n"); printf(" 0 - Galerkin (default)\n"); printf(" 1 - non-Galerkin ParFlow operators\n"); printf(" 2 - Galerkin, general operators\n"); printf(" -relax : relaxation type\n"); printf(" 0 - Jacobi\n"); printf(" 1 - Weighted Jacobi (default)\n"); printf(" 2 - R/B Gauss-Seidel\n"); printf(" 3 - R/B Gauss-Seidel (nonsymmetric)\n"); printf(" -skip : skip levels in PFMG (0 or 1)\n"); printf(" -sym : symmetric storage (1) or not (0)\n"); printf(" -vis : save the solution for GLVis visualization\n"); printf("\n"); } if (print_usage) { MPI_Finalize(); return (0); } } /* Convection produces non-symmetric matrices */ if (optionB && sym) { optionB = 0; } /* Figure out the processor grid (N x N). The local problem size is indicated by n (n x n). pi and pj indicate position in the processor grid. */ N = sqrt(num_procs); h = 1.0 / (N * n - 1); h2 = h * h; pj = myid / N; pi = myid - pj * N; /* Define the nodes owned by the current processor (each processor's piece of the global grid) */ ilower[0] = pi * n; ilower[1] = pj * n; iupper[0] = ilower[0] + n - 1; iupper[1] = ilower[1] + n - 1; /* 1. Set up a grid */ { /* Create an empty 2D grid object */ HYPRE_StructGridCreate(MPI_COMM_WORLD, 2, &grid); /* Add a new box to the grid */ HYPRE_StructGridSetExtents(grid, ilower, iupper); /* This is a collective call finalizing the grid assembly. The grid is now ``ready to be used'' */ HYPRE_StructGridAssemble(grid); } /* 2. Define the discretization stencil */ if (sym == 0) { /* Define the geometry of the stencil */ int offsets[5][2] = {{0, 0}, {-1, 0}, {1, 0}, {0, -1}, {0, 1}}; /* Create an empty 2D, 5-pt stencil object */ HYPRE_StructStencilCreate(2, 5, &stencil); /* Assign stencil entries */ for (i = 0; i < 5; i++) { HYPRE_StructStencilSetElement(stencil, i, offsets[i]); } } else /* Symmetric storage */ { /* Define the geometry of the stencil */ int offsets[3][2] = {{0, 0}, {1, 0}, {0, 1}}; /* Create an empty 2D, 3-pt stencil object */ HYPRE_StructStencilCreate(2, 3, &stencil); /* Assign stencil entries */ for (i = 0; i < 3; i++) { HYPRE_StructStencilSetElement(stencil, i, offsets[i]); } } /* 3. Set up Struct Vectors for b and x */ { double *values; /* Create an empty vector object */ HYPRE_StructVectorCreate(MPI_COMM_WORLD, grid, &b); HYPRE_StructVectorCreate(MPI_COMM_WORLD, grid, &x); /* Indicate that the vector coefficients are ready to be set */ HYPRE_StructVectorInitialize(b); HYPRE_StructVectorInitialize(x); values = (double*) calloc((n * n), sizeof(double)); /* Set the values of b in left-to-right, bottom-to-top order */ for (k = 0, j = 0; j < n; j++) for (i = 0; i < n; i++, k++) { values[k] = h2 * Eval(F, i, j); } HYPRE_StructVectorSetBoxValues(b, ilower, iupper, values); /* Set x = 0 */ for (i = 0; i < (n * n); i ++) { values[i] = 0.0; } HYPRE_StructVectorSetBoxValues(x, ilower, iupper, values); free(values); /* Assembling is postponed since the vectors will be further modified */ } /* 4. Set up a Struct Matrix */ { /* Create an empty matrix object */ HYPRE_StructMatrixCreate(MPI_COMM_WORLD, grid, stencil, &A); /* Use symmetric storage? */ HYPRE_StructMatrixSetSymmetric(A, sym); /* Indicate that the matrix coefficients are ready to be set */ HYPRE_StructMatrixInitialize(A); /* Set the stencil values in the interior. Here we set the values at every node. We will modify the boundary nodes later. */ if (sym == 0) { int stencil_indices[5] = {0, 1, 2, 3, 4}; /* labels correspond to the offsets */ double *values; values = (double*) calloc(5 * (n * n), sizeof(double)); /* The order is left-to-right, bottom-to-top */ for (k = 0, j = 0; j < n; j++) for (i = 0; i < n; i++, k += 5) { values[k + 1] = - Eval(K, i - 0.5, j) - Eval(B1, i - 0.5, j); values[k + 2] = - Eval(K, i + 0.5, j) + Eval(B1, i + 0.5, j); values[k + 3] = - Eval(K, i, j - 0.5) - Eval(B2, i, j - 0.5); values[k + 4] = - Eval(K, i, j + 0.5) + Eval(B2, i, j + 0.5); values[k] = h2 * Eval(C, i, j) + Eval(K, i - 0.5, j) + Eval(K, i + 0.5, j) + Eval(K, i, j - 0.5) + Eval(K, i, j + 0.5) - Eval(B1, i - 0.5, j) + Eval(B1, i + 0.5, j) - Eval(B2, i, j - 0.5) + Eval(B2, i, j + 0.5); } HYPRE_StructMatrixSetBoxValues(A, ilower, iupper, 5, stencil_indices, values); free(values); } else /* Symmetric storage */ { int stencil_indices[3] = {0, 1, 2}; double *values; values = (double*) calloc(3 * (n * n), sizeof(double)); /* The order is left-to-right, bottom-to-top */ for (k = 0, j = 0; j < n; j++) for (i = 0; i < n; i++, k += 3) { values[k + 1] = - Eval(K, i + 0.5, j); values[k + 2] = - Eval(K, i, j + 0.5); values[k] = h2 * Eval(C, i, j) + Eval(K, i + 0.5, j) + Eval(K, i, j + 0.5) + Eval(K, i - 0.5, j) + Eval(K, i, j - 0.5); } HYPRE_StructMatrixSetBoxValues(A, ilower, iupper, 3, stencil_indices, values); free(values); } } /* 5. Set the boundary conditions, while eliminating the coefficients reaching ouside of the domain boundary. We must modify the matrix stencil and the corresponding rhs entries. */ { int bc_ilower[2]; int bc_iupper[2]; int stencil_indices[5] = {0, 1, 2, 3, 4}; double *values, *bvalues; int nentries; if (sym == 0) { nentries = 5; } else { nentries = 3; } values = (double*) calloc(nentries * n, sizeof(double)); bvalues = (double*) calloc(n, sizeof(double)); /* The stencil at the boundary nodes is 1-0-0-0-0. Because we have I x_b = u_0; */ for (i = 0; i < nentries * n; i += nentries) { values[i] = 1.0; for (j = 1; j < nentries; j++) { values[i + j] = 0.0; } } /* Processors at y = 0 */ if (pj == 0) { bc_ilower[0] = pi * n; bc_ilower[1] = pj * n; bc_iupper[0] = bc_ilower[0] + n - 1; bc_iupper[1] = bc_ilower[1]; /* Modify the matrix */ HYPRE_StructMatrixSetBoxValues(A, bc_ilower, bc_iupper, nentries, stencil_indices, values); /* Put the boundary conditions in b */ for (i = 0; i < n; i++) { bvalues[i] = bcEval(U0, i, 0); } HYPRE_StructVectorSetBoxValues(b, bc_ilower, bc_iupper, bvalues); } /* Processors at y = 1 */ if (pj == N - 1) { bc_ilower[0] = pi * n; bc_ilower[1] = pj * n + n - 1; bc_iupper[0] = bc_ilower[0] + n - 1; bc_iupper[1] = bc_ilower[1]; /* Modify the matrix */ HYPRE_StructMatrixSetBoxValues(A, bc_ilower, bc_iupper, nentries, stencil_indices, values); /* Put the boundary conditions in b */ for (i = 0; i < n; i++) { bvalues[i] = bcEval(U0, i, 0); } HYPRE_StructVectorSetBoxValues(b, bc_ilower, bc_iupper, bvalues); } /* Processors at x = 0 */ if (pi == 0) { bc_ilower[0] = pi * n; bc_ilower[1] = pj * n; bc_iupper[0] = bc_ilower[0]; bc_iupper[1] = bc_ilower[1] + n - 1; /* Modify the matrix */ HYPRE_StructMatrixSetBoxValues(A, bc_ilower, bc_iupper, nentries, stencil_indices, values); /* Put the boundary conditions in b */ for (j = 0; j < n; j++) { bvalues[j] = bcEval(U0, 0, j); } HYPRE_StructVectorSetBoxValues(b, bc_ilower, bc_iupper, bvalues); } /* Processors at x = 1 */ if (pi == N - 1) { bc_ilower[0] = pi * n + n - 1; bc_ilower[1] = pj * n; bc_iupper[0] = bc_ilower[0]; bc_iupper[1] = bc_ilower[1] + n - 1; /* Modify the matrix */ HYPRE_StructMatrixSetBoxValues(A, bc_ilower, bc_iupper, nentries, stencil_indices, values); /* Put the boundary conditions in b */ for (j = 0; j < n; j++) { bvalues[j] = bcEval(U0, 0, j); } HYPRE_StructVectorSetBoxValues(b, bc_ilower, bc_iupper, bvalues); } /* Recall that the system we are solving is: [A_ii 0; 0 I] [x_i ; x_b] = [b_i - A_ib u_0; u_0]. This requires removing the connections between the interior and boundary nodes that we have set up when we set the 5pt stencil at each node. We adjust for removing these connections by appropriately modifying the rhs. For the symm ordering scheme, just do the top and right boundary */ /* Processors at y = 0, neighbors of boundary nodes */ if (pj == 0) { bc_ilower[0] = pi * n; bc_ilower[1] = pj * n + 1; bc_iupper[0] = bc_ilower[0] + n - 1; bc_iupper[1] = bc_ilower[1]; stencil_indices[0] = 3; /* Modify the matrix */ for (i = 0; i < n; i++) { bvalues[i] = 0.0; } if (sym == 0) HYPRE_StructMatrixSetBoxValues(A, bc_ilower, bc_iupper, 1, stencil_indices, bvalues); /* Eliminate the boundary conditions in b */ for (i = 0; i < n; i++) { bvalues[i] = bcEval(U0, i, -1) * (bcEval(K, i, -0.5) + bcEval(B2, i, -0.5)); } if (pi == 0) { bvalues[0] = 0.0; } if (pi == N - 1) { bvalues[n - 1] = 0.0; } /* Note the use of AddToBoxValues (because we have already set values at these nodes) */ HYPRE_StructVectorAddToBoxValues(b, bc_ilower, bc_iupper, bvalues); } /* Processors at x = 0, neighbors of boundary nodes */ if (pi == 0) { bc_ilower[0] = pi * n + 1; bc_ilower[1] = pj * n; bc_iupper[0] = bc_ilower[0]; bc_iupper[1] = bc_ilower[1] + n - 1; stencil_indices[0] = 1; /* Modify the matrix */ for (j = 0; j < n; j++) { bvalues[j] = 0.0; } if (sym == 0) HYPRE_StructMatrixSetBoxValues(A, bc_ilower, bc_iupper, 1, stencil_indices, bvalues); /* Eliminate the boundary conditions in b */ for (j = 0; j < n; j++) { bvalues[j] = bcEval(U0, -1, j) * (bcEval(K, -0.5, j) + bcEval(B1, -0.5, j)); } if (pj == 0) { bvalues[0] = 0.0; } if (pj == N - 1) { bvalues[n - 1] = 0.0; } HYPRE_StructVectorAddToBoxValues(b, bc_ilower, bc_iupper, bvalues); } /* Processors at y = 1, neighbors of boundary nodes */ if (pj == N - 1) { bc_ilower[0] = pi * n; bc_ilower[1] = pj * n + (n - 1) - 1; bc_iupper[0] = bc_ilower[0] + n - 1; bc_iupper[1] = bc_ilower[1]; if (sym == 0) { stencil_indices[0] = 4; } else { stencil_indices[0] = 2; } /* Modify the matrix */ for (i = 0; i < n; i++) { bvalues[i] = 0.0; } HYPRE_StructMatrixSetBoxValues(A, bc_ilower, bc_iupper, 1, stencil_indices, bvalues); /* Eliminate the boundary conditions in b */ for (i = 0; i < n; i++) { bvalues[i] = bcEval(U0, i, 1) * (bcEval(K, i, 0.5) + bcEval(B2, i, 0.5)); } if (pi == 0) { bvalues[0] = 0.0; } if (pi == N - 1) { bvalues[n - 1] = 0.0; } HYPRE_StructVectorAddToBoxValues(b, bc_ilower, bc_iupper, bvalues); } /* Processors at x = 1, neighbors of boundary nodes */ if (pi == N - 1) { bc_ilower[0] = pi * n + (n - 1) - 1; bc_ilower[1] = pj * n; bc_iupper[0] = bc_ilower[0]; bc_iupper[1] = bc_ilower[1] + n - 1; if (sym == 0) { stencil_indices[0] = 2; } else { stencil_indices[0] = 1; } /* Modify the matrix */ for (j = 0; j < n; j++) { bvalues[j] = 0.0; } HYPRE_StructMatrixSetBoxValues(A, bc_ilower, bc_iupper, 1, stencil_indices, bvalues); /* Eliminate the boundary conditions in b */ for (j = 0; j < n; j++) { bvalues[j] = bcEval(U0, 1, j) * (bcEval(K, 0.5, j) + bcEval(B1, 0.5, j)); } if (pj == 0) { bvalues[0] = 0.0; } if (pj == N - 1) { bvalues[n - 1] = 0.0; } HYPRE_StructVectorAddToBoxValues(b, bc_ilower, bc_iupper, bvalues); } free(values); free(bvalues); } /* Finalize the vector and matrix assembly */ HYPRE_StructMatrixAssemble(A); HYPRE_StructVectorAssemble(b); HYPRE_StructVectorAssemble(x); /* 6. Set up and use a solver */ if (solver_id == 0) /* SMG */ { /* Start timing */ mytime -= MPI_Wtime(); /* Options and setup */ HYPRE_StructSMGCreate(MPI_COMM_WORLD, &solver); HYPRE_StructSMGSetMemoryUse(solver, 0); HYPRE_StructSMGSetMaxIter(solver, 50); HYPRE_StructSMGSetTol(solver, 1.0e-06); HYPRE_StructSMGSetRelChange(solver, 0); HYPRE_StructSMGSetNumPreRelax(solver, n_pre); HYPRE_StructSMGSetNumPostRelax(solver, n_post); HYPRE_StructSMGSetPrintLevel(solver, 1); HYPRE_StructSMGSetLogging(solver, 1); HYPRE_StructSMGSetup(solver, A, b, x); /* Finalize current timing */ mytime += MPI_Wtime(); MPI_Allreduce(&mytime, &walltime, 1, MPI_DOUBLE, MPI_MAX, MPI_COMM_WORLD); if (myid == 0) { printf("\nSMG Setup time = %f seconds\n\n", walltime); } /* Start timing again */ mytime -= MPI_Wtime(); /* Solve */ HYPRE_StructSMGSolve(solver, A, b, x); /* Finalize current timing */ mytime += MPI_Wtime(); MPI_Allreduce(&mytime, &walltime, 1, MPI_DOUBLE, MPI_MAX, MPI_COMM_WORLD); if (myid == 0) { printf("\nSMG Solve time = %f seconds\n\n", walltime); } /* Get info and release memory */ HYPRE_StructSMGGetNumIterations(solver, &num_iterations); HYPRE_StructSMGGetFinalRelativeResidualNorm(solver, &final_res_norm); HYPRE_StructSMGDestroy(solver); } if (solver_id == 1) /* PFMG */ { /* Start timing */ mytime -= MPI_Wtime(); /* Options and setup */ HYPRE_StructPFMGCreate(MPI_COMM_WORLD, &solver); HYPRE_StructPFMGSetMaxIter(solver, 50); HYPRE_StructPFMGSetTol(solver, 1.0e-06); HYPRE_StructPFMGSetRelChange(solver, 0); HYPRE_StructPFMGSetRAPType(solver, rap); HYPRE_StructPFMGSetRelaxType(solver, relax); HYPRE_StructPFMGSetNumPreRelax(solver, n_pre); HYPRE_StructPFMGSetNumPostRelax(solver, n_post); HYPRE_StructPFMGSetSkipRelax(solver, skip); HYPRE_StructPFMGSetPrintLevel(solver, 1); HYPRE_StructPFMGSetLogging(solver, 1); HYPRE_StructPFMGSetup(solver, A, b, x); /* Finalize current timing */ mytime += MPI_Wtime(); MPI_Allreduce(&mytime, &walltime, 1, MPI_DOUBLE, MPI_MAX, MPI_COMM_WORLD); if (myid == 0) { printf("\nPFMG Setup time = %f seconds\n\n", walltime); } /* Start timing again */ mytime -= MPI_Wtime(); /* Solve */ HYPRE_StructPFMGSolve(solver, A, b, x); /* Finalize current timing */ mytime += MPI_Wtime(); MPI_Allreduce(&mytime, &walltime, 1, MPI_DOUBLE, MPI_MAX, MPI_COMM_WORLD); if (myid == 0) { printf("\nPFMG Solve time = %f seconds\n\n", walltime); } /* Get info and release memory */ HYPRE_StructPFMGGetNumIterations(solver, &num_iterations); HYPRE_StructPFMGGetFinalRelativeResidualNorm(solver, &final_res_norm); HYPRE_StructPFMGDestroy(solver); } /* Preconditioned CG */ if ((solver_id > 9) && (solver_id < 20)) { mytime -= MPI_Wtime(); HYPRE_StructPCGCreate(MPI_COMM_WORLD, &solver); HYPRE_StructPCGSetMaxIter(solver, 200 ); HYPRE_StructPCGSetTol(solver, 1.0e-06 ); HYPRE_StructPCGSetTwoNorm(solver, 1 ); HYPRE_StructPCGSetRelChange(solver, 0 ); HYPRE_StructPCGSetPrintLevel(solver, 2 ); if (solver_id == 10) { /* use symmetric SMG as preconditioner */ HYPRE_StructSMGCreate(MPI_COMM_WORLD, &precond); HYPRE_StructSMGSetMemoryUse(precond, 0); HYPRE_StructSMGSetMaxIter(precond, 1); HYPRE_StructSMGSetTol(precond, 0.0); HYPRE_StructSMGSetZeroGuess(precond); HYPRE_StructSMGSetNumPreRelax(precond, n_pre); HYPRE_StructSMGSetNumPostRelax(precond, n_post); HYPRE_StructSMGSetPrintLevel(precond, 0); HYPRE_StructSMGSetLogging(precond, 0); HYPRE_StructPCGSetPrecond(solver, HYPRE_StructSMGSolve, HYPRE_StructSMGSetup, precond); } else if (solver_id == 11) { /* use symmetric PFMG as preconditioner */ HYPRE_StructPFMGCreate(MPI_COMM_WORLD, &precond); HYPRE_StructPFMGSetMaxIter(precond, 1); HYPRE_StructPFMGSetTol(precond, 0.0); HYPRE_StructPFMGSetZeroGuess(precond); HYPRE_StructPFMGSetRAPType(precond, rap); HYPRE_StructPFMGSetRelaxType(precond, relax); HYPRE_StructPFMGSetNumPreRelax(precond, n_pre); HYPRE_StructPFMGSetNumPostRelax(precond, n_post); HYPRE_StructPFMGSetSkipRelax(precond, skip); HYPRE_StructPFMGSetPrintLevel(precond, 0); HYPRE_StructPFMGSetLogging(precond, 0); HYPRE_StructPCGSetPrecond(solver, HYPRE_StructPFMGSolve, HYPRE_StructPFMGSetup, precond); } else if (solver_id == 17) { /* use two-step Jacobi as preconditioner */ HYPRE_StructJacobiCreate(MPI_COMM_WORLD, &precond); HYPRE_StructJacobiSetMaxIter(precond, 2); HYPRE_StructJacobiSetTol(precond, 0.0); HYPRE_StructJacobiSetZeroGuess(precond); HYPRE_StructPCGSetPrecond( solver, HYPRE_StructJacobiSolve, HYPRE_StructJacobiSetup, precond); } else if (solver_id == 18) { /* use diagonal scaling as preconditioner */ precond = NULL; HYPRE_StructPCGSetPrecond(solver, HYPRE_StructDiagScale, HYPRE_StructDiagScaleSetup, precond); } /* PCG Setup */ HYPRE_StructPCGSetup(solver, A, b, x ); mytime += MPI_Wtime(); MPI_Allreduce(&mytime, &walltime, 1, MPI_DOUBLE, MPI_MAX, MPI_COMM_WORLD); if (myid == 0) { printf("\nPCG Setup time = %f seconds\n\n", walltime); } mytime -= MPI_Wtime(); /* PCG Solve */ HYPRE_StructPCGSolve(solver, A, b, x); mytime += MPI_Wtime(); MPI_Allreduce(&mytime, &walltime, 1, MPI_DOUBLE, MPI_MAX, MPI_COMM_WORLD); if (myid == 0) { printf("\nPCG Solve time = %f seconds\n\n", walltime); } /* Get info and release memory */ HYPRE_StructPCGGetNumIterations( solver, &num_iterations ); HYPRE_StructPCGGetFinalRelativeResidualNorm( solver, &final_res_norm ); HYPRE_StructPCGDestroy(solver); if (solver_id == 10) { HYPRE_StructSMGDestroy(precond); } else if (solver_id == 11 ) { HYPRE_StructPFMGDestroy(precond); } else if (solver_id == 17) { HYPRE_StructJacobiDestroy(precond); } } /* Preconditioned GMRES */ if ((solver_id > 29) && (solver_id < 40)) { mytime -= MPI_Wtime(); HYPRE_StructGMRESCreate(MPI_COMM_WORLD, &solver); /* Note that GMRES can be used with all the interfaces - not just the struct. So here we demonstrate the more generic GMRES interface functions. Since we have chosen a struct solver then we must type cast to the more generic HYPRE_Solver when setting options with these generic functions. Note that one could declare the solver to be type HYPRE_Solver, and then the casting would not be necessary.*/ HYPRE_GMRESSetMaxIter((HYPRE_Solver) solver, 500 ); HYPRE_GMRESSetKDim((HYPRE_Solver) solver, 30); HYPRE_GMRESSetTol((HYPRE_Solver) solver, 1.0e-06 ); HYPRE_GMRESSetPrintLevel((HYPRE_Solver) solver, 2 ); HYPRE_GMRESSetLogging((HYPRE_Solver) solver, 1 ); if (solver_id == 30) { /* use symmetric SMG as preconditioner */ HYPRE_StructSMGCreate(MPI_COMM_WORLD, &precond); HYPRE_StructSMGSetMemoryUse(precond, 0); HYPRE_StructSMGSetMaxIter(precond, 1); HYPRE_StructSMGSetTol(precond, 0.0); HYPRE_StructSMGSetZeroGuess(precond); HYPRE_StructSMGSetNumPreRelax(precond, n_pre); HYPRE_StructSMGSetNumPostRelax(precond, n_post); HYPRE_StructSMGSetPrintLevel(precond, 0); HYPRE_StructSMGSetLogging(precond, 0); HYPRE_StructGMRESSetPrecond(solver, HYPRE_StructSMGSolve, HYPRE_StructSMGSetup, precond); } else if (solver_id == 31) { /* use symmetric PFMG as preconditioner */ HYPRE_StructPFMGCreate(MPI_COMM_WORLD, &precond); HYPRE_StructPFMGSetMaxIter(precond, 1); HYPRE_StructPFMGSetTol(precond, 0.0); HYPRE_StructPFMGSetZeroGuess(precond); HYPRE_StructPFMGSetRAPType(precond, rap); HYPRE_StructPFMGSetRelaxType(precond, relax); HYPRE_StructPFMGSetNumPreRelax(precond, n_pre); HYPRE_StructPFMGSetNumPostRelax(precond, n_post); HYPRE_StructPFMGSetSkipRelax(precond, skip); HYPRE_StructPFMGSetPrintLevel(precond, 0); HYPRE_StructPFMGSetLogging(precond, 0); HYPRE_StructGMRESSetPrecond( solver, HYPRE_StructPFMGSolve, HYPRE_StructPFMGSetup, precond); } else if (solver_id == 37) { /* use two-step Jacobi as preconditioner */ HYPRE_StructJacobiCreate(MPI_COMM_WORLD, &precond); HYPRE_StructJacobiSetMaxIter(precond, 2); HYPRE_StructJacobiSetTol(precond, 0.0); HYPRE_StructJacobiSetZeroGuess(precond); HYPRE_StructGMRESSetPrecond( solver, HYPRE_StructJacobiSolve, HYPRE_StructJacobiSetup, precond); } else if (solver_id == 38) { /* use diagonal scaling as preconditioner */ precond = NULL; HYPRE_StructGMRESSetPrecond( solver, HYPRE_StructDiagScale, HYPRE_StructDiagScaleSetup, precond); } /* GMRES Setup */ HYPRE_StructGMRESSetup(solver, A, b, x ); mytime += MPI_Wtime(); MPI_Allreduce(&mytime, &walltime, 1, MPI_DOUBLE, MPI_MAX, MPI_COMM_WORLD); if (myid == 0) { printf("\nGMRES Setup time = %f seconds\n\n", walltime); } mytime -= MPI_Wtime(); /* GMRES Solve */ HYPRE_StructGMRESSolve(solver, A, b, x); mytime += MPI_Wtime(); MPI_Allreduce(&mytime, &walltime, 1, MPI_DOUBLE, MPI_MAX, MPI_COMM_WORLD); if (myid == 0) { printf("\nGMRES Solve time = %f seconds\n\n", walltime); } /* Get info and release memory */ HYPRE_StructGMRESGetNumIterations(solver, &num_iterations); HYPRE_StructGMRESGetFinalRelativeResidualNorm(solver, &final_res_norm); HYPRE_StructGMRESDestroy(solver); if (solver_id == 30) { HYPRE_StructSMGDestroy(precond); } else if (solver_id == 31) { HYPRE_StructPFMGDestroy(precond); } else if (solver_id == 37) { HYPRE_StructJacobiDestroy(precond); } } /* Save the solution for GLVis visualization, see vis/glvis-ex4.sh */ if (vis) { #ifdef HYPRE_EXVIS FILE *file; char filename[255]; int nvalues = n * n; double *values = (double*) calloc(nvalues, sizeof(double)); /* get the local solution */ HYPRE_StructVectorGetBoxValues(x, ilower, iupper, values); sprintf(filename, "%s.%06d", "vis/ex4.sol", myid); if ((file = fopen(filename, "w")) == NULL) { printf("Error: can't open output file %s\n", filename); MPI_Finalize(); exit(1); } /* save solution with global unknown numbers */ k = 0; for (j = 0; j < n; j++) for (i = 0; i < n; i++) { fprintf(file, "%06d %.14e\n", pj * N * n * n + pi * n + j * N * n + i, values[k++]); } fflush(file); fclose(file); free(values); /* save global finite element mesh */ if (myid == 0) { GLVis_PrintGlobalSquareMesh("vis/ex4.mesh", N * n - 1); } #endif } if (myid == 0) { printf("\n"); printf("Iterations = %d\n", num_iterations); printf("Final Relative Residual Norm = %e\n", final_res_norm); printf("\n"); } /* Free memory */ HYPRE_StructGridDestroy(grid); HYPRE_StructStencilDestroy(stencil); HYPRE_StructMatrixDestroy(A); HYPRE_StructVectorDestroy(b); HYPRE_StructVectorDestroy(x); /* Finalize HYPRE */ HYPRE_Finalize(); /* Finalize MPI */ MPI_Finalize(); return (0); } hypre-2.33.0/src/examples/ex5.c000066400000000000000000000506401477326011500162130ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /* Example 5 Interface: Linear-Algebraic (IJ) Compile with: make ex5 Sample run: mpirun -np 4 ex5 Description: This example solves the 2-D Laplacian problem with zero boundary conditions on an n x n grid. The number of unknowns is N=n^2. The standard 5-point stencil is used, and we solve for the interior nodes only. This example solves the same problem as Example 3. Available solvers are AMG, PCG, and PCG with AMG or Parasails preconditioners. */ #include #include #include #include #include "HYPRE_krylov.h" #include "HYPRE.h" #include "HYPRE_parcsr_ls.h" #include "ex.h" #ifdef HYPRE_EXVIS #include "vis.c" #endif int hypre_FlexGMRESModifyPCAMGExample(void *precond_data, int iterations, double rel_residual_norm); #define my_min(a,b) (((a)<(b)) ? (a) : (b)) int main (int argc, char *argv[]) { int i; int myid, num_procs; int N, n; int ilower, iupper; int local_size, extra; int solver_id; int vis, print_system; double h, h2; HYPRE_IJMatrix A; HYPRE_ParCSRMatrix parcsr_A; HYPRE_IJVector b; HYPRE_ParVector par_b; HYPRE_IJVector x; HYPRE_ParVector par_x; HYPRE_Solver solver, precond; /* Initialize MPI */ MPI_Init(&argc, &argv); MPI_Comm_rank(MPI_COMM_WORLD, &myid); MPI_Comm_size(MPI_COMM_WORLD, &num_procs); /* Initialize HYPRE */ HYPRE_Initialize(); /* Print GPU info */ /* HYPRE_PrintDeviceInfo(); */ #if defined(HYPRE_USING_GPU) /* use vendor implementation for SpGEMM */ HYPRE_SetSpGemmUseVendor(0); #endif /* Default problem parameters */ n = 33; solver_id = 0; vis = 0; print_system = 0; /* Parse command line */ { int arg_index = 0; int print_usage = 0; while (arg_index < argc) { if ( strcmp(argv[arg_index], "-n") == 0 ) { arg_index++; n = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-solver") == 0 ) { arg_index++; solver_id = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-vis") == 0 ) { arg_index++; vis = 1; } else if ( strcmp(argv[arg_index], "-print_system") == 0 ) { arg_index++; print_system = 1; } else if ( strcmp(argv[arg_index], "-help") == 0 ) { print_usage = 1; break; } else { arg_index++; } } if ((print_usage) && (myid == 0)) { printf("\n"); printf("Usage: %s []\n", argv[0]); printf("\n"); printf(" -n : problem size in each direction (default: 33)\n"); printf(" -solver : solver ID\n"); printf(" 0 - AMG (default) \n"); printf(" 1 - AMG-PCG\n"); printf(" 8 - ParaSails-PCG\n"); printf(" 50 - PCG\n"); printf(" 61 - AMG-FlexGMRES\n"); printf(" -vis : save the solution for GLVis visualization\n"); printf(" -print_system : print the matrix and rhs\n"); printf("\n"); } if (print_usage) { MPI_Finalize(); return (0); } } /* Preliminaries: want at least one processor per row */ if (n * n < num_procs) { n = sqrt(num_procs) + 1; } N = n * n; /* global number of rows */ h = 1.0 / (n + 1); /* mesh size*/ h2 = h * h; /* Each processor knows only of its own rows - the range is denoted by ilower and upper. Here we partition the rows. We account for the fact that N may not divide evenly by the number of processors. */ local_size = N / num_procs; extra = N - local_size * num_procs; ilower = local_size * myid; ilower += my_min(myid, extra); iupper = local_size * (myid + 1); iupper += my_min(myid + 1, extra); iupper = iupper - 1; /* How many rows do I have? */ local_size = iupper - ilower + 1; /* Create the matrix. Note that this is a square matrix, so we indicate the row partition size twice (since number of rows = number of cols) */ HYPRE_IJMatrixCreate(MPI_COMM_WORLD, ilower, iupper, ilower, iupper, &A); /* Choose a parallel csr format storage (see the User's Manual) */ HYPRE_IJMatrixSetObjectType(A, HYPRE_PARCSR); /* Initialize before setting coefficients */ HYPRE_IJMatrixInitialize(A); /* Now go through my local rows and set the matrix entries. Each row has at most 5 entries. For example, if n=3: A = [M -I 0; -I M -I; 0 -I M] M = [4 -1 0; -1 4 -1; 0 -1 4] Note that here we are setting one row at a time, though one could set all the rows together (see the User's Manual). */ { int nnz; /* OK to use constant-length arrays for CPUs double values[5]; int cols[5]; */ double *values = (double *) malloc(5 * sizeof(double)); int *cols = (int *) malloc(5 * sizeof(int)); int *tmp = (int *) malloc(2 * sizeof(int)); for (i = ilower; i <= iupper; i++) { nnz = 0; /* The left identity block:position i-n */ if ((i - n) >= 0) { cols[nnz] = i - n; values[nnz] = -1.0; nnz++; } /* The left -1: position i-1 */ if (i % n) { cols[nnz] = i - 1; values[nnz] = -1.0; nnz++; } /* Set the diagonal: position i */ cols[nnz] = i; values[nnz] = 4.0; nnz++; /* The right -1: position i+1 */ if ((i + 1) % n) { cols[nnz] = i + 1; values[nnz] = -1.0; nnz++; } /* The right identity block:position i+n */ if ((i + n) < N) { cols[nnz] = i + n; values[nnz] = -1.0; nnz++; } /* Set the values for row i */ tmp[0] = nnz; tmp[1] = i; HYPRE_IJMatrixSetValues(A, 1, &tmp[0], &tmp[1], cols, values); } free(values); free(cols); free(tmp); } /* Assemble after setting the coefficients */ HYPRE_IJMatrixAssemble(A); /* Note: for the testing of small problems, one may wish to read in a matrix in IJ format (for the format, see the output files from the -print_system option). In this case, one would use the following routine: HYPRE_IJMatrixRead( , MPI_COMM_WORLD, HYPRE_PARCSR, &A ); = IJ.A.out to read in what has been printed out by -print_system (processor numbers are omitted). A call to HYPRE_IJMatrixRead is an *alternative* to the following sequence of HYPRE_IJMatrix calls: Create, SetObjectType, Initialize, SetValues, and Assemble */ /* Get the parcsr matrix object to use */ HYPRE_IJMatrixGetObject(A, (void**) &parcsr_A); /* Create the rhs and solution */ HYPRE_IJVectorCreate(MPI_COMM_WORLD, ilower, iupper, &b); HYPRE_IJVectorSetObjectType(b, HYPRE_PARCSR); HYPRE_IJVectorInitialize(b); HYPRE_IJVectorCreate(MPI_COMM_WORLD, ilower, iupper, &x); HYPRE_IJVectorSetObjectType(x, HYPRE_PARCSR); HYPRE_IJVectorInitialize(x); /* Set the rhs values to h^2 and the solution to zero */ { double *rhs_values, *x_values; int *rows; rhs_values = (double*) calloc(local_size, sizeof(double)); x_values = (double*) calloc(local_size, sizeof(double)); rows = (int*) calloc(local_size, sizeof(int)); for (i = 0; i < local_size; i++) { rhs_values[i] = h2; x_values[i] = 0.0; rows[i] = ilower + i; } HYPRE_IJVectorSetValues(b, local_size, rows, rhs_values); HYPRE_IJVectorSetValues(x, local_size, rows, x_values); free(x_values); free(rhs_values); free(rows); } HYPRE_IJVectorAssemble(b); /* As with the matrix, for testing purposes, one may wish to read in a rhs: HYPRE_IJVectorRead( , MPI_COMM_WORLD, HYPRE_PARCSR, &b ); as an alternative to the following sequence of HYPRE_IJVectors calls: Create, SetObjectType, Initialize, SetValues, and Assemble */ HYPRE_IJVectorGetObject(b, (void **) &par_b); HYPRE_IJVectorAssemble(x); HYPRE_IJVectorGetObject(x, (void **) &par_x); /* Print out the system - files names will be IJ.out.A.XXXXX and IJ.out.b.XXXXX, where XXXXX = processor id */ if (print_system) { HYPRE_IJMatrixPrint(A, "IJ.out.A"); HYPRE_IJVectorPrint(b, "IJ.out.b"); } /* Choose a solver and solve the system */ /* AMG */ if (solver_id == 0) { int num_iterations; double final_res_norm; /* Create solver */ HYPRE_BoomerAMGCreate(&solver); /* Set some parameters (See Reference Manual for more parameters) */ HYPRE_BoomerAMGSetPrintLevel(solver, 3); /* print solve info + parameters */ HYPRE_BoomerAMGSetOldDefault(solver); /* Falgout coarsening with modified classical interpolaiton */ HYPRE_BoomerAMGSetRelaxType(solver, 3); /* G-S/Jacobi hybrid relaxation */ HYPRE_BoomerAMGSetRelaxOrder(solver, 1); /* uses C/F relaxation */ HYPRE_BoomerAMGSetNumSweeps(solver, 1); /* Sweeeps on each level */ HYPRE_BoomerAMGSetMaxLevels(solver, 20); /* maximum number of levels */ HYPRE_BoomerAMGSetTol(solver, 1e-7); /* conv. tolerance */ /* Now setup and solve! */ HYPRE_BoomerAMGSetup(solver, parcsr_A, par_b, par_x); HYPRE_BoomerAMGSolve(solver, parcsr_A, par_b, par_x); /* Run info - needed logging turned on */ HYPRE_BoomerAMGGetNumIterations(solver, &num_iterations); HYPRE_BoomerAMGGetFinalRelativeResidualNorm(solver, &final_res_norm); if (myid == 0) { printf("\n"); printf("Iterations = %d\n", num_iterations); printf("Final Relative Residual Norm = %e\n", final_res_norm); printf("\n"); } /* Destroy solver */ HYPRE_BoomerAMGDestroy(solver); } /* PCG */ else if (solver_id == 50) { int num_iterations; double final_res_norm; /* Create solver */ HYPRE_ParCSRPCGCreate(MPI_COMM_WORLD, &solver); /* Set some parameters (See Reference Manual for more parameters) */ HYPRE_PCGSetMaxIter(solver, 1000); /* max iterations */ HYPRE_PCGSetTol(solver, 1e-7); /* conv. tolerance */ HYPRE_PCGSetTwoNorm(solver, 1); /* use the two norm as the stopping criteria */ HYPRE_PCGSetPrintLevel(solver, 2); /* prints out the iteration info */ HYPRE_PCGSetLogging(solver, 1); /* needed to get run info later */ /* Now setup and solve! */ HYPRE_ParCSRPCGSetup(solver, parcsr_A, par_b, par_x); HYPRE_ParCSRPCGSolve(solver, parcsr_A, par_b, par_x); /* Run info - needed logging turned on */ HYPRE_PCGGetNumIterations(solver, &num_iterations); HYPRE_PCGGetFinalRelativeResidualNorm(solver, &final_res_norm); if (myid == 0) { printf("\n"); printf("Iterations = %d\n", num_iterations); printf("Final Relative Residual Norm = %e\n", final_res_norm); printf("\n"); } /* Destroy solver */ HYPRE_ParCSRPCGDestroy(solver); } /* PCG with AMG preconditioner */ else if (solver_id == 1) { int num_iterations; double final_res_norm; /* Create solver */ HYPRE_ParCSRPCGCreate(MPI_COMM_WORLD, &solver); /* Set some parameters (See Reference Manual for more parameters) */ HYPRE_PCGSetMaxIter(solver, 1000); /* max iterations */ HYPRE_PCGSetTol(solver, 1e-7); /* conv. tolerance */ HYPRE_PCGSetTwoNorm(solver, 1); /* use the two norm as the stopping criteria */ HYPRE_PCGSetPrintLevel(solver, 2); /* print solve info */ HYPRE_PCGSetLogging(solver, 1); /* needed to get run info later */ /* Now set up the AMG preconditioner and specify any parameters */ HYPRE_BoomerAMGCreate(&precond); HYPRE_BoomerAMGSetPrintLevel(precond, 1); /* print amg solution info */ HYPRE_BoomerAMGSetCoarsenType(precond, 6); HYPRE_BoomerAMGSetOldDefault(precond); HYPRE_BoomerAMGSetRelaxType(precond, 6); /* Sym G.S./Jacobi hybrid */ HYPRE_BoomerAMGSetNumSweeps(precond, 1); HYPRE_BoomerAMGSetTol(precond, 0.0); /* conv. tolerance zero */ HYPRE_BoomerAMGSetMaxIter(precond, 1); /* do only one iteration! */ /* Set the PCG preconditioner */ HYPRE_PCGSetPrecond(solver, (HYPRE_PtrToSolverFcn) HYPRE_BoomerAMGSolve, (HYPRE_PtrToSolverFcn) HYPRE_BoomerAMGSetup, precond); /* Now setup and solve! */ HYPRE_ParCSRPCGSetup(solver, parcsr_A, par_b, par_x); HYPRE_ParCSRPCGSolve(solver, parcsr_A, par_b, par_x); /* Run info - needed logging turned on */ HYPRE_PCGGetNumIterations(solver, &num_iterations); HYPRE_PCGGetFinalRelativeResidualNorm(solver, &final_res_norm); if (myid == 0) { printf("\n"); printf("Iterations = %d\n", num_iterations); printf("Final Relative Residual Norm = %e\n", final_res_norm); printf("\n"); } /* Destroy solver and preconditioner */ HYPRE_ParCSRPCGDestroy(solver); HYPRE_BoomerAMGDestroy(precond); } /* PCG with Parasails Preconditioner */ else if (solver_id == 8) { int num_iterations; double final_res_norm; int sai_max_levels = 1; double sai_threshold = 0.1; double sai_filter = 0.05; int sai_sym = 1; /* Create solver */ HYPRE_ParCSRPCGCreate(MPI_COMM_WORLD, &solver); /* Set some parameters (See Reference Manual for more parameters) */ HYPRE_PCGSetMaxIter(solver, 1000); /* max iterations */ HYPRE_PCGSetTol(solver, 1e-7); /* conv. tolerance */ HYPRE_PCGSetTwoNorm(solver, 1); /* use the two norm as the stopping criteria */ HYPRE_PCGSetPrintLevel(solver, 2); /* print solve info */ HYPRE_PCGSetLogging(solver, 1); /* needed to get run info later */ /* Now set up the ParaSails preconditioner and specify any parameters */ HYPRE_ParaSailsCreate(MPI_COMM_WORLD, &precond); /* Set some parameters (See Reference Manual for more parameters) */ HYPRE_ParaSailsSetParams(precond, sai_threshold, sai_max_levels); HYPRE_ParaSailsSetFilter(precond, sai_filter); HYPRE_ParaSailsSetSym(precond, sai_sym); HYPRE_ParaSailsSetLogging(precond, 3); /* Set the PCG preconditioner */ HYPRE_PCGSetPrecond(solver, (HYPRE_PtrToSolverFcn) HYPRE_ParaSailsSolve, (HYPRE_PtrToSolverFcn) HYPRE_ParaSailsSetup, precond); /* Now setup and solve! */ HYPRE_ParCSRPCGSetup(solver, parcsr_A, par_b, par_x); HYPRE_ParCSRPCGSolve(solver, parcsr_A, par_b, par_x); /* Run info - needed logging turned on */ HYPRE_PCGGetNumIterations(solver, &num_iterations); HYPRE_PCGGetFinalRelativeResidualNorm(solver, &final_res_norm); if (myid == 0) { printf("\n"); printf("Iterations = %d\n", num_iterations); printf("Final Relative Residual Norm = %e\n", final_res_norm); printf("\n"); } /* Destory solver and preconditioner */ HYPRE_ParCSRPCGDestroy(solver); HYPRE_ParaSailsDestroy(precond); } /* Flexible GMRES with AMG Preconditioner */ else if (solver_id == 61) { int num_iterations; double final_res_norm; int restart = 30; int modify = 1; /* Create solver */ HYPRE_ParCSRFlexGMRESCreate(MPI_COMM_WORLD, &solver); /* Set some parameters (See Reference Manual for more parameters) */ HYPRE_FlexGMRESSetKDim(solver, restart); HYPRE_FlexGMRESSetMaxIter(solver, 1000); /* max iterations */ HYPRE_FlexGMRESSetTol(solver, 1e-7); /* conv. tolerance */ HYPRE_FlexGMRESSetPrintLevel(solver, 2); /* print solve info */ HYPRE_FlexGMRESSetLogging(solver, 1); /* needed to get run info later */ /* Now set up the AMG preconditioner and specify any parameters */ HYPRE_BoomerAMGCreate(&precond); HYPRE_BoomerAMGSetPrintLevel(precond, 1); /* print amg solution info */ HYPRE_BoomerAMGSetCoarsenType(precond, 6); HYPRE_BoomerAMGSetOldDefault(precond); HYPRE_BoomerAMGSetRelaxType(precond, 6); /* Sym G.S./Jacobi hybrid */ HYPRE_BoomerAMGSetNumSweeps(precond, 1); HYPRE_BoomerAMGSetTol(precond, 0.0); /* conv. tolerance zero */ HYPRE_BoomerAMGSetMaxIter(precond, 1); /* do only one iteration! */ /* Set the FlexGMRES preconditioner */ HYPRE_FlexGMRESSetPrecond(solver, (HYPRE_PtrToSolverFcn) HYPRE_BoomerAMGSolve, (HYPRE_PtrToSolverFcn) HYPRE_BoomerAMGSetup, precond); if (modify) { /* this is an optional call - if you don't call it, hypre_FlexGMRESModifyPCDefault is used - which does nothing. Otherwise, you can define your own, similar to the one used here */ HYPRE_FlexGMRESSetModifyPC( solver, (HYPRE_PtrToModifyPCFcn) hypre_FlexGMRESModifyPCAMGExample); } /* Now setup and solve! */ HYPRE_ParCSRFlexGMRESSetup(solver, parcsr_A, par_b, par_x); HYPRE_ParCSRFlexGMRESSolve(solver, parcsr_A, par_b, par_x); /* Run info - needed logging turned on */ HYPRE_FlexGMRESGetNumIterations(solver, &num_iterations); HYPRE_FlexGMRESGetFinalRelativeResidualNorm(solver, &final_res_norm); if (myid == 0) { printf("\n"); printf("Iterations = %d\n", num_iterations); printf("Final Relative Residual Norm = %e\n", final_res_norm); printf("\n"); } /* Destory solver and preconditioner */ HYPRE_ParCSRFlexGMRESDestroy(solver); HYPRE_BoomerAMGDestroy(precond); } else { if (myid == 0) { printf("Invalid solver id specified.\n"); } } /* Save the solution for GLVis visualization, see vis/glvis-ex5.sh */ if (vis) { #ifdef HYPRE_EXVIS FILE *file; char filename[255]; int nvalues = local_size; int *rows = (int*) calloc(nvalues, sizeof(int)); double *values = (double*) calloc(nvalues, sizeof(double)); for (i = 0; i < nvalues; i++) { rows[i] = ilower + i; } /* get the local solution */ HYPRE_IJVectorGetValues(x, nvalues, rows, values); sprintf(filename, "%s.%06d", "vis/ex5.sol", myid); if ((file = fopen(filename, "w")) == NULL) { printf("Error: can't open output file %s\n", filename); MPI_Finalize(); exit(1); } /* save solution */ for (i = 0; i < nvalues; i++) { fprintf(file, "%.14e\n", values[i]); } fflush(file); fclose(file); free(rows); free(values); /* save global finite element mesh */ if (myid == 0) { GLVis_PrintGlobalSquareMesh("vis/ex5.mesh", n - 1); } #endif } /* Clean up */ HYPRE_IJMatrixDestroy(A); HYPRE_IJVectorDestroy(b); HYPRE_IJVectorDestroy(x); /* Finalize HYPRE */ HYPRE_Finalize(); /* Finalize MPI*/ MPI_Finalize(); return (0); } /*-------------------------------------------------------------------------- hypre_FlexGMRESModifyPCAMGExample - This is an example (not recommended) of how we can modify things about AMG that affect the solve phase based on how FlexGMRES is doing...For another preconditioner it may make sense to modify the tolerance.. *--------------------------------------------------------------------------*/ int hypre_FlexGMRESModifyPCAMGExample(void *precond_data, int iterations, double rel_residual_norm) { if (rel_residual_norm > .1) { HYPRE_BoomerAMGSetNumSweeps((HYPRE_Solver)precond_data, 10); } else { HYPRE_BoomerAMGSetNumSweeps((HYPRE_Solver)precond_data, 1); } return 0; } hypre-2.33.0/src/examples/ex5big.c000066400000000000000000000457431477326011500167050ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /* Example 5big Interface: Linear-Algebraic (IJ) Compile with: make ex5big Sample run: mpirun -np 4 ex5big Description: This example is a slight modification of Example 5 that illustrates the 64-bit integer support in hypre needed to run problems with more than 2B unknowns. Specifically, the changes compared to Example 5 are as follows: 1) All integer arguments to HYPRE functions should be declared of type HYPRE_Int. 2) Variables of type HYPRE_Int are 64-bit integers, so they should be printed in the %lld format (not %d). To enable the 64-bit integer support, you need to build hypre with the --enable-bigint option of the configure script. We recommend comparing this example with Example 5. */ #include #include #include #include #include "HYPRE_krylov.h" #include "HYPRE.h" #include "HYPRE_parcsr_ls.h" int hypre_FlexGMRESModifyPCAMGExample(void *precond_data, int iterations, double rel_residual_norm); #define my_min(a,b) (((a)<(b)) ? (a) : (b)) int main (int argc, char *argv[]) { HYPRE_Int i; int myid, num_procs; int N, n; HYPRE_Int ilower, iupper; HYPRE_Int local_size, extra; int solver_id; int print_system; double h, h2; HYPRE_IJMatrix A; HYPRE_ParCSRMatrix parcsr_A; HYPRE_IJVector b; HYPRE_ParVector par_b; HYPRE_IJVector x; HYPRE_ParVector par_x; HYPRE_Solver solver, precond; /* Initialize MPI */ MPI_Init(&argc, &argv); MPI_Comm_rank(MPI_COMM_WORLD, &myid); MPI_Comm_size(MPI_COMM_WORLD, &num_procs); /* Initialize HYPRE */ HYPRE_Initialize(); /* Default problem parameters */ n = 33; solver_id = 0; print_system = 0; /* Parse command line */ { int arg_index = 0; int print_usage = 0; while (arg_index < argc) { if ( strcmp(argv[arg_index], "-n") == 0 ) { arg_index++; n = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-solver") == 0 ) { arg_index++; solver_id = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-print_system") == 0 ) { arg_index++; print_system = 1; } else if ( strcmp(argv[arg_index], "-help") == 0 ) { print_usage = 1; break; } else { arg_index++; } } if ((print_usage) && (myid == 0)) { printf("\n"); printf("Usage: %s []\n", argv[0]); printf("\n"); printf(" -n : problem size in each direction (default: 33)\n"); printf(" -solver : solver ID\n"); printf(" 0 - AMG (default) \n"); printf(" 1 - AMG-PCG\n"); printf(" 8 - ParaSails-PCG\n"); printf(" 50 - PCG\n"); printf(" 61 - AMG-FlexGMRES\n"); printf(" -print_system : print the matrix and rhs\n"); printf("\n"); } if (print_usage) { MPI_Finalize(); return (0); } } /* Preliminaries: want at least one processor per row */ if (n * n < num_procs) { n = sqrt(num_procs) + 1; } N = n * n; /* global number of rows */ h = 1.0 / (n + 1); /* mesh size*/ h2 = h * h; /* Each processor knows only of its own rows - the range is denoted by ilower and upper. Here we partition the rows. We account for the fact that N may not divide evenly by the number of processors. */ local_size = N / num_procs; extra = N - local_size * num_procs; ilower = local_size * myid; ilower += my_min(myid, extra); iupper = local_size * (myid + 1); iupper += my_min(myid + 1, extra); iupper = iupper - 1; /* How many rows do I have? */ local_size = iupper - ilower + 1; /* Create the matrix. Note that this is a square matrix, so we indicate the row partition size twice (since number of rows = number of cols) */ HYPRE_IJMatrixCreate(MPI_COMM_WORLD, ilower, iupper, ilower, iupper, &A); /* Choose a parallel csr format storage (see the User's Manual) */ HYPRE_IJMatrixSetObjectType(A, HYPRE_PARCSR); /* Initialize before setting coefficients */ HYPRE_IJMatrixInitialize(A); /* Now go through my local rows and set the matrix entries. Each row has at most 5 entries. For example, if n=3: A = [M -I 0; -I M -I; 0 -I M] M = [4 -1 0; -1 4 -1; 0 -1 4] Note that here we are setting one row at a time, though one could set all the rows together (see the User's Manual). */ { HYPRE_Int nnz; double values[5]; HYPRE_Int cols[5]; for (i = ilower; i <= iupper; i++) { nnz = 0; /* The left identity block:position i-n */ if ((i - n) >= 0) { cols[nnz] = i - n; values[nnz] = -1.0; nnz++; } /* The left -1: position i-1 */ if (i % n) { cols[nnz] = i - 1; values[nnz] = -1.0; nnz++; } /* Set the diagonal: position i */ cols[nnz] = i; values[nnz] = 4.0; nnz++; /* The right -1: position i+1 */ if ((i + 1) % n) { cols[nnz] = i + 1; values[nnz] = -1.0; nnz++; } /* The right identity block:position i+n */ if ((i + n) < N) { cols[nnz] = i + n; values[nnz] = -1.0; nnz++; } /* Set the values for row i */ HYPRE_IJMatrixSetValues(A, 1, &nnz, &i, cols, values); } } /* Assemble after setting the coefficients */ HYPRE_IJMatrixAssemble(A); /* Note: for the testing of small problems, one may wish to read in a matrix in IJ format (for the format, see the output files from the -print_system option). In this case, one would use the following routine: HYPRE_IJMatrixRead( , MPI_COMM_WORLD, HYPRE_PARCSR, &A ); = IJ.A.out to read in what has been printed out by -print_system (processor numbers are omitted). A call to HYPRE_IJMatrixRead is an *alternative* to the following sequence of HYPRE_IJMatrix calls: Create, SetObjectType, Initialize, SetValues, and Assemble */ /* Get the parcsr matrix object to use */ HYPRE_IJMatrixGetObject(A, (void**) &parcsr_A); /* Create the rhs and solution */ HYPRE_IJVectorCreate(MPI_COMM_WORLD, ilower, iupper, &b); HYPRE_IJVectorSetObjectType(b, HYPRE_PARCSR); HYPRE_IJVectorInitialize(b); HYPRE_IJVectorCreate(MPI_COMM_WORLD, ilower, iupper, &x); HYPRE_IJVectorSetObjectType(x, HYPRE_PARCSR); HYPRE_IJVectorInitialize(x); /* Set the rhs values to h^2 and the solution to zero */ { double *rhs_values, *x_values; HYPRE_Int *rows; rhs_values = (double*) calloc(local_size, sizeof(double)); x_values = (double*) calloc(local_size, sizeof(double)); rows = (HYPRE_Int*) calloc(local_size, sizeof(HYPRE_Int)); for (i = 0; i < local_size; i++) { rhs_values[i] = h2; x_values[i] = 0.0; rows[i] = ilower + i; } HYPRE_IJVectorSetValues(b, local_size, rows, rhs_values); HYPRE_IJVectorSetValues(x, local_size, rows, x_values); free(x_values); free(rhs_values); free(rows); } HYPRE_IJVectorAssemble(b); /* As with the matrix, for testing purposes, one may wish to read in a rhs: HYPRE_IJVectorRead( , MPI_COMM_WORLD, HYPRE_PARCSR, &b ); as an alternative to the following sequence of HYPRE_IJVectors calls: Create, SetObjectType, Initialize, SetValues, and Assemble */ HYPRE_IJVectorGetObject(b, (void **) &par_b); HYPRE_IJVectorAssemble(x); HYPRE_IJVectorGetObject(x, (void **) &par_x); /* Print out the system - files names will be IJ.out.A.XXXXX and IJ.out.b.XXXXX, where XXXXX = processor id */ if (print_system) { HYPRE_IJMatrixPrint(A, "IJ.out.A"); HYPRE_IJVectorPrint(b, "IJ.out.b"); } /* Choose a solver and solve the system */ /* AMG */ if (solver_id == 0) { HYPRE_Int num_iterations; double final_res_norm; /* Create solver */ HYPRE_BoomerAMGCreate(&solver); /* Set some parameters (See Reference Manual for more parameters) */ HYPRE_BoomerAMGSetPrintLevel(solver, 3); /* print solve info + parameters */ HYPRE_BoomerAMGSetOldDefault(solver); /* Falgout coarsening with modified classical interpolation */ HYPRE_BoomerAMGSetRelaxType(solver, 3); /* G-S/Jacobi hybrid relaxation */ HYPRE_BoomerAMGSetRelaxOrder(solver, 1); /* Uses C/F relaxation */ HYPRE_BoomerAMGSetNumSweeps(solver, 1); /* Sweeeps on each level */ HYPRE_BoomerAMGSetMaxLevels(solver, 20); /* maximum number of levels */ HYPRE_BoomerAMGSetTol(solver, 1e-7); /* conv. tolerance */ /* Now setup and solve! */ HYPRE_BoomerAMGSetup(solver, parcsr_A, par_b, par_x); HYPRE_BoomerAMGSolve(solver, parcsr_A, par_b, par_x); /* Run info - needed logging turned on */ HYPRE_BoomerAMGGetNumIterations(solver, &num_iterations); HYPRE_BoomerAMGGetFinalRelativeResidualNorm(solver, &final_res_norm); if (myid == 0) { printf("\n"); printf("Iterations = %lld\n", num_iterations); printf("Final Relative Residual Norm = %e\n", final_res_norm); printf("\n"); } /* Destroy solver */ HYPRE_BoomerAMGDestroy(solver); } /* PCG */ else if (solver_id == 50) { HYPRE_Int num_iterations; double final_res_norm; /* Create solver */ HYPRE_ParCSRPCGCreate(MPI_COMM_WORLD, &solver); /* Set some parameters (See Reference Manual for more parameters) */ HYPRE_PCGSetMaxIter(solver, 1000); /* max iterations */ HYPRE_PCGSetTol(solver, 1e-7); /* conv. tolerance */ HYPRE_PCGSetTwoNorm(solver, 1); /* use the two norm as the stopping criteria */ HYPRE_PCGSetPrintLevel(solver, 2); /* prints out the iteration info */ HYPRE_PCGSetLogging(solver, 1); /* needed to get run info later */ /* Now setup and solve! */ HYPRE_ParCSRPCGSetup(solver, parcsr_A, par_b, par_x); HYPRE_ParCSRPCGSolve(solver, parcsr_A, par_b, par_x); /* Run info - needed logging turned on */ HYPRE_PCGGetNumIterations(solver, &num_iterations); HYPRE_PCGGetFinalRelativeResidualNorm(solver, &final_res_norm); if (myid == 0) { printf("\n"); printf("Iterations = %lld\n", num_iterations); printf("Final Relative Residual Norm = %e\n", final_res_norm); printf("\n"); } /* Destroy solver */ HYPRE_ParCSRPCGDestroy(solver); } /* PCG with AMG preconditioner */ else if (solver_id == 1) { HYPRE_Int num_iterations; double final_res_norm; /* Create solver */ HYPRE_ParCSRPCGCreate(MPI_COMM_WORLD, &solver); /* Set some parameters (See Reference Manual for more parameters) */ HYPRE_PCGSetMaxIter(solver, 1000); /* max iterations */ HYPRE_PCGSetTol(solver, 1e-7); /* conv. tolerance */ HYPRE_PCGSetTwoNorm(solver, 1); /* use the two norm as the stopping criteria */ HYPRE_PCGSetPrintLevel(solver, 2); /* print solve info */ HYPRE_PCGSetLogging(solver, 1); /* needed to get run info later */ /* Now set up the AMG preconditioner and specify any parameters */ HYPRE_BoomerAMGCreate(&precond); HYPRE_BoomerAMGSetPrintLevel(precond, 1); /* print amg solution info */ HYPRE_BoomerAMGSetCoarsenType(precond, 6); HYPRE_BoomerAMGSetOldDefault(precond); HYPRE_BoomerAMGSetRelaxType(precond, 6); /* Sym G.S./Jacobi hybrid */ HYPRE_BoomerAMGSetNumSweeps(precond, 1); HYPRE_BoomerAMGSetTol(precond, 0.0); /* conv. tolerance zero */ HYPRE_BoomerAMGSetMaxIter(precond, 1); /* do only one iteration! */ /* Set the PCG preconditioner */ HYPRE_PCGSetPrecond(solver, (HYPRE_PtrToSolverFcn) HYPRE_BoomerAMGSolve, (HYPRE_PtrToSolverFcn) HYPRE_BoomerAMGSetup, precond); /* Now setup and solve! */ HYPRE_ParCSRPCGSetup(solver, parcsr_A, par_b, par_x); HYPRE_ParCSRPCGSolve(solver, parcsr_A, par_b, par_x); /* Run info - needed logging turned on */ HYPRE_PCGGetNumIterations(solver, &num_iterations); HYPRE_PCGGetFinalRelativeResidualNorm(solver, &final_res_norm); if (myid == 0) { printf("\n"); printf("Iterations = %lld\n", num_iterations); printf("Final Relative Residual Norm = %e\n", final_res_norm); printf("\n"); } /* Destroy solver and preconditioner */ HYPRE_ParCSRPCGDestroy(solver); HYPRE_BoomerAMGDestroy(precond); } /* PCG with Parasails Preconditioner */ else if (solver_id == 8) { HYPRE_Int num_iterations; double final_res_norm; int sai_max_levels = 1; double sai_threshold = 0.1; double sai_filter = 0.05; int sai_sym = 1; /* Create solver */ HYPRE_ParCSRPCGCreate(MPI_COMM_WORLD, &solver); /* Set some parameters (See Reference Manual for more parameters) */ HYPRE_PCGSetMaxIter(solver, 1000); /* max iterations */ HYPRE_PCGSetTol(solver, 1e-7); /* conv. tolerance */ HYPRE_PCGSetTwoNorm(solver, 1); /* use the two norm as the stopping criteria */ HYPRE_PCGSetPrintLevel(solver, 2); /* print solve info */ HYPRE_PCGSetLogging(solver, 1); /* needed to get run info later */ /* Now set up the ParaSails preconditioner and specify any parameters */ HYPRE_ParaSailsCreate(MPI_COMM_WORLD, &precond); /* Set some parameters (See Reference Manual for more parameters) */ HYPRE_ParaSailsSetParams(precond, sai_threshold, sai_max_levels); HYPRE_ParaSailsSetFilter(precond, sai_filter); HYPRE_ParaSailsSetSym(precond, sai_sym); HYPRE_ParaSailsSetLogging(precond, 3); /* Set the PCG preconditioner */ HYPRE_PCGSetPrecond(solver, (HYPRE_PtrToSolverFcn) HYPRE_ParaSailsSolve, (HYPRE_PtrToSolverFcn) HYPRE_ParaSailsSetup, precond); /* Now setup and solve! */ HYPRE_ParCSRPCGSetup(solver, parcsr_A, par_b, par_x); HYPRE_ParCSRPCGSolve(solver, parcsr_A, par_b, par_x); /* Run info - needed logging turned on */ HYPRE_PCGGetNumIterations(solver, &num_iterations); HYPRE_PCGGetFinalRelativeResidualNorm(solver, &final_res_norm); if (myid == 0) { printf("\n"); printf("Iterations = %lld\n", num_iterations); printf("Final Relative Residual Norm = %e\n", final_res_norm); printf("\n"); } /* Destory solver and preconditioner */ HYPRE_ParCSRPCGDestroy(solver); HYPRE_ParaSailsDestroy(precond); } /* Flexible GMRES with AMG Preconditioner */ else if (solver_id == 61) { HYPRE_Int num_iterations; double final_res_norm; int restart = 30; int modify = 1; /* Create solver */ HYPRE_ParCSRFlexGMRESCreate(MPI_COMM_WORLD, &solver); /* Set some parameters (See Reference Manual for more parameters) */ HYPRE_FlexGMRESSetKDim(solver, restart); HYPRE_FlexGMRESSetMaxIter(solver, 1000); /* max iterations */ HYPRE_FlexGMRESSetTol(solver, 1e-7); /* conv. tolerance */ HYPRE_FlexGMRESSetPrintLevel(solver, 2); /* print solve info */ HYPRE_FlexGMRESSetLogging(solver, 1); /* needed to get run info later */ /* Now set up the AMG preconditioner and specify any parameters */ HYPRE_BoomerAMGCreate(&precond); HYPRE_BoomerAMGSetPrintLevel(precond, 1); /* print amg solution info */ HYPRE_BoomerAMGSetCoarsenType(precond, 6); HYPRE_BoomerAMGSetOldDefault(precond); HYPRE_BoomerAMGSetRelaxType(precond, 6); /* Sym G.S./Jacobi hybrid */ HYPRE_BoomerAMGSetNumSweeps(precond, 1); HYPRE_BoomerAMGSetTol(precond, 0.0); /* conv. tolerance zero */ HYPRE_BoomerAMGSetMaxIter(precond, 1); /* do only one iteration! */ /* Set the FlexGMRES preconditioner */ HYPRE_FlexGMRESSetPrecond(solver, (HYPRE_PtrToSolverFcn) HYPRE_BoomerAMGSolve, (HYPRE_PtrToSolverFcn) HYPRE_BoomerAMGSetup, precond); if (modify) { /* this is an optional call - if you don't call it, hypre_FlexGMRESModifyPCDefault is used - which does nothing. Otherwise, you can define your own, similar to the one used here */ HYPRE_FlexGMRESSetModifyPC( solver, (HYPRE_PtrToModifyPCFcn) hypre_FlexGMRESModifyPCAMGExample); } /* Now setup and solve! */ HYPRE_ParCSRFlexGMRESSetup(solver, parcsr_A, par_b, par_x); HYPRE_ParCSRFlexGMRESSolve(solver, parcsr_A, par_b, par_x); /* Run info - needed logging turned on */ HYPRE_FlexGMRESGetNumIterations(solver, &num_iterations); HYPRE_FlexGMRESGetFinalRelativeResidualNorm(solver, &final_res_norm); if (myid == 0) { printf("\n"); printf("Iterations = %lld\n", num_iterations); printf("Final Relative Residual Norm = %e\n", final_res_norm); printf("\n"); } /* Destory solver and preconditioner */ HYPRE_ParCSRFlexGMRESDestroy(solver); HYPRE_BoomerAMGDestroy(precond); } else { if (myid == 0) { printf("Invalid solver id specified.\n"); } } /* Clean up */ HYPRE_IJMatrixDestroy(A); HYPRE_IJVectorDestroy(b); HYPRE_IJVectorDestroy(x); /* Finalize HYPRE */ HYPRE_Finalize(); /* Finalize MPI*/ MPI_Finalize(); return (0); } /*-------------------------------------------------------------------------- hypre_FlexGMRESModifyPCAMGExample - This is an example (not recommended) of how we can modify things about AMG that affect the solve phase based on how FlexGMRES is doing...For another preconditioner it may make sense to modify the tolerance.. *--------------------------------------------------------------------------*/ int hypre_FlexGMRESModifyPCAMGExample(void *precond_data, int iterations, double rel_residual_norm) { if (rel_residual_norm > .1) { HYPRE_BoomerAMGSetNumSweeps((HYPRE_Solver)precond_data, 10); } else { HYPRE_BoomerAMGSetNumSweeps((HYPRE_Solver)precond_data, 1); } return 0; } hypre-2.33.0/src/examples/ex5cuf.cuf000066400000000000000000000351111477326011500172400ustar00rootroot00000000000000! Copyright (c) 1998 Lawrence Livermore National Security, LLC and other ! HYPRE Project Developers. See the top-level COPYRIGHT file for details. ! ! SPDX-License-Identifier: (Apache-2.0 OR MIT) ! ! Example 5 ! ! Interface: Linear-Algebraic (IJ), Fortran (77) version ! ! Compile with: make ex5f ! ! Sample run: mpirun -np 4 ex5f ! ! Description: This example solves the 2-D ! Laplacian problem with zero boundary conditions ! on an nxn grid. The number of unknowns is N=n^2. ! The standard 5-point stencil is used, and we solve ! for the interior nodes only. ! ! This example solves the same problem as Example 3. ! Available solvers are AMG, PCG, and PCG with AMG, ! and PCG with ParaSails ! ! ! Notes: for PCG, GMRES and BiCGStab, precond_id means: ! 0 - do not set up a preconditioner ! 1 - set up a ds preconditioner ! 2 - set up an amg preconditioner ! 3 - set up a pilut preconditioner ! 4 - set up a ParaSails preconditioner ! program ex5f implicit none include 'mpif.h' include 'HYPREf.h' integer MAX_LOCAL_SIZE parameter (MAX_LOCAL_SIZE=123000) integer ierr integer num_procs, myid integer local_size, extra integer n, solver_id, print_solution, ng integer nnz, ilower, iupper, i integer precond_id; double precision h, h2 double precision, managed, allocatable :: rhs_values(:) double precision, managed, allocatable :: x_values(:) double precision, managed, allocatable :: values(:) integer, managed, allocatable :: rows(:) integer, managed, allocatable :: cols(:) integer, managed, allocatable :: tmpi(:) integer num_iterations double precision final_res_norm, tol integer mpi_comm integer*8 parcsr_A integer*8 A integer*8 b integer*8 x integer*8 par_b integer*8 par_x integer*8 solver integer*8 precond allocate(rhs_values(MAX_LOCAL_SIZE)) allocate(x_values(MAX_LOCAL_SIZE)) allocate(values(5)) allocate(rows(MAX_LOCAL_SIZE)) allocate(cols(5)) allocate(tmpi(2)) !----------------------------------------------------------------------- ! Initialize MPI !----------------------------------------------------------------------- call MPI_INIT(ierr) call MPI_COMM_RANK(MPI_COMM_WORLD, myid, ierr) call MPI_COMM_SIZE(MPI_COMM_WORLD, num_procs, ierr) mpi_comm = MPI_COMM_WORLD call HYPRE_Initialize(ierr) call HYPRE_SetMemoryLocation(HYPRE_MEMORY_DEVICE, ierr) call HYPRE_SetExecutionPolicy(HYPRE_EXEC_DEVICE, ierr) call HYPRE_SetSpGemmUseVendor(0, ierr) ! Default problem parameters n = 33 solver_id = 0 print_solution = 0 tol = 1.0d-7 ! The input section not implemented yet. ! Preliminaries: want at least one processor per row if ( n*n .lt. num_procs ) then n = int(sqrt(real(num_procs))) + 1 endif ! ng = global no. rows, h = mesh size ng = n*n h = 1.0d0/(n+1) h2 = h*h ! Each processor knows only of its own rows - the range is denoted by ilower ! and upper. Here we partition the rows. We account for the fact that ! N may not divide evenly by the number of processors. local_size = ng/num_procs extra = ng - local_size*num_procs ilower = local_size*myid ilower = ilower + min(myid, extra) iupper = local_size*(myid+1) iupper = iupper + min(myid+1, extra) iupper = iupper - 1 ! How many rows do I have? local_size = iupper - ilower + 1 ! Create the matrix. ! Note that this is a square matrix, so we indicate the row partition ! size twice (since number of rows = number of cols) call HYPRE_IJMatrixCreate(mpi_comm, ilower, & iupper, ilower, iupper, A, ierr) ! Choose a parallel csr format storage (see the User's Manual) call HYPRE_IJMatrixSetObjectType(A, HYPRE_PARCSR, ierr) ! Initialize before setting coefficients call HYPRE_IJMatrixInitialize(A, ierr) ! Now go through my local rows and set the matrix entries. ! Each row has at most 5 entries. For example, if n=3: ! ! A = [M -I 0; -I M -I; 0 -I M] ! M = [4 -1 0; -1 4 -1; 0 -1 4] ! ! Note that here we are setting one row at a time, though ! one could set all the rows together (see the User's Manual). do i = ilower, iupper nnz = 1 ! The left identity block:position i-n if ( (i-n) .ge. 0 ) then cols(nnz) = i-n values(nnz) = -1.0d0 nnz = nnz + 1 endif ! The left -1: position i-1 if ( mod(i,n).ne.0 ) then cols(nnz) = i-1 values(nnz) = -1.0d0 nnz = nnz + 1 endif ! Set the diagonal: position i cols(nnz) = i values(nnz) = 4.0d0 nnz = nnz + 1 ! The right -1: position i+1 if ( mod((i+1),n) .ne. 0 ) then cols(nnz) = i+1 values(nnz) = -1.0d0 nnz = nnz + 1 endif ! The right identity block:position i+n if ( (i+n) .lt. ng ) then cols(nnz) = i+n values(nnz) = -1.0d0 nnz = nnz + 1 endif ! Set the values for row i tmpi(1) = nnz-1 tmpi(2) = i call HYPRE_IJMatrixSetValues( & A, 1, tmpi(1), tmpi(2), cols, values, ierr) enddo ! Assemble after setting the coefficients call HYPRE_IJMatrixAssemble(A, ierr) ! Get parcsr matrix object call HYPRE_IJMatrixGetObject(A, parcsr_A, ierr) ! Create the rhs and solution call HYPRE_IJVectorCreate(mpi_comm, & ilower, iupper, b, ierr) call HYPRE_IJVectorSetObjectType(b, HYPRE_PARCSR, ierr) call HYPRE_IJVectorInitialize(b, ierr) call HYPRE_IJVectorCreate(mpi_comm, & ilower, iupper, x, ierr) call HYPRE_IJVectorSetObjectType(x, HYPRE_PARCSR, ierr) call HYPRE_IJVectorInitialize(x, ierr) ! Set the rhs values to h^2 and the solution to zero do i = 1, local_size rhs_values(i) = h2 x_values(i) = 0.0 rows(i) = ilower + i -1 enddo call HYPRE_IJVectorSetValues( & b, local_size, rows, rhs_values, ierr) call HYPRE_IJVectorSetValues( & x, local_size, rows, x_values, ierr) call HYPRE_IJVectorAssemble(b, ierr) call HYPRE_IJVectorAssemble(x, ierr) ! get the x and b objects call HYPRE_IJVectorGetObject(b, par_b, ierr) call HYPRE_IJVectorGetObject(x, par_x, ierr) ! Choose a solver and solve the system ! AMG if ( solver_id .eq. 0 ) then ! Create solver call HYPRE_BoomerAMGCreate(solver, ierr) ! Set some parameters (See Reference Manual for more parameters) ! print solve info + parameters call HYPRE_BoomerAMGSetPrintLevel(solver, 3, ierr) ! old defaults, Falgout coarsening, mod. class. interpolation call HYPRE_BoomerAMGSetOldDefault(solver, ierr) ! G-S/Jacobi hybrid relaxation call HYPRE_BoomerAMGSetRelaxType(solver, 3, ierr) ! C/F relaxation call HYPRE_BoomerAMGSetRelaxOrder(solver, 1, ierr) ! Sweeeps on each level call HYPRE_BoomerAMGSetNumSweeps(solver, 1, ierr) ! maximum number of levels call HYPRE_BoomerAMGSetMaxLevels(solver, 20, ierr) ! conv. tolerance call HYPRE_BoomerAMGSetTol(solver, 1.0d-7, ierr) ! Keep local transposes call HYPRE_BoomerAMGSetKeepTransp(solver, 1, ierr) ! Now setup and solve! call HYPRE_BoomerAMGSetup( & solver, parcsr_A, par_b, par_x, ierr) call HYPRE_BoomerAMGSolve( & solver, parcsr_A, par_b, par_x, ierr) ! Run info - needed logging turned on call HYPRE_BoomerAMGGetNumIterations(solver, num_iterations, & ierr) call HYPRE_BoomerAMGGetFinalReltvRes(solver, final_res_norm, & ierr) if ( myid .eq. 0 ) then print * print '(A,I2)', " Iterations = ", num_iterations print '(A,ES16.8)', & " Final Relative Residual Norm = ", final_res_norm print * endif ! Destroy solver call HYPRE_BoomerAMGDestroy(solver, ierr) ! PCG (with DS) elseif ( solver_id .eq. 50 ) then ! Create solver call HYPRE_ParCSRPCGCreate(MPI_COMM_WORLD, solver, ierr) ! Set some parameters (See Reference Manual for more parameters) call HYPRE_ParCSRPCGSetMaxIter(solver, 1000, ierr) call HYPRE_ParCSRPCGSetTol(solver, 1.0d-7, ierr) call HYPRE_ParCSRPCGSetTwoNorm(solver, 1, ierr) call HYPRE_ParCSRPCGSetPrintLevel(solver, 2, ierr) call HYPRE_ParCSRPCGSetLogging(solver, 1, ierr) ! set ds (diagonal scaling) as the pcg preconditioner precond_id = 1 call HYPRE_ParCSRPCGSetPrecond(solver, precond_id, & precond, ierr) ! Now setup and solve! call HYPRE_ParCSRPCGSetup(solver, parcsr_A, par_b, & par_x, ierr) call HYPRE_ParCSRPCGSolve(solver, parcsr_A, par_b, & par_x, ierr) ! Run info - needed logging turned on call HYPRE_ParCSRPCGGetNumIterations(solver, num_iterations, & ierr) call HYPRE_ParCSRPCGGetFinalRelative(solver, final_res_norm, & ierr) if ( myid .eq. 0 ) then print * print *, "Iterations = ", num_iterations print *, "Final Relative Residual Norm = ", final_res_norm print * endif ! Destroy solver call HYPRE_ParCSRPCGDestroy(solver, ierr) ! PCG with AMG preconditioner elseif ( solver_id == 1 ) then ! Create solver call HYPRE_ParCSRPCGCreate(MPI_COMM_WORLD, solver, ierr) ! Set some parameters (See Reference Manual for more parameters) call HYPRE_ParCSRPCGSetMaxIter(solver, 1000, ierr) call HYPRE_ParCSRPCGSetTol(solver, 1.0d-7, ierr) call HYPRE_ParCSRPCGSetTwoNorm(solver, 1, ierr) call HYPRE_ParCSRPCGSetPrintLevel(solver, 2, ierr) call HYPRE_ParCSRPCGSetLogging(solver, 1, ierr) ! Now set up the AMG preconditioner and specify any parameters call HYPRE_BoomerAMGCreate(precond, ierr) ! Set some parameters (See Reference Manual for more parameters) ! print less solver info since a preconditioner call HYPRE_BoomerAMGSetPrintLevel(precond, 1, ierr); ! Falgout coarsening call HYPRE_BoomerAMGSetCoarsenType(precond, 6, ierr) ! old defaults call HYPRE_BoomerAMGSetOldDefault(precond, ierr) ! SYMMETRIC G-S/Jacobi hybrid relaxation call HYPRE_BoomerAMGSetRelaxType(precond, 6, ierr) ! Sweeeps on each level call HYPRE_BoomerAMGSetNumSweeps(precond, 1, ierr) ! conv. tolerance call HYPRE_BoomerAMGSetTol(precond, 0.0d0, ierr) ! do only one iteration! call HYPRE_BoomerAMGSetMaxIter(precond, 1, ierr) ! set amg as the pcg preconditioner precond_id = 2 call HYPRE_ParCSRPCGSetPrecond(solver, precond_id, & precond, ierr) ! Now setup and solve! call HYPRE_ParCSRPCGSetup(solver, parcsr_A, par_b, & par_x, ierr) call HYPRE_ParCSRPCGSolve(solver, parcsr_A, par_b, & par_x, ierr) ! Run info - needed logging turned on call HYPRE_ParCSRPCGGetNumIterations(solver, num_iterations, & ierr) call HYPRE_ParCSRPCGGetFinalRelative(solver, final_res_norm, & ierr) if ( myid .eq. 0 ) then print * print *, "Iterations = ", num_iterations print *, "Final Relative Residual Norm = ", final_res_norm print * endif ! Destroy precond and solver call HYPRE_BoomerAMGDestroy(precond, ierr) call HYPRE_ParCSRPCGDestroy(solver, ierr) ! PCG with ParaSails elseif ( solver_id .eq. 8 ) then ! Create solver call HYPRE_ParCSRPCGCreate(MPI_COMM_WORLD, solver, ierr) ! Set some parameters (See Reference Manual for more parameters) call HYPRE_ParCSRPCGSetMaxIter(solver, 1000, ierr) call HYPRE_ParCSRPCGSetTol(solver, 1.0d-7, ierr) call HYPRE_ParCSRPCGSetTwoNorm(solver, 1, ierr) call HYPRE_ParCSRPCGSetPrintLevel(solver, 2, ierr) call HYPRE_ParCSRPCGSetLogging(solver, 1, ierr) ! Now set up the Parasails preconditioner and specify any parameters call HYPRE_ParaSailsCreate(MPI_COMM_WORLD, precond,ierr) call HYPRE_ParaSailsSetParams(precond, 0.1d0, 1, ierr) call HYPRE_ParaSailsSetFilter(precond, 0.05d0, ierr) call HYPRE_ParaSailsSetSym(precond, 1, ierr) call HYPRE_ParaSailsSetLogging(precond, 3, ierr) ! set parsails as the pcg preconditioner precond_id = 4 call HYPRE_ParCSRPCGSetPrecond(solver, precond_id, & precond, ierr) ! Now setup and solve! call HYPRE_ParCSRPCGSetup(solver, parcsr_A, par_b, & par_x, ierr) call HYPRE_ParCSRPCGSolve(solver, parcsr_A, par_b, & par_x, ierr) ! Run info - needed logging turned on call HYPRE_ParCSRPCGGetNumIterations(solver, num_iterations, & ierr) call HYPRE_ParCSRPCGGetFinalRelative(solver, final_res_norm, & ierr) if ( myid .eq. 0 ) then print * print *, "Iterations = ", num_iterations print *, "Final Relative Residual Norm = ", final_res_norm print * endif ! Destroy precond and solver call HYPRE_ParaSailsDestroy(precond, ierr) call HYPRE_ParCSRPCGDestroy(solver, ierr) else if ( myid .eq. 0 ) then print *,'Invalid solver id specified' stop endif endif ! Print the solution if ( print_solution .ne. 0 ) then call HYPRE_IJVectorPrint(x, "ij.out.x", ierr) endif ! Clean up call HYPRE_IJMatrixDestroy(A, ierr) call HYPRE_IJVectorDestroy(b, ierr) call HYPRE_IJVectorDestroy(x, ierr) call HYPRE_Finalize(ierr) ! Finalize MPI call MPI_Finalize(ierr) deallocate(rhs_values) deallocate(x_values) deallocate(values) deallocate(rows) deallocate(cols) deallocate(tmpi) end hypre-2.33.0/src/examples/ex5f.f000066400000000000000000000365461477326011500163750ustar00rootroot00000000000000! Copyright (c) 1998 Lawrence Livermore National Security, LLC and other ! HYPRE Project Developers. See the top-level COPYRIGHT file for details. ! ! SPDX-License-Identifier: (Apache-2.0 OR MIT) ! ! Example 5 ! ! Interface: Linear-Algebraic (IJ), Fortran (77) version ! ! Compile with: make ex5f ! ! Sample run: mpirun -np 4 ex5f ! ! Description: This example solves the 2-D ! Laplacian problem with zero boundary conditions ! on an nxn grid. The number of unknowns is N=n^2. ! The standard 5-point stencil is used, and we solve ! for the interior nodes only. ! ! This example solves the same problem as Example 3. ! Available solvers are AMG, PCG, and PCG with AMG, ! and PCG with ParaSails ! ! ! Notes: for PCG, GMRES and BiCGStab, precond_id means: ! 0 - do not set up a preconditioner ! 1 - set up a ds preconditioner ! 2 - set up an amg preconditioner ! 3 - set up a pilut preconditioner ! 4 - set up a ParaSails preconditioner ! program ex5f implicit none include 'mpif.h' include 'HYPREf.h' integer MAX_LOCAL_SIZE parameter (MAX_LOCAL_SIZE=123000) integer ierr integer num_procs, myid integer local_size, extra integer n, solver_id, print_solution, ng integer nnz, ilower, iupper, i integer precond_id; double precision h, h2 double precision rhs_values(MAX_LOCAL_SIZE) double precision x_values(MAX_LOCAL_SIZE) integer rows(MAX_LOCAL_SIZE) integer cols(5) integer tmp(2) double precision values(5) integer num_iterations double precision final_res_norm, tol integer mpi_comm integer*8 parcsr_A integer*8 A integer*8 b integer*8 x integer*8 par_b integer*8 par_x integer*8 solver integer*8 precond !----------------------------------------------------------------------- ! Initialize MPI !----------------------------------------------------------------------- call MPI_INIT(ierr) call MPI_COMM_RANK(MPI_COMM_WORLD, myid, ierr) call MPI_COMM_SIZE(MPI_COMM_WORLD, num_procs, ierr) mpi_comm = MPI_COMM_WORLD call HYPRE_Initialize(ierr) call HYPRE_SetMemoryLocation(HYPRE_MEMORY_DEVICE, ierr) call HYPRE_SetExecutionPolicy(HYPRE_EXEC_DEVICE, ierr) call HYPRE_SetSpGemmUseVendor(0, ierr) ! Call omp target after HYPRE_Initialize() !$omp target enter data map(alloc:rhs_values) !$omp target enter data map(alloc:x_values) !$omp target enter data map(alloc:rows) !$omp target enter data map(alloc:cols) !$omp target enter data map(alloc:values) !$omp target enter data map(alloc:tmp) ! Default problem parameters n = 33 solver_id = 0 print_solution = 0 tol = 1.0d-7 ! The input section not implemented yet. ! Preliminaries: want at least one processor per row if ( n*n .lt. num_procs ) then n = int(sqrt(real(num_procs))) + 1 endif ! ng = global no. rows, h = mesh size ng = n*n h = 1.0d0/(n+1) h2 = h*h ! Each processor knows only of its own rows - the range is denoted by ilower ! and upper. Here we partition the rows. We account for the fact that ! N may not divide evenly by the number of processors. local_size = ng/num_procs extra = ng - local_size*num_procs ilower = local_size*myid ilower = ilower + min(myid, extra) iupper = local_size*(myid+1) iupper = iupper + min(myid+1, extra) iupper = iupper - 1 ! How many rows do I have? local_size = iupper - ilower + 1 ! Create the matrix. ! Note that this is a square matrix, so we indicate the row partition ! size twice (since number of rows = number of cols) call HYPRE_IJMatrixCreate(mpi_comm, ilower, 1 iupper, ilower, iupper, A, ierr) ! Choose a parallel csr format storage (see the User's Manual) call HYPRE_IJMatrixSetObjectType(A, HYPRE_PARCSR, ierr) ! Initialize before setting coefficients call HYPRE_IJMatrixInitialize(A, ierr) ! Now go through my local rows and set the matrix entries. ! Each row has at most 5 entries. For example, if n=3: ! ! A = [M -I 0; -I M -I; 0 -I M] ! M = [4 -1 0; -1 4 -1; 0 -1 4] ! ! Note that here we are setting one row at a time, though ! one could set all the rows together (see the User's Manual). do i = ilower, iupper nnz = 1 ! The left identity block:position i-n if ( (i-n) .ge. 0 ) then cols(nnz) = i-n values(nnz) = -1.0d0 nnz = nnz + 1 endif ! The left -1: position i-1 if ( mod(i,n).ne.0 ) then cols(nnz) = i-1 values(nnz) = -1.0d0 nnz = nnz + 1 endif ! Set the diagonal: position i cols(nnz) = i values(nnz) = 4.0d0 nnz = nnz + 1 ! The right -1: position i+1 if ( mod((i+1),n) .ne. 0 ) then cols(nnz) = i+1 values(nnz) = -1.0d0 nnz = nnz + 1 endif ! The right identity block:position i+n if ( (i+n) .lt. ng ) then cols(nnz) = i+n values(nnz) = -1.0d0 nnz = nnz + 1 endif ! Set the values for row i tmp(1) = nnz - 1 tmp(2) = i !$omp target update to(cols, values, tmp) !$omp target data use_device_ptr(cols, values, tmp) call HYPRE_IJMatrixSetValues( 1 A, 1, tmp(1), tmp(2), cols, values, ierr) !$omp end target data enddo ! Assemble after setting the coefficients call HYPRE_IJMatrixAssemble(A, ierr) ! Get parcsr matrix object call HYPRE_IJMatrixGetObject(A, parcsr_A, ierr) ! Create the rhs and solution call HYPRE_IJVectorCreate(mpi_comm, 1 ilower, iupper, b, ierr) call HYPRE_IJVectorSetObjectType(b, HYPRE_PARCSR, ierr) call HYPRE_IJVectorInitialize(b, ierr) call HYPRE_IJVectorCreate(mpi_comm, 1 ilower, iupper, x, ierr) call HYPRE_IJVectorSetObjectType(x, HYPRE_PARCSR, ierr) call HYPRE_IJVectorInitialize(x, ierr) ! Set the rhs values to h^2 and the solution to zero do i = 1, local_size rhs_values(i) = h2 x_values(i) = 0.0 rows(i) = ilower + i -1 enddo !$omp target update to(rhs_values, x_values, rows) !$omp target data use_device_ptr(rows, rhs_values, x_values) call HYPRE_IJVectorSetValues( 1 b, local_size, rows, rhs_values, ierr) call HYPRE_IJVectorSetValues( 1 x, local_size, rows, x_values, ierr) !$omp end target data call HYPRE_IJVectorAssemble(b, ierr) call HYPRE_IJVectorAssemble(x, ierr) ! get the x and b objects call HYPRE_IJVectorGetObject(b, par_b, ierr) call HYPRE_IJVectorGetObject(x, par_x, ierr) ! Choose a solver and solve the system ! AMG if ( solver_id .eq. 0 ) then ! Create solver call HYPRE_BoomerAMGCreate(solver, ierr) ! Set some parameters (See Reference Manual for more parameters) ! print solve info + parameters call HYPRE_BoomerAMGSetPrintLevel(solver, 3, ierr) ! old defaults, Falgout coarsening, mod. class. interpolation call HYPRE_BoomerAMGSetOldDefault(solver, ierr) ! G-S/Jacobi hybrid relaxation call HYPRE_BoomerAMGSetRelaxType(solver, 3, ierr) ! C/F relaxation call HYPRE_BoomerAMGSetRelaxOrder(solver, 1, ierr) ! Sweeeps on each level call HYPRE_BoomerAMGSetNumSweeps(solver, 1, ierr) ! maximum number of levels call HYPRE_BoomerAMGSetMaxLevels(solver, 20, ierr) ! conv. tolerance call HYPRE_BoomerAMGSetTol(solver, 1.0d-7, ierr) ! Keep local transposes call HYPRE_BoomerAMGSetKeepTransp(solver, 1, ierr) ! Now setup and solve! call HYPRE_BoomerAMGSetup( 1 solver, parcsr_A, par_b, par_x, ierr) call HYPRE_BoomerAMGSolve( 1 solver, parcsr_A, par_b, par_x, ierr) ! Run info - needed logging turned on call HYPRE_BoomerAMGGetNumIterations(solver, num_iterations, 1 ierr) call HYPRE_BoomerAMGGetFinalReltvRes(solver, final_res_norm, 1 ierr) if ( myid .eq. 0 ) then print * print '(A,I2)', " Iterations = ", num_iterations print '(A,ES16.8)', 1 " Final Relative Residual Norm = ", final_res_norm print * endif ! Destroy solver call HYPRE_BoomerAMGDestroy(solver, ierr) ! PCG (with DS) elseif ( solver_id .eq. 50 ) then ! Create solver call HYPRE_ParCSRPCGCreate(MPI_COMM_WORLD, solver, ierr) ! Set some parameters (See Reference Manual for more parameters) call HYPRE_ParCSRPCGSetMaxIter(solver, 1000, ierr) call HYPRE_ParCSRPCGSetTol(solver, 1.0d-7, ierr) call HYPRE_ParCSRPCGSetTwoNorm(solver, 1, ierr) call HYPRE_ParCSRPCGSetPrintLevel(solver, 2, ierr) call HYPRE_ParCSRPCGSetLogging(solver, 1, ierr) ! set ds (diagonal scaling) as the pcg preconditioner precond_id = 1 call HYPRE_ParCSRPCGSetPrecond(solver, precond_id, 1 precond, ierr) ! Now setup and solve! call HYPRE_ParCSRPCGSetup(solver, parcsr_A, par_b, & par_x, ierr) call HYPRE_ParCSRPCGSolve(solver, parcsr_A, par_b, & par_x, ierr) ! Run info - needed logging turned on call HYPRE_ParCSRPCGGetNumIterations(solver, num_iterations, & ierr) call HYPRE_ParCSRPCGGetFinalRelative(solver, final_res_norm, & ierr) if ( myid .eq. 0 ) then print * print *, "Iterations = ", num_iterations print *, "Final Relative Residual Norm = ", final_res_norm print * endif ! Destroy solver call HYPRE_ParCSRPCGDestroy(solver, ierr) ! PCG with AMG preconditioner elseif ( solver_id == 1 ) then ! Create solver call HYPRE_ParCSRPCGCreate(MPI_COMM_WORLD, solver, ierr) ! Set some parameters (See Reference Manual for more parameters) call HYPRE_ParCSRPCGSetMaxIter(solver, 1000, ierr) call HYPRE_ParCSRPCGSetTol(solver, 1.0d-7, ierr) call HYPRE_ParCSRPCGSetTwoNorm(solver, 1, ierr) call HYPRE_ParCSRPCGSetPrintLevel(solver, 2, ierr) call HYPRE_ParCSRPCGSetLogging(solver, 1, ierr) ! Now set up the AMG preconditioner and specify any parameters call HYPRE_BoomerAMGCreate(precond, ierr) ! Set some parameters (See Reference Manual for more parameters) ! print less solver info since a preconditioner call HYPRE_BoomerAMGSetPrintLevel(precond, 1, ierr); ! Falgout coarsening call HYPRE_BoomerAMGSetCoarsenType(precond, 6, ierr) ! old defaults call HYPRE_BoomerAMGSetOldDefault(precond, ierr) ! SYMMETRIC G-S/Jacobi hybrid relaxation call HYPRE_BoomerAMGSetRelaxType(precond, 6, ierr) ! Sweeeps on each level call HYPRE_BoomerAMGSetNumSweeps(precond, 1, ierr) ! conv. tolerance call HYPRE_BoomerAMGSetTol(precond, 0.0d0, ierr) ! do only one iteration! call HYPRE_BoomerAMGSetMaxIter(precond, 1, ierr) ! set amg as the pcg preconditioner precond_id = 2 call HYPRE_ParCSRPCGSetPrecond(solver, precond_id, 1 precond, ierr) ! Now setup and solve! call HYPRE_ParCSRPCGSetup(solver, parcsr_A, par_b, 1 par_x, ierr) call HYPRE_ParCSRPCGSolve(solver, parcsr_A, par_b, 1 par_x, ierr) ! Run info - needed logging turned on call HYPRE_ParCSRPCGGetNumIterations(solver, num_iterations, 1 ierr) call HYPRE_ParCSRPCGGetFinalRelative(solver, final_res_norm, 1 ierr) if ( myid .eq. 0 ) then print * print *, "Iterations = ", num_iterations print *, "Final Relative Residual Norm = ", final_res_norm print * endif ! Destroy precond and solver call HYPRE_BoomerAMGDestroy(precond, ierr) call HYPRE_ParCSRPCGDestroy(solver, ierr) ! PCG with ParaSails elseif ( solver_id .eq. 8 ) then ! Create solver call HYPRE_ParCSRPCGCreate(MPI_COMM_WORLD, solver, ierr) ! Set some parameters (See Reference Manual for more parameters) call HYPRE_ParCSRPCGSetMaxIter(solver, 1000, ierr) call HYPRE_ParCSRPCGSetTol(solver, 1.0d-7, ierr) call HYPRE_ParCSRPCGSetTwoNorm(solver, 1, ierr) call HYPRE_ParCSRPCGSetPrintLevel(solver, 2, ierr) call HYPRE_ParCSRPCGSetLogging(solver, 1, ierr) ! Now set up the Parasails preconditioner and specify any parameters call HYPRE_ParaSailsCreate(MPI_COMM_WORLD, precond,ierr) call HYPRE_ParaSailsSetParams(precond, 0.1d0, 1, ierr) call HYPRE_ParaSailsSetFilter(precond, 0.05d0, ierr) call HYPRE_ParaSailsSetSym(precond, 1, ierr) call HYPRE_ParaSailsSetLogging(precond, 3, ierr) ! set parsails as the pcg preconditioner precond_id = 4 call HYPRE_ParCSRPCGSetPrecond(solver, precond_id, 1 precond, ierr) ! Now setup and solve! call HYPRE_ParCSRPCGSetup(solver, parcsr_A, par_b, 1 par_x, ierr) call HYPRE_ParCSRPCGSolve(solver, parcsr_A, par_b, 1 par_x, ierr) ! Run info - needed logging turned on call HYPRE_ParCSRPCGGetNumIterations(solver, num_iterations, 1 ierr) call HYPRE_ParCSRPCGGetFinalRelative(solver, final_res_norm, 1 ierr) if ( myid .eq. 0 ) then print * print *, "Iterations = ", num_iterations print *, "Final Relative Residual Norm = ", final_res_norm print * endif ! Destroy precond and solver call HYPRE_ParaSailsDestroy(precond, ierr) call HYPRE_ParCSRPCGDestroy(solver, ierr) else if ( myid .eq. 0 ) then print *,'Invalid solver id specified' stop endif endif ! Print the solution if ( print_solution .ne. 0 ) then call HYPRE_IJVectorPrint(x, "ij.out.x", ierr) endif ! Clean up call HYPRE_IJMatrixDestroy(A, ierr) call HYPRE_IJVectorDestroy(b, ierr) call HYPRE_IJVectorDestroy(x, ierr) call HYPRE_Finalize(ierr) ! Finalize MPI call MPI_Finalize(ierr) !$omp target exit data map(release:rhs_values) !$omp target exit data map(release:x_values) !$omp target exit data map(release:rows) !$omp target exit data map(release:cols) !$omp target exit data map(release:values) !$omp target exit data map(release:tmp) stop end hypre-2.33.0/src/examples/ex5f_cptr.f000066400000000000000000000374321477326011500174200ustar00rootroot00000000000000! Copyright (c) 1998 Lawrence Livermore National Security, LLC and other ! HYPRE Project Developers. See the top-level COPYRIGHT file for details. ! ! SPDX-License-Identifier: (Apache-2.0 OR MIT) ! ! Example 5 ! ! Interface: Linear-Algebraic (IJ), Fortran (77) version ! ! Compile with: make ex5f ! ! Sample run: mpirun -np 4 ex5f ! ! Description: This example solves the 2-D ! Laplacian problem with zero boundary conditions ! on an nxn grid. The number of unknowns is N=n^2. ! The standard 5-point stencil is used, and we solve ! for the interior nodes only. ! ! This example solves the same problem as Example 3. ! Available solvers are AMG, PCG, and PCG with AMG, ! and PCG with ParaSails ! ! ! Notes: for PCG, GMRES and BiCGStab, precond_id means: ! 0 - do not set up a preconditioner ! 1 - set up a ds preconditioner ! 2 - set up an amg preconditioner ! 3 - set up a pilut preconditioner ! 4 - set up a ParaSails preconditioner ! program ex5f use, intrinsic :: iso_c_binding use, intrinsic :: iso_fortran_env, only: int64 use cudaf implicit none include 'mpif.h' include 'HYPREf.h' integer, parameter :: MAX_LOCAL_SIZE = 123000 integer ierr integer num_procs, myid integer local_size, extra integer n, solver_id, print_solution, ng integer nnz, ilower, iupper, i integer precond_id; double precision h, h2 double precision, pointer :: rhs_values(:) double precision, pointer :: x_values(:) double precision, pointer :: values(:) integer, pointer :: rows(:) integer, pointer :: cols(:) integer, pointer :: tmpi(:) integer :: stat integer num_iterations double precision final_res_norm, tol integer mpi_comm integer*8 parcsr_A integer*8 A integer*8 b integer*8 x integer*8 par_b integer*8 par_x integer*8 solver integer*8 precond type(c_ptr) :: p_rhs_values type(c_ptr) :: p_x_values type(c_ptr) :: p_values type(c_ptr) :: p_rows type(c_ptr) :: p_cols type(c_ptr) :: p_tmpi stat = device_malloc_managed(int(MAX_LOCAL_SIZE * 8, int64), 1 p_rhs_values) stat = device_malloc_managed(int(MAX_LOCAL_SIZE * 8, int64), 1 p_x_values) stat = device_malloc_managed(int(5 * 8, int64), p_values) stat = device_malloc_managed(int(MAX_LOCAL_SIZE * 4, int64), 1 p_rows) stat = device_malloc_managed(int(5 * 4, int64), p_cols) stat = device_malloc_managed(int(2 * 4, int64), p_tmpi) call c_f_pointer(p_rhs_values, rhs_values, [MAX_LOCAL_SIZE]) call c_f_pointer(p_x_values, x_values, [MAX_LOCAL_SIZE]) call c_f_pointer(p_values, values, [5]) call c_f_pointer(p_rows, rows, [MAX_LOCAL_SIZE]) call c_f_pointer(p_cols, cols, [5]) call c_f_pointer(p_tmpi, tmpi, [2]) !----------------------------------------------------------------------- ! Initialize MPI !----------------------------------------------------------------------- call MPI_INIT(ierr) call MPI_COMM_RANK(MPI_COMM_WORLD, myid, ierr) call MPI_COMM_SIZE(MPI_COMM_WORLD, num_procs, ierr) mpi_comm = MPI_COMM_WORLD call HYPRE_Initialize(ierr) call HYPRE_SetMemoryLocation(HYPRE_MEMORY_DEVICE, ierr) call HYPRE_SetExecutionPolicy(HYPRE_EXEC_DEVICE, ierr) call HYPRE_SetSpGemmUseVendor(0, ierr) ! Default problem parameters n = 33 solver_id = 0 print_solution = 0 tol = 1.0d-7 ! The input section not implemented yet. ! Preliminaries: want at least one processor per row if ( n*n .lt. num_procs ) then n = int(sqrt(real(num_procs))) + 1 endif ! ng = global no. rows, h = mesh size ng = n*n h = 1.0d0/(n+1) h2 = h*h ! Each processor knows only of its own rows - the range is denoted by ilower ! and upper. Here we partition the rows. We account for the fact that ! N may not divide evenly by the number of processors. local_size = ng/num_procs extra = ng - local_size*num_procs ilower = local_size*myid ilower = ilower + min(myid, extra) iupper = local_size*(myid+1) iupper = iupper + min(myid+1, extra) iupper = iupper - 1 ! How many rows do I have? local_size = iupper - ilower + 1 ! Create the matrix. ! Note that this is a square matrix, so we indicate the row partition ! size twice (since number of rows = number of cols) call HYPRE_IJMatrixCreate(mpi_comm, ilower, 1 iupper, ilower, iupper, A, ierr) ! Choose a parallel csr format storage (see the User's Manual) call HYPRE_IJMatrixSetObjectType(A, HYPRE_PARCSR, ierr) ! Initialize before setting coefficients call HYPRE_IJMatrixInitialize(A, ierr) ! Now go through my local rows and set the matrix entries. ! Each row has at most 5 entries. For example, if n=3: ! ! A = [M -I 0; -I M -I; 0 -I M] ! M = [4 -1 0; -1 4 -1; 0 -1 4] ! ! Note that here we are setting one row at a time, though ! one could set all the rows together (see the User's Manual). do i = ilower, iupper nnz = 1 ! The left identity block:position i-n if ( (i-n) .ge. 0 ) then cols(nnz) = i-n values(nnz) = -1.0d0 nnz = nnz + 1 endif ! The left -1: position i-1 if ( mod(i,n).ne.0 ) then cols(nnz) = i-1 values(nnz) = -1.0d0 nnz = nnz + 1 endif ! Set the diagonal: position i cols(nnz) = i values(nnz) = 4.0d0 nnz = nnz + 1 ! The right -1: position i+1 if ( mod((i+1),n) .ne. 0 ) then cols(nnz) = i+1 values(nnz) = -1.0d0 nnz = nnz + 1 endif ! The right identity block:position i+n if ( (i+n) .lt. ng ) then cols(nnz) = i+n values(nnz) = -1.0d0 nnz = nnz + 1 endif ! Set the values for row i tmpi(1) = nnz-1 tmpi(2) = i call HYPRE_IJMatrixSetValues( 1 A, 1, tmpi(1), tmpi(2), cols, values, ierr) enddo ! Assemble after setting the coefficients call HYPRE_IJMatrixAssemble(A, ierr) ! Get parcsr matrix object call HYPRE_IJMatrixGetObject(A, parcsr_A, ierr) ! Create the rhs and solution call HYPRE_IJVectorCreate(mpi_comm, 1 ilower, iupper, b, ierr) call HYPRE_IJVectorSetObjectType(b, HYPRE_PARCSR, ierr) call HYPRE_IJVectorInitialize(b, ierr) call HYPRE_IJVectorCreate(mpi_comm, 1 ilower, iupper, x, ierr) call HYPRE_IJVectorSetObjectType(x, HYPRE_PARCSR, ierr) call HYPRE_IJVectorInitialize(x, ierr) ! Set the rhs values to h^2 and the solution to zero do i = 1, local_size rhs_values(i) = h2 x_values(i) = 0.0 rows(i) = ilower + i -1 enddo call HYPRE_IJVectorSetValues( 1 b, local_size, rows, rhs_values, ierr) call HYPRE_IJVectorSetValues( 1 x, local_size, rows, x_values, ierr) call HYPRE_IJVectorAssemble(b, ierr) call HYPRE_IJVectorAssemble(x, ierr) ! get the x and b objects call HYPRE_IJVectorGetObject(b, par_b, ierr) call HYPRE_IJVectorGetObject(x, par_x, ierr) ! Choose a solver and solve the system ! AMG if ( solver_id .eq. 0 ) then ! Create solver call HYPRE_BoomerAMGCreate(solver, ierr) ! Set some parameters (See Reference Manual for more parameters) ! print solve info + parameters call HYPRE_BoomerAMGSetPrintLevel(solver, 3, ierr) ! old defaults, Falgout coarsening, mod. class. interpolation call HYPRE_BoomerAMGSetOldDefault(solver, ierr) ! G-S/Jacobi hybrid relaxation call HYPRE_BoomerAMGSetRelaxType(solver, 3, ierr) ! C/F relaxation call HYPRE_BoomerAMGSetRelaxOrder(solver, 1, ierr) ! Sweeeps on each level call HYPRE_BoomerAMGSetNumSweeps(solver, 1, ierr) ! maximum number of levels call HYPRE_BoomerAMGSetMaxLevels(solver, 20, ierr) ! conv. tolerance call HYPRE_BoomerAMGSetTol(solver, 1.0d-7, ierr) ! Keep local transposes call HYPRE_BoomerAMGSetKeepTransp(solver, 1, ierr) ! Now setup and solve! call HYPRE_BoomerAMGSetup( 1 solver, parcsr_A, par_b, par_x, ierr) call HYPRE_BoomerAMGSolve( 1 solver, parcsr_A, par_b, par_x, ierr) ! Run info - needed logging turned on call HYPRE_BoomerAMGGetNumIterations(solver, num_iterations, 1 ierr) call HYPRE_BoomerAMGGetFinalReltvRes(solver, final_res_norm, 1 ierr) if ( myid .eq. 0 ) then print * print '(A,I2)', " Iterations = ", num_iterations print '(A,ES16.8)', 1 " Final Relative Residual Norm = ", final_res_norm print * endif ! Destroy solver call HYPRE_BoomerAMGDestroy(solver, ierr) ! PCG (with DS) elseif ( solver_id .eq. 50 ) then ! Create solver call HYPRE_ParCSRPCGCreate(MPI_COMM_WORLD, solver, ierr) ! Set some parameters (See Reference Manual for more parameters) call HYPRE_ParCSRPCGSetMaxIter(solver, 1000, ierr) call HYPRE_ParCSRPCGSetTol(solver, 1.0d-7, ierr) call HYPRE_ParCSRPCGSetTwoNorm(solver, 1, ierr) call HYPRE_ParCSRPCGSetPrintLevel(solver, 2, ierr) call HYPRE_ParCSRPCGSetLogging(solver, 1, ierr) ! set ds (diagonal scaling) as the pcg preconditioner precond_id = 1 call HYPRE_ParCSRPCGSetPrecond(solver, precond_id, 1 precond, ierr) ! Now setup and solve! call HYPRE_ParCSRPCGSetup(solver, parcsr_A, par_b, & par_x, ierr) call HYPRE_ParCSRPCGSolve(solver, parcsr_A, par_b, & par_x, ierr) ! Run info - needed logging turned on call HYPRE_ParCSRPCGGetNumIterations(solver, num_iterations, & ierr) call HYPRE_ParCSRPCGGetFinalRelative(solver, final_res_norm, & ierr) if ( myid .eq. 0 ) then print * print *, "Iterations = ", num_iterations print *, "Final Relative Residual Norm = ", final_res_norm print * endif ! Destroy solver call HYPRE_ParCSRPCGDestroy(solver, ierr) ! PCG with AMG preconditioner elseif ( solver_id == 1 ) then ! Create solver call HYPRE_ParCSRPCGCreate(MPI_COMM_WORLD, solver, ierr) ! Set some parameters (See Reference Manual for more parameters) call HYPRE_ParCSRPCGSetMaxIter(solver, 1000, ierr) call HYPRE_ParCSRPCGSetTol(solver, 1.0d-7, ierr) call HYPRE_ParCSRPCGSetTwoNorm(solver, 1, ierr) call HYPRE_ParCSRPCGSetPrintLevel(solver, 2, ierr) call HYPRE_ParCSRPCGSetLogging(solver, 1, ierr) ! Now set up the AMG preconditioner and specify any parameters call HYPRE_BoomerAMGCreate(precond, ierr) ! Set some parameters (See Reference Manual for more parameters) ! print less solver info since a preconditioner call HYPRE_BoomerAMGSetPrintLevel(precond, 1, ierr); ! Falgout coarsening call HYPRE_BoomerAMGSetCoarsenType(precond, 6, ierr) ! old defaults call HYPRE_BoomerAMGSetOldDefault(precond, ierr) ! SYMMETRIC G-S/Jacobi hybrid relaxation call HYPRE_BoomerAMGSetRelaxType(precond, 6, ierr) ! Sweeeps on each level call HYPRE_BoomerAMGSetNumSweeps(precond, 1, ierr) ! conv. tolerance call HYPRE_BoomerAMGSetTol(precond, 0.0d0, ierr) ! do only one iteration! call HYPRE_BoomerAMGSetMaxIter(precond, 1, ierr) ! set amg as the pcg preconditioner precond_id = 2 call HYPRE_ParCSRPCGSetPrecond(solver, precond_id, 1 precond, ierr) ! Now setup and solve! call HYPRE_ParCSRPCGSetup(solver, parcsr_A, par_b, 1 par_x, ierr) call HYPRE_ParCSRPCGSolve(solver, parcsr_A, par_b, 1 par_x, ierr) ! Run info - needed logging turned on call HYPRE_ParCSRPCGGetNumIterations(solver, num_iterations, 1 ierr) call HYPRE_ParCSRPCGGetFinalRelative(solver, final_res_norm, 1 ierr) if ( myid .eq. 0 ) then print * print *, "Iterations = ", num_iterations print *, "Final Relative Residual Norm = ", final_res_norm print * endif ! Destroy precond and solver call HYPRE_BoomerAMGDestroy(precond, ierr) call HYPRE_ParCSRPCGDestroy(solver, ierr) ! PCG with ParaSails elseif ( solver_id .eq. 8 ) then ! Create solver call HYPRE_ParCSRPCGCreate(MPI_COMM_WORLD, solver, ierr) ! Set some parameters (See Reference Manual for more parameters) call HYPRE_ParCSRPCGSetMaxIter(solver, 1000, ierr) call HYPRE_ParCSRPCGSetTol(solver, 1.0d-7, ierr) call HYPRE_ParCSRPCGSetTwoNorm(solver, 1, ierr) call HYPRE_ParCSRPCGSetPrintLevel(solver, 2, ierr) call HYPRE_ParCSRPCGSetLogging(solver, 1, ierr) ! Now set up the Parasails preconditioner and specify any parameters call HYPRE_ParaSailsCreate(MPI_COMM_WORLD, precond,ierr) call HYPRE_ParaSailsSetParams(precond, 0.1d0, 1, ierr) call HYPRE_ParaSailsSetFilter(precond, 0.05d0, ierr) call HYPRE_ParaSailsSetSym(precond, 1, ierr) call HYPRE_ParaSailsSetLogging(precond, 3, ierr) ! set parsails as the pcg preconditioner precond_id = 4 call HYPRE_ParCSRPCGSetPrecond(solver, precond_id, 1 precond, ierr) ! Now setup and solve! call HYPRE_ParCSRPCGSetup(solver, parcsr_A, par_b, 1 par_x, ierr) call HYPRE_ParCSRPCGSolve(solver, parcsr_A, par_b, 1 par_x, ierr) ! Run info - needed logging turned on call HYPRE_ParCSRPCGGetNumIterations(solver, num_iterations, 1 ierr) call HYPRE_ParCSRPCGGetFinalRelative(solver, final_res_norm, 1 ierr) if ( myid .eq. 0 ) then print * print *, "Iterations = ", num_iterations print *, "Final Relative Residual Norm = ", final_res_norm print * endif ! Destroy precond and solver call HYPRE_ParaSailsDestroy(precond, ierr) call HYPRE_ParCSRPCGDestroy(solver, ierr) else if ( myid .eq. 0 ) then print *,'Invalid solver id specified' stop endif endif ! Print the solution if ( print_solution .ne. 0 ) then call HYPRE_IJVectorPrint(x, "ij.out.x", ierr) endif ! Clean up call HYPRE_IJMatrixDestroy(A, ierr) call HYPRE_IJVectorDestroy(b, ierr) call HYPRE_IJVectorDestroy(x, ierr) call HYPRE_Finalize(ierr) ! Finalize MPI call MPI_Finalize(ierr) stat = device_free(p_rhs_values) stat = device_free(p_x_values) stat = device_free(p_rows) stat = device_free(p_cols) stat = device_free(p_tmpi) stat = device_free(p_values) end hypre-2.33.0/src/examples/ex6.c000066400000000000000000000502421477326011500162120ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /* Example 6 Interface: Semi-Structured interface (SStruct) Compile with: make ex6 Sample run: mpirun -np 2 ex6 Description: This is a two processor example and is the same problem as is solved with the structured interface in Example 2. (The grid boxes are exactly those in the example diagram in the struct interface chapter of the User's Manual. Processor 0 owns two boxes and processor 1 owns one box.) This is the simplest sstruct example, and it demonstrates how the semi-structured interface can be used for structured problems. There is one part and one variable. The solver is PCG with SMG preconditioner. We use a structured solver for this example. */ #include #include #include /* SStruct linear solvers headers */ #include "HYPRE_sstruct_ls.h" #include "ex.h" #ifdef HYPRE_EXVIS #include "vis.c" #endif int main (int argc, char *argv[]) { int myid, num_procs; int vis = 0; HYPRE_SStructGrid grid; HYPRE_SStructGraph graph; HYPRE_SStructStencil stencil; HYPRE_SStructMatrix A; HYPRE_SStructVector b; HYPRE_SStructVector x; /* We are using struct solvers for this example */ HYPRE_StructSolver solver; HYPRE_StructSolver precond; int object_type; /* Initialize MPI */ MPI_Init(&argc, &argv); MPI_Comm_rank(MPI_COMM_WORLD, &myid); MPI_Comm_size(MPI_COMM_WORLD, &num_procs); /* Initialize HYPRE */ HYPRE_Initialize(); /* Print GPU info */ /* HYPRE_PrintDeviceInfo(); */ if (num_procs != 2) { if (myid == 0) { printf("Must run with 2 processors!\n"); } MPI_Finalize(); return (0); } /* Parse command line */ { int arg_index = 0; int print_usage = 0; while (arg_index < argc) { if ( strcmp(argv[arg_index], "-vis") == 0 ) { arg_index++; vis = 1; } else if ( strcmp(argv[arg_index], "-help") == 0 ) { print_usage = 1; break; } else { arg_index++; } } if ((print_usage) && (myid == 0)) { printf("\n"); printf("Usage: %s []\n", argv[0]); printf("\n"); printf(" -vis : save the solution for GLVis visualization\n"); printf("\n"); } if (print_usage) { MPI_Finalize(); return (0); } } /* 1. Set up the 2D grid. This gives the index space in each part. Here we only use one part and one variable. (So the part id is 0 and the variable id is 0) */ { int ndim = 2; int nparts = 1; int part = 0; /* Create an empty 2D grid object */ HYPRE_SStructGridCreate(MPI_COMM_WORLD, ndim, nparts, &grid); /* Set the extents of the grid - each processor sets its grid boxes. Each part has its own relative index space numbering, but in this example all boxes belong to the same part. */ /* Processor 0 owns two boxes in the grid. */ if (myid == 0) { /* Add a new box to the grid */ { int ilower[2] = {-3, 1}; int iupper[2] = {-1, 2}; HYPRE_SStructGridSetExtents(grid, part, ilower, iupper); } /* Add a new box to the grid */ { int ilower[2] = {0, 1}; int iupper[2] = {2, 4}; HYPRE_SStructGridSetExtents(grid, part, ilower, iupper); } } /* Processor 1 owns one box in the grid. */ else if (myid == 1) { /* Add a new box to the grid */ { int ilower[2] = {3, 1}; int iupper[2] = {6, 4}; HYPRE_SStructGridSetExtents(grid, part, ilower, iupper); } } /* Set the variable type and number of variables on each part. */ { int i; int nvars = 1; HYPRE_SStructVariable vartypes[1] = {HYPRE_SSTRUCT_VARIABLE_CELL}; for (i = 0; i < nparts; i++) { HYPRE_SStructGridSetVariables(grid, i, nvars, vartypes); } } /* Now the grid is ready to use */ HYPRE_SStructGridAssemble(grid); } /* 2. Define the discretization stencil(s) */ { /* Create an empty 2D, 5-pt stencil object */ HYPRE_SStructStencilCreate(2, 5, &stencil); /* Define the geometry of the stencil. Each represents a relative offset (in the index space). */ { int entry; int offsets[5][2] = {{0, 0}, {-1, 0}, {1, 0}, {0, -1}, {0, 1}}; int var = 0; /* Assign numerical values to the offsets so that we can easily refer to them - the last argument indicates the variable for which we are assigning this stencil - we are just using one variable in this example so it is the first one (0) */ for (entry = 0; entry < 5; entry++) { HYPRE_SStructStencilSetEntry(stencil, entry, offsets[entry], var); } } } /* 3. Set up the Graph - this determines the non-zero structure of the matrix and allows non-stencil relationships between the parts */ { int var = 0; int part = 0; /* Create the graph object */ HYPRE_SStructGraphCreate(MPI_COMM_WORLD, grid, &graph); /* See MatrixSetObjectType below */ object_type = HYPRE_STRUCT; HYPRE_SStructGraphSetObjectType(graph, object_type); /* Now we need to tell the graph which stencil to use for each variable on each part (we only have one variable and one part) */ HYPRE_SStructGraphSetStencil(graph, part, var, stencil); /* Here we could establish connections between parts if we had more than one part using the graph. For example, we could use HYPRE_GraphAddEntries() routine or HYPRE_GridSetNeighborBox() */ /* Assemble the graph */ HYPRE_SStructGraphAssemble(graph); } /* 4. Set up a SStruct Matrix */ { int i, j; int part = 0; int var = 0; /* Create the empty matrix object */ HYPRE_SStructMatrixCreate(MPI_COMM_WORLD, graph, &A); /* Set the object type (by default HYPRE_SSTRUCT). This determines the data structure used to store the matrix. If you want to use unstructured solvers, e.g. BoomerAMG, the object type should be HYPRE_PARCSR. If the problem is purely structured (with one part), you may want to use HYPRE_STRUCT to access the structured solvers. Here we have a purely structured example. */ object_type = HYPRE_STRUCT; HYPRE_SStructMatrixSetObjectType(A, object_type); /* Get ready to set values */ HYPRE_SStructMatrixInitialize(A); /* Each processor must set the stencil values for their boxes on each part. In this example, we only set stencil entries and therefore use HYPRE_SStructMatrixSetBoxValues. If we need to set non-stencil entries, we have to use HYPRE_SStructMatrixSetValues (shown in a later example). */ if (myid == 0) { /* Set the matrix coefficients for some set of stencil entries over all the gridpoints in my first box (account for boundary grid points later) */ { int ilower[2] = {-3, 1}; int iupper[2] = {-1, 2}; int nentries = 5; int nvalues = 30; /* 6 grid points, each with 5 stencil entries */ /* double values[30]; OK to use constant-length array for CPUs */ double *values = (double *) malloc(30 * sizeof(double)); int stencil_indices[5]; for (j = 0; j < nentries; j++) /* label the stencil indices - these correspond to the offsets defined above */ { stencil_indices[j] = j; } for (i = 0; i < nvalues; i += nentries) { values[i] = 4.0; for (j = 1; j < nentries; j++) { values[i + j] = -1.0; } } HYPRE_SStructMatrixSetBoxValues(A, part, ilower, iupper, var, nentries, stencil_indices, values); free(values); } /* Set the matrix coefficients for some set of stencil entries over the gridpoints in my second box */ { int ilower[2] = {0, 1}; int iupper[2] = {2, 4}; int nentries = 5; int nvalues = 60; /* 12 grid points, each with 5 stencil entries */ /* double values[60]; OK to use constant-length array for CPUs */ double *values = (double *) malloc(60 * sizeof(double)); int stencil_indices[5]; for (j = 0; j < nentries; j++) { stencil_indices[j] = j; } for (i = 0; i < nvalues; i += nentries) { values[i] = 4.0; for (j = 1; j < nentries; j++) { values[i + j] = -1.0; } } HYPRE_SStructMatrixSetBoxValues(A, part, ilower, iupper, var, nentries, stencil_indices, values); free(values); } } else if (myid == 1) { /* Set the matrix coefficients for some set of stencil entries over the gridpoints in my box */ { int ilower[2] = {3, 1}; int iupper[2] = {6, 4}; int nentries = 5; int nvalues = 80; /* 16 grid points, each with 5 stencil entries */ /* double values[80]; OK to use constant-length array for CPUs */ double *values = (double *) malloc(80 * sizeof(double)); int stencil_indices[5]; for (j = 0; j < nentries; j++) { stencil_indices[j] = j; } for (i = 0; i < nvalues; i += nentries) { values[i] = 4.0; for (j = 1; j < nentries; j++) { values[i + j] = -1.0; } } HYPRE_SStructMatrixSetBoxValues(A, part, ilower, iupper, var, nentries, stencil_indices, values); free(values); } } /* For each box, set any coefficients that reach ouside of the boundary to 0 */ if (myid == 0) { int maxnvalues = 6; /* double values[6]; OK to use constant-length array for CPUs */ double *values = (double *) malloc(6 * sizeof(double)); for (i = 0; i < maxnvalues; i++) { values[i] = 0.0; } { /* Values below our first AND second box */ int ilower[2] = {-3, 1}; int iupper[2] = { 2, 1}; int stencil_indices[1] = {3}; HYPRE_SStructMatrixSetBoxValues(A, part, ilower, iupper, var, 1, stencil_indices, values); } { /* Values to the left of our first box */ int ilower[2] = {-3, 1}; int iupper[2] = {-3, 2}; int stencil_indices[1] = {1}; HYPRE_SStructMatrixSetBoxValues(A, part, ilower, iupper, var, 1, stencil_indices, values); } { /* Values above our first box */ int ilower[2] = {-3, 2}; int iupper[2] = {-1, 2}; int stencil_indices[1] = {4}; HYPRE_SStructMatrixSetBoxValues(A, part, ilower, iupper, var, 1, stencil_indices, values); } { /* Values to the left of our second box (that do not border the first box). */ int ilower[2] = { 0, 3}; int iupper[2] = { 0, 4}; int stencil_indices[1] = {1}; HYPRE_SStructMatrixSetBoxValues(A, part, ilower, iupper, var, 1, stencil_indices, values); } { /* Values above our second box */ int ilower[2] = { 0, 4}; int iupper[2] = { 2, 4}; int stencil_indices[1] = {4}; HYPRE_SStructMatrixSetBoxValues(A, part, ilower, iupper, var, 1, stencil_indices, values); } free(values); } else if (myid == 1) { int maxnvalues = 4; /* double values[4]; OK to use constant-length array for CPUs */ double *values = (double *) malloc(4 * sizeof(double)); for (i = 0; i < maxnvalues; i++) { values[i] = 0.0; } { /* Values below our box */ int ilower[2] = { 3, 1}; int iupper[2] = { 6, 1}; int stencil_indices[1] = {3}; HYPRE_SStructMatrixSetBoxValues(A, part, ilower, iupper, var, 1, stencil_indices, values); } { /* Values to the right of our box */ int ilower[2] = { 6, 1}; int iupper[2] = { 6, 4}; int stencil_indices[1] = {2}; HYPRE_SStructMatrixSetBoxValues(A, part, ilower, iupper, var, 1, stencil_indices, values); } { /* Values above our box */ int ilower[2] = { 3, 4}; int iupper[2] = { 6, 4}; int stencil_indices[1] = {4}; HYPRE_SStructMatrixSetBoxValues(A, part, ilower, iupper, var, 1, stencil_indices, values); } free(values); } /* This is a collective call finalizing the matrix assembly. The matrix is now ``ready to be used'' */ HYPRE_SStructMatrixAssemble(A); } /* 5. Set up SStruct Vectors for b and x */ { int i; /* We have one part and one variable. */ int part = 0; int var = 0; /* Create an empty vector object */ HYPRE_SStructVectorCreate(MPI_COMM_WORLD, grid, &b); HYPRE_SStructVectorCreate(MPI_COMM_WORLD, grid, &x); /* As with the matrix, set the object type for the vectors to be the struct type */ object_type = HYPRE_STRUCT; HYPRE_SStructVectorSetObjectType(b, object_type); HYPRE_SStructVectorSetObjectType(x, object_type); /* Indicate that the vector coefficients are ready to be set */ HYPRE_SStructVectorInitialize(b); HYPRE_SStructVectorInitialize(x); if (myid == 0) { /* Set the vector coefficients over the gridpoints in my first box */ { int ilower[2] = {-3, 1}; int iupper[2] = {-1, 2}; int nvalues = 6; /* 6 grid points */ /* double values[6]; OK to use constant-length array for CPUs */ double *values = (double *) malloc(6 * sizeof(double)); for (i = 0; i < nvalues; i ++) { values[i] = 1.0; } HYPRE_SStructVectorSetBoxValues(b, part, ilower, iupper, var, values); for (i = 0; i < nvalues; i ++) { values[i] = 0.0; } HYPRE_SStructVectorSetBoxValues(x, part, ilower, iupper, var, values); free(values); } /* Set the vector coefficients over the gridpoints in my second box */ { int ilower[2] = { 0, 1}; int iupper[2] = { 2, 4}; int nvalues = 12; /* 12 grid points */ /* double values[12]; OK to use constant-length array for CPUs */ double *values = (double *) malloc(12 * sizeof(double)); for (i = 0; i < nvalues; i ++) { values[i] = 1.0; } HYPRE_SStructVectorSetBoxValues(b, part, ilower, iupper, var, values); for (i = 0; i < nvalues; i ++) { values[i] = 0.0; } HYPRE_SStructVectorSetBoxValues(x, part, ilower, iupper, var, values); free(values); } } else if (myid == 1) { /* Set the vector coefficients over the gridpoints in my box */ { int ilower[2] = { 3, 1}; int iupper[2] = { 6, 4}; int nvalues = 16; /* 16 grid points */ /* double values[16]; OK to use constant-length array for CPUs */ double *values = (double *) malloc(16 * sizeof(double)); for (i = 0; i < nvalues; i ++) { values[i] = 1.0; } HYPRE_SStructVectorSetBoxValues(b, part, ilower, iupper, var, values); for (i = 0; i < nvalues; i ++) { values[i] = 0.0; } HYPRE_SStructVectorSetBoxValues(x, part, ilower, iupper, var, values); free(values); } } /* This is a collective call finalizing the vector assembly. The vectors are now ``ready to be used'' */ HYPRE_SStructVectorAssemble(b); HYPRE_SStructVectorAssemble(x); } /* 6. Set up and use a solver (See the Reference Manual for descriptions of all of the options.) */ { HYPRE_StructMatrix sA; HYPRE_StructVector sb; HYPRE_StructVector sx; /* Because we are using a struct solver, we need to get the object of the matrix and vectors to pass in to the struct solvers */ HYPRE_SStructMatrixGetObject(A, (void **) &sA); HYPRE_SStructVectorGetObject(b, (void **) &sb); HYPRE_SStructVectorGetObject(x, (void **) &sx); /* Create an empty PCG Struct solver */ HYPRE_StructPCGCreate(MPI_COMM_WORLD, &solver); /* Set PCG parameters */ HYPRE_StructPCGSetTol(solver, 1.0e-06); HYPRE_StructPCGSetPrintLevel(solver, 2); HYPRE_StructPCGSetMaxIter(solver, 50); /* Create the Struct SMG solver for use as a preconditioner */ HYPRE_StructSMGCreate(MPI_COMM_WORLD, &precond); /* Set SMG parameters */ HYPRE_StructSMGSetMaxIter(precond, 1); HYPRE_StructSMGSetTol(precond, 0.0); HYPRE_StructSMGSetZeroGuess(precond); HYPRE_StructSMGSetNumPreRelax(precond, 1); HYPRE_StructSMGSetNumPostRelax(precond, 1); /* Set preconditioner and solve */ HYPRE_StructPCGSetPrecond(solver, HYPRE_StructSMGSolve, HYPRE_StructSMGSetup, precond); HYPRE_StructPCGSetup(solver, sA, sb, sx); HYPRE_StructPCGSolve(solver, sA, sb, sx); } /* Save the solution for GLVis visualization, see vis/glvis-ex6.sh */ if (vis) { #ifdef HYPRE_EXVIS GLVis_PrintSStructGrid(grid, "vis/ex6.mesh", myid, NULL, NULL); GLVis_PrintSStructVector(x, 0, "vis/ex6.sol", myid); GLVis_PrintData("vis/ex6.data", myid, num_procs); #endif } /* Free memory */ HYPRE_SStructGridDestroy(grid); HYPRE_SStructStencilDestroy(stencil); HYPRE_SStructGraphDestroy(graph); HYPRE_SStructMatrixDestroy(A); HYPRE_SStructVectorDestroy(b); HYPRE_SStructVectorDestroy(x); HYPRE_StructPCGDestroy(solver); HYPRE_StructSMGDestroy(precond); /* Finalize HYPRE */ HYPRE_Finalize(); /* Finalize MPI */ MPI_Finalize(); return (0); } hypre-2.33.0/src/examples/ex7.c000066400000000000000000001236241477326011500162200ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /* Example 7 Interface: SStructured interface (SStruct) Compile with: make ex7 Sample run: mpirun -np 16 ex7 -n 33 -solver 10 -K 3 -B 0 -C 1 -U0 2 -F 4 To see options: ex7 -help Description: This example uses the sstruct interface to solve the same problem as was solved in Example 4 with the struct interface. Therefore, there is only one part and one variable. This code solves the convection-reaction-diffusion problem div (-K grad u + B u) + C u = F in the unit square with boundary condition u = U0. The domain is split into N x N processor grid. Thus, the given number of processors should be a perfect square. Each processor has a n x n grid, with nodes connected by a 5-point stencil. We use cell-centered variables, and, therefore, the nodes are not shared. To incorporate the boundary conditions, we do the following: Let x_i and x_b be the interior and boundary parts of the solution vector x. If we split the matrix A as A = [A_ii A_ib; A_bi A_bb], then we solve [A_ii 0; 0 I] [x_i ; x_b] = [b_i - A_ib u_0; u_0]. Note that this differs from Example 3 in that we are actually solving for the boundary conditions (so they may not be exact as in ex3, where we only solved for the interior). This approach is useful for more general types of b.c. As in the previous example (Example 6), we use a structured solver. A number of structured solvers are available. More information can be found in the Solvers and Preconditioners chapter of the User's Manual. */ #include #include #include #include #include "HYPRE_krylov.h" #include "HYPRE_sstruct_ls.h" #include "ex.h" #ifdef M_PI #define PI M_PI #else #define PI 3.14159265358979 #endif #ifdef HYPRE_EXVIS #include "vis.c" #endif /* Macro to evaluate a function F in the grid point (i,j) */ #define Eval(F,i,j) (F( (ilower[0]+(i))*h, (ilower[1]+(j))*h )) #define bcEval(F,i,j) (F( (bc_ilower[0]+(i))*h, (bc_ilower[1]+(j))*h )) int optionK, optionB, optionC, optionU0, optionF; /* Diffusion coefficient */ double K(double x, double y) { switch (optionK) { case 0: return 1.0; case 1: return x * x + exp(y); case 2: if ((fabs(x - 0.5) < 0.25) && (fabs(y - 0.5) < 0.25)) { return 100.0; } else { return 1.0; } case 3: if (((x - 0.5) * (x - 0.5) + (y - 0.5) * (y - 0.5)) < 0.0625) { return 10.0; } else { return 1.0; } default: return 1.0; } } /* Convection vector, first component */ double B1(double x, double y) { switch (optionB) { case 0: return 0.0; case 1: return -0.1; case 2: return 0.25; case 3: return 1.0; default: return 0.0; } } /* Convection vector, second component */ double B2(double x, double y) { switch (optionB) { case 0: return 0.0; case 1: return 0.1; case 2: return -0.25; case 3: return 1.0; default: return 0.0; } } /* Reaction coefficient */ double C(double x, double y) { switch (optionC) { case 0: return 0.0; case 1: return 10.0; case 2: return 100.0; default: return 0.0; } } /* Boundary condition */ double U0(double x, double y) { switch (optionU0) { case 0: return 0.0; case 1: return (x + y) / 100; case 2: return (sin(5 * PI * x) + sin(5 * PI * y)) / 1000; default: return 0.0; } } /* Right-hand side */ double F(double x, double y) { switch (optionF) { case 0: return 1.0; case 1: return 0.0; case 2: return 2 * PI * PI * sin(PI * x) * sin(PI * y); case 3: if ((fabs(x - 0.5) < 0.25) && (fabs(y - 0.5) < 0.25)) { return -1.0; } else { return 1.0; } case 4: if (((x - 0.5) * (x - 0.5) + (y - 0.5) * (y - 0.5)) < 0.0625) { return -1.0; } else { return 1.0; } default: return 1.0; } } int main (int argc, char *argv[]) { int i, j, k; int myid, num_procs; int n, N, pi, pj; double h, h2; int ilower[2], iupper[2]; int solver_id; int n_pre, n_post; int rap, relax, skip, sym; double mytime = 0.0; double walltime = 0.0; int object_type; int num_iterations; double final_res_norm; int vis; HYPRE_SStructGrid grid; HYPRE_SStructStencil stencil; HYPRE_SStructGraph graph; HYPRE_SStructMatrix A; HYPRE_SStructVector b; HYPRE_SStructVector x; /* We are using struct solvers for this example */ HYPRE_StructSolver solver; HYPRE_StructSolver precond; /* Initialize MPI */ MPI_Init(&argc, &argv); MPI_Comm_rank(MPI_COMM_WORLD, &myid); MPI_Comm_size(MPI_COMM_WORLD, &num_procs); /* Initialize HYPRE */ HYPRE_Initialize(); /* Print GPU info */ /* HYPRE_PrintDeviceInfo(); */ /* Set default parameters */ n = 33; optionK = 0; optionB = 0; optionC = 0; optionU0 = 0; optionF = 0; solver_id = 10; n_pre = 1; n_post = 1; rap = 0; relax = 1; skip = 0; sym = 0; vis = 0; /* Parse command line */ { int arg_index = 0; int print_usage = 0; while (arg_index < argc) { if ( strcmp(argv[arg_index], "-n") == 0 ) { arg_index++; n = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-K") == 0 ) { arg_index++; optionK = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-B") == 0 ) { arg_index++; optionB = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-C") == 0 ) { arg_index++; optionC = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-U0") == 0 ) { arg_index++; optionU0 = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-F") == 0 ) { arg_index++; optionF = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-solver") == 0 ) { arg_index++; solver_id = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-v") == 0 ) { arg_index++; n_pre = atoi(argv[arg_index++]); n_post = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-rap") == 0 ) { arg_index++; rap = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-relax") == 0 ) { arg_index++; relax = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-skip") == 0 ) { arg_index++; skip = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-sym") == 0 ) { arg_index++; sym = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-vis") == 0 ) { arg_index++; vis = 1; } else if ( strcmp(argv[arg_index], "-help") == 0 ) { print_usage = 1; break; } else { arg_index++; } } if ((print_usage) && (myid == 0)) { printf("\n"); printf("Usage: %s []\n", argv[0]); printf("\n"); printf(" -n : problem size per processor (default: 8)\n"); printf(" -K : choice for the diffusion coefficient (default: 1)\n"); printf(" -B : choice for the convection vector (default: 0)\n"); printf(" -C : choice for the reaction coefficient (default: 0)\n"); printf(" -U0 : choice for the boundary condition (default: 0)\n"); printf(" -F : choice for the right-hand side (default: 1) \n"); printf(" -solver : solver ID\n"); printf(" 0 - SMG \n"); printf(" 1 - PFMG\n"); printf(" 10 - CG with SMG precond (default)\n"); printf(" 11 - CG with PFMG precond\n"); printf(" 17 - CG with 2-step Jacobi\n"); printf(" 18 - CG with diagonal scaling\n"); printf(" 19 - CG\n"); printf(" 30 - GMRES with SMG precond\n"); printf(" 31 - GMRES with PFMG precond\n"); printf(" 37 - GMRES with 2-step Jacobi\n"); printf(" 38 - GMRES with diagonal scaling\n"); printf(" 39 - GMRES\n"); printf(" -v : number of pre and post relaxations\n"); printf(" -rap : coarse grid operator type\n"); printf(" 0 - Galerkin (default)\n"); printf(" 1 - non-Galerkin ParFlow operators\n"); printf(" 2 - Galerkin, general operators\n"); printf(" -relax : relaxation type\n"); printf(" 0 - Jacobi\n"); printf(" 1 - Weighted Jacobi (default)\n"); printf(" 2 - R/B Gauss-Seidel\n"); printf(" 3 - R/B Gauss-Seidel (nonsymmetric)\n"); printf(" -skip : skip levels in PFMG (0 or 1)\n"); printf(" -sym : symmetric storage (1) or not (0)\n"); printf(" -vis : save the solution for GLVis visualization\n"); printf("\n"); } if (print_usage) { MPI_Finalize(); return (0); } } /* Convection produces non-symmetric matrices */ if (optionB && sym) { optionB = 0; } /* Figure out the processor grid (N x N). The local problem size is indicated by n (n x n). pi and pj indicate position in the processor grid. */ N = sqrt(num_procs); h = 1.0 / (N * n - 1); h2 = h * h; pj = myid / N; pi = myid - pj * N; /* Define the nodes owned by the current processor (each processor's piece of the global grid) */ ilower[0] = pi * n; ilower[1] = pj * n; iupper[0] = ilower[0] + n - 1; iupper[1] = ilower[1] + n - 1; /* 1. Set up a 2D grid */ { int ndim = 2; int nparts = 1; int nvars = 1; int part = 0; int i; /* Create an empty 2D grid object */ HYPRE_SStructGridCreate(MPI_COMM_WORLD, ndim, nparts, &grid); /* Add a new box to the grid */ HYPRE_SStructGridSetExtents(grid, part, ilower, iupper); /* Set the variable type for each part */ { HYPRE_SStructVariable vartypes[1] = {HYPRE_SSTRUCT_VARIABLE_CELL}; for (i = 0; i < nparts; i++) { HYPRE_SStructGridSetVariables(grid, i, nvars, vartypes); } } /* This is a collective call finalizing the grid assembly. The grid is now ``ready to be used'' */ HYPRE_SStructGridAssemble(grid); } /* 2. Define the discretization stencil */ { int ndim = 2; int var = 0; if (sym == 0) { /* Define the geometry of the stencil */ int offsets[5][2] = {{0, 0}, {-1, 0}, {1, 0}, {0, -1}, {0, 1}}; /* Create an empty 2D, 5-pt stencil object */ HYPRE_SStructStencilCreate(ndim, 5, &stencil); /* Assign stencil entries */ for (i = 0; i < 5; i++) { HYPRE_SStructStencilSetEntry(stencil, i, offsets[i], var); } } else /* Symmetric storage */ { /* Define the geometry of the stencil */ int offsets[3][2] = {{0, 0}, {1, 0}, {0, 1}}; /* Create an empty 2D, 3-pt stencil object */ HYPRE_SStructStencilCreate(ndim, 3, &stencil); /* Assign stencil entries */ for (i = 0; i < 3; i++) { HYPRE_SStructStencilSetEntry(stencil, i, offsets[i], var); } } } /* 3. Set up the Graph - this determines the non-zero structure of the matrix */ { int var = 0; int part = 0; /* Create the graph object */ HYPRE_SStructGraphCreate(MPI_COMM_WORLD, grid, &graph); /* See MatrixSetObjectType below */ object_type = HYPRE_STRUCT; HYPRE_SStructGraphSetObjectType(graph, object_type); /* Now we need to tell the graph which stencil to use for each variable on each part (we only have one variable and one part)*/ HYPRE_SStructGraphSetStencil(graph, part, var, stencil); /* Here we could establish connections between parts if we had more than one part. */ /* Assemble the graph */ HYPRE_SStructGraphAssemble(graph); } /* 4. Set up SStruct Vectors for b and x */ { double *values; /* We have one part and one variable. */ int part = 0; int var = 0; /* Create an empty vector object */ HYPRE_SStructVectorCreate(MPI_COMM_WORLD, grid, &b); HYPRE_SStructVectorCreate(MPI_COMM_WORLD, grid, &x); /* Set the object type (by default HYPRE_SSTRUCT). This determines the data structure used to store the matrix. If you want to use unstructured solvers, e.g. BoomerAMG, the object type should be HYPRE_PARCSR. If the problem is purely structured (with one part), you may want to use HYPRE_STRUCT to access the structured solvers. Here we have a purely structured example. */ object_type = HYPRE_STRUCT; HYPRE_SStructVectorSetObjectType(b, object_type); HYPRE_SStructVectorSetObjectType(x, object_type); /* Indicate that the vector coefficients are ready to be set */ HYPRE_SStructVectorInitialize(b); HYPRE_SStructVectorInitialize(x); values = (double*) calloc((n * n), sizeof(double)); /* Set the values of b in left-to-right, bottom-to-top order */ for (k = 0, j = 0; j < n; j++) for (i = 0; i < n; i++, k++) { values[k] = h2 * Eval(F, i, j); } HYPRE_SStructVectorSetBoxValues(b, part, ilower, iupper, var, values); /* Set x = 0 */ for (i = 0; i < (n * n); i ++) { values[i] = 0.0; } HYPRE_SStructVectorSetBoxValues(x, part, ilower, iupper, var, values); free(values); /* Assembling is postponed since the vectors will be further modified */ } /* 4. Set up a SStruct Matrix */ { /* We have one part and one variable. */ int part = 0; int var = 0; /* Create an empty matrix object */ HYPRE_SStructMatrixCreate(MPI_COMM_WORLD, graph, &A); /* Use symmetric storage? The function below is for symmetric stencil entries (use HYPRE_SStructMatrixSetNSSymmetric for non-stencil entries) */ HYPRE_SStructMatrixSetSymmetric(A, part, var, var, sym); /* As with the vectors, set the object type for the vectors to be the struct type */ object_type = HYPRE_STRUCT; HYPRE_SStructMatrixSetObjectType(A, object_type); /* Indicate that the matrix coefficients are ready to be set */ HYPRE_SStructMatrixInitialize(A); /* Set the stencil values in the interior. Here we set the values at every node. We will modify the boundary nodes later. */ if (sym == 0) { int stencil_indices[5] = {0, 1, 2, 3, 4}; /* labels correspond to the offsets */ double *values; values = (double*) calloc(5 * (n * n), sizeof(double)); /* The order is left-to-right, bottom-to-top */ for (k = 0, j = 0; j < n; j++) for (i = 0; i < n; i++, k += 5) { values[k + 1] = - Eval(K, i - 0.5, j) - Eval(B1, i - 0.5, j); values[k + 2] = - Eval(K, i + 0.5, j) + Eval(B1, i + 0.5, j); values[k + 3] = - Eval(K, i, j - 0.5) - Eval(B2, i, j - 0.5); values[k + 4] = - Eval(K, i, j + 0.5) + Eval(B2, i, j + 0.5); values[k] = h2 * Eval(C, i, j) + Eval(K, i - 0.5, j) + Eval(K, i + 0.5, j) + Eval(K, i, j - 0.5) + Eval(K, i, j + 0.5) - Eval(B1, i - 0.5, j) + Eval(B1, i + 0.5, j) - Eval(B2, i, j - 0.5) + Eval(B2, i, j + 0.5); } HYPRE_SStructMatrixSetBoxValues(A, part, ilower, iupper, var, 5, stencil_indices, values); free(values); } else /* Symmetric storage */ { int stencil_indices[3] = {0, 1, 2}; double *values; values = (double*) calloc(3 * (n * n), sizeof(double)); /* The order is left-to-right, bottom-to-top */ for (k = 0, j = 0; j < n; j++) for (i = 0; i < n; i++, k += 3) { values[k + 1] = - Eval(K, i + 0.5, j); values[k + 2] = - Eval(K, i, j + 0.5); values[k] = h2 * Eval(C, i, j) + Eval(K, i + 0.5, j) + Eval(K, i, j + 0.5) + Eval(K, i - 0.5, j) + Eval(K, i, j - 0.5); } HYPRE_SStructMatrixSetBoxValues(A, part, ilower, iupper, var, 3, stencil_indices, values); free(values); } } /* 5. Set the boundary conditions, while eliminating the coefficients reaching ouside of the domain boundary. We must modify the matrix stencil and the corresponding rhs entries. */ { int bc_ilower[2]; int bc_iupper[2]; int stencil_indices[5] = {0, 1, 2, 3, 4}; double *values, *bvalues; int nentries; /* We have one part and one variable. */ int part = 0; int var = 0; if (sym == 0) { nentries = 5; } else { nentries = 3; } values = (double*) calloc(nentries * n, sizeof(double)); bvalues = (double*) calloc(n, sizeof(double)); /* The stencil at the boundary nodes is 1-0-0-0-0. Because we have I x_b = u_0; */ for (i = 0; i < nentries * n; i += nentries) { values[i] = 1.0; for (j = 1; j < nentries; j++) { values[i + j] = 0.0; } } /* Processors at y = 0 */ if (pj == 0) { bc_ilower[0] = pi * n; bc_ilower[1] = pj * n; bc_iupper[0] = bc_ilower[0] + n - 1; bc_iupper[1] = bc_ilower[1]; /* Modify the matrix */ HYPRE_SStructMatrixSetBoxValues(A, part, bc_ilower, bc_iupper, var, nentries, stencil_indices, values); /* Put the boundary conditions in b */ for (i = 0; i < n; i++) { bvalues[i] = bcEval(U0, i, 0); } HYPRE_SStructVectorSetBoxValues(b, part, bc_ilower, bc_iupper, var, bvalues); } /* Processors at y = 1 */ if (pj == N - 1) { bc_ilower[0] = pi * n; bc_ilower[1] = pj * n + n - 1; bc_iupper[0] = bc_ilower[0] + n - 1; bc_iupper[1] = bc_ilower[1]; /* Modify the matrix */ HYPRE_SStructMatrixSetBoxValues(A, part, bc_ilower, bc_iupper, var, nentries, stencil_indices, values); /* Put the boundary conditions in b */ for (i = 0; i < n; i++) { bvalues[i] = bcEval(U0, i, 0); } HYPRE_SStructVectorSetBoxValues(b, part, bc_ilower, bc_iupper, var, bvalues); } /* Processors at x = 0 */ if (pi == 0) { bc_ilower[0] = pi * n; bc_ilower[1] = pj * n; bc_iupper[0] = bc_ilower[0]; bc_iupper[1] = bc_ilower[1] + n - 1; /* Modify the matrix */ HYPRE_SStructMatrixSetBoxValues(A, part, bc_ilower, bc_iupper, var, nentries, stencil_indices, values); /* Put the boundary conditions in b */ for (j = 0; j < n; j++) { bvalues[j] = bcEval(U0, 0, j); } HYPRE_SStructVectorSetBoxValues(b, part, bc_ilower, bc_iupper, var, bvalues); } /* Processors at x = 1 */ if (pi == N - 1) { bc_ilower[0] = pi * n + n - 1; bc_ilower[1] = pj * n; bc_iupper[0] = bc_ilower[0]; bc_iupper[1] = bc_ilower[1] + n - 1; /* Modify the matrix */ HYPRE_SStructMatrixSetBoxValues(A, part, bc_ilower, bc_iupper, var, nentries, stencil_indices, values); /* Put the boundary conditions in b */ for (j = 0; j < n; j++) { bvalues[j] = bcEval(U0, 0, j); } HYPRE_SStructVectorSetBoxValues(b, part, bc_ilower, bc_iupper, var, bvalues); } /* Recall that the system we are solving is: [A_ii 0; 0 I] [x_i ; x_b] = [b_i - A_ib u_0; u_0]. This requires removing the connections between the interior and boundary nodes that we have set up when we set the 5pt stencil at each node. We adjust for removing these connections by appropriately modifying the rhs. For the symm ordering scheme, just do the top and right boundary */ /* Processors at y = 0, neighbors of boundary nodes */ if (pj == 0) { bc_ilower[0] = pi * n; bc_ilower[1] = pj * n + 1; bc_iupper[0] = bc_ilower[0] + n - 1; bc_iupper[1] = bc_ilower[1]; stencil_indices[0] = 3; /* Modify the matrix */ for (i = 0; i < n; i++) { bvalues[i] = 0.0; } if (sym == 0) HYPRE_SStructMatrixSetBoxValues(A, part, bc_ilower, bc_iupper, var, 1, stencil_indices, bvalues); /* Eliminate the boundary conditions in b */ for (i = 0; i < n; i++) { bvalues[i] = bcEval(U0, i, -1) * (bcEval(K, i, -0.5) + bcEval(B2, i, -0.5)); } if (pi == 0) { bvalues[0] = 0.0; } if (pi == N - 1) { bvalues[n - 1] = 0.0; } /* Note the use of AddToBoxValues (because we have already set values at these nodes) */ HYPRE_SStructVectorAddToBoxValues(b, part, bc_ilower, bc_iupper, var, bvalues); } /* Processors at x = 0, neighbors of boundary nodes */ if (pi == 0) { bc_ilower[0] = pi * n + 1; bc_ilower[1] = pj * n; bc_iupper[0] = bc_ilower[0]; bc_iupper[1] = bc_ilower[1] + n - 1; stencil_indices[0] = 1; /* Modify the matrix */ for (j = 0; j < n; j++) { bvalues[j] = 0.0; } if (sym == 0) HYPRE_SStructMatrixSetBoxValues(A, part, bc_ilower, bc_iupper, var, 1, stencil_indices, bvalues); /* Eliminate the boundary conditions in b */ for (j = 0; j < n; j++) { bvalues[j] = bcEval(U0, -1, j) * (bcEval(K, -0.5, j) + bcEval(B1, -0.5, j)); } if (pj == 0) { bvalues[0] = 0.0; } if (pj == N - 1) { bvalues[n - 1] = 0.0; } HYPRE_SStructVectorAddToBoxValues(b, part, bc_ilower, bc_iupper, var, bvalues); } /* Processors at y = 1, neighbors of boundary nodes */ if (pj == N - 1) { bc_ilower[0] = pi * n; bc_ilower[1] = pj * n + (n - 1) - 1; bc_iupper[0] = bc_ilower[0] + n - 1; bc_iupper[1] = bc_ilower[1]; if (sym == 0) { stencil_indices[0] = 4; } else { stencil_indices[0] = 2; } /* Modify the matrix */ for (i = 0; i < n; i++) { bvalues[i] = 0.0; } HYPRE_SStructMatrixSetBoxValues(A, part, bc_ilower, bc_iupper, var, 1, stencil_indices, bvalues); /* Eliminate the boundary conditions in b */ for (i = 0; i < n; i++) { bvalues[i] = bcEval(U0, i, 1) * (bcEval(K, i, 0.5) + bcEval(B2, i, 0.5)); } if (pi == 0) { bvalues[0] = 0.0; } if (pi == N - 1) { bvalues[n - 1] = 0.0; } HYPRE_SStructVectorAddToBoxValues(b, part, bc_ilower, bc_iupper, var, bvalues); } /* Processors at x = 1, neighbors of boundary nodes */ if (pi == N - 1) { bc_ilower[0] = pi * n + (n - 1) - 1; bc_ilower[1] = pj * n; bc_iupper[0] = bc_ilower[0]; bc_iupper[1] = bc_ilower[1] + n - 1; if (sym == 0) { stencil_indices[0] = 2; } else { stencil_indices[0] = 1; } /* Modify the matrix */ for (j = 0; j < n; j++) { bvalues[j] = 0.0; } HYPRE_SStructMatrixSetBoxValues(A, part, bc_ilower, bc_iupper, var, 1, stencil_indices, bvalues); /* Eliminate the boundary conditions in b */ for (j = 0; j < n; j++) { bvalues[j] = bcEval(U0, 1, j) * (bcEval(K, 0.5, j) + bcEval(B1, 0.5, j)); } if (pj == 0) { bvalues[0] = 0.0; } if (pj == N - 1) { bvalues[n - 1] = 0.0; } HYPRE_SStructVectorAddToBoxValues(b, part, bc_ilower, bc_iupper, var, bvalues); } free(values); free(bvalues); } /* Finalize the vector and matrix assembly */ HYPRE_SStructMatrixAssemble(A); HYPRE_SStructVectorAssemble(b); HYPRE_SStructVectorAssemble(x); /* 6. Set up and use a solver */ { HYPRE_StructMatrix sA; HYPRE_StructVector sb; HYPRE_StructVector sx; /* Because we are using a struct solver, we need to get the object of the matrix and vectors to pass in to the struct solvers */ HYPRE_SStructMatrixGetObject(A, (void **) &sA); HYPRE_SStructVectorGetObject(b, (void **) &sb); HYPRE_SStructVectorGetObject(x, (void **) &sx); if (solver_id == 0) /* SMG */ { /* Start timing */ mytime -= MPI_Wtime(); /* Options and setup */ HYPRE_StructSMGCreate(MPI_COMM_WORLD, &solver); HYPRE_StructSMGSetMemoryUse(solver, 0); HYPRE_StructSMGSetMaxIter(solver, 50); HYPRE_StructSMGSetTol(solver, 1.0e-06); HYPRE_StructSMGSetRelChange(solver, 0); HYPRE_StructSMGSetNumPreRelax(solver, n_pre); HYPRE_StructSMGSetNumPostRelax(solver, n_post); HYPRE_StructSMGSetPrintLevel(solver, 1); HYPRE_StructSMGSetLogging(solver, 1); HYPRE_StructSMGSetup(solver, sA, sb, sx); /* Finalize current timing */ mytime += MPI_Wtime(); MPI_Allreduce(&mytime, &walltime, 1, MPI_DOUBLE, MPI_MAX, MPI_COMM_WORLD); if (myid == 0) { printf("\nSMG Setup time = %f seconds\n\n", walltime); } /* Start timing again */ mytime -= MPI_Wtime(); /* Solve */ HYPRE_StructSMGSolve(solver, sA, sb, sx); /* Finalize current timing */ mytime += MPI_Wtime(); MPI_Allreduce(&mytime, &walltime, 1, MPI_DOUBLE, MPI_MAX, MPI_COMM_WORLD); if (myid == 0) { printf("\nSMG Solve time = %f seconds\n\n", walltime); } /* Get info and release memory */ HYPRE_StructSMGGetNumIterations(solver, &num_iterations); HYPRE_StructSMGGetFinalRelativeResidualNorm(solver, &final_res_norm); HYPRE_StructSMGDestroy(solver); } if (solver_id == 1) /* PFMG */ { /* Start timing */ mytime -= MPI_Wtime(); /* Options and setup */ HYPRE_StructPFMGCreate(MPI_COMM_WORLD, &solver); HYPRE_StructPFMGSetMaxIter(solver, 50); HYPRE_StructPFMGSetTol(solver, 1.0e-06); HYPRE_StructPFMGSetRelChange(solver, 0); HYPRE_StructPFMGSetRAPType(solver, rap); HYPRE_StructPFMGSetRelaxType(solver, relax); HYPRE_StructPFMGSetNumPreRelax(solver, n_pre); HYPRE_StructPFMGSetNumPostRelax(solver, n_post); HYPRE_StructPFMGSetSkipRelax(solver, skip); HYPRE_StructPFMGSetPrintLevel(solver, 1); HYPRE_StructPFMGSetLogging(solver, 1); HYPRE_StructPFMGSetup(solver, sA, sb, sx); /* Finalize current timing */ mytime += MPI_Wtime(); MPI_Allreduce(&mytime, &walltime, 1, MPI_DOUBLE, MPI_MAX, MPI_COMM_WORLD); if (myid == 0) { printf("\nPFMG Setup time = %f seconds\n\n", walltime); } /* Start timing again */ mytime -= MPI_Wtime(); /* Solve */ HYPRE_StructPFMGSolve(solver, sA, sb, sx); /* Finalize current timing */ mytime += MPI_Wtime(); MPI_Allreduce(&mytime, &walltime, 1, MPI_DOUBLE, MPI_MAX, MPI_COMM_WORLD); if (myid == 0) { printf("\nPFMG Solve time = %f seconds\n\n", walltime); } /* Get info and release memory */ HYPRE_StructPFMGGetNumIterations(solver, &num_iterations); HYPRE_StructPFMGGetFinalRelativeResidualNorm(solver, &final_res_norm); HYPRE_StructPFMGDestroy(solver); } /* Preconditioned CG */ if ((solver_id > 9) && (solver_id < 20)) { mytime -= MPI_Wtime(); HYPRE_StructPCGCreate(MPI_COMM_WORLD, &solver); HYPRE_StructPCGSetMaxIter(solver, 200 ); HYPRE_StructPCGSetTol(solver, 1.0e-06 ); HYPRE_StructPCGSetTwoNorm(solver, 1 ); HYPRE_StructPCGSetRelChange(solver, 0 ); HYPRE_StructPCGSetPrintLevel(solver, 2 ); if (solver_id == 10) { /* use symmetric SMG as preconditioner */ HYPRE_StructSMGCreate(MPI_COMM_WORLD, &precond); HYPRE_StructSMGSetMemoryUse(precond, 0); HYPRE_StructSMGSetMaxIter(precond, 1); HYPRE_StructSMGSetTol(precond, 0.0); HYPRE_StructSMGSetZeroGuess(precond); HYPRE_StructSMGSetNumPreRelax(precond, n_pre); HYPRE_StructSMGSetNumPostRelax(precond, n_post); HYPRE_StructSMGSetPrintLevel(precond, 0); HYPRE_StructSMGSetLogging(precond, 0); HYPRE_StructPCGSetPrecond(solver, HYPRE_StructSMGSolve, HYPRE_StructSMGSetup, precond); } else if (solver_id == 11) { /* use symmetric PFMG as preconditioner */ HYPRE_StructPFMGCreate(MPI_COMM_WORLD, &precond); HYPRE_StructPFMGSetMaxIter(precond, 1); HYPRE_StructPFMGSetTol(precond, 0.0); HYPRE_StructPFMGSetZeroGuess(precond); HYPRE_StructPFMGSetRAPType(precond, rap); HYPRE_StructPFMGSetRelaxType(precond, relax); HYPRE_StructPFMGSetNumPreRelax(precond, n_pre); HYPRE_StructPFMGSetNumPostRelax(precond, n_post); HYPRE_StructPFMGSetSkipRelax(precond, skip); HYPRE_StructPFMGSetPrintLevel(precond, 0); HYPRE_StructPFMGSetLogging(precond, 0); HYPRE_StructPCGSetPrecond(solver, HYPRE_StructPFMGSolve, HYPRE_StructPFMGSetup, precond); } else if (solver_id == 17) { /* use two-step Jacobi as preconditioner */ HYPRE_StructJacobiCreate(MPI_COMM_WORLD, &precond); HYPRE_StructJacobiSetMaxIter(precond, 2); HYPRE_StructJacobiSetTol(precond, 0.0); HYPRE_StructJacobiSetZeroGuess(precond); HYPRE_StructPCGSetPrecond( solver, HYPRE_StructJacobiSolve, HYPRE_StructJacobiSetup, precond); } else if (solver_id == 18) { /* use diagonal scaling as preconditioner */ precond = NULL; HYPRE_StructPCGSetPrecond(solver, HYPRE_StructDiagScale, HYPRE_StructDiagScaleSetup, precond); } /* PCG Setup */ HYPRE_StructPCGSetup(solver, sA, sb, sx ); mytime += MPI_Wtime(); MPI_Allreduce(&mytime, &walltime, 1, MPI_DOUBLE, MPI_MAX, MPI_COMM_WORLD); if (myid == 0) { printf("\nPCG Setup time = %f seconds\n\n", walltime); } mytime -= MPI_Wtime(); /* PCG Solve */ HYPRE_StructPCGSolve(solver, sA, sb, sx); mytime += MPI_Wtime(); MPI_Allreduce(&mytime, &walltime, 1, MPI_DOUBLE, MPI_MAX, MPI_COMM_WORLD); if (myid == 0) { printf("\nPCG Solve time = %f seconds\n\n", walltime); } /* Get info and release memory */ HYPRE_StructPCGGetNumIterations( solver, &num_iterations ); HYPRE_StructPCGGetFinalRelativeResidualNorm( solver, &final_res_norm ); HYPRE_StructPCGDestroy(solver); if (solver_id == 10) { HYPRE_StructSMGDestroy(precond); } else if (solver_id == 11 ) { HYPRE_StructPFMGDestroy(precond); } else if (solver_id == 17) { HYPRE_StructJacobiDestroy(precond); } } /* Preconditioned GMRES */ if ((solver_id > 29) && (solver_id < 40)) { mytime -= MPI_Wtime(); HYPRE_StructGMRESCreate(MPI_COMM_WORLD, &solver); /* Note that GMRES can be used with all the interfaces - not just the struct. So here we demonstrate the more generic GMRES interface functions. Since we have chosen a struct solver then we must type cast to the more generic HYPRE_Solver when setting options with these generic functions. Note that one could declare the solver to be type HYPRE_Solver, and then the casting would not be necessary.*/ HYPRE_GMRESSetMaxIter((HYPRE_Solver) solver, 500 ); HYPRE_GMRESSetKDim((HYPRE_Solver) solver, 30); HYPRE_GMRESSetTol((HYPRE_Solver) solver, 1.0e-06 ); HYPRE_GMRESSetPrintLevel((HYPRE_Solver) solver, 2 ); HYPRE_GMRESSetLogging((HYPRE_Solver) solver, 1 ); if (solver_id == 30) { /* use symmetric SMG as preconditioner */ HYPRE_StructSMGCreate(MPI_COMM_WORLD, &precond); HYPRE_StructSMGSetMemoryUse(precond, 0); HYPRE_StructSMGSetMaxIter(precond, 1); HYPRE_StructSMGSetTol(precond, 0.0); HYPRE_StructSMGSetZeroGuess(precond); HYPRE_StructSMGSetNumPreRelax(precond, n_pre); HYPRE_StructSMGSetNumPostRelax(precond, n_post); HYPRE_StructSMGSetPrintLevel(precond, 0); HYPRE_StructSMGSetLogging(precond, 0); HYPRE_StructGMRESSetPrecond(solver, HYPRE_StructSMGSolve, HYPRE_StructSMGSetup, precond); } else if (solver_id == 31) { /* use symmetric PFMG as preconditioner */ HYPRE_StructPFMGCreate(MPI_COMM_WORLD, &precond); HYPRE_StructPFMGSetMaxIter(precond, 1); HYPRE_StructPFMGSetTol(precond, 0.0); HYPRE_StructPFMGSetZeroGuess(precond); HYPRE_StructPFMGSetRAPType(precond, rap); HYPRE_StructPFMGSetRelaxType(precond, relax); HYPRE_StructPFMGSetNumPreRelax(precond, n_pre); HYPRE_StructPFMGSetNumPostRelax(precond, n_post); HYPRE_StructPFMGSetSkipRelax(precond, skip); HYPRE_StructPFMGSetPrintLevel(precond, 0); HYPRE_StructPFMGSetLogging(precond, 0); HYPRE_StructGMRESSetPrecond( solver, HYPRE_StructPFMGSolve, HYPRE_StructPFMGSetup, precond); } else if (solver_id == 37) { /* use two-step Jacobi as preconditioner */ HYPRE_StructJacobiCreate(MPI_COMM_WORLD, &precond); HYPRE_StructJacobiSetMaxIter(precond, 2); HYPRE_StructJacobiSetTol(precond, 0.0); HYPRE_StructJacobiSetZeroGuess(precond); HYPRE_StructGMRESSetPrecond( solver, HYPRE_StructJacobiSolve, HYPRE_StructJacobiSetup, precond); } else if (solver_id == 38) { /* use diagonal scaling as preconditioner */ precond = NULL; HYPRE_StructGMRESSetPrecond( solver, HYPRE_StructDiagScale, HYPRE_StructDiagScaleSetup, precond); } /* GMRES Setup */ HYPRE_StructGMRESSetup(solver, sA, sb, sx ); mytime += MPI_Wtime(); MPI_Allreduce(&mytime, &walltime, 1, MPI_DOUBLE, MPI_MAX, MPI_COMM_WORLD); if (myid == 0) { printf("\nGMRES Setup time = %f seconds\n\n", walltime); } mytime -= MPI_Wtime(); /* GMRES Solve */ HYPRE_StructGMRESSolve(solver, sA, sb, sx); mytime += MPI_Wtime(); MPI_Allreduce(&mytime, &walltime, 1, MPI_DOUBLE, MPI_MAX, MPI_COMM_WORLD); if (myid == 0) { printf("\nGMRES Solve time = %f seconds\n\n", walltime); } /* Get info and release memory */ HYPRE_StructGMRESGetNumIterations(solver, &num_iterations); HYPRE_StructGMRESGetFinalRelativeResidualNorm(solver, &final_res_norm); HYPRE_StructGMRESDestroy(solver); if (solver_id == 30) { HYPRE_StructSMGDestroy(precond); } else if (solver_id == 31) { HYPRE_StructPFMGDestroy(precond); } else if (solver_id == 37) { HYPRE_StructJacobiDestroy(precond); } } } /* Save the solution for GLVis visualization, see vis/glvis-ex7.sh */ if (vis) { #ifdef HYPRE_EXVIS FILE *file; char filename[255]; int part = 0, var = 0; int nvalues = n * n; double *values = (double*) calloc(nvalues, sizeof(double)); /* get all local data (including a local copy of the shared values) */ HYPRE_SStructVectorGetBoxValues(x, part, ilower, iupper, var, values); sprintf(filename, "%s.%06d", "vis/ex7.sol", myid); if ((file = fopen(filename, "w")) == NULL) { printf("Error: can't open output file %s\n", filename); MPI_Finalize(); exit(1); } /* save solution with global unknown numbers */ k = 0; for (j = 0; j < n; j++) for (i = 0; i < n; i++) { fprintf(file, "%06d %.14e\n", pj * N * n * n + pi * n + j * N * n + i, values[k++]); } fflush(file); fclose(file); free(values); /* save global finite element mesh */ if (myid == 0) { GLVis_PrintGlobalSquareMesh("vis/ex7.mesh", N * n - 1); } #endif } if (myid == 0) { printf("\n"); printf("Iterations = %d\n", num_iterations); printf("Final Relative Residual Norm = %e\n", final_res_norm); printf("\n"); } /* Free memory */ HYPRE_SStructGridDestroy(grid); HYPRE_SStructStencilDestroy(stencil); HYPRE_SStructGraphDestroy(graph); HYPRE_SStructMatrixDestroy(A); HYPRE_SStructVectorDestroy(b); HYPRE_SStructVectorDestroy(x); /* Finalize HYPRE */ HYPRE_Finalize(); /* Finalize MPI */ MPI_Finalize(); return (0); } hypre-2.33.0/src/examples/ex8.c000066400000000000000000000653521477326011500162240ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /* Example 8 Interface: Semi-Structured interface (SStruct) Compile with: make ex8 Sample run: mpirun -np 2 ex8 Description: This is a two processor example which solves a similar problem to the one in Example 2, and Example 6 (The grid boxes are exactly those in the example diagram in the struct interface chapter of the User's Manual.) The difference with the previous examples is that we use three parts, two with a 5-point and one with a 9-point discretization stencil. The solver is PCG with split-SMG preconditioner. */ #include #include #include /* SStruct linear solvers headers */ #include "HYPRE_sstruct_ls.h" #include "ex.h" #ifdef HYPRE_EXVIS #include "vis.c" #endif int main (int argc, char *argv[]) { int myid, num_procs; int vis = 0; HYPRE_SStructGrid grid; HYPRE_SStructGraph graph; HYPRE_SStructStencil stencil_5pt; HYPRE_SStructStencil stencil_9pt; HYPRE_SStructMatrix A; HYPRE_SStructVector b; HYPRE_SStructVector x; HYPRE_SStructSolver solver; HYPRE_SStructSolver precond; int object_type; /* Initialize MPI */ MPI_Init(&argc, &argv); MPI_Comm_rank(MPI_COMM_WORLD, &myid); MPI_Comm_size(MPI_COMM_WORLD, &num_procs); /* Initialize HYPRE */ HYPRE_Initialize(); /* Print GPU info */ /* HYPRE_PrintDeviceInfo(); */ if (num_procs != 2) { if (myid == 0) { printf("Must run with 2 processors!\n"); } MPI_Finalize(); return (0); } /* Parse command line */ { int arg_index = 0; int print_usage = 0; while (arg_index < argc) { if ( strcmp(argv[arg_index], "-vis") == 0 ) { arg_index++; vis = 1; } else if ( strcmp(argv[arg_index], "-help") == 0 ) { print_usage = 1; break; } else { arg_index++; } } if ((print_usage) && (myid == 0)) { printf("\n"); printf("Usage: %s []\n", argv[0]); printf("\n"); printf(" -vis : save the solution for GLVis visualization\n"); printf("\n"); } if (print_usage) { MPI_Finalize(); return (0); } } /* 1. Set up the 2D grid. This gives the index space in each part. We have one variable in each part. */ { int ndim = 2; int nparts = 3; int part; /* Create an empty 2D grid object */ HYPRE_SStructGridCreate(MPI_COMM_WORLD, ndim, nparts, &grid); /* Set the extents of the grid - each processor sets its grid boxes. Each part has its own relative index space numbering. */ /* Processor 0 owns two boxes - one in part 0 and one in part 1. */ if (myid == 0) { /* Add the first box to the grid in part 0 */ { int ilower[2] = {-3, 1}; int iupper[2] = {-1, 2}; part = 0; HYPRE_SStructGridSetExtents(grid, part, ilower, iupper); } /* Add the second box to the grid in part 1 */ { /* For convenience we use the same index space across all parts, but this is not a requirement. For example, on this part we could have used ilower=[23,24] and iupper=[25,27]. */ int ilower[2] = {0, 1}; int iupper[2] = {2, 4}; part = 1; HYPRE_SStructGridSetExtents(grid, part, ilower, iupper); } } /* Processor 1 owns one box in part 2. */ else if (myid == 1) { /* Add a new box to the grid in part 2 */ { int ilower[2] = {3, 1}; int iupper[2] = {6, 4}; part = 2; HYPRE_SStructGridSetExtents(grid, part, ilower, iupper); } } /* Set the variable type and number of variables on each part. */ { int i; int nvars = 1; HYPRE_SStructVariable vartypes[1] = {HYPRE_SSTRUCT_VARIABLE_CELL}; for (i = 0; i < nparts; i++) { HYPRE_SStructGridSetVariables(grid, i, nvars, vartypes); } } /* Now we need to set the spatial relation between each of the parts. Since we have the same types of variables on both parts, we can use HYPRE_GridSetNeighborPart(). Each processor calls this function for each part on which it owns boxes that border a different part. */ if (myid == 0) { /* Relation between part 0 and part 1 on processor 0 */ { int part = 0; int nbor_part = 1; /* Cells just outside of the boundary of part 0 in its coordinates */ int b_ilower[2] = {0, 1}, b_iupper[2] = {0, 2}; /* The same cells in part 1's coordinates. Since we use the same index space across all parts, the coordinates coincide. */ int nbor_ilower[2] = {0, 1}, nbor_iupper[2] = {0, 2}; /* These parts have the same orientation, so no rotation is necessary */ int index_map[2] = {0, 1}; /* These parts map increasing values to increasing values for both variables (note: if decreasing maps to increasing, use -1)*/ int index_dir[2] = {1, 1}; HYPRE_SStructGridSetNeighborPart(grid, part, b_ilower, b_iupper, nbor_part, nbor_ilower, nbor_iupper, index_map, index_dir); } /* Relation between part 1 and part 0 on processor 0 */ { int part = 1; int nbor_part = 0; /* Cells just outside of the boundary of part 1 in its coordinates */ int b_ilower[2] = {-1, 1}, b_iupper[2] = {-1, 2}; /* The same cells in part 0's coordinates. Since we use the same index space across all parts, the coordinates coincide. */ int nbor_ilower[2] = {-1, 1}, nbor_iupper[2] = {-1, 2}; /* These parts have the same orientation, so no rotation is necessary */ int index_map[2] = {0, 1}; /* These parts map increasing values to increasing values for both variables (note: if decreasing maps to increasing, use -1)*/ int index_dir[2] = {1, 1}; HYPRE_SStructGridSetNeighborPart(grid, part, b_ilower, b_iupper, nbor_part, nbor_ilower, nbor_iupper, index_map, index_dir); } /* Relation between part 1 and part 2 on processor 0 */ { int part = 1; int nbor_part = 2; /* Cells just outside of the boundary of part 1 in its coordinates */ int b_ilower[2] = {3, 1}, b_iupper[2] = {3, 4}; /* The same cells in part 2's coordinates. Since we use the same index space across all parts, the coordinates coincide. */ int nbor_ilower[2] = {3, 1}, nbor_iupper[2] = {3, 4}; /* These parts have the same orientation, so no rotation is necessary */ int index_map[2] = {0, 1}; /* These parts map increasing values to increasing values for both variables (note: if decreasing maps to increasing, use -1)*/ int index_dir[2] = {1, 1}; HYPRE_SStructGridSetNeighborPart(grid, part, b_ilower, b_iupper, nbor_part, nbor_ilower, nbor_iupper, index_map, index_dir); } } else if (myid == 1) { /* Relation between part 2 and part 1 on processor 1 */ { int part = 2; int nbor_part = 1; /* Cells just outside of the boundary of part 2 in its coordinates */ int b_ilower[2] = {2, 1}, b_iupper[2] = {2, 4}; /* The same cells in part 1's coordinates. Since we use the same index space across all parts, the coordinates coincide. */ int nbor_ilower[2] = {2, 1}, nbor_iupper[2] = {2, 4}; /* These parts have the same orientation, so no rotation is necessary */ int index_map[2] = {0, 1}; /* These parts map increasing values to increasing values for both variables (note: if decreasing maps to increasing, use -1)*/ int index_dir[2] = {1, 1}; HYPRE_SStructGridSetNeighborPart(grid, part, b_ilower, b_iupper, nbor_part, nbor_ilower, nbor_iupper, index_map, index_dir); } } /* Now the grid is ready to use */ HYPRE_SStructGridAssemble(grid); } /* 2. Define the discretization stencils */ { int ndim = 2; int var = 0; int entry; /* the 5-pt stencil in 2D */ { int offsets[5][2] = {{0, 0}, {-1, 0}, {1, 0}, {0, -1}, {0, 1}}; int stencil_size = 5; HYPRE_SStructStencilCreate(ndim, stencil_size, &stencil_5pt); for (entry = 0; entry < 5; entry++) { HYPRE_SStructStencilSetEntry(stencil_5pt, entry, offsets[entry], var); } } /* the 9-pt stencil in 2D */ { int offsets[9][2] = {{0, 0}, {-1, 0}, {1, 0}, {0, -1}, {0, 1}, {-1, -1}, {1, -1}, {1, 1}, {-1, 1} }; int stencil_size = 9; HYPRE_SStructStencilCreate(ndim, stencil_size, &stencil_9pt); for (entry = 0; entry < stencil_size; entry++) { HYPRE_SStructStencilSetEntry(stencil_9pt, entry, offsets[entry], var); } } } /* 3. Set up the Graph - this determines the non-zero structure of the matrix and allows non-stencil relationships between the parts */ { int var = 0; int part; /* Create the graph object */ HYPRE_SStructGraphCreate(MPI_COMM_WORLD, grid, &graph); /* See MatrixSetObjectType below */ object_type = HYPRE_SSTRUCT; HYPRE_SStructGraphSetObjectType(graph, object_type); /* Use the 5-pt stencil on part 0 */ part = 0; HYPRE_SStructGraphSetStencil(graph, part, var, stencil_5pt); /* Use the 9-pt stencil on part 1 */ part = 1; HYPRE_SStructGraphSetStencil(graph, part, var, stencil_9pt); /* Use the 5-pt stencil on part 2 */ part = 2; HYPRE_SStructGraphSetStencil(graph, part, var, stencil_5pt); /* Since we have only stencil connections between parts, we don't need to call HYPRE_SStructGraphAddEntries. */ /* Assemble the graph */ HYPRE_SStructGraphAssemble(graph); } /* 4. Set up a SStruct Matrix */ { int i, j; int part; int var = 0; /* Create the empty matrix object */ HYPRE_SStructMatrixCreate(MPI_COMM_WORLD, graph, &A); /* Set the object type (by default HYPRE_SSTRUCT). This determines the data structure used to store the matrix. If you want to use unstructured solvers, e.g. BoomerAMG, the object type should be HYPRE_PARCSR. If the problem is purely structured (with one part), you may want to use HYPRE_STRUCT to access the structured solvers. Since we have two parts with different stencils, we set the object type to HYPRE_SSTRUCT. */ object_type = HYPRE_SSTRUCT; HYPRE_SStructMatrixSetObjectType(A, object_type); /* Get ready to set values */ HYPRE_SStructMatrixInitialize(A); /* Each processor must set the stencil values for their boxes on each part. In this example, we only set stencil entries and therefore use HYPRE_SStructMatrixSetBoxValues. If we need to set non-stencil entries, we have to use HYPRE_SStructMatrixSetValues. */ if (myid == 0) { /* Set the matrix coefficients for some set of stencil entries over all the gridpoints in my first box (account for boundary grid points later) */ { int ilower[2] = {-3, 1}; int iupper[2] = {-1, 2}; int nentries = 5; int nvalues = 30; /* 6 grid points, each with 5 stencil entries */ /* double values[30]; OK to use constant-length array for CPUs */ double *values = (double *) malloc(30 * sizeof(double)); int stencil_indices[5]; for (j = 0; j < nentries; j++) /* label the stencil indices - these correspond to the offsets defined above */ { stencil_indices[j] = j; } for (i = 0; i < nvalues; i += nentries) { values[i] = 4.0; for (j = 1; j < nentries; j++) { values[i + j] = -1.0; } } part = 0; HYPRE_SStructMatrixSetBoxValues(A, part, ilower, iupper, var, nentries, stencil_indices, values); free(values); } /* Set the matrix coefficients for some set of stencil entries over the gridpoints in my second box */ { int ilower[2] = {0, 1}; int iupper[2] = {2, 4}; int nentries = 9; int nvalues = 108; /* 12 grid points, each with 5 stencil entries */ /* double values[108]; OK to use constant-length array for CPUs */ double *values = (double *) malloc(108 * sizeof(double)); int stencil_indices[9]; for (j = 0; j < nentries; j++) { stencil_indices[j] = j; } for (i = 0; i < nvalues; i += nentries) { values[i] = 8. / 3.; for (j = 1; j < nentries; j++) { values[i + j] = -1. / 3.; } } part = 1; HYPRE_SStructMatrixSetBoxValues(A, part, ilower, iupper, var, nentries, stencil_indices, values); free(values); } } else if (myid == 1) { /* Set the matrix coefficients for some set of stencil entries over the gridpoints in my box */ { int ilower[2] = {3, 1}; int iupper[2] = {6, 4}; int nentries = 5; int nvalues = 80; /* 16 grid points, each with 5 stencil entries */ /* double values[80]; OK to use constant-length array for CPUs */ double *values = (double *) malloc(80 * sizeof(double)); int stencil_indices[5]; for (j = 0; j < nentries; j++) { stencil_indices[j] = j; } for (i = 0; i < nvalues; i += nentries) { values[i] = 4.0; for (j = 1; j < nentries; j++) { values[i + j] = -1.0; } } part = 2; HYPRE_SStructMatrixSetBoxValues(A, part, ilower, iupper, var, nentries, stencil_indices, values); free(values); } } /* Modify the 9-pt stencil on the boundary between parts to ensure symmetry and good global approximation. */ if (myid == 0) { int nentries = 6; int nvalues = 24; /* 4 grid points, each with 6 stencil entries */ /* double values[24]; OK to use constant-length array for CPUs */ double *values = (double *) malloc(24 * sizeof(double)); part = 1; for (i = 0; i < nvalues; i += nentries) { values[i] = 10. / 3.; values[i + 1] = -1.; values[i + 2] = -2. / 3.; values[i + 3] = -2. / 3.; values[i + 4] = 0.0; values[i + 5] = 0.0; } { /* Values to the right of the second box */ int ilower[2] = { 2, 1}; int iupper[2] = { 2, 4}; int stencil_indices[6] = {0, 2, 3, 4, 6, 7}; HYPRE_SStructMatrixSetBoxValues(A, part, ilower, iupper, var, nentries, stencil_indices, values); } { /* Values to the left of the second box */ int ilower[2] = { 0, 1}; int iupper[2] = { 0, 4}; int stencil_indices[6] = {0, 1, 3, 4, 5, 8}; HYPRE_SStructMatrixSetBoxValues(A, part, ilower, iupper, var, nentries, stencil_indices, values); } free(values); } /* For each box, set any coefficients that reach ouside of the boundary to 0 */ if (myid == 0) { int maxnvalues = 9; /* double values[9]; OK to use constant-length array for CPUs */ double *values = (double *) malloc(9 * sizeof(double)); for (i = 0; i < maxnvalues; i++) { values[i] = 0.0; } part = 0; { /* Values below our first box */ int ilower[2] = {-3, 1}; int iupper[2] = {-1, 1}; int stencil_indices[1] = {3}; HYPRE_SStructMatrixSetBoxValues(A, part, ilower, iupper, var, 1, stencil_indices, values); } { /* Values to the left of our first box */ int ilower[2] = {-3, 1}; int iupper[2] = {-3, 2}; int stencil_indices[1] = {1}; HYPRE_SStructMatrixSetBoxValues(A, part, ilower, iupper, var, 1, stencil_indices, values); } { /* Values above our first box */ int ilower[2] = {-3, 2}; int iupper[2] = {-1, 2}; int stencil_indices[1] = {4}; HYPRE_SStructMatrixSetBoxValues(A, part, ilower, iupper, var, 1, stencil_indices, values); } part = 1; { /* Values below our second box */ int ilower[2] = { 0, 1}; int iupper[2] = { 2, 1}; int stencil_indices[3] = {3, 5, 6}; HYPRE_SStructMatrixSetBoxValues(A, part, ilower, iupper, var, 3, stencil_indices, values); } { /* Values to the left of our second box (that do not border the first box). */ int ilower[2] = { 0, 3}; int iupper[2] = { 0, 4}; int stencil_indices[3] = {1, 5, 8}; HYPRE_SStructMatrixSetBoxValues(A, part, ilower, iupper, var, 3, stencil_indices, values); } { /* Values above our second box */ int ilower[2] = { 0, 4}; int iupper[2] = { 2, 4}; int stencil_indices[3] = {4, 7, 8}; HYPRE_SStructMatrixSetBoxValues(A, part, ilower, iupper, var, 3, stencil_indices, values); } free(values); } else if (myid == 1) { int maxnvalues = 4; /* double values[4]; OK to use constant-length array for CPUs */ double *values = (double *) malloc(4 * sizeof(double)); for (i = 0; i < maxnvalues; i++) { values[i] = 0.0; } part = 2; { /* Values below our box */ int ilower[2] = { 3, 1}; int iupper[2] = { 6, 1}; int stencil_indices[1] = {3}; HYPRE_SStructMatrixSetBoxValues(A, part, ilower, iupper, var, 1, stencil_indices, values); } { /* Values to the right of our box */ int ilower[2] = { 6, 1}; int iupper[2] = { 6, 4}; int stencil_indices[1] = {2}; HYPRE_SStructMatrixSetBoxValues(A, part, ilower, iupper, var, 1, stencil_indices, values); } { /* Values above our box */ int ilower[2] = { 3, 4}; int iupper[2] = { 6, 4}; int stencil_indices[1] = {4}; HYPRE_SStructMatrixSetBoxValues(A, part, ilower, iupper, var, 1, stencil_indices, values); } free(values); } /* This is a collective call finalizing the matrix assembly. The matrix is now ``ready to be used'' */ HYPRE_SStructMatrixAssemble(A); } /* 5. Set up SStruct Vectors for b and x */ { int i; int part; int var = 0; /* Create an empty vector object */ HYPRE_SStructVectorCreate(MPI_COMM_WORLD, grid, &b); HYPRE_SStructVectorCreate(MPI_COMM_WORLD, grid, &x); /* As with the matrix, set the object type for the vectors to be the sstruct type */ object_type = HYPRE_SSTRUCT; HYPRE_SStructVectorSetObjectType(b, object_type); HYPRE_SStructVectorSetObjectType(x, object_type); /* Indicate that the vector coefficients are ready to be set */ HYPRE_SStructVectorInitialize(b); HYPRE_SStructVectorInitialize(x); if (myid == 0) { /* Set the vector coefficients over the gridpoints in my first box */ { int ilower[2] = {-3, 1}; int iupper[2] = {-1, 2}; int nvalues = 6; /* 6 grid points */ /* double values[6]; OK to use constant-length array for CPUs */ double *values = (double *) malloc(6 * sizeof(double)); part = 0; for (i = 0; i < nvalues; i ++) { values[i] = 1.0; } HYPRE_SStructVectorSetBoxValues(b, part, ilower, iupper, var, values); for (i = 0; i < nvalues; i ++) { values[i] = 0.0; } HYPRE_SStructVectorSetBoxValues(x, part, ilower, iupper, var, values); free(values); } /* Set the vector coefficients over the gridpoints in my second box */ { int ilower[2] = { 0, 1}; int iupper[2] = { 2, 4}; int nvalues = 12; /* 12 grid points */ /* double values[12]; OK to use constant-length array for CPUs */ double *values = (double *) malloc(12 * sizeof(double)); part = 1; for (i = 0; i < nvalues; i ++) { values[i] = 1.0; } HYPRE_SStructVectorSetBoxValues(b, part, ilower, iupper, var, values); for (i = 0; i < nvalues; i ++) { values[i] = 0.0; } HYPRE_SStructVectorSetBoxValues(x, part, ilower, iupper, var, values); free(values); } } else if (myid == 1) { /* Set the vector coefficients over the gridpoints in my box */ { int ilower[2] = { 3, 1}; int iupper[2] = { 6, 4}; int nvalues = 16; /* 16 grid points */ /* double values[16]; OK to use constant-length array for CPUs */ double *values = (double *) malloc(16 * sizeof(double)); part = 2; for (i = 0; i < nvalues; i ++) { values[i] = 1.0; } HYPRE_SStructVectorSetBoxValues(b, part, ilower, iupper, var, values); for (i = 0; i < nvalues; i ++) { values[i] = 0.0; } HYPRE_SStructVectorSetBoxValues(x, part, ilower, iupper, var, values); free(values); } } /* This is a collective call finalizing the vector assembly. The vectors are now ``ready to be used'' */ HYPRE_SStructVectorAssemble(b); HYPRE_SStructVectorAssemble(x); } /* 6. Set up and use a solver (See the Reference Manual for descriptions of all of the options.) */ { /* Create an empty PCG Struct solver */ HYPRE_SStructPCGCreate(MPI_COMM_WORLD, &solver); /* Set PCG parameters */ HYPRE_SStructPCGSetTol(solver, 1.0e-6 ); HYPRE_SStructPCGSetPrintLevel(solver, 2); HYPRE_SStructPCGSetMaxIter(solver, 50); /* Create a split SStruct solver for use as a preconditioner */ HYPRE_SStructSplitCreate(MPI_COMM_WORLD, &precond); HYPRE_SStructSplitSetMaxIter(precond, 1); HYPRE_SStructSplitSetTol(precond, 0.0); HYPRE_SStructSplitSetZeroGuess(precond); /* Set the preconditioner type to split-SMG */ HYPRE_SStructSplitSetStructSolver(precond, HYPRE_SMG); /* Set preconditioner and solve */ HYPRE_SStructPCGSetPrecond(solver, HYPRE_SStructSplitSolve, HYPRE_SStructSplitSetup, precond); HYPRE_SStructPCGSetup(solver, A, b, x); HYPRE_SStructPCGSolve(solver, A, b, x); } /* Save the solution for GLVis visualization, see vis/glvis-ex8.sh */ if (vis) { #ifdef HYPRE_EXVIS GLVis_PrintSStructGrid(grid, "vis/ex8.mesh", myid, NULL, NULL); GLVis_PrintSStructVector(x, 0, "vis/ex8.sol", myid); GLVis_PrintData("vis/ex8.data", myid, num_procs); #endif } /* Free memory */ HYPRE_SStructGridDestroy(grid); HYPRE_SStructStencilDestroy(stencil_5pt); HYPRE_SStructStencilDestroy(stencil_9pt); HYPRE_SStructGraphDestroy(graph); HYPRE_SStructMatrixDestroy(A); HYPRE_SStructVectorDestroy(b); HYPRE_SStructVectorDestroy(x); HYPRE_SStructPCGDestroy(solver); HYPRE_SStructSplitDestroy(precond); /* Finalize HYPRE */ HYPRE_Finalize(); /* Finalize MPI */ MPI_Finalize(); return (0); } hypre-2.33.0/src/examples/ex9.c000066400000000000000000000634521477326011500162240ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /* Example 9 Interface: Semi-Structured interface (SStruct) Compile with: make ex9 Sample run: mpirun -np 16 ex9 -n 33 -solver 0 -v 1 1 To see options: ex9 -help Description: This code solves a system corresponding to a discretization of the biharmonic problem treated as a system of equations on the unit square. Specifically, instead of solving Delta^2(u) = f with zero boundary conditions for u and Delta(u), we solve the system A x = b, where A = [ Delta -I ; 0 Delta], x = [ u ; v] and b = [ 0 ; f] The corresponding boundary conditions are u = 0 and v = 0. The domain is split into an N x N processor grid. Thus, the given number of processors should be a perfect square. Each processor's piece of the grid has n x n cells with n x n nodes. We use cell-centered variables, and, therefore, the nodes are not shared. Note that we have two variables, u and v, and need only one part to describe the domain. We use the standard 5-point stencil to discretize the Laplace operators. The boundary conditions are incorporated as in Example 3. We recommend viewing Examples 3, 6 and 7 before this example. */ #include #include #include #include #include "HYPRE_sstruct_ls.h" #include "HYPRE_krylov.h" #include "ex.h" #ifdef HYPRE_EXVIS #include "vis.c" #endif int main (int argc, char *argv[]) { int i, j; int myid, num_procs; int n, N, pi, pj; double h, h2; int ilower[2], iupper[2]; int solver_id; int n_pre, n_post; int vis; int object_type; HYPRE_SStructGrid grid; HYPRE_SStructGraph graph; HYPRE_SStructStencil stencil_v; HYPRE_SStructStencil stencil_u; HYPRE_SStructMatrix A; HYPRE_SStructVector b; HYPRE_SStructVector x; /* sstruct solvers */ HYPRE_SStructSolver solver; HYPRE_SStructSolver precond; /* parcsr solvers */ HYPRE_Solver par_solver; HYPRE_Solver par_precond; /* Initialize MPI */ MPI_Init(&argc, &argv); MPI_Comm_rank(MPI_COMM_WORLD, &myid); MPI_Comm_size(MPI_COMM_WORLD, &num_procs); /* Initialize HYPRE */ HYPRE_Initialize(); /* Print GPU info */ /* HYPRE_PrintDeviceInfo(); */ /* Set defaults */ n = 33; solver_id = 0; n_pre = 1; n_post = 1; vis = 0; /* Parse command line */ { int arg_index = 0; int print_usage = 0; while (arg_index < argc) { if ( strcmp(argv[arg_index], "-n") == 0 ) { arg_index++; n = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-solver") == 0 ) { arg_index++; solver_id = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-v") == 0 ) { arg_index++; n_pre = atoi(argv[arg_index++]); n_post = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-vis") == 0 ) { arg_index++; vis = 1; } else if ( strcmp(argv[arg_index], "-help") == 0 ) { print_usage = 1; break; } else { arg_index++; } } if ((print_usage) && (myid == 0)) { printf("\n"); printf("Usage: %s []\n", argv[0]); printf("\n"); printf(" -n : problem size per processor (default: 33)\n"); printf(" -solver : solver ID\n"); printf(" 0 - GMRES with sysPFMG precond (default)\n"); printf(" 1 - sysPFMG\n"); printf(" 2 - GMRES with AMG precond\n"); printf(" 3 - AMG\n"); printf(" -v : number of pre and post relaxations for SysPFMG (default: 1 1)\n"); printf(" -vis : save the solution for GLVis visualization\n"); printf("\n"); } if (print_usage) { MPI_Finalize(); return (0); } } /* Figure out the processor grid (N x N). The local problem size for the interior nodes is indicated by n (n x n). pi and pj indicate position in the processor grid. */ N = sqrt(num_procs); h = 1.0 / (N * n + 1); /* note that when calculating h we must remember to count the boundary nodes */ h2 = h * h; pj = myid / N; pi = myid - pj * N; /* Figure out the extents of each processor's piece of the grid. */ ilower[0] = pi * n; ilower[1] = pj * n; iupper[0] = ilower[0] + n - 1; iupper[1] = ilower[1] + n - 1; /* 1. Set up a grid - we have one part and two variables */ { int nparts = 1; int part = 0; int ndim = 2; /* Create an empty 2D grid object */ HYPRE_SStructGridCreate(MPI_COMM_WORLD, ndim, nparts, &grid); /* Add a new box to the grid */ HYPRE_SStructGridSetExtents(grid, part, ilower, iupper); /* Set the variable type and number of variables on each part.*/ { int i; int nvars = 2; HYPRE_SStructVariable vartypes[2] = { HYPRE_SSTRUCT_VARIABLE_CELL, HYPRE_SSTRUCT_VARIABLE_CELL }; for (i = 0; i < nparts; i++) { HYPRE_SStructGridSetVariables(grid, i, nvars, vartypes); } } /* This is a collective call finalizing the grid assembly. The grid is now ``ready to be used'' */ HYPRE_SStructGridAssemble(grid); } /* 2. Define the discretization stencils */ { int entry; int stencil_size; int var; int ndim = 2; /* Stencil object for variable u (labeled as variable 0) */ { int offsets[6][2] = {{0, 0}, {-1, 0}, {1, 0}, {0, -1}, {0, 1}, {0, 0}}; stencil_size = 6; HYPRE_SStructStencilCreate(ndim, stencil_size, &stencil_u); /* The first 5 entries are for the u-u connections */ var = 0; /* connect to variable 0 */ for (entry = 0; entry < stencil_size - 1 ; entry++) { HYPRE_SStructStencilSetEntry(stencil_u, entry, offsets[entry], var); } /* The last entry is for the u-v connection */ var = 1; /* connect to variable 1 */ entry = 5; HYPRE_SStructStencilSetEntry(stencil_u, entry, offsets[entry], var); } /* Stencil object for variable v (variable 1) */ { int offsets[5][2] = {{0, 0}, {-1, 0}, {1, 0}, {0, -1}, {0, 1}}; stencil_size = 5; HYPRE_SStructStencilCreate(ndim, stencil_size, &stencil_v); /* These are all v-v connections */ var = 1; /* Connect to variable 1 */ for (entry = 0; entry < stencil_size; entry++) { HYPRE_SStructStencilSetEntry(stencil_v, entry, offsets[entry], var); } } } /* 3. Set up the Graph - this determines the non-zero structure of the matrix and allows non-stencil relationships between the parts. */ { int var; int part = 0; /* Create the graph object */ HYPRE_SStructGraphCreate(MPI_COMM_WORLD, grid, &graph); /* See MatrixSetObjectType below */ if (solver_id > 1 && solver_id < 4) { object_type = HYPRE_PARCSR; } else { object_type = HYPRE_SSTRUCT; } HYPRE_SStructGraphSetObjectType(graph, object_type); /* Assign the u-stencil we created to variable u (variable 0) */ var = 0; HYPRE_SStructGraphSetStencil(graph, part, var, stencil_u); /* Assign the v-stencil we created to variable v (variable 1) */ var = 1; HYPRE_SStructGraphSetStencil(graph, part, var, stencil_v); /* Assemble the graph */ HYPRE_SStructGraphAssemble(graph); } /* 4. Set up the SStruct Matrix */ { int nentries; int nvalues; int var; int part = 0; /* Create an empty matrix object */ HYPRE_SStructMatrixCreate(MPI_COMM_WORLD, graph, &A); /* Set the object type (by default HYPRE_SSTRUCT). This determines the data structure used to store the matrix. If you want to use unstructured solvers, e.g. BoomerAMG, the object type should be HYPRE_PARCSR. If the problem is purely structured (with one part), you may want to use HYPRE_STRUCT to access the structured solvers. */ HYPRE_SStructMatrixSetObjectType(A, object_type); /* Indicate that the matrix coefficients are ready to be set */ HYPRE_SStructMatrixInitialize(A); /* Each processor must set the stencil values for their boxes on each part. In this example, we only set stencil entries and therefore use HYPRE_SStructMatrixSetBoxValues. If we need to set non-stencil entries, we have to use HYPRE_SStructMatrixSetValues. */ /* First set the u-stencil entries. Note that HYPRE_SStructMatrixSetBoxValues can only set values corresponding to stencil entries for the same variable. Therefore, we must set the entries for each variable within a stencil with separate function calls. For example, below the u-u connections and u-v connections are handled in separate calls. */ { int i, j; double *u_values; int u_v_indices[1] = {5}; int u_u_indices[5] = {0, 1, 2, 3, 4}; var = 0; /* Set values for the u connections */ /* First the u-u connections */ nentries = 5; nvalues = nentries * n * n; u_values = (double*) calloc(nvalues, sizeof(double)); for (i = 0; i < nvalues; i += nentries) { u_values[i] = 4.0; for (j = 1; j < nentries; j++) { u_values[i + j] = -1.0; } } HYPRE_SStructMatrixSetBoxValues(A, part, ilower, iupper, var, nentries, u_u_indices, u_values); free(u_values); /* Next the u-v connections */ nentries = 1; nvalues = nentries * n * n; u_values = (double*) calloc(nvalues, sizeof(double)); for (i = 0; i < nvalues; i++) { u_values[i] = -h2; } HYPRE_SStructMatrixSetBoxValues(A, part, ilower, iupper, var, nentries, u_v_indices, u_values); free(u_values); } /* Now set the v-stencil entries */ { int i, j; double *v_values; int v_v_indices[5] = {0, 1, 2, 3, 4}; var = 1; /* the v connections */ /* the v-v connections */ nentries = 5; nvalues = nentries * n * n; v_values = (double*) calloc(nvalues, sizeof(double)); for (i = 0; i < nvalues; i += nentries) { v_values[i] = 4.0; for (j = 1; j < nentries; j++) { v_values[i + j] = -1.0; } } HYPRE_SStructMatrixSetBoxValues(A, part, ilower, iupper, var, nentries, v_v_indices, v_values); free(v_values); /* There are no v-u connections to set */ } } /* 5. Incorporate the zero boundary conditions: go along each edge of the domain and set the stencil entry that reaches to the boundary to zero.*/ { int bc_ilower[2]; int bc_iupper[2]; int nentries = 1; int nvalues = nentries * n; /* number of stencil entries times the length of one side of my grid box */ int var; double *values; int stencil_indices[1]; int part = 0; values = (double*) calloc(nvalues, sizeof(double)); for (j = 0; j < nvalues; j++) { values[j] = 0.0; } /* Recall: pi and pj describe position in the processor grid */ if (pj == 0) { /* Bottom row of grid points */ bc_ilower[0] = pi * n; bc_ilower[1] = pj * n; bc_iupper[0] = bc_ilower[0] + n - 1; bc_iupper[1] = bc_ilower[1]; stencil_indices[0] = 3; /* Need to do this for u and for v */ var = 0; HYPRE_SStructMatrixSetBoxValues(A, part, bc_ilower, bc_iupper, var, nentries, stencil_indices, values); var = 1; HYPRE_SStructMatrixSetBoxValues(A, part, bc_ilower, bc_iupper, var, nentries, stencil_indices, values); } if (pj == N - 1) { /* upper row of grid points */ bc_ilower[0] = pi * n; bc_ilower[1] = pj * n + n - 1; bc_iupper[0] = bc_ilower[0] + n - 1; bc_iupper[1] = bc_ilower[1]; stencil_indices[0] = 4; /* Need to do this for u and for v */ var = 0; HYPRE_SStructMatrixSetBoxValues(A, part, bc_ilower, bc_iupper, var, nentries, stencil_indices, values); var = 1; HYPRE_SStructMatrixSetBoxValues(A, part, bc_ilower, bc_iupper, var, nentries, stencil_indices, values); } if (pi == 0) { /* Left row of grid points */ bc_ilower[0] = pi * n; bc_ilower[1] = pj * n; bc_iupper[0] = bc_ilower[0]; bc_iupper[1] = bc_ilower[1] + n - 1; stencil_indices[0] = 1; /* Need to do this for u and for v */ var = 0; HYPRE_SStructMatrixSetBoxValues(A, part, bc_ilower, bc_iupper, var, nentries, stencil_indices, values); var = 1; HYPRE_SStructMatrixSetBoxValues(A, part, bc_ilower, bc_iupper, var, nentries, stencil_indices, values); } if (pi == N - 1) { /* Right row of grid points */ bc_ilower[0] = pi * n + n - 1; bc_ilower[1] = pj * n; bc_iupper[0] = bc_ilower[0]; bc_iupper[1] = bc_ilower[1] + n - 1; stencil_indices[0] = 2; /* Need to do this for u and for v */ var = 0; HYPRE_SStructMatrixSetBoxValues(A, part, bc_ilower, bc_iupper, var, nentries, stencil_indices, values); var = 1; HYPRE_SStructMatrixSetBoxValues(A, part, bc_ilower, bc_iupper, var, nentries, stencil_indices, values); } free(values); } /* This is a collective call finalizing the matrix assembly. The matrix is now ``ready to be used'' */ HYPRE_SStructMatrixAssemble(A); /* 5. Set up SStruct Vectors for b and x */ { int nvalues = n * n; double *values; int part = 0; int var; values = (double*) calloc(nvalues, sizeof(double)); /* Create an empty vector object */ HYPRE_SStructVectorCreate(MPI_COMM_WORLD, grid, &b); HYPRE_SStructVectorCreate(MPI_COMM_WORLD, grid, &x); /* Set the object type for the vectors to be the same as was already set for the matrix */ HYPRE_SStructVectorSetObjectType(b, object_type); HYPRE_SStructVectorSetObjectType(x, object_type); /* Indicate that the vector coefficients are ready to be set */ HYPRE_SStructVectorInitialize(b); HYPRE_SStructVectorInitialize(x); /* Set the values for b */ for (i = 0; i < nvalues; i ++) { values[i] = h2; } var = 1; HYPRE_SStructVectorSetBoxValues(b, part, ilower, iupper, var, values); for (i = 0; i < nvalues; i ++) { values[i] = 0.0; } var = 0; HYPRE_SStructVectorSetBoxValues(b, part, ilower, iupper, var, values); /* Set the values for the initial guess */ var = 0; HYPRE_SStructVectorSetBoxValues(x, part, ilower, iupper, var, values); var = 1; HYPRE_SStructVectorSetBoxValues(x, part, ilower, iupper, var, values); free(values); /* This is a collective call finalizing the vector assembly. The vector is now ``ready to be used'' */ HYPRE_SStructVectorAssemble(b); HYPRE_SStructVectorAssemble(x); } /* 6. Set up and use a solver (Solver options can be found in the Reference Manual.) */ { double final_res_norm; int its; HYPRE_ParCSRMatrix par_A; HYPRE_ParVector par_b; HYPRE_ParVector par_x; /* If we are using a parcsr solver, we need to get the object for the matrix and vectors. */ if (object_type == HYPRE_PARCSR) { HYPRE_SStructMatrixGetObject(A, (void **) &par_A); HYPRE_SStructVectorGetObject(b, (void **) &par_b); HYPRE_SStructVectorGetObject(x, (void **) &par_x); } if (solver_id == 0 ) /* GMRES with SysPFMG - the default*/ { HYPRE_SStructGMRESCreate(MPI_COMM_WORLD, &solver); /* GMRES parameters */ HYPRE_SStructGMRESSetMaxIter(solver, 50 ); HYPRE_SStructGMRESSetTol(solver, 1.0e-06 ); HYPRE_SStructGMRESSetPrintLevel(solver, 2 ); /* print each GMRES iteration */ HYPRE_SStructGMRESSetLogging(solver, 1); /* use SysPFMG as precondititioner */ HYPRE_SStructSysPFMGCreate(MPI_COMM_WORLD, &precond); /* Set sysPFMG parameters */ HYPRE_SStructSysPFMGSetTol(precond, 0.0); HYPRE_SStructSysPFMGSetMaxIter(precond, 1); HYPRE_SStructSysPFMGSetNumPreRelax(precond, n_pre); HYPRE_SStructSysPFMGSetNumPostRelax(precond, n_post); HYPRE_SStructSysPFMGSetPrintLevel(precond, 0); HYPRE_SStructSysPFMGSetZeroGuess(precond); /* Set the preconditioner*/ HYPRE_SStructGMRESSetPrecond(solver, HYPRE_SStructSysPFMGSolve, HYPRE_SStructSysPFMGSetup, precond); /* do the setup */ HYPRE_SStructGMRESSetup(solver, A, b, x); /* do the solve */ HYPRE_SStructGMRESSolve(solver, A, b, x); /* get some info */ HYPRE_SStructGMRESGetFinalRelativeResidualNorm(solver, &final_res_norm); HYPRE_SStructGMRESGetNumIterations(solver, &its); /* clean up */ HYPRE_SStructSysPFMGDestroy(precond); HYPRE_SStructGMRESDestroy(solver); } else if (solver_id == 1) /* SysPFMG */ { HYPRE_SStructSysPFMGCreate(MPI_COMM_WORLD, &solver); /* Set sysPFMG parameters */ HYPRE_SStructSysPFMGSetTol(solver, 1.0e-6); HYPRE_SStructSysPFMGSetMaxIter(solver, 50); HYPRE_SStructSysPFMGSetNumPreRelax(solver, n_pre); HYPRE_SStructSysPFMGSetNumPostRelax(solver, n_post); HYPRE_SStructSysPFMGSetPrintLevel(solver, 0); HYPRE_SStructSysPFMGSetLogging(solver, 1); /* do the setup */ HYPRE_SStructSysPFMGSetup(solver, A, b, x); /* do the solve */ HYPRE_SStructSysPFMGSolve(solver, A, b, x); /* get some info */ HYPRE_SStructSysPFMGGetFinalRelativeResidualNorm(solver, &final_res_norm); HYPRE_SStructSysPFMGGetNumIterations(solver, &its); /* clean up */ HYPRE_SStructSysPFMGDestroy(solver); } else if (solver_id == 2) /* GMRES with AMG */ { HYPRE_ParCSRGMRESCreate(MPI_COMM_WORLD, &par_solver); /* set the GMRES paramaters */ HYPRE_GMRESSetKDim(par_solver, 5); HYPRE_GMRESSetMaxIter(par_solver, 100); HYPRE_GMRESSetTol(par_solver, 1.0e-06); HYPRE_GMRESSetPrintLevel(par_solver, 2); HYPRE_GMRESSetLogging(par_solver, 1); /* use BoomerAMG as preconditioner */ HYPRE_BoomerAMGCreate(&par_precond); HYPRE_BoomerAMGSetCoarsenType(par_precond, 6); HYPRE_BoomerAMGSetOldDefault(par_precond); HYPRE_BoomerAMGSetStrongThreshold(par_precond, 0.25); HYPRE_BoomerAMGSetTol(par_precond, 0.0); HYPRE_BoomerAMGSetPrintLevel(par_precond, 1); HYPRE_BoomerAMGSetPrintFileName(par_precond, "ex9.out.log"); HYPRE_BoomerAMGSetMaxIter(par_precond, 1); /* set the preconditioner */ HYPRE_ParCSRGMRESSetPrecond(par_solver, HYPRE_BoomerAMGSolve, HYPRE_BoomerAMGSetup, par_precond); /* do the setup */ HYPRE_ParCSRGMRESSetup(par_solver, par_A, par_b, par_x); /* do the solve */ HYPRE_ParCSRGMRESSolve(par_solver, par_A, par_b, par_x); /* get some info */ HYPRE_GMRESGetNumIterations(par_solver, &its); HYPRE_GMRESGetFinalRelativeResidualNorm(par_solver, &final_res_norm); /* clean up */ HYPRE_ParCSRGMRESDestroy(par_solver); HYPRE_BoomerAMGDestroy(par_precond); } else if (solver_id == 3) /* AMG */ { HYPRE_BoomerAMGCreate(&par_solver); HYPRE_BoomerAMGSetCoarsenType(par_solver, 6); HYPRE_BoomerAMGSetOldDefault(par_solver); HYPRE_BoomerAMGSetStrongThreshold(par_solver, 0.25); HYPRE_BoomerAMGSetTol(par_solver, 1.9e-6); HYPRE_BoomerAMGSetPrintLevel(par_solver, 1); HYPRE_BoomerAMGSetPrintFileName(par_solver, "ex9.out.log"); HYPRE_BoomerAMGSetMaxIter(par_solver, 50); /* do the setup */ HYPRE_BoomerAMGSetup(par_solver, par_A, par_b, par_x); /* do the solve */ HYPRE_BoomerAMGSolve(par_solver, par_A, par_b, par_x); /* get some info */ HYPRE_BoomerAMGGetNumIterations(par_solver, &its); HYPRE_BoomerAMGGetFinalRelativeResidualNorm(par_solver, &final_res_norm); /* clean up */ HYPRE_BoomerAMGDestroy(par_solver); } else { if (myid == 0) { printf("\n ERROR: Invalid solver id specified.\n"); } } /* Gather the solution vector. This needs to be done if: (1) the object type is parcsr OR (2) any one of the variables is NOT cell-centered */ if (object_type == HYPRE_PARCSR) { HYPRE_SStructVectorGather(x); } /* Save the solution for GLVis visualization, see vis/glvis-ex7.sh */ if (vis) { #ifdef HYPRE_EXVIS FILE *file; char filename[255]; int k, part = 0, var; int nvalues = n * n; double *values = (double*) calloc(nvalues, sizeof(double)); /* save local solution for variable u */ var = 0; HYPRE_SStructVectorGetBoxValues(x, part, ilower, iupper, var, values); sprintf(filename, "%s.%06d", "vis/ex9-u.sol", myid); if ((file = fopen(filename, "w")) == NULL) { printf("Error: can't open output file %s\n", filename); MPI_Finalize(); exit(1); } /* save solution with global unknown numbers */ k = 0; for (j = 0; j < n; j++) for (i = 0; i < n; i++) { fprintf(file, "%06d %.14e\n", pj * N * n * n + pi * n + j * N * n + i, values[k++]); } fflush(file); fclose(file); /* save local solution for variable v */ var = 1; HYPRE_SStructVectorGetBoxValues(x, part, ilower, iupper, var, values); sprintf(filename, "%s.%06d", "vis/ex9-v.sol", myid); if ((file = fopen(filename, "w")) == NULL) { printf("Error: can't open output file %s\n", filename); MPI_Finalize(); exit(1); } /* save solution with global unknown numbers */ k = 0; for (j = 0; j < n; j++) for (i = 0; i < n; i++) { fprintf(file, "%06d %.14e\n", pj * N * n * n + pi * n + j * N * n + i, values[k++]); } fflush(file); fclose(file); free(values); /* save global finite element mesh */ if (myid == 0) { GLVis_PrintGlobalSquareMesh("vis/ex9.mesh", N * n - 1); } #endif } if (myid == 0) { printf("\n"); printf("Iterations = %d\n", its); printf("Final Relative Residual Norm = %g\n", final_res_norm); printf("\n"); } } /* Free memory */ HYPRE_SStructGridDestroy(grid); HYPRE_SStructStencilDestroy(stencil_v); HYPRE_SStructStencilDestroy(stencil_u); HYPRE_SStructGraphDestroy(graph); HYPRE_SStructMatrixDestroy(A); HYPRE_SStructVectorDestroy(b); HYPRE_SStructVectorDestroy(x); /* Finalize HYPRE */ HYPRE_Finalize(); /* Finalize MPI */ MPI_Finalize(); return (0); } hypre-2.33.0/src/examples/vis.c000066400000000000000000000737761477326011500163320ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /* Save a structured n x n mesh of square elements on the unit square into a GLVis mesh file with the given name. */ #include void GLVis_PrintGlobalSquareMesh(const char *meshfile, int n) { FILE *file; int Dim = 2; int NumOfVertices = (n + 1) * (n + 1); int NumOfElements = n * n; int i, j; double x, y; double h = 1.0 / n; if ((file = fopen(meshfile, "w")) == NULL) { printf("Error: can't open output file %s\n", meshfile); exit(1); } /* mesh header */ fprintf(file, "MFEM mesh v1.0\n"); fprintf(file, "\ndimension\n"); fprintf(file, "%d\n", Dim); /* mesh elements */ fprintf(file, "\nelements\n"); fprintf(file, "%d\n", NumOfElements); for (j = 0; j < n; j++) for (i = 0; i < n; i++) fprintf(file, "1 3 %d %d %d %d\n", i + j * (n + 1), i + 1 + j * (n + 1), i + 1 + (j + 1) * (n + 1), i + (j + 1) * (n + 1)); /* boundary will be generated by GLVis */ fprintf(file, "\nboundary\n"); fprintf(file, "0\n"); /* mesh vertices */ fprintf(file, "\nvertices\n"); fprintf(file, "%d\n", NumOfVertices); fprintf(file, "%d\n", Dim); for (j = 0; j < n + 1; j++) for (i = 0; i < n + 1; i++) { x = i * h; y = j * h; fprintf(file, "%.14e %.14e\n", x, y); } fflush(file); fclose(file); } /* Save a structured nx x ny mesh of square elements of size h, globally translated by (x0,y0), into a GLVis mesh file with the given prefix. */ void GLVis_PrintLocalSquareMesh(const char *meshfile_prefix, int nx, int ny, double h, double x0, double y0, int myid) { FILE *file; char meshfile[255]; int Dim = 2; int NumOfVertices = (nx + 1) * (ny + 1); int NumOfElements = nx * ny; int i, j; double x, y; sprintf(meshfile, "%s.%06d", meshfile_prefix, myid); if ((file = fopen(meshfile, "w")) == NULL) { printf("Error: can't open output file %s\n", meshfile); exit(1); } /* mesh header */ fprintf(file, "MFEM mesh v1.0\n"); fprintf(file, "\ndimension\n"); fprintf(file, "%d\n", Dim); /* mesh elements */ fprintf(file, "\nelements\n"); fprintf(file, "%d\n", NumOfElements); for (j = 0; j < ny; j++) for (i = 0; i < nx; i++) fprintf(file, "1 3 %d %d %d %d\n", i + j * (nx + 1), i + 1 + j * (nx + 1), i + 1 + (j + 1) * (nx + 1), i + (j + 1) * (nx + 1)); /* boundary will be generated by GLVis */ fprintf(file, "\nboundary\n"); fprintf(file, "0\n"); /* mesh vertices */ fprintf(file, "\nvertices\n"); fprintf(file, "%d\n", NumOfVertices); fprintf(file, "%d\n", Dim); for (j = 0; j < ny + 1; j++) for (i = 0; i < nx + 1; i++) { x = x0 + i * h; y = y0 + j * h; fprintf(file, "%.14e %.14e\n", x, y); } fflush(file); fclose(file); } /* Save a structured n x n mesh of gamma-angled rhombuses, globally rotated by angle gamma*myid, into a GLVis mesh file with the given prefix. */ void GLVis_PrintLocalRhombusMesh(const char *meshfile_prefix, int n, int myid, double gamma) { FILE *file; char meshfile[255]; int Dim = 2; int NumOfVertices = (n + 1) * (n + 1); int NumOfElements = n * n; int i, j; double x, y; double h = 1.0 / n; double rho = gamma * myid; double sg = sin(gamma); double cg = cos(gamma); double sr = sin(rho); double cr = cos(rho); sprintf(meshfile, "%s.%06d", meshfile_prefix, myid); if ((file = fopen(meshfile, "w")) == NULL) { printf("Error: can't open output file %s\n", meshfile); exit(1); } /* mesh header */ fprintf(file, "MFEM mesh v1.0\n"); fprintf(file, "\ndimension\n"); fprintf(file, "%d\n", Dim); /* mesh elements */ fprintf(file, "\nelements\n"); fprintf(file, "%d\n", NumOfElements); for (j = 0; j < n; j++) for (i = 0; i < n; i++) fprintf(file, "1 3 %d %d %d %d\n", i + j * (n + 1), i + 1 + j * (n + 1), i + 1 + (j + 1) * (n + 1), i + (j + 1) * (n + 1)); /* boundary will be generated by GLVis */ fprintf(file, "\nboundary\n"); fprintf(file, "0\n"); /* mesh vertices */ fprintf(file, "\nvertices\n"); fprintf(file, "%d\n", NumOfVertices); fprintf(file, "%d\n", Dim); for (j = 0; j < n + 1; j++) for (i = 0; i < n + 1; i++) { x = i * h + cg * j * h; y = sg * j * h; fprintf(file, "%.14e %.14e\n", cr * x - sr * y, sr * x + cr * y); } fflush(file); fclose(file); } /* Save a structured nx x ny x nz mesh of cubic elements of size h, globally translated by (x0,y0,z0), into a GLVis mesh file with the given prefix. */ void GLVis_PrintLocalCubicMesh(const char *meshfile_prefix, int nx, int ny, int nz, double h, double x0, double y0, double z0, int myid) { FILE *file; char meshfile[255]; int Dim = 3; int NumOfVertices = (nx + 1) * (ny + 1) * (nz + 1); int NumOfElements = nx * ny * nz; int i, j, k; double x, y, z; sprintf(meshfile, "%s.%06d", meshfile_prefix, myid); if ((file = fopen(meshfile, "w")) == NULL) { printf("Error: can't open output file %s\n", meshfile); exit(1); } /* mesh header */ fprintf(file, "MFEM mesh v1.0\n"); fprintf(file, "\ndimension\n"); fprintf(file, "%d\n", Dim); /* mesh elements */ fprintf(file, "\nelements\n"); fprintf(file, "%d\n", NumOfElements); for (k = 0; k < nz; k++) for (j = 0; j < ny; j++) for (i = 0; i < nx; i++) fprintf(file, "1 5 %d %d %d %d %d %d %d %d\n", i + j * (nx + 1) + k * (nx + 1) * (ny + 1), i + 1 + j * (nx + 1) + k * (nx + 1) * (ny + 1), i + 1 + (j + 1) * (nx + 1) + k * (nx + 1) * (ny + 1), i + (j + 1) * (nx + 1) + k * (nx + 1) * (ny + 1), i + j * (nx + 1) + (k + 1) * (nx + 1) * (ny + 1), i + 1 + j * (nx + 1) + (k + 1) * (nx + 1) * (ny + 1), i + 1 + (j + 1) * (nx + 1) + (k + 1) * (nx + 1) * (ny + 1), i + (j + 1) * (nx + 1) + (k + 1) * (nx + 1) * (ny + 1)); /* boundary will be generated by GLVis */ fprintf(file, "\nboundary\n"); fprintf(file, "0\n"); /* mesh vertices */ fprintf(file, "\nvertices\n"); fprintf(file, "%d\n", NumOfVertices); fprintf(file, "%d\n", Dim); for (k = 0; k < nz + 1; k++) for (j = 0; j < ny + 1; j++) for (i = 0; i < nx + 1; i++) { x = x0 + i * h; y = y0 + j * h; z = z0 + k * h; fprintf(file, "%.14e %.14e %.14e\n", x, y, z); } fflush(file); fclose(file); } #include "HYPRE_sstruct_mv.h" #include "_hypre_sstruct_mv.h" /* Save a GLVis mesh file with the given prefix corresponding to the input SStruct grid assuming that the cells in each part are the same. The optional trans and origin parameters specify the coordinate transformation for each part, relative to a square Cartesian grid. */ void GLVis_PrintSStructGrid(HYPRE_SStructGrid grid, const char *meshfile_prefix, int myid, double *trans, double *origin) { FILE *file; char meshfile[255]; int dim = ((hypre_SStructGrid *)grid)->ndim; int cellNV = (dim == 2) ? 4 : 8; int elemid = 2 * dim - 1; int nvert, nelem; hypre_StructGrid *part; int p, nparts = ((hypre_SStructGrid *)grid)->nparts; int given_trans = (trans != NULL && origin != NULL); double *T = trans, *O = origin; hypre_BoxArray *boxes; hypre_Box *box; int b, ncells; nvert = nelem = 0; for (p = 0; p < nparts; p++) { part = ((hypre_SStructGrid *)grid)->pgrids[p]->sgrids[0]; boxes = hypre_StructGridBoxes(part); for (b = 0; b < hypre_BoxArraySize(boxes); b++) { box = hypre_BoxArrayBox(boxes, b); ncells = hypre_BoxVolume(box); nvert += ncells * cellNV; nelem += ncells; } } { int i, j, k, v, vert; double x0, y0, z0, h; sprintf(meshfile, "%s.%06d", meshfile_prefix, myid); if ((file = fopen(meshfile, "w")) == NULL) { printf("Error: can't open output file %s\n", meshfile); exit(1); } /* mesh header */ fprintf(file, "MFEM mesh v1.0\n"); fprintf(file, "\ndimension\n"); fprintf(file, "%d\n", dim); /* mesh elements */ fprintf(file, "\nelements\n"); fprintf(file, "%d\n", nelem); vert = 0; for (p = 0; p < nparts; p++) { part = ((hypre_SStructGrid *)grid)->pgrids[p]->sgrids[0]; boxes = hypre_StructGridBoxes(part); for (b = 0; b < hypre_BoxArraySize(boxes); b++) { box = hypre_BoxArrayBox(boxes, b); for (k = hypre_BoxIMinD(box, 2); k <= hypre_BoxIMaxD(box, 2); k++) for (j = hypre_BoxIMinD(box, 1); j <= hypre_BoxIMaxD(box, 1); j++) for (i = hypre_BoxIMinD(box, 0); i <= hypre_BoxIMaxD(box, 0); i++) { fprintf(file, "1 %d ", elemid); for (v = 0; v < cellNV; v++, vert++) { fprintf(file, "%d ", vert); } fprintf(file, "\n"); } } } /* boundary will be generated by GLVis */ fprintf(file, "\nboundary\n"); fprintf(file, "0\n"); /* mesh vertices */ fprintf(file, "\nvertices\n"); fprintf(file, "%d\n", nvert); fprintf(file, "%d\n", dim); for (p = 0; p < nparts; p++) { part = ((hypre_SStructGrid *)grid)->pgrids[p]->sgrids[0]; x0 = y0 = z0 = 0; h = 1.0; boxes = hypre_StructGridBoxes(part); for (b = 0; b < hypre_BoxArraySize(boxes); b++) { box = hypre_BoxArrayBox(boxes, b); for (k = hypre_BoxIMinD(box, 2); k <= hypre_BoxIMaxD(box, 2); k++) for (j = hypre_BoxIMinD(box, 1); j <= hypre_BoxIMaxD(box, 1); j++) for (i = hypre_BoxIMinD(box, 0); i <= hypre_BoxIMaxD(box, 0); i++) if (dim == 2) { if (!given_trans) { fprintf(file, "%.14e %.14e \n", x0 + i * h, y0 + j * h); fprintf(file, "%.14e %.14e \n", x0 + (i + 1)*h, y0 + j * h); fprintf(file, "%.14e %.14e \n", x0 + (i + 1)*h, y0 + (j + 1)*h); fprintf(file, "%.14e %.14e \n", x0 + i * h, y0 + (j + 1)*h); } else { fprintf(file, "%.14e %.14e \n", T[0]*i + T[1]*j + O[0], T[2]*i + T[3]*j + O[1]); fprintf(file, "%.14e %.14e \n", T[0] * (i + 1) + T[1]*j + O[0], T[2] * (i + 1) + T[3]*j + O[1]); fprintf(file, "%.14e %.14e \n", T[0] * (i + 1) + T[1] * (j + 1) + O[0], T[2] * (i + 1) + T[3] * (j + 1) + O[1]); fprintf(file, "%.14e %.14e \n", T[0]*i + T[1] * (j + 1) + O[0], T[2]*i + T[3] * (j + 1) + O[1]); } } else { if (!given_trans) { fprintf(file, "%.14e %.14e %.14e \n", x0 + i * h, y0 + j * h, z0 + k * h); fprintf(file, "%.14e %.14e %.14e \n", x0 + (i + 1)*h, y0 + j * h, z0 + k * h); fprintf(file, "%.14e %.14e %.14e \n", x0 + (i + 1)*h, y0 + (j + 1)*h, z0 + k * h); fprintf(file, "%.14e %.14e %.14e \n", x0 + i * h, y0 + (j + 1)*h, z0 + k * h); fprintf(file, "%.14e %.14e %.14e \n", x0 + i * h, y0 + j * h, z0 + (k + 1)*h); fprintf(file, "%.14e %.14e %.14e \n", x0 + (i + 1)*h, y0 + j * h, z0 + (k + 1)*h); fprintf(file, "%.14e %.14e %.14e \n", x0 + (i + 1)*h, y0 + (j + 1)*h, z0 + (k + 1)*h); fprintf(file, "%.14e %.14e %.14e \n", x0 + i * h, y0 + (j + 1)*h, z0 + (k + 1)*h); } else { fprintf(file, "%.14e %.14e %.14e \n", T[0]*i + T[1]*j + T[2]*k + O[0], T[3]*i + T[4]*j + T[5]*k + O[1], T[6]*i + T[7]*j + T[8]*k + O[2]); fprintf(file, "%.14e %.14e %.14e \n", T[0] * (i + 1) + T[1]*j + T[2]*k + O[0], T[3] * (i + 1) + T[4]*j + T[5]*k + O[1], T[6] * (i + 1) + T[7]*j + T[8]*k + O[2]); fprintf(file, "%.14e %.14e %.14e \n", T[0] * (i + 1) + T[1] * (j + 1) + T[2]*k + O[0], T[3] * (i + 1) + T[4] * (j + 1) + T[5]*k + O[1], T[6] * (i + 1) + T[7] * (j + 1) + T[8]*k + O[2]); fprintf(file, "%.14e %.14e %.14e \n", T[0]*i + T[1] * (j + 1) + T[2]*k + O[0], T[3]*i + T[4] * (j + 1) + T[5]*k + O[1], T[6]*i + T[7] * (j + 1) + T[8]*k + O[2]); fprintf(file, "%.14e %.14e %.14e \n", T[0]*i + T[1]*j + T[2] * (k + 1) + O[0], T[3]*i + T[4]*j + T[5] * (k + 1) + O[1], T[6]*i + T[7]*j + T[8] * (k + 1) + O[2]); fprintf(file, "%.14e %.14e %.14e \n", T[0] * (i + 1) + T[1]*j + T[2] * (k + 1) + O[0], T[3] * (i + 1) + T[4]*j + T[5] * (k + 1) + O[1], T[6] * (i + 1) + T[7]*j + T[8] * (k + 1) + O[2]); fprintf(file, "%.14e %.14e %.14e \n", T[0] * (i + 1) + T[1] * (j + 1) + T[2] * (k + 1) + O[0], T[3] * (i + 1) + T[4] * (j + 1) + T[5] * (k + 1) + O[1], T[6] * (i + 1) + T[7] * (j + 1) + T[8] * (k + 1) + O[2]); fprintf(file, "%.14e %.14e %.14e \n", T[0]*i + T[1] * (j + 1) + T[2] * (k + 1) + O[0], T[3]*i + T[4] * (j + 1) + T[5] * (k + 1) + O[1], T[6]*i + T[7] * (j + 1) + T[8] * (k + 1) + O[2]); } } } if (given_trans) { T += dim * dim; O += dim; } } fflush(file); fclose(file); } } /* Save a GLVis grid function (in a file with the given prefix) corresponding to the values of the input SStruct vector restricted to the specified SStruct variable. Currently only CELL and NODE variable types are supported. */ void GLVis_PrintSStructVector(HYPRE_SStructVector sol, int var, const char *solfile_prefix, int myid) { FILE *file; char solfile[255]; hypre_SStructGrid *grid = ((hypre_SStructVector*)sol)->grid; int dim = grid->ndim; hypre_StructGrid *part; int p, nparts = grid->nparts; hypre_BoxArray *boxes; hypre_Box *box; int b; int i, j, k, ni, nj, nk; double *values; int ilower[3], iupper[3]; HYPRE_SStructVariable vartype = grid->pgrids[0]->vartypes[var]; char fe_coll[100]; int var_off; sprintf(solfile, "%s.%06d", solfile_prefix, myid); if ((file = fopen(solfile, "w")) == NULL) { printf("Error: can't open output file %s\n", solfile); exit(1); } /* set the finite element collection based on variable type */ switch (vartype) { case HYPRE_SSTRUCT_VARIABLE_CELL: sprintf(fe_coll, "%s", "Local_L2_2D_P0"); var_off = 0; break; case HYPRE_SSTRUCT_VARIABLE_NODE: sprintf(fe_coll, "%s", "Local_H1_2D_P1"); var_off = 1; break; default: printf("Error: unsuported variable type\n"); exit(1); } /* grid function header */ fprintf(file, "FiniteElementSpace\n"); fprintf(file, "FiniteElementCollection: %s\n", fe_coll); fprintf(file, "VDim: 1\n"); fprintf(file, "Ordering: 0\n\n"); /* extract and save the vector values on each cell */ for (p = 0; p < nparts; p++) { part = grid->pgrids[p]->sgrids[0]; boxes = hypre_StructGridBoxes(part); for (b = 0; b < hypre_BoxArraySize(boxes); b++) { box = hypre_BoxArrayBox(boxes, b); ni = hypre_BoxSizeD(box, 0); nj = hypre_BoxSizeD(box, 1); nk = hypre_BoxSizeD(box, 2); ilower[0] = hypre_BoxIMinD(box, 0) - var_off; ilower[1] = hypre_BoxIMinD(box, 1) - var_off; iupper[0] = hypre_BoxIMaxD(box, 0); iupper[1] = hypre_BoxIMaxD(box, 1); if (dim == 2) { values = (double*) malloc((ni + var_off) * (nj + var_off) * sizeof(double)); } else { values = (double*) malloc((ni + var_off) * (nj + var_off) * (nk + var_off) * sizeof(double)); ilower[2] = hypre_BoxIMinD(box, 2) - var_off; iupper[2] = hypre_BoxIMaxD(box, 2); } HYPRE_SStructVectorGetBoxValues(sol, p, ilower, iupper, var, values); if (vartype == HYPRE_SSTRUCT_VARIABLE_CELL) { for (k = 0; k < nk; k++) for (j = 0; j < nj; j++) for (i = 0; i < ni; i++) { fprintf(file, "%.14e\n", values[i + j * ni]); } } else if (vartype == HYPRE_SSTRUCT_VARIABLE_NODE) { if (dim == 2) { for (j = 0; j < nj; j++) for (i = 0; i < ni; i++) { fprintf(file, "%.14e\n", values[i + j * (ni + 1)]); fprintf(file, "%.14e\n", values[i + 1 + j * (ni + 1)]); fprintf(file, "%.14e\n", values[i + 1 + (j + 1) * (ni + 1)]); fprintf(file, "%.14e\n", values[i + (j + 1) * (ni + 1)]); } } else { for (k = 0; k < nk; k++) for (j = 0; j < nj; j++) for (i = 0; i < ni; i++) { fprintf(file, "%.14e\n", values[i + j * (ni + 1) + k * (ni + 1) * (nj + 1)]); fprintf(file, "%.14e\n", values[i + 1 + j * (ni + 1) + k * (ni + 1) * (nj + 1)]); fprintf(file, "%.14e\n", values[i + 1 + (j + 1) * (ni + 1) + k * (ni + 1) * (nj + 1)]); fprintf(file, "%.14e\n", values[i + (j + 1) * (ni + 1) + k * (ni + 1) * (nj + 1)]); fprintf(file, "%.14e\n", values[i + j * (ni + 1) + (k + 1) * (ni + 1) * (nj + 1)]); fprintf(file, "%.14e\n", values[i + 1 + j * (ni + 1) + (k + 1) * (ni + 1) * (nj + 1)]); fprintf(file, "%.14e\n", values[i + 1 + (j + 1) * (ni + 1) + (k + 1) * (ni + 1) * (nj + 1)]); fprintf(file, "%.14e\n", values[i + (j + 1) * (ni + 1) + (k + 1) * (ni + 1) * (nj + 1)]); } } } free(values); } } fflush(file); fclose(file); } /* Save a GLVis mesh file with the given prefix corresponding to the input Struct grid assuming that the cells are the same. The optional trans and origin parameters specify a coordinate transformation, relative to a square Cartesian grid. */ void GLVis_PrintStructGrid(HYPRE_StructGrid Grid, const char *meshfile_prefix, int myid, double *trans, double *origin) { FILE *file; char meshfile[255]; hypre_StructGrid *grid = (hypre_StructGrid *)Grid; int dim = grid->ndim; int cellNV = (dim == 2) ? 4 : 8; int elemid = 2 * dim - 1; int nvert, nelem; int given_trans = (trans != NULL && origin != NULL); double *T = trans, *O = origin; hypre_BoxArray *boxes; hypre_Box *box; int b, ncells; nvert = nelem = 0; boxes = hypre_StructGridBoxes(grid); for (b = 0; b < hypre_BoxArraySize(boxes); b++) { box = hypre_BoxArrayBox(boxes, b); ncells = hypre_BoxVolume(box); nvert += ncells * cellNV; nelem += ncells; } { int i, j, k, v, vert; double x0, y0, z0, h; sprintf(meshfile, "%s.%06d", meshfile_prefix, myid); if ((file = fopen(meshfile, "w")) == NULL) { printf("Error: can't open output file %s\n", meshfile); exit(1); } /* mesh header */ fprintf(file, "MFEM mesh v1.0\n"); fprintf(file, "\ndimension\n"); fprintf(file, "%d\n", dim); /* mesh elements */ fprintf(file, "\nelements\n"); fprintf(file, "%d\n", nelem); vert = 0; boxes = hypre_StructGridBoxes(grid); for (b = 0; b < hypre_BoxArraySize(boxes); b++) { box = hypre_BoxArrayBox(boxes, b); for (k = hypre_BoxIMinD(box, 2); k <= hypre_BoxIMaxD(box, 2); k++) for (j = hypre_BoxIMinD(box, 1); j <= hypre_BoxIMaxD(box, 1); j++) for (i = hypre_BoxIMinD(box, 0); i <= hypre_BoxIMaxD(box, 0); i++) { fprintf(file, "1 %d ", elemid); for (v = 0; v < cellNV; v++, vert++) { fprintf(file, "%d ", vert); } fprintf(file, "\n"); } } /* boundary will be generated by GLVis */ fprintf(file, "\nboundary\n"); fprintf(file, "0\n"); /* mesh vertices */ fprintf(file, "\nvertices\n"); fprintf(file, "%d\n", nvert); fprintf(file, "%d\n", dim); x0 = y0 = z0 = 0; h = 1.0; boxes = hypre_StructGridBoxes(grid); for (b = 0; b < hypre_BoxArraySize(boxes); b++) { box = hypre_BoxArrayBox(boxes, b); for (k = hypre_BoxIMinD(box, 2); k <= hypre_BoxIMaxD(box, 2); k++) for (j = hypre_BoxIMinD(box, 1); j <= hypre_BoxIMaxD(box, 1); j++) for (i = hypre_BoxIMinD(box, 0); i <= hypre_BoxIMaxD(box, 0); i++) if (dim == 2) { if (!given_trans) { fprintf(file, "%.14e %.14e \n", x0 + i * h, y0 + j * h); fprintf(file, "%.14e %.14e \n", x0 + (i + 1)*h, y0 + j * h); fprintf(file, "%.14e %.14e \n", x0 + (i + 1)*h, y0 + (j + 1)*h); fprintf(file, "%.14e %.14e \n", x0 + i * h, y0 + (j + 1)*h); } else { fprintf(file, "%.14e %.14e \n", T[0]*i + T[1]*j + O[0], T[2]*i + T[3]*j + O[1]); fprintf(file, "%.14e %.14e \n", T[0] * (i + 1) + T[1]*j + O[0], T[2] * (i + 1) + T[3]*j + O[1]); fprintf(file, "%.14e %.14e \n", T[0] * (i + 1) + T[1] * (j + 1) + O[0], T[2] * (i + 1) + T[3] * (j + 1) + O[1]); fprintf(file, "%.14e %.14e \n", T[0]*i + T[1] * (j + 1) + O[0], T[2]*i + T[3] * (j + 1) + O[1]); } } else { if (!given_trans) { fprintf(file, "%.14e %.14e %.14e \n", x0 + i * h, y0 + j * h, z0 + k * h); fprintf(file, "%.14e %.14e %.14e \n", x0 + (i + 1)*h, y0 + j * h, z0 + k * h); fprintf(file, "%.14e %.14e %.14e \n", x0 + (i + 1)*h, y0 + (j + 1)*h, z0 + k * h); fprintf(file, "%.14e %.14e %.14e \n", x0 + i * h, y0 + (j + 1)*h, z0 + k * h); fprintf(file, "%.14e %.14e %.14e \n", x0 + i * h, y0 + j * h, z0 + (k + 1)*h); fprintf(file, "%.14e %.14e %.14e \n", x0 + (i + 1)*h, y0 + j * h, z0 + (k + 1)*h); fprintf(file, "%.14e %.14e %.14e \n", x0 + (i + 1)*h, y0 + (j + 1)*h, z0 + (k + 1)*h); fprintf(file, "%.14e %.14e %.14e \n", x0 + i * h, y0 + (j + 1)*h, z0 + (k + 1)*h); } else { fprintf(file, "%.14e %.14e %.14e \n", T[0]*i + T[1]*j + T[2]*k + O[0], T[3]*i + T[4]*j + T[5]*k + O[1], T[6]*i + T[7]*j + T[8]*k + O[2]); fprintf(file, "%.14e %.14e %.14e \n", T[0] * (i + 1) + T[1]*j + T[2]*k + O[0], T[3] * (i + 1) + T[4]*j + T[5]*k + O[1], T[6] * (i + 1) + T[7]*j + T[8]*k + O[2]); fprintf(file, "%.14e %.14e %.14e \n", T[0] * (i + 1) + T[1] * (j + 1) + T[2]*k + O[0], T[3] * (i + 1) + T[4] * (j + 1) + T[5]*k + O[1], T[6] * (i + 1) + T[7] * (j + 1) + T[8]*k + O[2]); fprintf(file, "%.14e %.14e %.14e \n", T[0]*i + T[1] * (j + 1) + T[2]*k + O[0], T[3]*i + T[4] * (j + 1) + T[5]*k + O[1], T[6]*i + T[7] * (j + 1) + T[8]*k + O[2]); fprintf(file, "%.14e %.14e %.14e \n", T[0]*i + T[1]*j + T[2] * (k + 1) + O[0], T[3]*i + T[4]*j + T[5] * (k + 1) + O[1], T[6]*i + T[7]*j + T[8] * (k + 1) + O[2]); fprintf(file, "%.14e %.14e %.14e \n", T[0] * (i + 1) + T[1]*j + T[2] * (k + 1) + O[0], T[3] * (i + 1) + T[4]*j + T[5] * (k + 1) + O[1], T[6] * (i + 1) + T[7]*j + T[8] * (k + 1) + O[2]); fprintf(file, "%.14e %.14e %.14e \n", T[0] * (i + 1) + T[1] * (j + 1) + T[2] * (k + 1) + O[0], T[3] * (i + 1) + T[4] * (j + 1) + T[5] * (k + 1) + O[1], T[6] * (i + 1) + T[7] * (j + 1) + T[8] * (k + 1) + O[2]); fprintf(file, "%.14e %.14e %.14e \n", T[0]*i + T[1] * (j + 1) + T[2] * (k + 1) + O[0], T[3]*i + T[4] * (j + 1) + T[5] * (k + 1) + O[1], T[6]*i + T[7] * (j + 1) + T[8] * (k + 1) + O[2]); } } if (given_trans) { T += dim * dim; O += dim; } } fflush(file); fclose(file); } } /* Save a Q0 GLVis grid function (in a file with the given prefix) corresponding to the values of the input Struct vector. */ void GLVis_PrintStructVector(HYPRE_StructVector sol, const char *solfile_prefix, int myid) { FILE *file; char solfile[255]; hypre_StructGrid *grid = ((hypre_StructVector*)sol)->grid; int dim = grid->ndim; hypre_BoxArray *boxes; hypre_Box *box; int b; int i, j, k, ni, nj, nk; double *values; int ilower[3], iupper[3]; sprintf(solfile, "%s.%06d", solfile_prefix, myid); if ((file = fopen(solfile, "w")) == NULL) { printf("Error: can't open output file %s\n", solfile); exit(1); } /* grid function header */ fprintf(file, "FiniteElementSpace\n"); fprintf(file, "FiniteElementCollection: Local_L2_2D_P0\n"); fprintf(file, "VDim: 1\n"); fprintf(file, "Ordering: 0\n\n"); /* extract and save the vector values on each cell */ boxes = hypre_StructGridBoxes(grid); for (b = 0; b < hypre_BoxArraySize(boxes); b++) { box = hypre_BoxArrayBox(boxes, b); ni = hypre_BoxSizeD(box, 0); nj = hypre_BoxSizeD(box, 1); nk = hypre_BoxSizeD(box, 2); ilower[0] = hypre_BoxIMinD(box, 0); ilower[1] = hypre_BoxIMinD(box, 1); iupper[0] = hypre_BoxIMaxD(box, 0); iupper[1] = hypre_BoxIMaxD(box, 1); if (dim == 2) { values = (double*) malloc(ni * nj * sizeof(double)); } else { values = (double*) malloc(ni * nj * nk * sizeof(double)); ilower[2] = hypre_BoxIMinD(box, 2); iupper[2] = hypre_BoxIMaxD(box, 2); } HYPRE_StructVectorGetBoxValues(sol, ilower, iupper, values); for (k = 0; k < nk; k++) for (j = 0; j < nj; j++) for (i = 0; i < ni; i++) { fprintf(file, "%.14e\n", values[i + j * ni]); } free(values); } fflush(file); fclose(file); } /* Save additional data needed for GLVis visualization (e.g. the number of processors in the run). */ void GLVis_PrintData(const char *datafile, int myid, int num_procs) { FILE *file; if (myid == 0) { file = fopen(datafile, "w"); fprintf(file, "np %d\n", num_procs); fflush(file); fclose(file); } } hypre-2.33.0/src/examples/vis/000077500000000000000000000000001477326011500161425ustar00rootroot00000000000000hypre-2.33.0/src/examples/vis/Makefile000066400000000000000000000003471477326011500176060ustar00rootroot00000000000000# Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) clean: rm -f *mesh* *sol* *data* hypre-2.33.0/src/examples/vis/README000066400000000000000000000063161477326011500170300ustar00rootroot00000000000000# Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) This directory contains scripts that use the GLVis visualization tool to plot the numerical results for most of the hypre example codes. To use the scripts, one first needs to download and install the latest versions of GLVis and the MFEM finite element library (you will need versions 2.0, or later) from the following websites: http://glvis.org http://mfem.org See http://mfem.org/building for building instructions. Assuming that the "glvis" binary is in your $PATH, you can use it to examine the results from hypre's example codes as follows: 1) Run an example with the "-vis" option, e.g. mpirun -np 16 ex4 -n 10 -U0 2 -K 2 -F 4 -vis This will save a number of files describing the solution and the mesh with the example name prefix in the vis/ sub-directory. These files can be cleaned by "make clean" in the examples/ or the vis/ directories. 2) Execute the corresponding "glvis" shell script from the vis/ directory, e.g. vis/glvis-ex4.sh The scripts can be run from either examples/ or the vis/ directories and will check if the solution data exists before visualizing it. Note that some of the scripts, such as glvis-ex3.sh, use pre-processing to merge the parallel results into serial form, while others (e.g. most of the examples based on finite elements) directly visualize parallel data. 3) Interact with the solution in the GLVis window using the mouse buttons and command keystrokes documented in the GLVis README file. Some of the more frequently used keystrokes are as follows: h - Prints a short help message in the terminal m - Toggle mesh level lines a - Toggle bounding box axes c - Display/Hide the colorbar p - Cycle through color palettes t - Cycle materials and lights r - Reset the plot to 3D view R - Cycle through different 2D projections j - Turn on/off perspective l - Turn on/off light g - Toggle background color A - Turn on/off OpenGL anti-aliasing/multi-sampling q - Exit The glvis binary can also be used directly to visualize the solutions of the finite element-based examples 13, 14, 15 and 16. For example: mpirun -np 6 ex13 -n 30 -vis glvis -np 6 -m vis/ex13.mesh -g vis/ex13.sol Pressing the keys "AbjRl************" in the GLVis interactive window will now produce the same result as running vis/glvis-ex13.sh. In this parallel finite element mode, one can use the F11/F12 and the "b" keys to shrink/zoom or plot the boundary of the processor subdomains. Individual processor subdomains with their solutions can also be visualized directly, and the command keystrokes can be passed with the -k option: glvis -m vis/ex13.mesh.000005 -g vis/ex13.sol.000005 -k "Aaammcb" Various finite elements are directly supported in GLVis, such as high-order nodal elements: mpirun -np 4 ex16 -n 2 -vis vis/glvis-ex16.sh or Nedelec (edge) elements: mpirun -np 8 ex15 -a 1 -vis vis/glvis-ex15.sh hypre-2.33.0/src/examples/vis/glvis-ex1.sh000077500000000000000000000010711477326011500203170ustar00rootroot00000000000000#!/bin/bash # Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) ex=ex1 dir=`basename \`pwd\`` keys=Aaamc if [ "$dir" = "vis" ]; then dir=. mesh=$ex.mesh sol=$ex.sol else dir=vis mesh=vis/$ex.mesh sol=vis/$ex.sol fi if [ ! -e $mesh.000000 ] then echo "Can't find visualization data for $ex!" exit fi np=`cat $dir/$ex.data | head -n 1 | awk '{ print $2 }'` glvis -np $np -m $mesh -g $sol -k $keys hypre-2.33.0/src/examples/vis/glvis-ex10.sh000077500000000000000000000010731477326011500204010ustar00rootroot00000000000000#!/bin/bash # Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) ex=ex10 dir=`basename \`pwd\`` keys=Aaamc if [ "$dir" = "vis" ]; then dir=. mesh=$ex.mesh sol=$ex.sol else dir=vis mesh=vis/$ex.mesh sol=vis/$ex.sol fi if [ ! -e $mesh.000000 ] then echo "Can't find visualization data for $ex!" exit fi np=`cat $dir/$ex.data | head -n 1 | awk '{ print $2 }'` glvis -np $np -m $mesh -g $sol -k $keys hypre-2.33.0/src/examples/vis/glvis-ex11.sh000077500000000000000000000013031477326011500203760ustar00rootroot00000000000000#!/bin/bash # Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) ex=ex11 dir=`basename \`pwd\`` keys=Aaamc if [ "$dir" = "vis" ]; then dir=. mesh=$ex.mesh sol=$ex.sol else dir=vis mesh=vis/$ex.mesh sol=vis/$ex.sol fi if [ ! -e $mesh ] then echo "Can't find visualization data for $ex!" exit fi echo "FiniteElementSpace" > $sol echo "FiniteElementCollection: H1_2D_P1" >> $sol echo "VDim: 1" >> $sol echo "Ordering: 0" >> $sol echo "" >> $sol find $dir -name "$ex.sol.??????" | sort | xargs cat >> $sol glvis -m $mesh -g $sol -k $keys hypre-2.33.0/src/examples/vis/glvis-ex12.sh000077500000000000000000000010721477326011500204020ustar00rootroot00000000000000#!/bin/bash # Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) ex=ex12 dir=`basename \`pwd\`` keys=Aaamc if [ "$dir" = "vis" ]; then dir=. mesh=$ex.mesh sol=$ex.sol else dir=vis mesh=vis/$ex.mesh sol=vis/$ex.sol fi if [ ! -e $mesh.000000 ] then echo "Can't find visualization data for $ex!" exit fi np=`cat $dir/$ex.data | head -n 1 | awk '{ print $2 }'` glvis -np $np -m $mesh -g $sol -k $keys hypre-2.33.0/src/examples/vis/glvis-ex13.sh000077500000000000000000000011071477326011500204020ustar00rootroot00000000000000#!/bin/bash # Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) ex=ex13 dir=`basename \`pwd\`` keys=AbjRl************ if [ "$dir" = "vis" ]; then dir=. mesh=$ex.mesh sol=$ex.sol else dir=vis mesh=vis/$ex.mesh sol=vis/$ex.sol fi if [ ! -e $mesh.000000 ] then echo "Can't find visualization data for $ex!" exit fi np=`cat $dir/$ex.data | head -n 1 | awk '{ print $2 }'` glvis -np $np -m $mesh -g $sol -k $keys hypre-2.33.0/src/examples/vis/glvis-ex14.sh000077500000000000000000000011071477326011500204030ustar00rootroot00000000000000#!/bin/bash # Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) ex=ex14 dir=`basename \`pwd\`` keys=AbjRl************ if [ "$dir" = "vis" ]; then dir=. mesh=$ex.mesh sol=$ex.sol else dir=vis mesh=vis/$ex.mesh sol=vis/$ex.sol fi if [ ! -e $mesh.000000 ] then echo "Can't find visualization data for $ex!" exit fi np=`cat $dir/$ex.data | head -n 1 | awk '{ print $2 }'` glvis -np $np -m $mesh -g $sol -k $keys hypre-2.33.0/src/examples/vis/glvis-ex15.sh000077500000000000000000000011001477326011500203750ustar00rootroot00000000000000#!/bin/bash # Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) ex=ex15 dir=`basename \`pwd\`` keys=AaamcVooof if [ "$dir" = "vis" ]; then dir=. mesh=$ex.mesh sol=$ex.sol else dir=vis mesh=vis/$ex.mesh sol=vis/$ex.sol fi if [ ! -e $mesh.000000 ] then echo "Can't find visualization data for $ex!" exit fi np=`cat $dir/$ex.data | head -n 1 | awk '{ print $2 }'` glvis -np $np -m $mesh -g $sol -k $keys hypre-2.33.0/src/examples/vis/glvis-ex16.sh000077500000000000000000000010771477326011500204130ustar00rootroot00000000000000#!/bin/bash # Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) ex=ex16 dir=`basename \`pwd\`` keys=Aaamciiii if [ "$dir" = "vis" ]; then dir=. mesh=$ex.mesh sol=$ex.sol else dir=vis mesh=vis/$ex.mesh sol=vis/$ex.sol fi if [ ! -e $mesh.000000 ] then echo "Can't find visualization data for $ex!" exit fi np=`cat $dir/$ex.data | head -n 1 | awk '{ print $2 }'` glvis -np $np -m $mesh -g $sol -k $keys hypre-2.33.0/src/examples/vis/glvis-ex2.sh000077500000000000000000000010711477326011500203200ustar00rootroot00000000000000#!/bin/bash # Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) ex=ex2 dir=`basename \`pwd\`` keys=Aaamc if [ "$dir" = "vis" ]; then dir=. mesh=$ex.mesh sol=$ex.sol else dir=vis mesh=vis/$ex.mesh sol=vis/$ex.sol fi if [ ! -e $mesh.000000 ] then echo "Can't find visualization data for $ex!" exit fi np=`cat $dir/$ex.data | head -n 1 | awk '{ print $2 }'` glvis -np $np -m $mesh -g $sol -k $keys hypre-2.33.0/src/examples/vis/glvis-ex3.sh000077500000000000000000000013361477326011500203250ustar00rootroot00000000000000#!/bin/bash # Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) ex=ex3 dir=`basename \`pwd\`` keys=Aaamc if [ "$dir" = "vis" ]; then dir=. mesh=$ex.mesh sol=$ex.sol else dir=vis mesh=vis/$ex.mesh sol=vis/$ex.sol fi if [ ! -e $mesh ] then echo "Can't find visualization data for $ex!" exit fi echo "FiniteElementSpace" > $sol echo "FiniteElementCollection: H1_2D_P1" >> $sol echo "VDim: 1" >> $sol echo "Ordering: 0" >> $sol echo "" >> $sol find $dir -name "$ex.sol.??????" | sort | xargs cat | sort | awk '{ print $2 }' >> $sol glvis -m $mesh -g $sol -k $keys hypre-2.33.0/src/examples/vis/glvis-ex4.sh000077500000000000000000000013361477326011500203260ustar00rootroot00000000000000#!/bin/bash # Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) ex=ex4 dir=`basename \`pwd\`` keys=Aaamc if [ "$dir" = "vis" ]; then dir=. mesh=$ex.mesh sol=$ex.sol else dir=vis mesh=vis/$ex.mesh sol=vis/$ex.sol fi if [ ! -e $mesh ] then echo "Can't find visualization data for $ex!" exit fi echo "FiniteElementSpace" > $sol echo "FiniteElementCollection: H1_2D_P1" >> $sol echo "VDim: 1" >> $sol echo "Ordering: 0" >> $sol echo "" >> $sol find $dir -name "$ex.sol.??????" | sort | xargs cat | sort | awk '{ print $2 }' >> $sol glvis -m $mesh -g $sol -k $keys hypre-2.33.0/src/examples/vis/glvis-ex5.sh000077500000000000000000000013021477326011500203200ustar00rootroot00000000000000#!/bin/bash # Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) ex=ex5 dir=`basename \`pwd\`` keys=Aaamc if [ "$dir" = "vis" ]; then dir=. mesh=$ex.mesh sol=$ex.sol else dir=vis mesh=vis/$ex.mesh sol=vis/$ex.sol fi if [ ! -e $mesh ] then echo "Can't find visualization data for $ex!" exit fi echo "FiniteElementSpace" > $sol echo "FiniteElementCollection: H1_2D_P1" >> $sol echo "VDim: 1" >> $sol echo "Ordering: 0" >> $sol echo "" >> $sol find $dir -name "$ex.sol.??????" | sort | xargs cat >> $sol glvis -m $mesh -g $sol -k $keys hypre-2.33.0/src/examples/vis/glvis-ex6.sh000077500000000000000000000010711477326011500203240ustar00rootroot00000000000000#!/bin/bash # Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) ex=ex6 dir=`basename \`pwd\`` keys=Aaamc if [ "$dir" = "vis" ]; then dir=. mesh=$ex.mesh sol=$ex.sol else dir=vis mesh=vis/$ex.mesh sol=vis/$ex.sol fi if [ ! -e $mesh.000000 ] then echo "Can't find visualization data for $ex!" exit fi np=`cat $dir/$ex.data | head -n 1 | awk '{ print $2 }'` glvis -np $np -m $mesh -g $sol -k $keys hypre-2.33.0/src/examples/vis/glvis-ex7.sh000077500000000000000000000013361477326011500203310ustar00rootroot00000000000000#!/bin/bash # Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) ex=ex7 dir=`basename \`pwd\`` keys=Aaamc if [ "$dir" = "vis" ]; then dir=. mesh=$ex.mesh sol=$ex.sol else dir=vis mesh=vis/$ex.mesh sol=vis/$ex.sol fi if [ ! -e $mesh ] then echo "Can't find visualization data for $ex!" exit fi echo "FiniteElementSpace" > $sol echo "FiniteElementCollection: H1_2D_P1" >> $sol echo "VDim: 1" >> $sol echo "Ordering: 0" >> $sol echo "" >> $sol find $dir -name "$ex.sol.??????" | sort | xargs cat | sort | awk '{ print $2 }' >> $sol glvis -m $mesh -g $sol -k $keys hypre-2.33.0/src/examples/vis/glvis-ex8.sh000077500000000000000000000010711477326011500203260ustar00rootroot00000000000000#!/bin/bash # Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) ex=ex8 dir=`basename \`pwd\`` keys=Aaamc if [ "$dir" = "vis" ]; then dir=. mesh=$ex.mesh sol=$ex.sol else dir=vis mesh=vis/$ex.mesh sol=vis/$ex.sol fi if [ ! -e $mesh.000000 ] then echo "Can't find visualization data for $ex!" exit fi np=`cat $dir/$ex.data | head -n 1 | awk '{ print $2 }'` glvis -np $np -m $mesh -g $sol -k $keys hypre-2.33.0/src/examples/vis/glvis-ex9.sh000077500000000000000000000020561477326011500203330ustar00rootroot00000000000000#!/bin/bash # Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) ex=ex9 dir=`basename \`pwd\`` keys=Aaamc if [ "$dir" = "vis" ]; then dir=. mesh=$ex.mesh solu=$ex-u.sol solv=$ex-v.sol else dir=vis mesh=vis/$ex.mesh solu=vis/$ex-u.sol solv=vis/$ex-v.sol fi if [ ! -e $mesh ] then echo "Can't find visualization data for $ex!" exit fi echo "FiniteElementSpace" > $solu echo "FiniteElementCollection: H1_2D_P1" >> $solu echo "VDim: 1" >> $solu echo "Ordering: 0" >> $solu echo "" >> $solu find $dir -name "$ex-u.sol.??????" | sort | xargs cat | sort | awk '{ print $2 }' >> $solu glvis -m $mesh -g $solu -k $keys & echo "FiniteElementSpace" > $solv echo "FiniteElementCollection: H1_2D_P1" >> $solv echo "VDim: 1" >> $solv echo "Ordering: 0" >> $solv echo "" >> $solv find $dir -name "$ex-v.sol.??????" | sort | xargs cat | sort | awk '{ print $2 }' >> $solv glvis -m $mesh -g $solv -k $keys hypre-2.33.0/src/krylov/000077500000000000000000000000001477326011500150515ustar00rootroot00000000000000hypre-2.33.0/src/krylov/CMakeLists.txt000066400000000000000000000012641477326011500176140ustar00rootroot00000000000000# Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) set(HDRS HYPRE_krylov.h HYPRE_lobpcg.h HYPRE_MatvecFunctions.h krylov.h lobpcg.h ) set(SRCS bicgstab.c cgnr.c cogmres.c gmres.c flexgmres.c lgmres.c HYPRE_bicgstab.c HYPRE_cgnr.c HYPRE_gmres.c HYPRE_cogmres.c HYPRE_lgmres.c HYPRE_flexgmres.c HYPRE_pcg.c pcg.c HYPRE_lobpcg.c lobpcg.c ) target_sources(${PROJECT_NAME} PRIVATE ${SRCS} ${HDRS} ) convert_filenames_to_full_paths(HDRS) set(HYPRE_HEADERS ${HYPRE_HEADERS} ${HDRS} PARENT_SCOPE) hypre-2.33.0/src/krylov/HYPRE_MatvecFunctions.h000066400000000000000000000017471477326011500213120ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #ifndef HYPRE_MATVEC_FUNCTIONS #define HYPRE_MATVEC_FUNCTIONS typedef struct { void* (*MatvecCreate) ( void *A, void *x ); HYPRE_Int (*Matvec) ( void *matvec_data, HYPRE_Complex alpha, void *A, void *x, HYPRE_Complex beta, void *y ); HYPRE_Int (*MatvecDestroy) ( void *matvec_data ); void* (*MatMultiVecCreate) ( void *A, void *x ); HYPRE_Int (*MatMultiVec) ( void *data, HYPRE_Complex alpha, void *A, void *x, HYPRE_Complex beta, void *y ); HYPRE_Int (*MatMultiVecDestroy) ( void *data ); } HYPRE_MatvecFunctions; #endif hypre-2.33.0/src/krylov/HYPRE_bicgstab.c000066400000000000000000000164171477326011500177530ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * HYPRE_BiCGSTAB interface * *****************************************************************************/ #include "krylov.h" /*-------------------------------------------------------------------------- * HYPRE_BiCGSTABCreate does not exist. Call the appropriate function which * also specifies the vector type, e.g. HYPRE_ParCSRBiCGSTABCreate *--------------------------------------------------------------------------*/ /*-------------------------------------------------------------------------- * HYPRE_BiCGSTABDestroy *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_BiCGSTABDestroy( HYPRE_Solver solver ) { return ( hypre_BiCGSTABDestroy( (void *) solver ) ); } /*-------------------------------------------------------------------------- * HYPRE_BiCGSTABSetup *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_BiCGSTABSetup( HYPRE_Solver solver, HYPRE_Matrix A, HYPRE_Vector b, HYPRE_Vector x ) { return ( hypre_BiCGSTABSetup( solver, A, b, x ) ); } /*-------------------------------------------------------------------------- * HYPRE_BiCGSTABSolve *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_BiCGSTABSolve( HYPRE_Solver solver, HYPRE_Matrix A, HYPRE_Vector b, HYPRE_Vector x ) { return ( hypre_BiCGSTABSolve( solver, A, b, x ) ); } /*-------------------------------------------------------------------------- * HYPRE_BiCGSTABSetTol *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_BiCGSTABSetTol( HYPRE_Solver solver, HYPRE_Real tol ) { return ( hypre_BiCGSTABSetTol( (void *) solver, tol ) ); } /*-------------------------------------------------------------------------- * HYPRE_BiCGSTABSetAbsoluteTol *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_BiCGSTABSetAbsoluteTol( HYPRE_Solver solver, HYPRE_Real a_tol ) { return ( hypre_BiCGSTABSetAbsoluteTol( (void *) solver, a_tol ) ); } /*-------------------------------------------------------------------------- * HYPRE_BiCGSTABSetConvergenceFactorTol *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_BiCGSTABSetConvergenceFactorTol( HYPRE_Solver solver, HYPRE_Real cf_tol ) { return ( hypre_BiCGSTABSetConvergenceFactorTol( (void *) solver, cf_tol ) ); } /*-------------------------------------------------------------------------- * HYPRE_BiCGSTABSetMinIter *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_BiCGSTABSetMinIter( HYPRE_Solver solver, HYPRE_Int min_iter ) { return ( hypre_BiCGSTABSetMinIter( (void *) solver, min_iter ) ); } /*-------------------------------------------------------------------------- * HYPRE_BiCGSTABSetMaxIter *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_BiCGSTABSetMaxIter( HYPRE_Solver solver, HYPRE_Int max_iter ) { return ( hypre_BiCGSTABSetMaxIter( (void *) solver, max_iter ) ); } /*-------------------------------------------------------------------------- * HYPRE_BiCGSTABSetStopCrit *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_BiCGSTABSetStopCrit( HYPRE_Solver solver, HYPRE_Int stop_crit ) { return ( hypre_BiCGSTABSetStopCrit( (void *) solver, stop_crit ) ); } /*-------------------------------------------------------------------------- * HYPRE_BiCGSTABSetPrecond *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_BiCGSTABSetPrecond( HYPRE_Solver solver, HYPRE_PtrToSolverFcn precond, HYPRE_PtrToSolverFcn precond_setup, HYPRE_Solver precond_solver ) { return ( hypre_BiCGSTABSetPrecond( (void *) solver, (HYPRE_Int (*)(void*, void*, void*, void*))precond, (HYPRE_Int (*)(void*, void*, void*, void*))precond_setup, (void *) precond_solver ) ); } /*-------------------------------------------------------------------------- * HYPRE_BiCGSTABGetPrecond *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_BiCGSTABGetPrecond( HYPRE_Solver solver, HYPRE_Solver *precond_data_ptr ) { return ( hypre_BiCGSTABGetPrecond( (void *) solver, (HYPRE_Solver *) precond_data_ptr ) ); } /*-------------------------------------------------------------------------- * HYPRE_BiCGSTABSetLogging *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_BiCGSTABSetLogging( HYPRE_Solver solver, HYPRE_Int logging) { return ( hypre_BiCGSTABSetLogging( (void *) solver, logging ) ); } /*-------------------------------------------------------------------------- * HYPRE_BiCGSTABSetPrintLevel *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_BiCGSTABSetPrintLevel( HYPRE_Solver solver, HYPRE_Int print_level) { return ( hypre_BiCGSTABSetPrintLevel( (void *) solver, print_level ) ); } /*-------------------------------------------------------------------------- * HYPRE_BiCGSTABGetNumIterations *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_BiCGSTABGetNumIterations( HYPRE_Solver solver, HYPRE_Int *num_iterations ) { return ( hypre_BiCGSTABGetNumIterations( (void *) solver, num_iterations ) ); } /*-------------------------------------------------------------------------- * HYPRE_BiCGSTABGetFinalRelativeResidualNorm *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_BiCGSTABGetFinalRelativeResidualNorm( HYPRE_Solver solver, HYPRE_Real *norm ) { return ( hypre_BiCGSTABGetFinalRelativeResidualNorm( (void *) solver, norm ) ); } /*-------------------------------------------------------------------------- * HYPRE_BiCGSTABGetResidual *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_BiCGSTABGetResidual( HYPRE_Solver solver, void *residual ) { return ( hypre_BiCGSTABGetResidual( (void *) solver, (void **) residual ) ); } hypre-2.33.0/src/krylov/HYPRE_cgnr.c000066400000000000000000000132361477326011500171220ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * HYPRE_CGNR interface * *****************************************************************************/ #include "krylov.h" /*-------------------------------------------------------------------------- * HYPRE_CGNRCreate does not exist. Call the appropriate function which * also specifies the vector type, e.g. HYPRE_ParCSRCGNRCreate *--------------------------------------------------------------------------*/ /*-------------------------------------------------------------------------- * HYPRE_CGNRDestroy *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_CGNRDestroy( HYPRE_Solver solver ) { return ( hypre_CGNRDestroy( (void *) solver ) ); } /*-------------------------------------------------------------------------- * HYPRE_CGNRSetup *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_CGNRSetup( HYPRE_Solver solver, HYPRE_Matrix A, HYPRE_Vector b, HYPRE_Vector x ) { return ( hypre_CGNRSetup( solver, A, b, x ) ); } /*-------------------------------------------------------------------------- * HYPRE_CGNRSolve *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_CGNRSolve( HYPRE_Solver solver, HYPRE_Matrix A, HYPRE_Vector b, HYPRE_Vector x ) { return ( hypre_CGNRSolve( solver, A, b, x ) ); } /*-------------------------------------------------------------------------- * HYPRE_CGNRSetTol *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_CGNRSetTol( HYPRE_Solver solver, HYPRE_Real tol ) { return ( hypre_CGNRSetTol( (void *) solver, tol ) ); } /*-------------------------------------------------------------------------- * HYPRE_CGNRSetMinIter *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_CGNRSetMinIter( HYPRE_Solver solver, HYPRE_Int min_iter ) { return ( hypre_CGNRSetMinIter( (void *) solver, min_iter ) ); } /*-------------------------------------------------------------------------- * HYPRE_CGNRSetMaxIter *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_CGNRSetMaxIter( HYPRE_Solver solver, HYPRE_Int max_iter ) { return ( hypre_CGNRSetMaxIter( (void *) solver, max_iter ) ); } /*-------------------------------------------------------------------------- * HYPRE_CGNRSetStopCrit *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_CGNRSetStopCrit( HYPRE_Solver solver, HYPRE_Int stop_crit ) { return ( hypre_CGNRSetStopCrit( (void *) solver, stop_crit ) ); } /*-------------------------------------------------------------------------- * HYPRE_CGNRSetPrecond *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_CGNRSetPrecond( HYPRE_Solver solver, HYPRE_PtrToSolverFcn precond, HYPRE_PtrToSolverFcn precondT, HYPRE_PtrToSolverFcn precond_setup, HYPRE_Solver precond_solver ) { return ( hypre_CGNRSetPrecond( (void *) solver, (HYPRE_Int (*)(void*, void*, void*, void*))precond, (HYPRE_Int (*)(void*, void*, void*, void*))precondT, (HYPRE_Int (*)(void*, void*, void*, void*))precond_setup, (void *) precond_solver ) ); } /*-------------------------------------------------------------------------- * HYPRE_CGNRGetPrecond *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_CGNRGetPrecond( HYPRE_Solver solver, HYPRE_Solver *precond_data_ptr ) { return ( hypre_CGNRGetPrecond( (void *) solver, (HYPRE_Solver *) precond_data_ptr ) ); } /*-------------------------------------------------------------------------- * HYPRE_CGNRSetLogging *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_CGNRSetLogging( HYPRE_Solver solver, HYPRE_Int logging) { return ( hypre_CGNRSetLogging( (void *) solver, logging ) ); } /*-------------------------------------------------------------------------- * HYPRE_CGNRGetNumIterations *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_CGNRGetNumIterations( HYPRE_Solver solver, HYPRE_Int *num_iterations ) { return ( hypre_CGNRGetNumIterations( (void *) solver, num_iterations ) ); } /*-------------------------------------------------------------------------- * HYPRE_CGNRGetFinalRelativeResidualNorm *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_CGNRGetFinalRelativeResidualNorm( HYPRE_Solver solver, HYPRE_Real *norm ) { return ( hypre_CGNRGetFinalRelativeResidualNorm( (void *) solver, norm ) ); } hypre-2.33.0/src/krylov/HYPRE_cogmres.c000066400000000000000000000251061477326011500176270ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * HYPRE_COGMRES interface * *****************************************************************************/ #include "krylov.h" /*-------------------------------------------------------------------------- * HYPRE_COGMRESDestroy *--------------------------------------------------------------------------*/ /* to do, not trivial */ /* HYPRE_Int HYPRE_ParCSRCOGMRESDestroy( HYPRE_Solver solver ) { return( hypre_COGMRESDestroy( (void *) solver ) ); } */ /*-------------------------------------------------------------------------- * HYPRE_COGMRESSetup *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_COGMRESSetup( HYPRE_Solver solver, HYPRE_Matrix A, HYPRE_Vector b, HYPRE_Vector x ) { return ( hypre_COGMRESSetup( solver, A, b, x ) ); } /*-------------------------------------------------------------------------- * HYPRE_COGMRESSolve *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_COGMRESSolve( HYPRE_Solver solver, HYPRE_Matrix A, HYPRE_Vector b, HYPRE_Vector x ) { return ( hypre_COGMRESSolve( solver, A, b, x ) ); } /*-------------------------------------------------------------------------- * HYPRE_COGMRESSetKDim, HYPRE_COGMRESGetKDim *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_COGMRESSetKDim( HYPRE_Solver solver, HYPRE_Int k_dim ) { return ( hypre_COGMRESSetKDim( (void *) solver, k_dim ) ); } HYPRE_Int HYPRE_COGMRESGetKDim( HYPRE_Solver solver, HYPRE_Int * k_dim ) { return ( hypre_COGMRESGetKDim( (void *) solver, k_dim ) ); } /*-------------------------------------------------------------------------- * HYPRE_COGMRESSetUnroll, HYPRE_COGMRESGetUnroll *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_COGMRESSetUnroll( HYPRE_Solver solver, HYPRE_Int unroll ) { return ( hypre_COGMRESSetUnroll( (void *) solver, unroll ) ); } HYPRE_Int HYPRE_COGMRESGetUnroll( HYPRE_Solver solver, HYPRE_Int * unroll ) { return ( hypre_COGMRESGetUnroll( (void *) solver, unroll ) ); } /*-------------------------------------------------------------------------- * HYPRE_COGMRESSetCGS, HYPRE_COGMRESGetCGS *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_COGMRESSetCGS( HYPRE_Solver solver, HYPRE_Int cgs ) { return ( hypre_COGMRESSetCGS( (void *) solver, cgs ) ); } HYPRE_Int HYPRE_COGMRESGetCGS( HYPRE_Solver solver, HYPRE_Int * cgs ) { return ( hypre_COGMRESGetCGS( (void *) solver, cgs ) ); } /*-------------------------------------------------------------------------- * HYPRE_COGMRESSetTol, HYPRE_COGMRESGetTol *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_COGMRESSetTol( HYPRE_Solver solver, HYPRE_Real tol ) { return ( hypre_COGMRESSetTol( (void *) solver, tol ) ); } HYPRE_Int HYPRE_COGMRESGetTol( HYPRE_Solver solver, HYPRE_Real * tol ) { return ( hypre_COGMRESGetTol( (void *) solver, tol ) ); } /*-------------------------------------------------------------------------- * HYPRE_COGMRESSetAbsoluteTol, HYPRE_COGMRESGetAbsoluteTol *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_COGMRESSetAbsoluteTol( HYPRE_Solver solver, HYPRE_Real a_tol ) { return ( hypre_COGMRESSetAbsoluteTol( (void *) solver, a_tol ) ); } HYPRE_Int HYPRE_COGMRESGetAbsoluteTol( HYPRE_Solver solver, HYPRE_Real * a_tol ) { return ( hypre_COGMRESGetAbsoluteTol( (void *) solver, a_tol ) ); } /*-------------------------------------------------------------------------- * HYPRE_COGMRESSetConvergenceFactorTol, HYPRE_COGMRESGetConvergenceFactorTol *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_COGMRESSetConvergenceFactorTol( HYPRE_Solver solver, HYPRE_Real cf_tol ) { return ( hypre_COGMRESSetConvergenceFactorTol( (void *) solver, cf_tol ) ); } HYPRE_Int HYPRE_COGMRESGetConvergenceFactorTol( HYPRE_Solver solver, HYPRE_Real * cf_tol ) { return ( hypre_COGMRESGetConvergenceFactorTol( (void *) solver, cf_tol ) ); } /*-------------------------------------------------------------------------- * HYPRE_COGMRESSetMinIter, HYPRE_COGMRESGetMinIter *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_COGMRESSetMinIter( HYPRE_Solver solver, HYPRE_Int min_iter ) { return ( hypre_COGMRESSetMinIter( (void *) solver, min_iter ) ); } HYPRE_Int HYPRE_COGMRESGetMinIter( HYPRE_Solver solver, HYPRE_Int * min_iter ) { return ( hypre_COGMRESGetMinIter( (void *) solver, min_iter ) ); } /*-------------------------------------------------------------------------- * HYPRE_COGMRESSetMaxIter, HYPRE_COGMRESGetMaxIter *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_COGMRESSetMaxIter( HYPRE_Solver solver, HYPRE_Int max_iter ) { return ( hypre_COGMRESSetMaxIter( (void *) solver, max_iter ) ); } HYPRE_Int HYPRE_COGMRESGetMaxIter( HYPRE_Solver solver, HYPRE_Int * max_iter ) { return ( hypre_COGMRESGetMaxIter( (void *) solver, max_iter ) ); } /*-------------------------------------------------------------------------- * HYPRE_COGMRESSetPrecond *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_COGMRESSetPrecond( HYPRE_Solver solver, HYPRE_PtrToSolverFcn precond, HYPRE_PtrToSolverFcn precond_setup, HYPRE_Solver precond_solver ) { return ( hypre_COGMRESSetPrecond( (void *) solver, (HYPRE_Int (*)(void*, void*, void*, void*))precond, (HYPRE_Int (*)(void*, void*, void*, void*))precond_setup, (void *) precond_solver ) ); } /*-------------------------------------------------------------------------- * HYPRE_COGMRESGetPrecond *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_COGMRESGetPrecond( HYPRE_Solver solver, HYPRE_Solver *precond_data_ptr ) { return ( hypre_COGMRESGetPrecond( (void *) solver, (HYPRE_Solver *) precond_data_ptr ) ); } /*-------------------------------------------------------------------------- * HYPRE_COGMRESSetPrintLevel, HYPRE_COGMRESGetPrintLevel *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_COGMRESSetPrintLevel( HYPRE_Solver solver, HYPRE_Int level ) { return ( hypre_COGMRESSetPrintLevel( (void *) solver, level ) ); } HYPRE_Int HYPRE_COGMRESGetPrintLevel( HYPRE_Solver solver, HYPRE_Int * level ) { return ( hypre_COGMRESGetPrintLevel( (void *) solver, level ) ); } /*-------------------------------------------------------------------------- * HYPRE_COGMRESSetLogging, HYPRE_COGMRESGetLogging *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_COGMRESSetLogging( HYPRE_Solver solver, HYPRE_Int level ) { return ( hypre_COGMRESSetLogging( (void *) solver, level ) ); } HYPRE_Int HYPRE_COGMRESGetLogging( HYPRE_Solver solver, HYPRE_Int * level ) { return ( hypre_COGMRESGetLogging( (void *) solver, level ) ); } /*-------------------------------------------------------------------------- * HYPRE_COGMRESGetNumIterations *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_COGMRESGetNumIterations( HYPRE_Solver solver, HYPRE_Int *num_iterations ) { return ( hypre_COGMRESGetNumIterations( (void *) solver, num_iterations ) ); } /*-------------------------------------------------------------------------- * HYPRE_COGMRESGetConverged *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_COGMRESGetConverged( HYPRE_Solver solver, HYPRE_Int *converged ) { return ( hypre_COGMRESGetConverged( (void *) solver, converged ) ); } /*-------------------------------------------------------------------------- * HYPRE_COGMRESGetFinalRelativeResidualNorm *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_COGMRESGetFinalRelativeResidualNorm( HYPRE_Solver solver, HYPRE_Real *norm ) { return ( hypre_COGMRESGetFinalRelativeResidualNorm( (void *) solver, norm ) ); } /*-------------------------------------------------------------------------- * HYPRE_COGMRESGetResidual *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_COGMRESGetResidual( HYPRE_Solver solver, void *residual ) { /* returns a pointer to the residual vector */ return hypre_COGMRESGetResidual( (void *) solver, (void **) residual ); } /*-------------------------------------------------------------------------- * HYPRE_COGMRESSetModifyPC *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_COGMRESSetModifyPC( HYPRE_Solver solver, HYPRE_Int (*modify_pc)(HYPRE_Solver, HYPRE_Int, HYPRE_Real) ) { return hypre_COGMRESSetModifyPC( (void *) solver, (HYPRE_Int(*)(void*, HYPRE_Int, HYPRE_Real))modify_pc); } hypre-2.33.0/src/krylov/HYPRE_flexgmres.c000066400000000000000000000233261477326011500201660ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * HYPRE_FlexGMRES interface * *****************************************************************************/ #include "krylov.h" /*-------------------------------------------------------------------------- * HYPRE_FlexGMRESDestroy *--------------------------------------------------------------------------*/ /* to do, not trivial */ /* HYPRE_Int HYPRE_ParCSRFlexGMRESDestroy( HYPRE_Solver solver ) { return( hypre_FlexGMRESDestroy( (void *) solver ) ); } */ /*-------------------------------------------------------------------------- * HYPRE_FlexGMRESSetup *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_FlexGMRESSetup( HYPRE_Solver solver, HYPRE_Matrix A, HYPRE_Vector b, HYPRE_Vector x ) { return ( hypre_FlexGMRESSetup( solver, A, b, x ) ); } /*-------------------------------------------------------------------------- * HYPRE_FlexGMRESSolve *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_FlexGMRESSolve( HYPRE_Solver solver, HYPRE_Matrix A, HYPRE_Vector b, HYPRE_Vector x ) { return ( hypre_FlexGMRESSolve( solver, A, b, x ) ); } /*-------------------------------------------------------------------------- * HYPRE_FlexGMRESSetKDim, HYPRE_FlexGMRESGetKDim *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_FlexGMRESSetKDim( HYPRE_Solver solver, HYPRE_Int k_dim ) { return ( hypre_FlexGMRESSetKDim( (void *) solver, k_dim ) ); } HYPRE_Int HYPRE_FlexGMRESGetKDim( HYPRE_Solver solver, HYPRE_Int * k_dim ) { return ( hypre_FlexGMRESGetKDim( (void *) solver, k_dim ) ); } /*-------------------------------------------------------------------------- * HYPRE_FlexGMRESSetTol, HYPRE_FlexGMRESGetTol *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_FlexGMRESSetTol( HYPRE_Solver solver, HYPRE_Real tol ) { return ( hypre_FlexGMRESSetTol( (void *) solver, tol ) ); } HYPRE_Int HYPRE_FlexGMRESGetTol( HYPRE_Solver solver, HYPRE_Real * tol ) { return ( hypre_FlexGMRESGetTol( (void *) solver, tol ) ); } /*-------------------------------------------------------------------------- * HYPRE_FlexGMRESSetAbsoluteTol, HYPRE_FlexGMRESGetAbsoluteTol *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_FlexGMRESSetAbsoluteTol( HYPRE_Solver solver, HYPRE_Real a_tol ) { return ( hypre_FlexGMRESSetAbsoluteTol( (void *) solver, a_tol ) ); } HYPRE_Int HYPRE_FlexGMRESGetAbsoluteTol( HYPRE_Solver solver, HYPRE_Real * a_tol ) { return ( hypre_FlexGMRESGetAbsoluteTol( (void *) solver, a_tol ) ); } /*-------------------------------------------------------------------------- * HYPRE_FlexGMRESSetConvergenceFactorTol, HYPRE_FlexGMRESGetConvergenceFactorTol *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_FlexGMRESSetConvergenceFactorTol( HYPRE_Solver solver, HYPRE_Real cf_tol ) { return ( hypre_FlexGMRESSetConvergenceFactorTol( (void *) solver, cf_tol ) ); } HYPRE_Int HYPRE_FlexGMRESGetConvergenceFactorTol( HYPRE_Solver solver, HYPRE_Real * cf_tol ) { return ( hypre_FlexGMRESGetConvergenceFactorTol( (void *) solver, cf_tol ) ); } /*-------------------------------------------------------------------------- * HYPRE_FlexGMRESSetMinIter, HYPRE_FlexGMRESGetMinIter *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_FlexGMRESSetMinIter( HYPRE_Solver solver, HYPRE_Int min_iter ) { return ( hypre_FlexGMRESSetMinIter( (void *) solver, min_iter ) ); } HYPRE_Int HYPRE_FlexGMRESGetMinIter( HYPRE_Solver solver, HYPRE_Int * min_iter ) { return ( hypre_FlexGMRESGetMinIter( (void *) solver, min_iter ) ); } /*-------------------------------------------------------------------------- * HYPRE_FlexGMRESSetMaxIter, HYPRE_FlexGMRESGetMaxIter *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_FlexGMRESSetMaxIter( HYPRE_Solver solver, HYPRE_Int max_iter ) { return ( hypre_FlexGMRESSetMaxIter( (void *) solver, max_iter ) ); } HYPRE_Int HYPRE_FlexGMRESGetMaxIter( HYPRE_Solver solver, HYPRE_Int * max_iter ) { return ( hypre_FlexGMRESGetMaxIter( (void *) solver, max_iter ) ); } /*-------------------------------------------------------------------------- * HYPRE_FlexGMRESSetPrecond *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_FlexGMRESSetPrecond( HYPRE_Solver solver, HYPRE_PtrToSolverFcn precond, HYPRE_PtrToSolverFcn precond_setup, HYPRE_Solver precond_solver ) { return ( hypre_FlexGMRESSetPrecond( (void *) solver, (HYPRE_Int (*)(void*, void*, void*, void*))precond, (HYPRE_Int (*)(void*, void*, void*, void*))precond_setup, (void *) precond_solver ) ); } /*-------------------------------------------------------------------------- * HYPRE_FlexGMRESGetPrecond *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_FlexGMRESGetPrecond( HYPRE_Solver solver, HYPRE_Solver *precond_data_ptr ) { return ( hypre_FlexGMRESGetPrecond( (void *) solver, (HYPRE_Solver *) precond_data_ptr ) ); } /*-------------------------------------------------------------------------- * HYPRE_FlexGMRESSetPrintLevel, HYPRE_FlexGMRESGetPrintLevel *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_FlexGMRESSetPrintLevel( HYPRE_Solver solver, HYPRE_Int level ) { return ( hypre_FlexGMRESSetPrintLevel( (void *) solver, level ) ); } HYPRE_Int HYPRE_FlexGMRESGetPrintLevel( HYPRE_Solver solver, HYPRE_Int * level ) { return ( hypre_FlexGMRESGetPrintLevel( (void *) solver, level ) ); } /*-------------------------------------------------------------------------- * HYPRE_FlexGMRESSetLogging, HYPRE_FlexGMRESGetLogging *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_FlexGMRESSetLogging( HYPRE_Solver solver, HYPRE_Int level ) { return ( hypre_FlexGMRESSetLogging( (void *) solver, level ) ); } HYPRE_Int HYPRE_FlexGMRESGetLogging( HYPRE_Solver solver, HYPRE_Int * level ) { return ( hypre_FlexGMRESGetLogging( (void *) solver, level ) ); } /*-------------------------------------------------------------------------- * HYPRE_FlexGMRESGetNumIterations *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_FlexGMRESGetNumIterations( HYPRE_Solver solver, HYPRE_Int *num_iterations ) { return ( hypre_FlexGMRESGetNumIterations( (void *) solver, num_iterations ) ); } /*-------------------------------------------------------------------------- * HYPRE_FlexGMRESGetConverged *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_FlexGMRESGetConverged( HYPRE_Solver solver, HYPRE_Int *converged ) { return ( hypre_FlexGMRESGetConverged( (void *) solver, converged ) ); } /*-------------------------------------------------------------------------- * HYPRE_FlexGMRESGetFinalRelativeResidualNorm *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_FlexGMRESGetFinalRelativeResidualNorm( HYPRE_Solver solver, HYPRE_Real *norm ) { return ( hypre_FlexGMRESGetFinalRelativeResidualNorm( (void *) solver, norm ) ); } /*-------------------------------------------------------------------------- * HYPRE_FlexGMRESGetResidual *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_FlexGMRESGetResidual( HYPRE_Solver solver, void *residual ) { /* returns a pointer to the residual vector */ return hypre_FlexGMRESGetResidual( (void *) solver, (void **) residual ); } /*-------------------------------------------------------------------------- * HYPRE_FlexGMRESSetModifyPC *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_FlexGMRESSetModifyPC( HYPRE_Solver solver, HYPRE_Int (*modify_pc)(HYPRE_Solver, HYPRE_Int, HYPRE_Real) ) { return hypre_FlexGMRESSetModifyPC( (void *) solver, (HYPRE_Int(*)(void*, HYPRE_Int, HYPRE_Real))modify_pc); } hypre-2.33.0/src/krylov/HYPRE_gmres.c000066400000000000000000000251271477326011500173100ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * HYPRE_GMRES interface * *****************************************************************************/ #include "krylov.h" /*-------------------------------------------------------------------------- * HYPRE_GMRESDestroy *--------------------------------------------------------------------------*/ /* to do, not trivial */ /* HYPRE_Int HYPRE_ParCSRGMRESDestroy( HYPRE_Solver solver ) { return( hypre_GMRESDestroy( (void *) solver ) ); } */ /*-------------------------------------------------------------------------- * HYPRE_GMRESSetup *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_GMRESSetup( HYPRE_Solver solver, HYPRE_Matrix A, HYPRE_Vector b, HYPRE_Vector x ) { return ( hypre_GMRESSetup( solver, A, b, x ) ); } /*-------------------------------------------------------------------------- * HYPRE_GMRESSolve *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_GMRESSolve( HYPRE_Solver solver, HYPRE_Matrix A, HYPRE_Vector b, HYPRE_Vector x ) { return ( hypre_GMRESSolve( solver, A, b, x ) ); } /*-------------------------------------------------------------------------- * HYPRE_GMRESSetKDim, HYPRE_GMRESGetKDim *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_GMRESSetKDim( HYPRE_Solver solver, HYPRE_Int k_dim ) { return ( hypre_GMRESSetKDim( (void *) solver, k_dim ) ); } HYPRE_Int HYPRE_GMRESGetKDim( HYPRE_Solver solver, HYPRE_Int * k_dim ) { return ( hypre_GMRESGetKDim( (void *) solver, k_dim ) ); } /*-------------------------------------------------------------------------- * HYPRE_GMRESSetTol, HYPRE_GMRESGetTol *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_GMRESSetTol( HYPRE_Solver solver, HYPRE_Real tol ) { return ( hypre_GMRESSetTol( (void *) solver, tol ) ); } HYPRE_Int HYPRE_GMRESGetTol( HYPRE_Solver solver, HYPRE_Real * tol ) { return ( hypre_GMRESGetTol( (void *) solver, tol ) ); } /*-------------------------------------------------------------------------- * HYPRE_GMRESSetAbsoluteTol, HYPRE_GMRESGetAbsoluteTol *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_GMRESSetAbsoluteTol( HYPRE_Solver solver, HYPRE_Real a_tol ) { return ( hypre_GMRESSetAbsoluteTol( (void *) solver, a_tol ) ); } HYPRE_Int HYPRE_GMRESGetAbsoluteTol( HYPRE_Solver solver, HYPRE_Real * a_tol ) { return ( hypre_GMRESGetAbsoluteTol( (void *) solver, a_tol ) ); } /*-------------------------------------------------------------------------- * HYPRE_GMRESSetConvergenceFactorTol, HYPRE_GMRESGetConvergenceFactorTol *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_GMRESSetConvergenceFactorTol( HYPRE_Solver solver, HYPRE_Real cf_tol ) { return ( hypre_GMRESSetConvergenceFactorTol( (void *) solver, cf_tol ) ); } HYPRE_Int HYPRE_GMRESGetConvergenceFactorTol( HYPRE_Solver solver, HYPRE_Real * cf_tol ) { return ( hypre_GMRESGetConvergenceFactorTol( (void *) solver, cf_tol ) ); } /*-------------------------------------------------------------------------- * HYPRE_GMRESSetMinIter, HYPRE_GMRESGetMinIter *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_GMRESSetMinIter( HYPRE_Solver solver, HYPRE_Int min_iter ) { return ( hypre_GMRESSetMinIter( (void *) solver, min_iter ) ); } HYPRE_Int HYPRE_GMRESGetMinIter( HYPRE_Solver solver, HYPRE_Int * min_iter ) { return ( hypre_GMRESGetMinIter( (void *) solver, min_iter ) ); } /*-------------------------------------------------------------------------- * HYPRE_GMRESSetMaxIter, HYPRE_GMRESGetMaxIter *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_GMRESSetMaxIter( HYPRE_Solver solver, HYPRE_Int max_iter ) { return ( hypre_GMRESSetMaxIter( (void *) solver, max_iter ) ); } HYPRE_Int HYPRE_GMRESGetMaxIter( HYPRE_Solver solver, HYPRE_Int * max_iter ) { return ( hypre_GMRESGetMaxIter( (void *) solver, max_iter ) ); } /*-------------------------------------------------------------------------- * HYPRE_GMRESSetStopCrit, HYPRE_GMRESGetStopCrit - OBSOLETE *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_GMRESSetStopCrit( HYPRE_Solver solver, HYPRE_Int stop_crit ) { return ( hypre_GMRESSetStopCrit( (void *) solver, stop_crit ) ); } HYPRE_Int HYPRE_GMRESGetStopCrit( HYPRE_Solver solver, HYPRE_Int * stop_crit ) { return ( hypre_GMRESGetStopCrit( (void *) solver, stop_crit ) ); } /*-------------------------------------------------------------------------- * HYPRE_GMRESSetRelChange, HYPRE_GMRESGetRelChange *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_GMRESSetRelChange( HYPRE_Solver solver, HYPRE_Int rel_change ) { return ( hypre_GMRESSetRelChange( (void *) solver, rel_change ) ); } HYPRE_Int HYPRE_GMRESGetRelChange( HYPRE_Solver solver, HYPRE_Int * rel_change ) { return ( hypre_GMRESGetRelChange( (void *) solver, rel_change ) ); } /*-------------------------------------------------------------------------- * HYPRE_GMRESSetSkipRealResidualCheck, HYPRE_GMRESGetSkipRealResidualCheck *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_GMRESSetSkipRealResidualCheck( HYPRE_Solver solver, HYPRE_Int skip_real_r_check ) { return ( hypre_GMRESSetSkipRealResidualCheck( (void *) solver, skip_real_r_check ) ); } HYPRE_Int HYPRE_GMRESGetSkipRealResidualCheck( HYPRE_Solver solver, HYPRE_Int *skip_real_r_check ) { return ( hypre_GMRESGetSkipRealResidualCheck( (void *) solver, skip_real_r_check ) ); } /*-------------------------------------------------------------------------- * HYPRE_GMRESSetPrecond *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_GMRESSetPrecond( HYPRE_Solver solver, HYPRE_PtrToSolverFcn precond, HYPRE_PtrToSolverFcn precond_setup, HYPRE_Solver precond_solver ) { return ( hypre_GMRESSetPrecond( (void *) solver, (HYPRE_Int (*)(void*, void*, void*, void*))precond, (HYPRE_Int (*)(void*, void*, void*, void*))precond_setup, (void *) precond_solver ) ); } /*-------------------------------------------------------------------------- * HYPRE_GMRESGetPrecond *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_GMRESGetPrecond( HYPRE_Solver solver, HYPRE_Solver *precond_data_ptr ) { return ( hypre_GMRESGetPrecond( (void *) solver, (HYPRE_Solver *) precond_data_ptr ) ); } /*-------------------------------------------------------------------------- * HYPRE_GMRESSetPrintLevel, HYPRE_GMRESGetPrintLevel *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_GMRESSetPrintLevel( HYPRE_Solver solver, HYPRE_Int level ) { return ( hypre_GMRESSetPrintLevel( (void *) solver, level ) ); } HYPRE_Int HYPRE_GMRESGetPrintLevel( HYPRE_Solver solver, HYPRE_Int * level ) { return ( hypre_GMRESGetPrintLevel( (void *) solver, level ) ); } /*-------------------------------------------------------------------------- * HYPRE_GMRESSetLogging, HYPRE_GMRESGetLogging *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_GMRESSetLogging( HYPRE_Solver solver, HYPRE_Int level ) { return ( hypre_GMRESSetLogging( (void *) solver, level ) ); } HYPRE_Int HYPRE_GMRESGetLogging( HYPRE_Solver solver, HYPRE_Int * level ) { return ( hypre_GMRESGetLogging( (void *) solver, level ) ); } /*-------------------------------------------------------------------------- * HYPRE_GMRESGetNumIterations *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_GMRESGetNumIterations( HYPRE_Solver solver, HYPRE_Int *num_iterations ) { return ( hypre_GMRESGetNumIterations( (void *) solver, num_iterations ) ); } /*-------------------------------------------------------------------------- * HYPRE_GMRESGetConverged *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_GMRESGetConverged( HYPRE_Solver solver, HYPRE_Int *converged ) { return ( hypre_GMRESGetConverged( (void *) solver, converged ) ); } /*-------------------------------------------------------------------------- * HYPRE_GMRESGetFinalRelativeResidualNorm *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_GMRESGetFinalRelativeResidualNorm( HYPRE_Solver solver, HYPRE_Real *norm ) { return ( hypre_GMRESGetFinalRelativeResidualNorm( (void *) solver, norm ) ); } /*-------------------------------------------------------------------------- * HYPRE_GMRESGetResidual *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_GMRESGetResidual( HYPRE_Solver solver, void *residual ) { /* returns a pointer to the residual vector */ return hypre_GMRESGetResidual( (void *) solver, (void **) residual ); } hypre-2.33.0/src/krylov/HYPRE_krylov.h000066400000000000000000001073401477326011500175240ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #ifndef HYPRE_KRYLOV_HEADER #define HYPRE_KRYLOV_HEADER #include "HYPRE_utilities.h" #ifdef __cplusplus extern "C" { #endif /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ /** * @defgroup KrylovSolvers Krylov Solvers * * A basic interface for Krylov solvers. These solvers support many of the * matrix/vector storage schemes in hypre. They should be used in conjunction * with the storage-specific interfaces, particularly the specific Create() and * Destroy() functions. * * @{ **/ /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ /** * @name Krylov Solvers * * @{ **/ #ifndef HYPRE_MODIFYPC #define HYPRE_MODIFYPC typedef HYPRE_Int (*HYPRE_PtrToModifyPCFcn)(HYPRE_Solver, HYPRE_Int, HYPRE_Real); #endif /**@}*/ /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ /** * @name PCG Solver * * @{ **/ /** * Prepare to solve the system. The coefficient data in \e b and \e x is * ignored here, but information about the layout of the data may be used. **/ HYPRE_Int HYPRE_PCGSetup(HYPRE_Solver solver, HYPRE_Matrix A, HYPRE_Vector b, HYPRE_Vector x); /** * Solve the system. **/ HYPRE_Int HYPRE_PCGSolve(HYPRE_Solver solver, HYPRE_Matrix A, HYPRE_Vector b, HYPRE_Vector x); /** * (Optional) Set the relative convergence tolerance. **/ HYPRE_Int HYPRE_PCGSetTol(HYPRE_Solver solver, HYPRE_Real tol); /** * (Optional) Set the absolute convergence tolerance (default is * 0). If one desires the convergence test to check the absolute * convergence tolerance \e only, then set the relative convergence * tolerance to 0.0. (The default convergence test is \f$ \leq\f$ * max(relative\f$\_\f$tolerance\f$^{2} \ast \f$, absolute\f$\_\f$tolerance\f$^2\f$).) **/ HYPRE_Int HYPRE_PCGSetAbsoluteTol(HYPRE_Solver solver, HYPRE_Real a_tol); /** * (Optional) Set a residual-based convergence tolerance which checks if * \f$\|r_{old}-r_{new}\| < rtol \|b\|\f$. This is useful when trying to converge to * very low relative and/or absolute tolerances, in order to bail-out before * roundoff errors affect the approximation. **/ HYPRE_Int HYPRE_PCGSetResidualTol(HYPRE_Solver solver, HYPRE_Real rtol); /* * RE-VISIT **/ HYPRE_Int HYPRE_PCGSetAbsoluteTolFactor(HYPRE_Solver solver, HYPRE_Real abstolf); /* * RE-VISIT **/ HYPRE_Int HYPRE_PCGSetConvergenceFactorTol(HYPRE_Solver solver, HYPRE_Real cf_tol); /* * RE-VISIT **/ HYPRE_Int HYPRE_PCGSetStopCrit(HYPRE_Solver solver, HYPRE_Int stop_crit); /** * (Optional) Set maximum number of iterations. **/ HYPRE_Int HYPRE_PCGSetMaxIter(HYPRE_Solver solver, HYPRE_Int max_iter); /** * (Optional) Use the two-norm in stopping criteria. **/ HYPRE_Int HYPRE_PCGSetTwoNorm(HYPRE_Solver solver, HYPRE_Int two_norm); /** * (Optional) Additionally require that the relative difference in * successive iterates be small. **/ HYPRE_Int HYPRE_PCGSetRelChange(HYPRE_Solver solver, HYPRE_Int rel_change); /** * (Optional) Recompute the residual at the end to double-check convergence. **/ HYPRE_Int HYPRE_PCGSetRecomputeResidual(HYPRE_Solver solver, HYPRE_Int recompute_residual); /** * (Optional) Periodically recompute the residual while iterating. **/ HYPRE_Int HYPRE_PCGSetRecomputeResidualP(HYPRE_Solver solver, HYPRE_Int recompute_residual_p); /** * (Optional) Setting this to 1 allows use of Polak-Ribiere Method (flexible) * this incrceases robustness, but adds an additional dot product per iteration **/ HYPRE_Int HYPRE_PCGSetFlex(HYPRE_Solver solver, HYPRE_Int flex); /** * (Optional) Skips subnormal alpha, gamma and iprod values in CG. * If set to 0 (default): will break if values are below HYPRE_REAL_MIN * If set to 1: will break if values are below HYPRE_REAL_TRUE_MIN * (requires C11 minimal or will check to HYPRE_REAL_MIN) * If set to 2: will break if values are <= 0. * If set to 3 or larger: will not break at all **/ HYPRE_Int HYPRE_PCGSetSkipBreak(HYPRE_Solver solver, HYPRE_Int skip_break); /** * (Optional) Set the preconditioner to use. **/ HYPRE_Int HYPRE_PCGSetPrecond(HYPRE_Solver solver, HYPRE_PtrToSolverFcn precond, HYPRE_PtrToSolverFcn precond_setup, HYPRE_Solver precond_solver); /** * (Optional) Set the preconditioner to use in a generic fashion. * This function does not require explicit input of the setup and solve pointers * of the preconditioner object. Instead, it automatically extracts this information * from the aforementioned object. **/ HYPRE_Int HYPRE_PCGSetPreconditioner(HYPRE_Solver solver, HYPRE_Solver precond); /** * (Optional) Set the amount of logging to do. **/ HYPRE_Int HYPRE_PCGSetLogging(HYPRE_Solver solver, HYPRE_Int logging); /** * (Optional) Set the amount of printing to do to the screen. **/ HYPRE_Int HYPRE_PCGSetPrintLevel(HYPRE_Solver solver, HYPRE_Int level); /** * Return the number of iterations taken. **/ HYPRE_Int HYPRE_PCGGetNumIterations(HYPRE_Solver solver, HYPRE_Int *num_iterations); /** * Return the norm of the final relative residual. **/ HYPRE_Int HYPRE_PCGGetFinalRelativeResidualNorm(HYPRE_Solver solver, HYPRE_Real *norm); /** * Return the residual. **/ HYPRE_Int HYPRE_PCGGetResidual(HYPRE_Solver solver, void *residual); /** **/ HYPRE_Int HYPRE_PCGGetTol(HYPRE_Solver solver, HYPRE_Real *tol); /** **/ HYPRE_Int HYPRE_PCGGetResidualTol(HYPRE_Solver solver, HYPRE_Real *rtol); /* * RE-VISIT **/ HYPRE_Int HYPRE_PCGGetAbsoluteTolFactor(HYPRE_Solver solver, HYPRE_Real *abstolf); /* * RE-VISIT **/ HYPRE_Int HYPRE_PCGGetConvergenceFactorTol(HYPRE_Solver solver, HYPRE_Real *cf_tol); /* * RE-VISIT **/ HYPRE_Int HYPRE_PCGGetStopCrit(HYPRE_Solver solver, HYPRE_Int *stop_crit); /** **/ HYPRE_Int HYPRE_PCGGetMaxIter(HYPRE_Solver solver, HYPRE_Int *max_iter); /** **/ HYPRE_Int HYPRE_PCGGetTwoNorm(HYPRE_Solver solver, HYPRE_Int *two_norm); /** **/ HYPRE_Int HYPRE_PCGGetRelChange(HYPRE_Solver solver, HYPRE_Int *rel_change); /** **/ HYPRE_Int HYPRE_PCGGetSkipBreak(HYPRE_Solver solver, HYPRE_Int *skip_break); /** **/ HYPRE_Int HYPRE_PCGGetFlex(HYPRE_Solver solver, HYPRE_Int *flex); /** **/ HYPRE_Int HYPRE_PCGGetPrecond(HYPRE_Solver solver, HYPRE_Solver *precond_data_ptr); /** **/ HYPRE_Int HYPRE_PCGGetLogging(HYPRE_Solver solver, HYPRE_Int *level); /** **/ HYPRE_Int HYPRE_PCGGetPrintLevel(HYPRE_Solver solver, HYPRE_Int *level); /** **/ HYPRE_Int HYPRE_PCGGetConverged(HYPRE_Solver solver, HYPRE_Int *converged); /**@}*/ /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ /** * @name GMRES Solver * * @{ **/ /** * Prepare to solve the system. The coefficient data in \e b and \e x is * ignored here, but information about the layout of the data may be used. **/ HYPRE_Int HYPRE_GMRESSetup(HYPRE_Solver solver, HYPRE_Matrix A, HYPRE_Vector b, HYPRE_Vector x); /** * Solve the system. **/ HYPRE_Int HYPRE_GMRESSolve(HYPRE_Solver solver, HYPRE_Matrix A, HYPRE_Vector b, HYPRE_Vector x); /** * (Optional) Set the relative convergence tolerance. **/ HYPRE_Int HYPRE_GMRESSetTol(HYPRE_Solver solver, HYPRE_Real tol); /** * (Optional) Set the absolute convergence tolerance (default is 0). * If one desires * the convergence test to check the absolute convergence tolerance \e only, then * set the relative convergence tolerance to 0.0. (The convergence test is * \f$\|r\| \leq\f$ max(relative\f$\_\f$tolerance\f$\ast \|b\|\f$, absolute\f$\_\f$tolerance).) * **/ HYPRE_Int HYPRE_GMRESSetAbsoluteTol(HYPRE_Solver solver, HYPRE_Real a_tol); /* * RE-VISIT **/ HYPRE_Int HYPRE_GMRESSetConvergenceFactorTol(HYPRE_Solver solver, HYPRE_Real cf_tol); /* * RE-VISIT **/ HYPRE_Int HYPRE_GMRESSetStopCrit(HYPRE_Solver solver, HYPRE_Int stop_crit); /* * RE-VISIT **/ HYPRE_Int HYPRE_GMRESSetMinIter(HYPRE_Solver solver, HYPRE_Int min_iter); /** * (Optional) Set maximum number of iterations. **/ HYPRE_Int HYPRE_GMRESSetMaxIter(HYPRE_Solver solver, HYPRE_Int max_iter); /** * (Optional) Set the maximum size of the Krylov space. **/ HYPRE_Int HYPRE_GMRESSetKDim(HYPRE_Solver solver, HYPRE_Int k_dim); /** * (Optional) Additionally require that the relative difference in * successive iterates be small. **/ HYPRE_Int HYPRE_GMRESSetRelChange(HYPRE_Solver solver, HYPRE_Int rel_change); /** * (Optional) By default, hypre checks for convergence by evaluating the actual * residual before returnig from GMRES (with restart if the true residual does * not indicate convergence). This option allows users to skip the evaluation * and the check of the actual residual for badly conditioned problems where * restart is not expected to be beneficial. **/ HYPRE_Int HYPRE_GMRESSetSkipRealResidualCheck(HYPRE_Solver solver, HYPRE_Int skip_real_r_check); /** * (Optional) Set the preconditioner to use. **/ HYPRE_Int HYPRE_GMRESSetPrecond(HYPRE_Solver solver, HYPRE_PtrToSolverFcn precond, HYPRE_PtrToSolverFcn precond_setup, HYPRE_Solver precond_solver); /** * (Optional) Set the amount of logging to do. **/ HYPRE_Int HYPRE_GMRESSetLogging(HYPRE_Solver solver, HYPRE_Int logging); /** * (Optional) Set the amount of printing to do to the screen. **/ HYPRE_Int HYPRE_GMRESSetPrintLevel(HYPRE_Solver solver, HYPRE_Int level); /** * Return the number of iterations taken. **/ HYPRE_Int HYPRE_GMRESGetNumIterations(HYPRE_Solver solver, HYPRE_Int *num_iterations); /** * Return the norm of the final relative residual. **/ HYPRE_Int HYPRE_GMRESGetFinalRelativeResidualNorm(HYPRE_Solver solver, HYPRE_Real *norm); /** * Return the residual. **/ HYPRE_Int HYPRE_GMRESGetResidual(HYPRE_Solver solver, void *residual); /** **/ HYPRE_Int HYPRE_GMRESGetSkipRealResidualCheck(HYPRE_Solver solver, HYPRE_Int *skip_real_r_check); /** **/ HYPRE_Int HYPRE_GMRESGetTol(HYPRE_Solver solver, HYPRE_Real *tol); /** **/ HYPRE_Int HYPRE_GMRESGetAbsoluteTol(HYPRE_Solver solver, HYPRE_Real *tol); /* * RE-VISIT **/ HYPRE_Int HYPRE_GMRESGetConvergenceFactorTol(HYPRE_Solver solver, HYPRE_Real *cf_tol); /* * OBSOLETE **/ HYPRE_Int HYPRE_GMRESGetStopCrit(HYPRE_Solver solver, HYPRE_Int *stop_crit); /* * RE-VISIT **/ HYPRE_Int HYPRE_GMRESGetMinIter(HYPRE_Solver solver, HYPRE_Int *min_iter); /** **/ HYPRE_Int HYPRE_GMRESGetMaxIter(HYPRE_Solver solver, HYPRE_Int *max_iter); /** **/ HYPRE_Int HYPRE_GMRESGetKDim(HYPRE_Solver solver, HYPRE_Int *k_dim); /** **/ HYPRE_Int HYPRE_GMRESGetRelChange(HYPRE_Solver solver, HYPRE_Int *rel_change); /** **/ HYPRE_Int HYPRE_GMRESGetPrecond(HYPRE_Solver solver, HYPRE_Solver *precond_data_ptr); /** **/ HYPRE_Int HYPRE_GMRESGetLogging(HYPRE_Solver solver, HYPRE_Int *level); /** **/ HYPRE_Int HYPRE_GMRESGetPrintLevel(HYPRE_Solver solver, HYPRE_Int *level); /** **/ HYPRE_Int HYPRE_GMRESGetConverged(HYPRE_Solver solver, HYPRE_Int *converged); /**@}*/ /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ /** * @name FlexGMRES Solver * * @{ **/ /** * Prepare to solve the system. The coefficient data in \e b and \e x is * ignored here, but information about the layout of the data may be used. **/ HYPRE_Int HYPRE_FlexGMRESSetup(HYPRE_Solver solver, HYPRE_Matrix A, HYPRE_Vector b, HYPRE_Vector x); /** * Solve the system. **/ HYPRE_Int HYPRE_FlexGMRESSolve(HYPRE_Solver solver, HYPRE_Matrix A, HYPRE_Vector b, HYPRE_Vector x); /** * (Optional) Set the convergence tolerance. **/ HYPRE_Int HYPRE_FlexGMRESSetTol(HYPRE_Solver solver, HYPRE_Real tol); /** * (Optional) Set the absolute convergence tolerance (default is 0). * If one desires * the convergence test to check the absolute convergence tolerance \e only, then * set the relative convergence tolerance to 0.0. (The convergence test is * \f$\|r\| \leq\f$ max(relative\f$\_\f$tolerance\f$\ast \|b\|\f$, absolute\f$\_\f$tolerance).) * **/ HYPRE_Int HYPRE_FlexGMRESSetAbsoluteTol(HYPRE_Solver solver, HYPRE_Real a_tol); /* * RE-VISIT **/ HYPRE_Int HYPRE_FlexGMRESSetConvergenceFactorTol(HYPRE_Solver solver, HYPRE_Real cf_tol); /* * RE-VISIT **/ HYPRE_Int HYPRE_FlexGMRESSetMinIter(HYPRE_Solver solver, HYPRE_Int min_iter); /** * (Optional) Set maximum number of iterations. **/ HYPRE_Int HYPRE_FlexGMRESSetMaxIter(HYPRE_Solver solver, HYPRE_Int max_iter); /** * (Optional) Set the maximum size of the Krylov space. **/ HYPRE_Int HYPRE_FlexGMRESSetKDim(HYPRE_Solver solver, HYPRE_Int k_dim); /** * (Optional) Set the preconditioner to use. **/ HYPRE_Int HYPRE_FlexGMRESSetPrecond(HYPRE_Solver solver, HYPRE_PtrToSolverFcn precond, HYPRE_PtrToSolverFcn precond_setup, HYPRE_Solver precond_solver); /** * (Optional) Set the amount of logging to do. **/ HYPRE_Int HYPRE_FlexGMRESSetLogging(HYPRE_Solver solver, HYPRE_Int logging); /** * (Optional) Set the amount of printing to do to the screen. **/ HYPRE_Int HYPRE_FlexGMRESSetPrintLevel(HYPRE_Solver solver, HYPRE_Int level); /** * Return the number of iterations taken. **/ HYPRE_Int HYPRE_FlexGMRESGetNumIterations(HYPRE_Solver solver, HYPRE_Int *num_iterations); /** * Return the norm of the final relative residual. **/ HYPRE_Int HYPRE_FlexGMRESGetFinalRelativeResidualNorm(HYPRE_Solver solver, HYPRE_Real *norm); /** * Return the residual. **/ HYPRE_Int HYPRE_FlexGMRESGetResidual(HYPRE_Solver solver, void *residual); /** **/ HYPRE_Int HYPRE_FlexGMRESGetTol(HYPRE_Solver solver, HYPRE_Real *tol); /* * RE-VISIT **/ HYPRE_Int HYPRE_FlexGMRESGetConvergenceFactorTol(HYPRE_Solver solver, HYPRE_Real *cf_tol); /* * RE-VISIT **/ HYPRE_Int HYPRE_FlexGMRESGetStopCrit(HYPRE_Solver solver, HYPRE_Int *stop_crit); /* * RE-VISIT **/ HYPRE_Int HYPRE_FlexGMRESGetMinIter(HYPRE_Solver solver, HYPRE_Int *min_iter); /** **/ HYPRE_Int HYPRE_FlexGMRESGetMaxIter(HYPRE_Solver solver, HYPRE_Int *max_iter); /** **/ HYPRE_Int HYPRE_FlexGMRESGetKDim(HYPRE_Solver solver, HYPRE_Int *k_dim); /** **/ HYPRE_Int HYPRE_FlexGMRESGetPrecond(HYPRE_Solver solver, HYPRE_Solver *precond_data_ptr); /** **/ HYPRE_Int HYPRE_FlexGMRESGetLogging(HYPRE_Solver solver, HYPRE_Int *level); /** **/ HYPRE_Int HYPRE_FlexGMRESGetPrintLevel(HYPRE_Solver solver, HYPRE_Int *level); /** **/ HYPRE_Int HYPRE_FlexGMRESGetConverged(HYPRE_Solver solver, HYPRE_Int *converged); /** * (Optional) Set a user-defined function to modify solve-time preconditioner * attributes. **/ HYPRE_Int HYPRE_FlexGMRESSetModifyPC(HYPRE_Solver solver, HYPRE_PtrToModifyPCFcn modify_pc); /**@}*/ /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ /** * @name LGMRES Solver * * @{ **/ /** * Prepare to solve the system. The coefficient data in \e b and \e x is * ignored here, but information about the layout of the data may be used. **/ HYPRE_Int HYPRE_LGMRESSetup(HYPRE_Solver solver, HYPRE_Matrix A, HYPRE_Vector b, HYPRE_Vector x); /** * Solve the system. Details on LGMRES may be found in A. H. Baker, * E.R. Jessup, and T.A. Manteuffel, "A technique for accelerating the * convergence of restarted GMRES." SIAM Journal on Matrix Analysis and * Applications, 26 (2005), pp. 962-984. LGMRES(m,k) in the paper * corresponds to LGMRES(Kdim+AugDim, AugDim). **/ HYPRE_Int HYPRE_LGMRESSolve(HYPRE_Solver solver, HYPRE_Matrix A, HYPRE_Vector b, HYPRE_Vector x); /** * (Optional) Set the convergence tolerance. **/ HYPRE_Int HYPRE_LGMRESSetTol(HYPRE_Solver solver, HYPRE_Real tol); /** * (Optional) Set the absolute convergence tolerance (default is 0). * If one desires * the convergence test to check the absolute convergence tolerance \e only, then * set the relative convergence tolerance to 0.0. (The convergence test is * \f$\|r\| \leq\f$ max(relative\f$\_\f$tolerance\f$\ast \|b\|\f$, absolute\f$\_\f$tolerance).) * **/ HYPRE_Int HYPRE_LGMRESSetAbsoluteTol(HYPRE_Solver solver, HYPRE_Real a_tol); /* * RE-VISIT **/ HYPRE_Int HYPRE_LGMRESSetConvergenceFactorTol(HYPRE_Solver solver, HYPRE_Real cf_tol); /* * RE-VISIT **/ HYPRE_Int HYPRE_LGMRESSetMinIter(HYPRE_Solver solver, HYPRE_Int min_iter); /** * (Optional) Set maximum number of iterations. **/ HYPRE_Int HYPRE_LGMRESSetMaxIter(HYPRE_Solver solver, HYPRE_Int max_iter); /** * (Optional) Set the maximum size of the approximation space * (includes the augmentation vectors). **/ HYPRE_Int HYPRE_LGMRESSetKDim(HYPRE_Solver solver, HYPRE_Int k_dim); /** * (Optional) Set the number of augmentation vectors (default: 2). **/ HYPRE_Int HYPRE_LGMRESSetAugDim(HYPRE_Solver solver, HYPRE_Int aug_dim); /** * (Optional) Set the preconditioner to use. **/ HYPRE_Int HYPRE_LGMRESSetPrecond(HYPRE_Solver solver, HYPRE_PtrToSolverFcn precond, HYPRE_PtrToSolverFcn precond_setup, HYPRE_Solver precond_solver); /** * (Optional) Set the amount of logging to do. **/ HYPRE_Int HYPRE_LGMRESSetLogging(HYPRE_Solver solver, HYPRE_Int logging); /** * (Optional) Set the amount of printing to do to the screen. **/ HYPRE_Int HYPRE_LGMRESSetPrintLevel(HYPRE_Solver solver, HYPRE_Int level); /** * Return the number of iterations taken. **/ HYPRE_Int HYPRE_LGMRESGetNumIterations(HYPRE_Solver solver, HYPRE_Int *num_iterations); /** * Return the norm of the final relative residual. **/ HYPRE_Int HYPRE_LGMRESGetFinalRelativeResidualNorm(HYPRE_Solver solver, HYPRE_Real *norm); /** * Return the residual. **/ HYPRE_Int HYPRE_LGMRESGetResidual(HYPRE_Solver solver, void *residual); /** **/ HYPRE_Int HYPRE_LGMRESGetTol(HYPRE_Solver solver, HYPRE_Real *tol); /* * RE-VISIT **/ HYPRE_Int HYPRE_LGMRESGetConvergenceFactorTol(HYPRE_Solver solver, HYPRE_Real *cf_tol); /* * RE-VISIT **/ HYPRE_Int HYPRE_LGMRESGetStopCrit(HYPRE_Solver solver, HYPRE_Int *stop_crit); /* * RE-VISIT **/ HYPRE_Int HYPRE_LGMRESGetMinIter(HYPRE_Solver solver, HYPRE_Int *min_iter); /** **/ HYPRE_Int HYPRE_LGMRESGetMaxIter(HYPRE_Solver solver, HYPRE_Int *max_iter); /** **/ HYPRE_Int HYPRE_LGMRESGetKDim(HYPRE_Solver solver, HYPRE_Int *k_dim); /** **/ HYPRE_Int HYPRE_LGMRESGetAugDim(HYPRE_Solver solver, HYPRE_Int *k_dim); /** **/ HYPRE_Int HYPRE_LGMRESGetPrecond(HYPRE_Solver solver, HYPRE_Solver *precond_data_ptr); /** **/ HYPRE_Int HYPRE_LGMRESGetLogging(HYPRE_Solver solver, HYPRE_Int *level); /** **/ HYPRE_Int HYPRE_LGMRESGetPrintLevel(HYPRE_Solver solver, HYPRE_Int *level); /** **/ HYPRE_Int HYPRE_LGMRESGetConverged(HYPRE_Solver solver, HYPRE_Int *converged); /**** added by KS ****** */ /** * @name COGMRES Solver * * @{ **/ /** * Prepare to solve the system. The coefficient data in \e b and \e x is * ignored here, but information about the layout of the data may be used. **/ HYPRE_Int HYPRE_COGMRESSetup(HYPRE_Solver solver, HYPRE_Matrix A, HYPRE_Vector b, HYPRE_Vector x); /** * Solve the system. **/ HYPRE_Int HYPRE_COGMRESSolve(HYPRE_Solver solver, HYPRE_Matrix A, HYPRE_Vector b, HYPRE_Vector x); /** * (Optional) Set the convergence tolerance. **/ HYPRE_Int HYPRE_COGMRESSetTol(HYPRE_Solver solver, HYPRE_Real tol); /** * (Optional) Set the absolute convergence tolerance (default is 0). * If one desires * the convergence test to check the absolute convergence tolerance \e only, then * set the relative convergence tolerance to 0.0. (The convergence test is * \f$\|r\| \leq\f$ max(relative\f$\_\f$tolerance\f$\ast \|b\|\f$, absolute\f$\_\f$tolerance).) * **/ HYPRE_Int HYPRE_COGMRESSetAbsoluteTol(HYPRE_Solver solver, HYPRE_Real a_tol); /* * RE-VISIT **/ HYPRE_Int HYPRE_COGMRESSetConvergenceFactorTol(HYPRE_Solver solver, HYPRE_Real cf_tol); /* * RE-VISIT **/ HYPRE_Int HYPRE_COGMRESSetMinIter(HYPRE_Solver solver, HYPRE_Int min_iter); /** * (Optional) Set maximum number of iterations. **/ HYPRE_Int HYPRE_COGMRESSetMaxIter(HYPRE_Solver solver, HYPRE_Int max_iter); /** * (Optional) Set the maximum size of the Krylov space. **/ HYPRE_Int HYPRE_COGMRESSetKDim(HYPRE_Solver solver, HYPRE_Int k_dim); /** * (Optional) Set number of unrolling in mass funcyions in COGMRES * Can be 4 or 8. Default: no unrolling. **/ HYPRE_Int HYPRE_COGMRESSetUnroll(HYPRE_Solver solver, HYPRE_Int unroll); /** * (Optional) Set the number of orthogonalizations in COGMRES (at most 2). **/ HYPRE_Int HYPRE_COGMRESSetCGS(HYPRE_Solver solver, HYPRE_Int cgs); /** * (Optional) Set the preconditioner to use. **/ HYPRE_Int HYPRE_COGMRESSetPrecond(HYPRE_Solver solver, HYPRE_PtrToSolverFcn precond, HYPRE_PtrToSolverFcn precond_setup, HYPRE_Solver precond_solver); /** * (Optional) Set the amount of logging to do. **/ HYPRE_Int HYPRE_COGMRESSetLogging(HYPRE_Solver solver, HYPRE_Int logging); /** * (Optional) Set the amount of printing to do to the screen. **/ HYPRE_Int HYPRE_COGMRESSetPrintLevel(HYPRE_Solver solver, HYPRE_Int level); /** * Return the number of iterations taken. **/ HYPRE_Int HYPRE_COGMRESGetNumIterations(HYPRE_Solver solver, HYPRE_Int *num_iterations); /** * Return the norm of the final relative residual. **/ HYPRE_Int HYPRE_COGMRESGetFinalRelativeResidualNorm(HYPRE_Solver solver, HYPRE_Real *norm); /** * Return the residual. **/ HYPRE_Int HYPRE_COGMRESGetResidual(HYPRE_Solver solver, void *residual); /** **/ HYPRE_Int HYPRE_COGMRESGetTol(HYPRE_Solver solver, HYPRE_Real *tol); /* * RE-VISIT **/ HYPRE_Int HYPRE_COGMRESGetConvergenceFactorTol(HYPRE_Solver solver, HYPRE_Real *cf_tol); /* * RE-VISIT **/ //HYPRE_Int HYPRE_COGMRESGetStopCrit(HYPRE_Solver solver, HYPRE_Int *stop_crit); //HYPRE_Int HYPRE_COGMRESSetStopCrit(HYPRE_Solver solver, HYPRE_Int *stop_crit); /* * RE-VISIT **/ HYPRE_Int HYPRE_COGMRESGetMinIter(HYPRE_Solver solver, HYPRE_Int *min_iter); /** **/ HYPRE_Int HYPRE_COGMRESGetMaxIter(HYPRE_Solver solver, HYPRE_Int *max_iter); /** **/ HYPRE_Int HYPRE_COGMRESGetKDim(HYPRE_Solver solver, HYPRE_Int *k_dim); /** **/ HYPRE_Int HYPRE_COGMRESGetUnroll(HYPRE_Solver solver, HYPRE_Int *unroll); /** **/ HYPRE_Int HYPRE_COGMRESGetCGS(HYPRE_Solver solver, HYPRE_Int *cgs); /** **/ HYPRE_Int HYPRE_COGMRESGetPrecond(HYPRE_Solver solver, HYPRE_Solver *precond_data_ptr); /** **/ HYPRE_Int HYPRE_COGMRESGetLogging(HYPRE_Solver solver, HYPRE_Int *level); /** **/ HYPRE_Int HYPRE_COGMRESGetPrintLevel(HYPRE_Solver solver, HYPRE_Int *level); /** **/ HYPRE_Int HYPRE_COGMRESGetConverged(HYPRE_Solver solver, HYPRE_Int *converged); /** * (Optional) Set a user-defined function to modify solve-time preconditioner * attributes. **/ HYPRE_Int HYPRE_COGMRESSetModifyPC(HYPRE_Solver solver, HYPRE_PtrToModifyPCFcn modify_pc); /****** KS code ends here **************************************************/ /**@}*/ /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ /** * @name BiCGSTAB Solver * * @{ **/ /* * RE-VISIT **/ HYPRE_Int HYPRE_BiCGSTABDestroy(HYPRE_Solver solver); /** * Prepare to solve the system. The coefficient data in \e b and \e x is * ignored here, but information about the layout of the data may be used. **/ HYPRE_Int HYPRE_BiCGSTABSetup(HYPRE_Solver solver, HYPRE_Matrix A, HYPRE_Vector b, HYPRE_Vector x); /** * Solve the system. **/ HYPRE_Int HYPRE_BiCGSTABSolve(HYPRE_Solver solver, HYPRE_Matrix A, HYPRE_Vector b, HYPRE_Vector x); /** * (Optional) Set the convergence tolerance. **/ HYPRE_Int HYPRE_BiCGSTABSetTol(HYPRE_Solver solver, HYPRE_Real tol); /** * (Optional) Set the absolute convergence tolerance (default is 0). * If one desires * the convergence test to check the absolute convergence tolerance \e only, then * set the relative convergence tolerance to 0.0. (The convergence test is * \f$\|r\| \leq\f$ max(relative\f$\_\f$tolerance \f$\ast \|b\|\f$, absolute\f$\_\f$tolerance).) * **/ HYPRE_Int HYPRE_BiCGSTABSetAbsoluteTol(HYPRE_Solver solver, HYPRE_Real a_tol); /* * RE-VISIT **/ HYPRE_Int HYPRE_BiCGSTABSetConvergenceFactorTol(HYPRE_Solver solver, HYPRE_Real cf_tol); /* * RE-VISIT **/ HYPRE_Int HYPRE_BiCGSTABSetStopCrit(HYPRE_Solver solver, HYPRE_Int stop_crit); /* * RE-VISIT **/ HYPRE_Int HYPRE_BiCGSTABSetMinIter(HYPRE_Solver solver, HYPRE_Int min_iter); /** * (Optional) Set maximum number of iterations. **/ HYPRE_Int HYPRE_BiCGSTABSetMaxIter(HYPRE_Solver solver, HYPRE_Int max_iter); /** * (Optional) Set the preconditioner to use. **/ HYPRE_Int HYPRE_BiCGSTABSetPrecond(HYPRE_Solver solver, HYPRE_PtrToSolverFcn precond, HYPRE_PtrToSolverFcn precond_setup, HYPRE_Solver precond_solver); /** * (Optional) Set the amount of logging to do. **/ HYPRE_Int HYPRE_BiCGSTABSetLogging(HYPRE_Solver solver, HYPRE_Int logging); /** * (Optional) Set the amount of printing to do to the screen. **/ HYPRE_Int HYPRE_BiCGSTABSetPrintLevel(HYPRE_Solver solver, HYPRE_Int level); /** * Return the number of iterations taken. **/ HYPRE_Int HYPRE_BiCGSTABGetNumIterations(HYPRE_Solver solver, HYPRE_Int *num_iterations); /** * Return the norm of the final relative residual. **/ HYPRE_Int HYPRE_BiCGSTABGetFinalRelativeResidualNorm(HYPRE_Solver solver, HYPRE_Real *norm); /** * Return the residual. **/ HYPRE_Int HYPRE_BiCGSTABGetResidual(HYPRE_Solver solver, void *residual); /** **/ HYPRE_Int HYPRE_BiCGSTABGetPrecond(HYPRE_Solver solver, HYPRE_Solver *precond_data_ptr); /**@}*/ /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ /** * @name CGNR Solver * * @{ **/ /* * RE-VISIT **/ HYPRE_Int HYPRE_CGNRDestroy(HYPRE_Solver solver); /** * Prepare to solve the system. The coefficient data in \e b and \e x is * ignored here, but information about the layout of the data may be used. **/ HYPRE_Int HYPRE_CGNRSetup(HYPRE_Solver solver, HYPRE_Matrix A, HYPRE_Vector b, HYPRE_Vector x); /** * Solve the system. **/ HYPRE_Int HYPRE_CGNRSolve(HYPRE_Solver solver, HYPRE_Matrix A, HYPRE_Vector b, HYPRE_Vector x); /** * (Optional) Set the convergence tolerance. **/ HYPRE_Int HYPRE_CGNRSetTol(HYPRE_Solver solver, HYPRE_Real tol); /* * RE-VISIT **/ HYPRE_Int HYPRE_CGNRSetStopCrit(HYPRE_Solver solver, HYPRE_Int stop_crit); /* * RE-VISIT **/ HYPRE_Int HYPRE_CGNRSetMinIter(HYPRE_Solver solver, HYPRE_Int min_iter); /** * (Optional) Set maximum number of iterations. **/ HYPRE_Int HYPRE_CGNRSetMaxIter(HYPRE_Solver solver, HYPRE_Int max_iter); /** * (Optional) Set the preconditioner to use. * Note that the only preconditioner available in hypre for use with * CGNR is currently BoomerAMG. It requires to use Jacobi as * a smoother without CF smoothing, i.e. relax_type needs to be set to 0 * or 7 and relax_order needs to be set to 0 by the user, since these * are not default values. It can be used with a relaxation weight for * Jacobi, which can significantly improve convergence. **/ HYPRE_Int HYPRE_CGNRSetPrecond(HYPRE_Solver solver, HYPRE_PtrToSolverFcn precond, HYPRE_PtrToSolverFcn precondT, HYPRE_PtrToSolverFcn precond_setup, HYPRE_Solver precond_solver); /** * (Optional) Set the amount of logging to do. **/ HYPRE_Int HYPRE_CGNRSetLogging(HYPRE_Solver solver, HYPRE_Int logging); #if 0 /* need to add */ /* * (Optional) Set the amount of printing to do to the screen. **/ HYPRE_Int HYPRE_CGNRSetPrintLevel(HYPRE_Solver solver, HYPRE_Int level); #endif /** * Return the number of iterations taken. **/ HYPRE_Int HYPRE_CGNRGetNumIterations(HYPRE_Solver solver, HYPRE_Int *num_iterations); /** * Return the norm of the final relative residual. **/ HYPRE_Int HYPRE_CGNRGetFinalRelativeResidualNorm(HYPRE_Solver solver, HYPRE_Real *norm); #if 0 /* need to add */ /* * Return the residual. **/ HYPRE_Int HYPRE_CGNRGetResidual(HYPRE_Solver solver, void **residual); #endif /** **/ HYPRE_Int HYPRE_CGNRGetPrecond(HYPRE_Solver solver, HYPRE_Solver *precond_data_ptr); /**@}*/ /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ /**@}*/ #ifdef __cplusplus } #endif #endif hypre-2.33.0/src/krylov/HYPRE_lgmres.c000066400000000000000000000226551477326011500174670ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * HYPRE_LGMRES interface * *****************************************************************************/ #include "krylov.h" /*-------------------------------------------------------------------------- * HYPRE_LGMRESDestroy *--------------------------------------------------------------------------*/ /* to do, not trivial */ /* HYPRE_Int HYPRE_ParCSRLGMRESDestroy( HYPRE_Solver solver ) { return( hypre_LGMRESDestroy( (void *) solver ) ); } */ /*-------------------------------------------------------------------------- * HYPRE_LGMRESSetup *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_LGMRESSetup( HYPRE_Solver solver, HYPRE_Matrix A, HYPRE_Vector b, HYPRE_Vector x ) { return ( hypre_LGMRESSetup( solver, A, b, x ) ); } /*-------------------------------------------------------------------------- * HYPRE_LGMRESSolve *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_LGMRESSolve( HYPRE_Solver solver, HYPRE_Matrix A, HYPRE_Vector b, HYPRE_Vector x ) { return ( hypre_LGMRESSolve( solver, A, b, x ) ); } /*-------------------------------------------------------------------------- * HYPRE_LGMRESSetKDim, HYPRE_LGMRESGetKDim *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_LGMRESSetKDim( HYPRE_Solver solver, HYPRE_Int k_dim ) { return ( hypre_LGMRESSetKDim( (void *) solver, k_dim ) ); } HYPRE_Int HYPRE_LGMRESGetKDim( HYPRE_Solver solver, HYPRE_Int * k_dim ) { return ( hypre_LGMRESGetKDim( (void *) solver, k_dim ) ); } /*-------------------------------------------------------------------------- * HYPRE_LGMRESSetAugDim, HYPRE_LGMRESGetAugDim *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_LGMRESSetAugDim( HYPRE_Solver solver, HYPRE_Int aug_dim ) { return ( hypre_LGMRESSetAugDim( (void *) solver, aug_dim ) ); } HYPRE_Int HYPRE_LGMRESGetAugDim( HYPRE_Solver solver, HYPRE_Int * aug_dim ) { return ( hypre_LGMRESGetAugDim( (void *) solver, aug_dim ) ); } /*-------------------------------------------------------------------------- * HYPRE_LGMRESSetTol, HYPRE_LGMRESGetTol *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_LGMRESSetTol( HYPRE_Solver solver, HYPRE_Real tol ) { return ( hypre_LGMRESSetTol( (void *) solver, tol ) ); } HYPRE_Int HYPRE_LGMRESGetTol( HYPRE_Solver solver, HYPRE_Real * tol ) { return ( hypre_LGMRESGetTol( (void *) solver, tol ) ); } /*-------------------------------------------------------------------------- * HYPRE_LGMRESSetAbsoluteTol, HYPRE_LGMRESGetAbsoluteTol *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_LGMRESSetAbsoluteTol( HYPRE_Solver solver, HYPRE_Real a_tol ) { return ( hypre_LGMRESSetAbsoluteTol( (void *) solver, a_tol ) ); } HYPRE_Int HYPRE_LGMRESGetAbsoluteTol( HYPRE_Solver solver, HYPRE_Real * a_tol ) { return ( hypre_LGMRESGetAbsoluteTol( (void *) solver, a_tol ) ); } /*-------------------------------------------------------------------------- * HYPRE_LGMRESSetConvergenceFactorTol, HYPRE_LGMRESGetConvergenceFactorTol *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_LGMRESSetConvergenceFactorTol( HYPRE_Solver solver, HYPRE_Real cf_tol ) { return ( hypre_LGMRESSetConvergenceFactorTol( (void *) solver, cf_tol ) ); } HYPRE_Int HYPRE_LGMRESGetConvergenceFactorTol( HYPRE_Solver solver, HYPRE_Real * cf_tol ) { return ( hypre_LGMRESGetConvergenceFactorTol( (void *) solver, cf_tol ) ); } /*-------------------------------------------------------------------------- * HYPRE_LGMRESSetMinIter, HYPRE_LGMRESGetMinIter *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_LGMRESSetMinIter( HYPRE_Solver solver, HYPRE_Int min_iter ) { return ( hypre_LGMRESSetMinIter( (void *) solver, min_iter ) ); } HYPRE_Int HYPRE_LGMRESGetMinIter( HYPRE_Solver solver, HYPRE_Int * min_iter ) { return ( hypre_LGMRESGetMinIter( (void *) solver, min_iter ) ); } /*-------------------------------------------------------------------------- * HYPRE_LGMRESSetMaxIter, HYPRE_LGMRESGetMaxIter *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_LGMRESSetMaxIter( HYPRE_Solver solver, HYPRE_Int max_iter ) { return ( hypre_LGMRESSetMaxIter( (void *) solver, max_iter ) ); } HYPRE_Int HYPRE_LGMRESGetMaxIter( HYPRE_Solver solver, HYPRE_Int * max_iter ) { return ( hypre_LGMRESGetMaxIter( (void *) solver, max_iter ) ); } /*-------------------------------------------------------------------------- * HYPRE_LGMRESSetPrecond *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_LGMRESSetPrecond( HYPRE_Solver solver, HYPRE_PtrToSolverFcn precond, HYPRE_PtrToSolverFcn precond_setup, HYPRE_Solver precond_solver ) { return ( hypre_LGMRESSetPrecond( (void *) solver, (HYPRE_Int (*)(void*, void*, void*, void*))precond, (HYPRE_Int (*)(void*, void*, void*, void*))precond_setup, (void *) precond_solver ) ); } /*-------------------------------------------------------------------------- * HYPRE_LGMRESGetPrecond *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_LGMRESGetPrecond( HYPRE_Solver solver, HYPRE_Solver *precond_data_ptr ) { return ( hypre_LGMRESGetPrecond( (void *) solver, (HYPRE_Solver *) precond_data_ptr ) ); } /*-------------------------------------------------------------------------- * HYPRE_LGMRESSetPrintLevel, HYPRE_LGMRESGetPrintLevel *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_LGMRESSetPrintLevel( HYPRE_Solver solver, HYPRE_Int level ) { return ( hypre_LGMRESSetPrintLevel( (void *) solver, level ) ); } HYPRE_Int HYPRE_LGMRESGetPrintLevel( HYPRE_Solver solver, HYPRE_Int * level ) { return ( hypre_LGMRESGetPrintLevel( (void *) solver, level ) ); } /*-------------------------------------------------------------------------- * HYPRE_LGMRESSetLogging, HYPRE_LGMRESGetLogging *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_LGMRESSetLogging( HYPRE_Solver solver, HYPRE_Int level ) { return ( hypre_LGMRESSetLogging( (void *) solver, level ) ); } HYPRE_Int HYPRE_LGMRESGetLogging( HYPRE_Solver solver, HYPRE_Int * level ) { return ( hypre_LGMRESGetLogging( (void *) solver, level ) ); } /*-------------------------------------------------------------------------- * HYPRE_LGMRESGetNumIterations *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_LGMRESGetNumIterations( HYPRE_Solver solver, HYPRE_Int *num_iterations ) { return ( hypre_LGMRESGetNumIterations( (void *) solver, num_iterations ) ); } /*-------------------------------------------------------------------------- * HYPRE_LGMRESGetConverged *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_LGMRESGetConverged( HYPRE_Solver solver, HYPRE_Int *converged ) { return ( hypre_LGMRESGetConverged( (void *) solver, converged ) ); } /*-------------------------------------------------------------------------- * HYPRE_LGMRESGetFinalRelativeResidualNorm *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_LGMRESGetFinalRelativeResidualNorm( HYPRE_Solver solver, HYPRE_Real *norm ) { return ( hypre_LGMRESGetFinalRelativeResidualNorm( (void *) solver, norm ) ); } /*-------------------------------------------------------------------------- * HYPRE_LGMRESGetResidual *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_LGMRESGetResidual( HYPRE_Solver solver, void *residual ) { /* returns a pointer to the residual vector */ return hypre_LGMRESGetResidual( (void *) solver, (void **) residual ); } hypre-2.33.0/src/krylov/HYPRE_lobpcg.c000066400000000000000000000431201477326011500174320ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * HYPRE_LOBPCG interface * *****************************************************************************/ #include "_hypre_utilities.h" #include "HYPRE_config.h" #include "HYPRE_lobpcg.h" #include "lobpcg.h" #include "interpreter.h" #include "HYPRE_MatvecFunctions.h" #include "_hypre_lapack.h" typedef struct { HYPRE_Int (*Precond)(void*, void*, void*, void*); HYPRE_Int (*PrecondSetup)(void*, void*, void*, void*); } hypre_LOBPCGPrecond; typedef struct { lobpcg_Tolerance tolerance; HYPRE_Int maxIterations; HYPRE_Int verbosityLevel; HYPRE_Int precondUsageMode; HYPRE_Int iterationNumber; utilities_FortranMatrix* eigenvaluesHistory; utilities_FortranMatrix* residualNorms; utilities_FortranMatrix* residualNormsHistory; } lobpcg_Data; #define lobpcg_tolerance(data) ((data).tolerance) #define lobpcg_absoluteTolerance(data) ((data).tolerance.absolute) #define lobpcg_relativeTolerance(data) ((data).tolerance.relative) #define lobpcg_maxIterations(data) ((data).maxIterations) #define lobpcg_verbosityLevel(data) ((data).verbosityLevel) #define lobpcg_precondUsageMode(data) ((data).precondUsageMode) #define lobpcg_iterationNumber(data) ((data).iterationNumber) #define lobpcg_eigenvaluesHistory(data) ((data).eigenvaluesHistory) #define lobpcg_residualNorms(data) ((data).residualNorms) #define lobpcg_residualNormsHistory(data) ((data).residualNormsHistory) typedef struct { lobpcg_Data lobpcgData; mv_InterfaceInterpreter* interpreter; void* A; void* matvecData; void* precondData; void* B; void* matvecDataB; void* T; void* matvecDataT; hypre_LOBPCGPrecond precondFunctions; HYPRE_MatvecFunctions* matvecFunctions; } hypre_LOBPCGData; static HYPRE_Int dsygv_interface (HYPRE_Int *itype, char *jobz, char *uplo, HYPRE_Int * n, HYPRE_Real *a, HYPRE_Int *lda, HYPRE_Real *b, HYPRE_Int *ldb, HYPRE_Real *w, HYPRE_Real *work, HYPRE_Int *lwork, HYPRE_Int *info) { hypre_dsygv(itype, jobz, uplo, n, a, lda, b, ldb, w, work, lwork, info); return 0; } static HYPRE_Int dpotrf_interface (const char *uplo, HYPRE_Int *n, HYPRE_Real *a, HYPRE_Int * lda, HYPRE_Int *info) { hypre_dpotrf(uplo, n, a, lda, info); return 0; } HYPRE_Int lobpcg_initialize( lobpcg_Data* data ) { (data->tolerance).absolute = 1.0e-06; (data->tolerance).relative = 1.0e-06; (data->maxIterations) = 500; (data->precondUsageMode) = 0; (data->verbosityLevel) = 0; (data->eigenvaluesHistory) = utilities_FortranMatrixCreate(); (data->residualNorms) = utilities_FortranMatrixCreate(); (data->residualNormsHistory) = utilities_FortranMatrixCreate(); return 0; } HYPRE_Int lobpcg_clean( lobpcg_Data* data ) { utilities_FortranMatrixDestroy( data->eigenvaluesHistory ); utilities_FortranMatrixDestroy( data->residualNorms ); utilities_FortranMatrixDestroy( data->residualNormsHistory ); return 0; } HYPRE_Int hypre_LOBPCGDestroy( void *pcg_vdata ) { hypre_LOBPCGData *pcg_data = (hypre_LOBPCGData*)pcg_vdata; if (pcg_data) { HYPRE_MatvecFunctions * mv = pcg_data->matvecFunctions; if ( pcg_data->matvecData != NULL ) { (*(mv->MatvecDestroy))(pcg_data->matvecData); pcg_data->matvecData = NULL; } if ( pcg_data->matvecDataB != NULL ) { (*(mv->MatvecDestroy))(pcg_data->matvecDataB); pcg_data->matvecDataB = NULL; } if ( pcg_data->matvecDataT != NULL ) { (*(mv->MatvecDestroy))(pcg_data->matvecDataT); pcg_data->matvecDataT = NULL; } lobpcg_clean( &(pcg_data->lobpcgData) ); hypre_TFree( pcg_vdata, HYPRE_MEMORY_HOST); } return hypre_error_flag; } HYPRE_Int hypre_LOBPCGSetup( void *pcg_vdata, void *A, void *b, void *x ) { hypre_LOBPCGData *pcg_data = (hypre_LOBPCGData*)pcg_vdata; HYPRE_MatvecFunctions * mv = pcg_data->matvecFunctions; HYPRE_Int (*precond_setup)(void*, void*, void*, void*) = (pcg_data->precondFunctions).PrecondSetup; void *precond_data = (pcg_data->precondData); (pcg_data->A) = A; if ( pcg_data->matvecData != NULL ) { (*(mv->MatvecDestroy))(pcg_data->matvecData); } (pcg_data->matvecData) = (*(mv->MatvecCreate))(A, x); if ( precond_setup != NULL ) { if ( pcg_data->T == NULL ) { precond_setup(precond_data, A, b, x); } else { precond_setup(precond_data, pcg_data->T, b, x); } } return hypre_error_flag; } HYPRE_Int hypre_LOBPCGSetupB( void *pcg_vdata, void *B, void *x ) { hypre_LOBPCGData *pcg_data = (hypre_LOBPCGData*)pcg_vdata; HYPRE_MatvecFunctions * mv = pcg_data->matvecFunctions; (pcg_data->B) = B; if ( pcg_data->matvecDataB != NULL ) { (*(mv->MatvecDestroy))(pcg_data -> matvecDataB); } (pcg_data->matvecDataB) = (*(mv->MatvecCreate))(B, x); if ( B != NULL ) { (pcg_data->matvecDataB) = (*(mv->MatvecCreate))(B, x); } else { (pcg_data->matvecDataB) = NULL; } return hypre_error_flag; } HYPRE_Int hypre_LOBPCGSetupT( void *pcg_vdata, void *T, void *x ) { hypre_LOBPCGData *pcg_data = (hypre_LOBPCGData*)pcg_vdata; HYPRE_MatvecFunctions * mv = pcg_data->matvecFunctions; (pcg_data -> T) = T; if ( pcg_data->matvecDataT != NULL ) { (*(mv->MatvecDestroy))(pcg_data->matvecDataT); } if ( T != NULL ) { (pcg_data->matvecDataT) = (*(mv->MatvecCreate))(T, x); } else { (pcg_data->matvecDataT) = NULL; } return hypre_error_flag; } HYPRE_Int hypre_LOBPCGSetTol( void* pcg_vdata, HYPRE_Real tol ) { hypre_LOBPCGData *pcg_data = (hypre_LOBPCGData*)pcg_vdata; lobpcg_absoluteTolerance(pcg_data->lobpcgData) = tol; return hypre_error_flag; } HYPRE_Int hypre_LOBPCGSetRTol( void* pcg_vdata, HYPRE_Real tol ) { hypre_LOBPCGData *pcg_data = (hypre_LOBPCGData*) pcg_vdata; lobpcg_relativeTolerance(pcg_data->lobpcgData) = tol; return hypre_error_flag; } HYPRE_Int hypre_LOBPCGSetMaxIter( void* pcg_vdata, HYPRE_Int max_iter ) { hypre_LOBPCGData *pcg_data = (hypre_LOBPCGData*)pcg_vdata; lobpcg_maxIterations(pcg_data->lobpcgData) = max_iter; return hypre_error_flag; } HYPRE_Int hypre_LOBPCGSetPrecondUsageMode( void* pcg_vdata, HYPRE_Int mode ) { hypre_LOBPCGData *pcg_data = (hypre_LOBPCGData*)pcg_vdata; lobpcg_precondUsageMode(pcg_data->lobpcgData) = mode; return hypre_error_flag; } HYPRE_Int hypre_LOBPCGGetPrecond( void *pcg_vdata, HYPRE_Solver *precond_data_ptr ) { hypre_LOBPCGData* pcg_data = (hypre_LOBPCGData*)pcg_vdata; *precond_data_ptr = (HYPRE_Solver)(pcg_data -> precondData); return hypre_error_flag; } HYPRE_Int hypre_LOBPCGSetPrecond( void *pcg_vdata, HYPRE_Int (*precond)(void*, void*, void*, void*), HYPRE_Int (*precond_setup)(void*, void*, void*, void*), void *precond_data ) { hypre_LOBPCGData* pcg_data = (hypre_LOBPCGData*)pcg_vdata; (pcg_data->precondFunctions).Precond = precond; (pcg_data->precondFunctions).PrecondSetup = precond_setup; (pcg_data->precondData) = precond_data; return hypre_error_flag; } HYPRE_Int hypre_LOBPCGSetPrintLevel( void *pcg_vdata, HYPRE_Int level ) { hypre_LOBPCGData *pcg_data = (hypre_LOBPCGData*)pcg_vdata; lobpcg_verbosityLevel(pcg_data->lobpcgData) = level; return hypre_error_flag; } void hypre_LOBPCGPreconditioner( void *vdata, void* x, void* y ) { hypre_LOBPCGData *data = (hypre_LOBPCGData*)vdata; mv_InterfaceInterpreter* ii = data->interpreter; HYPRE_Int (*precond)(void*, void*, void*, void*) = (data->precondFunctions).Precond; if ( precond == NULL ) { (*(ii->CopyVector))(x, y); return; } if ( lobpcg_precondUsageMode(data->lobpcgData) == 0 ) { (*(ii->ClearVector))(y); } else { (*(ii->CopyVector))(x, y); } if ( data->T == NULL ) { precond(data->precondData, data->A, x, y); } else { precond(data->precondData, data->T, x, y); } } void hypre_LOBPCGOperatorA( void *pcg_vdata, void* x, void* y ) { hypre_LOBPCGData* pcg_data = (hypre_LOBPCGData*)pcg_vdata; HYPRE_MatvecFunctions * mv = pcg_data->matvecFunctions; void* matvec_data = (pcg_data -> matvecData); (*(mv->Matvec))(matvec_data, 1.0, pcg_data->A, x, 0.0, y); } void hypre_LOBPCGOperatorB( void *pcg_vdata, void* x, void* y ) { hypre_LOBPCGData* pcg_data = (hypre_LOBPCGData*)pcg_vdata; mv_InterfaceInterpreter* ii = pcg_data->interpreter; HYPRE_MatvecFunctions * mv = pcg_data->matvecFunctions; void* matvec_data = (pcg_data -> matvecDataB); if ( pcg_data->B == NULL ) { (*(ii->CopyVector))(x, y); /* a test */ /* (*(ii->ScaleVector))(2.0, y); */ return; } (*(mv->Matvec))(matvec_data, 1.0, pcg_data->B, x, 0.0, y); } void hypre_LOBPCGMultiPreconditioner( void *data, void * x, void* y ) { hypre_LOBPCGData *pcg_data = (hypre_LOBPCGData*)data; mv_InterfaceInterpreter* ii = pcg_data->interpreter; ii->Eval( hypre_LOBPCGPreconditioner, data, x, y ); } void hypre_LOBPCGMultiOperatorA( void *data, void * x, void* y ) { hypre_LOBPCGData *pcg_data = (hypre_LOBPCGData*)data; mv_InterfaceInterpreter* ii = pcg_data->interpreter; ii->Eval( hypre_LOBPCGOperatorA, data, x, y ); } void hypre_LOBPCGMultiOperatorB( void *data, void * x, void* y ) { hypre_LOBPCGData *pcg_data = (hypre_LOBPCGData*)data; mv_InterfaceInterpreter* ii = pcg_data->interpreter; ii->Eval( hypre_LOBPCGOperatorB, data, x, y ); } HYPRE_Int hypre_LOBPCGSolve( void *vdata, mv_MultiVectorPtr con, mv_MultiVectorPtr vec, HYPRE_Real* val ) { hypre_LOBPCGData* data = (hypre_LOBPCGData*)vdata; HYPRE_Int (*precond)(void*, void*, void*, void*) = (data->precondFunctions).Precond; void* opB = data->B; void (*prec)( void*, void*, void* ); void (*operatorA)( void*, void*, void* ); void (*operatorB)( void*, void*, void* ); HYPRE_Int maxit = lobpcg_maxIterations(data->lobpcgData); HYPRE_Int verb = lobpcg_verbosityLevel(data->lobpcgData); HYPRE_Int n = mv_MultiVectorWidth( vec ); lobpcg_BLASLAPACKFunctions blap_fn; utilities_FortranMatrix* lambdaHistory; utilities_FortranMatrix* residuals; utilities_FortranMatrix* residualsHistory; lambdaHistory = lobpcg_eigenvaluesHistory(data->lobpcgData); residuals = lobpcg_residualNorms(data->lobpcgData); residualsHistory = lobpcg_residualNormsHistory(data->lobpcgData); utilities_FortranMatrixAllocateData( n, maxit + 1, lambdaHistory ); utilities_FortranMatrixAllocateData( n, 1, residuals ); utilities_FortranMatrixAllocateData( n, maxit + 1, residualsHistory ); if ( precond != NULL ) { prec = hypre_LOBPCGMultiPreconditioner; } else { prec = NULL; } operatorA = hypre_LOBPCGMultiOperatorA; if ( opB != NULL ) { operatorB = hypre_LOBPCGMultiOperatorB; } else { operatorB = NULL; } blap_fn.dsygv = dsygv_interface; blap_fn.dpotrf = dpotrf_interface; lobpcg_solve( vec, vdata, operatorA, vdata, operatorB, vdata, prec, con, blap_fn, lobpcg_tolerance(data->lobpcgData), maxit, verb, &(lobpcg_iterationNumber(data->lobpcgData)), val, utilities_FortranMatrixValues(lambdaHistory), utilities_FortranMatrixGlobalHeight(lambdaHistory), utilities_FortranMatrixValues(residuals), utilities_FortranMatrixValues(residualsHistory), utilities_FortranMatrixGlobalHeight(residualsHistory) ); return hypre_error_flag; } utilities_FortranMatrix* hypre_LOBPCGResidualNorms( void *vdata ) { hypre_LOBPCGData *data = (hypre_LOBPCGData*)vdata; return (lobpcg_residualNorms(data->lobpcgData)); } utilities_FortranMatrix* hypre_LOBPCGResidualNormsHistory( void *vdata ) { hypre_LOBPCGData *data = (hypre_LOBPCGData*)vdata; return (lobpcg_residualNormsHistory(data->lobpcgData)); } utilities_FortranMatrix* hypre_LOBPCGEigenvaluesHistory( void *vdata ) { hypre_LOBPCGData *data = (hypre_LOBPCGData*)vdata; return (lobpcg_eigenvaluesHistory(data->lobpcgData)); } HYPRE_Int hypre_LOBPCGIterations( void* vdata ) { hypre_LOBPCGData *data = (hypre_LOBPCGData*)vdata; return (lobpcg_iterationNumber(data->lobpcgData)); } HYPRE_Int HYPRE_LOBPCGCreate( mv_InterfaceInterpreter* ii, HYPRE_MatvecFunctions* mv, HYPRE_Solver* solver ) { hypre_LOBPCGData *pcg_data; pcg_data = hypre_CTAlloc(hypre_LOBPCGData, 1, HYPRE_MEMORY_HOST); (pcg_data->precondFunctions).Precond = NULL; (pcg_data->precondFunctions).PrecondSetup = NULL; /* set defaults */ (pcg_data->interpreter) = ii; pcg_data->matvecFunctions = mv; (pcg_data->matvecData) = NULL; (pcg_data->B) = NULL; (pcg_data->matvecDataB) = NULL; (pcg_data->T) = NULL; (pcg_data->matvecDataT) = NULL; (pcg_data->precondData) = NULL; lobpcg_initialize( &(pcg_data->lobpcgData) ); *solver = (HYPRE_Solver)pcg_data; return hypre_error_flag; } HYPRE_Int HYPRE_LOBPCGDestroy( HYPRE_Solver solver ) { return ( hypre_LOBPCGDestroy( (void *) solver ) ); } HYPRE_Int HYPRE_LOBPCGSetup( HYPRE_Solver solver, HYPRE_Matrix A, HYPRE_Vector b, HYPRE_Vector x ) { return ( hypre_LOBPCGSetup( solver, A, b, x ) ); } HYPRE_Int HYPRE_LOBPCGSetupB( HYPRE_Solver solver, HYPRE_Matrix B, HYPRE_Vector x ) { return ( hypre_LOBPCGSetupB( solver, B, x ) ); } HYPRE_Int HYPRE_LOBPCGSetupT( HYPRE_Solver solver, HYPRE_Matrix T, HYPRE_Vector x ) { return ( hypre_LOBPCGSetupT( solver, T, x ) ); } HYPRE_Int HYPRE_LOBPCGSolve( HYPRE_Solver solver, mv_MultiVectorPtr con, mv_MultiVectorPtr vec, HYPRE_Real* val ) { return ( hypre_LOBPCGSolve( (void *) solver, con, vec, val ) ); } HYPRE_Int HYPRE_LOBPCGSetTol( HYPRE_Solver solver, HYPRE_Real tol ) { return ( hypre_LOBPCGSetTol( (void *) solver, tol ) ); } HYPRE_Int HYPRE_LOBPCGSetRTol( HYPRE_Solver solver, HYPRE_Real tol ) { return ( hypre_LOBPCGSetRTol( (void *) solver, tol ) ); } HYPRE_Int HYPRE_LOBPCGSetMaxIter( HYPRE_Solver solver, HYPRE_Int max_iter ) { return ( hypre_LOBPCGSetMaxIter( (void *) solver, max_iter ) ); } HYPRE_Int HYPRE_LOBPCGSetPrecondUsageMode( HYPRE_Solver solver, HYPRE_Int mode ) { return ( hypre_LOBPCGSetPrecondUsageMode( (void *) solver, mode ) ); } HYPRE_Int HYPRE_LOBPCGSetPrecond( HYPRE_Solver solver, HYPRE_PtrToSolverFcn precond, HYPRE_PtrToSolverFcn precond_setup, HYPRE_Solver precond_solver ) { return ( hypre_LOBPCGSetPrecond( (void *) solver, (HYPRE_Int (*)(void*, void*, void*, void*))precond, (HYPRE_Int (*)(void*, void*, void*, void*))precond_setup, (void *) precond_solver ) ); } HYPRE_Int HYPRE_LOBPCGGetPrecond( HYPRE_Solver solver, HYPRE_Solver *precond_data_ptr ) { return ( hypre_LOBPCGGetPrecond( (void *) solver, (HYPRE_Solver *) precond_data_ptr ) ); } HYPRE_Int HYPRE_LOBPCGSetPrintLevel( HYPRE_Solver solver, HYPRE_Int level ) { return ( hypre_LOBPCGSetPrintLevel( (void*)solver, level ) ); } utilities_FortranMatrix* HYPRE_LOBPCGResidualNorms( HYPRE_Solver solver ) { return ( hypre_LOBPCGResidualNorms( (void*)solver ) ); } utilities_FortranMatrix* HYPRE_LOBPCGResidualNormsHistory( HYPRE_Solver solver ) { return ( hypre_LOBPCGResidualNormsHistory( (void*)solver ) ); } utilities_FortranMatrix* HYPRE_LOBPCGEigenvaluesHistory( HYPRE_Solver solver ) { return ( hypre_LOBPCGEigenvaluesHistory( (void*)solver ) ); } HYPRE_Int HYPRE_LOBPCGIterations( HYPRE_Solver solver ) { return ( hypre_LOBPCGIterations( (void*)solver ) ); } void lobpcg_MultiVectorByMultiVector( mv_MultiVectorPtr x, mv_MultiVectorPtr y, utilities_FortranMatrix* xy ) { mv_MultiVectorByMultiVector( x, y, utilities_FortranMatrixGlobalHeight( xy ), utilities_FortranMatrixHeight( xy ), utilities_FortranMatrixWidth( xy ), utilities_FortranMatrixValues( xy ) ); } hypre-2.33.0/src/krylov/HYPRE_lobpcg.h000066400000000000000000000122251477326011500174410ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #ifndef hypre_LOBPCG_SOLVER #define hypre_LOBPCG_SOLVER #include "HYPRE_krylov.h" #include "fortran_matrix.h" #include "multivector.h" #include "interpreter.h" #include "temp_multivector.h" #include "HYPRE_MatvecFunctions.h" #ifdef __cplusplus extern "C" { #endif /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ /** * @defgroup Eigensolvers Eigensolvers * * A basic interface for eigensolvers. These eigensolvers support many of the * matrix/vector storage schemes in hypre. They should be used in conjunction * with the storage-specific interfaces. * * @{ **/ /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ /** * @name EigenSolvers * * @{ **/ /**@}*/ /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ /** * @name LOBPCG Eigensolver * * @{ **/ /** * LOBPCG constructor. */ HYPRE_Int HYPRE_LOBPCGCreate(mv_InterfaceInterpreter *interpreter, HYPRE_MatvecFunctions *mvfunctions, HYPRE_Solver *solver); /** * LOBPCG destructor. */ HYPRE_Int HYPRE_LOBPCGDestroy(HYPRE_Solver solver); /** * (Optional) Set the preconditioner to use. If not called, preconditioning is * not used. **/ HYPRE_Int HYPRE_LOBPCGSetPrecond(HYPRE_Solver solver, HYPRE_PtrToSolverFcn precond, HYPRE_PtrToSolverFcn precond_setup, HYPRE_Solver precond_solver); /** **/ HYPRE_Int HYPRE_LOBPCGGetPrecond(HYPRE_Solver solver, HYPRE_Solver *precond_data_ptr); /** * Set up \e A and the preconditioner (if there is one). **/ HYPRE_Int HYPRE_LOBPCGSetup(HYPRE_Solver solver, HYPRE_Matrix A, HYPRE_Vector b, HYPRE_Vector x); /** * (Optional) Set up \e B. If not called, B = I. **/ HYPRE_Int HYPRE_LOBPCGSetupB(HYPRE_Solver solver, HYPRE_Matrix B, HYPRE_Vector x); /** * (Optional) Set the preconditioning to be applied to Tx = b, not Ax = b. **/ HYPRE_Int HYPRE_LOBPCGSetupT(HYPRE_Solver solver, HYPRE_Matrix T, HYPRE_Vector x); /** * Solve A x = lambda B x, y'x = 0. **/ HYPRE_Int HYPRE_LOBPCGSolve(HYPRE_Solver solver, mv_MultiVectorPtr y, mv_MultiVectorPtr x, HYPRE_Real *lambda ); /** * (Optional) Set the absolute convergence tolerance. **/ HYPRE_Int HYPRE_LOBPCGSetTol(HYPRE_Solver solver, HYPRE_Real tol); /** * (Optional) Set the relative convergence tolerance. **/ HYPRE_Int HYPRE_LOBPCGSetRTol(HYPRE_Solver solver, HYPRE_Real tol); /** * (Optional) Set maximum number of iterations. **/ HYPRE_Int HYPRE_LOBPCGSetMaxIter(HYPRE_Solver solver, HYPRE_Int max_iter); /** * Define which initial guess for inner PCG iterations to use: \e mode = 0: * use zero initial guess, otherwise use RHS. **/ HYPRE_Int HYPRE_LOBPCGSetPrecondUsageMode(HYPRE_Solver solver, HYPRE_Int mode); /** * (Optional) Set the amount of printing to do to the screen. **/ HYPRE_Int HYPRE_LOBPCGSetPrintLevel(HYPRE_Solver solver, HYPRE_Int level); /* Returns the pointer to residual norms matrix (blockSize x 1) */ utilities_FortranMatrix* HYPRE_LOBPCGResidualNorms(HYPRE_Solver solver); /* Returns the pointer to residual norms history matrix (blockSize x maxIter) */ utilities_FortranMatrix* HYPRE_LOBPCGResidualNormsHistory(HYPRE_Solver solver); /* Returns the pointer to eigenvalue history matrix (blockSize x maxIter) */ utilities_FortranMatrix* HYPRE_LOBPCGEigenvaluesHistory(HYPRE_Solver solver); /* Returns the number of iterations performed by LOBPCG */ HYPRE_Int HYPRE_LOBPCGIterations(HYPRE_Solver solver); void hypre_LOBPCGMultiOperatorB(void *data, void *x, void *y); void lobpcg_MultiVectorByMultiVector(mv_MultiVectorPtr x, mv_MultiVectorPtr y, utilities_FortranMatrix *xy); /**@}*/ /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ /**@}*/ #ifdef __cplusplus } #endif #endif hypre-2.33.0/src/krylov/HYPRE_pcg.c000066400000000000000000000323631477326011500167440ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * HYPRE_PCG interface * *****************************************************************************/ #include "krylov.h" /*-------------------------------------------------------------------------- * HYPRE_PCGCreate: Call class-specific function, e.g. HYPRE_ParCSRPCGCreate *--------------------------------------------------------------------------*/ /*-------------------------------------------------------------------------- * HYPRE_PCGDestroy: Call class-specific function *--------------------------------------------------------------------------*/ /*-------------------------------------------------------------------------- * HYPRE_PCGSetup *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_PCGSetup( HYPRE_Solver solver, HYPRE_Matrix A, HYPRE_Vector b, HYPRE_Vector x ) { return ( hypre_PCGSetup( solver, A, b, x ) ); } /*-------------------------------------------------------------------------- * HYPRE_PCGSolve *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_PCGSolve( HYPRE_Solver solver, HYPRE_Matrix A, HYPRE_Vector b, HYPRE_Vector x ) { return ( hypre_PCGSolve( solver, A, b, x ) ); } /*-------------------------------------------------------------------------- * HYPRE_PCGSetTol, HYPRE_PCGGetTol *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_PCGSetTol( HYPRE_Solver solver, HYPRE_Real tol ) { return ( hypre_PCGSetTol( (void *) solver, tol ) ); } HYPRE_Int HYPRE_PCGGetTol( HYPRE_Solver solver, HYPRE_Real *tol ) { return ( hypre_PCGGetTol( (void *) solver, tol ) ); } /*-------------------------------------------------------------------------- * HYPRE_PCGSetAbsoluteTol, HYPRE_PCGGetAbsoluteTol *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_PCGSetAbsoluteTol( HYPRE_Solver solver, HYPRE_Real a_tol ) { return ( hypre_PCGSetAbsoluteTol( (void *) solver, a_tol ) ); } HYPRE_Int HYPRE_PCGGetAbsoluteTol( HYPRE_Solver solver, HYPRE_Real *a_tol ) { return ( hypre_PCGGetAbsoluteTol( (void *) solver, a_tol ) ); } /*-------------------------------------------------------------------------- * HYPRE_PCGSetResidualTol, HYPRE_PCGGetResidualTol *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_PCGSetResidualTol( HYPRE_Solver solver, HYPRE_Real rtol ) { return ( hypre_PCGSetResidualTol( (void *) solver, rtol ) ); } HYPRE_Int HYPRE_PCGGetResidualTol( HYPRE_Solver solver, HYPRE_Real *rtol ) { return ( hypre_PCGGetResidualTol( (void *) solver, rtol ) ); } /*-------------------------------------------------------------------------- * HYPRE_PCGSetAbsoluteTolFactor, HYPRE_PCGGetAbsoluteTolFactor *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_PCGSetAbsoluteTolFactor( HYPRE_Solver solver, HYPRE_Real abstolf ) { return ( hypre_PCGSetAbsoluteTolFactor( (void *) solver, abstolf ) ); } HYPRE_Int HYPRE_PCGGetAbsoluteTolFactor( HYPRE_Solver solver, HYPRE_Real *abstolf ) { return ( hypre_PCGGetAbsoluteTolFactor( (void *) solver, abstolf ) ); } /*-------------------------------------------------------------------------- * HYPRE_PCGSetConvergenceFactorTol, HYPRE_PCGGetConvergenceFactorTol *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_PCGSetConvergenceFactorTol( HYPRE_Solver solver, HYPRE_Real cf_tol ) { return hypre_PCGSetConvergenceFactorTol( (void *) solver, cf_tol ); } HYPRE_Int HYPRE_PCGGetConvergenceFactorTol( HYPRE_Solver solver, HYPRE_Real *cf_tol ) { return hypre_PCGGetConvergenceFactorTol( (void *) solver, cf_tol ); } /*-------------------------------------------------------------------------- * HYPRE_PCGSetMaxIter, HYPRE_PCGGetMaxIter *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_PCGSetMaxIter( HYPRE_Solver solver, HYPRE_Int max_iter ) { return ( hypre_PCGSetMaxIter( (void *) solver, max_iter ) ); } HYPRE_Int HYPRE_PCGGetMaxIter( HYPRE_Solver solver, HYPRE_Int *max_iter ) { return ( hypre_PCGGetMaxIter( (void *) solver, max_iter ) ); } /*-------------------------------------------------------------------------- * HYPRE_PCGSetStopCrit, HYPRE_PCGGetStopCrit *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_PCGSetStopCrit( HYPRE_Solver solver, HYPRE_Int stop_crit ) { return ( hypre_PCGSetStopCrit( (void *) solver, stop_crit ) ); } HYPRE_Int HYPRE_PCGGetStopCrit( HYPRE_Solver solver, HYPRE_Int *stop_crit ) { return ( hypre_PCGGetStopCrit( (void *) solver, stop_crit ) ); } /*-------------------------------------------------------------------------- * HYPRE_PCGSetTwoNorm, HYPRE_PCGGetTwoNorm *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_PCGSetTwoNorm( HYPRE_Solver solver, HYPRE_Int two_norm ) { return ( hypre_PCGSetTwoNorm( (void *) solver, two_norm ) ); } HYPRE_Int HYPRE_PCGGetTwoNorm( HYPRE_Solver solver, HYPRE_Int *two_norm ) { return ( hypre_PCGGetTwoNorm( (void *) solver, two_norm ) ); } /*-------------------------------------------------------------------------- * HYPRE_PCGSetRelChange, HYPRE_PCGGetRelChange *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_PCGSetRelChange( HYPRE_Solver solver, HYPRE_Int rel_change ) { return ( hypre_PCGSetRelChange( (void *) solver, rel_change ) ); } HYPRE_Int HYPRE_PCGGetRelChange( HYPRE_Solver solver, HYPRE_Int *rel_change ) { return ( hypre_PCGGetRelChange( (void *) solver, rel_change ) ); } /*-------------------------------------------------------------------------- * HYPRE_PCGSetRecomputeResidual, HYPRE_PCGGetRecomputeResidual *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_PCGSetRecomputeResidual( HYPRE_Solver solver, HYPRE_Int recompute_residual ) { return ( hypre_PCGSetRecomputeResidual( (void *) solver, recompute_residual ) ); } HYPRE_Int HYPRE_PCGGetRecomputeResidual( HYPRE_Solver solver, HYPRE_Int *recompute_residual ) { return ( hypre_PCGGetRecomputeResidual( (void *) solver, recompute_residual ) ); } /*-------------------------------------------------------------------------- * HYPRE_PCGSetRecomputeResidualP, HYPRE_PCGGetRecomputeResidualP *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_PCGSetRecomputeResidualP( HYPRE_Solver solver, HYPRE_Int recompute_residual_p ) { return ( hypre_PCGSetRecomputeResidualP( (void *) solver, recompute_residual_p ) ); } HYPRE_Int HYPRE_PCGGetRecomputeResidualP( HYPRE_Solver solver, HYPRE_Int *recompute_residual_p ) { return ( hypre_PCGGetRecomputeResidualP( (void *) solver, recompute_residual_p ) ); } /*-------------------------------------------------------------------------- * HYPRE_PCGSetSkipBreak, HYPRE_PCGGetSkipBreak *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_PCGSetSkipBreak( HYPRE_Solver solver, HYPRE_Int skip_break ) { return ( hypre_PCGSetSkipBreak( (void *) solver, skip_break ) ); } HYPRE_Int HYPRE_PCGGetSkipBreak( HYPRE_Solver solver, HYPRE_Int *skip_break ) { return ( hypre_PCGGetSkipBreak( (void *) solver, skip_break ) ); } /*-------------------------------------------------------------------------- * HYPRE_PCGSetFlex, HYPRE_PCGGetFlex *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_PCGSetFlex( HYPRE_Solver solver, HYPRE_Int flex ) { return ( hypre_PCGSetFlex( (void *) solver, flex ) ); } HYPRE_Int HYPRE_PCGGetFlex( HYPRE_Solver solver, HYPRE_Int *flex ) { return ( hypre_PCGGetFlex( (void *) solver, flex ) ); } /*-------------------------------------------------------------------------- * HYPRE_PCGSetPrecond *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_PCGSetPrecond( HYPRE_Solver solver, HYPRE_PtrToSolverFcn precond, HYPRE_PtrToSolverFcn precond_setup, HYPRE_Solver precond_solver ) { return ( hypre_PCGSetPrecond( (void *) solver, (HYPRE_Int (*)(void*, void*, void*, void*))precond, (HYPRE_Int (*)(void*, void*, void*, void*))precond_setup, (void *) precond_solver ) ); } /*-------------------------------------------------------------------------- * HYPRE_PCGSetPreconditioner *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_PCGSetPreconditioner( HYPRE_Solver solver, HYPRE_Solver precond_solver ) { return ( hypre_PCGSetPreconditioner( (void *) solver, (void *) precond_solver ) ); } /*-------------------------------------------------------------------------- * HYPRE_PCGGetPrecond *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_PCGGetPrecond( HYPRE_Solver solver, HYPRE_Solver *precond_data_ptr ) { return ( hypre_PCGGetPrecond( (void *) solver, (HYPRE_Solver *) precond_data_ptr ) ); } /*-------------------------------------------------------------------------- * HYPRE_PCGSetLogging, HYPRE_PCGGetLogging * SetLogging sets both the print and log level, for backwards compatibility. * Soon the SetPrintLevel call should be deleted. *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_PCGSetLogging( HYPRE_Solver solver, HYPRE_Int level ) { return ( hypre_PCGSetLogging( (void *) solver, level ) ); } HYPRE_Int HYPRE_PCGGetLogging( HYPRE_Solver solver, HYPRE_Int * level ) { return ( hypre_PCGGetLogging( (void *) solver, level ) ); } /*-------------------------------------------------------------------------- * HYPRE_PCGSetPrintLevel, HYPRE_PCGGetPrintLevel *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_PCGSetPrintLevel( HYPRE_Solver solver, HYPRE_Int level ) { return ( hypre_PCGSetPrintLevel( (void *) solver, level ) ); } HYPRE_Int HYPRE_PCGGetPrintLevel( HYPRE_Solver solver, HYPRE_Int *level ) { return ( hypre_PCGGetPrintLevel( (void *) solver, level ) ); } /*-------------------------------------------------------------------------- * HYPRE_PCGGetNumIterations *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_PCGGetNumIterations( HYPRE_Solver solver, HYPRE_Int *num_iterations ) { return ( hypre_PCGGetNumIterations( (void *) solver, num_iterations ) ); } /*-------------------------------------------------------------------------- * HYPRE_PCGGetConverged *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_PCGGetConverged( HYPRE_Solver solver, HYPRE_Int *converged ) { return ( hypre_PCGGetConverged( (void *) solver, converged ) ); } /*-------------------------------------------------------------------------- * HYPRE_PCGGetFinalRelativeResidualNorm *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_PCGGetFinalRelativeResidualNorm( HYPRE_Solver solver, HYPRE_Real *norm ) { return ( hypre_PCGGetFinalRelativeResidualNorm( (void *) solver, norm ) ); } /*-------------------------------------------------------------------------- * HYPRE_PCGGetResidual *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_PCGGetResidual( HYPRE_Solver solver, void *residual ) { /* returns a pointer to the residual vector */ return hypre_PCGGetResidual( (void *) solver, (void **) residual ); } hypre-2.33.0/src/krylov/Makefile000066400000000000000000000037441477326011500165210ustar00rootroot00000000000000# Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) include ../config/Makefile.config CINCLUDES = ${INCLUDES} ${MPIINCLUDE} C_COMPILE_FLAGS = \ -I..\ -I$(srcdir)/..\ -I$(srcdir)/../blas\ -I$(srcdir)/../lapack\ -I$(srcdir)/../multivector\ -I$(srcdir)/../utilities\ ${CINCLUDES} HEADERS =\ HYPRE_krylov.h\ krylov.h\ bicgstab.h\ cgnr.h\ gmres.h\ cogmres.h\ flexgmres.h\ lgmres.h\ pcg.h\ HYPRE_lobpcg.h\ HYPRE_MatvecFunctions.h\ lobpcg.h FILES =\ bicgstab.c\ cgnr.c\ gmres.c\ cogmres.c\ flexgmres.c\ lgmres.c\ HYPRE_bicgstab.c\ HYPRE_cgnr.c\ HYPRE_gmres.c\ HYPRE_cogmres.c\ HYPRE_lgmres.c\ HYPRE_flexgmres.c\ HYPRE_pcg.c\ pcg.c\ HYPRE_lobpcg.c\ lobpcg.c OBJS = ${FILES:.c=.o} SONAME = libHYPRE_krylov-${HYPRE_RELEASE_VERSION}${HYPRE_LIB_SUFFIX} ################################################################## # Targets ################################################################## all: libHYPRE_krylov${HYPRE_LIB_SUFFIX} cp -fR $(srcdir)/HYPRE_*.h $(HYPRE_BUILD_DIR)/include cp -fR $(srcdir)/krylov.h $(HYPRE_BUILD_DIR)/include cp -fR $(srcdir)/lobpcg.h $(HYPRE_BUILD_DIR)/include # cp -fR libHYPRE* $(HYPRE_BUILD_DIR)/lib install: all cp -fR $(srcdir)/HYPRE_*.h $(HYPRE_INC_INSTALL) cp -fR $(srcdir)/krylov.h $(HYPRE_INC_INSTALL) cp -fR $(srcdir)/lobpcg.h $(HYPRE_INC_INSTALL) # cp -fR libHYPRE* $(HYPRE_LIB_INSTALL) clean: rm -f *.o libHYPRE* rm -rf pchdir tca.map *inslog* distclean: clean ################################################################## # Rules ################################################################## libHYPRE_krylov.a: ${OBJS} @echo "Building $@ ... " ${AR} $@ ${OBJS} ${RANLIB} $@ libHYPRE_krylov.so libHYPRE_krylov.dylib: ${OBJS} @echo "Building $@ ... " ${BUILD_CC_SHARED} -o ${SONAME} ${OBJS} ${SHARED_SET_SONAME}${SONAME} ln -s -f ${SONAME} $@ ${OBJS}: ${HEADERS} hypre-2.33.0/src/krylov/bicgstab.c000066400000000000000000000662141477326011500170040ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * BiCGSTAB bicgstab * *****************************************************************************/ #include "krylov.h" #include "_hypre_utilities.h" /*-------------------------------------------------------------------------- * hypre_BiCGSTABFunctionsCreate *--------------------------------------------------------------------------*/ hypre_BiCGSTABFunctions * hypre_BiCGSTABFunctionsCreate( void * (*CreateVector) ( void *vvector ), HYPRE_Int (*DestroyVector) ( void *vvector ), void * (*MatvecCreate) ( void *A, void *x ), HYPRE_Int (*Matvec) ( void *matvec_data, HYPRE_Complex alpha, void *A, void *x, HYPRE_Complex beta, void *y ), HYPRE_Int (*MatvecDestroy) ( void *matvec_data ), HYPRE_Real (*InnerProd) ( void *x, void *y ), HYPRE_Int (*CopyVector) ( void *x, void *y ), HYPRE_Int (*ClearVector) ( void *x ), HYPRE_Int (*ScaleVector) ( HYPRE_Complex alpha, void *x ), HYPRE_Int (*Axpy) ( HYPRE_Complex alpha, void *x, void *y ), HYPRE_Int (*CommInfo) ( void *A, HYPRE_Int *my_id, HYPRE_Int *num_procs ), HYPRE_Int (*PrecondSetup) ( void *vdata, void *A, void *b, void *x ), HYPRE_Int (*Precond) ( void *vdata, void *A, void *b, void *x ) ) { hypre_BiCGSTABFunctions * bicgstab_functions; bicgstab_functions = (hypre_BiCGSTABFunctions *) hypre_CTAlloc( hypre_BiCGSTABFunctions, 1, HYPRE_MEMORY_HOST); bicgstab_functions->CreateVector = CreateVector; bicgstab_functions->DestroyVector = DestroyVector; bicgstab_functions->MatvecCreate = MatvecCreate; bicgstab_functions->Matvec = Matvec; bicgstab_functions->MatvecDestroy = MatvecDestroy; bicgstab_functions->InnerProd = InnerProd; bicgstab_functions->CopyVector = CopyVector; bicgstab_functions->ClearVector = ClearVector; bicgstab_functions->ScaleVector = ScaleVector; bicgstab_functions->Axpy = Axpy; bicgstab_functions->CommInfo = CommInfo; bicgstab_functions->precond_setup = PrecondSetup; bicgstab_functions->precond = Precond; return bicgstab_functions; } /*-------------------------------------------------------------------------- * hypre_BiCGSTABCreate *--------------------------------------------------------------------------*/ void * hypre_BiCGSTABCreate( hypre_BiCGSTABFunctions * bicgstab_functions ) { hypre_BiCGSTABData *bicgstab_data; HYPRE_ANNOTATE_FUNC_BEGIN; bicgstab_data = hypre_CTAlloc( hypre_BiCGSTABData, 1, HYPRE_MEMORY_HOST); bicgstab_data->functions = bicgstab_functions; /* set defaults */ (bicgstab_data -> tol) = 1.0e-06; (bicgstab_data -> min_iter) = 0; (bicgstab_data -> max_iter) = 1000; (bicgstab_data -> stop_crit) = 0; /* rel. residual norm */ (bicgstab_data -> a_tol) = 0.0; (bicgstab_data -> precond_data) = NULL; (bicgstab_data -> logging) = 0; (bicgstab_data -> print_level) = 0; (bicgstab_data -> hybrid) = 0; (bicgstab_data -> p) = NULL; (bicgstab_data -> q) = NULL; (bicgstab_data -> r) = NULL; (bicgstab_data -> r0) = NULL; (bicgstab_data -> s) = NULL; (bicgstab_data -> v) = NULL; (bicgstab_data -> matvec_data) = NULL; (bicgstab_data -> norms) = NULL; (bicgstab_data -> log_file_name) = NULL; HYPRE_ANNOTATE_FUNC_END; return (void *) bicgstab_data; } /*-------------------------------------------------------------------------- * hypre_BiCGSTABDestroy *--------------------------------------------------------------------------*/ HYPRE_Int hypre_BiCGSTABDestroy( void *bicgstab_vdata ) { hypre_BiCGSTABData *bicgstab_data = (hypre_BiCGSTABData *)bicgstab_vdata; HYPRE_ANNOTATE_FUNC_BEGIN; if (bicgstab_data) { hypre_BiCGSTABFunctions *bicgstab_functions = bicgstab_data->functions; if ( (bicgstab_data -> norms) != NULL ) { hypre_TFree(bicgstab_data -> norms, HYPRE_MEMORY_HOST); } (*(bicgstab_functions->MatvecDestroy))(bicgstab_data -> matvec_data); (*(bicgstab_functions->DestroyVector))(bicgstab_data -> r); (*(bicgstab_functions->DestroyVector))(bicgstab_data -> r0); (*(bicgstab_functions->DestroyVector))(bicgstab_data -> s); (*(bicgstab_functions->DestroyVector))(bicgstab_data -> v); (*(bicgstab_functions->DestroyVector))(bicgstab_data -> p); (*(bicgstab_functions->DestroyVector))(bicgstab_data -> q); hypre_TFree(bicgstab_data, HYPRE_MEMORY_HOST); hypre_TFree(bicgstab_functions, HYPRE_MEMORY_HOST); } HYPRE_ANNOTATE_FUNC_END; return (hypre_error_flag); } /*-------------------------------------------------------------------------- * hypre_BiCGSTABSetup *--------------------------------------------------------------------------*/ HYPRE_Int hypre_BiCGSTABSetup( void *bicgstab_vdata, void *A, void *b, void *x ) { hypre_BiCGSTABData *bicgstab_data = (hypre_BiCGSTABData *)bicgstab_vdata; hypre_BiCGSTABFunctions *bicgstab_functions = bicgstab_data->functions; HYPRE_Int max_iter = (bicgstab_data -> max_iter); HYPRE_Int (*precond_setup)(void*, void*, void*, void*) = (bicgstab_functions -> precond_setup); void *precond_data = (bicgstab_data -> precond_data); HYPRE_ANNOTATE_FUNC_BEGIN; (bicgstab_data -> A) = A; /*-------------------------------------------------- * The arguments for NewVector are important to * maintain consistency between the setup and * compute phases of matvec and the preconditioner. *--------------------------------------------------*/ if ((bicgstab_data -> p) == NULL) { (bicgstab_data -> p) = (*(bicgstab_functions->CreateVector))(b); } if ((bicgstab_data -> q) == NULL) { (bicgstab_data -> q) = (*(bicgstab_functions->CreateVector))(b); } if ((bicgstab_data -> r) == NULL) { (bicgstab_data -> r) = (*(bicgstab_functions->CreateVector))(b); } if ((bicgstab_data -> r0) == NULL) { (bicgstab_data -> r0) = (*(bicgstab_functions->CreateVector))(b); } if ((bicgstab_data -> s) == NULL) { (bicgstab_data -> s) = (*(bicgstab_functions->CreateVector))(b); } if ((bicgstab_data -> v) == NULL) { (bicgstab_data -> v) = (*(bicgstab_functions->CreateVector))(b); } if ((bicgstab_data -> matvec_data) == NULL) (bicgstab_data -> matvec_data) = (*(bicgstab_functions->MatvecCreate))(A, x); precond_setup(precond_data, A, b, x); /*----------------------------------------------------- * Allocate space for log info *-----------------------------------------------------*/ if ((bicgstab_data->logging) > 0 || (bicgstab_data->print_level) > 0) { if ((bicgstab_data -> norms) != NULL) { hypre_TFree (bicgstab_data -> norms, HYPRE_MEMORY_HOST); } (bicgstab_data -> norms) = hypre_CTAlloc(HYPRE_Real, max_iter + 1, HYPRE_MEMORY_HOST); } if ((bicgstab_data -> print_level) > 0) { if ((bicgstab_data -> log_file_name) == NULL) { (bicgstab_data -> log_file_name) = (char*)"bicgstab.out.log"; } } HYPRE_ANNOTATE_FUNC_END; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_BiCGSTABSolve *-------------------------------------------------------------------------*/ HYPRE_Int hypre_BiCGSTABSolve(void *bicgstab_vdata, void *A, void *b, void *x) { hypre_BiCGSTABData *bicgstab_data = (hypre_BiCGSTABData*)bicgstab_vdata; hypre_BiCGSTABFunctions *bicgstab_functions = bicgstab_data->functions; HYPRE_Int min_iter = (bicgstab_data -> min_iter); HYPRE_Int max_iter = (bicgstab_data -> max_iter); HYPRE_Int stop_crit = (bicgstab_data -> stop_crit); HYPRE_Int hybrid = (bicgstab_data -> hybrid); HYPRE_Real r_tol = (bicgstab_data -> tol); HYPRE_Real cf_tol = (bicgstab_data -> cf_tol); void *matvec_data = (bicgstab_data -> matvec_data); HYPRE_Real a_tol = (bicgstab_data -> a_tol); void *r = (bicgstab_data -> r); void *r0 = (bicgstab_data -> r0); void *s = (bicgstab_data -> s); void *v = (bicgstab_data -> v); void *p = (bicgstab_data -> p); void *q = (bicgstab_data -> q); HYPRE_Int (*precond)(void*, void*, void*, void*) = (bicgstab_functions -> precond); HYPRE_Int *precond_data = (HYPRE_Int*)(bicgstab_data -> precond_data); /* logging variables */ HYPRE_Int logging = (bicgstab_data -> logging); HYPRE_Int print_level = (bicgstab_data -> print_level); HYPRE_Real *norms = (bicgstab_data -> norms); /* char *log_file_name = (bicgstab_data -> log_file_name); FILE *fp; */ HYPRE_Int iter; HYPRE_Int my_id, num_procs; HYPRE_Real alpha, beta, gamma, epsilon, temp, res, r_norm, b_norm; HYPRE_Real epsmac = HYPRE_REAL_MIN; HYPRE_Real ieee_check = 0.; HYPRE_Real cf_ave_0 = 0.0; HYPRE_Real cf_ave_1 = 0.0; HYPRE_Real weight; HYPRE_Real r_norm_0; HYPRE_Real den_norm; HYPRE_Real gamma_numer; HYPRE_Real gamma_denom; HYPRE_ANNOTATE_FUNC_BEGIN; (bicgstab_data -> converged) = 0; (*(bicgstab_functions->CommInfo))(A, &my_id, &num_procs); if (logging > 0 || print_level > 0) { norms = (bicgstab_data -> norms); /* log_file_name = (bicgstab_data -> log_file_name); fp = fopen(log_file_name,"w"); */ } /* initialize work arrays */ (*(bicgstab_functions->CopyVector))(b, r0); /* compute initial residual */ (*(bicgstab_functions->Matvec))(matvec_data, -1.0, A, x, 1.0, r0); (*(bicgstab_functions->CopyVector))(r0, r); (*(bicgstab_functions->CopyVector))(r0, p); b_norm = hypre_sqrt((*(bicgstab_functions->InnerProd))(b, b)); /* Since it does not diminish performance, attempt to return an error flag and notify users when they supply bad input. */ if (b_norm != 0.) { ieee_check = b_norm / b_norm; } /* INF -> NaN conversion */ if (ieee_check != ieee_check) { /* ...INFs or NaNs in input can make ieee_check a NaN. This test for ieee_check self-equality works on all IEEE-compliant compilers/ machines, c.f. page 8 of "Lecture Notes on the Status of IEEE 754" by W. Kahan, May 31, 1996. Currently (July 2002) this paper may be found at http://HTTP.CS.Berkeley.EDU/~wkahan/ieee754status/IEEE754.PDF */ if (logging > 0 || print_level > 0) { hypre_printf("\n\nERROR detected by Hypre ... BEGIN\n"); hypre_printf("ERROR -- hypre_BiCGSTABSolve: INFs and/or NaNs detected in input.\n"); hypre_printf("User probably placed non-numerics in supplied b.\n"); hypre_printf("Returning error flag += 101. Program not terminated.\n"); hypre_printf("ERROR detected by Hypre ... END\n\n\n"); } hypre_error(HYPRE_ERROR_GENERIC); HYPRE_ANNOTATE_FUNC_END; return hypre_error_flag; } res = (*(bicgstab_functions->InnerProd))(r0, r0); r_norm = hypre_sqrt(res); r_norm_0 = r_norm; /* Since it does not diminish performance, attempt to return an error flag and notify users when they supply bad input. */ if (r_norm != 0.) { ieee_check = r_norm / r_norm; } /* INF -> NaN conversion */ if (ieee_check != ieee_check) { /* ...INFs or NaNs in input can make ieee_check a NaN. This test for ieee_check self-equality works on all IEEE-compliant compilers/ machines, c.f. page 8 of "Lecture Notes on the Status of IEEE 754" by W. Kahan, May 31, 1996. Currently (July 2002) this paper may be found at http://HTTP.CS.Berkeley.EDU/~wkahan/ieee754status/IEEE754.PDF */ if (logging > 0 || print_level > 0) { hypre_printf("\n\nERROR detected by Hypre ... BEGIN\n"); hypre_printf("ERROR -- hypre_BiCGSTABSolve: INFs and/or NaNs detected in input.\n"); hypre_printf("User probably placed non-numerics in supplied A or x_0.\n"); hypre_printf("Returning error flag += 101. Program not terminated.\n"); hypre_printf("ERROR detected by Hypre ... END\n\n\n"); } hypre_error(HYPRE_ERROR_GENERIC); HYPRE_ANNOTATE_FUNC_END; return hypre_error_flag; } if (logging > 0 || print_level > 0) { norms[0] = r_norm; if (print_level > 0 && my_id == 0) { hypre_printf("L2 norm of b: %e\n", b_norm); if (b_norm == 0.0) { hypre_printf("Rel_resid_norm actually contains the residual norm\n"); } hypre_printf("Initial L2 norm of residual: %e\n", r_norm); } } iter = 0; if (b_norm > 0.0) { /* convergence criterion |r_i| <= r_tol*|b| if |b| > 0 */ den_norm = b_norm; } else { /* convergence criterion |r_i| <= r_tol*|r0| if |b| = 0 */ den_norm = r_norm; }; /* convergence criterion |r_i| <= r_tol/a_tol , absolute residual norm*/ if (stop_crit) { if (a_tol == 0.0) /* this is for backwards compatibility (accomodating setting stop_crit to 1, but not setting a_tol) - eventually we will get rid of the stop_crit flag as with GMRES */ { epsilon = r_tol; } else { epsilon = a_tol; /* this means new interface fcn called */ } } else /* default convergence test (stop_crit = 0)*/ { /* convergence criteria: |r_i| <= max( a_tol, r_tol * den_norm) den_norm = |r_0| or |b| note: default for a_tol is 0.0, so relative residual criteria is used unless user also specifies a_tol or sets r_tol = 0.0, which means absolute tol only is checked */ epsilon = hypre_max(a_tol, r_tol * den_norm); } if (print_level > 0 && my_id == 0) { if (b_norm > 0.0) { hypre_printf("=============================================\n\n"); hypre_printf("Iters resid.norm conv.rate rel.res.norm\n"); hypre_printf("----- ------------ ---------- ------------\n"); } else { hypre_printf("=============================================\n\n"); hypre_printf("Iters resid.norm conv.rate\n"); hypre_printf("----- ------------ ----------\n"); } } (bicgstab_data -> num_iterations) = iter; if (b_norm > 0.0) { (bicgstab_data -> rel_residual_norm) = r_norm / b_norm; } /* check for convergence before starting */ if (r_norm == 0.0) { HYPRE_ANNOTATE_FUNC_END; return hypre_error_flag; } else if (r_norm <= epsilon && iter >= min_iter) { if (print_level > 0 && my_id == 0) { hypre_printf("\n\n"); hypre_printf("Tolerance and min_iter requirements satisfied by initial data.\n"); hypre_printf("Final L2 norm of residual: %e\n\n", r_norm); } (bicgstab_data -> converged) = 1; HYPRE_ANNOTATE_FUNC_END; return hypre_error_flag; } /* Start BiCGStab iterations */ while (iter < max_iter) { iter++; (*(bicgstab_functions->ClearVector))(v); precond(precond_data, A, p, v); (*(bicgstab_functions->Matvec))(matvec_data, 1.0, A, v, 0.0, q); temp = (*(bicgstab_functions->InnerProd))(r0, q); if (hypre_abs(temp) >= epsmac) { alpha = res / temp; } else { hypre_error_w_msg(HYPRE_ERROR_GENERIC, "BiCGSTAB broke down!! divide by near zero\n"); HYPRE_ANNOTATE_FUNC_END; return hypre_error_flag; } (*(bicgstab_functions->Axpy))(alpha, v, x); (*(bicgstab_functions->Axpy))(-alpha, q, r); (*(bicgstab_functions->ClearVector))(v); precond(precond_data, A, r, v); (*(bicgstab_functions->Matvec))(matvec_data, 1.0, A, v, 0.0, s); /* Handle case when gamma = 0.0/0.0 as 0.0 and not NAN */ gamma_numer = (*(bicgstab_functions->InnerProd))(r, s); gamma_denom = (*(bicgstab_functions->InnerProd))(s, s); if ((gamma_numer == 0.0) && (gamma_denom == 0.0)) { gamma = 0.0; } else { gamma = gamma_numer / gamma_denom; } (*(bicgstab_functions->Axpy))(gamma, v, x); (*(bicgstab_functions->Axpy))(-gamma, s, r); /* residual is now updated, must immediately check for convergence */ r_norm = hypre_sqrt((*(bicgstab_functions->InnerProd))(r, r)); if (logging > 0 || print_level > 0) { norms[iter] = r_norm; } if (print_level > 0 && my_id == 0) { if (b_norm > 0.0) hypre_printf("% 5d %e %f %e\n", iter, norms[iter], norms[iter] / norms[iter - 1], norms[iter] / b_norm); else hypre_printf("% 5d %e %f\n", iter, norms[iter], norms[iter] / norms[iter - 1]); } /* check for convergence, evaluate actual residual */ if (r_norm <= epsilon && iter >= min_iter) { (*(bicgstab_functions->CopyVector))(b, r); (*(bicgstab_functions->Matvec))(matvec_data, -1.0, A, x, 1.0, r); r_norm = hypre_sqrt((*(bicgstab_functions->InnerProd))(r, r)); if (r_norm <= epsilon) { if (print_level > 0 && my_id == 0) { hypre_printf("\n\n"); hypre_printf("Final L2 norm of residual: %e\n\n", r_norm); } (bicgstab_data -> converged) = 1; break; } } /*-------------------------------------------------------------------- * Optional test to see if adequate progress is being made. * The average convergence factor is recorded and compared * against the tolerance 'cf_tol'. The weighting factor is * intended to pay more attention to the test when an accurate * estimate for average convergence factor is available. *--------------------------------------------------------------------*/ if (cf_tol > 0.0) { cf_ave_0 = cf_ave_1; cf_ave_1 = hypre_pow( r_norm / r_norm_0, 1.0 / (2.0 * iter)); weight = hypre_abs(cf_ave_1 - cf_ave_0); weight = weight / hypre_max(cf_ave_1, cf_ave_0); weight = 1.0 - weight; if (weight * cf_ave_1 > cf_tol) { break; } } if (hypre_abs(res) >= epsmac) { beta = 1.0 / res; } else { hypre_error_w_msg(HYPRE_ERROR_GENERIC, "BiCGSTAB broke down!! res=0 \n"); HYPRE_ANNOTATE_FUNC_END; return hypre_error_flag; } res = (*(bicgstab_functions->InnerProd))(r0, r); beta *= res; (*(bicgstab_functions->Axpy))(-gamma, q, p); if (hypre_abs(gamma) >= epsmac) { (*(bicgstab_functions->ScaleVector))((beta * alpha / gamma), p); } else { hypre_error_w_msg(HYPRE_ERROR_GENERIC, "BiCGSTAB broke down!! gamma=0 \n"); HYPRE_ANNOTATE_FUNC_END; return hypre_error_flag; } (*(bicgstab_functions->Axpy))(1.0, r, p); } /* end while loop */ (bicgstab_data -> num_iterations) = iter; if (b_norm > 0.0) { (bicgstab_data -> rel_residual_norm) = r_norm / b_norm; } if (b_norm == 0.0) { (bicgstab_data -> rel_residual_norm) = r_norm; } if (iter >= max_iter && r_norm > epsilon && epsilon > 0 && hybrid != -1) { hypre_error(HYPRE_ERROR_CONV); } HYPRE_ANNOTATE_FUNC_END; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_BiCGSTABSetTol *--------------------------------------------------------------------------*/ HYPRE_Int hypre_BiCGSTABSetTol( void *bicgstab_vdata, HYPRE_Real tol ) { hypre_BiCGSTABData *bicgstab_data = (hypre_BiCGSTABData *)bicgstab_vdata; (bicgstab_data -> tol) = tol; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_BiCGSTABSetAbsoluteTol *--------------------------------------------------------------------------*/ HYPRE_Int hypre_BiCGSTABSetAbsoluteTol( void *bicgstab_vdata, HYPRE_Real a_tol ) { hypre_BiCGSTABData *bicgstab_data = (hypre_BiCGSTABData *)bicgstab_vdata; (bicgstab_data -> a_tol) = a_tol; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_BiCGSTABSetConvergenceFactorTol *--------------------------------------------------------------------------*/ HYPRE_Int hypre_BiCGSTABSetConvergenceFactorTol( void *bicgstab_vdata, HYPRE_Real cf_tol ) { hypre_BiCGSTABData *bicgstab_data = (hypre_BiCGSTABData *)bicgstab_vdata; (bicgstab_data -> cf_tol) = cf_tol; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_BiCGSTABSetMinIter *--------------------------------------------------------------------------*/ HYPRE_Int hypre_BiCGSTABSetMinIter( void *bicgstab_vdata, HYPRE_Int min_iter ) { hypre_BiCGSTABData *bicgstab_data = (hypre_BiCGSTABData *)bicgstab_vdata; (bicgstab_data -> min_iter) = min_iter; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_BiCGSTABSetMaxIter *--------------------------------------------------------------------------*/ HYPRE_Int hypre_BiCGSTABSetMaxIter( void *bicgstab_vdata, HYPRE_Int max_iter ) { hypre_BiCGSTABData *bicgstab_data = (hypre_BiCGSTABData *)bicgstab_vdata; (bicgstab_data -> max_iter) = max_iter; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_BiCGSTABSetStopCrit *--------------------------------------------------------------------------*/ HYPRE_Int hypre_BiCGSTABSetStopCrit( void *bicgstab_vdata, HYPRE_Int stop_crit ) { hypre_BiCGSTABData *bicgstab_data = (hypre_BiCGSTABData *)bicgstab_vdata; (bicgstab_data -> stop_crit) = stop_crit; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_BiCGSTABSetPrecond *--------------------------------------------------------------------------*/ HYPRE_Int hypre_BiCGSTABSetPrecond( void *bicgstab_vdata, HYPRE_Int (*precond)(void*, void*, void*, void*), HYPRE_Int (*precond_setup)(void*, void*, void*, void*), void *precond_data ) { hypre_BiCGSTABData *bicgstab_data = (hypre_BiCGSTABData *)bicgstab_vdata; hypre_BiCGSTABFunctions *bicgstab_functions = bicgstab_data->functions; (bicgstab_functions -> precond) = precond; (bicgstab_functions -> precond_setup) = precond_setup; (bicgstab_data -> precond_data) = precond_data; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_BiCGSTABGetPrecond *--------------------------------------------------------------------------*/ HYPRE_Int hypre_BiCGSTABGetPrecond( void *bicgstab_vdata, HYPRE_Solver *precond_data_ptr ) { hypre_BiCGSTABData *bicgstab_data = (hypre_BiCGSTABData *)bicgstab_vdata; *precond_data_ptr = (HYPRE_Solver)(bicgstab_data -> precond_data); return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_BiCGSTABSetLogging *--------------------------------------------------------------------------*/ HYPRE_Int hypre_BiCGSTABSetLogging( void *bicgstab_vdata, HYPRE_Int logging) { hypre_BiCGSTABData *bicgstab_data = (hypre_BiCGSTABData *)bicgstab_vdata; (bicgstab_data -> logging) = logging; return hypre_error_flag; } HYPRE_Int hypre_BiCGSTABSetHybrid( void *bicgstab_vdata, HYPRE_Int logging) { hypre_BiCGSTABData *bicgstab_data = (hypre_BiCGSTABData *)bicgstab_vdata; (bicgstab_data -> hybrid) = logging; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_BiCGSTABSetPrintLevel *--------------------------------------------------------------------------*/ HYPRE_Int hypre_BiCGSTABSetPrintLevel( void *bicgstab_vdata, HYPRE_Int print_level) { hypre_BiCGSTABData *bicgstab_data = (hypre_BiCGSTABData *)bicgstab_vdata; (bicgstab_data -> print_level) = print_level; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_BiCGSTABGetConverged *--------------------------------------------------------------------------*/ HYPRE_Int hypre_BiCGSTABGetConverged( void *bicgstab_vdata, HYPRE_Int *converged ) { hypre_BiCGSTABData *bicgstab_data = (hypre_BiCGSTABData *)bicgstab_vdata; *converged = (bicgstab_data -> converged); return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_BiCGSTABGetNumIterations *--------------------------------------------------------------------------*/ HYPRE_Int hypre_BiCGSTABGetNumIterations( void *bicgstab_vdata, HYPRE_Int *num_iterations ) { hypre_BiCGSTABData *bicgstab_data = (hypre_BiCGSTABData *)bicgstab_vdata; *num_iterations = (bicgstab_data -> num_iterations); return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_BiCGSTABGetFinalRelativeResidualNorm *--------------------------------------------------------------------------*/ HYPRE_Int hypre_BiCGSTABGetFinalRelativeResidualNorm( void *bicgstab_vdata, HYPRE_Real *relative_residual_norm ) { hypre_BiCGSTABData *bicgstab_data = (hypre_BiCGSTABData *)bicgstab_vdata; *relative_residual_norm = (bicgstab_data -> rel_residual_norm); return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_BiCGSTABGetResidual *--------------------------------------------------------------------------*/ HYPRE_Int hypre_BiCGSTABGetResidual( void *bicgstab_vdata, void **residual ) { hypre_BiCGSTABData *bicgstab_data = (hypre_BiCGSTABData *)bicgstab_vdata; *residual = (bicgstab_data -> r); return hypre_error_flag; } hypre-2.33.0/src/krylov/bicgstab.h000066400000000000000000000133041477326011500170010ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * BiCGSTAB bicgstab * *****************************************************************************/ #ifndef hypre_KRYLOV_BiCGSTAB_HEADER #define hypre_KRYLOV_BiCGSTAB_HEADER /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ /** * @name Generic BiCGSTAB Interface * * A general description of the interface goes here... * * @memo A generic BiCGSTAB linear solver interface * @version 0.1 * @author Jeffrey F. Painter **/ /*@{*/ /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ /*-------------------------------------------------------------------------- * hypre_BiCGSTABData and hypre_BiCGSTABFunctions *--------------------------------------------------------------------------*/ /** * @name BiCGSTAB structs * * Description... **/ /*@{*/ /** * The {\tt hypre\_BiCGSTABSFunctions} object ... **/ /* functions in pcg_struct.c which aren't used here: char *hypre_ParKrylovCAlloc( HYPRE_Int count , HYPRE_Int elt_size ); HYPRE_Int hypre_ParKrylovFree( char *ptr ); void *hypre_ParKrylovCreateVectorArray( HYPRE_Int n , void *vvector ); HYPRE_Int hypre_ParKrylovMatvecT( void *matvec_data , HYPRE_Real alpha , void *A , void *x , HYPRE_Real beta , void *y ); */ /* functions in pcg_struct.c which are used here: void *hypre_ParKrylovCreateVector( void *vvector ); HYPRE_Int hypre_ParKrylovDestroyVector( void *vvector ); void *hypre_ParKrylovMatvecCreate( void *A , void *x ); HYPRE_Int hypre_ParKrylovMatvec( void *matvec_data , HYPRE_Real alpha , void *A , void *x , HYPRE_Real beta , void *y ); HYPRE_Int hypre_ParKrylovMatvecDestroy( void *matvec_data ); HYPRE_Real hypre_ParKrylovInnerProd( void *x , void *y ); HYPRE_Int hypre_ParKrylovCopyVector( void *x , void *y ); HYPRE_Int hypre_ParKrylovClearVector( void *x ); HYPRE_Int hypre_ParKrylovScaleVector( HYPRE_Real alpha , void *x ); HYPRE_Int hypre_ParKrylovAxpy( HYPRE_Real alpha , void *x , void *y ); HYPRE_Int hypre_ParKrylovCommInfo( void *A , HYPRE_Int *my_id , HYPRE_Int *num_procs ); HYPRE_Int hypre_ParKrylovIdentitySetup( void *vdata , void *A , void *b , void *x ); HYPRE_Int hypre_ParKrylovIdentity( void *vdata , void *A , void *b , void *x ); */ typedef struct { void * (*CreateVector) ( void *vvector ); HYPRE_Int (*DestroyVector) ( void *vvector ); void * (*MatvecCreate) ( void *A, void *x ); HYPRE_Int (*Matvec) ( void *matvec_data, HYPRE_Complex alpha, void *A, void *x, HYPRE_Complex beta, void *y ); HYPRE_Int (*MatvecDestroy) ( void *matvec_data ); HYPRE_Real (*InnerProd) ( void *x, void *y ); HYPRE_Int (*CopyVector) ( void *x, void *y ); HYPRE_Int (*ClearVector) ( void *x ); HYPRE_Int (*ScaleVector) ( HYPRE_Complex alpha, void *x ); HYPRE_Int (*Axpy) ( HYPRE_Complex alpha, void *x, void *y ); HYPRE_Int (*CommInfo) ( void *A, HYPRE_Int *my_id, HYPRE_Int *num_procs ); HYPRE_Int (*precond_setup) (void *vdata, void *A, void *b, void *x); HYPRE_Int (*precond) (void *vdata, void *A, void *b, void *x); } hypre_BiCGSTABFunctions; /** * The {\tt hypre\_BiCGSTABData} object ... **/ typedef struct { HYPRE_Int min_iter; HYPRE_Int max_iter; HYPRE_Int stop_crit; HYPRE_Int converged; HYPRE_Int hybrid; HYPRE_Real tol; HYPRE_Real cf_tol; HYPRE_Real rel_residual_norm; HYPRE_Real a_tol; void *A; void *r; void *r0; void *s; void *v; void *p; void *q; void *matvec_data; void *precond_data; hypre_BiCGSTABFunctions * functions; /* log info (always logged) */ HYPRE_Int num_iterations; /* additional log info (logged when `logging' > 0) */ HYPRE_Int logging; HYPRE_Int print_level; HYPRE_Real *norms; char *log_file_name; } hypre_BiCGSTABData; #ifdef __cplusplus extern "C" { #endif /** * @name generic BiCGSTAB Solver * * Description... **/ /*@{*/ /** * Description... * * @param param [IN] ... **/ hypre_BiCGSTABFunctions * hypre_BiCGSTABFunctionsCreate( void * (*CreateVector) ( void *vvector ), HYPRE_Int (*DestroyVector) ( void *vvector ), void * (*MatvecCreate) ( void *A, void *x ), HYPRE_Int (*Matvec) ( void *matvec_data, HYPRE_Complex alpha, void *A, void *x, HYPRE_Complex beta, void *y ), HYPRE_Int (*MatvecDestroy) ( void *matvec_data ), HYPRE_Real (*InnerProd) ( void *x, void *y ), HYPRE_Int (*CopyVector) ( void *x, void *y ), HYPRE_Int (*ClearVector) ( void *x ), HYPRE_Int (*ScaleVector) ( HYPRE_Complex alpha, void *x ), HYPRE_Int (*Axpy) ( HYPRE_Complex alpha, void *x, void *y ), HYPRE_Int (*CommInfo) ( void *A, HYPRE_Int *my_id, HYPRE_Int *num_procs ), HYPRE_Int (*PrecondSetup) (void *vdata, void *A, void *b, void *x ), HYPRE_Int (*Precond) ( void *vdata, void *A, void *b, void *x ) ); /** * Description... * * @param param [IN] ... **/ void * hypre_BiCGSTABCreate( hypre_BiCGSTABFunctions * bicgstab_functions ); #ifdef __cplusplus } #endif #endif hypre-2.33.0/src/krylov/cgnr.c000066400000000000000000000503331477326011500161520ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * cgnr (conjugate gradient on the normal equations A^TAx = A^Tb) functions * *****************************************************************************/ #include "krylov.h" #include "_hypre_utilities.h" /*-------------------------------------------------------------------------- * hypre_CGNRFunctionsCreate *--------------------------------------------------------------------------*/ hypre_CGNRFunctions * hypre_CGNRFunctionsCreate( HYPRE_Int (*CommInfo) ( void *A, HYPRE_Int *my_id, HYPRE_Int *num_procs ), void * (*CreateVector) ( void *vector ), HYPRE_Int (*DestroyVector) ( void *vector ), void * (*MatvecCreate) ( void *A, void *x ), HYPRE_Int (*Matvec) ( void *matvec_data, HYPRE_Complex alpha, void *A, void *x, HYPRE_Complex beta, void *y ), HYPRE_Int (*MatvecT) ( void *matvec_data, HYPRE_Complex alpha, void *A, void *x, HYPRE_Complex beta, void *y ), HYPRE_Int (*MatvecDestroy) ( void *matvec_data ), HYPRE_Real (*InnerProd) ( void *x, void *y ), HYPRE_Int (*CopyVector) ( void *x, void *y ), HYPRE_Int (*ClearVector) ( void *x ), HYPRE_Int (*ScaleVector) ( HYPRE_Complex alpha, void *x ), HYPRE_Int (*Axpy) ( HYPRE_Complex alpha, void *x, void *y ), HYPRE_Int (*PrecondSetup) ( void *vdata, void *A, void *b, void *x ), HYPRE_Int (*Precond) ( void *vdata, void *A, void *b, void *x ), HYPRE_Int (*PrecondT) ( void *vdata, void *A, void *b, void *x ) ) { hypre_CGNRFunctions * cgnr_functions; cgnr_functions = (hypre_CGNRFunctions *) hypre_CTAlloc( hypre_CGNRFunctions, 1, HYPRE_MEMORY_HOST); cgnr_functions->CommInfo = CommInfo; cgnr_functions->CreateVector = CreateVector; cgnr_functions->DestroyVector = DestroyVector; cgnr_functions->MatvecCreate = MatvecCreate; cgnr_functions->Matvec = Matvec; cgnr_functions->MatvecT = MatvecT; cgnr_functions->MatvecDestroy = MatvecDestroy; cgnr_functions->InnerProd = InnerProd; cgnr_functions->CopyVector = CopyVector; cgnr_functions->ClearVector = ClearVector; cgnr_functions->ScaleVector = ScaleVector; cgnr_functions->Axpy = Axpy; /* default preconditioner must be set here but can be changed later... */ cgnr_functions->precond_setup = PrecondSetup; cgnr_functions->precond = Precond; cgnr_functions->precondT = PrecondT; return cgnr_functions; } /*-------------------------------------------------------------------------- * hypre_CGNRCreate *--------------------------------------------------------------------------*/ void * hypre_CGNRCreate( hypre_CGNRFunctions *cgnr_functions ) { hypre_CGNRData *cgnr_data; HYPRE_ANNOTATE_FUNC_BEGIN; cgnr_data = hypre_CTAlloc( hypre_CGNRData, 1, HYPRE_MEMORY_HOST); cgnr_data->functions = cgnr_functions; /* set defaults */ (cgnr_data -> tol) = 1.0e-06; (cgnr_data -> min_iter) = 0; (cgnr_data -> max_iter) = 1000; (cgnr_data -> stop_crit) = 0; (cgnr_data -> matvec_data) = NULL; (cgnr_data -> precond_data) = NULL; (cgnr_data -> logging) = 0; (cgnr_data -> norms) = NULL; HYPRE_ANNOTATE_FUNC_END; return (void *) cgnr_data; } /*-------------------------------------------------------------------------- * hypre_CGNRDestroy *--------------------------------------------------------------------------*/ HYPRE_Int hypre_CGNRDestroy( void *cgnr_vdata ) { hypre_CGNRData *cgnr_data = (hypre_CGNRData *)cgnr_vdata; HYPRE_Int ierr = 0; HYPRE_ANNOTATE_FUNC_BEGIN; if (cgnr_data) { hypre_CGNRFunctions *cgnr_functions = cgnr_data->functions; if ((cgnr_data -> logging) > 0) { hypre_TFree(cgnr_data -> norms, HYPRE_MEMORY_HOST); } (*(cgnr_functions->MatvecDestroy))(cgnr_data -> matvec_data); (*(cgnr_functions->DestroyVector))(cgnr_data -> p); (*(cgnr_functions->DestroyVector))(cgnr_data -> q); (*(cgnr_functions->DestroyVector))(cgnr_data -> r); (*(cgnr_functions->DestroyVector))(cgnr_data -> t); hypre_TFree(cgnr_data, HYPRE_MEMORY_HOST); hypre_TFree(cgnr_functions, HYPRE_MEMORY_HOST); } HYPRE_ANNOTATE_FUNC_END; return (ierr); } /*-------------------------------------------------------------------------- * hypre_CGNRSetup *--------------------------------------------------------------------------*/ HYPRE_Int hypre_CGNRSetup(void *cgnr_vdata, void *A, void *b, void *x ) { hypre_CGNRData *cgnr_data = (hypre_CGNRData *)cgnr_vdata; hypre_CGNRFunctions *cgnr_functions = cgnr_data->functions; HYPRE_Int max_iter = (cgnr_data -> max_iter); HYPRE_Int (*precond_setup)(void*, void*, void*, void*) = (cgnr_functions -> precond_setup); void *precond_data = (cgnr_data -> precond_data); HYPRE_Int ierr = 0; HYPRE_ANNOTATE_FUNC_BEGIN; (cgnr_data -> A) = A; /*-------------------------------------------------- * The arguments for CreateVector are important to * maintain consistency between the setup and * compute phases of matvec and the preconditioner. *--------------------------------------------------*/ (cgnr_data -> p) = (*(cgnr_functions->CreateVector))(x); (cgnr_data -> q) = (*(cgnr_functions->CreateVector))(x); (cgnr_data -> r) = (*(cgnr_functions->CreateVector))(b); (cgnr_data -> t) = (*(cgnr_functions->CreateVector))(b); (cgnr_data -> matvec_data) = (*(cgnr_functions->MatvecCreate))(A, x); ierr = precond_setup(precond_data, A, b, x); /*----------------------------------------------------- * Allocate space for log info *-----------------------------------------------------*/ if ((cgnr_data -> logging) > 0) { (cgnr_data -> norms) = hypre_CTAlloc(HYPRE_Real, max_iter + 1, HYPRE_MEMORY_HOST); (cgnr_data -> log_file_name) = (char*)"cgnr.out.log"; } HYPRE_ANNOTATE_FUNC_END; return ierr; } /*-------------------------------------------------------------------------- * hypre_CGNRSolve: apply CG to (AC)^TACy = (AC)^Tb, x = Cy *--------------------------------------------------------------------------*/ HYPRE_Int hypre_CGNRSolve(void *cgnr_vdata, void *A, void *b, void *x ) { hypre_CGNRData *cgnr_data = (hypre_CGNRData *)cgnr_vdata; hypre_CGNRFunctions *cgnr_functions = cgnr_data->functions; HYPRE_Real tol = (cgnr_data -> tol); HYPRE_Int max_iter = (cgnr_data -> max_iter); HYPRE_Int stop_crit = (cgnr_data -> stop_crit); void *p = (cgnr_data -> p); void *q = (cgnr_data -> q); void *r = (cgnr_data -> r); void *t = (cgnr_data -> t); void *matvec_data = (cgnr_data -> matvec_data); HYPRE_Int (*precond)(void*, void*, void*, void*) = (cgnr_functions -> precond); HYPRE_Int (*precondT)(void*, void*, void*, void*) = (cgnr_functions -> precondT); void *precond_data = (cgnr_data -> precond_data); HYPRE_Int logging = (cgnr_data -> logging); HYPRE_Real *norms = (cgnr_data -> norms); HYPRE_Real alpha, beta; HYPRE_Real gamma, gamma_old; HYPRE_Real bi_prod, i_prod, eps; HYPRE_Real ieee_check = 0.; HYPRE_Int i = 0; HYPRE_Int ierr = 0; HYPRE_Int my_id, num_procs; HYPRE_Int x_not_set = 1; /* char *log_file_name; */ HYPRE_ANNOTATE_FUNC_BEGIN; /*----------------------------------------------------------------------- * Start cgnr solve *-----------------------------------------------------------------------*/ (*(cgnr_functions->CommInfo))(A, &my_id, &num_procs); if (logging > 1 && my_id == 0) { /* not used yet log_file_name = (cgnr_data -> log_file_name); */ hypre_printf("Iters ||r||_2 conv.rate ||r||_2/||b||_2\n"); hypre_printf("----- ------------ --------- ------------ \n"); } /* compute eps */ bi_prod = (*(cgnr_functions->InnerProd))(b, b); /* Since it does not diminish performance, attempt to return an error flag and notify users when they supply bad input. */ if (bi_prod != 0.) { ieee_check = bi_prod / bi_prod; } /* INF -> NaN conversion */ if (ieee_check != ieee_check) { /* ...INFs or NaNs in input can make ieee_check a NaN. This test for ieee_check self-equality works on all IEEE-compliant compilers/ machines, c.f. page 8 of "Lecture Notes on the Status of IEEE 754" by W. Kahan, May 31, 1996. Currently (July 2002) this paper may be found at http://HTTP.CS.Berkeley.EDU/~wkahan/ieee754status/IEEE754.PDF */ if (logging > 0) { hypre_printf("\n\nERROR detected by Hypre ... BEGIN\n"); hypre_printf("ERROR -- hypre_CGNRSolve: INFs and/or NaNs detected in input.\n"); hypre_printf("User probably placed non-numerics in supplied b.\n"); hypre_printf("Returning error flag += 101. Program not terminated.\n"); hypre_printf("ERROR detected by Hypre ... END\n\n\n"); } ierr += 101; HYPRE_ANNOTATE_FUNC_END; return ierr; } if (stop_crit) { eps = tol * tol; /* absolute residual norm */ } else { eps = (tol * tol) * bi_prod; /* relative residual norm */ } /* Check to see if the rhs vector b is zero */ if (bi_prod == 0.0) { /* Set x equal to zero and return */ (*(cgnr_functions->CopyVector))(b, x); if (logging > 0) { norms[0] = 0.0; } ierr = 0; HYPRE_ANNOTATE_FUNC_END; return ierr; } /* r = b - Ax */ (*(cgnr_functions->CopyVector))(b, r); (*(cgnr_functions->Matvec))(matvec_data, -1.0, A, x, 1.0, r); /* Set initial residual norm */ if (logging > 0) { norms[0] = hypre_sqrt((*(cgnr_functions->InnerProd))(r, r)); /* Since it does not diminish performance, attempt to return an error flag and notify users when they supply bad input. */ if (norms[0] != 0.) { ieee_check = norms[0] / norms[0]; } /* INF -> NaN conversion */ if (ieee_check != ieee_check) { /* ...INFs or NaNs in input can make ieee_check a NaN. This test for ieee_check self-equality works on all IEEE-compliant compilers/ machines, c.f. page 8 of "Lecture Notes on the Status of IEEE 754" by W. Kahan, May 31, 1996. Currently (July 2002) this paper may be found at http://HTTP.CS.Berkeley.EDU/~wkahan/ieee754status/IEEE754.PDF */ if (logging > 0) { hypre_printf("\n\nERROR detected by Hypre ... BEGIN\n"); hypre_printf("ERROR -- hypre_CGNRSolve: INFs and/or NaNs detected in input.\n"); hypre_printf("User probably placed non-numerics in supplied A or x_0.\n"); hypre_printf("Returning error flag += 101. Program not terminated.\n"); hypre_printf("ERROR detected by Hypre ... END\n\n\n"); } ierr += 101; HYPRE_ANNOTATE_FUNC_END; return ierr; } } /* t = C^T*A^T*r */ (*(cgnr_functions->MatvecT))(matvec_data, 1.0, A, r, 0.0, q); (*(cgnr_functions->ClearVector))(t); precondT(precond_data, A, q, t); /* p = r */ (*(cgnr_functions->CopyVector))(r, p); /* gamma = */ gamma = (*(cgnr_functions->InnerProd))(t, t); /* Since it does not diminish performance, attempt to return an error flag and notify users when they supply bad input. */ if (gamma != 0.) { ieee_check = gamma / gamma; } /* INF -> NaN conversion */ if (ieee_check != ieee_check) { /* ...INFs or NaNs in input can make ieee_check a NaN. This test for ieee_check self-equality works on all IEEE-compliant compilers/ machines, c.f. page 8 of "Lecture Notes on the Status of IEEE 754" by W. Kahan, May 31, 1996. Currently (July 2002) this paper may be found at http://HTTP.CS.Berkeley.EDU/~wkahan/ieee754status/IEEE754.PDF */ if (logging > 0) { hypre_printf("\n\nERROR detected by Hypre ... BEGIN\n"); hypre_printf("ERROR -- hypre_CGNRSolve: INFs and/or NaNs detected in input.\n"); hypre_printf("User probably placed non-numerics in supplied A or x_0.\n"); hypre_printf("Returning error flag += 101. Program not terminated.\n"); hypre_printf("ERROR detected by Hypre ... END\n\n\n"); } ierr += 101; HYPRE_ANNOTATE_FUNC_END; return ierr; } while ((i + 1) <= max_iter) { i++; /* q = A*C*p */ (*(cgnr_functions->ClearVector))(t); precond(precond_data, A, p, t); (*(cgnr_functions->Matvec))(matvec_data, 1.0, A, t, 0.0, q); /* alpha = gamma / */ alpha = gamma / (*(cgnr_functions->InnerProd))(q, q); gamma_old = gamma; /* x = x + alpha*p */ (*(cgnr_functions->Axpy))(alpha, p, x); /* r = r - alpha*q */ (*(cgnr_functions->Axpy))(-alpha, q, r); /* t = C^T*A^T*r */ (*(cgnr_functions->MatvecT))(matvec_data, 1.0, A, r, 0.0, q); (*(cgnr_functions->ClearVector))(t); precondT(precond_data, A, q, t); /* gamma = */ gamma = (*(cgnr_functions->InnerProd))(t, t); /* set i_prod for convergence test */ i_prod = (*(cgnr_functions->InnerProd))(r, r); /* log norm info */ if (logging > 0) { norms[i] = hypre_sqrt(i_prod); if (logging > 1 && my_id == 0) { hypre_printf("% 5d %e %f %e\n", i, norms[i], norms[i] / norms[i - 1], norms[i] / bi_prod); } } /* check for convergence */ if (i_prod < eps) { /*----------------------------------------------------------------- * Generate solution q = Cx *-----------------------------------------------------------------*/ (*(cgnr_functions->ClearVector))(q); precond(precond_data, A, x, q); /* r = b - Aq */ (*(cgnr_functions->CopyVector))(b, r); (*(cgnr_functions->Matvec))(matvec_data, -1.0, A, q, 1.0, r); i_prod = (*(cgnr_functions->InnerProd))(r, r); if (i_prod < eps) { (*(cgnr_functions->CopyVector))(q, x); x_not_set = 0; break; } } /* beta = gamma / gamma_old */ beta = gamma / gamma_old; /* p = t + beta p */ (*(cgnr_functions->ScaleVector))(beta, p); (*(cgnr_functions->Axpy))(1.0, t, p); } /*----------------------------------------------------------------- * Generate solution x = Cx *-----------------------------------------------------------------*/ if (x_not_set) { (*(cgnr_functions->CopyVector))(x, q); (*(cgnr_functions->ClearVector))(x); precond(precond_data, A, q, x); } /*----------------------------------------------------------------------- * Print log *-----------------------------------------------------------------------*/ bi_prod = hypre_sqrt(bi_prod); if (logging > 1 && my_id == 0) { hypre_printf("\n\n"); } (cgnr_data -> num_iterations) = i; (cgnr_data -> rel_residual_norm) = norms[i] / bi_prod; HYPRE_ANNOTATE_FUNC_END; return ierr; } /*-------------------------------------------------------------------------- * hypre_CGNRSetTol *--------------------------------------------------------------------------*/ HYPRE_Int hypre_CGNRSetTol(void *cgnr_vdata, HYPRE_Real tol ) { hypre_CGNRData *cgnr_data = (hypre_CGNRData *)cgnr_vdata; HYPRE_Int ierr = 0; (cgnr_data -> tol) = tol; return ierr; } /*-------------------------------------------------------------------------- * hypre_CGNRSetMinIter *--------------------------------------------------------------------------*/ HYPRE_Int hypre_CGNRSetMinIter( void *cgnr_vdata, HYPRE_Int min_iter ) { hypre_CGNRData *cgnr_data = (hypre_CGNRData *)cgnr_vdata; HYPRE_Int ierr = 0; (cgnr_data -> min_iter) = min_iter; return ierr; } /*-------------------------------------------------------------------------- * hypre_CGNRSetMaxIter *--------------------------------------------------------------------------*/ HYPRE_Int hypre_CGNRSetMaxIter( void *cgnr_vdata, HYPRE_Int max_iter ) { hypre_CGNRData *cgnr_data = (hypre_CGNRData *)cgnr_vdata; HYPRE_Int ierr = 0; (cgnr_data -> max_iter) = max_iter; return ierr; } /*-------------------------------------------------------------------------- * hypre_CGNRSetStopCrit *--------------------------------------------------------------------------*/ HYPRE_Int hypre_CGNRSetStopCrit( void *cgnr_vdata, HYPRE_Int stop_crit ) { hypre_CGNRData *cgnr_data = (hypre_CGNRData *)cgnr_vdata; HYPRE_Int ierr = 0; (cgnr_data -> stop_crit) = stop_crit; return ierr; } /*-------------------------------------------------------------------------- * hypre_CGNRSetPrecond *--------------------------------------------------------------------------*/ HYPRE_Int hypre_CGNRSetPrecond(void *cgnr_vdata, HYPRE_Int (*precond)(void*, void*, void*, void*), HYPRE_Int (*precondT)(void*, void*, void*, void*), HYPRE_Int (*precond_setup)(void*, void*, void*, void*), void *precond_data ) { hypre_CGNRData *cgnr_data = (hypre_CGNRData *)cgnr_vdata; hypre_CGNRFunctions *cgnr_functions = cgnr_data->functions; HYPRE_Int ierr = 0; (cgnr_functions -> precond) = precond; (cgnr_functions -> precondT) = precondT; (cgnr_functions -> precond_setup) = precond_setup; (cgnr_data -> precond_data) = precond_data; return ierr; } /*-------------------------------------------------------------------------- * hypre_CGNRGetPrecond *--------------------------------------------------------------------------*/ HYPRE_Int hypre_CGNRGetPrecond( void *cgnr_vdata, HYPRE_Solver *precond_data_ptr ) { hypre_CGNRData *cgnr_data = (hypre_CGNRData *)cgnr_vdata; HYPRE_Int ierr = 0; *precond_data_ptr = (HYPRE_Solver)(cgnr_data -> precond_data); return ierr; } /*-------------------------------------------------------------------------- * hypre_CGNRSetLogging *--------------------------------------------------------------------------*/ HYPRE_Int hypre_CGNRSetLogging( void *cgnr_vdata, HYPRE_Int logging) { hypre_CGNRData *cgnr_data = (hypre_CGNRData *)cgnr_vdata; HYPRE_Int ierr = 0; (cgnr_data -> logging) = logging; return ierr; } /*-------------------------------------------------------------------------- * hypre_CGNRGetNumIterations *--------------------------------------------------------------------------*/ HYPRE_Int hypre_CGNRGetNumIterations( void *cgnr_vdata, HYPRE_Int *num_iterations ) { hypre_CGNRData *cgnr_data = (hypre_CGNRData *)cgnr_vdata; HYPRE_Int ierr = 0; *num_iterations = (cgnr_data -> num_iterations); return ierr; } /*-------------------------------------------------------------------------- * hypre_CGNRGetFinalRelativeResidualNorm *--------------------------------------------------------------------------*/ HYPRE_Int hypre_CGNRGetFinalRelativeResidualNorm( void *cgnr_vdata, HYPRE_Real *relative_residual_norm ) { hypre_CGNRData *cgnr_data = (hypre_CGNRData *)cgnr_vdata; HYPRE_Int ierr = 0; *relative_residual_norm = (cgnr_data -> rel_residual_norm); return ierr; } hypre-2.33.0/src/krylov/cgnr.h000066400000000000000000000114311477326011500161530ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * cgnr (conjugate gradient on the normal equations A^TAx = A^Tb) functions * *****************************************************************************/ #ifndef hypre_KRYLOV_CGNR_HEADER #define hypre_KRYLOV_CGNR_HEADER /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ /** * @name Generic CGNR Interface * * A general description of the interface goes here... * * @memo A generic CGNR linear solver interface * @version 0.1 * @author Jeffrey F. Painter **/ /*@{*/ /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ /*-------------------------------------------------------------------------- * hypre_CGNRData and hypre_CGNRFunctions *--------------------------------------------------------------------------*/ /** * @name CGNR structs * * Description... **/ /*@{*/ /** * The {\tt hypre\_CGNRSFunctions} object ... **/ typedef struct { HYPRE_Int (*CommInfo) ( void *A, HYPRE_Int *my_id, HYPRE_Int *num_procs ); void * (*CreateVector) ( void *vector ); HYPRE_Int (*DestroyVector) ( void *vector ); void * (*MatvecCreate) ( void *A, void *x ); HYPRE_Int (*Matvec) ( void *matvec_data, HYPRE_Complex alpha, void *A, void *x, HYPRE_Complex beta, void *y ); HYPRE_Int (*MatvecT) ( void *matvec_data, HYPRE_Complex alpha, void *A, void *x, HYPRE_Complex beta, void *y ); HYPRE_Int (*MatvecDestroy) ( void *matvec_data ); HYPRE_Real (*InnerProd) ( void *x, void *y ); HYPRE_Int (*CopyVector) ( void *x, void *y ); HYPRE_Int (*ClearVector) ( void *x ); HYPRE_Int (*ScaleVector) ( HYPRE_Complex alpha, void *x ); HYPRE_Int (*Axpy) ( HYPRE_Complex alpha, void *x, void *y ); HYPRE_Int (*precond_setup) ( void *vdata, void *A, void *b, void *x ); HYPRE_Int (*precond) ( void *vdata, void *A, void *b, void *x ); HYPRE_Int (*precondT) ( void *vdata, void *A, void *b, void *x ); } hypre_CGNRFunctions; /** * The {\tt hypre\_CGNRData} object ... **/ typedef struct { HYPRE_Real tol; HYPRE_Real rel_residual_norm; HYPRE_Int min_iter; HYPRE_Int max_iter; HYPRE_Int stop_crit; void *A; void *p; void *q; void *r; void *t; void *matvec_data; void *precond_data; hypre_CGNRFunctions * functions; /* log info (always logged) */ HYPRE_Int num_iterations; /* additional log info (logged when `logging' > 0) */ HYPRE_Int logging; HYPRE_Real *norms; char *log_file_name; } hypre_CGNRData; #ifdef __cplusplus extern "C" { #endif /** * @name generic CGNR Solver * * Description... **/ /*@{*/ /** * Description... * * @param param [IN] ... **/ hypre_CGNRFunctions * hypre_CGNRFunctionsCreate( HYPRE_Int (*CommInfo) ( void *A, HYPRE_Int *my_id, HYPRE_Int *num_procs ), void * (*CreateVector) ( void *vector ), HYPRE_Int (*DestroyVector) ( void *vector ), void * (*MatvecCreate) ( void *A, void *x ), HYPRE_Int (*Matvec) ( void *matvec_data, HYPRE_Complex alpha, void *A, void *x, HYPRE_Complex beta, void *y ), HYPRE_Int (*MatvecT) ( void *matvec_data, HYPRE_Complex alpha, void *A, void *x, HYPRE_Complex beta, void *y ), HYPRE_Int (*MatvecDestroy) ( void *matvec_data ), HYPRE_Real (*InnerProd) ( void *x, void *y ), HYPRE_Int (*CopyVector) ( void *x, void *y ), HYPRE_Int (*ClearVector) ( void *x ), HYPRE_Int (*ScaleVector) ( HYPRE_Complex alpha, void *x ), HYPRE_Int (*Axpy) ( HYPRE_Complex alpha, void *x, void *y ), HYPRE_Int (*PrecondSetup) ( void *vdata, void *A, void *b, void *x ), HYPRE_Int (*Precond) ( void *vdata, void *A, void *b, void *x ), HYPRE_Int (*PrecondT) ( void *vdata, void *A, void *b, void *x ) ); /** * Description... * * @param param [IN] ... **/ void * hypre_CGNRCreate( hypre_CGNRFunctions *cgnr_functions ); #ifdef __cplusplus } #endif #endif hypre-2.33.0/src/krylov/cogmres.c000066400000000000000000001306351477326011500166640ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * COGMRES cogmres * *****************************************************************************/ #include "krylov.h" #include "_hypre_utilities.h" /*-------------------------------------------------------------------------- * hypre_COGMRESFunctionsCreate *--------------------------------------------------------------------------*/ hypre_COGMRESFunctions * hypre_COGMRESFunctionsCreate( void * (*CAlloc) ( size_t count, size_t elt_size, HYPRE_MemoryLocation location ), HYPRE_Int (*Free) ( void *ptr ), HYPRE_Int (*CommInfo) ( void *A, HYPRE_Int *my_id, HYPRE_Int *num_procs ), void * (*CreateVector) ( void *vector ), void * (*CreateVectorArray) ( HYPRE_Int size, void *vectors ), HYPRE_Int (*DestroyVector) ( void *vector ), void * (*MatvecCreate) ( void *A, void *x ), HYPRE_Int (*Matvec) ( void *matvec_data, HYPRE_Complex alpha, void *A, void *x, HYPRE_Complex beta, void *y ), HYPRE_Int (*MatvecDestroy) ( void *matvec_data ), HYPRE_Real (*InnerProd) ( void *x, void *y ), HYPRE_Int (*MassInnerProd) (void *x, void **y, HYPRE_Int k, HYPRE_Int unroll, void *result), HYPRE_Int (*MassDotpTwo) (void *x, void *y, void **z, HYPRE_Int k, HYPRE_Int unroll, void *result_x, void *result_y), HYPRE_Int (*CopyVector) ( void *x, void *y ), HYPRE_Int (*ClearVector) ( void *x ), HYPRE_Int (*ScaleVector) ( HYPRE_Complex alpha, void *x ), HYPRE_Int (*Axpy) ( HYPRE_Complex alpha, void *x, void *y ), HYPRE_Int (*MassAxpy) ( HYPRE_Complex *alpha, void **x, void *y, HYPRE_Int k, HYPRE_Int unroll), HYPRE_Int (*PrecondSetup) ( void *vdata, void *A, void *b, void *x ), HYPRE_Int (*Precond) ( void *vdata, void *A, void *b, void *x ) ) { hypre_COGMRESFunctions * cogmres_functions; cogmres_functions = (hypre_COGMRESFunctions *) CAlloc( 1, sizeof(hypre_COGMRESFunctions), HYPRE_MEMORY_HOST ); cogmres_functions->CAlloc = CAlloc; cogmres_functions->Free = Free; cogmres_functions->CommInfo = CommInfo; /* not in PCGFunctionsCreate */ cogmres_functions->CreateVector = CreateVector; cogmres_functions->CreateVectorArray = CreateVectorArray; /* not in PCGFunctionsCreate */ cogmres_functions->DestroyVector = DestroyVector; cogmres_functions->MatvecCreate = MatvecCreate; cogmres_functions->Matvec = Matvec; cogmres_functions->MatvecDestroy = MatvecDestroy; cogmres_functions->InnerProd = InnerProd; cogmres_functions->MassInnerProd = MassInnerProd; cogmres_functions->MassDotpTwo = MassDotpTwo; cogmres_functions->CopyVector = CopyVector; cogmres_functions->ClearVector = ClearVector; cogmres_functions->ScaleVector = ScaleVector; cogmres_functions->Axpy = Axpy; cogmres_functions->MassAxpy = MassAxpy; /* default preconditioner must be set here but can be changed later... */ cogmres_functions->precond_setup = PrecondSetup; cogmres_functions->precond = Precond; return cogmres_functions; } /*-------------------------------------------------------------------------- * hypre_COGMRESCreate *--------------------------------------------------------------------------*/ void * hypre_COGMRESCreate( hypre_COGMRESFunctions *cogmres_functions ) { hypre_COGMRESData *cogmres_data; HYPRE_ANNOTATE_FUNC_BEGIN; cogmres_data = hypre_CTAllocF(hypre_COGMRESData, 1, cogmres_functions, HYPRE_MEMORY_HOST); cogmres_data->functions = cogmres_functions; /* set defaults */ (cogmres_data -> k_dim) = 5; (cogmres_data -> cgs) = 1; /* if 2 performs reorthogonalization */ (cogmres_data -> tol) = 1.0e-06; /* relative residual tol */ (cogmres_data -> cf_tol) = 0.0; (cogmres_data -> a_tol) = 0.0; /* abs. residual tol */ (cogmres_data -> min_iter) = 0; (cogmres_data -> max_iter) = 1000; (cogmres_data -> rel_change) = 0; (cogmres_data -> skip_real_r_check) = 0; (cogmres_data -> converged) = 0; (cogmres_data -> precond_data) = NULL; (cogmres_data -> print_level) = 0; (cogmres_data -> logging) = 0; (cogmres_data -> p) = NULL; (cogmres_data -> r) = NULL; (cogmres_data -> w) = NULL; (cogmres_data -> w_2) = NULL; (cogmres_data -> matvec_data) = NULL; (cogmres_data -> norms) = NULL; (cogmres_data -> log_file_name) = NULL; (cogmres_data -> unroll) = 0; HYPRE_ANNOTATE_FUNC_END; return (void *) cogmres_data; } /*-------------------------------------------------------------------------- * hypre_COGMRESDestroy *--------------------------------------------------------------------------*/ HYPRE_Int hypre_COGMRESDestroy( void *cogmres_vdata ) { hypre_COGMRESData *cogmres_data = (hypre_COGMRESData *)cogmres_vdata; HYPRE_Int i; HYPRE_ANNOTATE_FUNC_BEGIN; if (cogmres_data) { hypre_COGMRESFunctions *cogmres_functions = cogmres_data->functions; if ( (cogmres_data->logging > 0) || (cogmres_data->print_level) > 0 ) { if ( (cogmres_data -> norms) != NULL ) { hypre_TFreeF( cogmres_data -> norms, cogmres_functions ); } } if ( (cogmres_data -> matvec_data) != NULL ) { (*(cogmres_functions->MatvecDestroy))(cogmres_data -> matvec_data); } if ( (cogmres_data -> r) != NULL ) { (*(cogmres_functions->DestroyVector))(cogmres_data -> r); } if ( (cogmres_data -> w) != NULL ) { (*(cogmres_functions->DestroyVector))(cogmres_data -> w); } if ( (cogmres_data -> w_2) != NULL ) { (*(cogmres_functions->DestroyVector))(cogmres_data -> w_2); } if ( (cogmres_data -> p) != NULL ) { for (i = 0; i < (cogmres_data -> k_dim + 1); i++) { if ( (cogmres_data -> p)[i] != NULL ) { (*(cogmres_functions->DestroyVector))( (cogmres_data -> p) [i]); } } hypre_TFreeF( cogmres_data->p, cogmres_functions ); } hypre_TFreeF( cogmres_data, cogmres_functions ); hypre_TFreeF( cogmres_functions, cogmres_functions ); } HYPRE_ANNOTATE_FUNC_END; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_COGMRESGetResidual *--------------------------------------------------------------------------*/ HYPRE_Int hypre_COGMRESGetResidual( void *cogmres_vdata, void **residual ) { hypre_COGMRESData *cogmres_data = (hypre_COGMRESData *)cogmres_vdata; *residual = cogmres_data->r; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_COGMRESSetup *--------------------------------------------------------------------------*/ HYPRE_Int hypre_COGMRESSetup( void *cogmres_vdata, void *A, void *b, void *x ) { hypre_COGMRESData *cogmres_data = (hypre_COGMRESData *)cogmres_vdata; hypre_COGMRESFunctions *cogmres_functions = cogmres_data->functions; HYPRE_Int k_dim = (cogmres_data -> k_dim); HYPRE_Int max_iter = (cogmres_data -> max_iter); HYPRE_Int (*precond_setup)(void*, void*, void*, void*) = (cogmres_functions->precond_setup); void *precond_data = (cogmres_data -> precond_data); HYPRE_Int rel_change = (cogmres_data -> rel_change); HYPRE_ANNOTATE_FUNC_BEGIN; (cogmres_data -> A) = A; /*-------------------------------------------------- * The arguments for NewVector are important to * maintain consistency between the setup and * compute phases of matvec and the preconditioner. *--------------------------------------------------*/ if ((cogmres_data -> p) == NULL) { (cogmres_data -> p) = (void**)(*(cogmres_functions->CreateVectorArray))(k_dim + 1, x); } if ((cogmres_data -> r) == NULL) { (cogmres_data -> r) = (*(cogmres_functions->CreateVector))(b); } if ((cogmres_data -> w) == NULL) { (cogmres_data -> w) = (*(cogmres_functions->CreateVector))(b); } if (rel_change) { if ((cogmres_data -> w_2) == NULL) { (cogmres_data -> w_2) = (*(cogmres_functions->CreateVector))(b); } } if ((cogmres_data -> matvec_data) == NULL) { (cogmres_data -> matvec_data) = (*(cogmres_functions->MatvecCreate))(A, x); } precond_setup(precond_data, A, b, x); /*----------------------------------------------------- * Allocate space for log info *-----------------------------------------------------*/ if ( (cogmres_data->logging) > 0 || (cogmres_data->print_level) > 0 ) { if ((cogmres_data -> norms) == NULL) { (cogmres_data -> norms) = hypre_CTAllocF(HYPRE_Real, max_iter + 1, cogmres_functions, HYPRE_MEMORY_HOST); } } if ( (cogmres_data->print_level) > 0 ) { if ((cogmres_data -> log_file_name) == NULL) { (cogmres_data -> log_file_name) = (char*)"cogmres.out.log"; } } HYPRE_ANNOTATE_FUNC_END; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_COGMRESSolve *-------------------------------------------------------------------------*/ HYPRE_Int hypre_COGMRESSolve(void *cogmres_vdata, void *A, void *b, void *x) { hypre_COGMRESData *cogmres_data = (hypre_COGMRESData *)cogmres_vdata; hypre_COGMRESFunctions *cogmres_functions = cogmres_data->functions; HYPRE_Int k_dim = (cogmres_data -> k_dim); HYPRE_Int unroll = (cogmres_data -> unroll); HYPRE_Int cgs = (cogmres_data -> cgs); HYPRE_Int min_iter = (cogmres_data -> min_iter); HYPRE_Int max_iter = (cogmres_data -> max_iter); HYPRE_Int rel_change = (cogmres_data -> rel_change); HYPRE_Int skip_real_r_check = (cogmres_data -> skip_real_r_check); HYPRE_Real r_tol = (cogmres_data -> tol); HYPRE_Real cf_tol = (cogmres_data -> cf_tol); HYPRE_Real a_tol = (cogmres_data -> a_tol); void *matvec_data = (cogmres_data -> matvec_data); void *r = (cogmres_data -> r); void *w = (cogmres_data -> w); /* note: w_2 is only allocated if rel_change = 1 */ void *w_2 = (cogmres_data -> w_2); void **p = (cogmres_data -> p); HYPRE_Int (*precond)(void*, void*, void*, void*) = (cogmres_functions -> precond); HYPRE_Int *precond_data = (HYPRE_Int*)(cogmres_data -> precond_data); HYPRE_Int print_level = (cogmres_data -> print_level); HYPRE_Int logging = (cogmres_data -> logging); HYPRE_Real *norms = (cogmres_data -> norms); /* not used yet char *log_file_name = (cogmres_data -> log_file_name);*/ /* FILE *fp; */ HYPRE_Int break_value = 0; HYPRE_Int i, j, k; /*KS: rv is the norm history */ HYPRE_Real *rs, *hh, *uu, *c, *s, *rs_2 = NULL, *rv; //, *tmp; HYPRE_Int iter; HYPRE_Int my_id, num_procs; HYPRE_Real epsilon, gamma, t, r_norm, b_norm, den_norm, x_norm; HYPRE_Real w_norm; HYPRE_Real epsmac = 1.e-16; HYPRE_Real ieee_check = 0.; HYPRE_Real guard_zero_residual; HYPRE_Real cf_ave_0 = 0.0; HYPRE_Real cf_ave_1 = 0.0; HYPRE_Real weight; HYPRE_Real r_norm_0; HYPRE_Real relative_error = 1.0; HYPRE_Int rel_change_passed = 0, num_rel_change_check = 0; HYPRE_Int itmp = 0; HYPRE_Real real_r_norm_old, real_r_norm_new; HYPRE_ANNOTATE_FUNC_BEGIN; (cogmres_data -> converged) = 0; /*----------------------------------------------------------------------- * With relative change convergence test on, it is possible to attempt * another iteration with a zero residual. This causes the parameter * alpha to go NaN. The guard_zero_residual parameter is to circumvent * this. Perhaps it should be set to something non-zero (but small). *-----------------------------------------------------------------------*/ guard_zero_residual = 0.0; (*(cogmres_functions->CommInfo))(A, &my_id, &num_procs); if ( logging > 0 || print_level > 0 ) { norms = (cogmres_data -> norms); } /* initialize work arrays */ rs = hypre_CTAllocF(HYPRE_Real, k_dim + 1, cogmres_functions, HYPRE_MEMORY_HOST); c = hypre_CTAllocF(HYPRE_Real, k_dim, cogmres_functions, HYPRE_MEMORY_HOST); s = hypre_CTAllocF(HYPRE_Real, k_dim, cogmres_functions, HYPRE_MEMORY_HOST); if (rel_change) { rs_2 = hypre_CTAllocF(HYPRE_Real, k_dim + 1, cogmres_functions, HYPRE_MEMORY_HOST); } rv = hypre_CTAllocF(HYPRE_Real, k_dim + 1, cogmres_functions, HYPRE_MEMORY_HOST); hh = hypre_CTAllocF(HYPRE_Real, (k_dim + 1) * k_dim, cogmres_functions, HYPRE_MEMORY_HOST); uu = hypre_CTAllocF(HYPRE_Real, (k_dim + 1) * k_dim, cogmres_functions, HYPRE_MEMORY_HOST); (*(cogmres_functions->CopyVector))(b, p[0]); /* compute initial residual */ (*(cogmres_functions->Matvec))(matvec_data, -1.0, A, x, 1.0, p[0]); b_norm = hypre_sqrt((*(cogmres_functions->InnerProd))(b, b)); real_r_norm_old = b_norm; /* Since it does not diminish performance, attempt to return an error flag and notify users when they supply bad input. */ if (b_norm != 0.) { ieee_check = b_norm / b_norm; } /* INF -> NaN conversion */ if (ieee_check != ieee_check) { /* ...INFs or NaNs in input can make ieee_check a NaN. This test for ieee_check self-equality works on all IEEE-compliant compilers/ machines, c.f. page 8 of "Lecture Notes on the Status of IEEE 754" by W. Kahan, May 31, 1996. Currently (July 2002) this paper may be found at http://HTTP.CS.Berkeley.EDU/~wkahan/ieee754status/IEEE754.PDF */ if (logging > 0 || print_level > 0) { hypre_printf("\n\nERROR detected by Hypre ... BEGIN\n"); hypre_printf("ERROR -- hypre_COGMRESSolve: INFs and/or NaNs detected in input.\n"); hypre_printf("User probably placed non-numerics in supplied b.\n"); hypre_printf("Returning error flag += 101. Program not terminated.\n"); hypre_printf("ERROR detected by Hypre ... END\n\n\n"); } hypre_error(HYPRE_ERROR_GENERIC); HYPRE_ANNOTATE_FUNC_END; return hypre_error_flag; } r_norm = hypre_sqrt((*(cogmres_functions->InnerProd))(p[0], p[0])); r_norm_0 = r_norm; /* Since it does not diminish performance, attempt to return an error flag and notify users when they supply bad input. */ if (r_norm != 0.) { ieee_check = r_norm / r_norm; } /* INF -> NaN conversion */ if (ieee_check != ieee_check) { /* ...INFs or NaNs in input can make ieee_check a NaN. This test for ieee_check self-equality works on all IEEE-compliant compilers/ machines, c.f. page 8 of "Lecture Notes on the Status of IEEE 754" by W. Kahan, May 31, 1996. Currently (July 2002) this paper may be found at http://HTTP.CS.Berkeley.EDU/~wkahan/ieee754status/IEEE754.PDF */ if (logging > 0 || print_level > 0) { hypre_printf("\n\nERROR detected by Hypre ... BEGIN\n"); hypre_printf("ERROR -- hypre_COGMRESSolve: INFs and/or NaNs detected in input.\n"); hypre_printf("User probably placed non-numerics in supplied A or x_0.\n"); hypre_printf("Returning error flag += 101. Program not terminated.\n"); hypre_printf("ERROR detected by Hypre ... END\n\n\n"); } hypre_error(HYPRE_ERROR_GENERIC); HYPRE_ANNOTATE_FUNC_END; return hypre_error_flag; } if ( logging > 0 || print_level > 0) { norms[0] = r_norm; if ( print_level > 1 && my_id == 0 ) { hypre_printf("L2 norm of b: %e\n", b_norm); if (b_norm == 0.0) { hypre_printf("Rel_resid_norm actually contains the residual norm\n"); } hypre_printf("Initial L2 norm of residual: %e\n", r_norm); } } iter = 0; if (b_norm > 0.0) { /* convergence criterion |r_i|/|b| <= accuracy if |b| > 0 */ den_norm = b_norm; } else { /* convergence criterion |r_i|/|r0| <= accuracy if |b| = 0 */ den_norm = r_norm; }; /* convergence criteria: |r_i| <= max( a_tol, r_tol * den_norm) den_norm = |r_0| or |b| note: default for a_tol is 0.0, so relative residual criteria is used unless user specifies a_tol, or sets r_tol = 0.0, which means absolute tol only is checked */ epsilon = hypre_max(a_tol, r_tol * den_norm); /* so now our stop criteria is |r_i| <= epsilon */ if ( print_level > 1 && my_id == 0 ) { if (b_norm > 0.0) { hypre_printf("=============================================\n\n"); hypre_printf("Iters resid.norm conv.rate rel.res.norm\n"); hypre_printf("----- ------------ ---------- ------------\n"); } else { hypre_printf("=============================================\n\n"); hypre_printf("Iters resid.norm conv.rate\n"); hypre_printf("----- ------------ ----------\n"); }; } /* once the rel. change check has passed, we do not want to check it again */ rel_change_passed = 0; while (iter < max_iter) { /* initialize first term of hessenberg system */ rs[0] = r_norm; if (r_norm == 0.0) { hypre_TFreeF(c, cogmres_functions); hypre_TFreeF(s, cogmres_functions); hypre_TFreeF(rs, cogmres_functions); hypre_TFreeF(rv, cogmres_functions); if (rel_change) { hypre_TFreeF(rs_2, cogmres_functions); } hypre_TFreeF(hh, cogmres_functions); hypre_TFreeF(uu, cogmres_functions); HYPRE_ANNOTATE_FUNC_END; return hypre_error_flag; } /* see if we are already converged and should print the final norm and exit */ if (r_norm <= epsilon && iter >= min_iter) { if (!rel_change) /* shouldn't exit after no iterations if * relative change is on*/ { (*(cogmres_functions->CopyVector))(b, r); (*(cogmres_functions->Matvec))(matvec_data, -1.0, A, x, 1.0, r); r_norm = hypre_sqrt((*(cogmres_functions->InnerProd))(r, r)); if (r_norm <= epsilon) { if ( print_level > 1 && my_id == 0) { hypre_printf("\n\n"); hypre_printf("Final L2 norm of residual: %e\n\n", r_norm); } break; } else if ( print_level > 0 && my_id == 0) { hypre_printf("false convergence 1\n"); } } } t = 1.0 / r_norm; (*(cogmres_functions->ScaleVector))(t, p[0]); i = 0; /***RESTART CYCLE (right-preconditioning) ***/ while (i < k_dim && iter < max_iter) { i++; iter++; itmp = (i - 1) * (k_dim + 1); (*(cogmres_functions->ClearVector))(r); precond(precond_data, A, p[i - 1], r); (*(cogmres_functions->Matvec))(matvec_data, 1.0, A, r, 0.0, p[i]); for (j = 0; j < i; j++) { rv[j] = 0; } if (cgs > 1) { (*(cogmres_functions->MassDotpTwo))((void *) p[i], p[i - 1], p, i, unroll, &hh[itmp], &uu[itmp]); for (j = 0; j < i - 1; j++) { uu[j * (k_dim + 1) + i - 1] = uu[itmp + j]; } for (j = 0; j < i; j++) { rv[j] = hh[itmp + j]; } for (k = 0; k < i; k++) { for (j = 0; j < i; j++) { hh[itmp + j] -= (uu[k * (k_dim + 1) + j] * rv[j]); } } for (j = 0; j < i; j++) { hh[itmp + j] = -rv[j] - hh[itmp + j]; } } else { (*(cogmres_functions->MassInnerProd))((void *) p[i], p, i, unroll, &hh[itmp]); for (j = 0; j < i; j++) { hh[itmp + j] = -hh[itmp + j]; } } (*(cogmres_functions->MassAxpy))(&hh[itmp], p, p[i], i, unroll); for (j = 0; j < i; j++) { hh[itmp + j] = -hh[itmp + j]; } t = hypre_sqrt( (*(cogmres_functions->InnerProd))(p[i], p[i]) ); hh[itmp + i] = t; if (hh[itmp + i] != 0.0) { t = 1.0 / t; (*(cogmres_functions->ScaleVector))(t, p[i]); } for (j = 1; j < i; j++) { t = hh[itmp + j - 1]; hh[itmp + j - 1] = s[j - 1] * hh[itmp + j] + c[j - 1] * t; hh[itmp + j] = -s[j - 1] * t + c[j - 1] * hh[itmp + j]; } t = hh[itmp + i] * hh[itmp + i]; t += hh[itmp + i - 1] * hh[itmp + i - 1]; gamma = hypre_sqrt(t); if (gamma == 0.0) { gamma = epsmac; } c[i - 1] = hh[itmp + i - 1] / gamma; s[i - 1] = hh[itmp + i] / gamma; rs[i] = -hh[itmp + i] * rs[i - 1]; rs[i] /= gamma; rs[i - 1] = c[i - 1] * rs[i - 1]; // determine residual norm hh[itmp + i - 1] = s[i - 1] * hh[itmp + i] + c[i - 1] * hh[itmp + i - 1]; r_norm = hypre_abs(rs[i]); if ( print_level > 0 ) { norms[iter] = r_norm; if ( print_level > 1 && my_id == 0 ) { if (b_norm > 0.0) hypre_printf("% 5d %e %f %e\n", iter, norms[iter], norms[iter] / norms[iter - 1], norms[iter] / b_norm); else hypre_printf("% 5d %e %f\n", iter, norms[iter], norms[iter] / norms[iter - 1]); } } /*convergence factor tolerance */ if (cf_tol > 0.0) { cf_ave_0 = cf_ave_1; cf_ave_1 = hypre_pow( r_norm / r_norm_0, 1.0 / (2.0 * iter)); weight = hypre_abs(cf_ave_1 - cf_ave_0); weight = weight / hypre_max(cf_ave_1, cf_ave_0); weight = 1.0 - weight; #if 0 hypre_printf("I = %d: cf_new = %e, cf_old = %e, weight = %e\n", i, cf_ave_1, cf_ave_0, weight ); #endif if (weight * cf_ave_1 > cf_tol) { break_value = 1; break; } } /* should we exit the restart cycle? (conv. check) */ if (r_norm <= epsilon && iter >= min_iter) { if (rel_change && !rel_change_passed) { /* To decide whether to break here: to actually determine the relative change requires the approx solution (so a triangular solve) and a precond. solve - so if we have to do this many times, it will be expensive...(unlike cg where is is relatively straightforward) previously, the intent (there was a bug), was to exit the restart cycle based on the residual norm and check the relative change outside the cycle. Here we will check the relative here as we don't want to exit the restart cycle prematurely */ for (k = 0; k < i; k++) /* extra copy of rs so we don't need to change the later solve */ { rs_2[k] = rs[k]; } /* solve tri. system*/ rs_2[i - 1] = rs_2[i - 1] / hh[itmp + i - 1]; for (k = i - 2; k >= 0; k--) { t = 0.0; for (j = k + 1; j < i; j++) { t -= hh[j * (k_dim + 1) + k] * rs_2[j]; } t += rs_2[k]; rs_2[k] = t / hh[k * (k_dim + 1) + k]; } (*(cogmres_functions->CopyVector))(p[i - 1], w); (*(cogmres_functions->ScaleVector))(rs_2[i - 1], w); for (j = i - 2; j >= 0; j--) { (*(cogmres_functions->Axpy))(rs_2[j], p[j], w); } (*(cogmres_functions->ClearVector))(r); /* find correction (in r) */ precond(precond_data, A, w, r); /* copy current solution (x) to w (don't want to over-write x)*/ (*(cogmres_functions->CopyVector))(x, w); /* add the correction */ (*(cogmres_functions->Axpy))(1.0, r, w); /* now w is the approx solution - get the norm*/ x_norm = hypre_sqrt( (*(cogmres_functions->InnerProd))(w, w) ); if ( !(x_norm <= guard_zero_residual )) /* don't divide by zero */ { /* now get x_i - x_i-1 */ if (num_rel_change_check) { /* have already checked once so we can avoid another precond. solve */ (*(cogmres_functions->CopyVector))(w, r); (*(cogmres_functions->Axpy))(-1.0, w_2, r); /* now r contains x_i - x_i-1*/ /* save current soln w in w_2 for next time */ (*(cogmres_functions->CopyVector))(w, w_2); } else { /* first time to check rel change*/ /* first save current soln w in w_2 for next time */ (*(cogmres_functions->CopyVector))(w, w_2); (*(cogmres_functions->ClearVector))(w); (*(cogmres_functions->Axpy))(rs_2[i - 1], p[i - 1], w); (*(cogmres_functions->ClearVector))(r); /* apply the preconditioner */ precond(precond_data, A, w, r); /* now r contains x_i - x_i-1 */ } /* find the norm of x_i - x_i-1 */ w_norm = hypre_sqrt( (*(cogmres_functions->InnerProd))(r, r) ); relative_error = w_norm / x_norm; if (relative_error <= r_tol) { rel_change_passed = 1; break; } } else { rel_change_passed = 1; break; } num_rel_change_check++; } else /* no relative change */ { break; } } } /*** end of restart cycle ***/ /* now compute solution, first solve upper triangular system */ if (break_value) { break; } rs[i - 1] = rs[i - 1] / hh[itmp + i - 1]; for (k = i - 2; k >= 0; k--) { t = 0.0; for (j = k + 1; j < i; j++) { t -= hh[j * (k_dim + 1) + k] * rs[j]; } t += rs[k]; rs[k] = t / hh[k * (k_dim + 1) + k]; } (*(cogmres_functions->CopyVector))(p[i - 1], w); (*(cogmres_functions->ScaleVector))(rs[i - 1], w); for (j = i - 2; j >= 0; j--) { (*(cogmres_functions->Axpy))(rs[j], p[j], w); } (*(cogmres_functions->ClearVector))(r); /* find correction (in r) */ precond(precond_data, A, w, r); /* update current solution x (in x) */ (*(cogmres_functions->Axpy))(1.0, r, x); /* check for convergence by evaluating the actual residual */ if (r_norm <= epsilon && iter >= min_iter) { if (skip_real_r_check) { (cogmres_data -> converged) = 1; break; } /* calculate actual residual norm*/ (*(cogmres_functions->CopyVector))(b, r); (*(cogmres_functions->Matvec))(matvec_data, -1.0, A, x, 1.0, r); real_r_norm_new = r_norm = hypre_sqrt( (*(cogmres_functions->InnerProd))(r, r) ); if (r_norm <= epsilon) { if (rel_change && !rel_change_passed) /* calculate the relative change */ { /* calculate the norm of the solution */ x_norm = hypre_sqrt( (*(cogmres_functions->InnerProd))(x, x) ); if ( !(x_norm <= guard_zero_residual )) /* don't divide by zero */ { (*(cogmres_functions->ClearVector))(w); (*(cogmres_functions->Axpy))(rs[i - 1], p[i - 1], w); (*(cogmres_functions->ClearVector))(r); /* apply the preconditioner */ precond(precond_data, A, w, r); /* find the norm of x_i - x_i-1 */ w_norm = hypre_sqrt( (*(cogmres_functions->InnerProd))(r, r) ); relative_error = w_norm / x_norm; if ( relative_error < r_tol ) { (cogmres_data -> converged) = 1; if ( print_level > 1 && my_id == 0 ) { hypre_printf("\n\n"); hypre_printf("Final L2 norm of residual: %e\n\n", r_norm); } break; } } else { (cogmres_data -> converged) = 1; if ( print_level > 1 && my_id == 0 ) { hypre_printf("\n\n"); hypre_printf("Final L2 norm of residual: %e\n\n", r_norm); } break; } } else /* don't need to check rel. change */ { if ( print_level > 1 && my_id == 0 ) { hypre_printf("\n\n"); hypre_printf("Final L2 norm of residual: %e\n\n", r_norm); } (cogmres_data -> converged) = 1; break; } } else /* conv. has not occurred, according to true residual */ { /* exit if the real residual norm has not decreased */ if (real_r_norm_new >= real_r_norm_old) { if (print_level > 1 && my_id == 0) { hypre_printf("\n\n"); hypre_printf("Final L2 norm of residual: %e\n\n", r_norm); } (cogmres_data -> converged) = 1; break; } /* report discrepancy between real/COGMRES residuals and restart */ if ( print_level > 0 && my_id == 0) { hypre_printf("false convergence 2, L2 norm of residual: %e\n", r_norm); } (*(cogmres_functions->CopyVector))(r, p[0]); i = 0; real_r_norm_old = real_r_norm_new; } } /* end of convergence check */ /* compute residual vector and continue loop */ for (j = i ; j > 0; j--) { rs[j - 1] = -s[j - 1] * rs[j]; rs[j] = c[j - 1] * rs[j]; } if (i) { (*(cogmres_functions->Axpy))(rs[i] - 1.0, p[i], p[i]); } for (j = i - 1 ; j > 0; j--) { (*(cogmres_functions->Axpy))(rs[j], p[j], p[i]); } if (i) { (*(cogmres_functions->Axpy))(rs[0] - 1.0, p[0], p[0]); (*(cogmres_functions->Axpy))(1.0, p[i], p[0]); } } /* END of iteration while loop */ (cogmres_data -> num_iterations) = iter; if (b_norm > 0.0) { (cogmres_data -> rel_residual_norm) = r_norm / b_norm; } if (b_norm == 0.0) { (cogmres_data -> rel_residual_norm) = r_norm; } if (iter >= max_iter && r_norm > epsilon && epsilon > 0) { hypre_error(HYPRE_ERROR_CONV); } hypre_TFreeF(c, cogmres_functions); hypre_TFreeF(s, cogmres_functions); hypre_TFreeF(rs, cogmres_functions); hypre_TFreeF(rv, cogmres_functions); if (rel_change) { hypre_TFreeF(rs_2, cogmres_functions); } /*for (i=0; i < k_dim+1; i++) { hypre_TFreeF(hh[i],cogmres_functions); hypre_TFreeF(uu[i],cogmres_functions); }*/ hypre_TFreeF(hh, cogmres_functions); hypre_TFreeF(uu, cogmres_functions); HYPRE_ANNOTATE_FUNC_END; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_COGMRESSetKDim, hypre_COGMRESGetKDim *--------------------------------------------------------------------------*/ HYPRE_Int hypre_COGMRESSetKDim( void *cogmres_vdata, HYPRE_Int k_dim ) { hypre_COGMRESData *cogmres_data = (hypre_COGMRESData *) cogmres_vdata; (cogmres_data -> k_dim) = k_dim; return hypre_error_flag; } HYPRE_Int hypre_COGMRESGetKDim( void *cogmres_vdata, HYPRE_Int * k_dim ) { hypre_COGMRESData *cogmres_data = (hypre_COGMRESData *)cogmres_vdata; *k_dim = (cogmres_data -> k_dim); return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_COGMRESSetUnroll, hypre_COGMRESGetUnroll *--------------------------------------------------------------------------*/ HYPRE_Int hypre_COGMRESSetUnroll( void *cogmres_vdata, HYPRE_Int unroll ) { hypre_COGMRESData *cogmres_data = (hypre_COGMRESData *) cogmres_vdata; (cogmres_data -> unroll) = unroll; return hypre_error_flag; } HYPRE_Int hypre_COGMRESGetUnroll( void *cogmres_vdata, HYPRE_Int * unroll ) { hypre_COGMRESData *cogmres_data = (hypre_COGMRESData *)cogmres_vdata; *unroll = (cogmres_data -> unroll); return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_COGMRESSetCGS, hypre_COGMRESGetCGS *--------------------------------------------------------------------------*/ HYPRE_Int hypre_COGMRESSetCGS( void *cogmres_vdata, HYPRE_Int cgs ) { hypre_COGMRESData *cogmres_data = (hypre_COGMRESData *) cogmres_vdata; (cogmres_data -> cgs) = cgs; return hypre_error_flag; } HYPRE_Int hypre_COGMRESGetCGS( void *cogmres_vdata, HYPRE_Int * cgs ) { hypre_COGMRESData *cogmres_data = (hypre_COGMRESData *)cogmres_vdata; *cgs = (cogmres_data -> cgs); return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_COGMRESSetTol, hypre_COGMRESGetTol *--------------------------------------------------------------------------*/ HYPRE_Int hypre_COGMRESSetTol( void *cogmres_vdata, HYPRE_Real tol ) { hypre_COGMRESData *cogmres_data = (hypre_COGMRESData *)cogmres_vdata; (cogmres_data -> tol) = tol; return hypre_error_flag; } HYPRE_Int hypre_COGMRESGetTol( void *cogmres_vdata, HYPRE_Real * tol ) { hypre_COGMRESData *cogmres_data = (hypre_COGMRESData *)cogmres_vdata; *tol = (cogmres_data -> tol); return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_COGMRESSetAbsoluteTol, hypre_COGMRESGetAbsoluteTol *--------------------------------------------------------------------------*/ HYPRE_Int hypre_COGMRESSetAbsoluteTol( void *cogmres_vdata, HYPRE_Real a_tol ) { hypre_COGMRESData *cogmres_data = (hypre_COGMRESData *)cogmres_vdata; (cogmres_data -> a_tol) = a_tol; return hypre_error_flag; } HYPRE_Int hypre_COGMRESGetAbsoluteTol( void *cogmres_vdata, HYPRE_Real * a_tol ) { hypre_COGMRESData *cogmres_data = (hypre_COGMRESData *)cogmres_vdata; *a_tol = (cogmres_data -> a_tol); return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_COGMRESSetConvergenceFactorTol, hypre_COGMRESGetConvergenceFactorTol *--------------------------------------------------------------------------*/ HYPRE_Int hypre_COGMRESSetConvergenceFactorTol( void *cogmres_vdata, HYPRE_Real cf_tol ) { hypre_COGMRESData *cogmres_data = (hypre_COGMRESData *)cogmres_vdata; (cogmres_data -> cf_tol) = cf_tol; return hypre_error_flag; } HYPRE_Int hypre_COGMRESGetConvergenceFactorTol( void *cogmres_vdata, HYPRE_Real * cf_tol ) { hypre_COGMRESData *cogmres_data = (hypre_COGMRESData *)cogmres_vdata; *cf_tol = (cogmres_data -> cf_tol); return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_COGMRESSetMinIter, hypre_COGMRESGetMinIter *--------------------------------------------------------------------------*/ HYPRE_Int hypre_COGMRESSetMinIter( void *cogmres_vdata, HYPRE_Int min_iter ) { hypre_COGMRESData *cogmres_data = (hypre_COGMRESData *)cogmres_vdata; (cogmres_data -> min_iter) = min_iter; return hypre_error_flag; } HYPRE_Int hypre_COGMRESGetMinIter( void *cogmres_vdata, HYPRE_Int * min_iter ) { hypre_COGMRESData *cogmres_data = (hypre_COGMRESData *)cogmres_vdata; *min_iter = (cogmres_data -> min_iter); return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_COGMRESSetMaxIter, hypre_COGMRESGetMaxIter *--------------------------------------------------------------------------*/ HYPRE_Int hypre_COGMRESSetMaxIter( void *cogmres_vdata, HYPRE_Int max_iter ) { hypre_COGMRESData *cogmres_data = (hypre_COGMRESData *)cogmres_vdata; (cogmres_data -> max_iter) = max_iter; return hypre_error_flag; } HYPRE_Int hypre_COGMRESGetMaxIter( void *cogmres_vdata, HYPRE_Int * max_iter ) { hypre_COGMRESData *cogmres_data = (hypre_COGMRESData *)cogmres_vdata; *max_iter = (cogmres_data -> max_iter); return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_COGMRESSetRelChange, hypre_COGMRESGetRelChange *--------------------------------------------------------------------------*/ HYPRE_Int hypre_COGMRESSetRelChange( void *cogmres_vdata, HYPRE_Int rel_change ) { hypre_COGMRESData *cogmres_data = (hypre_COGMRESData *)cogmres_vdata; (cogmres_data -> rel_change) = rel_change; return hypre_error_flag; } HYPRE_Int hypre_COGMRESGetRelChange( void *cogmres_vdata, HYPRE_Int * rel_change ) { hypre_COGMRESData *cogmres_data = (hypre_COGMRESData *)cogmres_vdata; *rel_change = (cogmres_data -> rel_change); return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_COGMRESSetSkipRealResidualCheck, hypre_COGMRESGetSkipRealResidualCheck *--------------------------------------------------------------------------*/ HYPRE_Int hypre_COGMRESSetSkipRealResidualCheck( void *cogmres_vdata, HYPRE_Int skip_real_r_check ) { hypre_COGMRESData *cogmres_data = (hypre_COGMRESData *)cogmres_vdata; (cogmres_data -> skip_real_r_check) = skip_real_r_check; return hypre_error_flag; } HYPRE_Int hypre_COGMRESGetSkipRealResidualCheck( void *cogmres_vdata, HYPRE_Int *skip_real_r_check) { hypre_COGMRESData *cogmres_data = (hypre_COGMRESData *)cogmres_vdata; *skip_real_r_check = (cogmres_data -> skip_real_r_check); return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_COGMRESSetPrecond *--------------------------------------------------------------------------*/ HYPRE_Int hypre_COGMRESSetPrecond( void *cogmres_vdata, HYPRE_Int (*precond)(void*, void*, void*, void*), HYPRE_Int (*precond_setup)(void*, void*, void*, void*), void *precond_data ) { hypre_COGMRESData *cogmres_data = (hypre_COGMRESData *)cogmres_vdata; hypre_COGMRESFunctions *cogmres_functions = cogmres_data->functions; (cogmres_functions -> precond) = precond; (cogmres_functions -> precond_setup) = precond_setup; (cogmres_data -> precond_data) = precond_data; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_COGMRESGetPrecond *--------------------------------------------------------------------------*/ HYPRE_Int hypre_COGMRESGetPrecond( void *cogmres_vdata, HYPRE_Solver *precond_data_ptr ) { hypre_COGMRESData *cogmres_data = (hypre_COGMRESData *)cogmres_vdata; *precond_data_ptr = (HYPRE_Solver)(cogmres_data -> precond_data); return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_COGMRESSetPrintLevel, hypre_COGMRESGetPrintLevel *--------------------------------------------------------------------------*/ HYPRE_Int hypre_COGMRESSetPrintLevel( void *cogmres_vdata, HYPRE_Int level) { hypre_COGMRESData *cogmres_data = (hypre_COGMRESData *)cogmres_vdata; (cogmres_data -> print_level) = level; return hypre_error_flag; } HYPRE_Int hypre_COGMRESGetPrintLevel( void *cogmres_vdata, HYPRE_Int * level) { hypre_COGMRESData *cogmres_data = (hypre_COGMRESData *)cogmres_vdata; *level = (cogmres_data -> print_level); return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_COGMRESSetLogging, hypre_COGMRESGetLogging *--------------------------------------------------------------------------*/ HYPRE_Int hypre_COGMRESSetLogging( void *cogmres_vdata, HYPRE_Int level) { hypre_COGMRESData *cogmres_data = (hypre_COGMRESData *)cogmres_vdata; (cogmres_data -> logging) = level; return hypre_error_flag; } HYPRE_Int hypre_COGMRESGetLogging( void *cogmres_vdata, HYPRE_Int * level) { hypre_COGMRESData *cogmres_data = (hypre_COGMRESData *)cogmres_vdata; *level = (cogmres_data -> logging); return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_COGMRESGetNumIterations *--------------------------------------------------------------------------*/ HYPRE_Int hypre_COGMRESGetNumIterations( void *cogmres_vdata, HYPRE_Int *num_iterations ) { hypre_COGMRESData *cogmres_data = (hypre_COGMRESData *)cogmres_vdata; *num_iterations = (cogmres_data -> num_iterations); return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_COGMRESGetConverged *--------------------------------------------------------------------------*/ HYPRE_Int hypre_COGMRESGetConverged( void *cogmres_vdata, HYPRE_Int *converged ) { hypre_COGMRESData *cogmres_data = (hypre_COGMRESData *)cogmres_vdata; *converged = (cogmres_data -> converged); return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_COGMRESGetFinalRelativeResidualNorm *--------------------------------------------------------------------------*/ HYPRE_Int hypre_COGMRESGetFinalRelativeResidualNorm( void *cogmres_vdata, HYPRE_Real *relative_residual_norm ) { hypre_COGMRESData *cogmres_data = (hypre_COGMRESData *)cogmres_vdata; *relative_residual_norm = (cogmres_data -> rel_residual_norm); return hypre_error_flag; } HYPRE_Int hypre_COGMRESSetModifyPC(void *cogmres_vdata, HYPRE_Int (*modify_pc)(void *precond_data, HYPRE_Int iteration, HYPRE_Real rel_residual_norm)) { hypre_COGMRESData *cogmres_data = (hypre_COGMRESData *)cogmres_vdata; hypre_COGMRESFunctions *cogmres_functions = cogmres_data->functions; (cogmres_functions -> modify_pc) = modify_pc; return hypre_error_flag; } hypre-2.33.0/src/krylov/cogmres.h000066400000000000000000000132601477326011500166630ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * COGMRES gmres * *****************************************************************************/ #ifndef hypre_KRYLOV_COGMRES_HEADER #define hypre_KRYLOV_COGMRES_HEADER /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ /** * @name Generic COGMRES Interface * * A general description of the interface goes here... * * @memo A generic COGMRES linear solver interface **/ /*@{*/ /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ /*-------------------------------------------------------------------------- * hypre_COGMRESData and hypre_COGMRESFunctions *--------------------------------------------------------------------------*/ /** * @name COGMRES structs * * Description... **/ /*@{*/ /** * The {\tt hypre\_COGMRESFunctions} object ... **/ typedef struct { void * (*CAlloc) ( size_t count, size_t elt_size ); HYPRE_Int (*Free) ( void *ptr ); HYPRE_Int (*CommInfo) ( void *A, HYPRE_Int *my_id, HYPRE_Int *num_procs ); void * (*CreateVector) ( void *vector ); void * (*CreateVectorArray) ( HYPRE_Int size, void *vectors ); HYPRE_Int (*DestroyVector) ( void *vector ); void * (*MatvecCreate) ( void *A, void *x ); HYPRE_Int (*Matvec) ( void *matvec_data, HYPRE_Complex alpha, void *A, void *x, HYPRE_Complex beta, void *y ); HYPRE_Int (*MatvecDestroy) ( void *matvec_data ); HYPRE_Real (*InnerProd) ( void *x, void *y ); HYPRE_Int (*MassInnerProd) ( void *x, void **p, HYPRE_Int k, HYPRE_int unroll, void *result); HYPRE_Int (*MassDotpTwo)( void *x, void *y, void **p, HYPRE_Int k, void *result_x, HYPRE_int unroll, void *result_y); HYPRE_Int (*CopyVector) ( void *x, void *y ); HYPRE_Int (*ClearVector) ( void *x ); HYPRE_Int (*ScaleVector) ( HYPRE_Complex alpha, void *x ); HYPRE_Int (*Axpy) ( HYPRE_Complex alpha, void *x, void *y ); HYPRE_Int (*MassAxpy) ( HYPRE_Complex *alpha, void **x, void *y, HYPRE_Int k, HYPRE_Int unroll); HYPRE_Int (*precond) (); HYPRE_Int (*precond_setup) (); HYPRE_Int (*modify_pc)(void *precond_data, HYPRE_Int iteration, HYPRE_Real rel_residual_norm ); } hypre_COGMRESFunctions; /** * The {\tt hypre\_COGMRESData} object ... **/ typedef struct { HYPRE_Int k_dim; HYPRE_Int unroll; HYPRE_Int cgs; HYPRE_Int min_iter; HYPRE_Int max_iter; HYPRE_Int rel_change; HYPRE_Int skip_real_r_check; HYPRE_Int converged; HYPRE_Real tol; HYPRE_Real cf_tol; HYPRE_Real a_tol; HYPRE_Real rel_residual_norm; void *A; void *r; void *w; void *w_2; void **p; void *matvec_data; void *precond_data; hypre_COGMRESFunctions * functions; /* log info (always logged) */ HYPRE_Int num_iterations; HYPRE_Int print_level; /* printing when print_level>0 */ HYPRE_Int logging; /* extra computations for logging when logging>0 */ HYPRE_Real *norms; char *log_file_name; } hypre_COGMRESData; #ifdef __cplusplus extern "C" { #endif /** * @name generic COGMRES Solver * * Description... **/ /*@{*/ /** * Description... * * @param param [IN] ... **/ hypre_COGMRESFunctions * hypre_COGMRESFunctionsCreate( void * (*CAlloc) ( size_t count, size_t elt_size ), HYPRE_Int (*Free) ( void *ptr ), HYPRE_Int (*CommInfo) ( void *A, HYPRE_Int *my_id, HYPRE_Int *num_procs ), void * (*CreateVector) ( void *vector ), void * (*CreateVectorArray) ( HYPRE_Int size, void *vectors ), HYPRE_Int (*DestroyVector) ( void *vector ), void * (*MatvecCreate) ( void *A, void *x ), HYPRE_Int (*Matvec) ( void *matvec_data, HYPRE_Complex alpha, void *A, void *x, HYPRE_Complex beta, void *y ), HYPRE_Int (*MatvecDestroy) ( void *matvec_data ), HYPRE_Real (*InnerProd) ( void *x, void *y ), HYPRE_Int (*MassInnerProd) ( void *x, void **p, HYPRE_Int k, HYPRE_Int unroll, void *result), HYPRE_Int (*MassDotpTwo) ( void *x, void *y, void **p, HYPRE_Int k, HYPRE_Int unroll, void *result_x, void *result_y), HYPRE_Int (*CopyVector) ( void *x, void *y ), HYPRE_Int (*ClearVector) ( void *x ), HYPRE_Int (*ScaleVector) ( HYPRE_Complex alpha, void *x ), HYPRE_Int (*Axpy) ( HYPRE_Complex alpha, void *x, void *y ), HYPRE_Int (*MassAxpy) ( HYPRE_Complex *alpha, void **x, void *y, HYPRE_Int k, HYPRE_Int unroll), HYPRE_Int (*PrecondSetup) ( void *vdata, void *A, void *b, void *x ), HYPRE_Int (*Precond) ( void *vdata, void *A, void *b, void *x ) ); /** * Description... * * @param param [IN] ... **/ void * hypre_COGMRESCreate( hypre_COGMRESFunctions *gmres_functions ); #ifdef __cplusplus } #endif #endif hypre-2.33.0/src/krylov/flexgmres.c000066400000000000000000001065511477326011500172210ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * FlexGMRES flexgmres * *****************************************************************************/ #include "krylov.h" #include "_hypre_utilities.h" /*-------------------------------------------------------------------------- * hypre_FlexGMRESFunctionsCreate *--------------------------------------------------------------------------*/ hypre_FlexGMRESFunctions * hypre_FlexGMRESFunctionsCreate( void * (*CAlloc) ( size_t count, size_t elt_size, HYPRE_MemoryLocation location ), HYPRE_Int (*Free) ( void *ptr ), HYPRE_Int (*CommInfo) ( void *A, HYPRE_Int *my_id, HYPRE_Int *num_procs ), void * (*CreateVector) ( void *vector ), void * (*CreateVectorArray) ( HYPRE_Int size, void *vectors ), HYPRE_Int (*DestroyVector) ( void *vector ), void * (*MatvecCreate) ( void *A, void *x ), HYPRE_Int (*Matvec) ( void *matvec_data, HYPRE_Complex alpha, void *A, void *x, HYPRE_Complex beta, void *y ), HYPRE_Int (*MatvecDestroy) ( void *matvec_data ), HYPRE_Real (*InnerProd) ( void *x, void *y ), HYPRE_Int (*CopyVector) ( void *x, void *y ), HYPRE_Int (*ClearVector) ( void *x ), HYPRE_Int (*ScaleVector) ( HYPRE_Complex alpha, void *x ), HYPRE_Int (*Axpy) ( HYPRE_Complex alpha, void *x, void *y ), HYPRE_Int (*PrecondSetup) ( void *vdata, void *A, void *b, void *x ), HYPRE_Int (*Precond) ( void *vdata, void *A, void *b, void *x ) ) { hypre_FlexGMRESFunctions * fgmres_functions; fgmres_functions = (hypre_FlexGMRESFunctions *) CAlloc( 1, sizeof(hypre_FlexGMRESFunctions), HYPRE_MEMORY_HOST ); fgmres_functions->CAlloc = CAlloc; fgmres_functions->Free = Free; fgmres_functions->CommInfo = CommInfo; /* not in PCGFunctionsCreate */ fgmres_functions->CreateVector = CreateVector; fgmres_functions->CreateVectorArray = CreateVectorArray; /* not in PCGFunctionsCreate */ fgmres_functions->DestroyVector = DestroyVector; fgmres_functions->MatvecCreate = MatvecCreate; fgmres_functions->Matvec = Matvec; fgmres_functions->MatvecDestroy = MatvecDestroy; fgmres_functions->InnerProd = InnerProd; fgmres_functions->CopyVector = CopyVector; fgmres_functions->ClearVector = ClearVector; fgmres_functions->ScaleVector = ScaleVector; fgmres_functions->Axpy = Axpy; /* default preconditioner must be set here but can be changed later... */ fgmres_functions->precond_setup = PrecondSetup; fgmres_functions->precond = Precond; fgmres_functions->modify_pc = hypre_FlexGMRESModifyPCDefault; return fgmres_functions; } /*-------------------------------------------------------------------------- * hypre_FlexGMRESCreate *--------------------------------------------------------------------------*/ void * hypre_FlexGMRESCreate( hypre_FlexGMRESFunctions *fgmres_functions ) { hypre_FlexGMRESData *fgmres_data; HYPRE_ANNOTATE_FUNC_BEGIN; fgmres_data = hypre_CTAllocF(hypre_FlexGMRESData, 1, fgmres_functions, HYPRE_MEMORY_HOST); fgmres_data->functions = fgmres_functions; /* set defaults */ (fgmres_data -> k_dim) = 20; (fgmres_data -> tol) = 1.0e-06; (fgmres_data -> cf_tol) = 0.0; (fgmres_data -> a_tol) = 0.0; /* abs. residual tol */ (fgmres_data -> min_iter) = 0; (fgmres_data -> max_iter) = 1000; (fgmres_data -> rel_change) = 0; (fgmres_data -> stop_crit) = 0; /* rel. residual norm */ (fgmres_data -> converged) = 0; (fgmres_data -> precond_data) = NULL; (fgmres_data -> print_level) = 0; (fgmres_data -> logging) = 0; (fgmres_data -> p) = NULL; (fgmres_data -> r) = NULL; (fgmres_data -> w) = NULL; (fgmres_data -> w_2) = NULL; (fgmres_data -> matvec_data) = NULL; (fgmres_data -> norms) = NULL; (fgmres_data -> log_file_name) = NULL; HYPRE_ANNOTATE_FUNC_END; return (void *) fgmres_data; } /*-------------------------------------------------------------------------- * hypre_FlexGMRESDestroy *--------------------------------------------------------------------------*/ HYPRE_Int hypre_FlexGMRESDestroy( void *fgmres_vdata ) { hypre_FlexGMRESData *fgmres_data = (hypre_FlexGMRESData *)fgmres_vdata; HYPRE_Int i; HYPRE_ANNOTATE_FUNC_BEGIN; if (fgmres_data) { hypre_FlexGMRESFunctions *fgmres_functions = fgmres_data->functions; if ( (fgmres_data->logging > 0) || (fgmres_data->print_level) > 0 ) { if ( (fgmres_data -> norms) != NULL ) { hypre_TFreeF( fgmres_data -> norms, fgmres_functions ); } } if ( (fgmres_data -> matvec_data) != NULL ) { (*(fgmres_functions->MatvecDestroy))(fgmres_data -> matvec_data); } if ( (fgmres_data -> r) != NULL ) { (*(fgmres_functions->DestroyVector))(fgmres_data -> r); } if ( (fgmres_data -> w) != NULL ) { (*(fgmres_functions->DestroyVector))(fgmres_data -> w); } if ( (fgmres_data -> w_2) != NULL ) { (*(fgmres_functions->DestroyVector))(fgmres_data -> w_2); } if ( (fgmres_data -> p) != NULL ) { for (i = 0; i < (fgmres_data -> k_dim + 1); i++) { if ( (fgmres_data -> p)[i] != NULL ) { (*(fgmres_functions->DestroyVector))( (fgmres_data -> p) [i]); } } hypre_TFreeF( fgmres_data->p, fgmres_functions ); } /* fgmres mod - space for precond. vectors*/ if ( (fgmres_data -> pre_vecs) != NULL ) { for (i = 0; i < (fgmres_data -> k_dim + 1); i++) { if ( (fgmres_data -> pre_vecs)[i] != NULL ) { (*(fgmres_functions->DestroyVector))( (fgmres_data -> pre_vecs) [i]); } } hypre_TFreeF( fgmres_data->pre_vecs, fgmres_functions ); } /*---*/ hypre_TFreeF( fgmres_data, fgmres_functions ); hypre_TFreeF( fgmres_functions, fgmres_functions ); } HYPRE_ANNOTATE_FUNC_END; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_FlexGMRESGetResidual *--------------------------------------------------------------------------*/ HYPRE_Int hypre_FlexGMRESGetResidual( void *fgmres_vdata, void **residual ) { hypre_FlexGMRESData *fgmres_data = (hypre_FlexGMRESData *)fgmres_vdata; *residual = fgmres_data->r; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_FlexGMRESSetup *--------------------------------------------------------------------------*/ HYPRE_Int hypre_FlexGMRESSetup( void *fgmres_vdata, void *A, void *b, void *x ) { hypre_FlexGMRESData *fgmres_data = (hypre_FlexGMRESData *)fgmres_vdata; hypre_FlexGMRESFunctions *fgmres_functions = fgmres_data->functions; HYPRE_Int k_dim = (fgmres_data -> k_dim); HYPRE_Int max_iter = (fgmres_data -> max_iter); HYPRE_Int (*precond_setup)(void*, void*, void*, void*) = (fgmres_functions->precond_setup); void *precond_data = (fgmres_data -> precond_data); HYPRE_Int rel_change = (fgmres_data -> rel_change); HYPRE_ANNOTATE_FUNC_BEGIN; (fgmres_data -> A) = A; /*-------------------------------------------------- * The arguments for NewVector are important to * maintain consistency between the setup and * compute phases of matvec and the preconditioner. *--------------------------------------------------*/ if ((fgmres_data -> p) == NULL) { (fgmres_data -> p) = (void**)(*(fgmres_functions->CreateVectorArray))(k_dim + 1, x); } if ((fgmres_data -> r) == NULL) { (fgmres_data -> r) = (*(fgmres_functions->CreateVector))(b); } if ((fgmres_data -> w) == NULL) { (fgmres_data -> w) = (*(fgmres_functions->CreateVector))(b); } if (rel_change) { if ((fgmres_data -> w_2) == NULL) { (fgmres_data -> w_2) = (*(fgmres_functions->CreateVector))(b); } } /* fgmres mod */ (fgmres_data -> pre_vecs) = (void**)(*(fgmres_functions->CreateVectorArray))(k_dim + 1, x); /*---*/ if ((fgmres_data -> matvec_data) == NULL) { (fgmres_data -> matvec_data) = (*(fgmres_functions->MatvecCreate))(A, x); } precond_setup(precond_data, A, b, x); /*----------------------------------------------------- * Allocate space for log info *-----------------------------------------------------*/ if ( (fgmres_data->logging) > 0 || (fgmres_data->print_level) > 0 ) { if ((fgmres_data -> norms) == NULL) { (fgmres_data -> norms) = hypre_CTAllocF(HYPRE_Real, max_iter + 1, fgmres_functions, HYPRE_MEMORY_HOST); } } if ( (fgmres_data->print_level) > 0 ) { if ((fgmres_data -> log_file_name) == NULL) { (fgmres_data -> log_file_name) = (char*)"fgmres.out.log"; } } HYPRE_ANNOTATE_FUNC_END; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_FlexGMRESSolve *-------------------------------------------------------------------------*/ HYPRE_Int hypre_FlexGMRESSolve(void *fgmres_vdata, void *A, void *b, void *x) { hypre_FlexGMRESData *fgmres_data = (hypre_FlexGMRESData *)fgmres_vdata; hypre_FlexGMRESFunctions *fgmres_functions = fgmres_data->functions; HYPRE_Int k_dim = (fgmres_data -> k_dim); HYPRE_Int min_iter = (fgmres_data -> min_iter); HYPRE_Int max_iter = (fgmres_data -> max_iter); HYPRE_Real r_tol = (fgmres_data -> tol); HYPRE_Real cf_tol = (fgmres_data -> cf_tol); HYPRE_Real a_tol = (fgmres_data -> a_tol); void *matvec_data = (fgmres_data -> matvec_data); void *r = (fgmres_data -> r); void *w = (fgmres_data -> w); void **p = (fgmres_data -> p); /* fgmres mod*/ void **pre_vecs = (fgmres_data ->pre_vecs); /*---*/ HYPRE_Int (*precond)(void*, void*, void*, void*) = (fgmres_functions -> precond); HYPRE_Int *precond_data = (HYPRE_Int*)(fgmres_data -> precond_data); HYPRE_Int print_level = (fgmres_data -> print_level); HYPRE_Int logging = (fgmres_data -> logging); HYPRE_Real *norms = (fgmres_data -> norms); HYPRE_Int break_value = 0; HYPRE_Int i, j, k; HYPRE_Real *rs, **hh, *c, *s; HYPRE_Int iter; HYPRE_Int my_id, num_procs; HYPRE_Real epsilon, gamma, t, r_norm, b_norm, den_norm; HYPRE_Real epsmac = 1.e-16; HYPRE_Real ieee_check = 0.; HYPRE_Real cf_ave_0 = 0.0; HYPRE_Real cf_ave_1 = 0.0; HYPRE_Real weight; HYPRE_Real r_norm_0; HYPRE_Int (*modify_pc)(void*, HYPRE_Int, HYPRE_Real) = (fgmres_functions -> modify_pc); /* We are not checking rel. change for now... */ HYPRE_ANNOTATE_FUNC_BEGIN; (fgmres_data -> converged) = 0; /*----------------------------------------------------------------------- * With relative change convergence test on, it is possible to attempt * another iteration with a zero residual. This causes the parameter * alpha to go NaN. The guard_zero_residual parameter is to circumvent * this. Perhaps it should be set to something non-zero (but small). *-----------------------------------------------------------------------*/ (*(fgmres_functions->CommInfo))(A, &my_id, &num_procs); if ( logging > 0 || print_level > 0 ) { norms = (fgmres_data -> norms); /* not used yet log_file_name = (fgmres_data -> log_file_name);*/ /* fp = fopen(log_file_name,"w"); */ } /* initialize work arrays */ rs = hypre_CTAllocF(HYPRE_Real, k_dim + 1, fgmres_functions, HYPRE_MEMORY_HOST); c = hypre_CTAllocF(HYPRE_Real, k_dim, fgmres_functions, HYPRE_MEMORY_HOST); s = hypre_CTAllocF(HYPRE_Real, k_dim, fgmres_functions, HYPRE_MEMORY_HOST); /* fgmres mod. - need non-modified hessenberg ???? */ hh = hypre_CTAllocF(HYPRE_Real*, k_dim + 1, fgmres_functions, HYPRE_MEMORY_HOST); for (i = 0; i < k_dim + 1; i++) { hh[i] = hypre_CTAllocF(HYPRE_Real, k_dim, fgmres_functions, HYPRE_MEMORY_HOST); } (*(fgmres_functions->CopyVector))(b, p[0]); /* compute initial residual */ (*(fgmres_functions->Matvec))(matvec_data, -1.0, A, x, 1.0, p[0]); b_norm = hypre_sqrt((*(fgmres_functions->InnerProd))(b, b)); /* Since it does not diminish performance, attempt to return an error flag and notify users when they supply bad input. */ if (b_norm != 0.) { ieee_check = b_norm / b_norm; } /* INF -> NaN conversion */ if (ieee_check != ieee_check) { /* ...INFs or NaNs in input can make ieee_check a NaN. This test for ieee_check self-equality works on all IEEE-compliant compilers/ machines, c.f. page 8 of "Lecture Notes on the Status of IEEE 754" by W. Kahan, May 31, 1996. Currently (July 2002) this paper may be found at http://HTTP.CS.Berkeley.EDU/~wkahan/ieee754status/IEEE754.PDF */ if (logging > 0 || print_level > 0) { hypre_printf("\n\nERROR detected by Hypre ... BEGIN\n"); hypre_printf("ERROR -- hypre_FlexGMRESSolve: INFs and/or NaNs detected in input.\n"); hypre_printf("User probably placed non-numerics in supplied b.\n"); hypre_printf("Returning error flag += 101. Program not terminated.\n"); hypre_printf("ERROR detected by Hypre ... END\n\n\n"); } hypre_error(HYPRE_ERROR_GENERIC); HYPRE_ANNOTATE_FUNC_END; return hypre_error_flag; } r_norm = hypre_sqrt((*(fgmres_functions->InnerProd))(p[0], p[0])); r_norm_0 = r_norm; /* Since it does not diminish performance, attempt to return an error flag and notify users when they supply bad input. */ if (r_norm != 0.) { ieee_check = r_norm / r_norm; } /* INF -> NaN conversion */ if (ieee_check != ieee_check) { /* ...INFs or NaNs in input can make ieee_check a NaN. This test for ieee_check self-equality works on all IEEE-compliant compilers/ machines, c.f. page 8 of "Lecture Notes on the Status of IEEE 754" by W. Kahan, May 31, 1996. Currently (July 2002) this paper may be found at http://HTTP.CS.Berkeley.EDU/~wkahan/ieee754status/IEEE754.PDF */ if (logging > 0 || print_level > 0) { hypre_printf("\n\nERROR detected by Hypre ... BEGIN\n"); hypre_printf("ERROR -- hypre_FlexGMRESSolve: INFs and/or NaNs detected in input.\n"); hypre_printf("User probably placed non-numerics in supplied A or x_0.\n"); hypre_printf("Returning error flag += 101. Program not terminated.\n"); hypre_printf("ERROR detected by Hypre ... END\n\n\n"); } hypre_error(HYPRE_ERROR_GENERIC); HYPRE_ANNOTATE_FUNC_END; return hypre_error_flag; } if ( logging > 0 || print_level > 0) { norms[0] = r_norm; if ( print_level > 1 && my_id == 0 ) { hypre_printf("L2 norm of b: %e\n", b_norm); if (b_norm == 0.0) { hypre_printf("Rel_resid_norm actually contains the residual norm\n"); } hypre_printf("Initial L2 norm of residual: %e\n", r_norm); } } iter = 0; if (b_norm > 0.0) { /* convergence criterion |r_i|/|b| <= accuracy if |b| > 0 */ den_norm = b_norm; } else { /* convergence criterion |r_i|/|r0| <= accuracy if |b| = 0 */ den_norm = r_norm; }; /* convergence criteria: |r_i| <= max( a_tol, r_tol * den_norm) den_norm = |r_0| or |b| note: default for a_tol is 0.0, so relative residual criteria is used unless user specifies a_tol, or sets r_tol = 0.0, which means absolute tol only is checked */ epsilon = hypre_max(a_tol, r_tol * den_norm); /* so now our stop criteria is |r_i| <= epsilon */ if ( print_level > 1 && my_id == 0 ) { if (b_norm > 0.0) { hypre_printf("=============================================\n\n"); hypre_printf("Iters resid.norm conv.rate rel.res.norm\n"); hypre_printf("----- ------------ ---------- ------------\n"); } else { hypre_printf("=============================================\n\n"); hypre_printf("Iters resid.norm conv.rate\n"); hypre_printf("----- ------------ ----------\n"); }; } /* outer iteration cycle */ while (iter < max_iter) { /* initialize first term of hessenberg system */ rs[0] = r_norm; if (r_norm == 0.0) { hypre_TFreeF(c, fgmres_functions); hypre_TFreeF(s, fgmres_functions); hypre_TFreeF(rs, fgmres_functions); for (i = 0; i < k_dim + 1; i++) { hypre_TFreeF(hh[i], fgmres_functions); } hypre_TFreeF(hh, fgmres_functions); HYPRE_ANNOTATE_FUNC_END; return hypre_error_flag; } /* see if we are already converged and should print the final norm and exit */ if (r_norm <= epsilon && iter >= min_iter) { (*(fgmres_functions->CopyVector))(b, r); (*(fgmres_functions->Matvec))(matvec_data, -1.0, A, x, 1.0, r); r_norm = hypre_sqrt((*(fgmres_functions->InnerProd))(r, r)); if (r_norm <= epsilon) { if ( print_level > 1 && my_id == 0) { hypre_printf("\n\n"); hypre_printf("Final L2 norm of residual: %e\n\n", r_norm); } break; } else if ( print_level > 0 && my_id == 0) { hypre_printf("false convergence 1\n"); } } t = 1.0 / r_norm; (*(fgmres_functions->ScaleVector))(t, p[0]); i = 0; /***RESTART CYCLE (right-preconditioning) ***/ while (i < k_dim && iter < max_iter) { i++; iter++; (*(fgmres_functions->ClearVector))(pre_vecs[i - 1]); /* allow some user function here (to change * prec. attributes, i.e.tolerances, etc. ? */ modify_pc(precond_data, iter, r_norm / den_norm ); /*apply preconditioner and store in pre_vecs */ precond(precond_data, A, p[i - 1], pre_vecs[i - 1]); /*apply operator and store in p */ (*(fgmres_functions->Matvec))(matvec_data, 1.0, A, pre_vecs[i - 1], 0.0, p[i]); /* modified Gram_Schmidt */ for (j = 0; j < i; j++) { hh[j][i - 1] = (*(fgmres_functions->InnerProd))(p[j], p[i]); (*(fgmres_functions->Axpy))(-hh[j][i - 1], p[j], p[i]); } t = hypre_sqrt((*(fgmres_functions->InnerProd))(p[i], p[i])); hh[i][i - 1] = t; if (t != 0.0) { t = 1.0 / t; (*(fgmres_functions->ScaleVector))(t, p[i]); } /* done with modified Gram_schmidt and Arnoldi step. update factorization of hh */ for (j = 1; j < i; j++) { t = hh[j - 1][i - 1]; hh[j - 1][i - 1] = s[j - 1] * hh[j][i - 1] + c[j - 1] * t; hh[j][i - 1] = -s[j - 1] * t + c[j - 1] * hh[j][i - 1]; } t = hh[i][i - 1] * hh[i][i - 1]; t += hh[i - 1][i - 1] * hh[i - 1][i - 1]; gamma = hypre_sqrt(t); if (gamma == 0.0) { gamma = epsmac; } c[i - 1] = hh[i - 1][i - 1] / gamma; s[i - 1] = hh[i][i - 1] / gamma; rs[i] = -hh[i][i - 1] * rs[i - 1]; rs[i] /= gamma; rs[i - 1] = c[i - 1] * rs[i - 1]; /* determine residual norm */ hh[i - 1][i - 1] = s[i - 1] * hh[i][i - 1] + c[i - 1] * hh[i - 1][i - 1]; r_norm = hypre_abs(rs[i]); /* print ? */ if ( print_level > 0 ) { norms[iter] = r_norm; if ( print_level > 1 && my_id == 0 ) { if (b_norm > 0.0) hypre_printf("% 5d %e %f %e\n", iter, norms[iter], norms[iter] / norms[iter - 1], norms[iter] / b_norm); else hypre_printf("% 5d %e %f\n", iter, norms[iter], norms[iter] / norms[iter - 1]); } } /*convergence factor tolerance */ if (cf_tol > 0.0) { cf_ave_0 = cf_ave_1; cf_ave_1 = hypre_pow( r_norm / r_norm_0, 1.0 / (2.0 * iter)); weight = hypre_abs(cf_ave_1 - cf_ave_0); weight = weight / hypre_max(cf_ave_1, cf_ave_0); weight = 1.0 - weight; #if 0 hypre_printf("I = %d: cf_new = %e, cf_old = %e, weight = %e\n", i, cf_ave_1, cf_ave_0, weight ); #endif if (weight * cf_ave_1 > cf_tol) { break_value = 1; break; } } /* should we exit the restart cycle? (conv. check) */ if (r_norm <= epsilon && iter >= min_iter) { /* no relative change */ break; } } /*** end of restart cycle ***/ /* now compute solution, first solve upper triangular system */ if (break_value) { break; } rs[i - 1] = rs[i - 1] / hh[i - 1][i - 1]; for (k = i - 2; k >= 0; k--) { t = 0.0; for (j = k + 1; j < i; j++) { t -= hh[k][j] * rs[j]; } t += rs[k]; rs[k] = t / hh[k][k]; } /* form linear combination of pre_vecs's to get solution */ (*(fgmres_functions->CopyVector))(pre_vecs[i - 1], w); (*(fgmres_functions->ScaleVector))(rs[i - 1], w); for (j = i - 2; j >= 0; j--) { (*(fgmres_functions->Axpy))(rs[j], pre_vecs[j], w); } /* don't need to un-wind precond... - so now the correction is * in w */ /* update current solution x (in x) */ (*(fgmres_functions->Axpy))(1.0, w, x); /* check for convergence by evaluating the actual residual */ if (r_norm <= epsilon && iter >= min_iter) { /* calculate actual residual norm*/ (*(fgmres_functions->CopyVector))(b, r); (*(fgmres_functions->Matvec))(matvec_data, -1.0, A, x, 1.0, r); r_norm = hypre_sqrt( (*(fgmres_functions->InnerProd))(r, r) ); if (r_norm <= epsilon) { if ( print_level > 1 && my_id == 0 ) { hypre_printf("\n\n"); hypre_printf("Final L2 norm of residual: %e\n\n", r_norm); } (fgmres_data -> converged) = 1; break; } else /* conv. has not occurred, according to true residual */ { if ( print_level > 0 && my_id == 0) { hypre_printf("false convergence 2\n"); } (*(fgmres_functions->CopyVector))(r, p[0]); i = 0; } } /* end of convergence check */ /* compute residual vector and continue loop */ for (j = i ; j > 0; j--) { rs[j - 1] = -s[j - 1] * rs[j]; rs[j] = c[j - 1] * rs[j]; } if (i) { (*(fgmres_functions->Axpy))(rs[i] - 1.0, p[i], p[i]); } for (j = i - 1 ; j > 0; j--) { (*(fgmres_functions->Axpy))(rs[j], p[j], p[i]); } if (i) { (*(fgmres_functions->Axpy))(rs[0] - 1.0, p[0], p[0]); (*(fgmres_functions->Axpy))(1.0, p[i], p[0]); } } /* END of iteration while loop */ if ( print_level > 1 && my_id == 0 ) { hypre_printf("\n\n"); } (fgmres_data -> num_iterations) = iter; if (b_norm > 0.0) { (fgmres_data -> rel_residual_norm) = r_norm / b_norm; } if (b_norm == 0.0) { (fgmres_data -> rel_residual_norm) = r_norm; } if (iter >= max_iter && r_norm > epsilon && epsilon > 0) { hypre_error(HYPRE_ERROR_CONV); } hypre_TFreeF(c, fgmres_functions); hypre_TFreeF(s, fgmres_functions); hypre_TFreeF(rs, fgmres_functions); for (i = 0; i < k_dim + 1; i++) { hypre_TFreeF(hh[i], fgmres_functions); } hypre_TFreeF(hh, fgmres_functions); HYPRE_ANNOTATE_FUNC_END; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_FlexGMRESSetKDim, hypre_FlexGMRESGetKDim *--------------------------------------------------------------------------*/ HYPRE_Int hypre_FlexGMRESSetKDim( void *fgmres_vdata, HYPRE_Int k_dim ) { hypre_FlexGMRESData *fgmres_data = (hypre_FlexGMRESData *)fgmres_vdata; (fgmres_data -> k_dim) = k_dim; return hypre_error_flag; } HYPRE_Int hypre_FlexGMRESGetKDim( void *fgmres_vdata, HYPRE_Int * k_dim ) { hypre_FlexGMRESData *fgmres_data = (hypre_FlexGMRESData *)fgmres_vdata; *k_dim = (fgmres_data -> k_dim); return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_FlexGMRESSetTol, hypre_FlexGMRESGetTol *--------------------------------------------------------------------------*/ HYPRE_Int hypre_FlexGMRESSetTol( void *fgmres_vdata, HYPRE_Real tol ) { hypre_FlexGMRESData *fgmres_data = (hypre_FlexGMRESData *)fgmres_vdata; (fgmres_data -> tol) = tol; return hypre_error_flag; } HYPRE_Int hypre_FlexGMRESGetTol( void *fgmres_vdata, HYPRE_Real * tol ) { hypre_FlexGMRESData *fgmres_data = (hypre_FlexGMRESData *)fgmres_vdata; *tol = (fgmres_data -> tol); return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_FlexGMRESSetAbsoluteTol, hypre_FlexGMRESGetAbsoluteTol *--------------------------------------------------------------------------*/ HYPRE_Int hypre_FlexGMRESSetAbsoluteTol( void *fgmres_vdata, HYPRE_Real a_tol ) { hypre_FlexGMRESData *fgmres_data = (hypre_FlexGMRESData *)fgmres_vdata; (fgmres_data -> a_tol) = a_tol; return hypre_error_flag; } HYPRE_Int hypre_FlexGMRESGetAbsoluteTol( void *fgmres_vdata, HYPRE_Real * a_tol ) { hypre_FlexGMRESData *fgmres_data = (hypre_FlexGMRESData *)fgmres_vdata; *a_tol = (fgmres_data -> a_tol); return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_FlexGMRESSetConvergenceFactorTol, hypre_FlexGMRESGetConvergenceFactorTol *--------------------------------------------------------------------------*/ HYPRE_Int hypre_FlexGMRESSetConvergenceFactorTol( void *fgmres_vdata, HYPRE_Real cf_tol ) { hypre_FlexGMRESData *fgmres_data = (hypre_FlexGMRESData *)fgmres_vdata; (fgmres_data -> cf_tol) = cf_tol; return hypre_error_flag; } HYPRE_Int hypre_FlexGMRESGetConvergenceFactorTol( void *fgmres_vdata, HYPRE_Real * cf_tol ) { hypre_FlexGMRESData *fgmres_data = (hypre_FlexGMRESData *)fgmres_vdata; *cf_tol = (fgmres_data -> cf_tol); return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_FlexGMRESSetMinIter, hypre_FlexGMRESGetMinIter *--------------------------------------------------------------------------*/ HYPRE_Int hypre_FlexGMRESSetMinIter( void *fgmres_vdata, HYPRE_Int min_iter ) { hypre_FlexGMRESData *fgmres_data = (hypre_FlexGMRESData *)fgmres_vdata; (fgmres_data -> min_iter) = min_iter; return hypre_error_flag; } HYPRE_Int hypre_FlexGMRESGetMinIter( void *fgmres_vdata, HYPRE_Int * min_iter ) { hypre_FlexGMRESData *fgmres_data = (hypre_FlexGMRESData *)fgmres_vdata; *min_iter = (fgmres_data -> min_iter); return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_FlexGMRESSetMaxIter, hypre_FlexGMRESGetMaxIter *--------------------------------------------------------------------------*/ HYPRE_Int hypre_FlexGMRESSetMaxIter( void *fgmres_vdata, HYPRE_Int max_iter ) { hypre_FlexGMRESData *fgmres_data = (hypre_FlexGMRESData *)fgmres_vdata; (fgmres_data -> max_iter) = max_iter; return hypre_error_flag; } HYPRE_Int hypre_FlexGMRESGetMaxIter( void *fgmres_vdata, HYPRE_Int * max_iter ) { hypre_FlexGMRESData *fgmres_data = (hypre_FlexGMRESData *)fgmres_vdata; *max_iter = (fgmres_data -> max_iter); return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_FlexGMRESSetStopCrit, hypre_FlexGMRESGetStopCrit *--------------------------------------------------------------------------*/ HYPRE_Int hypre_FlexGMRESSetStopCrit( void *fgmres_vdata, HYPRE_Int stop_crit ) { hypre_FlexGMRESData *fgmres_data = (hypre_FlexGMRESData *)fgmres_vdata; (fgmres_data -> stop_crit) = stop_crit; return hypre_error_flag; } HYPRE_Int hypre_FlexGMRESGetStopCrit( void *fgmres_vdata, HYPRE_Int * stop_crit ) { hypre_FlexGMRESData *fgmres_data = (hypre_FlexGMRESData *)fgmres_vdata; *stop_crit = (fgmres_data -> stop_crit); return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_FlexGMRESSetPrecond *--------------------------------------------------------------------------*/ HYPRE_Int hypre_FlexGMRESSetPrecond( void *fgmres_vdata, HYPRE_Int (*precond)(void*, void*, void*, void*), HYPRE_Int (*precond_setup)(void*, void*, void*, void*), void *precond_data ) { hypre_FlexGMRESData *fgmres_data = (hypre_FlexGMRESData *)fgmres_vdata; hypre_FlexGMRESFunctions *fgmres_functions = fgmres_data->functions; (fgmres_functions -> precond) = precond; (fgmres_functions -> precond_setup) = precond_setup; (fgmres_data -> precond_data) = precond_data; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_FlexGMRESGetPrecond *--------------------------------------------------------------------------*/ HYPRE_Int hypre_FlexGMRESGetPrecond( void *fgmres_vdata, HYPRE_Solver *precond_data_ptr ) { hypre_FlexGMRESData *fgmres_data = (hypre_FlexGMRESData *)fgmres_vdata; *precond_data_ptr = (HYPRE_Solver)(fgmres_data -> precond_data); return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_FlexGMRESSetPrintLevel, hypre_FlexGMRESGetPrintLevel *--------------------------------------------------------------------------*/ HYPRE_Int hypre_FlexGMRESSetPrintLevel( void *fgmres_vdata, HYPRE_Int level) { hypre_FlexGMRESData *fgmres_data = (hypre_FlexGMRESData *)fgmres_vdata; (fgmres_data -> print_level) = level; return hypre_error_flag; } HYPRE_Int hypre_FlexGMRESGetPrintLevel( void *fgmres_vdata, HYPRE_Int * level) { hypre_FlexGMRESData *fgmres_data = (hypre_FlexGMRESData *)fgmres_vdata; *level = (fgmres_data -> print_level); return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_FlexGMRESSetLogging, hypre_FlexGMRESGetLogging *--------------------------------------------------------------------------*/ HYPRE_Int hypre_FlexGMRESSetLogging( void *fgmres_vdata, HYPRE_Int level) { hypre_FlexGMRESData *fgmres_data = (hypre_FlexGMRESData *)fgmres_vdata; (fgmres_data -> logging) = level; return hypre_error_flag; } HYPRE_Int hypre_FlexGMRESGetLogging( void *fgmres_vdata, HYPRE_Int * level) { hypre_FlexGMRESData *fgmres_data = (hypre_FlexGMRESData *)fgmres_vdata; *level = (fgmres_data -> logging); return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_FlexGMRESGetNumIterations *--------------------------------------------------------------------------*/ HYPRE_Int hypre_FlexGMRESGetNumIterations( void *fgmres_vdata, HYPRE_Int *num_iterations ) { hypre_FlexGMRESData *fgmres_data = (hypre_FlexGMRESData *)fgmres_vdata; *num_iterations = (fgmres_data -> num_iterations); return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_FlexGMRESGetConverged *--------------------------------------------------------------------------*/ HYPRE_Int hypre_FlexGMRESGetConverged( void *fgmres_vdata, HYPRE_Int *converged ) { hypre_FlexGMRESData *fgmres_data = (hypre_FlexGMRESData *)fgmres_vdata; *converged = (fgmres_data -> converged); return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_FlexGMRESGetFinalRelativeResidualNorm *--------------------------------------------------------------------------*/ HYPRE_Int hypre_FlexGMRESGetFinalRelativeResidualNorm( void *fgmres_vdata, HYPRE_Real *relative_residual_norm ) { hypre_FlexGMRESData *fgmres_data = (hypre_FlexGMRESData *)fgmres_vdata; *relative_residual_norm = (fgmres_data -> rel_residual_norm); return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_FlexGMRESSetModifyPC *--------------------------------------------------------------------------*/ HYPRE_Int hypre_FlexGMRESSetModifyPC(void *fgmres_vdata, HYPRE_Int (*modify_pc)(void*, HYPRE_Int, HYPRE_Real)) { hypre_FlexGMRESData *fgmres_data = (hypre_FlexGMRESData *)fgmres_vdata; hypre_FlexGMRESFunctions *fgmres_functions = fgmres_data->functions; (fgmres_functions -> modify_pc) = modify_pc; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_FlexGMRESModifyPCDefault - if the user does not specify a function *--------------------------------------------------------------------------*/ HYPRE_Int hypre_FlexGMRESModifyPCDefault(void *precond_data, HYPRE_Int iteration, HYPRE_Real rel_residual_norm) { /* TODO - Here could check the number of its and the current residual and make some changes to the preconditioner. There is an example in ex5.c.*/ HYPRE_UNUSED_VAR(precond_data); HYPRE_UNUSED_VAR(iteration); HYPRE_UNUSED_VAR(rel_residual_norm); return 0; } hypre-2.33.0/src/krylov/flexgmres.h000066400000000000000000000116521477326011500172230ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * FLEXGMRES flexible gmres * *****************************************************************************/ #ifndef hypre_KRYLOV_FLEXGMRES_HEADER #define hypre_KRYLOV_FLEXGMRES_HEADER /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ /** * @name Generic FlexGMRES Interface * * A general description of the interface goes here... * **/ /*@{*/ /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ /*-------------------------------------------------------------------------- * hypre_FlexGMRESData and hypre_FlexGMRESFunctions *--------------------------------------------------------------------------*/ /** * @name FlexGMRES structs * * Description... **/ /*@{*/ /** * The {\tt hypre\_FlexGMRESFunctions} object ... **/ typedef struct { void * (*CAlloc) ( size_t count, size_t elt_size ); HYPRE_Int (*Free) ( void *ptr ); HYPRE_Int (*CommInfo) ( void *A, HYPRE_Int *my_id, HYPRE_Int *num_procs ); void * (*CreateVector) ( void *vector ); void * (*CreateVectorArray) ( HYPRE_Int size, void *vectors ); HYPRE_Int (*DestroyVector) ( void *vector ); void * (*MatvecCreate) ( void *A, void *x ); HYPRE_Int (*Matvec) ( void *matvec_data, HYPRE_Complex alpha, void *A, void *x, HYPRE_Complex beta, void *y ); HYPRE_Int (*MatvecDestroy) ( void *matvec_data ); HYPRE_Real (*InnerProd) ( void *x, void *y ); HYPRE_Int (*CopyVector) ( void *x, void *y ); HYPRE_Int (*ClearVector) ( void *x ); HYPRE_Int (*ScaleVector) ( HYPRE_Complex alpha, void *x ); HYPRE_Int (*Axpy) ( HYPRE_Complex alpha, void *x, void *y ); HYPRE_Int (*precond)(void *vdata, void *A, void *b, void *x ); HYPRE_Int (*precond_setup)(void *vdata, void *A, void *b, void *x ); HYPRE_Int (*modify_pc)(void *precond_data, HYPRE_Int iteration, HYPRE_Real rel_residual_norm ); } hypre_FlexGMRESFunctions; /** * The {\tt hypre\_FlexGMRESData} object ... **/ typedef struct { HYPRE_Int k_dim; HYPRE_Int min_iter; HYPRE_Int max_iter; HYPRE_Int rel_change; HYPRE_Int stop_crit; HYPRE_Int converged; HYPRE_Real tol; HYPRE_Real cf_tol; HYPRE_Real a_tol; HYPRE_Real rel_residual_norm; void **pre_vecs; void *A; void *r; void *w; void *w_2; void **p; void *matvec_data; void *precond_data; hypre_FlexGMRESFunctions * functions; /* log info (always logged) */ HYPRE_Int num_iterations; HYPRE_Int print_level; /* printing when print_level>0 */ HYPRE_Int logging; /* extra computations for logging when logging>0 */ HYPRE_Real *norms; char *log_file_name; } hypre_FlexGMRESData; #ifdef __cplusplus extern "C" { #endif /** * @name generic FlexGMRES Solver * * Description... **/ /*@{*/ /** * Description... * * @param param [IN] ... **/ hypre_FlexGMRESFunctions * hypre_FlexGMRESFunctionsCreate( void * (*CAlloc) ( size_t count, size_t elt_size ), HYPRE_Int (*Free) ( void *ptr ), HYPRE_Int (*CommInfo) ( void *A, HYPRE_Int *my_id, HYPRE_Int *num_procs ), void * (*CreateVector) ( void *vector ), void * (*CreateVectorArray) ( HYPRE_Int size, void *vectors ), HYPRE_Int (*DestroyVector) ( void *vector ), void * (*MatvecCreate) ( void *A, void *x ), HYPRE_Int (*Matvec) ( void *matvec_data, HYPRE_Complex alpha, void *A, void *x, HYPRE_Complex beta, void *y ), HYPRE_Int (*MatvecDestroy) ( void *matvec_data ), HYPRE_Real (*InnerProd) ( void *x, void *y ), HYPRE_Int (*CopyVector) ( void *x, void *y ), HYPRE_Int (*ClearVector) ( void *x ), HYPRE_Int (*ScaleVector) ( HYPRE_Complex alpha, void *x ), HYPRE_Int (*Axpy) ( HYPRE_Complex alpha, void *x, void *y ), HYPRE_Int (*PrecondSetup) ( void *vdata, void *A, void *b, void *x ), HYPRE_Int (*Precond) ( void *vdata, void *A, void *b, void *x ) ); /** * Description... * * @param param [IN] ... **/ void * hypre_FlexGMRESCreate( hypre_FlexGMRESFunctions *fgmres_functions ); #ifdef __cplusplus } #endif #endif hypre-2.33.0/src/krylov/gmres.c000066400000000000000000001246671477326011500163520ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * GMRES gmres * *****************************************************************************/ #include "krylov.h" #include "_hypre_utilities.h" /*-------------------------------------------------------------------------- * hypre_GMRESFunctionsCreate *--------------------------------------------------------------------------*/ hypre_GMRESFunctions * hypre_GMRESFunctionsCreate( void * (*CAlloc) ( size_t count, size_t elt_size, HYPRE_MemoryLocation location ), HYPRE_Int (*Free) ( void *ptr ), HYPRE_Int (*CommInfo) ( void *A, HYPRE_Int *my_id, HYPRE_Int *num_procs ), void * (*CreateVector) ( void *vector ), void * (*CreateVectorArray) ( HYPRE_Int size, void *vectors ), HYPRE_Int (*DestroyVector) ( void *vector ), void * (*MatvecCreate) ( void *A, void *x ), HYPRE_Int (*Matvec) ( void *matvec_data, HYPRE_Complex alpha, void *A, void *x, HYPRE_Complex beta, void *y ), HYPRE_Int (*MatvecDestroy) ( void *matvec_data ), HYPRE_Real (*InnerProd) ( void *x, void *y ), HYPRE_Int (*CopyVector) ( void *x, void *y ), HYPRE_Int (*ClearVector) ( void *x ), HYPRE_Int (*ScaleVector) ( HYPRE_Complex alpha, void *x ), HYPRE_Int (*Axpy) ( HYPRE_Complex alpha, void *x, void *y ), HYPRE_Int (*PrecondSetup) ( void *vdata, void *A, void *b, void *x ), HYPRE_Int (*Precond) ( void *vdata, void *A, void *b, void *x ) ) { hypre_GMRESFunctions * gmres_functions; gmres_functions = (hypre_GMRESFunctions *) CAlloc( 1, sizeof(hypre_GMRESFunctions), HYPRE_MEMORY_HOST ); gmres_functions->CAlloc = CAlloc; gmres_functions->Free = Free; gmres_functions->CommInfo = CommInfo; /* not in PCGFunctionsCreate */ gmres_functions->CreateVector = CreateVector; gmres_functions->CreateVectorArray = CreateVectorArray; /* not in PCGFunctionsCreate */ gmres_functions->DestroyVector = DestroyVector; gmres_functions->MatvecCreate = MatvecCreate; gmres_functions->Matvec = Matvec; gmres_functions->MatvecDestroy = MatvecDestroy; gmres_functions->InnerProd = InnerProd; gmres_functions->CopyVector = CopyVector; gmres_functions->ClearVector = ClearVector; gmres_functions->ScaleVector = ScaleVector; gmres_functions->Axpy = Axpy; /* default preconditioner must be set here but can be changed later... */ gmres_functions->precond_setup = PrecondSetup; gmres_functions->precond = Precond; return gmres_functions; } /*-------------------------------------------------------------------------- * hypre_GMRESCreate *--------------------------------------------------------------------------*/ void * hypre_GMRESCreate( hypre_GMRESFunctions *gmres_functions ) { hypre_GMRESData *gmres_data; HYPRE_ANNOTATE_FUNC_BEGIN; gmres_data = hypre_CTAllocF(hypre_GMRESData, 1, gmres_functions, HYPRE_MEMORY_HOST); gmres_data->functions = gmres_functions; /* set defaults */ (gmres_data -> k_dim) = 5; (gmres_data -> tol) = 1.0e-06; /* relative residual tol */ (gmres_data -> cf_tol) = 0.0; (gmres_data -> a_tol) = 0.0; /* abs. residual tol */ (gmres_data -> min_iter) = 0; (gmres_data -> max_iter) = 1000; (gmres_data -> rel_change) = 0; (gmres_data -> skip_real_r_check) = 0; (gmres_data -> stop_crit) = 0; /* rel. residual norm - this is obsolete!*/ (gmres_data -> converged) = 0; (gmres_data -> hybrid) = 0; (gmres_data -> precond_data) = NULL; (gmres_data -> print_level) = 0; (gmres_data -> logging) = 0; (gmres_data -> p) = NULL; (gmres_data -> r) = NULL; (gmres_data -> w) = NULL; (gmres_data -> w_2) = NULL; (gmres_data -> matvec_data) = NULL; (gmres_data -> norms) = NULL; (gmres_data -> log_file_name) = NULL; HYPRE_ANNOTATE_FUNC_END; return (void *) gmres_data; } /*-------------------------------------------------------------------------- * hypre_GMRESDestroy *--------------------------------------------------------------------------*/ HYPRE_Int hypre_GMRESDestroy( void *gmres_vdata ) { hypre_GMRESData *gmres_data = (hypre_GMRESData *)gmres_vdata; HYPRE_Int i; HYPRE_ANNOTATE_FUNC_BEGIN; if (gmres_data) { hypre_GMRESFunctions *gmres_functions = gmres_data->functions; if ( (gmres_data->logging > 0) || (gmres_data->print_level) > 0 ) { if ( (gmres_data -> norms) != NULL ) { hypre_TFreeF( gmres_data -> norms, gmres_functions ); } } if ( (gmres_data -> matvec_data) != NULL ) { (*(gmres_functions->MatvecDestroy))(gmres_data -> matvec_data); } if ( (gmres_data -> r) != NULL ) { (*(gmres_functions->DestroyVector))(gmres_data -> r); } if ( (gmres_data -> w) != NULL ) { (*(gmres_functions->DestroyVector))(gmres_data -> w); } if ( (gmres_data -> w_2) != NULL ) { (*(gmres_functions->DestroyVector))(gmres_data -> w_2); } if ( (gmres_data -> p) != NULL ) { for (i = 0; i < (gmres_data -> k_dim + 1); i++) { if ( (gmres_data -> p)[i] != NULL ) { (*(gmres_functions->DestroyVector))( (gmres_data -> p) [i]); } } hypre_TFreeF( gmres_data->p, gmres_functions ); } hypre_TFreeF( gmres_data, gmres_functions ); hypre_TFreeF( gmres_functions, gmres_functions ); } HYPRE_ANNOTATE_FUNC_END; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_GMRESGetResidual *--------------------------------------------------------------------------*/ HYPRE_Int hypre_GMRESGetResidual( void *gmres_vdata, void **residual ) { hypre_GMRESData *gmres_data = (hypre_GMRESData *)gmres_vdata; *residual = gmres_data->r; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_GMRESSetup *--------------------------------------------------------------------------*/ HYPRE_Int hypre_GMRESSetup( void *gmres_vdata, void *A, void *b, void *x ) { hypre_GMRESData *gmres_data = (hypre_GMRESData *)gmres_vdata; hypre_GMRESFunctions *gmres_functions = (gmres_data -> functions); HYPRE_Int k_dim = (gmres_data -> k_dim); HYPRE_Int max_iter = (gmres_data -> max_iter); void *precond_data = (gmres_data -> precond_data); HYPRE_Int rel_change = (gmres_data -> rel_change); HYPRE_Int (*precond_setup)(void*, void*, void*, void*) = (gmres_functions->precond_setup); HYPRE_ANNOTATE_FUNC_BEGIN; (gmres_data -> A) = A; /*-------------------------------------------------- * The arguments for NewVector are important to * maintain consistency between the setup and * compute phases of matvec and the preconditioner. *--------------------------------------------------*/ if ((gmres_data -> p) == NULL) { (gmres_data -> p) = (void**)(*(gmres_functions->CreateVectorArray))(k_dim + 1, x); } if ((gmres_data -> r) == NULL) { (gmres_data -> r) = (*(gmres_functions->CreateVector))(b); } if ((gmres_data -> w) == NULL) { (gmres_data -> w) = (*(gmres_functions->CreateVector))(b); } if (rel_change) { if ((gmres_data -> w_2) == NULL) { (gmres_data -> w_2) = (*(gmres_functions->CreateVector))(b); } } if ((gmres_data -> matvec_data) == NULL) { (gmres_data -> matvec_data) = (*(gmres_functions->MatvecCreate))(A, x); } precond_setup(precond_data, A, b, x); /*----------------------------------------------------- * Allocate space for log info *-----------------------------------------------------*/ if ( (gmres_data->logging) > 0 || (gmres_data->print_level) > 0 ) { if ((gmres_data -> norms) != NULL) { hypre_TFreeF(gmres_data -> norms, gmres_functions); } (gmres_data -> norms) = hypre_CTAllocF(HYPRE_Real, max_iter + 1, gmres_functions, HYPRE_MEMORY_HOST); } if ( (gmres_data->print_level) > 0 ) { if ((gmres_data -> log_file_name) == NULL) { (gmres_data -> log_file_name) = (char*)"gmres.out.log"; } } HYPRE_ANNOTATE_FUNC_END; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_GMRESSolve *-------------------------------------------------------------------------*/ HYPRE_Int hypre_GMRESSolve(void *gmres_vdata, void *A, void *b, void *x) { hypre_GMRESData *gmres_data = (hypre_GMRESData *)gmres_vdata; hypre_GMRESFunctions *gmres_functions = (gmres_data -> functions); HYPRE_Int k_dim = (gmres_data -> k_dim); HYPRE_Int min_iter = (gmres_data -> min_iter); HYPRE_Int max_iter = (gmres_data -> max_iter); HYPRE_Int rel_change = (gmres_data -> rel_change); HYPRE_Int skip_real_r_check = (gmres_data -> skip_real_r_check); HYPRE_Int hybrid = (gmres_data -> hybrid); HYPRE_Real r_tol = (gmres_data -> tol); HYPRE_Real cf_tol = (gmres_data -> cf_tol); HYPRE_Real a_tol = (gmres_data -> a_tol); void *matvec_data = (gmres_data -> matvec_data); void *r = (gmres_data -> r); void *w = (gmres_data -> w); /* note: w_2 is only allocated if rel_change = 1 */ void *w_2 = (gmres_data -> w_2); void **p = (gmres_data -> p); HYPRE_Int (*precond)(void*, void*, void*, void*) = (gmres_functions -> precond); HYPRE_Int *precond_data = (HYPRE_Int*) (gmres_data -> precond_data); HYPRE_Int print_level = (gmres_data -> print_level); HYPRE_Int logging = (gmres_data -> logging); HYPRE_Real *norms = (gmres_data -> norms); /* not used yet char *log_file_name = (gmres_data -> log_file_name);*/ /* FILE *fp; */ HYPRE_Int break_value = 0; HYPRE_Int i, j, k; HYPRE_Real *rs, **hh, *c, *s, *rs_2 = NULL; HYPRE_Int iter; HYPRE_Int my_id, num_procs; HYPRE_Real epsilon, gamma, t, r_norm, b_norm, den_norm, x_norm; HYPRE_Real w_norm; HYPRE_Real epsmac = 1.e-16; HYPRE_Real ieee_check = 0.; HYPRE_Real guard_zero_residual; HYPRE_Real cf_ave_0 = 0.0; HYPRE_Real cf_ave_1 = 0.0; HYPRE_Real weight; HYPRE_Real r_norm_0; HYPRE_Real relative_error = 1.0; HYPRE_Int rel_change_passed = 0, num_rel_change_check = 0; HYPRE_Real real_r_norm_old, real_r_norm_new; HYPRE_ANNOTATE_FUNC_BEGIN; (gmres_data -> converged) = 0; /*----------------------------------------------------------------------- * With relative change convergence test on, it is possible to attempt * another iteration with a zero residual. This causes the parameter * alpha to go NaN. The guard_zero_residual parameter is to circumvent * this. Perhaps it should be set to something non-zero (but small). *-----------------------------------------------------------------------*/ guard_zero_residual = 0.0; (*(gmres_functions->CommInfo))(A, &my_id, &num_procs); if ( logging > 0 || print_level > 0 ) { norms = (gmres_data -> norms); } /* initialize work arrays */ rs = hypre_CTAllocF(HYPRE_Real, k_dim + 1, gmres_functions, HYPRE_MEMORY_HOST); c = hypre_CTAllocF(HYPRE_Real, k_dim, gmres_functions, HYPRE_MEMORY_HOST); s = hypre_CTAllocF(HYPRE_Real, k_dim, gmres_functions, HYPRE_MEMORY_HOST); if (rel_change) { rs_2 = hypre_CTAllocF(HYPRE_Real, k_dim + 1, gmres_functions, HYPRE_MEMORY_HOST); } hh = hypre_CTAllocF(HYPRE_Real*, k_dim + 1, gmres_functions, HYPRE_MEMORY_HOST); for (i = 0; i < k_dim + 1; i++) { hh[i] = hypre_CTAllocF(HYPRE_Real, k_dim, gmres_functions, HYPRE_MEMORY_HOST); } (*(gmres_functions->CopyVector))(b, p[0]); /* compute initial residual */ (*(gmres_functions->Matvec))(matvec_data, -1.0, A, x, 1.0, p[0]); b_norm = hypre_sqrt((*(gmres_functions->InnerProd))(b, b)); real_r_norm_old = b_norm; /* Since it does not diminish performance, attempt to return an error flag and notify users when they supply bad input. */ if (b_norm != 0.) { ieee_check = b_norm / b_norm; /* INF -> NaN conversion */ } if (ieee_check != ieee_check) { /* ...INFs or NaNs in input can make ieee_check a NaN. This test for ieee_check self-equality works on all IEEE-compliant compilers/ machines, c.f. page 8 of "Lecture Notes on the Status of IEEE 754" by W. Kahan, May 31, 1996. Currently (July 2002) this paper may be found at http://HTTP.CS.Berkeley.EDU/~wkahan/ieee754status/IEEE754.PDF */ if (logging > 0 || print_level > 0) { hypre_printf("\n\nERROR detected by Hypre ... BEGIN\n"); hypre_printf("ERROR -- hypre_GMRESSolve: INFs and/or NaNs detected in input.\n"); hypre_printf("User probably placed non-numerics in supplied b.\n"); hypre_printf("Returning error flag += 101. Program not terminated.\n"); hypre_printf("ERROR detected by Hypre ... END\n\n\n"); } hypre_error(HYPRE_ERROR_GENERIC); HYPRE_ANNOTATE_FUNC_END; return hypre_error_flag; } r_norm = hypre_sqrt((*(gmres_functions->InnerProd))(p[0], p[0])); r_norm_0 = r_norm; /* Since it does not diminish performance, attempt to return an error flag and notify users when they supply bad input. */ if (r_norm != 0.) { ieee_check = r_norm / r_norm; /* INF -> NaN conversion */ } if (ieee_check != ieee_check) { /* ...INFs or NaNs in input can make ieee_check a NaN. This test for ieee_check self-equality works on all IEEE-compliant compilers/ machines, c.f. page 8 of "Lecture Notes on the Status of IEEE 754" by W. Kahan, May 31, 1996. Currently (July 2002) this paper may be found at http://HTTP.CS.Berkeley.EDU/~wkahan/ieee754status/IEEE754.PDF */ if (logging > 0 || print_level > 0) { hypre_printf("\n\nERROR detected by Hypre ... BEGIN\n"); hypre_printf("ERROR -- hypre_GMRESSolve: INFs and/or NaNs detected in input.\n"); hypre_printf("User probably placed non-numerics in supplied A or x_0.\n"); hypre_printf("Returning error flag += 101. Program not terminated.\n"); hypre_printf("ERROR detected by Hypre ... END\n\n\n"); } hypre_error(HYPRE_ERROR_GENERIC); HYPRE_ANNOTATE_FUNC_END; return hypre_error_flag; } if ( logging > 0 || print_level > 0) { norms[0] = r_norm; if ( print_level > 1 && my_id == 0 ) { hypre_printf("L2 norm of b: %e\n", b_norm); if (b_norm == 0.0) { hypre_printf("Rel_resid_norm actually contains the residual norm\n"); } hypre_printf("Initial L2 norm of residual: %e\n", r_norm); } } iter = 0; if (b_norm > 0.0) { /* convergence criterion |r_i|/|b| <= accuracy if |b| > 0 */ den_norm = b_norm; } else { /* convergence criterion |r_i|/|r0| <= accuracy if |b| = 0 */ den_norm = r_norm; } /* convergence criteria: |r_i| <= max( a_tol, r_tol * den_norm) den_norm = |r_0| or |b| note: default for a_tol is 0.0, so relative residual criteria is used unless user specifies a_tol, or sets r_tol = 0.0, which means absolute tol only is checked */ epsilon = hypre_max(a_tol, r_tol * den_norm); /* so now our stop criteria is |r_i| <= epsilon */ if ( print_level > 1 && my_id == 0 ) { if (b_norm > 0.0) { hypre_printf("=============================================\n\n"); hypre_printf("Iters resid.norm conv.rate rel.res.norm\n"); hypre_printf("----- ------------ ---------- ------------\n"); } else { hypre_printf("=============================================\n\n"); hypre_printf("Iters resid.norm conv.rate\n"); hypre_printf("----- ------------ ----------\n"); } } /* once the rel. change check has passed, we do not want to check it again */ rel_change_passed = 0; /* outer iteration cycle */ while (iter < max_iter) { /* initialize first term of hessenberg system */ rs[0] = r_norm; if (r_norm == 0.0) { hypre_TFreeF(c, gmres_functions); hypre_TFreeF(s, gmres_functions); hypre_TFreeF(rs, gmres_functions); if (rel_change) { hypre_TFreeF(rs_2, gmres_functions); } for (i = 0; i < k_dim + 1; i++) { hypre_TFreeF(hh[i], gmres_functions); } hypre_TFreeF(hh, gmres_functions); (gmres_data -> num_iterations) = iter; HYPRE_ANNOTATE_FUNC_END; return hypre_error_flag; } /* see if we are already converged and should print the final norm and exit */ if (r_norm <= epsilon && iter >= min_iter) { if (!rel_change) /* shouldn't exit after no iterations if * relative change is on*/ { (*(gmres_functions->CopyVector))(b, r); (*(gmres_functions->Matvec))(matvec_data, -1.0, A, x, 1.0, r); r_norm = hypre_sqrt((*(gmres_functions->InnerProd))(r, r)); if (r_norm <= epsilon) { if ( print_level > 1 && my_id == 0) { hypre_printf("\n\n"); hypre_printf("Final L2 norm of residual: %e\n\n", r_norm); } break; } else { if ( print_level > 0 && my_id == 0) { hypre_printf("false convergence 1\n"); } } } } t = 1.0 / r_norm; (*(gmres_functions->ScaleVector))(t, p[0]); i = 0; /***RESTART CYCLE (right-preconditioning) ***/ while (i < k_dim && iter < max_iter) { i++; iter++; (*(gmres_functions->ClearVector))(r); precond(precond_data, A, p[i - 1], r); (*(gmres_functions->Matvec))(matvec_data, 1.0, A, r, 0.0, p[i]); /* modified Gram_Schmidt */ for (j = 0; j < i; j++) { hh[j][i - 1] = (*(gmres_functions->InnerProd))(p[j], p[i]); (*(gmres_functions->Axpy))(-hh[j][i - 1], p[j], p[i]); } t = hypre_sqrt((*(gmres_functions->InnerProd))(p[i], p[i])); hh[i][i - 1] = t; if (t != 0.0) { t = 1.0 / t; (*(gmres_functions->ScaleVector))(t, p[i]); } /* done with modified Gram_schmidt and Arnoldi step. update factorization of hh */ for (j = 1; j < i; j++) { t = hh[j - 1][i - 1]; hh[j - 1][i - 1] = s[j - 1] * hh[j][i - 1] + c[j - 1] * t; hh[j][i - 1] = -s[j - 1] * t + c[j - 1] * hh[j][i - 1]; } t = hh[i][i - 1] * hh[i][i - 1]; t += hh[i - 1][i - 1] * hh[i - 1][i - 1]; gamma = hypre_sqrt(t); if (gamma == 0.0) { gamma = epsmac; } c[i - 1] = hh[i - 1][i - 1] / gamma; s[i - 1] = hh[i][i - 1] / gamma; rs[i] = -hh[i][i - 1] * rs[i - 1]; rs[i] /= gamma; rs[i - 1] = c[i - 1] * rs[i - 1]; /* determine residual norm */ hh[i - 1][i - 1] = s[i - 1] * hh[i][i - 1] + c[i - 1] * hh[i - 1][i - 1]; r_norm = hypre_abs(rs[i]); /* print ? */ if ( print_level > 0 ) { norms[iter] = r_norm; if ( print_level > 1 && my_id == 0 ) { if (b_norm > 0.0) { hypre_printf("% 5d %e %f %e\n", iter, norms[iter], norms[iter] / norms[iter - 1], norms[iter] / b_norm); } else { hypre_printf("% 5d %e %f\n", iter, norms[iter], norms[iter] / norms[iter - 1]); } } } /*convergence factor tolerance */ if (cf_tol > 0.0) { cf_ave_0 = cf_ave_1; cf_ave_1 = hypre_pow( r_norm / r_norm_0, 1.0 / (2.0 * iter)); weight = hypre_abs(cf_ave_1 - cf_ave_0); weight = weight / hypre_max(cf_ave_1, cf_ave_0); weight = 1.0 - weight; #if 0 hypre_printf("I = %d: cf_new = %e, cf_old = %e, weight = %e\n", i, cf_ave_1, cf_ave_0, weight ); #endif if (weight * cf_ave_1 > cf_tol) { break_value = 1; break; } } /* should we exit the restart cycle? (conv. check) */ if (r_norm <= epsilon && iter >= min_iter) { if (rel_change && !rel_change_passed) { /* To decide whether to break here: to actually determine the relative change requires the approx solution (so a triangular solve) and a precond. solve - so if we have to do this many times, it will be expensive...(unlike cg where is is relatively straightforward) previously, the intent (there was a bug), was to exit the restart cycle based on the residual norm and check the relative change outside the cycle. Here we will check the relative here as we don't want to exit the restart cycle prematurely */ for (k = 0; k < i; k++) { /* extra copy of rs so we don't need to change the later solve */ rs_2[k] = rs[k]; } /* solve tri. system*/ rs_2[i - 1] = rs_2[i - 1] / hh[i - 1][i - 1]; for (k = i - 2; k >= 0; k--) { t = 0.0; for (j = k + 1; j < i; j++) { t -= hh[k][j] * rs_2[j]; } t += rs_2[k]; rs_2[k] = t / hh[k][k]; } (*(gmres_functions->CopyVector))(p[i - 1], w); (*(gmres_functions->ScaleVector))(rs_2[i - 1], w); for (j = i - 2; j >= 0; j--) { (*(gmres_functions->Axpy))(rs_2[j], p[j], w); } (*(gmres_functions->ClearVector))(r); /* find correction (in r) */ precond(precond_data, A, w, r); /* copy current solution (x) to w (don't want to over-write x)*/ (*(gmres_functions->CopyVector))(x, w); /* add the correction */ (*(gmres_functions->Axpy))(1.0, r, w); /* now w is the approx solution - get the norm*/ x_norm = hypre_sqrt( (*(gmres_functions->InnerProd))(w, w) ); if ( !(x_norm <= guard_zero_residual )) /* don't divide by zero */ { /* now get x_i - x_i-1 */ if (num_rel_change_check) { /* have already checked once so we can avoid another precond. solve */ (*(gmres_functions->CopyVector))(w, r); (*(gmres_functions->Axpy))(-1.0, w_2, r); /* now r contains x_i - x_i-1*/ /* save current soln w in w_2 for next time */ (*(gmres_functions->CopyVector))(w, w_2); } else { /* first time to check rel change*/ /* first save current soln w in w_2 for next time */ (*(gmres_functions->CopyVector))(w, w_2); /* for relative change take x_(i-1) to be x + M^{-1}[sum{j=0..i-2} rs_j p_j ]. Now x_i - x_{i-1}= {x + M^{-1}[sum{j=0..i-1} rs_j p_j ]} - {x + M^{-1}[sum{j=0..i-2} rs_j p_j ]} = M^{-1} rs_{i-1}{p_{i-1}} */ (*(gmres_functions->ClearVector))(w); (*(gmres_functions->Axpy))(rs_2[i - 1], p[i - 1], w); (*(gmres_functions->ClearVector))(r); /* apply the preconditioner */ precond(precond_data, A, w, r); /* now r contains x_i - x_i-1 */ } /* find the norm of x_i - x_i-1 */ w_norm = hypre_sqrt( (*(gmres_functions->InnerProd))(r, r) ); relative_error = w_norm / x_norm; if (relative_error <= r_tol) { rel_change_passed = 1; break; } } else { rel_change_passed = 1; break; } num_rel_change_check++; } else /* no relative change */ { break; } } } /*** end of restart cycle ***/ /* now compute solution, first solve upper triangular system */ if (break_value) { break; } rs[i - 1] = rs[i - 1] / hh[i - 1][i - 1]; for (k = i - 2; k >= 0; k--) { t = 0.0; for (j = k + 1; j < i; j++) { t -= hh[k][j] * rs[j]; } t += rs[k]; rs[k] = t / hh[k][k]; } (*(gmres_functions->CopyVector))(p[i - 1], w); (*(gmres_functions->ScaleVector))(rs[i - 1], w); for (j = i - 2; j >= 0; j--) { (*(gmres_functions->Axpy))(rs[j], p[j], w); } (*(gmres_functions->ClearVector))(r); /* find correction (in r) */ precond(precond_data, A, w, r); /* update current solution x (in x) */ (*(gmres_functions->Axpy))(1.0, r, x); /* check for convergence by evaluating the actual residual */ if (r_norm <= epsilon && iter >= min_iter) { if (skip_real_r_check) { (gmres_data -> converged) = 1; break; } /* calculate actual residual norm*/ (*(gmres_functions->CopyVector))(b, r); (*(gmres_functions->Matvec))(matvec_data, -1.0, A, x, 1.0, r); real_r_norm_new = r_norm = hypre_sqrt( (*(gmres_functions->InnerProd))(r, r) ); if (r_norm <= epsilon) { if (rel_change && !rel_change_passed) /* calculate the relative change */ { /* calculate the norm of the solution */ x_norm = hypre_sqrt( (*(gmres_functions->InnerProd))(x, x) ); if ( !(x_norm <= guard_zero_residual )) /* don't divide by zero */ { /* for relative change take x_(i-1) to be x + M^{-1}[sum{j=0..i-2} rs_j p_j ]. Now x_i - x_{i-1}= {x + M^{-1}[sum{j=0..i-1} rs_j p_j ]} - {x + M^{-1}[sum{j=0..i-2} rs_j p_j ]} = M^{-1} rs_{i-1}{p_{i-1}} */ (*(gmres_functions->ClearVector))(w); (*(gmres_functions->Axpy))(rs[i - 1], p[i - 1], w); (*(gmres_functions->ClearVector))(r); /* apply the preconditioner */ precond(precond_data, A, w, r); /* find the norm of x_i - x_i-1 */ w_norm = hypre_sqrt( (*(gmres_functions->InnerProd))(r, r) ); relative_error = w_norm / x_norm; if ( relative_error < r_tol ) { (gmres_data -> converged) = 1; if ( print_level > 1 && my_id == 0 ) { hypre_printf("\n\n"); hypre_printf("Final L2 norm of residual: %e\n\n", r_norm); } break; } } else { (gmres_data -> converged) = 1; if ( print_level > 1 && my_id == 0 ) { hypre_printf("\n\n"); hypre_printf("Final L2 norm of residual: %e\n\n", r_norm); } break; } } else /* don't need to check rel. change */ { if ( print_level > 1 && my_id == 0 ) { hypre_printf("\n\n"); hypre_printf("Final L2 norm of residual: %e\n\n", r_norm); } (gmres_data -> converged) = 1; break; } } else /* conv. has not occurred, according to true residual */ { /* exit if the real residual norm has not decreased */ if (real_r_norm_new >= real_r_norm_old) { if (print_level > 1 && my_id == 0) { hypre_printf("\n\n"); hypre_printf("Final L2 norm of residual: %e\n\n", r_norm); } (gmres_data -> converged) = 1; break; } /* report discrepancy between real/GMRES residuals and restart */ if ( print_level > 0 && my_id == 0) { hypre_printf("false convergence 2, L2 norm of residual: %e\n", r_norm); } (*(gmres_functions->CopyVector))(r, p[0]); i = 0; real_r_norm_old = real_r_norm_new; } } /* end of convergence check */ /* compute residual vector and continue loop */ for (j = i ; j > 0; j--) { rs[j - 1] = -s[j - 1] * rs[j]; rs[j] = c[j - 1] * rs[j]; } if (i) { (*(gmres_functions->Axpy))(rs[i] - 1.0, p[i], p[i]); } for (j = i - 1 ; j > 0; j--) { (*(gmres_functions->Axpy))(rs[j], p[j], p[i]); } if (i) { (*(gmres_functions->Axpy))(rs[0] - 1.0, p[0], p[0]); (*(gmres_functions->Axpy))(1.0, p[i], p[0]); } } /* END of iteration while loop */ if ( print_level > 1 && my_id == 0 ) { hypre_printf("\n\n"); } (gmres_data -> num_iterations) = iter; if (b_norm > 0.0) { (gmres_data -> rel_residual_norm) = r_norm / b_norm; } if (b_norm == 0.0) { (gmres_data -> rel_residual_norm) = r_norm; } if (iter >= max_iter && r_norm > epsilon && epsilon > 0 && hybrid != -1) { hypre_error(HYPRE_ERROR_CONV); } hypre_TFreeF(c, gmres_functions); hypre_TFreeF(s, gmres_functions); hypre_TFreeF(rs, gmres_functions); if (rel_change) { hypre_TFreeF(rs_2, gmres_functions); } for (i = 0; i < k_dim + 1; i++) { hypre_TFreeF(hh[i], gmres_functions); } hypre_TFreeF(hh, gmres_functions); HYPRE_ANNOTATE_FUNC_END; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_GMRESSetKDim, hypre_GMRESGetKDim *--------------------------------------------------------------------------*/ HYPRE_Int hypre_GMRESSetKDim( void *gmres_vdata, HYPRE_Int k_dim ) { hypre_GMRESData *gmres_data = (hypre_GMRESData *) gmres_vdata; (gmres_data -> k_dim) = k_dim; return hypre_error_flag; } HYPRE_Int hypre_GMRESGetKDim( void *gmres_vdata, HYPRE_Int *k_dim ) { hypre_GMRESData *gmres_data = (hypre_GMRESData *)gmres_vdata; *k_dim = (gmres_data -> k_dim); return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_GMRESSetTol, hypre_GMRESGetTol *--------------------------------------------------------------------------*/ HYPRE_Int hypre_GMRESSetTol( void *gmres_vdata, HYPRE_Real tol ) { hypre_GMRESData *gmres_data = (hypre_GMRESData *)gmres_vdata; (gmres_data -> tol) = tol; return hypre_error_flag; } HYPRE_Int hypre_GMRESGetTol( void *gmres_vdata, HYPRE_Real *tol ) { hypre_GMRESData *gmres_data = (hypre_GMRESData *)gmres_vdata; *tol = (gmres_data -> tol); return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_GMRESSetAbsoluteTol, hypre_GMRESGetAbsoluteTol *--------------------------------------------------------------------------*/ HYPRE_Int hypre_GMRESSetAbsoluteTol( void *gmres_vdata, HYPRE_Real a_tol ) { hypre_GMRESData *gmres_data = (hypre_GMRESData *)gmres_vdata; (gmres_data -> a_tol) = a_tol; return hypre_error_flag; } HYPRE_Int hypre_GMRESGetAbsoluteTol( void *gmres_vdata, HYPRE_Real *a_tol ) { hypre_GMRESData *gmres_data = (hypre_GMRESData *)gmres_vdata; *a_tol = (gmres_data -> a_tol); return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_GMRESSetConvergenceFactorTol, hypre_GMRESGetConvergenceFactorTol *--------------------------------------------------------------------------*/ HYPRE_Int hypre_GMRESSetConvergenceFactorTol( void *gmres_vdata, HYPRE_Real cf_tol ) { hypre_GMRESData *gmres_data = (hypre_GMRESData *)gmres_vdata; (gmres_data -> cf_tol) = cf_tol; return hypre_error_flag; } HYPRE_Int hypre_GMRESGetConvergenceFactorTol( void *gmres_vdata, HYPRE_Real *cf_tol ) { hypre_GMRESData *gmres_data = (hypre_GMRESData *)gmres_vdata; *cf_tol = (gmres_data -> cf_tol); return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_GMRESSetMinIter, hypre_GMRESGetMinIter *--------------------------------------------------------------------------*/ HYPRE_Int hypre_GMRESSetMinIter( void *gmres_vdata, HYPRE_Int min_iter ) { hypre_GMRESData *gmres_data = (hypre_GMRESData *)gmres_vdata; (gmres_data -> min_iter) = min_iter; return hypre_error_flag; } HYPRE_Int hypre_GMRESGetMinIter( void *gmres_vdata, HYPRE_Int *min_iter ) { hypre_GMRESData *gmres_data = (hypre_GMRESData *)gmres_vdata; *min_iter = (gmres_data -> min_iter); return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_GMRESSetMaxIter, hypre_GMRESGetMaxIter *--------------------------------------------------------------------------*/ HYPRE_Int hypre_GMRESSetMaxIter( void *gmres_vdata, HYPRE_Int max_iter ) { hypre_GMRESData *gmres_data = (hypre_GMRESData *)gmres_vdata; (gmres_data -> max_iter) = max_iter; return hypre_error_flag; } HYPRE_Int hypre_GMRESGetMaxIter( void *gmres_vdata, HYPRE_Int *max_iter ) { hypre_GMRESData *gmres_data = (hypre_GMRESData *)gmres_vdata; *max_iter = (gmres_data -> max_iter); return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_GMRESSetRelChange, hypre_GMRESGetRelChange *--------------------------------------------------------------------------*/ HYPRE_Int hypre_GMRESSetRelChange( void *gmres_vdata, HYPRE_Int rel_change ) { hypre_GMRESData *gmres_data = (hypre_GMRESData *)gmres_vdata; (gmres_data -> rel_change) = rel_change; return hypre_error_flag; } HYPRE_Int hypre_GMRESGetRelChange( void *gmres_vdata, HYPRE_Int *rel_change ) { hypre_GMRESData *gmres_data = (hypre_GMRESData *)gmres_vdata; *rel_change = (gmres_data -> rel_change); return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_GMRESSetSkipRealResidualCheck, hypre_GMRESGetSkipRealResidualCheck *--------------------------------------------------------------------------*/ HYPRE_Int hypre_GMRESSetSkipRealResidualCheck( void *gmres_vdata, HYPRE_Int skip_real_r_check ) { hypre_GMRESData *gmres_data = (hypre_GMRESData *)gmres_vdata; (gmres_data -> skip_real_r_check) = skip_real_r_check; return hypre_error_flag; } HYPRE_Int hypre_GMRESGetSkipRealResidualCheck( void *gmres_vdata, HYPRE_Int *skip_real_r_check) { hypre_GMRESData *gmres_data = (hypre_GMRESData *)gmres_vdata; *skip_real_r_check = (gmres_data -> skip_real_r_check); return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_GMRESSetStopCrit, hypre_GMRESGetStopCrit * * OBSOLETE *--------------------------------------------------------------------------*/ HYPRE_Int hypre_GMRESSetStopCrit( void *gmres_vdata, HYPRE_Int stop_crit ) { hypre_GMRESData *gmres_data = (hypre_GMRESData *)gmres_vdata; (gmres_data -> stop_crit) = stop_crit; return hypre_error_flag; } HYPRE_Int hypre_GMRESGetStopCrit( void *gmres_vdata, HYPRE_Int *stop_crit ) { hypre_GMRESData *gmres_data = (hypre_GMRESData *)gmres_vdata; *stop_crit = (gmres_data -> stop_crit); return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_GMRESSetPrecond *--------------------------------------------------------------------------*/ HYPRE_Int hypre_GMRESSetPrecond( void *gmres_vdata, HYPRE_Int (*precond)(void*, void*, void*, void*), HYPRE_Int (*precond_setup)(void*, void*, void*, void*), void *precond_data ) { hypre_GMRESData *gmres_data = (hypre_GMRESData *)gmres_vdata; hypre_GMRESFunctions *gmres_functions = gmres_data->functions; (gmres_functions -> precond) = precond; (gmres_functions -> precond_setup) = precond_setup; (gmres_data -> precond_data) = precond_data; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_GMRESGetPrecond *--------------------------------------------------------------------------*/ HYPRE_Int hypre_GMRESGetPrecond( void *gmres_vdata, HYPRE_Solver *precond_data_ptr ) { hypre_GMRESData *gmres_data = (hypre_GMRESData *)gmres_vdata; *precond_data_ptr = (HYPRE_Solver)(gmres_data -> precond_data); return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_GMRESSetPrintLevel, hypre_GMRESGetPrintLevel *--------------------------------------------------------------------------*/ HYPRE_Int hypre_GMRESSetPrintLevel( void *gmres_vdata, HYPRE_Int level) { hypre_GMRESData *gmres_data = (hypre_GMRESData *)gmres_vdata; (gmres_data -> print_level) = level; return hypre_error_flag; } HYPRE_Int hypre_GMRESGetPrintLevel( void *gmres_vdata, HYPRE_Int *level) { hypre_GMRESData *gmres_data = (hypre_GMRESData *)gmres_vdata; *level = (gmres_data -> print_level); return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_GMRESSetLogging, hypre_GMRESGetLogging *--------------------------------------------------------------------------*/ HYPRE_Int hypre_GMRESSetLogging( void *gmres_vdata, HYPRE_Int level) { hypre_GMRESData *gmres_data = (hypre_GMRESData *)gmres_vdata; (gmres_data -> logging) = level; return hypre_error_flag; } HYPRE_Int hypre_GMRESGetLogging( void *gmres_vdata, HYPRE_Int *level) { hypre_GMRESData *gmres_data = (hypre_GMRESData *)gmres_vdata; *level = (gmres_data -> logging); return hypre_error_flag; } HYPRE_Int hypre_GMRESSetHybrid( void *gmres_vdata, HYPRE_Int level) { hypre_GMRESData *gmres_data = (hypre_GMRESData *)gmres_vdata; (gmres_data -> hybrid) = level; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_GMRESGetNumIterations *--------------------------------------------------------------------------*/ HYPRE_Int hypre_GMRESGetNumIterations( void *gmres_vdata, HYPRE_Int *num_iterations ) { hypre_GMRESData *gmres_data = (hypre_GMRESData *)gmres_vdata; *num_iterations = (gmres_data -> num_iterations); return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_GMRESGetConverged *--------------------------------------------------------------------------*/ HYPRE_Int hypre_GMRESGetConverged( void *gmres_vdata, HYPRE_Int *converged ) { hypre_GMRESData *gmres_data = (hypre_GMRESData *)gmres_vdata; *converged = (gmres_data -> converged); return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_GMRESGetFinalRelativeResidualNorm *--------------------------------------------------------------------------*/ HYPRE_Int hypre_GMRESGetFinalRelativeResidualNorm( void *gmres_vdata, HYPRE_Real *relative_residual_norm ) { hypre_GMRESData *gmres_data = (hypre_GMRESData *)gmres_vdata; *relative_residual_norm = (gmres_data -> rel_residual_norm); return hypre_error_flag; } hypre-2.33.0/src/krylov/gmres.h000066400000000000000000000114661477326011500163470ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * GMRES gmres * *****************************************************************************/ #ifndef hypre_KRYLOV_GMRES_HEADER #define hypre_KRYLOV_GMRES_HEADER /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ /** * @name Generic GMRES Interface * * A general description of the interface goes here... * * @memo A generic GMRES linear solver interface * @version 0.1 * @author Jeffrey F. Painter **/ /*@{*/ /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ /*-------------------------------------------------------------------------- * hypre_GMRESData and hypre_GMRESFunctions *--------------------------------------------------------------------------*/ /** * @name GMRES structs * * Description... **/ /*@{*/ /** * The {\tt hypre\_GMRESFunctions} object ... **/ typedef struct { void * (*CAlloc) ( size_t count, size_t elt_size ); HYPRE_Int (*Free) ( void *ptr ); HYPRE_Int (*CommInfo) ( void *A, HYPRE_Int *my_id, HYPRE_Int *num_procs ); void * (*CreateVector) ( void *vector ); void * (*CreateVectorArray) ( HYPRE_Int size, void *vectors ); HYPRE_Int (*DestroyVector) ( void *vector ); void * (*MatvecCreate) ( void *A, void *x ); HYPRE_Int (*Matvec) ( void *matvec_data, HYPRE_Complex alpha, void *A, void *x, HYPRE_Complex beta, void *y ); HYPRE_Int (*MatvecDestroy) ( void *matvec_data ); HYPRE_Real (*InnerProd) ( void *x, void *y ); HYPRE_Int (*CopyVector) ( void *x, void *y ); HYPRE_Int (*ClearVector) ( void *x ); HYPRE_Int (*ScaleVector) ( HYPRE_Complex alpha, void *x ); HYPRE_Int (*Axpy) ( HYPRE_Complex alpha, void *x, void *y ); HYPRE_Int (*precond) (); HYPRE_Int (*precond_setup) (); } hypre_GMRESFunctions; /** * The {\tt hypre\_GMRESData} object ... **/ typedef struct { HYPRE_Int k_dim; HYPRE_Int min_iter; HYPRE_Int max_iter; HYPRE_Int rel_change; HYPRE_Int skip_real_r_check; HYPRE_Int stop_crit; HYPRE_Int converged; HYPRE_Int hybrid; HYPRE_Real tol; HYPRE_Real cf_tol; HYPRE_Real a_tol; HYPRE_Real rel_residual_norm; void *A; void *r; void *w; void *w_2; void **p; void *matvec_data; void *precond_data; hypre_GMRESFunctions * functions; /* log info (always logged) */ HYPRE_Int num_iterations; HYPRE_Int print_level; /* printing when print_level>0 */ HYPRE_Int logging; /* extra computations for logging when logging>0 */ HYPRE_Real *norms; char *log_file_name; } hypre_GMRESData; #ifdef __cplusplus extern "C" { #endif /** * @name generic GMRES Solver * * Description... **/ /*@{*/ /** * Description... * * @param param [IN] ... **/ hypre_GMRESFunctions * hypre_GMRESFunctionsCreate( void * (*CAlloc) ( size_t count, size_t elt_size ), HYPRE_Int (*Free) ( void *ptr ), HYPRE_Int (*CommInfo) ( void *A, HYPRE_Int *my_id, HYPRE_Int *num_procs ), void * (*CreateVector) ( void *vector ), void * (*CreateVectorArray) ( HYPRE_Int size, void *vectors ), HYPRE_Int (*DestroyVector) ( void *vector ), void * (*MatvecCreate) ( void *A, void *x ), HYPRE_Int (*Matvec) ( void *matvec_data, HYPRE_Complex alpha, void *A, void *x, HYPRE_Complex beta, void *y ), HYPRE_Int (*MatvecDestroy) ( void *matvec_data ), HYPRE_Real (*InnerProd) ( void *x, void *y ), HYPRE_Int (*CopyVector) ( void *x, void *y ), HYPRE_Int (*ClearVector) ( void *x ), HYPRE_Int (*ScaleVector) ( HYPRE_Complex alpha, void *x ), HYPRE_Int (*Axpy) ( HYPRE_Complex alpha, void *x, void *y ), HYPRE_Int (*PrecondSetup) ( void *vdata, void *A, void *b, void *x ), HYPRE_Int (*Precond) ( void *vdata, void *A, void *b, void *x ) ); /** * Description... * * @param param [IN] ... **/ void * hypre_GMRESCreate( hypre_GMRESFunctions *gmres_functions ); #ifdef __cplusplus } #endif #endif hypre-2.33.0/src/krylov/krylov.h000066400000000000000000002167201477326011500165600ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "HYPRE_krylov.h" #ifndef hypre_KRYLOV_HEADER #define hypre_KRYLOV_HEADER #include #include #include #include "_hypre_utilities.h" #define hypre_CTAllocF(type, count, funcs, location) \ ( (type *)(*(funcs->CAlloc))((size_t)(count), (size_t)sizeof(type), location) ) #define hypre_TFreeF( ptr, funcs ) ( (*(funcs->Free))((void *)ptr), ptr = NULL ) #ifdef __cplusplus extern "C" { #endif /****************************************************************************** * * BiCGSTAB bicgstab * *****************************************************************************/ #ifndef hypre_KRYLOV_BiCGSTAB_HEADER #define hypre_KRYLOV_BiCGSTAB_HEADER /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ /** * @name Generic BiCGSTAB Interface * * A general description of the interface goes here... * * @memo A generic BiCGSTAB linear solver interface * @version 0.1 * @author Jeffrey F. Painter **/ /*@{*/ /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ /*-------------------------------------------------------------------------- * hypre_BiCGSTABData and hypre_BiCGSTABFunctions *--------------------------------------------------------------------------*/ /** * @name BiCGSTAB structs * * Description... **/ /*@{*/ /** * The {\tt hypre\_BiCGSTABSFunctions} object ... **/ /* functions in pcg_struct.c which aren't used here: void *hypre_ParKrylovCAlloc( HYPRE_Int count , HYPRE_Int elt_size ); HYPRE_Int hypre_ParKrylovFree( void *ptr ); void *hypre_ParKrylovCreateVectorArray( HYPRE_Int n , void *vvector ); HYPRE_Int hypre_ParKrylovMatvecT( void *matvec_data , HYPRE_Real alpha , void *A , void *x , HYPRE_Real beta , void *y ); */ /* functions in pcg_struct.c which are used here: void *hypre_ParKrylovCreateVector( void *vvector ); HYPRE_Int hypre_ParKrylovDestroyVector( void *vvector ); void *hypre_ParKrylovMatvecCreate( void *A , void *x ); HYPRE_Int hypre_ParKrylovMatvec( void *matvec_data , HYPRE_Real alpha , void *A , void *x , HYPRE_Real beta , void *y ); HYPRE_Int hypre_ParKrylovMatvecDestroy( void *matvec_data ); HYPRE_Real hypre_ParKrylovInnerProd( void *x , void *y ); HYPRE_Int hypre_ParKrylovCopyVector( void *x , void *y ); HYPRE_Int hypre_ParKrylovClearVector( void *x ); HYPRE_Int hypre_ParKrylovScaleVector( HYPRE_Real alpha , void *x ); HYPRE_Int hypre_ParKrylovAxpy( HYPRE_Real alpha , void *x , void *y ); HYPRE_Int hypre_ParKrylovCommInfo( void *A , HYPRE_Int *my_id , HYPRE_Int *num_procs ); HYPRE_Int hypre_ParKrylovIdentitySetup( void *vdata , void *A , void *b , void *x ); HYPRE_Int hypre_ParKrylovIdentity( void *vdata , void *A , void *b , void *x ); */ typedef struct { void * (*CreateVector) ( void *vvector ); HYPRE_Int (*DestroyVector) ( void *vvector ); void * (*MatvecCreate) ( void *A, void *x ); HYPRE_Int (*Matvec) ( void *matvec_data, HYPRE_Complex alpha, void *A, void *x, HYPRE_Complex beta, void *y ); HYPRE_Int (*MatvecDestroy) ( void *matvec_data ); HYPRE_Real (*InnerProd) ( void *x, void *y ); HYPRE_Int (*CopyVector) ( void *x, void *y ); HYPRE_Int (*ClearVector) ( void *x ); HYPRE_Int (*ScaleVector) ( HYPRE_Complex alpha, void *x ); HYPRE_Int (*Axpy) ( HYPRE_Complex alpha, void *x, void *y ); HYPRE_Int (*CommInfo) ( void *A, HYPRE_Int *my_id, HYPRE_Int *num_procs ); HYPRE_Int (*precond_setup) (void *vdata, void *A, void *b, void *x); HYPRE_Int (*precond) (void *vdata, void *A, void *b, void *x); } hypre_BiCGSTABFunctions; /** * The {\tt hypre\_BiCGSTABData} object ... **/ typedef struct { HYPRE_Int min_iter; HYPRE_Int max_iter; HYPRE_Int stop_crit; HYPRE_Int converged; HYPRE_Int hybrid; HYPRE_Real tol; HYPRE_Real cf_tol; HYPRE_Real rel_residual_norm; HYPRE_Real a_tol; void *A; void *r; void *r0; void *s; void *v; void *p; void *q; void *matvec_data; void *precond_data; hypre_BiCGSTABFunctions * functions; /* log info (always logged) */ HYPRE_Int num_iterations; /* additional log info (logged when `logging' > 0) */ HYPRE_Int logging; HYPRE_Int print_level; HYPRE_Real *norms; char *log_file_name; } hypre_BiCGSTABData; #define hypre_BiCGSTABDataHybrid(pcgdata) ((pcgdata) -> hybrid) #ifdef __cplusplus extern "C" { #endif /** * @name generic BiCGSTAB Solver * * Description... **/ /*@{*/ /** * Description... * * @param param [IN] ... **/ hypre_BiCGSTABFunctions * hypre_BiCGSTABFunctionsCreate( void * (*CreateVector) ( void *vvector ), HYPRE_Int (*DestroyVector) ( void *vvector ), void * (*MatvecCreate) ( void *A, void *x ), HYPRE_Int (*Matvec) ( void *matvec_data, HYPRE_Complex alpha, void *A, void *x, HYPRE_Complex beta, void *y ), HYPRE_Int (*MatvecDestroy) ( void *matvec_data ), HYPRE_Real (*InnerProd) ( void *x, void *y ), HYPRE_Int (*CopyVector) ( void *x, void *y ), HYPRE_Int (*ClearVector) ( void *x ), HYPRE_Int (*ScaleVector) ( HYPRE_Complex alpha, void *x ), HYPRE_Int (*Axpy) ( HYPRE_Complex alpha, void *x, void *y ), HYPRE_Int (*CommInfo) ( void *A, HYPRE_Int *my_id, HYPRE_Int *num_procs ), HYPRE_Int (*PrecondSetup) ( void *vdata, void *A, void *b, void *x ), HYPRE_Int (*Precond) ( void *vdata, void *A, void *b, void *x ) ); /** * Description... * * @param param [IN] ... **/ void * hypre_BiCGSTABCreate( hypre_BiCGSTABFunctions * bicgstab_functions ); #ifdef __cplusplus } #endif #endif /****************************************************************************** * * cgnr (conjugate gradient on the normal equations A^TAx = A^Tb) functions * *****************************************************************************/ #ifndef hypre_KRYLOV_CGNR_HEADER #define hypre_KRYLOV_CGNR_HEADER /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ /** * @name Generic CGNR Interface * * A general description of the interface goes here... * * @memo A generic CGNR linear solver interface * @version 0.1 * @author Jeffrey F. Painter **/ /*@{*/ /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ /*-------------------------------------------------------------------------- * hypre_CGNRData and hypre_CGNRFunctions *--------------------------------------------------------------------------*/ /** * @name CGNR structs * * Description... **/ /*@{*/ /** * The {\tt hypre\_CGNRSFunctions} object ... **/ typedef struct { HYPRE_Int (*CommInfo) ( void *A, HYPRE_Int *my_id, HYPRE_Int *num_procs ); void * (*CreateVector) ( void *vector ); HYPRE_Int (*DestroyVector) ( void *vector ); void * (*MatvecCreate) ( void *A, void *x ); HYPRE_Int (*Matvec) ( void *matvec_data, HYPRE_Complex alpha, void *A, void *x, HYPRE_Complex beta, void *y ); HYPRE_Int (*MatvecT) ( void *matvec_data, HYPRE_Complex alpha, void *A, void *x, HYPRE_Complex beta, void *y ); HYPRE_Int (*MatvecDestroy) ( void *matvec_data ); HYPRE_Real (*InnerProd) ( void *x, void *y ); HYPRE_Int (*CopyVector) ( void *x, void *y ); HYPRE_Int (*ClearVector) ( void *x ); HYPRE_Int (*ScaleVector) ( HYPRE_Complex alpha, void *x ); HYPRE_Int (*Axpy) ( HYPRE_Complex alpha, void *x, void *y ); HYPRE_Int (*precond_setup) ( void *vdata, void *A, void *b, void *x ); HYPRE_Int (*precond) ( void *vdata, void *A, void *b, void *x ); HYPRE_Int (*precondT) ( void *vdata, void *A, void *b, void *x ); } hypre_CGNRFunctions; /** * The {\tt hypre\_CGNRData} object ... **/ typedef struct { HYPRE_Real tol; HYPRE_Real rel_residual_norm; HYPRE_Int min_iter; HYPRE_Int max_iter; HYPRE_Int stop_crit; void *A; void *p; void *q; void *r; void *t; void *matvec_data; void *precond_data; hypre_CGNRFunctions * functions; /* log info (always logged) */ HYPRE_Int num_iterations; /* additional log info (logged when `logging' > 0) */ HYPRE_Int logging; HYPRE_Real *norms; char *log_file_name; } hypre_CGNRData; #ifdef __cplusplus extern "C" { #endif /** * @name generic CGNR Solver * * Description... **/ /*@{*/ /** * Description... * * @param param [IN] ... **/ hypre_CGNRFunctions * hypre_CGNRFunctionsCreate( HYPRE_Int (*CommInfo) ( void *A, HYPRE_Int *my_id, HYPRE_Int *num_procs ), void * (*CreateVector) ( void *vector ), HYPRE_Int (*DestroyVector) ( void *vector ), void * (*MatvecCreate) ( void *A, void *x ), HYPRE_Int (*Matvec) ( void *matvec_data, HYPRE_Complex alpha, void *A, void *x, HYPRE_Complex beta, void *y ), HYPRE_Int (*MatvecT) ( void *matvec_data, HYPRE_Complex alpha, void *A, void *x, HYPRE_Complex beta, void *y ), HYPRE_Int (*MatvecDestroy) ( void *matvec_data ), HYPRE_Real (*InnerProd) ( void *x, void *y ), HYPRE_Int (*CopyVector) ( void *x, void *y ), HYPRE_Int (*ClearVector) ( void *x ), HYPRE_Int (*ScaleVector) ( HYPRE_Complex alpha, void *x ), HYPRE_Int (*Axpy) ( HYPRE_Complex alpha, void *x, void *y ), HYPRE_Int (*PrecondSetup) ( void *vdata, void *A, void *b, void *x ), HYPRE_Int (*Precond) ( void *vdata, void *A, void *b, void *x ), HYPRE_Int (*PrecondT) ( void *vdata, void *A, void *b, void *x ) ); /** * Description... * * @param param [IN] ... **/ void * hypre_CGNRCreate( hypre_CGNRFunctions *cgnr_functions ); #ifdef __cplusplus } #endif #endif /****************************************************************************** * * GMRES gmres * *****************************************************************************/ #ifndef hypre_KRYLOV_GMRES_HEADER #define hypre_KRYLOV_GMRES_HEADER /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ /** * @name Generic GMRES Interface * * A general description of the interface goes here... * * @memo A generic GMRES linear solver interface * @version 0.1 * @author Jeffrey F. Painter **/ /*@{*/ /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ /*-------------------------------------------------------------------------- * hypre_GMRESData and hypre_GMRESFunctions *--------------------------------------------------------------------------*/ /** * @name GMRES structs * * Description... **/ /*@{*/ /** * The {\tt hypre\_GMRESFunctions} object ... **/ typedef struct { void * (*CAlloc) ( size_t count, size_t elt_size, HYPRE_MemoryLocation location ); HYPRE_Int (*Free) ( void *ptr ); HYPRE_Int (*CommInfo) ( void *A, HYPRE_Int *my_id, HYPRE_Int *num_procs ); void * (*CreateVector) ( void *vector ); void * (*CreateVectorArray) ( HYPRE_Int size, void *vectors ); HYPRE_Int (*DestroyVector) ( void *vector ); void * (*MatvecCreate) ( void *A, void *x ); HYPRE_Int (*Matvec) ( void *matvec_data, HYPRE_Complex alpha, void *A, void *x, HYPRE_Complex beta, void *y ); HYPRE_Int (*MatvecDestroy) ( void *matvec_data ); HYPRE_Real (*InnerProd) ( void *x, void *y ); HYPRE_Int (*CopyVector) ( void *x, void *y ); HYPRE_Int (*ClearVector) ( void *x ); HYPRE_Int (*ScaleVector) ( HYPRE_Complex alpha, void *x ); HYPRE_Int (*Axpy) ( HYPRE_Complex alpha, void *x, void *y ); HYPRE_Int (*precond) (void *vdata, void *A, void *b, void *x); HYPRE_Int (*precond_setup) (void *vdata, void *A, void *b, void *x); } hypre_GMRESFunctions; /** * The {\tt hypre\_GMRESData} object ... **/ typedef struct { HYPRE_Int k_dim; HYPRE_Int min_iter; HYPRE_Int max_iter; HYPRE_Int rel_change; HYPRE_Int skip_real_r_check; HYPRE_Int stop_crit; HYPRE_Int converged; HYPRE_Int hybrid; HYPRE_Real tol; HYPRE_Real cf_tol; HYPRE_Real a_tol; HYPRE_Real rel_residual_norm; void *A; void *r; void *w; void *w_2; void **p; void *matvec_data; void *precond_data; hypre_GMRESFunctions * functions; /* log info (always logged) */ HYPRE_Int num_iterations; HYPRE_Int print_level; /* printing when print_level>0 */ HYPRE_Int logging; /* extra computations for logging when logging>0 */ HYPRE_Real *norms; char *log_file_name; } hypre_GMRESData; #define hypre_GMRESDataHybrid(pcgdata) ((pcgdata) -> hybrid) #ifdef __cplusplus extern "C" { #endif /** * @name generic GMRES Solver * * Description... **/ /*@{*/ /** * Description... * * @param param [IN] ... **/ hypre_GMRESFunctions * hypre_GMRESFunctionsCreate( void * (*CAlloc) ( size_t count, size_t elt_size, HYPRE_MemoryLocation location ), HYPRE_Int (*Free) ( void *ptr ), HYPRE_Int (*CommInfo) ( void *A, HYPRE_Int *my_id, HYPRE_Int *num_procs ), void * (*CreateVector) ( void *vector ), void * (*CreateVectorArray) ( HYPRE_Int size, void *vectors ), HYPRE_Int (*DestroyVector) ( void *vector ), void * (*MatvecCreate) ( void *A, void *x ), HYPRE_Int (*Matvec) ( void *matvec_data, HYPRE_Complex alpha, void *A, void *x, HYPRE_Complex beta, void *y ), HYPRE_Int (*MatvecDestroy) ( void *matvec_data ), HYPRE_Real (*InnerProd) ( void *x, void *y ), HYPRE_Int (*CopyVector) ( void *x, void *y ), HYPRE_Int (*ClearVector) ( void *x ), HYPRE_Int (*ScaleVector) ( HYPRE_Complex alpha, void *x ), HYPRE_Int (*Axpy) ( HYPRE_Complex alpha, void *x, void *y ), HYPRE_Int (*PrecondSetup) ( void *vdata, void *A, void *b, void *x ), HYPRE_Int (*Precond) ( void *vdata, void *A, void *b, void *x ) ); /** * Description... * * @param param [IN] ... **/ void * hypre_GMRESCreate( hypre_GMRESFunctions *gmres_functions ); #ifdef __cplusplus } #endif #endif /***********KS code ****************/ /****************************************************************************** * * COGMRES cogmres * *****************************************************************************/ #ifndef hypre_KRYLOV_COGMRES_HEADER #define hypre_KRYLOV_COGMRES_HEADER /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ /** * @name Generic GMRES Interface * * A general description of the interface goes here... * * @memo A generic GMRES linear solver interface * @version 0.1 * @author Jeffrey F. Painter **/ /*@{*/ /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ /*-------------------------------------------------------------------------- * hypre_COGMRESData and hypre_COGMRESFunctions *--------------------------------------------------------------------------*/ /** * @name GMRES structs * * Description... **/ /*@{*/ /** * The {\tt hypre\_GMRESFunctions} object ... **/ typedef struct { void * (*CAlloc) ( size_t count, size_t elt_size, HYPRE_MemoryLocation location ); HYPRE_Int (*Free) ( void *ptr ); HYPRE_Int (*CommInfo) ( void *A, HYPRE_Int *my_id, HYPRE_Int *num_procs ); void * (*CreateVector) ( void *vector ); void * (*CreateVectorArray) ( HYPRE_Int size, void *vectors ); HYPRE_Int (*DestroyVector) ( void *vector ); void * (*MatvecCreate) ( void *A, void *x ); HYPRE_Int (*Matvec) ( void *matvec_data, HYPRE_Complex alpha, void *A, void *x, HYPRE_Complex beta, void *y ); HYPRE_Int (*MatvecDestroy) ( void *matvec_data ); HYPRE_Real (*InnerProd) ( void *x, void *y ); HYPRE_Int (*MassInnerProd) ( void *x, void **p, HYPRE_Int k, HYPRE_Int unroll, void *result); HYPRE_Int (*MassDotpTwo) ( void *x, void *y, void **p, HYPRE_Int k, HYPRE_Int unroll, void *result_x, void *result_y); HYPRE_Int (*CopyVector) ( void *x, void *y ); HYPRE_Int (*ClearVector) ( void *x ); HYPRE_Int (*ScaleVector) ( HYPRE_Complex alpha, void *x ); HYPRE_Int (*Axpy) ( HYPRE_Complex alpha, void *x, void *y ); HYPRE_Int (*MassAxpy) ( HYPRE_Complex * alpha, void **x, void *y, HYPRE_Int k, HYPRE_Int unroll); HYPRE_Int (*precond) (void *vdata, void *A, void *b, void *x); HYPRE_Int (*precond_setup) (void *vdata, void *A, void *b, void *x); HYPRE_Int (*modify_pc)( void *precond_data, HYPRE_Int iteration, HYPRE_Real rel_residual_norm); } hypre_COGMRESFunctions; /** * The {\tt hypre\_GMRESData} object ... **/ typedef struct { HYPRE_Int k_dim; HYPRE_Int unroll; HYPRE_Int cgs; HYPRE_Int min_iter; HYPRE_Int max_iter; HYPRE_Int rel_change; HYPRE_Int skip_real_r_check; HYPRE_Int stop_crit; HYPRE_Int converged; HYPRE_Real tol; HYPRE_Real cf_tol; HYPRE_Real a_tol; HYPRE_Real rel_residual_norm; void *A; void *r; void *w; void *w_2; void **p; void *matvec_data; void *precond_data; hypre_COGMRESFunctions * functions; /* log info (always logged) */ HYPRE_Int num_iterations; HYPRE_Int print_level; /* printing when print_level>0 */ HYPRE_Int logging; /* extra computations for logging when logging>0 */ HYPRE_Real *norms; char *log_file_name; } hypre_COGMRESData; #ifdef __cplusplus extern "C" { #endif /** * @name generic GMRES Solver * * Description... **/ /*@{*/ /** * Description... * * @param param [IN] ... **/ hypre_COGMRESFunctions * hypre_COGMRESFunctionsCreate( void * (*CAlloc) ( size_t count, size_t elt_size, HYPRE_MemoryLocation location ), HYPRE_Int (*Free) ( void *ptr ), HYPRE_Int (*CommInfo) ( void *A, HYPRE_Int *my_id, HYPRE_Int *num_procs ), void * (*CreateVector) ( void *vector ), void * (*CreateVectorArray) ( HYPRE_Int size, void *vectors ), HYPRE_Int (*DestroyVector) ( void *vector ), void * (*MatvecCreate) ( void *A, void *x ), HYPRE_Int (*Matvec) ( void *matvec_data, HYPRE_Complex alpha, void *A, void *x, HYPRE_Complex beta, void *y ), HYPRE_Int (*MatvecDestroy) ( void *matvec_data ), HYPRE_Real (*InnerProd) ( void *x, void *y ), HYPRE_Int (*MassInnerProd) ( void *x, void **p, HYPRE_Int k, HYPRE_Int unroll, void *result), HYPRE_Int (*MassDotpTwo) ( void *x, void *y, void **p, HYPRE_Int k, HYPRE_Int unroll, void *result_x, void *result_y), HYPRE_Int (*CopyVector) ( void *x, void *y ), HYPRE_Int (*ClearVector) ( void *x ), HYPRE_Int (*ScaleVector) ( HYPRE_Complex alpha, void *x ), HYPRE_Int (*Axpy) ( HYPRE_Complex alpha, void *x, void *y ), HYPRE_Int (*MassAxpy) ( HYPRE_Complex *alpha, void **x, void *y, HYPRE_Int k, HYPRE_Int unroll), HYPRE_Int (*PrecondSetup) ( void *vdata, void *A, void *b, void *x ), HYPRE_Int (*Precond) ( void *vdata, void *A, void *b, void *x ) ); /** * Description... * * @param param [IN] ... **/ void * hypre_COGMRESCreate( hypre_COGMRESFunctions *gmres_functions ); #ifdef __cplusplus } #endif #endif /***********end of KS code *********/ /****************************************************************************** * * LGMRES lgmres * *****************************************************************************/ #ifndef hypre_KRYLOV_LGMRES_HEADER #define hypre_KRYLOV_LGMRES_HEADER /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ /** * @name Generic LGMRES Interface * * A general description of the interface goes here... * **/ /*@{*/ /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ /*-------------------------------------------------------------------------- * hypre_LGMRESData and hypre_LGMRESFunctions *--------------------------------------------------------------------------*/ /** * @name LGMRES structs * * Description... **/ /*@{*/ /** * The {\tt hypre\_LGMRESFunctions} object ... **/ typedef struct { void * (*CAlloc) ( size_t count, size_t elt_size, HYPRE_MemoryLocation location ); HYPRE_Int (*Free) ( void *ptr ); HYPRE_Int (*CommInfo) ( void *A, HYPRE_Int *my_id, HYPRE_Int *num_procs ); void * (*CreateVector) ( void *vector ); void * (*CreateVectorArray) ( HYPRE_Int size, void *vectors ); HYPRE_Int (*DestroyVector) ( void *vector ); void * (*MatvecCreate) ( void *A, void *x ); HYPRE_Int (*Matvec) ( void *matvec_data, HYPRE_Complex alpha, void *A, void *x, HYPRE_Complex beta, void *y ); HYPRE_Int (*MatvecDestroy) ( void *matvec_data ); HYPRE_Real (*InnerProd) ( void *x, void *y ); HYPRE_Int (*CopyVector) ( void *x, void *y ); HYPRE_Int (*ClearVector) ( void *x ); HYPRE_Int (*ScaleVector) ( HYPRE_Complex alpha, void *x ); HYPRE_Int (*Axpy) ( HYPRE_Complex alpha, void *x, void *y ); HYPRE_Int (*precond) (void *vdata, void *A, void *b, void *x); HYPRE_Int (*precond_setup) (void *vdata, void *A, void *b, void *x); } hypre_LGMRESFunctions; /** * The {\tt hypre\_LGMRESData} object ... **/ typedef struct { HYPRE_Int k_dim; HYPRE_Int min_iter; HYPRE_Int max_iter; HYPRE_Int rel_change; HYPRE_Int stop_crit; HYPRE_Int converged; HYPRE_Real tol; HYPRE_Real cf_tol; HYPRE_Real a_tol; HYPRE_Real rel_residual_norm; /*lgmres specific stuff */ HYPRE_Int aug_dim; HYPRE_Int approx_constant; void **aug_vecs; HYPRE_Int *aug_order; void **a_aug_vecs; /*---*/ void *A; void *r; void *w; void *w_2; void **p; void *matvec_data; void *precond_data; hypre_LGMRESFunctions * functions; /* log info (always logged) */ HYPRE_Int num_iterations; HYPRE_Int print_level; /* printing when print_level>0 */ HYPRE_Int logging; /* extra computations for logging when logging>0 */ HYPRE_Real *norms; char *log_file_name; } hypre_LGMRESData; #ifdef __cplusplus extern "C" { #endif /** * @name generic LGMRES Solver * * Description... **/ /*@{*/ /** * Description... * * @param param [IN] ... **/ hypre_LGMRESFunctions * hypre_LGMRESFunctionsCreate( void * (*CAlloc) ( size_t count, size_t elt_size, HYPRE_MemoryLocation location), HYPRE_Int (*Free) ( void *ptr ), HYPRE_Int (*CommInfo) ( void *A, HYPRE_Int *my_id, HYPRE_Int *num_procs ), void * (*CreateVector) ( void *vector ), void * (*CreateVectorArray) ( HYPRE_Int size, void *vectors ), HYPRE_Int (*DestroyVector) ( void *vector ), void * (*MatvecCreate) ( void *A, void *x ), HYPRE_Int (*Matvec) ( void *matvec_data, HYPRE_Complex alpha, void *A, void *x, HYPRE_Complex beta, void *y ), HYPRE_Int (*MatvecDestroy) ( void *matvec_data ), HYPRE_Real (*InnerProd) ( void *x, void *y ), HYPRE_Int (*CopyVector) ( void *x, void *y ), HYPRE_Int (*ClearVector) ( void *x ), HYPRE_Int (*ScaleVector) ( HYPRE_Complex alpha, void *x ), HYPRE_Int (*Axpy) ( HYPRE_Complex alpha, void *x, void *y ), HYPRE_Int (*PrecondSetup) ( void *vdata, void *A, void *b, void *x ), HYPRE_Int (*Precond) ( void *vdata, void *A, void *b, void *x ) ); /** * Description... * * @param param [IN] ... **/ void * hypre_LGMRESCreate( hypre_LGMRESFunctions *lgmres_functions ); #ifdef __cplusplus } #endif #endif /****************************************************************************** * * FLEXGMRES flexible gmres * *****************************************************************************/ #ifndef hypre_KRYLOV_FLEXGMRES_HEADER #define hypre_KRYLOV_FLEXGMRES_HEADER /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ /** * @name Generic FlexGMRES Interface * * A general description of the interface goes here... * **/ /*@{*/ /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ /*-------------------------------------------------------------------------- * hypre_FlexGMRESData and hypre_FlexGMRESFunctions *--------------------------------------------------------------------------*/ /** * @name FlexGMRES structs * * Description... **/ /*@{*/ /** * The {\tt hypre\_FlexGMRESFunctions} object ... **/ typedef struct { void * (*CAlloc) ( size_t count, size_t elt_size, HYPRE_MemoryLocation location ); HYPRE_Int (*Free) ( void *ptr ); HYPRE_Int (*CommInfo) ( void *A, HYPRE_Int *my_id, HYPRE_Int *num_procs ); void * (*CreateVector) ( void *vector ); void * (*CreateVectorArray) ( HYPRE_Int size, void *vectors ); HYPRE_Int (*DestroyVector) ( void *vector ); void * (*MatvecCreate) ( void *A, void *x ); HYPRE_Int (*Matvec) ( void *matvec_data, HYPRE_Complex alpha, void *A, void *x, HYPRE_Complex beta, void *y ); HYPRE_Int (*MatvecDestroy) ( void *matvec_data ); HYPRE_Real (*InnerProd) ( void *x, void *y ); HYPRE_Int (*CopyVector) ( void *x, void *y ); HYPRE_Int (*ClearVector) ( void *x ); HYPRE_Int (*ScaleVector) ( HYPRE_Complex alpha, void *x ); HYPRE_Int (*Axpy) ( HYPRE_Complex alpha, void *x, void *y ); HYPRE_Int (*precond)(void *vdata, void *A, void *b, void *x ); HYPRE_Int (*precond_setup)(void *vdata, void *A, void *b, void *x ); HYPRE_Int (*modify_pc)( void *precond_data, HYPRE_Int iteration, HYPRE_Real rel_residual_norm); } hypre_FlexGMRESFunctions; /** * The {\tt hypre\_FlexGMRESData} object ... **/ typedef struct { HYPRE_Int k_dim; HYPRE_Int min_iter; HYPRE_Int max_iter; HYPRE_Int rel_change; HYPRE_Int stop_crit; HYPRE_Int converged; HYPRE_Real tol; HYPRE_Real cf_tol; HYPRE_Real a_tol; HYPRE_Real rel_residual_norm; void **pre_vecs; void *A; void *r; void *w; void *w_2; void **p; void *matvec_data; void *precond_data; hypre_FlexGMRESFunctions * functions; /* log info (always logged) */ HYPRE_Int num_iterations; HYPRE_Int print_level; /* printing when print_level>0 */ HYPRE_Int logging; /* extra computations for logging when logging>0 */ HYPRE_Real *norms; char *log_file_name; } hypre_FlexGMRESData; #ifdef __cplusplus extern "C" { #endif /** * @name generic FlexGMRES Solver * * Description... **/ /*@{*/ /** * Description... * * @param param [IN] ... **/ hypre_FlexGMRESFunctions * hypre_FlexGMRESFunctionsCreate( void * (*CAlloc) ( size_t count, size_t elt_size, HYPRE_MemoryLocation location ), HYPRE_Int (*Free) ( void *ptr ), HYPRE_Int (*CommInfo) ( void *A, HYPRE_Int *my_id, HYPRE_Int *num_procs ), void * (*CreateVector) ( void *vector ), void * (*CreateVectorArray) ( HYPRE_Int size, void *vectors ), HYPRE_Int (*DestroyVector) ( void *vector ), void * (*MatvecCreate) ( void *A, void *x ), HYPRE_Int (*Matvec) ( void *matvec_data, HYPRE_Complex alpha, void *A, void *x, HYPRE_Complex beta, void *y ), HYPRE_Int (*MatvecDestroy) ( void *matvec_data ), HYPRE_Real (*InnerProd) ( void *x, void *y ), HYPRE_Int (*CopyVector) ( void *x, void *y ), HYPRE_Int (*ClearVector) ( void *x ), HYPRE_Int (*ScaleVector) ( HYPRE_Complex alpha, void *x ), HYPRE_Int (*Axpy) ( HYPRE_Complex alpha, void *x, void *y ), HYPRE_Int (*PrecondSetup) ( void *vdata, void *A, void *b, void *x ), HYPRE_Int (*Precond) ( void *vdata, void *A, void *b, void *x ) ); /** * Description... * * @param param [IN] ... **/ void * hypre_FlexGMRESCreate( hypre_FlexGMRESFunctions *fgmres_functions ); #ifdef __cplusplus } #endif #endif /****************************************************************************** * * Preconditioned conjugate gradient (Omin) headers * *****************************************************************************/ #ifndef hypre_KRYLOV_PCG_HEADER #define hypre_KRYLOV_PCG_HEADER /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ /** * @name Generic PCG Interface * * A general description of the interface goes here... * * @memo A generic PCG linear solver interface * @version 0.1 * @author Jeffrey F. Painter **/ /*@{*/ /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ /*-------------------------------------------------------------------------- * hypre_PCGData and hypre_PCGFunctions *--------------------------------------------------------------------------*/ /** * @name PCG structs * * Description... **/ /*@{*/ /** * The {\tt hypre\_PCGSFunctions} object ... **/ typedef struct { void * (*CAlloc) ( size_t count, size_t elt_size, HYPRE_MemoryLocation location ); HYPRE_Int (*Free) ( void *ptr ); HYPRE_Int (*CommInfo) ( void *A, HYPRE_Int *my_id, HYPRE_Int *num_procs ); void * (*CreateVector) ( void *vector ); HYPRE_Int (*DestroyVector) ( void *vector ); void * (*MatvecCreate) ( void *A, void *x ); HYPRE_Int (*Matvec) ( void *matvec_data, HYPRE_Complex alpha, void *A, void *x, HYPRE_Complex beta, void *y ); HYPRE_Int (*MatvecDestroy) ( void *matvec_data ); HYPRE_Real (*InnerProd) ( void *x, void *y ); HYPRE_Int (*CopyVector) ( void *x, void *y ); HYPRE_Int (*ClearVector) ( void *x ); HYPRE_Int (*ScaleVector) ( HYPRE_Complex alpha, void *x ); HYPRE_Int (*Axpy) ( HYPRE_Complex alpha, void *x, void *y ); HYPRE_Int (*precond)(void *vdata, void *A, void *b, void *x); HYPRE_Int (*precond_setup)(void *vdata, void *A, void *b, void *x); } hypre_PCGFunctions; /** * The {\tt hypre\_PCGData} object ... **/ /* Summary of Parameters to Control Stopping Test: - Standard (default) error tolerance: |delta-residual|/|right-hand-side|). - two_norm!=0 means: the norm is the L2 norm, |r|=sqrt() - rel_change!=0 means: if pass the other stopping criteria, also check the relative change in the solution x. Pass iff this relative change is small. - tol = relative error tolerance, as above -a_tol = absolute convergence tolerance (default is 0.0) If one desires the convergence test to check the absolute convergence tolerance *only*, then set the relative convergence tolerance to 0.0. (The default convergence test is <= max(relative_tolerance^2 * , absolute_tolerance^2) - cf_tol = convergence factor tolerance; if >0 used for special test for slow convergence - stop_crit!=0 means (TO BE PHASED OUT): pure absolute error tolerance rather than a pure relative error tolerance on the residual. Never applies if rel_change!=0 or atolf!=0. - atolf = absolute error tolerance factor to be used _together_ with the relative error tolerance, |delta-residual| / ( atolf + |right-hand-side| ) < tol (To BE PHASED OUT) - recompute_residual means: when the iteration seems to be converged, recompute the residual from scratch (r=b-Ax) and use this new residual to repeat the convergence test. This can be expensive, use this only if you have seen a problem with the regular residual computation. - recompute_residual_p means: recompute the residual from scratch (r=b-Ax) every "recompute_residual_p" iterations. This can be expensive and degrade the convergence. Use it only if you have seen a problem with the regular residual computation. */ typedef struct { HYPRE_Real tol; HYPRE_Real atolf; HYPRE_Real cf_tol; HYPRE_Real a_tol; HYPRE_Real rtol; HYPRE_Int max_iter; HYPRE_Int two_norm; HYPRE_Int rel_change; HYPRE_Int recompute_residual; HYPRE_Int recompute_residual_p; HYPRE_Int stop_crit; HYPRE_Int converged; HYPRE_Int hybrid; HYPRE_Int skip_break; HYPRE_Int flex; void *A; void *p; void *s; void *r; /* ...contains the residual. This is currently kept permanently. If that is ever changed, it still must be kept if logging>1 */ void *r_old; /* only needed for flexible CG */ void *v; /* work vector; only needed if recompute_residual_p is set */ HYPRE_Int owns_matvec_data; /* normally 1; if 0, don't delete it */ void *matvec_data; void *precond_data; hypre_PCGFunctions * functions; /* log info (always logged) */ HYPRE_Int num_iterations; HYPRE_Real rel_residual_norm; HYPRE_Int print_level; /* printing when print_level>0 */ HYPRE_Int logging; /* extra computations for logging when logging>0 */ HYPRE_Real *norms; HYPRE_Real *rel_norms; } hypre_PCGData; #define hypre_PCGDataOwnsMatvecData(pcgdata) ((pcgdata) -> owns_matvec_data) #define hypre_PCGDataHybrid(pcgdata) ((pcgdata) -> hybrid) #ifdef __cplusplus extern "C" { #endif /** * @name generic PCG Solver * * Description... **/ /*@{*/ /** * Description... * * @param param [IN] ... **/ hypre_PCGFunctions * hypre_PCGFunctionsCreate( void * (*CAlloc) ( size_t count, size_t elt_size, HYPRE_MemoryLocation location ), HYPRE_Int (*Free) ( void *ptr ), HYPRE_Int (*CommInfo) ( void *A, HYPRE_Int *my_id, HYPRE_Int *num_procs ), void * (*CreateVector) ( void *vector ), HYPRE_Int (*DestroyVector) ( void *vector ), void * (*MatvecCreate) ( void *A, void *x ), HYPRE_Int (*Matvec) ( void *matvec_data, HYPRE_Complex alpha, void *A, void *x, HYPRE_Complex beta, void *y ), HYPRE_Int (*MatvecDestroy) ( void *matvec_data ), HYPRE_Real (*InnerProd) ( void *x, void *y ), HYPRE_Int (*CopyVector) ( void *x, void *y ), HYPRE_Int (*ClearVector) ( void *x ), HYPRE_Int (*ScaleVector) ( HYPRE_Complex alpha, void *x ), HYPRE_Int (*Axpy) ( HYPRE_Complex alpha, void *x, void *y ), HYPRE_Int (*PrecondSetup) ( void *vdata, void *A, void *b, void *x ), HYPRE_Int (*Precond) ( void *vdata, void *A, void *b, void *x ) ); /** * Description... * * @param param [IN] ... **/ void * hypre_PCGCreate( hypre_PCGFunctions *pcg_functions ); #ifdef __cplusplus } #endif #endif /* bicgstab.c */ void *hypre_BiCGSTABCreate ( hypre_BiCGSTABFunctions *bicgstab_functions ); HYPRE_Int hypre_BiCGSTABDestroy ( void *bicgstab_vdata ); HYPRE_Int hypre_BiCGSTABSetup ( void *bicgstab_vdata, void *A, void *b, void *x ); HYPRE_Int hypre_BiCGSTABSolve ( void *bicgstab_vdata, void *A, void *b, void *x ); HYPRE_Int hypre_BiCGSTABSetTol ( void *bicgstab_vdata, HYPRE_Real tol ); HYPRE_Int hypre_BiCGSTABSetAbsoluteTol ( void *bicgstab_vdata, HYPRE_Real a_tol ); HYPRE_Int hypre_BiCGSTABSetConvergenceFactorTol ( void *bicgstab_vdata, HYPRE_Real cf_tol ); HYPRE_Int hypre_BiCGSTABSetMinIter ( void *bicgstab_vdata, HYPRE_Int min_iter ); HYPRE_Int hypre_BiCGSTABSetMaxIter ( void *bicgstab_vdata, HYPRE_Int max_iter ); HYPRE_Int hypre_BiCGSTABSetStopCrit ( void *bicgstab_vdata, HYPRE_Int stop_crit ); HYPRE_Int hypre_BiCGSTABSetPrecond ( void *bicgstab_vdata, HYPRE_Int (*precond )(void*, void*, void*, void*), HYPRE_Int (*precond_setup )(void*, void*, void*, void*), void *precond_data ); HYPRE_Int hypre_BiCGSTABGetPrecond ( void *bicgstab_vdata, HYPRE_Solver *precond_data_ptr ); HYPRE_Int hypre_BiCGSTABSetLogging ( void *bicgstab_vdata, HYPRE_Int logging ); HYPRE_Int hypre_BiCGSTABSetHybrid ( void *bicgstab_vdata, HYPRE_Int logging ); HYPRE_Int hypre_BiCGSTABSetPrintLevel ( void *bicgstab_vdata, HYPRE_Int print_level ); HYPRE_Int hypre_BiCGSTABGetConverged ( void *bicgstab_vdata, HYPRE_Int *converged ); HYPRE_Int hypre_BiCGSTABGetNumIterations ( void *bicgstab_vdata, HYPRE_Int *num_iterations ); HYPRE_Int hypre_BiCGSTABGetFinalRelativeResidualNorm ( void *bicgstab_vdata, HYPRE_Real *relative_residual_norm ); HYPRE_Int hypre_BiCGSTABGetResidual ( void *bicgstab_vdata, void **residual ); /* cgnr.c */ void *hypre_CGNRCreate ( hypre_CGNRFunctions *cgnr_functions ); HYPRE_Int hypre_CGNRDestroy ( void *cgnr_vdata ); HYPRE_Int hypre_CGNRSetup ( void *cgnr_vdata, void *A, void *b, void *x ); HYPRE_Int hypre_CGNRSolve ( void *cgnr_vdata, void *A, void *b, void *x ); HYPRE_Int hypre_CGNRSetTol ( void *cgnr_vdata, HYPRE_Real tol ); HYPRE_Int hypre_CGNRSetMinIter ( void *cgnr_vdata, HYPRE_Int min_iter ); HYPRE_Int hypre_CGNRSetMaxIter ( void *cgnr_vdata, HYPRE_Int max_iter ); HYPRE_Int hypre_CGNRSetStopCrit ( void *cgnr_vdata, HYPRE_Int stop_crit ); HYPRE_Int hypre_CGNRSetPrecond ( void *cgnr_vdata, HYPRE_Int (*precond )(void*, void*, void*, void*), HYPRE_Int (*precondT )(void*, void*, void*, void*), HYPRE_Int (*precond_setup )(void*, void*, void*, void*), void *precond_data ); HYPRE_Int hypre_CGNRGetPrecond ( void *cgnr_vdata, HYPRE_Solver *precond_data_ptr ); HYPRE_Int hypre_CGNRSetLogging ( void *cgnr_vdata, HYPRE_Int logging ); HYPRE_Int hypre_CGNRGetNumIterations ( void *cgnr_vdata, HYPRE_Int *num_iterations ); HYPRE_Int hypre_CGNRGetFinalRelativeResidualNorm ( void *cgnr_vdata, HYPRE_Real *relative_residual_norm ); /* gmres.c */ void *hypre_GMRESCreate ( hypre_GMRESFunctions *gmres_functions ); HYPRE_Int hypre_GMRESDestroy ( void *gmres_vdata ); HYPRE_Int hypre_GMRESGetResidual ( void *gmres_vdata, void **residual ); HYPRE_Int hypre_GMRESSetup ( void *gmres_vdata, void *A, void *b, void *x ); HYPRE_Int hypre_GMRESSolve ( void *gmres_vdata, void *A, void *b, void *x ); HYPRE_Int hypre_GMRESSetKDim ( void *gmres_vdata, HYPRE_Int k_dim ); HYPRE_Int hypre_GMRESGetKDim ( void *gmres_vdata, HYPRE_Int *k_dim ); HYPRE_Int hypre_GMRESSetTol ( void *gmres_vdata, HYPRE_Real tol ); HYPRE_Int hypre_GMRESGetTol ( void *gmres_vdata, HYPRE_Real *tol ); HYPRE_Int hypre_GMRESSetAbsoluteTol ( void *gmres_vdata, HYPRE_Real a_tol ); HYPRE_Int hypre_GMRESGetAbsoluteTol ( void *gmres_vdata, HYPRE_Real *a_tol ); HYPRE_Int hypre_GMRESSetConvergenceFactorTol ( void *gmres_vdata, HYPRE_Real cf_tol ); HYPRE_Int hypre_GMRESGetConvergenceFactorTol ( void *gmres_vdata, HYPRE_Real *cf_tol ); HYPRE_Int hypre_GMRESSetMinIter ( void *gmres_vdata, HYPRE_Int min_iter ); HYPRE_Int hypre_GMRESGetMinIter ( void *gmres_vdata, HYPRE_Int *min_iter ); HYPRE_Int hypre_GMRESSetMaxIter ( void *gmres_vdata, HYPRE_Int max_iter ); HYPRE_Int hypre_GMRESGetMaxIter ( void *gmres_vdata, HYPRE_Int *max_iter ); HYPRE_Int hypre_GMRESSetRelChange ( void *gmres_vdata, HYPRE_Int rel_change ); HYPRE_Int hypre_GMRESGetRelChange ( void *gmres_vdata, HYPRE_Int *rel_change ); HYPRE_Int hypre_GMRESSetSkipRealResidualCheck ( void *gmres_vdata, HYPRE_Int skip_real_r_check ); HYPRE_Int hypre_GMRESGetSkipRealResidualCheck ( void *gmres_vdata, HYPRE_Int *skip_real_r_check ); HYPRE_Int hypre_GMRESSetStopCrit ( void *gmres_vdata, HYPRE_Int stop_crit ); HYPRE_Int hypre_GMRESGetStopCrit ( void *gmres_vdata, HYPRE_Int *stop_crit ); HYPRE_Int hypre_GMRESSetPrecond ( void *gmres_vdata, HYPRE_Int (*precond )(void*, void*, void*, void*), HYPRE_Int (*precond_setup )(void*, void*, void*, void*), void *precond_data ); HYPRE_Int hypre_GMRESGetPrecond ( void *gmres_vdata, HYPRE_Solver *precond_data_ptr ); HYPRE_Int hypre_GMRESSetPrintLevel ( void *gmres_vdata, HYPRE_Int level ); HYPRE_Int hypre_GMRESGetPrintLevel ( void *gmres_vdata, HYPRE_Int *level ); HYPRE_Int hypre_GMRESSetLogging ( void *gmres_vdata, HYPRE_Int level ); HYPRE_Int hypre_GMRESGetLogging ( void *gmres_vdata, HYPRE_Int *level ); HYPRE_Int hypre_GMRESSetHybrid ( void *gmres_vdata, HYPRE_Int level ); HYPRE_Int hypre_GMRESGetNumIterations ( void *gmres_vdata, HYPRE_Int *num_iterations ); HYPRE_Int hypre_GMRESGetConverged ( void *gmres_vdata, HYPRE_Int *converged ); HYPRE_Int hypre_GMRESGetFinalRelativeResidualNorm ( void *gmres_vdata, HYPRE_Real *relative_residual_norm ); /* cogmres.c */ void *hypre_COGMRESCreate ( hypre_COGMRESFunctions *gmres_functions ); HYPRE_Int hypre_COGMRESDestroy ( void *gmres_vdata ); HYPRE_Int hypre_COGMRESGetResidual ( void *gmres_vdata, void **residual ); HYPRE_Int hypre_COGMRESSetup ( void *gmres_vdata, void *A, void *b, void *x ); HYPRE_Int hypre_COGMRESSolve ( void *gmres_vdata, void *A, void *b, void *x ); HYPRE_Int hypre_COGMRESSetKDim ( void *gmres_vdata, HYPRE_Int k_dim ); HYPRE_Int hypre_COGMRESGetKDim ( void *gmres_vdata, HYPRE_Int *k_dim ); HYPRE_Int hypre_COGMRESSetUnroll ( void *gmres_vdata, HYPRE_Int unroll ); HYPRE_Int hypre_COGMRESGetUnroll ( void *gmres_vdata, HYPRE_Int *unroll ); HYPRE_Int hypre_COGMRESSetCGS ( void *gmres_vdata, HYPRE_Int cgs ); HYPRE_Int hypre_COGMRESGetCGS ( void *gmres_vdata, HYPRE_Int *cgs ); HYPRE_Int hypre_COGMRESSetTol ( void *gmres_vdata, HYPRE_Real tol ); HYPRE_Int hypre_COGMRESGetTol ( void *gmres_vdata, HYPRE_Real *tol ); HYPRE_Int hypre_COGMRESSetAbsoluteTol ( void *gmres_vdata, HYPRE_Real a_tol ); HYPRE_Int hypre_COGMRESGetAbsoluteTol ( void *gmres_vdata, HYPRE_Real *a_tol ); HYPRE_Int hypre_COGMRESSetConvergenceFactorTol ( void *gmres_vdata, HYPRE_Real cf_tol ); HYPRE_Int hypre_COGMRESGetConvergenceFactorTol ( void *gmres_vdata, HYPRE_Real *cf_tol ); HYPRE_Int hypre_COGMRESSetMinIter ( void *gmres_vdata, HYPRE_Int min_iter ); HYPRE_Int hypre_COGMRESGetMinIter ( void *gmres_vdata, HYPRE_Int *min_iter ); HYPRE_Int hypre_COGMRESSetMaxIter ( void *gmres_vdata, HYPRE_Int max_iter ); HYPRE_Int hypre_COGMRESGetMaxIter ( void *gmres_vdata, HYPRE_Int *max_iter ); HYPRE_Int hypre_COGMRESSetRelChange ( void *gmres_vdata, HYPRE_Int rel_change ); HYPRE_Int hypre_COGMRESGetRelChange ( void *gmres_vdata, HYPRE_Int *rel_change ); HYPRE_Int hypre_COGMRESSetSkipRealResidualCheck ( void *gmres_vdata, HYPRE_Int skip_real_r_check ); HYPRE_Int hypre_COGMRESGetSkipRealResidualCheck ( void *gmres_vdata, HYPRE_Int *skip_real_r_check ); HYPRE_Int hypre_COGMRESSetPrecond ( void *gmres_vdata, HYPRE_Int (*precond )(void*, void*, void*, void*), HYPRE_Int (*precond_setup )(void*, void*, void*, void*), void *precond_data ); HYPRE_Int hypre_COGMRESGetPrecond ( void *gmres_vdata, HYPRE_Solver *precond_data_ptr ); HYPRE_Int hypre_COGMRESSetPrintLevel ( void *gmres_vdata, HYPRE_Int level ); HYPRE_Int hypre_COGMRESGetPrintLevel ( void *gmres_vdata, HYPRE_Int *level ); HYPRE_Int hypre_COGMRESSetLogging ( void *gmres_vdata, HYPRE_Int level ); HYPRE_Int hypre_COGMRESGetLogging ( void *gmres_vdata, HYPRE_Int *level ); HYPRE_Int hypre_COGMRESGetNumIterations ( void *gmres_vdata, HYPRE_Int *num_iterations ); HYPRE_Int hypre_COGMRESGetConverged ( void *gmres_vdata, HYPRE_Int *converged ); HYPRE_Int hypre_COGMRESGetFinalRelativeResidualNorm ( void *gmres_vdata, HYPRE_Real *relative_residual_norm ); HYPRE_Int hypre_COGMRESSetModifyPC ( void *fgmres_vdata, HYPRE_Int (*modify_pc )(void *precond_data, HYPRE_Int iteration, HYPRE_Real rel_residual_norm)); /* flexgmres.c */ void *hypre_FlexGMRESCreate ( hypre_FlexGMRESFunctions *fgmres_functions ); HYPRE_Int hypre_FlexGMRESDestroy ( void *fgmres_vdata ); HYPRE_Int hypre_FlexGMRESGetResidual ( void *fgmres_vdata, void **residual ); HYPRE_Int hypre_FlexGMRESSetup ( void *fgmres_vdata, void *A, void *b, void *x ); HYPRE_Int hypre_FlexGMRESSolve ( void *fgmres_vdata, void *A, void *b, void *x ); HYPRE_Int hypre_FlexGMRESSetKDim ( void *fgmres_vdata, HYPRE_Int k_dim ); HYPRE_Int hypre_FlexGMRESGetKDim ( void *fgmres_vdata, HYPRE_Int *k_dim ); HYPRE_Int hypre_FlexGMRESSetTol ( void *fgmres_vdata, HYPRE_Real tol ); HYPRE_Int hypre_FlexGMRESGetTol ( void *fgmres_vdata, HYPRE_Real *tol ); HYPRE_Int hypre_FlexGMRESSetAbsoluteTol ( void *fgmres_vdata, HYPRE_Real a_tol ); HYPRE_Int hypre_FlexGMRESGetAbsoluteTol ( void *fgmres_vdata, HYPRE_Real *a_tol ); HYPRE_Int hypre_FlexGMRESSetConvergenceFactorTol ( void *fgmres_vdata, HYPRE_Real cf_tol ); HYPRE_Int hypre_FlexGMRESGetConvergenceFactorTol ( void *fgmres_vdata, HYPRE_Real *cf_tol ); HYPRE_Int hypre_FlexGMRESSetMinIter ( void *fgmres_vdata, HYPRE_Int min_iter ); HYPRE_Int hypre_FlexGMRESGetMinIter ( void *fgmres_vdata, HYPRE_Int *min_iter ); HYPRE_Int hypre_FlexGMRESSetMaxIter ( void *fgmres_vdata, HYPRE_Int max_iter ); HYPRE_Int hypre_FlexGMRESGetMaxIter ( void *fgmres_vdata, HYPRE_Int *max_iter ); HYPRE_Int hypre_FlexGMRESSetStopCrit ( void *fgmres_vdata, HYPRE_Int stop_crit ); HYPRE_Int hypre_FlexGMRESGetStopCrit ( void *fgmres_vdata, HYPRE_Int *stop_crit ); HYPRE_Int hypre_FlexGMRESSetPrecond ( void *fgmres_vdata, HYPRE_Int (*precond )(void*, void*, void*, void*), HYPRE_Int (*precond_setup )(void*, void*, void*, void*), void *precond_data ); HYPRE_Int hypre_FlexGMRESGetPrecond ( void *fgmres_vdata, HYPRE_Solver *precond_data_ptr ); HYPRE_Int hypre_FlexGMRESSetPrintLevel ( void *fgmres_vdata, HYPRE_Int level ); HYPRE_Int hypre_FlexGMRESGetPrintLevel ( void *fgmres_vdata, HYPRE_Int *level ); HYPRE_Int hypre_FlexGMRESSetLogging ( void *fgmres_vdata, HYPRE_Int level ); HYPRE_Int hypre_FlexGMRESGetLogging ( void *fgmres_vdata, HYPRE_Int *level ); HYPRE_Int hypre_FlexGMRESGetNumIterations ( void *fgmres_vdata, HYPRE_Int *num_iterations ); HYPRE_Int hypre_FlexGMRESGetConverged ( void *fgmres_vdata, HYPRE_Int *converged ); HYPRE_Int hypre_FlexGMRESGetFinalRelativeResidualNorm ( void *fgmres_vdata, HYPRE_Real *relative_residual_norm ); HYPRE_Int hypre_FlexGMRESSetModifyPC ( void *fgmres_vdata, HYPRE_Int (*modify_pc )(void *precond_data, HYPRE_Int iteration, HYPRE_Real rel_residual_norm)); HYPRE_Int hypre_FlexGMRESModifyPCDefault ( void *precond_data, HYPRE_Int iteration, HYPRE_Real rel_residual_norm ); /* lgmres.c */ void *hypre_LGMRESCreate ( hypre_LGMRESFunctions *lgmres_functions ); HYPRE_Int hypre_LGMRESDestroy ( void *lgmres_vdata ); HYPRE_Int hypre_LGMRESGetResidual ( void *lgmres_vdata, void **residual ); HYPRE_Int hypre_LGMRESSetup ( void *lgmres_vdata, void *A, void *b, void *x ); HYPRE_Int hypre_LGMRESSolve ( void *lgmres_vdata, void *A, void *b, void *x ); HYPRE_Int hypre_LGMRESSetKDim ( void *lgmres_vdata, HYPRE_Int k_dim ); HYPRE_Int hypre_LGMRESGetKDim ( void *lgmres_vdata, HYPRE_Int *k_dim ); HYPRE_Int hypre_LGMRESSetAugDim ( void *lgmres_vdata, HYPRE_Int aug_dim ); HYPRE_Int hypre_LGMRESGetAugDim ( void *lgmres_vdata, HYPRE_Int *aug_dim ); HYPRE_Int hypre_LGMRESSetTol ( void *lgmres_vdata, HYPRE_Real tol ); HYPRE_Int hypre_LGMRESGetTol ( void *lgmres_vdata, HYPRE_Real *tol ); HYPRE_Int hypre_LGMRESSetAbsoluteTol ( void *lgmres_vdata, HYPRE_Real a_tol ); HYPRE_Int hypre_LGMRESGetAbsoluteTol ( void *lgmres_vdata, HYPRE_Real *a_tol ); HYPRE_Int hypre_LGMRESSetConvergenceFactorTol ( void *lgmres_vdata, HYPRE_Real cf_tol ); HYPRE_Int hypre_LGMRESGetConvergenceFactorTol ( void *lgmres_vdata, HYPRE_Real *cf_tol ); HYPRE_Int hypre_LGMRESSetMinIter ( void *lgmres_vdata, HYPRE_Int min_iter ); HYPRE_Int hypre_LGMRESGetMinIter ( void *lgmres_vdata, HYPRE_Int *min_iter ); HYPRE_Int hypre_LGMRESSetMaxIter ( void *lgmres_vdata, HYPRE_Int max_iter ); HYPRE_Int hypre_LGMRESGetMaxIter ( void *lgmres_vdata, HYPRE_Int *max_iter ); HYPRE_Int hypre_LGMRESSetStopCrit ( void *lgmres_vdata, HYPRE_Int stop_crit ); HYPRE_Int hypre_LGMRESGetStopCrit ( void *lgmres_vdata, HYPRE_Int *stop_crit ); HYPRE_Int hypre_LGMRESSetPrecond ( void *lgmres_vdata, HYPRE_Int (*precond )(void*, void*, void*, void*), HYPRE_Int (*precond_setup )(void*, void*, void*, void*), void *precond_data ); HYPRE_Int hypre_LGMRESGetPrecond ( void *lgmres_vdata, HYPRE_Solver *precond_data_ptr ); HYPRE_Int hypre_LGMRESSetPrintLevel ( void *lgmres_vdata, HYPRE_Int level ); HYPRE_Int hypre_LGMRESGetPrintLevel ( void *lgmres_vdata, HYPRE_Int *level ); HYPRE_Int hypre_LGMRESSetLogging ( void *lgmres_vdata, HYPRE_Int level ); HYPRE_Int hypre_LGMRESGetLogging ( void *lgmres_vdata, HYPRE_Int *level ); HYPRE_Int hypre_LGMRESGetNumIterations ( void *lgmres_vdata, HYPRE_Int *num_iterations ); HYPRE_Int hypre_LGMRESGetConverged ( void *lgmres_vdata, HYPRE_Int *converged ); HYPRE_Int hypre_LGMRESGetFinalRelativeResidualNorm ( void *lgmres_vdata, HYPRE_Real *relative_residual_norm ); /* HYPRE_bicgstab.c */ HYPRE_Int HYPRE_BiCGSTABDestroy ( HYPRE_Solver solver ); HYPRE_Int HYPRE_BiCGSTABSetup ( HYPRE_Solver solver, HYPRE_Matrix A, HYPRE_Vector b, HYPRE_Vector x ); HYPRE_Int HYPRE_BiCGSTABSolve ( HYPRE_Solver solver, HYPRE_Matrix A, HYPRE_Vector b, HYPRE_Vector x ); HYPRE_Int HYPRE_BiCGSTABSetTol ( HYPRE_Solver solver, HYPRE_Real tol ); HYPRE_Int HYPRE_BiCGSTABSetAbsoluteTol ( HYPRE_Solver solver, HYPRE_Real a_tol ); HYPRE_Int HYPRE_BiCGSTABSetConvergenceFactorTol ( HYPRE_Solver solver, HYPRE_Real cf_tol ); HYPRE_Int HYPRE_BiCGSTABSetMinIter ( HYPRE_Solver solver, HYPRE_Int min_iter ); HYPRE_Int HYPRE_BiCGSTABSetMaxIter ( HYPRE_Solver solver, HYPRE_Int max_iter ); HYPRE_Int HYPRE_BiCGSTABSetStopCrit ( HYPRE_Solver solver, HYPRE_Int stop_crit ); HYPRE_Int HYPRE_BiCGSTABSetPrecond ( HYPRE_Solver solver, HYPRE_PtrToSolverFcn precond, HYPRE_PtrToSolverFcn precond_setup, HYPRE_Solver precond_solver ); HYPRE_Int HYPRE_BiCGSTABGetPrecond ( HYPRE_Solver solver, HYPRE_Solver *precond_data_ptr ); HYPRE_Int HYPRE_BiCGSTABSetLogging ( HYPRE_Solver solver, HYPRE_Int logging ); HYPRE_Int HYPRE_BiCGSTABSetPrintLevel ( HYPRE_Solver solver, HYPRE_Int print_level ); HYPRE_Int HYPRE_BiCGSTABGetNumIterations ( HYPRE_Solver solver, HYPRE_Int *num_iterations ); HYPRE_Int HYPRE_BiCGSTABGetFinalRelativeResidualNorm ( HYPRE_Solver solver, HYPRE_Real *norm ); HYPRE_Int HYPRE_BiCGSTABGetResidual ( HYPRE_Solver solver, void *residual ); /* HYPRE_cgnr.c */ HYPRE_Int HYPRE_CGNRDestroy ( HYPRE_Solver solver ); HYPRE_Int HYPRE_CGNRSetup ( HYPRE_Solver solver, HYPRE_Matrix A, HYPRE_Vector b, HYPRE_Vector x ); HYPRE_Int HYPRE_CGNRSolve ( HYPRE_Solver solver, HYPRE_Matrix A, HYPRE_Vector b, HYPRE_Vector x ); HYPRE_Int HYPRE_CGNRSetTol ( HYPRE_Solver solver, HYPRE_Real tol ); HYPRE_Int HYPRE_CGNRSetMinIter ( HYPRE_Solver solver, HYPRE_Int min_iter ); HYPRE_Int HYPRE_CGNRSetMaxIter ( HYPRE_Solver solver, HYPRE_Int max_iter ); HYPRE_Int HYPRE_CGNRSetStopCrit ( HYPRE_Solver solver, HYPRE_Int stop_crit ); HYPRE_Int HYPRE_CGNRSetPrecond ( HYPRE_Solver solver, HYPRE_PtrToSolverFcn precond, HYPRE_PtrToSolverFcn precondT, HYPRE_PtrToSolverFcn precond_setup, HYPRE_Solver precond_solver ); HYPRE_Int HYPRE_CGNRGetPrecond ( HYPRE_Solver solver, HYPRE_Solver *precond_data_ptr ); HYPRE_Int HYPRE_CGNRSetLogging ( HYPRE_Solver solver, HYPRE_Int logging ); HYPRE_Int HYPRE_CGNRGetNumIterations ( HYPRE_Solver solver, HYPRE_Int *num_iterations ); HYPRE_Int HYPRE_CGNRGetFinalRelativeResidualNorm ( HYPRE_Solver solver, HYPRE_Real *norm ); /* HYPRE_gmres.c */ HYPRE_Int HYPRE_GMRESSetup ( HYPRE_Solver solver, HYPRE_Matrix A, HYPRE_Vector b, HYPRE_Vector x ); HYPRE_Int HYPRE_GMRESSolve ( HYPRE_Solver solver, HYPRE_Matrix A, HYPRE_Vector b, HYPRE_Vector x ); HYPRE_Int HYPRE_GMRESSetKDim ( HYPRE_Solver solver, HYPRE_Int k_dim ); HYPRE_Int HYPRE_GMRESGetKDim ( HYPRE_Solver solver, HYPRE_Int *k_dim ); HYPRE_Int HYPRE_GMRESSetTol ( HYPRE_Solver solver, HYPRE_Real tol ); HYPRE_Int HYPRE_GMRESGetTol ( HYPRE_Solver solver, HYPRE_Real *tol ); HYPRE_Int HYPRE_GMRESSetAbsoluteTol ( HYPRE_Solver solver, HYPRE_Real a_tol ); HYPRE_Int HYPRE_GMRESGetAbsoluteTol ( HYPRE_Solver solver, HYPRE_Real *a_tol ); HYPRE_Int HYPRE_GMRESSetConvergenceFactorTol ( HYPRE_Solver solver, HYPRE_Real cf_tol ); HYPRE_Int HYPRE_GMRESGetConvergenceFactorTol ( HYPRE_Solver solver, HYPRE_Real *cf_tol ); HYPRE_Int HYPRE_GMRESSetMinIter ( HYPRE_Solver solver, HYPRE_Int min_iter ); HYPRE_Int HYPRE_GMRESGetMinIter ( HYPRE_Solver solver, HYPRE_Int *min_iter ); HYPRE_Int HYPRE_GMRESSetMaxIter ( HYPRE_Solver solver, HYPRE_Int max_iter ); HYPRE_Int HYPRE_GMRESGetMaxIter ( HYPRE_Solver solver, HYPRE_Int *max_iter ); HYPRE_Int HYPRE_GMRESSetStopCrit ( HYPRE_Solver solver, HYPRE_Int stop_crit ); HYPRE_Int HYPRE_GMRESGetStopCrit ( HYPRE_Solver solver, HYPRE_Int *stop_crit ); HYPRE_Int HYPRE_GMRESSetRelChange ( HYPRE_Solver solver, HYPRE_Int rel_change ); HYPRE_Int HYPRE_GMRESGetRelChange ( HYPRE_Solver solver, HYPRE_Int *rel_change ); HYPRE_Int HYPRE_GMRESSetSkipRealResidualCheck ( HYPRE_Solver solver, HYPRE_Int skip_real_r_check ); HYPRE_Int HYPRE_GMRESGetSkipRealResidualCheck ( HYPRE_Solver solver, HYPRE_Int *skip_real_r_check ); HYPRE_Int HYPRE_GMRESSetPrecond ( HYPRE_Solver solver, HYPRE_PtrToSolverFcn precond, HYPRE_PtrToSolverFcn precond_setup, HYPRE_Solver precond_solver ); HYPRE_Int HYPRE_GMRESGetPrecond ( HYPRE_Solver solver, HYPRE_Solver *precond_data_ptr ); HYPRE_Int HYPRE_GMRESSetPrintLevel ( HYPRE_Solver solver, HYPRE_Int level ); HYPRE_Int HYPRE_GMRESGetPrintLevel ( HYPRE_Solver solver, HYPRE_Int *level ); HYPRE_Int HYPRE_GMRESSetLogging ( HYPRE_Solver solver, HYPRE_Int level ); HYPRE_Int HYPRE_GMRESGetLogging ( HYPRE_Solver solver, HYPRE_Int *level ); HYPRE_Int HYPRE_GMRESGetNumIterations ( HYPRE_Solver solver, HYPRE_Int *num_iterations ); HYPRE_Int HYPRE_GMRESGetConverged ( HYPRE_Solver solver, HYPRE_Int *converged ); HYPRE_Int HYPRE_GMRESGetFinalRelativeResidualNorm ( HYPRE_Solver solver, HYPRE_Real *norm ); HYPRE_Int HYPRE_GMRESGetResidual ( HYPRE_Solver solver, void *residual ); /* HYPRE_cogmres.c */ HYPRE_Int HYPRE_COGMRESSetup ( HYPRE_Solver solver, HYPRE_Matrix A, HYPRE_Vector b, HYPRE_Vector x ); HYPRE_Int HYPRE_COGMRESSolve ( HYPRE_Solver solver, HYPRE_Matrix A, HYPRE_Vector b, HYPRE_Vector x ); HYPRE_Int HYPRE_COGMRESSetKDim ( HYPRE_Solver solver, HYPRE_Int k_dim ); HYPRE_Int HYPRE_COGMRESGetKDim ( HYPRE_Solver solver, HYPRE_Int *k_dim ); HYPRE_Int HYPRE_COGMRESSetUnroll ( HYPRE_Solver solver, HYPRE_Int unroll ); HYPRE_Int HYPRE_COGMRESGetUnroll ( HYPRE_Solver solver, HYPRE_Int *unroll ); HYPRE_Int HYPRE_COGMRESSetCGS ( HYPRE_Solver solver, HYPRE_Int cgs ); HYPRE_Int HYPRE_COGMRESGetCGS ( HYPRE_Solver solver, HYPRE_Int *cgs ); HYPRE_Int HYPRE_COGMRESSetTol ( HYPRE_Solver solver, HYPRE_Real tol ); HYPRE_Int HYPRE_COGMRESGetTol ( HYPRE_Solver solver, HYPRE_Real *tol ); HYPRE_Int HYPRE_COGMRESSetAbsoluteTol ( HYPRE_Solver solver, HYPRE_Real a_tol ); HYPRE_Int HYPRE_COGMRESGetAbsoluteTol ( HYPRE_Solver solver, HYPRE_Real *a_tol ); HYPRE_Int HYPRE_COGMRESSetConvergenceFactorTol ( HYPRE_Solver solver, HYPRE_Real cf_tol ); HYPRE_Int HYPRE_COGMRESGetConvergenceFactorTol ( HYPRE_Solver solver, HYPRE_Real *cf_tol ); HYPRE_Int HYPRE_COGMRESSetMinIter ( HYPRE_Solver solver, HYPRE_Int min_iter ); HYPRE_Int HYPRE_COGMRESGetMinIter ( HYPRE_Solver solver, HYPRE_Int *min_iter ); HYPRE_Int HYPRE_COGMRESSetMaxIter ( HYPRE_Solver solver, HYPRE_Int max_iter ); HYPRE_Int HYPRE_COGMRESGetMaxIter ( HYPRE_Solver solver, HYPRE_Int *max_iter ); HYPRE_Int HYPRE_COGMRESSetRelChange ( HYPRE_Solver solver, HYPRE_Int rel_change ); HYPRE_Int HYPRE_COGMRESGetRelChange ( HYPRE_Solver solver, HYPRE_Int *rel_change ); HYPRE_Int HYPRE_COGMRESSetSkipRealResidualCheck ( HYPRE_Solver solver, HYPRE_Int skip_real_r_check ); HYPRE_Int HYPRE_COGMRESGetSkipRealResidualCheck ( HYPRE_Solver solver, HYPRE_Int *skip_real_r_check ); HYPRE_Int HYPRE_COGMRESSetPrecond ( HYPRE_Solver solver, HYPRE_PtrToSolverFcn precond, HYPRE_PtrToSolverFcn precond_setup, HYPRE_Solver precond_solver ); HYPRE_Int HYPRE_COGMRESGetPrecond ( HYPRE_Solver solver, HYPRE_Solver *precond_data_ptr ); HYPRE_Int HYPRE_COGMRESSetPrintLevel ( HYPRE_Solver solver, HYPRE_Int level ); HYPRE_Int HYPRE_COGMRESGetPrintLevel ( HYPRE_Solver solver, HYPRE_Int *level ); HYPRE_Int HYPRE_COGMRESSetLogging ( HYPRE_Solver solver, HYPRE_Int level ); HYPRE_Int HYPRE_COGMRESGetLogging ( HYPRE_Solver solver, HYPRE_Int *level ); HYPRE_Int HYPRE_COGMRESGetNumIterations ( HYPRE_Solver solver, HYPRE_Int *num_iterations ); HYPRE_Int HYPRE_COGMRESGetConverged ( HYPRE_Solver solver, HYPRE_Int *converged ); HYPRE_Int HYPRE_COGMRESGetFinalRelativeResidualNorm ( HYPRE_Solver solver, HYPRE_Real *norm ); HYPRE_Int HYPRE_COGMRESGetResidual ( HYPRE_Solver solver, void *residual ); /* HYPRE_flexgmres.c */ HYPRE_Int HYPRE_FlexGMRESSetup ( HYPRE_Solver solver, HYPRE_Matrix A, HYPRE_Vector b, HYPRE_Vector x ); HYPRE_Int HYPRE_FlexGMRESSolve ( HYPRE_Solver solver, HYPRE_Matrix A, HYPRE_Vector b, HYPRE_Vector x ); HYPRE_Int HYPRE_FlexGMRESSetKDim ( HYPRE_Solver solver, HYPRE_Int k_dim ); HYPRE_Int HYPRE_FlexGMRESGetKDim ( HYPRE_Solver solver, HYPRE_Int *k_dim ); HYPRE_Int HYPRE_FlexGMRESSetTol ( HYPRE_Solver solver, HYPRE_Real tol ); HYPRE_Int HYPRE_FlexGMRESGetTol ( HYPRE_Solver solver, HYPRE_Real *tol ); HYPRE_Int HYPRE_FlexGMRESSetAbsoluteTol ( HYPRE_Solver solver, HYPRE_Real a_tol ); HYPRE_Int HYPRE_FlexGMRESGetAbsoluteTol ( HYPRE_Solver solver, HYPRE_Real *a_tol ); HYPRE_Int HYPRE_FlexGMRESSetConvergenceFactorTol ( HYPRE_Solver solver, HYPRE_Real cf_tol ); HYPRE_Int HYPRE_FlexGMRESGetConvergenceFactorTol ( HYPRE_Solver solver, HYPRE_Real *cf_tol ); HYPRE_Int HYPRE_FlexGMRESSetMinIter ( HYPRE_Solver solver, HYPRE_Int min_iter ); HYPRE_Int HYPRE_FlexGMRESGetMinIter ( HYPRE_Solver solver, HYPRE_Int *min_iter ); HYPRE_Int HYPRE_FlexGMRESSetMaxIter ( HYPRE_Solver solver, HYPRE_Int max_iter ); HYPRE_Int HYPRE_FlexGMRESGetMaxIter ( HYPRE_Solver solver, HYPRE_Int *max_iter ); HYPRE_Int HYPRE_FlexGMRESSetPrecond ( HYPRE_Solver solver, HYPRE_PtrToSolverFcn precond, HYPRE_PtrToSolverFcn precond_setup, HYPRE_Solver precond_solver ); HYPRE_Int HYPRE_FlexGMRESGetPrecond ( HYPRE_Solver solver, HYPRE_Solver *precond_data_ptr ); HYPRE_Int HYPRE_FlexGMRESSetPrintLevel ( HYPRE_Solver solver, HYPRE_Int level ); HYPRE_Int HYPRE_FlexGMRESGetPrintLevel ( HYPRE_Solver solver, HYPRE_Int *level ); HYPRE_Int HYPRE_FlexGMRESSetLogging ( HYPRE_Solver solver, HYPRE_Int level ); HYPRE_Int HYPRE_FlexGMRESGetLogging ( HYPRE_Solver solver, HYPRE_Int *level ); HYPRE_Int HYPRE_FlexGMRESGetNumIterations ( HYPRE_Solver solver, HYPRE_Int *num_iterations ); HYPRE_Int HYPRE_FlexGMRESGetConverged ( HYPRE_Solver solver, HYPRE_Int *converged ); HYPRE_Int HYPRE_FlexGMRESGetFinalRelativeResidualNorm ( HYPRE_Solver solver, HYPRE_Real *norm ); HYPRE_Int HYPRE_FlexGMRESGetResidual ( HYPRE_Solver solver, void *residual ); HYPRE_Int HYPRE_FlexGMRESSetModifyPC ( HYPRE_Solver solver, HYPRE_Int (*modify_pc )(HYPRE_Solver, HYPRE_Int, HYPRE_Real )); /* HYPRE_lgmres.c */ HYPRE_Int HYPRE_LGMRESSetup ( HYPRE_Solver solver, HYPRE_Matrix A, HYPRE_Vector b, HYPRE_Vector x ); HYPRE_Int HYPRE_LGMRESSolve ( HYPRE_Solver solver, HYPRE_Matrix A, HYPRE_Vector b, HYPRE_Vector x ); HYPRE_Int HYPRE_LGMRESSetKDim ( HYPRE_Solver solver, HYPRE_Int k_dim ); HYPRE_Int HYPRE_LGMRESGetKDim ( HYPRE_Solver solver, HYPRE_Int *k_dim ); HYPRE_Int HYPRE_LGMRESSetAugDim ( HYPRE_Solver solver, HYPRE_Int aug_dim ); HYPRE_Int HYPRE_LGMRESGetAugDim ( HYPRE_Solver solver, HYPRE_Int *aug_dim ); HYPRE_Int HYPRE_LGMRESSetTol ( HYPRE_Solver solver, HYPRE_Real tol ); HYPRE_Int HYPRE_LGMRESGetTol ( HYPRE_Solver solver, HYPRE_Real *tol ); HYPRE_Int HYPRE_LGMRESSetAbsoluteTol ( HYPRE_Solver solver, HYPRE_Real a_tol ); HYPRE_Int HYPRE_LGMRESGetAbsoluteTol ( HYPRE_Solver solver, HYPRE_Real *a_tol ); HYPRE_Int HYPRE_LGMRESSetConvergenceFactorTol ( HYPRE_Solver solver, HYPRE_Real cf_tol ); HYPRE_Int HYPRE_LGMRESGetConvergenceFactorTol ( HYPRE_Solver solver, HYPRE_Real *cf_tol ); HYPRE_Int HYPRE_LGMRESSetMinIter ( HYPRE_Solver solver, HYPRE_Int min_iter ); HYPRE_Int HYPRE_LGMRESGetMinIter ( HYPRE_Solver solver, HYPRE_Int *min_iter ); HYPRE_Int HYPRE_LGMRESSetMaxIter ( HYPRE_Solver solver, HYPRE_Int max_iter ); HYPRE_Int HYPRE_LGMRESGetMaxIter ( HYPRE_Solver solver, HYPRE_Int *max_iter ); HYPRE_Int HYPRE_LGMRESSetPrecond ( HYPRE_Solver solver, HYPRE_PtrToSolverFcn precond, HYPRE_PtrToSolverFcn precond_setup, HYPRE_Solver precond_solver ); HYPRE_Int HYPRE_LGMRESGetPrecond ( HYPRE_Solver solver, HYPRE_Solver *precond_data_ptr ); HYPRE_Int HYPRE_LGMRESSetPrintLevel ( HYPRE_Solver solver, HYPRE_Int level ); HYPRE_Int HYPRE_LGMRESGetPrintLevel ( HYPRE_Solver solver, HYPRE_Int *level ); HYPRE_Int HYPRE_LGMRESSetLogging ( HYPRE_Solver solver, HYPRE_Int level ); HYPRE_Int HYPRE_LGMRESGetLogging ( HYPRE_Solver solver, HYPRE_Int *level ); HYPRE_Int HYPRE_LGMRESGetNumIterations ( HYPRE_Solver solver, HYPRE_Int *num_iterations ); HYPRE_Int HYPRE_LGMRESGetConverged ( HYPRE_Solver solver, HYPRE_Int *converged ); HYPRE_Int HYPRE_LGMRESGetFinalRelativeResidualNorm ( HYPRE_Solver solver, HYPRE_Real *norm ); HYPRE_Int HYPRE_LGMRESGetResidual ( HYPRE_Solver solver, void *residual ); /* HYPRE_pcg.c */ HYPRE_Int HYPRE_PCGSetup ( HYPRE_Solver solver, HYPRE_Matrix A, HYPRE_Vector b, HYPRE_Vector x ); HYPRE_Int HYPRE_PCGSolve ( HYPRE_Solver solver, HYPRE_Matrix A, HYPRE_Vector b, HYPRE_Vector x ); HYPRE_Int HYPRE_PCGSetTol ( HYPRE_Solver solver, HYPRE_Real tol ); HYPRE_Int HYPRE_PCGGetTol ( HYPRE_Solver solver, HYPRE_Real *tol ); HYPRE_Int HYPRE_PCGSetAbsoluteTol ( HYPRE_Solver solver, HYPRE_Real a_tol ); HYPRE_Int HYPRE_PCGGetAbsoluteTol ( HYPRE_Solver solver, HYPRE_Real *a_tol ); HYPRE_Int HYPRE_PCGSetAbsoluteTolFactor ( HYPRE_Solver solver, HYPRE_Real abstolf ); HYPRE_Int HYPRE_PCGGetAbsoluteTolFactor ( HYPRE_Solver solver, HYPRE_Real *abstolf ); HYPRE_Int HYPRE_PCGSetResidualTol ( HYPRE_Solver solver, HYPRE_Real rtol ); HYPRE_Int HYPRE_PCGGetResidualTol ( HYPRE_Solver solver, HYPRE_Real *rtol ); HYPRE_Int HYPRE_PCGSetConvergenceFactorTol ( HYPRE_Solver solver, HYPRE_Real cf_tol ); HYPRE_Int HYPRE_PCGGetConvergenceFactorTol ( HYPRE_Solver solver, HYPRE_Real *cf_tol ); HYPRE_Int HYPRE_PCGSetMaxIter ( HYPRE_Solver solver, HYPRE_Int max_iter ); HYPRE_Int HYPRE_PCGGetMaxIter ( HYPRE_Solver solver, HYPRE_Int *max_iter ); HYPRE_Int HYPRE_PCGSetStopCrit ( HYPRE_Solver solver, HYPRE_Int stop_crit ); HYPRE_Int HYPRE_PCGGetStopCrit ( HYPRE_Solver solver, HYPRE_Int *stop_crit ); HYPRE_Int HYPRE_PCGSetTwoNorm ( HYPRE_Solver solver, HYPRE_Int two_norm ); HYPRE_Int HYPRE_PCGGetTwoNorm ( HYPRE_Solver solver, HYPRE_Int *two_norm ); HYPRE_Int HYPRE_PCGSetRelChange ( HYPRE_Solver solver, HYPRE_Int rel_change ); HYPRE_Int HYPRE_PCGGetRelChange ( HYPRE_Solver solver, HYPRE_Int *rel_change ); HYPRE_Int HYPRE_PCGSetRecomputeResidual ( HYPRE_Solver solver, HYPRE_Int recompute_residual ); HYPRE_Int HYPRE_PCGGetRecomputeResidual ( HYPRE_Solver solver, HYPRE_Int *recompute_residual ); HYPRE_Int HYPRE_PCGSetRecomputeResidualP ( HYPRE_Solver solver, HYPRE_Int recompute_residual_p ); HYPRE_Int HYPRE_PCGGetRecomputeResidualP ( HYPRE_Solver solver, HYPRE_Int *recompute_residual_p ); HYPRE_Int HYPRE_PCGSetSkipBreak ( HYPRE_Solver solver, HYPRE_Int skip_break ); HYPRE_Int HYPRE_PCGGetSkipBreak ( HYPRE_Solver solver, HYPRE_Int *skip_break ); HYPRE_Int HYPRE_PCGSetFlex ( HYPRE_Solver solver, HYPRE_Int flex ); HYPRE_Int HYPRE_PCGGetFlex ( HYPRE_Solver solver, HYPRE_Int *flex ); HYPRE_Int HYPRE_PCGSetPrecond ( HYPRE_Solver solver, HYPRE_PtrToSolverFcn precond, HYPRE_PtrToSolverFcn precond_setup, HYPRE_Solver precond_solver ); HYPRE_Int HYPRE_PCGSetPreconditioner ( HYPRE_Solver solver, HYPRE_Solver precond_solver ); HYPRE_Int HYPRE_PCGGetPrecond ( HYPRE_Solver solver, HYPRE_Solver *precond_data_ptr ); HYPRE_Int HYPRE_PCGSetLogging ( HYPRE_Solver solver, HYPRE_Int level ); HYPRE_Int HYPRE_PCGGetLogging ( HYPRE_Solver solver, HYPRE_Int *level ); HYPRE_Int HYPRE_PCGSetPrintLevel ( HYPRE_Solver solver, HYPRE_Int level ); HYPRE_Int HYPRE_PCGGetPrintLevel ( HYPRE_Solver solver, HYPRE_Int *level ); HYPRE_Int HYPRE_PCGGetNumIterations ( HYPRE_Solver solver, HYPRE_Int *num_iterations ); HYPRE_Int HYPRE_PCGGetConverged ( HYPRE_Solver solver, HYPRE_Int *converged ); HYPRE_Int HYPRE_PCGGetFinalRelativeResidualNorm ( HYPRE_Solver solver, HYPRE_Real *norm ); HYPRE_Int HYPRE_PCGGetResidual ( HYPRE_Solver solver, void *residual ); /* pcg.c */ void *hypre_PCGCreate ( hypre_PCGFunctions *pcg_functions ); HYPRE_Int hypre_PCGDestroy ( void *pcg_vdata ); HYPRE_Int hypre_PCGGetResidual ( void *pcg_vdata, void **residual ); HYPRE_Int hypre_PCGSetup ( void *pcg_vdata, void *A, void *b, void *x ); HYPRE_Int hypre_PCGSolve ( void *pcg_vdata, void *A, void *b, void *x ); HYPRE_Int hypre_PCGSetTol ( void *pcg_vdata, HYPRE_Real tol ); HYPRE_Int hypre_PCGGetTol ( void *pcg_vdata, HYPRE_Real *tol ); HYPRE_Int hypre_PCGSetAbsoluteTol ( void *pcg_vdata, HYPRE_Real a_tol ); HYPRE_Int hypre_PCGGetAbsoluteTol ( void *pcg_vdata, HYPRE_Real *a_tol ); HYPRE_Int hypre_PCGSetAbsoluteTolFactor ( void *pcg_vdata, HYPRE_Real atolf ); HYPRE_Int hypre_PCGGetAbsoluteTolFactor ( void *pcg_vdata, HYPRE_Real *atolf ); HYPRE_Int hypre_PCGSetResidualTol ( void *pcg_vdata, HYPRE_Real rtol ); HYPRE_Int hypre_PCGGetResidualTol ( void *pcg_vdata, HYPRE_Real *rtol ); HYPRE_Int hypre_PCGSetConvergenceFactorTol ( void *pcg_vdata, HYPRE_Real cf_tol ); HYPRE_Int hypre_PCGGetConvergenceFactorTol ( void *pcg_vdata, HYPRE_Real *cf_tol ); HYPRE_Int hypre_PCGSetMaxIter ( void *pcg_vdata, HYPRE_Int max_iter ); HYPRE_Int hypre_PCGGetMaxIter ( void *pcg_vdata, HYPRE_Int *max_iter ); HYPRE_Int hypre_PCGSetTwoNorm ( void *pcg_vdata, HYPRE_Int two_norm ); HYPRE_Int hypre_PCGGetTwoNorm ( void *pcg_vdata, HYPRE_Int *two_norm ); HYPRE_Int hypre_PCGSetRelChange ( void *pcg_vdata, HYPRE_Int rel_change ); HYPRE_Int hypre_PCGGetRelChange ( void *pcg_vdata, HYPRE_Int *rel_change ); HYPRE_Int hypre_PCGSetRecomputeResidual ( void *pcg_vdata, HYPRE_Int recompute_residual ); HYPRE_Int hypre_PCGGetRecomputeResidual ( void *pcg_vdata, HYPRE_Int *recompute_residual ); HYPRE_Int hypre_PCGSetRecomputeResidualP ( void *pcg_vdata, HYPRE_Int recompute_residual_p ); HYPRE_Int hypre_PCGGetRecomputeResidualP ( void *pcg_vdata, HYPRE_Int *recompute_residual_p ); HYPRE_Int hypre_PCGSetStopCrit ( void *pcg_vdata, HYPRE_Int stop_crit ); HYPRE_Int hypre_PCGGetStopCrit ( void *pcg_vdata, HYPRE_Int *stop_crit ); HYPRE_Int hypre_PCGSetSkipBreak ( void *pcg_vdata, HYPRE_Int skip_break ); HYPRE_Int hypre_PCGGetSkipBreak ( void *pcg_vdata, HYPRE_Int *skip_break ); HYPRE_Int hypre_PCGSetFlex ( void *pcg_vdata, HYPRE_Int flex ); HYPRE_Int hypre_PCGGetFlex ( void *pcg_vdata, HYPRE_Int *flex ); HYPRE_Int hypre_PCGGetPrecond ( void *pcg_vdata, HYPRE_Solver *precond_data_ptr ); HYPRE_Int hypre_PCGSetPrecond ( void *pcg_vdata, HYPRE_Int (*precond )(void*, void*, void*, void*), HYPRE_Int (*precond_setup )(void*, void*, void*, void*), void *precond_data ); HYPRE_Int hypre_PCGSetPreconditioner ( void *pcg_vdata, void *precond_data ); HYPRE_Int hypre_PCGSetPrintLevel ( void *pcg_vdata, HYPRE_Int level ); HYPRE_Int hypre_PCGGetPrintLevel ( void *pcg_vdata, HYPRE_Int *level ); HYPRE_Int hypre_PCGSetLogging ( void *pcg_vdata, HYPRE_Int level ); HYPRE_Int hypre_PCGGetLogging ( void *pcg_vdata, HYPRE_Int *level ); HYPRE_Int hypre_PCGSetHybrid ( void *pcg_vdata, HYPRE_Int level ); HYPRE_Int hypre_PCGGetNumIterations ( void *pcg_vdata, HYPRE_Int *num_iterations ); HYPRE_Int hypre_PCGGetConverged ( void *pcg_vdata, HYPRE_Int *converged ); HYPRE_Int hypre_PCGPrintLogging ( void *pcg_vdata, HYPRE_Int myid ); HYPRE_Int hypre_PCGGetFinalRelativeResidualNorm ( void *pcg_vdata, HYPRE_Real *relative_residual_norm ); #ifdef __cplusplus } #endif #endif hypre-2.33.0/src/krylov/lgmres.c000066400000000000000000001210561477326011500165130ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * LGMRES lgmres * *****************************************************************************/ #include "krylov.h" #include "_hypre_utilities.h" /*-------------------------------------------------------------------------- * hypre_LGMRESFunctionsCreate *--------------------------------------------------------------------------*/ hypre_LGMRESFunctions * hypre_LGMRESFunctionsCreate( void * (*CAlloc) ( size_t count, size_t elt_size, HYPRE_MemoryLocation location ), HYPRE_Int (*Free) ( void *ptr ), HYPRE_Int (*CommInfo) ( void *A, HYPRE_Int *my_id, HYPRE_Int *num_procs ), void * (*CreateVector) ( void *vector ), void * (*CreateVectorArray) ( HYPRE_Int size, void *vectors ), HYPRE_Int (*DestroyVector) ( void *vector ), void * (*MatvecCreate) ( void *A, void *x ), HYPRE_Int (*Matvec) ( void *matvec_data, HYPRE_Complex alpha, void *A, void *x, HYPRE_Complex beta, void *y ), HYPRE_Int (*MatvecDestroy) ( void *matvec_data ), HYPRE_Real (*InnerProd) ( void *x, void *y ), HYPRE_Int (*CopyVector) ( void *x, void *y ), HYPRE_Int (*ClearVector) ( void *x ), HYPRE_Int (*ScaleVector) ( HYPRE_Complex alpha, void *x ), HYPRE_Int (*Axpy) ( HYPRE_Complex alpha, void *x, void *y ), HYPRE_Int (*PrecondSetup) ( void *vdata, void *A, void *b, void *x ), HYPRE_Int (*Precond) ( void *vdata, void *A, void *b, void *x ) ) { hypre_LGMRESFunctions * lgmres_functions; lgmres_functions = (hypre_LGMRESFunctions *) CAlloc( 1, sizeof(hypre_LGMRESFunctions), HYPRE_MEMORY_HOST ); lgmres_functions->CAlloc = CAlloc; lgmres_functions->Free = Free; lgmres_functions->CommInfo = CommInfo; /* not in PCGFunctionsCreate */ lgmres_functions->CreateVector = CreateVector; lgmres_functions->CreateVectorArray = CreateVectorArray; /* not in PCGFunctionsCreate */ lgmres_functions->DestroyVector = DestroyVector; lgmres_functions->MatvecCreate = MatvecCreate; lgmres_functions->Matvec = Matvec; lgmres_functions->MatvecDestroy = MatvecDestroy; lgmres_functions->InnerProd = InnerProd; lgmres_functions->CopyVector = CopyVector; lgmres_functions->ClearVector = ClearVector; lgmres_functions->ScaleVector = ScaleVector; lgmres_functions->Axpy = Axpy; /* default preconditioner must be set here but can be changed later... */ lgmres_functions->precond_setup = PrecondSetup; lgmres_functions->precond = Precond; return lgmres_functions; } /*-------------------------------------------------------------------------- * hypre_LGMRESCreate *--------------------------------------------------------------------------*/ void * hypre_LGMRESCreate( hypre_LGMRESFunctions *lgmres_functions ) { hypre_LGMRESData *lgmres_data; HYPRE_ANNOTATE_FUNC_BEGIN; lgmres_data = hypre_CTAllocF(hypre_LGMRESData, 1, lgmres_functions, HYPRE_MEMORY_HOST); lgmres_data->functions = lgmres_functions; /* set defaults */ (lgmres_data -> k_dim) = 20; (lgmres_data -> tol) = 1.0e-06; (lgmres_data -> cf_tol) = 0.0; (lgmres_data -> a_tol) = 0.0; /* abs. residual tol */ (lgmres_data -> min_iter) = 0; (lgmres_data -> max_iter) = 1000; (lgmres_data -> rel_change) = 0; (lgmres_data -> stop_crit) = 0; /* rel. residual norm */ (lgmres_data -> converged) = 0; (lgmres_data -> precond_data) = NULL; (lgmres_data -> print_level) = 0; (lgmres_data -> logging) = 0; (lgmres_data -> p) = NULL; (lgmres_data -> r) = NULL; (lgmres_data -> w) = NULL; (lgmres_data -> w_2) = NULL; (lgmres_data -> matvec_data) = NULL; (lgmres_data -> norms) = NULL; (lgmres_data -> log_file_name) = NULL; /* lgmres specific */ (lgmres_data -> aug_dim) = 2; (lgmres_data -> approx_constant) = 1; HYPRE_ANNOTATE_FUNC_END; return (void *) lgmres_data; } /*-------------------------------------------------------------------------- * hypre_LGMRESDestroy *--------------------------------------------------------------------------*/ HYPRE_Int hypre_LGMRESDestroy( void *lgmres_vdata ) { hypre_LGMRESData *lgmres_data = (hypre_LGMRESData *)lgmres_vdata; HYPRE_Int i; HYPRE_ANNOTATE_FUNC_BEGIN; if (lgmres_data) { hypre_LGMRESFunctions *lgmres_functions = lgmres_data->functions; if ( (lgmres_data->logging > 0) || (lgmres_data->print_level) > 0 ) { if ( (lgmres_data -> norms) != NULL ) { hypre_TFreeF( lgmres_data -> norms, lgmres_functions ); } } if ( (lgmres_data -> matvec_data) != NULL ) { (*(lgmres_functions->MatvecDestroy))(lgmres_data -> matvec_data); } if ( (lgmres_data -> r) != NULL ) { (*(lgmres_functions->DestroyVector))(lgmres_data -> r); } if ( (lgmres_data -> w) != NULL ) { (*(lgmres_functions->DestroyVector))(lgmres_data -> w); } if ( (lgmres_data -> w_2) != NULL ) { (*(lgmres_functions->DestroyVector))(lgmres_data -> w_2); } if ( (lgmres_data -> p) != NULL ) { for (i = 0; i < (lgmres_data -> k_dim + 1); i++) { if ( (lgmres_data -> p)[i] != NULL ) { (*(lgmres_functions->DestroyVector))( (lgmres_data -> p) [i]); } } hypre_TFreeF( lgmres_data->p, lgmres_functions ); } /* lgmres mod */ if ( (lgmres_data -> aug_vecs) != NULL ) { for (i = 0; i < (lgmres_data -> aug_dim + 1); i++) { if ( (lgmres_data -> aug_vecs)[i] != NULL ) { (*(lgmres_functions->DestroyVector))( (lgmres_data -> aug_vecs) [i]); } } hypre_TFreeF( lgmres_data->aug_vecs, lgmres_functions ); } if ( (lgmres_data -> a_aug_vecs) != NULL ) { for (i = 0; i < (lgmres_data -> aug_dim); i++) { if ( (lgmres_data -> a_aug_vecs)[i] != NULL ) { (*(lgmres_functions->DestroyVector))( (lgmres_data -> a_aug_vecs) [i]); } } hypre_TFreeF( lgmres_data->a_aug_vecs, lgmres_functions ); } /*---*/ hypre_TFreeF(lgmres_data->aug_order, lgmres_functions); hypre_TFreeF( lgmres_data, lgmres_functions ); hypre_TFreeF( lgmres_functions, lgmres_functions ); } HYPRE_ANNOTATE_FUNC_END; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_LGMRESGetResidual *--------------------------------------------------------------------------*/ HYPRE_Int hypre_LGMRESGetResidual( void *lgmres_vdata, void **residual ) { hypre_LGMRESData *lgmres_data = (hypre_LGMRESData *)lgmres_vdata; *residual = lgmres_data->r; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_LGMRESSetup *--------------------------------------------------------------------------*/ HYPRE_Int hypre_LGMRESSetup( void *lgmres_vdata, void *A, void *b, void *x ) { hypre_LGMRESData *lgmres_data = (hypre_LGMRESData *)lgmres_vdata; hypre_LGMRESFunctions *lgmres_functions = lgmres_data->functions; HYPRE_Int k_dim = (lgmres_data -> k_dim); HYPRE_Int max_iter = (lgmres_data -> max_iter); HYPRE_Int (*precond_setup)(void*, void*, void*, void*) = (lgmres_functions->precond_setup); void *precond_data = (lgmres_data -> precond_data); HYPRE_Int rel_change = (lgmres_data -> rel_change); /* lgmres mod */ HYPRE_Int aug_dim = (lgmres_data -> aug_dim); HYPRE_ANNOTATE_FUNC_BEGIN; (lgmres_data -> A) = A; /*-------------------------------------------------- * The arguments for NewVector are important to * maintain consistency between the setup and * compute phases of matvec and the preconditioner. *--------------------------------------------------*/ if ((lgmres_data -> p) == NULL) { (lgmres_data -> p) = (void**)(*(lgmres_functions->CreateVectorArray))(k_dim + 1, x); } if ((lgmres_data -> r) == NULL) { (lgmres_data -> r) = (*(lgmres_functions->CreateVector))(b); } if ((lgmres_data -> w) == NULL) { (lgmres_data -> w) = (*(lgmres_functions->CreateVector))(b); } if (rel_change) { if ((lgmres_data -> w_2) == NULL) { (lgmres_data -> w_2) = (*(lgmres_functions->CreateVector))(b); } } /* lgmres mod */ if ((lgmres_data -> aug_vecs) == NULL) { (lgmres_data -> aug_vecs) = (void**)(*(lgmres_functions->CreateVectorArray))(aug_dim + 1, x); /* one extra */ } if ((lgmres_data -> a_aug_vecs) == NULL) { (lgmres_data -> a_aug_vecs) = (void**)(*(lgmres_functions->CreateVectorArray))(aug_dim, x); } if ((lgmres_data -> aug_order) == NULL) { (lgmres_data -> aug_order) = hypre_CTAllocF(HYPRE_Int, aug_dim, lgmres_functions, HYPRE_MEMORY_HOST); } /*---*/ if ((lgmres_data -> matvec_data) == NULL) { (lgmres_data -> matvec_data) = (*(lgmres_functions->MatvecCreate))(A, x); } precond_setup(precond_data, A, b, x); /*----------------------------------------------------- * Allocate space for log info *-----------------------------------------------------*/ if ( (lgmres_data->logging) > 0 || (lgmres_data->print_level) > 0 ) { if ((lgmres_data -> norms) == NULL) { (lgmres_data -> norms) = hypre_CTAllocF(HYPRE_Real, max_iter + 1, lgmres_functions, HYPRE_MEMORY_HOST); } } if ( (lgmres_data->print_level) > 0 ) { if ((lgmres_data -> log_file_name) == NULL) { (lgmres_data -> log_file_name) = (char*)"lgmres.out.log"; } } HYPRE_ANNOTATE_FUNC_END; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_LGMRESSolve Note: no rel. change capability *-------------------------------------------------------------------------*/ HYPRE_Int hypre_LGMRESSolve(void *lgmres_vdata, void *A, void *b, void *x) { hypre_LGMRESData *lgmres_data = (hypre_LGMRESData *)lgmres_vdata; hypre_LGMRESFunctions *lgmres_functions = lgmres_data->functions; HYPRE_Int k_dim = (lgmres_data -> k_dim); HYPRE_Int min_iter = (lgmres_data -> min_iter); HYPRE_Int max_iter = (lgmres_data -> max_iter); HYPRE_Real r_tol = (lgmres_data -> tol); HYPRE_Real cf_tol = (lgmres_data -> cf_tol); HYPRE_Real a_tol = (lgmres_data -> a_tol); void *matvec_data = (lgmres_data -> matvec_data); void *r = (lgmres_data -> r); void *w = (lgmres_data -> w); void **p = (lgmres_data -> p); /* lgmres mod*/ void **aug_vecs = (lgmres_data ->aug_vecs); void **a_aug_vecs = (lgmres_data ->a_aug_vecs); HYPRE_Int *aug_order = (lgmres_data->aug_order); HYPRE_Int aug_dim = (lgmres_data -> aug_dim); HYPRE_Int approx_constant = (lgmres_data ->approx_constant); HYPRE_Int it_arnoldi, aug_ct, it_total, ii, order, it_aug; HYPRE_Int spot = 0; HYPRE_Real tmp_norm, r_norm_last; /*---*/ HYPRE_Int (*precond)(void*, void*, void*, void*) = (lgmres_functions -> precond); HYPRE_Int *precond_data = (HYPRE_Int*)(lgmres_data -> precond_data); HYPRE_Int print_level = (lgmres_data -> print_level); HYPRE_Int logging = (lgmres_data -> logging); HYPRE_Real *norms = (lgmres_data -> norms); HYPRE_Int break_value = 0; HYPRE_Int i, j, k; HYPRE_Real *rs, **hh, *c, *s; HYPRE_Int iter; HYPRE_Int my_id, num_procs; HYPRE_Real epsilon, gamma, t, r_norm, b_norm, den_norm; HYPRE_Real epsmac = 1.e-16; HYPRE_Real ieee_check = 0.; HYPRE_Real cf_ave_0 = 0.0; HYPRE_Real cf_ave_1 = 0.0; HYPRE_Real weight; HYPRE_Real r_norm_0; /* We are not checking rel. change for now... */ HYPRE_ANNOTATE_FUNC_BEGIN; (lgmres_data -> converged) = 0; /*----------------------------------------------------------------------- * With relative change convergence test on, it is possible to attempt * another iteration with a zero residual. This causes the parameter * alpha to go NaN. The guard_zero_residual parameter is to circumvent * this. Perhaps it should be set to something non-zero (but small). *-----------------------------------------------------------------------*/ (*(lgmres_functions->CommInfo))(A, &my_id, &num_procs); if ( logging > 0 || print_level > 0 ) { norms = (lgmres_data -> norms); /* not used yet log_file_name = (lgmres_data -> log_file_name);*/ /* fp = fopen(log_file_name,"w"); */ } /* initialize work arrays - lgmres includes aug_dim*/ rs = hypre_CTAllocF(HYPRE_Real, k_dim + 1 + aug_dim, lgmres_functions, HYPRE_MEMORY_HOST); c = hypre_CTAllocF(HYPRE_Real, k_dim + aug_dim, lgmres_functions, HYPRE_MEMORY_HOST); s = hypre_CTAllocF(HYPRE_Real, k_dim + aug_dim, lgmres_functions, HYPRE_MEMORY_HOST); /* lgmres mod. - need non-modified hessenberg to avoid aug_dim matvecs */ hh = hypre_CTAllocF(HYPRE_Real*, k_dim + aug_dim + 1, lgmres_functions, HYPRE_MEMORY_HOST); for (i = 0; i < k_dim + aug_dim + 1; i++) { hh[i] = hypre_CTAllocF(HYPRE_Real, k_dim + aug_dim, lgmres_functions, HYPRE_MEMORY_HOST); } (*(lgmres_functions->CopyVector))(b, p[0]); /* compute initial residual */ (*(lgmres_functions->Matvec))(matvec_data, -1.0, A, x, 1.0, p[0]); b_norm = hypre_sqrt((*(lgmres_functions->InnerProd))(b, b)); /* Since it does not diminish performance, attempt to return an error flag and notify users when they supply bad input. */ if (b_norm != 0.) { ieee_check = b_norm / b_norm; } /* INF -> NaN conversion */ if (ieee_check != ieee_check) { /* ...INFs or NaNs in input can make ieee_check a NaN. This test for ieee_check self-equality works on all IEEE-compliant compilers/ machines, c.f. page 8 of "Lecture Notes on the Status of IEEE 754" by W. Kahan, May 31, 1996. Currently (July 2002) this paper may be found at http://HTTP.CS.Berkeley.EDU/~wkahan/ieee754status/IEEE754.PDF */ if (logging > 0 || print_level > 0) { hypre_printf("\n\nERROR detected by Hypre ... BEGIN\n"); hypre_printf("ERROR -- hypre_LGMRESSolve: INFs and/or NaNs detected in input.\n"); hypre_printf("User probably placed non-numerics in supplied b.\n"); hypre_printf("Returning error flag += 101. Program not terminated.\n"); hypre_printf("ERROR detected by Hypre ... END\n\n\n"); } hypre_error(HYPRE_ERROR_GENERIC); HYPRE_ANNOTATE_FUNC_END; return hypre_error_flag; } r_norm = hypre_sqrt((*(lgmres_functions->InnerProd))(p[0], p[0])); r_norm_0 = r_norm; /* Since it does not diminish performance, attempt to return an error flag and notify users when they supply bad input. */ if (r_norm != 0.) { ieee_check = r_norm / r_norm; } /* INF -> NaN conversion */ if (ieee_check != ieee_check) { /* ...INFs or NaNs in input can make ieee_check a NaN. This test for ieee_check self-equality works on all IEEE-compliant compilers/ machines, c.f. page 8 of "Lecture Notes on the Status of IEEE 754" by W. Kahan, May 31, 1996. Currently (July 2002) this paper may be found at http://HTTP.CS.Berkeley.EDU/~wkahan/ieee754status/IEEE754.PDF */ if (logging > 0 || print_level > 0) { hypre_printf("\n\nERROR detected by Hypre ... BEGIN\n"); hypre_printf("ERROR -- hypre_LGMRESSolve: INFs and/or NaNs detected in input.\n"); hypre_printf("User probably placed non-numerics in supplied A or x_0.\n"); hypre_printf("Returning error flag += 101. Program not terminated.\n"); hypre_printf("ERROR detected by Hypre ... END\n\n\n"); } hypre_error(HYPRE_ERROR_GENERIC); HYPRE_ANNOTATE_FUNC_END; return hypre_error_flag; } if ( logging > 0 || print_level > 0) { norms[0] = r_norm; if ( print_level > 1 && my_id == 0 ) { hypre_printf("L2 norm of b: %e\n", b_norm); if (b_norm == 0.0) { hypre_printf("Rel_resid_norm actually contains the residual norm\n"); } hypre_printf("Initial L2 norm of residual: %e\n", r_norm); } } iter = 0; if (b_norm > 0.0) { /* convergence criterion |r_i|/|b| <= accuracy if |b| > 0 */ den_norm = b_norm; } else { /* convergence criterion |r_i|/|r0| <= accuracy if |b| = 0 */ den_norm = r_norm; }; /* convergence criteria: |r_i| <= max( a_tol, r_tol * den_norm) den_norm = |r_0| or |b| note: default for a_tol is 0.0, so relative residual criteria is used unless user specifies a_tol, or sets r_tol = 0.0, which means absolute tol only is checked */ epsilon = hypre_max(a_tol, r_tol * den_norm); /* so now our stop criteria is |r_i| <= epsilon */ if ( print_level > 1 && my_id == 0 ) { if (b_norm > 0.0) { hypre_printf("=============================================\n\n"); hypre_printf("Iters resid.norm conv.rate rel.res.norm\n"); hypre_printf("----- ------------ ---------- ------------\n"); } else { hypre_printf("=============================================\n\n"); hypre_printf("Iters resid.norm conv.rate\n"); hypre_printf("----- ------------ ----------\n"); }; } /*lgmres initialization */ for (ii = 0; ii < aug_dim; ii++) { aug_order[ii] = 0; } aug_ct = 0; /* number of aug. vectors available */ /* outer iteration cycle */ while (iter < max_iter) { /* initialize first term of hessenberg system */ rs[0] = r_norm; if (r_norm == 0.0) { hypre_TFreeF(c, lgmres_functions); hypre_TFreeF(s, lgmres_functions); hypre_TFreeF(rs, lgmres_functions); for (i = 0; i < k_dim + aug_dim + 1; i++) { hypre_TFreeF(hh[i], lgmres_functions); } hypre_TFreeF(hh, lgmres_functions); HYPRE_ANNOTATE_FUNC_END; return hypre_error_flag; } /* see if we are already converged and should print the final norm and exit */ if (r_norm <= epsilon && iter >= min_iter) { (*(lgmres_functions->CopyVector))(b, r); (*(lgmres_functions->Matvec))(matvec_data, -1.0, A, x, 1.0, r); r_norm = hypre_sqrt((*(lgmres_functions->InnerProd))(r, r)); if (r_norm <= epsilon) { if ( print_level > 1 && my_id == 0) { hypre_printf("\n\n"); hypre_printf("Final L2 norm of residual: %e\n\n", r_norm); } break; } else if ( print_level > 0 && my_id == 0) { hypre_printf("false convergence 1\n"); } } t = 1.0 / r_norm; r_norm_last = r_norm; (*(lgmres_functions->ScaleVector))(t, p[0]); i = 0; /* lgmres mod: determine number of arnoldi steps to take */ /* if approx_constant then we keep the space the same size even if we don't have the full number of aug vectors yet*/ if (approx_constant) { it_arnoldi = k_dim - aug_ct; } else { it_arnoldi = k_dim - aug_dim; } it_total = it_arnoldi + aug_ct; it_aug = 0; /* keep track of augmented iterations */ /***RESTART CYCLE (right-preconditioning) ***/ while (i < it_total && iter < max_iter) { i++; iter++; (*(lgmres_functions->ClearVector))(r); /*LGMRES_MOD: decide whether this is an arnoldi step or an aug step */ if ( i <= it_arnoldi) { /* Arnoldi */ precond(precond_data, A, p[i - 1], r); (*(lgmres_functions->Matvec))(matvec_data, 1.0, A, r, 0.0, p[i]); } else { /*lgmres aug step */ it_aug ++; order = i - it_arnoldi - 1; /* which aug step (note i starts at 1) - aug order number at 0*/ for (ii = 0; ii < aug_dim; ii++) { if (aug_order[ii] == order) { spot = ii; break; /* must have this because there will be duplicates before aug_ct = aug_dim */ } } /* copy a_aug_vecs[spot] to p[i] */ (*(lgmres_functions->CopyVector))(a_aug_vecs[spot], p[i]); /*note: an alternate implementation choice would be to only save the AUGVECS and not A_AUGVEC and then apply the PC here to the augvec */ } /*---*/ /* modified Gram_Schmidt */ for (j = 0; j < i; j++) { hh[j][i - 1] = (*(lgmres_functions->InnerProd))(p[j], p[i]); (*(lgmres_functions->Axpy))(-hh[j][i - 1], p[j], p[i]); } t = hypre_sqrt((*(lgmres_functions->InnerProd))(p[i], p[i])); hh[i][i - 1] = t; if (t != 0.0) { t = 1.0 / t; (*(lgmres_functions->ScaleVector))(t, p[i]); } /* done with modified Gram_schmidt and Arnoldi step. update factorization of hh */ for (j = 1; j < i; j++) { t = hh[j - 1][i - 1]; hh[j - 1][i - 1] = s[j - 1] * hh[j][i - 1] + c[j - 1] * t; hh[j][i - 1] = -s[j - 1] * t + c[j - 1] * hh[j][i - 1]; } t = hh[i][i - 1] * hh[i][i - 1]; t += hh[i - 1][i - 1] * hh[i - 1][i - 1]; gamma = hypre_sqrt(t); if (gamma == 0.0) { gamma = epsmac; } c[i - 1] = hh[i - 1][i - 1] / gamma; s[i - 1] = hh[i][i - 1] / gamma; rs[i] = -hh[i][i - 1] * rs[i - 1]; rs[i] /= gamma; rs[i - 1] = c[i - 1] * rs[i - 1]; /* determine residual norm */ hh[i - 1][i - 1] = s[i - 1] * hh[i][i - 1] + c[i - 1] * hh[i - 1][i - 1]; r_norm = hypre_abs(rs[i]); /* print ? */ if ( print_level > 0 ) { norms[iter] = r_norm; if ( print_level > 1 && my_id == 0 ) { if (b_norm > 0.0) hypre_printf("% 5d %e %f %e\n", iter, norms[iter], norms[iter] / norms[iter - 1], norms[iter] / b_norm); else hypre_printf("% 5d %e %f\n", iter, norms[iter], norms[iter] / norms[iter - 1]); } } /*convergence factor tolerance */ if (cf_tol > 0.0) { cf_ave_0 = cf_ave_1; cf_ave_1 = hypre_pow( r_norm / r_norm_0, 1.0 / (2.0 * iter)); weight = hypre_abs(cf_ave_1 - cf_ave_0); weight = weight / hypre_max(cf_ave_1, cf_ave_0); weight = 1.0 - weight; #if 0 hypre_printf("I = %d: cf_new = %e, cf_old = %e, weight = %e\n", i, cf_ave_1, cf_ave_0, weight ); #endif if (weight * cf_ave_1 > cf_tol) { break_value = 1; break; } } /* should we exit the restart cycle? (conv. check) */ if (r_norm <= epsilon && iter >= min_iter) { break; } } /*** end of restart cycle ***/ /* now compute solution, first solve upper triangular system */ if (break_value) { break; } rs[i - 1] = rs[i - 1] / hh[i - 1][i - 1]; for (k = i - 2; k >= 0; k--) { t = 0.0; for (j = k + 1; j < i; j++) { t -= hh[k][j] * rs[j]; } t += rs[k]; rs[k] = t / hh[k][k]; } /* form linear combination of p's to get solution */ /* put the new aug_vector in aug_vecs[aug_dim] - a temp position*/ /* i = number of iterations */ /* it_aug = number of augmented iterations */ /* it_arnoldi = number of arnoldi iterations */ /*check if exited early before all arnoldi its */ if (it_arnoldi > i) { it_arnoldi = i; } if (!it_aug) { (*(lgmres_functions->CopyVector))(p[i - 1], w); (*(lgmres_functions->ScaleVector))(rs[i - 1], w); for (j = i - 2; j >= 0; j--) { (*(lgmres_functions->Axpy))(rs[j], p[j], w); } } else /* need some of the augvecs */ { (*(lgmres_functions->CopyVector))(p[0], w); (*(lgmres_functions->ScaleVector))(rs[0], w); /* reg. arnoldi directions */ for (j = 1; j < it_arnoldi; j++) /*first one already done */ { (*(lgmres_functions->Axpy))(rs[j], p[j], w); } /* augment directions */ for (ii = 0; ii < it_aug; ii++) { for (j = 0; j < aug_dim; j++) { if (aug_order[j] == ii) { spot = j; break; /* must have this because there will be * duplicates before aug_ct = aug_dim */ } } (*(lgmres_functions->Axpy))(rs[it_arnoldi + ii], aug_vecs[spot], w); } } /* grab the new aug vector before the prec*/ (*(lgmres_functions->CopyVector))(w, aug_vecs[aug_dim]); (*(lgmres_functions->ClearVector))(r); /* find correction (in r) (un-wind precond.)*/ precond(precond_data, A, w, r); /* update current solution x (in x) */ (*(lgmres_functions->Axpy))(1.0, r, x); /* check for convergence by evaluating the actual residual */ if (r_norm <= epsilon && iter >= min_iter) { /* calculate actual residual norm*/ (*(lgmres_functions->CopyVector))(b, r); (*(lgmres_functions->Matvec))(matvec_data, -1.0, A, x, 1.0, r); r_norm = hypre_sqrt( (*(lgmres_functions->InnerProd))(r, r) ); if (r_norm <= epsilon) { if ( print_level > 1 && my_id == 0 ) { hypre_printf("\n\n"); hypre_printf("Final L2 norm of residual: %e\n\n", r_norm); } (lgmres_data -> converged) = 1; break; } else /* conv. has not occurred, according to true residual */ { if ( print_level > 0 && my_id == 0) { hypre_printf("false convergence 2\n"); } (*(lgmres_functions->CopyVector))(r, p[0]); i = 0; } } /* end of convergence check */ /* compute residual vector and continue loop */ /* copy r0 (not scaled) to w*/ (*(lgmres_functions->CopyVector))(p[0], w); (*(lgmres_functions->ScaleVector))(r_norm_last, w); for (j = i ; j > 0; j--) { rs[j - 1] = -s[j - 1] * rs[j]; rs[j] = c[j - 1] * rs[j]; } if (i) { (*(lgmres_functions->Axpy))(rs[i] - 1.0, p[i], p[i]); } for (j = i - 1 ; j > 0; j--) { (*(lgmres_functions->Axpy))(rs[j], p[j], p[i]); } if (i) { (*(lgmres_functions->Axpy))(rs[0] - 1.0, p[0], p[0]); (*(lgmres_functions->Axpy))(1.0, p[i], p[0]); } /* lgmres mod */ /* collect aug vector and A*augvector for future restarts - only if we will be restarting (i.e. this cycle performed it_total iterations). ordering starts at 0.*/ if (aug_dim > 0) { if (!aug_ct) { spot = 0; aug_ct++; } else if (aug_ct < aug_dim) { spot = aug_ct; aug_ct++; } else { /* truncate - already have aug_dim number of vectors*/ for (ii = 0; ii < aug_dim; ii++) { if (aug_order[ii] == (aug_dim - 1)) { spot = ii; } } } /* aug_vecs[aug_dim] contains new aug vector */ (*(lgmres_functions->CopyVector))(aug_vecs[aug_dim], aug_vecs[spot]); /*need to normalize */ tmp_norm = hypre_sqrt((*(lgmres_functions->InnerProd))(aug_vecs[spot], aug_vecs[spot])); tmp_norm = 1.0 / tmp_norm; (*(lgmres_functions->ScaleVector))(tmp_norm, aug_vecs[spot]); /*set new aug vector to order 0 - move all others back one */ for (ii = 0; ii < aug_dim; ii++) { aug_order[ii]++; } aug_order[spot] = 0; /*now add the A*aug vector to A_AUGVEC(spot) - this is * independ. of preconditioning type*/ /* A*augvec = V*H*y = r0-rm (r0 is in w and rm is in p[0])*/ (*(lgmres_functions->CopyVector))( w, a_aug_vecs[spot]); (*(lgmres_functions->ScaleVector))(- 1.0, a_aug_vecs[spot]); /* -r0*/ (*(lgmres_functions->Axpy))(1.0, p[0], a_aug_vecs[spot]); /* rm - r0 */ (*(lgmres_functions->ScaleVector))(-tmp_norm, a_aug_vecs[spot]); /* r0-rm /norm */ } } /* END of iteration while loop */ if ( print_level > 1 && my_id == 0 ) { hypre_printf("\n\n"); } (lgmres_data -> num_iterations) = iter; if (b_norm > 0.0) { (lgmres_data -> rel_residual_norm) = r_norm / b_norm; } if (b_norm == 0.0) { (lgmres_data -> rel_residual_norm) = r_norm; } if (iter >= max_iter && r_norm > epsilon && epsilon > 0) { hypre_error(HYPRE_ERROR_CONV); } hypre_TFreeF(c, lgmres_functions); hypre_TFreeF(s, lgmres_functions); hypre_TFreeF(rs, lgmres_functions); for (i = 0; i < k_dim + 1 + aug_dim; i++) { hypre_TFreeF(hh[i], lgmres_functions); } hypre_TFreeF(hh, lgmres_functions); HYPRE_ANNOTATE_FUNC_END; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_LGMRESSetKDim, hypre_LGMRESGetKDim *--------------------------------------------------------------------------*/ HYPRE_Int hypre_LGMRESSetKDim( void *lgmres_vdata, HYPRE_Int k_dim ) { hypre_LGMRESData *lgmres_data = (hypre_LGMRESData *)lgmres_vdata; (lgmres_data -> k_dim) = k_dim; return hypre_error_flag; } HYPRE_Int hypre_LGMRESGetKDim( void *lgmres_vdata, HYPRE_Int * k_dim ) { hypre_LGMRESData *lgmres_data = (hypre_LGMRESData *)lgmres_vdata; *k_dim = (lgmres_data -> k_dim); return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_LGMRESSetAugDim *--------------------------------------------------------------------------*/ HYPRE_Int hypre_LGMRESSetAugDim( void *lgmres_vdata, HYPRE_Int aug_dim ) { hypre_LGMRESData *lgmres_data = (hypre_LGMRESData *)lgmres_vdata; if (aug_dim < 0) { aug_dim = 0; } /* must be positive */ if (aug_dim > (lgmres_data -> k_dim) - 1) /* must be be <= (restart size-1) */ { while (aug_dim > (lgmres_data -> k_dim) - 1) { aug_dim--; } aug_dim = (((0) < (aug_dim)) ? (aug_dim) : (0)); } (lgmres_data -> aug_dim) = aug_dim; return hypre_error_flag; } HYPRE_Int hypre_LGMRESGetAugDim( void *lgmres_vdata, HYPRE_Int * aug_dim ) { hypre_LGMRESData *lgmres_data = (hypre_LGMRESData *)lgmres_vdata; *aug_dim = (lgmres_data -> aug_dim); return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_LGMRESSetTol, hypre_LGMRESGetTol *--------------------------------------------------------------------------*/ HYPRE_Int hypre_LGMRESSetTol( void *lgmres_vdata, HYPRE_Real tol ) { hypre_LGMRESData *lgmres_data = (hypre_LGMRESData *)lgmres_vdata; (lgmres_data -> tol) = tol; return hypre_error_flag; } HYPRE_Int hypre_LGMRESGetTol( void *lgmres_vdata, HYPRE_Real * tol ) { hypre_LGMRESData *lgmres_data = (hypre_LGMRESData *)lgmres_vdata; *tol = (lgmres_data -> tol); return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_LGMRESSetAbsoluteTol, hypre_LGMRESGetAbsoluteTol *--------------------------------------------------------------------------*/ HYPRE_Int hypre_LGMRESSetAbsoluteTol( void *lgmres_vdata, HYPRE_Real a_tol ) { hypre_LGMRESData *lgmres_data = (hypre_LGMRESData *)lgmres_vdata; (lgmres_data -> a_tol) = a_tol; return hypre_error_flag; } HYPRE_Int hypre_LGMRESGetAbsoluteTol( void *lgmres_vdata, HYPRE_Real * a_tol ) { hypre_LGMRESData *lgmres_data = (hypre_LGMRESData *)lgmres_vdata; *a_tol = (lgmres_data -> a_tol); return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_LGMRESSetConvergenceFactorTol, hypre_LGMRESGetConvergenceFactorTol *--------------------------------------------------------------------------*/ HYPRE_Int hypre_LGMRESSetConvergenceFactorTol( void *lgmres_vdata, HYPRE_Real cf_tol ) { hypre_LGMRESData *lgmres_data = (hypre_LGMRESData *)lgmres_vdata; (lgmres_data -> cf_tol) = cf_tol; return hypre_error_flag; } HYPRE_Int hypre_LGMRESGetConvergenceFactorTol( void *lgmres_vdata, HYPRE_Real * cf_tol ) { hypre_LGMRESData *lgmres_data = (hypre_LGMRESData *)lgmres_vdata; *cf_tol = (lgmres_data -> cf_tol); return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_LGMRESSetMinIter, hypre_LGMRESGetMinIter *--------------------------------------------------------------------------*/ HYPRE_Int hypre_LGMRESSetMinIter( void *lgmres_vdata, HYPRE_Int min_iter ) { hypre_LGMRESData *lgmres_data = (hypre_LGMRESData *)lgmres_vdata; (lgmres_data -> min_iter) = min_iter; return hypre_error_flag; } HYPRE_Int hypre_LGMRESGetMinIter( void *lgmres_vdata, HYPRE_Int * min_iter ) { hypre_LGMRESData *lgmres_data = (hypre_LGMRESData *)lgmres_vdata; *min_iter = (lgmres_data -> min_iter); return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_LGMRESSetMaxIter, hypre_LGMRESGetMaxIter *--------------------------------------------------------------------------*/ HYPRE_Int hypre_LGMRESSetMaxIter( void *lgmres_vdata, HYPRE_Int max_iter ) { hypre_LGMRESData *lgmres_data = (hypre_LGMRESData *)lgmres_vdata; (lgmres_data -> max_iter) = max_iter; return hypre_error_flag; } HYPRE_Int hypre_LGMRESGetMaxIter( void *lgmres_vdata, HYPRE_Int * max_iter ) { hypre_LGMRESData *lgmres_data = (hypre_LGMRESData *)lgmres_vdata; *max_iter = (lgmres_data -> max_iter); return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_LGMRESSetStopCrit, hypre_LGMRESGetStopCrit *--------------------------------------------------------------------------*/ HYPRE_Int hypre_LGMRESSetStopCrit( void *lgmres_vdata, HYPRE_Int stop_crit ) { hypre_LGMRESData *lgmres_data = (hypre_LGMRESData *)lgmres_vdata; (lgmres_data -> stop_crit) = stop_crit; return hypre_error_flag; } HYPRE_Int hypre_LGMRESGetStopCrit( void *lgmres_vdata, HYPRE_Int * stop_crit ) { hypre_LGMRESData *lgmres_data = (hypre_LGMRESData *)lgmres_vdata; *stop_crit = (lgmres_data -> stop_crit); return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_LGMRESSetPrecond *--------------------------------------------------------------------------*/ HYPRE_Int hypre_LGMRESSetPrecond( void *lgmres_vdata, HYPRE_Int (*precond)(void*, void*, void*, void*), HYPRE_Int (*precond_setup)(void*, void*, void*, void*), void *precond_data ) { hypre_LGMRESData *lgmres_data = (hypre_LGMRESData *)lgmres_vdata; hypre_LGMRESFunctions *lgmres_functions = lgmres_data->functions; (lgmres_functions -> precond) = precond; (lgmres_functions -> precond_setup) = precond_setup; (lgmres_data -> precond_data) = precond_data; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_LGMRESGetPrecond *--------------------------------------------------------------------------*/ HYPRE_Int hypre_LGMRESGetPrecond( void *lgmres_vdata, HYPRE_Solver *precond_data_ptr ) { hypre_LGMRESData *lgmres_data = (hypre_LGMRESData *)lgmres_vdata; *precond_data_ptr = (HYPRE_Solver)(lgmres_data -> precond_data); return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_LGMRESSetPrintLevel, hypre_LGMRESGetPrintLevel *--------------------------------------------------------------------------*/ HYPRE_Int hypre_LGMRESSetPrintLevel( void *lgmres_vdata, HYPRE_Int level) { hypre_LGMRESData *lgmres_data = (hypre_LGMRESData *)lgmres_vdata; (lgmres_data -> print_level) = level; return hypre_error_flag; } HYPRE_Int hypre_LGMRESGetPrintLevel( void *lgmres_vdata, HYPRE_Int * level) { hypre_LGMRESData *lgmres_data = (hypre_LGMRESData *)lgmres_vdata; *level = (lgmres_data -> print_level); return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_LGMRESSetLogging, hypre_LGMRESGetLogging *--------------------------------------------------------------------------*/ HYPRE_Int hypre_LGMRESSetLogging( void *lgmres_vdata, HYPRE_Int level) { hypre_LGMRESData *lgmres_data = (hypre_LGMRESData *)lgmres_vdata; (lgmres_data -> logging) = level; return hypre_error_flag; } HYPRE_Int hypre_LGMRESGetLogging( void *lgmres_vdata, HYPRE_Int * level) { hypre_LGMRESData *lgmres_data = (hypre_LGMRESData *)lgmres_vdata; *level = (lgmres_data -> logging); return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_LGMRESGetNumIterations *--------------------------------------------------------------------------*/ HYPRE_Int hypre_LGMRESGetNumIterations( void *lgmres_vdata, HYPRE_Int *num_iterations ) { hypre_LGMRESData *lgmres_data = (hypre_LGMRESData *)lgmres_vdata; *num_iterations = (lgmres_data -> num_iterations); return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_LGMRESGetConverged *--------------------------------------------------------------------------*/ HYPRE_Int hypre_LGMRESGetConverged( void *lgmres_vdata, HYPRE_Int *converged ) { hypre_LGMRESData *lgmres_data = (hypre_LGMRESData *)lgmres_vdata; *converged = (lgmres_data -> converged); return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_LGMRESGetFinalRelativeResidualNorm *--------------------------------------------------------------------------*/ HYPRE_Int hypre_LGMRESGetFinalRelativeResidualNorm( void *lgmres_vdata, HYPRE_Real *relative_residual_norm ) { hypre_LGMRESData *lgmres_data = (hypre_LGMRESData *)lgmres_vdata; *relative_residual_norm = (lgmres_data -> rel_residual_norm); return hypre_error_flag; } hypre-2.33.0/src/krylov/lgmres.h000066400000000000000000000115361477326011500165210ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * LGMRES lgmres * *****************************************************************************/ #ifndef hypre_KRYLOV_LGMRES_HEADER #define hypre_KRYLOV_LGMRES_HEADER /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ /** * @name Generic LGMRES Interface * * A general description of the interface goes here... * **/ /*@{*/ /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ /*-------------------------------------------------------------------------- * hypre_LGMRESData and hypre_LGMRESFunctions *--------------------------------------------------------------------------*/ /** * @name LGMRES structs * * Description... **/ /*@{*/ /** * The {\tt hypre\_LGMRESFunctions} object ... **/ typedef struct { void * (*CAlloc) ( size_t count, size_t elt_size ); HYPRE_Int (*Free) ( void *ptr ); HYPRE_Int (*CommInfo) ( void *A, HYPRE_Int *my_id, HYPRE_Int *num_procs ); void * (*CreateVector) ( void *vector ); void * (*CreateVectorArray) ( HYPRE_Int size, void *vectors ); HYPRE_Int (*DestroyVector) ( void *vector ); void * (*MatvecCreate) ( void *A, void *x ); HYPRE_Int (*Matvec) ( void *matvec_data, HYPRE_Complex alpha, void *A, void *x, HYPRE_Complex beta, void *y ); HYPRE_Int (*MatvecDestroy) ( void *matvec_data ); HYPRE_Real (*InnerProd) ( void *x, void *y ); HYPRE_Int (*CopyVector) ( void *x, void *y ); HYPRE_Int (*ClearVector) ( void *x ); HYPRE_Int (*ScaleVector) ( HYPRE_Complex alpha, void *x ); HYPRE_Int (*Axpy) ( HYPRE_Complex alpha, void *x, void *y ); HYPRE_Int (*precond) (); HYPRE_Int (*precond_setup) (); } hypre_LGMRESFunctions; /** * The {\tt hypre\_LGMRESData} object ... **/ typedef struct { HYPRE_Int k_dim; HYPRE_Int min_iter; HYPRE_Int max_iter; HYPRE_Int rel_change; HYPRE_Int stop_crit; HYPRE_Int converged; HYPRE_Real tol; HYPRE_Real cf_tol; HYPRE_Real a_tol; HYPRE_Real rel_residual_norm; /*lgmres specific stuff */ HYPRE_Int aug_dim; HYPRE_Int approx_constant; void **aug_vecs; HYPRE_Int *aug_order; void **a_aug_vecs; /*---*/ void *A; void *r; void *w; void *w_2; void **p; void *matvec_data; void *precond_data; hypre_LGMRESFunctions * functions; /* log info (always logged) */ HYPRE_Int num_iterations; HYPRE_Int print_level; /* printing when print_level>0 */ HYPRE_Int logging; /* extra computations for logging when logging>0 */ HYPRE_Real *norms; char *log_file_name; } hypre_LGMRESData; #ifdef __cplusplus extern "C" { #endif /** * @name generic LGMRES Solver * * Description... **/ /*@{*/ /** * Description... * * @param param [IN] ... **/ hypre_LGMRESFunctions * hypre_LGMRESFunctionsCreate( void * (*CAlloc) ( size_t count, size_t elt_size ), HYPRE_Int (*Free) ( void *ptr ), HYPRE_Int (*CommInfo) ( void *A, HYPRE_Int *my_id, HYPRE_Int *num_procs ), void * (*CreateVector) ( void *vector ), void * (*CreateVectorArray) ( HYPRE_Int size, void *vectors ), HYPRE_Int (*DestroyVector) ( void *vector ), void * (*MatvecCreate) ( void *A, void *x ), HYPRE_Int (*Matvec) ( void *matvec_data, HYPRE_Complex alpha, void *A, void *x, HYPRE_Complex beta, void *y ), HYPRE_Int (*MatvecDestroy) ( void *matvec_data ), HYPRE_Real (*InnerProd) ( void *x, void *y ), HYPRE_Int (*CopyVector) ( void *x, void *y ), HYPRE_Int (*ClearVector) ( void *x ), HYPRE_Int (*ScaleVector) ( HYPRE_Complex alpha, void *x ), HYPRE_Int (*Axpy) ( HYPRE_Complex alpha, void *x, void *y ), HYPRE_Int (*PrecondSetup) ( void *vdata, void *A, void *b, void *x ), HYPRE_Int (*Precond) ( void *vdata, void *A, void *b, void *x ) ); /** * Description... * * @param param [IN] ... **/ void * hypre_LGMRESCreate( hypre_LGMRESFunctions *lgmres_functions ); #ifdef __cplusplus } #endif #endif hypre-2.33.0/src/krylov/lobpcg.c000066400000000000000000001121261477326011500164660ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * Locally optimal preconditioned conjugate gradient functions * *****************************************************************************/ #include #include #include #include #include "lobpcg.h" #include "fortran_matrix.h" #include "multivector.h" static HYPRE_Int lobpcg_chol( utilities_FortranMatrix* a, HYPRE_Int (*dpotrf) (const char *uplo, HYPRE_Int *n, HYPRE_Real *a, HYPRE_Int *lda, HYPRE_Int *info) ) { HYPRE_Int lda, n; HYPRE_Real* aval; char uplo; HYPRE_Int ierr; lda = utilities_FortranMatrixGlobalHeight( a ); n = utilities_FortranMatrixHeight( a ); aval = utilities_FortranMatrixValues( a ); uplo = 'U'; (*dpotrf)( &uplo, &n, aval, &lda, &ierr ); return ierr; } static HYPRE_Int lobpcg_solveGEVP( utilities_FortranMatrix* mtxA, utilities_FortranMatrix* mtxB, utilities_FortranMatrix* eigVal, HYPRE_Int (*dsygv) (HYPRE_Int *itype, char *jobz, char *uplo, HYPRE_Int * n, HYPRE_Real *a, HYPRE_Int *lda, HYPRE_Real *b, HYPRE_Int *ldb, HYPRE_Real *w, HYPRE_Real *work, HYPRE_Int *lwork, HYPRE_Int *info) ) { HYPRE_Int n, lda, ldb, itype, lwork, info; char jobz, uplo; HYPRE_Real* work; HYPRE_Real* a; HYPRE_Real* b; HYPRE_Real* lmd; itype = 1; jobz = 'V'; uplo = 'L'; a = utilities_FortranMatrixValues( mtxA ); b = utilities_FortranMatrixValues( mtxB ); lmd = utilities_FortranMatrixValues( eigVal ); n = utilities_FortranMatrixHeight( mtxA ); lda = utilities_FortranMatrixGlobalHeight( mtxA ); ldb = utilities_FortranMatrixGlobalHeight( mtxB ); lwork = 10 * n; work = hypre_CTAlloc(HYPRE_Real, lwork, HYPRE_MEMORY_HOST); (*dsygv)( &itype, &jobz, &uplo, &n, a, &lda, b, &ldb, lmd, &work[0], &lwork, &info ); hypre_TFree( work, HYPRE_MEMORY_HOST); return info; } static void lobpcg_MultiVectorByMultiVector( mv_MultiVectorPtr x, mv_MultiVectorPtr y, utilities_FortranMatrix* xy ) { mv_MultiVectorByMultiVector( x, y, utilities_FortranMatrixGlobalHeight( xy ), utilities_FortranMatrixHeight( xy ), utilities_FortranMatrixWidth( xy ), utilities_FortranMatrixValues( xy ) ); } static void lobpcg_MultiVectorByMatrix( mv_MultiVectorPtr x, utilities_FortranMatrix* r, mv_MultiVectorPtr y ) { mv_MultiVectorByMatrix( x, utilities_FortranMatrixGlobalHeight( r ), utilities_FortranMatrixHeight( r ), utilities_FortranMatrixWidth( r ), utilities_FortranMatrixValues( r ), y ); } static HYPRE_Int lobpcg_MultiVectorImplicitQR( mv_MultiVectorPtr x, mv_MultiVectorPtr y, utilities_FortranMatrix* r, mv_MultiVectorPtr z, HYPRE_Int (*dpotrf) (const char *uplo, HYPRE_Int *n, HYPRE_Real *a, HYPRE_Int *lda, HYPRE_Int *info) ) { /* B-orthonormalizes x using y = B x */ HYPRE_Int ierr; lobpcg_MultiVectorByMultiVector( x, y, r ); ierr = lobpcg_chol( r, dpotrf ); if ( ierr != 0 ) { return ierr; } utilities_FortranMatrixUpperInv( r ); utilities_FortranMatrixClearL( r ); mv_MultiVectorCopy( x, z ); lobpcg_MultiVectorByMatrix( z, r, x ); return 0; } static void lobpcg_sqrtVector( HYPRE_Int n, HYPRE_Int* mask, HYPRE_Real* v ) { HYPRE_Int i; for ( i = 0; i < n; i++ ) if ( mask == NULL || mask[i] ) { v[i] = hypre_sqrt(v[i]); } } static HYPRE_Int lobpcg_checkResiduals( utilities_FortranMatrix* resNorms, utilities_FortranMatrix* lambda, lobpcg_Tolerance tol, HYPRE_Int* activeMask ) { HYPRE_Int i, n; HYPRE_Int notConverged; HYPRE_Real atol; HYPRE_Real rtol; n = utilities_FortranMatrixHeight( resNorms ); atol = tol.absolute; rtol = tol.relative; notConverged = 0; for ( i = 0; i < n; i++ ) { if ( utilities_FortranMatrixValue( resNorms, i + 1, 1 ) > utilities_FortranMatrixValue( lambda, i + 1, 1 )*rtol + atol + HYPRE_REAL_EPSILON ) { activeMask[i] = 1; notConverged++; } else { activeMask[i] = 0; } } return notConverged; } static void lobpcg_errorMessage( HYPRE_Int verbosityLevel, const char* message ) { if ( verbosityLevel ) { hypre_fprintf( stderr, "Error in LOBPCG:\n" ); hypre_fprintf( stderr, "%s", message ); } } HYPRE_Int lobpcg_solve( mv_MultiVectorPtr blockVectorX, void* operatorAData, void (*operatorA)( void*, void*, void* ), void* operatorBData, void (*operatorB)( void*, void*, void* ), void* operatorTData, void (*operatorT)( void*, void*, void* ), mv_MultiVectorPtr blockVectorY, lobpcg_BLASLAPACKFunctions blap_fn, lobpcg_Tolerance tolerance, HYPRE_Int maxIterations, HYPRE_Int verbosityLevel, HYPRE_Int* iterationNumber, /* eigenvalues; "lambda_values" should point to array containing doubles where is the width of multivector "blockVectorX" */ HYPRE_Real * lambda_values, /* eigenvalues history; a pointer to the entries of the -by-(+1) matrix s tored in fortran-style. (i.e. column-wise) The matrix may be a submatrix of a larger matrix, see next argument; If you don't need eigenvalues history, provide NULL in this entry */ HYPRE_Real * lambdaHistory_values, /* global height of the matrix (stored in fotran-style) specified by previous argument */ HYPRE_BigInt lambdaHistory_gh, /* residual norms; argument should point to array of doubles */ HYPRE_Real * residualNorms_values, /* residual norms history; a pointer to the entries of the -by-(+1) matri x stored in fortran-style. (i.e. column-wise) The matrix may be a submatrix of a larger matrix, see next argument If you don't need residual norms history, provide NULL in this entry */ HYPRE_Real * residualNormsHistory_values, /* global height of the matrix (stored in fotran-style) specified by previous argument */ HYPRE_BigInt residualNormsHistory_gh ) { HYPRE_Int sizeX; /* number of eigenvectors */ HYPRE_Int sizeY; /* number of constraints */ HYPRE_Int sizeR; /* number of residuals used */ HYPRE_Int sizeP; /* number of conj. directions used */ HYPRE_Int sizeA; /* size of the Gram matrix for A */ HYPRE_Int sizeX3; /* 3*sizeX */ HYPRE_Int firstR; /* first line of the Gram block corresponding to residuals */ HYPRE_Int lastR; /* last line of this block */ HYPRE_Int firstP; /* same for conjugate directions */ HYPRE_Int lastP; HYPRE_Int noTFlag; /* nonzero: no preconditioner */ HYPRE_Int noBFlag; /* nonzero: no operator B */ HYPRE_Int noYFlag; /* nonzero: no constaints */ HYPRE_Int exitFlag; /* 1: problem size is too small, 2: block size < 1, 3: linearly dependent constraints, -1: requested accuracy not achieved */ HYPRE_Int* activeMask; /* soft locking mask */ HYPRE_Int i; /* short loop counter */ #if 0 hypre_longint n; /* dimension 1 of X */ /* had to remove because n is not available in some interfaces */ #endif mv_MultiVectorPtr blockVectorR; /* residuals */ mv_MultiVectorPtr blockVectorP; /* conjugate directions */ mv_MultiVectorPtr blockVectorW; /* auxiliary block vector */ mv_MultiVectorPtr blockVectorAX; /* A*X */ mv_MultiVectorPtr blockVectorAR; /* A*R */ mv_MultiVectorPtr blockVectorAP; /* A*P */ mv_MultiVectorPtr blockVectorBX; /* B*X */ mv_MultiVectorPtr blockVectorBR; /* B*R */ mv_MultiVectorPtr blockVectorBP; /* B*P */ mv_MultiVectorPtr blockVectorBY = NULL; /* B*Y */ utilities_FortranMatrix* gramA; /* Gram matrix for A */ utilities_FortranMatrix* gramB; /* Gram matrix for B */ utilities_FortranMatrix* lambdaAB; /* eigenvalues of gramA u = lambda gram B u */ utilities_FortranMatrix* lambdaX; /* first sizeX eigenvalues in lambdaAB (ref) */ utilities_FortranMatrix* gramXAX; /* XX block of gramA (ref) */ utilities_FortranMatrix* gramRAX; /* XR block of gramA (ref) */ utilities_FortranMatrix* gramPAX; /* XP block of gramA (ref) */ utilities_FortranMatrix* gramRAR; /* RR block of gramA (ref) */ utilities_FortranMatrix* gramPAR; /* RP block of gramA (ref) */ utilities_FortranMatrix* gramPAP; /* PP block of gramA (ref) */ utilities_FortranMatrix* gramXBX; /* XX block of gramB (ref) */ utilities_FortranMatrix* gramRBX; /* XR block of gramB (ref) */ utilities_FortranMatrix* gramPBX; /* XP block of gramB (ref) */ utilities_FortranMatrix* gramRBR; /* RR block of gramB (ref) */ utilities_FortranMatrix* gramPBR; /* RP block of gramB (ref) */ utilities_FortranMatrix* gramPBP; /* PP block of gramB (ref) */ utilities_FortranMatrix* gramYBY; /* Matrices for constraints */ utilities_FortranMatrix* gramYBX; utilities_FortranMatrix* tempYBX; utilities_FortranMatrix* gramYBR; /* ref. */ utilities_FortranMatrix* tempYBR; /* ref. */ utilities_FortranMatrix* coordX; /* coordinates of the first sizeX Ritz vectors in the XRP basis */ utilities_FortranMatrix* coordXX; /* coordinates of the above in X */ utilities_FortranMatrix* coordRX; /* coordinates of the above in R */ utilities_FortranMatrix* coordPX; /* coordinates of the above in P */ utilities_FortranMatrix* upperR; /* R factor in QR-fact. (ref) */ utilities_FortranMatrix* historyColumn; /* reference to a column in history matrices */ utilities_FortranMatrix* lambda; utilities_FortranMatrix* lambdaHistory; utilities_FortranMatrix* residualNorms; utilities_FortranMatrix* residualNormsHistory; /* initialization */ exitFlag = 0; *iterationNumber = 0; noTFlag = operatorT == NULL; noBFlag = operatorB == NULL; sizeY = mv_MultiVectorWidth( blockVectorY ); noYFlag = sizeY == 0; sizeX = mv_MultiVectorWidth( blockVectorX ); lambda = utilities_FortranMatrixCreate(); utilities_FortranMatrixWrap(lambda_values, sizeX, sizeX, 1, lambda); /* prepare to process eigenvalues history, if user has provided non-NULL as "lambdaHistory_values" a rgument */ if (lambdaHistory_values != NULL) { lambdaHistory = utilities_FortranMatrixCreate(); utilities_FortranMatrixWrap(lambdaHistory_values, lambdaHistory_gh, sizeX, maxIterations + 1, lambdaHistory); } else { lambdaHistory = NULL; } residualNorms = utilities_FortranMatrixCreate(); utilities_FortranMatrixWrap(residualNorms_values, sizeX, sizeX, 1, residualNorms); /* prepare to process residuals history, if user has provided non-NULL as "residualNormsHistory_valu es" argument */ if (residualNormsHistory_values != NULL) { residualNormsHistory = utilities_FortranMatrixCreate(); utilities_FortranMatrixWrap(residualNormsHistory_values, residualNormsHistory_gh, sizeX, maxIterations + 1, residualNormsHistory); } else { residualNormsHistory = NULL; } #if 0 /* had to remove because n is not available in some interfaces */ n = mv_MultiVectorHeight( blockVectorX ); if ( n < 5 * sizeX ) { exitFlag = PROBLEM_SIZE_TOO_SMALL; lobpcg_errorMessage( verbosityLevel, "Problem size too small compared to block size\n" ); return exitFlag; } #endif if ( sizeX < 1 ) { exitFlag = WRONG_BLOCK_SIZE; lobpcg_errorMessage( verbosityLevel, "The bloc size is wrong.\n" ); return exitFlag; } gramYBY = utilities_FortranMatrixCreate(); gramYBX = utilities_FortranMatrixCreate(); tempYBX = utilities_FortranMatrixCreate(); gramYBR = utilities_FortranMatrixCreate(); tempYBR = utilities_FortranMatrixCreate(); blockVectorW = mv_MultiVectorCreateCopy( blockVectorX, 0 ); if ( !noYFlag ) { utilities_FortranMatrixAllocateData( sizeY, sizeY, gramYBY ); utilities_FortranMatrixAllocateData( sizeY, sizeX, gramYBX ); utilities_FortranMatrixAllocateData( sizeY, sizeX, tempYBX ); blockVectorBY = blockVectorY; if ( !noBFlag ) { blockVectorBY = mv_MultiVectorCreateCopy( blockVectorY, 0 ); operatorB( operatorBData, mv_MultiVectorGetData(blockVectorY), mv_MultiVectorGetData(blockVectorBY) ); }; lobpcg_MultiVectorByMultiVector( blockVectorBY, blockVectorY, gramYBY ); exitFlag = lobpcg_chol( gramYBY, blap_fn.dpotrf ); if ( exitFlag != 0 ) { if ( verbosityLevel ) { hypre_printf("Cannot handle linear dependent constraints\n"); } utilities_FortranMatrixDestroy( gramYBY ); utilities_FortranMatrixDestroy( gramYBX ); utilities_FortranMatrixDestroy( tempYBX ); utilities_FortranMatrixDestroy( gramYBR ); utilities_FortranMatrixDestroy( tempYBR ); if ( !noBFlag ) { mv_MultiVectorDestroy( blockVectorBY ); } mv_MultiVectorDestroy( blockVectorW ); return WRONG_CONSTRAINTS; } utilities_FortranMatrixUpperInv( gramYBY ); utilities_FortranMatrixClearL( gramYBY ); /* apply the constraints to the initial X */ lobpcg_MultiVectorByMultiVector( blockVectorBY, blockVectorX, gramYBX ); utilities_FortranMatrixMultiply( gramYBY, 1, gramYBX, 0, tempYBX ); utilities_FortranMatrixMultiply( gramYBY, 0, tempYBX, 0, gramYBX ); lobpcg_MultiVectorByMatrix( blockVectorY, gramYBX, blockVectorW ); mv_MultiVectorAxpy( -1.0, blockVectorW, blockVectorX ); } if ( verbosityLevel ) { hypre_printf("\nSolving "); if ( noBFlag ) { hypre_printf("standard"); } else { hypre_printf("generalized"); } hypre_printf(" eigenvalue problem with"); if ( noTFlag ) { hypre_printf("out"); } hypre_printf(" preconditioning\n\n"); hypre_printf("block size %d\n\n", sizeX ); if ( noYFlag ) { hypre_printf("No constraints\n\n"); } else { if ( sizeY > 1 ) { hypre_printf("%d constraints\n\n", sizeY); } else { hypre_printf("%d constraint\n\n", sizeY); } } } /* creating fortran matrix shells */ gramA = utilities_FortranMatrixCreate(); gramB = utilities_FortranMatrixCreate(); lambdaAB = utilities_FortranMatrixCreate(); lambdaX = utilities_FortranMatrixCreate(); gramXAX = utilities_FortranMatrixCreate(); gramRAX = utilities_FortranMatrixCreate(); gramPAX = utilities_FortranMatrixCreate(); gramRAR = utilities_FortranMatrixCreate(); gramPAR = utilities_FortranMatrixCreate(); gramPAP = utilities_FortranMatrixCreate(); gramXBX = utilities_FortranMatrixCreate(); gramRBX = utilities_FortranMatrixCreate(); gramPBX = utilities_FortranMatrixCreate(); gramRBR = utilities_FortranMatrixCreate(); gramPBR = utilities_FortranMatrixCreate(); gramPBP = utilities_FortranMatrixCreate(); coordX = utilities_FortranMatrixCreate(); coordXX = utilities_FortranMatrixCreate(); coordRX = utilities_FortranMatrixCreate(); coordPX = utilities_FortranMatrixCreate(); upperR = utilities_FortranMatrixCreate(); historyColumn = utilities_FortranMatrixCreate(); /* initializing soft locking mask */ activeMask = hypre_CTAlloc(HYPRE_Int, sizeX, HYPRE_MEMORY_HOST); hypre_assert( activeMask != NULL ); for ( i = 0; i < sizeX; i++ ) { activeMask[i] = 1; } /* allocate memory for Gram matrices and the Ritz values */ sizeX3 = 3 * sizeX; utilities_FortranMatrixAllocateData( sizeX3, sizeX3, gramA ); utilities_FortranMatrixAllocateData( sizeX3, sizeX3, gramB ); utilities_FortranMatrixAllocateData( sizeX3, 1, lambdaAB ); /* creating block vectors R, P, AX, AR, AP, BX, BR, BP and W */ blockVectorR = mv_MultiVectorCreateCopy( blockVectorX, 0 ); blockVectorP = mv_MultiVectorCreateCopy( blockVectorX, 0 ); blockVectorAX = mv_MultiVectorCreateCopy( blockVectorX, 0 ); blockVectorAR = mv_MultiVectorCreateCopy( blockVectorX, 0 ); blockVectorAP = mv_MultiVectorCreateCopy( blockVectorX, 0 ); if ( !noBFlag ) { blockVectorBX = mv_MultiVectorCreateCopy( blockVectorX, 0 ); blockVectorBR = mv_MultiVectorCreateCopy( blockVectorX, 0 ); blockVectorBP = mv_MultiVectorCreateCopy( blockVectorX, 0 ); } else { blockVectorBX = blockVectorX; blockVectorBR = blockVectorR; blockVectorBP = blockVectorP; } mv_MultiVectorSetMask( blockVectorR, activeMask ); mv_MultiVectorSetMask( blockVectorP, activeMask ); mv_MultiVectorSetMask( blockVectorAR, activeMask ); mv_MultiVectorSetMask( blockVectorAP, activeMask ); if ( !noBFlag ) { mv_MultiVectorSetMask( blockVectorBR, activeMask ); mv_MultiVectorSetMask( blockVectorBP, activeMask ); } mv_MultiVectorSetMask( blockVectorW, activeMask ); /* B-orthonormaliization of X */ /* selecting a block in gramB for R factor upperR */ utilities_FortranMatrixSelectBlock( gramB, 1, sizeX, 1, sizeX, upperR ); if ( !noBFlag ) { operatorB( operatorBData, mv_MultiVectorGetData(blockVectorX), mv_MultiVectorGetData(blockVectorBX) ); } exitFlag = lobpcg_MultiVectorImplicitQR( blockVectorX, blockVectorBX, upperR, blockVectorW, blap_fn.dpotrf ); if ( exitFlag ) { lobpcg_errorMessage( verbosityLevel, "Bad initial vectors: orthonormalization failed\n" ); if ( verbosityLevel ) { hypre_printf("DPOTRF INFO = %d\n", exitFlag); } } else { if ( !noBFlag ) /* update BX */ { lobpcg_MultiVectorByMatrix( blockVectorBX, upperR, blockVectorW ); mv_MultiVectorCopy( blockVectorW, blockVectorBX ); } operatorA( operatorAData, mv_MultiVectorGetData(blockVectorX), mv_MultiVectorGetData(blockVectorAX) ); /* gramXAX = X'*AX */ utilities_FortranMatrixSelectBlock( gramA, 1, sizeX, 1, sizeX, gramXAX ); lobpcg_MultiVectorByMultiVector( blockVectorX, blockVectorAX, gramXAX ); utilities_FortranMatrixSymmetrize( gramXAX ); /* gramXBX = X'*X */ utilities_FortranMatrixSelectBlock( gramB, 1, sizeX, 1, sizeX, gramXBX ); lobpcg_MultiVectorByMultiVector( blockVectorX, blockVectorBX, gramXBX ); utilities_FortranMatrixSymmetrize( gramXBX ); /* utilities_FortranMatrixSetToIdentity( gramXBX );*/ /* X may be bad! */ if ( (exitFlag = lobpcg_solveGEVP( gramXAX, gramXBX, lambda, blap_fn.dsygv)) != 0 ) { lobpcg_errorMessage( verbosityLevel, "Bad problem: Rayleigh-Ritz in the initial subspace failed\n" ); if ( verbosityLevel ) { hypre_printf("DSYGV INFO = %d\n", exitFlag); } } else { utilities_FortranMatrixSelectBlock( gramXAX, 1, sizeX, 1, sizeX, coordX ); lobpcg_MultiVectorByMatrix( blockVectorX, coordX, blockVectorW ); mv_MultiVectorCopy( blockVectorW, blockVectorX ); lobpcg_MultiVectorByMatrix( blockVectorAX, coordX, blockVectorW ); mv_MultiVectorCopy( blockVectorW, blockVectorAX ); if ( !noBFlag ) { lobpcg_MultiVectorByMatrix( blockVectorBX, coordX, blockVectorW ); mv_MultiVectorCopy( blockVectorW, blockVectorBX ); } /* lobpcg_MultiVectorByMultiVector( blockVectorBX, blockVectorX, upperR ); utilities_FortranMatrixPrint( upperR, "xbx.dat" ); utilities_FortranMatrixPrint( lambda, "lmd.dat" ); */ mv_MultiVectorByDiagonal( blockVectorBX, NULL, sizeX, utilities_FortranMatrixValues( lambda ), blockVectorR ); mv_MultiVectorAxpy( -1.0, blockVectorAX, blockVectorR ); mv_MultiVectorByMultiVectorDiag( blockVectorR, blockVectorR, NULL, sizeX, utilities_FortranMatrixValues( residualNorms ) ); lobpcg_sqrtVector( sizeX, NULL, utilities_FortranMatrixValues( residualNorms ) ); if ( lambdaHistory != NULL ) { utilities_FortranMatrixSelectBlock( lambdaHistory, 1, sizeX, 1, 1, historyColumn ); utilities_FortranMatrixCopy( lambda, 0, historyColumn ); } if ( residualNormsHistory != NULL ) { utilities_FortranMatrixSelectBlock( residualNormsHistory, 1, sizeX, 1, 1, historyColumn ); utilities_FortranMatrixCopy( residualNorms, 0, historyColumn ); } if ( verbosityLevel == 2 ) { hypre_printf("\n"); for (i = 1; i <= sizeX; i++ ) hypre_printf("Initial eigenvalues lambda %22.14e\n", utilities_FortranMatrixValue( lambda, i, 1) ); for (i = 1; i <= sizeX; i++) hypre_printf("Initial residuals %12.6e\n", utilities_FortranMatrixValue( residualNorms, i, 1) ); } else if ( verbosityLevel == 1 ) hypre_printf("\nInitial Max. Residual %22.14e\n", utilities_FortranMatrixMaxValue( residualNorms ) ); } } for ( *iterationNumber = 1; exitFlag == 0 && *iterationNumber <= maxIterations; (*iterationNumber)++ ) { sizeR = lobpcg_checkResiduals( residualNorms, lambda, tolerance, activeMask ); if ( sizeR < 1 ) { break; } /* following code added by Ilya Lashuk on March 22, 2005; with current multivector implementation mask needs to be reset after it has changed on each vector mask applies to */ mv_MultiVectorSetMask( blockVectorR, activeMask ); mv_MultiVectorSetMask( blockVectorP, activeMask ); mv_MultiVectorSetMask( blockVectorAR, activeMask ); mv_MultiVectorSetMask( blockVectorAP, activeMask ); if ( !noBFlag ) { mv_MultiVectorSetMask( blockVectorBR, activeMask ); mv_MultiVectorSetMask( blockVectorBP, activeMask ); } mv_MultiVectorSetMask( blockVectorW, activeMask ); /* ***** end of added code ***** */ if ( !noTFlag ) { operatorT( operatorTData, mv_MultiVectorGetData(blockVectorR), mv_MultiVectorGetData(blockVectorW) ); mv_MultiVectorCopy( blockVectorW, blockVectorR ); } if ( !noYFlag ) /* apply the constraints to R */ { utilities_FortranMatrixSelectBlock( gramYBX, 1, sizeY, 1, sizeR, gramYBR ); utilities_FortranMatrixSelectBlock( tempYBX, 1, sizeY, 1, sizeR, tempYBR ); lobpcg_MultiVectorByMultiVector( blockVectorBY, blockVectorR, gramYBR ); utilities_FortranMatrixMultiply( gramYBY, 1, gramYBR, 0, tempYBR ); utilities_FortranMatrixMultiply( gramYBY, 0, tempYBR, 0, gramYBR ); lobpcg_MultiVectorByMatrix( blockVectorY, gramYBR, blockVectorW ); mv_MultiVectorAxpy( -1.0, blockVectorW, blockVectorR ); } firstR = sizeX + 1; lastR = sizeX + sizeR; firstP = lastR + 1; utilities_FortranMatrixSelectBlock( gramB, firstR, lastR, firstR, lastR, upperR ); if ( !noBFlag ) { operatorB( operatorBData, mv_MultiVectorGetData(blockVectorR), mv_MultiVectorGetData(blockVectorBR) ); } exitFlag = lobpcg_MultiVectorImplicitQR( blockVectorR, blockVectorBR, upperR, blockVectorW, blap_fn.dpotrf ); if ( exitFlag ) { lobpcg_errorMessage( verbosityLevel, "Orthonormalization of residuals failed\n" ); if ( verbosityLevel ) { hypre_printf("DPOTRF INFO = %d\n", exitFlag); } break; } if ( !noBFlag ) /* update BR */ { lobpcg_MultiVectorByMatrix( blockVectorBR, upperR, blockVectorW ); mv_MultiVectorCopy( blockVectorW, blockVectorBR ); } /* AR = A*R */ operatorA( operatorAData, mv_MultiVectorGetData(blockVectorR), mv_MultiVectorGetData(blockVectorAR) ); if ( *iterationNumber > 1 ) { sizeP = sizeR; lastP = lastR + sizeP; utilities_FortranMatrixSelectBlock( gramB, firstP, lastP, firstP, lastP, upperR ); exitFlag = lobpcg_MultiVectorImplicitQR( blockVectorP, blockVectorBP, upperR, blockVectorW, blap_fn.dpotrf ); if ( exitFlag ) { /* lobpcg_errorMessage( verbosityLevel, "Orthonormalization of P failed\n" ); if ( verbosityLevel ) hypre_printf("DPOTRF INFO = %d\n", exitFlag); */ sizeP = 0; } else { if ( !noBFlag ) /* update BP */ { lobpcg_MultiVectorByMatrix( blockVectorBP, upperR, blockVectorW ); mv_MultiVectorCopy( blockVectorW, blockVectorBP ); } /* update AP */ lobpcg_MultiVectorByMatrix( blockVectorAP, upperR, blockVectorW ); mv_MultiVectorCopy( blockVectorW, blockVectorAP ); } } else { sizeP = 0; lastP = lastR; } sizeA = lastR + sizeP; utilities_FortranMatrixSelectBlock( gramA, 1, sizeX, 1, sizeX, gramXAX ); utilities_FortranMatrixSelectBlock( gramA, firstR, lastR, 1, sizeX, gramRAX ); utilities_FortranMatrixSelectBlock( gramA, firstR, lastR, firstR, lastR, gramRAR ); utilities_FortranMatrixSelectBlock( gramB, 1, sizeX, 1, sizeX, gramXBX ); utilities_FortranMatrixSelectBlock( gramB, firstR, lastR, 1, sizeX, gramRBX ); utilities_FortranMatrixSelectBlock( gramB, firstR, lastR, firstR, lastR, gramRBR ); utilities_FortranMatrixClear( gramXAX ); utilities_FortranMatrixSetDiagonal( gramXAX, lambda ); lobpcg_MultiVectorByMultiVector( blockVectorR, blockVectorAX, gramRAX ); lobpcg_MultiVectorByMultiVector( blockVectorR, blockVectorAR, gramRAR ); utilities_FortranMatrixSymmetrize( gramRAR ); utilities_FortranMatrixSetToIdentity( gramXBX ); lobpcg_MultiVectorByMultiVector( blockVectorR, blockVectorBX, gramRBX ); utilities_FortranMatrixSetToIdentity( gramRBR ); if ( *iterationNumber > 1 ) { utilities_FortranMatrixSelectBlock( gramA, firstP, lastP, 1, sizeX, gramPAX ); utilities_FortranMatrixSelectBlock( gramA, firstP, lastP, firstR, lastR, gramPAR ); utilities_FortranMatrixSelectBlock( gramA, firstP, lastP, firstP, lastP, gramPAP ); utilities_FortranMatrixSelectBlock( gramB, firstP, lastP, 1, sizeX, gramPBX ); utilities_FortranMatrixSelectBlock( gramB, firstP, lastP, firstR, lastR, gramPBR ); utilities_FortranMatrixSelectBlock( gramB, firstP, lastP, firstP, lastP, gramPBP ); lobpcg_MultiVectorByMultiVector( blockVectorP, blockVectorAX, gramPAX ); lobpcg_MultiVectorByMultiVector( blockVectorP, blockVectorAR, gramPAR ); lobpcg_MultiVectorByMultiVector( blockVectorP, blockVectorAP, gramPAP ); utilities_FortranMatrixSymmetrize( gramPAP ); lobpcg_MultiVectorByMultiVector( blockVectorP, blockVectorBX, gramPBX ); lobpcg_MultiVectorByMultiVector( blockVectorP, blockVectorBR, gramPBR ); utilities_FortranMatrixSetToIdentity( gramPBP ); } utilities_FortranMatrixSelectBlock( gramA, 1, sizeA, 1, sizeA, gramXAX ); utilities_FortranMatrixSelectBlock( gramB, 1, sizeA, 1, sizeA, gramXBX ); if ( (exitFlag = lobpcg_solveGEVP( gramXAX, gramXBX, lambdaAB, blap_fn.dsygv )) != 0 ) { lobpcg_errorMessage( verbosityLevel, "GEVP solver failure\n" ); (*iterationNumber)--; /* if ( verbosityLevel ) hypre_printf("INFO = %d\n", exitFlag);*/ break; } utilities_FortranMatrixSelectBlock( lambdaAB, 1, sizeX, 1, 1, lambdaX ); utilities_FortranMatrixCopy( lambdaX, 0, lambda ); utilities_FortranMatrixSelectBlock( gramA, 1, sizeA, 1, sizeX, coordX ); utilities_FortranMatrixSelectBlock( coordX, 1, sizeX, 1, sizeX, coordXX ); utilities_FortranMatrixSelectBlock( coordX, firstR, lastR, 1, sizeX, coordRX ); if ( *iterationNumber > 1 ) { utilities_FortranMatrixSelectBlock( coordX, firstP, lastP, 1, sizeX, coordPX ); mv_MultiVectorSetMask( blockVectorW, NULL ); lobpcg_MultiVectorByMatrix( blockVectorP, coordPX, blockVectorW ); mv_MultiVectorSetMask( blockVectorP, NULL ); mv_MultiVectorCopy( blockVectorW, blockVectorP ); lobpcg_MultiVectorByMatrix( blockVectorAP, coordPX, blockVectorW ); mv_MultiVectorSetMask( blockVectorAP, NULL ); mv_MultiVectorCopy( blockVectorW, blockVectorAP ); if ( !noBFlag ) { lobpcg_MultiVectorByMatrix( blockVectorBP, coordPX, blockVectorW ); mv_MultiVectorSetMask( blockVectorBP, NULL ); mv_MultiVectorCopy( blockVectorW, blockVectorBP ); } lobpcg_MultiVectorByMatrix( blockVectorR, coordRX, blockVectorW ); mv_MultiVectorAxpy( 1.0, blockVectorW, blockVectorP ); lobpcg_MultiVectorByMatrix( blockVectorAR, coordRX, blockVectorW ); mv_MultiVectorAxpy( 1.0, blockVectorW, blockVectorAP ); if ( !noBFlag ) { lobpcg_MultiVectorByMatrix( blockVectorBR, coordRX, blockVectorW ); mv_MultiVectorAxpy( 1.0, blockVectorW, blockVectorBP ); } } else { mv_MultiVectorSetMask( blockVectorP, NULL ); lobpcg_MultiVectorByMatrix( blockVectorR, coordRX, blockVectorP ); mv_MultiVectorSetMask( blockVectorAP, NULL ); lobpcg_MultiVectorByMatrix( blockVectorAR, coordRX, blockVectorAP ); if ( !noBFlag ) { mv_MultiVectorSetMask( blockVectorBP, NULL ); lobpcg_MultiVectorByMatrix( blockVectorBR, coordRX, blockVectorBP ); } } /* follwing line is bug fix in Google Rev 8 of code, by ilya.lashuk Aug 29,2008 */ mv_MultiVectorSetMask( blockVectorW, NULL ); mv_MultiVectorCopy( blockVectorX, blockVectorW ); lobpcg_MultiVectorByMatrix( blockVectorW, coordXX, blockVectorX ); mv_MultiVectorAxpy( 1.0, blockVectorP, blockVectorX ); mv_MultiVectorCopy( blockVectorAX, blockVectorW ); lobpcg_MultiVectorByMatrix( blockVectorW, coordXX, blockVectorAX ); mv_MultiVectorAxpy( 1.0, blockVectorAP, blockVectorAX ); if ( !noBFlag ) { mv_MultiVectorCopy( blockVectorBX, blockVectorW ); lobpcg_MultiVectorByMatrix( blockVectorW, coordXX, blockVectorBX ); mv_MultiVectorAxpy( 1.0, blockVectorBP, blockVectorBX ); } mv_MultiVectorSetMask( blockVectorAX, activeMask ); mv_MultiVectorSetMask( blockVectorBX, activeMask ); mv_MultiVectorByDiagonal( blockVectorBX, activeMask, sizeX, utilities_FortranMatrixValues( lambda ), blockVectorR ); mv_MultiVectorAxpy( -1.0, blockVectorAX, blockVectorR ); mv_MultiVectorByMultiVectorDiag( blockVectorR, blockVectorR, activeMask, sizeX, utilities_FortranMatrixValues( residualNorms ) ); lobpcg_sqrtVector( sizeX, activeMask, utilities_FortranMatrixValues( residualNorms ) ); i = *iterationNumber + 1; if ( lambdaHistory != NULL ) { utilities_FortranMatrixSelectBlock( lambdaHistory, 1, sizeX, i, i, historyColumn ); utilities_FortranMatrixCopy( lambda, 0, historyColumn ); } if ( residualNormsHistory != NULL ) { utilities_FortranMatrixSelectBlock( residualNormsHistory, 1, sizeX, i, i, historyColumn ); utilities_FortranMatrixCopy( residualNorms, 0, historyColumn ); } if ( verbosityLevel == 2 ) { hypre_printf( "Iteration %d \tbsize %d\n", *iterationNumber, sizeR ); for ( i = 1; i <= sizeX; i++ ) hypre_printf("Eigenvalue lambda %22.14e\n", utilities_FortranMatrixValue( lambda, i, 1) ); for ( i = 1; i <= sizeX; i++ ) hypre_printf("Residual %12.6e\n", utilities_FortranMatrixValue( residualNorms, i, 1) ); } else if ( verbosityLevel == 1 ) hypre_printf("Iteration %d \tbsize %d \tmaxres %22.14e\n", *iterationNumber, sizeR, utilities_FortranMatrixMaxValue( residualNorms ) ); mv_MultiVectorSetMask( blockVectorAX, NULL ); mv_MultiVectorSetMask( blockVectorBX, NULL ); mv_MultiVectorSetMask( blockVectorAP, activeMask ); mv_MultiVectorSetMask( blockVectorBP, activeMask ); mv_MultiVectorSetMask( blockVectorP, activeMask ); mv_MultiVectorSetMask( blockVectorW, activeMask ); } if ( exitFlag != 0 || *iterationNumber > maxIterations ) { exitFlag = REQUESTED_ACCURACY_NOT_ACHIEVED; } (*iterationNumber)--; if ( verbosityLevel == 1 ) { hypre_printf("\n"); for ( i = 1; i <= sizeX; i++ ) hypre_printf("Eigenvalue lambda %22.14e\n", utilities_FortranMatrixValue( lambda, i, 1) ); for ( i = 1; i <= sizeX; i++ ) hypre_printf("Residual %22.14e\n", utilities_FortranMatrixValue( residualNorms, i, 1) ); hypre_printf("\n%d iterations\n", *iterationNumber ); } mv_MultiVectorDestroy( blockVectorR ); mv_MultiVectorDestroy( blockVectorP ); mv_MultiVectorDestroy( blockVectorAX ); mv_MultiVectorDestroy( blockVectorAR ); mv_MultiVectorDestroy( blockVectorAP ); if ( !noBFlag ) { mv_MultiVectorDestroy( blockVectorBX ); mv_MultiVectorDestroy( blockVectorBR ); mv_MultiVectorDestroy( blockVectorBP ); if ( !noYFlag ) { mv_MultiVectorDestroy( blockVectorBY ); } } mv_MultiVectorDestroy( blockVectorW ); utilities_FortranMatrixDestroy( gramA ); utilities_FortranMatrixDestroy( gramB ); utilities_FortranMatrixDestroy( lambdaAB ); utilities_FortranMatrixDestroy( lambdaX ); utilities_FortranMatrixDestroy( gramXAX ); utilities_FortranMatrixDestroy( gramRAX ); utilities_FortranMatrixDestroy( gramPAX ); utilities_FortranMatrixDestroy( gramRAR ); utilities_FortranMatrixDestroy( gramPAR ); utilities_FortranMatrixDestroy( gramPAP ); utilities_FortranMatrixDestroy( gramXBX ); utilities_FortranMatrixDestroy( gramRBX ); utilities_FortranMatrixDestroy( gramPBX ); utilities_FortranMatrixDestroy( gramRBR ); utilities_FortranMatrixDestroy( gramPBR ); utilities_FortranMatrixDestroy( gramPBP ); utilities_FortranMatrixDestroy( gramYBY ); utilities_FortranMatrixDestroy( gramYBX ); utilities_FortranMatrixDestroy( tempYBX ); utilities_FortranMatrixDestroy( gramYBR ); utilities_FortranMatrixDestroy( tempYBR ); utilities_FortranMatrixDestroy( coordX ); utilities_FortranMatrixDestroy( coordXX ); utilities_FortranMatrixDestroy( coordRX ); utilities_FortranMatrixDestroy( coordPX ); utilities_FortranMatrixDestroy( upperR ); utilities_FortranMatrixDestroy( historyColumn ); utilities_FortranMatrixDestroy( lambda ); utilities_FortranMatrixDestroy( lambdaHistory ); utilities_FortranMatrixDestroy( residualNorms ); utilities_FortranMatrixDestroy( residualNormsHistory ); hypre_TFree( activeMask, HYPRE_MEMORY_HOST); return exitFlag; } hypre-2.33.0/src/krylov/lobpcg.h000066400000000000000000000067661477326011500165070ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "multivector.h" #include "_hypre_utilities.h" #ifndef LOCALLY_OPTIMAL_BLOCK_PRECONDITIONED_CONJUGATE_GRADIENTS #define LOCALLY_OPTIMAL_BLOCK_PRECONDITIONED_CONJUGATE_GRADIENTS #ifdef __cplusplus extern "C" { #endif #define PROBLEM_SIZE_TOO_SMALL 1 #define WRONG_BLOCK_SIZE 2 #define WRONG_CONSTRAINTS 3 #define REQUESTED_ACCURACY_NOT_ACHIEVED -1 typedef struct { HYPRE_Real absolute; HYPRE_Real relative; } lobpcg_Tolerance; typedef struct { /* these pointers should point to 2 functions providing standard lapack functionality */ HYPRE_Int (*dpotrf) (const char *uplo, HYPRE_Int *n, HYPRE_Real *a, HYPRE_Int * lda, HYPRE_Int *info); HYPRE_Int (*dsygv) (HYPRE_Int *itype, char *jobz, char *uplo, HYPRE_Int * n, HYPRE_Real *a, HYPRE_Int *lda, HYPRE_Real *b, HYPRE_Int *ldb, HYPRE_Real *w, HYPRE_Real *work, HYPRE_Int *lwork, HYPRE_Int *info); } lobpcg_BLASLAPACKFunctions; HYPRE_Int lobpcg_solve( mv_MultiVectorPtr blockVectorX, void* operatorAData, void (*operatorA)( void*, void*, void* ), void* operatorBData, void (*operatorB)( void*, void*, void* ), void* operatorTData, void (*operatorT)( void*, void*, void* ), mv_MultiVectorPtr blockVectorY, lobpcg_BLASLAPACKFunctions blap_fn, lobpcg_Tolerance tolerance, HYPRE_Int maxIterations, HYPRE_Int verbosityLevel, HYPRE_Int* iterationNumber, /* eigenvalues; "lambda_values" should point to array containing doubles where is the width of multivector "blockVectorX" */ HYPRE_Real * lambda_values, /* eigenvalues history; a pointer to the entries of the -by-(+1) matrix s tored in fortran-style. (i.e. column-wise) The matrix may be a submatrix of a larger matrix, see next argument; If you don't need eigenvalues history, provide NULL in this entry */ HYPRE_Real * lambdaHistory_values, /* global height of the matrix (stored in fotran-style) specified by previous argument */ HYPRE_BigInt lambdaHistory_gh, /* residual norms; argument should point to array of doubles */ HYPRE_Real * residualNorms_values, /* residual norms history; a pointer to the entries of the -by-(+1) matri x stored in fortran-style. (i.e. column-wise) The matrix may be a submatrix of a larger matrix, see next argument If you don't need residual norms history, provide NULL in this entry */ HYPRE_Real * residualNormsHistory_values, /* global height of the matrix (stored in fotran-style) specified by previous argument */ HYPRE_BigInt residualNormsHistory_gh ); #ifdef __cplusplus } #endif #endif /* LOCALLY_OPTIMAL_BLOCK_PRECONDITIONED_CONJUGATE_GRADIENTS */ hypre-2.33.0/src/krylov/pcg.c000066400000000000000000001416161477326011500157770ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * Preconditioned conjugate gradient (Omin) functions * *****************************************************************************/ /* This was based on the pcg.c formerly in struct_ls, with changes (GetPrecond and stop_crit) for compatibility with the pcg.c in parcsr_ls and elsewhere. Incompatibilities with the parcsr_ls version: - logging is different; no attempt has been made to be the same - treatment of b=0 in Ax=b is different: this returns x=0; the parcsr version iterates with a special stopping criterion */ #include "krylov.h" #include "_hypre_utilities.h" /*-------------------------------------------------------------------------- * hypre_PCGFunctionsCreate *--------------------------------------------------------------------------*/ hypre_PCGFunctions * hypre_PCGFunctionsCreate( void * (*CAlloc) ( size_t count, size_t elt_size, HYPRE_MemoryLocation location ), HYPRE_Int (*Free) ( void *ptr ), HYPRE_Int (*CommInfo) ( void *A, HYPRE_Int *my_id, HYPRE_Int *num_procs ), void * (*CreateVector) ( void *vector ), HYPRE_Int (*DestroyVector) ( void *vector ), void * (*MatvecCreate) ( void *A, void *x ), HYPRE_Int (*Matvec) ( void *matvec_data, HYPRE_Complex alpha, void *A, void *x, HYPRE_Complex beta, void *y ), HYPRE_Int (*MatvecDestroy) ( void *matvec_data ), HYPRE_Real (*InnerProd) ( void *x, void *y ), HYPRE_Int (*CopyVector) ( void *x, void *y ), HYPRE_Int (*ClearVector) ( void *x ), HYPRE_Int (*ScaleVector) ( HYPRE_Complex alpha, void *x ), HYPRE_Int (*Axpy) ( HYPRE_Complex alpha, void *x, void *y ), HYPRE_Int (*PrecondSetup) ( void *vdata, void *A, void *b, void *x ), HYPRE_Int (*Precond) ( void *vdata, void *A, void *b, void *x ) ) { hypre_PCGFunctions * pcg_functions; pcg_functions = (hypre_PCGFunctions *) CAlloc( 1, sizeof(hypre_PCGFunctions), HYPRE_MEMORY_HOST ); pcg_functions->CAlloc = CAlloc; pcg_functions->Free = Free; pcg_functions->CommInfo = CommInfo; pcg_functions->CreateVector = CreateVector; pcg_functions->DestroyVector = DestroyVector; pcg_functions->MatvecCreate = MatvecCreate; pcg_functions->Matvec = Matvec; pcg_functions->MatvecDestroy = MatvecDestroy; pcg_functions->InnerProd = InnerProd; pcg_functions->CopyVector = CopyVector; pcg_functions->ClearVector = ClearVector; pcg_functions->ScaleVector = ScaleVector; pcg_functions->Axpy = Axpy; /* default preconditioner must be set here but can be changed later... */ pcg_functions->precond_setup = PrecondSetup; pcg_functions->precond = Precond; return pcg_functions; } /*-------------------------------------------------------------------------- * hypre_PCGCreate *--------------------------------------------------------------------------*/ void * hypre_PCGCreate( hypre_PCGFunctions *pcg_functions ) { hypre_PCGData *pcg_data; HYPRE_ANNOTATE_FUNC_BEGIN; pcg_data = hypre_CTAllocF(hypre_PCGData, 1, pcg_functions, HYPRE_MEMORY_HOST); pcg_data -> functions = pcg_functions; /* set defaults */ (pcg_data -> tol) = 1.0e-06; (pcg_data -> atolf) = 0.0; (pcg_data -> cf_tol) = 0.0; (pcg_data -> a_tol) = 0.0; (pcg_data -> rtol) = 0.0; (pcg_data -> max_iter) = 1000; (pcg_data -> two_norm) = 0; (pcg_data -> rel_change) = 0; (pcg_data -> recompute_residual) = 0; (pcg_data -> recompute_residual_p) = 0; (pcg_data -> stop_crit) = 0; (pcg_data -> skip_break) = 0; (pcg_data -> converged) = 0; (pcg_data -> hybrid) = 0; (pcg_data -> owns_matvec_data ) = 1; (pcg_data -> matvec_data) = NULL; (pcg_data -> precond_data) = NULL; (pcg_data -> print_level) = 0; (pcg_data -> logging) = 0; (pcg_data -> norms) = NULL; (pcg_data -> rel_norms) = NULL; (pcg_data -> p) = NULL; (pcg_data -> s) = NULL; (pcg_data -> r) = NULL; (pcg_data -> r_old) = NULL; (pcg_data -> v) = NULL; HYPRE_ANNOTATE_FUNC_END; return (void *) pcg_data; } /*-------------------------------------------------------------------------- * hypre_PCGDestroy *--------------------------------------------------------------------------*/ HYPRE_Int hypre_PCGDestroy( void *pcg_vdata ) { hypre_PCGData *pcg_data = (hypre_PCGData *)pcg_vdata; HYPRE_ANNOTATE_FUNC_BEGIN; if (pcg_data) { hypre_PCGFunctions *pcg_functions = pcg_data->functions; if ( (pcg_data -> norms) != NULL ) { hypre_TFreeF( pcg_data -> norms, pcg_functions ); pcg_data -> norms = NULL; } if ( (pcg_data -> rel_norms) != NULL ) { hypre_TFreeF( pcg_data -> rel_norms, pcg_functions ); pcg_data -> rel_norms = NULL; } if ( pcg_data -> matvec_data != NULL && pcg_data->owns_matvec_data ) { (*(pcg_functions->MatvecDestroy))(pcg_data -> matvec_data); pcg_data -> matvec_data = NULL; } if ( pcg_data -> p != NULL ) { (*(pcg_functions->DestroyVector))(pcg_data -> p); pcg_data -> p = NULL; } if ( pcg_data -> s != NULL ) { (*(pcg_functions->DestroyVector))(pcg_data -> s); pcg_data -> s = NULL; } if ( pcg_data -> r != NULL ) { (*(pcg_functions->DestroyVector))(pcg_data -> r); pcg_data -> r = NULL; } if ( pcg_data -> r_old != NULL ) { (*(pcg_functions->DestroyVector))(pcg_data -> r_old); pcg_data -> r_old = NULL; } if ( pcg_data -> v != NULL ) { (*(pcg_functions->DestroyVector))(pcg_data -> v); pcg_data -> v = NULL; } hypre_TFreeF( pcg_data, pcg_functions ); hypre_TFreeF( pcg_functions, pcg_functions ); } HYPRE_ANNOTATE_FUNC_END; return (hypre_error_flag); } /*-------------------------------------------------------------------------- * hypre_PCGGetResidual *--------------------------------------------------------------------------*/ HYPRE_Int hypre_PCGGetResidual( void *pcg_vdata, void **residual ) { /* returns a pointer to the residual vector */ hypre_PCGData *pcg_data = (hypre_PCGData *)pcg_vdata; *residual = pcg_data->r; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_PCGSetup *--------------------------------------------------------------------------*/ HYPRE_Int hypre_PCGSetup( void *pcg_vdata, void *A, void *b, void *x ) { hypre_PCGData *pcg_data = (hypre_PCGData *)pcg_vdata; hypre_PCGFunctions *pcg_functions = pcg_data->functions; HYPRE_Int max_iter = (pcg_data -> max_iter); HYPRE_Int recompute_residual_p = (pcg_data -> recompute_residual_p); HYPRE_Real rtol = (pcg_data -> rtol); HYPRE_Int two_norm = (pcg_data -> two_norm); HYPRE_Int flex = (pcg_data -> flex); HYPRE_Int (*precond_setup)(void*, void*, void*, void*) = (pcg_functions -> precond_setup); void *precond_data = (pcg_data -> precond_data); HYPRE_ANNOTATE_FUNC_BEGIN; (pcg_data -> A) = A; /*-------------------------------------------------- * The arguments for CreateVector are important to * maintain consistency between the setup and * compute phases of matvec and the preconditioner. *--------------------------------------------------*/ if ( pcg_data -> p != NULL ) { (*(pcg_functions->DestroyVector))(pcg_data -> p); } (pcg_data -> p) = (*(pcg_functions->CreateVector))(x); if ( pcg_data -> s != NULL ) { (*(pcg_functions->DestroyVector))(pcg_data -> s); } (pcg_data -> s) = (*(pcg_functions->CreateVector))(x); if ( pcg_data -> r != NULL ) { (*(pcg_functions->DestroyVector))(pcg_data -> r); } (pcg_data -> r) = (*(pcg_functions->CreateVector))(b); if ( pcg_data -> matvec_data != NULL && pcg_data->owns_matvec_data ) { (*(pcg_functions->MatvecDestroy))(pcg_data -> matvec_data); } (pcg_data -> matvec_data) = (*(pcg_functions->MatvecCreate))(A, x); if (flex) { if ( pcg_data -> v != NULL ) { (*(pcg_functions->DestroyVector))(pcg_data -> r_old); } (pcg_data -> r_old) = (*(pcg_functions->CreateVector))(b); } if (rtol && recompute_residual_p && (!two_norm)) { if ( pcg_data -> v != NULL ) { (*(pcg_functions->DestroyVector))(pcg_data -> v); } (pcg_data -> v) = (*(pcg_functions->CreateVector))(b); } precond_setup(precond_data, A, b, x); /*----------------------------------------------------- * Allocate space for log info *-----------------------------------------------------*/ if ( (pcg_data->logging) > 0 || (pcg_data->print_level) > 0 ) { if ( (pcg_data -> norms) != NULL ) { hypre_TFreeF( pcg_data -> norms, pcg_functions ); } (pcg_data -> norms) = hypre_CTAllocF( HYPRE_Real, max_iter + 1, pcg_functions, HYPRE_MEMORY_HOST); if ( (pcg_data -> rel_norms) != NULL ) { hypre_TFreeF( pcg_data -> rel_norms, pcg_functions ); } (pcg_data -> rel_norms) = hypre_CTAllocF( HYPRE_Real, max_iter + 1, pcg_functions, HYPRE_MEMORY_HOST ); } HYPRE_ANNOTATE_FUNC_END; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_PCGSolve *-------------------------------------------------------------------------- * * We use the following convergence test as the default (see Ashby, Holst, * Manteuffel, and Saylor): * * ||e||_A ||r||_C * ------- <= [kappa_A(C*A)]^(1/2) ------- < tol * ||x||_A ||b||_C * * where we let (for the time being) kappa_A(CA) = 1. * We implement the test as: * * gamma = / < (tol^2) = eps * *--------------------------------------------------------------------------*/ HYPRE_Int hypre_PCGSolve( void *pcg_vdata, void *A, void *b, void *x ) { hypre_PCGData *pcg_data = (hypre_PCGData *)pcg_vdata; hypre_PCGFunctions *pcg_functions = pcg_data->functions; HYPRE_Real r_tol = (pcg_data -> tol); HYPRE_Real a_tol = (pcg_data -> a_tol); HYPRE_Real atolf = (pcg_data -> atolf); HYPRE_Real cf_tol = (pcg_data -> cf_tol); HYPRE_Real rtol = (pcg_data -> rtol); HYPRE_Int max_iter = (pcg_data -> max_iter); HYPRE_Int two_norm = (pcg_data -> two_norm); HYPRE_Int rel_change = (pcg_data -> rel_change); HYPRE_Int recompute_residual = (pcg_data -> recompute_residual); HYPRE_Int recompute_residual_p = (pcg_data -> recompute_residual_p); HYPRE_Int stop_crit = (pcg_data -> stop_crit); HYPRE_Int hybrid = (pcg_data -> hybrid); HYPRE_Int skip_break = (pcg_data -> skip_break); HYPRE_Int flex = (pcg_data -> flex); /* flex replaces the generally used Fletcher-Reeves method for the * parameter used to update the direction vector p, beta=/ * with the Polak-Ribiere method, which is more flexible, can be more stable, * and llows varying preconditioners, but requires an extra dot product * beta = / */ /* HYPRE_Int converged = (pcg_data -> converged); */ void *p = (pcg_data -> p); void *s = (pcg_data -> s); void *r = (pcg_data -> r); void *r_old = (pcg_data -> r_old); void *v = (pcg_data -> v); void *matvec_data = (pcg_data -> matvec_data); HYPRE_Int (*precond)(void*, void*, void*, void*) = (pcg_functions -> precond); void *precond_data = (pcg_data -> precond_data); HYPRE_Int print_level = (pcg_data -> print_level); HYPRE_Int logging = (pcg_data -> logging); HYPRE_Real *norms = (pcg_data -> norms); HYPRE_Real *rel_norms = (pcg_data -> rel_norms); HYPRE_Real alpha, beta; HYPRE_Real delta = 0.0; HYPRE_Real gamma, gamma_old; HYPRE_Real bi_prod, eps; HYPRE_Real pi_prod, xi_prod; HYPRE_Real ieee_check = 0.; HYPRE_Real i_prod = 0.0; HYPRE_Real i_prod_0 = 0.0; HYPRE_Real cf_ave_0 = 0.0; HYPRE_Real cf_ave_1 = 0.0; HYPRE_Real weight; HYPRE_Real ratio; HYPRE_Real guard_zero_residual, sdotp; HYPRE_Int tentatively_converged = 0; HYPRE_Int recompute_true_residual = 0; HYPRE_Int i = 0; HYPRE_Int my_id, num_procs; HYPRE_ANNOTATE_FUNC_BEGIN; (pcg_data -> converged) = 0; (*(pcg_functions->CommInfo))(A, &my_id, &num_procs); /*----------------------------------------------------------------------- * With relative change convergence test on, it is possible to attempt * another iteration with a zero residual. This causes the parameter * alpha to go NaN. The guard_zero_residual parameter is to circumvent * this. Perhaps it should be set to something non-zero (but small). *-----------------------------------------------------------------------*/ guard_zero_residual = 0.0; /*----------------------------------------------------------------------- * Start pcg solve *-----------------------------------------------------------------------*/ /* compute eps */ if (two_norm) { /* bi_prod = */ bi_prod = (*(pcg_functions->InnerProd))(b, b); if (print_level > 1 && my_id == 0) { hypre_printf(": %e\n", bi_prod); } } else { /* bi_prod = */ (*(pcg_functions->ClearVector))(p); precond(precond_data, A, b, p); bi_prod = (*(pcg_functions->InnerProd))(p, b); if (print_level > 1 && my_id == 0) { hypre_printf(": %e\n", bi_prod); } }; /* Since it does not diminish performance, attempt to return an error flag and notify users when they supply bad input. */ if (bi_prod != 0.) { ieee_check = bi_prod / bi_prod; } /* INF -> NaN conversion */ if (ieee_check != ieee_check) { /* ...INFs or NaNs in input can make ieee_check a NaN. This test for ieee_check self-equality works on all IEEE-compliant compilers/ machines, c.f. page 8 of "Lecture Notes on the Status of IEEE 754" by W. Kahan, May 31, 1996. Currently (July 2002) this paper may be found at http://HTTP.CS.Berkeley.EDU/~wkahan/ieee754status/IEEE754.PDF */ if (print_level > 0 || logging > 0) { hypre_printf("\n\nERROR detected by Hypre ... BEGIN\n"); hypre_printf("ERROR -- hypre_PCGSolve: INFs and/or NaNs detected in input.\n"); hypre_printf("User probably placed non-numerics in supplied b.\n"); hypre_printf("Returning error flag += 101. Program not terminated.\n"); hypre_printf("ERROR detected by Hypre ... END\n\n\n"); } hypre_error(HYPRE_ERROR_GENERIC); HYPRE_ANNOTATE_FUNC_END; return hypre_error_flag; } eps = r_tol * r_tol; /* note: this may be re-assigned below */ if ( bi_prod > 0.0 ) { if ( stop_crit && !rel_change && atolf <= 0 ) /* pure absolute tolerance */ { eps = eps / bi_prod; /* Note: this section is obsolete. Aside from backwards comatability concerns, we could delete the stop_crit parameter and related code, using tol & atolf instead. */ } else if ( atolf > 0 ) /* mixed relative and absolute tolerance */ { bi_prod += atolf; } else /* DEFAULT (stop_crit and atolf exist for backwards compatibilty and are not in the reference manual) */ { /* convergence criteria: <= max( a_tol^2, r_tol^2 * ) note: default for a_tol is 0.0, so relative residual criteria is used unless user specifies a_tol, or sets r_tol = 0.0, which means absolute tol only is checked */ eps = hypre_max(r_tol * r_tol, a_tol * a_tol / bi_prod); } } else /* bi_prod==0.0: the rhs vector b is zero */ { /* Set x equal to zero and return */ (*(pcg_functions->CopyVector))(b, x); if (logging > 0 || print_level > 0) { norms[0] = 0.0; rel_norms[i] = 0.0; } HYPRE_ANNOTATE_FUNC_END; return hypre_error_flag; /* In this case, for the original parcsr pcg, the code would take special action to force iterations even though the exact value was known. */ }; /* r = b - Ax */ (*(pcg_functions->CopyVector))(b, r); (*(pcg_functions->Matvec))(matvec_data, -1.0, A, x, 1.0, r); //hypre_ParVectorUpdateHost(r); /* p = C*r */ (*(pcg_functions->ClearVector))(p); precond(precond_data, A, r, p); /* gamma = = */ gamma = (*(pcg_functions->InnerProd))(r, p); /* Since it does not diminish performance, attempt to return an error flag and notify users when they supply bad input. */ if (gamma != 0.) { ieee_check = gamma / gamma; } /* INF -> NaN conversion */ if (ieee_check != ieee_check) { /* ...INFs or NaNs in input can make ieee_check a NaN. This test for ieee_check self-equality works on all IEEE-compliant compilers/ machines, c.f. page 8 of "Lecture Notes on the Status of IEEE 754" by W. Kahan, May 31, 1996. Currently (July 2002) this paper may be found at http://HTTP.CS.Berkeley.EDU/~wkahan/ieee754status/IEEE754.PDF */ if (print_level > 0 || logging > 0) { hypre_printf("\n\nERROR detected by Hypre ... BEGIN\n"); hypre_printf("ERROR -- hypre_PCGSolve: INFs and/or NaNs detected in input.\n"); hypre_printf("User probably placed non-numerics in supplied A or x_0.\n"); hypre_printf("Returning error flag += 101. Program not terminated.\n"); hypre_printf("ERROR detected by Hypre ... END\n\n\n"); } hypre_error(HYPRE_ERROR_GENERIC); HYPRE_ANNOTATE_FUNC_END; return hypre_error_flag; } /* Set initial residual norm */ if ( logging > 0 || print_level > 0 || cf_tol > 0.0 ) { if (two_norm) { i_prod_0 = (*(pcg_functions->InnerProd))(r, r); } else { i_prod_0 = gamma; } if ( logging > 0 || print_level > 0 ) { norms[0] = hypre_sqrt(i_prod_0); } } if ( print_level > 1 && my_id == 0 ) { hypre_printf("\n\n"); if (two_norm) { if ( stop_crit && !rel_change && atolf == 0 ) /* pure absolute tolerance */ { hypre_printf("Iters ||r||_2 conv.rate\n"); hypre_printf("----- ------------ ---------\n"); } else { hypre_printf("Iters ||r||_2 conv.rate ||r||_2/||b||_2\n"); hypre_printf("----- ------------ --------- ------------ \n"); } } else /* !two_norm */ { hypre_printf("Iters ||r||_C conv.rate ||r||_C/||b||_C\n"); hypre_printf("----- ------------ --------- ------------ \n"); } /* hypre_printf("% 5d %e\n", i, norms[i]); */ } while ((i + 1) <= max_iter) { /*-------------------------------------------------------------------- * the core CG calculations... *--------------------------------------------------------------------*/ i++; /* At user request, periodically recompute the residual from the formula r = b - A x (instead of using the recursive definition). Note that this is potentially expensive and can lead to degraded convergence (since it essentially a "restarted CG"). */ recompute_true_residual = recompute_residual_p && !(i % recompute_residual_p); /* s = A*p */ (*(pcg_functions->Matvec))(matvec_data, 1.0, A, p, 0.0, s); /* alpha = gamma / */ sdotp = (*(pcg_functions->InnerProd))(s, p); if ( sdotp == 0.0 ) { hypre_error_w_msg(HYPRE_ERROR_CONV, "Zero sdotp value in PCG"); if (i == 1) { i_prod = i_prod_0; } break; } alpha = gamma / sdotp; /* alpha should always be greater zero for spd A, spd precond. and nonzero p, r*/ /* alpha = / */ /* for alpha close to 0 x and r will not change much unless x and/or r are close to 0 */ if (alpha <= 0.0) { if (print_level > 1 && my_id == 0) { hypre_printf("alpha %e", alpha); } hypre_error_w_msg(HYPRE_ERROR_CONV, "Negative or zero alpha value in PCG"); if (skip_break < 3) { if (i == 1) { i_prod = i_prod_0; } break; } } else if (! (alpha >= HYPRE_REAL_TRUE_MIN)) { hypre_error_w_msg(HYPRE_ERROR_CONV, "alpha value less than TRUE_MIN in PCG"); if (print_level > 1 && my_id == 0) { hypre_printf("alpha %e", alpha); } if (skip_break < 2) { if (i == 1) { i_prod = i_prod_0; } break; } } else if (! (alpha >= HYPRE_REAL_MIN)) { hypre_error_w_msg(HYPRE_ERROR_CONV, "Subnormal alpha value in PCG"); if (print_level > 1 && my_id == 0) { hypre_printf("alpha %e", alpha); } if (skip_break < 1) { if (i == 1) { i_prod = i_prod_0; } break; } } gamma_old = gamma; /* x = x + alpha*p */ (*(pcg_functions->Axpy))(alpha, p, x); if (flex) { (*(pcg_functions->CopyVector))(r, r_old); /*save old residual */ } /* r = r - alpha*s */ if ( !recompute_true_residual ) { (*(pcg_functions->Axpy))(-alpha, s, r); } else { if (print_level > 1 && my_id == 0) { hypre_printf("Recomputing the residual...\n"); } (*(pcg_functions->CopyVector))(r, s); /*save old residual */ if (flex) { (*(pcg_functions->CopyVector))(r, r_old); /*save old residual */ } (*(pcg_functions->CopyVector))(b, r); (*(pcg_functions->Matvec))(matvec_data, -1.0, A, x, 1.0, r); if (rtol) { /* compute s = r_old-r_new */ (*(pcg_functions->Axpy))(-1.0, s, r); if (two_norm) /* residual-based stopping criteria: ||r_new-r_old|| < rtol ||b|| */ { HYPRE_Real drob2 = (*(pcg_functions->InnerProd))(s, s) / bi_prod; if ( drob2 < rtol * rtol ) { if (print_level > 1 && my_id == 0) { hypre_printf("\n\n||r_old-r_new||/||b||: %e\n", hypre_sqrt(drob2)); } break; } } else /* residual-based stopping criteria: ||r_new-r_old||_C < rtol ||b||_C */ { HYPRE_Real r2ob2; /* v = C*s = C*(r_old-r_new) */ (*(pcg_functions->ClearVector))(v); precond(precond_data, A, s, v); /* */ r2ob2 = (*(pcg_functions->InnerProd))(s, v) / bi_prod; if ( r2ob2 < rtol * rtol ) { if (print_level > 1 && my_id == 0) { hypre_printf("\n\n||r_old-r_new||_C/||b||_C: %e\n", hypre_sqrt(r2ob2)); } break; } } } } if (rtol && two_norm) { if (!recompute_true_residual) { /* use that r_new-r_old = alpha * s */ HYPRE_Real drob2 = alpha * alpha * (*(pcg_functions->InnerProd))(s, s) / bi_prod; if ( drob2 < rtol * rtol ) { if (print_level > 1 && my_id == 0) { hypre_printf("\n\n||r_old-r_new||/||b||: %e\n", hypre_sqrt(drob2)); } break; } } } /* s = C*r */ (*(pcg_functions->ClearVector))(s); precond(precond_data, A, r, s); /* gamma = */ gamma = (*(pcg_functions->InnerProd))(r, s); if (flex) { delta = gamma - (*(pcg_functions->InnerProd))(r_old, s); } /* residual-based stopping criteria: ||r_new-r_old||_C < rtol ||b||_C */ if (rtol && !two_norm) { if (!recompute_true_residual) { /* The following assumes that residuals are C-orthogonal: */ /* use that ||r_new-r_old||_C^2 = (r_new ,C r_new) + (r_old, C r_old) */ HYPRE_Real r2ob2 = (gamma + gamma_old) / bi_prod; if ( r2ob2 < rtol * rtol) { if (print_level > 1 && my_id == 0) { hypre_printf("\n\n||r_old-r_new||_C/||b||_C: %e\n", hypre_sqrt(r2ob2)); } break; } } } /* set i_prod for convergence test */ if (two_norm) { i_prod = (*(pcg_functions->InnerProd))(r, r); } else { i_prod = gamma; } /*-------------------------------------------------------------------- * optional output *--------------------------------------------------------------------*/ #if 0 if (two_norm) hypre_printf("Iter (%d): ||r||_2 = %e, ||r||_2/||b||_2 = %e\n", i, hypre_sqrt(i_prod), (bi_prod ? hypre_sqrt(i_prod / bi_prod) : 0)); else hypre_printf("Iter (%d): ||r||_C = %e, ||r||_C/||b||_C = %e\n", i, hypre_sqrt(i_prod), (bi_prod ? hypre_sqrt(i_prod / bi_prod) : 0)); #endif /* print norm info */ if ( logging > 0 || print_level > 0 ) { norms[i] = hypre_sqrt(i_prod); rel_norms[i] = bi_prod ? hypre_sqrt(i_prod / bi_prod) : 0; } if ( print_level > 1 && my_id == 0 ) { if (two_norm) { if ( stop_crit && !rel_change && atolf == 0 ) /* pure absolute tolerance */ { hypre_printf("% 5d %e %f\n", i, norms[i], norms[i] / norms[i - 1] ); } else { hypre_printf("% 5d %e %f %e\n", i, norms[i], norms[i] / norms[i - 1], rel_norms[i] ); } } else { hypre_printf("% 5d %e %f %e\n", i, norms[i], norms[i] / norms[i - 1], rel_norms[i] ); } } /*-------------------------------------------------------------------- * check for convergence *--------------------------------------------------------------------*/ if (i_prod / bi_prod < eps) /* the basic convergence test */ { tentatively_converged = 1; } if ( tentatively_converged && recompute_residual ) /* At user request, don't trust the convergence test until we've recomputed the residual from scratch. This is expensive in the usual case where the norm is the energy norm. This calculation is coded on the assumption that r's accuracy is only a concern for problems where CG takes many iterations. */ { /* r = b - Ax */ (*(pcg_functions->CopyVector))(b, r); (*(pcg_functions->Matvec))(matvec_data, -1.0, A, x, 1.0, r); /* set i_prod for convergence test */ if (two_norm) { i_prod = (*(pcg_functions->InnerProd))(r, r); } else { /* s = C*r */ (*(pcg_functions->ClearVector))(s); precond(precond_data, A, r, s); /* iprod = gamma = */ i_prod = (*(pcg_functions->InnerProd))(r, s); gamma = i_prod; } if (i_prod / bi_prod >= eps) { tentatively_converged = 0; } } if ( tentatively_converged && rel_change && (i_prod > guard_zero_residual )) /* At user request, don't treat this as converged unless x didn't change much in the last iteration. */ { pi_prod = (*(pcg_functions->InnerProd))(p, p); xi_prod = (*(pcg_functions->InnerProd))(x, x); ratio = alpha * alpha * pi_prod / xi_prod; if (ratio >= eps) { tentatively_converged = 0; } } if ( tentatively_converged ) /* we've passed all the convergence tests, it's for real */ { (pcg_data -> converged) = 1; break; } /* gamma should generally be greater than 0 for spd prec and nonzero r */ if (gamma <= 0.0) { if (print_level > 1 && my_id == 0) { hypre_printf("gamma %e", gamma); } hypre_error_w_msg(HYPRE_ERROR_CONV, "Negative or zero gamma value in PCG"); if (skip_break < 3) { if (i == 1) { i_prod = i_prod_0; } break; } } else if (! (gamma >= HYPRE_REAL_TRUE_MIN)) { hypre_error_w_msg(HYPRE_ERROR_CONV, "gamma value less than TRUE_MIN in PCG"); if (print_level > 1 && my_id == 0) { hypre_printf("gamma %e", gamma); } if (skip_break < 2) { if (i == 1) { i_prod = i_prod_0; } break; } } else if (! (gamma >= HYPRE_REAL_MIN)) { hypre_error_w_msg(HYPRE_ERROR_CONV, "Subnormal gamma value in PCG"); if (print_level > 1 && my_id == 0) { hypre_printf("gamma %e", gamma); } if (skip_break < 1) { if (i == 1) { i_prod = i_prod_0; } break; } } /* ... gamma should be >=0. IEEE subnormal numbers are < 2**(-1022)=2.2e-308 (and >= 2**(-1074)=4.9e-324). So a gamma this small means we're getting dangerously close to subnormal or zero numbers (usually if gamma is small, so will be other variables). Thus further calculations risk a crash. Such small gamma generally means no hope of progress anyway. */ /*-------------------------------------------------------------------- * Optional test to see if adequate progress is being made. * The average convergence factor is recorded and compared * against the tolerance 'cf_tol'. The weighting factor is * intended to pay more attention to the test when an accurate * estimate for average convergence factor is available. *--------------------------------------------------------------------*/ if (cf_tol > 0.0) { cf_ave_0 = cf_ave_1; /* i_prod_0 is zero, or (almost) subnormal, yet i_prod wasn't small enough to pass the convergence test. Therefore initial guess was good, and we're just calculating garbage - time to bail out before the next step, which will be a divide by zero (or close to it). */ if (i_prod_0 <= 0.0) { if (print_level > 1 && my_id == 0) { hypre_printf("i_prod_0 %e", i_prod_0); } hypre_error_w_msg(HYPRE_ERROR_CONV, "Negative or zero i_prod_0 value in PCG"); if (skip_break < 3) { break; } } else if (! (i_prod_0 >= HYPRE_REAL_TRUE_MIN)) { hypre_error_w_msg(HYPRE_ERROR_CONV, "i_prod_0 value less than TRUE_MIN in PCG"); if (print_level > 1 && my_id == 0) { hypre_printf("i_prod_0 %e", i_prod_0); } if (skip_break < 2) { break; } } else if (! (i_prod_0 >= HYPRE_REAL_MIN)) { hypre_error_w_msg(HYPRE_ERROR_CONV, "Subnormal i_prod_0 value in PCG"); if (print_level > 1 && my_id == 0) { hypre_printf("i_prod_0 %e", i_prod_0); } if (skip_break < 1) { break; } } cf_ave_1 = hypre_pow( i_prod / i_prod_0, 1.0 / (2.0 * i) ); weight = hypre_abs(cf_ave_1 - cf_ave_0); weight = weight / hypre_max(cf_ave_1, cf_ave_0); weight = 1.0 - weight; #if 0 hypre_printf("I = %d: cf_new = %e, cf_old = %e, weight = %e\n", i, cf_ave_1, cf_ave_0, weight ); #endif if (weight * cf_ave_1 > cf_tol) { break; } } /*-------------------------------------------------------------------- * back to the core CG calculations *--------------------------------------------------------------------*/ /* beta = gamma / gamma_old */ if (!flex) { beta = gamma / gamma_old; } else { beta = delta / gamma_old; } /* p = s + beta p */ if ( !recompute_true_residual ) { (*(pcg_functions->ScaleVector))(beta, p); (*(pcg_functions->Axpy))(1.0, s, p); } else { (*(pcg_functions->CopyVector))(s, p); } } /*-------------------------------------------------------------------- * Finish up with some outputs. *--------------------------------------------------------------------*/ if ( print_level > 1 && my_id == 0 ) { hypre_printf("\n\n"); } if (i >= max_iter && (i_prod / bi_prod) >= eps && eps > 0 && hybrid != -1) { char msg[1024]; hypre_sprintf(msg, "Reached max iterations %d in PCG before convergence", max_iter); hypre_error_w_msg(HYPRE_ERROR_CONV, msg); } (pcg_data -> num_iterations) = i; if (bi_prod > 0.0) { (pcg_data -> rel_residual_norm) = hypre_sqrt(i_prod / bi_prod); } else /* actually, we'll never get here... */ { (pcg_data -> rel_residual_norm) = 0.0; } HYPRE_ANNOTATE_FUNC_END; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_PCGSetTol, hypre_PCGGetTol *--------------------------------------------------------------------------*/ HYPRE_Int hypre_PCGSetTol( void *pcg_vdata, HYPRE_Real tol ) { hypre_PCGData *pcg_data = (hypre_PCGData *)pcg_vdata; (pcg_data -> tol) = tol; return hypre_error_flag; } HYPRE_Int hypre_PCGGetTol( void *pcg_vdata, HYPRE_Real * tol ) { hypre_PCGData *pcg_data = (hypre_PCGData *)pcg_vdata; *tol = (pcg_data -> tol); return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_PCGSetAbsoluteTol, hypre_PCGGetAbsoluteTol *--------------------------------------------------------------------------*/ HYPRE_Int hypre_PCGSetAbsoluteTol( void *pcg_vdata, HYPRE_Real a_tol ) { hypre_PCGData *pcg_data = (hypre_PCGData *)pcg_vdata; (pcg_data -> a_tol) = a_tol; return hypre_error_flag; } HYPRE_Int hypre_PCGGetAbsoluteTol( void *pcg_vdata, HYPRE_Real * a_tol ) { hypre_PCGData *pcg_data = (hypre_PCGData *)pcg_vdata; *a_tol = (pcg_data -> a_tol); return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_PCGSetAbsoluteTolFactor, hypre_PCGGetAbsoluteTolFactor *--------------------------------------------------------------------------*/ HYPRE_Int hypre_PCGSetAbsoluteTolFactor( void *pcg_vdata, HYPRE_Real atolf ) { hypre_PCGData *pcg_data = (hypre_PCGData *)pcg_vdata; (pcg_data -> atolf) = atolf; return hypre_error_flag; } HYPRE_Int hypre_PCGGetAbsoluteTolFactor( void *pcg_vdata, HYPRE_Real * atolf ) { hypre_PCGData *pcg_data = (hypre_PCGData *)pcg_vdata; *atolf = (pcg_data -> atolf); return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_PCGSetResidualTol, hypre_PCGGetResidualTol *--------------------------------------------------------------------------*/ HYPRE_Int hypre_PCGSetResidualTol( void *pcg_vdata, HYPRE_Real rtol ) { hypre_PCGData *pcg_data = (hypre_PCGData *)pcg_vdata; (pcg_data -> rtol) = rtol; return hypre_error_flag; } HYPRE_Int hypre_PCGGetResidualTol( void *pcg_vdata, HYPRE_Real * rtol ) { hypre_PCGData *pcg_data = (hypre_PCGData *)pcg_vdata; *rtol = (pcg_data -> rtol); return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_PCGSetConvergenceFactorTol, hypre_PCGGetConvergenceFactorTol *--------------------------------------------------------------------------*/ HYPRE_Int hypre_PCGSetConvergenceFactorTol( void *pcg_vdata, HYPRE_Real cf_tol ) { hypre_PCGData *pcg_data = (hypre_PCGData *)pcg_vdata; (pcg_data -> cf_tol) = cf_tol; return hypre_error_flag; } HYPRE_Int hypre_PCGGetConvergenceFactorTol( void *pcg_vdata, HYPRE_Real * cf_tol ) { hypre_PCGData *pcg_data = (hypre_PCGData *)pcg_vdata; *cf_tol = (pcg_data -> cf_tol); return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_PCGSetMaxIter, hypre_PCGGetMaxIter *--------------------------------------------------------------------------*/ HYPRE_Int hypre_PCGSetMaxIter( void *pcg_vdata, HYPRE_Int max_iter ) { hypre_PCGData *pcg_data = (hypre_PCGData *)pcg_vdata; (pcg_data -> max_iter) = max_iter; return hypre_error_flag; } HYPRE_Int hypre_PCGGetMaxIter( void *pcg_vdata, HYPRE_Int * max_iter ) { hypre_PCGData *pcg_data = (hypre_PCGData *)pcg_vdata; *max_iter = (pcg_data -> max_iter); return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_PCGSetTwoNorm, hypre_PCGGetTwoNorm *--------------------------------------------------------------------------*/ HYPRE_Int hypre_PCGSetTwoNorm( void *pcg_vdata, HYPRE_Int two_norm ) { hypre_PCGData *pcg_data = (hypre_PCGData *)pcg_vdata; (pcg_data -> two_norm) = two_norm; return hypre_error_flag; } HYPRE_Int hypre_PCGGetTwoNorm( void *pcg_vdata, HYPRE_Int * two_norm ) { hypre_PCGData *pcg_data = (hypre_PCGData *)pcg_vdata; *two_norm = (pcg_data -> two_norm); return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_PCGSetRelChange, hypre_PCGGetRelChange *--------------------------------------------------------------------------*/ HYPRE_Int hypre_PCGSetRelChange( void *pcg_vdata, HYPRE_Int rel_change ) { hypre_PCGData *pcg_data = (hypre_PCGData *)pcg_vdata; (pcg_data -> rel_change) = rel_change; return hypre_error_flag; } HYPRE_Int hypre_PCGGetRelChange( void *pcg_vdata, HYPRE_Int * rel_change ) { hypre_PCGData *pcg_data = (hypre_PCGData *)pcg_vdata; *rel_change = (pcg_data -> rel_change); return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_PCGSetRecomputeResidual, hypre_PCGGetRecomputeResidual *--------------------------------------------------------------------------*/ HYPRE_Int hypre_PCGSetRecomputeResidual( void *pcg_vdata, HYPRE_Int recompute_residual ) { hypre_PCGData *pcg_data = (hypre_PCGData *)pcg_vdata; (pcg_data -> recompute_residual) = recompute_residual; return hypre_error_flag; } HYPRE_Int hypre_PCGGetRecomputeResidual( void *pcg_vdata, HYPRE_Int * recompute_residual ) { hypre_PCGData *pcg_data = (hypre_PCGData *)pcg_vdata; *recompute_residual = (pcg_data -> recompute_residual); return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_PCGSetRecomputeResidualP, hypre_PCGGetRecomputeResidualP *--------------------------------------------------------------------------*/ HYPRE_Int hypre_PCGSetRecomputeResidualP( void *pcg_vdata, HYPRE_Int recompute_residual_p ) { hypre_PCGData *pcg_data = (hypre_PCGData *)pcg_vdata; (pcg_data -> recompute_residual_p) = recompute_residual_p; return hypre_error_flag; } HYPRE_Int hypre_PCGGetRecomputeResidualP( void *pcg_vdata, HYPRE_Int * recompute_residual_p ) { hypre_PCGData *pcg_data = (hypre_PCGData *)pcg_vdata; *recompute_residual_p = (pcg_data -> recompute_residual_p); return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_PCGSetStopCrit, hypre_PCGGetStopCrit *--------------------------------------------------------------------------*/ HYPRE_Int hypre_PCGSetStopCrit( void *pcg_vdata, HYPRE_Int stop_crit ) { hypre_PCGData *pcg_data = (hypre_PCGData *)pcg_vdata; (pcg_data -> stop_crit) = stop_crit; return hypre_error_flag; } HYPRE_Int hypre_PCGGetStopCrit( void *pcg_vdata, HYPRE_Int * stop_crit ) { hypre_PCGData *pcg_data = (hypre_PCGData *)pcg_vdata; *stop_crit = (pcg_data -> stop_crit); return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_PCGSetSkipBreak, hypre_PCGGetSkipBreak *--------------------------------------------------------------------------*/ HYPRE_Int hypre_PCGSetSkipBreak( void *pcg_vdata, HYPRE_Int skip_break ) { hypre_PCGData *pcg_data = (hypre_PCGData *)pcg_vdata; (pcg_data -> skip_break) = skip_break; return hypre_error_flag; } HYPRE_Int hypre_PCGGetSkipBreak( void *pcg_vdata, HYPRE_Int * skip_break ) { hypre_PCGData *pcg_data = (hypre_PCGData *)pcg_vdata; *skip_break = (pcg_data -> skip_break); return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_PCGSetFlex, hypre_PCGGetFlex *--------------------------------------------------------------------------*/ HYPRE_Int hypre_PCGSetFlex( void *pcg_vdata, HYPRE_Int flex ) { hypre_PCGData *pcg_data = (hypre_PCGData *)pcg_vdata; (pcg_data -> flex) = flex; return hypre_error_flag; } HYPRE_Int hypre_PCGGetFlex( void *pcg_vdata, HYPRE_Int * flex ) { hypre_PCGData *pcg_data = (hypre_PCGData *)pcg_vdata; *flex = (pcg_data -> flex); return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_PCGGetPrecond *--------------------------------------------------------------------------*/ HYPRE_Int hypre_PCGGetPrecond( void *pcg_vdata, HYPRE_Solver *precond_data_ptr ) { hypre_PCGData *pcg_data = (hypre_PCGData *)pcg_vdata; *precond_data_ptr = (HYPRE_Solver)(pcg_data -> precond_data); return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_PCGSetPrecond *--------------------------------------------------------------------------*/ HYPRE_Int hypre_PCGSetPrecond( void *pcg_vdata, HYPRE_Int (*precond)(void*, void*, void*, void*), HYPRE_Int (*precond_setup)(void*, void*, void*, void*), void *precond_data ) { hypre_PCGData *pcg_data = (hypre_PCGData *)pcg_vdata; hypre_PCGFunctions *pcg_functions = pcg_data->functions; (pcg_functions -> precond) = precond; (pcg_functions -> precond_setup) = precond_setup; (pcg_data -> precond_data) = precond_data; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_PCGSetPreconditioner *--------------------------------------------------------------------------*/ HYPRE_Int hypre_PCGSetPreconditioner(void *pcg_vdata, void *precond_data ) { hypre_PCGData *pcg_data = (hypre_PCGData*) pcg_vdata; hypre_Solver *base = (hypre_Solver*) precond_data; hypre_PCGFunctions *pcg_functions = pcg_data->functions; (pcg_data -> precond_data) = precond_data; (pcg_functions -> precond) = (HYPRE_Int (*)(void*, void*, void*, void*)) hypre_SolverSolve(base); (pcg_functions -> precond_setup) = (HYPRE_Int (*)(void*, void*, void*, void*)) hypre_SolverSetup(base); return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_PCGSetPrintLevel, hypre_PCGGetPrintLevel *--------------------------------------------------------------------------*/ HYPRE_Int hypre_PCGSetPrintLevel( void *pcg_vdata, HYPRE_Int level) { hypre_PCGData *pcg_data = (hypre_PCGData *)pcg_vdata; (pcg_data -> print_level) = level; return hypre_error_flag; } HYPRE_Int hypre_PCGGetPrintLevel( void *pcg_vdata, HYPRE_Int * level) { hypre_PCGData *pcg_data = (hypre_PCGData *)pcg_vdata; *level = (pcg_data -> print_level); return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_PCGSetLogging, hypre_PCGGetLogging *--------------------------------------------------------------------------*/ HYPRE_Int hypre_PCGSetLogging( void *pcg_vdata, HYPRE_Int level) { hypre_PCGData *pcg_data = (hypre_PCGData *)pcg_vdata; (pcg_data -> logging) = level; return hypre_error_flag; } HYPRE_Int hypre_PCGGetLogging( void *pcg_vdata, HYPRE_Int * level) { hypre_PCGData *pcg_data = (hypre_PCGData *)pcg_vdata; *level = (pcg_data -> logging); return hypre_error_flag; } HYPRE_Int hypre_PCGSetHybrid( void *pcg_vdata, HYPRE_Int level) { hypre_PCGData *pcg_data = (hypre_PCGData *)pcg_vdata; (pcg_data -> hybrid) = level; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_PCGGetNumIterations *--------------------------------------------------------------------------*/ HYPRE_Int hypre_PCGGetNumIterations( void *pcg_vdata, HYPRE_Int *num_iterations ) { hypre_PCGData *pcg_data = (hypre_PCGData *)pcg_vdata; *num_iterations = (pcg_data -> num_iterations); return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_PCGGetConverged *--------------------------------------------------------------------------*/ HYPRE_Int hypre_PCGGetConverged( void *pcg_vdata, HYPRE_Int *converged) { hypre_PCGData *pcg_data = (hypre_PCGData *)pcg_vdata; *converged = (pcg_data -> converged); return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_PCGPrintLogging *--------------------------------------------------------------------------*/ HYPRE_Int hypre_PCGPrintLogging( void *pcg_vdata, HYPRE_Int myid) { hypre_PCGData *pcg_data = (hypre_PCGData *)pcg_vdata; HYPRE_Int num_iterations = (pcg_data -> num_iterations); HYPRE_Int print_level = (pcg_data -> print_level); HYPRE_Real *norms = (pcg_data -> norms); HYPRE_Real *rel_norms = (pcg_data -> rel_norms); HYPRE_Int i; if (myid == 0) { if (print_level > 0) { for (i = 0; i < num_iterations; i++) { hypre_printf("Residual norm[%d] = %e ", i, norms[i]); hypre_printf("Relative residual norm[%d] = %e\n", i, rel_norms[i]); } } } return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_PCGGetFinalRelativeResidualNorm *--------------------------------------------------------------------------*/ HYPRE_Int hypre_PCGGetFinalRelativeResidualNorm( void *pcg_vdata, HYPRE_Real *relative_residual_norm ) { hypre_PCGData *pcg_data = (hypre_PCGData *)pcg_vdata; HYPRE_Real rel_residual_norm = (pcg_data -> rel_residual_norm); *relative_residual_norm = rel_residual_norm; return hypre_error_flag; } hypre-2.33.0/src/krylov/pcg.h000066400000000000000000000157561477326011500160110ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * Preconditioned conjugate gradient (Omin) headers * *****************************************************************************/ #ifndef hypre_KRYLOV_PCG_HEADER #define hypre_KRYLOV_PCG_HEADER /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ /** * @name Generic PCG Interface * * A general description of the interface goes here... * * @memo A generic PCG linear solver interface * @version 0.1 * @author Jeffrey F. Painter **/ /*@{*/ /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ /*-------------------------------------------------------------------------- * hypre_PCGData and hypre_PCGFunctions *--------------------------------------------------------------------------*/ /** * @name PCG structs * * Description... **/ /*@{*/ /** * The {\tt hypre\_PCGSFunctions} object ... **/ typedef struct { void * (*CAlloc) ( size_t count, size_t elt_size ); HYPRE_Int (*Free) ( void *ptr ); HYPRE_Int (*CommInfo) ( void *A, HYPRE_Int *my_id, HYPRE_Int *num_procs ); void * (*CreateVector) ( void *vector ); HYPRE_Int (*DestroyVector) ( void *vector ); void * (*MatvecCreate) ( void *A, void *x ); HYPRE_Int (*Matvec) ( void *matvec_data, HYPRE_Complex alpha, void *A, void *x, HYPRE_Complex beta, void *y ); HYPRE_Int (*MatvecDestroy) ( void *matvec_data ); HYPRE_Real (*InnerProd) ( void *x, void *y ); HYPRE_Int (*CopyVector) ( void *x, void *y ); HYPRE_Int (*ClearVector) ( void *x ); HYPRE_Int (*ScaleVector) ( HYPRE_Complex alpha, void *x ); HYPRE_Int (*Axpy) ( HYPRE_Complex alpha, void *x, void *y ); HYPRE_Int (*precond)(); HYPRE_Int (*precond_setup)(); } hypre_PCGFunctions; /** * The {\tt hypre\_PCGData} object ... **/ /* Summary of Parameters to Control Stopping Test: - Standard (default) error tolerance: |delta-residual|/|right-hand-side|). - two_norm!=0 means: the norm is the L2 norm, |r|=sqrt() - rel_change!=0 means: if pass the other stopping criteria, also check the relative change in the solution x. Pass iff this relative change is small. - tol = relative error tolerance, as above -a_tol = absolute convergence tolerance (default is 0.0) If one desires the convergence test to check the absolute convergence tolerance *only*, then set the relative convergence tolerance to 0.0. (The default convergence test is <= max(relative_tolerance^2 * , absolute_tolerance^2) - cf_tol = convergence factor tolerance; if >0 used for special test for slow convergence - stop_crit!=0 means (TO BE PHASED OUT): pure absolute error tolerance rather than a pure relative error tolerance on the residual. Never applies if rel_change!=0 or atolf!=0. - atolf = absolute error tolerance factor to be used _together_ with the relative error tolerance, |delta-residual| / ( atolf + |right-hand-side| ) < tol (To BE PHASED OUT) - recompute_residual means: when the iteration seems to be converged, recompute the residual from scratch (r=b-Ax) and use this new residual to repeat the convergence test. This can be expensive, use this only if you have seen a problem with the regular residual computation. - recompute_residual_p means: recompute the residual from scratch (r=b-Ax) every "recompute_residual_p" iterations. This can be expensive and degrade the convergence. Use it only if you have seen a problem with the regular residual computation. - skip_break means that cg will not stop for very small alpha and gamma. default: 0 */ typedef struct { HYPRE_Real tol; HYPRE_Real atolf; HYPRE_Real cf_tol; HYPRE_Real a_tol; HYPRE_Real rtol; HYPRE_Int max_iter; HYPRE_Int two_norm; HYPRE_Int rel_change; HYPRE_Int recompute_residual; HYPRE_Int recompute_residual_p; HYPRE_Int stop_crit; HYPRE_Int converged; HYPRE_Int hybrid; HYPRE_Int skip_break; HYPRE_Int flex; void *A; void *p; void *s; void *r; /* ...contains the residual. This is currently kept permanently. If that is ever changed, it still must be kept if logging>1 */ void *r_old; /* old residual needed for flexible CG, PR method */ void *v; /* work vector only needed if recompute_residual_p uis used */ HYPRE_Int owns_matvec_data; /* normally 1; if 0, don't delete it */ void *matvec_data; void *precond_data; hypre_PCGFunctions * functions; /* log info (always logged) */ HYPRE_Int num_iterations; HYPRE_Real rel_residual_norm; HYPRE_Int print_level; /* printing when print_level>0 */ HYPRE_Int logging; /* extra computations for logging when logging>0 */ HYPRE_Real *norms; HYPRE_Real *rel_norms; } hypre_PCGData; #define hypre_PCGDataOwnsMatvecData(pcgdata) ((pcgdata) -> owns_matvec_data) #ifdef __cplusplus extern "C" { #endif /** * @name generic PCG Solver * * Description... **/ /*@{*/ /** * Description... * * @param param [IN] ... **/ hypre_PCGFunctions * hypre_PCGFunctionsCreate( void * (*CAlloc) ( size_t count, size_t elt_size ), HYPRE_Int (*Free) ( void *ptr ), HYPRE_Int (*CommInfo) ( void *A, HYPRE_Int *my_id, HYPRE_Int *num_procs ), void * (*CreateVector) ( void *vector ), HYPRE_Int (*DestroyVector) ( void *vector ), void * (*MatvecCreate) ( void *A, void *x ), HYPRE_Int (*Matvec) ( void *matvec_data, HYPRE_Complex alpha, void *A, void *x, HYPRE_Complex beta, void *y ), HYPRE_Int (*MatvecDestroy) ( void *matvec_data ), HYPRE_Real (*InnerProd) ( void *x, void *y ), HYPRE_Int (*CopyVector) ( void *x, void *y ), HYPRE_Int (*ClearVector) ( void *x ), HYPRE_Int (*ScaleVector) ( HYPRE_Complex alpha, void *x ), HYPRE_Int (*Axpy) ( HYPRE_Complex alpha, void *x, void *y ), HYPRE_Int (*PrecondSetup) ( void *vdata, void *A, void *b, void *x ), HYPRE_Int (*Precond) ( void *vdata, void *A, void *b, void *x ) ); /** * Description... * * @param param [IN] ... **/ void * hypre_PCGCreate( hypre_PCGFunctions *pcg_functions ); #ifdef __cplusplus } #endif #endif hypre-2.33.0/src/lapack/000077500000000000000000000000001477326011500147565ustar00rootroot00000000000000hypre-2.33.0/src/lapack/CMakeLists.txt000066400000000000000000000025751477326011500175270ustar00rootroot00000000000000# Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) set(HDRS _hypre_lapack.h ) set(SRCS dbdsqr.c dgebd2.c dgebrd.c dgelq2.c dgelqf.c dgels.c dgeqr2.c dgeqrf.c dgesvd.c dgetrf.c dgetri.c dgetrs.c dgetf2.c dlabad.c dlabrd.c dlacpy.c dlae2.c dlaev2.c dlamch.c dlange.c dlanst.c dlansy.c dlapy2.c dlarfb.c dlarf.c dlarfg.c dlarft.c dlartg.c dlas2.c dlascl.c dlaset.c dlasq1.c dlasq2.c dlasq3.c dlasq4.c dlasq5.c dlasq6.c dlasr.c dlasrt.c dlassq.c dlaswp.c dlasv2.c dlatrd.c dorg2l.c dorg2r.c dorgbr.c dorgl2.c dorglq.c dorgql.c dorgqr.c dorgtr.c dorm2r.c dormbr.c dorml2.c dormlq.c dormqr.c dpotf2.c dpotrf.c dpotrs.c dsteqr.c dsterf.c dsyev.c dsygs2.c dsygst.c dsygv.c dsytd2.c dsytrd.c dtrti2.c dtrtri.c ieeeck.c ilaenv.c lsame.c xerbla.c ) # Turn optimization off for this file if (MSVC) set_source_files_properties (dlamch.c PROPERTIES COMPILE_FLAGS /Od) else () set_source_files_properties (dlamch.c PROPERTIES COMPILE_FLAGS -O0) endif () target_sources(${PROJECT_NAME} PRIVATE ${SRCS} ${HDRS} ) convert_filenames_to_full_paths(HDRS) set(HYPRE_HEADERS ${HYPRE_HEADERS} ${HDRS} PARENT_SCOPE) hypre-2.33.0/src/lapack/COPYING000066400000000000000000000031071477326011500160120ustar00rootroot00000000000000Copyright (c) 1992-2008 The University of Tennessee. All rights reserved. $COPYRIGHT$ Additional copyrights may follow $HEADER$ Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer listed in this license in the documentation and/or other materials provided with the distribution. - Neither the name of the copyright holders nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "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 THE COPYRIGHT OWNER OR 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. hypre-2.33.0/src/lapack/Makefile000066400000000000000000000033551477326011500164240ustar00rootroot00000000000000# Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) ### the inclusion of these routines based on the configure options. include ../config/Makefile.config C_COMPILE_FLAGS = ${INCLUDES} -I.. -I../blas -I../utilities LAPACK_HEADERS = f2c.h hypre_lapack.h LAPACK_FILES = \ dbdsqr.c\ dgebd2.c\ dgebrd.c\ dgelq2.c\ dgelqf.c\ dgels.c\ dgeqr2.c\ dgeqrf.c\ dgesvd.c\ dgetrf.c\ dgetri.c\ dgetrs.c\ dgetf2.c\ dlabad.c\ dlabrd.c\ dlacpy.c\ dlae2.c\ dlaev2.c\ dlange.c\ dlanst.c\ dlansy.c\ dlapy2.c\ dlarfb.c\ dlarf.c\ dlarfg.c\ dlarft.c\ dlartg.c\ dlas2.c\ dlascl.c\ dlaset.c\ dlasq1.c\ dlasq2.c\ dlasq3.c\ dlasq4.c\ dlasq5.c\ dlasq6.c\ dlasr.c\ dlasrt.c\ dlassq.c\ dlaswp.c\ dlasv2.c\ dlatrd.c\ dorg2l.c\ dorg2r.c\ dorgbr.c\ dorgl2.c\ dorglq.c\ dorgql.c\ dorgqr.c\ dorgtr.c\ dorm2r.c\ dormbr.c\ dorml2.c\ dormlq.c\ dormqr.c\ dpotf2.c\ dpotrf.c\ dpotrs.c\ dsteqr.c\ dsterf.c\ dsyev.c\ dsygs2.c\ dsygst.c\ dsygv.c\ dsytd2.c\ dsytrd.c\ dtrtri.c\ dtrti2.c\ ieeeck.c\ ilaenv.c\ lsame.c\ xerbla.c OBJS = ${LAPACK_FILES:.c=.o} ################################################################# # Targets ################################################################# all: ${OBJS} dlamch.o install: all cp -fR $(srcdir)/_hypre_lapack.h $(HYPRE_INC_INSTALL) clean: rm -rf *.o distclean: clean ################################################################# # Rules ################################################################# # compile without optimization dlamch.o : dlamch.c ${LAPACK_HEADERS} ${CC} ${CFLAGS} -c dlamch.c ${OBJS}: ${LAPACK_HEADERS} hypre-2.33.0/src/lapack/README000066400000000000000000000004501477326011500156350ustar00rootroot00000000000000# Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) HYPRE LAPACK README file - See blas/README file for instructions on how to add LAPACK routines. hypre-2.33.0/src/lapack/_hypre_lapack.h000066400000000000000000000264141477326011500177370ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * Header file for HYPRE LAPACK * *****************************************************************************/ #ifndef HYPRE_LAPACK_H #define HYPRE_LAPACK_H #include "_hypre_utilities.h" #include "fortran.h" #ifdef __cplusplus extern "C" { #endif /*-------------------------------------------------------------------------- * Change all 'hypre_' names based on using HYPRE or external library *--------------------------------------------------------------------------*/ #ifndef HYPRE_USING_HYPRE_LAPACK #define hypre_dbdsqr hypre_F90_NAME_LAPACK(dbdsqr,DBDSQR) #define hypre_dgebd2 hypre_F90_NAME_LAPACK(dgebd2,DGEBD2) #define hypre_dgebrd hypre_F90_NAME_LAPACK(dgebrd,DGEBRD) #define hypre_dgelq2 hypre_F90_NAME_LAPACK(dgelq2,DGELQ2) #define hypre_dgelqf hypre_F90_NAME_LAPACK(dgelqf,DGELQF) #define hypre_dgels hypre_F90_NAME_LAPACK(dgels ,DGELS ) #define hypre_dgeqr2 hypre_F90_NAME_LAPACK(dgeqr2,DGEQR2) #define hypre_dgeqrf hypre_F90_NAME_LAPACK(dgeqrf,DGEQRF) #define hypre_dgesvd hypre_F90_NAME_LAPACK(dgesvd,DGESVD) #define hypre_dgetf2 hypre_F90_NAME_LAPACK(dgetf2,DGETF2) #define hypre_dgetrf hypre_F90_NAME_LAPACK(dgetrf,DGETRF) #define hypre_dgetri hypre_F90_NAME_LAPACK(dgetri,DGETRI) #define hypre_dgetrs hypre_F90_NAME_LAPACK(dgetrs,DGETRS) #define hypre_dlasq1 hypre_F90_NAME_LAPACK(dlasq1,DLASQ1) #define hypre_dlasq2 hypre_F90_NAME_LAPACK(dlasq2,DLASQ2) #define hypre_dlasrt hypre_F90_NAME_LAPACK(dlasrt,DLASRT) #define hypre_dorg2l hypre_F90_NAME_LAPACK(dorg2l,DORG2L) #define hypre_dorg2r hypre_F90_NAME_LAPACK(dorg2r,DORG2R) #define hypre_dorgbr hypre_F90_NAME_LAPACK(dorgbr,DORGBR) #define hypre_dorgl2 hypre_F90_NAME_LAPACK(dorgl2,DORGL2) #define hypre_dorglq hypre_F90_NAME_LAPACK(dorglq,DORGLQ) #define hypre_dorgql hypre_F90_NAME_LAPACK(dorgql,DORGQL) #define hypre_dorgqr hypre_F90_NAME_LAPACK(dorgqr,DORGQR) #define hypre_dorgtr hypre_F90_NAME_LAPACK(dorgtr,DORGTR) #define hypre_dorm2r hypre_F90_NAME_LAPACK(dorm2r,DORM2R) #define hypre_dormbr hypre_F90_NAME_LAPACK(dormbr,DORMBR) #define hypre_dorml2 hypre_F90_NAME_LAPACK(dorml2,DORML2) #define hypre_dormlq hypre_F90_NAME_LAPACK(dormlq,DORMLQ) #define hypre_dormqr hypre_F90_NAME_LAPACK(dormqr,DORMQR) #define hypre_dpotf2 hypre_F90_NAME_LAPACK(dpotf2,DPOTF2) #define hypre_dpotrf hypre_F90_NAME_LAPACK(dpotrf,DPOTRF) #define hypre_dpotrs hypre_F90_NAME_LAPACK(dpotrs,DPOTRS) #define hypre_dsteqr hypre_F90_NAME_LAPACK(dsteqr,DSTEQR) #define hypre_dsterf hypre_F90_NAME_LAPACK(dsterf,DSTERF) #define hypre_dsyev hypre_F90_NAME_LAPACK(dsyev ,DSYEV ) #define hypre_dsygs2 hypre_F90_NAME_LAPACK(dsygs2,DSYGS2) #define hypre_dsygst hypre_F90_NAME_LAPACK(dsygst,DSYGST) #define hypre_dsygv hypre_F90_NAME_LAPACK(dsygv ,DSYGV ) #define hypre_dsytd2 hypre_F90_NAME_LAPACK(dsytd2,DSYTD2) #define hypre_dsytrd hypre_F90_NAME_LAPACK(dsytrd,DSYTRD) #define hypre_dtrti2 hypre_F90_NAME_LAPACK(dtrtri,DTRTI2) #define hypre_dtrtri hypre_F90_NAME_LAPACK(dtrtri,DTRTRI) #endif /*-------------------------------------------------------------------------- * Prototypes *--------------------------------------------------------------------------*/ /* dbdsqr.c */ HYPRE_Int hypre_dbdsqr (const char *uplo , HYPRE_Int *n , HYPRE_Int *ncvt , HYPRE_Int *nru , HYPRE_Int *ncc , HYPRE_Real *d__ , HYPRE_Real *e , HYPRE_Real *vt , HYPRE_Int *ldvt , HYPRE_Real *u , HYPRE_Int *ldu , HYPRE_Real *c__ , HYPRE_Int *ldc , HYPRE_Real *work , HYPRE_Int *info ); /* dgebd2.c */ HYPRE_Int hypre_dgebd2 ( HYPRE_Int *m , HYPRE_Int *n , HYPRE_Real *a , HYPRE_Int *lda , HYPRE_Real *d__ , HYPRE_Real *e , HYPRE_Real *tauq , HYPRE_Real *taup , HYPRE_Real *work , HYPRE_Int *info ); /* dgebrd.c */ HYPRE_Int hypre_dgebrd ( HYPRE_Int *m , HYPRE_Int *n , HYPRE_Real *a , HYPRE_Int *lda , HYPRE_Real *d__ , HYPRE_Real *e , HYPRE_Real *tauq , HYPRE_Real *taup , HYPRE_Real *work , HYPRE_Int *lwork , HYPRE_Int *info ); /* dgelq2.c */ HYPRE_Int hypre_dgelq2 ( HYPRE_Int *m , HYPRE_Int *n , HYPRE_Real *a , HYPRE_Int *lda , HYPRE_Real *tau , HYPRE_Real *work , HYPRE_Int *info ); /* dgelqf.c */ HYPRE_Int hypre_dgelqf ( HYPRE_Int *m , HYPRE_Int *n , HYPRE_Real *a , HYPRE_Int *lda , HYPRE_Real *tau , HYPRE_Real *work , HYPRE_Int *lwork , HYPRE_Int *info ); /* dgels.c */ HYPRE_Int hypre_dgels ( char *trans , HYPRE_Int *m , HYPRE_Int *n , HYPRE_Int *nrhs , HYPRE_Real *a , HYPRE_Int *lda , HYPRE_Real *b , HYPRE_Int *ldb , HYPRE_Real *work , HYPRE_Int *lwork , HYPRE_Int *info ); /* dgeqr2.c */ HYPRE_Int hypre_dgeqr2 ( HYPRE_Int *m , HYPRE_Int *n , HYPRE_Real *a , HYPRE_Int *lda , HYPRE_Real *tau , HYPRE_Real *work , HYPRE_Int *info ); /* dgeqrf.c */ HYPRE_Int hypre_dgeqrf ( HYPRE_Int *m , HYPRE_Int *n , HYPRE_Real *a , HYPRE_Int *lda , HYPRE_Real *tau , HYPRE_Real *work , HYPRE_Int *lwork , HYPRE_Int *info ); /* dgesvd.c */ HYPRE_Int hypre_dgesvd ( char *jobu , char *jobvt , HYPRE_Int *m , HYPRE_Int *n , HYPRE_Real *a , HYPRE_Int *lda , HYPRE_Real *s , HYPRE_Real *u , HYPRE_Int *ldu , HYPRE_Real *vt , HYPRE_Int *ldvt , HYPRE_Real *work , HYPRE_Int *lwork , HYPRE_Int *info ); /* dgetf2.c */ HYPRE_Int hypre_dgetf2 ( HYPRE_Int *m , HYPRE_Int *n , HYPRE_Real *a , HYPRE_Int *lda , HYPRE_Int *ipiv , HYPRE_Int *info ); /* dgetrf.c */ HYPRE_Int hypre_dgetrf ( HYPRE_Int *m , HYPRE_Int *n , HYPRE_Real *a , HYPRE_Int *lda , HYPRE_Int *ipiv , HYPRE_Int *info ); /* dgetri.c */ HYPRE_Int hypre_dgetri ( HYPRE_Int *n, HYPRE_Real *a, HYPRE_Int *lda, HYPRE_Int *ipiv, HYPRE_Real *work, HYPRE_Int *lwork, HYPRE_Int *info); /* dgetrs.c */ HYPRE_Int hypre_dgetrs ( const char *trans , HYPRE_Int *n , HYPRE_Int *nrhs , HYPRE_Real *a , HYPRE_Int *lda , HYPRE_Int *ipiv , HYPRE_Real *b , HYPRE_Int *ldb , HYPRE_Int *info ); /* dlasq1.c */ HYPRE_Int hypre_dlasq1 ( HYPRE_Int *n , HYPRE_Real *d__ , HYPRE_Real *e , HYPRE_Real *work , HYPRE_Int *info ); /* dlasq2.c */ HYPRE_Int hypre_dlasq2 ( HYPRE_Int *n , HYPRE_Real *z__ , HYPRE_Int *info ); /* dlasrt.c */ HYPRE_Int hypre_dlasrt (const char *id , HYPRE_Int *n , HYPRE_Real *d__ , HYPRE_Int *info ); /* dorg2l.c */ HYPRE_Int hypre_dorg2l ( HYPRE_Int *m , HYPRE_Int *n , HYPRE_Int *k , HYPRE_Real *a , HYPRE_Int *lda , HYPRE_Real *tau , HYPRE_Real *work , HYPRE_Int *info ); /* dorg2r.c */ HYPRE_Int hypre_dorg2r ( HYPRE_Int *m , HYPRE_Int *n , HYPRE_Int *k , HYPRE_Real *a , HYPRE_Int *lda , HYPRE_Real *tau , HYPRE_Real *work , HYPRE_Int *info ); /* dorgbr.c */ HYPRE_Int hypre_dorgbr (const char *vect , HYPRE_Int *m , HYPRE_Int *n , HYPRE_Int *k , HYPRE_Real *a , HYPRE_Int *lda , HYPRE_Real *tau , HYPRE_Real *work , HYPRE_Int *lwork , HYPRE_Int *info ); /* dorgl2.c */ HYPRE_Int hypre_dorgl2 ( HYPRE_Int *m , HYPRE_Int *n , HYPRE_Int *k , HYPRE_Real *a , HYPRE_Int *lda , HYPRE_Real *tau , HYPRE_Real *work , HYPRE_Int *info ); /* dorglq.c */ HYPRE_Int hypre_dorglq ( HYPRE_Int *m , HYPRE_Int *n , HYPRE_Int *k , HYPRE_Real *a , HYPRE_Int *lda , HYPRE_Real *tau , HYPRE_Real *work , HYPRE_Int *lwork , HYPRE_Int *info ); /* dorgql.c */ HYPRE_Int hypre_dorgql ( HYPRE_Int *m , HYPRE_Int *n , HYPRE_Int *k , HYPRE_Real *a , HYPRE_Int *lda , HYPRE_Real *tau , HYPRE_Real *work , HYPRE_Int *lwork , HYPRE_Int *info ); /* dorgqr.c */ HYPRE_Int hypre_dorgqr ( HYPRE_Int *m , HYPRE_Int *n , HYPRE_Int *k , HYPRE_Real *a , HYPRE_Int *lda , HYPRE_Real *tau , HYPRE_Real *work , HYPRE_Int *lwork , HYPRE_Int *info ); /* dorgtr.c */ HYPRE_Int hypre_dorgtr (const char *uplo , HYPRE_Int *n , HYPRE_Real *a , HYPRE_Int *lda , HYPRE_Real *tau , HYPRE_Real *work , HYPRE_Int *lwork , HYPRE_Int *info ); /* dorm2r.c */ HYPRE_Int hypre_dorm2r (const char *side ,const char *trans , HYPRE_Int *m , HYPRE_Int *n , HYPRE_Int *k , HYPRE_Real *a , HYPRE_Int *lda , HYPRE_Real *tau , HYPRE_Real *c__ , HYPRE_Int *ldc , HYPRE_Real *work , HYPRE_Int *info ); /* dormbr.c */ HYPRE_Int hypre_dormbr (const char *vect ,const char *side ,const char *trans , HYPRE_Int *m , HYPRE_Int *n , HYPRE_Int *k , HYPRE_Real *a , HYPRE_Int *lda , HYPRE_Real *tau , HYPRE_Real *c__ , HYPRE_Int *ldc , HYPRE_Real *work , HYPRE_Int *lwork , HYPRE_Int *info ); /* dorml2.c */ HYPRE_Int hypre_dorml2 (const char *side ,const char *trans , HYPRE_Int *m , HYPRE_Int *n , HYPRE_Int *k , HYPRE_Real *a , HYPRE_Int *lda , HYPRE_Real *tau , HYPRE_Real *c__ , HYPRE_Int *ldc , HYPRE_Real *work , HYPRE_Int *info ); /* dormlq.c */ HYPRE_Int hypre_dormlq (const char *side ,const char *trans , HYPRE_Int *m , HYPRE_Int *n , HYPRE_Int *k , HYPRE_Real *a , HYPRE_Int *lda , HYPRE_Real *tau , HYPRE_Real *c__ , HYPRE_Int *ldc , HYPRE_Real *work , HYPRE_Int *lwork , HYPRE_Int *info ); /* dormqr.c */ HYPRE_Int hypre_dormqr (const char *side ,const char *trans , HYPRE_Int *m , HYPRE_Int *n , HYPRE_Int *k , HYPRE_Real *a , HYPRE_Int *lda , HYPRE_Real *tau , HYPRE_Real *c__ , HYPRE_Int *ldc , HYPRE_Real *work , HYPRE_Int *lwork , HYPRE_Int *info ); /* dpotf2.c */ HYPRE_Int hypre_dpotf2 (const char *uplo , HYPRE_Int *n , HYPRE_Real *a , HYPRE_Int *lda , HYPRE_Int *info ); /* dpotrf.c */ HYPRE_Int hypre_dpotrf (const char *uplo , HYPRE_Int *n , HYPRE_Real *a , HYPRE_Int *lda , HYPRE_Int *info ); /* dpotrs.c */ HYPRE_Int hypre_dpotrs ( char *uplo , HYPRE_Int *n , HYPRE_Int *nrhs , HYPRE_Real *a , HYPRE_Int *lda , HYPRE_Real *b , HYPRE_Int *ldb , HYPRE_Int *info ); /* dsteqr.c */ HYPRE_Int hypre_dsteqr (const char *compz , HYPRE_Int *n , HYPRE_Real *d__ , HYPRE_Real *e , HYPRE_Real *z__ , HYPRE_Int *ldz , HYPRE_Real *work , HYPRE_Int *info ); /* dsterf.c */ HYPRE_Int hypre_dsterf ( HYPRE_Int *n , HYPRE_Real *d__ , HYPRE_Real *e , HYPRE_Int *info ); /* dsyev.c */ HYPRE_Int hypre_dsyev (const char *jobz ,const char *uplo , HYPRE_Int *n , HYPRE_Real *a , HYPRE_Int *lda , HYPRE_Real *w , HYPRE_Real *work , HYPRE_Int *lwork , HYPRE_Int *info ); /* dsygs2.c */ HYPRE_Int hypre_dsygs2 ( HYPRE_Int *itype ,const char *uplo , HYPRE_Int *n , HYPRE_Real *a , HYPRE_Int *lda , HYPRE_Real *b , HYPRE_Int *ldb , HYPRE_Int *info ); /* dsygst.c */ HYPRE_Int hypre_dsygst ( HYPRE_Int *itype ,const char *uplo , HYPRE_Int *n , HYPRE_Real *a , HYPRE_Int *lda , HYPRE_Real *b , HYPRE_Int *ldb , HYPRE_Int *info ); /* dsygv.c */ HYPRE_Int hypre_dsygv ( HYPRE_Int *itype , char *jobz , char *uplo , HYPRE_Int *n , HYPRE_Real *a , HYPRE_Int *lda , HYPRE_Real *b , HYPRE_Int *ldb , HYPRE_Real *w , HYPRE_Real *work , HYPRE_Int *lwork , HYPRE_Int *info ); /* dsytd2.c */ HYPRE_Int hypre_dsytd2 (const char *uplo , HYPRE_Int *n , HYPRE_Real *a , HYPRE_Int *lda , HYPRE_Real *d__ , HYPRE_Real *e , HYPRE_Real *tau , HYPRE_Int *info ); /* dsytrd.c */ HYPRE_Int hypre_dsytrd (const char *uplo , HYPRE_Int *n , HYPRE_Real *a , HYPRE_Int *lda , HYPRE_Real *d__ , HYPRE_Real *e , HYPRE_Real *tau , HYPRE_Real *work , HYPRE_Int *lwork , HYPRE_Int *info ); /* dtrti2.c */ HYPRE_Int hypre_dtrti2 (const char *uplo, const char *diag, HYPRE_Int *n, HYPRE_Real *a, HYPRE_Int *lda, HYPRE_Int *info); /* dtrtri.c */ HYPRE_Int hypre_dtrtri (const char *uplo, const char *diag, HYPRE_Int *n, HYPRE_Real *a, HYPRE_Int *lda, HYPRE_Int *info); #ifdef __cplusplus } #endif #endif hypre-2.33.0/src/lapack/dbdsqr.c000066400000000000000000000565261477326011500164170ustar00rootroot00000000000000/* Copyright (c) 1992-2008 The University of Tennessee. All rights reserved. * See file COPYING in this directory for details. */ #ifdef __cplusplus extern "C" { #endif #include "f2c.h" #include "hypre_lapack.h" /* -- translated by f2c (version 19990503). You must link the resulting object file with the libraries: -lf2c -lm (in that order) */ /* Subroutine */ integer dbdsqr_(const char *uplo, integer *n, integer *ncvt, integer * nru, integer *ncc, doublereal *d__, doublereal *e, doublereal *vt, integer *ldvt, doublereal *u, integer *ldu, doublereal *c__, integer * ldc, doublereal *work, integer *info) { /* System generated locals */ integer c_dim1, c_offset, u_dim1, u_offset, vt_dim1, vt_offset, i__1, i__2; doublereal d__1, d__2, d__3, d__4; /* Builtin functions */ doublereal pow_dd(doublereal *, doublereal *), d_sign( doublereal *, doublereal *); /* Local variables */ doublereal abse; integer idir; doublereal abss; integer oldm; doublereal cosl; integer isub, iter; doublereal unfl, sinl, cosr, smin, smax, sinr; extern /* Subroutine */ integer drot_(integer *, doublereal *, integer *, doublereal *, integer *, doublereal *, doublereal *), dlas2_( doublereal *, doublereal *, doublereal *, doublereal *, doublereal *); doublereal f, g, h__; integer i__, j, m; doublereal r__; extern /* Subroutine */ integer dscal_(integer *, doublereal *, doublereal *, integer *); extern logical lsame_(const char *,const char *); doublereal oldcs; extern /* Subroutine */ integer dlasr_(const char *,const char *,const char *, integer *, integer *, doublereal *, doublereal *, doublereal *, integer *); integer oldll; doublereal shift, sigmn, oldsn; extern /* Subroutine */ integer dswap_(integer *, doublereal *, integer *, doublereal *, integer *); integer maxit; doublereal sminl, sigmx; logical lower; extern /* Subroutine */ integer dlasq1_(integer *, doublereal *, doublereal *, doublereal *, integer *), dlasv2_(doublereal *, doublereal *, doublereal *, doublereal *, doublereal *, doublereal *, doublereal *, doublereal *, doublereal *); doublereal cs; integer ll; extern doublereal dlamch_(const char *); doublereal sn, mu; extern /* Subroutine */ integer dlartg_(doublereal *, doublereal *, doublereal *, doublereal *, doublereal *), xerbla_(const char *, integer *); doublereal sminoa, thresh; logical rotate; integer nm1; doublereal tolmul; integer nm12, nm13, lll; doublereal eps, sll, tol; /* Table of constant values */ doublereal c_b15 = -.125; integer c__1 = 1; doublereal c_b49 = 1.; doublereal c_b72 = -1.; #define c___ref(a_1,a_2) c__[(a_2)*c_dim1 + a_1] #define u_ref(a_1,a_2) u[(a_2)*u_dim1 + a_1] #define vt_ref(a_1,a_2) vt[(a_2)*vt_dim1 + a_1] /* -- LAPACK routine (version 3.0) -- Univ. of Tennessee, Univ. of California Berkeley, NAG Ltd., Courant Institute, Argonne National Lab, and Rice University October 31, 1999 Purpose ======= DBDSQR computes the singular value decomposition (SVD) of a real N-by-N (upper or lower) bidiagonal matrix B: B = Q * S * P' (P' denotes the transpose of P), where S is a diagonal matrix with non-negative diagonal elements (the singular values of B), and Q and P are orthogonal matrices. The routine computes S, and optionally computes U * Q, P' * VT, or Q' * C, for given real input matrices U, VT, and C. See "Computing Small Singular Values of Bidiagonal Matrices With Guaranteed High Relative Accuracy," by J. Demmel and W. Kahan, LAPACK Working Note #3 (or SIAM J. Sci. Statist. Comput. vol. 11, no. 5, pp. 873-912, Sept 1990) and "Accurate singular values and differential qd algorithms," by B. Parlett and V. Fernando, Technical Report CPAM-554, Mathematics Department, University of California at Berkeley, July 1992 for a detailed description of the algorithm. Arguments ========= UPLO (input) CHARACTER*1 = 'U': B is upper bidiagonal; = 'L': B is lower bidiagonal. N (input) INTEGER The order of the matrix B. N >= 0. NCVT (input) INTEGER The number of columns of the matrix VT. NCVT >= 0. NRU (input) INTEGER The number of rows of the matrix U. NRU >= 0. NCC (input) INTEGER The number of columns of the matrix C. NCC >= 0. D (input/output) DOUBLE PRECISION array, dimension (N) On entry, the n diagonal elements of the bidiagonal matrix B. On exit, if INFO=0, the singular values of B in decreasing order. E (input/output) DOUBLE PRECISION array, dimension (N) On entry, the elements of E contain the offdiagonal elements of the bidiagonal matrix whose SVD is desired. On normal exit (INFO = 0), E is destroyed. If the algorithm does not converge (INFO > 0), D and E will contain the diagonal and superdiagonal elements of a bidiagonal matrix orthogonally equivalent to the one given as input. E(N) is used for workspace. VT (input/output) DOUBLE PRECISION array, dimension (LDVT, NCVT) On entry, an N-by-NCVT matrix VT. On exit, VT is overwritten by P' * VT. VT is not referenced if NCVT = 0. LDVT (input) INTEGER The leading dimension of the array VT. LDVT >= max(1,N) if NCVT > 0; LDVT >= 1 if NCVT = 0. U (input/output) DOUBLE PRECISION array, dimension (LDU, N) On entry, an NRU-by-N matrix U. On exit, U is overwritten by U * Q. U is not referenced if NRU = 0. LDU (input) INTEGER The leading dimension of the array U. LDU >= max(1,NRU). C (input/output) DOUBLE PRECISION array, dimension (LDC, NCC) On entry, an N-by-NCC matrix C. On exit, C is overwritten by Q' * C. C is not referenced if NCC = 0. LDC (input) INTEGER The leading dimension of the array C. LDC >= max(1,N) if NCC > 0; LDC >=1 if NCC = 0. WORK (workspace) DOUBLE PRECISION array, dimension (4*N) INFO (output) INTEGER = 0: successful exit < 0: If INFO = -i, the i-th argument had an illegal value > 0: the algorithm did not converge; D and E contain the elements of a bidiagonal matrix which is orthogonally similar to the input matrix B; if INFO = i, i elements of E have not converged to zero. Internal Parameters =================== TOLMUL DOUBLE PRECISION, default = max(10,min(100,EPS**(-1/8))) TOLMUL controls the convergence criterion of the QR loop. If it is positive, TOLMUL*EPS is the desired relative precision in the computed singular values. If it is negative, abs(TOLMUL*EPS*sigma_max) is the desired absolute accuracy in the computed singular values (corresponds to relative accuracy abs(TOLMUL*EPS) in the largest singular value. abs(TOLMUL) should be between 1 and 1/EPS, and preferably between 10 (for fast convergence) and .1/EPS (for there to be some accuracy in the results). Default is to lose at either one eighth or 2 of the available decimal digits in each computed singular value (whichever is smaller). MAXITR INTEGER, default = 6 MAXITR controls the maximum number of passes of the algorithm through its inner loop. The algorithms stops (and so fails to converge) if the number of passes through the inner loop exceeds MAXITR*N**2. ===================================================================== Test the input parameters. Parameter adjustments */ --d__; --e; vt_dim1 = *ldvt; vt_offset = 1 + vt_dim1 * 1; vt -= vt_offset; u_dim1 = *ldu; u_offset = 1 + u_dim1 * 1; u -= u_offset; c_dim1 = *ldc; c_offset = 1 + c_dim1 * 1; c__ -= c_offset; --work; /* Function Body */ *info = 0; lower = lsame_(uplo, "L"); if (! lsame_(uplo, "U") && ! lower) { *info = -1; } else if (*n < 0) { *info = -2; } else if (*ncvt < 0) { *info = -3; } else if (*nru < 0) { *info = -4; } else if (*ncc < 0) { *info = -5; } else if (((*ncvt == 0) && (*ldvt < 1)) || ((*ncvt > 0) && (*ldvt < max(1,*n)))) { *info = -9; } else if (*ldu < max(1,*nru)) { *info = -11; } else if (((*ncc == 0) && (*ldc < 1)) || ((*ncc > 0) && (*ldc < max(1,*n)))) { *info = -13; } if (*info != 0) { i__1 = -(*info); xerbla_("DBDSQR", &i__1); return 0; } if (*n == 0) { return 0; } if (*n == 1) { goto L160; } /* ROTATE is true if any singular vectors desired, false otherwise */ rotate = *ncvt > 0 || *nru > 0 || *ncc > 0; /* If no singular vectors desired, use qd algorithm */ if (! rotate) { dlasq1_(n, &d__[1], &e[1], &work[1], info); return 0; } nm1 = *n - 1; nm12 = nm1 + nm1; nm13 = nm12 + nm1; idir = 0; /* Get machine constants */ eps = dlamch_("Epsilon"); unfl = dlamch_("Safe minimum"); /* If matrix lower bidiagonal, rotate to be upper bidiagonal by applying Givens rotations on the left */ if (lower) { i__1 = *n - 1; for (i__ = 1; i__ <= i__1; ++i__) { dlartg_(&d__[i__], &e[i__], &cs, &sn, &r__); d__[i__] = r__; e[i__] = sn * d__[i__ + 1]; d__[i__ + 1] = cs * d__[i__ + 1]; work[i__] = cs; work[nm1 + i__] = sn; /* L10: */ } /* Update singular vectors if desired */ if (*nru > 0) { dlasr_("R", "V", "F", nru, n, &work[1], &work[*n], &u[u_offset], ldu); } if (*ncc > 0) { dlasr_("L", "V", "F", n, ncc, &work[1], &work[*n], &c__[c_offset], ldc); } } /* Compute singular values to relative accuracy TOL (By setting TOL to be negative, algorithm will compute singular values to absolute accuracy ABS(TOL)*norm(input matrix)) Computing MAX Computing MIN */ d__3 = 100., d__4 = pow_dd(&eps, &c_b15); d__1 = 10., d__2 = min(d__3,d__4); tolmul = max(d__1,d__2); tol = tolmul * eps; /* Compute approximate maximum, minimum singular values */ smax = 0.; i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { /* Computing MAX */ d__2 = smax, d__3 = (d__1 = d__[i__], abs(d__1)); smax = max(d__2,d__3); /* L20: */ } i__1 = *n - 1; for (i__ = 1; i__ <= i__1; ++i__) { /* Computing MAX */ d__2 = smax, d__3 = (d__1 = e[i__], abs(d__1)); smax = max(d__2,d__3); /* L30: */ } sminl = 0.; if (tol >= 0.) { /* Relative accuracy desired */ sminoa = abs(d__[1]); if (sminoa == 0.) { goto L50; } mu = sminoa; i__1 = *n; for (i__ = 2; i__ <= i__1; ++i__) { mu = (d__2 = d__[i__], abs(d__2)) * (mu / (mu + (d__1 = e[i__ - 1] , abs(d__1)))); sminoa = min(sminoa,mu); if (sminoa == 0.) { goto L50; } /* L40: */ } L50: sminoa /= sqrt((doublereal) (*n)); /* Computing MAX */ d__1 = tol * sminoa, d__2 = *n * 6 * *n * unfl; thresh = max(d__1,d__2); } else { /* Absolute accuracy desired Computing MAX */ d__1 = abs(tol) * smax, d__2 = *n * 6 * *n * unfl; thresh = max(d__1,d__2); } /* Prepare for main iteration loop for the singular values (MAXIT is the maximum number of passes through the inner loop permitted before nonconvergence signalled.) */ maxit = *n * 6 * *n; iter = 0; oldll = -1; oldm = -1; /* M points to last element of unconverged part of matrix */ m = *n; /* Begin main iteration loop */ L60: /* Check for convergence or exceeding iteration count */ if (m <= 1) { goto L160; } if (iter > maxit) { goto L200; } /* Find diagonal block of matrix to work on */ if (tol < 0. && (d__1 = d__[m], abs(d__1)) <= thresh) { d__[m] = 0.; } smax = (d__1 = d__[m], abs(d__1)); smin = smax; i__1 = m - 1; for (lll = 1; lll <= i__1; ++lll) { ll = m - lll; abss = (d__1 = d__[ll], abs(d__1)); abse = (d__1 = e[ll], abs(d__1)); if (tol < 0. && abss <= thresh) { d__[ll] = 0.; } if (abse <= thresh) { goto L80; } smin = min(smin,abss); /* Computing MAX */ d__1 = max(smax,abss); smax = max(d__1,abse); /* L70: */ } ll = 0; goto L90; L80: e[ll] = 0.; /* Matrix splits since E(LL) = 0 */ if (ll == m - 1) { /* Convergence of bottom singular value, return to top of loop */ --m; goto L60; } L90: ++ll; /* E(LL) through E(M-1) are nonzero, E(LL-1) is zero */ if (ll == m - 1) { /* 2 by 2 block, handle separately */ dlasv2_(&d__[m - 1], &e[m - 1], &d__[m], &sigmn, &sigmx, &sinr, &cosr, &sinl, &cosl); d__[m - 1] = sigmx; e[m - 1] = 0.; d__[m] = sigmn; /* Compute singular vectors, if desired */ if (*ncvt > 0) { drot_(ncvt, &vt_ref(m - 1, 1), ldvt, &vt_ref(m, 1), ldvt, &cosr, & sinr); } if (*nru > 0) { drot_(nru, &u_ref(1, m - 1), &c__1, &u_ref(1, m), &c__1, &cosl, & sinl); } if (*ncc > 0) { drot_(ncc, &c___ref(m - 1, 1), ldc, &c___ref(m, 1), ldc, &cosl, & sinl); } m += -2; goto L60; } /* If working on new submatrix, choose shift direction (from larger end diagonal element towards smaller) */ if (ll > oldm || m < oldll) { if ((d__1 = d__[ll], abs(d__1)) >= (d__2 = d__[m], abs(d__2))) { /* Chase bulge from top (big end) to bottom (small end) */ idir = 1; } else { /* Chase bulge from bottom (big end) to top (small end) */ idir = 2; } } /* Apply convergence tests */ if (idir == 1) { /* Run convergence test in forward direction First apply standard test to bottom of matrix */ if ((d__2 = e[m - 1], abs(d__2)) <= abs(tol) * (d__1 = d__[m], abs( d__1)) || ((tol < 0.) && ((d__3 = e[m - 1], abs(d__3)) <= thresh))) { e[m - 1] = 0.; goto L60; } if (tol >= 0.) { /* If relative accuracy desired, apply convergence criterion forward */ mu = (d__1 = d__[ll], abs(d__1)); sminl = mu; i__1 = m - 1; for (lll = ll; lll <= i__1; ++lll) { if ((d__1 = e[lll], abs(d__1)) <= tol * mu) { e[lll] = 0.; goto L60; } mu = (d__2 = d__[lll + 1], abs(d__2)) * (mu / (mu + (d__1 = e[ lll], abs(d__1)))); sminl = min(sminl,mu); /* L100: */ } } } else { /* Run convergence test in backward direction First apply standard test to top of matrix */ if ((d__2 = e[ll], abs(d__2)) <= abs(tol) * (d__1 = d__[ll], abs(d__1) ) || ((tol < 0.) && ((d__3 = e[ll], abs(d__3)) <= thresh))) { e[ll] = 0.; goto L60; } if (tol >= 0.) { /* If relative accuracy desired, apply convergence criterion backward */ mu = (d__1 = d__[m], abs(d__1)); sminl = mu; i__1 = ll; for (lll = m - 1; lll >= i__1; --lll) { if ((d__1 = e[lll], abs(d__1)) <= tol * mu) { e[lll] = 0.; goto L60; } mu = (d__2 = d__[lll], abs(d__2)) * (mu / (mu + (d__1 = e[lll] , abs(d__1)))); sminl = min(sminl,mu); /* L110: */ } } } oldll = ll; oldm = m; /* Compute shift. First, test if shifting would ruin relative accuracy, and if so set the shift to zero. Computing MAX */ d__1 = eps, d__2 = tol * .01; if (tol >= 0. && *n * tol * (sminl / smax) <= max(d__1,d__2)) { /* Use a zero shift to avoid loss of relative accuracy */ shift = 0.; } else { /* Compute the shift from 2-by-2 block at end of matrix */ if (idir == 1) { sll = (d__1 = d__[ll], abs(d__1)); dlas2_(&d__[m - 1], &e[m - 1], &d__[m], &shift, &r__); } else { sll = (d__1 = d__[m], abs(d__1)); dlas2_(&d__[ll], &e[ll], &d__[ll + 1], &shift, &r__); } /* Test if shift negligible, and if so set to zero */ if (sll > 0.) { /* Computing 2nd power */ d__1 = shift / sll; if (d__1 * d__1 < eps) { shift = 0.; } } } /* Increment iteration count */ iter = iter + m - ll; /* If SHIFT = 0, do simplified QR iteration */ if (shift == 0.) { if (idir == 1) { /* Chase bulge from top to bottom Save cosines and sines for later singular vector updates */ cs = 1.; oldcs = 1.; i__1 = m - 1; for (i__ = ll; i__ <= i__1; ++i__) { d__1 = d__[i__] * cs; dlartg_(&d__1, &e[i__], &cs, &sn, &r__); if (i__ > ll) { e[i__ - 1] = oldsn * r__; } d__1 = oldcs * r__; d__2 = d__[i__ + 1] * sn; dlartg_(&d__1, &d__2, &oldcs, &oldsn, &d__[i__]); work[i__ - ll + 1] = cs; work[i__ - ll + 1 + nm1] = sn; work[i__ - ll + 1 + nm12] = oldcs; work[i__ - ll + 1 + nm13] = oldsn; /* L120: */ } h__ = d__[m] * cs; d__[m] = h__ * oldcs; e[m - 1] = h__ * oldsn; /* Update singular vectors */ if (*ncvt > 0) { i__1 = m - ll + 1; dlasr_("L", "V", "F", &i__1, ncvt, &work[1], &work[*n], & vt_ref(ll, 1), ldvt); } if (*nru > 0) { i__1 = m - ll + 1; dlasr_("R", "V", "F", nru, &i__1, &work[nm12 + 1], &work[nm13 + 1], &u_ref(1, ll), ldu); } if (*ncc > 0) { i__1 = m - ll + 1; dlasr_("L", "V", "F", &i__1, ncc, &work[nm12 + 1], &work[nm13 + 1], &c___ref(ll, 1), ldc); } /* Test convergence */ if ((d__1 = e[m - 1], abs(d__1)) <= thresh) { e[m - 1] = 0.; } } else { /* Chase bulge from bottom to top Save cosines and sines for later singular vector updates */ cs = 1.; oldcs = 1.; i__1 = ll + 1; for (i__ = m; i__ >= i__1; --i__) { d__1 = d__[i__] * cs; dlartg_(&d__1, &e[i__ - 1], &cs, &sn, &r__); if (i__ < m) { e[i__] = oldsn * r__; } d__1 = oldcs * r__; d__2 = d__[i__ - 1] * sn; dlartg_(&d__1, &d__2, &oldcs, &oldsn, &d__[i__]); work[i__ - ll] = cs; work[i__ - ll + nm1] = -sn; work[i__ - ll + nm12] = oldcs; work[i__ - ll + nm13] = -oldsn; /* L130: */ } h__ = d__[ll] * cs; d__[ll] = h__ * oldcs; e[ll] = h__ * oldsn; /* Update singular vectors */ if (*ncvt > 0) { i__1 = m - ll + 1; dlasr_("L", "V", "B", &i__1, ncvt, &work[nm12 + 1], &work[ nm13 + 1], &vt_ref(ll, 1), ldvt); } if (*nru > 0) { i__1 = m - ll + 1; dlasr_("R", "V", "B", nru, &i__1, &work[1], &work[*n], &u_ref( 1, ll), ldu); } if (*ncc > 0) { i__1 = m - ll + 1; dlasr_("L", "V", "B", &i__1, ncc, &work[1], &work[*n], & c___ref(ll, 1), ldc); } /* Test convergence */ if ((d__1 = e[ll], abs(d__1)) <= thresh) { e[ll] = 0.; } } } else { /* Use nonzero shift */ if (idir == 1) { /* Chase bulge from top to bottom Save cosines and sines for later singular vector updates */ f = ((d__1 = d__[ll], abs(d__1)) - shift) * (d_sign(&c_b49, &d__[ ll]) + shift / d__[ll]); g = e[ll]; i__1 = m - 1; for (i__ = ll; i__ <= i__1; ++i__) { dlartg_(&f, &g, &cosr, &sinr, &r__); if (i__ > ll) { e[i__ - 1] = r__; } f = cosr * d__[i__] + sinr * e[i__]; e[i__] = cosr * e[i__] - sinr * d__[i__]; g = sinr * d__[i__ + 1]; d__[i__ + 1] = cosr * d__[i__ + 1]; dlartg_(&f, &g, &cosl, &sinl, &r__); d__[i__] = r__; f = cosl * e[i__] + sinl * d__[i__ + 1]; d__[i__ + 1] = cosl * d__[i__ + 1] - sinl * e[i__]; if (i__ < m - 1) { g = sinl * e[i__ + 1]; e[i__ + 1] = cosl * e[i__ + 1]; } work[i__ - ll + 1] = cosr; work[i__ - ll + 1 + nm1] = sinr; work[i__ - ll + 1 + nm12] = cosl; work[i__ - ll + 1 + nm13] = sinl; /* L140: */ } e[m - 1] = f; /* Update singular vectors */ if (*ncvt > 0) { i__1 = m - ll + 1; dlasr_("L", "V", "F", &i__1, ncvt, &work[1], &work[*n], & vt_ref(ll, 1), ldvt); } if (*nru > 0) { i__1 = m - ll + 1; dlasr_("R", "V", "F", nru, &i__1, &work[nm12 + 1], &work[nm13 + 1], &u_ref(1, ll), ldu); } if (*ncc > 0) { i__1 = m - ll + 1; dlasr_("L", "V", "F", &i__1, ncc, &work[nm12 + 1], &work[nm13 + 1], &c___ref(ll, 1), ldc); } /* Test convergence */ if ((d__1 = e[m - 1], abs(d__1)) <= thresh) { e[m - 1] = 0.; } } else { /* Chase bulge from bottom to top Save cosines and sines for later singular vector updates */ f = ((d__1 = d__[m], abs(d__1)) - shift) * (d_sign(&c_b49, &d__[m] ) + shift / d__[m]); g = e[m - 1]; i__1 = ll + 1; for (i__ = m; i__ >= i__1; --i__) { dlartg_(&f, &g, &cosr, &sinr, &r__); if (i__ < m) { e[i__] = r__; } f = cosr * d__[i__] + sinr * e[i__ - 1]; e[i__ - 1] = cosr * e[i__ - 1] - sinr * d__[i__]; g = sinr * d__[i__ - 1]; d__[i__ - 1] = cosr * d__[i__ - 1]; dlartg_(&f, &g, &cosl, &sinl, &r__); d__[i__] = r__; f = cosl * e[i__ - 1] + sinl * d__[i__ - 1]; d__[i__ - 1] = cosl * d__[i__ - 1] - sinl * e[i__ - 1]; if (i__ > ll + 1) { g = sinl * e[i__ - 2]; e[i__ - 2] = cosl * e[i__ - 2]; } work[i__ - ll] = cosr; work[i__ - ll + nm1] = -sinr; work[i__ - ll + nm12] = cosl; work[i__ - ll + nm13] = -sinl; /* L150: */ } e[ll] = f; /* Test convergence */ if ((d__1 = e[ll], abs(d__1)) <= thresh) { e[ll] = 0.; } /* Update singular vectors if desired */ if (*ncvt > 0) { i__1 = m - ll + 1; dlasr_("L", "V", "B", &i__1, ncvt, &work[nm12 + 1], &work[ nm13 + 1], &vt_ref(ll, 1), ldvt); } if (*nru > 0) { i__1 = m - ll + 1; dlasr_("R", "V", "B", nru, &i__1, &work[1], &work[*n], &u_ref( 1, ll), ldu); } if (*ncc > 0) { i__1 = m - ll + 1; dlasr_("L", "V", "B", &i__1, ncc, &work[1], &work[*n], & c___ref(ll, 1), ldc); } } } /* QR iteration finished, go back and check convergence */ goto L60; /* All singular values converged, so make them positive */ L160: i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { if (d__[i__] < 0.) { d__[i__] = -d__[i__]; /* Change sign of singular vectors, if desired */ if (*ncvt > 0) { dscal_(ncvt, &c_b72, &vt_ref(i__, 1), ldvt); } } /* L170: */ } /* Sort the singular values into decreasing order (insertion sort on singular values, but only one transposition per singular vector) */ i__1 = *n - 1; for (i__ = 1; i__ <= i__1; ++i__) { /* Scan for smallest D(I) */ isub = 1; smin = d__[1]; i__2 = *n + 1 - i__; for (j = 2; j <= i__2; ++j) { if (d__[j] <= smin) { isub = j; smin = d__[j]; } /* L180: */ } if (isub != *n + 1 - i__) { /* Swap singular values and vectors */ d__[isub] = d__[*n + 1 - i__]; d__[*n + 1 - i__] = smin; if (*ncvt > 0) { dswap_(ncvt, &vt_ref(isub, 1), ldvt, &vt_ref(*n + 1 - i__, 1), ldvt); } if (*nru > 0) { dswap_(nru, &u_ref(1, isub), &c__1, &u_ref(1, *n + 1 - i__), & c__1); } if (*ncc > 0) { dswap_(ncc, &c___ref(isub, 1), ldc, &c___ref(*n + 1 - i__, 1), ldc); } } /* L190: */ } goto L220; /* Maximum number of iterations exceeded, failure to converge */ L200: *info = 0; i__1 = *n - 1; for (i__ = 1; i__ <= i__1; ++i__) { if (e[i__] != 0.) { ++(*info); } /* L210: */ } L220: return 0; /* End of DBDSQR */ } /* dbdsqr_ */ #undef vt_ref #undef u_ref #undef c___ref #ifdef __cplusplus } #endif hypre-2.33.0/src/lapack/dgebd2.c000066400000000000000000000210631477326011500162530ustar00rootroot00000000000000/* Copyright (c) 1992-2008 The University of Tennessee. All rights reserved. * See file COPYING in this directory for details. */ #ifdef __cplusplus extern "C" { #endif #include "f2c.h" #include "hypre_lapack.h" /* Subroutine */ integer dgebd2_(integer *m, integer *n, doublereal *a, integer * lda, doublereal *d__, doublereal *e, doublereal *tauq, doublereal * taup, doublereal *work, integer *info) { /* -- LAPACK routine (version 3.0) -- Univ. of Tennessee, Univ. of California Berkeley, NAG Ltd., Courant Institute, Argonne National Lab, and Rice University February 29, 1992 Purpose ======= DGEBD2 reduces a real general m by n matrix A to upper or lower bidiagonal form B by an orthogonal transformation: Q' * A * P = B. If m >= n, B is upper bidiagonal; if m < n, B is lower bidiagonal. Arguments ========= M (input) INTEGER The number of rows in the matrix A. M >= 0. N (input) INTEGER The number of columns in the matrix A. N >= 0. A (input/output) DOUBLE PRECISION array, dimension (LDA,N) On entry, the m by n general matrix to be reduced. On exit, if m >= n, the diagonal and the first superdiagonal are overwritten with the upper bidiagonal matrix B; the elements below the diagonal, with the array TAUQ, represent the orthogonal matrix Q as a product of elementary reflectors, and the elements above the first superdiagonal, with the array TAUP, represent the orthogonal matrix P as a product of elementary reflectors; if m < n, the diagonal and the first subdiagonal are overwritten with the lower bidiagonal matrix B; the elements below the first subdiagonal, with the array TAUQ, represent the orthogonal matrix Q as a product of elementary reflectors, and the elements above the diagonal, with the array TAUP, represent the orthogonal matrix P as a product of elementary reflectors. See Further Details. LDA (input) INTEGER The leading dimension of the array A. LDA >= max(1,M). D (output) DOUBLE PRECISION array, dimension (min(M,N)) The diagonal elements of the bidiagonal matrix B: D(i) = A(i,i). E (output) DOUBLE PRECISION array, dimension (min(M,N)-1) The off-diagonal elements of the bidiagonal matrix B: if m >= n, E(i) = A(i,i+1) for i = 1,2,...,n-1; if m < n, E(i) = A(i+1,i) for i = 1,2,...,m-1. TAUQ (output) DOUBLE PRECISION array dimension (min(M,N)) The scalar factors of the elementary reflectors which represent the orthogonal matrix Q. See Further Details. TAUP (output) DOUBLE PRECISION array, dimension (min(M,N)) The scalar factors of the elementary reflectors which represent the orthogonal matrix P. See Further Details. WORK (workspace) DOUBLE PRECISION array, dimension (max(M,N)) INFO (output) INTEGER = 0: successful exit. < 0: if INFO = -i, the i-th argument had an illegal value. Further Details =============== The matrices Q and P are represented as products of elementary reflectors: If m >= n, Q = H(1) H(2) . . . H(n) and P = G(1) G(2) . . . G(n-1) Each H(i) and G(i) has the form: H(i) = I - tauq * v * v' and G(i) = I - taup * u * u' where tauq and taup are real scalars, and v and u are real vectors; v(1:i-1) = 0, v(i) = 1, and v(i+1:m) is stored on exit in A(i+1:m,i); u(1:i) = 0, u(i+1) = 1, and u(i+2:n) is stored on exit in A(i,i+2:n); tauq is stored in TAUQ(i) and taup in TAUP(i). If m < n, Q = H(1) H(2) . . . H(m-1) and P = G(1) G(2) . . . G(m) Each H(i) and G(i) has the form: H(i) = I - tauq * v * v' and G(i) = I - taup * u * u' where tauq and taup are real scalars, and v and u are real vectors; v(1:i) = 0, v(i+1) = 1, and v(i+2:m) is stored on exit in A(i+2:m,i); u(1:i-1) = 0, u(i) = 1, and u(i+1:n) is stored on exit in A(i,i+1:n); tauq is stored in TAUQ(i) and taup in TAUP(i). The contents of A on exit are illustrated by the following examples: m = 6 and n = 5 (m > n): m = 5 and n = 6 (m < n): ( d e u1 u1 u1 ) ( d u1 u1 u1 u1 u1 ) ( v1 d e u2 u2 ) ( e d u2 u2 u2 u2 ) ( v1 v2 d e u3 ) ( v1 e d u3 u3 u3 ) ( v1 v2 v3 d e ) ( v1 v2 e d u4 u4 ) ( v1 v2 v3 v4 d ) ( v1 v2 v3 e d u5 ) ( v1 v2 v3 v4 v5 ) where d and e denote diagonal and off-diagonal elements of B, vi denotes an element of the vector defining H(i), and ui an element of the vector defining G(i). ===================================================================== Test the input parameters Parameter adjustments */ /* Table of constant values */ integer c__1 = 1; /* System generated locals */ integer a_dim1, a_offset, i__1, i__2, i__3, i__4; /* Local variables */ integer i__; extern /* Subroutine */ integer dlarf_(const char *, integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *, doublereal *), dlarfg_(integer *, doublereal *, doublereal *, integer *, doublereal *), xerbla_(const char *, integer *); #define a_ref(a_1,a_2) a[(a_2)*a_dim1 + a_1] a_dim1 = *lda; a_offset = 1 + a_dim1 * 1; a -= a_offset; --d__; --e; --tauq; --taup; --work; /* Function Body */ *info = 0; if (*m < 0) { *info = -1; } else if (*n < 0) { *info = -2; } else if (*lda < max(1,*m)) { *info = -4; } if (*info < 0) { i__1 = -(*info); xerbla_("DGEBD2", &i__1); return 0; } if (*m >= *n) { /* Reduce to upper bidiagonal form */ i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { /* Generate elementary reflector H(i) to annihilate A(i+1:m,i) Computing MIN */ i__2 = i__ + 1; i__3 = *m - i__ + 1; dlarfg_(&i__3, &a_ref(i__, i__), &a_ref(min(i__2,*m), i__), &c__1, &tauq[i__]); d__[i__] = a_ref(i__, i__); a_ref(i__, i__) = 1.; /* Apply H(i) to A(i:m,i+1:n) from the left */ i__2 = *m - i__ + 1; i__3 = *n - i__; dlarf_("Left", &i__2, &i__3, &a_ref(i__, i__), &c__1, &tauq[i__], &a_ref(i__, i__ + 1), lda, &work[1]); a_ref(i__, i__) = d__[i__]; if (i__ < *n) { /* Generate elementary reflector G(i) to annihilate A(i,i+2:n) Computing MIN */ i__2 = i__ + 2; i__3 = *n - i__; dlarfg_(&i__3, &a_ref(i__, i__ + 1), &a_ref(i__, min(i__2,*n)) , lda, &taup[i__]); e[i__] = a_ref(i__, i__ + 1); a_ref(i__, i__ + 1) = 1.; /* Apply G(i) to A(i+1:m,i+1:n) from the right */ i__2 = *m - i__; i__3 = *n - i__; dlarf_("Right", &i__2, &i__3, &a_ref(i__, i__ + 1), lda, & taup[i__], &a_ref(i__ + 1, i__ + 1), lda, &work[1]); a_ref(i__, i__ + 1) = e[i__]; } else { taup[i__] = 0.; } /* L10: */ } } else { /* Reduce to lower bidiagonal form */ i__1 = *m; for (i__ = 1; i__ <= i__1; ++i__) { /* Generate elementary reflector G(i) to annihilate A(i,i+1:n) Computing MIN */ i__2 = i__ + 1; i__3 = *n - i__ + 1; dlarfg_(&i__3, &a_ref(i__, i__), &a_ref(i__, min(i__2,*n)), lda, & taup[i__]); d__[i__] = a_ref(i__, i__); a_ref(i__, i__) = 1.; /* Apply G(i) to A(i+1:m,i:n) from the right Computing MIN */ i__2 = i__ + 1; i__3 = *m - i__; i__4 = *n - i__ + 1; dlarf_("Right", &i__3, &i__4, &a_ref(i__, i__), lda, &taup[i__], & a_ref(min(i__2,*m), i__), lda, &work[1]); a_ref(i__, i__) = d__[i__]; if (i__ < *m) { /* Generate elementary reflector H(i) to annihilate A(i+2:m,i) Computing MIN */ i__2 = i__ + 2; i__3 = *m - i__; dlarfg_(&i__3, &a_ref(i__ + 1, i__), &a_ref(min(i__2,*m), i__) , &c__1, &tauq[i__]); e[i__] = a_ref(i__ + 1, i__); a_ref(i__ + 1, i__) = 1.; /* Apply H(i) to A(i+1:m,i+1:n) from the left */ i__2 = *m - i__; i__3 = *n - i__; dlarf_("Left", &i__2, &i__3, &a_ref(i__ + 1, i__), &c__1, & tauq[i__], &a_ref(i__ + 1, i__ + 1), lda, &work[1]); a_ref(i__ + 1, i__) = e[i__]; } else { tauq[i__] = 0.; } /* L20: */ } } return 0; /* End of DGEBD2 */ } /* dgebd2_ */ #undef a_ref #ifdef __cplusplus } #endif hypre-2.33.0/src/lapack/dgebrd.c000066400000000000000000000244561477326011500163640ustar00rootroot00000000000000/* Copyright (c) 1992-2008 The University of Tennessee. All rights reserved. * See file COPYING in this directory for details. */ #ifdef __cplusplus extern "C" { #endif #include "f2c.h" #include "hypre_lapack.h" /* Subroutine */ integer dgebrd_(integer *m, integer *n, doublereal *a, integer * lda, doublereal *d__, doublereal *e, doublereal *tauq, doublereal * taup, doublereal *work, integer *lwork, integer *info) { /* -- LAPACK routine (version 3.0) -- Univ. of Tennessee, Univ. of California Berkeley, NAG Ltd., Courant Institute, Argonne National Lab, and Rice University June 30, 1999 Purpose ======= DGEBRD reduces a general real M-by-N matrix A to upper or lower bidiagonal form B by an orthogonal transformation: Q**T * A * P = B. If m >= n, B is upper bidiagonal; if m < n, B is lower bidiagonal. Arguments ========= M (input) INTEGER The number of rows in the matrix A. M >= 0. N (input) INTEGER The number of columns in the matrix A. N >= 0. A (input/output) DOUBLE PRECISION array, dimension (LDA,N) On entry, the M-by-N general matrix to be reduced. On exit, if m >= n, the diagonal and the first superdiagonal are overwritten with the upper bidiagonal matrix B; the elements below the diagonal, with the array TAUQ, represent the orthogonal matrix Q as a product of elementary reflectors, and the elements above the first superdiagonal, with the array TAUP, represent the orthogonal matrix P as a product of elementary reflectors; if m < n, the diagonal and the first subdiagonal are overwritten with the lower bidiagonal matrix B; the elements below the first subdiagonal, with the array TAUQ, represent the orthogonal matrix Q as a product of elementary reflectors, and the elements above the diagonal, with the array TAUP, represent the orthogonal matrix P as a product of elementary reflectors. See Further Details. LDA (input) INTEGER The leading dimension of the array A. LDA >= max(1,M). D (output) DOUBLE PRECISION array, dimension (min(M,N)) The diagonal elements of the bidiagonal matrix B: D(i) = A(i,i). E (output) DOUBLE PRECISION array, dimension (min(M,N)-1) The off-diagonal elements of the bidiagonal matrix B: if m >= n, E(i) = A(i,i+1) for i = 1,2,...,n-1; if m < n, E(i) = A(i+1,i) for i = 1,2,...,m-1. TAUQ (output) DOUBLE PRECISION array dimension (min(M,N)) The scalar factors of the elementary reflectors which represent the orthogonal matrix Q. See Further Details. TAUP (output) DOUBLE PRECISION array, dimension (min(M,N)) The scalar factors of the elementary reflectors which represent the orthogonal matrix P. See Further Details. WORK (workspace/output) DOUBLE PRECISION array, dimension (LWORK) On exit, if INFO = 0, WORK(1) returns the optimal LWORK. LWORK (input) INTEGER The length of the array WORK. LWORK >= max(1,M,N). For optimum performance LWORK >= (M+N)*NB, where NB is the optimal blocksize. If LWORK = -1, then a workspace query is assumed; the routine only calculates the optimal size of the WORK array, returns this value as the first entry of the WORK array, and no error message related to LWORK is issued by XERBLA. INFO (output) INTEGER = 0: successful exit < 0: if INFO = -i, the i-th argument had an illegal value. Further Details =============== The matrices Q and P are represented as products of elementary reflectors: If m >= n, Q = H(1) H(2) . . . H(n) and P = G(1) G(2) . . . G(n-1) Each H(i) and G(i) has the form: H(i) = I - tauq * v * v' and G(i) = I - taup * u * u' where tauq and taup are real scalars, and v and u are real vectors; v(1:i-1) = 0, v(i) = 1, and v(i+1:m) is stored on exit in A(i+1:m,i); u(1:i) = 0, u(i+1) = 1, and u(i+2:n) is stored on exit in A(i,i+2:n); tauq is stored in TAUQ(i) and taup in TAUP(i). If m < n, Q = H(1) H(2) . . . H(m-1) and P = G(1) G(2) . . . G(m) Each H(i) and G(i) has the form: H(i) = I - tauq * v * v' and G(i) = I - taup * u * u' where tauq and taup are real scalars, and v and u are real vectors; v(1:i) = 0, v(i+1) = 1, and v(i+2:m) is stored on exit in A(i+2:m,i); u(1:i-1) = 0, u(i) = 1, and u(i+1:n) is stored on exit in A(i,i+1:n); tauq is stored in TAUQ(i) and taup in TAUP(i). The contents of A on exit are illustrated by the following examples: m = 6 and n = 5 (m > n): m = 5 and n = 6 (m < n): ( d e u1 u1 u1 ) ( d u1 u1 u1 u1 u1 ) ( v1 d e u2 u2 ) ( e d u2 u2 u2 u2 ) ( v1 v2 d e u3 ) ( v1 e d u3 u3 u3 ) ( v1 v2 v3 d e ) ( v1 v2 e d u4 u4 ) ( v1 v2 v3 v4 d ) ( v1 v2 v3 e d u5 ) ( v1 v2 v3 v4 v5 ) where d and e denote diagonal and off-diagonal elements of B, vi denotes an element of the vector defining H(i), and ui an element of the vector defining G(i). ===================================================================== Test the input parameters Parameter adjustments */ /* Table of constant values */ integer c__1 = 1; integer c_n1 = -1; integer c__3 = 3; integer c__2 = 2; doublereal c_b21 = -1.; doublereal c_b22 = 1.; /* System generated locals */ integer a_dim1, a_offset, i__1, i__2, i__3, i__4; /* Local variables */ integer i__, j; extern /* Subroutine */ integer dgemm_(const char *,const char *, integer *, integer *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *); integer nbmin, iinfo, minmn; extern /* Subroutine */ integer dgebd2_(integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, doublereal *, doublereal *, doublereal *, integer *); integer nb; extern /* Subroutine */ integer dlabrd_(integer *, integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, doublereal *, doublereal *, doublereal *, integer *, doublereal *, integer *); integer nx; doublereal ws; extern /* Subroutine */ integer xerbla_(const char *, integer *); extern integer ilaenv_(integer *, const char *,const char *, integer *, integer *, integer *, integer *, ftnlen, ftnlen); integer ldwrkx, ldwrky, lwkopt; logical lquery; #define a_ref(a_1,a_2) a[(a_2)*a_dim1 + a_1] a_dim1 = *lda; a_offset = 1 + a_dim1 * 1; a -= a_offset; --d__; --e; --tauq; --taup; --work; /* Function Body */ *info = 0; /* Computing MAX */ i__1 = 1, i__2 = ilaenv_(&c__1, "DGEBRD", " ", m, n, &c_n1, &c_n1, ( ftnlen)6, (ftnlen)1); nb = max(i__1,i__2); lwkopt = (*m + *n) * nb; work[1] = (doublereal) lwkopt; lquery = *lwork == -1; if (*m < 0) { *info = -1; } else if (*n < 0) { *info = -2; } else if (*lda < max(1,*m)) { *info = -4; } else /* if(complicated condition) */ { /* Computing MAX */ i__1 = max(1,*m); if (*lwork < max(i__1,*n) && ! lquery) { *info = -10; } } if (*info < 0) { i__1 = -(*info); xerbla_("DGEBRD", &i__1); return 0; } else if (lquery) { return 0; } /* Quick return if possible */ minmn = min(*m,*n); if (minmn == 0) { work[1] = 1.; return 0; } ws = (doublereal) max(*m,*n); ldwrkx = *m; ldwrky = *n; if (nb > 1 && nb < minmn) { /* Set the crossover point NX. Computing MAX */ i__1 = nb, i__2 = ilaenv_(&c__3, "DGEBRD", " ", m, n, &c_n1, &c_n1, ( ftnlen)6, (ftnlen)1); nx = max(i__1,i__2); /* Determine when to switch from blocked to unblocked code. */ if (nx < minmn) { ws = (doublereal) ((*m + *n) * nb); if ((doublereal) (*lwork) < ws) { /* Not enough work space for the optimal NB, consider using a smaller block size. */ nbmin = ilaenv_(&c__2, "DGEBRD", " ", m, n, &c_n1, &c_n1, ( ftnlen)6, (ftnlen)1); if (*lwork >= (*m + *n) * nbmin) { nb = *lwork / (*m + *n); } else { nb = 1; nx = minmn; } } } } else { nx = minmn; } i__1 = minmn - nx; i__2 = nb; for (i__ = 1; i__2 < 0 ? i__ >= i__1 : i__ <= i__1; i__ += i__2) { /* Reduce rows and columns i:i+nb-1 to bidiagonal form and return the matrices X and Y which are needed to update the unreduced part of the matrix */ i__3 = *m - i__ + 1; i__4 = *n - i__ + 1; dlabrd_(&i__3, &i__4, &nb, &a_ref(i__, i__), lda, &d__[i__], &e[i__], &tauq[i__], &taup[i__], &work[1], &ldwrkx, &work[ldwrkx * nb + 1], &ldwrky); /* Update the trailing submatrix A(i+nb:m,i+nb:n), using an update of the form A := A - V*Y' - X*U' */ i__3 = *m - i__ - nb + 1; i__4 = *n - i__ - nb + 1; dgemm_("No transpose", "Transpose", &i__3, &i__4, &nb, &c_b21, &a_ref( i__ + nb, i__), lda, &work[ldwrkx * nb + nb + 1], &ldwrky, & c_b22, &a_ref(i__ + nb, i__ + nb), lda) ; i__3 = *m - i__ - nb + 1; i__4 = *n - i__ - nb + 1; dgemm_("No transpose", "No transpose", &i__3, &i__4, &nb, &c_b21, & work[nb + 1], &ldwrkx, &a_ref(i__, i__ + nb), lda, &c_b22, & a_ref(i__ + nb, i__ + nb), lda); /* Copy diagonal and off-diagonal elements of B back into A */ if (*m >= *n) { i__3 = i__ + nb - 1; for (j = i__; j <= i__3; ++j) { a_ref(j, j) = d__[j]; a_ref(j, j + 1) = e[j]; /* L10: */ } } else { i__3 = i__ + nb - 1; for (j = i__; j <= i__3; ++j) { a_ref(j, j) = d__[j]; a_ref(j + 1, j) = e[j]; /* L20: */ } } /* L30: */ } /* Use unblocked code to reduce the remainder of the matrix */ i__2 = *m - i__ + 1; i__1 = *n - i__ + 1; dgebd2_(&i__2, &i__1, &a_ref(i__, i__), lda, &d__[i__], &e[i__], &tauq[ i__], &taup[i__], &work[1], &iinfo); work[1] = ws; return 0; /* End of DGEBRD */ } /* dgebrd_ */ #undef a_ref #ifdef __cplusplus } #endif hypre-2.33.0/src/lapack/dgelq2.c000066400000000000000000000076301477326011500163060ustar00rootroot00000000000000/* Copyright (c) 1992-2008 The University of Tennessee. All rights reserved. * See file COPYING in this directory for details. */ #ifdef __cplusplus extern "C" { #endif #include "f2c.h" #include "hypre_lapack.h" /* Subroutine */ integer dgelq2_(integer *m, integer *n, doublereal *a, integer * lda, doublereal *tau, doublereal *work, integer *info) { /* -- LAPACK routine (version 3.0) -- Univ. of Tennessee, Univ. of California Berkeley, NAG Ltd., Courant Institute, Argonne National Lab, and Rice University February 29, 1992 Purpose ======= DGELQ2 computes an LQ factorization of a real m by n matrix A: A = L * Q. Arguments ========= M (input) INTEGER The number of rows of the matrix A. M >= 0. N (input) INTEGER The number of columns of the matrix A. N >= 0. A (input/output) DOUBLE PRECISION array, dimension (LDA,N) On entry, the m by n matrix A. On exit, the elements on and below the diagonal of the array contain the m by min(m,n) lower trapezoidal matrix L (L is lower triangular if m <= n); the elements above the diagonal, with the array TAU, represent the orthogonal matrix Q as a product of elementary reflectors (see Further Details). LDA (input) INTEGER The leading dimension of the array A. LDA >= max(1,M). TAU (output) DOUBLE PRECISION array, dimension (min(M,N)) The scalar factors of the elementary reflectors (see Further Details). WORK (workspace) DOUBLE PRECISION array, dimension (M) INFO (output) INTEGER = 0: successful exit < 0: if INFO = -i, the i-th argument had an illegal value Further Details =============== The matrix Q is represented as a product of elementary reflectors Q = H(k) . . . H(2) H(1), where k = min(m,n). Each H(i) has the form H(i) = I - tau * v * v' where tau is a real scalar, and v is a real vector with v(1:i-1) = 0 and v(i) = 1; v(i+1:n) is stored on exit in A(i,i+1:n), and tau in TAU(i). ===================================================================== Test the input arguments Parameter adjustments */ /* System generated locals */ integer a_dim1, a_offset, i__1, i__2, i__3; /* Local variables */ integer i__, k; extern /* Subroutine */ integer dlarf_(const char *, integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *, doublereal *), dlarfg_(integer *, doublereal *, doublereal *, integer *, doublereal *), xerbla_(const char *, integer *); doublereal aii; #define a_ref(a_1,a_2) a[(a_2)*a_dim1 + a_1] a_dim1 = *lda; a_offset = 1 + a_dim1 * 1; a -= a_offset; --tau; --work; /* Function Body */ *info = 0; if (*m < 0) { *info = -1; } else if (*n < 0) { *info = -2; } else if (*lda < max(1,*m)) { *info = -4; } if (*info != 0) { i__1 = -(*info); xerbla_("DGELQ2", &i__1); return 0; } k = min(*m,*n); i__1 = k; for (i__ = 1; i__ <= i__1; ++i__) { /* Generate elementary reflector H(i) to annihilate A(i,i+1:n) Computing MIN */ i__2 = i__ + 1; i__3 = *n - i__ + 1; dlarfg_(&i__3, &a_ref(i__, i__), &a_ref(i__, min(i__2,*n)), lda, &tau[ i__]); if (i__ < *m) { /* Apply H(i) to A(i+1:m,i:n) from the right */ aii = a_ref(i__, i__); a_ref(i__, i__) = 1.; i__2 = *m - i__; i__3 = *n - i__ + 1; dlarf_("Right", &i__2, &i__3, &a_ref(i__, i__), lda, &tau[i__], & a_ref(i__ + 1, i__), lda, &work[1]); a_ref(i__, i__) = aii; } /* L10: */ } return 0; /* End of DGELQ2 */ } /* dgelq2_ */ #undef a_ref #ifdef __cplusplus } #endif hypre-2.33.0/src/lapack/dgelqf.c000066400000000000000000000156421477326011500163740ustar00rootroot00000000000000/* Copyright (c) 1992-2008 The University of Tennessee. All rights reserved. * See file COPYING in this directory for details. */ #ifdef __cplusplus extern "C" { #endif #include "f2c.h" #include "hypre_lapack.h" /* Subroutine */ integer dgelqf_(integer *m, integer *n, doublereal *a, integer * lda, doublereal *tau, doublereal *work, integer *lwork, integer *info) { /* -- LAPACK routine (version 3.0) -- Univ. of Tennessee, Univ. of California Berkeley, NAG Ltd., Courant Institute, Argonne National Lab, and Rice University June 30, 1999 Purpose ======= DGELQF computes an LQ factorization of a real M-by-N matrix A: A = L * Q. Arguments ========= M (input) INTEGER The number of rows of the matrix A. M >= 0. N (input) INTEGER The number of columns of the matrix A. N >= 0. A (input/output) DOUBLE PRECISION array, dimension (LDA,N) On entry, the M-by-N matrix A. On exit, the elements on and below the diagonal of the array contain the m-by-min(m,n) lower trapezoidal matrix L (L is lower triangular if m <= n); the elements above the diagonal, with the array TAU, represent the orthogonal matrix Q as a product of elementary reflectors (see Further Details). LDA (input) INTEGER The leading dimension of the array A. LDA >= max(1,M). TAU (output) DOUBLE PRECISION array, dimension (min(M,N)) The scalar factors of the elementary reflectors (see Further Details). WORK (workspace/output) DOUBLE PRECISION array, dimension (LWORK) On exit, if INFO = 0, WORK(1) returns the optimal LWORK. LWORK (input) INTEGER The dimension of the array WORK. LWORK >= max(1,M). For optimum performance LWORK >= M*NB, where NB is the optimal blocksize. If LWORK = -1, then a workspace query is assumed; the routine only calculates the optimal size of the WORK array, returns this value as the first entry of the WORK array, and no error message related to LWORK is issued by XERBLA. INFO (output) INTEGER = 0: successful exit < 0: if INFO = -i, the i-th argument had an illegal value Further Details =============== The matrix Q is represented as a product of elementary reflectors Q = H(k) . . . H(2) H(1), where k = min(m,n). Each H(i) has the form H(i) = I - tau * v * v' where tau is a real scalar, and v is a real vector with v(1:i-1) = 0 and v(i) = 1; v(i+1:n) is stored on exit in A(i,i+1:n), and tau in TAU(i). ===================================================================== Test the input arguments Parameter adjustments */ /* Table of constant values */ integer c__1 = 1; integer c_n1 = -1; integer c__3 = 3; integer c__2 = 2; /* System generated locals */ integer a_dim1, a_offset, i__1, i__2, i__3, i__4; /* Local variables */ integer i__, k, nbmin, iinfo; extern /* Subroutine */ integer dgelq2_(integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *); integer ib, nb; extern /* Subroutine */ integer dlarfb_(const char *,const char *,const char *,const char *, integer *, integer *, integer *, doublereal *, integer *, doublereal *, integer *, doublereal *, integer *, doublereal *, integer *); integer nx; extern /* Subroutine */ integer dlarft_(const char *,const char *, integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *), xerbla_(const char *, integer *); extern integer ilaenv_(integer *,const char *,const char *, integer *, integer *, integer *, integer *, ftnlen, ftnlen); integer ldwork, lwkopt; logical lquery; integer iws; #define a_ref(a_1,a_2) a[(a_2)*a_dim1 + a_1] a_dim1 = *lda; a_offset = 1 + a_dim1 * 1; a -= a_offset; --tau; --work; /* Function Body */ *info = 0; nb = ilaenv_(&c__1, "DGELQF", " ", m, n, &c_n1, &c_n1, (ftnlen)6, (ftnlen) 1); lwkopt = *m * nb; work[1] = (doublereal) lwkopt; lquery = *lwork == -1; if (*m < 0) { *info = -1; } else if (*n < 0) { *info = -2; } else if (*lda < max(1,*m)) { *info = -4; } else if (*lwork < max(1,*m) && ! lquery) { *info = -7; } if (*info != 0) { i__1 = -(*info); xerbla_("DGELQF", &i__1); return 0; } else if (lquery) { return 0; } /* Quick return if possible */ k = min(*m,*n); if (k == 0) { work[1] = 1.; return 0; } nbmin = 2; nx = 0; iws = *m; if (nb > 1 && nb < k) { /* Determine when to cross over from blocked to unblocked code. Computing MAX */ i__1 = 0, i__2 = ilaenv_(&c__3, "DGELQF", " ", m, n, &c_n1, &c_n1, ( ftnlen)6, (ftnlen)1); nx = max(i__1,i__2); if (nx < k) { /* Determine if workspace is large enough for blocked code. */ ldwork = *m; iws = ldwork * nb; if (*lwork < iws) { /* Not enough workspace to use optimal NB: reduce NB and determine the minimum value of NB. */ nb = *lwork / ldwork; /* Computing MAX */ i__1 = 2, i__2 = ilaenv_(&c__2, "DGELQF", " ", m, n, &c_n1, & c_n1, (ftnlen)6, (ftnlen)1); nbmin = max(i__1,i__2); } } } if (nb >= nbmin && nb < k && nx < k) { /* Use blocked code initially */ i__1 = k - nx; i__2 = nb; for (i__ = 1; i__2 < 0 ? i__ >= i__1 : i__ <= i__1; i__ += i__2) { /* Computing MIN */ i__3 = k - i__ + 1; ib = min(i__3,nb); /* Compute the LQ factorization of the current block A(i:i+ib-1,i:n) */ i__3 = *n - i__ + 1; dgelq2_(&ib, &i__3, &a_ref(i__, i__), lda, &tau[i__], &work[1], & iinfo); if (i__ + ib <= *m) { /* Form the triangular factor of the block reflector H = H(i) H(i+1) . . . H(i+ib-1) */ i__3 = *n - i__ + 1; dlarft_("Forward", "Rowwise", &i__3, &ib, &a_ref(i__, i__), lda, &tau[i__], &work[1], &ldwork); /* Apply H to A(i+ib:m,i:n) from the right */ i__3 = *m - i__ - ib + 1; i__4 = *n - i__ + 1; dlarfb_("Right", "No transpose", "Forward", "Rowwise", &i__3, &i__4, &ib, &a_ref(i__, i__), lda, &work[1], &ldwork, &a_ref(i__ + ib, i__), lda, &work[ib + 1], &ldwork); } /* L10: */ } } else { i__ = 1; } /* Use unblocked code to factor the last or only block. */ if (i__ <= k) { i__2 = *m - i__ + 1; i__1 = *n - i__ + 1; dgelq2_(&i__2, &i__1, &a_ref(i__, i__), lda, &tau[i__], &work[1], & iinfo); } work[1] = (doublereal) iws; return 0; /* End of DGELQF */ } /* dgelqf_ */ #undef a_ref #ifdef __cplusplus } #endif hypre-2.33.0/src/lapack/dgels.c000066400000000000000000000334451477326011500162310ustar00rootroot00000000000000/* Copyright (c) 1992-2008 The University of Tennessee. All rights reserved. * See file COPYING in this directory for details. */ #ifdef __cplusplus extern "C" { #endif #include "f2c.h" #include "hypre_lapack.h" /* Subroutine */ integer dgels_(char *trans, integer *m, integer *n, integer * nrhs, doublereal *a, integer *lda, doublereal *b, integer *ldb, doublereal *work, integer *lwork, integer *info) { /* -- LAPACK driver routine (version 3.0) -- Univ. of Tennessee, Univ. of California Berkeley, NAG Ltd., Courant Institute, Argonne National Lab, and Rice University June 30, 1999 Purpose ======= DGELS solves overdetermined or underdetermined real linear systems involving an M-by-N matrix A, or its transpose, using a QR or LQ factorization of A. It is assumed that A has full rank. The following options are provided: 1. If TRANS = 'N' and m >= n: find the least squares solution of an overdetermined system, i.e., solve the least squares problem minimize || B - A*X ||. 2. If TRANS = 'N' and m < n: find the minimum norm solution of an underdetermined system A * X = B. 3. If TRANS = 'T' and m >= n: find the minimum norm solution of an undetermined system A**T * X = B. 4. If TRANS = 'T' and m < n: find the least squares solution of an overdetermined system, i.e., solve the least squares problem minimize || B - A**T * X ||. Several right hand side vectors b and solution vectors x can be handled in a single call; they are stored as the columns of the M-by-NRHS right hand side matrix B and the N-by-NRHS solution matrix X. Arguments ========= TRANS (input) CHARACTER = 'N': the linear system involves A; = 'T': the linear system involves A**T. M (input) INTEGER The number of rows of the matrix A. M >= 0. N (input) INTEGER The number of columns of the matrix A. N >= 0. NRHS (input) INTEGER The number of right hand sides, i.e., the number of columns of the matrices B and X. NRHS >=0. A (input/output) DOUBLE PRECISION array, dimension (LDA,N) On entry, the M-by-N matrix A. On exit, if M >= N, A is overwritten by details of its QR factorization as returned by DGEQRF; if M < N, A is overwritten by details of its LQ factorization as returned by DGELQF. LDA (input) INTEGER The leading dimension of the array A. LDA >= max(1,M). B (input/output) DOUBLE PRECISION array, dimension (LDB,NRHS) On entry, the matrix B of right hand side vectors, stored columnwise; B is M-by-NRHS if TRANS = 'N', or N-by-NRHS if TRANS = 'T'. On exit, B is overwritten by the solution vectors, stored columnwise: if TRANS = 'N' and m >= n, rows 1 to n of B contain the least squares solution vectors; the residual sum of squares for the solution in each column is given by the sum of squares of elements N+1 to M in that column; if TRANS = 'N' and m < n, rows 1 to N of B contain the minimum norm solution vectors; if TRANS = 'T' and m >= n, rows 1 to M of B contain the minimum norm solution vectors; if TRANS = 'T' and m < n, rows 1 to M of B contain the least squares solution vectors; the residual sum of squares for the solution in each column is given by the sum of squares of elements M+1 to N in that column. LDB (input) INTEGER The leading dimension of the array B. LDB >= MAX(1,M,N). WORK (workspace/output) DOUBLE PRECISION array, dimension (LWORK) On exit, if INFO = 0, WORK(1) returns the optimal LWORK. LWORK (input) INTEGER The dimension of the array WORK. LWORK >= max( 1, MN + max( MN, NRHS ) ). For optimal performance, LWORK >= max( 1, MN + max( MN, NRHS )*NB ). where MN = min(M,N) and NB is the optimum block size. If LWORK = -1, then a workspace query is assumed; the routine only calculates the optimal size of the WORK array, returns this value as the first entry of the WORK array, and no error message related to LWORK is issued by XERBLA. INFO (output) INTEGER = 0: successful exit < 0: if INFO = -i, the i-th argument had an illegal value ===================================================================== Test the input arguments. Parameter adjustments */ /* Table of constant values */ integer c__1 = 1; integer c_n1 = -1; doublereal c_b33 = 0.; integer c__0 = 0; doublereal c_b61 = 1.; /* System generated locals */ integer a_dim1, a_offset, b_dim1, b_offset, i__1, i__2; /* Local variables */ doublereal anrm, bnrm; integer brow; logical tpsd; integer i__, j, iascl, ibscl; extern logical lsame_(const char *,const char *); extern /* Subroutine */ integer dtrsm_(const char *,const char *,const char *,const char *, integer *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *); integer wsize; doublereal rwork[1]; extern /* Subroutine */ integer dlabad_(doublereal *, doublereal *); integer nb; extern doublereal dlamch_(const char *), dlange_(const char *, integer *, integer *, doublereal *, integer *, doublereal *); integer mn; extern /* Subroutine */ integer dgelqf_(integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *, integer *), dlascl_(const char *, integer *, integer *, doublereal *, doublereal *, integer *, integer *, doublereal *, integer *, integer *), dgeqrf_(integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *, integer *), dlaset_(const char *, integer *, integer *, doublereal *, doublereal *, doublereal *, integer *), xerbla_(const char *, integer *); extern integer ilaenv_(integer *,const char *,const char *, integer *, integer *, integer *, integer *, ftnlen, ftnlen); integer scllen; doublereal bignum; extern /* Subroutine */ integer dormlq_(const char *,const char *, integer *, integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *, integer *), dormqr_(const char *,const char *, integer *, integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *, integer *); doublereal smlnum; logical lquery; #define b_ref(a_1,a_2) b[(a_2)*b_dim1 + a_1] a_dim1 = *lda; a_offset = 1 + a_dim1 * 1; a -= a_offset; b_dim1 = *ldb; b_offset = 1 + b_dim1 * 1; b -= b_offset; --work; /* Function Body */ *info = 0; mn = min(*m,*n); lquery = *lwork == -1; if (! (lsame_(trans, "N") || lsame_(trans, "T"))) { *info = -1; } else if (*m < 0) { *info = -2; } else if (*n < 0) { *info = -3; } else if (*nrhs < 0) { *info = -4; } else if (*lda < max(1,*m)) { *info = -6; } else /* if(complicated condition) */ { /* Computing MAX */ i__1 = max(1,*m); if (*ldb < max(i__1,*n)) { *info = -8; } else /* if(complicated condition) */ { /* Computing MAX */ i__1 = 1, i__2 = mn + max(mn,*nrhs); if (*lwork < max(i__1,i__2) && ! lquery) { *info = -10; } } } /* Figure out optimal block size */ if (*info == 0 || *info == -10) { tpsd = TRUE_; if (lsame_(trans, "N")) { tpsd = FALSE_; } if (*m >= *n) { nb = ilaenv_(&c__1, "DGEQRF", " ", m, n, &c_n1, &c_n1, (ftnlen)6, (ftnlen)1); if (tpsd) { /* Computing MAX */ i__1 = nb, i__2 = ilaenv_(&c__1, "DORMQR", "LN", m, nrhs, n, & c_n1, (ftnlen)6, (ftnlen)2); nb = max(i__1,i__2); } else { /* Computing MAX */ i__1 = nb, i__2 = ilaenv_(&c__1, "DORMQR", "LT", m, nrhs, n, & c_n1, (ftnlen)6, (ftnlen)2); nb = max(i__1,i__2); } } else { nb = ilaenv_(&c__1, "DGELQF", " ", m, n, &c_n1, &c_n1, (ftnlen)6, (ftnlen)1); if (tpsd) { /* Computing MAX */ i__1 = nb, i__2 = ilaenv_(&c__1, "DORMLQ", "LT", n, nrhs, m, & c_n1, (ftnlen)6, (ftnlen)2); nb = max(i__1,i__2); } else { /* Computing MAX */ i__1 = nb, i__2 = ilaenv_(&c__1, "DORMLQ", "LN", n, nrhs, m, & c_n1, (ftnlen)6, (ftnlen)2); nb = max(i__1,i__2); } } /* Computing MAX */ i__1 = 1, i__2 = mn + max(mn,*nrhs) * nb; wsize = max(i__1,i__2); work[1] = (doublereal) wsize; } if (*info != 0) { i__1 = -(*info); xerbla_("DGELS ", &i__1); return 0; } else if (lquery) { return 0; } /* Quick return if possible Computing MIN */ i__1 = min(*m,*n); if (min(i__1,*nrhs) == 0) { i__1 = max(*m,*n); dlaset_("Full", &i__1, nrhs, &c_b33, &c_b33, &b[b_offset], ldb); return 0; } /* Get machine parameters */ smlnum = dlamch_("S") / dlamch_("P"); bignum = 1. / smlnum; dlabad_(&smlnum, &bignum); /* Scale A, B if max element outside range [SMLNUM,BIGNUM] */ anrm = dlange_("M", m, n, &a[a_offset], lda, rwork); iascl = 0; if (anrm > 0. && anrm < smlnum) { /* Scale matrix norm up to SMLNUM */ dlascl_("G", &c__0, &c__0, &anrm, &smlnum, m, n, &a[a_offset], lda, info); iascl = 1; } else if (anrm > bignum) { /* Scale matrix norm down to BIGNUM */ dlascl_("G", &c__0, &c__0, &anrm, &bignum, m, n, &a[a_offset], lda, info); iascl = 2; } else if (anrm == 0.) { /* Matrix all zero. Return zero solution. */ i__1 = max(*m,*n); dlaset_("F", &i__1, nrhs, &c_b33, &c_b33, &b[b_offset], ldb); goto L50; } brow = *m; if (tpsd) { brow = *n; } bnrm = dlange_("M", &brow, nrhs, &b[b_offset], ldb, rwork); ibscl = 0; if (bnrm > 0. && bnrm < smlnum) { /* Scale matrix norm up to SMLNUM */ dlascl_("G", &c__0, &c__0, &bnrm, &smlnum, &brow, nrhs, &b[b_offset], ldb, info); ibscl = 1; } else if (bnrm > bignum) { /* Scale matrix norm down to BIGNUM */ dlascl_("G", &c__0, &c__0, &bnrm, &bignum, &brow, nrhs, &b[b_offset], ldb, info); ibscl = 2; } if (*m >= *n) { /* compute QR factorization of A */ i__1 = *lwork - mn; dgeqrf_(m, n, &a[a_offset], lda, &work[1], &work[mn + 1], &i__1, info) ; /* workspace at least N, optimally N*NB */ if (! tpsd) { /* Least-Squares Problem min || A * X - B || B(1:M,1:NRHS) := Q' * B(1:M,1:NRHS) */ i__1 = *lwork - mn; dormqr_("Left", "Transpose", m, nrhs, n, &a[a_offset], lda, &work[ 1], &b[b_offset], ldb, &work[mn + 1], &i__1, info); /* workspace at least NRHS, optimally NRHS*NB B(1:N,1:NRHS) := inv(R) * B(1:N,1:NRHS) */ dtrsm_("Left", "Upper", "No transpose", "Non-unit", n, nrhs, & c_b61, &a[a_offset], lda, &b[b_offset], ldb); scllen = *n; } else { /* Overdetermined system of equations A' * X = B B(1:N,1:NRHS) := inv(R') * B(1:N,1:NRHS) */ dtrsm_("Left", "Upper", "Transpose", "Non-unit", n, nrhs, &c_b61, &a[a_offset], lda, &b[b_offset], ldb); /* B(N+1:M,1:NRHS) = ZERO */ i__1 = *nrhs; for (j = 1; j <= i__1; ++j) { i__2 = *m; for (i__ = *n + 1; i__ <= i__2; ++i__) { b_ref(i__, j) = 0.; /* L10: */ } /* L20: */ } /* B(1:M,1:NRHS) := Q(1:N,:) * B(1:N,1:NRHS) */ i__1 = *lwork - mn; dormqr_("Left", "No transpose", m, nrhs, n, &a[a_offset], lda, & work[1], &b[b_offset], ldb, &work[mn + 1], &i__1, info); /* workspace at least NRHS, optimally NRHS*NB */ scllen = *m; } } else { /* Compute LQ factorization of A */ i__1 = *lwork - mn; dgelqf_(m, n, &a[a_offset], lda, &work[1], &work[mn + 1], &i__1, info) ; /* workspace at least M, optimally M*NB. */ if (! tpsd) { /* underdetermined system of equations A * X = B B(1:M,1:NRHS) := inv(L) * B(1:M,1:NRHS) */ dtrsm_("Left", "Lower", "No transpose", "Non-unit", m, nrhs, & c_b61, &a[a_offset], lda, &b[b_offset], ldb); /* B(M+1:N,1:NRHS) = 0 */ i__1 = *nrhs; for (j = 1; j <= i__1; ++j) { i__2 = *n; for (i__ = *m + 1; i__ <= i__2; ++i__) { b_ref(i__, j) = 0.; /* L30: */ } /* L40: */ } /* B(1:N,1:NRHS) := Q(1:N,:)' * B(1:M,1:NRHS) */ i__1 = *lwork - mn; dormlq_("Left", "Transpose", n, nrhs, m, &a[a_offset], lda, &work[ 1], &b[b_offset], ldb, &work[mn + 1], &i__1, info); /* workspace at least NRHS, optimally NRHS*NB */ scllen = *n; } else { /* overdetermined system min || A' * X - B || B(1:N,1:NRHS) := Q * B(1:N,1:NRHS) */ i__1 = *lwork - mn; dormlq_("Left", "No transpose", n, nrhs, m, &a[a_offset], lda, & work[1], &b[b_offset], ldb, &work[mn + 1], &i__1, info); /* workspace at least NRHS, optimally NRHS*NB B(1:M,1:NRHS) := inv(L') * B(1:M,1:NRHS) */ dtrsm_("Left", "Lower", "Transpose", "Non-unit", m, nrhs, &c_b61, &a[a_offset], lda, &b[b_offset], ldb); scllen = *m; } } /* Undo scaling */ if (iascl == 1) { dlascl_("G", &c__0, &c__0, &anrm, &smlnum, &scllen, nrhs, &b[b_offset] , ldb, info); } else if (iascl == 2) { dlascl_("G", &c__0, &c__0, &anrm, &bignum, &scllen, nrhs, &b[b_offset] , ldb, info); } if (ibscl == 1) { dlascl_("G", &c__0, &c__0, &smlnum, &bnrm, &scllen, nrhs, &b[b_offset] , ldb, info); } else if (ibscl == 2) { dlascl_("G", &c__0, &c__0, &bignum, &bnrm, &scllen, nrhs, &b[b_offset] , ldb, info); } L50: work[1] = (doublereal) wsize; return 0; /* End of DGELS */ } /* dgels_ */ #undef b_ref #ifdef __cplusplus } #endif hypre-2.33.0/src/lapack/dgeqr2.c000066400000000000000000000075211477326011500163130ustar00rootroot00000000000000/* Copyright (c) 1992-2008 The University of Tennessee. All rights reserved. * See file COPYING in this directory for details. */ #ifdef __cplusplus extern "C" { #endif #include "f2c.h" #include "hypre_lapack.h" /* Subroutine */ integer dgeqr2_(integer *m, integer *n, doublereal *a, integer * lda, doublereal *tau, doublereal *work, integer *info) { /* -- LAPACK routine (version 3.0) -- Univ. of Tennessee, Univ. of California Berkeley, NAG Ltd., Courant Institute, Argonne National Lab, and Rice University February 29, 1992 Purpose ======= DGEQR2 computes a QR factorization of a real m by n matrix A: A = Q * R. Arguments ========= M (input) INTEGER The number of rows of the matrix A. M >= 0. N (input) INTEGER The number of columns of the matrix A. N >= 0. A (input/output) DOUBLE PRECISION array, dimension (LDA,N) On entry, the m by n matrix A. On exit, the elements on and above the diagonal of the array contain the min(m,n) by n upper trapezoidal matrix R (R is upper triangular if m >= n); the elements below the diagonal, with the array TAU, represent the orthogonal matrix Q as a product of elementary reflectors (see Further Details). LDA (input) INTEGER The leading dimension of the array A. LDA >= max(1,M). TAU (output) DOUBLE PRECISION array, dimension (min(M,N)) The scalar factors of the elementary reflectors (see Further Details). WORK (workspace) DOUBLE PRECISION array, dimension (N) INFO (output) INTEGER = 0: successful exit < 0: if INFO = -i, the i-th argument had an illegal value Further Details =============== The matrix Q is represented as a product of elementary reflectors Q = H(1) H(2) . . . H(k), where k = min(m,n). Each H(i) has the form H(i) = I - tau * v * v' where tau is a real scalar, and v is a real vector with v(1:i-1) = 0 and v(i) = 1; v(i+1:m) is stored on exit in A(i+1:m,i), and tau in TAU(i). ===================================================================== Test the input arguments Parameter adjustments */ /* Table of constant values */ integer c__1 = 1; /* System generated locals */ integer a_dim1, a_offset, i__1, i__2, i__3; /* Local variables */ integer i__, k; extern /* Subroutine */ integer dlarf_(const char *, integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *, doublereal *), dlarfg_(integer *, doublereal *, doublereal *, integer *, doublereal *), xerbla_(const char *, integer *); doublereal aii; #define a_ref(a_1,a_2) a[(a_2)*a_dim1 + a_1] a_dim1 = *lda; a_offset = 1 + a_dim1 * 1; a -= a_offset; --tau; --work; /* Function Body */ *info = 0; if (*m < 0) { *info = -1; } else if (*n < 0) { *info = -2; } else if (*lda < max(1,*m)) { *info = -4; } if (*info != 0) { i__1 = -(*info); xerbla_("DGEQR2", &i__1); return 0; } k = min(*m,*n); i__1 = k; for (i__ = 1; i__ <= i__1; ++i__) { /* Generate elementary reflector H(i) to annihilate A(i+1:m,i) Computing MIN */ i__2 = i__ + 1; i__3 = *m - i__ + 1; dlarfg_(&i__3, &a_ref(i__, i__), &a_ref(min(i__2,*m), i__), &c__1, & tau[i__]); if (i__ < *n) { /* Apply H(i) to A(i:m,i+1:n) from the left */ aii = a_ref(i__, i__); a_ref(i__, i__) = 1.; i__2 = *m - i__ + 1; i__3 = *n - i__; dlarf_("Left", &i__2, &i__3, &a_ref(i__, i__), &c__1, &tau[i__], & a_ref(i__, i__ + 1), lda, &work[1]); a_ref(i__, i__) = aii; } /* L10: */ } return 0; /* End of DGEQR2 */ } /* dgeqr2_ */ #undef a_ref #ifdef __cplusplus } #endif hypre-2.33.0/src/lapack/dgeqrf.c000066400000000000000000000154021477326011500163740ustar00rootroot00000000000000/* Copyright (c) 1992-2008 The University of Tennessee. All rights reserved. * See file COPYING in this directory for details. */ #ifdef __cplusplus extern "C" { #endif #include "f2c.h" #include "hypre_lapack.h" /* Subroutine */ integer dgeqrf_(integer *m, integer *n, doublereal *a, integer * lda, doublereal *tau, doublereal *work, integer *lwork, integer *info) { /* -- LAPACK routine (version 3.0) -- Univ. of Tennessee, Univ. of California Berkeley, NAG Ltd., Courant Institute, Argonne National Lab, and Rice University June 30, 1999 Purpose ======= DGEQRF computes a QR factorization of a real M-by-N matrix A: A = Q * R. Arguments ========= M (input) INTEGER The number of rows of the matrix A. M >= 0. N (input) INTEGER The number of columns of the matrix A. N >= 0. A (input/output) DOUBLE PRECISION array, dimension (LDA,N) On entry, the M-by-N matrix A. On exit, the elements on and above the diagonal of the array contain the min(M,N)-by-N upper trapezoidal matrix R (R is upper triangular if m >= n); the elements below the diagonal, with the array TAU, represent the orthogonal matrix Q as a product of min(m,n) elementary reflectors (see Further Details). LDA (input) INTEGER The leading dimension of the array A. LDA >= max(1,M). TAU (output) DOUBLE PRECISION array, dimension (min(M,N)) The scalar factors of the elementary reflectors (see Further Details). WORK (workspace/output) DOUBLE PRECISION array, dimension (LWORK) On exit, if INFO = 0, WORK(1) returns the optimal LWORK. LWORK (input) INTEGER The dimension of the array WORK. LWORK >= max(1,N). For optimum performance LWORK >= N*NB, where NB is the optimal blocksize. If LWORK = -1, then a workspace query is assumed; the routine only calculates the optimal size of the WORK array, returns this value as the first entry of the WORK array, and no error message related to LWORK is issued by XERBLA. INFO (output) INTEGER = 0: successful exit < 0: if INFO = -i, the i-th argument had an illegal value Further Details =============== The matrix Q is represented as a product of elementary reflectors Q = H(1) H(2) . . . H(k), where k = min(m,n). Each H(i) has the form H(i) = I - tau * v * v' where tau is a real scalar, and v is a real vector with v(1:i-1) = 0 and v(i) = 1; v(i+1:m) is stored on exit in A(i+1:m,i), and tau in TAU(i). ===================================================================== Test the input arguments Parameter adjustments */ /* Table of constant values */ integer c__1 = 1; integer c_n1 = -1; integer c__3 = 3; integer c__2 = 2; /* System generated locals */ integer a_dim1, a_offset, i__1, i__2, i__3, i__4; /* Local variables */ integer i__, k, nbmin, iinfo; extern /* Subroutine */ integer dgeqr2_(integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *); integer ib, nb; extern /* Subroutine */ integer dlarfb_(const char *,const char *,const char *,const char *, integer *, integer *, integer *, doublereal *, integer *, doublereal *, integer *, doublereal *, integer *, doublereal *, integer *); integer nx; extern /* Subroutine */ integer dlarft_(const char *,const char *, integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *), xerbla_(const char *, integer *); extern integer ilaenv_(integer *,const char *,const char *, integer *, integer *, integer *, integer *, ftnlen, ftnlen); integer ldwork, lwkopt; logical lquery; integer iws; #define a_ref(a_1,a_2) a[(a_2)*a_dim1 + a_1] a_dim1 = *lda; a_offset = 1 + a_dim1 * 1; a -= a_offset; --tau; --work; /* Function Body */ *info = 0; nb = ilaenv_(&c__1, "DGEQRF", " ", m, n, &c_n1, &c_n1, (ftnlen)6, (ftnlen) 1); lwkopt = *n * nb; work[1] = (doublereal) lwkopt; lquery = *lwork == -1; if (*m < 0) { *info = -1; } else if (*n < 0) { *info = -2; } else if (*lda < max(1,*m)) { *info = -4; } else if (*lwork < max(1,*n) && ! lquery) { *info = -7; } if (*info != 0) { i__1 = -(*info); xerbla_("DGEQRF", &i__1); return 0; } else if (lquery) { return 0; } /* Quick return if possible */ k = min(*m,*n); if (k == 0) { work[1] = 1.; return 0; } nbmin = 2; nx = 0; iws = *n; if (nb > 1 && nb < k) { /* Determine when to cross over from blocked to unblocked code. Computing MAX */ i__1 = 0, i__2 = ilaenv_(&c__3, "DGEQRF", " ", m, n, &c_n1, &c_n1, ( ftnlen)6, (ftnlen)1); nx = max(i__1,i__2); if (nx < k) { /* Determine if workspace is large enough for blocked code. */ ldwork = *n; iws = ldwork * nb; if (*lwork < iws) { /* Not enough workspace to use optimal NB: reduce NB and determine the minimum value of NB. */ nb = *lwork / ldwork; /* Computing MAX */ i__1 = 2, i__2 = ilaenv_(&c__2, "DGEQRF", " ", m, n, &c_n1, & c_n1, (ftnlen)6, (ftnlen)1); nbmin = max(i__1,i__2); } } } if (nb >= nbmin && nb < k && nx < k) { /* Use blocked code initially */ i__1 = k - nx; i__2 = nb; for (i__ = 1; i__2 < 0 ? i__ >= i__1 : i__ <= i__1; i__ += i__2) { /* Computing MIN */ i__3 = k - i__ + 1; ib = min(i__3,nb); /* Compute the QR factorization of the current block A(i:m,i:i+ib-1) */ i__3 = *m - i__ + 1; dgeqr2_(&i__3, &ib, &a_ref(i__, i__), lda, &tau[i__], &work[1], & iinfo); if (i__ + ib <= *n) { /* Form the triangular factor of the block reflector H = H(i) H(i+1) . . . H(i+ib-1) */ i__3 = *m - i__ + 1; dlarft_("Forward", "Columnwise", &i__3, &ib, &a_ref(i__, i__), lda, &tau[i__], &work[1], &ldwork); /* Apply H' to A(i:m,i+ib:n) from the left */ i__3 = *m - i__ + 1; i__4 = *n - i__ - ib + 1; dlarfb_("Left", "Transpose", "Forward", "Columnwise", &i__3, & i__4, &ib, &a_ref(i__, i__), lda, &work[1], &ldwork, & a_ref(i__, i__ + ib), lda, &work[ib + 1], &ldwork); } /* L10: */ } } else { i__ = 1; } /* Use unblocked code to factor the last or only block. */ if (i__ <= k) { i__2 = *m - i__ + 1; i__1 = *n - i__ + 1; dgeqr2_(&i__2, &i__1, &a_ref(i__, i__), lda, &tau[i__], &work[1], & iinfo); } work[1] = (doublereal) iws; return 0; /* End of DGEQRF */ } /* dgeqrf_ */ #undef a_ref #ifdef __cplusplus } #endif hypre-2.33.0/src/lapack/dgesvd.c000066400000000000000000003737011477326011500164110ustar00rootroot00000000000000/* Copyright (c) 1992-2008 The University of Tennessee. All rights reserved. * See file COPYING in this directory for details. */ #ifdef __cplusplus extern "C" { #endif #include "f2c.h" #include "hypre_lapack.h" /* -- translated by f2c (version 19990503). You must link the resulting object file with the libraries: -lf2c -lm (in that order) */ /* Subroutine */ integer dgesvd_(char *jobu, char *jobvt, integer *m, integer *n, doublereal *a, integer *lda, doublereal *s, doublereal *u, integer * ldu, doublereal *vt, integer *ldvt, doublereal *work, integer *lwork, integer *info) { /* System generated locals */ address a__1[2]; integer a_dim1, a_offset, u_dim1, u_offset, vt_dim1, vt_offset, i__1[2], i__2, i__3, i__4; char ch__1[2]; /* Builtin functions Subroutine */ integer s_cat(char *, char **, integer *, integer *, ftnlen); /* Local variables */ integer iscl; doublereal anrm; integer ierr, itau, ncvt, nrvt, i__; extern /* Subroutine */ integer dgemm_(const char *,const char *, integer *, integer *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *); extern logical lsame_(const char *,const char *); integer chunk, minmn, wrkbl = 0, itaup, itauq, mnthr, iwork; logical wntua, wntva, wntun, wntuo, wntvn, wntvo, wntus, wntvs; integer ie = 0; extern /* Subroutine */ integer dgebrd_(integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, doublereal *, doublereal *, doublereal *, integer *, integer *); extern doublereal dlamch_(const char *), dlange_(const char *, integer *, integer *, doublereal *, integer *, doublereal *); integer ir, bdspac = 0, iu; extern /* Subroutine */ integer dgelqf_(integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *, integer *), dlascl_(const char *, integer *, integer *, doublereal *, doublereal *, integer *, integer *, doublereal *, integer *, integer *), dgeqrf_(integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *, integer *), dlacpy_(const char *, integer *, integer *, doublereal *, integer *, doublereal *, integer *), dlaset_(const char *, integer *, integer *, doublereal *, doublereal *, doublereal *, integer *), dbdsqr_(const char *, integer *, integer *, integer *, integer *, doublereal *, doublereal *, doublereal *, integer *, doublereal *, integer *, doublereal *, integer *, doublereal *, integer *), dorgbr_(const char *, integer *, integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *, integer *); doublereal bignum; extern /* Subroutine */ integer xerbla_(const char *, integer *); extern integer ilaenv_(integer *,const char *,const char *, integer *, integer *, integer *, integer *, ftnlen, ftnlen); extern /* Subroutine */ integer dormbr_(const char *,const char *,const char *, integer *, integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *, integer *), dorglq_(integer *, integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *, integer *), dorgqr_(integer *, integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *, integer *); integer ldwrkr, minwrk, ldwrku, maxwrk; doublereal smlnum; logical lquery, wntuas, wntvas; integer blk, ncu; doublereal dum[1], eps; integer nru; /* Table of constant values */ integer c__6 = 6; integer c__0 = 0; integer c__2 = 2; integer c__1 = 1; integer c_n1 = -1; doublereal c_b416 = 0.; doublereal c_b438 = 1.; #define a_ref(a_1,a_2) a[(a_2)*a_dim1 + a_1] #define u_ref(a_1,a_2) u[(a_2)*u_dim1 + a_1] #define vt_ref(a_1,a_2) vt[(a_2)*vt_dim1 + a_1] /* -- LAPACK driver routine (version 3.0) -- Univ. of Tennessee, Univ. of California Berkeley, NAG Ltd., Courant Institute, Argonne National Lab, and Rice University October 31, 1999 Purpose ======= DGESVD computes the singular value decomposition (SVD) of a real M-by-N matrix A, optionally computing the left and/or right singular vectors. The SVD is written A = U * SIGMA * transpose(V) where SIGMA is an M-by-N matrix which is zero except for its min(m,n) diagonal elements, U is an M-by-M orthogonal matrix, and V is an N-by-N orthogonal matrix. The diagonal elements of SIGMA are the singular values of A; they are real and non-negative, and are returned in descending order. The first min(m,n) columns of U and V are the left and right singular vectors of A. Note that the routine returns V**T, not V. Arguments ========= JOBU (input) CHARACTER*1 Specifies options for computing all or part of the matrix U: = 'A': all M columns of U are returned in array U: = 'S': the first min(m,n) columns of U (the left singular vectors) are returned in the array U; = 'O': the first min(m,n) columns of U (the left singular vectors) are overwritten on the array A; = 'N': no columns of U (no left singular vectors) are computed. JOBVT (input) CHARACTER*1 Specifies options for computing all or part of the matrix V**T: = 'A': all N rows of V**T are returned in the array VT; = 'S': the first min(m,n) rows of V**T (the right singular vectors) are returned in the array VT; = 'O': the first min(m,n) rows of V**T (the right singular vectors) are overwritten on the array A; = 'N': no rows of V**T (no right singular vectors) are computed. JOBVT and JOBU cannot both be 'O'. M (input) INTEGER The number of rows of the input matrix A. M >= 0. N (input) INTEGER The number of columns of the input matrix A. N >= 0. A (input/output) DOUBLE PRECISION array, dimension (LDA,N) On entry, the M-by-N matrix A. On exit, if JOBU = 'O', A is overwritten with the first min(m,n) columns of U (the left singular vectors, stored columnwise); if JOBVT = 'O', A is overwritten with the first min(m,n) rows of V**T (the right singular vectors, stored rowwise); if JOBU .ne. 'O' and JOBVT .ne. 'O', the contents of A are destroyed. LDA (input) INTEGER The leading dimension of the array A. LDA >= max(1,M). S (output) DOUBLE PRECISION array, dimension (min(M,N)) The singular values of A, sorted so that S(i) >= S(i+1). U (output) DOUBLE PRECISION array, dimension (LDU,UCOL) (LDU,M) if JOBU = 'A' or (LDU,min(M,N)) if JOBU = 'S'. If JOBU = 'A', U contains the M-by-M orthogonal matrix U; if JOBU = 'S', U contains the first min(m,n) columns of U (the left singular vectors, stored columnwise); if JOBU = 'N' or 'O', U is not referenced. LDU (input) INTEGER The leading dimension of the array U. LDU >= 1; if JOBU = 'S' or 'A', LDU >= M. VT (output) DOUBLE PRECISION array, dimension (LDVT,N) If JOBVT = 'A', VT contains the N-by-N orthogonal matrix V**T; if JOBVT = 'S', VT contains the first min(m,n) rows of V**T (the right singular vectors, stored rowwise); if JOBVT = 'N' or 'O', VT is not referenced. LDVT (input) INTEGER The leading dimension of the array VT. LDVT >= 1; if JOBVT = 'A', LDVT >= N; if JOBVT = 'S', LDVT >= min(M,N). WORK (workspace/output) DOUBLE PRECISION array, dimension (LWORK) On exit, if INFO = 0, WORK(1) returns the optimal LWORK; if INFO > 0, WORK(2:MIN(M,N)) contains the unconverged superdiagonal elements of an upper bidiagonal matrix B whose diagonal is in S (not necessarily sorted). B satisfies A = U * B * VT, so it has the same singular values as A, and singular vectors related by U and VT. LWORK (input) INTEGER The dimension of the array WORK. LWORK >= 1. LWORK >= MAX(3*MIN(M,N)+MAX(M,N),5*MIN(M,N)). For good performance, LWORK should generally be larger. If LWORK = -1, then a workspace query is assumed; the routine only calculates the optimal size of the WORK array, returns this value as the first entry of the WORK array, and no error message related to LWORK is issued by XERBLA. INFO (output) INTEGER = 0: successful exit. < 0: if INFO = -i, the i-th argument had an illegal value. > 0: if DBDSQR did not converge, INFO specifies how many superdiagonals of an intermediate bidiagonal form B did not converge to zero. See the description of WORK above for details. ===================================================================== Test the input arguments Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1 * 1; a -= a_offset; --s; u_dim1 = *ldu; u_offset = 1 + u_dim1 * 1; u -= u_offset; vt_dim1 = *ldvt; vt_offset = 1 + vt_dim1 * 1; vt -= vt_offset; --work; /* Function Body */ *info = 0; minmn = min(*m,*n); /* Writing concatenation */ i__1[0] = 1, a__1[0] = jobu; i__1[1] = 1, a__1[1] = jobvt; s_cat(ch__1, a__1, i__1, &c__2, (ftnlen)2); mnthr = ilaenv_(&c__6, "DGESVD", ch__1, m, n, &c__0, &c__0, (ftnlen)6, ( ftnlen)2); wntua = lsame_(jobu, "A"); wntus = lsame_(jobu, "S"); wntuas = wntua || wntus; wntuo = lsame_(jobu, "O"); wntun = lsame_(jobu, "N"); wntva = lsame_(jobvt, "A"); wntvs = lsame_(jobvt, "S"); wntvas = wntva || wntvs; wntvo = lsame_(jobvt, "O"); wntvn = lsame_(jobvt, "N"); minwrk = 1; maxwrk = minwrk; lquery = *lwork == -1; if (! (wntua || wntus || wntuo || wntun)) { *info = -1; } else if (! (wntva || wntvs || wntvo || wntvn) || (wntvo && wntuo)) { *info = -2; } else if (*m < 0) { *info = -3; } else if (*n < 0) { *info = -4; } else if (*lda < max(1,*m)) { *info = -6; } else if (*ldu < 1 || (wntuas && *ldu < *m)) { *info = -9; } else if (*ldvt < 1 || (wntva && *ldvt < *n) || (wntvs && *ldvt < minmn)) { *info = -11; } /* Compute workspace (Note: Comments in the code beginning "Workspace:" describe the minimal amount of workspace needed at that point in the code, as well as the preferred amount for good performance. NB refers to the optimal block size for the immediately following subroutine, as returned by ILAENV.) */ if (*info == 0 && (*lwork >= 1 || lquery) && *m > 0 && *n > 0) { if (*m >= *n) { /* Compute space needed for DBDSQR */ bdspac = *n * 5; if (*m >= mnthr) { if (wntun) { /* Path 1 (M much larger than N, JOBU='N') */ maxwrk = *n + *n * ilaenv_(&c__1, "DGEQRF", " ", m, n, & c_n1, &c_n1, (ftnlen)6, (ftnlen)1); /* Computing MAX */ i__2 = maxwrk, i__3 = *n * 3 + (*n << 1) * ilaenv_(&c__1, "DGEBRD", " ", n, n, &c_n1, &c_n1, (ftnlen)6, ( ftnlen)1); maxwrk = max(i__2,i__3); if (wntvo || wntvas) { /* Computing MAX */ i__2 = maxwrk, i__3 = *n * 3 + (*n - 1) * ilaenv_(& c__1, "DORGBR", "P", n, n, n, &c_n1, (ftnlen) 6, (ftnlen)1); maxwrk = max(i__2,i__3); } maxwrk = max(maxwrk,bdspac); /* Computing MAX */ i__2 = *n << 2; minwrk = max(i__2,bdspac); maxwrk = max(maxwrk,minwrk); } else if (wntuo && wntvn) { /* Path 2 (M much larger than N, JOBU='O', JOBVT='N') */ wrkbl = *n + *n * ilaenv_(&c__1, "DGEQRF", " ", m, n, & c_n1, &c_n1, (ftnlen)6, (ftnlen)1); /* Computing MAX */ i__2 = wrkbl, i__3 = *n + *n * ilaenv_(&c__1, "DORGQR", " ", m, n, n, &c_n1, (ftnlen)6, (ftnlen)1); wrkbl = max(i__2,i__3); /* Computing MAX */ i__2 = wrkbl, i__3 = *n * 3 + (*n << 1) * ilaenv_(&c__1, "DGEBRD", " ", n, n, &c_n1, &c_n1, (ftnlen)6, ( ftnlen)1); wrkbl = max(i__2,i__3); /* Computing MAX */ i__2 = wrkbl, i__3 = *n * 3 + *n * ilaenv_(&c__1, "DORGBR" , "Q", n, n, n, &c_n1, (ftnlen)6, (ftnlen)1); wrkbl = max(i__2,i__3); wrkbl = max(wrkbl,bdspac); /* Computing MAX */ i__2 = *n * *n + wrkbl, i__3 = *n * *n + *m * *n + *n; maxwrk = max(i__2,i__3); /* Computing MAX */ i__2 = *n * 3 + *m; minwrk = max(i__2,bdspac); maxwrk = max(maxwrk,minwrk); } else if (wntuo && wntvas) { /* Path 3 (M much larger than N, JOBU='O', JOBVT='S' or 'A') */ wrkbl = *n + *n * ilaenv_(&c__1, "DGEQRF", " ", m, n, & c_n1, &c_n1, (ftnlen)6, (ftnlen)1); /* Computing MAX */ i__2 = wrkbl, i__3 = *n + *n * ilaenv_(&c__1, "DORGQR", " ", m, n, n, &c_n1, (ftnlen)6, (ftnlen)1); wrkbl = max(i__2,i__3); /* Computing MAX */ i__2 = wrkbl, i__3 = *n * 3 + (*n << 1) * ilaenv_(&c__1, "DGEBRD", " ", n, n, &c_n1, &c_n1, (ftnlen)6, ( ftnlen)1); wrkbl = max(i__2,i__3); /* Computing MAX */ i__2 = wrkbl, i__3 = *n * 3 + *n * ilaenv_(&c__1, "DORGBR" , "Q", n, n, n, &c_n1, (ftnlen)6, (ftnlen)1); wrkbl = max(i__2,i__3); /* Computing MAX */ i__2 = wrkbl, i__3 = *n * 3 + (*n - 1) * ilaenv_(&c__1, "DORGBR", "P", n, n, n, &c_n1, (ftnlen)6, (ftnlen) 1); wrkbl = max(i__2,i__3); wrkbl = max(wrkbl,bdspac); /* Computing MAX */ i__2 = *n * *n + wrkbl, i__3 = *n * *n + *m * *n + *n; maxwrk = max(i__2,i__3); /* Computing MAX */ i__2 = *n * 3 + *m; minwrk = max(i__2,bdspac); maxwrk = max(maxwrk,minwrk); } else if (wntus && wntvn) { /* Path 4 (M much larger than N, JOBU='S', JOBVT='N') */ wrkbl = *n + *n * ilaenv_(&c__1, "DGEQRF", " ", m, n, & c_n1, &c_n1, (ftnlen)6, (ftnlen)1); /* Computing MAX */ i__2 = wrkbl, i__3 = *n + *n * ilaenv_(&c__1, "DORGQR", " ", m, n, n, &c_n1, (ftnlen)6, (ftnlen)1); wrkbl = max(i__2,i__3); /* Computing MAX */ i__2 = wrkbl, i__3 = *n * 3 + (*n << 1) * ilaenv_(&c__1, "DGEBRD", " ", n, n, &c_n1, &c_n1, (ftnlen)6, ( ftnlen)1); wrkbl = max(i__2,i__3); /* Computing MAX */ i__2 = wrkbl, i__3 = *n * 3 + *n * ilaenv_(&c__1, "DORGBR" , "Q", n, n, n, &c_n1, (ftnlen)6, (ftnlen)1); wrkbl = max(i__2,i__3); wrkbl = max(wrkbl,bdspac); maxwrk = *n * *n + wrkbl; /* Computing MAX */ i__2 = *n * 3 + *m; minwrk = max(i__2,bdspac); maxwrk = max(maxwrk,minwrk); } else if (wntus && wntvo) { /* Path 5 (M much larger than N, JOBU='S', JOBVT='O') */ wrkbl = *n + *n * ilaenv_(&c__1, "DGEQRF", " ", m, n, & c_n1, &c_n1, (ftnlen)6, (ftnlen)1); /* Computing MAX */ i__2 = wrkbl, i__3 = *n + *n * ilaenv_(&c__1, "DORGQR", " ", m, n, n, &c_n1, (ftnlen)6, (ftnlen)1); wrkbl = max(i__2,i__3); /* Computing MAX */ i__2 = wrkbl, i__3 = *n * 3 + (*n << 1) * ilaenv_(&c__1, "DGEBRD", " ", n, n, &c_n1, &c_n1, (ftnlen)6, ( ftnlen)1); wrkbl = max(i__2,i__3); /* Computing MAX */ i__2 = wrkbl, i__3 = *n * 3 + *n * ilaenv_(&c__1, "DORGBR" , "Q", n, n, n, &c_n1, (ftnlen)6, (ftnlen)1); wrkbl = max(i__2,i__3); /* Computing MAX */ i__2 = wrkbl, i__3 = *n * 3 + (*n - 1) * ilaenv_(&c__1, "DORGBR", "P", n, n, n, &c_n1, (ftnlen)6, (ftnlen) 1); wrkbl = max(i__2,i__3); wrkbl = max(wrkbl,bdspac); maxwrk = (*n << 1) * *n + wrkbl; /* Computing MAX */ i__2 = *n * 3 + *m; minwrk = max(i__2,bdspac); maxwrk = max(maxwrk,minwrk); } else if (wntus && wntvas) { /* Path 6 (M much larger than N, JOBU='S', JOBVT='S' or 'A') */ wrkbl = *n + *n * ilaenv_(&c__1, "DGEQRF", " ", m, n, & c_n1, &c_n1, (ftnlen)6, (ftnlen)1); /* Computing MAX */ i__2 = wrkbl, i__3 = *n + *n * ilaenv_(&c__1, "DORGQR", " ", m, n, n, &c_n1, (ftnlen)6, (ftnlen)1); wrkbl = max(i__2,i__3); /* Computing MAX */ i__2 = wrkbl, i__3 = *n * 3 + (*n << 1) * ilaenv_(&c__1, "DGEBRD", " ", n, n, &c_n1, &c_n1, (ftnlen)6, ( ftnlen)1); wrkbl = max(i__2,i__3); /* Computing MAX */ i__2 = wrkbl, i__3 = *n * 3 + *n * ilaenv_(&c__1, "DORGBR" , "Q", n, n, n, &c_n1, (ftnlen)6, (ftnlen)1); wrkbl = max(i__2,i__3); /* Computing MAX */ i__2 = wrkbl, i__3 = *n * 3 + (*n - 1) * ilaenv_(&c__1, "DORGBR", "P", n, n, n, &c_n1, (ftnlen)6, (ftnlen) 1); wrkbl = max(i__2,i__3); wrkbl = max(wrkbl,bdspac); maxwrk = *n * *n + wrkbl; /* Computing MAX */ i__2 = *n * 3 + *m; minwrk = max(i__2,bdspac); maxwrk = max(maxwrk,minwrk); } else if (wntua && wntvn) { /* Path 7 (M much larger than N, JOBU='A', JOBVT='N') */ wrkbl = *n + *n * ilaenv_(&c__1, "DGEQRF", " ", m, n, & c_n1, &c_n1, (ftnlen)6, (ftnlen)1); /* Computing MAX */ i__2 = wrkbl, i__3 = *n + *m * ilaenv_(&c__1, "DORGQR", " ", m, m, n, &c_n1, (ftnlen)6, (ftnlen)1); wrkbl = max(i__2,i__3); /* Computing MAX */ i__2 = wrkbl, i__3 = *n * 3 + (*n << 1) * ilaenv_(&c__1, "DGEBRD", " ", n, n, &c_n1, &c_n1, (ftnlen)6, ( ftnlen)1); wrkbl = max(i__2,i__3); /* Computing MAX */ i__2 = wrkbl, i__3 = *n * 3 + *n * ilaenv_(&c__1, "DORGBR" , "Q", n, n, n, &c_n1, (ftnlen)6, (ftnlen)1); wrkbl = max(i__2,i__3); wrkbl = max(wrkbl,bdspac); maxwrk = *n * *n + wrkbl; /* Computing MAX */ i__2 = *n * 3 + *m; minwrk = max(i__2,bdspac); maxwrk = max(maxwrk,minwrk); } else if (wntua && wntvo) { /* Path 8 (M much larger than N, JOBU='A', JOBVT='O') */ wrkbl = *n + *n * ilaenv_(&c__1, "DGEQRF", " ", m, n, & c_n1, &c_n1, (ftnlen)6, (ftnlen)1); /* Computing MAX */ i__2 = wrkbl, i__3 = *n + *m * ilaenv_(&c__1, "DORGQR", " ", m, m, n, &c_n1, (ftnlen)6, (ftnlen)1); wrkbl = max(i__2,i__3); /* Computing MAX */ i__2 = wrkbl, i__3 = *n * 3 + (*n << 1) * ilaenv_(&c__1, "DGEBRD", " ", n, n, &c_n1, &c_n1, (ftnlen)6, ( ftnlen)1); wrkbl = max(i__2,i__3); /* Computing MAX */ i__2 = wrkbl, i__3 = *n * 3 + *n * ilaenv_(&c__1, "DORGBR" , "Q", n, n, n, &c_n1, (ftnlen)6, (ftnlen)1); wrkbl = max(i__2,i__3); /* Computing MAX */ i__2 = wrkbl, i__3 = *n * 3 + (*n - 1) * ilaenv_(&c__1, "DORGBR", "P", n, n, n, &c_n1, (ftnlen)6, (ftnlen) 1); wrkbl = max(i__2,i__3); wrkbl = max(wrkbl,bdspac); maxwrk = (*n << 1) * *n + wrkbl; /* Computing MAX */ i__2 = *n * 3 + *m; minwrk = max(i__2,bdspac); maxwrk = max(maxwrk,minwrk); } else if (wntua && wntvas) { /* Path 9 (M much larger than N, JOBU='A', JOBVT='S' or 'A') */ wrkbl = *n + *n * ilaenv_(&c__1, "DGEQRF", " ", m, n, & c_n1, &c_n1, (ftnlen)6, (ftnlen)1); /* Computing MAX */ i__2 = wrkbl, i__3 = *n + *m * ilaenv_(&c__1, "DORGQR", " ", m, m, n, &c_n1, (ftnlen)6, (ftnlen)1); wrkbl = max(i__2,i__3); /* Computing MAX */ i__2 = wrkbl, i__3 = *n * 3 + (*n << 1) * ilaenv_(&c__1, "DGEBRD", " ", n, n, &c_n1, &c_n1, (ftnlen)6, ( ftnlen)1); wrkbl = max(i__2,i__3); /* Computing MAX */ i__2 = wrkbl, i__3 = *n * 3 + *n * ilaenv_(&c__1, "DORGBR" , "Q", n, n, n, &c_n1, (ftnlen)6, (ftnlen)1); wrkbl = max(i__2,i__3); /* Computing MAX */ i__2 = wrkbl, i__3 = *n * 3 + (*n - 1) * ilaenv_(&c__1, "DORGBR", "P", n, n, n, &c_n1, (ftnlen)6, (ftnlen) 1); wrkbl = max(i__2,i__3); wrkbl = max(wrkbl,bdspac); maxwrk = *n * *n + wrkbl; /* Computing MAX */ i__2 = *n * 3 + *m; minwrk = max(i__2,bdspac); maxwrk = max(maxwrk,minwrk); } } else { /* Path 10 (M at least N, but not much larger) */ maxwrk = *n * 3 + (*m + *n) * ilaenv_(&c__1, "DGEBRD", " ", m, n, &c_n1, &c_n1, (ftnlen)6, (ftnlen)1); if (wntus || wntuo) { /* Computing MAX */ i__2 = maxwrk, i__3 = *n * 3 + *n * ilaenv_(&c__1, "DORG" "BR", "Q", m, n, n, &c_n1, (ftnlen)6, (ftnlen)1); maxwrk = max(i__2,i__3); } if (wntua) { /* Computing MAX */ i__2 = maxwrk, i__3 = *n * 3 + *m * ilaenv_(&c__1, "DORG" "BR", "Q", m, m, n, &c_n1, (ftnlen)6, (ftnlen)1); maxwrk = max(i__2,i__3); } if (! wntvn) { /* Computing MAX */ i__2 = maxwrk, i__3 = *n * 3 + (*n - 1) * ilaenv_(&c__1, "DORGBR", "P", n, n, n, &c_n1, (ftnlen)6, (ftnlen) 1); maxwrk = max(i__2,i__3); } maxwrk = max(maxwrk,bdspac); /* Computing MAX */ i__2 = *n * 3 + *m; minwrk = max(i__2,bdspac); maxwrk = max(maxwrk,minwrk); } } else { /* Compute space needed for DBDSQR */ bdspac = *m * 5; if (*n >= mnthr) { if (wntvn) { /* Path 1t(N much larger than M, JOBVT='N') */ maxwrk = *m + *m * ilaenv_(&c__1, "DGELQF", " ", m, n, & c_n1, &c_n1, (ftnlen)6, (ftnlen)1); /* Computing MAX */ i__2 = maxwrk, i__3 = *m * 3 + (*m << 1) * ilaenv_(&c__1, "DGEBRD", " ", m, m, &c_n1, &c_n1, (ftnlen)6, ( ftnlen)1); maxwrk = max(i__2,i__3); if (wntuo || wntuas) { /* Computing MAX */ i__2 = maxwrk, i__3 = *m * 3 + *m * ilaenv_(&c__1, "DORGBR", "Q", m, m, m, &c_n1, (ftnlen)6, ( ftnlen)1); maxwrk = max(i__2,i__3); } maxwrk = max(maxwrk,bdspac); /* Computing MAX */ i__2 = *m << 2; minwrk = max(i__2,bdspac); maxwrk = max(maxwrk,minwrk); } else if (wntvo && wntun) { /* Path 2t(N much larger than M, JOBU='N', JOBVT='O') */ wrkbl = *m + *m * ilaenv_(&c__1, "DGELQF", " ", m, n, & c_n1, &c_n1, (ftnlen)6, (ftnlen)1); /* Computing MAX */ i__2 = wrkbl, i__3 = *m + *m * ilaenv_(&c__1, "DORGLQ", " ", m, n, m, &c_n1, (ftnlen)6, (ftnlen)1); wrkbl = max(i__2,i__3); /* Computing MAX */ i__2 = wrkbl, i__3 = *m * 3 + (*m << 1) * ilaenv_(&c__1, "DGEBRD", " ", m, m, &c_n1, &c_n1, (ftnlen)6, ( ftnlen)1); wrkbl = max(i__2,i__3); /* Computing MAX */ i__2 = wrkbl, i__3 = *m * 3 + (*m - 1) * ilaenv_(&c__1, "DORGBR", "P", m, m, m, &c_n1, (ftnlen)6, (ftnlen) 1); wrkbl = max(i__2,i__3); wrkbl = max(wrkbl,bdspac); /* Computing MAX */ i__2 = *m * *m + wrkbl, i__3 = *m * *m + *m * *n + *m; maxwrk = max(i__2,i__3); /* Computing MAX */ i__2 = *m * 3 + *n; minwrk = max(i__2,bdspac); maxwrk = max(maxwrk,minwrk); } else if (wntvo && wntuas) { /* Path 3t(N much larger than M, JOBU='S' or 'A', JOBVT='O') */ wrkbl = *m + *m * ilaenv_(&c__1, "DGELQF", " ", m, n, & c_n1, &c_n1, (ftnlen)6, (ftnlen)1); /* Computing MAX */ i__2 = wrkbl, i__3 = *m + *m * ilaenv_(&c__1, "DORGLQ", " ", m, n, m, &c_n1, (ftnlen)6, (ftnlen)1); wrkbl = max(i__2,i__3); /* Computing MAX */ i__2 = wrkbl, i__3 = *m * 3 + (*m << 1) * ilaenv_(&c__1, "DGEBRD", " ", m, m, &c_n1, &c_n1, (ftnlen)6, ( ftnlen)1); wrkbl = max(i__2,i__3); /* Computing MAX */ i__2 = wrkbl, i__3 = *m * 3 + (*m - 1) * ilaenv_(&c__1, "DORGBR", "P", m, m, m, &c_n1, (ftnlen)6, (ftnlen) 1); wrkbl = max(i__2,i__3); /* Computing MAX */ i__2 = wrkbl, i__3 = *m * 3 + *m * ilaenv_(&c__1, "DORGBR" , "Q", m, m, m, &c_n1, (ftnlen)6, (ftnlen)1); wrkbl = max(i__2,i__3); wrkbl = max(wrkbl,bdspac); /* Computing MAX */ i__2 = *m * *m + wrkbl, i__3 = *m * *m + *m * *n + *m; maxwrk = max(i__2,i__3); /* Computing MAX */ i__2 = *m * 3 + *n; minwrk = max(i__2,bdspac); maxwrk = max(maxwrk,minwrk); } else if (wntvs && wntun) { /* Path 4t(N much larger than M, JOBU='N', JOBVT='S') */ wrkbl = *m + *m * ilaenv_(&c__1, "DGELQF", " ", m, n, & c_n1, &c_n1, (ftnlen)6, (ftnlen)1); /* Computing MAX */ i__2 = wrkbl, i__3 = *m + *m * ilaenv_(&c__1, "DORGLQ", " ", m, n, m, &c_n1, (ftnlen)6, (ftnlen)1); wrkbl = max(i__2,i__3); /* Computing MAX */ i__2 = wrkbl, i__3 = *m * 3 + (*m << 1) * ilaenv_(&c__1, "DGEBRD", " ", m, m, &c_n1, &c_n1, (ftnlen)6, ( ftnlen)1); wrkbl = max(i__2,i__3); /* Computing MAX */ i__2 = wrkbl, i__3 = *m * 3 + (*m - 1) * ilaenv_(&c__1, "DORGBR", "P", m, m, m, &c_n1, (ftnlen)6, (ftnlen) 1); wrkbl = max(i__2,i__3); wrkbl = max(wrkbl,bdspac); maxwrk = *m * *m + wrkbl; /* Computing MAX */ i__2 = *m * 3 + *n; minwrk = max(i__2,bdspac); maxwrk = max(maxwrk,minwrk); } else if (wntvs && wntuo) { /* Path 5t(N much larger than M, JOBU='O', JOBVT='S') */ wrkbl = *m + *m * ilaenv_(&c__1, "DGELQF", " ", m, n, & c_n1, &c_n1, (ftnlen)6, (ftnlen)1); /* Computing MAX */ i__2 = wrkbl, i__3 = *m + *m * ilaenv_(&c__1, "DORGLQ", " ", m, n, m, &c_n1, (ftnlen)6, (ftnlen)1); wrkbl = max(i__2,i__3); /* Computing MAX */ i__2 = wrkbl, i__3 = *m * 3 + (*m << 1) * ilaenv_(&c__1, "DGEBRD", " ", m, m, &c_n1, &c_n1, (ftnlen)6, ( ftnlen)1); wrkbl = max(i__2,i__3); /* Computing MAX */ i__2 = wrkbl, i__3 = *m * 3 + (*m - 1) * ilaenv_(&c__1, "DORGBR", "P", m, m, m, &c_n1, (ftnlen)6, (ftnlen) 1); wrkbl = max(i__2,i__3); /* Computing MAX */ i__2 = wrkbl, i__3 = *m * 3 + *m * ilaenv_(&c__1, "DORGBR" , "Q", m, m, m, &c_n1, (ftnlen)6, (ftnlen)1); wrkbl = max(i__2,i__3); wrkbl = max(wrkbl,bdspac); maxwrk = (*m << 1) * *m + wrkbl; /* Computing MAX */ i__2 = *m * 3 + *n; minwrk = max(i__2,bdspac); maxwrk = max(maxwrk,minwrk); } else if (wntvs && wntuas) { /* Path 6t(N much larger than M, JOBU='S' or 'A', JOBVT='S') */ wrkbl = *m + *m * ilaenv_(&c__1, "DGELQF", " ", m, n, & c_n1, &c_n1, (ftnlen)6, (ftnlen)1); /* Computing MAX */ i__2 = wrkbl, i__3 = *m + *m * ilaenv_(&c__1, "DORGLQ", " ", m, n, m, &c_n1, (ftnlen)6, (ftnlen)1); wrkbl = max(i__2,i__3); /* Computing MAX */ i__2 = wrkbl, i__3 = *m * 3 + (*m << 1) * ilaenv_(&c__1, "DGEBRD", " ", m, m, &c_n1, &c_n1, (ftnlen)6, ( ftnlen)1); wrkbl = max(i__2,i__3); /* Computing MAX */ i__2 = wrkbl, i__3 = *m * 3 + (*m - 1) * ilaenv_(&c__1, "DORGBR", "P", m, m, m, &c_n1, (ftnlen)6, (ftnlen) 1); wrkbl = max(i__2,i__3); /* Computing MAX */ i__2 = wrkbl, i__3 = *m * 3 + *m * ilaenv_(&c__1, "DORGBR" , "Q", m, m, m, &c_n1, (ftnlen)6, (ftnlen)1); wrkbl = max(i__2,i__3); wrkbl = max(wrkbl,bdspac); maxwrk = *m * *m + wrkbl; /* Computing MAX */ i__2 = *m * 3 + *n; minwrk = max(i__2,bdspac); maxwrk = max(maxwrk,minwrk); } else if (wntva && wntun) { /* Path 7t(N much larger than M, JOBU='N', JOBVT='A') */ wrkbl = *m + *m * ilaenv_(&c__1, "DGELQF", " ", m, n, & c_n1, &c_n1, (ftnlen)6, (ftnlen)1); /* Computing MAX */ i__2 = wrkbl, i__3 = *m + *n * ilaenv_(&c__1, "DORGLQ", " ", n, n, m, &c_n1, (ftnlen)6, (ftnlen)1); wrkbl = max(i__2,i__3); /* Computing MAX */ i__2 = wrkbl, i__3 = *m * 3 + (*m << 1) * ilaenv_(&c__1, "DGEBRD", " ", m, m, &c_n1, &c_n1, (ftnlen)6, ( ftnlen)1); wrkbl = max(i__2,i__3); /* Computing MAX */ i__2 = wrkbl, i__3 = *m * 3 + (*m - 1) * ilaenv_(&c__1, "DORGBR", "P", m, m, m, &c_n1, (ftnlen)6, (ftnlen) 1); wrkbl = max(i__2,i__3); wrkbl = max(wrkbl,bdspac); maxwrk = *m * *m + wrkbl; /* Computing MAX */ i__2 = *m * 3 + *n; minwrk = max(i__2,bdspac); maxwrk = max(maxwrk,minwrk); } else if (wntva && wntuo) { /* Path 8t(N much larger than M, JOBU='O', JOBVT='A') */ wrkbl = *m + *m * ilaenv_(&c__1, "DGELQF", " ", m, n, & c_n1, &c_n1, (ftnlen)6, (ftnlen)1); /* Computing MAX */ i__2 = wrkbl, i__3 = *m + *n * ilaenv_(&c__1, "DORGLQ", " ", n, n, m, &c_n1, (ftnlen)6, (ftnlen)1); wrkbl = max(i__2,i__3); /* Computing MAX */ i__2 = wrkbl, i__3 = *m * 3 + (*m << 1) * ilaenv_(&c__1, "DGEBRD", " ", m, m, &c_n1, &c_n1, (ftnlen)6, ( ftnlen)1); wrkbl = max(i__2,i__3); /* Computing MAX */ i__2 = wrkbl, i__3 = *m * 3 + (*m - 1) * ilaenv_(&c__1, "DORGBR", "P", m, m, m, &c_n1, (ftnlen)6, (ftnlen) 1); wrkbl = max(i__2,i__3); /* Computing MAX */ i__2 = wrkbl, i__3 = *m * 3 + *m * ilaenv_(&c__1, "DORGBR" , "Q", m, m, m, &c_n1, (ftnlen)6, (ftnlen)1); wrkbl = max(i__2,i__3); wrkbl = max(wrkbl,bdspac); maxwrk = (*m << 1) * *m + wrkbl; /* Computing MAX */ i__2 = *m * 3 + *n; minwrk = max(i__2,bdspac); maxwrk = max(maxwrk,minwrk); } else if (wntva && wntuas) { /* Path 9t(N much larger than M, JOBU='S' or 'A', JOBVT='A') */ wrkbl = *m + *m * ilaenv_(&c__1, "DGELQF", " ", m, n, & c_n1, &c_n1, (ftnlen)6, (ftnlen)1); /* Computing MAX */ i__2 = wrkbl, i__3 = *m + *n * ilaenv_(&c__1, "DORGLQ", " ", n, n, m, &c_n1, (ftnlen)6, (ftnlen)1); wrkbl = max(i__2,i__3); /* Computing MAX */ i__2 = wrkbl, i__3 = *m * 3 + (*m << 1) * ilaenv_(&c__1, "DGEBRD", " ", m, m, &c_n1, &c_n1, (ftnlen)6, ( ftnlen)1); wrkbl = max(i__2,i__3); /* Computing MAX */ i__2 = wrkbl, i__3 = *m * 3 + (*m - 1) * ilaenv_(&c__1, "DORGBR", "P", m, m, m, &c_n1, (ftnlen)6, (ftnlen) 1); wrkbl = max(i__2,i__3); /* Computing MAX */ i__2 = wrkbl, i__3 = *m * 3 + *m * ilaenv_(&c__1, "DORGBR" , "Q", m, m, m, &c_n1, (ftnlen)6, (ftnlen)1); wrkbl = max(i__2,i__3); wrkbl = max(wrkbl,bdspac); maxwrk = *m * *m + wrkbl; /* Computing MAX */ i__2 = *m * 3 + *n; minwrk = max(i__2,bdspac); maxwrk = max(maxwrk,minwrk); } } else { /* Path 10t(N greater than M, but not much larger) */ maxwrk = *m * 3 + (*m + *n) * ilaenv_(&c__1, "DGEBRD", " ", m, n, &c_n1, &c_n1, (ftnlen)6, (ftnlen)1); if (wntvs || wntvo) { /* Computing MAX */ i__2 = maxwrk, i__3 = *m * 3 + *m * ilaenv_(&c__1, "DORG" "BR", "P", m, n, m, &c_n1, (ftnlen)6, (ftnlen)1); maxwrk = max(i__2,i__3); } if (wntva) { /* Computing MAX */ i__2 = maxwrk, i__3 = *m * 3 + *n * ilaenv_(&c__1, "DORG" "BR", "P", n, n, m, &c_n1, (ftnlen)6, (ftnlen)1); maxwrk = max(i__2,i__3); } if (! wntun) { /* Computing MAX */ i__2 = maxwrk, i__3 = *m * 3 + (*m - 1) * ilaenv_(&c__1, "DORGBR", "Q", m, m, m, &c_n1, (ftnlen)6, (ftnlen) 1); maxwrk = max(i__2,i__3); } maxwrk = max(maxwrk,bdspac); /* Computing MAX */ i__2 = *m * 3 + *n; minwrk = max(i__2,bdspac); maxwrk = max(maxwrk,minwrk); } } work[1] = (doublereal) maxwrk; } if (*lwork < minwrk && ! lquery) { *info = -13; } if (*info != 0) { i__2 = -(*info); xerbla_("DGESVD", &i__2); return 0; } else if (lquery) { return 0; } /* Quick return if possible */ if (*m == 0 || *n == 0) { if (*lwork >= 1) { work[1] = 1.; } return 0; } /* Get machine constants */ eps = dlamch_("P"); smlnum = sqrt(dlamch_("S")) / eps; bignum = 1. / smlnum; /* Scale A if max element outside range [SMLNUM,BIGNUM] */ anrm = dlange_("M", m, n, &a[a_offset], lda, dum); iscl = 0; if (anrm > 0. && anrm < smlnum) { iscl = 1; dlascl_("G", &c__0, &c__0, &anrm, &smlnum, m, n, &a[a_offset], lda, & ierr); } else if (anrm > bignum) { iscl = 1; dlascl_("G", &c__0, &c__0, &anrm, &bignum, m, n, &a[a_offset], lda, & ierr); } if (*m >= *n) { /* A has at least as many rows as columns. If A has sufficiently more rows than columns, first reduce using the QR decomposition (if sufficient workspace available) */ if (*m >= mnthr) { if (wntun) { /* Path 1 (M much larger than N, JOBU='N') No left singular vectors to be computed */ itau = 1; iwork = itau + *n; /* Compute A=Q*R (Workspace: need 2*N, prefer N+N*NB) */ i__2 = *lwork - iwork + 1; dgeqrf_(m, n, &a[a_offset], lda, &work[itau], &work[iwork], & i__2, &ierr); /* Zero out below R */ i__2 = *n - 1; i__3 = *n - 1; dlaset_("L", &i__2, &i__3, &c_b416, &c_b416, &a_ref(2, 1), lda); ie = 1; itauq = ie + *n; itaup = itauq + *n; iwork = itaup + *n; /* Bidiagonalize R in A (Workspace: need 4*N, prefer 3*N+2*N*NB) */ i__2 = *lwork - iwork + 1; dgebrd_(n, n, &a[a_offset], lda, &s[1], &work[ie], &work[ itauq], &work[itaup], &work[iwork], &i__2, &ierr); ncvt = 0; if (wntvo || wntvas) { /* If right singular vectors desired, generate P'. (Workspace: need 4*N-1, prefer 3*N+(N-1)*NB) */ i__2 = *lwork - iwork + 1; dorgbr_("P", n, n, n, &a[a_offset], lda, &work[itaup], & work[iwork], &i__2, &ierr); ncvt = *n; } iwork = ie + *n; /* Perform bidiagonal QR iteration, computing right singular vectors of A in A if desired (Workspace: need BDSPAC) */ dbdsqr_("U", n, &ncvt, &c__0, &c__0, &s[1], &work[ie], &a[ a_offset], lda, dum, &c__1, dum, &c__1, &work[iwork], info); /* If right singular vectors desired in VT, copy them there */ if (wntvas) { dlacpy_("F", n, n, &a[a_offset], lda, &vt[vt_offset], ldvt); } } else if (wntuo && wntvn) { /* Path 2 (M much larger than N, JOBU='O', JOBVT='N') N left singular vectors to be overwritten on A and no right singular vectors to be computed Computing MAX */ i__2 = *n << 2; if (*lwork >= *n * *n + max(i__2,bdspac)) { /* Sufficient workspace for a fast algorithm */ ir = 1; /* Computing MAX */ i__2 = wrkbl, i__3 = *lda * *n + *n; if (*lwork >= max(i__2,i__3) + *lda * *n) { /* WORK(IU) is LDA by N, WORK(IR) is LDA by N */ ldwrku = *lda; ldwrkr = *lda; } else /* if(complicated condition) */ { /* Computing MAX */ i__2 = wrkbl, i__3 = *lda * *n + *n; if (*lwork >= max(i__2,i__3) + *n * *n) { /* WORK(IU) is LDA by N, WORK(IR) is N by N */ ldwrku = *lda; ldwrkr = *n; } else { /* WORK(IU) is LDWRKU by N, WORK(IR) is N by N */ ldwrku = (*lwork - *n * *n - *n) / *n; ldwrkr = *n; } } itau = ir + ldwrkr * *n; iwork = itau + *n; /* Compute A=Q*R (Workspace: need N*N+2*N, prefer N*N+N+N*NB) */ i__2 = *lwork - iwork + 1; dgeqrf_(m, n, &a[a_offset], lda, &work[itau], &work[iwork] , &i__2, &ierr); /* Copy R to WORK(IR) and zero out below it */ dlacpy_("U", n, n, &a[a_offset], lda, &work[ir], &ldwrkr); i__2 = *n - 1; i__3 = *n - 1; dlaset_("L", &i__2, &i__3, &c_b416, &c_b416, &work[ir + 1] , &ldwrkr); /* Generate Q in A (Workspace: need N*N+2*N, prefer N*N+N+N*NB) */ i__2 = *lwork - iwork + 1; dorgqr_(m, n, n, &a[a_offset], lda, &work[itau], &work[ iwork], &i__2, &ierr); ie = itau; itauq = ie + *n; itaup = itauq + *n; iwork = itaup + *n; /* Bidiagonalize R in WORK(IR) (Workspace: need N*N+4*N, prefer N*N+3*N+2*N*NB) */ i__2 = *lwork - iwork + 1; dgebrd_(n, n, &work[ir], &ldwrkr, &s[1], &work[ie], &work[ itauq], &work[itaup], &work[iwork], &i__2, &ierr); /* Generate left vectors bidiagonalizing R (Workspace: need N*N+4*N, prefer N*N+3*N+N*NB) */ i__2 = *lwork - iwork + 1; dorgbr_("Q", n, n, n, &work[ir], &ldwrkr, &work[itauq], & work[iwork], &i__2, &ierr); iwork = ie + *n; /* Perform bidiagonal QR iteration, computing left singular vectors of R in WORK(IR) (Workspace: need N*N+BDSPAC) */ dbdsqr_("U", n, &c__0, n, &c__0, &s[1], &work[ie], dum, & c__1, &work[ir], &ldwrkr, dum, &c__1, &work[iwork] , info); iu = ie + *n; /* Multiply Q in A by left singular vectors of R in WORK(IR), storing result in WORK(IU) and copying to A (Workspace: need N*N+2*N, prefer N*N+M*N+N) */ i__2 = *m; i__3 = ldwrku; for (i__ = 1; i__3 < 0 ? i__ >= i__2 : i__ <= i__2; i__ += i__3) { /* Computing MIN */ i__4 = *m - i__ + 1; chunk = min(i__4,ldwrku); dgemm_("N", "N", &chunk, n, n, &c_b438, &a_ref(i__, 1) , lda, &work[ir], &ldwrkr, &c_b416, &work[iu], &ldwrku); dlacpy_("F", &chunk, n, &work[iu], &ldwrku, &a_ref( i__, 1), lda); /* L10: */ } } else { /* Insufficient workspace for a fast algorithm */ ie = 1; itauq = ie + *n; itaup = itauq + *n; iwork = itaup + *n; /* Bidiagonalize A (Workspace: need 3*N+M, prefer 3*N+(M+N)*NB) */ i__3 = *lwork - iwork + 1; dgebrd_(m, n, &a[a_offset], lda, &s[1], &work[ie], &work[ itauq], &work[itaup], &work[iwork], &i__3, &ierr); /* Generate left vectors bidiagonalizing A (Workspace: need 4*N, prefer 3*N+N*NB) */ i__3 = *lwork - iwork + 1; dorgbr_("Q", m, n, n, &a[a_offset], lda, &work[itauq], & work[iwork], &i__3, &ierr); iwork = ie + *n; /* Perform bidiagonal QR iteration, computing left singular vectors of A in A (Workspace: need BDSPAC) */ dbdsqr_("U", n, &c__0, m, &c__0, &s[1], &work[ie], dum, & c__1, &a[a_offset], lda, dum, &c__1, &work[iwork], info); } } else if (wntuo && wntvas) { /* Path 3 (M much larger than N, JOBU='O', JOBVT='S' or 'A') N left singular vectors to be overwritten on A and N right singular vectors to be computed in VT Computing MAX */ i__3 = *n << 2; if (*lwork >= *n * *n + max(i__3,bdspac)) { /* Sufficient workspace for a fast algorithm */ ir = 1; /* Computing MAX */ i__3 = wrkbl, i__2 = *lda * *n + *n; if (*lwork >= max(i__3,i__2) + *lda * *n) { /* WORK(IU) is LDA by N and WORK(IR) is LDA by N */ ldwrku = *lda; ldwrkr = *lda; } else /* if(complicated condition) */ { /* Computing MAX */ i__3 = wrkbl, i__2 = *lda * *n + *n; if (*lwork >= max(i__3,i__2) + *n * *n) { /* WORK(IU) is LDA by N and WORK(IR) is N by N */ ldwrku = *lda; ldwrkr = *n; } else { /* WORK(IU) is LDWRKU by N and WORK(IR) is N by N */ ldwrku = (*lwork - *n * *n - *n) / *n; ldwrkr = *n; } } itau = ir + ldwrkr * *n; iwork = itau + *n; /* Compute A=Q*R (Workspace: need N*N+2*N, prefer N*N+N+N*NB) */ i__3 = *lwork - iwork + 1; dgeqrf_(m, n, &a[a_offset], lda, &work[itau], &work[iwork] , &i__3, &ierr); /* Copy R to VT, zeroing out below it */ dlacpy_("U", n, n, &a[a_offset], lda, &vt[vt_offset], ldvt); i__3 = *n - 1; i__2 = *n - 1; dlaset_("L", &i__3, &i__2, &c_b416, &c_b416, &vt_ref(2, 1) , ldvt); /* Generate Q in A (Workspace: need N*N+2*N, prefer N*N+N+N*NB) */ i__3 = *lwork - iwork + 1; dorgqr_(m, n, n, &a[a_offset], lda, &work[itau], &work[ iwork], &i__3, &ierr); ie = itau; itauq = ie + *n; itaup = itauq + *n; iwork = itaup + *n; /* Bidiagonalize R in VT, copying result to WORK(IR) (Workspace: need N*N+4*N, prefer N*N+3*N+2*N*NB) */ i__3 = *lwork - iwork + 1; dgebrd_(n, n, &vt[vt_offset], ldvt, &s[1], &work[ie], & work[itauq], &work[itaup], &work[iwork], &i__3, & ierr); dlacpy_("L", n, n, &vt[vt_offset], ldvt, &work[ir], & ldwrkr); /* Generate left vectors bidiagonalizing R in WORK(IR) (Workspace: need N*N+4*N, prefer N*N+3*N+N*NB) */ i__3 = *lwork - iwork + 1; dorgbr_("Q", n, n, n, &work[ir], &ldwrkr, &work[itauq], & work[iwork], &i__3, &ierr); /* Generate right vectors bidiagonalizing R in VT (Workspace: need N*N+4*N-1, prefer N*N+3*N+(N-1)*NB) */ i__3 = *lwork - iwork + 1; dorgbr_("P", n, n, n, &vt[vt_offset], ldvt, &work[itaup], &work[iwork], &i__3, &ierr); iwork = ie + *n; /* Perform bidiagonal QR iteration, computing left singular vectors of R in WORK(IR) and computing right singular vectors of R in VT (Workspace: need N*N+BDSPAC) */ dbdsqr_("U", n, n, n, &c__0, &s[1], &work[ie], &vt[ vt_offset], ldvt, &work[ir], &ldwrkr, dum, &c__1, &work[iwork], info); iu = ie + *n; /* Multiply Q in A by left singular vectors of R in WORK(IR), storing result in WORK(IU) and copying to A (Workspace: need N*N+2*N, prefer N*N+M*N+N) */ i__3 = *m; i__2 = ldwrku; for (i__ = 1; i__2 < 0 ? i__ >= i__3 : i__ <= i__3; i__ += i__2) { /* Computing MIN */ i__4 = *m - i__ + 1; chunk = min(i__4,ldwrku); dgemm_("N", "N", &chunk, n, n, &c_b438, &a_ref(i__, 1) , lda, &work[ir], &ldwrkr, &c_b416, &work[iu], &ldwrku); dlacpy_("F", &chunk, n, &work[iu], &ldwrku, &a_ref( i__, 1), lda); /* L20: */ } } else { /* Insufficient workspace for a fast algorithm */ itau = 1; iwork = itau + *n; /* Compute A=Q*R (Workspace: need 2*N, prefer N+N*NB) */ i__2 = *lwork - iwork + 1; dgeqrf_(m, n, &a[a_offset], lda, &work[itau], &work[iwork] , &i__2, &ierr); /* Copy R to VT, zeroing out below it */ dlacpy_("U", n, n, &a[a_offset], lda, &vt[vt_offset], ldvt); i__2 = *n - 1; i__3 = *n - 1; dlaset_("L", &i__2, &i__3, &c_b416, &c_b416, &vt_ref(2, 1) , ldvt); /* Generate Q in A (Workspace: need 2*N, prefer N+N*NB) */ i__2 = *lwork - iwork + 1; dorgqr_(m, n, n, &a[a_offset], lda, &work[itau], &work[ iwork], &i__2, &ierr); ie = itau; itauq = ie + *n; itaup = itauq + *n; iwork = itaup + *n; /* Bidiagonalize R in VT (Workspace: need 4*N, prefer 3*N+2*N*NB) */ i__2 = *lwork - iwork + 1; dgebrd_(n, n, &vt[vt_offset], ldvt, &s[1], &work[ie], & work[itauq], &work[itaup], &work[iwork], &i__2, & ierr); /* Multiply Q in A by left vectors bidiagonalizing R (Workspace: need 3*N+M, prefer 3*N+M*NB) */ i__2 = *lwork - iwork + 1; dormbr_("Q", "R", "N", m, n, n, &vt[vt_offset], ldvt, & work[itauq], &a[a_offset], lda, &work[iwork], & i__2, &ierr); /* Generate right vectors bidiagonalizing R in VT (Workspace: need 4*N-1, prefer 3*N+(N-1)*NB) */ i__2 = *lwork - iwork + 1; dorgbr_("P", n, n, n, &vt[vt_offset], ldvt, &work[itaup], &work[iwork], &i__2, &ierr); iwork = ie + *n; /* Perform bidiagonal QR iteration, computing left singular vectors of A in A and computing right singular vectors of A in VT (Workspace: need BDSPAC) */ dbdsqr_("U", n, n, m, &c__0, &s[1], &work[ie], &vt[ vt_offset], ldvt, &a[a_offset], lda, dum, &c__1, & work[iwork], info); } } else if (wntus) { if (wntvn) { /* Path 4 (M much larger than N, JOBU='S', JOBVT='N') N left singular vectors to be computed in U and no right singular vectors to be computed Computing MAX */ i__2 = *n << 2; if (*lwork >= *n * *n + max(i__2,bdspac)) { /* Sufficient workspace for a fast algorithm */ ir = 1; if (*lwork >= wrkbl + *lda * *n) { /* WORK(IR) is LDA by N */ ldwrkr = *lda; } else { /* WORK(IR) is N by N */ ldwrkr = *n; } itau = ir + ldwrkr * *n; iwork = itau + *n; /* Compute A=Q*R (Workspace: need N*N+2*N, prefer N*N+N+N*NB) */ i__2 = *lwork - iwork + 1; dgeqrf_(m, n, &a[a_offset], lda, &work[itau], &work[ iwork], &i__2, &ierr); /* Copy R to WORK(IR), zeroing out below it */ dlacpy_("U", n, n, &a[a_offset], lda, &work[ir], & ldwrkr); i__2 = *n - 1; i__3 = *n - 1; dlaset_("L", &i__2, &i__3, &c_b416, &c_b416, &work[ir + 1], &ldwrkr); /* Generate Q in A (Workspace: need N*N+2*N, prefer N*N+N+N*NB) */ i__2 = *lwork - iwork + 1; dorgqr_(m, n, n, &a[a_offset], lda, &work[itau], & work[iwork], &i__2, &ierr); ie = itau; itauq = ie + *n; itaup = itauq + *n; iwork = itaup + *n; /* Bidiagonalize R in WORK(IR) (Workspace: need N*N+4*N, prefer N*N+3*N+2*N*NB) */ i__2 = *lwork - iwork + 1; dgebrd_(n, n, &work[ir], &ldwrkr, &s[1], &work[ie], & work[itauq], &work[itaup], &work[iwork], & i__2, &ierr); /* Generate left vectors bidiagonalizing R in WORK(IR) (Workspace: need N*N+4*N, prefer N*N+3*N+N*NB) */ i__2 = *lwork - iwork + 1; dorgbr_("Q", n, n, n, &work[ir], &ldwrkr, &work[itauq] , &work[iwork], &i__2, &ierr); iwork = ie + *n; /* Perform bidiagonal QR iteration, computing left singular vectors of R in WORK(IR) (Workspace: need N*N+BDSPAC) */ dbdsqr_("U", n, &c__0, n, &c__0, &s[1], &work[ie], dum, &c__1, &work[ir], &ldwrkr, dum, &c__1, & work[iwork], info); /* Multiply Q in A by left singular vectors of R in WORK(IR), storing result in U (Workspace: need N*N) */ dgemm_("N", "N", m, n, n, &c_b438, &a[a_offset], lda, &work[ir], &ldwrkr, &c_b416, &u[u_offset], ldu); } else { /* Insufficient workspace for a fast algorithm */ itau = 1; iwork = itau + *n; /* Compute A=Q*R, copying result to U (Workspace: need 2*N, prefer N+N*NB) */ i__2 = *lwork - iwork + 1; dgeqrf_(m, n, &a[a_offset], lda, &work[itau], &work[ iwork], &i__2, &ierr); dlacpy_("L", m, n, &a[a_offset], lda, &u[u_offset], ldu); /* Generate Q in U (Workspace: need 2*N, prefer N+N*NB) */ i__2 = *lwork - iwork + 1; dorgqr_(m, n, n, &u[u_offset], ldu, &work[itau], & work[iwork], &i__2, &ierr); ie = itau; itauq = ie + *n; itaup = itauq + *n; iwork = itaup + *n; /* Zero out below R in A */ i__2 = *n - 1; i__3 = *n - 1; dlaset_("L", &i__2, &i__3, &c_b416, &c_b416, &a_ref(2, 1), lda); /* Bidiagonalize R in A (Workspace: need 4*N, prefer 3*N+2*N*NB) */ i__2 = *lwork - iwork + 1; dgebrd_(n, n, &a[a_offset], lda, &s[1], &work[ie], & work[itauq], &work[itaup], &work[iwork], & i__2, &ierr); /* Multiply Q in U by left vectors bidiagonalizing R (Workspace: need 3*N+M, prefer 3*N+M*NB) */ i__2 = *lwork - iwork + 1; dormbr_("Q", "R", "N", m, n, n, &a[a_offset], lda, & work[itauq], &u[u_offset], ldu, &work[iwork], &i__2, &ierr) ; iwork = ie + *n; /* Perform bidiagonal QR iteration, computing left singular vectors of A in U (Workspace: need BDSPAC) */ dbdsqr_("U", n, &c__0, m, &c__0, &s[1], &work[ie], dum, &c__1, &u[u_offset], ldu, dum, &c__1, & work[iwork], info); } } else if (wntvo) { /* Path 5 (M much larger than N, JOBU='S', JOBVT='O') N left singular vectors to be computed in U and N right singular vectors to be overwritten on A Computing MAX */ i__2 = *n << 2; if (*lwork >= (*n << 1) * *n + max(i__2,bdspac)) { /* Sufficient workspace for a fast algorithm */ iu = 1; if (*lwork >= wrkbl + (*lda << 1) * *n) { /* WORK(IU) is LDA by N and WORK(IR) is LDA by N */ ldwrku = *lda; ir = iu + ldwrku * *n; ldwrkr = *lda; } else if (*lwork >= wrkbl + (*lda + *n) * *n) { /* WORK(IU) is LDA by N and WORK(IR) is N by N */ ldwrku = *lda; ir = iu + ldwrku * *n; ldwrkr = *n; } else { /* WORK(IU) is N by N and WORK(IR) is N by N */ ldwrku = *n; ir = iu + ldwrku * *n; ldwrkr = *n; } itau = ir + ldwrkr * *n; iwork = itau + *n; /* Compute A=Q*R (Workspace: need 2*N*N+2*N, prefer 2*N*N+N+N*NB) */ i__2 = *lwork - iwork + 1; dgeqrf_(m, n, &a[a_offset], lda, &work[itau], &work[ iwork], &i__2, &ierr); /* Copy R to WORK(IU), zeroing out below it */ dlacpy_("U", n, n, &a[a_offset], lda, &work[iu], & ldwrku); i__2 = *n - 1; i__3 = *n - 1; dlaset_("L", &i__2, &i__3, &c_b416, &c_b416, &work[iu + 1], &ldwrku); /* Generate Q in A (Workspace: need 2*N*N+2*N, prefer 2*N*N+N+N*NB) */ i__2 = *lwork - iwork + 1; dorgqr_(m, n, n, &a[a_offset], lda, &work[itau], & work[iwork], &i__2, &ierr); ie = itau; itauq = ie + *n; itaup = itauq + *n; iwork = itaup + *n; /* Bidiagonalize R in WORK(IU), copying result to WORK(IR) (Workspace: need 2*N*N+4*N, prefer 2*N*N+3*N+2*N*NB) */ i__2 = *lwork - iwork + 1; dgebrd_(n, n, &work[iu], &ldwrku, &s[1], &work[ie], & work[itauq], &work[itaup], &work[iwork], & i__2, &ierr); dlacpy_("U", n, n, &work[iu], &ldwrku, &work[ir], & ldwrkr); /* Generate left bidiagonalizing vectors in WORK(IU) (Workspace: need 2*N*N+4*N, prefer 2*N*N+3*N+N*NB) */ i__2 = *lwork - iwork + 1; dorgbr_("Q", n, n, n, &work[iu], &ldwrku, &work[itauq] , &work[iwork], &i__2, &ierr); /* Generate right bidiagonalizing vectors in WORK(IR) (Workspace: need 2*N*N+4*N-1, prefer 2*N*N+3*N+(N-1)*NB) */ i__2 = *lwork - iwork + 1; dorgbr_("P", n, n, n, &work[ir], &ldwrkr, &work[itaup] , &work[iwork], &i__2, &ierr); iwork = ie + *n; /* Perform bidiagonal QR iteration, computing left singular vectors of R in WORK(IU) and computing right singular vectors of R in WORK(IR) (Workspace: need 2*N*N+BDSPAC) */ dbdsqr_("U", n, n, n, &c__0, &s[1], &work[ie], &work[ ir], &ldwrkr, &work[iu], &ldwrku, dum, &c__1, &work[iwork], info); /* Multiply Q in A by left singular vectors of R in WORK(IU), storing result in U (Workspace: need N*N) */ dgemm_("N", "N", m, n, n, &c_b438, &a[a_offset], lda, &work[iu], &ldwrku, &c_b416, &u[u_offset], ldu); /* Copy right singular vectors of R to A (Workspace: need N*N) */ dlacpy_("F", n, n, &work[ir], &ldwrkr, &a[a_offset], lda); } else { /* Insufficient workspace for a fast algorithm */ itau = 1; iwork = itau + *n; /* Compute A=Q*R, copying result to U (Workspace: need 2*N, prefer N+N*NB) */ i__2 = *lwork - iwork + 1; dgeqrf_(m, n, &a[a_offset], lda, &work[itau], &work[ iwork], &i__2, &ierr); dlacpy_("L", m, n, &a[a_offset], lda, &u[u_offset], ldu); /* Generate Q in U (Workspace: need 2*N, prefer N+N*NB) */ i__2 = *lwork - iwork + 1; dorgqr_(m, n, n, &u[u_offset], ldu, &work[itau], & work[iwork], &i__2, &ierr); ie = itau; itauq = ie + *n; itaup = itauq + *n; iwork = itaup + *n; /* Zero out below R in A */ i__2 = *n - 1; i__3 = *n - 1; dlaset_("L", &i__2, &i__3, &c_b416, &c_b416, &a_ref(2, 1), lda); /* Bidiagonalize R in A (Workspace: need 4*N, prefer 3*N+2*N*NB) */ i__2 = *lwork - iwork + 1; dgebrd_(n, n, &a[a_offset], lda, &s[1], &work[ie], & work[itauq], &work[itaup], &work[iwork], & i__2, &ierr); /* Multiply Q in U by left vectors bidiagonalizing R (Workspace: need 3*N+M, prefer 3*N+M*NB) */ i__2 = *lwork - iwork + 1; dormbr_("Q", "R", "N", m, n, n, &a[a_offset], lda, & work[itauq], &u[u_offset], ldu, &work[iwork], &i__2, &ierr) ; /* Generate right vectors bidiagonalizing R in A (Workspace: need 4*N-1, prefer 3*N+(N-1)*NB) */ i__2 = *lwork - iwork + 1; dorgbr_("P", n, n, n, &a[a_offset], lda, &work[itaup], &work[iwork], &i__2, &ierr); iwork = ie + *n; /* Perform bidiagonal QR iteration, computing left singular vectors of A in U and computing right singular vectors of A in A (Workspace: need BDSPAC) */ dbdsqr_("U", n, n, m, &c__0, &s[1], &work[ie], &a[ a_offset], lda, &u[u_offset], ldu, dum, &c__1, &work[iwork], info); } } else if (wntvas) { /* Path 6 (M much larger than N, JOBU='S', JOBVT='S' or 'A') N left singular vectors to be computed in U and N right singular vectors to be computed in VT Computing MAX */ i__2 = *n << 2; if (*lwork >= *n * *n + max(i__2,bdspac)) { /* Sufficient workspace for a fast algorithm */ iu = 1; if (*lwork >= wrkbl + *lda * *n) { /* WORK(IU) is LDA by N */ ldwrku = *lda; } else { /* WORK(IU) is N by N */ ldwrku = *n; } itau = iu + ldwrku * *n; iwork = itau + *n; /* Compute A=Q*R (Workspace: need N*N+2*N, prefer N*N+N+N*NB) */ i__2 = *lwork - iwork + 1; dgeqrf_(m, n, &a[a_offset], lda, &work[itau], &work[ iwork], &i__2, &ierr); /* Copy R to WORK(IU), zeroing out below it */ dlacpy_("U", n, n, &a[a_offset], lda, &work[iu], & ldwrku); i__2 = *n - 1; i__3 = *n - 1; dlaset_("L", &i__2, &i__3, &c_b416, &c_b416, &work[iu + 1], &ldwrku); /* Generate Q in A (Workspace: need N*N+2*N, prefer N*N+N+N*NB) */ i__2 = *lwork - iwork + 1; dorgqr_(m, n, n, &a[a_offset], lda, &work[itau], & work[iwork], &i__2, &ierr); ie = itau; itauq = ie + *n; itaup = itauq + *n; iwork = itaup + *n; /* Bidiagonalize R in WORK(IU), copying result to VT (Workspace: need N*N+4*N, prefer N*N+3*N+2*N*NB) */ i__2 = *lwork - iwork + 1; dgebrd_(n, n, &work[iu], &ldwrku, &s[1], &work[ie], & work[itauq], &work[itaup], &work[iwork], & i__2, &ierr); dlacpy_("U", n, n, &work[iu], &ldwrku, &vt[vt_offset], ldvt); /* Generate left bidiagonalizing vectors in WORK(IU) (Workspace: need N*N+4*N, prefer N*N+3*N+N*NB) */ i__2 = *lwork - iwork + 1; dorgbr_("Q", n, n, n, &work[iu], &ldwrku, &work[itauq] , &work[iwork], &i__2, &ierr); /* Generate right bidiagonalizing vectors in VT (Workspace: need N*N+4*N-1, prefer N*N+3*N+(N-1)*NB) */ i__2 = *lwork - iwork + 1; dorgbr_("P", n, n, n, &vt[vt_offset], ldvt, &work[ itaup], &work[iwork], &i__2, &ierr) ; iwork = ie + *n; /* Perform bidiagonal QR iteration, computing left singular vectors of R in WORK(IU) and computing right singular vectors of R in VT (Workspace: need N*N+BDSPAC) */ dbdsqr_("U", n, n, n, &c__0, &s[1], &work[ie], &vt[ vt_offset], ldvt, &work[iu], &ldwrku, dum, & c__1, &work[iwork], info); /* Multiply Q in A by left singular vectors of R in WORK(IU), storing result in U (Workspace: need N*N) */ dgemm_("N", "N", m, n, n, &c_b438, &a[a_offset], lda, &work[iu], &ldwrku, &c_b416, &u[u_offset], ldu); } else { /* Insufficient workspace for a fast algorithm */ itau = 1; iwork = itau + *n; /* Compute A=Q*R, copying result to U (Workspace: need 2*N, prefer N+N*NB) */ i__2 = *lwork - iwork + 1; dgeqrf_(m, n, &a[a_offset], lda, &work[itau], &work[ iwork], &i__2, &ierr); dlacpy_("L", m, n, &a[a_offset], lda, &u[u_offset], ldu); /* Generate Q in U (Workspace: need 2*N, prefer N+N*NB) */ i__2 = *lwork - iwork + 1; dorgqr_(m, n, n, &u[u_offset], ldu, &work[itau], & work[iwork], &i__2, &ierr); /* Copy R to VT, zeroing out below it */ dlacpy_("U", n, n, &a[a_offset], lda, &vt[vt_offset], ldvt); i__2 = *n - 1; i__3 = *n - 1; dlaset_("L", &i__2, &i__3, &c_b416, &c_b416, &vt_ref( 2, 1), ldvt); ie = itau; itauq = ie + *n; itaup = itauq + *n; iwork = itaup + *n; /* Bidiagonalize R in VT (Workspace: need 4*N, prefer 3*N+2*N*NB) */ i__2 = *lwork - iwork + 1; dgebrd_(n, n, &vt[vt_offset], ldvt, &s[1], &work[ie], &work[itauq], &work[itaup], &work[iwork], & i__2, &ierr); /* Multiply Q in U by left bidiagonalizing vectors in VT (Workspace: need 3*N+M, prefer 3*N+M*NB) */ i__2 = *lwork - iwork + 1; dormbr_("Q", "R", "N", m, n, n, &vt[vt_offset], ldvt, &work[itauq], &u[u_offset], ldu, &work[iwork], &i__2, &ierr); /* Generate right bidiagonalizing vectors in VT (Workspace: need 4*N-1, prefer 3*N+(N-1)*NB) */ i__2 = *lwork - iwork + 1; dorgbr_("P", n, n, n, &vt[vt_offset], ldvt, &work[ itaup], &work[iwork], &i__2, &ierr) ; iwork = ie + *n; /* Perform bidiagonal QR iteration, computing left singular vectors of A in U and computing right singular vectors of A in VT (Workspace: need BDSPAC) */ dbdsqr_("U", n, n, m, &c__0, &s[1], &work[ie], &vt[ vt_offset], ldvt, &u[u_offset], ldu, dum, & c__1, &work[iwork], info); } } } else if (wntua) { if (wntvn) { /* Path 7 (M much larger than N, JOBU='A', JOBVT='N') M left singular vectors to be computed in U and no right singular vectors to be computed Computing MAX */ i__2 = *n + *m, i__3 = *n << 2, i__2 = max(i__2,i__3); if (*lwork >= *n * *n + max(i__2,bdspac)) { /* Sufficient workspace for a fast algorithm */ ir = 1; if (*lwork >= wrkbl + *lda * *n) { /* WORK(IR) is LDA by N */ ldwrkr = *lda; } else { /* WORK(IR) is N by N */ ldwrkr = *n; } itau = ir + ldwrkr * *n; iwork = itau + *n; /* Compute A=Q*R, copying result to U (Workspace: need N*N+2*N, prefer N*N+N+N*NB) */ i__2 = *lwork - iwork + 1; dgeqrf_(m, n, &a[a_offset], lda, &work[itau], &work[ iwork], &i__2, &ierr); dlacpy_("L", m, n, &a[a_offset], lda, &u[u_offset], ldu); /* Copy R to WORK(IR), zeroing out below it */ dlacpy_("U", n, n, &a[a_offset], lda, &work[ir], & ldwrkr); i__2 = *n - 1; i__3 = *n - 1; dlaset_("L", &i__2, &i__3, &c_b416, &c_b416, &work[ir + 1], &ldwrkr); /* Generate Q in U (Workspace: need N*N+N+M, prefer N*N+N+M*NB) */ i__2 = *lwork - iwork + 1; dorgqr_(m, m, n, &u[u_offset], ldu, &work[itau], & work[iwork], &i__2, &ierr); ie = itau; itauq = ie + *n; itaup = itauq + *n; iwork = itaup + *n; /* Bidiagonalize R in WORK(IR) (Workspace: need N*N+4*N, prefer N*N+3*N+2*N*NB) */ i__2 = *lwork - iwork + 1; dgebrd_(n, n, &work[ir], &ldwrkr, &s[1], &work[ie], & work[itauq], &work[itaup], &work[iwork], & i__2, &ierr); /* Generate left bidiagonalizing vectors in WORK(IR) (Workspace: need N*N+4*N, prefer N*N+3*N+N*NB) */ i__2 = *lwork - iwork + 1; dorgbr_("Q", n, n, n, &work[ir], &ldwrkr, &work[itauq] , &work[iwork], &i__2, &ierr); iwork = ie + *n; /* Perform bidiagonal QR iteration, computing left singular vectors of R in WORK(IR) (Workspace: need N*N+BDSPAC) */ dbdsqr_("U", n, &c__0, n, &c__0, &s[1], &work[ie], dum, &c__1, &work[ir], &ldwrkr, dum, &c__1, & work[iwork], info); /* Multiply Q in U by left singular vectors of R in WORK(IR), storing result in A (Workspace: need N*N) */ dgemm_("N", "N", m, n, n, &c_b438, &u[u_offset], ldu, &work[ir], &ldwrkr, &c_b416, &a[a_offset], lda); /* Copy left singular vectors of A from A to U */ dlacpy_("F", m, n, &a[a_offset], lda, &u[u_offset], ldu); } else { /* Insufficient workspace for a fast algorithm */ itau = 1; iwork = itau + *n; /* Compute A=Q*R, copying result to U (Workspace: need 2*N, prefer N+N*NB) */ i__2 = *lwork - iwork + 1; dgeqrf_(m, n, &a[a_offset], lda, &work[itau], &work[ iwork], &i__2, &ierr); dlacpy_("L", m, n, &a[a_offset], lda, &u[u_offset], ldu); /* Generate Q in U (Workspace: need N+M, prefer N+M*NB) */ i__2 = *lwork - iwork + 1; dorgqr_(m, m, n, &u[u_offset], ldu, &work[itau], & work[iwork], &i__2, &ierr); ie = itau; itauq = ie + *n; itaup = itauq + *n; iwork = itaup + *n; /* Zero out below R in A */ i__2 = *n - 1; i__3 = *n - 1; dlaset_("L", &i__2, &i__3, &c_b416, &c_b416, &a_ref(2, 1), lda); /* Bidiagonalize R in A (Workspace: need 4*N, prefer 3*N+2*N*NB) */ i__2 = *lwork - iwork + 1; dgebrd_(n, n, &a[a_offset], lda, &s[1], &work[ie], & work[itauq], &work[itaup], &work[iwork], & i__2, &ierr); /* Multiply Q in U by left bidiagonalizing vectors in A (Workspace: need 3*N+M, prefer 3*N+M*NB) */ i__2 = *lwork - iwork + 1; dormbr_("Q", "R", "N", m, n, n, &a[a_offset], lda, & work[itauq], &u[u_offset], ldu, &work[iwork], &i__2, &ierr) ; iwork = ie + *n; /* Perform bidiagonal QR iteration, computing left singular vectors of A in U (Workspace: need BDSPAC) */ dbdsqr_("U", n, &c__0, m, &c__0, &s[1], &work[ie], dum, &c__1, &u[u_offset], ldu, dum, &c__1, & work[iwork], info); } } else if (wntvo) { /* Path 8 (M much larger than N, JOBU='A', JOBVT='O') M left singular vectors to be computed in U and N right singular vectors to be overwritten on A Computing MAX */ i__2 = *n + *m, i__3 = *n << 2, i__2 = max(i__2,i__3); if (*lwork >= (*n << 1) * *n + max(i__2,bdspac)) { /* Sufficient workspace for a fast algorithm */ iu = 1; if (*lwork >= wrkbl + (*lda << 1) * *n) { /* WORK(IU) is LDA by N and WORK(IR) is LDA by N */ ldwrku = *lda; ir = iu + ldwrku * *n; ldwrkr = *lda; } else if (*lwork >= wrkbl + (*lda + *n) * *n) { /* WORK(IU) is LDA by N and WORK(IR) is N by N */ ldwrku = *lda; ir = iu + ldwrku * *n; ldwrkr = *n; } else { /* WORK(IU) is N by N and WORK(IR) is N by N */ ldwrku = *n; ir = iu + ldwrku * *n; ldwrkr = *n; } itau = ir + ldwrkr * *n; iwork = itau + *n; /* Compute A=Q*R, copying result to U (Workspace: need 2*N*N+2*N, prefer 2*N*N+N+N*NB) */ i__2 = *lwork - iwork + 1; dgeqrf_(m, n, &a[a_offset], lda, &work[itau], &work[ iwork], &i__2, &ierr); dlacpy_("L", m, n, &a[a_offset], lda, &u[u_offset], ldu); /* Generate Q in U (Workspace: need 2*N*N+N+M, prefer 2*N*N+N+M*NB) */ i__2 = *lwork - iwork + 1; dorgqr_(m, m, n, &u[u_offset], ldu, &work[itau], & work[iwork], &i__2, &ierr); /* Copy R to WORK(IU), zeroing out below it */ dlacpy_("U", n, n, &a[a_offset], lda, &work[iu], & ldwrku); i__2 = *n - 1; i__3 = *n - 1; dlaset_("L", &i__2, &i__3, &c_b416, &c_b416, &work[iu + 1], &ldwrku); ie = itau; itauq = ie + *n; itaup = itauq + *n; iwork = itaup + *n; /* Bidiagonalize R in WORK(IU), copying result to WORK(IR) (Workspace: need 2*N*N+4*N, prefer 2*N*N+3*N+2*N*NB) */ i__2 = *lwork - iwork + 1; dgebrd_(n, n, &work[iu], &ldwrku, &s[1], &work[ie], & work[itauq], &work[itaup], &work[iwork], & i__2, &ierr); dlacpy_("U", n, n, &work[iu], &ldwrku, &work[ir], & ldwrkr); /* Generate left bidiagonalizing vectors in WORK(IU) (Workspace: need 2*N*N+4*N, prefer 2*N*N+3*N+N*NB) */ i__2 = *lwork - iwork + 1; dorgbr_("Q", n, n, n, &work[iu], &ldwrku, &work[itauq] , &work[iwork], &i__2, &ierr); /* Generate right bidiagonalizing vectors in WORK(IR) (Workspace: need 2*N*N+4*N-1, prefer 2*N*N+3*N+(N-1)*NB) */ i__2 = *lwork - iwork + 1; dorgbr_("P", n, n, n, &work[ir], &ldwrkr, &work[itaup] , &work[iwork], &i__2, &ierr); iwork = ie + *n; /* Perform bidiagonal QR iteration, computing left singular vectors of R in WORK(IU) and computing right singular vectors of R in WORK(IR) (Workspace: need 2*N*N+BDSPAC) */ dbdsqr_("U", n, n, n, &c__0, &s[1], &work[ie], &work[ ir], &ldwrkr, &work[iu], &ldwrku, dum, &c__1, &work[iwork], info); /* Multiply Q in U by left singular vectors of R in WORK(IU), storing result in A (Workspace: need N*N) */ dgemm_("N", "N", m, n, n, &c_b438, &u[u_offset], ldu, &work[iu], &ldwrku, &c_b416, &a[a_offset], lda); /* Copy left singular vectors of A from A to U */ dlacpy_("F", m, n, &a[a_offset], lda, &u[u_offset], ldu); /* Copy right singular vectors of R from WORK(IR) to A */ dlacpy_("F", n, n, &work[ir], &ldwrkr, &a[a_offset], lda); } else { /* Insufficient workspace for a fast algorithm */ itau = 1; iwork = itau + *n; /* Compute A=Q*R, copying result to U (Workspace: need 2*N, prefer N+N*NB) */ i__2 = *lwork - iwork + 1; dgeqrf_(m, n, &a[a_offset], lda, &work[itau], &work[ iwork], &i__2, &ierr); dlacpy_("L", m, n, &a[a_offset], lda, &u[u_offset], ldu); /* Generate Q in U (Workspace: need N+M, prefer N+M*NB) */ i__2 = *lwork - iwork + 1; dorgqr_(m, m, n, &u[u_offset], ldu, &work[itau], & work[iwork], &i__2, &ierr); ie = itau; itauq = ie + *n; itaup = itauq + *n; iwork = itaup + *n; /* Zero out below R in A */ i__2 = *n - 1; i__3 = *n - 1; dlaset_("L", &i__2, &i__3, &c_b416, &c_b416, &a_ref(2, 1), lda); /* Bidiagonalize R in A (Workspace: need 4*N, prefer 3*N+2*N*NB) */ i__2 = *lwork - iwork + 1; dgebrd_(n, n, &a[a_offset], lda, &s[1], &work[ie], & work[itauq], &work[itaup], &work[iwork], & i__2, &ierr); /* Multiply Q in U by left bidiagonalizing vectors in A (Workspace: need 3*N+M, prefer 3*N+M*NB) */ i__2 = *lwork - iwork + 1; dormbr_("Q", "R", "N", m, n, n, &a[a_offset], lda, & work[itauq], &u[u_offset], ldu, &work[iwork], &i__2, &ierr) ; /* Generate right bidiagonalizing vectors in A (Workspace: need 4*N-1, prefer 3*N+(N-1)*NB) */ i__2 = *lwork - iwork + 1; dorgbr_("P", n, n, n, &a[a_offset], lda, &work[itaup], &work[iwork], &i__2, &ierr); iwork = ie + *n; /* Perform bidiagonal QR iteration, computing left singular vectors of A in U and computing right singular vectors of A in A (Workspace: need BDSPAC) */ dbdsqr_("U", n, n, m, &c__0, &s[1], &work[ie], &a[ a_offset], lda, &u[u_offset], ldu, dum, &c__1, &work[iwork], info); } } else if (wntvas) { /* Path 9 (M much larger than N, JOBU='A', JOBVT='S' or 'A') M left singular vectors to be computed in U and N right singular vectors to be computed in VT Computing MAX */ i__2 = *n + *m, i__3 = *n << 2, i__2 = max(i__2,i__3); if (*lwork >= *n * *n + max(i__2,bdspac)) { /* Sufficient workspace for a fast algorithm */ iu = 1; if (*lwork >= wrkbl + *lda * *n) { /* WORK(IU) is LDA by N */ ldwrku = *lda; } else { /* WORK(IU) is N by N */ ldwrku = *n; } itau = iu + ldwrku * *n; iwork = itau + *n; /* Compute A=Q*R, copying result to U (Workspace: need N*N+2*N, prefer N*N+N+N*NB) */ i__2 = *lwork - iwork + 1; dgeqrf_(m, n, &a[a_offset], lda, &work[itau], &work[ iwork], &i__2, &ierr); dlacpy_("L", m, n, &a[a_offset], lda, &u[u_offset], ldu); /* Generate Q in U (Workspace: need N*N+N+M, prefer N*N+N+M*NB) */ i__2 = *lwork - iwork + 1; dorgqr_(m, m, n, &u[u_offset], ldu, &work[itau], & work[iwork], &i__2, &ierr); /* Copy R to WORK(IU), zeroing out below it */ dlacpy_("U", n, n, &a[a_offset], lda, &work[iu], & ldwrku); i__2 = *n - 1; i__3 = *n - 1; dlaset_("L", &i__2, &i__3, &c_b416, &c_b416, &work[iu + 1], &ldwrku); ie = itau; itauq = ie + *n; itaup = itauq + *n; iwork = itaup + *n; /* Bidiagonalize R in WORK(IU), copying result to VT (Workspace: need N*N+4*N, prefer N*N+3*N+2*N*NB) */ i__2 = *lwork - iwork + 1; dgebrd_(n, n, &work[iu], &ldwrku, &s[1], &work[ie], & work[itauq], &work[itaup], &work[iwork], & i__2, &ierr); dlacpy_("U", n, n, &work[iu], &ldwrku, &vt[vt_offset], ldvt); /* Generate left bidiagonalizing vectors in WORK(IU) (Workspace: need N*N+4*N, prefer N*N+3*N+N*NB) */ i__2 = *lwork - iwork + 1; dorgbr_("Q", n, n, n, &work[iu], &ldwrku, &work[itauq] , &work[iwork], &i__2, &ierr); /* Generate right bidiagonalizing vectors in VT (Workspace: need N*N+4*N-1, prefer N*N+3*N+(N-1)*NB) */ i__2 = *lwork - iwork + 1; dorgbr_("P", n, n, n, &vt[vt_offset], ldvt, &work[ itaup], &work[iwork], &i__2, &ierr) ; iwork = ie + *n; /* Perform bidiagonal QR iteration, computing left singular vectors of R in WORK(IU) and computing right singular vectors of R in VT (Workspace: need N*N+BDSPAC) */ dbdsqr_("U", n, n, n, &c__0, &s[1], &work[ie], &vt[ vt_offset], ldvt, &work[iu], &ldwrku, dum, & c__1, &work[iwork], info); /* Multiply Q in U by left singular vectors of R in WORK(IU), storing result in A (Workspace: need N*N) */ dgemm_("N", "N", m, n, n, &c_b438, &u[u_offset], ldu, &work[iu], &ldwrku, &c_b416, &a[a_offset], lda); /* Copy left singular vectors of A from A to U */ dlacpy_("F", m, n, &a[a_offset], lda, &u[u_offset], ldu); } else { /* Insufficient workspace for a fast algorithm */ itau = 1; iwork = itau + *n; /* Compute A=Q*R, copying result to U (Workspace: need 2*N, prefer N+N*NB) */ i__2 = *lwork - iwork + 1; dgeqrf_(m, n, &a[a_offset], lda, &work[itau], &work[ iwork], &i__2, &ierr); dlacpy_("L", m, n, &a[a_offset], lda, &u[u_offset], ldu); /* Generate Q in U (Workspace: need N+M, prefer N+M*NB) */ i__2 = *lwork - iwork + 1; dorgqr_(m, m, n, &u[u_offset], ldu, &work[itau], & work[iwork], &i__2, &ierr); /* Copy R from A to VT, zeroing out below it */ dlacpy_("U", n, n, &a[a_offset], lda, &vt[vt_offset], ldvt); i__2 = *n - 1; i__3 = *n - 1; dlaset_("L", &i__2, &i__3, &c_b416, &c_b416, &vt_ref( 2, 1), ldvt); ie = itau; itauq = ie + *n; itaup = itauq + *n; iwork = itaup + *n; /* Bidiagonalize R in VT (Workspace: need 4*N, prefer 3*N+2*N*NB) */ i__2 = *lwork - iwork + 1; dgebrd_(n, n, &vt[vt_offset], ldvt, &s[1], &work[ie], &work[itauq], &work[itaup], &work[iwork], & i__2, &ierr); /* Multiply Q in U by left bidiagonalizing vectors in VT (Workspace: need 3*N+M, prefer 3*N+M*NB) */ i__2 = *lwork - iwork + 1; dormbr_("Q", "R", "N", m, n, n, &vt[vt_offset], ldvt, &work[itauq], &u[u_offset], ldu, &work[iwork], &i__2, &ierr); /* Generate right bidiagonalizing vectors in VT (Workspace: need 4*N-1, prefer 3*N+(N-1)*NB) */ i__2 = *lwork - iwork + 1; dorgbr_("P", n, n, n, &vt[vt_offset], ldvt, &work[ itaup], &work[iwork], &i__2, &ierr) ; iwork = ie + *n; /* Perform bidiagonal QR iteration, computing left singular vectors of A in U and computing right singular vectors of A in VT (Workspace: need BDSPAC) */ dbdsqr_("U", n, n, m, &c__0, &s[1], &work[ie], &vt[ vt_offset], ldvt, &u[u_offset], ldu, dum, & c__1, &work[iwork], info); } } } } else { /* M .LT. MNTHR Path 10 (M at least N, but not much larger) Reduce to bidiagonal form without QR decomposition */ ie = 1; itauq = ie + *n; itaup = itauq + *n; iwork = itaup + *n; /* Bidiagonalize A (Workspace: need 3*N+M, prefer 3*N+(M+N)*NB) */ i__2 = *lwork - iwork + 1; dgebrd_(m, n, &a[a_offset], lda, &s[1], &work[ie], &work[itauq], & work[itaup], &work[iwork], &i__2, &ierr); if (wntuas) { /* If left singular vectors desired in U, copy result to U and generate left bidiagonalizing vectors in U (Workspace: need 3*N+NCU, prefer 3*N+NCU*NB) */ dlacpy_("L", m, n, &a[a_offset], lda, &u[u_offset], ldu); if (wntus) { ncu = *n; } if (wntua) { ncu = *m; } i__2 = *lwork - iwork + 1; dorgbr_("Q", m, &ncu, n, &u[u_offset], ldu, &work[itauq], & work[iwork], &i__2, &ierr); } if (wntvas) { /* If right singular vectors desired in VT, copy result to VT and generate right bidiagonalizing vectors in VT (Workspace: need 4*N-1, prefer 3*N+(N-1)*NB) */ dlacpy_("U", n, n, &a[a_offset], lda, &vt[vt_offset], ldvt); i__2 = *lwork - iwork + 1; dorgbr_("P", n, n, n, &vt[vt_offset], ldvt, &work[itaup], & work[iwork], &i__2, &ierr); } if (wntuo) { /* If left singular vectors desired in A, generate left bidiagonalizing vectors in A (Workspace: need 4*N, prefer 3*N+N*NB) */ i__2 = *lwork - iwork + 1; dorgbr_("Q", m, n, n, &a[a_offset], lda, &work[itauq], &work[ iwork], &i__2, &ierr); } if (wntvo) { /* If right singular vectors desired in A, generate right bidiagonalizing vectors in A (Workspace: need 4*N-1, prefer 3*N+(N-1)*NB) */ i__2 = *lwork - iwork + 1; dorgbr_("P", n, n, n, &a[a_offset], lda, &work[itaup], &work[ iwork], &i__2, &ierr); } iwork = ie + *n; if (wntuas || wntuo) { nru = *m; } if (wntun) { nru = 0; } if (wntvas || wntvo) { ncvt = *n; } if (wntvn) { ncvt = 0; } if (! wntuo && ! wntvo) { /* Perform bidiagonal QR iteration, if desired, computing left singular vectors in U and computing right singular vectors in VT (Workspace: need BDSPAC) */ dbdsqr_("U", n, &ncvt, &nru, &c__0, &s[1], &work[ie], &vt[ vt_offset], ldvt, &u[u_offset], ldu, dum, &c__1, & work[iwork], info); } else if (! wntuo && wntvo) { /* Perform bidiagonal QR iteration, if desired, computing left singular vectors in U and computing right singular vectors in A (Workspace: need BDSPAC) */ dbdsqr_("U", n, &ncvt, &nru, &c__0, &s[1], &work[ie], &a[ a_offset], lda, &u[u_offset], ldu, dum, &c__1, &work[ iwork], info); } else { /* Perform bidiagonal QR iteration, if desired, computing left singular vectors in A and computing right singular vectors in VT (Workspace: need BDSPAC) */ dbdsqr_("U", n, &ncvt, &nru, &c__0, &s[1], &work[ie], &vt[ vt_offset], ldvt, &a[a_offset], lda, dum, &c__1, & work[iwork], info); } } } else { /* A has more columns than rows. If A has sufficiently more columns than rows, first reduce using the LQ decomposition (if sufficient workspace available) */ if (*n >= mnthr) { if (wntvn) { /* Path 1t(N much larger than M, JOBVT='N') No right singular vectors to be computed */ itau = 1; iwork = itau + *m; /* Compute A=L*Q (Workspace: need 2*M, prefer M+M*NB) */ i__2 = *lwork - iwork + 1; dgelqf_(m, n, &a[a_offset], lda, &work[itau], &work[iwork], & i__2, &ierr); /* Zero out above L */ i__2 = *m - 1; i__3 = *m - 1; dlaset_("U", &i__2, &i__3, &c_b416, &c_b416, &a_ref(1, 2), lda); ie = 1; itauq = ie + *m; itaup = itauq + *m; iwork = itaup + *m; /* Bidiagonalize L in A (Workspace: need 4*M, prefer 3*M+2*M*NB) */ i__2 = *lwork - iwork + 1; dgebrd_(m, m, &a[a_offset], lda, &s[1], &work[ie], &work[ itauq], &work[itaup], &work[iwork], &i__2, &ierr); if (wntuo || wntuas) { /* If left singular vectors desired, generate Q (Workspace: need 4*M, prefer 3*M+M*NB) */ i__2 = *lwork - iwork + 1; dorgbr_("Q", m, m, m, &a[a_offset], lda, &work[itauq], & work[iwork], &i__2, &ierr); } iwork = ie + *m; nru = 0; if (wntuo || wntuas) { nru = *m; } /* Perform bidiagonal QR iteration, computing left singular vectors of A in A if desired (Workspace: need BDSPAC) */ dbdsqr_("U", m, &c__0, &nru, &c__0, &s[1], &work[ie], dum, & c__1, &a[a_offset], lda, dum, &c__1, &work[iwork], info); /* If left singular vectors desired in U, copy them there */ if (wntuas) { dlacpy_("F", m, m, &a[a_offset], lda, &u[u_offset], ldu); } } else if (wntvo && wntun) { /* Path 2t(N much larger than M, JOBU='N', JOBVT='O') M right singular vectors to be overwritten on A and no left singular vectors to be computed Computing MAX */ i__2 = *m << 2; if (*lwork >= *m * *m + max(i__2,bdspac)) { /* Sufficient workspace for a fast algorithm */ ir = 1; /* Computing MAX */ i__2 = wrkbl, i__3 = *lda * *n + *m; if (*lwork >= max(i__2,i__3) + *lda * *m) { /* WORK(IU) is LDA by N and WORK(IR) is LDA by M */ ldwrku = *lda; chunk = *n; ldwrkr = *lda; } else /* if(complicated condition) */ { /* Computing MAX */ i__2 = wrkbl, i__3 = *lda * *n + *m; if (*lwork >= max(i__2,i__3) + *m * *m) { /* WORK(IU) is LDA by N and WORK(IR) is M by M */ ldwrku = *lda; chunk = *n; ldwrkr = *m; } else { /* WORK(IU) is M by CHUNK and WORK(IR) is M by M */ ldwrku = *m; chunk = (*lwork - *m * *m - *m) / *m; ldwrkr = *m; } } itau = ir + ldwrkr * *m; iwork = itau + *m; /* Compute A=L*Q (Workspace: need M*M+2*M, prefer M*M+M+M*NB) */ i__2 = *lwork - iwork + 1; dgelqf_(m, n, &a[a_offset], lda, &work[itau], &work[iwork] , &i__2, &ierr); /* Copy L to WORK(IR) and zero out above it */ dlacpy_("L", m, m, &a[a_offset], lda, &work[ir], &ldwrkr); i__2 = *m - 1; i__3 = *m - 1; dlaset_("U", &i__2, &i__3, &c_b416, &c_b416, &work[ir + ldwrkr], &ldwrkr); /* Generate Q in A (Workspace: need M*M+2*M, prefer M*M+M+M*NB) */ i__2 = *lwork - iwork + 1; dorglq_(m, n, m, &a[a_offset], lda, &work[itau], &work[ iwork], &i__2, &ierr); ie = itau; itauq = ie + *m; itaup = itauq + *m; iwork = itaup + *m; /* Bidiagonalize L in WORK(IR) (Workspace: need M*M+4*M, prefer M*M+3*M+2*M*NB) */ i__2 = *lwork - iwork + 1; dgebrd_(m, m, &work[ir], &ldwrkr, &s[1], &work[ie], &work[ itauq], &work[itaup], &work[iwork], &i__2, &ierr); /* Generate right vectors bidiagonalizing L (Workspace: need M*M+4*M-1, prefer M*M+3*M+(M-1)*NB) */ i__2 = *lwork - iwork + 1; dorgbr_("P", m, m, m, &work[ir], &ldwrkr, &work[itaup], & work[iwork], &i__2, &ierr); iwork = ie + *m; /* Perform bidiagonal QR iteration, computing right singular vectors of L in WORK(IR) (Workspace: need M*M+BDSPAC) */ dbdsqr_("U", m, m, &c__0, &c__0, &s[1], &work[ie], &work[ ir], &ldwrkr, dum, &c__1, dum, &c__1, &work[iwork] , info); iu = ie + *m; /* Multiply right singular vectors of L in WORK(IR) by Q in A, storing result in WORK(IU) and copying to A (Workspace: need M*M+2*M, prefer M*M+M*N+M) */ i__2 = *n; i__3 = chunk; for (i__ = 1; i__3 < 0 ? i__ >= i__2 : i__ <= i__2; i__ += i__3) { /* Computing MIN */ i__4 = *n - i__ + 1; blk = min(i__4,chunk); dgemm_("N", "N", m, &blk, m, &c_b438, &work[ir], & ldwrkr, &a_ref(1, i__), lda, &c_b416, &work[ iu], &ldwrku); dlacpy_("F", m, &blk, &work[iu], &ldwrku, &a_ref(1, i__), lda); /* L30: */ } } else { /* Insufficient workspace for a fast algorithm */ ie = 1; itauq = ie + *m; itaup = itauq + *m; iwork = itaup + *m; /* Bidiagonalize A (Workspace: need 3*M+N, prefer 3*M+(M+N)*NB) */ i__3 = *lwork - iwork + 1; dgebrd_(m, n, &a[a_offset], lda, &s[1], &work[ie], &work[ itauq], &work[itaup], &work[iwork], &i__3, &ierr); /* Generate right vectors bidiagonalizing A (Workspace: need 4*M, prefer 3*M+M*NB) */ i__3 = *lwork - iwork + 1; dorgbr_("P", m, n, m, &a[a_offset], lda, &work[itaup], & work[iwork], &i__3, &ierr); iwork = ie + *m; /* Perform bidiagonal QR iteration, computing right singular vectors of A in A (Workspace: need BDSPAC) */ dbdsqr_("L", m, n, &c__0, &c__0, &s[1], &work[ie], &a[ a_offset], lda, dum, &c__1, dum, &c__1, &work[ iwork], info); } } else if (wntvo && wntuas) { /* Path 3t(N much larger than M, JOBU='S' or 'A', JOBVT='O') M right singular vectors to be overwritten on A and M left singular vectors to be computed in U Computing MAX */ i__3 = *m << 2; if (*lwork >= *m * *m + max(i__3,bdspac)) { /* Sufficient workspace for a fast algorithm */ ir = 1; /* Computing MAX */ i__3 = wrkbl, i__2 = *lda * *n + *m; if (*lwork >= max(i__3,i__2) + *lda * *m) { /* WORK(IU) is LDA by N and WORK(IR) is LDA by M */ ldwrku = *lda; chunk = *n; ldwrkr = *lda; } else /* if(complicated condition) */ { /* Computing MAX */ i__3 = wrkbl, i__2 = *lda * *n + *m; if (*lwork >= max(i__3,i__2) + *m * *m) { /* WORK(IU) is LDA by N and WORK(IR) is M by M */ ldwrku = *lda; chunk = *n; ldwrkr = *m; } else { /* WORK(IU) is M by CHUNK and WORK(IR) is M by M */ ldwrku = *m; chunk = (*lwork - *m * *m - *m) / *m; ldwrkr = *m; } } itau = ir + ldwrkr * *m; iwork = itau + *m; /* Compute A=L*Q (Workspace: need M*M+2*M, prefer M*M+M+M*NB) */ i__3 = *lwork - iwork + 1; dgelqf_(m, n, &a[a_offset], lda, &work[itau], &work[iwork] , &i__3, &ierr); /* Copy L to U, zeroing about above it */ dlacpy_("L", m, m, &a[a_offset], lda, &u[u_offset], ldu); i__3 = *m - 1; i__2 = *m - 1; dlaset_("U", &i__3, &i__2, &c_b416, &c_b416, &u_ref(1, 2), ldu); /* Generate Q in A (Workspace: need M*M+2*M, prefer M*M+M+M*NB) */ i__3 = *lwork - iwork + 1; dorglq_(m, n, m, &a[a_offset], lda, &work[itau], &work[ iwork], &i__3, &ierr); ie = itau; itauq = ie + *m; itaup = itauq + *m; iwork = itaup + *m; /* Bidiagonalize L in U, copying result to WORK(IR) (Workspace: need M*M+4*M, prefer M*M+3*M+2*M*NB) */ i__3 = *lwork - iwork + 1; dgebrd_(m, m, &u[u_offset], ldu, &s[1], &work[ie], &work[ itauq], &work[itaup], &work[iwork], &i__3, &ierr); dlacpy_("U", m, m, &u[u_offset], ldu, &work[ir], &ldwrkr); /* Generate right vectors bidiagonalizing L in WORK(IR) (Workspace: need M*M+4*M-1, prefer M*M+3*M+(M-1)*NB) */ i__3 = *lwork - iwork + 1; dorgbr_("P", m, m, m, &work[ir], &ldwrkr, &work[itaup], & work[iwork], &i__3, &ierr); /* Generate left vectors bidiagonalizing L in U (Workspace: need M*M+4*M, prefer M*M+3*M+M*NB) */ i__3 = *lwork - iwork + 1; dorgbr_("Q", m, m, m, &u[u_offset], ldu, &work[itauq], & work[iwork], &i__3, &ierr); iwork = ie + *m; /* Perform bidiagonal QR iteration, computing left singular vectors of L in U, and computing right singular vectors of L in WORK(IR) (Workspace: need M*M+BDSPAC) */ dbdsqr_("U", m, m, m, &c__0, &s[1], &work[ie], &work[ir], &ldwrkr, &u[u_offset], ldu, dum, &c__1, &work[ iwork], info); iu = ie + *m; /* Multiply right singular vectors of L in WORK(IR) by Q in A, storing result in WORK(IU) and copying to A (Workspace: need M*M+2*M, prefer M*M+M*N+M)) */ i__3 = *n; i__2 = chunk; for (i__ = 1; i__2 < 0 ? i__ >= i__3 : i__ <= i__3; i__ += i__2) { /* Computing MIN */ i__4 = *n - i__ + 1; blk = min(i__4,chunk); dgemm_("N", "N", m, &blk, m, &c_b438, &work[ir], & ldwrkr, &a_ref(1, i__), lda, &c_b416, &work[ iu], &ldwrku); dlacpy_("F", m, &blk, &work[iu], &ldwrku, &a_ref(1, i__), lda); /* L40: */ } } else { /* Insufficient workspace for a fast algorithm */ itau = 1; iwork = itau + *m; /* Compute A=L*Q (Workspace: need 2*M, prefer M+M*NB) */ i__2 = *lwork - iwork + 1; dgelqf_(m, n, &a[a_offset], lda, &work[itau], &work[iwork] , &i__2, &ierr); /* Copy L to U, zeroing out above it */ dlacpy_("L", m, m, &a[a_offset], lda, &u[u_offset], ldu); i__2 = *m - 1; i__3 = *m - 1; dlaset_("U", &i__2, &i__3, &c_b416, &c_b416, &u_ref(1, 2), ldu); /* Generate Q in A (Workspace: need 2*M, prefer M+M*NB) */ i__2 = *lwork - iwork + 1; dorglq_(m, n, m, &a[a_offset], lda, &work[itau], &work[ iwork], &i__2, &ierr); ie = itau; itauq = ie + *m; itaup = itauq + *m; iwork = itaup + *m; /* Bidiagonalize L in U (Workspace: need 4*M, prefer 3*M+2*M*NB) */ i__2 = *lwork - iwork + 1; dgebrd_(m, m, &u[u_offset], ldu, &s[1], &work[ie], &work[ itauq], &work[itaup], &work[iwork], &i__2, &ierr); /* Multiply right vectors bidiagonalizing L by Q in A (Workspace: need 3*M+N, prefer 3*M+N*NB) */ i__2 = *lwork - iwork + 1; dormbr_("P", "L", "T", m, n, m, &u[u_offset], ldu, &work[ itaup], &a[a_offset], lda, &work[iwork], &i__2, & ierr); /* Generate left vectors bidiagonalizing L in U (Workspace: need 4*M, prefer 3*M+M*NB) */ i__2 = *lwork - iwork + 1; dorgbr_("Q", m, m, m, &u[u_offset], ldu, &work[itauq], & work[iwork], &i__2, &ierr); iwork = ie + *m; /* Perform bidiagonal QR iteration, computing left singular vectors of A in U and computing right singular vectors of A in A (Workspace: need BDSPAC) */ dbdsqr_("U", m, n, m, &c__0, &s[1], &work[ie], &a[ a_offset], lda, &u[u_offset], ldu, dum, &c__1, & work[iwork], info); } } else if (wntvs) { if (wntun) { /* Path 4t(N much larger than M, JOBU='N', JOBVT='S') M right singular vectors to be computed in VT and no left singular vectors to be computed Computing MAX */ i__2 = *m << 2; if (*lwork >= *m * *m + max(i__2,bdspac)) { /* Sufficient workspace for a fast algorithm */ ir = 1; if (*lwork >= wrkbl + *lda * *m) { /* WORK(IR) is LDA by M */ ldwrkr = *lda; } else { /* WORK(IR) is M by M */ ldwrkr = *m; } itau = ir + ldwrkr * *m; iwork = itau + *m; /* Compute A=L*Q (Workspace: need M*M+2*M, prefer M*M+M+M*NB) */ i__2 = *lwork - iwork + 1; dgelqf_(m, n, &a[a_offset], lda, &work[itau], &work[ iwork], &i__2, &ierr); /* Copy L to WORK(IR), zeroing out above it */ dlacpy_("L", m, m, &a[a_offset], lda, &work[ir], & ldwrkr); i__2 = *m - 1; i__3 = *m - 1; dlaset_("U", &i__2, &i__3, &c_b416, &c_b416, &work[ir + ldwrkr], &ldwrkr); /* Generate Q in A (Workspace: need M*M+2*M, prefer M*M+M+M*NB) */ i__2 = *lwork - iwork + 1; dorglq_(m, n, m, &a[a_offset], lda, &work[itau], & work[iwork], &i__2, &ierr); ie = itau; itauq = ie + *m; itaup = itauq + *m; iwork = itaup + *m; /* Bidiagonalize L in WORK(IR) (Workspace: need M*M+4*M, prefer M*M+3*M+2*M*NB) */ i__2 = *lwork - iwork + 1; dgebrd_(m, m, &work[ir], &ldwrkr, &s[1], &work[ie], & work[itauq], &work[itaup], &work[iwork], & i__2, &ierr); /* Generate right vectors bidiagonalizing L in WORK(IR) (Workspace: need M*M+4*M, prefer M*M+3*M+(M-1)*NB) */ i__2 = *lwork - iwork + 1; dorgbr_("P", m, m, m, &work[ir], &ldwrkr, &work[itaup] , &work[iwork], &i__2, &ierr); iwork = ie + *m; /* Perform bidiagonal QR iteration, computing right singular vectors of L in WORK(IR) (Workspace: need M*M+BDSPAC) */ dbdsqr_("U", m, m, &c__0, &c__0, &s[1], &work[ie], & work[ir], &ldwrkr, dum, &c__1, dum, &c__1, & work[iwork], info); /* Multiply right singular vectors of L in WORK(IR) by Q in A, storing result in VT (Workspace: need M*M) */ dgemm_("N", "N", m, n, m, &c_b438, &work[ir], &ldwrkr, &a[a_offset], lda, &c_b416, &vt[vt_offset], ldvt); } else { /* Insufficient workspace for a fast algorithm */ itau = 1; iwork = itau + *m; /* Compute A=L*Q (Workspace: need 2*M, prefer M+M*NB) */ i__2 = *lwork - iwork + 1; dgelqf_(m, n, &a[a_offset], lda, &work[itau], &work[ iwork], &i__2, &ierr); /* Copy result to VT */ dlacpy_("U", m, n, &a[a_offset], lda, &vt[vt_offset], ldvt); /* Generate Q in VT (Workspace: need 2*M, prefer M+M*NB) */ i__2 = *lwork - iwork + 1; dorglq_(m, n, m, &vt[vt_offset], ldvt, &work[itau], & work[iwork], &i__2, &ierr); ie = itau; itauq = ie + *m; itaup = itauq + *m; iwork = itaup + *m; /* Zero out above L in A */ i__2 = *m - 1; i__3 = *m - 1; dlaset_("U", &i__2, &i__3, &c_b416, &c_b416, &a_ref(1, 2), lda); /* Bidiagonalize L in A (Workspace: need 4*M, prefer 3*M+2*M*NB) */ i__2 = *lwork - iwork + 1; dgebrd_(m, m, &a[a_offset], lda, &s[1], &work[ie], & work[itauq], &work[itaup], &work[iwork], & i__2, &ierr); /* Multiply right vectors bidiagonalizing L by Q in VT (Workspace: need 3*M+N, prefer 3*M+N*NB) */ i__2 = *lwork - iwork + 1; dormbr_("P", "L", "T", m, n, m, &a[a_offset], lda, & work[itaup], &vt[vt_offset], ldvt, &work[ iwork], &i__2, &ierr); iwork = ie + *m; /* Perform bidiagonal QR iteration, computing right singular vectors of A in VT (Workspace: need BDSPAC) */ dbdsqr_("U", m, n, &c__0, &c__0, &s[1], &work[ie], & vt[vt_offset], ldvt, dum, &c__1, dum, &c__1, & work[iwork], info); } } else if (wntuo) { /* Path 5t(N much larger than M, JOBU='O', JOBVT='S') M right singular vectors to be computed in VT and M left singular vectors to be overwritten on A Computing MAX */ i__2 = *m << 2; if (*lwork >= (*m << 1) * *m + max(i__2,bdspac)) { /* Sufficient workspace for a fast algorithm */ iu = 1; if (*lwork >= wrkbl + (*lda << 1) * *m) { /* WORK(IU) is LDA by M and WORK(IR) is LDA by M */ ldwrku = *lda; ir = iu + ldwrku * *m; ldwrkr = *lda; } else if (*lwork >= wrkbl + (*lda + *m) * *m) { /* WORK(IU) is LDA by M and WORK(IR) is M by M */ ldwrku = *lda; ir = iu + ldwrku * *m; ldwrkr = *m; } else { /* WORK(IU) is M by M and WORK(IR) is M by M */ ldwrku = *m; ir = iu + ldwrku * *m; ldwrkr = *m; } itau = ir + ldwrkr * *m; iwork = itau + *m; /* Compute A=L*Q (Workspace: need 2*M*M+2*M, prefer 2*M*M+M+M*NB) */ i__2 = *lwork - iwork + 1; dgelqf_(m, n, &a[a_offset], lda, &work[itau], &work[ iwork], &i__2, &ierr); /* Copy L to WORK(IU), zeroing out below it */ dlacpy_("L", m, m, &a[a_offset], lda, &work[iu], & ldwrku); i__2 = *m - 1; i__3 = *m - 1; dlaset_("U", &i__2, &i__3, &c_b416, &c_b416, &work[iu + ldwrku], &ldwrku); /* Generate Q in A (Workspace: need 2*M*M+2*M, prefer 2*M*M+M+M*NB) */ i__2 = *lwork - iwork + 1; dorglq_(m, n, m, &a[a_offset], lda, &work[itau], & work[iwork], &i__2, &ierr); ie = itau; itauq = ie + *m; itaup = itauq + *m; iwork = itaup + *m; /* Bidiagonalize L in WORK(IU), copying result to WORK(IR) (Workspace: need 2*M*M+4*M, prefer 2*M*M+3*M+2*M*NB) */ i__2 = *lwork - iwork + 1; dgebrd_(m, m, &work[iu], &ldwrku, &s[1], &work[ie], & work[itauq], &work[itaup], &work[iwork], & i__2, &ierr); dlacpy_("L", m, m, &work[iu], &ldwrku, &work[ir], & ldwrkr); /* Generate right bidiagonalizing vectors in WORK(IU) (Workspace: need 2*M*M+4*M-1, prefer 2*M*M+3*M+(M-1)*NB) */ i__2 = *lwork - iwork + 1; dorgbr_("P", m, m, m, &work[iu], &ldwrku, &work[itaup] , &work[iwork], &i__2, &ierr); /* Generate left bidiagonalizing vectors in WORK(IR) (Workspace: need 2*M*M+4*M, prefer 2*M*M+3*M+M*NB) */ i__2 = *lwork - iwork + 1; dorgbr_("Q", m, m, m, &work[ir], &ldwrkr, &work[itauq] , &work[iwork], &i__2, &ierr); iwork = ie + *m; /* Perform bidiagonal QR iteration, computing left singular vectors of L in WORK(IR) and computing right singular vectors of L in WORK(IU) (Workspace: need 2*M*M+BDSPAC) */ dbdsqr_("U", m, m, m, &c__0, &s[1], &work[ie], &work[ iu], &ldwrku, &work[ir], &ldwrkr, dum, &c__1, &work[iwork], info); /* Multiply right singular vectors of L in WORK(IU) by Q in A, storing result in VT (Workspace: need M*M) */ dgemm_("N", "N", m, n, m, &c_b438, &work[iu], &ldwrku, &a[a_offset], lda, &c_b416, &vt[vt_offset], ldvt); /* Copy left singular vectors of L to A (Workspace: need M*M) */ dlacpy_("F", m, m, &work[ir], &ldwrkr, &a[a_offset], lda); } else { /* Insufficient workspace for a fast algorithm */ itau = 1; iwork = itau + *m; /* Compute A=L*Q, copying result to VT (Workspace: need 2*M, prefer M+M*NB) */ i__2 = *lwork - iwork + 1; dgelqf_(m, n, &a[a_offset], lda, &work[itau], &work[ iwork], &i__2, &ierr); dlacpy_("U", m, n, &a[a_offset], lda, &vt[vt_offset], ldvt); /* Generate Q in VT (Workspace: need 2*M, prefer M+M*NB) */ i__2 = *lwork - iwork + 1; dorglq_(m, n, m, &vt[vt_offset], ldvt, &work[itau], & work[iwork], &i__2, &ierr); ie = itau; itauq = ie + *m; itaup = itauq + *m; iwork = itaup + *m; /* Zero out above L in A */ i__2 = *m - 1; i__3 = *m - 1; dlaset_("U", &i__2, &i__3, &c_b416, &c_b416, &a_ref(1, 2), lda); /* Bidiagonalize L in A (Workspace: need 4*M, prefer 3*M+2*M*NB) */ i__2 = *lwork - iwork + 1; dgebrd_(m, m, &a[a_offset], lda, &s[1], &work[ie], & work[itauq], &work[itaup], &work[iwork], & i__2, &ierr); /* Multiply right vectors bidiagonalizing L by Q in VT (Workspace: need 3*M+N, prefer 3*M+N*NB) */ i__2 = *lwork - iwork + 1; dormbr_("P", "L", "T", m, n, m, &a[a_offset], lda, & work[itaup], &vt[vt_offset], ldvt, &work[ iwork], &i__2, &ierr); /* Generate left bidiagonalizing vectors of L in A (Workspace: need 4*M, prefer 3*M+M*NB) */ i__2 = *lwork - iwork + 1; dorgbr_("Q", m, m, m, &a[a_offset], lda, &work[itauq], &work[iwork], &i__2, &ierr); iwork = ie + *m; /* Perform bidiagonal QR iteration, compute left singular vectors of A in A and compute right singular vectors of A in VT (Workspace: need BDSPAC) */ dbdsqr_("U", m, n, m, &c__0, &s[1], &work[ie], &vt[ vt_offset], ldvt, &a[a_offset], lda, dum, & c__1, &work[iwork], info); } } else if (wntuas) { /* Path 6t(N much larger than M, JOBU='S' or 'A', JOBVT='S') M right singular vectors to be computed in VT and M left singular vectors to be computed in U Computing MAX */ i__2 = *m << 2; if (*lwork >= *m * *m + max(i__2,bdspac)) { /* Sufficient workspace for a fast algorithm */ iu = 1; if (*lwork >= wrkbl + *lda * *m) { /* WORK(IU) is LDA by N */ ldwrku = *lda; } else { /* WORK(IU) is LDA by M */ ldwrku = *m; } itau = iu + ldwrku * *m; iwork = itau + *m; /* Compute A=L*Q (Workspace: need M*M+2*M, prefer M*M+M+M*NB) */ i__2 = *lwork - iwork + 1; dgelqf_(m, n, &a[a_offset], lda, &work[itau], &work[ iwork], &i__2, &ierr); /* Copy L to WORK(IU), zeroing out above it */ dlacpy_("L", m, m, &a[a_offset], lda, &work[iu], & ldwrku); i__2 = *m - 1; i__3 = *m - 1; dlaset_("U", &i__2, &i__3, &c_b416, &c_b416, &work[iu + ldwrku], &ldwrku); /* Generate Q in A (Workspace: need M*M+2*M, prefer M*M+M+M*NB) */ i__2 = *lwork - iwork + 1; dorglq_(m, n, m, &a[a_offset], lda, &work[itau], & work[iwork], &i__2, &ierr); ie = itau; itauq = ie + *m; itaup = itauq + *m; iwork = itaup + *m; /* Bidiagonalize L in WORK(IU), copying result to U (Workspace: need M*M+4*M, prefer M*M+3*M+2*M*NB) */ i__2 = *lwork - iwork + 1; dgebrd_(m, m, &work[iu], &ldwrku, &s[1], &work[ie], & work[itauq], &work[itaup], &work[iwork], & i__2, &ierr); dlacpy_("L", m, m, &work[iu], &ldwrku, &u[u_offset], ldu); /* Generate right bidiagonalizing vectors in WORK(IU) (Workspace: need M*M+4*M-1, prefer M*M+3*M+(M-1)*NB) */ i__2 = *lwork - iwork + 1; dorgbr_("P", m, m, m, &work[iu], &ldwrku, &work[itaup] , &work[iwork], &i__2, &ierr); /* Generate left bidiagonalizing vectors in U (Workspace: need M*M+4*M, prefer M*M+3*M+M*NB) */ i__2 = *lwork - iwork + 1; dorgbr_("Q", m, m, m, &u[u_offset], ldu, &work[itauq], &work[iwork], &i__2, &ierr); iwork = ie + *m; /* Perform bidiagonal QR iteration, computing left singular vectors of L in U and computing right singular vectors of L in WORK(IU) (Workspace: need M*M+BDSPAC) */ dbdsqr_("U", m, m, m, &c__0, &s[1], &work[ie], &work[ iu], &ldwrku, &u[u_offset], ldu, dum, &c__1, & work[iwork], info); /* Multiply right singular vectors of L in WORK(IU) by Q in A, storing result in VT (Workspace: need M*M) */ dgemm_("N", "N", m, n, m, &c_b438, &work[iu], &ldwrku, &a[a_offset], lda, &c_b416, &vt[vt_offset], ldvt); } else { /* Insufficient workspace for a fast algorithm */ itau = 1; iwork = itau + *m; /* Compute A=L*Q, copying result to VT (Workspace: need 2*M, prefer M+M*NB) */ i__2 = *lwork - iwork + 1; dgelqf_(m, n, &a[a_offset], lda, &work[itau], &work[ iwork], &i__2, &ierr); dlacpy_("U", m, n, &a[a_offset], lda, &vt[vt_offset], ldvt); /* Generate Q in VT (Workspace: need 2*M, prefer M+M*NB) */ i__2 = *lwork - iwork + 1; dorglq_(m, n, m, &vt[vt_offset], ldvt, &work[itau], & work[iwork], &i__2, &ierr); /* Copy L to U, zeroing out above it */ dlacpy_("L", m, m, &a[a_offset], lda, &u[u_offset], ldu); i__2 = *m - 1; i__3 = *m - 1; dlaset_("U", &i__2, &i__3, &c_b416, &c_b416, &u_ref(1, 2), ldu); ie = itau; itauq = ie + *m; itaup = itauq + *m; iwork = itaup + *m; /* Bidiagonalize L in U (Workspace: need 4*M, prefer 3*M+2*M*NB) */ i__2 = *lwork - iwork + 1; dgebrd_(m, m, &u[u_offset], ldu, &s[1], &work[ie], & work[itauq], &work[itaup], &work[iwork], & i__2, &ierr); /* Multiply right bidiagonalizing vectors in U by Q in VT (Workspace: need 3*M+N, prefer 3*M+N*NB) */ i__2 = *lwork - iwork + 1; dormbr_("P", "L", "T", m, n, m, &u[u_offset], ldu, & work[itaup], &vt[vt_offset], ldvt, &work[ iwork], &i__2, &ierr); /* Generate left bidiagonalizing vectors in U (Workspace: need 4*M, prefer 3*M+M*NB) */ i__2 = *lwork - iwork + 1; dorgbr_("Q", m, m, m, &u[u_offset], ldu, &work[itauq], &work[iwork], &i__2, &ierr); iwork = ie + *m; /* Perform bidiagonal QR iteration, computing left singular vectors of A in U and computing right singular vectors of A in VT (Workspace: need BDSPAC) */ dbdsqr_("U", m, n, m, &c__0, &s[1], &work[ie], &vt[ vt_offset], ldvt, &u[u_offset], ldu, dum, & c__1, &work[iwork], info); } } } else if (wntva) { if (wntun) { /* Path 7t(N much larger than M, JOBU='N', JOBVT='A') N right singular vectors to be computed in VT and no left singular vectors to be computed Computing MAX */ i__2 = *n + *m, i__3 = *m << 2, i__2 = max(i__2,i__3); if (*lwork >= *m * *m + max(i__2,bdspac)) { /* Sufficient workspace for a fast algorithm */ ir = 1; if (*lwork >= wrkbl + *lda * *m) { /* WORK(IR) is LDA by M */ ldwrkr = *lda; } else { /* WORK(IR) is M by M */ ldwrkr = *m; } itau = ir + ldwrkr * *m; iwork = itau + *m; /* Compute A=L*Q, copying result to VT (Workspace: need M*M+2*M, prefer M*M+M+M*NB) */ i__2 = *lwork - iwork + 1; dgelqf_(m, n, &a[a_offset], lda, &work[itau], &work[ iwork], &i__2, &ierr); dlacpy_("U", m, n, &a[a_offset], lda, &vt[vt_offset], ldvt); /* Copy L to WORK(IR), zeroing out above it */ dlacpy_("L", m, m, &a[a_offset], lda, &work[ir], & ldwrkr); i__2 = *m - 1; i__3 = *m - 1; dlaset_("U", &i__2, &i__3, &c_b416, &c_b416, &work[ir + ldwrkr], &ldwrkr); /* Generate Q in VT (Workspace: need M*M+M+N, prefer M*M+M+N*NB) */ i__2 = *lwork - iwork + 1; dorglq_(n, n, m, &vt[vt_offset], ldvt, &work[itau], & work[iwork], &i__2, &ierr); ie = itau; itauq = ie + *m; itaup = itauq + *m; iwork = itaup + *m; /* Bidiagonalize L in WORK(IR) (Workspace: need M*M+4*M, prefer M*M+3*M+2*M*NB) */ i__2 = *lwork - iwork + 1; dgebrd_(m, m, &work[ir], &ldwrkr, &s[1], &work[ie], & work[itauq], &work[itaup], &work[iwork], & i__2, &ierr); /* Generate right bidiagonalizing vectors in WORK(IR) (Workspace: need M*M+4*M-1, prefer M*M+3*M+(M-1)*NB) */ i__2 = *lwork - iwork + 1; dorgbr_("P", m, m, m, &work[ir], &ldwrkr, &work[itaup] , &work[iwork], &i__2, &ierr); iwork = ie + *m; /* Perform bidiagonal QR iteration, computing right singular vectors of L in WORK(IR) (Workspace: need M*M+BDSPAC) */ dbdsqr_("U", m, m, &c__0, &c__0, &s[1], &work[ie], & work[ir], &ldwrkr, dum, &c__1, dum, &c__1, & work[iwork], info); /* Multiply right singular vectors of L in WORK(IR) by Q in VT, storing result in A (Workspace: need M*M) */ dgemm_("N", "N", m, n, m, &c_b438, &work[ir], &ldwrkr, &vt[vt_offset], ldvt, &c_b416, &a[a_offset], lda); /* Copy right singular vectors of A from A to VT */ dlacpy_("F", m, n, &a[a_offset], lda, &vt[vt_offset], ldvt); } else { /* Insufficient workspace for a fast algorithm */ itau = 1; iwork = itau + *m; /* Compute A=L*Q, copying result to VT (Workspace: need 2*M, prefer M+M*NB) */ i__2 = *lwork - iwork + 1; dgelqf_(m, n, &a[a_offset], lda, &work[itau], &work[ iwork], &i__2, &ierr); dlacpy_("U", m, n, &a[a_offset], lda, &vt[vt_offset], ldvt); /* Generate Q in VT (Workspace: need M+N, prefer M+N*NB) */ i__2 = *lwork - iwork + 1; dorglq_(n, n, m, &vt[vt_offset], ldvt, &work[itau], & work[iwork], &i__2, &ierr); ie = itau; itauq = ie + *m; itaup = itauq + *m; iwork = itaup + *m; /* Zero out above L in A */ i__2 = *m - 1; i__3 = *m - 1; dlaset_("U", &i__2, &i__3, &c_b416, &c_b416, &a_ref(1, 2), lda); /* Bidiagonalize L in A (Workspace: need 4*M, prefer 3*M+2*M*NB) */ i__2 = *lwork - iwork + 1; dgebrd_(m, m, &a[a_offset], lda, &s[1], &work[ie], & work[itauq], &work[itaup], &work[iwork], & i__2, &ierr); /* Multiply right bidiagonalizing vectors in A by Q in VT (Workspace: need 3*M+N, prefer 3*M+N*NB) */ i__2 = *lwork - iwork + 1; dormbr_("P", "L", "T", m, n, m, &a[a_offset], lda, & work[itaup], &vt[vt_offset], ldvt, &work[ iwork], &i__2, &ierr); iwork = ie + *m; /* Perform bidiagonal QR iteration, computing right singular vectors of A in VT (Workspace: need BDSPAC) */ dbdsqr_("U", m, n, &c__0, &c__0, &s[1], &work[ie], & vt[vt_offset], ldvt, dum, &c__1, dum, &c__1, & work[iwork], info); } } else if (wntuo) { /* Path 8t(N much larger than M, JOBU='O', JOBVT='A') N right singular vectors to be computed in VT and M left singular vectors to be overwritten on A Computing MAX */ i__2 = *n + *m, i__3 = *m << 2, i__2 = max(i__2,i__3); if (*lwork >= (*m << 1) * *m + max(i__2,bdspac)) { /* Sufficient workspace for a fast algorithm */ iu = 1; if (*lwork >= wrkbl + (*lda << 1) * *m) { /* WORK(IU) is LDA by M and WORK(IR) is LDA by M */ ldwrku = *lda; ir = iu + ldwrku * *m; ldwrkr = *lda; } else if (*lwork >= wrkbl + (*lda + *m) * *m) { /* WORK(IU) is LDA by M and WORK(IR) is M by M */ ldwrku = *lda; ir = iu + ldwrku * *m; ldwrkr = *m; } else { /* WORK(IU) is M by M and WORK(IR) is M by M */ ldwrku = *m; ir = iu + ldwrku * *m; ldwrkr = *m; } itau = ir + ldwrkr * *m; iwork = itau + *m; /* Compute A=L*Q, copying result to VT (Workspace: need 2*M*M+2*M, prefer 2*M*M+M+M*NB) */ i__2 = *lwork - iwork + 1; dgelqf_(m, n, &a[a_offset], lda, &work[itau], &work[ iwork], &i__2, &ierr); dlacpy_("U", m, n, &a[a_offset], lda, &vt[vt_offset], ldvt); /* Generate Q in VT (Workspace: need 2*M*M+M+N, prefer 2*M*M+M+N*NB) */ i__2 = *lwork - iwork + 1; dorglq_(n, n, m, &vt[vt_offset], ldvt, &work[itau], & work[iwork], &i__2, &ierr); /* Copy L to WORK(IU), zeroing out above it */ dlacpy_("L", m, m, &a[a_offset], lda, &work[iu], & ldwrku); i__2 = *m - 1; i__3 = *m - 1; dlaset_("U", &i__2, &i__3, &c_b416, &c_b416, &work[iu + ldwrku], &ldwrku); ie = itau; itauq = ie + *m; itaup = itauq + *m; iwork = itaup + *m; /* Bidiagonalize L in WORK(IU), copying result to WORK(IR) (Workspace: need 2*M*M+4*M, prefer 2*M*M+3*M+2*M*NB) */ i__2 = *lwork - iwork + 1; dgebrd_(m, m, &work[iu], &ldwrku, &s[1], &work[ie], & work[itauq], &work[itaup], &work[iwork], & i__2, &ierr); dlacpy_("L", m, m, &work[iu], &ldwrku, &work[ir], & ldwrkr); /* Generate right bidiagonalizing vectors in WORK(IU) (Workspace: need 2*M*M+4*M-1, prefer 2*M*M+3*M+(M-1)*NB) */ i__2 = *lwork - iwork + 1; dorgbr_("P", m, m, m, &work[iu], &ldwrku, &work[itaup] , &work[iwork], &i__2, &ierr); /* Generate left bidiagonalizing vectors in WORK(IR) (Workspace: need 2*M*M+4*M, prefer 2*M*M+3*M+M*NB) */ i__2 = *lwork - iwork + 1; dorgbr_("Q", m, m, m, &work[ir], &ldwrkr, &work[itauq] , &work[iwork], &i__2, &ierr); iwork = ie + *m; /* Perform bidiagonal QR iteration, computing left singular vectors of L in WORK(IR) and computing right singular vectors of L in WORK(IU) (Workspace: need 2*M*M+BDSPAC) */ dbdsqr_("U", m, m, m, &c__0, &s[1], &work[ie], &work[ iu], &ldwrku, &work[ir], &ldwrkr, dum, &c__1, &work[iwork], info); /* Multiply right singular vectors of L in WORK(IU) by Q in VT, storing result in A (Workspace: need M*M) */ dgemm_("N", "N", m, n, m, &c_b438, &work[iu], &ldwrku, &vt[vt_offset], ldvt, &c_b416, &a[a_offset], lda); /* Copy right singular vectors of A from A to VT */ dlacpy_("F", m, n, &a[a_offset], lda, &vt[vt_offset], ldvt); /* Copy left singular vectors of A from WORK(IR) to A */ dlacpy_("F", m, m, &work[ir], &ldwrkr, &a[a_offset], lda); } else { /* Insufficient workspace for a fast algorithm */ itau = 1; iwork = itau + *m; /* Compute A=L*Q, copying result to VT (Workspace: need 2*M, prefer M+M*NB) */ i__2 = *lwork - iwork + 1; dgelqf_(m, n, &a[a_offset], lda, &work[itau], &work[ iwork], &i__2, &ierr); dlacpy_("U", m, n, &a[a_offset], lda, &vt[vt_offset], ldvt); /* Generate Q in VT (Workspace: need M+N, prefer M+N*NB) */ i__2 = *lwork - iwork + 1; dorglq_(n, n, m, &vt[vt_offset], ldvt, &work[itau], & work[iwork], &i__2, &ierr); ie = itau; itauq = ie + *m; itaup = itauq + *m; iwork = itaup + *m; /* Zero out above L in A */ i__2 = *m - 1; i__3 = *m - 1; dlaset_("U", &i__2, &i__3, &c_b416, &c_b416, &a_ref(1, 2), lda); /* Bidiagonalize L in A (Workspace: need 4*M, prefer 3*M+2*M*NB) */ i__2 = *lwork - iwork + 1; dgebrd_(m, m, &a[a_offset], lda, &s[1], &work[ie], & work[itauq], &work[itaup], &work[iwork], & i__2, &ierr); /* Multiply right bidiagonalizing vectors in A by Q in VT (Workspace: need 3*M+N, prefer 3*M+N*NB) */ i__2 = *lwork - iwork + 1; dormbr_("P", "L", "T", m, n, m, &a[a_offset], lda, & work[itaup], &vt[vt_offset], ldvt, &work[ iwork], &i__2, &ierr); /* Generate left bidiagonalizing vectors in A (Workspace: need 4*M, prefer 3*M+M*NB) */ i__2 = *lwork - iwork + 1; dorgbr_("Q", m, m, m, &a[a_offset], lda, &work[itauq], &work[iwork], &i__2, &ierr); iwork = ie + *m; /* Perform bidiagonal QR iteration, computing left singular vectors of A in A and computing right singular vectors of A in VT (Workspace: need BDSPAC) */ dbdsqr_("U", m, n, m, &c__0, &s[1], &work[ie], &vt[ vt_offset], ldvt, &a[a_offset], lda, dum, & c__1, &work[iwork], info); } } else if (wntuas) { /* Path 9t(N much larger than M, JOBU='S' or 'A', JOBVT='A') N right singular vectors to be computed in VT and M left singular vectors to be computed in U Computing MAX */ i__2 = *n + *m, i__3 = *m << 2, i__2 = max(i__2,i__3); if (*lwork >= *m * *m + max(i__2,bdspac)) { /* Sufficient workspace for a fast algorithm */ iu = 1; if (*lwork >= wrkbl + *lda * *m) { /* WORK(IU) is LDA by M */ ldwrku = *lda; } else { /* WORK(IU) is M by M */ ldwrku = *m; } itau = iu + ldwrku * *m; iwork = itau + *m; /* Compute A=L*Q, copying result to VT (Workspace: need M*M+2*M, prefer M*M+M+M*NB) */ i__2 = *lwork - iwork + 1; dgelqf_(m, n, &a[a_offset], lda, &work[itau], &work[ iwork], &i__2, &ierr); dlacpy_("U", m, n, &a[a_offset], lda, &vt[vt_offset], ldvt); /* Generate Q in VT (Workspace: need M*M+M+N, prefer M*M+M+N*NB) */ i__2 = *lwork - iwork + 1; dorglq_(n, n, m, &vt[vt_offset], ldvt, &work[itau], & work[iwork], &i__2, &ierr); /* Copy L to WORK(IU), zeroing out above it */ dlacpy_("L", m, m, &a[a_offset], lda, &work[iu], & ldwrku); i__2 = *m - 1; i__3 = *m - 1; dlaset_("U", &i__2, &i__3, &c_b416, &c_b416, &work[iu + ldwrku], &ldwrku); ie = itau; itauq = ie + *m; itaup = itauq + *m; iwork = itaup + *m; /* Bidiagonalize L in WORK(IU), copying result to U (Workspace: need M*M+4*M, prefer M*M+3*M+2*M*NB) */ i__2 = *lwork - iwork + 1; dgebrd_(m, m, &work[iu], &ldwrku, &s[1], &work[ie], & work[itauq], &work[itaup], &work[iwork], & i__2, &ierr); dlacpy_("L", m, m, &work[iu], &ldwrku, &u[u_offset], ldu); /* Generate right bidiagonalizing vectors in WORK(IU) (Workspace: need M*M+4*M, prefer M*M+3*M+(M-1)*NB) */ i__2 = *lwork - iwork + 1; dorgbr_("P", m, m, m, &work[iu], &ldwrku, &work[itaup] , &work[iwork], &i__2, &ierr); /* Generate left bidiagonalizing vectors in U (Workspace: need M*M+4*M, prefer M*M+3*M+M*NB) */ i__2 = *lwork - iwork + 1; dorgbr_("Q", m, m, m, &u[u_offset], ldu, &work[itauq], &work[iwork], &i__2, &ierr); iwork = ie + *m; /* Perform bidiagonal QR iteration, computing left singular vectors of L in U and computing right singular vectors of L in WORK(IU) (Workspace: need M*M+BDSPAC) */ dbdsqr_("U", m, m, m, &c__0, &s[1], &work[ie], &work[ iu], &ldwrku, &u[u_offset], ldu, dum, &c__1, & work[iwork], info); /* Multiply right singular vectors of L in WORK(IU) by Q in VT, storing result in A (Workspace: need M*M) */ dgemm_("N", "N", m, n, m, &c_b438, &work[iu], &ldwrku, &vt[vt_offset], ldvt, &c_b416, &a[a_offset], lda); /* Copy right singular vectors of A from A to VT */ dlacpy_("F", m, n, &a[a_offset], lda, &vt[vt_offset], ldvt); } else { /* Insufficient workspace for a fast algorithm */ itau = 1; iwork = itau + *m; /* Compute A=L*Q, copying result to VT (Workspace: need 2*M, prefer M+M*NB) */ i__2 = *lwork - iwork + 1; dgelqf_(m, n, &a[a_offset], lda, &work[itau], &work[ iwork], &i__2, &ierr); dlacpy_("U", m, n, &a[a_offset], lda, &vt[vt_offset], ldvt); /* Generate Q in VT (Workspace: need M+N, prefer M+N*NB) */ i__2 = *lwork - iwork + 1; dorglq_(n, n, m, &vt[vt_offset], ldvt, &work[itau], & work[iwork], &i__2, &ierr); /* Copy L to U, zeroing out above it */ dlacpy_("L", m, m, &a[a_offset], lda, &u[u_offset], ldu); i__2 = *m - 1; i__3 = *m - 1; dlaset_("U", &i__2, &i__3, &c_b416, &c_b416, &u_ref(1, 2), ldu); ie = itau; itauq = ie + *m; itaup = itauq + *m; iwork = itaup + *m; /* Bidiagonalize L in U (Workspace: need 4*M, prefer 3*M+2*M*NB) */ i__2 = *lwork - iwork + 1; dgebrd_(m, m, &u[u_offset], ldu, &s[1], &work[ie], & work[itauq], &work[itaup], &work[iwork], & i__2, &ierr); /* Multiply right bidiagonalizing vectors in U by Q in VT (Workspace: need 3*M+N, prefer 3*M+N*NB) */ i__2 = *lwork - iwork + 1; dormbr_("P", "L", "T", m, n, m, &u[u_offset], ldu, & work[itaup], &vt[vt_offset], ldvt, &work[ iwork], &i__2, &ierr); /* Generate left bidiagonalizing vectors in U (Workspace: need 4*M, prefer 3*M+M*NB) */ i__2 = *lwork - iwork + 1; dorgbr_("Q", m, m, m, &u[u_offset], ldu, &work[itauq], &work[iwork], &i__2, &ierr); iwork = ie + *m; /* Perform bidiagonal QR iteration, computing left singular vectors of A in U and computing right singular vectors of A in VT (Workspace: need BDSPAC) */ dbdsqr_("U", m, n, m, &c__0, &s[1], &work[ie], &vt[ vt_offset], ldvt, &u[u_offset], ldu, dum, & c__1, &work[iwork], info); } } } } else { /* N .LT. MNTHR Path 10t(N greater than M, but not much larger) Reduce to bidiagonal form without LQ decomposition */ ie = 1; itauq = ie + *m; itaup = itauq + *m; iwork = itaup + *m; /* Bidiagonalize A (Workspace: need 3*M+N, prefer 3*M+(M+N)*NB) */ i__2 = *lwork - iwork + 1; dgebrd_(m, n, &a[a_offset], lda, &s[1], &work[ie], &work[itauq], & work[itaup], &work[iwork], &i__2, &ierr); if (wntuas) { /* If left singular vectors desired in U, copy result to U and generate left bidiagonalizing vectors in U (Workspace: need 4*M-1, prefer 3*M+(M-1)*NB) */ dlacpy_("L", m, m, &a[a_offset], lda, &u[u_offset], ldu); i__2 = *lwork - iwork + 1; dorgbr_("Q", m, m, n, &u[u_offset], ldu, &work[itauq], &work[ iwork], &i__2, &ierr); } if (wntvas) { /* If right singular vectors desired in VT, copy result to VT and generate right bidiagonalizing vectors in VT (Workspace: need 3*M+NRVT, prefer 3*M+NRVT*NB) */ dlacpy_("U", m, n, &a[a_offset], lda, &vt[vt_offset], ldvt); if (wntva) { nrvt = *n; } if (wntvs) { nrvt = *m; } i__2 = *lwork - iwork + 1; dorgbr_("P", &nrvt, n, m, &vt[vt_offset], ldvt, &work[itaup], &work[iwork], &i__2, &ierr); } if (wntuo) { /* If left singular vectors desired in A, generate left bidiagonalizing vectors in A (Workspace: need 4*M-1, prefer 3*M+(M-1)*NB) */ i__2 = *lwork - iwork + 1; dorgbr_("Q", m, m, n, &a[a_offset], lda, &work[itauq], &work[ iwork], &i__2, &ierr); } if (wntvo) { /* If right singular vectors desired in A, generate right bidiagonalizing vectors in A (Workspace: need 4*M, prefer 3*M+M*NB) */ i__2 = *lwork - iwork + 1; dorgbr_("P", m, n, m, &a[a_offset], lda, &work[itaup], &work[ iwork], &i__2, &ierr); } iwork = ie + *m; if (wntuas || wntuo) { nru = *m; } if (wntun) { nru = 0; } if (wntvas || wntvo) { ncvt = *n; } if (wntvn) { ncvt = 0; } if (! wntuo && ! wntvo) { /* Perform bidiagonal QR iteration, if desired, computing left singular vectors in U and computing right singular vectors in VT (Workspace: need BDSPAC) */ dbdsqr_("L", m, &ncvt, &nru, &c__0, &s[1], &work[ie], &vt[ vt_offset], ldvt, &u[u_offset], ldu, dum, &c__1, & work[iwork], info); } else if (! wntuo && wntvo) { /* Perform bidiagonal QR iteration, if desired, computing left singular vectors in U and computing right singular vectors in A (Workspace: need BDSPAC) */ dbdsqr_("L", m, &ncvt, &nru, &c__0, &s[1], &work[ie], &a[ a_offset], lda, &u[u_offset], ldu, dum, &c__1, &work[ iwork], info); } else { /* Perform bidiagonal QR iteration, if desired, computing left singular vectors in A and computing right singular vectors in VT (Workspace: need BDSPAC) */ dbdsqr_("L", m, &ncvt, &nru, &c__0, &s[1], &work[ie], &vt[ vt_offset], ldvt, &a[a_offset], lda, dum, &c__1, & work[iwork], info); } } } /* If DBDSQR failed to converge, copy unconverged superdiagonals to WORK( 2:MINMN ) */ if (*info != 0) { if (ie > 2) { i__2 = minmn - 1; for (i__ = 1; i__ <= i__2; ++i__) { work[i__ + 1] = work[i__ + ie - 1]; /* L50: */ } } if (ie < 2) { for (i__ = minmn - 1; i__ >= 1; --i__) { work[i__ + 1] = work[i__ + ie - 1]; /* L60: */ } } } /* Undo scaling if necessary */ if (iscl == 1) { if (anrm > bignum) { dlascl_("G", &c__0, &c__0, &bignum, &anrm, &minmn, &c__1, &s[1], & minmn, &ierr); } if (*info != 0 && anrm > bignum) { i__2 = minmn - 1; dlascl_("G", &c__0, &c__0, &bignum, &anrm, &i__2, &c__1, &work[2], &minmn, &ierr); } if (anrm < smlnum) { dlascl_("G", &c__0, &c__0, &smlnum, &anrm, &minmn, &c__1, &s[1], & minmn, &ierr); } if (*info != 0 && anrm < smlnum) { i__2 = minmn - 1; dlascl_("G", &c__0, &c__0, &smlnum, &anrm, &i__2, &c__1, &work[2], &minmn, &ierr); } } /* Return optimal workspace in WORK(1) */ work[1] = (doublereal) maxwrk; return 0; /* End of DGESVD */ } /* dgesvd_ */ #undef vt_ref #undef u_ref #undef a_ref #ifdef __cplusplus } #endif hypre-2.33.0/src/lapack/dgetf2.c000066400000000000000000000104121477326011500162730ustar00rootroot00000000000000/* Copyright (c) 1992-2008 The University of Tennessee. All rights reserved. * See file COPYING in this directory for details. */ #ifdef __cplusplus extern "C" { #endif #include "f2c.h" #include "hypre_lapack.h" /* Subroutine */ integer dgetf2_(integer *m, integer *n, doublereal *a, integer * lda, integer *ipiv, integer *info) { /* -- LAPACK routine (version 3.0) -- Univ. of Tennessee, Univ. of California Berkeley, NAG Ltd., Courant Institute, Argonne National Lab, and Rice University June 30, 1992 Purpose ======= DGETF2 computes an LU factorization of a general m-by-n matrix A using partial pivoting with row interchanges. The factorization has the form A = P * L * U where P is a permutation matrix, L is lower triangular with unit diagonal elements (lower trapezoidal if m > n), and U is upper triangular (upper trapezoidal if m < n). This is the right-looking Level 2 BLAS version of the algorithm. Arguments ========= M (input) INTEGER The number of rows of the matrix A. M >= 0. N (input) INTEGER The number of columns of the matrix A. N >= 0. A (input/output) DOUBLE PRECISION array, dimension (LDA,N) On entry, the m by n matrix to be factored. On exit, the factors L and U from the factorization A = P*L*U; the unit diagonal elements of L are not stored. LDA (input) INTEGER The leading dimension of the array A. LDA >= max(1,M). IPIV (output) INTEGER array, dimension (min(M,N)) The pivot indices; for 1 <= i <= min(M,N), row i of the matrix was interchanged with row IPIV(i). INFO (output) INTEGER = 0: successful exit < 0: if INFO = -k, the k-th argument had an illegal value > 0: if INFO = k, U(k,k) is exactly zero. The factorization has been completed, but the factor U is exactly singular, and division by zero will occur if it is used to solve a system of equations. ===================================================================== Test the input parameters. Parameter adjustments */ /* Table of constant values */ integer c__1 = 1; doublereal c_b6 = -1.; /* System generated locals */ integer a_dim1, a_offset, i__1, i__2, i__3; doublereal d__1; /* Local variables */ extern /* Subroutine */ integer dger_(integer *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *, doublereal *, integer *); integer j; extern /* Subroutine */ integer dscal_(integer *, doublereal *, doublereal *, integer *), dswap_(integer *, doublereal *, integer *, doublereal *, integer *); integer jp; extern integer idamax_(integer *, doublereal *, integer *); extern /* Subroutine */ integer xerbla_(const char *, integer *); #define a_ref(a_1,a_2) a[(a_2)*a_dim1 + a_1] a_dim1 = *lda; a_offset = 1 + a_dim1 * 1; a -= a_offset; --ipiv; /* Function Body */ *info = 0; if (*m < 0) { *info = -1; } else if (*n < 0) { *info = -2; } else if (*lda < max(1,*m)) { *info = -4; } if (*info != 0) { i__1 = -(*info); xerbla_("DGETF2", &i__1); return 0; } /* Quick return if possible */ if (*m == 0 || *n == 0) { return 0; } i__1 = min(*m,*n); for (j = 1; j <= i__1; ++j) { /* Find pivot and test for singularity. */ i__2 = *m - j + 1; jp = j - 1 + idamax_(&i__2, &a_ref(j, j), &c__1); ipiv[j] = jp; if (a_ref(jp, j) != 0.) { /* Apply the interchange to columns 1:N. */ if (jp != j) { dswap_(n, &a_ref(j, 1), lda, &a_ref(jp, 1), lda); } /* Compute elements J+1:M of J-th column. */ if (j < *m) { i__2 = *m - j; d__1 = 1. / a_ref(j, j); dscal_(&i__2, &d__1, &a_ref(j + 1, j), &c__1); } } else if (*info == 0) { *info = j; } if (j < min(*m,*n)) { /* Update trailing submatrix. */ i__2 = *m - j; i__3 = *n - j; dger_(&i__2, &i__3, &c_b6, &a_ref(j + 1, j), &c__1, &a_ref(j, j + 1), lda, &a_ref(j + 1, j + 1), lda); } /* L10: */ } return 0; /* End of DGETF2 */ } /* dgetf2_ */ #undef a_ref #ifdef __cplusplus } #endif hypre-2.33.0/src/lapack/dgetrf.c000066400000000000000000000133221477326011500163760ustar00rootroot00000000000000/* Copyright (c) 1992-2008 The University of Tennessee. All rights reserved. * See file COPYING in this directory for details. */ #ifdef __cplusplus extern "C" { #endif #include "f2c.h" #include "hypre_lapack.h" /* Subroutine */ integer dgetrf_(integer *m, integer *n, doublereal *a, integer * lda, integer *ipiv, integer *info) { /* -- LAPACK routine (version 3.0) -- Univ. of Tennessee, Univ. of California Berkeley, NAG Ltd., Courant Institute, Argonne National Lab, and Rice University March 31, 1993 Purpose ======= DGETRF computes an LU factorization of a general M-by-N matrix A using partial pivoting with row interchanges. The factorization has the form A = P * L * U where P is a permutation matrix, L is lower triangular with unit diagonal elements (lower trapezoidal if m > n), and U is upper triangular (upper trapezoidal if m < n). This is the right-looking Level 3 BLAS version of the algorithm. Arguments ========= M (input) INTEGER The number of rows of the matrix A. M >= 0. N (input) INTEGER The number of columns of the matrix A. N >= 0. A (input/output) DOUBLE PRECISION array, dimension (LDA,N) On entry, the M-by-N matrix to be factored. On exit, the factors L and U from the factorization A = P*L*U; the unit diagonal elements of L are not stored. LDA (input) INTEGER The leading dimension of the array A. LDA >= max(1,M). IPIV (output) INTEGER array, dimension (min(M,N)) The pivot indices; for 1 <= i <= min(M,N), row i of the matrix was interchanged with row IPIV(i). INFO (output) INTEGER = 0: successful exit < 0: if INFO = -i, the i-th argument had an illegal value > 0: if INFO = i, U(i,i) is exactly zero. The factorization has been completed, but the factor U is exactly singular, and division by zero will occur if it is used to solve a system of equations. ===================================================================== Test the input parameters. Parameter adjustments */ /* Table of constant values */ integer c__1 = 1; integer c_n1 = -1; doublereal c_b16 = 1.; doublereal c_b19 = -1.; /* System generated locals */ integer a_dim1, a_offset, i__1, i__2, i__3, i__4, i__5; /* Local variables */ integer i__, j; extern /* Subroutine */ integer dgemm_(const char *,const char *, integer *, integer *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *); integer iinfo; extern /* Subroutine */ integer dtrsm_(const char *,const char *,const char *,const char *, integer *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *), dgetf2_( integer *, integer *, doublereal *, integer *, integer *, integer *); integer jb, nb; extern /* Subroutine */ integer xerbla_(const char *, integer *); extern integer ilaenv_(integer *,const char *,const char *, integer *, integer *, integer *, integer *, ftnlen, ftnlen); extern /* Subroutine */ integer dlaswp_(integer *, doublereal *, integer *, integer *, integer *, integer *, integer *); #define a_ref(a_1,a_2) a[(a_2)*a_dim1 + a_1] a_dim1 = *lda; a_offset = 1 + a_dim1 * 1; a -= a_offset; --ipiv; /* Function Body */ *info = 0; if (*m < 0) { *info = -1; } else if (*n < 0) { *info = -2; } else if (*lda < max(1,*m)) { *info = -4; } if (*info != 0) { i__1 = -(*info); xerbla_("DGETRF", &i__1); return 0; } /* Quick return if possible */ if (*m == 0 || *n == 0) { return 0; } /* Determine the block size for this environment. */ nb = ilaenv_(&c__1, "DGETRF", " ", m, n, &c_n1, &c_n1, (ftnlen)6, (ftnlen) 1); if (nb <= 1 || nb >= min(*m,*n)) { /* Use unblocked code. */ dgetf2_(m, n, &a[a_offset], lda, &ipiv[1], info); } else { /* Use blocked code. */ i__1 = min(*m,*n); i__2 = nb; for (j = 1; i__2 < 0 ? j >= i__1 : j <= i__1; j += i__2) { /* Computing MIN */ i__3 = min(*m,*n) - j + 1; jb = min(i__3,nb); /* Factor diagonal and subdiagonal blocks and test for exact singularity. */ i__3 = *m - j + 1; dgetf2_(&i__3, &jb, &a_ref(j, j), lda, &ipiv[j], &iinfo); /* Adjust INFO and the pivot indices. */ if (*info == 0 && iinfo > 0) { *info = iinfo + j - 1; } /* Computing MIN */ i__4 = *m, i__5 = j + jb - 1; i__3 = min(i__4,i__5); for (i__ = j; i__ <= i__3; ++i__) { ipiv[i__] = j - 1 + ipiv[i__]; /* L10: */ } /* Apply interchanges to columns 1:J-1. */ i__3 = j - 1; i__4 = j + jb - 1; dlaswp_(&i__3, &a[a_offset], lda, &j, &i__4, &ipiv[1], &c__1); if (j + jb <= *n) { /* Apply interchanges to columns J+JB:N. */ i__3 = *n - j - jb + 1; i__4 = j + jb - 1; dlaswp_(&i__3, &a_ref(1, j + jb), lda, &j, &i__4, &ipiv[1], & c__1); /* Compute block row of U. */ i__3 = *n - j - jb + 1; dtrsm_("Left", "Lower", "No transpose", "Unit", &jb, &i__3, & c_b16, &a_ref(j, j), lda, &a_ref(j, j + jb), lda); if (j + jb <= *m) { /* Update trailing submatrix. */ i__3 = *m - j - jb + 1; i__4 = *n - j - jb + 1; dgemm_("No transpose", "No transpose", &i__3, &i__4, &jb, &c_b19, &a_ref(j + jb, j), lda, &a_ref(j, j + jb), lda, &c_b16, &a_ref(j + jb, j + jb), lda); } } /* L20: */ } } return 0; /* End of DGETRF */ } /* dgetrf_ */ #undef a_ref #ifdef __cplusplus } #endif hypre-2.33.0/src/lapack/dgetri.c000066400000000000000000000155031477326011500164040ustar00rootroot00000000000000/* Copyright (c) 1992-2008 The University of Tennessee. All rights reserved. * See file COPYING in this directory for details. */ #ifdef __cplusplus extern "C" { #endif #include "f2c.h" #include "hypre_lapack.h" /* Subroutine */ integer dgetri_(integer *n, doublereal *a, integer *lda, integer *ipiv, doublereal *work, integer *lwork, integer *info) { /* -- LAPACK routine (version 3.0) -- Univ. of Tennessee, Univ. of California Berkeley, NAG Ltd., Courant Institute, Argonne National Lab, and Rice University June 30, 1999 Purpose ======= DGETRI computes the inverse of a matrix using the LU factorization computed by DGETRF. This method inverts U and then computes inv(A) by solving the system inv(A)*L = inv(U) for inv(A). Arguments ========= N (input) INTEGER The order of the matrix A. N >= 0. A (input/output) DOUBLE PRECISION array, dimension (LDA,N) On entry, the factors L and U from the factorization A = P*L*U as computed by DGETRF. On exit, if INFO = 0, the inverse of the original matrix A. LDA (input) INTEGER The leading dimension of the array A. LDA >= max(1,N). IPIV (input) INTEGER array, dimension (N) The pivot indices from DGETRF; for 1<=i<=N, row i of the matrix was interchanged with row IPIV(i). WORK (workspace/output) DOUBLE PRECISION array, dimension (LWORK) On exit, if INFO=0, then WORK(1) returns the optimal LWORK. LWORK (input) INTEGER The dimension of the array WORK. LWORK >= max(1,N). For optimal performance LWORK >= N*NB, where NB is the optimal blocksize returned by ILAENV. If LWORK = -1, then a workspace query is assumed; the routine only calculates the optimal size of the WORK array, returns this value as the first entry of the WORK array, and no error message related to LWORK is issued by XERBLA. INFO (output) INTEGER = 0: successful exit < 0: if INFO = -i, the i-th argument had an illegal value > 0: if INFO = i, U(i,i) is exactly zero; the matrix is singular and its inverse could not be computed. ===================================================================== Test the input parameters. Parameter adjustments */ /* Table of constant values */ integer c__1 = 1; integer c_n1 = -1; integer c__2 = 2; doublereal c_b20 = -1.; doublereal c_b22 = 1.; /* System generated locals */ integer a_dim1, a_offset, i__1, i__2, i__3; /* Local variables */ integer i__, j; extern /* Subroutine */ integer dgemm_(const char *, const char *, integer *, integer *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *), dgemv_(const char *, integer *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *); integer nbmin; extern /* Subroutine */ integer dswap_(integer *, doublereal *, integer *, doublereal *, integer *), dtrsm_(const char *, const char *, const char *, const char *, integer *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *); integer jb, nb, jj, jp, nn; extern /* Subroutine */ integer xerbla_(const char *, integer *); extern integer ilaenv_(integer *, const char *, const char *, integer *, integer *, integer *, integer *, ftnlen, ftnlen); integer ldwork; extern /* Subroutine */ integer dtrtri_(const char *, const char *, integer *, doublereal *, integer *, integer *); integer lwkopt; logical lquery; integer iws; #define a_ref(a_1,a_2) a[(a_2)*a_dim1 + a_1] a_dim1 = *lda; a_offset = 1 + a_dim1 * 1; a -= a_offset; --ipiv; --work; /* Function Body */ *info = 0; nb = ilaenv_(&c__1, "DGETRI", " ", n, &c_n1, &c_n1, &c_n1, (ftnlen)6, ( ftnlen)1); lwkopt = *n * nb; work[1] = (doublereal) lwkopt; lquery = *lwork == -1; if (*n < 0) { *info = -1; } else if (*lda < max(1,*n)) { *info = -3; } else if (*lwork < max(1,*n) && ! lquery) { *info = -6; } if (*info != 0) { i__1 = -(*info); xerbla_("DGETRI", &i__1); return 0; } else if (lquery) { return 0; } /* Quick return if possible */ if (*n == 0) { return 0; } /* Form inv(U). If INFO > 0 from DTRTRI, then U is singular, and the inverse is not computed. */ dtrtri_("Upper", "Non-unit", n, &a[a_offset], lda, info); if (*info > 0) { return 0; } nbmin = 2; ldwork = *n; if (nb > 1 && nb < *n) { /* Computing MAX */ i__1 = ldwork * nb; iws = max(i__1,1); if (*lwork < iws) { nb = *lwork / ldwork; /* Computing MAX */ i__1 = 2, i__2 = ilaenv_(&c__2, "DGETRI", " ", n, &c_n1, &c_n1, & c_n1, (ftnlen)6, (ftnlen)1); nbmin = max(i__1,i__2); } } else { iws = *n; } /* Solve the equation inv(A)*L = inv(U) for inv(A). */ if (nb < nbmin || nb >= *n) { /* Use unblocked code. */ for (j = *n; j >= 1; --j) { /* Copy current column of L to WORK and replace with zeros. */ i__1 = *n; for (i__ = j + 1; i__ <= i__1; ++i__) { work[i__] = a_ref(i__, j); a_ref(i__, j) = 0.; /* L10: */ } /* Compute current column of inv(A). */ if (j < *n) { i__1 = *n - j; dgemv_("No transpose", n, &i__1, &c_b20, &a_ref(1, j + 1), lda, &work[j + 1], &c__1, &c_b22, &a_ref(1, j), &c__1); } /* L20: */ } } else { /* Use blocked code. */ nn = (*n - 1) / nb * nb + 1; i__1 = -nb; for (j = nn; i__1 < 0 ? j >= 1 : j <= 1; j += i__1) { /* Computing MIN */ i__2 = nb, i__3 = *n - j + 1; jb = min(i__2,i__3); /* Copy current block column of L to WORK and replace with zeros. */ i__2 = j + jb - 1; for (jj = j; jj <= i__2; ++jj) { i__3 = *n; for (i__ = jj + 1; i__ <= i__3; ++i__) { work[i__ + (jj - j) * ldwork] = a_ref(i__, jj); a_ref(i__, jj) = 0.; /* L30: */ } /* L40: */ } /* Compute current block column of inv(A). */ if (j + jb <= *n) { i__2 = *n - j - jb + 1; dgemm_("No transpose", "No transpose", n, &jb, &i__2, &c_b20, &a_ref(1, j + jb), lda, &work[j + jb], &ldwork, & c_b22, &a_ref(1, j), lda); } dtrsm_("Right", "Lower", "No transpose", "Unit", n, &jb, &c_b22, & work[j], &ldwork, &a_ref(1, j), lda); /* L50: */ } } /* Apply column interchanges. */ for (j = *n - 1; j >= 1; --j) { jp = ipiv[j]; if (jp != j) { dswap_(n, &a_ref(1, j), &c__1, &a_ref(1, jp), &c__1); } /* L60: */ } work[1] = (doublereal) iws; return 0; /* End of DGETRI */ } /* dgetri_ */ #undef a_ref #ifdef __cplusplus } #endif hypre-2.33.0/src/lapack/dgetrs.c000066400000000000000000000110041477326011500164060ustar00rootroot00000000000000/* Copyright (c) 1992-2008 The University of Tennessee. All rights reserved. * See file COPYING in this directory for details. */ #ifdef __cplusplus extern "C" { #endif #include "f2c.h" #include "hypre_lapack.h" /* Subroutine */ integer dgetrs_(const char *trans, integer *n, integer *nrhs, doublereal *a, integer *lda, integer *ipiv, doublereal *b, integer * ldb, integer *info) { /* -- LAPACK routine (version 3.0) -- Univ. of Tennessee, Univ. of California Berkeley, NAG Ltd., Courant Institute, Argonne National Lab, and Rice University March 31, 1993 Purpose ======= DGETRS solves a system of linear equations A * X = B or A' * X = B with a general N-by-N matrix A using the LU factorization computed by DGETRF. Arguments ========= TRANS (input) CHARACTER*1 Specifies the form of the system of equations: = 'N': A * X = B (No transpose) = 'T': A'* X = B (Transpose) = 'C': A'* X = B (Conjugate transpose = Transpose) N (input) INTEGER The order of the matrix A. N >= 0. NRHS (input) INTEGER The number of right hand sides, i.e., the number of columns of the matrix B. NRHS >= 0. A (input) DOUBLE PRECISION array, dimension (LDA,N) The factors L and U from the factorization A = P*L*U as computed by DGETRF. LDA (input) INTEGER The leading dimension of the array A. LDA >= max(1,N). IPIV (input) INTEGER array, dimension (N) The pivot indices from DGETRF; for 1<=i<=N, row i of the matrix was interchanged with row IPIV(i). B (input/output) DOUBLE PRECISION array, dimension (LDB,NRHS) On entry, the right hand side matrix B. On exit, the solution matrix X. LDB (input) INTEGER The leading dimension of the array B. LDB >= max(1,N). INFO (output) INTEGER = 0: successful exit < 0: if INFO = -i, the i-th argument had an illegal value ===================================================================== Test the input parameters. Parameter adjustments */ /* Table of constant values */ integer c__1 = 1; doublereal c_b12 = 1.; integer c_n1 = -1; /* System generated locals */ integer a_dim1, a_offset, b_dim1, b_offset, i__1; /* Local variables */ extern logical lsame_(const char *,const char *); extern /* Subroutine */ integer dtrsm_(const char *,const char *,const char *,const char *, integer *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *), xerbla_( const char *, integer *), dlaswp_(integer *, doublereal *, integer *, integer *, integer *, integer *, integer *); logical notran; a_dim1 = *lda; a_offset = 1 + a_dim1 * 1; a -= a_offset; --ipiv; b_dim1 = *ldb; b_offset = 1 + b_dim1 * 1; b -= b_offset; /* Function Body */ *info = 0; notran = lsame_(trans, "N"); if (! notran && ! lsame_(trans, "T") && ! lsame_( trans, "C")) { *info = -1; } else if (*n < 0) { *info = -2; } else if (*nrhs < 0) { *info = -3; } else if (*lda < max(1,*n)) { *info = -5; } else if (*ldb < max(1,*n)) { *info = -8; } if (*info != 0) { i__1 = -(*info); xerbla_("DGETRS", &i__1); return 0; } /* Quick return if possible */ if (*n == 0 || *nrhs == 0) { return 0; } if (notran) { /* Solve A * X = B. Apply row interchanges to the right hand sides. */ dlaswp_(nrhs, &b[b_offset], ldb, &c__1, n, &ipiv[1], &c__1); /* Solve L*X = B, overwriting B with X. */ dtrsm_("Left", "Lower", "No transpose", "Unit", n, nrhs, &c_b12, &a[ a_offset], lda, &b[b_offset], ldb); /* Solve U*X = B, overwriting B with X. */ dtrsm_("Left", "Upper", "No transpose", "Non-unit", n, nrhs, &c_b12, & a[a_offset], lda, &b[b_offset], ldb); } else { /* Solve A' * X = B. Solve U'*X = B, overwriting B with X. */ dtrsm_("Left", "Upper", "Transpose", "Non-unit", n, nrhs, &c_b12, &a[ a_offset], lda, &b[b_offset], ldb); /* Solve L'*X = B, overwriting B with X. */ dtrsm_("Left", "Lower", "Transpose", "Unit", n, nrhs, &c_b12, &a[ a_offset], lda, &b[b_offset], ldb); /* Apply row interchanges to the solution vectors. */ dlaswp_(nrhs, &b[b_offset], ldb, &c__1, n, &ipiv[1], &c_n1); } return 0; /* End of DGETRS */ } /* dgetrs_ */ #ifdef __cplusplus } #endif hypre-2.33.0/src/lapack/dlabad.c000066400000000000000000000040641477326011500163350ustar00rootroot00000000000000/* Copyright (c) 1992-2008 The University of Tennessee. All rights reserved. * See file COPYING in this directory for details. */ #ifdef __cplusplus extern "C" { #endif #include "f2c.h" #include "hypre_lapack.h" /* Subroutine */ integer dlabad_(doublereal *small, doublereal *large) { /* -- LAPACK auxiliary routine (version 3.0) -- Univ. of Tennessee, Univ. of California Berkeley, NAG Ltd., Courant Institute, Argonne National Lab, and Rice University October 31, 1992 Purpose ======= DLABAD takes as input the values computed by DLAMCH for underflow and overflow, and returns the square root of each of these values if the log of LARGE is sufficiently large. This subroutine is intended to identify machines with a large exponent range, such as the Crays, and redefine the underflow and overflow limits to be the square roots of the values computed by DLAMCH. This subroutine is needed because DLAMCH does not compensate for poor arithmetic in the upper half of the exponent range, as is found on a Cray. Arguments ========= SMALL (input/output) DOUBLE PRECISION On entry, the underflow threshold as computed by DLAMCH. On exit, if LOG10(LARGE) is sufficiently large, the square root of SMALL, otherwise unchanged. LARGE (input/output) DOUBLE PRECISION On entry, the overflow threshold as computed by DLAMCH. On exit, if LOG10(LARGE) is sufficiently large, the square root of LARGE, otherwise unchanged. ===================================================================== If it looks like we're on a Cray, take the square root of SMALL and LARGE to avoid overflow and underflow problems. */ /* Builtin functions */ doublereal d_lg10(doublereal *); if (d_lg10(large) > 2e3) { *small = sqrt(*small); *large = sqrt(*large); } return 0; /* End of DLABAD */ } /* dlabad_ */ #ifdef __cplusplus } #endif hypre-2.33.0/src/lapack/dlabrd.c000066400000000000000000000326431477326011500163620ustar00rootroot00000000000000/* Copyright (c) 1992-2008 The University of Tennessee. All rights reserved. * See file COPYING in this directory for details. */ #ifdef __cplusplus extern "C" { #endif #include "f2c.h" #include "hypre_lapack.h" /* Subroutine */ integer dlabrd_(integer *m, integer *n, integer *nb, doublereal * a, integer *lda, doublereal *d__, doublereal *e, doublereal *tauq, doublereal *taup, doublereal *x, integer *ldx, doublereal *y, integer *ldy) { /* -- LAPACK auxiliary routine (version 3.0) -- Univ. of Tennessee, Univ. of California Berkeley, NAG Ltd., Courant Institute, Argonne National Lab, and Rice University February 29, 1992 Purpose ======= DLABRD reduces the first NB rows and columns of a real general m by n matrix A to upper or lower bidiagonal form by an orthogonal transformation Q' * A * P, and returns the matrices X and Y which are needed to apply the transformation to the unreduced part of A. If m >= n, A is reduced to upper bidiagonal form; if m < n, to lower bidiagonal form. This is an auxiliary routine called by DGEBRD Arguments ========= M (input) INTEGER The number of rows in the matrix A. N (input) INTEGER The number of columns in the matrix A. NB (input) INTEGER The number of leading rows and columns of A to be reduced. A (input/output) DOUBLE PRECISION array, dimension (LDA,N) On entry, the m by n general matrix to be reduced. On exit, the first NB rows and columns of the matrix are overwritten; the rest of the array is unchanged. If m >= n, elements on and below the diagonal in the first NB columns, with the array TAUQ, represent the orthogonal matrix Q as a product of elementary reflectors; and elements above the diagonal in the first NB rows, with the array TAUP, represent the orthogonal matrix P as a product of elementary reflectors. If m < n, elements below the diagonal in the first NB columns, with the array TAUQ, represent the orthogonal matrix Q as a product of elementary reflectors, and elements on and above the diagonal in the first NB rows, with the array TAUP, represent the orthogonal matrix P as a product of elementary reflectors. See Further Details. LDA (input) INTEGER The leading dimension of the array A. LDA >= max(1,M). D (output) DOUBLE PRECISION array, dimension (NB) The diagonal elements of the first NB rows and columns of the reduced matrix. D(i) = A(i,i). E (output) DOUBLE PRECISION array, dimension (NB) The off-diagonal elements of the first NB rows and columns of the reduced matrix. TAUQ (output) DOUBLE PRECISION array dimension (NB) The scalar factors of the elementary reflectors which represent the orthogonal matrix Q. See Further Details. TAUP (output) DOUBLE PRECISION array, dimension (NB) The scalar factors of the elementary reflectors which represent the orthogonal matrix P. See Further Details. X (output) DOUBLE PRECISION array, dimension (LDX,NB) The m-by-nb matrix X required to update the unreduced part of A. LDX (input) INTEGER The leading dimension of the array X. LDX >= M. Y (output) DOUBLE PRECISION array, dimension (LDY,NB) The n-by-nb matrix Y required to update the unreduced part of A. LDY (output) INTEGER The leading dimension of the array Y. LDY >= N. Further Details =============== The matrices Q and P are represented as products of elementary reflectors: Q = H(1) H(2) . . . H(nb) and P = G(1) G(2) . . . G(nb) Each H(i) and G(i) has the form: H(i) = I - tauq * v * v' and G(i) = I - taup * u * u' where tauq and taup are real scalars, and v and u are real vectors. If m >= n, v(1:i-1) = 0, v(i) = 1, and v(i:m) is stored on exit in A(i:m,i); u(1:i) = 0, u(i+1) = 1, and u(i+1:n) is stored on exit in A(i,i+1:n); tauq is stored in TAUQ(i) and taup in TAUP(i). If m < n, v(1:i) = 0, v(i+1) = 1, and v(i+1:m) is stored on exit in A(i+2:m,i); u(1:i-1) = 0, u(i) = 1, and u(i:n) is stored on exit in A(i,i+1:n); tauq is stored in TAUQ(i) and taup in TAUP(i). The elements of the vectors v and u together form the m-by-nb matrix V and the nb-by-n matrix U' which are needed, with X and Y, to apply the transformation to the unreduced part of the matrix, using a block update of the form: A := A - V*Y' - X*U'. The contents of A on exit are illustrated by the following examples with nb = 2: m = 6 and n = 5 (m > n): m = 5 and n = 6 (m < n): ( 1 1 u1 u1 u1 ) ( 1 u1 u1 u1 u1 u1 ) ( v1 1 1 u2 u2 ) ( 1 1 u2 u2 u2 u2 ) ( v1 v2 a a a ) ( v1 1 a a a a ) ( v1 v2 a a a ) ( v1 v2 a a a a ) ( v1 v2 a a a ) ( v1 v2 a a a a ) ( v1 v2 a a a ) where a denotes an element of the original matrix which is unchanged, vi denotes an element of the vector defining H(i), and ui an element of the vector defining G(i). ===================================================================== Quick return if possible Parameter adjustments */ /* Table of constant values */ doublereal c_b4 = -1.; doublereal c_b5 = 1.; integer c__1 = 1; doublereal c_b16 = 0.; /* System generated locals */ integer a_dim1, a_offset, x_dim1, x_offset, y_dim1, y_offset, i__1, i__2, i__3; /* Local variables */ integer i__; extern /* Subroutine */ integer dscal_(integer *, doublereal *, doublereal *, integer *), dgemv_(const char *, integer *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *), dlarfg_(integer *, doublereal *, doublereal *, integer *, doublereal *); #define a_ref(a_1,a_2) a[(a_2)*a_dim1 + a_1] #define x_ref(a_1,a_2) x[(a_2)*x_dim1 + a_1] #define y_ref(a_1,a_2) y[(a_2)*y_dim1 + a_1] a_dim1 = *lda; a_offset = 1 + a_dim1 * 1; a -= a_offset; --d__; --e; --tauq; --taup; x_dim1 = *ldx; x_offset = 1 + x_dim1 * 1; x -= x_offset; y_dim1 = *ldy; y_offset = 1 + y_dim1 * 1; y -= y_offset; /* Function Body */ if (*m <= 0 || *n <= 0) { return 0; } if (*m >= *n) { /* Reduce to upper bidiagonal form */ i__1 = *nb; for (i__ = 1; i__ <= i__1; ++i__) { /* Update A(i:m,i) */ i__2 = *m - i__ + 1; i__3 = i__ - 1; dgemv_("No transpose", &i__2, &i__3, &c_b4, &a_ref(i__, 1), lda, & y_ref(i__, 1), ldy, &c_b5, &a_ref(i__, i__), &c__1); i__2 = *m - i__ + 1; i__3 = i__ - 1; dgemv_("No transpose", &i__2, &i__3, &c_b4, &x_ref(i__, 1), ldx, & a_ref(1, i__), &c__1, &c_b5, &a_ref(i__, i__), &c__1); /* Generate reflection Q(i) to annihilate A(i+1:m,i) Computing MIN */ i__2 = i__ + 1; i__3 = *m - i__ + 1; dlarfg_(&i__3, &a_ref(i__, i__), &a_ref(min(i__2,*m), i__), &c__1, &tauq[i__]); d__[i__] = a_ref(i__, i__); if (i__ < *n) { a_ref(i__, i__) = 1.; /* Compute Y(i+1:n,i) */ i__2 = *m - i__ + 1; i__3 = *n - i__; dgemv_("Transpose", &i__2, &i__3, &c_b5, &a_ref(i__, i__ + 1), lda, &a_ref(i__, i__), &c__1, &c_b16, &y_ref(i__ + 1, i__), &c__1); i__2 = *m - i__ + 1; i__3 = i__ - 1; dgemv_("Transpose", &i__2, &i__3, &c_b5, &a_ref(i__, 1), lda, &a_ref(i__, i__), &c__1, &c_b16, &y_ref(1, i__), & c__1); i__2 = *n - i__; i__3 = i__ - 1; dgemv_("No transpose", &i__2, &i__3, &c_b4, &y_ref(i__ + 1, 1) , ldy, &y_ref(1, i__), &c__1, &c_b5, &y_ref(i__ + 1, i__), &c__1); i__2 = *m - i__ + 1; i__3 = i__ - 1; dgemv_("Transpose", &i__2, &i__3, &c_b5, &x_ref(i__, 1), ldx, &a_ref(i__, i__), &c__1, &c_b16, &y_ref(1, i__), & c__1); i__2 = i__ - 1; i__3 = *n - i__; dgemv_("Transpose", &i__2, &i__3, &c_b4, &a_ref(1, i__ + 1), lda, &y_ref(1, i__), &c__1, &c_b5, &y_ref(i__ + 1, i__), &c__1); i__2 = *n - i__; dscal_(&i__2, &tauq[i__], &y_ref(i__ + 1, i__), &c__1); /* Update A(i,i+1:n) */ i__2 = *n - i__; dgemv_("No transpose", &i__2, &i__, &c_b4, &y_ref(i__ + 1, 1), ldy, &a_ref(i__, 1), lda, &c_b5, &a_ref(i__, i__ + 1) , lda); i__2 = i__ - 1; i__3 = *n - i__; dgemv_("Transpose", &i__2, &i__3, &c_b4, &a_ref(1, i__ + 1), lda, &x_ref(i__, 1), ldx, &c_b5, &a_ref(i__, i__ + 1), lda); /* Generate reflection P(i) to annihilate A(i,i+2:n) Computing MIN */ i__2 = i__ + 2; i__3 = *n - i__; dlarfg_(&i__3, &a_ref(i__, i__ + 1), &a_ref(i__, min(i__2,*n)) , lda, &taup[i__]); e[i__] = a_ref(i__, i__ + 1); a_ref(i__, i__ + 1) = 1.; /* Compute X(i+1:m,i) */ i__2 = *m - i__; i__3 = *n - i__; dgemv_("No transpose", &i__2, &i__3, &c_b5, &a_ref(i__ + 1, i__ + 1), lda, &a_ref(i__, i__ + 1), lda, &c_b16, & x_ref(i__ + 1, i__), &c__1); i__2 = *n - i__; dgemv_("Transpose", &i__2, &i__, &c_b5, &y_ref(i__ + 1, 1), ldy, &a_ref(i__, i__ + 1), lda, &c_b16, &x_ref(1, i__) , &c__1); i__2 = *m - i__; dgemv_("No transpose", &i__2, &i__, &c_b4, &a_ref(i__ + 1, 1), lda, &x_ref(1, i__), &c__1, &c_b5, &x_ref(i__ + 1, i__), &c__1); i__2 = i__ - 1; i__3 = *n - i__; dgemv_("No transpose", &i__2, &i__3, &c_b5, &a_ref(1, i__ + 1) , lda, &a_ref(i__, i__ + 1), lda, &c_b16, &x_ref(1, i__), &c__1); i__2 = *m - i__; i__3 = i__ - 1; dgemv_("No transpose", &i__2, &i__3, &c_b4, &x_ref(i__ + 1, 1) , ldx, &x_ref(1, i__), &c__1, &c_b5, &x_ref(i__ + 1, i__), &c__1); i__2 = *m - i__; dscal_(&i__2, &taup[i__], &x_ref(i__ + 1, i__), &c__1); } /* L10: */ } } else { /* Reduce to lower bidiagonal form */ i__1 = *nb; for (i__ = 1; i__ <= i__1; ++i__) { /* Update A(i,i:n) */ i__2 = *n - i__ + 1; i__3 = i__ - 1; dgemv_("No transpose", &i__2, &i__3, &c_b4, &y_ref(i__, 1), ldy, & a_ref(i__, 1), lda, &c_b5, &a_ref(i__, i__), lda); i__2 = i__ - 1; i__3 = *n - i__ + 1; dgemv_("Transpose", &i__2, &i__3, &c_b4, &a_ref(1, i__), lda, & x_ref(i__, 1), ldx, &c_b5, &a_ref(i__, i__), lda); /* Generate reflection P(i) to annihilate A(i,i+1:n) Computing MIN */ i__2 = i__ + 1; i__3 = *n - i__ + 1; dlarfg_(&i__3, &a_ref(i__, i__), &a_ref(i__, min(i__2,*n)), lda, & taup[i__]); d__[i__] = a_ref(i__, i__); if (i__ < *m) { a_ref(i__, i__) = 1.; /* Compute X(i+1:m,i) */ i__2 = *m - i__; i__3 = *n - i__ + 1; dgemv_("No transpose", &i__2, &i__3, &c_b5, &a_ref(i__ + 1, i__), lda, &a_ref(i__, i__), lda, &c_b16, &x_ref(i__ + 1, i__), &c__1); i__2 = *n - i__ + 1; i__3 = i__ - 1; dgemv_("Transpose", &i__2, &i__3, &c_b5, &y_ref(i__, 1), ldy, &a_ref(i__, i__), lda, &c_b16, &x_ref(1, i__), &c__1); i__2 = *m - i__; i__3 = i__ - 1; dgemv_("No transpose", &i__2, &i__3, &c_b4, &a_ref(i__ + 1, 1) , lda, &x_ref(1, i__), &c__1, &c_b5, &x_ref(i__ + 1, i__), &c__1); i__2 = i__ - 1; i__3 = *n - i__ + 1; dgemv_("No transpose", &i__2, &i__3, &c_b5, &a_ref(1, i__), lda, &a_ref(i__, i__), lda, &c_b16, &x_ref(1, i__), & c__1); i__2 = *m - i__; i__3 = i__ - 1; dgemv_("No transpose", &i__2, &i__3, &c_b4, &x_ref(i__ + 1, 1) , ldx, &x_ref(1, i__), &c__1, &c_b5, &x_ref(i__ + 1, i__), &c__1); i__2 = *m - i__; dscal_(&i__2, &taup[i__], &x_ref(i__ + 1, i__), &c__1); /* Update A(i+1:m,i) */ i__2 = *m - i__; i__3 = i__ - 1; dgemv_("No transpose", &i__2, &i__3, &c_b4, &a_ref(i__ + 1, 1) , lda, &y_ref(i__, 1), ldy, &c_b5, &a_ref(i__ + 1, i__), &c__1); i__2 = *m - i__; dgemv_("No transpose", &i__2, &i__, &c_b4, &x_ref(i__ + 1, 1), ldx, &a_ref(1, i__), &c__1, &c_b5, &a_ref(i__ + 1, i__), &c__1); /* Generate reflection Q(i) to annihilate A(i+2:m,i) Computing MIN */ i__2 = i__ + 2; i__3 = *m - i__; dlarfg_(&i__3, &a_ref(i__ + 1, i__), &a_ref(min(i__2,*m), i__) , &c__1, &tauq[i__]); e[i__] = a_ref(i__ + 1, i__); a_ref(i__ + 1, i__) = 1.; /* Compute Y(i+1:n,i) */ i__2 = *m - i__; i__3 = *n - i__; dgemv_("Transpose", &i__2, &i__3, &c_b5, &a_ref(i__ + 1, i__ + 1), lda, &a_ref(i__ + 1, i__), &c__1, &c_b16, & y_ref(i__ + 1, i__), &c__1); i__2 = *m - i__; i__3 = i__ - 1; dgemv_("Transpose", &i__2, &i__3, &c_b5, &a_ref(i__ + 1, 1), lda, &a_ref(i__ + 1, i__), &c__1, &c_b16, &y_ref(1, i__), &c__1); i__2 = *n - i__; i__3 = i__ - 1; dgemv_("No transpose", &i__2, &i__3, &c_b4, &y_ref(i__ + 1, 1) , ldy, &y_ref(1, i__), &c__1, &c_b5, &y_ref(i__ + 1, i__), &c__1); i__2 = *m - i__; dgemv_("Transpose", &i__2, &i__, &c_b5, &x_ref(i__ + 1, 1), ldx, &a_ref(i__ + 1, i__), &c__1, &c_b16, &y_ref(1, i__), &c__1); i__2 = *n - i__; dgemv_("Transpose", &i__, &i__2, &c_b4, &a_ref(1, i__ + 1), lda, &y_ref(1, i__), &c__1, &c_b5, &y_ref(i__ + 1, i__), &c__1); i__2 = *n - i__; dscal_(&i__2, &tauq[i__], &y_ref(i__ + 1, i__), &c__1); } /* L20: */ } } return 0; /* End of DLABRD */ } /* dlabrd_ */ #undef y_ref #undef x_ref #undef a_ref #ifdef __cplusplus } #endif hypre-2.33.0/src/lapack/dlacpy.c000066400000000000000000000055751477326011500164120ustar00rootroot00000000000000/* Copyright (c) 1992-2008 The University of Tennessee. All rights reserved. * See file COPYING in this directory for details. */ #ifdef __cplusplus extern "C" { #endif #include "f2c.h" #include "hypre_lapack.h" /* Subroutine */ integer dlacpy_(const char *uplo, integer *m, integer *n, doublereal * a, integer *lda, doublereal *b, integer *ldb) { /* -- LAPACK auxiliary routine (version 3.0) -- Univ. of Tennessee, Univ. of California Berkeley, NAG Ltd., Courant Institute, Argonne National Lab, and Rice University February 29, 1992 Purpose ======= DLACPY copies all or part of a two-dimensional matrix A to another matrix B. Arguments ========= UPLO (input) CHARACTER*1 Specifies the part of the matrix A to be copied to B. = 'U': Upper triangular part = 'L': Lower triangular part Otherwise: All of the matrix A M (input) INTEGER The number of rows of the matrix A. M >= 0. N (input) INTEGER The number of columns of the matrix A. N >= 0. A (input) DOUBLE PRECISION array, dimension (LDA,N) The m by n matrix A. If UPLO = 'U', only the upper triangle or trapezoid is accessed; if UPLO = 'L', only the lower triangle or trapezoid is accessed. LDA (input) INTEGER The leading dimension of the array A. LDA >= max(1,M). B (output) DOUBLE PRECISION array, dimension (LDB,N) On exit, B = A in the locations specified by UPLO. LDB (input) INTEGER The leading dimension of the array B. LDB >= max(1,M). ===================================================================== Parameter adjustments */ /* System generated locals */ integer a_dim1, a_offset, b_dim1, b_offset, i__1, i__2; /* Local variables */ integer i__, j; extern logical lsame_(const char *,const char *); #define a_ref(a_1,a_2) a[(a_2)*a_dim1 + a_1] #define b_ref(a_1,a_2) b[(a_2)*b_dim1 + a_1] a_dim1 = *lda; a_offset = 1 + a_dim1 * 1; a -= a_offset; b_dim1 = *ldb; b_offset = 1 + b_dim1 * 1; b -= b_offset; /* Function Body */ if (lsame_(uplo, "U")) { i__1 = *n; for (j = 1; j <= i__1; ++j) { i__2 = min(j,*m); for (i__ = 1; i__ <= i__2; ++i__) { b_ref(i__, j) = a_ref(i__, j); /* L10: */ } /* L20: */ } } else if (lsame_(uplo, "L")) { i__1 = *n; for (j = 1; j <= i__1; ++j) { i__2 = *m; for (i__ = j; i__ <= i__2; ++i__) { b_ref(i__, j) = a_ref(i__, j); /* L30: */ } /* L40: */ } } else { i__1 = *n; for (j = 1; j <= i__1; ++j) { i__2 = *m; for (i__ = 1; i__ <= i__2; ++i__) { b_ref(i__, j) = a_ref(i__, j); /* L50: */ } /* L60: */ } } return 0; /* End of DLACPY */ } /* dlacpy_ */ #undef b_ref #undef a_ref #ifdef __cplusplus } #endif hypre-2.33.0/src/lapack/dlae2.c000066400000000000000000000061731477326011500161200ustar00rootroot00000000000000/* Copyright (c) 1992-2008 The University of Tennessee. All rights reserved. * See file COPYING in this directory for details. */ #ifdef __cplusplus extern "C" { #endif #include "f2c.h" #include "hypre_lapack.h" /* Subroutine */ integer dlae2_(doublereal *a, doublereal *b, doublereal *c__, doublereal *rt1, doublereal *rt2) { /* -- LAPACK auxiliary routine (version 3.0) -- Univ. of Tennessee, Univ. of California Berkeley, NAG Ltd., Courant Institute, Argonne National Lab, and Rice University October 31, 1992 Purpose ======= DLAE2 computes the eigenvalues of a 2-by-2 symmetric matrix [ A B ] [ B C ]. On return, RT1 is the eigenvalue of larger absolute value, and RT2 is the eigenvalue of smaller absolute value. Arguments ========= A (input) DOUBLE PRECISION The (1,1) element of the 2-by-2 matrix. B (input) DOUBLE PRECISION The (1,2) and (2,1) elements of the 2-by-2 matrix. C (input) DOUBLE PRECISION The (2,2) element of the 2-by-2 matrix. RT1 (output) DOUBLE PRECISION The eigenvalue of larger absolute value. RT2 (output) DOUBLE PRECISION The eigenvalue of smaller absolute value. Further Details =============== RT1 is accurate to a few ulps barring over/underflow. RT2 may be inaccurate if there is massive cancellation in the determinant A*C-B*B; higher precision or correctly rounded or correctly truncated arithmetic would be needed to compute RT2 accurately in all cases. Overflow is possible only if RT1 is within a factor of 5 of overflow. Underflow is harmless if the input data is 0 or exceeds underflow_threshold / macheps. ===================================================================== Compute the eigenvalues */ /* System generated locals */ doublereal d__1; /* Local variables */ doublereal acmn, acmx, ab, df, tb, sm, rt, adf; sm = *a + *c__; df = *a - *c__; adf = abs(df); tb = *b + *b; ab = abs(tb); if (abs(*a) > abs(*c__)) { acmx = *a; acmn = *c__; } else { acmx = *c__; acmn = *a; } if (adf > ab) { /* Computing 2nd power */ d__1 = ab / adf; rt = adf * sqrt(d__1 * d__1 + 1.); } else if (adf < ab) { /* Computing 2nd power */ d__1 = adf / ab; rt = ab * sqrt(d__1 * d__1 + 1.); } else { /* Includes case AB=ADF=0 */ rt = ab * sqrt(2.); } if (sm < 0.) { *rt1 = (sm - rt) * .5; /* Order of execution important. To get fully accurate smaller eigenvalue, next line needs to be executed in higher precision. */ *rt2 = acmx / *rt1 * acmn - *b / *rt1 * *b; } else if (sm > 0.) { *rt1 = (sm + rt) * .5; /* Order of execution important. To get fully accurate smaller eigenvalue, next line needs to be executed in higher precision. */ *rt2 = acmx / *rt1 * acmn - *b / *rt1 * *b; } else { /* Includes case RT1 = RT2 = 0 */ *rt1 = rt * .5; *rt2 = rt * -.5; } return 0; /* End of DLAE2 */ } /* dlae2_ */ #ifdef __cplusplus } #endif hypre-2.33.0/src/lapack/dlaev2.c000066400000000000000000000102171477326011500163000ustar00rootroot00000000000000/* Copyright (c) 1992-2008 The University of Tennessee. All rights reserved. * See file COPYING in this directory for details. */ #ifdef __cplusplus extern "C" { #endif #include "f2c.h" #include "hypre_lapack.h" /* Subroutine */ integer dlaev2_(doublereal *a, doublereal *b, doublereal *c__, doublereal *rt1, doublereal *rt2, doublereal *cs1, doublereal *sn1) { /* -- LAPACK auxiliary routine (version 3.0) -- Univ. of Tennessee, Univ. of California Berkeley, NAG Ltd., Courant Institute, Argonne National Lab, and Rice University October 31, 1992 Purpose ======= DLAEV2 computes the eigendecomposition of a 2-by-2 symmetric matrix [ A B ] [ B C ]. On return, RT1 is the eigenvalue of larger absolute value, RT2 is the eigenvalue of smaller absolute value, and (CS1,SN1) is the unit right eigenvector for RT1, giving the decomposition [ CS1 SN1 ] [ A B ] [ CS1 -SN1 ] = [ RT1 0 ] [-SN1 CS1 ] [ B C ] [ SN1 CS1 ] [ 0 RT2 ]. Arguments ========= A (input) DOUBLE PRECISION The (1,1) element of the 2-by-2 matrix. B (input) DOUBLE PRECISION The (1,2) element and the conjugate of the (2,1) element of the 2-by-2 matrix. C (input) DOUBLE PRECISION The (2,2) element of the 2-by-2 matrix. RT1 (output) DOUBLE PRECISION The eigenvalue of larger absolute value. RT2 (output) DOUBLE PRECISION The eigenvalue of smaller absolute value. CS1 (output) DOUBLE PRECISION SN1 (output) DOUBLE PRECISION The vector (CS1, SN1) is a unit right eigenvector for RT1. Further Details =============== RT1 is accurate to a few ulps barring over/underflow. RT2 may be inaccurate if there is massive cancellation in the determinant A*C-B*B; higher precision or correctly rounded or correctly truncated arithmetic would be needed to compute RT2 accurately in all cases. CS1 and SN1 are accurate to a few ulps barring over/underflow. Overflow is possible only if RT1 is within a factor of 5 of overflow. Underflow is harmless if the input data is 0 or exceeds underflow_threshold / macheps. ===================================================================== Compute the eigenvalues */ /* System generated locals */ doublereal d__1; /* Local variables */ doublereal acmn, acmx, ab, df, cs, ct, tb, sm, tn, rt, adf, acs; integer sgn1, sgn2; sm = *a + *c__; df = *a - *c__; adf = abs(df); tb = *b + *b; ab = abs(tb); if (abs(*a) > abs(*c__)) { acmx = *a; acmn = *c__; } else { acmx = *c__; acmn = *a; } if (adf > ab) { /* Computing 2nd power */ d__1 = ab / adf; rt = adf * sqrt(d__1 * d__1 + 1.); } else if (adf < ab) { /* Computing 2nd power */ d__1 = adf / ab; rt = ab * sqrt(d__1 * d__1 + 1.); } else { /* Includes case AB=ADF=0 */ rt = ab * sqrt(2.); } if (sm < 0.) { *rt1 = (sm - rt) * .5; sgn1 = -1; /* Order of execution important. To get fully accurate smaller eigenvalue, next line needs to be executed in higher precision. */ *rt2 = acmx / *rt1 * acmn - *b / *rt1 * *b; } else if (sm > 0.) { *rt1 = (sm + rt) * .5; sgn1 = 1; /* Order of execution important. To get fully accurate smaller eigenvalue, next line needs to be executed in higher precision. */ *rt2 = acmx / *rt1 * acmn - *b / *rt1 * *b; } else { /* Includes case RT1 = RT2 = 0 */ *rt1 = rt * .5; *rt2 = rt * -.5; sgn1 = 1; } /* Compute the eigenvector */ if (df >= 0.) { cs = df + rt; sgn2 = 1; } else { cs = df - rt; sgn2 = -1; } acs = abs(cs); if (acs > ab) { ct = -tb / cs; *sn1 = 1. / sqrt(ct * ct + 1.); *cs1 = ct * *sn1; } else { if (ab == 0.) { *cs1 = 1.; *sn1 = 0.; } else { tn = -cs / tb; *cs1 = 1. / sqrt(tn * tn + 1.); *sn1 = tn * *cs1; } } if (sgn1 == sgn2) { tn = *cs1; *cs1 = -(*sn1); *sn1 = tn; } return 0; /* End of DLAEV2 */ } /* dlaev2_ */ #ifdef __cplusplus } #endif hypre-2.33.0/src/lapack/dlamch.c000066400000000000000000000564071477326011500163660ustar00rootroot00000000000000/* Copyright (c) 1992-2008 The University of Tennessee. All rights reserved. * See file COPYING in this directory for details. */ #ifdef __cplusplus extern "C" { #endif #include "f2c.h" #include "hypre_lapack.h" doublereal dlamch_(const char *cmach) { /* -- LAPACK auxiliary routine (version 3.0) -- Univ. of Tennessee, Univ. of California Berkeley, NAG Ltd., Courant Institute, Argonne National Lab, and Rice University October 31, 1992 Purpose ======= DLAMCH determines doublereal precision machine parameters. Arguments ========= CMACH (input) CHARACTER*1 Specifies the value to be returned by DLAMCH: = 'E' or 'e', DLAMCH := eps = 'S' or 's , DLAMCH := sfmin = 'B' or 'b', DLAMCH := base = 'P' or 'p', DLAMCH := eps*base = 'N' or 'n', DLAMCH := t = 'R' or 'r', DLAMCH := rnd = 'M' or 'm', DLAMCH := emin = 'U' or 'u', DLAMCH := rmin = 'L' or 'l', DLAMCH := emax = 'O' or 'o', DLAMCH := rmax where eps = relative machine precision sfmin = safe minimum, such that 1/sfmin does not overflow base = base of the machine prec = eps*base t = number of (base) digits in the mantissa rnd = 1.0 when rounding occurs in addition, 0.0 otherwise emin = minimum exponent before (gradual) underflow rmin = underflow threshold - base**(emin-1) emax = largest exponent before overflow rmax = overflow threshold - (base**emax)*(1-eps) ===================================================================== */ /* >>Start of File<< Initialized data */ logical first = TRUE_; /* System generated locals */ integer i__1; doublereal ret_val; /* Builtin functions */ doublereal pow_di(doublereal *, integer *); /* Local variables */ doublereal base; integer beta; doublereal emin, prec, emax; integer imin, imax; logical lrnd; doublereal rmin, rmax, t, rmach = 0.; extern logical lsame_(const char *,const char *); doublereal small, sfmin; extern /* Subroutine */ integer dlamc2_(integer *, integer *, logical *, doublereal *, integer *, doublereal *, integer *, doublereal *); integer it; doublereal rnd, eps; if (first) { first = FALSE_; dlamc2_(&beta, &it, &lrnd, &eps, &imin, &rmin, &imax, &rmax); base = (doublereal) beta; t = (doublereal) it; if (lrnd) { rnd = 1.; i__1 = 1 - it; eps = pow_di(&base, &i__1) / 2; } else { rnd = 0.; i__1 = 1 - it; eps = pow_di(&base, &i__1); } prec = eps * base; emin = (doublereal) imin; emax = (doublereal) imax; sfmin = rmin; small = 1. / rmax; if (small >= sfmin) { /* Use SMALL plus a bit, to avoid the possibility of rou nding causing overflow when computing 1/sfmin. */ sfmin = small * (eps + 1.); } } if (lsame_(cmach, "E")) { rmach = eps; } else if (lsame_(cmach, "S")) { rmach = sfmin; } else if (lsame_(cmach, "B")) { rmach = base; } else if (lsame_(cmach, "P")) { rmach = prec; } else if (lsame_(cmach, "N")) { rmach = t; } else if (lsame_(cmach, "R")) { rmach = rnd; } else if (lsame_(cmach, "M")) { rmach = emin; } else if (lsame_(cmach, "U")) { rmach = rmin; } else if (lsame_(cmach, "L")) { rmach = emax; } else if (lsame_(cmach, "O")) { rmach = rmax; } ret_val = rmach; return ret_val; /* End of DLAMCH */ } /* dlamch_ */ /* Subroutine */ integer dlamc1_(integer *beta, integer *t, logical *rnd, logical *ieee1) { /* -- LAPACK auxiliary routine (version 3.0) -- Univ. of Tennessee, Univ. of California Berkeley, NAG Ltd., Courant Institute, Argonne National Lab, and Rice University October 31, 1992 Purpose ======= DLAMC1 determines the machine parameters given by BETA, T, RND, and IEEE1. Arguments ========= BETA (output) INTEGER The base of the machine. T (output) INTEGER The number of ( BETA ) digits in the mantissa. RND (output) LOGICAL Specifies whether proper rounding ( RND = .TRUE. ) or chopping ( RND = .FALSE. ) occurs in addition. This may not be a reliable guide to the way in which the machine performs its arithmetic. IEEE1 (output) LOGICAL Specifies whether rounding appears to be done in the IEEE 'round to nearest' style. Further Details =============== The routine is based on the routine ENVRON by Malcolm and incorporates suggestions by Gentleman and Marovich. See Malcolm M. A. (1972) Algorithms to reveal properties of floating-point arithmetic. Comms. of the ACM, 15, 949-951. Gentleman W. M. and Marovich S. B. (1974) More on algorithms that reveal properties of floating point arithmetic units. Comms. of the ACM, 17, 276-277. ===================================================================== */ /* Initialized data */ logical first = TRUE_; /* System generated locals */ doublereal d__1, d__2; /* Local variables */ logical lrnd = FALSE_; doublereal a, b, c, f; integer lbeta = 0; doublereal savec; extern doublereal dlamc3_(doublereal *, doublereal *); logical lieee1 = FALSE_; doublereal t1, t2; integer lt = 0; doublereal one, qtr; if (first) { first = FALSE_; one = 1.; /* LBETA, LIEEE1, LT and LRND are the local values of BE TA, IEEE1, T and RND. Throughout this routine we use the function DLAMC3 to ens ure that relevant values are stored and not held in registers, or are not affected by optimizers. Compute a = 2.0**m with the smallest positive integer m s uch that fl( a + 1.0 ) = a. */ a = 1.; c = 1.; /* + WHILE( C.EQ.ONE )LOOP */ L10: if (c == one) { a *= 2; c = dlamc3_(&a, &one); d__1 = -a; c = dlamc3_(&c, &d__1); goto L10; } /* + END WHILE Now compute b = 2.0**m with the smallest positive integer m such that fl( a + b ) .gt. a. */ b = 1.; c = dlamc3_(&a, &b); /* + WHILE( C.EQ.A )LOOP */ L20: if (c == a) { b *= 2; c = dlamc3_(&a, &b); goto L20; } /* + END WHILE Now compute the base. a and c are neighbouring floating po integer numbers in the interval ( beta**t, beta**( t + 1 ) ) and so their difference is beta. Adding 0.25 to c is to ensure that it is truncated to beta and not ( beta - 1 ). */ qtr = one / 4; savec = c; d__1 = -a; c = dlamc3_(&c, &d__1); lbeta = (integer) (c + qtr); /* Now determine whether rounding or chopping occurs, by addin g a bit less than beta/2 and a bit more than beta/2 to a. */ b = (doublereal) lbeta; d__1 = b / 2; d__2 = -b / 100; f = dlamc3_(&d__1, &d__2); c = dlamc3_(&f, &a); if (c == a) { lrnd = TRUE_; } else { lrnd = FALSE_; } d__1 = b / 2; d__2 = b / 100; f = dlamc3_(&d__1, &d__2); c = dlamc3_(&f, &a); if (lrnd && c == a) { lrnd = FALSE_; } /* Try and decide whether rounding is done in the IEEE 'round to nearest' style. B/2 is half a unit in the last place of the two numbers A and SAVEC. Furthermore, A is even, i.e. has last bit zero, and SAVEC is odd. Thus adding B/2 to A should not cha nge A, but adding B/2 to SAVEC should change SAVEC. */ d__1 = b / 2; t1 = dlamc3_(&d__1, &a); d__1 = b / 2; t2 = dlamc3_(&d__1, &savec); lieee1 = t1 == a && t2 > savec && lrnd; /* Now find the mantissa, t. It should be the integer part of log to the base beta of a, however it is safer to determine t by powering. So we find t as the smallest positive integer for which fl( beta**t + 1.0 ) = 1.0. */ lt = 0; a = 1.; c = 1.; /* + WHILE( C.EQ.ONE )LOOP */ L30: if (c == one) { ++lt; a *= lbeta; c = dlamc3_(&a, &one); d__1 = -a; c = dlamc3_(&c, &d__1); goto L30; } /* + END WHILE */ } *beta = lbeta; *t = lt; *rnd = lrnd; *ieee1 = lieee1; return 0; /* End of DLAMC1 */ } /* dlamc1_ */ /* Subroutine */ integer dlamc2_(integer *beta, integer *t, logical *rnd, doublereal *eps, integer *emin, doublereal *rmin, integer *emax, doublereal *rmax) { /* -- LAPACK auxiliary routine (version 3.0) -- Univ. of Tennessee, Univ. of California Berkeley, NAG Ltd., Courant Institute, Argonne National Lab, and Rice University October 31, 1992 Purpose ======= DLAMC2 determines the machine parameters specified in its argument list. Arguments ========= BETA (output) INTEGER The base of the machine. T (output) INTEGER The number of ( BETA ) digits in the mantissa. RND (output) LOGICAL Specifies whether proper rounding ( RND = .TRUE. ) or chopping ( RND = .FALSE. ) occurs in addition. This may not be a reliable guide to the way in which the machine performs its arithmetic. EPS (output) DOUBLE PRECISION The smallest positive number such that fl( 1.0 - EPS ) .LT. 1.0, where fl denotes the computed value. EMIN (output) INTEGER The minimum exponent before (gradual) underflow occurs. RMIN (output) DOUBLE PRECISION The smallest normalized number for the machine, given by BASE**( EMIN - 1 ), where BASE is the floating point value of BETA. EMAX (output) INTEGER The maximum exponent before overflow occurs. RMAX (output) DOUBLE PRECISION The largest positive number for the machine, given by BASE**EMAX * ( 1 - EPS ), where BASE is the floating point value of BETA. Further Details =============== The computation of EPS is based on a routine PARANOIA by W. Kahan of the University of California at Berkeley. ===================================================================== */ /* Table of constant values */ /*** integer c__1 = 1;***/ /* Initialized data */ logical first = TRUE_; logical iwarn = FALSE_; /* System generated locals */ integer i__1; doublereal d__1, d__2, d__3, d__4, d__5; /* Builtin functions */ doublereal pow_di(doublereal *, integer *); /* Local variables */ logical ieee; doublereal half; logical lrnd= FALSE_; doublereal leps = 0., zero, a, b, c; integer i, lbeta = 0; doublereal rbase; integer lemin = 0, lemax = 0, gnmin; doublereal small; integer gpmin; doublereal third, lrmin = 0., lrmax = 0., sixth; extern /* Subroutine */ integer dlamc1_(integer *, integer *, logical *, logical *); extern doublereal dlamc3_(doublereal *, doublereal *); logical lieee1; extern /* Subroutine */ integer dlamc4_(integer *, doublereal *, integer *), dlamc5_(integer *, integer *, integer *, logical *, integer *, doublereal *); integer lt = 0, ngnmin, ngpmin; doublereal one, two; if (first) { first = FALSE_; zero = 0.; one = 1.; two = 2.; /* LBETA, LT, LRND, LEPS, LEMIN and LRMIN are the local values of BETA, T, RND, EPS, EMIN and RMIN. Throughout this routine we use the function DLAMC3 to ens ure that relevant values are stored and not held in registers, or are not affected by optimizers. DLAMC1 returns the parameters LBETA, LT, LRND and LIEEE1. */ dlamc1_(&lbeta, <, &lrnd, &lieee1); /* Start to find EPS. */ b = (doublereal) lbeta; i__1 = -lt; a = pow_di(&b, &i__1); leps = a; /* Try some tricks to see whether or not this is the correct E PS. */ b = two / 3; half = one / 2; d__1 = -half; sixth = dlamc3_(&b, &d__1); third = dlamc3_(&sixth, &sixth); d__1 = -half; b = dlamc3_(&third, &d__1); b = dlamc3_(&b, &sixth); b = abs(b); if (b < leps) { b = leps; } leps = 1.; /* + WHILE( ( LEPS.GT.B ).AND.( B.GT.ZERO ) )LOOP */ L10: if (leps > b && b > zero) { leps = b; d__1 = half * leps; /* Computing 5th power */ d__3 = two, d__4 = d__3, d__3 *= d__3; /* Computing 2nd power */ d__5 = leps; d__2 = d__4 * (d__3 * d__3) * (d__5 * d__5); c = dlamc3_(&d__1, &d__2); d__1 = -c; c = dlamc3_(&half, &d__1); b = dlamc3_(&half, &c); d__1 = -b; c = dlamc3_(&half, &d__1); b = dlamc3_(&half, &c); goto L10; } /* + END WHILE */ if (a < leps) { leps = a; } /* Computation of EPS complete. Now find EMIN. Let A = + or - 1, and + or - (1 + BASE**(-3 )). Keep dividing A by BETA until (gradual) underflow occurs. T his is detected when we cannot recover the previous A. */ rbase = one / lbeta; small = one; for (i = 1; i <= 3; ++i) { d__1 = small * rbase; small = dlamc3_(&d__1, &zero); /* L20: */ } a = dlamc3_(&one, &small); dlamc4_(&ngpmin, &one, &lbeta); d__1 = -one; dlamc4_(&ngnmin, &d__1, &lbeta); dlamc4_(&gpmin, &a, &lbeta); d__1 = -a; dlamc4_(&gnmin, &d__1, &lbeta); ieee = FALSE_; if (ngpmin == ngnmin && gpmin == gnmin) { if (ngpmin == gpmin) { lemin = ngpmin; /* ( Non twos-complement machines, no gradual under flow; e.g., VAX ) */ } else if (gpmin - ngpmin == 3) { lemin = ngpmin - 1 + lt; ieee = TRUE_; /* ( Non twos-complement machines, with gradual und erflow; e.g., IEEE standard followers ) */ } else { lemin = min(ngpmin,gpmin); /* ( A guess; no known machine ) */ iwarn = TRUE_; } } else if (ngpmin == gpmin && ngnmin == gnmin) { if ((i__1 = ngpmin - ngnmin, abs(i__1)) == 1) { lemin = max(ngpmin,ngnmin); /* ( Twos-complement machines, no gradual underflow ; e.g., CYBER 205 ) */ } else { lemin = min(ngpmin,ngnmin); /* ( A guess; no known machine ) */ iwarn = TRUE_; } } else if ((i__1 = ngpmin - ngnmin, abs(i__1)) == 1 && gpmin == gnmin) { if (gpmin - min(ngpmin,ngnmin) == 3) { lemin = max(ngpmin,ngnmin) - 1 + lt; /* ( Twos-complement machines with gradual underflo w; no known machine ) */ } else { lemin = min(ngpmin,ngnmin); /* ( A guess; no known machine ) */ iwarn = TRUE_; } } else { /* Computing MIN */ i__1 = min(ngpmin,ngnmin), i__1 = min(i__1,gpmin); lemin = min(i__1,gnmin); /* ( A guess; no known machine ) */ iwarn = TRUE_; } /* ** Comment out this if block if EMIN is ok */ if (iwarn) { first = TRUE_; hypre_printf("\n\n WARNING. The value EMIN may be incorrect:- "); hypre_printf("EMIN = %8i\n",(integer)lemin); hypre_printf("If, after inspection, the value EMIN looks acceptable"); hypre_printf("please comment out \n the IF block as marked within the"); hypre_printf("code of routine DLAMC2, \n otherwise supply EMIN"); hypre_printf("explicitly.\n"); } /* ** Assume IEEE arithmetic if we found denormalised numbers abo ve, or if arithmetic seems to round in the IEEE style, determi ned in routine DLAMC1. A true IEEE machine should have both thi ngs true; however, faulty machines may have one or the other. */ ieee = ieee || lieee1; /* Compute RMIN by successive division by BETA. We could comp ute RMIN as BASE**( EMIN - 1 ), but some machines underflow dur ing this computation. */ lrmin = 1.; i__1 = 1 - lemin; for (i = 1; i <= 1-lemin; ++i) { d__1 = lrmin * rbase; lrmin = dlamc3_(&d__1, &zero); /* L30: */ } /* Finally, call DLAMC5 to compute EMAX and RMAX. */ dlamc5_(&lbeta, <, &lemin, &ieee, &lemax, &lrmax); } *beta = lbeta; *t = lt; *rnd = lrnd; *eps = leps; *emin = lemin; *rmin = lrmin; *emax = lemax; *rmax = lrmax; return 0; /* End of DLAMC2 */ } /* dlamc2_ */ doublereal dlamc3_(doublereal *a, doublereal *b) { /* -- LAPACK auxiliary routine (version 3.0) -- Univ. of Tennessee, Univ. of California Berkeley, NAG Ltd., Courant Institute, Argonne National Lab, and Rice University October 31, 1992 Purpose ======= DLAMC3 is intended to force A and B to be stored prior to doing the addition of A and B , for use in situations where optimizers might hold one of these in a register. Arguments ========= A, B (input) DOUBLE PRECISION The values A and B. ===================================================================== */ /* >>Start of File<< System generated locals */ doublereal ret_val; ret_val = *a + *b; return ret_val; /* End of DLAMC3 */ } /* dlamc3_ */ /* Subroutine */ integer dlamc4_(integer *emin, doublereal *start, integer *base) { /* -- LAPACK auxiliary routine (version 2.0) -- Univ. of Tennessee, Univ. of California Berkeley, NAG Ltd., Courant Institute, Argonne National Lab, and Rice University October 31, 1992 Purpose ======= DLAMC4 is a service routine for DLAMC2. Arguments ========= EMIN (output) EMIN The minimum exponent before (gradual) underflow, computed by setting A = START and dividing by BASE until the previous A can not be recovered. START (input) DOUBLE PRECISION The starting point for determining EMIN. BASE (input) INTEGER The base of the machine. ===================================================================== */ /* System generated locals */ /***integer i__1;***/ doublereal d__1; /* Local variables */ doublereal zero, a; integer i; doublereal rbase, b1, b2, c1, c2, d1, d2; extern doublereal dlamc3_(doublereal *, doublereal *); doublereal one; a = *start; one = 1.; rbase = one / *base; zero = 0.; *emin = 1; d__1 = a * rbase; b1 = dlamc3_(&d__1, &zero); c1 = a; c2 = a; d1 = a; d2 = a; /* + WHILE( ( C1.EQ.A ).AND.( C2.EQ.A ).AND. $ ( D1.EQ.A ).AND.( D2.EQ.A ) )LOOP */ L10: if (c1 == a && c2 == a && d1 == a && d2 == a) { --(*emin); a = b1; d__1 = a / *base; b1 = dlamc3_(&d__1, &zero); d__1 = b1 * *base; c1 = dlamc3_(&d__1, &zero); d1 = zero; /*** i__1 = *base;***/ for (i = 1; i <= *base; ++i) { d1 += b1; /* L20: */ } d__1 = a * rbase; b2 = dlamc3_(&d__1, &zero); d__1 = b2 / rbase; c2 = dlamc3_(&d__1, &zero); d2 = zero; /*** i__1 = *base;***/ for (i = 1; i <= *base; ++i) { d2 += b2; /* L30: */ } goto L10; } /* + END WHILE */ return 0; /* End of DLAMC4 */ } /* dlamc4_ */ /* Subroutine */ integer dlamc5_(integer *beta, integer *p, integer *emin, logical *ieee, integer *emax, doublereal *rmax) { /* -- LAPACK auxiliary routine (version 3.0) -- Univ. of Tennessee, Univ. of California Berkeley, NAG Ltd., Courant Institute, Argonne National Lab, and Rice University October 31, 1992 Purpose ======= DLAMC5 attempts to compute RMAX, the largest machine floating-point number, without overflow. It assumes that EMAX + abs(EMIN) sum approximately to a power of 2. It will fail on machines where this assumption does not hold, for example, the Cyber 205 (EMIN = -28625, EMAX = 28718). It will also fail if the value supplied for EMIN is too large (i.e. too close to zero), probably with overflow. Arguments ========= BETA (input) INTEGER The base of floating-point arithmetic. P (input) INTEGER The number of base BETA digits in the mantissa of a floating-point value. EMIN (input) INTEGER The minimum exponent before (gradual) underflow. IEEE (input) LOGICAL A logical flag specifying whether or not the arithmetic system is thought to comply with the IEEE standard. EMAX (output) INTEGER The largest exponent before overflow RMAX (output) DOUBLE PRECISION The largest machine floating-point number. ===================================================================== First compute LEXP and UEXP, two powers of 2 that bound abs(EMIN). We then assume that EMAX + abs(EMIN) will sum approximately to the bound that is closest to abs(EMIN). (EMAX is the exponent of the required number RMAX). */ /* Table of constant values */ doublereal c_b5 = 0.; /* System generated locals */ /***integer i__1;***/ doublereal d__1; /* Local variables */ integer lexp; doublereal oldy = 0.; integer uexp, i; doublereal z; integer nbits; extern doublereal dlamc3_(doublereal *, doublereal *); doublereal recbas; integer exbits, expsum, try__; doublereal y; lexp = 1; exbits = 1; L10: try__ = lexp << 1; if (try__ <= -(*emin)) { lexp = try__; ++exbits; goto L10; } if (lexp == -(*emin)) { uexp = lexp; } else { uexp = try__; ++exbits; } /* Now -LEXP is less than or equal to EMIN, and -UEXP is greater than or equal to EMIN. EXBITS is the number of bits needed to store the exponent. */ if (uexp + *emin > -lexp - *emin) { expsum = lexp << 1; } else { expsum = uexp << 1; } /* EXPSUM is the exponent range, approximately equal to EMAX - EMIN + 1 . */ *emax = expsum + *emin - 1; nbits = exbits + 1 + *p; /* NBITS is the total number of bits needed to store a floating-point number. */ if (nbits % 2 == 1 && *beta == 2) { /* Either there are an odd number of bits used to store a floating-point number, which is unlikely, or some bits are not used in the representation of numbers, which is possible , (e.g. Cray machines) or the mantissa has an implicit bit, (e.g. IEEE machines, Dec Vax machines), which is perhaps the most likely. We have to assume the last alternative. If this is true, then we need to reduce EMAX by one because there must be some way of representing zero in an implicit-b it system. On machines like Cray, we are reducing EMAX by one unnecessarily. */ --(*emax); } if (*ieee) { /* Assume we are on an IEEE machine which reserves one exponent for infinity and NaN. */ --(*emax); } /* Now create RMAX, the largest machine number, which should be equal to (1.0 - BETA**(-P)) * BETA**EMAX . First compute 1.0 - BETA**(-P), being careful that the result is less than 1.0 . */ recbas = 1. / *beta; z = *beta - 1.; y = 0.; /***i__1 = *p;***/ for (i = 1; i <= *p; ++i) { z *= recbas; if (y < 1.) { oldy = y; } y = dlamc3_(&y, &z); /* L20: */ } if (y >= 1.) { y = oldy; } /* Now multiply by BETA**EMAX to get RMAX. */ /***i__1 = *emax;***/ for (i = 1; i <= *emax; ++i) { d__1 = y * ((doublereal) *beta); y = dlamc3_(&d__1, &c_b5); /* L30: */ } *rmax = y; return 0; /* End of DLAMC5 */ } /* dlamc5_ */ #ifdef __cplusplus } #endif hypre-2.33.0/src/lapack/dlange.c000066400000000000000000000106451477326011500163620ustar00rootroot00000000000000/* Copyright (c) 1992-2008 The University of Tennessee. All rights reserved. * See file COPYING in this directory for details. */ #ifdef __cplusplus extern "C" { #endif #include "f2c.h" #include "hypre_lapack.h" doublereal dlange_(const char *norm, integer *m, integer *n, doublereal *a, integer *lda, doublereal *work) { /* -- LAPACK auxiliary routine (version 3.0) -- Univ. of Tennessee, Univ. of California Berkeley, NAG Ltd., Courant Institute, Argonne National Lab, and Rice University October 31, 1992 Purpose ======= DLANGE returns the value of the one norm, or the Frobenius norm, or the infinity norm, or the element of largest absolute value of a real matrix A. Description =========== DLANGE returns the value DLANGE = ( max(abs(A(i,j))), NORM = 'M' or 'm' ( ( norm1(A), NORM = '1', 'O' or 'o' ( ( normI(A), NORM = 'I' or 'i' ( ( normF(A), NORM = 'F', 'f', 'E' or 'e' where norm1 denotes the one norm of a matrix (maximum column sum), normI denotes the infinity norm of a matrix (maximum row sum) and normF denotes the Frobenius norm of a matrix (square root of sum of squares). Note that max(abs(A(i,j))) is not a matrix norm. Arguments ========= NORM (input) CHARACTER*1 Specifies the value to be returned in DLANGE as described above. M (input) INTEGER The number of rows of the matrix A. M >= 0. When M = 0, DLANGE is set to zero. N (input) INTEGER The number of columns of the matrix A. N >= 0. When N = 0, DLANGE is set to zero. A (input) DOUBLE PRECISION array, dimension (LDA,N) The m by n matrix A. LDA (input) INTEGER The leading dimension of the array A. LDA >= max(M,1). WORK (workspace) DOUBLE PRECISION array, dimension (LWORK), where LWORK >= M when NORM = 'I'; otherwise, WORK is not referenced. ===================================================================== Parameter adjustments */ /* Table of constant values */ integer c__1 = 1; /* System generated locals */ integer a_dim1, a_offset, i__1, i__2; doublereal ret_val, d__1, d__2, d__3; /* Builtin functions */ /*doublereal sqrt(doublereal);*/ /* Local variables */ integer i__, j; doublereal scale; extern logical lsame_(const char *,const char *); doublereal value; extern /* Subroutine */ integer dlassq_(integer *, doublereal *, integer *, doublereal *, doublereal *); doublereal sum; #define a_ref(a_1,a_2) a[(a_2)*a_dim1 + a_1] a_dim1 = *lda; a_offset = 1 + a_dim1 * 1; a -= a_offset; --work; value = 0.; /* Function Body */ if (min(*m,*n) == 0) { value = 0.; } else if (lsame_(norm, "M")) { /* Find max(abs(A(i,j))). */ value = 0.; i__1 = *n; for (j = 1; j <= i__1; ++j) { i__2 = *m; for (i__ = 1; i__ <= i__2; ++i__) { /* Computing MAX */ d__2 = value, d__3 = (d__1 = a_ref(i__, j), abs(d__1)); value = max(d__2,d__3); /* L10: */ } /* L20: */ } } else if (lsame_(norm, "O") || *(unsigned char *) norm == '1') { /* Find norm1(A). */ value = 0.; i__1 = *n; for (j = 1; j <= i__1; ++j) { sum = 0.; i__2 = *m; for (i__ = 1; i__ <= i__2; ++i__) { sum += (d__1 = a_ref(i__, j), abs(d__1)); /* L30: */ } value = max(value,sum); /* L40: */ } } else if (lsame_(norm, "I")) { /* Find normI(A). */ i__1 = *m; for (i__ = 1; i__ <= i__1; ++i__) { work[i__] = 0.; /* L50: */ } i__1 = *n; for (j = 1; j <= i__1; ++j) { i__2 = *m; for (i__ = 1; i__ <= i__2; ++i__) { work[i__] += (d__1 = a_ref(i__, j), abs(d__1)); /* L60: */ } /* L70: */ } value = 0.; i__1 = *m; for (i__ = 1; i__ <= i__1; ++i__) { /* Computing MAX */ d__1 = value, d__2 = work[i__]; value = max(d__1,d__2); /* L80: */ } } else if (lsame_(norm, "F") || lsame_(norm, "E")) { /* Find normF(A). */ scale = 0.; sum = 1.; i__1 = *n; for (j = 1; j <= i__1; ++j) { dlassq_(m, &a_ref(1, j), &c__1, &scale, &sum); /* L90: */ } value = scale * sqrt(sum); } ret_val = value; return ret_val; /* End of DLANGE */ } /* dlange_ */ #undef a_ref #ifdef __cplusplus } #endif hypre-2.33.0/src/lapack/dlanst.c000066400000000000000000000074571477326011500164240ustar00rootroot00000000000000/* Copyright (c) 1992-2008 The University of Tennessee. All rights reserved. * See file COPYING in this directory for details. */ #ifdef __cplusplus extern "C" { #endif #include "f2c.h" #include "hypre_lapack.h" doublereal dlanst_(const char *norm, integer *n, doublereal *d__, doublereal *e) { /* -- LAPACK auxiliary routine (version 3.0) -- Univ. of Tennessee, Univ. of California Berkeley, NAG Ltd., Courant Institute, Argonne National Lab, and Rice University February 29, 1992 Purpose ======= DLANST returns the value of the one norm, or the Frobenius norm, or the infinity norm, or the element of largest absolute value of a real symmetric tridiagonal matrix A. Description =========== DLANST returns the value DLANST = ( max(abs(A(i,j))), NORM = 'M' or 'm' ( ( norm1(A), NORM = '1', 'O' or 'o' ( ( normI(A), NORM = 'I' or 'i' ( ( normF(A), NORM = 'F', 'f', 'E' or 'e' where norm1 denotes the one norm of a matrix (maximum column sum), normI denotes the infinity norm of a matrix (maximum row sum) and normF denotes the Frobenius norm of a matrix (square root of sum of squares). Note that max(abs(A(i,j))) is not a matrix norm. Arguments ========= NORM (input) CHARACTER*1 Specifies the value to be returned in DLANST as described above. N (input) INTEGER The order of the matrix A. N >= 0. When N = 0, DLANST is set to zero. D (input) DOUBLE PRECISION array, dimension (N) The diagonal elements of A. E (input) DOUBLE PRECISION array, dimension (N-1) The (n-1) sub-diagonal or super-diagonal elements of A. ===================================================================== Parameter adjustments */ /* Table of constant values */ integer c__1 = 1; /* System generated locals */ integer i__1; doublereal ret_val, d__1, d__2, d__3, d__4, d__5; /* Local variables */ integer i__; doublereal scale; extern logical lsame_(const char *,const char *); doublereal anorm; extern /* Subroutine */ integer dlassq_(integer *, doublereal *, integer *, doublereal *, doublereal *); doublereal sum; --e; --d__; anorm = 0.; /* Function Body */ if (*n <= 0) { anorm = 0.; } else if (lsame_(norm, "M")) { /* Find max(abs(A(i,j))). */ anorm = (d__1 = d__[*n], abs(d__1)); i__1 = *n - 1; for (i__ = 1; i__ <= i__1; ++i__) { /* Computing MAX */ d__2 = anorm, d__3 = (d__1 = d__[i__], abs(d__1)); anorm = max(d__2,d__3); /* Computing MAX */ d__2 = anorm, d__3 = (d__1 = e[i__], abs(d__1)); anorm = max(d__2,d__3); /* L10: */ } } else if (lsame_(norm, "O") || *(unsigned char *) norm == '1' || lsame_(norm, "I")) { /* Find norm1(A). */ if (*n == 1) { anorm = abs(d__[1]); } else { /* Computing MAX */ d__3 = abs(d__[1]) + abs(e[1]), d__4 = (d__1 = e[*n - 1], abs( d__1)) + (d__2 = d__[*n], abs(d__2)); anorm = max(d__3,d__4); i__1 = *n - 1; for (i__ = 2; i__ <= i__1; ++i__) { /* Computing MAX */ d__4 = anorm, d__5 = (d__1 = d__[i__], abs(d__1)) + (d__2 = e[ i__], abs(d__2)) + (d__3 = e[i__ - 1], abs(d__3)); anorm = max(d__4,d__5); /* L20: */ } } } else if (lsame_(norm, "F") || lsame_(norm, "E")) { /* Find normF(A). */ scale = 0.; sum = 1.; if (*n > 1) { i__1 = *n - 1; dlassq_(&i__1, &e[1], &c__1, &scale, &sum); sum *= 2; } dlassq_(n, &d__[1], &c__1, &scale, &sum); anorm = scale * sqrt(sum); } ret_val = anorm; return ret_val; /* End of DLANST */ } /* dlanst_ */ #ifdef __cplusplus } #endif hypre-2.33.0/src/lapack/dlansy.c000066400000000000000000000134671477326011500164270ustar00rootroot00000000000000/* Copyright (c) 1992-2008 The University of Tennessee. All rights reserved. * See file COPYING in this directory for details. */ #ifdef __cplusplus extern "C" { #endif #include "f2c.h" #include "hypre_lapack.h" doublereal dlansy_(const char *norm,const char *uplo, integer *n, doublereal *a, integer *lda, doublereal *work) { /* -- LAPACK auxiliary routine (version 3.0) -- Univ. of Tennessee, Univ. of California Berkeley, NAG Ltd., Courant Institute, Argonne National Lab, and Rice University October 31, 1992 Purpose ======= DLANSY returns the value of the one norm, or the Frobenius norm, or the infinity norm, or the element of largest absolute value of a real symmetric matrix A. Description =========== DLANSY returns the value DLANSY = ( max(abs(A(i,j))), NORM = 'M' or 'm' ( ( norm1(A), NORM = '1', 'O' or 'o' ( ( normI(A), NORM = 'I' or 'i' ( ( normF(A), NORM = 'F', 'f', 'E' or 'e' where norm1 denotes the one norm of a matrix (maximum column sum), normI denotes the infinity norm of a matrix (maximum row sum) and normF denotes the Frobenius norm of a matrix (square root of sum of squares). Note that max(abs(A(i,j))) is not a matrix norm. Arguments ========= NORM (input) CHARACTER*1 Specifies the value to be returned in DLANSY as described above. UPLO (input) CHARACTER*1 Specifies whether the upper or lower triangular part of the symmetric matrix A is to be referenced. = 'U': Upper triangular part of A is referenced = 'L': Lower triangular part of A is referenced N (input) INTEGER The order of the matrix A. N >= 0. When N = 0, DLANSY is set to zero. A (input) DOUBLE PRECISION array, dimension (LDA,N) The symmetric matrix A. If UPLO = 'U', the leading n by n upper triangular part of A contains the upper triangular part of the matrix A, and the strictly lower triangular part of A is not referenced. If UPLO = 'L', the leading n by n lower triangular part of A contains the lower triangular part of the matrix A, and the strictly upper triangular part of A is not referenced. LDA (input) INTEGER The leading dimension of the array A. LDA >= max(N,1). WORK (workspace) DOUBLE PRECISION array, dimension (LWORK), where LWORK >= N when NORM = 'I' or '1' or 'O'; otherwise, WORK is not referenced. ===================================================================== Parameter adjustments */ /* Table of constant values */ integer c__1 = 1; /* System generated locals */ integer a_dim1, a_offset, i__1, i__2; doublereal ret_val, d__1, d__2, d__3; /* Builtin functions */ /*doublereal sqrt(doublereal);*/ /* Local variables */ doublereal absa; integer i__, j; doublereal scale; extern logical lsame_(const char *,const char *); doublereal value; extern /* Subroutine */ integer dlassq_(integer *, doublereal *, integer *, doublereal *, doublereal *); doublereal sum; #define a_ref(a_1,a_2) a[(a_2)*a_dim1 + a_1] a_dim1 = *lda; a_offset = 1 + a_dim1 * 1; a -= a_offset; --work; value = 0.; /* Function Body */ if (*n == 0) { value = 0.; } else if (lsame_(norm, "M")) { /* Find max(abs(A(i,j))). */ value = 0.; if (lsame_(uplo, "U")) { i__1 = *n; for (j = 1; j <= i__1; ++j) { i__2 = j; for (i__ = 1; i__ <= i__2; ++i__) { /* Computing MAX */ d__2 = value, d__3 = (d__1 = a_ref(i__, j), abs(d__1)); value = max(d__2,d__3); /* L10: */ } /* L20: */ } } else { i__1 = *n; for (j = 1; j <= i__1; ++j) { i__2 = *n; for (i__ = j; i__ <= i__2; ++i__) { /* Computing MAX */ d__2 = value, d__3 = (d__1 = a_ref(i__, j), abs(d__1)); value = max(d__2,d__3); /* L30: */ } /* L40: */ } } } else if (lsame_(norm, "I") || lsame_(norm, "O") || *(unsigned char *)norm == '1') { /* Find normI(A) ( = norm1(A), since A is symmetric). */ value = 0.; if (lsame_(uplo, "U")) { i__1 = *n; for (j = 1; j <= i__1; ++j) { sum = 0.; i__2 = j - 1; for (i__ = 1; i__ <= i__2; ++i__) { absa = (d__1 = a_ref(i__, j), abs(d__1)); sum += absa; work[i__] += absa; /* L50: */ } work[j] = sum + (d__1 = a_ref(j, j), abs(d__1)); /* L60: */ } i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { /* Computing MAX */ d__1 = value, d__2 = work[i__]; value = max(d__1,d__2); /* L70: */ } } else { i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { work[i__] = 0.; /* L80: */ } i__1 = *n; for (j = 1; j <= i__1; ++j) { sum = work[j] + (d__1 = a_ref(j, j), abs(d__1)); i__2 = *n; for (i__ = j + 1; i__ <= i__2; ++i__) { absa = (d__1 = a_ref(i__, j), abs(d__1)); sum += absa; work[i__] += absa; /* L90: */ } value = max(value,sum); /* L100: */ } } } else if (lsame_(norm, "F") || lsame_(norm, "E")) { /* Find normF(A). */ scale = 0.; sum = 1.; if (lsame_(uplo, "U")) { i__1 = *n; for (j = 2; j <= i__1; ++j) { i__2 = j - 1; dlassq_(&i__2, &a_ref(1, j), &c__1, &scale, &sum); /* L110: */ } } else { i__1 = *n - 1; for (j = 1; j <= i__1; ++j) { i__2 = *n - j; dlassq_(&i__2, &a_ref(j + 1, j), &c__1, &scale, &sum); /* L120: */ } } sum *= 2; i__1 = *lda + 1; dlassq_(n, &a[a_offset], &i__1, &scale, &sum); value = scale * sqrt(sum); } ret_val = value; return ret_val; /* End of DLANSY */ } /* dlansy_ */ #undef a_ref #ifdef __cplusplus } #endif hypre-2.33.0/src/lapack/dlapy2.c000066400000000000000000000024621477326011500163210ustar00rootroot00000000000000/* Copyright (c) 1992-2008 The University of Tennessee. All rights reserved. * See file COPYING in this directory for details. */ #ifdef __cplusplus extern "C" { #endif #include "f2c.h" #include "hypre_lapack.h" doublereal dlapy2_(doublereal *x, doublereal *y) { /* -- LAPACK auxiliary routine (version 3.0) -- Univ. of Tennessee, Univ. of California Berkeley, NAG Ltd., Courant Institute, Argonne National Lab, and Rice University October 31, 1992 Purpose ======= DLAPY2 returns sqrt(x**2+y**2), taking care not to cause unnecessary overflow. Arguments ========= X (input) DOUBLE PRECISION Y (input) DOUBLE PRECISION X and Y specify the values x and y. ===================================================================== */ /* System generated locals */ doublereal ret_val, d__1; /* Builtin functions */ /*doublereal sqrt(doublereal);*/ /* Local variables */ doublereal xabs, yabs, w, z__; xabs = abs(*x); yabs = abs(*y); w = max(xabs,yabs); z__ = min(xabs,yabs); if (z__ == 0.) { ret_val = w; } else { /* Computing 2nd power */ d__1 = z__ / w; ret_val = w * sqrt(d__1 * d__1 + 1.); } return ret_val; /* End of DLAPY2 */ } /* dlapy2_ */ #ifdef __cplusplus } #endif hypre-2.33.0/src/lapack/dlarf.c000066400000000000000000000072341477326011500162200ustar00rootroot00000000000000/* Copyright (c) 1992-2008 The University of Tennessee. All rights reserved. * See file COPYING in this directory for details. */ #ifdef __cplusplus extern "C" { #endif #include "f2c.h" #include "hypre_lapack.h" /* Subroutine */ integer dlarf_(const char *side, integer *m, integer *n, doublereal *v, integer *incv, doublereal *tau, doublereal *c__, integer *ldc, doublereal *work) { /* -- LAPACK auxiliary routine (version 3.0) -- Univ. of Tennessee, Univ. of California Berkeley, NAG Ltd., Courant Institute, Argonne National Lab, and Rice University February 29, 1992 Purpose ======= DLARF applies a real elementary reflector H to a real m by n matrix C, from either the left or the right. H is represented in the form H = I - tau * v * v' where tau is a real scalar and v is a real vector. If tau = 0, then H is taken to be the unit matrix. Arguments ========= SIDE (input) CHARACTER*1 = 'L': form H * C = 'R': form C * H M (input) INTEGER The number of rows of the matrix C. N (input) INTEGER The number of columns of the matrix C. V (input) DOUBLE PRECISION array, dimension (1 + (M-1)*abs(INCV)) if SIDE = 'L' or (1 + (N-1)*abs(INCV)) if SIDE = 'R' The vector v in the representation of H. V is not used if TAU = 0. INCV (input) INTEGER The increment between elements of v. INCV <> 0. TAU (input) DOUBLE PRECISION The value tau in the representation of H. C (input/output) DOUBLE PRECISION array, dimension (LDC,N) On entry, the m by n matrix C. On exit, C is overwritten by the matrix H * C if SIDE = 'L', or C * H if SIDE = 'R'. LDC (input) INTEGER The leading dimension of the array C. LDC >= max(1,M). WORK (workspace) DOUBLE PRECISION array, dimension (N) if SIDE = 'L' or (M) if SIDE = 'R' ===================================================================== Parameter adjustments */ /* Table of constant values */ doublereal c_b4 = 1.; doublereal c_b5 = 0.; integer c__1 = 1; /* System generated locals */ integer c_dim1, c_offset; doublereal d__1; /* Local variables */ extern /* Subroutine */ integer dger_(integer *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *, doublereal *, integer *); extern logical lsame_(const char *,const char *); extern /* Subroutine */ integer dgemv_(const char *, integer *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *); --v; c_dim1 = *ldc; c_offset = 1 + c_dim1 * 1; c__ -= c_offset; --work; /* Function Body */ if (lsame_(side, "L")) { /* Form H * C */ if (*tau != 0.) { /* w := C' * v */ dgemv_("Transpose", m, n, &c_b4, &c__[c_offset], ldc, &v[1], incv, &c_b5, &work[1], &c__1); /* C := C - v * w' */ d__1 = -(*tau); dger_(m, n, &d__1, &v[1], incv, &work[1], &c__1, &c__[c_offset], ldc); } } else { /* Form C * H */ if (*tau != 0.) { /* w := C * v */ dgemv_("No transpose", m, n, &c_b4, &c__[c_offset], ldc, &v[1], incv, &c_b5, &work[1], &c__1); /* C := C - w * v' */ d__1 = -(*tau); dger_(m, n, &d__1, &work[1], &c__1, &v[1], incv, &c__[c_offset], ldc); } } return 0; /* End of DLARF */ } /* dlarf_ */ #ifdef __cplusplus } #endif hypre-2.33.0/src/lapack/dlarfb.c000066400000000000000000000444301477326011500163610ustar00rootroot00000000000000/* Copyright (c) 1992-2008 The University of Tennessee. All rights reserved. * See file COPYING in this directory for details. */ #ifdef __cplusplus extern "C" { #endif #include "f2c.h" #include "hypre_lapack.h" /* Subroutine */ integer dlarfb_(const char *side,const char *trans,const char *direct,const char * storev, integer *m, integer *n, integer *k, doublereal *v, integer * ldv, doublereal *t, integer *ldt, doublereal *c__, integer *ldc, doublereal *work, integer *ldwork) { /* -- LAPACK auxiliary routine (version 3.0) -- Univ. of Tennessee, Univ. of California Berkeley, NAG Ltd., Courant Institute, Argonne National Lab, and Rice University February 29, 1992 Purpose ======= DLARFB applies a real block reflector H or its transpose H' to a real m by n matrix C, from either the left or the right. Arguments ========= SIDE (input) CHARACTER*1 = 'L': apply H or H' from the Left = 'R': apply H or H' from the Right TRANS (input) CHARACTER*1 = 'N': apply H (No transpose) = 'T': apply H' (Transpose) DIRECT (input) CHARACTER*1 Indicates how H is formed from a product of elementary reflectors = 'F': H = H(1) H(2) . . . H(k) (Forward) = 'B': H = H(k) . . . H(2) H(1) (Backward) STOREV (input) CHARACTER*1 Indicates how the vectors which define the elementary reflectors are stored: = 'C': Columnwise = 'R': Rowwise M (input) INTEGER The number of rows of the matrix C. N (input) INTEGER The number of columns of the matrix C. K (input) INTEGER The order of the matrix T (= the number of elementary reflectors whose product defines the block reflector). V (input) DOUBLE PRECISION array, dimension (LDV,K) if STOREV = 'C' (LDV,M) if STOREV = 'R' and SIDE = 'L' (LDV,N) if STOREV = 'R' and SIDE = 'R' The matrix V. See further details. LDV (input) INTEGER The leading dimension of the array V. If STOREV = 'C' and SIDE = 'L', LDV >= max(1,M); if STOREV = 'C' and SIDE = 'R', LDV >= max(1,N); if STOREV = 'R', LDV >= K. T (input) DOUBLE PRECISION array, dimension (LDT,K) The triangular k by k matrix T in the representation of the block reflector. LDT (input) INTEGER The leading dimension of the array T. LDT >= K. C (input/output) DOUBLE PRECISION array, dimension (LDC,N) On entry, the m by n matrix C. On exit, C is overwritten by H*C or H'*C or C*H or C*H'. LDC (input) INTEGER The leading dimension of the array C. LDA >= max(1,M). WORK (workspace) DOUBLE PRECISION array, dimension (LDWORK,K) LDWORK (input) INTEGER The leading dimension of the array WORK. If SIDE = 'L', LDWORK >= max(1,N); if SIDE = 'R', LDWORK >= max(1,M). ===================================================================== Quick return if possible Parameter adjustments */ /* Table of constant values */ integer c__1 = 1; doublereal c_b14 = 1.; doublereal c_b25 = -1.; /* System generated locals */ integer c_dim1, c_offset, t_dim1, t_offset, v_dim1, v_offset, work_dim1, work_offset, i__1, i__2; /* Local variables */ integer i__, j; extern /* Subroutine */ integer dgemm_(const char *,const char *, integer *, integer *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *); extern logical lsame_(const char *,const char *); extern /* Subroutine */ integer dcopy_(integer *, doublereal *, integer *, doublereal *, integer *), dtrmm_(const char *,const char *,const char *,const char *, integer *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *); char transt[1]; #define work_ref(a_1,a_2) work[(a_2)*work_dim1 + a_1] #define c___ref(a_1,a_2) c__[(a_2)*c_dim1 + a_1] #define v_ref(a_1,a_2) v[(a_2)*v_dim1 + a_1] v_dim1 = *ldv; v_offset = 1 + v_dim1 * 1; v -= v_offset; t_dim1 = *ldt; t_offset = 1 + t_dim1 * 1; t -= t_offset; c_dim1 = *ldc; c_offset = 1 + c_dim1 * 1; c__ -= c_offset; work_dim1 = *ldwork; work_offset = 1 + work_dim1 * 1; work -= work_offset; /* Function Body */ if (*m <= 0 || *n <= 0) { return 0; } if (lsame_(trans, "N")) { *(unsigned char *)transt = 'T'; } else { *(unsigned char *)transt = 'N'; } if (lsame_(storev, "C")) { if (lsame_(direct, "F")) { /* Let V = ( V1 ) (first K rows) ( V2 ) where V1 is unit lower triangular. */ if (lsame_(side, "L")) { /* Form H * C or H' * C where C = ( C1 ) ( C2 ) W := C' * V = (C1'*V1 + C2'*V2) (stored in WORK) W := C1' */ i__1 = *k; for (j = 1; j <= i__1; ++j) { dcopy_(n, &c___ref(j, 1), ldc, &work_ref(1, j), &c__1); /* L10: */ } /* W := W * V1 */ dtrmm_("Right", "Lower", "No transpose", "Unit", n, k, &c_b14, &v[v_offset], ldv, &work[work_offset], ldwork); if (*m > *k) { /* W := W + C2'*V2 */ i__1 = *m - *k; dgemm_("Transpose", "No transpose", n, k, &i__1, &c_b14, & c___ref(*k + 1, 1), ldc, &v_ref(*k + 1, 1), ldv, & c_b14, &work[work_offset], ldwork); } /* W := W * T' or W * T */ dtrmm_("Right", "Upper", transt, "Non-unit", n, k, &c_b14, &t[ t_offset], ldt, &work[work_offset], ldwork); /* C := C - V * W' */ if (*m > *k) { /* C2 := C2 - V2 * W' */ i__1 = *m - *k; dgemm_("No transpose", "Transpose", &i__1, n, k, &c_b25, & v_ref(*k + 1, 1), ldv, &work[work_offset], ldwork, &c_b14, &c___ref(*k + 1, 1), ldc); } /* W := W * V1' */ dtrmm_("Right", "Lower", "Transpose", "Unit", n, k, &c_b14, & v[v_offset], ldv, &work[work_offset], ldwork); /* C1 := C1 - W' */ i__1 = *k; for (j = 1; j <= i__1; ++j) { i__2 = *n; for (i__ = 1; i__ <= i__2; ++i__) { c___ref(j, i__) = c___ref(j, i__) - work_ref(i__, j); /* L20: */ } /* L30: */ } } else if (lsame_(side, "R")) { /* Form C * H or C * H' where C = ( C1 C2 ) W := C * V = (C1*V1 + C2*V2) (stored in WORK) W := C1 */ i__1 = *k; for (j = 1; j <= i__1; ++j) { dcopy_(m, &c___ref(1, j), &c__1, &work_ref(1, j), &c__1); /* L40: */ } /* W := W * V1 */ dtrmm_("Right", "Lower", "No transpose", "Unit", m, k, &c_b14, &v[v_offset], ldv, &work[work_offset], ldwork); if (*n > *k) { /* W := W + C2 * V2 */ i__1 = *n - *k; dgemm_("No transpose", "No transpose", m, k, &i__1, & c_b14, &c___ref(1, *k + 1), ldc, &v_ref(*k + 1, 1) , ldv, &c_b14, &work[work_offset], ldwork); } /* W := W * T or W * T' */ dtrmm_("Right", "Upper", trans, "Non-unit", m, k, &c_b14, &t[ t_offset], ldt, &work[work_offset], ldwork); /* C := C - W * V' */ if (*n > *k) { /* C2 := C2 - W * V2' */ i__1 = *n - *k; dgemm_("No transpose", "Transpose", m, &i__1, k, &c_b25, & work[work_offset], ldwork, &v_ref(*k + 1, 1), ldv, &c_b14, &c___ref(1, *k + 1), ldc); } /* W := W * V1' */ dtrmm_("Right", "Lower", "Transpose", "Unit", m, k, &c_b14, & v[v_offset], ldv, &work[work_offset], ldwork); /* C1 := C1 - W */ i__1 = *k; for (j = 1; j <= i__1; ++j) { i__2 = *m; for (i__ = 1; i__ <= i__2; ++i__) { c___ref(i__, j) = c___ref(i__, j) - work_ref(i__, j); /* L50: */ } /* L60: */ } } } else { /* Let V = ( V1 ) ( V2 ) (last K rows) where V2 is unit upper triangular. */ if (lsame_(side, "L")) { /* Form H * C or H' * C where C = ( C1 ) ( C2 ) W := C' * V = (C1'*V1 + C2'*V2) (stored in WORK) W := C2' */ i__1 = *k; for (j = 1; j <= i__1; ++j) { dcopy_(n, &c___ref(*m - *k + j, 1), ldc, &work_ref(1, j), &c__1); /* L70: */ } /* W := W * V2 */ dtrmm_("Right", "Upper", "No transpose", "Unit", n, k, &c_b14, &v_ref(*m - *k + 1, 1), ldv, &work[work_offset], ldwork); if (*m > *k) { /* W := W + C1'*V1 */ i__1 = *m - *k; dgemm_("Transpose", "No transpose", n, k, &i__1, &c_b14, & c__[c_offset], ldc, &v[v_offset], ldv, &c_b14, & work[work_offset], ldwork); } /* W := W * T' or W * T */ dtrmm_("Right", "Lower", transt, "Non-unit", n, k, &c_b14, &t[ t_offset], ldt, &work[work_offset], ldwork); /* C := C - V * W' */ if (*m > *k) { /* C1 := C1 - V1 * W' */ i__1 = *m - *k; dgemm_("No transpose", "Transpose", &i__1, n, k, &c_b25, & v[v_offset], ldv, &work[work_offset], ldwork, & c_b14, &c__[c_offset], ldc) ; } /* W := W * V2' */ dtrmm_("Right", "Upper", "Transpose", "Unit", n, k, &c_b14, & v_ref(*m - *k + 1, 1), ldv, &work[work_offset], ldwork); /* C2 := C2 - W' */ i__1 = *k; for (j = 1; j <= i__1; ++j) { i__2 = *n; for (i__ = 1; i__ <= i__2; ++i__) { c___ref(*m - *k + j, i__) = c___ref(*m - *k + j, i__) - work_ref(i__, j); /* L80: */ } /* L90: */ } } else if (lsame_(side, "R")) { /* Form C * H or C * H' where C = ( C1 C2 ) W := C * V = (C1*V1 + C2*V2) (stored in WORK) W := C2 */ i__1 = *k; for (j = 1; j <= i__1; ++j) { dcopy_(m, &c___ref(1, *n - *k + j), &c__1, &work_ref(1, j) , &c__1); /* L100: */ } /* W := W * V2 */ dtrmm_("Right", "Upper", "No transpose", "Unit", m, k, &c_b14, &v_ref(*n - *k + 1, 1), ldv, &work[work_offset], ldwork); if (*n > *k) { /* W := W + C1 * V1 */ i__1 = *n - *k; dgemm_("No transpose", "No transpose", m, k, &i__1, & c_b14, &c__[c_offset], ldc, &v[v_offset], ldv, & c_b14, &work[work_offset], ldwork); } /* W := W * T or W * T' */ dtrmm_("Right", "Lower", trans, "Non-unit", m, k, &c_b14, &t[ t_offset], ldt, &work[work_offset], ldwork); /* C := C - W * V' */ if (*n > *k) { /* C1 := C1 - W * V1' */ i__1 = *n - *k; dgemm_("No transpose", "Transpose", m, &i__1, k, &c_b25, & work[work_offset], ldwork, &v[v_offset], ldv, & c_b14, &c__[c_offset], ldc) ; } /* W := W * V2' */ dtrmm_("Right", "Upper", "Transpose", "Unit", m, k, &c_b14, & v_ref(*n - *k + 1, 1), ldv, &work[work_offset], ldwork); /* C2 := C2 - W */ i__1 = *k; for (j = 1; j <= i__1; ++j) { i__2 = *m; for (i__ = 1; i__ <= i__2; ++i__) { c___ref(i__, *n - *k + j) = c___ref(i__, *n - *k + j) - work_ref(i__, j); /* L110: */ } /* L120: */ } } } } else if (lsame_(storev, "R")) { if (lsame_(direct, "F")) { /* Let V = ( V1 V2 ) (V1: first K columns) where V1 is unit upper triangular. */ if (lsame_(side, "L")) { /* Form H * C or H' * C where C = ( C1 ) ( C2 ) W := C' * V' = (C1'*V1' + C2'*V2') (stored in WORK) W := C1' */ i__1 = *k; for (j = 1; j <= i__1; ++j) { dcopy_(n, &c___ref(j, 1), ldc, &work_ref(1, j), &c__1); /* L130: */ } /* W := W * V1' */ dtrmm_("Right", "Upper", "Transpose", "Unit", n, k, &c_b14, & v[v_offset], ldv, &work[work_offset], ldwork); if (*m > *k) { /* W := W + C2'*V2' */ i__1 = *m - *k; dgemm_("Transpose", "Transpose", n, k, &i__1, &c_b14, & c___ref(*k + 1, 1), ldc, &v_ref(1, *k + 1), ldv, & c_b14, &work[work_offset], ldwork); } /* W := W * T' or W * T */ dtrmm_("Right", "Upper", transt, "Non-unit", n, k, &c_b14, &t[ t_offset], ldt, &work[work_offset], ldwork); /* C := C - V' * W' */ if (*m > *k) { /* C2 := C2 - V2' * W' */ i__1 = *m - *k; dgemm_("Transpose", "Transpose", &i__1, n, k, &c_b25, & v_ref(1, *k + 1), ldv, &work[work_offset], ldwork, &c_b14, &c___ref(*k + 1, 1), ldc); } /* W := W * V1 */ dtrmm_("Right", "Upper", "No transpose", "Unit", n, k, &c_b14, &v[v_offset], ldv, &work[work_offset], ldwork); /* C1 := C1 - W' */ i__1 = *k; for (j = 1; j <= i__1; ++j) { i__2 = *n; for (i__ = 1; i__ <= i__2; ++i__) { c___ref(j, i__) = c___ref(j, i__) - work_ref(i__, j); /* L140: */ } /* L150: */ } } else if (lsame_(side, "R")) { /* Form C * H or C * H' where C = ( C1 C2 ) W := C * V' = (C1*V1' + C2*V2') (stored in WORK) W := C1 */ i__1 = *k; for (j = 1; j <= i__1; ++j) { dcopy_(m, &c___ref(1, j), &c__1, &work_ref(1, j), &c__1); /* L160: */ } /* W := W * V1' */ dtrmm_("Right", "Upper", "Transpose", "Unit", m, k, &c_b14, & v[v_offset], ldv, &work[work_offset], ldwork); if (*n > *k) { /* W := W + C2 * V2' */ i__1 = *n - *k; dgemm_("No transpose", "Transpose", m, k, &i__1, &c_b14, & c___ref(1, *k + 1), ldc, &v_ref(1, *k + 1), ldv, & c_b14, &work[work_offset], ldwork); } /* W := W * T or W * T' */ dtrmm_("Right", "Upper", trans, "Non-unit", m, k, &c_b14, &t[ t_offset], ldt, &work[work_offset], ldwork); /* C := C - W * V */ if (*n > *k) { /* C2 := C2 - W * V2 */ i__1 = *n - *k; dgemm_("No transpose", "No transpose", m, &i__1, k, & c_b25, &work[work_offset], ldwork, &v_ref(1, *k + 1), ldv, &c_b14, &c___ref(1, *k + 1), ldc); } /* W := W * V1 */ dtrmm_("Right", "Upper", "No transpose", "Unit", m, k, &c_b14, &v[v_offset], ldv, &work[work_offset], ldwork); /* C1 := C1 - W */ i__1 = *k; for (j = 1; j <= i__1; ++j) { i__2 = *m; for (i__ = 1; i__ <= i__2; ++i__) { c___ref(i__, j) = c___ref(i__, j) - work_ref(i__, j); /* L170: */ } /* L180: */ } } } else { /* Let V = ( V1 V2 ) (V2: last K columns) where V2 is unit lower triangular. */ if (lsame_(side, "L")) { /* Form H * C or H' * C where C = ( C1 ) ( C2 ) W := C' * V' = (C1'*V1' + C2'*V2') (stored in WORK) W := C2' */ i__1 = *k; for (j = 1; j <= i__1; ++j) { dcopy_(n, &c___ref(*m - *k + j, 1), ldc, &work_ref(1, j), &c__1); /* L190: */ } /* W := W * V2' */ dtrmm_("Right", "Lower", "Transpose", "Unit", n, k, &c_b14, & v_ref(1, *m - *k + 1), ldv, &work[work_offset], ldwork); if (*m > *k) { /* W := W + C1'*V1' */ i__1 = *m - *k; dgemm_("Transpose", "Transpose", n, k, &i__1, &c_b14, & c__[c_offset], ldc, &v[v_offset], ldv, &c_b14, & work[work_offset], ldwork); } /* W := W * T' or W * T */ dtrmm_("Right", "Lower", transt, "Non-unit", n, k, &c_b14, &t[ t_offset], ldt, &work[work_offset], ldwork); /* C := C - V' * W' */ if (*m > *k) { /* C1 := C1 - V1' * W' */ i__1 = *m - *k; dgemm_("Transpose", "Transpose", &i__1, n, k, &c_b25, &v[ v_offset], ldv, &work[work_offset], ldwork, & c_b14, &c__[c_offset], ldc); } /* W := W * V2 */ dtrmm_("Right", "Lower", "No transpose", "Unit", n, k, &c_b14, &v_ref(1, *m - *k + 1), ldv, &work[work_offset], ldwork); /* C2 := C2 - W' */ i__1 = *k; for (j = 1; j <= i__1; ++j) { i__2 = *n; for (i__ = 1; i__ <= i__2; ++i__) { c___ref(*m - *k + j, i__) = c___ref(*m - *k + j, i__) - work_ref(i__, j); /* L200: */ } /* L210: */ } } else if (lsame_(side, "R")) { /* Form C * H or C * H' where C = ( C1 C2 ) W := C * V' = (C1*V1' + C2*V2') (stored in WORK) W := C2 */ i__1 = *k; for (j = 1; j <= i__1; ++j) { dcopy_(m, &c___ref(1, *n - *k + j), &c__1, &work_ref(1, j) , &c__1); /* L220: */ } /* W := W * V2' */ dtrmm_("Right", "Lower", "Transpose", "Unit", m, k, &c_b14, & v_ref(1, *n - *k + 1), ldv, &work[work_offset], ldwork); if (*n > *k) { /* W := W + C1 * V1' */ i__1 = *n - *k; dgemm_("No transpose", "Transpose", m, k, &i__1, &c_b14, & c__[c_offset], ldc, &v[v_offset], ldv, &c_b14, & work[work_offset], ldwork); } /* W := W * T or W * T' */ dtrmm_("Right", "Lower", trans, "Non-unit", m, k, &c_b14, &t[ t_offset], ldt, &work[work_offset], ldwork); /* C := C - W * V */ if (*n > *k) { /* C1 := C1 - W * V1 */ i__1 = *n - *k; dgemm_("No transpose", "No transpose", m, &i__1, k, & c_b25, &work[work_offset], ldwork, &v[v_offset], ldv, &c_b14, &c__[c_offset], ldc); } /* W := W * V2 */ dtrmm_("Right", "Lower", "No transpose", "Unit", m, k, &c_b14, &v_ref(1, *n - *k + 1), ldv, &work[work_offset], ldwork); /* C1 := C1 - W */ i__1 = *k; for (j = 1; j <= i__1; ++j) { i__2 = *m; for (i__ = 1; i__ <= i__2; ++i__) { c___ref(i__, *n - *k + j) = c___ref(i__, *n - *k + j) - work_ref(i__, j); /* L230: */ } /* L240: */ } } } } return 0; /* End of DLARFB */ } /* dlarfb_ */ #undef v_ref #undef c___ref #undef work_ref #ifdef __cplusplus } #endif hypre-2.33.0/src/lapack/dlarfg.c000066400000000000000000000073071477326011500163700ustar00rootroot00000000000000/* Copyright (c) 1992-2008 The University of Tennessee. All rights reserved. * See file COPYING in this directory for details. */ #ifdef __cplusplus extern "C" { #endif #include "f2c.h" #include "hypre_lapack.h" /* Subroutine */ integer dlarfg_(integer *n, doublereal *alpha, doublereal *x, integer *incx, doublereal *tau) { /* -- LAPACK auxiliary routine (version 3.0) -- Univ. of Tennessee, Univ. of California Berkeley, NAG Ltd., Courant Institute, Argonne National Lab, and Rice University September 30, 1994 Purpose ======= DLARFG generates a real elementary reflector H of order n, such that H * ( alpha ) = ( beta ), H' * H = I. ( x ) ( 0 ) where alpha and beta are scalars, and x is an (n-1)-element real vector. H is represented in the form H = I - tau * ( 1 ) * ( 1 v' ) , ( v ) where tau is a real scalar and v is a real (n-1)-element vector. If the elements of x are all zero, then tau = 0 and H is taken to be the unit matrix. Otherwise 1 <= tau <= 2. Arguments ========= N (input) INTEGER The order of the elementary reflector. ALPHA (input/output) DOUBLE PRECISION On entry, the value alpha. On exit, it is overwritten with the value beta. X (input/output) DOUBLE PRECISION array, dimension (1+(N-2)*abs(INCX)) On entry, the vector x. On exit, it is overwritten with the vector v. INCX (input) INTEGER The increment between elements of X. INCX > 0. TAU (output) DOUBLE PRECISION The value tau. ===================================================================== Parameter adjustments */ /* System generated locals */ integer i__1; doublereal d__1; /* Builtin functions */ doublereal d_sign(doublereal *, doublereal *); /* Local variables */ doublereal beta; extern doublereal dnrm2_(integer *, doublereal *, integer *); integer j; extern /* Subroutine */ integer dscal_(integer *, doublereal *, doublereal *, integer *); doublereal xnorm; extern doublereal dlapy2_(doublereal *, doublereal *), dlamch_(const char *); doublereal safmin, rsafmn; integer knt; --x; /* Function Body */ if (*n <= 1) { *tau = 0.; return 0; } i__1 = *n - 1; xnorm = dnrm2_(&i__1, &x[1], incx); if (xnorm == 0.) { /* H = I */ *tau = 0.; } else { /* general case */ d__1 = dlapy2_(alpha, &xnorm); beta = -d_sign(&d__1, alpha); safmin = dlamch_("S") / dlamch_("E"); if (abs(beta) < safmin) { /* XNORM, BETA may be inaccurate; scale X and recompute them */ rsafmn = 1. / safmin; knt = 0; L10: ++knt; i__1 = *n - 1; dscal_(&i__1, &rsafmn, &x[1], incx); beta *= rsafmn; *alpha *= rsafmn; if (abs(beta) < safmin) { goto L10; } /* New BETA is at most 1, at least SAFMIN */ i__1 = *n - 1; xnorm = dnrm2_(&i__1, &x[1], incx); d__1 = dlapy2_(alpha, &xnorm); beta = -d_sign(&d__1, alpha); *tau = (beta - *alpha) / beta; i__1 = *n - 1; d__1 = 1. / (*alpha - beta); dscal_(&i__1, &d__1, &x[1], incx); /* If ALPHA is subnormal, it may lose relative accuracy */ *alpha = beta; i__1 = knt; for (j = 1; j <= i__1; ++j) { *alpha *= safmin; /* L20: */ } } else { *tau = (beta - *alpha) / beta; i__1 = *n - 1; d__1 = 1. / (*alpha - beta); dscal_(&i__1, &d__1, &x[1], incx); *alpha = beta; } } return 0; /* End of DLARFG */ } /* dlarfg_ */ #ifdef __cplusplus } #endif hypre-2.33.0/src/lapack/dlarft.c000066400000000000000000000175201477326011500164030ustar00rootroot00000000000000/* Copyright (c) 1992-2008 The University of Tennessee. All rights reserved. * See file COPYING in this directory for details. */ #ifdef __cplusplus extern "C" { #endif #include "f2c.h" #include "hypre_lapack.h" /* Subroutine */ integer dlarft_(const char *direct,const char *storev, integer *n, integer * k, doublereal *v, integer *ldv, doublereal *tau, doublereal *t, integer *ldt) { /* -- LAPACK auxiliary routine (version 3.0) -- Univ. of Tennessee, Univ. of California Berkeley, NAG Ltd., Courant Institute, Argonne National Lab, and Rice University February 29, 1992 Purpose ======= DLARFT forms the triangular factor T of a real block reflector H of order n, which is defined as a product of k elementary reflectors. If DIRECT = 'F', H = H(1) H(2) . . . H(k) and T is upper triangular; If DIRECT = 'B', H = H(k) . . . H(2) H(1) and T is lower triangular. If STOREV = 'C', the vector which defines the elementary reflector H(i) is stored in the i-th column of the array V, and H = I - V * T * V' If STOREV = 'R', the vector which defines the elementary reflector H(i) is stored in the i-th row of the array V, and H = I - V' * T * V Arguments ========= DIRECT (input) CHARACTER*1 Specifies the order in which the elementary reflectors are multiplied to form the block reflector: = 'F': H = H(1) H(2) . . . H(k) (Forward) = 'B': H = H(k) . . . H(2) H(1) (Backward) STOREV (input) CHARACTER*1 Specifies how the vectors which define the elementary reflectors are stored (see also Further Details): = 'C': columnwise = 'R': rowwise N (input) INTEGER The order of the block reflector H. N >= 0. K (input) INTEGER The order of the triangular factor T (= the number of elementary reflectors). K >= 1. V (input/output) DOUBLE PRECISION array, dimension (LDV,K) if STOREV = 'C' (LDV,N) if STOREV = 'R' The matrix V. See further details. LDV (input) INTEGER The leading dimension of the array V. If STOREV = 'C', LDV >= max(1,N); if STOREV = 'R', LDV >= K. TAU (input) DOUBLE PRECISION array, dimension (K) TAU(i) must contain the scalar factor of the elementary reflector H(i). T (output) DOUBLE PRECISION array, dimension (LDT,K) The k by k triangular factor T of the block reflector. If DIRECT = 'F', T is upper triangular; if DIRECT = 'B', T is lower triangular. The rest of the array is not used. LDT (input) INTEGER The leading dimension of the array T. LDT >= K. Further Details =============== The shape of the matrix V and the storage of the vectors which define the H(i) is best illustrated by the following example with n = 5 and k = 3. The elements equal to 1 are not stored; the corresponding array elements are modified but restored on exit. The rest of the array is not used. DIRECT = 'F' and STOREV = 'C': DIRECT = 'F' and STOREV = 'R': V = ( 1 ) V = ( 1 v1 v1 v1 v1 ) ( v1 1 ) ( 1 v2 v2 v2 ) ( v1 v2 1 ) ( 1 v3 v3 ) ( v1 v2 v3 ) ( v1 v2 v3 ) DIRECT = 'B' and STOREV = 'C': DIRECT = 'B' and STOREV = 'R': V = ( v1 v2 v3 ) V = ( v1 v1 1 ) ( v1 v2 v3 ) ( v2 v2 v2 1 ) ( 1 v2 v3 ) ( v3 v3 v3 v3 1 ) ( 1 v3 ) ( 1 ) ===================================================================== Quick return if possible Parameter adjustments */ /* Table of constant values */ integer c__1 = 1; doublereal c_b8 = 0.; /* System generated locals */ integer t_dim1, t_offset, v_dim1, v_offset, i__1, i__2, i__3; doublereal d__1; /* Local variables */ integer i__, j; extern logical lsame_(const char *,const char *); extern /* Subroutine */ integer dgemv_(const char *, integer *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *), dtrmv_(const char *, const char *,const char *, integer *, doublereal *, integer *, doublereal *, integer *); doublereal vii; #define t_ref(a_1,a_2) t[(a_2)*t_dim1 + a_1] #define v_ref(a_1,a_2) v[(a_2)*v_dim1 + a_1] v_dim1 = *ldv; v_offset = 1 + v_dim1 * 1; v -= v_offset; --tau; t_dim1 = *ldt; t_offset = 1 + t_dim1 * 1; t -= t_offset; /* Function Body */ if (*n == 0) { return 0; } if (lsame_(direct, "F")) { i__1 = *k; for (i__ = 1; i__ <= i__1; ++i__) { if (tau[i__] == 0.) { /* H(i) = I */ i__2 = i__; for (j = 1; j <= i__2; ++j) { t_ref(j, i__) = 0.; /* L10: */ } } else { /* general case */ vii = v_ref(i__, i__); v_ref(i__, i__) = 1.; if (lsame_(storev, "C")) { /* T(1:i-1,i) := - tau(i) * V(i:n,1:i-1)' * V(i:n,i) */ i__2 = *n - i__ + 1; i__3 = i__ - 1; d__1 = -tau[i__]; dgemv_("Transpose", &i__2, &i__3, &d__1, &v_ref(i__, 1), ldv, &v_ref(i__, i__), &c__1, &c_b8, &t_ref(1, i__), &c__1); } else { /* T(1:i-1,i) := - tau(i) * V(1:i-1,i:n) * V(i,i:n)' */ i__2 = i__ - 1; i__3 = *n - i__ + 1; d__1 = -tau[i__]; dgemv_("No transpose", &i__2, &i__3, &d__1, &v_ref(1, i__) , ldv, &v_ref(i__, i__), ldv, &c_b8, &t_ref(1, i__), &c__1); } v_ref(i__, i__) = vii; /* T(1:i-1,i) := T(1:i-1,1:i-1) * T(1:i-1,i) */ i__2 = i__ - 1; dtrmv_("Upper", "No transpose", "Non-unit", &i__2, &t[ t_offset], ldt, &t_ref(1, i__), &c__1); t_ref(i__, i__) = tau[i__]; } /* L20: */ } } else { for (i__ = *k; i__ >= 1; --i__) { if (tau[i__] == 0.) { /* H(i) = I */ i__1 = *k; for (j = i__; j <= i__1; ++j) { t_ref(j, i__) = 0.; /* L30: */ } } else { /* general case */ if (i__ < *k) { if (lsame_(storev, "C")) { vii = v_ref(*n - *k + i__, i__); v_ref(*n - *k + i__, i__) = 1.; /* T(i+1:k,i) := - tau(i) * V(1:n-k+i,i+1:k)' * V(1:n-k+i,i) */ i__1 = *n - *k + i__; i__2 = *k - i__; d__1 = -tau[i__]; dgemv_("Transpose", &i__1, &i__2, &d__1, &v_ref(1, i__ + 1), ldv, &v_ref(1, i__), &c__1, &c_b8, & t_ref(i__ + 1, i__), &c__1); v_ref(*n - *k + i__, i__) = vii; } else { vii = v_ref(i__, *n - *k + i__); v_ref(i__, *n - *k + i__) = 1.; /* T(i+1:k,i) := - tau(i) * V(i+1:k,1:n-k+i) * V(i,1:n-k+i)' */ i__1 = *k - i__; i__2 = *n - *k + i__; d__1 = -tau[i__]; dgemv_("No transpose", &i__1, &i__2, &d__1, &v_ref( i__ + 1, 1), ldv, &v_ref(i__, 1), ldv, &c_b8, &t_ref(i__ + 1, i__), &c__1); v_ref(i__, *n - *k + i__) = vii; } /* T(i+1:k,i) := T(i+1:k,i+1:k) * T(i+1:k,i) */ i__1 = *k - i__; dtrmv_("Lower", "No transpose", "Non-unit", &i__1, &t_ref( i__ + 1, i__ + 1), ldt, &t_ref(i__ + 1, i__), & c__1); } t_ref(i__, i__) = tau[i__]; } /* L40: */ } } return 0; /* End of DLARFT */ } /* dlarft_ */ #undef v_ref #undef t_ref #ifdef __cplusplus } #endif hypre-2.33.0/src/lapack/dlartg.c000066400000000000000000000077451477326011500164140ustar00rootroot00000000000000/* Copyright (c) 1992-2008 The University of Tennessee. All rights reserved. * See file COPYING in this directory for details. */ #ifdef __cplusplus extern "C" { #endif #include "f2c.h" #include "hypre_lapack.h" /* Subroutine */ integer dlartg_(doublereal *f, doublereal *g, doublereal *cs, doublereal *sn, doublereal *r__) { /* -- LAPACK auxiliary routine (version 3.0) -- Univ. of Tennessee, Univ. of California Berkeley, NAG Ltd., Courant Institute, Argonne National Lab, and Rice University September 30, 1994 Purpose ======= DLARTG generate a plane rotation so that [ CS SN ] . [ F ] = [ R ] where CS**2 + SN**2 = 1. [ -SN CS ] [ G ] [ 0 ] This is a slower, more accurate version of the BLAS1 routine DROTG, with the following other differences: F and G are unchanged on return. If G=0, then CS=1 and SN=0. If F=0 and (G .ne. 0), then CS=0 and SN=1 without doing any floating point operations (saves work in DBDSQR when there are zeros on the diagonal). If F exceeds G in magnitude, CS will be positive. Arguments ========= F (input) DOUBLE PRECISION The first component of vector to be rotated. G (input) DOUBLE PRECISION The second component of vector to be rotated. CS (output) DOUBLE PRECISION The cosine of the rotation. SN (output) DOUBLE PRECISION The sine of the rotation. R (output) DOUBLE PRECISION The nonzero component of the rotated vector. ===================================================================== */ /* Initialized data */ logical first = TRUE_; /* System generated locals */ integer i__1; doublereal d__1, d__2; /* Builtin functions */ // doublereal log(doublereal), pow_di(doublereal *, integer *), sqrt(doublereal); doublereal pow_di(doublereal *, integer *); /* Local variables */ integer i__; doublereal scale; integer count; doublereal f1, g1, safmn2, safmx2; extern doublereal dlamch_(const char *); // doublereal safmin, eps; if (first) { first = FALSE_; // safmin = dlamch_("S"); // eps = dlamch_("E"); d__1 = dlamch_("B"); // i__1 = (integer) (log(safmin / eps) / log(dlamch_("B")) / // 2.); i__1 = HYPRE_REAL_MIN_EXP>>1; safmn2 = pow_di(&d__1, &i__1); safmx2 = 1. / safmn2; } if (*g == 0.) { *cs = 1.; *sn = 0.; *r__ = *f; } else if (*f == 0.) { *cs = 0.; *sn = 1.; *r__ = *g; } else { f1 = *f; g1 = *g; /* Computing MAX */ d__1 = abs(f1), d__2 = abs(g1); scale = max(d__1,d__2); if (scale >= safmx2) { count = 0; L10: ++count; f1 *= safmn2; g1 *= safmn2; /* Computing MAX */ d__1 = abs(f1), d__2 = abs(g1); scale = max(d__1,d__2); if (scale >= safmx2) { goto L10; } /* Computing 2nd power */ d__1 = f1; /* Computing 2nd power */ d__2 = g1; *r__ = sqrt(d__1 * d__1 + d__2 * d__2); *cs = f1 / *r__; *sn = g1 / *r__; i__1 = count; for (i__ = 1; i__ <= i__1; ++i__) { *r__ *= safmx2; /* L20: */ } } else if (scale <= safmn2) { count = 0; L30: ++count; f1 *= safmx2; g1 *= safmx2; /* Computing MAX */ d__1 = abs(f1), d__2 = abs(g1); scale = max(d__1,d__2); if (scale <= safmn2) { goto L30; } /* Computing 2nd power */ d__1 = f1; /* Computing 2nd power */ d__2 = g1; *r__ = sqrt(d__1 * d__1 + d__2 * d__2); *cs = f1 / *r__; *sn = g1 / *r__; i__1 = count; for (i__ = 1; i__ <= i__1; ++i__) { *r__ *= safmn2; /* L40: */ } } else { /* Computing 2nd power */ d__1 = f1; /* Computing 2nd power */ d__2 = g1; *r__ = sqrt(d__1 * d__1 + d__2 * d__2); *cs = f1 / *r__; *sn = g1 / *r__; } if (abs(*f) > abs(*g) && *cs < 0.) { *cs = -(*cs); *sn = -(*sn); *r__ = -(*r__); } } return 0; /* End of DLARTG */ } /* dlartg_ */ #ifdef __cplusplus } #endif hypre-2.33.0/src/lapack/dlas2.c000066400000000000000000000067461477326011500161440ustar00rootroot00000000000000/* Copyright (c) 1992-2008 The University of Tennessee. All rights reserved. * See file COPYING in this directory for details. */ #ifdef __cplusplus extern "C" { #endif #include "f2c.h" #include "hypre_lapack.h" /* Subroutine */ integer dlas2_(doublereal *f, doublereal *g, doublereal *h__, doublereal *ssmin, doublereal *ssmax) { /* -- LAPACK auxiliary routine (version 3.0) -- Univ. of Tennessee, Univ. of California Berkeley, NAG Ltd., Courant Institute, Argonne National Lab, and Rice University September 30, 1994 Purpose ======= DLAS2 computes the singular values of the 2-by-2 matrix [ F G ] [ 0 H ]. On return, SSMIN is the smaller singular value and SSMAX is the larger singular value. Arguments ========= F (input) DOUBLE PRECISION The (1,1) element of the 2-by-2 matrix. G (input) DOUBLE PRECISION The (1,2) element of the 2-by-2 matrix. H (input) DOUBLE PRECISION The (2,2) element of the 2-by-2 matrix. SSMIN (output) DOUBLE PRECISION The smaller singular value. SSMAX (output) DOUBLE PRECISION The larger singular value. Further Details =============== Barring over/underflow, all output quantities are correct to within a few units in the last place (ulps), even in the absence of a guard digit in addition/subtraction. In IEEE arithmetic, the code works correctly if one matrix element is infinite. Overflow will not occur unless the largest singular value itself overflows, or is within a few ulps of overflow. (On machines with partial overflow, like the Cray, overflow may occur if the largest singular value is within a factor of 2 of overflow.) Underflow is harmless if underflow is gradual. Otherwise, results may correspond to a matrix modified by perturbations of size near the underflow threshold. ==================================================================== */ /* System generated locals */ doublereal d__1, d__2; /* Local variables */ doublereal fhmn, fhmx, c__, fa, ga, ha, as, at, au; fa = abs(*f); ga = abs(*g); ha = abs(*h__); fhmn = min(fa,ha); fhmx = max(fa,ha); if (fhmn == 0.) { *ssmin = 0.; if (fhmx == 0.) { *ssmax = ga; } else { /* Computing 2nd power */ d__1 = min(fhmx,ga) / max(fhmx,ga); *ssmax = max(fhmx,ga) * sqrt(d__1 * d__1 + 1.); } } else { if (ga < fhmx) { as = fhmn / fhmx + 1.; at = (fhmx - fhmn) / fhmx; /* Computing 2nd power */ d__1 = ga / fhmx; au = d__1 * d__1; c__ = 2. / (sqrt(as * as + au) + sqrt(at * at + au)); *ssmin = fhmn * c__; *ssmax = fhmx / c__; } else { au = fhmx / ga; if (au == 0.) { /* Avoid possible harmful underflow if exponent range asymmetric (true SSMIN may not underflow even if AU underflows) */ *ssmin = fhmn * fhmx / ga; *ssmax = ga; } else { as = fhmn / fhmx + 1.; at = (fhmx - fhmn) / fhmx; /* Computing 2nd power */ d__1 = as * au; /* Computing 2nd power */ d__2 = at * au; c__ = 1. / (sqrt(d__1 * d__1 + 1.) + sqrt(d__2 * d__2 + 1.)); *ssmin = fhmn * c__ * au; *ssmin += *ssmin; *ssmax = ga / (c__ + c__); } } } return 0; /* End of DLAS2 */ } /* dlas2_ */ #ifdef __cplusplus } #endif hypre-2.33.0/src/lapack/dlascl.c000066400000000000000000000170361477326011500163730ustar00rootroot00000000000000/* Copyright (c) 1992-2008 The University of Tennessee. All rights reserved. * See file COPYING in this directory for details. */ #ifdef __cplusplus extern "C" { #endif #include "f2c.h" #include "hypre_lapack.h" /* Subroutine */ integer dlascl_(const char *type__, integer *kl, integer *ku, doublereal *cfrom, doublereal *cto, integer *m, integer *n, doublereal *a, integer *lda, integer *info) { /* -- LAPACK auxiliary routine (version 3.0) -- Univ. of Tennessee, Univ. of California Berkeley, NAG Ltd., Courant Institute, Argonne National Lab, and Rice University February 29, 1992 Purpose ======= DLASCL multiplies the M by N real matrix A by the real scalar CTO/CFROM. This is done without over/underflow as long as the final result CTO*A(I,J)/CFROM does not over/underflow. TYPE specifies that A may be full, upper triangular, lower triangular, upper Hessenberg, or banded. Arguments ========= TYPE (input) CHARACTER*1 TYPE indices the storage type of the input matrix. = 'G': A is a full matrix. = 'L': A is a lower triangular matrix. = 'U': A is an upper triangular matrix. = 'H': A is an upper Hessenberg matrix. = 'B': A is a symmetric band matrix with lower bandwidth KL and upper bandwidth KU and with the only the lower half stored. = 'Q': A is a symmetric band matrix with lower bandwidth KL and upper bandwidth KU and with the only the upper half stored. = 'Z': A is a band matrix with lower bandwidth KL and upper bandwidth KU. KL (input) INTEGER The lower bandwidth of A. Referenced only if TYPE = 'B', 'Q' or 'Z'. KU (input) INTEGER The upper bandwidth of A. Referenced only if TYPE = 'B', 'Q' or 'Z'. CFROM (input) DOUBLE PRECISION CTO (input) DOUBLE PRECISION The matrix A is multiplied by CTO/CFROM. A(I,J) is computed without over/underflow if the final result CTO*A(I,J)/CFROM can be represented without over/underflow. CFROM must be nonzero. M (input) INTEGER The number of rows of the matrix A. M >= 0. N (input) INTEGER The number of columns of the matrix A. N >= 0. A (input/output) DOUBLE PRECISION array, dimension (LDA,M) The matrix to be multiplied by CTO/CFROM. See TYPE for the storage type. LDA (input) INTEGER The leading dimension of the array A. LDA >= max(1,M). INFO (output) INTEGER 0 - successful exit <0 - if INFO = -i, the i-th argument had an illegal value. ===================================================================== Test the input arguments Parameter adjustments */ /* System generated locals */ integer a_dim1, a_offset, i__1, i__2, i__3, i__4, i__5; /* Local variables */ logical done; doublereal ctoc; integer i__, j; extern logical lsame_(const char *,const char *); integer itype, k1, k2, k3, k4; doublereal cfrom1; extern doublereal dlamch_(const char *); doublereal cfromc; extern /* Subroutine */ integer xerbla_(const char *, integer *); doublereal bignum, smlnum, mul, cto1; #define a_ref(a_1,a_2) a[(a_2)*a_dim1 + a_1] a_dim1 = *lda; a_offset = 1 + a_dim1 * 1; a -= a_offset; /* Function Body */ *info = 0; if (lsame_(type__, "G")) { itype = 0; } else if (lsame_(type__, "L")) { itype = 1; } else if (lsame_(type__, "U")) { itype = 2; } else if (lsame_(type__, "H")) { itype = 3; } else if (lsame_(type__, "B")) { itype = 4; } else if (lsame_(type__, "Q")) { itype = 5; } else if (lsame_(type__, "Z")) { itype = 6; } else { itype = -1; } if (itype == -1) { *info = -1; } else if (*cfrom == 0.) { *info = -4; } else if (*m < 0) { *info = -6; } else if ((*n < 0) || ((itype == 4) && (*n != *m)) || ((itype == 5) && (*n != *m))) { *info = -7; } else if ((itype <= 3) && (*lda < max(1,*m))) { *info = -9; } else if (itype >= 4) { /* Computing MAX */ i__1 = *m - 1; if (*kl < 0 || *kl > max(i__1,0)) { *info = -2; } else /* if(complicated condition) */ { /* Computing MAX */ i__1 = *n - 1; if ((*ku < 0) || (*ku > max(i__1,0)) || (itype == 4) || ((itype == 5) && (*kl != *ku))) { *info = -3; } else if (((itype == 4) && (*lda < (*kl + 1))) || ((itype == 5) && (*lda < (*ku + 1))) || ((itype == 6) && (*lda < ((*kl << 1) + *ku + 1)))) { *info = -9; } } } if (*info != 0) { i__1 = -(*info); xerbla_("DLASCL", &i__1); return 0; } /* Quick return if possible */ if (*n == 0 || *m == 0) { return 0; } /* Get machine parameters */ smlnum = dlamch_("S"); bignum = 1. / smlnum; cfromc = *cfrom; ctoc = *cto; L10: cfrom1 = cfromc * smlnum; cto1 = ctoc / bignum; if (abs(cfrom1) > abs(ctoc) && ctoc != 0.) { mul = smlnum; done = FALSE_; cfromc = cfrom1; } else if (abs(cto1) > abs(cfromc)) { mul = bignum; done = FALSE_; ctoc = cto1; } else { mul = ctoc / cfromc; done = TRUE_; } if (itype == 0) { /* Full matrix */ i__1 = *n; for (j = 1; j <= i__1; ++j) { i__2 = *m; for (i__ = 1; i__ <= i__2; ++i__) { a_ref(i__, j) = a_ref(i__, j) * mul; /* L20: */ } /* L30: */ } } else if (itype == 1) { /* Lower triangular matrix */ i__1 = *n; for (j = 1; j <= i__1; ++j) { i__2 = *m; for (i__ = j; i__ <= i__2; ++i__) { a_ref(i__, j) = a_ref(i__, j) * mul; /* L40: */ } /* L50: */ } } else if (itype == 2) { /* Upper triangular matrix */ i__1 = *n; for (j = 1; j <= i__1; ++j) { i__2 = min(j,*m); for (i__ = 1; i__ <= i__2; ++i__) { a_ref(i__, j) = a_ref(i__, j) * mul; /* L60: */ } /* L70: */ } } else if (itype == 3) { /* Upper Hessenberg matrix */ i__1 = *n; for (j = 1; j <= i__1; ++j) { /* Computing MIN */ i__3 = j + 1; i__2 = min(i__3,*m); for (i__ = 1; i__ <= i__2; ++i__) { a_ref(i__, j) = a_ref(i__, j) * mul; /* L80: */ } /* L90: */ } } else if (itype == 4) { /* Lower half of a symmetric band matrix */ k3 = *kl + 1; k4 = *n + 1; i__1 = *n; for (j = 1; j <= i__1; ++j) { /* Computing MIN */ i__3 = k3, i__4 = k4 - j; i__2 = min(i__3,i__4); for (i__ = 1; i__ <= i__2; ++i__) { a_ref(i__, j) = a_ref(i__, j) * mul; /* L100: */ } /* L110: */ } } else if (itype == 5) { /* Upper half of a symmetric band matrix */ k1 = *ku + 2; k3 = *ku + 1; i__1 = *n; for (j = 1; j <= i__1; ++j) { /* Computing MAX */ i__2 = k1 - j; i__3 = k3; for (i__ = max(i__2,1); i__ <= i__3; ++i__) { a_ref(i__, j) = a_ref(i__, j) * mul; /* L120: */ } /* L130: */ } } else if (itype == 6) { /* Band matrix */ k1 = *kl + *ku + 2; k2 = *kl + 1; k3 = (*kl << 1) + *ku + 1; k4 = *kl + *ku + 1 + *m; i__1 = *n; for (j = 1; j <= i__1; ++j) { /* Computing MAX */ i__3 = k1 - j; /* Computing MIN */ i__4 = k3, i__5 = k4 - j; i__2 = min(i__4,i__5); for (i__ = max(i__3,k2); i__ <= i__2; ++i__) { a_ref(i__, j) = a_ref(i__, j) * mul; /* L140: */ } /* L150: */ } } if (! done) { goto L10; } return 0; /* End of DLASCL */ } /* dlascl_ */ #undef a_ref #ifdef __cplusplus } #endif hypre-2.33.0/src/lapack/dlaset.c000066400000000000000000000070371477326011500164050ustar00rootroot00000000000000/* Copyright (c) 1992-2008 The University of Tennessee. All rights reserved. * See file COPYING in this directory for details. */ #ifdef __cplusplus extern "C" { #endif #include "f2c.h" #include "hypre_lapack.h" /* Subroutine */ integer dlaset_(const char *uplo, integer *m, integer *n, doublereal * alpha, doublereal *beta, doublereal *a, integer *lda) { /* -- LAPACK auxiliary routine (version 3.0) -- Univ. of Tennessee, Univ. of California Berkeley, NAG Ltd., Courant Institute, Argonne National Lab, and Rice University October 31, 1992 Purpose ======= DLASET initializes an m-by-n matrix A to BETA on the diagonal and ALPHA on the offdiagonals. Arguments ========= UPLO (input) CHARACTER*1 Specifies the part of the matrix A to be set. = 'U': Upper triangular part is set; the strictly lower triangular part of A is not changed. = 'L': Lower triangular part is set; the strictly upper triangular part of A is not changed. Otherwise: All of the matrix A is set. M (input) INTEGER The number of rows of the matrix A. M >= 0. N (input) INTEGER The number of columns of the matrix A. N >= 0. ALPHA (input) DOUBLE PRECISION The constant to which the offdiagonal elements are to be set. BETA (input) DOUBLE PRECISION The constant to which the diagonal elements are to be set. A (input/output) DOUBLE PRECISION array, dimension (LDA,N) On exit, the leading m-by-n submatrix of A is set as follows: if UPLO = 'U', A(i,j) = ALPHA, 1<=i<=j-1, 1<=j<=n, if UPLO = 'L', A(i,j) = ALPHA, j+1<=i<=m, 1<=j<=n, otherwise, A(i,j) = ALPHA, 1<=i<=m, 1<=j<=n, i.ne.j, and, for all UPLO, A(i,i) = BETA, 1<=i<=min(m,n). LDA (input) INTEGER The leading dimension of the array A. LDA >= max(1,M). ===================================================================== Parameter adjustments */ /* System generated locals */ integer a_dim1, a_offset, i__1, i__2, i__3; /* Local variables */ integer i__, j; extern logical lsame_(const char *,const char *); #define a_ref(a_1,a_2) a[(a_2)*a_dim1 + a_1] a_dim1 = *lda; a_offset = 1 + a_dim1 * 1; a -= a_offset; /* Function Body */ if (lsame_(uplo, "U")) { /* Set the strictly upper triangular or trapezoidal part of the array to ALPHA. */ i__1 = *n; for (j = 2; j <= i__1; ++j) { /* Computing MIN */ i__3 = j - 1; i__2 = min(i__3,*m); for (i__ = 1; i__ <= i__2; ++i__) { a_ref(i__, j) = *alpha; /* L10: */ } /* L20: */ } } else if (lsame_(uplo, "L")) { /* Set the strictly lower triangular or trapezoidal part of the array to ALPHA. */ i__1 = min(*m,*n); for (j = 1; j <= i__1; ++j) { i__2 = *m; for (i__ = j + 1; i__ <= i__2; ++i__) { a_ref(i__, j) = *alpha; /* L30: */ } /* L40: */ } } else { /* Set the leading m-by-n submatrix to ALPHA. */ i__1 = *n; for (j = 1; j <= i__1; ++j) { i__2 = *m; for (i__ = 1; i__ <= i__2; ++i__) { a_ref(i__, j) = *alpha; /* L50: */ } /* L60: */ } } /* Set the first min(M,N) diagonal elements to BETA. */ i__1 = min(*m,*n); for (i__ = 1; i__ <= i__1; ++i__) { a_ref(i__, i__) = *beta; /* L70: */ } return 0; /* End of DLASET */ } /* dlaset_ */ #undef a_ref #ifdef __cplusplus } #endif hypre-2.33.0/src/lapack/dlasq1.c000066400000000000000000000127511477326011500163150ustar00rootroot00000000000000/* Copyright (c) 1992-2008 The University of Tennessee. All rights reserved. * See file COPYING in this directory for details. */ #ifdef __cplusplus extern "C" { #endif #include "f2c.h" #include "hypre_lapack.h" /* -- translated by f2c (version 19990503). You must link the resulting object file with the libraries: -lf2c -lm (in that order) */ /* Subroutine */ integer dlasq1_(integer *n, doublereal *d__, doublereal *e, doublereal *work, integer *info) { /* System generated locals */ integer i__1, i__2; doublereal d__1, d__2, d__3; /* Local variables */ extern /* Subroutine */ integer dlas2_(doublereal *, doublereal *, doublereal *, doublereal *, doublereal *); integer i__; doublereal scale; integer iinfo; doublereal sigmn; extern /* Subroutine */ integer dcopy_(integer *, doublereal *, integer *, doublereal *, integer *); doublereal sigmx; extern /* Subroutine */ integer dlasq2_(integer *, doublereal *, integer *); extern doublereal dlamch_(const char *); extern /* Subroutine */ integer dlascl_(const char *, integer *, integer *, doublereal *, doublereal *, integer *, integer *, doublereal *, integer *, integer *); doublereal safmin; extern /* Subroutine */ integer xerbla_(const char *, integer *), dlasrt_( const char *, integer *, doublereal *, integer *); doublereal eps; /* Table of constant values */ integer c__1 = 1; integer c__2 = 2; integer c__0 = 0; /* -- LAPACK routine (version 3.0) -- Univ. of Tennessee, Univ. of California Berkeley, NAG Ltd., Courant Institute, Argonne National Lab, and Rice University October 31, 1999 Purpose ======= DLASQ1 computes the singular values of a real N-by-N bidiagonal matrix with diagonal D and off-diagonal E. The singular values are computed to high relative accuracy, in the absence of denormalization, underflow and overflow. The algorithm was first presented in "Accurate singular values and differential qd algorithms" by K. V. Fernando and B. N. Parlett, Numer. Math., Vol-67, No. 2, pp. 191-230, 1994, and the present implementation is described in "An implementation of the dqds Algorithm (Positive Case)", LAPACK Working Note. Arguments ========= N (input) INTEGER The number of rows and columns in the matrix. N >= 0. D (input/output) DOUBLE PRECISION array, dimension (N) On entry, D contains the diagonal elements of the bidiagonal matrix whose SVD is desired. On normal exit, D contains the singular values in decreasing order. E (input/output) DOUBLE PRECISION array, dimension (N) On entry, elements E(1:N-1) contain the off-diagonal elements of the bidiagonal matrix whose SVD is desired. On exit, E is overwritten. WORK (workspace) DOUBLE PRECISION array, dimension (4*N) INFO (output) INTEGER = 0: successful exit < 0: if INFO = -i, the i-th argument had an illegal value > 0: the algorithm failed = 1, a split was marked by a positive value in E = 2, current block of Z not diagonalized after 30*N iterations (in inner while loop) = 3, termination criterion of outer while loop not met (program created more than N unreduced blocks) ===================================================================== Parameter adjustments */ --work; --e; --d__; /* Function Body */ *info = 0; if (*n < 0) { *info = -2; i__1 = -(*info); xerbla_("DLASQ1", &i__1); return 0; } else if (*n == 0) { return 0; } else if (*n == 1) { d__[1] = abs(d__[1]); return 0; } else if (*n == 2) { dlas2_(&d__[1], &e[1], &d__[2], &sigmn, &sigmx); d__[1] = sigmx; d__[2] = sigmn; return 0; } /* Estimate the largest singular value. */ sigmx = 0.; i__1 = *n - 1; for (i__ = 1; i__ <= i__1; ++i__) { d__[i__] = (d__1 = d__[i__], abs(d__1)); /* Computing MAX */ d__2 = sigmx, d__3 = (d__1 = e[i__], abs(d__1)); sigmx = max(d__2,d__3); /* L10: */ } d__[*n] = (d__1 = d__[*n], abs(d__1)); /* Early return if SIGMX is zero (matrix is already diagonal). */ if (sigmx == 0.) { dlasrt_("D", n, &d__[1], &iinfo); return 0; } i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { /* Computing MAX */ d__1 = sigmx, d__2 = d__[i__]; sigmx = max(d__1,d__2); /* L20: */ } /* Copy D and E into WORK (in the Z format) and scale (squaring the input data makes scaling by a power of the radix pointless). */ eps = dlamch_("Precision"); safmin = dlamch_("Safe minimum"); scale = sqrt(eps / safmin); dcopy_(n, &d__[1], &c__1, &work[1], &c__2); i__1 = *n - 1; dcopy_(&i__1, &e[1], &c__1, &work[2], &c__2); i__1 = (*n << 1) - 1; i__2 = (*n << 1) - 1; dlascl_("G", &c__0, &c__0, &sigmx, &scale, &i__1, &c__1, &work[1], &i__2, &iinfo); /* Compute the q's and e's. */ i__1 = (*n << 1) - 1; for (i__ = 1; i__ <= i__1; ++i__) { /* Computing 2nd power */ d__1 = work[i__]; work[i__] = d__1 * d__1; /* L30: */ } work[*n * 2] = 0.; dlasq2_(n, &work[1], info); if (*info == 0) { i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { d__[i__] = sqrt(work[i__]); /* L40: */ } dlascl_("G", &c__0, &c__0, &scale, &sigmx, n, &c__1, &d__[1], n, & iinfo); } return 0; /* End of DLASQ1 */ } /* dlasq1_ */ #ifdef __cplusplus } #endif hypre-2.33.0/src/lapack/dlasq2.c000066400000000000000000000315451477326011500163200ustar00rootroot00000000000000/* Copyright (c) 1992-2008 The University of Tennessee. All rights reserved. * See file COPYING in this directory for details. */ #ifdef __cplusplus extern "C" { #endif #include "f2c.h" #include "hypre_lapack.h" /* -- translated by f2c (version 19990503). You must link the resulting object file with the libraries: -lf2c -lm (in that order) */ /* Subroutine */ integer dlasq2_(integer *n, doublereal *z__, integer *info) { /* System generated locals */ integer i__1, i__2, i__3; doublereal d__1, d__2; /* Local variables */ logical ieee; integer nbig; doublereal dmin__, emin, emax; integer ndiv, iter; doublereal qmin, temp, qmax, zmax; integer splt; doublereal d__, e; integer k; doublereal s, t; integer nfail; doublereal desig, trace, sigma; integer iinfo, i0, i4, n0; extern /* Subroutine */ integer dlasq3_(integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, doublereal *, doublereal *, integer *, integer *, integer *, logical *); extern doublereal dlamch_(const char *); integer pp, iwhila, iwhilb; doublereal oldemn, safmin; extern /* Subroutine */ integer xerbla_(const char *, integer *); extern integer ilaenv_(integer *,const char *,const char *, integer *, integer *, integer *, integer *, ftnlen, ftnlen); extern /* Subroutine */ integer dlasrt_(const char *, integer *, doublereal *, integer *); doublereal eps, tol; integer ipn4; doublereal tol2; /* Table of constant values */ integer c__1 = 1; integer c__2 = 2; integer c__10 = 10; integer c__3 = 3; integer c__4 = 4; integer c__11 = 11; /* -- LAPACK routine (version 3.0) -- Univ. of Tennessee, Univ. of California Berkeley, NAG Ltd., Courant Institute, Argonne National Lab, and Rice University October 31, 1999 Purpose ======= DLASQ2 computes all the eigenvalues of the symmetric positive definite tridiagonal matrix associated with the qd array Z to high relative accuracy are computed to high relative accuracy, in the absence of denormalization, underflow and overflow. To see the relation of Z to the tridiagonal matrix, let L be a unit lower bidiagonal matrix with subdiagonals Z(2,4,6,,..) and let U be an upper bidiagonal matrix with 1's above and diagonal Z(1,3,5,,..). The tridiagonal is L*U or, if you prefer, the symmetric tridiagonal to which it is similar. Note : DLASQ2 defines a logical variable, IEEE, which is true on machines which follow ieee-754 floating-point standard in their handling of infinities and NaNs, and false otherwise. This variable is passed to DLASQ3. Arguments ========= N (input) INTEGER The number of rows and columns in the matrix. N >= 0. Z (workspace) DOUBLE PRECISION array, dimension ( 4*N ) On entry Z holds the qd array. On exit, entries 1 to N hold the eigenvalues in decreasing order, Z( 2*N+1 ) holds the trace, and Z( 2*N+2 ) holds the sum of the eigenvalues. If N > 2, then Z( 2*N+3 ) holds the iteration count, Z( 2*N+4 ) holds NDIVS/NIN^2, and Z( 2*N+5 ) holds the percentage of shifts that failed. INFO (output) INTEGER = 0: successful exit < 0: if the i-th argument is a scalar and had an illegal value, then INFO = -i, if the i-th argument is an array and the j-entry had an illegal value, then INFO = -(i*100+j) > 0: the algorithm failed = 1, a split was marked by a positive value in E = 2, current block of Z not diagonalized after 30*N iterations (in inner while loop) = 3, termination criterion of outer while loop not met (program created more than N unreduced blocks) Further Details =============== Local Variables: I0:N0 defines a current unreduced segment of Z. The shifts are accumulated in SIGMA. Iteration count is in ITER. Ping-pong is controlled by PP (alternates between 0 and 1). ===================================================================== Test the input arguments. (in case DLASQ2 is not called by DLASQ1) Parameter adjustments */ --z__; /* Function Body */ *info = 0; eps = dlamch_("Precision"); safmin = dlamch_("Safe minimum"); tol = eps * 100.; /* Computing 2nd power */ d__1 = tol; tol2 = d__1 * d__1; if (*n < 0) { *info = -1; xerbla_("DLASQ2", &c__1); return 0; } else if (*n == 0) { return 0; } else if (*n == 1) { /* 1-by-1 case. */ if (z__[1] < 0.) { *info = -201; xerbla_("DLASQ2", &c__2); } return 0; } else if (*n == 2) { /* 2-by-2 case. */ if (z__[2] < 0. || z__[3] < 0.) { *info = -2; xerbla_("DLASQ2", &c__2); return 0; } else if (z__[3] > z__[1]) { d__ = z__[3]; z__[3] = z__[1]; z__[1] = d__; } z__[5] = z__[1] + z__[2] + z__[3]; if (z__[2] > z__[3] * tol2) { t = (z__[1] - z__[3] + z__[2]) * .5; s = z__[3] * (z__[2] / t); if (s <= t) { s = z__[3] * (z__[2] / (t * (sqrt(s / t + 1.) + 1.))); } else { s = z__[3] * (z__[2] / (t + sqrt(t) * sqrt(t + s))); } t = z__[1] + (s + z__[2]); z__[3] *= z__[1] / t; z__[1] = t; } z__[2] = z__[3]; z__[6] = z__[2] + z__[1]; return 0; } /* Check for negative data and compute sums of q's and e's. */ z__[*n * 2] = 0.; emin = z__[2]; qmax = 0.; zmax = 0.; d__ = 0.; e = 0.; i__1 = (*n - 1) << 1; for (k = 1; k <= i__1; k += 2) { if (z__[k] < 0.) { *info = -(k + 200); xerbla_("DLASQ2", &c__2); return 0; } else if (z__[k + 1] < 0.) { *info = -(k + 201); xerbla_("DLASQ2", &c__2); return 0; } d__ += z__[k]; e += z__[k + 1]; /* Computing MAX */ d__1 = qmax, d__2 = z__[k]; qmax = max(d__1,d__2); /* Computing MIN */ d__1 = emin, d__2 = z__[k + 1]; emin = min(d__1,d__2); /* Computing MAX */ d__1 = max(qmax,zmax), d__2 = z__[k + 1]; zmax = max(d__1,d__2); /* L10: */ } if (z__[(*n << 1) - 1] < 0.) { *info = -((*n << 1) + 199); xerbla_("DLASQ2", &c__2); return 0; } d__ += z__[(*n << 1) - 1]; /* Computing MAX */ d__1 = qmax, d__2 = z__[(*n << 1) - 1]; qmax = max(d__1,d__2); zmax = max(qmax,zmax); /* Check for diagonality. */ if (e == 0.) { i__1 = *n; for (k = 2; k <= i__1; ++k) { z__[k] = z__[(k << 1) - 1]; /* L20: */ } dlasrt_("D", n, &z__[1], &iinfo); z__[(*n << 1) - 1] = d__; return 0; } trace = d__ + e; /* Check for zero data. */ if (trace == 0.) { z__[(*n << 1) - 1] = 0.; return 0; } /* Check whether the machine is IEEE conformable. */ ieee = ilaenv_(&c__10, "DLASQ2", "N", &c__1, &c__2, &c__3, &c__4, (ftnlen) 6, (ftnlen)1) == 1 && ilaenv_(&c__11, "DLASQ2", "N", &c__1, &c__2, &c__3, &c__4, (ftnlen)6, (ftnlen)1) == 1; /* Rearrange data for locality: Z=(q1,qq1,e1,ee1,q2,qq2,e2,ee2,...). */ for (k = *n << 1; k >= 2; k += -2) { z__[k * 2] = 0.; z__[(k << 1) - 1] = z__[k]; z__[(k << 1) - 2] = 0.; z__[(k << 1) - 3] = z__[k - 1]; /* L30: */ } i0 = 1; n0 = *n; /* Reverse the qd-array, if warranted. */ if (z__[(i0 << 2) - 3] * 1.5 < z__[(n0 << 2) - 3]) { ipn4 = (i0 + n0) << 2; i__1 = (i0 + n0 - 1) << 1; for (i4 = i0 << 2; i4 <= i__1; i4 += 4) { temp = z__[i4 - 3]; z__[i4 - 3] = z__[ipn4 - i4 - 3]; z__[ipn4 - i4 - 3] = temp; temp = z__[i4 - 1]; z__[i4 - 1] = z__[ipn4 - i4 - 5]; z__[ipn4 - i4 - 5] = temp; /* L40: */ } } /* Initial split checking via dqd and Li's test. */ pp = 0; for (k = 1; k <= 2; ++k) { d__ = z__[(n0 << 2) + pp - 3]; i__1 = (i0 << 2) + pp; for (i4 = ((n0 - 1) << 2) + pp; i4 >= i__1; i4 += -4) { if (z__[i4 - 1] <= tol2 * d__) { z__[i4 - 1] = 0.; d__ = z__[i4 - 3]; } else { d__ = z__[i4 - 3] * (d__ / (d__ + z__[i4 - 1])); } /* L50: */ } /* dqd maps Z to ZZ plus Li's test. */ emin = z__[(i0 << 2) + pp + 1]; d__ = z__[(i0 << 2) + pp - 3]; i__1 = ((n0 - 1) << 2) + pp; for (i4 = (i0 << 2) + pp; i4 <= i__1; i4 += 4) { z__[i4 - (pp << 1) - 2] = d__ + z__[i4 - 1]; if (z__[i4 - 1] <= tol2 * d__) { z__[i4 - 1] = 0.; z__[i4 - (pp << 1) - 2] = d__; z__[i4 - (pp << 1)] = 0.; d__ = z__[i4 + 1]; } else if (safmin * z__[i4 + 1] < z__[i4 - (pp << 1) - 2] && safmin * z__[i4 - (pp << 1) - 2] < z__[i4 + 1]) { temp = z__[i4 + 1] / z__[i4 - (pp << 1) - 2]; z__[i4 - (pp << 1)] = z__[i4 - 1] * temp; d__ *= temp; } else { z__[i4 - (pp << 1)] = z__[i4 + 1] * (z__[i4 - 1] / z__[i4 - ( pp << 1) - 2]); d__ = z__[i4 + 1] * (d__ / z__[i4 - (pp << 1) - 2]); } /* Computing MIN */ d__1 = emin, d__2 = z__[i4 - (pp << 1)]; emin = min(d__1,d__2); /* L60: */ } z__[(n0 << 2) - pp - 2] = d__; /* Now find qmax. */ qmax = z__[(i0 << 2) - pp - 2]; i__1 = (n0 << 2) - pp - 2; for (i4 = (i0 << 2) - pp + 2; i4 <= i__1; i4 += 4) { /* Computing MAX */ d__1 = qmax, d__2 = z__[i4]; qmax = max(d__1,d__2); /* L70: */ } /* Prepare for the next iteration on K. */ pp = 1 - pp; /* L80: */ } iter = 2; nfail = 0; ndiv = (n0 - i0) << 1; i__1 = *n + 1; for (iwhila = 1; iwhila <= i__1; ++iwhila) { if (n0 < 1) { goto L150; } /* While array unfinished do E(N0) holds the value of SIGMA when submatrix in I0:N0 splits from the rest of the array, but is negated. */ desig = 0.; if (n0 == *n) { sigma = 0.; } else { sigma = -z__[(n0 << 2) - 1]; } if (sigma < 0.) { *info = 1; return 0; } /* Find last unreduced submatrix's top index I0, find QMAX and EMIN. Find Gershgorin-type bound if Q's much greater than E's. */ emax = 0.; if (n0 > i0) { emin = (d__1 = z__[(n0 << 2) - 5], abs(d__1)); } else { emin = 0.; } qmin = z__[(n0 << 2) - 3]; qmax = qmin; for (i4 = n0 << 2; i4 >= 8; i4 += -4) { if (z__[i4 - 5] <= 0.) { goto L100; } if (qmin >= emax * 4.) { /* Computing MIN */ d__1 = qmin, d__2 = z__[i4 - 3]; qmin = min(d__1,d__2); /* Computing MAX */ d__1 = emax, d__2 = z__[i4 - 5]; emax = max(d__1,d__2); } /* Computing MAX */ d__1 = qmax, d__2 = z__[i4 - 7] + z__[i4 - 5]; qmax = max(d__1,d__2); /* Computing MIN */ d__1 = emin, d__2 = z__[i4 - 5]; emin = min(d__1,d__2); /* L90: */ } i4 = 4; L100: i0 = i4 / 4; /* Store EMIN for passing to DLASQ3. */ z__[(n0 << 2) - 1] = emin; /* Put -(initial shift) into DMIN. Computing MAX */ d__1 = 0., d__2 = qmin - sqrt(qmin) * 2. * sqrt(emax); dmin__ = -max(d__1,d__2); /* Now I0:N0 is unreduced. PP = 0 for ping, PP = 1 for pong. */ pp = 0; nbig = (n0 - i0 + 1) * 30; i__2 = nbig; for (iwhilb = 1; iwhilb <= i__2; ++iwhilb) { if (i0 > n0) { goto L130; } /* While submatrix unfinished take a good dqds step. */ dlasq3_(&i0, &n0, &z__[1], &pp, &dmin__, &sigma, &desig, &qmax, & nfail, &iter, &ndiv, &ieee); pp = 1 - pp; /* When EMIN is very small check for splits. */ if (pp == 0 && n0 - i0 >= 3) { if (z__[n0 * 4] <= tol2 * qmax || z__[(n0 << 2) - 1] <= tol2 * sigma) { splt = i0 - 1; qmax = z__[(i0 << 2) - 3]; emin = z__[(i0 << 2) - 1]; oldemn = z__[i0 * 4]; i__3 = (n0 - 3) << 2; for (i4 = i0 << 2; i4 <= i__3; i4 += 4) { if (z__[i4] <= tol2 * z__[i4 - 3] || z__[i4 - 1] <= tol2 * sigma) { z__[i4 - 1] = -sigma; splt = i4 / 4; qmax = 0.; emin = z__[i4 + 3]; oldemn = z__[i4 + 4]; } else { /* Computing MAX */ d__1 = qmax, d__2 = z__[i4 + 1]; qmax = max(d__1,d__2); /* Computing MIN */ d__1 = emin, d__2 = z__[i4 - 1]; emin = min(d__1,d__2); /* Computing MIN */ d__1 = oldemn, d__2 = z__[i4]; oldemn = min(d__1,d__2); } /* L110: */ } z__[(n0 << 2) - 1] = emin; z__[n0 * 4] = oldemn; i0 = splt + 1; } } /* L120: */ } *info = 2; return 0; /* end IWHILB */ L130: /* L140: */ ; } *info = 3; return 0; /* end IWHILA */ L150: /* Move q's to the front. */ i__1 = *n; for (k = 2; k <= i__1; ++k) { z__[k] = z__[(k << 2) - 3]; /* L160: */ } /* Sort and compute sum of eigenvalues. */ dlasrt_("D", n, &z__[1], &iinfo); e = 0.; for (k = *n; k >= 1; --k) { e += z__[k]; /* L170: */ } /* Store trace, sum(eigenvalues) and information on performance. */ z__[(*n << 1) + 1] = trace; z__[(*n << 1) + 2] = e; z__[(*n << 1) + 3] = (doublereal) iter; /* Computing 2nd power */ i__1 = *n; z__[(*n << 1) + 4] = (doublereal) ndiv / (doublereal) (i__1 * i__1); z__[(*n << 1) + 5] = nfail * 100. / (doublereal) iter; return 0; /* End of DLASQ2 */ } /* dlasq2_ */ #ifdef __cplusplus } #endif hypre-2.33.0/src/lapack/dlasq3.c000066400000000000000000000172741477326011500163240ustar00rootroot00000000000000/* Copyright (c) 1992-2008 The University of Tennessee. All rights reserved. * See file COPYING in this directory for details. */ #ifdef __cplusplus extern "C" { #endif #include "f2c.h" #include "hypre_lapack.h" /* Subroutine */ integer dlasq3_(integer *i0, integer *n0, doublereal *z__, integer *pp, doublereal *dmin__, doublereal *sigma, doublereal *desig, doublereal *qmax, integer *nfail, integer *iter, integer *ndiv, logical *ieee) { /* -- LAPACK auxiliary routine (version 3.0) -- Univ. of Tennessee, Univ. of California Berkeley, NAG Ltd., Courant Institute, Argonne National Lab, and Rice University May 17, 2000 Purpose ======= DLASQ3 checks for deflation, computes a shift (TAU) and calls dqds. In case of failure it changes shifts, and tries again until output is positive. Arguments ========= I0 (input) INTEGER First index. N0 (input) INTEGER Last index. Z (input) DOUBLE PRECISION array, dimension ( 4*N ) Z holds the qd array. PP (input) INTEGER PP=0 for ping, PP=1 for pong. DMIN (output) DOUBLE PRECISION Minimum value of d. SIGMA (output) DOUBLE PRECISION Sum of shifts used in current segment. DESIG (input/output) DOUBLE PRECISION Lower order part of SIGMA QMAX (input) DOUBLE PRECISION Maximum value of q. NFAIL (output) INTEGER Number of times shift was too big. ITER (output) INTEGER Number of iterations. NDIV (output) INTEGER Number of divisions. TTYPE (output) INTEGER Shift type. IEEE (input) LOGICAL Flag for IEEE or non IEEE arithmetic (passed to DLASQ5). ===================================================================== Parameter adjustments */ /* Initialized data */ integer ttype = 0; doublereal dmin1 = 0.; doublereal dmin2 = 0.; doublereal dn = 0.; doublereal dn1 = 0.; doublereal dn2 = 0.; doublereal tau = 0.; /* System generated locals */ integer i__1; doublereal d__1, d__2; /* Local variables */ doublereal temp, s, t; integer j4; extern /* Subroutine */ integer dlasq4_(integer *, integer *, doublereal *, integer *, integer *, doublereal *, doublereal *, doublereal *, doublereal *, doublereal *, doublereal *, doublereal *, integer *) , dlasq5_(integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, doublereal *, doublereal *, doublereal *, doublereal *, doublereal *, logical *), dlasq6_( integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, doublereal *, doublereal *, doublereal *, doublereal *); extern doublereal dlamch_(const char *); integer nn; doublereal safmin, eps, tol; integer n0in, ipn4; doublereal tol2; --z__; /* Function Body */ n0in = *n0; eps = dlamch_("Precision"); safmin = dlamch_("Safe minimum"); tol = eps * 100.; /* Computing 2nd power */ d__1 = tol; tol2 = d__1 * d__1; /* Check for deflation. */ L10: if (*n0 < *i0) { return 0; } if (*n0 == *i0) { goto L20; } nn = (*n0 << 2) + *pp; if (*n0 == *i0 + 1) { goto L40; } /* Check whether E(N0-1) is negligible, 1 eigenvalue. */ if (z__[nn - 5] > tol2 * (*sigma + z__[nn - 3]) && z__[nn - (*pp << 1) - 4] > tol2 * z__[nn - 7]) { goto L30; } L20: z__[(*n0 << 2) - 3] = z__[(*n0 << 2) + *pp - 3] + *sigma; --(*n0); goto L10; /* Check whether E(N0-2) is negligible, 2 eigenvalues. */ L30: if (z__[nn - 9] > tol2 * *sigma && z__[nn - (*pp << 1) - 8] > tol2 * z__[ nn - 11]) { goto L50; } L40: if (z__[nn - 3] > z__[nn - 7]) { s = z__[nn - 3]; z__[nn - 3] = z__[nn - 7]; z__[nn - 7] = s; } if (z__[nn - 5] > z__[nn - 3] * tol2) { t = (z__[nn - 7] - z__[nn - 3] + z__[nn - 5]) * .5; s = z__[nn - 3] * (z__[nn - 5] / t); if (s <= t) { s = z__[nn - 3] * (z__[nn - 5] / (t * (sqrt(s / t + 1.) + 1.))); } else { s = z__[nn - 3] * (z__[nn - 5] / (t + sqrt(t) * sqrt(t + s))); } t = z__[nn - 7] + (s + z__[nn - 5]); z__[nn - 3] *= z__[nn - 7] / t; z__[nn - 7] = t; } z__[(*n0 << 2) - 7] = z__[nn - 7] + *sigma; z__[(*n0 << 2) - 3] = z__[nn - 3] + *sigma; *n0 += -2; goto L10; L50: /* Reverse the qd-array, if warranted. */ if (*dmin__ <= 0. || *n0 < n0in) { if (z__[(*i0 << 2) + *pp - 3] * 1.5 < z__[(*n0 << 2) + *pp - 3]) { ipn4 = (*i0 + *n0) << 2; i__1 = (*i0 + *n0 - 1) << 1; for (j4 = *i0 << 2; j4 <= i__1; j4 += 4) { temp = z__[j4 - 3]; z__[j4 - 3] = z__[ipn4 - j4 - 3]; z__[ipn4 - j4 - 3] = temp; temp = z__[j4 - 2]; z__[j4 - 2] = z__[ipn4 - j4 - 2]; z__[ipn4 - j4 - 2] = temp; temp = z__[j4 - 1]; z__[j4 - 1] = z__[ipn4 - j4 - 5]; z__[ipn4 - j4 - 5] = temp; temp = z__[j4]; z__[j4] = z__[ipn4 - j4 - 4]; z__[ipn4 - j4 - 4] = temp; /* L60: */ } if (*n0 - *i0 <= 4) { z__[(*n0 << 2) + *pp - 1] = z__[(*i0 << 2) + *pp - 1]; z__[(*n0 << 2) - *pp] = z__[(*i0 << 2) - *pp]; } /* Computing MIN */ d__1 = dmin2, d__2 = z__[(*n0 << 2) + *pp - 1]; dmin2 = min(d__1,d__2); /* Computing MIN */ d__1 = z__[(*n0 << 2) + *pp - 1], d__2 = z__[(*i0 << 2) + *pp - 1] , d__1 = min(d__1,d__2), d__2 = z__[(*i0 << 2) + *pp + 3]; z__[(*n0 << 2) + *pp - 1] = min(d__1,d__2); /* Computing MIN */ d__1 = z__[(*n0 << 2) - *pp], d__2 = z__[(*i0 << 2) - *pp], d__1 = min(d__1,d__2), d__2 = z__[(*i0 << 2) - *pp + 4]; z__[(*n0 << 2) - *pp] = min(d__1,d__2); /* Computing MAX */ d__1 = *qmax, d__2 = z__[(*i0 << 2) + *pp - 3], d__1 = max(d__1, d__2), d__2 = z__[(*i0 << 2) + *pp + 1]; *qmax = max(d__1,d__2); *dmin__ = 0.; } } /* L70: Computing MIN */ d__1 = z__[(*n0 << 2) + *pp - 1], d__2 = z__[(*n0 << 2) + *pp - 9], d__1 = min(d__1,d__2), d__2 = dmin2 + z__[(*n0 << 2) - *pp]; if (*dmin__ < 0. || safmin * *qmax < min(d__1,d__2)) { /* Choose a shift. */ dlasq4_(i0, n0, &z__[1], pp, &n0in, dmin__, &dmin1, &dmin2, &dn, &dn1, &dn2, &tau, &ttype); /* Call dqds until DMIN > 0. */ L80: dlasq5_(i0, n0, &z__[1], pp, &tau, dmin__, &dmin1, &dmin2, &dn, &dn1, &dn2, ieee); *ndiv += *n0 - *i0 + 2; ++(*iter); /* Check status. */ if (*dmin__ >= 0. && dmin1 > 0.) { /* Success. */ goto L100; } else if (*dmin__ < 0. && dmin1 > 0. && z__[((*n0 - 1) << 2) - *pp] < tol * (*sigma + dn1) && abs(dn) < tol * *sigma) { /* Convergence hidden by negative DN. */ z__[((*n0 - 1) << 2) - *pp + 2] = 0.; *dmin__ = 0.; goto L100; } else if (*dmin__ < 0.) { /* TAU too big. Select new TAU and try again. */ ++(*nfail); if (ttype < -22) { /* Failed twice. Play it safe. */ tau = 0.; } else if (dmin1 > 0.) { /* Late failure. Gives excellent shift. */ tau = (tau + *dmin__) * (1. - eps * 2.); ttype += -11; } else { /* Early failure. Divide by 4. */ tau *= .25; ttype += -12; } goto L80; } else if (*dmin__ != *dmin__) { /* NaN. */ tau = 0.; goto L80; } else { /* Possible underflow. Play it safe. */ goto L90; } } /* Risk of underflow. */ L90: dlasq6_(i0, n0, &z__[1], pp, dmin__, &dmin1, &dmin2, &dn, &dn1, &dn2); *ndiv += *n0 - *i0 + 2; ++(*iter); tau = 0.; L100: if (tau < *sigma) { *desig += tau; t = *sigma + *desig; *desig -= t - *sigma; } else { t = *sigma + tau; *desig = *sigma - (t - tau) + *desig; } *sigma = t; return 0; /* End of DLASQ3 */ } /* dlasq3_ */ #ifdef __cplusplus } #endif hypre-2.33.0/src/lapack/dlasq4.c000066400000000000000000000201541477326011500163140ustar00rootroot00000000000000/* Copyright (c) 1992-2008 The University of Tennessee. All rights reserved. * See file COPYING in this directory for details. */ #ifdef __cplusplus extern "C" { #endif #include "f2c.h" #include "hypre_lapack.h" /* -- translated by f2c (version 19990503). You must link the resulting object file with the libraries: -lf2c -lm (in that order) */ /* Subroutine */ integer dlasq4_(integer *i0, integer *n0, doublereal *z__, integer *pp, integer *n0in, doublereal *dmin__, doublereal *dmin1, doublereal *dmin2, doublereal *dn, doublereal *dn1, doublereal *dn2, doublereal *tau, integer *ttype) { /* Initialized data */ doublereal g = 0.; /* System generated locals */ integer i__1; doublereal d__1, d__2; /* Local variables */ doublereal s, a2, b1, b2; integer i4, nn, np; doublereal gam, gap1, gap2; /* -- LAPACK auxiliary routine (version 3.0) -- Univ. of Tennessee, Univ. of California Berkeley, NAG Ltd., Courant Institute, Argonne National Lab, and Rice University October 31, 1999 Purpose ======= DLASQ4 computes an approximation TAU to the smallest eigenvalue using values of d from the previous transform. I0 (input) INTEGER First index. N0 (input) INTEGER Last index. Z (input) DOUBLE PRECISION array, dimension ( 4*N ) Z holds the qd array. PP (input) INTEGER PP=0 for ping, PP=1 for pong. NOIN (input) INTEGER The value of N0 at start of EIGTEST. DMIN (input) DOUBLE PRECISION Minimum value of d. DMIN1 (input) DOUBLE PRECISION Minimum value of d, excluding D( N0 ). DMIN2 (input) DOUBLE PRECISION Minimum value of d, excluding D( N0 ) and D( N0-1 ). DN (input) DOUBLE PRECISION d(N) DN1 (input) DOUBLE PRECISION d(N-1) DN2 (input) DOUBLE PRECISION d(N-2) TAU (output) DOUBLE PRECISION This is the shift. TTYPE (output) INTEGER Shift type. Further Details =============== CNST1 = 9/16 ===================================================================== Parameter adjustments */ --z__; s = 0.; /* Function Body A negative DMIN forces the shift to take that absolute value TTYPE records the type of shift. */ if (*dmin__ <= 0.) { *tau = -(*dmin__); *ttype = -1; return 0; } nn = (*n0 << 2) + *pp; if (*n0in == *n0) { /* No eigenvalues deflated. */ if (*dmin__ == *dn || *dmin__ == *dn1) { b1 = sqrt(z__[nn - 3]) * sqrt(z__[nn - 5]); b2 = sqrt(z__[nn - 7]) * sqrt(z__[nn - 9]); a2 = z__[nn - 7] + z__[nn - 5]; /* Cases 2 and 3. */ if (*dmin__ == *dn && *dmin1 == *dn1) { gap2 = *dmin2 - a2 - *dmin2 * .25; if (gap2 > 0. && gap2 > b2) { gap1 = a2 - *dn - b2 / gap2 * b2; } else { gap1 = a2 - *dn - (b1 + b2); } if (gap1 > 0. && gap1 > b1) { /* Computing MAX */ d__1 = *dn - b1 / gap1 * b1, d__2 = *dmin__ * .5; s = max(d__1,d__2); *ttype = -2; } else { s = 0.; if (*dn > b1) { s = *dn - b1; } if (a2 > b1 + b2) { /* Computing MIN */ d__1 = s, d__2 = a2 - (b1 + b2); s = min(d__1,d__2); } /* Computing MAX */ d__1 = s, d__2 = *dmin__ * .333; s = max(d__1,d__2); *ttype = -3; } } else { /* Case 4. */ *ttype = -4; s = *dmin__ * .25; if (*dmin__ == *dn) { gam = *dn; a2 = 0.; if (z__[nn - 5] > z__[nn - 7]) { return 0; } b2 = z__[nn - 5] / z__[nn - 7]; np = nn - 9; } else { np = nn - (*pp << 1); b2 = z__[np - 2]; gam = *dn1; if (z__[np - 4] > z__[np - 2]) { return 0; } a2 = z__[np - 4] / z__[np - 2]; if (z__[nn - 9] > z__[nn - 11]) { return 0; } b2 = z__[nn - 9] / z__[nn - 11]; np = nn - 13; } /* Approximate contribution to norm squared from I < NN-1. */ a2 += b2; i__1 = (*i0 << 2) - 1 + *pp; for (i4 = np; i4 >= i__1; i4 += -4) { if (b2 == 0.) { goto L20; } b1 = b2; if (z__[i4] > z__[i4 - 2]) { return 0; } b2 *= z__[i4] / z__[i4 - 2]; a2 += b2; if (max(b2,b1) * 100. < a2 || .563 < a2) { goto L20; } /* L10: */ } L20: a2 *= 1.05; /* Rayleigh quotient residual bound. */ if (a2 < .563) { s = gam * (1. - sqrt(a2)) / (a2 + 1.); } } } else if (*dmin__ == *dn2) { /* Case 5. */ *ttype = -5; s = *dmin__ * .25; /* Compute contribution to norm squared from I > NN-2. */ np = nn - (*pp << 1); b1 = z__[np - 2]; b2 = z__[np - 6]; gam = *dn2; if (z__[np - 8] > b2 || z__[np - 4] > b1) { return 0; } a2 = z__[np - 8] / b2 * (z__[np - 4] / b1 + 1.); /* Approximate contribution to norm squared from I < NN-2. */ if (*n0 - *i0 > 2) { b2 = z__[nn - 13] / z__[nn - 15]; a2 += b2; i__1 = (*i0 << 2) - 1 + *pp; for (i4 = nn - 17; i4 >= i__1; i4 += -4) { if (b2 == 0.) { goto L40; } b1 = b2; if (z__[i4] > z__[i4 - 2]) { return 0; } b2 *= z__[i4] / z__[i4 - 2]; a2 += b2; if (max(b2,b1) * 100. < a2 || .563 < a2) { goto L40; } /* L30: */ } L40: a2 *= 1.05; } if (a2 < .563) { s = gam * (1. - sqrt(a2)) / (a2 + 1.); } } else { /* Case 6, no information to guide us. */ if (*ttype == -6) { g += (1. - g) * .333; } else if (*ttype == -18) { g = .083250000000000005; } else { g = .25; } s = g * *dmin__; *ttype = -6; } } else if (*n0in == *n0 + 1) { /* One eigenvalue just deflated. Use DMIN1, DN1 for DMIN and DN. */ if (*dmin1 == *dn1 && *dmin2 == *dn2) { /* Cases 7 and 8. */ *ttype = -7; s = *dmin1 * .333; if (z__[nn - 5] > z__[nn - 7]) { return 0; } b1 = z__[nn - 5] / z__[nn - 7]; b2 = b1; if (b2 == 0.) { goto L60; } i__1 = (*i0 << 2) - 1 + *pp; for (i4 = (*n0 << 2) - 9 + *pp; i4 >= i__1; i4 += -4) { a2 = b1; if (z__[i4] > z__[i4 - 2]) { return 0; } b1 *= z__[i4] / z__[i4 - 2]; b2 += b1; if (max(b1,a2) * 100. < b2) { goto L60; } /* L50: */ } L60: b2 = sqrt(b2 * 1.05); /* Computing 2nd power */ d__1 = b2; a2 = *dmin1 / (d__1 * d__1 + 1.); gap2 = *dmin2 * .5 - a2; if (gap2 > 0. && gap2 > b2 * a2) { /* Computing MAX */ d__1 = s, d__2 = a2 * (1. - a2 * 1.01 * (b2 / gap2) * b2); s = max(d__1,d__2); } else { /* Computing MAX */ d__1 = s, d__2 = a2 * (1. - b2 * 1.01); s = max(d__1,d__2); *ttype = -8; } } else { /* Case 9. */ s = *dmin1 * .25; if (*dmin1 == *dn1) { s = *dmin1 * .5; } *ttype = -9; } } else if (*n0in == *n0 + 2) { /* Two eigenvalues deflated. Use DMIN2, DN2 for DMIN and DN. Cases 10 and 11. */ if (*dmin2 == *dn2 && z__[nn - 5] * 2. < z__[nn - 7]) { *ttype = -10; s = *dmin2 * .333; if (z__[nn - 5] > z__[nn - 7]) { return 0; } b1 = z__[nn - 5] / z__[nn - 7]; b2 = b1; if (b2 == 0.) { goto L80; } i__1 = (*i0 << 2) - 1 + *pp; for (i4 = (*n0 << 2) - 9 + *pp; i4 >= i__1; i4 += -4) { if (z__[i4] > z__[i4 - 2]) { return 0; } b1 *= z__[i4] / z__[i4 - 2]; b2 += b1; if (b1 * 100. < b2) { goto L80; } /* L70: */ } L80: b2 = sqrt(b2 * 1.05); /* Computing 2nd power */ d__1 = b2; a2 = *dmin2 / (d__1 * d__1 + 1.); gap2 = z__[nn - 7] + z__[nn - 9] - sqrt(z__[nn - 11]) * sqrt(z__[ nn - 9]) - a2; if (gap2 > 0. && gap2 > b2 * a2) { /* Computing MAX */ d__1 = s, d__2 = a2 * (1. - a2 * 1.01 * (b2 / gap2) * b2); s = max(d__1,d__2); } else { /* Computing MAX */ d__1 = s, d__2 = a2 * (1. - b2 * 1.01); s = max(d__1,d__2); } } else { s = *dmin2 * .25; *ttype = -11; } } else if (*n0in > *n0 + 2) { /* Case 12, more than two eigenvalues deflated. No information. */ s = 0.; *ttype = -12; } *tau = s; return 0; /* End of DLASQ4 */ } /* dlasq4_ */ #ifdef __cplusplus } #endif hypre-2.33.0/src/lapack/dlasq5.c000066400000000000000000000120341477326011500163130ustar00rootroot00000000000000/* Copyright (c) 1992-2008 The University of Tennessee. All rights reserved. * See file COPYING in this directory for details. */ #ifdef __cplusplus extern "C" { #endif #include "f2c.h" #include "hypre_lapack.h" /* Subroutine */ integer dlasq5_(integer *i0, integer *n0, doublereal *z__, integer *pp, doublereal *tau, doublereal *dmin__, doublereal *dmin1, doublereal *dmin2, doublereal *dn, doublereal *dnm1, doublereal *dnm2, logical *ieee) { /* -- LAPACK auxiliary routine (version 3.0) -- Univ. of Tennessee, Univ. of California Berkeley, NAG Ltd., Courant Institute, Argonne National Lab, and Rice University May 17, 2000 Purpose ======= DLASQ5 computes one dqds transform in ping-pong form, one version for IEEE machines another for non IEEE machines. Arguments ========= I0 (input) INTEGER First index. N0 (input) INTEGER Last index. Z (input) DOUBLE PRECISION array, dimension ( 4*N ) Z holds the qd array. EMIN is stored in Z(4*N0) to avoid an extra argument. PP (input) INTEGER PP=0 for ping, PP=1 for pong. TAU (input) DOUBLE PRECISION This is the shift. DMIN (output) DOUBLE PRECISION Minimum value of d. DMIN1 (output) DOUBLE PRECISION Minimum value of d, excluding D( N0 ). DMIN2 (output) DOUBLE PRECISION Minimum value of d, excluding D( N0 ) and D( N0-1 ). DN (output) DOUBLE PRECISION d(N0), the last value of d. DNM1 (output) DOUBLE PRECISION d(N0-1). DNM2 (output) DOUBLE PRECISION d(N0-2). IEEE (input) LOGICAL Flag for IEEE or non IEEE arithmetic. ===================================================================== Parameter adjustments */ /* System generated locals */ integer i__1; doublereal d__1, d__2; /* Local variables */ doublereal emin, temp, d__; integer j4, j4p2; --z__; /* Function Body */ if (*n0 - *i0 - 1 <= 0) { return 0; } j4 = (*i0 << 2) + *pp - 3; emin = z__[j4 + 4]; d__ = z__[j4] - *tau; *dmin__ = d__; *dmin1 = -z__[j4]; if (*ieee) { /* Code for IEEE arithmetic. */ if (*pp == 0) { i__1 = (*n0 - 3) << 2; for (j4 = *i0 << 2; j4 <= i__1; j4 += 4) { z__[j4 - 2] = d__ + z__[j4 - 1]; temp = z__[j4 + 1] / z__[j4 - 2]; d__ = d__ * temp - *tau; *dmin__ = min(*dmin__,d__); z__[j4] = z__[j4 - 1] * temp; /* Computing MIN */ d__1 = z__[j4]; emin = min(d__1,emin); /* L10: */ } } else { i__1 = (*n0 - 3) << 2; for (j4 = *i0 << 2; j4 <= i__1; j4 += 4) { z__[j4 - 3] = d__ + z__[j4]; temp = z__[j4 + 2] / z__[j4 - 3]; d__ = d__ * temp - *tau; *dmin__ = min(*dmin__,d__); z__[j4 - 1] = z__[j4] * temp; /* Computing MIN */ d__1 = z__[j4 - 1]; emin = min(d__1,emin); /* L20: */ } } /* Unroll last two steps. */ *dnm2 = d__; *dmin2 = *dmin__; j4 = ((*n0 - 2) << 2) - *pp; j4p2 = j4 + (*pp << 1) - 1; z__[j4 - 2] = *dnm2 + z__[j4p2]; z__[j4] = z__[j4p2 + 2] * (z__[j4p2] / z__[j4 - 2]); *dnm1 = z__[j4p2 + 2] * (*dnm2 / z__[j4 - 2]) - *tau; *dmin__ = min(*dmin__,*dnm1); *dmin1 = *dmin__; j4 += 4; j4p2 = j4 + (*pp << 1) - 1; z__[j4 - 2] = *dnm1 + z__[j4p2]; z__[j4] = z__[j4p2 + 2] * (z__[j4p2] / z__[j4 - 2]); *dn = z__[j4p2 + 2] * (*dnm1 / z__[j4 - 2]) - *tau; *dmin__ = min(*dmin__,*dn); } else { /* Code for non IEEE arithmetic. */ if (*pp == 0) { i__1 = (*n0 - 3) << 2; for (j4 = *i0 << 2; j4 <= i__1; j4 += 4) { z__[j4 - 2] = d__ + z__[j4 - 1]; if (d__ < 0.) { return 0; } else { z__[j4] = z__[j4 + 1] * (z__[j4 - 1] / z__[j4 - 2]); d__ = z__[j4 + 1] * (d__ / z__[j4 - 2]) - *tau; } *dmin__ = min(*dmin__,d__); /* Computing MIN */ d__1 = emin, d__2 = z__[j4]; emin = min(d__1,d__2); /* L30: */ } } else { i__1 = (*n0 - 3) << 2; for (j4 = *i0 << 2; j4 <= i__1; j4 += 4) { z__[j4 - 3] = d__ + z__[j4]; if (d__ < 0.) { return 0; } else { z__[j4 - 1] = z__[j4 + 2] * (z__[j4] / z__[j4 - 3]); d__ = z__[j4 + 2] * (d__ / z__[j4 - 3]) - *tau; } *dmin__ = min(*dmin__,d__); /* Computing MIN */ d__1 = emin, d__2 = z__[j4 - 1]; emin = min(d__1,d__2); /* L40: */ } } /* Unroll last two steps. */ *dnm2 = d__; *dmin2 = *dmin__; j4 = ((*n0 - 2) << 2) - *pp; j4p2 = j4 + (*pp << 1) - 1; z__[j4 - 2] = *dnm2 + z__[j4p2]; if (*dnm2 < 0.) { return 0; } else { z__[j4] = z__[j4p2 + 2] * (z__[j4p2] / z__[j4 - 2]); *dnm1 = z__[j4p2 + 2] * (*dnm2 / z__[j4 - 2]) - *tau; } *dmin__ = min(*dmin__,*dnm1); *dmin1 = *dmin__; j4 += 4; j4p2 = j4 + (*pp << 1) - 1; z__[j4 - 2] = *dnm1 + z__[j4p2]; if (*dnm1 < 0.) { return 0; } else { z__[j4] = z__[j4p2 + 2] * (z__[j4p2] / z__[j4 - 2]); *dn = z__[j4p2 + 2] * (*dnm1 / z__[j4 - 2]) - *tau; } *dmin__ = min(*dmin__,*dn); } z__[j4 + 2] = *dn; z__[(*n0 << 2) - *pp] = emin; return 0; /* End of DLASQ5 */ } /* dlasq5_ */ #ifdef __cplusplus } #endif hypre-2.33.0/src/lapack/dlasq6.c000066400000000000000000000116051477326011500163170ustar00rootroot00000000000000/* Copyright (c) 1992-2008 The University of Tennessee. All rights reserved. * See file COPYING in this directory for details. */ #ifdef __cplusplus extern "C" { #endif #include "f2c.h" #include "hypre_lapack.h" /* -- translated by f2c (version 19990503). You must link the resulting object file with the libraries: -lf2c -lm (in that order) */ /* Subroutine */ integer dlasq6_(integer *i0, integer *n0, doublereal *z__, integer *pp, doublereal *dmin__, doublereal *dmin1, doublereal *dmin2, doublereal *dn, doublereal *dnm1, doublereal *dnm2) { /* System generated locals */ integer i__1; doublereal d__1, d__2; /* Local variables */ doublereal emin, temp, d__; integer j4; extern doublereal dlamch_(const char *); doublereal safmin; integer j4p2; /* -- LAPACK auxiliary routine (version 3.0) -- Univ. of Tennessee, Univ. of California Berkeley, NAG Ltd., Courant Institute, Argonne National Lab, and Rice University October 31, 1999 Purpose ======= DLASQ6 computes one dqd (shift equal to zero) transform in ping-pong form, with protection against underflow and overflow. Arguments ========= I0 (input) INTEGER First index. N0 (input) INTEGER Last index. Z (input) DOUBLE PRECISION array, dimension ( 4*N ) Z holds the qd array. EMIN is stored in Z(4*N0) to avoid an extra argument. PP (input) INTEGER PP=0 for ping, PP=1 for pong. DMIN (output) DOUBLE PRECISION Minimum value of d. DMIN1 (output) DOUBLE PRECISION Minimum value of d, excluding D( N0 ). DMIN2 (output) DOUBLE PRECISION Minimum value of d, excluding D( N0 ) and D( N0-1 ). DN (output) DOUBLE PRECISION d(N0), the last value of d. DNM1 (output) DOUBLE PRECISION d(N0-1). DNM2 (output) DOUBLE PRECISION d(N0-2). ===================================================================== Parameter adjustments */ --z__; /* Function Body */ if (*n0 - *i0 - 1 <= 0) { return 0; } safmin = dlamch_("Safe minimum"); j4 = (*i0 << 2) + *pp - 3; emin = z__[j4 + 4]; d__ = z__[j4]; *dmin__ = d__; if (*pp == 0) { i__1 = (*n0 - 3) << 2; for (j4 = *i0 << 2; j4 <= i__1; j4 += 4) { z__[j4 - 2] = d__ + z__[j4 - 1]; if (z__[j4 - 2] == 0.) { z__[j4] = 0.; d__ = z__[j4 + 1]; *dmin__ = d__; emin = 0.; } else if (safmin * z__[j4 + 1] < z__[j4 - 2] && safmin * z__[j4 - 2] < z__[j4 + 1]) { temp = z__[j4 + 1] / z__[j4 - 2]; z__[j4] = z__[j4 - 1] * temp; d__ *= temp; } else { z__[j4] = z__[j4 + 1] * (z__[j4 - 1] / z__[j4 - 2]); d__ = z__[j4 + 1] * (d__ / z__[j4 - 2]); } *dmin__ = min(*dmin__,d__); /* Computing MIN */ d__1 = emin, d__2 = z__[j4]; emin = min(d__1,d__2); /* L10: */ } } else { i__1 = (*n0 - 3) << 2; for (j4 = *i0 << 2; j4 <= i__1; j4 += 4) { z__[j4 - 3] = d__ + z__[j4]; if (z__[j4 - 3] == 0.) { z__[j4 - 1] = 0.; d__ = z__[j4 + 2]; *dmin__ = d__; emin = 0.; } else if (safmin * z__[j4 + 2] < z__[j4 - 3] && safmin * z__[j4 - 3] < z__[j4 + 2]) { temp = z__[j4 + 2] / z__[j4 - 3]; z__[j4 - 1] = z__[j4] * temp; d__ *= temp; } else { z__[j4 - 1] = z__[j4 + 2] * (z__[j4] / z__[j4 - 3]); d__ = z__[j4 + 2] * (d__ / z__[j4 - 3]); } *dmin__ = min(*dmin__,d__); /* Computing MIN */ d__1 = emin, d__2 = z__[j4 - 1]; emin = min(d__1,d__2); /* L20: */ } } /* Unroll last two steps. */ *dnm2 = d__; *dmin2 = *dmin__; j4 = ((*n0 - 2) << 2) - *pp; j4p2 = j4 + (*pp << 1) - 1; z__[j4 - 2] = *dnm2 + z__[j4p2]; if (z__[j4 - 2] == 0.) { z__[j4] = 0.; *dnm1 = z__[j4p2 + 2]; *dmin__ = *dnm1; emin = 0.; } else if (safmin * z__[j4p2 + 2] < z__[j4 - 2] && safmin * z__[j4 - 2] < z__[j4p2 + 2]) { temp = z__[j4p2 + 2] / z__[j4 - 2]; z__[j4] = z__[j4p2] * temp; *dnm1 = *dnm2 * temp; } else { z__[j4] = z__[j4p2 + 2] * (z__[j4p2] / z__[j4 - 2]); *dnm1 = z__[j4p2 + 2] * (*dnm2 / z__[j4 - 2]); } *dmin__ = min(*dmin__,*dnm1); *dmin1 = *dmin__; j4 += 4; j4p2 = j4 + (*pp << 1) - 1; z__[j4 - 2] = *dnm1 + z__[j4p2]; if (z__[j4 - 2] == 0.) { z__[j4] = 0.; *dn = z__[j4p2 + 2]; *dmin__ = *dn; emin = 0.; } else if (safmin * z__[j4p2 + 2] < z__[j4 - 2] && safmin * z__[j4 - 2] < z__[j4p2 + 2]) { temp = z__[j4p2 + 2] / z__[j4 - 2]; z__[j4] = z__[j4p2] * temp; *dn = *dnm1 * temp; } else { z__[j4] = z__[j4p2 + 2] * (z__[j4p2] / z__[j4 - 2]); *dn = z__[j4p2 + 2] * (*dnm1 / z__[j4 - 2]); } *dmin__ = min(*dmin__,*dn); z__[j4 + 2] = *dn; z__[(*n0 << 2) - *pp] = emin; return 0; /* End of DLASQ6 */ } /* dlasq6_ */ #ifdef __cplusplus } #endif hypre-2.33.0/src/lapack/dlasr.c000066400000000000000000000242201477326011500162270ustar00rootroot00000000000000/* Copyright (c) 1992-2008 The University of Tennessee. All rights reserved. * See file COPYING in this directory for details. */ #ifdef __cplusplus extern "C" { #endif #include "f2c.h" #include "hypre_lapack.h" /* Subroutine */ integer dlasr_(const char *side,const char *pivot,const char *direct, integer *m, integer *n, doublereal *c__, doublereal *s, doublereal *a, integer * lda) { /* -- LAPACK auxiliary routine (version 3.0) -- Univ. of Tennessee, Univ. of California Berkeley, NAG Ltd., Courant Institute, Argonne National Lab, and Rice University October 31, 1992 Purpose ======= DLASR performs the transformation A := P*A, when SIDE = 'L' or 'l' ( Left-hand side ) A := A*P', when SIDE = 'R' or 'r' ( Right-hand side ) where A is an m by n real matrix and P is an orthogonal matrix, consisting of a sequence of plane rotations determined by the parameters PIVOT and DIRECT as follows ( z = m when SIDE = 'L' or 'l' and z = n when SIDE = 'R' or 'r' ): When DIRECT = 'F' or 'f' ( Forward sequence ) then P = P( z - 1 )*...*P( 2 )*P( 1 ), and when DIRECT = 'B' or 'b' ( Backward sequence ) then P = P( 1 )*P( 2 )*...*P( z - 1 ), where P( k ) is a plane rotation matrix for the following planes: when PIVOT = 'V' or 'v' ( Variable pivot ), the plane ( k, k + 1 ) when PIVOT = 'T' or 't' ( Top pivot ), the plane ( 1, k + 1 ) when PIVOT = 'B' or 'b' ( Bottom pivot ), the plane ( k, z ) c( k ) and s( k ) must contain the cosine and sine that define the matrix P( k ). The two by two plane rotation part of the matrix P( k ), R( k ), is assumed to be of the form R( k ) = ( c( k ) s( k ) ). ( -s( k ) c( k ) ) This version vectorises across rows of the array A when SIDE = 'L'. Arguments ========= SIDE (input) CHARACTER*1 Specifies whether the plane rotation matrix P is applied to A on the left or the right. = 'L': Left, compute A := P*A = 'R': Right, compute A:= A*P' DIRECT (input) CHARACTER*1 Specifies whether P is a forward or backward sequence of plane rotations. = 'F': Forward, P = P( z - 1 )*...*P( 2 )*P( 1 ) = 'B': Backward, P = P( 1 )*P( 2 )*...*P( z - 1 ) PIVOT (input) CHARACTER*1 Specifies the plane for which P(k) is a plane rotation matrix. = 'V': Variable pivot, the plane (k,k+1) = 'T': Top pivot, the plane (1,k+1) = 'B': Bottom pivot, the plane (k,z) M (input) INTEGER The number of rows of the matrix A. If m <= 1, an immediate return is effected. N (input) INTEGER The number of columns of the matrix A. If n <= 1, an immediate return is effected. C, S (input) DOUBLE PRECISION arrays, dimension (M-1) if SIDE = 'L' (N-1) if SIDE = 'R' c(k) and s(k) contain the cosine and sine that define the matrix P(k). The two by two plane rotation part of the matrix P(k), R(k), is assumed to be of the form R( k ) = ( c( k ) s( k ) ). ( -s( k ) c( k ) ) A (input/output) DOUBLE PRECISION array, dimension (LDA,N) The m by n matrix A. On exit, A is overwritten by P*A if SIDE = 'R' or by A*P' if SIDE = 'L'. LDA (input) INTEGER The leading dimension of the array A. LDA >= max(1,M). ===================================================================== Test the input parameters Parameter adjustments */ /* System generated locals */ integer a_dim1, a_offset, i__1, i__2; /* Local variables */ integer info; doublereal temp; integer i__, j; extern logical lsame_(const char *,const char *); doublereal ctemp, stemp; extern /* Subroutine */ integer xerbla_(const char *, integer *); #define a_ref(a_1,a_2) a[(a_2)*a_dim1 + a_1] --c__; --s; a_dim1 = *lda; a_offset = 1 + a_dim1 * 1; a -= a_offset; /* Function Body */ info = 0; if (! (lsame_(side, "L") || lsame_(side, "R"))) { info = 1; } else if (! (lsame_(pivot, "V") || lsame_(pivot, "T") || lsame_(pivot, "B"))) { info = 2; } else if (! (lsame_(direct, "F") || lsame_(direct, "B"))) { info = 3; } else if (*m < 0) { info = 4; } else if (*n < 0) { info = 5; } else if (*lda < max(1,*m)) { info = 9; } if (info != 0) { xerbla_("DLASR ", &info); return 0; } /* Quick return if possible */ if (*m == 0 || *n == 0) { return 0; } if (lsame_(side, "L")) { /* Form P * A */ if (lsame_(pivot, "V")) { if (lsame_(direct, "F")) { i__1 = *m - 1; for (j = 1; j <= i__1; ++j) { ctemp = c__[j]; stemp = s[j]; if (ctemp != 1. || stemp != 0.) { i__2 = *n; for (i__ = 1; i__ <= i__2; ++i__) { temp = a_ref(j + 1, i__); a_ref(j + 1, i__) = ctemp * temp - stemp * a_ref( j, i__); a_ref(j, i__) = stemp * temp + ctemp * a_ref(j, i__); /* L10: */ } } /* L20: */ } } else if (lsame_(direct, "B")) { for (j = *m - 1; j >= 1; --j) { ctemp = c__[j]; stemp = s[j]; if (ctemp != 1. || stemp != 0.) { i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { temp = a_ref(j + 1, i__); a_ref(j + 1, i__) = ctemp * temp - stemp * a_ref( j, i__); a_ref(j, i__) = stemp * temp + ctemp * a_ref(j, i__); /* L30: */ } } /* L40: */ } } } else if (lsame_(pivot, "T")) { if (lsame_(direct, "F")) { i__1 = *m; for (j = 2; j <= i__1; ++j) { ctemp = c__[j - 1]; stemp = s[j - 1]; if (ctemp != 1. || stemp != 0.) { i__2 = *n; for (i__ = 1; i__ <= i__2; ++i__) { temp = a_ref(j, i__); a_ref(j, i__) = ctemp * temp - stemp * a_ref(1, i__); a_ref(1, i__) = stemp * temp + ctemp * a_ref(1, i__); /* L50: */ } } /* L60: */ } } else if (lsame_(direct, "B")) { for (j = *m; j >= 2; --j) { ctemp = c__[j - 1]; stemp = s[j - 1]; if (ctemp != 1. || stemp != 0.) { i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { temp = a_ref(j, i__); a_ref(j, i__) = ctemp * temp - stemp * a_ref(1, i__); a_ref(1, i__) = stemp * temp + ctemp * a_ref(1, i__); /* L70: */ } } /* L80: */ } } } else if (lsame_(pivot, "B")) { if (lsame_(direct, "F")) { i__1 = *m - 1; for (j = 1; j <= i__1; ++j) { ctemp = c__[j]; stemp = s[j]; if (ctemp != 1. || stemp != 0.) { i__2 = *n; for (i__ = 1; i__ <= i__2; ++i__) { temp = a_ref(j, i__); a_ref(j, i__) = stemp * a_ref(*m, i__) + ctemp * temp; a_ref(*m, i__) = ctemp * a_ref(*m, i__) - stemp * temp; /* L90: */ } } /* L100: */ } } else if (lsame_(direct, "B")) { for (j = *m - 1; j >= 1; --j) { ctemp = c__[j]; stemp = s[j]; if (ctemp != 1. || stemp != 0.) { i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { temp = a_ref(j, i__); a_ref(j, i__) = stemp * a_ref(*m, i__) + ctemp * temp; a_ref(*m, i__) = ctemp * a_ref(*m, i__) - stemp * temp; /* L110: */ } } /* L120: */ } } } } else if (lsame_(side, "R")) { /* Form A * P' */ if (lsame_(pivot, "V")) { if (lsame_(direct, "F")) { i__1 = *n - 1; for (j = 1; j <= i__1; ++j) { ctemp = c__[j]; stemp = s[j]; if (ctemp != 1. || stemp != 0.) { i__2 = *m; for (i__ = 1; i__ <= i__2; ++i__) { temp = a_ref(i__, j + 1); a_ref(i__, j + 1) = ctemp * temp - stemp * a_ref( i__, j); a_ref(i__, j) = stemp * temp + ctemp * a_ref(i__, j); /* L130: */ } } /* L140: */ } } else if (lsame_(direct, "B")) { for (j = *n - 1; j >= 1; --j) { ctemp = c__[j]; stemp = s[j]; if (ctemp != 1. || stemp != 0.) { i__1 = *m; for (i__ = 1; i__ <= i__1; ++i__) { temp = a_ref(i__, j + 1); a_ref(i__, j + 1) = ctemp * temp - stemp * a_ref( i__, j); a_ref(i__, j) = stemp * temp + ctemp * a_ref(i__, j); /* L150: */ } } /* L160: */ } } } else if (lsame_(pivot, "T")) { if (lsame_(direct, "F")) { i__1 = *n; for (j = 2; j <= i__1; ++j) { ctemp = c__[j - 1]; stemp = s[j - 1]; if (ctemp != 1. || stemp != 0.) { i__2 = *m; for (i__ = 1; i__ <= i__2; ++i__) { temp = a_ref(i__, j); a_ref(i__, j) = ctemp * temp - stemp * a_ref(i__, 1); a_ref(i__, 1) = stemp * temp + ctemp * a_ref(i__, 1); /* L170: */ } } /* L180: */ } } else if (lsame_(direct, "B")) { for (j = *n; j >= 2; --j) { ctemp = c__[j - 1]; stemp = s[j - 1]; if (ctemp != 1. || stemp != 0.) { i__1 = *m; for (i__ = 1; i__ <= i__1; ++i__) { temp = a_ref(i__, j); a_ref(i__, j) = ctemp * temp - stemp * a_ref(i__, 1); a_ref(i__, 1) = stemp * temp + ctemp * a_ref(i__, 1); /* L190: */ } } /* L200: */ } } } else if (lsame_(pivot, "B")) { if (lsame_(direct, "F")) { i__1 = *n - 1; for (j = 1; j <= i__1; ++j) { ctemp = c__[j]; stemp = s[j]; if (ctemp != 1. || stemp != 0.) { i__2 = *m; for (i__ = 1; i__ <= i__2; ++i__) { temp = a_ref(i__, j); a_ref(i__, j) = stemp * a_ref(i__, *n) + ctemp * temp; a_ref(i__, *n) = ctemp * a_ref(i__, *n) - stemp * temp; /* L210: */ } } /* L220: */ } } else if (lsame_(direct, "B")) { for (j = *n - 1; j >= 1; --j) { ctemp = c__[j]; stemp = s[j]; if (ctemp != 1. || stemp != 0.) { i__1 = *m; for (i__ = 1; i__ <= i__1; ++i__) { temp = a_ref(i__, j); a_ref(i__, j) = stemp * a_ref(i__, *n) + ctemp * temp; a_ref(i__, *n) = ctemp * a_ref(i__, *n) - stemp * temp; /* L230: */ } } /* L240: */ } } } } return 0; /* End of DLASR */ } /* dlasr_ */ #undef a_ref #ifdef __cplusplus } #endif hypre-2.33.0/src/lapack/dlasrt.c000066400000000000000000000123051477326011500164140ustar00rootroot00000000000000/* Copyright (c) 1992-2008 The University of Tennessee. All rights reserved. * See file COPYING in this directory for details. */ #ifdef __cplusplus extern "C" { #endif #include "f2c.h" #include "hypre_lapack.h" /* Subroutine */ integer dlasrt_(const char *id, integer *n, doublereal *d__, integer * info) { /* -- LAPACK routine (version 3.0) -- Univ. of Tennessee, Univ. of California Berkeley, NAG Ltd., Courant Institute, Argonne National Lab, and Rice University September 30, 1994 Purpose ======= Sort the numbers in D in increasing order (if ID = 'I') or in decreasing order (if ID = 'D' ). Use Quick Sort, reverting to Insertion sort on arrays of size <= 20. Dimension of STACK limits N to about 2**32. Arguments ========= ID (input) CHARACTER*1 = 'I': sort D in increasing order; = 'D': sort D in decreasing order. N (input) INTEGER The length of the array D. D (input/output) DOUBLE PRECISION array, dimension (N) On entry, the array to be sorted. On exit, D has been sorted into increasing order (D(1) <= ... <= D(N) ) or into decreasing order (D(1) >= ... >= D(N) ), depending on ID. INFO (output) INTEGER = 0: successful exit < 0: if INFO = -i, the i-th argument had an illegal value ===================================================================== Test the input paramters. Parameter adjustments */ /* System generated locals */ integer i__1, i__2; /* Local variables */ integer endd, i__, j; extern logical lsame_(const char *,const char *); integer stack[64] /* was [2][32] */; doublereal dmnmx, d1, d2, d3; integer start; extern /* Subroutine */ integer xerbla_(const char *, integer *); integer stkpnt, dir; doublereal tmp; #define stack_ref(a_1,a_2) stack[(a_2)*2 + a_1 - 3] --d__; /* Function Body */ *info = 0; dir = -1; if (lsame_(id, "D")) { dir = 0; } else if (lsame_(id, "I")) { dir = 1; } if (dir == -1) { *info = -1; } else if (*n < 0) { *info = -2; } if (*info != 0) { i__1 = -(*info); xerbla_("DLASRT", &i__1); return 0; } /* Quick return if possible */ if (*n <= 1) { return 0; } stkpnt = 1; stack_ref(1, 1) = 1; stack_ref(2, 1) = *n; L10: start = stack_ref(1, stkpnt); endd = stack_ref(2, stkpnt); --stkpnt; if (endd - start <= 20 && endd - start > 0) { /* Do Insertion sort on D( START:ENDD ) */ if (dir == 0) { /* Sort into decreasing order */ i__1 = endd; for (i__ = start + 1; i__ <= i__1; ++i__) { i__2 = start + 1; for (j = i__; j >= i__2; --j) { if (d__[j] > d__[j - 1]) { dmnmx = d__[j]; d__[j] = d__[j - 1]; d__[j - 1] = dmnmx; } else { goto L30; } /* L20: */ } L30: ; } } else { /* Sort into increasing order */ i__1 = endd; for (i__ = start + 1; i__ <= i__1; ++i__) { i__2 = start + 1; for (j = i__; j >= i__2; --j) { if (d__[j] < d__[j - 1]) { dmnmx = d__[j]; d__[j] = d__[j - 1]; d__[j - 1] = dmnmx; } else { goto L50; } /* L40: */ } L50: ; } } } else if (endd - start > 20) { /* Partition D( START:ENDD ) and stack parts, largest one first Choose partition entry as median of 3 */ d1 = d__[start]; d2 = d__[endd]; i__ = (start + endd) / 2; d3 = d__[i__]; if (d1 < d2) { if (d3 < d1) { dmnmx = d1; } else if (d3 < d2) { dmnmx = d3; } else { dmnmx = d2; } } else { if (d3 < d2) { dmnmx = d2; } else if (d3 < d1) { dmnmx = d3; } else { dmnmx = d1; } } if (dir == 0) { /* Sort into decreasing order */ i__ = start - 1; j = endd + 1; L60: L70: --j; if (d__[j] < dmnmx) { goto L70; } L80: ++i__; if (d__[i__] > dmnmx) { goto L80; } if (i__ < j) { tmp = d__[i__]; d__[i__] = d__[j]; d__[j] = tmp; goto L60; } if (j - start > endd - j - 1) { ++stkpnt; stack_ref(1, stkpnt) = start; stack_ref(2, stkpnt) = j; ++stkpnt; stack_ref(1, stkpnt) = j + 1; stack_ref(2, stkpnt) = endd; } else { ++stkpnt; stack_ref(1, stkpnt) = j + 1; stack_ref(2, stkpnt) = endd; ++stkpnt; stack_ref(1, stkpnt) = start; stack_ref(2, stkpnt) = j; } } else { /* Sort into increasing order */ i__ = start - 1; j = endd + 1; L90: L100: --j; if (d__[j] > dmnmx) { goto L100; } L110: ++i__; if (d__[i__] < dmnmx) { goto L110; } if (i__ < j) { tmp = d__[i__]; d__[i__] = d__[j]; d__[j] = tmp; goto L90; } if (j - start > endd - j - 1) { ++stkpnt; stack_ref(1, stkpnt) = start; stack_ref(2, stkpnt) = j; ++stkpnt; stack_ref(1, stkpnt) = j + 1; stack_ref(2, stkpnt) = endd; } else { ++stkpnt; stack_ref(1, stkpnt) = j + 1; stack_ref(2, stkpnt) = endd; ++stkpnt; stack_ref(1, stkpnt) = start; stack_ref(2, stkpnt) = j; } } } if (stkpnt > 0) { goto L10; } return 0; /* End of DLASRT */ } /* dlasrt_ */ #undef stack_ref #ifdef __cplusplus } #endif hypre-2.33.0/src/lapack/dlassq.c000066400000000000000000000053301477326011500164120ustar00rootroot00000000000000/* Copyright (c) 1992-2008 The University of Tennessee. All rights reserved. * See file COPYING in this directory for details. */ #ifdef __cplusplus extern "C" { #endif #include "f2c.h" #include "hypre_lapack.h" /* Subroutine */ integer dlassq_(integer *n, doublereal *x, integer *incx, doublereal *scale, doublereal *sumsq) { /* -- LAPACK auxiliary routine (version 3.0) -- Univ. of Tennessee, Univ. of California Berkeley, NAG Ltd., Courant Institute, Argonne National Lab, and Rice University June 30, 1999 Purpose ======= DLASSQ returns the values scl and smsq such that ( scl**2 )*smsq = x( 1 )**2 +...+ x( n )**2 + ( scale**2 )*sumsq, where x( i ) = X( 1 + ( i - 1 )*INCX ). The value of sumsq is assumed to be non-negative and scl returns the value scl = max( scale, abs( x( i ) ) ). scale and sumsq must be supplied in SCALE and SUMSQ and scl and smsq are overwritten on SCALE and SUMSQ respectively. The routine makes only one pass through the vector x. Arguments ========= N (input) INTEGER The number of elements to be used from the vector X. X (input) DOUBLE PRECISION array, dimension (N) The vector for which a scaled sum of squares is computed. x( i ) = X( 1 + ( i - 1 )*INCX ), 1 <= i <= n. INCX (input) INTEGER The increment between successive values of the vector X. INCX > 0. SCALE (input/output) DOUBLE PRECISION On entry, the value scale in the equation above. On exit, SCALE is overwritten with scl , the scaling factor for the sum of squares. SUMSQ (input/output) DOUBLE PRECISION On entry, the value sumsq in the equation above. On exit, SUMSQ is overwritten with smsq , the basic sum of squares from which scl has been factored out. ===================================================================== Parameter adjustments */ /* System generated locals */ integer i__1, i__2; doublereal d__1; /* Local variables */ doublereal absxi; integer ix; --x; /* Function Body */ if (*n > 0) { i__1 = (*n - 1) * *incx + 1; i__2 = *incx; for (ix = 1; i__2 < 0 ? ix >= i__1 : ix <= i__1; ix += i__2) { if (x[ix] != 0.) { absxi = (d__1 = x[ix], abs(d__1)); if (*scale < absxi) { /* Computing 2nd power */ d__1 = *scale / absxi; *sumsq = *sumsq * (d__1 * d__1) + 1; *scale = absxi; } else { /* Computing 2nd power */ d__1 = absxi / *scale; *sumsq += d__1 * d__1; } } /* L10: */ } } return 0; /* End of DLASSQ */ } /* dlassq_ */ #ifdef __cplusplus } #endif hypre-2.33.0/src/lapack/dlasv2.c000066400000000000000000000137211477326011500163210ustar00rootroot00000000000000/* Copyright (c) 1992-2008 The University of Tennessee. All rights reserved. * See file COPYING in this directory for details. */ #ifdef __cplusplus extern "C" { #endif #include "f2c.h" #include "hypre_lapack.h" /* Subroutine */ integer dlasv2_(doublereal *f, doublereal *g, doublereal *h__, doublereal *ssmin, doublereal *ssmax, doublereal *snr, doublereal * csr, doublereal *snl, doublereal *csl) { /* -- LAPACK auxiliary routine (version 3.0) -- Univ. of Tennessee, Univ. of California Berkeley, NAG Ltd., Courant Institute, Argonne National Lab, and Rice University October 31, 1992 Purpose ======= DLASV2 computes the singular value decomposition of a 2-by-2 triangular matrix [ F G ] [ 0 H ]. On return, abs(SSMAX) is the larger singular value, abs(SSMIN) is the smaller singular value, and (CSL,SNL) and (CSR,SNR) are the left and right singular vectors for abs(SSMAX), giving the decomposition [ CSL SNL ] [ F G ] [ CSR -SNR ] = [ SSMAX 0 ] [-SNL CSL ] [ 0 H ] [ SNR CSR ] [ 0 SSMIN ]. Arguments ========= F (input) DOUBLE PRECISION The (1,1) element of the 2-by-2 matrix. G (input) DOUBLE PRECISION The (1,2) element of the 2-by-2 matrix. H (input) DOUBLE PRECISION The (2,2) element of the 2-by-2 matrix. SSMIN (output) DOUBLE PRECISION abs(SSMIN) is the smaller singular value. SSMAX (output) DOUBLE PRECISION abs(SSMAX) is the larger singular value. SNL (output) DOUBLE PRECISION CSL (output) DOUBLE PRECISION The vector (CSL, SNL) is a unit left singular vector for the singular value abs(SSMAX). SNR (output) DOUBLE PRECISION CSR (output) DOUBLE PRECISION The vector (CSR, SNR) is a unit right singular vector for the singular value abs(SSMAX). Further Details =============== Any input parameter may be aliased with any output parameter. Barring over/underflow and assuming a guard digit in subtraction, all output quantities are correct to within a few units in the last place (ulps). In IEEE arithmetic, the code works correctly if one matrix element is infinite. Overflow will not occur unless the largest singular value itself overflows or is within a few ulps of overflow. (On machines with partial overflow, like the Cray, overflow may occur if the largest singular value is within a factor of 2 of overflow.) Underflow is harmless if underflow is gradual. Otherwise, results may correspond to a matrix modified by perturbations of size near the underflow threshold. ===================================================================== */ /* Table of constant values */ doublereal c_b3 = 2.; doublereal c_b4 = 1.; /* System generated locals */ doublereal d__1; /* Builtin functions */ doublereal d_sign(doublereal *, doublereal *); /* Local variables */ integer pmax; doublereal temp; logical swap; doublereal a, d__, l, m, r__, s, t, tsign, fa, ga, ha; extern doublereal dlamch_(const char *); doublereal ft, gt, ht, mm; logical gasmal; doublereal tt, clt, crt, slt, srt; ft = *f; fa = abs(ft); ht = *h__; ha = abs(*h__); /* PMAX points to the maximum absolute element of matrix PMAX = 1 if F largest in absolute values PMAX = 2 if G largest in absolute values PMAX = 3 if H largest in absolute values */ pmax = 1; swap = ha > fa; if (swap) { pmax = 3; temp = ft; ft = ht; ht = temp; temp = fa; fa = ha; ha = temp; /* Now FA .ge. HA */ } gt = *g; ga = abs(gt); if (ga == 0.) { /* Diagonal matrix */ *ssmin = ha; *ssmax = fa; clt = 1.; crt = 1.; slt = 0.; srt = 0.; } else { gasmal = TRUE_; if (ga > fa) { pmax = 2; if (fa / ga < dlamch_("EPS")) { /* Case of very large GA */ gasmal = FALSE_; *ssmax = ga; if (ha > 1.) { *ssmin = fa / (ga / ha); } else { *ssmin = fa / ga * ha; } clt = 1.; slt = ht / gt; srt = 1.; crt = ft / gt; } } if (gasmal) { /* Normal case */ d__ = fa - ha; if (d__ == fa) { /* Copes with infinite F or H */ l = 1.; } else { l = d__ / fa; } /* Note that 0 .le. L .le. 1 */ m = gt / ft; /* Note that abs(M) .le. 1/macheps */ t = 2. - l; /* Note that T .ge. 1 */ mm = m * m; tt = t * t; s = sqrt(tt + mm); /* Note that 1 .le. S .le. 1 + 1/macheps */ if (l == 0.) { r__ = abs(m); } else { r__ = sqrt(l * l + mm); } /* Note that 0 .le. R .le. 1 + 1/macheps */ a = (s + r__) * .5; /* Note that 1 .le. A .le. 1 + abs(M) */ *ssmin = ha / a; *ssmax = fa * a; if (mm == 0.) { /* Note that M is very tiny */ if (l == 0.) { t = d_sign(&c_b3, &ft) * d_sign(&c_b4, >); } else { t = gt / d_sign(&d__, &ft) + m / t; } } else { t = (m / (s + t) + m / (r__ + l)) * (a + 1.); } l = sqrt(t * t + 4.); crt = 2. / l; srt = t / l; clt = (crt + srt * m) / a; slt = ht / ft * srt / a; } } if (swap) { *csl = srt; *snl = crt; *csr = slt; *snr = clt; } else { *csl = clt; *snl = slt; *csr = crt; *snr = srt; } /* Correct signs of SSMAX and SSMIN */ if (pmax == 1) { tsign = d_sign(&c_b4, csr) * d_sign(&c_b4, csl) * d_sign(&c_b4, f); } if (pmax == 2) { tsign = d_sign(&c_b4, snr) * d_sign(&c_b4, csl) * d_sign(&c_b4, g); } if (pmax == 3) { tsign = d_sign(&c_b4, snr) * d_sign(&c_b4, snl) * d_sign(&c_b4, h__); } *ssmax = d_sign(ssmax, &tsign); d__1 = tsign * d_sign(&c_b4, f) * d_sign(&c_b4, h__); *ssmin = d_sign(ssmin, &d__1); return 0; /* End of DLASV2 */ } /* dlasv2_ */ #ifdef __cplusplus } #endif hypre-2.33.0/src/lapack/dlaswp.c000066400000000000000000000067731477326011500164310ustar00rootroot00000000000000/* Copyright (c) 1992-2008 The University of Tennessee. All rights reserved. * See file COPYING in this directory for details. */ #ifdef __cplusplus extern "C" { #endif #include "f2c.h" #include "hypre_lapack.h" /* Subroutine */ integer dlaswp_(integer *n, doublereal *a, integer *lda, integer *k1, integer *k2, integer *ipiv, integer *incx) { /* -- LAPACK auxiliary routine (version 3.0) -- Univ. of Tennessee, Univ. of California Berkeley, NAG Ltd., Courant Institute, Argonne National Lab, and Rice University June 30, 1999 Purpose ======= DLASWP performs a series of row interchanges on the matrix A. One row interchange is initiated for each of rows K1 through K2 of A. Arguments ========= N (input) INTEGER The number of columns of the matrix A. A (input/output) DOUBLE PRECISION array, dimension (LDA,N) On entry, the matrix of column dimension N to which the row interchanges will be applied. On exit, the permuted matrix. LDA (input) INTEGER The leading dimension of the array A. K1 (input) INTEGER The first element of IPIV for which a row interchange will be done. K2 (input) INTEGER The last element of IPIV for which a row interchange will be done. IPIV (input) INTEGER array, dimension (M*abs(INCX)) The vector of pivot indices. Only the elements in positions K1 through K2 of IPIV are accessed. IPIV(K) = L implies rows K and L are to be interchanged. INCX (input) INTEGER The increment between successive values of IPIV. If IPIV is negative, the pivots are applied in reverse order. Further Details =============== Modified by R. C. Whaley, Computer Science Dept., Univ. of Tenn., Knoxville, USA ===================================================================== Interchange row I with row IPIV(I) for each of rows K1 through K2. Parameter adjustments */ /* System generated locals */ integer a_dim1, a_offset, i__1, i__2, i__3, i__4; /* Local variables */ doublereal temp; integer i__, j, k, i1, i2, n32, ip, ix, ix0, inc; #define a_ref(a_1,a_2) a[(a_2)*a_dim1 + a_1] a_dim1 = *lda; a_offset = 1 + a_dim1 * 1; a -= a_offset; --ipiv; /* Function Body */ if (*incx > 0) { ix0 = *k1; i1 = *k1; i2 = *k2; inc = 1; } else if (*incx < 0) { ix0 = (1 - *k2) * *incx + 1; i1 = *k2; i2 = *k1; inc = -1; } else { return 0; } n32 = *n / 32 << 5; if (n32 != 0) { i__1 = n32; for (j = 1; j <= i__1; j += 32) { ix = ix0; i__2 = i2; i__3 = inc; for (i__ = i1; i__3 < 0 ? i__ >= i__2 : i__ <= i__2; i__ += i__3) { ip = ipiv[ix]; if (ip != i__) { i__4 = j + 31; for (k = j; k <= i__4; ++k) { temp = a_ref(i__, k); a_ref(i__, k) = a_ref(ip, k); a_ref(ip, k) = temp; /* L10: */ } } ix += *incx; /* L20: */ } /* L30: */ } } if (n32 != *n) { ++n32; ix = ix0; i__1 = i2; i__3 = inc; for (i__ = i1; i__3 < 0 ? i__ >= i__1 : i__ <= i__1; i__ += i__3) { ip = ipiv[ix]; if (ip != i__) { i__2 = *n; for (k = n32; k <= i__2; ++k) { temp = a_ref(i__, k); a_ref(i__, k) = a_ref(ip, k); a_ref(ip, k) = temp; /* L40: */ } } ix += *incx; /* L50: */ } } return 0; /* End of DLASWP */ } /* dlaswp_ */ #undef a_ref #ifdef __cplusplus } #endif hypre-2.33.0/src/lapack/dlatrd.c000066400000000000000000000256641477326011500164110ustar00rootroot00000000000000/* Copyright (c) 1992-2008 The University of Tennessee. All rights reserved. * See file COPYING in this directory for details. */ #ifdef __cplusplus extern "C" { #endif #include "f2c.h" #include "hypre_lapack.h" /* Subroutine */ integer dlatrd_(const char *uplo, integer *n, integer *nb, doublereal * a, integer *lda, doublereal *e, doublereal *tau, doublereal *w, integer *ldw) { /* -- LAPACK auxiliary routine (version 3.0) -- Univ. of Tennessee, Univ. of California Berkeley, NAG Ltd., Courant Institute, Argonne National Lab, and Rice University October 31, 1992 Purpose ======= DLATRD reduces NB rows and columns of a real symmetric matrix A to symmetric tridiagonal form by an orthogonal similarity transformation Q' * A * Q, and returns the matrices V and W which are needed to apply the transformation to the unreduced part of A. If UPLO = 'U', DLATRD reduces the last NB rows and columns of a matrix, of which the upper triangle is supplied; if UPLO = 'L', DLATRD reduces the first NB rows and columns of a matrix, of which the lower triangle is supplied. This is an auxiliary routine called by DSYTRD. Arguments ========= UPLO (input) CHARACTER Specifies whether the upper or lower triangular part of the symmetric matrix A is stored: = 'U': Upper triangular = 'L': Lower triangular N (input) INTEGER The order of the matrix A. NB (input) INTEGER The number of rows and columns to be reduced. A (input/output) DOUBLE PRECISION array, dimension (LDA,N) On entry, the symmetric matrix A. If UPLO = 'U', the leading n-by-n upper triangular part of A contains the upper triangular part of the matrix A, and the strictly lower triangular part of A is not referenced. If UPLO = 'L', the leading n-by-n lower triangular part of A contains the lower triangular part of the matrix A, and the strictly upper triangular part of A is not referenced. On exit: if UPLO = 'U', the last NB columns have been reduced to tridiagonal form, with the diagonal elements overwriting the diagonal elements of A; the elements above the diagonal with the array TAU, represent the orthogonal matrix Q as a product of elementary reflectors; if UPLO = 'L', the first NB columns have been reduced to tridiagonal form, with the diagonal elements overwriting the diagonal elements of A; the elements below the diagonal with the array TAU, represent the orthogonal matrix Q as a product of elementary reflectors. See Further Details. LDA (input) INTEGER The leading dimension of the array A. LDA >= (1,N). E (output) DOUBLE PRECISION array, dimension (N-1) If UPLO = 'U', E(n-nb:n-1) contains the superdiagonal elements of the last NB columns of the reduced matrix; if UPLO = 'L', E(1:nb) contains the subdiagonal elements of the first NB columns of the reduced matrix. TAU (output) DOUBLE PRECISION array, dimension (N-1) The scalar factors of the elementary reflectors, stored in TAU(n-nb:n-1) if UPLO = 'U', and in TAU(1:nb) if UPLO = 'L'. See Further Details. W (output) DOUBLE PRECISION array, dimension (LDW,NB) The n-by-nb matrix W required to update the unreduced part of A. LDW (input) INTEGER The leading dimension of the array W. LDW >= max(1,N). Further Details =============== If UPLO = 'U', the matrix Q is represented as a product of elementary reflectors Q = H(n) H(n-1) . . . H(n-nb+1). Each H(i) has the form H(i) = I - tau * v * v' where tau is a real scalar, and v is a real vector with v(i:n) = 0 and v(i-1) = 1; v(1:i-1) is stored on exit in A(1:i-1,i), and tau in TAU(i-1). If UPLO = 'L', the matrix Q is represented as a product of elementary reflectors Q = H(1) H(2) . . . H(nb). Each H(i) has the form H(i) = I - tau * v * v' where tau is a real scalar, and v is a real vector with v(1:i) = 0 and v(i+1) = 1; v(i+1:n) is stored on exit in A(i+1:n,i), and tau in TAU(i). The elements of the vectors v together form the n-by-nb matrix V which is needed, with W, to apply the transformation to the unreduced part of the matrix, using a symmetric rank-2k update of the form: A := A - V*W' - W*V'. The contents of A on exit are illustrated by the following examples with n = 5 and nb = 2: if UPLO = 'U': if UPLO = 'L': ( a a a v4 v5 ) ( d ) ( a a v4 v5 ) ( 1 d ) ( a 1 v5 ) ( v1 1 a ) ( d 1 ) ( v1 v2 a a ) ( d ) ( v1 v2 a a a ) where d denotes a diagonal element of the reduced matrix, a denotes an element of the original matrix that is unchanged, and vi denotes an element of the vector defining H(i). ===================================================================== Quick return if possible Parameter adjustments */ /* Table of constant values */ doublereal c_b5 = -1.; doublereal c_b6 = 1.; integer c__1 = 1; doublereal c_b16 = 0.; /* System generated locals */ integer a_dim1, a_offset, w_dim1, w_offset, i__1, i__2, i__3; /* Local variables */ extern doublereal ddot_(integer *, doublereal *, integer *, doublereal *, integer *); integer i__; doublereal alpha; extern /* Subroutine */ integer dscal_(integer *, doublereal *, doublereal *, integer *); extern logical lsame_(const char *,const char *); extern /* Subroutine */ integer dgemv_(const char *, integer *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *), daxpy_(integer *, doublereal *, doublereal *, integer *, doublereal *, integer *), dsymv_(const char *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *), dlarfg_(integer *, doublereal *, doublereal *, integer *, doublereal *); integer iw; #define a_ref(a_1,a_2) a[(a_2)*a_dim1 + a_1] #define w_ref(a_1,a_2) w[(a_2)*w_dim1 + a_1] a_dim1 = *lda; a_offset = 1 + a_dim1 * 1; a -= a_offset; --e; --tau; w_dim1 = *ldw; w_offset = 1 + w_dim1 * 1; w -= w_offset; /* Function Body */ if (*n <= 0) { return 0; } if (lsame_(uplo, "U")) { /* Reduce last NB columns of upper triangle */ i__1 = *n - *nb + 1; for (i__ = *n; i__ >= i__1; --i__) { iw = i__ - *n + *nb; if (i__ < *n) { /* Update A(1:i,i) */ i__2 = *n - i__; dgemv_("No transpose", &i__, &i__2, &c_b5, &a_ref(1, i__ + 1), lda, &w_ref(i__, iw + 1), ldw, &c_b6, &a_ref(1, i__), &c__1); i__2 = *n - i__; dgemv_("No transpose", &i__, &i__2, &c_b5, &w_ref(1, iw + 1), ldw, &a_ref(i__, i__ + 1), lda, &c_b6, &a_ref(1, i__), &c__1); } if (i__ > 1) { /* Generate elementary reflector H(i) to annihilate A(1:i-2,i) */ i__2 = i__ - 1; dlarfg_(&i__2, &a_ref(i__ - 1, i__), &a_ref(1, i__), &c__1, & tau[i__ - 1]); e[i__ - 1] = a_ref(i__ - 1, i__); a_ref(i__ - 1, i__) = 1.; /* Compute W(1:i-1,i) */ i__2 = i__ - 1; dsymv_("Upper", &i__2, &c_b6, &a[a_offset], lda, &a_ref(1, i__), &c__1, &c_b16, &w_ref(1, iw), &c__1); if (i__ < *n) { i__2 = i__ - 1; i__3 = *n - i__; dgemv_("Transpose", &i__2, &i__3, &c_b6, &w_ref(1, iw + 1) , ldw, &a_ref(1, i__), &c__1, &c_b16, &w_ref(i__ + 1, iw), &c__1); i__2 = i__ - 1; i__3 = *n - i__; dgemv_("No transpose", &i__2, &i__3, &c_b5, &a_ref(1, i__ + 1), lda, &w_ref(i__ + 1, iw), &c__1, &c_b6, & w_ref(1, iw), &c__1); i__2 = i__ - 1; i__3 = *n - i__; dgemv_("Transpose", &i__2, &i__3, &c_b6, &a_ref(1, i__ + 1), lda, &a_ref(1, i__), &c__1, &c_b16, &w_ref( i__ + 1, iw), &c__1); i__2 = i__ - 1; i__3 = *n - i__; dgemv_("No transpose", &i__2, &i__3, &c_b5, &w_ref(1, iw + 1), ldw, &w_ref(i__ + 1, iw), &c__1, &c_b6, & w_ref(1, iw), &c__1); } i__2 = i__ - 1; dscal_(&i__2, &tau[i__ - 1], &w_ref(1, iw), &c__1); i__2 = i__ - 1; alpha = tau[i__ - 1] * -.5 * ddot_(&i__2, &w_ref(1, iw), & c__1, &a_ref(1, i__), &c__1); i__2 = i__ - 1; daxpy_(&i__2, &alpha, &a_ref(1, i__), &c__1, &w_ref(1, iw), & c__1); } /* L10: */ } } else { /* Reduce first NB columns of lower triangle */ i__1 = *nb; for (i__ = 1; i__ <= i__1; ++i__) { /* Update A(i:n,i) */ i__2 = *n - i__ + 1; i__3 = i__ - 1; dgemv_("No transpose", &i__2, &i__3, &c_b5, &a_ref(i__, 1), lda, & w_ref(i__, 1), ldw, &c_b6, &a_ref(i__, i__), &c__1); i__2 = *n - i__ + 1; i__3 = i__ - 1; dgemv_("No transpose", &i__2, &i__3, &c_b5, &w_ref(i__, 1), ldw, & a_ref(i__, 1), lda, &c_b6, &a_ref(i__, i__), &c__1); if (i__ < *n) { /* Generate elementary reflector H(i) to annihilate A(i+2:n,i) Computing MIN */ i__2 = i__ + 2; i__3 = *n - i__; dlarfg_(&i__3, &a_ref(i__ + 1, i__), &a_ref(min(i__2,*n), i__) , &c__1, &tau[i__]); e[i__] = a_ref(i__ + 1, i__); a_ref(i__ + 1, i__) = 1.; /* Compute W(i+1:n,i) */ i__2 = *n - i__; dsymv_("Lower", &i__2, &c_b6, &a_ref(i__ + 1, i__ + 1), lda, & a_ref(i__ + 1, i__), &c__1, &c_b16, &w_ref(i__ + 1, i__), &c__1); i__2 = *n - i__; i__3 = i__ - 1; dgemv_("Transpose", &i__2, &i__3, &c_b6, &w_ref(i__ + 1, 1), ldw, &a_ref(i__ + 1, i__), &c__1, &c_b16, &w_ref(1, i__), &c__1); i__2 = *n - i__; i__3 = i__ - 1; dgemv_("No transpose", &i__2, &i__3, &c_b5, &a_ref(i__ + 1, 1) , lda, &w_ref(1, i__), &c__1, &c_b6, &w_ref(i__ + 1, i__), &c__1); i__2 = *n - i__; i__3 = i__ - 1; dgemv_("Transpose", &i__2, &i__3, &c_b6, &a_ref(i__ + 1, 1), lda, &a_ref(i__ + 1, i__), &c__1, &c_b16, &w_ref(1, i__), &c__1); i__2 = *n - i__; i__3 = i__ - 1; dgemv_("No transpose", &i__2, &i__3, &c_b5, &w_ref(i__ + 1, 1) , ldw, &w_ref(1, i__), &c__1, &c_b6, &w_ref(i__ + 1, i__), &c__1); i__2 = *n - i__; dscal_(&i__2, &tau[i__], &w_ref(i__ + 1, i__), &c__1); i__2 = *n - i__; alpha = tau[i__] * -.5 * ddot_(&i__2, &w_ref(i__ + 1, i__), & c__1, &a_ref(i__ + 1, i__), &c__1); i__2 = *n - i__; daxpy_(&i__2, &alpha, &a_ref(i__ + 1, i__), &c__1, &w_ref(i__ + 1, i__), &c__1); } /* L20: */ } } return 0; /* End of DLATRD */ } /* dlatrd_ */ #undef w_ref #undef a_ref #ifdef __cplusplus } #endif hypre-2.33.0/src/lapack/dorg2l.c000066400000000000000000000102141477326011500163110ustar00rootroot00000000000000/* Copyright (c) 1992-2008 The University of Tennessee. All rights reserved. * See file COPYING in this directory for details. */ #ifdef __cplusplus extern "C" { #endif #include "f2c.h" #include "hypre_lapack.h" /* Subroutine */ integer dorg2l_(integer *m, integer *n, integer *k, doublereal * a, integer *lda, doublereal *tau, doublereal *work, integer *info) { /* -- LAPACK routine (version 3.0) -- Univ. of Tennessee, Univ. of California Berkeley, NAG Ltd., Courant Institute, Argonne National Lab, and Rice University February 29, 1992 Purpose ======= DORG2L generates an m by n real matrix Q with orthonormal columns, which is defined as the last n columns of a product of k elementary reflectors of order m Q = H(k) . . . H(2) H(1) as returned by DGEQLF. Arguments ========= M (input) INTEGER The number of rows of the matrix Q. M >= 0. N (input) INTEGER The number of columns of the matrix Q. M >= N >= 0. K (input) INTEGER The number of elementary reflectors whose product defines the matrix Q. N >= K >= 0. A (input/output) DOUBLE PRECISION array, dimension (LDA,N) On entry, the (n-k+i)-th column must contain the vector which defines the elementary reflector H(i), for i = 1,2,...,k, as returned by DGEQLF in the last k columns of its array argument A. On exit, the m by n matrix Q. LDA (input) INTEGER The first dimension of the array A. LDA >= max(1,M). TAU (input) DOUBLE PRECISION array, dimension (K) TAU(i) must contain the scalar factor of the elementary reflector H(i), as returned by DGEQLF. WORK (workspace) DOUBLE PRECISION array, dimension (N) INFO (output) INTEGER = 0: successful exit < 0: if INFO = -i, the i-th argument has an illegal value ===================================================================== Test the input arguments Parameter adjustments */ /* Table of constant values */ integer c__1 = 1; /* System generated locals */ integer a_dim1, a_offset, i__1, i__2, i__3; doublereal d__1; /* Local variables */ integer i__, j, l; extern /* Subroutine */ integer dscal_(integer *, doublereal *, doublereal *, integer *), dlarf_(const char *, integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *, doublereal *); integer ii; extern /* Subroutine */ integer xerbla_(const char *, integer *); #define a_ref(a_1,a_2) a[(a_2)*a_dim1 + a_1] a_dim1 = *lda; a_offset = 1 + a_dim1 * 1; a -= a_offset; --tau; --work; /* Function Body */ *info = 0; if (*m < 0) { *info = -1; } else if (*n < 0 || *n > *m) { *info = -2; } else if (*k < 0 || *k > *n) { *info = -3; } else if (*lda < max(1,*m)) { *info = -5; } if (*info != 0) { i__1 = -(*info); xerbla_("DORG2L", &i__1); return 0; } /* Quick return if possible */ if (*n <= 0) { return 0; } /* Initialise columns 1:n-k to columns of the unit matrix */ i__1 = *n - *k; for (j = 1; j <= i__1; ++j) { i__2 = *m; for (l = 1; l <= i__2; ++l) { a_ref(l, j) = 0.; /* L10: */ } a_ref(*m - *n + j, j) = 1.; /* L20: */ } i__1 = *k; for (i__ = 1; i__ <= i__1; ++i__) { ii = *n - *k + i__; /* Apply H(i) to A(1:m-k+i,1:n-k+i) from the left */ a_ref(*m - *n + ii, ii) = 1.; i__2 = *m - *n + ii; i__3 = ii - 1; dlarf_("Left", &i__2, &i__3, &a_ref(1, ii), &c__1, &tau[i__], &a[ a_offset], lda, &work[1]); i__2 = *m - *n + ii - 1; d__1 = -tau[i__]; dscal_(&i__2, &d__1, &a_ref(1, ii), &c__1); a_ref(*m - *n + ii, ii) = 1. - tau[i__]; /* Set A(m-k+i+1:m,n-k+i) to zero */ i__2 = *m; for (l = *m - *n + ii + 1; l <= i__2; ++l) { a_ref(l, ii) = 0.; /* L30: */ } /* L40: */ } return 0; /* End of DORG2L */ } /* dorg2l_ */ #undef a_ref #ifdef __cplusplus } #endif hypre-2.33.0/src/lapack/dorg2r.c000066400000000000000000000077211477326011500163300ustar00rootroot00000000000000/* Copyright (c) 1992-2008 The University of Tennessee. All rights reserved. * See file COPYING in this directory for details. */ #ifdef __cplusplus extern "C" { #endif #include "f2c.h" #include "hypre_lapack.h" /* Subroutine */ integer dorg2r_(integer *m, integer *n, integer *k, doublereal * a, integer *lda, doublereal *tau, doublereal *work, integer *info) { /* -- LAPACK routine (version 3.0) -- Univ. of Tennessee, Univ. of California Berkeley, NAG Ltd., Courant Institute, Argonne National Lab, and Rice University February 29, 1992 Purpose ======= DORG2R generates an m by n real matrix Q with orthonormal columns, which is defined as the first n columns of a product of k elementary reflectors of order m Q = H(1) H(2) . . . H(k) as returned by DGEQRF. Arguments ========= M (input) INTEGER The number of rows of the matrix Q. M >= 0. N (input) INTEGER The number of columns of the matrix Q. M >= N >= 0. K (input) INTEGER The number of elementary reflectors whose product defines the matrix Q. N >= K >= 0. A (input/output) DOUBLE PRECISION array, dimension (LDA,N) On entry, the i-th column must contain the vector which defines the elementary reflector H(i), for i = 1,2,...,k, as returned by DGEQRF in the first k columns of its array argument A. On exit, the m-by-n matrix Q. LDA (input) INTEGER The first dimension of the array A. LDA >= max(1,M). TAU (input) DOUBLE PRECISION array, dimension (K) TAU(i) must contain the scalar factor of the elementary reflector H(i), as returned by DGEQRF. WORK (workspace) DOUBLE PRECISION array, dimension (N) INFO (output) INTEGER = 0: successful exit < 0: if INFO = -i, the i-th argument has an illegal value ===================================================================== Test the input arguments Parameter adjustments */ /* Table of constant values */ integer c__1 = 1; /* System generated locals */ integer a_dim1, a_offset, i__1, i__2; doublereal d__1; /* Local variables */ integer i__, j, l; extern /* Subroutine */ integer dscal_(integer *, doublereal *, doublereal *, integer *), dlarf_(const char *, integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *, doublereal *), xerbla_(const char *, integer *); #define a_ref(a_1,a_2) a[(a_2)*a_dim1 + a_1] a_dim1 = *lda; a_offset = 1 + a_dim1 * 1; a -= a_offset; --tau; --work; /* Function Body */ *info = 0; if (*m < 0) { *info = -1; } else if (*n < 0 || *n > *m) { *info = -2; } else if (*k < 0 || *k > *n) { *info = -3; } else if (*lda < max(1,*m)) { *info = -5; } if (*info != 0) { i__1 = -(*info); xerbla_("DORG2R", &i__1); return 0; } /* Quick return if possible */ if (*n <= 0) { return 0; } /* Initialise columns k+1:n to columns of the unit matrix */ i__1 = *n; for (j = *k + 1; j <= i__1; ++j) { i__2 = *m; for (l = 1; l <= i__2; ++l) { a_ref(l, j) = 0.; /* L10: */ } a_ref(j, j) = 1.; /* L20: */ } for (i__ = *k; i__ >= 1; --i__) { /* Apply H(i) to A(i:m,i:n) from the left */ if (i__ < *n) { a_ref(i__, i__) = 1.; i__1 = *m - i__ + 1; i__2 = *n - i__; dlarf_("Left", &i__1, &i__2, &a_ref(i__, i__), &c__1, &tau[i__], & a_ref(i__, i__ + 1), lda, &work[1]); } if (i__ < *m) { i__1 = *m - i__; d__1 = -tau[i__]; dscal_(&i__1, &d__1, &a_ref(i__ + 1, i__), &c__1); } a_ref(i__, i__) = 1. - tau[i__]; /* Set A(1:i-1,i) to zero */ i__1 = i__ - 1; for (l = 1; l <= i__1; ++l) { a_ref(l, i__) = 0.; /* L30: */ } /* L40: */ } return 0; /* End of DORG2R */ } /* dorg2r_ */ #undef a_ref #ifdef __cplusplus } #endif hypre-2.33.0/src/lapack/dorgbr.c000066400000000000000000000176161477326011500164140ustar00rootroot00000000000000/* Copyright (c) 1992-2008 The University of Tennessee. All rights reserved. * See file COPYING in this directory for details. */ #ifdef __cplusplus extern "C" { #endif #include "f2c.h" #include "hypre_lapack.h" /* Subroutine */ integer dorgbr_(const char *vect, integer *m, integer *n, integer *k, doublereal *a, integer *lda, doublereal *tau, doublereal *work, integer *lwork, integer *info) { /* -- LAPACK routine (version 3.0) -- Univ. of Tennessee, Univ. of California Berkeley, NAG Ltd., Courant Institute, Argonne National Lab, and Rice University June 30, 1999 Purpose ======= DORGBR generates one of the real orthogonal matrices Q or P**T determined by DGEBRD when reducing a real matrix A to bidiagonal form: A = Q * B * P**T. Q and P**T are defined as products of elementary reflectors H(i) or G(i) respectively. If VECT = 'Q', A is assumed to have been an M-by-K matrix, and Q is of order M: if m >= k, Q = H(1) H(2) . . . H(k) and DORGBR returns the first n columns of Q, where m >= n >= k; if m < k, Q = H(1) H(2) . . . H(m-1) and DORGBR returns Q as an M-by-M matrix. If VECT = 'P', A is assumed to have been a K-by-N matrix, and P**T is of order N: if k < n, P**T = G(k) . . . G(2) G(1) and DORGBR returns the first m rows of P**T, where n >= m >= k; if k >= n, P**T = G(n-1) . . . G(2) G(1) and DORGBR returns P**T as an N-by-N matrix. Arguments ========= VECT (input) CHARACTER*1 Specifies whether the matrix Q or the matrix P**T is required, as defined in the transformation applied by DGEBRD: = 'Q': generate Q; = 'P': generate P**T. M (input) INTEGER The number of rows of the matrix Q or P**T to be returned. M >= 0. N (input) INTEGER The number of columns of the matrix Q or P**T to be returned. N >= 0. If VECT = 'Q', M >= N >= min(M,K); if VECT = 'P', N >= M >= min(N,K). K (input) INTEGER If VECT = 'Q', the number of columns in the original M-by-K matrix reduced by DGEBRD. If VECT = 'P', the number of rows in the original K-by-N matrix reduced by DGEBRD. K >= 0. A (input/output) DOUBLE PRECISION array, dimension (LDA,N) On entry, the vectors which define the elementary reflectors, as returned by DGEBRD. On exit, the M-by-N matrix Q or P**T. LDA (input) INTEGER The leading dimension of the array A. LDA >= max(1,M). TAU (input) DOUBLE PRECISION array, dimension (min(M,K)) if VECT = 'Q' (min(N,K)) if VECT = 'P' TAU(i) must contain the scalar factor of the elementary reflector H(i) or G(i), which determines Q or P**T, as returned by DGEBRD in its array argument TAUQ or TAUP. WORK (workspace/output) DOUBLE PRECISION array, dimension (LWORK) On exit, if INFO = 0, WORK(1) returns the optimal LWORK. LWORK (input) INTEGER The dimension of the array WORK. LWORK >= max(1,min(M,N)). For optimum performance LWORK >= min(M,N)*NB, where NB is the optimal blocksize. If LWORK = -1, then a workspace query is assumed; the routine only calculates the optimal size of the WORK array, returns this value as the first entry of the WORK array, and no error message related to LWORK is issued by XERBLA. INFO (output) INTEGER = 0: successful exit < 0: if INFO = -i, the i-th argument had an illegal value ===================================================================== Test the input arguments Parameter adjustments */ /* Table of constant values */ integer c__1 = 1; integer c_n1 = -1; /* System generated locals */ integer a_dim1, a_offset, i__1, i__2, i__3; /* Local variables */ integer i__, j; extern logical lsame_(const char *,const char *); integer iinfo; logical wantq; integer nb, mn; extern /* Subroutine */ integer xerbla_(const char *, integer *); extern integer ilaenv_(integer *,const char *,const char *, integer *, integer *, integer *, integer *, ftnlen, ftnlen); extern /* Subroutine */ integer dorglq_(integer *, integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *, integer *), dorgqr_(integer *, integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *, integer *); integer lwkopt; logical lquery; #define a_ref(a_1,a_2) a[(a_2)*a_dim1 + a_1] a_dim1 = *lda; a_offset = 1 + a_dim1 * 1; a -= a_offset; --tau; --work; /* Function Body */ *info = 0; wantq = lsame_(vect, "Q"); mn = min(*m,*n); lquery = *lwork == -1; if (! wantq && ! lsame_(vect, "P")) { *info = -1; } else if (*m < 0) { *info = -2; } else if (*n < 0 || ((wantq) && (*n > *m || *n < min(*m,*k))) || ((! wantq) && (*m > *n || *m < min(*n,*k)))) { *info = -3; } else if (*k < 0) { *info = -4; } else if (*lda < max(1,*m)) { *info = -6; } else if (*lwork < max(1,mn) && ! lquery) { *info = -9; } if (*info == 0) { if (wantq) { nb = ilaenv_(&c__1, "DORGQR", " ", m, n, k, &c_n1, (ftnlen)6, ( ftnlen)1); } else { nb = ilaenv_(&c__1, "DORGLQ", " ", m, n, k, &c_n1, (ftnlen)6, ( ftnlen)1); } lwkopt = max(1,mn) * nb; work[1] = (doublereal) lwkopt; } if (*info != 0) { i__1 = -(*info); xerbla_("DORGBR", &i__1); return 0; } else if (lquery) { return 0; } /* Quick return if possible */ if (*m == 0 || *n == 0) { work[1] = 1.; return 0; } if (wantq) { /* Form Q, determined by a call to DGEBRD to reduce an m-by-k matrix */ if (*m >= *k) { /* If m >= k, assume m >= n >= k */ dorgqr_(m, n, k, &a[a_offset], lda, &tau[1], &work[1], lwork, & iinfo); } else { /* If m < k, assume m = n Shift the vectors which define the elementary reflectors one column to the right, and set the first row and column of Q to those of the unit matrix */ for (j = *m; j >= 2; --j) { a_ref(1, j) = 0.; i__1 = *m; for (i__ = j + 1; i__ <= i__1; ++i__) { a_ref(i__, j) = a_ref(i__, j - 1); /* L10: */ } /* L20: */ } a_ref(1, 1) = 1.; i__1 = *m; for (i__ = 2; i__ <= i__1; ++i__) { a_ref(i__, 1) = 0.; /* L30: */ } if (*m > 1) { /* Form Q(2:m,2:m) */ i__1 = *m - 1; i__2 = *m - 1; i__3 = *m - 1; dorgqr_(&i__1, &i__2, &i__3, &a_ref(2, 2), lda, &tau[1], & work[1], lwork, &iinfo); } } } else { /* Form P', determined by a call to DGEBRD to reduce a k-by-n matrix */ if (*k < *n) { /* If k < n, assume k <= m <= n */ dorglq_(m, n, k, &a[a_offset], lda, &tau[1], &work[1], lwork, & iinfo); } else { /* If k >= n, assume m = n Shift the vectors which define the elementary reflectors one row downward, and set the first row and column of P' to those of the unit matrix */ a_ref(1, 1) = 1.; i__1 = *n; for (i__ = 2; i__ <= i__1; ++i__) { a_ref(i__, 1) = 0.; /* L40: */ } i__1 = *n; for (j = 2; j <= i__1; ++j) { for (i__ = j - 1; i__ >= 2; --i__) { a_ref(i__, j) = a_ref(i__ - 1, j); /* L50: */ } a_ref(1, j) = 0.; /* L60: */ } if (*n > 1) { /* Form P'(2:n,2:n) */ i__1 = *n - 1; i__2 = *n - 1; i__3 = *n - 1; dorglq_(&i__1, &i__2, &i__3, &a_ref(2, 2), lda, &tau[1], & work[1], lwork, &iinfo); } } } work[1] = (doublereal) lwkopt; return 0; /* End of DORGBR */ } /* dorgbr_ */ #undef a_ref #ifdef __cplusplus } #endif hypre-2.33.0/src/lapack/dorgl2.c000066400000000000000000000076371477326011500163300ustar00rootroot00000000000000/* Copyright (c) 1992-2008 The University of Tennessee. All rights reserved. * See file COPYING in this directory for details. */ #ifdef __cplusplus extern "C" { #endif #include "f2c.h" #include "hypre_lapack.h" /* Subroutine */ integer dorgl2_(integer *m, integer *n, integer *k, doublereal * a, integer *lda, doublereal *tau, doublereal *work, integer *info) { /* -- LAPACK routine (version 3.0) -- Univ. of Tennessee, Univ. of California Berkeley, NAG Ltd., Courant Institute, Argonne National Lab, and Rice University June 30, 1999 Purpose ======= DORGL2 generates an m by n real matrix Q with orthonormal rows, which is defined as the first m rows of a product of k elementary reflectors of order n Q = H(k) . . . H(2) H(1) as returned by DGELQF. Arguments ========= M (input) INTEGER The number of rows of the matrix Q. M >= 0. N (input) INTEGER The number of columns of the matrix Q. N >= M. K (input) INTEGER The number of elementary reflectors whose product defines the matrix Q. M >= K >= 0. A (input/output) DOUBLE PRECISION array, dimension (LDA,N) On entry, the i-th row must contain the vector which defines the elementary reflector H(i), for i = 1,2,...,k, as returned by DGELQF in the first k rows of its array argument A. On exit, the m-by-n matrix Q. LDA (input) INTEGER The first dimension of the array A. LDA >= max(1,M). TAU (input) DOUBLE PRECISION array, dimension (K) TAU(i) must contain the scalar factor of the elementary reflector H(i), as returned by DGELQF. WORK (workspace) DOUBLE PRECISION array, dimension (M) INFO (output) INTEGER = 0: successful exit < 0: if INFO = -i, the i-th argument has an illegal value ===================================================================== Test the input arguments Parameter adjustments */ /* System generated locals */ integer a_dim1, a_offset, i__1, i__2; doublereal d__1; /* Local variables */ integer i__, j, l; extern /* Subroutine */ integer dscal_(integer *, doublereal *, doublereal *, integer *), dlarf_(const char *, integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *, doublereal *), xerbla_(const char *, integer *); #define a_ref(a_1,a_2) a[(a_2)*a_dim1 + a_1] a_dim1 = *lda; a_offset = 1 + a_dim1 * 1; a -= a_offset; --tau; --work; /* Function Body */ *info = 0; if (*m < 0) { *info = -1; } else if (*n < *m) { *info = -2; } else if (*k < 0 || *k > *m) { *info = -3; } else if (*lda < max(1,*m)) { *info = -5; } if (*info != 0) { i__1 = -(*info); xerbla_("DORGL2", &i__1); return 0; } /* Quick return if possible */ if (*m <= 0) { return 0; } if (*k < *m) { /* Initialise rows k+1:m to rows of the unit matrix */ i__1 = *n; for (j = 1; j <= i__1; ++j) { i__2 = *m; for (l = *k + 1; l <= i__2; ++l) { a_ref(l, j) = 0.; /* L10: */ } if (j > *k && j <= *m) { a_ref(j, j) = 1.; } /* L20: */ } } for (i__ = *k; i__ >= 1; --i__) { /* Apply H(i) to A(i:m,i:n) from the right */ if (i__ < *n) { if (i__ < *m) { a_ref(i__, i__) = 1.; i__1 = *m - i__; i__2 = *n - i__ + 1; dlarf_("Right", &i__1, &i__2, &a_ref(i__, i__), lda, &tau[i__] , &a_ref(i__ + 1, i__), lda, &work[1]); } i__1 = *n - i__; d__1 = -tau[i__]; dscal_(&i__1, &d__1, &a_ref(i__, i__ + 1), lda); } a_ref(i__, i__) = 1. - tau[i__]; /* Set A(i,1:i-1) to zero */ i__1 = i__ - 1; for (l = 1; l <= i__1; ++l) { a_ref(i__, l) = 0.; /* L30: */ } /* L40: */ } return 0; /* End of DORGL2 */ } /* dorgl2_ */ #undef a_ref #ifdef __cplusplus } #endif hypre-2.33.0/src/lapack/dorglq.c000066400000000000000000000162731477326011500164230ustar00rootroot00000000000000/* Copyright (c) 1992-2008 The University of Tennessee. All rights reserved. * See file COPYING in this directory for details. */ #ifdef __cplusplus extern "C" { #endif #include "f2c.h" #include "hypre_lapack.h" /* Subroutine */ integer dorglq_(integer *m, integer *n, integer *k, doublereal * a, integer *lda, doublereal *tau, doublereal *work, integer *lwork, integer *info) { /* -- LAPACK routine (version 3.0) -- Univ. of Tennessee, Univ. of California Berkeley, NAG Ltd., Courant Institute, Argonne National Lab, and Rice University June 30, 1999 Purpose ======= DORGLQ generates an M-by-N real matrix Q with orthonormal rows, which is defined as the first M rows of a product of K elementary reflectors of order N Q = H(k) . . . H(2) H(1) as returned by DGELQF. Arguments ========= M (input) INTEGER The number of rows of the matrix Q. M >= 0. N (input) INTEGER The number of columns of the matrix Q. N >= M. K (input) INTEGER The number of elementary reflectors whose product defines the matrix Q. M >= K >= 0. A (input/output) DOUBLE PRECISION array, dimension (LDA,N) On entry, the i-th row must contain the vector which defines the elementary reflector H(i), for i = 1,2,...,k, as returned by DGELQF in the first k rows of its array argument A. On exit, the M-by-N matrix Q. LDA (input) INTEGER The first dimension of the array A. LDA >= max(1,M). TAU (input) DOUBLE PRECISION array, dimension (K) TAU(i) must contain the scalar factor of the elementary reflector H(i), as returned by DGELQF. WORK (workspace/output) DOUBLE PRECISION array, dimension (LWORK) On exit, if INFO = 0, WORK(1) returns the optimal LWORK. LWORK (input) INTEGER The dimension of the array WORK. LWORK >= max(1,M). For optimum performance LWORK >= M*NB, where NB is the optimal blocksize. If LWORK = -1, then a workspace query is assumed; the routine only calculates the optimal size of the WORK array, returns this value as the first entry of the WORK array, and no error message related to LWORK is issued by XERBLA. INFO (output) INTEGER = 0: successful exit < 0: if INFO = -i, the i-th argument has an illegal value ===================================================================== Test the input arguments Parameter adjustments */ /* Table of constant values */ integer c__1 = 1; integer c_n1 = -1; integer c__3 = 3; integer c__2 = 2; /* System generated locals */ integer a_dim1, a_offset, i__1, i__2, i__3; /* Local variables */ integer i__, j, l, nbmin, iinfo; extern /* Subroutine */ integer dorgl2_(integer *, integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *); integer ib, nb, ki, kk; extern /* Subroutine */ integer dlarfb_(const char *,const char *,const char *,const char *, integer *, integer *, integer *, doublereal *, integer *, doublereal *, integer *, doublereal *, integer *, doublereal *, integer *); integer nx; extern /* Subroutine */ integer dlarft_(const char *,const char *, integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *), xerbla_(const char *, integer *); extern integer ilaenv_(integer *,const char *,const char *, integer *, integer *, integer *, integer *, ftnlen, ftnlen); integer ldwork, lwkopt; logical lquery; integer iws; #define a_ref(a_1,a_2) a[(a_2)*a_dim1 + a_1] a_dim1 = *lda; a_offset = 1 + a_dim1 * 1; a -= a_offset; --tau; --work; /* Function Body */ *info = 0; nb = ilaenv_(&c__1, "DORGLQ", " ", m, n, k, &c_n1, (ftnlen)6, (ftnlen)1); lwkopt = max(1,*m) * nb; work[1] = (doublereal) lwkopt; lquery = *lwork == -1; if (*m < 0) { *info = -1; } else if (*n < *m) { *info = -2; } else if (*k < 0 || *k > *m) { *info = -3; } else if (*lda < max(1,*m)) { *info = -5; } else if (*lwork < max(1,*m) && ! lquery) { *info = -8; } if (*info != 0) { i__1 = -(*info); xerbla_("DORGLQ", &i__1); return 0; } else if (lquery) { return 0; } /* Quick return if possible */ if (*m <= 0) { work[1] = 1.; return 0; } nbmin = 2; nx = 0; iws = *m; if (nb > 1 && nb < *k) { /* Determine when to cross over from blocked to unblocked code. Computing MAX */ i__1 = 0, i__2 = ilaenv_(&c__3, "DORGLQ", " ", m, n, k, &c_n1, ( ftnlen)6, (ftnlen)1); nx = max(i__1,i__2); if (nx < *k) { /* Determine if workspace is large enough for blocked code. */ ldwork = *m; iws = ldwork * nb; if (*lwork < iws) { /* Not enough workspace to use optimal NB: reduce NB and determine the minimum value of NB. */ nb = *lwork / ldwork; /* Computing MAX */ i__1 = 2, i__2 = ilaenv_(&c__2, "DORGLQ", " ", m, n, k, &c_n1, (ftnlen)6, (ftnlen)1); nbmin = max(i__1,i__2); } } } if (nb >= nbmin && nb < *k && nx < *k) { /* Use blocked code after the last block. The first kk rows are handled by the block method. */ ki = (*k - nx - 1) / nb * nb; /* Computing MIN */ i__1 = *k, i__2 = ki + nb; kk = min(i__1,i__2); /* Set A(kk+1:m,1:kk) to zero. */ i__1 = kk; for (j = 1; j <= i__1; ++j) { i__2 = *m; for (i__ = kk + 1; i__ <= i__2; ++i__) { a_ref(i__, j) = 0.; /* L10: */ } /* L20: */ } } else { kk = 0; } /* Use unblocked code for the last or only block. */ if (kk < *m) { i__1 = *m - kk; i__2 = *n - kk; i__3 = *k - kk; dorgl2_(&i__1, &i__2, &i__3, &a_ref(kk + 1, kk + 1), lda, &tau[kk + 1] , &work[1], &iinfo); } if (kk > 0) { /* Use blocked code */ i__1 = -nb; for (i__ = ki + 1; i__1 < 0 ? i__ >= 1 : i__ <= 1; i__ += i__1) { /* Computing MIN */ i__2 = nb, i__3 = *k - i__ + 1; ib = min(i__2,i__3); if (i__ + ib <= *m) { /* Form the triangular factor of the block reflector H = H(i) H(i+1) . . . H(i+ib-1) */ i__2 = *n - i__ + 1; dlarft_("Forward", "Rowwise", &i__2, &ib, &a_ref(i__, i__), lda, &tau[i__], &work[1], &ldwork); /* Apply H' to A(i+ib:m,i:n) from the right */ i__2 = *m - i__ - ib + 1; i__3 = *n - i__ + 1; dlarfb_("Right", "Transpose", "Forward", "Rowwise", &i__2, & i__3, &ib, &a_ref(i__, i__), lda, &work[1], &ldwork, & a_ref(i__ + ib, i__), lda, &work[ib + 1], &ldwork); } /* Apply H' to columns i:n of current block */ i__2 = *n - i__ + 1; dorgl2_(&ib, &i__2, &ib, &a_ref(i__, i__), lda, &tau[i__], &work[ 1], &iinfo); /* Set columns 1:i-1 of current block to zero */ i__2 = i__ - 1; for (j = 1; j <= i__2; ++j) { i__3 = i__ + ib - 1; for (l = i__; l <= i__3; ++l) { a_ref(l, j) = 0.; /* L30: */ } /* L40: */ } /* L50: */ } } work[1] = (doublereal) iws; return 0; /* End of DORGLQ */ } /* dorglq_ */ #undef a_ref #ifdef __cplusplus } #endif hypre-2.33.0/src/lapack/dorgql.c000066400000000000000000000165341477326011500164230ustar00rootroot00000000000000/* Copyright (c) 1992-2008 The University of Tennessee. All rights reserved. * See file COPYING in this directory for details. */ #ifdef __cplusplus extern "C" { #endif #include "f2c.h" #include "hypre_lapack.h" /* Subroutine */ integer dorgql_(integer *m, integer *n, integer *k, doublereal * a, integer *lda, doublereal *tau, doublereal *work, integer *lwork, integer *info) { /* -- LAPACK routine (version 3.0) -- Univ. of Tennessee, Univ. of California Berkeley, NAG Ltd., Courant Institute, Argonne National Lab, and Rice University June 30, 1999 Purpose ======= DORGQL generates an M-by-N real matrix Q with orthonormal columns, which is defined as the last N columns of a product of K elementary reflectors of order M Q = H(k) . . . H(2) H(1) as returned by DGEQLF. Arguments ========= M (input) INTEGER The number of rows of the matrix Q. M >= 0. N (input) INTEGER The number of columns of the matrix Q. M >= N >= 0. K (input) INTEGER The number of elementary reflectors whose product defines the matrix Q. N >= K >= 0. A (input/output) DOUBLE PRECISION array, dimension (LDA,N) On entry, the (n-k+i)-th column must contain the vector which defines the elementary reflector H(i), for i = 1,2,...,k, as returned by DGEQLF in the last k columns of its array argument A. On exit, the M-by-N matrix Q. LDA (input) INTEGER The first dimension of the array A. LDA >= max(1,M). TAU (input) DOUBLE PRECISION array, dimension (K) TAU(i) must contain the scalar factor of the elementary reflector H(i), as returned by DGEQLF. WORK (workspace/output) DOUBLE PRECISION array, dimension (LWORK) On exit, if INFO = 0, WORK(1) returns the optimal LWORK. LWORK (input) INTEGER The dimension of the array WORK. LWORK >= max(1,N). For optimum performance LWORK >= N*NB, where NB is the optimal blocksize. If LWORK = -1, then a workspace query is assumed; the routine only calculates the optimal size of the WORK array, returns this value as the first entry of the WORK array, and no error message related to LWORK is issued by XERBLA. INFO (output) INTEGER = 0: successful exit < 0: if INFO = -i, the i-th argument has an illegal value ===================================================================== Test the input arguments Parameter adjustments */ /* Table of constant values */ integer c__1 = 1; integer c_n1 = -1; integer c__3 = 3; integer c__2 = 2; /* System generated locals */ integer a_dim1, a_offset, i__1, i__2, i__3, i__4; /* Local variables */ integer i__, j, l, nbmin, iinfo; extern /* Subroutine */ integer dorg2l_(integer *, integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *); integer ib, nb, kk; extern /* Subroutine */ integer dlarfb_(const char *,const char *,const char *,const char *, integer *, integer *, integer *, doublereal *, integer *, doublereal *, integer *, doublereal *, integer *, doublereal *, integer *); integer nx; extern /* Subroutine */ integer dlarft_(const char *,const char *, integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *), xerbla_(const char *, integer *); extern integer ilaenv_(integer *,const char *,const char *, integer *, integer *, integer *, integer *, ftnlen, ftnlen); integer ldwork, lwkopt; logical lquery; integer iws; #define a_ref(a_1,a_2) a[(a_2)*a_dim1 + a_1] a_dim1 = *lda; a_offset = 1 + a_dim1 * 1; a -= a_offset; --tau; --work; /* Function Body */ *info = 0; nb = ilaenv_(&c__1, "DORGQL", " ", m, n, k, &c_n1, (ftnlen)6, (ftnlen)1); lwkopt = max(1,*n) * nb; work[1] = (doublereal) lwkopt; lquery = *lwork == -1; if (*m < 0) { *info = -1; } else if (*n < 0 || *n > *m) { *info = -2; } else if (*k < 0 || *k > *n) { *info = -3; } else if (*lda < max(1,*m)) { *info = -5; } else if (*lwork < max(1,*n) && ! lquery) { *info = -8; } if (*info != 0) { i__1 = -(*info); xerbla_("DORGQL", &i__1); return 0; } else if (lquery) { return 0; } /* Quick return if possible */ if (*n <= 0) { work[1] = 1.; return 0; } nbmin = 2; nx = 0; iws = *n; if (nb > 1 && nb < *k) { /* Determine when to cross over from blocked to unblocked code. Computing MAX */ i__1 = 0, i__2 = ilaenv_(&c__3, "DORGQL", " ", m, n, k, &c_n1, ( ftnlen)6, (ftnlen)1); nx = max(i__1,i__2); if (nx < *k) { /* Determine if workspace is large enough for blocked code. */ ldwork = *n; iws = ldwork * nb; if (*lwork < iws) { /* Not enough workspace to use optimal NB: reduce NB and determine the minimum value of NB. */ nb = *lwork / ldwork; /* Computing MAX */ i__1 = 2, i__2 = ilaenv_(&c__2, "DORGQL", " ", m, n, k, &c_n1, (ftnlen)6, (ftnlen)1); nbmin = max(i__1,i__2); } } } if (nb >= nbmin && nb < *k && nx < *k) { /* Use blocked code after the first block. The last kk columns are handled by the block method. Computing MIN */ i__1 = *k, i__2 = (*k - nx + nb - 1) / nb * nb; kk = min(i__1,i__2); /* Set A(m-kk+1:m,1:n-kk) to zero. */ i__1 = *n - kk; for (j = 1; j <= i__1; ++j) { i__2 = *m; for (i__ = *m - kk + 1; i__ <= i__2; ++i__) { a_ref(i__, j) = 0.; /* L10: */ } /* L20: */ } } else { kk = 0; } /* Use unblocked code for the first or only block. */ i__1 = *m - kk; i__2 = *n - kk; i__3 = *k - kk; dorg2l_(&i__1, &i__2, &i__3, &a[a_offset], lda, &tau[1], &work[1], &iinfo) ; if (kk > 0) { /* Use blocked code */ i__1 = *k; i__2 = nb; for (i__ = *k - kk + 1; i__2 < 0 ? i__ >= i__1 : i__ <= i__1; i__ += i__2) { /* Computing MIN */ i__3 = nb, i__4 = *k - i__ + 1; ib = min(i__3,i__4); if (*n - *k + i__ > 1) { /* Form the triangular factor of the block reflector H = H(i+ib-1) . . . H(i+1) H(i) */ i__3 = *m - *k + i__ + ib - 1; dlarft_("Backward", "Columnwise", &i__3, &ib, &a_ref(1, *n - * k + i__), lda, &tau[i__], &work[1], &ldwork); /* Apply H to A(1:m-k+i+ib-1,1:n-k+i-1) from the left */ i__3 = *m - *k + i__ + ib - 1; i__4 = *n - *k + i__ - 1; dlarfb_("Left", "No transpose", "Backward", "Columnwise", & i__3, &i__4, &ib, &a_ref(1, *n - *k + i__), lda, & work[1], &ldwork, &a[a_offset], lda, &work[ib + 1], & ldwork); } /* Apply H to rows 1:m-k+i+ib-1 of current block */ i__3 = *m - *k + i__ + ib - 1; dorg2l_(&i__3, &ib, &ib, &a_ref(1, *n - *k + i__), lda, &tau[i__], &work[1], &iinfo); /* Set rows m-k+i+ib:m of current block to zero */ i__3 = *n - *k + i__ + ib - 1; for (j = *n - *k + i__; j <= i__3; ++j) { i__4 = *m; for (l = *m - *k + i__ + ib; l <= i__4; ++l) { a_ref(l, j) = 0.; /* L30: */ } /* L40: */ } /* L50: */ } } work[1] = (doublereal) iws; return 0; /* End of DORGQL */ } /* dorgql_ */ #undef a_ref #ifdef __cplusplus } #endif hypre-2.33.0/src/lapack/dorgqr.c000066400000000000000000000163511477326011500164260ustar00rootroot00000000000000/* Copyright (c) 1992-2008 The University of Tennessee. All rights reserved. * See file COPYING in this directory for details. */ #ifdef __cplusplus extern "C" { #endif #include "f2c.h" #include "hypre_lapack.h" /* Subroutine */ integer dorgqr_(integer *m, integer *n, integer *k, doublereal * a, integer *lda, doublereal *tau, doublereal *work, integer *lwork, integer *info) { /* -- LAPACK routine (version 3.0) -- Univ. of Tennessee, Univ. of California Berkeley, NAG Ltd., Courant Institute, Argonne National Lab, and Rice University June 30, 1999 Purpose ======= DORGQR generates an M-by-N real matrix Q with orthonormal columns, which is defined as the first N columns of a product of K elementary reflectors of order M Q = H(1) H(2) . . . H(k) as returned by DGEQRF. Arguments ========= M (input) INTEGER The number of rows of the matrix Q. M >= 0. N (input) INTEGER The number of columns of the matrix Q. M >= N >= 0. K (input) INTEGER The number of elementary reflectors whose product defines the matrix Q. N >= K >= 0. A (input/output) DOUBLE PRECISION array, dimension (LDA,N) On entry, the i-th column must contain the vector which defines the elementary reflector H(i), for i = 1,2,...,k, as returned by DGEQRF in the first k columns of its array argument A. On exit, the M-by-N matrix Q. LDA (input) INTEGER The first dimension of the array A. LDA >= max(1,M). TAU (input) DOUBLE PRECISION array, dimension (K) TAU(i) must contain the scalar factor of the elementary reflector H(i), as returned by DGEQRF. WORK (workspace/output) DOUBLE PRECISION array, dimension (LWORK) On exit, if INFO = 0, WORK(1) returns the optimal LWORK. LWORK (input) INTEGER The dimension of the array WORK. LWORK >= max(1,N). For optimum performance LWORK >= N*NB, where NB is the optimal blocksize. If LWORK = -1, then a workspace query is assumed; the routine only calculates the optimal size of the WORK array, returns this value as the first entry of the WORK array, and no error message related to LWORK is issued by XERBLA. INFO (output) INTEGER = 0: successful exit < 0: if INFO = -i, the i-th argument has an illegal value ===================================================================== Test the input arguments Parameter adjustments */ /* Table of constant values */ integer c__1 = 1; integer c_n1 = -1; integer c__3 = 3; integer c__2 = 2; /* System generated locals */ integer a_dim1, a_offset, i__1, i__2, i__3; /* Local variables */ integer i__, j, l, nbmin, iinfo; extern /* Subroutine */ integer dorg2r_(integer *, integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *); integer ib, nb, ki, kk; extern /* Subroutine */ integer dlarfb_(const char *,const char *,const char *,const char *, integer *, integer *, integer *, doublereal *, integer *, doublereal *, integer *, doublereal *, integer *, doublereal *, integer *); integer nx; extern /* Subroutine */ integer dlarft_(const char *,const char *, integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *), xerbla_(const char *, integer *); extern integer ilaenv_(integer *,const char *,const char *, integer *, integer *, integer *, integer *, ftnlen, ftnlen); integer ldwork, lwkopt; logical lquery; integer iws; #define a_ref(a_1,a_2) a[(a_2)*a_dim1 + a_1] a_dim1 = *lda; a_offset = 1 + a_dim1 * 1; a -= a_offset; --tau; --work; /* Function Body */ *info = 0; nb = ilaenv_(&c__1, "DORGQR", " ", m, n, k, &c_n1, (ftnlen)6, (ftnlen)1); lwkopt = max(1,*n) * nb; work[1] = (doublereal) lwkopt; lquery = *lwork == -1; if (*m < 0) { *info = -1; } else if (*n < 0 || *n > *m) { *info = -2; } else if (*k < 0 || *k > *n) { *info = -3; } else if (*lda < max(1,*m)) { *info = -5; } else if (*lwork < max(1,*n) && ! lquery) { *info = -8; } if (*info != 0) { i__1 = -(*info); xerbla_("DORGQR", &i__1); return 0; } else if (lquery) { return 0; } /* Quick return if possible */ if (*n <= 0) { work[1] = 1.; return 0; } nbmin = 2; nx = 0; iws = *n; if (nb > 1 && nb < *k) { /* Determine when to cross over from blocked to unblocked code. Computing MAX */ i__1 = 0, i__2 = ilaenv_(&c__3, "DORGQR", " ", m, n, k, &c_n1, ( ftnlen)6, (ftnlen)1); nx = max(i__1,i__2); if (nx < *k) { /* Determine if workspace is large enough for blocked code. */ ldwork = *n; iws = ldwork * nb; if (*lwork < iws) { /* Not enough workspace to use optimal NB: reduce NB and determine the minimum value of NB. */ nb = *lwork / ldwork; /* Computing MAX */ i__1 = 2, i__2 = ilaenv_(&c__2, "DORGQR", " ", m, n, k, &c_n1, (ftnlen)6, (ftnlen)1); nbmin = max(i__1,i__2); } } } if (nb >= nbmin && nb < *k && nx < *k) { /* Use blocked code after the last block. The first kk columns are handled by the block method. */ ki = (*k - nx - 1) / nb * nb; /* Computing MIN */ i__1 = *k, i__2 = ki + nb; kk = min(i__1,i__2); /* Set A(1:kk,kk+1:n) to zero. */ i__1 = *n; for (j = kk + 1; j <= i__1; ++j) { i__2 = kk; for (i__ = 1; i__ <= i__2; ++i__) { a_ref(i__, j) = 0.; /* L10: */ } /* L20: */ } } else { kk = 0; } /* Use unblocked code for the last or only block. */ if (kk < *n) { i__1 = *m - kk; i__2 = *n - kk; i__3 = *k - kk; dorg2r_(&i__1, &i__2, &i__3, &a_ref(kk + 1, kk + 1), lda, &tau[kk + 1] , &work[1], &iinfo); } if (kk > 0) { /* Use blocked code */ i__1 = -nb; for (i__ = ki + 1; i__1 < 0 ? i__ >= 1 : i__ <= 1; i__ += i__1) { /* Computing MIN */ i__2 = nb, i__3 = *k - i__ + 1; ib = min(i__2,i__3); if (i__ + ib <= *n) { /* Form the triangular factor of the block reflector H = H(i) H(i+1) . . . H(i+ib-1) */ i__2 = *m - i__ + 1; dlarft_("Forward", "Columnwise", &i__2, &ib, &a_ref(i__, i__), lda, &tau[i__], &work[1], &ldwork); /* Apply H to A(i:m,i+ib:n) from the left */ i__2 = *m - i__ + 1; i__3 = *n - i__ - ib + 1; dlarfb_("Left", "No transpose", "Forward", "Columnwise", & i__2, &i__3, &ib, &a_ref(i__, i__), lda, &work[1], & ldwork, &a_ref(i__, i__ + ib), lda, &work[ib + 1], & ldwork); } /* Apply H to rows i:m of current block */ i__2 = *m - i__ + 1; dorg2r_(&i__2, &ib, &ib, &a_ref(i__, i__), lda, &tau[i__], &work[ 1], &iinfo); /* Set rows 1:i-1 of current block to zero */ i__2 = i__ + ib - 1; for (j = i__; j <= i__2; ++j) { i__3 = i__ - 1; for (l = 1; l <= i__3; ++l) { a_ref(l, j) = 0.; /* L30: */ } /* L40: */ } /* L50: */ } } work[1] = (doublereal) iws; return 0; /* End of DORGQR */ } /* dorgqr_ */ #undef a_ref #ifdef __cplusplus } #endif hypre-2.33.0/src/lapack/dorgtr.c000066400000000000000000000142571477326011500164340ustar00rootroot00000000000000/* Copyright (c) 1992-2008 The University of Tennessee. All rights reserved. * See file COPYING in this directory for details. */ #ifdef __cplusplus extern "C" { #endif #include "f2c.h" #include "hypre_lapack.h" /* Subroutine */ integer dorgtr_(const char *uplo, integer *n, doublereal *a, integer * lda, doublereal *tau, doublereal *work, integer *lwork, integer *info) { /* -- LAPACK routine (version 3.0) -- Univ. of Tennessee, Univ. of California Berkeley, NAG Ltd., Courant Institute, Argonne National Lab, and Rice University June 30, 1999 Purpose ======= DORGTR generates a real orthogonal matrix Q which is defined as the product of n-1 elementary reflectors of order N, as returned by DSYTRD: if UPLO = 'U', Q = H(n-1) . . . H(2) H(1), if UPLO = 'L', Q = H(1) H(2) . . . H(n-1). Arguments ========= UPLO (input) CHARACTER*1 = 'U': Upper triangle of A contains elementary reflectors from DSYTRD; = 'L': Lower triangle of A contains elementary reflectors from DSYTRD. N (input) INTEGER The order of the matrix Q. N >= 0. A (input/output) DOUBLE PRECISION array, dimension (LDA,N) On entry, the vectors which define the elementary reflectors, as returned by DSYTRD. On exit, the N-by-N orthogonal matrix Q. LDA (input) INTEGER The leading dimension of the array A. LDA >= max(1,N). TAU (input) DOUBLE PRECISION array, dimension (N-1) TAU(i) must contain the scalar factor of the elementary reflector H(i), as returned by DSYTRD. WORK (workspace/output) DOUBLE PRECISION array, dimension (LWORK) On exit, if INFO = 0, WORK(1) returns the optimal LWORK. LWORK (input) INTEGER The dimension of the array WORK. LWORK >= max(1,N-1). For optimum performance LWORK >= (N-1)*NB, where NB is the optimal blocksize. If LWORK = -1, then a workspace query is assumed; the routine only calculates the optimal size of the WORK array, returns this value as the first entry of the WORK array, and no error message related to LWORK is issued by XERBLA. INFO (output) INTEGER = 0: successful exit < 0: if INFO = -i, the i-th argument had an illegal value ===================================================================== Test the input arguments Parameter adjustments */ /* Table of constant values */ integer c__1 = 1; integer c_n1 = -1; /* System generated locals */ integer a_dim1, a_offset, i__1, i__2, i__3; /* Local variables */ integer i__, j; extern logical lsame_(const char *,const char *); integer iinfo; logical upper; integer nb; extern /* Subroutine */ integer xerbla_(const char *, integer *); extern integer ilaenv_(integer *,const char *,const char *, integer *, integer *, integer *, integer *, ftnlen, ftnlen); extern /* Subroutine */ integer dorgql_(integer *, integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *, integer *), dorgqr_(integer *, integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *, integer *); integer lwkopt; logical lquery; #define a_ref(a_1,a_2) a[(a_2)*a_dim1 + a_1] a_dim1 = *lda; a_offset = 1 + a_dim1 * 1; a -= a_offset; --tau; --work; /* Function Body */ *info = 0; lquery = *lwork == -1; upper = lsame_(uplo, "U"); if (! upper && ! lsame_(uplo, "L")) { *info = -1; } else if (*n < 0) { *info = -2; } else if (*lda < max(1,*n)) { *info = -4; } else /* if(complicated condition) */ { /* Computing MAX */ i__1 = 1, i__2 = *n - 1; if (*lwork < max(i__1,i__2) && ! lquery) { *info = -7; } } if (*info == 0) { if (upper) { i__1 = *n - 1; i__2 = *n - 1; i__3 = *n - 1; nb = ilaenv_(&c__1, "DORGQL", " ", &i__1, &i__2, &i__3, &c_n1, ( ftnlen)6, (ftnlen)1); } else { i__1 = *n - 1; i__2 = *n - 1; i__3 = *n - 1; nb = ilaenv_(&c__1, "DORGQR", " ", &i__1, &i__2, &i__3, &c_n1, ( ftnlen)6, (ftnlen)1); } /* Computing MAX */ i__1 = 1, i__2 = *n - 1; lwkopt = max(i__1,i__2) * nb; work[1] = (doublereal) lwkopt; } if (*info != 0) { i__1 = -(*info); xerbla_("DORGTR", &i__1); return 0; } else if (lquery) { return 0; } /* Quick return if possible */ if (*n == 0) { work[1] = 1.; return 0; } if (upper) { /* Q was determined by a call to DSYTRD with UPLO = 'U' Shift the vectors which define the elementary reflectors one column to the left, and set the last row and column of Q to those of the unit matrix */ i__1 = *n - 1; for (j = 1; j <= i__1; ++j) { i__2 = j - 1; for (i__ = 1; i__ <= i__2; ++i__) { a_ref(i__, j) = a_ref(i__, j + 1); /* L10: */ } a_ref(*n, j) = 0.; /* L20: */ } i__1 = *n - 1; for (i__ = 1; i__ <= i__1; ++i__) { a_ref(i__, *n) = 0.; /* L30: */ } a_ref(*n, *n) = 1.; /* Generate Q(1:n-1,1:n-1) */ i__1 = *n - 1; i__2 = *n - 1; i__3 = *n - 1; dorgql_(&i__1, &i__2, &i__3, &a[a_offset], lda, &tau[1], &work[1], lwork, &iinfo); } else { /* Q was determined by a call to DSYTRD with UPLO = 'L'. Shift the vectors which define the elementary reflectors one column to the right, and set the first row and column of Q to those of the unit matrix */ for (j = *n; j >= 2; --j) { a_ref(1, j) = 0.; i__1 = *n; for (i__ = j + 1; i__ <= i__1; ++i__) { a_ref(i__, j) = a_ref(i__, j - 1); /* L40: */ } /* L50: */ } a_ref(1, 1) = 1.; i__1 = *n; for (i__ = 2; i__ <= i__1; ++i__) { a_ref(i__, 1) = 0.; /* L60: */ } if (*n > 1) { /* Generate Q(2:n,2:n) */ i__1 = *n - 1; i__2 = *n - 1; i__3 = *n - 1; dorgqr_(&i__1, &i__2, &i__3, &a_ref(2, 2), lda, &tau[1], &work[1], lwork, &iinfo); } } work[1] = (doublereal) lwkopt; return 0; /* End of DORGTR */ } /* dorgtr_ */ #undef a_ref #ifdef __cplusplus } #endif hypre-2.33.0/src/lapack/dorm2r.c000066400000000000000000000132341477326011500163320ustar00rootroot00000000000000/* Copyright (c) 1992-2008 The University of Tennessee. All rights reserved. * See file COPYING in this directory for details. */ #ifdef __cplusplus extern "C" { #endif #include "f2c.h" #include "hypre_lapack.h" /* Subroutine */ integer dorm2r_(const char *side,const char *trans, integer *m, integer *n, integer *k, doublereal *a, integer *lda, doublereal *tau, doublereal * c__, integer *ldc, doublereal *work, integer *info) { /* -- LAPACK routine (version 3.0) -- Univ. of Tennessee, Univ. of California Berkeley, NAG Ltd., Courant Institute, Argonne National Lab, and Rice University February 29, 1992 Purpose ======= DORM2R overwrites the general real m by n matrix C with Q * C if SIDE = 'L' and TRANS = 'N', or Q'* C if SIDE = 'L' and TRANS = 'T', or C * Q if SIDE = 'R' and TRANS = 'N', or C * Q' if SIDE = 'R' and TRANS = 'T', where Q is a real orthogonal matrix defined as the product of k elementary reflectors Q = H(1) H(2) . . . H(k) as returned by DGEQRF. Q is of order m if SIDE = 'L' and of order n if SIDE = 'R'. Arguments ========= SIDE (input) CHARACTER*1 = 'L': apply Q or Q' from the Left = 'R': apply Q or Q' from the Right TRANS (input) CHARACTER*1 = 'N': apply Q (No transpose) = 'T': apply Q' (Transpose) M (input) INTEGER The number of rows of the matrix C. M >= 0. N (input) INTEGER The number of columns of the matrix C. N >= 0. K (input) INTEGER The number of elementary reflectors whose product defines the matrix Q. If SIDE = 'L', M >= K >= 0; if SIDE = 'R', N >= K >= 0. A (input) DOUBLE PRECISION array, dimension (LDA,K) The i-th column must contain the vector which defines the elementary reflector H(i), for i = 1,2,...,k, as returned by DGEQRF in the first k columns of its array argument A. A is modified by the routine but restored on exit. LDA (input) INTEGER The leading dimension of the array A. If SIDE = 'L', LDA >= max(1,M); if SIDE = 'R', LDA >= max(1,N). TAU (input) DOUBLE PRECISION array, dimension (K) TAU(i) must contain the scalar factor of the elementary reflector H(i), as returned by DGEQRF. C (input/output) DOUBLE PRECISION array, dimension (LDC,N) On entry, the m by n matrix C. On exit, C is overwritten by Q*C or Q'*C or C*Q' or C*Q. LDC (input) INTEGER The leading dimension of the array C. LDC >= max(1,M). WORK (workspace) DOUBLE PRECISION array, dimension (N) if SIDE = 'L', (M) if SIDE = 'R' INFO (output) INTEGER = 0: successful exit < 0: if INFO = -i, the i-th argument had an illegal value ===================================================================== Test the input arguments Parameter adjustments */ /* Table of constant values */ integer c__1 = 1; /* System generated locals */ integer a_dim1, a_offset, c_dim1, c_offset, i__1, i__2; /* Local variables */ logical left; integer i__; extern /* Subroutine */ integer dlarf_(const char *, integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *, doublereal *); extern logical lsame_(const char *,const char *); integer i1, i2, i3, ic, jc, mi, ni, nq; extern /* Subroutine */ integer xerbla_(const char *, integer *); logical notran; doublereal aii; #define a_ref(a_1,a_2) a[(a_2)*a_dim1 + a_1] #define c___ref(a_1,a_2) c__[(a_2)*c_dim1 + a_1] a_dim1 = *lda; a_offset = 1 + a_dim1 * 1; a -= a_offset; --tau; c_dim1 = *ldc; c_offset = 1 + c_dim1 * 1; c__ -= c_offset; --work; /* Function Body */ *info = 0; left = lsame_(side, "L"); notran = lsame_(trans, "N"); /* NQ is the order of Q */ if (left) { nq = *m; } else { nq = *n; } if (! left && ! lsame_(side, "R")) { *info = -1; } else if (! notran && ! lsame_(trans, "T")) { *info = -2; } else if (*m < 0) { *info = -3; } else if (*n < 0) { *info = -4; } else if (*k < 0 || *k > nq) { *info = -5; } else if (*lda < max(1,nq)) { *info = -7; } else if (*ldc < max(1,*m)) { *info = -10; } if (*info != 0) { i__1 = -(*info); xerbla_("DORM2R", &i__1); return 0; } /* Quick return if possible */ if (*m == 0 || *n == 0 || *k == 0) { return 0; } if ((left && ! notran) || (! left && notran)) { i1 = 1; i2 = *k; i3 = 1; } else { i1 = *k; i2 = 1; i3 = -1; } if (left) { ni = *n; jc = 1; } else { mi = *m; ic = 1; } i__1 = i2; i__2 = i3; for (i__ = i1; i__2 < 0 ? i__ >= i__1 : i__ <= i__1; i__ += i__2) { if (left) { /* H(i) is applied to C(i:m,1:n) */ mi = *m - i__ + 1; ic = i__; } else { /* H(i) is applied to C(1:m,i:n) */ ni = *n - i__ + 1; jc = i__; } /* Apply H(i) */ aii = a_ref(i__, i__); a_ref(i__, i__) = 1.; dlarf_(side, &mi, &ni, &a_ref(i__, i__), &c__1, &tau[i__], &c___ref( ic, jc), ldc, &work[1]); a_ref(i__, i__) = aii; /* L10: */ } return 0; /* End of DORM2R */ } /* dorm2r_ */ #undef c___ref #undef a_ref #ifdef __cplusplus } #endif hypre-2.33.0/src/lapack/dormbr.c000066400000000000000000000237431477326011500164200ustar00rootroot00000000000000/* Copyright (c) 1992-2008 The University of Tennessee. All rights reserved. * See file COPYING in this directory for details. */ #ifdef __cplusplus extern "C" { #endif #include "f2c.h" #include "hypre_lapack.h" /* Subroutine */ integer dormbr_(const char *vect,const char *side,const char *trans, integer *m, integer *n, integer *k, doublereal *a, integer *lda, doublereal *tau, doublereal *c__, integer *ldc, doublereal *work, integer *lwork, integer *info) { /* -- LAPACK routine (version 3.0) -- Univ. of Tennessee, Univ. of California Berkeley, NAG Ltd., Courant Institute, Argonne National Lab, and Rice University June 30, 1999 Purpose ======= If VECT = 'Q', DORMBR overwrites the general real M-by-N matrix C with SIDE = 'L' SIDE = 'R' TRANS = 'N': Q * C C * Q TRANS = 'T': Q**T * C C * Q**T If VECT = 'P', DORMBR overwrites the general real M-by-N matrix C with SIDE = 'L' SIDE = 'R' TRANS = 'N': P * C C * P TRANS = 'T': P**T * C C * P**T Here Q and P**T are the orthogonal matrices determined by DGEBRD when reducing a real matrix A to bidiagonal form: A = Q * B * P**T. Q and P**T are defined as products of elementary reflectors H(i) and G(i) respectively. Let nq = m if SIDE = 'L' and nq = n if SIDE = 'R'. Thus nq is the order of the orthogonal matrix Q or P**T that is applied. If VECT = 'Q', A is assumed to have been an NQ-by-K matrix: if nq >= k, Q = H(1) H(2) . . . H(k); if nq < k, Q = H(1) H(2) . . . H(nq-1). If VECT = 'P', A is assumed to have been a K-by-NQ matrix: if k < nq, P = G(1) G(2) . . . G(k); if k >= nq, P = G(1) G(2) . . . G(nq-1). Arguments ========= VECT (input) CHARACTER*1 = 'Q': apply Q or Q**T; = 'P': apply P or P**T. SIDE (input) CHARACTER*1 = 'L': apply Q, Q**T, P or P**T from the Left; = 'R': apply Q, Q**T, P or P**T from the Right. TRANS (input) CHARACTER*1 = 'N': No transpose, apply Q or P; = 'T': Transpose, apply Q**T or P**T. M (input) INTEGER The number of rows of the matrix C. M >= 0. N (input) INTEGER The number of columns of the matrix C. N >= 0. K (input) INTEGER If VECT = 'Q', the number of columns in the original matrix reduced by DGEBRD. If VECT = 'P', the number of rows in the original matrix reduced by DGEBRD. K >= 0. A (input) DOUBLE PRECISION array, dimension (LDA,min(nq,K)) if VECT = 'Q' (LDA,nq) if VECT = 'P' The vectors which define the elementary reflectors H(i) and G(i), whose products determine the matrices Q and P, as returned by DGEBRD. LDA (input) INTEGER The leading dimension of the array A. If VECT = 'Q', LDA >= max(1,nq); if VECT = 'P', LDA >= max(1,min(nq,K)). TAU (input) DOUBLE PRECISION array, dimension (min(nq,K)) TAU(i) must contain the scalar factor of the elementary reflector H(i) or G(i) which determines Q or P, as returned by DGEBRD in the array argument TAUQ or TAUP. C (input/output) DOUBLE PRECISION array, dimension (LDC,N) On entry, the M-by-N matrix C. On exit, C is overwritten by Q*C or Q**T*C or C*Q**T or C*Q or P*C or P**T*C or C*P or C*P**T. LDC (input) INTEGER The leading dimension of the array C. LDC >= max(1,M). WORK (workspace/output) DOUBLE PRECISION array, dimension (LWORK) On exit, if INFO = 0, WORK(1) returns the optimal LWORK. LWORK (input) INTEGER The dimension of the array WORK. If SIDE = 'L', LWORK >= max(1,N); if SIDE = 'R', LWORK >= max(1,M). For optimum performance LWORK >= N*NB if SIDE = 'L', and LWORK >= M*NB if SIDE = 'R', where NB is the optimal blocksize. If LWORK = -1, then a workspace query is assumed; the routine only calculates the optimal size of the WORK array, returns this value as the first entry of the WORK array, and no error message related to LWORK is issued by XERBLA. INFO (output) INTEGER = 0: successful exit < 0: if INFO = -i, the i-th argument had an illegal value ===================================================================== Test the input arguments Parameter adjustments */ /* Table of constant values */ integer c__1 = 1; integer c_n1 = -1; integer c__2 = 2; /* System generated locals */ address a__1[2]; integer a_dim1, a_offset, c_dim1, c_offset, i__1, i__2, i__3[2]; char ch__1[2]; /* Builtin functions Subroutine */ integer s_cat(char *, char **, integer *, integer *, ftnlen); /* Local variables */ logical left; extern logical lsame_(const char *,const char *); integer iinfo, i1, i2, nb, mi, ni, nq, nw; extern /* Subroutine */ integer xerbla_(const char *, integer *); extern integer ilaenv_(integer *,const char *,const char *, integer *, integer *, integer *, integer *, ftnlen, ftnlen); extern /* Subroutine */ integer dormlq_(const char *,const char *, integer *, integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *, integer *); logical notran; extern /* Subroutine */ integer dormqr_(const char *,const char *, integer *, integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *, integer *); logical applyq; char transt[1]; integer lwkopt; logical lquery; #define a_ref(a_1,a_2) a[(a_2)*a_dim1 + a_1] #define c___ref(a_1,a_2) c__[(a_2)*c_dim1 + a_1] a_dim1 = *lda; a_offset = 1 + a_dim1 * 1; a -= a_offset; --tau; c_dim1 = *ldc; c_offset = 1 + c_dim1 * 1; c__ -= c_offset; --work; /* Function Body */ *info = 0; applyq = lsame_(vect, "Q"); left = lsame_(side, "L"); notran = lsame_(trans, "N"); lquery = *lwork == -1; /* NQ is the order of Q or P and NW is the minimum dimension of WORK */ if (left) { nq = *m; nw = *n; } else { nq = *n; nw = *m; } if (! applyq && ! lsame_(vect, "P")) { *info = -1; } else if (! left && ! lsame_(side, "R")) { *info = -2; } else if (! notran && ! lsame_(trans, "T")) { *info = -3; } else if (*m < 0) { *info = -4; } else if (*n < 0) { *info = -5; } else if (*k < 0) { *info = -6; } else /* if(complicated condition) */ { /* Computing MAX */ i__1 = 1, i__2 = min(nq,*k); if (((applyq) && (*lda < max(1,nq))) || ((! applyq) && (*lda < max(i__1,i__2)))) { *info = -8; } else if (*ldc < max(1,*m)) { *info = -11; } else if (*lwork < max(1,nw) && ! lquery) { *info = -13; } } if (*info == 0) { if (applyq) { if (left) { /* Writing concatenation */ i__3[0] = 1, a__1[0] = (char*)side; i__3[1] = 1, a__1[1] = (char*)trans; s_cat(ch__1, a__1, i__3, &c__2, (ftnlen)2); i__1 = *m - 1; i__2 = *m - 1; nb = ilaenv_(&c__1, "DORMQR", ch__1, &i__1, n, &i__2, &c_n1, ( ftnlen)6, (ftnlen)2); } else { /* Writing concatenation */ i__3[0] = 1, a__1[0] = (char*)side; i__3[1] = 1, a__1[1] = (char*)trans; s_cat(ch__1, a__1, i__3, &c__2, (ftnlen)2); i__1 = *n - 1; i__2 = *n - 1; nb = ilaenv_(&c__1, "DORMQR", ch__1, m, &i__1, &i__2, &c_n1, ( ftnlen)6, (ftnlen)2); } } else { if (left) { /* Writing concatenation */ i__3[0] = 1, a__1[0] = (char*)side; i__3[1] = 1, a__1[1] = (char*)trans; s_cat(ch__1, a__1, i__3, &c__2, (ftnlen)2); i__1 = *m - 1; i__2 = *m - 1; nb = ilaenv_(&c__1, "DORMLQ", ch__1, &i__1, n, &i__2, &c_n1, ( ftnlen)6, (ftnlen)2); } else { /* Writing concatenation */ i__3[0] = 1, a__1[0] = (char*)side; i__3[1] = 1, a__1[1] = (char*)trans; s_cat(ch__1, a__1, i__3, &c__2, (ftnlen)2); i__1 = *n - 1; i__2 = *n - 1; nb = ilaenv_(&c__1, "DORMLQ", ch__1, m, &i__1, &i__2, &c_n1, ( ftnlen)6, (ftnlen)2); } } lwkopt = max(1,nw) * nb; work[1] = (doublereal) lwkopt; } if (*info != 0) { i__1 = -(*info); xerbla_("DORMBR", &i__1); return 0; } else if (lquery) { return 0; } /* Quick return if possible */ work[1] = 1.; if (*m == 0 || *n == 0) { return 0; } if (applyq) { /* Apply Q */ if (nq >= *k) { /* Q was determined by a call to DGEBRD with nq >= k */ dormqr_(side, trans, m, n, k, &a[a_offset], lda, &tau[1], &c__[ c_offset], ldc, &work[1], lwork, &iinfo); } else if (nq > 1) { /* Q was determined by a call to DGEBRD with nq < k */ if (left) { mi = *m - 1; ni = *n; i1 = 2; i2 = 1; } else { mi = *m; ni = *n - 1; i1 = 1; i2 = 2; } i__1 = nq - 1; dormqr_(side, trans, &mi, &ni, &i__1, &a_ref(2, 1), lda, &tau[1], &c___ref(i1, i2), ldc, &work[1], lwork, &iinfo); } } else { /* Apply P */ if (notran) { *(unsigned char *)transt = 'T'; } else { *(unsigned char *)transt = 'N'; } if (nq > *k) { /* P was determined by a call to DGEBRD with nq > k */ dormlq_(side, transt, m, n, k, &a[a_offset], lda, &tau[1], &c__[ c_offset], ldc, &work[1], lwork, &iinfo); } else if (nq > 1) { /* P was determined by a call to DGEBRD with nq <= k */ if (left) { mi = *m - 1; ni = *n; i1 = 2; i2 = 1; } else { mi = *m; ni = *n - 1; i1 = 1; i2 = 2; } i__1 = nq - 1; dormlq_(side, transt, &mi, &ni, &i__1, &a_ref(1, 2), lda, &tau[1], &c___ref(i1, i2), ldc, &work[1], lwork, &iinfo); } } work[1] = (doublereal) lwkopt; return 0; /* End of DORMBR */ } /* dormbr_ */ #undef c___ref #undef a_ref #ifdef __cplusplus } #endif hypre-2.33.0/src/lapack/dorml2.c000066400000000000000000000126751477326011500163340ustar00rootroot00000000000000/* Copyright (c) 1992-2008 The University of Tennessee. All rights reserved. * See file COPYING in this directory for details. */ #ifdef __cplusplus extern "C" { #endif #include "f2c.h" #include "hypre_lapack.h" /* Subroutine */ integer dorml2_(const char *side,const char *trans, integer *m, integer *n, integer *k, doublereal *a, integer *lda, doublereal *tau, doublereal * c__, integer *ldc, doublereal *work, integer *info) { /* -- LAPACK routine (version 3.0) -- Univ. of Tennessee, Univ. of California Berkeley, NAG Ltd., Courant Institute, Argonne National Lab, and Rice University February 29, 1992 Purpose ======= DORML2 overwrites the general real m by n matrix C with Q * C if SIDE = 'L' and TRANS = 'N', or Q'* C if SIDE = 'L' and TRANS = 'T', or C * Q if SIDE = 'R' and TRANS = 'N', or C * Q' if SIDE = 'R' and TRANS = 'T', where Q is a real orthogonal matrix defined as the product of k elementary reflectors Q = H(k) . . . H(2) H(1) as returned by DGELQF. Q is of order m if SIDE = 'L' and of order n if SIDE = 'R'. Arguments ========= SIDE (input) CHARACTER*1 = 'L': apply Q or Q' from the Left = 'R': apply Q or Q' from the Right TRANS (input) CHARACTER*1 = 'N': apply Q (No transpose) = 'T': apply Q' (Transpose) M (input) INTEGER The number of rows of the matrix C. M >= 0. N (input) INTEGER The number of columns of the matrix C. N >= 0. K (input) INTEGER The number of elementary reflectors whose product defines the matrix Q. If SIDE = 'L', M >= K >= 0; if SIDE = 'R', N >= K >= 0. A (input) DOUBLE PRECISION array, dimension (LDA,M) if SIDE = 'L', (LDA,N) if SIDE = 'R' The i-th row must contain the vector which defines the elementary reflector H(i), for i = 1,2,...,k, as returned by DGELQF in the first k rows of its array argument A. A is modified by the routine but restored on exit. LDA (input) INTEGER The leading dimension of the array A. LDA >= max(1,K). TAU (input) DOUBLE PRECISION array, dimension (K) TAU(i) must contain the scalar factor of the elementary reflector H(i), as returned by DGELQF. C (input/output) DOUBLE PRECISION array, dimension (LDC,N) On entry, the m by n matrix C. On exit, C is overwritten by Q*C or Q'*C or C*Q' or C*Q. LDC (input) INTEGER The leading dimension of the array C. LDC >= max(1,M). WORK (workspace) DOUBLE PRECISION array, dimension (N) if SIDE = 'L', (M) if SIDE = 'R' INFO (output) INTEGER = 0: successful exit < 0: if INFO = -i, the i-th argument had an illegal value ===================================================================== Test the input arguments Parameter adjustments */ /* System generated locals */ integer a_dim1, a_offset, c_dim1, c_offset, i__1, i__2; /* Local variables */ logical left; integer i__; extern /* Subroutine */ integer dlarf_(const char *, integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *, doublereal *); extern logical lsame_(const char *,const char *); integer i1, i2, i3, ic, jc, mi, ni, nq; extern /* Subroutine */ integer xerbla_(const char *, integer *); logical notran; doublereal aii; #define a_ref(a_1,a_2) a[(a_2)*a_dim1 + a_1] #define c___ref(a_1,a_2) c__[(a_2)*c_dim1 + a_1] a_dim1 = *lda; a_offset = 1 + a_dim1 * 1; a -= a_offset; --tau; c_dim1 = *ldc; c_offset = 1 + c_dim1 * 1; c__ -= c_offset; --work; /* Function Body */ *info = 0; left = lsame_(side, "L"); notran = lsame_(trans, "N"); /* NQ is the order of Q */ if (left) { nq = *m; } else { nq = *n; } if (! left && ! lsame_(side, "R")) { *info = -1; } else if (! notran && ! lsame_(trans, "T")) { *info = -2; } else if (*m < 0) { *info = -3; } else if (*n < 0) { *info = -4; } else if (*k < 0 || *k > nq) { *info = -5; } else if (*lda < max(1,*k)) { *info = -7; } else if (*ldc < max(1,*m)) { *info = -10; } if (*info != 0) { i__1 = -(*info); xerbla_("DORML2", &i__1); return 0; } /* Quick return if possible */ if (*m == 0 || *n == 0 || *k == 0) { return 0; } if ((left && notran) || (! left && ! notran)) { i1 = 1; i2 = *k; i3 = 1; } else { i1 = *k; i2 = 1; i3 = -1; } if (left) { ni = *n; jc = 1; } else { mi = *m; ic = 1; } i__1 = i2; i__2 = i3; for (i__ = i1; i__2 < 0 ? i__ >= i__1 : i__ <= i__1; i__ += i__2) { if (left) { /* H(i) is applied to C(i:m,1:n) */ mi = *m - i__ + 1; ic = i__; } else { /* H(i) is applied to C(1:m,i:n) */ ni = *n - i__ + 1; jc = i__; } /* Apply H(i) */ aii = a_ref(i__, i__); a_ref(i__, i__) = 1.; dlarf_(side, &mi, &ni, &a_ref(i__, i__), lda, &tau[i__], &c___ref(ic, jc), ldc, &work[1]); a_ref(i__, i__) = aii; /* L10: */ } return 0; /* End of DORML2 */ } /* dorml2_ */ #undef c___ref #undef a_ref #ifdef __cplusplus } #endif hypre-2.33.0/src/lapack/dormlq.c000066400000000000000000000214351477326011500164250ustar00rootroot00000000000000/* Copyright (c) 1992-2008 The University of Tennessee. All rights reserved. * See file COPYING in this directory for details. */ #ifdef __cplusplus extern "C" { #endif #include "f2c.h" #include "hypre_lapack.h" /* Subroutine */ integer dormlq_(const char *side,const char *trans, integer *m, integer *n, integer *k, doublereal *a, integer *lda, doublereal *tau, doublereal * c__, integer *ldc, doublereal *work, integer *lwork, integer *info) { /* -- LAPACK routine (version 3.0) -- Univ. of Tennessee, Univ. of California Berkeley, NAG Ltd., Courant Institute, Argonne National Lab, and Rice University June 30, 1999 Purpose ======= DORMLQ overwrites the general real M-by-N matrix C with SIDE = 'L' SIDE = 'R' TRANS = 'N': Q * C C * Q TRANS = 'T': Q**T * C C * Q**T where Q is a real orthogonal matrix defined as the product of k elementary reflectors Q = H(k) . . . H(2) H(1) as returned by DGELQF. Q is of order M if SIDE = 'L' and of order N if SIDE = 'R'. Arguments ========= SIDE (input) CHARACTER*1 = 'L': apply Q or Q**T from the Left; = 'R': apply Q or Q**T from the Right. TRANS (input) CHARACTER*1 = 'N': No transpose, apply Q; = 'T': Transpose, apply Q**T. M (input) INTEGER The number of rows of the matrix C. M >= 0. N (input) INTEGER The number of columns of the matrix C. N >= 0. K (input) INTEGER The number of elementary reflectors whose product defines the matrix Q. If SIDE = 'L', M >= K >= 0; if SIDE = 'R', N >= K >= 0. A (input) DOUBLE PRECISION array, dimension (LDA,M) if SIDE = 'L', (LDA,N) if SIDE = 'R' The i-th row must contain the vector which defines the elementary reflector H(i), for i = 1,2,...,k, as returned by DGELQF in the first k rows of its array argument A. A is modified by the routine but restored on exit. LDA (input) INTEGER The leading dimension of the array A. LDA >= max(1,K). TAU (input) DOUBLE PRECISION array, dimension (K) TAU(i) must contain the scalar factor of the elementary reflector H(i), as returned by DGELQF. C (input/output) DOUBLE PRECISION array, dimension (LDC,N) On entry, the M-by-N matrix C. On exit, C is overwritten by Q*C or Q**T*C or C*Q**T or C*Q. LDC (input) INTEGER The leading dimension of the array C. LDC >= max(1,M). WORK (workspace/output) DOUBLE PRECISION array, dimension (LWORK) On exit, if INFO = 0, WORK(1) returns the optimal LWORK. LWORK (input) INTEGER The dimension of the array WORK. If SIDE = 'L', LWORK >= max(1,N); if SIDE = 'R', LWORK >= max(1,M). For optimum performance LWORK >= N*NB if SIDE = 'L', and LWORK >= M*NB if SIDE = 'R', where NB is the optimal blocksize. If LWORK = -1, then a workspace query is assumed; the routine only calculates the optimal size of the WORK array, returns this value as the first entry of the WORK array, and no error message related to LWORK is issued by XERBLA. INFO (output) INTEGER = 0: successful exit < 0: if INFO = -i, the i-th argument had an illegal value ===================================================================== Test the input arguments Parameter adjustments */ /* Table of constant values */ integer c__1 = 1; integer c_n1 = -1; integer c__2 = 2; integer c__65 = 65; /* System generated locals */ address a__1[2]; integer a_dim1, a_offset, c_dim1, c_offset, i__1, i__2, i__3[2], i__4, i__5; char ch__1[2]; /* Builtin functions Subroutine */ integer s_cat(char *, char **, integer *, integer *, ftnlen); /* Local variables */ logical left; integer i__; doublereal t[4160] /* was [65][64] */; extern logical lsame_(const char *,const char *); integer nbmin, iinfo, i1, i2, i3; extern /* Subroutine */ integer dorml2_(const char *,const char *, integer *, integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *); integer ib, ic, jc, nb, mi, ni; extern /* Subroutine */ integer dlarfb_(const char *,const char *,const char *,const char *, integer *, integer *, integer *, doublereal *, integer *, doublereal *, integer *, doublereal *, integer *, doublereal *, integer *); integer nq, nw; extern /* Subroutine */ integer dlarft_(const char *,const char *, integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *), xerbla_(const char *, integer *); extern integer ilaenv_(integer *,const char *,const char *, integer *, integer *, integer *, integer *, ftnlen, ftnlen); logical notran; integer ldwork; char transt[1]; integer lwkopt; logical lquery; integer iws; #define a_ref(a_1,a_2) a[(a_2)*a_dim1 + a_1] #define c___ref(a_1,a_2) c__[(a_2)*c_dim1 + a_1] a_dim1 = *lda; a_offset = 1 + a_dim1 * 1; a -= a_offset; --tau; c_dim1 = *ldc; c_offset = 1 + c_dim1 * 1; c__ -= c_offset; --work; /* Function Body */ *info = 0; left = lsame_(side, "L"); notran = lsame_(trans, "N"); lquery = *lwork == -1; /* NQ is the order of Q and NW is the minimum dimension of WORK */ if (left) { nq = *m; nw = *n; } else { nq = *n; nw = *m; } if (! left && ! lsame_(side, "R")) { *info = -1; } else if (! notran && ! lsame_(trans, "T")) { *info = -2; } else if (*m < 0) { *info = -3; } else if (*n < 0) { *info = -4; } else if (*k < 0 || *k > nq) { *info = -5; } else if (*lda < max(1,*k)) { *info = -7; } else if (*ldc < max(1,*m)) { *info = -10; } else if (*lwork < max(1,nw) && ! lquery) { *info = -12; } if (*info == 0) { /* Determine the block size. NB may be at most NBMAX, where NBMAX is used to define the local array T. Computing MIN Writing concatenation */ i__3[0] = 1, a__1[0] = (char*)side; i__3[1] = 1, a__1[1] = (char*)trans; s_cat(ch__1, a__1, i__3, &c__2, (ftnlen)2); i__1 = 64, i__2 = ilaenv_(&c__1, "DORMLQ", ch__1, m, n, k, &c_n1, ( ftnlen)6, (ftnlen)2); nb = min(i__1,i__2); lwkopt = max(1,nw) * nb; work[1] = (doublereal) lwkopt; } if (*info != 0) { i__1 = -(*info); xerbla_("DORMLQ", &i__1); return 0; } else if (lquery) { return 0; } /* Quick return if possible */ if (*m == 0 || *n == 0 || *k == 0) { work[1] = 1.; return 0; } nbmin = 2; ldwork = nw; if (nb > 1 && nb < *k) { iws = nw * nb; if (*lwork < iws) { nb = *lwork / ldwork; /* Computing MAX Writing concatenation */ i__3[0] = 1, a__1[0] =(char*) side; i__3[1] = 1, a__1[1] =(char*) trans; s_cat(ch__1, a__1, i__3, &c__2, (ftnlen)2); i__1 = 2, i__2 = ilaenv_(&c__2, "DORMLQ", ch__1, m, n, k, &c_n1, ( ftnlen)6, (ftnlen)2); nbmin = max(i__1,i__2); } } else { iws = nw; } if (nb < nbmin || nb >= *k) { /* Use unblocked code */ dorml2_(side, trans, m, n, k, &a[a_offset], lda, &tau[1], &c__[ c_offset], ldc, &work[1], &iinfo); } else { /* Use blocked code */ if ((left && notran) || (! left && ! notran)) { i1 = 1; i2 = *k; i3 = nb; } else { i1 = (*k - 1) / nb * nb + 1; i2 = 1; i3 = -nb; } if (left) { ni = *n; jc = 1; } else { mi = *m; ic = 1; } if (notran) { *(unsigned char *)transt = 'T'; } else { *(unsigned char *)transt = 'N'; } i__1 = i2; i__2 = i3; for (i__ = i1; i__2 < 0 ? i__ >= i__1 : i__ <= i__1; i__ += i__2) { /* Computing MIN */ i__4 = nb, i__5 = *k - i__ + 1; ib = min(i__4,i__5); /* Form the triangular factor of the block reflector H = H(i) H(i+1) . . . H(i+ib-1) */ i__4 = nq - i__ + 1; dlarft_("Forward", "Rowwise", &i__4, &ib, &a_ref(i__, i__), lda, & tau[i__], t, &c__65); if (left) { /* H or H' is applied to C(i:m,1:n) */ mi = *m - i__ + 1; ic = i__; } else { /* H or H' is applied to C(1:m,i:n) */ ni = *n - i__ + 1; jc = i__; } /* Apply H or H' */ dlarfb_(side, transt, "Forward", "Rowwise", &mi, &ni, &ib, &a_ref( i__, i__), lda, t, &c__65, &c___ref(ic, jc), ldc, &work[1] , &ldwork); /* L10: */ } } work[1] = (doublereal) lwkopt; return 0; /* End of DORMLQ */ } /* dormlq_ */ #undef c___ref #undef a_ref #ifdef __cplusplus } #endif hypre-2.33.0/src/lapack/dormqr.c000066400000000000000000000212041477326011500164250ustar00rootroot00000000000000/* Copyright (c) 1992-2008 The University of Tennessee. All rights reserved. * See file COPYING in this directory for details. */ #ifdef __cplusplus extern "C" { #endif #include "f2c.h" #include "hypre_lapack.h" /* Subroutine */ integer dormqr_(const char *side,const char *trans, integer *m, integer *n, integer *k, doublereal *a, integer *lda, doublereal *tau, doublereal * c__, integer *ldc, doublereal *work, integer *lwork, integer *info) { /* -- LAPACK routine (version 3.0) -- Univ. of Tennessee, Univ. of California Berkeley, NAG Ltd., Courant Institute, Argonne National Lab, and Rice University June 30, 1999 Purpose ======= DORMQR overwrites the general real M-by-N matrix C with SIDE = 'L' SIDE = 'R' TRANS = 'N': Q * C C * Q TRANS = 'T': Q**T * C C * Q**T where Q is a real orthogonal matrix defined as the product of k elementary reflectors Q = H(1) H(2) . . . H(k) as returned by DGEQRF. Q is of order M if SIDE = 'L' and of order N if SIDE = 'R'. Arguments ========= SIDE (input) CHARACTER*1 = 'L': apply Q or Q**T from the Left; = 'R': apply Q or Q**T from the Right. TRANS (input) CHARACTER*1 = 'N': No transpose, apply Q; = 'T': Transpose, apply Q**T. M (input) INTEGER The number of rows of the matrix C. M >= 0. N (input) INTEGER The number of columns of the matrix C. N >= 0. K (input) INTEGER The number of elementary reflectors whose product defines the matrix Q. If SIDE = 'L', M >= K >= 0; if SIDE = 'R', N >= K >= 0. A (input) DOUBLE PRECISION array, dimension (LDA,K) The i-th column must contain the vector which defines the elementary reflector H(i), for i = 1,2,...,k, as returned by DGEQRF in the first k columns of its array argument A. A is modified by the routine but restored on exit. LDA (input) INTEGER The leading dimension of the array A. If SIDE = 'L', LDA >= max(1,M); if SIDE = 'R', LDA >= max(1,N). TAU (input) DOUBLE PRECISION array, dimension (K) TAU(i) must contain the scalar factor of the elementary reflector H(i), as returned by DGEQRF. C (input/output) DOUBLE PRECISION array, dimension (LDC,N) On entry, the M-by-N matrix C. On exit, C is overwritten by Q*C or Q**T*C or C*Q**T or C*Q. LDC (input) INTEGER The leading dimension of the array C. LDC >= max(1,M). WORK (workspace/output) DOUBLE PRECISION array, dimension (LWORK) On exit, if INFO = 0, WORK(1) returns the optimal LWORK. LWORK (input) INTEGER The dimension of the array WORK. If SIDE = 'L', LWORK >= max(1,N); if SIDE = 'R', LWORK >= max(1,M). For optimum performance LWORK >= N*NB if SIDE = 'L', and LWORK >= M*NB if SIDE = 'R', where NB is the optimal blocksize. If LWORK = -1, then a workspace query is assumed; the routine only calculates the optimal size of the WORK array, returns this value as the first entry of the WORK array, and no error message related to LWORK is issued by XERBLA. INFO (output) INTEGER = 0: successful exit < 0: if INFO = -i, the i-th argument had an illegal value ===================================================================== Test the input arguments Parameter adjustments */ /* Table of constant values */ integer c__1 = 1; integer c_n1 = -1; integer c__2 = 2; integer c__65 = 65; /* System generated locals */ address a__1[2]; integer a_dim1, a_offset, c_dim1, c_offset, i__1, i__2, i__3[2], i__4, i__5; char ch__1[2]; /* Builtin functions Subroutine */ integer s_cat(char *, char **, integer *, integer *, ftnlen); /* Local variables */ logical left; integer i__; doublereal t[4160] /* was [65][64] */; extern logical lsame_(const char *,const char *); integer nbmin, iinfo, i1, i2, i3; extern /* Subroutine */ integer dorm2r_(const char *,const char *, integer *, integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *); integer ib, ic, jc, nb, mi, ni; extern /* Subroutine */ integer dlarfb_(const char *,const char *,const char *,const char *, integer *, integer *, integer *, doublereal *, integer *, doublereal *, integer *, doublereal *, integer *, doublereal *, integer *); integer nq, nw; extern /* Subroutine */ integer dlarft_(const char *,const char *, integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *), xerbla_(const char *, integer *); extern integer ilaenv_(integer *,const char *,const char *, integer *, integer *, integer *, integer *, ftnlen, ftnlen); logical notran; integer ldwork, lwkopt; logical lquery; integer iws; #define a_ref(a_1,a_2) a[(a_2)*a_dim1 + a_1] #define c___ref(a_1,a_2) c__[(a_2)*c_dim1 + a_1] a_dim1 = *lda; a_offset = 1 + a_dim1 * 1; a -= a_offset; --tau; c_dim1 = *ldc; c_offset = 1 + c_dim1 * 1; c__ -= c_offset; --work; /* Function Body */ *info = 0; left = lsame_(side, "L"); notran = lsame_(trans, "N"); lquery = *lwork == -1; /* NQ is the order of Q and NW is the minimum dimension of WORK */ if (left) { nq = *m; nw = *n; } else { nq = *n; nw = *m; } if (! left && ! lsame_(side, "R")) { *info = -1; } else if (! notran && ! lsame_(trans, "T")) { *info = -2; } else if (*m < 0) { *info = -3; } else if (*n < 0) { *info = -4; } else if (*k < 0 || *k > nq) { *info = -5; } else if (*lda < max(1,nq)) { *info = -7; } else if (*ldc < max(1,*m)) { *info = -10; } else if (*lwork < max(1,nw) && ! lquery) { *info = -12; } if (*info == 0) { /* Determine the block size. NB may be at most NBMAX, where NBMAX is used to define the local array T. Computing MIN Writing concatenation */ i__3[0] = 1, a__1[0] = (char*) side; i__3[1] = 1, a__1[1] = (char*) trans; s_cat(ch__1, a__1, i__3, &c__2, (ftnlen)2); i__1 = 64, i__2 = ilaenv_(&c__1, "DORMQR", ch__1, m, n, k, &c_n1, ( ftnlen)6, (ftnlen)2); nb = min(i__1,i__2); lwkopt = max(1,nw) * nb; work[1] = (doublereal) lwkopt; } if (*info != 0) { i__1 = -(*info); xerbla_("DORMQR", &i__1); return 0; } else if (lquery) { return 0; } /* Quick return if possible */ if (*m == 0 || *n == 0 || *k == 0) { work[1] = 1.; return 0; } nbmin = 2; ldwork = nw; if (nb > 1 && nb < *k) { iws = nw * nb; if (*lwork < iws) { nb = *lwork / ldwork; /* Computing MAX Writing concatenation */ i__3[0] = 1, a__1[0] = (char*) side; i__3[1] = 1, a__1[1] = (char*) trans; s_cat(ch__1, a__1, i__3, &c__2, (ftnlen)2); i__1 = 2, i__2 = ilaenv_(&c__2, "DORMQR", ch__1, m, n, k, &c_n1, ( ftnlen)6, (ftnlen)2); nbmin = max(i__1,i__2); } } else { iws = nw; } if (nb < nbmin || nb >= *k) { /* Use unblocked code */ dorm2r_(side, trans, m, n, k, &a[a_offset], lda, &tau[1], &c__[ c_offset], ldc, &work[1], &iinfo); } else { /* Use blocked code */ if ((left && ! notran) || (! left && notran)) { i1 = 1; i2 = *k; i3 = nb; } else { i1 = (*k - 1) / nb * nb + 1; i2 = 1; i3 = -nb; } if (left) { ni = *n; jc = 1; } else { mi = *m; ic = 1; } i__1 = i2; i__2 = i3; for (i__ = i1; i__2 < 0 ? i__ >= i__1 : i__ <= i__1; i__ += i__2) { /* Computing MIN */ i__4 = nb, i__5 = *k - i__ + 1; ib = min(i__4,i__5); /* Form the triangular factor of the block reflector H = H(i) H(i+1) . . . H(i+ib-1) */ i__4 = nq - i__ + 1; dlarft_("Forward", "Columnwise", &i__4, &ib, &a_ref(i__, i__), lda, &tau[i__], t, &c__65); if (left) { /* H or H' is applied to C(i:m,1:n) */ mi = *m - i__ + 1; ic = i__; } else { /* H or H' is applied to C(1:m,i:n) */ ni = *n - i__ + 1; jc = i__; } /* Apply H or H' */ dlarfb_(side, trans, "Forward", "Columnwise", &mi, &ni, &ib, & a_ref(i__, i__), lda, t, &c__65, &c___ref(ic, jc), ldc, & work[1], &ldwork); /* L10: */ } } work[1] = (doublereal) lwkopt; return 0; /* End of DORMQR */ } /* dormqr_ */ #undef c___ref #undef a_ref #ifdef __cplusplus } #endif hypre-2.33.0/src/lapack/dpotf2.c000066400000000000000000000124651477326011500163300ustar00rootroot00000000000000/* Copyright (c) 1992-2008 The University of Tennessee. All rights reserved. * See file COPYING in this directory for details. */ #ifdef __cplusplus extern "C" { #endif #include "f2c.h" #include "hypre_lapack.h" /* Subroutine */ integer dpotf2_(const char *uplo, integer *n, doublereal *a, integer * lda, integer *info) { /* -- LAPACK routine (version 3.0) -- Univ. of Tennessee, Univ. of California Berkeley, NAG Ltd., Courant Institute, Argonne National Lab, and Rice University February 29, 1992 Purpose ======= DPOTF2 computes the Cholesky factorization of a real symmetric positive definite matrix A. The factorization has the form A = U' * U , if UPLO = 'U', or A = L * L', if UPLO = 'L', where U is an upper triangular matrix and L is lower triangular. This is the unblocked version of the algorithm, calling Level 2 BLAS. Arguments ========= UPLO (input) CHARACTER*1 Specifies whether the upper or lower triangular part of the symmetric matrix A is stored. = 'U': Upper triangular = 'L': Lower triangular N (input) INTEGER The order of the matrix A. N >= 0. A (input/output) DOUBLE PRECISION array, dimension (LDA,N) On entry, the symmetric matrix A. If UPLO = 'U', the leading n by n upper triangular part of A contains the upper triangular part of the matrix A, and the strictly lower triangular part of A is not referenced. If UPLO = 'L', the leading n by n lower triangular part of A contains the lower triangular part of the matrix A, and the strictly upper triangular part of A is not referenced. On exit, if INFO = 0, the factor U or L from the Cholesky factorization A = U'*U or A = L*L'. LDA (input) INTEGER The leading dimension of the array A. LDA >= max(1,N). INFO (output) INTEGER = 0: successful exit < 0: if INFO = -k, the k-th argument had an illegal value > 0: if INFO = k, the leading minor of order k is not positive definite, and the factorization could not be completed. ===================================================================== Test the input parameters. Parameter adjustments */ /* Table of constant values */ integer c__1 = 1; doublereal c_b10 = -1.; doublereal c_b12 = 1.; /* System generated locals */ integer a_dim1, a_offset, i__1, i__2, i__3; doublereal d__1; /* Builtin functions */ /*doublereal sqrt(doublereal);*/ /* Local variables */ extern doublereal ddot_(integer *, doublereal *, integer *, doublereal *, integer *); integer j; extern /* Subroutine */ integer dscal_(integer *, doublereal *, doublereal *, integer *); extern logical lsame_(const char *,const char *); extern /* Subroutine */ integer dgemv_(const char *, integer *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *); logical upper; extern /* Subroutine */ integer xerbla_(const char *, integer *); doublereal ajj; #define a_ref(a_1,a_2) a[(a_2)*a_dim1 + a_1] a_dim1 = *lda; a_offset = 1 + a_dim1 * 1; a -= a_offset; /* Function Body */ *info = 0; upper = lsame_(uplo, "U"); if (! upper && ! lsame_(uplo, "L")) { *info = -1; } else if (*n < 0) { *info = -2; } else if (*lda < max(1,*n)) { *info = -4; } if (*info != 0) { i__1 = -(*info); xerbla_("DPOTF2", &i__1); return 0; } /* Quick return if possible */ if (*n == 0) { return 0; } if (upper) { /* Compute the Cholesky factorization A = U'*U. */ i__1 = *n; for (j = 1; j <= i__1; ++j) { /* Compute U(J,J) and test for non-positive-definiteness. */ i__2 = j - 1; ajj = a_ref(j, j) - ddot_(&i__2, &a_ref(1, j), &c__1, &a_ref(1, j) , &c__1); if (ajj <= 0.) { a_ref(j, j) = ajj; goto L30; } ajj = sqrt(ajj); a_ref(j, j) = ajj; /* Compute elements J+1:N of row J. */ if (j < *n) { i__2 = j - 1; i__3 = *n - j; dgemv_("Transpose", &i__2, &i__3, &c_b10, &a_ref(1, j + 1), lda, &a_ref(1, j), &c__1, &c_b12, &a_ref(j, j + 1), lda); i__2 = *n - j; d__1 = 1. / ajj; dscal_(&i__2, &d__1, &a_ref(j, j + 1), lda); } /* L10: */ } } else { /* Compute the Cholesky factorization A = L*L'. */ i__1 = *n; for (j = 1; j <= i__1; ++j) { /* Compute L(J,J) and test for non-positive-definiteness. */ i__2 = j - 1; ajj = a_ref(j, j) - ddot_(&i__2, &a_ref(j, 1), lda, &a_ref(j, 1), lda); if (ajj <= 0.) { a_ref(j, j) = ajj; goto L30; } ajj = sqrt(ajj); a_ref(j, j) = ajj; /* Compute elements J+1:N of column J. */ if (j < *n) { i__2 = *n - j; i__3 = j - 1; dgemv_("No transpose", &i__2, &i__3, &c_b10, &a_ref(j + 1, 1), lda, &a_ref(j, 1), lda, &c_b12, &a_ref(j + 1, j), & c__1); i__2 = *n - j; d__1 = 1. / ajj; dscal_(&i__2, &d__1, &a_ref(j + 1, j), &c__1); } /* L20: */ } } goto L40; L30: *info = j; L40: return 0; /* End of DPOTF2 */ } /* dpotf2_ */ #undef a_ref #ifdef __cplusplus } #endif hypre-2.33.0/src/lapack/dpotrf.c000066400000000000000000000150011477326011500164150ustar00rootroot00000000000000/* Copyright (c) 1992-2008 The University of Tennessee. All rights reserved. * See file COPYING in this directory for details. */ #ifdef __cplusplus extern "C" { #endif #include "f2c.h" #include "hypre_lapack.h" /* Subroutine */ integer dpotrf_(const char *uplo, integer *n, doublereal *a, integer * lda, integer *info) { /* -- LAPACK routine (version 3.0) -- Univ. of Tennessee, Univ. of California Berkeley, NAG Ltd., Courant Institute, Argonne National Lab, and Rice University March 31, 1993 Purpose ======= DPOTRF computes the Cholesky factorization of a real symmetric positive definite matrix A. The factorization has the form A = U**T * U, if UPLO = 'U', or A = L * L**T, if UPLO = 'L', where U is an upper triangular matrix and L is lower triangular. This is the block version of the algorithm, calling Level 3 BLAS. Arguments ========= UPLO (input) CHARACTER*1 = 'U': Upper triangle of A is stored; = 'L': Lower triangle of A is stored. N (input) INTEGER The order of the matrix A. N >= 0. A (input/output) DOUBLE PRECISION array, dimension (LDA,N) On entry, the symmetric matrix A. If UPLO = 'U', the leading N-by-N upper triangular part of A contains the upper triangular part of the matrix A, and the strictly lower triangular part of A is not referenced. If UPLO = 'L', the leading N-by-N lower triangular part of A contains the lower triangular part of the matrix A, and the strictly upper triangular part of A is not referenced. On exit, if INFO = 0, the factor U or L from the Cholesky factorization A = U**T*U or A = L*L**T. LDA (input) INTEGER The leading dimension of the array A. LDA >= max(1,N). INFO (output) INTEGER = 0: successful exit < 0: if INFO = -i, the i-th argument had an illegal value > 0: if INFO = i, the leading minor of order i is not positive definite, and the factorization could not be completed. ===================================================================== Test the input parameters. Parameter adjustments */ /* Table of constant values */ integer c__1 = 1; integer c_n1 = -1; doublereal c_b13 = -1.; doublereal c_b14 = 1.; /* System generated locals */ integer a_dim1, a_offset, i__1, i__2, i__3, i__4; /* Local variables */ integer j; extern /* Subroutine */ integer dgemm_(const char *,const char *, integer *, integer *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *); extern logical lsame_(const char *,const char *); extern /* Subroutine */ integer dtrsm_(const char *,const char *,const char *,const char *, integer *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *); logical upper; extern /* Subroutine */ integer dsyrk_(const char *,const char *, integer *, integer *, doublereal *, doublereal *, integer *, doublereal *, doublereal *, integer *), dpotf2_(const char *, integer *, doublereal *, integer *, integer *); integer jb, nb; extern /* Subroutine */ integer xerbla_(const char *, integer *); extern integer ilaenv_(integer *,const char *,const char *, integer *, integer *, integer *, integer *, ftnlen, ftnlen); #define a_ref(a_1,a_2) a[(a_2)*a_dim1 + a_1] a_dim1 = *lda; a_offset = 1 + a_dim1 * 1; a -= a_offset; /* Function Body */ *info = 0; upper = lsame_(uplo, "U"); if (! upper && ! lsame_(uplo, "L")) { *info = -1; } else if (*n < 0) { *info = -2; } else if (*lda < max(1,*n)) { *info = -4; } if (*info != 0) { i__1 = -(*info); xerbla_("DPOTRF", &i__1); return 0; } /* Quick return if possible */ if (*n == 0) { return 0; } /* Determine the block size for this environment. */ nb = ilaenv_(&c__1, "DPOTRF", uplo, n, &c_n1, &c_n1, &c_n1, (ftnlen)6, ( ftnlen)1); if (nb <= 1 || nb >= *n) { /* Use unblocked code. */ dpotf2_(uplo, n, &a[a_offset], lda, info); } else { /* Use blocked code. */ if (upper) { /* Compute the Cholesky factorization A = U'*U. */ i__1 = *n; i__2 = nb; for (j = 1; i__2 < 0 ? j >= i__1 : j <= i__1; j += i__2) { /* Update and factorize the current diagonal block and test for non-positive-definiteness. Computing MIN */ i__3 = nb, i__4 = *n - j + 1; jb = min(i__3,i__4); i__3 = j - 1; dsyrk_("Upper", "Transpose", &jb, &i__3, &c_b13, &a_ref(1, j), lda, &c_b14, &a_ref(j, j), lda) ; dpotf2_("Upper", &jb, &a_ref(j, j), lda, info); if (*info != 0) { goto L30; } if (j + jb <= *n) { /* Compute the current block row. */ i__3 = *n - j - jb + 1; i__4 = j - 1; dgemm_("Transpose", "No transpose", &jb, &i__3, &i__4, & c_b13, &a_ref(1, j), lda, &a_ref(1, j + jb), lda, &c_b14, &a_ref(j, j + jb), lda); i__3 = *n - j - jb + 1; dtrsm_("Left", "Upper", "Transpose", "Non-unit", &jb, & i__3, &c_b14, &a_ref(j, j), lda, &a_ref(j, j + jb) , lda) ; } /* L10: */ } } else { /* Compute the Cholesky factorization A = L*L'. */ i__2 = *n; i__1 = nb; for (j = 1; i__1 < 0 ? j >= i__2 : j <= i__2; j += i__1) { /* Update and factorize the current diagonal block and test for non-positive-definiteness. Computing MIN */ i__3 = nb, i__4 = *n - j + 1; jb = min(i__3,i__4); i__3 = j - 1; dsyrk_("Lower", "No transpose", &jb, &i__3, &c_b13, &a_ref(j, 1), lda, &c_b14, &a_ref(j, j), lda); dpotf2_("Lower", &jb, &a_ref(j, j), lda, info); if (*info != 0) { goto L30; } if (j + jb <= *n) { /* Compute the current block column. */ i__3 = *n - j - jb + 1; i__4 = j - 1; dgemm_("No transpose", "Transpose", &i__3, &jb, &i__4, & c_b13, &a_ref(j + jb, 1), lda, &a_ref(j, 1), lda, &c_b14, &a_ref(j + jb, j), lda); i__3 = *n - j - jb + 1; dtrsm_("Right", "Lower", "Transpose", "Non-unit", &i__3, & jb, &c_b14, &a_ref(j, j), lda, &a_ref(j + jb, j), lda); } /* L20: */ } } } goto L40; L30: *info = *info + j - 1; L40: return 0; /* End of DPOTRF */ } /* dpotrf_ */ #undef a_ref #ifdef __cplusplus } #endif hypre-2.33.0/src/lapack/dpotrs.c000066400000000000000000000076141477326011500164450ustar00rootroot00000000000000/* Copyright (c) 1992-2008 The University of Tennessee. All rights reserved. * See file COPYING in this directory for details. */ #ifdef __cplusplus extern "C" { #endif #include "f2c.h" #include "hypre_lapack.h" /* Subroutine */ integer dpotrs_(char *uplo, integer *n, integer *nrhs, doublereal *a, integer *lda, doublereal *b, integer *ldb, integer * info) { /* -- LAPACK routine (version 3.0) -- Univ. of Tennessee, Univ. of California Berkeley, NAG Ltd., Courant Institute, Argonne National Lab, and Rice University March 31, 1993 Purpose ======= DPOTRS solves a system of linear equations A*X = B with a symmetric positive definite matrix A using the Cholesky factorization A = U**T*U or A = L*L**T computed by DPOTRF. Arguments ========= UPLO (input) CHARACTER*1 = 'U': Upper triangle of A is stored; = 'L': Lower triangle of A is stored. N (input) INTEGER The order of the matrix A. N >= 0. NRHS (input) INTEGER The number of right hand sides, i.e., the number of columns of the matrix B. NRHS >= 0. A (input) DOUBLE PRECISION array, dimension (LDA,N) The triangular factor U or L from the Cholesky factorization A = U**T*U or A = L*L**T, as computed by DPOTRF. LDA (input) INTEGER The leading dimension of the array A. LDA >= max(1,N). B (input/output) DOUBLE PRECISION array, dimension (LDB,NRHS) On entry, the right hand side matrix B. On exit, the solution matrix X. LDB (input) INTEGER The leading dimension of the array B. LDB >= max(1,N). INFO (output) INTEGER = 0: successful exit < 0: if INFO = -i, the i-th argument had an illegal value ===================================================================== Test the input parameters. Parameter adjustments */ /* Table of constant values */ doublereal c_b9 = 1.; /* System generated locals */ integer a_dim1, a_offset, b_dim1, b_offset, i__1; /* Local variables */ extern logical lsame_(const char *,const char *); extern /* Subroutine */ integer dtrsm_(const char *,const char *,const char *,const char *, integer *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *); logical upper; extern /* Subroutine */ integer xerbla_(const char *, integer *); a_dim1 = *lda; a_offset = 1 + a_dim1 * 1; a -= a_offset; b_dim1 = *ldb; b_offset = 1 + b_dim1 * 1; b -= b_offset; /* Function Body */ *info = 0; upper = lsame_(uplo, "U"); if (! upper && ! lsame_(uplo, "L")) { *info = -1; } else if (*n < 0) { *info = -2; } else if (*nrhs < 0) { *info = -3; } else if (*lda < max(1,*n)) { *info = -5; } else if (*ldb < max(1,*n)) { *info = -7; } if (*info != 0) { i__1 = -(*info); xerbla_("DPOTRS", &i__1); return 0; } /* Quick return if possible */ if (*n == 0 || *nrhs == 0) { return 0; } if (upper) { /* Solve A*X = B where A = U'*U. Solve U'*X = B, overwriting B with X. */ dtrsm_("Left", "Upper", "Transpose", "Non-unit", n, nrhs, &c_b9, &a[ a_offset], lda, &b[b_offset], ldb); /* Solve U*X = B, overwriting B with X. */ dtrsm_("Left", "Upper", "No transpose", "Non-unit", n, nrhs, &c_b9, & a[a_offset], lda, &b[b_offset], ldb); } else { /* Solve A*X = B where A = L*L'. Solve L*X = B, overwriting B with X. */ dtrsm_("Left", "Lower", "No transpose", "Non-unit", n, nrhs, &c_b9, & a[a_offset], lda, &b[b_offset], ldb); /* Solve L'*X = B, overwriting B with X. */ dtrsm_("Left", "Lower", "Transpose", "Non-unit", n, nrhs, &c_b9, &a[ a_offset], lda, &b[b_offset], ldb); } return 0; /* End of DPOTRS */ } /* dpotrs_ */ #ifdef __cplusplus } #endif hypre-2.33.0/src/lapack/dsteqr.c000066400000000000000000000336201477326011500164300ustar00rootroot00000000000000/* Copyright (c) 1992-2008 The University of Tennessee. All rights reserved. * See file COPYING in this directory for details. */ #ifdef __cplusplus extern "C" { #endif #include "f2c.h" #include "hypre_lapack.h" /* Subroutine */ integer dsteqr_(const char *compz, integer *n, doublereal *d__, doublereal *e, doublereal *z__, integer *ldz, doublereal *work, integer *info) { /* -- LAPACK routine (version 3.0) -- Univ. of Tennessee, Univ. of California Berkeley, NAG Ltd., Courant Institute, Argonne National Lab, and Rice University September 30, 1994 Purpose ======= DSTEQR computes all eigenvalues and, optionally, eigenvectors of a symmetric tridiagonal matrix using the implicit QL or QR method. The eigenvectors of a full or band symmetric matrix can also be found if DSYTRD or DSPTRD or DSBTRD has been used to reduce this matrix to tridiagonal form. Arguments ========= COMPZ (input) CHARACTER*1 = 'N': Compute eigenvalues only. = 'V': Compute eigenvalues and eigenvectors of the original symmetric matrix. On entry, Z must contain the orthogonal matrix used to reduce the original matrix to tridiagonal form. = 'I': Compute eigenvalues and eigenvectors of the tridiagonal matrix. Z is initialized to the identity matrix. N (input) INTEGER The order of the matrix. N >= 0. D (input/output) DOUBLE PRECISION array, dimension (N) On entry, the diagonal elements of the tridiagonal matrix. On exit, if INFO = 0, the eigenvalues in ascending order. E (input/output) DOUBLE PRECISION array, dimension (N-1) On entry, the (n-1) subdiagonal elements of the tridiagonal matrix. On exit, E has been destroyed. Z (input/output) DOUBLE PRECISION array, dimension (LDZ, N) On entry, if COMPZ = 'V', then Z contains the orthogonal matrix used in the reduction to tridiagonal form. On exit, if INFO = 0, then if COMPZ = 'V', Z contains the orthonormal eigenvectors of the original symmetric matrix, and if COMPZ = 'I', Z contains the orthonormal eigenvectors of the symmetric tridiagonal matrix. If COMPZ = 'N', then Z is not referenced. LDZ (input) INTEGER The leading dimension of the array Z. LDZ >= 1, and if eigenvectors are desired, then LDZ >= max(1,N). WORK (workspace) DOUBLE PRECISION array, dimension (max(1,2*N-2)) If COMPZ = 'N', then WORK is not referenced. INFO (output) INTEGER = 0: successful exit < 0: if INFO = -i, the i-th argument had an illegal value > 0: the algorithm has failed to find all the eigenvalues in a total of 30*N iterations; if INFO = i, then i elements of E have not converged to zero; on exit, D and E contain the elements of a symmetric tridiagonal matrix which is orthogonally similar to the original matrix. ===================================================================== Test the input parameters. Parameter adjustments */ /* Table of constant values */ doublereal c_b9 = 0.; doublereal c_b10 = 1.; integer c__0 = 0; integer c__1 = 1; integer c__2 = 2; /* System generated locals */ integer z_dim1, z_offset, i__1, i__2; doublereal d__1, d__2; /* Builtin functions */ doublereal d_sign(doublereal *, doublereal *); /* Local variables */ integer lend, jtot; extern /* Subroutine */ integer dlae2_(doublereal *, doublereal *, doublereal *, doublereal *, doublereal *); doublereal b, c__, f, g; integer i__, j, k, l, m; doublereal p, r__, s; extern logical lsame_(const char *,const char *); extern /* Subroutine */ integer dlasr_(const char *,const char *,const char *, integer *, integer *, doublereal *, doublereal *, doublereal *, integer *); doublereal anorm; extern /* Subroutine */ integer dswap_(integer *, doublereal *, integer *, doublereal *, integer *); integer l1; extern /* Subroutine */ integer dlaev2_(doublereal *, doublereal *, doublereal *, doublereal *, doublereal *, doublereal *, doublereal *); integer lendm1, lendp1; extern doublereal dlapy2_(doublereal *, doublereal *); integer ii; extern doublereal dlamch_(const char *); integer mm, iscale; extern /* Subroutine */ integer dlascl_(const char *, integer *, integer *, doublereal *, doublereal *, integer *, integer *, doublereal *, integer *, integer *), dlaset_(const char *, integer *, integer *, doublereal *, doublereal *, doublereal *, integer *); doublereal safmin; extern /* Subroutine */ integer dlartg_(doublereal *, doublereal *, doublereal *, doublereal *, doublereal *); doublereal safmax; extern /* Subroutine */ integer xerbla_(const char *, integer *); extern doublereal dlanst_(const char *, integer *, doublereal *, doublereal *); extern /* Subroutine */ integer dlasrt_(const char *, integer *, doublereal *, integer *); integer lendsv; doublereal ssfmin; integer nmaxit, icompz; doublereal ssfmax; integer lm1, mm1, nm1; doublereal rt1, rt2, eps; integer lsv; doublereal tst, eps2; #define z___ref(a_1,a_2) z__[(a_2)*z_dim1 + a_1] --d__; --e; z_dim1 = *ldz; z_offset = 1 + z_dim1 * 1; z__ -= z_offset; --work; /* Function Body */ *info = 0; if (lsame_(compz, "N")) { icompz = 0; } else if (lsame_(compz, "V")) { icompz = 1; } else if (lsame_(compz, "I")) { icompz = 2; } else { icompz = -1; } if (icompz < 0) { *info = -1; } else if (*n < 0) { *info = -2; } else if ((*ldz < 1) || ((icompz > 0) && (*ldz < max(1,*n)))) { *info = -6; } if (*info != 0) { i__1 = -(*info); xerbla_("DSTEQR", &i__1); return 0; } /* Quick return if possible */ if (*n == 0) { return 0; } if (*n == 1) { if (icompz == 2) { z___ref(1, 1) = 1.; } return 0; } /* Determine the unit roundoff and over/underflow thresholds. */ eps = dlamch_("E"); /* Computing 2nd power */ d__1 = eps; eps2 = d__1 * d__1; safmin = dlamch_("S"); safmax = 1. / safmin; ssfmax = sqrt(safmax) / 3.; ssfmin = sqrt(safmin) / eps2; /* Compute the eigenvalues and eigenvectors of the tridiagonal matrix. */ if (icompz == 2) { dlaset_("Full", n, n, &c_b9, &c_b10, &z__[z_offset], ldz); } nmaxit = *n * 30; jtot = 0; /* Determine where the matrix splits and choose QL or QR iteration for each block, according to whether top or bottom diagonal element is smaller. */ l1 = 1; nm1 = *n - 1; L10: if (l1 > *n) { goto L160; } if (l1 > 1) { e[l1 - 1] = 0.; } if (l1 <= nm1) { i__1 = nm1; for (m = l1; m <= i__1; ++m) { tst = (d__1 = e[m], abs(d__1)); if (tst == 0.) { goto L30; } if (tst <= sqrt((d__1 = d__[m], abs(d__1))) * sqrt((d__2 = d__[m + 1], abs(d__2))) * eps) { e[m] = 0.; goto L30; } /* L20: */ } } m = *n; L30: l = l1; lsv = l; lend = m; lendsv = lend; l1 = m + 1; if (lend == l) { goto L10; } /* Scale submatrix in rows and columns L to LEND */ i__1 = lend - l + 1; anorm = dlanst_("I", &i__1, &d__[l], &e[l]); iscale = 0; if (anorm == 0.) { goto L10; } if (anorm > ssfmax) { iscale = 1; i__1 = lend - l + 1; dlascl_("G", &c__0, &c__0, &anorm, &ssfmax, &i__1, &c__1, &d__[l], n, info); i__1 = lend - l; dlascl_("G", &c__0, &c__0, &anorm, &ssfmax, &i__1, &c__1, &e[l], n, info); } else if (anorm < ssfmin) { iscale = 2; i__1 = lend - l + 1; dlascl_("G", &c__0, &c__0, &anorm, &ssfmin, &i__1, &c__1, &d__[l], n, info); i__1 = lend - l; dlascl_("G", &c__0, &c__0, &anorm, &ssfmin, &i__1, &c__1, &e[l], n, info); } /* Choose between QL and QR iteration */ if ((d__1 = d__[lend], abs(d__1)) < (d__2 = d__[l], abs(d__2))) { lend = lsv; l = lendsv; } if (lend > l) { /* QL Iteration Look for small subdiagonal element. */ L40: if (l != lend) { lendm1 = lend - 1; i__1 = lendm1; for (m = l; m <= i__1; ++m) { /* Computing 2nd power */ d__2 = (d__1 = e[m], abs(d__1)); tst = d__2 * d__2; if (tst <= eps2 * (d__1 = d__[m], abs(d__1)) * (d__2 = d__[m + 1], abs(d__2)) + safmin) { goto L60; } /* L50: */ } } m = lend; L60: if (m < lend) { e[m] = 0.; } p = d__[l]; if (m == l) { goto L80; } /* If remaining matrix is 2-by-2, use DLAE2 or SLAEV2 to compute its eigensystem. */ if (m == l + 1) { if (icompz > 0) { dlaev2_(&d__[l], &e[l], &d__[l + 1], &rt1, &rt2, &c__, &s); work[l] = c__; work[*n - 1 + l] = s; dlasr_("R", "V", "B", n, &c__2, &work[l], &work[*n - 1 + l], & z___ref(1, l), ldz); } else { dlae2_(&d__[l], &e[l], &d__[l + 1], &rt1, &rt2); } d__[l] = rt1; d__[l + 1] = rt2; e[l] = 0.; l += 2; if (l <= lend) { goto L40; } goto L140; } if (jtot == nmaxit) { goto L140; } ++jtot; /* Form shift. */ g = (d__[l + 1] - p) / (e[l] * 2.); r__ = dlapy2_(&g, &c_b10); g = d__[m] - p + e[l] / (g + d_sign(&r__, &g)); s = 1.; c__ = 1.; p = 0.; /* Inner loop */ mm1 = m - 1; i__1 = l; for (i__ = mm1; i__ >= i__1; --i__) { f = s * e[i__]; b = c__ * e[i__]; dlartg_(&g, &f, &c__, &s, &r__); if (i__ != m - 1) { e[i__ + 1] = r__; } g = d__[i__ + 1] - p; r__ = (d__[i__] - g) * s + c__ * 2. * b; p = s * r__; d__[i__ + 1] = g + p; g = c__ * r__ - b; /* If eigenvectors are desired, then save rotations. */ if (icompz > 0) { work[i__] = c__; work[*n - 1 + i__] = -s; } /* L70: */ } /* If eigenvectors are desired, then apply saved rotations. */ if (icompz > 0) { mm = m - l + 1; dlasr_("R", "V", "B", n, &mm, &work[l], &work[*n - 1 + l], & z___ref(1, l), ldz); } d__[l] -= p; e[l] = g; goto L40; /* Eigenvalue found. */ L80: d__[l] = p; ++l; if (l <= lend) { goto L40; } goto L140; } else { /* QR Iteration Look for small superdiagonal element. */ L90: if (l != lend) { lendp1 = lend + 1; i__1 = lendp1; for (m = l; m >= i__1; --m) { /* Computing 2nd power */ d__2 = (d__1 = e[m - 1], abs(d__1)); tst = d__2 * d__2; if (tst <= eps2 * (d__1 = d__[m], abs(d__1)) * (d__2 = d__[m - 1], abs(d__2)) + safmin) { goto L110; } /* L100: */ } } m = lend; L110: if (m > lend) { e[m - 1] = 0.; } p = d__[l]; if (m == l) { goto L130; } /* If remaining matrix is 2-by-2, use DLAE2 or SLAEV2 to compute its eigensystem. */ if (m == l - 1) { if (icompz > 0) { dlaev2_(&d__[l - 1], &e[l - 1], &d__[l], &rt1, &rt2, &c__, &s) ; work[m] = c__; work[*n - 1 + m] = s; dlasr_("R", "V", "F", n, &c__2, &work[m], &work[*n - 1 + m], & z___ref(1, l - 1), ldz); } else { dlae2_(&d__[l - 1], &e[l - 1], &d__[l], &rt1, &rt2); } d__[l - 1] = rt1; d__[l] = rt2; e[l - 1] = 0.; l += -2; if (l >= lend) { goto L90; } goto L140; } if (jtot == nmaxit) { goto L140; } ++jtot; /* Form shift. */ g = (d__[l - 1] - p) / (e[l - 1] * 2.); r__ = dlapy2_(&g, &c_b10); g = d__[m] - p + e[l - 1] / (g + d_sign(&r__, &g)); s = 1.; c__ = 1.; p = 0.; /* Inner loop */ lm1 = l - 1; i__1 = lm1; for (i__ = m; i__ <= i__1; ++i__) { f = s * e[i__]; b = c__ * e[i__]; dlartg_(&g, &f, &c__, &s, &r__); if (i__ != m) { e[i__ - 1] = r__; } g = d__[i__] - p; r__ = (d__[i__ + 1] - g) * s + c__ * 2. * b; p = s * r__; d__[i__] = g + p; g = c__ * r__ - b; /* If eigenvectors are desired, then save rotations. */ if (icompz > 0) { work[i__] = c__; work[*n - 1 + i__] = s; } /* L120: */ } /* If eigenvectors are desired, then apply saved rotations. */ if (icompz > 0) { mm = l - m + 1; dlasr_("R", "V", "F", n, &mm, &work[m], &work[*n - 1 + m], & z___ref(1, m), ldz); } d__[l] -= p; e[lm1] = g; goto L90; /* Eigenvalue found. */ L130: d__[l] = p; --l; if (l >= lend) { goto L90; } goto L140; } /* Undo scaling if necessary */ L140: if (iscale == 1) { i__1 = lendsv - lsv + 1; dlascl_("G", &c__0, &c__0, &ssfmax, &anorm, &i__1, &c__1, &d__[lsv], n, info); i__1 = lendsv - lsv; dlascl_("G", &c__0, &c__0, &ssfmax, &anorm, &i__1, &c__1, &e[lsv], n, info); } else if (iscale == 2) { i__1 = lendsv - lsv + 1; dlascl_("G", &c__0, &c__0, &ssfmin, &anorm, &i__1, &c__1, &d__[lsv], n, info); i__1 = lendsv - lsv; dlascl_("G", &c__0, &c__0, &ssfmin, &anorm, &i__1, &c__1, &e[lsv], n, info); } /* Check for no convergence to an eigenvalue after a total of N*MAXIT iterations. */ if (jtot < nmaxit) { goto L10; } i__1 = *n - 1; for (i__ = 1; i__ <= i__1; ++i__) { if (e[i__] != 0.) { ++(*info); } /* L150: */ } goto L190; /* Order eigenvalues and eigenvectors. */ L160: if (icompz == 0) { /* Use Quick Sort */ dlasrt_("I", n, &d__[1], info); } else { /* Use Selection Sort to minimize swaps of eigenvectors */ i__1 = *n; for (ii = 2; ii <= i__1; ++ii) { i__ = ii - 1; k = i__; p = d__[i__]; i__2 = *n; for (j = ii; j <= i__2; ++j) { if (d__[j] < p) { k = j; p = d__[j]; } /* L170: */ } if (k != i__) { d__[k] = d__[i__]; d__[i__] = p; dswap_(n, &z___ref(1, i__), &c__1, &z___ref(1, k), &c__1); } /* L180: */ } } L190: return 0; /* End of DSTEQR */ } /* dsteqr_ */ #undef z___ref #ifdef __cplusplus } #endif hypre-2.33.0/src/lapack/dsterf.c000066400000000000000000000220031477326011500164060ustar00rootroot00000000000000/* Copyright (c) 1992-2008 The University of Tennessee. All rights reserved. * See file COPYING in this directory for details. */ #ifdef __cplusplus extern "C" { #endif #include "f2c.h" #include "hypre_lapack.h" /* Subroutine */ integer dsterf_(integer *n, doublereal *d__, doublereal *e, integer *info) { /* -- LAPACK routine (version 3.0) -- Univ. of Tennessee, Univ. of California Berkeley, NAG Ltd., Courant Institute, Argonne National Lab, and Rice University June 30, 1999 Purpose ======= DSTERF computes all eigenvalues of a symmetric tridiagonal matrix using the Pal-Walker-Kahan variant of the QL or QR algorithm. Arguments ========= N (input) INTEGER The order of the matrix. N >= 0. D (input/output) DOUBLE PRECISION array, dimension (N) On entry, the n diagonal elements of the tridiagonal matrix. On exit, if INFO = 0, the eigenvalues in ascending order. E (input/output) DOUBLE PRECISION array, dimension (N-1) On entry, the (n-1) subdiagonal elements of the tridiagonal matrix. On exit, E has been destroyed. INFO (output) INTEGER = 0: successful exit < 0: if INFO = -i, the i-th argument had an illegal value > 0: the algorithm failed to find all of the eigenvalues in a total of 30*N iterations; if INFO = i, then i elements of E have not converged to zero. ===================================================================== Test the input parameters. Parameter adjustments */ /* Table of constant values */ integer c__0 = 0; integer c__1 = 1; doublereal c_b32 = 1.; /* System generated locals */ integer i__1; doublereal d__1, d__2, d__3; /* Builtin functions */ doublereal d_sign(doublereal *, doublereal *); /* Local variables */ doublereal oldc; integer lend, jtot; extern /* Subroutine */ integer dlae2_(doublereal *, doublereal *, doublereal *, doublereal *, doublereal *); doublereal c__; integer i__, l, m; doublereal p, gamma, r__, s, alpha, sigma, anorm; integer l1; extern doublereal dlapy2_(doublereal *, doublereal *); doublereal bb; extern doublereal dlamch_(const char *); integer iscale; extern /* Subroutine */ integer dlascl_(const char *, integer *, integer *, doublereal *, doublereal *, integer *, integer *, doublereal *, integer *, integer *); doublereal oldgam, safmin; extern /* Subroutine */ integer xerbla_(const char *, integer *); doublereal safmax; extern doublereal dlanst_(const char *, integer *, doublereal *, doublereal *); extern /* Subroutine */ integer dlasrt_(const char *, integer *, doublereal *, integer *); integer lendsv; doublereal ssfmin; integer nmaxit; doublereal ssfmax, rt1, rt2, eps, rte; integer lsv; doublereal eps2; --e; --d__; /* Function Body */ *info = 0; /* Quick return if possible */ if (*n < 0) { *info = -1; i__1 = -(*info); xerbla_("DSTERF", &i__1); return 0; } if (*n <= 1) { return 0; } /* Determine the unit roundoff for this environment. */ eps = dlamch_("E"); /* Computing 2nd power */ d__1 = eps; eps2 = d__1 * d__1; safmin = dlamch_("S"); safmax = 1. / safmin; ssfmax = sqrt(safmax) / 3.; ssfmin = sqrt(safmin) / eps2; /* Compute the eigenvalues of the tridiagonal matrix. */ nmaxit = *n * 30; sigma = 0.; jtot = 0; /* Determine where the matrix splits and choose QL or QR iteration for each block, according to whether top or bottom diagonal element is smaller. */ l1 = 1; L10: if (l1 > *n) { goto L170; } if (l1 > 1) { e[l1 - 1] = 0.; } i__1 = *n - 1; for (m = l1; m <= i__1; ++m) { if ((d__3 = e[m], abs(d__3)) <= sqrt((d__1 = d__[m], abs(d__1))) * sqrt((d__2 = d__[m + 1], abs(d__2))) * eps) { e[m] = 0.; goto L30; } /* L20: */ } m = *n; L30: l = l1; lsv = l; lend = m; lendsv = lend; l1 = m + 1; if (lend == l) { goto L10; } /* Scale submatrix in rows and columns L to LEND */ i__1 = lend - l + 1; anorm = dlanst_("I", &i__1, &d__[l], &e[l]); iscale = 0; if (anorm > ssfmax) { iscale = 1; i__1 = lend - l + 1; dlascl_("G", &c__0, &c__0, &anorm, &ssfmax, &i__1, &c__1, &d__[l], n, info); i__1 = lend - l; dlascl_("G", &c__0, &c__0, &anorm, &ssfmax, &i__1, &c__1, &e[l], n, info); } else if (anorm < ssfmin) { iscale = 2; i__1 = lend - l + 1; dlascl_("G", &c__0, &c__0, &anorm, &ssfmin, &i__1, &c__1, &d__[l], n, info); i__1 = lend - l; dlascl_("G", &c__0, &c__0, &anorm, &ssfmin, &i__1, &c__1, &e[l], n, info); } i__1 = lend - 1; for (i__ = l; i__ <= i__1; ++i__) { /* Computing 2nd power */ d__1 = e[i__]; e[i__] = d__1 * d__1; /* L40: */ } /* Choose between QL and QR iteration */ if ((d__1 = d__[lend], abs(d__1)) < (d__2 = d__[l], abs(d__2))) { lend = lsv; l = lendsv; } if (lend >= l) { /* QL Iteration Look for small subdiagonal element. */ L50: if (l != lend) { i__1 = lend - 1; for (m = l; m <= i__1; ++m) { if ((d__2 = e[m], abs(d__2)) <= eps2 * (d__1 = d__[m] * d__[m + 1], abs(d__1))) { goto L70; } /* L60: */ } } m = lend; L70: if (m < lend) { e[m] = 0.; } p = d__[l]; if (m == l) { goto L90; } /* If remaining matrix is 2 by 2, use DLAE2 to compute its eigenvalues. */ if (m == l + 1) { rte = sqrt(e[l]); dlae2_(&d__[l], &rte, &d__[l + 1], &rt1, &rt2); d__[l] = rt1; d__[l + 1] = rt2; e[l] = 0.; l += 2; if (l <= lend) { goto L50; } goto L150; } if (jtot == nmaxit) { goto L150; } ++jtot; /* Form shift. */ rte = sqrt(e[l]); sigma = (d__[l + 1] - p) / (rte * 2.); r__ = dlapy2_(&sigma, &c_b32); sigma = p - rte / (sigma + d_sign(&r__, &sigma)); c__ = 1.; s = 0.; gamma = d__[m] - sigma; p = gamma * gamma; /* Inner loop */ i__1 = l; for (i__ = m - 1; i__ >= i__1; --i__) { bb = e[i__]; r__ = p + bb; if (i__ != m - 1) { e[i__ + 1] = s * r__; } oldc = c__; c__ = p / r__; s = bb / r__; oldgam = gamma; alpha = d__[i__]; gamma = c__ * (alpha - sigma) - s * oldgam; d__[i__ + 1] = oldgam + (alpha - gamma); if (c__ != 0.) { p = gamma * gamma / c__; } else { p = oldc * bb; } /* L80: */ } e[l] = s * p; d__[l] = sigma + gamma; goto L50; /* Eigenvalue found. */ L90: d__[l] = p; ++l; if (l <= lend) { goto L50; } goto L150; } else { /* QR Iteration Look for small superdiagonal element. */ L100: i__1 = lend + 1; for (m = l; m >= i__1; --m) { if ((d__2 = e[m - 1], abs(d__2)) <= eps2 * (d__1 = d__[m] * d__[m - 1], abs(d__1))) { goto L120; } /* L110: */ } m = lend; L120: if (m > lend) { e[m - 1] = 0.; } p = d__[l]; if (m == l) { goto L140; } /* If remaining matrix is 2 by 2, use DLAE2 to compute its eigenvalues. */ if (m == l - 1) { rte = sqrt(e[l - 1]); dlae2_(&d__[l], &rte, &d__[l - 1], &rt1, &rt2); d__[l] = rt1; d__[l - 1] = rt2; e[l - 1] = 0.; l += -2; if (l >= lend) { goto L100; } goto L150; } if (jtot == nmaxit) { goto L150; } ++jtot; /* Form shift. */ rte = sqrt(e[l - 1]); sigma = (d__[l - 1] - p) / (rte * 2.); r__ = dlapy2_(&sigma, &c_b32); sigma = p - rte / (sigma + d_sign(&r__, &sigma)); c__ = 1.; s = 0.; gamma = d__[m] - sigma; p = gamma * gamma; /* Inner loop */ i__1 = l - 1; for (i__ = m; i__ <= i__1; ++i__) { bb = e[i__]; r__ = p + bb; if (i__ != m) { e[i__ - 1] = s * r__; } oldc = c__; c__ = p / r__; s = bb / r__; oldgam = gamma; alpha = d__[i__ + 1]; gamma = c__ * (alpha - sigma) - s * oldgam; d__[i__] = oldgam + (alpha - gamma); if (c__ != 0.) { p = gamma * gamma / c__; } else { p = oldc * bb; } /* L130: */ } e[l - 1] = s * p; d__[l] = sigma + gamma; goto L100; /* Eigenvalue found. */ L140: d__[l] = p; --l; if (l >= lend) { goto L100; } goto L150; } /* Undo scaling if necessary */ L150: if (iscale == 1) { i__1 = lendsv - lsv + 1; dlascl_("G", &c__0, &c__0, &ssfmax, &anorm, &i__1, &c__1, &d__[lsv], n, info); } if (iscale == 2) { i__1 = lendsv - lsv + 1; dlascl_("G", &c__0, &c__0, &ssfmin, &anorm, &i__1, &c__1, &d__[lsv], n, info); } /* Check for no convergence to an eigenvalue after a total of N*MAXIT iterations. */ if (jtot < nmaxit) { goto L10; } i__1 = *n - 1; for (i__ = 1; i__ <= i__1; ++i__) { if (e[i__] != 0.) { ++(*info); } /* L160: */ } goto L180; /* Sort eigenvalues in increasing order. */ L170: dlasrt_("I", n, &d__[1], info); L180: return 0; /* End of DSTERF */ } /* dsterf_ */ #ifdef __cplusplus } #endif hypre-2.33.0/src/lapack/dsyev.c000066400000000000000000000173301477326011500162600ustar00rootroot00000000000000/* Copyright (c) 1992-2008 The University of Tennessee. All rights reserved. * See file COPYING in this directory for details. */ #ifdef __cplusplus extern "C" { #endif #include "f2c.h" #include "hypre_lapack.h" /* Subroutine */ integer dsyev_(const char *jobz,const char *uplo, integer *n, doublereal *a, integer *lda, doublereal *w, doublereal *work, integer *lwork, integer *info) { /* -- LAPACK driver routine (version 3.0) -- Univ. of Tennessee, Univ. of California Berkeley, NAG Ltd., Courant Institute, Argonne National Lab, and Rice University June 30, 1999 Purpose ======= DSYEV computes all eigenvalues and, optionally, eigenvectors of a real symmetric matrix A. Arguments ========= JOBZ (input) CHARACTER*1 = 'N': Compute eigenvalues only; = 'V': Compute eigenvalues and eigenvectors. UPLO (input) CHARACTER*1 = 'U': Upper triangle of A is stored; = 'L': Lower triangle of A is stored. N (input) INTEGER The order of the matrix A. N >= 0. A (input/output) DOUBLE PRECISION array, dimension (LDA, N) On entry, the symmetric matrix A. If UPLO = 'U', the leading N-by-N upper triangular part of A contains the upper triangular part of the matrix A. If UPLO = 'L', the leading N-by-N lower triangular part of A contains the lower triangular part of the matrix A. On exit, if JOBZ = 'V', then if INFO = 0, A contains the orthonormal eigenvectors of the matrix A. If JOBZ = 'N', then on exit the lower triangle (if UPLO='L') or the upper triangle (if UPLO='U') of A, including the diagonal, is destroyed. LDA (input) INTEGER The leading dimension of the array A. LDA >= max(1,N). W (output) DOUBLE PRECISION array, dimension (N) If INFO = 0, the eigenvalues in ascending order. WORK (workspace/output) DOUBLE PRECISION array, dimension (LWORK) On exit, if INFO = 0, WORK(1) returns the optimal LWORK. LWORK (input) INTEGER The length of the array WORK. LWORK >= max(1,3*N-1). For optimal efficiency, LWORK >= (NB+2)*N, where NB is the blocksize for DSYTRD returned by ILAENV. If LWORK = -1, then a workspace query is assumed; the routine only calculates the optimal size of the WORK array, returns this value as the first entry of the WORK array, and no error message related to LWORK is issued by XERBLA. INFO (output) INTEGER = 0: successful exit < 0: if INFO = -i, the i-th argument had an illegal value > 0: if INFO = i, the algorithm failed to converge; i off-diagonal elements of an intermediate tridiagonal form did not converge to zero. ===================================================================== Test the input parameters. Parameter adjustments */ /* Table of constant values */ integer c__1 = 1; integer c_n1 = -1; integer c__0 = 0; doublereal c_b17 = 1.; /* System generated locals */ integer a_dim1, a_offset, i__1, i__2; doublereal d__1; /* Local variables */ integer inde; doublereal anrm; integer imax; doublereal rmin, rmax; /*** integer lopt;***/ extern /* Subroutine */ integer dscal_(integer *, doublereal *, doublereal *, integer *); doublereal sigma; extern logical lsame_(const char *,const char *); integer iinfo; logical lower, wantz; integer nb; extern doublereal dlamch_(const char *); integer iscale; extern /* Subroutine */ integer dlascl_(const char *, integer *, integer *, doublereal *, doublereal *, integer *, integer *, doublereal *, integer *, integer *); doublereal safmin; extern integer ilaenv_(integer *,const char *,const char *, integer *, integer *, integer *, integer *, ftnlen, ftnlen); extern /* Subroutine */ integer xerbla_(const char *, integer *); doublereal bignum; integer indtau; extern /* Subroutine */ integer dsterf_(integer *, doublereal *, doublereal *, integer *); extern doublereal dlansy_(const char *,const char *, integer *, doublereal *, integer *, doublereal *); integer indwrk; extern /* Subroutine */ integer dorgtr_(const char *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *, integer *), dsteqr_(const char *, integer *, doublereal *, doublereal *, doublereal *, integer *, doublereal *, integer *), dsytrd_(const char *, integer *, doublereal *, integer *, doublereal *, doublereal *, doublereal *, doublereal *, integer *, integer *); integer llwork; doublereal smlnum; integer lwkopt; logical lquery; doublereal eps; #define a_ref(a_1,a_2) a[(a_2)*a_dim1 + a_1] a_dim1 = *lda; a_offset = 1 + a_dim1 * 1; a -= a_offset; --w; --work; /* Function Body */ wantz = lsame_(jobz, "V"); lower = lsame_(uplo, "L"); lquery = *lwork == -1; *info = 0; if (! (wantz || lsame_(jobz, "N"))) { *info = -1; } else if (! (lower || lsame_(uplo, "U"))) { *info = -2; } else if (*n < 0) { *info = -3; } else if (*lda < max(1,*n)) { *info = -5; } else /* if(complicated condition) */ { /* Computing MAX */ i__1 = 1, i__2 = *n * 3 - 1; if (*lwork < max(i__1,i__2) && ! lquery) { *info = -8; } } if (*info == 0) { nb = ilaenv_(&c__1, "DSYTRD", uplo, n, &c_n1, &c_n1, &c_n1, (ftnlen)6, (ftnlen)1); /* Computing MAX */ i__1 = 1, i__2 = (nb + 2) * *n; lwkopt = max(i__1,i__2); work[1] = (doublereal) lwkopt; } if (*info != 0) { i__1 = -(*info); xerbla_("DSYEV ", &i__1); return 0; } else if (lquery) { return 0; } /* Quick return if possible */ if (*n == 0) { work[1] = 1.; return 0; } if (*n == 1) { w[1] = a_ref(1, 1); work[1] = 3.; if (wantz) { a_ref(1, 1) = 1.; } return 0; } /* Get machine constants. */ safmin = dlamch_("Safe minimum"); eps = dlamch_("Precision"); smlnum = safmin / eps; bignum = 1. / smlnum; rmin = sqrt(smlnum); rmax = sqrt(bignum); /* Scale matrix to allowable range, if necessary. */ anrm = dlansy_("M", uplo, n, &a[a_offset], lda, &work[1]); iscale = 0; if (anrm > 0. && anrm < rmin) { iscale = 1; sigma = rmin / anrm; } else if (anrm > rmax) { iscale = 1; sigma = rmax / anrm; } if (iscale == 1) { dlascl_(uplo, &c__0, &c__0, &c_b17, &sigma, n, n, &a[a_offset], lda, info); } /* Call DSYTRD to reduce symmetric matrix to tridiagonal form. */ inde = 1; indtau = inde + *n; indwrk = indtau + *n; llwork = *lwork - indwrk + 1; dsytrd_(uplo, n, &a[a_offset], lda, &w[1], &work[inde], &work[indtau], & work[indwrk], &llwork, &iinfo); /***lopt = (integer) ((*n << 1) + work[indwrk]);***/ /* For eigenvalues only, call DSTERF. For eigenvectors, first call DORGTR to generate the orthogonal matrix, then call DSTEQR. */ if (! wantz) { dsterf_(n, &w[1], &work[inde], info); } else { dorgtr_(uplo, n, &a[a_offset], lda, &work[indtau], &work[indwrk], & llwork, &iinfo); dsteqr_(jobz, n, &w[1], &work[inde], &a[a_offset], lda, &work[indtau], info); } /* If matrix was scaled, then rescale eigenvalues appropriately. */ if (iscale == 1) { if (*info == 0) { imax = *n; } else { imax = *info - 1; } d__1 = 1. / sigma; dscal_(&imax, &d__1, &w[1], &c__1); } /* Set WORK(1) to optimal workspace size. */ work[1] = (doublereal) lwkopt; return 0; /* End of DSYEV */ } /* dsyev_ */ #undef a_ref #ifdef __cplusplus } #endif hypre-2.33.0/src/lapack/dsygs2.c000066400000000000000000000175451477326011500163510ustar00rootroot00000000000000/* Copyright (c) 1992-2008 The University of Tennessee. All rights reserved. * See file COPYING in this directory for details. */ #ifdef __cplusplus extern "C" { #endif #include "f2c.h" #include "hypre_lapack.h" /* Subroutine */ integer dsygs2_(integer *itype,const char *uplo, integer *n, doublereal *a, integer *lda, doublereal *b, integer *ldb, integer * info) { /* -- LAPACK routine (version 3.0) -- Univ. of Tennessee, Univ. of California Berkeley, NAG Ltd., Courant Institute, Argonne National Lab, and Rice University February 29, 1992 Purpose ======= DSYGS2 reduces a real symmetric-definite generalized eigenproblem to standard form. If ITYPE = 1, the problem is A*x = lambda*B*x, and A is overwritten by inv(U')*A*inv(U) or inv(L)*A*inv(L') If ITYPE = 2 or 3, the problem is A*B*x = lambda*x or B*A*x = lambda*x, and A is overwritten by U*A*U` or L'*A*L. B must have been previously factorized as U'*U or L*L' by DPOTRF. Arguments ========= ITYPE (input) INTEGER = 1: compute inv(U')*A*inv(U) or inv(L)*A*inv(L'); = 2 or 3: compute U*A*U' or L'*A*L. UPLO (input) CHARACTER Specifies whether the upper or lower triangular part of the symmetric matrix A is stored, and how B has been factorized. = 'U': Upper triangular = 'L': Lower triangular N (input) INTEGER The order of the matrices A and B. N >= 0. A (input/output) DOUBLE PRECISION array, dimension (LDA,N) On entry, the symmetric matrix A. If UPLO = 'U', the leading n by n upper triangular part of A contains the upper triangular part of the matrix A, and the strictly lower triangular part of A is not referenced. If UPLO = 'L', the leading n by n lower triangular part of A contains the lower triangular part of the matrix A, and the strictly upper triangular part of A is not referenced. On exit, if INFO = 0, the transformed matrix, stored in the same format as A. LDA (input) INTEGER The leading dimension of the array A. LDA >= max(1,N). B (input) DOUBLE PRECISION array, dimension (LDB,N) The triangular factor from the Cholesky factorization of B, as returned by DPOTRF. LDB (input) INTEGER The leading dimension of the array B. LDB >= max(1,N). INFO (output) INTEGER = 0: successful exit. < 0: if INFO = -i, the i-th argument had an illegal value. ===================================================================== Test the input parameters. Parameter adjustments */ /* Table of constant values */ doublereal c_b6 = -1.; integer c__1 = 1; doublereal c_b27 = 1.; /* System generated locals */ integer a_dim1, a_offset, b_dim1, b_offset, i__1, i__2; doublereal d__1; /* Local variables */ extern /* Subroutine */ integer dsyr2_(const char *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *, doublereal *, integer *); integer k; extern /* Subroutine */ integer dscal_(integer *, doublereal *, doublereal *, integer *); extern logical lsame_(const char *,const char *); extern /* Subroutine */ integer daxpy_(integer *, doublereal *, doublereal *, integer *, doublereal *, integer *); logical upper; extern /* Subroutine */ integer dtrmv_(const char *,const char *,const char *, integer *, doublereal *, integer *, doublereal *, integer *), dtrsv_(const char *,const char *,const char *, integer *, doublereal *, integer *, doublereal *, integer *); doublereal ct; extern /* Subroutine */ integer xerbla_(const char *, integer *); doublereal akk, bkk; #define a_ref(a_1,a_2) a[(a_2)*a_dim1 + a_1] #define b_ref(a_1,a_2) b[(a_2)*b_dim1 + a_1] a_dim1 = *lda; a_offset = 1 + a_dim1 * 1; a -= a_offset; b_dim1 = *ldb; b_offset = 1 + b_dim1 * 1; b -= b_offset; /* Function Body */ *info = 0; upper = lsame_(uplo, "U"); if (*itype < 1 || *itype > 3) { *info = -1; } else if (! upper && ! lsame_(uplo, "L")) { *info = -2; } else if (*n < 0) { *info = -3; } else if (*lda < max(1,*n)) { *info = -5; } else if (*ldb < max(1,*n)) { *info = -7; } if (*info != 0) { i__1 = -(*info); xerbla_("DSYGS2", &i__1); return 0; } if (*itype == 1) { if (upper) { /* Compute inv(U')*A*inv(U) */ i__1 = *n; for (k = 1; k <= i__1; ++k) { /* Update the upper triangle of A(k:n,k:n) */ akk = a_ref(k, k); bkk = b_ref(k, k); /* Computing 2nd power */ d__1 = bkk; akk /= d__1 * d__1; a_ref(k, k) = akk; if (k < *n) { i__2 = *n - k; d__1 = 1. / bkk; dscal_(&i__2, &d__1, &a_ref(k, k + 1), lda); ct = akk * -.5; i__2 = *n - k; daxpy_(&i__2, &ct, &b_ref(k, k + 1), ldb, &a_ref(k, k + 1) , lda); i__2 = *n - k; dsyr2_(uplo, &i__2, &c_b6, &a_ref(k, k + 1), lda, &b_ref( k, k + 1), ldb, &a_ref(k + 1, k + 1), lda); i__2 = *n - k; daxpy_(&i__2, &ct, &b_ref(k, k + 1), ldb, &a_ref(k, k + 1) , lda); i__2 = *n - k; dtrsv_(uplo, "Transpose", "Non-unit", &i__2, &b_ref(k + 1, k + 1), ldb, &a_ref(k, k + 1), lda); } /* L10: */ } } else { /* Compute inv(L)*A*inv(L') */ i__1 = *n; for (k = 1; k <= i__1; ++k) { /* Update the lower triangle of A(k:n,k:n) */ akk = a_ref(k, k); bkk = b_ref(k, k); /* Computing 2nd power */ d__1 = bkk; akk /= d__1 * d__1; a_ref(k, k) = akk; if (k < *n) { i__2 = *n - k; d__1 = 1. / bkk; dscal_(&i__2, &d__1, &a_ref(k + 1, k), &c__1); ct = akk * -.5; i__2 = *n - k; daxpy_(&i__2, &ct, &b_ref(k + 1, k), &c__1, &a_ref(k + 1, k), &c__1); i__2 = *n - k; dsyr2_(uplo, &i__2, &c_b6, &a_ref(k + 1, k), &c__1, & b_ref(k + 1, k), &c__1, &a_ref(k + 1, k + 1), lda); i__2 = *n - k; daxpy_(&i__2, &ct, &b_ref(k + 1, k), &c__1, &a_ref(k + 1, k), &c__1); i__2 = *n - k; dtrsv_(uplo, "No transpose", "Non-unit", &i__2, &b_ref(k + 1, k + 1), ldb, &a_ref(k + 1, k), &c__1); } /* L20: */ } } } else { if (upper) { /* Compute U*A*U' */ i__1 = *n; for (k = 1; k <= i__1; ++k) { /* Update the upper triangle of A(1:k,1:k) */ akk = a_ref(k, k); bkk = b_ref(k, k); i__2 = k - 1; dtrmv_(uplo, "No transpose", "Non-unit", &i__2, &b[b_offset], ldb, &a_ref(1, k), &c__1); ct = akk * .5; i__2 = k - 1; daxpy_(&i__2, &ct, &b_ref(1, k), &c__1, &a_ref(1, k), &c__1); i__2 = k - 1; dsyr2_(uplo, &i__2, &c_b27, &a_ref(1, k), &c__1, &b_ref(1, k), &c__1, &a[a_offset], lda); i__2 = k - 1; daxpy_(&i__2, &ct, &b_ref(1, k), &c__1, &a_ref(1, k), &c__1); i__2 = k - 1; dscal_(&i__2, &bkk, &a_ref(1, k), &c__1); /* Computing 2nd power */ d__1 = bkk; a_ref(k, k) = akk * (d__1 * d__1); /* L30: */ } } else { /* Compute L'*A*L */ i__1 = *n; for (k = 1; k <= i__1; ++k) { /* Update the lower triangle of A(1:k,1:k) */ akk = a_ref(k, k); bkk = b_ref(k, k); i__2 = k - 1; dtrmv_(uplo, "Transpose", "Non-unit", &i__2, &b[b_offset], ldb, &a_ref(k, 1), lda); ct = akk * .5; i__2 = k - 1; daxpy_(&i__2, &ct, &b_ref(k, 1), ldb, &a_ref(k, 1), lda); i__2 = k - 1; dsyr2_(uplo, &i__2, &c_b27, &a_ref(k, 1), lda, &b_ref(k, 1), ldb, &a[a_offset], lda); i__2 = k - 1; daxpy_(&i__2, &ct, &b_ref(k, 1), ldb, &a_ref(k, 1), lda); i__2 = k - 1; dscal_(&i__2, &bkk, &a_ref(k, 1), lda); /* Computing 2nd power */ d__1 = bkk; a_ref(k, k) = akk * (d__1 * d__1); /* L40: */ } } } return 0; /* End of DSYGS2 */ } /* dsygs2_ */ #undef b_ref #undef a_ref #ifdef __cplusplus } #endif hypre-2.33.0/src/lapack/dsygst.c000066400000000000000000000236721477326011500164510ustar00rootroot00000000000000/* Copyright (c) 1992-2008 The University of Tennessee. All rights reserved. * See file COPYING in this directory for details. */ #ifdef __cplusplus extern "C" { #endif #include "f2c.h" #include "hypre_lapack.h" /* Subroutine */ integer dsygst_(integer *itype,const char *uplo, integer *n, doublereal *a, integer *lda, doublereal *b, integer *ldb, integer * info) { /* -- LAPACK routine (version 3.0) -- Univ. of Tennessee, Univ. of California Berkeley, NAG Ltd., Courant Institute, Argonne National Lab, and Rice University September 30, 1994 Purpose ======= DSYGST reduces a real symmetric-definite generalized eigenproblem to standard form. If ITYPE = 1, the problem is A*x = lambda*B*x, and A is overwritten by inv(U**T)*A*inv(U) or inv(L)*A*inv(L**T) If ITYPE = 2 or 3, the problem is A*B*x = lambda*x or B*A*x = lambda*x, and A is overwritten by U*A*U**T or L**T*A*L. B must have been previously factorized as U**T*U or L*L**T by DPOTRF. Arguments ========= ITYPE (input) INTEGER = 1: compute inv(U**T)*A*inv(U) or inv(L)*A*inv(L**T); = 2 or 3: compute U*A*U**T or L**T*A*L. UPLO (input) CHARACTER = 'U': Upper triangle of A is stored and B is factored as U**T*U; = 'L': Lower triangle of A is stored and B is factored as L*L**T. N (input) INTEGER The order of the matrices A and B. N >= 0. A (input/output) DOUBLE PRECISION array, dimension (LDA,N) On entry, the symmetric matrix A. If UPLO = 'U', the leading N-by-N upper triangular part of A contains the upper triangular part of the matrix A, and the strictly lower triangular part of A is not referenced. If UPLO = 'L', the leading N-by-N lower triangular part of A contains the lower triangular part of the matrix A, and the strictly upper triangular part of A is not referenced. On exit, if INFO = 0, the transformed matrix, stored in the same format as A. LDA (input) INTEGER The leading dimension of the array A. LDA >= max(1,N). B (input) DOUBLE PRECISION array, dimension (LDB,N) The triangular factor from the Cholesky factorization of B, as returned by DPOTRF. LDB (input) INTEGER The leading dimension of the array B. LDB >= max(1,N). INFO (output) INTEGER = 0: successful exit < 0: if INFO = -i, the i-th argument had an illegal value ===================================================================== Test the input parameters. Parameter adjustments */ /* Table of constant values */ integer c__1 = 1; integer c_n1 = -1; doublereal c_b14 = 1.; doublereal c_b16 = -.5; doublereal c_b19 = -1.; doublereal c_b52 = .5; /* System generated locals */ integer a_dim1, a_offset, b_dim1, b_offset, i__1, i__2, i__3; /* Local variables */ integer k; extern logical lsame_(const char *,const char *); extern /* Subroutine */ integer dtrmm_(const char *,const char *,const char *,const char *, integer *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *), dsymm_( const char *,const char *, integer *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *); logical upper; extern /* Subroutine */ integer dtrsm_(const char *,const char *,const char *,const char *, integer *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *), dsygs2_( integer *,const char *, integer *, doublereal *, integer *, doublereal *, integer *, integer *); integer kb; extern /* Subroutine */ integer dsyr2k_(const char *,const char *, integer *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *); integer nb; extern /* Subroutine */ integer xerbla_(const char *, integer *); extern integer ilaenv_(integer *,const char *,const char *, integer *, integer *, integer *, integer *, ftnlen, ftnlen); #define a_ref(a_1,a_2) a[(a_2)*a_dim1 + a_1] #define b_ref(a_1,a_2) b[(a_2)*b_dim1 + a_1] a_dim1 = *lda; a_offset = 1 + a_dim1 * 1; a -= a_offset; b_dim1 = *ldb; b_offset = 1 + b_dim1 * 1; b -= b_offset; /* Function Body */ *info = 0; upper = lsame_(uplo, "U"); if (*itype < 1 || *itype > 3) { *info = -1; } else if (! upper && ! lsame_(uplo, "L")) { *info = -2; } else if (*n < 0) { *info = -3; } else if (*lda < max(1,*n)) { *info = -5; } else if (*ldb < max(1,*n)) { *info = -7; } if (*info != 0) { i__1 = -(*info); xerbla_("DSYGST", &i__1); return 0; } /* Quick return if possible */ if (*n == 0) { return 0; } /* Determine the block size for this environment. */ nb = ilaenv_(&c__1, "DSYGST", uplo, n, &c_n1, &c_n1, &c_n1, (ftnlen)6, ( ftnlen)1); if (nb <= 1 || nb >= *n) { /* Use unblocked code */ dsygs2_(itype, uplo, n, &a[a_offset], lda, &b[b_offset], ldb, info); } else { /* Use blocked code */ if (*itype == 1) { if (upper) { /* Compute inv(U')*A*inv(U) */ i__1 = *n; i__2 = nb; for (k = 1; i__2 < 0 ? k >= i__1 : k <= i__1; k += i__2) { /* Computing MIN */ i__3 = *n - k + 1; kb = min(i__3,nb); /* Update the upper triangle of A(k:n,k:n) */ dsygs2_(itype, uplo, &kb, &a_ref(k, k), lda, &b_ref(k, k), ldb, info); if (k + kb <= *n) { i__3 = *n - k - kb + 1; dtrsm_("Left", uplo, "Transpose", "Non-unit", &kb, & i__3, &c_b14, &b_ref(k, k), ldb, &a_ref(k, k + kb), lda); i__3 = *n - k - kb + 1; dsymm_("Left", uplo, &kb, &i__3, &c_b16, &a_ref(k, k), lda, &b_ref(k, k + kb), ldb, &c_b14, &a_ref( k, k + kb), lda); i__3 = *n - k - kb + 1; dsyr2k_(uplo, "Transpose", &i__3, &kb, &c_b19, &a_ref( k, k + kb), lda, &b_ref(k, k + kb), ldb, & c_b14, &a_ref(k + kb, k + kb), lda); i__3 = *n - k - kb + 1; dsymm_("Left", uplo, &kb, &i__3, &c_b16, &a_ref(k, k), lda, &b_ref(k, k + kb), ldb, &c_b14, &a_ref( k, k + kb), lda); i__3 = *n - k - kb + 1; dtrsm_("Right", uplo, "No transpose", "Non-unit", &kb, &i__3, &c_b14, &b_ref(k + kb, k + kb), ldb, & a_ref(k, k + kb), lda); } /* L10: */ } } else { /* Compute inv(L)*A*inv(L') */ i__2 = *n; i__1 = nb; for (k = 1; i__1 < 0 ? k >= i__2 : k <= i__2; k += i__1) { /* Computing MIN */ i__3 = *n - k + 1; kb = min(i__3,nb); /* Update the lower triangle of A(k:n,k:n) */ dsygs2_(itype, uplo, &kb, &a_ref(k, k), lda, &b_ref(k, k), ldb, info); if (k + kb <= *n) { i__3 = *n - k - kb + 1; dtrsm_("Right", uplo, "Transpose", "Non-unit", &i__3, &kb, &c_b14, &b_ref(k, k), ldb, &a_ref(k + kb, k), lda); i__3 = *n - k - kb + 1; dsymm_("Right", uplo, &i__3, &kb, &c_b16, &a_ref(k, k) , lda, &b_ref(k + kb, k), ldb, &c_b14, &a_ref( k + kb, k), lda); i__3 = *n - k - kb + 1; dsyr2k_(uplo, "No transpose", &i__3, &kb, &c_b19, & a_ref(k + kb, k), lda, &b_ref(k + kb, k), ldb, &c_b14, &a_ref(k + kb, k + kb), lda); i__3 = *n - k - kb + 1; dsymm_("Right", uplo, &i__3, &kb, &c_b16, &a_ref(k, k) , lda, &b_ref(k + kb, k), ldb, &c_b14, &a_ref( k + kb, k), lda); i__3 = *n - k - kb + 1; dtrsm_("Left", uplo, "No transpose", "Non-unit", & i__3, &kb, &c_b14, &b_ref(k + kb, k + kb), ldb, &a_ref(k + kb, k), lda); } /* L20: */ } } } else { if (upper) { /* Compute U*A*U' */ i__1 = *n; i__2 = nb; for (k = 1; i__2 < 0 ? k >= i__1 : k <= i__1; k += i__2) { /* Computing MIN */ i__3 = *n - k + 1; kb = min(i__3,nb); /* Update the upper triangle of A(1:k+kb-1,1:k+kb-1) */ i__3 = k - 1; dtrmm_("Left", uplo, "No transpose", "Non-unit", &i__3, & kb, &c_b14, &b[b_offset], ldb, &a_ref(1, k), lda); i__3 = k - 1; dsymm_("Right", uplo, &i__3, &kb, &c_b52, &a_ref(k, k), lda, &b_ref(1, k), ldb, &c_b14, &a_ref(1, k), lda); i__3 = k - 1; dsyr2k_(uplo, "No transpose", &i__3, &kb, &c_b14, &a_ref( 1, k), lda, &b_ref(1, k), ldb, &c_b14, &a[ a_offset], lda); i__3 = k - 1; dsymm_("Right", uplo, &i__3, &kb, &c_b52, &a_ref(k, k), lda, &b_ref(1, k), ldb, &c_b14, &a_ref(1, k), lda); i__3 = k - 1; dtrmm_("Right", uplo, "Transpose", "Non-unit", &i__3, &kb, &c_b14, &b_ref(k, k), ldb, &a_ref(1, k), lda); dsygs2_(itype, uplo, &kb, &a_ref(k, k), lda, &b_ref(k, k), ldb, info); /* L30: */ } } else { /* Compute L'*A*L */ i__2 = *n; i__1 = nb; for (k = 1; i__1 < 0 ? k >= i__2 : k <= i__2; k += i__1) { /* Computing MIN */ i__3 = *n - k + 1; kb = min(i__3,nb); /* Update the lower triangle of A(1:k+kb-1,1:k+kb-1) */ i__3 = k - 1; dtrmm_("Right", uplo, "No transpose", "Non-unit", &kb, & i__3, &c_b14, &b[b_offset], ldb, &a_ref(k, 1), lda); i__3 = k - 1; dsymm_("Left", uplo, &kb, &i__3, &c_b52, &a_ref(k, k), lda, &b_ref(k, 1), ldb, &c_b14, &a_ref(k, 1), lda); i__3 = k - 1; dsyr2k_(uplo, "Transpose", &i__3, &kb, &c_b14, &a_ref(k, 1), lda, &b_ref(k, 1), ldb, &c_b14, &a[a_offset], lda); i__3 = k - 1; dsymm_("Left", uplo, &kb, &i__3, &c_b52, &a_ref(k, k), lda, &b_ref(k, 1), ldb, &c_b14, &a_ref(k, 1), lda); i__3 = k - 1; dtrmm_("Left", uplo, "Transpose", "Non-unit", &kb, &i__3, &c_b14, &b_ref(k, k), ldb, &a_ref(k, 1), lda); dsygs2_(itype, uplo, &kb, &a_ref(k, k), lda, &b_ref(k, k), ldb, info); /* L40: */ } } } } return 0; /* End of DSYGST */ } /* dsygst_ */ #undef b_ref #undef a_ref #ifdef __cplusplus } #endif hypre-2.33.0/src/lapack/dsygv.c000066400000000000000000000212611477326011500162600ustar00rootroot00000000000000/* Copyright (c) 1992-2008 The University of Tennessee. All rights reserved. * See file COPYING in this directory for details. */ #ifdef __cplusplus extern "C" { #endif #include "f2c.h" #include "hypre_lapack.h" /* Subroutine */ integer dsygv_(integer *itype, char *jobz, char *uplo, integer * n, doublereal *a, integer *lda, doublereal *b, integer *ldb, doublereal *w, doublereal *work, integer *lwork, integer *info) { /* -- LAPACK driver routine (version 3.0) -- Univ. of Tennessee, Univ. of California Berkeley, NAG Ltd., Courant Institute, Argonne National Lab, and Rice University June 30, 1999 Purpose ======= DSYGV computes all the eigenvalues, and optionally, the eigenvectors of a real generalized symmetric-definite eigenproblem, of the form A*x=(lambda)*B*x, A*Bx=(lambda)*x, or B*A*x=(lambda)*x. Here A and B are assumed to be symmetric and B is also positive definite. Arguments ========= ITYPE (input) INTEGER Specifies the problem type to be solved: = 1: A*x = (lambda)*B*x = 2: A*B*x = (lambda)*x = 3: B*A*x = (lambda)*x JOBZ (input) CHARACTER*1 = 'N': Compute eigenvalues only; = 'V': Compute eigenvalues and eigenvectors. UPLO (input) CHARACTER*1 = 'U': Upper triangles of A and B are stored; = 'L': Lower triangles of A and B are stored. N (input) INTEGER The order of the matrices A and B. N >= 0. A (input/output) DOUBLE PRECISION array, dimension (LDA, N) On entry, the symmetric matrix A. If UPLO = 'U', the leading N-by-N upper triangular part of A contains the upper triangular part of the matrix A. If UPLO = 'L', the leading N-by-N lower triangular part of A contains the lower triangular part of the matrix A. On exit, if JOBZ = 'V', then if INFO = 0, A contains the matrix Z of eigenvectors. The eigenvectors are normalized as follows: if ITYPE = 1 or 2, Z**T*B*Z = I; if ITYPE = 3, Z**T*inv(B)*Z = I. If JOBZ = 'N', then on exit the upper triangle (if UPLO='U') or the lower triangle (if UPLO='L') of A, including the diagonal, is destroyed. LDA (input) INTEGER The leading dimension of the array A. LDA >= max(1,N). B (input/output) DOUBLE PRECISION array, dimension (LDB, N) On entry, the symmetric positive definite matrix B. If UPLO = 'U', the leading N-by-N upper triangular part of B contains the upper triangular part of the matrix B. If UPLO = 'L', the leading N-by-N lower triangular part of B contains the lower triangular part of the matrix B. On exit, if INFO <= N, the part of B containing the matrix is overwritten by the triangular factor U or L from the Cholesky factorization B = U**T*U or B = L*L**T. LDB (input) INTEGER The leading dimension of the array B. LDB >= max(1,N). W (output) DOUBLE PRECISION array, dimension (N) If INFO = 0, the eigenvalues in ascending order. WORK (workspace/output) DOUBLE PRECISION array, dimension (LWORK) On exit, if INFO = 0, WORK(1) returns the optimal LWORK. LWORK (input) INTEGER The length of the array WORK. LWORK >= max(1,3*N-1). For optimal efficiency, LWORK >= (NB+2)*N, where NB is the blocksize for DSYTRD returned by ILAENV. If LWORK = -1, then a workspace query is assumed; the routine only calculates the optimal size of the WORK array, returns this value as the first entry of the WORK array, and no error message related to LWORK is issued by XERBLA. INFO (output) INTEGER = 0: successful exit < 0: if INFO = -i, the i-th argument had an illegal value > 0: DPOTRF or DSYEV returned an error code: <= N: if INFO = i, DSYEV failed to converge; i off-diagonal elements of an intermediate tridiagonal form did not converge to zero; > N: if INFO = N + i, for 1 <= i <= N, then the leading minor of order i of B is not positive definite. The factorization of B could not be completed and no eigenvalues or eigenvectors were computed. ===================================================================== Test the input parameters. Parameter adjustments */ /* Table of constant values */ integer c__1 = 1; integer c_n1 = -1; doublereal c_b16 = 1.; /* System generated locals */ integer a_dim1, a_offset, b_dim1, b_offset, i__1, i__2; /* Local variables */ integer neig; extern logical lsame_(const char *,const char *); extern /* Subroutine */ integer dtrmm_(const char *,const char *,const char *,const char *, integer *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *); char trans[1]; extern /* Subroutine */ integer dtrsm_(const char *,const char *,const char *,const char *, integer *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *); logical upper; extern /* Subroutine */ integer dsyev_(const char *,const char *, integer *, doublereal * , integer *, doublereal *, doublereal *, integer *, integer *); logical wantz; integer nb; extern /* Subroutine */ integer xerbla_(const char *, integer *); extern integer ilaenv_(integer *,const char *,const char *, integer *, integer *, integer *, integer *, ftnlen, ftnlen); extern /* Subroutine */ integer dpotrf_(const char *, integer *, doublereal *, integer *, integer *), dsygst_(integer *,const char *, integer *, doublereal *, integer *, doublereal *, integer *, integer *); integer lwkopt; logical lquery; a_dim1 = *lda; a_offset = 1 + a_dim1 * 1; a -= a_offset; b_dim1 = *ldb; b_offset = 1 + b_dim1 * 1; b -= b_offset; --w; --work; /* Function Body */ wantz = lsame_(jobz, "V"); upper = lsame_(uplo, "U"); lquery = *lwork == -1; *info = 0; if (*itype < 1 || *itype > 3) { *info = -1; } else if (! (wantz || lsame_(jobz, "N"))) { *info = -2; } else if (! (upper || lsame_(uplo, "L"))) { *info = -3; } else if (*n < 0) { *info = -4; } else if (*lda < max(1,*n)) { *info = -6; } else if (*ldb < max(1,*n)) { *info = -8; } else /* if(complicated condition) */ { /* Computing MAX */ i__1 = 1, i__2 = *n * 3 - 1; if (*lwork < max(i__1,i__2) && ! lquery) { *info = -11; } } if (*info == 0) { nb = ilaenv_(&c__1, "DSYTRD", uplo, n, &c_n1, &c_n1, &c_n1, (ftnlen)6, (ftnlen)1); lwkopt = (nb + 2) * *n; work[1] = (doublereal) lwkopt; } if (*info != 0) { i__1 = -(*info); xerbla_("DSYGV ", &i__1); return 0; } else if (lquery) { return 0; } /* Quick return if possible */ if (*n == 0) { return 0; } /* Form a Cholesky factorization of B. */ dpotrf_(uplo, n, &b[b_offset], ldb, info); if (*info != 0) { *info = *n + *info; return 0; } /* Transform problem to standard eigenvalue problem and solve. */ dsygst_(itype, uplo, n, &a[a_offset], lda, &b[b_offset], ldb, info); dsyev_(jobz, uplo, n, &a[a_offset], lda, &w[1], &work[1], lwork, info); if (wantz) { /* Backtransform eigenvectors to the original problem. */ neig = *n; if (*info > 0) { neig = *info - 1; } if (*itype == 1 || *itype == 2) { /* For A*x=(lambda)*B*x and A*B*x=(lambda)*x; backtransform eigenvectors: x = inv(L)'*y or inv(U)*y */ if (upper) { *(unsigned char *)trans = 'N'; } else { *(unsigned char *)trans = 'T'; } dtrsm_("Left", uplo, trans, "Non-unit", n, &neig, &c_b16, &b[ b_offset], ldb, &a[a_offset], lda); } else if (*itype == 3) { /* For B*A*x=(lambda)*x; backtransform eigenvectors: x = L*y or U'*y */ if (upper) { *(unsigned char *)trans = 'T'; } else { *(unsigned char *)trans = 'N'; } dtrmm_("Left", uplo, trans, "Non-unit", n, &neig, &c_b16, &b[ b_offset], ldb, &a[a_offset], lda); } } work[1] = (doublereal) lwkopt; return 0; /* End of DSYGV */ } /* dsygv_ */ #ifdef __cplusplus } #endif hypre-2.33.0/src/lapack/dsytd2.c000066400000000000000000000210711477326011500163340ustar00rootroot00000000000000/* Copyright (c) 1992-2008 The University of Tennessee. All rights reserved. * See file COPYING in this directory for details. */ #ifdef __cplusplus extern "C" { #endif #include "f2c.h" #include "hypre_lapack.h" /* Subroutine */ integer dsytd2_(const char *uplo, integer *n, doublereal *a, integer * lda, doublereal *d__, doublereal *e, doublereal *tau, integer *info) { /* -- LAPACK routine (version 3.0) -- Univ. of Tennessee, Univ. of California Berkeley, NAG Ltd., Courant Institute, Argonne National Lab, and Rice University October 31, 1992 Purpose ======= DSYTD2 reduces a real symmetric matrix A to symmetric tridiagonal form T by an orthogonal similarity transformation: Q' * A * Q = T. Arguments ========= UPLO (input) CHARACTER*1 Specifies whether the upper or lower triangular part of the symmetric matrix A is stored: = 'U': Upper triangular = 'L': Lower triangular N (input) INTEGER The order of the matrix A. N >= 0. A (input/output) DOUBLE PRECISION array, dimension (LDA,N) On entry, the symmetric matrix A. If UPLO = 'U', the leading n-by-n upper triangular part of A contains the upper triangular part of the matrix A, and the strictly lower triangular part of A is not referenced. If UPLO = 'L', the leading n-by-n lower triangular part of A contains the lower triangular part of the matrix A, and the strictly upper triangular part of A is not referenced. On exit, if UPLO = 'U', the diagonal and first superdiagonal of A are overwritten by the corresponding elements of the tridiagonal matrix T, and the elements above the first superdiagonal, with the array TAU, represent the orthogonal matrix Q as a product of elementary reflectors; if UPLO = 'L', the diagonal and first subdiagonal of A are over- written by the corresponding elements of the tridiagonal matrix T, and the elements below the first subdiagonal, with the array TAU, represent the orthogonal matrix Q as a product of elementary reflectors. See Further Details. LDA (input) INTEGER The leading dimension of the array A. LDA >= max(1,N). D (output) DOUBLE PRECISION array, dimension (N) The diagonal elements of the tridiagonal matrix T: D(i) = A(i,i). E (output) DOUBLE PRECISION array, dimension (N-1) The off-diagonal elements of the tridiagonal matrix T: E(i) = A(i,i+1) if UPLO = 'U', E(i) = A(i+1,i) if UPLO = 'L'. TAU (output) DOUBLE PRECISION array, dimension (N-1) The scalar factors of the elementary reflectors (see Further Details). INFO (output) INTEGER = 0: successful exit < 0: if INFO = -i, the i-th argument had an illegal value. Further Details =============== If UPLO = 'U', the matrix Q is represented as a product of elementary reflectors Q = H(n-1) . . . H(2) H(1). Each H(i) has the form H(i) = I - tau * v * v' where tau is a real scalar, and v is a real vector with v(i+1:n) = 0 and v(i) = 1; v(1:i-1) is stored on exit in A(1:i-1,i+1), and tau in TAU(i). If UPLO = 'L', the matrix Q is represented as a product of elementary reflectors Q = H(1) H(2) . . . H(n-1). Each H(i) has the form H(i) = I - tau * v * v' where tau is a real scalar, and v is a real vector with v(1:i) = 0 and v(i+1) = 1; v(i+2:n) is stored on exit in A(i+2:n,i), and tau in TAU(i). The contents of A on exit are illustrated by the following examples with n = 5: if UPLO = 'U': if UPLO = 'L': ( d e v2 v3 v4 ) ( d ) ( d e v3 v4 ) ( e d ) ( d e v4 ) ( v1 e d ) ( d e ) ( v1 v2 e d ) ( d ) ( v1 v2 v3 e d ) where d and e denote diagonal and off-diagonal elements of T, and vi denotes an element of the vector defining H(i). ===================================================================== Test the input parameters Parameter adjustments */ /* Table of constant values */ integer c__1 = 1; doublereal c_b8 = 0.; doublereal c_b14 = -1.; /* System generated locals */ integer a_dim1, a_offset, i__1, i__2, i__3; /* Local variables */ extern doublereal ddot_(integer *, doublereal *, integer *, doublereal *, integer *); doublereal taui; extern /* Subroutine */ integer dsyr2_(const char *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *, doublereal *, integer *); integer i__; doublereal alpha; extern logical lsame_(const char *,const char *); extern /* Subroutine */ integer daxpy_(integer *, doublereal *, doublereal *, integer *, doublereal *, integer *); logical upper; extern /* Subroutine */ integer dsymv_(const char *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *), dlarfg_(integer *, doublereal *, doublereal *, integer *, doublereal *), xerbla_(const char *, integer * ); #define a_ref(a_1,a_2) a[(a_2)*a_dim1 + a_1] a_dim1 = *lda; a_offset = 1 + a_dim1 * 1; a -= a_offset; --d__; --e; --tau; /* Function Body */ *info = 0; upper = lsame_(uplo, "U"); if (! upper && ! lsame_(uplo, "L")) { *info = -1; } else if (*n < 0) { *info = -2; } else if (*lda < max(1,*n)) { *info = -4; } if (*info != 0) { i__1 = -(*info); xerbla_("DSYTD2", &i__1); return 0; } /* Quick return if possible */ if (*n <= 0) { return 0; } if (upper) { /* Reduce the upper triangle of A */ for (i__ = *n - 1; i__ >= 1; --i__) { /* Generate elementary reflector H(i) = I - tau * v * v' to annihilate A(1:i-1,i+1) */ dlarfg_(&i__, &a_ref(i__, i__ + 1), &a_ref(1, i__ + 1), &c__1, & taui); e[i__] = a_ref(i__, i__ + 1); if (taui != 0.) { /* Apply H(i) from both sides to A(1:i,1:i) */ a_ref(i__, i__ + 1) = 1.; /* Compute x := tau * A * v storing x in TAU(1:i) */ dsymv_(uplo, &i__, &taui, &a[a_offset], lda, &a_ref(1, i__ + 1), &c__1, &c_b8, &tau[1], &c__1); /* Compute w := x - 1/2 * tau * (x'*v) * v */ alpha = taui * -.5 * ddot_(&i__, &tau[1], &c__1, &a_ref(1, i__ + 1), &c__1); daxpy_(&i__, &alpha, &a_ref(1, i__ + 1), &c__1, &tau[1], & c__1); /* Apply the transformation as a rank-2 update: A := A - v * w' - w * v' */ dsyr2_(uplo, &i__, &c_b14, &a_ref(1, i__ + 1), &c__1, &tau[1], &c__1, &a[a_offset], lda); a_ref(i__, i__ + 1) = e[i__]; } d__[i__ + 1] = a_ref(i__ + 1, i__ + 1); tau[i__] = taui; /* L10: */ } d__[1] = a_ref(1, 1); } else { /* Reduce the lower triangle of A */ i__1 = *n - 1; for (i__ = 1; i__ <= i__1; ++i__) { /* Generate elementary reflector H(i) = I - tau * v * v' to annihilate A(i+2:n,i) Computing MIN */ i__2 = i__ + 2; i__3 = *n - i__; dlarfg_(&i__3, &a_ref(i__ + 1, i__), &a_ref(min(i__2,*n), i__), & c__1, &taui); e[i__] = a_ref(i__ + 1, i__); if (taui != 0.) { /* Apply H(i) from both sides to A(i+1:n,i+1:n) */ a_ref(i__ + 1, i__) = 1.; /* Compute x := tau * A * v storing y in TAU(i:n-1) */ i__2 = *n - i__; dsymv_(uplo, &i__2, &taui, &a_ref(i__ + 1, i__ + 1), lda, & a_ref(i__ + 1, i__), &c__1, &c_b8, &tau[i__], &c__1); /* Compute w := x - 1/2 * tau * (x'*v) * v */ i__2 = *n - i__; alpha = taui * -.5 * ddot_(&i__2, &tau[i__], &c__1, &a_ref( i__ + 1, i__), &c__1); i__2 = *n - i__; daxpy_(&i__2, &alpha, &a_ref(i__ + 1, i__), &c__1, &tau[i__], &c__1); /* Apply the transformation as a rank-2 update: A := A - v * w' - w * v' */ i__2 = *n - i__; dsyr2_(uplo, &i__2, &c_b14, &a_ref(i__ + 1, i__), &c__1, &tau[ i__], &c__1, &a_ref(i__ + 1, i__ + 1), lda) ; a_ref(i__ + 1, i__) = e[i__]; } d__[i__] = a_ref(i__, i__); tau[i__] = taui; /* L20: */ } d__[*n] = a_ref(*n, *n); } return 0; /* End of DSYTD2 */ } /* dsytd2_ */ #undef a_ref #ifdef __cplusplus } #endif hypre-2.33.0/src/lapack/dsytrd.c000066400000000000000000000246061477326011500164430ustar00rootroot00000000000000/* Copyright (c) 1992-2008 The University of Tennessee. All rights reserved. * See file COPYING in this directory for details. */ #ifdef __cplusplus extern "C" { #endif #include "f2c.h" #include "hypre_lapack.h" /* Subroutine */ integer dsytrd_(const char *uplo, integer *n, doublereal *a, integer * lda, doublereal *d__, doublereal *e, doublereal *tau, doublereal * work, integer *lwork, integer *info) { /* -- LAPACK routine (version 3.0) -- Univ. of Tennessee, Univ. of California Berkeley, NAG Ltd., Courant Institute, Argonne National Lab, and Rice University June 30, 1999 Purpose ======= DSYTRD reduces a real symmetric matrix A to real symmetric tridiagonal form T by an orthogonal similarity transformation: Q**T * A * Q = T. Arguments ========= UPLO (input) CHARACTER*1 = 'U': Upper triangle of A is stored; = 'L': Lower triangle of A is stored. N (input) INTEGER The order of the matrix A. N >= 0. A (input/output) DOUBLE PRECISION array, dimension (LDA,N) On entry, the symmetric matrix A. If UPLO = 'U', the leading N-by-N upper triangular part of A contains the upper triangular part of the matrix A, and the strictly lower triangular part of A is not referenced. If UPLO = 'L', the leading N-by-N lower triangular part of A contains the lower triangular part of the matrix A, and the strictly upper triangular part of A is not referenced. On exit, if UPLO = 'U', the diagonal and first superdiagonal of A are overwritten by the corresponding elements of the tridiagonal matrix T, and the elements above the first superdiagonal, with the array TAU, represent the orthogonal matrix Q as a product of elementary reflectors; if UPLO = 'L', the diagonal and first subdiagonal of A are over- written by the corresponding elements of the tridiagonal matrix T, and the elements below the first subdiagonal, with the array TAU, represent the orthogonal matrix Q as a product of elementary reflectors. See Further Details. LDA (input) INTEGER The leading dimension of the array A. LDA >= max(1,N). D (output) DOUBLE PRECISION array, dimension (N) The diagonal elements of the tridiagonal matrix T: D(i) = A(i,i). E (output) DOUBLE PRECISION array, dimension (N-1) The off-diagonal elements of the tridiagonal matrix T: E(i) = A(i,i+1) if UPLO = 'U', E(i) = A(i+1,i) if UPLO = 'L'. TAU (output) DOUBLE PRECISION array, dimension (N-1) The scalar factors of the elementary reflectors (see Further Details). WORK (workspace/output) DOUBLE PRECISION array, dimension (LWORK) On exit, if INFO = 0, WORK(1) returns the optimal LWORK. LWORK (input) INTEGER The dimension of the array WORK. LWORK >= 1. For optimum performance LWORK >= N*NB, where NB is the optimal blocksize. If LWORK = -1, then a workspace query is assumed; the routine only calculates the optimal size of the WORK array, returns this value as the first entry of the WORK array, and no error message related to LWORK is issued by XERBLA. INFO (output) INTEGER = 0: successful exit < 0: if INFO = -i, the i-th argument had an illegal value Further Details =============== If UPLO = 'U', the matrix Q is represented as a product of elementary reflectors Q = H(n-1) . . . H(2) H(1). Each H(i) has the form H(i) = I - tau * v * v' where tau is a real scalar, and v is a real vector with v(i+1:n) = 0 and v(i) = 1; v(1:i-1) is stored on exit in A(1:i-1,i+1), and tau in TAU(i). If UPLO = 'L', the matrix Q is represented as a product of elementary reflectors Q = H(1) H(2) . . . H(n-1). Each H(i) has the form H(i) = I - tau * v * v' where tau is a real scalar, and v is a real vector with v(1:i) = 0 and v(i+1) = 1; v(i+2:n) is stored on exit in A(i+2:n,i), and tau in TAU(i). The contents of A on exit are illustrated by the following examples with n = 5: if UPLO = 'U': if UPLO = 'L': ( d e v2 v3 v4 ) ( d ) ( d e v3 v4 ) ( e d ) ( d e v4 ) ( v1 e d ) ( d e ) ( v1 v2 e d ) ( d ) ( v1 v2 v3 e d ) where d and e denote diagonal and off-diagonal elements of T, and vi denotes an element of the vector defining H(i). ===================================================================== Test the input parameters Parameter adjustments */ /* Table of constant values */ integer c__1 = 1; integer c_n1 = -1; integer c__3 = 3; integer c__2 = 2; doublereal c_b22 = -1.; doublereal c_b23 = 1.; /* System generated locals */ integer a_dim1, a_offset, i__1, i__2, i__3; /* Local variables */ integer i__, j; extern logical lsame_(const char *,const char *); integer nbmin, iinfo; logical upper; extern /* Subroutine */ integer dsytd2_(const char *, integer *, doublereal *, integer *, doublereal *, doublereal *, doublereal *, integer *), dsyr2k_(const char *,const char *, integer *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *); integer nb, kk, nx; extern /* Subroutine */ integer dlatrd_(const char *, integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, doublereal *, integer *), xerbla_(const char *, integer *); extern integer ilaenv_(integer *,const char *,const char *, integer *, integer *, integer *, integer *, ftnlen, ftnlen); integer ldwork, lwkopt; logical lquery; integer iws; #define a_ref(a_1,a_2) a[(a_2)*a_dim1 + a_1] a_dim1 = *lda; a_offset = 1 + a_dim1 * 1; a -= a_offset; --d__; --e; --tau; --work; /* Function Body */ *info = 0; upper = lsame_(uplo, "U"); lquery = *lwork == -1; if (! upper && ! lsame_(uplo, "L")) { *info = -1; } else if (*n < 0) { *info = -2; } else if (*lda < max(1,*n)) { *info = -4; } else if (*lwork < 1 && ! lquery) { *info = -9; } if (*info == 0) { /* Determine the block size. */ nb = ilaenv_(&c__1, "DSYTRD", uplo, n, &c_n1, &c_n1, &c_n1, (ftnlen)6, (ftnlen)1); lwkopt = *n * nb; work[1] = (doublereal) lwkopt; } if (*info != 0) { i__1 = -(*info); xerbla_("DSYTRD", &i__1); return 0; } else if (lquery) { return 0; } /* Quick return if possible */ if (*n == 0) { work[1] = 1.; return 0; } nx = *n; iws = 1; if (nb > 1 && nb < *n) { /* Determine when to cross over from blocked to unblocked code (last block is always handled by unblocked code). Computing MAX */ i__1 = nb, i__2 = ilaenv_(&c__3, "DSYTRD", uplo, n, &c_n1, &c_n1, & c_n1, (ftnlen)6, (ftnlen)1); nx = max(i__1,i__2); if (nx < *n) { /* Determine if workspace is large enough for blocked code. */ ldwork = *n; iws = ldwork * nb; if (*lwork < iws) { /* Not enough workspace to use optimal NB: determine the minimum value of NB, and reduce NB or force use of unblocked code by setting NX = N. Computing MAX */ i__1 = *lwork / ldwork; nb = max(i__1,1); nbmin = ilaenv_(&c__2, "DSYTRD", uplo, n, &c_n1, &c_n1, &c_n1, (ftnlen)6, (ftnlen)1); if (nb < nbmin) { nx = *n; } } } else { nx = *n; } } else { nb = 1; } if (upper) { /* Reduce the upper triangle of A. Columns 1:kk are handled by the unblocked method. */ kk = *n - (*n - nx + nb - 1) / nb * nb; i__1 = kk + 1; i__2 = -nb; for (i__ = *n - nb + 1; i__2 < 0 ? i__ >= i__1 : i__ <= i__1; i__ += i__2) { /* Reduce columns i:i+nb-1 to tridiagonal form and form the matrix W which is needed to update the unreduced part of the matrix */ i__3 = i__ + nb - 1; dlatrd_(uplo, &i__3, &nb, &a[a_offset], lda, &e[1], &tau[1], & work[1], &ldwork); /* Update the unreduced submatrix A(1:i-1,1:i-1), using an update of the form: A := A - V*W' - W*V' */ i__3 = i__ - 1; dsyr2k_(uplo, "No transpose", &i__3, &nb, &c_b22, &a_ref(1, i__), lda, &work[1], &ldwork, &c_b23, &a[a_offset], lda); /* Copy superdiagonal elements back into A, and diagonal elements into D */ i__3 = i__ + nb - 1; for (j = i__; j <= i__3; ++j) { a_ref(j - 1, j) = e[j - 1]; d__[j] = a_ref(j, j); /* L10: */ } /* L20: */ } /* Use unblocked code to reduce the last or only block */ dsytd2_(uplo, &kk, &a[a_offset], lda, &d__[1], &e[1], &tau[1], &iinfo); } else { /* Reduce the lower triangle of A */ i__2 = *n - nx; i__1 = nb; for (i__ = 1; i__1 < 0 ? i__ >= i__2 : i__ <= i__2; i__ += i__1) { /* Reduce columns i:i+nb-1 to tridiagonal form and form the matrix W which is needed to update the unreduced part of the matrix */ i__3 = *n - i__ + 1; dlatrd_(uplo, &i__3, &nb, &a_ref(i__, i__), lda, &e[i__], &tau[ i__], &work[1], &ldwork); /* Update the unreduced submatrix A(i+ib:n,i+ib:n), using an update of the form: A := A - V*W' - W*V' */ i__3 = *n - i__ - nb + 1; dsyr2k_(uplo, "No transpose", &i__3, &nb, &c_b22, &a_ref(i__ + nb, i__), lda, &work[nb + 1], &ldwork, &c_b23, &a_ref(i__ + nb, i__ + nb), lda); /* Copy subdiagonal elements back into A, and diagonal elements into D */ i__3 = i__ + nb - 1; for (j = i__; j <= i__3; ++j) { a_ref(j + 1, j) = e[j]; d__[j] = a_ref(j, j); /* L30: */ } /* L40: */ } /* Use unblocked code to reduce the last or only block */ i__1 = *n - i__ + 1; dsytd2_(uplo, &i__1, &a_ref(i__, i__), lda, &d__[i__], &e[i__], &tau[ i__], &iinfo); } work[1] = (doublereal) lwkopt; return 0; /* End of DSYTRD */ } /* dsytrd_ */ #undef a_ref #ifdef __cplusplus } #endif hypre-2.33.0/src/lapack/dtrti2.c000066400000000000000000000106001477326011500163270ustar00rootroot00000000000000/* Copyright (c) 1992-2008 The University of Tennessee. All rights reserved. * See file COPYING in this directory for details. */ #ifdef __cplusplus extern "C" { #endif #include "f2c.h" #include "hypre_lapack.h" /* Subroutine */ integer dtrti2_(const char *uplo, const char *diag, integer *n, doublereal * a, integer *lda, integer *info) { /* -- LAPACK routine (version 3.0) -- Univ. of Tennessee, Univ. of California Berkeley, NAG Ltd., Courant Institute, Argonne National Lab, and Rice University February 29, 1992 Purpose ======= DTRTI2 computes the inverse of a real upper or lower triangular matrix. This is the Level 2 BLAS version of the algorithm. Arguments ========= UPLO (input) CHARACTER*1 Specifies whether the matrix A is upper or lower triangular. = 'U': Upper triangular = 'L': Lower triangular DIAG (input) CHARACTER*1 Specifies whether or not the matrix A is unit triangular. = 'N': Non-unit triangular = 'U': Unit triangular N (input) INTEGER The order of the matrix A. N >= 0. A (input/output) DOUBLE PRECISION array, dimension (LDA,N) On entry, the triangular matrix A. If UPLO = 'U', the leading n by n upper triangular part of the array A contains the upper triangular matrix, and the strictly lower triangular part of A is not referenced. If UPLO = 'L', the leading n by n lower triangular part of the array A contains the lower triangular matrix, and the strictly upper triangular part of A is not referenced. If DIAG = 'U', the diagonal elements of A are also not referenced and are assumed to be 1. On exit, the (triangular) inverse of the original matrix, in the same storage format. LDA (input) INTEGER The leading dimension of the array A. LDA >= max(1,N). INFO (output) INTEGER = 0: successful exit < 0: if INFO = -k, the k-th argument had an illegal value ===================================================================== Test the input parameters. Parameter adjustments */ /* Table of constant values */ integer c__1 = 1; /* System generated locals */ integer a_dim1, a_offset, i__1, i__2; /* Local variables */ integer j; extern /* Subroutine */ integer dscal_(integer *, doublereal *, doublereal *, integer *); extern logical lsame_(const char *, const char *); logical upper; extern /* Subroutine */ integer dtrmv_(const char *, const char *, const char *, integer *, doublereal *, integer *, doublereal *, integer *), xerbla_(const char *, integer *); logical nounit; doublereal ajj; #define a_ref(a_1,a_2) a[(a_2)*a_dim1 + a_1] a_dim1 = *lda; a_offset = 1 + a_dim1 * 1; a -= a_offset; /* Function Body */ *info = 0; upper = lsame_(uplo, "U"); nounit = lsame_(diag, "N"); if (! upper && ! lsame_(uplo, "L")) { *info = -1; } else if (! nounit && ! lsame_(diag, "U")) { *info = -2; } else if (*n < 0) { *info = -3; } else if (*lda < max(1,*n)) { *info = -5; } if (*info != 0) { i__1 = -(*info); xerbla_("DTRTI2", &i__1); return 0; } if (upper) { /* Compute inverse of upper triangular matrix. */ i__1 = *n; for (j = 1; j <= i__1; ++j) { if (nounit) { a_ref(j, j) = 1. / a_ref(j, j); ajj = -a_ref(j, j); } else { ajj = -1.; } /* Compute elements 1:j-1 of j-th column. */ i__2 = j - 1; dtrmv_("Upper", "No transpose", diag, &i__2, &a[a_offset], lda, & a_ref(1, j), &c__1); i__2 = j - 1; dscal_(&i__2, &ajj, &a_ref(1, j), &c__1); /* L10: */ } } else { /* Compute inverse of lower triangular matrix. */ for (j = *n; j >= 1; --j) { if (nounit) { a_ref(j, j) = 1. / a_ref(j, j); ajj = -a_ref(j, j); } else { ajj = -1.; } if (j < *n) { /* Compute elements j+1:n of j-th column. */ i__1 = *n - j; dtrmv_("Lower", "No transpose", diag, &i__1, &a_ref(j + 1, j + 1), lda, &a_ref(j + 1, j), &c__1); i__1 = *n - j; dscal_(&i__1, &ajj, &a_ref(j + 1, j), &c__1); } /* L20: */ } } return 0; /* End of DTRTI2 */ } /* dtrti2_ */ #undef a_ref #ifdef __cplusplus } #endif hypre-2.33.0/src/lapack/dtrtri.c000066400000000000000000000147361477326011500164450ustar00rootroot00000000000000/* Copyright (c) 1992-2008 The University of Tennessee. All rights reserved. * See file COPYING in this directory for details. */ #ifdef __cplusplus extern "C" { #endif #include "f2c.h" #include "hypre_lapack.h" /* Subroutine */ integer dtrtri_(const char *uplo, const char *diag, integer *n, doublereal * a, integer *lda, integer *info) { /* -- LAPACK routine (version 3.0) -- Univ. of Tennessee, Univ. of California Berkeley, NAG Ltd., Courant Institute, Argonne National Lab, and Rice University March 31, 1993 Purpose ======= DTRTRI computes the inverse of a real upper or lower triangular matrix A. This is the Level 3 BLAS version of the algorithm. Arguments ========= UPLO (input) CHARACTER*1 = 'U': A is upper triangular; = 'L': A is lower triangular. DIAG (input) CHARACTER*1 = 'N': A is non-unit triangular; = 'U': A is unit triangular. N (input) INTEGER The order of the matrix A. N >= 0. A (input/output) DOUBLE PRECISION array, dimension (LDA,N) On entry, the triangular matrix A. If UPLO = 'U', the leading N-by-N upper triangular part of the array A contains the upper triangular matrix, and the strictly lower triangular part of A is not referenced. If UPLO = 'L', the leading N-by-N lower triangular part of the array A contains the lower triangular matrix, and the strictly upper triangular part of A is not referenced. If DIAG = 'U', the diagonal elements of A are also not referenced and are assumed to be 1. On exit, the (triangular) inverse of the original matrix, in the same storage format. LDA (input) INTEGER The leading dimension of the array A. LDA >= max(1,N). INFO (output) INTEGER = 0: successful exit < 0: if INFO = -i, the i-th argument had an illegal value > 0: if INFO = i, A(i,i) is exactly zero. The triangular matrix is singular and its inverse can not be computed. ===================================================================== Test the input parameters. Parameter adjustments */ /* Table of constant values */ integer c__1 = 1; integer c_n1 = -1; integer c__2 = 2; doublereal c_b18 = 1.; doublereal c_b22 = -1.; /* System generated locals */ address a__1[2]; integer a_dim1, a_offset, i__1, i__2[2], i__3, i__4, i__5; char ch__1[2]; /* Builtin functions Subroutine */ integer s_cat(char *, char **, integer *, integer *, ftnlen); /* Local variables */ integer j; extern logical lsame_(const char *, const char *); extern /* Subroutine */ integer dtrmm_(const char *, const char *, const char *, const char *, integer *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *), dtrsm_( const char *, const char *, const char *, const char *, integer *, integer *, doublereal * , doublereal *, integer *, doublereal *, integer *); logical upper; extern /* Subroutine */ integer dtrti2_(const char *, const char *, integer *, doublereal *, integer *, integer *); integer jb, nb, nn; extern /* Subroutine */ integer xerbla_(const char *, integer *); extern integer ilaenv_(integer *, const char *, const char *, integer *, integer *, integer *, integer *, ftnlen, ftnlen); logical nounit; #define a_ref(a_1,a_2) a[(a_2)*a_dim1 + a_1] a_dim1 = *lda; a_offset = 1 + a_dim1 * 1; a -= a_offset; /* Function Body */ *info = 0; upper = lsame_(uplo, "U"); nounit = lsame_(diag, "N"); if (! upper && ! lsame_(uplo, "L")) { *info = -1; } else if (! nounit && ! lsame_(diag, "U")) { *info = -2; } else if (*n < 0) { *info = -3; } else if (*lda < max(1,*n)) { *info = -5; } if (*info != 0) { i__1 = -(*info); xerbla_("DTRTRI", &i__1); return 0; } /* Quick return if possible */ if (*n == 0) { return 0; } /* Check for singularity if non-unit. */ if (nounit) { i__1 = *n; for (*info = 1; *info <= i__1; ++(*info)) { if (a_ref(*info, *info) == 0.) { return 0; } /* L10: */ } *info = 0; } /* Determine the block size for this environment. Writing concatenation */ i__2[0] = 1, a__1[0] = (char *) uplo; i__2[1] = 1, a__1[1] = (char *) diag; s_cat(ch__1, a__1, i__2, &c__2, (ftnlen)2); nb = ilaenv_(&c__1, "DTRTRI", ch__1, n, &c_n1, &c_n1, &c_n1, (ftnlen)6, ( ftnlen)2); if (nb <= 1 || nb >= *n) { /* Use unblocked code */ dtrti2_(uplo, diag, n, &a[a_offset], lda, info); } else { /* Use blocked code */ if (upper) { /* Compute inverse of upper triangular matrix */ i__1 = *n; i__3 = nb; for (j = 1; i__3 < 0 ? j >= i__1 : j <= i__1; j += i__3) { /* Computing MIN */ i__4 = nb, i__5 = *n - j + 1; jb = min(i__4,i__5); /* Compute rows 1:j-1 of current block column */ i__4 = j - 1; dtrmm_("Left", "Upper", "No transpose", diag, &i__4, &jb, & c_b18, &a[a_offset], lda, &a_ref(1, j), lda); i__4 = j - 1; dtrsm_("Right", "Upper", "No transpose", diag, &i__4, &jb, & c_b22, &a_ref(j, j), lda, &a_ref(1, j), lda); /* Compute inverse of current diagonal block */ dtrti2_("Upper", diag, &jb, &a_ref(j, j), lda, info); /* L20: */ } } else { /* Compute inverse of lower triangular matrix */ nn = (*n - 1) / nb * nb + 1; i__3 = -nb; for (j = nn; i__3 < 0 ? j >= 1 : j <= 1; j += i__3) { /* Computing MIN */ i__1 = nb, i__4 = *n - j + 1; jb = min(i__1,i__4); if (j + jb <= *n) { /* Compute rows j+jb:n of current block column */ i__1 = *n - j - jb + 1; dtrmm_("Left", "Lower", "No transpose", diag, &i__1, &jb, &c_b18, &a_ref(j + jb, j + jb), lda, &a_ref(j + jb, j), lda); i__1 = *n - j - jb + 1; dtrsm_("Right", "Lower", "No transpose", diag, &i__1, &jb, &c_b22, &a_ref(j, j), lda, &a_ref(j + jb, j), lda); } /* Compute inverse of current diagonal block */ dtrti2_("Lower", diag, &jb, &a_ref(j, j), lda, info); /* L30: */ } } } return 0; /* End of DTRTRI */ } /* dtrtri_ */ #undef a_ref #ifdef __cplusplus } #endif hypre-2.33.0/src/lapack/f2c.h000066400000000000000000000142001477326011500155760ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /* f2c.h -- Standard Fortran to C header file */ /** barf [ba:rf] 2. "He suggested using FORTRAN, and everybody barfed." - From The Shogakukan DICTIONARY OF NEW ENGLISH (Second edition) */ #ifndef F2C_INCLUDE #define F2C_INCLUDE /* MPI is not needed here, so don't include mpi.h */ #include "HYPRE_config.h" #ifndef HYPRE_SEQUENTIAL #define HYPRE_SEQUENTIAL #endif #include "_hypre_utilities.h" #include "math.h" #define sqrt hypre_sqrt #ifdef HYPRE_BIGINT typedef long long int HYPRE_LongInt; typedef unsigned long long int HYPRE_ULongInt; #else typedef long int HYPRE_LongInt; typedef unsigned long int HYPRE_ULongInt; #endif /* F2C_INTEGER will normally be `HYPRE_Int' but would be `long' on 16-bit systems */ /* we assume short, float are OK */ /* integer changed to HYPRE_Int - edmond 1/12/00 */ typedef HYPRE_Int integer; typedef HYPRE_ULongInt uinteger; typedef char *address; typedef short int shortint; typedef float real; typedef HYPRE_Real doublereal; typedef struct { real r, i; } complex; typedef struct { doublereal r, i; } doublecomplex; typedef HYPRE_LongInt logical; typedef short int shortlogical; typedef char logical1; typedef char integer1; /* integer*8 support from f2c not currently supported: */ #if 0 typedef @F2C_LONGINT@ /* long long */ longint; /* system-dependent */ typedef unsigned @F2C_LONGINT@ ulongint; /* system-dependent */ #define qbit_clear(a,b) ((a) & ~((ulongint)1 << (b))) #define qbit_set(a,b) ((a) | ((ulongint)1 << (b))) #endif /* typedef long long HYPRE_Int longint; */ /* RDF: removed */ #define TRUE_ (1) #define FALSE_ (0) /* Extern is for use with -E */ #ifndef Extern #define Extern extern #endif /* I/O stuff */ #ifdef f2c_i2 #error f2c_i2 will not work with g77!!!! /* for -i2 */ typedef short flag; typedef short ftnlen; typedef short ftnint; #else typedef HYPRE_LongInt /* HYPRE_Int or long HYPRE_Int */ flag; typedef HYPRE_Int /* HYPRE_Int or long HYPRE_Int */ ftnlen; /* changed by edmond */ typedef HYPRE_LongInt /* HYPRE_Int or long HYPRE_Int */ ftnint; #endif /*external read, write*/ typedef struct { flag cierr; ftnint ciunit; flag ciend; char *cifmt; ftnint cirec; } cilist; /*internal read, write*/ typedef struct { flag icierr; char *iciunit; flag iciend; char *icifmt; ftnint icirlen; ftnint icirnum; } icilist; /*open*/ typedef struct { flag oerr; ftnint ounit; char *ofnm; ftnlen ofnmlen; char *osta; char *oacc; char *ofm; ftnint orl; char *oblnk; } olist; /*close*/ typedef struct { flag cerr; ftnint cunit; char *csta; } cllist; /*rewind, backspace, endfile*/ typedef struct { flag aerr; ftnint aunit; } alist; /* inquire */ typedef struct { flag inerr; ftnint inunit; char *infile; ftnlen infilen; ftnint *inex; /*parameters in standard's order*/ ftnint *inopen; ftnint *innum; ftnint *innamed; char *inname; ftnlen innamlen; char *inacc; ftnlen inacclen; char *inseq; ftnlen inseqlen; char *indir; ftnlen indirlen; char *infmt; ftnlen infmtlen; char *inform; ftnint informlen; char *inunf; ftnlen inunflen; ftnint *inrecl; ftnint *innrec; char *inblank; ftnlen inblanklen; } inlist; #define VOID void union Multitype { /* for multiple entry points */ integer1 g; shortint h; integer i; /* longint j; */ real r; doublereal d; complex c; doublecomplex z; }; typedef union Multitype Multitype; /*typedef long HYPRE_Int Long;*/ /* No longer used; formerly in Namelist */ struct Vardesc { /* for Namelist */ char *name; char *addr; ftnlen *dims; HYPRE_Int type; }; typedef struct Vardesc Vardesc; struct Namelist { char *name; Vardesc **vars; HYPRE_Int nvars; }; typedef struct Namelist Namelist; /* The following undefs are to prevent conflicts with external libraries */ #undef abs #define abs(x) ((x) >= 0 ? (x) : -(x)) #define dabs(x) (doublereal)abs(x) #ifndef min #define min(a,b) ((a) <= (b) ? (a) : (b)) #define max(a,b) ((a) >= (b) ? (a) : (b)) #endif #define dmin(a,b) (doublereal)min(a,b) #define dmax(a,b) (doublereal)max(a,b) #define bit_test(a,b) ((a) >> (b) & 1) #define bit_clear(a,b) ((a) & ~((uinteger)1 << (b))) #define bit_set(a,b) ((a) | ((uinteger)1 << (b))) /* procedure parameter types for -A and -C++ */ #define F2C_proc_par_types 1 #ifdef __cplusplus typedef HYPRE_Int /* Unknown procedure type */ (*U_fp)(...); typedef shortint (*J_fp)(...); typedef integer (*I_fp)(...); typedef real (*R_fp)(...); typedef doublereal (*D_fp)(...), (*E_fp)(...); typedef /* Complex */ VOID (*C_fp)(...); typedef /* Double Complex */ VOID (*Z_fp)(...); typedef logical (*L_fp)(...); typedef shortlogical (*K_fp)(...); typedef /* Character */ VOID (*H_fp)(...); typedef /* Subroutine */ HYPRE_Int (*S_fp)(...); #else typedef HYPRE_Int /* Unknown procedure type */ (*U_fp)(void); typedef shortint (*J_fp)(void); typedef integer (*I_fp)(void); typedef real (*R_fp)(void); typedef doublereal (*D_fp)(void), (*E_fp)(void); typedef /* Complex */ VOID (*C_fp)(void); typedef /* Double Complex */ VOID (*Z_fp)(void); typedef logical (*L_fp)(void); typedef shortlogical (*K_fp)(void); typedef /* Character */ VOID (*H_fp)(void); typedef /* Subroutine */ HYPRE_Int (*S_fp)(void); #endif /* E_fp is for real functions when -R is not specified */ typedef VOID C_f; /* complex function */ typedef VOID H_f; /* character function */ typedef VOID Z_f; /* HYPRE_Real complex function */ typedef doublereal E_f; /* real function with -R not specified */ /* undef any lower-case symbols that your C compiler predefines, e.g.: */ #ifndef Skip_f2c_Undefs /* (No such symbols should be defined in a strict ANSI C compiler. We can avoid trouble with f2c-translated code by using gcc -ansi [-traditional].) */ #undef cray #undef gcos #undef mc68010 #undef mc68020 #undef mips #undef pdp11 #undef sgi #undef sparc #undef sun #undef sun2 #undef sun3 #undef sun4 #undef u370 #undef u3b #undef u3b2 #undef u3b5 #undef unix #undef vax #endif #endif hypre-2.33.0/src/lapack/hypre_lapack.h000066400000000000000000000077261477326011500176050ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /***** DO NOT use this file outside of the LAPACK directory *****/ /*-------------------------------------------------------------------------- * This header renames the functions in LAPACK to avoid conflicts *--------------------------------------------------------------------------*/ /* blas */ #define dasum_ hypre_dasum #define daxpy_ hypre_daxpy #define dcopy_ hypre_dcopy #define ddot_ hypre_ddot #define dgemm_ hypre_dgemm #define dgemv_ hypre_dgemv #define dger_ hypre_dger #define dnrm2_ hypre_dnrm2 #define drot_ hypre_drot #define dscal_ hypre_dscal #define dswap_ hypre_dswap #define dsymm_ hypre_dsymm #define dsymv_ hypre_dsymv #define dsyr2_ hypre_dsyr2 #define dsyr2k_ hypre_dsyr2k #define dsyrk_ hypre_dsyrk #define dtrmm_ hypre_dtrmm #define dtrmv_ hypre_dtrmv #define dtrsm_ hypre_dtrsm #define dtrsv_ hypre_dtrsv #define idamax_ hypre_idamax /* f2c library routines */ #define s_cmp hypre_s_cmp #define s_copy hypre_s_copy #define s_cat hypre_s_cat #define d_lg10 hypre_d_lg10 #define d_sign hypre_d_sign #define pow_dd hypre_pow_dd #define pow_di hypre_pow_di /* lapack */ #define dbdsqr_ hypre_dbdsqr #define dgebd2_ hypre_dgebd2 #define dgebrd_ hypre_dgebrd #define dgelq2_ hypre_dgelq2 #define dgelqf_ hypre_dgelqf #define dgels_ hypre_dgels #define dgeqr2_ hypre_dgeqr2 #define dgeqrf_ hypre_dgeqrf #define dgesvd_ hypre_dgesvd #define dgetf2_ hypre_dgetf2 #define dgetrf_ hypre_dgetrf #define dgetri_ hypre_dgetri #define dgetrs_ hypre_dgetrs #define dlasq1_ hypre_dlasq1 #define dlasq2_ hypre_dlasq2 #define dlasrt_ hypre_dlasrt #define dorg2l_ hypre_dorg2l #define dorg2r_ hypre_dorg2r #define dorgbr_ hypre_dorgbr #define dorgl2_ hypre_dorgl2 #define dorglq_ hypre_dorglq #define dorgql_ hypre_dorgql #define dorgqr_ hypre_dorgqr #define dorgtr_ hypre_dorgtr #define dorm2r_ hypre_dorm2r #define dormbr_ hypre_dormbr #define dorml2_ hypre_dorml2 #define dormlq_ hypre_dormlq #define dormqr_ hypre_dormqr #define dpotf2_ hypre_dpotf2 #define dpotrf_ hypre_dpotrf #define dpotrs_ hypre_dpotrs #define dsteqr_ hypre_dsteqr #define dsterf_ hypre_dsterf #define dsyev_ hypre_dsyev #define dsygs2_ hypre_dsygs2 #define dsygst_ hypre_dsygst #define dsygv_ hypre_dsygv #define dsytd2_ hypre_dsytd2 #define dsytrd_ hypre_dsytrd #define dtrti2_ hypre_dtrti2 #define dtrtri_ hypre_dtrtri /* lapack auxiliary routines */ #define dlabad_ hypre_dlabad #define dlabrd_ hypre_dlabrd #define dlacpy_ hypre_dlacpy #define dlae2_ hypre_dlae2 #define dlaev2_ hypre_dlaev2 #define dlamch_ hypre_dlamch #define dlamc1_ hypre_dlamc1 #define dlamc2_ hypre_dlamc2 #define dlamc3_ hypre_dlamc3 #define dlamc4_ hypre_dlamc4 #define dlamc5_ hypre_dlamc5 #define dlange_ hypre_dlange #define dlanst_ hypre_dlanst #define dlansy_ hypre_dlansy #define dlapy2_ hypre_dlapy2 #define dlarf_ hypre_dlarf #define dlarfb_ hypre_dlarfb #define dlarfg_ hypre_dlarfg #define dlarft_ hypre_dlarft #define dlartg_ hypre_dlartg #define dlas2_ hypre_dlas2 #define dlascl_ hypre_dlascl #define dlaset_ hypre_dlaset #define dlasq3_ hypre_dlasq3 #define dlasq4_ hypre_dlasq4 #define dlasq5_ hypre_dlasq5 #define dlasq6_ hypre_dlasq6 #define dlasr_ hypre_dlasr #define dlassq_ hypre_dlassq #define dlasv2_ hypre_dlasv2 #define dlaswp_ hypre_dlaswp #define dlatrd_ hypre_dlatrd #define ieeeck_ hypre_ieeeck #define ilaenv_ hypre_ilaenv /* these auxiliary routines have a different definition in BLAS */ #define lsame_ hypre_lapack_lsame #define xerbla_ hypre_lapack_xerbla /* this is needed so that lapack can call external BLAS */ #include "_hypre_blas.h" hypre-2.33.0/src/lapack/ieeeck.c000066400000000000000000000057451477326011500163620ustar00rootroot00000000000000/* Copyright (c) 1992-2008 The University of Tennessee. All rights reserved. * See file COPYING in this directory for details. */ #ifdef __cplusplus extern "C" { #endif #include "f2c.h" #include "hypre_lapack.h" integer ieeeck_(integer *ispec, real *zero, real *one) { /* -- LAPACK auxiliary routine (version 3.0) -- Univ. of Tennessee, Univ. of California Berkeley, NAG Ltd., Courant Institute, Argonne National Lab, and Rice University June 30, 1998 Purpose ======= IEEECK is called from the ILAENV to verify that Infinity and possibly NaN arithmetic is safe (i.e. will not trap). Arguments ========= ISPEC (input) INTEGER Specifies whether to test just for inifinity arithmetic or whether to test for infinity and NaN arithmetic. = 0: Verify infinity arithmetic only. = 1: Verify infinity and NaN arithmetic. ZERO (input) REAL Must contain the value 0.0 This is passed to prevent the compiler from optimizing away this code. ONE (input) REAL Must contain the value 1.0 This is passed to prevent the compiler from optimizing away this code. RETURN VALUE: INTEGER = 0: Arithmetic failed to produce the correct answers = 1: Arithmetic produced the correct answers */ /* System generated locals */ integer ret_val; /* Local variables */ real neginf, posinf, negzro, newzro, nan1, nan2, nan3, nan4, nan5, nan6; ret_val = 1; posinf = *one / *zero; if (posinf <= *one) { ret_val = 0; return ret_val; } neginf = -(*one) / *zero; if (neginf >= *zero) { ret_val = 0; return ret_val; } negzro = *one / (neginf + *one); if (negzro != *zero) { ret_val = 0; return ret_val; } neginf = *one / negzro; if (neginf >= *zero) { ret_val = 0; return ret_val; } newzro = negzro + *zero; if (newzro != *zero) { ret_val = 0; return ret_val; } posinf = *one / newzro; if (posinf <= *one) { ret_val = 0; return ret_val; } neginf *= posinf; if (neginf >= *zero) { ret_val = 0; return ret_val; } posinf *= posinf; if (posinf <= *one) { ret_val = 0; return ret_val; } /* Return if we were only asked to check infinity arithmetic */ if (*ispec == 0) { return ret_val; } nan1 = posinf + neginf; nan2 = posinf / neginf; nan3 = posinf / posinf; nan4 = posinf * *zero; nan5 = neginf * negzro; nan6 = nan5 * 0.f; if (nan1 == nan1) { ret_val = 0; return ret_val; } if (nan2 == nan2) { ret_val = 0; return ret_val; } if (nan3 == nan3) { ret_val = 0; return ret_val; } if (nan4 == nan4) { ret_val = 0; return ret_val; } if (nan5 == nan5) { ret_val = 0; return ret_val; } if (nan6 == nan6) { ret_val = 0; return ret_val; } return ret_val; } /* ieeeck_ */ #ifdef __cplusplus } #endif hypre-2.33.0/src/lapack/ilaenv.c000066400000000000000000000446541477326011500164150ustar00rootroot00000000000000/* Copyright (c) 1992-2008 The University of Tennessee. All rights reserved. * See file COPYING in this directory for details. */ #ifdef __cplusplus extern "C" { #endif #include "f2c.h" #include "hypre_lapack.h" integer ilaenv_(integer *ispec,const char *name__,const char *opts, integer *n1, integer *n2, integer *n3, integer *n4, ftnlen name_len, ftnlen opts_len) { /* -- LAPACK auxiliary routine (version 3.0) -- Univ. of Tennessee, Univ. of California Berkeley, NAG Ltd., Courant Institute, Argonne National Lab, and Rice University June 30, 1999 Purpose ======= ILAENV is called from the LAPACK routines to choose problem-dependent parameters for the local environment. See ISPEC for a description of the parameters. This version provides a set of parameters which should give good, but not optimal, performance on many of the currently available computers. Users are encouraged to modify this subroutine to set the tuning parameters for their particular machine using the option and problem size information in the arguments. This routine will not function correctly if it is converted to all lower case. Converting it to all upper case is allowed. Arguments ========= ISPEC (input) INTEGER Specifies the parameter to be returned as the value of ILAENV. = 1: the optimal blocksize; if this value is 1, an unblocked algorithm will give the best performance. = 2: the minimum block size for which the block routine should be used; if the usable block size is less than this value, an unblocked routine should be used. = 3: the crossover point (in a block routine, for N less than this value, an unblocked routine should be used) = 4: the number of shifts, used in the nonsymmetric eigenvalue routines = 5: the minimum column dimension for blocking to be used; rectangular blocks must have dimension at least k by m, where k is given by ILAENV(2,...) and m by ILAENV(5,...) = 6: the crossover point for the SVD (when reducing an m by n matrix to bidiagonal form, if max(m,n)/min(m,n) exceeds this value, a QR factorization is used first to reduce the matrix to a triangular form.) = 7: the number of processors = 8: the crossover point for the multishift QR and QZ methods for nonsymmetric eigenvalue problems. = 9: maximum size of the subproblems at the bottom of the computation tree in the divide-and-conquer algorithm (used by xGELSD and xGESDD) =10: ieee NaN arithmetic can be trusted not to trap =11: infinity arithmetic can be trusted not to trap NAME (input) CHARACTER*(*) The name of the calling subroutine, in either upper case or lower case. OPTS (input) CHARACTER*(*) The character options to the subroutine NAME, concatenated into a single character string. For example, UPLO = 'U', TRANS = 'T', and DIAG = 'N' for a triangular routine would be specified as OPTS = 'UTN'. N1 (input) INTEGER N2 (input) INTEGER N3 (input) INTEGER N4 (input) INTEGER Problem dimensions for the subroutine NAME; these may not all be required. (ILAENV) (output) INTEGER >= 0: the value of the parameter specified by ISPEC < 0: if ILAENV = -k, the k-th argument had an illegal value. Further Details =============== The following conventions have been used when calling ILAENV from the LAPACK routines: 1) OPTS is a concatenation of all of the character options to subroutine NAME, in the same order that they appear in the argument list for NAME, even if they are not used in determining the value of the parameter specified by ISPEC. 2) The problem dimensions N1, N2, N3, N4 are specified in the order that they appear in the argument list for NAME. N1 is used first, N2 second, and so on, and unused problem dimensions are passed a value of -1. 3) The parameter value returned by ILAENV is checked for validity in the calling subroutine. For example, ILAENV is used to retrieve the optimal blocksize for STRTRI as follows: NB = ILAENV( 1, 'STRTRI', UPLO // DIAG, N, -1, -1, -1 ) IF( NB.LE.1 ) NB = MAX( 1, N ) ===================================================================== */ /* Table of constant values */ integer c__0 = 0; real c_b162 = 0.f; real c_b163 = 1.f; integer c__1 = 1; /* System generated locals */ integer ret_val; /* Builtin functions Subroutine */ /* Builtin functions */ /* Subroutine */ integer s_copy(char *, const char *, ftnlen, ftnlen); integer s_cmp(char *, const char *, ftnlen, ftnlen); /* Local variables */ integer i__; logical cname, sname; integer nbmin; char c1[1], c2[2], c3[3], c4[2]; integer ic, nb; extern integer ieeeck_(integer *, real *, real *); integer iz, nx; char subnam[6]; HYPRE_UNUSED_VAR(opts); HYPRE_UNUSED_VAR(n3); HYPRE_UNUSED_VAR(opts_len); switch (*ispec) { case 1: goto L100; case 2: goto L100; case 3: goto L100; case 4: goto L400; case 5: goto L500; case 6: goto L600; case 7: goto L700; case 8: goto L800; case 9: goto L900; case 10: goto L1000; case 11: goto L1100; } /* Invalid value for ISPEC */ ret_val = -1; return ret_val; L100: /* Convert NAME to upper case if the first character is lower case. */ ret_val = 1; s_copy(subnam, (char*)name__, (ftnlen)6, name_len); ic = *(unsigned char *)subnam; iz = 'Z'; if (iz == 90 || iz == 122) { /* ASCII character set */ if (ic >= 97 && ic <= 122) { *(unsigned char *)subnam = (char) (ic - 32); for (i__ = 2; i__ <= 6; ++i__) { ic = *(unsigned char *)&subnam[i__ - 1]; if (ic >= 97 && ic <= 122) { *(unsigned char *)&subnam[i__ - 1] = (char) (ic - 32); } /* L10: */ } } } else if (iz == 233 || iz == 169) { /* EBCDIC character set */ if (((ic >= 129) && (ic <= 137)) || ((ic >= 145) && (ic <= 153)) || ((ic >= 162) && (ic <= 169))) { *(unsigned char *)subnam = (char) (ic + 64); for (i__ = 2; i__ <= 6; ++i__) { ic = *(unsigned char *)&subnam[i__ - 1]; if (((ic >= 129) && (ic <= 137)) || ((ic >= 145) && (ic <= 153)) || ((ic >= 162) && (ic <= 169))) { *(unsigned char *)&subnam[i__ - 1] = (char) (ic + 64); } /* L20: */ } } } else if (iz == 218 || iz == 250) { /* Prime machines: ASCII+128 */ if (ic >= 225 && ic <= 250) { *(unsigned char *)subnam = (char) (ic - 32); for (i__ = 2; i__ <= 6; ++i__) { ic = *(unsigned char *)&subnam[i__ - 1]; if (ic >= 225 && ic <= 250) { *(unsigned char *)&subnam[i__ - 1] = (char) (ic - 32); } /* L30: */ } } } *(unsigned char *)c1 = *(unsigned char *)subnam; sname = *(unsigned char *)c1 == 'S' || *(unsigned char *)c1 == 'D'; cname = *(unsigned char *)c1 == 'C' || *(unsigned char *)c1 == 'Z'; if (! (cname || sname)) { return ret_val; } s_copy(c2, subnam + 1, (ftnlen)2, (ftnlen)2); s_copy(c3, subnam + 3, (ftnlen)3, (ftnlen)3); s_copy(c4, c3 + 1, (ftnlen)2, (ftnlen)2); switch (*ispec) { case 1: goto L110; case 2: goto L200; case 3: goto L300; } L110: /* ISPEC = 1: block size In these examples, separate code is provided for setting NB for real and complex. We assume that NB will take the same value in single or doublereal precision. */ nb = 1; if (s_cmp(c2, "GE", (ftnlen)2, (ftnlen)2) == 0) { if (s_cmp(c3, "TRF", (ftnlen)3, (ftnlen)3) == 0) { if (sname) { nb = 64; } else { nb = 64; } } else if (s_cmp(c3, "QRF", (ftnlen)3, (ftnlen)3) == 0 || s_cmp(c3, "RQF", (ftnlen)3, (ftnlen)3) == 0 || s_cmp(c3, "LQF", (ftnlen) 3, (ftnlen)3) == 0 || s_cmp(c3, "QLF", (ftnlen)3, (ftnlen)3) == 0) { if (sname) { nb = 32; } else { nb = 32; } } else if (s_cmp(c3, "HRD", (ftnlen)3, (ftnlen)3) == 0) { if (sname) { nb = 32; } else { nb = 32; } } else if (s_cmp(c3, "BRD", (ftnlen)3, (ftnlen)3) == 0) { if (sname) { nb = 32; } else { nb = 32; } } else if (s_cmp(c3, "TRI", (ftnlen)3, (ftnlen)3) == 0) { if (sname) { nb = 64; } else { nb = 64; } } } else if (s_cmp(c2, "PO", (ftnlen)2, (ftnlen)2) == 0) { if (s_cmp(c3, "TRF", (ftnlen)3, (ftnlen)3) == 0) { if (sname) { nb = 64; } else { nb = 64; } } } else if (s_cmp(c2, "SY", (ftnlen)2, (ftnlen)2) == 0) { if (s_cmp(c3, "TRF", (ftnlen)3, (ftnlen)3) == 0) { if (sname) { nb = 64; } else { nb = 64; } } else if (sname && s_cmp(c3, "TRD", (ftnlen)3, (ftnlen)3) == 0) { nb = 32; } else if (sname && s_cmp(c3, "GST", (ftnlen)3, (ftnlen)3) == 0) { nb = 64; } } else if (cname && s_cmp(c2, "HE", (ftnlen)2, (ftnlen)2) == 0) { if (s_cmp(c3, "TRF", (ftnlen)3, (ftnlen)3) == 0) { nb = 64; } else if (s_cmp(c3, "TRD", (ftnlen)3, (ftnlen)3) == 0) { nb = 32; } else if (s_cmp(c3, "GST", (ftnlen)3, (ftnlen)3) == 0) { nb = 64; } } else if (sname && s_cmp(c2, "OR", (ftnlen)2, (ftnlen)2) == 0) { if (*(unsigned char *)c3 == 'G') { if (s_cmp(c4, "QR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, "RQ", (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, "LQ", (ftnlen)2, ( ftnlen)2) == 0 || s_cmp(c4, "QL", (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, "HR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp( c4, "TR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, "BR", ( ftnlen)2, (ftnlen)2) == 0) { nb = 32; } } else if (*(unsigned char *)c3 == 'M') { if (s_cmp(c4, "QR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, "RQ", (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, "LQ", (ftnlen)2, ( ftnlen)2) == 0 || s_cmp(c4, "QL", (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, "HR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp( c4, "TR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, "BR", ( ftnlen)2, (ftnlen)2) == 0) { nb = 32; } } } else if (cname && s_cmp(c2, "UN", (ftnlen)2, (ftnlen)2) == 0) { if (*(unsigned char *)c3 == 'G') { if (s_cmp(c4, "QR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, "RQ", (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, "LQ", (ftnlen)2, ( ftnlen)2) == 0 || s_cmp(c4, "QL", (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, "HR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp( c4, "TR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, "BR", ( ftnlen)2, (ftnlen)2) == 0) { nb = 32; } } else if (*(unsigned char *)c3 == 'M') { if (s_cmp(c4, "QR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, "RQ", (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, "LQ", (ftnlen)2, ( ftnlen)2) == 0 || s_cmp(c4, "QL", (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, "HR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp( c4, "TR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, "BR", ( ftnlen)2, (ftnlen)2) == 0) { nb = 32; } } } else if (s_cmp(c2, "GB", (ftnlen)2, (ftnlen)2) == 0) { if (s_cmp(c3, "TRF", (ftnlen)3, (ftnlen)3) == 0) { if (sname) { if (*n4 <= 64) { nb = 1; } else { nb = 32; } } else { if (*n4 <= 64) { nb = 1; } else { nb = 32; } } } } else if (s_cmp(c2, "PB", (ftnlen)2, (ftnlen)2) == 0) { if (s_cmp(c3, "TRF", (ftnlen)3, (ftnlen)3) == 0) { if (sname) { if (*n2 <= 64) { nb = 1; } else { nb = 32; } } else { if (*n2 <= 64) { nb = 1; } else { nb = 32; } } } } else if (s_cmp(c2, "TR", (ftnlen)2, (ftnlen)2) == 0) { if (s_cmp(c3, "TRI", (ftnlen)3, (ftnlen)3) == 0) { if (sname) { nb = 64; } else { nb = 64; } } } else if (s_cmp(c2, "LA", (ftnlen)2, (ftnlen)2) == 0) { if (s_cmp(c3, "UUM", (ftnlen)3, (ftnlen)3) == 0) { if (sname) { nb = 64; } else { nb = 64; } } } else if (sname && s_cmp(c2, "ST", (ftnlen)2, (ftnlen)2) == 0) { if (s_cmp(c3, "EBZ", (ftnlen)3, (ftnlen)3) == 0) { nb = 1; } } ret_val = nb; return ret_val; L200: /* ISPEC = 2: minimum block size */ nbmin = 2; if (s_cmp(c2, "GE", (ftnlen)2, (ftnlen)2) == 0) { if (s_cmp(c3, "QRF", (ftnlen)3, (ftnlen)3) == 0 || s_cmp(c3, "RQF", ( ftnlen)3, (ftnlen)3) == 0 || s_cmp(c3, "LQF", (ftnlen)3, ( ftnlen)3) == 0 || s_cmp(c3, "QLF", (ftnlen)3, (ftnlen)3) == 0) { if (sname) { nbmin = 2; } else { nbmin = 2; } } else if (s_cmp(c3, "HRD", (ftnlen)3, (ftnlen)3) == 0) { if (sname) { nbmin = 2; } else { nbmin = 2; } } else if (s_cmp(c3, "BRD", (ftnlen)3, (ftnlen)3) == 0) { if (sname) { nbmin = 2; } else { nbmin = 2; } } else if (s_cmp(c3, "TRI", (ftnlen)3, (ftnlen)3) == 0) { if (sname) { nbmin = 2; } else { nbmin = 2; } } } else if (s_cmp(c2, "SY", (ftnlen)2, (ftnlen)2) == 0) { if (s_cmp(c3, "TRF", (ftnlen)3, (ftnlen)3) == 0) { if (sname) { nbmin = 8; } else { nbmin = 8; } } else if (sname && s_cmp(c3, "TRD", (ftnlen)3, (ftnlen)3) == 0) { nbmin = 2; } } else if (cname && s_cmp(c2, "HE", (ftnlen)2, (ftnlen)2) == 0) { if (s_cmp(c3, "TRD", (ftnlen)3, (ftnlen)3) == 0) { nbmin = 2; } } else if (sname && s_cmp(c2, "OR", (ftnlen)2, (ftnlen)2) == 0) { if (*(unsigned char *)c3 == 'G') { if (s_cmp(c4, "QR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, "RQ", (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, "LQ", (ftnlen)2, ( ftnlen)2) == 0 || s_cmp(c4, "QL", (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, "HR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp( c4, "TR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, "BR", ( ftnlen)2, (ftnlen)2) == 0) { nbmin = 2; } } else if (*(unsigned char *)c3 == 'M') { if (s_cmp(c4, "QR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, "RQ", (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, "LQ", (ftnlen)2, ( ftnlen)2) == 0 || s_cmp(c4, "QL", (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, "HR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp( c4, "TR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, "BR", ( ftnlen)2, (ftnlen)2) == 0) { nbmin = 2; } } } else if (cname && s_cmp(c2, "UN", (ftnlen)2, (ftnlen)2) == 0) { if (*(unsigned char *)c3 == 'G') { if (s_cmp(c4, "QR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, "RQ", (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, "LQ", (ftnlen)2, ( ftnlen)2) == 0 || s_cmp(c4, "QL", (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, "HR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp( c4, "TR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, "BR", ( ftnlen)2, (ftnlen)2) == 0) { nbmin = 2; } } else if (*(unsigned char *)c3 == 'M') { if (s_cmp(c4, "QR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, "RQ", (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, "LQ", (ftnlen)2, ( ftnlen)2) == 0 || s_cmp(c4, "QL", (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, "HR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp( c4, "TR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, "BR", ( ftnlen)2, (ftnlen)2) == 0) { nbmin = 2; } } } ret_val = nbmin; return ret_val; L300: /* ISPEC = 3: crossover point */ nx = 0; if (s_cmp(c2, "GE", (ftnlen)2, (ftnlen)2) == 0) { if (s_cmp(c3, "QRF", (ftnlen)3, (ftnlen)3) == 0 || s_cmp(c3, "RQF", ( ftnlen)3, (ftnlen)3) == 0 || s_cmp(c3, "LQF", (ftnlen)3, ( ftnlen)3) == 0 || s_cmp(c3, "QLF", (ftnlen)3, (ftnlen)3) == 0) { if (sname) { nx = 128; } else { nx = 128; } } else if (s_cmp(c3, "HRD", (ftnlen)3, (ftnlen)3) == 0) { if (sname) { nx = 128; } else { nx = 128; } } else if (s_cmp(c3, "BRD", (ftnlen)3, (ftnlen)3) == 0) { if (sname) { nx = 128; } else { nx = 128; } } } else if (s_cmp(c2, "SY", (ftnlen)2, (ftnlen)2) == 0) { if (sname && s_cmp(c3, "TRD", (ftnlen)3, (ftnlen)3) == 0) { nx = 32; } } else if (cname && s_cmp(c2, "HE", (ftnlen)2, (ftnlen)2) == 0) { if (s_cmp(c3, "TRD", (ftnlen)3, (ftnlen)3) == 0) { nx = 32; } } else if (sname && s_cmp(c2, "OR", (ftnlen)2, (ftnlen)2) == 0) { if (*(unsigned char *)c3 == 'G') { if (s_cmp(c4, "QR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, "RQ", (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, "LQ", (ftnlen)2, ( ftnlen)2) == 0 || s_cmp(c4, "QL", (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, "HR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp( c4, "TR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, "BR", ( ftnlen)2, (ftnlen)2) == 0) { nx = 128; } } } else if (cname && s_cmp(c2, "UN", (ftnlen)2, (ftnlen)2) == 0) { if (*(unsigned char *)c3 == 'G') { if (s_cmp(c4, "QR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, "RQ", (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, "LQ", (ftnlen)2, ( ftnlen)2) == 0 || s_cmp(c4, "QL", (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, "HR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp( c4, "TR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, "BR", ( ftnlen)2, (ftnlen)2) == 0) { nx = 128; } } } ret_val = nx; return ret_val; L400: /* ISPEC = 4: number of shifts (used by xHSEQR) */ ret_val = 6; return ret_val; L500: /* ISPEC = 5: minimum column dimension (not used) */ ret_val = 2; return ret_val; L600: /* ISPEC = 6: crossover point for SVD (used by xGELSS and xGESVD) */ ret_val = (integer) ((real) min(*n1,*n2) * 1.6f); return ret_val; L700: /* ISPEC = 7: number of processors (not used) */ ret_val = 1; return ret_val; L800: /* ISPEC = 8: crossover point for multishift (used by xHSEQR) */ ret_val = 50; return ret_val; L900: /* ISPEC = 9: maximum size of the subproblems at the bottom of the computation tree in the divide-and-conquer algorithm (used by xGELSD and xGESDD) */ ret_val = 25; return ret_val; L1000: /* ISPEC = 10: ieee NaN arithmetic can be trusted not to trap ILAENV = 0 */ ret_val = 1; if (ret_val == 1) { ret_val = ieeeck_(&c__0, &c_b162, &c_b163); } return ret_val; L1100: /* ISPEC = 11: infinity arithmetic can be trusted not to trap ILAENV = 0 */ ret_val = 1; if (ret_val == 1) { ret_val = ieeeck_(&c__1, &c_b162, &c_b163); } return ret_val; /* End of ILAENV */ } /* ilaenv_ */ #ifdef __cplusplus } #endif hypre-2.33.0/src/lapack/lsame.c000066400000000000000000000051131477326011500162230ustar00rootroot00000000000000/* Copyright (c) 1992-2008 The University of Tennessee. All rights reserved. * See file COPYING in this directory for details. */ #ifdef __cplusplus extern "C" { #endif #include "f2c.h" #include "hypre_lapack.h" logical lsame_(const char *ca,const char *cb) { /* -- LAPACK auxiliary routine (version 3.0) -- Univ. of Tennessee, Univ. of California Berkeley, NAG Ltd., Courant Institute, Argonne National Lab, and Rice University September 30, 1994 Purpose ======= LSAME returns .TRUE. if CA is the same letter as CB regardless of case. Arguments ========= CA (input) CHARACTER*1 CB (input) CHARACTER*1 CA and CB specify the single characters to be compared. ===================================================================== Test if the characters are equal */ /* System generated locals */ logical ret_val; /* Local variables */ integer inta, intb, zcode; ret_val = *(unsigned char *)ca == *(unsigned char *)cb; if (ret_val) { return ret_val; } /* Now test for equivalence if both characters are alphabetic. */ zcode = 'Z'; /* Use 'Z' rather than 'A' so that ASCII can be detected on Prime machines, on which ICHAR returns a value with bit 8 set. ICHAR('A') on Prime machines returns 193 which is the same as ICHAR('A') on an EBCDIC machine. */ inta = *(unsigned char *)ca; intb = *(unsigned char *)cb; if (zcode == 90 || zcode == 122) { /* ASCII is assumed - ZCODE is the ASCII code of either lower o r upper case 'Z'. */ if (inta >= 97 && inta <= 122) { inta += -32; } if (intb >= 97 && intb <= 122) { intb += -32; } } else if (zcode == 233 || zcode == 169) { /* EBCDIC is assumed - ZCODE is the EBCDIC code of either lower or upper case 'Z'. */ if (((inta >= 129) && (inta <= 137)) || ((inta >= 145) && (inta <= 153)) || ((inta >= 162) && (inta <= 169))) { inta += 64; } if (((intb >= 129) && (intb <= 137)) || ((intb >= 145) && (intb <= 153)) || ((intb >= 162) && (intb <= 169))) { intb += 64; } } else if (zcode == 218 || zcode == 250) { /* ASCII is assumed, on Prime machines - ZCODE is the ASCII cod e plus 128 of either lower or upper case 'Z'. */ if (inta >= 225 && inta <= 250) { inta += -32; } if (intb >= 225 && intb <= 250) { intb += -32; } } ret_val = inta == intb; /* RETURN End of LSAME */ return ret_val; } /* lsame_ */ #ifdef __cplusplus } #endif hypre-2.33.0/src/lapack/xerbla.c000066400000000000000000000026161477326011500164040ustar00rootroot00000000000000/* Copyright (c) 1992-2008 The University of Tennessee. All rights reserved. * See file COPYING in this directory for details. */ #ifdef __cplusplus extern "C" { #endif #include "f2c.h" #include "hypre_lapack.h" /* Subroutine */ integer xerbla_(const char *srname, integer *info) { /* -- LAPACK auxiliary routine (version 2.0) -- Univ. of Tennessee, Univ. of California Berkeley, NAG Ltd., Courant Institute, Argonne National Lab, and Rice University September 30, 1994 Purpose ======= XERBLA is an error handler for the LAPACK routines. It is called by an LAPACK routine if an input parameter has an invalid value. A message is printed and execution stops. Installers may consider modifying the STOP statement in order to call system-specific exception-handling facilities. Arguments ========= SRNAME (input) CHARACTER*6 The name of the routine which called XERBLA. INFO (input) INTEGER The position of the invalid parameter in the parameter list of the calling routine. ===================================================================== */ hypre_printf("** On entry to %6s, parameter number %2i had an illegal value\n", srname, (integer)*info); /* End of XERBLA */ return 0; } /* xerbla_ */ #ifdef __cplusplus } #endif hypre-2.33.0/src/lib/000077500000000000000000000000001477326011500142715ustar00rootroot00000000000000hypre-2.33.0/src/lib/Makefile000066400000000000000000000073731477326011500157430ustar00rootroot00000000000000# Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) include ../config/Makefile.config FEIHYPREFILES = ${HYPRE_FEI_HYPRE_FILES} FEMLIFILES = ${HYPRE_FEI_FEMLI_FILES} IJMVFILES = ${HYPRE_SRC_TOP_DIR}/IJ_mv/*.o ${HYPRE_SRC_TOP_DIR}/IJ_mv/*.obj EUCLIDFILES = ${HYPRE_EUCLID_FILES} PARASAILSFILES = ${HYPRE_PARASAILS_FILES} PILUTFILES = ${HYPRE_PILUT_FILES} DISTMATRIXFILES = ${HYPRE_SRC_TOP_DIR}/distributed_matrix/*.o KRYLOVFILES = ${HYPRE_SRC_TOP_DIR}/krylov/*.o MATMATFILES = ${HYPRE_SRC_TOP_DIR}/matrix_matrix/*.o MULTIVECFILES = ${HYPRE_SRC_TOP_DIR}/multivector/*.o PARCSRLSFILES = ${HYPRE_SRC_TOP_DIR}/parcsr_ls/*.o ${HYPRE_SRC_TOP_DIR}/parcsr_ls/*.obj PARCSRMVFILES = ${HYPRE_SRC_TOP_DIR}/parcsr_mv/*.o ${HYPRE_SRC_TOP_DIR}/parcsr_mv/*.obj PARCSRBLOCKMVFILES = ${HYPRE_SRC_TOP_DIR}/parcsr_block_mv/*.o SEQMVFILES = ${HYPRE_SRC_TOP_DIR}/seq_mv/*.o ${HYPRE_SRC_TOP_DIR}/seq_mv/*.obj SEQBLOCKMVFILES = ${HYPRE_SRC_TOP_DIR}/seq_block_mv/*.o SSTRUCTLSFILES = ${HYPRE_SRC_TOP_DIR}/sstruct_ls/*.o ${HYPRE_SRC_TOP_DIR}/sstruct_ls/*.obj SSTRUCTMVFILES = ${HYPRE_SRC_TOP_DIR}/sstruct_mv/*.o ${HYPRE_SRC_TOP_DIR}/sstruct_mv/*.obj STRUCTLSFILES = ${HYPRE_SRC_TOP_DIR}/struct_ls/*.o ${HYPRE_SRC_TOP_DIR}/struct_ls/*.obj STRUCTMVFILES = ${HYPRE_SRC_TOP_DIR}/struct_mv/*.o ${HYPRE_SRC_TOP_DIR}/struct_mv/*.obj UTILITIESFILES = ${HYPRE_SRC_TOP_DIR}/utilities/*.o ${HYPRE_SRC_TOP_DIR}/utilities/*.obj BLASFILES = ${HYPRE_SRC_TOP_DIR}/blas/*.o LAPACKFILES = ${HYPRE_SRC_TOP_DIR}/lapack/*.o FILES_HYPRE = \ $(FEIHYPREFILES)\ $(FEMLIFILES)\ $(IJMVFILES)\ $(EUCLIDFILES)\ $(PARASAILSFILES)\ $(PILUTFILES)\ $(DISTMATRIXFILES)\ $(KRYLOVFILES)\ $(MATMATFILES)\ $(MULTIVECFILES)\ $(PARCSRLSFILES)\ $(PARCSRMVFILES)\ $(PARCSRBLOCKMVFILES)\ $(SEQMVFILES)\ $(SEQBLOCKMVFILES)\ $(SSTRUCTLSFILES)\ $(SSTRUCTMVFILES)\ $(STRUCTLSFILES)\ $(STRUCTMVFILES)\ $(UTILITIESFILES)\ $(BLASFILES)\ $(LAPACKFILES) SONAME = libHYPRE-${HYPRE_RELEASE_VERSION}${HYPRE_LIB_SUFFIX} SOLIBS = ${DSUPERLU_LIBS} ${HYPRE_MAGMA_LIB_DIR} ${HYPRE_MAGMA_LIB} ${MPILIBDIRS} ${MPILIBS} ${LAPACKLIBDIRS} ${LAPACKLIBS}\ ${BLASLIBDIRS} ${BLASLIBS} ${LIBS} ${FLIBS} ################################################################## # Targets ################################################################## all: libHYPRE${HYPRE_LIB_SUFFIX} cp -fR libHYPRE* ${HYPRE_BUILD_DIR}/lib install: all cp -fR libHYPRE* ${HYPRE_LIB_INSTALL} clean: rm -f *.o libHYPRE* rm -rf pchdir tca.map *inslog* distclean: clean ################################################################## # Rules ################################################################## # NOTE: Some of the FILES symbols below can be empty, so they are listed on an # AR line with at least one nonempty symbol libHYPRE.a: ${FILES_HYPRE} @echo "Building libHYPRE ... " rm -f $@ ${AR} $@ $(FEIHYPREFILES) $(FEMLIFILES) $(IJMVFILES) ${AR} $@ $(EUCLIDFILES) $(PARASAILSFILES) $(PILUTFILES) $(DISTMATRIXFILES) ${AR} $@ $(KRYLOVFILES) ${AR} $@ $(MATMATFILES) ${AR} $@ $(MULTIVECFILES) ${AR} $@ $(PARCSRLSFILES) ${AR} $@ $(PARCSRMVFILES) ${AR} $@ $(PARCSRBLOCKMVFILES) ${AR} $@ $(SEQMVFILES) ${AR} $@ $(SEQBLOCKMVFILES) ${AR} $@ $(SSTRUCTLSFILES) ${AR} $@ $(SSTRUCTMVFILES) ${AR} $@ $(STRUCTLSFILES) ${AR} $@ $(STRUCTMVFILES) ${AR} $@ $(UTILITIESFILES) ${AR} $@ $(BLASFILES) $(LAPACKFILES) ${RANLIB} $@ libHYPRE.so libHYPRE.dylib: ${FILES_HYPRE} @echo "Building $@ ... " ${BUILD_CC_SHARED} -o ${SONAME} ${FILES_HYPRE} ${SOLIBS} ${SHARED_SET_SONAME}${SONAME} ${SHARED_OPTIONS} ${LDFLAGS} ln -s -f ${SONAME} $@ hypre-2.33.0/src/matrix_matrix/000077500000000000000000000000001477326011500164135ustar00rootroot00000000000000hypre-2.33.0/src/matrix_matrix/CMakeLists.txt000066400000000000000000000010021477326011500211440ustar00rootroot00000000000000# Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) set(HDRS HYPRE_matrix_matrix_protos.h ) set(SRCS HYPRE_ConvertParCSRMatrixToDistributedMatrix.c HYPRE_ConvertPETScMatrixToDistributedMatrix.c ) target_sources(${PROJECT_NAME} PRIVATE ${SRCS} ${HDRS} ) convert_filenames_to_full_paths(HDRS) set(HYPRE_HEADERS ${HYPRE_HEADERS} ${HDRS} PARENT_SCOPE) hypre-2.33.0/src/matrix_matrix/HYPRE_BuildIJMatrixFromDistributedMatrix.c000066400000000000000000000100701477326011500264070ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * Routine for building a DistributedMatrix from a ParCSRMatrix * *****************************************************************************/ #ifdef HYPRE_DEBUG #include #endif #include #include "general.h" #include "HYPRE.h" #include "HYPRE_utilities.h" /* Prototypes for DistributedMatrix */ #include "HYPRE_distributed_matrix_types.h" #include "HYPRE_distributed_matrix_protos.h" /* Matrix prototypes for IJMatrix */ #include "IJ_mv/HYPRE_IJ_mv.h" /* Local routine prototypes */ HYPRE_Int HYPRE_IJMatrixSetLocalStorageType(HYPRE_IJMatrix ij_matrix, HYPRE_Int local_storage_type ); HYPRE_Int HYPRE_IJMatrixSetLocalSize(HYPRE_IJMatrix ij_matrix, HYPRE_Int row, HYPRE_Int col ); HYPRE_Int HYPRE_IJMatrixInsertRow( HYPRE_IJMatrix ij_matrix, HYPRE_Int size, HYPRE_BigInt i, HYPRE_BigInt *col_ind, HYPRE_Real *values ); /*-------------------------------------------------------------------------- * HYPRE_BuildIJMatrixFromDistributedMatrix *--------------------------------------------------------------------------*/ /** Builds an IJMatrix from a distributed matrix by pulling rows out of the distributed_matrix and putting them into the IJMatrix. This routine does not effect the distributed matrix. In essence, it makes a copy of the input matrix in another format. NOTE: because this routine makes a copy and is not just a simple conversion, it is memory-expensive and should only be used in low-memory requirement situations (such as unit-testing code). */ HYPRE_Int HYPRE_BuildIJMatrixFromDistributedMatrix( HYPRE_DistributedMatrix DistributedMatrix, HYPRE_IJMatrix *ij_matrix, HYPRE_Int local_storage_type ) { HYPRE_Int ierr; MPI_Comm comm; HYPRE_BigInt M, N; HYPRE_BigInt first_local_row, last_local_row; HYPRE_BigInt first_local_col, last_local_col; HYPRE_BigInt i; HYPRE_Int size; HYPRE_BigInt *col_ind; HYPRE_Real *values; if (!DistributedMatrix) { return (-1); } comm = HYPRE_DistributedMatrixGetContext( DistributedMatrix ); ierr = HYPRE_DistributedMatrixGetDims( DistributedMatrix, &M, &N ); ierr = HYPRE_DistributedMatrixGetLocalRange( DistributedMatrix, &first_local_row, &last_local_row, &first_local_col, &last_local_col ); ierr = HYPRE_IJMatrixCreate( comm, first_local_row, last_local_row, first_local_col, last_local_col, ij_matrix ); ierr = HYPRE_IJMatrixSetLocalStorageType( *ij_matrix, local_storage_type ); /* if(ierr) return(ierr); */ ierr = HYPRE_IJMatrixSetLocalSize( *ij_matrix, last_local_row - first_local_row + 1, last_local_col - first_local_col + 1 ); ierr = HYPRE_IJMatrixInitialize( *ij_matrix ); /* if(ierr) return(ierr);*/ /* Loop through all locally stored rows and insert them into ij_matrix */ for (i = first_local_row; i <= last_local_row; i++) { ierr = HYPRE_DistributedMatrixGetRow( DistributedMatrix, i, &size, &col_ind, &values ); /* if( ierr ) return(ierr);*/ ierr = HYPRE_IJMatrixInsertRow( *ij_matrix, size, i, col_ind, values ); /* if( ierr ) return(ierr);*/ ierr = HYPRE_DistributedMatrixRestoreRow( DistributedMatrix, i, &size, &col_ind, &values ); /* if( ierr ) return(ierr); */ } ierr = HYPRE_IJMatrixAssemble( *ij_matrix ); /* if(ierr) return(ierr); */ return (ierr); } hypre-2.33.0/src/matrix_matrix/HYPRE_ConvertPETScMatrixToDistributedMatrix.c000066400000000000000000000055131477326011500270710ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * Routine for building a DistributedMatrix from a MPIAIJ Mat, i.e. PETSc matrix * *****************************************************************************/ #ifdef HYPRE_DEBUG #include #endif #include #include "general.h" #include "HYPRE.h" #include "HYPRE_utilities.h" /* Prototypes for DistributedMatrix */ #include "HYPRE_distributed_matrix_types.h" #include "HYPRE_distributed_matrix_protos.h" #ifdef PETSC_AVAILABLE /* Matrix structure from PETSc */ #include "sles.h" /*-------------------------------------------------------------------------- * HYPRE_ConvertPETScMatrixToDistributedMatrix *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ConvertPETScMatrixToDistributedMatrix( Mat PETSc_matrix, HYPRE_DistributedMatrix *DistributedMatrix ) { HYPRE_Int ierr; MPI_Comm hypre_MPI_Comm; HYPRE_BigInt M, N; #ifdef HYPRE_TIMING HYPRE_Int timer; #endif if (!PETSc_matrix) { return (-1); } #ifdef HYPRE_TIMING timer = hypre_InitializeTiming( "ConvertPETScMatrixToDistributedMatrix"); hypre_BeginTiming( timer ); #endif ierr = PetscObjectGetComm( (PetscObject) PETSc_matrix, &MPI_Comm); CHKERRA(ierr); ierr = HYPRE_DistributedMatrixCreate( MPI_Comm, DistributedMatrix ); /* if(ierr) return(ierr); */ ierr = HYPRE_DistributedMatrixSetLocalStorageType( *DistributedMatrix, HYPRE_PETSC ); /* if(ierr) return(ierr);*/ ierr = HYPRE_DistributedMatrixInitialize( *DistributedMatrix ); /* if(ierr) return(ierr);*/ ierr = HYPRE_DistributedMatrixSetLocalStorage( *DistributedMatrix, PETSc_matrix ); /* if(ierr) return(ierr); */ /* Note that this is kind of cheating, since the Mat structure contains more than local information... the alternative is to extract the global info from the Mat and put it into DistributedMatrixAuxiliaryStorage. However, the latter is really a "just in case" option, and so if we don't *have* to use it, we won't.*/ ierr = MatGetSize( PETSc_matrix, &M, &N); if (ierr) { return (ierr); } ierr = HYPRE_DistributedMatrixSetDims( *DistributedMatrix, M, N); ierr = HYPRE_DistributedMatrixAssemble( *DistributedMatrix ); /* if(ierr) return(ierr);*/ #ifdef HYPRE_TIMING hypre_EndTiming( timer ); /* hypre_FinalizeTiming( timer ); */ #endif return (0); } #endif hypre-2.33.0/src/matrix_matrix/HYPRE_ConvertParCSRMatrixToDistributedMatrix.c000066400000000000000000000042511477326011500272430ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * Routine for building a DistributedMatrix from a ParCSRMatrix * *****************************************************************************/ #ifdef HYPRE_DEBUG #include #endif #include #include "_hypre_utilities.h" #include "HYPRE.h" /* Prototypes for DistributedMatrix */ #include "HYPRE_distributed_matrix_types.h" #include "HYPRE_distributed_matrix_protos.h" /* Matrix prototypes for ParCSR */ #include "HYPRE_parcsr_mv.h" /*-------------------------------------------------------------------------- * HYPRE_ConvertParCSRMatrixToDistributedMatrix *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ConvertParCSRMatrixToDistributedMatrix( HYPRE_ParCSRMatrix parcsr_matrix, HYPRE_DistributedMatrix *DistributedMatrix ) { MPI_Comm comm; HYPRE_BigInt M, N; #ifdef HYPRE_TIMING HYPRE_Int timer; timer = hypre_InitializeTiming( "ConvertParCSRMatrisToDistributedMatrix"); hypre_BeginTiming( timer ); #endif if (!parcsr_matrix) { hypre_error(HYPRE_ERROR_ARG); return hypre_error_flag; } HYPRE_ParCSRMatrixGetComm( parcsr_matrix, &comm); HYPRE_DistributedMatrixCreate( comm, DistributedMatrix ); HYPRE_DistributedMatrixSetLocalStorageType( *DistributedMatrix, HYPRE_PARCSR ); HYPRE_DistributedMatrixInitialize( *DistributedMatrix ); HYPRE_DistributedMatrixSetLocalStorage( *DistributedMatrix, parcsr_matrix ); HYPRE_ParCSRMatrixGetDims( parcsr_matrix, &M, &N); HYPRE_DistributedMatrixSetDims( *DistributedMatrix, M, N); HYPRE_DistributedMatrixAssemble( *DistributedMatrix ); #ifdef HYPRE_TIMING hypre_EndTiming( timer ); /* hypre_FinalizeTiming( timer ); */ #endif return hypre_error_flag; } hypre-2.33.0/src/matrix_matrix/HYPRE_matrix_matrix_protos.h000066400000000000000000000016161477326011500240350ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "HYPRE_distributed_matrix_types.h" #ifdef PETSC_AVAILABLE /* HYPRE_ConvertPETScMatrixToDistributedMatrix.c */ HYPRE_Int HYPRE_ConvertPETScMatrixToDistributedMatrix (Mat PETSc_matrix, HYPRE_DistributedMatrix *DistributedMatrix ); #endif /* HYPRE_ConvertParCSRMatrixToDistributedMatrix.c */ HYPRE_Int HYPRE_ConvertParCSRMatrixToDistributedMatrix (HYPRE_ParCSRMatrix parcsr_matrix, HYPRE_DistributedMatrix *DistributedMatrix ); hypre-2.33.0/src/matrix_matrix/Makefile000066400000000000000000000032041477326011500200520ustar00rootroot00000000000000# Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) include ../config/Makefile.config CINCLUDES = ${INCLUDES} ${MPIINCLUDE} C_COMPILE_FLAGS = \ -I..\ -I$(srcdir)/..\ -I$(srcdir)/../utilities\ -I$(srcdir)/../distributed_matrix\ -I$(srcdir)/../seq_mv\ -I$(srcdir)/../parcsr_mv\ ${CINCLUDES} EXTRA_FILES =\ internal_protos.h HEADERS = HYPRE_matrix_matrix_protos.h FILES =\ HYPRE_ConvertParCSRMatrixToDistributedMatrix.c\ HYPRE_ConvertPETScMatrixToDistributedMatrix.c OBJS = ${FILES:.c=.o} SONAME = libHYPRE_MatrixMatrix-${HYPRE_RELEASE_VERSION}${HYPRE_LIB_SUFFIX} ################################################################## # Targets ################################################################## all: libHYPRE_MatrixMatrix${HYPRE_LIB_SUFFIX} cp -fR $(srcdir)/HYPRE_*.h $(HYPRE_BUILD_DIR)/include # cp -fR libHYPRE* $(HYPRE_BUILD_DIR)/lib install: libHYPRE_MatrixMatrix${HYPRE_LIB_SUFFIX} cp -fR $(srcdir)/HYPRE_*.h $(HYPRE_INC_INSTALL) # cp -fR libHYPRE* $(HYPRE_LIB_INSTALL) clean: rm -f *.o lib* rm -rf pchdir tca.map *inslog* distclean: clean ################################################################## # Rules ################################################################## libHYPRE_MatrixMatrix.a: ${OBJS} @echo "Building $@ ... " ${AR} $@ ${OBJS} ${RANLIB} $@ libHYPRE_MatrixMatrix.so libHYPRE_MatrixMatrix.dylib: ${OBJS} @echo "Building $@ ... " ${BUILD_CC_SHARED} -o ${SONAME} ${OBJS} ${SHARED_SET_SONAME}${SONAME} ln -s -f ${SONAME} $@ ${OBJS}: ${HEADERS} hypre-2.33.0/src/matrix_matrix/internal_protos.h000066400000000000000000000011141477326011500220030ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /* HYPRE_ConvertPETScMatrixToDistributedMatrix.c */ HYPRE_Int HYPRE_ConvertPETScMatrixToDistributedMatrix (Mat PETSc_matrix, HYPRE_DistributedMatrix *DistributedMatrix ); hypre-2.33.0/src/multivector/000077500000000000000000000000001477326011500161005ustar00rootroot00000000000000hypre-2.33.0/src/multivector/CMakeLists.txt000066400000000000000000000011041477326011500206340ustar00rootroot00000000000000# Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) set(HDRS csr_matmultivec.h interpreter.h multivector.h par_csr_matmultivec.h par_csr_pmvcomm.h par_multivector.h seq_multivector.h temp_multivector.h ) set(SRCS multivector.c temp_multivector.c ) target_sources(${PROJECT_NAME} PRIVATE ${SRCS} ${HDRS} ) convert_filenames_to_full_paths(HDRS) set(HYPRE_HEADERS ${HYPRE_HEADERS} ${HDRS} PARENT_SCOPE) hypre-2.33.0/src/multivector/Makefile000066400000000000000000000026631477326011500175470ustar00rootroot00000000000000# Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) include ../config/Makefile.config CINCLUDES = ${INCLUDES} ${MPIINCLUDE} C_COMPILE_FLAGS = \ -I.\ -I$(srcdir)/..\ -I$(srcdir)/../utilities\ ${CINCLUDES} HEADERS =\ multivector.h\ temp_multivector.h FILES =\ multivector.c\ temp_multivector.c OBJS = ${FILES:.c=.o} SONAME = libHYPRE_multivector-${HYPRE_RELEASE_VERSION}${HYPRE_LIB_SUFFIX} ################################################################## # Targets ################################################################## all: libHYPRE_multivector${HYPRE_LIB_SUFFIX} cp -fR *.h $(HYPRE_BUILD_DIR)/include # cp -fR libHYPRE* $(HYPRE_BUILD_DIR)/lib install: libHYPRE_multivector${HYPRE_LIB_SUFFIX} cp -fR *.h $(HYPRE_INC_INSTALL) # cp -fR libHYPRE* $(HYPRE_LIB_INSTALL) clean: rm -f *.o libHYPRE* rm -rf pchdir tca.map *inslog* distclean: clean ################################################################## # Rules ################################################################## libHYPRE_multivector.a: ${OBJS} @echo "Building $@ ... " ${AR} $@ ${OBJS} ${RANLIB} $@ libHYPRE_multivector.so libHYPRE_multivector.dylib: ${OBJS} @echo "Building $@ ... " ${BUILD_CC_SHARED} -o ${SONAME} ${OBJS} ${SHARED_SET_SONAME}${SONAME} ln -s -f ${SONAME} $@ ${OBJS}: ${HEADERS} hypre-2.33.0/src/multivector/backup.c000066400000000000000000000355361477326011500175250ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include #include "temp_multivector.h" void* hypre_TempMultiVectorCreateFromSampleVector( void* ii_, HYPRE_Int n, void* sample ) { HYPRE_Int i; hypre_TempMultiVector* data; HYPRE_InterfaceInterpreter* ii = (HYPRE_InterfaceInterpreter*)ii_; data = hypre_TAlloc(hypre_TempMultiVector, 1, HYPRE_MEMORY_HOST); hypre_assert( data != NULL ); data->interpreter = ii; data->numVectors = n; data->vector = hypre_CTAlloc(void*, n, HYPRE_MEMORY_HOST); hypre_assert( data->vector != NULL ); data->ownsVectors = 1; data->mask = NULL; data->ownsMask = 0; for ( i = 0; i < n; i++ ) { data->vector[i] = (ii->CreateVector)(sample); } return data; } void* hypre_TempMultiVectorCreateCopy( void* src_, HYPRE_Int copyValues ) { HYPRE_Int i, n; hypre_TempMultiVector* src; hypre_TempMultiVector* dest; src = (hypre_TempMultiVector*)src_; hypre_assert( src != NULL ); n = src->numVectors; dest = hypre_TempMultiVectorCreateFromSampleVector( src->interpreter, n, src->vector[0] ); if ( copyValues ) for ( i = 0; i < n; i++ ) { (dest->interpreter->CopyVector)(src->vector[i], dest->vector[i]); } return dest; } void hypre_TempMultiVectorDestroy( void* v_ ) { HYPRE_Int i; hypre_TempMultiVector* data = (hypre_TempMultiVector*)v_; if ( data == NULL ) { return; } if ( data->ownsVectors && data->vector != NULL ) { for ( i = 0; i < data->numVectors; i++ ) { (data->interpreter->DestroyVector)(data->vector[i]); } hypre_TFree(data->vector, HYPRE_MEMORY_HOST); } if ( data->mask && data->ownsMask ) { hypre_TFree(data->mask, HYPRE_MEMORY_HOST); } hypre_TFree(data, HYPRE_MEMORY_HOST); } HYPRE_Int hypre_TempMultiVectorWidth( void* v ) { hypre_TempMultiVector* data = (hypre_TempMultiVector*)v; if ( data == NULL ) { return 0; } return data->numVectors; } HYPRE_Int hypre_TempMultiVectorHeight( void* v ) { return 0; } void hypre_TempMultiVectorSetMask( void* v, HYPRE_Int* mask ) { hypre_TempMultiVector* data = (hypre_TempMultiVector*)v; hypre_assert( data != NULL ); data->mask = mask; data->ownsMask = 0; } void hypre_TempMultiVectorClear( void* v ) { HYPRE_Int i; hypre_TempMultiVector* data = (hypre_TempMultiVector*)v; hypre_assert( data != NULL ); for ( i = 0; i < data->numVectors; i++ ) if ( data->mask == NULL || (data->mask)[i] ) { (data->interpreter->ClearVector)(data->vector[i]); } } void hypre_TempMultiVectorSetRandom( void* v, HYPRE_Int seed ) { HYPRE_Int i; hypre_TempMultiVector* data = (hypre_TempMultiVector*)v; hypre_assert( data != NULL ); hypre_SeedRand( seed ); for ( i = 0; i < data->numVectors; i++ ) { if ( data->mask == NULL || (data->mask)[i] ) { seed = hypre_RandI(); (data->interpreter->SetRandomValues)(data->vector[i], seed); } } } void hypre_collectVectorPtr( HYPRE_Int* mask, hypre_TempMultiVector* x, void** px ) { HYPRE_Int ix, jx; if ( mask != NULL ) { for ( ix = 0, jx = 0; ix < x->numVectors; ix++ ) if ( mask[ix] ) { px[jx++] = x->vector[ix]; } } else for ( ix = 0; ix < x->numVectors; ix++ ) { px[ix] = x->vector[ix]; } } void hypre_TempMultiVectorCopy( void* src, void* dest ) { HYPRE_Int i, ms, md; void** ps; void** pd; hypre_TempMultiVector* srcData = (hypre_TempMultiVector*)src; hypre_TempMultiVector* destData = (hypre_TempMultiVector*)dest; hypre_assert( srcData != NULL && destData != NULL ); ms = aux_maskCount( srcData->numVectors, srcData->mask ); md = aux_maskCount( destData->numVectors, destData->mask ); hypre_assert( ms == md ); ps = hypre_CTAlloc(void*, ms, HYPRE_MEMORY_HOST); hypre_assert( ps != NULL ); pd = hypre_CTAlloc(void*, md, HYPRE_MEMORY_HOST); hypre_assert( pd != NULL ); hypre_collectVectorPtr( srcData->mask, srcData, ps ); hypre_collectVectorPtr( destData->mask, destData, pd ); for ( i = 0; i < ms; i++ ) { (srcData->interpreter->CopyVector)(ps[i], pd[i]); } hypre_TFree(ps, HYPRE_MEMORY_HOST); hypre_TFree(pd, HYPRE_MEMORY_HOST); } void hypre_TempMultiVectorAxpy( HYPRE_Complex a, void* x_, void* y_ ) { HYPRE_Int i, mx, my; void** px; void** py; hypre_TempMultiVector* xData; hypre_TempMultiVector* yData; xData = (hypre_TempMultiVector*)x_; yData = (hypre_TempMultiVector*)y_; hypre_assert( xData != NULL && yData != NULL ); mx = aux_maskCount( xData->numVectors, xData->mask ); my = aux_maskCount( yData->numVectors, yData->mask ); hypre_assert( mx == my ); px = hypre_CTAlloc(void*, mx, HYPRE_MEMORY_HOST); hypre_assert( px != NULL ); py = hypre_CTAlloc(void*, my, HYPRE_MEMORY_HOST); hypre_assert( py != NULL ); hypre_collectVectorPtr( xData->mask, xData, px ); hypre_collectVectorPtr( yData->mask, yData, py ); for ( i = 0; i < mx; i++ ) { (xData->interpreter->Axpy)(a, px[i], py[i]); } hypre_TFree(px, HYPRE_MEMORY_HOST); hypre_TFree(py, HYPRE_MEMORY_HOST); } void hypre_TempMultiVectorByMultiVector( void* x_, void* y_, HYPRE_Int xyGHeight, HYPRE_Int xyHeight, HYPRE_Int xyWidth, HYPRE_Complex* xyVal ) { /* xy = x'*y */ HYPRE_Int ix, iy, mx, my, jxy; HYPRE_Complex* p; void** px; void** py; hypre_TempMultiVector* xData; hypre_TempMultiVector* yData; xData = (hypre_TempMultiVector*)x_; yData = (hypre_TempMultiVector*)y_; hypre_assert( xData != NULL && yData != NULL ); mx = aux_maskCount( xData->numVectors, xData->mask ); hypre_assert( mx == xyHeight ); my = aux_maskCount( yData->numVectors, yData->mask ); hypre_assert( my == xyWidth ); px = hypre_CTAlloc(void*, mx, HYPRE_MEMORY_HOST); hypre_assert( px != NULL ); py = hypre_CTAlloc(void*, my, HYPRE_MEMORY_HOST); hypre_assert( py != NULL ); hypre_collectVectorPtr( xData->mask, xData, px ); hypre_collectVectorPtr( yData->mask, yData, py ); jxy = xyGHeight - xyHeight; for ( iy = 0, p = xyVal; iy < my; iy++ ) { for ( ix = 0; ix < mx; ix++, p++ ) { *p = (xData->interpreter->InnerProd)(px[ix], py[iy]); } p += jxy; } hypre_TFree(px, HYPRE_MEMORY_HOST); hypre_TFree(py, HYPRE_MEMORY_HOST); } void hypre_TempMultiVectorByMultiVectorDiag( void* x_, void* y_, HYPRE_Int* mask, HYPRE_Int n, HYPRE_Complex* diag ) { /* diag = diag(x'*y) */ HYPRE_Int i, mx, my, m; void** px; void** py; HYPRE_Int* index; hypre_TempMultiVector* xData; hypre_TempMultiVector* yData; xData = (hypre_TempMultiVector*)x_; yData = (hypre_TempMultiVector*)y_; hypre_assert( xData != NULL && yData != NULL ); mx = aux_maskCount( xData->numVectors, xData->mask ); my = aux_maskCount( yData->numVectors, yData->mask ); m = aux_maskCount( n, mask ); hypre_assert( mx == my && mx == m ); px = hypre_CTAlloc(void*, mx, HYPRE_MEMORY_HOST); hypre_assert( px != NULL ); py = hypre_CTAlloc(void*, my, HYPRE_MEMORY_HOST); hypre_assert( py != NULL ); hypre_collectVectorPtr( xData->mask, xData, px ); hypre_collectVectorPtr( yData->mask, yData, py ); index = hypre_CTAlloc(HYPRE_Int, m, HYPRE_MEMORY_HOST); aux_indexFromMask( n, mask, index ); for ( i = 0; i < m; i++ ) { *(diag + index[i] - 1) = (xData->interpreter->InnerProd)(px[i], py[i]); } hypre_TFree(index, HYPRE_MEMORY_HOST); hypre_TFree(px, HYPRE_MEMORY_HOST); hypre_TFree(py, HYPRE_MEMORY_HOST); } void hypre_TempMultiVectorByMatrix( void* x_, HYPRE_Int rGHeight, HYPRE_Int rHeight, HYPRE_Int rWidth, HYPRE_Complex* rVal, void* y_ ) { HYPRE_Int i, j, jump; HYPRE_Int mx, my; HYPRE_Complex* p; void** px; void** py; hypre_TempMultiVector* xData; hypre_TempMultiVector* yData; xData = (hypre_TempMultiVector*)x_; yData = (hypre_TempMultiVector*)y_; hypre_assert( xData != NULL && yData != NULL ); mx = aux_maskCount( xData->numVectors, xData->mask ); my = aux_maskCount( yData->numVectors, yData->mask ); hypre_assert( mx == rHeight && my == rWidth ); px = hypre_CTAlloc(void*, mx, HYPRE_MEMORY_HOST); hypre_assert( px != NULL ); py = hypre_CTAlloc(void*, my, HYPRE_MEMORY_HOST); hypre_assert( py != NULL ); hypre_collectVectorPtr( xData->mask, xData, px ); hypre_collectVectorPtr( yData->mask, yData, py ); jump = rGHeight - rHeight; for ( j = 0, p = rVal; j < my; j++ ) { (xData->interpreter->ClearVector)( py[j] ); for ( i = 0; i < mx; i++, p++ ) { (xData->interpreter->Axpy)(*p, px[i], py[j]); } p += jump; } hypre_TFree(px, HYPRE_MEMORY_HOST); hypre_TFree(py, HYPRE_MEMORY_HOST); } void hypre_TempMultiVectorXapy( void* x_, HYPRE_Int rGHeight, HYPRE_Int rHeight, HYPRE_Int rWidth, HYPRE_Complex* rVal, void* y_ ) { HYPRE_Int i, j, jump; HYPRE_Int mx, my; HYPRE_Complex* p; void** px; void** py; hypre_TempMultiVector* xData; hypre_TempMultiVector* yData; xData = (hypre_TempMultiVector*)x_; yData = (hypre_TempMultiVector*)y_; hypre_assert( xData != NULL && yData != NULL ); mx = aux_maskCount( xData->numVectors, xData->mask ); my = aux_maskCount( yData->numVectors, yData->mask ); hypre_assert( mx == rHeight && my == rWidth ); px = hypre_CTAlloc(void*, mx, HYPRE_MEMORY_HOST); hypre_assert( px != NULL ); py = hypre_CTAlloc(void*, my, HYPRE_MEMORY_HOST); hypre_assert( py != NULL ); hypre_collectVectorPtr( xData->mask, xData, px ); hypre_collectVectorPtr( yData->mask, yData, py ); jump = rGHeight - rHeight; for ( j = 0, p = rVal; j < my; j++ ) { for ( i = 0; i < mx; i++, p++ ) { (xData->interpreter->Axpy)(*p, px[i], py[j]); } p += jump; } hypre_TFree(px, HYPRE_MEMORY_HOST); hypre_TFree(py, HYPRE_MEMORY_HOST); } void hypre_TempMultiVectorByDiagonal( void* x_, HYPRE_Int* mask, HYPRE_Int n, HYPRE_Complex* diag, void* y_ ) { HYPRE_Int j; HYPRE_Int mx, my, m; void** px; void** py; HYPRE_Int* index; hypre_TempMultiVector* xData; hypre_TempMultiVector* yData; xData = (hypre_TempMultiVector*)x_; yData = (hypre_TempMultiVector*)y_; hypre_assert( xData != NULL && yData != NULL ); mx = aux_maskCount( xData->numVectors, xData->mask ); my = aux_maskCount( yData->numVectors, yData->mask ); m = aux_maskCount( n, mask ); hypre_assert( mx == m && my == m ); if ( m < 1 ) { return; } px = hypre_CTAlloc(void*, mx, HYPRE_MEMORY_HOST); hypre_assert( px != NULL ); py = hypre_CTAlloc(void*, my, HYPRE_MEMORY_HOST); hypre_assert( py != NULL ); index = hypre_CTAlloc(HYPRE_Int, m, HYPRE_MEMORY_HOST); aux_indexFromMask( n, mask, index ); hypre_collectVectorPtr( xData->mask, xData, px ); hypre_collectVectorPtr( yData->mask, yData, py ); for ( j = 0; j < my; j++ ) { (xData->interpreter->ClearVector)(py[j]); (xData->interpreter->Axpy)(diag[index[j] - 1], px[j], py[j]); } hypre_TFree(px, HYPRE_MEMORY_HOST); hypre_TFree(py, HYPRE_MEMORY_HOST); hypre_TFree(index, HYPRE_MEMORY_HOST); } void hypre_TempMultiVectorEval( void (*f)( void*, void*, void* ), void* par, void* x_, void* y_ ) { HYPRE_Int i, mx, my; void** px; void** py; hypre_TempMultiVector* x; hypre_TempMultiVector* y; x = (hypre_TempMultiVector*)x_; y = (hypre_TempMultiVector*)y_; hypre_assert( x != NULL && y != NULL ); if ( f == NULL ) { hypre_TempMultiVectorCopy( x, y ); return; } mx = aux_maskCount( x->numVectors, x->mask ); my = aux_maskCount( y->numVectors, y->mask ); hypre_assert( mx == my ); px = hypre_CTAlloc(void*, mx, HYPRE_MEMORY_HOST); hypre_assert( px != NULL ); py = hypre_CTAlloc(void*, my, HYPRE_MEMORY_HOST); hypre_assert( py != NULL ); hypre_collectVectorPtr( x->mask, x, px ); hypre_collectVectorPtr( y->mask, y, py ); for ( i = 0; i < mx; i++ ) { f( par, (void*)px[i], (void*)py[i] ); } hypre_TFree(px, HYPRE_MEMORY_HOST); hypre_TFree(py, HYPRE_MEMORY_HOST); } HYPRE_Int hypre_TempMultiVectorPrint( void* x_, const char* fileName ) { HYPRE_Int i, ierr; hypre_TempMultiVector* x; char fullName[128]; x = (hypre_TempMultiVector*)x_; hypre_assert( x != NULL ); if ( x->interpreter->PrintVector == NULL ) { return 1; } ierr = 0; for ( i = 0; i < x->numVectors; i++ ) { hypre_sprintf( fullName, "%s.%d", fileName, i ); ierr = ierr || (x->interpreter->PrintVector)( x->vector[i], fullName ); } return ierr; } void* hypre_TempMultiVectorRead( MPI_Comm comm, void* ii_, const char* fileName ) { HYPRE_Int i, n, id; FILE* fp; char fullName[128]; hypre_TempMultiVector* x; HYPRE_InterfaceInterpreter* ii = (HYPRE_InterfaceInterpreter*)ii_; if ( ii->ReadVector == NULL ) { return NULL; } hypre_MPI_Comm_rank( comm, &id ); n = 0; do { hypre_sprintf( fullName, "%s.%d.%d", fileName, n, id ); if ( (fp = fopen(fullName, "r")) ) { n++; fclose( fp ); } } while ( fp ); x = hypre_TAlloc(hypre_TempMultiVector, 1, HYPRE_MEMORY_HOST); hypre_assert( x != NULL ); x->interpreter = ii; x->numVectors = n; x->vector = hypre_CTAlloc(void*, n, HYPRE_MEMORY_HOST); hypre_assert( x->vector != NULL ); x->ownsVectors = 1; for ( i = 0; i < n; i++ ) { hypre_sprintf( fullName, "%s.%d", fileName, i ); x->vector[i] = (ii->ReadVector)( comm, fullName ); } x->mask = NULL; x->ownsMask = 0; return x; } HYPRE_Int aux_maskCount( HYPRE_Int n, HYPRE_Int* mask ) { HYPRE_Int i, m; if ( mask == NULL ) { return n; } for ( i = m = 0; i < n; i++ ) if ( mask[i] ) { m++; } return m; } void aux_indexFromMask( HYPRE_Int n, HYPRE_Int* mask, HYPRE_Int* index ) { HYPRE_Int i, j; if ( mask != NULL ) { for ( i = 0, j = 0; i < n; i++ ) if ( mask[i] ) { index[j++] = i + 1; } } else for ( i = 0; i < n; i++ ) { index[i] = i + 1; } } hypre-2.33.0/src/multivector/csr_matmultivec.c000066400000000000000000000236361477326011500214570ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * Matvec functions for hypre_CSRMatrix class. * *****************************************************************************/ #include "csr_multimatvec.h" #include "seq_mv.h" #include "seq_multivector.h" /*-------------------------------------------------------------------------- * hypre_CSRMatrixMultiMatvec *--------------------------------------------------------------------------*/ HYPRE_Int hypre_CSRMatrixMatMultivec(HYPRE_Complex alpha, hypre_CSRMatrix *A, hypre_Multivector *x, HYPRE_Complex beta, hypre_Multivector *y) { HYPRE_Complex *A_data = hypre_CSRMatrixData(A); HYPRE_Int *A_i = hypre_CSRMatrixI(A); HYPRE_Int *A_j = hypre_CSRMatrixJ(A); HYPRE_Int num_rows = hypre_CSRMatrixNumRows(A); HYPRE_Int num_cols = hypre_CSRMatrixNumCols(A); HYPRE_Complex *x_data = hypre_MultivectorData(x); HYPRE_Complex *y_data = hypre_MultivectorData(y); HYPRE_Int x_size = hypre_MultivectorSize(x); HYPRE_Int y_size = hypre_MultivectorSize(y); HYPRE_Int num_vectors = hypre_MultivectorNumVectors(x); HYPRE_Int *x_active_ind = x->active_indices; HYPRE_Int *y_active_ind = y->active_indices; HYPRE_Int num_active_vectors = x->num_active_vectors; HYPRE_Int i, j, jj, m, ierr = 0, optimize; HYPRE_Complex temp, tempx, xpar = 0.7, *xptr, *yptr; /*--------------------------------------------------------------------- * Check for size compatibility. Matvec returns ierr = 1 if * length of X doesn't equal the number of columns of A, * ierr = 2 if the length of Y doesn't equal the number of rows * of A, and ierr = 3 if both are true. * * Because temporary vectors are often used in Matvec, none of * these conditions terminates processing, and the ierr flag * is informational only. *--------------------------------------------------------------------*/ hypre_assert(num_active_vectors == y->num_active_vectors); if (num_cols != x_size) { ierr = 1; } if (num_rows != y_size) { ierr = 2; } if (num_cols != x_size && num_rows != y_size) { ierr = 3; } optimize = 0; if (num_active_vectors == num_vectors && num_vectors == y->num_vectors) { optimize = 1; } /*----------------------------------------------------------------------- * Do (alpha == 0.0) computation - RDF: USE MACHINE EPS *-----------------------------------------------------------------------*/ if (alpha == 0.0) { #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i) HYPRE_SMP_SCHEDULE #endif for (i = 0; i < num_rows * num_vectors; i++) { y_data[i] *= beta; } return ierr; } /*----------------------------------------------------------------------- * y = (beta/alpha)*y *-----------------------------------------------------------------------*/ temp = beta / alpha; if (temp != 1.0) { if (temp == 0.0) { #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i) HYPRE_SMP_SCHEDULE #endif for (i = 0; i < num_rows * num_vectors; i++) { y_data[i] = 0.0; } } else { #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i) HYPRE_SMP_SCHEDULE #endif for (i = 0; i < num_rows * num_vectors; i++) { y_data[i] *= temp; } } } /*----------------------------------------------------------------- * y += A*x *-----------------------------------------------------------------*/ if ( num_vectors == 1 ) { for (i = 0; i < num_rows; i++) { temp = y_data[i]; for (jj = A_i[i]; jj < A_i[i + 1]; jj++) { temp += A_data[jj] * x_data[A_j[jj]]; } y_data[i] = temp; } } else { if (optimize == 0) { for (i = 0; i < num_rows; i++) { for (j = 0; j < num_active_vectors; ++j) { xptr = x_data[x_active_ind[j] * x_size]; temp = y_data[y_active_ind[j] * y_size + i]; for (jj = A_i[i]; jj < A_i[i + 1]; jj++) { temp += A_data[jj] * xptr[A_j[jj]]; } y_data[y_active_ind[j]*y_size + i] = temp; } } } else { for (i = 0; i < num_rows; i++) { for (j = 0; j < num_vectors; ++j) { xptr = x_data[j * x_size]; temp = y_data[j * y_size + i]; for (jj = A_i[i]; jj < A_i[i + 1]; jj++) { temp += A_data[jj] * xptr[A_j[jj]]; } y_data[j * y_size + i] = temp; } } /* different version for (j=0; jactive_indices; HYPRE_Int *y_active_ind = y->active_indices; HYPRE_Int num_active_vectors = x->num_active_vectors; HYPRE_Complex temp; HYPRE_Int i, jv, jj, size, ierr = 0; /*--------------------------------------------------------------------- * Check for size compatibility. MatvecT returns ierr = 1 if * length of X doesn't equal the number of rows of A, * ierr = 2 if the length of Y doesn't equal the number of * columns of A, and ierr = 3 if both are true. * * Because temporary vectors are often used in MatvecT, none of * these conditions terminates processing, and the ierr flag * is informational only. *--------------------------------------------------------------------*/ hypre_assert(num_active_vectors == y->num_active_vectors); if (num_rows != x_size) { ierr = 1; } if (num_cols != y_size) { ierr = 2; } if (num_rows != x_size && num_cols != y_size) { ierr = 3; } /*----------------------------------------------------------------------- * Do (alpha == 0.0) computation - RDF: USE MACHINE EPS *-----------------------------------------------------------------------*/ if (alpha == 0.0) { #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i) HYPRE_SMP_SCHEDULE #endif for (i = 0; i < num_cols * num_vectors; i++) { y_data[i] *= beta; } return ierr; } /*----------------------------------------------------------------------- * y = (beta/alpha)*y *-----------------------------------------------------------------------*/ temp = beta / alpha; if (temp != 1.0) { if (temp == 0.0) { #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i) HYPRE_SMP_SCHEDULE #endif for (i = 0; i < num_cols * num_vectors; i++) { y_data[i] = 0.0; } } else { #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i) HYPRE_SMP_SCHEDULE #endif for (i = 0; i < num_cols * num_vectors; i++) { y_data[i] *= temp; } } } /*----------------------------------------------------------------- * y += A^T*x *-----------------------------------------------------------------*/ if ( num_vectors == 1 ) { for (i = 0; i < num_rows; i++) { for (jj = A_i[i]; jj < A_i[i + 1]; jj++) { y_data[A_j[jj]] += A_data[jj] * x_data[i]; } } } else { for ( jv = 0; jv < num_vectors; ++jv ) { for (jj = A_i[i]; jj < A_i[i + 1]; jj++) { y_data[A_j[jj] + jv * y_size] += A_data[jj] * x_data[i + jv * x_size]; } } } /*----------------------------------------------------------------- * y = alpha*y *-----------------------------------------------------------------*/ if (alpha != 1.0) { #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i) HYPRE_SMP_SCHEDULE #endif for (i = 0; i < num_cols * num_vectors; i++) { y_data[i] *= alpha; } } return ierr; } hypre-2.33.0/src/multivector/csr_matmultivec.h000066400000000000000000000026541477326011500214610ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #ifndef CSR_MULTIMATVEC_H #define CSR_MULTIMATVEC_H #include "seq_mv.h" #include "seq_multivector.h" #ifdef __cplusplus extern "C" { #endif /*-------------------------------------------------------------------------- * hypre_CSRMatrixMatMultivec *--------------------------------------------------------------------------*/ HYPRE_Int hypre_CSRMatrixMatMultivec(HYPRE_Complex alpha, hypre_CSRMatrix *A, hypre_Multivector *x, HYPRE_Complex beta, hypre_Multivector *y); /*-------------------------------------------------------------------------- * hypre_CSRMatrixMultiMatvecT * * Performs y <- alpha * A^T * x + beta * y * * From Van Henson's modification of hypre_CSRMatrixMatvec. *--------------------------------------------------------------------------*/ HYPRE_Int hypre_CSRMatrixMatMultivecT(HYPRE_Complex alpha, hypre_CSRMatrix *A, hypre_Multivector *x, HYPRE_Complex beta, hypre_Multivector *y); #ifdef __cplusplus } #endif #endif /* CSR_MATMULTIVEC_H */ hypre-2.33.0/src/multivector/interpreter.h000066400000000000000000000045671477326011500206300ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #ifndef LOBPCG_INTERFACE_INTERPRETER #define LOBPCG_INTERFACE_INTERPRETER #include "HYPRE_utilities.h" typedef struct { /* vector operations */ void* (*CreateVector) ( void *vector ); HYPRE_Int (*DestroyVector) ( void *vector ); HYPRE_Real (*InnerProd) ( void *x, void *y ); HYPRE_Int (*CopyVector) ( void *x, void *y ); HYPRE_Int (*ClearVector) ( void *x ); HYPRE_Int (*SetRandomValues) ( void *x, HYPRE_Int seed ); HYPRE_Int (*ScaleVector) ( HYPRE_Complex alpha, void *x ); HYPRE_Int (*Axpy) ( HYPRE_Complex alpha, void *x, void *y ); HYPRE_Int (*VectorSize) (void * vector); /* multivector operations */ /* do we need the following entry? */ void* (*CreateMultiVector) ( void*, HYPRE_Int n, void *vector ); void* (*CopyCreateMultiVector) ( void *x, HYPRE_Int ); void (*DestroyMultiVector) ( void *x ); HYPRE_Int (*Width) ( void *x ); HYPRE_Int (*Height) ( void *x ); void (*SetMask) ( void *x, HYPRE_Int *mask ); void (*CopyMultiVector) ( void *x, void *y ); void (*ClearMultiVector) ( void *x ); void (*SetRandomVectors) ( void *x, HYPRE_Int seed ); void (*MultiInnerProd) ( void *x, void *y, HYPRE_BigInt, HYPRE_Int, HYPRE_Int, HYPRE_Complex* ); void (*MultiInnerProdDiag) ( void *x, void *y, HYPRE_Int*, HYPRE_Int, HYPRE_Complex* ); void (*MultiVecMat) ( void *x, HYPRE_BigInt, HYPRE_Int, HYPRE_Int, HYPRE_Complex*, void *y ); void (*MultiVecMatDiag) ( void *x, HYPRE_Int*, HYPRE_Int, HYPRE_Complex*, void *y ); void (*MultiAxpy) ( HYPRE_Complex alpha, void *x, void *y ); /* do we need the following 2 entries? */ void (*MultiXapy) ( void *x, HYPRE_BigInt, HYPRE_Int, HYPRE_Int, HYPRE_Complex*, void *y ); void (*Eval) ( void (*f)( void*, void*, void* ), void*, void *x, void *y ); } mv_InterfaceInterpreter; #endif hypre-2.33.0/src/multivector/multivector.c000066400000000000000000000123701477326011500206240ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include #include #include "multivector.h" #include "_hypre_utilities.h" /* abstract multivector */ struct mv_MultiVector { void* data; /* the pointer to the actual multivector */ HYPRE_Int ownsData; mv_InterfaceInterpreter* interpreter; /* a structure that defines multivector operations */ } ; void * mv_MultiVectorGetData (mv_MultiVectorPtr x) { hypre_assert (x != NULL); return x->data; } mv_MultiVectorPtr mv_MultiVectorWrap( mv_InterfaceInterpreter* ii, void * data, HYPRE_Int ownsData ) { mv_MultiVectorPtr x; x = hypre_TAlloc(struct mv_MultiVector, 1, HYPRE_MEMORY_HOST); hypre_assert( x != NULL ); x->interpreter = ii; x->data = data; x->ownsData = ownsData; return x; } mv_MultiVectorPtr mv_MultiVectorCreateFromSampleVector( void* ii_, HYPRE_Int n, void* sample ) { mv_MultiVectorPtr x; mv_InterfaceInterpreter* ii = (mv_InterfaceInterpreter*)ii_; x = hypre_TAlloc(struct mv_MultiVector, 1, HYPRE_MEMORY_HOST); hypre_assert( x != NULL ); x->interpreter = ii; x->data = (ii->CreateMultiVector)( ii, n, sample ); x->ownsData = 1; return x; } mv_MultiVectorPtr mv_MultiVectorCreateCopy( mv_MultiVectorPtr x, HYPRE_Int copyValues ) { mv_MultiVectorPtr y; void* data; mv_InterfaceInterpreter* ii; hypre_assert( x != NULL ); ii = x->interpreter; y = hypre_TAlloc(struct mv_MultiVector, 1, HYPRE_MEMORY_HOST); hypre_assert( y != NULL ); data = (ii->CopyCreateMultiVector)( x->data, copyValues ); y->interpreter = ii; y->data = data; y->ownsData = 1; return y; } void mv_MultiVectorDestroy( mv_MultiVectorPtr v) { if ( v == NULL ) { return; } if ( v->ownsData ) { (v->interpreter->DestroyMultiVector)( v->data ); } hypre_TFree( v, HYPRE_MEMORY_HOST); } void mv_MultiVectorSetMask( mv_MultiVectorPtr v, HYPRE_Int* mask ) { hypre_assert( v != NULL ); (v->interpreter->SetMask)( v->data, mask ); } HYPRE_Int mv_MultiVectorWidth( mv_MultiVectorPtr v ) { if ( v == NULL ) { return 0; } return (v->interpreter->Width)( v->data ); } HYPRE_Int mv_MultiVectorHeight( mv_MultiVectorPtr v ) { if ( v == NULL ) { return 0; } return (v->interpreter->Height)(v->data); } void mv_MultiVectorClear( mv_MultiVectorPtr v ) { hypre_assert( v != NULL ); (v->interpreter->ClearMultiVector)( v->data ); } void mv_MultiVectorSetRandom( mv_MultiVectorPtr v, HYPRE_Int seed ) { hypre_assert( v != NULL ); (v->interpreter->SetRandomVectors)( v->data, seed ); } void mv_MultiVectorCopy( mv_MultiVectorPtr src, mv_MultiVectorPtr dest ) { hypre_assert( src != NULL && dest != NULL ); (src->interpreter->CopyMultiVector)( src->data, dest->data ); } void mv_MultiVectorAxpy( HYPRE_Complex a, mv_MultiVectorPtr x, mv_MultiVectorPtr y ) { hypre_assert( x != NULL && y != NULL ); (x->interpreter->MultiAxpy)( a, x->data, y->data ); } void mv_MultiVectorByMultiVector( mv_MultiVectorPtr x, mv_MultiVectorPtr y, HYPRE_BigInt xyGHeight, HYPRE_Int xyHeight, HYPRE_Int xyWidth, HYPRE_Real* xy ) { /* xy = x'*y */ hypre_assert( x != NULL && y != NULL ); (x->interpreter->MultiInnerProd) ( x->data, y->data, xyGHeight, xyHeight, xyWidth, xy ); } void mv_MultiVectorByMultiVectorDiag( mv_MultiVectorPtr x, mv_MultiVectorPtr y, HYPRE_Int* mask, HYPRE_Int n, HYPRE_Real* d ) { /* d = diag(x'*y) */ hypre_assert( x != NULL && y != NULL ); (x->interpreter->MultiInnerProdDiag)( x->data, y->data, mask, n, d ); } void mv_MultiVectorByMatrix( mv_MultiVectorPtr x, HYPRE_BigInt rGHeight, HYPRE_Int rHeight, HYPRE_Int rWidth, HYPRE_Complex* rVal, mv_MultiVectorPtr y ) { /* y = x*r */ hypre_assert( x != NULL && y != NULL ); (x->interpreter->MultiVecMat) ( x->data, rGHeight, rHeight, rWidth, rVal, y->data ); } void mv_MultiVectorXapy( mv_MultiVectorPtr x, HYPRE_BigInt rGHeight, HYPRE_Int rHeight, HYPRE_Int rWidth, HYPRE_Complex* rVal, mv_MultiVectorPtr y ) { /* y = y + x*a */ hypre_assert( x != NULL && y != NULL ); (x->interpreter->MultiXapy) ( x->data, rGHeight, rHeight, rWidth, rVal, y->data ); } void mv_MultiVectorByDiagonal( mv_MultiVectorPtr x, HYPRE_Int* mask, HYPRE_Int n, HYPRE_Complex* d, mv_MultiVectorPtr y ) { /* y = x*d */ hypre_assert( x != NULL && y != NULL ); (x->interpreter->MultiVecMatDiag)( x->data, mask, n, d, y->data ); } void mv_MultiVectorEval( void (*f)( void*, void*, void* ), void* par, mv_MultiVectorPtr x, mv_MultiVectorPtr y ) { /* y = f(x) computed vector-wise */ hypre_assert( x != NULL && y != NULL ); (x->interpreter->Eval)( f, par, x->data, y->data ); } hypre-2.33.0/src/multivector/multivector.h000066400000000000000000000066721477326011500206410ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #ifndef MULTIVECTOR_FUNCTION_PROTOTYPES #define MULTIVECTOR_FUNCTION_PROTOTYPES #include "HYPRE_utilities.h" #include "interpreter.h" /* abstract multivector */ typedef struct mv_MultiVector* mv_MultiVectorPtr; /* The functions below simply call the respective functions pointed to in the HYPRE_InterfaceInterpreter structure */ #ifdef __cplusplus extern "C" { #endif /* returns pointer to "real" multivector data (x->data) */ void * mv_MultiVectorGetData (mv_MultiVectorPtr x); /* wraps our multivector structure around the data provided by user */ mv_MultiVectorPtr mv_MultiVectorWrap( mv_InterfaceInterpreter* ii, void * data, HYPRE_Int ownsData ); /* creates a multivector of width n using sample vector */ mv_MultiVectorPtr mv_MultiVectorCreateFromSampleVector( void*, HYPRE_Int n, void* sample ); /* creates a multivector of the same shape as x; copies values if copyValues is non-zero */ mv_MultiVectorPtr mv_MultiVectorCreateCopy( mv_MultiVectorPtr x, HYPRE_Int copyValues ); void mv_MultiVectorDestroy( mv_MultiVectorPtr ); HYPRE_Int mv_MultiVectorWidth( mv_MultiVectorPtr v ); HYPRE_Int mv_MultiVectorHeight( mv_MultiVectorPtr v ); /* sets mask for v; all the subsequent operations apply only to masked vectors */ void mv_MultiVectorSetMask( mv_MultiVectorPtr v, HYPRE_Int* mask ); void mv_MultiVectorClear( mv_MultiVectorPtr ); void mv_MultiVectorSetRandom( mv_MultiVectorPtr v, HYPRE_Int seed ); void mv_MultiVectorCopy( mv_MultiVectorPtr src, mv_MultiVectorPtr dest ); /* computes y = a*x + y */ void mv_MultiVectorAxpy( HYPRE_Complex a, mv_MultiVectorPtr x, mv_MultiVectorPtr y ); /* computes the matrix v = x'*y stored in fortran style: gh is the leading dimension, h the number of rows and w the number of columns (cf. blas or lapack) */ void mv_MultiVectorByMultiVector( mv_MultiVectorPtr x, mv_MultiVectorPtr y, HYPRE_BigInt gh, HYPRE_Int h, HYPRE_Int w, HYPRE_Real* v ); /*computes the diagonal of x'*y stored in diag(mask) */ void mv_MultiVectorByMultiVectorDiag( mv_MultiVectorPtr, mv_MultiVectorPtr, HYPRE_Int* mask, HYPRE_Int n, HYPRE_Real* diag ); /* computes y = x*v, where v is stored in fortran style */ void mv_MultiVectorByMatrix( mv_MultiVectorPtr x, HYPRE_BigInt gh, HYPRE_Int h, HYPRE_Int w, HYPRE_Complex* v, mv_MultiVectorPtr y ); /* computes y = x*v + y, where v is stored in fortran style */ void mv_MultiVectorXapy( mv_MultiVectorPtr x, HYPRE_BigInt gh, HYPRE_Int h, HYPRE_Int w, HYPRE_Complex* v, mv_MultiVectorPtr y ); /* computes y = x*diag(mask) */ void mv_MultiVectorByDiagonal( mv_MultiVectorPtr x, HYPRE_Int* mask, HYPRE_Int n, HYPRE_Complex* diag, mv_MultiVectorPtr y ); /* computes y = f(x) vector-by-vector */ void mv_MultiVectorEval( void (*f)( void*, void*, void* ), void* par, mv_MultiVectorPtr x, mv_MultiVectorPtr y ); #ifdef __cplusplus } #endif #endif /* MULTIVECTOR_FUNCTION_PROTOTYPES */ hypre-2.33.0/src/multivector/par_csr_matmultivec.c000066400000000000000000000264401477326011500223150ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * Matvec functions for hypre_CSRMatrix class. * *****************************************************************************/ #include "par_csr_multimatvec.h" #include "_hypre_parcsr_mv.h" #include "seq_multivector.h" #include "par_multivector.h" #include "par_csr_pmvcomm.h" #include "csr_multimatvec.h" /*-------------------------------------------------------------------------- * hypre_ParCSRMatrixMultiMatvec * * Performs y <- alpha * A * x + beta * y * *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ParCSRMatrixMatMultiVec(HYPRE_Complex alpha, hypre_ParCSRMatrix *A, hypre_ParMultivector *x, HYPRE_Complex beta, hypre_ParMultivector *y) { hypre_ParCSRCommMultiHandle *comm_handle; hypre_ParCSRCommPkg *comm_pkg = hypre_ParCSRMatrixCommPkg(A); hypre_CSRMatrix *diag = hypre_ParCSRMatrixDiag(A); hypre_CSRMatrix *offd = hypre_ParCSRMatrixOffd(A); hypre_Multivector *x_local = hypre_ParMultivectorLocalVector(x); hypre_Multivector *y_local = hypre_ParMultivectorLocalVector(y); HYPRE_Int num_rows = hypre_CSRMatrixNumRows(diag); HYPRE_Int num_cols = hypre_CSRMatrixNumCols(diag); HYPRE_Int *x_active_ind = x->active_indices; HYPRE_Int *y_active_ind = y->active_indices; hypre_Multivector *x_tmp; HYPRE_Int x_size = hypre_MultivectorSize(x_local); HYPRE_Int y_size = hypre_MultivectorSize(y_local); HYPRE_Int num_vectors = hypre_MultivectorNumVectors(x_local); HYPRE_Int num_cols_offd = hypre_CSRMatrixNumCols(offd); HYPRE_Int ierr = 0, send_leng, num_vec_sends, endp1; HYPRE_Int num_sends, i, j, jj, index, start, offset, length, jv; HYPRE_Int num_active_vectors; HYPRE_Complex *x_tmp_data, *x_buf_data; HYPRE_Complex *x_local_data = hypre_MultivectorData(x_local); /*--------------------------------------------------------------------- * count the number of active vectors -> num_vec_sends *--------------------------------------------------------------------*/ num_active_vectors = x->num_active_vectors; hypre_assert(num_active_vectors == y->num_active_vectors); if (x_active_ind == NULL) { num_vec_sends = num_vectors; } else { num_vec_sends = x->num_active_vectors; } /*--------------------------------------------------------------------- * Check for size compatibility. ParMatvec returns ierr = 11 if * length of X doesn't equal the number of columns of A, * ierr = 12 if the length of Y doesn't equal the number of rows * of A, and ierr = 13 if both are true. * * Because temporary vectors are often used in ParMatvec, none of * these conditions terminates processing, and the ierr flag * is informational only. *--------------------------------------------------------------------*/ if (num_cols != x_size) { ierr = 11; } if (num_rows != y_size) { ierr = 12; } if (num_cols != x_size && num_rows != y_size) { ierr = 13; } /*--------------------------------------------------------------------- * If there exists no CommPkg for A, a CommPkg is generated using * equally load balanced partitionings *--------------------------------------------------------------------*/ if (!comm_pkg) { hypre_MatvecCommPkgCreate(A); comm_pkg = hypre_ParCSRMatrixCommPkg(A); } num_sends = hypre_ParCSRCommPkgNumSends(comm_pkg); send_leng = hypre_ParCSRCommPkgSendMapStart(comm_pkg, num_sends); /*--------------------------------------------------------------------- * allocate temporary and send buffers and communication handle *--------------------------------------------------------------------*/ x_buf_data = hypre_CTAlloc(HYPRE_Complex, num_vec_sends * send_leng, HYPRE_MEMORY_HOST); x_tmp = hypre_SeqMultivectorCreate( num_cols_offd, num_vectors ); hypre_SeqMultivectorInitialize(x_tmp); x_tmp_data = hypre_MultivectorData(x_tmp); comm_handle = hypre_CTAlloc(hypre_ParCSRCommMultiHandle, 1, HYPRE_MEMORY_HOST); /*--------------------------------------------------------------------- * put the send data into the send buffer *--------------------------------------------------------------------*/ offset = 0; for ( jv = 0; jv < num_active_vectors; ++jv ) { jj = x_active_ind[jv]; for (i = 0; i < num_sends; i++) { start = hypre_ParCSRCommPkgSendMapStart(comm_pkg, i); endp1 = hypre_ParCSRCommPkgSendMapStart(comm_pkg, i + 1); length = endp1 - start; for (j = start; j < endp1; j++) { index = hypre_ParCSRCommPkgSendMapElmt(comm_pkg, j); x_buf_data[offset + j] = x_local_data[jj * x_size + index]; } } offset += hypre_ParCSRCommPkgSendMapStart(comm_pkg, num_sends); } /*--------------------------------------------------------------------- * initiate sending data *--------------------------------------------------------------------*/ comm_handle = hypre_ParCSRCommMultiHandleCreate(1, comm_pkg, x_buf_data, x_tmp_data, num_vec_sends); hypre_CSRMatrixMatMultivec(alpha, diag, x_local, beta, y_local); hypre_ParCSRCommMultiHandleDestroy(comm_handle); comm_handle = NULL; hypre_TFree(comm_handle, HYPRE_MEMORY_HOST); if (num_cols_offd) { hypre_CSRMatrixMultiMatvec(alpha, offd, x_tmp, 1.0, y_local); } hypre_SeqMultivectorDestroy(x_tmp); x_tmp = NULL; hypre_TFree(x_buf_data, HYPRE_MEMORY_HOST); return ierr; } /*-------------------------------------------------------------------------- * hypre_ParCSRMatrixMultiMatvecT * * Performs y <- alpha * A^T * x + beta * y * *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ParCSRMatrixMultiMatVecT(HYPRE_Complex alpha, hypre_ParCSRMatrix *A, hypre_ParMultivector *x, HYPRE_Complex beta, hypre_ParMultivector *y) { hypre_ParCSRCommMultiHandle *comm_handle; hypre_ParCSRCommPkg *comm_pkg = hypre_ParCSRMatrixCommPkg(A); hypre_CSRMatrix *diag = hypre_ParCSRMatrixDiag(A); hypre_CSRMatrix *offd = hypre_ParCSRMatrixOffd(A); hypre_Multivector *x_local = hypre_ParMultivectorLocalVector(x); hypre_Multivector *y_local = hypre_ParMultivectorLocalVector(y); HYPRE_Int num_rows = hypre_CSRMatrixNumRows(diag); HYPRE_Int num_cols = hypre_CSRMatrixNumCols(diag); HYPRE_Int *x_active_ind = x->active_indices; hypre_Multivector *y_tmp; HYPRE_Int x_size = hypre_MultivectorSize(x_local); HYPRE_Int y_size = hypre_MultivectorSize(y_local); HYPRE_Int num_vectors = hypre_MultivectorNumVectors(x_local); HYPRE_Int num_cols_offd = hypre_CSRMatrixNumCols(offd); HYPRE_Int ierr = 0, send_leng, num_vec_sends, endp1; HYPRE_Int num_sends, i, j, jj, index, start, offset, length, jv; HYPRE_Int num_active_vectors; HYPRE_Complex *y_tmp_data, *y_buf_data; HYPRE_Complex *y_local_data = hypre_MultivectorData(y_local); /*--------------------------------------------------------------------- * count the number of active vectors -> num_vec_sends *--------------------------------------------------------------------*/ num_active_vectors = x->num_active_vectors; hypre_assert(num_active_vectors == y->num_active_vectors); if (x_active_ind == NULL) { num_vec_sends = num_vectors; } else { num_vec_sends = x->num_active_vectors; } /*--------------------------------------------------------------------- * Check for size compatibility. MatvecT returns ierr = 1 if * length of X doesn't equal the number of rows of A, * ierr = 2 if the length of Y doesn't equal the number of * columns of A, and ierr = 3 if both are true. * * Because temporary vectors are often used in MatvecT, none of * these conditions terminates processing, and the ierr flag * is informational only. *--------------------------------------------------------------------*/ if (num_rows != x_size) { ierr = 1; } if (num_cols != y_size) { ierr = 2; } if (num_rows != x_size && num_cols != y_size) { ierr = 3; } /*--------------------------------------------------------------------- * If there exists no CommPkg for A, a CommPkg is generated using * equally load balanced partitionings *--------------------------------------------------------------------*/ if (!comm_pkg) { hypre_MatvecCommPkgCreate(A); comm_pkg = hypre_ParCSRMatrixCommPkg(A); } num_sends = hypre_ParCSRCommPkgNumSends(comm_pkg); send_leng = hypre_ParCSRCommPkgSendMapStart(comm_pkg, num_sends); /*--------------------------------------------------------------------- * allocate temporary and send buffers and communication handle *--------------------------------------------------------------------*/ y_buf_data = hypre_CTAlloc(HYPRE_Complex, num_vec_sends * send_leng, HYPRE_MEMORY_HOST); y_tmp = hypre_SeqMultivectorCreate( num_cols_offd, num_vectors ); hypre_SeqMultivectorInitialize(y_tmp); y_tmp_data = hypre_MultivectorData(y_tmp); comm_handle = hypre_CTAlloc(hypre_ParCSRCommMultiHandle, 1, HYPRE_MEMORY_HOST); /*--------------------------------------------------------------------- * put the send data into the send buffer *--------------------------------------------------------------------*/ offset = 0; for ( jv = 0; jv < num_vectors; ++jv ) { jj = x_active_ind[jv]; for (i = 0; i < num_sends; i++) { start = hypre_ParCSRCommPkgSendMapStart(comm_pkg, i); endp1 = hypre_ParCSRCommPkgSendMapStart(comm_pkg, i + 1); length = endp1 - start; for (j = start; j < endp1; j++) { index = hypre_ParCSRCommPkgSendMapElmt(comm_pkg, j); y_buf_data[offset + j] = y_local_data[jj * y_size + index]; } } offset += hypre_ParCSRCommPkgSendMapStart(comm_pkg, num_sends); } /*--------------------------------------------------------------------- * initiate sending data *--------------------------------------------------------------------*/ comm_handle = hypre_ParCSRCommMultiHandleCreate(1, comm_pkg, y_buf_data, y_tmp_data, num_vec_sends); hypre_CSRMatrixMultiMatvecT(alpha, diag, x_local, beta, y_local); hypre_ParCSRCommMultiHandleDestroy(comm_handle); comm_handle = NULL; hypre_TFree(comm_handle, HYPRE_MEMORY_HOST); if (num_cols_offd) { hypre_CSRMatrixMultiMatvecT(alpha, offd, y_tmp, 1.0, y_local); } hypre_SeqMultivectorDestroy(y_tmp); y_tmp = NULL; hypre_TFree(y_buf_data, HYPRE_MEMORY_HOST); return ierr; } hypre-2.33.0/src/multivector/par_csr_matmultivec.h000066400000000000000000000023531477326011500223170ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * Matvec functions for hypre_CSRMatrix class. * *****************************************************************************/ #ifndef PAR_CSR_MATMULTIVEC_HEADER #define PAR_CSR_MATMULTIVEC_HEADER #include "_hypre_parcsr_mv.h" #include "par_multivector.h" #ifdef __cplusplus extern "C" { #endif HYPRE_Int hypre_ParCSRMatrixMatMultiVec(HYPRE_Complex, hypre_ParCSRMatrix*, hypre_ParMultiVector*, HYPRE_Complex, hypre_ParMultiVector*); HYPRE_Int hypre_ParCSRMatrixMatMultiVecT(HYPRE_Complex, hypre_ParCSRMatrix*, hypre_ParMultiVector*, HYPRE_Complex, hypre_ParMultiVector*); #ifdef __cplusplus } #endif #endif /* PAR_CSR_MATMULTIVEC_HEADER */ hypre-2.33.0/src/multivector/par_csr_pmvcomm.c000066400000000000000000000136221477326011500214370ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "par_csr_pmvcomm.h" #include "_hypre_parcsr_mv.h" /*==========================================================================*/ hypre_ParCSRCommMultiHandle * hypre_ParCSRCommMultiHandleCreate (HYPRE_Int job, hypre_ParCSRCommPkg *comm_pkg, void *send_data, void *recv_data, HYPRE_Int num_vecs ) { HYPRE_Int num_sends = hypre_ParCSRCommPkgNumSends(comm_pkg); HYPRE_Int num_recvs = hypre_ParCSRCommPkgNumRecvs(comm_pkg); MPI_Comm comm = hypre_ParCSRCommPkgComm(comm_pkg); hypre_ParCSRCommMultiHandle *comm_handle; HYPRE_Int num_requests; hypre_MPI_Request *requests; HYPRE_Int i, j; HYPRE_Int my_id, num_procs; HYPRE_Int ip, vec_start, vec_len; /*-------------------------------------------------------------------- * hypre_Initialize sets up a communication handle, * posts receives and initiates sends. It always requires num_sends, * num_recvs, recv_procs and send_procs to be set in comm_pkg. * There are different options for job: * job = 1 : is used to initialize communication exchange for the parts * of vector needed to perform a Matvec, it requires send_data * and recv_data to be doubles, recv_vec_starts and * send_map_starts need to be set in comm_pkg. * job = 2 : is used to initialize communication exchange for the parts * of vector needed to perform a MatvecT, it requires send_data * and recv_data to be doubles, recv_vec_starts and * send_map_starts need to be set in comm_pkg. *--------------------------------------------------------------------*/ num_requests = num_sends + num_recvs; requests = hypre_CTAlloc(hypre_MPI_Request, num_requests, HYPRE_MEMORY_HOST); hypre_MPI_Comm_size(comm, &num_procs); hypre_MPI_Comm_rank(comm, &my_id); j = 0; switch (job) { case 1: { HYPRE_Complex *d_send_data = (HYPRE_Complex *) send_data; HYPRE_Complex *d_recv_data = (HYPRE_Complex *) recv_data; for (i = 0; i < num_recvs; i++) { ip = hypre_ParCSRCommPkgRecvProc(comm_pkg, i); vec_start = hypre_ParCSRCommPkgRecvVecStart(comm_pkg, i); vec_len = hypre_ParCSRCommPkgRecvVecStart(comm_pkg, i + 1) - vec_start; hypre_MPI_Irecv(&d_recv_data[vec_start * num_vecs], vec_len * num_vecs, HYPRE_MPI_COMPLEX, ip, 0, comm, &requests[j++]); } for (i = 0; i < num_sends; i++) { vec_start = hypre_ParCSRCommPkgSendMapStart(comm_pkg, i); vec_len = hypre_ParCSRCommPkgSendMapStart(comm_pkg, i + 1) - vec_start; ip = hypre_ParCSRCommPkgSendProc(comm_pkg, i); hypre_MPI_Isend(&d_send_data[vec_start * num_vecs], vec_len * num_vecs, HYPRE_MPI_COMPLEX, ip, 0, comm, &requests[j++]); } break; } case 2: { HYPRE_Complex *d_send_data = (HYPRE_Complex *) send_data; HYPRE_Complex *d_recv_data = (HYPRE_Complex *) recv_data; for (i = 0; i < num_sends; i++) { vec_start = hypre_ParCSRCommPkgSendMapStart(comm_pkg, i); vec_len = hypre_ParCSRCommPkgSendMapStart(comm_pkg, i + 1) - vec_start; ip = hypre_ParCSRCommPkgSendProc(comm_pkg, i); hypre_MPI_Irecv(&d_recv_data[vec_start * num_vecs], vec_len * num_vecs, HYPRE_MPI_COMPLEX, ip, 0, comm, &requests[j++]); } for (i = 0; i < num_recvs; i++) { ip = hypre_ParCSRCommPkgRecvProc(comm_pkg, i); vec_start = hypre_ParCSRCommPkgRecvVecStart(comm_pkg, i); vec_len = hypre_ParCSRCommPkgRecvVecStart(comm_pkg, i + 1) - vec_start; hypre_MPI_Isend(&d_send_data[vec_start * num_vecs], vec_len * num_vecs, HYPRE_MPI_COMPLEX, ip, 0, comm, &requests[j++]); } break; } } /*-------------------------------------------------------------------- * set up comm_handle and return *--------------------------------------------------------------------*/ comm_handle = hypre_CTAlloc(hypre_ParCSRCommMultiHandle, 1, HYPRE_MEMORY_HOST); hypre_ParCSRCommMultiHandleCommPkg(comm_handle) = comm_pkg; hypre_ParCSRCommMultiHandleSendData(comm_handle) = send_data; hypre_ParCSRCommMultiHandleRecvData(comm_handle) = recv_data; hypre_ParCSRCommMultiHandleNumRequests(comm_handle) = num_requests; hypre_ParCSRCommMultiHandleRequests(comm_handle) = requests; return (comm_handle); } HYPRE_Int hypre_ParCSRCommMultiHandleDestroy(hypre_ParCSRCommMultiHandle *comm_handle) { hypre_MPI_Status *status0; HYPRE_Int ierr = 0; if (hypre_ParCSRCommMultiHandleNumRequests(comm_handle)) { status0 = hypre_CTAlloc(hypre_MPI_Status, hypre_ParCSRCommMultiHandleNumRequests(comm_handle), HYPRE_MEMORY_HOST); hypre_MPI_Waitall(hypre_ParCSRCommMultiHandleNumRequests(comm_handle), hypre_ParCSRCommMultiHandleRequests(comm_handle), status0); hypre_TFree(status0, HYPRE_MEMORY_HOST); } hypre_TFree(hypre_ParCSRCommMultiHandleRequests(comm_handle), HYPRE_MEMORY_HOST); hypre_TFree(comm_handle, HYPRE_MEMORY_HOST); return ierr; } hypre-2.33.0/src/multivector/par_csr_pmvcomm.h000066400000000000000000000042421477326011500214420ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #ifndef HYPRE_PAR_CSR_PMVCOMM_HEADER #define HYPRE_PAR_CSR_PMVCOMM_HEADER #include "_hypre_parcsr_mv.h" #ifdef __cplusplus extern "C" { #endif /*-------------------------------------------------------------------------- * hypre_ParCSRCommMultiHandle: *--------------------------------------------------------------------------*/ typedef struct { hypre_ParCSRCommPkg *comm_pkg; void *send_data; void *recv_data; HYPRE_Int num_requests; hypre_MPI_Request *requests; } hypre_ParCSRCommMultiHandle; /*-------------------------------------------------------------------------- * Accessor macros: hypre_ParCSRCommMultiHandle *--------------------------------------------------------------------------*/ #define hypre_ParCSRCommMultiHandleCommPkg(comm_handle) (comm_handle -> comm_pkg) #define hypre_ParCSRCommMultiHandleSendData(comm_handle) (comm_handle -> send_data) #define hypre_ParCSRCommMultiHandleRecvData(comm_handle) (comm_handle -> recv_data) #define hypre_ParCSRCommMultiHandleNumRequests(comm_handle) (comm_handle -> num_requests) #define hypre_ParCSRCommMultiHandleRequests(comm_handle) (comm_handle -> requests) #define hypre_ParCSRCommMultiHandleRequest(comm_handle, i) (comm_handle -> requests[i]) hypre_ParCSRCommMultiHandle * hypre_ParCSRCommMultiHandleCreate ( HYPRE_Int job, hypre_ParCSRCommPkg *comm_pkg, void *send_data, void *recv_data, HYPRE_Int nvecs ); HYPRE_Int hypre_ParCSRCommMultiHandleDestroy(hypre_ParCSRCommMultiHandle *comm_handle); #ifdef __cplusplus } #endif #endif /* HYPRE_PAR_CSR_MULTICOMMUNICATION_HEADER */ hypre-2.33.0/src/multivector/par_multivector.c000066400000000000000000000351161477326011500214710ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include #include #include #include #include "par_multivector.h" #include "seq_multivector.h" #include "_hypre_utilities.h" /* for temporary implementation of multivectorRead, multivectorPrint */ #include "seq_mv.h" #include "_hypre_parcsr_mv.h" /*-------------------------------------------------------------------------- * hypre_ParMultiVectorCreate *--------------------------------------------------------------------------*/ hypre_ParMultiVector * hypre_ParMultiVectorCreate(MPI_Comm comm, HYPRE_Int global_size, HYPRE_Int *partitioning, HYPRE_Int num_vectors) { hypre_ParMultiVector *vector; HYPRE_Int num_procs, my_id; vector = hypre_CTAlloc(hypre_ParMultiVector, 1, HYPRE_MEMORY_HOST); hypre_MPI_Comm_rank(comm, &my_id); if (! partitioning) { hypre_MPI_Comm_size(comm, &num_procs); hypre_GeneratePartitioning(global_size, num_procs, &partitioning); } hypre_ParMultiVectorComm(vector) = comm; hypre_ParMultiVectorGlobalSize(vector) = global_size; hypre_ParMultiVectorPartitioning(vector) = partitioning; hypre_ParMultiVectorNumVectors(vector) = num_vectors; hypre_ParMultiVectorLocalVector(vector) = hypre_SeqMultivectorCreate((partitioning[my_id + 1] - partitioning[my_id]), num_vectors); hypre_ParMultiVectorFirstIndex(vector) = partitioning[my_id]; /* we set these 2 defaults exactly as in par_vector.c, although it's questionable */ hypre_ParMultiVectorOwnsData(vector) = 1; hypre_ParMultiVectorOwnsPartitioning(vector) = 1; return vector; } /*-------------------------------------------------------------------------- * hypre_ParMultiVectorDestroy *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ParMultiVectorDestroy( hypre_ParMultiVector *pm_vector ) { if (NULL != pm_vector) { if ( hypre_ParMultiVectorOwnsData(pm_vector) ) { hypre_SeqMultivectorDestroy(hypre_ParMultiVectorLocalVector(pm_vector)); } if ( hypre_ParMultiVectorOwnsPartitioning(pm_vector) ) { hypre_TFree(hypre_ParMultiVectorPartitioning(pm_vector), HYPRE_MEMORY_HOST); } hypre_TFree(pm_vector, HYPRE_MEMORY_HOST); } return 0; } /*-------------------------------------------------------------------------- * hypre_ParMultiVectorInitialize *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ParMultiVectorInitialize( hypre_ParMultiVector *pm_vector ) { HYPRE_Int ierr; ierr = hypre_SeqMultivectorInitialize( hypre_ParMultiVectorLocalVector(pm_vector)); return ierr; } /*-------------------------------------------------------------------------- * hypre_ParMultiVectorSetDataOwner *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ParMultiVectorSetDataOwner( hypre_ParMultiVector *pm_vector, HYPRE_Int owns_data ) { HYPRE_Int ierr = 0; hypre_ParMultiVectorOwnsData(pm_vector) = owns_data; return ierr; } /*-------------------------------------------------------------------------- * hypre_ParMultiVectorSetMask *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ParMultiVectorSetMask( hypre_ParMultiVector *pm_vector, HYPRE_Int *mask) { return hypre_SeqMultivectorSetMask(pm_vector->local_vector, mask); } /*-------------------------------------------------------------------------- * hypre_ParMultiVectorSetConstantValues *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ParMultiVectorSetConstantValues( hypre_ParMultiVector *v, HYPRE_Complex value ) { hypre_Multivector *v_local = hypre_ParMultiVectorLocalVector(v); return hypre_SeqMultivectorSetConstantValues(v_local, value); } /*-------------------------------------------------------------------------- * hypre_ParMultiVectorSetRandomValues *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ParMultiVectorSetRandomValues( hypre_ParMultiVector *v, HYPRE_Int seed) { HYPRE_Int my_id; hypre_Multivector *v_local = hypre_ParMultiVectorLocalVector(v); MPI_Comm comm = hypre_ParMultiVectorComm(v); hypre_MPI_Comm_rank(comm, &my_id); seed *= (my_id + 1); return hypre_SeqMultivectorSetRandomValues(v_local, seed); } /*-------------------------------------------------------------------------- * hypre_ParMultiVectorCopy *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ParMultiVectorCopy(hypre_ParMultiVector *x, hypre_ParMultiVector *y) { hypre_Multivector *x_local = hypre_ParMultiVectorLocalVector(x); hypre_Multivector *y_local = hypre_ParMultiVectorLocalVector(y); return hypre_SeqMultivectorCopy(x_local, y_local); } HYPRE_Int hypre_ParMultiVectorCopyWithoutMask(hypre_ParMultiVector *x, hypre_ParMultiVector *y) { return hypre_SeqMultivectorCopyWithoutMask(x->local_vector, y->local_vector); } /*-------------------------------------------------------------------------- * hypre_ParMultiVectorScale *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ParMultiVectorScale(HYPRE_Complex alpha, hypre_ParMultiVector *y) { return 1 ; /* hypre_SeqMultivectorScale( alpha, y_local, NULL); */ } /*-------------------------------------------------------------------------- * hypre_ParMultiVectorMultiScale *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ParMultiVectorMultiScale(HYPRE_Complex *alpha, hypre_ParMultiVector *y) { return 1; /* hypre_SeqMultivectorMultiScale(alpha, y_local, NULL); */ } /*-------------------------------------------------------------------------- * hypre_ParMultiVectorAxpy *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ParMultiVectorAxpy(HYPRE_Complex alpha, hypre_ParMultiVector *x, hypre_ParMultiVector *y) { hypre_Multivector *x_local = hypre_ParMultiVectorLocalVector(x); hypre_Multivector *y_local = hypre_ParMultiVectorLocalVector(y); return hypre_SeqMultivectorAxpy( alpha, x_local, y_local); } /*-------------------------------------------------------------------------- * hypre_ParMultiVectorByDiag *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ParMultiVectorByDiag(hypre_ParMultiVector *x, HYPRE_Int *mask, HYPRE_Int n, HYPRE_Complex *alpha, hypre_ParMultiVector *y) { return hypre_SeqMultivectorByDiag(x->local_vector, mask, n, alpha, y->local_vector); } /*-------------------------------------------------------------------------- * hypre_ParMultiVectorInnerProd *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ParMultiVectorInnerProd(hypre_ParMultiVector *x, hypre_ParMultiVector *y, HYPRE_Real *results, HYPRE_Real *workspace ) { MPI_Comm comm; HYPRE_Int count; HYPRE_Int ierr; /* * HYPRE_Int myid; * HYPRE_Int i */ /* assuming "results" and "workspace" are arrays of size ("n_active_x" by "n_active_y") n_active_x is the number of active vectors in multivector x the product "x^T * y" will be stored in "results" column-wise; workspace will be used for computation of local matrices; maybe hypre_MPI_IN_PLACE functionality will be added later */ hypre_SeqMultivectorInnerProd(x->local_vector, y->local_vector, workspace); comm = x->comm; count = (x->local_vector->num_active_vectors) * (y->local_vector->num_active_vectors); ierr = hypre_MPI_Allreduce(workspace, results, count, HYPRE_MPI_REAL, hypre_MPI_SUM, comm); hypre_assert (ierr == hypre_MPI_SUCCESS); /* debug */ /* * hypre_MPI_Comm_rank(comm, &myid); * if (myid==0) * for (i=0; ilocal_vector, y->local_vector, workspace); count = x->local_vector->num_active_vectors; ierr = hypre_MPI_Allreduce(workspace, diagResults, count, HYPRE_MPI_REAL, hypre_MPI_SUM, x->comm); hypre_assert (ierr == hypre_MPI_SUCCESS); return 0; } HYPRE_Int hypre_ParMultiVectorByMatrix(hypre_ParMultiVector *x, HYPRE_BigInt rGHeight, HYPRE_Int rHeight, HYPRE_Int rWidth, HYPRE_Complex* rVal, hypre_ParMultiVector * y) { return hypre_SeqMultivectorByMatrix(x->local_vector, rGHeight, rHeight, rWidth, rVal, y->local_vector); } HYPRE_Int hypre_ParMultiVectorXapy(hypre_ParMultiVector *x, HYPRE_BigInt rGHeight, HYPRE_Int rHeight, HYPRE_Int rWidth, HYPRE_Complex* rVal, hypre_ParMultiVector * y) { return hypre_SeqMultivectorXapy(x->local_vector, rGHeight, rHeight, rWidth, rVal, y->local_vector); } /* temporary function; allows to do "matvec" and preconditioner in vector-by-vector fashion */ HYPRE_Int hypre_ParMultiVectorEval(void (*f)( void*, void*, void* ), void* par, hypre_ParMultiVector * x, hypre_ParMultiVector * y) { hypre_ParVector *temp_x, *temp_y; HYPRE_Int i; HYPRE_Int num_active_vectors; HYPRE_Int *x_active_indices, *y_active_indices; HYPRE_Complex * x_data, *y_data; HYPRE_Int size; hypre_assert(x->local_vector->num_active_vectors == y->local_vector->num_active_vectors); hypre_assert(x->local_vector->size == y->local_vector->size); temp_x = hypre_ParVectorCreate(x->comm, x->global_size, x->partitioning); hypre_assert(temp_x != NULL); temp_x->local_vector->owns_data = 0; temp_x->local_vector->vecstride = temp_x->local_vector->size; temp_x->local_vector->idxstride = 1; /* no initialization for temp_x needed! */ temp_y = hypre_ParVectorCreate(y->comm, y->global_size, y->partitioning); hypre_assert(temp_y != NULL); temp_y->local_vector->owns_data = 0; temp_y->local_vector->vecstride = temp_y->local_vector->size; temp_y->local_vector->idxstride = 1; /* no initialization for temp_y needed! */ num_active_vectors = x->local_vector->num_active_vectors; x_active_indices = x->local_vector->active_indices; y_active_indices = y->local_vector->active_indices; x_data = x->local_vector->data; y_data = y->local_vector->data; size = x->local_vector->size; for ( i = 0; i < num_active_vectors; i++ ) { temp_x->local_vector->data = x_data + x_active_indices[i] * size; temp_y->local_vector->data = y_data + y_active_indices[i] * size; /*** here i make an assumption that "f" will treat temp_x and temp_y like "hypre_ParVector *" variables ***/ f( par, temp_x, temp_y ); } hypre_ParVectorDestroy(temp_x); hypre_ParVectorDestroy(temp_y); /* 2 lines above won't free data or partitioning */ return 0; } hypre_ParMultiVector * hypre_ParMultiVectorTempRead(MPI_Comm comm, const char *fileName) /* ***** temporary implementation ****** */ { HYPRE_Int i, n, id; HYPRE_Complex * dest; HYPRE_Complex * src; HYPRE_Int count; HYPRE_Int retcode; char temp_string[128]; hypre_ParMultiVector * x; hypre_ParVector * temp_vec; /* calculate the number of files */ hypre_MPI_Comm_rank( comm, &id ); n = 0; do { hypre_sprintf( temp_string, "test -f %s.%d.%d", fileName, n, id ); if (!(retcode = system(temp_string))) /* zero retcode mean file exists */ { n++; } } while (!retcode); if ( n == 0 ) { return NULL; } /* now read the first vector using hypre_ParVectorRead into temp_vec */ hypre_sprintf(temp_string, "%s.%d", fileName, 0); temp_vec = hypre_ParVectorRead(comm, temp_string); /* now create multivector using temp_vec as a sample */ x = hypre_ParMultiVectorCreate(hypre_ParVectorComm(temp_vec), hypre_ParVectorGlobalSize(temp_vec), hypre_ParVectorPartitioning(temp_vec), n); hypre_ParMultiVectorInitialize(x); /* read data from first and all other vectors into "x" */ i = 0; do { /* copy data from current vector */ dest = x->local_vector->data + i * (x->local_vector->size); src = temp_vec->local_vector->data; count = temp_vec->local_vector->size; hypre_TMemcpy(dest, src, HYPRE_Complex, count, HYPRE_MEMORY_HOST, HYPRE_MEMORY_HOST); /* destroy current vector */ hypre_ParVectorDestroy(temp_vec); /* read the data to new current vector, if there are more vectors to read */ if (i < n - 1) { hypre_sprintf(temp_string, "%s.%d", fileName, i + 1); temp_vec = hypre_ParVectorRead(comm, temp_string); } } while (++i < n); return x; } HYPRE_Int hypre_ParMultiVectorTempPrint(hypre_ParMultiVector *vector, const char *fileName) { HYPRE_Int i, ierr; char fullName[128]; hypre_ParVector * temp_vec; hypre_assert( vector != NULL ); temp_vec = hypre_ParVectorCreate(vector->comm, vector->global_size, vector->partitioning); hypre_assert(temp_vec != NULL); temp_vec->local_vector->owns_data = 0; /* no initialization for temp_vec needed! */ ierr = 0; for ( i = 0; i < vector->local_vector->num_vectors; i++ ) { hypre_sprintf( fullName, "%s.%d", fileName, i ); temp_vec->local_vector->data = vector->local_vector->data + i * vector->local_vector->size; ierr = ierr || hypre_ParVectorPrint(temp_vec, fullName); } ierr = ierr || hypre_ParVectorDestroy(temp_vec); /* line above won't free data or partitioning */ return ierr; } hypre-2.33.0/src/multivector/par_multivector.h000066400000000000000000000121351477326011500214720ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * Header info for Parallel Vector data structure * *****************************************************************************/ #ifndef hypre_PAR_MULTIVECTOR_HEADER #define hypre_PAR_MULTIVECTOR_HEADER #include "_hypre_utilities.h" #include "seq_Multivector.h" #ifdef __cplusplus extern "C" { #endif /*-------------------------------------------------------------------------- * hypre_ParMultiVector *--------------------------------------------------------------------------*/ typedef struct { MPI_Comm comm; HYPRE_Int global_size; HYPRE_Int first_index; HYPRE_Int *partitioning; HYPRE_Int owns_data; HYPRE_Int num_vectors; hypre_Multivector *local_vector; /* using mask on "parallel" level seems to be inconvenient, so i (IL) moved it to "sequential" level. Also i now store it as a number of active indices and an array of active indices. hypre_ParMultiVectorSetMask converts user-provided "(1,1,0,1,...)" mask to the format above. HYPRE_Int *mask; */ } hypre_ParMultivector; /*-------------------------------------------------------------------------- * Accessor macros for the Vector structure; * kinda strange macros; right hand side looks much convenient than left..... *--------------------------------------------------------------------------*/ #define hypre_ParMultiVectorComm(vector) ((vector) -> comm) #define hypre_ParMultiVectorGlobalSize(vector) ((vector) -> global_size) #define hypre_ParMultiVectorFirstIndex(vector) ((vector) -> first_index) #define hypre_ParMultiVectorPartitioning(vector) ((vector) -> partitioning) #define hypre_ParMultiVectorLocalVector(vector) ((vector) -> local_vector) #define hypre_ParMultiVectorOwnsData(vector) ((vector) -> owns_data) #define hypre_ParMultiVectorNumVectors(vector) ((vector) -> num_vectors) /* field "mask" moved to "sequential" level, see structure above #define hypre_ParMultiVectorMask(vector) ((vector) -> mask) */ /* function prototypes for working with hypre_ParMultiVector */ hypre_ParMultiVector *hypre_ParMultiVectorCreate(MPI_Comm, HYPRE_Int, HYPRE_Int *, HYPRE_Int); HYPRE_Int hypre_ParMultiVectorDestroy(hypre_ParMultiVector *); HYPRE_Int hypre_ParMultiVectorInitialize(hypre_ParMultiVector *); HYPRE_Int hypre_ParMultiVectorSetDataOwner(hypre_ParMultiVector *, HYPRE_Int); HYPRE_Int hypre_ParMultiVectorSetMask(hypre_ParMultiVector *, HYPRE_Int *); HYPRE_Int hypre_ParMultiVectorSetConstantValues(hypre_ParMultiVector *, HYPRE_Complex); HYPRE_Int hypre_ParMultiVectorSetRandomValues(hypre_ParMultiVector *, HYPRE_Int); HYPRE_Int hypre_ParMultiVectorCopy(hypre_ParMultiVector *, hypre_ParMultiVector *); HYPRE_Int hypre_ParMultiVectorScale(HYPRE_Complex, hypre_ParMultiVector *); HYPRE_Int hypre_ParMultiVectorMultiScale(HYPRE_Complex *, hypre_ParMultiVector *); HYPRE_Int hypre_ParMultiVectorAxpy(HYPRE_Complex, hypre_ParMultiVector *, hypre_ParMultiVector *); HYPRE_Int hypre_ParMultiVectorByDiag( hypre_ParMultiVector *x, HYPRE_Int *mask, HYPRE_Int n, HYPRE_Complex *alpha, hypre_ParMultiVector *y); HYPRE_Int hypre_ParMultiVectorInnerProd(hypre_ParMultiVector *, hypre_ParMultiVector *, HYPRE_Real *, HYPRE_Real *); HYPRE_Int hypre_ParMultiVectorInnerProdDiag(hypre_ParMultiVector *, hypre_ParMultiVector *, HYPRE_Real *, HYPRE_Real *); HYPRE_Int hypre_ParMultiVectorCopyWithoutMask(hypre_ParMultiVector *x, hypre_ParMultiVector *y); HYPRE_Int hypre_ParMultiVectorByMatrix(hypre_ParMultiVector *x, HYPRE_BigInt rGHeight, HYPRE_Int rHeight, HYPRE_Int rWidth, HYPRE_Complex* rVal, hypre_ParMultiVector * y); HYPRE_Int hypre_ParMultiVectorXapy(hypre_ParMultiVector *x, HYPRE_BigInt rGHeight, HYPRE_Int rHeight, HYPRE_Int rWidth, HYPRE_Complex* rVal, hypre_ParMultiVector * y); HYPRE_Int hypre_ParMultiVectorEval(void (*f)( void*, void*, void* ), void* par, hypre_ParMultiVector * x, hypre_ParMultiVector * y); /* to be replaced by better implementation when format for multivector files established */ hypre_ParMultiVector * hypre_ParMultiVectorTempRead(MPI_Comm comm, const char *file_name); HYPRE_Int hypre_ParMultiVectorTempPrint(hypre_ParMultiVector *vector, const char *file_name); #ifdef __cplusplus } #endif #endif /* hypre_PAR_MULTIVECTOR_HEADER */ hypre-2.33.0/src/multivector/seq_multivector.c000066400000000000000000000405501477326011500214750ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * Member functions for hypre_Vector class. * *****************************************************************************/ #include "seq_multivector.h" #include "_hypre_utilities.h" #include #include /*-------------------------------------------------------------------------- * hypre_SeqMultivectorCreate *--------------------------------------------------------------------------*/ hypre_Multivector * hypre_SeqMultivectorCreate( HYPRE_Int size, HYPRE_Int num_vectors ) { hypre_Multivector *mvector; mvector = hypre_TAlloc(hypre_Multivector, 1, HYPRE_MEMORY_HOST); hypre_MultivectorNumVectors(mvector) = num_vectors; hypre_MultivectorSize(mvector) = size; hypre_MultivectorOwnsData(mvector) = 1; hypre_MultivectorData(mvector) = NULL; mvector->num_active_vectors = 0; mvector->active_indices = NULL; return mvector; } /*-------------------------------------------------------------------------- * hypre_SeqMultivectorInitialize *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SeqMultivectorInitialize( hypre_Multivector *mvector ) { HYPRE_Int ierr = 0, i, size, num_vectors; size = hypre_MultivectorSize(mvector); num_vectors = hypre_MultivectorNumVectors(mvector); if (NULL == hypre_MultivectorData(mvector)) hypre_MultivectorData(mvector) = hypre_TAlloc(HYPRE_Complex, size * num_vectors, HYPRE_MEMORY_HOST); /* now we create a "mask" of "active" vectors; initially all active */ if (NULL == mvector->active_indices) { mvector->active_indices hypre_CTAlloc(HYPRE_Int, num_vectors, HYPRE_MEMORY_HOST); for (i = 0; i < num_vectors; i++) { mvector->active_indices[i] = i; } mvector->num_active_vectors = num_vectors; } return ierr; } /*-------------------------------------------------------------------------- * hypre_SeqMultivectorSetDataOwner *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SeqMultivectorSetDataOwner(hypre_Multivector *mvector, HYPRE_Int owns_data) { HYPRE_Int ierr = 0; hypre_MultivectorOwnsData(mvector) = owns_data; return ierr; } /*-------------------------------------------------------------------------- * hypre_SeqMultivectorDestroy *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SeqMultivectorDestroy(hypre_Multivector *mvector) { HYPRE_Int ierr = 0; if (NULL != mvector) { if (hypre_MultivectorOwnsData(mvector) && NULL != hypre_MultivectorData(mvector)) { hypre_TFree( hypre_MultivectorData(mvector), HYPRE_MEMORY_HOST); } if (NULL != mvector->active_indices) { hypre_TFree(mvector->active_indices, HYPRE_MEMORY_HOST); } hypre_TFree(mvector, HYPRE_MEMORY_HOST); } return ierr; } /*-------------------------------------------------------------------------- * hypre_SeqMultivectorSetMask * (this routine accepts mask in "zeros and ones format, and converts it to the one used in the structure "hypre_Multivector") *-------------------------------------------------------------------------*/ HYPRE_Int hypre_SeqMultivectorSetMask(hypre_Multivector *mvector, HYPRE_Int * mask) { HYPRE_Int i, num_vectors = mvector->num_vectors; if (mvector->active_indices != NULL) { hypre_TFree(mvector->active_indices, HYPRE_MEMORY_HOST); } mvector->active_indices hypre_CTAlloc(HYPRE_Int, num_vectors, HYPRE_MEMORY_HOST); mvector->num_active_vectors = 0; if (mask != NULL) for (i = 0; i < num_vectors; i++) { if ( mask[i] ) { mvector->active_indices[mvector->num_active_vectors++] = i; } } else for (i = 0; i < num_vectors; i++) { mvector->active_indices[mvector->num_active_vectors++] = i; } return 0; } /*-------------------------------------------------------------------------- * hypre_SeqMultivectorSetConstantValues *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SeqMultivectorSetConstantValues(hypre_Multivector *v, HYPRE_Complex value) { HYPRE_Int i, j, start_offset, end_offset; HYPRE_Int size = hypre_MultivectorSize(v); HYPRE_Complex *vector_data = hypre_MultivectorData(v); if (v->num_active_vectors == v->num_vectors) { #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(j) HYPRE_SMP_SCHEDULE #endif for (j = 0; j < v->num_vectors * size; j++) { vector_data[j] = value; } } else { for (i = 0; i < v->num_active_vectors; i++) { start_offset = v->active_indices[i] * size; end_offset = start_offset + size; #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(j) HYPRE_SMP_SCHEDULE #endif for (j = start_offset; j < end_offset; j++) { vector_data[j] = value; } } } return 0; } /*-------------------------------------------------------------------------- * hypre_SeqMultivectorSetRandomValues * * returns vector of values randomly distributed between -1.0 and +1.0 *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SeqMultivectorSetRandomValues(hypre_Multivector *v, HYPRE_Int seed) { HYPRE_Int i, j, start_offset, end_offset; HYPRE_Int size = hypre_MultivectorSize(v); HYPRE_Complex *vector_data = hypre_MultivectorData(v); hypre_SeedRand(seed); /* comment from vector.c: RDF: threading this loop may cause problems because of hypre_Rand() */ if (v->num_active_vectors == v->num_vectors) { for (j = 0; j < v->num_vectors * size; j++) { vector_data[j] = 2.0 * hypre_Rand() - 1.0; } } else { for (i = 0; i < v->num_active_vectors; i++) { start_offset = v->active_indices[i] * size; end_offset = start_offset + size; for (j = start_offset; j < end_offset; j++) { vector_data[j] = 2.0 * hypre_Rand() - 1.0; } } } return 0; } /*-------------------------------------------------------------------------- * hypre_SeqMultivectorCopy * copies data from x to y * y should have already been initialized at the same size as x *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SeqMultivectorCopy(hypre_Multivector *x, hypre_Multivector *y) { HYPRE_Int i, size, num_bytes, num_active_vectors, *x_active_ind, * y_active_ind; HYPRE_Complex *x_data, *y_data, *dest, * src; hypre_assert (x->size == y->size && x->num_active_vectors == y->num_active_vectors); num_active_vectors = x->num_active_vectors; size = x->size; x_data = x->data; y_data = y->data; x_active_ind = x->active_indices; y_active_ind = y->active_indices; if (x->num_active_vectors == x->num_vectors && y->num_active_vectors == y->num_vectors) { num_bytes = x->num_vectors * size; hypre_TMemcpy(y_data, x_data, HYPRE_Complex, num_bytes, HYPRE_MEMORY_HOST, HYPRE_MEMORY_HOST); } else { num_bytes = size; for (i = 0; i < num_active_vectors; i++) { src = x_data + size * x_active_ind[i]; dest = y_data + size * y_active_ind[i]; hypre_TMemcpy(dest, src, HYPRE_Complex, num_bytes, HYPRE_MEMORY_HOST, HYPRE_MEMORY_HOST); } } return 0; } HYPRE_Int hypre_SeqMultivectorCopyWithoutMask(hypre_Multivector *x, hypre_Multivector *y) { HYPRE_Int byte_count; hypre_assert (x->size == y->size && x->num_vectors == y->num_vectors); byte_count = x->size * x->num_vectors; hypre_TMemcpy(y->data, x->data, HYPRE_Complex, byte_count, HYPRE_MEMORY_HOST, HYPRE_MEMORY_HOST); return 0; } /*-------------------------------------------------------------------------- * hypre_SeqMultivectorAxpy *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SeqMultivectorAxpy(HYPRE_Complex alpha, hypre_Multivector *x, hypre_Multivector *y) { HYPRE_Int i, j, size, num_active_vectors, *x_active_ind, *y_active_ind; HYPRE_Complex *x_data, *y_data, *src, *dest; hypre_assert (x->size == y->size && x->num_active_vectors == y->num_active_vectors); x_data = x->data; y_data = y->data; size = x->size; num_active_vectors = x->num_active_vectors; x_active_ind = x->active_indices; y_active_ind = y->active_indices; if (x->num_active_vectors == x->num_vectors && y->num_active_vectors == y->num_vectors) { for (i = 0; i < x->num_vectors * size; i++) { dest[i] += alpha * src[i]; } } else { for (i = 0; i < num_active_vectors; i++) { src = x_data + x_active_ind[i] * size; dest = y_data + y_active_ind[i] * size; #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(j) HYPRE_SMP_SCHEDULE #endif for (j = 0; j < size; j++) { dest[j] += alpha * src[j]; } } } return 0; } /*-------------------------------------------------------------------------- * hypre_SeqMultivectorByDiag: " y() = alpha() .* x() " *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SeqMultivectorByDiag(hypre_Multivector *x, HYPRE_Int *mask, HYPRE_Int n, HYPRE_Complex *alpha, hypre_Multivector *y) { HYPRE_Int i, j, size, num_active_vectors, *x_active_ind, *y_active_ind; HYPRE_Int *al_active_ind, num_active_als; HYPRE_Complex *x_data, *y_data, *dest, *src, current_alpha; hypre_assert (x->size == y->size && x->num_active_vectors == y->num_active_vectors); /* build list of active indices in alpha */ al_active_ind = hypre_TAlloc(HYPRE_Int, n, HYPRE_MEMORY_HOST); num_active_als = 0; if (mask != NULL) for (i = 0; i < n; i++) { if (mask[i]) { al_active_ind[num_active_als++] = i; } } else for (i = 0; i < n; i++) { al_active_ind[num_active_als++] = i; } hypre_assert (num_active_als == x->num_active_vectors); x_data = x->data; y_data = y->data; size = x->size; num_active_vectors = x->num_active_vectors; x_active_ind = x->active_indices; y_active_ind = y->active_indices; for (i = 0; i < num_active_vectors; i++) { src = x_data + x_active_ind[i] * size; dest = y_data + y_active_ind[i] * size; current_alpha = alpha[ al_active_ind[i] ]; #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(j) HYPRE_SMP_SCHEDULE #endif for (j = 0; j < size; j++) { dest[j] = current_alpha * src[j]; } } hypre_TFree(al_active_ind, HYPRE_MEMORY_HOST); return 0; } /*-------------------------------------------------------------------------- * hypre_SeqMultivectorInnerProd *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SeqMultivectorInnerProd(hypre_Multivector *x, hypre_Multivector *y, HYPRE_Real *results ) { HYPRE_Int i, j, k, size, *x_active_ind, *y_active_ind; HYPRE_Int x_num_active_vectors, y_num_active_vectors; HYPRE_Complex *x_data, *y_data, *y_ptr, *x_ptr; HYPRE_Real current_product; hypre_assert (x->size == y->size); x_data = x->data; y_data = y->data; size = x->size; x_num_active_vectors = x->num_active_vectors; y_num_active_vectors = y->num_active_vectors; /* we assume that "results" points to contiguous array of (x_num_active_vectors X y_num_active_vectors) doubles */ x_active_ind = x->active_indices; y_active_ind = y->active_indices; for (j = 0; j < y_num_active_vectors; j++) { y_ptr = y_data + y_active_ind[j] * size; for (i = 0; i < x_num_active_vectors; i++) { x_ptr = x_data + x_active_ind[i] * size; current_product = 0.0; #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(k) reduction(+:current_product) HYPRE_SMP_SCHEDULE #endif for (k = 0; k < size; k++) { current_product += x_ptr[k] * hypre_conj(y_ptr[k]); } /* column-wise storage for results */ *results++ = current_product; } } return 0; } /*-------------------------------------------------------------------------- * hypre_SeqMultivectorInnerProdDiag *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SeqMultivectorInnerProdDiag(hypre_Multivector *x, hypre_Multivector *y, HYPRE_Real *diagResults) { HYPRE_Complex *x_data, *y_data, *y_ptr, *x_ptr; HYPRE_Real current_product; HYPRE_Int i, k, size, num_active_vectors, *x_active_ind, *y_active_ind; hypre_assert(x->size == y->size && x->num_active_vectors == y->num_active_vectors); x_data = x->data; y_data = y->data; size = x->size; num_active_vectors = x->num_active_vectors; x_active_ind = x->active_indices; y_active_ind = y->active_indices; for (i = 0; i < num_active_vectors; i++) { x_ptr = x_data + x_active_ind[i] * size; y_ptr = y_data + y_active_ind[i] * size; current_product = 0.0; #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(k) reduction(+:current_product) HYPRE_SMP_SCHEDULE #endif for (k = 0; k < size; k++) { current_product += x_ptr[k] * hypre_conj(y_ptr[k]); } *diagResults++ = current_product; } return 0; } HYPRE_Int hypre_SeqMultivectorByMatrix(hypre_Multivector *x, HYPRE_BigInt rGHeight, HYPRE_Int rHeight, HYPRE_Int rWidth, HYPRE_Complex* rVal, hypre_Multivector *y) { HYPRE_Complex *x_data, *y_data, *x_ptr, *y_ptr, current_coef; HYPRE_Int i, j, k, size, *x_active_ind, *y_active_ind; HYPRE_BigInt gap; hypre_assert(rHeight > 0); hypre_assert(rHeight == x->num_active_vectors && rWidth == y->num_active_vectors); x_data = x->data; y_data = y->data; size = x->size; x_active_ind = x->active_indices; y_active_ind = y->active_indices; gap = rGHeight - (HYPRE_BigInt) rHeight; for (j = 0; j < rWidth; j++) { y_ptr = y_data + y_active_ind[j] * size; /* ------ set current "y" to first member in a sum ------ */ x_ptr = x_data + x_active_ind[0] * size; current_coef = *rVal++; #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(k) HYPRE_SMP_SCHEDULE #endif for (k = 0; k < size; k++) { y_ptr[k] = current_coef * x_ptr[k]; } /* ------ now add all other members of a sum to "y" ----- */ for (i = 1; i < rHeight; i++) { x_ptr = x_data + x_active_ind[i] * size; current_coef = *rVal++; #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(k) HYPRE_SMP_SCHEDULE #endif for (k = 0; k < size; k++) { y_ptr[k] += current_coef * x_ptr[k]; } } rVal += gap; } return 0; } HYPRE_Int hypre_SeqMultivectorXapy (hypre_Multivector *x, HYPRE_BigInt rGHeight, HYPRE_Int rHeight, HYPRE_Int rWidth, HYPRE_Complex* rVal, hypre_Multivector *y) { HYPRE_Complex *x_data, *y_data, *x_ptr, *y_ptr, current_coef; HYPRE_Int i, j, k, size, *x_active_ind, *y_active_ind; HYPRE_BigInt gap; hypre_assert(rHeight == x->num_active_vectors && rWidth == y->num_active_vectors); x_data = x->data; y_data = y->data; size = x->size; x_active_ind = x->active_indices; y_active_ind = y->active_indices; gap = rGHeight - (HYPRE_BigInt) rHeight; for (j = 0; j < rWidth; j++) { y_ptr = y_data + y_active_ind[j] * size; for (i = 0; i < rHeight; i++) { x_ptr = x_data + x_active_ind[i] * size; current_coef = *rVal++; #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(k) HYPRE_SMP_SCHEDULE #endif for (k = 0; k < size; k++) { y_ptr[k] += current_coef * x_ptr[k]; } } rVal += gap; } return 0; } hypre-2.33.0/src/multivector/seq_multivector.h000066400000000000000000000076361477326011500215120ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * Header info for Multivector data structure * *****************************************************************************/ #ifndef hypre_MULTIVECTOR_HEADER #define hypre_MULTIVECTOR_HEADER #ifdef __cplusplus extern "C" { #endif /*-------------------------------------------------------------------------- * hypre_Multivector *--------------------------------------------------------------------------*/ typedef struct { HYPRE_Complex *data; HYPRE_Int size; HYPRE_Int owns_data; HYPRE_Int num_vectors; /* the above "size" is size of one vector */ HYPRE_Int num_active_vectors; HYPRE_Int *active_indices; /* indices of active vectors; 0-based notation */ } hypre_Multivector; /*-------------------------------------------------------------------------- * Accessor functions for the Multivector structure *--------------------------------------------------------------------------*/ #define hypre_MultivectorData(vector) ((vector) -> data) #define hypre_MultivectorSize(vector) ((vector) -> size) #define hypre_MultivectorOwnsData(vector) ((vector) -> owns_data) #define hypre_MultivectorNumVectors(vector) ((vector) -> num_vectors) hypre_Multivector * hypre_SeqMultivectorCreate(HYPRE_Int size, HYPRE_Int num_vectors); hypre_Multivector *hypre_SeqMultivectorRead(char *file_name); HYPRE_Int hypre_SeqMultivectorDestroy(hypre_Multivector *vector); HYPRE_Int hypre_SeqMultivectorInitialize(hypre_Multivector *vector); HYPRE_Int hypre_SeqMultivectorSetDataOwner(hypre_Multivector *vector, HYPRE_Int owns_data); HYPRE_Int hypre_SeqMultivectorPrint(hypre_Multivector *vector, char *file_name); HYPRE_Int hypre_SeqMultivectorSetConstantValues(hypre_Multivector *v, HYPRE_Complex value); HYPRE_Int hypre_SeqMultivectorSetRandomValues(hypre_Multivector *v, HYPRE_Int seed); HYPRE_Int hypre_SeqMultivectorCopy(hypre_Multivector *x, hypre_Multivector *y); HYPRE_Int hypre_SeqMultivectorScale(HYPRE_Complex alpha, hypre_Multivector *y, HYPRE_Int *mask); HYPRE_Int hypre_SeqMultivectorAxpy(HYPRE_Complex alpha, hypre_Multivector *x, hypre_Multivector *y); HYPRE_Int hypre_SeqMultivectorInnerProd(hypre_Multivector *x, hypre_Multivector *y, HYPRE_Real *results); HYPRE_Int hypre_SeqMultivectorMultiScale(HYPRE_Complex *alpha, hypre_Multivector *v, HYPRE_Int *mask); HYPRE_Int hypre_SeqMultivectorByDiag(hypre_Multivector *x, HYPRE_Int *mask, HYPRE_Int n, HYPRE_Complex *alpha, hypre_Multivector *y); HYPRE_Int hypre_SeqMultivectorInnerProdDiag(hypre_Multivector *x, hypre_Multivector *y, HYPRE_Real *diagResults ); HYPRE_Int hypre_SeqMultivectorSetMask(hypre_Multivector *mvector, HYPRE_Int * mask); HYPRE_Int hypre_SeqMultivectorCopyWithoutMask(hypre_Multivector *x, hypre_Multivector *y); HYPRE_Int hypre_SeqMultivectorByMatrix(hypre_Multivector *x, HYPRE_BigInt rGHeight, HYPRE_Int rHeight, HYPRE_Int rWidth, HYPRE_Complex* rVal, hypre_Multivector *y); HYPRE_Int hypre_SeqMultivectorXapy (hypre_Multivector *x, HYPRE_BigInt rGHeight, HYPRE_Int rHeight, HYPRE_Int rWidth, HYPRE_Complex* rVal, hypre_Multivector *y); #ifdef __cplusplus } #endif #endif /* hypre_MULTIVECTOR_HEADER */ hypre-2.33.0/src/multivector/temp_multivector.c000066400000000000000000000324471477326011500216600ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include #include #include "temp_multivector.h" #include "interpreter.h" #include "_hypre_utilities.h" static void mv_collectVectorPtr( HYPRE_Int* mask, mv_TempMultiVector* x, void** px ) { HYPRE_Int ix, jx; if ( mask != NULL ) { for ( ix = 0, jx = 0; ix < x->numVectors; ix++ ) if ( mask[ix] ) { px[jx++] = x->vector[ix]; } } else for ( ix = 0; ix < x->numVectors; ix++ ) { px[ix] = x->vector[ix]; } } static HYPRE_Int aux_maskCount( HYPRE_Int n, HYPRE_Int* mask ) { HYPRE_Int i, m; if ( mask == NULL ) { return n; } for ( i = m = 0; i < n; i++ ) if ( mask[i] ) { m++; } return m; } static void aux_indexFromMask( HYPRE_Int n, HYPRE_Int* mask, HYPRE_Int* index ) { HYPRE_Int i, j; if ( mask != NULL ) { for ( i = 0, j = 0; i < n; i++ ) if ( mask[i] ) { index[j++] = i + 1; } } else for ( i = 0; i < n; i++ ) { index[i] = i + 1; } } /* ------- here goes simple random number generator --------- */ static hypre_ulongint next = 1; /* RAND_MAX assumed to be 32767 */ static HYPRE_Int myrand(void) { next = next * 1103515245 + 12345; return ((unsigned)(next / 65536) % 32768); } static void mysrand(unsigned seed) { next = seed; } void* mv_TempMultiVectorCreateFromSampleVector( void* ii_, HYPRE_Int n, void* sample ) { HYPRE_Int i; mv_TempMultiVector* x; mv_InterfaceInterpreter* ii = (mv_InterfaceInterpreter*)ii_; x = hypre_TAlloc(mv_TempMultiVector, 1, HYPRE_MEMORY_HOST); hypre_assert( x != NULL ); x->interpreter = ii; x->numVectors = n; x->vector = hypre_CTAlloc(void*, n, HYPRE_MEMORY_HOST); hypre_assert( x->vector != NULL ); x->ownsVectors = 1; x->mask = NULL; x->ownsMask = 0; for ( i = 0; i < n; i++ ) { x->vector[i] = (ii->CreateVector)(sample); } return x; } void* mv_TempMultiVectorCreateCopy( void* src_, HYPRE_Int copyValues ) { HYPRE_Int i, n; mv_TempMultiVector* src; mv_TempMultiVector* dest; src = (mv_TempMultiVector*)src_; hypre_assert( src != NULL ); n = src->numVectors; dest = (mv_TempMultiVector*)mv_TempMultiVectorCreateFromSampleVector( src->interpreter, n, src->vector[0] ); if ( copyValues ) for ( i = 0; i < n; i++ ) { (dest->interpreter->CopyVector)(src->vector[i], dest->vector[i]); } return dest; } void mv_TempMultiVectorDestroy( void* x_ ) { HYPRE_Int i; mv_TempMultiVector* x = (mv_TempMultiVector*)x_; if ( x == NULL ) { return; } if ( x->ownsVectors && x->vector != NULL ) { for ( i = 0; i < x->numVectors; i++ ) { (x->interpreter->DestroyVector)(x->vector[i]); } hypre_TFree(x->vector, HYPRE_MEMORY_HOST); } if ( x->mask && x->ownsMask ) { hypre_TFree(x->mask, HYPRE_MEMORY_HOST); } hypre_TFree(x, HYPRE_MEMORY_HOST); } HYPRE_Int mv_TempMultiVectorWidth( void* x_ ) { mv_TempMultiVector* x = (mv_TempMultiVector*)x_; if ( x == NULL ) { return 0; } return x->numVectors; } HYPRE_Int mv_TempMultiVectorHeight( void* x_ ) { mv_TempMultiVector* x = (mv_TempMultiVector*)x_; if ( x == NULL ) { return 0; } return (x->interpreter->VectorSize)(x->vector[0]); } /* this shallow copy of the mask is convenient but not safe; a proper copy should be considered */ void mv_TempMultiVectorSetMask( void* x_, HYPRE_Int* mask ) { mv_TempMultiVector* x = (mv_TempMultiVector*)x_; hypre_assert( x != NULL ); x->mask = mask; x->ownsMask = 0; } void mv_TempMultiVectorClear( void* x_ ) { HYPRE_Int i; mv_TempMultiVector* x = (mv_TempMultiVector*)x_; hypre_assert( x != NULL ); for ( i = 0; i < x->numVectors; i++ ) if ( x->mask == NULL || (x->mask)[i] ) { (x->interpreter->ClearVector)(x->vector[i]); } } void mv_TempMultiVectorSetRandom( void* x_, HYPRE_Int seed ) { HYPRE_Int i; mv_TempMultiVector* x = (mv_TempMultiVector*)x_; hypre_assert( x != NULL ); mysrand(seed); for ( i = 0; i < x->numVectors; i++ ) { if ( x->mask == NULL || (x->mask)[i] ) { seed = myrand(); (x->interpreter->SetRandomValues)(x->vector[i], seed); } } } void mv_TempMultiVectorCopy( void* src_, void* dest_ ) { HYPRE_Int i, ms, md; void** ps; void** pd; mv_TempMultiVector* src = (mv_TempMultiVector*)src_; mv_TempMultiVector* dest = (mv_TempMultiVector*)dest_; hypre_assert( src != NULL && dest != NULL ); ms = aux_maskCount( src->numVectors, src->mask ); md = aux_maskCount( dest->numVectors, dest->mask ); hypre_assert( ms == md ); ps = hypre_CTAlloc(void*, ms, HYPRE_MEMORY_HOST); hypre_assert( ps != NULL ); pd = hypre_CTAlloc(void*, md, HYPRE_MEMORY_HOST); hypre_assert( pd != NULL ); mv_collectVectorPtr( src->mask, src, ps ); mv_collectVectorPtr( dest->mask, dest, pd ); for ( i = 0; i < ms; i++ ) { (src->interpreter->CopyVector)(ps[i], pd[i]); } hypre_TFree(ps, HYPRE_MEMORY_HOST); hypre_TFree(pd, HYPRE_MEMORY_HOST); } void mv_TempMultiVectorAxpy( HYPRE_Complex a, void* x_, void* y_ ) { HYPRE_Int i, mx, my; void** px; void** py; mv_TempMultiVector* x; mv_TempMultiVector* y; x = (mv_TempMultiVector*)x_; y = (mv_TempMultiVector*)y_; hypre_assert( x != NULL && y != NULL ); mx = aux_maskCount( x->numVectors, x->mask ); my = aux_maskCount( y->numVectors, y->mask ); hypre_assert( mx == my ); px = hypre_CTAlloc(void*, mx, HYPRE_MEMORY_HOST); hypre_assert( px != NULL ); py = hypre_CTAlloc(void*, my, HYPRE_MEMORY_HOST); hypre_assert( py != NULL ); mv_collectVectorPtr( x->mask, x, px ); mv_collectVectorPtr( y->mask, y, py ); for ( i = 0; i < mx; i++ ) { (x->interpreter->Axpy)(a, px[i], py[i]); } hypre_TFree(px, HYPRE_MEMORY_HOST); hypre_TFree(py, HYPRE_MEMORY_HOST); } void mv_TempMultiVectorByMultiVector( void* x_, void* y_, HYPRE_BigInt xyGHeight, HYPRE_Int xyHeight, HYPRE_Int xyWidth, HYPRE_Complex* xyVal ) { /* xy = x'*y */ HYPRE_Int ix, iy, mx, my; HYPRE_BigInt jxy; HYPRE_Complex* p; void** px; void** py; mv_TempMultiVector* x; mv_TempMultiVector* y; x = (mv_TempMultiVector*)x_; y = (mv_TempMultiVector*)y_; hypre_assert( x != NULL && y != NULL ); mx = aux_maskCount( x->numVectors, x->mask ); hypre_assert( mx == xyHeight ); my = aux_maskCount( y->numVectors, y->mask ); hypre_assert( my == xyWidth ); px = hypre_CTAlloc(void*, mx, HYPRE_MEMORY_HOST); hypre_assert( px != NULL ); py = hypre_CTAlloc(void*, my, HYPRE_MEMORY_HOST); hypre_assert( py != NULL ); mv_collectVectorPtr( x->mask, x, px ); mv_collectVectorPtr( y->mask, y, py ); jxy = xyGHeight - (HYPRE_BigInt) xyHeight; for ( iy = 0, p = xyVal; iy < my; iy++ ) { for ( ix = 0; ix < mx; ix++, p++ ) { *p = (x->interpreter->InnerProd)(px[ix], py[iy]); } p += jxy; } hypre_TFree(px, HYPRE_MEMORY_HOST); hypre_TFree(py, HYPRE_MEMORY_HOST); } void mv_TempMultiVectorByMultiVectorDiag( void* x_, void* y_, HYPRE_Int* mask, HYPRE_Int n, HYPRE_Complex* diag ) { /* diag = diag(x'*y) */ HYPRE_Int i, mx, my, m; void** px; void** py; HYPRE_Int* index; mv_TempMultiVector* x; mv_TempMultiVector* y; x = (mv_TempMultiVector*)x_; y = (mv_TempMultiVector*)y_; hypre_assert( x != NULL && y != NULL ); mx = aux_maskCount( x->numVectors, x->mask ); my = aux_maskCount( y->numVectors, y->mask ); m = aux_maskCount( n, mask ); hypre_assert( mx == my && mx == m ); px = hypre_CTAlloc(void*, mx, HYPRE_MEMORY_HOST); hypre_assert( px != NULL ); py = hypre_CTAlloc(void*, my, HYPRE_MEMORY_HOST); hypre_assert( py != NULL ); mv_collectVectorPtr( x->mask, x, px ); mv_collectVectorPtr( y->mask, y, py ); index = hypre_CTAlloc(HYPRE_Int, m, HYPRE_MEMORY_HOST); aux_indexFromMask( n, mask, index ); for ( i = 0; i < m; i++ ) { *(diag + index[i] - 1) = (x->interpreter->InnerProd)(px[i], py[i]); } hypre_TFree(index, HYPRE_MEMORY_HOST); hypre_TFree(px, HYPRE_MEMORY_HOST); hypre_TFree(py, HYPRE_MEMORY_HOST); } void mv_TempMultiVectorByMatrix( void* x_, HYPRE_BigInt rGHeight, HYPRE_Int rHeight, HYPRE_Int rWidth, HYPRE_Complex* rVal, void* y_ ) { HYPRE_Int i, j; HYPRE_BigInt jump; HYPRE_Int mx, my; HYPRE_Complex* p; void** px; void** py; mv_TempMultiVector* x; mv_TempMultiVector* y; x = (mv_TempMultiVector*)x_; y = (mv_TempMultiVector*)y_; hypre_assert( x != NULL && y != NULL ); mx = aux_maskCount( x->numVectors, x->mask ); my = aux_maskCount( y->numVectors, y->mask ); hypre_assert( mx == rHeight && my == rWidth ); px = hypre_CTAlloc(void*, mx, HYPRE_MEMORY_HOST); hypre_assert( px != NULL ); py = hypre_CTAlloc(void*, my, HYPRE_MEMORY_HOST); hypre_assert( py != NULL ); mv_collectVectorPtr( x->mask, x, px ); mv_collectVectorPtr( y->mask, y, py ); jump = rGHeight - (HYPRE_BigInt) rHeight; for ( j = 0, p = rVal; j < my; j++ ) { (x->interpreter->ClearVector)( py[j] ); for ( i = 0; i < mx; i++, p++ ) { (x->interpreter->Axpy)(*p, px[i], py[j]); } p += jump; } hypre_TFree(px, HYPRE_MEMORY_HOST); hypre_TFree(py, HYPRE_MEMORY_HOST); } void mv_TempMultiVectorXapy( void* x_, HYPRE_BigInt rGHeight, HYPRE_Int rHeight, HYPRE_Int rWidth, HYPRE_Complex* rVal, void* y_ ) { HYPRE_Int i, j; HYPRE_BigInt jump; HYPRE_Int mx, my; HYPRE_Complex* p; void** px; void** py; mv_TempMultiVector* x; mv_TempMultiVector* y; x = (mv_TempMultiVector*)x_; y = (mv_TempMultiVector*)y_; hypre_assert( x != NULL && y != NULL ); mx = aux_maskCount( x->numVectors, x->mask ); my = aux_maskCount( y->numVectors, y->mask ); hypre_assert( mx == rHeight && my == rWidth ); px = hypre_CTAlloc(void*, mx, HYPRE_MEMORY_HOST); hypre_assert( px != NULL ); py = hypre_CTAlloc(void*, my, HYPRE_MEMORY_HOST); hypre_assert( py != NULL ); mv_collectVectorPtr( x->mask, x, px ); mv_collectVectorPtr( y->mask, y, py ); jump = rGHeight - (HYPRE_BigInt) rHeight; for ( j = 0, p = rVal; j < my; j++ ) { for ( i = 0; i < mx; i++, p++ ) { (x->interpreter->Axpy)(*p, px[i], py[j]); } p += jump; } hypre_TFree(px, HYPRE_MEMORY_HOST); hypre_TFree(py, HYPRE_MEMORY_HOST); } void mv_TempMultiVectorByDiagonal( void* x_, HYPRE_Int* mask, HYPRE_Int n, HYPRE_Complex* diag, void* y_ ) { HYPRE_Int j; HYPRE_Int mx, my, m; void** px; void** py; HYPRE_Int* index; mv_TempMultiVector* x; mv_TempMultiVector* y; x = (mv_TempMultiVector*)x_; y = (mv_TempMultiVector*)y_; hypre_assert( x != NULL && y != NULL ); mx = aux_maskCount( x->numVectors, x->mask ); my = aux_maskCount( y->numVectors, y->mask ); m = aux_maskCount( n, mask ); hypre_assert( mx == m && my == m ); if ( m < 1 ) { return; } px = hypre_CTAlloc(void*, mx, HYPRE_MEMORY_HOST); hypre_assert( px != NULL ); py = hypre_CTAlloc(void*, my, HYPRE_MEMORY_HOST); hypre_assert( py != NULL ); index = hypre_CTAlloc(HYPRE_Int, m, HYPRE_MEMORY_HOST); aux_indexFromMask( n, mask, index ); mv_collectVectorPtr( x->mask, x, px ); mv_collectVectorPtr( y->mask, y, py ); for ( j = 0; j < my; j++ ) { (x->interpreter->ClearVector)(py[j]); (x->interpreter->Axpy)(diag[index[j] - 1], px[j], py[j]); } hypre_TFree(px, HYPRE_MEMORY_HOST); hypre_TFree(py, HYPRE_MEMORY_HOST); hypre_TFree( index, HYPRE_MEMORY_HOST); } void mv_TempMultiVectorEval( void (*f)( void*, void*, void* ), void* par, void* x_, void* y_ ) { HYPRE_Int i, mx, my; void** px; void** py; mv_TempMultiVector* x; mv_TempMultiVector* y; x = (mv_TempMultiVector*)x_; y = (mv_TempMultiVector*)y_; hypre_assert( x != NULL && y != NULL ); if ( f == NULL ) { mv_TempMultiVectorCopy( x, y ); return; } mx = aux_maskCount( x->numVectors, x->mask ); my = aux_maskCount( y->numVectors, y->mask ); hypre_assert( mx == my ); px = hypre_CTAlloc(void*, mx, HYPRE_MEMORY_HOST); hypre_assert( px != NULL ); py = hypre_CTAlloc(void*, my, HYPRE_MEMORY_HOST); hypre_assert( py != NULL ); mv_collectVectorPtr( x->mask, x, px ); mv_collectVectorPtr( y->mask, y, py ); for ( i = 0; i < mx; i++ ) { f( par, (void*)px[i], (void*)py[i] ); } hypre_TFree(px, HYPRE_MEMORY_HOST); hypre_TFree(py, HYPRE_MEMORY_HOST); } hypre-2.33.0/src/multivector/temp_multivector.h000066400000000000000000000101201477326011500216450ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #ifndef TEMPORARY_MULTIVECTOR_FUNCTION_PROTOTYPES #define TEMPORARY_MULTIVECTOR_FUNCTION_PROTOTYPES #include "interpreter.h" typedef struct { HYPRE_Int numVectors; HYPRE_Int* mask; void** vector; HYPRE_Int ownsVectors; HYPRE_Int ownsMask; mv_InterfaceInterpreter* interpreter; } mv_TempMultiVector; /*typedef struct mv_TempMultiVector* mv_TempMultiVectorPtr; */ typedef mv_TempMultiVector* mv_TempMultiVectorPtr; /*******************************************************************/ /* The above is a temporary implementation of the hypre_MultiVector data type, just to get things going with LOBPCG eigensolver. A more proper implementation would be to define hypre_MultiParVector, hypre_MultiStructVector and hypre_MultiSStructVector by adding a new record HYPRE_Int numVectors; in hypre_ParVector, hypre_StructVector and hypre_SStructVector, and increasing the size of data numVectors times. Respective modifications of most vector operations are straightforward (it is strongly suggested that BLAS routines are used wherever possible), efficient implementation of matrix-by-multivector multiplication may be more difficult. With the above implementation of hypre vectors, the definition of hypre_MultiVector becomes simply (cf. multivector.h) typedef struct { void* multiVector; HYPRE_InterfaceInterpreter* interpreter; } hypre_MultiVector; with pointers to abstract multivector functions added to the structure HYPRE_InterfaceInterpreter (cf. HYPRE_interpreter.h; particular values are assigned to these pointers by functions HYPRE_ParCSRSetupInterpreter, HYPRE_StructSetupInterpreter and HYPRE_Int HYPRE_SStructSetupInterpreter), and the abstract multivector functions become simply interfaces to the actual multivector functions of the form (cf. multivector.c): void hypre_MultiVectorCopy( hypre_MultiVectorPtr src_, hypre_MultiVectorPtr dest_ ) { hypre_MultiVector* src = (hypre_MultiVector*)src_; hypre_MultiVector* dest = (hypre_MultiVector*)dest_; hypre_assert( src != NULL && dest != NULL ); (src->interpreter->CopyMultiVector)( src->data, dest->data ); } */ /*********************************************************************/ #ifdef __cplusplus extern "C" { #endif void* mv_TempMultiVectorCreateFromSampleVector( void*, HYPRE_Int n, void* sample ); void* mv_TempMultiVectorCreateCopy( void*, HYPRE_Int copyValues ); void mv_TempMultiVectorDestroy( void* ); HYPRE_Int mv_TempMultiVectorWidth( void* v ); HYPRE_Int mv_TempMultiVectorHeight( void* v ); void mv_TempMultiVectorSetMask( void* v, HYPRE_Int* mask ); void mv_TempMultiVectorClear( void* ); void mv_TempMultiVectorSetRandom( void* v, HYPRE_Int seed ); void mv_TempMultiVectorCopy( void* src, void* dest ); void mv_TempMultiVectorAxpy( HYPRE_Complex, void*, void* ); void mv_TempMultiVectorByMultiVector( void*, void*, HYPRE_BigInt gh, HYPRE_Int h, HYPRE_Int w, HYPRE_Complex* v ); void mv_TempMultiVectorByMultiVectorDiag( void* x, void* y, HYPRE_Int* mask, HYPRE_Int n, HYPRE_Complex* diag ); void mv_TempMultiVectorByMatrix( void*, HYPRE_BigInt gh, HYPRE_Int h, HYPRE_Int w, HYPRE_Complex* v, void* ); void mv_TempMultiVectorXapy( void* x, HYPRE_BigInt gh, HYPRE_Int h, HYPRE_Int w, HYPRE_Complex* v, void* y ); void mv_TempMultiVectorByDiagonal( void* x, HYPRE_Int* mask, HYPRE_Int n, HYPRE_Complex* diag, void* y ); void mv_TempMultiVectorEval( void (*f)( void*, void*, void* ), void* par, void* x, void* y ); #ifdef __cplusplus } #endif #endif /* MULTIVECTOR_FUNCTION_PROTOTYPES */ hypre-2.33.0/src/nopoe000077500000000000000000000035331477326011500145750ustar00rootroot00000000000000#!/usr/bin/ksh # Wrapper script to set up environment so the arguments run a 1 task # mpi run on the local node. Essentially runs ip over ethernet with # resd=no and a hostfile (containing the local machine name) # # Written by John C. Gyllenhaal at LLNL 6/25/02 # Print usage if [ $# -lt 1 ]; then echo "Usage: nopoe executable [args]"; echo " " echo " Runs executable with args in an environment where any mpi programs" echo " executed will be run on the local host with 1 task." exit 1; fi # Get current hostname MY_HOSTNAME=`hostname` # Create hostname file using this name and pid HOSTLIST=hostlist.$MY_HOSTNAME.$$ # Put 1 line of this hostname into HOSTCONTENTS HOSTCONTENTS="$MY_HOSTNAME" rm -f $HOSTLIST echo $HOSTCONTENTS > $HOSTLIST # SET MP_ variables to run locally on this host # IP mode needed if not using switch export MP_EUILIB=ip # Unset EUIDEVICE, defaults to ethernet which is correct and prevents warning unset MP_EUIDEVICE export MP_EUIDEVICE # Override user's environment to make one task unset MP_TASKS_PER_NODE export MP_TASKS_PER_NODE export MP_NODES=1 export MP_PROCS=1 # Don't talk to poe (cannot use switch in this case) export MP_RESD=NO # Don't reserve node (may not be necessary) export MP_CPU_USE=multiple # Run on this node (needed if not using poe) export MP_HOSTFILE=$HOSTLIST # Suppress message about RMPOOL being ignored unset MP_RMPOOL export MP_RMPOOL # Required for slurm on AIX unset MP_RMLIB export MP_RMLIB # Suppress AIX 5.3 message stating # mp_euilib is not us, high priority daemon has been started unset MP_PRIORITY export MP_PRIORITY # Turn of 0: prefix for output export MP_LABELIO=NO # Ignore batch script configuration (if any) unset LOADLBATCH export LOADLBATCH # Run the command with its arguments and get its return value "$@" RETVAL=$? # Remove hostlist rm -f $HOSTLIST exit $RETVAL; hypre-2.33.0/src/parcsr_block_mv/000077500000000000000000000000001477326011500166715ustar00rootroot00000000000000hypre-2.33.0/src/parcsr_block_mv/CMakeLists.txt000066400000000000000000000012521477326011500214310ustar00rootroot00000000000000# Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) set(HDRS par_csr_block_matrix.h csr_block_matrix.h ) set(SRCS csr_block_matrix.c csr_block_matvec.c par_csr_block_matrix.c par_csr_block_matvec.c par_csr_block_comm.c par_csr_block_rap.c par_csr_block_rap_communication.c par_csr_block_interp.c par_csr_block_relax.c par_block_nodal_systems.c ) target_sources(${PROJECT_NAME} PRIVATE ${SRCS} ${HDRS} ) convert_filenames_to_full_paths(HDRS) set(HYPRE_HEADERS ${HYPRE_HEADERS} ${HDRS} PARENT_SCOPE) hypre-2.33.0/src/parcsr_block_mv/Makefile000066400000000000000000000066111477326011500203350ustar00rootroot00000000000000# Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) include ../config/Makefile.config CINCLUDES = ${INCLUDES} ${MPIINCLUDE} C_COMPILE_FLAGS = \ -I..\ -I$(srcdir)\ -I$(srcdir)/..\ -I$(srcdir)/../utilities\ -I$(srcdir)/../multivector\ -I$(srcdir)/../seq_mv\ -I$(srcdir)/../seq_block_mv\ -I$(srcdir)/../parcsr_mv\ -I$(srcdir)/../parcsr_ls\ -I$(srcdir)/../IJ_mv\ -I$(srcdir)/../krylov\ $(SUPERLU_INCLUDE)\ $(DSUPERLU_INCLUDE)\ ${CINCLUDES} LFLAGS = \ -L. -lHYPRE_parcsr_block_mv -L../hypre/lib -lHYPRE_krylov \ -lHYPRE_parcsr_ls -lHYPRE_ParaSails -lHYPRE_Euclid \ -lHYPRE_DistributedMatrixPilutSolver -lHYPRE_IJ_mv \ -lHYPRE_parcsr_mv -lHYPRE_seq_mv -lHYPRE_DistributedMatrix \ -lHYPRE_MatrixMatrix -lHYPRE_utilities -lm # -L. -lHYPRE_parcsr_block_mv -L../hypre/lib -lHYPRE_LSI -lHYPRE_superlu -lm HEADERS =\ csr_block_matrix.h\ par_csr_block_matrix.h FILES =\ csr_block_matrix.c\ csr_block_matvec.c\ par_csr_block_matrix.c\ par_csr_block_matvec.c\ par_csr_block_comm.c\ par_csr_block_rap.c\ par_csr_block_rap_communication.c\ par_csr_block_interp.c\ par_csr_block_relax.c\ par_block_nodal_systems.c EXTRA_FILES = DRIVER_FILES = OBJS = ${FILES:.c=.o} DRIVER_OBJS = ${DRIVER_FILES:.c=.o} SONAME = libHYPRE_parcsr_block_mv-${HYPRE_RELEASE_VERSION}${HYPRE_LIB_SUFFIX} ################################################################## # Targets ################################################################## all: libHYPRE_parcsr_block_mv${HYPRE_LIB_SUFFIX} cp -fR $(srcdir)/par_csr_block_matrix.h $(HYPRE_BUILD_DIR)/include cp -fR $(srcdir)/csr_block_matrix.h $(HYPRE_BUILD_DIR)/include # cp -fR libHYPRE_* $(HYPRE_BUILD_DIR)/lib/. driver: driver.o libHYPRE_parcsr_block_mv${HYPRE_LIB_SUFFIX} @echo "Linking" $@ "... " ${CC} -o driver driver.o ${LFLAGS} driver_matvec: driver_matvec.o @echo "Linking" $@ "... " ${CC} -o driver_matvec driver_matvec.o ${LFLAGS} driver_matmul: driver_matmul.o libHYPRE_parcsr_mv${HYPRE_LIB_SUFFIX} @echo "Linking" $@ "... " ${CC} -o driver_matmul driver_matmul.o ${LFLAGS} driver_boolmatmul: driver_boolmatmul.o libHYPRE_parcsr_mv${HYPRE_LIB_SUFFIX} @echo "Linking" $@ "... " ${CC} -o driver_boolmatmul driver_boolmatmul.o ${LFLAGS} driver_aat: driver_aat.o libHYPRE_parcsr_mv${HYPRE_LIB_SUFFIX} @echo "Linking" $@ "... " ${CC} -o driver_aat driver_aat.o ${LFLAGS} driver_boolaat: driver_boolaat.o libHYPRE_parcsr_mv${HYPRE_LIB_SUFFIX} @echo "Linking" $@ "... " ${CC} -o driver_boolaat driver_boolaat.o ${LFLAGS} install: libHYPRE_parcsr_block_mv${HYPRE_LIB_SUFFIX} cp -fR $(srcdir)/par_csr_block_matrix.h $(HYPRE_INC_INSTALL)/. cp -fR $(srcdir)/csr_block_matrix.h $(HYPRE_INC_INSTALL)/. # cp -fR libHYPRE_* $(HYPRE_LIB_INSTALL)/. clean: rm -rf *.o libHYPRE_* rm -f driver driver_matvec driver_matmul distclean: clean ################################################################## # Rules ################################################################## libHYPRE_parcsr_block_mv.a: ${OBJS} @echo "Building $@ ... " ${AR} $@ ${OBJS} ${RANLIB} $@ libHYPRE_parcsr_block_mv.so libHYPRE_parcsr_block_mv.dylib: ${OBJS} @echo "Building $@ ... " ${BUILD_CC_SHARED} -o ${SONAME} ${OBJS} ${SHARED_SET_SONAME}${SONAME} ln -s -f ${SONAME} $@ ${OBJS}: ${HEADERS} ${DRIVER_OBJS}: ${HEADERS} hypre-2.33.0/src/parcsr_block_mv/_hypre_parcsr_block_mv.h000066400000000000000000000010021477326011500235470ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include #include #include #include "csr_block_matrix.h" #include "par_csr_block_matrix.h" #include "_hypre_parcsr_ls.h" hypre-2.33.0/src/parcsr_block_mv/csr_block_matop.c000066400000000000000000000175721477326011500222120ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * Matrix operation functions for hypre_CSRMatrix class. * *****************************************************************************/ /*-------------------------------------------------------------------------- * hypre_CSRMatrixAdd: * adds two CSR Matrices A and B and returns a CSR Matrix C; * Note: The routine does not check for 0-elements which might be generated * through cancellation of elements in A and B or already contained in A and B. To remove those, use hypre_CSRMatrixDeleteZeros *--------------------------------------------------------------------------*/ hypre_CSRBlockMatrix * hypre_CSRBlockMatrixAdd(hypre_CSRBlockMatrix *A, hypre_CSRBlockMatrix *B) { HYPRE_Complex *A_data = hypre_CSRMatrixData(A); HYPRE_Int *A_i = hypre_CSRMatrixI(A); HYPRE_Int *A_j = hypre_CSRMatrixJ(A); HYPRE_Int nrows_A = hypre_CSRMatrixNumRows(A); HYPRE_Int ncols_A = hypre_CSRMatrixNumCols(A); HYPRE_Complex *B_data = hypre_CSRMatrixData(B); HYPRE_Int *B_i = hypre_CSRMatrixI(B); HYPRE_Int *B_j = hypre_CSRMatrixJ(B); HYPRE_Int nrows_B = hypre_CSRMatrixNumRows(B); HYPRE_Int ncols_B = hypre_CSRMatrixNumCols(B); hypre_CSRMatrix *C; HYPRE_Complex *C_data; HYPRE_Int *C_i; HYPRE_Int *C_j; HYPRE_Int block_size = hypre_CSRBlockMatrixBlockSize(A); HYPRE_Int block_sizeB = hypre_CSRBlockMatrixBlockSize(B); HYPRE_Int ia, ib, ic, ii, jcol, num_nonzeros, bnnz; HYPRE_Int pos; HYPRE_Int *marker; if (nrows_A != nrows_B || ncols_A != ncols_B) { hypre_printf("Warning! incompatible matrix dimensions!\n"); return NULL; } if (block_size != block_sizeB) { hypre_printf("Warning! incompatible matrix block size!\n"); return NULL; } bnnz = block_size * block_size; marker = hypre_CTAlloc(HYPRE_Int, ncols_A, HYPRE_MEMORY_HOST); C_i = hypre_CTAlloc(HYPRE_Int, nrows_A + 1, HYPRE_MEMORY_HOST); for (ia = 0; ia < ncols_A; ia++) { marker[ia] = -1; } num_nonzeros = 0; C_i[0] = 0; for (ic = 0; ic < nrows_A; ic++) { for (ia = A_i[ic]; ia < A_i[ic + 1]; ia++) { jcol = A_j[ia]; marker[jcol] = ic; num_nonzeros++; } for (ib = B_i[ic]; ib < B_i[ic + 1]; ib++) { jcol = B_j[ib]; if (marker[jcol] != ic) { marker[jcol] = ic; num_nonzeros++; } } C_i[ic + 1] = num_nonzeros; } C = hypre_CSRBlockMatrixCreate(block_size, nrows_A, ncols_A, num_nonzeros); hypre_CSRMatrixI(C) = C_i; hypre_CSRMatrixInitialize(C); C_j = hypre_CSRMatrixJ(C); C_data = hypre_CSRMatrixData(C); for (ia = 0; ia < ncols_A; ia++) { marker[ia] = -1; } pos = 0; for (ic = 0; ic < nrows_A; ic++) { for (ia = A_i[ic]; ia < A_i[ic + 1]; ia++) { jcol = A_j[ia]; C_j[pos] = jcol; for (ii = 0; ii < bnnz; ii++) { C_data[pos * bnnz + ii] = A_data[ia * bnnz + ii]; } marker[jcol] = pos; pos++; } for (ib = B_i[ic]; ib < B_i[ic + 1]; ib++) { jcol = B_j[ib]; if (marker[jcol] < C_i[ic]) { C_j[pos] = jcol; for (ii = 0; ii < bnnz; ii++) { C_data[pos * bnnz + ii] = B_data[ib * bnnz + ii]; } marker[jcol] = pos; pos++; } else { for (ii = 0; ii < bnnz; ii++) { C_data[marker[jcol]*bnnz + ii] = B_data[ib * bnnz + ii]; } } } } hypre_TFree(marker, HYPRE_MEMORY_HOST); return C; } /*-------------------------------------------------------------------------- * hypre_CSRMatrixMultiply * multiplies two CSR Matrices A and B and returns a CSR Matrix C; * Note: The routine does not check for 0-elements which might be generated * through cancellation of elements in A and B or already contained in A and B. To remove those, use hypre_CSRMatrixDeleteZeros *--------------------------------------------------------------------------*/ hypre_CSRBlockMatrix * hypre_CSRBlockMatrixMultiply(hypre_CSRBlockMatrix *A, hypre_CSRBlockMatrix *B) { HYPRE_Complex *A_data = hypre_CSRMatrixData(A); HYPRE_Int *A_i = hypre_CSRMatrixI(A); HYPRE_Int *A_j = hypre_CSRMatrixJ(A); HYPRE_Int nrows_A = hypre_CSRMatrixNumRows(A); HYPRE_Int ncols_A = hypre_CSRMatrixNumCols(A); HYPRE_Int block_size = hypre_CSRBlockMatrixBlockSize(A); HYPRE_Complex *B_data = hypre_CSRMatrixData(B); HYPRE_Int *B_i = hypre_CSRMatrixI(B); HYPRE_Int *B_j = hypre_CSRMatrixJ(B); HYPRE_Int nrows_B = hypre_CSRMatrixNumRows(B); HYPRE_Int ncols_B = hypre_CSRMatrixNumCols(B); HYPRE_Int block_sizeB = hypre_CSRBlockMatrixBlockSize(B); hypre_CSRMatrix *C; HYPRE_Complex *C_data; HYPRE_Int *C_i; HYPRE_Int *C_j; HYPRE_Int ia, ib, ic, ja, jb, num_nonzeros = 0, bnnz; HYPRE_Int row_start, counter; HYPRE_Complex *a_entries, *b_entries, *c_entries, dzero = 0.0, done = 1.0; HYPRE_Int *B_marker; if (ncols_A != nrows_B) { hypre_printf("Warning! incompatible matrix dimensions!\n"); return NULL; } if (block_size != block_sizeB) { hypre_printf("Warning! incompatible matrix block size!\n"); return NULL; } bnnz = block_size * block_size; B_marker = hypre_CTAlloc(HYPRE_Int, ncols_B, HYPRE_MEMORY_HOST); C_i = hypre_CTAlloc(HYPRE_Int, nrows_A + 1, HYPRE_MEMORY_HOST); for (ib = 0; ib < ncols_B; ib++) { B_marker[ib] = -1; } for (ic = 0; ic < nrows_A; ic++) { for (ia = A_i[ic]; ia < A_i[ic + 1]; ia++) { ja = A_j[ia]; for (ib = B_i[ja]; ib < B_i[ja + 1]; ib++) { jb = B_j[ib]; if (B_marker[jb] != ic) { B_marker[jb] = ic; num_nonzeros++; } } } C_i[ic + 1] = num_nonzeros; } C = hypre_CSRBlockMatrixCreate(block_size, nrows_A, ncols_B, num_nonzeros); hypre_CSRMatrixI(C) = C_i; hypre_CSRMatrixInitialize(C); C_j = hypre_CSRMatrixJ(C); C_data = hypre_CSRMatrixData(C); for (ib = 0; ib < ncols_B; ib++) { B_marker[ib] = -1; } counter = 0; for (ic = 0; ic < nrows_A; ic++) { row_start = C_i[ic]; for (ia = A_i[ic]; ia < A_i[ic + 1]; ia++) { ja = A_j[ia]; a_entries = &(A_data[ia * bnnz]); for (ib = B_i[ja]; ib < B_i[ja + 1]; ib++) { jb = B_j[ib]; b_entries = &(B_data[ib * bnnz]); if (B_marker[jb] < row_start) { B_marker[jb] = counter; C_j[B_marker[jb]] = jb; c_entries = &(C_data[B_marker[jb] * bnnz]); hypre_CSRBlockMatrixBlockMultAdd(a_entries, b_entries, dzero, c_entries, block_size); counter++; } else { c_entries = &(C_data[B_marker[jb] * bnnz]); hypre_CSRBlockMatrixBlockMultAdd(a_entries, b_entries, done, c_entries, block_size); } } } } hypre_TFree(B_marker, HYPRE_MEMORY_HOST); return C; } hypre-2.33.0/src/parcsr_block_mv/csr_block_matrix.c000066400000000000000000001451751477326011500223770ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * Member functions for hypre_CSRBlockMatrix class. * *****************************************************************************/ #include "_hypre_parcsr_block_mv.h" #define LB_VERSION 0 /*-------------------------------------------------------------------------- * hypre_CSRBlockMatrixCreate *--------------------------------------------------------------------------*/ hypre_CSRBlockMatrix * hypre_CSRBlockMatrixCreate(HYPRE_Int block_size, HYPRE_Int num_rows, HYPRE_Int num_cols, HYPRE_Int num_nonzeros) { hypre_CSRBlockMatrix *matrix; matrix = hypre_CTAlloc(hypre_CSRBlockMatrix, 1, HYPRE_MEMORY_HOST); hypre_CSRBlockMatrixData(matrix) = NULL; hypre_CSRBlockMatrixI(matrix) = NULL; hypre_CSRBlockMatrixJ(matrix) = NULL; hypre_CSRBlockMatrixBigJ(matrix) = NULL; hypre_CSRBlockMatrixBlockSize(matrix) = block_size; hypre_CSRBlockMatrixNumRows(matrix) = num_rows; hypre_CSRBlockMatrixNumCols(matrix) = num_cols; hypre_CSRBlockMatrixNumNonzeros(matrix) = num_nonzeros; /* set defaults */ hypre_CSRBlockMatrixOwnsData(matrix) = 1; return matrix; } /*-------------------------------------------------------------------------- * hypre_CSRBlockMatrixDestroy *--------------------------------------------------------------------------*/ HYPRE_Int hypre_CSRBlockMatrixDestroy(hypre_CSRBlockMatrix *matrix) { HYPRE_Int ierr = 0; if (matrix) { hypre_TFree(hypre_CSRBlockMatrixI(matrix), HYPRE_MEMORY_HOST); if ( hypre_CSRBlockMatrixOwnsData(matrix) ) { hypre_TFree(hypre_CSRBlockMatrixData(matrix), HYPRE_MEMORY_HOST); hypre_TFree(hypre_CSRBlockMatrixJ(matrix), HYPRE_MEMORY_HOST); hypre_TFree(hypre_CSRBlockMatrixBigJ(matrix), HYPRE_MEMORY_HOST); } hypre_TFree(matrix, HYPRE_MEMORY_HOST); } return ierr; } /*-------------------------------------------------------------------------- * hypre_CSRBlockMatrixInitialize *--------------------------------------------------------------------------*/ HYPRE_Int hypre_CSRBlockMatrixInitialize(hypre_CSRBlockMatrix *matrix) { HYPRE_Int block_size = hypre_CSRBlockMatrixBlockSize(matrix); HYPRE_Int num_rows = hypre_CSRBlockMatrixNumRows(matrix); HYPRE_Int num_nonzeros = hypre_CSRBlockMatrixNumNonzeros(matrix); HYPRE_Int ierr = 0, nnz; if ( ! hypre_CSRBlockMatrixI(matrix) ) { hypre_TFree(hypre_CSRBlockMatrixI(matrix), HYPRE_MEMORY_HOST); } if ( ! hypre_CSRBlockMatrixJ(matrix) ) { hypre_TFree(hypre_CSRBlockMatrixJ(matrix), HYPRE_MEMORY_HOST); } if ( ! hypre_CSRBlockMatrixBigJ(matrix) ) { hypre_TFree(hypre_CSRBlockMatrixBigJ(matrix), HYPRE_MEMORY_HOST); } if ( ! hypre_CSRBlockMatrixData(matrix) ) { hypre_TFree(hypre_CSRBlockMatrixData(matrix), HYPRE_MEMORY_HOST); } nnz = num_nonzeros * block_size * block_size; hypre_CSRBlockMatrixI(matrix) = hypre_CTAlloc(HYPRE_Int, num_rows + 1, HYPRE_MEMORY_HOST); if (nnz) { hypre_CSRBlockMatrixData(matrix) = hypre_CTAlloc(HYPRE_Complex, nnz, HYPRE_MEMORY_HOST); } else { hypre_CSRBlockMatrixData(matrix) = NULL; } if (nnz) { hypre_CSRBlockMatrixJ(matrix) = hypre_CTAlloc(HYPRE_Int, num_nonzeros, HYPRE_MEMORY_HOST); } else { hypre_CSRBlockMatrixJ(matrix) = NULL; } return ierr; } /*-------------------------------------------------------------------------- * hypre_CSRBlockMatrixBigInitialize *--------------------------------------------------------------------------*/ HYPRE_Int hypre_CSRBlockMatrixBigInitialize(hypre_CSRBlockMatrix *matrix) { HYPRE_Int block_size = hypre_CSRBlockMatrixBlockSize(matrix); HYPRE_Int num_rows = hypre_CSRBlockMatrixNumRows(matrix); HYPRE_Int num_nonzeros = hypre_CSRBlockMatrixNumNonzeros(matrix); HYPRE_Int ierr = 0, nnz; if ( ! hypre_CSRBlockMatrixI(matrix) ) { hypre_TFree(hypre_CSRBlockMatrixI(matrix), HYPRE_MEMORY_HOST); } if ( ! hypre_CSRBlockMatrixJ(matrix) ) { hypre_TFree(hypre_CSRBlockMatrixJ(matrix), HYPRE_MEMORY_HOST); } if ( ! hypre_CSRBlockMatrixBigJ(matrix) ) { hypre_TFree(hypre_CSRBlockMatrixBigJ(matrix), HYPRE_MEMORY_HOST); } if ( ! hypre_CSRBlockMatrixData(matrix) ) { hypre_TFree(hypre_CSRBlockMatrixData(matrix), HYPRE_MEMORY_HOST); } nnz = num_nonzeros * block_size * block_size; hypre_CSRBlockMatrixI(matrix) = hypre_CTAlloc(HYPRE_Int, num_rows + 1, HYPRE_MEMORY_HOST); if (nnz) { hypre_CSRBlockMatrixData(matrix) = hypre_CTAlloc(HYPRE_Complex, nnz, HYPRE_MEMORY_HOST); } else { hypre_CSRBlockMatrixData(matrix) = NULL; } if (nnz) { hypre_CSRBlockMatrixBigJ(matrix) = hypre_CTAlloc(HYPRE_BigInt, num_nonzeros, HYPRE_MEMORY_HOST); } else { hypre_CSRBlockMatrixJ(matrix) = NULL; } return ierr; } /*-------------------------------------------------------------------------- * hypre_CSRBlockMatrixSetDataOwner *--------------------------------------------------------------------------*/ HYPRE_Int hypre_CSRBlockMatrixSetDataOwner(hypre_CSRBlockMatrix *matrix, HYPRE_Int owns_data) { HYPRE_Int ierr = 0; hypre_CSRBlockMatrixOwnsData(matrix) = owns_data; return ierr; } /*-------------------------------------------------------------------------- * hypre_CSRBlockMatrixCompress *--------------------------------------------------------------------------*/ hypre_CSRMatrix * hypre_CSRBlockMatrixCompress(hypre_CSRBlockMatrix *matrix) { HYPRE_Int block_size = hypre_CSRBlockMatrixBlockSize(matrix); HYPRE_Int num_rows = hypre_CSRBlockMatrixNumRows(matrix); HYPRE_Int num_cols = hypre_CSRBlockMatrixNumCols(matrix); HYPRE_Int num_nonzeros = hypre_CSRBlockMatrixNumNonzeros(matrix); HYPRE_Int *matrix_i = hypre_CSRBlockMatrixI(matrix); HYPRE_Int *matrix_j = hypre_CSRBlockMatrixJ(matrix); HYPRE_Complex *matrix_data = hypre_CSRBlockMatrixData(matrix); hypre_CSRMatrix* matrix_C; HYPRE_Int *matrix_C_i, *matrix_C_j, i, j, bnnz; HYPRE_Complex *matrix_C_data, ddata; matrix_C = hypre_CSRMatrixCreate(num_rows, num_cols, num_nonzeros); hypre_CSRMatrixInitialize(matrix_C); matrix_C_i = hypre_CSRMatrixI(matrix_C); matrix_C_j = hypre_CSRMatrixJ(matrix_C); matrix_C_data = hypre_CSRMatrixData(matrix_C); bnnz = block_size * block_size; for (i = 0; i < num_rows + 1; i++) { matrix_C_i[i] = matrix_i[i]; } for (i = 0; i < num_nonzeros; i++) { matrix_C_j[i] = matrix_j[i]; ddata = 0.0; for (j = 0; j < bnnz; j++) { ddata += matrix_data[i * bnnz + j] * matrix_data[i * bnnz + j]; } matrix_C_data[i] = hypre_sqrt(ddata); } return matrix_C; } /*-------------------------------------------------------------------------- * hypre_CSRBlockMatrixConvertToCSRMatrix *--------------------------------------------------------------------------*/ hypre_CSRMatrix * hypre_CSRBlockMatrixConvertToCSRMatrix( hypre_CSRBlockMatrix *matrix ) { HYPRE_Int block_size = hypre_CSRBlockMatrixBlockSize(matrix); HYPRE_Int num_rows = hypre_CSRBlockMatrixNumRows(matrix); HYPRE_Int num_cols = hypre_CSRBlockMatrixNumCols(matrix); HYPRE_Int num_nonzeros = hypre_CSRBlockMatrixNumNonzeros(matrix); HYPRE_Int *matrix_i = hypre_CSRBlockMatrixI(matrix); HYPRE_Int *matrix_j = hypre_CSRBlockMatrixJ(matrix); HYPRE_Complex* matrix_data = hypre_CSRBlockMatrixData(matrix); hypre_CSRMatrix* matrix_C; HYPRE_Int i, j, k, ii, C_ii, bnnz, new_nrows, new_ncols, new_num_nonzeros; HYPRE_Int *matrix_C_i, *matrix_C_j; HYPRE_Complex *matrix_C_data; bnnz = block_size * block_size; new_nrows = num_rows * block_size; new_ncols = num_cols * block_size; new_num_nonzeros = block_size * block_size * num_nonzeros; matrix_C = hypre_CSRMatrixCreate(new_nrows, new_ncols, new_num_nonzeros); hypre_CSRMatrixInitialize(matrix_C); matrix_C_i = hypre_CSRMatrixI(matrix_C); matrix_C_j = hypre_CSRMatrixJ(matrix_C); matrix_C_data = hypre_CSRMatrixData(matrix_C); for (i = 0; i < num_rows; i++) { for (j = 0; j < block_size; j++) matrix_C_i[i * block_size + j] = matrix_i[i] * bnnz + j * (matrix_i[i + 1] - matrix_i[i]) * block_size; } matrix_C_i[new_nrows] = matrix_i[num_rows] * bnnz; C_ii = 0; for (i = 0; i < num_rows; i++) { for (j = 0; j < block_size; j++) { for (ii = matrix_i[i]; ii < matrix_i[i + 1]; ii++) { k = j; matrix_C_j[C_ii] = matrix_j[ii] * block_size + k; matrix_C_data[C_ii] = matrix_data[ii * bnnz + j * block_size + k]; C_ii++; for (k = 0; k < block_size; k++) { if (j != k) { matrix_C_j[C_ii] = matrix_j[ii] * block_size + k; matrix_C_data[C_ii] = matrix_data[ii * bnnz + j * block_size + k]; C_ii++; } } } } } return matrix_C; } /*-------------------------------------------------------------------------- * hypre_CSRBlockMatrixConvertFromCSRMatrix * this doesn't properly convert the parcsr off_diag matrices - AB 12/7/05 (because here we assume the matrix is square - we don't check what the number of columns should be ) - it can only be used for the diag part *--------------------------------------------------------------------------*/ hypre_CSRBlockMatrix * hypre_CSRBlockMatrixConvertFromCSRMatrix(hypre_CSRMatrix *matrix, HYPRE_Int matrix_C_block_size ) { HYPRE_Int num_rows = hypre_CSRMatrixNumRows(matrix); HYPRE_Int num_cols = hypre_CSRMatrixNumCols(matrix); HYPRE_Int *matrix_i = hypre_CSRMatrixI(matrix); HYPRE_Int *matrix_j = hypre_CSRMatrixJ(matrix); HYPRE_Complex* matrix_data = hypre_CSRMatrixData(matrix); hypre_CSRBlockMatrix* matrix_C; HYPRE_Int *matrix_C_i, *matrix_C_j; HYPRE_Complex *matrix_C_data; HYPRE_Int matrix_C_num_rows, matrix_C_num_cols, matrix_C_num_nonzeros; HYPRE_Int i, j, ii, jj, s_jj, index, *counter; matrix_C_num_rows = num_rows / matrix_C_block_size; matrix_C_num_cols = num_cols / matrix_C_block_size; counter = hypre_CTAlloc(HYPRE_Int, matrix_C_num_cols, HYPRE_MEMORY_HOST); for (i = 0; i < matrix_C_num_cols; i++) { counter[i] = -1; } matrix_C_num_nonzeros = 0; for (i = 0; i < matrix_C_num_rows; i++) { for (j = 0; j < matrix_C_block_size; j++) { for (ii = matrix_i[i * matrix_C_block_size + j]; ii < matrix_i[i * matrix_C_block_size + j + 1]; ii++) { if (counter[matrix_j[ii] / matrix_C_block_size] < i) { counter[matrix_j[ii] / matrix_C_block_size] = i; matrix_C_num_nonzeros++; } } } } matrix_C = hypre_CSRBlockMatrixCreate(matrix_C_block_size, matrix_C_num_rows, matrix_C_num_cols, matrix_C_num_nonzeros); hypre_CSRBlockMatrixInitialize(matrix_C); matrix_C_i = hypre_CSRBlockMatrixI(matrix_C); matrix_C_j = hypre_CSRBlockMatrixJ(matrix_C); matrix_C_data = hypre_CSRBlockMatrixData(matrix_C); for (i = 0; i < matrix_C_num_cols; i++) { counter[i] = -1; } jj = s_jj = 0; for (i = 0; i < matrix_C_num_rows; i++) { matrix_C_i[i] = jj; for (j = 0; j < matrix_C_block_size; j++) { for (ii = matrix_i[i * matrix_C_block_size + j]; ii < matrix_i[i * matrix_C_block_size + j + 1]; ii++) { if (counter[matrix_j[ii] / matrix_C_block_size] < s_jj) { counter[matrix_j[ii] / matrix_C_block_size] = jj; matrix_C_j[jj] = matrix_j[ii] / matrix_C_block_size; jj++; } index = counter[matrix_j[ii] / matrix_C_block_size] * matrix_C_block_size * matrix_C_block_size + j * matrix_C_block_size + matrix_j[ii] % matrix_C_block_size; matrix_C_data[index] = matrix_data[ii]; } } s_jj = jj; } matrix_C_i[matrix_C_num_rows] = matrix_C_num_nonzeros; hypre_TFree(counter, HYPRE_MEMORY_HOST); return matrix_C; } /*-------------------------------------------------------------------------- * hypre_CSRBlockMatrixBlockAdd * (o = i1 + i2) *--------------------------------------------------------------------------*/ HYPRE_Int hypre_CSRBlockMatrixBlockAdd(HYPRE_Complex* i1, HYPRE_Complex* i2, HYPRE_Complex* o, HYPRE_Int block_size) { HYPRE_Int i; HYPRE_Int sz = block_size * block_size; for (i = 0; i < sz; i++) { o[i] = i1[i] + i2[i]; } return 0; } /*-------------------------------------------------------------------------- * hypre_CSRBlockMatrixBlockAddAccumulate * (o = i1 + o) *--------------------------------------------------------------------------*/ HYPRE_Int hypre_CSRBlockMatrixBlockAddAccumulate(HYPRE_Complex* i1, HYPRE_Complex* o, HYPRE_Int block_size) { HYPRE_Int i; HYPRE_Int sz = block_size * block_size; for (i = 0; i < sz; i++) { o[i] += i1[i]; } return 0; } /*-------------------------------------------------------------------------- * hypre_CSRBlockMatrixBlockAddAccumulateDiag * (diag(o) = diag(i1) + diag(o)) *--------------------------------------------------------------------------*/ HYPRE_Int hypre_CSRBlockMatrixBlockAddAccumulateDiag(HYPRE_Complex* i1, HYPRE_Complex* o, HYPRE_Int block_size) { HYPRE_Int i; for (i = 0; i < block_size; i++) { o[i * block_size + i] += i1[i * block_size + i]; } return 0; } /*-------------------------------------------------------------------------- * hypre_CSRBlockMatrixBlockAddAccumulateDiagCheckSign * only add elements of sign*i1 that are negative (sign is size block_size) * (diag(o) = diag(i1) + diag(o)) *--------------------------------------------------------------------------*/ HYPRE_Int hypre_CSRBlockMatrixBlockAddAccumulateDiagCheckSign(HYPRE_Complex* i1, HYPRE_Complex* o, HYPRE_Int block_size, HYPRE_Real *sign) { HYPRE_Int i; HYPRE_Real tmp; for (i = 0; i < block_size; i++) { tmp = (HYPRE_Real) i1[i * block_size + i] * sign[i]; if (tmp < 0) { o[i * block_size + i] += i1[i * block_size + i]; } } return 0; } /*-------------------------------------------------------------------------- * hypre_CSRBlockMatrixComputeSign * o = sign(diag(i1)) *--------------------------------------------------------------------------*/ HYPRE_Int hypre_CSRBlockMatrixComputeSign(HYPRE_Complex *i1, HYPRE_Complex *o, HYPRE_Int block_size) { HYPRE_Int i; for (i = 0; i < block_size; i++) { if ((HYPRE_Real) i1[i * block_size + i] < 0) { o[i] = -1; } else { o[i] = 1; } } return 0; } /*-------------------------------------------------------------------------- * hypre_CSRBlockMatrixBlockSetScalar * (each entry in block o is set to beta ) *--------------------------------------------------------------------------*/ HYPRE_Int hypre_CSRBlockMatrixBlockSetScalar(HYPRE_Complex* o, HYPRE_Complex beta, HYPRE_Int block_size) { HYPRE_Int i; HYPRE_Int sz = block_size * block_size; for (i = 0; i < sz; i++) { o[i] = beta; } return 0; } /*-------------------------------------------------------------------------- * hypre_CSRBlockMatrixBlockCopyData * (o = beta*i1 ) *--------------------------------------------------------------------------*/ HYPRE_Int hypre_CSRBlockMatrixBlockCopyData(HYPRE_Complex* i1, HYPRE_Complex* o, HYPRE_Complex beta, HYPRE_Int block_size) { HYPRE_Int i; HYPRE_Int sz = block_size * block_size; for (i = 0; i < sz; i++) { o[i] = beta * i1[i]; } return 0; } /*-------------------------------------------------------------------------- * hypre_CSRBlockMatrixBlockCopyDataDiag - zeros off-diag entries * (o = beta*diag(i1)) *--------------------------------------------------------------------------*/ HYPRE_Int hypre_CSRBlockMatrixBlockCopyDataDiag(HYPRE_Complex* i1, HYPRE_Complex* o, HYPRE_Complex beta, HYPRE_Int block_size) { HYPRE_Int i; HYPRE_Int sz = block_size * block_size; for (i = 0; i < sz; i++) { o[i] = 0.0; } for (i = 0; i < block_size; i++) { o[i * block_size + i] = beta * i1[i * block_size + i]; } return 0; } /*-------------------------------------------------------------------------- * hypre_CSRBlockMatrixBlockTranspose * (o = i1' ) *--------------------------------------------------------------------------*/ HYPRE_Int hypre_CSRBlockMatrixBlockTranspose(HYPRE_Complex* i1, HYPRE_Complex* o, HYPRE_Int block_size) { HYPRE_Int i, j; for (i = 0; i < block_size; i++) for (j = 0; j < block_size; j++) { o[i * block_size + j] = i1[j * block_size + i]; } return 0; } /*-------------------------------------------------------------------------- * hypre_CSRBlockMatrixBlockNorm * (out = norm(data) ) * * (note: these are not all actually "norms") * *--------------------------------------------------------------------------*/ HYPRE_Int hypre_CSRBlockMatrixBlockNorm(HYPRE_Int norm_type, HYPRE_Complex* data, HYPRE_Real* out, HYPRE_Int block_size) { HYPRE_Int ierr = 0; HYPRE_Int i, j; HYPRE_Real sum = 0.0; HYPRE_Real *totals; HYPRE_Int sz = block_size * block_size; switch (norm_type) { case 6: /* sum of all elements in the block */ { for (i = 0; i < sz; i++) { sum += (HYPRE_Real)(data[i]); } break; } case 5: /* one norm - max col sum*/ { totals = hypre_CTAlloc(HYPRE_Real, block_size, HYPRE_MEMORY_HOST); for (i = 0; i < block_size; i++) /* row */ { for (j = 0; j < block_size; j++) /* col */ { totals[j] += hypre_cabs(data[i * block_size + j]); } } sum = totals[0]; for (j = 1; j < block_size; j++) /* col */ { if (totals[j] > sum) { sum = totals[j]; } } hypre_TFree(totals, HYPRE_MEMORY_HOST); break; } case 4: /* inf norm - max row sum */ { totals = hypre_CTAlloc(HYPRE_Real, block_size, HYPRE_MEMORY_HOST); for (i = 0; i < block_size; i++) /* row */ { for (j = 0; j < block_size; j++) /* col */ { totals[i] += hypre_cabs(data[i * block_size + j]); } } sum = totals[0]; for (i = 1; i < block_size; i++) /* row */ { if (totals[i] > sum) { sum = totals[i]; } } hypre_TFree(totals, HYPRE_MEMORY_HOST); break; } case 3: /* largest element of block (return value includes sign) */ { sum = (HYPRE_Real)data[0]; for (i = 0; i < sz; i++) { if (hypre_cabs(data[i]) > hypre_cabs(sum)) { sum = (HYPRE_Real)data[i]; } } break; } case 2: /* sum of abs values of all elements in the block */ { for (i = 0; i < sz; i++) { sum += hypre_cabs(data[i]); } break; } default: /* 1 = frobenius*/ { for (i = 0; i < sz; i++) { sum += ((HYPRE_Real)data[i]) * ((HYPRE_Real)data[i]); } sum = hypre_sqrt(sum); } } *out = sum; return ierr; } /*-------------------------------------------------------------------------- * hypre_CSRBlockMatrixBlockMultAdd * (o = i1 * i2 + beta * o) *--------------------------------------------------------------------------*/ HYPRE_Int hypre_CSRBlockMatrixBlockMultAdd(HYPRE_Complex* i1, HYPRE_Complex* i2, HYPRE_Complex beta, HYPRE_Complex* o, HYPRE_Int block_size) { #if LB_VERSION { HYPRE_Complex alp = 1.0; dgemm_("N", "N", &block_size, &block_size, &block_size, &alp, i2, &block_size, i1, &block_size, &beta, o, &block_size); } #else { HYPRE_Int i, j, k; HYPRE_Complex ddata; if (beta == 0.0) { for (i = 0; i < block_size; i++) { for (j = 0; j < block_size; j++) { ddata = 0.0; for (k = 0; k < block_size; k++) { ddata += i1[i * block_size + k] * i2[k * block_size + j]; } o[i * block_size + j] = ddata; } } } else if (beta == 1.0) { for (i = 0; i < block_size; i++) { for (j = 0; j < block_size; j++) { ddata = o[i * block_size + j]; for (k = 0; k < block_size; k++) { ddata += i1[i * block_size + k] * i2[k * block_size + j]; } o[i * block_size + j] = ddata; } } } else { for (i = 0; i < block_size; i++) { for (j = 0; j < block_size; j++) { ddata = beta * o[i * block_size + j]; for (k = 0; k < block_size; k++) { ddata += i1[i * block_size + k] * i2[k * block_size + j]; } o[i * block_size + j] = ddata; } } } } #endif return 0; } /*-------------------------------------------------------------------------- * hypre_CSRBlockMatrixBlockMultAddDiag * (diag(o) = diag(i1) * diag(i2) + beta * diag(o)) *--------------------------------------------------------------------------*/ HYPRE_Int hypre_CSRBlockMatrixBlockMultAddDiag(HYPRE_Complex* i1, HYPRE_Complex* i2, HYPRE_Complex beta, HYPRE_Complex* o, HYPRE_Int block_size) { HYPRE_Int i; if (beta == 0.0) { for (i = 0; i < block_size; i++) { o[i * block_size + i] = i1[i * block_size + i] * i2[i * block_size + i]; } } else if (beta == 1.0) { for (i = 0; i < block_size; i++) { o[i * block_size + i] = o[i * block_size + i] + i1[i * block_size + i] * i2[i * block_size + i]; } } else { for (i = 0; i < block_size; i++) { o[i * block_size + i] = beta * o[i * block_size + i] + i1[i * block_size + i] * i2[i * block_size + i]; } } return 0; } /*-------------------------------------------------------------------------- * hypre_CSRBlockMatrixBlockMultAddDiagCheckSign * * only mult elements if sign*diag(i2) is negative *(diag(o) = diag(i1) * diag(i2) + beta * diag(o)) *--------------------------------------------------------------------------*/ HYPRE_Int hypre_CSRBlockMatrixBlockMultAddDiagCheckSign(HYPRE_Complex *i1, HYPRE_Complex *i2, HYPRE_Complex beta, HYPRE_Complex *o, HYPRE_Int block_size, HYPRE_Real *sign) { HYPRE_Int i; HYPRE_Real tmp; if (beta == 0.0) { for (i = 0; i < block_size; i++) { tmp = (HYPRE_Real) i2[i * block_size + i] * sign[i]; if (tmp < 0) { o[i * block_size + i] = i1[i * block_size + i] * i2[i * block_size + i]; } } } else if (beta == 1.0) { for (i = 0; i < block_size; i++) { tmp = (HYPRE_Real) i2[i * block_size + i] * sign[i]; if (tmp < 0) { o[i * block_size + i] = o[i * block_size + i] + i1[i * block_size + i] * i2[i * block_size + i]; } } } else { for (i = 0; i < block_size; i++) { tmp = i2[i * block_size + i] * sign[i]; if (tmp < 0) { o[i * block_size + i] = beta * o[i * block_size + i] + i1[i * block_size + i] * i2[i * block_size + i]; } } } return 0; } /*-------------------------------------------------------------------------- * hypre_CSRBlockMatrixBlockMultAddDiag2 (scales cols of il by diag of i2) * ((o) = (i1) * diag(i2) + beta * (o)) *--------------------------------------------------------------------------*/ HYPRE_Int hypre_CSRBlockMatrixBlockMultAddDiag2(HYPRE_Complex* i1, HYPRE_Complex* i2, HYPRE_Complex beta, HYPRE_Complex* o, HYPRE_Int block_size) { HYPRE_Int i, j; if (beta == 0.0) { for (i = 0; i < block_size; i++) { for (j = 0; j < block_size; j++) { o[i * block_size + j] = i1[i * block_size + j] * i2[j * block_size + j]; } } } else if (beta == 1.0) { for (i = 0; i < block_size; i++) { for (j = 0; j < block_size; j++) { o[i * block_size + j] = o[i * block_size + j] + i1[i * block_size + j] * i2[j * block_size + j]; } } } else { for (i = 0; i < block_size; i++) { for (j = 0; j < block_size; j++) { o[i * block_size + j] = beta * o[i * block_size + j] + i1[i * block_size + j] * i2[j * block_size + j]; } } } return 0; } /*-------------------------------------------------------------------------- * hypre_CSRBlockMatrixBlockMultAddDiag3 (scales cols of il by i2 - whose diag elements are row sums) * ((o) = (i1) * diag(i2) + beta * (o)) *--------------------------------------------------------------------------*/ HYPRE_Int hypre_CSRBlockMatrixBlockMultAddDiag3(HYPRE_Complex* i1, HYPRE_Complex* i2, HYPRE_Complex beta, HYPRE_Complex* o, HYPRE_Int block_size) { HYPRE_Int i, j; HYPRE_Complex *row_sum; row_sum = hypre_CTAlloc(HYPRE_Complex, block_size, HYPRE_MEMORY_HOST); for (i = 0; i < block_size; i++) { for (j = 0; j < block_size; j++) { row_sum[i] += i2[i * block_size + j]; } } if (beta == 0.0) { for (i = 0; i < block_size; i++) { for (j = 0; j < block_size; j++) { o[i * block_size + j] = i1[i * block_size + j] * row_sum[j]; } } } else if (beta == 1.0) { for (i = 0; i < block_size; i++) { for (j = 0; j < block_size; j++) { o[i * block_size + j] = o[i * block_size + j] + i1[i * block_size + j] * row_sum[j]; } } } else { for (i = 0; i < block_size; i++) { for (j = 0; j < block_size; j++) { o[i * block_size + j] = beta * o[i * block_size + j] + i1[i * block_size + j] * row_sum[j]; } } } hypre_TFree(row_sum, HYPRE_MEMORY_HOST); return 0; } /*-------------------------------------------------------------------------- * hypre_CSRBlockMatrixBlockMatvec * (ov = alpha* mat * v + beta * ov) * mat is the matrix - size is block_size^2 * alpha and beta are scalars *--------------------------------------------------------------------------*/ HYPRE_Int hypre_CSRBlockMatrixBlockMatvec(HYPRE_Complex alpha, HYPRE_Complex* mat, HYPRE_Complex* v, HYPRE_Complex beta, HYPRE_Complex* ov, HYPRE_Int block_size) { HYPRE_Int ierr = 0; #if LB_VERSION { HYPRE_Int one = 1; dgemv_("T", &block_size, &block_size, &alpha, mat, &block_size, v, &one, &beta, ov, &one); } #else { HYPRE_Int i, j; HYPRE_Complex ddata; /* if alpha = 0, then no matvec */ if (alpha == 0.0) { for (j = 0; j < block_size; j++) { ov[j] *= beta; } return ierr; } /* ov = (beta/alpha) * ov; */ ddata = beta / alpha; if (ddata != 1.0) { if (ddata == 0.0) { for (j = 0; j < block_size; j++) { ov[j] = 0.0; } } else { for (j = 0; j < block_size; j++) { ov[j] *= ddata; } } } /* ov = ov + mat*v */ for (i = 0; i < block_size; i++) { ddata = ov[i]; for (j = 0; j < block_size; j++) { ddata += mat[i * block_size + j] * v[j]; } ov[i] = ddata; } /* ov = alpha*ov */ if (alpha != 1.0) { for (j = 0; j < block_size; j++) { ov[j] *= alpha; } } } #endif return ierr; } /*-------------------------------------------------------------------------- * hypre_CSRBlockMatrixBlockInvMatvec * (ov = mat^{-1} * v) * o and v are vectors * mat is the matrix - size is block_size^2 *--------------------------------------------------------------------------*/ HYPRE_Int hypre_CSRBlockMatrixBlockInvMatvec(HYPRE_Complex* mat, HYPRE_Complex* v, HYPRE_Complex* ov, HYPRE_Int block_size) { HYPRE_Int ierr = 0; HYPRE_Complex *mat_i; mat_i = hypre_CTAlloc(HYPRE_Complex, block_size * block_size, HYPRE_MEMORY_HOST); #if LB_VERSION { HYPRE_Int one, info; HYPRE_Int *piv; HYPRE_Int sz; one = 1; piv = hypre_CTAlloc(HYPRE_Int, block_size, HYPRE_MEMORY_HOST); sz = block_size * block_size; /* copy v to ov and mat to mat_i*/ dcopy_(&sz, mat, &one, mat_i, &one); dcopy_(&block_size, v, &one, ov, &one); /* writes over mat_i with LU */ dgetrf_(&block_size, &block_size, mat_i, &block_size, piv, &info); if (info) { hypre_TFree(mat_i, HYPRE_MEMORY_HOST); hypre_TFree(piv, HYPRE_MEMORY_HOST); return (-1); } /* writes over ov */ dgetrs_("T", &block_size, &one, mat_i, &block_size, piv, ov, &block_size, &info); if (info) { hypre_TFree(mat_i, HYPRE_MEMORY_HOST); hypre_TFree(piv, HYPRE_MEMORY_HOST); return (-1); } hypre_TFree(piv, HYPRE_MEMORY_HOST); } #else { HYPRE_Int m, j, k; HYPRE_Int piv_row; HYPRE_Real eps; HYPRE_Complex factor; HYPRE_Complex piv, tmp; eps = 1.0e-6; if (block_size == 1 ) { if (hypre_cabs(mat[0]) > 1e-10) { ov[0] = v[0] / mat[0]; hypre_TFree(mat_i, HYPRE_MEMORY_HOST); return (ierr); } else { /* hypre_printf("GE zero pivot error\n"); */ hypre_TFree(mat_i, HYPRE_MEMORY_HOST); return (-1); } } else { /* copy v to ov and mat to mat_i*/ for (k = 0; k < block_size; k++) { ov[k] = v[k]; for (j = 0; j < block_size; j++) { mat_i[k * block_size + j] = mat[k * block_size + j]; } } /* start ge - turning m_i into U factor (don't save L - just apply to rhs - which is ov)*/ /* we do partial pivoting for size */ /* loop through the rows (row k) */ for (k = 0; k < block_size - 1; k++) { piv = mat_i[k * block_size + k]; piv_row = k; /* find the largest pivot in position k*/ for (j = k + 1; j < block_size; j++) { if (hypre_cabs(mat_i[j * block_size + k]) > hypre_cabs(piv)) { piv = mat_i[j * block_size + k]; piv_row = j; } } if (piv_row != k) /* do a row exchange - rows k and piv_row*/ { for (j = 0; j < block_size; j++) { tmp = mat_i[k * block_size + j]; mat_i[k * block_size + j] = mat_i[piv_row * block_size + j]; mat_i[piv_row * block_size + j] = tmp; } tmp = ov[k]; ov[k] = ov[piv_row]; ov[piv_row] = tmp; } /* end of pivoting */ if (hypre_cabs(piv) > eps) { /* now we can factor into U */ for (j = k + 1; j < block_size; j++) { factor = mat_i[j * block_size + k] / piv; for (m = k + 1; m < block_size; m++) { mat_i[j * block_size + m] -= factor * mat_i[k * block_size + m]; } /* Elimination step for rhs */ ov[j] -= factor * ov[k]; } } else { /* hypre_printf("Block of matrix is nearly singular: zero pivot error\n"); */ hypre_TFree(mat_i, HYPRE_MEMORY_HOST); return (-1); } } /* we also need to check the pivot in the last row to see if it is zero */ k = block_size - 1; /* last row */ if ( hypre_cabs(mat_i[k * block_size + k]) < eps) { /* hypre_printf("Block of matrix is nearly singular: zero pivot error\n"); */ hypre_TFree(mat_i, HYPRE_MEMORY_HOST); return (-1); } /* Back Substitution - do rhs (U is now in m_i1)*/ for (k = block_size - 1; k > 0; --k) { ov[k] /= mat_i[k * block_size + k]; for (j = 0; j < k; j++) { if (mat_i[j * block_size + k] != 0.0) { ov[j] -= ov[k] * mat_i[j * block_size + k]; } } } ov[0] /= mat_i[0]; } } #endif hypre_TFree(mat_i, HYPRE_MEMORY_HOST); return (ierr); } /*-------------------------------------------------------------------------- * hypre_CSRBlockMatrixBlockInvMult * (o = i1^{-1} * i2) *--------------------------------------------------------------------------*/ HYPRE_Int hypre_CSRBlockMatrixBlockInvMult(HYPRE_Complex* i1, HYPRE_Complex* i2, HYPRE_Complex* o, HYPRE_Int block_size) { HYPRE_Int ierr = 0; HYPRE_Int i, j; HYPRE_Complex *m_i1; m_i1 = hypre_CTAlloc(HYPRE_Complex, block_size * block_size, HYPRE_MEMORY_HOST); #if LB_VERSION { HYPRE_Int one, info; HYPRE_Int *piv; HYPRE_Int sz; HYPRE_Complex *i2_t; one = 1; i2_t = hypre_CTAlloc(HYPRE_Complex, block_size * block_size, HYPRE_MEMORY_HOST); piv = hypre_CTAlloc(HYPRE_Int, block_size, HYPRE_MEMORY_HOST); /* copy i1 to m_i1*/ sz = block_size * block_size; dcopy_(&sz, i1, &one, m_i1, &one); /* writes over m_i1 with LU */ dgetrf_(&block_size, &block_size, m_i1, &block_size, piv, &info); if (info) { hypre_TFree(m_i1, HYPRE_MEMORY_HOST); hypre_TFree(i2_t, HYPRE_MEMORY_HOST); hypre_TFree(piv, HYPRE_MEMORY_HOST); return (-1); } /* need the transpose of i_2*/ for (i = 0; i < block_size; i++) { for (j = 0; j < block_size; j++) { i2_t[i * block_size + j] = i2[j * block_size + i]; } } /* writes over i2_t */ dgetrs_("T", &block_size, &block_size, m_i1, &block_size, piv, i2_t, &block_size, &info); if (info) { hypre_TFree(m_i1, HYPRE_MEMORY_HOST); hypre_TFree(i2_t, HYPRE_MEMORY_HOST); hypre_TFree(piv, HYPRE_MEMORY_HOST); return (-1); } /* ans. is the transpose of i2_t*/ for (i = 0; i < block_size; i++) { for (j = 0; j < block_size; j++) { o[i * block_size + j] = i2_t[j * block_size + i]; } } hypre_TFree(i2_t, HYPRE_MEMORY_HOST); hypre_TFree(piv, HYPRE_MEMORY_HOST); } #else { HYPRE_Int m, k; HYPRE_Int piv_row; HYPRE_Real eps; HYPRE_Complex factor; HYPRE_Complex piv, tmp; eps = 1.0e-6; if (block_size == 1 ) { if (hypre_cabs(m_i1[0]) > 1e-10) { o[0] = i2[0] / i1[0]; hypre_TFree(m_i1, HYPRE_MEMORY_HOST); return (ierr); } else { /* hypre_printf("GE zero pivot error\n"); */ hypre_TFree(m_i1, HYPRE_MEMORY_HOST); return (-1); } } else { /* copy i2 to o and i1 to m_i1*/ for (k = 0; k < block_size * block_size; k++) { o[k] = i2[k]; m_i1[k] = i1[k]; } /* start ge - turning m_i1 into U factor (don't save L - just apply to rhs - which is o)*/ /* we do partial pivoting for size */ /* loop through the rows (row k) */ for (k = 0; k < block_size - 1; k++) { piv = m_i1[k * block_size + k]; piv_row = k; /* find the largest pivot in position k*/ for (j = k + 1; j < block_size; j++) { if (hypre_cabs(m_i1[j * block_size + k]) > hypre_cabs(piv)) { piv = m_i1[j * block_size + k]; piv_row = j; } } if (piv_row != k) /* do a row exchange - rows k and piv_row*/ { for (j = 0; j < block_size; j++) { tmp = m_i1[k * block_size + j]; m_i1[k * block_size + j] = m_i1[piv_row * block_size + j]; m_i1[piv_row * block_size + j] = tmp; tmp = o[k * block_size + j]; o[k * block_size + j] = o[piv_row * block_size + j]; o[piv_row * block_size + j] = tmp; } } /* end of pivoting */ if (hypre_cabs(piv) > eps) { /* now we can factor into U */ for (j = k + 1; j < block_size; j++) { factor = m_i1[j * block_size + k] / piv; for (m = k + 1; m < block_size; m++) { m_i1[j * block_size + m] -= factor * m_i1[k * block_size + m]; } /* Elimination step for rhs */ /* do for each of the "rhs" */ for (i = 0; i < block_size; i++) { /* o(row, col) = o(row*block_size + col) */ o[j * block_size + i] -= factor * o[k * block_size + i]; } } } else { /* hypre_printf("Block of matrix is nearly singular: zero pivot error\n"); */ hypre_TFree(m_i1, HYPRE_MEMORY_HOST); return (-1); } } /* we also need to check the pivot in the last row to see if it is zero */ k = block_size - 1; /* last row */ if ( hypre_cabs(m_i1[k * block_size + k]) < eps) { /* hypre_printf("Block of matrix is nearly singular: zero pivot error\n"); */ hypre_TFree(m_i1, HYPRE_MEMORY_HOST); return (-1); } /* Back Substitution - do for each "rhs" (U is now in m_i1)*/ for (i = 0; i < block_size; i++) { for (k = block_size - 1; k > 0; --k) { o[k * block_size + i] /= m_i1[k * block_size + k]; for (j = 0; j < k; j++) { if (m_i1[j * block_size + k] != 0.0) { o[j * block_size + i] -= o[k * block_size + i] * m_i1[j * block_size + k]; } } } o[0 * block_size + i] /= m_i1[0]; } } } #endif hypre_TFree(m_i1, HYPRE_MEMORY_HOST); return ierr; } /*-------------------------------------------------------------------------- * hypre_CSRBlockMatrixBlockMultInv * (o = i2*il^(-1)) *--------------------------------------------------------------------------*/ HYPRE_Int hypre_CSRBlockMatrixBlockMultInv(HYPRE_Complex* i1, HYPRE_Complex* i2, HYPRE_Complex* o, HYPRE_Int block_size) { HYPRE_Int ierr = 0; #if LB_VERSION { /* same as solving A^T C^T = B^T */ HYPRE_Complex *m_i1; HYPRE_Int info; HYPRE_Int *piv; HYPRE_Int sz, one; piv = hypre_CTAlloc(HYPRE_Int, block_size, HYPRE_MEMORY_HOST); m_i1 = hypre_CTAlloc(HYPRE_Complex, block_size * block_size, HYPRE_MEMORY_HOST); one = 1; sz = block_size * block_size; /* copy i1 to m_i1 and i2 to o*/ dcopy_(&sz, i1, &one, m_i1, &one); dcopy_(&sz, i2, &one, o, &one); /* writes over m_i1 with LU */ dgetrf_(&block_size, &block_size, m_i1, &block_size, piv, &info); if (info) { hypre_TFree(m_i1, HYPRE_MEMORY_HOST); hypre_TFree(piv, HYPRE_MEMORY_HOST); return (-1); } /* writes over B */ dgetrs_("N", &block_size, &block_size, m_i1, &block_size, piv, o, &block_size, &info); if (info) { hypre_TFree(m_i1, HYPRE_MEMORY_HOST); hypre_TFree(piv, HYPRE_MEMORY_HOST); return (-1); } hypre_TFree(m_i1, HYPRE_MEMORY_HOST); hypre_TFree(piv, HYPRE_MEMORY_HOST); } #else { HYPRE_Real eps; HYPRE_Complex *i1_t, *i2_t, *o_t; eps = 1.0e-12; if (block_size == 1 ) { if (hypre_cabs(i1[0]) > eps) { o[0] = i2[0] / i1[0]; return (ierr); } else { /* hypre_printf("GE zero pivot error\n"); */ return (-1); } } else { i1_t = hypre_CTAlloc(HYPRE_Complex, block_size * block_size, HYPRE_MEMORY_HOST); i2_t = hypre_CTAlloc(HYPRE_Complex, block_size * block_size, HYPRE_MEMORY_HOST); o_t = hypre_CTAlloc(HYPRE_Complex, block_size * block_size, HYPRE_MEMORY_HOST); /* TO DO:: this could be done more efficiently! */ hypre_CSRBlockMatrixBlockTranspose(i1, i1_t, block_size); hypre_CSRBlockMatrixBlockTranspose(i2, i2_t, block_size); ierr = hypre_CSRBlockMatrixBlockInvMult(i1_t, i2_t, o_t, block_size); if (!ierr) { hypre_CSRBlockMatrixBlockTranspose(o_t, o, block_size); } hypre_TFree(i1_t, HYPRE_MEMORY_HOST); hypre_TFree(i2_t, HYPRE_MEMORY_HOST); hypre_TFree(o_t, HYPRE_MEMORY_HOST); } } #endif return (ierr); } /*-------------------------------------------------------------------------- * hypre_CSRBlockMatrixBlockInvMultDiag - zeros off-d entires * (o = diag(i1)^{-1} * diag(i2)) *--------------------------------------------------------------------------*/ HYPRE_Int hypre_CSRBlockMatrixBlockInvMultDiag(HYPRE_Complex* i1, HYPRE_Complex* i2, HYPRE_Complex* o, HYPRE_Int block_size) { HYPRE_Int ierr = 0; HYPRE_Int i; HYPRE_Int sz = block_size * block_size; HYPRE_Real eps = 1.0e-8; for (i = 0; i < sz; i++) { o[i] = 0.0; } for (i = 0; i < block_size; i++) { if (hypre_cabs(i1[i * block_size + i]) > eps) { o[i * block_size + i] = i2[i * block_size + i] / i1[i * block_size + i]; } else { /* hypre_printf("GE zero pivot error\n"); */ return (-1); } } return (ierr); } /*-------------------------------------------------------------------------- * hypre_CSRBlockMatrixBlockInvMultDiag2 * (o = (i1)* diag(i2)^-1) - so this scales the cols of il by the diag entries in i2 *--------------------------------------------------------------------------*/ HYPRE_Int hypre_CSRBlockMatrixBlockInvMultDiag2(HYPRE_Complex* i1, HYPRE_Complex* i2, HYPRE_Complex* o, HYPRE_Int block_size) { HYPRE_Int ierr = 0; HYPRE_Int i, j; HYPRE_Real eps = 1.0e-8; HYPRE_Complex tmp; for (i = 0; i < block_size; i++) { if (hypre_cabs(i2[i * block_size + i]) > eps) { tmp = 1 / i2[i * block_size + i]; } else { tmp = 1.0; } for (j = 0; j < block_size; j++) /* this should be re-written to access by row (not col)! */ { o[j * block_size + i] = i1[j * block_size + i] * tmp; } } return (ierr); } /*-------------------------------------------------------------------------- * hypre_CSRBlockMatrixBlockInvMultDiag3 * (o = (i1)* diag(i2)^-1) - so this scales the cols of il by the i2 whose diags are row sums *--------------------------------------------------------------------------*/ HYPRE_Int hypre_CSRBlockMatrixBlockInvMultDiag3(HYPRE_Complex* i1, HYPRE_Complex* i2, HYPRE_Complex* o, HYPRE_Int block_size) { HYPRE_Int ierr = 0; HYPRE_Int i, j; HYPRE_Real eps = 1.0e-8; HYPRE_Complex tmp, row_sum; for (i = 0; i < block_size; i++) { /* get row sum of i2, row i */ row_sum = 0.0; for (j = 0; j < block_size; j++) { row_sum += i2[i * block_size + j]; } /* invert */ if (hypre_cabs(row_sum) > eps) { tmp = 1 / row_sum; } else { tmp = 1.0; } /* scale col of i1 */ for (j = 0; j < block_size; j++) /* this should be re-written to access by row (not col)! */ { o[j * block_size + i] = i1[j * block_size + i] * tmp; } } return (ierr); } /*-------------------------------------------------------------------------- * hypre_CSRBlockMatrixTranspose *--------------------------------------------------------------------------*/ HYPRE_Int hypre_CSRBlockMatrixTranspose(hypre_CSRBlockMatrix *A, hypre_CSRBlockMatrix **AT, HYPRE_Int data) { HYPRE_Complex *A_data = hypre_CSRBlockMatrixData(A); HYPRE_Int *A_i = hypre_CSRBlockMatrixI(A); HYPRE_Int *A_j = hypre_CSRBlockMatrixJ(A); HYPRE_Int num_rowsA = hypre_CSRBlockMatrixNumRows(A); HYPRE_Int num_colsA = hypre_CSRBlockMatrixNumCols(A); HYPRE_Int num_nonzerosA = hypre_CSRBlockMatrixNumNonzeros(A); HYPRE_Int block_size = hypre_CSRBlockMatrixBlockSize(A); HYPRE_Complex *AT_data; HYPRE_Int *AT_i; HYPRE_Int *AT_j; HYPRE_Int num_rowsAT; HYPRE_Int num_colsAT; HYPRE_Int num_nonzerosAT; HYPRE_Int max_col; HYPRE_Int i, j, k, m, offset, bnnz; /*-------------------------------------------------------------- * First, ascertain that num_cols and num_nonzeros has been set. * If not, set them. *--------------------------------------------------------------*/ if (! num_nonzerosA) { num_nonzerosA = A_i[num_rowsA]; } if (num_rowsA && ! num_colsA) { max_col = -1; for (i = 0; i < num_rowsA; ++i) for (j = A_i[i]; j < A_i[i + 1]; j++) if (A_j[j] > max_col) { max_col = A_j[j]; } num_colsA = max_col + 1; } num_rowsAT = num_colsA; num_colsAT = num_rowsA; num_nonzerosAT = num_nonzerosA; bnnz = block_size * block_size; *AT = hypre_CSRBlockMatrixCreate(block_size, num_rowsAT, num_colsAT, num_nonzerosAT); AT_i = hypre_CTAlloc(HYPRE_Int, num_rowsAT + 1, HYPRE_MEMORY_HOST); AT_j = hypre_CTAlloc(HYPRE_Int, num_nonzerosAT, HYPRE_MEMORY_HOST); hypre_CSRBlockMatrixI(*AT) = AT_i; hypre_CSRBlockMatrixJ(*AT) = AT_j; if (data) { AT_data = hypre_CTAlloc(HYPRE_Complex, num_nonzerosAT * bnnz, HYPRE_MEMORY_HOST); hypre_CSRBlockMatrixData(*AT) = AT_data; } /*----------------------------------------------------------------- * Count the number of entries in each column of A (row of AT) * and fill the AT_i array. *-----------------------------------------------------------------*/ for (i = 0; i < num_nonzerosA; i++) { ++AT_i[A_j[i] + 1]; } for (i = 2; i <= num_rowsAT; i++) { AT_i[i] += AT_i[i - 1]; } /*---------------------------------------------------------------- * Load the data and column numbers of AT *----------------------------------------------------------------*/ for (i = 0; i < num_rowsA; i++) { for (j = A_i[i]; j < A_i[i + 1]; j++) { AT_j[AT_i[A_j[j]]] = i; if (data) { offset = AT_i[A_j[j]] * bnnz; for (k = 0; k < block_size; k++) for (m = 0; m < block_size; m++) AT_data[offset + k * block_size + m] = A_data[j * bnnz + m * block_size + k]; } AT_i[A_j[j]]++; } } /*------------------------------------------------------------ * AT_i[j] now points to the *end* of the jth row of entries * instead of the beginning. Restore AT_i to front of row. *------------------------------------------------------------*/ for (i = num_rowsAT; i > 0; i--) { AT_i[i] = AT_i[i - 1]; } AT_i[0] = 0; return (0); } hypre-2.33.0/src/parcsr_block_mv/csr_block_matrix.h000066400000000000000000000157251477326011500224010ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * Header info for CSR Block Matrix data structures * * Note: this matrix currently uses 0-based indexing. * Note: everything is in terms of blocks (ie. num_rows is the number * of block rows) * *****************************************************************************/ #ifndef hypre_CSR_BLOCK_MATRIX_HEADER #define hypre_CSR_BLOCK_MATRIX_HEADER #include "seq_mv.h" #include "_hypre_utilities.h" #ifdef __cplusplus extern "C" { #endif /*-------------------------------------------------------------------------- * CSR Block Matrix *--------------------------------------------------------------------------*/ typedef struct { HYPRE_Complex *data; HYPRE_Int *i; HYPRE_Int *j; HYPRE_BigInt *big_j; HYPRE_Int block_size; HYPRE_Int num_rows; HYPRE_Int num_cols; HYPRE_Int num_nonzeros; HYPRE_Int owns_data; } hypre_CSRBlockMatrix; /*-------------------------------------------------------------------------- * Accessor functions for the CSR Block Matrix structure *--------------------------------------------------------------------------*/ #define hypre_CSRBlockMatrixData(matrix) ((matrix) -> data) #define hypre_CSRBlockMatrixI(matrix) ((matrix) -> i) #define hypre_CSRBlockMatrixJ(matrix) ((matrix) -> j) #define hypre_CSRBlockMatrixBigJ(matrix) ((matrix) -> big_j) #define hypre_CSRBlockMatrixBlockSize(matrix) ((matrix) -> block_size) #define hypre_CSRBlockMatrixNumRows(matrix) ((matrix) -> num_rows) #define hypre_CSRBlockMatrixNumCols(matrix) ((matrix) -> num_cols) #define hypre_CSRBlockMatrixNumNonzeros(matrix) ((matrix) -> num_nonzeros) #define hypre_CSRBlockMatrixOwnsData(matrix) ((matrix) -> owns_data) /*-------------------------------------------------------------------------- * other functions for the CSR Block Matrix structure *--------------------------------------------------------------------------*/ hypre_CSRBlockMatrix *hypre_CSRBlockMatrixCreate(HYPRE_Int, HYPRE_Int, HYPRE_Int, HYPRE_Int); HYPRE_Int hypre_CSRBlockMatrixDestroy(hypre_CSRBlockMatrix *); HYPRE_Int hypre_CSRBlockMatrixInitialize(hypre_CSRBlockMatrix *); HYPRE_Int hypre_CSRBlockMatrixBigInitialize(hypre_CSRBlockMatrix *); HYPRE_Int hypre_CSRBlockMatrixSetDataOwner(hypre_CSRBlockMatrix *, HYPRE_Int); hypre_CSRMatrix *hypre_CSRBlockMatrixCompress(hypre_CSRBlockMatrix *); hypre_CSRMatrix *hypre_CSRBlockMatrixConvertToCSRMatrix(hypre_CSRBlockMatrix *); hypre_CSRBlockMatrix *hypre_CSRBlockMatrixConvertFromCSRMatrix(hypre_CSRMatrix *, HYPRE_Int); HYPRE_Int hypre_CSRBlockMatrixBlockAdd(HYPRE_Complex *, HYPRE_Complex *, HYPRE_Complex*, HYPRE_Int); HYPRE_Int hypre_CSRBlockMatrixBlockMultAdd(HYPRE_Complex *, HYPRE_Complex *, HYPRE_Complex, HYPRE_Complex *, HYPRE_Int); HYPRE_Int hypre_CSRBlockMatrixBlockMultAddDiag(HYPRE_Complex *, HYPRE_Complex *, HYPRE_Complex, HYPRE_Complex *, HYPRE_Int); HYPRE_Int hypre_CSRBlockMatrixBlockMultAddDiag2(HYPRE_Complex* i1, HYPRE_Complex* i2, HYPRE_Complex beta, HYPRE_Complex* o, HYPRE_Int block_size); HYPRE_Int hypre_CSRBlockMatrixBlockMultAddDiag3(HYPRE_Complex* i1, HYPRE_Complex* i2, HYPRE_Complex beta, HYPRE_Complex* o, HYPRE_Int block_size); HYPRE_Int hypre_CSRBlockMatrixBlockInvMult(HYPRE_Complex *, HYPRE_Complex *, HYPRE_Complex *, HYPRE_Int); HYPRE_Int hypre_CSRBlockMatrixBlockInvMultDiag(HYPRE_Complex *, HYPRE_Complex *, HYPRE_Complex *, HYPRE_Int); HYPRE_Int hypre_CSRBlockMatrixBlockInvMultDiag2(HYPRE_Complex* i1, HYPRE_Complex* i2, HYPRE_Complex* o, HYPRE_Int block_size); HYPRE_Int hypre_CSRBlockMatrixBlockInvMultDiag3(HYPRE_Complex* i1, HYPRE_Complex* i2, HYPRE_Complex* o, HYPRE_Int block_size); HYPRE_Int hypre_CSRBlockMatrixBlockMultInv(HYPRE_Complex *, HYPRE_Complex *, HYPRE_Complex *, HYPRE_Int); HYPRE_Int hypre_CSRBlockMatrixBlockTranspose(HYPRE_Complex *, HYPRE_Complex *, HYPRE_Int); HYPRE_Int hypre_CSRBlockMatrixTranspose(hypre_CSRBlockMatrix *A, hypre_CSRBlockMatrix **AT, HYPRE_Int data); HYPRE_Int hypre_CSRBlockMatrixBlockCopyData(HYPRE_Complex*, HYPRE_Complex*, HYPRE_Complex, HYPRE_Int); HYPRE_Int hypre_CSRBlockMatrixBlockCopyDataDiag(HYPRE_Complex*, HYPRE_Complex*, HYPRE_Complex, HYPRE_Int); HYPRE_Int hypre_CSRBlockMatrixBlockAddAccumulate(HYPRE_Complex*, HYPRE_Complex*, HYPRE_Int); HYPRE_Int hypre_CSRBlockMatrixBlockAddAccumulateDiag(HYPRE_Complex* i1, HYPRE_Complex* o, HYPRE_Int block_size); HYPRE_Int hypre_CSRBlockMatrixMatvec(HYPRE_Complex alpha, hypre_CSRBlockMatrix *A, hypre_Vector *x, HYPRE_Complex beta, hypre_Vector *y); HYPRE_Int hypre_CSRBlockMatrixMatvecT( HYPRE_Complex alpha, hypre_CSRBlockMatrix *A, hypre_Vector *x, HYPRE_Complex beta, hypre_Vector *y ); HYPRE_Int hypre_CSRBlockMatrixBlockInvMatvec(HYPRE_Complex* mat, HYPRE_Complex* v, HYPRE_Complex* ov, HYPRE_Int block_size); HYPRE_Int hypre_CSRBlockMatrixBlockMatvec(HYPRE_Complex alpha, HYPRE_Complex* mat, HYPRE_Complex* v, HYPRE_Complex beta, HYPRE_Complex* ov, HYPRE_Int block_size); HYPRE_Int hypre_CSRBlockMatrixBlockNorm(HYPRE_Int norm_type, HYPRE_Complex* data, HYPRE_Real* out, HYPRE_Int block_size); HYPRE_Int hypre_CSRBlockMatrixBlockSetScalar(HYPRE_Complex* o, HYPRE_Complex beta, HYPRE_Int block_size); HYPRE_Int hypre_CSRBlockMatrixComputeSign(HYPRE_Complex *i1, HYPRE_Complex *o, HYPRE_Int block_size); HYPRE_Int hypre_CSRBlockMatrixBlockAddAccumulateDiagCheckSign(HYPRE_Complex* i1, HYPRE_Complex* o, HYPRE_Int block_size, HYPRE_Real *sign); HYPRE_Int hypre_CSRBlockMatrixBlockMultAddDiagCheckSign(HYPRE_Complex* i1, HYPRE_Complex* i2, HYPRE_Complex beta, HYPRE_Complex* o, HYPRE_Int block_size, HYPRE_Real *sign); #ifdef __cplusplus } #endif #endif hypre-2.33.0/src/parcsr_block_mv/csr_block_matvec.c000066400000000000000000000216241477326011500223420ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * Matvec functions for hypre_CSRBlockMatrix class. * *****************************************************************************/ #include "csr_block_matrix.h" #include "../seq_mv/seq_mv.h" /*-------------------------------------------------------------------------- * hypre_CSRBlockMatrixMatvec *--------------------------------------------------------------------------*/ HYPRE_Int hypre_CSRBlockMatrixMatvec(HYPRE_Complex alpha, hypre_CSRBlockMatrix *A, hypre_Vector *x, HYPRE_Complex beta, hypre_Vector *y) { HYPRE_Complex *A_data = hypre_CSRBlockMatrixData(A); HYPRE_Int *A_i = hypre_CSRBlockMatrixI(A); HYPRE_Int *A_j = hypre_CSRBlockMatrixJ(A); HYPRE_Int num_rows = hypre_CSRBlockMatrixNumRows(A); HYPRE_Int num_cols = hypre_CSRBlockMatrixNumCols(A); HYPRE_Int blk_size = hypre_CSRBlockMatrixBlockSize(A); HYPRE_Complex *x_data = hypre_VectorData(x); HYPRE_Complex *y_data = hypre_VectorData(y); HYPRE_Int x_size = hypre_VectorSize(x); HYPRE_Int y_size = hypre_VectorSize(y); HYPRE_Int i, b1, b2, jj, bnnz = blk_size * blk_size; HYPRE_Int ierr = 0; HYPRE_Complex temp; /*--------------------------------------------------------------------- * Check for size compatibility. Matvec returns ierr = 1 if * length of X doesn't equal the number of columns of A, * ierr = 2 if the length of Y doesn't equal the number of rows * of A, and ierr = 3 if both are true. * * Because temporary vectors are often used in Matvec, none of * these conditions terminates processing, and the ierr flag * is informational only. *--------------------------------------------------------------------*/ if (num_cols * blk_size != x_size) { ierr = 1; } if (num_rows * blk_size != y_size) { ierr = 2; } if (num_cols * blk_size != x_size && num_rows * blk_size != y_size) { ierr = 3; } /*----------------------------------------------------------------------- * Do (alpha == 0.0) computation - RDF: USE MACHINE EPS *-----------------------------------------------------------------------*/ if (alpha == 0.0) { #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i) HYPRE_SMP_SCHEDULE #endif for (i = 0; i < num_rows * blk_size; i++) { y_data[i] *= beta; } return ierr; } /*----------------------------------------------------------------------- * y = (beta/alpha)*y *-----------------------------------------------------------------------*/ temp = beta / alpha; if (temp != 1.0) { if (temp == 0.0) { #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i) HYPRE_SMP_SCHEDULE #endif for (i = 0; i < num_rows * blk_size; i++) { y_data[i] = 0.0; } } else { #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i) HYPRE_SMP_SCHEDULE #endif for (i = 0; i < num_rows * blk_size; i++) { y_data[i] *= temp; } } } /*----------------------------------------------------------------- * y += A*x *-----------------------------------------------------------------*/ #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i,jj,b1,b2,temp) HYPRE_SMP_SCHEDULE #endif for (i = 0; i < num_rows; i++) { for (jj = A_i[i]; jj < A_i[i + 1]; jj++) { for (b1 = 0; b1 < blk_size; b1++) { temp = y_data[i * blk_size + b1]; for (b2 = 0; b2 < blk_size; b2++) { temp += A_data[jj * bnnz + b1 * blk_size + b2] * x_data[A_j[jj] * blk_size + b2]; } y_data[i * blk_size + b1] = temp; } } } /*----------------------------------------------------------------- * y = alpha*y *-----------------------------------------------------------------*/ if (alpha != 1.0) { #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i) HYPRE_SMP_SCHEDULE #endif for (i = 0; i < num_rows * blk_size; i++) { y_data[i] *= alpha; } } return ierr; } /*-------------------------------------------------------------------------- * hypre_CSRBlockMatrixMatvecT * * Performs y <- alpha * A^T * x + beta * y * * From Van Henson's modification of hypre_CSRMatrixMatvec. *--------------------------------------------------------------------------*/ HYPRE_Int hypre_CSRBlockMatrixMatvecT( HYPRE_Complex alpha, hypre_CSRBlockMatrix *A, hypre_Vector *x, HYPRE_Complex beta, hypre_Vector *y ) { HYPRE_Complex *A_data = hypre_CSRBlockMatrixData(A); HYPRE_Int *A_i = hypre_CSRBlockMatrixI(A); HYPRE_Int *A_j = hypre_CSRBlockMatrixJ(A); HYPRE_Int num_rows = hypre_CSRBlockMatrixNumRows(A); HYPRE_Int num_cols = hypre_CSRBlockMatrixNumCols(A); HYPRE_Complex *x_data = hypre_VectorData(x); HYPRE_Complex *y_data = hypre_VectorData(y); HYPRE_Int x_size = hypre_VectorSize(x); HYPRE_Int y_size = hypre_VectorSize(y); HYPRE_Complex temp; HYPRE_Int i, j, jj; HYPRE_Int ierr = 0; HYPRE_Int b1, b2; HYPRE_Int blk_size = hypre_CSRBlockMatrixBlockSize(A); HYPRE_Int bnnz = blk_size * blk_size; /*--------------------------------------------------------------------- * Check for size compatibility. MatvecT returns ierr = 1 if * length of X doesn't equal the number of rows of A, * ierr = 2 if the length of Y doesn't equal the number of * columns of A, and ierr = 3 if both are true. * * Because temporary vectors are often used in MatvecT, none of * these conditions terminates processing, and the ierr flag * is informational only. *--------------------------------------------------------------------*/ if (num_rows * blk_size != x_size) { ierr = 1; } if (num_cols * blk_size != y_size) { ierr = 2; } if (num_rows * blk_size != x_size && num_cols * blk_size != y_size) { ierr = 3; } /*----------------------------------------------------------------------- * Do (alpha == 0.0) computation - RDF: USE MACHINE EPS *-----------------------------------------------------------------------*/ if (alpha == 0.0) { #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i) HYPRE_SMP_SCHEDULE #endif for (i = 0; i < num_cols * blk_size; i++) { y_data[i] *= beta; } return ierr; } /*----------------------------------------------------------------------- * y = (beta/alpha)*y *-----------------------------------------------------------------------*/ temp = beta / alpha; if (temp != 1.0) { if (temp == 0.0) { #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i) HYPRE_SMP_SCHEDULE #endif for (i = 0; i < num_cols * blk_size; i++) { y_data[i] = 0.0; } } else { #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i) HYPRE_SMP_SCHEDULE #endif for (i = 0; i < num_cols * blk_size; i++) { y_data[i] *= temp; } } } /*----------------------------------------------------------------- * y += A^T*x *-----------------------------------------------------------------*/ #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i, jj,j, b1, b2) HYPRE_SMP_SCHEDULE #endif for (i = 0; i < num_rows; i++) { for (jj = A_i[i]; jj < A_i[i + 1]; jj++) /*each nonzero in that row*/ { for (b1 = 0; b1 < blk_size; b1++) /*row */ { for (b2 = 0; b2 < blk_size; b2++) /*col*/ { j = A_j[jj]; /*col */ y_data[j * blk_size + b2] += A_data[jj * bnnz + b1 * blk_size + b2] * x_data[i * blk_size + b1]; } } } } /*----------------------------------------------------------------- * y = alpha*y *-----------------------------------------------------------------*/ if (alpha != 1.0) { #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i) HYPRE_SMP_SCHEDULE #endif for (i = 0; i < num_cols * blk_size; i++) { y_data[i] *= alpha; } } return ierr; } hypre-2.33.0/src/parcsr_block_mv/driver_matvec.c000066400000000000000000000576421477326011500217050ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "../utilities/_hypre_utilities.h" #include "../seq_mv/seq_mv.h" #include "../parcsr_mv/_hypre_parcsr_mv.h" #include "../parcsr_ls/_hypre_parcsr_ls.h" #include "../krylov/krylov.h" #include "par_csr_block_matrix.h" extern HYPRE_Int MyBuildParLaplacian9pt(HYPRE_ParCSRMatrix *A_ptr); /*-------------------------------------------------------------------------- * Test driver for unstructured matrix interface *--------------------------------------------------------------------------*/ HYPRE_Int main( HYPRE_Int argc, char *argv[] ) { hypre_ParCSRMatrix *par_matrix, *g_matrix, **submatrices; hypre_CSRMatrix *A_diag, *A_offd; hypre_CSRBlockMatrix *diag; hypre_CSRBlockMatrix *offd; hypre_ParCSRBlockMatrix *par_blk_matrix, *par_blk_matrixT, *rap_matrix; hypre_Vector *x_local; hypre_Vector *y_local; hypre_ParVector *x; hypre_ParVector *y; HYPRE_Solver gmres_solver, precon; HYPRE_Int *diag_i, *diag_j, *offd_i, *offd_j; HYPRE_Int *diag_i2, *diag_j2, *offd_i2, *offd_j2; HYPRE_Complex *diag_d, *diag_d2, *offd_d, *offd_d2; HYPRE_Int mypid, local_size, nprocs; HYPRE_Int global_num_rows, global_num_cols, num_cols_offd; HYPRE_Int num_nonzeros_diag, num_nonzeros_offd, *colMap; HYPRE_Int ii, jj, kk, row, col, nnz, *indices, *colMap2; HYPRE_Complex *data, ddata, *y_data; HYPRE_Int *row_starts, *col_starts, *rstarts, *cstarts; HYPRE_Int *row_starts2, *col_starts2; HYPRE_Int block_size = 2, bnnz = 4, *index_set; FILE *fp; /* --------------------------------------------- */ /* Initialize MPI */ /* --------------------------------------------- */ hypre_MPI_Init(&argc, &argv); hypre_MPI_Comm_rank(hypre_MPI_COMM_WORLD, &mypid); hypre_MPI_Comm_size(hypre_MPI_COMM_WORLD, &nprocs); /* build and fetch matrix */ MyBuildParLaplacian9pt((HYPRE_ParCSRMatrix *) &par_matrix); global_num_rows = hypre_ParCSRMatrixGlobalNumRows(par_matrix); global_num_cols = hypre_ParCSRMatrixGlobalNumCols(par_matrix); row_starts = hypre_ParCSRMatrixRowStarts(par_matrix); col_starts = hypre_ParCSRMatrixColStarts(par_matrix); A_diag = hypre_ParCSRMatrixDiag(par_matrix); A_offd = hypre_ParCSRMatrixOffd(par_matrix); num_cols_offd = hypre_CSRMatrixNumCols(A_offd); num_nonzeros_diag = hypre_CSRMatrixNumNonzeros(A_diag); num_nonzeros_offd = hypre_CSRMatrixNumNonzeros(A_offd); /* --------------------------------------------- */ /* build vector and apply matvec */ /* --------------------------------------------- */ x = hypre_ParVectorCreate(hypre_MPI_COMM_WORLD, global_num_cols, col_starts); hypre_ParVectorInitialize(x); x_local = hypre_ParVectorLocalVector(x); data = hypre_VectorData(x_local); local_size = col_starts[mypid + 1] - col_starts[mypid]; for (ii = 0; ii < local_size; ii++) { data[ii] = 1.0; } y = hypre_ParVectorCreate(hypre_MPI_COMM_WORLD, global_num_rows, row_starts); hypre_ParVectorInitialize(y); hypre_ParCSRMatrixMatvec (1.0, par_matrix, x, 0.0, y); ddata = hypre_ParVectorInnerProd(y, y); if (mypid == 0) { hypre_printf("y inner product = %e\n", ddata); } hypre_ParVectorDestroy(x); hypre_ParVectorDestroy(y); /* --------------------------------------------- */ /* build block matrix */ /* --------------------------------------------- */ rstarts = hypre_CTAlloc(HYPRE_Int, nprocs + 1, HYPRE_MEMORY_HOST); for (ii = 0; ii <= nprocs; ii++) { rstarts[ii] = row_starts[ii]; } cstarts = hypre_CTAlloc(HYPRE_Int, nprocs + 1, HYPRE_MEMORY_HOST); for (ii = 0; ii <= nprocs; ii++) { cstarts[ii] = col_starts[ii]; } par_blk_matrix = hypre_ParCSRBlockMatrixCreate(hypre_MPI_COMM_WORLD, block_size, global_num_rows, global_num_cols, rstarts, cstarts, num_cols_offd, num_nonzeros_diag, num_nonzeros_offd); colMap = hypre_ParCSRMatrixColMapOffd(par_matrix); if (num_cols_offd > 0) { colMap2 = hypre_CTAlloc(HYPRE_Int, num_cols_offd, HYPRE_MEMORY_HOST); } else { colMap2 = NULL; } for (ii = 0; ii < num_cols_offd; ii++) { colMap2[ii] = colMap[ii]; } hypre_ParCSRBlockMatrixColMapOffd(par_blk_matrix) = colMap2; diag_i = hypre_CSRMatrixI(hypre_ParCSRMatrixDiag(par_matrix)); diag_j = hypre_CSRMatrixJ(hypre_ParCSRMatrixDiag(par_matrix)); diag_d = hypre_CSRMatrixData(hypre_ParCSRMatrixDiag(par_matrix)); diag = hypre_ParCSRBlockMatrixDiag(par_blk_matrix); diag_i2 = hypre_CTAlloc(HYPRE_Int, local_size + 1, HYPRE_MEMORY_HOST); diag_j2 = hypre_CTAlloc(HYPRE_Int, num_nonzeros_diag, HYPRE_MEMORY_HOST); diag_d2 = hypre_CTAlloc(HYPRE_Complex, num_nonzeros_diag * bnnz, HYPRE_MEMORY_HOST); for (ii = 0; ii <= local_size; ii++) { diag_i2[ii] = diag_i[ii]; } for (ii = 0; ii < num_nonzeros_diag; ii++) { diag_j2[ii] = diag_j[ii]; } hypre_CSRBlockMatrixI(diag) = diag_i2; hypre_CSRBlockMatrixJ(diag) = diag_j2; for (ii = 0; ii < num_nonzeros_diag; ii++) { for (jj = 0; jj < block_size; jj++) for (kk = 0; kk < block_size; kk++) { if (jj <= kk) { diag_d2[ii * bnnz + jj * block_size + kk] = diag_d[ii]; } else { diag_d2[ii * bnnz + jj * block_size + kk] = 0.0; } } } hypre_CSRBlockMatrixData(diag) = diag_d2; offd_i = hypre_CSRMatrixI(hypre_ParCSRMatrixOffd(par_matrix)); offd_j = hypre_CSRMatrixJ(hypre_ParCSRMatrixOffd(par_matrix)); offd_d = hypre_CSRMatrixData(hypre_ParCSRMatrixOffd(par_matrix)); offd = hypre_ParCSRBlockMatrixOffd(par_blk_matrix); offd_i2 = hypre_CTAlloc(HYPRE_Int, local_size + 1, HYPRE_MEMORY_HOST); for (ii = 0; ii <= local_size; ii++) { offd_i2[ii] = offd_i[ii]; } hypre_CSRBlockMatrixI(offd) = offd_i2; if (num_cols_offd) { offd_j2 = hypre_CTAlloc(HYPRE_Int, num_nonzeros_offd, HYPRE_MEMORY_HOST); for (ii = 0; ii < num_nonzeros_offd; ii++) { offd_j2[ii] = offd_j[ii]; } hypre_CSRBlockMatrixJ(offd) = offd_j2; offd_d2 = hypre_CTAlloc(HYPRE_Complex, num_nonzeros_offd * bnnz, HYPRE_MEMORY_HOST); for (ii = 0; ii < num_nonzeros_offd; ii++) { for (jj = 0; jj < block_size; jj++) for (kk = 0; kk < block_size; kk++) { if (jj <= kk) { offd_d2[ii * bnnz + jj * block_size + kk] = offd_d[ii]; } else { offd_d2[ii * bnnz + jj * block_size + kk] = 0.0; } } } hypre_CSRBlockMatrixData(offd) = offd_d2; } else { hypre_CSRBlockMatrixJ(offd) = NULL; hypre_CSRBlockMatrixData(offd) = NULL; } /* --------------------------------------------- */ /* build block matrix transpose */ /* --------------------------------------------- */ rstarts = hypre_CTAlloc(HYPRE_Int, nprocs + 1, HYPRE_MEMORY_HOST); for (ii = 0; ii <= nprocs; ii++) { rstarts[ii] = row_starts[ii]; } cstarts = hypre_CTAlloc(HYPRE_Int, nprocs + 1, HYPRE_MEMORY_HOST); for (ii = 0; ii <= nprocs; ii++) { cstarts[ii] = col_starts[ii]; } par_blk_matrixT = hypre_ParCSRBlockMatrixCreate(hypre_MPI_COMM_WORLD, block_size, global_num_rows, global_num_cols, rstarts, cstarts, num_cols_offd, num_nonzeros_diag, num_nonzeros_offd); colMap = hypre_ParCSRMatrixColMapOffd(par_matrix); colMap2 = hypre_CTAlloc(HYPRE_Int, num_cols_offd, HYPRE_MEMORY_HOST); for (ii = 0; ii < num_cols_offd; ii++) { colMap2[ii] = colMap[ii]; } hypre_ParCSRBlockMatrixColMapOffd(par_blk_matrixT) = colMap2; diag_i = hypre_CSRMatrixI(hypre_ParCSRMatrixDiag(par_matrix)); diag_j = hypre_CSRMatrixJ(hypre_ParCSRMatrixDiag(par_matrix)); diag_d = hypre_CSRMatrixData(hypre_ParCSRMatrixDiag(par_matrix)); diag = hypre_ParCSRBlockMatrixDiag(par_blk_matrixT); diag_i2 = hypre_CTAlloc(HYPRE_Int, local_size + 1, HYPRE_MEMORY_HOST); diag_j2 = hypre_CTAlloc(HYPRE_Int, num_nonzeros_diag, HYPRE_MEMORY_HOST); diag_d2 = hypre_CTAlloc(HYPRE_Complex, num_nonzeros_diag * bnnz, HYPRE_MEMORY_HOST); for (ii = 0; ii <= local_size; ii++) { diag_i2[ii] = diag_i[ii]; } for (ii = 0; ii < num_nonzeros_diag; ii++) { diag_j2[ii] = diag_j[ii]; } hypre_CSRBlockMatrixI(diag) = diag_i2; hypre_CSRBlockMatrixJ(diag) = diag_j2; for (ii = 0; ii < num_nonzeros_diag; ii++) { for (jj = 0; jj < block_size; jj++) for (kk = 0; kk < block_size; kk++) { if (jj >= kk) { diag_d2[ii * bnnz + jj * block_size + kk] = diag_d[ii]; } else { diag_d2[ii * bnnz + jj * block_size + kk] = 0.0; } } } hypre_CSRBlockMatrixData(diag) = diag_d2; offd_i = hypre_CSRMatrixI(hypre_ParCSRMatrixOffd(par_matrix)); offd_j = hypre_CSRMatrixJ(hypre_ParCSRMatrixOffd(par_matrix)); offd_d = hypre_CSRMatrixData(hypre_ParCSRMatrixOffd(par_matrix)); offd = hypre_ParCSRBlockMatrixOffd(par_blk_matrixT); offd_i2 = hypre_CTAlloc(HYPRE_Int, local_size + 1, HYPRE_MEMORY_HOST); for (ii = 0; ii <= local_size; ii++) { offd_i2[ii] = offd_i[ii]; } hypre_CSRBlockMatrixI(offd) = offd_i2; if (num_cols_offd) { offd_j2 = hypre_CTAlloc(HYPRE_Int, num_nonzeros_offd, HYPRE_MEMORY_HOST); for (ii = 0; ii < num_nonzeros_offd; ii++) { offd_j2[ii] = offd_j[ii]; } hypre_CSRBlockMatrixJ(offd) = offd_j2; offd_d2 = hypre_CTAlloc(HYPRE_Complex, num_nonzeros_offd * bnnz, HYPRE_MEMORY_HOST); for (ii = 0; ii < num_nonzeros_offd; ii++) { for (jj = 0; jj < block_size; jj++) for (kk = 0; kk < block_size; kk++) { if (jj >= kk) { offd_d2[ii * bnnz + jj * block_size + kk] = offd_d[ii]; } else { offd_d2[ii * bnnz + jj * block_size + kk] = 0.0; } } } hypre_CSRBlockMatrixData(offd) = offd_d2; } else { hypre_CSRBlockMatrixJ(offd) = NULL; hypre_CSRBlockMatrixData(offd) = NULL; } /* --------------------------------------------- */ /* block matvec */ /* --------------------------------------------- */ col_starts2 = hypre_CTAlloc(HYPRE_Int, nprocs + 1, HYPRE_MEMORY_HOST); for (ii = 0; ii <= nprocs; ii++) { col_starts2[ii] = col_starts[ii] * block_size; } x = hypre_ParVectorCreate(hypre_MPI_COMM_WORLD, global_num_cols * block_size, col_starts2); hypre_ParVectorInitialize(x); x_local = hypre_ParVectorLocalVector(x); data = hypre_VectorData(x_local); local_size = col_starts2[mypid + 1] - col_starts2[mypid]; for (ii = 0; ii < local_size; ii++) { data[ii] = 1.0; } row_starts2 = hypre_CTAlloc(HYPRE_Int, nprocs + 1, HYPRE_MEMORY_HOST); for (ii = 0; ii <= nprocs; ii++) { row_starts2[ii] = row_starts[ii] * block_size; } y = hypre_ParVectorCreate(hypre_MPI_COMM_WORLD, global_num_rows * block_size, row_starts2); hypre_ParVectorInitialize(y); y_local = hypre_ParVectorLocalVector(y); y_data = hypre_VectorData(y_local); hypre_BlockMatvecCommPkgCreate(par_blk_matrix); ddata = hypre_ParVectorInnerProd(x, x); if (mypid == 0) { hypre_printf("block x inner product = %e\n", ddata); } hypre_ParCSRBlockMatrixMatvec (1.0, par_blk_matrix, x, 0.0, y); ddata = hypre_ParVectorInnerProd(y, y); if (mypid == 0) { hypre_printf("block y inner product = %e\n", ddata); } /* --------------------------------------------- */ /* RAP */ /* --------------------------------------------- */ hypre_printf("Verifying RAP\n"); hypre_ParCSRBlockMatrixRAP(par_blk_matrix, par_blk_matrix, par_blk_matrix, &rap_matrix); for (ii = 0; ii < local_size; ii++) { data[ii] = 1.0; } hypre_ParCSRBlockMatrixMatvec (1.0, par_blk_matrix, x, 0.0, y); hypre_ParCSRBlockMatrixMatvec (1.0, par_blk_matrix, y, 0.0, x); hypre_ParCSRBlockMatrixMatvec (1.0, par_blk_matrixT, x, 0.0, y); ddata = hypre_ParVectorInnerProd(y, y); if (mypid == 0) { hypre_printf("(1) A^2 block inner product = %e\n", ddata); } for (ii = 0; ii < local_size; ii++) { data[ii] = 1.0; } hypre_ParCSRBlockMatrixMatvec (1.0, rap_matrix, x, 0.0, y); ddata = hypre_ParVectorInnerProd(y, y); if (mypid == 0) { hypre_printf("(2) A^2 block inner product = %e\n", ddata); } if (mypid == 0) { hypre_printf("(1) and (2) should be equal.\n"); } #if 0 /* --------------------------------------------- */ /* diagnostics: print out the matrix */ /* --------------------------------------------- */ diag_i = hypre_CSRBlockMatrixI(A_diag); diag_j = hypre_CSRBlockMatrixJ(A_diag); diag_d = hypre_CSRBlockMatrixData(A_diag); for (ii = 0; ii < hypre_ParCSRMatrixNumRows(par_matrix); ii++) for (jj = diag_i[ii]; jj < diag_i[ii + 1]; jj++) { hypre_printf("A %4d %4d = %e\n", ii, diag_j[jj], diag_d[jj]); } diag = hypre_ParCSRBlockMatrixDiag(rap_matrix); diag_i = hypre_CSRBlockMatrixI(diag); diag_j = hypre_CSRBlockMatrixJ(diag); diag_d = hypre_CSRBlockMatrixData(diag); hypre_printf("RAP block size = %d\n", hypre_ParCSRBlockMatrixBlockSize(rap_matrix)); hypre_printf("RAP num rows = %d\n", hypre_ParCSRBlockMatrixNumRows(rap_matrix)); for (ii = 0; ii < hypre_ParCSRBlockMatrixNumRows(rap_matrix); ii++) for (row = 0; row < block_size; row++) for (jj = diag_i[ii]; jj < diag_i[ii + 1]; jj++) for (col = 0; col < block_size; col++) hypre_printf("RAP %4d %4d = %e\n", ii * block_size + row, diag_j[jj]*block_size + col, diag_d[(jj + row)*block_size + col]); offd = hypre_ParCSRBlockMatrixOffd(rap_matrix); offd_i = hypre_CSRBlockMatrixI(offd); offd_j = hypre_CSRBlockMatrixJ(offd); offd_d = hypre_CSRBlockMatrixData(offd); if (num_cols_offd) { for (ii = 0; ii < hypre_ParCSRBlockMatrixNumRows(rap_matrix); ii++) for (row = 0; row < block_size; row++) for (jj = offd_i[ii]; jj < offd_i[ii + 1]; jj++) for (col = 0; col < block_size; col++) hypre_printf("RAPOFFD %4d %4d = %e\n", ii * block_size + row, offd_j[jj]*block_size + col, offd_d[(jj + row)*block_size + col]); } #endif hypre_ParVectorDestroy(x); hypre_ParVectorDestroy(y); hypre_ParCSRMatrixDestroy(par_matrix); hypre_ParCSRBlockMatrixDestroy(par_blk_matrix); hypre_ParCSRBlockMatrixDestroy(par_blk_matrixT); hypre_ParCSRBlockMatrixDestroy(rap_matrix); #if 0 /* --------------------------------------------- */ /* read in A_ee and create a HYPRE_ParCSRMatrix */ /* --------------------------------------------- */ if (nprocs == 1) { fp = fopen("Amat_ee", "r"); hypre_fscanf(fp, "%d %d", &global_num_rows, &num_nonzeros_diag); diag_i = hypre_TAlloc(HYPRE_Int, (global_num_rows + 1), HYPRE_MEMORY_HOST); diag_j = hypre_TAlloc(HYPRE_Int, num_nonzeros_diag, HYPRE_MEMORY_HOST); diag_d = hypre_TAlloc(HYPRE_Complex, num_nonzeros_diag, HYPRE_MEMORY_HOST); row = 0; nnz = 0; diag_i[0] = 0; for (ii = 0; ii < num_nonzeros_diag; ii++) { hypre_fscanf(fp, "%d %d %lg", &jj, &col, &ddata); if ((jj - 1) != row) { row++; diag_i[row] = nnz; } diag_j[nnz] = col - 1; diag_d[nnz++] = ddata; } diag_i[global_num_rows] = nnz; fclose(fp); hypre_printf("nrows = %d, nnz = %d\n", row + 1, nnz); row_starts = hypre_TAlloc(HYPRE_Int, 2, HYPRE_MEMORY_HOST); col_starts = hypre_TAlloc(HYPRE_Int, 2, HYPRE_MEMORY_HOST); row_starts[0] = col_starts[0] = 0; row_starts[1] = col_starts[1] = global_num_rows; num_cols_offd = 0; num_nonzeros_offd = 0; par_matrix = hypre_ParCSRMatrixCreate(hypre_MPI_COMM_WORLD, global_num_rows, global_num_rows, row_starts, col_starts, num_cols_offd, num_nonzeros_diag, num_nonzeros_offd); A_diag = hypre_ParCSRMatrixDiag(par_matrix); hypre_CSRMatrixI(A_diag) = diag_i; hypre_CSRMatrixJ(A_diag) = diag_j; hypre_CSRMatrixData(A_diag) = diag_d; /* --------------------------------------------- */ /* read in discrete gradient matrix */ /* --------------------------------------------- */ fp = fopen("Gmat", "r"); hypre_fscanf(fp, "%d %d %d", &global_num_rows, &global_num_cols, &num_nonzeros_diag); diag_i = hypre_TAlloc(HYPRE_Int, (global_num_rows + 1), HYPRE_MEMORY_HOST); diag_j = hypre_TAlloc(HYPRE_Int, num_nonzeros_diag, HYPRE_MEMORY_HOST); diag_d = hypre_TAlloc(HYPRE_Complex, num_nonzeros_diag, HYPRE_MEMORY_HOST); row = 0; nnz = 0; diag_i[0] = 0; for (ii = 0; ii < num_nonzeros_diag; ii++) { hypre_fscanf(fp, "%d %d %lg", &jj, &col, &ddata); if ((jj - 1) != row) { row++; diag_i[row] = nnz; } diag_j[nnz] = col - 1; diag_d[nnz++] = ddata; } diag_i[global_num_rows] = nnz; fclose(fp); row_starts = hypre_TAlloc(HYPRE_Int, 2, HYPRE_MEMORY_HOST); col_starts = hypre_TAlloc(HYPRE_Int, 2, HYPRE_MEMORY_HOST); row_starts[0] = col_starts[0] = 0; row_starts[1] = global_num_rows; col_starts[1] = global_num_cols; num_cols_offd = 0; num_nonzeros_offd = 0; g_matrix = hypre_ParCSRMatrixCreate(hypre_MPI_COMM_WORLD, global_num_rows, global_num_cols, row_starts, col_starts, num_cols_offd, num_nonzeros_diag, num_nonzeros_offd); A_diag = hypre_ParCSRMatrixDiag(g_matrix); hypre_CSRMatrixI(A_diag) = diag_i; hypre_CSRMatrixJ(A_diag) = diag_j; hypre_CSRMatrixData(A_diag) = diag_d; /* --------------------------------------------- */ /* Check spanning tree and matrix extraction */ /* --------------------------------------------- */ hypre_ParCSRMatrixGenSpanningTree(g_matrix, &indices, 0); submatrices = (hypre_ParCSRMatrix **) hypre_TAlloc(hypre_ParCSRMatrix*, 4, HYPRE_MEMORY_HOST); hypre_ParCSRMatrixExtractSubmatrices(par_matrix, indices, &submatrices); } #endif /* test block tridiagonal solver */ if (nprocs == 1) { MyBuildParLaplacian9pt((HYPRE_ParCSRMatrix *) &par_matrix); row_starts = hypre_ParCSRMatrixRowStarts(par_matrix); col_starts = hypre_ParCSRMatrixColStarts(par_matrix); HYPRE_ParCSRGMRESCreate(hypre_MPI_COMM_WORLD, &gmres_solver); HYPRE_GMRESSetKDim(gmres_solver, 10); HYPRE_GMRESSetMaxIter(gmres_solver, 1000); HYPRE_GMRESSetTol(gmres_solver, 1.0e-6); HYPRE_GMRESSetLogging(gmres_solver, 1); HYPRE_GMRESSetPrintLevel(gmres_solver, 2); HYPRE_BlockTridiagCreate(&precon); HYPRE_BlockTridiagSetPrintLevel(precon, 0); HYPRE_BlockTridiagSetAMGNumSweeps(precon, 1); local_size = col_starts[mypid + 1] - col_starts[mypid]; index_set = hypre_CTAlloc(HYPRE_Int, local_size + 1, HYPRE_MEMORY_HOST); jj = 0; /* for (ii = 0; ii < local_size/2; ii++) index_set[jj++] = ii * 2; */ for (ii = 0; ii < local_size / 2; ii++) { index_set[jj++] = ii; } HYPRE_BlockTridiagSetIndexSet(precon, jj, index_set); HYPRE_GMRESSetPrecond(gmres_solver, (HYPRE_PtrToSolverFcn) HYPRE_BlockTridiagSolve, (HYPRE_PtrToSolverFcn) HYPRE_BlockTridiagSetup, precon); col_starts2 = hypre_CTAlloc(HYPRE_Int, nprocs + 1, HYPRE_MEMORY_HOST); for (ii = 0; ii <= nprocs; ii++) { col_starts2[ii] = col_starts[ii]; } x = hypre_ParVectorCreate(hypre_MPI_COMM_WORLD, global_num_cols, col_starts2); hypre_ParVectorInitialize(x); x_local = hypre_ParVectorLocalVector(x); local_size = col_starts2[mypid + 1] - col_starts2[mypid]; data = hypre_VectorData(x_local); for (ii = 0; ii < local_size; ii++) { data[ii] = 0.0; } row_starts2 = hypre_CTAlloc(HYPRE_Int, nprocs + 1, HYPRE_MEMORY_HOST); for (ii = 0; ii <= nprocs; ii++) { row_starts2[ii] = row_starts[ii]; } y = hypre_ParVectorCreate(hypre_MPI_COMM_WORLD, global_num_rows, row_starts2); hypre_ParVectorInitialize(y); y_local = hypre_ParVectorLocalVector(y); data = hypre_VectorData(y_local); for (ii = 0; ii < local_size; ii++) { data[ii] = 1.0; } HYPRE_GMRESSetup(gmres_solver, (HYPRE_Matrix) par_matrix, (HYPRE_Vector) y, (HYPRE_Vector) x); HYPRE_GMRESSolve(gmres_solver, (HYPRE_Matrix) par_matrix, (HYPRE_Vector) y, (HYPRE_Vector) x); hypre_ParVectorDestroy(x); hypre_ParVectorDestroy(y); hypre_ParCSRMatrixDestroy(par_matrix); } /* Finalize MPI */ hypre_MPI_Finalize(); return 0; } /*---------------------------------------------------------------------- * Build standard 9-point laplacian in 2D with grid and anisotropy. * Parameters given in command line. *----------------------------------------------------------------------*/ HYPRE_Int MyBuildParLaplacian9pt(HYPRE_ParCSRMatrix *A_ptr) { HYPRE_Int nx, ny; HYPRE_Int P, Q; HYPRE_ParCSRMatrix A; HYPRE_Int num_procs, myid; HYPRE_Int p, q; HYPRE_Complex *values; /*----------------------------------------------------------- * Initialize some stuff *-----------------------------------------------------------*/ hypre_MPI_Comm_size(hypre_MPI_COMM_WORLD, &num_procs ); hypre_MPI_Comm_rank(hypre_MPI_COMM_WORLD, &myid ); /*----------------------------------------------------------- * Set defaults *-----------------------------------------------------------*/ nx = 200; ny = 200; P = 2; if (num_procs == 1) { P = 1; } Q = num_procs / P; /*----------------------------------------------------------- * Print driver parameters *-----------------------------------------------------------*/ if (myid == 0) { hypre_printf(" Laplacian 9pt:\n"); hypre_printf(" (nx, ny) = (%d, %d)\n", nx, ny); hypre_printf(" (Px, Py) = (%d, %d)\n\n", P, Q); } /*----------------------------------------------------------- * Set up the grid structure *-----------------------------------------------------------*/ p = myid % P; q = ( myid - p) / P; /*----------------------------------------------------------- * Generate the matrix *-----------------------------------------------------------*/ values = hypre_CTAlloc(HYPRE_Complex, 2, HYPRE_MEMORY_HOST); values[1] = -1.; values[0] = 0.; if (nx > 1) { values[0] += 2.0; } if (ny > 1) { values[0] += 2.0; } if (nx > 1 && ny > 1) { values[0] += 4.0; } A = (HYPRE_ParCSRMatrix) GenerateLaplacian9pt(hypre_MPI_COMM_WORLD, nx, ny, P, Q, p, q, values); hypre_TFree(values, HYPRE_MEMORY_HOST); *A_ptr = A; return (0); } hypre-2.33.0/src/parcsr_block_mv/par_block_nodal_systems.c000066400000000000000000000233521477326011500237420ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "_hypre_parcsr_block_mv.h" /*--------------------------------------------------------------------------- * hypre_BoomerAMGBlockCreateNodalA * * This is the block version of creating a nodal norm matrix. * * Option: determine which type of "norm" (or other measurement) is used. * * 1 = frobenius * 2 = sum of abs. value of all elements * 3 = largest element (positive or negative) * 4 = 1-norm * 5 = inf - norm * 6 = sum of all elements *--------------------------------------------------------------------------*/ HYPRE_Int hypre_BoomerAMGBlockCreateNodalA(hypre_ParCSRBlockMatrix *A, HYPRE_Int option, HYPRE_Int diag_option, hypre_ParCSRMatrix **AN_ptr) { MPI_Comm comm = hypre_ParCSRBlockMatrixComm(A); hypre_CSRBlockMatrix *A_diag = hypre_ParCSRBlockMatrixDiag(A); HYPRE_Int *A_diag_i = hypre_CSRBlockMatrixI(A_diag); HYPRE_Real *A_diag_data = hypre_CSRBlockMatrixData(A_diag); HYPRE_Int block_size = hypre_CSRBlockMatrixBlockSize(A_diag); HYPRE_Int bnnz = block_size * block_size; hypre_CSRBlockMatrix *A_offd = hypre_ParCSRMatrixOffd(A); HYPRE_Int *A_offd_i = hypre_CSRBlockMatrixI(A_offd); HYPRE_Real *A_offd_data = hypre_CSRBlockMatrixData(A_offd); HYPRE_Int *A_diag_j = hypre_CSRBlockMatrixJ(A_diag); HYPRE_Int *A_offd_j = hypre_CSRBlockMatrixJ(A_offd); HYPRE_BigInt *row_starts = hypre_ParCSRBlockMatrixRowStarts(A); HYPRE_BigInt *col_map_offd = hypre_ParCSRBlockMatrixColMapOffd(A); HYPRE_Int num_nonzeros_diag; HYPRE_Int num_nonzeros_offd = 0; HYPRE_Int num_cols_offd = 0; hypre_ParCSRMatrix *AN; hypre_CSRMatrix *AN_diag; HYPRE_Int *AN_diag_i; HYPRE_Int *AN_diag_j = NULL; HYPRE_Real *AN_diag_data = NULL; hypre_CSRMatrix *AN_offd; HYPRE_Int *AN_offd_i; HYPRE_Int *AN_offd_j = NULL; HYPRE_Real *AN_offd_data = NULL; HYPRE_BigInt *col_map_offd_AN = NULL; hypre_ParCSRCommPkg *comm_pkg = hypre_ParCSRBlockMatrixCommPkg(A); HYPRE_Int num_sends; HYPRE_Int num_recvs; HYPRE_Int *send_procs; HYPRE_Int *send_map_starts; HYPRE_Int *send_map_elmts; HYPRE_Int *recv_procs; HYPRE_Int *recv_vec_starts; hypre_ParCSRCommPkg *comm_pkg_AN = NULL; HYPRE_Int *send_procs_AN = NULL; HYPRE_Int *send_map_starts_AN = NULL; HYPRE_Int *send_map_elmts_AN = NULL; HYPRE_Int *recv_procs_AN = NULL; HYPRE_Int *recv_vec_starts_AN = NULL; HYPRE_Int i; HYPRE_Int num_procs; HYPRE_Int cnt; HYPRE_Int norm_type; HYPRE_BigInt global_num_nodes; HYPRE_Int num_nodes; HYPRE_Int index, k; HYPRE_Real tmp; HYPRE_Real sum; hypre_MPI_Comm_size(comm, &num_procs); if (!comm_pkg) { hypre_BlockMatvecCommPkgCreate(A); comm_pkg = hypre_ParCSRBlockMatrixCommPkg(A); } norm_type = hypre_abs(option); /* Set up the new matrix AN */ global_num_nodes = hypre_ParCSRBlockMatrixGlobalNumRows(A); num_nodes = hypre_CSRBlockMatrixNumRows(A_diag); /* the diag part */ num_nonzeros_diag = A_diag_i[num_nodes]; AN_diag_i = hypre_CTAlloc(HYPRE_Int, num_nodes + 1, HYPRE_MEMORY_HOST); for (i = 0; i <= num_nodes; i++) { AN_diag_i[i] = A_diag_i[i]; } AN_diag_j = hypre_CTAlloc(HYPRE_Int, num_nonzeros_diag, HYPRE_MEMORY_HOST); AN_diag_data = hypre_CTAlloc(HYPRE_Real, num_nonzeros_diag, HYPRE_MEMORY_HOST); AN_diag = hypre_CSRMatrixCreate(num_nodes, num_nodes, num_nonzeros_diag); hypre_CSRMatrixI(AN_diag) = AN_diag_i; hypre_CSRMatrixJ(AN_diag) = AN_diag_j; hypre_CSRMatrixData(AN_diag) = AN_diag_data; for (i = 0; i < num_nonzeros_diag; i++) { AN_diag_j[i] = A_diag_j[i]; hypre_CSRBlockMatrixBlockNorm(norm_type, &A_diag_data[i * bnnz], &tmp, block_size); AN_diag_data[i] = tmp; } if (diag_option == 1) { /* make the diag entry the negative of the sum of off-diag entries (NEED * to get more below!)*/ /* the diagonal is the first element listed in each row - */ for (i = 0; i < num_nodes; i++) { index = AN_diag_i[i]; sum = 0.0; for (k = AN_diag_i[i] + 1; k < AN_diag_i[i + 1]; k++) { sum += AN_diag_data[k]; } AN_diag_data[index] = -sum; } } else if (diag_option == 2) { /* make all diagonal entries negative */ /* the diagonal is the first element listed in each row - */ for (i = 0; i < num_nodes; i++) { index = AN_diag_i[i]; AN_diag_data[index] = -AN_diag_data[index]; } } /* copy the commpkg */ if (comm_pkg) { num_recvs = hypre_ParCSRCommPkgNumRecvs(comm_pkg); recv_procs = hypre_ParCSRCommPkgRecvProcs(comm_pkg); recv_vec_starts = hypre_ParCSRCommPkgRecvVecStarts(comm_pkg); num_sends = hypre_ParCSRCommPkgNumSends(comm_pkg); send_procs = hypre_ParCSRCommPkgSendProcs(comm_pkg); send_map_starts = hypre_ParCSRCommPkgSendMapStarts(comm_pkg); send_map_elmts = hypre_ParCSRCommPkgSendMapElmts(comm_pkg); if (num_sends) { send_procs_AN = hypre_CTAlloc(HYPRE_Int, num_sends, HYPRE_MEMORY_HOST); send_map_elmts_AN = hypre_CTAlloc(HYPRE_Int, send_map_starts[num_sends], HYPRE_MEMORY_HOST); } send_map_starts_AN = hypre_CTAlloc(HYPRE_Int, num_sends + 1, HYPRE_MEMORY_HOST); for (i = 0; i < num_sends; i++) { send_procs_AN[i] = send_procs[i]; send_map_starts_AN[i + 1] = send_map_starts[i + 1]; } cnt = send_map_starts_AN[num_sends]; for (i = 0; i < cnt; i++) { send_map_elmts_AN[i] = send_map_elmts[i]; } recv_vec_starts_AN = hypre_CTAlloc(HYPRE_Int, num_recvs + 1, HYPRE_MEMORY_HOST); if (num_recvs) { recv_procs_AN = hypre_CTAlloc(HYPRE_Int, num_recvs, HYPRE_MEMORY_HOST); } for (i = 0; i < num_recvs; i++) { recv_procs_AN[i] = recv_procs[i]; recv_vec_starts_AN[i + 1] = recv_vec_starts[i + 1]; } /* Create communication package */ hypre_ParCSRCommPkgCreateAndFill(comm, num_recvs, recv_procs_AN, recv_vec_starts_AN, num_sends, send_procs_AN, send_map_starts_AN, send_map_elmts_AN, &comm_pkg_AN); } /* the off-diag part */ num_cols_offd = hypre_CSRBlockMatrixNumCols(A_offd); col_map_offd_AN = hypre_CTAlloc(HYPRE_BigInt, num_cols_offd, HYPRE_MEMORY_HOST); for (i = 0; i < num_cols_offd; i++) { col_map_offd_AN[i] = col_map_offd[i]; } num_nonzeros_offd = A_offd_i[num_nodes]; AN_offd_i = hypre_CTAlloc(HYPRE_Int, num_nodes + 1, HYPRE_MEMORY_HOST); for (i = 0; i <= num_nodes; i++) { AN_offd_i[i] = A_offd_i[i]; } AN_offd_j = hypre_CTAlloc(HYPRE_Int, num_nonzeros_offd, HYPRE_MEMORY_HOST); AN_offd_data = hypre_CTAlloc(HYPRE_Real, num_nonzeros_offd, HYPRE_MEMORY_HOST); for (i = 0; i < num_nonzeros_offd; i++) { AN_offd_j[i] = A_offd_j[i]; hypre_CSRBlockMatrixBlockNorm(norm_type, &A_offd_data[i * bnnz], &tmp, block_size); AN_offd_data[i] = tmp; } AN_offd = hypre_CSRMatrixCreate(num_nodes, num_cols_offd, num_nonzeros_offd); hypre_CSRMatrixI(AN_offd) = AN_offd_i; hypre_CSRMatrixJ(AN_offd) = AN_offd_j; hypre_CSRMatrixData(AN_offd) = AN_offd_data; if (diag_option == 1) { /* make the diag entry the negative of the sum of off-diag entries (here we are adding the off_diag contribution)*/ /* the diagonal is the first element listed in each row of AN_diag_data - */ for (i = 0; i < num_nodes; i++) { sum = 0.0; for (k = AN_offd_i[i]; k < AN_offd_i[i + 1]; k++) { sum += AN_offd_data[k]; } index = AN_diag_i[i];/* location of diag entry in data */ AN_diag_data[index] -= sum; /* subtract from current value */ } } /* now create AN */ AN = hypre_ParCSRMatrixCreate(comm, global_num_nodes, global_num_nodes, row_starts, row_starts, num_cols_offd, num_nonzeros_diag, num_nonzeros_offd); /* we already created the diag and offd matrices - so we don't need the ones created above */ hypre_CSRMatrixDestroy(hypre_ParCSRMatrixDiag(AN)); hypre_CSRMatrixDestroy(hypre_ParCSRMatrixOffd(AN)); hypre_ParCSRMatrixDiag(AN) = AN_diag; hypre_ParCSRMatrixOffd(AN) = AN_offd; hypre_CSRMatrixMemoryLocation(AN_diag) = HYPRE_MEMORY_HOST; hypre_CSRMatrixMemoryLocation(AN_offd) = HYPRE_MEMORY_HOST; hypre_ParCSRMatrixColMapOffd(AN) = col_map_offd_AN; hypre_ParCSRMatrixCommPkg(AN) = comm_pkg_AN; *AN_ptr = AN; return hypre_error_flag; } hypre-2.33.0/src/parcsr_block_mv/par_csr_block_comm.c000066400000000000000000000211131477326011500226510ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "_hypre_parcsr_block_mv.h" #include "_hypre_utilities.h" #include "_hypre_parcsr_mv.h" /*-------------------------------------------------------------------------- * hypre_ParCSRBlockCommHandleCreate *--------------------------------------------------------------------------*/ hypre_ParCSRCommHandle * hypre_ParCSRBlockCommHandleCreate(HYPRE_Int job, HYPRE_Int bnnz, hypre_ParCSRCommPkg *comm_pkg, void *send_data, void *recv_data ) { HYPRE_Int num_sends = hypre_ParCSRCommPkgNumSends(comm_pkg); HYPRE_Int num_recvs = hypre_ParCSRCommPkgNumRecvs(comm_pkg); MPI_Comm comm = hypre_ParCSRCommPkgComm(comm_pkg); hypre_ParCSRCommHandle *comm_handle; HYPRE_Int num_requests; hypre_MPI_Request *requests; HYPRE_Int i, j, my_id, num_procs, ip, vec_start, vec_len; HYPRE_Complex *d_send_data = (HYPRE_Complex *) send_data; HYPRE_Complex *d_recv_data = (HYPRE_Complex *) recv_data; /*--------------------------------------------------------------------------- * job = 1 : is used to initialize communication exchange for the parts * of vector needed to perform a Matvec, it requires send_data * and recv_data to be doubles, recv_vec_starts and * send_map_starts need to be set in comm_pkg. * job = 2 : is used to initialize communication exchange for the parts * of vector needed to perform a MatvecT, it requires send_data * and recv_data to be doubles, recv_vec_starts and * send_map_starts need to be set in comm_pkg. *------------------------------------------------------------------------*/ num_requests = num_sends + num_recvs; requests = hypre_CTAlloc(hypre_MPI_Request, num_requests, HYPRE_MEMORY_HOST); hypre_MPI_Comm_size(comm, &num_procs); hypre_MPI_Comm_rank(comm, &my_id); j = 0; switch (job) { case 1: { for (i = 0; i < num_recvs; i++) { ip = hypre_ParCSRCommPkgRecvProc(comm_pkg, i); vec_start = hypre_ParCSRCommPkgRecvVecStart(comm_pkg, i); vec_len = (hypre_ParCSRCommPkgRecvVecStart(comm_pkg, i + 1) - vec_start) * bnnz; hypre_MPI_Irecv(&d_recv_data[vec_start * bnnz], vec_len, HYPRE_MPI_COMPLEX, ip, 0, comm, &requests[j++]); } for (i = 0; i < num_sends; i++) { vec_start = hypre_ParCSRCommPkgSendMapStart(comm_pkg, i); vec_len = (hypre_ParCSRCommPkgSendMapStart(comm_pkg, i + 1) - vec_start) * bnnz; ip = hypre_ParCSRCommPkgSendProc(comm_pkg, i); hypre_MPI_Isend(&d_send_data[vec_start * bnnz], vec_len, HYPRE_MPI_COMPLEX, ip, 0, comm, &requests[j++]); } break; } case 2: { for (i = 0; i < num_sends; i++) { vec_start = hypre_ParCSRCommPkgSendMapStart(comm_pkg, i); vec_len = (hypre_ParCSRCommPkgSendMapStart(comm_pkg, i + 1) - vec_start) * bnnz; ip = hypre_ParCSRCommPkgSendProc(comm_pkg, i); hypre_MPI_Irecv(&d_recv_data[vec_start * bnnz], vec_len, HYPRE_MPI_COMPLEX, ip, 0, comm, &requests[j++]); } for (i = 0; i < num_recvs; i++) { ip = hypre_ParCSRCommPkgRecvProc(comm_pkg, i); vec_start = hypre_ParCSRCommPkgRecvVecStart(comm_pkg, i); vec_len = (hypre_ParCSRCommPkgRecvVecStart(comm_pkg, i + 1) - vec_start) * bnnz; hypre_MPI_Isend(&d_send_data[vec_start * bnnz], vec_len, HYPRE_MPI_COMPLEX, ip, 0, comm, &requests[j++]); } break; } } /*-------------------------------------------------------------------- * set up comm_handle and return *--------------------------------------------------------------------*/ comm_handle = hypre_CTAlloc(hypre_ParCSRCommHandle, 1, HYPRE_MEMORY_HOST); hypre_ParCSRCommHandleCommPkg(comm_handle) = comm_pkg; hypre_ParCSRCommHandleSendData(comm_handle) = send_data; hypre_ParCSRCommHandleRecvData(comm_handle) = recv_data; hypre_ParCSRCommHandleNumRequests(comm_handle) = num_requests; hypre_ParCSRCommHandleRequests(comm_handle) = requests; return ( comm_handle ); } /*-------------------------------------------------------------------- hypre_ParCSRBlockCommHandleDestroy *--------------------------------------------------------------------*/ HYPRE_Int hypre_ParCSRBlockCommHandleDestroy(hypre_ParCSRCommHandle *comm_handle) { hypre_MPI_Status *status0; if ( comm_handle == NULL ) { return hypre_error_flag; } if (hypre_ParCSRCommHandleNumRequests(comm_handle)) { status0 = hypre_CTAlloc(hypre_MPI_Status, hypre_ParCSRCommHandleNumRequests(comm_handle), HYPRE_MEMORY_HOST); hypre_MPI_Waitall(hypre_ParCSRCommHandleNumRequests(comm_handle), hypre_ParCSRCommHandleRequests(comm_handle), status0); hypre_TFree(status0, HYPRE_MEMORY_HOST); } hypre_TFree(hypre_ParCSRCommHandleRequests(comm_handle), HYPRE_MEMORY_HOST); hypre_TFree(comm_handle, HYPRE_MEMORY_HOST); return hypre_error_flag; } /*-------------------------------------------------------------------- * hypre_ParCSRBlockMatrixCreateAssumedPartition - * Each proc gets it own range. Then * each needs to reconcile its actual range with its assumed * range - the result is essentila a partition of its assumed range - * this is the assumed partition. *--------------------------------------------------------------------*/ HYPRE_Int hypre_ParCSRBlockMatrixCreateAssumedPartition( hypre_ParCSRBlockMatrix *matrix) { HYPRE_BigInt global_num_cols; HYPRE_Int myid; HYPRE_BigInt col_start = 0, col_end = 0; MPI_Comm comm; hypre_IJAssumedPart *apart; global_num_cols = hypre_ParCSRBlockMatrixGlobalNumCols(matrix); comm = hypre_ParCSRBlockMatrixComm(matrix); /* find out my actualy range of rows and columns */ col_start = hypre_ParCSRBlockMatrixFirstColDiag(matrix); col_end = hypre_ParCSRBlockMatrixLastColDiag(matrix); hypre_MPI_Comm_rank(comm, &myid ); /* allocate space */ apart = hypre_CTAlloc(hypre_IJAssumedPart, 1, HYPRE_MEMORY_HOST); /* get my assumed partitioning - we want partitioning of the vector that the matrix multiplies - so we use the col start and end */ hypre_GetAssumedPartitionRowRange(comm, myid, 0, global_num_cols, &(apart->row_start), &(apart->row_end)); /*allocate some space for the partition of the assumed partition */ apart->length = 0; /*room for 10 owners of the assumed partition*/ apart->storage_length = 10; /*need to be >=1 */ apart->proc_list = hypre_TAlloc(HYPRE_Int, apart->storage_length, HYPRE_MEMORY_HOST); apart->row_start_list = hypre_TAlloc(HYPRE_BigInt, apart->storage_length, HYPRE_MEMORY_HOST); apart->row_end_list = hypre_TAlloc(HYPRE_BigInt, apart->storage_length, HYPRE_MEMORY_HOST); /* now we want to reconcile our actual partition with the assumed partition */ hypre_LocateAssumedPartition(comm, col_start, col_end, 0, global_num_cols, apart, myid); /* this partition will be saved in the matrix data structure until the matrix * is destroyed */ hypre_ParCSRBlockMatrixAssumedPartition(matrix) = apart; return hypre_error_flag; } /*-------------------------------------------------------------------- * hypre_ParCSRMatrixDestroyAssumedPartition *--------------------------------------------------------------------*/ HYPRE_Int hypre_ParCSRBlockMatrixDestroyAssumedPartition( hypre_ParCSRBlockMatrix *matrix ) { hypre_IJAssumedPart *apart; apart = hypre_ParCSRMatrixAssumedPartition(matrix); if (apart->storage_length > 0) { hypre_TFree(apart->proc_list, HYPRE_MEMORY_HOST); hypre_TFree(apart->row_start_list, HYPRE_MEMORY_HOST); hypre_TFree(apart->row_end_list, HYPRE_MEMORY_HOST); hypre_TFree(apart->sort_index, HYPRE_MEMORY_HOST); } hypre_TFree(apart, HYPRE_MEMORY_HOST); return (0); } hypre-2.33.0/src/parcsr_block_mv/par_csr_block_interp.c000066400000000000000000007665341477326011500232460ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "_hypre_parcsr_block_mv.h" /*--------------------------------------------------------------------------- * hypre_BoomerAMGBlockBuildInterp This is the block version of classical R-S interpolation. We use the complete blocks of A (not just the diagonals of these blocks). A and P are now Block matrices. The Strength matrix S is not as it gives nodal strengths. CF_marker is size number of nodes. add_weak_to_diag 0 = don't add weak connections to diag (distribute instead) 1 = do add *--------------------------------------------------------------------------*/ HYPRE_Int hypre_BoomerAMGBuildBlockInterp( hypre_ParCSRBlockMatrix *A, HYPRE_Int *CF_marker, hypre_ParCSRMatrix *S, HYPRE_BigInt *num_cpts_global, HYPRE_Int num_functions, HYPRE_Int *dof_func, HYPRE_Int debug_flag, HYPRE_Real trunc_factor, HYPRE_Int max_elmts, HYPRE_Int add_weak_to_diag, hypre_ParCSRBlockMatrix **P_ptr ) { HYPRE_UNUSED_VAR(dof_func); MPI_Comm comm = hypre_ParCSRBlockMatrixComm(A); hypre_ParCSRCommPkg *comm_pkg = hypre_ParCSRBlockMatrixCommPkg(A); hypre_ParCSRCommHandle *comm_handle; hypre_CSRBlockMatrix *A_diag = hypre_ParCSRBlockMatrixDiag(A); HYPRE_Real *A_diag_data = hypre_CSRBlockMatrixData(A_diag); HYPRE_Int *A_diag_i = hypre_CSRBlockMatrixI(A_diag); HYPRE_Int *A_diag_j = hypre_CSRBlockMatrixJ(A_diag); HYPRE_Int block_size = hypre_CSRBlockMatrixBlockSize(A_diag); HYPRE_Int bnnz = block_size * block_size; hypre_CSRBlockMatrix *A_offd = hypre_ParCSRBlockMatrixOffd(A); HYPRE_Real *A_offd_data = hypre_CSRBlockMatrixData(A_offd); HYPRE_Int *A_offd_i = hypre_CSRBlockMatrixI(A_offd); HYPRE_Int *A_offd_j = hypre_CSRBlockMatrixJ(A_offd); HYPRE_Int num_cols_A_offd = hypre_CSRBlockMatrixNumCols(A_offd); HYPRE_BigInt *col_map_offd = hypre_ParCSRBlockMatrixColMapOffd(A); hypre_CSRMatrix *S_diag = hypre_ParCSRMatrixDiag(S); HYPRE_Int *S_diag_i = hypre_CSRMatrixI(S_diag); HYPRE_Int *S_diag_j = hypre_CSRMatrixJ(S_diag); hypre_CSRMatrix *S_offd = hypre_ParCSRMatrixOffd(S); HYPRE_Int *S_offd_i = hypre_CSRMatrixI(S_offd); HYPRE_Int *S_offd_j = hypre_CSRMatrixJ(S_offd); hypre_ParCSRBlockMatrix *P; HYPRE_BigInt *col_map_offd_P; HYPRE_Int *tmp_map_offd = NULL; HYPRE_Int *CF_marker_offd = NULL; hypre_CSRBlockMatrix *A_ext = NULL; HYPRE_Real *A_ext_data = NULL; HYPRE_Int *A_ext_i = NULL; HYPRE_BigInt *A_ext_j = NULL; hypre_CSRBlockMatrix *P_diag; hypre_CSRBlockMatrix *P_offd; HYPRE_Real *P_diag_data; HYPRE_Int *P_diag_i; HYPRE_Int *P_diag_j; HYPRE_Real *P_offd_data; HYPRE_Int *P_offd_i; HYPRE_Int *P_offd_j; HYPRE_Int P_diag_size, P_offd_size; HYPRE_Int *P_marker, *P_marker_offd; HYPRE_Int jj_counter, jj_counter_offd; HYPRE_Int *jj_count, *jj_count_offd = NULL; HYPRE_Int jj_begin_row, jj_begin_row_offd; HYPRE_Int jj_end_row, jj_end_row_offd; HYPRE_Int start_indexing = 0; /* start indexing for P_data at 0 */ HYPRE_Int n_fine = hypre_CSRBlockMatrixNumRows(A_diag); HYPRE_Int strong_f_marker; HYPRE_Int *fine_to_coarse; HYPRE_BigInt *fine_to_coarse_offd = NULL; HYPRE_Int *coarse_counter; HYPRE_Int coarse_shift; HYPRE_BigInt total_global_cpts, my_first_cpt; HYPRE_Int num_cols_P_offd; HYPRE_Int bd; HYPRE_Int i, i1, i2; HYPRE_Int j, jl, jj, jj1; HYPRE_Int kc; HYPRE_BigInt big_k; HYPRE_Int start; HYPRE_Int c_num; HYPRE_Int my_id; HYPRE_Int num_procs; HYPRE_Int num_threads; HYPRE_Int num_sends; HYPRE_Int index; HYPRE_Int ns, ne, size, rest; HYPRE_Int *int_buf_data = NULL; HYPRE_BigInt *big_buf_data = NULL; HYPRE_BigInt col_1 = hypre_ParCSRBlockMatrixFirstRowIndex(A); HYPRE_Int local_numrows = hypre_CSRBlockMatrixNumRows(A_diag); HYPRE_BigInt col_n = col_1 + (HYPRE_BigInt)local_numrows; HYPRE_Real wall_time = 0.0; /* for debugging instrumentation */ HYPRE_Real *identity_block; HYPRE_Real *zero_block; HYPRE_Real *diagonal_block; HYPRE_Real *sum_block; HYPRE_Real *distribute_block; hypre_MPI_Comm_size(comm, &num_procs); hypre_MPI_Comm_rank(comm, &my_id); /* num_threads = hypre_NumThreads(); */ num_threads = 1; if (num_functions > 1) { hypre_error_w_msg(HYPRE_ERROR_GENERIC, "Not implemented for num_functions > 1!"); } my_first_cpt = num_cpts_global[0]; if (my_id == (num_procs - 1)) { total_global_cpts = num_cpts_global[1]; } hypre_MPI_Bcast(&total_global_cpts, 1, HYPRE_MPI_BIG_INT, num_procs - 1, comm); /*------------------------------------------------------------------- * Get the CF_marker data for the off-processor columns *-------------------------------------------------------------------*/ if (debug_flag == 4) { wall_time = time_getWallclockSeconds(); } CF_marker_offd = hypre_CTAlloc(HYPRE_Int, num_cols_A_offd, HYPRE_MEMORY_HOST); if (!comm_pkg) { hypre_BlockMatvecCommPkgCreate(A); comm_pkg = hypre_ParCSRBlockMatrixCommPkg(A); } num_sends = hypre_ParCSRCommPkgNumSends(comm_pkg); int_buf_data = hypre_CTAlloc(HYPRE_Int, hypre_ParCSRCommPkgSendMapStart(comm_pkg, num_sends), HYPRE_MEMORY_HOST); index = 0; for (i = 0; i < num_sends; i++) { start = hypre_ParCSRCommPkgSendMapStart(comm_pkg, i); for (j = start; j < hypre_ParCSRCommPkgSendMapStart(comm_pkg, i + 1); j++) { int_buf_data[index++] = CF_marker[hypre_ParCSRCommPkgSendMapElmt(comm_pkg, j)]; } } /* we do not need the block version of comm handle - because CF_marker corresponds to the nodal matrix. This call populates CF_marker_offd */ comm_handle = hypre_ParCSRCommHandleCreate(11, comm_pkg, int_buf_data, CF_marker_offd); hypre_ParCSRCommHandleDestroy(comm_handle); if (debug_flag == 4) { wall_time = time_getWallclockSeconds() - wall_time; hypre_printf("Proc = %d Interp: Comm 1 CF_marker = %f\n", my_id, wall_time); fflush(NULL); } /*---------------------------------------------------------------------- * Get the ghost rows of A *---------------------------------------------------------------------*/ if (debug_flag == 4) { wall_time = time_getWallclockSeconds(); } if (num_procs > 1) { A_ext = hypre_ParCSRBlockMatrixExtractBExt(A, A, 1); A_ext_i = hypre_CSRBlockMatrixI(A_ext); A_ext_j = hypre_CSRBlockMatrixBigJ(A_ext); A_ext_data = hypre_CSRBlockMatrixData(A_ext); } index = 0; for (i = 0; i < num_cols_A_offd; i++) { for (j = A_ext_i[i]; j < A_ext_i[i + 1]; j++) { big_k = A_ext_j[j]; if (big_k >= col_1 && big_k < col_n) { A_ext_j[index] = big_k - col_1; /* for the data field we must get all of the block data */ for (bd = 0; bd < bnnz; bd++) { A_ext_data[index * bnnz + bd] = A_ext_data[j * bnnz + bd]; } index++; } else { kc = hypre_BigBinarySearch(col_map_offd, big_k, num_cols_A_offd); if (kc > -1) { A_ext_j[index] = (HYPRE_BigInt)(-kc - 1); for (bd = 0; bd < bnnz; bd++) { A_ext_data[index * bnnz + bd] = A_ext_data[j * bnnz + bd]; } index++; } } } A_ext_i[i] = index; } for (i = num_cols_A_offd; i > 0; i--) { A_ext_i[i] = A_ext_i[i - 1]; } if (num_procs > 1) { A_ext_i[0] = 0; } if (debug_flag == 4) { wall_time = time_getWallclockSeconds() - wall_time; hypre_printf("Proc = %d Interp: Comm 2 Get A_ext = %f\n", my_id, wall_time); fflush(NULL); } /*----------------------------------------------------------------------- * First Pass: Determine size of P and fill in fine_to_coarse mapping. *-----------------------------------------------------------------------*/ /*----------------------------------------------------------------------- * Intialize counters and allocate mapping vector. *-----------------------------------------------------------------------*/ coarse_counter = hypre_CTAlloc(HYPRE_Int, num_threads, HYPRE_MEMORY_HOST); jj_count = hypre_CTAlloc(HYPRE_Int, num_threads, HYPRE_MEMORY_HOST); jj_count_offd = hypre_CTAlloc(HYPRE_Int, num_threads, HYPRE_MEMORY_HOST); fine_to_coarse = hypre_CTAlloc(HYPRE_Int, n_fine, HYPRE_MEMORY_HOST); for (i = 0; i < n_fine; i++) { fine_to_coarse[i] = -1; } jj_counter = start_indexing; jj_counter_offd = start_indexing; /*----------------------------------------------------------------------- * Loop over fine grid. *-----------------------------------------------------------------------*/ for (j = 0; j < num_threads; j++) { size = n_fine / num_threads; rest = n_fine - size * num_threads; if (j < rest) { ns = j * size + j; ne = (j + 1) * size + j + 1; } else { ns = j * size + rest; ne = (j + 1) * size + rest; } /* loop over the fine grid points */ for (i = ns; i < ne; i++) { /*-------------------------------------------------------------------- * If i is a C-point, interpolation is the identity. Also set up * mapping vector (fine_to_coarse is the mapping vector). *--------------------------------------------------------------------*/ if (CF_marker[i] >= 0) { jj_count[j]++; fine_to_coarse[i] = coarse_counter[j]; coarse_counter[j]++; } /*-------------------------------------------------------------------- * If i is an F-point, interpolation is from the C-points that * strongly influence i. *--------------------------------------------------------------------*/ else { for (jj = S_diag_i[i]; jj < S_diag_i[i + 1]; jj++) { i1 = S_diag_j[jj]; if (CF_marker[i1] >= 0) { jj_count[j]++; } } if (num_procs > 1) { for (jj = S_offd_i[i]; jj < S_offd_i[i + 1]; jj++) { i1 = S_offd_j[jj]; if (CF_marker_offd[i1] >= 0) { jj_count_offd[j]++; } } } } } } /*----------------------------------------------------------------------- * Allocate arrays. *-----------------------------------------------------------------------*/ for (i = 0; i < num_threads - 1; i++) { coarse_counter[i + 1] += coarse_counter[i]; jj_count[i + 1] += jj_count[i]; jj_count_offd[i + 1] += jj_count_offd[i]; } i = num_threads - 1; jj_counter = jj_count[i]; jj_counter_offd = jj_count_offd[i]; P_diag_size = jj_counter; P_diag_i = hypre_CTAlloc(HYPRE_Int, n_fine + 1, HYPRE_MEMORY_HOST); P_diag_j = hypre_CTAlloc(HYPRE_Int, P_diag_size, HYPRE_MEMORY_HOST); /* we need to include the size of the blocks in the data size */ P_diag_data = hypre_CTAlloc(HYPRE_Real, P_diag_size * bnnz, HYPRE_MEMORY_HOST); P_diag_i[n_fine] = jj_counter; P_offd_size = jj_counter_offd; P_offd_i = hypre_CTAlloc(HYPRE_Int, n_fine + 1, HYPRE_MEMORY_HOST); P_offd_j = hypre_CTAlloc(HYPRE_Int, P_offd_size, HYPRE_MEMORY_HOST); /* we need to include the size of the blocks in the data size */ P_offd_data = hypre_CTAlloc(HYPRE_Real, P_offd_size * bnnz, HYPRE_MEMORY_HOST); /*----------------------------------------------------------------------- * Intialize some stuff. *-----------------------------------------------------------------------*/ jj_counter = start_indexing; jj_counter_offd = start_indexing; if (debug_flag == 4) { wall_time = time_getWallclockSeconds() - wall_time; hypre_printf("Proc = %d Interp: Internal work 1 = %f\n", my_id, wall_time); fflush(NULL); } /* we need a block identity and a block of zeros*/ identity_block = hypre_CTAlloc(HYPRE_Real, bnnz, HYPRE_MEMORY_HOST); zero_block = hypre_CTAlloc(HYPRE_Real, bnnz, HYPRE_MEMORY_HOST); for (i = 0; i < block_size; i++) { identity_block[i * block_size + i] = 1.0; } /* we also need a block to keep track of the diagonal values and a sum */ diagonal_block = hypre_CTAlloc(HYPRE_Real, bnnz, HYPRE_MEMORY_HOST); sum_block = hypre_CTAlloc(HYPRE_Real, bnnz, HYPRE_MEMORY_HOST); distribute_block = hypre_CTAlloc(HYPRE_Real, bnnz, HYPRE_MEMORY_HOST); /*----------------------------------------------------------------------- * Send and receive fine_to_coarse info. *-----------------------------------------------------------------------*/ if (debug_flag == 4) { wall_time = time_getWallclockSeconds(); } fine_to_coarse_offd = hypre_CTAlloc(HYPRE_BigInt, num_cols_A_offd, HYPRE_MEMORY_HOST); big_buf_data = hypre_CTAlloc(HYPRE_BigInt, hypre_ParCSRCommPkgSendMapStart(comm_pkg, num_sends), HYPRE_MEMORY_HOST); for (j = 0; j < num_threads; j++) { coarse_shift = 0; if (j > 0) { coarse_shift = coarse_counter[j - 1]; } size = n_fine / num_threads; rest = n_fine - size * num_threads; if (j < rest) { ns = j * size + j; ne = (j + 1) * size + j + 1; } else { ns = j * size + rest; ne = (j + 1) * size + rest; } for (i = ns; i < ne; i++) { fine_to_coarse[i] += coarse_shift; } } index = 0; for (i = 0; i < num_sends; i++) { start = hypre_ParCSRCommPkgSendMapStart(comm_pkg, i); for (j = start; j < hypre_ParCSRCommPkgSendMapStart(comm_pkg, i + 1); j++) big_buf_data[index++] = my_first_cpt + fine_to_coarse[hypre_ParCSRCommPkgSendMapElmt(comm_pkg, j)]; } /* again, we do not need to use the block version of comm handle since the fine to coarse mapping is size of the nodes */ comm_handle = hypre_ParCSRCommHandleCreate( 21, comm_pkg, big_buf_data, fine_to_coarse_offd); hypre_ParCSRCommHandleDestroy(comm_handle); if (debug_flag == 4) { wall_time = time_getWallclockSeconds() - wall_time; hypre_printf("Proc = %d Interp: Comm 4 FineToCoarse = %f\n", my_id, wall_time); fflush(NULL); } if (debug_flag == 4) { wall_time = time_getWallclockSeconds(); } /*----------------------------------------------------------------------- * Loop over fine grid points. *-----------------------------------------------------------------------*/ for (jl = 0; jl < num_threads; jl++) { size = n_fine / num_threads; rest = n_fine - size * num_threads; if (jl < rest) { ns = jl * size + jl; ne = (jl + 1) * size + jl + 1; } else { ns = jl * size + rest; ne = (jl + 1) * size + rest; } jj_counter = 0; if (jl > 0) { jj_counter = jj_count[jl - 1]; } jj_counter_offd = 0; if (jl > 0) { jj_counter_offd = jj_count_offd[jl - 1]; } P_marker = hypre_CTAlloc(HYPRE_Int, n_fine, HYPRE_MEMORY_HOST); P_marker_offd = hypre_CTAlloc(HYPRE_Int, num_cols_A_offd, HYPRE_MEMORY_HOST); for (i = 0; i < n_fine; i++) { P_marker[i] = -1; } for (i = 0; i < num_cols_A_offd; i++) { P_marker_offd[i] = -1; } strong_f_marker = -2; for (i = ns; i < ne; i++) { /*-------------------------------------------------------------------- * If i is a c-point, interpolation is the identity. *--------------------------------------------------------------------*/ if (CF_marker[i] >= 0) { P_diag_i[i] = jj_counter; P_diag_j[jj_counter] = fine_to_coarse[i]; /* P_diag_data[jj_counter] = one; */ hypre_CSRBlockMatrixBlockCopyData(identity_block, &P_diag_data[jj_counter * bnnz], 1.0, block_size); jj_counter++; } /*-------------------------------------------------------------------- * If i is an F-point, build interpolation. *--------------------------------------------------------------------*/ else { /* Diagonal part of P */ P_diag_i[i] = jj_counter; jj_begin_row = jj_counter; for (jj = S_diag_i[i]; jj < S_diag_i[i + 1]; jj++) { i1 = S_diag_j[jj]; /*-------------------------------------------------------------- * If neighbor i1 is a C-point, set column number in P_diag_j * and initialize interpolation weight to zero. *--------------------------------------------------------------*/ if (CF_marker[i1] >= 0) { P_marker[i1] = jj_counter; P_diag_j[jj_counter] = fine_to_coarse[i1]; /* P_diag_data[jj_counter] = zero; */ hypre_CSRBlockMatrixBlockCopyData(zero_block, &P_diag_data[jj_counter * bnnz], 1.0, block_size); jj_counter++; } /*-------------------------------------------------------------- * If neighbor i1 is an F-point, mark it as a strong F-point * whose connection needs to be distributed. *--------------------------------------------------------------*/ else if (CF_marker[i1] != -3) { P_marker[i1] = strong_f_marker; } } jj_end_row = jj_counter; /* Off-Diagonal part of P */ P_offd_i[i] = jj_counter_offd; jj_begin_row_offd = jj_counter_offd; if (num_procs > 1) { for (jj = S_offd_i[i]; jj < S_offd_i[i + 1]; jj++) { i1 = S_offd_j[jj]; /*----------------------------------------------------------- * If neighbor i1 is a C-point, set column number in P_offd_j * and initialize interpolation weight to zero. *-----------------------------------------------------------*/ if (CF_marker_offd[i1] >= 0) { P_marker_offd[i1] = jj_counter_offd; P_offd_j[jj_counter_offd] = i1; /* P_offd_data[jj_counter_offd] = zero; */ hypre_CSRBlockMatrixBlockCopyData(zero_block, &P_offd_data[jj_counter_offd * bnnz], 1.0, block_size); jj_counter_offd++; } /*----------------------------------------------------------- * If neighbor i1 is an F-point, mark it as a strong F-point * whose connection needs to be distributed. *-----------------------------------------------------------*/ else if (CF_marker_offd[i1] != -3) { P_marker_offd[i1] = strong_f_marker; } } } jj_end_row_offd = jj_counter_offd; /* get the diagonal block */ /* diagonal = A_diag_data[A_diag_i[i]]; */ hypre_CSRBlockMatrixBlockCopyData(&A_diag_data[A_diag_i[i]*bnnz], diagonal_block, 1.0, block_size); /* Here we go through the neighborhood of this grid point */ /* Loop over ith row of A. First, the diagonal part of A */ for (jj = A_diag_i[i] + 1; jj < A_diag_i[i + 1]; jj++) { i1 = A_diag_j[jj]; /*-------------------------------------------------------------- * Case 1: neighbor i1 is a C-point and strongly influences i, * accumulate a_{i,i1} into the interpolation weight. *--------------------------------------------------------------*/ if (P_marker[i1] >= jj_begin_row) { /* P_diag_data[P_marker[i1]] += A_diag_data[jj]; */ hypre_CSRBlockMatrixBlockAddAccumulate(&A_diag_data[jj * bnnz], &P_diag_data[P_marker[i1]*bnnz], block_size); } /*-------------------------------------------------------------- * Case 2: neighbor i1 is an F-point and strongly influences i, * distribute a_{i,i1} to C-points that strongly infuence i. * Note: currently no distribution to the diagonal in this case. *--------------------------------------------------------------*/ else if (P_marker[i1] == strong_f_marker || (!add_weak_to_diag && CF_marker[i1] != -3)) { /* initialize sum to zero */ /* sum = zero; */ hypre_CSRBlockMatrixBlockCopyData(zero_block, sum_block, 1.0, block_size); /*----------------------------------------------------------- * Loop over row of A for point i1 and calculate the sum * of the connections to c-points that strongly influence i. *-----------------------------------------------------------*/ /* Diagonal block part of row i1 */ for (jj1 = A_diag_i[i1]; jj1 < A_diag_i[i1 + 1]; jj1++) { i2 = A_diag_j[jj1]; if (P_marker[i2] >= jj_begin_row) { /* add diag data to sum */ /* sum += A_diag_data[jj1]; */ hypre_CSRBlockMatrixBlockAddAccumulate(&A_diag_data[jj1 * bnnz], sum_block, block_size); } } /* Off-Diagonal block part of row i1 */ if (num_procs > 1) { for (jj1 = A_offd_i[i1]; jj1 < A_offd_i[i1 + 1]; jj1++) { i2 = A_offd_j[jj1]; if (P_marker_offd[i2] >= jj_begin_row_offd ) { /* add off diag data to sum */ /*sum += A_offd_data[jj1];*/ hypre_CSRBlockMatrixBlockAddAccumulate(&A_offd_data[jj1 * bnnz], sum_block, block_size); } } } /* check whether sum_block is singular */ /* distribute = A_diag_data[jj] / sum;*/ /* here we want: A_diag_data * sum^(-1) */ /* note that results are uneffected for most problems if we do sum^(-1) * A_diag_data - but it seems to matter a little for very non-sym */ if (hypre_CSRBlockMatrixBlockMultInv(sum_block, &A_diag_data[jj * bnnz], distribute_block, block_size) == 0) { /*----------------------------------------------------------- * Loop over row of A for point i1 and do the distribution. *-----------------------------------------------------------*/ /* Diagonal block part of row i1 */ for (jj1 = A_diag_i[i1]; jj1 < A_diag_i[i1 + 1]; jj1++) { i2 = A_diag_j[jj1]; if (P_marker[i2] >= jj_begin_row ) { /* P_diag_data[P_marker[i2]] += distribute * A_diag_data[jj1];*/ /* multiply - result in sum_block */ hypre_CSRBlockMatrixBlockMultAdd(distribute_block, &A_diag_data[jj1 * bnnz], 0.0, sum_block, block_size); /* add result to p_diag_data */ hypre_CSRBlockMatrixBlockAddAccumulate(sum_block, &P_diag_data[P_marker[i2]*bnnz], block_size); } } /* Off-Diagonal block part of row i1 */ if (num_procs > 1) { for (jj1 = A_offd_i[i1]; jj1 < A_offd_i[i1 + 1]; jj1++) { i2 = A_offd_j[jj1]; if (P_marker_offd[i2] >= jj_begin_row_offd) { /* P_offd_data[P_marker_offd[i2]] += distribute * A_offd_data[jj1]; */ /* multiply - result in sum_block */ hypre_CSRBlockMatrixBlockMultAdd(distribute_block, &A_offd_data[jj1 * bnnz], 0.0, sum_block, block_size); /* add result to p_offd_data */ hypre_CSRBlockMatrixBlockAddAccumulate(sum_block, &P_offd_data[P_marker_offd[i2]*bnnz], block_size); } } } } else /* sum block is all zeros (or almost singular) - just add to diagonal */ { /* diagonal += A_diag_data[jj]; */ if (add_weak_to_diag) hypre_CSRBlockMatrixBlockAddAccumulate(&A_diag_data[jj * bnnz], diagonal_block, block_size); } } /*-------------------------------------------------------------- * Case 3: neighbor i1 weakly influences i, accumulate a_{i,i1} * into the diagonal. *--------------------------------------------------------------*/ else if (CF_marker[i1] != -3 && add_weak_to_diag) { /* diagonal += A_diag_data[jj];*/ hypre_CSRBlockMatrixBlockAddAccumulate(&A_diag_data[jj * bnnz], diagonal_block, block_size); } } /*---------------------------------------------------------------- * Still looping over ith row of A. Next, loop over the * off-diagonal part of A *---------------------------------------------------------------*/ if (num_procs > 1) { for (jj = A_offd_i[i]; jj < A_offd_i[i + 1]; jj++) { i1 = A_offd_j[jj]; /*-------------------------------------------------------------- * Case 1: neighbor i1 is a C-point and strongly influences i, * accumulate a_{i,i1} into the interpolation weight. *--------------------------------------------------------------*/ if (P_marker_offd[i1] >= jj_begin_row_offd) { /* P_offd_data[P_marker_offd[i1]] += A_offd_data[jj]; */ hypre_CSRBlockMatrixBlockAddAccumulate( &A_offd_data[jj * bnnz], &P_offd_data[P_marker_offd[i1]*bnnz], block_size); } /*------------------------------------------------------------ * Case 2: neighbor i1 is an F-point and strongly influences i, * distribute a_{i,i1} to C-points that strongly infuence i. * Note: currently no distribution to the diagonal in this case. *-----------------------------------------------------------*/ else if (P_marker_offd[i1] == strong_f_marker || (!add_weak_to_diag && CF_marker[i1] != -3)) { /* initialize sum to zero */ hypre_CSRBlockMatrixBlockCopyData(zero_block, sum_block, 1.0, block_size); /*--------------------------------------------------------- * Loop over row of A_ext for point i1 and calculate the sum * of the connections to c-points that strongly influence i. *---------------------------------------------------------*/ /* find row number */ c_num = A_offd_j[jj]; for (jj1 = A_ext_i[c_num]; jj1 < A_ext_i[c_num + 1]; jj1++) { i2 = (HYPRE_Int)A_ext_j[jj1]; if (i2 > -1) { /* in the diagonal block */ if (P_marker[i2] >= jj_begin_row) { /* sum += A_ext_data[jj1]; */ hypre_CSRBlockMatrixBlockAddAccumulate(&A_ext_data[jj1 * bnnz], sum_block, block_size); } } else { /* in the off_diagonal block */ if (P_marker_offd[-i2 - 1] >= jj_begin_row_offd) { /* sum += A_ext_data[jj1]; */ hypre_CSRBlockMatrixBlockAddAccumulate(&A_ext_data[jj1 * bnnz], sum_block, block_size); } } } /* check whether sum_block is singular */ /* distribute = A_offd_data[jj] / sum; */ /* here we want: A_offd_data * sum^(-1) */ if (hypre_CSRBlockMatrixBlockMultInv(sum_block, &A_offd_data[jj * bnnz], distribute_block, block_size) == 0) { /*--------------------------------------------------------- * Loop over row of A_ext for point i1 and do * the distribution. *--------------------------------------------------------*/ /* Diagonal block part of row i1 */ for (jj1 = A_ext_i[c_num]; jj1 < A_ext_i[c_num + 1]; jj1++) { i2 = (HYPRE_Int)A_ext_j[jj1]; if (i2 > -1) /* in the diagonal block */ { if (P_marker[i2] >= jj_begin_row) { /* P_diag_data[P_marker[i2]] += distribute * A_ext_data[jj1]; */ /* multiply - result in sum_block */ hypre_CSRBlockMatrixBlockMultAdd(distribute_block, &A_ext_data[jj1 * bnnz], 0.0, sum_block, block_size); /* add result to p_diag_data */ hypre_CSRBlockMatrixBlockAddAccumulate(sum_block, &P_diag_data[P_marker[i2]*bnnz], block_size); } } else { /* in the off_diagonal block */ if (P_marker_offd[-i2 - 1] >= jj_begin_row_offd) /*P_offd_data[P_marker_offd[-i2-1]] += distribute * A_ext_data[jj1];*/ { /* multiply - result in sum_block */ hypre_CSRBlockMatrixBlockMultAdd(distribute_block, &A_ext_data[jj1 * bnnz], 0.0, sum_block, block_size); /* add result to p_offd_data */ hypre_CSRBlockMatrixBlockAddAccumulate(sum_block, &P_offd_data[P_marker_offd[-i2 - 1]*bnnz], block_size); } } } } else /* sum block is all zeros - just add to diagonal */ { /* diagonal += A_offd_data[jj]; */ if (add_weak_to_diag) hypre_CSRBlockMatrixBlockAddAccumulate(&A_offd_data[jj * bnnz], diagonal_block, block_size); } } /*----------------------------------------------------------- * Case 3: neighbor i1 weakly influences i, accumulate a_{i,i1} * into the diagonal. *-----------------------------------------------------------*/ else if (CF_marker_offd[i1] != -3 && add_weak_to_diag) { /* diagonal += A_offd_data[jj]; */ hypre_CSRBlockMatrixBlockAddAccumulate(&A_offd_data[jj * bnnz], diagonal_block, block_size); } } } /*----------------------------------------------------------------- * Set interpolation weight by dividing by the diagonal. *-----------------------------------------------------------------*/ for (jj = jj_begin_row; jj < jj_end_row; jj++) { /* P_diag_data[jj] /= -diagonal; */ /* want diagonal^(-1)*P_diag_data */ /* do division - put in sum_block */ if ( hypre_CSRBlockMatrixBlockInvMult(diagonal_block, &P_diag_data[jj * bnnz], sum_block, block_size) == 0) { /* now copy to P_diag_data[jj] and make negative */ hypre_CSRBlockMatrixBlockCopyData(sum_block, &P_diag_data[jj * bnnz], -1.0, block_size); } else { /* hypre_printf(" Warning! singular diagonal block! Proc id %d row %d\n", my_id,i); */ /* just make P_diag_data negative since diagonal is singular) */ hypre_CSRBlockMatrixBlockCopyData(&P_diag_data[jj * bnnz], &P_diag_data[jj * bnnz], -1.0, block_size); } } for (jj = jj_begin_row_offd; jj < jj_end_row_offd; jj++) { /* P_offd_data[jj] /= -diagonal; */ /* do division - put in sum_block */ hypre_CSRBlockMatrixBlockInvMult(diagonal_block, &P_offd_data[jj * bnnz], sum_block, block_size); /* now copy to P_offd_data[jj] and make negative */ hypre_CSRBlockMatrixBlockCopyData(sum_block, &P_offd_data[jj * bnnz], -1.0, block_size); } } strong_f_marker--; P_offd_i[i + 1] = jj_counter_offd; } hypre_TFree(P_marker, HYPRE_MEMORY_HOST); hypre_TFree(P_marker_offd, HYPRE_MEMORY_HOST); } /* Now create P - as a block matrix */ P = hypre_ParCSRBlockMatrixCreate(comm, block_size, hypre_ParCSRBlockMatrixGlobalNumRows(A), total_global_cpts, hypre_ParCSRBlockMatrixColStarts(A), num_cpts_global, 0, P_diag_i[n_fine], P_offd_i[n_fine]); P_diag = hypre_ParCSRBlockMatrixDiag(P); hypre_CSRBlockMatrixData(P_diag) = P_diag_data; hypre_CSRBlockMatrixI(P_diag) = P_diag_i; hypre_CSRBlockMatrixJ(P_diag) = P_diag_j; P_offd = hypre_ParCSRBlockMatrixOffd(P); hypre_CSRBlockMatrixData(P_offd) = P_offd_data; hypre_CSRBlockMatrixI(P_offd) = P_offd_i; hypre_CSRBlockMatrixJ(P_offd) = P_offd_j; /* Compress P, removing coefficients smaller than trunc_factor * Max */ if (trunc_factor != 0.0 || max_elmts > 0) { hypre_BoomerAMGBlockInterpTruncation(P, trunc_factor, max_elmts); P_diag_data = hypre_CSRBlockMatrixData(P_diag); P_diag_i = hypre_CSRBlockMatrixI(P_diag); P_diag_j = hypre_CSRBlockMatrixJ(P_diag); P_offd_data = hypre_CSRBlockMatrixData(P_offd); P_offd_i = hypre_CSRBlockMatrixI(P_offd); P_offd_j = hypre_CSRBlockMatrixJ(P_offd); P_diag_size = P_diag_i[n_fine]; P_offd_size = P_offd_i[n_fine]; } num_cols_P_offd = 0; if (P_offd_size) { P_marker = hypre_CTAlloc(HYPRE_Int, num_cols_A_offd, HYPRE_MEMORY_HOST); for (i = 0; i < num_cols_A_offd; i++) { P_marker[i] = 0; } num_cols_P_offd = 0; for (i = 0; i < P_offd_size; i++) { index = P_offd_j[i]; if (!P_marker[index]) { num_cols_P_offd++; P_marker[index] = 1; } } col_map_offd_P = hypre_CTAlloc(HYPRE_BigInt, num_cols_P_offd, HYPRE_MEMORY_HOST); tmp_map_offd = hypre_CTAlloc(HYPRE_Int, num_cols_P_offd, HYPRE_MEMORY_HOST); index = 0; for (i = 0; i < num_cols_P_offd; i++) { while (P_marker[index] == 0) { index++; } tmp_map_offd[i] = index++; } for (i = 0; i < P_offd_size; i++) P_offd_j[i] = hypre_BinarySearch(tmp_map_offd, P_offd_j[i], num_cols_P_offd); hypre_TFree(P_marker, HYPRE_MEMORY_HOST); } for (i = 0; i < n_fine; i++) if (CF_marker[i] == -3) { CF_marker[i] = -1; } if (num_cols_P_offd) { hypre_ParCSRBlockMatrixColMapOffd(P) = col_map_offd_P; hypre_CSRBlockMatrixNumCols(P_offd) = num_cols_P_offd; } /* use block version */ hypre_GetCommPkgBlockRTFromCommPkgBlockA(P, A, tmp_map_offd, fine_to_coarse_offd); *P_ptr = P; hypre_TFree(zero_block, HYPRE_MEMORY_HOST); hypre_TFree(identity_block, HYPRE_MEMORY_HOST); hypre_TFree(diagonal_block, HYPRE_MEMORY_HOST); hypre_TFree(sum_block, HYPRE_MEMORY_HOST); hypre_TFree(distribute_block, HYPRE_MEMORY_HOST); hypre_TFree(CF_marker_offd, HYPRE_MEMORY_HOST); hypre_TFree(tmp_map_offd, HYPRE_MEMORY_HOST); hypre_TFree(int_buf_data, HYPRE_MEMORY_HOST); hypre_TFree(big_buf_data, HYPRE_MEMORY_HOST); hypre_TFree(fine_to_coarse, HYPRE_MEMORY_HOST); hypre_TFree(fine_to_coarse_offd, HYPRE_MEMORY_HOST); hypre_TFree(coarse_counter, HYPRE_MEMORY_HOST); hypre_TFree(jj_count, HYPRE_MEMORY_HOST); hypre_TFree(jj_count_offd, HYPRE_MEMORY_HOST); if (num_procs > 1) { hypre_CSRBlockMatrixDestroy(A_ext); } return hypre_error_flag; } /* 8/07 - not sure that it is appropriate to scale by the blocks - for now it is commented out - may want to change this or do something different */ HYPRE_Int hypre_BoomerAMGBlockInterpTruncation( hypre_ParCSRBlockMatrix *P, HYPRE_Real trunc_factor, HYPRE_Int max_elmts) { hypre_CSRBlockMatrix *P_diag = hypre_ParCSRBlockMatrixDiag(P); HYPRE_Int *P_diag_i = hypre_CSRBlockMatrixI(P_diag); HYPRE_Int *P_diag_j = hypre_CSRBlockMatrixJ(P_diag); HYPRE_Real *P_diag_data = hypre_CSRBlockMatrixData(P_diag); HYPRE_Int *P_diag_j_new; HYPRE_Real *P_diag_data_new; hypre_CSRBlockMatrix *P_offd = hypre_ParCSRBlockMatrixOffd(P); HYPRE_Int *P_offd_i = hypre_CSRBlockMatrixI(P_offd); HYPRE_Int *P_offd_j = hypre_CSRBlockMatrixJ(P_offd); HYPRE_Real *P_offd_data = hypre_CSRBlockMatrixData(P_offd); HYPRE_Int *P_offd_j_new; HYPRE_Real *P_offd_data_new; HYPRE_Int block_size = hypre_CSRBlockMatrixBlockSize(P_diag); HYPRE_Int bnnz = block_size * block_size; HYPRE_Int n_fine = hypre_CSRBlockMatrixNumRows(P_diag); HYPRE_Int num_cols = hypre_CSRBlockMatrixNumCols(P_diag); HYPRE_Int i, j, start_j, k; HYPRE_Int ierr = 0; HYPRE_Int next_open = 0; HYPRE_Int now_checking = 0; HYPRE_Int num_lost = 0; HYPRE_Int next_open_offd = 0; HYPRE_Int now_checking_offd = 0; HYPRE_Int num_lost_offd = 0; HYPRE_Int P_diag_size; HYPRE_Int P_offd_size; HYPRE_Real max_coef, tmp; HYPRE_Real *row_sum; HYPRE_Real *scale; HYPRE_Real *out_block; HYPRE_Int cnt, cnt_diag, cnt_offd; HYPRE_Int num_elmts; /* for now we will use the frobenius norm to determine whether to keep a block or not - so norm_type = 1*/ row_sum = hypre_CTAlloc(HYPRE_Real, bnnz, HYPRE_MEMORY_HOST); scale = hypre_CTAlloc(HYPRE_Real, bnnz, HYPRE_MEMORY_HOST); out_block = hypre_CTAlloc(HYPRE_Real, bnnz, HYPRE_MEMORY_HOST); if (trunc_factor > 0) { /* go through each row */ for (i = 0; i < n_fine; i++) { max_coef = 0.0; /* diag */ for (j = P_diag_i[i]; j < P_diag_i[i + 1]; j++) { hypre_CSRBlockMatrixBlockNorm(1, &P_diag_data[j * bnnz], &tmp, block_size); max_coef = (max_coef < tmp) ? tmp : max_coef; } /* off_diag */ for (j = P_offd_i[i]; j < P_offd_i[i + 1]; j++) { hypre_CSRBlockMatrixBlockNorm(1, &P_offd_data[j * bnnz], &tmp, block_size); max_coef = (max_coef < tmp) ? tmp : max_coef; } max_coef *= trunc_factor; start_j = P_diag_i[i]; P_diag_i[i] -= num_lost; /* set scale and row sum to zero */ hypre_CSRBlockMatrixBlockSetScalar(scale, 0.0, block_size); hypre_CSRBlockMatrixBlockSetScalar(row_sum, 0.0, block_size); for (j = start_j; j < P_diag_i[i + 1]; j++) { /* row_sum += P_diag_data[now_checking];*/ hypre_CSRBlockMatrixBlockAddAccumulate(&P_diag_data[now_checking * bnnz], row_sum, block_size); hypre_CSRBlockMatrixBlockNorm(1, &P_diag_data[now_checking * bnnz], &tmp, block_size); if ( tmp < max_coef) { num_lost++; now_checking++; } else { /* scale += P_diag_data[now_checking]; */ hypre_CSRBlockMatrixBlockAddAccumulate(&P_diag_data[now_checking * bnnz], scale, block_size); /* P_diag_data[next_open] = P_diag_data[now_checking]; */ hypre_CSRBlockMatrixBlockCopyData( &P_diag_data[now_checking * bnnz], &P_diag_data[next_open * bnnz], 1.0, block_size); P_diag_j[next_open] = P_diag_j[now_checking]; now_checking++; next_open++; } } start_j = P_offd_i[i]; P_offd_i[i] -= num_lost_offd; for (j = start_j; j < P_offd_i[i + 1]; j++) { /* row_sum += P_offd_data[now_checking_offd]; */ hypre_CSRBlockMatrixBlockAddAccumulate(&P_offd_data[now_checking_offd * bnnz], row_sum, block_size); hypre_CSRBlockMatrixBlockNorm(1, &P_offd_data[now_checking_offd * bnnz], &tmp, block_size); if ( tmp < max_coef) { num_lost_offd++; now_checking_offd++; } else { /* scale += P_offd_data[now_checking_offd]; */ hypre_CSRBlockMatrixBlockAddAccumulate(&P_offd_data[now_checking_offd * bnnz], scale, block_size); /* P_offd_data[next_open_offd] = P_offd_data[now_checking_offd];*/ hypre_CSRBlockMatrixBlockCopyData( &P_offd_data[now_checking_offd * bnnz], &P_offd_data[next_open_offd * bnnz], 1.0, block_size); P_offd_j[next_open_offd] = P_offd_j[now_checking_offd]; now_checking_offd++; next_open_offd++; } } /* normalize row of P */ #if 0 /* out_block = row_sum/scale; */ if (hypre_CSRBlockMatrixBlockInvMult(scale, row_sum, out_block, block_size) == 0) { for (j = P_diag_i[i]; j < (P_diag_i[i + 1] - num_lost); j++) { /* P_diag_data[j] *= out_block; */ /* put mult result in row_sum */ hypre_CSRBlockMatrixBlockMultAdd(out_block, &P_diag_data[j * bnnz], 0.0, row_sum, block_size); /* add to P_diag_data */ hypre_CSRBlockMatrixBlockAddAccumulate(row_sum, &P_diag_data[j * bnnz], block_size); } for (j = P_offd_i[i]; j < (P_offd_i[i + 1] - num_lost_offd); j++) { /* P_offd_data[j] *= out_block; */ /* put mult result in row_sum */ hypre_CSRBlockMatrixBlockMultAdd(out_block, &P_offd_data[j * bnnz], 0.0, row_sum, block_size); /* add to to P_offd_data */ hypre_CSRBlockMatrixBlockAddAccumulate(row_sum, &P_offd_data[j * bnnz], block_size); } } #endif } P_diag_i[n_fine] -= num_lost; P_offd_i[n_fine] -= num_lost_offd; } if (max_elmts > 0) { HYPRE_Int P_mxnum, cnt1, rowlength; HYPRE_Int *P_aux_j; HYPRE_Real *P_aux_data; HYPRE_Real *norm_array; rowlength = 0; if (n_fine) { rowlength = P_diag_i[1] + P_offd_i[1]; } P_mxnum = rowlength; for (i = 1; i < n_fine; i++) { rowlength = P_diag_i[i + 1] - P_diag_i[i] + P_offd_i[i + 1] - P_offd_i[i]; if (rowlength > P_mxnum) { P_mxnum = rowlength; } } if (P_mxnum > max_elmts) { P_aux_j = hypre_CTAlloc(HYPRE_Int, P_mxnum, HYPRE_MEMORY_HOST); P_aux_data = hypre_CTAlloc(HYPRE_Real, P_mxnum * bnnz, HYPRE_MEMORY_HOST); cnt_diag = 0; cnt_offd = 0; for (i = 0; i < n_fine; i++) { hypre_CSRBlockMatrixBlockSetScalar(row_sum, 0.0, block_size); /*row_sum = 0; */ num_elmts = P_diag_i[i + 1] - P_diag_i[i] + P_offd_i[i + 1] - P_offd_i[i]; if (max_elmts < num_elmts) { cnt = 0; for (j = P_diag_i[i]; j < P_diag_i[i + 1]; j++) { P_aux_j[cnt] = P_diag_j[j]; /*P_aux_data[cnt++] = P_diag_data[j];*/ hypre_CSRBlockMatrixBlockCopyData(&P_diag_data[j * bnnz], &P_aux_data[cnt * bnnz], 1.0, block_size); cnt++; /*row_sum += P_diag_data[j];*/ hypre_CSRBlockMatrixBlockAddAccumulate(&P_diag_data[j * bnnz], row_sum, block_size); } num_lost += cnt; cnt1 = cnt; for (j = P_offd_i[i]; j < P_offd_i[i + 1]; j++) { P_aux_j[cnt] = P_offd_j[j] + num_cols; /*P_aux_data[cnt++] = P_offd_data[j];*/ hypre_CSRBlockMatrixBlockCopyData(&P_offd_data[j * bnnz], &P_aux_data[cnt * bnnz], 1.0, block_size); cnt++; /*row_sum += P_offd_data[j];*/ hypre_CSRBlockMatrixBlockAddAccumulate(&P_offd_data[j * bnnz], row_sum, block_size); } num_lost_offd += cnt - cnt1; /* sort data */ norm_array = hypre_CTAlloc(HYPRE_Real, cnt, HYPRE_MEMORY_HOST); for (j = 0; j < cnt; j++) { hypre_CSRBlockMatrixBlockNorm(1, &P_aux_data[j * bnnz], &norm_array[j], block_size); } hypre_block_qsort(P_aux_j, norm_array, P_aux_data, block_size, 0, cnt - 1); hypre_TFree(norm_array, HYPRE_MEMORY_HOST); /* scale = 0; */ hypre_CSRBlockMatrixBlockSetScalar(scale, 0.0, block_size); P_diag_i[i] = cnt_diag; P_offd_i[i] = cnt_offd; for (j = 0; j < max_elmts; j++) { /* scale += P_aux_data[j];*/ hypre_CSRBlockMatrixBlockAddAccumulate(&P_aux_data[j * bnnz], scale, block_size); if (P_aux_j[j] < num_cols) { P_diag_j[cnt_diag] = P_aux_j[j]; /*P_diag_data[cnt_diag++] = P_aux_data[j];*/ hypre_CSRBlockMatrixBlockCopyData(&P_aux_data[j * bnnz], &P_diag_data[cnt_diag * bnnz], 1.0, block_size); cnt_diag++; } else { P_offd_j[cnt_offd] = P_aux_j[j] - num_cols; /*P_offd_data[cnt_offd++] = P_aux_data[j];*/ hypre_CSRBlockMatrixBlockCopyData(&P_aux_data[j * bnnz], &P_offd_data[cnt_offd * bnnz], 1.0, block_size); cnt_offd++; } } num_lost -= cnt_diag - P_diag_i[i]; num_lost_offd -= cnt_offd - P_offd_i[i]; /* normalize row of P */ /* out_block = row_sum/scale; */ /*if (scale != 0.)*/ #if 0 if (hypre_CSRBlockMatrixBlockInvMult(scale, row_sum, out_block, block_size) == 0) { for (j = P_diag_i[i]; j < cnt_diag; j++) { /* P_diag_data[j] *= out_block; */ /* put mult result in row_sum */ hypre_CSRBlockMatrixBlockMultAdd(out_block, &P_diag_data[j * bnnz], 0.0, row_sum, block_size); /* add to P_diag_data */ hypre_CSRBlockMatrixBlockAddAccumulate(row_sum, &P_diag_data[j * bnnz], block_size); } for (j = P_offd_i[i]; j < cnt_offd; j++) { /* P_offd_data[j] *= out_block; */ /* put mult result in row_sum */ hypre_CSRBlockMatrixBlockMultAdd(out_block, &P_offd_data[j * bnnz], 0.0, row_sum, block_size); /* add to to P_offd_data */ hypre_CSRBlockMatrixBlockAddAccumulate(row_sum, &P_offd_data[j * bnnz], block_size); } } #endif } else { if (P_diag_i[i] != cnt_diag) { start_j = P_diag_i[i]; P_diag_i[i] = cnt_diag; for (j = start_j; j < P_diag_i[i + 1]; j++) { P_diag_j[cnt_diag] = P_diag_j[j]; /*P_diag_data[cnt_diag++] = P_diag_data[j];*/ hypre_CSRBlockMatrixBlockCopyData(&P_diag_data[j * bnnz], &P_diag_data[cnt_diag * bnnz], 1.0, block_size); cnt_diag++; } } else { cnt_diag += P_diag_i[i + 1] - P_diag_i[i]; } if (P_offd_i[i] != cnt_offd) { start_j = P_offd_i[i]; P_offd_i[i] = cnt_offd; for (j = start_j; j < P_offd_i[i + 1]; j++) { P_offd_j[cnt_offd] = P_offd_j[j]; /*P_offd_data[cnt_offd++] = P_offd_data[j];*/ hypre_CSRBlockMatrixBlockCopyData(&P_offd_data[j * bnnz], &P_offd_data[cnt_offd * bnnz], 1.0, block_size); cnt_offd++; } } else { cnt_offd += P_offd_i[i + 1] - P_offd_i[i]; } } } P_diag_i[n_fine] = cnt_diag; P_offd_i[n_fine] = cnt_offd; hypre_TFree(P_aux_j, HYPRE_MEMORY_HOST); hypre_TFree(P_aux_data, HYPRE_MEMORY_HOST); } } if (num_lost) { P_diag_size = P_diag_i[n_fine]; P_diag_j_new = hypre_CTAlloc(HYPRE_Int, P_diag_size, HYPRE_MEMORY_HOST); P_diag_data_new = hypre_CTAlloc(HYPRE_Real, P_diag_size * bnnz, HYPRE_MEMORY_HOST); for (i = 0; i < P_diag_size; i++) { P_diag_j_new[i] = P_diag_j[i]; for (k = 0; k < bnnz; k++) { P_diag_data_new[i * bnnz + k] = P_diag_data[i * bnnz + k]; } } hypre_TFree(P_diag_j, HYPRE_MEMORY_HOST); hypre_TFree(P_diag_data, HYPRE_MEMORY_HOST); hypre_CSRMatrixJ(P_diag) = P_diag_j_new; hypre_CSRMatrixData(P_diag) = P_diag_data_new; hypre_CSRMatrixNumNonzeros(P_diag) = P_diag_size; } if (num_lost_offd) { P_offd_size = P_offd_i[n_fine]; P_offd_j_new = hypre_CTAlloc(HYPRE_Int, P_offd_size, HYPRE_MEMORY_HOST); P_offd_data_new = hypre_CTAlloc(HYPRE_Real, P_offd_size * bnnz, HYPRE_MEMORY_HOST); for (i = 0; i < P_offd_size; i++) { P_offd_j_new[i] = P_offd_j[i]; for (k = 0; k < bnnz; k++) { P_offd_data_new[i * bnnz + k] = P_offd_data[i * bnnz + k]; } } hypre_TFree(P_offd_j, HYPRE_MEMORY_HOST); hypre_TFree(P_offd_data, HYPRE_MEMORY_HOST); hypre_CSRMatrixJ(P_offd) = P_offd_j_new; hypre_CSRMatrixData(P_offd) = P_offd_data_new; hypre_CSRMatrixNumNonzeros(P_offd) = P_offd_size; } hypre_TFree(row_sum, HYPRE_MEMORY_HOST); hypre_TFree(scale, HYPRE_MEMORY_HOST); hypre_TFree(out_block, HYPRE_MEMORY_HOST); return ierr; } /*-----------------------------------------------*/ /* compare on w, move v and blk_array */ void hypre_block_qsort( HYPRE_Int *v, HYPRE_Complex *w, HYPRE_Complex *blk_array, HYPRE_Int block_size, HYPRE_Int left, HYPRE_Int right ) { HYPRE_Int i, last; if (left >= right) { return; } hypre_swap2( v, w, left, (left + right) / 2); hypre_swap_blk(blk_array, block_size, left, (left + right) / 2); last = left; for (i = left + 1; i <= right; i++) if (hypre_cabs(w[i]) > hypre_cabs(w[left])) { hypre_swap2(v, w, ++last, i); hypre_swap_blk(blk_array, block_size, last, i); } hypre_swap2(v, w, left, last); hypre_swap_blk(blk_array, block_size, left, last); hypre_block_qsort(v, w, blk_array, block_size, left, last - 1); hypre_block_qsort(v, w, blk_array, block_size, last + 1, right); } void hypre_swap_blk( HYPRE_Complex *v, HYPRE_Int block_size, HYPRE_Int i, HYPRE_Int j ) { HYPRE_Int bnnz = block_size * block_size; HYPRE_Real *temp; temp = hypre_CTAlloc(HYPRE_Real, bnnz, HYPRE_MEMORY_HOST); /*temp = v[i];*/ hypre_CSRBlockMatrixBlockCopyData(&v[i * bnnz], temp, 1.0, block_size); /*v[i] = v[j];*/ hypre_CSRBlockMatrixBlockCopyData(&v[j * bnnz], &v[i * bnnz], 1.0, block_size); /* v[j] = temp; */ hypre_CSRBlockMatrixBlockCopyData(temp, &v[j * bnnz], 1.0, block_size); hypre_TFree(temp, HYPRE_MEMORY_HOST); } /*--------------------------------------------------------------------------- * hypre_BoomerAMGBlockBuildInterpDiag This is the block version of classical R-S interpolation. We use just the diagonals of these blocks. A and P are now Block matrices. The Strength matrix S is not as it gives nodal strengths. CF_marker is size number of nodes. add_weak_to_diag 0 = don't add weak connections to diag (distribute instead) 1 = do add *--------------------------------------------------------------------------*/ HYPRE_Int hypre_BoomerAMGBuildBlockInterpDiag( hypre_ParCSRBlockMatrix *A, HYPRE_Int *CF_marker, hypre_ParCSRMatrix *S, HYPRE_BigInt *num_cpts_global, HYPRE_Int num_functions, HYPRE_Int *dof_func, HYPRE_Int debug_flag, HYPRE_Real trunc_factor, HYPRE_Int max_elmts, HYPRE_Int add_weak_to_diag, hypre_ParCSRBlockMatrix **P_ptr) { HYPRE_UNUSED_VAR(dof_func); MPI_Comm comm = hypre_ParCSRBlockMatrixComm(A); hypre_ParCSRCommPkg *comm_pkg = hypre_ParCSRBlockMatrixCommPkg(A); hypre_ParCSRCommHandle *comm_handle; hypre_CSRBlockMatrix *A_diag = hypre_ParCSRBlockMatrixDiag(A); HYPRE_Real *A_diag_data = hypre_CSRBlockMatrixData(A_diag); HYPRE_Int *A_diag_i = hypre_CSRBlockMatrixI(A_diag); HYPRE_Int *A_diag_j = hypre_CSRBlockMatrixJ(A_diag); HYPRE_Int block_size = hypre_CSRBlockMatrixBlockSize(A_diag); HYPRE_Int bnnz = block_size * block_size; hypre_CSRBlockMatrix *A_offd = hypre_ParCSRBlockMatrixOffd(A); HYPRE_Real *A_offd_data = hypre_CSRBlockMatrixData(A_offd); HYPRE_Int *A_offd_i = hypre_CSRBlockMatrixI(A_offd); HYPRE_Int *A_offd_j = hypre_CSRBlockMatrixJ(A_offd); HYPRE_Int num_cols_A_offd = hypre_CSRBlockMatrixNumCols(A_offd); HYPRE_BigInt *col_map_offd = hypre_ParCSRBlockMatrixColMapOffd(A); hypre_CSRMatrix *S_diag = hypre_ParCSRMatrixDiag(S); HYPRE_Int *S_diag_i = hypre_CSRMatrixI(S_diag); HYPRE_Int *S_diag_j = hypre_CSRMatrixJ(S_diag); hypre_CSRMatrix *S_offd = hypre_ParCSRMatrixOffd(S); HYPRE_Int *S_offd_i = hypre_CSRMatrixI(S_offd); HYPRE_Int *S_offd_j = hypre_CSRMatrixJ(S_offd); hypre_ParCSRBlockMatrix *P; HYPRE_BigInt *col_map_offd_P; HYPRE_Int *tmp_map_offd = NULL; HYPRE_Int *CF_marker_offd = NULL; hypre_CSRBlockMatrix *A_ext = NULL; HYPRE_Real *A_ext_data = NULL; HYPRE_Int *A_ext_i = NULL; HYPRE_BigInt *A_ext_j = NULL; hypre_CSRBlockMatrix *P_diag; hypre_CSRBlockMatrix *P_offd; HYPRE_Real *P_diag_data; HYPRE_Int *P_diag_i; HYPRE_Int *P_diag_j; HYPRE_Real *P_offd_data; HYPRE_Int *P_offd_i; HYPRE_Int *P_offd_j; HYPRE_Int P_diag_size, P_offd_size; HYPRE_Int *P_marker, *P_marker_offd = NULL; HYPRE_Int jj_counter, jj_counter_offd; HYPRE_Int *jj_count, *jj_count_offd = NULL; HYPRE_Int jj_begin_row, jj_begin_row_offd; HYPRE_Int jj_end_row, jj_end_row_offd; HYPRE_Int start_indexing = 0; /* start indexing for P_data at 0 */ HYPRE_Int n_fine = hypre_CSRBlockMatrixNumRows(A_diag); HYPRE_Int strong_f_marker; HYPRE_Int *fine_to_coarse; HYPRE_BigInt *fine_to_coarse_offd = NULL; HYPRE_Int *coarse_counter; HYPRE_Int coarse_shift; HYPRE_BigInt my_first_cpt, total_global_cpts; HYPRE_Int num_cols_P_offd; HYPRE_Int bd; HYPRE_Int i, i1, i2; HYPRE_Int j, jl, jj, jj1; HYPRE_Int kc; HYPRE_BigInt big_k; HYPRE_Int start; HYPRE_Int c_num; HYPRE_Int my_id; HYPRE_Int num_procs; HYPRE_Int num_threads; HYPRE_Int num_sends; HYPRE_Int index; HYPRE_Int ns, ne, size, rest; HYPRE_Int *int_buf_data = NULL; HYPRE_BigInt *big_buf_data = NULL; HYPRE_BigInt col_1 = hypre_ParCSRBlockMatrixFirstRowIndex(A); HYPRE_Int local_numrows = hypre_CSRBlockMatrixNumRows(A_diag); HYPRE_BigInt col_n = col_1 + (HYPRE_BigInt)local_numrows; HYPRE_Real wall_time = 0.0; /* for debugging instrumentation */ HYPRE_Real *identity_block; HYPRE_Real *zero_block; HYPRE_Real *diagonal_block; HYPRE_Real *sum_block; HYPRE_Real *distribute_block; HYPRE_Real *sign; hypre_MPI_Comm_size(comm, &num_procs); hypre_MPI_Comm_rank(comm, &my_id); num_threads = hypre_NumThreads(); if (num_functions > 1) { hypre_error_w_msg(HYPRE_ERROR_GENERIC, "Not implemented for num_functions > 1!"); } my_first_cpt = num_cpts_global[0]; if (my_id == (num_procs - 1)) { total_global_cpts = num_cpts_global[1]; } hypre_MPI_Bcast(&total_global_cpts, 1, HYPRE_MPI_BIG_INT, num_procs - 1, comm); /*------------------------------------------------------------------- * Get the CF_marker data for the off-processor columns *-------------------------------------------------------------------*/ if (debug_flag == 4) { wall_time = time_getWallclockSeconds(); } CF_marker_offd = hypre_CTAlloc(HYPRE_Int, num_cols_A_offd, HYPRE_MEMORY_HOST); if (!comm_pkg) { hypre_BlockMatvecCommPkgCreate(A); comm_pkg = hypre_ParCSRBlockMatrixCommPkg(A); } num_sends = hypre_ParCSRCommPkgNumSends(comm_pkg); int_buf_data = hypre_CTAlloc(HYPRE_Int, hypre_ParCSRCommPkgSendMapStart(comm_pkg, num_sends), HYPRE_MEMORY_HOST); index = 0; for (i = 0; i < num_sends; i++) { start = hypre_ParCSRCommPkgSendMapStart(comm_pkg, i); for (j = start; j < hypre_ParCSRCommPkgSendMapStart(comm_pkg, i + 1); j++) { int_buf_data[index++] = CF_marker[hypre_ParCSRCommPkgSendMapElmt(comm_pkg, j)]; } } /* we do not need the block version of comm handle - because CF_marker corresponds to the nodal matrix. This call populates CF_marker_offd */ comm_handle = hypre_ParCSRCommHandleCreate( 11, comm_pkg, int_buf_data, CF_marker_offd); hypre_ParCSRCommHandleDestroy(comm_handle); if (debug_flag == 4) { wall_time = time_getWallclockSeconds() - wall_time; hypre_printf("Proc = %d Interp: Comm 1 CF_marker = %f\n", my_id, wall_time); fflush(NULL); } /*---------------------------------------------------------------------- * Get the ghost rows of A *---------------------------------------------------------------------*/ if (debug_flag == 4) { wall_time = time_getWallclockSeconds(); } if (num_procs > 1) { A_ext = hypre_ParCSRBlockMatrixExtractBExt(A, A, 1); A_ext_i = hypre_CSRBlockMatrixI(A_ext); A_ext_j = hypre_CSRBlockMatrixBigJ(A_ext); A_ext_data = hypre_CSRBlockMatrixData(A_ext); } index = 0; for (i = 0; i < num_cols_A_offd; i++) { for (j = A_ext_i[i]; j < A_ext_i[i + 1]; j++) { big_k = A_ext_j[j]; if (big_k >= col_1 && big_k < col_n) { A_ext_j[index] = big_k - col_1; /* for the data field we must get all of the block data */ for (bd = 0; bd < bnnz; bd++) { A_ext_data[index * bnnz + bd] = A_ext_data[j * bnnz + bd]; } index++; } else { kc = hypre_BigBinarySearch(col_map_offd, big_k, num_cols_A_offd); if (kc > -1) { A_ext_j[index] = (HYPRE_BigInt)(-kc - 1); for (bd = 0; bd < bnnz; bd++) { A_ext_data[index * bnnz + bd] = A_ext_data[j * bnnz + bd]; } index++; } } } A_ext_i[i] = index; } for (i = num_cols_A_offd; i > 0; i--) { A_ext_i[i] = A_ext_i[i - 1]; } if (num_procs > 1) { A_ext_i[0] = 0; } if (debug_flag == 4) { wall_time = time_getWallclockSeconds() - wall_time; hypre_printf("Proc = %d Interp: Comm 2 Get A_ext = %f\n", my_id, wall_time); fflush(NULL); } /*----------------------------------------------------------------------- * First Pass: Determine size of P and fill in fine_to_coarse mapping. *-----------------------------------------------------------------------*/ /*----------------------------------------------------------------------- * Intialize counters and allocate mapping vector. *-----------------------------------------------------------------------*/ coarse_counter = hypre_CTAlloc(HYPRE_Int, num_threads, HYPRE_MEMORY_HOST); jj_count = hypre_CTAlloc(HYPRE_Int, num_threads, HYPRE_MEMORY_HOST); jj_count_offd = hypre_CTAlloc(HYPRE_Int, num_threads, HYPRE_MEMORY_HOST); fine_to_coarse = hypre_CTAlloc(HYPRE_Int, n_fine, HYPRE_MEMORY_HOST); for (i = 0; i < n_fine; i++) { fine_to_coarse[i] = -1; } jj_counter = start_indexing; jj_counter_offd = start_indexing; /*----------------------------------------------------------------------- * Loop over fine grid. *-----------------------------------------------------------------------*/ for (j = 0; j < num_threads; j++) { size = n_fine / num_threads; rest = n_fine - size * num_threads; if (j < rest) { ns = j * size + j; ne = (j + 1) * size + j + 1; } else { ns = j * size + rest; ne = (j + 1) * size + rest; } /* loop over the fine grid points */ for (i = ns; i < ne; i++) { /*-------------------------------------------------------------------- * If i is a C-point, interpolation is the identity. Also set up * mapping vector (fine_to_coarse is the mapping vector). *--------------------------------------------------------------------*/ if (CF_marker[i] >= 0) { jj_count[j]++; fine_to_coarse[i] = coarse_counter[j]; coarse_counter[j]++; } /*-------------------------------------------------------------------- * If i is an F-point, interpolation is from the C-points that * strongly influence i. *--------------------------------------------------------------------*/ else { for (jj = S_diag_i[i]; jj < S_diag_i[i + 1]; jj++) { i1 = S_diag_j[jj]; if (CF_marker[i1] >= 0) { jj_count[j]++; } } if (num_procs > 1) { for (jj = S_offd_i[i]; jj < S_offd_i[i + 1]; jj++) { i1 = S_offd_j[jj]; if (CF_marker_offd[i1] >= 0) { jj_count_offd[j]++; } } } } } } /*----------------------------------------------------------------------- * Allocate arrays. *-----------------------------------------------------------------------*/ for (i = 0; i < num_threads - 1; i++) { coarse_counter[i + 1] += coarse_counter[i]; jj_count[i + 1] += jj_count[i]; jj_count_offd[i + 1] += jj_count_offd[i]; } i = num_threads - 1; jj_counter = jj_count[i]; jj_counter_offd = jj_count_offd[i]; P_diag_size = jj_counter; P_diag_i = hypre_CTAlloc(HYPRE_Int, n_fine + 1, HYPRE_MEMORY_HOST); P_diag_j = hypre_CTAlloc(HYPRE_Int, P_diag_size, HYPRE_MEMORY_HOST); /* we need to include the size of the blocks in the data size */ P_diag_data = hypre_CTAlloc(HYPRE_Real, P_diag_size * bnnz, HYPRE_MEMORY_HOST); P_diag_i[n_fine] = jj_counter; P_offd_size = jj_counter_offd; P_offd_i = hypre_CTAlloc(HYPRE_Int, n_fine + 1, HYPRE_MEMORY_HOST); P_offd_j = hypre_CTAlloc(HYPRE_Int, P_offd_size, HYPRE_MEMORY_HOST); /* we need to include the size of the blocks in the data size */ P_offd_data = hypre_CTAlloc(HYPRE_Real, P_offd_size * bnnz, HYPRE_MEMORY_HOST); /*----------------------------------------------------------------------- * Intialize some stuff. *-----------------------------------------------------------------------*/ jj_counter = start_indexing; jj_counter_offd = start_indexing; if (debug_flag == 4) { wall_time = time_getWallclockSeconds() - wall_time; hypre_printf("Proc = %d Interp: Internal work 1 = %f\n", my_id, wall_time); fflush(NULL); } /* we need a block identity and a block of zeros*/ identity_block = hypre_CTAlloc(HYPRE_Real, bnnz, HYPRE_MEMORY_HOST); zero_block = hypre_CTAlloc(HYPRE_Real, bnnz, HYPRE_MEMORY_HOST); for (i = 0; i < block_size; i++) { identity_block[i * block_size + i] = 1.0; } /* we also need a block to keep track of the diagonal values and a sum */ diagonal_block = hypre_CTAlloc(HYPRE_Real, bnnz, HYPRE_MEMORY_HOST); sum_block = hypre_CTAlloc(HYPRE_Real, bnnz, HYPRE_MEMORY_HOST); distribute_block = hypre_CTAlloc(HYPRE_Real, bnnz, HYPRE_MEMORY_HOST); sign = hypre_CTAlloc(HYPRE_Real, block_size, HYPRE_MEMORY_HOST); /*----------------------------------------------------------------------- * Send and receive fine_to_coarse info. *-----------------------------------------------------------------------*/ if (debug_flag == 4) { wall_time = time_getWallclockSeconds(); } fine_to_coarse_offd = hypre_CTAlloc(HYPRE_BigInt, num_cols_A_offd, HYPRE_MEMORY_HOST); big_buf_data = hypre_CTAlloc(HYPRE_BigInt, hypre_ParCSRCommPkgSendMapStart(comm_pkg, num_sends), HYPRE_MEMORY_HOST); for (j = 0; j < num_threads; j++) { coarse_shift = 0; if (j > 0) { coarse_shift = coarse_counter[j - 1]; } size = n_fine / num_threads; rest = n_fine - size * num_threads; if (j < rest) { ns = j * size + j; ne = (j + 1) * size + j + 1; } else { ns = j * size + rest; ne = (j + 1) * size + rest; } for (i = ns; i < ne; i++) { fine_to_coarse[i] += coarse_shift; } } index = 0; for (i = 0; i < num_sends; i++) { start = hypre_ParCSRCommPkgSendMapStart(comm_pkg, i); for (j = start; j < hypre_ParCSRCommPkgSendMapStart(comm_pkg, i + 1); j++) { big_buf_data[index++] = my_first_cpt + fine_to_coarse[hypre_ParCSRCommPkgSendMapElmt(comm_pkg, j)]; } } /* again, we do not need to use the block version of comm handle since the fine to coarse mapping is size of the nodes */ comm_handle = hypre_ParCSRCommHandleCreate(21, comm_pkg, big_buf_data, fine_to_coarse_offd); hypre_ParCSRCommHandleDestroy(comm_handle); if (debug_flag == 4) { wall_time = time_getWallclockSeconds() - wall_time; hypre_printf("Proc = %d Interp: Comm 4 FineToCoarse = %f\n", my_id, wall_time); fflush(NULL); } if (debug_flag == 4) { wall_time = time_getWallclockSeconds(); } /*----------------------------------------------------------------------- * Loop over fine grid points. *-----------------------------------------------------------------------*/ for (jl = 0; jl < num_threads; jl++) { size = n_fine / num_threads; rest = n_fine - size * num_threads; if (jl < rest) { ns = jl * size + jl; ne = (jl + 1) * size + jl + 1; } else { ns = jl * size + rest; ne = (jl + 1) * size + rest; } jj_counter = 0; if (jl > 0) { jj_counter = jj_count[jl - 1]; } jj_counter_offd = 0; if (jl > 0) { jj_counter_offd = jj_count_offd[jl - 1]; } P_marker = hypre_CTAlloc(HYPRE_Int, n_fine, HYPRE_MEMORY_HOST); P_marker_offd = hypre_CTAlloc(HYPRE_Int, num_cols_A_offd, HYPRE_MEMORY_HOST); for (i = 0; i < n_fine; i++) { P_marker[i] = -1; } for (i = 0; i < num_cols_A_offd; i++) { P_marker_offd[i] = -1; } strong_f_marker = -2; for (i = ns; i < ne; i++) { /*-------------------------------------------------------------------- * If i is a c-point, interpolation is the identity. *--------------------------------------------------------------------*/ if (CF_marker[i] >= 0) { P_diag_i[i] = jj_counter; P_diag_j[jj_counter] = fine_to_coarse[i]; /* P_diag_data[jj_counter] = one; */ hypre_CSRBlockMatrixBlockCopyData(identity_block, &P_diag_data[jj_counter * bnnz], 1.0, block_size); jj_counter++; } /*-------------------------------------------------------------------- * If i is an F-point, build interpolation. *--------------------------------------------------------------------*/ else { /* Diagonal part of P */ P_diag_i[i] = jj_counter; jj_begin_row = jj_counter; for (jj = S_diag_i[i]; jj < S_diag_i[i + 1]; jj++) { i1 = S_diag_j[jj]; /*-------------------------------------------------------------- * If neighbor i1 is a C-point, set column number in P_diag_j * and initialize interpolation weight to zero. *--------------------------------------------------------------*/ if (CF_marker[i1] >= 0) { P_marker[i1] = jj_counter; P_diag_j[jj_counter] = fine_to_coarse[i1]; /* P_diag_data[jj_counter] = zero; */ hypre_CSRBlockMatrixBlockCopyData(zero_block, &P_diag_data[jj_counter * bnnz], 1.0, block_size); jj_counter++; } /*-------------------------------------------------------------- * If neighbor i1 is an F-point, mark it as a strong F-point * whose connection needs to be distributed. *--------------------------------------------------------------*/ else if (CF_marker[i1] != -3) { P_marker[i1] = strong_f_marker; } } jj_end_row = jj_counter; /* Off-Diagonal part of P */ P_offd_i[i] = jj_counter_offd; jj_begin_row_offd = jj_counter_offd; if (num_procs > 1) { for (jj = S_offd_i[i]; jj < S_offd_i[i + 1]; jj++) { i1 = S_offd_j[jj]; /*----------------------------------------------------------- * If neighbor i1 is a C-point, set column number in P_offd_j * and initialize interpolation weight to zero. *-----------------------------------------------------------*/ if (CF_marker_offd[i1] >= 0) { P_marker_offd[i1] = jj_counter_offd; P_offd_j[jj_counter_offd] = i1; /* P_offd_data[jj_counter_offd] = zero; */ hypre_CSRBlockMatrixBlockCopyData(zero_block, &P_offd_data[jj_counter_offd * bnnz], 1.0, block_size); jj_counter_offd++; } /*----------------------------------------------------------- * If neighbor i1 is an F-point, mark it as a strong F-point * whose connection needs to be distributed. *-----------------------------------------------------------*/ else if (CF_marker_offd[i1] != -3) { P_marker_offd[i1] = strong_f_marker; } } } jj_end_row_offd = jj_counter_offd; /* get the diagonal block */ /* diagonal = A_diag_data[A_diag_i[i]]; */ hypre_CSRBlockMatrixBlockCopyDataDiag(&A_diag_data[A_diag_i[i]*bnnz], diagonal_block, 1.0, block_size); /* Here we go through the neighborhood of this grid point */ /* Loop over ith row of A. First, the diagonal part of A */ for (jj = A_diag_i[i] + 1; jj < A_diag_i[i + 1]; jj++) { i1 = A_diag_j[jj]; /*-------------------------------------------------------------- * Case 1: neighbor i1 is a C-point and strongly influences i, * accumulate a_{i,i1} into the interpolation weight. *--------------------------------------------------------------*/ if (P_marker[i1] >= jj_begin_row) { /* P_diag_data[P_marker[i1]] += A_diag_data[jj]; */ hypre_CSRBlockMatrixBlockAddAccumulateDiag(&A_diag_data[jj * bnnz], &P_diag_data[P_marker[i1]*bnnz], block_size); } /*-------------------------------------------------------------- * Case 2: neighbor i1 is an F-point and strongly influences i, * distribute a_{i,i1} to C-points that strongly infuence i. * Note: currently no distribution to the diagonal in this case. *--------------------------------------------------------------*/ else if (P_marker[i1] == strong_f_marker || (!add_weak_to_diag && CF_marker[i1] != -3)) { /* initialize sum to zero */ /* sum = zero; */ hypre_CSRBlockMatrixBlockCopyData(zero_block, sum_block, 1.0, block_size); /*----------------------------------------------------------- * Loop over row of A for point i1 and calculate the sum * of the connections to c-points that strongly influence i. *-----------------------------------------------------------*/ hypre_CSRBlockMatrixComputeSign(&A_diag_data[A_diag_i[i1]*bnnz], sign, block_size); /* Diagonal block part of row i1 */ for (jj1 = A_diag_i[i1]; jj1 < A_diag_i[i1 + 1]; jj1++) { i2 = A_diag_j[jj1]; if (P_marker[i2] >= jj_begin_row) { /* add diag data to sum */ /* sum += A_diag_data[jj1]; */ /* hypre_CSRBlockMatrixBlockAddAccumulateDiag(&A_diag_data[jj1*bnnz], sum_block, block_size);*/ hypre_CSRBlockMatrixBlockAddAccumulateDiagCheckSign(&A_diag_data[jj1 * bnnz], sum_block, block_size, sign); } } /* Off-Diagonal block part of row i1 */ if (num_procs > 1) { for (jj1 = A_offd_i[i1]; jj1 < A_offd_i[i1 + 1]; jj1++) { i2 = A_offd_j[jj1]; if (P_marker_offd[i2] >= jj_begin_row_offd ) { /* add off diag data to sum */ /*sum += A_offd_data[jj1];*/ /* hypre_CSRBlockMatrixBlockAddAccumulateDiag(&A_offd_data[jj1*bnnz], sum_block, block_size);*/ hypre_CSRBlockMatrixBlockAddAccumulateDiagCheckSign(&A_offd_data[jj1 * bnnz], sum_block, block_size, sign); } } } /* check whether sum_block is singular */ /* distribute = A_diag_data[jj] / sum;*/ /* here we want: A_diag_data * sum^(-1) */ if (hypre_CSRBlockMatrixBlockInvMultDiag(sum_block, &A_diag_data[jj * bnnz], distribute_block, block_size) == 0) { /*----------------------------------------------------------- * Loop over row of A for point i1 and do the distribution. *-----------------------------------------------------------*/ /* Diagonal block part of row i1 */ for (jj1 = A_diag_i[i1]; jj1 < A_diag_i[i1 + 1]; jj1++) { i2 = A_diag_j[jj1]; if (P_marker[i2] >= jj_begin_row ) { /* P_diag_data[P_marker[i2]] += distribute * A_diag_data[jj1];*/ /* multiply - result in sum_block */ hypre_CSRBlockMatrixBlockCopyData(zero_block, sum_block, 1.0, block_size); /* hypre_CSRBlockMatrixBlockMultAddDiag(distribute_block, &A_diag_data[jj1*bnnz], 0.0, sum_block, block_size);*/ hypre_CSRBlockMatrixBlockMultAddDiagCheckSign(distribute_block, &A_diag_data[jj1 * bnnz], 0.0, sum_block, block_size, sign); /* add result to p_diag_data */ hypre_CSRBlockMatrixBlockAddAccumulateDiag(sum_block, &P_diag_data[P_marker[i2]*bnnz], block_size); } } /* Off-Diagonal block part of row i1 */ if (num_procs > 1) { for (jj1 = A_offd_i[i1]; jj1 < A_offd_i[i1 + 1]; jj1++) { i2 = A_offd_j[jj1]; if (P_marker_offd[i2] >= jj_begin_row_offd) { /* P_offd_data[P_marker_offd[i2]] += distribute * A_offd_data[jj1]; */ /* multiply - result in sum_block */ hypre_CSRBlockMatrixBlockCopyData(zero_block, sum_block, 1.0, block_size); /* hypre_CSRBlockMatrixBlockMultAddDiag(distribute_block, &A_offd_data[jj1*bnnz], 0.0, sum_block, block_size); */ hypre_CSRBlockMatrixBlockMultAddDiagCheckSign(distribute_block, &A_offd_data[jj1 * bnnz], 0.0, sum_block, block_size, sign); /* add result to p_offd_data */ hypre_CSRBlockMatrixBlockAddAccumulateDiag(sum_block, &P_offd_data[P_marker_offd[i2]*bnnz], block_size); } } } } else /* sum block is all zeros (or almost singular) - just add to diagonal */ { /* diagonal += A_diag_data[jj]; */ if (add_weak_to_diag) hypre_CSRBlockMatrixBlockAddAccumulateDiag(&A_diag_data[jj * bnnz], diagonal_block, block_size); } } /*-------------------------------------------------------------- * Case 3: neighbor i1 weakly influences i, accumulate a_{i,i1} * into the diagonal. *--------------------------------------------------------------*/ else if (CF_marker[i1] != -3 && add_weak_to_diag) { /* diagonal += A_diag_data[jj];*/ hypre_CSRBlockMatrixBlockAddAccumulateDiag(&A_diag_data[jj * bnnz], diagonal_block, block_size); } } /*---------------------------------------------------------------- * Still looping over ith row of A. Next, loop over the * off-diagonal part of A *---------------------------------------------------------------*/ if (num_procs > 1) { for (jj = A_offd_i[i]; jj < A_offd_i[i + 1]; jj++) { i1 = A_offd_j[jj]; /*-------------------------------------------------------------- * Case 1: neighbor i1 is a C-point and strongly influences i, * accumulate a_{i,i1} into the interpolation weight. *--------------------------------------------------------------*/ if (P_marker_offd[i1] >= jj_begin_row_offd) { /* P_offd_data[P_marker_offd[i1]] += A_offd_data[jj]; */ hypre_CSRBlockMatrixBlockAddAccumulateDiag( &A_offd_data[jj * bnnz], &P_offd_data[P_marker_offd[i1]*bnnz], block_size); } /*------------------------------------------------------------ * Case 2: neighbor i1 is an F-point and strongly influences i, * distribute a_{i,i1} to C-points that strongly infuence i. * Note: currently no distribution to the diagonal in this case. *-----------------------------------------------------------*/ else if (P_marker_offd[i1] == strong_f_marker || (!add_weak_to_diag && CF_marker[i1] != -3)) { /* initialize sum to zero */ hypre_CSRBlockMatrixBlockCopyData(zero_block, sum_block, 1.0, block_size); /*--------------------------------------------------------- * Loop over row of A_ext for point i1 and calculate the sum * of the connections to c-points that strongly influence i. *---------------------------------------------------------*/ /* find row number */ c_num = A_offd_j[jj]; hypre_CSRBlockMatrixComputeSign(&A_ext_data[A_ext_i[c_num]*bnnz], sign, block_size); for (jj1 = A_ext_i[c_num]; jj1 < A_ext_i[c_num + 1]; jj1++) { i2 = (HYPRE_Int)A_ext_j[jj1]; if (i2 > -1) { /* in the diagonal block */ if (P_marker[i2] >= jj_begin_row) { /* sum += A_ext_data[jj1]; */ /* hypre_CSRBlockMatrixBlockAddAccumulateDiag(&A_ext_data[jj1*bnnz], sum_block, block_size);*/ hypre_CSRBlockMatrixBlockAddAccumulateDiagCheckSign(&A_ext_data[jj1 * bnnz], sum_block, block_size, sign); } } else { /* in the off_diagonal block */ if (P_marker_offd[-i2 - 1] >= jj_begin_row_offd) { /* sum += A_ext_data[jj1]; */ /* hypre_CSRBlockMatrixBlockAddAccumulateDiag(&A_ext_data[jj1*bnnz], sum_block, block_size);*/ hypre_CSRBlockMatrixBlockAddAccumulateDiagCheckSign(&A_ext_data[jj1 * bnnz], sum_block, block_size, sign); } } } /* check whether sum_block is singular */ /* distribute = A_offd_data[jj] / sum; */ /* here we want: A_offd_data * sum^(-1) */ if (hypre_CSRBlockMatrixBlockInvMultDiag(sum_block, &A_offd_data[jj * bnnz], distribute_block, block_size) == 0) { /*--------------------------------------------------------- * Loop over row of A_ext for point i1 and do * the distribution. *--------------------------------------------------------*/ /* Diagonal block part of row i1 */ for (jj1 = A_ext_i[c_num]; jj1 < A_ext_i[c_num + 1]; jj1++) { i2 = (HYPRE_Int)A_ext_j[jj1]; if (i2 > -1) /* in the diagonal block */ { if (P_marker[i2] >= jj_begin_row) { /* P_diag_data[P_marker[i2]] += distribute * A_ext_data[jj1]; */ /* multiply - result in sum_block */ hypre_CSRBlockMatrixBlockCopyData(zero_block, sum_block, 1.0, block_size); /* hypre_CSRBlockMatrixBlockMultAddDiag(distribute_block, &A_ext_data[jj1*bnnz], 0.0, sum_block, block_size); */ hypre_CSRBlockMatrixBlockMultAddDiagCheckSign(distribute_block, &A_ext_data[jj1 * bnnz], 0.0, sum_block, block_size, sign); /* add result to p_diag_data */ hypre_CSRBlockMatrixBlockAddAccumulateDiag(sum_block, &P_diag_data[P_marker[i2]*bnnz], block_size); } } else { /* in the off_diagonal block */ if (P_marker_offd[-i2 - 1] >= jj_begin_row_offd) /*P_offd_data[P_marker_offd[-i2-1]] += distribute * A_ext_data[jj1];*/ { /* multiply - result in sum_block */ hypre_CSRBlockMatrixBlockCopyData(zero_block, sum_block, 1.0, block_size); /* hypre_CSRBlockMatrixBlockMultAddDiag(distribute_block, &A_ext_data[jj1*bnnz], 0.0, sum_block, block_size);*/ hypre_CSRBlockMatrixBlockMultAddDiagCheckSign(distribute_block, &A_ext_data[jj1 * bnnz], 0.0, sum_block, block_size, sign); /* add result to p_offd_data */ hypre_CSRBlockMatrixBlockAddAccumulateDiag(sum_block, &P_offd_data[P_marker_offd[-i2 - 1]*bnnz], block_size); } } } } else /* sum block is all zeros - just add to diagonal */ { /* diagonal += A_offd_data[jj]; */ if (add_weak_to_diag) hypre_CSRBlockMatrixBlockAddAccumulateDiag(&A_offd_data[jj * bnnz], diagonal_block, block_size); } } /*----------------------------------------------------------- * Case 3: neighbor i1 weakly influences i, accumulate a_{i,i1} * into the diagonal. *-----------------------------------------------------------*/ else if (CF_marker_offd[i1] != -3 && add_weak_to_diag) { /* diagonal += A_offd_data[jj]; */ hypre_CSRBlockMatrixBlockAddAccumulateDiag(&A_offd_data[jj * bnnz], diagonal_block, block_size); } } } /*----------------------------------------------------------------- * Set interpolation weight by dividing by the diagonal. *-----------------------------------------------------------------*/ for (jj = jj_begin_row; jj < jj_end_row; jj++) { /* P_diag_data[jj] /= -diagonal; */ /* want diagonal^(-1)*P_diag_data */ /* do division - put in sum_block */ if ( hypre_CSRBlockMatrixBlockInvMultDiag(diagonal_block, &P_diag_data[jj * bnnz], sum_block, block_size) == 0) { /* now copy to P_diag_data[jj] and make negative */ hypre_CSRBlockMatrixBlockCopyData(sum_block, &P_diag_data[jj * bnnz], -1.0, block_size); } else { /* hypre_printf(" Warning! singular diagonal block! Proc id %d row %d\n", my_id,i); */ /* just make P_diag_data negative since diagonal is zero */ hypre_CSRBlockMatrixBlockCopyData(&P_diag_data[jj * bnnz], &P_diag_data[jj * bnnz], -1.0, block_size); } } for (jj = jj_begin_row_offd; jj < jj_end_row_offd; jj++) { /* P_offd_data[jj] /= -diagonal; */ /* do division - put in sum_block */ hypre_CSRBlockMatrixBlockInvMultDiag(diagonal_block, &P_offd_data[jj * bnnz], sum_block, block_size); /* now copy to P_offd_data[jj] and make negative */ hypre_CSRBlockMatrixBlockCopyData(sum_block, &P_offd_data[jj * bnnz], -1.0, block_size); } } strong_f_marker--; P_offd_i[i + 1] = jj_counter_offd; } hypre_TFree(P_marker, HYPRE_MEMORY_HOST); hypre_TFree(P_marker_offd, HYPRE_MEMORY_HOST); } /* Now create P - as a block matrix */ P = hypre_ParCSRBlockMatrixCreate(comm, block_size, hypre_ParCSRBlockMatrixGlobalNumRows(A), total_global_cpts, hypre_ParCSRBlockMatrixColStarts(A), num_cpts_global, 0, P_diag_i[n_fine], P_offd_i[n_fine]); P_diag = hypre_ParCSRBlockMatrixDiag(P); hypre_CSRBlockMatrixData(P_diag) = P_diag_data; hypre_CSRBlockMatrixI(P_diag) = P_diag_i; hypre_CSRBlockMatrixJ(P_diag) = P_diag_j; P_offd = hypre_ParCSRBlockMatrixOffd(P); hypre_CSRBlockMatrixData(P_offd) = P_offd_data; hypre_CSRBlockMatrixI(P_offd) = P_offd_i; hypre_CSRBlockMatrixJ(P_offd) = P_offd_j; /* Compress P, removing coefficients smaller than trunc_factor * Max */ if (trunc_factor != 0.0 || max_elmts > 0) { hypre_BoomerAMGBlockInterpTruncation(P, trunc_factor, max_elmts); P_diag_data = hypre_CSRBlockMatrixData(P_diag); P_diag_i = hypre_CSRBlockMatrixI(P_diag); P_diag_j = hypre_CSRBlockMatrixJ(P_diag); P_offd_data = hypre_CSRBlockMatrixData(P_offd); P_offd_i = hypre_CSRBlockMatrixI(P_offd); P_offd_j = hypre_CSRBlockMatrixJ(P_offd); P_diag_size = P_diag_i[n_fine]; P_offd_size = P_offd_i[n_fine]; } num_cols_P_offd = 0; if (P_offd_size) { P_marker = hypre_CTAlloc(HYPRE_Int, num_cols_A_offd, HYPRE_MEMORY_HOST); for (i = 0; i < num_cols_A_offd; i++) { P_marker[i] = 0; } num_cols_P_offd = 0; for (i = 0; i < P_offd_size; i++) { index = P_offd_j[i]; if (!P_marker[index]) { num_cols_P_offd++; P_marker[index] = 1; } } tmp_map_offd = hypre_CTAlloc(HYPRE_Int, num_cols_P_offd, HYPRE_MEMORY_HOST); col_map_offd_P = hypre_CTAlloc(HYPRE_BigInt, num_cols_P_offd, HYPRE_MEMORY_HOST); index = 0; for (i = 0; i < num_cols_P_offd; i++) { while (P_marker[index] == 0) { index++; } tmp_map_offd[i] = index++; } for (i = 0; i < P_offd_size; i++) P_offd_j[i] = hypre_BinarySearch(tmp_map_offd, P_offd_j[i], num_cols_P_offd); hypre_TFree(P_marker, HYPRE_MEMORY_HOST); } for (i = 0; i < n_fine; i++) if (CF_marker[i] == -3) { CF_marker[i] = -1; } if (num_cols_P_offd) { hypre_ParCSRBlockMatrixColMapOffd(P) = col_map_offd_P; hypre_CSRBlockMatrixNumCols(P_offd) = num_cols_P_offd; } /* use block version */ hypre_GetCommPkgBlockRTFromCommPkgBlockA(P, A, tmp_map_offd, fine_to_coarse_offd); *P_ptr = P; hypre_TFree(sign, HYPRE_MEMORY_HOST); hypre_TFree(zero_block, HYPRE_MEMORY_HOST); hypre_TFree(identity_block, HYPRE_MEMORY_HOST); hypre_TFree(diagonal_block, HYPRE_MEMORY_HOST); hypre_TFree(sum_block, HYPRE_MEMORY_HOST); hypre_TFree(distribute_block, HYPRE_MEMORY_HOST); hypre_TFree(tmp_map_offd, HYPRE_MEMORY_HOST); hypre_TFree(CF_marker_offd, HYPRE_MEMORY_HOST); hypre_TFree(int_buf_data, HYPRE_MEMORY_HOST); hypre_TFree(big_buf_data, HYPRE_MEMORY_HOST); hypre_TFree(fine_to_coarse, HYPRE_MEMORY_HOST); hypre_TFree(fine_to_coarse_offd, HYPRE_MEMORY_HOST); hypre_TFree(coarse_counter, HYPRE_MEMORY_HOST); hypre_TFree(jj_count, HYPRE_MEMORY_HOST); hypre_TFree(jj_count_offd, HYPRE_MEMORY_HOST); if (num_procs > 1) { hypre_CSRBlockMatrixDestroy(A_ext); } return (0); } /*--------------------------------------------------------------------------- * hypre_BoomerAMGBlockBuildInterpRV Here we are modifying the block interp like in Ruge's elasticity paper (applied math comp '86) - only we don't include the diagonal for dist. the f-connect - when we do the distribution of the f-connection, we only distribute the error to like unknowns - this has the effect of only using the diagonal of the matrix for the f-distributions. In addition, we will not differentiate between the strength of the f-connections (so nothing is added to the diag) *--------------------------------------------------------------------------*/ HYPRE_Int hypre_BoomerAMGBuildBlockInterpRV( hypre_ParCSRBlockMatrix *A, HYPRE_Int *CF_marker, hypre_ParCSRMatrix *S, HYPRE_BigInt *num_cpts_global, HYPRE_Int num_functions, HYPRE_Int *dof_func, HYPRE_Int debug_flag, HYPRE_Real trunc_factor, HYPRE_Int max_elmts, hypre_ParCSRBlockMatrix **P_ptr) { HYPRE_UNUSED_VAR(dof_func); MPI_Comm comm = hypre_ParCSRBlockMatrixComm(A); hypre_ParCSRCommPkg *comm_pkg = hypre_ParCSRBlockMatrixCommPkg(A); hypre_ParCSRCommHandle *comm_handle; hypre_CSRBlockMatrix *A_diag = hypre_ParCSRBlockMatrixDiag(A); HYPRE_Real *A_diag_data = hypre_CSRBlockMatrixData(A_diag); HYPRE_Int *A_diag_i = hypre_CSRBlockMatrixI(A_diag); HYPRE_Int *A_diag_j = hypre_CSRBlockMatrixJ(A_diag); HYPRE_Int block_size = hypre_CSRBlockMatrixBlockSize(A_diag); HYPRE_Int bnnz = block_size * block_size; hypre_CSRBlockMatrix *A_offd = hypre_ParCSRBlockMatrixOffd(A); HYPRE_Real *A_offd_data = hypre_CSRBlockMatrixData(A_offd); HYPRE_Int *A_offd_i = hypre_CSRBlockMatrixI(A_offd); HYPRE_Int *A_offd_j = hypre_CSRBlockMatrixJ(A_offd); HYPRE_Int num_cols_A_offd = hypre_CSRBlockMatrixNumCols(A_offd); HYPRE_BigInt *col_map_offd = hypre_ParCSRBlockMatrixColMapOffd(A); hypre_CSRMatrix *S_diag = hypre_ParCSRMatrixDiag(S); HYPRE_Int *S_diag_i = hypre_CSRMatrixI(S_diag); HYPRE_Int *S_diag_j = hypre_CSRMatrixJ(S_diag); hypre_CSRMatrix *S_offd = hypre_ParCSRMatrixOffd(S); HYPRE_Int *S_offd_i = hypre_CSRMatrixI(S_offd); HYPRE_Int *S_offd_j = hypre_CSRMatrixJ(S_offd); hypre_ParCSRBlockMatrix *P; HYPRE_BigInt *col_map_offd_P; HYPRE_Int *tmp_map_offd = NULL; HYPRE_Int *CF_marker_offd = NULL; hypre_CSRBlockMatrix *A_ext = NULL; HYPRE_Real *A_ext_data = NULL; HYPRE_Int *A_ext_i = NULL; HYPRE_BigInt *A_ext_j = NULL; hypre_CSRBlockMatrix *P_diag; hypre_CSRBlockMatrix *P_offd; HYPRE_Real *P_diag_data; HYPRE_Int *P_diag_i; HYPRE_Int *P_diag_j; HYPRE_Real *P_offd_data; HYPRE_Int *P_offd_i; HYPRE_Int *P_offd_j; HYPRE_Int P_diag_size, P_offd_size; HYPRE_Int *P_marker, *P_marker_offd = NULL; HYPRE_Int jj_counter, jj_counter_offd; HYPRE_Int *jj_count, *jj_count_offd = NULL; HYPRE_Int jj_begin_row, jj_begin_row_offd; HYPRE_Int jj_end_row, jj_end_row_offd; HYPRE_Int start_indexing = 0; /* start indexing for P_data at 0 */ HYPRE_Int n_fine = hypre_CSRBlockMatrixNumRows(A_diag); HYPRE_Int strong_f_marker; HYPRE_Int *fine_to_coarse; HYPRE_BigInt *fine_to_coarse_offd = NULL; HYPRE_Int *coarse_counter; HYPRE_Int coarse_shift; HYPRE_BigInt total_global_cpts; HYPRE_Int num_cols_P_offd; HYPRE_BigInt my_first_cpt; HYPRE_Int bd; HYPRE_Int i, i1, i2; HYPRE_Int j, jl, jj, jj1; HYPRE_Int kc; HYPRE_BigInt big_k; HYPRE_Int start; HYPRE_Int c_num; HYPRE_Int my_id; HYPRE_Int num_procs; HYPRE_Int num_threads; HYPRE_Int num_sends; HYPRE_Int index; HYPRE_Int ns, ne, size, rest; HYPRE_Int *int_buf_data = NULL; HYPRE_BigInt *big_buf_data = NULL; HYPRE_BigInt col_1 = hypre_ParCSRBlockMatrixFirstRowIndex(A); HYPRE_Int local_numrows = hypre_CSRBlockMatrixNumRows(A_diag); HYPRE_BigInt col_n = col_1 + (HYPRE_BigInt)local_numrows; HYPRE_Real wall_time = 0.0; /* for debugging instrumentation */ HYPRE_Real *identity_block; HYPRE_Real *zero_block; HYPRE_Real *diagonal_block; HYPRE_Real *sum_block; HYPRE_Real *distribute_block; hypre_MPI_Comm_size(comm, &num_procs); hypre_MPI_Comm_rank(comm, &my_id); num_threads = hypre_NumThreads(); if (num_functions > 1) { hypre_error_w_msg(HYPRE_ERROR_GENERIC, "Not implemented for num_functions > 1!"); } my_first_cpt = num_cpts_global[0]; if (my_id == (num_procs - 1)) { total_global_cpts = num_cpts_global[1]; } hypre_MPI_Bcast(&total_global_cpts, 1, HYPRE_MPI_BIG_INT, num_procs - 1, comm); /*------------------------------------------------------------------- * Get the CF_marker data for the off-processor columns *-------------------------------------------------------------------*/ if (debug_flag == 4) { wall_time = time_getWallclockSeconds(); } CF_marker_offd = hypre_CTAlloc(HYPRE_Int, num_cols_A_offd, HYPRE_MEMORY_HOST); if (!comm_pkg) { hypre_BlockMatvecCommPkgCreate(A); comm_pkg = hypre_ParCSRBlockMatrixCommPkg(A); } num_sends = hypre_ParCSRCommPkgNumSends(comm_pkg); int_buf_data = hypre_CTAlloc(HYPRE_Int, hypre_ParCSRCommPkgSendMapStart(comm_pkg, num_sends), HYPRE_MEMORY_HOST); index = 0; for (i = 0; i < num_sends; i++) { start = hypre_ParCSRCommPkgSendMapStart(comm_pkg, i); for (j = start; j < hypre_ParCSRCommPkgSendMapStart(comm_pkg, i + 1); j++) { int_buf_data[index++] = CF_marker[hypre_ParCSRCommPkgSendMapElmt(comm_pkg, j)]; } } /* we do not need the block version of comm handle - because CF_marker corresponds to the nodal matrix. This call populates CF_marker_offd */ comm_handle = hypre_ParCSRCommHandleCreate( 11, comm_pkg, int_buf_data, CF_marker_offd); hypre_ParCSRCommHandleDestroy(comm_handle); if (debug_flag == 4) { wall_time = time_getWallclockSeconds() - wall_time; hypre_printf("Proc = %d Interp: Comm 1 CF_marker = %f\n", my_id, wall_time); fflush(NULL); } /*---------------------------------------------------------------------- * Get the ghost rows of A *---------------------------------------------------------------------*/ if (debug_flag == 4) { wall_time = time_getWallclockSeconds(); } if (num_procs > 1) { A_ext = hypre_ParCSRBlockMatrixExtractBExt(A, A, 1); A_ext_i = hypre_CSRBlockMatrixI(A_ext); A_ext_j = hypre_CSRBlockMatrixBigJ(A_ext); A_ext_data = hypre_CSRBlockMatrixData(A_ext); } index = 0; for (i = 0; i < num_cols_A_offd; i++) { for (j = A_ext_i[i]; j < A_ext_i[i + 1]; j++) { big_k = A_ext_j[j]; if (big_k >= col_1 && big_k < col_n) { A_ext_j[index] = big_k - col_1; /* for the data field we must get all of the blocbig_k data */ for (bd = 0; bd < bnnz; bd++) { A_ext_data[index * bnnz + bd] = A_ext_data[j * bnnz + bd]; } index++; } else { kc = hypre_BigBinarySearch(col_map_offd, big_k, num_cols_A_offd); if (kc > -1) { A_ext_j[index] = (HYPRE_BigInt)(-kc - 1); for (bd = 0; bd < bnnz; bd++) { A_ext_data[index * bnnz + bd] = A_ext_data[j * bnnz + bd]; } index++; } } } A_ext_i[i] = index; } for (i = num_cols_A_offd; i > 0; i--) { A_ext_i[i] = A_ext_i[i - 1]; } if (num_procs > 1) { A_ext_i[0] = 0; } if (debug_flag == 4) { wall_time = time_getWallclockSeconds() - wall_time; hypre_printf("Proc = %d Interp: Comm 2 Get A_ext = %f\n", my_id, wall_time); fflush(NULL); } /*----------------------------------------------------------------------- * First Pass: Determine size of P and fill in fine_to_coarse mapping. *-----------------------------------------------------------------------*/ /*----------------------------------------------------------------------- * Intialize counters and allocate mapping vector. *-----------------------------------------------------------------------*/ coarse_counter = hypre_CTAlloc(HYPRE_Int, num_threads, HYPRE_MEMORY_HOST); jj_count = hypre_CTAlloc(HYPRE_Int, num_threads, HYPRE_MEMORY_HOST); jj_count_offd = hypre_CTAlloc(HYPRE_Int, num_threads, HYPRE_MEMORY_HOST); fine_to_coarse = hypre_CTAlloc(HYPRE_Int, n_fine, HYPRE_MEMORY_HOST); for (i = 0; i < n_fine; i++) { fine_to_coarse[i] = -1; } jj_counter = start_indexing; jj_counter_offd = start_indexing; /*----------------------------------------------------------------------- * Loop over fine grid. *-----------------------------------------------------------------------*/ for (j = 0; j < num_threads; j++) { size = n_fine / num_threads; rest = n_fine - size * num_threads; if (j < rest) { ns = j * size + j; ne = (j + 1) * size + j + 1; } else { ns = j * size + rest; ne = (j + 1) * size + rest; } /* loop over the fine grid points */ for (i = ns; i < ne; i++) { /*-------------------------------------------------------------------- * If i is a C-point, interpolation is the identity. Also set up * mapping vector (fine_to_coarse is the mapping vector). *--------------------------------------------------------------------*/ if (CF_marker[i] >= 0) { jj_count[j]++; fine_to_coarse[i] = coarse_counter[j]; coarse_counter[j]++; } /*-------------------------------------------------------------------- * If i is an F-point, interpolation is from the C-points that * strongly influence i. *--------------------------------------------------------------------*/ else { for (jj = S_diag_i[i]; jj < S_diag_i[i + 1]; jj++) { i1 = S_diag_j[jj]; if (CF_marker[i1] >= 0) { jj_count[j]++; } } if (num_procs > 1) { for (jj = S_offd_i[i]; jj < S_offd_i[i + 1]; jj++) { i1 = S_offd_j[jj]; if (CF_marker_offd[i1] >= 0) { jj_count_offd[j]++; } } } } } } /*----------------------------------------------------------------------- * Allocate arrays. *-----------------------------------------------------------------------*/ for (i = 0; i < num_threads - 1; i++) { coarse_counter[i + 1] += coarse_counter[i]; jj_count[i + 1] += jj_count[i]; jj_count_offd[i + 1] += jj_count_offd[i]; } i = num_threads - 1; jj_counter = jj_count[i]; jj_counter_offd = jj_count_offd[i]; P_diag_size = jj_counter; P_diag_i = hypre_CTAlloc(HYPRE_Int, n_fine + 1, HYPRE_MEMORY_HOST); P_diag_j = hypre_CTAlloc(HYPRE_Int, P_diag_size, HYPRE_MEMORY_HOST); /* we need to include the size of the blocks in the data size */ P_diag_data = hypre_CTAlloc(HYPRE_Real, P_diag_size * bnnz, HYPRE_MEMORY_HOST); P_diag_i[n_fine] = jj_counter; P_offd_size = jj_counter_offd; P_offd_i = hypre_CTAlloc(HYPRE_Int, n_fine + 1, HYPRE_MEMORY_HOST); P_offd_j = hypre_CTAlloc(HYPRE_Int, P_offd_size, HYPRE_MEMORY_HOST); /* we need to include the size of the blocks in the data size */ P_offd_data = hypre_CTAlloc(HYPRE_Real, P_offd_size * bnnz, HYPRE_MEMORY_HOST); /*----------------------------------------------------------------------- * Intialize some stuff. *-----------------------------------------------------------------------*/ jj_counter = start_indexing; jj_counter_offd = start_indexing; if (debug_flag == 4) { wall_time = time_getWallclockSeconds() - wall_time; hypre_printf("Proc = %d Interp: Internal work 1 = %f\n", my_id, wall_time); fflush(NULL); } /* we need a block identity and a block of zeros*/ identity_block = hypre_CTAlloc(HYPRE_Real, bnnz, HYPRE_MEMORY_HOST); zero_block = hypre_CTAlloc(HYPRE_Real, bnnz, HYPRE_MEMORY_HOST); for (i = 0; i < block_size; i++) { identity_block[i * block_size + i] = 1.0; } /* we also need a block to keep track of the diagonal values and a sum */ diagonal_block = hypre_CTAlloc(HYPRE_Real, bnnz, HYPRE_MEMORY_HOST); sum_block = hypre_CTAlloc(HYPRE_Real, bnnz, HYPRE_MEMORY_HOST); distribute_block = hypre_CTAlloc(HYPRE_Real, bnnz, HYPRE_MEMORY_HOST); /*----------------------------------------------------------------------- * Send and receive fine_to_coarse info. *-----------------------------------------------------------------------*/ if (debug_flag == 4) { wall_time = time_getWallclockSeconds(); } fine_to_coarse_offd = hypre_CTAlloc(HYPRE_BigInt, num_cols_A_offd, HYPRE_MEMORY_HOST); big_buf_data = hypre_CTAlloc(HYPRE_BigInt, hypre_ParCSRCommPkgSendMapStart(comm_pkg, num_sends), HYPRE_MEMORY_HOST); for (j = 0; j < num_threads; j++) { coarse_shift = 0; if (j > 0) { coarse_shift = coarse_counter[j - 1]; } size = n_fine / num_threads; rest = n_fine - size * num_threads; if (j < rest) { ns = j * size + j; ne = (j + 1) * size + j + 1; } else { ns = j * size + rest; ne = (j + 1) * size + rest; } for (i = ns; i < ne; i++) { fine_to_coarse[i] += coarse_shift; } } index = 0; for (i = 0; i < num_sends; i++) { start = hypre_ParCSRCommPkgSendMapStart(comm_pkg, i); for (j = start; j < hypre_ParCSRCommPkgSendMapStart(comm_pkg, i + 1); j++) big_buf_data[index++] = my_first_cpt + fine_to_coarse[hypre_ParCSRCommPkgSendMapElmt(comm_pkg, j)]; } /* again, we do not need to use the block version of comm handle since the fine to coarse mapping is size of the nodes */ comm_handle = hypre_ParCSRCommHandleCreate( 21, comm_pkg, big_buf_data, fine_to_coarse_offd); hypre_ParCSRCommHandleDestroy(comm_handle); if (debug_flag == 4) { wall_time = time_getWallclockSeconds() - wall_time; hypre_printf("Proc = %d Interp: Comm 4 FineToCoarse = %f\n", my_id, wall_time); fflush(NULL); } if (debug_flag == 4) { wall_time = time_getWallclockSeconds(); } for (i = 0; i < n_fine; i++) { fine_to_coarse[i] -= my_first_cpt; } /*----------------------------------------------------------------------- * Loop over fine grid points. *-----------------------------------------------------------------------*/ for (jl = 0; jl < num_threads; jl++) { size = n_fine / num_threads; rest = n_fine - size * num_threads; if (jl < rest) { ns = jl * size + jl; ne = (jl + 1) * size + jl + 1; } else { ns = jl * size + rest; ne = (jl + 1) * size + rest; } jj_counter = 0; if (jl > 0) { jj_counter = jj_count[jl - 1]; } jj_counter_offd = 0; if (jl > 0) { jj_counter_offd = jj_count_offd[jl - 1]; } P_marker = hypre_CTAlloc(HYPRE_Int, n_fine, HYPRE_MEMORY_HOST); P_marker_offd = hypre_CTAlloc(HYPRE_Int, num_cols_A_offd, HYPRE_MEMORY_HOST); for (i = 0; i < n_fine; i++) { P_marker[i] = -1; } for (i = 0; i < num_cols_A_offd; i++) { P_marker_offd[i] = -1; } strong_f_marker = -2; for (i = ns; i < ne; i++) { /*-------------------------------------------------------------------- * If i is a c-point, interpolation is the identity. *--------------------------------------------------------------------*/ if (CF_marker[i] >= 0) { P_diag_i[i] = jj_counter; P_diag_j[jj_counter] = fine_to_coarse[i]; /* P_diag_data[jj_counter] = one; */ hypre_CSRBlockMatrixBlockCopyData(identity_block, &P_diag_data[jj_counter * bnnz], 1.0, block_size); jj_counter++; } /*-------------------------------------------------------------------- * If i is an F-point, build interpolation. *--------------------------------------------------------------------*/ else { /* Diagonal part of P */ P_diag_i[i] = jj_counter; jj_begin_row = jj_counter; for (jj = S_diag_i[i]; jj < S_diag_i[i + 1]; jj++) { i1 = S_diag_j[jj]; /*-------------------------------------------------------------- * If neighbor i1 is a C-point, set column number in P_diag_j * and initialize interpolation weight to zero. *--------------------------------------------------------------*/ if (CF_marker[i1] >= 0) { P_marker[i1] = jj_counter; P_diag_j[jj_counter] = fine_to_coarse[i1]; /* P_diag_data[jj_counter] = zero; */ hypre_CSRBlockMatrixBlockCopyData(zero_block, &P_diag_data[jj_counter * bnnz], 1.0, block_size); jj_counter++; } /*-------------------------------------------------------------- * If neighbor i1 is an F-point, mark it as a strong F-point * whose connection needs to be distributed. *--------------------------------------------------------------*/ else if (CF_marker[i1] != -3) { P_marker[i1] = strong_f_marker; } } jj_end_row = jj_counter; /* Off-Diagonal part of P */ P_offd_i[i] = jj_counter_offd; jj_begin_row_offd = jj_counter_offd; if (num_procs > 1) { for (jj = S_offd_i[i]; jj < S_offd_i[i + 1]; jj++) { i1 = S_offd_j[jj]; /*----------------------------------------------------------- * If neighbor i1 is a C-point, set column number in P_offd_j * and initialize interpolation weight to zero. *-----------------------------------------------------------*/ if (CF_marker_offd[i1] >= 0) { P_marker_offd[i1] = jj_counter_offd; P_offd_j[jj_counter_offd] = i1; /* P_offd_data[jj_counter_offd] = zero; */ hypre_CSRBlockMatrixBlockCopyData(zero_block, &P_offd_data[jj_counter_offd * bnnz], 1.0, block_size); jj_counter_offd++; } /*----------------------------------------------------------- * If neighbor i1 is an F-point, mark it as a strong F-point * whose connection needs to be distributed. *-----------------------------------------------------------*/ else if (CF_marker_offd[i1] != -3) { P_marker_offd[i1] = strong_f_marker; } } } jj_end_row_offd = jj_counter_offd; /* get the diagonal block */ /* diagonal = A_diag_data[A_diag_i[i]]; */ hypre_CSRBlockMatrixBlockCopyData(&A_diag_data[A_diag_i[i]*bnnz], diagonal_block, 1.0, block_size); /* Here we go through the neighborhood of this grid point */ /* Loop over ith row of A. First, the diagonal part of A */ for (jj = A_diag_i[i] + 1; jj < A_diag_i[i + 1]; jj++) { i1 = A_diag_j[jj]; /*-------------------------------------------------------------- * Case 1: neighbor i1 is a C-point and strongly influences i, * accumulate a_{i,i1} into the interpolation weight. *--------------------------------------------------------------*/ if (P_marker[i1] >= jj_begin_row) { /* P_diag_data[P_marker[i1]] += A_diag_data[jj]; */ hypre_CSRBlockMatrixBlockAddAccumulate(&A_diag_data[jj * bnnz], &P_diag_data[P_marker[i1]*bnnz], block_size); } /*-------------------------------------------------------------- * Case 2: neighbor i1 is an F-point (MAY or MAY NOT strongly influences i), * distribute a_{i,i1} to C-points that strongly infuence i. * Note: currently no distribution to the diagonal in this case. *--------------------------------------------------------------*/ else if (P_marker[i1] == strong_f_marker || CF_marker[i1] != -3) { /* initialize sum to zero */ /* sum = zero; */ hypre_CSRBlockMatrixBlockCopyData(zero_block, sum_block, 1.0, block_size); /*----------------------------------------------------------- * Loop over row of A for point i1 and calculate the sum * of the connections to c-points that strongly influence i.- HERE WE ONLY WANT THE DIAG CONTIRBUTIONS (intra-unknown) *-----------------------------------------------------------*/ /* Diagonal block part of row i1 */ for (jj1 = A_diag_i[i1]; jj1 < A_diag_i[i1 + 1]; jj1++) { i2 = A_diag_j[jj1]; if (P_marker[i2] >= jj_begin_row) { /* add diag data to sum */ /* sum += A_diag_data[jj1]; */ hypre_CSRBlockMatrixBlockAddAccumulateDiag(&A_diag_data[jj1 * bnnz], sum_block, block_size); } } /* Off-Diagonal block part of row i1 */ if (num_procs > 1) { for (jj1 = A_offd_i[i1]; jj1 < A_offd_i[i1 + 1]; jj1++) { i2 = A_offd_j[jj1]; if (P_marker_offd[i2] >= jj_begin_row_offd ) { /* add off diag data to sum */ /*sum += A_offd_data[jj1];*/ hypre_CSRBlockMatrixBlockAddAccumulateDiag(&A_offd_data[jj1 * bnnz], sum_block, block_size); } } } /* check whether sum_block is singular (NOW SUM IS A DIAG MATRIX)*/ /* distribute = A_diag_data[jj] / sum; (if a diag element is 0 then that col is scaled by 1 instead of 1/diag) - doesn'treturn 0*/ if (hypre_CSRBlockMatrixBlockInvMultDiag2(&A_diag_data[jj * bnnz], sum_block, distribute_block, block_size) == 0) { /*----------------------------------------------------------- * Loop over row of A for point i1 and do the distribution.- HERE AGAIN WE ONLY WANT TO DIST W/IN A LIKE UNKNOWN *-----------------------------------------------------------*/ /* Diagonal block part of row i1 */ for (jj1 = A_diag_i[i1]; jj1 < A_diag_i[i1 + 1]; jj1++) { i2 = A_diag_j[jj1]; if (P_marker[i2] >= jj_begin_row ) { /* P_diag_data[P_marker[i2]] += distribute * A_diag_data[jj1];*/ /* multiply - result in sum_block */ hypre_CSRBlockMatrixBlockMultAddDiag2(distribute_block, &A_diag_data[jj1 * bnnz], 0.0, sum_block, block_size); /* add result to p_diag_data */ hypre_CSRBlockMatrixBlockAddAccumulate(sum_block, &P_diag_data[P_marker[i2]*bnnz], block_size); } } /* Off-Diagonal block part of row i1 */ if (num_procs > 1) { for (jj1 = A_offd_i[i1]; jj1 < A_offd_i[i1 + 1]; jj1++) { i2 = A_offd_j[jj1]; if (P_marker_offd[i2] >= jj_begin_row_offd) { /* P_offd_data[P_marker_offd[i2]] += distribute * A_offd_data[jj1]; */ /* multiply - result in sum_block */ hypre_CSRBlockMatrixBlockMultAddDiag2(distribute_block, &A_offd_data[jj1 * bnnz], 0.0, sum_block, block_size); /* add result to p_offd_data */ hypre_CSRBlockMatrixBlockAddAccumulate(sum_block, &P_offd_data[P_marker_offd[i2]*bnnz], block_size); } } } } /* end of if sum */ }/* end of case 1 or case 2*/ }/* end of loop of diag part */ /*---------------------------------------------------------------- * Still looping over ith row of A. Next, loop over the * off-diagonal part of A *---------------------------------------------------------------*/ if (num_procs > 1) { for (jj = A_offd_i[i]; jj < A_offd_i[i + 1]; jj++) { i1 = A_offd_j[jj]; /*-------------------------------------------------------------- * Case 1: neighbor i1 is a C-point and strongly influences i, * accumulate a_{i,i1} into the interpolation weight. *--------------------------------------------------------------*/ if (P_marker_offd[i1] >= jj_begin_row_offd) { /* P_offd_data[P_marker_offd[i1]] += A_offd_data[jj]; */ hypre_CSRBlockMatrixBlockAddAccumulate( &A_offd_data[jj * bnnz], &P_offd_data[P_marker_offd[i1]*bnnz], block_size); } /*------------------------------------------------------------ * Case 2: neighbor i1 is an F-point and (MAY or MAY NOT strongly influences i), * distribute a_{i,i1} to C-points that strongly infuence i. * Note: currently no distribution to the diagonal in this case. *-----------------------------------------------------------*/ else if (P_marker_offd[i1] == strong_f_marker || CF_marker[i1] != -3 ) { /* initialize sum to zero */ hypre_CSRBlockMatrixBlockCopyData(zero_block, sum_block, 1.0, block_size); /*--------------------------------------------------------- * Loop over row of A_ext for point i1 and calculate the sum * of the connections to c-points that strongly influence i. HERE WE ONLY WANT THE DIAG CONTIRBUTIONS (intra-unknown) *---------------------------------------------------------*/ /* find row number */ c_num = A_offd_j[jj]; for (jj1 = A_ext_i[c_num]; jj1 < A_ext_i[c_num + 1]; jj1++) { i2 = (HYPRE_Int)A_ext_j[jj1]; if (i2 > -1) { /* in the diagonal block */ if (P_marker[i2] >= jj_begin_row) { /* sum += A_ext_data[jj1]; */ hypre_CSRBlockMatrixBlockAddAccumulateDiag(&A_ext_data[jj1 * bnnz], sum_block, block_size); } } else { /* in the off_diagonal block */ if (P_marker_offd[-i2 - 1] >= jj_begin_row_offd) { /* sum += A_ext_data[jj1]; */ hypre_CSRBlockMatrixBlockAddAccumulateDiag(&A_ext_data[jj1 * bnnz], sum_block, block_size); } } } /* check whether sum_block is singular */ /* distribute = A_offd_data[jj] / sum; */ /* here we want: A_offd_data * sum^(-1) */ if (hypre_CSRBlockMatrixBlockInvMultDiag2(&A_offd_data[jj * bnnz], sum_block, distribute_block, block_size) == 0) { /*--------------------------------------------------------- * Loop over row of A_ext for point i1 and do * the distribution. HERE AGAIN WE ONLY WANT TO DIST W/IN A LIKE UNKNOWN *--------------------------------------------------------*/ /* Diagonal block part of row i1 */ for (jj1 = A_ext_i[c_num]; jj1 < A_ext_i[c_num + 1]; jj1++) { i2 = (HYPRE_Int)A_ext_j[jj1]; if (i2 > -1) /* in the diagonal block */ { if (P_marker[i2] >= jj_begin_row) { /* P_diag_data[P_marker[i2]] += distribute * A_ext_data[jj1]; */ /* multiply - result in sum_block */ hypre_CSRBlockMatrixBlockMultAddDiag2(distribute_block, &A_ext_data[jj1 * bnnz], 0.0, sum_block, block_size); /* add result to p_diag_data */ hypre_CSRBlockMatrixBlockAddAccumulate(sum_block, &P_diag_data[P_marker[i2]*bnnz], block_size); } } else { /* in the off_diagonal block */ if (P_marker_offd[-i2 - 1] >= jj_begin_row_offd) /*P_offd_data[P_marker_offd[-i2-1]] += distribute * A_ext_data[jj1];*/ { /* multiply - result in sum_block */ hypre_CSRBlockMatrixBlockMultAddDiag2(distribute_block, &A_ext_data[jj1 * bnnz], 0.0, sum_block, block_size); /* add result to p_offd_data */ hypre_CSRBlockMatrixBlockAddAccumulate(sum_block, &P_offd_data[P_marker_offd[-i2 - 1]*bnnz], block_size); } } } } } } } /*----------------------------------------------------------------- * Set interpolation weight by dividing by the diagonal. *-----------------------------------------------------------------*/ for (jj = jj_begin_row; jj < jj_end_row; jj++) { /* P_diag_data[jj] /= -diagonal; */ /* want diagonal^(-1)*P_diag_data */ /* do division - put in sum_block */ if ( hypre_CSRBlockMatrixBlockInvMult(diagonal_block, &P_diag_data[jj * bnnz], sum_block, block_size) == 0) { /* now copy to P_diag_data[jj] and make negative */ hypre_CSRBlockMatrixBlockCopyData(sum_block, &P_diag_data[jj * bnnz], -1.0, block_size); } else { /* hypre_printf(" Warning! singular diagonal block! Proc id %d row %d\n", my_id,i); */ /* just make P_diag_data negative since diagonal is singular) */ hypre_CSRBlockMatrixBlockCopyData(&P_diag_data[jj * bnnz], &P_diag_data[jj * bnnz], -1.0, block_size); } } for (jj = jj_begin_row_offd; jj < jj_end_row_offd; jj++) { /* P_offd_data[jj] /= -diagonal; */ /* do division - put in sum_block */ hypre_CSRBlockMatrixBlockInvMult(diagonal_block, &P_offd_data[jj * bnnz], sum_block, block_size); /* now copy to P_offd_data[jj] and make negative */ hypre_CSRBlockMatrixBlockCopyData(sum_block, &P_offd_data[jj * bnnz], -1.0, block_size); } } strong_f_marker--; P_offd_i[i + 1] = jj_counter_offd; } hypre_TFree(P_marker, HYPRE_MEMORY_HOST); hypre_TFree(P_marker_offd, HYPRE_MEMORY_HOST); } /* Now create P - as a block matrix */ P = hypre_ParCSRBlockMatrixCreate(comm, block_size, hypre_ParCSRBlockMatrixGlobalNumRows(A), total_global_cpts, hypre_ParCSRBlockMatrixColStarts(A), num_cpts_global, 0, P_diag_i[n_fine], P_offd_i[n_fine]); P_diag = hypre_ParCSRBlockMatrixDiag(P); hypre_CSRBlockMatrixData(P_diag) = P_diag_data; hypre_CSRBlockMatrixI(P_diag) = P_diag_i; hypre_CSRBlockMatrixJ(P_diag) = P_diag_j; P_offd = hypre_ParCSRBlockMatrixOffd(P); hypre_CSRBlockMatrixData(P_offd) = P_offd_data; hypre_CSRBlockMatrixI(P_offd) = P_offd_i; hypre_CSRBlockMatrixJ(P_offd) = P_offd_j; /* Compress P, removing coefficients smaller than trunc_factor * Max */ if (trunc_factor != 0.0 || max_elmts > 0) { hypre_BoomerAMGBlockInterpTruncation(P, trunc_factor, max_elmts); P_diag_data = hypre_CSRBlockMatrixData(P_diag); P_diag_i = hypre_CSRBlockMatrixI(P_diag); P_diag_j = hypre_CSRBlockMatrixJ(P_diag); P_offd_data = hypre_CSRBlockMatrixData(P_offd); P_offd_i = hypre_CSRBlockMatrixI(P_offd); P_offd_j = hypre_CSRBlockMatrixJ(P_offd); P_diag_size = P_diag_i[n_fine]; P_offd_size = P_offd_i[n_fine]; } num_cols_P_offd = 0; if (P_offd_size) { P_marker = hypre_CTAlloc(HYPRE_Int, num_cols_A_offd, HYPRE_MEMORY_HOST); for (i = 0; i < num_cols_A_offd; i++) { P_marker[i] = 0; } num_cols_P_offd = 0; for (i = 0; i < P_offd_size; i++) { index = P_offd_j[i]; if (!P_marker[index]) { num_cols_P_offd++; P_marker[index] = 1; } } col_map_offd_P = hypre_CTAlloc(HYPRE_BigInt, num_cols_P_offd, HYPRE_MEMORY_HOST); tmp_map_offd = hypre_CTAlloc(HYPRE_Int, num_cols_P_offd, HYPRE_MEMORY_HOST); index = 0; for (i = 0; i < num_cols_P_offd; i++) { while (P_marker[index] == 0) { index++; } tmp_map_offd[i] = index++; } for (i = 0; i < P_offd_size; i++) P_offd_j[i] = hypre_BinarySearch(tmp_map_offd, P_offd_j[i], num_cols_P_offd); hypre_TFree(P_marker, HYPRE_MEMORY_HOST); } for (i = 0; i < n_fine; i++) if (CF_marker[i] == -3) { CF_marker[i] = -1; } if (num_cols_P_offd) { hypre_ParCSRBlockMatrixColMapOffd(P) = col_map_offd_P; hypre_CSRBlockMatrixNumCols(P_offd) = num_cols_P_offd; } /* use block version */ hypre_GetCommPkgBlockRTFromCommPkgBlockA(P, A, tmp_map_offd, fine_to_coarse_offd); *P_ptr = P; hypre_TFree(zero_block, HYPRE_MEMORY_HOST); hypre_TFree(identity_block, HYPRE_MEMORY_HOST); hypre_TFree(diagonal_block, HYPRE_MEMORY_HOST); hypre_TFree(sum_block, HYPRE_MEMORY_HOST); hypre_TFree(distribute_block, HYPRE_MEMORY_HOST); hypre_TFree(CF_marker_offd, HYPRE_MEMORY_HOST); hypre_TFree(tmp_map_offd, HYPRE_MEMORY_HOST); hypre_TFree(big_buf_data, HYPRE_MEMORY_HOST); hypre_TFree(int_buf_data, HYPRE_MEMORY_HOST); hypre_TFree(fine_to_coarse, HYPRE_MEMORY_HOST); hypre_TFree(fine_to_coarse_offd, HYPRE_MEMORY_HOST); hypre_TFree(coarse_counter, HYPRE_MEMORY_HOST); hypre_TFree(jj_count, HYPRE_MEMORY_HOST); hypre_TFree(jj_count_offd, HYPRE_MEMORY_HOST); if (num_procs > 1) { hypre_CSRBlockMatrixDestroy(A_ext); } return (0); } /*--------------------------------------------------------------------------- * hypre_BoomerAMGBlockBuildInterpRV2 Here we are modifying the block interp like in Ruge's elasticity paper as above (applied math comp '86), only instead of using just the diagonals of the scaling matrices (for the fine connections), we use a diagonal matrix whose diag entries are the row sumes (like suggested in Tanya Clees thesis for direct interp) -again there is no differentiation for weak/strong f-connections *--------------------------------------------------------------------------*/ HYPRE_Int hypre_BoomerAMGBuildBlockInterpRV2( hypre_ParCSRBlockMatrix *A, HYPRE_Int *CF_marker, hypre_ParCSRMatrix *S, HYPRE_BigInt *num_cpts_global, HYPRE_Int num_functions, HYPRE_Int *dof_func, HYPRE_Int debug_flag, HYPRE_Real trunc_factor, HYPRE_Int max_elmts, hypre_ParCSRBlockMatrix **P_ptr) { HYPRE_UNUSED_VAR(dof_func); HYPRE_UNUSED_VAR(num_functions); MPI_Comm comm = hypre_ParCSRBlockMatrixComm(A); hypre_ParCSRCommPkg *comm_pkg = hypre_ParCSRBlockMatrixCommPkg(A); hypre_ParCSRCommHandle *comm_handle; hypre_CSRBlockMatrix *A_diag = hypre_ParCSRBlockMatrixDiag(A); HYPRE_Real *A_diag_data = hypre_CSRBlockMatrixData(A_diag); HYPRE_Int *A_diag_i = hypre_CSRBlockMatrixI(A_diag); HYPRE_Int *A_diag_j = hypre_CSRBlockMatrixJ(A_diag); HYPRE_Int block_size = hypre_CSRBlockMatrixBlockSize(A_diag); HYPRE_Int bnnz = block_size * block_size; hypre_CSRBlockMatrix *A_offd = hypre_ParCSRBlockMatrixOffd(A); HYPRE_Real *A_offd_data = hypre_CSRBlockMatrixData(A_offd); HYPRE_Int *A_offd_i = hypre_CSRBlockMatrixI(A_offd); HYPRE_Int *A_offd_j = hypre_CSRBlockMatrixJ(A_offd); HYPRE_Int num_cols_A_offd = hypre_CSRBlockMatrixNumCols(A_offd); HYPRE_BigInt *col_map_offd = hypre_ParCSRBlockMatrixColMapOffd(A); hypre_CSRMatrix *S_diag = hypre_ParCSRMatrixDiag(S); HYPRE_Int *S_diag_i = hypre_CSRMatrixI(S_diag); HYPRE_Int *S_diag_j = hypre_CSRMatrixJ(S_diag); hypre_CSRMatrix *S_offd = hypre_ParCSRMatrixOffd(S); HYPRE_Int *S_offd_i = hypre_CSRMatrixI(S_offd); HYPRE_Int *S_offd_j = hypre_CSRMatrixJ(S_offd); hypre_ParCSRBlockMatrix *P; HYPRE_BigInt *col_map_offd_P; HYPRE_Int *tmp_map_offd = NULL; HYPRE_Int *CF_marker_offd = NULL; hypre_CSRBlockMatrix *A_ext = NULL; HYPRE_Real *A_ext_data = NULL; HYPRE_Int *A_ext_i = NULL; HYPRE_BigInt *A_ext_j = NULL; hypre_CSRBlockMatrix *P_diag; hypre_CSRBlockMatrix *P_offd; HYPRE_Real *P_diag_data; HYPRE_Int *P_diag_i; HYPRE_Int *P_diag_j; HYPRE_Real *P_offd_data; HYPRE_Int *P_offd_i; HYPRE_Int *P_offd_j; HYPRE_Int P_diag_size, P_offd_size; HYPRE_Int *P_marker, *P_marker_offd = NULL; HYPRE_Int jj_counter, jj_counter_offd; HYPRE_Int *jj_count, *jj_count_offd = NULL; HYPRE_Int jj_begin_row, jj_begin_row_offd; HYPRE_Int jj_end_row, jj_end_row_offd; HYPRE_Int start_indexing = 0; /* start indexing for P_data at 0 */ HYPRE_Int n_fine = hypre_CSRBlockMatrixNumRows(A_diag); HYPRE_Int strong_f_marker; HYPRE_Int *fine_to_coarse; HYPRE_BigInt *fine_to_coarse_offd = NULL; HYPRE_Int *coarse_counter; HYPRE_Int coarse_shift; HYPRE_BigInt total_global_cpts; HYPRE_Int num_cols_P_offd; HYPRE_BigInt my_first_cpt; HYPRE_Int bd; HYPRE_Int i, i1, i2; HYPRE_Int j, jl, jj, jj1; HYPRE_Int kc; HYPRE_BigInt big_k; HYPRE_Int start; HYPRE_Int c_num; HYPRE_Int my_id; HYPRE_Int num_procs; HYPRE_Int num_threads; HYPRE_Int num_sends; HYPRE_Int index; HYPRE_Int ns, ne, size, rest; HYPRE_Int *int_buf_data = NULL; HYPRE_BigInt *big_buf_data = NULL; HYPRE_BigInt col_1 = hypre_ParCSRBlockMatrixFirstRowIndex(A); HYPRE_Int local_numrows = hypre_CSRBlockMatrixNumRows(A_diag); HYPRE_BigInt col_n = col_1 + (HYPRE_BigInt)local_numrows; HYPRE_Real wall_time = 0.0; /* for debugging instrumentation */ HYPRE_Real *identity_block; HYPRE_Real *zero_block; HYPRE_Real *diagonal_block; HYPRE_Real *sum_block; HYPRE_Real *distribute_block; hypre_MPI_Comm_size(comm, &num_procs); hypre_MPI_Comm_rank(comm, &my_id); num_threads = hypre_NumThreads(); my_first_cpt = num_cpts_global[0]; if (my_id == (num_procs - 1)) { total_global_cpts = num_cpts_global[1]; } hypre_MPI_Bcast(&total_global_cpts, 1, HYPRE_MPI_BIG_INT, num_procs - 1, comm); /*------------------------------------------------------------------- * Get the CF_marker data for the off-processor columns *-------------------------------------------------------------------*/ if (debug_flag == 4) { wall_time = time_getWallclockSeconds(); } CF_marker_offd = hypre_CTAlloc(HYPRE_Int, num_cols_A_offd, HYPRE_MEMORY_HOST); if (!comm_pkg) { hypre_BlockMatvecCommPkgCreate(A); comm_pkg = hypre_ParCSRBlockMatrixCommPkg(A); } num_sends = hypre_ParCSRCommPkgNumSends(comm_pkg); int_buf_data = hypre_CTAlloc(HYPRE_Int, hypre_ParCSRCommPkgSendMapStart(comm_pkg, num_sends), HYPRE_MEMORY_HOST); index = 0; for (i = 0; i < num_sends; i++) { start = hypre_ParCSRCommPkgSendMapStart(comm_pkg, i); for (j = start; j < hypre_ParCSRCommPkgSendMapStart(comm_pkg, i + 1); j++) { int_buf_data[index++] = CF_marker[hypre_ParCSRCommPkgSendMapElmt(comm_pkg, j)]; } } /* we do not need the block version of comm handle - because CF_marker corresponds to the nodal matrix. This call populates CF_marker_offd */ comm_handle = hypre_ParCSRCommHandleCreate( 11, comm_pkg, int_buf_data, CF_marker_offd); hypre_ParCSRCommHandleDestroy(comm_handle); if (debug_flag == 4) { wall_time = time_getWallclockSeconds() - wall_time; hypre_printf("Proc = %d Interp: Comm 1 CF_marker = %f\n", my_id, wall_time); fflush(NULL); } /*---------------------------------------------------------------------- * Get the ghost rows of A *---------------------------------------------------------------------*/ if (debug_flag == 4) { wall_time = time_getWallclockSeconds(); } if (num_procs > 1) { A_ext = hypre_ParCSRBlockMatrixExtractBExt(A, A, 1); A_ext_i = hypre_CSRBlockMatrixI(A_ext); A_ext_j = hypre_CSRBlockMatrixBigJ(A_ext); A_ext_data = hypre_CSRBlockMatrixData(A_ext); } index = 0; for (i = 0; i < num_cols_A_offd; i++) { for (j = A_ext_i[i]; j < A_ext_i[i + 1]; j++) { big_k = A_ext_j[j]; if (big_k >= col_1 && big_k < col_n) { A_ext_j[index] = big_k - col_1; /* for the data field we must get all of the blocbig_k data */ for (bd = 0; bd < bnnz; bd++) { A_ext_data[index * bnnz + bd] = A_ext_data[j * bnnz + bd]; } index++; } else { kc = hypre_BigBinarySearch(col_map_offd, big_k, num_cols_A_offd); if (kc > -1) { A_ext_j[index] = (HYPRE_BigInt)(-kc - 1); for (bd = 0; bd < bnnz; bd++) { A_ext_data[index * bnnz + bd] = A_ext_data[j * bnnz + bd]; } index++; } } } A_ext_i[i] = index; } for (i = num_cols_A_offd; i > 0; i--) { A_ext_i[i] = A_ext_i[i - 1]; } if (num_procs > 1) { A_ext_i[0] = 0; } if (debug_flag == 4) { wall_time = time_getWallclockSeconds() - wall_time; hypre_printf("Proc = %d Interp: Comm 2 Get A_ext = %f\n", my_id, wall_time); fflush(NULL); } /*----------------------------------------------------------------------- * First Pass: Determine size of P and fill in fine_to_coarse mapping. *-----------------------------------------------------------------------*/ /*----------------------------------------------------------------------- * Intialize counters and allocate mapping vector. *-----------------------------------------------------------------------*/ coarse_counter = hypre_CTAlloc(HYPRE_Int, num_threads, HYPRE_MEMORY_HOST); jj_count = hypre_CTAlloc(HYPRE_Int, num_threads, HYPRE_MEMORY_HOST); jj_count_offd = hypre_CTAlloc(HYPRE_Int, num_threads, HYPRE_MEMORY_HOST); fine_to_coarse = hypre_CTAlloc(HYPRE_Int, n_fine, HYPRE_MEMORY_HOST); for (i = 0; i < n_fine; i++) { fine_to_coarse[i] = -1; } jj_counter = start_indexing; jj_counter_offd = start_indexing; /*----------------------------------------------------------------------- * Loop over fine grid. *-----------------------------------------------------------------------*/ for (j = 0; j < num_threads; j++) { size = n_fine / num_threads; rest = n_fine - size * num_threads; if (j < rest) { ns = j * size + j; ne = (j + 1) * size + j + 1; } else { ns = j * size + rest; ne = (j + 1) * size + rest; } /* loop over the fine grid points */ for (i = ns; i < ne; i++) { /*-------------------------------------------------------------------- * If i is a C-point, interpolation is the identity. Also set up * mapping vector (fine_to_coarse is the mapping vector). *--------------------------------------------------------------------*/ if (CF_marker[i] >= 0) { jj_count[j]++; fine_to_coarse[i] = coarse_counter[j]; coarse_counter[j]++; } /*-------------------------------------------------------------------- * If i is an F-point, interpolation is from the C-points that * strongly influence i. *--------------------------------------------------------------------*/ else { for (jj = S_diag_i[i]; jj < S_diag_i[i + 1]; jj++) { i1 = S_diag_j[jj]; if (CF_marker[i1] >= 0) { jj_count[j]++; } } if (num_procs > 1) { for (jj = S_offd_i[i]; jj < S_offd_i[i + 1]; jj++) { i1 = S_offd_j[jj]; if (CF_marker_offd[i1] >= 0) { jj_count_offd[j]++; } } } } } } /*----------------------------------------------------------------------- * Allocate arrays. *-----------------------------------------------------------------------*/ for (i = 0; i < num_threads - 1; i++) { coarse_counter[i + 1] += coarse_counter[i]; jj_count[i + 1] += jj_count[i]; jj_count_offd[i + 1] += jj_count_offd[i]; } i = num_threads - 1; jj_counter = jj_count[i]; jj_counter_offd = jj_count_offd[i]; P_diag_size = jj_counter; P_diag_i = hypre_CTAlloc(HYPRE_Int, n_fine + 1, HYPRE_MEMORY_HOST); P_diag_j = hypre_CTAlloc(HYPRE_Int, P_diag_size, HYPRE_MEMORY_HOST); /* we need to include the size of the blocks in the data size */ P_diag_data = hypre_CTAlloc(HYPRE_Real, P_diag_size * bnnz, HYPRE_MEMORY_HOST); P_diag_i[n_fine] = jj_counter; P_offd_size = jj_counter_offd; P_offd_i = hypre_CTAlloc(HYPRE_Int, n_fine + 1, HYPRE_MEMORY_HOST); P_offd_j = hypre_CTAlloc(HYPRE_Int, P_offd_size, HYPRE_MEMORY_HOST); /* we need to include the size of the blocks in the data size */ P_offd_data = hypre_CTAlloc(HYPRE_Real, P_offd_size * bnnz, HYPRE_MEMORY_HOST); /*----------------------------------------------------------------------- * Intialize some stuff. *-----------------------------------------------------------------------*/ jj_counter = start_indexing; jj_counter_offd = start_indexing; if (debug_flag == 4) { wall_time = time_getWallclockSeconds() - wall_time; hypre_printf("Proc = %d Interp: Internal work 1 = %f\n", my_id, wall_time); fflush(NULL); } /* we need a block identity and a block of zeros*/ identity_block = hypre_CTAlloc(HYPRE_Real, bnnz, HYPRE_MEMORY_HOST); zero_block = hypre_CTAlloc(HYPRE_Real, bnnz, HYPRE_MEMORY_HOST); for (i = 0; i < block_size; i++) { identity_block[i * block_size + i] = 1.0; } /* we also need a block to keep track of the diagonal values and a sum */ diagonal_block = hypre_CTAlloc(HYPRE_Real, bnnz, HYPRE_MEMORY_HOST); sum_block = hypre_CTAlloc(HYPRE_Real, bnnz, HYPRE_MEMORY_HOST); distribute_block = hypre_CTAlloc(HYPRE_Real, bnnz, HYPRE_MEMORY_HOST); /*----------------------------------------------------------------------- * Send and receive fine_to_coarse info. *-----------------------------------------------------------------------*/ if (debug_flag == 4) { wall_time = time_getWallclockSeconds(); } fine_to_coarse_offd = hypre_CTAlloc(HYPRE_BigInt, num_cols_A_offd, HYPRE_MEMORY_HOST); big_buf_data = hypre_CTAlloc(HYPRE_BigInt, hypre_ParCSRCommPkgSendMapStart(comm_pkg, num_sends), HYPRE_MEMORY_HOST); for (j = 0; j < num_threads; j++) { coarse_shift = 0; if (j > 0) { coarse_shift = coarse_counter[j - 1]; } size = n_fine / num_threads; rest = n_fine - size * num_threads; if (j < rest) { ns = j * size + j; ne = (j + 1) * size + j + 1; } else { ns = j * size + rest; ne = (j + 1) * size + rest; } for (i = ns; i < ne; i++) { fine_to_coarse[i] += coarse_shift; } } index = 0; for (i = 0; i < num_sends; i++) { start = hypre_ParCSRCommPkgSendMapStart(comm_pkg, i); for (j = start; j < hypre_ParCSRCommPkgSendMapStart(comm_pkg, i + 1); j++) big_buf_data[index++] = my_first_cpt + fine_to_coarse[hypre_ParCSRCommPkgSendMapElmt(comm_pkg, j)]; } /* again, we do not need to use the block version of comm handle since the fine to coarse mapping is size of the nodes */ comm_handle = hypre_ParCSRCommHandleCreate( 21, comm_pkg, big_buf_data, fine_to_coarse_offd); hypre_ParCSRCommHandleDestroy(comm_handle); if (debug_flag == 4) { wall_time = time_getWallclockSeconds() - wall_time; hypre_printf("Proc = %d Interp: Comm 4 FineToCoarse = %f\n", my_id, wall_time); fflush(NULL); } if (debug_flag == 4) { wall_time = time_getWallclockSeconds(); } /*----------------------------------------------------------------------- * Loop over fine grid points. *-----------------------------------------------------------------------*/ for (jl = 0; jl < num_threads; jl++) { size = n_fine / num_threads; rest = n_fine - size * num_threads; if (jl < rest) { ns = jl * size + jl; ne = (jl + 1) * size + jl + 1; } else { ns = jl * size + rest; ne = (jl + 1) * size + rest; } jj_counter = 0; if (jl > 0) { jj_counter = jj_count[jl - 1]; } jj_counter_offd = 0; if (jl > 0) { jj_counter_offd = jj_count_offd[jl - 1]; } P_marker = hypre_CTAlloc(HYPRE_Int, n_fine, HYPRE_MEMORY_HOST); P_marker_offd = hypre_CTAlloc(HYPRE_Int, num_cols_A_offd, HYPRE_MEMORY_HOST); for (i = 0; i < n_fine; i++) { P_marker[i] = -1; } for (i = 0; i < num_cols_A_offd; i++) { P_marker_offd[i] = -1; } strong_f_marker = -2; for (i = ns; i < ne; i++) { /*-------------------------------------------------------------------- * If i is a c-point, interpolation is the identity. *--------------------------------------------------------------------*/ if (CF_marker[i] >= 0) { P_diag_i[i] = jj_counter; P_diag_j[jj_counter] = fine_to_coarse[i]; /* P_diag_data[jj_counter] = one; */ hypre_CSRBlockMatrixBlockCopyData(identity_block, &P_diag_data[jj_counter * bnnz], 1.0, block_size); jj_counter++; } /*-------------------------------------------------------------------- * If i is an F-point, build interpolation. *--------------------------------------------------------------------*/ else { /* Diagonal part of P */ P_diag_i[i] = jj_counter; jj_begin_row = jj_counter; for (jj = S_diag_i[i]; jj < S_diag_i[i + 1]; jj++) { i1 = S_diag_j[jj]; /*-------------------------------------------------------------- * If neighbor i1 is a C-point, set column number in P_diag_j * and initialize interpolation weight to zero. *--------------------------------------------------------------*/ if (CF_marker[i1] >= 0) { P_marker[i1] = jj_counter; P_diag_j[jj_counter] = fine_to_coarse[i1]; /* P_diag_data[jj_counter] = zero; */ hypre_CSRBlockMatrixBlockCopyData(zero_block, &P_diag_data[jj_counter * bnnz], 1.0, block_size); jj_counter++; } /*-------------------------------------------------------------- * If neighbor i1 is an F-point, mark it as a strong F-point * whose connection needs to be distributed. *--------------------------------------------------------------*/ else if (CF_marker[i1] != -3) { P_marker[i1] = strong_f_marker; } } jj_end_row = jj_counter; /* Off-Diagonal part of P */ P_offd_i[i] = jj_counter_offd; jj_begin_row_offd = jj_counter_offd; if (num_procs > 1) { for (jj = S_offd_i[i]; jj < S_offd_i[i + 1]; jj++) { i1 = S_offd_j[jj]; /*----------------------------------------------------------- * If neighbor i1 is a C-point, set column number in P_offd_j * and initialize interpolation weight to zero. *-----------------------------------------------------------*/ if (CF_marker_offd[i1] >= 0) { P_marker_offd[i1] = jj_counter_offd; P_offd_j[jj_counter_offd] = i1; /* P_offd_data[jj_counter_offd] = zero; */ hypre_CSRBlockMatrixBlockCopyData(zero_block, &P_offd_data[jj_counter_offd * bnnz], 1.0, block_size); jj_counter_offd++; } /*----------------------------------------------------------- * If neighbor i1 is an F-point, mark it as a strong F-point * whose connection needs to be distributed. *-----------------------------------------------------------*/ else if (CF_marker_offd[i1] != -3) { P_marker_offd[i1] = strong_f_marker; } } } jj_end_row_offd = jj_counter_offd; /* get the diagonal block */ /* diagonal = A_diag_data[A_diag_i[i]]; */ hypre_CSRBlockMatrixBlockCopyData(&A_diag_data[A_diag_i[i]*bnnz], diagonal_block, 1.0, block_size); /* Here we go through the neighborhood of this grid point */ /* Loop over ith row of A. First, the diagonal part of A */ for (jj = A_diag_i[i] + 1; jj < A_diag_i[i + 1]; jj++) { i1 = A_diag_j[jj]; /*-------------------------------------------------------------- * Case 1: neighbor i1 is a C-point and strongly influences i, * accumulate a_{i,i1} into the interpolation weight. *--------------------------------------------------------------*/ if (P_marker[i1] >= jj_begin_row) { /* P_diag_data[P_marker[i1]] += A_diag_data[jj]; */ hypre_CSRBlockMatrixBlockAddAccumulate(&A_diag_data[jj * bnnz], &P_diag_data[P_marker[i1]*bnnz], block_size); } /*-------------------------------------------------------------- * Case 2: neighbor i1 is an F-point (MAY or MAY NOT strongly influences i), * distribute a_{i,i1} to C-points that strongly infuence i. * Note: currently no distribution to the diagonal in this case. *--------------------------------------------------------------*/ else if (P_marker[i1] == strong_f_marker || CF_marker[i1] != -3) { /* initialize sum to zero */ /* sum = zero; */ hypre_CSRBlockMatrixBlockCopyData(zero_block, sum_block, 1.0, block_size); /*----------------------------------------------------------- * Loop over row of A for point i1 and calculate the sum * of the connections to c-points that strongly influence i.- HERE WE ONLY WANT THE DIAG CONTIRBUTIONS (intra-unknown) *-----------------------------------------------------------*/ /* Diagonal block part of row i1 */ for (jj1 = A_diag_i[i1]; jj1 < A_diag_i[i1 + 1]; jj1++) { i2 = A_diag_j[jj1]; if (P_marker[i2] >= jj_begin_row) { /* add diag data to sum */ /* sum += A_diag_data[jj1]; */ hypre_CSRBlockMatrixBlockAddAccumulateDiag(&A_diag_data[jj1 * bnnz], sum_block, block_size); } } /* Off-Diagonal block part of row i1 */ if (num_procs > 1) { for (jj1 = A_offd_i[i1]; jj1 < A_offd_i[i1 + 1]; jj1++) { i2 = A_offd_j[jj1]; if (P_marker_offd[i2] >= jj_begin_row_offd ) { /* add off diag data to sum */ /*sum += A_offd_data[jj1];*/ hypre_CSRBlockMatrixBlockAddAccumulateDiag(&A_offd_data[jj1 * bnnz], sum_block, block_size); } } } /* check whether sum_block is singular (NOW SUM IS A DIAG MATRIX WHOSE ENTRIES ARE THE ROW SUMS)*/ /* distribute = A_diag_data[jj] / sum; (if a diag element is 0 then that col is scaled by 1 instead of 1/diag) - doesn'treturn 0*/ if (hypre_CSRBlockMatrixBlockInvMultDiag3(&A_diag_data[jj * bnnz], sum_block, distribute_block, block_size) == 0) { /*----------------------------------------------------------- * Loop over row of A for point i1 and do the distribution.- (here we we use row-sums for the nodes recv. the distribution) *-----------------------------------------------------------*/ /* Diagonal block part of row i1 */ for (jj1 = A_diag_i[i1]; jj1 < A_diag_i[i1 + 1]; jj1++) { i2 = A_diag_j[jj1]; if (P_marker[i2] >= jj_begin_row ) { /* P_diag_data[P_marker[i2]] += distribute * A_diag_data[jj1];*/ /* multiply - result in sum_block */ hypre_CSRBlockMatrixBlockMultAddDiag3(distribute_block, &A_diag_data[jj1 * bnnz], 0.0, sum_block, block_size); /* add result to p_diag_data */ hypre_CSRBlockMatrixBlockAddAccumulate(sum_block, &P_diag_data[P_marker[i2]*bnnz], block_size); } } /* Off-Diagonal block part of row i1 */ if (num_procs > 1) { for (jj1 = A_offd_i[i1]; jj1 < A_offd_i[i1 + 1]; jj1++) { i2 = A_offd_j[jj1]; if (P_marker_offd[i2] >= jj_begin_row_offd) { /* P_offd_data[P_marker_offd[i2]] += distribute * A_offd_data[jj1]; */ /* multiply - result in sum_block */ hypre_CSRBlockMatrixBlockMultAddDiag3(distribute_block, &A_offd_data[jj1 * bnnz], 0.0, sum_block, block_size); /* add result to p_offd_data */ hypre_CSRBlockMatrixBlockAddAccumulate(sum_block, &P_offd_data[P_marker_offd[i2]*bnnz], block_size); } } } } } } /*---------------------------------------------------------------- * Still looping over ith row of A. Next, loop over the * off-diagonal part of A *---------------------------------------------------------------*/ if (num_procs > 1) { for (jj = A_offd_i[i]; jj < A_offd_i[i + 1]; jj++) { i1 = A_offd_j[jj]; /*-------------------------------------------------------------- * Case 1: neighbor i1 is a C-point and strongly influences i, * accumulate a_{i,i1} into the interpolation weight. *--------------------------------------------------------------*/ if (P_marker_offd[i1] >= jj_begin_row_offd) { /* P_offd_data[P_marker_offd[i1]] += A_offd_data[jj]; */ hypre_CSRBlockMatrixBlockAddAccumulate( &A_offd_data[jj * bnnz], &P_offd_data[P_marker_offd[i1]*bnnz], block_size); } /*------------------------------------------------------------ * Case 2: neighbor i1 is an F-point and (MAY or MAY NOT strongly influences i), * distribute a_{i,i1} to C-points that strongly infuence i. * Note: currently no distribution to the diagonal in this case. *-----------------------------------------------------------*/ else if (P_marker_offd[i1] == strong_f_marker || CF_marker[i1] != -3 ) { /* initialize sum to zero */ hypre_CSRBlockMatrixBlockCopyData(zero_block, sum_block, 1.0, block_size); /*--------------------------------------------------------- * Loop over row of A_ext for point i1 and calculate the sum * of the connections to c-points that strongly influence i. HERE WE ONLY WANT THE DIAG CONTIRBUTIONS (intra-unknown) *---------------------------------------------------------*/ /* find row number */ c_num = A_offd_j[jj]; for (jj1 = A_ext_i[c_num]; jj1 < A_ext_i[c_num + 1]; jj1++) { i2 = (HYPRE_Int)A_ext_j[jj1]; if (i2 > -1) { /* in the diagonal block */ if (P_marker[i2] >= jj_begin_row) { /* sum += A_ext_data[jj1]; */ hypre_CSRBlockMatrixBlockAddAccumulateDiag(&A_ext_data[jj1 * bnnz], sum_block, block_size); } } else { /* in the off_diagonal block */ if (P_marker_offd[-i2 - 1] >= jj_begin_row_offd) { /* sum += A_ext_data[jj1]; */ hypre_CSRBlockMatrixBlockAddAccumulateDiag(&A_ext_data[jj1 * bnnz], sum_block, block_size); } } } /* check whether sum_block is singular */ /* distribute = A_offd_data[jj] / sum; */ /* here we want: A_offd_data * sum^(-1) - use the row sums as the diag for sum*/ if (hypre_CSRBlockMatrixBlockInvMultDiag3(&A_offd_data[jj * bnnz], sum_block, distribute_block, block_size) == 0) { /*--------------------------------------------------------- * Loop over row of A_ext for point i1 and do * the distribution. *--------------------------------------------------------*/ /* Diagonal block part of row i1 */ for (jj1 = A_ext_i[c_num]; jj1 < A_ext_i[c_num + 1]; jj1++) { i2 = (HYPRE_Int)A_ext_j[jj1]; if (i2 > -1) /* in the diagonal block */ { if (P_marker[i2] >= jj_begin_row) { /* P_diag_data[P_marker[i2]] += distribute * A_ext_data[jj1]; */ /* multiply - result in sum_block */ hypre_CSRBlockMatrixBlockMultAddDiag3(distribute_block, &A_ext_data[jj1 * bnnz], 0.0, sum_block, block_size); /* add result to p_diag_data */ hypre_CSRBlockMatrixBlockAddAccumulate(sum_block, &P_diag_data[P_marker[i2]*bnnz], block_size); } } else { /* in the off_diagonal block */ if (P_marker_offd[-i2 - 1] >= jj_begin_row_offd) /*P_offd_data[P_marker_offd[-i2-1]] += distribute * A_ext_data[jj1];*/ { /* multiply - result in sum_block */ hypre_CSRBlockMatrixBlockMultAddDiag3(distribute_block, &A_ext_data[jj1 * bnnz], 0.0, sum_block, block_size); /* add result to p_offd_data */ hypre_CSRBlockMatrixBlockAddAccumulate(sum_block, &P_offd_data[P_marker_offd[-i2 - 1]*bnnz], block_size); } } } } } } } /*----------------------------------------------------------------- * Set interpolation weight by dividing by the diagonal. *-----------------------------------------------------------------*/ for (jj = jj_begin_row; jj < jj_end_row; jj++) { /* P_diag_data[jj] /= -diagonal; */ /* want diagonal^(-1)*P_diag_data */ /* do division - put in sum_block */ if ( hypre_CSRBlockMatrixBlockInvMult(diagonal_block, &P_diag_data[jj * bnnz], sum_block, block_size) == 0) { /* now copy to P_diag_data[jj] and make negative */ hypre_CSRBlockMatrixBlockCopyData(sum_block, &P_diag_data[jj * bnnz], -1.0, block_size); } else { /* hypre_printf(" Warning! singular diagonal block! Proc id %d row %d\n", my_id,i); */ /* just make P_diag_data negative since diagonal is singular) */ hypre_CSRBlockMatrixBlockCopyData(&P_diag_data[jj * bnnz], &P_diag_data[jj * bnnz], -1.0, block_size); } } for (jj = jj_begin_row_offd; jj < jj_end_row_offd; jj++) { /* P_offd_data[jj] /= -diagonal; */ /* do division - put in sum_block */ hypre_CSRBlockMatrixBlockInvMult(diagonal_block, &P_offd_data[jj * bnnz], sum_block, block_size); /* now copy to P_offd_data[jj] and make negative */ hypre_CSRBlockMatrixBlockCopyData(sum_block, &P_offd_data[jj * bnnz], -1.0, block_size); } } strong_f_marker--; P_offd_i[i + 1] = jj_counter_offd; } hypre_TFree(P_marker, HYPRE_MEMORY_HOST); hypre_TFree(P_marker_offd, HYPRE_MEMORY_HOST); } /* Now create P - as a block matrix */ P = hypre_ParCSRBlockMatrixCreate(comm, block_size, hypre_ParCSRBlockMatrixGlobalNumRows(A), total_global_cpts, hypre_ParCSRBlockMatrixColStarts(A), num_cpts_global, 0, P_diag_i[n_fine], P_offd_i[n_fine]); P_diag = hypre_ParCSRBlockMatrixDiag(P); hypre_CSRBlockMatrixData(P_diag) = P_diag_data; hypre_CSRBlockMatrixI(P_diag) = P_diag_i; hypre_CSRBlockMatrixJ(P_diag) = P_diag_j; P_offd = hypre_ParCSRBlockMatrixOffd(P); hypre_CSRBlockMatrixData(P_offd) = P_offd_data; hypre_CSRBlockMatrixI(P_offd) = P_offd_i; hypre_CSRBlockMatrixJ(P_offd) = P_offd_j; /* Compress P, removing coefficients smaller than trunc_factor * Max */ if (trunc_factor != 0.0 || max_elmts > 0) { hypre_BoomerAMGBlockInterpTruncation(P, trunc_factor, max_elmts); P_diag_data = hypre_CSRBlockMatrixData(P_diag); P_diag_i = hypre_CSRBlockMatrixI(P_diag); P_diag_j = hypre_CSRBlockMatrixJ(P_diag); P_offd_data = hypre_CSRBlockMatrixData(P_offd); P_offd_i = hypre_CSRBlockMatrixI(P_offd); P_offd_j = hypre_CSRBlockMatrixJ(P_offd); P_diag_size = P_diag_i[n_fine]; P_offd_size = P_offd_i[n_fine]; } num_cols_P_offd = 0; if (P_offd_size) { P_marker = hypre_CTAlloc(HYPRE_Int, num_cols_A_offd, HYPRE_MEMORY_HOST); for (i = 0; i < num_cols_A_offd; i++) { P_marker[i] = 0; } num_cols_P_offd = 0; for (i = 0; i < P_offd_size; i++) { index = P_offd_j[i]; if (!P_marker[index]) { num_cols_P_offd++; P_marker[index] = 1; } } tmp_map_offd = hypre_CTAlloc(HYPRE_Int, num_cols_P_offd, HYPRE_MEMORY_HOST); col_map_offd_P = hypre_CTAlloc(HYPRE_BigInt, num_cols_P_offd, HYPRE_MEMORY_HOST); index = 0; for (i = 0; i < num_cols_P_offd; i++) { while (P_marker[index] == 0) { index++; } tmp_map_offd[i] = index++; } for (i = 0; i < P_offd_size; i++) P_offd_j[i] = hypre_BinarySearch(tmp_map_offd, P_offd_j[i], num_cols_P_offd); hypre_TFree(P_marker, HYPRE_MEMORY_HOST); } for (i = 0; i < n_fine; i++) if (CF_marker[i] == -3) { CF_marker[i] = -1; } if (num_cols_P_offd) { hypre_ParCSRBlockMatrixColMapOffd(P) = col_map_offd_P; hypre_CSRBlockMatrixNumCols(P_offd) = num_cols_P_offd; } /* use block version */ hypre_GetCommPkgBlockRTFromCommPkgBlockA(P, A, tmp_map_offd, fine_to_coarse_offd); *P_ptr = P; hypre_TFree(zero_block, HYPRE_MEMORY_HOST); hypre_TFree(identity_block, HYPRE_MEMORY_HOST); hypre_TFree(diagonal_block, HYPRE_MEMORY_HOST); hypre_TFree(sum_block, HYPRE_MEMORY_HOST); hypre_TFree(distribute_block, HYPRE_MEMORY_HOST); hypre_TFree(CF_marker_offd, HYPRE_MEMORY_HOST); hypre_TFree(tmp_map_offd, HYPRE_MEMORY_HOST); hypre_TFree(big_buf_data, HYPRE_MEMORY_HOST); hypre_TFree(int_buf_data, HYPRE_MEMORY_HOST); hypre_TFree(fine_to_coarse, HYPRE_MEMORY_HOST); hypre_TFree(fine_to_coarse_offd, HYPRE_MEMORY_HOST); hypre_TFree(coarse_counter, HYPRE_MEMORY_HOST); hypre_TFree(jj_count, HYPRE_MEMORY_HOST); hypre_TFree(jj_count_offd, HYPRE_MEMORY_HOST); if (num_procs > 1) { hypre_CSRBlockMatrixDestroy(A_ext); } return (0); } /*--------------------------------------------------------------------------- * hypre_BoomerAMGBuildBlockDirInterp *--------------------------------------------------------------------------*/ HYPRE_Int hypre_BoomerAMGBuildBlockDirInterp( hypre_ParCSRBlockMatrix *A, HYPRE_Int *CF_marker, hypre_ParCSRMatrix *S, HYPRE_BigInt *num_cpts_global, HYPRE_Int num_functions, HYPRE_Int *dof_func, HYPRE_Int debug_flag, HYPRE_Real trunc_factor, HYPRE_Int max_elmts, hypre_ParCSRBlockMatrix **P_ptr) { HYPRE_UNUSED_VAR(dof_func); MPI_Comm comm = hypre_ParCSRBlockMatrixComm(A); hypre_ParCSRCommPkg *comm_pkg = hypre_ParCSRBlockMatrixCommPkg(A); hypre_ParCSRCommHandle *comm_handle; hypre_CSRBlockMatrix *A_diag = hypre_ParCSRBlockMatrixDiag(A); HYPRE_Real *A_diag_data = hypre_CSRBlockMatrixData(A_diag); HYPRE_Int *A_diag_i = hypre_CSRBlockMatrixI(A_diag); HYPRE_Int *A_diag_j = hypre_CSRBlockMatrixJ(A_diag); HYPRE_Int block_size = hypre_CSRBlockMatrixBlockSize(A_diag); HYPRE_Int bnnz = block_size * block_size; hypre_CSRBlockMatrix *A_offd = hypre_ParCSRBlockMatrixOffd(A); HYPRE_Real *A_offd_data = hypre_CSRBlockMatrixData(A_offd); HYPRE_Int *A_offd_i = hypre_CSRBlockMatrixI(A_offd); HYPRE_Int *A_offd_j = hypre_CSRBlockMatrixJ(A_offd); HYPRE_Int num_cols_A_offd = hypre_CSRBlockMatrixNumCols(A_offd); hypre_CSRMatrix *S_diag = hypre_ParCSRMatrixDiag(S); HYPRE_Int *S_diag_i = hypre_CSRMatrixI(S_diag); HYPRE_Int *S_diag_j = hypre_CSRMatrixJ(S_diag); hypre_CSRMatrix *S_offd = hypre_ParCSRMatrixOffd(S); HYPRE_Int *S_offd_i = hypre_CSRMatrixI(S_offd); HYPRE_Int *S_offd_j = hypre_CSRMatrixJ(S_offd); hypre_ParCSRBlockMatrix *P; HYPRE_BigInt *col_map_offd_P; HYPRE_Int *tmp_map_offd = NULL; HYPRE_Int *CF_marker_offd = NULL; HYPRE_Int *dof_func_offd = NULL; hypre_CSRBlockMatrix *P_diag; hypre_CSRBlockMatrix *P_offd; HYPRE_Real *P_diag_data; HYPRE_Int *P_diag_i; HYPRE_Int *P_diag_j; HYPRE_Real *P_offd_data; HYPRE_Int *P_offd_i; HYPRE_Int *P_offd_j; HYPRE_Int P_diag_size, P_offd_size; HYPRE_Int *P_marker, *P_marker_offd = NULL; HYPRE_Int jj_counter, jj_counter_offd; HYPRE_Int *jj_count, *jj_count_offd = NULL; HYPRE_Int jj_begin_row, jj_begin_row_offd; HYPRE_Int jj_end_row, jj_end_row_offd; HYPRE_Int start_indexing = 0; /* start indexing for P_data at 0 */ HYPRE_Int n_fine = hypre_CSRBlockMatrixNumRows(A_diag); HYPRE_Int *fine_to_coarse; HYPRE_BigInt *fine_to_coarse_offd = NULL; HYPRE_Int *coarse_counter; HYPRE_Int coarse_shift; HYPRE_BigInt total_global_cpts; HYPRE_Int num_cols_P_offd; HYPRE_BigInt my_first_cpt; HYPRE_Int i, i1; HYPRE_Int j, jl, jj; HYPRE_Int start; HYPRE_Int my_id; HYPRE_Int num_procs; HYPRE_Int num_threads; HYPRE_Int num_sends; HYPRE_Int index; HYPRE_Int ns, ne, size, rest; HYPRE_Int *int_buf_data = NULL; HYPRE_BigInt *big_buf_data = NULL; HYPRE_Real wall_time = 0.0; /* for debugging instrumentation */ HYPRE_Real *identity_block; HYPRE_Real *zero_block; HYPRE_Real *diagonal_block; HYPRE_Real *sum_block_p; HYPRE_Real *sum_block_n; HYPRE_Real *r_block; hypre_MPI_Comm_size(comm, &num_procs); hypre_MPI_Comm_rank(comm, &my_id); num_threads = hypre_NumThreads(); if (num_functions > 1) { hypre_error_w_msg(HYPRE_ERROR_GENERIC, "Not implemented for num_functions > 1!"); } my_first_cpt = num_cpts_global[0]; if (my_id == (num_procs - 1)) { total_global_cpts = num_cpts_global[1]; } hypre_MPI_Bcast(&total_global_cpts, 1, HYPRE_MPI_BIG_INT, num_procs - 1, comm); /*------------------------------------------------------------------- * Get the CF_marker data for the off-processor columns *-------------------------------------------------------------------*/ if (debug_flag == 4) { wall_time = time_getWallclockSeconds(); } CF_marker_offd = hypre_CTAlloc(HYPRE_Int, num_cols_A_offd, HYPRE_MEMORY_HOST); if (!comm_pkg) { hypre_BlockMatvecCommPkgCreate(A); comm_pkg = hypre_ParCSRBlockMatrixCommPkg(A); } num_sends = hypre_ParCSRCommPkgNumSends(comm_pkg); int_buf_data = hypre_CTAlloc(HYPRE_Int, hypre_ParCSRCommPkgSendMapStart(comm_pkg, num_sends), HYPRE_MEMORY_HOST); index = 0; for (i = 0; i < num_sends; i++) { start = hypre_ParCSRCommPkgSendMapStart(comm_pkg, i); for (j = start; j < hypre_ParCSRCommPkgSendMapStart(comm_pkg, i + 1); j++) { int_buf_data[index++] = CF_marker[hypre_ParCSRCommPkgSendMapElmt(comm_pkg, j)]; } } comm_handle = hypre_ParCSRCommHandleCreate(11, comm_pkg, int_buf_data, CF_marker_offd); hypre_ParCSRCommHandleDestroy(comm_handle); if (debug_flag == 4) { wall_time = time_getWallclockSeconds() - wall_time; hypre_printf("Proc = %d Interp: Comm 1 CF_marker = %f\n", my_id, wall_time); fflush(NULL); } /*----------------------------------------------------------------------- * First Pass: Determine size of P and fill in fine_to_coarse mapping. *-----------------------------------------------------------------------*/ /*----------------------------------------------------------------------- * Intialize counters and allocate mapping vector. *-----------------------------------------------------------------------*/ coarse_counter = hypre_CTAlloc(HYPRE_Int, num_threads, HYPRE_MEMORY_HOST); jj_count = hypre_CTAlloc(HYPRE_Int, num_threads, HYPRE_MEMORY_HOST); jj_count_offd = hypre_CTAlloc(HYPRE_Int, num_threads, HYPRE_MEMORY_HOST); fine_to_coarse = hypre_CTAlloc(HYPRE_Int, n_fine, HYPRE_MEMORY_HOST); for (i = 0; i < n_fine; i++) { fine_to_coarse[i] = -1; } jj_counter = start_indexing; jj_counter_offd = start_indexing; /*----------------------------------------------------------------------- * Loop over fine grid. *-----------------------------------------------------------------------*/ for (j = 0; j < num_threads; j++) { size = n_fine / num_threads; rest = n_fine - size * num_threads; if (j < rest) { ns = j * size + j; ne = (j + 1) * size + j + 1; } else { ns = j * size + rest; ne = (j + 1) * size + rest; } /* loop over the fine grid points */ for (i = ns; i < ne; i++) { /*-------------------------------------------------------------------- * If i is a C-point, interpolation is the identity. Also set up * mapping vector (fine_to_coarse is the mapping vector). *--------------------------------------------------------------------*/ if (CF_marker[i] >= 0) { jj_count[j]++; fine_to_coarse[i] = coarse_counter[j]; coarse_counter[j]++; } /*-------------------------------------------------------------------- * If i is an F-point, interpolation is from the C-points that * strongly influence i. *--------------------------------------------------------------------*/ else { for (jj = S_diag_i[i]; jj < S_diag_i[i + 1]; jj++) { i1 = S_diag_j[jj]; if (CF_marker[i1] > 0) { jj_count[j]++; } } if (num_procs > 1) { for (jj = S_offd_i[i]; jj < S_offd_i[i + 1]; jj++) { i1 = S_offd_j[jj]; if (CF_marker_offd[i1] > 0) { jj_count_offd[j]++; } } } } } } /*----------------------------------------------------------------------- * Allocate arrays. *-----------------------------------------------------------------------*/ for (i = 0; i < num_threads - 1; i++) { coarse_counter[i + 1] += coarse_counter[i]; jj_count[i + 1] += jj_count[i]; jj_count_offd[i + 1] += jj_count_offd[i]; } i = num_threads - 1; jj_counter = jj_count[i]; jj_counter_offd = jj_count_offd[i]; P_diag_size = jj_counter; P_diag_i = hypre_CTAlloc(HYPRE_Int, n_fine + 1, HYPRE_MEMORY_HOST); P_diag_j = hypre_CTAlloc(HYPRE_Int, P_diag_size, HYPRE_MEMORY_HOST); /* we need to include the size of the blocks in the data size */ P_diag_data = hypre_CTAlloc(HYPRE_Real, P_diag_size * bnnz, HYPRE_MEMORY_HOST); P_diag_i[n_fine] = jj_counter; P_offd_size = jj_counter_offd; P_offd_i = hypre_CTAlloc(HYPRE_Int, n_fine + 1, HYPRE_MEMORY_HOST); P_offd_j = hypre_CTAlloc(HYPRE_Int, P_offd_size, HYPRE_MEMORY_HOST); /* we need to include the size of the blocks in the data size */ P_offd_data = hypre_CTAlloc(HYPRE_Real, P_offd_size * bnnz, HYPRE_MEMORY_HOST); /*----------------------------------------------------------------------- * Intialize some stuff. *-----------------------------------------------------------------------*/ jj_counter = start_indexing; jj_counter_offd = start_indexing; if (debug_flag == 4) { wall_time = time_getWallclockSeconds() - wall_time; hypre_printf("Proc = %d Interp: Internal work 1 = %f\n", my_id, wall_time); fflush(NULL); } /* we need a block identity and a block of zeros*/ identity_block = hypre_CTAlloc(HYPRE_Real, bnnz, HYPRE_MEMORY_HOST); zero_block = hypre_CTAlloc(HYPRE_Real, bnnz, HYPRE_MEMORY_HOST); for (i = 0; i < block_size; i++) { identity_block[i * block_size + i] = 1.0; } /* we also need a block to keep track of the diagonal values and a sum */ diagonal_block = hypre_CTAlloc(HYPRE_Real, bnnz, HYPRE_MEMORY_HOST); sum_block_p = hypre_CTAlloc(HYPRE_Real, bnnz, HYPRE_MEMORY_HOST); sum_block_n = hypre_CTAlloc(HYPRE_Real, bnnz, HYPRE_MEMORY_HOST); r_block = hypre_CTAlloc(HYPRE_Real, bnnz, HYPRE_MEMORY_HOST); /*----------------------------------------------------------------------- * Send and receive fine_to_coarse info. *-----------------------------------------------------------------------*/ if (debug_flag == 4) { wall_time = time_getWallclockSeconds(); } fine_to_coarse_offd = hypre_CTAlloc(HYPRE_BigInt, num_cols_A_offd, HYPRE_MEMORY_HOST); big_buf_data = hypre_CTAlloc(HYPRE_BigInt, hypre_ParCSRCommPkgSendMapStart(comm_pkg, num_sends), HYPRE_MEMORY_HOST); for (j = 0; j < num_threads; j++) { coarse_shift = 0; if (j > 0) { coarse_shift = coarse_counter[j - 1]; } size = n_fine / num_threads; rest = n_fine - size * num_threads; if (j < rest) { ns = j * size + j; ne = (j + 1) * size + j + 1; } else { ns = j * size + rest; ne = (j + 1) * size + rest; } for (i = ns; i < ne; i++) { fine_to_coarse[i] += coarse_shift; } } index = 0; for (i = 0; i < num_sends; i++) { start = hypre_ParCSRCommPkgSendMapStart(comm_pkg, i); for (j = start; j < hypre_ParCSRCommPkgSendMapStart(comm_pkg, i + 1); j++) { big_buf_data[index++] = my_first_cpt + fine_to_coarse[hypre_ParCSRCommPkgSendMapElmt(comm_pkg, j)]; } } comm_handle = hypre_ParCSRCommHandleCreate(21, comm_pkg, big_buf_data, fine_to_coarse_offd); hypre_ParCSRCommHandleDestroy(comm_handle); if (debug_flag == 4) { wall_time = time_getWallclockSeconds() - wall_time; hypre_printf("Proc = %d Interp: Comm 4 FineToCoarse = %f\n", my_id, wall_time); fflush(NULL); } if (debug_flag == 4) { wall_time = time_getWallclockSeconds(); } /*----------------------------------------------------------------------- * Loop over fine grid points. *-----------------------------------------------------------------------*/ for (jl = 0; jl < num_threads; jl++) { size = n_fine / num_threads; rest = n_fine - size * num_threads; if (jl < rest) { ns = jl * size + jl; ne = (jl + 1) * size + jl + 1; } else { ns = jl * size + rest; ne = (jl + 1) * size + rest; } jj_counter = 0; if (jl > 0) { jj_counter = jj_count[jl - 1]; } jj_counter_offd = 0; if (jl > 0) { jj_counter_offd = jj_count_offd[jl - 1]; } P_marker = hypre_CTAlloc(HYPRE_Int, n_fine, HYPRE_MEMORY_HOST); P_marker_offd = hypre_CTAlloc(HYPRE_Int, num_cols_A_offd, HYPRE_MEMORY_HOST); for (i = 0; i < n_fine; i++) { P_marker[i] = -1; } for (i = 0; i < num_cols_A_offd; i++) { P_marker_offd[i] = -1; } for (i = ns; i < ne; i++) { /*-------------------------------------------------------------------- * If i is a c-point, interpolation is the identity. *--------------------------------------------------------------------*/ if (CF_marker[i] >= 0) { P_diag_i[i] = jj_counter; P_diag_j[jj_counter] = fine_to_coarse[i]; /* P_diag_data[jj_counter] = one; */ hypre_CSRBlockMatrixBlockCopyData(identity_block, &P_diag_data[jj_counter * bnnz], 1.0, block_size); jj_counter++; } /*-------------------------------------------------------------------- * If i is an F-point, build interpolation. *--------------------------------------------------------------------*/ else { /* Diagonal part of P */ P_diag_i[i] = jj_counter; jj_begin_row = jj_counter; for (jj = S_diag_i[i]; jj < S_diag_i[i + 1]; jj++) { i1 = S_diag_j[jj]; /*-------------------------------------------------------------- * If neighbor i1 is a C-point, set column number in P_diag_j * and initialize interpolation weight to zero. *--------------------------------------------------------------*/ if (CF_marker[i1] >= 0) { P_marker[i1] = jj_counter; P_diag_j[jj_counter] = fine_to_coarse[i1]; /* P_diag_data[jj_counter] = zero; */ hypre_CSRBlockMatrixBlockCopyData(zero_block, &P_diag_data[jj_counter * bnnz], 1.0, block_size); jj_counter++; } } jj_end_row = jj_counter; /* Off-Diagonal part of P */ P_offd_i[i] = jj_counter_offd; jj_begin_row_offd = jj_counter_offd; if (num_procs > 1) { for (jj = S_offd_i[i]; jj < S_offd_i[i + 1]; jj++) { i1 = S_offd_j[jj]; /*----------------------------------------------------------- * If neighbor i1 is a C-point, set column number in P_offd_j * and initialize interpolation weight to zero. *-----------------------------------------------------------*/ if (CF_marker_offd[i1] >= 0) { P_marker_offd[i1] = jj_counter_offd; P_offd_j[jj_counter_offd] = i1; /* P_offd_data[jj_counter_offd] = zero; */ hypre_CSRBlockMatrixBlockCopyData(zero_block, &P_offd_data[jj_counter_offd * bnnz], 1.0, block_size); jj_counter_offd++; } } } jj_end_row_offd = jj_counter_offd; /* get the diagonal block */ /* diagonal = A_diag_data[A_diag_i[i]];*/ hypre_CSRBlockMatrixBlockCopyData(&A_diag_data[A_diag_i[i]*bnnz], diagonal_block, 1.0, block_size); /* Loop over ith row of A. First, the diagonal part of A */ /*sum_N_pos = 0; sum_N_neg = 0; sum_P_pos = 0; sum_P_neg = 0;*/ hypre_CSRBlockMatrixBlockCopyData(zero_block, sum_block_p, 1.0, block_size); hypre_CSRBlockMatrixBlockCopyData(zero_block, sum_block_n, 1.0, block_size); for (jj = A_diag_i[i] + 1; jj < A_diag_i[i + 1]; jj++) { i1 = A_diag_j[jj]; /*if (A_diag_data[jj] > 0) sum_N_pos += A_diag_data[jj]; else sum_N_neg += A_diag_data[jj];*/ hypre_CSRBlockMatrixBlockAddAccumulate(&A_diag_data[jj * bnnz], sum_block_n, block_size); /*-------------------------------------------------------------- * Case 1: neighbor i1 is a C-point and strongly influences i, * accumulate a_{i,i1} into the interpolation weight. *--------------------------------------------------------------*/ if (P_marker[i1] >= jj_begin_row) { /* P_diag_data[P_marker[i1]] += A_diag_data[jj];*/ hypre_CSRBlockMatrixBlockAddAccumulate(&A_diag_data[jj * bnnz], &P_diag_data[P_marker[i1]*bnnz], block_size); /*if (A_diag_data[jj] > 0) sum_P_pos += A_diag_data[jj]; else sum_P_neg += A_diag_data[jj];*/ hypre_CSRBlockMatrixBlockAddAccumulate(&A_diag_data[jj * bnnz], sum_block_p, block_size); } } /*---------------------------------------------------------------- * Still looping over ith row of A. Next, loop over the * off-diagonal part of A *---------------------------------------------------------------*/ if (num_procs > 1) { for (jj = A_offd_i[i]; jj < A_offd_i[i + 1]; jj++) { i1 = A_offd_j[jj]; /*if (A_offd_data[jj] > 0) sum_N_pos += A_offd_data[jj]; else sum_N_neg += A_offd_data[jj];*/ hypre_CSRBlockMatrixBlockAddAccumulate(&A_offd_data[jj * bnnz], sum_block_n, block_size); /*-------------------------------------------------------------- * Case 1: neighbor i1 is a C-point and strongly influences i, * accumulate a_{i,i1} into the interpolation weight. *--------------------------------------------------------------*/ if (P_marker_offd[i1] >= jj_begin_row_offd) { /* P_offd_data[P_marker_offd[i1]] += A_offd_data[jj];*/ hypre_CSRBlockMatrixBlockAddAccumulate( &A_offd_data[jj * bnnz], &P_offd_data[P_marker_offd[i1]*bnnz], block_size); /*if (A_offd_data[jj] > 0) sum_P_pos += A_offd_data[jj]; else sum_P_neg += A_offd_data[jj];*/ hypre_CSRBlockMatrixBlockAddAccumulate(&A_offd_data[jj * bnnz], sum_block_p, block_size); } } } /*if (sum_P_neg) alfa = sum_N_neg/sum_P_neg/diagonal; if (sum_P_pos) beta = sum_N_pos/sum_P_pos/diagonal;*/ /*r_block = sum_block_n*sum_block_p^-1*/ hypre_CSRBlockMatrixBlockMultInv(sum_block_p, sum_block_n, r_block, block_size); /* sum_block_n= diagonal^-1*r_block */ hypre_CSRBlockMatrixBlockInvMult(diagonal_block, r_block, sum_block_n, block_size); /*----------------------------------------------------------------- * Set interpolation weight by dividing by the diagonal. *-----------------------------------------------------------------*/ for (jj = jj_begin_row; jj < jj_end_row; jj++) { /*if (P_diag_data[jj]> 0) P_diag_data[jj] *= -beta; else P_diag_data[jj] *= -alfa;*/ hypre_CSRBlockMatrixBlockCopyData( &P_diag_data[jj * bnnz], r_block, -1.0, block_size); hypre_CSRBlockMatrixBlockMultAdd(sum_block_n, r_block, 0.0, &P_diag_data[jj * bnnz], block_size); } for (jj = jj_begin_row_offd; jj < jj_end_row_offd; jj++) { /*if (P_offd_data[jj]> 0) P_offd_data[jj] *= -beta; else P_offd_data[jj] *= -alfa;*/ hypre_CSRBlockMatrixBlockCopyData( &P_offd_data[jj * bnnz], r_block, -1.0, block_size); hypre_CSRBlockMatrixBlockMultAdd(sum_block_n, r_block, 0.0, &P_offd_data[jj * bnnz], block_size); } } P_offd_i[i + 1] = jj_counter_offd; } hypre_TFree(P_marker, HYPRE_MEMORY_HOST); hypre_TFree(P_marker_offd, HYPRE_MEMORY_HOST); } /* Now create P - as a block matrix */ P = hypre_ParCSRBlockMatrixCreate(comm, block_size, hypre_ParCSRBlockMatrixGlobalNumRows(A), total_global_cpts, hypre_ParCSRBlockMatrixColStarts(A), num_cpts_global, 0, P_diag_i[n_fine], P_offd_i[n_fine]); P_diag = hypre_ParCSRBlockMatrixDiag(P); hypre_CSRBlockMatrixData(P_diag) = P_diag_data; hypre_CSRBlockMatrixI(P_diag) = P_diag_i; hypre_CSRBlockMatrixJ(P_diag) = P_diag_j; P_offd = hypre_ParCSRBlockMatrixOffd(P); hypre_CSRBlockMatrixData(P_offd) = P_offd_data; hypre_CSRBlockMatrixI(P_offd) = P_offd_i; hypre_CSRBlockMatrixJ(P_offd) = P_offd_j; /* Compress P, removing coefficients smaller than trunc_factor * Max */ if (trunc_factor != 0.0 || max_elmts > 0) { hypre_BoomerAMGBlockInterpTruncation(P, trunc_factor, max_elmts); P_diag_data = hypre_CSRBlockMatrixData(P_diag); P_diag_i = hypre_CSRBlockMatrixI(P_diag); P_diag_j = hypre_CSRBlockMatrixJ(P_diag); P_offd_data = hypre_CSRBlockMatrixData(P_offd); P_offd_i = hypre_CSRBlockMatrixI(P_offd); P_offd_j = hypre_CSRBlockMatrixJ(P_offd); P_diag_size = P_diag_i[n_fine]; P_offd_size = P_offd_i[n_fine]; } num_cols_P_offd = 0; if (P_offd_size) { P_marker = hypre_CTAlloc(HYPRE_Int, num_cols_A_offd, HYPRE_MEMORY_HOST); for (i = 0; i < num_cols_A_offd; i++) { P_marker[i] = 0; } num_cols_P_offd = 0; for (i = 0; i < P_offd_size; i++) { index = P_offd_j[i]; if (!P_marker[index]) { num_cols_P_offd++; P_marker[index] = 1; } } col_map_offd_P = hypre_CTAlloc(HYPRE_BigInt, num_cols_P_offd, HYPRE_MEMORY_HOST); tmp_map_offd = hypre_CTAlloc(HYPRE_Int, num_cols_P_offd, HYPRE_MEMORY_HOST); index = 0; for (i = 0; i < num_cols_P_offd; i++) { while (P_marker[index] == 0) { index++; } tmp_map_offd[i] = index++; } for (i = 0; i < P_offd_size; i++) P_offd_j[i] = hypre_BinarySearch(tmp_map_offd, P_offd_j[i], num_cols_P_offd); hypre_TFree(P_marker, HYPRE_MEMORY_HOST); } for (i = 0; i < n_fine; i++) if (CF_marker[i] == -3) { CF_marker[i] = -1; } if (num_cols_P_offd) { hypre_ParCSRBlockMatrixColMapOffd(P) = col_map_offd_P; hypre_CSRBlockMatrixNumCols(P_offd) = num_cols_P_offd; } hypre_GetCommPkgBlockRTFromCommPkgBlockA(P, A, tmp_map_offd, fine_to_coarse_offd); *P_ptr = P; hypre_TFree(zero_block, HYPRE_MEMORY_HOST); hypre_TFree(identity_block, HYPRE_MEMORY_HOST); hypre_TFree(diagonal_block, HYPRE_MEMORY_HOST); hypre_TFree(sum_block_n, HYPRE_MEMORY_HOST); hypre_TFree(sum_block_p, HYPRE_MEMORY_HOST); hypre_TFree(r_block, HYPRE_MEMORY_HOST); hypre_TFree(CF_marker_offd, HYPRE_MEMORY_HOST); hypre_TFree(tmp_map_offd, HYPRE_MEMORY_HOST); hypre_TFree(dof_func_offd, HYPRE_MEMORY_HOST); hypre_TFree(int_buf_data, HYPRE_MEMORY_HOST); hypre_TFree(big_buf_data, HYPRE_MEMORY_HOST); hypre_TFree(fine_to_coarse, HYPRE_MEMORY_HOST); hypre_TFree(fine_to_coarse_offd, HYPRE_MEMORY_HOST); hypre_TFree(coarse_counter, HYPRE_MEMORY_HOST); hypre_TFree(jj_count, HYPRE_MEMORY_HOST); hypre_TFree(jj_count_offd, HYPRE_MEMORY_HOST); return (0); } #if 0 /* not finished yet! */ /*--------------------------------------------------------------------------- * hypre_BoomerAMGBuildBlockStdInterp * Comment: The interpolatory weighting can be changed with the sep_weight * variable. This can enable not separating negative and positive * off diagonals in the weight formula. *--------------------------------------------------------------------------*/ HYPRE_Int hypre_BoomerAMGBuildBlockStdInterp(hypre_ParCSRBlockMatrix *A, HYPRE_Int *CF_marker, hypre_ParCSRMatrix *S, HYPRE_Int *num_cpts_global, HYPRE_Int num_functions, HYPRE_Int *dof_func, HYPRE_Int debug_flag, HYPRE_Real trunc_factor, HYPRE_Int max_elmts, HYPRE_Int sep_weight, hypre_ParCSRBlockMatrix **P_ptr) { /* Communication Variables */ MPI_Comm comm = hypre_ParCSRBlockMatrixComm(A); hypre_ParCSRCommPkg *comm_pkg = hypre_ParCSRBlockMatrixCommPkg(A); HYPRE_Int my_id, num_procs; /* Variables to store input variables */ hypre_CSRBlockMatrix *A_diag = hypre_ParCSRBlockMatrixDiag(A); HYPRE_Real *A_diag_data = hypre_CSRBlockMatrixData(A_diag); HYPRE_Int *A_diag_i = hypre_CSRBlockMatrixI(A_diag); HYPRE_Int *A_diag_j = hypre_CSRBlockMatrixJ(A_diag); hypre_CSRBlockMatrix *A_offd = hypre_ParCSRBlockMatrixOffd(A); HYPRE_Real *A_offd_data = hypre_CSRBlockMatrixData(A_offd); HYPRE_Int *A_offd_i = hypre_CSRBlockMatrixI(A_offd); HYPRE_Int *A_offd_j = hypre_CSRBlockMatrixJ(A_offd); HYPRE_Int num_cols_A_offd = hypre_CSRBlockMatrixNumCols(A_offd); HYPRE_Int *col_map_offd = hypre_ParCSRBlockMatrixColMapOffd(A); HYPRE_Int n_fine = hypre_CSRBlockMatrixNumRows(A_diag); HYPRE_Int col_1 = hypre_ParCSRBlockMatrixFirstRowIndex(A); HYPRE_Int local_numrows = hypre_CSRBlockMatrixNumRows(A_diag); HYPRE_Int col_n = col_1 + local_numrows; HYPRE_Int total_global_cpts, my_first_cpt; /* Variables to store strong connection matrix info */ hypre_CSRMatrix *S_diag = hypre_ParCSRMatrixDiag(S); HYPRE_Int *S_diag_i = hypre_CSRMatrixI(S_diag); HYPRE_Int *S_diag_j = hypre_CSRMatrixJ(S_diag); hypre_CSRMatrix *S_offd = hypre_ParCSRMatrixOffd(S); HYPRE_Int *S_offd_i = hypre_CSRMatrixI(S_offd); HYPRE_Int *S_offd_j = hypre_CSRMatrixJ(S_offd); /* Interpolation matrix P */ hypre_ParCSRBlockMatrix *P; hypre_CSRBlockMatrix *P_diag; hypre_CSRBlockMatrix *P_offd; HYPRE_Real *P_diag_data; HYPRE_Int *P_diag_i, *P_diag_j; HYPRE_Real *P_offd_data; HYPRE_Int *P_offd_i, *P_offd_j; HYPRE_Int *col_map_offd_P; HYPRE_Int P_diag_size; HYPRE_Int P_offd_size; HYPRE_Int *P_marker; HYPRE_Int *P_marker_offd = NULL; HYPRE_Int *CF_marker_offd = NULL; HYPRE_Int *tmp_CF_marker_offd = NULL; HYPRE_Int *dof_func_offd = NULL; /* Full row information for columns of A that are off diag*/ hypre_CSRBlockMatrix *A_ext; HYPRE_Real *A_ext_data; HYPRE_Int *A_ext_i; HYPRE_Int *A_ext_j; HYPRE_Int *fine_to_coarse; HYPRE_Int *fine_to_coarse_offd = NULL; HYPRE_Int *found; HYPRE_Int num_cols_P_offd; HYPRE_Int newoff, loc_col; HYPRE_Int A_ext_rows, full_off_procNodes; hypre_CSRMatrix *Sop; HYPRE_Int *Sop_i; HYPRE_Int *Sop_j; HYPRE_Int Soprows; /* Variables to keep count of interpolatory points */ HYPRE_Int jj_counter, jj_counter_offd; HYPRE_Int jj_begin_row, jj_end_row; HYPRE_Int jj_begin_row_offd = 0; HYPRE_Int jj_end_row_offd = 0; HYPRE_Int coarse_counter, coarse_counter_offd; HYPRE_Int *ihat, *ihat_offd = NULL; HYPRE_Int *ipnt, *ipnt_offd = NULL; HYPRE_Int strong_f_marker = -2; /* Interpolation weight variables */ HYPRE_Real *ahat, *ahat_offd = NULL; HYPRE_Real sum_pos, sum_pos_C, sum_neg, sum_neg_C, sum, sum_C; HYPRE_Real diagonal, distribute; HYPRE_Real alfa, beta; /* Loop variables */ HYPRE_Int index; HYPRE_Int start_indexing = 0; HYPRE_Int i, i1, j, j1, jj, kk, k1; HYPRE_Int cnt_c, cnt_f, cnt_c_offd, cnt_f_offd, indx; /* Definitions */ HYPRE_Real zero = 0.0; HYPRE_Real one = 1.0; HYPRE_Real wall_time; HYPRE_Real wall_1 = 0; HYPRE_Real wall_2 = 0; HYPRE_Real wall_3 = 0; hypre_ParCSRCommPkg *extend_comm_pkg = NULL; HYPRE_Real *identity_block; HYPRE_Real *zero_block; HYPRE_Real *diagonal_block; HYPRE_Real *sum_block; HYPRE_Real *distribute_block; HYPRE_Int block_size = hypre_CSRBlockMatrixBlockSize(A_diag); HYPRE_Int bnnz = block_size * block_size; if (debug_flag == 4) { wall_time = time_getWallclockSeconds(); } /* BEGIN */ hypre_MPI_Comm_size(comm, &num_procs); hypre_MPI_Comm_rank(comm, &my_id); my_first_cpt = num_cpts_global[0]; if (my_id == (num_procs - 1)) { total_global_cpts = num_cpts_global[1]; } hypre_MPI_Bcast(&total_global_cpts, 1, HYPRE_MPI_INT, num_procs - 1, comm); if (!comm_pkg) { hypre_BlockMatvecCommPkgCreate(A); comm_pkg = hypre_ParCSRBlockMatrixCommPkg(A); } /* Set up off processor information (specifically for neighbors of * neighbors */ newoff = 0; full_off_procNodes = 0; if (num_procs > 1) { /*---------------------------------------------------------------------- * Get the off processors rows for A and S, associated with columns in * A_offd and S_offd. *---------------------------------------------------------------------*/ A_ext = hypre_ParCSRBlockMatrixExtractBExt(A, A, 1); A_ext_i = hypre_CSRBlockMatrixI(A_ext); A_ext_j = hypre_CSRBlockMatrixJ(A_ext); A_ext_data = hypre_CSRBlockMatrixData(A_ext); A_ext_rows = hypre_CSRBlockMatrixNumRows(A_ext); /* FIX THIS! - Sop - block or ???*/ Sop = hypre_ParCSRMatrixExtractBExt(S, A, 0); Sop_i = hypre_CSRMatrixI(Sop); Sop_j = hypre_CSRMatrixJ(Sop); Soprows = hypre_CSRMatrixNumRows(Sop); /* Find nodes that are neighbors of neighbors, not found in offd */ newoff = new_offd_nodes(&found, A_ext_rows, A_ext_i, A_ext_j, Soprows, col_map_offd, col_1, col_n, Sop_i, Sop_j, CF_marker, comm_pkg); if (newoff >= 0) { full_off_procNodes = newoff + num_cols_A_offd; } else { return (1); } /* Possibly add new points and new processors to the comm_pkg, all * processors need new_comm_pkg */ /* AHB - create a new comm package just for extended info - this will work better with the assumed partition*/ /* FIX THIS: Block version of this? */ hypre_ParCSRFindExtendCommPkg(A, newoff, found, &extend_comm_pkg); CF_marker_offd = hypre_CTAlloc(HYPRE_Int, full_off_procNodes, HYPRE_MEMORY_HOST); if (num_functions > 1 && full_off_procNodes > 0) { dof_func_offd = hypre_CTAlloc(HYPRE_Int, full_off_procNodes, HYPRE_MEMORY_HOST); } alt_insert_new_nodes(comm_pkg, extend_comm_pkg, CF_marker, full_off_procNodes, CF_marker_offd); if (num_functions > 1) { alt_insert_new_nodes(comm_pkg, extend_comm_pkg, dof_func, full_off_procNodes, dof_func_offd); } } /*----------------------------------------------------------------------- * First Pass: Determine size of P and fill in fine_to_coarse mapping. *-----------------------------------------------------------------------*/ /*----------------------------------------------------------------------- * Intialize counters and allocate mapping vector. *-----------------------------------------------------------------------*/ P_diag_i = hypre_CTAlloc(HYPRE_Int, n_fine + 1, HYPRE_MEMORY_HOST); P_offd_i = hypre_CTAlloc(HYPRE_Int, n_fine + 1, HYPRE_MEMORY_HOST); fine_to_coarse = hypre_CTAlloc(HYPRE_Int, n_fine, HYPRE_MEMORY_HOST); P_marker = hypre_CTAlloc(HYPRE_Int, n_fine, HYPRE_MEMORY_HOST); /* FIX THIS - figure out sizes - need bnnz? */ if (full_off_procNodes) { P_marker_offd = hypre_CTAlloc(HYPRE_Int, full_off_procNodes, HYPRE_MEMORY_HOST); fine_to_coarse_offd = hypre_CTAlloc(HYPRE_Int, full_off_procNodes, HYPRE_MEMORY_HOST); tmp_CF_marker_offd = hypre_CTAlloc(HYPRE_Int, full_off_procNodes, HYPRE_MEMORY_HOST); } initialize_vecs(n_fine, full_off_procNodes, fine_to_coarse, fine_to_coarse_offd, P_marker, P_marker_offd, tmp_CF_marker_offd); /* stuff for blocks */ /* we need a block identity and a block of zeros*/ identity_block = hypre_CTAlloc(HYPRE_Real, bnnz, HYPRE_MEMORY_HOST); zero_block = hypre_CTAlloc(HYPRE_Real, bnnz, HYPRE_MEMORY_HOST); for (i = 0; i < block_size; i++) { identity_block[i * block_size + i] = 1.0; } /* we also need a block to keep track of the diagonal values and a sum */ diagonal_block = hypre_CTAlloc(HYPRE_Real, bnnz, HYPRE_MEMORY_HOST); sum_block = hypre_CTAlloc(HYPRE_Real, bnnz, HYPRE_MEMORY_HOST); distribute_block = hypre_CTAlloc(HYPRE_Real, bnnz, HYPRE_MEMORY_HOST); jj_counter = start_indexing; jj_counter_offd = start_indexing; coarse_counter = 0; coarse_counter_offd = 0; /*----------------------------------------------------------------------- * Loop over fine grid. *-----------------------------------------------------------------------*/ for (i = 0; i < n_fine; i++) { P_diag_i[i] = jj_counter; if (num_procs > 1) { P_offd_i[i] = jj_counter_offd; } if (CF_marker[i] >= 0) { jj_counter++; fine_to_coarse[i] = coarse_counter; coarse_counter++; } /*-------------------------------------------------------------------- * If i is an F-point, interpolation is from the C-points that * strongly influence i, or C-points that stronly influence F-points * that strongly influence i. *--------------------------------------------------------------------*/ else if (CF_marker[i] != -3) { for (jj = S_diag_i[i]; jj < S_diag_i[i + 1]; jj++) { i1 = S_diag_j[jj]; if (CF_marker[i1] >= 0) { /* i1 is a C point */ if (P_marker[i1] < P_diag_i[i]) { P_marker[i1] = jj_counter; jj_counter++; } } else if (CF_marker[i1] != -3) { /* i1 is a F point, loop through it's strong neighbors */ for (kk = S_diag_i[i1]; kk < S_diag_i[i1 + 1]; kk++) { k1 = S_diag_j[kk]; if (CF_marker[k1] >= 0) { if (P_marker[k1] < P_diag_i[i]) { P_marker[k1] = jj_counter; jj_counter++; } } } if (num_procs > 1) { for (kk = S_offd_i[i1]; kk < S_offd_i[i1 + 1]; kk++) { k1 = S_offd_j[kk]; if (CF_marker_offd[k1] >= 0) { if (P_marker_offd[k1] < P_offd_i[i]) { tmp_CF_marker_offd[k1] = 1; P_marker_offd[k1] = jj_counter_offd; jj_counter_offd++; } } } } } } /* Look at off diag strong connections of i */ if (num_procs > 1) { for (jj = S_offd_i[i]; jj < S_offd_i[i + 1]; jj++) { i1 = S_offd_j[jj]; if (CF_marker_offd[i1] >= 0) { if (P_marker_offd[i1] < P_offd_i[i]) { tmp_CF_marker_offd[i1] = 1; P_marker_offd[i1] = jj_counter_offd; jj_counter_offd++; } } else if (CF_marker_offd[i1] != -3) { /* F point; look at neighbors of i1. Sop contains global col * numbers and entries that could be in S_diag or S_offd or * neither. */ for (kk = Sop_i[i1]; kk < Sop_i[i1 + 1]; kk++) { k1 = Sop_j[kk]; if (k1 >= col_1 && k1 < col_n) { /* In S_diag */ loc_col = k1 - col_1; if (CF_marker[loc_col] >= 0) { if (P_marker[loc_col] < P_diag_i[i]) { P_marker[loc_col] = jj_counter; jj_counter++; } } } else { loc_col = -k1 - 1; if (CF_marker_offd[loc_col] >= 0) { if (P_marker_offd[loc_col] < P_offd_i[i]) { P_marker_offd[loc_col] = jj_counter_offd; tmp_CF_marker_offd[loc_col] = 1; jj_counter_offd++; } } } } } } } } } if (debug_flag == 4) { wall_time = time_getWallclockSeconds() - wall_time; hypre_printf("Proc = %d determine structure %f\n", my_id, wall_time); fflush(NULL); } /*----------------------------------------------------------------------- * Allocate arrays. *-----------------------------------------------------------------------*/ P_diag_size = jj_counter; P_offd_size = jj_counter_offd; P_diag_j = hypre_CTAlloc(HYPRE_Int, P_diag_size, HYPRE_MEMORY_HOST); /* we need to include the size of the blocks in the data size */ P_diag_data = hypre_CTAlloc(HYPRE_Real, P_diag_size, HYPRE_MEMORY_HOST) * bnnz; P_offd_j = hypre_CTAlloc(HYPRE_Int, P_offd_size, HYPRE_MEMORY_HOST); /* we need to include the size of the blocks in the data size */ P_offd_data = hypre_CTAlloc(HYPRE_Real, P_offd_size * bnnz, HYPRE_MEMORY_HOST); P_diag_i[n_fine] = jj_counter; P_offd_i[n_fine] = jj_counter_offd; jj_counter = start_indexing; jj_counter_offd = start_indexing; /* Fine to coarse mapping */ if (num_procs > 1) { for (i = 0; i < n_fine; i++) { fine_to_coarse[i] += my_first_cpt; } alt_insert_new_nodes(comm_pkg, extend_comm_pkg, fine_to_coarse, full_off_procNodes, fine_to_coarse_offd); for (i = 0; i < n_fine; i++) { fine_to_coarse[i] -= my_first_cpt; } } /* Initialize ahat, which is a modification to a, used in the standard * interpolation routine. */ ahat = hypre_CTAlloc(HYPRE_Real, n_fine * bnnz, HYPRE_MEMORY_HOST); /* this is data array */ ihat = hypre_CTAlloc(HYPRE_Int, n_fine, HYPRE_MEMORY_HOST); ipnt = hypre_CTAlloc(HYPRE_Int, n_fine, HYPRE_MEMORY_HOST); if (full_off_procNodes) { ahat_offd = hypre_CTAlloc(HYPRE_Real, full_off_procNodes * bnnz, HYPRE_MEMORY_HOST); /* this is data array */ ihat_offd = hypre_CTAlloc(HYPRE_Int, full_off_procNodes, HYPRE_MEMORY_HOST); ipnt_offd = hypre_CTAlloc(HYPRE_Int, full_off_procNodes, HYPRE_MEMORY_HOST); } for (i = 0; i < n_fine; i++) { P_marker[i] = -1; ahat[i] = 0; ihat[i] = -1; } for (i = 0; i < full_off_procNodes; i++) { P_marker_offd[i] = -1; ahat_offd[i] = 0; ihat_offd[i] = -1; } /*----------------------------------------------------------------------- * Loop over fine grid points. *-----------------------------------------------------------------------*/ for (i = 0; i < n_fine; i++) { jj_begin_row = jj_counter; if (num_procs > 1) { jj_begin_row_offd = jj_counter_offd; } /*-------------------------------------------------------------------- * If i is a c-point, interpolation is the identity. *--------------------------------------------------------------------*/ if (CF_marker[i] >= 0) { P_diag_j[jj_counter] = fine_to_coarse[i]; /* P_diag_data[jj_counter] = one; */ hypre_CSRBlockMatrixBlockCopyData(identity_block, &P_diag_data[jj_counter * bnnz], 1.0, block_size); jj_counter++; } /*-------------------------------------------------------------------- * If i is an F-point, build interpolation. *--------------------------------------------------------------------*/ else if (CF_marker[i] != -3) { if (debug_flag == 4) { wall_time = time_getWallclockSeconds(); } strong_f_marker--; for (jj = S_diag_i[i]; jj < S_diag_i[i + 1]; jj++) { i1 = S_diag_j[jj]; /*-------------------------------------------------------------- * If neighbor i1 is a C-point, set column number in P_diag_j * and initialize interpolation weight to zero. *--------------------------------------------------------------*/ if (CF_marker[i1] >= 0) { if (P_marker[i1] < jj_begin_row) { P_marker[i1] = jj_counter; P_diag_j[jj_counter] = i1; /* P_diag_data[jj_counter] = zero; */ hypre_CSRBlockMatrixBlockCopyData(zero_block, &P_diag_data[jj_counter * bnnz], 1.0, block_size); jj_counter++; } } else if (CF_marker[i1] != -3) { P_marker[i1] = strong_f_marker; for (kk = S_diag_i[i1]; kk < S_diag_i[i1 + 1]; kk++) { k1 = S_diag_j[kk]; if (CF_marker[k1] >= 0) { if (P_marker[k1] < jj_begin_row) { P_marker[k1] = jj_counter; P_diag_j[jj_counter] = k1; /* P_diag_data[jj_counter] = zero; */ hypre_CSRBlockMatrixBlockCopyData(zero_block, &P_diag_data[jj_counter * bnnz], 1.0, block_size); jj_counter++; } } } if (num_procs > 1) { for (kk = S_offd_i[i1]; kk < S_offd_i[i1 + 1]; kk++) { k1 = S_offd_j[kk]; if (CF_marker_offd[k1] >= 0) { if (P_marker_offd[k1] < jj_begin_row_offd) { P_marker_offd[k1] = jj_counter_offd; P_offd_j[jj_counter_offd] = k1; /* P_offd_data[jj_counter_offd] = zero; */ hypre_CSRBlockMatrixBlockCopyData(zero_block, &P_offd_data[jj_counter_offd * bnnz], 1.0, block_size); jj_counter_offd++; } } } } } } if ( num_procs > 1) { for (jj = S_offd_i[i]; jj < S_offd_i[i + 1]; jj++) { i1 = S_offd_j[jj]; if ( CF_marker_offd[i1] >= 0) { if (P_marker_offd[i1] < jj_begin_row_offd) { P_marker_offd[i1] = jj_counter_offd; P_offd_j[jj_counter_offd] = i1; /* P_offd_data[jj_counter_offd] = zero;*/ hypre_CSRBlockMatrixBlockCopyData(zero_block, &P_offd_data[jj_counter_offd * bnnz], 1.0, block_size); jj_counter_offd++; } } else if (CF_marker_offd[i1] != -3) { P_marker_offd[i1] = strong_f_marker; for (kk = Sop_i[i1]; kk < Sop_i[i1 + 1]; kk++) { k1 = Sop_j[kk]; if (k1 >= col_1 && k1 < col_n) { loc_col = k1 - col_1; if (CF_marker[loc_col] >= 0) { if (P_marker[loc_col] < jj_begin_row) { P_marker[loc_col] = jj_counter; P_diag_j[jj_counter] = loc_col; /* P_diag_data[jj_counter] = zero;*/ hypre_CSRBlockMatrixBlockCopyData(zero_block, &P_diag_data[jj_counter * bnnz], 1.0, block_size); jj_counter++; } } } else { loc_col = -k1 - 1; if (CF_marker_offd[loc_col] >= 0) { if (P_marker_offd[loc_col] < jj_begin_row_offd) { P_marker_offd[loc_col] = jj_counter_offd; P_offd_j[jj_counter_offd] = loc_col; /* P_offd_data[jj_counter_offd] = zero;*/ hypre_CSRBlockMatrixBlockCopyData(zero_block, &P_offd_data[jj_counter_offd * bnnz], 1.0, block_size); jj_counter_offd++; } } } } } } } jj_end_row = jj_counter; jj_end_row_offd = jj_counter_offd; if (debug_flag == 4) { wall_time = time_getWallclockSeconds() - wall_time; wall_1 += wall_time; fflush(NULL); } /* FIX THIS - is a_hat - need to copy block data to ahat */ if (debug_flag == 4) { wall_time = time_getWallclockSeconds(); } cnt_c = 0; cnt_f = jj_end_row - jj_begin_row; cnt_c_offd = 0; cnt_f_offd = jj_end_row_offd - jj_begin_row_offd; ihat[i] = cnt_f; ipnt[cnt_f] = i; ahat[cnt_f++] = A_diag_data[A_diag_i[i]]; for (jj = A_diag_i[i] + 1; jj < A_diag_i[i + 1]; jj++) { /* i1 is direct neighbor */ i1 = A_diag_j[jj]; if (P_marker[i1] != strong_f_marker) { indx = ihat[i1]; if (indx > -1) { ahat[indx] += A_diag_data[jj]; } else if (P_marker[i1] >= jj_begin_row) { ihat[i1] = cnt_c; ipnt[cnt_c] = i1; ahat[cnt_c++] += A_diag_data[jj]; } else if (CF_marker[i1] != -3) { ihat[i1] = cnt_f; ipnt[cnt_f] = i1; ahat[cnt_f++] += A_diag_data[jj]; } } else { if (num_functions == 1 || dof_func[i] == dof_func[i1]) { distribute = A_diag_data[jj] / A_diag_data[A_diag_i[i1]]; for (kk = A_diag_i[i1] + 1; kk < A_diag_i[i1 + 1]; kk++) { k1 = A_diag_j[kk]; indx = ihat[k1]; if (indx > -1) { ahat[indx] -= A_diag_data[kk] * distribute; } else if (P_marker[k1] >= jj_begin_row) { ihat[k1] = cnt_c; ipnt[cnt_c] = k1; ahat[cnt_c++] -= A_diag_data[kk] * distribute; } else { ihat[k1] = cnt_f; ipnt[cnt_f] = k1; ahat[cnt_f++] -= A_diag_data[kk] * distribute; } } if (num_procs > 1) { for (kk = A_offd_i[i1]; kk < A_offd_i[i1 + 1]; kk++) { k1 = A_offd_j[kk]; indx = ihat_offd[k1]; if (num_functions == 1 || dof_func[i1] == dof_func_offd[k1]) { if (indx > -1) { ahat_offd[indx] -= A_offd_data[kk] * distribute; } else if (P_marker_offd[k1] >= jj_begin_row_offd) { ihat_offd[k1] = cnt_c_offd; ipnt_offd[cnt_c_offd] = k1; ahat_offd[cnt_c_offd++] -= A_offd_data[kk] * distribute; } else { ihat_offd[k1] = cnt_f_offd; ipnt_offd[cnt_f_offd] = k1; ahat_offd[cnt_f_offd++] -= A_offd_data[kk] * distribute; } } } } } } } if (num_procs > 1) { for (jj = A_offd_i[i]; jj < A_offd_i[i + 1]; jj++) { i1 = A_offd_j[jj]; if (P_marker_offd[i1] != strong_f_marker) { indx = ihat_offd[i1]; if (indx > -1) { ahat_offd[indx] += A_offd_data[jj]; } else if (P_marker_offd[i1] >= jj_begin_row_offd) { ihat_offd[i1] = cnt_c_offd; ipnt_offd[cnt_c_offd] = i1; ahat_offd[cnt_c_offd++] += A_offd_data[jj]; } else if (CF_marker_offd[i1] != -3) { ihat_offd[i1] = cnt_f_offd; ipnt_offd[cnt_f_offd] = i1; ahat_offd[cnt_f_offd++] += A_offd_data[jj]; } } else { if (num_functions == 1 || dof_func[i] == dof_func_offd[i1]) { distribute = A_offd_data[jj] / A_ext_data[A_ext_i[i1]]; for (kk = A_ext_i[i1] + 1; kk < A_ext_i[i1 + 1]; kk++) { k1 = A_ext_j[kk]; if (k1 >= col_1 && k1 < col_n) { /*diag*/ loc_col = k1 - col_1; indx = ihat[loc_col]; if (indx > -1) { ahat[indx] -= A_ext_data[kk] * distribute; } else if (P_marker[loc_col] >= jj_begin_row) { ihat[loc_col] = cnt_c; ipnt[cnt_c] = loc_col; ahat[cnt_c++] -= A_ext_data[kk] * distribute; } else { ihat[loc_col] = cnt_f; ipnt[cnt_f] = loc_col; ahat[cnt_f++] -= A_ext_data[kk] * distribute; } } else { loc_col = -k1 - 1; if (num_functions == 1 || dof_func_offd[loc_col] == dof_func_offd[i1]) { indx = ihat_offd[loc_col]; if (indx > -1) { ahat_offd[indx] -= A_ext_data[kk] * distribute; } else if (P_marker_offd[loc_col] >= jj_begin_row_offd) { ihat_offd[loc_col] = cnt_c_offd; ipnt_offd[cnt_c_offd] = loc_col; ahat_offd[cnt_c_offd++] -= A_ext_data[kk] * distribute; } else { ihat_offd[loc_col] = cnt_f_offd; ipnt_offd[cnt_f_offd] = loc_col; ahat_offd[cnt_f_offd++] -= A_ext_data[kk] * distribute; } } } } } } } } if (debug_flag == 4) { wall_time = time_getWallclockSeconds() - wall_time; wall_2 += wall_time; fflush(NULL); } if (debug_flag == 4) { wall_time = time_getWallclockSeconds(); } diagonal = ahat[cnt_c]; ahat[cnt_c] = 0; sum_pos = 0; sum_pos_C = 0; sum_neg = 0; sum_neg_C = 0; sum = 0; sum_C = 0; if (sep_weight == 1) { for (jj = 0; jj < cnt_c; jj++) { if (ahat[jj] > 0) { sum_pos_C += ahat[jj]; } else { sum_neg_C += ahat[jj]; } } if (num_procs > 1) { for (jj = 0; jj < cnt_c_offd; jj++) { if (ahat_offd[jj] > 0) { sum_pos_C += ahat_offd[jj]; } else { sum_neg_C += ahat_offd[jj]; } } } sum_pos = sum_pos_C; sum_neg = sum_neg_C; for (jj = cnt_c + 1; jj < cnt_f; jj++) { if (ahat[jj] > 0) { sum_pos += ahat[jj]; } else { sum_neg += ahat[jj]; } ahat[jj] = 0; } if (num_procs > 1) { for (jj = cnt_c_offd; jj < cnt_f_offd; jj++) { if (ahat_offd[jj] > 0) { sum_pos += ahat_offd[jj]; } else { sum_neg += ahat_offd[jj]; } ahat_offd[jj] = 0; } } if (sum_neg_C) { alfa = sum_neg / sum_neg_C / diagonal; } if (sum_pos_C) { beta = sum_pos / sum_pos_C / diagonal; } /*----------------------------------------------------------------- * Set interpolation weight by dividing by the diagonal. *-----------------------------------------------------------------*/ for (jj = jj_begin_row; jj < jj_end_row; jj++) { j1 = ihat[P_diag_j[jj]]; if (ahat[j1] > 0) { P_diag_data[jj] = -beta * ahat[j1]; } else { P_diag_data[jj] = -alfa * ahat[j1]; } P_diag_j[jj] = fine_to_coarse[P_diag_j[jj]]; ahat[j1] = 0; } for (jj = 0; jj < cnt_f; jj++) { ihat[ipnt[jj]] = -1; } if (num_procs > 1) { for (jj = jj_begin_row_offd; jj < jj_end_row_offd; jj++) { j1 = ihat_offd[P_offd_j[jj]]; if (ahat_offd[j1] > 0) { P_offd_data[jj] = -beta * ahat_offd[j1]; } else { P_offd_data[jj] = -alfa * ahat_offd[j1]; } ahat_offd[j1] = 0; } for (jj = 0; jj < cnt_f_offd; jj++) { ihat_offd[ipnt_offd[jj]] = -1; } } } else { for (jj = 0; jj < cnt_c; jj++) { sum_C += ahat[jj]; } if (num_procs > 1) { for (jj = 0; jj < cnt_c_offd; jj++) { sum_C += ahat_offd[jj]; } } sum = sum_C; for (jj = cnt_c + 1; jj < cnt_f; jj++) { sum += ahat[jj]; ahat[jj] = 0; } if (num_procs > 1) { for (jj = cnt_c_offd; jj < cnt_f_offd; jj++) { sum += ahat_offd[jj]; ahat_offd[jj] = 0; } } if (sum_C) { alfa = sum / sum_C / diagonal; } /*----------------------------------------------------------------- * Set interpolation weight by dividing by the diagonal. *-----------------------------------------------------------------*/ for (jj = jj_begin_row; jj < jj_end_row; jj++) { j1 = ihat[P_diag_j[jj]]; P_diag_data[jj] = -alfa * ahat[j1]; P_diag_j[jj] = fine_to_coarse[P_diag_j[jj]]; ahat[j1] = 0; } for (jj = 0; jj < cnt_f; jj++) { ihat[ipnt[jj]] = -1; } if (num_procs > 1) { for (jj = jj_begin_row_offd; jj < jj_end_row_offd; jj++) { j1 = ihat_offd[P_offd_j[jj]]; P_offd_data[jj] = -alfa * ahat_offd[j1]; ahat_offd[j1] = 0; } for (jj = 0; jj < cnt_f_offd; jj++) { ihat_offd[ipnt_offd[jj]] = -1; } } } if (debug_flag == 4) { wall_time = time_getWallclockSeconds() - wall_time; wall_3 += wall_time; fflush(NULL); } } } if (debug_flag == 4) { hypre_printf("Proc = %d fill part 1 %f part 2 %f part 3 %f\n", my_id, wall_1, wall_2, wall_3); fflush(NULL); } P = hypre_ParCSRMatrixCreate(comm, hypre_ParCSRMatrixGlobalNumRows(A), total_global_cpts, hypre_ParCSRMatrixColStarts(A), num_cpts_global, 0, P_diag_i[n_fine], P_offd_i[n_fine]); P_diag = hypre_ParCSRMatrixDiag(P); hypre_CSRMatrixData(P_diag) = P_diag_data; hypre_CSRMatrixI(P_diag) = P_diag_i; hypre_CSRMatrixJ(P_diag) = P_diag_j; P_offd = hypre_ParCSRMatrixOffd(P); hypre_CSRMatrixData(P_offd) = P_offd_data; hypre_CSRMatrixI(P_offd) = P_offd_i; hypre_CSRMatrixJ(P_offd) = P_offd_j; /* Compress P, removing coefficients smaller than trunc_factor * Max */ if (trunc_factor != 0.0 || max_elmts > 0) { hypre_BoomerAMGInterpTruncation(P, trunc_factor, max_elmts); P_diag_data = hypre_CSRMatrixData(P_diag); P_diag_i = hypre_CSRMatrixI(P_diag); P_diag_j = hypre_CSRMatrixJ(P_diag); P_offd_data = hypre_CSRMatrixData(P_offd); P_offd_i = hypre_CSRMatrixI(P_offd); P_offd_j = hypre_CSRMatrixJ(P_offd); P_diag_size = P_diag_i[n_fine]; P_offd_size = P_offd_i[n_fine]; } /* This builds col_map, col_map should be monotone increasing and contain * global numbers. */ num_cols_P_offd = 0; if (P_offd_size) { hypre_TFree(P_marker, HYPRE_MEMORY_HOST); P_marker = hypre_CTAlloc(HYPRE_Int, full_off_procNodes, HYPRE_MEMORY_HOST); for (i = 0; i < full_off_procNodes; i++) { P_marker[i] = 0; } num_cols_P_offd = 0; for (i = 0; i < P_offd_size; i++) { index = P_offd_j[i]; if (!P_marker[index]) { if (tmp_CF_marker_offd[index] >= 0) { num_cols_P_offd++; P_marker[index] = 1; } } } col_map_offd_P = hypre_CTAlloc(HYPRE_Int, num_cols_P_offd, HYPRE_MEMORY_HOST); index = 0; for (i = 0; i < num_cols_P_offd; i++) { while ( P_marker[index] == 0) { index++; } col_map_offd_P[i] = index++; } for (i = 0; i < P_offd_size; i++) P_offd_j[i] = hypre_BinarySearch(col_map_offd_P, P_offd_j[i], num_cols_P_offd); index = 0; for (i = 0; i < num_cols_P_offd; i++) { while (P_marker[index] == 0) { index++; } col_map_offd_P[i] = fine_to_coarse_offd[index]; index++; } /* Sort the col_map_offd_P and P_offd_j correctly */ for (i = 0; i < num_cols_P_offd; i++) { P_marker[i] = col_map_offd_P[i]; } /* Check if sort actually changed anything */ if (ssort(col_map_offd_P, num_cols_P_offd)) { for (i = 0; i < P_offd_size; i++) for (j = 0; j < num_cols_P_offd; j++) if (P_marker[P_offd_j[i]] == col_map_offd_P[j]) { P_offd_j[i] = j; j = num_cols_P_offd; } } hypre_TFree(P_marker, HYPRE_MEMORY_HOST); } if (num_cols_P_offd) { hypre_ParCSRMatrixColMapOffd(P) = col_map_offd_P; hypre_CSRMatrixNumCols(P_offd) = num_cols_P_offd; } hypre_MatvecCommPkgCreate(P); for (i = 0; i < n_fine; i++) if (CF_marker[i] == -3) { CF_marker[i] = -1; } *P_ptr = P; /* Deallocate memory */ hypre_TFree(fine_to_coarse, HYPRE_MEMORY_HOST); hypre_TFree(P_marker, HYPRE_MEMORY_HOST); hypre_TFree(ahat, HYPRE_MEMORY_HOST); hypre_TFree(ihat, HYPRE_MEMORY_HOST); hypre_TFree(ipnt, HYPRE_MEMORY_HOST); if (full_off_procNodes) { hypre_TFree(ahat_offd, HYPRE_MEMORY_HOST); hypre_TFree(ihat_offd, HYPRE_MEMORY_HOST); hypre_TFree(ipnt_offd, HYPRE_MEMORY_HOST); } if (num_procs > 1) { hypre_CSRMatrixDestroy(Sop); hypre_CSRMatrixDestroy(A_ext); hypre_TFree(fine_to_coarse_offd, HYPRE_MEMORY_HOST); hypre_TFree(P_marker_offd, HYPRE_MEMORY_HOST); hypre_TFree(CF_marker_offd, HYPRE_MEMORY_HOST); hypre_TFree(tmp_CF_marker_offd, HYPRE_MEMORY_HOST); if (num_functions > 1) { hypre_TFree(dof_func_offd, HYPRE_MEMORY_HOST); } hypre_TFree(found, HYPRE_MEMORY_HOST); hypre_MatvecCommPkgDestroy(extend_comm_pkg); } return hypre_error_flag; } #endif hypre-2.33.0/src/parcsr_block_mv/par_csr_block_matrix.c000066400000000000000000001110331477326011500232230ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * Member functions for hypre_ParCSRBlockMatrix class. * *****************************************************************************/ #include "_hypre_parcsr_block_mv.h" /*-------------------------------------------------------------------------- * hypre_ParCSRBlockMatrixCreate *--------------------------------------------------------------------------*/ hypre_ParCSRBlockMatrix * hypre_ParCSRBlockMatrixCreate( MPI_Comm comm, HYPRE_Int block_size, HYPRE_BigInt global_num_rows, HYPRE_BigInt global_num_cols, HYPRE_BigInt *row_starts_in, HYPRE_BigInt *col_starts_in, HYPRE_Int num_cols_offd, HYPRE_Int num_nonzeros_diag, HYPRE_Int num_nonzeros_offd ) { hypre_ParCSRBlockMatrix *matrix; HYPRE_Int num_procs, my_id; HYPRE_Int local_num_rows; HYPRE_Int local_num_cols; HYPRE_BigInt first_row_index, first_col_diag; HYPRE_BigInt row_starts[2]; HYPRE_BigInt col_starts[2]; matrix = hypre_CTAlloc(hypre_ParCSRBlockMatrix, 1, HYPRE_MEMORY_HOST); hypre_MPI_Comm_rank(comm, &my_id); hypre_MPI_Comm_size(comm, &num_procs); if (!row_starts_in) { hypre_GenerateLocalPartitioning(global_num_rows, num_procs, my_id, row_starts); } else { row_starts[0] = row_starts_in[0]; row_starts[1] = row_starts_in[1]; } if (!col_starts_in) { hypre_GenerateLocalPartitioning(global_num_cols, num_procs, my_id, col_starts); } else { col_starts[0] = col_starts_in[0]; col_starts[1] = col_starts_in[1]; } /* row_starts[0] is start of local rows. row_starts[1] is start of next processor's rows */ first_row_index = row_starts[0]; local_num_rows = (HYPRE_Int)(row_starts[1] - first_row_index) ; first_col_diag = col_starts[0]; local_num_cols = (HYPRE_Int)(col_starts[1] - first_col_diag); hypre_ParCSRBlockMatrixComm(matrix) = comm; hypre_ParCSRBlockMatrixDiag(matrix) = hypre_CSRBlockMatrixCreate(block_size, local_num_rows, local_num_cols, num_nonzeros_diag); hypre_ParCSRBlockMatrixOffd(matrix) = hypre_CSRBlockMatrixCreate(block_size, local_num_rows, num_cols_offd, num_nonzeros_offd); hypre_ParCSRBlockMatrixBlockSize(matrix) = block_size; hypre_ParCSRBlockMatrixGlobalNumRows(matrix) = global_num_rows; hypre_ParCSRBlockMatrixGlobalNumCols(matrix) = global_num_cols; hypre_ParCSRBlockMatrixFirstRowIndex(matrix) = first_row_index; hypre_ParCSRBlockMatrixFirstColDiag(matrix) = first_col_diag; hypre_ParCSRBlockMatrixLastRowIndex(matrix) = first_row_index + (HYPRE_BigInt)local_num_rows - 1; hypre_ParCSRBlockMatrixLastColDiag(matrix) = first_col_diag + (HYPRE_BigInt)local_num_cols - 1; hypre_ParCSRBlockMatrixRowStarts(matrix)[0] = row_starts[0]; hypre_ParCSRBlockMatrixRowStarts(matrix)[1] = row_starts[1]; hypre_ParCSRBlockMatrixColStarts(matrix)[0] = col_starts[0]; hypre_ParCSRBlockMatrixColStarts(matrix)[1] = col_starts[1]; hypre_ParCSRBlockMatrixColMapOffd(matrix) = NULL; hypre_ParCSRBlockMatrixCommPkg(matrix) = NULL; hypre_ParCSRBlockMatrixCommPkgT(matrix) = NULL; hypre_ParCSRBlockMatrixAssumedPartition(matrix) = NULL; /* set defaults */ hypre_ParCSRBlockMatrixOwnsData(matrix) = 1; return matrix; } /*-------------------------------------------------------------------------- * hypre_ParCSRBlockMatrixDestroy *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ParCSRBlockMatrixDestroy( hypre_ParCSRBlockMatrix *matrix ) { if (matrix) { if ( hypre_ParCSRBlockMatrixOwnsData(matrix) ) { hypre_CSRBlockMatrixDestroy(hypre_ParCSRBlockMatrixDiag(matrix)); hypre_CSRBlockMatrixDestroy(hypre_ParCSRBlockMatrixOffd(matrix)); if (hypre_ParCSRBlockMatrixColMapOffd(matrix)) { hypre_TFree(hypre_ParCSRBlockMatrixColMapOffd(matrix), HYPRE_MEMORY_HOST); } if (hypre_ParCSRBlockMatrixCommPkg(matrix)) { hypre_MatvecCommPkgDestroy(hypre_ParCSRBlockMatrixCommPkg(matrix)); } if (hypre_ParCSRBlockMatrixCommPkgT(matrix)) { hypre_MatvecCommPkgDestroy(hypre_ParCSRBlockMatrixCommPkgT(matrix)); } } if (hypre_ParCSRBlockMatrixAssumedPartition(matrix)) { hypre_ParCSRBlockMatrixDestroyAssumedPartition(matrix); } hypre_TFree(matrix, HYPRE_MEMORY_HOST); } return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_ParCSRBlockMatrixInitialize *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ParCSRBlockMatrixInitialize( hypre_ParCSRBlockMatrix *matrix ) { HYPRE_Int ierr = 0; hypre_CSRBlockMatrixInitialize(hypre_ParCSRBlockMatrixDiag(matrix)); hypre_CSRBlockMatrixInitialize(hypre_ParCSRBlockMatrixOffd(matrix)); hypre_ParCSRBlockMatrixColMapOffd(matrix) = hypre_CTAlloc(HYPRE_BigInt, hypre_CSRBlockMatrixNumCols(hypre_ParCSRBlockMatrixOffd(matrix)), HYPRE_MEMORY_HOST); return ierr; } /*-------------------------------------------------------------------------- * hypre_ParCSRBlockMatrixSetNumNonzeros *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ParCSRBlockMatrixSetNumNonzeros( hypre_ParCSRBlockMatrix *matrix) { MPI_Comm comm = hypre_ParCSRBlockMatrixComm(matrix); hypre_CSRBlockMatrix *diag = hypre_ParCSRBlockMatrixDiag(matrix); HYPRE_Int *diag_i = hypre_CSRBlockMatrixI(diag); hypre_CSRBlockMatrix *offd = hypre_ParCSRBlockMatrixOffd(matrix); HYPRE_Int *offd_i = hypre_CSRBlockMatrixI(offd); HYPRE_Int local_num_rows = hypre_CSRBlockMatrixNumRows(diag); HYPRE_BigInt total_num_nonzeros; HYPRE_BigInt local_num_nonzeros; HYPRE_Int ierr = 0; local_num_nonzeros = (HYPRE_BigInt)(diag_i[local_num_rows] + offd_i[local_num_rows]); hypre_MPI_Allreduce(&local_num_nonzeros, &total_num_nonzeros, 1, HYPRE_MPI_BIG_INT, hypre_MPI_SUM, comm); hypre_ParCSRBlockMatrixNumNonzeros(matrix) = total_num_nonzeros; return ierr; } /*-------------------------------------------------------------------------- * hypre_ParCSRBlockMatrixSetDNumNonzeros *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ParCSRBlockMatrixSetDNumNonzeros( hypre_ParCSRBlockMatrix *matrix) { MPI_Comm comm = hypre_ParCSRBlockMatrixComm(matrix); hypre_CSRBlockMatrix *diag = hypre_ParCSRBlockMatrixDiag(matrix); HYPRE_Int *diag_i = hypre_CSRBlockMatrixI(diag); hypre_CSRBlockMatrix *offd = hypre_ParCSRBlockMatrixOffd(matrix); HYPRE_Int *offd_i = hypre_CSRBlockMatrixI(offd); HYPRE_Int local_num_rows = hypre_CSRBlockMatrixNumRows(diag); HYPRE_Real total_num_nonzeros; HYPRE_Real local_num_nonzeros; HYPRE_Int ierr = 0; local_num_nonzeros = (HYPRE_Real) diag_i[local_num_rows] + (HYPRE_Real) offd_i[local_num_rows]; hypre_MPI_Allreduce(&local_num_nonzeros, &total_num_nonzeros, 1, HYPRE_MPI_REAL, hypre_MPI_SUM, comm); hypre_ParCSRBlockMatrixDNumNonzeros(matrix) = total_num_nonzeros; return ierr; } /*-------------------------------------------------------------------------- * hypre_ParCSRBlockMatrixSetDataOwner *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ParCSRBlockMatrixSetDataOwner( hypre_ParCSRBlockMatrix *matrix, HYPRE_Int owns_data ) { HYPRE_Int ierr = 0; hypre_ParCSRBlockMatrixOwnsData(matrix) = owns_data; return ierr; } /*-------------------------------------------------------------------------- * hypre_ParCSRBlockMatrixCompress *--------------------------------------------------------------------------*/ hypre_ParCSRMatrix * hypre_ParCSRBlockMatrixCompress( hypre_ParCSRBlockMatrix *matrix ) { MPI_Comm comm = hypre_ParCSRBlockMatrixComm(matrix); hypre_CSRBlockMatrix *diag = hypre_ParCSRBlockMatrixDiag(matrix); hypre_CSRBlockMatrix *offd = hypre_ParCSRBlockMatrixOffd(matrix); HYPRE_BigInt global_num_rows = hypre_ParCSRBlockMatrixGlobalNumRows(matrix); HYPRE_BigInt global_num_cols = hypre_ParCSRBlockMatrixGlobalNumCols(matrix); HYPRE_BigInt *row_starts = hypre_ParCSRBlockMatrixRowStarts(matrix); HYPRE_BigInt *col_starts = hypre_ParCSRBlockMatrixColStarts(matrix); HYPRE_Int num_cols_offd = hypre_CSRBlockMatrixNumCols(offd); HYPRE_Int num_nonzeros_diag = hypre_CSRBlockMatrixNumNonzeros(diag); HYPRE_Int num_nonzeros_offd = hypre_CSRBlockMatrixNumNonzeros(offd); hypre_ParCSRMatrix *matrix_C; HYPRE_Int i; matrix_C = hypre_ParCSRMatrixCreate(comm, global_num_rows, global_num_cols, row_starts, col_starts, num_cols_offd, num_nonzeros_diag, num_nonzeros_offd); hypre_ParCSRMatrixInitialize(matrix_C); hypre_CSRMatrixDestroy(hypre_ParCSRMatrixDiag(matrix_C)); hypre_ParCSRMatrixDiag(matrix_C) = hypre_CSRBlockMatrixCompress(diag); hypre_CSRMatrixDestroy(hypre_ParCSRMatrixOffd(matrix_C)); hypre_ParCSRMatrixOffd(matrix_C) = hypre_CSRBlockMatrixCompress(offd); for (i = 0; i < num_cols_offd; i++) hypre_ParCSRMatrixColMapOffd(matrix_C)[i] = hypre_ParCSRBlockMatrixColMapOffd(matrix)[i]; return matrix_C; } /*-------------------------------------------------------------------------- * hypre_ParCSRBlockMatrixConvertToParCSRMatrix *--------------------------------------------------------------------------*/ hypre_ParCSRMatrix * hypre_ParCSRBlockMatrixConvertToParCSRMatrix(hypre_ParCSRBlockMatrix *matrix) { MPI_Comm comm = hypre_ParCSRBlockMatrixComm(matrix); hypre_CSRBlockMatrix *diag = hypre_ParCSRBlockMatrixDiag(matrix); hypre_CSRBlockMatrix *offd = hypre_ParCSRBlockMatrixOffd(matrix); HYPRE_Int block_size = hypre_ParCSRBlockMatrixBlockSize(matrix); HYPRE_BigInt global_num_rows = hypre_ParCSRBlockMatrixGlobalNumRows(matrix); HYPRE_BigInt global_num_cols = hypre_ParCSRBlockMatrixGlobalNumCols(matrix); HYPRE_BigInt *row_starts = hypre_ParCSRBlockMatrixRowStarts(matrix); HYPRE_BigInt *col_starts = hypre_ParCSRBlockMatrixColStarts(matrix); HYPRE_Int num_cols_offd = hypre_CSRBlockMatrixNumCols(offd); HYPRE_Int num_nonzeros_diag = hypre_CSRBlockMatrixNumNonzeros(diag); HYPRE_Int num_nonzeros_offd = hypre_CSRBlockMatrixNumNonzeros(offd); hypre_ParCSRMatrix *matrix_C; HYPRE_BigInt matrix_C_row_starts[2]; HYPRE_BigInt matrix_C_col_starts[2]; HYPRE_Int *counter, *new_j_map; HYPRE_Int size_j, size_map, index, new_num_cols, removed = 0; HYPRE_Int *offd_j; HYPRE_BigInt *col_map_offd, *new_col_map_offd; HYPRE_Int num_procs, i, j; hypre_CSRMatrix *diag_nozeros, *offd_nozeros; hypre_MPI_Comm_size(comm, &num_procs); for (i = 0; i < 2; i++) { matrix_C_row_starts[i] = row_starts[i] * (HYPRE_BigInt)block_size; matrix_C_col_starts[i] = col_starts[i] * (HYPRE_BigInt)block_size; } matrix_C = hypre_ParCSRMatrixCreate(comm, global_num_rows * (HYPRE_BigInt)block_size, global_num_cols * (HYPRE_BigInt)block_size, matrix_C_row_starts, matrix_C_col_starts, num_cols_offd * block_size, num_nonzeros_diag * block_size * block_size, num_nonzeros_offd * block_size * block_size); hypre_ParCSRMatrixInitialize(matrix_C); /* DIAG */ hypre_CSRMatrixDestroy(hypre_ParCSRMatrixDiag(matrix_C)); hypre_ParCSRMatrixDiag(matrix_C) = hypre_CSRBlockMatrixConvertToCSRMatrix(diag); /* AB - added to delete zeros */ diag_nozeros = hypre_CSRMatrixDeleteZeros( hypre_ParCSRMatrixDiag(matrix_C), 1e-14); if (diag_nozeros) { hypre_CSRMatrixDestroy(hypre_ParCSRMatrixDiag(matrix_C)); hypre_ParCSRMatrixDiag(matrix_C) = diag_nozeros; } /* OFF-DIAG */ hypre_CSRMatrixDestroy(hypre_ParCSRMatrixOffd(matrix_C)); hypre_ParCSRMatrixOffd(matrix_C) = hypre_CSRBlockMatrixConvertToCSRMatrix(offd); /* AB - added to delete zeros - this just deletes from data and j arrays */ offd_nozeros = hypre_CSRMatrixDeleteZeros( hypre_ParCSRMatrixOffd(matrix_C), 1e-14); if (offd_nozeros) { hypre_CSRMatrixDestroy(hypre_ParCSRMatrixOffd(matrix_C)); hypre_ParCSRMatrixOffd(matrix_C) = offd_nozeros; removed = 1; } /* now convert the col_map_offd */ for (i = 0; i < num_cols_offd; i++) for (j = 0; j < block_size; j++) hypre_ParCSRMatrixColMapOffd(matrix_C)[i * block_size + j] = hypre_ParCSRBlockMatrixColMapOffd(matrix)[i] * (HYPRE_BigInt)block_size + (HYPRE_BigInt)j; /* if we deleted zeros, then it is possible that col_map_offd can be compressed as well - this requires some amount of work that could be skipped... */ if (removed) { size_map = num_cols_offd * block_size; counter = hypre_CTAlloc(HYPRE_Int, size_map, HYPRE_MEMORY_HOST); new_j_map = hypre_CTAlloc(HYPRE_Int, size_map, HYPRE_MEMORY_HOST); offd_j = hypre_CSRMatrixJ(hypre_ParCSRMatrixOffd(matrix_C)); col_map_offd = hypre_ParCSRMatrixColMapOffd(matrix_C); size_j = hypre_CSRMatrixNumNonzeros(hypre_ParCSRMatrixOffd(matrix_C)); /* mark which off_d entries are found in j */ for (i = 0; i < size_j; i++) { counter[offd_j[i]] = 1; } /*now find new numbering for columns (we will delete the cols where counter = 0*/ index = 0; for (i = 0; i < size_map; i++) { if (counter[i]) { new_j_map[i] = index++; } } new_num_cols = index; /* if there are some col entries to remove: */ if (!(index == size_map)) { /* go thru j and adjust entries */ for (i = 0; i < size_j; i++) { offd_j[i] = new_j_map[offd_j[i]]; } /*now go thru col map and get rid of non-needed entries */ new_col_map_offd = hypre_CTAlloc(HYPRE_BigInt, new_num_cols, HYPRE_MEMORY_HOST); index = 0; for (i = 0; i < size_map; i++) { if (counter[i]) { new_col_map_offd[index++] = col_map_offd[i]; } } /* set the new col map */ hypre_TFree(col_map_offd, HYPRE_MEMORY_HOST); hypre_ParCSRMatrixColMapOffd(matrix_C) = new_col_map_offd; /* modify the number of cols */ hypre_CSRMatrixNumCols(hypre_ParCSRMatrixOffd(matrix_C)) = new_num_cols; } hypre_TFree(new_j_map, HYPRE_MEMORY_HOST); hypre_TFree(counter, HYPRE_MEMORY_HOST); } hypre_ParCSRMatrixSetNumNonzeros( matrix_C ); hypre_ParCSRMatrixSetDNumNonzeros( matrix_C ); /* we will not copy the comm package */ hypre_ParCSRMatrixCommPkg(matrix_C) = NULL; return matrix_C; } /*-------------------------------------------------------------------------- * hypre_ParCSRBlockMatrixConvertFromParCSRMatrix *--------------------------------------------------------------------------*/ hypre_ParCSRBlockMatrix * hypre_ParCSRBlockMatrixConvertFromParCSRMatrix(hypre_ParCSRMatrix *matrix, HYPRE_Int matrix_C_block_size ) { MPI_Comm comm = hypre_ParCSRMatrixComm(matrix); hypre_CSRMatrix *diag = hypre_ParCSRMatrixDiag(matrix); hypre_CSRMatrix *offd = hypre_ParCSRMatrixOffd(matrix); HYPRE_BigInt global_num_rows = hypre_ParCSRMatrixGlobalNumRows(matrix); HYPRE_BigInt global_num_cols = hypre_ParCSRMatrixGlobalNumCols(matrix); HYPRE_BigInt *row_starts = hypre_ParCSRMatrixRowStarts(matrix); HYPRE_BigInt *col_starts = hypre_ParCSRMatrixColStarts(matrix); HYPRE_Int num_cols_offd = hypre_CSRMatrixNumCols(offd); HYPRE_BigInt *col_map_offd = hypre_ParCSRBlockMatrixColMapOffd(matrix); HYPRE_BigInt *map_to_node = NULL; HYPRE_Int *counter = NULL, *col_in_j_map = NULL; HYPRE_BigInt *matrix_C_col_map_offd = NULL; HYPRE_Int matrix_C_num_cols_offd; HYPRE_Int matrix_C_num_nonzeros_offd; HYPRE_Int num_rows, num_nodes; HYPRE_Int *offd_i = hypre_CSRMatrixI(offd); HYPRE_Int *offd_j = hypre_CSRMatrixJ(offd); HYPRE_Complex * offd_data = hypre_CSRMatrixData(offd); hypre_ParCSRBlockMatrix *matrix_C; HYPRE_BigInt matrix_C_row_starts[2]; HYPRE_BigInt matrix_C_col_starts[2]; hypre_CSRBlockMatrix *matrix_C_diag; hypre_CSRBlockMatrix *matrix_C_offd; HYPRE_Int *matrix_C_offd_i = NULL, *matrix_C_offd_j = NULL; HYPRE_Complex *matrix_C_offd_data = NULL; HYPRE_Int num_procs, i, j, k, k_map, count, index, start_index, pos, row; hypre_MPI_Comm_size(comm, &num_procs); for (i = 0; i < 2; i++) { matrix_C_row_starts[i] = row_starts[i] / (HYPRE_BigInt)matrix_C_block_size; matrix_C_col_starts[i] = col_starts[i] / (HYPRE_BigInt)matrix_C_block_size; } /************* create the diagonal part ************/ matrix_C_diag = hypre_CSRBlockMatrixConvertFromCSRMatrix(diag, matrix_C_block_size); /******* the offd part *******************/ /* can't use the same function for the offd part - because this isn't square and the offd j entries aren't global numbering (have to consider the offd map) - need to look at col_map_offd first */ /* figure out the new number of offd columns (num rows is same as diag) */ num_cols_offd = hypre_CSRMatrixNumCols(offd); num_rows = hypre_CSRMatrixNumRows(diag); num_nodes = num_rows / matrix_C_block_size; matrix_C_offd_i = hypre_CTAlloc(HYPRE_Int, num_nodes + 1, HYPRE_MEMORY_HOST); matrix_C_num_cols_offd = 0; matrix_C_offd_i[0] = 0; matrix_C_num_nonzeros_offd = 0; if (num_cols_offd) { map_to_node = hypre_CTAlloc(HYPRE_BigInt, num_cols_offd, HYPRE_MEMORY_HOST); matrix_C_num_cols_offd = 1; map_to_node[0] = col_map_offd[0] / (HYPRE_BigInt)matrix_C_block_size; for (i = 1; i < num_cols_offd; i++) { map_to_node[i] = col_map_offd[i] / (HYPRE_BigInt)matrix_C_block_size; if (map_to_node[i] > map_to_node[i - 1]) { matrix_C_num_cols_offd++; } } matrix_C_col_map_offd = hypre_CTAlloc(HYPRE_BigInt, matrix_C_num_cols_offd, HYPRE_MEMORY_HOST); col_in_j_map = hypre_CTAlloc(HYPRE_Int, num_cols_offd, HYPRE_MEMORY_HOST); matrix_C_col_map_offd[0] = map_to_node[0]; col_in_j_map[0] = 0; count = 1; j = 1; /* fill in the col_map_off_d - these are global numbers. Then we need to map these to j entries (these have local numbers) */ for (i = 1; i < num_cols_offd; i++) { if (map_to_node[i] > map_to_node[i - 1]) { matrix_C_col_map_offd[count++] = map_to_node[i]; } col_in_j_map[j++] = count - 1; } /* now figure the nonzeros */ matrix_C_num_nonzeros_offd = 0; counter = hypre_CTAlloc(HYPRE_Int, matrix_C_num_cols_offd, HYPRE_MEMORY_HOST); for (i = 0; i < matrix_C_num_cols_offd; i++) { counter[i] = -1; } for (i = 0; i < num_nodes; i++) /* for each block row */ { matrix_C_offd_i[i] = matrix_C_num_nonzeros_offd; for (j = 0; j < matrix_C_block_size; j++) { row = i * matrix_C_block_size + j; for (k = offd_i[row]; k < offd_i[row + 1]; k++) /* go through single row */ { k_map = col_in_j_map[offd_j[k]]; /*nodal col - see if this has been in this block row (i) already*/ if (counter[k_map] < i) /* not yet counted for this nodal row */ { counter[k_map] = i; matrix_C_num_nonzeros_offd++; } } } } /* fill in final i entry */ matrix_C_offd_i[num_nodes] = matrix_C_num_nonzeros_offd; } /* create offd matrix */ matrix_C_offd = hypre_CSRBlockMatrixCreate(matrix_C_block_size, num_nodes, matrix_C_num_cols_offd, matrix_C_num_nonzeros_offd); /* assign i */ hypre_CSRBlockMatrixI(matrix_C_offd) = matrix_C_offd_i; /* create (and allocate j and data) */ if (matrix_C_num_nonzeros_offd) { matrix_C_offd_j = hypre_CTAlloc(HYPRE_Int, matrix_C_num_nonzeros_offd, HYPRE_MEMORY_HOST); matrix_C_offd_data = hypre_CTAlloc(HYPRE_Complex, matrix_C_num_nonzeros_offd * matrix_C_block_size * matrix_C_block_size, HYPRE_MEMORY_HOST); hypre_CSRBlockMatrixJ(matrix_C_offd) = matrix_C_offd_j; hypre_CSRMatrixData(matrix_C_offd) = matrix_C_offd_data; for (i = 0; i < matrix_C_num_cols_offd; i++) { counter[i] = -1; } index = 0; /*keep track of entry in matrix_C_offd_j*/ start_index = 0; for (i = 0; i < num_nodes; i++) /* for each block row */ { for (j = 0; j < matrix_C_block_size; j++) /* for each row in block */ { row = i * matrix_C_block_size + j; for (k = offd_i[row]; k < offd_i[row + 1]; k++) /* go through single row's cols */ { k_map = col_in_j_map[offd_j[k]]; /*nodal col for off_d */ if (counter[k_map] < start_index) /* not yet counted for this nodal row */ { counter[k_map] = index; matrix_C_offd_j[index] = k_map; /*copy the data: which position (corresponds to j array) + which row + which col */ pos = (index * matrix_C_block_size * matrix_C_block_size) + (j * matrix_C_block_size) + (HYPRE_Int)(col_map_offd[offd_j[k]] % (HYPRE_BigInt)matrix_C_block_size); matrix_C_offd_data[pos] = offd_data[k]; index ++; } else /* this col has already been listed for this row */ { /*copy the data: which position (corresponds to j array) + which row + which col */ pos = (counter[k_map] * matrix_C_block_size * matrix_C_block_size) + (j * matrix_C_block_size) + (HYPRE_Int)(col_map_offd[offd_j[k]] % (HYPRE_BigInt)(matrix_C_block_size)); matrix_C_offd_data[pos] = offd_data[k]; } } } start_index = index; /* first index for current nodal row */ } } /* *********create the new matrix *************/ matrix_C = hypre_ParCSRBlockMatrixCreate(comm, matrix_C_block_size, global_num_rows / (HYPRE_BigInt)matrix_C_block_size, global_num_cols / (HYPRE_BigInt)matrix_C_block_size, matrix_C_row_starts, matrix_C_col_starts, matrix_C_num_cols_offd, hypre_CSRBlockMatrixNumNonzeros(matrix_C_diag), matrix_C_num_nonzeros_offd); /* use the diag and off diag matrices we have already created */ hypre_CSRBlockMatrixDestroy(hypre_ParCSRMatrixDiag(matrix_C)); hypre_ParCSRBlockMatrixDiag(matrix_C) = matrix_C_diag; hypre_CSRBlockMatrixDestroy(hypre_ParCSRMatrixOffd(matrix_C)); hypre_ParCSRBlockMatrixOffd(matrix_C) = matrix_C_offd; hypre_ParCSRMatrixColMapOffd(matrix_C) = matrix_C_col_map_offd; /* *********don't bother to copy the comm_pkg *************/ hypre_ParCSRBlockMatrixCommPkg(matrix_C) = NULL; /* CLEAN UP !!!! */ hypre_TFree(map_to_node, HYPRE_MEMORY_HOST); hypre_TFree(col_in_j_map, HYPRE_MEMORY_HOST); hypre_TFree(counter, HYPRE_MEMORY_HOST); return matrix_C; } /* ---------------------------------------------------------------------- * hypre_BlockMatvecCommPkgCreate * ---------------------------------------------------------------------*/ HYPRE_Int hypre_BlockMatvecCommPkgCreate(hypre_ParCSRBlockMatrix *A) { HYPRE_Int num_recvs, *recv_procs, *recv_vec_starts; HYPRE_Int num_sends, *send_procs, *send_map_starts; HYPRE_Int *send_map_elmts; HYPRE_Int num_cols_off_d; HYPRE_BigInt *col_map_off_d; HYPRE_BigInt first_col_diag; HYPRE_BigInt global_num_cols; MPI_Comm comm; hypre_ParCSRCommPkg *comm_pkg = NULL; hypre_IJAssumedPart *apart; /*----------------------------------------------------------- * get parcsr_A information *----------------------------------------------------------*/ col_map_off_d = hypre_ParCSRBlockMatrixColMapOffd(A); num_cols_off_d = hypre_CSRBlockMatrixNumCols(hypre_ParCSRBlockMatrixOffd(A)); global_num_cols = hypre_ParCSRBlockMatrixGlobalNumCols(A); comm = hypre_ParCSRBlockMatrixComm(A); first_col_diag = hypre_ParCSRBlockMatrixFirstColDiag(A); /* Create the assumed partition */ if (hypre_ParCSRBlockMatrixAssumedPartition(A) == NULL) { hypre_ParCSRBlockMatrixCreateAssumedPartition(A); } apart = hypre_ParCSRBlockMatrixAssumedPartition(A); /*----------------------------------------------------------- * get commpkg info information *----------------------------------------------------------*/ hypre_ParCSRCommPkgCreateApart_core( comm, col_map_off_d, first_col_diag, num_cols_off_d, global_num_cols, &num_recvs, &recv_procs, &recv_vec_starts, &num_sends, &send_procs, &send_map_starts, &send_map_elmts, apart); if (!num_recvs) { hypre_TFree(recv_procs, HYPRE_MEMORY_HOST); recv_procs = NULL; } if (!num_sends) { hypre_TFree(send_procs, HYPRE_MEMORY_HOST); hypre_TFree(send_map_elmts, HYPRE_MEMORY_HOST); send_procs = NULL; send_map_elmts = NULL; } /*----------------------------------------------------------- * setup commpkg *----------------------------------------------------------*/ hypre_ParCSRCommPkgCreateAndFill(comm, num_recvs, recv_procs, recv_vec_starts, num_sends, send_procs, send_map_starts, send_map_elmts, &comm_pkg); hypre_ParCSRBlockMatrixCommPkg(A) = comm_pkg; return hypre_error_flag; } /* ---------------------------------------------------------------------- * hypre_ParCSRBlockMatrixExtractBExt: extracts rows from B which are located on * other processors and needed for multiplication with A locally. The rows * are returned as CSRBlockMatrix. * ---------------------------------------------------------------------*/ hypre_CSRBlockMatrix * hypre_ParCSRBlockMatrixExtractBExt(hypre_ParCSRBlockMatrix *B, hypre_ParCSRBlockMatrix *A, HYPRE_Int data) { MPI_Comm comm = hypre_ParCSRBlockMatrixComm(B); HYPRE_BigInt first_col_diag = hypre_ParCSRBlockMatrixFirstColDiag(B); HYPRE_BigInt *col_map_offd = hypre_ParCSRBlockMatrixColMapOffd(B); HYPRE_Int block_size = hypre_ParCSRBlockMatrixBlockSize(B); hypre_ParCSRCommPkg *comm_pkg = hypre_ParCSRBlockMatrixCommPkg(A); HYPRE_Int num_recvs = hypre_ParCSRCommPkgNumRecvs(comm_pkg); HYPRE_Int *recv_vec_starts = hypre_ParCSRCommPkgRecvVecStarts(comm_pkg); HYPRE_Int num_sends = hypre_ParCSRCommPkgNumSends(comm_pkg); HYPRE_Int *send_map_starts = hypre_ParCSRCommPkgSendMapStarts(comm_pkg); HYPRE_Int *send_map_elmts = hypre_ParCSRCommPkgSendMapElmts(comm_pkg); hypre_ParCSRCommHandle *comm_handle; hypre_ParCSRCommPkg *tmp_comm_pkg = NULL; hypre_CSRBlockMatrix *diag = hypre_ParCSRBlockMatrixDiag(B); HYPRE_Int *diag_i = hypre_CSRBlockMatrixI(diag); HYPRE_Int *diag_j = hypre_CSRBlockMatrixJ(diag); HYPRE_Complex *diag_data = hypre_CSRBlockMatrixData(diag); hypre_CSRBlockMatrix *offd = hypre_ParCSRBlockMatrixOffd(B); HYPRE_Int *offd_i = hypre_CSRBlockMatrixI(offd); HYPRE_Int *offd_j = hypre_CSRBlockMatrixJ(offd); HYPRE_Complex *offd_data = hypre_CSRBlockMatrixData(offd); HYPRE_Int *B_int_i; HYPRE_BigInt *B_int_j; HYPRE_Complex *B_int_data = NULL; HYPRE_Int num_cols_B, num_nonzeros; HYPRE_Int num_rows_B_ext; HYPRE_Int num_procs, my_id; hypre_CSRBlockMatrix *B_ext; HYPRE_Int *B_ext_i; HYPRE_BigInt *B_ext_j; HYPRE_Complex *B_ext_data = NULL; HYPRE_Int *jdata_recv_vec_starts; HYPRE_Int *jdata_send_map_starts; HYPRE_Int i, j, k, l, counter, bnnz; HYPRE_Int start_index; HYPRE_Int j_cnt, jrow; hypre_MPI_Comm_size(comm, &num_procs); hypre_MPI_Comm_rank(comm, &my_id); bnnz = block_size * block_size; num_cols_B = hypre_ParCSRMatrixGlobalNumCols(B); num_rows_B_ext = recv_vec_starts[num_recvs]; B_int_i = hypre_CTAlloc(HYPRE_Int, send_map_starts[num_sends] + 1, HYPRE_MEMORY_HOST); B_ext_i = hypre_CTAlloc(HYPRE_Int, num_rows_B_ext + 1, HYPRE_MEMORY_HOST); /*-------------------------------------------------------------------------- * generate B_int_i through adding number of row-elements of offd and diag * for corresponding rows. B_int_i[j+1] contains the number of elements of * a row j (which is determined through send_map_elmts) *--------------------------------------------------------------------------*/ B_int_i[0] = 0; j_cnt = 0; num_nonzeros = 0; for (i = 0; i < num_sends; i++) { for (j = send_map_starts[i]; j < send_map_starts[i + 1]; j++) { jrow = send_map_elmts[j]; B_int_i[++j_cnt] = offd_i[jrow + 1] - offd_i[jrow] + diag_i[jrow + 1] - diag_i[jrow]; num_nonzeros += B_int_i[j_cnt]; } } /*-------------------------------------------------------------------------- * initialize communication *--------------------------------------------------------------------------*/ comm_handle = hypre_ParCSRCommHandleCreate(11, comm_pkg, &B_int_i[1], &B_ext_i[1]); B_int_j = hypre_CTAlloc(HYPRE_BigInt, num_nonzeros, HYPRE_MEMORY_HOST); if (data) { B_int_data = hypre_CTAlloc(HYPRE_Complex, num_nonzeros * bnnz, HYPRE_MEMORY_HOST); } jdata_send_map_starts = hypre_CTAlloc(HYPRE_Int, num_sends + 1, HYPRE_MEMORY_HOST); jdata_recv_vec_starts = hypre_CTAlloc(HYPRE_Int, num_recvs + 1, HYPRE_MEMORY_HOST); start_index = B_int_i[0]; jdata_send_map_starts[0] = start_index; counter = 0; for (i = 0; i < num_sends; i++) { num_nonzeros = counter; for (j = send_map_starts[i]; j < send_map_starts[i + 1]; j++) { jrow = send_map_elmts[j]; for (k = diag_i[jrow]; k < diag_i[jrow + 1]; k++) { B_int_j[counter] = (HYPRE_BigInt)diag_j[k] + first_col_diag; if (data) { for (l = 0; l < bnnz; l++) { B_int_data[counter * bnnz + l] = diag_data[k * bnnz + l]; } } counter++; } for (k = offd_i[jrow]; k < offd_i[jrow + 1]; k++) { B_int_j[counter] = col_map_offd[offd_j[k]]; if (data) { for (l = 0; l < bnnz; l++) B_int_data[counter * bnnz + l] = offd_data[k * bnnz + l]; } counter++; } } num_nonzeros = counter - num_nonzeros; start_index += num_nonzeros; jdata_send_map_starts[i + 1] = start_index; } /* Create temporary communication package */ hypre_ParCSRCommPkgCreateAndFill(comm, num_recvs, hypre_ParCSRCommPkgRecvProcs(comm_pkg), jdata_recv_vec_starts, num_sends, hypre_ParCSRCommPkgSendProcs(comm_pkg), jdata_send_map_starts, NULL, &tmp_comm_pkg); hypre_ParCSRCommHandleDestroy(comm_handle); comm_handle = NULL; /*-------------------------------------------------------------------------- * after communication exchange B_ext_i[j+1] contains the number of elements * of a row j ! * evaluate B_ext_i and compute num_nonzeros for B_ext *--------------------------------------------------------------------------*/ for (i = 0; i < num_recvs; i++) { for (j = recv_vec_starts[i]; j < recv_vec_starts[i + 1]; j++) { B_ext_i[j + 1] += B_ext_i[j]; } } num_nonzeros = B_ext_i[num_rows_B_ext]; B_ext = hypre_CSRBlockMatrixCreate(block_size, num_rows_B_ext, num_cols_B, num_nonzeros); B_ext_j = hypre_CTAlloc(HYPRE_BigInt, num_nonzeros, HYPRE_MEMORY_HOST); if (data) { B_ext_data = hypre_CTAlloc(HYPRE_Complex, num_nonzeros * bnnz, HYPRE_MEMORY_HOST); } for (i = 0; i < num_recvs; i++) { start_index = B_ext_i[recv_vec_starts[i]]; num_nonzeros = B_ext_i[recv_vec_starts[i + 1]] - start_index; jdata_recv_vec_starts[i + 1] = B_ext_i[recv_vec_starts[i + 1]]; } comm_handle = hypre_ParCSRCommHandleCreate(21, tmp_comm_pkg, B_int_j, B_ext_j); hypre_ParCSRCommHandleDestroy(comm_handle); comm_handle = NULL; if (data) { comm_handle = hypre_ParCSRBlockCommHandleCreate(1, bnnz, tmp_comm_pkg, B_int_data, B_ext_data); hypre_ParCSRBlockCommHandleDestroy(comm_handle); comm_handle = NULL; } hypre_CSRBlockMatrixI(B_ext) = B_ext_i; hypre_CSRBlockMatrixBigJ(B_ext) = B_ext_j; if (data) { hypre_CSRBlockMatrixData(B_ext) = B_ext_data; } /* Free memory */ hypre_TFree(jdata_send_map_starts, HYPRE_MEMORY_HOST); hypre_TFree(jdata_recv_vec_starts, HYPRE_MEMORY_HOST); hypre_TFree(tmp_comm_pkg, HYPRE_MEMORY_HOST); hypre_TFree(B_int_i, HYPRE_MEMORY_HOST); hypre_TFree(B_int_j, HYPRE_MEMORY_HOST); if (data) { hypre_TFree(B_int_data, HYPRE_MEMORY_HOST); } return B_ext; } /*-------------------------------------------------------------------------- * hypre_ParVectorCreateFromBlock *--------------------------------------------------------------------------*/ hypre_ParVector * hypre_ParVectorCreateFromBlock( MPI_Comm comm, HYPRE_BigInt p_global_size, HYPRE_BigInt *p_partitioning, HYPRE_Int block_size) { hypre_ParVector *vector; HYPRE_Int num_procs, my_id; HYPRE_BigInt global_size; HYPRE_BigInt new_partitioning[2]; /* need to create a new partitioning - son't want to write over what is passed in */ global_size = p_global_size * (HYPRE_BigInt)block_size; vector = hypre_CTAlloc(hypre_ParVector, 1, HYPRE_MEMORY_HOST); hypre_MPI_Comm_rank(comm, &my_id); hypre_MPI_Comm_size(comm, &num_procs); if (!p_partitioning) { hypre_GenerateLocalPartitioning(global_size, num_procs, my_id, new_partitioning); } else /* adjust for block_size */ { new_partitioning[0] = p_partitioning[0] * (HYPRE_BigInt)block_size; new_partitioning[1] = p_partitioning[1] * (HYPRE_BigInt)block_size; } hypre_ParVectorComm(vector) = comm; hypre_ParVectorGlobalSize(vector) = global_size; hypre_ParVectorFirstIndex(vector) = new_partitioning[0]; hypre_ParVectorLastIndex(vector) = new_partitioning[1] - 1; hypre_ParVectorPartitioning(vector)[0] = new_partitioning[0]; hypre_ParVectorPartitioning(vector)[1] = new_partitioning[1]; hypre_ParVectorLocalVector(vector) = hypre_SeqVectorCreate(new_partitioning[1] - new_partitioning[0]); /* set defaults */ hypre_ParVectorOwnsData(vector) = 1; return vector; } hypre-2.33.0/src/parcsr_block_mv/par_csr_block_matrix.h000066400000000000000000000325501477326011500232360ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * Header info for Parallel CSR Matrix data structures * * Note: this matrix currently uses 0-based indexing. * *****************************************************************************/ #ifndef hypre_PAR_CSR_BLOCK_MATRIX_HEADER #define hypre_PAR_CSR_BLOCK_MATRIX_HEADER #include "_hypre_utilities.h" #include "csr_block_matrix.h" #include "_hypre_parcsr_mv.h" #ifdef __cplusplus extern "C" { #endif /*-------------------------------------------------------------------------- * Parallel CSR Block Matrix *--------------------------------------------------------------------------*/ typedef struct { MPI_Comm comm; HYPRE_BigInt global_num_rows; HYPRE_BigInt global_num_cols; HYPRE_BigInt first_row_index; HYPRE_BigInt first_col_diag; /* need to know entire local range in case row_starts and col_starts are null */ HYPRE_BigInt last_row_index; HYPRE_BigInt last_col_diag; hypre_CSRBlockMatrix *diag; hypre_CSRBlockMatrix *offd; HYPRE_BigInt *col_map_offd; /* maps columns of offd to global columns */ HYPRE_BigInt row_starts[2]; /* row_starts[0] is start of local rows row_starts[1] is start of next processor's rows */ HYPRE_BigInt col_starts[2]; /* col_starts[0] is start of local columns col_starts[1] is start of next processor's columns */ hypre_ParCSRCommPkg *comm_pkg; hypre_ParCSRCommPkg *comm_pkgT; /* Does the ParCSRBlockMatrix create/destroy `diag', `offd', `col_map_offd'? */ HYPRE_Int owns_data; HYPRE_BigInt num_nonzeros; HYPRE_Real d_num_nonzeros; /* Buffers used by GetRow to hold row currently being accessed. AJC, 4/99 */ HYPRE_Int *rowindices; HYPRE_Complex *rowvalues; HYPRE_Int getrowactive; hypre_IJAssumedPart *assumed_partition; /* only populated if no_global_partition option is used (compile-time option)*/ } hypre_ParCSRBlockMatrix; /*-------------------------------------------------------------------------- * Accessor functions for the Parallel CSR Block Matrix structure *--------------------------------------------------------------------------*/ #define hypre_ParCSRBlockMatrixComm(matrix) ((matrix)->comm) #define hypre_ParCSRBlockMatrixGlobalNumRows(matrix) ((matrix)->global_num_rows) #define hypre_ParCSRBlockMatrixGlobalNumCols(matrix) ((matrix)->global_num_cols) #define hypre_ParCSRBlockMatrixFirstRowIndex(matrix) ((matrix)->first_row_index) #define hypre_ParCSRBlockMatrixFirstColDiag(matrix) ((matrix)->first_col_diag) #define hypre_ParCSRBlockMatrixLastRowIndex(matrix) ((matrix) -> last_row_index) #define hypre_ParCSRBlockMatrixLastColDiag(matrix) ((matrix) -> last_col_diag) #define hypre_ParCSRBlockMatrixBlockSize(matrix) ((matrix)->diag->block_size) #define hypre_ParCSRBlockMatrixDiag(matrix) ((matrix) -> diag) #define hypre_ParCSRBlockMatrixOffd(matrix) ((matrix) -> offd) #define hypre_ParCSRBlockMatrixColMapOffd(matrix) ((matrix) -> col_map_offd) #define hypre_ParCSRBlockMatrixRowStarts(matrix) ((matrix) -> row_starts) #define hypre_ParCSRBlockMatrixColStarts(matrix) ((matrix) -> col_starts) #define hypre_ParCSRBlockMatrixCommPkg(matrix) ((matrix) -> comm_pkg) #define hypre_ParCSRBlockMatrixCommPkgT(matrix) ((matrix) -> comm_pkgT) #define hypre_ParCSRBlockMatrixOwnsData(matrix) ((matrix) -> owns_data) #define hypre_ParCSRBlockMatrixNumRows(matrix) \ hypre_CSRBlockMatrixNumRows(hypre_ParCSRBlockMatrixDiag(matrix)) #define hypre_ParCSRBlockMatrixNumCols(matrix) \ hypre_CSRBlockMatrixNumCols(hypre_ParCSRBlockMatrixDiag(matrix)) #define hypre_ParCSRBlockMatrixNumNonzeros(matrix) ((matrix) -> num_nonzeros) #define hypre_ParCSRBlockMatrixDNumNonzeros(matrix) ((matrix) -> d_num_nonzeros) #define hypre_ParCSRBlockMatrixRowindices(matrix) ((matrix) -> rowindices) #define hypre_ParCSRBlockMatrixRowvalues(matrix) ((matrix) -> rowvalues) #define hypre_ParCSRBlockMatrixGetrowactive(matrix) ((matrix) -> getrowactive) #define hypre_ParCSRBlockMatrixAssumedPartition(matrix) ((matrix) -> assumed_partition) hypre_CSRBlockMatrix * hypre_ParCSRBlockMatrixExtractBExt(hypre_ParCSRBlockMatrix *B, hypre_ParCSRBlockMatrix *A, HYPRE_Int data); hypre_ParCSRBlockMatrix * hypre_ParCSRBlockMatrixCreate(MPI_Comm comm, HYPRE_Int block_size, HYPRE_BigInt global_num_rows, HYPRE_BigInt global_num_cols, HYPRE_BigInt *row_starts, HYPRE_BigInt *col_starts, HYPRE_Int num_cols_offd, HYPRE_Int num_nonzeros_diag, HYPRE_Int num_nonzeros_offd); HYPRE_Int hypre_ParCSRBlockMatrixDestroy( hypre_ParCSRBlockMatrix *matrix ); HYPRE_Int hypre_BoomerAMGBuildBlockInterp( hypre_ParCSRBlockMatrix *A, HYPRE_Int *CF_marker, hypre_ParCSRMatrix *S, HYPRE_BigInt *num_cpts_global, HYPRE_Int num_functions, HYPRE_Int *dof_func, HYPRE_Int debug_flag, HYPRE_Real trunc_factor, HYPRE_Int max_elmts, HYPRE_Int add_weak_to_diag, hypre_ParCSRBlockMatrix **P_ptr); HYPRE_Int hypre_BoomerAMGBuildBlockInterpRV( hypre_ParCSRBlockMatrix *A, HYPRE_Int *CF_marker, hypre_ParCSRMatrix *S, HYPRE_BigInt *num_cpts_global, HYPRE_Int num_functions, HYPRE_Int *dof_func, HYPRE_Int debug_flag, HYPRE_Real trunc_factor, HYPRE_Int max_elmts, hypre_ParCSRBlockMatrix **P_ptr); HYPRE_Int hypre_BoomerAMGBuildBlockInterpRV2( hypre_ParCSRBlockMatrix *A, HYPRE_Int *CF_marker, hypre_ParCSRMatrix *S, HYPRE_BigInt *num_cpts_global, HYPRE_Int num_functions, HYPRE_Int *dof_func, HYPRE_Int debug_flag, HYPRE_Real trunc_factor, HYPRE_Int max_elmts, hypre_ParCSRBlockMatrix **P_ptr); HYPRE_Int hypre_BoomerAMGBuildBlockInterpDiag( hypre_ParCSRBlockMatrix *A, HYPRE_Int *CF_marker, hypre_ParCSRMatrix *S, HYPRE_BigInt *num_cpts_global, HYPRE_Int num_functions, HYPRE_Int *dof_func, HYPRE_Int debug_flag, HYPRE_Real trunc_factor, HYPRE_Int max_elmts, HYPRE_Int add_weak_to_diag, hypre_ParCSRBlockMatrix **P_ptr); HYPRE_Int hypre_BoomerAMGBlockInterpTruncation( hypre_ParCSRBlockMatrix *P, HYPRE_Real trunc_factor, HYPRE_Int max_elements); HYPRE_Int hypre_BoomerAMGBuildBlockDirInterp( hypre_ParCSRBlockMatrix *A, HYPRE_Int *CF_marker, hypre_ParCSRMatrix *S, HYPRE_BigInt *num_cpts_global, HYPRE_Int num_functions, HYPRE_Int *dof_func, HYPRE_Int debug_flag, HYPRE_Real trunc_factor, HYPRE_Int max_elmts, hypre_ParCSRBlockMatrix **P_ptr); HYPRE_Int hypre_BoomerAMGBlockRelaxIF( hypre_ParCSRBlockMatrix *A, hypre_ParVector *f, HYPRE_Int *cf_marker, HYPRE_Int relax_type, HYPRE_Int relax_order, HYPRE_Int cycle_type, HYPRE_Real relax_weight, HYPRE_Real omega, hypre_ParVector *u, hypre_ParVector *Vtemp ); HYPRE_Int hypre_BoomerAMGBlockRelax( hypre_ParCSRBlockMatrix *A, hypre_ParVector *f, HYPRE_Int *cf_marker, HYPRE_Int relax_type, HYPRE_Int relax_points, HYPRE_Real relax_weight, HYPRE_Real omega, hypre_ParVector *u, hypre_ParVector *Vtemp ); HYPRE_Int hypre_GetCommPkgBlockRTFromCommPkgBlockA( hypre_ParCSRBlockMatrix *RT, hypre_ParCSRBlockMatrix *A, HYPRE_Int *tmp_map_offd, HYPRE_BigInt *fine_to_coarse_offd); hypre_ParCSRCommHandle * hypre_ParCSRBlockCommHandleCreate(HYPRE_Int job, HYPRE_Int bnnz, hypre_ParCSRCommPkg *comm_pkg, void *send_data, void *recv_data ); HYPRE_Int hypre_ParCSRBlockCommHandleDestroy(hypre_ParCSRCommHandle *comm_handle); HYPRE_Int hypre_BlockMatvecCommPkgCreate(hypre_ParCSRBlockMatrix *A); HYPRE_Int hypre_ParCSRBlockMatrixCreateAssumedPartition( hypre_ParCSRBlockMatrix *matrix); HYPRE_Int hypre_ParCSRBlockMatrixDestroyAssumedPartition(hypre_ParCSRBlockMatrix *matrix ); hypre_ParCSRMatrix * hypre_ParCSRBlockMatrixConvertToParCSRMatrix(hypre_ParCSRBlockMatrix *matrix); hypre_ParCSRBlockMatrix * hypre_ParCSRBlockMatrixConvertFromParCSRMatrix(hypre_ParCSRMatrix *matrix, HYPRE_Int matrix_C_block_size ); HYPRE_Int hypre_ParCSRBlockMatrixRAP(hypre_ParCSRBlockMatrix *RT, hypre_ParCSRBlockMatrix *A, hypre_ParCSRBlockMatrix *P, hypre_ParCSRBlockMatrix **RAP_ptr ); HYPRE_Int hypre_ParCSRBlockMatrixSetNumNonzeros( hypre_ParCSRBlockMatrix *matrix); HYPRE_Int hypre_ParCSRBlockMatrixSetDNumNonzeros( hypre_ParCSRBlockMatrix *matrix); HYPRE_Int hypre_BoomerAMGBlockCreateNodalA(hypre_ParCSRBlockMatrix *A, HYPRE_Int option, HYPRE_Int diag_option, hypre_ParCSRMatrix **AN_ptr); hypre_ParVector * hypre_ParVectorCreateFromBlock(MPI_Comm comm, HYPRE_BigInt p_global_size, HYPRE_BigInt *p_partitioning, HYPRE_Int block_size); HYPRE_Int hypre_ParCSRBlockMatrixMatvec(HYPRE_Complex alpha, hypre_ParCSRBlockMatrix *A, hypre_ParVector *x, HYPRE_Complex beta, hypre_ParVector *y); HYPRE_Int hypre_ParCSRBlockMatrixMatvecT( HYPRE_Complex alpha, hypre_ParCSRBlockMatrix *A, hypre_ParVector *x, HYPRE_Complex beta, hypre_ParVector *y); void hypre_block_qsort( HYPRE_Int *v, HYPRE_Complex *w, HYPRE_Complex *blk_array, HYPRE_Int block_size, HYPRE_Int left, HYPRE_Int right ); void hypre_swap_blk( HYPRE_Complex *v, HYPRE_Int block_size, HYPRE_Int i, HYPRE_Int j ); #ifdef __cplusplus } #endif #endif hypre-2.33.0/src/parcsr_block_mv/par_csr_block_matvec.c000066400000000000000000000207271477326011500232070ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * Matvec functions for hypre_CSRMatrix class. * *****************************************************************************/ #include "_hypre_parcsr_block_mv.h" #include "HYPRE.h" #include "parcsr_mv/_hypre_parcsr_mv.h" #include "seq_mv/seq_mv.h" /*-------------------------------------------------------------------------- * hypre_ParCSRMatrixMatvec *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ParCSRBlockMatrixMatvec(HYPRE_Complex alpha, hypre_ParCSRBlockMatrix *A, hypre_ParVector *x, HYPRE_Complex beta, hypre_ParVector *y) { hypre_ParCSRCommHandle *comm_handle = NULL; hypre_ParCSRCommPkg *comm_pkg; hypre_CSRBlockMatrix *diag, *offd; hypre_Vector *x_local, *y_local, *x_tmp = NULL; HYPRE_BigInt num_rows, num_cols; HYPRE_Int i, j, k, index; HYPRE_Int blk_size, size; HYPRE_BigInt x_size, y_size; HYPRE_Int num_cols_offd, start, finish, elem; HYPRE_Int ierr = 0, nprocs, num_sends, mypid; HYPRE_Complex *x_tmp_data, *x_buf_data = NULL, *x_local_data; hypre_MPI_Comm_size(hypre_ParCSRBlockMatrixComm(A), &nprocs); hypre_MPI_Comm_rank(hypre_ParCSRBlockMatrixComm(A), &mypid); comm_pkg = hypre_ParCSRBlockMatrixCommPkg(A); num_rows = hypre_ParCSRBlockMatrixGlobalNumRows(A); num_cols = hypre_ParCSRBlockMatrixGlobalNumCols(A); blk_size = hypre_ParCSRBlockMatrixBlockSize(A); diag = hypre_ParCSRBlockMatrixDiag(A); offd = hypre_ParCSRBlockMatrixOffd(A); num_cols_offd = hypre_CSRBlockMatrixNumCols(offd); x_local = hypre_ParVectorLocalVector(x); y_local = hypre_ParVectorLocalVector(y); x_size = hypre_ParVectorGlobalSize(x); y_size = hypre_ParVectorGlobalSize(y); x_local_data = hypre_VectorData(x_local); /*--------------------------------------------------------------------- * Check for size compatibility. *--------------------------------------------------------------------*/ if (num_cols * (HYPRE_BigInt)blk_size != x_size) { ierr = 11; } if (num_rows * (HYPRE_BigInt)blk_size != y_size) { ierr = 12; } if (num_cols * (HYPRE_BigInt)blk_size != x_size && num_rows * (HYPRE_BigInt)blk_size != y_size) { ierr = 13; } if (nprocs > 1) { x_tmp = hypre_SeqVectorCreate(num_cols_offd * blk_size); hypre_SeqVectorInitialize(x_tmp); x_tmp_data = hypre_VectorData(x_tmp); if (!comm_pkg) { hypre_BlockMatvecCommPkgCreate(A); comm_pkg = hypre_ParCSRBlockMatrixCommPkg(A); } num_sends = hypre_ParCSRCommPkgNumSends(comm_pkg); size = hypre_ParCSRCommPkgSendMapStart(comm_pkg, num_sends) * blk_size; x_buf_data = hypre_CTAlloc(HYPRE_Complex, size, HYPRE_MEMORY_HOST); index = 0; for (i = 0; i < num_sends; i++) { start = hypre_ParCSRCommPkgSendMapStart(comm_pkg, i); finish = hypre_ParCSRCommPkgSendMapStart(comm_pkg, i + 1); for (j = start; j < finish; j++) { elem = hypre_ParCSRCommPkgSendMapElmt(comm_pkg, j) * blk_size; for (k = 0; k < blk_size; k++) { x_buf_data[index++] = x_local_data[elem++]; } } } comm_handle = hypre_ParCSRBlockCommHandleCreate(1, blk_size, comm_pkg, x_buf_data, x_tmp_data); } hypre_CSRBlockMatrixMatvec(alpha, diag, x_local, beta, y_local); if (nprocs > 1) { hypre_ParCSRBlockCommHandleDestroy(comm_handle); comm_handle = NULL; if (num_cols_offd) { hypre_CSRBlockMatrixMatvec(alpha, offd, x_tmp, 1.0, y_local); } hypre_SeqVectorDestroy(x_tmp); x_tmp = NULL; hypre_TFree(x_buf_data, HYPRE_MEMORY_HOST); } return ierr; } /*-------------------------------------------------------------------------- * hypre_ParCSRBlockMatrixMatvecT * * Performs y <- alpha * A^T * x + beta * y * *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ParCSRBlockMatrixMatvecT( HYPRE_Complex alpha, hypre_ParCSRBlockMatrix *A, hypre_ParVector *x, HYPRE_Complex beta, hypre_ParVector *y ) { hypre_ParCSRCommHandle *comm_handle; hypre_ParCSRCommPkg *comm_pkg = hypre_ParCSRBlockMatrixCommPkg(A); hypre_CSRBlockMatrix *diag = hypre_ParCSRBlockMatrixDiag(A); hypre_CSRBlockMatrix *offd = hypre_ParCSRBlockMatrixOffd(A); hypre_Vector *x_local = hypre_ParVectorLocalVector(x); hypre_Vector *y_local = hypre_ParVectorLocalVector(y); hypre_Vector *y_tmp; HYPRE_Complex *y_local_data; HYPRE_Int blk_size = hypre_ParCSRBlockMatrixBlockSize(A); HYPRE_BigInt x_size = hypre_ParVectorGlobalSize(x); HYPRE_BigInt y_size = hypre_ParVectorGlobalSize(y); HYPRE_Complex *y_tmp_data, *y_buf_data; HYPRE_BigInt num_rows = hypre_ParCSRBlockMatrixGlobalNumRows(A); HYPRE_BigInt num_cols = hypre_ParCSRBlockMatrixGlobalNumCols(A); HYPRE_Int num_cols_offd = hypre_CSRBlockMatrixNumCols(offd); HYPRE_Int i, j, index, start, finish, elem, num_sends; HYPRE_Int size, k; HYPRE_Int ierr = 0; /*--------------------------------------------------------------------- * Check for size compatibility. MatvecT returns ierr = 1 if * length of X doesn't equal the number of rows of A, * ierr = 2 if the length of Y doesn't equal the number of * columns of A, and ierr = 3 if both are true. * * Because temporary vectors are often used in MatvecT, none of * these conditions terminates processing, and the ierr flag * is informational only. *--------------------------------------------------------------------*/ if (num_rows * (HYPRE_BigInt)blk_size != x_size) { ierr = 1; } if (num_cols * (HYPRE_BigInt)blk_size != y_size) { ierr = 2; } if (num_rows * (HYPRE_BigInt)blk_size != x_size && num_cols * (HYPRE_BigInt)blk_size != y_size) { ierr = 3; } /*----------------------------------------------------------------------- *-----------------------------------------------------------------------*/ y_tmp = hypre_SeqVectorCreate(num_cols_offd * blk_size); hypre_SeqVectorInitialize(y_tmp); /*--------------------------------------------------------------------- * If there exists no CommPkg for A, a CommPkg is generated using * equally load balanced partitionings *--------------------------------------------------------------------*/ if (!comm_pkg) { hypre_BlockMatvecCommPkgCreate(A); comm_pkg = hypre_ParCSRBlockMatrixCommPkg(A); } num_sends = hypre_ParCSRCommPkgNumSends(comm_pkg); size = hypre_ParCSRCommPkgSendMapStart(comm_pkg, num_sends) * blk_size; y_buf_data = hypre_CTAlloc(HYPRE_Complex, size, HYPRE_MEMORY_HOST); y_tmp_data = hypre_VectorData(y_tmp); y_local_data = hypre_VectorData(y_local); if (num_cols_offd) { hypre_CSRBlockMatrixMatvecT(alpha, offd, x_local, 0.0, y_tmp); } comm_handle = hypre_ParCSRBlockCommHandleCreate ( 2, blk_size, comm_pkg, y_tmp_data, y_buf_data); hypre_CSRBlockMatrixMatvecT(alpha, diag, x_local, beta, y_local); hypre_ParCSRCommHandleDestroy(comm_handle); comm_handle = NULL; index = 0; for (i = 0; i < num_sends; i++) { start = hypre_ParCSRCommPkgSendMapStart(comm_pkg, i); finish = hypre_ParCSRCommPkgSendMapStart(comm_pkg, i + 1); for (j = start; j < finish; j++) { elem = hypre_ParCSRCommPkgSendMapElmt(comm_pkg, j) * blk_size; for (k = 0; k < blk_size; k++) { y_local_data[elem++] += y_buf_data[index++]; } } } hypre_TFree(y_buf_data, HYPRE_MEMORY_HOST); hypre_SeqVectorDestroy(y_tmp); y_tmp = NULL; return ierr; } hypre-2.33.0/src/parcsr_block_mv/par_csr_block_rap.c000066400000000000000000002277101477326011500225130ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include #include "_hypre_utilities.h" #include "par_csr_block_matrix.h" #include "../parcsr_mv/_hypre_parcsr_mv.h" /*-------------------------------------------------------------------------- * used in RAP function - block size must be an argument because RAP_int may * by NULL *--------------------------------------------------------------------------*/ hypre_CSRBlockMatrix * hypre_ExchangeRAPBlockData(hypre_CSRBlockMatrix *RAP_int, hypre_ParCSRCommPkg *comm_pkg_RT, HYPRE_Int block_size) { HYPRE_Int *RAP_int_i; HYPRE_BigInt *RAP_int_j = NULL; HYPRE_Complex *RAP_int_data = NULL; HYPRE_Int num_cols = 0; MPI_Comm comm = hypre_ParCSRCommPkgComm(comm_pkg_RT); HYPRE_Int num_recvs = hypre_ParCSRCommPkgNumRecvs(comm_pkg_RT); HYPRE_Int *recv_procs = hypre_ParCSRCommPkgRecvProcs(comm_pkg_RT); HYPRE_Int *recv_vec_starts = hypre_ParCSRCommPkgRecvVecStarts(comm_pkg_RT); HYPRE_Int num_sends = hypre_ParCSRCommPkgNumSends(comm_pkg_RT); HYPRE_Int *send_procs = hypre_ParCSRCommPkgSendProcs(comm_pkg_RT); HYPRE_Int *send_map_starts = hypre_ParCSRCommPkgSendMapStarts(comm_pkg_RT); /* HYPRE_Int block_size = hypre_CSRBlockMatrixBlockSize(RAP_int); */ hypre_CSRBlockMatrix *RAP_ext; HYPRE_Int *RAP_ext_i; HYPRE_BigInt *RAP_ext_j = NULL; HYPRE_Complex *RAP_ext_data = NULL; hypre_ParCSRCommHandle *comm_handle = NULL; hypre_ParCSRCommPkg *tmp_comm_pkg = NULL; HYPRE_Int *jdata_recv_vec_starts; HYPRE_Int *jdata_send_map_starts; HYPRE_Int num_rows; HYPRE_Int num_nonzeros; HYPRE_Int i, j, bnnz; HYPRE_Int num_procs, my_id; hypre_MPI_Comm_size(comm, &num_procs); hypre_MPI_Comm_rank(comm, &my_id); bnnz = block_size * block_size; RAP_ext_i = hypre_CTAlloc(HYPRE_Int, send_map_starts[num_sends] + 1, HYPRE_MEMORY_HOST); jdata_recv_vec_starts = hypre_CTAlloc(HYPRE_Int, num_recvs + 1, HYPRE_MEMORY_HOST); jdata_send_map_starts = hypre_CTAlloc(HYPRE_Int, num_sends + 1, HYPRE_MEMORY_HOST); /*-------------------------------------------------------------------------- * recompute RAP_int_i so that RAP_int_i[j+1] contains the number of * elements of row j (to be determined through send_map_elmnts on the * receiving end) *--------------------------------------------------------------------------*/ if (num_recvs) { RAP_int_i = hypre_CSRBlockMatrixI(RAP_int); RAP_int_j = hypre_CSRBlockMatrixBigJ(RAP_int); RAP_int_data = hypre_CSRBlockMatrixData(RAP_int); num_cols = hypre_CSRBlockMatrixNumCols(RAP_int); } jdata_recv_vec_starts[0] = 0; for (i = 0; i < num_recvs; i++) { jdata_recv_vec_starts[i + 1] = RAP_int_i[recv_vec_starts[i + 1]]; } for (i = num_recvs; i > 0; i--) for (j = recv_vec_starts[i]; j > recv_vec_starts[i - 1]; j--) { RAP_int_i[j] -= RAP_int_i[j - 1]; } /*-------------------------------------------------------------------------- * initialize communication *--------------------------------------------------------------------------*/ if (num_recvs && num_sends) { comm_handle = hypre_ParCSRCommHandleCreate(12, comm_pkg_RT, &RAP_int_i[1], &RAP_ext_i[1]); } else if (num_recvs) { comm_handle = hypre_ParCSRCommHandleCreate(12, comm_pkg_RT, &RAP_int_i[1], NULL); } else if (num_sends) { comm_handle = hypre_ParCSRCommHandleCreate(12, comm_pkg_RT, NULL, &RAP_ext_i[1]); } /* Create temporary communication package - note: send and recv are reversed */ hypre_ParCSRCommPkgCreateAndFill(comm, num_sends, send_procs, jdata_send_map_starts, num_recvs, recv_procs, jdata_recv_vec_starts, NULL, &tmp_comm_pkg); hypre_ParCSRCommHandleDestroy(comm_handle); comm_handle = NULL; /*-------------------------------------------------------------------------- * compute num_nonzeros for RAP_ext *--------------------------------------------------------------------------*/ for (i = 0; i < num_sends; i++) { for (j = send_map_starts[i]; j < send_map_starts[i + 1]; j++) { RAP_ext_i[j + 1] += RAP_ext_i[j]; } } num_rows = send_map_starts[num_sends]; num_nonzeros = RAP_ext_i[num_rows]; if (num_nonzeros) { RAP_ext_j = hypre_CTAlloc(HYPRE_BigInt, num_nonzeros, HYPRE_MEMORY_HOST); RAP_ext_data = hypre_CTAlloc(HYPRE_Complex, num_nonzeros * bnnz, HYPRE_MEMORY_HOST); } for (i = 0; i < num_sends + 1; i++) { jdata_send_map_starts[i] = RAP_ext_i[send_map_starts[i]]; } comm_handle = hypre_ParCSRBlockCommHandleCreate(1, bnnz, tmp_comm_pkg, (void *) RAP_int_data, (void *) RAP_ext_data); hypre_ParCSRBlockCommHandleDestroy(comm_handle); comm_handle = NULL; comm_handle = hypre_ParCSRCommHandleCreate(21, tmp_comm_pkg, RAP_int_j, RAP_ext_j); RAP_ext = hypre_CSRBlockMatrixCreate(block_size, num_rows, num_cols, num_nonzeros); hypre_CSRBlockMatrixI(RAP_ext) = RAP_ext_i; if (num_nonzeros) { hypre_CSRBlockMatrixBigJ(RAP_ext) = RAP_ext_j; hypre_CSRBlockMatrixData(RAP_ext) = RAP_ext_data; } /* Free memory */ hypre_TFree(jdata_recv_vec_starts, HYPRE_MEMORY_HOST); hypre_TFree(jdata_send_map_starts, HYPRE_MEMORY_HOST); hypre_TFree(tmp_comm_pkg, HYPRE_MEMORY_HOST); hypre_ParCSRCommHandleDestroy(comm_handle); comm_handle = NULL; return RAP_ext; } /*-------------------------------------------------------------------------- * hypre_BoomerAMGBuildCoarseOperator *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ParCSRBlockMatrixRAP(hypre_ParCSRBlockMatrix *RT, hypre_ParCSRBlockMatrix *A, hypre_ParCSRBlockMatrix *P, hypre_ParCSRBlockMatrix **RAP_ptr ) { MPI_Comm comm = hypre_ParCSRBlockMatrixComm(A); hypre_CSRBlockMatrix *RT_diag = hypre_ParCSRBlockMatrixDiag(RT); hypre_CSRBlockMatrix *RT_offd = hypre_ParCSRBlockMatrixOffd(RT); HYPRE_Int num_cols_offd_RT = hypre_CSRBlockMatrixNumCols(RT_offd); HYPRE_Int num_rows_offd_RT = hypre_CSRBlockMatrixNumRows(RT_offd); hypre_ParCSRCommPkg *comm_pkg_RT = hypre_ParCSRBlockMatrixCommPkg(RT); HYPRE_Int num_recvs_RT = 0; HYPRE_Int num_sends_RT = 0; HYPRE_Int *send_map_starts_RT = NULL; HYPRE_Int *send_map_elmts_RT; hypre_CSRBlockMatrix *A_diag = hypre_ParCSRBlockMatrixDiag(A); HYPRE_Complex *A_diag_data = hypre_CSRBlockMatrixData(A_diag); HYPRE_Int *A_diag_i = hypre_CSRBlockMatrixI(A_diag); HYPRE_Int *A_diag_j = hypre_CSRBlockMatrixJ(A_diag); HYPRE_Int block_size = hypre_CSRBlockMatrixBlockSize(A_diag); hypre_CSRBlockMatrix *A_offd = hypre_ParCSRBlockMatrixOffd(A); HYPRE_Complex *A_offd_data = hypre_CSRBlockMatrixData(A_offd); HYPRE_Int *A_offd_i = hypre_CSRBlockMatrixI(A_offd); HYPRE_Int *A_offd_j = hypre_CSRBlockMatrixJ(A_offd); HYPRE_Int num_cols_diag_A = hypre_CSRBlockMatrixNumCols(A_diag); HYPRE_Int num_cols_offd_A = hypre_CSRBlockMatrixNumCols(A_offd); hypre_CSRBlockMatrix *P_diag = hypre_ParCSRBlockMatrixDiag(P); HYPRE_Complex *P_diag_data = hypre_CSRBlockMatrixData(P_diag); HYPRE_Int *P_diag_i = hypre_CSRBlockMatrixI(P_diag); HYPRE_Int *P_diag_j = hypre_CSRBlockMatrixJ(P_diag); hypre_CSRBlockMatrix *P_offd = hypre_ParCSRBlockMatrixOffd(P); HYPRE_BigInt *col_map_offd_P = hypre_ParCSRBlockMatrixColMapOffd(P); HYPRE_Complex *P_offd_data = hypre_CSRBlockMatrixData(P_offd); HYPRE_Int *P_offd_i = hypre_CSRBlockMatrixI(P_offd); HYPRE_Int *P_offd_j = hypre_CSRBlockMatrixJ(P_offd); HYPRE_BigInt first_col_diag_P = hypre_ParCSRBlockMatrixFirstColDiag(P); HYPRE_BigInt last_col_diag_P; HYPRE_Int num_cols_diag_P = hypre_CSRBlockMatrixNumCols(P_diag); HYPRE_Int num_cols_offd_P = hypre_CSRBlockMatrixNumCols(P_offd); HYPRE_BigInt *coarse_partitioning = hypre_ParCSRBlockMatrixColStarts(P); HYPRE_BigInt row_starts[2], col_starts[2]; hypre_ParCSRBlockMatrix *RAP; HYPRE_BigInt *col_map_offd_RAP = NULL; hypre_CSRBlockMatrix *RAP_int = NULL; HYPRE_Complex *RAP_int_data; HYPRE_Int *RAP_int_i; HYPRE_BigInt *RAP_int_j; hypre_CSRBlockMatrix *RAP_ext = NULL; HYPRE_Complex *RAP_ext_data = NULL; HYPRE_Int *RAP_ext_i = NULL; HYPRE_BigInt *RAP_ext_j = NULL; hypre_CSRBlockMatrix *RAP_diag; HYPRE_Complex *RAP_diag_data = NULL; HYPRE_Int *RAP_diag_i = NULL; HYPRE_Int *RAP_diag_j = NULL; hypre_CSRBlockMatrix *RAP_offd; HYPRE_Complex *RAP_offd_data = NULL; HYPRE_Int *RAP_offd_i = NULL; HYPRE_Int *RAP_offd_j = NULL; HYPRE_Int RAP_size; HYPRE_Int RAP_ext_size; HYPRE_Int RAP_diag_size; HYPRE_Int RAP_offd_size; HYPRE_Int P_ext_diag_size; HYPRE_Int P_ext_offd_size; HYPRE_BigInt first_col_diag_RAP; HYPRE_BigInt last_col_diag_RAP; HYPRE_Int num_cols_offd_RAP = 0; hypre_CSRBlockMatrix *R_diag; HYPRE_Complex *R_diag_data = NULL; HYPRE_Int *R_diag_i = NULL; HYPRE_Int *R_diag_j = NULL; hypre_CSRBlockMatrix *R_offd; HYPRE_Complex *R_offd_data = NULL; HYPRE_Int *R_offd_i = NULL; HYPRE_Int *R_offd_j = NULL; hypre_CSRBlockMatrix *Ps_ext = NULL; HYPRE_Complex *Ps_ext_data = NULL; HYPRE_Int *Ps_ext_i = NULL; HYPRE_BigInt *Ps_ext_j = NULL; HYPRE_Complex *P_ext_diag_data = NULL; HYPRE_Int *P_ext_diag_i = NULL; HYPRE_Int *P_ext_diag_j = NULL; HYPRE_Complex *P_ext_offd_data = NULL; HYPRE_Int *P_ext_offd_i = NULL; HYPRE_Int *P_ext_offd_j = NULL; HYPRE_BigInt *col_map_offd_Pext = NULL; HYPRE_Int *map_P_to_Pext = NULL; HYPRE_Int *map_P_to_RAP = NULL; HYPRE_Int *map_Pext_to_RAP = NULL; HYPRE_Int *P_marker = NULL; HYPRE_Int **P_mark_array; HYPRE_Int **A_mark_array; HYPRE_Int *A_marker; HYPRE_BigInt *temp = NULL; HYPRE_BigInt n_coarse; HYPRE_Int num_cols_offd_Pext = 0; HYPRE_Int ic, i, j, k, bnnz, kk; HYPRE_Int i1, i2, i3, ii, ns, ne, size, rest; HYPRE_Int cnt, cnt_offd, cnt_diag; HYPRE_Int jj1, jj2, jj3, jcol; HYPRE_BigInt value; HYPRE_Int *jj_count, *jj_cnt_diag, *jj_cnt_offd; HYPRE_Int jj_counter, jj_count_diag, jj_count_offd; HYPRE_Int jj_row_begining, jj_row_begin_diag, jj_row_begin_offd; HYPRE_Int start_indexing = 0; /* start indexing for RAP_data at 0 */ HYPRE_Int num_nz_cols_A; HYPRE_Int num_procs; HYPRE_Int num_threads, ind; HYPRE_Complex *r_entries; HYPRE_Complex *r_a_products; HYPRE_Complex *r_a_p_products; HYPRE_Complex zero = 0.0; /*----------------------------------------------------------------------- * Copy ParCSRBlockMatrix RT into CSRBlockMatrix R so that we have * row-wise access to restriction . *-----------------------------------------------------------------------*/ hypre_MPI_Comm_size(comm, &num_procs); /* num_threads = hypre_NumThreads(); */ num_threads = 1; bnnz = block_size * block_size; r_a_products = hypre_TAlloc(HYPRE_Complex, bnnz, HYPRE_MEMORY_HOST); r_a_p_products = hypre_TAlloc(HYPRE_Complex, bnnz, HYPRE_MEMORY_HOST); if (comm_pkg_RT) { num_recvs_RT = hypre_ParCSRCommPkgNumRecvs(comm_pkg_RT); num_sends_RT = hypre_ParCSRCommPkgNumSends(comm_pkg_RT); send_map_starts_RT = hypre_ParCSRCommPkgSendMapStarts(comm_pkg_RT); send_map_elmts_RT = hypre_ParCSRCommPkgSendMapElmts(comm_pkg_RT); } hypre_CSRBlockMatrixTranspose(RT_diag, &R_diag, 1); if (num_cols_offd_RT) { hypre_CSRBlockMatrixTranspose(RT_offd, &R_offd, 1); R_offd_data = hypre_CSRBlockMatrixData(R_offd); R_offd_i = hypre_CSRBlockMatrixI(R_offd); R_offd_j = hypre_CSRBlockMatrixJ(R_offd); } /*----------------------------------------------------------------------- * Access the CSR vectors for R. Also get sizes of fine and * coarse grids. *-----------------------------------------------------------------------*/ R_diag_data = hypre_CSRBlockMatrixData(R_diag); R_diag_i = hypre_CSRBlockMatrixI(R_diag); R_diag_j = hypre_CSRBlockMatrixJ(R_diag); n_coarse = hypre_ParCSRBlockMatrixGlobalNumCols(P); num_nz_cols_A = num_cols_diag_A + num_cols_offd_A; /*----------------------------------------------------------------------- * Generate Ps_ext, i.e. portion of P that is stored on neighbor procs * and needed locally for triple matrix product *-----------------------------------------------------------------------*/ if (num_procs > 1) { Ps_ext = hypre_ParCSRBlockMatrixExtractBExt(P, A, 1); Ps_ext_data = hypre_CSRBlockMatrixData(Ps_ext); Ps_ext_i = hypre_CSRBlockMatrixI(Ps_ext); Ps_ext_j = hypre_CSRBlockMatrixBigJ(Ps_ext); } P_ext_diag_i = hypre_CTAlloc(HYPRE_Int, num_cols_offd_A + 1, HYPRE_MEMORY_HOST); P_ext_offd_i = hypre_CTAlloc(HYPRE_Int, num_cols_offd_A + 1, HYPRE_MEMORY_HOST); P_ext_diag_size = 0; P_ext_offd_size = 0; last_col_diag_P = first_col_diag_P + (HYPRE_BigInt)num_cols_diag_P - 1; for (i = 0; i < num_cols_offd_A; i++) { for (j = Ps_ext_i[i]; j < Ps_ext_i[i + 1]; j++) { if (Ps_ext_j[j] < first_col_diag_P || Ps_ext_j[j] > last_col_diag_P) { P_ext_offd_size++; } else { P_ext_diag_size++; } } P_ext_diag_i[i + 1] = P_ext_diag_size; P_ext_offd_i[i + 1] = P_ext_offd_size; } if (P_ext_diag_size) { P_ext_diag_j = hypre_CTAlloc(HYPRE_Int, P_ext_diag_size, HYPRE_MEMORY_HOST); P_ext_diag_data = hypre_CTAlloc(HYPRE_Complex, P_ext_diag_size * bnnz, HYPRE_MEMORY_HOST); } if (P_ext_offd_size) { P_ext_offd_j = hypre_CTAlloc(HYPRE_Int, P_ext_offd_size, HYPRE_MEMORY_HOST); P_ext_offd_data = hypre_CTAlloc(HYPRE_Complex, P_ext_offd_size * bnnz, HYPRE_MEMORY_HOST); } cnt_offd = 0; cnt_diag = 0; cnt = 0; for (i = 0; i < num_cols_offd_A; i++) { for (j = Ps_ext_i[i]; j < Ps_ext_i[i + 1]; j++) { if (Ps_ext_j[j] < first_col_diag_P || Ps_ext_j[j] > last_col_diag_P) { Ps_ext_j[cnt_offd] = Ps_ext_j[j]; for (kk = 0; kk < bnnz; kk++) { P_ext_offd_data[cnt_offd * bnnz + kk] = Ps_ext_data[j * bnnz + kk]; } cnt_offd++; } else { P_ext_diag_j[cnt_diag] = (HYPRE_Int)(Ps_ext_j[j] - first_col_diag_P); for (kk = 0; kk < bnnz; kk++) { P_ext_diag_data[cnt_diag * bnnz + kk] = Ps_ext_data[j * bnnz + kk]; } cnt_diag++; } } } if (P_ext_offd_size || num_cols_offd_P) { temp = hypre_CTAlloc(HYPRE_BigInt, P_ext_offd_size + num_cols_offd_P, HYPRE_MEMORY_HOST); for (i = 0; i < P_ext_offd_size; i++) { temp[i] = Ps_ext_j[i]; } cnt = P_ext_offd_size; for (i = 0; i < num_cols_offd_P; i++) { temp[cnt++] = col_map_offd_P[i]; } } if (cnt) { hypre_BigQsort0(temp, 0, cnt - 1); num_cols_offd_Pext = 1; value = temp[0]; for (i = 1; i < cnt; i++) { if (temp[i] > value) { value = temp[i]; temp[num_cols_offd_Pext++] = value; } } } if (num_cols_offd_Pext) { col_map_offd_Pext = hypre_CTAlloc(HYPRE_BigInt, num_cols_offd_Pext, HYPRE_MEMORY_HOST); } for (i = 0; i < num_cols_offd_Pext; i++) { col_map_offd_Pext[i] = temp[i]; } if (P_ext_offd_size || num_cols_offd_P) { hypre_TFree(temp, HYPRE_MEMORY_HOST); } for (i = 0 ; i < P_ext_offd_size; i++) { P_ext_offd_j[i] = hypre_BigBinarySearch(col_map_offd_Pext, Ps_ext_j[i], num_cols_offd_Pext); } if (num_cols_offd_P) { map_P_to_Pext = hypre_CTAlloc(HYPRE_Int, num_cols_offd_P, HYPRE_MEMORY_HOST); cnt = 0; for (i = 0; i < num_cols_offd_Pext; i++) if (col_map_offd_Pext[i] == col_map_offd_P[cnt]) { map_P_to_Pext[cnt++] = i; if (cnt == num_cols_offd_P) { break; } } } if (num_procs > 1) { hypre_CSRBlockMatrixDestroy(Ps_ext); Ps_ext = NULL; } /*----------------------------------------------------------------------- * First Pass: Determine size of RAP_int and set up RAP_int_i if there * are more than one processor and nonzero elements in R_offd *-----------------------------------------------------------------------*/ P_mark_array = hypre_CTAlloc(HYPRE_Int *, num_threads, HYPRE_MEMORY_HOST); A_mark_array = hypre_CTAlloc(HYPRE_Int *, num_threads, HYPRE_MEMORY_HOST); if (num_cols_offd_RT) { jj_count = hypre_CTAlloc(HYPRE_Int, num_threads, HYPRE_MEMORY_HOST); for (ii = 0; ii < num_threads; ii++) { size = num_cols_offd_RT / num_threads; rest = num_cols_offd_RT - size * num_threads; if (ii < rest) { ns = ii * size + ii; ne = (ii + 1) * size + ii + 1; } else { ns = ii * size + rest; ne = (ii + 1) * size + rest; } /*-------------------------------------------------------------------- * Allocate marker arrays. *--------------------------------------------------------------------*/ if (num_cols_offd_Pext || num_cols_diag_P) { P_mark_array[ii] = hypre_CTAlloc(HYPRE_Int, num_cols_diag_P + num_cols_offd_Pext, HYPRE_MEMORY_HOST); P_marker = P_mark_array[ii]; } A_mark_array[ii] = hypre_CTAlloc(HYPRE_Int, num_nz_cols_A, HYPRE_MEMORY_HOST); A_marker = A_mark_array[ii]; /*-------------------------------------------------------------------- * Initialize some stuff. *--------------------------------------------------------------------*/ jj_counter = start_indexing; for (ic = 0; ic < num_cols_diag_P + num_cols_offd_Pext; ic++) { P_marker[ic] = -1; } for (i = 0; i < num_nz_cols_A; i++) { A_marker[i] = -1; } /*-------------------------------------------------------------------- * Loop over exterior c-points *--------------------------------------------------------------------*/ for (ic = ns; ic < ne; ic++) { jj_row_begining = jj_counter; /*----------------------------------------------------------------- * Loop over entries in row ic of R_offd. *-----------------------------------------------------------------*/ for (jj1 = R_offd_i[ic]; jj1 < R_offd_i[ic + 1]; jj1++) { i1 = R_offd_j[jj1]; /*-------------------------------------------------------------- * Loop over entries in row i1 of A_offd. *--------------------------------------------------------------*/ for (jj2 = A_offd_i[i1]; jj2 < A_offd_i[i1 + 1]; jj2++) { i2 = A_offd_j[jj2]; /*----------------------------------------------------------- * Check A_marker to see if point i2 has been previously * visited. New entries in RAP only occur from unmarked points. *-----------------------------------------------------------*/ if (A_marker[i2] != ic) { /*-------------------------------------------------------- * Mark i2 as visited. *--------------------------------------------------------*/ A_marker[i2] = ic; /*-------------------------------------------------------- * Loop over entries in row i2 of P_ext. *--------------------------------------------------------*/ for (jj3 = P_ext_diag_i[i2]; jj3 < P_ext_diag_i[i2 + 1]; jj3++) { i3 = P_ext_diag_j[jj3]; /*----------------------------------------------------- * Check P_marker to see that RAP_{ic,i3} has not * been accounted for. If it has not, mark it and * increment counter. *-----------------------------------------------------*/ if (P_marker[i3] < jj_row_begining) { P_marker[i3] = jj_counter; jj_counter++; } } for (jj3 = P_ext_offd_i[i2]; jj3 < P_ext_offd_i[i2 + 1]; jj3++) { i3 = P_ext_offd_j[jj3] + num_cols_diag_P; /*----------------------------------------------------- * Check P_marker to see that RAP_{ic,i3} has not * been accounted for. If it has not, mark it and * increment counter. *-----------------------------------------------------*/ if (P_marker[i3] < jj_row_begining) { P_marker[i3] = jj_counter; jj_counter++; } } } } /*-------------------------------------------------------------- * Loop over entries in row i1 of A_diag. *--------------------------------------------------------------*/ for (jj2 = A_diag_i[i1]; jj2 < A_diag_i[i1 + 1]; jj2++) { i2 = A_diag_j[jj2]; /*----------------------------------------------------------- * Check A_marker to see if point i2 has been previously * visited. New entries in RAP only occur from unmarked * points. *-----------------------------------------------------------*/ if (A_marker[i2 + num_cols_offd_A] != ic) { /*-------------------------------------------------------- * Mark i2 as visited. *--------------------------------------------------------*/ A_marker[i2 + num_cols_offd_A] = ic; /*-------------------------------------------------------- * Loop over entries in row i2 of P_diag. *--------------------------------------------------------*/ for (jj3 = P_diag_i[i2]; jj3 < P_diag_i[i2 + 1]; jj3++) { i3 = P_diag_j[jj3]; /*----------------------------------------------------- * Check P_marker to see that RAP_{ic,i3} has not * been accounted for. If it has not, mark it and * increment counter. *-----------------------------------------------------*/ if (P_marker[i3] < jj_row_begining) { P_marker[i3] = jj_counter; jj_counter++; } } /*-------------------------------------------------------- * Loop over entries in row i2 of P_offd. *--------------------------------------------------------*/ for (jj3 = P_offd_i[i2]; jj3 < P_offd_i[i2 + 1]; jj3++) { i3 = map_P_to_Pext[P_offd_j[jj3]] + num_cols_diag_P; /*----------------------------------------------------- * Check P_marker to see that RAP_{ic,i3} has not * been accounted for. If it has not, mark it and * increment counter. *-----------------------------------------------------*/ if (P_marker[i3] < jj_row_begining) { P_marker[i3] = jj_counter; jj_counter++; } } } } } } jj_count[ii] = jj_counter; } /*----------------------------------------------------------------------- * Allocate RAP_int_data and RAP_int_j arrays. *-----------------------------------------------------------------------*/ for (i = 0; i < num_threads - 1; i++) { jj_count[i + 1] += jj_count[i]; } RAP_size = jj_count[num_threads - 1]; RAP_int_i = hypre_CTAlloc(HYPRE_Int, num_cols_offd_RT + 1, HYPRE_MEMORY_HOST); RAP_int_data = hypre_CTAlloc(HYPRE_Complex, RAP_size * bnnz, HYPRE_MEMORY_HOST); RAP_int_j = hypre_CTAlloc(HYPRE_BigInt, RAP_size, HYPRE_MEMORY_HOST); RAP_int_i[num_cols_offd_RT] = RAP_size; /*----------------------------------------------------------------------- * Second Pass: Fill in RAP_int_data and RAP_int_j. *-----------------------------------------------------------------------*/ for (ii = 0; ii < num_threads; ii++) { size = num_cols_offd_RT / num_threads; rest = num_cols_offd_RT - size * num_threads; if (ii < rest) { ns = ii * size + ii; ne = (ii + 1) * size + ii + 1; } else { ns = ii * size + rest; ne = (ii + 1) * size + rest; } /*-------------------------------------------------------------------- * Initialize some stuff. *--------------------------------------------------------------------*/ if (num_cols_offd_Pext || num_cols_diag_P) { P_marker = P_mark_array[ii]; } A_marker = A_mark_array[ii]; jj_counter = start_indexing; if (ii > 0) { jj_counter = jj_count[ii - 1]; } for (ic = 0; ic < num_cols_diag_P + num_cols_offd_Pext; ic++) { P_marker[ic] = -1; } for (i = 0; i < num_nz_cols_A; i++) { A_marker[i] = -1; } /*-------------------------------------------------------------------- * Loop over exterior c-points. *--------------------------------------------------------------------*/ for (ic = ns; ic < ne; ic++) { jj_row_begining = jj_counter; RAP_int_i[ic] = jj_counter; /*----------------------------------------------------------------- * Loop over entries in row ic of R_offd. *-----------------------------------------------------------------*/ for (jj1 = R_offd_i[ic]; jj1 < R_offd_i[ic + 1]; jj1++) { i1 = R_offd_j[jj1]; r_entries = &(R_offd_data[jj1 * bnnz]); /*-------------------------------------------------------------- * Loop over entries in row i1 of A_offd. *--------------------------------------------------------------*/ for (jj2 = A_offd_i[i1]; jj2 < A_offd_i[i1 + 1]; jj2++) { i2 = A_offd_j[jj2]; hypre_CSRBlockMatrixBlockMultAdd(r_entries, &(A_offd_data[jj2 * bnnz]), zero, r_a_products, block_size); /*----------------------------------------------------------- * Check A_marker to see if point i2 has been previously * visited.New entries in RAP only occur from unmarked points. *-----------------------------------------------------------*/ if (A_marker[i2] != ic) { /*-------------------------------------------------------- * Mark i2 as visited. *--------------------------------------------------------*/ A_marker[i2] = ic; /*-------------------------------------------------------- * Loop over entries in row i2 of P_ext. *--------------------------------------------------------*/ for (jj3 = P_ext_diag_i[i2]; jj3 < P_ext_diag_i[i2 + 1]; jj3++) { i3 = P_ext_diag_j[jj3]; hypre_CSRBlockMatrixBlockMultAdd(r_a_products, &(P_ext_diag_data[jj3 * bnnz]), zero, r_a_p_products, block_size); /*----------------------------------------------------- * Check P_marker to see that RAP_{ic,i3} has not * been accounted for. If it has not, create a new * entry. If it has, add new contribution. *-----------------------------------------------------*/ if (P_marker[i3] < jj_row_begining) { P_marker[i3] = jj_counter; for (kk = 0; kk < bnnz; kk++) RAP_int_data[jj_counter * bnnz + kk] = r_a_p_products[kk]; RAP_int_j[jj_counter] = i3 + first_col_diag_P; jj_counter++; } else { for (kk = 0; kk < bnnz; kk++) RAP_int_data[P_marker[i3]*bnnz + kk] += r_a_p_products[kk]; } } for (jj3 = P_ext_offd_i[i2]; jj3 < P_ext_offd_i[i2 + 1]; jj3++) { i3 = P_ext_offd_j[jj3] + num_cols_diag_P; hypre_CSRBlockMatrixBlockMultAdd(r_a_products, &(P_ext_offd_data[jj3 * bnnz]), zero, r_a_p_products, block_size); /*-------------------------------------------------- * Check P_marker to see that RAP_{ic,i3} has not * been accounted for. If it has not, create a new * entry. If it has, add new contribution. *--------------------------------------------------*/ if (P_marker[i3] < jj_row_begining) { P_marker[i3] = jj_counter; for (kk = 0; kk < bnnz; kk++) RAP_int_data[jj_counter * bnnz + kk] = r_a_p_products[kk]; RAP_int_j[jj_counter] = col_map_offd_Pext[i3 - num_cols_diag_P]; jj_counter++; } else { for (kk = 0; kk < bnnz; kk++) RAP_int_data[P_marker[i3]*bnnz + kk] += r_a_p_products[kk]; } } } /*----------------------------------------------------------- * If i2 is previously visited ( A_marker[12]=ic ) it yields * no new entries in RAP and can just add new contributions. *-----------------------------------------------------------*/ else { for (jj3 = P_ext_diag_i[i2]; jj3 < P_ext_diag_i[i2 + 1]; jj3++) { i3 = P_ext_diag_j[jj3]; hypre_CSRBlockMatrixBlockMultAdd(r_a_products, &(P_ext_diag_data[jj3 * bnnz]), zero, r_a_p_products, block_size); for (kk = 0; kk < bnnz; kk++) RAP_int_data[P_marker[i3]*bnnz + kk] += r_a_p_products[kk]; } for (jj3 = P_ext_offd_i[i2]; jj3 < P_ext_offd_i[i2 + 1]; jj3++) { i3 = P_ext_offd_j[jj3] + num_cols_diag_P; hypre_CSRBlockMatrixBlockMultAdd(r_a_products, &(P_ext_offd_data[jj3 * bnnz]), zero, r_a_p_products, block_size); ind = P_marker[i3] * bnnz; for (kk = 0; kk < bnnz; kk++) { RAP_int_data[ind++] += r_a_p_products[kk]; } } } } /*-------------------------------------------------------------- * Loop over entries in row i1 of A_diag. *--------------------------------------------------------------*/ for (jj2 = A_diag_i[i1]; jj2 < A_diag_i[i1 + 1]; jj2++) { i2 = A_diag_j[jj2]; hypre_CSRBlockMatrixBlockMultAdd(r_entries, &(A_diag_data[jj2 * bnnz]), zero, r_a_products, block_size); /*----------------------------------------------------------- * Check A_marker to see if point i2 has been previously * visited. New entries in RAP only occur from unmarked points. *-----------------------------------------------------------*/ if (A_marker[i2 + num_cols_offd_A] != ic) { /*-------------------------------------------------------- * Mark i2 as visited. *--------------------------------------------------------*/ A_marker[i2 + num_cols_offd_A] = ic; /*-------------------------------------------------------- * Loop over entries in row i2 of P_diag. *--------------------------------------------------------*/ for (jj3 = P_diag_i[i2]; jj3 < P_diag_i[i2 + 1]; jj3++) { i3 = P_diag_j[jj3]; hypre_CSRBlockMatrixBlockMultAdd(r_a_products, &(P_diag_data[jj3 * bnnz]), zero, r_a_p_products, block_size); /*----------------------------------------------------- * Check P_marker to see that RAP_{ic,i3} has not * been accounted for. If it has not, create a new * entry. If it has, add new contribution. *-----------------------------------------------------*/ if (P_marker[i3] < jj_row_begining) { P_marker[i3] = jj_counter; ind = jj_counter * bnnz; for (kk = 0; kk < bnnz; kk++) { RAP_int_data[ind++] = r_a_p_products[kk]; } RAP_int_j[jj_counter] = (HYPRE_BigInt)i3 + first_col_diag_P; jj_counter++; } else { ind = P_marker[i3] * bnnz; for (kk = 0; kk < bnnz; kk++) { RAP_int_data[ind++] += r_a_p_products[kk]; } } } for (jj3 = P_offd_i[i2]; jj3 < P_offd_i[i2 + 1]; jj3++) { i3 = map_P_to_Pext[P_offd_j[jj3]] + num_cols_diag_P; hypre_CSRBlockMatrixBlockMultAdd(r_a_products, &(P_offd_data[jj3 * bnnz]), zero, r_a_p_products, block_size); /*----------------------------------------------------- * Check P_marker to see that RAP_{ic,i3} has not * been accounted for. If it has not, create a new * entry. If it has, add new contribution. *-----------------------------------------------------*/ if (P_marker[i3] < jj_row_begining) { P_marker[i3] = jj_counter; ind = jj_counter * bnnz; for (kk = 0; kk < bnnz; kk++) { RAP_int_data[ind++] = r_a_p_products[kk]; } RAP_int_j[jj_counter] = col_map_offd_Pext[i3 - num_cols_diag_P]; jj_counter++; } else { ind = P_marker[i3] * bnnz; for (kk = 0; kk < bnnz; kk++) { RAP_int_data[ind++] += r_a_p_products[kk]; } } } } /*----------------------------------------------------------- * If i2 is previously visited ( A_marker[12]=ic ) it yields * no new entries in RAP and can just add new contributions. *-----------------------------------------------------------*/ else { for (jj3 = P_diag_i[i2]; jj3 < P_diag_i[i2 + 1]; jj3++) { i3 = P_diag_j[jj3]; hypre_CSRBlockMatrixBlockMultAdd(r_a_products, &(P_diag_data[jj3 * bnnz]), zero, r_a_p_products, block_size); ind = P_marker[i3] * bnnz; for (kk = 0; kk < bnnz; kk++) { RAP_int_data[ind++] += r_a_p_products[kk]; } } for (jj3 = P_offd_i[i2]; jj3 < P_offd_i[i2 + 1]; jj3++) { i3 = map_P_to_Pext[P_offd_j[jj3]] + num_cols_diag_P; hypre_CSRBlockMatrixBlockMultAdd(r_a_products, &(P_offd_data[jj3 * bnnz]), zero, r_a_p_products, block_size); ind = P_marker[i3] * bnnz; for (kk = 0; kk < bnnz; kk++) { RAP_int_data[ind++] += r_a_p_products[kk]; } } } } } } if (num_cols_offd_Pext || num_cols_diag_P) { hypre_TFree(P_mark_array[ii], HYPRE_MEMORY_HOST); } hypre_TFree(A_mark_array[ii], HYPRE_MEMORY_HOST); } RAP_int = hypre_CSRBlockMatrixCreate(block_size, num_cols_offd_RT, num_rows_offd_RT, RAP_size); hypre_CSRBlockMatrixI(RAP_int) = RAP_int_i; hypre_CSRBlockMatrixBigJ(RAP_int) = RAP_int_j; hypre_CSRBlockMatrixData(RAP_int) = RAP_int_data; hypre_TFree(jj_count, HYPRE_MEMORY_HOST); } RAP_ext_size = 0; if (num_sends_RT || num_recvs_RT) { RAP_ext = hypre_ExchangeRAPBlockData(RAP_int, comm_pkg_RT, block_size); RAP_ext_i = hypre_CSRBlockMatrixI(RAP_ext); RAP_ext_j = hypre_CSRBlockMatrixBigJ(RAP_ext); RAP_ext_data = hypre_CSRBlockMatrixData(RAP_ext); RAP_ext_size = RAP_ext_i[hypre_CSRBlockMatrixNumRows(RAP_ext)]; } if (num_cols_offd_RT) { hypre_CSRBlockMatrixDestroy(RAP_int); RAP_int = NULL; } RAP_diag_i = hypre_CTAlloc(HYPRE_Int, num_cols_diag_P + 1, HYPRE_MEMORY_HOST); RAP_offd_i = hypre_CTAlloc(HYPRE_Int, num_cols_diag_P + 1, HYPRE_MEMORY_HOST); first_col_diag_RAP = first_col_diag_P; last_col_diag_RAP = first_col_diag_P + (HYPRE_BigInt) num_cols_diag_P - 1; /*----------------------------------------------------------------------- * check for new nonzero columns in RAP_offd generated through RAP_ext *-----------------------------------------------------------------------*/ if (RAP_ext_size || num_cols_offd_Pext) { temp = hypre_CTAlloc(HYPRE_BigInt, RAP_ext_size + num_cols_offd_Pext, HYPRE_MEMORY_HOST); cnt = 0; for (i = 0; i < RAP_ext_size; i++) { if (RAP_ext_j[i] < first_col_diag_RAP || RAP_ext_j[i] > last_col_diag_RAP) { temp[cnt++] = RAP_ext_j[i]; } } for (i = 0; i < num_cols_offd_Pext; i++) { temp[cnt++] = col_map_offd_Pext[i]; } if (cnt) { hypre_BigQsort0(temp, 0, cnt - 1); value = temp[0]; num_cols_offd_RAP = 1; for (i = 1; i < cnt; i++) { if (temp[i] > value) { value = temp[i]; temp[num_cols_offd_RAP++] = value; } } } /* now evaluate col_map_offd_RAP */ if (num_cols_offd_RAP) { col_map_offd_RAP = hypre_CTAlloc(HYPRE_BigInt, num_cols_offd_RAP, HYPRE_MEMORY_HOST); } for (i = 0 ; i < num_cols_offd_RAP; i++) { col_map_offd_RAP[i] = temp[i]; } hypre_TFree(temp, HYPRE_MEMORY_HOST); } if (num_cols_offd_P) { map_P_to_RAP = hypre_CTAlloc(HYPRE_Int, num_cols_offd_P, HYPRE_MEMORY_HOST); cnt = 0; for (i = 0; i < num_cols_offd_RAP; i++) { if (col_map_offd_RAP[i] == col_map_offd_P[cnt]) { map_P_to_RAP[cnt++] = i; if (cnt == num_cols_offd_P) { break; } } } } if (num_cols_offd_Pext) { map_Pext_to_RAP = hypre_CTAlloc(HYPRE_Int, num_cols_offd_Pext, HYPRE_MEMORY_HOST); cnt = 0; for (i = 0; i < num_cols_offd_RAP; i++) { if (col_map_offd_RAP[i] == col_map_offd_Pext[cnt]) { map_Pext_to_RAP[cnt++] = i; if (cnt == num_cols_offd_Pext) { break; } } } } /*----------------------------------------------------------------------- * Convert RAP_ext column indices *-----------------------------------------------------------------------*/ for (i = 0; i < RAP_ext_size; i++) { if (RAP_ext_j[i] < first_col_diag_RAP || RAP_ext_j[i] > last_col_diag_RAP) { RAP_ext_j[i] = (HYPRE_BigInt)(num_cols_diag_P) + hypre_BigBinarySearch(col_map_offd_RAP, RAP_ext_j[i], num_cols_offd_RAP); } else { RAP_ext_j[i] -= first_col_diag_RAP; } } /*----------------------------------------------------------------------- * Initialize some stuff. *-----------------------------------------------------------------------*/ jj_cnt_diag = hypre_CTAlloc(HYPRE_Int, num_threads, HYPRE_MEMORY_HOST); jj_cnt_offd = hypre_CTAlloc(HYPRE_Int, num_threads, HYPRE_MEMORY_HOST); for (ii = 0; ii < num_threads; ii++) { size = num_cols_diag_P / num_threads; rest = num_cols_diag_P - size * num_threads; if (ii < rest) { ns = ii * size + ii; ne = (ii + 1) * size + ii + 1; } else { ns = ii * size + rest; ne = (ii + 1) * size + rest; } P_mark_array[ii] = hypre_CTAlloc(HYPRE_Int, num_cols_diag_P + num_cols_offd_RAP, HYPRE_MEMORY_HOST); A_mark_array[ii] = hypre_CTAlloc(HYPRE_Int, num_nz_cols_A, HYPRE_MEMORY_HOST); P_marker = P_mark_array[ii]; A_marker = A_mark_array[ii]; jj_count_diag = start_indexing; jj_count_offd = start_indexing; for (ic = 0; ic < num_cols_diag_P + num_cols_offd_RAP; ic++) { P_marker[ic] = -1; } for (i = 0; i < num_nz_cols_A; i++) { A_marker[i] = -1; } /*----------------------------------------------------------------------- * Loop over interior c-points. *-----------------------------------------------------------------------*/ for (ic = ns; ic < ne; ic++) { /*-------------------------------------------------------------------- * Set marker for diagonal entry, RAP_{ic,ic}. and for all points * being added to row ic of RAP_diag and RAP_offd through RAP_ext *--------------------------------------------------------------------*/ P_marker[ic] = jj_count_diag; jj_row_begin_diag = jj_count_diag; jj_row_begin_offd = jj_count_offd; jj_count_diag++; for (i = 0; i < num_sends_RT; i++) { for (j = send_map_starts_RT[i]; j < send_map_starts_RT[i + 1]; j++) { if (send_map_elmts_RT[j] == ic) { for (k = RAP_ext_i[j]; k < RAP_ext_i[j + 1]; k++) { jcol = (HYPRE_Int)RAP_ext_j[k]; if (jcol < num_cols_diag_P) { if (P_marker[jcol] < jj_row_begin_diag) { P_marker[jcol] = jj_count_diag; jj_count_diag++; } } else { if (P_marker[jcol] < jj_row_begin_offd) { P_marker[jcol] = jj_count_offd; jj_count_offd++; } } } break; } } } /*----------------------------------------------------------------- * Loop over entries in row ic of R_diag. *-----------------------------------------------------------------*/ for (jj1 = R_diag_i[ic]; jj1 < R_diag_i[ic + 1]; jj1++) { i1 = R_diag_j[jj1]; /*----------------------------------------------------------------- * Loop over entries in row i1 of A_offd. *-----------------------------------------------------------------*/ if (num_cols_offd_A) { for (jj2 = A_offd_i[i1]; jj2 < A_offd_i[i1 + 1]; jj2++) { i2 = A_offd_j[jj2]; /*----------------------------------------------------------- * Check A_marker to see if point i2 has been previously * visited.New entries in RAP only occur from unmarked points. *-----------------------------------------------------------*/ if (A_marker[i2] != ic) { /*-------------------------------------------------------- * Mark i2 as visited. *--------------------------------------------------------*/ A_marker[i2] = ic; /*-------------------------------------------------------- * Loop over entries in row i2 of P_ext. *--------------------------------------------------------*/ for (jj3 = P_ext_diag_i[i2]; jj3 < P_ext_diag_i[i2 + 1]; jj3++) { i3 = P_ext_diag_j[jj3]; /*----------------------------------------------------- * Check P_marker to see that RAP_{ic,i3} has not * been accounted for. If it has not, mark it and * increment counter. *-----------------------------------------------------*/ if (P_marker[i3] < jj_row_begin_diag) { P_marker[i3] = jj_count_diag; jj_count_diag++; } } for (jj3 = P_ext_offd_i[i2]; jj3 < P_ext_offd_i[i2 + 1]; jj3++) { i3 = map_Pext_to_RAP[P_ext_offd_j[jj3]] + num_cols_diag_P; /*----------------------------------------------------- * Check P_marker to see that RAP_{ic,i3} has not * been accounted for. If it has not, mark it and * increment counter. *-----------------------------------------------------*/ if (P_marker[i3] < jj_row_begin_offd) { P_marker[i3] = jj_count_offd; jj_count_offd++; } } } } } /*----------------------------------------------------------------- * Loop over entries in row i1 of A_diag. *-----------------------------------------------------------------*/ for (jj2 = A_diag_i[i1]; jj2 < A_diag_i[i1 + 1]; jj2++) { i2 = A_diag_j[jj2]; /*-------------------------------------------------------------- * Check A_marker to see if point i2 has been previously * visited. New entries in RAP only occur from unmarked points. *--------------------------------------------------------------*/ if (A_marker[i2 + num_cols_offd_A] != ic) { /*----------------------------------------------------------- * Mark i2 as visited. *-----------------------------------------------------------*/ A_marker[i2 + num_cols_offd_A] = ic; /*----------------------------------------------------------- * Loop over entries in row i2 of P_diag. *-----------------------------------------------------------*/ for (jj3 = P_diag_i[i2]; jj3 < P_diag_i[i2 + 1]; jj3++) { i3 = P_diag_j[jj3]; /*-------------------------------------------------------- * Check P_marker to see that RAP_{ic,i3} has not already * been accounted for. If it has not, mark it and increment * counter. *--------------------------------------------------------*/ if (P_marker[i3] < jj_row_begin_diag) { P_marker[i3] = jj_count_diag; jj_count_diag++; } } /*----------------------------------------------------------- * Loop over entries in row i2 of P_offd. *-----------------------------------------------------------*/ if (num_cols_offd_P) { for (jj3 = P_offd_i[i2]; jj3 < P_offd_i[i2 + 1]; jj3++) { i3 = map_P_to_RAP[P_offd_j[jj3]] + num_cols_diag_P; /*----------------------------------------------------- * Check P_marker to see that RAP_{ic,i3} has not * been accounted for. If it has not, mark it and * increment counter. *-----------------------------------------------------*/ if (P_marker[i3] < jj_row_begin_offd) { P_marker[i3] = jj_count_offd; jj_count_offd++; } } } } } } /*-------------------------------------------------------------------- * Set RAP_diag_i and RAP_offd_i for this row. *--------------------------------------------------------------------*/ } jj_cnt_diag[ii] = jj_count_diag; jj_cnt_offd[ii] = jj_count_offd; } for (i = 0; i < num_threads - 1; i++) { jj_cnt_diag[i + 1] += jj_cnt_diag[i]; jj_cnt_offd[i + 1] += jj_cnt_offd[i]; } jj_count_diag = jj_cnt_diag[num_threads - 1]; jj_count_offd = jj_cnt_offd[num_threads - 1]; RAP_diag_i[num_cols_diag_P] = jj_count_diag; RAP_offd_i[num_cols_diag_P] = jj_count_offd; /*----------------------------------------------------------------------- * Allocate RAP_diag_data and RAP_diag_j arrays. * Allocate RAP_offd_data and RAP_offd_j arrays. *-----------------------------------------------------------------------*/ RAP_diag_size = jj_count_diag; if (RAP_diag_size) { RAP_diag_data = hypre_CTAlloc(HYPRE_Complex, RAP_diag_size * bnnz, HYPRE_MEMORY_HOST); RAP_diag_j = hypre_CTAlloc(HYPRE_Int, RAP_diag_size, HYPRE_MEMORY_HOST); } RAP_offd_size = jj_count_offd; if (RAP_offd_size) { RAP_offd_data = hypre_CTAlloc(HYPRE_Complex, RAP_offd_size * bnnz, HYPRE_MEMORY_HOST); RAP_offd_j = hypre_CTAlloc(HYPRE_Int, RAP_offd_size, HYPRE_MEMORY_HOST); } if (RAP_offd_size == 0 && num_cols_offd_RAP != 0) { num_cols_offd_RAP = 0; hypre_TFree(col_map_offd_RAP, HYPRE_MEMORY_HOST); } /*----------------------------------------------------------------------- * Second Pass: Fill in RAP_diag_data and RAP_diag_j. * Second Pass: Fill in RAP_offd_data and RAP_offd_j. *-----------------------------------------------------------------------*/ for (ii = 0; ii < num_threads; ii++) { size = num_cols_diag_P / num_threads; rest = num_cols_diag_P - size * num_threads; if (ii < rest) { ns = ii * size + ii; ne = (ii + 1) * size + ii + 1; } else { ns = ii * size + rest; ne = (ii + 1) * size + rest; } /*----------------------------------------------------------------------- * Initialize some stuff. *-----------------------------------------------------------------------*/ P_marker = P_mark_array[ii]; A_marker = A_mark_array[ii]; for (ic = 0; ic < num_cols_diag_P + num_cols_offd_RAP; ic++) { P_marker[ic] = -1; } for (i = 0; i < num_nz_cols_A ; i++) { A_marker[i] = -1; } jj_count_diag = start_indexing; jj_count_offd = start_indexing; if (ii > 0) { jj_count_diag = jj_cnt_diag[ii - 1]; jj_count_offd = jj_cnt_offd[ii - 1]; } /*----------------------------------------------------------------------- * Loop over interior c-points. *-----------------------------------------------------------------------*/ for (ic = ns; ic < ne; ic++) { /*-------------------------------------------------------------------- * Create diagonal entry, RAP_{ic,ic} and add entries of RAP_ext *--------------------------------------------------------------------*/ P_marker[ic] = jj_count_diag; jj_row_begin_diag = jj_count_diag; jj_row_begin_offd = jj_count_offd; RAP_diag_i[ic] = jj_row_begin_diag; RAP_offd_i[ic] = jj_row_begin_offd; ind = jj_count_diag * bnnz; for (kk = 0; kk < bnnz; kk++) { RAP_diag_data[ind++] = zero; } RAP_diag_j[jj_count_diag] = ic; jj_count_diag++; for (i = 0; i < num_sends_RT; i++) { for (j = send_map_starts_RT[i]; j < send_map_starts_RT[i + 1]; j++) { if (send_map_elmts_RT[j] == ic) { for (k = RAP_ext_i[j]; k < RAP_ext_i[j + 1]; k++) { jcol = (HYPRE_Int) RAP_ext_j[k]; if (jcol < num_cols_diag_P) { if (P_marker[jcol] < jj_row_begin_diag) { P_marker[jcol] = jj_count_diag; ind = jj_count_diag * bnnz; for (kk = 0; kk < bnnz; kk++) { RAP_diag_data[ind++] = RAP_ext_data[k * bnnz + kk]; } RAP_diag_j[jj_count_diag] = jcol; jj_count_diag++; } else { ind = P_marker[jcol] * bnnz; for (kk = 0; kk < bnnz; kk++) { RAP_diag_data[ind++] += RAP_ext_data[k * bnnz + kk]; } } } else { if (P_marker[jcol] < jj_row_begin_offd) { P_marker[jcol] = jj_count_offd; ind = jj_count_offd * bnnz; for (kk = 0; kk < bnnz; kk++) { RAP_offd_data[ind++] = RAP_ext_data[k * bnnz + kk]; } RAP_offd_j[jj_count_offd] = jcol - num_cols_diag_P; jj_count_offd++; } else { ind = P_marker[jcol] * bnnz; for (kk = 0; kk < bnnz; kk++) { RAP_offd_data[ind++] += RAP_ext_data[k * bnnz + kk]; } } } } break; } } } /*-------------------------------------------------------------------- * Loop over entries in row ic of R_diag. *--------------------------------------------------------------------*/ for (jj1 = R_diag_i[ic]; jj1 < R_diag_i[ic + 1]; jj1++) { i1 = R_diag_j[jj1]; r_entries = &(R_diag_data[jj1 * bnnz]); /*----------------------------------------------------------------- * Loop over entries in row i1 of A_offd. *-----------------------------------------------------------------*/ if (num_cols_offd_A) { for (jj2 = A_offd_i[i1]; jj2 < A_offd_i[i1 + 1]; jj2++) { i2 = A_offd_j[jj2]; hypre_CSRBlockMatrixBlockMultAdd(r_entries, &(A_offd_data[jj2 * bnnz]), zero, r_a_products, block_size); /*----------------------------------------------------------- * Check A_marker to see if point i2 has been previously * visited.New entries in RAP only occur from unmarked points. *-----------------------------------------------------------*/ if (A_marker[i2] != ic) { /*-------------------------------------------------------- * Mark i2 as visited. *--------------------------------------------------------*/ A_marker[i2] = ic; /*-------------------------------------------------------- * Loop over entries in row i2 of P_ext. *--------------------------------------------------------*/ for (jj3 = P_ext_diag_i[i2]; jj3 < P_ext_diag_i[i2 + 1]; jj3++) { i3 = P_ext_diag_j[jj3]; hypre_CSRBlockMatrixBlockMultAdd(r_a_products, &(P_ext_diag_data[jj3 * bnnz]), zero, r_a_p_products, block_size); /*----------------------------------------------------- * Check P_marker to see that RAP_{ic,i3} has not * been accounted for. If it has not, create a new * entry. If it has, add new contribution. *-----------------------------------------------------*/ if (P_marker[i3] < jj_row_begin_diag) { P_marker[i3] = jj_count_diag; ind = jj_count_diag * bnnz; for (kk = 0; kk < bnnz; kk++) { RAP_diag_data[ind++] = r_a_p_products[kk]; } RAP_diag_j[jj_count_diag] = i3; jj_count_diag++; } else { ind = P_marker[i3] * bnnz; for (kk = 0; kk < bnnz; kk++) { RAP_diag_data[ind++] += r_a_p_products[kk]; } } } for (jj3 = P_ext_offd_i[i2]; jj3 < P_ext_offd_i[i2 + 1]; jj3++) { i3 = map_Pext_to_RAP[P_ext_offd_j[jj3]] + num_cols_diag_P; hypre_CSRBlockMatrixBlockMultAdd(r_a_products, &(P_ext_offd_data[jj3 * bnnz]), zero, r_a_p_products, block_size); /*----------------------------------------------------- * Check P_marker to see that RAP_{ic,i3} has not * been accounted for. If it has not, create a new * entry. If it has, add new contribution. *-----------------------------------------------------*/ if (P_marker[i3] < jj_row_begin_offd) { P_marker[i3] = jj_count_offd; ind = jj_count_offd * bnnz; for (kk = 0; kk < bnnz; kk++) { RAP_offd_data[ind++] = r_a_p_products[kk]; } RAP_offd_j[jj_count_offd] = i3 - num_cols_diag_P; jj_count_offd++; } else { ind = P_marker[i3] * bnnz; for (kk = 0; kk < bnnz; kk++) { RAP_offd_data[ind++] += r_a_p_products[kk]; } } } } /*----------------------------------------------------------- * If i2 is previously visited ( A_marker[12]=ic ) it yields * no new entries in RAP and can just add new contributions. *-----------------------------------------------------------*/ else { for (jj3 = P_ext_diag_i[i2]; jj3 < P_ext_diag_i[i2 + 1]; jj3++) { i3 = P_ext_diag_j[jj3]; hypre_CSRBlockMatrixBlockMultAdd(r_a_products, &(P_ext_diag_data[jj3 * bnnz]), zero, r_a_p_products, block_size); ind = P_marker[i3] * bnnz; for (kk = 0; kk < bnnz; kk++) { RAP_diag_data[ind++] += r_a_p_products[kk]; } } for (jj3 = P_ext_offd_i[i2]; jj3 < P_ext_offd_i[i2 + 1]; jj3++) { i3 = map_Pext_to_RAP[P_ext_offd_j[jj3]] + num_cols_diag_P; hypre_CSRBlockMatrixBlockMultAdd(r_a_products, &(P_ext_offd_data[jj3 * bnnz]), zero, r_a_p_products, block_size); ind = P_marker[i3] * bnnz; for (kk = 0; kk < bnnz; kk++) { RAP_offd_data[ind++] += r_a_p_products[kk]; } } } } } /*----------------------------------------------------------------- * Loop over entries in row i1 of A_diag. *-----------------------------------------------------------------*/ for (jj2 = A_diag_i[i1]; jj2 < A_diag_i[i1 + 1]; jj2++) { i2 = A_diag_j[jj2]; hypre_CSRBlockMatrixBlockMultAdd(r_entries, &(A_diag_data[jj2 * bnnz]), zero, r_a_products, block_size); /*-------------------------------------------------------------- * Check A_marker to see if point i2 has been previously * visited. New entries in RAP only occur from unmarked points. *--------------------------------------------------------------*/ if (A_marker[i2 + num_cols_offd_A] != ic) { /*----------------------------------------------------------- * Mark i2 as visited. *-----------------------------------------------------------*/ A_marker[i2 + num_cols_offd_A] = ic; /*----------------------------------------------------------- * Loop over entries in row i2 of P_diag. *-----------------------------------------------------------*/ for (jj3 = P_diag_i[i2]; jj3 < P_diag_i[i2 + 1]; jj3++) { i3 = P_diag_j[jj3]; hypre_CSRBlockMatrixBlockMultAdd(r_a_products, &(P_diag_data[jj3 * bnnz]), zero, r_a_p_products, block_size); /*-------------------------------------------------------- * Check P_marker to see that RAP_{ic,i3} has not already * been accounted for. If it has not, create a new entry. * If it has, add new contribution. *--------------------------------------------------------*/ if (P_marker[i3] < jj_row_begin_diag) { P_marker[i3] = jj_count_diag; ind = jj_count_diag * bnnz; for (kk = 0; kk < bnnz; kk++) { RAP_diag_data[ind++] = r_a_p_products[kk]; } RAP_diag_j[jj_count_diag] = P_diag_j[jj3]; jj_count_diag++; } else { ind = P_marker[i3] * bnnz; for (kk = 0; kk < bnnz; kk++) { RAP_diag_data[ind++] += r_a_p_products[kk]; } } } if (num_cols_offd_P) { for (jj3 = P_offd_i[i2]; jj3 < P_offd_i[i2 + 1]; jj3++) { i3 = map_P_to_RAP[P_offd_j[jj3]] + num_cols_diag_P; hypre_CSRBlockMatrixBlockMultAdd(r_a_products, &(P_offd_data[jj3 * bnnz]), zero, r_a_p_products, block_size); /*----------------------------------------------------- * Check P_marker to see that RAP_{ic,i3} has not already * been accounted for. If it has not, create a new entry. * If it has, add new contribution. *-----------------------------------------------------*/ if (P_marker[i3] < jj_row_begin_offd) { P_marker[i3] = jj_count_offd; ind = jj_count_offd * bnnz; for (kk = 0; kk < bnnz; kk++) { RAP_offd_data[ind++] = r_a_p_products[kk]; } RAP_offd_j[jj_count_offd] = i3 - num_cols_diag_P; jj_count_offd++; } else { ind = P_marker[i3] * bnnz; for (kk = 0; kk < bnnz; kk++) { RAP_offd_data[ind++] += r_a_p_products[kk]; } } } } } /*-------------------------------------------------------------- * If i2 is previously visited ( A_marker[12]=ic ) it yields * no new entries in RAP and can just add new contributions. *--------------------------------------------------------------*/ else { for (jj3 = P_diag_i[i2]; jj3 < P_diag_i[i2 + 1]; jj3++) { i3 = P_diag_j[jj3]; hypre_CSRBlockMatrixBlockMultAdd(r_a_products, &(P_diag_data[jj3 * bnnz]), zero, r_a_p_products, block_size); ind = P_marker[i3] * bnnz; for (kk = 0; kk < bnnz; kk++) { RAP_diag_data[ind++] += r_a_p_products[kk]; } } if (num_cols_offd_P) { for (jj3 = P_offd_i[i2]; jj3 < P_offd_i[i2 + 1]; jj3++) { i3 = map_P_to_RAP[P_offd_j[jj3]] + num_cols_diag_P; hypre_CSRBlockMatrixBlockMultAdd(r_a_products, &(P_offd_data[jj3 * bnnz]), zero, r_a_p_products, block_size); ind = P_marker[i3] * bnnz; for (kk = 0; kk < bnnz; kk++) { RAP_offd_data[ind++] += r_a_p_products[kk]; } } } } } } } hypre_TFree(P_mark_array[ii], HYPRE_MEMORY_HOST); hypre_TFree(A_mark_array[ii], HYPRE_MEMORY_HOST); } for (i = 0; i < 2; i++) { row_starts[i] = col_starts[i] = coarse_partitioning[i]; } RAP = hypre_ParCSRBlockMatrixCreate(comm, block_size, n_coarse, n_coarse, row_starts, col_starts, num_cols_offd_RAP, RAP_diag_size, RAP_offd_size); RAP_diag = hypre_ParCSRBlockMatrixDiag(RAP); hypre_CSRBlockMatrixI(RAP_diag) = RAP_diag_i; if (RAP_diag_size) { hypre_CSRBlockMatrixData(RAP_diag) = RAP_diag_data; hypre_CSRBlockMatrixJ(RAP_diag) = RAP_diag_j; } RAP_offd = hypre_ParCSRBlockMatrixOffd(RAP); hypre_CSRBlockMatrixI(RAP_offd) = RAP_offd_i; if (num_cols_offd_RAP) { hypre_CSRBlockMatrixData(RAP_offd) = RAP_offd_data; hypre_CSRBlockMatrixJ(RAP_offd) = RAP_offd_j; hypre_ParCSRBlockMatrixColMapOffd(RAP) = col_map_offd_RAP; } if (num_procs > 1) { hypre_BlockMatvecCommPkgCreate(RAP); } *RAP_ptr = RAP; /*----------------------------------------------------------------------- * Free R, P_ext and marker arrays. *-----------------------------------------------------------------------*/ hypre_CSRBlockMatrixDestroy(R_diag); R_diag = NULL; if (num_cols_offd_RT) { hypre_CSRBlockMatrixDestroy(R_offd); R_offd = NULL; } if (num_sends_RT || num_recvs_RT) { hypre_CSRBlockMatrixDestroy(RAP_ext); RAP_ext = NULL; } hypre_TFree(P_mark_array, HYPRE_MEMORY_HOST); hypre_TFree(A_mark_array, HYPRE_MEMORY_HOST); hypre_TFree(P_ext_diag_i, HYPRE_MEMORY_HOST); hypre_TFree(P_ext_offd_i, HYPRE_MEMORY_HOST); hypre_TFree(jj_cnt_diag, HYPRE_MEMORY_HOST); hypre_TFree(jj_cnt_offd, HYPRE_MEMORY_HOST); if (num_cols_offd_P) { hypre_TFree(map_P_to_Pext, HYPRE_MEMORY_HOST); hypre_TFree(map_P_to_RAP, HYPRE_MEMORY_HOST); } if (num_cols_offd_Pext) { hypre_TFree(col_map_offd_Pext, HYPRE_MEMORY_HOST); hypre_TFree(map_Pext_to_RAP, HYPRE_MEMORY_HOST); } if (P_ext_diag_size) { hypre_TFree(P_ext_diag_data, HYPRE_MEMORY_HOST); hypre_TFree(P_ext_diag_j, HYPRE_MEMORY_HOST); } if (P_ext_offd_size) { hypre_TFree(P_ext_offd_data, HYPRE_MEMORY_HOST); hypre_TFree(P_ext_offd_j, HYPRE_MEMORY_HOST); } hypre_TFree(r_a_products, HYPRE_MEMORY_HOST); hypre_TFree(r_a_p_products, HYPRE_MEMORY_HOST); return hypre_error_flag; } hypre-2.33.0/src/parcsr_block_mv/par_csr_block_rap_communication.c000066400000000000000000000165621477326011500254410ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "_hypre_parcsr_block_mv.h" /* This function is the same as hypre_GetCommPkgRTFromCommPkgA, except that the arguments are Block matrices. We should change the code to take the commpkgs as input (and a couple of other items) and then we would not need two functions. (Because the commpkg is not different for a block matrix.) */ HYPRE_Int hypre_GetCommPkgBlockRTFromCommPkgBlockA( hypre_ParCSRBlockMatrix *RT, hypre_ParCSRBlockMatrix *A, HYPRE_Int *tmp_map_offd, HYPRE_BigInt *fine_to_coarse_offd) { MPI_Comm comm = hypre_ParCSRBlockMatrixComm(RT); hypre_ParCSRCommPkg *comm_pkg_A = hypre_ParCSRBlockMatrixCommPkg(A); HYPRE_Int num_recvs_A = hypre_ParCSRCommPkgNumRecvs(comm_pkg_A); HYPRE_Int *recv_procs_A = hypre_ParCSRCommPkgRecvProcs(comm_pkg_A); HYPRE_Int *recv_vec_starts_A = hypre_ParCSRCommPkgRecvVecStarts(comm_pkg_A); HYPRE_Int num_sends_A = hypre_ParCSRCommPkgNumSends(comm_pkg_A); HYPRE_Int *send_procs_A = hypre_ParCSRCommPkgSendProcs(comm_pkg_A); hypre_ParCSRCommPkg *comm_pkg = NULL; HYPRE_Int num_recvs_RT; HYPRE_Int *recv_procs_RT; HYPRE_Int *recv_vec_starts_RT; HYPRE_Int num_sends_RT; HYPRE_Int *send_procs_RT; HYPRE_Int *send_map_starts_RT; HYPRE_Int *send_map_elmts_RT; HYPRE_BigInt *send_big_elmts = NULL; HYPRE_BigInt *col_map_offd_RT = hypre_ParCSRBlockMatrixColMapOffd(RT); HYPRE_Int num_cols_offd_RT = hypre_CSRBlockMatrixNumCols( hypre_ParCSRMatrixOffd(RT)); HYPRE_BigInt first_col_diag = hypre_ParCSRBlockMatrixFirstColDiag(RT); HYPRE_Int i, j; HYPRE_Int vec_len, vec_start; HYPRE_Int num_procs, my_id; HYPRE_Int num_requests; HYPRE_Int offd_col, proc_num; HYPRE_Int *proc_mark; HYPRE_Int *change_array; hypre_MPI_Request *requests; hypre_MPI_Status *status; hypre_MPI_Comm_size(comm, &num_procs); hypre_MPI_Comm_rank(comm, &my_id); /*-------------------------------------------------------------------------- * determine num_recvs, recv_procs and recv_vec_starts for RT *--------------------------------------------------------------------------*/ proc_mark = hypre_CTAlloc(HYPRE_Int, num_recvs_A, HYPRE_MEMORY_HOST); for (i = 0; i < num_recvs_A; i++) { proc_mark[i] = 0; } proc_num = 0; num_recvs_RT = 0; if (num_cols_offd_RT) { for (i = 0; i < num_recvs_A; i++) { for (j = recv_vec_starts_A[i]; j < recv_vec_starts_A[i + 1]; j++) { offd_col = tmp_map_offd[proc_num]; if (offd_col == j) { proc_mark[i]++; proc_num++; if (proc_num == num_cols_offd_RT) { break; } } } if (proc_mark[i]) { num_recvs_RT++; } if (proc_num == num_cols_offd_RT) { break; } } } for (i = 0; i < num_cols_offd_RT; i++) { col_map_offd_RT[i] = fine_to_coarse_offd[tmp_map_offd[i]]; } recv_procs_RT = hypre_CTAlloc(HYPRE_Int, num_recvs_RT, HYPRE_MEMORY_HOST); recv_vec_starts_RT = hypre_CTAlloc(HYPRE_Int, num_recvs_RT + 1, HYPRE_MEMORY_HOST); j = 0; recv_vec_starts_RT[0] = 0; for (i = 0; i < num_recvs_A; i++) if (proc_mark[i]) { recv_procs_RT[j] = recv_procs_A[i]; recv_vec_starts_RT[j + 1] = recv_vec_starts_RT[j] + proc_mark[i]; j++; } /*-------------------------------------------------------------------------- * send num_changes to recv_procs_A and receive change_array from send_procs_A *--------------------------------------------------------------------------*/ num_requests = num_recvs_A + num_sends_A; requests = hypre_CTAlloc(hypre_MPI_Request, num_requests, HYPRE_MEMORY_HOST); status = hypre_CTAlloc(hypre_MPI_Status, num_requests, HYPRE_MEMORY_HOST); change_array = hypre_CTAlloc(HYPRE_Int, num_sends_A, HYPRE_MEMORY_HOST); j = 0; for (i = 0; i < num_sends_A; i++) hypre_MPI_Irecv(&change_array[i], 1, HYPRE_MPI_INT, send_procs_A[i], 0, comm, &requests[j++]); for (i = 0; i < num_recvs_A; i++) hypre_MPI_Isend(&proc_mark[i], 1, HYPRE_MPI_INT, recv_procs_A[i], 0, comm, &requests[j++]); hypre_MPI_Waitall(num_requests, requests, status); hypre_TFree(proc_mark, HYPRE_MEMORY_HOST); /*-------------------------------------------------------------------------- * if change_array[i] is 0 , omit send_procs_A[i] in send_procs_RT *--------------------------------------------------------------------------*/ num_sends_RT = 0; for (i = 0; i < num_sends_A; i++) if (change_array[i]) { num_sends_RT++; } send_procs_RT = hypre_CTAlloc(HYPRE_Int, num_sends_RT, HYPRE_MEMORY_HOST); send_map_starts_RT = hypre_CTAlloc(HYPRE_Int, num_sends_RT + 1, HYPRE_MEMORY_HOST); j = 0; send_map_starts_RT[0] = 0; for (i = 0; i < num_sends_A; i++) if (change_array[i]) { send_procs_RT[j] = send_procs_A[i]; send_map_starts_RT[j + 1] = send_map_starts_RT[j] + change_array[i]; j++; } /*-------------------------------------------------------------------------- * generate send_map_elmts *--------------------------------------------------------------------------*/ send_big_elmts = hypre_CTAlloc(HYPRE_BigInt, send_map_starts_RT[num_sends_RT], HYPRE_MEMORY_HOST); send_map_elmts_RT = hypre_CTAlloc(HYPRE_Int, send_map_starts_RT[num_sends_RT], HYPRE_MEMORY_HOST); j = 0; for (i = 0; i < num_sends_RT; i++) { vec_start = send_map_starts_RT[i]; vec_len = send_map_starts_RT[i + 1] - vec_start; hypre_MPI_Irecv(&send_big_elmts[vec_start], vec_len, HYPRE_MPI_BIG_INT, send_procs_RT[i], 0, comm, &requests[j++]); } for (i = 0; i < num_recvs_RT; i++) { vec_start = recv_vec_starts_RT[i]; vec_len = recv_vec_starts_RT[i + 1] - vec_start; hypre_MPI_Isend(&col_map_offd_RT[vec_start], vec_len, HYPRE_MPI_BIG_INT, recv_procs_RT[i], 0, comm, &requests[j++]); } hypre_MPI_Waitall(j, requests, status); for (i = 0; i < send_map_starts_RT[num_sends_RT]; i++) { send_map_elmts_RT[i] = (HYPRE_Int)(send_big_elmts[i] - first_col_diag); } /* Create communication package */ hypre_ParCSRCommPkgCreateAndFill(comm, num_recvs_RT, recv_procs_RT, recv_vec_starts_RT, num_sends_RT, send_procs_RT, send_map_starts_RT, send_map_elmts_RT, &comm_pkg); hypre_ParCSRBlockMatrixCommPkg(RT) = comm_pkg; /* Free memory */ hypre_TFree(status, HYPRE_MEMORY_HOST); hypre_TFree(requests, HYPRE_MEMORY_HOST); hypre_TFree(send_big_elmts, HYPRE_MEMORY_HOST); hypre_TFree(change_array, HYPRE_MEMORY_HOST); return hypre_error_flag; } hypre-2.33.0/src/parcsr_block_mv/par_csr_block_relax.c000066400000000000000000003217221477326011500230420ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "_hypre_parcsr_block_mv.h" HYPRE_Int gselim_piv(HYPRE_Real *A, HYPRE_Real *x, HYPRE_Int n); /*--------------------------------------------------------------------------- * hypre_BoomerAMGBlockRelaxIF This is the block version of the relaxation routines. A is now a Block matrix. CF_marker is size number of nodes *--------------------------------------------------------------------------*/ HYPRE_Int hypre_BoomerAMGBlockRelaxIF( hypre_ParCSRBlockMatrix *A, hypre_ParVector *f, HYPRE_Int *cf_marker, HYPRE_Int relax_type, HYPRE_Int relax_order, HYPRE_Int cycle_type, HYPRE_Real relax_weight, HYPRE_Real omega, hypre_ParVector *u, hypre_ParVector *Vtemp ) { HYPRE_Int i, Solve_err_flag = 0; HYPRE_Int relax_points[2]; if (relax_order == 1 && cycle_type < 3) /* if do C/F and not on the cg */ { if (cycle_type < 2) /* 0 = fine, 1 = down */ { relax_points[0] = 1; relax_points[1] = -1; } else /* 2 = up */ { relax_points[0] = -1; relax_points[1] = 1; } for (i = 0; i < 2; i++) { Solve_err_flag = hypre_BoomerAMGBlockRelax(A, f, cf_marker, relax_type, relax_points[i], relax_weight, omega, u, Vtemp); } } else /* either on the cg or doing normal relaxation (no C/F relaxation) */ { Solve_err_flag = hypre_BoomerAMGBlockRelax(A, f, cf_marker, relax_type, 0, relax_weight, omega, u, Vtemp); } return Solve_err_flag; } /*--------------------------------------------------------------------------- * hypre_BoomerAMGBlockRelax This is the block version of the relaxation routines. A is now a Block matrix. CF_marker is size number of nodes. *--------------------------------------------------------------------------*/ HYPRE_Int hypre_BoomerAMGBlockRelax( hypre_ParCSRBlockMatrix *A, hypre_ParVector *f, HYPRE_Int *cf_marker, HYPRE_Int relax_type, HYPRE_Int relax_points, HYPRE_Real relax_weight, HYPRE_Real omega, hypre_ParVector *u, hypre_ParVector *Vtemp ) { MPI_Comm comm = hypre_ParCSRBlockMatrixComm(A); hypre_CSRBlockMatrix *A_diag = hypre_ParCSRBlockMatrixDiag(A); HYPRE_Real *A_diag_data = hypre_CSRBlockMatrixData(A_diag); HYPRE_Int *A_diag_i = hypre_CSRBlockMatrixI(A_diag); HYPRE_Int *A_diag_j = hypre_CSRBlockMatrixJ(A_diag); hypre_CSRBlockMatrix *A_offd = hypre_ParCSRBlockMatrixOffd(A); HYPRE_Int *A_offd_i = hypre_CSRBlockMatrixI(A_offd); HYPRE_Real *A_offd_data = hypre_CSRBlockMatrixData(A_offd); HYPRE_Int *A_offd_j = hypre_CSRBlockMatrixJ(A_offd); hypre_ParCSRCommPkg *comm_pkg = hypre_ParCSRBlockMatrixCommPkg(A); hypre_ParCSRCommHandle *comm_handle = NULL; HYPRE_Int block_size = hypre_CSRBlockMatrixBlockSize(A_diag); HYPRE_Int bnnz = block_size * block_size; HYPRE_BigInt n_global; HYPRE_Int n = hypre_CSRBlockMatrixNumRows(A_diag); HYPRE_Int num_cols_offd = hypre_CSRBlockMatrixNumCols(A_offd); HYPRE_BigInt first_index = hypre_ParVectorFirstIndex(u); hypre_Vector *u_local = hypre_ParVectorLocalVector(u); HYPRE_Real *u_data = hypre_VectorData(u_local); hypre_Vector *f_local = hypre_ParVectorLocalVector(f); HYPRE_Real *f_data = hypre_VectorData(f_local); hypre_Vector *Vtemp_local = hypre_ParVectorLocalVector(Vtemp); HYPRE_Real *Vtemp_data = hypre_VectorData(Vtemp_local); HYPRE_Real *Vext_data = NULL; HYPRE_Real *v_buf_data = NULL; HYPRE_Real *tmp_data; HYPRE_Int size, rest, ne, ns; HYPRE_Int i, j, k; HYPRE_Int ii, jj; HYPRE_Int relax_error = 0; HYPRE_Int num_sends; HYPRE_Int index, start; HYPRE_Int num_procs, num_threads, my_id; HYPRE_Real *res_vec, *out_vec, *tmp_vec; HYPRE_Real *res0_vec, *res2_vec; HYPRE_Real one_minus_weight; HYPRE_Real one_minus_omega; HYPRE_Real prod; hypre_CSRMatrix *A_CSR; HYPRE_Int *A_CSR_i; HYPRE_Int *A_CSR_j; HYPRE_Real *A_CSR_data; hypre_Vector *f_vector; HYPRE_Real *f_vector_data; hypre_ParCSRMatrix *A_ParCSR; HYPRE_Real *A_mat; HYPRE_Real *b_vec; HYPRE_Int column; /* initialize some stuff */ one_minus_weight = 1.0 - relax_weight; one_minus_omega = 1.0 - omega; hypre_MPI_Comm_size(comm, &num_procs); hypre_MPI_Comm_rank(comm, &my_id); /* num_threads = hypre_NumThreads(); */ num_threads = 1; res_vec = hypre_CTAlloc(HYPRE_Real, block_size, HYPRE_MEMORY_HOST); out_vec = hypre_CTAlloc(HYPRE_Real, block_size, HYPRE_MEMORY_HOST); tmp_vec = hypre_CTAlloc(HYPRE_Real, block_size, HYPRE_MEMORY_HOST); if (!comm_pkg) { hypre_BlockMatvecCommPkgCreate(A); comm_pkg = hypre_ParCSRBlockMatrixCommPkg(A); } /*----------------------------------------------------------------------- * Switch statement to direct control based on relax_type: * relax_type = 20 -> Jacobi or CF-Jacobi * relax_type = 23 -> hybrid: SOR-J mix off-processor, SOR on-processor * with outer relaxation parameters (forward solve) * * relax_type = 26 -> hybrid: Jacobi off-processor, * Symm. Gauss-Seidel/ SSOR on-processor * with outer relaxation paramete * relax_type = 29 -> Direct Solve *-----------------------------------------------------------------------*/ switch (relax_type) { /*--------------------------------------------------------------------------- Jacobi ---------------------------------------------------------------------------*/ case 20: { if (num_procs > 1) { num_sends = hypre_ParCSRCommPkgNumSends(comm_pkg); v_buf_data = hypre_CTAlloc(HYPRE_Real, hypre_ParCSRCommPkgSendMapStart(comm_pkg, num_sends) * block_size, HYPRE_MEMORY_HOST); Vext_data = hypre_CTAlloc(HYPRE_Real, num_cols_offd * block_size, HYPRE_MEMORY_HOST); if (num_cols_offd) { A_offd_j = hypre_CSRBlockMatrixJ(A_offd); A_offd_data = hypre_CSRBlockMatrixData(A_offd); } index = 0; for (i = 0; i < num_sends; i++) { start = hypre_ParCSRCommPkgSendMapStart(comm_pkg, i); for (j = start; j < hypre_ParCSRCommPkgSendMapStart(comm_pkg, i + 1); j++) { for (k = 0; k < block_size; k++) { v_buf_data[index++] = u_data[hypre_ParCSRCommPkgSendMapElmt(comm_pkg, j) * block_size + k]; } } } /* we need to use the block comm handle here - since comm_pkg is nodal based */ comm_handle = hypre_ParCSRBlockCommHandleCreate(1, block_size, comm_pkg, v_buf_data, Vext_data ); } /*----------------------------------------------------------------- * Copy current approximation into temporary vector. *-----------------------------------------------------------------*/ for (i = 0; i < n * block_size; i++) { Vtemp_data[i] = u_data[i]; } if (num_procs > 1) { hypre_ParCSRBlockCommHandleDestroy(comm_handle); /* now Vext_data is populated */ comm_handle = NULL; } /*----------------------------------------------------------------- * Relax all points. *-----------------------------------------------------------------*/ if (relax_points == 0) { for (i = 0; i < n; i++) { /*----------------------------------------------------------- * If diagonal is nonzero, relax point i; otherwise, skip it. *-----------------------------------------------------------*/ for (k = 0; k < block_size; k++) { res_vec[k] = f_data[i * block_size + k]; } for (jj = A_diag_i[i] + 1; jj < A_diag_i[i + 1]; jj++) { ii = A_diag_j[jj]; /* res -= A_diag_data[jj] * Vtemp_data[ii]; */ hypre_CSRBlockMatrixBlockMatvec(-1.0, &A_diag_data[jj * bnnz], &Vtemp_data[ii * block_size], 1.0, res_vec, block_size); } for (jj = A_offd_i[i]; jj < A_offd_i[i + 1]; jj++) { ii = A_offd_j[jj]; /* res -= A_offd_data[jj] * Vext_data[ii]; */ hypre_CSRBlockMatrixBlockMatvec(-1.0, &A_offd_data[jj * bnnz], &Vext_data[ii * block_size], 1.0, res_vec, block_size); } /* if diag is singular, then skip this point */ if (hypre_CSRBlockMatrixBlockInvMatvec( &A_diag_data[A_diag_i[i]*bnnz], res_vec, out_vec, block_size) == 0) { for (k = 0; k < block_size; k++) { u_data[i * block_size + k] *= one_minus_weight; u_data[i * block_size + k] += relax_weight * out_vec[k]; } } } } /*----------------------------------------------------------------- * Relax only C or F points as determined by relax_points. *-----------------------------------------------------------------*/ else { for (i = 0; i < n; i++) { /*----------------------------------------------------------- * If i is of the right type ( C or F ) and diagonal is * nonzero, relax point i; otherwise, skip it. *-----------------------------------------------------------*/ if (cf_marker[i] == relax_points) { for (k = 0; k < block_size; k++) { res_vec[k] = f_data[i * block_size + k]; } for (jj = A_diag_i[i] + 1; jj < A_diag_i[i + 1]; jj++) { ii = A_diag_j[jj]; /* res -= A_diag_data[jj] * Vtemp_data[ii]; */ hypre_CSRBlockMatrixBlockMatvec(-1.0, &A_diag_data[jj * bnnz], &Vtemp_data[ii * block_size], 1.0, res_vec, block_size); } for (jj = A_offd_i[i]; jj < A_offd_i[i + 1]; jj++) { ii = A_offd_j[jj]; /* res -= A_offd_data[jj] * Vext_data[ii]; */ hypre_CSRBlockMatrixBlockMatvec(-1.0, &A_offd_data[jj * bnnz], &Vext_data[ii * block_size], 1.0, res_vec, block_size); } /* if diag is singular, then skip this point */ if (hypre_CSRBlockMatrixBlockInvMatvec( &A_diag_data[A_diag_i[i]*bnnz], res_vec, out_vec, block_size) == 0) { for (k = 0; k < block_size; k++) { u_data[i * block_size + k] *= one_minus_weight; u_data[i * block_size + k] += relax_weight * out_vec[k]; } } } } } if (num_procs > 1) { hypre_TFree(Vext_data, HYPRE_MEMORY_HOST); hypre_TFree(v_buf_data, HYPRE_MEMORY_HOST); } break; } /* end case 20 */ /*--------------------------------------------------------------------------- Hybrid: G-S on proc. and Jacobi off proc. ---------------------------------------------------------------------------*/ case 23: { if (num_procs > 1) { num_sends = hypre_ParCSRCommPkgNumSends(comm_pkg); v_buf_data = hypre_CTAlloc(HYPRE_Real, hypre_ParCSRCommPkgSendMapStart(comm_pkg, num_sends) * block_size, HYPRE_MEMORY_HOST); Vext_data = hypre_CTAlloc(HYPRE_Real, num_cols_offd * block_size, HYPRE_MEMORY_HOST); if (num_cols_offd) { A_offd_j = hypre_CSRBlockMatrixJ(A_offd); A_offd_data = hypre_CSRBlockMatrixData(A_offd); } index = 0; for (i = 0; i < num_sends; i++) { start = hypre_ParCSRCommPkgSendMapStart(comm_pkg, i); for (j = start; j < hypre_ParCSRCommPkgSendMapStart(comm_pkg, i + 1); j++) { for (k = 0; k < block_size; k++) { v_buf_data[index++] = u_data[hypre_ParCSRCommPkgSendMapElmt(comm_pkg, j) * block_size + k]; } } } /* we need to use the block comm handle here - since comm_pkg is nodal based */ comm_handle = hypre_ParCSRBlockCommHandleCreate(1, block_size, comm_pkg, v_buf_data, Vext_data ); } /*----------------------------------------------------------------- * Copy current approximation into temporary vector. *-----------------------------------------------------------------*/ for (i = 0; i < n * block_size; i++) { Vtemp_data[i] = u_data[i]; } if (num_procs > 1) { hypre_ParCSRBlockCommHandleDestroy(comm_handle); /* now Vext_data is populated */ comm_handle = NULL; } /*----------------------------------------------------------------- * relax weight and omega = 1 *-----------------------------------------------------------------*/ if (relax_weight == 1 && omega == 1) { /*----------------------------------------------------------------- * Relax all points. *-----------------------------------------------------------------*/ if (relax_points == 0) { if (num_threads > 1) { tmp_data = hypre_CTAlloc(HYPRE_Real, n, HYPRE_MEMORY_HOST); for (i = 0; i < n; i++) { tmp_data[i] = u_data[i]; } for (j = 0; j < num_threads; j++) { size = n / num_threads; rest = n - size * num_threads; if (j < rest) { ns = j * size + j; ne = (j + 1) * size + j + 1; } else { ns = j * size + rest; ne = (j + 1) * size + rest; } for (i = ns; i < ne; i++) /* interior points first */ { /*----------------------------------------------------------- * If diagonal is nonzero, relax point i; otherwise, skip it. *-----------------------------------------------------------*/ for (k = 0; k < block_size; k++) { res_vec[k] = f_data[i * block_size + k]; } for (jj = A_diag_i[i] + 1; jj < A_diag_i[i + 1]; jj++) { ii = A_diag_j[jj]; if (ii >= ns && ii < ne) { /* res -= A_diag_data[jj] * u_data[ii]; */ hypre_CSRBlockMatrixBlockMatvec(-1.0, &A_diag_data[jj * bnnz], &u_data[ii * block_size], 1.0, res_vec, block_size); } else { /* res -= A_diag_data[jj] * tmp_data[ii]; */ hypre_CSRBlockMatrixBlockMatvec(-1.0, &A_diag_data[jj * bnnz], &tmp_data[ii * block_size], 1.0, res_vec, block_size); } } for (jj = A_offd_i[i]; jj < A_offd_i[i + 1]; jj++) { ii = A_offd_j[jj]; /* res -= A_offd_data[jj] * Vext_data[ii];*/ hypre_CSRBlockMatrixBlockMatvec(-1.0, &A_offd_data[jj * bnnz], &Vext_data[ii * block_size], 1.0, res_vec, block_size); } /* u_data[i] = res / A_diag_data[A_diag_i[i]]; */ /* if diag is singular, then skip this point */ if (hypre_CSRBlockMatrixBlockInvMatvec( &A_diag_data[A_diag_i[i]*bnnz], res_vec, out_vec, block_size) == 0) { for (k = 0; k < block_size; k++) { u_data[i * block_size + k] = out_vec[k]; } } } /* for loop over points */ } /* foor loop over threads */ hypre_TFree(tmp_data, HYPRE_MEMORY_HOST); } else /* num_threads = 1 */ { for (i = 0; i < n; i++) /* interior points first */ { /*----------------------------------------------------------- * If diagonal is nonzero, relax point i; otherwise, skip it. *-----------------------------------------------------------*/ for (k = 0; k < block_size; k++) { res_vec[k] = f_data[i * block_size + k]; } for (jj = A_diag_i[i] + 1; jj < A_diag_i[i + 1]; jj++) { ii = A_diag_j[jj]; /* res -= A_diag_data[jj] * u_data[ii]; */ hypre_CSRBlockMatrixBlockMatvec(-1.0, &A_diag_data[jj * bnnz], &u_data[ii * block_size], 1.0, res_vec, block_size); } for (jj = A_offd_i[i]; jj < A_offd_i[i + 1]; jj++) { ii = A_offd_j[jj]; /* res -= A_offd_data[jj] * Vext_data[ii]; */ hypre_CSRBlockMatrixBlockMatvec(-1.0, &A_offd_data[jj * bnnz], &Vext_data[ii * block_size], 1.0, res_vec, block_size); } /* u_data[i] = res / A_diag_data[A_diag_i[i]]; */ if (hypre_CSRBlockMatrixBlockInvMatvec( &A_diag_data[A_diag_i[i]*bnnz], res_vec, out_vec, block_size) == 0) { for (k = 0; k < block_size; k++) { u_data[i * block_size + k] = out_vec[k]; } } } /* for loop over points */ } /* end of num_threads = 1 */ } /* end of non-CF relaxation */ /*----------------------------------------------------------------- * Relax only C or F points as determined by relax_points. *-----------------------------------------------------------------*/ else { if (num_threads > 1) { tmp_data = hypre_CTAlloc(HYPRE_Real, n, HYPRE_MEMORY_HOST); for (i = 0; i < n; i++) { tmp_data[i] = u_data[i]; } for (j = 0; j < num_threads; j++) { size = n / num_threads; rest = n - size * num_threads; if (j < rest) { ns = j * size + j; ne = (j + 1) * size + j + 1; } else { ns = j * size + rest; ne = (j + 1) * size + rest; } for (i = ns; i < ne; i++) /* relax interior points */ { /*----------------------------------------------------------- * If i is of the right type ( C or F ) and diagonal is * nonzero, relax point i; otherwise, skip it. *-----------------------------------------------------------*/ if (cf_marker[i] == relax_points ) { for (k = 0; k < block_size; k++) { res_vec[k] = f_data[i * block_size + k]; } for (jj = A_diag_i[i] + 1; jj < A_diag_i[i + 1]; jj++) { ii = A_diag_j[jj]; if (ii >= ns && ii < ne) { /* res -= A_diag_data[jj] * u_data[ii]; */ hypre_CSRBlockMatrixBlockMatvec(-1.0, &A_diag_data[jj * bnnz], &u_data[ii * block_size], 1.0, res_vec, block_size); } else { /* res -= A_diag_data[jj] * tmp_data[ii]; */ hypre_CSRBlockMatrixBlockMatvec(-1.0, &A_diag_data[jj * bnnz], &tmp_data[ii * block_size], 1.0, res_vec, block_size); } } for (jj = A_offd_i[i]; jj < A_offd_i[i + 1]; jj++) { ii = A_offd_j[jj]; /* res -= A_offd_data[jj] * Vext_data[ii];*/ hypre_CSRBlockMatrixBlockMatvec(-1.0, &A_offd_data[jj * bnnz], &Vext_data[ii * block_size], 1.0, res_vec, block_size); } /* u_data[i] = res / A_diag_data[A_diag_i[i]]; */ /* if diag is singular, then skip this point */ if (hypre_CSRBlockMatrixBlockInvMatvec( &A_diag_data[A_diag_i[i]*bnnz], res_vec, out_vec, block_size) == 0) { for (k = 0; k < block_size; k++) { u_data[i * block_size + k] = out_vec[k]; } } } } /* loop over points */ } /* loop over threads */ hypre_TFree(tmp_data, HYPRE_MEMORY_HOST); } else /* num_threads = 1 */ { for (i = 0; i < n; i++) /* relax interior points */ { /*----------------------------------------------------------- * If i is of the right type ( C or F ) and diagonal is * nonzero, relax point i; otherwise, skip it. *-----------------------------------------------------------*/ if (cf_marker[i] == relax_points ) { for (k = 0; k < block_size; k++) { res_vec[k] = f_data[i * block_size + k]; } for (jj = A_diag_i[i] + 1; jj < A_diag_i[i + 1]; jj++) { ii = A_diag_j[jj]; /* res -= A_diag_data[jj] * u_data[ii]; */ hypre_CSRBlockMatrixBlockMatvec(-1.0, &A_diag_data[jj * bnnz], &u_data[ii * block_size], 1.0, res_vec, block_size); } for (jj = A_offd_i[i]; jj < A_offd_i[i + 1]; jj++) { ii = A_offd_j[jj]; /* res -= A_offd_data[jj] * Vext_data[ii];*/ hypre_CSRBlockMatrixBlockMatvec(-1.0, &A_offd_data[jj * bnnz], &Vext_data[ii * block_size], 1.0, res_vec, block_size); } /* u_data[i] = res / A_diag_data[A_diag_i[i]]; */ /* if diag is singular, then skip this point */ if (hypre_CSRBlockMatrixBlockInvMatvec( &A_diag_data[A_diag_i[i]*bnnz], res_vec, out_vec, block_size) == 0) { for (k = 0; k < block_size; k++) { u_data[i * block_size + k] = out_vec[k]; } } } } /* end of loop over points */ } /* end of num_threads = 1 */ } /* end of C/F option */ } else { /*----------------------------------------------------------------- * relax weight and omega do not = 1 *-----------------------------------------------------------------*/ prod = (1.0 - relax_weight * omega); res0_vec = hypre_CTAlloc(HYPRE_Real, block_size, HYPRE_MEMORY_HOST); res2_vec = hypre_CTAlloc(HYPRE_Real, block_size, HYPRE_MEMORY_HOST); if (relax_points == 0) { /*----------------------------------------------------------------- * Relax all points. *-----------------------------------------------------------------*/ if (num_threads > 1) { tmp_data = hypre_CTAlloc(HYPRE_Real, n, HYPRE_MEMORY_HOST); for (i = 0; i < n; i++) { tmp_data[i] = u_data[i]; } for (j = 0; j < num_threads; j++) { size = n / num_threads; rest = n - size * num_threads; if (j < rest) { ns = j * size + j; ne = (j + 1) * size + j + 1; } else { ns = j * size + rest; ne = (j + 1) * size + rest; } for (i = ns; i < ne; i++) /* interior points first */ { /*----------------------------------------------------------- * If diagonal is nonzero, relax point i; otherwise, skip it. *-----------------------------------------------------------*/ for (k = 0; k < block_size; k++) { res_vec[k] = f_data[i * block_size + k]; res0_vec[k] = 0.0; res2_vec[k] = 0.0; } for (jj = A_diag_i[i] + 1; jj < A_diag_i[i + 1]; jj++) { ii = A_diag_j[jj]; if (ii >= ns && ii < ne) { /* res0 -= A_diag_data[jj] * u_data[ii]; */ hypre_CSRBlockMatrixBlockMatvec(-1.0, &A_diag_data[jj * bnnz], &u_data[ii * block_size], 1.0, res0_vec, block_size); /* res2 += A_diag_data[jj] * Vtemp_data[ii];*/ hypre_CSRBlockMatrixBlockMatvec(1.0, &A_diag_data[jj * bnnz], &Vtemp_data[ii * block_size], 1.0, res2_vec, block_size); } else { /* res -= A_diag_data[jj] * tmp_data[ii]; */ hypre_CSRBlockMatrixBlockMatvec(-1.0, &A_diag_data[jj * bnnz], &tmp_data[ii * block_size], 1.0, res_vec, block_size); } } for (jj = A_offd_i[i]; jj < A_offd_i[i + 1]; jj++) { ii = A_offd_j[jj]; /* res -= A_offd_data[jj] * Vext_data[ii];*/ hypre_CSRBlockMatrixBlockMatvec(-1.0, &A_offd_data[jj * bnnz], &Vext_data[ii * block_size], 1.0, res_vec, block_size); } /* u_data[i] *= prod; u_data[i] += relax_weight*(omega*res + res0 + one_minus_omega*res2) / A_diag_data[A_diag_i[i]];*/ for (k = 0; k < block_size; k++) { tmp_vec[k] = omega * res_vec[k] + res0_vec[k] + one_minus_omega * res2_vec[k]; } if (hypre_CSRBlockMatrixBlockInvMatvec( &A_diag_data[A_diag_i[i]*bnnz], tmp_vec, out_vec, block_size) == 0) { for (k = 0; k < block_size; k++) { u_data[i * block_size + k] *= prod; u_data[i * block_size + k] += relax_weight * out_vec[k]; } } } /* end of loop over points */ } /* end of loop over threads */ hypre_TFree(tmp_data, HYPRE_MEMORY_HOST); } else /* num_threads = 1 */ { for (i = 0; i < n; i++) /* interior points first */ { /*----------------------------------------------------------- * If diagonal is nonzero, relax point i; otherwise, skip it. *-----------------------------------------------------------*/ for (k = 0; k < block_size; k++) { res_vec[k] = f_data[i * block_size + k]; res0_vec[k] = 0.0; res2_vec[k] = 0.0; } for (jj = A_diag_i[i] + 1; jj < A_diag_i[i + 1]; jj++) { ii = A_diag_j[jj]; /* res0 -= A_diag_data[jj] * u_data[ii]; */ hypre_CSRBlockMatrixBlockMatvec(-1.0, &A_diag_data[jj * bnnz], &u_data[ii * block_size], 1.0, res0_vec, block_size); /* res2 += A_diag_data[jj] * Vtemp_data[ii];*/ hypre_CSRBlockMatrixBlockMatvec(1.0, &A_diag_data[jj * bnnz], &Vtemp_data[ii * block_size], 1.0, res2_vec, block_size); } for (jj = A_offd_i[i]; jj < A_offd_i[i + 1]; jj++) { ii = A_offd_j[jj]; /* res -= A_offd_data[jj] * Vext_data[ii];*/ hypre_CSRBlockMatrixBlockMatvec(-1.0, &A_offd_data[jj * bnnz], &Vext_data[ii * block_size], 1.0, res_vec, block_size); } /* u_data[i] *= prod; u_data[i] += relax_weight*(omega*res + res0 + one_minus_omega*res2) / A_diag_data[A_diag_i[i]]; */ for (k = 0; k < block_size; k++) { tmp_vec[k] = omega * res_vec[k] + res0_vec[k] + one_minus_omega * res2_vec[k]; } if (hypre_CSRBlockMatrixBlockInvMatvec( &A_diag_data[A_diag_i[i]*bnnz], tmp_vec, out_vec, block_size) == 0) { for (k = 0; k < block_size; k++) { u_data[i * block_size + k] *= prod; u_data[i * block_size + k] += relax_weight * out_vec[k]; } } } /* end of loop over points */ } /* end num_threads = 1 */ } /*----------------------------------------------------------------- * Relax only C or F points as determined by relax_points. *-----------------------------------------------------------------*/ else { if (num_threads > 1) { tmp_data = hypre_CTAlloc(HYPRE_Real, n, HYPRE_MEMORY_HOST); for (i = 0; i < n; i++) { tmp_data[i] = u_data[i]; } for (j = 0; j < num_threads; j++) { size = n / num_threads; rest = n - size * num_threads; if (j < rest) { ns = j * size + j; ne = (j + 1) * size + j + 1; } else { ns = j * size + rest; ne = (j + 1) * size + rest; } for (i = ns; i < ne; i++) /* relax interior points */ { /*----------------------------------------------------------- * If i is of the right type ( C or F ) and diagonal is * nonzero, relax point i; otherwise, skip it. *-----------------------------------------------------------*/ if (cf_marker[i] == relax_points) { /*----------------------------------------------------------- * If diagonal is nonzero, relax point i; otherwise, skip it. *-----------------------------------------------------------*/ for (k = 0; k < block_size; k++) { res_vec[k] = f_data[i * block_size + k]; res0_vec[k] = 0.0; res2_vec[k] = 0.0; } for (jj = A_diag_i[i] + 1; jj < A_diag_i[i + 1]; jj++) { ii = A_diag_j[jj]; if (ii >= ns && ii < ne) { /* res0 -= A_diag_data[jj] * u_data[ii]; */ hypre_CSRBlockMatrixBlockMatvec(-1.0, &A_diag_data[jj * bnnz], &u_data[ii * block_size], 1.0, res0_vec, block_size); /* res2 += A_diag_data[jj] * Vtemp_data[ii];*/ hypre_CSRBlockMatrixBlockMatvec(1.0, &A_diag_data[jj * bnnz], &Vtemp_data[ii * block_size], 1.0, res2_vec, block_size); } else { /* res -= A_diag_data[jj] * tmp_data[ii]; */ hypre_CSRBlockMatrixBlockMatvec(-1.0, &A_diag_data[jj * bnnz], &tmp_data[ii * block_size], 1.0, res_vec, block_size); } } for (jj = A_offd_i[i]; jj < A_offd_i[i + 1]; jj++) { ii = A_offd_j[jj]; /* res -= A_offd_data[jj] * Vext_data[ii];*/ hypre_CSRBlockMatrixBlockMatvec(-1.0, &A_offd_data[jj * bnnz], &Vext_data[ii * block_size], 1.0, res_vec, block_size); } /* u_data[i] *= prod; u_data[i] += relax_weight*(omega*res + res0 + one_minus_omega*res2) / A_diag_data[A_diag_i[i]];*/ for (k = 0; k < block_size; k++) { tmp_vec[k] = omega * res_vec[k] + res0_vec[k] + one_minus_omega * res2_vec[k]; } if (hypre_CSRBlockMatrixBlockInvMatvec( &A_diag_data[A_diag_i[i]*bnnz], tmp_vec, out_vec, block_size) == 0) { for (k = 0; k < block_size; k++) { u_data[i * block_size + k] *= prod; u_data[i * block_size + k] += relax_weight * out_vec[k]; } } } /* end of if cf_marker */ } /* end loop over points */ } /* end loop over threads */ hypre_TFree(tmp_data, HYPRE_MEMORY_HOST); } else /* num_threads = 1 */ { for (i = 0; i < n; i++) /* relax interior points */ { /*----------------------------------------------------------- * If i is of the right type ( C or F ) and diagonal is * nonzero, relax point i; otherwise, skip it. *-----------------------------------------------------------*/ if (cf_marker[i] == relax_points) { /*----------------------------------------------------------- * If diagonal is nonzero, relax point i; otherwise, skip it. *-----------------------------------------------------------*/ for (k = 0; k < block_size; k++) { res_vec[k] = f_data[i * block_size + k]; res0_vec[k] = 0.0; res2_vec[k] = 0.0; } for (jj = A_diag_i[i] + 1; jj < A_diag_i[i + 1]; jj++) { ii = A_diag_j[jj]; /* res0 -= A_diag_data[jj] * u_data[ii]; */ hypre_CSRBlockMatrixBlockMatvec(-1.0, &A_diag_data[jj * bnnz], &u_data[ii * block_size], 1.0, res0_vec, block_size); /* res2 += A_diag_data[jj] * Vtemp_data[ii];*/ hypre_CSRBlockMatrixBlockMatvec(1.0, &A_diag_data[jj * bnnz], &Vtemp_data[ii * block_size], 1.0, res2_vec, block_size); } for (jj = A_offd_i[i]; jj < A_offd_i[i + 1]; jj++) { ii = A_offd_j[jj]; /* res -= A_offd_data[jj] * Vext_data[ii];*/ hypre_CSRBlockMatrixBlockMatvec(-1.0, &A_offd_data[jj * bnnz], &Vext_data[ii * block_size], 1.0, res_vec, block_size); } /* u_data[i] *= prod; u_data[i] += relax_weight*(omega*res + res0 + one_minus_omega*res2) / A_diag_data[A_diag_i[i]];*/ for (k = 0; k < block_size; k++) { tmp_vec[k] = omega * res_vec[k] + res0_vec[k] + one_minus_omega * res2_vec[k]; } if (hypre_CSRBlockMatrixBlockInvMatvec( &A_diag_data[A_diag_i[i]*bnnz], tmp_vec, out_vec, block_size) == 0) { for (k = 0; k < block_size; k++) { u_data[i * block_size + k] *= prod; u_data[i * block_size + k] += relax_weight * out_vec[k]; } } } /* end cf_marker */ } /* end loop over points */ } /* end num_threads = 1 */ } /* end C/F option */ hypre_TFree(res0_vec, HYPRE_MEMORY_HOST); hypre_TFree(res2_vec, HYPRE_MEMORY_HOST); } /* end of check relax weight and omega */ if (num_procs > 1) { hypre_TFree(Vext_data, HYPRE_MEMORY_HOST); hypre_TFree(v_buf_data, HYPRE_MEMORY_HOST); } break; } /*----------------------------------------------------------------- Hybrid: Jacobi off-processor, Symm. Gauss-Seidel/ SSOR on-processor with outer relaxation parameter *-----------------------------------------------------------------*/ case 26: { if (num_procs > 1) { num_sends = hypre_ParCSRCommPkgNumSends(comm_pkg); v_buf_data = hypre_CTAlloc(HYPRE_Real, hypre_ParCSRCommPkgSendMapStart(comm_pkg, num_sends) * block_size, HYPRE_MEMORY_HOST); Vext_data = hypre_CTAlloc(HYPRE_Real, num_cols_offd * block_size, HYPRE_MEMORY_HOST); if (num_cols_offd) { A_offd_j = hypre_CSRBlockMatrixJ(A_offd); A_offd_data = hypre_CSRBlockMatrixData(A_offd); } index = 0; for (i = 0; i < num_sends; i++) { start = hypre_ParCSRCommPkgSendMapStart(comm_pkg, i); for (j = start; j < hypre_ParCSRCommPkgSendMapStart(comm_pkg, i + 1); j++) { for (k = 0; k < block_size; k++) { v_buf_data[index++] = u_data[hypre_ParCSRCommPkgSendMapElmt(comm_pkg, j) * block_size + k]; } } } /* we need to use the block comm handle here - since comm_pkg is nodal based */ comm_handle = hypre_ParCSRBlockCommHandleCreate( 1, block_size, comm_pkg, v_buf_data, Vext_data); hypre_ParCSRBlockCommHandleDestroy(comm_handle); comm_handle = NULL; } /*----------------------------------------------------------------- * Relax all points. *-----------------------------------------------------------------*/ if (relax_weight == 1 && omega == 1) { if (relax_points == 0) { if (num_threads > 1) { tmp_data = hypre_CTAlloc(HYPRE_Real, n, HYPRE_MEMORY_HOST); for (i = 0; i < n; i++) { tmp_data[i] = u_data[i]; } for (j = 0; j < num_threads; j++) { size = n / num_threads; rest = n - size * num_threads; if (j < rest) { ns = j * size + j; ne = (j + 1) * size + j + 1; } else { ns = j * size + rest; ne = (j + 1) * size + rest; } for (i = ns; i < ne; i++) /* interior points first */ { /*----------------------------------------------------------- * If diagonal is nonzero, relax point i; otherwise, skip it. *-----------------------------------------------------------*/ for (k = 0; k < block_size; k++) { res_vec[k] = f_data[i * block_size + k]; } for (jj = A_diag_i[i] + 1; jj < A_diag_i[i + 1]; jj++) { ii = A_diag_j[jj]; if (ii >= ns && ii < ne) { /* res -= A_diag_data[jj] * u_data[ii]; */ hypre_CSRBlockMatrixBlockMatvec(-1.0, &A_diag_data[jj * bnnz], &u_data[ii * block_size], 1.0, res_vec, block_size); } else { /* res -= A_diag_data[jj] * tmp_data[ii]; */ hypre_CSRBlockMatrixBlockMatvec(-1.0, &A_diag_data[jj * bnnz], &tmp_data[ii * block_size], 1.0, res_vec, block_size); } } for (jj = A_offd_i[i]; jj < A_offd_i[i + 1]; jj++) { ii = A_offd_j[jj]; /* res -= A_offd_data[jj] * Vext_data[ii];*/ hypre_CSRBlockMatrixBlockMatvec(-1.0, &A_offd_data[jj * bnnz], &Vext_data[ii * block_size], 1.0, res_vec, block_size); } /* u_data[i] = res / A_diag_data[A_diag_i[i]]; */ /* if diag is singular, then skip this point */ if (hypre_CSRBlockMatrixBlockInvMatvec( &A_diag_data[A_diag_i[i]*bnnz], res_vec, out_vec, block_size) == 0) { for (k = 0; k < block_size; k++) { u_data[i * block_size + k] = out_vec[k]; } } } /* end of interior points loop */ for (i = ne - 1; i > ns - 1; i--) /* interior points first */ { /*----------------------------------------------------------- * If diagonal is nonzero, relax point i; otherwise, skip it. *-----------------------------------------------------------*/ for (k = 0; k < block_size; k++) { res_vec[k] = f_data[i * block_size + k]; } for (jj = A_diag_i[i] + 1; jj < A_diag_i[i + 1]; jj++) { ii = A_diag_j[jj]; if (ii >= ns && ii < ne) { /* res -= A_diag_data[jj] * u_data[ii]; */ hypre_CSRBlockMatrixBlockMatvec(-1.0, &A_diag_data[jj * bnnz], &u_data[ii * block_size], 1.0, res_vec, block_size); } else { /* res -= A_diag_data[jj] * tmp_data[ii]; */ hypre_CSRBlockMatrixBlockMatvec(-1.0, &A_diag_data[jj * bnnz], &tmp_data[ii * block_size], 1.0, res_vec, block_size); } } for (jj = A_offd_i[i]; jj < A_offd_i[i + 1]; jj++) { ii = A_offd_j[jj]; /* res -= A_offd_data[jj] * Vext_data[ii]; */ hypre_CSRBlockMatrixBlockMatvec(-1.0, &A_offd_data[jj * bnnz], &Vext_data[ii * block_size], 1.0, res_vec, block_size); } /* u_data[i] = res / A_diag_data[A_diag_i[i]]; */ /* if diag is singular, then skip this point */ if (hypre_CSRBlockMatrixBlockInvMatvec( &A_diag_data[A_diag_i[i]*bnnz], res_vec, out_vec, block_size) == 0) { for (k = 0; k < block_size; k++) { u_data[i * block_size + k] = out_vec[k]; } } } /* end of loop over points */ } /* end of loop over threads */ hypre_TFree(tmp_data, HYPRE_MEMORY_HOST); } else /* num_thread ==1 */ { for (i = 0; i < n; i++) /* interior points first */ { /*----------------------------------------------------------- * If diagonal is nonzero, relax point i; otherwise, skip it. *-----------------------------------------------------------*/ for (k = 0; k < block_size; k++) { res_vec[k] = f_data[i * block_size + k]; } for (jj = A_diag_i[i] + 1; jj < A_diag_i[i + 1]; jj++) { ii = A_diag_j[jj]; /* res -= A_diag_data[jj] * u_data[ii]; */ hypre_CSRBlockMatrixBlockMatvec(-1.0, &A_diag_data[jj * bnnz], &u_data[ii * block_size], 1.0, res_vec, block_size); } for (jj = A_offd_i[i]; jj < A_offd_i[i + 1]; jj++) { ii = A_offd_j[jj]; /* res -= A_offd_data[jj] * Vext_data[ii]; */ hypre_CSRBlockMatrixBlockMatvec(-1.0, &A_offd_data[jj * bnnz], &Vext_data[ii * block_size], 1.0, res_vec, block_size); } /* u_data[i] = res / A_diag_data[A_diag_i[i]]; */ if (hypre_CSRBlockMatrixBlockInvMatvec( &A_diag_data[A_diag_i[i]*bnnz], res_vec, out_vec, block_size) == 0) { for (k = 0; k < block_size; k++) { u_data[i * block_size + k] = out_vec[k]; } } } /* end of loop over points */ for (i = n - 1; i > -1; i--) /* interior points first */ { /*----------------------------------------------------------- * If diagonal is nonzero, relax point i; otherwise, skip it. *-----------------------------------------------------------*/ for (k = 0; k < block_size; k++) { res_vec[k] = f_data[i * block_size + k]; } for (jj = A_diag_i[i] + 1; jj < A_diag_i[i + 1]; jj++) { ii = A_diag_j[jj]; /* res -= A_diag_data[jj] * u_data[ii]; */ hypre_CSRBlockMatrixBlockMatvec(-1.0, &A_diag_data[jj * bnnz], &u_data[ii * block_size], 1.0, res_vec, block_size); } for (jj = A_offd_i[i]; jj < A_offd_i[i + 1]; jj++) { ii = A_offd_j[jj]; /* res -= A_offd_data[jj] * Vext_data[ii]; */ hypre_CSRBlockMatrixBlockMatvec(-1.0, &A_offd_data[jj * bnnz], &Vext_data[ii * block_size], 1.0, res_vec, block_size); } /* u_data[i] = res / A_diag_data[A_diag_i[i]]; */ if (hypre_CSRBlockMatrixBlockInvMatvec( &A_diag_data[A_diag_i[i]*bnnz], res_vec, out_vec, block_size) == 0) { for (k = 0; k < block_size; k++) { u_data[i * block_size + k] = out_vec[k]; } } } /* end loop over points */ } /* end of num_threads = 1 */ } /* end of non-CF relaxation*/ /*----------------------------------------------------------------- * Relax only C or F points as determined by relax_points. *-----------------------------------------------------------------*/ else { if (num_threads > 1) { tmp_data = hypre_CTAlloc(HYPRE_Real, n, HYPRE_MEMORY_HOST); for (i = 0; i < n; i++) { tmp_data[i] = u_data[i]; } for (j = 0; j < num_threads; j++) { size = n / num_threads; rest = n - size * num_threads; if (j < rest) { ns = j * size + j; ne = (j + 1) * size + j + 1; } else { ns = j * size + rest; ne = (j + 1) * size + rest; } for (i = ns; i < ne; i++) /* relax interior points */ { /*----------------------------------------------------------- * If i is of the right type ( C or F ) and diagonal is * nonzero, relax point i; otherwise, skip it. *-----------------------------------------------------------*/ if (cf_marker[i] == relax_points) { for (k = 0; k < block_size; k++) { res_vec[k] = f_data[i * block_size + k]; } for (jj = A_diag_i[i] + 1; jj < A_diag_i[i + 1]; jj++) { ii = A_diag_j[jj]; if (ii >= ns && ii < ne) { /* res -= A_diag_data[jj] * u_data[ii]; */ hypre_CSRBlockMatrixBlockMatvec(-1.0, &A_diag_data[jj * bnnz], &u_data[ii * block_size], 1.0, res_vec, block_size); } else { /* res -= A_diag_data[jj] * tmp_data[ii]; */ hypre_CSRBlockMatrixBlockMatvec(-1.0, &A_diag_data[jj * bnnz], &tmp_data[ii * block_size], 1.0, res_vec, block_size); } } for (jj = A_offd_i[i]; jj < A_offd_i[i + 1]; jj++) { ii = A_offd_j[jj]; /* res -= A_offd_data[jj] * Vext_data[ii];*/ hypre_CSRBlockMatrixBlockMatvec(-1.0, &A_offd_data[jj * bnnz], &Vext_data[ii * block_size], 1.0, res_vec, block_size); } /* u_data[i] = res / A_diag_data[A_diag_i[i]]; */ /* if diag is singular, then skip this point */ if (hypre_CSRBlockMatrixBlockInvMatvec( &A_diag_data[A_diag_i[i]*bnnz], res_vec, out_vec, block_size) == 0) { for (k = 0; k < block_size; k++) { u_data[i * block_size + k] = out_vec[k]; } } } } for (i = ne - 1; i > ns - 1; i--) /* relax interior points */ { /*----------------------------------------------------------- * If i is of the right type ( C or F ) and diagonal is * nonzero, relax point i; otherwise, skip it. *-----------------------------------------------------------*/ if (cf_marker[i] == relax_points) { for (k = 0; k < block_size; k++) { res_vec[k] = f_data[i * block_size + k]; } for (jj = A_diag_i[i] + 1; jj < A_diag_i[i + 1]; jj++) { ii = A_diag_j[jj]; if (ii >= ns && ii < ne) { /* res -= A_diag_data[jj] * u_data[ii]; */ hypre_CSRBlockMatrixBlockMatvec(-1.0, &A_diag_data[jj * bnnz], &u_data[ii * block_size], 1.0, res_vec, block_size); } else { /* res -= A_diag_data[jj] * tmp_data[ii]; */ hypre_CSRBlockMatrixBlockMatvec(-1.0, &A_diag_data[jj * bnnz], &tmp_data[ii * block_size], 1.0, res_vec, block_size); } } for (jj = A_offd_i[i]; jj < A_offd_i[i + 1]; jj++) { ii = A_offd_j[jj]; /* res -= A_offd_data[jj] * Vext_data[ii];*/ hypre_CSRBlockMatrixBlockMatvec(-1.0, &A_offd_data[jj * bnnz], &Vext_data[ii * block_size], 1.0, res_vec, block_size); } /* u_data[i] = res / A_diag_data[A_diag_i[i]]; */ /* if diag is singular, then skip this point */ if (hypre_CSRBlockMatrixBlockInvMatvec( &A_diag_data[A_diag_i[i]*bnnz], res_vec, out_vec, block_size) == 0) { for (k = 0; k < block_size; k++) { u_data[i * block_size + k] = out_vec[k]; } } } } /* loop over pts */ } /* over threads */ hypre_TFree(tmp_data, HYPRE_MEMORY_HOST); } else /* num_threads = 1 */ { for (i = 0; i < n; i++) /* relax interior points */ { /*----------------------------------------------------------- * If i is of the right type ( C or F ) and diagonal is * nonzero, relax point i; otherwise, skip it. *-----------------------------------------------------------*/ if (cf_marker[i] == relax_points) { for (k = 0; k < block_size; k++) { res_vec[k] = f_data[i * block_size + k]; } for (jj = A_diag_i[i] + 1; jj < A_diag_i[i + 1]; jj++) { ii = A_diag_j[jj]; /* res -= A_diag_data[jj] * u_data[ii]; */ hypre_CSRBlockMatrixBlockMatvec(-1.0, &A_diag_data[jj * bnnz], &u_data[ii * block_size], 1.0, res_vec, block_size); } for (jj = A_offd_i[i]; jj < A_offd_i[i + 1]; jj++) { ii = A_offd_j[jj]; /* res -= A_offd_data[jj] * Vext_data[ii];*/ hypre_CSRBlockMatrixBlockMatvec(-1.0, &A_offd_data[jj * bnnz], &Vext_data[ii * block_size], 1.0, res_vec, block_size); } /* u_data[i] = res / A_diag_data[A_diag_i[i]]; */ /* if diag is singular, then skip this point */ if (hypre_CSRBlockMatrixBlockInvMatvec( &A_diag_data[A_diag_i[i]*bnnz], res_vec, out_vec, block_size) == 0) { for (k = 0; k < block_size; k++) { u_data[i * block_size + k] = out_vec[k]; } } } } for (i = n - 1; i > -1; i--) /* relax interior points */ { /*----------------------------------------------------------- * If i is of the right type ( C or F ) and diagonal is * nonzero, relax point i; otherwise, skip it. *-----------------------------------------------------------*/ if (cf_marker[i] == relax_points) { for (k = 0; k < block_size; k++) { res_vec[k] = f_data[i * block_size + k]; } for (jj = A_diag_i[i] + 1; jj < A_diag_i[i + 1]; jj++) { ii = A_diag_j[jj]; /* res -= A_diag_data[jj] * u_data[ii]; */ hypre_CSRBlockMatrixBlockMatvec(-1.0, &A_diag_data[jj * bnnz], &u_data[ii * block_size], 1.0, res_vec, block_size); } for (jj = A_offd_i[i]; jj < A_offd_i[i + 1]; jj++) { ii = A_offd_j[jj]; /* res -= A_offd_data[jj] * Vext_data[ii];*/ hypre_CSRBlockMatrixBlockMatvec(-1.0, &A_offd_data[jj * bnnz], &Vext_data[ii * block_size], 1.0, res_vec, block_size); } /* u_data[i] = res / A_diag_data[A_diag_i[i]]; */ /* if diag is singular, then skip this point */ if (hypre_CSRBlockMatrixBlockInvMatvec( &A_diag_data[A_diag_i[i]*bnnz], res_vec, out_vec, block_size) == 0) { for (k = 0; k < block_size; k++) { u_data[i * block_size + k] = out_vec[k]; } } } }/* end of loop over points */ } /* end of num_threads = 1 */ } /* end of C/F option */ } else { /*----------------------------------------------------------------- * relax weight and omega do not = 1 *-----------------------------------------------------------------*/ prod = (1.0 - relax_weight * omega); res0_vec = hypre_CTAlloc(HYPRE_Real, block_size, HYPRE_MEMORY_HOST); res2_vec = hypre_CTAlloc(HYPRE_Real, block_size, HYPRE_MEMORY_HOST); for (i = 0; i < n; i++) { Vtemp_data[i] = u_data[i]; } prod = (1.0 - relax_weight * omega); if (relax_points == 0) { if (num_threads > 1) { tmp_data = hypre_CTAlloc(HYPRE_Real, n, HYPRE_MEMORY_HOST); for (i = 0; i < n; i++) { tmp_data[i] = u_data[i]; } for (j = 0; j < num_threads; j++) { size = n / num_threads; rest = n - size * num_threads; if (j < rest) { ns = j * size + j; ne = (j + 1) * size + j + 1; } else { ns = j * size + rest; ne = (j + 1) * size + rest; } for (i = ns; i < ne; i++) /* interior points first */ { /*----------------------------------------------------------- * If diagonal is nonzero, relax point i; otherwise, skip it. *-----------------------------------------------------------*/ for (k = 0; k < block_size; k++) { res_vec[k] = f_data[i * block_size + k]; res0_vec[k] = 0.0; res2_vec[k] = 0.0; } for (jj = A_diag_i[i] + 1; jj < A_diag_i[i + 1]; jj++) { ii = A_diag_j[jj]; if (ii >= ns && ii < ne) { /* res0 -= A_diag_data[jj] * u_data[ii]; */ hypre_CSRBlockMatrixBlockMatvec(-1.0, &A_diag_data[jj * bnnz], &u_data[ii * block_size], 1.0, res0_vec, block_size); /* res2 += A_diag_data[jj] * Vtemp_data[ii];*/ hypre_CSRBlockMatrixBlockMatvec(1.0, &A_diag_data[jj * bnnz], &Vtemp_data[ii * block_size], 1.0, res2_vec, block_size); } else { /* res -= A_diag_data[jj] * tmp_data[ii]; */ hypre_CSRBlockMatrixBlockMatvec(-1.0, &A_diag_data[jj * bnnz], &tmp_data[ii * block_size], 1.0, res_vec, block_size); } } for (jj = A_offd_i[i]; jj < A_offd_i[i + 1]; jj++) { ii = A_offd_j[jj]; /* res -= A_offd_data[jj] * Vext_data[ii]; */ hypre_CSRBlockMatrixBlockMatvec(-1.0, &A_offd_data[jj * bnnz], &Vext_data[ii * block_size], 1.0, res_vec, block_size); } /* u_data[i] *= prod; u_data[i] += relax_weight*(omega*res + res0 + one_minus_omega*res2) / A_diag_data[A_diag_i[i]];*/ for (k = 0; k < block_size; k++) { tmp_vec[k] = omega * res_vec[k] + res0_vec[k] + one_minus_omega * res2_vec[k]; } if (hypre_CSRBlockMatrixBlockInvMatvec( &A_diag_data[A_diag_i[i]*bnnz], tmp_vec, out_vec, block_size) == 0) { for (k = 0; k < block_size; k++) { u_data[i * block_size + k] *= prod; u_data[i * block_size + k] += relax_weight * out_vec[k]; } } } for (i = ne - 1; i > ns - 1; i--) /* interior points first */ { /*----------------------------------------------------------- * If diagonal is nonzero, relax point i; otherwise, skip it. *-----------------------------------------------------------*/ for (k = 0; k < block_size; k++) { res_vec[k] = f_data[i * block_size + k]; res0_vec[k] = 0.0; res2_vec[k] = 0.0; } for (jj = A_diag_i[i] + 1; jj < A_diag_i[i + 1]; jj++) { ii = A_diag_j[jj]; if (ii >= ns && ii < ne) { /* res0 -= A_diag_data[jj] * u_data[ii]; */ hypre_CSRBlockMatrixBlockMatvec(-1.0, &A_diag_data[jj * bnnz], &u_data[ii * block_size], 1.0, res0_vec, block_size); /* res2 += A_diag_data[jj] * Vtemp_data[ii];*/ hypre_CSRBlockMatrixBlockMatvec(1.0, &A_diag_data[jj * bnnz], &Vtemp_data[ii * block_size], 1.0, res2_vec, block_size); } else { /* res -= A_diag_data[jj] * tmp_data[ii]; */ hypre_CSRBlockMatrixBlockMatvec(-1.0, &A_diag_data[jj * bnnz], &tmp_data[ii * block_size], 1.0, res_vec, block_size); } } for (jj = A_offd_i[i]; jj < A_offd_i[i + 1]; jj++) { ii = A_offd_j[jj]; /* res -= A_offd_data[jj] * Vext_data[ii];*/ hypre_CSRBlockMatrixBlockMatvec(-1.0, &A_offd_data[jj * bnnz], &Vext_data[ii * block_size], 1.0, res_vec, block_size); } /* u_data[i] *= prod; u_data[i] += relax_weight*(omega*res + res0 + one_minus_omega*res2) / A_diag_data[A_diag_i[i]];*/ for (k = 0; k < block_size; k++) { tmp_vec[k] = omega * res_vec[k] + res0_vec[k] + one_minus_omega * res2_vec[k]; } if (hypre_CSRBlockMatrixBlockInvMatvec( &A_diag_data[A_diag_i[i]*bnnz], tmp_vec, out_vec, block_size) == 0) { for (k = 0; k < block_size; k++) { u_data[i * block_size + k] *= prod; u_data[i * block_size + k] += relax_weight * out_vec[k]; } } } /* end of loop over points */ } /* loop over threads end */ hypre_TFree(tmp_data, HYPRE_MEMORY_HOST); } else /* num threads = 1 */ { for (i = 0; i < n; i++) /* interior points first */ { /*----------------------------------------------------------- * If diagonal is nonzero, relax point i; otherwise, skip it. *-----------------------------------------------------------*/ for (k = 0; k < block_size; k++) { res_vec[k] = f_data[i * block_size + k]; res0_vec[k] = 0.0; res2_vec[k] = 0.0; } for (jj = A_diag_i[i] + 1; jj < A_diag_i[i + 1]; jj++) { ii = A_diag_j[jj]; /* res0 -= A_diag_data[jj] * u_data[ii]; */ hypre_CSRBlockMatrixBlockMatvec(-1.0, &A_diag_data[jj * bnnz], &u_data[ii * block_size], 1.0, res0_vec, block_size); /* res2 += A_diag_data[jj] * Vtemp_data[ii];*/ hypre_CSRBlockMatrixBlockMatvec(1.0, &A_diag_data[jj * bnnz], &Vtemp_data[ii * block_size], 1.0, res2_vec, block_size); } for (jj = A_offd_i[i]; jj < A_offd_i[i + 1]; jj++) { ii = A_offd_j[jj]; /* res -= A_offd_data[jj] * Vext_data[ii];*/ hypre_CSRBlockMatrixBlockMatvec(-1.0, &A_offd_data[jj * bnnz], &Vext_data[ii * block_size], 1.0, res_vec, block_size); } /* u_data[i] *= prod; u_data[i] += relax_weight*(omega*res + res0 + one_minus_omega*res2) / A_diag_data[A_diag_i[i]]; */ for (k = 0; k < block_size; k++) { tmp_vec[k] = omega * res_vec[k] + res0_vec[k] + one_minus_omega * res2_vec[k]; } if (hypre_CSRBlockMatrixBlockInvMatvec( &A_diag_data[A_diag_i[i]*bnnz], tmp_vec, out_vec, block_size) == 0) { for (k = 0; k < block_size; k++) { u_data[i * block_size + k] *= prod; u_data[i * block_size + k] += relax_weight * out_vec[k]; } } } for (i = n - 1; i > -1; i--) /* interior points first */ { /*----------------------------------------------------------- * If diagonal is nonzero, relax point i; otherwise, skip it. *-----------------------------------------------------------*/ for (k = 0; k < block_size; k++) { res_vec[k] = f_data[i * block_size + k]; res0_vec[k] = 0.0; res2_vec[k] = 0.0; } for (jj = A_diag_i[i] + 1; jj < A_diag_i[i + 1]; jj++) { ii = A_diag_j[jj]; /* res0 -= A_diag_data[jj] * u_data[ii]; */ hypre_CSRBlockMatrixBlockMatvec(-1.0, &A_diag_data[jj * bnnz], &u_data[ii * block_size], 1.0, res0_vec, block_size); /* res2 += A_diag_data[jj] * Vtemp_data[ii];*/ hypre_CSRBlockMatrixBlockMatvec(1.0, &A_diag_data[jj * bnnz], &Vtemp_data[ii * block_size], 1.0, res2_vec, block_size); } for (jj = A_offd_i[i]; jj < A_offd_i[i + 1]; jj++) { ii = A_offd_j[jj]; /* res -= A_offd_data[jj] * Vext_data[ii];*/ hypre_CSRBlockMatrixBlockMatvec(-1.0, &A_offd_data[jj * bnnz], &Vext_data[ii * block_size], 1.0, res_vec, block_size); } /* u_data[i] *= prod; u_data[i] += relax_weight*(omega*res + res0 + one_minus_omega*res2) / A_diag_data[A_diag_i[i]]; */ for (k = 0; k < block_size; k++) { tmp_vec[k] = omega * res_vec[k] + res0_vec[k] + one_minus_omega * res2_vec[k]; } if (hypre_CSRBlockMatrixBlockInvMatvec( &A_diag_data[A_diag_i[i]*bnnz], tmp_vec, out_vec, block_size) == 0) { for (k = 0; k < block_size; k++) { u_data[i * block_size + k] *= prod; u_data[i * block_size + k] += relax_weight * out_vec[k]; } } }/* end of loop over points */ }/* end num_threads = 1 */ } /*----------------------------------------------------------------- * Relax only C or F points as determined by relax_points. *-----------------------------------------------------------------*/ else { if (num_threads > 1) { tmp_data = hypre_CTAlloc(HYPRE_Real, n, HYPRE_MEMORY_HOST); for (i = 0; i < n; i++) { tmp_data[i] = u_data[i]; } for (j = 0; j < num_threads; j++) { size = n / num_threads; rest = n - size * num_threads; if (j < rest) { ns = j * size + j; ne = (j + 1) * size + j + 1; } else { ns = j * size + rest; ne = (j + 1) * size + rest; } for (i = ns; i < ne; i++) /* relax interior points */ { /*----------------------------------------------------------- * If i is of the right type ( C or F ) and diagonal is * nonzero, relax point i; otherwise, skip it. *-----------------------------------------------------------*/ if (cf_marker[i] == relax_points ) { /*----------------------------------------------------------- * If diagonal is nonzero, relax point i; otherwise, skip it. *-----------------------------------------------------------*/ for (k = 0; k < block_size; k++) { res_vec[k] = f_data[i * block_size + k]; res0_vec[k] = 0.0; res2_vec[k] = 0.0; } for (jj = A_diag_i[i] + 1; jj < A_diag_i[i + 1]; jj++) { ii = A_diag_j[jj]; if (ii >= ns && ii < ne) { /* res0 -= A_diag_data[jj] * u_data[ii]; */ hypre_CSRBlockMatrixBlockMatvec(-1.0, &A_diag_data[jj * bnnz], &u_data[ii * block_size], 1.0, res0_vec, block_size); /* res2 += A_diag_data[jj] * Vtemp_data[ii];*/ hypre_CSRBlockMatrixBlockMatvec(1.0, &A_diag_data[jj * bnnz], &Vtemp_data[ii * block_size], 1.0, res2_vec, block_size); } else { /* res -= A_diag_data[jj] * tmp_data[ii]; */ hypre_CSRBlockMatrixBlockMatvec(-1.0, &A_diag_data[jj * bnnz], &tmp_data[ii * block_size], 1.0, res_vec, block_size); } } for (jj = A_offd_i[i]; jj < A_offd_i[i + 1]; jj++) { ii = A_offd_j[jj]; /* res -= A_offd_data[jj] * Vext_data[ii];*/ hypre_CSRBlockMatrixBlockMatvec(-1.0, &A_offd_data[jj * bnnz], &Vext_data[ii * block_size], 1.0, res_vec, block_size); } /* u_data[i] *= prod; u_data[i] += relax_weight*(omega*res + res0 + one_minus_omega*res2) / A_diag_data[A_diag_i[i]];*/ for (k = 0; k < block_size; k++) { tmp_vec[k] = omega * res_vec[k] + res0_vec[k] + one_minus_omega * res2_vec[k]; } if (hypre_CSRBlockMatrixBlockInvMatvec( &A_diag_data[A_diag_i[i]*bnnz], tmp_vec, out_vec, block_size) == 0) { for (k = 0; k < block_size; k++) { u_data[i * block_size + k] *= prod; u_data[i * block_size + k] += relax_weight * out_vec[k]; } } } } for (i = ne - 1; i > ns - 1; i--) /* relax interior points */ { /*----------------------------------------------------------- * If i is of the right type ( C or F ) and diagonal is * nonzero, relax point i; otherwise, skip it. *-----------------------------------------------------------*/ if (cf_marker[i] == relax_points) { /*----------------------------------------------------------- * If diagonal is nonzero, relax point i; otherwise, skip it. *-----------------------------------------------------------*/ for (k = 0; k < block_size; k++) { res_vec[k] = f_data[i * block_size + k]; res0_vec[k] = 0.0; res2_vec[k] = 0.0; } for (jj = A_diag_i[i] + 1; jj < A_diag_i[i + 1]; jj++) { ii = A_diag_j[jj]; if (ii >= ns && ii < ne) { /* res0 -= A_diag_data[jj] * u_data[ii]; */ hypre_CSRBlockMatrixBlockMatvec(-1.0, &A_diag_data[jj * bnnz], &u_data[ii * block_size], 1.0, res0_vec, block_size); /* res2 += A_diag_data[jj] * Vtemp_data[ii];*/ hypre_CSRBlockMatrixBlockMatvec(1.0, &A_diag_data[jj * bnnz], &Vtemp_data[ii * block_size], 1.0, res2_vec, block_size); } else { /* res -= A_diag_data[jj] * tmp_data[ii]; */ hypre_CSRBlockMatrixBlockMatvec(-1.0, &A_diag_data[jj * bnnz], &tmp_data[ii * block_size], 1.0, res_vec, block_size); } } for (jj = A_offd_i[i]; jj < A_offd_i[i + 1]; jj++) { ii = A_offd_j[jj]; /* res -= A_offd_data[jj] * Vext_data[ii];*/ hypre_CSRBlockMatrixBlockMatvec(-1.0, &A_offd_data[jj * bnnz], &Vext_data[ii * block_size], 1.0, res_vec, block_size); } /* u_data[i] *= prod; u_data[i] += relax_weight*(omega*res + res0 + one_minus_omega*res2) / A_diag_data[A_diag_i[i]];*/ for (k = 0; k < block_size; k++) { tmp_vec[k] = omega * res_vec[k] + res0_vec[k] + one_minus_omega * res2_vec[k]; } if (hypre_CSRBlockMatrixBlockInvMatvec( &A_diag_data[A_diag_i[i]*bnnz], tmp_vec, out_vec, block_size) == 0) { for (k = 0; k < block_size; k++) { u_data[i * block_size + k] *= prod; u_data[i * block_size + k] += relax_weight * out_vec[k]; } } } } /* end loop over points */ } /* end loop over threads */ hypre_TFree(tmp_data, HYPRE_MEMORY_HOST); } else /* num_threads = 1 */ { for (i = 0; i < n; i++) /* relax interior points */ { /*----------------------------------------------------------- * If i is of the right type ( C or F ) and diagonal is * nonzero, relax point i; otherwise, skip it. *-----------------------------------------------------------*/ if (cf_marker[i] == relax_points ) { for (k = 0; k < block_size; k++) { res_vec[k] = f_data[i * block_size + k]; res0_vec[k] = 0.0; res2_vec[k] = 0.0; } for (jj = A_diag_i[i] + 1; jj < A_diag_i[i + 1]; jj++) { ii = A_diag_j[jj]; /* res0 -= A_diag_data[jj] * u_data[ii]; */ hypre_CSRBlockMatrixBlockMatvec(-1.0, &A_diag_data[jj * bnnz], &u_data[ii * block_size], 1.0, res0_vec, block_size); /* res2 += A_diag_data[jj] * Vtemp_data[ii];*/ hypre_CSRBlockMatrixBlockMatvec(1.0, &A_diag_data[jj * bnnz], &Vtemp_data[ii * block_size], 1.0, res2_vec, block_size); } for (jj = A_offd_i[i]; jj < A_offd_i[i + 1]; jj++) { ii = A_offd_j[jj]; /* res -= A_offd_data[jj] * Vext_data[ii];*/ hypre_CSRBlockMatrixBlockMatvec(-1.0, &A_offd_data[jj * bnnz], &Vext_data[ii * block_size], 1.0, res_vec, block_size); } /* u_data[i] *= prod; u_data[i] += relax_weight*(omega*res + res0 + one_minus_omega*res2) / A_diag_data[A_diag_i[i]];*/ for (k = 0; k < block_size; k++) { tmp_vec[k] = omega * res_vec[k] + res0_vec[k] + one_minus_omega * res2_vec[k]; } if (hypre_CSRBlockMatrixBlockInvMatvec( &A_diag_data[A_diag_i[i]*bnnz], tmp_vec, out_vec, block_size) == 0) { for (k = 0; k < block_size; k++) { u_data[i * block_size + k] *= prod; u_data[i * block_size + k] += relax_weight * out_vec[k]; } } } } for (i = n - 1; i > -1; i--) /* relax interior points */ { /*----------------------------------------------------------- * If i is of the right type ( C or F ) and diagonal is * nonzero, relax point i; otherwise, skip it. *-----------------------------------------------------------*/ if (cf_marker[i] == relax_points ) { for (k = 0; k < block_size; k++) { res_vec[k] = f_data[i * block_size + k]; res0_vec[k] = 0.0; res2_vec[k] = 0.0; } for (jj = A_diag_i[i] + 1; jj < A_diag_i[i + 1]; jj++) { ii = A_diag_j[jj]; /* res0 -= A_diag_data[jj] * u_data[ii]; */ hypre_CSRBlockMatrixBlockMatvec(-1.0, &A_diag_data[jj * bnnz], &u_data[ii * block_size], 1.0, res0_vec, block_size); /* res2 += A_diag_data[jj] * Vtemp_data[ii];*/ hypre_CSRBlockMatrixBlockMatvec(1.0, &A_diag_data[jj * bnnz], &Vtemp_data[ii * block_size], 1.0, res2_vec, block_size); } for (jj = A_offd_i[i]; jj < A_offd_i[i + 1]; jj++) { ii = A_offd_j[jj]; /* res -= A_offd_data[jj] * Vext_data[ii];*/ hypre_CSRBlockMatrixBlockMatvec(-1.0, &A_offd_data[jj * bnnz], &Vext_data[ii * block_size], 1.0, res_vec, block_size); } /* u_data[i] *= prod; u_data[i] += relax_weight*(omega*res + res0 + one_minus_omega*res2) / A_diag_data[A_diag_i[i]];*/ for (k = 0; k < block_size; k++) { tmp_vec[k] = omega * res_vec[k] + res0_vec[k] + one_minus_omega * res2_vec[k]; } if (hypre_CSRBlockMatrixBlockInvMatvec( &A_diag_data[A_diag_i[i]*bnnz], tmp_vec, out_vec, block_size) == 0) { for (k = 0; k < block_size; k++) { u_data[i * block_size + k] *= prod; u_data[i * block_size + k] += relax_weight * out_vec[k]; } } } } /* loop over points */ } /* num threads = 1 */ } /* CF option */ hypre_TFree(res0_vec, HYPRE_MEMORY_HOST); hypre_TFree(res2_vec, HYPRE_MEMORY_HOST); } /* end of check relax weight and omega */ if (num_procs > 1) { hypre_TFree(Vext_data, HYPRE_MEMORY_HOST); hypre_TFree(v_buf_data, HYPRE_MEMORY_HOST); } break; } /*--------------------------------------------------------------------------- * Direct solve: use gaussian elimination *---------------------------------------------------------------------------*/ case 29: { /* for now, we convert to a parcsr and then proceed as in non-block case - shouldn't be too expensive since this is a small matrix. Would be better to just store the CSR matrix in the amg_data structure - esp. in the case of no global partition */ A_ParCSR = hypre_ParCSRBlockMatrixConvertToParCSRMatrix(A); n_global = hypre_ParCSRMatrixGlobalNumRows(A_ParCSR); HYPRE_Int n_small = (HYPRE_Int) n_global; /* we expect n_global to be small at this point */ /* Generate CSR matrix from ParCSRMatrix A */ /* all processors are needed for these routines */ A_CSR = hypre_ParCSRMatrixToCSRMatrixAll(A_ParCSR); f_vector = hypre_ParVectorToVectorAll(f); if (n) { A_CSR_i = hypre_CSRMatrixI(A_CSR); A_CSR_j = hypre_CSRMatrixJ(A_CSR); A_CSR_data = hypre_CSRMatrixData(A_CSR); f_vector_data = hypre_VectorData(f_vector); A_mat = hypre_CTAlloc(HYPRE_Real, n_small * n_small, HYPRE_MEMORY_HOST); b_vec = hypre_CTAlloc(HYPRE_Real, n_small, HYPRE_MEMORY_HOST); /* Load CSR matrix into A_mat. */ for (i = 0; i < n_small; i++) { for (jj = A_CSR_i[i]; jj < A_CSR_i[i + 1]; jj++) { column = A_CSR_j[jj]; A_mat[i * n_small + column] = A_CSR_data[jj]; } b_vec[i] = f_vector_data[i]; } relax_error = gselim_piv(A_mat, b_vec, n_small); /* should check the relax error */ for (i = 0; i < n; i++) { for (k = 0; k < block_size; k++) { u_data[i * block_size + k] = b_vec[first_index + i * block_size + k]; } } hypre_TFree(A_mat, HYPRE_MEMORY_HOST); hypre_TFree(b_vec, HYPRE_MEMORY_HOST); hypre_CSRMatrixDestroy(A_CSR); A_CSR = NULL; hypre_SeqVectorDestroy(f_vector); f_vector = NULL; } else { hypre_CSRMatrixDestroy(A_CSR); A_CSR = NULL; hypre_SeqVectorDestroy(f_vector); f_vector = NULL; } hypre_ParCSRMatrixDestroy(A_ParCSR); A_ParCSR = NULL; break; } } hypre_TFree(res_vec, HYPRE_MEMORY_HOST); hypre_TFree(out_vec, HYPRE_MEMORY_HOST); hypre_TFree(tmp_vec, HYPRE_MEMORY_HOST); return (relax_error); } /*------------------------------------------------------------------------- * * Gaussian Elimination - with pivoting * *------------------------------------------------------------------------ */ HYPRE_Int gselim_piv(HYPRE_Real *A, HYPRE_Real *x, HYPRE_Int n) { HYPRE_Int err_flag = 0; HYPRE_Int j, k, m, piv_row; HYPRE_Real factor, piv, tmp; HYPRE_Real eps = 1e-8; if (n == 1) /* A is 1x1 */ { if (hypre_abs(A[0]) > 1e-10) { x[0] = x[0] / A[0]; return (err_flag); } else { err_flag = 1; return (err_flag); } } else /* A is nxn. Forward elimination */ { for (k = 0; k < n - 1; k++) { /* we do partial pivoting for size */ piv = A[k * n + k]; piv_row = k; /* find the largest pivot in position k*/ for (j = k + 1; j < n; j++) { if (hypre_abs(A[j * n + k]) > hypre_abs(piv)) { piv = A[j * n + k]; piv_row = j; } } if (piv_row != k) /* do a row exchange - rows k and piv_row*/ { for (j = 0; j < n; j++) { tmp = A[k * n + j]; A[k * n + j] = A[piv_row * n + j]; A[piv_row * n + j] = tmp; } tmp = x[k]; x[k] = x[piv_row]; x[piv_row] = tmp; } if (hypre_abs(piv) > eps) { for (j = k + 1; j < n; j++) { if (A[j * n + k] != 0.0) { factor = A[j * n + k] / A[k * n + k]; for (m = k + 1; m < n; m++) { A[j * n + m] -= factor * A[k * n + m]; } /* Elimination step for rhs */ x[j] -= factor * x[k]; } } } else { /* hypre_printf("Matrix is nearly singular: zero pivot error\n"); */ return (-1); } } /* we also need to check the pivot in the last row to see if it is zero */ k = n - 1; /* last row */ if ( hypre_abs(A[k * n + k]) < eps) { /* hypre_printf("Block of matrix is nearly singular: zero pivot error\n"); */ return (-1); } /* Back Substitution */ for (k = n - 1; k > 0; --k) { x[k] /= A[k * n + k]; for (j = 0; j < k; j++) { if (A[j * n + k] != 0.0) { x[j] -= x[k] * A[j * n + k]; } } } x[0] /= A[0]; return (err_flag); } } hypre-2.33.0/src/parcsr_ls/000077500000000000000000000000001477326011500155135ustar00rootroot00000000000000hypre-2.33.0/src/parcsr_ls/CMakeLists.txt000066400000000000000000000077651477326011500202720ustar00rootroot00000000000000# Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) set(HDRS HYPRE_parcsr_ls.h _hypre_parcsr_ls.h ) set(SRCS amg_hybrid.c aux_interp.c F90_hypre_laplace.c F90_HYPRE_parcsr_amg.c F90_HYPRE_parcsr_bicgstab.c F90_HYPRE_parcsr_block.c F90_HYPRE_parcsr_cgnr.c F90_HYPRE_parcsr_Euclid.c F90_HYPRE_parcsr_gmres.c F90_HYPRE_parcsr_cogmres.c F90_HYPRE_parcsr_flexgmres.c F90_HYPRE_parcsr_lgmres.c F90_HYPRE_parcsr_hybrid.c F90_HYPRE_parcsr_int.c F90_HYPRE_parcsr_ParaSails.c F90_HYPRE_parcsr_pcg.c F90_HYPRE_parcsr_pilut.c F90_HYPRE_parcsr_schwarz.c F90_HYPRE_parcsr_mgr.c F90_HYPRE_parcsr_ilu.c F90_HYPRE_ams.c gen_redcs_mat.c HYPRE_parcsr_amg.c HYPRE_parcsr_amgdd.c HYPRE_parcsr_bicgstab.c HYPRE_parcsr_block.c HYPRE_parcsr_cgnr.c HYPRE_parcsr_Euclid.c HYPRE_parcsr_gmres.c HYPRE_parcsr_cogmres.c HYPRE_parcsr_flexgmres.c HYPRE_parcsr_lgmres.c HYPRE_parcsr_hybrid.c HYPRE_parcsr_int.c HYPRE_parcsr_ilu.c HYPRE_parcsr_mgr.c HYPRE_parcsr_ParaSails.c HYPRE_parcsr_pcg.c HYPRE_parcsr_pilut.c HYPRE_parcsr_schwarz.c HYPRE_parcsr_fsai.c HYPRE_ams.c HYPRE_ads.c HYPRE_ame.c par_2s_interp.c par_amg.c par_amgdd.c par_amgdd_comp_grid.c par_amgdd_solve.c par_amgdd_helpers.c par_amgdd_fac_cycle.c par_amgdd_setup.c par_amg_setup.c par_amg_solve.c par_amg_solveT.c par_cg_relax_wt.c par_coarsen.c par_cgc_coarsen.c par_cheby.c par_cheby_device.c par_coarse_parms.c par_coarse_parms_device.c par_coordinates.c par_cr.c par_cycle.c par_add_cycle.c par_difconv.c par_fsai.c par_fsai_device.c par_fsai_setup.c par_fsai_solve.c par_fsai_device.c par_gauss_elim.c par_ge_device.c par_gsmg.c par_indepset.c par_interp.c par_jacobi_interp.c par_krylov_func.c par_mod_lr_interp.c par_mod_multi_interp.c par_multi_interp.c par_laplace_27pt.c par_laplace_9pt.c par_laplace.c par_lr_interp.c par_mgr.c par_mgr_coarsen.c par_mgr_interp.c par_mgr_rap.c par_mgr_setup.c par_mgr_solve.c par_mgr_stats.c par_nongalerkin.c par_nodal_systems.c par_rap.c par_rap_communication.c par_rotate_7pt.c par_vardifconv.c par_vardifconv_rs.c par_relax.c par_relax_more.c par_relax_more_device.c par_relax_interface.c par_scaled_matnorm.c par_schwarz.c par_stats.c par_strength.c par_sv_interp.c par_sv_interp_ln.c partial.c schwarz.c block_tridiag.c ams.c ads.c ame.c par_restr.c par_lr_restr.c par_mgr.c par_mgr_setup.c par_mgr_solve.c par_ilu.c par_ilu_setup.c par_ilu_setup_device.c par_ilu_solve.c par_ilu_solve_device.c par_coarsen_device.c par_indepset_device.c par_interp_device.c par_interp_trunc_device.c par_lr_interp_device.c par_lr_restr_device.c par_strength_device.c par_strength2nd_device.c par_amgdd_fac_cycle_device.c par_2s_interp_device.c par_relax_device.c par_mod_multi_interp_device.c par_mgr_device.c ) target_sources(${PROJECT_NAME} PRIVATE ${SRCS} ${HDRS} ) if (HYPRE_USING_GPU) set(GPU_SRCS ams.c ads.c ame.c par_amg_setup.c par_ge_device.c par_ilu.c par_ilu_setup.c par_ilu_setup_device.c par_ilu_solve.c par_ilu_solve_device.c par_coarsen_device.c par_coarse_parms_device.c par_indepset_device.c par_interp_device.c par_interp_trunc_device.c par_lr_interp_device.c par_lr_restr_device.c par_mod_multi_interp_device.c par_strength_device.c par_strength2nd_device.c par_relax_more_device.c par_cheby_device.c par_amgdd_fac_cycle_device.c par_2s_interp_device.c par_relax_device.c par_mgr_device.c par_fsai_device.c dsuperlu.c ) convert_filenames_to_full_paths(GPU_SRCS) set(HYPRE_GPU_SOURCES ${HYPRE_GPU_SOURCES} ${GPU_SRCS} PARENT_SCOPE) endif () convert_filenames_to_full_paths(HDRS) set(HYPRE_HEADERS ${HYPRE_HEADERS} ${HDRS} PARENT_SCOPE) hypre-2.33.0/src/parcsr_ls/Common.h000066400000000000000000000026221477326011500171160ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * Common.h header file - common definitions and parameters; also hides * HYPRE-specific definitions * *****************************************************************************/ #include #if 1 /* HYPRE */ #include "HYPRE_config.h" #include "_hypre_utilities.h" #include "fortran.h" #ifdef HYPRE_USING_ESSL #define ESSL #endif #else /* not HYPRE */ #include "mpi.h" #endif #ifndef _COMMON_H #define _COMMON_H #define PARASAILS_MAXLEN 300000 /* maximum nz in a pattern - can grow */ #define PARASAILS_NROWS 300000 /* maximum rows stored per proc - can grow */ #ifndef ABS #define ABS(x) (((x)<0)?(-(x)):(x)) #endif #ifndef MAX #define MAX(a,b) ((a)>(b)?(a):(b)) #endif #ifndef MIN #define MIN(a,b) ((a)<(b)?(a):(b)) #endif #define PARASAILS_EXIT \ { \ hypre_fprintf(stderr, "Exiting...\n"); \ fflush(NULL); \ hypre_MPI_Abort(hypre_MPI_COMM_WORLD, -1); \ } #endif /* _COMMON_H */ hypre-2.33.0/src/parcsr_ls/F90_HYPRE_ams.c000066400000000000000000000311731477326011500200310ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * HYPRE_AMS Fortran interface * *****************************************************************************/ #include "_hypre_parcsr_ls.h" #include "fortran.h" #ifdef __cplusplus extern "C" { #endif /*-------------------------------------------------------------------------- * HYPRE_AMSCreate *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_amscreate, HYPRE_AMSCREATE) ( hypre_F90_Obj *solver, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) ( HYPRE_AMSCreate( hypre_F90_PassObjRef (HYPRE_Solver, solver) ) ); } /*-------------------------------------------------------------------------- * HYPRE_AMSDestroy *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_amsdestroy, HYPRE_AMSDESTROY) ( hypre_F90_Obj *solver, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) ( HYPRE_AMSDestroy( hypre_F90_PassObj (HYPRE_Solver, solver) ) ); } /*-------------------------------------------------------------------------- * HYPRE_AMSSetup *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_amssetup, HYPRE_AMSSETUP) ( hypre_F90_Obj *solver, hypre_F90_Obj *A, hypre_F90_Obj *b, hypre_F90_Obj *x, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) ( HYPRE_AMSSetup( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassObj (HYPRE_ParCSRMatrix, A), hypre_F90_PassObj (HYPRE_ParVector, b), hypre_F90_PassObj (HYPRE_ParVector, x) ) ); } /*-------------------------------------------------------------------------- * HYPRE_AMSSolve *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_amssolve, HYPRE_AMSSOLVE) ( hypre_F90_Obj *solver, hypre_F90_Obj *A, hypre_F90_Obj *b, hypre_F90_Obj *x, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) ( HYPRE_AMSSolve( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassObj (HYPRE_ParCSRMatrix, A), hypre_F90_PassObj (HYPRE_ParVector, b), hypre_F90_PassObj (HYPRE_ParVector, x) ) ); } /*-------------------------------------------------------------------------- * HYPRE_AMSSetDimension *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_amssetdimension, HYPRE_AMSSETDIMENSION) ( hypre_F90_Obj *solver, hypre_F90_Int *dim, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) ( HYPRE_AMSSetDimension( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassInt (dim) ) ); } /*-------------------------------------------------------------------------- * HYPRE_AMSSetDiscreteGradient *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_amssetdiscretegradient, HYPRE_AMSSETDISCRETEGRADIENT) ( hypre_F90_Obj *solver, hypre_F90_Obj *G, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) ( HYPRE_AMSSetDiscreteGradient( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassObj (HYPRE_ParCSRMatrix, G) ) ); } /*-------------------------------------------------------------------------- * HYPRE_AMSSetCoordinateVectors *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_amssetcoordinatevectors, HYPRE_AMSSETCOORDINATEVECTORS) ( hypre_F90_Obj *solver, hypre_F90_Obj *x, hypre_F90_Obj *y, hypre_F90_Obj *z, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) ( HYPRE_AMSSetCoordinateVectors( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassObj (HYPRE_ParVector, x), hypre_F90_PassObj (HYPRE_ParVector, y), hypre_F90_PassObj (HYPRE_ParVector, z) ) ); } /*-------------------------------------------------------------------------- * HYPRE_AMSSetEdgeConstantVectors *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_amssetedgeconstantvectors, HYPRE_AMSSETEDGECONSTANTVECTORS) ( hypre_F90_Obj *solver, hypre_F90_Obj *Gx, hypre_F90_Obj *Gy, hypre_F90_Obj *Gz, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) ( HYPRE_AMSSetEdgeConstantVectors( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassObj (HYPRE_ParVector, Gx), hypre_F90_PassObj (HYPRE_ParVector, Gy), hypre_F90_PassObj (HYPRE_ParVector, Gz) ) ); } /*-------------------------------------------------------------------------- * HYPRE_AMSSetAlphaPoissonMatrix *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_amssetalphapoissonmatrix, HYPRE_AMSSETALPHAPOISSONMATRIX) ( hypre_F90_Obj *solver, hypre_F90_Obj *A_alpha, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) ( HYPRE_AMSSetAlphaPoissonMatrix( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassObj (HYPRE_ParCSRMatrix, A_alpha) ) ); } /*-------------------------------------------------------------------------- * HYPRE_AMSSetBetaPoissonMatrix *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_amssetbetapoissonmatrix, HYPRE_AMSSETBETAPOISSONMATRIX) ( hypre_F90_Obj *solver, hypre_F90_Obj *A_beta, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) ( HYPRE_AMSSetBetaPoissonMatrix( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassObj (HYPRE_ParCSRMatrix, A_beta) ) ); } /*-------------------------------------------------------------------------- * HYPRE_AMSSetMaxIter *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_amssetmaxiter, HYPRE_AMSSETMAXITER) ( hypre_F90_Obj *solver, hypre_F90_Int *maxiter, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) ( HYPRE_AMSSetMaxIter( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassInt (maxiter) ) ); } /*-------------------------------------------------------------------------- * HYPRE_AMSSetTol *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_amssettol, HYPRE_AMSSETTOL) ( hypre_F90_Obj *solver, hypre_F90_Real *tol, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) ( HYPRE_AMSSetTol( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassReal (tol) ) ); } /*-------------------------------------------------------------------------- * HYPRE_AMSSetCycleType *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_amssetcycletype, HYPRE_AMSSETCYCLETYPE) ( hypre_F90_Obj *solver, hypre_F90_Int *cycle_type, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) ( HYPRE_AMSSetCycleType( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassInt (cycle_type) ) ); } /*-------------------------------------------------------------------------- * HYPRE_AMSSetPrintLevel *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_amssetprintlevel, HYPRE_AMSSETPRINTLEVEL) ( hypre_F90_Obj *solver, hypre_F90_Int *print_level, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) ( HYPRE_AMSSetPrintLevel( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassInt (print_level) ) ); } /*-------------------------------------------------------------------------- * HYPRE_AMSSetSmoothingOptions *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_amssetsmoothingoptions, HYPRE_AMSSETSMOOTHINGOPTIONS) ( hypre_F90_Obj *solver, hypre_F90_Int *relax_type, hypre_F90_Int *relax_times, hypre_F90_Real *relax_weight, hypre_F90_Real *omega, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) ( HYPRE_AMSSetSmoothingOptions( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassInt (relax_type), hypre_F90_PassInt (relax_times), hypre_F90_PassReal (relax_weight), hypre_F90_PassReal (omega) ) ); } /*-------------------------------------------------------------------------- * HYPRE_AMSSetAlphaAMGOptions *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_amssetalphaamgoptions, HYPRE_AMSSETALPHAAMGOPTIONS) ( hypre_F90_Obj *solver, hypre_F90_Int *alpha_coarsen_type, hypre_F90_Int *alpha_agg_levels, hypre_F90_Int *alpha_relax_type, hypre_F90_Real *alpha_strength_threshold, hypre_F90_Int *alpha_interp_type, hypre_F90_Int *alpha_Pmax, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) ( HYPRE_AMSSetAlphaAMGOptions( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassInt (alpha_coarsen_type), hypre_F90_PassInt (alpha_agg_levels), hypre_F90_PassInt (alpha_relax_type), hypre_F90_PassReal (alpha_strength_threshold), hypre_F90_PassInt (alpha_interp_type), hypre_F90_PassInt (alpha_Pmax) ) ); } /*-------------------------------------------------------------------------- * HYPRE_AMSSetBetaAMGOptions *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_amssetbetaamgoptions, HYPRE_AMSSETBETAAMGOPTIONS) ( hypre_F90_Obj *solver, hypre_F90_Int *beta_coarsen_type, hypre_F90_Int *beta_agg_levels, hypre_F90_Int *beta_relax_type, hypre_F90_Real *beta_strength_threshold, hypre_F90_Int *beta_interp_type, hypre_F90_Int *beta_Pmax, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) ( HYPRE_AMSSetBetaAMGOptions( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassInt (beta_coarsen_type), hypre_F90_PassInt (beta_agg_levels), hypre_F90_PassInt (beta_relax_type), hypre_F90_PassReal (beta_strength_threshold), hypre_F90_PassInt (beta_interp_type), hypre_F90_PassInt (beta_Pmax) ) ); } /*-------------------------------------------------------------------------- * HYPRE_AMSGetNumIterations *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_amsgetnumiterations, HYPRE_AMSGETNUMITERATIONS) ( hypre_F90_Obj *solver, hypre_F90_Int *num_iterations, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) ( HYPRE_AMSGetNumIterations( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassIntRef (num_iterations) ) ); } /*-------------------------------------------------------------------------- * HYPRE_AMSGetFinalRelativeResidualNorm *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_amsgetfinalrelativeresidualnorm, HYPRE_AMSGETFINALRELATIVERESIDUALNORM) ( hypre_F90_Obj *solver, hypre_F90_Real *rel_resid_norm, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) ( HYPRE_AMSGetFinalRelativeResidualNorm( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassRealRef (rel_resid_norm) ) ); } /*-------------------------------------------------------------------------- * HYPRE_AMSConstructDiscreteGradient *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_amsconstructdiscretegradient, HYPRE_AMSCONSTRUCTDISCRETEGRADIENT) ( hypre_F90_Obj *A, hypre_F90_Obj *x_coord, hypre_F90_BigIntArray *edge_vertex, hypre_F90_Int *edge_orientation, hypre_F90_Obj *G, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) ( HYPRE_AMSConstructDiscreteGradient( hypre_F90_PassObj (HYPRE_ParCSRMatrix, A), hypre_F90_PassObj (HYPRE_ParVector, x_coord), hypre_F90_PassBigIntArray (edge_vertex), hypre_F90_PassInt (edge_orientation), hypre_F90_PassObjRef (HYPRE_ParCSRMatrix, G) ) ); } #ifdef __cplusplus } #endif hypre-2.33.0/src/parcsr_ls/F90_HYPRE_parcsr_Euclid.c000066400000000000000000000160441477326011500220300ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * HYPRE_Euclid Fortran interface * *****************************************************************************/ #include "_hypre_parcsr_ls.h" #include "fortran.h" #ifdef __cplusplus extern "C" { #endif /*-------------------------------------------------------------------------- * HYPRE_EuclidCreate - Return a Euclid "solver". *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_euclidcreate, HYPRE_EUCLIDCREATE) (hypre_F90_Comm *comm, hypre_F90_Obj *solver, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) HYPRE_EuclidCreate( hypre_F90_PassComm (comm), hypre_F90_PassObjRef (HYPRE_Solver, solver) ); } /*-------------------------------------------------------------------------- * HYPRE_EuclidDestroy - Destroy a Euclid object. *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_eucliddestroy, HYPRE_EUCLIDDESTROY) (hypre_F90_Obj *solver, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) HYPRE_EuclidDestroy( hypre_F90_PassObj (HYPRE_Solver, solver) ); } /*-------------------------------------------------------------------------- * HYPRE_EuclidSetup - Set up function for Euclid. *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_euclidsetup, HYPRE_EUCLIDSETUP) (hypre_F90_Obj *solver, hypre_F90_Obj *A, hypre_F90_Obj *b, hypre_F90_Obj *x, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) HYPRE_EuclidSetup( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassObj (HYPRE_ParCSRMatrix, A), hypre_F90_PassObj (HYPRE_ParVector, b), hypre_F90_PassObj (HYPRE_ParVector, x) ); } /*-------------------------------------------------------------------------- * HYPRE_EuclidSolve - Solve function for Euclid. *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_euclidsolve, HYPRE_EUCLIDSOLVE) (hypre_F90_Obj *solver, hypre_F90_Obj *A, hypre_F90_Obj *b, hypre_F90_Obj *x, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) HYPRE_EuclidSolve( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassObj (HYPRE_ParCSRMatrix, A), hypre_F90_PassObj (HYPRE_ParVector, b), hypre_F90_PassObj (HYPRE_ParVector, x) ); } /*-------------------------------------------------------------------------- * HYPRE_EuclidSetParams *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_euclidsetparams, HYPRE_EUCLIDSETPARAMS) (hypre_F90_Obj *solver, hypre_F90_Int *argc, char **argv, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) HYPRE_EuclidSetParams( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassInt (argc), (char **) argv ); } /*-------------------------------------------------------------------------- * HYPRE_EuclidSetParamsFromFile *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_euclidsetparamsfromfile, HYPRE_EUCLIDSETPARAMSFROMFILE) (hypre_F90_Obj *solver, char *filename, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) HYPRE_EuclidSetParamsFromFile( hypre_F90_PassObj (HYPRE_Solver, solver), (char *) filename ); } /*-------------------------------------------------------------------------- * HYPRE_EuclidSetLevel *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_euclidsetlevel, HYPRE_EUCLIDSETLEVEL) (hypre_F90_Obj *solver, hypre_F90_Int *eu_level, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) HYPRE_EuclidSetLevel( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassInt (eu_level) ); } /*-------------------------------------------------------------------------- * HYPRE_EuclidSetBJ *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_euclidsetbj, HYPRE_EUCLIDSETBJ) (hypre_F90_Obj *solver, hypre_F90_Int *bj, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) HYPRE_EuclidSetBJ( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassInt (bj) ); } /*-------------------------------------------------------------------------- * HYPRE_EuclidSetStats *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_euclidsetstats, HYPRE_EUCLIDSETSTATS) (hypre_F90_Obj *solver, hypre_F90_Int *eu_stats, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) HYPRE_EuclidSetStats( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassInt (eu_stats) ); } /*-------------------------------------------------------------------------- * HYPRE_EuclidSetMem *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_euclidsetmem, HYPRE_EUCLIDSETMEM) (hypre_F90_Obj *solver, hypre_F90_Int *eu_mem, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) HYPRE_EuclidSetMem( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassInt (eu_mem) ); } /*-------------------------------------------------------------------------- * HYPRE_EuclidSetSparseA *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_euclidsetsparsea, HYPRE_EUCLIDSETSPARSEA) (hypre_F90_Obj *solver, hypre_F90_Real *spa, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) HYPRE_EuclidSetSparseA( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassReal (spa) ); } /*-------------------------------------------------------------------------- * HYPRE_EuclidSetRowScale *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_euclidsetrowscale, HYPRE_EUCLIDSETROWSCALE) (hypre_F90_Obj *solver, hypre_F90_Int *row_scale, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) HYPRE_EuclidSetRowScale( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassInt (row_scale) ); } /*-------------------------------------------------------------------------- * HYPRE_EuclidSetILUT * *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_euclidsetilut, HYPRE_EUCLIDSETILUT) (hypre_F90_Obj *solver, hypre_F90_Real *drop_tol, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) HYPRE_EuclidSetILUT( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassReal (drop_tol) ); } #ifdef __cplusplus } #endif hypre-2.33.0/src/parcsr_ls/F90_HYPRE_parcsr_ParaSails.c000066400000000000000000000226141477326011500225020ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * HYPRE_ParaSails Fortran interface * *****************************************************************************/ #include "_hypre_parcsr_ls.h" #include "fortran.h" #ifdef __cplusplus extern "C" { #endif /*-------------------------------------------------------------------------- * HYPRE_ParaSailsCreate *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_parasailscreate, HYPRE_PARASAILSCREATE) ( hypre_F90_Comm *comm, hypre_F90_Obj *solver, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_ParaSailsCreate( hypre_F90_PassComm (comm), hypre_F90_PassObjRef (HYPRE_Solver, solver) ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParaSailsDestroy *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_parasailsdestroy, HYPRE_PARASAILSDESTROY) ( hypre_F90_Obj *solver, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_ParaSailsDestroy( hypre_F90_PassObj (HYPRE_Solver, solver) ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParaSailsSetup *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_parasailssetup, HYPRE_PARASAILSSETUP) ( hypre_F90_Obj *solver, hypre_F90_Obj *A, hypre_F90_Obj *b, hypre_F90_Obj *x, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_ParaSailsSetup( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassObj (HYPRE_ParCSRMatrix, A), hypre_F90_PassObj (HYPRE_ParVector, b), hypre_F90_PassObj (HYPRE_ParVector, x) ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParaSailsSolve *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_parasailssolve, HYPRE_PARASAILSSOLVE) ( hypre_F90_Obj *solver, hypre_F90_Obj *A, hypre_F90_Obj *b, hypre_F90_Obj *x, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_ParaSailsSolve( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassObj (HYPRE_ParCSRMatrix, A), hypre_F90_PassObj (HYPRE_ParVector, b), hypre_F90_PassObj (HYPRE_ParVector, x) ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParaSailsSetParams *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_parasailssetparams, HYPRE_PARASAILSSETPARAMS) ( hypre_F90_Obj *solver, hypre_F90_Real *thresh, hypre_F90_Int *nlevels, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_ParaSailsSetParams( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassReal (thresh), hypre_F90_PassInt (nlevels) ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParaSailsSetThresh, HYPRE_ParaSailsGetThresh *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_parasailssetthresh, HYPRE_PARASAILSSETTHRESH) ( hypre_F90_Obj *solver, hypre_F90_Real *thresh, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_ParaSailsSetThresh( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassReal (thresh) ) ); } void hypre_F90_IFACE(hypre_parasailsgetthresh, HYPRE_PARASAILSGETTHRESH) ( hypre_F90_Obj *solver, hypre_F90_Real *thresh, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_ParaSailsGetThresh( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassRealRef (thresh) ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParaSailsSetNlevels, HYPRE_ParaSailsGetNlevels *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_parasailssetnlevels, HYPRE_PARASAILSSETNLEVELS) ( hypre_F90_Obj *solver, hypre_F90_Int *nlevels, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_ParaSailsSetNlevels( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassInt (nlevels)) ); } void hypre_F90_IFACE(hypre_parasailsgetnlevels, HYPRE_PARASAILSGETNLEVELS) ( hypre_F90_Obj *solver, hypre_F90_Int *nlevels, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_ParaSailsGetNlevels( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassIntRef (nlevels)) ); } /*-------------------------------------------------------------------------- * HYPRE_ParaSailsSetFilter, HYPRE_ParaSailsGetFilter *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_parasailssetfilter, HYPRE_PARASAILSSETFILTER) ( hypre_F90_Obj *solver, hypre_F90_Real *filter, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_ParaSailsSetFilter( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassReal (filter) ) ); } void hypre_F90_IFACE(hypre_parasailsgetfilter, HYPRE_PARASAILSGETFILTER) ( hypre_F90_Obj *solver, hypre_F90_Real *filter, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_ParaSailsGetFilter( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassRealRef (filter) ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParaSailsSetSym, HYPRE_ParaSailsGetSym *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_parasailssetsym, HYPRE_PARASAILSSETSYM) ( hypre_F90_Obj *solver, hypre_F90_Int *sym, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_ParaSailsSetSym( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassInt (sym) ) ); } void hypre_F90_IFACE(hypre_parasailsgetsym, HYPRE_PARASAILSGETSYM) ( hypre_F90_Obj *solver, hypre_F90_Int *sym, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_ParaSailsGetSym( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassIntRef (sym) ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParaSailsSetLoadbal, HYPRE_ParaSailsGetLoadbal *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_parasailssetloadbal, HYPRE_PARASAILSSETLOADBAL) ( hypre_F90_Obj *solver, hypre_F90_Real *loadbal, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_ParaSailsSetLoadbal( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassReal (loadbal) ) ); } void hypre_F90_IFACE(hypre_parasailsgetloadbal, HYPRE_PARASAILSGETLOADBAL) ( hypre_F90_Obj *solver, hypre_F90_Real *loadbal, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_ParaSailsGetLoadbal( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassRealRef (loadbal) ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParaSailsSetReuse, HYPRE_ParaSailsGetReuse *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_parasailssetreuse, HYPRE_PARASAILSSETREUSE) ( hypre_F90_Obj *solver, hypre_F90_Int *reuse, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_ParaSailsSetReuse( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassInt (reuse) ) ); } void hypre_F90_IFACE(hypre_parasailsgetreuse, HYPRE_PARASAILSGETREUSE) ( hypre_F90_Obj *solver, hypre_F90_Int *reuse, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_ParaSailsGetReuse( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassIntRef (reuse) ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParaSailsSetLogging, HYPRE_ParaSailsGetLogging *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_parasailssetlogging, HYPRE_PARASAILSSETLOGGING) ( hypre_F90_Obj *solver, hypre_F90_Int *logging, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_ParaSailsSetLogging( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassInt (logging) ) ); } void hypre_F90_IFACE(hypre_parasailsgetlogging, HYPRE_PARASAILSGETLOGGING) ( hypre_F90_Obj *solver, hypre_F90_Int *logging, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_ParaSailsGetLogging( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassIntRef (logging) ) ); } #ifdef __cplusplus } #endif hypre-2.33.0/src/parcsr_ls/F90_HYPRE_parcsr_amg.c000066400000000000000000002120721477326011500213660ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * HYPRE_ParAMG Fortran interface * *****************************************************************************/ #include "_hypre_parcsr_ls.h" #include "fortran.h" #ifdef __cplusplus extern "C" { #endif /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGCreate *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_boomeramgcreate, HYPRE_BOOMERAMGCREATE) ( hypre_F90_Obj *solver, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_BoomerAMGCreate( hypre_F90_PassObjRef (HYPRE_Solver, solver)) ); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGDestroy *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_boomeramgdestroy, HYPRE_BOOMERAMGDESTROY) ( hypre_F90_Obj *solver, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_BoomerAMGDestroy( hypre_F90_PassObj (HYPRE_Solver, solver) ) ); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGSetup *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_boomeramgsetup, HYPRE_BOOMERAMGSETUP) ( hypre_F90_Obj *solver, hypre_F90_Obj *A, hypre_F90_Obj *b, hypre_F90_Obj *x, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_BoomerAMGSetup( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassObj (HYPRE_ParCSRMatrix, A), hypre_F90_PassObj (HYPRE_ParVector, b), hypre_F90_PassObj (HYPRE_ParVector, x) ) ); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGSolve *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_boomeramgsolve, HYPRE_BOOMERAMGSOLVE) ( hypre_F90_Obj *solver, hypre_F90_Obj *A, hypre_F90_Obj *b, hypre_F90_Obj *x, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_BoomerAMGSolve( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassObj (HYPRE_ParCSRMatrix, A), hypre_F90_PassObj (HYPRE_ParVector, b), hypre_F90_PassObj (HYPRE_ParVector, x) ) ); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGSolveT *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_boomeramgsolvet, HYPRE_BOOMERAMGSOLVET) ( hypre_F90_Obj *solver, hypre_F90_Obj *A, hypre_F90_Obj *b, hypre_F90_Obj *x, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_BoomerAMGSolveT( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassObj (HYPRE_ParCSRMatrix, A), hypre_F90_PassObj (HYPRE_ParVector, b), hypre_F90_PassObj (HYPRE_ParVector, x) ) ); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGSetRestriction *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_boomeramgsetrestriction, HYPRE_BOOMERAMGSETRESTRICTION) ( hypre_F90_Obj *solver, hypre_F90_Int *restr_par, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_BoomerAMGSetRestriction( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassInt (restr_par) ) ); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGSetMaxLevels, HYPRE_BoomerAMGGetMaxLevels *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_boomeramgsetmaxlevels, HYPRE_BOOMERAMGSETMAXLEVELS) ( hypre_F90_Obj *solver, hypre_F90_Int *max_levels, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_BoomerAMGSetMaxLevels( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassInt (max_levels) ) ); } void hypre_F90_IFACE(hypre_boomeramggetmaxlevels, HYPRE_BOOMERAMGGETMAXLEVELS) ( hypre_F90_Obj *solver, hypre_F90_Int *max_levels, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_BoomerAMGGetMaxLevels( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassIntRef (max_levels) ) ); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGSetMaxCoarseSize, HYPRE_BoomerAMGGetMaxCoarseSize *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_boomeramgsetmaxcoarsesize, HYPRE_BOOMERAMGSETMAXCOARSESIZE) ( hypre_F90_Obj *solver, hypre_F90_Int *max_coarse_size, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_BoomerAMGSetMaxCoarseSize( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassInt (max_coarse_size) ) ); } void hypre_F90_IFACE(hypre_boomeramggetmaxcoarsesize, HYPRE_BOOMERAMGGETMAXCOARSESIZE) ( hypre_F90_Obj *solver, hypre_F90_Int *max_coarse_size, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_BoomerAMGGetMaxCoarseSize( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassIntRef (max_coarse_size) ) ); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGSetMinCoarseSize, HYPRE_BoomerAMGGetMinCoarseSize *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_boomeramgsetmincoarsesize, HYPRE_BOOMERAMGSETMINCOARSESIZE) ( hypre_F90_Obj *solver, hypre_F90_Int *min_coarse_size, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_BoomerAMGSetMinCoarseSize( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassInt (min_coarse_size) ) ); } void hypre_F90_IFACE(hypre_boomeramggetmincoarsesize, HYPRE_BOOMERAMGGETMINCOARSESIZE) ( hypre_F90_Obj *solver, hypre_F90_Int *min_coarse_size, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_BoomerAMGGetMinCoarseSize( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassIntRef (min_coarse_size) ) ); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGSetStrongThreshold, HYPRE_BoomerAMGGetStrongThreshold *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_boomeramgsetstrongthrshld, HYPRE_BOOMERAMGSETSTRONGTHRSHLD) ( hypre_F90_Obj *solver, hypre_F90_Real *strong_threshold, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_BoomerAMGSetStrongThreshold( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassReal (strong_threshold) ) ); } void hypre_F90_IFACE(hypre_boomeramggetstrongthrshld, HYPRE_BOOMERAMGGETSTRONGTHRSHLD) ( hypre_F90_Obj *solver, hypre_F90_Real *strong_threshold, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_BoomerAMGGetStrongThreshold( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassRealRef (strong_threshold) ) ); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGSetMaxRowSum, HYPRE_BoomerAMGGetMaxRowSum *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_boomeramgsetmaxrowsum, HYPRE_BOOMERAMGSETMAXROWSUM) ( hypre_F90_Obj *solver, hypre_F90_Real *max_row_sum, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_BoomerAMGSetMaxRowSum( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassReal (max_row_sum) ) ); } void hypre_F90_IFACE(hypre_boomeramggetmaxrowsum, HYPRE_BOOMERAMGGETMAXROWSUM) ( hypre_F90_Obj *solver, hypre_F90_Real *max_row_sum, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_BoomerAMGGetMaxRowSum( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassRealRef (max_row_sum) ) ); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGSetTruncFactor, HYPRE_BoomerAMGGetTruncFactor *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_boomeramgsettruncfactor, HYPRE_BOOMERAMGSETTRUNCFACTOR) ( hypre_F90_Obj *solver, hypre_F90_Real *trunc_factor, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_BoomerAMGSetTruncFactor( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassReal (trunc_factor) ) ); } void hypre_F90_IFACE(hypre_boomeramggettruncfactor, HYPRE_BOOMERAMGGETTRUNCFACTOR) ( hypre_F90_Obj *solver, hypre_F90_Real *trunc_factor, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_BoomerAMGGetTruncFactor( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassRealRef (trunc_factor) ) ); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGSetPMaxElmts *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_boomeramgsetpmaxelmts, HYPRE_BOOMERAMGSETPMAXELMTS) ( hypre_F90_Obj *solver, hypre_F90_Int *p_max_elmts, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_BoomerAMGSetPMaxElmts( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassInt (p_max_elmts) ) ); } void hypre_F90_IFACE(hypre_boomeramggetpmaxelmts, HYPRE_BOOMERAMGGETPMAXELMTS) ( hypre_F90_Obj *solver, hypre_F90_Int *p_max_elmts, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_BoomerAMGGetPMaxElmts( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassIntRef (p_max_elmts) ) ); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGSetJacobiTruncThreshold, HYPRE_BoomerAMGGetJacobiTruncThreshold *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_boomeramgsetjacobitrunc, HYPRE_BOOMERAMGSETJACOBITRUNC) ( hypre_F90_Obj *solver, hypre_F90_Real *trunc_factor, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_BoomerAMGSetJacobiTruncThreshold( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassReal (trunc_factor) ) ); } void hypre_F90_IFACE(hypre_boomeramggetjacobitrunc, HYPRE_BOOMERAMGGETJACOBITRUNC) ( hypre_F90_Obj *solver, hypre_F90_Real *trunc_factor, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_BoomerAMGGetJacobiTruncThreshold( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassRealRef (trunc_factor) ) ); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGSetPostInterpType, HYPRE_BoomerAMGGetPostInterpType * If >0, specifies something to do to improve a computed interpolation matrix. * defaults to 0, for nothing. *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_boomeramgsetpostinterp, HYPRE_BOOMERAMGSETPOSTINTERP) ( hypre_F90_Obj *solver, hypre_F90_Int *type, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_BoomerAMGSetPostInterpType( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassInt (type) ) ); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGSetInterpType *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_boomeramgsetinterptype, HYPRE_BOOMERAMGSETINTERPTYPE) ( hypre_F90_Obj *solver, hypre_F90_Int *interp_type, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_BoomerAMGSetInterpType( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassInt (interp_type) ) ); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGSetSepWeight *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_boomeramgsetsepweight, HYPRE_BOOMERAMGSETSEPWEIGHT) ( hypre_F90_Obj *solver, hypre_F90_Int *sep_weight, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_BoomerAMGSetSepWeight( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassInt (sep_weight) ) ); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGSetMinIter *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_boomeramgsetminiter, HYPRE_BOOMERAMGSETMINITER) ( hypre_F90_Obj *solver, hypre_F90_Int *min_iter, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_BoomerAMGSetMinIter( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassInt (min_iter) ) ); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGSetMaxIter, HYPRE_BoomerAMGGetMaxIter *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_boomeramgsetmaxiter, HYPRE_BOOMERAMGSETMAXITER) ( hypre_F90_Obj *solver, hypre_F90_Int *max_iter, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_BoomerAMGSetMaxIter( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassInt (max_iter) ) ); } void hypre_F90_IFACE(hypre_boomeramggetmaxiter, HYPRE_BOOMERAMGGETMAXITER) ( hypre_F90_Obj *solver, hypre_F90_Int *max_iter, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_BoomerAMGGetMaxIter( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassIntRef (max_iter) ) ); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGSetCoarsenType, HYPRE_BoomerAMGGetCoarsenType *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_boomeramgsetcoarsentype, HYPRE_BOOMERAMGSETCOARSENTYPE) ( hypre_F90_Obj *solver, hypre_F90_Int *coarsen_type, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_BoomerAMGSetCoarsenType( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassInt (coarsen_type) ) ); } void hypre_F90_IFACE(hypre_boomeramggetcoarsentype, HYPRE_BOOMERAMGGETCOARSENTYPE) ( hypre_F90_Obj *solver, hypre_F90_Int *coarsen_type, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_BoomerAMGGetCoarsenType( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassIntRef (coarsen_type) ) ); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGSetMeasureType, HYPRE_BoomerAMGGetMeasureType *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_boomeramgsetmeasuretype, HYPRE_BOOMERAMGSETMEASURETYPE) ( hypre_F90_Obj *solver, hypre_F90_Int *measure_type, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_BoomerAMGSetMeasureType( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassInt (measure_type) ) ); } void hypre_F90_IFACE(hypre_boomeramggetmeasuretype, HYPRE_BOOMERAMGGETMEASURETYPE) ( hypre_F90_Obj *solver, hypre_F90_Int *measure_type, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_BoomerAMGGetMeasureType( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassIntRef (measure_type) ) ); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGSetOldDefault *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_boomeramgsetolddefault, HYPRE_BOOMERAMGSETOLDDEFAULT) ( hypre_F90_Obj *solver, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_BoomerAMGSetOldDefault( hypre_F90_PassObj (HYPRE_Solver, solver) ) ); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGSetSetupType *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_boomeramgsetsetuptype, HYPRE_BOOMERAMGSETSETUPTYPE) ( hypre_F90_Obj *solver, hypre_F90_Int *setup_type, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_BoomerAMGSetSetupType( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassInt (setup_type) ) ); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGSetCycleType, HYPRE_BoomerAMGGetCycleType *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_boomeramgsetcycletype, HYPRE_BOOMERAMGSETCYCLETYPE) ( hypre_F90_Obj *solver, hypre_F90_Int *cycle_type, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_BoomerAMGSetCycleType( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassInt (cycle_type) ) ); } void hypre_F90_IFACE(hypre_boomeramggetcycletype, HYPRE_BOOMERAMGGETCYCLETYPE) ( hypre_F90_Obj *solver, hypre_F90_Int *cycle_type, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_BoomerAMGGetCycleType( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassIntRef (cycle_type) ) ); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGSetTol, HYPRE_BoomerAMGGetTol *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_boomeramgsettol, HYPRE_BOOMERAMGSETTOL) ( hypre_F90_Obj *solver, hypre_F90_Real *tol, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_BoomerAMGSetTol( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassReal (tol) ) ); } void hypre_F90_IFACE(hypre_boomeramggettol, HYPRE_BOOMERAMGGETTOL) ( hypre_F90_Obj *solver, hypre_F90_Real *tol, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_BoomerAMGGetTol( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassRealRef (tol) ) ); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGSetNumSweeps * DEPRECATED. Use SetNumSweeps and SetCycleNumSweeps instead. *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_boomeramgsetnumgridsweeps, HYPRE_BOOMERAMGSETNUMGRIDSWEEPS) ( hypre_F90_Obj *solver, hypre_F90_Int *num_grid_sweeps, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_BoomerAMGSetNumGridSweeps( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassIntRef (num_grid_sweeps) ) ); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGSetNumSweeps *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_boomeramgsetnumsweeps, HYPRE_BOOMERAMGSETNUMSWEEPS) ( hypre_F90_Obj *solver, hypre_F90_Int *num_sweeps, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_BoomerAMGSetNumSweeps( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassInt (num_sweeps) ) ); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGSetCycleNumSweeps, HYPRE_BoomerAMGGetCycleNumSweeps *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_boomeramgsetcyclenumsweeps, HYPRE_BOOMERAMGSETCYCLENUMSWEEPS) ( hypre_F90_Obj *solver, hypre_F90_Int *num_sweeps, hypre_F90_Int *k, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_BoomerAMGSetCycleNumSweeps( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassInt (num_sweeps), hypre_F90_PassInt (k) ) ); } void hypre_F90_IFACE(hypre_boomeramggetcyclenumsweeps, HYPRE_BOOMERAMGGETCYCLENUMSWEEPS) ( hypre_F90_Obj *solver, hypre_F90_Int *num_sweeps, hypre_F90_Int *k, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_BoomerAMGGetCycleNumSweeps( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassIntRef (num_sweeps), hypre_F90_PassInt (k) ) ); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGInitGridRelaxation * * RDF: This is probably not a very useful Fortran routine because you can't do * anything with the pointers to arrays that are allocated. *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_boomeramginitgridrelaxatn, HYPRE_BOOMERAMGINITGRIDRELAXATN) ( hypre_F90_Obj *num_grid_sweeps, hypre_F90_Obj *grid_relax_type, hypre_F90_Obj *grid_relax_points, hypre_F90_Int *coarsen_type, hypre_F90_Obj *relax_weights, hypre_F90_Int *max_levels, hypre_F90_Int *ierr ) { *num_grid_sweeps = (hypre_F90_Obj) hypre_CTAlloc(HYPRE_Int*, 1, HYPRE_MEMORY_HOST); *grid_relax_type = (hypre_F90_Obj) hypre_CTAlloc(HYPRE_Int*, 1, HYPRE_MEMORY_HOST); *grid_relax_points = (hypre_F90_Obj) hypre_CTAlloc(HYPRE_Int**, 1, HYPRE_MEMORY_HOST); *relax_weights = (hypre_F90_Obj) hypre_CTAlloc(HYPRE_Real*, 1, HYPRE_MEMORY_HOST); *ierr = (hypre_F90_Int) ( HYPRE_BoomerAMGInitGridRelaxation( (HYPRE_Int **) *num_grid_sweeps, (HYPRE_Int **) *grid_relax_type, (HYPRE_Int ***) *grid_relax_points, hypre_F90_PassInt (coarsen_type), (HYPRE_Real **) *relax_weights, hypre_F90_PassInt (max_levels) ) ); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGFinalizeGridRelaxation * * RDF: This is probably not a very useful Fortran routine because you can't do * anything with the pointers to arrays. *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_boomeramgfingridrelaxatn, HYPRE_BOOMERAMGFINGRIDRELAXATN) ( hypre_F90_Obj *num_grid_sweeps, hypre_F90_Obj *grid_relax_type, hypre_F90_Obj *grid_relax_points, hypre_F90_Obj *relax_weights, hypre_F90_Int *ierr ) { char *ptr_num_grid_sweeps = (char *) *num_grid_sweeps; char *ptr_grid_relax_type = (char *) *grid_relax_type; char *ptr_grid_relax_points = (char *) *grid_relax_points; char *ptr_relax_weights = (char *) *relax_weights; hypre_TFree(ptr_num_grid_sweeps, HYPRE_MEMORY_HOST); hypre_TFree(ptr_grid_relax_type, HYPRE_MEMORY_HOST); hypre_TFree(ptr_grid_relax_points, HYPRE_MEMORY_HOST); hypre_TFree(ptr_relax_weights, HYPRE_MEMORY_HOST); *ierr = 0; } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGSetGridRelaxType * DEPRECATED. Use SetRelaxType and SetCycleRelaxType instead. *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_boomeramgsetgridrelaxtype, HYPRE_BOOMERAMGSETGRIDRELAXTYPE) ( hypre_F90_Obj *solver, hypre_F90_IntArray *grid_relax_type, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_BoomerAMGSetGridRelaxType( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassIntArray (grid_relax_type) ) ); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGSetRelaxType *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_boomeramgsetrelaxtype, HYPRE_BOOMERAMGSETRELAXTYPE) ( hypre_F90_Obj *solver, hypre_F90_Int *relax_type, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_BoomerAMGSetRelaxType( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassInt (relax_type) ) ); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGSetCycleRelaxType, HYPRE_BoomerAMGGetCycleRelaxType *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_boomeramgsetcyclerelaxtype, HYPRE_BOOMERAMGSETCYCLERELAXTYPE) ( hypre_F90_Obj *solver, hypre_F90_Int *relax_type, hypre_F90_Int *k, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_BoomerAMGSetCycleRelaxType( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassInt (relax_type), hypre_F90_PassInt (k) ) ); } void hypre_F90_IFACE(hypre_boomeramggetcyclerelaxtype, HYPRE_BOOMERAMGGETCYCLERELAXTYPE) ( hypre_F90_Obj *solver, hypre_F90_Int *relax_type, hypre_F90_Int *k, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_BoomerAMGGetCycleRelaxType( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassIntRef (relax_type), hypre_F90_PassInt (k) ) ); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGSetRelaxOrder *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_boomeramgsetrelaxorder, HYPRE_BOOMERAMGSETRELAXORDER) ( hypre_F90_Obj *solver, hypre_F90_Int *relax_order, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_BoomerAMGSetRelaxOrder( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassInt (relax_order) ) ); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGSetGridRelaxPoints * DEPRECATED. There is no alternative function. *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_boomeramgsetgridrelaxpnts, HYPRE_BOOMERAMGSETGRIDRELAXPNTS) ( hypre_F90_Obj *solver, HYPRE_Int **grid_relax_points, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_BoomerAMGSetGridRelaxPoints( hypre_F90_PassObj (HYPRE_Solver, solver), (HYPRE_Int **) grid_relax_points ) ); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGSetRelaxWeight * DEPRECATED. Use SetRelaxWt and SetLevelRelaxWt instead. *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_boomeramgsetrelaxweight, HYPRE_BOOMERAMGSETRELAXWEIGHT) ( hypre_F90_Obj *solver, hypre_F90_IntArray *relax_weights, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_BoomerAMGSetRelaxWeight( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassRealArray (relax_weights) ) ); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGSetRelaxWt *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_boomeramgsetrelaxwt, HYPRE_BOOMERAMGSETRELAXWT) ( hypre_F90_Obj *solver, hypre_F90_Real *relax_weight, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_BoomerAMGSetRelaxWt( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassReal (relax_weight) ) ); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGSetLevelRelaxWt *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_boomeramgsetlevelrelaxwt, HYPRE_BOOMERAMGSETLEVELRELAXWT) ( hypre_F90_Obj *solver, hypre_F90_Real *relax_weight, hypre_F90_Int *level, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_BoomerAMGSetLevelRelaxWt( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassReal (relax_weight), hypre_F90_PassInt (level) ) ); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGSetOuterWt *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_boomeramgsetouterwt, HYPRE_BOOMERAMGSETOUTERWT) ( hypre_F90_Obj *solver, hypre_F90_Real *outer_wt, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_BoomerAMGSetOuterWt( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassReal (outer_wt) ) ); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGSetLevelOuterWt *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_boomeramgsetlevelouterwt, HYPRE_BOOMERAMGSETLEVELOUTERWT) ( hypre_F90_Obj *solver, hypre_F90_Real *outer_wt, hypre_F90_Int *level, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_BoomerAMGSetLevelOuterWt( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassReal (outer_wt), hypre_F90_PassInt (level) ) ); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGSetSmoothType, HYPRE_BoomerAMGGetSmoothType *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_boomeramgsetsmoothtype, HYPRE_BOOMERAMGSETSMOOTHTYPE) ( hypre_F90_Obj *solver, hypre_F90_Int *smooth_type, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_BoomerAMGSetSmoothType( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassInt (smooth_type) ) ); } void hypre_F90_IFACE(hypre_boomeramggetsmoothtype, HYPRE_BOOMERAMGGETSMOOTHTYPE) ( hypre_F90_Obj *solver, hypre_F90_Int *smooth_type, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_BoomerAMGGetSmoothType( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassIntRef (smooth_type) ) ); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGSetSmoothNumLvls, HYPRE_BoomerAMGGetSmoothNumLvls *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_boomeramgsetsmoothnumlvls, HYPRE_BOOMERAMGSETSMOOTHNUMLVLS) ( hypre_F90_Obj *solver, hypre_F90_Int *smooth_num_levels, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_BoomerAMGSetSmoothNumLevels( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassInt (smooth_num_levels) ) ); } void hypre_F90_IFACE(hypre_boomeramggetsmoothnumlvls, HYPRE_BOOMERAMGGETSMOOTHNUMLVLS) ( hypre_F90_Obj *solver, hypre_F90_Int *smooth_num_levels, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_BoomerAMGGetSmoothNumLevels( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassIntRef (smooth_num_levels) ) ); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGSetSmoothNumSwps, HYPRE_BoomerAMGGetSmoothNumSwps *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_boomeramgsetsmoothnumswps, HYPRE_BOOMERAMGSETSMOOTHNUMSWPS) ( hypre_F90_Obj *solver, hypre_F90_Int *smooth_num_sweeps, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_BoomerAMGSetSmoothNumSweeps( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassInt (smooth_num_sweeps) ) ); } void hypre_F90_IFACE(hypre_boomeramggetsmoothnumswps, HYPRE_BOOMERAMGGETSMOOTHNUMSWPS) ( hypre_F90_Obj *solver, hypre_F90_Int *smooth_num_sweeps, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_BoomerAMGGetSmoothNumSweeps( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassIntRef (smooth_num_sweeps) ) ); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGSetLogging, HYPRE_BoomerAMGGetLogging *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_boomeramgsetlogging, HYPRE_BOOMERAMGSETLOGGING) ( hypre_F90_Obj *solver, hypre_F90_Int *logging, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_BoomerAMGSetLogging( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassInt (logging) ) ); } void hypre_F90_IFACE(hypre_boomeramggetlogging, HYPRE_BOOMERAMGGETLOGGING) ( hypre_F90_Obj *solver, hypre_F90_Int *logging, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_BoomerAMGGetLogging( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassIntRef (logging) ) ); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGSetPrintLevel, HYPRE_BoomerAMGGetPrintLevel *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_boomeramgsetprintlevel, HYPRE_BOOMERAMGSETPRINTLEVEL) ( hypre_F90_Obj *solver, hypre_F90_Int *print_level, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_BoomerAMGSetPrintLevel( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassInt (print_level) ) ); } void hypre_F90_IFACE(hypre_boomeramggetprintlevel, HYPRE_BOOMERAMGGETPRINTLEVEL) ( hypre_F90_Obj *solver, hypre_F90_Int *print_level, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_BoomerAMGGetPrintLevel( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassIntRef (print_level) ) ); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGSetPrintFileName *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_boomeramgsetprintfilename, HYPRE_BOOMERAMGSETPRINTFILENAME) ( hypre_F90_Obj *solver, char *print_file_name, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_BoomerAMGSetPrintFileName( hypre_F90_PassObj (HYPRE_Solver, solver), (char *) print_file_name ) ); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGSetDebugFlag, HYPRE_BoomerAMGGetDebugFlag *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_boomeramgsetdebugflag, HYPRE_BOOMERAMGSETDEBUGFLAG) ( hypre_F90_Obj *solver, hypre_F90_Int *debug_flag, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_BoomerAMGSetDebugFlag( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassInt (debug_flag) ) ); } void hypre_F90_IFACE(hypre_boomeramggetdebugflag, HYPRE_BOOMERAMGGETDEBUGFLAG) ( hypre_F90_Obj *solver, hypre_F90_Int *debug_flag, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_BoomerAMGGetDebugFlag( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassIntRef (debug_flag) ) ); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGGetNumIterations *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_boomeramggetnumiterations, HYPRE_BOOMERAMGGETNUMITERATIONS) ( hypre_F90_Obj *solver, hypre_F90_Int *num_iterations, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_BoomerAMGGetNumIterations( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassIntRef (num_iterations) ) ); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGGetCumNumIterations *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_boomeramggetcumnumiterati, HYPRE_BOOMERAMGGETCUMNUMITERATI) ( hypre_F90_Obj *solver, hypre_F90_Int *cum_num_iterations, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_BoomerAMGGetCumNumIterations( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassIntRef (cum_num_iterations) ) ); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGGetResidual *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_boomeramggetresidual, HYPRE_BOOMERAMGGETRESIDUAL) ( hypre_F90_Obj *solver, hypre_F90_Obj *residual, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_BoomerAMGGetResidual( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassObjRef (HYPRE_ParVector, residual)) ); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGGetFinalRelativeResNorm *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_boomeramggetfinalreltvres, HYPRE_BOOMERAMGGETFINALRELTVRES) ( hypre_F90_Obj *solver, hypre_F90_Real *rel_resid_norm, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_BoomerAMGGetFinalRelativeResidualNorm( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassRealRef (rel_resid_norm) ) ); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGSetVariant, HYPRE_BoomerAMGGetVariant *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_boomeramgsetvariant, HYPRE_BOOMERAMGSETVARIANT) ( hypre_F90_Obj *solver, hypre_F90_Int *variant, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_BoomerAMGSetVariant( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassInt (variant) ) ); } void hypre_F90_IFACE(hypre_boomeramggetvariant, HYPRE_BOOMERAMGGETVARIANT) ( hypre_F90_Obj *solver, hypre_F90_Int *variant, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_BoomerAMGGetVariant( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassIntRef (variant) ) ); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGSetOverlap, HYPRE_BoomerAMGGetOverlap *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_boomeramgsetoverlap, HYPRE_BOOMERAMGSETOVERLAP) ( hypre_F90_Obj *solver, hypre_F90_Int *overlap, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_BoomerAMGSetOverlap( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassInt (overlap) ) ); } void hypre_F90_IFACE(hypre_boomeramggetoverlap, HYPRE_BOOMERAMGGETOVERLAP) ( hypre_F90_Obj *solver, hypre_F90_Int *overlap, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_BoomerAMGGetOverlap( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassIntRef (overlap) ) ); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGSetDomainType, HYPRE_BoomerAMGGetDomainType *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_boomeramgsetdomaintype, HYPRE_BOOMERAMGSETDOMAINTYPE) ( hypre_F90_Obj *solver, hypre_F90_Int *domain_type, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_BoomerAMGSetDomainType( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassInt (domain_type) ) ); } void hypre_F90_IFACE(hypre_boomeramggetdomaintype, HYPRE_BOOMERAMGGETDOMAINTYPE) ( hypre_F90_Obj *solver, hypre_F90_Int *domain_type, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_BoomerAMGGetDomainType( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassIntRef (domain_type) ) ); } void hypre_F90_IFACE(hypre_boomeramgsetschwarznonsym, HYPRE_BOOMERAMGSETSCHWARZNONSYM) ( hypre_F90_Obj *solver, hypre_F90_Int *schwarz_non_symm, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_BoomerAMGSetSchwarzUseNonSymm( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassInt (schwarz_non_symm) ) ); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGSetSchwarzRlxWt, HYPRE_BoomerAMGGetSchwarzRlxWt *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_boomeramgsetschwarzrlxwt, HYPRE_BOOMERAMGSETSCHWARZRLXWT) ( hypre_F90_Obj *solver, hypre_F90_Real *schwarz_rlx_weight, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_BoomerAMGSetSchwarzRlxWeight( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassReal (schwarz_rlx_weight)) ); } void hypre_F90_IFACE(hypre_boomeramggetschwarzrlxwt, HYPRE_BOOMERAMGGETSCHWARZRLXWT) ( hypre_F90_Obj *solver, hypre_F90_Real *schwarz_rlx_weight, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_BoomerAMGGetSchwarzRlxWeight( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassRealRef (schwarz_rlx_weight)) ); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGSetSym *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_boomeramgsetsym, HYPRE_BOOMERAMGSETSYM) ( hypre_F90_Obj *solver, hypre_F90_Int *sym, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_BoomerAMGSetSym( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassInt (sym) ) ); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGSetLevel *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_boomeramgsetlevel, HYPRE_BOOMERAMGSETLEVEL) ( hypre_F90_Obj *solver, hypre_F90_Int *level, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_BoomerAMGSetLevel( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassInt (level) ) ); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGSetThreshold *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_boomeramgsetthreshold, HYPRE_BOOMERAMGSETTHRESHOLD) ( hypre_F90_Obj *solver, hypre_F90_Real *threshold, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_BoomerAMGSetThreshold( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassReal (threshold)) ); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGSetFilter *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_boomeramgsetfilter, HYPRE_BOOMERAMGSETFILTER) ( hypre_F90_Obj *solver, hypre_F90_Real *filter, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_BoomerAMGSetFilter( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassReal (filter)) ); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGSetDropTol *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_boomeramgsetdroptol, HYPRE_BOOMERAMGSETDROPTOL) ( hypre_F90_Obj *solver, hypre_F90_Real *drop_tol, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_BoomerAMGSetDropTol( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassReal (drop_tol)) ); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGSetMaxNzPerRow *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_boomeramgsetmaxnzperrow, HYPRE_BOOMERAMGSETMAXNZPERROW) ( hypre_F90_Obj *solver, hypre_F90_Int *max_nz_per_row, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_BoomerAMGSetMaxNzPerRow( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassInt (max_nz_per_row) ) ); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGSetEuBJ *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_boomeramgseteubj, HYPRE_BOOMERAMGSETEUBJ) ( hypre_F90_Obj *solver, hypre_F90_Int *eu_bj, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_BoomerAMGSetEuBJ( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassInt (eu_bj) ) ); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGSetEuLevel *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_boomeramgseteulevel, HYPRE_BOOMERAMGSETEULEVEL) ( hypre_F90_Obj *solver, hypre_F90_Int *eu_level, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_BoomerAMGSetEuLevel( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassInt (eu_level) ) ); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGSetEuSparseA *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_boomeramgseteusparsea, HYPRE_BOOMERAMGSETEUSPARSEA) ( hypre_F90_Obj *solver, hypre_F90_Real *eu_sparse_a, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_BoomerAMGSetEuSparseA( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassReal (eu_sparse_a)) ); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGSetEuclidFile *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_boomeramgseteuclidfile, HYPRE_BOOMERAMGSETEUCLIDFILE) ( hypre_F90_Obj *solver, char *euclidfile, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_BoomerAMGSetEuclidFile( hypre_F90_PassObj (HYPRE_Solver, solver), (char *) euclidfile ) ); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGSetNumFunctions, HYPRE_BoomerAMGGetNumFunctions *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_boomeramgsetnumfunctions, HYPRE_BOOMERAMGSETNUMFUNCTIONS) ( hypre_F90_Obj *solver, hypre_F90_Int *num_functions, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_BoomerAMGSetNumFunctions( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassInt (num_functions) ) ); } void hypre_F90_IFACE(hypre_boomeramggetnumfunctions, HYPRE_BOOMERAMGGETNUMFUNCTIONS) ( hypre_F90_Obj *solver, hypre_F90_Int *num_functions, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_BoomerAMGGetNumFunctions( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassIntRef (num_functions) ) ); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGSetNodal *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_boomeramgsetnodal, HYPRE_BOOMERAMGSETNODAL) ( hypre_F90_Obj *solver, hypre_F90_Int *nodal, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_BoomerAMGSetNodal( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassInt (nodal) ) ); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGSetNodalDiag *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_boomeramgsetnodaldiag, HYPRE_BOOMERAMGSETNODALDIAG) ( hypre_F90_Obj *solver, hypre_F90_Int *nodal_diag, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_BoomerAMGSetNodalDiag( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassInt (nodal_diag) ) ); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGSetDofFunc *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_boomeramgsetdoffunc, HYPRE_BOOMERAMGSETDOFFUNC) ( hypre_F90_Obj *solver, hypre_F90_IntArray *dof_func, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_BoomerAMGSetDofFunc( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassIntArray (dof_func) ) ); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGSetNumPaths *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_boomeramgsetnumpaths, HYPRE_BOOMERAMGSETNUMPATHS) ( hypre_F90_Obj *solver, hypre_F90_Int *num_paths, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_BoomerAMGSetNumPaths( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassInt (num_paths) ) ); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGSetAggNumLevels *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_boomeramgsetaggnumlevels, HYPRE_BOOMERAMGSETAGGNUMLEVELS) ( hypre_F90_Obj *solver, hypre_F90_Int *agg_num_levels, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_BoomerAMGSetAggNumLevels( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassInt (agg_num_levels) ) ); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGSetAggInterpType *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_boomeramgsetagginterptype, HYPRE_BOOMERAMGSETAGGINTERPTYPE) ( hypre_F90_Obj *solver, hypre_F90_Int *agg_interp_type, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_BoomerAMGSetAggInterpType( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassInt (agg_interp_type) ) ); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGSetAggTruncFactor *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_boomeramgsetaggtrfactor, HYPRE_BOOMERAMGSETAGGTRFACTOR) ( hypre_F90_Obj *solver, hypre_F90_Real *trunc_factor, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_BoomerAMGSetAggTruncFactor( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassReal (trunc_factor) ) ); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGSetAggP12TruncFactor *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_boomeramgsetaggp12trfac, HYPRE_BOOMERAMGSETAGGP12TRFAC) ( hypre_F90_Obj *solver, hypre_F90_Real *trunc_factor, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_BoomerAMGSetAggP12TruncFactor( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassReal (trunc_factor) ) ); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGSetAggPMaxElmts *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_boomeramgsetaggpmaxelmts, HYPRE_BOOMERAMGSETAGGPMAXELMTS) ( hypre_F90_Obj *solver, hypre_F90_Int *p_max_elmts, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_BoomerAMGSetAggPMaxElmts( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassInt (p_max_elmts) ) ); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGSetAggP12MaxElmts *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_boomeramgsetaggp12maxelmt, HYPRE_BOOMERAMGSETAGGP12MAXELMT) ( hypre_F90_Obj *solver, hypre_F90_Int *p_max_elmts, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_BoomerAMGSetAggP12MaxElmts( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassInt (p_max_elmts) ) ); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGSetInterpVectors *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_boomeramgsetinterpvecs, HYPRE_BOOMERAMGSETINTERPVECS) ( hypre_F90_Obj *solver, hypre_F90_Int *num_vectors, hypre_F90_Obj *interp_vectors, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_BoomerAMGSetInterpVectors( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassInt (num_vectors), hypre_F90_PassObjRef (HYPRE_ParVector, interp_vectors) ) ); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGSetInterpVecVariant *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_boomeramgsetinterpvecvar, HYPRE_BOOMERAMGSETINTERPVECVAR) ( hypre_F90_Obj *solver, hypre_F90_Int *var, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_BoomerAMGSetInterpVecVariant( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassInt (var) ) ); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGSetInterpVecQMax *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_boomeramgsetinterpvecqmx, HYPRE_BOOMERAMGSETINTERPVECQMX) ( hypre_F90_Obj *solver, hypre_F90_Int *q_max, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_BoomerAMGSetInterpVecQMax( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassInt (q_max) ) ); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGSetInterpVecAbsQTrunc *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_boomeramgsetinterpvecqtr, HYPRE_BOOMERAMGSETINTERPVECQTR) ( hypre_F90_Obj *solver, hypre_F90_Real *q_trunc, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_BoomerAMGSetInterpVecAbsQTrunc( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassReal (q_trunc) ) ); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGSetChebyOrder *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_boomeramgsetchebyorder, HYPRE_BOOMERAMGSETCHEBYORDER) ( hypre_F90_Obj *solver, hypre_F90_Int *cheby_order, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_BoomerAMGSetChebyOrder( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassInt (cheby_order) ) ); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGSetChebyFraction *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_boomeramgsetchebyfract, HYPRE_BOOMERAMGSETCHEBYFRACT) ( hypre_F90_Obj *solver, hypre_F90_Real *cheby_fraction, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_BoomerAMGSetChebyFraction( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassReal (cheby_fraction) ) ); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGSetChebyScale *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_boomeramgsetchebyscale, HYPRE_BOOMERAMGSETCHEBYSCALE) ( hypre_F90_Obj *solver, hypre_F90_Int *cheby_scale, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_BoomerAMGSetChebyScale( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassInt (cheby_scale) ) ); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGSetChebyVariant *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_boomeramgsetchebyvariant, HYPRE_BOOMERAMGSETCHEBYVARIANT) ( hypre_F90_Obj *solver, hypre_F90_Int *cheby_variant, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_BoomerAMGSetChebyVariant( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassInt (cheby_variant) ) ); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGSetChebyEigEst *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_boomeramgsetchebyeigest, HYPRE_BOOMERAMGSETCHEBYEIGEST) ( hypre_F90_Obj *solver, hypre_F90_Int *cheby_eig_est, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_BoomerAMGSetChebyEigEst( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassInt (cheby_eig_est) ) ); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGSetKeepTranspose *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_boomeramgsetkeeptransp, HYPRE_BOOMERAMGSETKEEPTRANSP) ( hypre_F90_Obj *solver, hypre_F90_Int *keep_transpose, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_BoomerAMGSetKeepTranspose( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassInt (keep_transpose) ) ); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGSetRAP2 *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_boomeramgsetrap2, HYPRE_BOOMERAMGSETRAP2) ( hypre_F90_Obj *solver, hypre_F90_Int *rap2, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_BoomerAMGSetRAP2( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassInt (rap2) ) ); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGSetAdditive, HYPRE_BoomerAMGGetAdditive *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_boomeramgsetadditive, HYPRE_BOOMERAMGSETADDITIVE) ( hypre_F90_Obj *solver, hypre_F90_Int *add_lvl, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_BoomerAMGSetAdditive( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassInt (add_lvl) ) ); } void hypre_F90_IFACE(hypre_boomeramggetadditive, HYPRE_BOOMERAMGGETADDITIVE) ( hypre_F90_Obj *solver, hypre_F90_Int *add_lvl, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_BoomerAMGGetAdditive( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassIntRef (add_lvl) ) ); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGSetMultAdditive, HYPRE BoomerAMGGetMultAdditive *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_boomeramgsetmultadd, HYPRE_BOOMERAMGSETMULTADD) ( hypre_F90_Obj *solver, hypre_F90_Int *add_lvl, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_BoomerAMGSetMultAdditive( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassInt (add_lvl) ) ); } void hypre_F90_IFACE(hypre_boomeramggetmultadd, HYPRE_BOOMERAMGGETMULTADD) ( hypre_F90_Obj *solver, hypre_F90_Int *add_lvl, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_BoomerAMGGetMultAdditive( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassIntRef (add_lvl) ) ); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGSetSimple, HYPRE_BoomerAMGGetSimple *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_boomeramgsetsimple, HYPRE_BOOMERAMGSETSIMPLE) ( hypre_F90_Obj *solver, hypre_F90_Int *add_lvl, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_BoomerAMGSetSimple( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassInt (add_lvl) ) ); } void hypre_F90_IFACE(hypre_boomeramggetsimple, HYPRE_BOOMERAMGGETSIMPLE) ( hypre_F90_Obj *solver, hypre_F90_Int *add_lvl, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_BoomerAMGGetSimple( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassIntRef (add_lvl) ) ); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGSetAddLastLvl *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_boomeramgsetaddlastlvl, HYPRE_BOOMERAMGSETADDLASTLVL) ( hypre_F90_Obj *solver, hypre_F90_Int *add_last_lvl, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_BoomerAMGSetAddLastLvl( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassInt (add_last_lvl) ) ); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGSetMultAddTruncFactor *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_boomeramgsetmultaddtrf, HYPRE_BOOMERAMGSETMULTADDTRF) ( hypre_F90_Obj *solver, hypre_F90_Real *add_tr, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_BoomerAMGSetMultAddTruncFactor( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassReal (add_tr) ) ); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGSetMultAddPMaxElmts *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_boomeramgsetmultaddpmx, HYPRE_BOOMERAMGSETMULTADDPMX) ( hypre_F90_Obj *solver, hypre_F90_Int *add_pmx, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_BoomerAMGSetMultAddPMaxElmts( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassInt (add_pmx) ) ); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGSetAddRelaxType *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_boomeramgsetaddrlxtype, HYPRE_BOOMERAMGSETADDRLXTYPE) ( hypre_F90_Obj *solver, hypre_F90_Int *add_rlx_type, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_BoomerAMGSetAddRelaxType( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassInt (add_rlx_type) ) ); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGSetAddRelaxWt *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_boomeramgsetaddrlxwt, HYPRE_BOOMERAMGSETADDRLXWT) ( hypre_F90_Obj *solver, hypre_F90_Real *add_rlx_wt, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_BoomerAMGSetAddRelaxWt( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassReal (add_rlx_wt) ) ); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGSetSeqThreshold *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_boomeramgsetseqthrshold, HYPRE_BOOMERAMGSETSEQTHRSHOLD) ( hypre_F90_Obj *solver, hypre_F90_Int *seq_th, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_BoomerAMGSetSeqThreshold( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassInt (seq_th) ) ); } #ifdef HYPRE_USING_DSUPERLU /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGSetDSLUThreshold *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_boomeramgsetdsluthrshold, HYPRE_BOOMERAMGSETDSLUTHRSHOLD) ( hypre_F90_Obj *solver, hypre_F90_Int *dslu_th, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_BoomerAMGSetDSLUThreshold( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassInt (dslu_th) ) ); } #endif /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGSetRedundant *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_boomeramgsetredundant, HYPRE_BOOMERAMGSETREDUNDANT) ( hypre_F90_Obj *solver, hypre_F90_Int *redundant, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_BoomerAMGSetRedundant( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassInt (redundant) ) ); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGSetNonGalerkinTol *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_boomeramgsetnongaltol, HYPRE_BOOMERAMGSETNONGALTOL) ( hypre_F90_Obj *solver, hypre_F90_Real *nongal_tol, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_BoomerAMGSetNonGalerkinTol( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassReal (nongal_tol) ) ); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGSetLevelNonGalerkinTol *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_boomeramgsetlvlnongaltol, HYPRE_BOOMERAMGSETLVLNONGALTOL) ( hypre_F90_Obj *solver, hypre_F90_Real *nongal_tol, hypre_F90_Int *level, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_BoomerAMGSetLevelNonGalerkinTol( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassReal (nongal_tol), hypre_F90_PassInt (level) ) ); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGSetGSMG *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_boomeramgsetgsmg, HYPRE_BOOMERAMGSETGSMG) ( hypre_F90_Obj *solver, hypre_F90_Int *gsmg, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_BoomerAMGSetGSMG( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassInt (gsmg) ) ); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGSetNumSamples *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_boomeramgsetnumsamples, HYPRE_BOOMERAMGSETNUMSAMPLES) ( hypre_F90_Obj *solver, hypre_F90_Int *gsmg, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_BoomerAMGSetNumSamples( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassInt (gsmg) ) ); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGSetCGCIts *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_boomeramgsetcgcits, HYPRE_BOOMERAMGSETCGCITS) ( hypre_F90_Obj *solver, hypre_F90_Int *its, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_BoomerAMGSetCGCIts( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassInt (its) ) ); } #ifdef __cplusplus } #endif hypre-2.33.0/src/parcsr_ls/F90_HYPRE_parcsr_bicgstab.c000066400000000000000000000267651477326011500224140ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * HYPRE_ParCSRBiCGSTAB Fortran interface * *****************************************************************************/ #include "_hypre_parcsr_ls.h" #include "fortran.h" #ifdef __cplusplus extern "C" { #endif /*-------------------------------------------------------------------------- * HYPRE_ParCSRBiCGSTABCreate *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_parcsrbicgstabcreate, HYPRE_PARCSRBICGSTABCREATE) ( hypre_F90_Comm *comm, hypre_F90_Obj *solver, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_ParCSRBiCGSTABCreate( hypre_F90_PassComm (comm), hypre_F90_PassObjRef (HYPRE_Solver, solver) ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRBiCGSTABDestroy *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_parcsrbicgstabdestroy, HYPRE_PARCSRBICGSTABDESTROY) ( hypre_F90_Obj *solver, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_ParCSRBiCGSTABDestroy( hypre_F90_PassObj (HYPRE_Solver, solver) ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRBiCGSTABSetup *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_parcsrbicgstabsetup, HYPRE_PARCSRBICGSTABSETUP) ( hypre_F90_Obj *solver, hypre_F90_Obj *A, hypre_F90_Obj *b, hypre_F90_Obj *x, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_ParCSRBiCGSTABSetup( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassObj (HYPRE_ParCSRMatrix, A), hypre_F90_PassObj (HYPRE_ParVector, b), hypre_F90_PassObj (HYPRE_ParVector, x) ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRBiCGSTABSolve *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_parcsrbicgstabsolve, HYPRE_PARCSRBICGSTABSOLVE) ( hypre_F90_Obj *solver, hypre_F90_Obj *A, hypre_F90_Obj *b, hypre_F90_Obj *x, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_ParCSRBiCGSTABSolve( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassObj (HYPRE_ParCSRMatrix, A), hypre_F90_PassObj (HYPRE_ParVector, b), hypre_F90_PassObj (HYPRE_ParVector, x) ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRBiCGSTABSetTol *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_parcsrbicgstabsettol, HYPRE_PARCSRBICGSTABSETTOL) ( hypre_F90_Obj *solver, hypre_F90_Real *tol, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_ParCSRBiCGSTABSetTol( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassReal (tol) ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRBiCGSTABSetAbsoluteTol *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_parcsrbicgstabsetatol, HYPRE_PARCSRBICGSTABSETATOL) ( hypre_F90_Obj *solver, hypre_F90_Real *tol, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_ParCSRBiCGSTABSetAbsoluteTol( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassReal (tol) ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRBiCGSTABSetMinIter *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_parcsrbicgstabsetminiter, HYPRE_PARCSRBICGSTABSETMINITER) ( hypre_F90_Obj *solver, hypre_F90_Int *min_iter, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_ParCSRBiCGSTABSetMinIter( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassInt (min_iter) ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRBiCGSTABSetMaxIter *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_parcsrbicgstabsetmaxiter, HYPRE_PARCSRBICGSTABSETMAXITER) ( hypre_F90_Obj *solver, hypre_F90_Int *max_iter, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_ParCSRBiCGSTABSetMaxIter( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassInt (max_iter) ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRBiCGSTABSeStopCrit *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_parcsrbicgstabsetstopcrit, HYPRE_PARCSRBICGSTABSETSTOP) ( hypre_F90_Obj *solver, hypre_F90_Int *stop_crit, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_ParCSRBiCGSTABSetStopCrit( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassInt (stop_crit) ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRBiCGSTABSetPrecond *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_parcsrbicgstabsetprecond, HYPRE_PARCSRBICGSTABSETPRECOND) ( hypre_F90_Obj *solver, hypre_F90_Int *precond_id, hypre_F90_Obj *precond_solver, hypre_F90_Int *ierr ) { /*------------------------------------------------------------ * The precond_id flags mean : * 0 - no preconditioner * 1 - set up a ds preconditioner * 2 - set up an amg preconditioner * 3 - set up a pilut preconditioner * 4 - set up a parasails preconditioner * 5 - set up a Euclid preconditioner * 6 - set up a ILU preconditioner * 7 - set up a MGR preconditioner *------------------------------------------------------------*/ if (*precond_id == 0) { *ierr = 0; } else if (*precond_id == 1) { *ierr = (hypre_F90_Int) ( HYPRE_ParCSRBiCGSTABSetPrecond( hypre_F90_PassObj (HYPRE_Solver, solver), HYPRE_ParCSRDiagScale, HYPRE_ParCSRDiagScaleSetup, NULL ) ); } else if (*precond_id == 2) { *ierr = (hypre_F90_Int) ( HYPRE_ParCSRBiCGSTABSetPrecond( hypre_F90_PassObj (HYPRE_Solver, solver), HYPRE_BoomerAMGSolve, HYPRE_BoomerAMGSetup, (HYPRE_Solver) * precond_solver ) ); } else if (*precond_id == 3) { *ierr = (hypre_F90_Int) ( HYPRE_ParCSRBiCGSTABSetPrecond( hypre_F90_PassObj (HYPRE_Solver, solver), HYPRE_ParCSRPilutSolve, HYPRE_ParCSRPilutSetup, (HYPRE_Solver) * precond_solver ) ); } else if (*precond_id == 4) { *ierr = (hypre_F90_Int) ( HYPRE_ParCSRBiCGSTABSetPrecond( hypre_F90_PassObj (HYPRE_Solver, solver), HYPRE_ParCSRParaSailsSolve, HYPRE_ParCSRParaSailsSetup, (HYPRE_Solver) * precond_solver ) ); } else if (*precond_id == 5) { *ierr = (hypre_F90_Int) ( HYPRE_ParCSRBiCGSTABSetPrecond( hypre_F90_PassObj (HYPRE_Solver, solver), HYPRE_EuclidSolve, HYPRE_EuclidSetup, (HYPRE_Solver) * precond_solver ) ); } else if (*precond_id == 6) { *ierr = (hypre_F90_Int) ( HYPRE_ParCSRBiCGSTABSetPrecond( hypre_F90_PassObj (HYPRE_Solver, solver), HYPRE_ILUSolve, HYPRE_ILUSetup, (HYPRE_Solver) * precond_solver ) ); } else if (*precond_id == 7) { *ierr = (hypre_F90_Int) ( HYPRE_ParCSRBiCGSTABSetPrecond( hypre_F90_PassObj (HYPRE_Solver, solver), HYPRE_MGRSolve, HYPRE_MGRSetup, (HYPRE_Solver) * precond_solver ) ); } else { *ierr = -1; } } /*-------------------------------------------------------------------------- * HYPRE_ParCSRBiCGSTABGetPrecond *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_parcsrbicgstabgetprecond, HYPRE_PARCSRBICGSTABGETPRECOND) ( hypre_F90_Obj *solver, hypre_F90_Obj *precond_solver_ptr, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_ParCSRBiCGSTABGetPrecond( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassObjRef (HYPRE_Solver, precond_solver_ptr) ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRBiCGSTABSetLogging *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_parcsrbicgstabsetlogging, HYPRE_PARCSRBICGSTABSETLOGGING) ( hypre_F90_Obj *solver, hypre_F90_Int *logging, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_ParCSRBiCGSTABSetLogging( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassInt (logging) ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRBiCGSTABSetPrintLevel *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_parcsrbicgstabsetprintlev, HYPRE_PARCSRBICGSTABSETPRINTLEV) ( hypre_F90_Obj *solver, hypre_F90_Int *print_level, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_ParCSRBiCGSTABSetPrintLevel( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassInt (print_level) ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRBiCGSTABGetNumIter *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_parcsrbicgstabgetnumiter, HYPRE_PARCSRBICGSTABGETNUMITER) ( hypre_F90_Obj *solver, hypre_F90_Int *num_iterations, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_ParCSRBiCGSTABGetNumIterations( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassIntRef (num_iterations) ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRBiCGSTABGetFinalRelativeResidualNorm *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_parcsrbicgstabgetfinalrel, HYPRE_PARCSRBICGSTABGETFINALREL) ( hypre_F90_Obj *solver, hypre_F90_Real *norm, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_ParCSRBiCGSTABGetFinalRelativeResidualNorm( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassRealRef (norm) ) ); } #ifdef __cplusplus } #endif hypre-2.33.0/src/parcsr_ls/F90_HYPRE_parcsr_block.c000066400000000000000000000126061477326011500217150ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * HYPRE_BlockTridiag Fortran interface * *****************************************************************************/ #include "block_tridiag.h" #include "_hypre_parcsr_ls.h" #include "fortran.h" #ifdef __cplusplus extern "C" { #endif /*-------------------------------------------------------------------------- * HYPRE_BlockTridiagCreate *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_blocktridiagcreate, HYPRE_BLOCKTRIDIAGCREATE) (hypre_F90_Obj *solver, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) HYPRE_BlockTridiagCreate( hypre_F90_PassObjRef (HYPRE_Solver, solver)); } /*-------------------------------------------------------------------------- * HYPRE_blockTridiagDestroy *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_blocktridiagdestroy, HYPRE_BLOCKTRIDIAGDESTROY) (hypre_F90_Obj *solver, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) HYPRE_BlockTridiagDestroy( hypre_F90_PassObj (HYPRE_Solver, solver)); } /*-------------------------------------------------------------------------- * HYPRE_BlockTridiagSetup *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_blocktridiagsetup, HYPRE_BLOCKTRIDIAGSETUP) (hypre_F90_Obj *solver, hypre_F90_Obj *A, hypre_F90_Obj *b, hypre_F90_Obj *x, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) HYPRE_BlockTridiagSetup( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassObj (HYPRE_ParCSRMatrix, A), hypre_F90_PassObj (HYPRE_ParVector, b), hypre_F90_PassObj (HYPRE_ParVector, x)); } /*-------------------------------------------------------------------------- * HYPRE_BlockTridiagSolve *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_blocktridiagsolve, HYPRE_BLOCKTRIDIAGSOLVE) (hypre_F90_Obj *solver, hypre_F90_Obj *A, hypre_F90_Obj *b, hypre_F90_Obj *x, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) HYPRE_BlockTridiagSolve( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassObj (HYPRE_ParCSRMatrix, A), hypre_F90_PassObj (HYPRE_ParVector, b), hypre_F90_PassObj (HYPRE_ParVector, x)); } /*-------------------------------------------------------------------------- * HYPRE_BlockTridiagSetIndexSet *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_blocktridiagsetindexset, HYPRE_BLOCKTRIDIAGSETINDEXSET) (hypre_F90_Obj *solver, hypre_F90_Int *n, hypre_F90_IntArray *inds, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) HYPRE_BlockTridiagSetIndexSet( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassInt (n), hypre_F90_PassIntArray (inds)); } /*-------------------------------------------------------------------------- * HYPRE_BlockTridiagSetAMGStrengthThreshold *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_blocktridiagsetamgstrengt, HYPRE_BLOCKTRIDIAGSETAMGSTRENGT) (hypre_F90_Obj *solver, hypre_F90_Real *thresh, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) HYPRE_BlockTridiagSetAMGStrengthThreshold( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassReal (thresh)); } /*-------------------------------------------------------------------------- * HYPRE_BlockTridiagSetAMGNumSweeps *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_blocktridiagsetamgnumswee, HYPRE_BLOCKTRIDIAGSETAMGNUMSWEE) (hypre_F90_Obj *solver, hypre_F90_Int *num_sweeps, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) HYPRE_BlockTridiagSetAMGNumSweeps( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassInt (num_sweeps)); } /*-------------------------------------------------------------------------- * HYPRE_BlockTridiagSetAMGRelaxType *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_blocktridiagsetamgrelaxty, HYPRE_BLOCKTRIDIAGSETAMGRELAXTY) (hypre_F90_Obj *solver, hypre_F90_Int *relax_type, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) HYPRE_BlockTridiagSetAMGRelaxType( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassInt (relax_type)); } /*-------------------------------------------------------------------------- * HYPRE_BlockTridiagSetPrintLevel *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_blocktridiagsetprintlevel, HYPRE_BLOCKTRIDIAGSETPRINTLEVEL) (hypre_F90_Obj *solver, hypre_F90_Int *print_level, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) HYPRE_BlockTridiagSetPrintLevel( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassInt (print_level)); } #ifdef __cplusplus } #endif hypre-2.33.0/src/parcsr_ls/F90_HYPRE_parcsr_cgnr.c000066400000000000000000000247651477326011500215650ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * HYPRE_ParCSRCGNR Fortran interface * *****************************************************************************/ #include "_hypre_parcsr_ls.h" #include "fortran.h" #ifdef __cplusplus extern "C" { #endif /*-------------------------------------------------------------------------- * HYPRE_ParCSRCGNRCreate *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_parcsrcgnrcreate, HYPRE_PARCSRCGNRCREATE) ( hypre_F90_Comm *comm, hypre_F90_Obj *solver, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_ParCSRCGNRCreate( hypre_F90_PassComm (comm), hypre_F90_PassObjRef (HYPRE_Solver, solver) ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRCGNRDestroy *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_parcsrcgnrdestroy, HYPRE_PARCSRCGNRDESTROY) ( hypre_F90_Obj *solver, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_ParCSRCGNRDestroy( hypre_F90_PassObj (HYPRE_Solver, solver) ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRCGNRSetup *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_parcsrcgnrsetup, HYPRE_PARCSRCGNRSETUP) ( hypre_F90_Obj *solver, hypre_F90_Obj *A, hypre_F90_Obj *b, hypre_F90_Obj *x, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_ParCSRCGNRSetup( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassObj (HYPRE_ParCSRMatrix, A), hypre_F90_PassObj (HYPRE_ParVector, b), hypre_F90_PassObj (HYPRE_ParVector, x) ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRCGNRSolve *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_parcsrcgnrsolve, HYPRE_PARCSRCGNRSOLVE) ( hypre_F90_Obj *solver, hypre_F90_Obj *A, hypre_F90_Obj *b, hypre_F90_Obj *x, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_ParCSRCGNRSolve( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassObj (HYPRE_ParCSRMatrix, A), hypre_F90_PassObj (HYPRE_ParVector, b), hypre_F90_PassObj (HYPRE_ParVector, x) ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRCGNRSetTol *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_parcsrcgnrsettol, HYPRE_PARCSRCGNRSETTOL) ( hypre_F90_Obj *solver, hypre_F90_Real *tol, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_ParCSRCGNRSetTol( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassReal (tol) ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRCGNRSetMinIter *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_parcsrcgnrsetminiter, HYPRE_PARCSRCGNRSETMINITER) ( hypre_F90_Obj *solver, hypre_F90_Int *min_iter, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_ParCSRCGNRSetMinIter( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassInt (min_iter) ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRCGNRSetMaxIter *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_parcsrcgnrsetmaxiter, HYPRE_PARCSRCGNRSETMAXITER) ( hypre_F90_Obj *solver, hypre_F90_Int *max_iter, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_ParCSRCGNRSetMaxIter( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassInt (max_iter) ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRCGNRSetStopCrit *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_parcsrcgnrsetstopcrit, HYPRE_PARCSRCGNRSETSTOPCRIT) ( hypre_F90_Obj *solver, hypre_F90_Int *stop_crit, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_ParCSRCGNRSetStopCrit( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassInt (stop_crit) ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRCGNRSetPrecond *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_parcsrcgnrsetprecond, HYPRE_PARCSRCGNRSETPRECOND) ( hypre_F90_Obj *solver, hypre_F90_Int *precond_id, hypre_F90_Obj *precond_solver, hypre_F90_Int *ierr ) { /*------------------------------------------------------------ * The precond_id flags mean : * 0 - do not set up a preconditioner * 1 - set up a ds preconditioner * 2 - set up an amg preconditioner * 3 - set up a pilut preconditioner * 4 - set up a ParaSails preconditioner * 5 - set up a Euclid preconditioner * 6 - set up a ILU preconditioner * 7 - set up a MGR preconditioner *------------------------------------------------------------*/ if (*precond_id == 0) { *ierr = 0; } else if (*precond_id == 1) { *ierr = (hypre_F90_Int) ( HYPRE_ParCSRCGNRSetPrecond( hypre_F90_PassObj (HYPRE_Solver, solver), HYPRE_ParCSRDiagScale, HYPRE_ParCSRDiagScale, HYPRE_ParCSRDiagScaleSetup, NULL ) ); } else if (*precond_id == 2) { *ierr = (hypre_F90_Int) ( HYPRE_ParCSRCGNRSetPrecond( hypre_F90_PassObj (HYPRE_Solver, solver), HYPRE_BoomerAMGSolve, HYPRE_BoomerAMGSolve, HYPRE_BoomerAMGSetup, (HYPRE_Solver) * precond_solver ) ); } if (*precond_id == 3) { *ierr = (hypre_F90_Int) ( HYPRE_ParCSRCGNRSetPrecond( hypre_F90_PassObj (HYPRE_Solver, solver), HYPRE_ParCSRPilutSolve, HYPRE_ParCSRPilutSolve, HYPRE_ParCSRPilutSetup, (HYPRE_Solver) * precond_solver ) ); } if (*precond_id == 4) { *ierr = (hypre_F90_Int) ( HYPRE_ParCSRCGNRSetPrecond( hypre_F90_PassObj (HYPRE_Solver, solver), HYPRE_ParCSRParaSailsSolve, HYPRE_ParCSRParaSailsSolve, HYPRE_ParCSRParaSailsSetup, (HYPRE_Solver) * precond_solver ) ); } if (*precond_id == 5) { *ierr = (hypre_F90_Int) ( HYPRE_ParCSRCGNRSetPrecond( hypre_F90_PassObj (HYPRE_Solver, solver), HYPRE_EuclidSolve, HYPRE_EuclidSolve, HYPRE_EuclidSetup, (HYPRE_Solver) * precond_solver ) ); } else if (*precond_id == 6) { *ierr = (hypre_F90_Int) ( HYPRE_ParCSRCGNRSetPrecond( hypre_F90_PassObj (HYPRE_Solver, solver), HYPRE_ILUSolve, HYPRE_ILUSolve, HYPRE_ILUSetup, (HYPRE_Solver) * precond_solver ) ); } else if (*precond_id == 7) { *ierr = (hypre_F90_Int) ( HYPRE_ParCSRCGNRSetPrecond( hypre_F90_PassObj (HYPRE_Solver, solver), HYPRE_MGRSolve, HYPRE_MGRSolve, HYPRE_MGRSetup, (HYPRE_Solver) * precond_solver ) ); } else { *ierr = -1; } } /*-------------------------------------------------------------------------- * HYPRE_ParCSRCGNRGetPrecond *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_parcsrcgnrgetprecond, HYPRE_PARCSRCGNRGETPRECOND) ( hypre_F90_Obj *solver, hypre_F90_Obj *precond_solver_ptr, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_ParCSRCGNRGetPrecond( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassObjRef (HYPRE_Solver, precond_solver_ptr) ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRCGNRSetLogging *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_parcsrcgnrsetlogging, HYPRE_PARCSRCGNRSETLOGGING) ( hypre_F90_Obj *solver, hypre_F90_Int *logging, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_ParCSRCGNRSetLogging( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassInt (logging) ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRCGNRGetNumIteration *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_parcsrcgnrgetnumiteration, HYPRE_PARCSRCGNRGETNUMITERATION) ( hypre_F90_Obj *solver, hypre_F90_Int *num_iterations, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_ParCSRCGNRGetNumIterations( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassIntRef (num_iterations) ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRCGNRGetFinalRelativeResidualNorm *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_parcsrcgnrgetfinalrelativ, HYPRE_PARCSRCGNRGETFINALRELATIV) ( hypre_F90_Obj *solver, hypre_F90_Real *norm, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_ParCSRCGNRGetFinalRelativeResidualNorm( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassRealRef (norm) ) ); } #ifdef __cplusplus } #endif hypre-2.33.0/src/parcsr_ls/F90_HYPRE_parcsr_cogmres.c000066400000000000000000000307021477326011500222570ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * HYPRE_ParCSRCOGMRES Fortran interface * *****************************************************************************/ #include "_hypre_parcsr_ls.h" #include "fortran.h" #ifdef __cplusplus extern "C" { #endif /*-------------------------------------------------------------------------- * HYPRE_ParCSRCOGMRESCreate *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_parcsrcogmrescreate, HYPRE_PARCSRCOGMRESCREATE) ( hypre_F90_Comm *comm, hypre_F90_Obj *solver, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_ParCSRCOGMRESCreate( hypre_F90_PassComm (comm), hypre_F90_PassObjRef (HYPRE_Solver, solver) ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRCOGMRESDestroy *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_parcsrcogmresdestroy, HYPRE_PARCSRCOGMRESDESTROY) ( hypre_F90_Obj *solver, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_ParCSRCOGMRESDestroy( hypre_F90_PassObj (HYPRE_Solver, solver) ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRCOGMRESSetup *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_parcsrcogmressetup, HYPRE_PARCSRCOGMRESSETUP) ( hypre_F90_Obj *solver, hypre_F90_Obj *A, hypre_F90_Obj *b, hypre_F90_Obj *x, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_ParCSRCOGMRESSetup( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassObj (HYPRE_ParCSRMatrix, A), hypre_F90_PassObj (HYPRE_ParVector, b), hypre_F90_PassObj (HYPRE_ParVector, x) ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRCOGMRESSolve *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_parcsrcogmressolve, HYPRE_PARCSRCOGMRESSOLVE) ( hypre_F90_Obj *solver, hypre_F90_Obj *A, hypre_F90_Obj *b, hypre_F90_Obj *x, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_ParCSRCOGMRESSolve( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassObj (HYPRE_ParCSRMatrix, A), hypre_F90_PassObj (HYPRE_ParVector, b), hypre_F90_PassObj (HYPRE_ParVector, x) ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRCOGMRESSetKDim *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_parcsrcogmressetkdim, HYPRE_PARCSRCOGMRESSETKDIM) ( hypre_F90_Obj *solver, hypre_F90_Int *kdim, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_ParCSRCOGMRESSetKDim( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassInt (kdim) ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRCOGMRESSetUnroll *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_parcsrcogmressetunroll, HYPRE_PARCSRCOGMRESSETUNROLL) ( hypre_F90_Obj *solver, hypre_F90_Int *unroll, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_ParCSRCOGMRESSetUnroll( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassInt (unroll) ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRCOGMRESSetCGS *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_parcsrcogmressetcgs, HYPRE_PARCSRCOGMRESSETCGS) ( hypre_F90_Obj *solver, hypre_F90_Int *cgs, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_ParCSRCOGMRESSetCGS( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassInt (cgs) ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRCOGMRESSetTol *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_parcsrcogmressettol, HYPRE_PARCSRCOGMRESSETTOL) ( hypre_F90_Obj *solver, hypre_F90_Real *tol, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_ParCSRCOGMRESSetTol( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassReal (tol) ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRCOGMRESSetAbsoluteTol *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_parcsrcogmressetabsolutet, HYPRE_PARCSRCOGMRESSETABSOLUTET) ( hypre_F90_Obj *solver, hypre_F90_Real *tol, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_ParCSRCOGMRESSetAbsoluteTol( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassReal (tol) ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRCOGMRESSetMinIter *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_parcsrcogmressetminiter, HYPRE_PARCSRCOGMRESSETMINITER) ( hypre_F90_Obj *solver, hypre_F90_Int *min_iter, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_ParCSRCOGMRESSetMinIter( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassInt (min_iter) ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRCOGMRESSetMaxIter *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_parcsrcogmressetmaxiter, HYPRE_PARCSRCOGMRESSETMAXITER) ( hypre_F90_Obj *solver, hypre_F90_Int *max_iter, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_ParCSRCOGMRESSetMaxIter( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassInt (max_iter) ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRCOGMRESSetPrecond *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_parcsrcogmressetprecond, HYPRE_PARCSRCOGMRESSETPRECOND) ( hypre_F90_Obj *solver, hypre_F90_Int *precond_id, hypre_F90_Obj *precond_solver, hypre_F90_Int *ierr ) { /*------------------------------------------------------------ * The precond_id flags mean : * 0 - no preconditioner * 1 - set up a ds preconditioner * 2 - set up an amg preconditioner * 3 - set up a pilut preconditioner * 4 - set up a parasails preconditioner * 5 - set up a Euclid preconditioner * 6 - set up a ILU preconditioner * 7 - set up a MGR preconditioner *------------------------------------------------------------*/ if (*precond_id == 0) { *ierr = 0; } else if (*precond_id == 1) { *ierr = (hypre_F90_Int) ( HYPRE_ParCSRCOGMRESSetPrecond( hypre_F90_PassObj (HYPRE_Solver, solver), HYPRE_ParCSRDiagScale, HYPRE_ParCSRDiagScaleSetup, NULL ) ); } else if (*precond_id == 2) { *ierr = (hypre_F90_Int) ( HYPRE_ParCSRCOGMRESSetPrecond( hypre_F90_PassObj (HYPRE_Solver, solver), HYPRE_BoomerAMGSolve, HYPRE_BoomerAMGSetup, (HYPRE_Solver) * precond_solver ) ); } else if (*precond_id == 3) { *ierr = (hypre_F90_Int) ( HYPRE_ParCSRCOGMRESSetPrecond( hypre_F90_PassObj (HYPRE_Solver, solver), HYPRE_ParCSRPilutSolve, HYPRE_ParCSRPilutSetup, (HYPRE_Solver) * precond_solver ) ); } else if (*precond_id == 4) { *ierr = (hypre_F90_Int) ( HYPRE_ParCSRCOGMRESSetPrecond( hypre_F90_PassObj (HYPRE_Solver, solver), HYPRE_ParCSRParaSailsSolve, HYPRE_ParCSRParaSailsSetup, (HYPRE_Solver) * precond_solver ) ); } else if (*precond_id == 5) { *ierr = (hypre_F90_Int) ( HYPRE_ParCSRCOGMRESSetPrecond( hypre_F90_PassObj (HYPRE_Solver, solver), HYPRE_EuclidSolve, HYPRE_EuclidSetup, (HYPRE_Solver) * precond_solver ) ); } else if (*precond_id == 6) { *ierr = (hypre_F90_Int) ( HYPRE_ParCSRCOGMRESSetPrecond( hypre_F90_PassObj (HYPRE_Solver, solver), HYPRE_ILUSolve, HYPRE_ILUSetup, (HYPRE_Solver) * precond_solver ) ); } else if (*precond_id == 7) { *ierr = (hypre_F90_Int) ( HYPRE_ParCSRCOGMRESSetPrecond( hypre_F90_PassObj (HYPRE_Solver, solver), HYPRE_MGRSolve, HYPRE_MGRSetup, (HYPRE_Solver) * precond_solver ) ); } else { *ierr = -1; } } /*-------------------------------------------------------------------------- * HYPRE_ParCSRCOGMRESGetPrecond *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_parcsrcogmresgetprecond, HYPRE_PARCSRCOGMRESGETPRECOND) ( hypre_F90_Obj *solver, hypre_F90_Obj *precond_solver_ptr, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_ParCSRCOGMRESGetPrecond( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassObjRef (HYPRE_Solver, precond_solver_ptr) ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRCOGMRESSetLogging *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_parcsrcogmressetlogging, HYPRE_PARCSRCOGMRESSETLOGGING) ( hypre_F90_Obj *solver, hypre_F90_Int *logging, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_ParCSRCOGMRESSetLogging( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassInt (logging) ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRCOGMRESSetPrintLevel *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_parcsrcogmressetprintleve, HYPRE_PARCSRCOGMRESSETPRINTLEVE) ( hypre_F90_Obj *solver, hypre_F90_Int *print_level, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_ParCSRCOGMRESSetPrintLevel( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassInt (print_level) ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRCOGMRESGetNumIterations *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_parcsrcogmresgetnumiterat, HYPRE_PARCSRCOGMRESGETNUMITERAT) ( hypre_F90_Obj *solver, hypre_F90_Int *num_iterations, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_ParCSRCOGMRESGetNumIterations( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassIntRef (num_iterations) ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRCOGMRESGetFinalRelativeResidualNorm *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_parcsrcogmresgetfinalrela, HYPRE_PARCSRCOGMRESGETFINALRELA) ( hypre_F90_Obj *solver, hypre_F90_Real *norm, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_ParCSRCOGMRESGetFinalRelativeResidualNorm( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassRealRef (norm) ) ); } #ifdef __cplusplus } #endif hypre-2.33.0/src/parcsr_ls/F90_HYPRE_parcsr_flexgmres.c000066400000000000000000000271121477326011500226150ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * HYPRE_ParCSRFlexGMRES Fortran interface * *****************************************************************************/ #include "_hypre_parcsr_ls.h" #include "fortran.h" #ifdef __cplusplus extern "C" { #endif /*-------------------------------------------------------------------------- * HYPRE_ParCSRFlexGMRESCreate *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_parcsrflexgmrescreate, HYPRE_PARCSRFLEXGMRESCREATE) ( hypre_F90_Comm *comm, hypre_F90_Obj *solver, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_ParCSRFlexGMRESCreate( hypre_F90_PassComm (comm), hypre_F90_PassObjRef (HYPRE_Solver, solver) ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRFlexGMRESDestroy *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_parcsrflexgmresdestroy, HYPRE_PARCSRFLEXGMRESDESTROY) ( hypre_F90_Obj *solver, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_ParCSRFlexGMRESDestroy( hypre_F90_PassObj (HYPRE_Solver, solver) ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRFlexGMRESSetup *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_parcsrflexgmressetup, HYPRE_PARCSRFLEXGMRESSETUP) ( hypre_F90_Obj *solver, hypre_F90_Obj *A, hypre_F90_Obj *b, hypre_F90_Obj *x, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_ParCSRFlexGMRESSetup( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassObj (HYPRE_ParCSRMatrix, A), hypre_F90_PassObj (HYPRE_ParVector, b), hypre_F90_PassObj (HYPRE_ParVector, x) ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRFlexGMRESSolve *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_parcsrflexgmressolve, HYPRE_PARCSRFLEXGMRESSOLVE) ( hypre_F90_Obj *solver, hypre_F90_Obj *A, hypre_F90_Obj *b, hypre_F90_Obj *x, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_ParCSRFlexGMRESSolve( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassObj (HYPRE_ParCSRMatrix, A), hypre_F90_PassObj (HYPRE_ParVector, b), hypre_F90_PassObj (HYPRE_ParVector, x) ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRFlexGMRESSetKDim *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_parcsrflexgmressetkdim, HYPRE_PARCSRFLEXGMRESSETKDIM) ( hypre_F90_Obj *solver, hypre_F90_Int *kdim, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_ParCSRFlexGMRESSetKDim( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassInt (kdim) ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRFlexGMRESSetTol *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_parcsrflexgmressettol, HYPRE_PARCSRFLEXGMRESSETTOL) ( hypre_F90_Obj *solver, hypre_F90_Real *tol, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_ParCSRFlexGMRESSetTol( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassReal (tol) ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRFlexGMRESSetAbsoluteTol *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_parcsrflexgmressetabsolutetol, HYPRE_PARCSRFLEXGMRESSETABSOLUTETOL) ( hypre_F90_Obj *solver, hypre_F90_Real *tol, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_ParCSRFlexGMRESSetAbsoluteTol( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassReal (tol) ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRFlexGMRESSetMinIter *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_parcsrflexgmressetminiter, HYPRE_PARCSRFLEXGMRESSETMINITER) ( hypre_F90_Obj *solver, hypre_F90_Int *min_iter, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_ParCSRFlexGMRESSetMinIter( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassInt (min_iter) ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRFlexGMRESSetMaxIter *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_parcsrflexgmressetmaxiter, HYPRE_PARCSRFLEXGMRESSETMAXITER) ( hypre_F90_Obj *solver, hypre_F90_Int *max_iter, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_ParCSRFlexGMRESSetMaxIter( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassInt (max_iter) ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRFlexGMRESSetPrecond *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_parcsrflexgmressetprecond, HYPRE_PARCSRFLEXGMRESSETPRECOND) ( hypre_F90_Obj *solver, hypre_F90_Int *precond_id, hypre_F90_Obj *precond_solver, hypre_F90_Int *ierr ) { /*------------------------------------------------------------ * The precond_id flags mean : * 0 - no preconditioner * 1 - set up a ds preconditioner * 2 - set up an amg preconditioner * 3 - set up a pilut preconditioner * 4 - set up a parasails preconditioner * 5 - set up a Euclid preconditioner * 6 - set up a ILU preconditioner * 7 - set up a MGR preconditioner *------------------------------------------------------------*/ if (*precond_id == 0) { *ierr = 0; } else if (*precond_id == 1) { *ierr = (hypre_F90_Int) ( HYPRE_ParCSRFlexGMRESSetPrecond( hypre_F90_PassObj (HYPRE_Solver, solver), HYPRE_ParCSRDiagScale, HYPRE_ParCSRDiagScaleSetup, NULL ) ); } else if (*precond_id == 2) { *ierr = (hypre_F90_Int) ( HYPRE_ParCSRFlexGMRESSetPrecond( hypre_F90_PassObj (HYPRE_Solver, solver), HYPRE_BoomerAMGSolve, HYPRE_BoomerAMGSetup, (HYPRE_Solver) * precond_solver ) ); } else if (*precond_id == 3) { *ierr = (hypre_F90_Int) ( HYPRE_ParCSRFlexGMRESSetPrecond( hypre_F90_PassObj (HYPRE_Solver, solver), HYPRE_ParCSRPilutSolve, HYPRE_ParCSRPilutSetup, (HYPRE_Solver) * precond_solver ) ); } else if (*precond_id == 4) { *ierr = (hypre_F90_Int) ( HYPRE_ParCSRFlexGMRESSetPrecond( hypre_F90_PassObj (HYPRE_Solver, solver), HYPRE_ParCSRParaSailsSolve, HYPRE_ParCSRParaSailsSetup, (HYPRE_Solver) * precond_solver ) ); } else if (*precond_id == 5) { *ierr = (hypre_F90_Int) ( HYPRE_ParCSRFlexGMRESSetPrecond( hypre_F90_PassObj (HYPRE_Solver, solver), HYPRE_EuclidSolve, HYPRE_EuclidSetup, (HYPRE_Solver) * precond_solver ) ); } else if (*precond_id == 6) { *ierr = (hypre_F90_Int) ( HYPRE_ParCSRFlexGMRESSetPrecond( hypre_F90_PassObj (HYPRE_Solver, solver), HYPRE_ILUSolve, HYPRE_ILUSetup, (HYPRE_Solver) * precond_solver ) ); } else if (*precond_id == 7) { *ierr = (hypre_F90_Int) ( HYPRE_ParCSRFlexGMRESSetPrecond( hypre_F90_PassObj (HYPRE_Solver, solver), HYPRE_MGRSolve, HYPRE_MGRSetup, (HYPRE_Solver) * precond_solver ) ); } else { *ierr = -1; } } /*-------------------------------------------------------------------------- * HYPRE_ParCSRFlexGMRESGetPrecond *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_parcsrflexgmresgetprecond, HYPRE_PARCSRFLEXGMRESGETPRECOND) ( hypre_F90_Obj *solver, hypre_F90_Obj *precond_solver_ptr, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_ParCSRFlexGMRESGetPrecond( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassObjRef (HYPRE_Solver, precond_solver_ptr) ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRFlexGMRESSetLogging *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_parcsrflexgmressetlogging, HYPRE_PARCSRFLEXGMRESSETLOGGING) ( hypre_F90_Obj *solver, hypre_F90_Int *logging, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_ParCSRFlexGMRESSetLogging( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassInt (logging) ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRFlexGMRESSetPrintLevel *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_parcsrflexgmressetprintlevel, HYPRE_PARCSRFLEXGMRESSETPRINTLEVEL) ( hypre_F90_Obj *solver, hypre_F90_Int *print_level, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_ParCSRFlexGMRESSetPrintLevel( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassInt (print_level) ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRFlexGMRESGetNumIterations *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_parcsrflexgmresgetnumiteratio, HYPRE_PARCSRFLEXGMRESGETNUMITERATIO) ( hypre_F90_Obj *solver, hypre_F90_Int *num_iterations, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_ParCSRFlexGMRESGetNumIterations( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassIntRef (num_iterations) ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRFlexGMRESGetFinalRelativeResidualNorm *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_parcsrflexgmresgetfinalrelati, HYPRE_PARCSRFLEXGMRESGETFINALRELATI) ( hypre_F90_Obj *solver, hypre_F90_Real *norm, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_ParCSRFlexGMRESGetFinalRelativeResidualNorm( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassRealRef (norm) ) ); } #ifdef __cplusplus } #endif hypre-2.33.0/src/parcsr_ls/F90_HYPRE_parcsr_gmres.c000066400000000000000000000275271477326011500217500ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * HYPRE_ParCSRGMRES Fortran interface * *****************************************************************************/ #include "_hypre_parcsr_ls.h" #include "fortran.h" #ifdef __cplusplus extern "C" { #endif /*-------------------------------------------------------------------------- * HYPRE_ParCSRGMRESCreate *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_parcsrgmrescreate, HYPRE_PARCSRGMRESCREATE) ( hypre_F90_Comm *comm, hypre_F90_Obj *solver, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_ParCSRGMRESCreate( hypre_F90_PassComm (comm), hypre_F90_PassObjRef (HYPRE_Solver, solver) ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRGMRESDestroy *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_parcsrgmresdestroy, HYPRE_PARCSRGMRESDESTROY) ( hypre_F90_Obj *solver, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_ParCSRGMRESDestroy( hypre_F90_PassObj (HYPRE_Solver, solver) ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRGMRESSetup *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_parcsrgmressetup, HYPRE_PARCSRGMRESSETUP) ( hypre_F90_Obj *solver, hypre_F90_Obj *A, hypre_F90_Obj *b, hypre_F90_Obj *x, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_ParCSRGMRESSetup( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassObj (HYPRE_ParCSRMatrix, A), hypre_F90_PassObj (HYPRE_ParVector, b), hypre_F90_PassObj (HYPRE_ParVector, x) ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRGMRESSolve *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_parcsrgmressolve, HYPRE_PARCSRGMRESSOLVE) ( hypre_F90_Obj *solver, hypre_F90_Obj *A, hypre_F90_Obj *b, hypre_F90_Obj *x, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_ParCSRGMRESSolve( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassObj (HYPRE_ParCSRMatrix, A), hypre_F90_PassObj (HYPRE_ParVector, b), hypre_F90_PassObj (HYPRE_ParVector, x) ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRGMRESSetKDim *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_parcsrgmressetkdim, HYPRE_PARCSRGMRESSETKDIM) ( hypre_F90_Obj *solver, hypre_F90_Int *kdim, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_ParCSRGMRESSetKDim( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassInt (kdim) ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRGMRESSetTol *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_parcsrgmressettol, HYPRE_PARCSRGMRESSETTOL) ( hypre_F90_Obj *solver, hypre_F90_Real *tol, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_ParCSRGMRESSetTol( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassReal (tol) ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRGMRESSetAbsoluteTol *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_parcsrgmressetabsolutetol, HYPRE_PARCSRGMRESSETABSOLUTETOL) ( hypre_F90_Obj *solver, hypre_F90_Real *tol, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_ParCSRGMRESSetAbsoluteTol( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassReal (tol) ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRGMRESSetMinIter *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_parcsrgmressetminiter, HYPRE_PARCSRGMRESSETMINITER) ( hypre_F90_Obj *solver, hypre_F90_Int *min_iter, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_ParCSRGMRESSetMinIter( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassInt (min_iter) ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRGMRESSetMaxIter *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_parcsrgmressetmaxiter, HYPRE_PARCSRGMRESSETMAXITER) ( hypre_F90_Obj *solver, hypre_F90_Int *max_iter, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_ParCSRGMRESSetMaxIter( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassInt (max_iter) ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRGMRESSetStopCrit *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_parcsrgmressetstopcrit, HYPRE_PARCSRGMRESSETSTOPCRIT) ( hypre_F90_Obj *solver, hypre_F90_Int *stop_crit, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_ParCSRGMRESSetStopCrit( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassInt (stop_crit) ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRGMRESSetPrecond *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_parcsrgmressetprecond, HYPRE_PARCSRGMRESSETPRECOND) ( hypre_F90_Obj *solver, hypre_F90_Int *precond_id, hypre_F90_Obj *precond_solver, hypre_F90_Int *ierr ) { /*------------------------------------------------------------ * The precond_id flags mean : * 0 - no preconditioner * 1 - set up a ds preconditioner * 2 - set up an amg preconditioner * 3 - set up a pilut preconditioner * 4 - set up a parasails preconditioner * 5 - set up a Euclid preconditioner * 6 - set up a ILU preconditioner * 7 - set up a MGR preconditioner *------------------------------------------------------------*/ if (*precond_id == 0) { *ierr = 0; } else if (*precond_id == 1) { *ierr = (hypre_F90_Int) ( HYPRE_ParCSRGMRESSetPrecond( hypre_F90_PassObj (HYPRE_Solver, solver), HYPRE_ParCSRDiagScale, HYPRE_ParCSRDiagScaleSetup, NULL ) ); } else if (*precond_id == 2) { *ierr = (hypre_F90_Int) ( HYPRE_ParCSRGMRESSetPrecond( hypre_F90_PassObj (HYPRE_Solver, solver), HYPRE_BoomerAMGSolve, HYPRE_BoomerAMGSetup, (HYPRE_Solver) * precond_solver ) ); } else if (*precond_id == 3) { *ierr = (hypre_F90_Int) ( HYPRE_ParCSRGMRESSetPrecond( hypre_F90_PassObj (HYPRE_Solver, solver), HYPRE_ParCSRPilutSolve, HYPRE_ParCSRPilutSetup, (HYPRE_Solver) * precond_solver ) ); } else if (*precond_id == 4) { *ierr = (hypre_F90_Int) ( HYPRE_ParCSRGMRESSetPrecond( hypre_F90_PassObj (HYPRE_Solver, solver), HYPRE_ParCSRParaSailsSolve, HYPRE_ParCSRParaSailsSetup, (HYPRE_Solver) * precond_solver ) ); } else if (*precond_id == 5) { *ierr = (hypre_F90_Int) ( HYPRE_ParCSRGMRESSetPrecond( hypre_F90_PassObj (HYPRE_Solver, solver), HYPRE_EuclidSolve, HYPRE_EuclidSetup, (HYPRE_Solver) * precond_solver ) ); } else if (*precond_id == 6) { *ierr = (hypre_F90_Int) ( HYPRE_ParCSRGMRESSetPrecond( hypre_F90_PassObj (HYPRE_Solver, solver), HYPRE_ILUSolve, HYPRE_ILUSetup, (HYPRE_Solver) * precond_solver ) ); } else if (*precond_id == 7) { *ierr = (hypre_F90_Int) ( HYPRE_ParCSRGMRESSetPrecond( hypre_F90_PassObj (HYPRE_Solver, solver), HYPRE_MGRSolve, HYPRE_MGRSetup, (HYPRE_Solver) * precond_solver ) ); } else { *ierr = -1; } } /*-------------------------------------------------------------------------- * HYPRE_ParCSRGMRESGetPrecond *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_parcsrgmresgetprecond, HYPRE_PARCSRGMRESGETPRECOND) ( hypre_F90_Obj *solver, hypre_F90_Obj *precond_solver_ptr, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_ParCSRGMRESGetPrecond( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassObjRef (HYPRE_Solver, precond_solver_ptr) ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRGMRESSetLogging *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_parcsrgmressetlogging, HYPRE_PARCSRGMRESSETLOGGING) ( hypre_F90_Obj *solver, hypre_F90_Int *logging, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_ParCSRGMRESSetLogging( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassInt (logging) ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRGMRESSetPrintLevel *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_parcsrgmressetprintlevel, HYPRE_PARCSRGMRESSETPRINTLEVEL) ( hypre_F90_Obj *solver, hypre_F90_Int *print_level, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_ParCSRGMRESSetPrintLevel( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassInt (print_level) ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRGMRESGetNumIterations *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_parcsrgmresgetnumiteratio, HYPRE_PARCSRGMRESGETNUMITERATIO) ( hypre_F90_Obj *solver, hypre_F90_Int *num_iterations, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_ParCSRGMRESGetNumIterations( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassIntRef (num_iterations) ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRGMRESGetFinalRelativeResidualNorm *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_parcsrgmresgetfinalrelati, HYPRE_PARCSRGMRESGETFINALRELATI) ( hypre_F90_Obj *solver, hypre_F90_Real *norm, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_ParCSRGMRESGetFinalRelativeResidualNorm( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassRealRef (norm) ) ); } #ifdef __cplusplus } #endif hypre-2.33.0/src/parcsr_ls/F90_HYPRE_parcsr_hybrid.c000066400000000000000000000734731477326011500221150ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * HYPRE_ParCSRHybrid Fortran Interface * *****************************************************************************/ #include "_hypre_parcsr_ls.h" #include "fortran.h" #ifdef __cplusplus extern "C" { #endif /*-------------------------------------------------------------------------- * HYPRE_ParCSRHybridCreate *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_parcsrhybridcreate, HYPRE_PARCSRHYBRIDCREATE) (hypre_F90_Obj *solver, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) (HYPRE_ParCSRHybridCreate( hypre_F90_PassObjRef (HYPRE_Solver, solver) )); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRHybridDestroy *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_parcsrhybriddestroy, HYPRE_PARCSRHYBRIDDESTROY) (hypre_F90_Obj *solver, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) (HYPRE_ParCSRHybridDestroy( hypre_F90_PassObj (HYPRE_Solver, solver) ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRHybridSetup *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_parcsrhybridsetup, HYPRE_PARCSRHYBRIDSETUP) (hypre_F90_Obj *solver, hypre_F90_Obj *A, hypre_F90_Obj *b, hypre_F90_Obj *x, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) (HYPRE_ParCSRHybridSetup( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassObj (HYPRE_ParCSRMatrix, A), hypre_F90_PassObj (HYPRE_ParVector, b), hypre_F90_PassObj (HYPRE_ParVector, x) ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRHybridSolve *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_parcsrhybridsolve, HYPRE_PARCSRHYBRIDSOLVE) (hypre_F90_Obj *solver, hypre_F90_Obj *A, hypre_F90_Obj *b, hypre_F90_Obj *x, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) (HYPRE_ParCSRHybridSolve( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassObj (HYPRE_ParCSRMatrix, A), hypre_F90_PassObj (HYPRE_ParVector, b), hypre_F90_PassObj (HYPRE_ParVector, x) ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRHybridSetTol *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_parcsrhybridsettol, HYPRE_PARCSRHYBRIDSETTOL) (hypre_F90_Obj *solver, hypre_F90_Real *tol, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) (HYPRE_ParCSRHybridSetTol( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassReal (tol) ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRHybridSetConvergenceTol *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_parcsrhybridsetconvergenc, HYPRE_PARCSRHYBRIDSETCONVERGENC) (hypre_F90_Obj *solver, hypre_F90_Real *cf_tol, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) (HYPRE_ParCSRHybridSetConvergenceTol( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassReal (cf_tol) ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRHybridSetDSCGMaxIter *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_parcsrhybridsetdscgmaxite, HYPRE_PARCSRHYBRIDSETDSCGMAXITE) (hypre_F90_Obj *solver, hypre_F90_Int *dscg_max_its, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) (HYPRE_ParCSRHybridSetDSCGMaxIter( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassInt (dscg_max_its) ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRHybridSetPCGMaxIter *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_parcsrhybridsetpcgmaxiter, HYPRE_PARCSRHYBRIDSETPCGMAXITER) (hypre_F90_Obj *solver, hypre_F90_Int *pcg_max_its, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) (HYPRE_ParCSRHybridSetPCGMaxIter( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassInt (pcg_max_its) ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRHybridSetSolverType *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_parcsrhybridsetsolvertype, HYPRE_PARCSRHYBRIDSETSOLVERTYPE) (hypre_F90_Obj *solver, hypre_F90_Int *solver_type, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) (HYPRE_ParCSRHybridSetSolverType( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassInt (solver_type) ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRHybridSetKDim *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_parcsrhybridsetkdim, HYPRE_PARCSRHYBRIDSETKDIM) (hypre_F90_Obj *solver, hypre_F90_Int *kdim, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) (HYPRE_ParCSRHybridSetKDim( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassInt (kdim) ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRHybridSetTwoNorm *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_parcsrhybridsettwonorm, HYPRE_PARCSRHYBRIDSETTWONORM) (hypre_F90_Obj *solver, hypre_F90_Int *two_norm, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) (HYPRE_ParCSRHybridSetTwoNorm( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassInt (two_norm) ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRHybridSetStopCrit *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_parcsrhybridsetstopcrit, HYPRE_PARCSRHYBRIDSETSTOPCRIT) (hypre_F90_Obj *solver, hypre_F90_Int *stop_crit, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) (HYPRE_ParCSRHybridSetStopCrit( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassInt (stop_crit) ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRHybridSetRelChange *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_parcsrhybridsetrelchange, HYPRE_PARCSRHYBRIDSETRELCHANGE) (hypre_F90_Obj *solver, hypre_F90_Int *rel_change, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) (HYPRE_ParCSRHybridSetRelChange( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassInt (rel_change) ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRHybridSetPrecond *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_parcsrhybridsetprecond, HYPRE_PARCSRHYBRIDSETPRECOND) (hypre_F90_Obj *solver, hypre_F90_Int *precond_id, hypre_F90_Obj *precond_solver, hypre_F90_Int *ierr) { /*---------------------------------------------------------------- * precond_id definitions * 0 - no preconditioner * 1 - use diagscale preconditioner * 2 - use amg preconditioner * 3 - use pilut preconditioner * 4 - use parasails preconditioner * 5 - use Euclid preconditioner * 6 - use ILU preconditioner * 7 - use MGR preconditioner *---------------------------------------------------------------*/ if (*precond_id == 0) { *ierr = 0; } else if (*precond_id == 1) { *ierr = (hypre_F90_Int) (HYPRE_ParCSRHybridSetPrecond( hypre_F90_PassObj (HYPRE_Solver, solver), HYPRE_ParCSRDiagScale, HYPRE_ParCSRDiagScaleSetup, NULL )); } else if (*precond_id == 2) { *ierr = (hypre_F90_Int) (HYPRE_ParCSRHybridSetPrecond( hypre_F90_PassObj (HYPRE_Solver, solver), HYPRE_BoomerAMGSolve, HYPRE_BoomerAMGSetup, (HYPRE_Solver) * precond_solver )); } else if (*precond_id == 3) { *ierr = (hypre_F90_Int) (HYPRE_ParCSRHybridSetPrecond( hypre_F90_PassObj (HYPRE_Solver, solver), HYPRE_ParCSRPilutSolve, HYPRE_ParCSRPilutSetup, (HYPRE_Solver) * precond_solver )); } else if (*precond_id == 4) { *ierr = (hypre_F90_Int) (HYPRE_ParCSRHybridSetPrecond( hypre_F90_PassObj (HYPRE_Solver, solver), HYPRE_ParCSRParaSailsSolve, HYPRE_ParCSRParaSailsSetup, (HYPRE_Solver) * precond_solver )); } else if (*precond_id == 5) { *ierr = (hypre_F90_Int) (HYPRE_ParCSRHybridSetPrecond( hypre_F90_PassObj (HYPRE_Solver, solver), HYPRE_EuclidSolve, HYPRE_EuclidSetup, (HYPRE_Solver) * precond_solver )); } else if (*precond_id == 6) { *ierr = (hypre_F90_Int) ( HYPRE_ParCSRHybridSetPrecond( hypre_F90_PassObj (HYPRE_Solver, solver), HYPRE_ILUSolve, HYPRE_ILUSetup, (HYPRE_Solver) * precond_solver ) ); } else if (*precond_id == 7) { *ierr = (hypre_F90_Int) ( HYPRE_ParCSRHybridSetPrecond( hypre_F90_PassObj (HYPRE_Solver, solver), HYPRE_MGRSolve, HYPRE_MGRSetup, (HYPRE_Solver) * precond_solver ) ); } else { *ierr = -1; } } /*-------------------------------------------------------------------------- * HYPRE_ParCSRHybridSetLogging *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_parcsrhybridsetlogging, HYPRE_PARCSRHYBRIDSETLOGGING) (hypre_F90_Obj *solver, hypre_F90_Int *logging, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) (HYPRE_ParCSRHybridSetLogging( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassInt (logging) ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRHybridSetPrintLevel *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_parcsrhybridsetprintlevel, HYPRE_PARCSRHYBRIDSETPRINTLEVEL) (hypre_F90_Obj *solver, hypre_F90_Int *print_level, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) (HYPRE_ParCSRHybridSetPrintLevel( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassInt (print_level) )); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRHybridSetStrongThreshold *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_parcsrhybridsetstrongthre, HYPRE_PARCSRHYBRIDSETSTRONGTHRE) (hypre_F90_Obj *solver, hypre_F90_Real *strong_threshold, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) (HYPRE_ParCSRHybridSetStrongThreshold( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassReal (strong_threshold) )); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRHybridSetMaxRowSum *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_parcsrhybridsetmaxrowsum, HYPRE_PARCSRHYBRIDSETMAXROWSUM) (hypre_F90_Obj *solver, hypre_F90_Real *max_row_sum, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) (HYPRE_ParCSRHybridSetMaxRowSum( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassReal (max_row_sum) )); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRHybridSetTruncFactor *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_parcsrhybridsettruncfacto, HYPRE_PARCSRHYBRIDSETTRUNCFACTO) (hypre_F90_Obj *solver, hypre_F90_Real *trunc_factor, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) (HYPRE_ParCSRHybridSetTruncFactor( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassReal (trunc_factor) )); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRHybridSetPMaxElmts *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_parcsrhybridsetpmaxelmts, HYPRE_PARCSRHYBRIDSETPMAXELMTS) (hypre_F90_Obj *solver, hypre_F90_Int *p_max_elmts, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) (HYPRE_ParCSRHybridSetPMaxElmts( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassInt (p_max_elmts) )); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRHybridSetMaxLevels *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_parcsrhybridsetmaxlevels, HYPRE_PARCSRHYBRIDSETMAXLEVELS) (hypre_F90_Obj *solver, hypre_F90_Int *max_levels, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) (HYPRE_ParCSRHybridSetMaxLevels( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassInt (max_levels) )); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRHybridSetMeasureType *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_parcsrhybridsetmeasuretyp, HYPRE_PARCSRHYBRIDSETMEASURETYP) (hypre_F90_Obj *solver, hypre_F90_Int *measure_type, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) (HYPRE_ParCSRHybridSetMeasureType( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassInt (measure_type) )); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRHybridSetCoarsenType *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_parcsrhybridsetcoarsentyp, HYPRE_PARCSRHYBRIDSETCOARSENTYP) (hypre_F90_Obj *solver, hypre_F90_Int *coarsen_type, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) (HYPRE_ParCSRHybridSetCoarsenType( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassInt (coarsen_type) )); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRHybridSetInterpType *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_parcsrhybridsetinterptyp, HYPRE_PARCSRHYBRIDSETINTERPTYP) (hypre_F90_Obj *solver, hypre_F90_Int *interp_type, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) (HYPRE_ParCSRHybridSetCoarsenType( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassInt (interp_type) )); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRHybridSetCycleType *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_parcsrhybridsetcycletype, HYPRE_PARCSRHYBRIDSETCYCLETYPE) (hypre_F90_Obj *solver, hypre_F90_Int *cycle_type, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) (HYPRE_ParCSRHybridSetCycleType( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassInt (cycle_type) )); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRHybridSetNumGridSweeps *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_parcsrhybridsetnumgridswe, HYPRE_PARCSRHYBRIDSETNUMGRIDSWE) (hypre_F90_Obj *solver, hypre_F90_IntArray *num_grid_sweeps, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) (HYPRE_ParCSRHybridSetNumGridSweeps( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassIntArray (num_grid_sweeps) )); } /*------------------------------------------------------------------------ * HYPRE_ParCSRHybridSetGridRelaxType *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_parcsrhybridsetgridrelaxt, HYPRE_PARCSRHYBRIDSETGRIDRELAXT) (hypre_F90_Obj *solver, hypre_F90_IntArray *grid_relax_type, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) (HYPRE_ParCSRHybridSetGridRelaxType( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassIntArray (grid_relax_type) )); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRHybridSetGridRelaxPoints *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_parcsrhybridsetgridrelaxp, HYPRE_PARCSRHYBRIDSETGRIDRELAXP) (hypre_F90_Obj *solver, hypre_F90_Int *grid_relax_points, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) (HYPRE_ParCSRHybridSetGridRelaxPoints( hypre_F90_PassObj (HYPRE_Solver, solver), (HYPRE_Int **) grid_relax_points )); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRHybridSetNumSweeps *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_parcsrhybridsetnumsweeps, HYPRE_PARCSRHYBRIDSETNUMSWEEPS) (hypre_F90_Obj *solver, hypre_F90_Int *num_sweeps, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) (HYPRE_ParCSRHybridSetNumSweeps( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassInt (num_sweeps) )); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRHybridSetCycleNumSweeps *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_parcsrhybridsetcyclenumsw, HYPRE_PARCSRHYBRIDSETCYCLENUMSW) (hypre_F90_Obj *solver, hypre_F90_Int *num_sweeps, hypre_F90_Int *k, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) (HYPRE_ParCSRHybridSetCycleNumSweeps( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassInt (num_sweeps), hypre_F90_PassInt (k) )); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRHybridSetRelaxType *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_parcsrhybridsetrelaxtype, HYPRE_PARCSRHYBRIDSETRELAXTYPE) (hypre_F90_Obj *solver, hypre_F90_Int *relax_type, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) (HYPRE_ParCSRHybridSetRelaxType( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassInt (relax_type) )); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRHybridSetCycleRelaxType *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_parcsrhybridsetcyclerelax, HYPRE_PARCSRHYBRIDSETCYCLERELAX) (hypre_F90_Obj *solver, hypre_F90_Int *relax_type, hypre_F90_Int *k, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) (HYPRE_ParCSRHybridSetCycleRelaxType( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassInt (relax_type), hypre_F90_PassInt (k) )); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRHybridSetAggNumLevels *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_parcsrhybridsetaggnumlev, HYPRE_PARCSRHYBRIDSETAGGNUMLEV) (hypre_F90_Obj *solver, hypre_F90_Int *agg_nl, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) (HYPRE_ParCSRHybridSetAggNumLevels( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassInt (agg_nl) )); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRHybridSetNumPaths *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_parcsrhybridsetnumpaths, HYPRE_PARCSRHYBRIDSETNUMPATHS) (hypre_F90_Obj *solver, hypre_F90_Int *num_paths, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) (HYPRE_ParCSRHybridSetNumPaths( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassInt (num_paths) )); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRHybridSetNumFunctions *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_parcsrhybridsetnumfunc, HYPRE_PARCSRHYBRIDSETNUMFUNC) (hypre_F90_Obj *solver, hypre_F90_Int *num_fun, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) (HYPRE_ParCSRHybridSetNumFunctions( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassInt (num_fun) )); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRHybridSetNodal *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_parcsrhybridsetnodal, HYPRE_PARCSRHYBRIDSETNODAL) (hypre_F90_Obj *solver, hypre_F90_Int *nodal, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) (HYPRE_ParCSRHybridSetNodal( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassInt (nodal) )); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRHybridSetKeepTranspose *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_parcsrhybridsetkeeptrans, HYPRE_PARCSRHYBRIDSETKEEPTRANS) (hypre_F90_Obj *solver, hypre_F90_Int *keepT, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) (HYPRE_ParCSRHybridSetKeepTranspose( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassInt (keepT) )); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRHybridSetDofFunc *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_parcsrhybridsetdoffunc, HYPRE_PARCSRHYBRIDSETDOFFUNC) (hypre_F90_Obj *solver, hypre_F90_IntArray *dof_func, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) (HYPRE_ParCSRHybridSetDofFunc( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassIntArray (dof_func) )); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRHybridSetNonGalerkinTol *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_parcsrhybridsetnongaltol, HYPRE_PARCSRHYBRIDSETNONGALTOL) (hypre_F90_Obj *solver, hypre_F90_Int *ng_num_tol, hypre_F90_RealArray *nongal_tol, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) (HYPRE_ParCSRHybridSetNonGalerkinTol( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassInt (ng_num_tol), hypre_F90_PassRealArray (nongal_tol) )); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRHybridSetRelaxOrder *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_parcsrhybridsetrelaxorder, HYPRE_PARCSRHYBRIDSETRELAXORDER) (hypre_F90_Obj *solver, hypre_F90_Int *relax_order, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) (HYPRE_ParCSRHybridSetRelaxOrder( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassInt (relax_order) )); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRHybridSetRelaxWt *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_parcsrhybridsetrelaxwt, HYPRE_PARCSRHYBRIDSETRELAXWT) (hypre_F90_Obj *solver, hypre_F90_Real *relax_wt, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) (HYPRE_ParCSRHybridSetRelaxWt( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassReal (relax_wt) )); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRHybridSetLevelRelaxWt *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_parcsrhybridsetlevelrelax, HYPRE_PARCSRHYBRIDSETLEVELRELAX) (hypre_F90_Obj *solver, hypre_F90_Real *relax_wt, hypre_F90_Int *level, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) (HYPRE_ParCSRHybridSetLevelRelaxWt( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassReal (relax_wt), hypre_F90_PassInt (level) )); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRHybridSetOuterWt *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_parcsrhybridsetouterwt, HYPRE_PARCSRHYBRIDSETOUTERWT) (hypre_F90_Obj *solver, hypre_F90_Real *outer_wt, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) (HYPRE_ParCSRHybridSetOuterWt( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassReal (outer_wt) )); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRHybridSetLevelOuterWt *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_parcsrhybridsetlevelouter, HYPRE_PARCSRHYBRIDSETLEVELOUTER) (hypre_F90_Obj *solver, hypre_F90_Real *outer_wt, hypre_F90_Int *level, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) (HYPRE_ParCSRHybridSetLevelOuterWt( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassReal (outer_wt), hypre_F90_PassInt (level) )); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRHybridSetRelaxWeight *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_parcsrhybridsetrelaxweigh, HYPRE_PARCSRHYBRIDSETRELAXWEIGH) (hypre_F90_Obj *solver, hypre_F90_RealArray *relax_weight, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) (HYPRE_ParCSRHybridSetRelaxWeight( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassRealArray (relax_weight) )); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRHybridSetOmega *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_parcsrhybridsetomega, HYPRE_PARCSRHYBRIDSETOMEGA) (hypre_F90_Obj *solver, hypre_F90_RealArray *omega, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) (HYPRE_ParCSRHybridSetOmega( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassRealArray (omega) )); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRHybridGetNumIterations *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_parcsrhybridgetnumiterati, HYPRE_PARCSRHYBRIDGETNUMITERATI) (hypre_F90_Obj *solver, hypre_F90_Int *num_its, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) (HYPRE_ParCSRHybridGetNumIterations( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassIntRef (num_its) )); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRHybridGetDSCGNumIterations *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_parcsrhybridgetdscgnumite, HYPRE_PARCSRHYBRIDGETDSCGNUMITE) (hypre_F90_Obj *solver, hypre_F90_Int *dscg_num_its, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) (HYPRE_ParCSRHybridGetDSCGNumIterations( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassIntRef (dscg_num_its) )); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRHybridGetPCGNumIterations *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_parcsrhybridgetpcgnumiter, HYPRE_PARCSRHYBRIDGETPCGNUMITER) (hypre_F90_Obj *solver, hypre_F90_Int *pcg_num_its, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) (HYPRE_ParCSRHybridGetPCGNumIterations( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassIntRef (pcg_num_its) )); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRHybridGetFinalRelativeResidualNorm *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_parcsrhybridgetfinalrelat, HYPRE_PARCSRHYBRIDGETFINALRELAT) (hypre_F90_Obj *solver, hypre_F90_Real *norm, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) (HYPRE_ParCSRHybridGetFinalRelativeResidualNorm( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassRealRef (norm) )); } #ifdef __cplusplus } #endif hypre-2.33.0/src/parcsr_ls/F90_HYPRE_parcsr_ilu.c000066400000000000000000000233431477326011500214140ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * HYPRE_ILU Fortran interface * *****************************************************************************/ #include "_hypre_parcsr_ls.h" #include "fortran.h" #ifdef __cplusplus extern "C" { #endif /*-------------------------------------------------------------------------- * HYPRE_ILUCreate *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_ilucreate, HYPRE_ILUCREATE) ( hypre_F90_Obj *solver, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_ILUCreate( hypre_F90_PassObjRef (HYPRE_Solver, solver) ) ); } /*-------------------------------------------------------------------------- * HYPRE_ILUDestroy *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_iludestroy, HYPRE_ILUDESTROY) ( hypre_F90_Obj *solver, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_ILUDestroy( hypre_F90_PassObj (HYPRE_Solver, solver) ) ); } /*-------------------------------------------------------------------------- * HYPRE_ILUSetup *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_ilusetup, HYPRE_ILUSETUP) ( hypre_F90_Obj *solver, hypre_F90_Obj *A, hypre_F90_Obj *b, hypre_F90_Obj *x, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_ILUSetup( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassObj (HYPRE_ParCSRMatrix, A), hypre_F90_PassObj (HYPRE_ParVector, b), hypre_F90_PassObj (HYPRE_ParVector, x) ) ); } /*-------------------------------------------------------------------------- * HYPRE_ILUSolve *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_ilusolve, HYPRE_ILUSOLVE) ( hypre_F90_Obj *solver, hypre_F90_Obj *A, hypre_F90_Obj *b, hypre_F90_Obj *x, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_ILUSolve( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassObj (HYPRE_ParCSRMatrix, A), hypre_F90_PassObj (HYPRE_ParVector, b), hypre_F90_PassObj (HYPRE_ParVector, x) ) ); } /*-------------------------------------------------------------------------- * HYPRE_ILUSetPrintLevel *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_ilusetprintlevel, HYPRE_ILUSETPRINTLEVEL) ( hypre_F90_Obj *solver, hypre_F90_Int *print_level, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_ILUSetPrintLevel( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassInt (print_level) ) ); } /*-------------------------------------------------------------------------- * HYPRE_ILUSetLogging *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_ilusetlogging, HYPRE_ILUSETLOGGING) ( hypre_F90_Obj *solver, hypre_F90_Int *logging, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_ILUSetLogging( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassInt (logging) ) ); } /*-------------------------------------------------------------------------- * HYPRE_ILUSetMaxIter *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_ilusetmaxiter, HYPRE_ILUSETMAXITER) ( hypre_F90_Obj *solver, hypre_F90_Int *max_iter, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_ILUSetMaxIter( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassInt (max_iter) ) ); } /*-------------------------------------------------------------------------- * HYPRE_ILUSetTol *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_ilusettol, HYPRE_ILUSETTOL) ( hypre_F90_Obj *solver, hypre_F90_Real *tol, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_ILUSetTol( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassReal (tol) ) ); } /*-------------------------------------------------------------------------- * HYPRE_ILUSetDropThreshold *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_ilusetdropthreshold, HYPRE_ILUSETDROPTHRESHOLD) ( hypre_F90_Obj *solver, hypre_F90_Real *threshold, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_ILUSetDropThreshold( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassReal (threshold) ) ); } /*-------------------------------------------------------------------------- * HYPRE_ILUSetDropThresholdArray *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_ilusetdropthresholdarray, HYPRE_ILUSETDROPTHRESHOLDARRAY) ( hypre_F90_Obj *solver, hypre_F90_RealArray *threshold, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_ILUSetDropThresholdArray( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassRealArray (threshold) ) ); } /*-------------------------------------------------------------------------- * HYPRE_ILUSetNSHDropThreshold *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_ilusetnshdropthreshold, HYPRE_ILUSETNSHDROPTHRESHOLD) ( hypre_F90_Obj *solver, hypre_F90_Real *threshold, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_ILUSetNSHDropThreshold( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassReal (threshold) ) ); } /*-------------------------------------------------------------------------- * HYPRE_ILUSetSchurMaxIter *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_ilusetschurmaxiter, HYPRE_ILUSETSCHURMAXITER) ( hypre_F90_Obj *solver, hypre_F90_Int *ss_max_iter, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_ILUSetMaxIter( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassInt (ss_max_iter) ) ); } /*-------------------------------------------------------------------------- * HYPRE_ILUSetMaxNnzPerRow *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_ilusetmaxnnzperrow, HYPRE_ILUSETMAXNNZPERROW) ( hypre_F90_Obj *solver, hypre_F90_Int *nzmax, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_ILUSetMaxNnzPerRow( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassInt (nzmax) ) ); } /*-------------------------------------------------------------------------- * HYPRE_ILUSetLevelOfFill *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_ilusetleveloffill, HYPRE_ILUSETLEVELOFFILL) ( hypre_F90_Obj *solver, hypre_F90_Int *lfil, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_ILUSetMaxNnzPerRow( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassInt (lfil) ) ); } /*-------------------------------------------------------------------------- * HYPRE_ILUSetType *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_ilusettype, HYPRE_ILUSETTYPE) ( hypre_F90_Obj *solver, hypre_F90_Int *ilu_type, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_ILUSetType( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassInt (ilu_type) ) ); } /*-------------------------------------------------------------------------- * HYPRE_ILUSetLocalReordering *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_ilusetlocalreordering, HYPRE_ILUSETLOCALREORDERING) ( hypre_F90_Obj *solver, hypre_F90_Int *ordering_type, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_ILUSetType( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassInt (ordering_type) ) ); } /*-------------------------------------------------------------------------- * HYPRE_ILUGetNumIterations *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_ilugetnumiterations, HYPRE_ILUGETNUMITERATIONS) ( hypre_F90_Obj *solver, hypre_F90_Int *num_iterations, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_ILUGetNumIterations( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassIntRef (num_iterations) ) ); } /*-------------------------------------------------------------------------- * HYPRE_ILUGetFinalRelResNorm *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_ilugetfinalrelresnorm, HYPRE_ILUGETFINALRELRESNORM) ( hypre_F90_Obj *solver, hypre_F90_Real *res_norm, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_ILUGetFinalRelativeResidualNorm( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassRealRef (res_norm) ) ); } #ifdef __cplusplus } #endif hypre-2.33.0/src/parcsr_ls/F90_HYPRE_parcsr_int.c000066400000000000000000000114061477326011500214120ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * HYPRE_ParCSRint Fortran interface * *****************************************************************************/ #include "_hypre_parcsr_ls.h" #include "fortran.h" #ifdef __cplusplus extern "C" { #endif HYPRE_Int hypre_ParVectorSize( void *x ); HYPRE_Int aux_maskCount( HYPRE_Int n, hypre_F90_Int *mask ); void aux_indexFromMask( HYPRE_Int n, hypre_F90_Int *mask, hypre_F90_Int *index ); /*-------------------------------------------------------------------------- * hypre_ParSetRandomValues *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_parsetrandomvalues, HYPRE_PARSETRANDOMVALUES) (hypre_F90_Obj *v, hypre_F90_Int *seed, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) ( HYPRE_ParVectorSetRandomValues( hypre_F90_PassObj (HYPRE_ParVector, v), hypre_F90_PassInt (seed))); } /*-------------------------------------------------------------------------- * hypre_ParPrintVector *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_parprintvector, HYPRE_PARPRINTVECTOR) (hypre_F90_Obj *v, char *file, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) ( hypre_ParVectorPrint( (hypre_ParVector *) v, (char *) file)); } /*-------------------------------------------------------------------------- * hypre_ParReadVector *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_parreadvector, HYPRE_PARREADVECTOR) (hypre_F90_Comm *comm, char *file, hypre_F90_Int *ierr) { *ierr = 0; hypre_ParReadVector( hypre_F90_PassComm (comm), (char *) file ); } /*-------------------------------------------------------------------------- * hypre_ParVectorSize *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_parvectorsize, HYPRE_PARVECTORSIZE) (hypre_F90_Obj *x, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) ( hypre_ParVectorSize( (void *) x) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRMultiVectorPrint *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_parcsrmultivectorprint, HYPRE_PARCSRMULTIVECTORPRINT) (hypre_F90_Obj *x, char *file, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) ( HYPRE_ParCSRMultiVectorPrint( (void *) x, (char *) file)); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRMultiVectorRead *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_parcsrmultivectorread, HYPRE_PARCSRMULTIVECTORREAD) (hypre_F90_Comm *comm, hypre_F90_Obj *ii, char *file, hypre_F90_Int *ierr) { *ierr = 0; HYPRE_ParCSRMultiVectorRead( hypre_F90_PassComm (comm), (void *) ii, (char *) file ); } /*-------------------------------------------------------------------------- * HYPRE_TempParCSRSetupInterpreter *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_tempparcsrsetupinterprete, HYPRE_TEMPPARCSRSETUPINTERPRETE) (hypre_F90_Obj *i, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) ( HYPRE_TempParCSRSetupInterpreter( (mv_InterfaceInterpreter *) i )); } /*-------------------------------------------------------------------------- * HYPRE_TempParCSRSetupInterpreter *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_parcsrsetupinterpreter, HYPRE_PARCSRSETUPINTERPRETER) (hypre_F90_Obj *i, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) ( HYPRE_ParCSRSetupInterpreter( (mv_InterfaceInterpreter *) i )); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRSetupMatvec *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_parcsrsetupmatvec, HYPRE_PARCSRSETUPMATVEC) (hypre_F90_Obj *mv, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) ( HYPRE_ParCSRSetupMatvec( hypre_F90_PassObjRef (HYPRE_MatvecFunctions, mv))); } #ifdef __cplusplus } #endif hypre-2.33.0/src/parcsr_ls/F90_HYPRE_parcsr_lgmres.c000066400000000000000000000266031477326011500221160ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * HYPRE_ParCSRLGMRES Fortran interface * *****************************************************************************/ #include "_hypre_parcsr_ls.h" #include "fortran.h" #ifdef __cplusplus extern "C" { #endif /*-------------------------------------------------------------------------- * HYPRE_ParCSRLGMRESCreate *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_parcsrlgmrescreate, HYPRE_PARCSRLGMRESCREATE) ( hypre_F90_Comm *comm, hypre_F90_Obj *solver, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_ParCSRLGMRESCreate( hypre_F90_PassComm (comm), hypre_F90_PassObjRef (HYPRE_Solver, solver) ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRLGMRESDestroy *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_parcsrlgmresdestroy, HYPRE_PARCSRLGMRESDESTROY) ( hypre_F90_Obj *solver, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_ParCSRLGMRESDestroy( hypre_F90_PassObj (HYPRE_Solver, solver) ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRLGMRESSetup *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_parcsrlgmressetup, HYPRE_PARCSRLGMRESSETUP) ( hypre_F90_Obj *solver, hypre_F90_Obj *A, hypre_F90_Obj *b, hypre_F90_Obj *x, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_ParCSRLGMRESSetup( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassObj (HYPRE_ParCSRMatrix, A), hypre_F90_PassObj (HYPRE_ParVector, b), hypre_F90_PassObj (HYPRE_ParVector, x) ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRLGMRESSolve *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_parcsrlgmressolve, HYPRE_PARCSRLGMRESSOLVE) ( hypre_F90_Obj *solver, hypre_F90_Obj *A, hypre_F90_Obj *b, hypre_F90_Obj *x, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_ParCSRLGMRESSolve( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassObj (HYPRE_ParCSRMatrix, A), hypre_F90_PassObj (HYPRE_ParVector, b), hypre_F90_PassObj (HYPRE_ParVector, x) ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRLGMRESSetKDim *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_parcsrlgmressetkdim, HYPRE_PARCSRLGMRESSETKDIM) ( hypre_F90_Obj *solver, hypre_F90_Int *kdim, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_ParCSRLGMRESSetKDim( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassInt (kdim) ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRLGMRESSetTol *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_parcsrlgmressettol, HYPRE_PARCSRLGMRESSETTOL) ( hypre_F90_Obj *solver, hypre_F90_Real *tol, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_ParCSRLGMRESSetTol( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassReal (tol) ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRLGMRESSetAbsoluteTol *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_parcsrlgmressetabsolutetol, HYPRE_PARCSRLGMRESSETABSOLUTETOL) ( hypre_F90_Obj *solver, hypre_F90_Real *tol, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_ParCSRLGMRESSetAbsoluteTol( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassReal (tol) ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRLGMRESSetMinIter *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_parcsrlgmressetminiter, HYPRE_PARCSRLGMRESSETMINITER) ( hypre_F90_Obj *solver, hypre_F90_Int *min_iter, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_ParCSRLGMRESSetMinIter( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassInt (min_iter) ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRLGMRESSetMaxIter *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_parcsrlgmressetmaxiter, HYPRE_PARCSRLGMRESSETMAXITER) ( hypre_F90_Obj *solver, hypre_F90_Int *max_iter, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_ParCSRLGMRESSetMaxIter( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassInt (max_iter) ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRLGMRESSetPrecond *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_parcsrlgmressetprecond, HYPRE_PARCSRLGMRESSETPRECOND) ( hypre_F90_Obj *solver, hypre_F90_Int *precond_id, hypre_F90_Obj *precond_solver, hypre_F90_Int *ierr ) { /*------------------------------------------------------------ * The precond_id flags mean : * 0 - no preconditioner * 1 - set up a ds preconditioner * 2 - set up an amg preconditioner * 3 - set up a pilut preconditioner * 4 - set up a parasails preconditioner * 5 - set up a Euclid preconditioner * 6 - set up a ILU preconditioner * 7 - set up a MGR preconditioner *------------------------------------------------------------*/ if (*precond_id == 0) { *ierr = 0; } else if (*precond_id == 1) { *ierr = (hypre_F90_Int) ( HYPRE_ParCSRLGMRESSetPrecond( hypre_F90_PassObj (HYPRE_Solver, solver), HYPRE_ParCSRDiagScale, HYPRE_ParCSRDiagScaleSetup, NULL ) ); } else if (*precond_id == 2) { *ierr = (hypre_F90_Int) ( HYPRE_ParCSRLGMRESSetPrecond( hypre_F90_PassObj (HYPRE_Solver, solver), HYPRE_BoomerAMGSolve, HYPRE_BoomerAMGSetup, (HYPRE_Solver) * precond_solver ) ); } else if (*precond_id == 3) { *ierr = (hypre_F90_Int) ( HYPRE_ParCSRLGMRESSetPrecond( hypre_F90_PassObj (HYPRE_Solver, solver), HYPRE_ParCSRPilutSolve, HYPRE_ParCSRPilutSetup, (HYPRE_Solver) * precond_solver ) ); } else if (*precond_id == 4) { *ierr = (hypre_F90_Int) ( HYPRE_ParCSRLGMRESSetPrecond( hypre_F90_PassObj (HYPRE_Solver, solver), HYPRE_ParCSRParaSailsSolve, HYPRE_ParCSRParaSailsSetup, (HYPRE_Solver) * precond_solver ) ); } else if (*precond_id == 5) { *ierr = (hypre_F90_Int) ( HYPRE_ParCSRLGMRESSetPrecond( hypre_F90_PassObj (HYPRE_Solver, solver), HYPRE_EuclidSolve, HYPRE_EuclidSetup, (HYPRE_Solver) * precond_solver ) ); } else if (*precond_id == 6) { *ierr = (hypre_F90_Int) ( HYPRE_ParCSRLGMRESSetPrecond( hypre_F90_PassObj (HYPRE_Solver, solver), HYPRE_ILUSolve, HYPRE_ILUSetup, (HYPRE_Solver) * precond_solver ) ); } else if (*precond_id == 7) { *ierr = (hypre_F90_Int) ( HYPRE_ParCSRLGMRESSetPrecond( hypre_F90_PassObj (HYPRE_Solver, solver), HYPRE_MGRSolve, HYPRE_MGRSetup, (HYPRE_Solver) * precond_solver ) ); } else { *ierr = -1; } } /*-------------------------------------------------------------------------- * HYPRE_ParCSRLGMRESGetPrecond *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_parcsrlgmresgetprecond, HYPRE_PARCSRLGMRESGETPRECOND) ( hypre_F90_Obj *solver, hypre_F90_Obj *precond_solver_ptr, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_ParCSRLGMRESGetPrecond( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassObjRef (HYPRE_Solver, precond_solver_ptr) ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRLGMRESSetLogging *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_parcsrlgmressetlogging, HYPRE_PARCSRLGMRESSETLOGGING) ( hypre_F90_Obj *solver, hypre_F90_Int *logging, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_ParCSRLGMRESSetLogging( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassInt (logging) ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRLGMRESSetPrintLevel *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_parcsrlgmressetprintlevel, HYPRE_PARCSRLGMRESSETPRINTLEVEL) ( hypre_F90_Obj *solver, hypre_F90_Int *print_level, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_ParCSRLGMRESSetPrintLevel( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassInt (print_level) ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRLGMRESGetNumIterations *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_parcsrlgmresgetnumiteratio, HYPRE_PARCSRLGMRESGETNUMITERATIO) ( hypre_F90_Obj *solver, hypre_F90_Int *num_iterations, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_ParCSRLGMRESGetNumIterations( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassIntRef (num_iterations) ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRLGMRESGetFinalRelativeResidualNorm *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_parcsrlgmresgetfinalrelati, HYPRE_PARCSRLGMRESGETFINALRELATI) ( hypre_F90_Obj *solver, hypre_F90_Real *norm, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_ParCSRLGMRESGetFinalRelativeResidualNorm( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassRealRef (norm) ) ); } #ifdef __cplusplus } #endif hypre-2.33.0/src/parcsr_ls/F90_HYPRE_parcsr_mgr.c000066400000000000000000000641221477326011500214100ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * HYPRE_MGR Fortran interface * *****************************************************************************/ #include "_hypre_parcsr_ls.h" #include "fortran.h" #ifdef __cplusplus extern "C" { #endif /*-------------------------------------------------------------------------- * HYPRE_MGRCreate *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_mgrcreate, HYPRE_MGRCREATE) ( hypre_F90_Obj *solver, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_MGRCreate( hypre_F90_PassObjRef (HYPRE_Solver, solver) ) ); } /*-------------------------------------------------------------------------- * HYPRE_MGRDestroy *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_mgrdestroy, HYPRE_MGRDESTROY) ( hypre_F90_Obj *solver, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_MGRDestroy( hypre_F90_PassObj (HYPRE_Solver, solver) ) ); } /*-------------------------------------------------------------------------- * HYPRE_MGRSetup *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_mgrsetup, HYPRE_MGRSETUP) ( hypre_F90_Obj *solver, hypre_F90_Obj *A, hypre_F90_Obj *b, hypre_F90_Obj *x, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_MGRSetup( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassObj (HYPRE_ParCSRMatrix, A), hypre_F90_PassObj (HYPRE_ParVector, b), hypre_F90_PassObj (HYPRE_ParVector, x) ) ); } /*-------------------------------------------------------------------------- * HYPRE_MGRSolve *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_mgrsolve, HYPRE_MGRSOLVE) ( hypre_F90_Obj *solver, hypre_F90_Obj *A, hypre_F90_Obj *b, hypre_F90_Obj *x, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_MGRSolve( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassObj (HYPRE_ParCSRMatrix, A), hypre_F90_PassObj (HYPRE_ParVector, b), hypre_F90_PassObj (HYPRE_ParVector, x) ) ); } #ifdef HYPRE_USING_DSUPERLU /*-------------------------------------------------------------------------- * HYPRE_MGRDirectSolverCreate *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_mgrdirectsolvercreate, HYPRE_MGRDIRECTSOLVERCREATE) ( hypre_F90_Obj *solver, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_MGRDirectSolverCreate( hypre_F90_PassObjRef (HYPRE_Solver, solver) ) ); } /*-------------------------------------------------------------------------- * HYPRE_MGRDirectSolverDestroy *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_mgrdirectsolverdestroy, HYPRE_MGRDIRECTSOLVERDESTROY) ( hypre_F90_Obj *solver, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_MGRDirectSolverDestroy( hypre_F90_PassObj (HYPRE_Solver, solver) ) ); } /*-------------------------------------------------------------------------- * HYPRE_MGRDirectSolverSetup *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_mgrdirectsolversetup, HYPRE_MGRDIRECTSOLVERSETUP) ( hypre_F90_Obj *solver, hypre_F90_Obj *A, hypre_F90_Obj *b, hypre_F90_Obj *x, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) ( HYPRE_MGRDirectSolverSetup( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassObj (HYPRE_ParCSRMatrix, A), hypre_F90_PassObj (HYPRE_ParVector, b), hypre_F90_PassObj (HYPRE_ParVector, x) ) ); } /*-------------------------------------------------------------------------- * HYPRE_MGRDirectSolverSolve *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_mgrdirectsolversolve, HYPRE_MGRDIRECTSOLVERSOLVE) ( hypre_F90_Obj *solver, hypre_F90_Obj *A, hypre_F90_Obj *b, hypre_F90_Obj *x, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_MGRDirectSolverSolve( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassObj (HYPRE_ParCSRMatrix, A), hypre_F90_PassObj (HYPRE_ParVector, b), hypre_F90_PassObj (HYPRE_ParVector, x) ) ); } #endif /*-------------------------------------------------------------------------- * HYPRE_MGRSetCptsByCtgBlock *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_mgrsetcptsbyctgblock, HYPRE_MGRSETCPTSBYCTGBLOCK) ( hypre_F90_Obj *solver, hypre_F90_Int *block_size, hypre_F90_Int *max_num_levels, hypre_F90_BigIntArray *idx_array, hypre_F90_IntArray *block_num_coarse_points, hypre_F90_IntArrayArray *block_coarse_indexes, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_MGRSetCpointsByContiguousBlock( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassInt (block_size), hypre_F90_PassInt (max_num_levels), hypre_F90_PassBigIntArray (idx_array), hypre_F90_PassIntArray (block_num_coarse_points), hypre_F90_PassIntArrayArray (block_coarse_indexes) ) ); } /*-------------------------------------------------------------------------- * HYPRE_MGRSetCpointsByBlock *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_mgrsetcpointsbyblock, HYPRE_MGRSETCPOINTSBYBLOCK) ( hypre_F90_Obj *solver, hypre_F90_Int *block_size, hypre_F90_Int *max_num_levels, hypre_F90_IntArray *block_num_coarse_points, hypre_F90_IntArrayArray *block_coarse_indexes, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_MGRSetCpointsByBlock( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassInt (block_size), hypre_F90_PassInt (max_num_levels), hypre_F90_PassIntArray (block_num_coarse_points), hypre_F90_PassIntArrayArray (block_coarse_indexes) ) ); } /*-------------------------------------------------------------------------- * HYPRE_MGRSetCptsByMarkerArray *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_mgrsetcptsbymarkerarray, HYPRE_MGRSETCPTSBYMARKERARRAY) ( hypre_F90_Obj *solver, hypre_F90_Int *block_size, hypre_F90_Int *max_num_levels, hypre_F90_IntArray *num_block_coarse_points, hypre_F90_IntArrayArray *lvl_block_coarse_indexes, hypre_F90_IntArray *point_marker_array, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_MGRSetCpointsByPointMarkerArray( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassInt (block_size), hypre_F90_PassInt (max_num_levels), hypre_F90_PassIntArray (num_block_coarse_points), hypre_F90_PassIntArrayArray (lvl_block_coarse_indexes), hypre_F90_PassIntArray (point_marker_array) ) ); } /*-------------------------------------------------------------------------- * HYPRE_MGRSetNonCptsToFpts *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_mgrsetnoncptstofpts, HYPRE_MGRSETNONCPTSTOFPTS) ( hypre_F90_Obj *solver, hypre_F90_Int *nonCptToFptFlag, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_MGRSetNonCpointsToFpoints( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassInt (nonCptToFptFlag) ) ); } /*-------------------------------------------------------------------------- * HYPRE_MGRSetFSolver *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_mgrsetfsolver, HYPRE_MGRSETFSOLVER) ( hypre_F90_Obj *solver, hypre_F90_Int *fsolver_id, hypre_F90_Obj *fsolver, hypre_F90_Int *ierr ) { /*------------------------------------------------------------ * The fsolver_id flag means: * 0 - do not setup a F-solver. * 1 - BoomerAMG. *------------------------------------------------------------*/ if (*fsolver_id == 0) { *ierr = 0; } else if (*fsolver_id == 1) { *ierr = (hypre_F90_Int) ( HYPRE_MGRSetFSolver( hypre_F90_PassObj (HYPRE_Solver, solver), (HYPRE_PtrToParSolverFcn) HYPRE_BoomerAMGSolve, (HYPRE_PtrToParSolverFcn) HYPRE_BoomerAMGSetup, (HYPRE_Solver) * fsolver) ); } else { *ierr = -1; } } /*-------------------------------------------------------------------------- * HYPRE_MGRBuildAff *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_mgrbuildaff, HYPRE_MGRBUILDAFF) ( hypre_F90_Obj *A, hypre_F90_IntArray *CF_marker, hypre_F90_Int *debug_flag, hypre_F90_Obj *A_ff, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_MGRBuildAff( hypre_F90_PassObj (HYPRE_ParCSRMatrix, A), hypre_F90_PassIntArray (CF_marker), hypre_F90_PassInt (debug_flag), hypre_F90_PassObjRef (HYPRE_ParCSRMatrix, A_ff) ) ); } /*-------------------------------------------------------------------------- * HYPRE_MGRSetCoarseSolver *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_mgrsetcoarsesolver, HYPRE_MGRSETCOARSESOLVER) ( hypre_F90_Obj *solver, hypre_F90_Int *csolver_id, hypre_F90_Obj *csolver, hypre_F90_Int *ierr ) { /*------------------------------------------------------------ * The csolver_id flag means: * 0 - do not setup a coarse solver. * 1 - BoomerAMG. *------------------------------------------------------------*/ if (*csolver_id == 0) { *ierr = 0; } else if (*csolver_id == 1) { *ierr = (hypre_F90_Int) ( HYPRE_MGRSetCoarseSolver( hypre_F90_PassObj (HYPRE_Solver, solver), (HYPRE_PtrToParSolverFcn) HYPRE_BoomerAMGSolve, (HYPRE_PtrToParSolverFcn) HYPRE_BoomerAMGSetup, (HYPRE_Solver) * csolver) ); } else { *ierr = -1; } } /*-------------------------------------------------------------------------- * HYPRE_MGRSetMaxCoarseLevels *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_mgrsetmaxcoarselevels, HYPRE_MGRSETMAXCOARSELEVELS) ( hypre_F90_Obj *solver, hypre_F90_Int *maxlev, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_MGRSetMaxCoarseLevels( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassInt (maxlev) ) ); } /*-------------------------------------------------------------------------- * HYPRE_MGRSetBlockSize *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_mgrsetblocksize, HYPRE_MGRSETBLOCKSIZE) ( hypre_F90_Obj *solver, hypre_F90_Int *bsize, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_MGRSetBlockSize( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassInt (bsize) ) ); } /*-------------------------------------------------------------------------- * HYPRE_MGRSetReservedCoarseNodes *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_mgrsetreservedcoarsenodes, HYPRE_MGRSETRESERVEDCOARSENODES) ( hypre_F90_Obj *solver, hypre_F90_Int *reserved_coarse_size, hypre_F90_BigIntArray *reserved_coarse_indexes, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_MGRSetReservedCoarseNodes( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassInt (reserved_coarse_size), hypre_F90_PassBigIntArray (reserved_coarse_indexes) ) ); } /*-------------------------------------------------------------------------- * HYPRE_MGRSetReservedCptsLevel *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_mgrsetreservedcptslevel, HYPRE_MGRSETRESERVEDCPTSLEVEL) ( hypre_F90_Obj *solver, hypre_F90_Int *level, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_MGRSetReservedCpointsLevelToKeep( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassInt (level) ) ); } /*-------------------------------------------------------------------------- * HYPRE_MGRSetRestrictType *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_mgrsetrestricttype, HYPRE_MGRSETRESTRICTTYPE) ( hypre_F90_Obj *solver, hypre_F90_Int *restrict_type, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_MGRSetRestrictType( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassInt (restrict_type) ) ); } /*-------------------------------------------------------------------------- * HYPRE_MGRSetLevelRestrictType *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_mgrsetlevelrestricttype, HYPRE_MGRSETLEVELRESTRICTTYPE) ( hypre_F90_Obj *solver, hypre_F90_IntArray *restrict_type, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_MGRSetLevelRestrictType( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassIntArray (restrict_type) ) ); } /*-------------------------------------------------------------------------- * HYPRE_MGRSetFRelaxMethod *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_mgrsetfrelaxmethod, HYPRE_MGRSETFRELAXMETHOD) ( hypre_F90_Obj *solver, hypre_F90_Int *relax_method, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_MGRSetFRelaxMethod( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassInt (relax_method) ) ); } /*-------------------------------------------------------------------------- * HYPRE_MGRSetLevelFRelaxMethod *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_mgrsetlevelfrelaxmethod, HYPRE_MGRSETLEVELFRELAXMETHOD) ( hypre_F90_Obj *solver, hypre_F90_IntArray *relax_method, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_MGRSetLevelFRelaxMethod( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassIntArray (relax_method) ) ); } /*-------------------------------------------------------------------------- * HYPRE_MGRSetCoarseGridMethod *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_mgrsetcoarsegridmethod, HYPRE_MGRSETCOARSEGRIDMETHOD) ( hypre_F90_Obj *solver, hypre_F90_IntArray *cg_method, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_MGRSetCoarseGridMethod( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassIntArray (cg_method) ) ); } /*-------------------------------------------------------------------------- * HYPRE_MGRSetLevelFRelaxNumFunc *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_mgrsetlevelfrelaxnumfunc, HYPRE_MGRSETLEVELFRELAXNUMFUNC) ( hypre_F90_Obj *solver, hypre_F90_IntArray *num_functions, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_MGRSetLevelFRelaxNumFunctions( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassIntArray (num_functions) ) ); } /*-------------------------------------------------------------------------- * HYPRE_MGRSetRelaxType *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_mgrsetrelaxtype, HYPRE_MGRSETRELAXTYPE) ( hypre_F90_Obj *solver, hypre_F90_Int *relax_type, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_MGRSetRelaxType( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassInt (relax_type) ) ); } /*-------------------------------------------------------------------------- * HYPRE_MGRSetNumRelaxSweeps *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_mgrsetnumrelaxsweeps, HYPRE_MGRSETNUMRELAXSWEEPS) ( hypre_F90_Obj *solver, hypre_F90_Int *nsweeps, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_MGRSetNumRelaxSweeps( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassInt (nsweeps) ) ); } /*-------------------------------------------------------------------------- * HYPRE_MGRSetInterpType *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_mgrsetinterptype, HYPRE_MGRSETINTERPTYPE) ( hypre_F90_Obj *solver, hypre_F90_Int *interpType, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_MGRSetInterpType( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassInt (interpType) ) ); } /*-------------------------------------------------------------------------- * HYPRE_MGRSetLevelInterpType *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_mgrsetlevelinterptype, HYPRE_MGRSETLEVELINTERPTYPE) ( hypre_F90_Obj *solver, hypre_F90_IntArray *interpType, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_MGRSetLevelInterpType( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassIntArray (interpType) ) ); } /*-------------------------------------------------------------------------- * HYPRE_MGRSetNumInterpSweeps *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_mgrsetnuminterpsweeps, HYPRE_MGRSETNUMINTERPSWEEPS) ( hypre_F90_Obj *solver, hypre_F90_Int *nsweeps, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_MGRSetNumInterpSweeps( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassInt (nsweeps) ) ); } /*-------------------------------------------------------------------------- * HYPRE_MGRSetNumRestrictSweeps *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_mgrsetnumrestrictsweeps, HYPRE_MGRSETNUMRESTRICTSWEEPS) ( hypre_F90_Obj *solver, hypre_F90_Int *nsweeps, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_MGRSetNumRestrictSweeps( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassInt (nsweeps) ) ); } /*-------------------------------------------------------------------------- * HYPRE_MGRSetCGridThreshold *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_mgrsetcgridthreshold, HYPRE_MGRSETCGRIDTHRESHOLD) ( hypre_F90_Obj *solver, hypre_F90_Real *threshold, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_MGRSetTruncateCoarseGridThreshold( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassReal (threshold) ) ); } /*-------------------------------------------------------------------------- * HYPRE_MGRSetFrelaxPrintLevel *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_mgrsetfrelaxprintlevel, HYPRE_MGRSETFRELAXPRINTLEVEL) ( hypre_F90_Obj *solver, hypre_F90_Int *print_level, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_MGRSetFrelaxPrintLevel( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassInt (print_level) ) ); } /*-------------------------------------------------------------------------- * HYPRE_MGRSetCgridPrintLevel *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_mgrsetcgridprintlevel, HYPRE_MGRSETCGRIDPRINTLEVEL) ( hypre_F90_Obj *solver, hypre_F90_Int *print_level, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_MGRSetCoarseGridPrintLevel( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassInt (print_level) ) ); } /*-------------------------------------------------------------------------- * HYPRE_MGRSetPrintLevel *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_mgrsetprintlevel, HYPRE_MGRSETPRINTLEVEL) ( hypre_F90_Obj *solver, hypre_F90_Int *print_level, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_MGRSetPrintLevel( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassInt (print_level) ) ); } /*-------------------------------------------------------------------------- * HYPRE_MGRSetLogging *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_mgrsetlogging, HYPRE_MGRSETLOGGING) ( hypre_F90_Obj *solver, hypre_F90_Int *logging, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_MGRSetLogging( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassInt (logging) ) ); } /*-------------------------------------------------------------------------- * HYPRE_MGRSetMaxIter *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_mgrsetmaxiter, HYPRE_MGRSETMAXITER) ( hypre_F90_Obj *solver, hypre_F90_Int *max_iter, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_MGRSetMaxIter( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassInt (max_iter) ) ); } /*-------------------------------------------------------------------------- * HYPRE_MGRSetTol *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_mgrsettol, HYPRE_MGRSETTOL) ( hypre_F90_Obj *solver, hypre_F90_Real *tol, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_MGRSetTol( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassReal (tol) ) ); } /*-------------------------------------------------------------------------- * HYPRE_MGRSetMaxGlobalsmoothIt *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_mgrsetmaxglobalsmoothit, HYPRE_MGRSETMAXGLOBALSMOOTHIT) ( hypre_F90_Obj *solver, hypre_F90_Int *max_iter, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_MGRSetMaxGlobalSmoothIters( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassInt (max_iter) ) ); } /*-------------------------------------------------------------------------- * HYPRE_MGRSetGlobalsmoothType *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_mgrsetglobalsmoothtype, HYPRE_MGRSETGLOBALSMOOTHTYPE) ( hypre_F90_Obj *solver, hypre_F90_Int *iter_type, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_MGRSetGlobalSmoothType( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassInt (iter_type) ) ); } /*-------------------------------------------------------------------------- * HYPRE_MGRSetPMaxElmts *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_mgrsetpmaxelmts, HYPRE_MGRSETPMAXELMTS) ( hypre_F90_Obj *solver, hypre_F90_Int *P_max_elmts, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_MGRSetPMaxElmts( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassInt (P_max_elmts) ) ); } /*-------------------------------------------------------------------------- * HYPRE_MGRGetCoarseGridConvFac *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_mgrgetcoarsegridconvfac, HYPRE_MGRGETCOARSEGRIDCONVFAC) ( hypre_F90_Obj *solver, hypre_F90_Real *conv_factor, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_MGRGetCoarseGridConvergenceFactor( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassRealRef (conv_factor) ) ); } /*-------------------------------------------------------------------------- * HYPRE_MGRGetNumIterations *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_mgrgetnumiterations, HYPRE_MGRGETNUMITERATIONS) ( hypre_F90_Obj *solver, hypre_F90_Int *num_iterations, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_MGRGetNumIterations( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassIntRef (num_iterations) ) ); } /*-------------------------------------------------------------------------- * HYPRE_MGRGetFinalRelResNorm *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_mgrgetfinalrelresnorm, HYPRE_MGRGETFINALRELRESNORM) ( hypre_F90_Obj *solver, hypre_F90_Real *res_norm, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_MGRGetFinalRelativeResidualNorm( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassRealRef (res_norm) ) ); } #ifdef __cplusplus } #endif hypre-2.33.0/src/parcsr_ls/F90_HYPRE_parcsr_pcg.c000066400000000000000000000320331477326011500213700ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * HYPRE_ParCSRPCG Fortran interface * *****************************************************************************/ #include "_hypre_parcsr_ls.h" #include "fortran.h" #ifdef __cplusplus extern "C" { #endif /*-------------------------------------------------------------------------- * HYPRE_ParCSRPCGCreate *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_parcsrpcgcreate, HYPRE_PARCSRPCGCREATE) ( hypre_F90_Comm *comm, hypre_F90_Obj *solver, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_ParCSRPCGCreate( hypre_F90_PassComm (comm), hypre_F90_PassObjRef (HYPRE_Solver, solver) ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRPCGDestroy *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_parcsrpcgdestroy, HYPRE_PARCSRPCGDESTROY) ( hypre_F90_Obj *solver, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_ParCSRPCGDestroy( hypre_F90_PassObj (HYPRE_Solver, solver) ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRPCGSetup *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_parcsrpcgsetup, HYPRE_PARCSRPCGSETUP) ( hypre_F90_Obj *solver, hypre_F90_Obj *A, hypre_F90_Obj *b, hypre_F90_Obj *x, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_ParCSRPCGSetup( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassObj (HYPRE_ParCSRMatrix, A), hypre_F90_PassObj (HYPRE_ParVector, b), hypre_F90_PassObj (HYPRE_ParVector, x) ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRPCGSolve *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_parcsrpcgsolve, HYPRE_PARCSRPCGSOLVE) ( hypre_F90_Obj *solver, hypre_F90_Obj *A, hypre_F90_Obj *b, hypre_F90_Obj *x, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_ParCSRPCGSolve( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassObj (HYPRE_ParCSRMatrix, A), hypre_F90_PassObj (HYPRE_ParVector, b), hypre_F90_PassObj (HYPRE_ParVector, x) ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRPCGSetTol *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_parcsrpcgsettol, HYPRE_PARCSRPCGSETTOL) ( hypre_F90_Obj *solver, hypre_F90_Real *tol, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_ParCSRPCGSetTol( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassReal (tol) ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRPCGSetAbsoluteTol *-------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_parcsrpcgsetatol, HYPRE_PARCSRPCGSETATOL) ( hypre_F90_Obj *solver, hypre_F90_Real *tol, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_ParCSRPCGSetAbsoluteTol( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassReal (tol) ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRPCGSetMaxIter *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_parcsrpcgsetmaxiter, HYPRE_PARCSRPCGSETMAXITER) ( hypre_F90_Obj *solver, hypre_F90_Int *max_iter, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_ParCSRPCGSetMaxIter( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassInt (max_iter) ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRPCGSetStopCrit *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_parcsrpcgsetstopcrit, HYPRE_PARCSRPCGSETSTOPCRIT) ( hypre_F90_Obj *solver, hypre_F90_Int *stop_crit, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_ParCSRPCGSetStopCrit( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassInt (stop_crit) ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRPCGSetTwoNorm *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_parcsrpcgsettwonorm, HYPRE_PARCSRPCGSETTWONORM) ( hypre_F90_Obj *solver, hypre_F90_Int *two_norm, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_ParCSRPCGSetTwoNorm( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassInt (two_norm) ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRPCGSetRelChange *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_parcsrpcgsetrelchange, HYPRE_PARCSRPCGSETRELCHANGE) ( hypre_F90_Obj *solver, hypre_F90_Int *rel_change, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_ParCSRPCGSetRelChange( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassInt (rel_change) ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRPCGSetPrecond *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_parcsrpcgsetprecond, HYPRE_PARCSRPCGSETPRECOND) ( hypre_F90_Obj *solver, hypre_F90_Int *precond_id, hypre_F90_Obj *precond_solver, hypre_F90_Int *ierr ) { /*------------------------------------------------------------ * The precond_id flags mean : * 0 - do not set up a preconditioner * 1 - set up a ds preconditioner * 2 - set up an amg preconditioner * 3 - set up a pilut preconditioner * 4 - set up a ParaSails preconditioner * 5 - set up a Euclid preconditioner * 6 - set up a ILU preconditioner * 7 - set up a MGR preconditioner *------------------------------------------------------------*/ if (*precond_id == 0) { *ierr = 0; } else if (*precond_id == 1) { *ierr = (hypre_F90_Int) ( HYPRE_ParCSRPCGSetPrecond( hypre_F90_PassObj (HYPRE_Solver, solver), HYPRE_ParCSRDiagScale, HYPRE_ParCSRDiagScaleSetup, NULL ) ); } else if (*precond_id == 2) { *ierr = (hypre_F90_Int) ( HYPRE_ParCSRPCGSetPrecond( hypre_F90_PassObj (HYPRE_Solver, solver), HYPRE_BoomerAMGSolve, HYPRE_BoomerAMGSetup, (HYPRE_Solver) * precond_solver) ); } else if (*precond_id == 3) { *ierr = (hypre_F90_Int) ( HYPRE_ParCSRPCGSetPrecond( hypre_F90_PassObj (HYPRE_Solver, solver), HYPRE_ParCSRPilutSolve, HYPRE_ParCSRPilutSetup, (HYPRE_Solver) * precond_solver) ); } else if (*precond_id == 4) { *ierr = (hypre_F90_Int) ( HYPRE_ParCSRPCGSetPrecond( hypre_F90_PassObj (HYPRE_Solver, solver), HYPRE_ParaSailsSolve, HYPRE_ParaSailsSetup, (HYPRE_Solver) * precond_solver) ); } else if (*precond_id == 5) { *ierr = (hypre_F90_Int) ( HYPRE_ParCSRPCGSetPrecond( hypre_F90_PassObj (HYPRE_Solver, solver), HYPRE_EuclidSolve, HYPRE_EuclidSetup, (HYPRE_Solver) * precond_solver) ); } else if (*precond_id == 6) { *ierr = (hypre_F90_Int) ( HYPRE_ParCSRPCGSetPrecond( hypre_F90_PassObj (HYPRE_Solver, solver), HYPRE_ILUSolve, HYPRE_ILUSetup, (HYPRE_Solver) * precond_solver ) ); } else if (*precond_id == 7) { *ierr = (hypre_F90_Int) ( HYPRE_ParCSRPCGSetPrecond( hypre_F90_PassObj (HYPRE_Solver, solver), HYPRE_MGRSolve, HYPRE_MGRSetup, (HYPRE_Solver) * precond_solver ) ); } else { *ierr = -1; } } /*-------------------------------------------------------------------------- * HYPRE_ParCSRPCGGetPrecond *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_parcsrpcggetprecond, HYPRE_PARCSRPCGGETPRECOND) ( hypre_F90_Obj *solver, hypre_F90_Obj *precond_solver_ptr, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_ParCSRPCGGetPrecond( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassObjRef (HYPRE_Solver, precond_solver_ptr) ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRPCGSetPrintLevel *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_parcsrpcgsetprintlevel, HYPRE_PARCSRPCGSETPRINTLEVEL) ( hypre_F90_Obj *solver, hypre_F90_Int *level, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_ParCSRPCGSetPrintLevel( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassInt (level) ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRPCGSetPrintLogging *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_parcsrpcgsetlogging, HYPRE_PARCSRPCGSETLOGGING) ( hypre_F90_Obj *solver, hypre_F90_Int *level, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_ParCSRPCGSetLogging( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassInt (level) ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRPCGGetNumIterations *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_parcsrpcggetnumiterations, HYPRE_PARCSRPCGGETNUMITERATIONS) ( hypre_F90_Obj *solver, hypre_F90_Int *num_iterations, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_ParCSRPCGGetNumIterations( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassIntRef (num_iterations) ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRPCGGetFinalRelativeResidualNorm *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_parcsrpcggetfinalrelative, HYPRE_PARCSRPCGGETFINALRELATIVE) ( hypre_F90_Obj *solver, hypre_F90_Real *norm, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_ParCSRPCGGetFinalRelativeResidualNorm( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassRealRef (norm) ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRDiagScaleSetup *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_parcsrdiagscalesetup, HYPRE_PARCSRDIAGSCALESETUP) ( hypre_F90_Obj *solver, hypre_F90_Obj *A, hypre_F90_Obj *y, hypre_F90_Obj *x, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_ParCSRDiagScaleSetup( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassObj (HYPRE_ParCSRMatrix, A), hypre_F90_PassObj (HYPRE_ParVector, y), hypre_F90_PassObj (HYPRE_ParVector, x) ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRDiagScale *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_parcsrdiagscale, HYPRE_PARCSRDIAGSCALE) ( hypre_F90_Obj *solver, hypre_F90_Obj *HA, hypre_F90_Obj *Hy, hypre_F90_Obj *Hx, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_ParCSRDiagScale( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassObj (HYPRE_ParCSRMatrix, HA), hypre_F90_PassObj (HYPRE_ParVector, Hy), hypre_F90_PassObj (HYPRE_ParVector, Hx) ) ); } #ifdef __cplusplus } #endif hypre-2.33.0/src/parcsr_ls/F90_HYPRE_parcsr_pilut.c000066400000000000000000000107621477326011500217610ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * HYPRE_ParCSRPilut Fortran interface * *****************************************************************************/ #include "_hypre_parcsr_ls.h" #include "fortran.h" #ifdef __cplusplus extern "C" { #endif /*-------------------------------------------------------------------------- * HYPRE_ParCSRPilutCreate *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_parcsrpilutcreate, HYPRE_PARCSRPILUTCREATE) ( hypre_F90_Comm *comm, hypre_F90_Obj *solver, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_ParCSRPilutCreate( hypre_F90_PassComm (comm), hypre_F90_PassObjRef (HYPRE_Solver, solver) ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRPilutDestroy *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_parcsrpilutdestroy, HYPRE_PARCSRPILUTDESTROY) ( hypre_F90_Obj *solver, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_ParCSRPilutDestroy( hypre_F90_PassObj (HYPRE_Solver, solver) ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRPilutSetup *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_parcsrpilutsetup, HYPRE_PARCSRPILUTSETUP) ( hypre_F90_Obj *solver, hypre_F90_Obj *A, hypre_F90_Obj *b, hypre_F90_Obj *x, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_ParCSRPilutSetup( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassObj (HYPRE_ParCSRMatrix, A), hypre_F90_PassObj (HYPRE_ParVector, b), hypre_F90_PassObj (HYPRE_ParVector, x) ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRPilutSolve *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_parcsrpilutsolve, HYPRE_PARCSRPILUTSOLVE) ( hypre_F90_Obj *solver, hypre_F90_Obj *A, hypre_F90_Obj *b, hypre_F90_Obj *x, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_ParCSRPilutSolve( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassObj (HYPRE_ParCSRMatrix, A), hypre_F90_PassObj (HYPRE_ParVector, b), hypre_F90_PassObj (HYPRE_ParVector, x) ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRPilutSetMaxIter *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_parcsrpilutsetmaxiter, HYPRE_PARCSRPILUTSETMAXITER) ( hypre_F90_Obj *solver, hypre_F90_Int *max_iter, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_ParCSRPilutSetMaxIter( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassInt (max_iter) ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRPilutSetDropToleran *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_parcsrpilutsetdroptoleran, HYPRE_PARCSRPILUTSETDROPTOLERAN) ( hypre_F90_Obj *solver, hypre_F90_Real *tol, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_ParCSRPilutSetDropTolerance( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassReal (tol) ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRPilutSetFacRowSize *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_parcsrpilutsetfacrowsize, HYPRE_PARCSRPILUTSETFACROWSIZE) ( hypre_F90_Obj *solver, hypre_F90_Int *size, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_ParCSRPilutSetFactorRowSize( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassInt (size) ) ); } #ifdef __cplusplus } #endif hypre-2.33.0/src/parcsr_ls/F90_HYPRE_parcsr_schwarz.c000066400000000000000000000144761477326011500223130ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * HYPRE_Schwarz Fortran interface * *****************************************************************************/ #include "_hypre_parcsr_ls.h" #include "fortran.h" #ifdef __cplusplus extern "C" { #endif /*-------------------------------------------------------------------------- * HYPRE_SchwarzCreate *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_schwarzcreate, HYPRE_SCHWARZCREATE) (hypre_F90_Obj *solver, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) ( HYPRE_SchwarzCreate( hypre_F90_PassObjRef (HYPRE_Solver, solver))); } /*-------------------------------------------------------------------------- * HYPRE_SchwarzDestroy *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_schwarzdestroy, HYPRE_SCHWARZDESTROY) (hypre_F90_Obj *solver, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) ( HYPRE_SchwarzDestroy( hypre_F90_PassObj (HYPRE_Solver, solver) )); } /*-------------------------------------------------------------------------- * HYPRE_SchwarzSetup *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_schwarzsetup, HYPRE_SCHWARZSETUP) (hypre_F90_Obj *solver, hypre_F90_Obj *A, hypre_F90_Obj *b, hypre_F90_Obj *x, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) ( HYPRE_SchwarzSetup( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassObj (HYPRE_ParCSRMatrix, A), hypre_F90_PassObj (HYPRE_ParVector, b), hypre_F90_PassObj (HYPRE_ParVector, x) )); } /*-------------------------------------------------------------------------- * HYPRE_SchwarzSolve *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_schwarzsolve, HYPRE_SCHWARZSOLVE) (hypre_F90_Obj *solver, hypre_F90_Obj *A, hypre_F90_Obj *b, hypre_F90_Obj *x, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) ( HYPRE_SchwarzSolve( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassObj (HYPRE_ParCSRMatrix, A), hypre_F90_PassObj (HYPRE_ParVector, b), hypre_F90_PassObj (HYPRE_ParVector, x) )); } /*-------------------------------------------------------------------------- * HYPRE_SchwarzSetVariant *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_schwarzsetvariant, HYPRE_SCHWARZSETVARIANT) (hypre_F90_Obj *solver, hypre_F90_Int *variant, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) ( HYPRE_SchwarzSetVariant( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassInt (variant) )); } /*-------------------------------------------------------------------------- * HYPRE_SchwarzSetOverlap *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_schwarzsetoverlap, HYPRE_SCHWARZSETOVERLAP) (hypre_F90_Obj *solver, hypre_F90_Int *overlap, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) ( HYPRE_SchwarzSetOverlap( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassInt (overlap))); } /*-------------------------------------------------------------------------- * HYPRE_SchwarzSetDomainType *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_schwarzsetdomaintype, HYPRE_SCHWARZSETDOMAINTYPE) (hypre_F90_Obj *solver, hypre_F90_Int *domain_type, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) ( HYPRE_SchwarzSetDomainType( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassInt (domain_type) )); } /*-------------------------------------------------------------------------- * HYPRE_SchwarzSetDomainStructure *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_schwarzsetdomainstructure, HYPRE_SCHWARZSETDOMAINSTRUCTURE) (hypre_F90_Obj *solver, hypre_F90_Obj *domain_structure, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) ( HYPRE_SchwarzSetDomainStructure( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassObj (HYPRE_CSRMatrix, domain_structure))); } /*-------------------------------------------------------------------------- * HYPRE_SchwarzSetNumFunctions *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_schwarzsetnumfunctions, HYPRE_SCHWARZSETNUMFUNCTIONS) (hypre_F90_Obj *solver, hypre_F90_Int *num_functions, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) (HYPRE_SchwarzSetNumFunctions( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassInt (num_functions) )); } /*-------------------------------------------------------------------------- * HYPRE_SchwarzSetRelaxWeight *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_schwarzsetrelaxweight, HYPRE_SCHWARZSETRELAXWEIGHT) (hypre_F90_Obj *solver, hypre_F90_Real *relax_weight, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) (HYPRE_SchwarzSetRelaxWeight( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassReal (relax_weight))); } /*-------------------------------------------------------------------------- * HYPRE_SchwarzSetDofFunc *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_schwarzsetdoffunc, HYPRE_SCHWARZSETDOFFUNC) (hypre_F90_Obj *solver, hypre_F90_IntArray *dof_func, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) (HYPRE_SchwarzSetDofFunc( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassIntArray (dof_func) )); } #ifdef __cplusplus } #endif hypre-2.33.0/src/parcsr_ls/F90_hypre_laplace.c000066400000000000000000000033631477326011500211120ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /***************************************************************************** * * HYPRE_par_laplace Fortran interface * *****************************************************************************/ #include "_hypre_parcsr_ls.h" #include "fortran.h" #ifdef __cplusplus extern "C" { #endif /*-------------------------------------------------------------------------- * GenerateLaplacian *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_generatelaplacian, HYPRE_GENERATELAPLACIAN) ( hypre_F90_Comm *comm, hypre_F90_Int *nx, hypre_F90_Int *ny, hypre_F90_Int *nz, hypre_F90_Int *P, hypre_F90_Int *Q, hypre_F90_Int *R, hypre_F90_Int *p, hypre_F90_Int *q, hypre_F90_Int *r, hypre_F90_RealArray *value, hypre_F90_Obj *matrix, hypre_F90_Int *ierr ) { *matrix = (hypre_F90_Obj) ( GenerateLaplacian( hypre_F90_PassComm (comm), hypre_F90_PassInt (nx), hypre_F90_PassInt (ny), hypre_F90_PassInt (nz), hypre_F90_PassInt (P), hypre_F90_PassInt (Q), hypre_F90_PassInt (R), hypre_F90_PassInt (p), hypre_F90_PassInt (q), hypre_F90_PassInt (r), hypre_F90_PassRealArray (value) ) ); *ierr = 0; } #ifdef __cplusplus } #endif hypre-2.33.0/src/parcsr_ls/HYPRE_ads.c000066400000000000000000000243661477326011500174100ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "_hypre_parcsr_ls.h" /*-------------------------------------------------------------------------- * HYPRE_ADSCreate *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ADSCreate(HYPRE_Solver *solver) { *solver = (HYPRE_Solver) hypre_ADSCreate(); return hypre_error_flag; } /*-------------------------------------------------------------------------- * HYPRE_ADSDestroy *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ADSDestroy(HYPRE_Solver solver) { return hypre_ADSDestroy((void *) solver); } /*-------------------------------------------------------------------------- * HYPRE_ADSSetup *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ADSSetup (HYPRE_Solver solver, HYPRE_ParCSRMatrix A, HYPRE_ParVector b, HYPRE_ParVector x) { return hypre_ADSSetup((void *) solver, (hypre_ParCSRMatrix *) A, (hypre_ParVector *) b, (hypre_ParVector *) x); } /*-------------------------------------------------------------------------- * HYPRE_ADSSolve *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ADSSolve (HYPRE_Solver solver, HYPRE_ParCSRMatrix A, HYPRE_ParVector b, HYPRE_ParVector x) { return hypre_ADSSolve((void *) solver, (hypre_ParCSRMatrix *) A, (hypre_ParVector *) b, (hypre_ParVector *) x); } /*-------------------------------------------------------------------------- * HYPRE_ADSSetDiscreteCurl *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ADSSetDiscreteCurl(HYPRE_Solver solver, HYPRE_ParCSRMatrix C) { return hypre_ADSSetDiscreteCurl((void *) solver, (hypre_ParCSRMatrix *) C); } /*-------------------------------------------------------------------------- * HYPRE_ADSSetDiscreteGradient *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ADSSetDiscreteGradient(HYPRE_Solver solver, HYPRE_ParCSRMatrix G) { return hypre_ADSSetDiscreteGradient((void *) solver, (hypre_ParCSRMatrix *) G); } /*-------------------------------------------------------------------------- * HYPRE_ADSSetCoordinateVectors *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ADSSetCoordinateVectors(HYPRE_Solver solver, HYPRE_ParVector x, HYPRE_ParVector y, HYPRE_ParVector z) { return hypre_ADSSetCoordinateVectors((void *) solver, (hypre_ParVector *) x, (hypre_ParVector *) y, (hypre_ParVector *) z); } /*-------------------------------------------------------------------------- * HYPRE_ADSSetInterpolations *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ADSSetInterpolations(HYPRE_Solver solver, HYPRE_ParCSRMatrix RT_Pi, HYPRE_ParCSRMatrix RT_Pix, HYPRE_ParCSRMatrix RT_Piy, HYPRE_ParCSRMatrix RT_Piz, HYPRE_ParCSRMatrix ND_Pi, HYPRE_ParCSRMatrix ND_Pix, HYPRE_ParCSRMatrix ND_Piy, HYPRE_ParCSRMatrix ND_Piz) { return hypre_ADSSetInterpolations((void *) solver, (hypre_ParCSRMatrix *) RT_Pi, (hypre_ParCSRMatrix *) RT_Pix, (hypre_ParCSRMatrix *) RT_Piy, (hypre_ParCSRMatrix *) RT_Piz, (hypre_ParCSRMatrix *) ND_Pi, (hypre_ParCSRMatrix *) ND_Pix, (hypre_ParCSRMatrix *) ND_Piy, (hypre_ParCSRMatrix *) ND_Piz); } /*-------------------------------------------------------------------------- * HYPRE_ADSSetMaxIter *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ADSSetMaxIter(HYPRE_Solver solver, HYPRE_Int maxit) { return hypre_ADSSetMaxIter((void *) solver, maxit); } /*-------------------------------------------------------------------------- * HYPRE_ADSSetTol *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ADSSetTol(HYPRE_Solver solver, HYPRE_Real tol) { return hypre_ADSSetTol((void *) solver, tol); } /*-------------------------------------------------------------------------- * HYPRE_ADSSetCycleType *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ADSSetCycleType(HYPRE_Solver solver, HYPRE_Int cycle_type) { return hypre_ADSSetCycleType((void *) solver, cycle_type); } /*-------------------------------------------------------------------------- * HYPRE_ADSSetPrintLevel *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ADSSetPrintLevel(HYPRE_Solver solver, HYPRE_Int print_level) { return hypre_ADSSetPrintLevel((void *) solver, print_level); } /*-------------------------------------------------------------------------- * HYPRE_ADSSetSmoothingOptions *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ADSSetSmoothingOptions(HYPRE_Solver solver, HYPRE_Int relax_type, HYPRE_Int relax_times, HYPRE_Real relax_weight, HYPRE_Real omega) { return hypre_ADSSetSmoothingOptions((void *) solver, relax_type, relax_times, relax_weight, omega); } /*-------------------------------------------------------------------------- * HYPRE_ADSSetChebyOptions *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ADSSetChebySmoothingOptions(HYPRE_Solver solver, HYPRE_Int cheby_order, HYPRE_Real cheby_fraction) { return hypre_ADSSetChebySmoothingOptions((void *) solver, cheby_order, cheby_fraction); } /*-------------------------------------------------------------------------- * HYPRE_ADSSetAMSOptions *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ADSSetAMSOptions(HYPRE_Solver solver, HYPRE_Int cycle_type, HYPRE_Int coarsen_type, HYPRE_Int agg_levels, HYPRE_Int relax_type, HYPRE_Real strength_threshold, HYPRE_Int interp_type, HYPRE_Int Pmax) { return hypre_ADSSetAMSOptions((void *) solver, cycle_type, coarsen_type, agg_levels, relax_type, strength_threshold, interp_type, Pmax); } /*-------------------------------------------------------------------------- * HYPRE_ADSSetAlphaAMGOptions *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ADSSetAMGOptions(HYPRE_Solver solver, HYPRE_Int coarsen_type, HYPRE_Int agg_levels, HYPRE_Int relax_type, HYPRE_Real strength_threshold, HYPRE_Int interp_type, HYPRE_Int Pmax) { return hypre_ADSSetAMGOptions((void *) solver, coarsen_type, agg_levels, relax_type, strength_threshold, interp_type, Pmax); } /*-------------------------------------------------------------------------- * HYPRE_ADSGetNumIterations *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ADSGetNumIterations(HYPRE_Solver solver, HYPRE_Int *num_iterations) { return hypre_ADSGetNumIterations((void *) solver, num_iterations); } /*-------------------------------------------------------------------------- * HYPRE_ADSGetFinalRelativeResidualNorm *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ADSGetFinalRelativeResidualNorm(HYPRE_Solver solver, HYPRE_Real *rel_resid_norm) { return hypre_ADSGetFinalRelativeResidualNorm((void *) solver, rel_resid_norm); } hypre-2.33.0/src/parcsr_ls/HYPRE_ame.c000066400000000000000000000120721477326011500173720ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "_hypre_parcsr_ls.h" /*-------------------------------------------------------------------------- * HYPRE_AMECreate *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_AMECreate(HYPRE_Solver *esolver) { *esolver = (HYPRE_Solver) hypre_AMECreate(); return hypre_error_flag; } /*-------------------------------------------------------------------------- * HYPRE_AMEDestroy *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_AMEDestroy(HYPRE_Solver esolver) { return hypre_AMEDestroy((void *) esolver); } /*-------------------------------------------------------------------------- * HYPRE_AMESetup *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_AMESetup (HYPRE_Solver esolver) { return hypre_AMESetup((void *) esolver); } /*-------------------------------------------------------------------------- * HYPRE_AMESolve *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_AMESolve (HYPRE_Solver esolver) { return hypre_AMESolve((void *) esolver); } /*-------------------------------------------------------------------------- * HYPRE_AMESetAMSSolver *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_AMESetAMSSolver(HYPRE_Solver esolver, HYPRE_Solver ams_solver) { return hypre_AMESetAMSSolver((void *) esolver, (void *) ams_solver); } /*-------------------------------------------------------------------------- * HYPRE_AMESetMassMatrix *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_AMESetMassMatrix(HYPRE_Solver esolver, HYPRE_ParCSRMatrix M) { return hypre_AMESetMassMatrix((void *) esolver, (hypre_ParCSRMatrix *) M); } /*-------------------------------------------------------------------------- * HYPRE_AMESetBlockSize *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_AMESetBlockSize(HYPRE_Solver esolver, HYPRE_Int block_size) { return hypre_AMESetBlockSize((void *) esolver, block_size); } /*-------------------------------------------------------------------------- * HYPRE_AMESetMaxIter *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_AMESetMaxIter(HYPRE_Solver esolver, HYPRE_Int maxit) { return hypre_AMESetMaxIter((void *) esolver, maxit); } /*-------------------------------------------------------------------------- * HYPRE_AMESetMaxPCGIter *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_AMESetMaxPCGIter(HYPRE_Solver esolver, HYPRE_Int maxit) { return hypre_AMESetMaxPCGIter((void *) esolver, maxit); } /*-------------------------------------------------------------------------- * HYPRE_AMESetTol *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_AMESetTol(HYPRE_Solver esolver, HYPRE_Real tol) { return hypre_AMESetTol((void *) esolver, tol); } /*-------------------------------------------------------------------------- * HYPRE_AMESetRTol *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_AMESetRTol(HYPRE_Solver esolver, HYPRE_Real tol) { return hypre_AMESetRTol((void *) esolver, tol); } /*-------------------------------------------------------------------------- * HYPRE_AMESetPrintLevel *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_AMESetPrintLevel(HYPRE_Solver esolver, HYPRE_Int print_level) { return hypre_AMESetPrintLevel((void *) esolver, print_level); } /*-------------------------------------------------------------------------- * HYPRE_AMEGetEigenvalues *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_AMEGetEigenvalues(HYPRE_Solver esolver, HYPRE_Real **eigenvalues) { return hypre_AMEGetEigenvalues((void *) esolver, eigenvalues); } /*-------------------------------------------------------------------------- * HYPRE_AMEGetEigenvectors *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_AMEGetEigenvectors(HYPRE_Solver esolver, HYPRE_ParVector **eigenvectors) { return hypre_AMEGetEigenvectors((void *) esolver, eigenvectors); } hypre-2.33.0/src/parcsr_ls/HYPRE_ams.c000066400000000000000000000375731477326011500174250ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "_hypre_parcsr_ls.h" /*-------------------------------------------------------------------------- * HYPRE_AMSCreate *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_AMSCreate(HYPRE_Solver *solver) { *solver = (HYPRE_Solver) hypre_AMSCreate(); return hypre_error_flag; } /*-------------------------------------------------------------------------- * HYPRE_AMSDestroy *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_AMSDestroy(HYPRE_Solver solver) { return hypre_AMSDestroy((void *) solver); } /*-------------------------------------------------------------------------- * HYPRE_AMSSetup *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_AMSSetup (HYPRE_Solver solver, HYPRE_ParCSRMatrix A, HYPRE_ParVector b, HYPRE_ParVector x) { return hypre_AMSSetup((void *) solver, (hypre_ParCSRMatrix *) A, (hypre_ParVector *) b, (hypre_ParVector *) x); } /*-------------------------------------------------------------------------- * HYPRE_AMSSolve *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_AMSSolve (HYPRE_Solver solver, HYPRE_ParCSRMatrix A, HYPRE_ParVector b, HYPRE_ParVector x) { return hypre_AMSSolve((void *) solver, (hypre_ParCSRMatrix *) A, (hypre_ParVector *) b, (hypre_ParVector *) x); } /*-------------------------------------------------------------------------- * HYPRE_AMSSetDimension *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_AMSSetDimension(HYPRE_Solver solver, HYPRE_Int dim) { return hypre_AMSSetDimension((void *) solver, dim); } /*-------------------------------------------------------------------------- * HYPRE_AMSSetDiscreteGradient *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_AMSSetDiscreteGradient(HYPRE_Solver solver, HYPRE_ParCSRMatrix G) { return hypre_AMSSetDiscreteGradient((void *) solver, (hypre_ParCSRMatrix *) G); } /*-------------------------------------------------------------------------- * HYPRE_AMSSetCoordinateVectors *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_AMSSetCoordinateVectors(HYPRE_Solver solver, HYPRE_ParVector x, HYPRE_ParVector y, HYPRE_ParVector z) { return hypre_AMSSetCoordinateVectors((void *) solver, (hypre_ParVector *) x, (hypre_ParVector *) y, (hypre_ParVector *) z); } /*-------------------------------------------------------------------------- * HYPRE_AMSSetEdgeConstantVectors *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_AMSSetEdgeConstantVectors(HYPRE_Solver solver, HYPRE_ParVector Gx, HYPRE_ParVector Gy, HYPRE_ParVector Gz) { return hypre_AMSSetEdgeConstantVectors((void *) solver, (hypre_ParVector *) Gx, (hypre_ParVector *) Gy, (hypre_ParVector *) Gz); } /*-------------------------------------------------------------------------- * HYPRE_AMSSetInterpolations *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_AMSSetInterpolations(HYPRE_Solver solver, HYPRE_ParCSRMatrix Pi, HYPRE_ParCSRMatrix Pix, HYPRE_ParCSRMatrix Piy, HYPRE_ParCSRMatrix Piz) { return hypre_AMSSetInterpolations((void *) solver, (hypre_ParCSRMatrix *) Pi, (hypre_ParCSRMatrix *) Pix, (hypre_ParCSRMatrix *) Piy, (hypre_ParCSRMatrix *) Piz); } /*-------------------------------------------------------------------------- * HYPRE_AMSSetAlphaPoissonMatrix *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_AMSSetAlphaPoissonMatrix(HYPRE_Solver solver, HYPRE_ParCSRMatrix A_alpha) { return hypre_AMSSetAlphaPoissonMatrix((void *) solver, (hypre_ParCSRMatrix *) A_alpha); } /*-------------------------------------------------------------------------- * HYPRE_AMSSetBetaPoissonMatrix *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_AMSSetBetaPoissonMatrix(HYPRE_Solver solver, HYPRE_ParCSRMatrix A_beta) { return hypre_AMSSetBetaPoissonMatrix((void *) solver, (hypre_ParCSRMatrix *) A_beta); } /*-------------------------------------------------------------------------- * HYPRE_AMSSetSetInteriorNodes *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_AMSSetInteriorNodes(HYPRE_Solver solver, HYPRE_ParVector interior_nodes) { return hypre_AMSSetInteriorNodes((void *) solver, (hypre_ParVector *) interior_nodes); } /*-------------------------------------------------------------------------- * HYPRE_AMSSetSetProjectionFrequency *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_AMSSetProjectionFrequency(HYPRE_Solver solver, HYPRE_Int projection_frequency) { return hypre_AMSSetProjectionFrequency((void *) solver, projection_frequency); } /*-------------------------------------------------------------------------- * HYPRE_AMSSetMaxIter *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_AMSSetMaxIter(HYPRE_Solver solver, HYPRE_Int maxit) { return hypre_AMSSetMaxIter((void *) solver, maxit); } /*-------------------------------------------------------------------------- * HYPRE_AMSSetTol *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_AMSSetTol(HYPRE_Solver solver, HYPRE_Real tol) { return hypre_AMSSetTol((void *) solver, tol); } /*-------------------------------------------------------------------------- * HYPRE_AMSSetCycleType *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_AMSSetCycleType(HYPRE_Solver solver, HYPRE_Int cycle_type) { return hypre_AMSSetCycleType((void *) solver, cycle_type); } /*-------------------------------------------------------------------------- * HYPRE_AMSSetPrintLevel *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_AMSSetPrintLevel(HYPRE_Solver solver, HYPRE_Int print_level) { return hypre_AMSSetPrintLevel((void *) solver, print_level); } /*-------------------------------------------------------------------------- * HYPRE_AMSSetSmoothingOptions *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_AMSSetSmoothingOptions(HYPRE_Solver solver, HYPRE_Int relax_type, HYPRE_Int relax_times, HYPRE_Real relax_weight, HYPRE_Real omega) { return hypre_AMSSetSmoothingOptions((void *) solver, relax_type, relax_times, relax_weight, omega); } /*-------------------------------------------------------------------------- * HYPRE_AMSSetChebyOptions *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_AMSSetChebySmoothingOptions(HYPRE_Solver solver, HYPRE_Int cheby_order, HYPRE_Real cheby_fraction) { return hypre_AMSSetChebySmoothingOptions((void *) solver, cheby_order, cheby_fraction); } /*-------------------------------------------------------------------------- * HYPRE_AMSSetAlphaAMGOptions *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_AMSSetAlphaAMGOptions(HYPRE_Solver solver, HYPRE_Int alpha_coarsen_type, HYPRE_Int alpha_agg_levels, HYPRE_Int alpha_relax_type, HYPRE_Real alpha_strength_threshold, HYPRE_Int alpha_interp_type, HYPRE_Int alpha_Pmax) { return hypre_AMSSetAlphaAMGOptions((void *) solver, alpha_coarsen_type, alpha_agg_levels, alpha_relax_type, alpha_strength_threshold, alpha_interp_type, alpha_Pmax); } /*-------------------------------------------------------------------------- * HYPRE_AMSSetAlphaAMGCoarseRelaxType *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_AMSSetAlphaAMGCoarseRelaxType(HYPRE_Solver solver, HYPRE_Int alpha_coarse_relax_type) { return hypre_AMSSetAlphaAMGCoarseRelaxType((void *) solver, alpha_coarse_relax_type); } /*-------------------------------------------------------------------------- * HYPRE_AMSSetBetaAMGOptions *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_AMSSetBetaAMGOptions(HYPRE_Solver solver, HYPRE_Int beta_coarsen_type, HYPRE_Int beta_agg_levels, HYPRE_Int beta_relax_type, HYPRE_Real beta_strength_threshold, HYPRE_Int beta_interp_type, HYPRE_Int beta_Pmax) { return hypre_AMSSetBetaAMGOptions((void *) solver, beta_coarsen_type, beta_agg_levels, beta_relax_type, beta_strength_threshold, beta_interp_type, beta_Pmax); } /*-------------------------------------------------------------------------- * HYPRE_AMSSetBetaAMGCoarseRelaxType *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_AMSSetBetaAMGCoarseRelaxType(HYPRE_Solver solver, HYPRE_Int beta_coarse_relax_type) { return hypre_AMSSetBetaAMGCoarseRelaxType((void *) solver, beta_coarse_relax_type); } /*-------------------------------------------------------------------------- * HYPRE_AMSGetNumIterations *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_AMSGetNumIterations(HYPRE_Solver solver, HYPRE_Int *num_iterations) { return hypre_AMSGetNumIterations((void *) solver, num_iterations); } /*-------------------------------------------------------------------------- * HYPRE_AMSGetFinalRelativeResidualNorm *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_AMSGetFinalRelativeResidualNorm(HYPRE_Solver solver, HYPRE_Real *rel_resid_norm) { return hypre_AMSGetFinalRelativeResidualNorm((void *) solver, rel_resid_norm); } /*-------------------------------------------------------------------------- * HYPRE_AMSProjectOutGradients *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_AMSProjectOutGradients(HYPRE_Solver solver, HYPRE_ParVector x) { return hypre_AMSProjectOutGradients((void *) solver, (hypre_ParVector *) x); } /*-------------------------------------------------------------------------- * HYPRE_AMSConstructDiscreteGradient *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_AMSConstructDiscreteGradient(HYPRE_ParCSRMatrix A, HYPRE_ParVector x_coord, HYPRE_BigInt *edge_vertex, HYPRE_Int edge_orientation, HYPRE_ParCSRMatrix *G) { return hypre_AMSConstructDiscreteGradient((hypre_ParCSRMatrix *) A, (hypre_ParVector *) x_coord, edge_vertex, edge_orientation, (hypre_ParCSRMatrix **) G); } /*-------------------------------------------------------------------------- * HYPRE_AMSFEISetup *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_AMSFEISetup(HYPRE_Solver solver, HYPRE_ParCSRMatrix A, HYPRE_ParVector b, HYPRE_ParVector x, HYPRE_BigInt *EdgeNodeList_, HYPRE_BigInt *NodeNumbers_, HYPRE_Int numEdges_, HYPRE_Int numLocalNodes_, HYPRE_Int numNodes_, HYPRE_Real *NodalCoord_) { return hypre_AMSFEISetup((void *) solver, (hypre_ParCSRMatrix *) A, (hypre_ParVector *) b, (hypre_ParVector *) x, numNodes_, numLocalNodes_, NodeNumbers_, NodalCoord_, numEdges_, EdgeNodeList_); } /*-------------------------------------------------------------------------- * HYPRE_AMSFEIDestroy *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_AMSFEIDestroy(HYPRE_Solver solver) { return hypre_AMSFEIDestroy((void *) solver); } hypre-2.33.0/src/parcsr_ls/HYPRE_parcsr_Euclid.c000066400000000000000000000372451477326011500214200ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "./HYPRE_parcsr_ls.h" #include "../matrix_matrix/HYPRE_matrix_matrix_protos.h" #include "_hypre_utilities.h" /* Must include implementation definition for ParVector since no data access functions are publically provided. AJC, 5/99 */ /* Likewise for Vector. AJC, 5/99 */ #include "../seq_mv/vector.h" /* AB 8/06 - replace header file */ /* #include "../parcsr_mv/par_vector.h" */ #include "../parcsr_mv/_hypre_parcsr_mv.h" /* These are what we need from Euclid */ #include "distributed_ls/Euclid/_hypre_Euclid.h" /* #include "../distributed_ls/Euclid/Mem_dh.h" */ /* #include "../distributed_ls/Euclid/io_dh.h" */ /* #include "../distributed_ls/Euclid/TimeLog_dh.h" */ /* #include "../distributed_ls/Euclid/Parser_dh.h" */ /* #include "../distributed_ls/Euclid/Euclid_dh.h" */ /*------------------------------------------------------------------ * Error checking *------------------------------------------------------------------*/ #define HYPRE_EUCLID_ERRCHKA \ if (errFlag_dh) { \ setError_dh("", __FUNC__, __FILE__, __LINE__); \ printErrorMsg(stderr); \ hypre_MPI_Abort(comm_dh, -1); \ } /* What is best to do here? * What is HYPRE's error checking strategy? * The shadow knows . . . * * Note: HYPRE_EUCLID_ERRCHKA macro is only used within this file. * * Note: "printErrorMsg(stderr)" is O.K. for debugging and * development, possibly not for production. This * call causes Euclid to print a function call stack * trace that led to the error. (Potentially, each * MPI task could print a trace.) * * Note: the __FUNC__ defines at the beginning of the function * calls are used in Euclid's internal error-checking scheme. * The "START_FUNC_DH" and "END_FUNC_VAL" macros are * used for debugging: when "logFuncsToStderr == true" * a function call trace is force-written to stderr; * (useful for debugging over dial-up lines!) See * src/distributed_ls/Euclid/macros_dh.h and * src/distributed_ls/Euclid/src/globalObjects.c * for further info. */ /*-------------------------------------------------------------------------- * debugging: if ENABLE_EUCLID_LOGGING is defined, each MPI task will open * "logFile.id" for writing; also, function-call tracing is operational * (ie, you can set logFuncsToFile = true, logFuncsToSterr = true). * *--------------------------------------------------------------------------*/ #undef ENABLE_EUCLID_LOGGING #if !defined(ENABLE_EUCLID_LOGGING) #undef START_FUNC_DH #undef END_FUNC_VAL #undef END_FUNC_DH #define START_FUNC_DH /**/ #define END_FUNC_DH /**/ #define END_FUNC_VAL(a) return(a); #endif /*-------------------------------------------------------------------------- * HYPRE_EuclidCreate - Return a Euclid "solver". *--------------------------------------------------------------------------*/ #undef __FUNC__ #define __FUNC__ "HYPRE_EuclidCreate" HYPRE_Int HYPRE_EuclidCreate( MPI_Comm comm, HYPRE_Solver *solver ) { #ifdef HYPRE_MIXEDINT HYPRE_UNUSED_VAR(comm); HYPRE_UNUSED_VAR(solver); hypre_error_w_msg(HYPRE_ERROR_GENERIC, "Euclid cannot be used in mixedint mode!"); return hypre_error_flag; #else START_FUNC_DH Euclid_dh eu; /*----------------------------------------------------------- * create a few global objects (yuck!) for Euclid's use; * these are all pointers, are initially NULL, and are be set * back to NULL in HYPRE_EuclidDestroy() * Global objects are defined in * src/distributed_ls/Euclid/src/globalObjects.c *-----------------------------------------------------------*/ comm_dh = comm; hypre_MPI_Comm_size(comm_dh, &np_dh); HYPRE_EUCLID_ERRCHKA; hypre_MPI_Comm_rank(comm_dh, &myid_dh); HYPRE_EUCLID_ERRCHKA; #ifdef ENABLE_EUCLID_LOGGING openLogfile_dh(0, NULL); HYPRE_EUCLID_ERRCHKA; #endif if (mem_dh == NULL) { Mem_dhCreate(&mem_dh); HYPRE_EUCLID_ERRCHKA; } if (tlog_dh == NULL) { TimeLog_dhCreate(&tlog_dh); HYPRE_EUCLID_ERRCHKA; } if (parser_dh == NULL) { Parser_dhCreate(&parser_dh); HYPRE_EUCLID_ERRCHKA; } Parser_dhInit(parser_dh, 0, NULL); HYPRE_EUCLID_ERRCHKA; /*----------------------------------------------------------- * create and return a Euclid object *-----------------------------------------------------------*/ Euclid_dhCreate(&eu); HYPRE_EUCLID_ERRCHKA; *solver = (HYPRE_Solver) eu; END_FUNC_VAL(0) #endif } /*-------------------------------------------------------------------------- * HYPRE_EuclidDestroy - Destroy a Euclid object. *--------------------------------------------------------------------------*/ #undef __FUNC__ #define __FUNC__ "HYPRE_EuclidDestroy" HYPRE_Int HYPRE_EuclidDestroy( HYPRE_Solver solver ) { #ifdef HYPRE_MIXEDINT HYPRE_UNUSED_VAR(solver); hypre_error_w_msg(HYPRE_ERROR_GENERIC, "Euclid cannot be used in mixedint mode!"); return hypre_error_flag; #else START_FUNC_DH Euclid_dh eu = (Euclid_dh)solver; bool printMemReport = false; bool printStats = false; bool logging = eu->logging; /*---------------------------------------------------------------- this block is for printing test data; this is used for diffing in autotests. *---------------------------------------------------------------- */ if (Parser_dhHasSwitch(parser_dh, "-printTestData")) { FILE *fp; /* get filename to which to write report */ char fname[] = "test_data_dh.temp", *fnamePtr = fname; Parser_dhReadString(parser_dh, "-printTestData", &fnamePtr); HYPRE_EUCLID_ERRCHKA; if (!strcmp(fnamePtr, "1")) /* in case usr didn't supply a name! */ { fnamePtr = fname; } /* print the report */ fp = openFile_dh(fnamePtr, "w"); HYPRE_EUCLID_ERRCHKA; Euclid_dhPrintTestData(eu, fp); HYPRE_EUCLID_ERRCHKA; closeFile_dh(fp); HYPRE_EUCLID_ERRCHKA; printf_dh("\n@@@@@ Euclid test data was printed to file: %s\n\n", fnamePtr); } /*---------------------------------------------------------------- determine which of Euclid's internal reports to print *----------------------------------------------------------------*/ if (logging) { printStats = true; printMemReport = true; } if (parser_dh != NULL) { if (Parser_dhHasSwitch(parser_dh, "-eu_stats")) { printStats = true; } if (Parser_dhHasSwitch(parser_dh, "-eu_mem")) { printMemReport = true; } } /*------------------------------------------------------------------ print Euclid's internal report, then destroy the Euclid object *------------------------------------------------------------------ */ if (printStats) { Euclid_dhPrintHypreReport(eu, stdout); HYPRE_EUCLID_ERRCHKA; } Euclid_dhDestroy(eu); HYPRE_EUCLID_ERRCHKA; /*------------------------------------------------------------------ destroy all remaining Euclid library objects (except the memory object) *------------------------------------------------------------------ */ /*if (parser_dh != NULL) { dah 3/16/06 */ if (parser_dh != NULL && ref_counter == 0) { Parser_dhDestroy(parser_dh); HYPRE_EUCLID_ERRCHKA; parser_dh = NULL; } /*if (tlog_dh != NULL) { dah 3/16/06 */ if (tlog_dh != NULL && ref_counter == 0) { TimeLog_dhDestroy(tlog_dh); HYPRE_EUCLID_ERRCHKA; tlog_dh = NULL; } /*------------------------------------------------------------------ optionally print Euclid's memory report, then destroy the memory object. *------------------------------------------------------------------ */ /*if (mem_dh != NULL) { dah 3/16/06 */ if (mem_dh != NULL && ref_counter == 0) { if (printMemReport) { Mem_dhPrint(mem_dh, stdout, false); HYPRE_EUCLID_ERRCHKA; } Mem_dhDestroy(mem_dh); HYPRE_EUCLID_ERRCHKA; mem_dh = NULL; } #ifdef ENABLE_EUCLID_LOGGING closeLogfile_dh(); HYPRE_EUCLID_ERRCHKA; #endif END_FUNC_VAL(0) #endif } /*-------------------------------------------------------------------------- * HYPRE_EuclidSetup - Set up function for Euclid. *--------------------------------------------------------------------------*/ #undef __FUNC__ #define __FUNC__ "HYPRE_EuclidSetup" HYPRE_Int HYPRE_EuclidSetup( HYPRE_Solver solver, HYPRE_ParCSRMatrix A, HYPRE_ParVector b, HYPRE_ParVector x ) { HYPRE_UNUSED_VAR(b); HYPRE_UNUSED_VAR(x); #ifdef HYPRE_MIXEDINT HYPRE_UNUSED_VAR(solver); HYPRE_UNUSED_VAR(A); hypre_error_w_msg(HYPRE_ERROR_GENERIC, "Euclid cannot be used in mixedint mode!"); return hypre_error_flag; #else START_FUNC_DH Euclid_dh eu = (Euclid_dh)solver; #if 0 for testing! { HYPRE_Int ierr; HYPRE_Int m, n, rs, re, cs, ce; HYPRE_DistributedMatrix mat; ierr = HYPRE_ConvertParCSRMatrixToDistributedMatrix( A, &mat ); if (ierr) { exit(-1); } ierr = HYPRE_DistributedMatrixGetDims(mat, &m, &n); ierr = HYPRE_DistributedMatrixGetLocalRange(mat, &rs, &re, &cs, &ce); hypre_printf("\n### [%i] m= %i, n= %i, rs= %i, re= %i, cs= %i, ce= %i\n", myid_dh, m, n, rs, re, cs, ce); ierr = HYPRE_DistributedMatrixDestroy(mat); if (ierr) { exit(-1); } } #endif Euclid_dhInputHypreMat(eu, A); HYPRE_EUCLID_ERRCHKA; Euclid_dhSetup(eu); HYPRE_EUCLID_ERRCHKA; END_FUNC_VAL(0) #endif } /*-------------------------------------------------------------------------- * HYPRE_EuclidSolve - Solve function for Euclid. *--------------------------------------------------------------------------*/ #undef __FUNC__ #define __FUNC__ "HYPRE_EuclidSolve" HYPRE_Int HYPRE_EuclidSolve( HYPRE_Solver solver, HYPRE_ParCSRMatrix A, HYPRE_ParVector bb, HYPRE_ParVector xx ) { HYPRE_UNUSED_VAR(A); #ifdef HYPRE_MIXEDINT HYPRE_UNUSED_VAR(solver); HYPRE_UNUSED_VAR(bb); HYPRE_UNUSED_VAR(xx); hypre_error_w_msg(HYPRE_ERROR_GENERIC, "Euclid cannot be used in mixedint mode!"); return hypre_error_flag; #else START_FUNC_DH Euclid_dh eu = (Euclid_dh)solver; HYPRE_Real *b, *x; x = hypre_VectorData(hypre_ParVectorLocalVector((hypre_ParVector *) bb)); b = hypre_VectorData(hypre_ParVectorLocalVector((hypre_ParVector *) xx)); Euclid_dhApply(eu, x, b); HYPRE_EUCLID_ERRCHKA; END_FUNC_VAL(0) #endif } /*-------------------------------------------------------------------------- * Insert command line (flag, value) pairs in Euclid's *--------------------------------------------------------------------------*/ #undef __FUNC__ #define __FUNC__ "HYPRE_EuclidSetParams" HYPRE_Int HYPRE_EuclidSetParams(HYPRE_Solver solver, HYPRE_Int argc, char *argv[] ) { HYPRE_UNUSED_VAR(solver); #ifdef HYPRE_MIXEDINT HYPRE_UNUSED_VAR(argc); HYPRE_UNUSED_VAR(argv); hypre_error_w_msg(HYPRE_ERROR_GENERIC, "Euclid cannot be used in mixedint mode!"); return hypre_error_flag; #else START_FUNC_DH Parser_dhInit(parser_dh, argc, argv); HYPRE_EUCLID_ERRCHKA; /* maintainers note: even though Parser_dhInit() was called in HYPRE_EuclidCreate(), it's O.K. to call it again. */ END_FUNC_VAL(0) #endif } /*-------------------------------------------------------------------------- * Insert (flag, value) pairs in Euclid's database from file *--------------------------------------------------------------------------*/ #undef __FUNC__ #define __FUNC__ "HYPRE_EuclidSetParamsFromFile" HYPRE_Int HYPRE_EuclidSetParamsFromFile(HYPRE_Solver solver, char *filename ) { HYPRE_UNUSED_VAR(solver); #ifdef HYPRE_MIXEDINT HYPRE_UNUSED_VAR(filename); hypre_error_w_msg(HYPRE_ERROR_GENERIC, "Euclid cannot be used in mixedint mode!"); return hypre_error_flag; #else START_FUNC_DH Parser_dhUpdateFromFile(parser_dh, filename); HYPRE_EUCLID_ERRCHKA; END_FUNC_VAL(0) #endif } HYPRE_Int HYPRE_EuclidSetLevel(HYPRE_Solver solver, HYPRE_Int level) { HYPRE_UNUSED_VAR(solver); #ifdef HYPRE_MIXEDINT HYPRE_UNUSED_VAR(level); hypre_error_w_msg(HYPRE_ERROR_GENERIC, "Euclid cannot be used in mixedint mode!"); return hypre_error_flag; #else char str_level[8]; START_FUNC_DH hypre_sprintf(str_level, "%d", level); Parser_dhInsert(parser_dh, "-level", str_level); HYPRE_EUCLID_ERRCHKA; END_FUNC_VAL(0) #endif } HYPRE_Int HYPRE_EuclidSetBJ(HYPRE_Solver solver, HYPRE_Int bj) { HYPRE_UNUSED_VAR(solver); #ifdef HYPRE_MIXEDINT HYPRE_UNUSED_VAR(bj); hypre_error_w_msg(HYPRE_ERROR_GENERIC, "Euclid cannot be used in mixedint mode!"); return hypre_error_flag; #else char str_bj[8]; START_FUNC_DH hypre_sprintf(str_bj, "%d", bj); Parser_dhInsert(parser_dh, "-bj", str_bj); HYPRE_EUCLID_ERRCHKA; END_FUNC_VAL(0) #endif } HYPRE_Int HYPRE_EuclidSetStats(HYPRE_Solver solver, HYPRE_Int eu_stats) { HYPRE_UNUSED_VAR(solver); #ifdef HYPRE_MIXEDINT HYPRE_UNUSED_VAR(eu_stats); hypre_error_w_msg(HYPRE_ERROR_GENERIC, "Euclid cannot be used in mixedint mode!"); return hypre_error_flag; #else char str_eu_stats[8]; START_FUNC_DH hypre_sprintf(str_eu_stats, "%d", eu_stats); Parser_dhInsert(parser_dh, "-eu_stats", str_eu_stats); HYPRE_EUCLID_ERRCHKA; END_FUNC_VAL(0) #endif } HYPRE_Int HYPRE_EuclidSetMem(HYPRE_Solver solver, HYPRE_Int eu_mem) { HYPRE_UNUSED_VAR(solver); #ifdef HYPRE_MIXEDINT HYPRE_UNUSED_VAR(eu_mem); hypre_error_w_msg(HYPRE_ERROR_GENERIC, "Euclid cannot be used in mixedint mode!"); return hypre_error_flag; #else char str_eu_mem[8]; START_FUNC_DH hypre_sprintf(str_eu_mem, "%d", eu_mem); Parser_dhInsert(parser_dh, "-eu_mem", str_eu_mem); HYPRE_EUCLID_ERRCHKA; END_FUNC_VAL(0) #endif } HYPRE_Int HYPRE_EuclidSetSparseA(HYPRE_Solver solver, HYPRE_Real sparse_A) { HYPRE_UNUSED_VAR(solver); #ifdef HYPRE_MIXEDINT HYPRE_UNUSED_VAR(sparse_A); hypre_error_w_msg(HYPRE_ERROR_GENERIC, "Euclid cannot be used in mixedint mode!"); return hypre_error_flag; #else char str_sparse_A[256]; START_FUNC_DH hypre_sprintf(str_sparse_A, "%f", sparse_A); Parser_dhInsert(parser_dh, "-sparseA", str_sparse_A); HYPRE_EUCLID_ERRCHKA; END_FUNC_VAL(0) #endif } HYPRE_Int HYPRE_EuclidSetRowScale(HYPRE_Solver solver, HYPRE_Int row_scale) { HYPRE_UNUSED_VAR(solver); #ifdef HYPRE_MIXEDINT HYPRE_UNUSED_VAR(row_scale); hypre_error_w_msg(HYPRE_ERROR_GENERIC, "Euclid cannot be used in mixedint mode!"); return hypre_error_flag; #else char str_row_scale[8]; START_FUNC_DH hypre_sprintf(str_row_scale, "%d", row_scale); Parser_dhInsert(parser_dh, "-rowScale", str_row_scale); HYPRE_EUCLID_ERRCHKA; END_FUNC_VAL(0) #endif } HYPRE_Int HYPRE_EuclidSetILUT(HYPRE_Solver solver, HYPRE_Real ilut) { HYPRE_UNUSED_VAR(solver); #ifdef HYPRE_MIXEDINT HYPRE_UNUSED_VAR(ilut); hypre_error_w_msg(HYPRE_ERROR_GENERIC, "Euclid cannot be used in mixedint mode!"); return hypre_error_flag; #else char str_ilut[256]; START_FUNC_DH hypre_sprintf(str_ilut, "%f", ilut); Parser_dhInsert(parser_dh, "-ilut", str_ilut); HYPRE_EUCLID_ERRCHKA; END_FUNC_VAL(0) #endif } hypre-2.33.0/src/parcsr_ls/HYPRE_parcsr_ParaSails.c000066400000000000000000000604271477326011500220700ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * HYPRE_ParCSRParaSails interface * *****************************************************************************/ #include #include #include #include "./HYPRE_parcsr_ls.h" #include "./_hypre_parcsr_ls.h" #include "../distributed_matrix/HYPRE_distributed_matrix_types.h" #include "../distributed_matrix/HYPRE_distributed_matrix_protos.h" #include "../matrix_matrix/HYPRE_matrix_matrix_protos.h" #include "../distributed_ls/ParaSails/hypre_ParaSails.h" /* these includes required for HYPRE_ParaSailsBuildIJMatrix */ #include "../IJ_mv/HYPRE_IJ_mv.h" /* Must include implementation definition for ParVector since no data access functions are publically provided. AJC, 5/99 */ /* Likewise for Vector. AJC, 5/99 */ #include "../seq_mv/vector.h" /* AB 8/06 - replace header file */ /* #include "../parcsr_mv/par_vector.h" */ #include "../parcsr_mv/_hypre_parcsr_mv.h" /* If code is more mysterious, then it must be good */ typedef struct { hypre_ParaSails obj; HYPRE_Int sym; HYPRE_Real thresh; HYPRE_Int nlevels; HYPRE_Real filter; HYPRE_Real loadbal; HYPRE_Int reuse; /* reuse pattern */ MPI_Comm comm; HYPRE_Int logging; } Secret; /*-------------------------------------------------------------------------- * HYPRE_ParCSRParaSailsCreate - Return a ParaSails preconditioner object * "solver". The default parameters for the preconditioner are also set, * so a call to HYPRE_ParCSRParaSailsSetParams is not absolutely necessary. *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ParCSRParaSailsCreate( MPI_Comm comm, HYPRE_Solver *solver ) { #ifdef HYPRE_MIXEDINT HYPRE_UNUSED_VAR(comm); HYPRE_UNUSED_VAR(solver); hypre_error_w_msg(HYPRE_ERROR_GENERIC, "ParaSails not usable in mixedint mode!"); return hypre_error_flag; #else Secret *secret; secret = hypre_TAlloc(Secret, 1, HYPRE_MEMORY_HOST); if (secret == NULL) { hypre_error(HYPRE_ERROR_MEMORY); return hypre_error_flag; } secret->sym = 1; secret->thresh = 0.1; secret->nlevels = 1; secret->filter = 0.1; secret->loadbal = 0.0; secret->reuse = 0; secret->comm = comm; secret->logging = 0; hypre_ParaSailsCreate(comm, &secret->obj); *solver = (HYPRE_Solver) secret; return hypre_error_flag; #endif } /*-------------------------------------------------------------------------- * HYPRE_ParCSRParaSailsDestroy - Destroy a ParaSails object. *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ParCSRParaSailsDestroy( HYPRE_Solver solver ) { #ifdef HYPRE_MIXEDINT HYPRE_UNUSED_VAR(solver); hypre_error_w_msg(HYPRE_ERROR_GENERIC, "ParaSails not usable in mixedint mode!"); return hypre_error_flag; #else Secret *secret; secret = (Secret *) solver; hypre_ParaSailsDestroy(secret->obj); hypre_TFree(secret, HYPRE_MEMORY_HOST); return hypre_error_flag; #endif } /*-------------------------------------------------------------------------- * HYPRE_ParCSRParaSailsSetup - Set up function for ParaSails. * This function is not called on subsequent times if the preconditioner is * being reused. *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ParCSRParaSailsSetup( HYPRE_Solver solver, HYPRE_ParCSRMatrix A, HYPRE_ParVector b, HYPRE_ParVector x ) { HYPRE_UNUSED_VAR(b); HYPRE_UNUSED_VAR(x); #ifdef HYPRE_MIXEDINT HYPRE_UNUSED_VAR(solver); HYPRE_UNUSED_VAR(A); hypre_error_w_msg(HYPRE_ERROR_GENERIC, "ParaSails not usable in mixedint mode!"); return hypre_error_flag; #else static HYPRE_Int virgin = 1; HYPRE_DistributedMatrix mat; Secret *secret = (Secret *) solver; /* The following call will also create the distributed matrix */ HYPRE_ConvertParCSRMatrixToDistributedMatrix( A, &mat ); if (hypre_error_flag) { return hypre_error_flag; } if (virgin || secret->reuse == 0) /* call set up at least once */ { virgin = 0; hypre_ParaSailsSetup( secret->obj, mat, secret->sym, secret->thresh, secret->nlevels, secret->filter, secret->loadbal, secret->logging); if (hypre_error_flag) { return hypre_error_flag; } } else /* reuse is true; this is a subsequent call */ { /* reuse pattern: always use filter value of 0 and loadbal of 0 */ hypre_ParaSailsSetupValues(secret->obj, mat, 0.0, 0.0, secret->logging); if (hypre_error_flag) { return hypre_error_flag; } } HYPRE_DistributedMatrixDestroy(mat); return hypre_error_flag; #endif } /*-------------------------------------------------------------------------- * HYPRE_ParCSRParaSailsSolve - Solve function for ParaSails. *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ParCSRParaSailsSolve( HYPRE_Solver solver, HYPRE_ParCSRMatrix A, HYPRE_ParVector b, HYPRE_ParVector x ) { HYPRE_UNUSED_VAR(A); #ifdef HYPRE_MIXEDINT HYPRE_UNUSED_VAR(b); HYPRE_UNUSED_VAR(x); HYPRE_UNUSED_VAR(solver); hypre_error_w_msg(HYPRE_ERROR_GENERIC, "ParaSails not usable in mixedint mode!"); return hypre_error_flag; #else HYPRE_Real *rhs, *soln; Secret *secret = (Secret *) solver; rhs = hypre_VectorData(hypre_ParVectorLocalVector((hypre_ParVector *) b)); soln = hypre_VectorData(hypre_ParVectorLocalVector((hypre_ParVector *) x)); hypre_ParaSailsApply(secret->obj, rhs, soln); return hypre_error_flag; #endif } /*-------------------------------------------------------------------------- * HYPRE_ParCSRParaSailsSetParams - Set the parameters "thresh" and "nlevels" * for a ParaSails object. *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ParCSRParaSailsSetParams(HYPRE_Solver solver, HYPRE_Real thresh, HYPRE_Int nlevels ) { #ifdef HYPRE_MIXEDINT HYPRE_UNUSED_VAR(solver); HYPRE_UNUSED_VAR(thresh); HYPRE_UNUSED_VAR(nlevels); hypre_error_w_msg(HYPRE_ERROR_GENERIC, "ParaSails not usable in mixedint mode!"); return hypre_error_flag; #else Secret *secret = (Secret *) solver; secret->thresh = thresh; secret->nlevels = nlevels; return hypre_error_flag; #endif } /*-------------------------------------------------------------------------- * HYPRE_ParCSRParaSailsSetFilter - Set the filter parameter, * HYPRE_ParCSRParaSailsGetFilter *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ParCSRParaSailsSetFilter(HYPRE_Solver solver, HYPRE_Real filter ) { #ifdef HYPRE_MIXEDINT HYPRE_UNUSED_VAR(solver); HYPRE_UNUSED_VAR(filter); hypre_error_w_msg(HYPRE_ERROR_GENERIC, "ParaSails not usable in mixedint mode!"); return hypre_error_flag; #else Secret *secret = (Secret *) solver; secret->filter = filter; return hypre_error_flag; #endif } HYPRE_Int HYPRE_ParCSRParaSailsGetFilter(HYPRE_Solver solver, HYPRE_Real * filter ) { #ifdef HYPRE_MIXEDINT HYPRE_UNUSED_VAR(solver); HYPRE_UNUSED_VAR(filter); hypre_error_w_msg(HYPRE_ERROR_GENERIC, "ParaSails not usable in mixedint mode!"); return hypre_error_flag; #else Secret *secret = (Secret *) solver; *filter = secret->filter; return hypre_error_flag; #endif } /*-------------------------------------------------------------------------- * HYPRE_ParCSRParaSailsSetSym - Set whether the matrix is symmetric: * nonzero = symmetric, 0 = nonsymmetric. *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ParCSRParaSailsSetSym(HYPRE_Solver solver, HYPRE_Int sym ) { #ifdef HYPRE_MIXEDINT HYPRE_UNUSED_VAR(solver); HYPRE_UNUSED_VAR(sym); hypre_error_w_msg(HYPRE_ERROR_GENERIC, "ParaSails not usable in mixedint mode!"); return hypre_error_flag; #else Secret *secret = (Secret *) solver; secret->sym = sym; return hypre_error_flag; #endif } /*-------------------------------------------------------------------------- * HYPRE_ParCSRParaSailsSetLoadbal, HYPRE_ParCSRParaSailsGetLoadbal *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ParCSRParaSailsSetLoadbal(HYPRE_Solver solver, HYPRE_Real loadbal ) { #ifdef HYPRE_MIXEDINT HYPRE_UNUSED_VAR(solver); HYPRE_UNUSED_VAR(loadbal); hypre_error_w_msg(HYPRE_ERROR_GENERIC, "ParaSails not usable in mixedint mode!"); return hypre_error_flag; #else Secret *secret = (Secret *) solver; secret->loadbal = loadbal; return hypre_error_flag; #endif } HYPRE_Int HYPRE_ParCSRParaSailsGetLoadbal(HYPRE_Solver solver, HYPRE_Real * loadbal ) { #ifdef HYPRE_MIXEDINT HYPRE_UNUSED_VAR(solver); HYPRE_UNUSED_VAR(loadbal); hypre_error_w_msg(HYPRE_ERROR_GENERIC, "ParaSails not usable in mixedint mode!"); return hypre_error_flag; #else Secret *secret = (Secret *) solver; *loadbal = secret->loadbal; return hypre_error_flag; #endif } /*-------------------------------------------------------------------------- * HYPRE_ParCSRParaSailsSetReuse - reuse pattern if "reuse" if nonzero *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ParCSRParaSailsSetReuse(HYPRE_Solver solver, HYPRE_Int reuse ) { #ifdef HYPRE_MIXEDINT HYPRE_UNUSED_VAR(solver); HYPRE_UNUSED_VAR(reuse); hypre_error_w_msg(HYPRE_ERROR_GENERIC, "ParaSails not usable in mixedint mode!"); return hypre_error_flag; #else Secret *secret = (Secret *) solver; secret->reuse = reuse; return hypre_error_flag; #endif } /*-------------------------------------------------------------------------- * HYPRE_ParCSRParaSailsSetLogging - *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ParCSRParaSailsSetLogging(HYPRE_Solver solver, HYPRE_Int logging ) { #ifdef HYPRE_MIXEDINT HYPRE_UNUSED_VAR(solver); HYPRE_UNUSED_VAR(logging); hypre_error_w_msg(HYPRE_ERROR_GENERIC, "ParaSails not usable in mixedint mode!"); return hypre_error_flag; #else Secret *secret = (Secret *) solver; secret->logging = logging; return hypre_error_flag; #endif } /****************************************************************************** * * HYPRE_ParaSails interface * *****************************************************************************/ /*-------------------------------------------------------------------------- * HYPRE_ParaSailsCreate - Return a ParaSails preconditioner object * "solver". The default parameters for the preconditioner are also set, * so a call to HYPRE_ParaSailsSetParams is not absolutely necessary. *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ParaSailsCreate( MPI_Comm comm, HYPRE_Solver *solver ) { #ifdef HYPRE_MIXEDINT HYPRE_UNUSED_VAR(solver); HYPRE_UNUSED_VAR(comm); hypre_error_w_msg(HYPRE_ERROR_GENERIC, "ParaSails not usable in mixedint mode!"); return hypre_error_flag; #else Secret *secret; secret = hypre_TAlloc(Secret, 1, HYPRE_MEMORY_HOST); if (secret == NULL) { hypre_error(HYPRE_ERROR_MEMORY); return hypre_error_flag; } secret->sym = 1; secret->thresh = 0.1; secret->nlevels = 1; secret->filter = 0.1; secret->loadbal = 0.0; secret->reuse = 0; secret->comm = comm; secret->logging = 0; hypre_ParaSailsCreate(comm, &secret->obj); *solver = (HYPRE_Solver) secret; return hypre_error_flag; #endif } /*-------------------------------------------------------------------------- * HYPRE_ParaSailsDestroy - Destroy a ParaSails object. *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ParaSailsDestroy( HYPRE_Solver solver ) { #ifdef HYPRE_MIXEDINT HYPRE_UNUSED_VAR(solver); hypre_error_w_msg(HYPRE_ERROR_GENERIC, "ParaSails not usable in mixedint mode!"); return hypre_error_flag; #else Secret *secret; secret = (Secret *) solver; hypre_ParaSailsDestroy(secret->obj); hypre_TFree(secret, HYPRE_MEMORY_HOST); return hypre_error_flag; #endif } /*-------------------------------------------------------------------------- * HYPRE_ParaSailsSetup - Set up function for ParaSails. * This function is not called on subsequent times if the preconditioner is * being reused. *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ParaSailsSetup( HYPRE_Solver solver, HYPRE_ParCSRMatrix A, HYPRE_ParVector b, HYPRE_ParVector x ) { HYPRE_UNUSED_VAR(b); HYPRE_UNUSED_VAR(x); #ifdef HYPRE_MIXEDINT HYPRE_UNUSED_VAR(solver); HYPRE_UNUSED_VAR(A); hypre_error_w_msg(HYPRE_ERROR_GENERIC, "ParaSails not usable in mixedint mode!"); return hypre_error_flag; #else static HYPRE_Int virgin = 1; HYPRE_DistributedMatrix mat; Secret *secret = (Secret *) solver; HYPRE_Int ierr; /* The following call will also create the distributed matrix */ ierr = HYPRE_GetError(); HYPRE_ClearAllErrors(); HYPRE_ConvertParCSRMatrixToDistributedMatrix( A, &mat ); if (hypre_error_flag) { return hypre_error_flag |= ierr; } if (virgin || secret->reuse == 0) /* call set up at least once */ { virgin = 0; hypre_ParaSailsSetup( secret->obj, mat, secret->sym, secret->thresh, secret->nlevels, secret->filter, secret->loadbal, secret->logging); if (hypre_error_flag) { return hypre_error_flag |= ierr; } } else /* reuse is true; this is a subsequent call */ { /* reuse pattern: always use filter value of 0 and loadbal of 0 */ hypre_ParaSailsSetupValues(secret->obj, mat, 0.0, 0.0, secret->logging); if (hypre_error_flag) { return hypre_error_flag |= ierr; } } HYPRE_DistributedMatrixDestroy(mat); return hypre_error_flag; #endif } /*-------------------------------------------------------------------------- * HYPRE_ParaSailsSolve - Solve function for ParaSails. *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ParaSailsSolve( HYPRE_Solver solver, HYPRE_ParCSRMatrix A, HYPRE_ParVector b, HYPRE_ParVector x ) { HYPRE_UNUSED_VAR(A); #ifdef HYPRE_MIXEDINT HYPRE_UNUSED_VAR(solver); HYPRE_UNUSED_VAR(b); HYPRE_UNUSED_VAR(x); hypre_error_w_msg(HYPRE_ERROR_GENERIC, "ParaSails not usable in mixedint mode!"); return hypre_error_flag; #else HYPRE_Real *rhs, *soln; Secret *secret = (Secret *) solver; rhs = hypre_VectorData(hypre_ParVectorLocalVector((hypre_ParVector *) b)); soln = hypre_VectorData(hypre_ParVectorLocalVector((hypre_ParVector *) x)); hypre_ParaSailsApply(secret->obj, rhs, soln); return hypre_error_flag; #endif } /*-------------------------------------------------------------------------- * HYPRE_ParaSailsSetParams - Set the parameters "thresh" and "nlevels" * for a ParaSails object. *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ParaSailsSetParams(HYPRE_Solver solver, HYPRE_Real thresh, HYPRE_Int nlevels ) { #ifdef HYPRE_MIXEDINT HYPRE_UNUSED_VAR(solver); HYPRE_UNUSED_VAR(thresh); HYPRE_UNUSED_VAR(nlevels); hypre_error_w_msg(HYPRE_ERROR_GENERIC, "ParaSails not usable in mixedint mode!"); return hypre_error_flag; #else Secret *secret = (Secret *) solver; secret->thresh = thresh; secret->nlevels = nlevels; return hypre_error_flag; #endif } /*-------------------------------------------------------------------------- * HYPRE_ParaSailsSetThresh - Set the "thresh" parameter only * for a ParaSails object. * HYPRE_ParaSailsGetThresh *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ParaSailsSetThresh( HYPRE_Solver solver, HYPRE_Real thresh ) { #ifdef HYPRE_MIXEDINT HYPRE_UNUSED_VAR(solver); HYPRE_UNUSED_VAR(thresh); hypre_error_w_msg(HYPRE_ERROR_GENERIC, "ParaSails not usable in mixedint mode!"); return hypre_error_flag; #else Secret *secret = (Secret *) solver; secret->thresh = thresh; return hypre_error_flag; #endif } HYPRE_Int HYPRE_ParaSailsGetThresh( HYPRE_Solver solver, HYPRE_Real * thresh ) { #ifdef HYPRE_MIXEDINT HYPRE_UNUSED_VAR(solver); HYPRE_UNUSED_VAR(thresh); hypre_error_w_msg(HYPRE_ERROR_GENERIC, "ParaSails not usable in mixedint mode!"); return hypre_error_flag; #else Secret *secret = (Secret *) solver; *thresh = secret->thresh; return hypre_error_flag; #endif } /*-------------------------------------------------------------------------- * HYPRE_ParaSailsSetNlevels - Set the "nlevels" parameter only * for a ParaSails object. * HYPRE_ParaSailsGetNlevels *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ParaSailsSetNlevels( HYPRE_Solver solver, HYPRE_Int nlevels ) { #ifdef HYPRE_MIXEDINT HYPRE_UNUSED_VAR(solver); HYPRE_UNUSED_VAR(nlevels); hypre_error_w_msg(HYPRE_ERROR_GENERIC, "ParaSails not usable in mixedint mode!"); return hypre_error_flag; #else Secret *secret = (Secret *) solver; secret->nlevels = nlevels; return hypre_error_flag; #endif } HYPRE_Int HYPRE_ParaSailsGetNlevels( HYPRE_Solver solver, HYPRE_Int * nlevels ) { #ifdef HYPRE_MIXEDINT HYPRE_UNUSED_VAR(solver); HYPRE_UNUSED_VAR(nlevels); hypre_error_w_msg(HYPRE_ERROR_GENERIC, "ParaSails not usable in mixedint mode!"); return hypre_error_flag; #else Secret *secret = (Secret *) solver; *nlevels = secret->nlevels; return hypre_error_flag; #endif } /*-------------------------------------------------------------------------- * HYPRE_ParaSailsSetFilter - Set the filter parameter. * HYPRE_ParaSailsGetFilter *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ParaSailsSetFilter(HYPRE_Solver solver, HYPRE_Real filter ) { #ifdef HYPRE_MIXEDINT HYPRE_UNUSED_VAR(solver); HYPRE_UNUSED_VAR(filter); hypre_error_w_msg(HYPRE_ERROR_GENERIC, "ParaSails not usable in mixedint mode!"); return hypre_error_flag; #else Secret *secret = (Secret *) solver; secret->filter = filter; return hypre_error_flag; #endif } HYPRE_Int HYPRE_ParaSailsGetFilter(HYPRE_Solver solver, HYPRE_Real * filter ) { #ifdef HYPRE_MIXEDINT HYPRE_UNUSED_VAR(solver); HYPRE_UNUSED_VAR(filter); hypre_error_w_msg(HYPRE_ERROR_GENERIC, "ParaSails not usable in mixedint mode!"); return hypre_error_flag; #else Secret *secret = (Secret *) solver; *filter = secret->filter; return hypre_error_flag; #endif } /*-------------------------------------------------------------------------- * HYPRE_ParaSailsSetSym - Set whether the matrix is symmetric: * nonzero = symmetric, 0 = nonsymmetric. * HYPRE_ParaSailsGetSym *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ParaSailsSetSym(HYPRE_Solver solver, HYPRE_Int sym ) { #ifdef HYPRE_MIXEDINT HYPRE_UNUSED_VAR(solver); HYPRE_UNUSED_VAR(sym); hypre_error_w_msg(HYPRE_ERROR_GENERIC, "ParaSails not usable in mixedint mode!"); return hypre_error_flag; #else Secret *secret = (Secret *) solver; secret->sym = sym; return hypre_error_flag; #endif } HYPRE_Int HYPRE_ParaSailsGetSym(HYPRE_Solver solver, HYPRE_Int * sym ) { #ifdef HYPRE_MIXEDINT HYPRE_UNUSED_VAR(solver); HYPRE_UNUSED_VAR(sym); hypre_error_w_msg(HYPRE_ERROR_GENERIC, "ParaSails not usable in mixedint mode!"); return hypre_error_flag; #else Secret *secret = (Secret *) solver; *sym = secret->sym; return hypre_error_flag; #endif } /*-------------------------------------------------------------------------- * HYPRE_ParaSailsSetLoadbal, HYPRE_ParaSailsGetLoadbal *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ParaSailsSetLoadbal(HYPRE_Solver solver, HYPRE_Real loadbal ) { #ifdef HYPRE_MIXEDINT HYPRE_UNUSED_VAR(solver); HYPRE_UNUSED_VAR(loadbal); hypre_error_w_msg(HYPRE_ERROR_GENERIC, "ParaSails not usable in mixedint mode!"); return hypre_error_flag; #else Secret *secret = (Secret *) solver; secret->loadbal = loadbal; return hypre_error_flag; #endif } HYPRE_Int HYPRE_ParaSailsGetLoadbal(HYPRE_Solver solver, HYPRE_Real * loadbal ) { #ifdef HYPRE_MIXEDINT HYPRE_UNUSED_VAR(solver); HYPRE_UNUSED_VAR(loadbal); hypre_error_w_msg(HYPRE_ERROR_GENERIC, "ParaSails not usable in mixedint mode!"); return hypre_error_flag; #else Secret *secret = (Secret *) solver; *loadbal = secret->loadbal; return hypre_error_flag; #endif } /*-------------------------------------------------------------------------- * HYPRE_ParaSailsSetReuse - reuse pattern if "reuse" if nonzero * HYPRE_ParaSailsGetReuse *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ParaSailsSetReuse(HYPRE_Solver solver, HYPRE_Int reuse ) { #ifdef HYPRE_MIXEDINT HYPRE_UNUSED_VAR(solver); HYPRE_UNUSED_VAR(reuse); hypre_error_w_msg(HYPRE_ERROR_GENERIC, "ParaSails not usable in mixedint mode!"); return hypre_error_flag; #else Secret *secret = (Secret *) solver; secret->reuse = reuse; return hypre_error_flag; #endif } HYPRE_Int HYPRE_ParaSailsGetReuse(HYPRE_Solver solver, HYPRE_Int * reuse ) { #ifdef HYPRE_MIXEDINT HYPRE_UNUSED_VAR(solver); HYPRE_UNUSED_VAR(reuse); hypre_error_w_msg(HYPRE_ERROR_GENERIC, "ParaSails not usable in mixedint mode!"); return hypre_error_flag; #else Secret *secret = (Secret *) solver; *reuse = secret->reuse; return hypre_error_flag; #endif } /*-------------------------------------------------------------------------- * HYPRE_ParaSailsSetLogging, HYPRE_ParaSailsGetLogging *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ParaSailsSetLogging(HYPRE_Solver solver, HYPRE_Int logging ) { #ifdef HYPRE_MIXEDINT HYPRE_UNUSED_VAR(solver); HYPRE_UNUSED_VAR(logging); hypre_error_w_msg(HYPRE_ERROR_GENERIC, "ParaSails not usable in mixedint mode!"); return hypre_error_flag; #else Secret *secret = (Secret *) solver; secret->logging = logging; return hypre_error_flag; #endif } HYPRE_Int HYPRE_ParaSailsGetLogging(HYPRE_Solver solver, HYPRE_Int * logging ) { #ifdef HYPRE_MIXEDINT HYPRE_UNUSED_VAR(solver); HYPRE_UNUSED_VAR(logging); hypre_error_w_msg(HYPRE_ERROR_GENERIC, "ParaSails not usable in mixedint mode!"); return hypre_error_flag; #else Secret *secret = (Secret *) solver; *logging = secret->logging; return hypre_error_flag; #endif } /*-------------------------------------------------------------------------- * HYPRE_ParaSailsBuildIJMatrix - *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ParaSailsBuildIJMatrix(HYPRE_Solver solver, HYPRE_IJMatrix *pij_A) { #ifdef HYPRE_MIXEDINT HYPRE_UNUSED_VAR(solver); HYPRE_UNUSED_VAR(pij_A); hypre_error_w_msg(HYPRE_ERROR_GENERIC, "ParaSails not usable in mixedint mode!"); return hypre_error_flag; #else Secret *secret = (Secret *) solver; hypre_ParaSailsBuildIJMatrix(secret->obj, pij_A); return hypre_error_flag; #endif } hypre-2.33.0/src/parcsr_ls/HYPRE_parcsr_amg.c000066400000000000000000002371361477326011500207600ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "_hypre_parcsr_ls.h" /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGCreate *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_BoomerAMGCreate( HYPRE_Solver *solver) { if (!solver) { hypre_error_in_arg(1); return hypre_error_flag; } *solver = (HYPRE_Solver) hypre_BoomerAMGCreate( ) ; return hypre_error_flag; } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGDestroy *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_BoomerAMGDestroy( HYPRE_Solver solver ) { return ( hypre_BoomerAMGDestroy( (void *) solver ) ); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGSetup *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_BoomerAMGSetup( HYPRE_Solver solver, HYPRE_ParCSRMatrix A, HYPRE_ParVector b, HYPRE_ParVector x ) { if (!A) { hypre_error_in_arg(2); return hypre_error_flag; } return ( hypre_BoomerAMGSetup( (void *) solver, (hypre_ParCSRMatrix *) A, (hypre_ParVector *) b, (hypre_ParVector *) x ) ); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGSolve *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_BoomerAMGSolve( HYPRE_Solver solver, HYPRE_ParCSRMatrix A, HYPRE_ParVector b, HYPRE_ParVector x ) { if (!A) { hypre_error_in_arg(2); return hypre_error_flag; } if (!b) { hypre_error_in_arg(3); return hypre_error_flag; } if (!x) { hypre_error_in_arg(4); return hypre_error_flag; } return ( hypre_BoomerAMGSolve( (void *) solver, (hypre_ParCSRMatrix *) A, (hypre_ParVector *) b, (hypre_ParVector *) x ) ); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGSolveT *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_BoomerAMGSolveT( HYPRE_Solver solver, HYPRE_ParCSRMatrix A, HYPRE_ParVector b, HYPRE_ParVector x ) { if (!A) { hypre_error_in_arg(2); return hypre_error_flag; } if (!b) { hypre_error_in_arg(3); return hypre_error_flag; } if (!x) { hypre_error_in_arg(4); return hypre_error_flag; } return ( hypre_BoomerAMGSolveT( (void *) solver, (hypre_ParCSRMatrix *) A, (hypre_ParVector *) b, (hypre_ParVector *) x ) ); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGSetRestriction *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_BoomerAMGSetRestriction( HYPRE_Solver solver, HYPRE_Int restr_par ) { return ( hypre_BoomerAMGSetRestriction( (void *) solver, restr_par ) ); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGSetIsTriangular *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_BoomerAMGSetIsTriangular( HYPRE_Solver solver, HYPRE_Int is_triangular ) { return ( hypre_BoomerAMGSetIsTriangular( (void *) solver, is_triangular ) ); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGSetGMRESSwitchR *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_BoomerAMGSetGMRESSwitchR( HYPRE_Solver solver, HYPRE_Int gmres_switch ) { return ( hypre_BoomerAMGSetGMRESSwitchR( (void *) solver, gmres_switch ) ); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGSetMaxLevels, HYPRE_BoomerAMGGetMaxLevels *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_BoomerAMGSetMaxLevels( HYPRE_Solver solver, HYPRE_Int max_levels ) { return ( hypre_BoomerAMGSetMaxLevels( (void *) solver, max_levels ) ); } HYPRE_Int HYPRE_BoomerAMGGetMaxLevels( HYPRE_Solver solver, HYPRE_Int * max_levels ) { return ( hypre_BoomerAMGGetMaxLevels( (void *) solver, max_levels ) ); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGSetMaxCoarseSize, HYPRE_BoomerAMGGetMaxCoarseSize *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_BoomerAMGSetMaxCoarseSize( HYPRE_Solver solver, HYPRE_Int max_coarse_size ) { return ( hypre_BoomerAMGSetMaxCoarseSize( (void *) solver, max_coarse_size ) ); } HYPRE_Int HYPRE_BoomerAMGGetMaxCoarseSize( HYPRE_Solver solver, HYPRE_Int * max_coarse_size ) { return ( hypre_BoomerAMGGetMaxCoarseSize( (void *) solver, max_coarse_size ) ); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGSetMinCoarseSize, HYPRE_BoomerAMGGetMinCoarseSize *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_BoomerAMGSetMinCoarseSize( HYPRE_Solver solver, HYPRE_Int min_coarse_size ) { return ( hypre_BoomerAMGSetMinCoarseSize( (void *) solver, min_coarse_size ) ); } HYPRE_Int HYPRE_BoomerAMGGetMinCoarseSize( HYPRE_Solver solver, HYPRE_Int * min_coarse_size ) { return ( hypre_BoomerAMGGetMinCoarseSize( (void *) solver, min_coarse_size ) ); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGSetSeqThreshold, HYPRE_BoomerAMGGetSeqThreshold *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_BoomerAMGSetSeqThreshold( HYPRE_Solver solver, HYPRE_Int seq_threshold ) { return ( hypre_BoomerAMGSetSeqThreshold( (void *) solver, seq_threshold ) ); } HYPRE_Int HYPRE_BoomerAMGGetSeqThreshold( HYPRE_Solver solver, HYPRE_Int * seq_threshold ) { return ( hypre_BoomerAMGGetSeqThreshold( (void *) solver, seq_threshold ) ); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGSetRedundant, HYPRE_BoomerAMGGetRedundant *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_BoomerAMGSetRedundant( HYPRE_Solver solver, HYPRE_Int redundant ) { return ( hypre_BoomerAMGSetRedundant( (void *) solver, redundant ) ); } HYPRE_Int HYPRE_BoomerAMGGetRedundant( HYPRE_Solver solver, HYPRE_Int * redundant ) { return ( hypre_BoomerAMGGetRedundant( (void *) solver, redundant ) ); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGSetRedundant, HYPRE_BoomerAMGGetRedundant *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_BoomerAMGSetCoarsenCutFactor( HYPRE_Solver solver, HYPRE_Int coarsen_cut_factor ) { return ( hypre_BoomerAMGSetCoarsenCutFactor( (void *) solver, coarsen_cut_factor ) ); } HYPRE_Int HYPRE_BoomerAMGGetCoarsenCutFactor( HYPRE_Solver solver, HYPRE_Int *coarsen_cut_factor ) { return ( hypre_BoomerAMGGetCoarsenCutFactor( (void *) solver, coarsen_cut_factor ) ); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGSetStrongThreshold, HYPRE_BoomerAMGGetStrongThreshold *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_BoomerAMGSetStrongThreshold( HYPRE_Solver solver, HYPRE_Real strong_threshold ) { return ( hypre_BoomerAMGSetStrongThreshold( (void *) solver, strong_threshold ) ); } HYPRE_Int HYPRE_BoomerAMGGetStrongThreshold( HYPRE_Solver solver, HYPRE_Real * strong_threshold ) { return ( hypre_BoomerAMGGetStrongThreshold( (void *) solver, strong_threshold ) ); } HYPRE_Int HYPRE_BoomerAMGSetStrongThresholdR( HYPRE_Solver solver, HYPRE_Real strong_threshold ) { return ( hypre_BoomerAMGSetStrongThresholdR( (void *) solver, strong_threshold ) ); } HYPRE_Int HYPRE_BoomerAMGGetStrongThresholdR( HYPRE_Solver solver, HYPRE_Real * strong_threshold ) { return ( hypre_BoomerAMGGetStrongThresholdR( (void *) solver, strong_threshold ) ); } HYPRE_Int HYPRE_BoomerAMGSetFilterThresholdR( HYPRE_Solver solver, HYPRE_Real filter_threshold ) { return ( hypre_BoomerAMGSetFilterThresholdR( (void *) solver, filter_threshold ) ); } HYPRE_Int HYPRE_BoomerAMGGetFilterThresholdR( HYPRE_Solver solver, HYPRE_Real * filter_threshold ) { return ( hypre_BoomerAMGGetFilterThresholdR( (void *) solver, filter_threshold ) ); } HYPRE_Int HYPRE_BoomerAMGSetSabs( HYPRE_Solver solver, HYPRE_Int Sabs ) { return ( hypre_BoomerAMGSetSabs( (void *) solver, Sabs ) ); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGSetMaxRowSum, HYPRE_BoomerAMGGetMaxRowSum *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_BoomerAMGSetMaxRowSum( HYPRE_Solver solver, HYPRE_Real max_row_sum ) { return ( hypre_BoomerAMGSetMaxRowSum( (void *) solver, max_row_sum ) ); } HYPRE_Int HYPRE_BoomerAMGGetMaxRowSum( HYPRE_Solver solver, HYPRE_Real * max_row_sum ) { return ( hypre_BoomerAMGGetMaxRowSum( (void *) solver, max_row_sum ) ); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGSetTruncFactor, HYPRE_BoomerAMGGetTruncFactor *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_BoomerAMGSetTruncFactor( HYPRE_Solver solver, HYPRE_Real trunc_factor ) { return ( hypre_BoomerAMGSetTruncFactor( (void *) solver, trunc_factor ) ); } HYPRE_Int HYPRE_BoomerAMGGetTruncFactor( HYPRE_Solver solver, HYPRE_Real * trunc_factor ) { return ( hypre_BoomerAMGGetTruncFactor( (void *) solver, trunc_factor ) ); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGSetPMaxElmts, HYPRE_BoomerAMGGetPMaxElmts *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_BoomerAMGSetPMaxElmts( HYPRE_Solver solver, HYPRE_Int P_max_elmts ) { return ( hypre_BoomerAMGSetPMaxElmts( (void *) solver, P_max_elmts ) ); } HYPRE_Int HYPRE_BoomerAMGGetPMaxElmts( HYPRE_Solver solver, HYPRE_Int * P_max_elmts ) { return ( hypre_BoomerAMGGetPMaxElmts( (void *) solver, P_max_elmts ) ); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGSetJacobiTruncThreshold, HYPRE_BoomerAMGGetJacobiTruncThreshold *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_BoomerAMGSetJacobiTruncThreshold( HYPRE_Solver solver, HYPRE_Real jacobi_trunc_threshold ) { return ( hypre_BoomerAMGSetJacobiTruncThreshold( (void *) solver, jacobi_trunc_threshold ) ); } HYPRE_Int HYPRE_BoomerAMGGetJacobiTruncThreshold( HYPRE_Solver solver, HYPRE_Real * jacobi_trunc_threshold ) { return ( hypre_BoomerAMGGetJacobiTruncThreshold( (void *) solver, jacobi_trunc_threshold ) ); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGSetPostInterpType, HYPRE_BoomerAMGGetPostInterpType * If >0, specifies something to do to improve a computed interpolation matrix. * defaults to 0, for nothing. *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_BoomerAMGSetPostInterpType( HYPRE_Solver solver, HYPRE_Int post_interp_type ) { return ( hypre_BoomerAMGSetPostInterpType( (void *) solver, post_interp_type ) ); } HYPRE_Int HYPRE_BoomerAMGGetPostInterpType( HYPRE_Solver solver, HYPRE_Int * post_interp_type ) { return ( hypre_BoomerAMGGetPostInterpType( (void *) solver, post_interp_type ) ); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGSetSCommPkgSwitch *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_BoomerAMGSetSCommPkgSwitch( HYPRE_Solver solver, HYPRE_Real S_commpkg_switch ) { HYPRE_UNUSED_VAR(solver); HYPRE_UNUSED_VAR(S_commpkg_switch); return 0; } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGSetInterpType *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_BoomerAMGSetInterpType( HYPRE_Solver solver, HYPRE_Int interp_type ) { return ( hypre_BoomerAMGSetInterpType( (void *) solver, interp_type ) ); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGSetSepWeight *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_BoomerAMGSetSepWeight( HYPRE_Solver solver, HYPRE_Int sep_weight ) { return ( hypre_BoomerAMGSetSepWeight( (void *) solver, sep_weight ) ); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGSetMinIter *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_BoomerAMGSetMinIter( HYPRE_Solver solver, HYPRE_Int min_iter ) { return ( hypre_BoomerAMGSetMinIter( (void *) solver, min_iter ) ); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGSetMaxIter *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_BoomerAMGSetMaxIter( HYPRE_Solver solver, HYPRE_Int max_iter ) { return ( hypre_BoomerAMGSetMaxIter( (void *) solver, max_iter ) ); } HYPRE_Int HYPRE_BoomerAMGGetMaxIter( HYPRE_Solver solver, HYPRE_Int * max_iter ) { return ( hypre_BoomerAMGGetMaxIter( (void *) solver, max_iter ) ); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGSetCoarsenType, HYPRE_BoomerAMGGetCoarsenType *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_BoomerAMGSetCoarsenType( HYPRE_Solver solver, HYPRE_Int coarsen_type ) { return ( hypre_BoomerAMGSetCoarsenType( (void *) solver, coarsen_type ) ); } HYPRE_Int HYPRE_BoomerAMGGetCoarsenType( HYPRE_Solver solver, HYPRE_Int * coarsen_type ) { return ( hypre_BoomerAMGGetCoarsenType( (void *) solver, coarsen_type ) ); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGSetMeasureType, HYPRE_BoomerAMGGetMeasureType *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_BoomerAMGSetMeasureType( HYPRE_Solver solver, HYPRE_Int measure_type ) { return ( hypre_BoomerAMGSetMeasureType( (void *) solver, measure_type ) ); } HYPRE_Int HYPRE_BoomerAMGGetMeasureType( HYPRE_Solver solver, HYPRE_Int * measure_type ) { return ( hypre_BoomerAMGGetMeasureType( (void *) solver, measure_type ) ); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGSetOldDefault *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_BoomerAMGSetOldDefault( HYPRE_Solver solver) { HYPRE_BoomerAMGSetCoarsenType( solver, 6 ); HYPRE_BoomerAMGSetInterpType( solver, 0 ); HYPRE_BoomerAMGSetPMaxElmts( solver, 0 ); return hypre_error_flag; } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGSetSetupType *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_BoomerAMGSetSetupType( HYPRE_Solver solver, HYPRE_Int setup_type ) { return ( hypre_BoomerAMGSetSetupType( (void *) solver, setup_type ) ); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGSetCycleType, HYPRE_BoomerAMGGetCycleType *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_BoomerAMGSetCycleType( HYPRE_Solver solver, HYPRE_Int cycle_type ) { return ( hypre_BoomerAMGSetCycleType( (void *) solver, cycle_type ) ); } HYPRE_Int HYPRE_BoomerAMGGetCycleType( HYPRE_Solver solver, HYPRE_Int * cycle_type ) { return ( hypre_BoomerAMGGetCycleType( (void *) solver, cycle_type ) ); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGSetFCycle, HYPRE_BoomerAMGGetFCycle *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_BoomerAMGSetFCycle( HYPRE_Solver solver, HYPRE_Int fcycle ) { return ( hypre_BoomerAMGSetFCycle( (void *) solver, fcycle ) ); } HYPRE_Int HYPRE_BoomerAMGGetFCycle( HYPRE_Solver solver, HYPRE_Int *fcycle ) { return ( hypre_BoomerAMGGetFCycle( (void *) solver, fcycle ) ); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGSetConvergeType, HYPRE_BoomerAMGGetConvergeType *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_BoomerAMGSetConvergeType( HYPRE_Solver solver, HYPRE_Int type ) { return ( hypre_BoomerAMGSetConvergeType( (void *) solver, type ) ); } HYPRE_Int HYPRE_BoomerAMGGetConvergeType( HYPRE_Solver solver, HYPRE_Int *type ) { return ( hypre_BoomerAMGGetConvergeType( (void *) solver, type ) ); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGSetTol, HYPRE_BoomerAMGGetTol *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_BoomerAMGSetTol( HYPRE_Solver solver, HYPRE_Real tol ) { return ( hypre_BoomerAMGSetTol( (void *) solver, tol ) ); } HYPRE_Int HYPRE_BoomerAMGGetTol( HYPRE_Solver solver, HYPRE_Real * tol ) { return ( hypre_BoomerAMGGetTol( (void *) solver, tol ) ); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGSetNumGridSweeps * DEPRECATED. There are memory management problems associated with the * use of a user-supplied array (who releases it?). * Use SetNumSweeps and SetCycleNumSweeps instead. *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_BoomerAMGSetNumGridSweeps( HYPRE_Solver solver, HYPRE_Int *num_grid_sweeps ) { return ( hypre_BoomerAMGSetNumGridSweeps( (void *) solver, num_grid_sweeps ) ); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGSetNumSweeps * There is no corresponding Get function. Use GetCycleNumSweeps. *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_BoomerAMGSetNumSweeps( HYPRE_Solver solver, HYPRE_Int num_sweeps ) { return ( hypre_BoomerAMGSetNumSweeps( (void *) solver, num_sweeps ) ); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGSetCycleNumSweeps, HYPRE_BoomerAMGGetCycleNumSweeps *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_BoomerAMGSetCycleNumSweeps( HYPRE_Solver solver, HYPRE_Int num_sweeps, HYPRE_Int k ) { return ( hypre_BoomerAMGSetCycleNumSweeps( (void *) solver, num_sweeps, k ) ); } HYPRE_Int HYPRE_BoomerAMGGetCycleNumSweeps( HYPRE_Solver solver, HYPRE_Int * num_sweeps, HYPRE_Int k ) { return ( hypre_BoomerAMGGetCycleNumSweeps( (void *) solver, num_sweeps, k ) ); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGInitGridRelaxation *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_BoomerAMGInitGridRelaxation( HYPRE_Int **num_grid_sweeps_ptr, HYPRE_Int **grid_relax_type_ptr, HYPRE_Int ***grid_relax_points_ptr, HYPRE_Int coarsen_type, HYPRE_Real **relax_weights_ptr, HYPRE_Int max_levels ) { HYPRE_Int i; HYPRE_Int *num_grid_sweeps; HYPRE_Int *grid_relax_type; HYPRE_Int **grid_relax_points; HYPRE_Real *relax_weights; *num_grid_sweeps_ptr = hypre_CTAlloc(HYPRE_Int, 4, HYPRE_MEMORY_HOST); *grid_relax_type_ptr = hypre_CTAlloc(HYPRE_Int, 4, HYPRE_MEMORY_HOST); *grid_relax_points_ptr = hypre_CTAlloc(HYPRE_Int*, 4, HYPRE_MEMORY_HOST); *relax_weights_ptr = hypre_CTAlloc(HYPRE_Real, max_levels, HYPRE_MEMORY_HOST); num_grid_sweeps = *num_grid_sweeps_ptr; grid_relax_type = *grid_relax_type_ptr; grid_relax_points = *grid_relax_points_ptr; relax_weights = *relax_weights_ptr; if (coarsen_type == 5) { /* fine grid */ num_grid_sweeps[0] = 3; grid_relax_type[0] = 3; grid_relax_points[0] = hypre_CTAlloc(HYPRE_Int, 4, HYPRE_MEMORY_HOST); grid_relax_points[0][0] = -2; grid_relax_points[0][1] = -1; grid_relax_points[0][2] = 1; /* down cycle */ num_grid_sweeps[1] = 4; grid_relax_type[1] = 3; grid_relax_points[1] = hypre_CTAlloc(HYPRE_Int, 4, HYPRE_MEMORY_HOST); grid_relax_points[1][0] = -1; grid_relax_points[1][1] = 1; grid_relax_points[1][2] = -2; grid_relax_points[1][3] = -2; /* up cycle */ num_grid_sweeps[2] = 4; grid_relax_type[2] = 3; grid_relax_points[2] = hypre_CTAlloc(HYPRE_Int, 4, HYPRE_MEMORY_HOST); grid_relax_points[2][0] = -2; grid_relax_points[2][1] = -2; grid_relax_points[2][2] = 1; grid_relax_points[2][3] = -1; } else { /* fine grid */ num_grid_sweeps[0] = 2; grid_relax_type[0] = 3; grid_relax_points[0] = hypre_CTAlloc(HYPRE_Int, 2, HYPRE_MEMORY_HOST); grid_relax_points[0][0] = 1; grid_relax_points[0][1] = -1; /* down cycle */ num_grid_sweeps[1] = 2; grid_relax_type[1] = 3; grid_relax_points[1] = hypre_CTAlloc(HYPRE_Int, 2, HYPRE_MEMORY_HOST); grid_relax_points[1][0] = 1; grid_relax_points[1][1] = -1; /* up cycle */ num_grid_sweeps[2] = 2; grid_relax_type[2] = 3; grid_relax_points[2] = hypre_CTAlloc(HYPRE_Int, 2, HYPRE_MEMORY_HOST); grid_relax_points[2][0] = -1; grid_relax_points[2][1] = 1; } /* coarsest grid */ num_grid_sweeps[3] = 1; grid_relax_type[3] = 3; grid_relax_points[3] = hypre_CTAlloc(HYPRE_Int, 1, HYPRE_MEMORY_HOST); grid_relax_points[3][0] = 0; for (i = 0; i < max_levels; i++) { relax_weights[i] = 1.; } return hypre_error_flag; } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGSetGridRelaxType * DEPRECATED. There are memory management problems associated with the * use of a user-supplied array (who releases it?). * Use SetRelaxType and SetCycleRelaxType instead. *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_BoomerAMGSetGridRelaxType( HYPRE_Solver solver, HYPRE_Int *grid_relax_type ) { return ( hypre_BoomerAMGSetGridRelaxType( (void *) solver, grid_relax_type ) ); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGSetRelaxType *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_BoomerAMGSetRelaxType( HYPRE_Solver solver, HYPRE_Int relax_type ) { return ( hypre_BoomerAMGSetRelaxType( (void *) solver, relax_type ) ); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGSetCycleRelaxType, HYPRE_BoomerAMGetCycleRelaxType *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_BoomerAMGSetCycleRelaxType( HYPRE_Solver solver, HYPRE_Int relax_type, HYPRE_Int k ) { return ( hypre_BoomerAMGSetCycleRelaxType( (void *) solver, relax_type, k ) ); } HYPRE_Int HYPRE_BoomerAMGGetCycleRelaxType( HYPRE_Solver solver, HYPRE_Int * relax_type, HYPRE_Int k ) { return ( hypre_BoomerAMGGetCycleRelaxType( (void *) solver, relax_type, k ) ); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGSetRelaxOrder *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_BoomerAMGSetRelaxOrder( HYPRE_Solver solver, HYPRE_Int relax_order) { return ( hypre_BoomerAMGSetRelaxOrder( (void *) solver, relax_order ) ); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGSetGridRelaxPoints * DEPRECATED. There are memory management problems associated with the * use of a user-supplied array (who releases it?). * Ulrike Yang suspects that nobody uses this function. *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_BoomerAMGSetGridRelaxPoints( HYPRE_Solver solver, HYPRE_Int **grid_relax_points ) { return ( hypre_BoomerAMGSetGridRelaxPoints( (void *) solver, grid_relax_points ) ); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGSetRelaxWeight * DEPRECATED. There are memory management problems associated with the * use of a user-supplied array (who releases it?). * Use SetRelaxWt and SetLevelRelaxWt instead. *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_BoomerAMGSetRelaxWeight( HYPRE_Solver solver, HYPRE_Real *relax_weight ) { return ( hypre_BoomerAMGSetRelaxWeight( (void *) solver, relax_weight ) ); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGSetRelaxWt *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_BoomerAMGSetRelaxWt( HYPRE_Solver solver, HYPRE_Real relax_wt ) { return ( hypre_BoomerAMGSetRelaxWt( (void *) solver, relax_wt ) ); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGSetLevelRelaxWt *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_BoomerAMGSetLevelRelaxWt( HYPRE_Solver solver, HYPRE_Real relax_wt, HYPRE_Int level ) { return ( hypre_BoomerAMGSetLevelRelaxWt( (void *) solver, relax_wt, level ) ); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGSetOmega *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_BoomerAMGSetOmega( HYPRE_Solver solver, HYPRE_Real *omega ) { return ( hypre_BoomerAMGSetOmega( (void *) solver, omega ) ); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGSetOuterWt *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_BoomerAMGSetOuterWt( HYPRE_Solver solver, HYPRE_Real outer_wt ) { return ( hypre_BoomerAMGSetOuterWt( (void *) solver, outer_wt ) ); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGSetLevelOuterWt *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_BoomerAMGSetLevelOuterWt( HYPRE_Solver solver, HYPRE_Real outer_wt, HYPRE_Int level ) { return ( hypre_BoomerAMGSetLevelOuterWt( (void *) solver, outer_wt, level ) ); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGSetSmoothType, HYPRE_BoomerAMGGetSmoothType *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_BoomerAMGSetSmoothType( HYPRE_Solver solver, HYPRE_Int smooth_type ) { return ( hypre_BoomerAMGSetSmoothType( (void *) solver, smooth_type ) ); } HYPRE_Int HYPRE_BoomerAMGGetSmoothType( HYPRE_Solver solver, HYPRE_Int * smooth_type ) { return ( hypre_BoomerAMGGetSmoothType( (void *) solver, smooth_type ) ); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGSetSmoothNumLevels, HYPRE_BoomerAMGGetSmoothNumLevels *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_BoomerAMGSetSmoothNumLevels( HYPRE_Solver solver, HYPRE_Int smooth_num_levels ) { return ( hypre_BoomerAMGSetSmoothNumLevels((void *)solver, smooth_num_levels )); } HYPRE_Int HYPRE_BoomerAMGGetSmoothNumLevels( HYPRE_Solver solver, HYPRE_Int * smooth_num_levels ) { return ( hypre_BoomerAMGGetSmoothNumLevels((void *)solver, smooth_num_levels )); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGSetSmoothNumSweeps, HYPRE_BoomerAMGGetSmoothNumSweeps *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_BoomerAMGSetSmoothNumSweeps( HYPRE_Solver solver, HYPRE_Int smooth_num_sweeps ) { return ( hypre_BoomerAMGSetSmoothNumSweeps((void *)solver, smooth_num_sweeps )); } HYPRE_Int HYPRE_BoomerAMGGetSmoothNumSweeps( HYPRE_Solver solver, HYPRE_Int * smooth_num_sweeps ) { return ( hypre_BoomerAMGGetSmoothNumSweeps((void *)solver, smooth_num_sweeps )); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGSetLogging, HYPRE_BoomerAMGGetLogging *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_BoomerAMGSetLogging( HYPRE_Solver solver, HYPRE_Int logging ) { /* This function should be called before Setup. Logging changes may require allocation or freeing of arrays, which is presently only done there. It may be possible to support logging changes at other times, but there is little need. */ return ( hypre_BoomerAMGSetLogging( (void *) solver, logging ) ); } HYPRE_Int HYPRE_BoomerAMGGetLogging( HYPRE_Solver solver, HYPRE_Int * logging ) { return ( hypre_BoomerAMGGetLogging( (void *) solver, logging ) ); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGSetPrintLevel, HYPRE_BoomerAMGGetPrintLevel *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_BoomerAMGSetPrintLevel( HYPRE_Solver solver, HYPRE_Int print_level ) { return ( hypre_BoomerAMGSetPrintLevel( (void *) solver, print_level ) ); } HYPRE_Int HYPRE_BoomerAMGGetPrintLevel( HYPRE_Solver solver, HYPRE_Int * print_level ) { return ( hypre_BoomerAMGGetPrintLevel( (void *) solver, print_level ) ); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGSetPrintFileName *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_BoomerAMGSetPrintFileName( HYPRE_Solver solver, const char *print_file_name ) { return ( hypre_BoomerAMGSetPrintFileName( (void *) solver, print_file_name ) ); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGSetDebugFlag, HYPRE_BoomerAMGGetDebugFlag *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_BoomerAMGSetDebugFlag( HYPRE_Solver solver, HYPRE_Int debug_flag ) { return ( hypre_BoomerAMGSetDebugFlag( (void *) solver, debug_flag ) ); } HYPRE_Int HYPRE_BoomerAMGGetDebugFlag( HYPRE_Solver solver, HYPRE_Int * debug_flag ) { return ( hypre_BoomerAMGGetDebugFlag( (void *) solver, debug_flag ) ); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGGetNumIterations *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_BoomerAMGGetNumIterations( HYPRE_Solver solver, HYPRE_Int *num_iterations ) { return ( hypre_BoomerAMGGetNumIterations( (void *) solver, num_iterations ) ); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGGetCumNumIterations *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_BoomerAMGGetCumNumIterations( HYPRE_Solver solver, HYPRE_Int *cum_num_iterations ) { return ( hypre_BoomerAMGGetCumNumIterations( (void *) solver, cum_num_iterations ) ); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGGetResidual *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_BoomerAMGGetResidual( HYPRE_Solver solver, HYPRE_ParVector * residual ) { return hypre_BoomerAMGGetResidual( (void *) solver, (hypre_ParVector **) residual ); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGGetFinalRelativeResidualNorm *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_BoomerAMGGetFinalRelativeResidualNorm( HYPRE_Solver solver, HYPRE_Real *rel_resid_norm ) { return ( hypre_BoomerAMGGetRelResidualNorm( (void *) solver, rel_resid_norm ) ); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGSetVariant, HYPRE_BoomerAMGGetVariant *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_BoomerAMGSetVariant( HYPRE_Solver solver, HYPRE_Int variant ) { return ( hypre_BoomerAMGSetVariant( (void *) solver, variant ) ); } HYPRE_Int HYPRE_BoomerAMGGetVariant( HYPRE_Solver solver, HYPRE_Int * variant ) { return ( hypre_BoomerAMGGetVariant( (void *) solver, variant ) ); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGSetOverlap, HYPRE_BoomerAMGGetOverlap *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_BoomerAMGSetOverlap( HYPRE_Solver solver, HYPRE_Int overlap ) { return ( hypre_BoomerAMGSetOverlap( (void *) solver, overlap ) ); } HYPRE_Int HYPRE_BoomerAMGGetOverlap( HYPRE_Solver solver, HYPRE_Int * overlap ) { return ( hypre_BoomerAMGGetOverlap( (void *) solver, overlap ) ); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGSetDomainType, HYPRE_BoomerAMGGetDomainType *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_BoomerAMGSetDomainType( HYPRE_Solver solver, HYPRE_Int domain_type ) { return ( hypre_BoomerAMGSetDomainType( (void *) solver, domain_type ) ); } HYPRE_Int HYPRE_BoomerAMGGetDomainType( HYPRE_Solver solver, HYPRE_Int * domain_type ) { return ( hypre_BoomerAMGGetDomainType( (void *) solver, domain_type ) ); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGSetSchwarzRlxWeight, HYPRE_BoomerAMGGetSchwarzRlxWeight *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_BoomerAMGSetSchwarzRlxWeight( HYPRE_Solver solver, HYPRE_Real schwarz_rlx_weight) { return ( hypre_BoomerAMGSetSchwarzRlxWeight( (void *) solver, schwarz_rlx_weight ) ); } HYPRE_Int HYPRE_BoomerAMGGetSchwarzRlxWeight( HYPRE_Solver solver, HYPRE_Real * schwarz_rlx_weight) { return ( hypre_BoomerAMGGetSchwarzRlxWeight( (void *) solver, schwarz_rlx_weight ) ); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGSetSchwarzUseNonSymm *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_BoomerAMGSetSchwarzUseNonSymm( HYPRE_Solver solver, HYPRE_Int use_nonsymm) { return ( hypre_BoomerAMGSetSchwarzUseNonSymm( (void *) solver, use_nonsymm ) ); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGSym *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_BoomerAMGSetSym( HYPRE_Solver solver, HYPRE_Int sym) { return ( hypre_BoomerAMGSetSym( (void *) solver, sym ) ); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGSetLevel *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_BoomerAMGSetLevel( HYPRE_Solver solver, HYPRE_Int level) { return ( hypre_BoomerAMGSetLevel( (void *) solver, level ) ); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGSetThreshold *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_BoomerAMGSetThreshold( HYPRE_Solver solver, HYPRE_Real threshold ) { return ( hypre_BoomerAMGSetThreshold( (void *) solver, threshold ) ); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGSetFilter *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_BoomerAMGSetFilter( HYPRE_Solver solver, HYPRE_Real filter ) { return ( hypre_BoomerAMGSetFilter( (void *) solver, filter ) ); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGSetDropTol *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_BoomerAMGSetDropTol( HYPRE_Solver solver, HYPRE_Real drop_tol ) { return ( hypre_BoomerAMGSetDropTol( (void *) solver, drop_tol ) ); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGSetMaxNzPerRow *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_BoomerAMGSetMaxNzPerRow( HYPRE_Solver solver, HYPRE_Int max_nz_per_row ) { return ( hypre_BoomerAMGSetMaxNzPerRow( (void *) solver, max_nz_per_row ) ); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGSetEuclidFile *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_BoomerAMGSetEuclidFile( HYPRE_Solver solver, char *euclidfile) { return ( hypre_BoomerAMGSetEuclidFile( (void *) solver, euclidfile ) ); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGSetEuLevel *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_BoomerAMGSetEuLevel( HYPRE_Solver solver, HYPRE_Int eu_level) { return ( hypre_BoomerAMGSetEuLevel( (void *) solver, eu_level ) ); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGSetEuSparseA *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_BoomerAMGSetEuSparseA( HYPRE_Solver solver, HYPRE_Real eu_sparse_A ) { return ( hypre_BoomerAMGSetEuSparseA( (void *) solver, eu_sparse_A ) ); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGSetEuBJ *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_BoomerAMGSetEuBJ( HYPRE_Solver solver, HYPRE_Int eu_bj) { return ( hypre_BoomerAMGSetEuBJ( (void *) solver, eu_bj ) ); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGSetILUType *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_BoomerAMGSetILUType( HYPRE_Solver solver, HYPRE_Int ilu_type) { return ( hypre_BoomerAMGSetILUType( (void *) solver, ilu_type ) ); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGSetILULevel *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_BoomerAMGSetILULevel( HYPRE_Solver solver, HYPRE_Int ilu_lfil) { return ( hypre_BoomerAMGSetILULevel( (void *) solver, ilu_lfil ) ); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGSetILUMaxRowNnz *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_BoomerAMGSetILUMaxRowNnz( HYPRE_Solver solver, HYPRE_Int ilu_max_row_nnz) { return ( hypre_BoomerAMGSetILUMaxRowNnz( (void *) solver, ilu_max_row_nnz ) ); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGSetILUMaxIter *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_BoomerAMGSetILUMaxIter( HYPRE_Solver solver, HYPRE_Int ilu_max_iter) { return ( hypre_BoomerAMGSetILUMaxIter( (void *) solver, ilu_max_iter ) ); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGSetILUDroptol *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_BoomerAMGSetILUDroptol( HYPRE_Solver solver, HYPRE_Real ilu_droptol) { return ( hypre_BoomerAMGSetILUDroptol( (void *) solver, ilu_droptol ) ); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGSetILUTriSolve *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_BoomerAMGSetILUTriSolve( HYPRE_Solver solver, HYPRE_Int ilu_tri_solve) { return ( hypre_BoomerAMGSetILUTriSolve( (void *) solver, ilu_tri_solve ) ); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGSetILULowerJacobiIters *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_BoomerAMGSetILULowerJacobiIters( HYPRE_Solver solver, HYPRE_Int ilu_lower_jacobi_iters) { return ( hypre_BoomerAMGSetILULowerJacobiIters( (void *) solver, ilu_lower_jacobi_iters ) ); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGSetILUUpperJacobiIters *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_BoomerAMGSetILUUpperJacobiIters( HYPRE_Solver solver, HYPRE_Int ilu_upper_jacobi_iters) { return ( hypre_BoomerAMGSetILUUpperJacobiIters( (void *) solver, ilu_upper_jacobi_iters ) ); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGSetILULocalReordering *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_BoomerAMGSetILULocalReordering( HYPRE_Solver solver, HYPRE_Int ilu_reordering_type) { return ( hypre_BoomerAMGSetILULocalReordering( (void *) solver, ilu_reordering_type ) ); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGSetILUIterSetupType *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_BoomerAMGSetILUIterSetupType( HYPRE_Solver solver, HYPRE_Int ilu_iter_setup_type) { return ( hypre_BoomerAMGSetILUIterSetupType( (void *) solver, ilu_iter_setup_type ) ); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGSetILUIterSetupOption *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_BoomerAMGSetILUIterSetupOption( HYPRE_Solver solver, HYPRE_Int ilu_iter_setup_option) { return ( hypre_BoomerAMGSetILUIterSetupOption( (void *) solver, ilu_iter_setup_option ) ); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGSetILUIterSetupMaxIter *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_BoomerAMGSetILUIterSetupMaxIter( HYPRE_Solver solver, HYPRE_Int ilu_iter_setup_max_iter) { return ( hypre_BoomerAMGSetILUIterSetupMaxIter( (void *) solver, ilu_iter_setup_max_iter ) ); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGSetILUIterSetupTolerance *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_BoomerAMGSetILUIterSetupTolerance( HYPRE_Solver solver, HYPRE_Real ilu_iter_setup_tolerance) { return ( hypre_BoomerAMGSetILUIterSetupTolerance( (void *) solver, ilu_iter_setup_tolerance ) ); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGSetFSAIAlgoType *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_BoomerAMGSetFSAIAlgoType( HYPRE_Solver solver, HYPRE_Int algo_type ) { return ( hypre_BoomerAMGSetFSAIAlgoType( (void *) solver, algo_type ) ); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGSetFSAILocalSolveType *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_BoomerAMGSetFSAILocalSolveType( HYPRE_Solver solver, HYPRE_Int local_solve_type ) { return ( hypre_BoomerAMGSetFSAILocalSolveType( (void *) solver, local_solve_type ) ); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGSetFSAIMaxSteps *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_BoomerAMGSetFSAIMaxSteps( HYPRE_Solver solver, HYPRE_Int max_steps ) { return ( hypre_BoomerAMGSetFSAIMaxSteps( (void *) solver, max_steps ) ); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGSetFSAIMaxStepSize *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_BoomerAMGSetFSAIMaxStepSize( HYPRE_Solver solver, HYPRE_Int max_step_size ) { return ( hypre_BoomerAMGSetFSAIMaxStepSize( (void *) solver, max_step_size ) ); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGSetFSAIMaxNnzRow *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_BoomerAMGSetFSAIMaxNnzRow( HYPRE_Solver solver, HYPRE_Int max_nnz_row ) { return ( hypre_BoomerAMGSetFSAIMaxNnzRow( (void *) solver, max_nnz_row ) ); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGSetFSAINumLevels *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_BoomerAMGSetFSAINumLevels( HYPRE_Solver solver, HYPRE_Int num_levels ) { return ( hypre_BoomerAMGSetFSAINumLevels( (void *) solver, num_levels ) ); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGSetFSAIThreshold *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_BoomerAMGSetFSAIThreshold( HYPRE_Solver solver, HYPRE_Real threshold ) { return ( hypre_BoomerAMGSetFSAIThreshold( (void *) solver, threshold ) ); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGSetFSAIEigMaxIters *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_BoomerAMGSetFSAIEigMaxIters( HYPRE_Solver solver, HYPRE_Int eig_max_iters ) { return ( hypre_BoomerAMGSetFSAIEigMaxIters( (void *) solver, eig_max_iters ) ); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGSetFSAIKapTolerance *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_BoomerAMGSetFSAIKapTolerance( HYPRE_Solver solver, HYPRE_Real kap_tolerance ) { return ( hypre_BoomerAMGSetFSAIKapTolerance( (void *) solver, kap_tolerance ) ); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGSetNumFunctions *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_BoomerAMGSetNumFunctions( HYPRE_Solver solver, HYPRE_Int num_functions ) { return ( hypre_BoomerAMGSetNumFunctions( (void *) solver, num_functions ) ); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGGetNumFunctions *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_BoomerAMGGetNumFunctions( HYPRE_Solver solver, HYPRE_Int *num_functions ) { return ( hypre_BoomerAMGGetNumFunctions( (void *) solver, num_functions ) ); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGSetFilterFunctions *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_BoomerAMGSetFilterFunctions( HYPRE_Solver solver, HYPRE_Int filter_functions ) { return ( hypre_BoomerAMGSetFilterFunctions( (void *) solver, filter_functions ) ); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGGetFilterFunctions *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_BoomerAMGGetFilterFunctions( HYPRE_Solver solver, HYPRE_Int *filter_functions ) { return ( hypre_BoomerAMGGetFilterFunctions( (void *) solver, filter_functions ) ); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGSetNodal *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_BoomerAMGSetNodal( HYPRE_Solver solver, HYPRE_Int nodal ) { return ( hypre_BoomerAMGSetNodal( (void *) solver, nodal ) ); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGSetNodalLevels *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_BoomerAMGSetNodalLevels( HYPRE_Solver solver, HYPRE_Int nodal_levels ) { return ( hypre_BoomerAMGSetNodalLevels( (void *) solver, nodal_levels ) ); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGSetNodalDiag *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_BoomerAMGSetNodalDiag( HYPRE_Solver solver, HYPRE_Int nodal ) { return ( hypre_BoomerAMGSetNodalDiag( (void *) solver, nodal ) ); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGSetKeepSameSign *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_BoomerAMGSetKeepSameSign( HYPRE_Solver solver, HYPRE_Int keep_same_sign ) { return ( hypre_BoomerAMGSetKeepSameSign( (void *) solver, keep_same_sign ) ); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGSetDofFunc *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_BoomerAMGSetDofFunc( HYPRE_Solver solver, HYPRE_Int *dof_func ) /* Warning about a possible memory problem: When the BoomerAMG object is destroyed in hypre_BoomerAMGDestroy, dof_func aka DofFunc will be destroyed (currently line 246 of par_amg.c). Normally this is what we want. But if the user provided dof_func by calling HYPRE_BoomerAMGSetDofFunc, this could be an unwanted surprise. As hypre is currently commonly used, this situation is likely to be rare. */ { return ( hypre_BoomerAMGSetDofFunc( (void *) solver, dof_func ) ); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGSetNumPaths *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_BoomerAMGSetNumPaths( HYPRE_Solver solver, HYPRE_Int num_paths ) { return ( hypre_BoomerAMGSetNumPaths( (void *) solver, num_paths ) ); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGSetAggNumLevels *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_BoomerAMGSetAggNumLevels( HYPRE_Solver solver, HYPRE_Int agg_num_levels ) { return ( hypre_BoomerAMGSetAggNumLevels( (void *) solver, agg_num_levels ) ); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGSetAggInterpType *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_BoomerAMGSetAggInterpType( HYPRE_Solver solver, HYPRE_Int agg_interp_type ) { return ( hypre_BoomerAMGSetAggInterpType( (void *) solver, agg_interp_type ) ); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGSetAggTruncFactor *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_BoomerAMGSetAggTruncFactor( HYPRE_Solver solver, HYPRE_Real agg_trunc_factor ) { return ( hypre_BoomerAMGSetAggTruncFactor( (void *) solver, agg_trunc_factor ) ); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGSetAddTruncFactor *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_BoomerAMGSetAddTruncFactor( HYPRE_Solver solver, HYPRE_Real add_trunc_factor ) { return ( hypre_BoomerAMGSetMultAddTruncFactor( (void *) solver, add_trunc_factor ) ); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGSetMultAddTruncFactor *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_BoomerAMGSetMultAddTruncFactor( HYPRE_Solver solver, HYPRE_Real add_trunc_factor ) { return ( hypre_BoomerAMGSetMultAddTruncFactor( (void *) solver, add_trunc_factor ) ); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGSetAddRelaxWt *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_BoomerAMGSetAddRelaxWt( HYPRE_Solver solver, HYPRE_Real add_rlx_wt ) { return ( hypre_BoomerAMGSetAddRelaxWt( (void *) solver, add_rlx_wt ) ); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGSetAddRelaxType *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_BoomerAMGSetAddRelaxType( HYPRE_Solver solver, HYPRE_Int add_rlx_type ) { return ( hypre_BoomerAMGSetAddRelaxType( (void *) solver, add_rlx_type ) ); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGSetAggP12TruncFactor *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_BoomerAMGSetAggP12TruncFactor( HYPRE_Solver solver, HYPRE_Real agg_P12_trunc_factor ) { return ( hypre_BoomerAMGSetAggP12TruncFactor( (void *) solver, agg_P12_trunc_factor ) ); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGSetAggPMaxElmts *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_BoomerAMGSetAggPMaxElmts( HYPRE_Solver solver, HYPRE_Int agg_P_max_elmts ) { return ( hypre_BoomerAMGSetAggPMaxElmts( (void *) solver, agg_P_max_elmts ) ); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGSetAddPMaxElmts *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_BoomerAMGSetAddPMaxElmts( HYPRE_Solver solver, HYPRE_Int add_P_max_elmts ) { return ( hypre_BoomerAMGSetMultAddPMaxElmts( (void *) solver, add_P_max_elmts ) ); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGSetMultAddPMaxElmts *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_BoomerAMGSetMultAddPMaxElmts( HYPRE_Solver solver, HYPRE_Int add_P_max_elmts ) { return ( hypre_BoomerAMGSetMultAddPMaxElmts( (void *) solver, add_P_max_elmts ) ); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGSetAggP12MaxElmts *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_BoomerAMGSetAggP12MaxElmts( HYPRE_Solver solver, HYPRE_Int agg_P12_max_elmts ) { return ( hypre_BoomerAMGSetAggP12MaxElmts( (void *) solver, agg_P12_max_elmts ) ); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGSetNumCRRelaxSteps *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_BoomerAMGSetNumCRRelaxSteps( HYPRE_Solver solver, HYPRE_Int num_CR_relax_steps ) { return ( hypre_BoomerAMGSetNumCRRelaxSteps( (void *) solver, num_CR_relax_steps ) ); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGSetCRRate *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_BoomerAMGSetCRRate( HYPRE_Solver solver, HYPRE_Real CR_rate ) { return ( hypre_BoomerAMGSetCRRate( (void *) solver, CR_rate ) ); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGSetCRStrongTh *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_BoomerAMGSetCRStrongTh( HYPRE_Solver solver, HYPRE_Real CR_strong_th ) { return ( hypre_BoomerAMGSetCRStrongTh( (void *) solver, CR_strong_th ) ); } HYPRE_Int HYPRE_BoomerAMGSetADropTol( HYPRE_Solver solver, HYPRE_Real A_drop_tol ) { return ( hypre_BoomerAMGSetADropTol( (void *) solver, A_drop_tol ) ); } HYPRE_Int HYPRE_BoomerAMGSetADropType( HYPRE_Solver solver, HYPRE_Int A_drop_type ) { return ( hypre_BoomerAMGSetADropType( (void *) solver, A_drop_type ) ); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGSetISType *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_BoomerAMGSetISType( HYPRE_Solver solver, HYPRE_Int IS_type ) { return ( hypre_BoomerAMGSetISType( (void *) solver, IS_type ) ); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGSetCRUseCG *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_BoomerAMGSetCRUseCG( HYPRE_Solver solver, HYPRE_Int CR_use_CG ) { return ( hypre_BoomerAMGSetCRUseCG( (void *) solver, CR_use_CG ) ); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGSetGSMG *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_BoomerAMGSetGSMG( HYPRE_Solver solver, HYPRE_Int gsmg ) { return ( hypre_BoomerAMGSetGSMG( (void *) solver, gsmg ) ); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGSetNumSamples *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_BoomerAMGSetNumSamples( HYPRE_Solver solver, HYPRE_Int gsmg ) { return ( hypre_BoomerAMGSetNumSamples( (void *) solver, gsmg ) ); } /* BM Aug 25, 2006 */ /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGSetCGCIts *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_BoomerAMGSetCGCIts (HYPRE_Solver solver, HYPRE_Int its) { return (hypre_BoomerAMGSetCGCIts ( (void *) solver, its ) ); } /* BM Oct 23, 2006 */ /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGSetPlotGrids *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_BoomerAMGSetPlotGrids (HYPRE_Solver solver, HYPRE_Int plotgrids) { return (hypre_BoomerAMGSetPlotGrids ( (void *) solver, plotgrids ) ); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGSetPlotFileName *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_BoomerAMGSetPlotFileName (HYPRE_Solver solver, const char *plotfilename) { return (hypre_BoomerAMGSetPlotFileName ( (void *) solver, plotfilename ) ); } /* BM Oct 17, 2006 */ /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGSetCoordDim *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_BoomerAMGSetCoordDim (HYPRE_Solver solver, HYPRE_Int coorddim) { return (hypre_BoomerAMGSetCoordDim ( (void *) solver, coorddim ) ); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGSetCoordinates *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_BoomerAMGSetCoordinates (HYPRE_Solver solver, float *coordinates) { return (hypre_BoomerAMGSetCoordinates ( (void *) solver, coordinates ) ); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGGetGridHierarchy *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_BoomerAMGGetGridHierarchy(HYPRE_Solver solver, HYPRE_Int *cgrid ) { return (hypre_BoomerAMGGetGridHierarchy ( (void *) solver, cgrid ) ); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGSetChebyOrder *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_BoomerAMGSetChebyOrder( HYPRE_Solver solver, HYPRE_Int order ) { return ( hypre_BoomerAMGSetChebyOrder( (void *) solver, order ) ); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGSetChebyFraction *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_BoomerAMGSetChebyFraction( HYPRE_Solver solver, HYPRE_Real ratio ) { return ( hypre_BoomerAMGSetChebyFraction( (void *) solver, ratio ) ); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGSetChebyScale *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_BoomerAMGSetChebyScale( HYPRE_Solver solver, HYPRE_Int scale ) { return ( hypre_BoomerAMGSetChebyScale( (void *) solver, scale ) ); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGSetChebyVariant *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_BoomerAMGSetChebyVariant( HYPRE_Solver solver, HYPRE_Int variant ) { return ( hypre_BoomerAMGSetChebyVariant( (void *) solver, variant ) ); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGSetChebyEigEst *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_BoomerAMGSetChebyEigEst( HYPRE_Solver solver, HYPRE_Int eig_est ) { return ( hypre_BoomerAMGSetChebyEigEst( (void *) solver, eig_est ) ); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGSetInterpVectors *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_BoomerAMGSetInterpVectors (HYPRE_Solver solver, HYPRE_Int num_vectors, HYPRE_ParVector *vectors) { return (hypre_BoomerAMGSetInterpVectors ( (void *) solver, num_vectors, (hypre_ParVector **) vectors ) ); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGSetInterpVecVariant *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_BoomerAMGSetInterpVecVariant(HYPRE_Solver solver, HYPRE_Int num) { return (hypre_BoomerAMGSetInterpVecVariant ( (void *) solver, num ) ); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGSetInterpVecQMax *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_BoomerAMGSetInterpVecQMax( HYPRE_Solver solver, HYPRE_Int q_max ) { return ( hypre_BoomerAMGSetInterpVecQMax( (void *) solver, q_max ) ); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGSetInterpVecAbsQTrunc *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_BoomerAMGSetInterpVecAbsQTrunc( HYPRE_Solver solver, HYPRE_Real q_trunc ) { return ( hypre_BoomerAMGSetInterpVecAbsQTrunc( (void *) solver, q_trunc ) ); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGSetSmoothInterpVectors *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_BoomerAMGSetSmoothInterpVectors( HYPRE_Solver solver, HYPRE_Int smooth_interp_vectors ) { return ( hypre_BoomerAMGSetSmoothInterpVectors( (void *) solver, smooth_interp_vectors) ); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGSetInterpRefine *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_BoomerAMGSetInterpRefine( HYPRE_Solver solver, HYPRE_Int num_refine ) { return ( hypre_BoomerAMGSetInterpRefine( (void *) solver, num_refine ) ); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGSetInterpVecFirstLevel( *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_BoomerAMGSetInterpVecFirstLevel( HYPRE_Solver solver, HYPRE_Int level ) { return ( hypre_BoomerAMGSetInterpVecFirstLevel( (void *) solver, level ) ); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGSetAdditive, HYPRE_BoomerAMGGetAdditive *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_BoomerAMGSetAdditive( HYPRE_Solver solver, HYPRE_Int additive ) { return ( hypre_BoomerAMGSetAdditive( (void *) solver, additive ) ); } HYPRE_Int HYPRE_BoomerAMGGetAdditive( HYPRE_Solver solver, HYPRE_Int * additive ) { return ( hypre_BoomerAMGGetAdditive( (void *) solver, additive ) ); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGSetMultAdditive, HYPRE_BoomerAMGGetMultAdditive *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_BoomerAMGSetMultAdditive( HYPRE_Solver solver, HYPRE_Int mult_additive ) { return ( hypre_BoomerAMGSetMultAdditive( (void *) solver, mult_additive ) ); } HYPRE_Int HYPRE_BoomerAMGGetMultAdditive( HYPRE_Solver solver, HYPRE_Int *mult_additive ) { return ( hypre_BoomerAMGGetMultAdditive( (void *) solver, mult_additive ) ); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGSetSimple, HYPRE_BoomerAMGGetSimple *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_BoomerAMGSetSimple( HYPRE_Solver solver, HYPRE_Int simple ) { return ( hypre_BoomerAMGSetSimple( (void *) solver, simple ) ); } HYPRE_Int HYPRE_BoomerAMGGetSimple( HYPRE_Solver solver, HYPRE_Int *simple ) { return ( hypre_BoomerAMGGetSimple( (void *) solver, simple ) ); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGSetAddLastLvl *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_BoomerAMGSetAddLastLvl( HYPRE_Solver solver, HYPRE_Int add_last_lvl ) { return ( hypre_BoomerAMGSetAddLastLvl( (void *) solver, add_last_lvl ) ); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGSetNonGalerkinTol *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_BoomerAMGSetNonGalerkinTol (HYPRE_Solver solver, HYPRE_Real nongalerkin_tol) { return (hypre_BoomerAMGSetNonGalerkinTol ( (void *) solver, nongalerkin_tol ) ); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGSetLevelNonGalerkinTol *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_BoomerAMGSetLevelNonGalerkinTol (HYPRE_Solver solver, HYPRE_Real nongalerkin_tol, HYPRE_Int level) { return (hypre_BoomerAMGSetLevelNonGalerkinTol ( (void *) solver, nongalerkin_tol, level ) ); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGSetNonGalerkTol *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_BoomerAMGSetNonGalerkTol (HYPRE_Solver solver, HYPRE_Int nongalerk_num_tol, HYPRE_Real *nongalerk_tol) { return (hypre_BoomerAMGSetNonGalerkTol ( (void *) solver, nongalerk_num_tol, nongalerk_tol ) ); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGSetRAP2 *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_BoomerAMGSetRAP2 (HYPRE_Solver solver, HYPRE_Int rap2) { return (hypre_BoomerAMGSetRAP2 ( (void *) solver, rap2 ) ); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGSetModuleRAP2 *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_BoomerAMGSetModuleRAP2 (HYPRE_Solver solver, HYPRE_Int mod_rap2) { return (hypre_BoomerAMGSetModuleRAP2 ( (void *) solver, mod_rap2 ) ); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGSetKeepTranspose *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_BoomerAMGSetKeepTranspose (HYPRE_Solver solver, HYPRE_Int keepTranspose) { return (hypre_BoomerAMGSetKeepTranspose ( (void *) solver, keepTranspose ) ); } #ifdef HYPRE_USING_DSUPERLU /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGSetDSLUThreshold *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_BoomerAMGSetDSLUThreshold (HYPRE_Solver solver, HYPRE_Int slu_threshold) { return (hypre_BoomerAMGSetDSLUThreshold ( (void *) solver, slu_threshold ) ); } #endif /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGSetCpointsToKeep *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_BoomerAMGSetCpointsToKeep(HYPRE_Solver solver, HYPRE_Int cpt_coarse_level, HYPRE_Int num_cpt_coarse, HYPRE_BigInt *cpt_coarse_index) { return (hypre_BoomerAMGSetCPoints( (void *) solver, cpt_coarse_level, num_cpt_coarse, cpt_coarse_index)); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGSetCPoints *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_BoomerAMGSetCPoints(HYPRE_Solver solver, HYPRE_Int cpt_coarse_level, HYPRE_Int num_cpt_coarse, HYPRE_BigInt *cpt_coarse_index) { return (hypre_BoomerAMGSetCPoints( (void *) solver, cpt_coarse_level, num_cpt_coarse, cpt_coarse_index)); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGSetFPoints *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_BoomerAMGSetFPoints(HYPRE_Solver solver, HYPRE_Int num_fpt, HYPRE_BigInt *fpt_index) { return (hypre_BoomerAMGSetFPoints( (void *) solver, 0, num_fpt, fpt_index) ); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGSetIsolatedFPoints *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_BoomerAMGSetIsolatedFPoints(HYPRE_Solver solver, HYPRE_Int num_isolated_fpt, HYPRE_BigInt *isolated_fpt_index) { return (hypre_BoomerAMGSetFPoints( (void *) solver, 1, num_isolated_fpt, isolated_fpt_index) ); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGSetCumNnzAP *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_BoomerAMGSetCumNnzAP( HYPRE_Solver solver, HYPRE_Real cum_nnz_AP ) { return ( hypre_BoomerAMGSetCumNnzAP( (void *) solver, cum_nnz_AP ) ); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGGetCumNnzAP *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_BoomerAMGGetCumNnzAP( HYPRE_Solver solver, HYPRE_Real *cum_nnz_AP ) { return ( hypre_BoomerAMGGetCumNnzAP( (void *) solver, cum_nnz_AP ) ); } hypre-2.33.0/src/parcsr_ls/HYPRE_parcsr_amgdd.c000066400000000000000000000224241477326011500212600ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "_hypre_parcsr_ls.h" /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGDDCreate *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_BoomerAMGDDCreate( HYPRE_Solver *solver) { if (!solver) { hypre_error_in_arg(1); return hypre_error_flag; } *solver = (HYPRE_Solver) hypre_BoomerAMGDDCreate( ) ; return hypre_error_flag; } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGDDDestroy *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_BoomerAMGDDDestroy( HYPRE_Solver solver ) { return ( hypre_BoomerAMGDDDestroy( (void *) solver ) ); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGDDSetup *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_BoomerAMGDDSetup( HYPRE_Solver solver, HYPRE_ParCSRMatrix A, HYPRE_ParVector b, HYPRE_ParVector x ) { return ( hypre_BoomerAMGDDSetup( (void *) solver, (hypre_ParCSRMatrix *) A, (hypre_ParVector *) b, (hypre_ParVector *) x ) ); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGSolve *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_BoomerAMGDDSolve( HYPRE_Solver solver, HYPRE_ParCSRMatrix A, HYPRE_ParVector b, HYPRE_ParVector x ) { return ( hypre_BoomerAMGDDSolve( (void *) solver, (hypre_ParCSRMatrix *) A, (hypre_ParVector *) b, (hypre_ParVector *) x ) ); } /*------------------------------------------------------------------------- * HYPRE_BoomerAMGDDSetStartLevel *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_BoomerAMGDDSetStartLevel( HYPRE_Solver solver, HYPRE_Int start_level ) { return ( hypre_BoomerAMGDDSetStartLevel( (void *) solver, start_level ) ); } HYPRE_Int HYPRE_BoomerAMGDDGetStartLevel( HYPRE_Solver solver, HYPRE_Int *start_level ) { return ( hypre_BoomerAMGDDGetStartLevel( (void *) solver, start_level ) ); } /*------------------------------------------------------------------------- * HYPRE_BoomerAMGDDSetFACNumRelax *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_BoomerAMGDDSetFACNumRelax( HYPRE_Solver solver, HYPRE_Int amgdd_fac_num_relax ) { return ( hypre_BoomerAMGDDSetFACNumRelax( (void *) solver, amgdd_fac_num_relax ) ); } HYPRE_Int HYPRE_BoomerAMGDDGetFACNumRelax( HYPRE_Solver solver, HYPRE_Int *amgdd_fac_num_relax ) { return ( hypre_BoomerAMGDDGetFACNumRelax( (void *) solver, amgdd_fac_num_relax ) ); } /*------------------------------------------------------------------------- * HYPRE_BoomerAMGDDSetFACNumCycles *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_BoomerAMGDDSetFACNumCycles( HYPRE_Solver solver, HYPRE_Int amgdd_fac_num_cycles ) { return ( hypre_BoomerAMGDDSetFACNumCycles( (void *) solver, amgdd_fac_num_cycles ) ); } HYPRE_Int HYPRE_BoomerAMGDDGetFACNumCycles( HYPRE_Solver solver, HYPRE_Int *amgdd_fac_num_cycles ) { return ( hypre_BoomerAMGDDGetFACNumCycles( (void *) solver, amgdd_fac_num_cycles ) ); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGDDSetFACCycleType *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_BoomerAMGDDSetFACCycleType( HYPRE_Solver solver, HYPRE_Int amgdd_fac_cycle_type ) { return ( hypre_BoomerAMGDDSetFACCycleType( (void *) solver, amgdd_fac_cycle_type ) ); } HYPRE_Int HYPRE_BoomerAMGDDGetFACCycleType( HYPRE_Solver solver, HYPRE_Int *amgdd_fac_cycle_type ) { return ( hypre_BoomerAMGDDGetFACCycleType( (void *) solver, amgdd_fac_cycle_type ) ); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGDDSetFACRelaxType *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_BoomerAMGDDSetFACRelaxType( HYPRE_Solver solver, HYPRE_Int amgdd_fac_relax_type ) { return ( hypre_BoomerAMGDDSetFACRelaxType( (void *) solver, amgdd_fac_relax_type ) ); } HYPRE_Int HYPRE_BoomerAMGDDGetFACRelaxType( HYPRE_Solver solver, HYPRE_Int *amgdd_fac_relax_type ) { return ( hypre_BoomerAMGDDGetFACRelaxType( (void *) solver, amgdd_fac_relax_type ) ); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGDDSetFACRelaxWeight *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_BoomerAMGDDSetFACRelaxWeight( HYPRE_Solver solver, HYPRE_Real amgdd_fac_relax_weight ) { return ( hypre_BoomerAMGDDSetFACRelaxWeight( (void *) solver, amgdd_fac_relax_weight ) ); } HYPRE_Int HYPRE_BoomerAMGDDGetFACRelaxWeight( HYPRE_Solver solver, HYPRE_Real *amgdd_fac_relax_weight ) { return ( hypre_BoomerAMGDDGetFACRelaxWeight( (void *) solver, amgdd_fac_relax_weight ) ); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGDDSetPadding *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_BoomerAMGDDSetPadding( HYPRE_Solver solver, HYPRE_Int padding ) { return ( hypre_BoomerAMGDDSetPadding( (void *) solver, padding ) ); } HYPRE_Int HYPRE_BoomerAMGDDGetPadding( HYPRE_Solver solver, HYPRE_Int *padding ) { return ( hypre_BoomerAMGDDGetPadding( (void *) solver, padding ) ); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGDDSetNumGhostLayers *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_BoomerAMGDDSetNumGhostLayers( HYPRE_Solver solver, HYPRE_Int num_ghost_layers ) { return ( hypre_BoomerAMGDDSetNumGhostLayers( (void *) solver, num_ghost_layers ) ); } HYPRE_Int HYPRE_BoomerAMGDDGetNumGhostLayers( HYPRE_Solver solver, HYPRE_Int *num_ghost_layers ) { return ( hypre_BoomerAMGDDGetNumGhostLayers( (void *) solver, num_ghost_layers ) ); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGDDSetUserFACRelaxation *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_BoomerAMGDDSetUserFACRelaxation( HYPRE_Solver solver, HYPRE_Int (*userFACRelaxation)( void *amgdd_vdata, HYPRE_Int level, HYPRE_Int cycle_param ) ) { return ( hypre_BoomerAMGDDSetUserFACRelaxation( (void *) solver, userFACRelaxation ) ); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGDDGetAMG *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_BoomerAMGDDGetAMG( HYPRE_Solver solver, HYPRE_Solver *amg_solver ) { return ( hypre_BoomerAMGDDGetAMG( (void *) solver, (void **) amg_solver ) ); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGDDGetFinalRelativeResidualNorm *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_BoomerAMGDDGetFinalRelativeResidualNorm( HYPRE_Solver solver, HYPRE_Real *rel_resid_norm ) { HYPRE_Solver amg_solver; HYPRE_BoomerAMGDDGetAMG(solver, &amg_solver); return ( hypre_BoomerAMGGetRelResidualNorm( (void *) amg_solver, rel_resid_norm ) ); } /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGDDGetNumIterations *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_BoomerAMGDDGetNumIterations( HYPRE_Solver solver, HYPRE_Int *num_iterations ) { HYPRE_Solver amg_solver; HYPRE_BoomerAMGDDGetAMG(solver, &amg_solver); return ( hypre_BoomerAMGGetNumIterations( (void *) amg_solver, num_iterations ) ); } hypre-2.33.0/src/parcsr_ls/HYPRE_parcsr_bicgstab.c000066400000000000000000000174741477326011500217730ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "_hypre_parcsr_ls.h" /*-------------------------------------------------------------------------- * HYPRE_ParCSRBiCGSTABCreate *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ParCSRBiCGSTABCreate( MPI_Comm comm, HYPRE_Solver *solver ) { HYPRE_UNUSED_VAR(comm); hypre_BiCGSTABFunctions * bicgstab_functions; if (!solver) { hypre_error_in_arg(2); return hypre_error_flag; } bicgstab_functions = hypre_BiCGSTABFunctionsCreate( hypre_ParKrylovCreateVector, hypre_ParKrylovDestroyVector, hypre_ParKrylovMatvecCreate, hypre_ParKrylovMatvec, hypre_ParKrylovMatvecDestroy, hypre_ParKrylovInnerProd, hypre_ParKrylovCopyVector, hypre_ParKrylovClearVector, hypre_ParKrylovScaleVector, hypre_ParKrylovAxpy, hypre_ParKrylovCommInfo, hypre_ParKrylovIdentitySetup, hypre_ParKrylovIdentity ); *solver = ( (HYPRE_Solver) hypre_BiCGSTABCreate( bicgstab_functions) ); return hypre_error_flag; } /*-------------------------------------------------------------------------- * HYPRE_ParCSRBiCGSTABDestroy *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ParCSRBiCGSTABDestroy( HYPRE_Solver solver ) { return ( hypre_BiCGSTABDestroy( (void *) solver ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRBiCGSTABSetup *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ParCSRBiCGSTABSetup( HYPRE_Solver solver, HYPRE_ParCSRMatrix A, HYPRE_ParVector b, HYPRE_ParVector x ) { return ( HYPRE_BiCGSTABSetup( solver, (HYPRE_Matrix) A, (HYPRE_Vector) b, (HYPRE_Vector) x ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRBiCGSTABSolve *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ParCSRBiCGSTABSolve( HYPRE_Solver solver, HYPRE_ParCSRMatrix A, HYPRE_ParVector b, HYPRE_ParVector x ) { return ( HYPRE_BiCGSTABSolve( solver, (HYPRE_Matrix) A, (HYPRE_Vector) b, (HYPRE_Vector) x ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRBiCGSTABSetTol *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ParCSRBiCGSTABSetTol( HYPRE_Solver solver, HYPRE_Real tol ) { return ( HYPRE_BiCGSTABSetTol( solver, tol ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRBiCGSTABSetAbsoluteTol *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ParCSRBiCGSTABSetAbsoluteTol( HYPRE_Solver solver, HYPRE_Real a_tol ) { return ( HYPRE_BiCGSTABSetAbsoluteTol( solver, a_tol ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRBiCGSTABSetMinIter *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ParCSRBiCGSTABSetMinIter( HYPRE_Solver solver, HYPRE_Int min_iter ) { return ( HYPRE_BiCGSTABSetMinIter( solver, min_iter ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRBiCGSTABSetMaxIter *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ParCSRBiCGSTABSetMaxIter( HYPRE_Solver solver, HYPRE_Int max_iter ) { return ( HYPRE_BiCGSTABSetMaxIter( solver, max_iter ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRBiCGSTABSetStopCrit *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ParCSRBiCGSTABSetStopCrit( HYPRE_Solver solver, HYPRE_Int stop_crit ) { return ( HYPRE_BiCGSTABSetStopCrit( solver, stop_crit ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRBiCGSTABSetPrecond *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ParCSRBiCGSTABSetPrecond( HYPRE_Solver solver, HYPRE_PtrToParSolverFcn precond, HYPRE_PtrToParSolverFcn precond_setup, HYPRE_Solver precond_solver ) { return ( HYPRE_BiCGSTABSetPrecond( solver, (HYPRE_PtrToSolverFcn) precond, (HYPRE_PtrToSolverFcn) precond_setup, precond_solver ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRBiCGSTABGetPrecond *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ParCSRBiCGSTABGetPrecond( HYPRE_Solver solver, HYPRE_Solver *precond_data_ptr ) { return ( HYPRE_BiCGSTABGetPrecond( solver, precond_data_ptr ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRBiCGSTABSetLogging *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ParCSRBiCGSTABSetLogging( HYPRE_Solver solver, HYPRE_Int logging) { return ( HYPRE_BiCGSTABSetLogging( solver, logging ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRBiCGSTABSetPrintLevel *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ParCSRBiCGSTABSetPrintLevel( HYPRE_Solver solver, HYPRE_Int print_level) { return ( HYPRE_BiCGSTABSetPrintLevel( solver, print_level ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRBiCGSTABGetNumIterations *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ParCSRBiCGSTABGetNumIterations( HYPRE_Solver solver, HYPRE_Int *num_iterations ) { return ( HYPRE_BiCGSTABGetNumIterations( solver, num_iterations ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRBiCGSTABGetFinalRelativeResidualNorm *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ParCSRBiCGSTABGetFinalRelativeResidualNorm( HYPRE_Solver solver, HYPRE_Real *norm ) { return ( HYPRE_BiCGSTABGetFinalRelativeResidualNorm( solver, norm ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRBiCGSTABGetResidual *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ParCSRBiCGSTABGetResidual( HYPRE_Solver solver, HYPRE_ParVector *residual) { return ( HYPRE_BiCGSTABGetResidual( solver, (void *) residual ) ); } hypre-2.33.0/src/parcsr_ls/HYPRE_parcsr_block.c000066400000000000000000000076761477326011500213120ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * HYPRE_BlockTridiag interface * *****************************************************************************/ #include "block_tridiag.h" /*-------------------------------------------------------------------------- * HYPRE_BlockTridiagCreate *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_BlockTridiagCreate(HYPRE_Solver *solver) { *solver = (HYPRE_Solver) hypre_BlockTridiagCreate( ) ; return 0; } /*-------------------------------------------------------------------------- * HYPRE_blockTridiagDestroy *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_BlockTridiagDestroy(HYPRE_Solver solver) { return (hypre_BlockTridiagDestroy((void *) solver )); } /*-------------------------------------------------------------------------- * HYPRE_BlockTridiagSetup *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_BlockTridiagSetup(HYPRE_Solver solver, HYPRE_ParCSRMatrix A, HYPRE_ParVector b, HYPRE_ParVector x) { return (hypre_BlockTridiagSetup((void *) solver, (hypre_ParCSRMatrix *) A, (hypre_ParVector *) b, (hypre_ParVector *) x)); } /*-------------------------------------------------------------------------- * HYPRE_BlockTridiagSolve *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_BlockTridiagSolve(HYPRE_Solver solver, HYPRE_ParCSRMatrix A, HYPRE_ParVector b, HYPRE_ParVector x) { return (hypre_BlockTridiagSolve((void *) solver, (hypre_ParCSRMatrix *) A, (hypre_ParVector *) b, (hypre_ParVector *) x)); } /*-------------------------------------------------------------------------- * HYPRE_BlockTridiagSetIndexSet *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_BlockTridiagSetIndexSet(HYPRE_Solver solver, HYPRE_Int n, HYPRE_Int *inds) { return (hypre_BlockTridiagSetIndexSet((void *) solver, n, inds)); } /*-------------------------------------------------------------------------- * HYPRE_BlockTridiagSetAMGStrengthThreshold *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_BlockTridiagSetAMGStrengthThreshold(HYPRE_Solver solver, HYPRE_Real thresh) { return (hypre_BlockTridiagSetAMGStrengthThreshold((void *) solver, thresh)); } /*-------------------------------------------------------------------------- * HYPRE_BlockTridiagSetAMGNumSweeps *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_BlockTridiagSetAMGNumSweeps(HYPRE_Solver solver, HYPRE_Int num_sweeps) { return (hypre_BlockTridiagSetAMGNumSweeps((void *) solver, num_sweeps)); } /*-------------------------------------------------------------------------- * HYPRE_BlockTridiagSetAMGRelaxType *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_BlockTridiagSetAMGRelaxType(HYPRE_Solver solver, HYPRE_Int relax_type) { return (hypre_BlockTridiagSetAMGRelaxType( (void *) solver, relax_type)); } /*-------------------------------------------------------------------------- * HYPRE_BlockTridiagSetPrintLevel *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_BlockTridiagSetPrintLevel(HYPRE_Solver solver, HYPRE_Int print_level) { return (hypre_BlockTridiagSetPrintLevel( (void *) solver, print_level)); } hypre-2.33.0/src/parcsr_ls/HYPRE_parcsr_cgnr.c000066400000000000000000000151251477326011500211350ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "_hypre_parcsr_ls.h" /*-------------------------------------------------------------------------- * HYPRE_ParCSRCGNRCreate *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ParCSRCGNRCreate( MPI_Comm comm, HYPRE_Solver *solver ) { HYPRE_UNUSED_VAR(comm); hypre_CGNRFunctions * cgnr_functions; if (!solver) { hypre_error_in_arg(2); return hypre_error_flag; } cgnr_functions = hypre_CGNRFunctionsCreate( hypre_ParKrylovCommInfo, hypre_ParKrylovCreateVector, hypre_ParKrylovDestroyVector, hypre_ParKrylovMatvecCreate, hypre_ParKrylovMatvec, hypre_ParKrylovMatvecT, hypre_ParKrylovMatvecDestroy, hypre_ParKrylovInnerProd, hypre_ParKrylovCopyVector, hypre_ParKrylovClearVector, hypre_ParKrylovScaleVector, hypre_ParKrylovAxpy, hypre_ParKrylovIdentitySetup, hypre_ParKrylovIdentity, hypre_ParKrylovIdentity ); *solver = ( (HYPRE_Solver) hypre_CGNRCreate( cgnr_functions) ); return hypre_error_flag; } /*-------------------------------------------------------------------------- * HYPRE_ParCSRCGNRDestroy *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ParCSRCGNRDestroy( HYPRE_Solver solver ) { return ( hypre_CGNRDestroy( (void *) solver ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRCGNRSetup *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ParCSRCGNRSetup( HYPRE_Solver solver, HYPRE_ParCSRMatrix A, HYPRE_ParVector b, HYPRE_ParVector x ) { return ( HYPRE_CGNRSetup( solver, (HYPRE_Matrix) A, (HYPRE_Vector) b, (HYPRE_Vector) x ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRCGNRSolve *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ParCSRCGNRSolve( HYPRE_Solver solver, HYPRE_ParCSRMatrix A, HYPRE_ParVector b, HYPRE_ParVector x ) { return ( HYPRE_CGNRSolve( solver, (HYPRE_Matrix) A, (HYPRE_Vector) b, (HYPRE_Vector) x ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRCGNRSetTol *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ParCSRCGNRSetTol( HYPRE_Solver solver, HYPRE_Real tol ) { return ( HYPRE_CGNRSetTol( solver, tol ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRCGNRSetMinIter *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ParCSRCGNRSetMinIter( HYPRE_Solver solver, HYPRE_Int min_iter ) { return ( HYPRE_CGNRSetMinIter( solver, min_iter ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRCGNRSetMaxIter *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ParCSRCGNRSetMaxIter( HYPRE_Solver solver, HYPRE_Int max_iter ) { return ( HYPRE_CGNRSetMaxIter( solver, max_iter ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRCGNRSetStopCrit *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ParCSRCGNRSetStopCrit( HYPRE_Solver solver, HYPRE_Int stop_crit ) { return ( HYPRE_CGNRSetStopCrit( solver, stop_crit ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRCGNRSetPrecond *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ParCSRCGNRSetPrecond( HYPRE_Solver solver, HYPRE_PtrToParSolverFcn precond, HYPRE_PtrToParSolverFcn precondT, HYPRE_PtrToParSolverFcn precond_setup, HYPRE_Solver precond_solver ) { return ( HYPRE_CGNRSetPrecond( solver, (HYPRE_PtrToSolverFcn) precond, (HYPRE_PtrToSolverFcn) precondT, (HYPRE_PtrToSolverFcn) precond_setup, precond_solver ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRCGNRGetPrecond *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ParCSRCGNRGetPrecond( HYPRE_Solver solver, HYPRE_Solver *precond_data_ptr ) { return ( HYPRE_CGNRGetPrecond( solver, precond_data_ptr ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRCGNRSetLogging *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ParCSRCGNRSetLogging( HYPRE_Solver solver, HYPRE_Int logging) { return ( HYPRE_CGNRSetLogging( solver, logging ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRCGNRGetNumIterations *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ParCSRCGNRGetNumIterations( HYPRE_Solver solver, HYPRE_Int *num_iterations ) { return ( HYPRE_CGNRGetNumIterations( solver, num_iterations ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRCGNRGetFinalRelativeResidualNorm *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ParCSRCGNRGetFinalRelativeResidualNorm( HYPRE_Solver solver, HYPRE_Real *norm ) { return ( HYPRE_CGNRGetFinalRelativeResidualNorm( solver, norm ) ); } hypre-2.33.0/src/parcsr_ls/HYPRE_parcsr_cogmres.c000066400000000000000000000212451477326011500216430ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "_hypre_parcsr_ls.h" /*-------------------------------------------------------------------------- * HYPRE_ParCSRCOGMRESCreate *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ParCSRCOGMRESCreate( MPI_Comm comm, HYPRE_Solver *solver ) { HYPRE_UNUSED_VAR(comm); hypre_COGMRESFunctions * cogmres_functions; if (!solver) { hypre_error_in_arg(2); return hypre_error_flag; } cogmres_functions = hypre_COGMRESFunctionsCreate( hypre_ParKrylovCAlloc, hypre_ParKrylovFree, hypre_ParKrylovCommInfo, hypre_ParKrylovCreateVector, hypre_ParKrylovCreateVectorArray, hypre_ParKrylovDestroyVector, hypre_ParKrylovMatvecCreate, hypre_ParKrylovMatvec, hypre_ParKrylovMatvecDestroy, hypre_ParKrylovInnerProd, hypre_ParKrylovMassInnerProd, hypre_ParKrylovMassDotpTwo, hypre_ParKrylovCopyVector, //hypre_ParKrylovCopyVector, hypre_ParKrylovClearVector, hypre_ParKrylovScaleVector, hypre_ParKrylovAxpy, hypre_ParKrylovMassAxpy, hypre_ParKrylovIdentitySetup, hypre_ParKrylovIdentity ); *solver = ( (HYPRE_Solver) hypre_COGMRESCreate( cogmres_functions ) ); return hypre_error_flag; } /*-------------------------------------------------------------------------- * HYPRE_ParCSRCOGMRESDestroy *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ParCSRCOGMRESDestroy( HYPRE_Solver solver ) { return ( hypre_COGMRESDestroy( (void *) solver ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRCOGMRESSetup *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ParCSRCOGMRESSetup( HYPRE_Solver solver, HYPRE_ParCSRMatrix A, HYPRE_ParVector b, HYPRE_ParVector x ) { return ( HYPRE_COGMRESSetup( solver, (HYPRE_Matrix) A, (HYPRE_Vector) b, (HYPRE_Vector) x ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRCOGMRESSolve *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ParCSRCOGMRESSolve( HYPRE_Solver solver, HYPRE_ParCSRMatrix A, HYPRE_ParVector b, HYPRE_ParVector x ) { return ( HYPRE_COGMRESSolve( solver, (HYPRE_Matrix) A, (HYPRE_Vector) b, (HYPRE_Vector) x ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRCOGMRESSetKDim *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ParCSRCOGMRESSetKDim( HYPRE_Solver solver, HYPRE_Int k_dim ) { return ( HYPRE_COGMRESSetKDim( solver, k_dim ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRCOGMRESSetUnroll *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ParCSRCOGMRESSetUnroll( HYPRE_Solver solver, HYPRE_Int unroll ) { return ( HYPRE_COGMRESSetUnroll( solver, unroll ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRCOGMRESSetCGS *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ParCSRCOGMRESSetCGS( HYPRE_Solver solver, HYPRE_Int cgs ) { return ( HYPRE_COGMRESSetCGS( solver, cgs ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRCOGMRESSetTol *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ParCSRCOGMRESSetTol( HYPRE_Solver solver, HYPRE_Real tol ) { return ( HYPRE_COGMRESSetTol( solver, tol ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRCOGMRESSetAbsoluteTol *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ParCSRCOGMRESSetAbsoluteTol( HYPRE_Solver solver, HYPRE_Real a_tol ) { return ( HYPRE_COGMRESSetAbsoluteTol( solver, a_tol ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRCOGMRESSetMinIter *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ParCSRCOGMRESSetMinIter( HYPRE_Solver solver, HYPRE_Int min_iter ) { return ( HYPRE_COGMRESSetMinIter( solver, min_iter ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRCOGMRESSetMaxIter *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ParCSRCOGMRESSetMaxIter( HYPRE_Solver solver, HYPRE_Int max_iter ) { return ( HYPRE_COGMRESSetMaxIter( solver, max_iter ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRCOGMRESSetPrecond *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ParCSRCOGMRESSetPrecond( HYPRE_Solver solver, HYPRE_PtrToParSolverFcn precond, HYPRE_PtrToParSolverFcn precond_setup, HYPRE_Solver precond_solver ) { return ( HYPRE_COGMRESSetPrecond( solver, (HYPRE_PtrToSolverFcn) precond, (HYPRE_PtrToSolverFcn) precond_setup, precond_solver ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRCOGMRESGetPrecond *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ParCSRCOGMRESGetPrecond( HYPRE_Solver solver, HYPRE_Solver *precond_data_ptr ) { return ( HYPRE_COGMRESGetPrecond( solver, precond_data_ptr ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRCOGMRESSetLogging *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ParCSRCOGMRESSetLogging( HYPRE_Solver solver, HYPRE_Int logging) { return ( HYPRE_COGMRESSetLogging( solver, logging ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRCOGMRESSetPrintLevel *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ParCSRCOGMRESSetPrintLevel( HYPRE_Solver solver, HYPRE_Int print_level) { return ( HYPRE_COGMRESSetPrintLevel( solver, print_level ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRCOGMRESGetNumIterations *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ParCSRCOGMRESGetNumIterations( HYPRE_Solver solver, HYPRE_Int *num_iterations ) { return ( HYPRE_COGMRESGetNumIterations( solver, num_iterations ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRCOGMRESGetFinalRelativeResidualNorm *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ParCSRCOGMRESGetFinalRelativeResidualNorm( HYPRE_Solver solver, HYPRE_Real *norm ) { return ( HYPRE_COGMRESGetFinalRelativeResidualNorm( solver, norm ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRCOGMRESGetResidual *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ParCSRCOGMRESGetResidual( HYPRE_Solver solver, HYPRE_ParVector *residual) { return ( HYPRE_COGMRESGetResidual( solver, (void *) residual ) ); } hypre-2.33.0/src/parcsr_ls/HYPRE_parcsr_flexgmres.c000066400000000000000000000206661477326011500222060ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "_hypre_parcsr_ls.h" /*-------------------------------------------------------------------------- * HYPRE_ParCSRFlexGMRESCreate *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ParCSRFlexGMRESCreate( MPI_Comm comm, HYPRE_Solver *solver ) { HYPRE_UNUSED_VAR(comm); hypre_FlexGMRESFunctions * fgmres_functions; if (!solver) { hypre_error_in_arg(2); return hypre_error_flag; } fgmres_functions = hypre_FlexGMRESFunctionsCreate( hypre_ParKrylovCAlloc, hypre_ParKrylovFree, hypre_ParKrylovCommInfo, hypre_ParKrylovCreateVector, hypre_ParKrylovCreateVectorArray, hypre_ParKrylovDestroyVector, hypre_ParKrylovMatvecCreate, hypre_ParKrylovMatvec, hypre_ParKrylovMatvecDestroy, hypre_ParKrylovInnerProd, hypre_ParKrylovCopyVector, hypre_ParKrylovClearVector, hypre_ParKrylovScaleVector, hypre_ParKrylovAxpy, hypre_ParKrylovIdentitySetup, hypre_ParKrylovIdentity ); *solver = ( (HYPRE_Solver) hypre_FlexGMRESCreate( fgmres_functions ) ); return hypre_error_flag; } /*-------------------------------------------------------------------------- * HYPRE_ParCSRFlexGMRESDestroy *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ParCSRFlexGMRESDestroy( HYPRE_Solver solver ) { return ( hypre_FlexGMRESDestroy( (void *) solver ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRFlexGMRESSetup *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ParCSRFlexGMRESSetup( HYPRE_Solver solver, HYPRE_ParCSRMatrix A, HYPRE_ParVector b, HYPRE_ParVector x ) { return ( HYPRE_FlexGMRESSetup( solver, (HYPRE_Matrix) A, (HYPRE_Vector) b, (HYPRE_Vector) x ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRFlexGMRESSolve *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ParCSRFlexGMRESSolve( HYPRE_Solver solver, HYPRE_ParCSRMatrix A, HYPRE_ParVector b, HYPRE_ParVector x ) { return ( HYPRE_FlexGMRESSolve( solver, (HYPRE_Matrix) A, (HYPRE_Vector) b, (HYPRE_Vector) x ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRFlexGMRESSetKDim *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ParCSRFlexGMRESSetKDim( HYPRE_Solver solver, HYPRE_Int k_dim ) { return ( HYPRE_FlexGMRESSetKDim( solver, k_dim ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRFlexGMRESSetTol *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ParCSRFlexGMRESSetTol( HYPRE_Solver solver, HYPRE_Real tol ) { return ( HYPRE_FlexGMRESSetTol( solver, tol ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRFlexGMRESSetAbsoluteTol *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ParCSRFlexGMRESSetAbsoluteTol( HYPRE_Solver solver, HYPRE_Real a_tol ) { return ( HYPRE_FlexGMRESSetAbsoluteTol( solver, a_tol ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRFlexGMRESSetMinIter *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ParCSRFlexGMRESSetMinIter( HYPRE_Solver solver, HYPRE_Int min_iter ) { return ( HYPRE_FlexGMRESSetMinIter( solver, min_iter ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRFlexGMRESSetMaxIter *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ParCSRFlexGMRESSetMaxIter( HYPRE_Solver solver, HYPRE_Int max_iter ) { return ( HYPRE_FlexGMRESSetMaxIter( solver, max_iter ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRFlexGMRESSetPrecond *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ParCSRFlexGMRESSetPrecond( HYPRE_Solver solver, HYPRE_PtrToParSolverFcn precond, HYPRE_PtrToParSolverFcn precond_setup, HYPRE_Solver precond_solver ) { return ( HYPRE_FlexGMRESSetPrecond( solver, (HYPRE_PtrToSolverFcn) precond, (HYPRE_PtrToSolverFcn) precond_setup, precond_solver ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRFlexGMRESGetPrecond *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ParCSRFlexGMRESGetPrecond( HYPRE_Solver solver, HYPRE_Solver *precond_data_ptr ) { return ( HYPRE_FlexGMRESGetPrecond( solver, precond_data_ptr ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRFlexGMRESSetLogging *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ParCSRFlexGMRESSetLogging( HYPRE_Solver solver, HYPRE_Int logging) { return ( HYPRE_FlexGMRESSetLogging( solver, logging ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRFlexGMRESSetPrintLevel *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ParCSRFlexGMRESSetPrintLevel( HYPRE_Solver solver, HYPRE_Int print_level) { return ( HYPRE_FlexGMRESSetPrintLevel( solver, print_level ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRFlexGMRESGetNumIterations *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ParCSRFlexGMRESGetNumIterations( HYPRE_Solver solver, HYPRE_Int *num_iterations ) { return ( HYPRE_FlexGMRESGetNumIterations( solver, num_iterations ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRFlexGMRESGetFinalRelativeResidualNorm *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ParCSRFlexGMRESGetFinalRelativeResidualNorm( HYPRE_Solver solver, HYPRE_Real *norm ) { return ( HYPRE_FlexGMRESGetFinalRelativeResidualNorm( solver, norm ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRFlexGMRESGetResidual *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ParCSRFlexGMRESGetResidual( HYPRE_Solver solver, HYPRE_ParVector *residual) { return ( HYPRE_FlexGMRESGetResidual( solver, (void *) residual ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRFlexGMRESSetModifyPC *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ParCSRFlexGMRESSetModifyPC( HYPRE_Solver solver, HYPRE_PtrToModifyPCFcn modify_pc) { return ( HYPRE_FlexGMRESSetModifyPC( solver, (HYPRE_PtrToModifyPCFcn) modify_pc)); } hypre-2.33.0/src/parcsr_ls/HYPRE_parcsr_fsai.c000066400000000000000000000303331477326011500211240ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "_hypre_parcsr_ls.h" /*-------------------------------------------------------------------------- * HYPRE_FSAICreate *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_FSAICreate( HYPRE_Solver *solver) { if (!solver) { hypre_error_in_arg(1); return hypre_error_flag; } *solver = (HYPRE_Solver) hypre_FSAICreate( ) ; return hypre_error_flag; } /*-------------------------------------------------------------------------- * HYPRE_FSAIDestroy *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_FSAIDestroy( HYPRE_Solver solver ) { return ( hypre_FSAIDestroy( (void *) solver ) ); } /*-------------------------------------------------------------------------- * HYPRE_FSAISetup *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_FSAISetup( HYPRE_Solver solver, HYPRE_ParCSRMatrix A, HYPRE_ParVector b, HYPRE_ParVector x ) { return ( hypre_FSAISetup( (void *) solver, (hypre_ParCSRMatrix *) A, (hypre_ParVector *) b, (hypre_ParVector *) x ) ); } /*-------------------------------------------------------------------------- * HYPRE_FSAISolve *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_FSAISolve( HYPRE_Solver solver, HYPRE_ParCSRMatrix A, HYPRE_ParVector b, HYPRE_ParVector x ) { return ( hypre_FSAISolve( (void *) solver, (hypre_ParCSRMatrix *) A, (hypre_ParVector *) b, (hypre_ParVector *) x ) ); } /*-------------------------------------------------------------------------- * HYPRE_FSAISetAlgoType *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_FSAISetAlgoType( HYPRE_Solver solver, HYPRE_Int algo_type ) { return ( hypre_FSAISetAlgoType( (void *) solver, algo_type ) ); } /*-------------------------------------------------------------------------- * HYPRE_FSAIGetAlgoType *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_FSAIGetAlgoType( HYPRE_Solver solver, HYPRE_Int *algo_type ) { return ( hypre_FSAIGetAlgoType( (void *) solver, algo_type ) ); } /*-------------------------------------------------------------------------- * HYPRE_FSAISetLocalSolveType *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_FSAISetLocalSolveType( HYPRE_Solver solver, HYPRE_Int local_solve_type ) { return ( hypre_FSAISetLocalSolveType( (void *) solver, local_solve_type ) ); } /*-------------------------------------------------------------------------- * HYPRE_FSAIGetLocalSolveType *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_FSAIGetLocalSolveType( HYPRE_Solver solver, HYPRE_Int *local_solve_type ) { return ( hypre_FSAIGetLocalSolveType( (void *) solver, local_solve_type ) ); } /*-------------------------------------------------------------------------- * HYPRE_FSAISetMaxSteps *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_FSAISetMaxSteps( HYPRE_Solver solver, HYPRE_Int max_steps ) { return ( hypre_FSAISetMaxSteps( (void *) solver, max_steps ) ); } /*-------------------------------------------------------------------------- * HYPRE_FSAIGetMaxSteps *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_FSAIGetMaxSteps( HYPRE_Solver solver, HYPRE_Int *max_steps ) { return ( hypre_FSAIGetMaxSteps( (void *) solver, max_steps ) ); } /*-------------------------------------------------------------------------- * HYPRE_FSAISetMaxNnzRow *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_FSAISetMaxNnzRow( HYPRE_Solver solver, HYPRE_Int max_nnz_row ) { return ( hypre_FSAISetMaxNnzRow( (void *) solver, max_nnz_row ) ); } /*-------------------------------------------------------------------------- * HYPRE_FSAIGetMaxNnzRow *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_FSAIGetMaxNnzRow( HYPRE_Solver solver, HYPRE_Int *max_nnz_row ) { return ( hypre_FSAIGetMaxNnzRow( (void *) solver, max_nnz_row ) ); } /*-------------------------------------------------------------------------- * HYPRE_FSAISetMaxStepSize *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_FSAISetMaxStepSize( HYPRE_Solver solver, HYPRE_Int max_step_size ) { return ( hypre_FSAISetMaxStepSize( (void *) solver, max_step_size ) ); } /*-------------------------------------------------------------------------- * HYPRE_FSAIGetMaxStepSize *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_FSAIGetMaxStepSize( HYPRE_Solver solver, HYPRE_Int *max_step_size ) { return ( hypre_FSAIGetMaxStepSize( (void *) solver, max_step_size ) ); } /*-------------------------------------------------------------------------- * HYPRE_FSAISetNumLevels *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_FSAISetNumLevels( HYPRE_Solver solver, HYPRE_Int num_levels ) { return ( hypre_FSAISetNumLevels( (void *) solver, num_levels ) ); } /*-------------------------------------------------------------------------- * HYPRE_FSAIGetNumLevels *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_FSAIGetNumLevels( HYPRE_Solver solver, HYPRE_Int *num_levels ) { return ( hypre_FSAIGetNumLevels( (void *) solver, num_levels ) ); } /*-------------------------------------------------------------------------- * HYPRE_FSAISetThreshold *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_FSAISetThreshold( HYPRE_Solver solver, HYPRE_Real threshold ) { return ( hypre_FSAISetThreshold( (void *) solver, threshold ) ); } /*-------------------------------------------------------------------------- * HYPRE_FSAIGetThreshold *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_FSAIGetThreshold( HYPRE_Solver solver, HYPRE_Real *threshold ) { return ( hypre_FSAIGetThreshold( (void *) solver, threshold ) ); } /*-------------------------------------------------------------------------- * HYPRE_FSAISetZeroGuess *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_FSAISetZeroGuess( HYPRE_Solver solver, HYPRE_Int zero_guess ) { return ( hypre_FSAISetZeroGuess( (void *) solver, zero_guess ) ); } /*-------------------------------------------------------------------------- * HYPRE_FSAIGetZeroGuess *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_FSAIGetZeroGuess( HYPRE_Solver solver, HYPRE_Int *zero_guess ) { return ( hypre_FSAIGetZeroGuess( (void *) solver, zero_guess ) ); } /*-------------------------------------------------------------------------- * HYPRE_FSAISetKapTolerance *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_FSAISetKapTolerance( HYPRE_Solver solver, HYPRE_Real kap_tolerance ) { return ( hypre_FSAISetKapTolerance( (void *) solver, kap_tolerance ) ); } /*-------------------------------------------------------------------------- * HYPRE_FSAIGetKapTolerance *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_FSAIGetKapTolerance( HYPRE_Solver solver, HYPRE_Real *kap_tolerance ) { return ( hypre_FSAIGetKapTolerance( (void *) solver, kap_tolerance ) ); } /*-------------------------------------------------------------------------- * HYPRE_FSAISetTolerance *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_FSAISetTolerance( HYPRE_Solver solver, HYPRE_Real tolerance ) { return ( hypre_FSAISetTolerance( (void *) solver, tolerance ) ); } /*-------------------------------------------------------------------------- * HYPRE_FSAIGetTolerance *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_FSAIGetTolerance( HYPRE_Solver solver, HYPRE_Real *tolerance ) { return ( hypre_FSAIGetTolerance( (void *) solver, tolerance ) ); } /*-------------------------------------------------------------------------- * HYPRE_FSAISetOmega *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_FSAISetOmega( HYPRE_Solver solver, HYPRE_Real omega ) { return ( hypre_FSAISetOmega( (void *) solver, omega ) ); } /*-------------------------------------------------------------------------- * HYPRE_FSAIGetOmega *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_FSAIGetOmega( HYPRE_Solver solver, HYPRE_Real *omega ) { return ( hypre_FSAIGetOmega( (void *) solver, omega ) ); } /*-------------------------------------------------------------------------- * HYPRE_FSAISetMaxIterations *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_FSAISetMaxIterations( HYPRE_Solver solver, HYPRE_Int max_iterations ) { return ( hypre_FSAISetMaxIterations( (void *) solver, max_iterations ) ); } /*-------------------------------------------------------------------------- * HYPRE_FSAIGetMaxIterations *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_FSAIGetMaxIterations( HYPRE_Solver solver, HYPRE_Int *max_iterations ) { return ( hypre_FSAIGetMaxIterations( (void *) solver, max_iterations ) ); } /*-------------------------------------------------------------------------- * HYPRE_FSAISetEigMaxIters *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_FSAISetEigMaxIters( HYPRE_Solver solver, HYPRE_Int eig_max_iters ) { return ( hypre_FSAISetEigMaxIters( (void *) solver, eig_max_iters ) ); } /*-------------------------------------------------------------------------- * HYPRE_FSAIGetEigMaxIters *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_FSAIGetEigMaxIters( HYPRE_Solver solver, HYPRE_Int *eig_max_iters ) { return ( hypre_FSAIGetEigMaxIters( (void *) solver, eig_max_iters ) ); } /*-------------------------------------------------------------------------- * HYPRE_FSAISetPrintLevel *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_FSAISetPrintLevel( HYPRE_Solver solver, HYPRE_Int print_level ) { return ( hypre_FSAISetPrintLevel( (void *) solver, print_level ) ); } /*-------------------------------------------------------------------------- * HYPRE_FSAIGetPrintLevel *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_FSAIGetPrintLevel( HYPRE_Solver solver, HYPRE_Int *print_level ) { return ( hypre_FSAIGetPrintLevel( (void *) solver, print_level ) ); } hypre-2.33.0/src/parcsr_ls/HYPRE_parcsr_gmres.c000066400000000000000000000237731477326011500213310ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "_hypre_parcsr_ls.h" /*-------------------------------------------------------------------------- * HYPRE_ParCSRGMRESCreate *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ParCSRGMRESCreate( MPI_Comm comm, HYPRE_Solver *solver ) { HYPRE_UNUSED_VAR(comm); hypre_GMRESFunctions * gmres_functions; if (!solver) { hypre_error_in_arg(2); return hypre_error_flag; } gmres_functions = hypre_GMRESFunctionsCreate( hypre_ParKrylovCAlloc, hypre_ParKrylovFree, hypre_ParKrylovCommInfo, hypre_ParKrylovCreateVector, hypre_ParKrylovCreateVectorArray, hypre_ParKrylovDestroyVector, hypre_ParKrylovMatvecCreate, hypre_ParKrylovMatvec, hypre_ParKrylovMatvecDestroy, hypre_ParKrylovInnerProd, hypre_ParKrylovCopyVector, hypre_ParKrylovClearVector, hypre_ParKrylovScaleVector, hypre_ParKrylovAxpy, hypre_ParKrylovIdentitySetup, hypre_ParKrylovIdentity ); *solver = ( (HYPRE_Solver) hypre_GMRESCreate( gmres_functions ) ); return hypre_error_flag; } /*-------------------------------------------------------------------------- * HYPRE_ParCSRGMRESDestroy *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ParCSRGMRESDestroy( HYPRE_Solver solver ) { return ( hypre_GMRESDestroy( (void *) solver ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRGMRESSetup *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ParCSRGMRESSetup( HYPRE_Solver solver, HYPRE_ParCSRMatrix A, HYPRE_ParVector b, HYPRE_ParVector x ) { return ( HYPRE_GMRESSetup( solver, (HYPRE_Matrix) A, (HYPRE_Vector) b, (HYPRE_Vector) x ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRGMRESSolve *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ParCSRGMRESSolve( HYPRE_Solver solver, HYPRE_ParCSRMatrix A, HYPRE_ParVector b, HYPRE_ParVector x ) { return ( HYPRE_GMRESSolve( solver, (HYPRE_Matrix) A, (HYPRE_Vector) b, (HYPRE_Vector) x ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRGMRESSetKDim *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ParCSRGMRESSetKDim( HYPRE_Solver solver, HYPRE_Int k_dim ) { return ( HYPRE_GMRESSetKDim( solver, k_dim ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRGMRESSetTol *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ParCSRGMRESSetTol( HYPRE_Solver solver, HYPRE_Real tol ) { return ( HYPRE_GMRESSetTol( solver, tol ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRGMRESSetAbsoluteTol *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ParCSRGMRESSetAbsoluteTol( HYPRE_Solver solver, HYPRE_Real a_tol ) { return ( HYPRE_GMRESSetAbsoluteTol( solver, a_tol ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRGMRESSetMinIter *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ParCSRGMRESSetMinIter( HYPRE_Solver solver, HYPRE_Int min_iter ) { return ( HYPRE_GMRESSetMinIter( solver, min_iter ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRGMRESSetMaxIter *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ParCSRGMRESSetMaxIter( HYPRE_Solver solver, HYPRE_Int max_iter ) { return ( HYPRE_GMRESSetMaxIter( solver, max_iter ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRGMRESSetStopCrit - OBSOLETE *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ParCSRGMRESSetStopCrit( HYPRE_Solver solver, HYPRE_Int stop_crit ) { return ( HYPRE_GMRESSetStopCrit( solver, stop_crit ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRGMRESSetPrecond *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ParCSRGMRESSetPrecond( HYPRE_Solver solver, HYPRE_PtrToParSolverFcn precond, HYPRE_PtrToParSolverFcn precond_setup, HYPRE_Solver precond_solver ) { return ( HYPRE_GMRESSetPrecond( solver, (HYPRE_PtrToSolverFcn) precond, (HYPRE_PtrToSolverFcn) precond_setup, precond_solver ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRGMRESGetPrecond *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ParCSRGMRESGetPrecond( HYPRE_Solver solver, HYPRE_Solver *precond_data_ptr ) { return ( HYPRE_GMRESGetPrecond( solver, precond_data_ptr ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRGMRESSetLogging *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ParCSRGMRESSetLogging( HYPRE_Solver solver, HYPRE_Int logging) { return ( HYPRE_GMRESSetLogging( solver, logging ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRGMRESSetPrintLevel *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ParCSRGMRESSetPrintLevel( HYPRE_Solver solver, HYPRE_Int print_level) { return ( HYPRE_GMRESSetPrintLevel( solver, print_level ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRGMRESGetNumIterations *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ParCSRGMRESGetNumIterations( HYPRE_Solver solver, HYPRE_Int *num_iterations ) { return ( HYPRE_GMRESGetNumIterations( solver, num_iterations ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRGMRESGetFinalRelativeResidualNorm *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ParCSRGMRESGetFinalRelativeResidualNorm( HYPRE_Solver solver, HYPRE_Real *norm ) { return ( HYPRE_GMRESGetFinalRelativeResidualNorm( solver, norm ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRGMRESGetResidual *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ParCSRGMRESGetResidual( HYPRE_Solver solver, HYPRE_ParVector *residual ) { return ( HYPRE_GMRESGetResidual( solver, (void *) residual ) ); } /*-------------------------------------------------------------------------- * Setup routine for on-processor triangular solve as preconditioning. *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ParCSROnProcTriSetup(HYPRE_Solver solver, HYPRE_ParCSRMatrix HA, HYPRE_ParVector Hy, HYPRE_ParVector Hx) { HYPRE_UNUSED_VAR(solver); HYPRE_UNUSED_VAR(Hy); HYPRE_UNUSED_VAR(Hx); hypre_ParCSRMatrix *A = (hypre_ParCSRMatrix *) HA; /* Check for and get topological ordering of matrix */ if (!hypre_ParCSRMatrixProcOrdering(A)) { hypre_CSRMatrix *A_diag = hypre_ParCSRMatrixDiag(A); HYPRE_Real *A_diag_data = hypre_CSRMatrixData(A_diag); HYPRE_Int *A_diag_i = hypre_CSRMatrixI(A_diag); HYPRE_Int *A_diag_j = hypre_CSRMatrixJ(A_diag); HYPRE_Int n = hypre_CSRMatrixNumRows(A_diag); HYPRE_Int *proc_ordering = hypre_TAlloc(HYPRE_Int, n, HYPRE_MEMORY_HOST); hypre_topo_sort(A_diag_i, A_diag_j, A_diag_data, proc_ordering, n); hypre_ParCSRMatrixProcOrdering(A) = proc_ordering; } return 0; } /*-------------------------------------------------------------------------- * Solve routine for on-processor triangular solve as preconditioning. *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ParCSROnProcTriSolve(HYPRE_Solver solver, HYPRE_ParCSRMatrix HA, HYPRE_ParVector Hy, HYPRE_ParVector Hx) { HYPRE_UNUSED_VAR(solver); hypre_ParCSRMatrix *A = (hypre_ParCSRMatrix *) HA; hypre_ParVector *y = (hypre_ParVector *) Hy; hypre_ParVector *x = (hypre_ParVector *) Hx; HYPRE_Int ierr = 0; ierr = hypre_BoomerAMGRelax(A, y, NULL, 10, 0, 1, 1, NULL, x, NULL, NULL); return ierr; } hypre-2.33.0/src/parcsr_ls/HYPRE_parcsr_hybrid.c000066400000000000000000000615321477326011500214700ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "_hypre_parcsr_ls.h" /*-------------------------------------------------------------------------- * HYPRE_ParCSRHybridCreate *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ParCSRHybridCreate( HYPRE_Solver *solver ) { if (!solver) { hypre_error_in_arg(2); return hypre_error_flag; } *solver = ( (HYPRE_Solver) hypre_AMGHybridCreate( ) ); return hypre_error_flag; } /*-------------------------------------------------------------------------- * HYPRE_ParCSRHybridDestroy *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ParCSRHybridDestroy( HYPRE_Solver solver ) { return ( hypre_AMGHybridDestroy( (void *) solver ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRHybridSetup *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ParCSRHybridSetup( HYPRE_Solver solver, HYPRE_ParCSRMatrix A, HYPRE_ParVector b, HYPRE_ParVector x ) { return ( hypre_AMGHybridSetup( (void *) solver, (hypre_ParCSRMatrix *) A, (hypre_ParVector *) b, (hypre_ParVector *) x ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRHybridSolve *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ParCSRHybridSolve( HYPRE_Solver solver, HYPRE_ParCSRMatrix A, HYPRE_ParVector b, HYPRE_ParVector x ) { return ( hypre_AMGHybridSolve( (void *) solver, (hypre_ParCSRMatrix *) A, (hypre_ParVector *) b, (hypre_ParVector *) x ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRHybridSetTol *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ParCSRHybridSetTol( HYPRE_Solver solver, HYPRE_Real tol ) { return ( hypre_AMGHybridSetTol( (void *) solver, tol ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRHybridSetAbsoluteTol *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ParCSRHybridSetAbsoluteTol( HYPRE_Solver solver, HYPRE_Real tol ) { return ( hypre_AMGHybridSetAbsoluteTol( (void *) solver, tol ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRHybridSetConvergenceTol *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ParCSRHybridSetConvergenceTol( HYPRE_Solver solver, HYPRE_Real cf_tol ) { return ( hypre_AMGHybridSetConvergenceTol( (void *) solver, cf_tol ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRHybridSetDSCGMaxIter *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ParCSRHybridSetDSCGMaxIter( HYPRE_Solver solver, HYPRE_Int dscg_max_its ) { return ( hypre_AMGHybridSetDSCGMaxIter( (void *) solver, dscg_max_its ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRHybridSetPCGMaxIter *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ParCSRHybridSetPCGMaxIter( HYPRE_Solver solver, HYPRE_Int pcg_max_its ) { return ( hypre_AMGHybridSetPCGMaxIter( (void *) solver, pcg_max_its ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRHybridSetSetupType *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ParCSRHybridSetSetupType( HYPRE_Solver solver, HYPRE_Int setup_type ) { return ( hypre_AMGHybridSetSetupType( (void *) solver, setup_type ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRHybridSetSolverType *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ParCSRHybridSetSolverType( HYPRE_Solver solver, HYPRE_Int solver_type ) { return ( hypre_AMGHybridSetSolverType( (void *) solver, solver_type ) ); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ParCSRHybridSetRecomputeResidual( HYPRE_Solver solver, HYPRE_Int recompute_residual ) { return ( hypre_AMGHybridSetRecomputeResidual( (void *) solver, recompute_residual ) ); } HYPRE_Int HYPRE_ParCSRHybridGetRecomputeResidual( HYPRE_Solver solver, HYPRE_Int *recompute_residual ) { return ( hypre_AMGHybridGetRecomputeResidual( (void *) solver, recompute_residual ) ); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ParCSRHybridSetRecomputeResidualP( HYPRE_Solver solver, HYPRE_Int recompute_residual_p ) { return ( hypre_AMGHybridSetRecomputeResidualP( (void *) solver, recompute_residual_p ) ); } HYPRE_Int HYPRE_ParCSRHybridGetRecomputeResidualP( HYPRE_Solver solver, HYPRE_Int *recompute_residual_p ) { return ( hypre_AMGHybridGetRecomputeResidualP( (void *) solver, recompute_residual_p ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRHybridSetKDim *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ParCSRHybridSetKDim( HYPRE_Solver solver, HYPRE_Int k_dim ) { return ( hypre_AMGHybridSetKDim( (void *) solver, k_dim ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRHybridSetTwoNorm *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ParCSRHybridSetTwoNorm( HYPRE_Solver solver, HYPRE_Int two_norm ) { return ( hypre_AMGHybridSetTwoNorm( (void *) solver, two_norm ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRHybridSetStopCrit *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ParCSRHybridSetStopCrit( HYPRE_Solver solver, HYPRE_Int stop_crit ) { return ( hypre_AMGHybridSetStopCrit( (void *) solver, stop_crit ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRHybridSetRelChange *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ParCSRHybridSetRelChange( HYPRE_Solver solver, HYPRE_Int rel_change ) { return ( hypre_AMGHybridSetRelChange( (void *) solver, rel_change ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRHybridSetPrecond *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ParCSRHybridSetPrecond( HYPRE_Solver solver, HYPRE_PtrToParSolverFcn precond, HYPRE_PtrToParSolverFcn precond_setup, HYPRE_Solver precond_solver ) { return ( hypre_AMGHybridSetPrecond( (void *) solver, (HYPRE_Int (*)(void*, void*, void*, void*) ) precond, (HYPRE_Int (*)(void*, void*, void*, void*) ) precond_setup, (void *) precond_solver ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRHybridSetLogging *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ParCSRHybridSetLogging( HYPRE_Solver solver, HYPRE_Int logging ) { return ( hypre_AMGHybridSetLogging( (void *) solver, logging ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRHybridSetPrintLevel *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ParCSRHybridSetPrintLevel( HYPRE_Solver solver, HYPRE_Int print_level ) { return ( hypre_AMGHybridSetPrintLevel( (void *) solver, print_level ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRHybridSetStrongThreshold *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ParCSRHybridSetStrongThreshold( HYPRE_Solver solver, HYPRE_Real strong_threshold ) { return ( hypre_AMGHybridSetStrongThreshold( (void *) solver, strong_threshold ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRHybridSetMaxRowSum *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ParCSRHybridSetMaxRowSum( HYPRE_Solver solver, HYPRE_Real max_row_sum ) { return ( hypre_AMGHybridSetMaxRowSum( (void *) solver, max_row_sum ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRHybridSetTruncFactor *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ParCSRHybridSetTruncFactor( HYPRE_Solver solver, HYPRE_Real trunc_factor ) { return ( hypre_AMGHybridSetTruncFactor( (void *) solver, trunc_factor ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRHybridSetPMaxElmts *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ParCSRHybridSetPMaxElmts( HYPRE_Solver solver, HYPRE_Int p_max ) { return ( hypre_AMGHybridSetPMaxElmts( (void *) solver, p_max ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRHybridSetMaxLevels *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ParCSRHybridSetMaxLevels( HYPRE_Solver solver, HYPRE_Int max_levels ) { return ( hypre_AMGHybridSetMaxLevels( (void *) solver, max_levels ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRHybridSetMeasureType *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ParCSRHybridSetMeasureType( HYPRE_Solver solver, HYPRE_Int measure_type ) { return ( hypre_AMGHybridSetMeasureType( (void *) solver, measure_type ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRHybridSetCoarsenType *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ParCSRHybridSetCoarsenType( HYPRE_Solver solver, HYPRE_Int coarsen_type ) { return ( hypre_AMGHybridSetCoarsenType( (void *) solver, coarsen_type ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRHybridSetInterpType *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ParCSRHybridSetInterpType( HYPRE_Solver solver, HYPRE_Int interp_type ) { return ( hypre_AMGHybridSetInterpType( (void *) solver, interp_type ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRHybridSetCycleType *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ParCSRHybridSetCycleType( HYPRE_Solver solver, HYPRE_Int cycle_type ) { return ( hypre_AMGHybridSetCycleType( (void *) solver, cycle_type ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRHybridSetNumGridSweeps *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ParCSRHybridSetNumGridSweeps( HYPRE_Solver solver, HYPRE_Int *num_grid_sweeps ) { return ( hypre_AMGHybridSetNumGridSweeps( (void *) solver, num_grid_sweeps ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRHybridSetGridRelaxType *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ParCSRHybridSetGridRelaxType( HYPRE_Solver solver, HYPRE_Int *grid_relax_type ) { return ( hypre_AMGHybridSetGridRelaxType( (void *) solver, grid_relax_type ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRHybridSetGridRelaxPoints *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ParCSRHybridSetGridRelaxPoints( HYPRE_Solver solver, HYPRE_Int **grid_relax_points ) { return ( hypre_AMGHybridSetGridRelaxPoints( (void *) solver, grid_relax_points ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRHybridSetNumSweeps *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ParCSRHybridSetNumSweeps( HYPRE_Solver solver, HYPRE_Int num_sweeps ) { return ( hypre_AMGHybridSetNumSweeps( (void *) solver, num_sweeps ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRHybridSetCycleNumSweeps *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ParCSRHybridSetCycleNumSweeps( HYPRE_Solver solver, HYPRE_Int num_sweeps, HYPRE_Int k ) { return ( hypre_AMGHybridSetCycleNumSweeps( (void *) solver, num_sweeps, k ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRHybridSetRelaxType *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ParCSRHybridSetRelaxType( HYPRE_Solver solver, HYPRE_Int relax_type ) { return ( hypre_AMGHybridSetRelaxType( (void *) solver, relax_type ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRHybridSetCycleRelaxType *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ParCSRHybridSetCycleRelaxType( HYPRE_Solver solver, HYPRE_Int relax_type, HYPRE_Int k ) { return ( hypre_AMGHybridSetCycleRelaxType( (void *) solver, relax_type, k ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRHybridSetRelaxOrder *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ParCSRHybridSetRelaxOrder( HYPRE_Solver solver, HYPRE_Int relax_order ) { return ( hypre_AMGHybridSetRelaxOrder( (void *) solver, relax_order ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRHybridSetKeepTranspose *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ParCSRHybridSetKeepTranspose( HYPRE_Solver solver, HYPRE_Int keepT ) { return ( hypre_AMGHybridSetKeepTranspose( (void *) solver, keepT ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRHybridSetMaxCoarseSize *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ParCSRHybridSetMaxCoarseSize( HYPRE_Solver solver, HYPRE_Int max_coarse_size ) { return ( hypre_AMGHybridSetMaxCoarseSize( (void *) solver, max_coarse_size ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRHybridSetMinCoarseSize *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ParCSRHybridSetMinCoarseSize( HYPRE_Solver solver, HYPRE_Int min_coarse_size ) { return ( hypre_AMGHybridSetMinCoarseSize( (void *) solver, min_coarse_size ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRHybridSetSeqThreshold *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ParCSRHybridSetSeqThreshold( HYPRE_Solver solver, HYPRE_Int seq_threshold ) { return ( hypre_AMGHybridSetSeqThreshold( (void *) solver, seq_threshold ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRHybridSetRelaxWt *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ParCSRHybridSetRelaxWt( HYPRE_Solver solver, HYPRE_Real relax_wt ) { return ( hypre_AMGHybridSetRelaxWt( (void *) solver, relax_wt ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRHybridSetLevelRelaxWt *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ParCSRHybridSetLevelRelaxWt( HYPRE_Solver solver, HYPRE_Real relax_wt, HYPRE_Int level ) { return ( hypre_AMGHybridSetLevelRelaxWt( (void *) solver, relax_wt, level ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRHybridSetOuterWt *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ParCSRHybridSetOuterWt( HYPRE_Solver solver, HYPRE_Real outer_wt ) { return ( hypre_AMGHybridSetOuterWt( (void *) solver, outer_wt ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRHybridSetLevelOuterWt *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ParCSRHybridSetLevelOuterWt( HYPRE_Solver solver, HYPRE_Real outer_wt, HYPRE_Int level ) { return ( hypre_AMGHybridSetLevelOuterWt( (void *) solver, outer_wt, level ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRHybridSetRelaxWeight *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ParCSRHybridSetRelaxWeight( HYPRE_Solver solver, HYPRE_Real *relax_weight ) { return ( hypre_AMGHybridSetRelaxWeight( (void *) solver, relax_weight ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRHybridSetOmega *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ParCSRHybridSetOmega( HYPRE_Solver solver, HYPRE_Real *omega ) { return ( hypre_AMGHybridSetOmega( (void *) solver, omega ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRHybridSetAggNumLevels *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ParCSRHybridSetAggNumLevels( HYPRE_Solver solver, HYPRE_Int agg_num_levels ) { return ( hypre_AMGHybridSetAggNumLevels( (void *) solver, agg_num_levels ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRHybridSetAggInterpType *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ParCSRHybridSetAggInterpType( HYPRE_Solver solver, HYPRE_Int agg_interp_type ) { return ( hypre_AMGHybridSetAggInterpType( (void *) solver, agg_interp_type ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRHybridSetNumPaths *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ParCSRHybridSetNumPaths( HYPRE_Solver solver, HYPRE_Int num_paths ) { return ( hypre_AMGHybridSetNumPaths( (void *) solver, num_paths ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRHybridSetNumFunctions *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ParCSRHybridSetNumFunctions( HYPRE_Solver solver, HYPRE_Int num_functions ) { return ( hypre_AMGHybridSetNumFunctions( (void *) solver, num_functions ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRHybridSetNodal *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ParCSRHybridSetNodal( HYPRE_Solver solver, HYPRE_Int nodal ) { return ( hypre_AMGHybridSetNodal( (void *) solver, nodal ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRHybridSetDofFunc *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ParCSRHybridSetDofFunc( HYPRE_Solver solver, HYPRE_Int *dof_func ) { return ( hypre_AMGHybridSetDofFunc( (void *) solver, dof_func ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRHybridSetNonGalerkTol *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ParCSRHybridSetNonGalerkinTol( HYPRE_Solver solver, HYPRE_Int nongalerk_num_tol, HYPRE_Real *nongalerkin_tol) { return ( hypre_AMGHybridSetNonGalerkinTol( (void *) solver, nongalerk_num_tol, nongalerkin_tol ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRHybridGetNumIterations *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ParCSRHybridGetNumIterations( HYPRE_Solver solver, HYPRE_Int *num_its ) { return ( hypre_AMGHybridGetNumIterations( (void *) solver, num_its ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRHybridGetDSCGNumIterations *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ParCSRHybridGetDSCGNumIterations( HYPRE_Solver solver, HYPRE_Int *dscg_num_its ) { return ( hypre_AMGHybridGetDSCGNumIterations( (void *) solver, dscg_num_its ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRHybridGetPCGNumIterations *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ParCSRHybridGetPCGNumIterations( HYPRE_Solver solver, HYPRE_Int *pcg_num_its ) { return ( hypre_AMGHybridGetPCGNumIterations( (void *) solver, pcg_num_its ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRHybridGetFinalRelativeResidualNorm *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ParCSRHybridGetFinalRelativeResidualNorm( HYPRE_Solver solver, HYPRE_Real *norm ) { return ( hypre_AMGHybridGetFinalRelativeResidualNorm( (void *) solver, norm ) ); } HYPRE_Int HYPRE_ParCSRHybridGetSetupSolveTime( HYPRE_Solver solver, HYPRE_Real *time ) { return ( hypre_AMGHybridGetSetupSolveTime( (void *) solver, time ) ); } hypre-2.33.0/src/parcsr_ls/HYPRE_parcsr_ilu.c000066400000000000000000000225631477326011500210010ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "_hypre_parcsr_ls.h" /*-------------------------------------------------------------------------- * HYPRE_ILUCreate *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ILUCreate( HYPRE_Solver *solver ) { if (!solver) { hypre_error_in_arg(2); return hypre_error_flag; } *solver = ( (HYPRE_Solver) hypre_ILUCreate( ) ); return hypre_error_flag; } /*-------------------------------------------------------------------------- * HYPRE_ILUDestroy *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ILUDestroy( HYPRE_Solver solver ) { return ( hypre_ILUDestroy( (void *) solver ) ); } /*-------------------------------------------------------------------------- * HYPRE_ILUSetup *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ILUSetup( HYPRE_Solver solver, HYPRE_ParCSRMatrix A, HYPRE_ParVector b, HYPRE_ParVector x ) { return ( hypre_ILUSetup( (void *) solver, (hypre_ParCSRMatrix *) A, (hypre_ParVector *) b, (hypre_ParVector *) x ) ); } /*-------------------------------------------------------------------------- * HYPRE_ILUSolve *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ILUSolve( HYPRE_Solver solver, HYPRE_ParCSRMatrix A, HYPRE_ParVector b, HYPRE_ParVector x ) { return ( hypre_ILUSolve( (void *) solver, (hypre_ParCSRMatrix *) A, (hypre_ParVector *) b, (hypre_ParVector *) x ) ); } /*-------------------------------------------------------------------------- * HYPRE_ILUSetPrintLevel *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ILUSetPrintLevel( HYPRE_Solver solver, HYPRE_Int print_level ) { return hypre_ILUSetPrintLevel( solver, print_level ); } /*-------------------------------------------------------------------------- * HYPRE_ILUSetLogging *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ILUSetLogging( HYPRE_Solver solver, HYPRE_Int logging ) { return hypre_ILUSetLogging(solver, logging ); } /*-------------------------------------------------------------------------- * HYPRE_ILUSetMaxIter *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ILUSetMaxIter( HYPRE_Solver solver, HYPRE_Int max_iter ) { return hypre_ILUSetMaxIter( solver, max_iter ); } /*-------------------------------------------------------------------------- * HYPRE_ILUSetIterativeSetupType *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ILUSetIterativeSetupType( HYPRE_Solver solver, HYPRE_Int iter_setup_type ) { return hypre_ILUSetIterativeSetupType( solver, iter_setup_type ); } /*-------------------------------------------------------------------------- * HYPRE_ILUSetIterativeSetupOption *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ILUSetIterativeSetupOption( HYPRE_Solver solver, HYPRE_Int iter_setup_option ) { return hypre_ILUSetIterativeSetupOption( solver, iter_setup_option ); } /*-------------------------------------------------------------------------- * HYPRE_ILUSetIterativeSetupMaxIter *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ILUSetIterativeSetupMaxIter( HYPRE_Solver solver, HYPRE_Int iter_setup_max_iter ) { return hypre_ILUSetIterativeSetupMaxIter( solver, iter_setup_max_iter ); } /*-------------------------------------------------------------------------- * HYPRE_ILUSetIterativeSetupTolerance *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ILUSetIterativeSetupTolerance( HYPRE_Solver solver, HYPRE_Real iter_setup_tolerance ) { return hypre_ILUSetIterativeSetupTolerance( solver, iter_setup_tolerance ); } /*-------------------------------------------------------------------------- * HYPRE_ILUSetTriSolve *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ILUSetTriSolve( HYPRE_Solver solver, HYPRE_Int tri_solve ) { return hypre_ILUSetTriSolve( solver, tri_solve ); } /*-------------------------------------------------------------------------- * HYPRE_ILUSetLowerJacobiIters *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ILUSetLowerJacobiIters( HYPRE_Solver solver, HYPRE_Int lower_jacobi_iters ) { return hypre_ILUSetLowerJacobiIters( solver, lower_jacobi_iters ); } /*-------------------------------------------------------------------------- * HYPRE_ILUSetUpperJacobiIters *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ILUSetUpperJacobiIters( HYPRE_Solver solver, HYPRE_Int upper_jacobi_iters ) { return hypre_ILUSetUpperJacobiIters( solver, upper_jacobi_iters ); } /*-------------------------------------------------------------------------- * HYPRE_ILUSetTol *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ILUSetTol( HYPRE_Solver solver, HYPRE_Real tol ) { return hypre_ILUSetTol( solver, tol ); } /*-------------------------------------------------------------------------- * HYPRE_ILUSetDropThreshold *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ILUSetDropThreshold( HYPRE_Solver solver, HYPRE_Real threshold ) { return hypre_ILUSetDropThreshold( solver, threshold ); } /*-------------------------------------------------------------------------- * HYPRE_ILUSetDropThresholdArray *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ILUSetDropThresholdArray( HYPRE_Solver solver, HYPRE_Real *threshold ) { return hypre_ILUSetDropThresholdArray( solver, threshold ); } /*-------------------------------------------------------------------------- * HYPRE_ILUSetNSHDropThreshold *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ILUSetNSHDropThreshold( HYPRE_Solver solver, HYPRE_Real threshold ) { return hypre_ILUSetSchurNSHDropThreshold( solver, threshold ); } /*-------------------------------------------------------------------------- * HYPRE_ILUSetNSHDropThresholdArray *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ILUSetNSHDropThresholdArray( HYPRE_Solver solver, HYPRE_Real *threshold ) { return hypre_ILUSetSchurNSHDropThresholdArray( solver, threshold ); } /*-------------------------------------------------------------------------- * HYPRE_ILUSetSchurMaxIter *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ILUSetSchurMaxIter( HYPRE_Solver solver, HYPRE_Int ss_max_iter ) { return hypre_ILUSetSchurSolverMaxIter( solver, ss_max_iter ); } /*-------------------------------------------------------------------------- * HYPRE_ILUSetMaxNnzPerRow *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ILUSetMaxNnzPerRow( HYPRE_Solver solver, HYPRE_Int nzmax ) { return hypre_ILUSetMaxNnzPerRow( solver, nzmax ); } /*-------------------------------------------------------------------------- * HYPRE_ILUSetLevelOfFill *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ILUSetLevelOfFill( HYPRE_Solver solver, HYPRE_Int lfil ) { return hypre_ILUSetLevelOfFill( solver, lfil ); } /*-------------------------------------------------------------------------- * HYPRE_ILUSetType *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ILUSetType( HYPRE_Solver solver, HYPRE_Int ilu_type ) { return hypre_ILUSetType( solver, ilu_type ); } /*-------------------------------------------------------------------------- * HYPRE_ILUSetLocalReordering *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ILUSetLocalReordering( HYPRE_Solver solver, HYPRE_Int ordering_type ) { return hypre_ILUSetLocalReordering(solver, ordering_type); } /*-------------------------------------------------------------------------- * HYPRE_ILUGetNumIterations *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ILUGetNumIterations( HYPRE_Solver solver, HYPRE_Int *num_iterations ) { return hypre_ILUGetNumIterations( solver, num_iterations ); } /*-------------------------------------------------------------------------- * HYPRE_ILUGetFinalRelativeResidualNorm *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ILUGetFinalRelativeResidualNorm( HYPRE_Solver solver, HYPRE_Real *res_norm ) { return hypre_ILUGetFinalRelativeResidualNorm(solver, res_norm); } hypre-2.33.0/src/parcsr_ls/HYPRE_parcsr_int.c000066400000000000000000000117351477326011500210010ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "_hypre_parcsr_ls.h" #include "interpreter.h" #include "HYPRE_MatvecFunctions.h" #include "temp_multivector.h" HYPRE_Int hypre_ParSetRandomValues( void* v, HYPRE_Int seed ) { HYPRE_ParVectorSetRandomValues( (HYPRE_ParVector)v, seed ); return 0; } HYPRE_Int hypre_ParPrintVector( void* v, const char* file ) { return hypre_ParVectorPrint( (hypre_ParVector*)v, file ); } void* hypre_ParReadVector( MPI_Comm comm, const char* file ) { return (void*)hypre_ParVectorRead( comm, file ); } HYPRE_Int hypre_ParVectorSize(void * x) { HYPRE_UNUSED_VAR(x); return 0; } HYPRE_Int HYPRE_ParCSRMultiVectorPrint( void* x_, const char* fileName ) { HYPRE_Int i, ierr; mv_TempMultiVector* x; char fullName[128]; x = (mv_TempMultiVector*)x_; hypre_assert( x != NULL ); ierr = 0; for ( i = 0; i < x->numVectors; i++ ) { hypre_sprintf( fullName, "%s.%d", fileName, i ); ierr = ierr || hypre_ParPrintVector( x->vector[i], fullName ); } return ierr; } void* HYPRE_ParCSRMultiVectorRead( MPI_Comm comm, void* ii_, const char* fileName ) { HYPRE_Int i, n, id; FILE* fp; char fullName[128]; mv_TempMultiVector* x; mv_InterfaceInterpreter* ii = (mv_InterfaceInterpreter*)ii_; hypre_MPI_Comm_rank( comm, &id ); n = 0; do { hypre_sprintf( fullName, "%s.%d.%d", fileName, n, id ); if ( (fp = fopen(fullName, "r")) ) { n++; fclose( fp ); } } while ( fp ); if ( n == 0 ) { return NULL; } x = hypre_TAlloc(mv_TempMultiVector, 1, HYPRE_MEMORY_HOST); hypre_assert( x != NULL ); x->interpreter = ii; x->numVectors = n; x->vector = hypre_CTAlloc(void*, n, HYPRE_MEMORY_HOST); hypre_assert( x->vector != NULL ); x->ownsVectors = 1; for ( i = 0; i < n; i++ ) { hypre_sprintf( fullName, "%s.%d", fileName, i ); x->vector[i] = hypre_ParReadVector( comm, fullName ); } x->mask = NULL; x->ownsMask = 0; return x; } HYPRE_Int aux_maskCount( HYPRE_Int n, HYPRE_Int* mask ) { HYPRE_Int i, m; if ( mask == NULL ) { return n; } for ( i = m = 0; i < n; i++ ) if ( mask[i] ) { m++; } return m; } void aux_indexFromMask( HYPRE_Int n, HYPRE_Int* mask, HYPRE_Int* index ) { HYPRE_Int i, j; if ( mask != NULL ) { for ( i = 0, j = 0; i < n; i++ ) if ( mask[i] ) { index[j++] = i + 1; } } else for ( i = 0; i < n; i++ ) { index[i] = i + 1; } } /* The function below is a temporary one that fills the multivector part of the HYPRE_InterfaceInterpreter structure with pointers that come from the temporary implementation of the multivector (cf. temp_multivector.h). It must be eventually replaced with a function that provides the respective pointers to properly implemented parcsr multivector functions */ HYPRE_Int HYPRE_TempParCSRSetupInterpreter( mv_InterfaceInterpreter *i ) { /* Vector part */ i->CreateVector = hypre_ParKrylovCreateVector; i->DestroyVector = hypre_ParKrylovDestroyVector; i->InnerProd = hypre_ParKrylovInnerProd; i->CopyVector = hypre_ParKrylovCopyVector; i->ClearVector = hypre_ParKrylovClearVector; i->SetRandomValues = hypre_ParSetRandomValues; i->ScaleVector = hypre_ParKrylovScaleVector; i->Axpy = hypre_ParKrylovAxpy; /* Multivector part */ i->CreateMultiVector = mv_TempMultiVectorCreateFromSampleVector; i->CopyCreateMultiVector = mv_TempMultiVectorCreateCopy; i->DestroyMultiVector = mv_TempMultiVectorDestroy; i->Width = mv_TempMultiVectorWidth; i->Height = mv_TempMultiVectorHeight; i->SetMask = mv_TempMultiVectorSetMask; i->CopyMultiVector = mv_TempMultiVectorCopy; i->ClearMultiVector = mv_TempMultiVectorClear; i->SetRandomVectors = mv_TempMultiVectorSetRandom; i->MultiInnerProd = mv_TempMultiVectorByMultiVector; i->MultiInnerProdDiag = mv_TempMultiVectorByMultiVectorDiag; i->MultiVecMat = mv_TempMultiVectorByMatrix; i->MultiVecMatDiag = mv_TempMultiVectorByDiagonal; i->MultiAxpy = mv_TempMultiVectorAxpy; i->MultiXapy = mv_TempMultiVectorXapy; i->Eval = mv_TempMultiVectorEval; return 0; } HYPRE_Int HYPRE_ParCSRSetupInterpreter( mv_InterfaceInterpreter *i ) { return HYPRE_TempParCSRSetupInterpreter( i ); } HYPRE_Int HYPRE_ParCSRSetupMatvec(HYPRE_MatvecFunctions * mv) { mv->MatvecCreate = hypre_ParKrylovMatvecCreate; mv->Matvec = hypre_ParKrylovMatvec; mv->MatvecDestroy = hypre_ParKrylovMatvecDestroy; mv->MatMultiVecCreate = NULL; mv->MatMultiVec = NULL; mv->MatMultiVecDestroy = NULL; return 0; } hypre-2.33.0/src/parcsr_ls/HYPRE_parcsr_lgmres.c000066400000000000000000000200541477326011500214720ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "_hypre_parcsr_ls.h" /*-------------------------------------------------------------------------- * HYPRE_ParCSRLGMRESCreate *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ParCSRLGMRESCreate( MPI_Comm comm, HYPRE_Solver *solver ) { HYPRE_UNUSED_VAR(comm); hypre_LGMRESFunctions *lgmres_functions; if (!solver) { hypre_error_in_arg(2); return hypre_error_flag; } lgmres_functions = hypre_LGMRESFunctionsCreate( hypre_ParKrylovCAlloc, hypre_ParKrylovFree, hypre_ParKrylovCommInfo, hypre_ParKrylovCreateVector, hypre_ParKrylovCreateVectorArray, hypre_ParKrylovDestroyVector, hypre_ParKrylovMatvecCreate, hypre_ParKrylovMatvec, hypre_ParKrylovMatvecDestroy, hypre_ParKrylovInnerProd, hypre_ParKrylovCopyVector, hypre_ParKrylovClearVector, hypre_ParKrylovScaleVector, hypre_ParKrylovAxpy, hypre_ParKrylovIdentitySetup, hypre_ParKrylovIdentity ); *solver = ( (HYPRE_Solver) hypre_LGMRESCreate( lgmres_functions ) ); return hypre_error_flag; } /*-------------------------------------------------------------------------- * HYPRE_ParCSRLGMRESDestroy *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ParCSRLGMRESDestroy( HYPRE_Solver solver ) { return ( hypre_LGMRESDestroy( (void *) solver ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRLGMRESSetup *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ParCSRLGMRESSetup( HYPRE_Solver solver, HYPRE_ParCSRMatrix A, HYPRE_ParVector b, HYPRE_ParVector x ) { return ( HYPRE_LGMRESSetup( solver, (HYPRE_Matrix) A, (HYPRE_Vector) b, (HYPRE_Vector) x ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRLGMRESSolve *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ParCSRLGMRESSolve( HYPRE_Solver solver, HYPRE_ParCSRMatrix A, HYPRE_ParVector b, HYPRE_ParVector x ) { return ( HYPRE_LGMRESSolve( solver, (HYPRE_Matrix) A, (HYPRE_Vector) b, (HYPRE_Vector) x ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRLGMRESSetKDim *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ParCSRLGMRESSetKDim( HYPRE_Solver solver, HYPRE_Int k_dim ) { return ( HYPRE_LGMRESSetKDim( solver, k_dim ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRLGMRESSetAugDim *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ParCSRLGMRESSetAugDim( HYPRE_Solver solver, HYPRE_Int aug_dim ) { return ( HYPRE_LGMRESSetAugDim( solver, aug_dim ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRLGMRESSetTol *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ParCSRLGMRESSetTol( HYPRE_Solver solver, HYPRE_Real tol ) { return ( HYPRE_LGMRESSetTol( solver, tol ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRLGMRESSetAbsoluteTol *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ParCSRLGMRESSetAbsoluteTol( HYPRE_Solver solver, HYPRE_Real a_tol ) { return ( HYPRE_LGMRESSetAbsoluteTol( solver, a_tol ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRLGMRESSetMinIter *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ParCSRLGMRESSetMinIter( HYPRE_Solver solver, HYPRE_Int min_iter ) { return ( HYPRE_LGMRESSetMinIter( solver, min_iter ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRLGMRESSetMaxIter *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ParCSRLGMRESSetMaxIter( HYPRE_Solver solver, HYPRE_Int max_iter ) { return ( HYPRE_LGMRESSetMaxIter( solver, max_iter ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRLGMRESSetPrecond *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ParCSRLGMRESSetPrecond( HYPRE_Solver solver, HYPRE_PtrToParSolverFcn precond, HYPRE_PtrToParSolverFcn precond_setup, HYPRE_Solver precond_solver ) { return ( HYPRE_LGMRESSetPrecond( solver, (HYPRE_PtrToSolverFcn) precond, (HYPRE_PtrToSolverFcn) precond_setup, precond_solver ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRLGMRESGetPrecond *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ParCSRLGMRESGetPrecond( HYPRE_Solver solver, HYPRE_Solver *precond_data_ptr ) { return ( HYPRE_LGMRESGetPrecond( solver, precond_data_ptr ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRLGMRESSetLogging *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ParCSRLGMRESSetLogging( HYPRE_Solver solver, HYPRE_Int logging) { return ( HYPRE_LGMRESSetLogging( solver, logging ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRLGMRESSetPrintLevel *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ParCSRLGMRESSetPrintLevel( HYPRE_Solver solver, HYPRE_Int print_level) { return ( HYPRE_LGMRESSetPrintLevel( solver, print_level ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRLGMRESGetNumIterations *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ParCSRLGMRESGetNumIterations( HYPRE_Solver solver, HYPRE_Int *num_iterations ) { return ( HYPRE_LGMRESGetNumIterations( solver, num_iterations ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRLGMRESGetFinalRelativeResidualNorm *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ParCSRLGMRESGetFinalRelativeResidualNorm( HYPRE_Solver solver, HYPRE_Real *norm ) { return ( HYPRE_LGMRESGetFinalRelativeResidualNorm( solver, norm ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRLGMRESGetResidual *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ParCSRLGMRESGetResidual( HYPRE_Solver solver, HYPRE_ParVector *residual) { return ( HYPRE_LGMRESGetResidual( solver, (void *) residual ) ); } hypre-2.33.0/src/parcsr_ls/HYPRE_parcsr_ls.h000066400000000000000000005654541477326011500206460ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #ifndef HYPRE_PARCSR_LS_HEADER #define HYPRE_PARCSR_LS_HEADER #include "HYPRE_utilities.h" #include "HYPRE_seq_mv.h" #include "HYPRE_parcsr_mv.h" #include "HYPRE_IJ_mv.h" #include "HYPRE_lobpcg.h" #ifdef __cplusplus extern "C" { #endif /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ /** * @defgroup ParCSRSolvers ParCSR Solvers * * Linear solvers for sparse matrix systems. These solvers use matrix/vector * storage schemes that are taylored for general sparse matrix systems. * * @{ **/ /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ /** * @name ParCSR Solvers * * @{ **/ /** * The solver object. **/ typedef HYPRE_Int (*HYPRE_PtrToParSolverFcn)(HYPRE_Solver, HYPRE_ParCSRMatrix, HYPRE_ParVector, HYPRE_ParVector); #ifndef HYPRE_MODIFYPC #define HYPRE_MODIFYPC typedef HYPRE_Int (*HYPRE_PtrToModifyPCFcn)(HYPRE_Solver, HYPRE_Int, HYPRE_Real); #endif /**@}*/ /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ /** * @name ParCSR BoomerAMG Solver and Preconditioner * * Parallel unstructured algebraic multigrid solver and preconditioner * * @{ **/ /** * Create a solver object. **/ HYPRE_Int HYPRE_BoomerAMGCreate(HYPRE_Solver *solver); /** * Destroy a solver object. **/ HYPRE_Int HYPRE_BoomerAMGDestroy(HYPRE_Solver solver); /** * Set up the BoomerAMG solver or preconditioner. * If used as a preconditioner, this function should be passed * to the iterative solver \e SetPrecond function. * * @param solver [IN] object to be set up. * @param A [IN] ParCSR matrix used to construct the solver/preconditioner. * @param b Ignored by this function. * @param x Ignored by this function. **/ HYPRE_Int HYPRE_BoomerAMGSetup(HYPRE_Solver solver, HYPRE_ParCSRMatrix A, HYPRE_ParVector b, HYPRE_ParVector x); /** * Solve the system or apply AMG as a preconditioner. * If used as a preconditioner, this function should be passed * to the iterative solver \e SetPrecond function. * * @param solver [IN] solver or preconditioner object to be applied. * @param A [IN] ParCSR matrix, matrix of the linear system to be solved * @param b [IN] right hand side of the linear system to be solved * @param x [OUT] approximated solution of the linear system to be solved **/ HYPRE_Int HYPRE_BoomerAMGSolve(HYPRE_Solver solver, HYPRE_ParCSRMatrix A, HYPRE_ParVector b, HYPRE_ParVector x); /** * Solve the transpose system \f$A^T x = b\f$ or apply AMG as a preconditioner * to the transpose system . Note that this function should only be used * when preconditioning CGNR with BoomerAMG. It can only be used with * Jacobi smoothing (relax_type 0 or 7) and without CF smoothing, * i.e relax_order needs to be set to 0. * If used as a preconditioner, this function should be passed * to the iterative solver \e SetPrecond function. * * @param solver [IN] solver or preconditioner object to be applied. * @param A [IN] ParCSR matrix * @param b [IN] right hand side of the linear system to be solved * @param x [OUT] approximated solution of the linear system to be solved **/ HYPRE_Int HYPRE_BoomerAMGSolveT(HYPRE_Solver solver, HYPRE_ParCSRMatrix A, HYPRE_ParVector b, HYPRE_ParVector x); /** * Recovers old default for coarsening and interpolation, i.e Falgout * coarsening and untruncated modified classical interpolation. * This option might be preferred for 2 dimensional problems. **/ HYPRE_Int HYPRE_BoomerAMGSetOldDefault(HYPRE_Solver solver); /** * Returns the residual. **/ HYPRE_Int HYPRE_BoomerAMGGetResidual(HYPRE_Solver solver, HYPRE_ParVector *residual); /** * Returns the number of iterations taken. **/ HYPRE_Int HYPRE_BoomerAMGGetNumIterations(HYPRE_Solver solver, HYPRE_Int *num_iterations); /** * Returns cumulative num of nonzeros for A and P operators **/ HYPRE_Int HYPRE_BoomerAMGGetCumNnzAP(HYPRE_Solver solver, HYPRE_Real *cum_nnz_AP); /** * Activates cumulative num of nonzeros for A and P operators. * Needs to be set to a positive number for activation. **/ HYPRE_Int HYPRE_BoomerAMGSetCumNnzAP(HYPRE_Solver solver, HYPRE_Real cum_nnz_AP); /** * Returns the norm of the final relative residual. **/ HYPRE_Int HYPRE_BoomerAMGGetFinalRelativeResidualNorm(HYPRE_Solver solver, HYPRE_Real *rel_resid_norm); /** * (Optional) Sets the size of the system of PDEs, if using the systems version. * The default is 1, i.e. a scalar system. **/ HYPRE_Int HYPRE_BoomerAMGSetNumFunctions(HYPRE_Solver solver, HYPRE_Int num_functions); /** * (Optional) Sets filtering for system of PDEs (\e num_functions > 1). * * \param filter_functions An integer flag to enable or disable filtering of inter-variable * connections in the input matrix used for preconditioning. * - A value of 0 (default) indicates no filtering, preserving all inter-variable connections. * - A value of 1 enables filtering, removing inter-variable connections to lower * operator and memory complexities. * * @note This option assumes that variables are stored in an interleaved format, * where multiple variables are combined in a single vector. Enabling filtering * can be beneficial when the problem has multiple coupled variables (functions) * that are not strongly coupled. **/ HYPRE_Int HYPRE_BoomerAMGSetFilterFunctions(HYPRE_Solver solver, HYPRE_Int filter_functions); /** * (Optional) Sets the mapping that assigns the function to each variable, * if using the systems version. If no assignment is made and the number of * functions is k > 1, the mapping generated is (0,1,...,k-1,0,1,...,k-1,...). **/ HYPRE_Int HYPRE_BoomerAMGSetDofFunc(HYPRE_Solver solver, HYPRE_Int *dof_func); /** * (Optional) Set the type convergence checking * 0: (default) norm(r)/norm(b), or norm(r) when b == 0 * 1: nomr(r) / norm(r_0) **/ HYPRE_Int HYPRE_BoomerAMGSetConvergeType(HYPRE_Solver solver, HYPRE_Int type); /** * (Optional) Set the convergence tolerance, if BoomerAMG is used * as a solver. If it is used as a preconditioner, it should be set to 0. * The default is 1.e-6. **/ HYPRE_Int HYPRE_BoomerAMGSetTol(HYPRE_Solver solver, HYPRE_Real tol); /** * (Optional) Sets maximum number of iterations, if BoomerAMG is used * as a solver. If it is used as a preconditioner, it should be set to 1. * The default is 20. **/ HYPRE_Int HYPRE_BoomerAMGSetMaxIter(HYPRE_Solver solver, HYPRE_Int max_iter); /** * (Optional) **/ HYPRE_Int HYPRE_BoomerAMGSetMinIter(HYPRE_Solver solver, HYPRE_Int min_iter); /** * (Optional) Sets maximum size of coarsest grid. * The default is 9. **/ HYPRE_Int HYPRE_BoomerAMGSetMaxCoarseSize(HYPRE_Solver solver, HYPRE_Int max_coarse_size); /** * (Optional) Sets minimum size of coarsest grid. * The default is 1. **/ HYPRE_Int HYPRE_BoomerAMGSetMinCoarseSize(HYPRE_Solver solver, HYPRE_Int min_coarse_size); /** * (Optional) Sets maximum number of multigrid levels. * The default is 25. **/ HYPRE_Int HYPRE_BoomerAMGSetMaxLevels(HYPRE_Solver solver, HYPRE_Int max_levels); /** * (Optional) Sets cut factor for choosing isolated points * during coarsening according to the rows' density. The default is 0. * If nnzrow > coarsen_cut_factor*avg_nnzrow, where avg_nnzrow is the * average number of nonzeros per row of the global matrix, holds for * a given row, it is set as fine, and interpolation weights are not computed. **/ HYPRE_Int HYPRE_BoomerAMGSetCoarsenCutFactor(HYPRE_Solver solver, HYPRE_Int coarsen_cut_factor); /** * (Optional) Sets AMG strength threshold. The default is 0.25. * For 2D Laplace operators, 0.25 is a good value, for 3D Laplace * operators, 0.5 or 0.6 is a better value. For elasticity problems, * a large strength threshold, such as 0.9, is often better. **/ HYPRE_Int HYPRE_BoomerAMGSetStrongThreshold(HYPRE_Solver solver, HYPRE_Real strong_threshold); /** * (Optional) The strong threshold for R is strong connections used * in building an approximate ideal restriction. * Default value is 0.25. **/ HYPRE_Int HYPRE_BoomerAMGSetStrongThresholdR(HYPRE_Solver solver, HYPRE_Real strong_threshold); /** * (Optional) The filter threshold for R is used to eliminate small entries * of the approximate ideal restriction after building it. * Default value is 0.0, which disables filtering. **/ HYPRE_Int HYPRE_BoomerAMGSetFilterThresholdR(HYPRE_Solver solver, HYPRE_Real filter_threshold); /** * (Optional) Deprecated. This routine now has no effect. **/ HYPRE_Int HYPRE_BoomerAMGSetSCommPkgSwitch(HYPRE_Solver solver, HYPRE_Real S_commpkg_switch); /** * (Optional) Sets a parameter to modify the definition of strength for * diagonal dominant portions of the matrix. The default is 0.9. * If \e max_row_sum is 1, no checking for diagonally dominant rows is * performed. **/ HYPRE_Int HYPRE_BoomerAMGSetMaxRowSum(HYPRE_Solver solver, HYPRE_Real max_row_sum); /** * (Optional) Defines which parallel coarsening algorithm is used. * There are the following options for \e coarsen_type: * * - 0 : CLJP-coarsening (a parallel coarsening algorithm using independent sets. * - 1 : classical Ruge-Stueben coarsening on each processor, no boundary treatment (not recommended!) * - 3 : classical Ruge-Stueben coarsening on each processor, followed by a third pass, which adds coarse points on the boundaries * - 6 : Falgout coarsening (uses 1 first, followed by CLJP using the interior coarse points * generated by 1 as its first independent set) * - 7 : CLJP-coarsening (using a fixed random vector, for debugging purposes only) * - 8 : PMIS-coarsening (a parallel coarsening algorithm using independent sets, generating * lower complexities than CLJP, might also lead to slower convergence) * - 9 : PMIS-coarsening (using a fixed random vector, for debugging purposes only) * - 10 : HMIS-coarsening (uses one pass Ruge-Stueben on each processor independently, followed * by PMIS using the interior C-points generated as its first independent set) * - 11 : one-pass Ruge-Stueben coarsening on each processor, no boundary treatment (not recommended!) * - 21 : CGC coarsening by M. Griebel, B. Metsch and A. Schweitzer * - 22 : CGC-E coarsening by M. Griebel, B. Metsch and A.Schweitzer * * The default is 10. **/ HYPRE_Int HYPRE_BoomerAMGSetCoarsenType(HYPRE_Solver solver, HYPRE_Int coarsen_type); /** * (Optional) Defines the non-Galerkin drop-tolerance * for sparsifying coarse grid operators and thus reducing communication. * Value specified here is set on all levels. * This routine should be used before HYPRE_BoomerAMGSetLevelNonGalerkinTol, which * then can be used to change individual levels if desired **/ HYPRE_Int HYPRE_BoomerAMGSetNonGalerkinTol (HYPRE_Solver solver, HYPRE_Real nongalerkin_tol); /** * (Optional) Defines the level specific non-Galerkin drop-tolerances * for sparsifying coarse grid operators and thus reducing communication. * A drop-tolerance of 0.0 means to skip doing non-Galerkin on that * level. The maximum drop tolerance for a level is 1.0, although * much smaller values such as 0.03 or 0.01 are recommended. * * Note that if the user wants to set a specific tolerance on all levels, * HYPRE_BooemrAMGSetNonGalerkinTol should be used. Individual levels * can then be changed using this routine. * * In general, it is safer to drop more aggressively on coarser levels. * For instance, one could use 0.0 on the finest level, 0.01 on the second level and * then using 0.05 on all remaining levels. The best way to achieve this is * to set 0.05 on all levels with HYPRE_BoomerAMGSetNonGalerkinTol and then * change the tolerance on level 0 to 0.0 and the tolerance on level 1 to 0.01 * with HYPRE_BoomerAMGSetLevelNonGalerkinTol. * Like many AMG parameters, these drop tolerances can be tuned. It is also common * to delay the start of the non-Galerkin process further to a later level than * level 1. * * @param solver [IN] solver or preconditioner object to be applied. * @param nongalerkin_tol [IN] level specific drop tolerance * @param level [IN] level on which drop tolerance is used **/ HYPRE_Int HYPRE_BoomerAMGSetLevelNonGalerkinTol (HYPRE_Solver solver, HYPRE_Real nongalerkin_tol, HYPRE_Int level); /** * (Optional) Defines the non-Galerkin drop-tolerance (old version) **/ HYPRE_Int HYPRE_BoomerAMGSetNonGalerkTol (HYPRE_Solver solver, HYPRE_Int nongalerk_num_tol, HYPRE_Real *nongalerk_tol); /** * (Optional) Defines whether local or global measures are used. **/ HYPRE_Int HYPRE_BoomerAMGSetMeasureType(HYPRE_Solver solver, HYPRE_Int measure_type); /** * (Optional) Defines the number of levels of aggressive coarsening. * The default is 0, i.e. no aggressive coarsening. **/ HYPRE_Int HYPRE_BoomerAMGSetAggNumLevels(HYPRE_Solver solver, HYPRE_Int agg_num_levels); /** * (Optional) Defines the degree of aggressive coarsening. * The default is 1. Larger numbers lead to less aggressive * coarsening. **/ HYPRE_Int HYPRE_BoomerAMGSetNumPaths(HYPRE_Solver solver, HYPRE_Int num_paths); /** * (optional) Defines the number of pathes for CGC-coarsening. **/ HYPRE_Int HYPRE_BoomerAMGSetCGCIts (HYPRE_Solver solver, HYPRE_Int its); /** * (Optional) Sets whether to use the nodal systems coarsening. * Should be used for linear systems generated from systems of PDEs. * The default is 0 (unknown-based coarsening, * only coarsens within same function). * For the remaining options a nodal matrix is generated by * applying a norm to the nodal blocks and applying the coarsening * algorithm to this matrix. * - 1 : Frobenius norm * - 2 : sum of absolute values of elements in each block * - 3 : largest element in each block (not absolute value) * - 4 : row-sum norm * - 6 : sum of all values in each block **/ HYPRE_Int HYPRE_BoomerAMGSetNodal(HYPRE_Solver solver, HYPRE_Int nodal); /** * (Optional) Sets whether to give special treatment to diagonal elements in * the nodal systems version. * The default is 0. * If set to 1, the diagonal entry is set to the negative sum of all off * diagonal entries. * If set to 2, the signs of all diagonal entries are inverted. */ HYPRE_Int HYPRE_BoomerAMGSetNodalDiag(HYPRE_Solver solver, HYPRE_Int nodal_diag); /* * (Optional) Sets whether to keep same sign in S for nodal > 0 * The default is 0, i.e., discard those elements. */ HYPRE_Int HYPRE_BoomerAMGSetKeepSameSign(HYPRE_Solver solver, HYPRE_Int keep_same_sign); /** * (Optional) Defines which parallel interpolation operator is used. * There are the following options for \e interp_type: * * - 0 : classical modified interpolation * - 1 : LS interpolation (for use with GSMG) * - 2 : classical modified interpolation for hyperbolic PDEs * - 3 : direct interpolation (with separation of weights) (also for GPU use) * - 4 : multipass interpolation * - 5 : multipass interpolation (with separation of weights) * - 6 : extended+i interpolation (also for GPU use) * - 7 : extended+i (if no common C neighbor) interpolation * - 8 : standard interpolation * - 9 : standard interpolation (with separation of weights) * - 10 : classical block interpolation (for use with nodal systems version only) * - 11 : classical block interpolation (for use with nodal systems version only) * with diagonalized diagonal blocks * - 12 : FF interpolation * - 13 : FF1 interpolation * - 14 : extended interpolation (also for GPU use) * - 15 : interpolation with adaptive weights (GPU use only) * - 16 : extended interpolation in matrix-matrix form * - 17 : extended+i interpolation in matrix-matrix form * - 18 : extended+e interpolation in matrix-matrix form * * The default is ext+i interpolation (interp_type 6) trunctated to at most 4 * elements per row. (see HYPRE_BoomerAMGSetPMaxElmts). **/ HYPRE_Int HYPRE_BoomerAMGSetInterpType(HYPRE_Solver solver, HYPRE_Int interp_type); /** * (Optional) Defines a truncation factor for the interpolation. The default is 0. **/ HYPRE_Int HYPRE_BoomerAMGSetTruncFactor(HYPRE_Solver solver, HYPRE_Real trunc_factor); /** * (Optional) Defines the maximal number of elements per row for the interpolation. * The default is 4. To turn off truncation, it needs to be set to 0. **/ HYPRE_Int HYPRE_BoomerAMGSetPMaxElmts(HYPRE_Solver solver, HYPRE_Int P_max_elmts); /** * (Optional) Defines whether separation of weights is used * when defining strength for standard interpolation or * multipass interpolation. * Default: 0, i.e. no separation of weights used. **/ HYPRE_Int HYPRE_BoomerAMGSetSepWeight(HYPRE_Solver solver, HYPRE_Int sep_weight); /** * (Optional) Defines the interpolation used on levels of aggressive coarsening * The default is 4, i.e. multipass interpolation. * The following options exist: * * - 1 : 2-stage extended+i interpolation * - 2 : 2-stage standard interpolation * - 3 : 2-stage extended interpolation * - 4 : multipass interpolation * - 5 : 2-stage extended interpolation in matrix-matrix form * - 6 : 2-stage extended+i interpolation in matrix-matrix form * - 7 : 2-stage extended+e interpolation in matrix-matrix form **/ HYPRE_Int HYPRE_BoomerAMGSetAggInterpType(HYPRE_Solver solver, HYPRE_Int agg_interp_type); /** * (Optional) Defines the truncation factor for the * interpolation used for aggressive coarsening. * The default is 0. **/ HYPRE_Int HYPRE_BoomerAMGSetAggTruncFactor(HYPRE_Solver solver, HYPRE_Real agg_trunc_factor); /** * (Optional) Defines the truncation factor for the * matrices P1 and P2 which are used to build 2-stage interpolation. * The default is 0. **/ HYPRE_Int HYPRE_BoomerAMGSetAggP12TruncFactor(HYPRE_Solver solver, HYPRE_Real agg_P12_trunc_factor); /** * (Optional) Defines the maximal number of elements per row for the * interpolation used for aggressive coarsening. * The default is 0. **/ HYPRE_Int HYPRE_BoomerAMGSetAggPMaxElmts(HYPRE_Solver solver, HYPRE_Int agg_P_max_elmts); /** * (Optional) Defines the maximal number of elements per row for the * matrices P1 and P2 which are used to build 2-stage interpolation. * The default is 0. **/ HYPRE_Int HYPRE_BoomerAMGSetAggP12MaxElmts(HYPRE_Solver solver, HYPRE_Int agg_P12_max_elmts); /** * (Optional) Allows the user to incorporate additional vectors * into the interpolation for systems AMG, e.g. rigid body modes for * linear elasticity problems. * This can only be used in context with nodal coarsening and still * requires the user to choose an interpolation. **/ HYPRE_Int HYPRE_BoomerAMGSetInterpVectors (HYPRE_Solver solver, HYPRE_Int num_vectors, HYPRE_ParVector *interp_vectors ); /** * (Optional) Defines the interpolation variant used for * HYPRE_BoomerAMGSetInterpVectors: * - 1 : GM approach 1 * - 2 : GM approach 2 (to be preferred over 1) * - 3 : LN approach **/ HYPRE_Int HYPRE_BoomerAMGSetInterpVecVariant (HYPRE_Solver solver, HYPRE_Int var ); /** * (Optional) Defines the maximal elements per row for Q, the additional * columns added to the original interpolation matrix P, to reduce complexity. * The default is no truncation. **/ HYPRE_Int HYPRE_BoomerAMGSetInterpVecQMax (HYPRE_Solver solver, HYPRE_Int q_max ); /** * (Optional) Defines a truncation factor for Q, the additional * columns added to the original interpolation matrix P, to reduce complexity. * The default is no truncation. **/ HYPRE_Int HYPRE_BoomerAMGSetInterpVecAbsQTrunc (HYPRE_Solver solver, HYPRE_Real q_trunc ); /** * (Optional) Specifies the use of GSMG - geometrically smooth * coarsening and interpolation. Currently any nonzero value for * gsmg will lead to the use of GSMG. * The default is 0, i.e. (GSMG is not used) **/ HYPRE_Int HYPRE_BoomerAMGSetGSMG(HYPRE_Solver solver, HYPRE_Int gsmg); /** * (Optional) Defines the number of sample vectors used in GSMG * or LS interpolation. **/ HYPRE_Int HYPRE_BoomerAMGSetNumSamples(HYPRE_Solver solver, HYPRE_Int num_samples); /** * (Optional) Defines the type of cycle. * For a V-cycle, set \e cycle_type to 1, for a W-cycle * set \e cycle_type to 2. The default is 1. **/ HYPRE_Int HYPRE_BoomerAMGSetCycleType(HYPRE_Solver solver, HYPRE_Int cycle_type); /** * (Optional) Specifies the use of Full multigrid cycle. * The default is 0. **/ HYPRE_Int HYPRE_BoomerAMGSetFCycle( HYPRE_Solver solver, HYPRE_Int fcycle ); /** * (Optional) Defines use of an additive V(1,1)-cycle using the * classical additive method starting at level 'addlvl'. * The multiplicative approach is used on levels 0, ...'addlvl+1'. * 'addlvl' needs to be > -1 for this to have an effect. * Can only be used with weighted Jacobi and l1-Jacobi(default). * * Can only be used when AMG is used as a preconditioner !!! **/ HYPRE_Int HYPRE_BoomerAMGSetAdditive(HYPRE_Solver solver, HYPRE_Int addlvl); /** * (Optional) Defines use of an additive V(1,1)-cycle using the * mult-additive method starting at level 'addlvl'. * The multiplicative approach is used on levels 0, ...'addlvl+1'. * 'addlvl' needs to be > -1 for this to have an effect. * Can only be used with weighted Jacobi and l1-Jacobi(default). * * Can only be used when AMG is used as a preconditioner !!! **/ HYPRE_Int HYPRE_BoomerAMGSetMultAdditive(HYPRE_Solver solver, HYPRE_Int addlvl); /** * (Optional) Defines use of an additive V(1,1)-cycle using the * simplified mult-additive method starting at level 'addlvl'. * The multiplicative approach is used on levels 0, ...'addlvl+1'. * 'addlvl' needs to be > -1 for this to have an effect. * Can only be used with weighted Jacobi and l1-Jacobi(default). * * Can only be used when AMG is used as a preconditioner !!! **/ HYPRE_Int HYPRE_BoomerAMGSetSimple(HYPRE_Solver solver, HYPRE_Int addlvl); /** * (Optional) Defines last level where additive, mult-additive * or simple cycle is used. * The multiplicative approach is used on levels > add_last_lvl. * * Can only be used when AMG is used as a preconditioner !!! **/ HYPRE_Int HYPRE_BoomerAMGSetAddLastLvl(HYPRE_Solver solver, HYPRE_Int add_last_lvl); /** * (Optional) Defines the truncation factor for the * smoothed interpolation used for mult-additive or simple method. * The default is 0. **/ HYPRE_Int HYPRE_BoomerAMGSetMultAddTruncFactor(HYPRE_Solver solver, HYPRE_Real add_trunc_factor); /** * (Optional) Defines the maximal number of elements per row for the * smoothed interpolation used for mult-additive or simple method. * The default is 0. **/ HYPRE_Int HYPRE_BoomerAMGSetMultAddPMaxElmts(HYPRE_Solver solver, HYPRE_Int add_P_max_elmts); /** * (Optional) Defines the relaxation type used in the (mult)additive cycle * portion (also affects simple method.) * The default is 18 (L1-Jacobi). * Currently the only other option allowed is 0 (Jacobi) which should be * used in combination with HYPRE_BoomerAMGSetAddRelaxWt. **/ HYPRE_Int HYPRE_BoomerAMGSetAddRelaxType(HYPRE_Solver solver, HYPRE_Int add_rlx_type); /** * (Optional) Defines the relaxation weight used for Jacobi within the * (mult)additive or simple cycle portion. * The default is 1. * The weight only affects the Jacobi method, and has no effect on L1-Jacobi **/ HYPRE_Int HYPRE_BoomerAMGSetAddRelaxWt(HYPRE_Solver solver, HYPRE_Real add_rlx_wt); /** * (Optional) Sets maximal size for agglomeration or redundant coarse grid solve. * When the system is smaller than this threshold, sequential AMG is used * on process 0 or on all remaining active processes (if redundant = 1 ). **/ HYPRE_Int HYPRE_BoomerAMGSetSeqThreshold(HYPRE_Solver solver, HYPRE_Int seq_threshold); /** * (Optional) operates switch for redundancy. Needs to be used with * HYPRE_BoomerAMGSetSeqThreshold. Default is 0, i.e. no redundancy. **/ HYPRE_Int HYPRE_BoomerAMGSetRedundant(HYPRE_Solver solver, HYPRE_Int redundant); /** * (Optional) Defines the number of sweeps for the fine and coarse grid, * the up and down cycle. * * Note: This routine will be phased out!!!! * Use HYPRE_BoomerAMGSetNumSweeps or HYPRE_BoomerAMGSetCycleNumSweeps instead. **/ HYPRE_Int HYPRE_BoomerAMGSetNumGridSweeps(HYPRE_Solver solver, HYPRE_Int *num_grid_sweeps); /** * (Optional) Sets the number of sweeps. On the finest level, the up and * the down cycle the number of sweeps are set to \e num_sweeps and on the * coarsest level to 1. The default is 1. **/ HYPRE_Int HYPRE_BoomerAMGSetNumSweeps(HYPRE_Solver solver, HYPRE_Int num_sweeps); /** * (Optional) Sets the number of sweeps at a specified cycle. * There are the following options for \e k: * * - 1 : the down cycle * - 2 : the up cycle * - 3 : the coarsest level **/ HYPRE_Int HYPRE_BoomerAMGSetCycleNumSweeps(HYPRE_Solver solver, HYPRE_Int num_sweeps, HYPRE_Int k); /** * (Optional) Defines which smoother is used on the fine and coarse grid, * the up and down cycle. * * Note: This routine will be phased out!!!! * Use HYPRE_BoomerAMGSetRelaxType or HYPRE_BoomerAMGSetCycleRelaxType instead. **/ HYPRE_Int HYPRE_BoomerAMGSetGridRelaxType(HYPRE_Solver solver, HYPRE_Int *grid_relax_type); /** * (Optional) Defines the smoother to be used. It uses the given * smoother on the fine grid, the up and * the down cycle and sets the solver on the coarsest level to Gaussian * elimination (9). The default is \f$\ell_1\f$-Gauss-Seidel, forward solve (13) * on the down cycle and backward solve (14) on the up cycle. * * There are the following options for \e relax_type: * * - 0 : Jacobi * - 1 : Gauss-Seidel, sequential (very slow!) * - 2 : Gauss-Seidel, interior points in parallel, boundary sequential (slow!) * - 3 : hybrid Gauss-Seidel or SOR, forward solve * - 4 : hybrid Gauss-Seidel or SOR, backward solve * - 5 : hybrid chaotic Gauss-Seidel (works only with OpenMP) * - 6 : hybrid symmetric Gauss-Seidel or SSOR * - 7 : Jacobi (uses Matvec) * - 8 : \f$\ell_1\f$-scaled hybrid symmetric Gauss-Seidel * - 9 : Gaussian elimination (only on coarsest level) * - 10 : On-processor direct forward solve for matrices with * triangular structure * - 11 : Two Stage approximation to GS. Uses the strict lower * part of the diagonal matrix * - 12 : Two Stage approximation to GS. Uses the strict lower * part of the diagonal matrix and a second iteration * for additional error approximation * - 13 : \f$\ell_1\f$ Gauss-Seidel, forward solve * - 14 : \f$\ell_1\f$ Gauss-Seidel, backward solve * - 15 : CG (warning - not a fixed smoother - may require FGMRES) * - 16 : Chebyshev * - 17 : FCF-Jacobi * - 18 : \f$\ell_1\f$-scaled jacobi * - 19 : Gaussian elimination (old version) * - 21 : The same as 8 except forcing serialization on CPU (#OMP-thread = 1) * - 29 : Direct solve: use Gaussian elimination & BLAS * (with pivoting) (old version) * - 30 : Kaczmarz * - 88: The same methods as 8 with a convergent l1-term * - 89: Symmetric l1-hybrid Gauss-Seidel (i.e., 13 followed by 14) * - 98 : LU with pivoting * - 99 : LU with pivoting * -199 : Matvec with the inverse **/ HYPRE_Int HYPRE_BoomerAMGSetRelaxType(HYPRE_Solver solver, HYPRE_Int relax_type); /** * (Optional) Defines the smoother at a given cycle. * * For options of \e relax_type see description of HYPRE_BoomerAMGSetRelaxType. * In addition, the following options for \e relax_type are available when choosing * the coarsest level solver (k = 3): * * For coarsest level systems formed via a sub-communicator defined with active ranks: * - 9 : hypre's internal Gaussian elimination (host only). * - 99 : LU factorization with pivoting. * - 199 : explicit (dense) inverse. * * For coarsest level systems formed via hypre_DataExchangeList: * - 19 : hypre's internal Gaussian elimination (host only). * - 98 : LU factorization with pivoting. * - 198 : explicit (dense) inverse. * * Options for \e k are * * - 1 : the down cycle * - 2 : the up cycle * - 3 : the coarsest level **/ HYPRE_Int HYPRE_BoomerAMGSetCycleRelaxType(HYPRE_Solver solver, HYPRE_Int relax_type, HYPRE_Int k); /** * (Optional) Defines in which order the points are relaxed. There are * the following options for \e relax_order: * * - 0 : the points are relaxed in natural or lexicographic order on each processor * - 1 : CF-relaxation is used, i.e on the fine grid and the down cycle the * coarse points are relaxed first, followed by the fine points; on the * up cycle the F-points are relaxed first, followed by the C-points. * On the coarsest level, if an iterative scheme is used, the points * are relaxed in lexicographic order. * * The default is 0. **/ HYPRE_Int HYPRE_BoomerAMGSetRelaxOrder(HYPRE_Solver solver, HYPRE_Int relax_order); /** * (Optional) Defines in which order the points are relaxed. * * See also HYPRE_BoomerAMGSetRelaxOrder. **/ HYPRE_Int HYPRE_BoomerAMGSetGridRelaxPoints(HYPRE_Solver solver, HYPRE_Int **grid_relax_points); /** * (Optional) Defines the relaxation weight for smoothed Jacobi and hybrid SOR. * * Note: This routine will be phased out!!!! * Use HYPRE_BoomerAMGSetRelaxWt or HYPRE_BoomerAMGSetLevelRelaxWt instead. **/ HYPRE_Int HYPRE_BoomerAMGSetRelaxWeight(HYPRE_Solver solver, HYPRE_Real *relax_weight); /** * (Optional) Defines the relaxation weight for smoothed Jacobi and hybrid SOR * on all levels. * * Values for \e relax_weight are * - > 0 : this assigns the given relaxation weight on all levels * - = 0 : the weight is determined on each level with the estimate * \f$3 \over {4\|D^{-1/2}AD^{-1/2}\|}\f$, where \f$D\f$ is the diagonal of \f$A\f$ * (this should only be used with Jacobi) * - = -k : the relaxation weight is determined with at most k CG steps on each level * (this should only be used for symmetric positive definite problems) * * The default is 1. **/ HYPRE_Int HYPRE_BoomerAMGSetRelaxWt(HYPRE_Solver solver, HYPRE_Real relax_weight); /** * (Optional) Defines the relaxation weight for smoothed Jacobi and hybrid SOR * on the user defined level. Note that the finest level is denoted 0, the * next coarser level 1, etc. For nonpositive \e relax_weight, the parameter is * determined on the given level as described for HYPRE_BoomerAMGSetRelaxWt. * The default is 1. **/ HYPRE_Int HYPRE_BoomerAMGSetLevelRelaxWt(HYPRE_Solver solver, HYPRE_Real relax_weight, HYPRE_Int level); /** * (Optional) Defines the outer relaxation weight for hybrid SOR. * Note: This routine will be phased out!!!! * Use HYPRE_BoomerAMGSetOuterWt or HYPRE_BoomerAMGSetLevelOuterWt instead. **/ HYPRE_Int HYPRE_BoomerAMGSetOmega(HYPRE_Solver solver, HYPRE_Real *omega); /** * (Optional) Defines the outer relaxation weight for hybrid SOR and SSOR * on all levels. * * Values for \e omega are * - > 0 : this assigns the same outer relaxation weight omega on each level * - = -k : an outer relaxation weight is determined with at most k CG steps on each level * (this only makes sense for symmetric positive definite problems and smoothers * such as SSOR) * * The default is 1. **/ HYPRE_Int HYPRE_BoomerAMGSetOuterWt(HYPRE_Solver solver, HYPRE_Real omega); /** * (Optional) Defines the outer relaxation weight for hybrid SOR or SSOR * on the user defined level. Note that the finest level is denoted 0, the * next coarser level 1, etc. For nonpositive omega, the parameter is * determined on the given level as described for HYPRE_BoomerAMGSetOuterWt. * The default is 1. **/ HYPRE_Int HYPRE_BoomerAMGSetLevelOuterWt(HYPRE_Solver solver, HYPRE_Real omega, HYPRE_Int level); /** * (Optional) Defines the Order for Chebyshev smoother. * The default is 2 (valid options are 1-4). **/ HYPRE_Int HYPRE_BoomerAMGSetChebyOrder(HYPRE_Solver solver, HYPRE_Int order); /** * (Optional) Fraction of the spectrum to use for the Chebyshev smoother. * The default is .3 (i.e., damp on upper 30% of the spectrum). **/ HYPRE_Int HYPRE_BoomerAMGSetChebyFraction (HYPRE_Solver solver, HYPRE_Real ratio); /** * (Optional) Defines whether matrix should be scaled. * The default is 1 (i.e., scaled). **/ HYPRE_Int HYPRE_BoomerAMGSetChebyScale (HYPRE_Solver solver, HYPRE_Int scale); /** * (Optional) Defines which polynomial variant should be used. * The default is 0 (i.e., scaled). **/ HYPRE_Int HYPRE_BoomerAMGSetChebyVariant (HYPRE_Solver solver, HYPRE_Int variant); /** * (Optional) Defines how to estimate eigenvalues. * The default is 10 (i.e., 10 CG iterations are used to find extreme * eigenvalues.) If eig_est=0, the largest eigenvalue is estimated * using Gershgorin, the smallest is set to 0. * If eig_est is a positive number n, n iterations of CG are used to * determine the smallest and largest eigenvalue. **/ HYPRE_Int HYPRE_BoomerAMGSetChebyEigEst (HYPRE_Solver solver, HYPRE_Int eig_est); /** * (Optional) Enables the use of more complex smoothers. * The following options exist for \e smooth_type: * * - 4 : FSAI (routines needed to set: HYPRE_BoomerAMGSetFSAIMaxSteps, * HYPRE_BoomerAMGSetFSAIMaxStepSize, HYPRE_BoomerAMGSetFSAIEigMaxIters, * HYPRE_BoomerAMGSetFSAIKapTolerance) * - 5 : ParILUK (routines needed to set: HYPRE_ILUSetLevelOfFill, HYPRE_ILUSetType) * - 6 : Schwarz (routines needed to set: HYPRE_BoomerAMGSetDomainType, * HYPRE_BoomerAMGSetOverlap, HYPRE_BoomerAMGSetVariant, * HYPRE_BoomerAMGSetSchwarzRlxWeight) * - 7 : Pilut (routines needed to set: HYPRE_BoomerAMGSetDropTol, * HYPRE_BoomerAMGSetMaxNzPerRow) * - 8 : ParaSails (routines needed to set: HYPRE_BoomerAMGSetSym, * HYPRE_BoomerAMGSetLevel, HYPRE_BoomerAMGSetFilter, * HYPRE_BoomerAMGSetThreshold) * - 9 : Euclid (routines needed to set: HYPRE_BoomerAMGSetEuclidFile) * * The default is 6. Also, if no smoother parameters are set via the routines * mentioned in the table above, default values are used. **/ HYPRE_Int HYPRE_BoomerAMGSetSmoothType(HYPRE_Solver solver, HYPRE_Int smooth_type); /** * (Optional) Sets the number of levels for more complex smoothers. * The smoothers, * as defined by HYPRE_BoomerAMGSetSmoothType, will be used * on level 0 (the finest level) through level \e smooth_num_levels-1. * The default is 0, i.e. no complex smoothers are used. **/ HYPRE_Int HYPRE_BoomerAMGSetSmoothNumLevels(HYPRE_Solver solver, HYPRE_Int smooth_num_levels); /** * (Optional) Sets the number of sweeps for more complex smoothers. * The default is 1. **/ HYPRE_Int HYPRE_BoomerAMGSetSmoothNumSweeps(HYPRE_Solver solver, HYPRE_Int smooth_num_sweeps); /** * (Optional) Defines which variant of the Schwarz method is used. * The following options exist for \e variant: * * - 0 : hybrid multiplicative Schwarz method (no overlap across processor boundaries) * - 1 : hybrid additive Schwarz method (no overlap across processor boundaries) * - 2 : additive Schwarz method * - 3 : hybrid multiplicative Schwarz method (with overlap across processor boundaries) * * The default is 0. **/ HYPRE_Int HYPRE_BoomerAMGSetVariant(HYPRE_Solver solver, HYPRE_Int variant); /** * (Optional) Defines the overlap for the Schwarz method. * The following options exist for overlap: * * - 0 : no overlap * - 1 : minimal overlap (default) * - 2 : overlap generated by including all neighbors of domain boundaries **/ HYPRE_Int HYPRE_BoomerAMGSetOverlap(HYPRE_Solver solver, HYPRE_Int overlap); /** * (Optional) Defines the type of domain used for the Schwarz method. * The following options exist for \e domain_type: * * - 0 : each point is a domain * - 1 : each node is a domain (only of interest in "systems" AMG) * - 2 : each domain is generated by agglomeration (default) **/ HYPRE_Int HYPRE_BoomerAMGSetDomainType(HYPRE_Solver solver, HYPRE_Int domain_type); /** * (Optional) Defines a smoothing parameter for the additive Schwarz method. **/ HYPRE_Int HYPRE_BoomerAMGSetSchwarzRlxWeight(HYPRE_Solver solver, HYPRE_Real schwarz_rlx_weight); /** * (Optional) Indicates that the aggregates may not be SPD for the Schwarz method. * The following options exist for \e use_nonsymm: * * - 0 : assume SPD (default) * - 1 : assume non-symmetric **/ HYPRE_Int HYPRE_BoomerAMGSetSchwarzUseNonSymm(HYPRE_Solver solver, HYPRE_Int use_nonsymm); /** * (Optional) Defines symmetry for ParaSAILS. * For further explanation see description of ParaSAILS. **/ HYPRE_Int HYPRE_BoomerAMGSetSym(HYPRE_Solver solver, HYPRE_Int sym); /** * (Optional) Defines number of levels for ParaSAILS. * For further explanation see description of ParaSAILS. **/ HYPRE_Int HYPRE_BoomerAMGSetLevel(HYPRE_Solver solver, HYPRE_Int level); /** * (Optional) Defines threshold for ParaSAILS. * For further explanation see description of ParaSAILS. **/ HYPRE_Int HYPRE_BoomerAMGSetThreshold(HYPRE_Solver solver, HYPRE_Real threshold); /** * (Optional) Defines filter for ParaSAILS. * For further explanation see description of ParaSAILS. **/ HYPRE_Int HYPRE_BoomerAMGSetFilter(HYPRE_Solver solver, HYPRE_Real filter); /** * (Optional) Defines drop tolerance for PILUT. * For further explanation see description of PILUT. **/ HYPRE_Int HYPRE_BoomerAMGSetDropTol(HYPRE_Solver solver, HYPRE_Real drop_tol); /** * (Optional) Defines maximal number of nonzeros for PILUT. * For further explanation see description of PILUT. **/ HYPRE_Int HYPRE_BoomerAMGSetMaxNzPerRow(HYPRE_Solver solver, HYPRE_Int max_nz_per_row); /** * (Optional) Defines name of an input file for Euclid parameters. * For further explanation see description of Euclid. **/ HYPRE_Int HYPRE_BoomerAMGSetEuclidFile(HYPRE_Solver solver, char *euclidfile); /** * (Optional) Defines number of levels for ILU(k) in Euclid. * For further explanation see description of Euclid. **/ HYPRE_Int HYPRE_BoomerAMGSetEuLevel(HYPRE_Solver solver, HYPRE_Int eu_level); /** * (Optional) Defines filter for ILU(k) for Euclid. * For further explanation see description of Euclid. **/ HYPRE_Int HYPRE_BoomerAMGSetEuSparseA(HYPRE_Solver solver, HYPRE_Real eu_sparse_A); /** * (Optional) Defines use of block jacobi ILUT for Euclid. * For further explanation see description of Euclid. **/ HYPRE_Int HYPRE_BoomerAMGSetEuBJ(HYPRE_Solver solver, HYPRE_Int eu_bj); /** * Defines type of ILU smoother to use * For further explanation see description of ILU. **/ HYPRE_Int HYPRE_BoomerAMGSetILUType( HYPRE_Solver solver, HYPRE_Int ilu_type); /** * Defines level k for ILU(k) smoother * For further explanation see description of ILU. **/ HYPRE_Int HYPRE_BoomerAMGSetILULevel( HYPRE_Solver solver, HYPRE_Int ilu_lfil); /** * Defines max row nonzeros for ILUT smoother * For further explanation see description of ILU. **/ HYPRE_Int HYPRE_BoomerAMGSetILUMaxRowNnz( HYPRE_Solver solver, HYPRE_Int ilu_max_row_nnz); /** * Defines number of iterations for ILU smoother on each level * For further explanation see description of ILU. **/ HYPRE_Int HYPRE_BoomerAMGSetILUMaxIter( HYPRE_Solver solver, HYPRE_Int ilu_max_iter); /** * Defines drop tolorance for iLUT smoother * For further explanation see description of ILU. **/ HYPRE_Int HYPRE_BoomerAMGSetILUDroptol( HYPRE_Solver solver, HYPRE_Real ilu_droptol); /** * (Optional) Defines triangular solver for ILU(k,T) smoother: 0-iterative, 1-direct (default) * For further explanation see description of ILU. **/ HYPRE_Int HYPRE_BoomerAMGSetILUTriSolve( HYPRE_Solver solver, HYPRE_Int ilu_tri_solve); /** * (Optional) Defines number of lower Jacobi iterations for ILU(k,T) smoother triangular solve. * For further explanation see description of ILU. **/ HYPRE_Int HYPRE_BoomerAMGSetILULowerJacobiIters( HYPRE_Solver solver, HYPRE_Int ilu_lower_jacobi_iters); /** * (Optional) Defines number of upper Jacobi iterations for ILU(k,T) smoother triangular solve. * For further explanation see description of ILU. **/ HYPRE_Int HYPRE_BoomerAMGSetILUUpperJacobiIters( HYPRE_Solver solver, HYPRE_Int ilu_upper_jacobi_iters); /** * (Optional) Set Local Reordering paramter (1==RCM, 0==None) * For further explanation see description of ILU. **/ HYPRE_Int HYPRE_BoomerAMGSetILULocalReordering( HYPRE_Solver solver, HYPRE_Int ilu_reordering_type); /** * (Optional) Set iterative ILU's algorithm type. * For further explanation see \e HYPRE_ILUSetIterativeSetupType. **/ HYPRE_Int HYPRE_BoomerAMGSetILUIterSetupType( HYPRE_Solver solver, HYPRE_Int ilu_iter_setup_type); /** * (Optional) Set iterative ILU's option. * For further explanation see \e HYPRE_ILUSetIterativeSetupOption. **/ HYPRE_Int HYPRE_BoomerAMGSetILUIterSetupOption( HYPRE_Solver solver, HYPRE_Int ilu_iter_setup_option); /** * (Optional) Set iterative ILU's max. number of iterations. * For further explanation see \e HYPRE_ILUSetIterativeSetupMaxIter. **/ HYPRE_Int HYPRE_BoomerAMGSetILUIterSetupMaxIter( HYPRE_Solver solver, HYPRE_Int ilu_iter_setup_max_iter); /** * (Optional) Set iterative ILU's tolerance. * For further explanation see \e HYPRE_ILUSetIterativeSetupTolerance. **/ HYPRE_Int HYPRE_BoomerAMGSetILUIterSetupTolerance( HYPRE_Solver solver, HYPRE_Real ilu_iter_setup_tolerance); /** * (Optional) Defines the algorithm type for setting up FSAI * For further explanation see \e HYPRE_FSAISetAlgoType. **/ HYPRE_Int HYPRE_BoomerAMGSetFSAIAlgoType(HYPRE_Solver solver, HYPRE_Int algo_type); /** * (Optional) Sets the solver type for solving local linear systems in FSAI. * For further explanation see \e HYPRE_FSAISetLocalSolveType. **/ HYPRE_Int HYPRE_BoomerAMGSetFSAILocalSolveType( HYPRE_Solver solver, HYPRE_Int local_solve_type ); /** * (Optional) Defines maximum number of steps for FSAI. * For further explanation see \e HYPRE_FSAISetMaxSteps. **/ HYPRE_Int HYPRE_BoomerAMGSetFSAIMaxSteps(HYPRE_Solver solver, HYPRE_Int max_steps); /** * (Optional) Defines maximum step size for FSAI. * For further explanation see \e HYPRE_FSAISetMaxStepSize. **/ HYPRE_Int HYPRE_BoomerAMGSetFSAIMaxStepSize(HYPRE_Solver solver, HYPRE_Int max_step_size); /** * (Optional) Defines maximum number of nonzero entries per row for FSAI. * For further explanation see \e HYPRE_FSAISetMaxNnzRow. **/ HYPRE_Int HYPRE_BoomerAMGSetFSAIMaxNnzRow(HYPRE_Solver solver, HYPRE_Int max_nnz_row); /** * (Optional) Defines number of levels for computing the candidate pattern for FSAI * For further explanation see \e HYPRE_FSAISetNumLevels. **/ HYPRE_Int HYPRE_BoomerAMGSetFSAINumLevels(HYPRE_Solver solver, HYPRE_Int num_levels); /** * (Optional) Defines the threshold for computing the candidate pattern for FSAI * For further explanation see \e HYPRE_FSAISetThreshold. **/ HYPRE_Int HYPRE_BoomerAMGSetFSAIThreshold(HYPRE_Solver solver, HYPRE_Real threshold); /** * (Optional) Defines maximum number of iterations for estimating the * largest eigenvalue of the FSAI preconditioned matrix (G^T * G * A). * For further explanation see \e HYPRE_FSAISetEigMaxIters. **/ HYPRE_Int HYPRE_BoomerAMGSetFSAIEigMaxIters(HYPRE_Solver solver, HYPRE_Int eig_max_iters); /** * (Optional) Defines the kaporin dropping tolerance. * For further explanation see \e HYPRE_FSAISetKapTolerance. **/ HYPRE_Int HYPRE_BoomerAMGSetFSAIKapTolerance(HYPRE_Solver solver, HYPRE_Real kap_tolerance); /** * (Optional) Defines which parallel restriction operator is used. * There are the following options for restr_type: * * - 0 : \f$P^T\f$ - Transpose of the interpolation operator * - 1 : AIR-1 - Approximate Ideal Restriction (distance 1) * - 2 : AIR-2 - Approximate Ideal Restriction (distance 2) * * The default is 0. **/ HYPRE_Int HYPRE_BoomerAMGSetRestriction(HYPRE_Solver solver, HYPRE_Int restr_par); /** * (Optional) Assumes the matrix is triangular in some ordering * to speed up the setup time of approximate ideal restriction. * * The default is 0. **/ HYPRE_Int HYPRE_BoomerAMGSetIsTriangular(HYPRE_Solver solver, HYPRE_Int is_triangular); /** * (Optional) Set local problem size at which GMRES is used over * a direct solve in approximating ideal restriction. * The default is 0. **/ HYPRE_Int HYPRE_BoomerAMGSetGMRESSwitchR(HYPRE_Solver solver, HYPRE_Int gmres_switch); /** * (Optional) Defines the drop tolerance for the A-matrices * from the 2nd level of AMG. * The default is 0. **/ HYPRE_Int HYPRE_BoomerAMGSetADropTol( HYPRE_Solver solver, HYPRE_Real A_drop_tol ); /** * (Optional) Drop the entries that are not on the diagonal and smaller than * its row norm: type 1: 1-norm, 2: 2-norm, -1: infinity norm **/ HYPRE_Int HYPRE_BoomerAMGSetADropType( HYPRE_Solver solver, HYPRE_Int A_drop_type ); /** * (Optional) Name of file to which BoomerAMG will print; * cf HYPRE_BoomerAMGSetPrintLevel. (Presently this is ignored). **/ HYPRE_Int HYPRE_BoomerAMGSetPrintFileName(HYPRE_Solver solver, const char *print_file_name); /** * (Optional) Requests automatic printing of setup and solve information. * * - 0 : no printout (default) * - 1 : print setup information * - 2 : print solve information * - 3 : print both setup and solve information * * Note, that if one desires to print information and uses BoomerAMG as a * preconditioner, suggested \e print_level is 1 to avoid excessive output, * and use \e print_level of solver for solve phase information. **/ HYPRE_Int HYPRE_BoomerAMGSetPrintLevel(HYPRE_Solver solver, HYPRE_Int print_level); /** * (Optional) Requests additional computations for diagnostic and similar * data to be logged by the user. Default to 0 to do nothing. The latest * residual will be available if logging > 1. **/ HYPRE_Int HYPRE_BoomerAMGSetLogging(HYPRE_Solver solver, HYPRE_Int logging); /** * (Optional) **/ HYPRE_Int HYPRE_BoomerAMGSetDebugFlag(HYPRE_Solver solver, HYPRE_Int debug_flag); /** * (Optional) This routine will be eliminated in the future. **/ HYPRE_Int HYPRE_BoomerAMGInitGridRelaxation(HYPRE_Int **num_grid_sweeps_ptr, HYPRE_Int **grid_relax_type_ptr, HYPRE_Int ***grid_relax_points_ptr, HYPRE_Int coarsen_type, HYPRE_Real **relax_weights_ptr, HYPRE_Int max_levels); /** * (Optional) If rap2 not equal 0, the triple matrix product RAP is * replaced by two matrix products. * (Required for triple matrix product generation on GPUs) **/ HYPRE_Int HYPRE_BoomerAMGSetRAP2(HYPRE_Solver solver, HYPRE_Int rap2); /** * (Optional) If mod_rap2 not equal 0, the triple matrix product RAP is * replaced by two matrix products with modularized kernels * (Required for triple matrix product generation on GPUs) **/ HYPRE_Int HYPRE_BoomerAMGSetModuleRAP2(HYPRE_Solver solver, HYPRE_Int mod_rap2); /** * (Optional) If set to 1, the local interpolation transposes will * be saved to use more efficient matvecs instead of matvecTs * (Recommended for efficient use on GPUs) **/ HYPRE_Int HYPRE_BoomerAMGSetKeepTranspose(HYPRE_Solver solver, HYPRE_Int keepTranspose); /** * HYPRE_BoomerAMGSetPlotGrids **/ HYPRE_Int HYPRE_BoomerAMGSetPlotGrids (HYPRE_Solver solver, HYPRE_Int plotgrids); /** * HYPRE_BoomerAMGSetPlotFilename **/ HYPRE_Int HYPRE_BoomerAMGSetPlotFileName (HYPRE_Solver solver, const char *plotfilename); /** * HYPRE_BoomerAMGSetCoordDim **/ HYPRE_Int HYPRE_BoomerAMGSetCoordDim (HYPRE_Solver solver, HYPRE_Int coorddim); /** * HYPRE_BoomerAMGSetCoordinates **/ HYPRE_Int HYPRE_BoomerAMGSetCoordinates (HYPRE_Solver solver, float *coordinates); /** * (Optional) Get the coarse grid hierarchy. Assumes input/ output array is * preallocated to the size of the local matrix. On return, \e cgrid[i] returns * the last grid level containing node \e i. * * @param solver [IN] solver or preconditioner * @param cgrid [IN/ OUT] preallocated array. On return, contains grid hierarchy info. **/ HYPRE_Int HYPRE_BoomerAMGGetGridHierarchy(HYPRE_Solver solver, HYPRE_Int *cgrid ); #ifdef HYPRE_USING_DSUPERLU /** * HYPRE_BoomerAMGSetDSLUThreshold * * Usage: * Set slu_threshold >= max_coarse_size (from HYPRE_BoomerAMGSetMaxCoarseSize(...)) * to turn on use of superLU for the coarse grid solve. SuperLU is used if the * coarse grid size > max_coarse_size and the grid level is < (max_num_levels - 1) * (set with HYPRE_BoomerAMGSetMaxLevels(...)). **/ HYPRE_Int HYPRE_BoomerAMGSetDSLUThreshold (HYPRE_Solver solver, HYPRE_Int slu_threshold); #endif /** * (Optional) Fix C points to be kept till a specified coarse level. * * @param solver [IN] solver or preconditioner * @param cpt_coarse_level [IN] coarse level up to which to keep C points * @param num_cpt_coarse [IN] number of C points to be kept * @param cpt_coarse_index [IN] indexes of C points to be kept **/ HYPRE_Int HYPRE_BoomerAMGSetCPoints(HYPRE_Solver solver, HYPRE_Int cpt_coarse_level, HYPRE_Int num_cpt_coarse, HYPRE_BigInt *cpt_coarse_index); /** * (Optional) Deprecated function. Use HYPRE_BoomerAMGSetCPoints instead. **/ HYPRE_Int HYPRE_BoomerAMGSetCpointsToKeep(HYPRE_Solver solver, HYPRE_Int cpt_coarse_level, HYPRE_Int num_cpt_coarse, HYPRE_BigInt *cpt_coarse_index); /** * (Optional) Set fine points in the first level. * * @param solver [IN] solver or preconditioner * @param num_fpt [IN] number of fine points * @param fpt_index [IN] global indices of fine points **/ HYPRE_Int HYPRE_BoomerAMGSetFPoints(HYPRE_Solver solver, HYPRE_Int num_fpt, HYPRE_BigInt *fpt_index); /** * (Optional) Set isolated fine points in the first level. * Interpolation weights are not computed for these points. * * @param solver [IN] solver or preconditioner * @param num_isolated_fpt [IN] number of isolated fine points * @param isolated_fpt_index [IN] global indices of isolated fine points **/ HYPRE_Int HYPRE_BoomerAMGSetIsolatedFPoints(HYPRE_Solver solver, HYPRE_Int num_isolated_fpt, HYPRE_BigInt *isolated_fpt_index); /** * (Optional) if Sabs equals 1, the strength of connection test is based * on the absolute value of the matrix coefficients **/ HYPRE_Int HYPRE_BoomerAMGSetSabs (HYPRE_Solver solver, HYPRE_Int Sabs ); /**@}*/ /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ /** * @name ParCSR BoomerAMGDD Solver and Preconditioner * * Communication reducing solver and preconditioner built on top of algebraic multigrid * * @{ **/ /** * Create a solver object. **/ HYPRE_Int HYPRE_BoomerAMGDDCreate( HYPRE_Solver *solver ); /** * Destroy a solver object. **/ HYPRE_Int HYPRE_BoomerAMGDDDestroy( HYPRE_Solver solver ); /** * Set up the BoomerAMGDD solver or preconditioner. * If used as a preconditioner, this function should be passed * to the iterative solver \e SetPrecond function. * * @param solver [IN] object to be set up. * @param A [IN] ParCSR matrix used to construct the solver/preconditioner. * @param b Ignored by this function. * @param x Ignored by this function. **/ HYPRE_Int HYPRE_BoomerAMGDDSetup( HYPRE_Solver solver, HYPRE_ParCSRMatrix A, HYPRE_ParVector b, HYPRE_ParVector x ); /** * Solve the system or apply AMG-DD as a preconditioner. * If used as a preconditioner, this function should be passed * to the iterative solver \e SetPrecond function. * * @param solver [IN] solver or preconditioner object to be applied. * @param A [IN] ParCSR matrix, matrix of the linear system to be solved * @param b [IN] right hand side of the linear system to be solved * @param x [OUT] approximated solution of the linear system to be solved **/ HYPRE_Int HYPRE_BoomerAMGDDSolve( HYPRE_Solver solver, HYPRE_ParCSRMatrix A, HYPRE_ParVector b, HYPRE_ParVector x ); /** * (Optional) Set the number of pre- and post-relaxations per level for * AMG-DD inner FAC cycles. Default is 1. **/ HYPRE_Int HYPRE_BoomerAMGDDSetFACNumRelax( HYPRE_Solver solver, HYPRE_Int amgdd_fac_num_relax ); /** * (Optional) Set the number of inner FAC cycles per AMG-DD iteration. * Default is 2. **/ HYPRE_Int HYPRE_BoomerAMGDDSetFACNumCycles( HYPRE_Solver solver, HYPRE_Int amgdd_fac_num_cycles ); /** * (Optional) Set the cycle type for the AMG-DD inner FAC cycles. * 1 (default) = V-cycle, 2 = W-cycle, 3 = F-cycle **/ HYPRE_Int HYPRE_BoomerAMGDDSetFACCycleType( HYPRE_Solver solver, HYPRE_Int amgdd_fac_cycle_type ); /** * (Optional) Set the relaxation type for the AMG-DD inner FAC cycles. * 0 = Jacobi, 1 = Gauss-Seidel, 2 = ordered Gauss-Seidel, 3 (default) = C/F L1-scaled Jacobi **/ HYPRE_Int HYPRE_BoomerAMGDDSetFACRelaxType( HYPRE_Solver solver, HYPRE_Int amgdd_fac_relax_type ); /** * (Optional) Set the relaxation weight for the AMG-DD inner FAC cycles. Default is 1.0. **/ HYPRE_Int HYPRE_BoomerAMGDDSetFACRelaxWeight( HYPRE_Solver solver, HYPRE_Real amgdd_fac_relax_weight ); /** * (Optional) Set the AMG-DD start level. Default is 0. **/ HYPRE_Int HYPRE_BoomerAMGDDSetStartLevel( HYPRE_Solver solver, HYPRE_Int start_level ); /** * (Optional) Set the AMG-DD padding. Default is 1. **/ HYPRE_Int HYPRE_BoomerAMGDDSetPadding( HYPRE_Solver solver, HYPRE_Int padding ); /** * (Optional) Set the AMG-DD number of ghost layers. Default is 1. **/ HYPRE_Int HYPRE_BoomerAMGDDSetNumGhostLayers( HYPRE_Solver solver, HYPRE_Int num_ghost_layers ); /** * (Optional) Pass a custom user-defined function as a relaxation method for the AMG-DD FAC cycles. * Function should have the following form, where amgdd_solver is of type hypre_ParAMGDDData* and level is the level on which to relax: * HYPRE_Int userFACRelaxation( HYPRE_Solver amgdd_solver, HYPRE_Int level ) **/ HYPRE_Int HYPRE_BoomerAMGDDSetUserFACRelaxation( HYPRE_Solver solver, HYPRE_Int (*userFACRelaxation)( void *amgdd_vdata, HYPRE_Int level, HYPRE_Int cycle_param ) ); /** * (Optional) Get the underlying AMG hierarchy as a HYPRE_Solver object. **/ HYPRE_Int HYPRE_BoomerAMGDDGetAMG( HYPRE_Solver solver, HYPRE_Solver *amg_solver ); /** * Returns the norm of the final relative residual. **/ HYPRE_Int HYPRE_BoomerAMGDDGetFinalRelativeResidualNorm( HYPRE_Solver solver, HYPRE_Real *rel_resid_norm ); /** * Returns the number of iterations taken. **/ HYPRE_Int HYPRE_BoomerAMGDDGetNumIterations( HYPRE_Solver solver, HYPRE_Int *num_iterations ); /**@}*/ /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ /** * @name ParCSR FSAI Solver and Preconditioner * * An adaptive factorized sparse approximate inverse solver/preconditioner/smoother * that computes a sparse approximation G to the inverse of the lower cholesky * factor of A such that M^{-1} \approx G^T * G. * * @{ **/ /** * Create a solver object. **/ HYPRE_Int HYPRE_FSAICreate( HYPRE_Solver *solver ); /** * Destroy a solver object. **/ HYPRE_Int HYPRE_FSAIDestroy( HYPRE_Solver solver ); /** * Set up the FSAI solver or preconditioner. * If used as a preconditioner, this function should be passed * to the iterative solver \e SetPrecond function. * * @param solver [IN] object to be set up. * @param A [IN] ParCSR matrix used to construct the solver/preconditioner. * @param b Ignored by this function. * @param x Ignored by this function. **/ HYPRE_Int HYPRE_FSAISetup( HYPRE_Solver solver, HYPRE_ParCSRMatrix A, HYPRE_ParVector b, HYPRE_ParVector x ); /** * Solve the system or apply FSAI as a preconditioner. * If used as a preconditioner, this function should be passed * to the iterative solver \e SetPrecond function. * * @param solver [IN] solver or preconditioner object to be applied. * @param A [IN] ParCSR matrix, matrix of the linear system to be solved * @param b [IN] right hand side of the linear system to be solved * @param x [OUT] approximated solution of the linear system to be solved **/ HYPRE_Int HYPRE_FSAISolve( HYPRE_Solver solver, HYPRE_ParCSRMatrix A, HYPRE_ParVector b, HYPRE_ParVector x ); /** * (Optional) Sets the algorithm type used to compute the lower triangular factor G * * - 1: Adaptive (can use OpenMP with static scheduling) * - 2: Adaptive OpenMP with dynamic scheduling * - 3: Static - power pattern **/ HYPRE_Int HYPRE_FSAISetAlgoType( HYPRE_Solver solver, HYPRE_Int algo_type ); /** * (Optional) Sets the solver type for solving local linear systems in FSAI. This * option makes sense only for GPU runs. * * - 0: Gauss-Jordan solver * - 1: Vendor solver (cuSOLVER/rocSOLVER) * - 2: MAGMA solver **/ HYPRE_Int HYPRE_FSAISetLocalSolveType( HYPRE_Solver solver, HYPRE_Int local_solve_type ); /** * (Optional) Sets the maximum number of steps for computing the sparsity * pattern of G. This input parameter makes sense when using adaptive FSAI, * i.e., algorithm type 1 or 2. **/ HYPRE_Int HYPRE_FSAISetMaxSteps( HYPRE_Solver solver, HYPRE_Int max_steps ); /** * (Optional) Sets the maximum step size for computing the sparsity pattern of G. * This input parameter makes sense when using adaptive FSAI, i.e., algorithm * type 1 or 2. **/ HYPRE_Int HYPRE_FSAISetMaxStepSize( HYPRE_Solver solver, HYPRE_Int max_step_size ); /** * (Optional) Sets the maximum number of off-diagonal entries per row of G. * This input parameter makes sense when using static FSAI, i.e., algorithm * type 3. **/ HYPRE_Int HYPRE_FSAISetMaxNnzRow( HYPRE_Solver solver, HYPRE_Int max_nnz_row ); /** * (Optional) Sets the number of levels for computing the candidate pattern of G. * This input parameter must be a positive integer and it makes sense * when using static FSAI, i.e., algorithm type 3. **/ HYPRE_Int HYPRE_FSAISetNumLevels( HYPRE_Solver solver, HYPRE_Int num_levels ); /** * (Optional) Sets the threshold for computing the candidate pattern of G * This input parameter makes sense when using static FSAI, i.e., algorithm * type 3. **/ HYPRE_Int HYPRE_FSAISetThreshold( HYPRE_Solver solver, HYPRE_Real threshold ); /** * (Optional) Sets the kaporin gradient reduction factor for computing the * sparsity pattern of G. This input parameter makes sense when using adaptive * FSAI, i.e., algorithm types 1 or 2. **/ HYPRE_Int HYPRE_FSAISetKapTolerance( HYPRE_Solver solver, HYPRE_Real kap_tolerance ); /** * (Optional) Sets the relaxation factor for FSAI. This input parameter makes * sense to all algorithm types for setting up FSAI. **/ HYPRE_Int HYPRE_FSAISetOmega( HYPRE_Solver solver, HYPRE_Real omega ); /** * (Optional) Sets the maximum number of iterations (sweeps) for FSAI. This * input parameter makes sense to all algorithm types for setting up FSAI. **/ HYPRE_Int HYPRE_FSAISetMaxIterations( HYPRE_Solver solver, HYPRE_Int max_iterations ); /** * (Optional) Set number of iterations for computing maximum * eigenvalue of the preconditioned operator. This input parameter makes * sense to all algorithm types for setting up FSAI. **/ HYPRE_Int HYPRE_FSAISetEigMaxIters( HYPRE_Solver solver, HYPRE_Int eig_max_iters ); /** * (Optional) Set the convergence tolerance, if FSAI is used * as a solver. This input parameter makes sense to all algorithm types * for setting up FSAI. When using FSAI as a preconditioner, set the * tolerance to 0.0. The default is \f$10^{-6}\f$. **/ HYPRE_Int HYPRE_FSAISetTolerance( HYPRE_Solver solver, HYPRE_Real tolerance ); /** * (Optional) Requests automatic printing of setup information. * * - 0 : no printout (default) * - 1 : print setup information **/ HYPRE_Int HYPRE_FSAISetPrintLevel(HYPRE_Solver solver, HYPRE_Int print_level); /** * (Optional) Use a zero initial guess. This allows the solver to cut corners * in the case where a zero initial guess is needed (e.g., for preconditioning) * to reduce compuational cost. **/ HYPRE_Int HYPRE_FSAISetZeroGuess(HYPRE_Solver solver, HYPRE_Int zero_guess); /**@}*/ /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ /** * @name ParCSR ParaSails Preconditioner * * Parallel sparse approximate inverse preconditioner for the * ParCSR matrix format. * * @{ **/ /** * Create a ParaSails preconditioner. **/ HYPRE_Int HYPRE_ParaSailsCreate(MPI_Comm comm, HYPRE_Solver *solver); /** * Destroy a ParaSails preconditioner. **/ HYPRE_Int HYPRE_ParaSailsDestroy(HYPRE_Solver solver); /** * Set up the ParaSails preconditioner. This function should be passed * to the iterative solver \e SetPrecond function. * * @param solver [IN] Preconditioner object to set up. * @param A [IN] ParCSR matrix used to construct the preconditioner. * @param b Ignored by this function. * @param x Ignored by this function. **/ HYPRE_Int HYPRE_ParaSailsSetup(HYPRE_Solver solver, HYPRE_ParCSRMatrix A, HYPRE_ParVector b, HYPRE_ParVector x); /** * Apply the ParaSails preconditioner. This function should be passed * to the iterative solver \e SetPrecond function. * * @param solver [IN] Preconditioner object to apply. * @param A Ignored by this function. * @param b [IN] Vector to precondition. * @param x [OUT] Preconditioned vector. **/ HYPRE_Int HYPRE_ParaSailsSolve(HYPRE_Solver solver, HYPRE_ParCSRMatrix A, HYPRE_ParVector b, HYPRE_ParVector x); /** * Set the threshold and levels parameter for the ParaSails * preconditioner. The accuracy and cost of ParaSails are * parameterized by these two parameters. Lower values of the * threshold parameter and higher values of levels parameter * lead to more accurate, but more expensive preconditioners. * * @param solver [IN] Preconditioner object for which to set parameters. * @param thresh [IN] Value of threshold parameter, \f$0 \le\f$ thresh \f$\le 1\f$. * The default value is 0.1. * @param nlevels [IN] Value of levels parameter, \f$0 \le\f$ nlevels. * The default value is 1. **/ HYPRE_Int HYPRE_ParaSailsSetParams(HYPRE_Solver solver, HYPRE_Real thresh, HYPRE_Int nlevels); /** * Set the filter parameter for the * ParaSails preconditioner. * * @param solver [IN] Preconditioner object for which to set filter parameter. * @param filter [IN] Value of filter parameter. The filter parameter is * used to drop small nonzeros in the preconditioner, * to reduce the cost of applying the preconditioner. * Values from 0.05 to 0.1 are recommended. * The default value is 0.1. **/ HYPRE_Int HYPRE_ParaSailsSetFilter(HYPRE_Solver solver, HYPRE_Real filter); /** * Set the symmetry parameter for the ParaSails preconditioner. * * Values for \e sym * - 0 : nonsymmetric and/or indefinite problem, and nonsymmetric preconditioner * - 1 : SPD problem, and SPD (factored) preconditioner * - 2 : nonsymmetric, definite problem, and SPD (factored) preconditioner * * @param solver [IN] Preconditioner object for which to set symmetry parameter. * @param sym [IN] Symmetry parameter. **/ HYPRE_Int HYPRE_ParaSailsSetSym(HYPRE_Solver solver, HYPRE_Int sym); /** * Set the load balance parameter for the * ParaSails preconditioner. * * @param solver [IN] Preconditioner object for which to set the load balance * parameter. * @param loadbal [IN] Value of the load balance parameter, * \f$0 \le\f$ loadbal \f$\le 1\f$. A zero value indicates that * no load balance is attempted; a value of unity indicates * that perfect load balance will be attempted. The * recommended value is 0.9 to balance the overhead of * data exchanges for load balancing. No load balancing * is needed if the preconditioner is very sparse and * fast to construct. The default value when this * parameter is not set is 0. **/ HYPRE_Int HYPRE_ParaSailsSetLoadbal(HYPRE_Solver solver, HYPRE_Real loadbal); /** * Set the pattern reuse parameter for the * ParaSails preconditioner. * * @param solver [IN] Preconditioner object for which to set the pattern reuse * parameter. * @param reuse [IN] Value of the pattern reuse parameter. A nonzero value * indicates that the pattern of the preconditioner should * be reused for subsequent constructions of the * preconditioner. A zero value indicates that the * preconditioner should be constructed from scratch. * The default value when this parameter is not set is 0. **/ HYPRE_Int HYPRE_ParaSailsSetReuse(HYPRE_Solver solver, HYPRE_Int reuse); /** * Set the logging parameter for the * ParaSails preconditioner. * * @param solver [IN] Preconditioner object for which to set the logging * parameter. * @param logging [IN] Value of the logging parameter. A nonzero value * sends statistics of the setup procedure to stdout. * The default value when this parameter is not set is 0. **/ HYPRE_Int HYPRE_ParaSailsSetLogging(HYPRE_Solver solver, HYPRE_Int logging); /** * Build IJ Matrix of the sparse approximate inverse (factor). * This function explicitly creates the IJ Matrix corresponding to * the sparse approximate inverse or the inverse factor. * Example: HYPRE_IJMatrix ij_A; * HYPRE_ParaSailsBuildIJMatrix(solver, \&ij_A); * * @param solver [IN] Preconditioner object. * @param pij_A [OUT] Pointer to the IJ Matrix. **/ HYPRE_Int HYPRE_ParaSailsBuildIJMatrix(HYPRE_Solver solver, HYPRE_IJMatrix *pij_A); /* ParCSRParaSails routines */ HYPRE_Int HYPRE_ParCSRParaSailsCreate(MPI_Comm comm, HYPRE_Solver *solver); HYPRE_Int HYPRE_ParCSRParaSailsDestroy(HYPRE_Solver solver); HYPRE_Int HYPRE_ParCSRParaSailsSetup(HYPRE_Solver solver, HYPRE_ParCSRMatrix A, HYPRE_ParVector b, HYPRE_ParVector x); HYPRE_Int HYPRE_ParCSRParaSailsSolve(HYPRE_Solver solver, HYPRE_ParCSRMatrix A, HYPRE_ParVector b, HYPRE_ParVector x); HYPRE_Int HYPRE_ParCSRParaSailsSetParams(HYPRE_Solver solver, HYPRE_Real thresh, HYPRE_Int nlevels); HYPRE_Int HYPRE_ParCSRParaSailsSetFilter(HYPRE_Solver solver, HYPRE_Real filter); HYPRE_Int HYPRE_ParCSRParaSailsSetSym(HYPRE_Solver solver, HYPRE_Int sym); HYPRE_Int HYPRE_ParCSRParaSailsSetLoadbal(HYPRE_Solver solver, HYPRE_Real loadbal); HYPRE_Int HYPRE_ParCSRParaSailsSetReuse(HYPRE_Solver solver, HYPRE_Int reuse); HYPRE_Int HYPRE_ParCSRParaSailsSetLogging(HYPRE_Solver solver, HYPRE_Int logging); /**@}*/ /*--------------------------------------------------------------------------* *--------------------------------------------------------------------------*/ /** * @name ParCSR Euclid Preconditioner * * MPI Parallel ILU preconditioner * * Options summary: * * | Option | Default | Synopsis | * | :-------- | --------- | :-------------------------------------------- | * | -level | 1 | ILU(k) factorization level | * | -bj | 0 (false) | Use Block Jacobi ILU instead of PILU | * | -eu_stats | 0 (false) | Print internal timing and statistics | * | -eu_mem | 0 (false) | Print internal memory usage | * * @{ **/ /** * Create a Euclid object. **/ HYPRE_Int HYPRE_EuclidCreate(MPI_Comm comm, HYPRE_Solver *solver); /** * Destroy a Euclid object. **/ HYPRE_Int HYPRE_EuclidDestroy(HYPRE_Solver solver); /** * Set up the Euclid preconditioner. This function should be passed * to the iterative solver \e SetPrecond function. * * @param solver [IN] Preconditioner object to set up. * @param A [IN] ParCSR matrix used to construct the preconditioner. * @param b Ignored by this function. * @param x Ignored by this function. **/ HYPRE_Int HYPRE_EuclidSetup(HYPRE_Solver solver, HYPRE_ParCSRMatrix A, HYPRE_ParVector b, HYPRE_ParVector x); /** * Apply the Euclid preconditioner. This function should be passed * to the iterative solver \e SetPrecond function. * * @param solver [IN] Preconditioner object to apply. * @param A Ignored by this function. * @param b [IN] Vector to precondition. * @param x [OUT] Preconditioned vector. **/ HYPRE_Int HYPRE_EuclidSolve(HYPRE_Solver solver, HYPRE_ParCSRMatrix A, HYPRE_ParVector b, HYPRE_ParVector x); /** * Insert (name, value) pairs in Euclid's options database * by passing Euclid the command line (or an array of strings). * All Euclid options (e.g, level, drop-tolerance) are stored in * this database. * If a (name, value) pair already exists, this call updates the value. * See also: HYPRE_EuclidSetParamsFromFile. * * @param argc [IN] Length of argv array * @param argv [IN] Array of strings **/ HYPRE_Int HYPRE_EuclidSetParams(HYPRE_Solver solver, HYPRE_Int argc, char *argv[]); /** * Insert (name, value) pairs in Euclid's options database. * Each line of the file should either begin with a "\#", * indicating a comment line, or contain a (name value) * pair, e.g: * \verbatim >cat optionsFile \#sample runtime parameter file -blockJacobi 3 -matFile /home/hysom/myfile.euclid -doSomething true -xx_coeff -1.0 \endverbatim * * See also: HYPRE_EuclidSetParams. * * @param filename[IN] Pathname/filename to read **/ HYPRE_Int HYPRE_EuclidSetParamsFromFile(HYPRE_Solver solver, char *filename); /** * Set level k for ILU(k) factorization, default: 1 **/ HYPRE_Int HYPRE_EuclidSetLevel(HYPRE_Solver solver, HYPRE_Int level); /** * Use block Jacobi ILU preconditioning instead of PILU **/ HYPRE_Int HYPRE_EuclidSetBJ(HYPRE_Solver solver, HYPRE_Int bj); /** * If \e eu_stats not equal 0, a summary of runtime settings and * timing information is printed to stdout. **/ HYPRE_Int HYPRE_EuclidSetStats(HYPRE_Solver solver, HYPRE_Int eu_stats); /** * If \e eu_mem not equal 0, a summary of Euclid's memory usage * is printed to stdout. **/ HYPRE_Int HYPRE_EuclidSetMem(HYPRE_Solver solver, HYPRE_Int eu_mem); /** * Defines a drop tolerance for ILU(k). Default: 0 * Use with HYPRE_EuclidSetRowScale. * Note that this can destroy symmetry in a matrix. **/ HYPRE_Int HYPRE_EuclidSetSparseA(HYPRE_Solver solver, HYPRE_Real sparse_A); /** * If \e row_scale not equal 0, values are scaled prior to factorization * so that largest value in any row is +1 or -1. * Note that this can destroy symmetry in a matrix. **/ HYPRE_Int HYPRE_EuclidSetRowScale(HYPRE_Solver solver, HYPRE_Int row_scale); /** * uses ILUT and defines a drop tolerance relative to the largest * absolute value of any entry in the row being factored. **/ HYPRE_Int HYPRE_EuclidSetILUT(HYPRE_Solver solver, HYPRE_Real drop_tol); /**@}*/ /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ /** * @name ParCSR Pilut Preconditioner * * @{ **/ /** * Create a preconditioner object. **/ HYPRE_Int HYPRE_ParCSRPilutCreate(MPI_Comm comm, HYPRE_Solver *solver); /** * Destroy a preconditioner object. **/ HYPRE_Int HYPRE_ParCSRPilutDestroy(HYPRE_Solver solver); /** **/ HYPRE_Int HYPRE_ParCSRPilutSetup(HYPRE_Solver solver, HYPRE_ParCSRMatrix A, HYPRE_ParVector b, HYPRE_ParVector x); /** * Precondition the system. **/ HYPRE_Int HYPRE_ParCSRPilutSolve(HYPRE_Solver solver, HYPRE_ParCSRMatrix A, HYPRE_ParVector b, HYPRE_ParVector x); /** * (Optional) Set maximum number of iterations. **/ HYPRE_Int HYPRE_ParCSRPilutSetMaxIter(HYPRE_Solver solver, HYPRE_Int max_iter); /** * (Optional) **/ HYPRE_Int HYPRE_ParCSRPilutSetDropTolerance(HYPRE_Solver solver, HYPRE_Real tol); /** * (Optional) **/ HYPRE_Int HYPRE_ParCSRPilutSetFactorRowSize(HYPRE_Solver solver, HYPRE_Int size); HYPRE_Int HYPRE_ParCSRPilutSetLogging(HYPRE_Solver solver, HYPRE_Int logging ); /**@}*/ /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ /** * @name ParCSR AMS Solver and Preconditioner * * Parallel auxiliary space Maxwell solver and preconditioner * * @{ **/ /** * Create an AMS solver object. **/ HYPRE_Int HYPRE_AMSCreate(HYPRE_Solver *solver); /** * Destroy an AMS solver object. **/ HYPRE_Int HYPRE_AMSDestroy(HYPRE_Solver solver); /** * Set up the AMS solver or preconditioner. * If used as a preconditioner, this function should be passed * to the iterative solver \e SetPrecond function. * * @param solver [IN] object to be set up. * @param A [IN] ParCSR matrix used to construct the solver/preconditioner. * @param b Ignored by this function. * @param x Ignored by this function. **/ HYPRE_Int HYPRE_AMSSetup(HYPRE_Solver solver, HYPRE_ParCSRMatrix A, HYPRE_ParVector b, HYPRE_ParVector x); /** * Solve the system or apply AMS as a preconditioner. * If used as a preconditioner, this function should be passed * to the iterative solver \e SetPrecond function. * * @param solver [IN] solver or preconditioner object to be applied. * @param A [IN] ParCSR matrix, matrix of the linear system to be solved * @param b [IN] right hand side of the linear system to be solved * @param x [OUT] approximated solution of the linear system to be solved **/ HYPRE_Int HYPRE_AMSSolve(HYPRE_Solver solver, HYPRE_ParCSRMatrix A, HYPRE_ParVector b, HYPRE_ParVector x); /** * (Optional) Sets the problem dimension (2 or 3). The default is 3. **/ HYPRE_Int HYPRE_AMSSetDimension(HYPRE_Solver solver, HYPRE_Int dim); /** * Sets the discrete gradient matrix \e G. * This function should be called before HYPRE_AMSSetup()! **/ HYPRE_Int HYPRE_AMSSetDiscreteGradient(HYPRE_Solver solver, HYPRE_ParCSRMatrix G); /** * Sets the \e x, \e y and \e z coordinates of the vertices in the mesh. * * Either HYPRE_AMSSetCoordinateVectors() or HYPRE_AMSSetEdgeConstantVectors() * should be called before HYPRE_AMSSetup()! **/ HYPRE_Int HYPRE_AMSSetCoordinateVectors(HYPRE_Solver solver, HYPRE_ParVector x, HYPRE_ParVector y, HYPRE_ParVector z); /** * Sets the vectors \e Gx, \e Gy and \e Gz which give the representations of * the constant vector fields (1,0,0), (0,1,0) and (0,0,1) in the * edge element basis. * * Either HYPRE_AMSSetCoordinateVectors() or HYPRE_AMSSetEdgeConstantVectors() * should be called before HYPRE_AMSSetup()! **/ HYPRE_Int HYPRE_AMSSetEdgeConstantVectors(HYPRE_Solver solver, HYPRE_ParVector Gx, HYPRE_ParVector Gy, HYPRE_ParVector Gz); /** * (Optional) Set the (components of) the Nedelec interpolation matrix * \f$\Pi = [ \Pi^x, \Pi^y, \Pi^z ]\f$. * * This function is generally intended to be used only for high-order Nedelec * discretizations (in the lowest order case, \f$\Pi\f$ is constructed internally in * AMS from the discreet gradient matrix and the coordinates of the vertices), * though it can also be used in the lowest-order case or for other types of * discretizations (e.g. ones based on the second family of Nedelec elements). * * By definition, \f$\Pi\f$ is the matrix representation of the linear operator that * interpolates (high-order) vector nodal finite elements into the (high-order) * Nedelec space. The component matrices are defined as \f$\Pi^x \varphi = \Pi * (\varphi,0,0)\f$ and similarly for \f$\Pi^y\f$ and \f$\Pi^z\f$. Note that all these * operators depend on the choice of the basis and degrees of freedom in the * high-order spaces. * * The column numbering of Pi should be node-based, i.e. the \f$x\f$/\f$y\f$/\f$z\f$ * components of the first node (vertex or high-order dof) should be listed * first, followed by the \f$x\f$/\f$y\f$/\f$z\f$ components of the second node and so on * (see the documentation of HYPRE_BoomerAMGSetDofFunc). * * If used, this function should be called before HYPRE_AMSSetup() and there is * no need to provide the vertex coordinates. Furthermore, only one of the sets * \f$\{\Pi\}\f$ and \f$\{\Pi^x,\Pi^y,\Pi^z\}\f$ needs to be specified (though it is OK * to provide both). If Pix is NULL, then scalar \f$\Pi\f$-based AMS cycles, * i.e. those with \e cycle_type > 10, will be unavailable. Similarly, AMS cycles * based on monolithic \f$\Pi\f$ (\e cycle_type < 10) require that Pi is not NULL. **/ HYPRE_Int HYPRE_AMSSetInterpolations(HYPRE_Solver solver, HYPRE_ParCSRMatrix Pi, HYPRE_ParCSRMatrix Pix, HYPRE_ParCSRMatrix Piy, HYPRE_ParCSRMatrix Piz); /** * (Optional) Sets the matrix \f$A_\alpha\f$ corresponding to the Poisson * problem with coefficient \f$\alpha\f$ (the curl-curl term coefficient in * the Maxwell problem). * * If this function is called, the coarse space solver on the range * of \f$\Pi^T\f$ is a block-diagonal version of \f$A_\Pi\f$. If this function is not * called, the coarse space solver on the range of \f$\Pi^T\f$ is constructed * as \f$\Pi^T A \Pi\f$ in HYPRE_AMSSetup(). See the user's manual for more details. **/ HYPRE_Int HYPRE_AMSSetAlphaPoissonMatrix(HYPRE_Solver solver, HYPRE_ParCSRMatrix A_alpha); /** * (Optional) Sets the matrix \f$A_\beta\f$ corresponding to the Poisson * problem with coefficient \f$\beta\f$ (the mass term coefficient in the * Maxwell problem). * * If not given, the Poisson matrix will be computed in HYPRE_AMSSetup(). * If the given matrix is NULL, we assume that \f$\beta\f$ is identically 0 * and use two-level (instead of three-level) methods. See the user's manual for more details. **/ HYPRE_Int HYPRE_AMSSetBetaPoissonMatrix(HYPRE_Solver solver, HYPRE_ParCSRMatrix A_beta); /** * (Optional) Set the list of nodes which are interior to a zero-conductivity * region. This way, a more robust solver is constructed, that can be iterated * to lower tolerance levels. A node is interior if its entry in the array is * 1.0. This function should be called before HYPRE_AMSSetup()! **/ HYPRE_Int HYPRE_AMSSetInteriorNodes(HYPRE_Solver solver, HYPRE_ParVector interior_nodes); /** * (Optional) Set the frequency at which a projection onto the compatible * subspace for problems with zero-conductivity regions is performed. The * default value is 5. **/ HYPRE_Int HYPRE_AMSSetProjectionFrequency(HYPRE_Solver solver, HYPRE_Int projection_frequency); /** * (Optional) Sets maximum number of iterations, if AMS is used * as a solver. To use AMS as a preconditioner, set the maximum * number of iterations to 1. The default is 20. **/ HYPRE_Int HYPRE_AMSSetMaxIter(HYPRE_Solver solver, HYPRE_Int maxit); /** * (Optional) Set the convergence tolerance, if AMS is used * as a solver. When using AMS as a preconditioner, set the tolerance * to 0.0. The default is \f$10^{-6}\f$. **/ HYPRE_Int HYPRE_AMSSetTol(HYPRE_Solver solver, HYPRE_Real tol); /** * (Optional) Choose which three-level solver to use. Possible values are: * * - 1 : 3-level multiplicative solver (01210) * - 2 : 3-level additive solver (0+1+2) * - 3 : 3-level multiplicative solver (02120) * - 4 : 3-level additive solver (010+2) * - 5 : 3-level multiplicative solver (0102010) * - 6 : 3-level additive solver (1+020) * - 7 : 3-level multiplicative solver (0201020) * - 8 : 3-level additive solver (0(1+2)0) * - 11 : 5-level multiplicative solver (013454310) * - 12 : 5-level additive solver (0+1+3+4+5) * - 13 : 5-level multiplicative solver (034515430) * - 14 : 5-level additive solver (01(3+4+5)10) * * The default is 1. See the user's manual for more details. **/ HYPRE_Int HYPRE_AMSSetCycleType(HYPRE_Solver solver, HYPRE_Int cycle_type); /** * (Optional) Control how much information is printed during the * solution iterations. * The default is 1 (print residual norm at each step). **/ HYPRE_Int HYPRE_AMSSetPrintLevel(HYPRE_Solver solver, HYPRE_Int print_level); /** * (Optional) Sets relaxation parameters for \f$A\f$. * The defaults are 2, 1, 1.0, 1.0. * * The available options for \e relax_type are: * * - 1 : \f$\ell_1\f$-scaled Jacobi * - 2 : \f$\ell_1\f$-scaled block symmetric Gauss-Seidel/SSOR * - 3 : Kaczmarz * - 4 : truncated version of \f$\ell_1\f$-scaled block symmetric Gauss-Seidel/SSOR * - 16 : Chebyshev **/ HYPRE_Int HYPRE_AMSSetSmoothingOptions(HYPRE_Solver solver, HYPRE_Int relax_type, HYPRE_Int relax_times, HYPRE_Real relax_weight, HYPRE_Real omega); /** * (Optional) Sets AMG parameters for \f$B_\Pi\f$. * The defaults are 10, 1, 3, 0.25, 0, 0. See the user's manual for more details. **/ HYPRE_Int HYPRE_AMSSetAlphaAMGOptions(HYPRE_Solver solver, HYPRE_Int alpha_coarsen_type, HYPRE_Int alpha_agg_levels, HYPRE_Int alpha_relax_type, HYPRE_Real alpha_strength_threshold, HYPRE_Int alpha_interp_type, HYPRE_Int alpha_Pmax); /** * (Optional) Sets the coarsest level relaxation in the AMG solver for \f$B_\Pi\f$. * The default is 8 (l1-GS). Use 9, 19, 29 or 99 for a direct solver. **/ HYPRE_Int HYPRE_AMSSetAlphaAMGCoarseRelaxType(HYPRE_Solver solver, HYPRE_Int alpha_coarse_relax_type); /** * (Optional) Sets AMG parameters for \f$B_G\f$. * The defaults are 10, 1, 3, 0.25, 0, 0. See the user's manual for more details. **/ HYPRE_Int HYPRE_AMSSetBetaAMGOptions(HYPRE_Solver solver, HYPRE_Int beta_coarsen_type, HYPRE_Int beta_agg_levels, HYPRE_Int beta_relax_type, HYPRE_Real beta_strength_threshold, HYPRE_Int beta_interp_type, HYPRE_Int beta_Pmax); /** * (Optional) Sets the coarsest level relaxation in the AMG solver for \f$B_G\f$. * The default is 8 (l1-GS). Use 9, 19, 29 or 99 for a direct solver. **/ HYPRE_Int HYPRE_AMSSetBetaAMGCoarseRelaxType(HYPRE_Solver solver, HYPRE_Int beta_coarse_relax_type); /** * Returns the number of iterations taken. **/ HYPRE_Int HYPRE_AMSGetNumIterations(HYPRE_Solver solver, HYPRE_Int *num_iterations); /** * Returns the norm of the final relative residual. **/ HYPRE_Int HYPRE_AMSGetFinalRelativeResidualNorm(HYPRE_Solver solver, HYPRE_Real *rel_resid_norm); /** * For problems with zero-conductivity regions, project the vector onto the * compatible subspace: \f$x = (I - G_0 (G_0^t G_0)^{-1} G_0^T) x\f$, where \f$G_0\f$ is * the discrete gradient restricted to the interior nodes of the regions with * zero conductivity. This ensures that x is orthogonal to the gradients in the * range of \f$G_0\f$. * * This function is typically called after the solution iteration is complete, * in order to facilitate the visualization of the computed field. Without it * the values in the zero-conductivity regions contain kernel components. **/ HYPRE_Int HYPRE_AMSProjectOutGradients(HYPRE_Solver solver, HYPRE_ParVector x); /** * Construct and return the lowest-order discrete gradient matrix G using some * edge and vertex information. We assume that \e edge_vertex lists the edge * vertices consecutively, and that the orientation of all edges is consistent. * * If \e edge_orientation = 1, the edges are already oriented. * * If \e edge_orientation = 2, the orientation of edge i depends only * on the sign of \e edge_vertex[2*i+1] - \e edge_vertex[2*i]. **/ HYPRE_Int HYPRE_AMSConstructDiscreteGradient(HYPRE_ParCSRMatrix A, HYPRE_ParVector x_coord, HYPRE_BigInt *edge_vertex, HYPRE_Int edge_orientation, HYPRE_ParCSRMatrix *G); /**@}*/ /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ /** * @name ParCSR ADS Solver and Preconditioner * * Parallel auxiliary space divergence solver and preconditioner * * @{ **/ /** * Create an ADS solver object. **/ HYPRE_Int HYPRE_ADSCreate(HYPRE_Solver *solver); /** * Destroy an ADS solver object. **/ HYPRE_Int HYPRE_ADSDestroy(HYPRE_Solver solver); /** * Set up the ADS solver or preconditioner. * If used as a preconditioner, this function should be passed * to the iterative solver \e SetPrecond function. * * @param solver [IN] object to be set up. * @param A [IN] ParCSR matrix used to construct the solver/preconditioner. * @param b Ignored by this function. * @param x Ignored by this function. **/ HYPRE_Int HYPRE_ADSSetup(HYPRE_Solver solver, HYPRE_ParCSRMatrix A, HYPRE_ParVector b, HYPRE_ParVector x); /** * Solve the system or apply ADS as a preconditioner. * If used as a preconditioner, this function should be passed * to the iterative solver \e SetPrecond function. * * @param solver [IN] solver or preconditioner object to be applied. * @param A [IN] ParCSR matrix, matrix of the linear system to be solved * @param b [IN] right hand side of the linear system to be solved * @param x [OUT] approximated solution of the linear system to be solved **/ HYPRE_Int HYPRE_ADSSolve(HYPRE_Solver solver, HYPRE_ParCSRMatrix A, HYPRE_ParVector b, HYPRE_ParVector x); /** * Sets the discrete curl matrix \e C. * This function should be called before HYPRE_ADSSetup()! **/ HYPRE_Int HYPRE_ADSSetDiscreteCurl(HYPRE_Solver solver, HYPRE_ParCSRMatrix C); /** * Sets the discrete gradient matrix \e G. * This function should be called before HYPRE_ADSSetup()! **/ HYPRE_Int HYPRE_ADSSetDiscreteGradient(HYPRE_Solver solver, HYPRE_ParCSRMatrix G); /** * Sets the \e x, \e y and \e z coordinates of the vertices in the mesh. * This function should be called before HYPRE_ADSSetup()! **/ HYPRE_Int HYPRE_ADSSetCoordinateVectors(HYPRE_Solver solver, HYPRE_ParVector x, HYPRE_ParVector y, HYPRE_ParVector z); /** * (Optional) Set the (components of) the Raviart-Thomas (\f$\Pi_{RT}\f$) and the Nedelec * (\f$\Pi_{ND}\f$) interpolation matrices. * * This function is generally intended to be used only for high-order \f$H(div)\f$ * discretizations (in the lowest order case, these matrices are constructed * internally in ADS from the discreet gradient and curl matrices and the * coordinates of the vertices), though it can also be used in the lowest-order * case or for other types of discretizations. * * By definition, \e RT_Pi and \e ND_Pi are the matrix representations of the linear * operators \f$\Pi_{RT}\f$ and \f$\Pi_{ND}\f$ that interpolate (high-order) vector * nodal finite elements into the (high-order) Raviart-Thomas and Nedelec * spaces. The component matrices are defined in both cases as \f$\Pi^x \varphi = * \Pi (\varphi,0,0)\f$ and similarly for \f$\Pi^y\f$ and \f$\Pi^z\f$. Note that all these * operators depend on the choice of the basis and degrees of freedom in the * high-order spaces. * * The column numbering of \e RT_Pi and \e ND_Pi should be node-based, i.e. the * \f$x\f$/\f$y\f$/\f$z\f$ components of the first node (vertex or high-order dof) should be * listed first, followed by the \f$x\f$/\f$y\f$/\f$z\f$ components of the second node and * so on (see the documentation of HYPRE_BoomerAMGSetDofFunc). * * If used, this function should be called before hypre_ADSSetup() and there is * no need to provide the vertex coordinates. Furthermore, only one of the sets * \f$\{\Pi_{RT}\}\f$ and \f$\{\Pi_{RT}^x,\Pi_{RT}^y,\Pi_{RT}^z\}\f$ needs to be * specified (though it is OK to provide both). If \e RT_Pix is NULL, then scalar * \f$\Pi\f$-based ADS cycles, i.e. those with \e cycle_type > 10, will be * unavailable. Similarly, ADS cycles based on monolithic \f$\Pi\f$ (\e cycle_type < * 10) require that \e RT_Pi is not NULL. The same restrictions hold for the sets * \f$\{\Pi_{ND}\}\f$ and \f$\{\Pi_{ND}^x,\Pi_{ND}^y,\Pi_{ND}^z\}\f$ -- only one of them * needs to be specified, and the availability of each enables different AMS * cycle type options. **/ HYPRE_Int HYPRE_ADSSetInterpolations(HYPRE_Solver solver, HYPRE_ParCSRMatrix RT_Pi, HYPRE_ParCSRMatrix RT_Pix, HYPRE_ParCSRMatrix RT_Piy, HYPRE_ParCSRMatrix RT_Piz, HYPRE_ParCSRMatrix ND_Pi, HYPRE_ParCSRMatrix ND_Pix, HYPRE_ParCSRMatrix ND_Piy, HYPRE_ParCSRMatrix ND_Piz); /** * (Optional) Sets maximum number of iterations, if ADS is used * as a solver. To use ADS as a preconditioner, set the maximum * number of iterations to 1. The default is 20. **/ HYPRE_Int HYPRE_ADSSetMaxIter(HYPRE_Solver solver, HYPRE_Int maxit); /** * (Optional) Set the convergence tolerance, if ADS is used * as a solver. When using ADS as a preconditioner, set the tolerance * to 0.0. The default is \f$10^{-6}\f$. **/ HYPRE_Int HYPRE_ADSSetTol(HYPRE_Solver solver, HYPRE_Real tol); /** * (Optional) Choose which auxiliary-space solver to use. Possible values are: * * - 1 : 3-level multiplicative solver (01210) * - 2 : 3-level additive solver (0+1+2) * - 3 : 3-level multiplicative solver (02120) * - 4 : 3-level additive solver (010+2) * - 5 : 3-level multiplicative solver (0102010) * - 6 : 3-level additive solver (1+020) * - 7 : 3-level multiplicative solver (0201020) * - 8 : 3-level additive solver (0(1+2)0) * - 11 : 5-level multiplicative solver (013454310) * - 12 : 5-level additive solver (0+1+3+4+5) * - 13 : 5-level multiplicative solver (034515430) * - 14 : 5-level additive solver (01(3+4+5)10) * * The default is 1. See the user's manual for more details. **/ HYPRE_Int HYPRE_ADSSetCycleType(HYPRE_Solver solver, HYPRE_Int cycle_type); /** * (Optional) Control how much information is printed during the * solution iterations. * The default is 1 (print residual norm at each step). **/ HYPRE_Int HYPRE_ADSSetPrintLevel(HYPRE_Solver solver, HYPRE_Int print_level); /** * (Optional) Sets relaxation parameters for \f$A\f$. * The defaults are 2, 1, 1.0, 1.0. * * The available options for \e relax_type are: * * - 1 : \f$\ell_1\f$-scaled Jacobi * - 2 : \f$\ell_1\f$-scaled block symmetric Gauss-Seidel/SSOR * - 3 : Kaczmarz * - 4 : truncated version of \f$\ell_1\f$-scaled block symmetric Gauss-Seidel/SSOR * - 16 : Chebyshev **/ HYPRE_Int HYPRE_ADSSetSmoothingOptions(HYPRE_Solver solver, HYPRE_Int relax_type, HYPRE_Int relax_times, HYPRE_Real relax_weight, HYPRE_Real omega); /** * (Optional) Sets parameters for Chebyshev relaxation. * The defaults are 2, 0.3. **/ HYPRE_Int HYPRE_ADSSetChebySmoothingOptions(HYPRE_Solver solver, HYPRE_Int cheby_order, HYPRE_Real cheby_fraction); /** * (Optional) Sets AMS parameters for \f$B_C\f$. * The defaults are 11, 10, 1, 3, 0.25, 0, 0. * Note that \e cycle_type should be greater than 10, unless the high-order * interface of HYPRE_ADSSetInterpolations is being used! * See the user's manual for more details. **/ HYPRE_Int HYPRE_ADSSetAMSOptions(HYPRE_Solver solver, HYPRE_Int cycle_type, HYPRE_Int coarsen_type, HYPRE_Int agg_levels, HYPRE_Int relax_type, HYPRE_Real strength_threshold, HYPRE_Int interp_type, HYPRE_Int Pmax); /** * (Optional) Sets AMG parameters for \f$B_\Pi\f$. * The defaults are 10, 1, 3, 0.25, 0, 0. See the user's manual for more details. **/ HYPRE_Int HYPRE_ADSSetAMGOptions(HYPRE_Solver solver, HYPRE_Int coarsen_type, HYPRE_Int agg_levels, HYPRE_Int relax_type, HYPRE_Real strength_threshold, HYPRE_Int interp_type, HYPRE_Int Pmax); /** * Returns the number of iterations taken. **/ HYPRE_Int HYPRE_ADSGetNumIterations(HYPRE_Solver solver, HYPRE_Int *num_iterations); /** * Returns the norm of the final relative residual. **/ HYPRE_Int HYPRE_ADSGetFinalRelativeResidualNorm(HYPRE_Solver solver, HYPRE_Real *rel_resid_norm); /**@}*/ /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ /** * @name ParCSR PCG Solver * * These routines should be used in conjunction with the generic interface in * \ref KrylovSolvers. * * @{ **/ /** * Create a solver object. **/ HYPRE_Int HYPRE_ParCSRPCGCreate(MPI_Comm comm, HYPRE_Solver *solver); /** * Destroy a solver object. **/ HYPRE_Int HYPRE_ParCSRPCGDestroy(HYPRE_Solver solver); HYPRE_Int HYPRE_ParCSRPCGSetup(HYPRE_Solver solver, HYPRE_ParCSRMatrix A, HYPRE_ParVector b, HYPRE_ParVector x); HYPRE_Int HYPRE_ParCSRPCGSolve(HYPRE_Solver solver, HYPRE_ParCSRMatrix A, HYPRE_ParVector b, HYPRE_ParVector x); HYPRE_Int HYPRE_ParCSRPCGSetTol(HYPRE_Solver solver, HYPRE_Real tol); HYPRE_Int HYPRE_ParCSRPCGSetAbsoluteTol(HYPRE_Solver solver, HYPRE_Real tol); HYPRE_Int HYPRE_ParCSRPCGSetMaxIter(HYPRE_Solver solver, HYPRE_Int max_iter); /* * RE-VISIT **/ HYPRE_Int HYPRE_ParCSRPCGSetStopCrit(HYPRE_Solver solver, HYPRE_Int stop_crit); HYPRE_Int HYPRE_ParCSRPCGSetTwoNorm(HYPRE_Solver solver, HYPRE_Int two_norm); HYPRE_Int HYPRE_ParCSRPCGSetRelChange(HYPRE_Solver solver, HYPRE_Int rel_change); HYPRE_Int HYPRE_ParCSRPCGSetPrecond(HYPRE_Solver solver, HYPRE_PtrToParSolverFcn precond, HYPRE_PtrToParSolverFcn precond_setup, HYPRE_Solver precond_solver); HYPRE_Int HYPRE_ParCSRPCGSetPreconditioner(HYPRE_Solver solver, HYPRE_Solver precond); HYPRE_Int HYPRE_ParCSRPCGGetPrecond(HYPRE_Solver solver, HYPRE_Solver *precond_data); HYPRE_Int HYPRE_ParCSRPCGSetLogging(HYPRE_Solver solver, HYPRE_Int logging); HYPRE_Int HYPRE_ParCSRPCGSetPrintLevel(HYPRE_Solver solver, HYPRE_Int print_level); HYPRE_Int HYPRE_ParCSRPCGGetNumIterations(HYPRE_Solver solver, HYPRE_Int *num_iterations); HYPRE_Int HYPRE_ParCSRPCGGetFinalRelativeResidualNorm(HYPRE_Solver solver, HYPRE_Real *norm); /** * Returns the residual. **/ HYPRE_Int HYPRE_ParCSRPCGGetResidual(HYPRE_Solver solver, HYPRE_ParVector *residual); /** * Setup routine for diagonal preconditioning. **/ HYPRE_Int HYPRE_ParCSRDiagScaleSetup(HYPRE_Solver solver, HYPRE_ParCSRMatrix A, HYPRE_ParVector y, HYPRE_ParVector x); /** * Solve routine for diagonal preconditioning. **/ HYPRE_Int HYPRE_ParCSRDiagScale(HYPRE_Solver solver, HYPRE_ParCSRMatrix HA, HYPRE_ParVector Hy, HYPRE_ParVector Hx); /** * Setup routine for on-processor triangular solve as preconditioning. **/ HYPRE_Int HYPRE_ParCSROnProcTriSetup(HYPRE_Solver solver, HYPRE_ParCSRMatrix HA, HYPRE_ParVector Hy, HYPRE_ParVector Hx); /** * Solve routine for on-processor triangular solve as preconditioning. **/ HYPRE_Int HYPRE_ParCSROnProcTriSolve(HYPRE_Solver solver, HYPRE_ParCSRMatrix HA, HYPRE_ParVector Hy, HYPRE_ParVector Hx); /**@}*/ /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ /** * @name ParCSR GMRES Solver * * These routines should be used in conjunction with the generic interface in * \ref KrylovSolvers. * * @{ **/ /** * Create a solver object. **/ HYPRE_Int HYPRE_ParCSRGMRESCreate(MPI_Comm comm, HYPRE_Solver *solver); /** * Destroy a solver object. **/ HYPRE_Int HYPRE_ParCSRGMRESDestroy(HYPRE_Solver solver); HYPRE_Int HYPRE_ParCSRGMRESSetup(HYPRE_Solver solver, HYPRE_ParCSRMatrix A, HYPRE_ParVector b, HYPRE_ParVector x); HYPRE_Int HYPRE_ParCSRGMRESSolve(HYPRE_Solver solver, HYPRE_ParCSRMatrix A, HYPRE_ParVector b, HYPRE_ParVector x); HYPRE_Int HYPRE_ParCSRGMRESSetKDim(HYPRE_Solver solver, HYPRE_Int k_dim); HYPRE_Int HYPRE_ParCSRGMRESSetTol(HYPRE_Solver solver, HYPRE_Real tol); HYPRE_Int HYPRE_ParCSRGMRESSetAbsoluteTol(HYPRE_Solver solver, HYPRE_Real a_tol); /* * RE-VISIT **/ HYPRE_Int HYPRE_ParCSRGMRESSetMinIter(HYPRE_Solver solver, HYPRE_Int min_iter); HYPRE_Int HYPRE_ParCSRGMRESSetMaxIter(HYPRE_Solver solver, HYPRE_Int max_iter); /* * Obsolete **/ HYPRE_Int HYPRE_ParCSRGMRESSetStopCrit(HYPRE_Solver solver, HYPRE_Int stop_crit); HYPRE_Int HYPRE_ParCSRGMRESSetPrecond(HYPRE_Solver solver, HYPRE_PtrToParSolverFcn precond, HYPRE_PtrToParSolverFcn precond_setup, HYPRE_Solver precond_solver); HYPRE_Int HYPRE_ParCSRGMRESGetPrecond(HYPRE_Solver solver, HYPRE_Solver *precond_data); HYPRE_Int HYPRE_ParCSRGMRESSetLogging(HYPRE_Solver solver, HYPRE_Int logging); HYPRE_Int HYPRE_ParCSRGMRESSetPrintLevel(HYPRE_Solver solver, HYPRE_Int print_level); HYPRE_Int HYPRE_ParCSRGMRESGetNumIterations(HYPRE_Solver solver, HYPRE_Int *num_iterations); HYPRE_Int HYPRE_ParCSRGMRESGetFinalRelativeResidualNorm(HYPRE_Solver solver, HYPRE_Real *norm); /** * Returns the residual. **/ HYPRE_Int HYPRE_ParCSRGMRESGetResidual(HYPRE_Solver solver, HYPRE_ParVector *residual); /* ParCSR CO-GMRES, author: KS */ /** * Create a solver object. **/ HYPRE_Int HYPRE_ParCSRCOGMRESCreate(MPI_Comm comm, HYPRE_Solver *solver); /** * Destroy a solver object. **/ HYPRE_Int HYPRE_ParCSRCOGMRESDestroy(HYPRE_Solver solver); HYPRE_Int HYPRE_ParCSRCOGMRESSetup(HYPRE_Solver solver, HYPRE_ParCSRMatrix A, HYPRE_ParVector b, HYPRE_ParVector x); HYPRE_Int HYPRE_ParCSRCOGMRESSolve(HYPRE_Solver solver, HYPRE_ParCSRMatrix A, HYPRE_ParVector b, HYPRE_ParVector x); HYPRE_Int HYPRE_ParCSRCOGMRESSetKDim(HYPRE_Solver solver, HYPRE_Int k_dim); HYPRE_Int HYPRE_ParCSRCOGMRESSetUnroll(HYPRE_Solver solver, HYPRE_Int unroll); HYPRE_Int HYPRE_ParCSRCOGMRESSetCGS(HYPRE_Solver solver, HYPRE_Int cgs); HYPRE_Int HYPRE_ParCSRCOGMRESSetTol(HYPRE_Solver solver, HYPRE_Real tol); HYPRE_Int HYPRE_ParCSRCOGMRESSetAbsoluteTol(HYPRE_Solver solver, HYPRE_Real a_tol); /* * RE-VISIT **/ HYPRE_Int HYPRE_ParCSRCOGMRESSetMinIter(HYPRE_Solver solver, HYPRE_Int min_iter); HYPRE_Int HYPRE_ParCSRCOGMRESSetMaxIter(HYPRE_Solver solver, HYPRE_Int max_iter); HYPRE_Int HYPRE_ParCSRCOGMRESSetPrecond(HYPRE_Solver solver, HYPRE_PtrToParSolverFcn precond, HYPRE_PtrToParSolverFcn precond_setup, HYPRE_Solver precond_solver); HYPRE_Int HYPRE_ParCSRCOGMRESGetPrecond(HYPRE_Solver solver, HYPRE_Solver *precond_data); HYPRE_Int HYPRE_ParCSRCOGMRESSetLogging(HYPRE_Solver solver, HYPRE_Int logging); HYPRE_Int HYPRE_ParCSRCOGMRESSetPrintLevel(HYPRE_Solver solver, HYPRE_Int print_level); HYPRE_Int HYPRE_ParCSRCOGMRESGetNumIterations(HYPRE_Solver solver, HYPRE_Int *num_iterations); HYPRE_Int HYPRE_ParCSRCOGMRESGetFinalRelativeResidualNorm(HYPRE_Solver solver, HYPRE_Real *norm); /** * Returns the residual. **/ HYPRE_Int HYPRE_ParCSRCOGMRESGetResidual(HYPRE_Solver solver, HYPRE_ParVector *residual); /* end of parCSR CO-GMRES */ /**@}*/ /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ /** * @name ParCSR FlexGMRES Solver * * These routines should be used in conjunction with the generic interface in * \ref KrylovSolvers. * * @{ **/ /** * Create a solver object. **/ HYPRE_Int HYPRE_ParCSRFlexGMRESCreate(MPI_Comm comm, HYPRE_Solver *solver); /** * Destroy a solver object. **/ HYPRE_Int HYPRE_ParCSRFlexGMRESDestroy(HYPRE_Solver solver); HYPRE_Int HYPRE_ParCSRFlexGMRESSetup(HYPRE_Solver solver, HYPRE_ParCSRMatrix A, HYPRE_ParVector b, HYPRE_ParVector x); HYPRE_Int HYPRE_ParCSRFlexGMRESSolve(HYPRE_Solver solver, HYPRE_ParCSRMatrix A, HYPRE_ParVector b, HYPRE_ParVector x); HYPRE_Int HYPRE_ParCSRFlexGMRESSetKDim(HYPRE_Solver solver, HYPRE_Int k_dim); HYPRE_Int HYPRE_ParCSRFlexGMRESSetTol(HYPRE_Solver solver, HYPRE_Real tol); HYPRE_Int HYPRE_ParCSRFlexGMRESSetAbsoluteTol(HYPRE_Solver solver, HYPRE_Real a_tol); /* * RE-VISIT **/ HYPRE_Int HYPRE_ParCSRFlexGMRESSetMinIter(HYPRE_Solver solver, HYPRE_Int min_iter); HYPRE_Int HYPRE_ParCSRFlexGMRESSetMaxIter(HYPRE_Solver solver, HYPRE_Int max_iter); HYPRE_Int HYPRE_ParCSRFlexGMRESSetPrecond(HYPRE_Solver solver, HYPRE_PtrToParSolverFcn precond, HYPRE_PtrToParSolverFcn precond_setup, HYPRE_Solver precond_solver); HYPRE_Int HYPRE_ParCSRFlexGMRESGetPrecond(HYPRE_Solver solver, HYPRE_Solver *precond_data); HYPRE_Int HYPRE_ParCSRFlexGMRESSetLogging(HYPRE_Solver solver, HYPRE_Int logging); HYPRE_Int HYPRE_ParCSRFlexGMRESSetPrintLevel(HYPRE_Solver solver, HYPRE_Int print_level); HYPRE_Int HYPRE_ParCSRFlexGMRESGetNumIterations(HYPRE_Solver solver, HYPRE_Int *num_iterations); HYPRE_Int HYPRE_ParCSRFlexGMRESGetFinalRelativeResidualNorm(HYPRE_Solver solver, HYPRE_Real *norm); HYPRE_Int HYPRE_ParCSRFlexGMRESGetResidual(HYPRE_Solver solver, HYPRE_ParVector *residual); HYPRE_Int HYPRE_ParCSRFlexGMRESSetModifyPC( HYPRE_Solver solver, HYPRE_PtrToModifyPCFcn modify_pc); /**@}*/ /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ /** * @name ParCSR LGMRES Solver * * These routines should be used in conjunction with the generic interface in * \ref KrylovSolvers. * * @{ **/ /** * Create a solver object. **/ HYPRE_Int HYPRE_ParCSRLGMRESCreate(MPI_Comm comm, HYPRE_Solver *solver); /** * Destroy a solver object. **/ HYPRE_Int HYPRE_ParCSRLGMRESDestroy(HYPRE_Solver solver); HYPRE_Int HYPRE_ParCSRLGMRESSetup(HYPRE_Solver solver, HYPRE_ParCSRMatrix A, HYPRE_ParVector b, HYPRE_ParVector x); HYPRE_Int HYPRE_ParCSRLGMRESSolve(HYPRE_Solver solver, HYPRE_ParCSRMatrix A, HYPRE_ParVector b, HYPRE_ParVector x); HYPRE_Int HYPRE_ParCSRLGMRESSetKDim(HYPRE_Solver solver, HYPRE_Int k_dim); HYPRE_Int HYPRE_ParCSRLGMRESSetAugDim(HYPRE_Solver solver, HYPRE_Int aug_dim); HYPRE_Int HYPRE_ParCSRLGMRESSetTol(HYPRE_Solver solver, HYPRE_Real tol); HYPRE_Int HYPRE_ParCSRLGMRESSetAbsoluteTol(HYPRE_Solver solver, HYPRE_Real a_tol); /* * RE-VISIT **/ HYPRE_Int HYPRE_ParCSRLGMRESSetMinIter(HYPRE_Solver solver, HYPRE_Int min_iter); HYPRE_Int HYPRE_ParCSRLGMRESSetMaxIter(HYPRE_Solver solver, HYPRE_Int max_iter); HYPRE_Int HYPRE_ParCSRLGMRESSetPrecond(HYPRE_Solver solver, HYPRE_PtrToParSolverFcn precond, HYPRE_PtrToParSolverFcn precond_setup, HYPRE_Solver precond_solver); HYPRE_Int HYPRE_ParCSRLGMRESGetPrecond(HYPRE_Solver solver, HYPRE_Solver *precond_data); HYPRE_Int HYPRE_ParCSRLGMRESSetLogging(HYPRE_Solver solver, HYPRE_Int logging); HYPRE_Int HYPRE_ParCSRLGMRESSetPrintLevel(HYPRE_Solver solver, HYPRE_Int print_level); HYPRE_Int HYPRE_ParCSRLGMRESGetNumIterations(HYPRE_Solver solver, HYPRE_Int *num_iterations); HYPRE_Int HYPRE_ParCSRLGMRESGetFinalRelativeResidualNorm(HYPRE_Solver solver, HYPRE_Real *norm); HYPRE_Int HYPRE_ParCSRLGMRESGetResidual(HYPRE_Solver solver, HYPRE_ParVector *residual); /**@}*/ /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ /** * @name ParCSR BiCGSTAB Solver * * These routines should be used in conjunction with the generic interface in * \ref KrylovSolvers. * * @{ **/ /** * Create a solver object **/ HYPRE_Int HYPRE_ParCSRBiCGSTABCreate(MPI_Comm comm, HYPRE_Solver *solver); /** * Destroy a solver object. **/ HYPRE_Int HYPRE_ParCSRBiCGSTABDestroy(HYPRE_Solver solver); HYPRE_Int HYPRE_ParCSRBiCGSTABSetup(HYPRE_Solver solver, HYPRE_ParCSRMatrix A, HYPRE_ParVector b, HYPRE_ParVector x); HYPRE_Int HYPRE_ParCSRBiCGSTABSolve(HYPRE_Solver solver, HYPRE_ParCSRMatrix A, HYPRE_ParVector b, HYPRE_ParVector x); HYPRE_Int HYPRE_ParCSRBiCGSTABSetTol(HYPRE_Solver solver, HYPRE_Real tol); HYPRE_Int HYPRE_ParCSRBiCGSTABSetAbsoluteTol(HYPRE_Solver solver, HYPRE_Real a_tol); HYPRE_Int HYPRE_ParCSRBiCGSTABSetMinIter(HYPRE_Solver solver, HYPRE_Int min_iter); HYPRE_Int HYPRE_ParCSRBiCGSTABSetMaxIter(HYPRE_Solver solver, HYPRE_Int max_iter); HYPRE_Int HYPRE_ParCSRBiCGSTABSetStopCrit(HYPRE_Solver solver, HYPRE_Int stop_crit); HYPRE_Int HYPRE_ParCSRBiCGSTABSetPrecond(HYPRE_Solver solver, HYPRE_PtrToParSolverFcn precond, HYPRE_PtrToParSolverFcn precond_setup, HYPRE_Solver precond_solver); HYPRE_Int HYPRE_ParCSRBiCGSTABGetPrecond(HYPRE_Solver solver, HYPRE_Solver *precond_data); HYPRE_Int HYPRE_ParCSRBiCGSTABSetLogging(HYPRE_Solver solver, HYPRE_Int logging); HYPRE_Int HYPRE_ParCSRBiCGSTABSetPrintLevel(HYPRE_Solver solver, HYPRE_Int print_level); HYPRE_Int HYPRE_ParCSRBiCGSTABGetNumIterations(HYPRE_Solver solver, HYPRE_Int *num_iterations); HYPRE_Int HYPRE_ParCSRBiCGSTABGetFinalRelativeResidualNorm(HYPRE_Solver solver, HYPRE_Real *norm); HYPRE_Int HYPRE_ParCSRBiCGSTABGetResidual(HYPRE_Solver solver, HYPRE_ParVector *residual); /**@}*/ /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ /** * @name ParCSR Hybrid Solver * * @{ **/ /** * Create solver object **/ HYPRE_Int HYPRE_ParCSRHybridCreate(HYPRE_Solver *solver); /** * Destroy solver object **/ HYPRE_Int HYPRE_ParCSRHybridDestroy(HYPRE_Solver solver); /** * Setup the hybrid solver * @param solver [IN] object to be set up. * @param A [IN] ParCSR matrix used to construct the solver/preconditioner. * @param b Ignored by this function. * @param x Ignored by this function. **/ HYPRE_Int HYPRE_ParCSRHybridSetup(HYPRE_Solver solver, HYPRE_ParCSRMatrix A, HYPRE_ParVector b, HYPRE_ParVector x); /** * Solve linear system * @param solver [IN] solver or preconditioner object to be applied. * @param A [IN] ParCSR matrix, matrix of the linear system to be solved * @param b [IN] right hand side of the linear system to be solved * @param x [OUT] approximated solution of the linear system to be solved **/ HYPRE_Int HYPRE_ParCSRHybridSolve(HYPRE_Solver solver, HYPRE_ParCSRMatrix A, HYPRE_ParVector b, HYPRE_ParVector x); /** * Set the convergence tolerance for the Krylov solver. The default is 1.e-6. **/ HYPRE_Int HYPRE_ParCSRHybridSetTol(HYPRE_Solver solver, HYPRE_Real tol); /** * Set the absolute convergence tolerance for the Krylov solver. The default is 0. **/ HYPRE_Int HYPRE_ParCSRHybridSetAbsoluteTol(HYPRE_Solver solver, HYPRE_Real tol); /** * Set the desired convergence factor **/ HYPRE_Int HYPRE_ParCSRHybridSetConvergenceTol(HYPRE_Solver solver, HYPRE_Real cf_tol); /** * Set the maximal number of iterations for the diagonally * preconditioned solver **/ HYPRE_Int HYPRE_ParCSRHybridSetDSCGMaxIter(HYPRE_Solver solver, HYPRE_Int dscg_max_its); /** * Set the maximal number of iterations for the AMG * preconditioned solver **/ HYPRE_Int HYPRE_ParCSRHybridSetPCGMaxIter(HYPRE_Solver solver, HYPRE_Int pcg_max_its); /* * **/ HYPRE_Int HYPRE_ParCSRHybridSetSetupType(HYPRE_Solver solver, HYPRE_Int setup_type); /** * Set the desired solver type. There are the following options: * - 1 : PCG (default) * - 2 : GMRES * - 3 : BiCGSTAB **/ HYPRE_Int HYPRE_ParCSRHybridSetSolverType(HYPRE_Solver solver, HYPRE_Int solver_type); /** * (Optional) Set recompute residual (don't rely on 3-term recurrence). **/ HYPRE_Int HYPRE_ParCSRHybridSetRecomputeResidual( HYPRE_Solver solver, HYPRE_Int recompute_residual ); /** * (Optional) Get recompute residual option. **/ HYPRE_Int HYPRE_ParCSRHybridGetRecomputeResidual( HYPRE_Solver solver, HYPRE_Int *recompute_residual ); /** * (Optional) Set recompute residual period (don't rely on 3-term recurrence). * * Recomputes residual after every specified number of iterations. **/ HYPRE_Int HYPRE_ParCSRHybridSetRecomputeResidualP( HYPRE_Solver solver, HYPRE_Int recompute_residual_p ); /** * (Optional) Get recompute residual period option. **/ HYPRE_Int HYPRE_ParCSRHybridGetRecomputeResidualP( HYPRE_Solver solver, HYPRE_Int *recompute_residual_p ); /** * Set the Krylov dimension for restarted GMRES. * The default is 5. **/ HYPRE_Int HYPRE_ParCSRHybridSetKDim(HYPRE_Solver solver, HYPRE_Int k_dim); /** * Set the type of norm for PCG. **/ HYPRE_Int HYPRE_ParCSRHybridSetTwoNorm(HYPRE_Solver solver, HYPRE_Int two_norm); /** * RE-VISIT **/ HYPRE_Int HYPRE_ParCSRHybridSetStopCrit(HYPRE_Solver solver, HYPRE_Int stop_crit); /** * **/ HYPRE_Int HYPRE_ParCSRHybridSetRelChange(HYPRE_Solver solver, HYPRE_Int rel_change); /** * Set preconditioner if wanting to use one that is not set up by * the hybrid solver. **/ HYPRE_Int HYPRE_ParCSRHybridSetPrecond(HYPRE_Solver solver, HYPRE_PtrToParSolverFcn precond, HYPRE_PtrToParSolverFcn precond_setup, HYPRE_Solver precond_solver); /** * Set logging parameter (default: 0, no logging). **/ HYPRE_Int HYPRE_ParCSRHybridSetLogging(HYPRE_Solver solver, HYPRE_Int logging); /** * Set print level (default: 0, no printing) * 2 will print residual norms per iteration * 10 will print AMG setup information if AMG is used * 12 both Setup information and iterations. **/ HYPRE_Int HYPRE_ParCSRHybridSetPrintLevel(HYPRE_Solver solver, HYPRE_Int print_level); /** * (Optional) Sets AMG strength threshold. The default is 0.25. * For elasticity problems, a larger strength threshold, such as 0.7 or 0.8, * is often better. **/ HYPRE_Int HYPRE_ParCSRHybridSetStrongThreshold(HYPRE_Solver solver, HYPRE_Real strong_threshold); /** * (Optional) Sets a parameter to modify the definition of strength for * diagonal dominant portions of the matrix. The default is 0.9. * If \e max_row_sum is 1, no checking for diagonally dominant rows is * performed. **/ HYPRE_Int HYPRE_ParCSRHybridSetMaxRowSum(HYPRE_Solver solver, HYPRE_Real max_row_sum); /** * (Optional) Defines a truncation factor for the interpolation. * The default is 0. **/ HYPRE_Int HYPRE_ParCSRHybridSetTruncFactor(HYPRE_Solver solver, HYPRE_Real trunc_factor); /** * (Optional) Defines the maximal number of elements per row for the interpolation. * The default is 0. **/ HYPRE_Int HYPRE_ParCSRHybridSetPMaxElmts(HYPRE_Solver solver, HYPRE_Int P_max_elmts); /** * (Optional) Defines the maximal number of levels used for AMG. * The default is 25. **/ HYPRE_Int HYPRE_ParCSRHybridSetMaxLevels(HYPRE_Solver solver, HYPRE_Int max_levels); /** * (Optional) Defines whether local or global measures are used. **/ HYPRE_Int HYPRE_ParCSRHybridSetMeasureType(HYPRE_Solver solver, HYPRE_Int measure_type); /** * (Optional) Defines which parallel coarsening algorithm is used. * There are the following options for \e coarsen_type: * * - 0 : CLJP-coarsening (a parallel coarsening algorithm using independent sets). * - 1 : classical Ruge-Stueben coarsening on each processor, no boundary treatment * - 3 : classical Ruge-Stueben coarsening on each processor, followed by a third * pass, which adds coarse points on the boundaries * - 6 : Falgout coarsening (uses 1 first, followed by CLJP using the interior coarse * points generated by 1 as its first independent set) * - 7 : CLJP-coarsening (using a fixed random vector, for debugging purposes only) * - 8 : PMIS-coarsening (a parallel coarsening algorithm using independent sets * with lower complexities than CLJP, might also lead to slower convergence) * - 9 : PMIS-coarsening (using a fixed random vector, for debugging purposes only) * - 10 : HMIS-coarsening (uses one pass Ruge-Stueben on each processor independently, * followed by PMIS using the interior C-points as its first independent set) * - 11 : one-pass Ruge-Stueben coarsening on each processor, no boundary treatment * * The default is 10. **/ HYPRE_Int HYPRE_ParCSRHybridSetCoarsenType(HYPRE_Solver solver, HYPRE_Int coarsen_type); /** * (Optional) Specifies which interpolation operator is used * The default is ext+i interpolation truncated to at most 4 elements per row. **/ HYPRE_Int HYPRE_ParCSRHybridSetInterpType(HYPRE_Solver solver, HYPRE_Int interp_type); /** * (Optional) Defines the type of cycle. * For a V-cycle, set \e cycle_type to 1, for a W-cycle * set \e cycle_type to 2. The default is 1. **/ HYPRE_Int HYPRE_ParCSRHybridSetCycleType(HYPRE_Solver solver, HYPRE_Int cycle_type); /* * **/ HYPRE_Int HYPRE_ParCSRHybridSetGridRelaxType(HYPRE_Solver solver, HYPRE_Int *grid_relax_type); /* * **/ HYPRE_Int HYPRE_ParCSRHybridSetGridRelaxPoints(HYPRE_Solver solver, HYPRE_Int **grid_relax_points); /** * (Optional) Sets the number of sweeps. On the finest level, the up and * the down cycle the number of sweeps are set to \e num_sweeps and on the * coarsest level to 1. The default is 1. **/ HYPRE_Int HYPRE_ParCSRHybridSetNumSweeps(HYPRE_Solver solver, HYPRE_Int num_sweeps); /** * (Optional) Sets the number of sweeps at a specified cycle. * There are the following options for \e k: * * - 1 : the down cycle * - 2 : the up cycle * - 3 : the coarsest level **/ HYPRE_Int HYPRE_ParCSRHybridSetCycleNumSweeps(HYPRE_Solver solver, HYPRE_Int num_sweeps, HYPRE_Int k); /** * (Optional) Defines the smoother to be used. It uses the given * smoother on the fine grid, the up and * the down cycle and sets the solver on the coarsest level to Gaussian * elimination (9). The default is l1-Gauss-Seidel, forward solve on the down * cycle (13) and backward solve on the up cycle (14). * * There are the following options for \e relax_type: * * - 0 : Jacobi * - 1 : Gauss-Seidel, sequential (very slow!) * - 2 : Gauss-Seidel, interior points in parallel, boundary sequential (slow!) * - 3 : hybrid Gauss-Seidel or SOR, forward solve * - 4 : hybrid Gauss-Seidel or SOR, backward solve * - 6 : hybrid symmetric Gauss-Seidel or SSOR * - 8 : hybrid symmetric l1-Gauss-Seidel or SSOR * - 13 : l1-Gauss-Seidel, forward solve * - 14 : l1-Gauss-Seidel, backward solve * - 18 : l1-Jacobi * - 9 : Gaussian elimination (only on coarsest level) **/ HYPRE_Int HYPRE_ParCSRHybridSetRelaxType(HYPRE_Solver solver, HYPRE_Int relax_type); /** * (Optional) Defines the smoother at a given cycle. * For options of \e relax_type see * description of HYPRE_BoomerAMGSetRelaxType). Options for k are * * - 1 : the down cycle * - 2 : the up cycle * - 3 : the coarsest level **/ HYPRE_Int HYPRE_ParCSRHybridSetCycleRelaxType(HYPRE_Solver solver, HYPRE_Int relax_type, HYPRE_Int k); /** * (Optional) Defines in which order the points are relaxed. There are * the following options for \e relax_order: * * - 0 : the points are relaxed in natural or lexicographic order on each processor * - 1 : CF-relaxation is used, i.e on the fine grid and the down cycle the * coarse points are relaxed first, followed by the fine points; on the * up cycle the F-points are relaxed first, followed by the C-points. * On the coarsest level, if an iterative scheme is used, the points * are relaxed in lexicographic order. * * The default is 0 (CF-relaxation). **/ HYPRE_Int HYPRE_ParCSRHybridSetRelaxOrder(HYPRE_Solver solver, HYPRE_Int relax_order); /** * (Optional) Defines the relaxation weight for smoothed Jacobi and hybrid SOR * on all levels. * * Values for \e relax_wt are * - > 0 : this assigns the given relaxation weight on all levels * - = 0 : the weight is determined on each level with the estimate * \f$3 \over {4\|D^{-1/2}AD^{-1/2}\|}\f$, where \f$D\f$ is the diagonal of \f$A\f$ * (this should only be used with Jacobi) * - = -k : the relaxation weight is determined with at most k CG steps on each level * (this should only be used for symmetric positive definite problems) * * The default is 1. **/ HYPRE_Int HYPRE_ParCSRHybridSetRelaxWt(HYPRE_Solver solver, HYPRE_Real relax_wt); /** * (Optional) Defines the relaxation weight for smoothed Jacobi and hybrid SOR * on the user defined level. Note that the finest level is denoted 0, the * next coarser level 1, etc. For nonpositive \e relax_weight, the parameter is * determined on the given level as described for HYPRE_BoomerAMGSetRelaxWt. * The default is 1. **/ HYPRE_Int HYPRE_ParCSRHybridSetLevelRelaxWt(HYPRE_Solver solver, HYPRE_Real relax_wt, HYPRE_Int level); /** * (Optional) Defines the outer relaxation weight for hybrid SOR and SSOR * on all levels. * * Values for \e outer_wt are * - > 0 : this assigns the same outer relaxation weight omega on each level * - = -k : an outer relaxation weight is determined with at most k CG steps on each level * (this only makes sense for symmetric positive definite problems and smoothers * such as SSOR) * * The default is 1. **/ HYPRE_Int HYPRE_ParCSRHybridSetOuterWt(HYPRE_Solver solver, HYPRE_Real outer_wt); /** * (Optional) Defines the outer relaxation weight for hybrid SOR or SSOR * on the user defined level. Note that the finest level is denoted 0, the * next coarser level 1, etc. For nonpositive omega, the parameter is * determined on the given level as described for HYPRE_BoomerAMGSetOuterWt. * The default is 1. **/ HYPRE_Int HYPRE_ParCSRHybridSetLevelOuterWt(HYPRE_Solver solver, HYPRE_Real outer_wt, HYPRE_Int level); /** * (Optional) Defines the maximal coarse grid size. * The default is 9. **/ HYPRE_Int HYPRE_ParCSRHybridSetMaxCoarseSize(HYPRE_Solver solver, HYPRE_Int max_coarse_size); /** * (Optional) Defines the minimal coarse grid size. * The default is 0. **/ HYPRE_Int HYPRE_ParCSRHybridSetMinCoarseSize(HYPRE_Solver solver, HYPRE_Int min_coarse_size); /** * (Optional) enables redundant coarse grid size. If the system size becomes * smaller than seq_threshold, sequential AMG is used on all remaining processors. * The default is 0. **/ HYPRE_Int HYPRE_ParCSRHybridSetSeqThreshold(HYPRE_Solver solver, HYPRE_Int seq_threshold); /** * **/ HYPRE_Int HYPRE_ParCSRHybridSetRelaxWeight(HYPRE_Solver solver, HYPRE_Real *relax_weight); /** * **/ HYPRE_Int HYPRE_ParCSRHybridSetOmega(HYPRE_Solver solver, HYPRE_Real *omega); /** * (Optional) Defines the number of levels of aggressive coarsening, * starting with the finest level. * The default is 0, i.e. no aggressive coarsening. **/ HYPRE_Int HYPRE_ParCSRHybridSetAggNumLevels(HYPRE_Solver solver, HYPRE_Int agg_num_levels); /** * (Optional) Defines the interpolation used on levels of aggressive coarsening * The default is 4, i.e. multipass interpolation. * The following options exist: * * - 1 : 2-stage extended+i interpolation * - 2 : 2-stage standard interpolation * - 3 : 2-stage extended interpolation * - 4 : multipass interpolation * - 5 : 2-stage extended interpolation in matrix-matrix form * - 6 : 2-stage extended+i interpolation in matrix-matrix form * - 7 : 2-stage extended+e interpolation in matrix-matrix form **/ HYPRE_Int HYPRE_ParCSRHybridSetAggInterpType( HYPRE_Solver solver, HYPRE_Int agg_interp_type); /** * (Optional) Defines the degree of aggressive coarsening. * The default is 1, which leads to the most aggressive coarsening. * Setting \e num_paths to 2 will increase complexity somewhat, * but can lead to better convergence.**/ HYPRE_Int HYPRE_ParCSRHybridSetNumPaths(HYPRE_Solver solver, HYPRE_Int num_paths); /** * (Optional) Sets the size of the system of PDEs, if using the systems version. * The default is 1. **/ HYPRE_Int HYPRE_ParCSRHybridSetNumFunctions(HYPRE_Solver solver, HYPRE_Int num_functions); /** * (Optional) Sets the mapping that assigns the function to each variable, * if using the systems version. If no assignment is made and the number of * functions is k > 1, the mapping generated is (0,1,...,k-1,0,1,...,k-1,...). **/ HYPRE_Int HYPRE_ParCSRHybridSetDofFunc(HYPRE_Solver solver, HYPRE_Int *dof_func); /** * (Optional) Sets whether to use the nodal systems version. * The default is 0 (the unknown based approach). **/ HYPRE_Int HYPRE_ParCSRHybridSetNodal(HYPRE_Solver solver, HYPRE_Int nodal); /** * (Optional) Sets whether to store local transposed interpolation * The default is 0 (don't store). **/ HYPRE_Int HYPRE_ParCSRHybridSetKeepTranspose(HYPRE_Solver solver, HYPRE_Int keepT); /** * (Optional) Sets whether to use non-Galerkin option * The default is no non-Galerkin option * num_levels sets the number of levels where to use it * nongalerkin_tol contains the tolerances for levels **/ HYPRE_Int HYPRE_ParCSRHybridSetNonGalerkinTol(HYPRE_Solver solver, HYPRE_Int num_levels, HYPRE_Real *nongalerkin_tol); /** * Retrieves the total number of iterations. **/ HYPRE_Int HYPRE_ParCSRHybridGetNumIterations(HYPRE_Solver solver, HYPRE_Int *num_its); /** * Retrieves the number of iterations used by the diagonally scaled solver. **/ HYPRE_Int HYPRE_ParCSRHybridGetDSCGNumIterations(HYPRE_Solver solver, HYPRE_Int *dscg_num_its); /** * Retrieves the number of iterations used by the AMG preconditioned solver. **/ HYPRE_Int HYPRE_ParCSRHybridGetPCGNumIterations(HYPRE_Solver solver, HYPRE_Int *pcg_num_its); /** * Retrieves the final relative residual norm. **/ HYPRE_Int HYPRE_ParCSRHybridGetFinalRelativeResidualNorm(HYPRE_Solver solver, HYPRE_Real *norm); /* Is this a retired function? (RDF) */ HYPRE_Int HYPRE_ParCSRHybridSetNumGridSweeps(HYPRE_Solver solver, HYPRE_Int *num_grid_sweeps); HYPRE_Int HYPRE_ParCSRHybridGetSetupSolveTime( HYPRE_Solver solver, HYPRE_Real *time ); /**@}*/ /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ /* * @name Schwarz Solver **/ HYPRE_Int HYPRE_SchwarzCreate(HYPRE_Solver *solver); HYPRE_Int HYPRE_SchwarzDestroy(HYPRE_Solver solver); HYPRE_Int HYPRE_SchwarzSetup(HYPRE_Solver solver, HYPRE_ParCSRMatrix A, HYPRE_ParVector b, HYPRE_ParVector x); HYPRE_Int HYPRE_SchwarzSolve(HYPRE_Solver solver, HYPRE_ParCSRMatrix A, HYPRE_ParVector b, HYPRE_ParVector x); HYPRE_Int HYPRE_SchwarzSetVariant(HYPRE_Solver solver, HYPRE_Int variant); HYPRE_Int HYPRE_SchwarzSetOverlap(HYPRE_Solver solver, HYPRE_Int overlap); HYPRE_Int HYPRE_SchwarzSetDomainType(HYPRE_Solver solver, HYPRE_Int domain_type); HYPRE_Int HYPRE_SchwarzSetRelaxWeight(HYPRE_Solver solver, HYPRE_Real relax_weight); HYPRE_Int HYPRE_SchwarzSetDomainStructure(HYPRE_Solver solver, HYPRE_CSRMatrix domain_structure); HYPRE_Int HYPRE_SchwarzSetNumFunctions(HYPRE_Solver solver, HYPRE_Int num_functions); HYPRE_Int HYPRE_SchwarzSetDofFunc(HYPRE_Solver solver, HYPRE_Int *dof_func); HYPRE_Int HYPRE_SchwarzSetNonSymm(HYPRE_Solver solver, HYPRE_Int use_nonsymm); /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ /* * @name ParCSR CGNR Solver **/ HYPRE_Int HYPRE_ParCSRCGNRCreate(MPI_Comm comm, HYPRE_Solver *solver); HYPRE_Int HYPRE_ParCSRCGNRDestroy(HYPRE_Solver solver); HYPRE_Int HYPRE_ParCSRCGNRSetup(HYPRE_Solver solver, HYPRE_ParCSRMatrix A, HYPRE_ParVector b, HYPRE_ParVector x); HYPRE_Int HYPRE_ParCSRCGNRSolve(HYPRE_Solver solver, HYPRE_ParCSRMatrix A, HYPRE_ParVector b, HYPRE_ParVector x); HYPRE_Int HYPRE_ParCSRCGNRSetTol(HYPRE_Solver solver, HYPRE_Real tol); HYPRE_Int HYPRE_ParCSRCGNRSetMinIter(HYPRE_Solver solver, HYPRE_Int min_iter); HYPRE_Int HYPRE_ParCSRCGNRSetMaxIter(HYPRE_Solver solver, HYPRE_Int max_iter); HYPRE_Int HYPRE_ParCSRCGNRSetStopCrit(HYPRE_Solver solver, HYPRE_Int stop_crit); HYPRE_Int HYPRE_ParCSRCGNRSetPrecond(HYPRE_Solver solver, HYPRE_PtrToParSolverFcn precond, HYPRE_PtrToParSolverFcn precondT, HYPRE_PtrToParSolverFcn precond_setup, HYPRE_Solver precond_solver); HYPRE_Int HYPRE_ParCSRCGNRGetPrecond(HYPRE_Solver solver, HYPRE_Solver *precond_data); HYPRE_Int HYPRE_ParCSRCGNRSetLogging(HYPRE_Solver solver, HYPRE_Int logging); HYPRE_Int HYPRE_ParCSRCGNRGetNumIterations(HYPRE_Solver solver, HYPRE_Int *num_iterations); HYPRE_Int HYPRE_ParCSRCGNRGetFinalRelativeResidualNorm(HYPRE_Solver solver, HYPRE_Real *norm); /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ /** * @name ParCSR MGR Solver * * Parallel multigrid reduction solver and preconditioner. * This solver or preconditioner is designed with systems of * PDEs in mind. However, it can also be used for scalar linear * systems, particularly for problems where the user can exploit * information from the physics of the problem. In this way, the * MGR solver could potentially be used as a foundation * for a physics-based preconditioner. * * @{ **/ #ifdef HYPRE_USING_DSUPERLU /** * Create a MGR direct solver object **/ HYPRE_Int HYPRE_MGRDirectSolverCreate( HYPRE_Solver *solver ); /** * Destroy a MGR direct solver object **/ HYPRE_Int HYPRE_MGRDirectSolverDestroy( HYPRE_Solver solver ); /** * Setup the MGR direct solver using SuperLU_dist * * @param solver [IN] object to be set up. * @param A [IN] ParCSR matrix used to construct the solver/preconditioner. * @param b right-hand-side of the linear system to be solved (Ignored by this function). * @param x approximate solution of the linear system to be solved (Ignored by this function). **/ HYPRE_Int HYPRE_MGRDirectSolverSetup( HYPRE_Solver solver, HYPRE_ParCSRMatrix A, HYPRE_ParVector b, HYPRE_ParVector x ); /** * Solve the system using SuperLU_dist. * * @param solver [IN] solver or preconditioner object to be applied. * @param A [IN] ParCSR matrix, matrix of the linear system to be solved (Ignored by this function). * @param b [IN] right hand side of the linear system to be solved * @param x [OUT] approximated solution of the linear system to be solved **/ HYPRE_Int HYPRE_MGRDirectSolverSolve( HYPRE_Solver solver, HYPRE_ParCSRMatrix A, HYPRE_ParVector b, HYPRE_ParVector x ); #endif /** * Create a solver object **/ HYPRE_Int HYPRE_MGRCreate( HYPRE_Solver *solver ); /** * Destroy a solver object **/ HYPRE_Int HYPRE_MGRDestroy( HYPRE_Solver solver ); /** * Setup the MGR solver or preconditioner. * If used as a preconditioner, this function should be passed * to the iterative solver \e SetPrecond function. * * @param solver [IN] object to be set up. * @param A [IN] ParCSR matrix used to construct the solver/preconditioner. * @param b right-hand-side of the linear system to be solved (Ignored by this function). * @param x approximate solution of the linear system to be solved (Ignored by this function). **/ HYPRE_Int HYPRE_MGRSetup( HYPRE_Solver solver, HYPRE_ParCSRMatrix A, HYPRE_ParVector b, HYPRE_ParVector x ); /** * Solve the system or apply MGR as a preconditioner. * If used as a preconditioner, this function should be passed * to the iterative solver \e SetPrecond function. * * @param solver [IN] solver or preconditioner object to be applied. * @param A [IN] ParCSR matrix, matrix of the linear system to be solved * @param b [IN] right hand side of the linear system to be solved * @param x [OUT] approximated solution of the linear system to be solved **/ HYPRE_Int HYPRE_MGRSolve( HYPRE_Solver solver, HYPRE_ParCSRMatrix A, HYPRE_ParVector b, HYPRE_ParVector x ); /** * Set the block data assuming that the physical variables are ordered contiguously, * i.e. p_1, p_2, ..., p_n, s_1, s_2, ..., s_n, ... * * @param solver [IN] solver or preconditioner object * @param block_size [IN] system block size * @param max_num_levels [IN] maximum number of reduction levels * @param num_block_coarse_points [IN] number of coarse points per block per level * @param block_coarse_indexes [IN] index for each block coarse point per level **/ HYPRE_Int HYPRE_MGRSetCpointsByContiguousBlock( HYPRE_Solver solver, HYPRE_Int block_size, HYPRE_Int max_num_levels, HYPRE_BigInt *idx_array, HYPRE_Int *num_block_coarse_points, HYPRE_Int **block_coarse_indexes); /** * Set the block data (by grid points) and prescribe the coarse indexes per block * for each reduction level. * * @param solver [IN] solver or preconditioner object * @param block_size [IN] system block size * @param max_num_levels [IN] maximum number of reduction levels * @param num_block_coarse_points [IN] number of coarse points per block per level * @param block_coarse_indexes [IN] index for each block coarse point per level **/ HYPRE_Int HYPRE_MGRSetCpointsByBlock( HYPRE_Solver solver, HYPRE_Int block_size, HYPRE_Int max_num_levels, HYPRE_Int *num_block_coarse_points, HYPRE_Int **block_coarse_indexes); /** * Set the coarse indices for the levels using an array of tags for all the * local degrees of freedom. * TODO: Rename the function to make it more descriptive. * * @param solver [IN] solver or preconditioner object * @param block_size [IN] system block size * @param max_num_levels [IN] maximum number of reduction levels * @param num_block_coarse_points [IN] number of coarse points per block per level * @param lvl_block_coarse_indexes [IN] indices for the coarse points per level * @param point_marker_array [IN] array of tags for the local degrees of freedom **/ HYPRE_Int HYPRE_MGRSetCpointsByPointMarkerArray( HYPRE_Solver solver, HYPRE_Int block_size, HYPRE_Int max_num_levels, HYPRE_Int *num_block_coarse_points, HYPRE_Int **lvl_block_coarse_indexes, HYPRE_Int *point_marker_array); /** * (Optional) Set non C-points to F-points. * This routine determines how the coarse points are selected for the next level * reduction. Options for \e nonCptToFptFlag are: * * - 0 : Allow points not prescribed as C points to be potentially set as C points * using classical AMG coarsening strategies (currently uses CLJP-coarsening). * - 1 : Fix points not prescribed as C points to be F points for the next reduction * **/ HYPRE_Int HYPRE_MGRSetNonCpointsToFpoints( HYPRE_Solver solver, HYPRE_Int nonCptToFptFlag); /** * (Optional) Set maximum number of coarsening (or reduction) levels. * The default is 10. **/ HYPRE_Int HYPRE_MGRSetMaxCoarseLevels( HYPRE_Solver solver, HYPRE_Int maxlev ); /** * (Optional) Set the system block size. * This should match the block size set in the MGRSetCpointsByBlock function. * The default is 1. **/ HYPRE_Int HYPRE_MGRSetBlockSize( HYPRE_Solver solver, HYPRE_Int bsize ); /** * (Optional) Defines indexes of coarse nodes to be kept to the coarsest level. * These indexes are passed down through the MGR hierarchy to the coarsest grid * of the coarse grid (BoomerAMG) solver. * * @param solver [IN] solver or preconditioner object * @param reserved_coarse_size [IN] number of reserved coarse points * @param reserved_coarse_nodes [IN] (global) indexes of reserved coarse points **/ HYPRE_Int HYPRE_MGRSetReservedCoarseNodes( HYPRE_Solver solver, HYPRE_Int reserved_coarse_size, HYPRE_BigInt *reserved_coarse_nodes ); /** * (Optional) Set the level for reducing the reserved Cpoints before the coarse * grid solve. This is necessary for some applications, such as phase transitions. * The default is 0 (no reduction, i.e. keep the reserved cpoints in the coarse grid solve). * * The default setup for the reduction is as follows: * - Interpolation type: Jacobi (2) * - Restriction type: Injection (0) * - F-relaxation type: LU factorization with pivoting (99) * - Coarse grid type: galerkin (0) **/ HYPRE_Int HYPRE_MGRSetReservedCpointsLevelToKeep( HYPRE_Solver solver, HYPRE_Int level); /** * (Optional) Set the relaxation type for F-relaxation. * Currently supports the following flavors of relaxation types * as described in the \e BoomerAMGSetRelaxType: * \e relax_type 0, 3 - 8, 13, 14, 18. Also supports AMG (options 1 and 2) * and direct solver variants (9, 99, 199). See \e HYPRE_MGRSetLevelFRelaxType for details. **/ HYPRE_Int HYPRE_MGRSetRelaxType(HYPRE_Solver solver, HYPRE_Int relax_type ); /** * (Optional) Set the strategy for F-relaxation. * Options for \e relax_method are: * * - 0 : Single-level relaxation sweeps for F-relaxation as prescribed by \e MGRSetRelaxType * - 1 : Multi-level relaxation strategy for F-relaxation (V(1,0) cycle currently supported). * * NOTE: This function will be removed in favor of \e HYPRE_MGRSetLevelFRelaxType!! **/ HYPRE_Int HYPRE_MGRSetFRelaxMethod(HYPRE_Solver solver, HYPRE_Int relax_method ); /** * (Optional) This function is an extension of HYPRE_MGRSetFRelaxMethod. It allows setting * the F-relaxation strategy for each MGR level. **/ HYPRE_Int HYPRE_MGRSetLevelFRelaxMethod(HYPRE_Solver solver, HYPRE_Int *relax_method ); /** * (Optional) Set the relaxation type for F-relaxation at each level. * This function takes precedence over, and will replace \e HYPRE_MGRSetFRelaxMethod * and HYPRE_MGRSetRelaxType. * Options for \e relax_type entries are: * * - 0, 3 - 8, 13, 14, 18: (as described in \e BoomerAMGSetRelaxType) * - 1 : Multi-level relaxation strategy for F-relaxation (V(1,0) cycle currently supported). * - 2 : AMG * - 9, 99, 199 : Gaussian Elimination variants (GE, GE with pivoting, direct inversion respectively) **/ HYPRE_Int HYPRE_MGRSetLevelFRelaxType(HYPRE_Solver solver, HYPRE_Int *relax_type ); /** * (Optional) Set the strategy for coarse grid computation. * Options for \e cg_method are: * * - 0 : Galerkin coarse grid computation using RAP. * - 1 - 5 : Non-Galerkin coarse grid computation with dropping strategy. * - 1: inv(A_FF) approximated by its (block) diagonal inverse * - 2: CPR-like approximation with inv(A_FF) approximated by its diagonal inverse * - 3: CPR-like approximation with inv(A_FF) approximated by its block diagonal inverse * - 4: inv(A_FF) approximated by sparse approximate inverse * - 5: inv(A_FF) is an empty matrix and coarse level matrix is set to A_CC **/ HYPRE_Int HYPRE_MGRSetCoarseGridMethod(HYPRE_Solver solver, HYPRE_Int *cg_method ); /** * (Optional) Set the maximum number of nonzeros per row of the coarse grid correction * operator computed in the Non-Galerkin approach. Options for \e max_elmts are: * * - 0: keep only the (block) diagonal portion of the correction matrix (default). * - k > 0: keep the (block) diagonal plus the k-th largest entries per row * of the correction matrix. **/ HYPRE_Int HYPRE_MGRSetNonGalerkinMaxElmts(HYPRE_Solver solver, HYPRE_Int max_elmts); /** * (Optional) Set the maximum number of nonzeros per row of the coarse grid correction * operator computed in the Non-Galerkin approach at each MGR level. For options, see * \e HYPRE_MGRSetNonGalerkinMaxElmts. **/ HYPRE_Int HYPRE_MGRSetLevelNonGalerkinMaxElmts(HYPRE_Solver solver, HYPRE_Int *max_elmts); /** * (Optional) Set the number of functions for F-relaxation V-cycle. * For problems like elasticity, one may want to perform coarsening and * interpolation for block matrices. The number of functions corresponds * to the number of scalar PDEs in the system. **/ HYPRE_Int HYPRE_MGRSetLevelFRelaxNumFunctions(HYPRE_Solver solver, HYPRE_Int *num_functions); /** * (Optional) Set the strategy for computing the MGR restriction operator. * * Options for \e restrict_type are: * * - 0 : injection \f$[0 I]\f$ * - 1 : unscaled (not recommended) * - 2 : diagonal scaling (Jacobi) * - 3 : approximate inverse * - 4 : pAIR distance 1 * - 5 : pAIR distance 2 * - 12 : Block Jacobi * - 13 : CPR-like restriction operator * - 14 : (Block) Column-lumped restriction * - else : use classical modified interpolation * * The default is injection. **/ HYPRE_Int HYPRE_MGRSetRestrictType( HYPRE_Solver solver, HYPRE_Int restrict_type); /** * (Optional) This function is an extension of \e HYPRE_MGRSetRestrictType. It allows setting * the restriction operator strategy for each MGR level. **/ HYPRE_Int HYPRE_MGRSetLevelRestrictType( HYPRE_Solver solver, HYPRE_Int *restrict_type); /** * (Optional) Set number of restriction sweeps. * This option is for \e restrict_type > 2. **/ HYPRE_Int HYPRE_MGRSetNumRestrictSweeps( HYPRE_Solver solver, HYPRE_Int nsweeps ); /** * (Optional) Set the strategy for computing the MGR interpolation operator. * Options for \e interp_type are: * * - 0 : injection \f$[0 I]^{T}\f$ * - 1 : L1-Jacobi * - 2 : diagonal scaling (Jacobi) * - 3 : classical modified interpolation * - 4 : approximate inverse * - 12 : Block Jacobi * - else : classical modified interpolation * * The default is diagonal scaling. **/ HYPRE_Int HYPRE_MGRSetInterpType( HYPRE_Solver solver, HYPRE_Int interp_type ); /** * (Optional) This function is an extension of \e HYPRE_MGRSetInterpType. It allows setting * the prolongation (interpolation) operator strategy for each MGR level. **/ HYPRE_Int HYPRE_MGRSetLevelInterpType( HYPRE_Solver solver, HYPRE_Int *interp_type ); /** * (Optional) Set number of relaxation sweeps. * This option is for the "single level" F-relaxation (\e relax_method = 0). **/ HYPRE_Int HYPRE_MGRSetNumRelaxSweeps( HYPRE_Solver solver, HYPRE_Int nsweeps ); /** * (Optional) This function is an extension of \e HYPRE_MGRSetNumRelaxSweeps. It allows setting * the number of single-level relaxation sweeps for each MGR level. **/ HYPRE_Int HYPRE_MGRSetLevelNumRelaxSweeps( HYPRE_Solver solver, HYPRE_Int *nsweeps ); /** * (Optional) Set number of interpolation sweeps. * This option is for \e interp_type > 2. **/ HYPRE_Int HYPRE_MGRSetNumInterpSweeps( HYPRE_Solver solver, HYPRE_Int nsweeps ); /** * (Optional) Set block size for block (global) smoother and interp/restriction. * This option is for \e interp_type/restrict_type == 12, and * \e smooth_type == 0 or 1. **/ HYPRE_Int HYPRE_MGRSetBlockJacobiBlockSize( HYPRE_Solver solver, HYPRE_Int blk_size ); /** * (Optional) Set the fine grid solver. * * @param solver [IN] MGR solver/preconditioner object * @param fine_grid_solver_solve [IN] solve routine * @param fine_grid_solver_setup [IN] setup routine * @param fine_grid_solver [IN] fine grid solver object **/ HYPRE_Int HYPRE_MGRSetFSolver(HYPRE_Solver solver, HYPRE_PtrToParSolverFcn fine_grid_solver_solve, HYPRE_PtrToParSolverFcn fine_grid_solver_setup, HYPRE_Solver fsolver ); /** * (Optional) Set the F-relaxation solver at a given level. * * @param solver [IN] MGR solver/preconditioner object * @param fsolver [IN] F-relaxation solver object * @param level [IN] MGR solver level **/ HYPRE_Int HYPRE_MGRSetFSolverAtLevel(HYPRE_Solver solver, HYPRE_Solver fsolver, HYPRE_Int level ); /** * (Optional) Extract A_FF block from matrix A. * * TODO (VPM): Does this need to be exposed? Move to parcsr_mv? **/ HYPRE_Int HYPRE_MGRBuildAff(HYPRE_ParCSRMatrix A, HYPRE_Int *CF_marker, HYPRE_Int debug_flag, HYPRE_ParCSRMatrix *A_ff); /** * (Optional) Set the coarse grid solver. * Currently uses BoomerAMG. * The default, if not set, is BoomerAMG with default options. * * @param solver [IN] MGR solver/preconditioner object * @param coarse_grid_solver_solve [IN] solve routine for BoomerAMG * @param coarse_grid_solver_setup [IN] setup routine for BoomerAMG * @param coarse_grid_solver [IN] coarse grid solver object **/ HYPRE_Int HYPRE_MGRSetCoarseSolver(HYPRE_Solver solver, HYPRE_PtrToParSolverFcn coarse_grid_solver_solve, HYPRE_PtrToParSolverFcn coarse_grid_solver_setup, HYPRE_Solver coarse_grid_solver ); /** * @brief (Optional) Set the verbosity level for MGR. * * @details Control what information gets printed by specifying the output levels * using this function. Each option corresponds to a specific type of information, and you * can activate several of them at the same time by summing their respective numeric codes, * which are given below: * * - 1: Print MGR's setup information. * - 2: Print MGR's solve information. * - 4: Print MGR's parameters information. * - 8: Set print mode for matrices and vectors to ASCII (binary mode is used by default) * - 16: Print the finest level matrix to NP files where NP is the number of ranks. * - 32: Print the finest level right-hand-side to NP files. * - 64: Print the coarsest level matrix to NP files. * - 128: Print the full MGR hierarchy (operator, interpolation, and restriction). * * @param solver [IN] The solver to configure. * @param print_level [IN] The desired output level. * * @example To print setup information (1); fine matrix (16) and rhs (32) to binary files, * set \c print_level to 49 (1 + 16 + 32). In the previous example, to use ASCII * files for matrices and vectors, set \c print_level to 57 (1 + 8 + 16 + 32). * * @note The default print level is zero, which means no information will be * printed by default. Options starting from 8 are intended for developers' usage. **/ HYPRE_Int HYPRE_MGRSetPrintLevel( HYPRE_Solver solver, HYPRE_Int print_level ); /** * (Optional) Set the print level of the F-relaxation solver **/ HYPRE_Int HYPRE_MGRSetFrelaxPrintLevel( HYPRE_Solver solver, HYPRE_Int print_level ); /** * (Optional) Set the print level of the coarse grid solver **/ HYPRE_Int HYPRE_MGRSetCoarseGridPrintLevel( HYPRE_Solver solver, HYPRE_Int print_level ); /** * (Optional) Set the threshold for dropping small entries on the coarse grid at each level. * No dropping is applied if \e threshold = 0.0 (default). **/ HYPRE_Int HYPRE_MGRSetTruncateCoarseGridThreshold( HYPRE_Solver solver, HYPRE_Real threshold); /** * (Optional) Requests logging of solver diagnostics. * Requests additional computations for diagnostic and similar * data to be logged by the user. Default is 0, do nothing. The latest * residual will be available if logging > 1. **/ HYPRE_Int HYPRE_MGRSetLogging( HYPRE_Solver solver, HYPRE_Int logging ); /** * (Optional) Set maximum number of iterations if used as a solver. * Set this to 1 if MGR is used as a preconditioner. The default is 20. **/ HYPRE_Int HYPRE_MGRSetMaxIter( HYPRE_Solver solver, HYPRE_Int max_iter ); /** * (Optional) Set the convergence tolerance for the MGR solver. * Use tol = 0.0 if MGR is used as a preconditioner. The default is 1.e-6. **/ HYPRE_Int HYPRE_MGRSetTol( HYPRE_Solver solver, HYPRE_Real tol ); /** * (Optional) Determines how many sweeps of global smoothing to do. * Default is 0 (no global smoothing). **/ HYPRE_Int HYPRE_MGRSetMaxGlobalSmoothIters( HYPRE_Solver solver, HYPRE_Int smooth_iter ); /** * (Optional) Determines how many sweeps of global smoothing to do on each level. * Default is 0 (no global smoothing). **/ HYPRE_Int HYPRE_MGRSetLevelSmoothIters( HYPRE_Solver solver, HYPRE_Int *smooth_iters ); /** * (Optional) Set the cycle for global smoothing. * Options for \e global_smooth_cycle are: * - 1 : Pre-smoothing - Down cycle (default) * - 2 : Post-smoothing - Up cycle **/ HYPRE_Int HYPRE_MGRSetGlobalSmoothCycle( HYPRE_Solver solver, HYPRE_Int global_smooth_cycle ); /** * (Optional) Determines type of global smoother. * Options for \e smooth_type are: * * - 0 : block Jacobi (default) * - 1 : block Gauss-Seidel * - 2 : Jacobi * - 3 : Gauss-Seidel, sequential (very slow!) * - 4 : Gauss-Seidel, interior points in parallel, boundary sequential (slow!) * - 5 : hybrid Gauss-Seidel or SOR, forward solve * - 6 : hybrid Gauss-Seidel or SOR, backward solve * - 8 : Euclid (ILU) * - 16 : HYPRE_ILU * - 18 : L1-Jacobi **/ HYPRE_Int HYPRE_MGRSetGlobalSmoothType( HYPRE_Solver solver, HYPRE_Int smooth_type ); /** * @brief Sets the type of global smoother for each level in the multigrid reduction (MGR) solver. * * This function allows the user to specify the type of global smoother to be used at each level * of the multigrid reduction process. The types of smoothers available can be found in the * documentation for \e HYPRE_MGRSetGlobalSmoothType. The smoother type for each level is indicated * by the \e smooth_type array, which should have a size equal to \e max_num_coarse_levels. * * @note This function does not take ownership of the \e smooth_type array. * @note If \e smooth_type is a NULL pointer, a default global smoother (Jacobi) is used for all levels. * @note This call is optional. It is intended for advanced users who need specific control over the * smoothing process at different levels of the solver. If not called, the solver will proceed * with default smoothing parameters. * * @param[in] \e solver The HYPRE solver object to configure. * @param[in] \e smooth_type An array of integers where each value specifies the type of smoother to * be used at the corresponding level. * * @return HYPRE_Int Error code (0 for success, non-zero for failure). * * @see HYPRE_MGRSetGlobalSmoothType for details on global smoother options. */ HYPRE_Int HYPRE_MGRSetLevelSmoothType(HYPRE_Solver solver, HYPRE_Int *smooth_type); /** * @brief Sets the global smoother method for a specified MGR level using a HYPRE solver object. * * This function enables solvers within hypre to be used as complex smoothers for a specific level * within the multigrid reduction (MGR) scheme. Users can configure the solver options and pass the * solver in as the smoother. Currently supported solver options via this interface are ILU and AMG. * * @note Unlike some other setup functions that might require an array to set options across multiple * levels, this function focuses on a single level, identified by the \e level parameter. * * @warning The smoother passed to function takes precedence over the smoother type set for that level * in the MGR hierarchy. * * @param[in,out] \e solver A pointer to the MGR solver object. This object is modified to include the * specified smoother for the given level. * @param[in] \e smoother The HYPRE solver object that specifies the global relaxation method to be used * at the specified level. Currently available choices are BoomerAMG and ILU. * @param[in] \e level The level identifier for which the global relaxation method is to be set. * Must be within the range of the number of levels in the MGR solver. * * @return HYPRE_Int Returns an error code. Success is indicated by 0, while any non-zero value signifies an error. */ HYPRE_Int HYPRE_MGRSetGlobalSmootherAtLevel( HYPRE_Solver solver, HYPRE_Solver smoother, HYPRE_Int level ); /** * (Optional) Return the number of MGR iterations. **/ HYPRE_Int HYPRE_MGRGetNumIterations( HYPRE_Solver solver, HYPRE_Int *num_iterations ); /** * (Optional) Return the relative residual for the coarse level system. **/ HYPRE_Int HYPRE_MGRGetCoarseGridConvergenceFactor( HYPRE_Solver solver, HYPRE_Real *conv_factor ); /** * (Optional) Set the maximum number of nonzeros per row for interpolation operators. **/ HYPRE_Int HYPRE_MGRSetPMaxElmts( HYPRE_Solver solver, HYPRE_Int P_max_elmts ); /** * (Optional) Set the maximum number of nonzeros per row for interpolation operators for each level. **/ HYPRE_Int HYPRE_MGRSetLevelPMaxElmts( HYPRE_Solver solver, HYPRE_Int *P_max_elmts ); /** * (Optional) Return the norm of the final relative residual. **/ HYPRE_Int HYPRE_MGRGetFinalRelativeResidualNorm( HYPRE_Solver solver, HYPRE_Real *res_norm ); /**@}*/ /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ /** * @name ParCSR ILU Solver * * (Parallel) Incomplete LU factorization. * * @{ **/ /** * Create a solver object **/ HYPRE_Int HYPRE_ILUCreate( HYPRE_Solver *solver ); /** * Destroy a solver object **/ HYPRE_Int HYPRE_ILUDestroy( HYPRE_Solver solver ); /** * Setup the ILU solver or preconditioner. * If used as a preconditioner, this function should be passed * to the iterative solver \e SetPrecond function. * * @param solver [IN] object to be set up. * @param A [IN] ParCSR matrix used to construct the solver/preconditioner. * @param b right-hand-side of the linear system to be solved (Ignored by this function). * @param x approximate solution of the linear system to be solved (Ignored by this function). **/ HYPRE_Int HYPRE_ILUSetup( HYPRE_Solver solver, HYPRE_ParCSRMatrix A, HYPRE_ParVector b, HYPRE_ParVector x ); /** * Solve the system or apply ILU as a preconditioner. * If used as a preconditioner, this function should be passed * to the iterative solver \e SetPrecond function. * * @param solver [IN] solver or preconditioner object to be applied. * @param A [IN] ParCSR matrix, matrix of the linear system to be solved * @param b [IN] right hand side of the linear system to be solved * @param x [OUT] approximated solution of the linear system to be solved **/ HYPRE_Int HYPRE_ILUSolve( HYPRE_Solver solver, HYPRE_ParCSRMatrix A, HYPRE_ParVector b, HYPRE_ParVector x ); /** * (Optional) Set maximum number of iterations if used as a solver. * Set this to 1 if ILU is used as a preconditioner. The default is 20. **/ HYPRE_Int HYPRE_ILUSetMaxIter( HYPRE_Solver solver, HYPRE_Int max_iter ); /** * (Optional) Set the algorithm type to compute the ILU factorization. Options are: * * - 0 : Non-iterative algorithm (default) * - 1 : Asynchronous with in-place storage * - 2 : Asynchronous with explicit storage splitting * - 3 : Synchronous with explicit storage splitting * - 4 : Semi-synchronous with explicit storage splitting * * Note: Iterative ILU is available only for zero fill-in and it depends on rocSPARSE. **/ HYPRE_Int HYPRE_ILUSetIterativeSetupType( HYPRE_Solver solver, HYPRE_Int iter_setup_type ); /** * (Optional) Set the compute option for iterative ILU in an additive fashion, i.e.; multiple * options can be turned on by summing their respective numeric codes as given below: * * - 2: Use stopping tolerance to finish the algorithm * - 4: Compute correction norms * - 8: Compute residual norms * - 16: Save convergence history * - 32: Use rocSPARSE's internal COO format * * The iterative ILU algorithm can terminate based on the maximum number of iterations (default) * or a target tolerance (option 2). In the tolerance-based case, the max. number of iterations * is still used to terminate the algorithm in case it does not converge to the requested * tolerance. In addition, the tolerance-based mode uses residual norms by default (option 8). * To use correction norms instead, enable option 4. Lastly, the convergence history for * computing the triangular factors can be saved and printed out by enabling option 16. * * Note: Iterative ILU is available only for zero fill-in, and it depends on rocSPARSE. **/ HYPRE_Int HYPRE_ILUSetIterativeSetupOption( HYPRE_Solver solver, HYPRE_Int iter_setup_option ); /** * (Optional) Set the max. number of iterations for the iterative ILU algorithm. * * Note: Iterative ILU is available only for zero fill-in and it depends on rocSPARSE. **/ HYPRE_Int HYPRE_ILUSetIterativeSetupMaxIter( HYPRE_Solver solver, HYPRE_Int iter_setup_max_iter ); /** * (Optional) Set the stop tolerance for the iterative ILU algorithm. * * Note: Iterative ILU is available only for zero fill-in and it depends on rocSPARSE. **/ HYPRE_Int HYPRE_ILUSetIterativeSetupTolerance( HYPRE_Solver solver, HYPRE_Real iter_setup_tolerance ); /** * (Optional) Set triangular solver type. Options are: * * - 0 : iterative * - 1 : direct (default) **/ HYPRE_Int HYPRE_ILUSetTriSolve( HYPRE_Solver solver, HYPRE_Int tri_solve ); /** * (Optional) Set number of lower Jacobi iterations for the triangular L solves * Set this to integer > 0 when using iterative tri_solve (0). The default is 5 iterations. **/ HYPRE_Int HYPRE_ILUSetLowerJacobiIters( HYPRE_Solver solver, HYPRE_Int lower_jacobi_iterations ); /** * (Optional) Set number of upper Jacobi iterations for the triangular U solves * Set this to integer > 0 when using iterative tri_solve (0). The default is 5 iterations. **/ HYPRE_Int HYPRE_ILUSetUpperJacobiIters( HYPRE_Solver solver, HYPRE_Int upper_jacobi_iterations ); /** * (Optional) Set the convergence tolerance for ILU. * Use tol = 0.0 if ILU is used as a preconditioner. The default is 1.e-7. **/ HYPRE_Int HYPRE_ILUSetTol( HYPRE_Solver solver, HYPRE_Real tol ); /** * (Optional) Set the level of fill k, for level-based ILU(k) * The default is 0 (for ILU(0)). **/ HYPRE_Int HYPRE_ILUSetLevelOfFill( HYPRE_Solver solver, HYPRE_Int lfil ); /** * (Optional) Set the max non-zeros per row in L and U factors (for ILUT) * The default is 1000. **/ HYPRE_Int HYPRE_ILUSetMaxNnzPerRow( HYPRE_Solver solver, HYPRE_Int nzmax ); /** * (Optional) Set the threshold for dropping in L and U factors (for ILUT). * Any fill-in less than this threshold is dropped in the factorization. * The default is 1.0e-2. **/ HYPRE_Int HYPRE_ILUSetDropThreshold( HYPRE_Solver solver, HYPRE_Real threshold ); /** * (Optional) Set the array of thresholds for dropping in ILUT. * B, E, and F correspond to upper left, lower left and upper right * of 2 x 2 block decomposition respectively. * Any fill-in less than threshold is dropped in the factorization. * - threshold[0] : threshold for matrix B. * - threshold[1] : threshold for matrix E and F. * - threshold[2] : threshold for matrix S (Schur Complement). * The default is 1.0e-2. **/ HYPRE_Int HYPRE_ILUSetDropThresholdArray( HYPRE_Solver solver, HYPRE_Real *threshold ); /** * (Optional) Set the threshold for dropping in Newton–Schulz–Hotelling iteration (NSH-ILU). * Any entries less than this threshold are dropped when forming the approximate inverse matrix. * The default is 1.0e-2. **/ HYPRE_Int HYPRE_ILUSetNSHDropThreshold( HYPRE_Solver solver, HYPRE_Real threshold ); /** * (Optional) Set the array of thresholds for dropping in Newton–Schulz–Hotelling * iteration (for NSH-ILU). Any fill-in less than thresholds is dropped when * forming the approximate inverse matrix. * * - threshold[0] : threshold for Minimal Residual iteration (initial guess for NSH). * - threshold[1] : threshold for Newton–Schulz–Hotelling iteration. * * The default is 1.0e-2. **/ HYPRE_Int HYPRE_ILUSetNSHDropThresholdArray( HYPRE_Solver solver, HYPRE_Real *threshold ); /** * (Optional) Set maximum number of iterations for Schur System Solve. * For GMRES-ILU, this is the maximum number of iterations for GMRES. * The Krylov dimension for GMRES is set equal to this value to avoid restart. * For NSH-ILU, this is the maximum number of iterations for NSH solve. * The default is 5. **/ HYPRE_Int HYPRE_ILUSetSchurMaxIter( HYPRE_Solver solver, HYPRE_Int ss_max_iter ); /** * Set the type of ILU factorization. * * Options for \e ilu_type are: * - 0 : BJ with ILU(k) (default, with k = 0) * - 1 : BJ with ILUT * - 10 : GMRES with ILU(k) * - 11 : GMRES with ILUT * - 20 : NSH with ILU(k) * - 21 : NSH with ILUT * - 30 : RAS with ILU(k) * - 31 : RAS with ILUT * - 40 : (nonsymmetric permutation) DDPQ-GMRES with ILU(k) * - 41 : (nonsymmetric permutation) DDPQ-GMRES with ILUT * - 50 : GMRES with RAP-ILU(0) using MILU(0) for P **/ HYPRE_Int HYPRE_ILUSetType( HYPRE_Solver solver, HYPRE_Int ilu_type ); /** * Set the type of reordering for the local matrix. * * Options for \e reordering_type are: * - 0 : No reordering * - 1 : RCM (default) **/ HYPRE_Int HYPRE_ILUSetLocalReordering( HYPRE_Solver solver, HYPRE_Int reordering_type ); /** * (Optional) Set the print level to print setup and solve information. * * - 0 : no printout (default) * - 1 : print setup information * - 2 : print solve information * - 3 : print both setup and solve information **/ HYPRE_Int HYPRE_ILUSetPrintLevel( HYPRE_Solver solver, HYPRE_Int print_level ); /** * (Optional) Requests logging of solver diagnostics. * Requests additional computations for diagnostic and similar * data to be logged by the user. Default is 0, do nothing. The latest * residual will be available if logging > 1. **/ HYPRE_Int HYPRE_ILUSetLogging( HYPRE_Solver solver, HYPRE_Int logging ); /** * (Optional) Return the number of ILU iterations. **/ HYPRE_Int HYPRE_ILUGetNumIterations( HYPRE_Solver solver, HYPRE_Int *num_iterations ); /** * (Optional) Return the norm of the final relative residual. **/ HYPRE_Int HYPRE_ILUGetFinalRelativeResidualNorm( HYPRE_Solver solver, HYPRE_Real *res_norm ); /*@}*/ /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ /*-------------------------------------------------------------------------- * Miscellaneous: These probably do not belong in the interface. *--------------------------------------------------------------------------*/ HYPRE_ParCSRMatrix GenerateLaplacian(MPI_Comm comm, HYPRE_BigInt nx, HYPRE_BigInt ny, HYPRE_BigInt nz, HYPRE_Int P, HYPRE_Int Q, HYPRE_Int R, HYPRE_Int p, HYPRE_Int q, HYPRE_Int r, HYPRE_Real *value); HYPRE_ParCSRMatrix GenerateLaplacian27pt(MPI_Comm comm, HYPRE_BigInt nx, HYPRE_BigInt ny, HYPRE_BigInt nz, HYPRE_Int P, HYPRE_Int Q, HYPRE_Int R, HYPRE_Int p, HYPRE_Int q, HYPRE_Int r, HYPRE_Real *value); HYPRE_ParCSRMatrix GenerateLaplacian9pt(MPI_Comm comm, HYPRE_BigInt nx, HYPRE_BigInt ny, HYPRE_Int P, HYPRE_Int Q, HYPRE_Int p, HYPRE_Int q, HYPRE_Real *value); HYPRE_ParCSRMatrix GenerateDifConv(MPI_Comm comm, HYPRE_BigInt nx, HYPRE_BigInt ny, HYPRE_BigInt nz, HYPRE_Int P, HYPRE_Int Q, HYPRE_Int R, HYPRE_Int p, HYPRE_Int q, HYPRE_Int r, HYPRE_Real *value); HYPRE_ParCSRMatrix GenerateRotate7pt(MPI_Comm comm, HYPRE_BigInt nx, HYPRE_BigInt ny, HYPRE_Int P, HYPRE_Int Q, HYPRE_Int p, HYPRE_Int q, HYPRE_Real alpha, HYPRE_Real eps ); HYPRE_ParCSRMatrix GenerateVarDifConv(MPI_Comm comm, HYPRE_BigInt nx, HYPRE_BigInt ny, HYPRE_BigInt nz, HYPRE_Int P, HYPRE_Int Q, HYPRE_Int R, HYPRE_Int p, HYPRE_Int q, HYPRE_Int r, HYPRE_Real eps, HYPRE_ParVector *rhs_ptr); HYPRE_ParCSRMatrix GenerateRSVarDifConv(MPI_Comm comm, HYPRE_BigInt nx, HYPRE_BigInt ny, HYPRE_BigInt nz, HYPRE_Int P, HYPRE_Int Q, HYPRE_Int R, HYPRE_Int p, HYPRE_Int q, HYPRE_Int r, HYPRE_Real eps, HYPRE_ParVector *rhs_ptr, HYPRE_Int type); float* hypre_GenerateCoordinates(MPI_Comm comm, HYPRE_BigInt nx, HYPRE_BigInt ny, HYPRE_BigInt nz, HYPRE_Int P, HYPRE_Int Q, HYPRE_Int R, HYPRE_Int p, HYPRE_Int q, HYPRE_Int r, HYPRE_Int coorddim); /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ /** * (Optional) Switches on use of Jacobi interpolation after computing * an original interpolation **/ HYPRE_Int HYPRE_BoomerAMGSetPostInterpType(HYPRE_Solver solver, HYPRE_Int post_interp_type); /** * (Optional) Sets a truncation threshold for Jacobi interpolation. **/ HYPRE_Int HYPRE_BoomerAMGSetJacobiTruncThreshold(HYPRE_Solver solver, HYPRE_Real jacobi_trunc_threshold); /** * (Optional) Defines the number of relaxation steps for CR * The default is 2. **/ HYPRE_Int HYPRE_BoomerAMGSetNumCRRelaxSteps(HYPRE_Solver solver, HYPRE_Int num_CR_relax_steps); /** * (Optional) Defines convergence rate for CR * The default is 0.7. **/ HYPRE_Int HYPRE_BoomerAMGSetCRRate(HYPRE_Solver solver, HYPRE_Real CR_rate); /** * (Optional) Defines strong threshold for CR * The default is 0.0. **/ HYPRE_Int HYPRE_BoomerAMGSetCRStrongTh(HYPRE_Solver solver, HYPRE_Real CR_strong_th); /** * (Optional) Defines whether to use CG **/ HYPRE_Int HYPRE_BoomerAMGSetCRUseCG(HYPRE_Solver solver, HYPRE_Int CR_use_CG); /** * (Optional) Defines the Type of independent set algorithm used for CR **/ HYPRE_Int HYPRE_BoomerAMGSetISType(HYPRE_Solver solver, HYPRE_Int IS_type); /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ /** * @name ParCSR LOBPCG Eigensolver * * These routines should be used in conjunction with the generic interface in * \ref Eigensolvers. * * @{ **/ /** * Load interface interpreter. Vector part loaded with hypre_ParKrylov * functions and multivector part loaded with mv_TempMultiVector functions. **/ HYPRE_Int HYPRE_ParCSRSetupInterpreter(mv_InterfaceInterpreter *i); /** * Load Matvec interpreter with hypre_ParKrylov functions. **/ HYPRE_Int HYPRE_ParCSRSetupMatvec(HYPRE_MatvecFunctions *mv); /* * Print multivector to file. **/ HYPRE_Int HYPRE_ParCSRMultiVectorPrint(void *x_, const char *fileName); /* * Read multivector from file. **/ void * HYPRE_ParCSRMultiVectorRead(MPI_Comm comm, void *ii_, const char *fileName); /**@}*/ /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ /**@}*/ #ifdef __cplusplus } #endif #endif hypre-2.33.0/src/parcsr_ls/HYPRE_parcsr_mgr.c000066400000000000000000000702361477326011500207750ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "_hypre_parcsr_ls.h" /*-------------------------------------------------------------------------- * HYPRE_MGRCreate *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_MGRCreate( HYPRE_Solver *solver ) { if (!solver) { hypre_error_in_arg(1); return hypre_error_flag; } *solver = ( (HYPRE_Solver) hypre_MGRCreate( ) ); return hypre_error_flag; } /*-------------------------------------------------------------------------- * HYPRE_MGRDestroy *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_MGRDestroy( HYPRE_Solver solver ) { return ( hypre_MGRDestroy( (void *) solver ) ); } /*-------------------------------------------------------------------------- * HYPRE_MGRSetup *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_MGRSetup( HYPRE_Solver solver, HYPRE_ParCSRMatrix A, HYPRE_ParVector b, HYPRE_ParVector x ) { if (!A) { hypre_error_in_arg(2); return hypre_error_flag; } return ( hypre_MGRSetup( (void *) solver, (hypre_ParCSRMatrix *) A, (hypre_ParVector *) b, (hypre_ParVector *) x ) ); } /*-------------------------------------------------------------------------- * HYPRE_MGRSolve *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_MGRSolve( HYPRE_Solver solver, HYPRE_ParCSRMatrix A, HYPRE_ParVector b, HYPRE_ParVector x ) { if (!A) { hypre_error_in_arg(2); return hypre_error_flag; } if (!b) { hypre_error_in_arg(3); return hypre_error_flag; } if (!x) { hypre_error_in_arg(4); return hypre_error_flag; } return ( hypre_MGRSolve( (void *) solver, (hypre_ParCSRMatrix *) A, (hypre_ParVector *) b, (hypre_ParVector *) x ) ); } #ifdef HYPRE_USING_DSUPERLU /*-------------------------------------------------------------------------- * HYPRE_MGRDirectSolverCreate *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_MGRDirectSolverCreate( HYPRE_Solver *solver ) { if (!solver) { hypre_error_in_arg(1); return hypre_error_flag; } *solver = ( (HYPRE_Solver) hypre_MGRDirectSolverCreate( ) ); return hypre_error_flag; } /*-------------------------------------------------------------------------- * HYPRE_MGRDirectSolverDestroy *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_MGRDirectSolverDestroy( HYPRE_Solver solver ) { return ( hypre_MGRDirectSolverDestroy( (void *) solver ) ); } /*-------------------------------------------------------------------------- * HYPRE_MGRDirectSolverSetup *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_MGRDirectSolverSetup( HYPRE_Solver solver, HYPRE_ParCSRMatrix A, HYPRE_ParVector b, HYPRE_ParVector x ) { return ( hypre_MGRDirectSolverSetup( (void *) solver, (hypre_ParCSRMatrix *) A, (hypre_ParVector *) b, (hypre_ParVector *) x ) ); } /*-------------------------------------------------------------------------- * HYPRE_MGRDirectSolverSolve *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_MGRDirectSolverSolve( HYPRE_Solver solver, HYPRE_ParCSRMatrix A, HYPRE_ParVector b, HYPRE_ParVector x ) { return ( hypre_MGRDirectSolverSolve( (void *) solver, (hypre_ParCSRMatrix *) A, (hypre_ParVector *) b, (hypre_ParVector *) x ) ); } #endif /*-------------------------------------------------------------------------- * HYPRE_MGRSetCpointsByContiguousBlock *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_MGRSetCpointsByContiguousBlock( HYPRE_Solver solver, HYPRE_Int block_size, HYPRE_Int max_num_levels, HYPRE_BigInt *idx_array, HYPRE_Int *block_num_coarse_points, HYPRE_Int **block_coarse_indexes) { return ( hypre_MGRSetCpointsByContiguousBlock( (void *) solver, block_size, max_num_levels, idx_array, block_num_coarse_points, block_coarse_indexes)); } /*-------------------------------------------------------------------------- * HYPRE_MGRSetCpointsByBlock *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_MGRSetCpointsByBlock( HYPRE_Solver solver, HYPRE_Int block_size, HYPRE_Int max_num_levels, HYPRE_Int *block_num_coarse_points, HYPRE_Int **block_coarse_indexes) { return ( hypre_MGRSetCpointsByBlock( (void *) solver, block_size, max_num_levels, block_num_coarse_points, block_coarse_indexes)); } /*-------------------------------------------------------------------------- * HYPRE_MGRSetCpointsByPointMarkerArray *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_MGRSetCpointsByPointMarkerArray( HYPRE_Solver solver, HYPRE_Int block_size, HYPRE_Int max_num_levels, HYPRE_Int *num_block_coarse_points, HYPRE_Int **lvl_block_coarse_indexes, HYPRE_Int *point_marker_array) { return ( hypre_MGRSetCpointsByPointMarkerArray( (void *) solver, block_size, max_num_levels, num_block_coarse_points, lvl_block_coarse_indexes, point_marker_array)); } /*-------------------------------------------------------------------------- * HYPRE_MGRSetNonCpointsToFpoints *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_MGRSetNonCpointsToFpoints( HYPRE_Solver solver, HYPRE_Int nonCptToFptFlag) { return hypre_MGRSetNonCpointsToFpoints((void *) solver, nonCptToFptFlag); } /*-------------------------------------------------------------------------- * HYPRE_MGRSetFSolver *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_MGRSetFSolver(HYPRE_Solver solver, HYPRE_PtrToParSolverFcn fine_grid_solver_solve, HYPRE_PtrToParSolverFcn fine_grid_solver_setup, HYPRE_Solver fsolver ) { if (!solver) { hypre_error_in_arg(1); return hypre_error_flag; } else if (!fsolver) { hypre_error_in_arg(4); return hypre_error_flag; } return ( hypre_MGRSetFSolver( (void *) solver, (HYPRE_Int (*)(void*, void*, void*, void*)) fine_grid_solver_solve, (HYPRE_Int (*)(void*, void*, void*, void*)) fine_grid_solver_setup, (void *) fsolver ) ); } /*-------------------------------------------------------------------------- * HYPRE_MGRSetFSolverAtLevel *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_MGRSetFSolverAtLevel(HYPRE_Solver solver, HYPRE_Solver fsolver, HYPRE_Int level ) { if (!solver) { hypre_error_in_arg(1); return hypre_error_flag; } else if (!fsolver) { hypre_error_in_arg(2); return hypre_error_flag; } return ( hypre_MGRSetFSolverAtLevel( (void *) solver, (void *) fsolver, level ) ); } /*-------------------------------------------------------------------------- * HYPRE_MGRBuildAff *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_MGRBuildAff(HYPRE_ParCSRMatrix A, HYPRE_Int *CF_marker, HYPRE_Int debug_flag, HYPRE_ParCSRMatrix *A_ff) { return (hypre_MGRBuildAff(A, CF_marker, debug_flag, A_ff)); } /*-------------------------------------------------------------------------- * HYPRE_MGRSetCoarseSolver *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_MGRSetCoarseSolver(HYPRE_Solver solver, HYPRE_PtrToParSolverFcn coarse_grid_solver_solve, HYPRE_PtrToParSolverFcn coarse_grid_solver_setup, HYPRE_Solver coarse_grid_solver ) { if (!solver) { hypre_error_in_arg(1); return hypre_error_flag; } else if (!coarse_grid_solver) { hypre_error_in_arg(4); return hypre_error_flag; } return ( hypre_MGRSetCoarseSolver( (void *) solver, (HYPRE_Int (*)(void*, void*, void*, void*)) coarse_grid_solver_solve, (HYPRE_Int (*)(void*, void*, void*, void*)) coarse_grid_solver_setup, (void *) coarse_grid_solver ) ); } /*-------------------------------------------------------------------------- * HYPRE_MGRSetMaxCoarseLevels *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_MGRSetMaxCoarseLevels( HYPRE_Solver solver, HYPRE_Int maxlev ) { if (!solver) { hypre_error_in_arg(1); return hypre_error_flag; } return hypre_MGRSetMaxCoarseLevels(solver, maxlev); } /*-------------------------------------------------------------------------- * HYPRE_MGRSetBlockSize *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_MGRSetBlockSize( HYPRE_Solver solver, HYPRE_Int bsize ) { if (!solver) { hypre_error_in_arg(1); return hypre_error_flag; } return hypre_MGRSetBlockSize(solver, bsize ); } /*-------------------------------------------------------------------------- * HYPRE_MGRSetReservedCoarseNodes *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_MGRSetReservedCoarseNodes( HYPRE_Solver solver, HYPRE_Int reserved_coarse_size, HYPRE_BigInt *reserved_coarse_indices ) { if (!solver) { hypre_error_in_arg(1); return hypre_error_flag; } else if (reserved_coarse_size < 0) { hypre_error_in_arg(2); return hypre_error_flag; } else if (!reserved_coarse_indices) { hypre_error_in_arg(3); return hypre_error_flag; } return hypre_MGRSetReservedCoarseNodes(solver, reserved_coarse_size, reserved_coarse_indices); } /*-------------------------------------------------------------------------- * HYPRE_MGRSetReservedCpointsLevelToKeep *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_MGRSetReservedCpointsLevelToKeep( HYPRE_Solver solver, HYPRE_Int level) { if (!solver) { hypre_error_in_arg(1); return hypre_error_flag; } return hypre_MGRSetReservedCpointsLevelToKeep((void *) solver, level); } /*-------------------------------------------------------------------------- * HYPRE_MGRSetRestrictType *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_MGRSetRestrictType(HYPRE_Solver solver, HYPRE_Int restrict_type ) { if (!solver) { hypre_error_in_arg(1); return hypre_error_flag; } return hypre_MGRSetRestrictType(solver, restrict_type ); } /*-------------------------------------------------------------------------- * HYPRE_MGRSetLevelRestrictType *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_MGRSetLevelRestrictType( HYPRE_Solver solver, HYPRE_Int *restrict_type ) { if (!solver) { hypre_error_in_arg(1); return hypre_error_flag; } return hypre_MGRSetLevelRestrictType( solver, restrict_type ); } /*-------------------------------------------------------------------------- * HYPRE_MGRSetFRelaxMethod *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_MGRSetFRelaxMethod( HYPRE_Solver solver, HYPRE_Int relax_method ) { if (!solver) { hypre_error_in_arg(1); return hypre_error_flag; } return hypre_MGRSetFRelaxMethod(solver, relax_method ); } /*-------------------------------------------------------------------------- * HYPRE_MGRSetLevelFRelaxMethod *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_MGRSetLevelFRelaxMethod( HYPRE_Solver solver, HYPRE_Int *relax_method ) { if (!solver) { hypre_error_in_arg(1); return hypre_error_flag; } return hypre_MGRSetLevelFRelaxMethod( solver, relax_method ); } /*-------------------------------------------------------------------------- * HYPRE_MGRSetLevelFRelaxType *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_MGRSetLevelFRelaxType( HYPRE_Solver solver, HYPRE_Int *relax_type ) { if (!solver) { hypre_error_in_arg(1); return hypre_error_flag; } return hypre_MGRSetLevelFRelaxType( solver, relax_type ); } /*-------------------------------------------------------------------------- * HYPRE_MGRSetCoarseGridMethod *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_MGRSetCoarseGridMethod( HYPRE_Solver solver, HYPRE_Int *cg_method ) { if (!solver) { hypre_error_in_arg(1); return hypre_error_flag; } return hypre_MGRSetCoarseGridMethod( solver, cg_method ); } /*-------------------------------------------------------------------------- * HYPRE_MGRSetNonGalerkinMaxElmts *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_MGRSetNonGalerkinMaxElmts( HYPRE_Solver solver, HYPRE_Int max_elmts ) { return hypre_MGRSetNonGalerkinMaxElmts( solver, max_elmts ); } /*-------------------------------------------------------------------------- * HYPRE_MGRSetLevelNonGalerkinMaxElmts *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_MGRSetLevelNonGalerkinMaxElmts( HYPRE_Solver solver, HYPRE_Int *max_elmts ) { return hypre_MGRSetLevelNonGalerkinMaxElmts( solver, max_elmts ); } /*-------------------------------------------------------------------------- * HYPRE_MGRSetLevelFRelaxNumFunctions *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_MGRSetLevelFRelaxNumFunctions( HYPRE_Solver solver, HYPRE_Int *num_functions ) { if (!solver) { hypre_error_in_arg(1); return hypre_error_flag; } return hypre_MGRSetLevelFRelaxNumFunctions( solver, num_functions ); } /*-------------------------------------------------------------------------- * HYPRE_MGRSetRelaxType *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_MGRSetRelaxType( HYPRE_Solver solver, HYPRE_Int relax_type ) { if (!solver) { hypre_error_in_arg(1); return hypre_error_flag; } return hypre_MGRSetRelaxType(solver, relax_type ); } /*-------------------------------------------------------------------------- * HYPRE_MGRSetNumRelaxSweeps *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_MGRSetNumRelaxSweeps( HYPRE_Solver solver, HYPRE_Int nsweeps ) { if (!solver) { hypre_error_in_arg(1); return hypre_error_flag; } return hypre_MGRSetNumRelaxSweeps(solver, nsweeps); } /*-------------------------------------------------------------------------- * HYPRE_MGRSetLevelNumRelaxSweeps *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_MGRSetLevelNumRelaxSweeps( HYPRE_Solver solver, HYPRE_Int *nsweeps ) { if (!solver) { hypre_error_in_arg(1); return hypre_error_flag; } return hypre_MGRSetLevelNumRelaxSweeps(solver, nsweeps); } /*-------------------------------------------------------------------------- * HYPRE_MGRSetInterpType *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_MGRSetInterpType( HYPRE_Solver solver, HYPRE_Int interpType ) { if (!solver) { hypre_error_in_arg(1); return hypre_error_flag; } return hypre_MGRSetInterpType(solver, interpType); } /*-------------------------------------------------------------------------- * HYPRE_MGRSetLevelInterpType *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_MGRSetLevelInterpType( HYPRE_Solver solver, HYPRE_Int *interpType ) { if (!solver) { hypre_error_in_arg(1); return hypre_error_flag; } return hypre_MGRSetLevelInterpType(solver, interpType); } /*-------------------------------------------------------------------------- * HYPRE_MGRSetNumInterpSweeps *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_MGRSetNumInterpSweeps( HYPRE_Solver solver, HYPRE_Int nsweeps ) { if (!solver) { hypre_error_in_arg(1); return hypre_error_flag; } return hypre_MGRSetNumInterpSweeps(solver, nsweeps); } /*-------------------------------------------------------------------------- * HYPRE_MGRSetNumRestrictSweeps *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_MGRSetNumRestrictSweeps( HYPRE_Solver solver, HYPRE_Int nsweeps ) { if (!solver) { hypre_error_in_arg(1); return hypre_error_flag; } return hypre_MGRSetNumRestrictSweeps(solver, nsweeps); } /*-------------------------------------------------------------------------- * HYPRE_MGRSetTruncateCoarseGridThreshold *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_MGRSetTruncateCoarseGridThreshold( HYPRE_Solver solver, HYPRE_Real threshold) { if (!solver) { hypre_error_in_arg(1); return hypre_error_flag; } return hypre_MGRSetTruncateCoarseGridThreshold( solver, threshold ); } /*-------------------------------------------------------------------------- * HYPRE_MGRSetBlockJacobiBlockSize *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_MGRSetBlockJacobiBlockSize( HYPRE_Solver solver, HYPRE_Int blk_size ) { if (!solver) { hypre_error_in_arg(1); return hypre_error_flag; } else if (blk_size < 1) { hypre_error_in_arg(2); return hypre_error_flag; } return hypre_MGRSetBlockJacobiBlockSize(solver, blk_size); } /*-------------------------------------------------------------------------- * HYPRE_MGRSetFrelaxPrintLevel *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_MGRSetFrelaxPrintLevel( HYPRE_Solver solver, HYPRE_Int print_level ) { if (!solver) { hypre_error_in_arg(1); return hypre_error_flag; } return hypre_MGRSetFrelaxPrintLevel( solver, print_level ); } /*-------------------------------------------------------------------------- * HYPRE_MGRSetCoarseGridPrintLevel *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_MGRSetCoarseGridPrintLevel( HYPRE_Solver solver, HYPRE_Int print_level ) { if (!solver) { hypre_error_in_arg(1); return hypre_error_flag; } return hypre_MGRSetCoarseGridPrintLevel( solver, print_level ); } /*-------------------------------------------------------------------------- * HYPRE_MGRSetPrintLevel *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_MGRSetPrintLevel( HYPRE_Solver solver, HYPRE_Int print_level ) { if (!solver) { hypre_error_in_arg(1); return hypre_error_flag; } return hypre_MGRSetPrintLevel( solver, print_level ); } /*-------------------------------------------------------------------------- * HYPRE_MGRSetLogging *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_MGRSetLogging( HYPRE_Solver solver, HYPRE_Int logging ) { if (!solver) { hypre_error_in_arg(1); return hypre_error_flag; } return hypre_MGRSetLogging(solver, logging ); } /*-------------------------------------------------------------------------- * HYPRE_MGRSetMaxIter *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_MGRSetMaxIter( HYPRE_Solver solver, HYPRE_Int max_iter ) { if (!solver) { hypre_error_in_arg(1); return hypre_error_flag; } else if (max_iter < 0) { hypre_error_in_arg(2); return hypre_error_flag; } return hypre_MGRSetMaxIter( solver, max_iter ); } /*-------------------------------------------------------------------------- * HYPRE_MGRSetTol *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_MGRSetTol( HYPRE_Solver solver, HYPRE_Real tol ) { if (!solver) { hypre_error_in_arg(1); return hypre_error_flag; } else if (tol < 0.0) { hypre_error_in_arg(2); return hypre_error_flag; } return hypre_MGRSetTol( solver, tol ); } /*-------------------------------------------------------------------------- * HYPRE_MGRSetMaxGlobalsmoothIters *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_MGRSetMaxGlobalSmoothIters( HYPRE_Solver solver, HYPRE_Int max_iter ) { if (!solver) { hypre_error_in_arg(1); return hypre_error_flag; } else if (max_iter < 0) { hypre_error_in_arg(2); return hypre_error_flag; } return hypre_MGRSetMaxGlobalSmoothIters(solver, max_iter); } /*-------------------------------------------------------------------------- * HYPRE_MGRSetLevelsmoothIters *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_MGRSetLevelSmoothIters( HYPRE_Solver solver, HYPRE_Int *smooth_iters ) { if (!solver) { hypre_error_in_arg(1); return hypre_error_flag; } return hypre_MGRSetLevelSmoothIters(solver, smooth_iters); } /*-------------------------------------------------------------------------- * HYPRE_MGRSetGlobalsmoothType *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_MGRSetGlobalSmoothType( HYPRE_Solver solver, HYPRE_Int smooth_type ) { if (!solver) { hypre_error_in_arg(1); return hypre_error_flag; } return hypre_MGRSetGlobalSmoothType(solver, smooth_type); } /*-------------------------------------------------------------------------- * HYPRE_MGRSetLevelsmoothType *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_MGRSetLevelSmoothType( HYPRE_Solver solver, HYPRE_Int *smooth_type ) { if (!solver) { hypre_error_in_arg(1); return hypre_error_flag; } return hypre_MGRSetLevelSmoothType(solver, smooth_type); } /*-------------------------------------------------------------------------- * HYPRE_MGRSetGlobalSmoothCycle *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_MGRSetGlobalSmoothCycle( HYPRE_Solver solver, HYPRE_Int global_smooth_cycle ) { if (!solver) { hypre_error_in_arg(1); return hypre_error_flag; } return hypre_MGRSetGlobalSmoothCycle(solver, global_smooth_cycle); } /*-------------------------------------------------------------------------- * HYPRE_MGRSetGlobalSmootherAtLevel *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_MGRSetGlobalSmootherAtLevel( HYPRE_Solver solver, HYPRE_Solver smoother, HYPRE_Int level ) { if (!solver) { hypre_error_in_arg(1); return hypre_error_flag; } else if (!smoother) { hypre_error_in_arg(2); return hypre_error_flag; } return hypre_MGRSetGlobalSmootherAtLevel((void*) solver, smoother, level); } /*-------------------------------------------------------------------------- * HYPRE_MGRSetPMaxElmts *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_MGRSetPMaxElmts( HYPRE_Solver solver, HYPRE_Int P_max_elmts ) { if (!solver) { hypre_error_in_arg(1); return hypre_error_flag; } return hypre_MGRSetPMaxElmts(solver, P_max_elmts); } /*-------------------------------------------------------------------------- * HYPRE_MGRSetLevelPMaxElmts *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_MGRSetLevelPMaxElmts( HYPRE_Solver solver, HYPRE_Int *P_max_elmts ) { if (!solver) { hypre_error_in_arg(1); return hypre_error_flag; } return hypre_MGRSetLevelPMaxElmts(solver, P_max_elmts); } /*-------------------------------------------------------------------------- * HYPRE_MGRGetCoarseGridConvergenceFactor *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_MGRGetCoarseGridConvergenceFactor( HYPRE_Solver solver, HYPRE_Real *conv_factor ) { if (!solver) { hypre_error_in_arg(1); return hypre_error_flag; } return hypre_MGRGetCoarseGridConvergenceFactor( solver, conv_factor ); } /*-------------------------------------------------------------------------- * HYPRE_MGRGetNumIterations *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_MGRGetNumIterations( HYPRE_Solver solver, HYPRE_Int *num_iterations ) { if (!solver) { hypre_error_in_arg(1); return hypre_error_flag; } return hypre_MGRGetNumIterations( solver, num_iterations ); } /*-------------------------------------------------------------------------- * HYPRE_MGRGetFinalRelativeResidualNorm *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_MGRGetFinalRelativeResidualNorm( HYPRE_Solver solver, HYPRE_Real *res_norm ) { if (!solver) { hypre_error_in_arg(1); return hypre_error_flag; } return hypre_MGRGetFinalRelativeResidualNorm(solver, res_norm); } hypre-2.33.0/src/parcsr_ls/HYPRE_parcsr_pcg.c000066400000000000000000000224771477326011500207650ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "_hypre_parcsr_ls.h" /*-------------------------------------------------------------------------- * HYPRE_ParCSRPCGCreate *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ParCSRPCGCreate( MPI_Comm comm, HYPRE_Solver *solver ) { HYPRE_UNUSED_VAR(comm); hypre_PCGFunctions * pcg_functions; if (!solver) { hypre_error_in_arg(2); return hypre_error_flag; } pcg_functions = hypre_PCGFunctionsCreate( hypre_ParKrylovCAlloc, hypre_ParKrylovFree, hypre_ParKrylovCommInfo, hypre_ParKrylovCreateVector, hypre_ParKrylovDestroyVector, hypre_ParKrylovMatvecCreate, hypre_ParKrylovMatvec, hypre_ParKrylovMatvecDestroy, hypre_ParKrylovInnerProd, hypre_ParKrylovCopyVector, hypre_ParKrylovClearVector, hypre_ParKrylovScaleVector, hypre_ParKrylovAxpy, hypre_ParKrylovIdentitySetup, hypre_ParKrylovIdentity ); *solver = ( (HYPRE_Solver) hypre_PCGCreate( pcg_functions ) ); return hypre_error_flag; } /*-------------------------------------------------------------------------- * HYPRE_ParCSRPCGDestroy *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ParCSRPCGDestroy( HYPRE_Solver solver ) { return ( hypre_PCGDestroy( (void *) solver ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRPCGSetup *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ParCSRPCGSetup( HYPRE_Solver solver, HYPRE_ParCSRMatrix A, HYPRE_ParVector b, HYPRE_ParVector x ) { return ( HYPRE_PCGSetup( solver, (HYPRE_Matrix) A, (HYPRE_Vector) b, (HYPRE_Vector) x ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRPCGSolve *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ParCSRPCGSolve( HYPRE_Solver solver, HYPRE_ParCSRMatrix A, HYPRE_ParVector b, HYPRE_ParVector x ) { return ( HYPRE_PCGSolve( solver, (HYPRE_Matrix) A, (HYPRE_Vector) b, (HYPRE_Vector) x ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRPCGSetTol *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ParCSRPCGSetTol( HYPRE_Solver solver, HYPRE_Real tol ) { return ( HYPRE_PCGSetTol( solver, tol ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRPCGSetAbsoluteTol *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ParCSRPCGSetAbsoluteTol( HYPRE_Solver solver, HYPRE_Real a_tol ) { return ( HYPRE_PCGSetAbsoluteTol( solver, a_tol ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRPCGSetMaxIter *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ParCSRPCGSetMaxIter( HYPRE_Solver solver, HYPRE_Int max_iter ) { return ( HYPRE_PCGSetMaxIter( solver, max_iter ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRPCGSetStopCrit *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ParCSRPCGSetStopCrit( HYPRE_Solver solver, HYPRE_Int stop_crit ) { return ( HYPRE_PCGSetStopCrit( solver, stop_crit ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRPCGSetTwoNorm *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ParCSRPCGSetTwoNorm( HYPRE_Solver solver, HYPRE_Int two_norm ) { return ( HYPRE_PCGSetTwoNorm( solver, two_norm ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRPCGSetRelChange *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ParCSRPCGSetRelChange( HYPRE_Solver solver, HYPRE_Int rel_change ) { return ( HYPRE_PCGSetRelChange( solver, rel_change ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRPCGSetPrecond *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ParCSRPCGSetPrecond( HYPRE_Solver solver, HYPRE_PtrToParSolverFcn precond, HYPRE_PtrToParSolverFcn precond_setup, HYPRE_Solver precond_solver ) { return ( HYPRE_PCGSetPrecond( solver, (HYPRE_PtrToSolverFcn) precond, (HYPRE_PtrToSolverFcn) precond_setup, precond_solver ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRPCGSetPreconditioner *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ParCSRPCGSetPreconditioner( HYPRE_Solver solver, HYPRE_Solver precond ) { return ( HYPRE_PCGSetPreconditioner( solver, precond ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRPCGGetPrecond *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ParCSRPCGGetPrecond( HYPRE_Solver solver, HYPRE_Solver *precond_data_ptr ) { return ( HYPRE_PCGGetPrecond( solver, precond_data_ptr ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRPCGSetPrintLevel * an obsolete function; use HYPRE_PCG* functions instead *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ParCSRPCGSetPrintLevel( HYPRE_Solver solver, HYPRE_Int level ) { return ( HYPRE_PCGSetPrintLevel( solver, level ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRPCGSetLogging * an obsolete function; use HYPRE_PCG* functions instead *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ParCSRPCGSetLogging( HYPRE_Solver solver, HYPRE_Int level ) { return ( HYPRE_PCGSetLogging( solver, level ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRPCGGetNumIterations *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ParCSRPCGGetNumIterations( HYPRE_Solver solver, HYPRE_Int *num_iterations ) { return ( HYPRE_PCGGetNumIterations( solver, num_iterations ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRPCGGetFinalRelativeResidualNorm *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ParCSRPCGGetFinalRelativeResidualNorm( HYPRE_Solver solver, HYPRE_Real *norm ) { return ( HYPRE_PCGGetFinalRelativeResidualNorm( solver, norm ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRPCGGetResidual *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ParCSRPCGGetResidual( HYPRE_Solver solver, HYPRE_ParVector *residual ) { return ( HYPRE_PCGGetResidual( solver, (void *) residual ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRDiagScaleSetup *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ParCSRDiagScaleSetup( HYPRE_Solver solver, HYPRE_ParCSRMatrix A, HYPRE_ParVector y, HYPRE_ParVector x ) { HYPRE_UNUSED_VAR(solver); HYPRE_UNUSED_VAR(A); HYPRE_UNUSED_VAR(y); HYPRE_UNUSED_VAR(x); return hypre_error_flag; } /*-------------------------------------------------------------------------- * HYPRE_ParCSRDiagScale *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ParCSRDiagScale( HYPRE_Solver solver, HYPRE_ParCSRMatrix HA, HYPRE_ParVector Hy, HYPRE_ParVector Hx ) { HYPRE_UNUSED_VAR(solver); return hypre_ParCSRDiagScaleVector((hypre_ParCSRMatrix *) HA, (hypre_ParVector *) Hy, (hypre_ParVector *) Hx); } hypre-2.33.0/src/parcsr_ls/HYPRE_parcsr_pilut.c000066400000000000000000000162031477326011500213370ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * HYPRE_ParCSRPilut interface * *****************************************************************************/ #include #include #include #include "./HYPRE_parcsr_ls.h" #include "../distributed_matrix/HYPRE_distributed_matrix_types.h" #include "../distributed_matrix/HYPRE_distributed_matrix_protos.h" #include "../matrix_matrix/HYPRE_matrix_matrix_protos.h" #include "../distributed_ls/pilut/HYPRE_DistributedMatrixPilutSolver_types.h" #include "../distributed_ls/pilut/HYPRE_DistributedMatrixPilutSolver_protos.h" /* Must include implementation definition for ParVector since no data access functions are publically provided. AJC, 5/99 */ /* Likewise for Vector. AJC, 5/99 */ #include "../seq_mv/vector.h" /* AB 8/06 - replace header file */ /* #include "../parcsr_mv/par_vector.h" */ #include "../parcsr_mv/_hypre_parcsr_mv.h" /*-------------------------------------------------------------------------- * HYPRE_ParCSRPilutCreate *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ParCSRPilutCreate( MPI_Comm comm, HYPRE_Solver *solver ) { #ifdef HYPRE_MIXEDINT HYPRE_UNUSED_VAR(solver); HYPRE_UNUSED_VAR(comm); hypre_error_w_msg(HYPRE_ERROR_GENERIC, "Pilut cannot be used in mixedint mode!"); return hypre_error_flag; #else HYPRE_NewDistributedMatrixPilutSolver( comm, NULL, (HYPRE_DistributedMatrixPilutSolver *) solver); HYPRE_DistributedMatrixPilutSolverInitialize( (HYPRE_DistributedMatrixPilutSolver) solver ); return hypre_error_flag; #endif } /*-------------------------------------------------------------------------- * HYPRE_ParCSRPilutDestroy *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ParCSRPilutDestroy( HYPRE_Solver solver ) { #ifdef HYPRE_MIXEDINT HYPRE_UNUSED_VAR(solver); hypre_error_w_msg(HYPRE_ERROR_GENERIC, "Pilut cannot be used in mixedint mode!"); return hypre_error_flag; #else HYPRE_DistributedMatrix mat = HYPRE_DistributedMatrixPilutSolverGetMatrix( (HYPRE_DistributedMatrixPilutSolver) solver ); if ( mat ) { HYPRE_DistributedMatrixDestroy( mat ); } HYPRE_FreeDistributedMatrixPilutSolver( (HYPRE_DistributedMatrixPilutSolver) solver ); return hypre_error_flag; #endif } /*-------------------------------------------------------------------------- * HYPRE_ParCSRPilutSetup *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ParCSRPilutSetup( HYPRE_Solver solver, HYPRE_ParCSRMatrix A, HYPRE_ParVector b, HYPRE_ParVector x ) { HYPRE_UNUSED_VAR(b); HYPRE_UNUSED_VAR(x); #ifdef HYPRE_MIXEDINT HYPRE_UNUSED_VAR(solver); HYPRE_UNUSED_VAR(A); hypre_error_w_msg(HYPRE_ERROR_GENERIC, "Pilut cannot be used in mixedint mode!"); return hypre_error_flag; #else HYPRE_DistributedMatrix matrix; HYPRE_DistributedMatrixPilutSolver distributed_solver = (HYPRE_DistributedMatrixPilutSolver) solver; HYPRE_ConvertParCSRMatrixToDistributedMatrix( A, &matrix ); HYPRE_DistributedMatrixPilutSolverSetMatrix( distributed_solver, matrix ); HYPRE_DistributedMatrixPilutSolverSetup( distributed_solver ); return hypre_error_flag; #endif } /*-------------------------------------------------------------------------- * HYPRE_ParCSRPilutSolve *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ParCSRPilutSolve( HYPRE_Solver solver, HYPRE_ParCSRMatrix A, HYPRE_ParVector b, HYPRE_ParVector x ) { HYPRE_UNUSED_VAR(A); #ifdef HYPRE_MIXEDINT HYPRE_UNUSED_VAR(b); HYPRE_UNUSED_VAR(x); HYPRE_UNUSED_VAR(solver); hypre_error_w_msg(HYPRE_ERROR_GENERIC, "Pilut cannot be used in mixedint mode!"); return hypre_error_flag; #else HYPRE_Real *rhs, *soln; rhs = hypre_VectorData( hypre_ParVectorLocalVector( (hypre_ParVector *)b ) ); soln = hypre_VectorData( hypre_ParVectorLocalVector( (hypre_ParVector *)x ) ); HYPRE_DistributedMatrixPilutSolverSolve( (HYPRE_DistributedMatrixPilutSolver) solver, soln, rhs ); return hypre_error_flag; #endif } /*-------------------------------------------------------------------------- * HYPRE_ParCSRPilutSetMaxIter *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ParCSRPilutSetMaxIter( HYPRE_Solver solver, HYPRE_Int max_iter ) { #ifdef HYPRE_MIXEDINT HYPRE_UNUSED_VAR(solver); HYPRE_UNUSED_VAR(max_iter); hypre_error_w_msg(HYPRE_ERROR_GENERIC, "Pilut cannot be used in mixedint mode!"); return hypre_error_flag; #else HYPRE_DistributedMatrixPilutSolverSetMaxIts( (HYPRE_DistributedMatrixPilutSolver) solver, max_iter ); return hypre_error_flag; #endif } /*-------------------------------------------------------------------------- * HYPRE_ParCSRPilutSetDropTolerance *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ParCSRPilutSetDropTolerance( HYPRE_Solver solver, HYPRE_Real tol ) { #ifdef HYPRE_MIXEDINT HYPRE_UNUSED_VAR(solver); HYPRE_UNUSED_VAR(tol); hypre_error_w_msg(HYPRE_ERROR_GENERIC, "Pilut cannot be used in mixedint mode!"); return hypre_error_flag; #else HYPRE_DistributedMatrixPilutSolverSetDropTolerance( (HYPRE_DistributedMatrixPilutSolver) solver, tol ); return hypre_error_flag; #endif } /*-------------------------------------------------------------------------- * HYPRE_ParCSRPilutSetFactorRowSize *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ParCSRPilutSetFactorRowSize( HYPRE_Solver solver, HYPRE_Int size ) { #ifdef HYPRE_MIXEDINT HYPRE_UNUSED_VAR(solver); HYPRE_UNUSED_VAR(size); hypre_error_w_msg(HYPRE_ERROR_GENERIC, "Pilut cannot be used in mixedint mode!"); return hypre_error_flag; #else HYPRE_DistributedMatrixPilutSolverSetFactorRowSize( (HYPRE_DistributedMatrixPilutSolver) solver, size ); return hypre_error_flag; #endif } HYPRE_Int HYPRE_ParCSRPilutSetLogging( HYPRE_Solver solver, HYPRE_Int logging ) { #ifdef HYPRE_MIXEDINT HYPRE_UNUSED_VAR(solver); HYPRE_UNUSED_VAR(logging); hypre_error_w_msg(HYPRE_ERROR_GENERIC, "Pilut cannot be used in mixedint mode!"); return hypre_error_flag; #else HYPRE_DistributedMatrixPilutSolverSetLogging( (HYPRE_DistributedMatrixPilutSolver) solver, logging ); return hypre_error_flag; #endif } hypre-2.33.0/src/parcsr_ls/HYPRE_parcsr_schwarz.c000066400000000000000000000122471477326011500216670ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "_hypre_parcsr_ls.h" /*-------------------------------------------------------------------------- * HYPRE_SchwarzCreate *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_SchwarzCreate( HYPRE_Solver *solver) { if (!solver) { hypre_error_in_arg(1); return hypre_error_flag; } *solver = (HYPRE_Solver) hypre_SchwarzCreate( ) ; return hypre_error_flag; } /*-------------------------------------------------------------------------- * HYPRE_SchwarzDestroy *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_SchwarzDestroy( HYPRE_Solver solver ) { return ( hypre_SchwarzDestroy( (void *) solver ) ); } /*-------------------------------------------------------------------------- * HYPRE_SchwarzSetup *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_SchwarzSetup(HYPRE_Solver solver, HYPRE_ParCSRMatrix A, HYPRE_ParVector b, HYPRE_ParVector x ) { return ( hypre_SchwarzSetup( (void *) solver, (hypre_ParCSRMatrix *) A, (hypre_ParVector *) b, (hypre_ParVector *) x ) ); } /*-------------------------------------------------------------------------- * HYPRE_SchwarzSolve *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_SchwarzSolve( HYPRE_Solver solver, HYPRE_ParCSRMatrix A, HYPRE_ParVector b, HYPRE_ParVector x ) { return ( hypre_SchwarzSolve( (void *) solver, (hypre_ParCSRMatrix *) A, (hypre_ParVector *) b, (hypre_ParVector *) x ) ); } /*-------------------------------------------------------------------------- * HYPRE_SchwarzSetVariant *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_SchwarzSetVariant( HYPRE_Solver solver, HYPRE_Int variant ) { return ( hypre_SchwarzSetVariant( (void *) solver, variant ) ); } /*-------------------------------------------------------------------------- * HYPRE_SchwarzSetOverlap *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_SchwarzSetOverlap( HYPRE_Solver solver, HYPRE_Int overlap) { return ( hypre_SchwarzSetOverlap( (void *) solver, overlap ) ); } /*-------------------------------------------------------------------------- * HYPRE_SchwarzSetDomainType *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_SchwarzSetDomainType( HYPRE_Solver solver, HYPRE_Int domain_type ) { return ( hypre_SchwarzSetDomainType( (void *) solver, domain_type ) ); } /*-------------------------------------------------------------------------- * HYPRE_SchwarzSetDomainStructure *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_SchwarzSetDomainStructure( HYPRE_Solver solver, HYPRE_CSRMatrix domain_structure ) { return ( hypre_SchwarzSetDomainStructure( (void *) solver, (hypre_CSRMatrix *) domain_structure ) ); } /*-------------------------------------------------------------------------- * HYPRE_SchwarzSetNumFunctions *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_SchwarzSetNumFunctions( HYPRE_Solver solver, HYPRE_Int num_functions ) { return ( hypre_SchwarzSetNumFunctions( (void *) solver, num_functions ) ); } /*-------------------------------------------------------------------------- * HYPRE_SchwarzSetNonSymm *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_SchwarzSetNonSymm( HYPRE_Solver solver, HYPRE_Int use_nonsymm ) { return ( hypre_SchwarzSetNonSymm( (void *) solver, use_nonsymm )); } /*-------------------------------------------------------------------------- * HYPRE_SchwarzSetRelaxWeight *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_SchwarzSetRelaxWeight( HYPRE_Solver solver, HYPRE_Real relax_weight) { return ( hypre_SchwarzSetRelaxWeight((void *) solver, relax_weight)); } /*-------------------------------------------------------------------------- * HYPRE_SchwarzSetDofFunc *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_SchwarzSetDofFunc( HYPRE_Solver solver, HYPRE_Int *dof_func ) { return ( hypre_SchwarzSetDofFunc( (void *) solver, dof_func ) ); } hypre-2.33.0/src/parcsr_ls/Makefile000066400000000000000000000115671477326011500171650ustar00rootroot00000000000000# Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) include ../config/Makefile.config ## Euclid specific macros taken from distributed_ls/Euclid CINCLUDES = ${INCLUDES} ${MPIINCLUDE} C_COMPILE_FLAGS =\ -I..\ -I../distributed_ls/Euclid\ -I$(srcdir)\ -I$(srcdir)/..\ -I$(srcdir)/../blas\ -I$(srcdir)/../lapack\ -I$(srcdir)/../multivector\ -I$(srcdir)/../utilities\ -I$(srcdir)/../krylov\ -I$(srcdir)/../seq_mv\ -I$(srcdir)/../seq_block_mv\ -I$(srcdir)/../parcsr_mv\ -I$(srcdir)/../distributed_matrix\ -I$(srcdir)/../matrix_matrix\ -I$(srcdir)/../IJ_mv\ -I$(srcdir)/../parcsr_block_mv\ $(DSUPERLU_INCLUDE)\ ${CINCLUDES} HEADERS =\ HYPRE_parcsr_ls.h\ _hypre_parcsr_ls.h\ aux_interp.h\ block_tridiag.h\ Common.h\ par_amg.h\ par_amgdd.h\ par_amgdd_comp_grid.h\ par_fsai.h\ schwarz.h FILES =\ amg_hybrid.c\ aux_interp.c\ F90_hypre_laplace.c\ F90_HYPRE_parcsr_amg.c\ F90_HYPRE_parcsr_bicgstab.c\ F90_HYPRE_parcsr_block.c\ F90_HYPRE_parcsr_cgnr.c\ F90_HYPRE_parcsr_Euclid.c\ F90_HYPRE_parcsr_gmres.c\ F90_HYPRE_parcsr_cogmres.c\ F90_HYPRE_parcsr_flexgmres.c\ F90_HYPRE_parcsr_lgmres.c\ F90_HYPRE_parcsr_hybrid.c\ F90_HYPRE_parcsr_int.c\ F90_HYPRE_parcsr_ParaSails.c\ F90_HYPRE_parcsr_pcg.c\ F90_HYPRE_parcsr_pilut.c\ F90_HYPRE_parcsr_schwarz.c\ F90_HYPRE_parcsr_mgr.c\ F90_HYPRE_parcsr_ilu.c\ F90_HYPRE_ams.c\ gen_redcs_mat.c\ HYPRE_parcsr_amg.c\ HYPRE_parcsr_amgdd.c\ HYPRE_parcsr_bicgstab.c\ HYPRE_parcsr_block.c\ HYPRE_parcsr_cgnr.c\ HYPRE_parcsr_Euclid.c\ HYPRE_parcsr_gmres.c\ HYPRE_parcsr_cogmres.c\ HYPRE_parcsr_flexgmres.c\ HYPRE_parcsr_lgmres.c\ HYPRE_parcsr_hybrid.c\ HYPRE_parcsr_int.c\ HYPRE_parcsr_mgr.c\ HYPRE_parcsr_ilu.c \ HYPRE_parcsr_fsai.c \ HYPRE_parcsr_ParaSails.c\ HYPRE_parcsr_pcg.c\ HYPRE_parcsr_pilut.c\ HYPRE_parcsr_schwarz.c\ HYPRE_ams.c\ HYPRE_ads.c\ HYPRE_ame.c\ par_2s_interp.c\ par_amg.c\ par_amgdd.c\ par_amgdd_comp_grid.c\ par_amgdd_setup.c\ par_amgdd_solve.c\ par_amgdd_fac_cycle.c\ par_amgdd_helpers.c\ par_amg_solve.c\ par_amg_solveT.c\ par_fsai.c\ par_fsai_setup.c\ par_fsai_solve.c\ par_cg_relax_wt.c\ par_coarsen.c\ par_cgc_coarsen.c\ par_cheby.c\ par_coarse_parms.c\ par_coordinates.c\ par_cr.c\ par_cycle.c\ par_add_cycle.c\ par_difconv.c\ par_gauss_elim.c\ par_gsmg.c\ par_indepset.c\ par_interp.c\ par_jacobi_interp.c\ par_krylov_func.c\ par_ilu.c\ par_ilu_setup.c \ par_mod_lr_interp.c\ par_multi_interp.c\ par_mod_multi_interp.c\ par_laplace.c\ par_laplace_27pt.c\ par_laplace_9pt.c\ par_lr_interp.c\ par_mgr.c\ par_mgr_coarsen.c\ par_mgr_interp.c\ par_mgr_rap.c\ par_mgr_setup.c\ par_mgr_solve.c\ par_mgr_stats.c\ par_nongalerkin.c\ par_nodal_systems.c\ par_rap.c\ par_rap_communication.c\ par_rotate_7pt.c\ par_relax.c\ par_relax_more.c\ par_relax_interface.c\ par_scaled_matnorm.c\ par_schwarz.c\ par_stats.c\ par_strength.c\ par_sv_interp.c\ par_sv_interp_ln.c\ par_vardifconv.c\ par_vardifconv_rs.c\ partial.c\ schwarz.c\ block_tridiag.c\ par_restr.c\ par_lr_restr.c CUFILES =\ ads.c\ ams.c\ ame.c\ dsuperlu.c\ par_amg_setup.c\ par_ge_device.c\ par_ilu_setup_device.c\ par_ilu_solve_device.c\ par_ilu_solve.c \ par_cheby_device.c\ par_relax_more_device.c\ par_coarsen_device.c\ par_coarse_parms_device.c\ par_indepset_device.c\ par_interp_device.c\ par_lr_restr_device.c\ par_interp_trunc_device.c\ par_lr_interp_device.c\ par_strength_device.c\ par_strength2nd_device.c\ par_amgdd_fac_cycle_device.c\ par_2s_interp_device.c\ par_relax_device.c\ par_mod_multi_interp_device.c\ par_mgr_device.c\ par_fsai_device.c COBJS = ${FILES:.c=.o} CUOBJS = ${CUFILES:.c=.obj} OBJS = ${COBJS} ${CUOBJS} SONAME = libHYPRE_parcsr_ls-${HYPRE_RELEASE_VERSION}${HYPRE_LIB_SUFFIX} ################################################################## # Targets ################################################################## all: libHYPRE_parcsr_ls${HYPRE_LIB_SUFFIX} cp -fR $(srcdir)/HYPRE_*.h $(HYPRE_BUILD_DIR)/include cp -fR $(srcdir)/_hypre_parcsr_ls.h $(HYPRE_BUILD_DIR)/include # cp -fR libHYPRE* $(HYPRE_BUILD_DIR)/lib install: libHYPRE_parcsr_ls${HYPRE_LIB_SUFFIX} cp -fR $(srcdir)/HYPRE_*.h $(HYPRE_INC_INSTALL) cp -fR $(srcdir)/_hypre_parcsr_ls.h $(HYPRE_INC_INSTALL) # cp -fR libHYPRE* $(HYPRE_LIB_INSTALL) clean: rm -f *.o *.obj libHYPRE* rm -rf pchdir tca.map *inslog* distclean: clean ################################################################## # Rules ################################################################## libHYPRE_parcsr_ls.a: ${OBJS} @echo "Building $@ ... " ${AR} $@ ${OBJS} ${RANLIB} $@ libHYPRE_parcsr_ls.so libHYPRE_parcsr_ls.dylib: ${OBJS} @echo "Building $@ ... " ${BUILD_CC_SHARED} -o ${SONAME} ${OBJS} ${SHARED_SET_SONAME}${SONAME} ln -s -f ${SONAME} $@ ${OBJS}: ${HEADERS} hypre-2.33.0/src/parcsr_ls/_hypre_parcsr_ls.h000066400000000000000000011215641477326011500212340ustar00rootroot00000000000000 /*** DO NOT EDIT THIS FILE DIRECTLY (use 'headers' to generate) ***/ #ifndef hypre_PARCSR_LS_HEADER #define hypre_PARCSR_LS_HEADER #include #include "HYPRE_parcsr_ls.h" #include "_hypre_parcsr_mv.h" #include "krylov.h" #include "HYPRE_lobpcg.h" #ifdef __cplusplus extern "C" { #endif typedef struct { HYPRE_Int prev; HYPRE_Int next; } Link; /****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #ifndef hypre_ParAMG_DATA_HEADER #define hypre_ParAMG_DATA_HEADER #define CUMNUMIT #include "par_csr_block_matrix.h" /*-------------------------------------------------------------------------- * hypre_ParAMGData *--------------------------------------------------------------------------*/ typedef struct { /* Base solver data structure */ hypre_Solver base; /* Memory location of matrices/vectors in AMGData */ HYPRE_MemoryLocation memory_location; /* setup params */ HYPRE_Int max_levels; HYPRE_Real strong_threshold; HYPRE_Int coarsen_cut_factor; HYPRE_Real strong_thresholdR; /* theta for build R: defines strong F neighbors */ HYPRE_Real filter_thresholdR; /* theta for filtering R */ HYPRE_Real max_row_sum; HYPRE_Real trunc_factor; HYPRE_Real agg_trunc_factor; HYPRE_Real agg_P12_trunc_factor; HYPRE_Real jacobi_trunc_threshold; HYPRE_Real S_commpkg_switch; HYPRE_Real CR_rate; HYPRE_Real CR_strong_th; HYPRE_Real A_drop_tol; HYPRE_Int A_drop_type; HYPRE_Int measure_type; HYPRE_Int setup_type; HYPRE_Int coarsen_type; HYPRE_Int P_max_elmts; HYPRE_Int interp_type; HYPRE_Int sep_weight; HYPRE_Int agg_interp_type; HYPRE_Int agg_P_max_elmts; HYPRE_Int agg_P12_max_elmts; HYPRE_Int restr_par; HYPRE_Int is_triangular; HYPRE_Int gmres_switch; HYPRE_Int agg_num_levels; HYPRE_Int num_paths; HYPRE_Int post_interp_type; HYPRE_Int num_CR_relax_steps; HYPRE_Int IS_type; HYPRE_Int CR_use_CG; HYPRE_Int cgc_its; HYPRE_Int max_coarse_size; HYPRE_Int min_coarse_size; HYPRE_Int seq_threshold; HYPRE_Int redundant; HYPRE_Int participate; HYPRE_Int Sabs; /* solve params */ HYPRE_Int max_iter; HYPRE_Int min_iter; HYPRE_Int fcycle; HYPRE_Int cycle_type; HYPRE_Int *num_grid_sweeps; HYPRE_Int *grid_relax_type; HYPRE_Int **grid_relax_points; HYPRE_Int relax_order; HYPRE_Int user_coarse_relax_type; HYPRE_Int user_relax_type; HYPRE_Int user_num_sweeps; HYPRE_Real user_relax_weight; HYPRE_Real outer_wt; HYPRE_Real *relax_weight; HYPRE_Real *omega; HYPRE_Int converge_type; HYPRE_Real tol; HYPRE_Int partial_cycle_coarsest_level; HYPRE_Int partial_cycle_control; /* problem data */ hypre_ParCSRMatrix *A; HYPRE_Int num_variables; HYPRE_Int num_functions; HYPRE_Int filter_functions; HYPRE_Int nodal; HYPRE_Int nodal_levels; HYPRE_Int nodal_diag; HYPRE_Int keep_same_sign; HYPRE_Int num_points; hypre_IntArray *dof_func; HYPRE_Int *dof_point; HYPRE_Int *point_dof_map; /* data generated in the setup phase */ hypre_ParCSRMatrix **A_array; hypre_ParVector **F_array; hypre_ParVector **U_array; hypre_ParCSRMatrix **P_array; hypre_ParCSRMatrix **R_array; hypre_IntArray **CF_marker_array; hypre_IntArray **dof_func_array; HYPRE_Int **dof_point_array; HYPRE_Int **point_dof_map_array; HYPRE_Int num_levels; hypre_Vector **l1_norms; /* Block data */ hypre_ParCSRBlockMatrix **A_block_array; hypre_ParCSRBlockMatrix **P_block_array; hypre_ParCSRBlockMatrix **R_block_array; HYPRE_Int block_mode; /* data for more complex smoothers */ HYPRE_Int smooth_num_levels; HYPRE_Int smooth_type; HYPRE_Solver *smoother; HYPRE_Int smooth_num_sweeps; HYPRE_Int schw_variant; HYPRE_Int schw_overlap; HYPRE_Int schw_domain_type; HYPRE_Real schwarz_rlx_weight; HYPRE_Int schwarz_use_nonsymm; HYPRE_Int ps_sym; HYPRE_Int ps_level; HYPRE_Int pi_max_nz_per_row; HYPRE_Int eu_level; HYPRE_Int eu_bj; HYPRE_Real ps_threshold; HYPRE_Real ps_filter; HYPRE_Real pi_drop_tol; HYPRE_Real eu_sparse_A; char *euclidfile; /* ILU parameters */ HYPRE_Int ilu_lfil; HYPRE_Int ilu_type; HYPRE_Int ilu_max_row_nnz; HYPRE_Int ilu_max_iter; HYPRE_Real ilu_droptol; HYPRE_Int ilu_tri_solve; HYPRE_Int ilu_lower_jacobi_iters; HYPRE_Int ilu_upper_jacobi_iters; HYPRE_Int ilu_reordering_type; HYPRE_Int ilu_iter_setup_type; HYPRE_Int ilu_iter_setup_option; HYPRE_Int ilu_iter_setup_max_iter; HYPRE_Real ilu_iter_setup_tolerance; /* FSAI parameters */ HYPRE_Int fsai_algo_type; HYPRE_Int fsai_local_solve_type; HYPRE_Int fsai_max_steps; HYPRE_Int fsai_max_step_size; HYPRE_Int fsai_max_nnz_row; HYPRE_Int fsai_num_levels; HYPRE_Real fsai_threshold; HYPRE_Int fsai_eig_max_iters; HYPRE_Real fsai_kap_tolerance; HYPRE_Real *max_eig_est; HYPRE_Real *min_eig_est; HYPRE_Int cheby_eig_est; HYPRE_Int cheby_order; HYPRE_Int cheby_variant; HYPRE_Int cheby_scale; HYPRE_Real cheby_fraction; hypre_Vector **cheby_ds; HYPRE_Real **cheby_coefs; HYPRE_Real cum_nnz_AP; /* data needed for non-Galerkin option */ HYPRE_Int nongalerk_num_tol; HYPRE_Real *nongalerk_tol; HYPRE_Real nongalerkin_tol; HYPRE_Real *nongal_tol_array; /* data generated in the solve phase */ hypre_ParVector *Vtemp; hypre_Vector *Vtemp_local; HYPRE_Real *Vtemp_local_data; HYPRE_Real cycle_op_count; hypre_ParVector *Rtemp; hypre_ParVector *Ptemp; hypre_ParVector *Ztemp; /* fields used by GSMG and LS interpolation */ HYPRE_Int gsmg; /* nonzero indicates use of GSMG */ HYPRE_Int num_samples; /* number of sample vectors */ /* log info */ HYPRE_Int logging; HYPRE_Int num_iterations; #ifdef CUMNUMIT HYPRE_Int cum_num_iterations; #endif HYPRE_Real rel_resid_norm; hypre_ParVector *residual; /* available if logging>1 */ /* output params */ HYPRE_Int print_level; char log_file_name[256]; HYPRE_Int debug_flag; /* whether to print the constructed coarse grids BM Oct 22, 2006 */ HYPRE_Int plot_grids; char plot_filename[251]; /* coordinate data BM Oct 17, 2006 */ HYPRE_Int coorddim; float *coordinates; /* data for fitting vectors in interpolation */ HYPRE_Int num_interp_vectors; HYPRE_Int num_levels_interp_vectors; /* not set by user */ hypre_ParVector **interp_vectors; hypre_ParVector ***interp_vectors_array; HYPRE_Int interp_vec_variant; HYPRE_Int interp_vec_first_level; HYPRE_Real interp_vectors_abs_q_trunc; HYPRE_Int interp_vectors_q_max; HYPRE_Int interp_refine; HYPRE_Int smooth_interp_vectors; HYPRE_Real *expandp_weights; /* currently not set by user */ /* enable redundant coarse grid solve */ HYPRE_Solver coarse_solver; hypre_ParCSRMatrix *A_coarse; hypre_ParVector *f_coarse; hypre_ParVector *u_coarse; MPI_Comm new_comm; /* store matrix, vector and communication info for Gaussian elimination */ HYPRE_MemoryLocation ge_memory_location; HYPRE_Int gs_setup; HYPRE_Int *comm_info; HYPRE_Int *A_piv; HYPRE_Real *A_mat; HYPRE_Real *A_work; HYPRE_Real *b_vec; HYPRE_Real *u_vec; /* information for multiplication with Lambda - additive AMG */ HYPRE_Int additive; HYPRE_Int mult_additive; HYPRE_Int simple; HYPRE_Int add_last_lvl; HYPRE_Int add_P_max_elmts; HYPRE_Real add_trunc_factor; HYPRE_Int add_rlx_type; HYPRE_Real add_rlx_wt; hypre_ParCSRMatrix *Lambda; hypre_ParCSRMatrix *Atilde; hypre_ParVector *Rtilde; hypre_ParVector *Xtilde; HYPRE_Real *D_inv; /* Use 2 mat-mat-muls instead of triple product*/ HYPRE_Int rap2; HYPRE_Int keepTranspose; HYPRE_Int modularized_matmat; /* information for preserving indices as coarse grid points */ HYPRE_Int num_C_points; HYPRE_Int C_points_coarse_level; HYPRE_Int *C_points_local_marker; HYPRE_BigInt *C_points_marker; /* information for preserving indices as special fine grid points */ HYPRE_Int num_isolated_F_points; HYPRE_BigInt *isolated_F_points_marker; /* information for preserving indices as fine grid points */ HYPRE_Int num_F_points; HYPRE_BigInt *F_points_marker; #ifdef HYPRE_USING_DSUPERLU /* Parameters and data for SuperLU_Dist */ HYPRE_Int dslu_threshold; HYPRE_Solver dslu_solver; #endif } hypre_ParAMGData; /*-------------------------------------------------------------------------- * Accessor functions for the hypre_AMGData structure *--------------------------------------------------------------------------*/ /* setup params */ #define hypre_ParAMGDataMemoryLocation(amg_data) ((amg_data) -> memory_location) #define hypre_ParAMGDataRestriction(amg_data) ((amg_data) -> restr_par) #define hypre_ParAMGDataIsTriangular(amg_data) ((amg_data) -> is_triangular) #define hypre_ParAMGDataGMRESSwitchR(amg_data) ((amg_data) -> gmres_switch) #define hypre_ParAMGDataMaxLevels(amg_data) ((amg_data) -> max_levels) #define hypre_ParAMGDataCoarsenCutFactor(amg_data) ((amg_data) -> coarsen_cut_factor) #define hypre_ParAMGDataStrongThreshold(amg_data) ((amg_data) -> strong_threshold) #define hypre_ParAMGDataStrongThresholdR(amg_data) ((amg_data) -> strong_thresholdR) #define hypre_ParAMGDataFilterThresholdR(amg_data) ((amg_data) -> filter_thresholdR) #define hypre_ParAMGDataSabs(amg_data) ((amg_data) -> Sabs) #define hypre_ParAMGDataMaxRowSum(amg_data) ((amg_data) -> max_row_sum) #define hypre_ParAMGDataTruncFactor(amg_data) ((amg_data) -> trunc_factor) #define hypre_ParAMGDataAggTruncFactor(amg_data) ((amg_data) -> agg_trunc_factor) #define hypre_ParAMGDataAggP12TruncFactor(amg_data) ((amg_data) -> agg_P12_trunc_factor) #define hypre_ParAMGDataJacobiTruncThreshold(amg_data) ((amg_data) -> jacobi_trunc_threshold) #define hypre_ParAMGDataSCommPkgSwitch(amg_data) ((amg_data) -> S_commpkg_switch) #define hypre_ParAMGDataInterpType(amg_data) ((amg_data) -> interp_type) #define hypre_ParAMGDataSepWeight(amg_data) ((amg_data) -> sep_weight) #define hypre_ParAMGDataAggInterpType(amg_data) ((amg_data) -> agg_interp_type) #define hypre_ParAMGDataCoarsenType(amg_data) ((amg_data) -> coarsen_type) #define hypre_ParAMGDataMeasureType(amg_data) ((amg_data) -> measure_type) #define hypre_ParAMGDataSetupType(amg_data) ((amg_data) -> setup_type) #define hypre_ParAMGDataPMaxElmts(amg_data) ((amg_data) -> P_max_elmts) #define hypre_ParAMGDataAggPMaxElmts(amg_data) ((amg_data) -> agg_P_max_elmts) #define hypre_ParAMGDataAggP12MaxElmts(amg_data) ((amg_data) -> agg_P12_max_elmts) #define hypre_ParAMGDataNumPaths(amg_data) ((amg_data) -> num_paths) #define hypre_ParAMGDataAggNumLevels(amg_data) ((amg_data) -> agg_num_levels) #define hypre_ParAMGDataPostInterpType(amg_data) ((amg_data) -> post_interp_type) #define hypre_ParAMGDataNumCRRelaxSteps(amg_data) ((amg_data) -> num_CR_relax_steps) #define hypre_ParAMGDataCRRate(amg_data) ((amg_data) -> CR_rate) #define hypre_ParAMGDataCRStrongTh(amg_data) ((amg_data) -> CR_strong_th) #define hypre_ParAMGDataADropTol(amg_data) ((amg_data) -> A_drop_tol) #define hypre_ParAMGDataADropType(amg_data) ((amg_data) -> A_drop_type) #define hypre_ParAMGDataISType(amg_data) ((amg_data) -> IS_type) #define hypre_ParAMGDataCRUseCG(amg_data) ((amg_data) -> CR_use_CG) #define hypre_ParAMGDataL1Norms(amg_data) ((amg_data) -> l1_norms) #define hypre_ParAMGDataCGCIts(amg_data) ((amg_data) -> cgc_its) #define hypre_ParAMGDataMaxCoarseSize(amg_data) ((amg_data) -> max_coarse_size) #define hypre_ParAMGDataMinCoarseSize(amg_data) ((amg_data) -> min_coarse_size) #define hypre_ParAMGDataSeqThreshold(amg_data) ((amg_data) -> seq_threshold) /* solve params */ #define hypre_ParAMGDataMinIter(amg_data) ((amg_data)->min_iter) #define hypre_ParAMGDataMaxIter(amg_data) ((amg_data)->max_iter) #define hypre_ParAMGDataFCycle(amg_data) ((amg_data)->fcycle) #define hypre_ParAMGDataCycleType(amg_data) ((amg_data)->cycle_type) #define hypre_ParAMGDataConvergeType(amg_data) ((amg_data)->converge_type) #define hypre_ParAMGDataTol(amg_data) ((amg_data)->tol) #define hypre_ParAMGDataPartialCycleCoarsestLevel(amg_data) ((amg_data)->partial_cycle_coarsest_level) #define hypre_ParAMGDataPartialCycleControl(amg_data) ((amg_data)->partial_cycle_control) #define hypre_ParAMGDataNumGridSweeps(amg_data) ((amg_data)->num_grid_sweeps) #define hypre_ParAMGDataUserCoarseRelaxType(amg_data) ((amg_data)->user_coarse_relax_type) #define hypre_ParAMGDataUserRelaxType(amg_data) ((amg_data)->user_relax_type) #define hypre_ParAMGDataUserRelaxWeight(amg_data) ((amg_data)->user_relax_weight) #define hypre_ParAMGDataUserNumSweeps(amg_data) ((amg_data)->user_num_sweeps) #define hypre_ParAMGDataGridRelaxType(amg_data) ((amg_data)->grid_relax_type) #define hypre_ParAMGDataGridRelaxPoints(amg_data) ((amg_data)->grid_relax_points) #define hypre_ParAMGDataRelaxOrder(amg_data) ((amg_data)->relax_order) #define hypre_ParAMGDataRelaxWeight(amg_data) ((amg_data)->relax_weight) #define hypre_ParAMGDataOmega(amg_data) ((amg_data)->omega) #define hypre_ParAMGDataOuterWt(amg_data) ((amg_data)->outer_wt) /* problem data parameters */ #define hypre_ParAMGDataNumVariables(amg_data) ((amg_data)->num_variables) #define hypre_ParAMGDataNumFunctions(amg_data) ((amg_data)->num_functions) #define hypre_ParAMGDataFilterFunctions(amg_data) ((amg_data)->filter_functions) #define hypre_ParAMGDataNodal(amg_data) ((amg_data)->nodal) #define hypre_ParAMGDataNodalLevels(amg_data) ((amg_data)->nodal_levels) #define hypre_ParAMGDataNodalDiag(amg_data) ((amg_data)->nodal_diag) #define hypre_ParAMGDataKeepSameSign(amg_data) ((amg_data)->keep_same_sign) #define hypre_ParAMGDataNumPoints(amg_data) ((amg_data)->num_points) #define hypre_ParAMGDataDofFunc(amg_data) ((amg_data)->dof_func) #define hypre_ParAMGDataDofPoint(amg_data) ((amg_data)->dof_point) #define hypre_ParAMGDataPointDofMap(amg_data) ((amg_data)->point_dof_map) /* data generated by the setup phase */ #define hypre_ParAMGDataCFMarkerArray(amg_data) ((amg_data)-> CF_marker_array) #define hypre_ParAMGDataAArray(amg_data) ((amg_data)->A_array) #define hypre_ParAMGDataFArray(amg_data) ((amg_data)->F_array) #define hypre_ParAMGDataUArray(amg_data) ((amg_data)->U_array) #define hypre_ParAMGDataPArray(amg_data) ((amg_data)->P_array) #define hypre_ParAMGDataRArray(amg_data) ((amg_data)->R_array) #define hypre_ParAMGDataDofFuncArray(amg_data) ((amg_data)->dof_func_array) #define hypre_ParAMGDataDofPointArray(amg_data) ((amg_data)->dof_point_array) #define hypre_ParAMGDataPointDofMapArray(amg_data) \ ((amg_data)->point_dof_map_array) #define hypre_ParAMGDataNumLevels(amg_data) ((amg_data)->num_levels) #define hypre_ParAMGDataSmoothType(amg_data) ((amg_data)->smooth_type) #define hypre_ParAMGDataSmoothNumLevels(amg_data) \ ((amg_data)->smooth_num_levels) #define hypre_ParAMGDataSmoothNumSweeps(amg_data) \ ((amg_data)->smooth_num_sweeps) #define hypre_ParAMGDataSmoother(amg_data) ((amg_data)->smoother) #define hypre_ParAMGDataVariant(amg_data) ((amg_data)->schw_variant) #define hypre_ParAMGDataOverlap(amg_data) ((amg_data)->schw_overlap) #define hypre_ParAMGDataDomainType(amg_data) ((amg_data)->schw_domain_type) #define hypre_ParAMGDataSchwarzRlxWeight(amg_data) \ ((amg_data)->schwarz_rlx_weight) #define hypre_ParAMGDataSchwarzUseNonSymm(amg_data) \ ((amg_data)->schwarz_use_nonsymm) #define hypre_ParAMGDataSym(amg_data) ((amg_data)->ps_sym) #define hypre_ParAMGDataLevel(amg_data) ((amg_data)->ps_level) #define hypre_ParAMGDataMaxNzPerRow(amg_data) ((amg_data)->pi_max_nz_per_row) #define hypre_ParAMGDataThreshold(amg_data) ((amg_data)->ps_threshold) #define hypre_ParAMGDataFilter(amg_data) ((amg_data)->ps_filter) #define hypre_ParAMGDataDropTol(amg_data) ((amg_data)->pi_drop_tol) #define hypre_ParAMGDataEuclidFile(amg_data) ((amg_data)->euclidfile) #define hypre_ParAMGDataEuLevel(amg_data) ((amg_data)->eu_level) #define hypre_ParAMGDataEuSparseA(amg_data) ((amg_data)->eu_sparse_A) #define hypre_ParAMGDataEuBJ(amg_data) ((amg_data)->eu_bj) #define hypre_ParAMGDataILUType(amg_data) ((amg_data)->ilu_type) #define hypre_ParAMGDataILULevel(amg_data) ((amg_data)->ilu_lfil) #define hypre_ParAMGDataILUMaxRowNnz(amg_data) ((amg_data)->ilu_max_row_nnz) #define hypre_ParAMGDataILUDroptol(amg_data) ((amg_data)->ilu_droptol) #define hypre_ParAMGDataILUTriSolve(amg_data) ((amg_data)->ilu_tri_solve) #define hypre_ParAMGDataILULowerJacobiIters(amg_data) ((amg_data)->ilu_lower_jacobi_iters) #define hypre_ParAMGDataILUUpperJacobiIters(amg_data) ((amg_data)->ilu_upper_jacobi_iters) #define hypre_ParAMGDataILUMaxIter(amg_data) ((amg_data)->ilu_max_iter) #define hypre_ParAMGDataILULocalReordering(amg_data) ((amg_data)->ilu_reordering_type) #define hypre_ParAMGDataILUIterSetupType(amg_data) ((amg_data)->ilu_iter_setup_type) #define hypre_ParAMGDataILUIterSetupOption(amg_data) ((amg_data)->ilu_iter_setup_option) #define hypre_ParAMGDataILUIterSetupMaxIter(amg_data) ((amg_data)->ilu_iter_setup_max_iter) #define hypre_ParAMGDataILUIterSetupTolerance(amg_data) ((amg_data)->ilu_iter_setup_tolerance) #define hypre_ParAMGDataFSAIAlgoType(amg_data) ((amg_data)->fsai_algo_type) #define hypre_ParAMGDataFSAILocalSolveType(amg_data) ((amg_data)->fsai_local_solve_type) #define hypre_ParAMGDataFSAIMaxSteps(amg_data) ((amg_data)->fsai_max_steps) #define hypre_ParAMGDataFSAIMaxStepSize(amg_data) ((amg_data)->fsai_max_step_size) #define hypre_ParAMGDataFSAIMaxNnzRow(amg_data) ((amg_data)->fsai_max_nnz_row) #define hypre_ParAMGDataFSAINumLevels(amg_data) ((amg_data)->fsai_num_levels) #define hypre_ParAMGDataFSAIThreshold(amg_data) ((amg_data)->fsai_threshold) #define hypre_ParAMGDataFSAIEigMaxIters(amg_data) ((amg_data)->fsai_eig_max_iters) #define hypre_ParAMGDataFSAIKapTolerance(amg_data) ((amg_data)->fsai_kap_tolerance) #define hypre_ParAMGDataMaxEigEst(amg_data) ((amg_data)->max_eig_est) #define hypre_ParAMGDataMinEigEst(amg_data) ((amg_data)->min_eig_est) #define hypre_ParAMGDataChebyOrder(amg_data) ((amg_data)->cheby_order) #define hypre_ParAMGDataChebyFraction(amg_data) ((amg_data)->cheby_fraction) #define hypre_ParAMGDataChebyEigEst(amg_data) ((amg_data)->cheby_eig_est) #define hypre_ParAMGDataChebyVariant(amg_data) ((amg_data)->cheby_variant) #define hypre_ParAMGDataChebyScale(amg_data) ((amg_data)->cheby_scale) #define hypre_ParAMGDataChebyDS(amg_data) ((amg_data)->cheby_ds) #define hypre_ParAMGDataChebyCoefs(amg_data) ((amg_data)->cheby_coefs) #define hypre_ParAMGDataCumNnzAP(amg_data) ((amg_data)->cum_nnz_AP) /* block */ #define hypre_ParAMGDataABlockArray(amg_data) ((amg_data)->A_block_array) #define hypre_ParAMGDataPBlockArray(amg_data) ((amg_data)->P_block_array) #define hypre_ParAMGDataRBlockArray(amg_data) ((amg_data)->R_block_array) #define hypre_ParAMGDataBlockMode(amg_data) ((amg_data)->block_mode) /* data generated in the solve phase */ #define hypre_ParAMGDataVtemp(amg_data) ((amg_data)->Vtemp) #define hypre_ParAMGDataVtempLocal(amg_data) ((amg_data)->Vtemp_local) #define hypre_ParAMGDataVtemplocalData(amg_data) ((amg_data)->Vtemp_local_data) #define hypre_ParAMGDataCycleOpCount(amg_data) ((amg_data)->cycle_op_count) #define hypre_ParAMGDataRtemp(amg_data) ((amg_data)->Rtemp) #define hypre_ParAMGDataPtemp(amg_data) ((amg_data)->Ptemp) #define hypre_ParAMGDataZtemp(amg_data) ((amg_data)->Ztemp) /* fields used by GSMG */ #define hypre_ParAMGDataGSMG(amg_data) ((amg_data)->gsmg) #define hypre_ParAMGDataNumSamples(amg_data) ((amg_data)->num_samples) /* log info data */ #define hypre_ParAMGDataLogging(amg_data) ((amg_data)->logging) #define hypre_ParAMGDataNumIterations(amg_data) ((amg_data)->num_iterations) #ifdef CUMNUMIT #define hypre_ParAMGDataCumNumIterations(amg_data) ((amg_data)->cum_num_iterations) #endif #define hypre_ParAMGDataRelativeResidualNorm(amg_data) ((amg_data)->rel_resid_norm) #define hypre_ParAMGDataResidual(amg_data) ((amg_data)->residual) /* output parameters */ #define hypre_ParAMGDataPrintLevel(amg_data) ((amg_data)->print_level) #define hypre_ParAMGDataLogFileName(amg_data) ((amg_data)->log_file_name) #define hypre_ParAMGDataDebugFlag(amg_data) ((amg_data)->debug_flag) /* BM Oct 22, 2006 */ #define hypre_ParAMGDataPlotGrids(amg_data) ((amg_data)->plot_grids) #define hypre_ParAMGDataPlotFileName(amg_data) ((amg_data)->plot_filename) /* coordinates BM Oct 17, 2006 */ #define hypre_ParAMGDataCoordDim(amg_data) ((amg_data)->coorddim) #define hypre_ParAMGDataCoordinates(amg_data) ((amg_data)->coordinates) #define hypre_ParAMGNumInterpVectors(amg_data) ((amg_data)->num_interp_vectors) #define hypre_ParAMGNumLevelsInterpVectors(amg_data) ((amg_data)->num_levels_interp_vectors) #define hypre_ParAMGInterpVectors(amg_data) ((amg_data)->interp_vectors) #define hypre_ParAMGInterpVectorsArray(amg_data) ((amg_data)->interp_vectors_array) #define hypre_ParAMGInterpVecVariant(amg_data) ((amg_data)->interp_vec_variant) #define hypre_ParAMGInterpVecFirstLevel(amg_data) ((amg_data)->interp_vec_first_level) #define hypre_ParAMGInterpVecAbsQTrunc(amg_data) ((amg_data)->interp_vectors_abs_q_trunc) #define hypre_ParAMGInterpVecQMax(amg_data) ((amg_data)->interp_vectors_q_max) #define hypre_ParAMGInterpRefine(amg_data) ((amg_data)->interp_refine) #define hypre_ParAMGSmoothInterpVectors(amg_data) ((amg_data)->smooth_interp_vectors) #define hypre_ParAMGDataExpandPWeights(amg_data) ((amg_data)->expandp_weights) #define hypre_ParAMGDataCoarseSolver(amg_data) ((amg_data)->coarse_solver) #define hypre_ParAMGDataACoarse(amg_data) ((amg_data)->A_coarse) #define hypre_ParAMGDataFCoarse(amg_data) ((amg_data)->f_coarse) #define hypre_ParAMGDataUCoarse(amg_data) ((amg_data)->u_coarse) #define hypre_ParAMGDataNewComm(amg_data) ((amg_data)->new_comm) #define hypre_ParAMGDataRedundant(amg_data) ((amg_data)->redundant) #define hypre_ParAMGDataParticipate(amg_data) ((amg_data)->participate) #define hypre_ParAMGDataGSSetup(amg_data) ((amg_data)->gs_setup) #define hypre_ParAMGDataGEMemoryLocation(amg_data) ((amg_data)->ge_memory_location) #define hypre_ParAMGDataAMat(amg_data) ((amg_data)->A_mat) #define hypre_ParAMGDataAWork(amg_data) ((amg_data)->A_work) #define hypre_ParAMGDataAPiv(amg_data) ((amg_data)->A_piv) #define hypre_ParAMGDataBVec(amg_data) ((amg_data)->b_vec) #define hypre_ParAMGDataUVec(amg_data) ((amg_data)->u_vec) #define hypre_ParAMGDataCommInfo(amg_data) ((amg_data)->comm_info) /* additive AMG parameters */ #define hypre_ParAMGDataAdditive(amg_data) ((amg_data)->additive) #define hypre_ParAMGDataMultAdditive(amg_data) ((amg_data)->mult_additive) #define hypre_ParAMGDataSimple(amg_data) ((amg_data)->simple) #define hypre_ParAMGDataAddLastLvl(amg_data) ((amg_data)->add_last_lvl) #define hypre_ParAMGDataMultAddPMaxElmts(amg_data) ((amg_data)->add_P_max_elmts) #define hypre_ParAMGDataMultAddTruncFactor(amg_data) ((amg_data)->add_trunc_factor) #define hypre_ParAMGDataAddRelaxType(amg_data) ((amg_data)->add_rlx_type) #define hypre_ParAMGDataAddRelaxWt(amg_data) ((amg_data)->add_rlx_wt) #define hypre_ParAMGDataLambda(amg_data) ((amg_data)->Lambda) #define hypre_ParAMGDataAtilde(amg_data) ((amg_data)->Atilde) #define hypre_ParAMGDataRtilde(amg_data) ((amg_data)->Rtilde) #define hypre_ParAMGDataXtilde(amg_data) ((amg_data)->Xtilde) #define hypre_ParAMGDataDinv(amg_data) ((amg_data)->D_inv) /* non-Galerkin parameters */ #define hypre_ParAMGDataNonGalerkNumTol(amg_data) ((amg_data)->nongalerk_num_tol) #define hypre_ParAMGDataNonGalerkTol(amg_data) ((amg_data)->nongalerk_tol) #define hypre_ParAMGDataNonGalerkinTol(amg_data) ((amg_data)->nongalerkin_tol) #define hypre_ParAMGDataNonGalTolArray(amg_data) ((amg_data)->nongal_tol_array) #define hypre_ParAMGDataRAP2(amg_data) ((amg_data)->rap2) #define hypre_ParAMGDataKeepTranspose(amg_data) ((amg_data)->keepTranspose) #define hypre_ParAMGDataModularizedMatMat(amg_data) ((amg_data)->modularized_matmat) /*indices for the dof which will keep coarsening to the coarse level */ #define hypre_ParAMGDataNumCPoints(amg_data) ((amg_data)->num_C_points) #define hypre_ParAMGDataCPointsLevel(amg_data) ((amg_data)->C_points_coarse_level) #define hypre_ParAMGDataCPointsLocalMarker(amg_data) ((amg_data)->C_points_local_marker) #define hypre_ParAMGDataCPointsMarker(amg_data) ((amg_data)->C_points_marker) /* information for preserving indices as special fine grid points */ #define hypre_ParAMGDataNumIsolatedFPoints(amg_data) ((amg_data)->num_isolated_F_points) #define hypre_ParAMGDataIsolatedFPointsMarker(amg_data) ((amg_data)->isolated_F_points_marker) /* information for preserving indices as fine grid points */ #define hypre_ParAMGDataNumFPoints(amg_data) ((amg_data)->num_F_points) #define hypre_ParAMGDataFPointsMarker(amg_data) ((amg_data)->F_points_marker) /* Parameters and data for SuperLU_Dist */ #ifdef HYPRE_USING_DSUPERLU #define hypre_ParAMGDataDSLUThreshold(amg_data) ((amg_data)->dslu_threshold) #define hypre_ParAMGDataDSLUSolver(amg_data) ((amg_data)->dslu_solver) #endif #endif /****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #ifndef hypre_PAR_AMGDD_COMP_GRID_HEADER #define hypre_PAR_AMGDD_COMP_GRID_HEADER /*-------------------------------------------------------------------------- * hypre_AMGDDCommPkg *--------------------------------------------------------------------------*/ typedef struct { // Info needed for subsequent psi_c residual communication HYPRE_Int num_levels; // levels in the amg hierarchy HYPRE_Int *num_send_procs; // number of send procs to communicate with HYPRE_Int *num_recv_procs; // number of recv procs to communicate with HYPRE_Int **send_procs; // list of send procs HYPRE_Int **recv_procs; // list of recv procs HYPRE_Int **send_buffer_size; // size of send buffer on each level for each proc HYPRE_Int **recv_buffer_size; // size of recv buffer on each level for each proc HYPRE_Int ***num_send_nodes; // number of nodes to send on each composite level HYPRE_Int ***num_recv_nodes; // number of nodes to recv on each composite level HYPRE_Int ****send_flag; // flags which nodes to send after composite grid is built HYPRE_Int ****recv_map; // mapping from recv buffer to appropriate local indices on each comp grid HYPRE_Int ****recv_red_marker; // marker indicating a redundant recv } hypre_AMGDDCommPkg; /*-------------------------------------------------------------------------- * Accessor functions for the Comp Grid Comm Pkg structure *--------------------------------------------------------------------------*/ #define hypre_AMGDDCommPkgNumLevels(compGridCommPkg) ((compGridCommPkg) -> num_levels) #define hypre_AMGDDCommPkgNumSendProcs(compGridCommPkg) ((compGridCommPkg) -> num_send_procs) #define hypre_AMGDDCommPkgNumRecvProcs(compGridCommPkg) ((compGridCommPkg) -> num_recv_procs) #define hypre_AMGDDCommPkgSendProcs(compGridCommPkg) ((compGridCommPkg) -> send_procs) #define hypre_AMGDDCommPkgRecvProcs(compGridCommPkg) ((compGridCommPkg) -> recv_procs) #define hypre_AMGDDCommPkgSendBufferSize(compGridCommPkg) ((compGridCommPkg) -> send_buffer_size) #define hypre_AMGDDCommPkgRecvBufferSize(compGridCommPkg) ((compGridCommPkg) -> recv_buffer_size) #define hypre_AMGDDCommPkgNumSendNodes(compGridCommPkg) ((compGridCommPkg) -> num_send_nodes) #define hypre_AMGDDCommPkgNumRecvNodes(compGridCommPkg) ((compGridCommPkg) -> num_recv_nodes) #define hypre_AMGDDCommPkgSendFlag(compGridCommPkg) ((compGridCommPkg) -> send_flag) #define hypre_AMGDDCommPkgRecvMap(compGridCommPkg) ((compGridCommPkg) -> recv_map) #define hypre_AMGDDCommPkgRecvRedMarker(compGridCommPkg) ((compGridCommPkg) -> recv_red_marker) /*-------------------------------------------------------------------------- * AMGDDCompGridMatrix (basically a coupled collection of CSR matrices) *--------------------------------------------------------------------------*/ typedef struct { hypre_CSRMatrix *owned_diag; // Domain: owned domain of mat. Range: owned range of mat. hypre_CSRMatrix *owned_offd; // Domain: nonowned domain of mat. Range: owned range of mat. hypre_CSRMatrix *nonowned_diag; // Domain: nonowned domain of mat. Range: nonowned range of mat. hypre_CSRMatrix *nonowned_offd; // Domain: owned domain of mat. Range: nonowned range of mat. hypre_CSRMatrix *real_real; // Domain: nonowned real. Range: nonowned real. hypre_CSRMatrix *real_ghost; // Domain: nonowned ghost. Range: nonowned real. HYPRE_Int owns_owned_matrices; HYPRE_Int owns_offd_col_indices; } hypre_AMGDDCompGridMatrix; /*-------------------------------------------------------------------------- * Accessor functions for the AMGDDCompGridMatrix structure *--------------------------------------------------------------------------*/ #define hypre_AMGDDCompGridMatrixOwnedDiag(matrix) ((matrix) -> owned_diag) #define hypre_AMGDDCompGridMatrixOwnedOffd(matrix) ((matrix) -> owned_offd) #define hypre_AMGDDCompGridMatrixNonOwnedDiag(matrix) ((matrix) -> nonowned_diag) #define hypre_AMGDDCompGridMatrixNonOwnedOffd(matrix) ((matrix) -> nonowned_offd) #define hypre_AMGDDCompGridMatrixRealReal(matrix) ((matrix) -> real_real) #define hypre_AMGDDCompGridMatrixRealGhost(matrix) ((matrix) -> real_ghost) #define hypre_AMGDDCompGridMatrixOwnsOwnedMatrices(matrix) ((matrix) -> owns_owned_matrices) #define hypre_AMGDDCompGridMatrixOwnsOffdColIndices(matrix) ((matrix) -> owns_offd_col_indices) /*-------------------------------------------------------------------------- * AMGDDCompGridVector *--------------------------------------------------------------------------*/ typedef struct { hypre_Vector *owned_vector; // Original on-processor points (should be ordered) hypre_Vector *nonowned_vector; // Off-processor points (not ordered) HYPRE_Int num_real; HYPRE_Int owns_owned_vector; } hypre_AMGDDCompGridVector; /*-------------------------------------------------------------------------- * Accessor functions for the AMGDDCompGridVector structure *--------------------------------------------------------------------------*/ #define hypre_AMGDDCompGridVectorOwned(matrix) ((matrix) -> owned_vector) #define hypre_AMGDDCompGridVectorNonOwned(matrix) ((matrix) -> nonowned_vector) #define hypre_AMGDDCompGridVectorNumReal(vector) ((vector) -> num_real) #define hypre_AMGDDCompGridVectorOwnsOwnedVector(matrix) ((matrix) -> owns_owned_vector) /*-------------------------------------------------------------------------- * hypre_AMGDDCompGrid *--------------------------------------------------------------------------*/ typedef struct { HYPRE_Int level; HYPRE_MemoryLocation memory_location; /* memory location of matrices/vectors */ HYPRE_BigInt first_global_index; HYPRE_BigInt last_global_index; HYPRE_Int num_owned_nodes; HYPRE_Int num_nonowned_nodes; HYPRE_Int num_nonowned_real_nodes; HYPRE_Int num_missing_col_indices; HYPRE_Int *nonowned_global_indices; HYPRE_Int *nonowned_coarse_indices; HYPRE_Int *nonowned_real_marker; HYPRE_Int *nonowned_sort; HYPRE_Int *nonowned_invsort; HYPRE_Int *nonowned_diag_missing_col_indices; HYPRE_Int *owned_coarse_indices; hypre_AMGDDCompGridMatrix *A; hypre_AMGDDCompGridMatrix *P; hypre_AMGDDCompGridMatrix *R; hypre_AMGDDCompGridVector *u; hypre_AMGDDCompGridVector *f; hypre_AMGDDCompGridVector *t; hypre_AMGDDCompGridVector *s; hypre_AMGDDCompGridVector *q; hypre_AMGDDCompGridVector *temp; hypre_AMGDDCompGridVector *temp2; hypre_AMGDDCompGridVector *temp3; HYPRE_Real *l1_norms; HYPRE_Int *cf_marker_array; HYPRE_Int *owned_relax_ordering; HYPRE_Int *nonowned_relax_ordering; } hypre_AMGDDCompGrid; /*-------------------------------------------------------------------------- * Accessor functions for the Comp Grid structure *--------------------------------------------------------------------------*/ #define hypre_AMGDDCompGridLevel(compGrid) ((compGrid) -> level) #define hypre_AMGDDCompGridMemoryLocation(compGrid) ((compGrid) -> memory_location) #define hypre_AMGDDCompGridFirstGlobalIndex(compGrid) ((compGrid) -> first_global_index) #define hypre_AMGDDCompGridLastGlobalIndex(compGrid) ((compGrid) -> last_global_index) #define hypre_AMGDDCompGridNumOwnedNodes(compGrid) ((compGrid) -> num_owned_nodes) #define hypre_AMGDDCompGridNumNonOwnedNodes(compGrid) ((compGrid) -> num_nonowned_nodes) #define hypre_AMGDDCompGridNumNonOwnedRealNodes(compGrid) ((compGrid) -> num_nonowned_real_nodes) #define hypre_AMGDDCompGridNumMissingColIndices(compGrid) ((compGrid) -> num_missing_col_indices) #define hypre_AMGDDCompGridNonOwnedGlobalIndices(compGrid) ((compGrid) -> nonowned_global_indices) #define hypre_AMGDDCompGridNonOwnedCoarseIndices(compGrid) ((compGrid) -> nonowned_coarse_indices) #define hypre_AMGDDCompGridNonOwnedRealMarker(compGrid) ((compGrid) -> nonowned_real_marker) #define hypre_AMGDDCompGridNonOwnedSort(compGrid) ((compGrid) -> nonowned_sort) #define hypre_AMGDDCompGridNonOwnedInvSort(compGrid) ((compGrid) -> nonowned_invsort) #define hypre_AMGDDCompGridOwnedCoarseIndices(compGrid) ((compGrid) -> owned_coarse_indices) #define hypre_AMGDDCompGridNonOwnedDiagMissingColIndices(compGrid) ((compGrid) -> nonowned_diag_missing_col_indices) #define hypre_AMGDDCompGridA(compGrid) ((compGrid) -> A) #define hypre_AMGDDCompGridP(compGrid) ((compGrid) -> P) #define hypre_AMGDDCompGridR(compGrid) ((compGrid) -> R) #define hypre_AMGDDCompGridU(compGrid) ((compGrid) -> u) #define hypre_AMGDDCompGridF(compGrid) ((compGrid) -> f) #define hypre_AMGDDCompGridT(compGrid) ((compGrid) -> t) #define hypre_AMGDDCompGridS(compGrid) ((compGrid) -> s) #define hypre_AMGDDCompGridQ(compGrid) ((compGrid) -> q) #define hypre_AMGDDCompGridTemp(compGrid) ((compGrid) -> temp) #define hypre_AMGDDCompGridTemp2(compGrid) ((compGrid) -> temp2) #define hypre_AMGDDCompGridTemp3(compGrid) ((compGrid) -> temp3) #define hypre_AMGDDCompGridL1Norms(compGrid) ((compGrid) -> l1_norms) #define hypre_AMGDDCompGridCFMarkerArray(compGrid) ((compGrid) -> cf_marker_array) #define hypre_AMGDDCompGridOwnedRelaxOrdering(compGrid) ((compGrid) -> owned_relax_ordering) #define hypre_AMGDDCompGridNonOwnedRelaxOrdering(compGrid) ((compGrid) -> nonowned_relax_ordering) #endif /****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #ifndef hypre_ParAMGDD_DATA_HEADER #define hypre_ParAMGDD_DATA_HEADER /*-------------------------------------------------------------------------- * hypre_ParAMGDDData *--------------------------------------------------------------------------*/ typedef struct { /* The underlying AMG hierarchy */ hypre_ParAMGData *amg_data; /* AMG-DD parameters and info */ HYPRE_Int start_level; HYPRE_Int fac_num_cycles; HYPRE_Int fac_cycle_type; HYPRE_Int fac_relax_type; HYPRE_Int fac_num_relax; HYPRE_Real fac_relax_weight; HYPRE_Int padding; HYPRE_Int num_ghost_layers; hypre_AMGDDCompGrid **amgdd_comp_grid; hypre_AMGDDCommPkg *amgdd_comm_pkg; hypre_ParVector *Ztemp; HYPRE_Int (*amgddUserFACRelaxation)( void *amgdd_vdata, HYPRE_Int level, HYPRE_Int cycle_param ); } hypre_ParAMGDDData; /*-------------------------------------------------------------------------- * Accessor functions for the hypre_AMGDDData structure *--------------------------------------------------------------------------*/ #define hypre_ParAMGDDDataAMG(amgdd_data) ((amgdd_data)->amg_data) #define hypre_ParAMGDDDataStartLevel(amgdd_data) ((amgdd_data)->start_level) #define hypre_ParAMGDDDataFACNumCycles(amgdd_data) ((amgdd_data)->fac_num_cycles) #define hypre_ParAMGDDDataFACCycleType(amgdd_data) ((amgdd_data)->fac_cycle_type) #define hypre_ParAMGDDDataFACRelaxType(amgdd_data) ((amgdd_data)->fac_relax_type) #define hypre_ParAMGDDDataFACNumRelax(amgdd_data) ((amgdd_data)->fac_num_relax) #define hypre_ParAMGDDDataFACRelaxWeight(amgdd_data) ((amgdd_data)->fac_relax_weight) #define hypre_ParAMGDDDataPadding(amgdd_data) ((amgdd_data)->padding) #define hypre_ParAMGDDDataNumGhostLayers(amgdd_data) ((amgdd_data)->num_ghost_layers) #define hypre_ParAMGDDDataCompGrid(amgdd_data) ((amgdd_data)->amgdd_comp_grid) #define hypre_ParAMGDDDataCommPkg(amgdd_data) ((amgdd_data)->amgdd_comm_pkg) #define hypre_ParAMGDDDataZtemp(amg_data) ((amgdd_data)->Ztemp) #define hypre_ParAMGDDDataUserFACRelaxation(amgdd_data) ((amgdd_data)->amgddUserFACRelaxation) #endif /****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #ifndef hypre_ParFSAI_DATA_HEADER #define hypre_ParFSAI_DATA_HEADER //#define DEBUG_FSAI /*-------------------------------------------------------------------------- * hypre_ParFSAIData *--------------------------------------------------------------------------*/ typedef struct hypre_ParFSAIData_struct { /* FSAI Setup input data */ HYPRE_Int algo_type; /* FSAI algorithm type */ HYPRE_Int local_solve_type; /* Local linear solver type */ HYPRE_Int max_steps; /* Max. iterations run per row */ HYPRE_Int max_step_size; /* Max. number of nonzeros added to a row of G per step */ HYPRE_Int max_nnz_row; /* Max. number of nonzeros per row of G */ HYPRE_Int num_levels; /* Number of levels for computing the candidate pattern */ HYPRE_Real threshold; /* Filtering threshold for the candidate pattern */ HYPRE_Real kap_tolerance; /* Min. amount of change between two steps */ /* FSAI Setup data */ HYPRE_Real density; /* Density of matrix G wrt. A */ hypre_ParCSRMatrix *Gmat; /* Matrix holding FSAI factor. M^(-1) = G'G */ hypre_ParCSRMatrix *GTmat; /* Matrix holding the transpose of the FSAI factor */ /* Solver data */ HYPRE_Int zero_guess; /* Flag indicating x0 = 0 */ HYPRE_Int eig_max_iters; /* Iters for computing max. eigenvalue of G^T*G*A */ HYPRE_Int max_iterations; /* Maximum iterations run for the solver */ HYPRE_Int num_iterations; /* Number of iterations the solver ran */ HYPRE_Real omega; /* Step size for Preconditioned Richardson Solver */ HYPRE_Real tolerance; /* Tolerance for the solver */ HYPRE_Real rel_resnorm; /* available if logging > 1 */ /* Work data */ hypre_ParVector *r_work; /* work vector used to compute the residual */ hypre_ParVector *z_work; /* work vector used for applying FSAI */ /* Log info data */ HYPRE_Int logging; HYPRE_Int print_level; } hypre_ParFSAIData; /*-------------------------------------------------------------------------- * Accessor functions for the hypre_ParFSAIData structure *--------------------------------------------------------------------------*/ /* FSAI Setup input data */ #define hypre_ParFSAIDataAlgoType(fsai_data) ((fsai_data) -> algo_type) #define hypre_ParFSAIDataLocalSolveType(fsai_data) ((fsai_data) -> local_solve_type) #define hypre_ParFSAIDataMaxSteps(fsai_data) ((fsai_data) -> max_steps) #define hypre_ParFSAIDataMaxStepSize(fsai_data) ((fsai_data) -> max_step_size) #define hypre_ParFSAIDataMaxNnzRow(fsai_data) ((fsai_data) -> max_nnz_row) #define hypre_ParFSAIDataNumLevels(fsai_data) ((fsai_data) -> num_levels) #define hypre_ParFSAIDataThreshold(fsai_data) ((fsai_data) -> threshold) #define hypre_ParFSAIDataKapTolerance(fsai_data) ((fsai_data) -> kap_tolerance) /* FSAI Setup data */ #define hypre_ParFSAIDataGmat(fsai_data) ((fsai_data) -> Gmat) #define hypre_ParFSAIDataGTmat(fsai_data) ((fsai_data) -> GTmat) #define hypre_ParFSAIDataDensity(fsai_data) ((fsai_data) -> density) /* Solver problem data */ #define hypre_ParFSAIDataZeroGuess(fsai_data) ((fsai_data) -> zero_guess) #define hypre_ParFSAIDataEigMaxIters(fsai_data) ((fsai_data) -> eig_max_iters) #define hypre_ParFSAIDataMaxIterations(fsai_data) ((fsai_data) -> max_iterations) #define hypre_ParFSAIDataNumIterations(fsai_data) ((fsai_data) -> num_iterations) #define hypre_ParFSAIDataOmega(fsai_data) ((fsai_data) -> omega) #define hypre_ParFSAIDataRelResNorm(fsai_data) ((fsai_data) -> rel_resnorm) #define hypre_ParFSAIDataTolerance(fsai_data) ((fsai_data) -> tolerance) /* Work data */ #define hypre_ParFSAIDataRWork(fsai_data) ((fsai_data) -> r_work) #define hypre_ParFSAIDataZWork(fsai_data) ((fsai_data) -> z_work) /* Log info data */ #define hypre_ParFSAIDataLogging(fsai_data) ((fsai_data) -> logging) #define hypre_ParFSAIDataPrintLevel(fsai_data) ((fsai_data) -> print_level) #endif /****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #ifndef hypre_AMS_DATA_HEADER #define hypre_AMS_DATA_HEADER /*-------------------------------------------------------------------------- * Auxiliary space Maxwell Solver data *--------------------------------------------------------------------------*/ typedef struct { /* Space dimension (2 or 3) */ HYPRE_Int dim; /* Edge element (ND1) stiffness matrix */ hypre_ParCSRMatrix *A; /* Discrete gradient matrix (vertex-to-edge) */ hypre_ParCSRMatrix *G; /* Coarse grid matrix on the range of G^T */ hypre_ParCSRMatrix *A_G; /* AMG solver for A_G */ HYPRE_Solver B_G; /* Is the mass term coefficient zero? */ HYPRE_Int beta_is_zero; /* Nedelec nodal interpolation matrix (vertex^dim-to-edge) */ hypre_ParCSRMatrix *Pi; /* Coarse grid matrix on the range of Pi^T */ hypre_ParCSRMatrix *A_Pi; /* AMG solver for A_Pi */ HYPRE_Solver B_Pi; /* Components of the Nedelec interpolation matrix (vertex-to-edge each) */ hypre_ParCSRMatrix *Pix, *Piy, *Piz; /* Coarse grid matrices on the ranges of Pi{x,y,z}^T */ hypre_ParCSRMatrix *A_Pix, *A_Piy, *A_Piz; /* AMG solvers for A_Pi{x,y,z} */ HYPRE_Solver B_Pix, B_Piy, B_Piz; /* Does the solver own the Nedelec interpolations? */ HYPRE_Int owns_Pi; /* Does the solver own the coarse grid matrices? */ HYPRE_Int owns_A_G, owns_A_Pi; /* Coordinates of the vertices (z = 0 if dim == 2) */ hypre_ParVector *x, *y, *z; /* Representations of the constant vectors in the Nedelec basis */ hypre_ParVector *Gx, *Gy, *Gz; /* Nodes in the interior of the zero-conductivity region */ hypre_ParVector *interior_nodes; /* Discrete gradient matrix for the interior nodes only */ hypre_ParCSRMatrix *G0; /* Coarse grid matrix on the interior nodes */ hypre_ParCSRMatrix *A_G0; /* AMG solver for A_G0 */ HYPRE_Solver B_G0; /* How frequently to project the r.h.s. onto Ker(G0^T)? */ HYPRE_Int projection_frequency; /* Internal counter to use with projection_frequency in PCG */ HYPRE_Int solve_counter; /* Solver options */ HYPRE_Int maxit; HYPRE_Real tol; HYPRE_Int cycle_type; HYPRE_Int print_level; /* Smoothing options for A */ HYPRE_Int A_relax_type; HYPRE_Int A_relax_times; hypre_Vector *A_l1_norms; HYPRE_Real A_relax_weight; HYPRE_Real A_omega; HYPRE_Real A_max_eig_est; HYPRE_Real A_min_eig_est; HYPRE_Int A_cheby_order; HYPRE_Real A_cheby_fraction; /* AMG options for B_G */ HYPRE_Int B_G_coarsen_type; HYPRE_Int B_G_agg_levels; HYPRE_Int B_G_relax_type; HYPRE_Int B_G_coarse_relax_type; HYPRE_Real B_G_theta; HYPRE_Int B_G_interp_type; HYPRE_Int B_G_Pmax; /* AMG options for B_Pi */ HYPRE_Int B_Pi_coarsen_type; HYPRE_Int B_Pi_agg_levels; HYPRE_Int B_Pi_relax_type; HYPRE_Int B_Pi_coarse_relax_type; HYPRE_Real B_Pi_theta; HYPRE_Int B_Pi_interp_type; HYPRE_Int B_Pi_Pmax; /* Temporary vectors */ hypre_ParVector *r0, *g0, *r1, *g1, *r2, *g2, *zz; /* Output log info */ HYPRE_Int num_iterations; HYPRE_Real rel_resid_norm; } hypre_AMSData; /* Space dimension */ #define hypre_AMSDataDimension(ams_data) ((ams_data)->dim) /* Edge stiffness matrix */ #define hypre_AMSDataA(ams_data) ((ams_data)->A) /* Vertex space data */ #define hypre_AMSDataDiscreteGradient(ams_data) ((ams_data)->G) #define hypre_AMSDataPoissonBeta(ams_data) ((ams_data)->A_G) #define hypre_AMSDataPoissonBetaAMG(ams_data) ((ams_data)->B_G) #define hypre_AMSDataOwnsPoissonBeta(ams_data) ((ams_data)->owns_A_G) #define hypre_AMSDataBetaIsZero(ams_data) ((ams_data)->beta_is_zero) /* Vector vertex space data */ #define hypre_AMSDataPiInterpolation(ams_data) ((ams_data)->Pi) #define hypre_AMSDataOwnsPiInterpolation(ams_data) ((ams_data)->owns_Pi) #define hypre_AMSDataPoissonAlpha(ams_data) ((ams_data)->A_Pi) #define hypre_AMSDataPoissonAlphaAMG(ams_data) ((ams_data)->B_Pi) #define hypre_AMSDataOwnsPoissonAlpha(ams_data) ((ams_data)->owns_A_Pi) /* Vector vertex components data */ #define hypre_AMSDataPiXInterpolation(ams_data) ((ams_data)->Pix) #define hypre_AMSDataPiYInterpolation(ams_data) ((ams_data)->Piy) #define hypre_AMSDataPiZInterpolation(ams_data) ((ams_data)->Piz) #define hypre_AMSDataPoissonAlphaX(ams_data) ((ams_data)->A_Pix) #define hypre_AMSDataPoissonAlphaY(ams_data) ((ams_data)->A_Piy) #define hypre_AMSDataPoissonAlphaZ(ams_data) ((ams_data)->A_Piz) #define hypre_AMSDataPoissonAlphaXAMG(ams_data) ((ams_data)->B_Pix) #define hypre_AMSDataPoissonAlphaYAMG(ams_data) ((ams_data)->B_Piy) #define hypre_AMSDataPoissonAlphaZAMG(ams_data) ((ams_data)->B_Piz) /* Coordinates of the vertices */ #define hypre_AMSDataVertexCoordinateX(ams_data) ((ams_data)->x) #define hypre_AMSDataVertexCoordinateY(ams_data) ((ams_data)->y) #define hypre_AMSDataVertexCoordinateZ(ams_data) ((ams_data)->z) /* Representations of the constant vectors in the Nedelec basis */ #define hypre_AMSDataEdgeConstantX(ams_data) ((ams_data)->Gx) #define hypre_AMSDataEdgeConstantY(ams_data) ((ams_data)->Gy) #define hypre_AMSDataEdgeConstantZ(ams_data) ((ams_data)->Gz) /* Interior zero conductivity region */ #define hypre_AMSDataInteriorNodes(ams_data) ((ams_data)->interior_nodes) #define hypre_AMSDataInteriorDiscreteGradient(ams_data) ((ams_data)->G0) #define hypre_AMSDataInteriorPoissonBeta(ams_data) ((ams_data)->A_G0) #define hypre_AMSDataInteriorPoissonBetaAMG(ams_data) ((ams_data)->B_G0) #define hypre_AMSDataInteriorProjectionFrequency(ams_data) ((ams_data)->projection_frequency) #define hypre_AMSDataInteriorSolveCounter(ams_data) ((ams_data)->solve_counter) /* Solver options */ #define hypre_AMSDataMaxIter(ams_data) ((ams_data)->maxit) #define hypre_AMSDataTol(ams_data) ((ams_data)->tol) #define hypre_AMSDataCycleType(ams_data) ((ams_data)->cycle_type) #define hypre_AMSDataPrintLevel(ams_data) ((ams_data)->print_level) /* Smoothing and AMG options */ #define hypre_AMSDataARelaxType(ams_data) ((ams_data)->A_relax_type) #define hypre_AMSDataARelaxTimes(ams_data) ((ams_data)->A_relax_times) #define hypre_AMSDataAL1Norms(ams_data) ((ams_data)->A_l1_norms) #define hypre_AMSDataARelaxWeight(ams_data) ((ams_data)->A_relax_weight) #define hypre_AMSDataAOmega(ams_data) ((ams_data)->A_omega) #define hypre_AMSDataAMaxEigEst(ams_data) ((ams_data)->A_max_eig_est) #define hypre_AMSDataAMinEigEst(ams_data) ((ams_data)->A_min_eig_est) #define hypre_AMSDataAChebyOrder(ams_data) ((ams_data)->A_cheby_order) #define hypre_AMSDataAChebyFraction(ams_data) ((ams_data)->A_cheby_fraction) #define hypre_AMSDataPoissonBetaAMGCoarsenType(ams_data) ((ams_data)->B_G_coarsen_type) #define hypre_AMSDataPoissonBetaAMGAggLevels(ams_data) ((ams_data)->B_G_agg_levels) #define hypre_AMSDataPoissonBetaAMGRelaxType(ams_data) ((ams_data)->B_G_relax_type) #define hypre_AMSDataPoissonBetaAMGCoarseRelaxType(ams_data) ((ams_data)->B_G_coarse_relax_type) #define hypre_AMSDataPoissonBetaAMGStrengthThreshold(ams_data) ((ams_data)->B_G_theta) #define hypre_AMSDataPoissonBetaAMGInterpType(ams_data) ((ams_data)->B_G_interp_type) #define hypre_AMSDataPoissonBetaAMGPMax(ams_data) ((ams_data)->B_G_Pmax) #define hypre_AMSDataPoissonAlphaAMGCoarsenType(ams_data) ((ams_data)->B_Pi_coarsen_type) #define hypre_AMSDataPoissonAlphaAMGAggLevels(ams_data) ((ams_data)->B_Pi_agg_levels) #define hypre_AMSDataPoissonAlphaAMGRelaxType(ams_data) ((ams_data)->B_Pi_relax_type) #define hypre_AMSDataPoissonAlphaAMGCoarseRelaxType(ams_data) ((ams_data)->B_Pi_coarse_relax_type) #define hypre_AMSDataPoissonAlphaAMGStrengthThreshold(ams_data) ((ams_data)->B_Pi_theta) #define hypre_AMSDataPoissonAlphaAMGInterpType(ams_data) ((ams_data)->B_Pi_interp_type) #define hypre_AMSDataPoissonAlphaAMGPMax(ams_data) ((ams_data)->B_Pi_Pmax) /* Temporary vectors */ #define hypre_AMSDataTempEdgeVectorR(ams_data) ((ams_data)->r0) #define hypre_AMSDataTempEdgeVectorG(ams_data) ((ams_data)->g0) #define hypre_AMSDataTempVertexVectorR(ams_data) ((ams_data)->r1) #define hypre_AMSDataTempVertexVectorG(ams_data) ((ams_data)->g1) #define hypre_AMSDataTempVecVertexVectorR(ams_data) ((ams_data)->r2) #define hypre_AMSDataTempVecVertexVectorG(ams_data) ((ams_data)->g2) #define hypre_AMSDataTempVecVertexVectorZZ(ams_data) ((ams_data)->zz) /* Output log info */ #define hypre_AMSDataNumIterations(ams_data) ((ams_data)->num_iterations) #define hypre_AMSDataResidualNorm(ams_data) ((ams_data)->rel_resid_norm) #endif /****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #ifndef hypre_ParILU_DATA_HEADER #define hypre_ParILU_DATA_HEADER /*-------------------------------------------------------------------------- * hypre_ParILUData *--------------------------------------------------------------------------*/ typedef struct hypre_ParILUData_struct { /* Base solver data structure */ hypre_Solver base; /* General data */ HYPRE_Int global_solver; hypre_ParCSRMatrix *matA; hypre_ParCSRMatrix *matL; HYPRE_Real *matD; hypre_ParCSRMatrix *matU; hypre_ParCSRMatrix *matmL; HYPRE_Real *matmD; hypre_ParCSRMatrix *matmU; hypre_ParCSRMatrix *matS; HYPRE_Real *droptol; /* Array of 3 elements, for B, (E and F), S respectively */ HYPRE_Int lfil; HYPRE_Int maxRowNnz; HYPRE_Int *CF_marker_array; HYPRE_Int *perm; HYPRE_Int *qperm; HYPRE_Real tol_ddPQ; hypre_ParVector *F; hypre_ParVector *U; hypre_ParVector *residual; HYPRE_Real *rel_res_norms; HYPRE_Int num_iterations; HYPRE_Real *l1_norms; HYPRE_Real final_rel_residual_norm; HYPRE_Real tol; HYPRE_Real operator_complexity; HYPRE_Int logging; HYPRE_Int print_level; HYPRE_Int max_iter; HYPRE_Int tri_solve; HYPRE_Int lower_jacobi_iters; HYPRE_Int upper_jacobi_iters; HYPRE_Int ilu_type; HYPRE_Int nLU; HYPRE_Int nI; HYPRE_Int *u_end; /* used when schur block is formed */ /* Iterative ILU parameters */ HYPRE_Int iter_setup_type; HYPRE_Int iter_setup_option; HYPRE_Int setup_max_iter; HYPRE_Int setup_num_iter; HYPRE_Real setup_tolerance; HYPRE_Complex *setup_history; /* temp vectors for solve phase */ hypre_ParVector *Utemp; hypre_ParVector *Ftemp; hypre_ParVector *Xtemp; hypre_ParVector *Ytemp; hypre_ParVector *Ztemp; HYPRE_Real *uext; HYPRE_Real *fext; /* On GPU, we have to form E and F explicitly, since we don't have much control to it */ #if defined(HYPRE_USING_GPU) hypre_CSRMatrix *matALU_d; /* Matrix holding ILU of A (for A-smoothing) */ hypre_CSRMatrix *matBLU_d; /* Matrix holding ILU of B */ hypre_CSRMatrix *matSLU_d; /* Matrix holding ILU of S */ hypre_CSRMatrix *matE_d; hypre_CSRMatrix *matF_d; hypre_ParCSRMatrix *Aperm; hypre_ParCSRMatrix *R; hypre_ParCSRMatrix *P; hypre_Vector *Ftemp_upper; hypre_Vector *Utemp_lower; hypre_Vector *Adiag_diag; hypre_Vector *Sdiag_diag; #endif /* data structure sor solving Schur System */ HYPRE_Solver schur_solver; HYPRE_Solver schur_precond; hypre_ParVector *rhs; hypre_ParVector *x; /* Schur solver data */ HYPRE_Int ss_logging; HYPRE_Int ss_print_level; /* Schur-GMRES */ HYPRE_Int ss_kDim; /* max number of iterations for GMRES */ HYPRE_Int ss_max_iter; /* max number of iterations for GMRES solve */ HYPRE_Real ss_tol; /* stop iteration tol for GMRES */ HYPRE_Real ss_absolute_tol; /* absolute tol for GMRES or tol for NSH solve */ HYPRE_Int ss_rel_change; /* Schur-NSH */ HYPRE_Int ss_nsh_setup_max_iter; /* number of iterations for NSH inverse */ HYPRE_Int ss_nsh_solve_max_iter; /* max number of iterations for NSH solve */ HYPRE_Real ss_nsh_setup_tol; /* stop iteration tol for NSH inverse */ HYPRE_Real ss_nsh_solve_tol; /* absolute tol for NSH solve */ HYPRE_Int ss_nsh_max_row_nnz; /* max rows of nonzeros for NSH */ HYPRE_Int ss_nsh_mr_col_version; /* MR column version setting in NSH */ HYPRE_Int ss_nsh_mr_max_row_nnz; /* max rows for MR */ HYPRE_Real *ss_nsh_droptol; /* droptol array for NSH */ HYPRE_Int ss_nsh_mr_max_iter; /* max MR iteration */ HYPRE_Real ss_nsh_mr_tol; /* Schur precond data */ HYPRE_Int sp_ilu_type; /* ilu type is use ILU */ HYPRE_Int sp_ilu_lfil; /* level of fill in for ILUK */ HYPRE_Int sp_ilu_max_row_nnz; /* max rows for ILUT */ /* droptol for ILUT or MR * ILUT: [0], [1], [2] B, E&F, S respectively * NSH: [0] for MR, [1] for NSH */ HYPRE_Real *sp_ilu_droptol; /* droptol array for ILUT */ HYPRE_Int sp_print_level; HYPRE_Int sp_max_iter; /* max precond iter or max MR iteration */ HYPRE_Int sp_tri_solve; HYPRE_Int sp_lower_jacobi_iters; HYPRE_Int sp_upper_jacobi_iters; HYPRE_Real sp_tol; HYPRE_Int test_opt; /* TODO (VPM): change this to something more descriptive*/ /* local reordering */ HYPRE_Int reordering_type; } hypre_ParILUData; #define hypre_ParILUDataTestOption(ilu_data) ((ilu_data) -> test_opt) #if defined(HYPRE_USING_GPU) #define hypre_ParILUDataMatAILUDevice(ilu_data) ((ilu_data) -> matALU_d) #define hypre_ParILUDataMatBILUDevice(ilu_data) ((ilu_data) -> matBLU_d) #define hypre_ParILUDataMatSILUDevice(ilu_data) ((ilu_data) -> matSLU_d) #define hypre_ParILUDataMatEDevice(ilu_data) ((ilu_data) -> matE_d) #define hypre_ParILUDataMatFDevice(ilu_data) ((ilu_data) -> matF_d) #define hypre_ParILUDataAperm(ilu_data) ((ilu_data) -> Aperm) #define hypre_ParILUDataR(ilu_data) ((ilu_data) -> R) #define hypre_ParILUDataP(ilu_data) ((ilu_data) -> P) #define hypre_ParILUDataFTempUpper(ilu_data) ((ilu_data) -> Ftemp_upper) #define hypre_ParILUDataUTempLower(ilu_data) ((ilu_data) -> Utemp_lower) #define hypre_ParILUDataADiagDiag(ilu_data) ((ilu_data) -> Adiag_diag) #define hypre_ParILUDataSDiagDiag(ilu_data) ((ilu_data) -> Sdiag_diag) #endif #define hypre_ParILUDataGlobalSolver(ilu_data) ((ilu_data) -> global_solver) #define hypre_ParILUDataMatA(ilu_data) ((ilu_data) -> matA) #define hypre_ParILUDataMatL(ilu_data) ((ilu_data) -> matL) #define hypre_ParILUDataMatD(ilu_data) ((ilu_data) -> matD) #define hypre_ParILUDataMatU(ilu_data) ((ilu_data) -> matU) #define hypre_ParILUDataMatLModified(ilu_data) ((ilu_data) -> matmL) #define hypre_ParILUDataMatDModified(ilu_data) ((ilu_data) -> matmD) #define hypre_ParILUDataMatUModified(ilu_data) ((ilu_data) -> matmU) #define hypre_ParILUDataMatS(ilu_data) ((ilu_data) -> matS) #define hypre_ParILUDataDroptol(ilu_data) ((ilu_data) -> droptol) #define hypre_ParILUDataLfil(ilu_data) ((ilu_data) -> lfil) #define hypre_ParILUDataMaxRowNnz(ilu_data) ((ilu_data) -> maxRowNnz) #define hypre_ParILUDataCFMarkerArray(ilu_data) ((ilu_data) -> CF_marker_array) #define hypre_ParILUDataPerm(ilu_data) ((ilu_data) -> perm) #define hypre_ParILUDataPPerm(ilu_data) ((ilu_data) -> perm) #define hypre_ParILUDataQPerm(ilu_data) ((ilu_data) -> qperm) #define hypre_ParILUDataTolDDPQ(ilu_data) ((ilu_data) -> tol_ddPQ) #define hypre_ParILUDataF(ilu_data) ((ilu_data) -> F) #define hypre_ParILUDataU(ilu_data) ((ilu_data) -> U) #define hypre_ParILUDataResidual(ilu_data) ((ilu_data) -> residual) #define hypre_ParILUDataRelResNorms(ilu_data) ((ilu_data) -> rel_res_norms) #define hypre_ParILUDataNumIterations(ilu_data) ((ilu_data) -> num_iterations) #define hypre_ParILUDataL1Norms(ilu_data) ((ilu_data) -> l1_norms) #define hypre_ParILUDataFinalRelResidualNorm(ilu_data) ((ilu_data) -> final_rel_residual_norm) #define hypre_ParILUDataTol(ilu_data) ((ilu_data) -> tol) #define hypre_ParILUDataOperatorComplexity(ilu_data) ((ilu_data) -> operator_complexity) #define hypre_ParILUDataLogging(ilu_data) ((ilu_data) -> logging) #define hypre_ParILUDataPrintLevel(ilu_data) ((ilu_data) -> print_level) #define hypre_ParILUDataMaxIter(ilu_data) ((ilu_data) -> max_iter) #define hypre_ParILUDataTriSolve(ilu_data) ((ilu_data) -> tri_solve) #define hypre_ParILUDataLowerJacobiIters(ilu_data) ((ilu_data) -> lower_jacobi_iters) #define hypre_ParILUDataUpperJacobiIters(ilu_data) ((ilu_data) -> upper_jacobi_iters) #define hypre_ParILUDataIluType(ilu_data) ((ilu_data) -> ilu_type) #define hypre_ParILUDataNLU(ilu_data) ((ilu_data) -> nLU) #define hypre_ParILUDataNI(ilu_data) ((ilu_data) -> nI) #define hypre_ParILUDataUEnd(ilu_data) ((ilu_data) -> u_end) #define hypre_ParILUDataUTemp(ilu_data) ((ilu_data) -> Utemp) #define hypre_ParILUDataFTemp(ilu_data) ((ilu_data) -> Ftemp) #define hypre_ParILUDataXTemp(ilu_data) ((ilu_data) -> Xtemp) #define hypre_ParILUDataYTemp(ilu_data) ((ilu_data) -> Ytemp) #define hypre_ParILUDataZTemp(ilu_data) ((ilu_data) -> Ztemp) #define hypre_ParILUDataUExt(ilu_data) ((ilu_data) -> uext) #define hypre_ParILUDataFExt(ilu_data) ((ilu_data) -> fext) #define hypre_ParILUDataSchurSolver(ilu_data) ((ilu_data) -> schur_solver) #define hypre_ParILUDataSchurPrecond(ilu_data) ((ilu_data) -> schur_precond) #define hypre_ParILUDataRhs(ilu_data) ((ilu_data) -> rhs) #define hypre_ParILUDataX(ilu_data) ((ilu_data) -> x) #define hypre_ParILUDataReorderingType(ilu_data) ((ilu_data) -> reordering_type) /* Iterative ILU setup */ #define hypre_ParILUDataIterativeSetupType(ilu_data) ((ilu_data) -> iter_setup_type) #define hypre_ParILUDataIterativeSetupOption(ilu_data) ((ilu_data) -> iter_setup_option) #define hypre_ParILUDataIterativeSetupMaxIter(ilu_data) ((ilu_data) -> setup_max_iter) #define hypre_ParILUDataIterativeSetupNumIter(ilu_data) ((ilu_data) -> setup_num_iter) #define hypre_ParILUDataIterativeSetupTolerance(ilu_data) ((ilu_data) -> setup_tolerance) #define hypre_ParILUDataIterativeSetupHistory(ilu_data) ((ilu_data) -> setup_history) #define hypre_ParILUDataIterSetupCorrectionNorm(ilu_data,i) ((ilu_data) -> setup_history[i]) #define hypre_ParILUDataIterSetupResidualNorm(ilu_data,i) (((ilu_data) -> setup_history + \ (ilu_data) -> setup_num_iter)[i]) /* Schur System */ #define hypre_ParILUDataSchurGMRESKDim(ilu_data) ((ilu_data) -> ss_kDim) #define hypre_ParILUDataSchurGMRESMaxIter(ilu_data) ((ilu_data) -> ss_max_iter) #define hypre_ParILUDataSchurGMRESTol(ilu_data) ((ilu_data) -> ss_tol) #define hypre_ParILUDataSchurGMRESAbsoluteTol(ilu_data) ((ilu_data) -> ss_absolute_tol) #define hypre_ParILUDataSchurGMRESRelChange(ilu_data) ((ilu_data) -> ss_rel_change) #define hypre_ParILUDataSchurPrecondIluType(ilu_data) ((ilu_data) -> sp_ilu_type) #define hypre_ParILUDataSchurPrecondIluLfil(ilu_data) ((ilu_data) -> sp_ilu_lfil) #define hypre_ParILUDataSchurPrecondIluMaxRowNnz(ilu_data) ((ilu_data) -> sp_ilu_max_row_nnz) #define hypre_ParILUDataSchurPrecondIluDroptol(ilu_data) ((ilu_data) -> sp_ilu_droptol) #define hypre_ParILUDataSchurPrecondPrintLevel(ilu_data) ((ilu_data) -> sp_print_level) #define hypre_ParILUDataSchurPrecondMaxIter(ilu_data) ((ilu_data) -> sp_max_iter) #define hypre_ParILUDataSchurPrecondTriSolve(ilu_data) ((ilu_data) -> sp_tri_solve) #define hypre_ParILUDataSchurPrecondLowerJacobiIters(ilu_data) ((ilu_data) -> sp_lower_jacobi_iters) #define hypre_ParILUDataSchurPrecondUpperJacobiIters(ilu_data) ((ilu_data) -> sp_upper_jacobi_iters) #define hypre_ParILUDataSchurPrecondTol(ilu_data) ((ilu_data) -> sp_tol) #define hypre_ParILUDataSchurNSHMaxNumIter(ilu_data) ((ilu_data) -> ss_nsh_setup_max_iter) #define hypre_ParILUDataSchurNSHSolveMaxIter(ilu_data) ((ilu_data) -> ss_nsh_solve_max_iter) #define hypre_ParILUDataSchurNSHTol(ilu_data) ((ilu_data) -> ss_nsh_setup_tol) #define hypre_ParILUDataSchurNSHSolveTol(ilu_data) ((ilu_data) -> ss_nsh_solve_tol) #define hypre_ParILUDataSchurNSHMaxRowNnz(ilu_data) ((ilu_data) -> ss_nsh_max_row_nnz) #define hypre_ParILUDataSchurMRColVersion(ilu_data) ((ilu_data) -> ss_nsh_mr_col_version) #define hypre_ParILUDataSchurMRMaxRowNnz(ilu_data) ((ilu_data) -> ss_nsh_mr_max_row_nnz) #define hypre_ParILUDataSchurNSHDroptol(ilu_data) ((ilu_data) -> ss_nsh_droptol) #define hypre_ParILUDataSchurMRMaxIter(ilu_data) ((ilu_data) -> ss_nsh_mr_max_iter) #define hypre_ParILUDataSchurMRTol(ilu_data) ((ilu_data) -> ss_nsh_mr_tol) #define hypre_ParILUDataSchurSolverLogging(ilu_data) ((ilu_data) -> ss_logging) #define hypre_ParILUDataSchurSolverPrintLevel(ilu_data) ((ilu_data) -> ss_print_level) #define FMRK -1 #define CMRK 1 #define UMRK 0 #define S_CMRK 2 #define FPT(i, bsize) (((i) % (bsize)) == FMRK) #define CPT(i, bsize) (((i) % (bsize)) == CMRK) #define MAT_TOL 1e-14 #define EXPAND_FACT 1.3 /* NSH data structure */ typedef struct hypre_ParNSHData_struct { /* solver information */ HYPRE_Int global_solver; hypre_ParCSRMatrix *matA; hypre_ParCSRMatrix *matM; hypre_ParVector *F; hypre_ParVector *U; hypre_ParVector *residual; HYPRE_Real *rel_res_norms; HYPRE_Int num_iterations; HYPRE_Real *l1_norms; HYPRE_Real final_rel_residual_norm; HYPRE_Real tol; HYPRE_Real operator_complexity; HYPRE_Int logging; HYPRE_Int print_level; HYPRE_Int max_iter; /* common data slots */ HYPRE_Real *droptol; /* 2 drop torelances for {MR, NSH}*/ HYPRE_Int own_droptol_data; /* temp vectors for solve phase */ hypre_ParVector *Utemp; hypre_ParVector *Ftemp; /* data slots for local MR */ HYPRE_Int mr_max_iter; HYPRE_Real mr_tol; HYPRE_Int mr_max_row_nnz; HYPRE_Int mr_col_version; /* global version or column version MR */ /* data slots for global NSH */ HYPRE_Int nsh_max_iter; HYPRE_Real nsh_tol; HYPRE_Int nsh_max_row_nnz; } hypre_ParNSHData; #define hypre_ParNSHDataGlobalSolver(nsh_data) ((nsh_data) -> global_solver) #define hypre_ParNSHDataMatA(nsh_data) ((nsh_data) -> matA) #define hypre_ParNSHDataMatM(nsh_data) ((nsh_data) -> matM) #define hypre_ParNSHDataF(nsh_data) ((nsh_data) -> F) #define hypre_ParNSHDataU(nsh_data) ((nsh_data) -> U) #define hypre_ParNSHDataResidual(nsh_data) ((nsh_data) -> residual) #define hypre_ParNSHDataRelResNorms(nsh_data) ((nsh_data) -> rel_res_norms) #define hypre_ParNSHDataNumIterations(nsh_data) ((nsh_data) -> num_iterations) #define hypre_ParNSHDataL1Norms(nsh_data) ((nsh_data) -> l1_norms) #define hypre_ParNSHDataFinalRelResidualNorm(nsh_data) ((nsh_data) -> final_rel_residual_norm) #define hypre_ParNSHDataTol(nsh_data) ((nsh_data) -> tol) #define hypre_ParNSHDataOperatorComplexity(nsh_data) ((nsh_data) -> operator_complexity) #define hypre_ParNSHDataLogging(nsh_data) ((nsh_data) -> logging) #define hypre_ParNSHDataPrintLevel(nsh_data) ((nsh_data) -> print_level) #define hypre_ParNSHDataMaxIter(nsh_data) ((nsh_data) -> max_iter) #define hypre_ParNSHDataDroptol(nsh_data) ((nsh_data) -> droptol) #define hypre_ParNSHDataOwnDroptolData(nsh_data) ((nsh_data) -> own_droptol_data) #define hypre_ParNSHDataUTemp(nsh_data) ((nsh_data) -> Utemp) #define hypre_ParNSHDataFTemp(nsh_data) ((nsh_data) -> Ftemp) #define hypre_ParNSHDataMRMaxIter(nsh_data) ((nsh_data) -> mr_max_iter) #define hypre_ParNSHDataMRTol(nsh_data) ((nsh_data) -> mr_tol) #define hypre_ParNSHDataMRMaxRowNnz(nsh_data) ((nsh_data) -> mr_max_row_nnz) #define hypre_ParNSHDataMRColVersion(nsh_data) ((nsh_data) -> mr_col_version) #define hypre_ParNSHDataNSHMaxIter(nsh_data) ((nsh_data) -> nsh_max_iter) #define hypre_ParNSHDataNSHTol(nsh_data) ((nsh_data) -> nsh_tol) #define hypre_ParNSHDataNSHMaxRowNnz(nsh_data) ((nsh_data) -> nsh_max_row_nnz) #endif /* #ifndef hypre_ParILU_DATA_HEADER */ /****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /* ads.c */ void *hypre_ADSCreate ( void ); HYPRE_Int hypre_ADSDestroy ( void *solver ); HYPRE_Int hypre_ADSSetDiscreteCurl ( void *solver, hypre_ParCSRMatrix *C ); HYPRE_Int hypre_ADSSetDiscreteGradient ( void *solver, hypre_ParCSRMatrix *G ); HYPRE_Int hypre_ADSSetCoordinateVectors ( void *solver, hypre_ParVector *x, hypre_ParVector *y, hypre_ParVector *z ); HYPRE_Int hypre_ADSSetInterpolations ( void *solver, hypre_ParCSRMatrix *RT_Pi, hypre_ParCSRMatrix *RT_Pix, hypre_ParCSRMatrix *RT_Piy, hypre_ParCSRMatrix *RT_Piz, hypre_ParCSRMatrix *ND_Pi, hypre_ParCSRMatrix *ND_Pix, hypre_ParCSRMatrix *ND_Piy, hypre_ParCSRMatrix *ND_Piz ); HYPRE_Int hypre_ADSSetMaxIter ( void *solver, HYPRE_Int maxit ); HYPRE_Int hypre_ADSSetTol ( void *solver, HYPRE_Real tol ); HYPRE_Int hypre_ADSSetCycleType ( void *solver, HYPRE_Int cycle_type ); HYPRE_Int hypre_ADSSetPrintLevel ( void *solver, HYPRE_Int print_level ); HYPRE_Int hypre_ADSSetSmoothingOptions ( void *solver, HYPRE_Int A_relax_type, HYPRE_Int A_relax_times, HYPRE_Real A_relax_weight, HYPRE_Real A_omega ); HYPRE_Int hypre_ADSSetChebySmoothingOptions ( void *solver, HYPRE_Int A_cheby_order, HYPRE_Real A_cheby_fraction ); HYPRE_Int hypre_ADSSetAMSOptions ( void *solver, HYPRE_Int B_C_cycle_type, HYPRE_Int B_C_coarsen_type, HYPRE_Int B_C_agg_levels, HYPRE_Int B_C_relax_type, HYPRE_Real B_C_theta, HYPRE_Int B_C_interp_type, HYPRE_Int B_C_Pmax ); HYPRE_Int hypre_ADSSetAMGOptions ( void *solver, HYPRE_Int B_Pi_coarsen_type, HYPRE_Int B_Pi_agg_levels, HYPRE_Int B_Pi_relax_type, HYPRE_Real B_Pi_theta, HYPRE_Int B_Pi_interp_type, HYPRE_Int B_Pi_Pmax ); HYPRE_Int hypre_ADSComputePi ( hypre_ParCSRMatrix *A, hypre_ParCSRMatrix *C, hypre_ParCSRMatrix *G, hypre_ParVector *x, hypre_ParVector *y, hypre_ParVector *z, hypre_ParCSRMatrix *PiNDx, hypre_ParCSRMatrix *PiNDy, hypre_ParCSRMatrix *PiNDz, hypre_ParCSRMatrix **Pi_ptr ); HYPRE_Int hypre_ADSComputePixyz ( hypre_ParCSRMatrix *A, hypre_ParCSRMatrix *C, hypre_ParCSRMatrix *G, hypre_ParVector *x, hypre_ParVector *y, hypre_ParVector *z, hypre_ParCSRMatrix *PiNDx, hypre_ParCSRMatrix *PiNDy, hypre_ParCSRMatrix *PiNDz, hypre_ParCSRMatrix **Pix_ptr, hypre_ParCSRMatrix **Piy_ptr, hypre_ParCSRMatrix **Piz_ptr ); HYPRE_Int hypre_ADSSetup ( void *solver, hypre_ParCSRMatrix *A, hypre_ParVector *b, hypre_ParVector *x ); HYPRE_Int hypre_ADSSolve ( void *solver, hypre_ParCSRMatrix *A, hypre_ParVector *b, hypre_ParVector *x ); HYPRE_Int hypre_ADSGetNumIterations ( void *solver, HYPRE_Int *num_iterations ); HYPRE_Int hypre_ADSGetFinalRelativeResidualNorm ( void *solver, HYPRE_Real *rel_resid_norm ); /* ame.c */ void *hypre_AMECreate ( void ); HYPRE_Int hypre_AMEDestroy ( void *esolver ); HYPRE_Int hypre_AMESetAMSSolver ( void *esolver, void *ams_solver ); HYPRE_Int hypre_AMESetMassMatrix ( void *esolver, hypre_ParCSRMatrix *M ); HYPRE_Int hypre_AMESetBlockSize ( void *esolver, HYPRE_Int block_size ); HYPRE_Int hypre_AMESetMaxIter ( void *esolver, HYPRE_Int maxit ); HYPRE_Int hypre_AMESetMaxPCGIter ( void *esolver, HYPRE_Int maxit ); HYPRE_Int hypre_AMESetTol ( void *esolver, HYPRE_Real tol ); HYPRE_Int hypre_AMESetRTol ( void *esolver, HYPRE_Real tol ); HYPRE_Int hypre_AMESetPrintLevel ( void *esolver, HYPRE_Int print_level ); HYPRE_Int hypre_AMESetup ( void *esolver ); HYPRE_Int hypre_AMEDiscrDivFreeComponent ( void *esolver, hypre_ParVector *b ); void hypre_AMEOperatorA ( void *data, void *x, void *y ); void hypre_AMEMultiOperatorA ( void *data, void *x, void *y ); void hypre_AMEOperatorM ( void *data, void *x, void *y ); void hypre_AMEMultiOperatorM ( void *data, void *x, void *y ); void hypre_AMEOperatorB ( void *data, void *x, void *y ); void hypre_AMEMultiOperatorB ( void *data, void *x, void *y ); HYPRE_Int hypre_AMESolve ( void *esolver ); HYPRE_Int hypre_AMEGetEigenvectors ( void *esolver, HYPRE_ParVector **eigenvectors_ptr ); HYPRE_Int hypre_AMEGetEigenvalues ( void *esolver, HYPRE_Real **eigenvalues_ptr ); /* amg_hybrid.c */ void *hypre_AMGHybridCreate ( void ); HYPRE_Int hypre_AMGHybridDestroy ( void *AMGhybrid_vdata ); HYPRE_Int hypre_AMGHybridSetTol ( void *AMGhybrid_vdata, HYPRE_Real tol ); HYPRE_Int hypre_AMGHybridSetAbsoluteTol ( void *AMGhybrid_vdata, HYPRE_Real a_tol ); HYPRE_Int hypre_AMGHybridSetConvergenceTol ( void *AMGhybrid_vdata, HYPRE_Real cf_tol ); HYPRE_Int hypre_AMGHybridSetNonGalerkinTol ( void *AMGhybrid_vdata, HYPRE_Int nongalerk_num_tol, HYPRE_Real *nongalerkin_tol ); HYPRE_Int hypre_AMGHybridSetDSCGMaxIter ( void *AMGhybrid_vdata, HYPRE_Int dscg_max_its ); HYPRE_Int hypre_AMGHybridSetPCGMaxIter ( void *AMGhybrid_vdata, HYPRE_Int pcg_max_its ); HYPRE_Int hypre_AMGHybridSetSetupType ( void *AMGhybrid_vdata, HYPRE_Int setup_type ); HYPRE_Int hypre_AMGHybridSetSolverType ( void *AMGhybrid_vdata, HYPRE_Int solver_type ); HYPRE_Int hypre_AMGHybridSetRecomputeResidual ( void *AMGhybrid_vdata, HYPRE_Int recompute_residual ); HYPRE_Int hypre_AMGHybridGetRecomputeResidual ( void *AMGhybrid_vdata, HYPRE_Int *recompute_residual ); HYPRE_Int hypre_AMGHybridSetRecomputeResidualP ( void *AMGhybrid_vdata, HYPRE_Int recompute_residual_p ); HYPRE_Int hypre_AMGHybridGetRecomputeResidualP ( void *AMGhybrid_vdata, HYPRE_Int *recompute_residual_p ); HYPRE_Int hypre_AMGHybridSetKDim ( void *AMGhybrid_vdata, HYPRE_Int k_dim ); HYPRE_Int hypre_AMGHybridSetStopCrit ( void *AMGhybrid_vdata, HYPRE_Int stop_crit ); HYPRE_Int hypre_AMGHybridSetTwoNorm ( void *AMGhybrid_vdata, HYPRE_Int two_norm ); HYPRE_Int hypre_AMGHybridSetRelChange ( void *AMGhybrid_vdata, HYPRE_Int rel_change ); HYPRE_Int hypre_AMGHybridSetPrecond ( void *pcg_vdata, HYPRE_Int (*pcg_precond_solve )(void*, void*, void*, void*), HYPRE_Int (*pcg_precond_setup )(void*, void*, void*, void*), void *pcg_precond ); HYPRE_Int hypre_AMGHybridSetLogging ( void *AMGhybrid_vdata, HYPRE_Int logging ); HYPRE_Int hypre_AMGHybridSetPrintLevel ( void *AMGhybrid_vdata, HYPRE_Int print_level ); HYPRE_Int hypre_AMGHybridSetStrongThreshold ( void *AMGhybrid_vdata, HYPRE_Real strong_threshold ); HYPRE_Int hypre_AMGHybridSetMaxRowSum ( void *AMGhybrid_vdata, HYPRE_Real max_row_sum ); HYPRE_Int hypre_AMGHybridSetTruncFactor ( void *AMGhybrid_vdata, HYPRE_Real trunc_factor ); HYPRE_Int hypre_AMGHybridSetPMaxElmts ( void *AMGhybrid_vdata, HYPRE_Int P_max_elmts ); HYPRE_Int hypre_AMGHybridSetMaxLevels ( void *AMGhybrid_vdata, HYPRE_Int max_levels ); HYPRE_Int hypre_AMGHybridSetMeasureType ( void *AMGhybrid_vdata, HYPRE_Int measure_type ); HYPRE_Int hypre_AMGHybridSetCoarsenType ( void *AMGhybrid_vdata, HYPRE_Int coarsen_type ); HYPRE_Int hypre_AMGHybridSetInterpType ( void *AMGhybrid_vdata, HYPRE_Int interp_type ); HYPRE_Int hypre_AMGHybridSetCycleType ( void *AMGhybrid_vdata, HYPRE_Int cycle_type ); HYPRE_Int hypre_AMGHybridSetNumSweeps ( void *AMGhybrid_vdata, HYPRE_Int num_sweeps ); HYPRE_Int hypre_AMGHybridSetCycleNumSweeps ( void *AMGhybrid_vdata, HYPRE_Int num_sweeps, HYPRE_Int k ); HYPRE_Int hypre_AMGHybridSetRelaxType ( void *AMGhybrid_vdata, HYPRE_Int relax_type ); HYPRE_Int hypre_AMGHybridSetKeepTranspose ( void *AMGhybrid_vdata, HYPRE_Int keepT ); HYPRE_Int hypre_AMGHybridSetSplittingStrategy( void *AMGhybrid_vdata, HYPRE_Int splitting_strategy ); HYPRE_Int hypre_AMGHybridSetCycleRelaxType ( void *AMGhybrid_vdata, HYPRE_Int relax_type, HYPRE_Int k ); HYPRE_Int hypre_AMGHybridSetRelaxOrder ( void *AMGhybrid_vdata, HYPRE_Int relax_order ); HYPRE_Int hypre_AMGHybridSetMaxCoarseSize ( void *AMGhybrid_vdata, HYPRE_Int max_coarse_size ); HYPRE_Int hypre_AMGHybridSetMinCoarseSize ( void *AMGhybrid_vdata, HYPRE_Int min_coarse_size ); HYPRE_Int hypre_AMGHybridSetSeqThreshold ( void *AMGhybrid_vdata, HYPRE_Int seq_threshold ); HYPRE_Int hypre_AMGHybridSetNumGridSweeps ( void *AMGhybrid_vdata, HYPRE_Int *num_grid_sweeps ); HYPRE_Int hypre_AMGHybridSetGridRelaxType ( void *AMGhybrid_vdata, HYPRE_Int *grid_relax_type ); HYPRE_Int hypre_AMGHybridSetGridRelaxPoints ( void *AMGhybrid_vdata, HYPRE_Int **grid_relax_points ); HYPRE_Int hypre_AMGHybridSetRelaxWeight ( void *AMGhybrid_vdata, HYPRE_Real *relax_weight ); HYPRE_Int hypre_AMGHybridSetOmega ( void *AMGhybrid_vdata, HYPRE_Real *omega ); HYPRE_Int hypre_AMGHybridSetRelaxWt ( void *AMGhybrid_vdata, HYPRE_Real relax_wt ); HYPRE_Int hypre_AMGHybridSetLevelRelaxWt ( void *AMGhybrid_vdata, HYPRE_Real relax_wt, HYPRE_Int level ); HYPRE_Int hypre_AMGHybridSetOuterWt ( void *AMGhybrid_vdata, HYPRE_Real outer_wt ); HYPRE_Int hypre_AMGHybridSetLevelOuterWt ( void *AMGhybrid_vdata, HYPRE_Real outer_wt, HYPRE_Int level ); HYPRE_Int hypre_AMGHybridSetNumPaths ( void *AMGhybrid_vdata, HYPRE_Int num_paths ); HYPRE_Int hypre_AMGHybridSetDofFunc ( void *AMGhybrid_vdata, HYPRE_Int *dof_func ); HYPRE_Int hypre_AMGHybridSetAggNumLevels ( void *AMGhybrid_vdata, HYPRE_Int agg_num_levels ); HYPRE_Int hypre_AMGHybridSetAggInterpType ( void *AMGhybrid_vdata, HYPRE_Int agg_interp_type ); HYPRE_Int hypre_AMGHybridSetNumFunctions ( void *AMGhybrid_vdata, HYPRE_Int num_functions ); HYPRE_Int hypre_AMGHybridSetNodal ( void *AMGhybrid_vdata, HYPRE_Int nodal ); HYPRE_Int hypre_AMGHybridGetSetupSolveTime( void *AMGhybrid_vdata, HYPRE_Real *time ); HYPRE_Int hypre_AMGHybridGetNumIterations ( void *AMGhybrid_vdata, HYPRE_Int *num_its ); HYPRE_Int hypre_AMGHybridGetDSCGNumIterations ( void *AMGhybrid_vdata, HYPRE_Int *dscg_num_its ); HYPRE_Int hypre_AMGHybridGetPCGNumIterations ( void *AMGhybrid_vdata, HYPRE_Int *pcg_num_its ); HYPRE_Int hypre_AMGHybridGetFinalRelativeResidualNorm ( void *AMGhybrid_vdata, HYPRE_Real *final_rel_res_norm ); HYPRE_Int hypre_AMGHybridSetup ( void *AMGhybrid_vdata, hypre_ParCSRMatrix *A, hypre_ParVector *b, hypre_ParVector *x ); HYPRE_Int hypre_AMGHybridSolve ( void *AMGhybrid_vdata, hypre_ParCSRMatrix *A, hypre_ParVector *b, hypre_ParVector *x ); /* ams.c */ HYPRE_Int hypre_ParCSRRelax ( hypre_ParCSRMatrix *A, hypre_ParVector *f, HYPRE_Int relax_type, HYPRE_Int relax_times, HYPRE_Real *l1_norms, HYPRE_Real relax_weight, HYPRE_Real omega, HYPRE_Real max_eig_est, HYPRE_Real min_eig_est, HYPRE_Int cheby_order, HYPRE_Real cheby_fraction, hypre_ParVector *u, hypre_ParVector *v, hypre_ParVector *z ); hypre_ParVector *hypre_ParVectorInRangeOf ( hypre_ParCSRMatrix *A ); hypre_ParVector *hypre_ParVectorInDomainOf ( hypre_ParCSRMatrix *A ); HYPRE_Int hypre_ParVectorBlockSplit ( hypre_ParVector *x, hypre_ParVector *x_ [3 ], HYPRE_Int dim ); HYPRE_Int hypre_ParVectorBlockGather ( hypre_ParVector *x, hypre_ParVector *x_ [3 ], HYPRE_Int dim ); HYPRE_Int hypre_BoomerAMGBlockSolve ( void *B, hypre_ParCSRMatrix *A, hypre_ParVector *b, hypre_ParVector *x ); HYPRE_Int hypre_ParCSRMatrixFixZeroRows ( hypre_ParCSRMatrix *A ); HYPRE_Int hypre_ParCSRComputeL1Norms ( hypre_ParCSRMatrix *A, HYPRE_Int option, HYPRE_Int *cf_marker, HYPRE_Real **l1_norm_ptr ); HYPRE_Int hypre_ParCSRMatrixSetDiagRows ( hypre_ParCSRMatrix *A, HYPRE_Real d ); void *hypre_AMSCreate ( void ); HYPRE_Int hypre_AMSDestroy ( void *solver ); HYPRE_Int hypre_AMSSetDimension ( void *solver, HYPRE_Int dim ); HYPRE_Int hypre_AMSSetDiscreteGradient ( void *solver, hypre_ParCSRMatrix *G ); HYPRE_Int hypre_AMSSetCoordinateVectors ( void *solver, hypre_ParVector *x, hypre_ParVector *y, hypre_ParVector *z ); HYPRE_Int hypre_AMSSetEdgeConstantVectors ( void *solver, hypre_ParVector *Gx, hypre_ParVector *Gy, hypre_ParVector *Gz ); HYPRE_Int hypre_AMSSetInterpolations ( void *solver, hypre_ParCSRMatrix *Pi, hypre_ParCSRMatrix *Pix, hypre_ParCSRMatrix *Piy, hypre_ParCSRMatrix *Piz ); HYPRE_Int hypre_AMSSetAlphaPoissonMatrix ( void *solver, hypre_ParCSRMatrix *A_Pi ); HYPRE_Int hypre_AMSSetBetaPoissonMatrix ( void *solver, hypre_ParCSRMatrix *A_G ); HYPRE_Int hypre_AMSSetInteriorNodes ( void *solver, hypre_ParVector *interior_nodes ); HYPRE_Int hypre_AMSSetProjectionFrequency ( void *solver, HYPRE_Int projection_frequency ); HYPRE_Int hypre_AMSSetMaxIter ( void *solver, HYPRE_Int maxit ); HYPRE_Int hypre_AMSSetTol ( void *solver, HYPRE_Real tol ); HYPRE_Int hypre_AMSSetCycleType ( void *solver, HYPRE_Int cycle_type ); HYPRE_Int hypre_AMSSetPrintLevel ( void *solver, HYPRE_Int print_level ); HYPRE_Int hypre_AMSSetSmoothingOptions ( void *solver, HYPRE_Int A_relax_type, HYPRE_Int A_relax_times, HYPRE_Real A_relax_weight, HYPRE_Real A_omega ); HYPRE_Int hypre_AMSSetChebySmoothingOptions ( void *solver, HYPRE_Int A_cheby_order, HYPRE_Real A_cheby_fraction ); HYPRE_Int hypre_AMSSetAlphaAMGOptions ( void *solver, HYPRE_Int B_Pi_coarsen_type, HYPRE_Int B_Pi_agg_levels, HYPRE_Int B_Pi_relax_type, HYPRE_Real B_Pi_theta, HYPRE_Int B_Pi_interp_type, HYPRE_Int B_Pi_Pmax ); HYPRE_Int hypre_AMSSetAlphaAMGCoarseRelaxType ( void *solver, HYPRE_Int B_Pi_coarse_relax_type ); HYPRE_Int hypre_AMSSetBetaAMGOptions ( void *solver, HYPRE_Int B_G_coarsen_type, HYPRE_Int B_G_agg_levels, HYPRE_Int B_G_relax_type, HYPRE_Real B_G_theta, HYPRE_Int B_G_interp_type, HYPRE_Int B_G_Pmax ); HYPRE_Int hypre_AMSSetBetaAMGCoarseRelaxType ( void *solver, HYPRE_Int B_G_coarse_relax_type ); HYPRE_Int hypre_AMSComputePi ( hypre_ParCSRMatrix *A, hypre_ParCSRMatrix *G, hypre_ParVector *Gx, hypre_ParVector *Gy, hypre_ParVector *Gz, HYPRE_Int dim, hypre_ParCSRMatrix **Pi_ptr ); HYPRE_Int hypre_AMSComputePixyz ( hypre_ParCSRMatrix *A, hypre_ParCSRMatrix *G, hypre_ParVector *Gx, hypre_ParVector *Gy, hypre_ParVector *Gz, HYPRE_Int dim, hypre_ParCSRMatrix **Pix_ptr, hypre_ParCSRMatrix **Piy_ptr, hypre_ParCSRMatrix **Piz_ptr ); HYPRE_Int hypre_AMSComputeGPi ( hypre_ParCSRMatrix *A, hypre_ParCSRMatrix *G, hypre_ParVector *Gx, hypre_ParVector *Gy, hypre_ParVector *Gz, HYPRE_Int dim, hypre_ParCSRMatrix **GPi_ptr ); HYPRE_Int hypre_AMSSetup ( void *solver, hypre_ParCSRMatrix *A, hypre_ParVector *b, hypre_ParVector *x ); HYPRE_Int hypre_AMSSolve ( void *solver, hypre_ParCSRMatrix *A, hypre_ParVector *b, hypre_ParVector *x ); HYPRE_Int hypre_ParCSRSubspacePrec ( hypre_ParCSRMatrix *A0, HYPRE_Int A0_relax_type, HYPRE_Int A0_relax_times, HYPRE_Real *A0_l1_norms, HYPRE_Real A0_relax_weight, HYPRE_Real A0_omega, HYPRE_Real A0_max_eig_est, HYPRE_Real A0_min_eig_est, HYPRE_Int A0_cheby_order, HYPRE_Real A0_cheby_fraction, hypre_ParCSRMatrix **A, HYPRE_Solver *B, HYPRE_PtrToSolverFcn *HB, hypre_ParCSRMatrix **P, hypre_ParVector **r, hypre_ParVector **g, hypre_ParVector *x, hypre_ParVector *y, hypre_ParVector *r0, hypre_ParVector *g0, char *cycle, hypre_ParVector *z ); HYPRE_Int hypre_AMSGetNumIterations ( void *solver, HYPRE_Int *num_iterations ); HYPRE_Int hypre_AMSGetFinalRelativeResidualNorm ( void *solver, HYPRE_Real *rel_resid_norm ); HYPRE_Int hypre_AMSProjectOutGradients ( void *solver, hypre_ParVector *x ); HYPRE_Int hypre_AMSConstructDiscreteGradient ( hypre_ParCSRMatrix *A, hypre_ParVector *x_coord, HYPRE_BigInt *edge_vertex, HYPRE_Int edge_orientation, hypre_ParCSRMatrix **G_ptr ); HYPRE_Int hypre_AMSFEISetup ( void *solver, hypre_ParCSRMatrix *A, hypre_ParVector *b, hypre_ParVector *x, HYPRE_Int num_vert, HYPRE_Int num_local_vert, HYPRE_BigInt *vert_number, HYPRE_Real *vert_coord, HYPRE_Int num_edges, HYPRE_BigInt *edge_vertex ); HYPRE_Int hypre_AMSFEIDestroy ( void *solver ); HYPRE_Int hypre_ParCSRComputeL1NormsThreads ( hypre_ParCSRMatrix *A, HYPRE_Int option, HYPRE_Int num_threads, HYPRE_Int *cf_marker, HYPRE_Real **l1_norm_ptr ); /* aux_interp.c */ HYPRE_Int hypre_alt_insert_new_nodes ( hypre_ParCSRCommPkg *comm_pkg, hypre_ParCSRCommPkg *extend_comm_pkg, HYPRE_Int *IN_marker, HYPRE_Int full_off_procNodes, HYPRE_Int *OUT_marker ); HYPRE_Int hypre_big_insert_new_nodes ( hypre_ParCSRCommPkg *comm_pkg, hypre_ParCSRCommPkg *extend_comm_pkg, HYPRE_Int *IN_marker, HYPRE_Int full_off_procNodes, HYPRE_BigInt offset, HYPRE_BigInt *OUT_marker ); HYPRE_Int hypre_ssort ( HYPRE_BigInt *data, HYPRE_Int n ); HYPRE_Int hypre_index_of_minimum ( HYPRE_BigInt *data, HYPRE_Int n ); void hypre_swap_int ( HYPRE_BigInt *data, HYPRE_Int a, HYPRE_Int b ); void hypre_initialize_vecs ( HYPRE_Int diag_n, HYPRE_Int offd_n, HYPRE_Int *diag_ftc, HYPRE_BigInt *offd_ftc, HYPRE_Int *diag_pm, HYPRE_Int *offd_pm, HYPRE_Int *tmp_CF ); /*HYPRE_Int hypre_new_offd_nodes(HYPRE_Int **found , HYPRE_Int num_cols_A_offd , HYPRE_Int *A_ext_i , HYPRE_Int *A_ext_j, HYPRE_Int num_cols_S_offd, HYPRE_Int *col_map_offd, HYPRE_Int col_1, HYPRE_Int col_n, HYPRE_Int *Sop_i, HYPRE_Int *Sop_j, HYPRE_Int *CF_marker_offd );*/ HYPRE_Int hypre_exchange_marker(hypre_ParCSRCommPkg *comm_pkg, HYPRE_Int *IN_marker, HYPRE_Int *OUT_marker); HYPRE_Int hypre_exchange_interp_data( HYPRE_Int **CF_marker_offd, HYPRE_Int **dof_func_offd, hypre_CSRMatrix **A_ext, HYPRE_Int *full_off_procNodes, hypre_CSRMatrix **Sop, hypre_ParCSRCommPkg **extend_comm_pkg, hypre_ParCSRMatrix *A, HYPRE_Int *CF_marker, hypre_ParCSRMatrix *S, HYPRE_Int num_functions, HYPRE_Int *dof_func, HYPRE_Int skip_fine_or_same_sign); void hypre_build_interp_colmap(hypre_ParCSRMatrix *P, HYPRE_Int full_off_procNodes, HYPRE_Int *tmp_CF_marker_offd, HYPRE_BigInt *fine_to_coarse_offd); /* block_tridiag.c */ void *hypre_BlockTridiagCreate ( void ); HYPRE_Int hypre_BlockTridiagDestroy ( void *data ); HYPRE_Int hypre_BlockTridiagSetup ( void *data, hypre_ParCSRMatrix *A, hypre_ParVector *b, hypre_ParVector *x ); HYPRE_Int hypre_BlockTridiagSolve ( void *data, hypre_ParCSRMatrix *A, hypre_ParVector *b, hypre_ParVector *x ); HYPRE_Int hypre_BlockTridiagSetIndexSet ( void *data, HYPRE_Int n, HYPRE_Int *inds ); HYPRE_Int hypre_BlockTridiagSetAMGStrengthThreshold ( void *data, HYPRE_Real thresh ); HYPRE_Int hypre_BlockTridiagSetAMGNumSweeps ( void *data, HYPRE_Int nsweeps ); HYPRE_Int hypre_BlockTridiagSetAMGRelaxType ( void *data, HYPRE_Int relax_type ); HYPRE_Int hypre_BlockTridiagSetPrintLevel ( void *data, HYPRE_Int print_level ); /* driver.c */ HYPRE_Int BuildParFromFile ( HYPRE_Int argc, char *argv [], HYPRE_Int arg_index, HYPRE_ParCSRMatrix *A_ptr ); HYPRE_Int BuildParLaplacian ( HYPRE_Int argc, char *argv [], HYPRE_Int arg_index, HYPRE_ParCSRMatrix *A_ptr ); HYPRE_Int BuildParDifConv ( HYPRE_Int argc, char *argv [], HYPRE_Int arg_index, HYPRE_ParCSRMatrix *A_ptr ); HYPRE_Int BuildParFromOneFile ( HYPRE_Int argc, char *argv [], HYPRE_Int arg_index, HYPRE_ParCSRMatrix *A_ptr ); HYPRE_Int BuildRhsParFromOneFile ( HYPRE_Int argc, char *argv [], HYPRE_Int arg_index, HYPRE_ParCSRMatrix A, HYPRE_ParVector *b_ptr ); HYPRE_Int BuildParLaplacian9pt ( HYPRE_Int argc, char *argv [], HYPRE_Int arg_index, HYPRE_ParCSRMatrix *A_ptr ); HYPRE_Int BuildParLaplacian27pt ( HYPRE_Int argc, char *argv [], HYPRE_Int arg_index, HYPRE_ParCSRMatrix *A_ptr ); /* gen_redcs_mat.c */ HYPRE_Int hypre_seqAMGSetup ( hypre_ParAMGData *amg_data, HYPRE_Int p_level, HYPRE_Int coarse_threshold ); HYPRE_Int hypre_seqAMGCycle ( hypre_ParAMGData *amg_data, HYPRE_Int p_level, hypre_ParVector **Par_F_array, hypre_ParVector **Par_U_array ); HYPRE_Int hypre_GenerateSubComm ( MPI_Comm comm, HYPRE_Int participate, MPI_Comm *new_comm_ptr ); void hypre_merge_lists ( HYPRE_Int *list1, HYPRE_Int *list2, hypre_int *np1, hypre_MPI_Datatype *dptr ); /* HYPRE_ads.c */ HYPRE_Int HYPRE_ADSCreate ( HYPRE_Solver *solver ); HYPRE_Int HYPRE_ADSDestroy ( HYPRE_Solver solver ); HYPRE_Int HYPRE_ADSSetup ( HYPRE_Solver solver, HYPRE_ParCSRMatrix A, HYPRE_ParVector b, HYPRE_ParVector x ); HYPRE_Int HYPRE_ADSSolve ( HYPRE_Solver solver, HYPRE_ParCSRMatrix A, HYPRE_ParVector b, HYPRE_ParVector x ); HYPRE_Int HYPRE_ADSSetDiscreteCurl ( HYPRE_Solver solver, HYPRE_ParCSRMatrix C ); HYPRE_Int HYPRE_ADSSetDiscreteGradient ( HYPRE_Solver solver, HYPRE_ParCSRMatrix G ); HYPRE_Int HYPRE_ADSSetCoordinateVectors ( HYPRE_Solver solver, HYPRE_ParVector x, HYPRE_ParVector y, HYPRE_ParVector z ); HYPRE_Int HYPRE_ADSSetInterpolations ( HYPRE_Solver solver, HYPRE_ParCSRMatrix RT_Pi, HYPRE_ParCSRMatrix RT_Pix, HYPRE_ParCSRMatrix RT_Piy, HYPRE_ParCSRMatrix RT_Piz, HYPRE_ParCSRMatrix ND_Pi, HYPRE_ParCSRMatrix ND_Pix, HYPRE_ParCSRMatrix ND_Piy, HYPRE_ParCSRMatrix ND_Piz ); HYPRE_Int HYPRE_ADSSetMaxIter ( HYPRE_Solver solver, HYPRE_Int maxit ); HYPRE_Int HYPRE_ADSSetTol ( HYPRE_Solver solver, HYPRE_Real tol ); HYPRE_Int HYPRE_ADSSetCycleType ( HYPRE_Solver solver, HYPRE_Int cycle_type ); HYPRE_Int HYPRE_ADSSetPrintLevel ( HYPRE_Solver solver, HYPRE_Int print_level ); HYPRE_Int HYPRE_ADSSetSmoothingOptions ( HYPRE_Solver solver, HYPRE_Int relax_type, HYPRE_Int relax_times, HYPRE_Real relax_weight, HYPRE_Real omega ); HYPRE_Int HYPRE_ADSSetChebySmoothingOptions ( HYPRE_Solver solver, HYPRE_Int cheby_order, HYPRE_Real cheby_fraction ); HYPRE_Int HYPRE_ADSSetAMSOptions ( HYPRE_Solver solver, HYPRE_Int cycle_type, HYPRE_Int coarsen_type, HYPRE_Int agg_levels, HYPRE_Int relax_type, HYPRE_Real strength_threshold, HYPRE_Int interp_type, HYPRE_Int Pmax ); HYPRE_Int HYPRE_ADSSetAMGOptions ( HYPRE_Solver solver, HYPRE_Int coarsen_type, HYPRE_Int agg_levels, HYPRE_Int relax_type, HYPRE_Real strength_threshold, HYPRE_Int interp_type, HYPRE_Int Pmax ); HYPRE_Int HYPRE_ADSGetNumIterations ( HYPRE_Solver solver, HYPRE_Int *num_iterations ); HYPRE_Int HYPRE_ADSGetFinalRelativeResidualNorm ( HYPRE_Solver solver, HYPRE_Real *rel_resid_norm ); /* HYPRE_ame.c */ HYPRE_Int HYPRE_AMECreate ( HYPRE_Solver *esolver ); HYPRE_Int HYPRE_AMEDestroy ( HYPRE_Solver esolver ); HYPRE_Int HYPRE_AMESetup ( HYPRE_Solver esolver ); HYPRE_Int HYPRE_AMESolve ( HYPRE_Solver esolver ); HYPRE_Int HYPRE_AMESetAMSSolver ( HYPRE_Solver esolver, HYPRE_Solver ams_solver ); HYPRE_Int HYPRE_AMESetMassMatrix ( HYPRE_Solver esolver, HYPRE_ParCSRMatrix M ); HYPRE_Int HYPRE_AMESetBlockSize ( HYPRE_Solver esolver, HYPRE_Int block_size ); HYPRE_Int HYPRE_AMESetMaxIter ( HYPRE_Solver esolver, HYPRE_Int maxit ); HYPRE_Int HYPRE_AMESetMaxPCGIter ( HYPRE_Solver esolver, HYPRE_Int maxit ); HYPRE_Int HYPRE_AMESetTol ( HYPRE_Solver esolver, HYPRE_Real tol ); HYPRE_Int HYPRE_AMESetRTol ( HYPRE_Solver esolver, HYPRE_Real tol ); HYPRE_Int HYPRE_AMESetPrintLevel ( HYPRE_Solver esolver, HYPRE_Int print_level ); HYPRE_Int HYPRE_AMEGetEigenvalues ( HYPRE_Solver esolver, HYPRE_Real **eigenvalues ); HYPRE_Int HYPRE_AMEGetEigenvectors ( HYPRE_Solver esolver, HYPRE_ParVector **eigenvectors ); /* HYPRE_ams.c */ HYPRE_Int HYPRE_AMSCreate ( HYPRE_Solver *solver ); HYPRE_Int HYPRE_AMSDestroy ( HYPRE_Solver solver ); HYPRE_Int HYPRE_AMSSetup ( HYPRE_Solver solver, HYPRE_ParCSRMatrix A, HYPRE_ParVector b, HYPRE_ParVector x ); HYPRE_Int HYPRE_AMSSolve ( HYPRE_Solver solver, HYPRE_ParCSRMatrix A, HYPRE_ParVector b, HYPRE_ParVector x ); HYPRE_Int HYPRE_AMSSetDimension ( HYPRE_Solver solver, HYPRE_Int dim ); HYPRE_Int HYPRE_AMSSetDiscreteGradient ( HYPRE_Solver solver, HYPRE_ParCSRMatrix G ); HYPRE_Int HYPRE_AMSSetCoordinateVectors ( HYPRE_Solver solver, HYPRE_ParVector x, HYPRE_ParVector y, HYPRE_ParVector z ); HYPRE_Int HYPRE_AMSSetEdgeConstantVectors ( HYPRE_Solver solver, HYPRE_ParVector Gx, HYPRE_ParVector Gy, HYPRE_ParVector Gz ); HYPRE_Int HYPRE_AMSSetInterpolations ( HYPRE_Solver solver, HYPRE_ParCSRMatrix Pi, HYPRE_ParCSRMatrix Pix, HYPRE_ParCSRMatrix Piy, HYPRE_ParCSRMatrix Piz ); HYPRE_Int HYPRE_AMSSetAlphaPoissonMatrix ( HYPRE_Solver solver, HYPRE_ParCSRMatrix A_alpha ); HYPRE_Int HYPRE_AMSSetBetaPoissonMatrix ( HYPRE_Solver solver, HYPRE_ParCSRMatrix A_beta ); HYPRE_Int HYPRE_AMSSetInteriorNodes ( HYPRE_Solver solver, HYPRE_ParVector interior_nodes ); HYPRE_Int HYPRE_AMSSetProjectionFrequency ( HYPRE_Solver solver, HYPRE_Int projection_frequency ); HYPRE_Int HYPRE_AMSSetMaxIter ( HYPRE_Solver solver, HYPRE_Int maxit ); HYPRE_Int HYPRE_AMSSetTol ( HYPRE_Solver solver, HYPRE_Real tol ); HYPRE_Int HYPRE_AMSSetCycleType ( HYPRE_Solver solver, HYPRE_Int cycle_type ); HYPRE_Int HYPRE_AMSSetPrintLevel ( HYPRE_Solver solver, HYPRE_Int print_level ); HYPRE_Int HYPRE_AMSSetSmoothingOptions ( HYPRE_Solver solver, HYPRE_Int relax_type, HYPRE_Int relax_times, HYPRE_Real relax_weight, HYPRE_Real omega ); HYPRE_Int HYPRE_AMSSetChebySmoothingOptions ( HYPRE_Solver solver, HYPRE_Int cheby_order, HYPRE_Real cheby_fraction ); HYPRE_Int HYPRE_AMSSetAlphaAMGOptions ( HYPRE_Solver solver, HYPRE_Int alpha_coarsen_type, HYPRE_Int alpha_agg_levels, HYPRE_Int alpha_relax_type, HYPRE_Real alpha_strength_threshold, HYPRE_Int alpha_interp_type, HYPRE_Int alpha_Pmax ); HYPRE_Int HYPRE_AMSSetAlphaAMGCoarseRelaxType ( HYPRE_Solver solver, HYPRE_Int alpha_coarse_relax_type ); HYPRE_Int HYPRE_AMSSetBetaAMGOptions ( HYPRE_Solver solver, HYPRE_Int beta_coarsen_type, HYPRE_Int beta_agg_levels, HYPRE_Int beta_relax_type, HYPRE_Real beta_strength_threshold, HYPRE_Int beta_interp_type, HYPRE_Int beta_Pmax ); HYPRE_Int HYPRE_AMSSetBetaAMGCoarseRelaxType ( HYPRE_Solver solver, HYPRE_Int beta_coarse_relax_type ); HYPRE_Int HYPRE_AMSGetNumIterations ( HYPRE_Solver solver, HYPRE_Int *num_iterations ); HYPRE_Int HYPRE_AMSGetFinalRelativeResidualNorm ( HYPRE_Solver solver, HYPRE_Real *rel_resid_norm ); HYPRE_Int HYPRE_AMSProjectOutGradients ( HYPRE_Solver solver, HYPRE_ParVector x ); HYPRE_Int HYPRE_AMSConstructDiscreteGradient ( HYPRE_ParCSRMatrix A, HYPRE_ParVector x_coord, HYPRE_BigInt *edge_vertex, HYPRE_Int edge_orientation, HYPRE_ParCSRMatrix *G ); HYPRE_Int HYPRE_AMSFEISetup ( HYPRE_Solver solver, HYPRE_ParCSRMatrix A, HYPRE_ParVector b, HYPRE_ParVector x, HYPRE_BigInt *EdgeNodeList_, HYPRE_BigInt *NodeNumbers_, HYPRE_Int numEdges_, HYPRE_Int numLocalNodes_, HYPRE_Int numNodes_, HYPRE_Real *NodalCoord_ ); HYPRE_Int HYPRE_AMSFEIDestroy ( HYPRE_Solver solver ); /* HYPRE_parcsr_amg.c */ HYPRE_Int HYPRE_BoomerAMGCreate ( HYPRE_Solver *solver ); HYPRE_Int HYPRE_BoomerAMGDestroy ( HYPRE_Solver solver ); HYPRE_Int HYPRE_BoomerAMGSetup ( HYPRE_Solver solver, HYPRE_ParCSRMatrix A, HYPRE_ParVector b, HYPRE_ParVector x ); HYPRE_Int HYPRE_BoomerAMGSolve ( HYPRE_Solver solver, HYPRE_ParCSRMatrix A, HYPRE_ParVector b, HYPRE_ParVector x ); HYPRE_Int HYPRE_BoomerAMGSolveT ( HYPRE_Solver solver, HYPRE_ParCSRMatrix A, HYPRE_ParVector b, HYPRE_ParVector x ); HYPRE_Int HYPRE_BoomerAMGSetRestriction ( HYPRE_Solver solver, HYPRE_Int restr_par ); HYPRE_Int HYPRE_BoomerAMGSetIsTriangular ( HYPRE_Solver solver, HYPRE_Int is_triangular ); HYPRE_Int HYPRE_BoomerAMGSetGMRESSwitchR ( HYPRE_Solver solver, HYPRE_Int gmres_switch ); HYPRE_Int HYPRE_BoomerAMGSetMaxLevels ( HYPRE_Solver solver, HYPRE_Int max_levels ); HYPRE_Int HYPRE_BoomerAMGGetMaxLevels ( HYPRE_Solver solver, HYPRE_Int *max_levels ); HYPRE_Int HYPRE_BoomerAMGSetMaxCoarseSize ( HYPRE_Solver solver, HYPRE_Int max_coarse_size ); HYPRE_Int HYPRE_BoomerAMGGetMaxCoarseSize ( HYPRE_Solver solver, HYPRE_Int *max_coarse_size ); HYPRE_Int HYPRE_BoomerAMGSetMinCoarseSize ( HYPRE_Solver solver, HYPRE_Int min_coarse_size ); HYPRE_Int HYPRE_BoomerAMGGetMinCoarseSize ( HYPRE_Solver solver, HYPRE_Int *min_coarse_size ); HYPRE_Int HYPRE_BoomerAMGSetSeqThreshold ( HYPRE_Solver solver, HYPRE_Int seq_threshold ); HYPRE_Int HYPRE_BoomerAMGGetSeqThreshold ( HYPRE_Solver solver, HYPRE_Int *seq_threshold ); HYPRE_Int HYPRE_BoomerAMGSetRedundant ( HYPRE_Solver solver, HYPRE_Int redundant ); HYPRE_Int HYPRE_BoomerAMGGetRedundant ( HYPRE_Solver solver, HYPRE_Int *redundant ); HYPRE_Int HYPRE_BoomerAMGSetCoarsenCutFactor( HYPRE_Solver solver, HYPRE_Int coarsen_cut_factor ); HYPRE_Int HYPRE_BoomerAMGGetCoarsenCutFactor( HYPRE_Solver solver, HYPRE_Int *coarsen_cut_factor ); HYPRE_Int HYPRE_BoomerAMGSetStrongThreshold ( HYPRE_Solver solver, HYPRE_Real strong_threshold ); HYPRE_Int HYPRE_BoomerAMGGetStrongThreshold ( HYPRE_Solver solver, HYPRE_Real *strong_threshold ); HYPRE_Int HYPRE_BoomerAMGSetStrongThresholdR ( HYPRE_Solver solver, HYPRE_Real strong_threshold ); HYPRE_Int HYPRE_BoomerAMGGetStrongThresholdR ( HYPRE_Solver solver, HYPRE_Real *strong_threshold ); HYPRE_Int HYPRE_BoomerAMGSetFilterThresholdR ( HYPRE_Solver solver, HYPRE_Real filter_threshold ); HYPRE_Int HYPRE_BoomerAMGGetFilterThresholdR ( HYPRE_Solver solver, HYPRE_Real *filter_threshold ); HYPRE_Int HYPRE_BoomerAMGSetGMRESSwitchR ( HYPRE_Solver solver, HYPRE_Int gmres_switch ); HYPRE_Int HYPRE_BoomerAMGSetSabs ( HYPRE_Solver solver, HYPRE_Int Sabs ); HYPRE_Int HYPRE_BoomerAMGSetMaxRowSum ( HYPRE_Solver solver, HYPRE_Real max_row_sum ); HYPRE_Int HYPRE_BoomerAMGGetMaxRowSum ( HYPRE_Solver solver, HYPRE_Real *max_row_sum ); HYPRE_Int HYPRE_BoomerAMGSetTruncFactor ( HYPRE_Solver solver, HYPRE_Real trunc_factor ); HYPRE_Int HYPRE_BoomerAMGGetTruncFactor ( HYPRE_Solver solver, HYPRE_Real *trunc_factor ); HYPRE_Int HYPRE_BoomerAMGSetPMaxElmts ( HYPRE_Solver solver, HYPRE_Int P_max_elmts ); HYPRE_Int HYPRE_BoomerAMGGetPMaxElmts ( HYPRE_Solver solver, HYPRE_Int *P_max_elmts ); HYPRE_Int HYPRE_BoomerAMGSetJacobiTruncThreshold ( HYPRE_Solver solver, HYPRE_Real jacobi_trunc_threshold ); HYPRE_Int HYPRE_BoomerAMGGetJacobiTruncThreshold ( HYPRE_Solver solver, HYPRE_Real *jacobi_trunc_threshold ); HYPRE_Int HYPRE_BoomerAMGSetPostInterpType ( HYPRE_Solver solver, HYPRE_Int post_interp_type ); HYPRE_Int HYPRE_BoomerAMGGetPostInterpType ( HYPRE_Solver solver, HYPRE_Int *post_interp_type ); HYPRE_Int HYPRE_BoomerAMGSetSCommPkgSwitch ( HYPRE_Solver solver, HYPRE_Real S_commpkg_switch ); HYPRE_Int HYPRE_BoomerAMGSetInterpType ( HYPRE_Solver solver, HYPRE_Int interp_type ); HYPRE_Int HYPRE_BoomerAMGSetSepWeight ( HYPRE_Solver solver, HYPRE_Int sep_weight ); HYPRE_Int HYPRE_BoomerAMGSetMinIter ( HYPRE_Solver solver, HYPRE_Int min_iter ); HYPRE_Int HYPRE_BoomerAMGSetMaxIter ( HYPRE_Solver solver, HYPRE_Int max_iter ); HYPRE_Int HYPRE_BoomerAMGGetMaxIter ( HYPRE_Solver solver, HYPRE_Int *max_iter ); HYPRE_Int HYPRE_BoomerAMGSetCoarsenType ( HYPRE_Solver solver, HYPRE_Int coarsen_type ); HYPRE_Int HYPRE_BoomerAMGGetCoarsenType ( HYPRE_Solver solver, HYPRE_Int *coarsen_type ); HYPRE_Int HYPRE_BoomerAMGSetMeasureType ( HYPRE_Solver solver, HYPRE_Int measure_type ); HYPRE_Int HYPRE_BoomerAMGGetMeasureType ( HYPRE_Solver solver, HYPRE_Int *measure_type ); HYPRE_Int HYPRE_BoomerAMGSetSetupType ( HYPRE_Solver solver, HYPRE_Int setup_type ); HYPRE_Int HYPRE_BoomerAMGSetOldDefault ( HYPRE_Solver solver ); HYPRE_Int HYPRE_BoomerAMGSetFCycle ( HYPRE_Solver solver, HYPRE_Int fcycle ); HYPRE_Int HYPRE_BoomerAMGGetFCycle ( HYPRE_Solver solver, HYPRE_Int *fcycle ); HYPRE_Int HYPRE_BoomerAMGSetCycleType ( HYPRE_Solver solver, HYPRE_Int cycle_type ); HYPRE_Int HYPRE_BoomerAMGGetCycleType ( HYPRE_Solver solver, HYPRE_Int *cycle_type ); HYPRE_Int HYPRE_BoomerAMGSetConvergeType ( HYPRE_Solver solver, HYPRE_Int type ); HYPRE_Int HYPRE_BoomerAMGGetConvergeType ( HYPRE_Solver solver, HYPRE_Int *type ); HYPRE_Int HYPRE_BoomerAMGSetTol ( HYPRE_Solver solver, HYPRE_Real tol ); HYPRE_Int HYPRE_BoomerAMGGetTol ( HYPRE_Solver solver, HYPRE_Real *tol ); HYPRE_Int HYPRE_BoomerAMGSetNumGridSweeps ( HYPRE_Solver solver, HYPRE_Int *num_grid_sweeps ); HYPRE_Int HYPRE_BoomerAMGSetNumSweeps ( HYPRE_Solver solver, HYPRE_Int num_sweeps ); HYPRE_Int HYPRE_BoomerAMGSetCycleNumSweeps ( HYPRE_Solver solver, HYPRE_Int num_sweeps, HYPRE_Int k ); HYPRE_Int HYPRE_BoomerAMGGetCycleNumSweeps ( HYPRE_Solver solver, HYPRE_Int *num_sweeps, HYPRE_Int k ); HYPRE_Int HYPRE_BoomerAMGInitGridRelaxation ( HYPRE_Int **num_grid_sweeps_ptr, HYPRE_Int **grid_relax_type_ptr, HYPRE_Int ***grid_relax_points_ptr, HYPRE_Int coarsen_type, HYPRE_Real **relax_weights_ptr, HYPRE_Int max_levels ); HYPRE_Int HYPRE_BoomerAMGSetGridRelaxType ( HYPRE_Solver solver, HYPRE_Int *grid_relax_type ); HYPRE_Int HYPRE_BoomerAMGSetRelaxType ( HYPRE_Solver solver, HYPRE_Int relax_type ); HYPRE_Int HYPRE_BoomerAMGSetCycleRelaxType ( HYPRE_Solver solver, HYPRE_Int relax_type, HYPRE_Int k ); HYPRE_Int HYPRE_BoomerAMGGetCycleRelaxType ( HYPRE_Solver solver, HYPRE_Int *relax_type, HYPRE_Int k ); HYPRE_Int HYPRE_BoomerAMGSetRelaxOrder ( HYPRE_Solver solver, HYPRE_Int relax_order ); HYPRE_Int HYPRE_BoomerAMGSetGridRelaxPoints ( HYPRE_Solver solver, HYPRE_Int **grid_relax_points ); HYPRE_Int HYPRE_BoomerAMGSetRelaxWeight ( HYPRE_Solver solver, HYPRE_Real *relax_weight ); HYPRE_Int HYPRE_BoomerAMGSetRelaxWt ( HYPRE_Solver solver, HYPRE_Real relax_wt ); HYPRE_Int HYPRE_BoomerAMGSetLevelRelaxWt ( HYPRE_Solver solver, HYPRE_Real relax_wt, HYPRE_Int level ); HYPRE_Int HYPRE_BoomerAMGSetOmega ( HYPRE_Solver solver, HYPRE_Real *omega ); HYPRE_Int HYPRE_BoomerAMGSetOuterWt ( HYPRE_Solver solver, HYPRE_Real outer_wt ); HYPRE_Int HYPRE_BoomerAMGSetLevelOuterWt ( HYPRE_Solver solver, HYPRE_Real outer_wt, HYPRE_Int level ); HYPRE_Int HYPRE_BoomerAMGSetSmoothType ( HYPRE_Solver solver, HYPRE_Int smooth_type ); HYPRE_Int HYPRE_BoomerAMGGetSmoothType ( HYPRE_Solver solver, HYPRE_Int *smooth_type ); HYPRE_Int HYPRE_BoomerAMGSetSmoothNumLevels ( HYPRE_Solver solver, HYPRE_Int smooth_num_levels ); HYPRE_Int HYPRE_BoomerAMGGetSmoothNumLevels ( HYPRE_Solver solver, HYPRE_Int *smooth_num_levels ); HYPRE_Int HYPRE_BoomerAMGSetSmoothNumSweeps ( HYPRE_Solver solver, HYPRE_Int smooth_num_sweeps ); HYPRE_Int HYPRE_BoomerAMGGetSmoothNumSweeps ( HYPRE_Solver solver, HYPRE_Int *smooth_num_sweeps ); HYPRE_Int HYPRE_BoomerAMGSetLogging ( HYPRE_Solver solver, HYPRE_Int logging ); HYPRE_Int HYPRE_BoomerAMGGetLogging ( HYPRE_Solver solver, HYPRE_Int *logging ); HYPRE_Int HYPRE_BoomerAMGSetPrintLevel ( HYPRE_Solver solver, HYPRE_Int print_level ); HYPRE_Int HYPRE_BoomerAMGGetPrintLevel ( HYPRE_Solver solver, HYPRE_Int *print_level ); HYPRE_Int HYPRE_BoomerAMGSetPrintFileName ( HYPRE_Solver solver, const char *print_file_name ); HYPRE_Int HYPRE_BoomerAMGSetDebugFlag ( HYPRE_Solver solver, HYPRE_Int debug_flag ); HYPRE_Int HYPRE_BoomerAMGGetDebugFlag ( HYPRE_Solver solver, HYPRE_Int *debug_flag ); HYPRE_Int HYPRE_BoomerAMGGetNumIterations ( HYPRE_Solver solver, HYPRE_Int *num_iterations ); HYPRE_Int HYPRE_BoomerAMGGetCumNumIterations ( HYPRE_Solver solver, HYPRE_Int *cum_num_iterations ); HYPRE_Int HYPRE_BoomerAMGGetResidual ( HYPRE_Solver solver, HYPRE_ParVector *residual ); HYPRE_Int HYPRE_BoomerAMGGetFinalRelativeResidualNorm ( HYPRE_Solver solver, HYPRE_Real *rel_resid_norm ); HYPRE_Int HYPRE_BoomerAMGSetVariant ( HYPRE_Solver solver, HYPRE_Int variant ); HYPRE_Int HYPRE_BoomerAMGGetVariant ( HYPRE_Solver solver, HYPRE_Int *variant ); HYPRE_Int HYPRE_BoomerAMGSetOverlap ( HYPRE_Solver solver, HYPRE_Int overlap ); HYPRE_Int HYPRE_BoomerAMGGetOverlap ( HYPRE_Solver solver, HYPRE_Int *overlap ); HYPRE_Int HYPRE_BoomerAMGSetDomainType ( HYPRE_Solver solver, HYPRE_Int domain_type ); HYPRE_Int HYPRE_BoomerAMGGetDomainType ( HYPRE_Solver solver, HYPRE_Int *domain_type ); HYPRE_Int HYPRE_BoomerAMGSetSchwarzRlxWeight ( HYPRE_Solver solver, HYPRE_Real schwarz_rlx_weight ); HYPRE_Int HYPRE_BoomerAMGGetSchwarzRlxWeight ( HYPRE_Solver solver, HYPRE_Real *schwarz_rlx_weight ); HYPRE_Int HYPRE_BoomerAMGSetSchwarzUseNonSymm ( HYPRE_Solver solver, HYPRE_Int use_nonsymm ); HYPRE_Int HYPRE_BoomerAMGSetSym ( HYPRE_Solver solver, HYPRE_Int sym ); HYPRE_Int HYPRE_BoomerAMGSetLevel ( HYPRE_Solver solver, HYPRE_Int level ); HYPRE_Int HYPRE_BoomerAMGSetThreshold ( HYPRE_Solver solver, HYPRE_Real threshold ); HYPRE_Int HYPRE_BoomerAMGSetFilter ( HYPRE_Solver solver, HYPRE_Real filter ); HYPRE_Int HYPRE_BoomerAMGSetDropTol ( HYPRE_Solver solver, HYPRE_Real drop_tol ); HYPRE_Int HYPRE_BoomerAMGSetMaxNzPerRow ( HYPRE_Solver solver, HYPRE_Int max_nz_per_row ); HYPRE_Int HYPRE_BoomerAMGSetEuclidFile ( HYPRE_Solver solver, char *euclidfile ); HYPRE_Int HYPRE_BoomerAMGSetEuLevel ( HYPRE_Solver solver, HYPRE_Int eu_level ); HYPRE_Int HYPRE_BoomerAMGSetEuSparseA ( HYPRE_Solver solver, HYPRE_Real eu_sparse_A ); HYPRE_Int HYPRE_BoomerAMGSetEuBJ ( HYPRE_Solver solver, HYPRE_Int eu_bj ); HYPRE_Int HYPRE_BoomerAMGSetILUType( HYPRE_Solver solver, HYPRE_Int ilu_type); HYPRE_Int HYPRE_BoomerAMGSetILULevel( HYPRE_Solver solver, HYPRE_Int ilu_lfil); HYPRE_Int HYPRE_BoomerAMGSetILUMaxRowNnz( HYPRE_Solver solver, HYPRE_Int ilu_max_row_nnz); HYPRE_Int HYPRE_BoomerAMGSetILUMaxIter( HYPRE_Solver solver, HYPRE_Int ilu_max_iter); HYPRE_Int HYPRE_BoomerAMGSetILUDroptol( HYPRE_Solver solver, HYPRE_Real ilu_droptol); HYPRE_Int HYPRE_BoomerAMGSetILUTriSolve( HYPRE_Solver solver, HYPRE_Int ilu_tri_solve); HYPRE_Int HYPRE_BoomerAMGSetILULowerJacobiIters( HYPRE_Solver solver, HYPRE_Int ilu_lower_jacobi_iters); HYPRE_Int HYPRE_BoomerAMGSetILUUpperJacobiIters( HYPRE_Solver solver, HYPRE_Int ilu_upper_jacobi_iters); HYPRE_Int HYPRE_BoomerAMGSetILULocalReordering( HYPRE_Solver solver, HYPRE_Int ilu_reordering_type); HYPRE_Int HYPRE_BoomerAMGSetFSAIAlgoType ( HYPRE_Solver solver, HYPRE_Int algo_type ); HYPRE_Int HYPRE_BoomerAMGSetFSAILocalSolveType ( HYPRE_Solver solver, HYPRE_Int local_solve_type ); HYPRE_Int HYPRE_BoomerAMGSetFSAIMaxSteps ( HYPRE_Solver solver, HYPRE_Int max_steps ); HYPRE_Int HYPRE_BoomerAMGSetFSAIMaxStepSize ( HYPRE_Solver solver, HYPRE_Int max_step_size ); HYPRE_Int HYPRE_BoomerAMGSetFSAIMaxNnzRow ( HYPRE_Solver solver, HYPRE_Int max_nnz_row ); HYPRE_Int HYPRE_BoomerAMGSetFSAINumLevels ( HYPRE_Solver solver, HYPRE_Int num_levels ); HYPRE_Int HYPRE_BoomerAMGSetFSAIEigMaxIters ( HYPRE_Solver solver, HYPRE_Int eig_max_iters ); HYPRE_Int HYPRE_BoomerAMGSetFSAIThreshold ( HYPRE_Solver solver, HYPRE_Real threshold ); HYPRE_Int HYPRE_BoomerAMGSetFSAIKapTolerance ( HYPRE_Solver solver, HYPRE_Real kap_tolerance ); HYPRE_Int HYPRE_BoomerAMGSetNumFunctions ( HYPRE_Solver solver, HYPRE_Int num_functions ); HYPRE_Int HYPRE_BoomerAMGGetNumFunctions ( HYPRE_Solver solver, HYPRE_Int *num_functions ); HYPRE_Int HYPRE_BoomerAMGSetFilterFunctions ( HYPRE_Solver solver, HYPRE_Int filter_functions ); HYPRE_Int HYPRE_BoomerAMGGetFilterFunctions ( HYPRE_Solver solver, HYPRE_Int *filter_functions ); HYPRE_Int HYPRE_BoomerAMGSetNodal ( HYPRE_Solver solver, HYPRE_Int nodal ); HYPRE_Int HYPRE_BoomerAMGSetNodalLevels ( HYPRE_Solver solver, HYPRE_Int nodal_levels ); HYPRE_Int HYPRE_BoomerAMGSetNodalDiag ( HYPRE_Solver solver, HYPRE_Int nodal ); HYPRE_Int HYPRE_BoomerAMGSetKeepSameSign ( HYPRE_Solver solver, HYPRE_Int keep_same_sign ); HYPRE_Int HYPRE_BoomerAMGSetDofFunc ( HYPRE_Solver solver, HYPRE_Int *dof_func ); HYPRE_Int HYPRE_BoomerAMGSetNumPaths ( HYPRE_Solver solver, HYPRE_Int num_paths ); HYPRE_Int HYPRE_BoomerAMGSetAggNumLevels ( HYPRE_Solver solver, HYPRE_Int agg_num_levels ); HYPRE_Int HYPRE_BoomerAMGSetAggInterpType ( HYPRE_Solver solver, HYPRE_Int agg_interp_type ); HYPRE_Int HYPRE_BoomerAMGSetAggTruncFactor ( HYPRE_Solver solver, HYPRE_Real agg_trunc_factor ); HYPRE_Int HYPRE_BoomerAMGSetAddTruncFactor ( HYPRE_Solver solver, HYPRE_Real add_trunc_factor ); HYPRE_Int HYPRE_BoomerAMGSetMultAddTruncFactor ( HYPRE_Solver solver, HYPRE_Real add_trunc_factor ); HYPRE_Int HYPRE_BoomerAMGSetAggP12TruncFactor ( HYPRE_Solver solver, HYPRE_Real agg_P12_trunc_factor ); HYPRE_Int HYPRE_BoomerAMGSetAggPMaxElmts ( HYPRE_Solver solver, HYPRE_Int agg_P_max_elmts ); HYPRE_Int HYPRE_BoomerAMGSetAddPMaxElmts ( HYPRE_Solver solver, HYPRE_Int add_P_max_elmts ); HYPRE_Int HYPRE_BoomerAMGSetMultAddPMaxElmts ( HYPRE_Solver solver, HYPRE_Int add_P_max_elmts ); HYPRE_Int HYPRE_BoomerAMGSetAddRelaxType ( HYPRE_Solver solver, HYPRE_Int add_rlx_type ); HYPRE_Int HYPRE_BoomerAMGSetAddRelaxWt ( HYPRE_Solver solver, HYPRE_Real add_rlx_wt ); HYPRE_Int HYPRE_BoomerAMGSetAggP12MaxElmts ( HYPRE_Solver solver, HYPRE_Int agg_P12_max_elmts ); HYPRE_Int HYPRE_BoomerAMGSetNumCRRelaxSteps ( HYPRE_Solver solver, HYPRE_Int num_CR_relax_steps ); HYPRE_Int HYPRE_BoomerAMGSetCRRate ( HYPRE_Solver solver, HYPRE_Real CR_rate ); HYPRE_Int HYPRE_BoomerAMGSetCRStrongTh ( HYPRE_Solver solver, HYPRE_Real CR_strong_th ); HYPRE_Int HYPRE_BoomerAMGSetADropTol( HYPRE_Solver solver, HYPRE_Real A_drop_tol ); HYPRE_Int HYPRE_BoomerAMGSetADropType( HYPRE_Solver solver, HYPRE_Int A_drop_type ); HYPRE_Int HYPRE_BoomerAMGSetISType ( HYPRE_Solver solver, HYPRE_Int IS_type ); HYPRE_Int HYPRE_BoomerAMGSetCRUseCG ( HYPRE_Solver solver, HYPRE_Int CR_use_CG ); HYPRE_Int HYPRE_BoomerAMGSetGSMG ( HYPRE_Solver solver, HYPRE_Int gsmg ); HYPRE_Int HYPRE_BoomerAMGSetNumSamples ( HYPRE_Solver solver, HYPRE_Int gsmg ); HYPRE_Int HYPRE_BoomerAMGSetCGCIts ( HYPRE_Solver solver, HYPRE_Int its ); HYPRE_Int HYPRE_BoomerAMGSetPlotGrids ( HYPRE_Solver solver, HYPRE_Int plotgrids ); HYPRE_Int HYPRE_BoomerAMGSetPlotFileName ( HYPRE_Solver solver, const char *plotfilename ); HYPRE_Int HYPRE_BoomerAMGSetCoordDim ( HYPRE_Solver solver, HYPRE_Int coorddim ); HYPRE_Int HYPRE_BoomerAMGSetCoordinates ( HYPRE_Solver solver, float *coordinates ); HYPRE_Int HYPRE_BoomerAMGGetGridHierarchy(HYPRE_Solver solver, HYPRE_Int *cgrid ); HYPRE_Int HYPRE_BoomerAMGSetChebyOrder ( HYPRE_Solver solver, HYPRE_Int order ); HYPRE_Int HYPRE_BoomerAMGSetChebyFraction ( HYPRE_Solver solver, HYPRE_Real ratio ); HYPRE_Int HYPRE_BoomerAMGSetChebyEigEst ( HYPRE_Solver solver, HYPRE_Int eig_est ); HYPRE_Int HYPRE_BoomerAMGSetChebyVariant ( HYPRE_Solver solver, HYPRE_Int variant ); HYPRE_Int HYPRE_BoomerAMGSetChebyScale ( HYPRE_Solver solver, HYPRE_Int scale ); HYPRE_Int HYPRE_BoomerAMGSetInterpVectors ( HYPRE_Solver solver, HYPRE_Int num_vectors, HYPRE_ParVector *vectors ); HYPRE_Int HYPRE_BoomerAMGSetInterpVecVariant ( HYPRE_Solver solver, HYPRE_Int num ); HYPRE_Int HYPRE_BoomerAMGSetInterpVecQMax ( HYPRE_Solver solver, HYPRE_Int q_max ); HYPRE_Int HYPRE_BoomerAMGSetInterpVecAbsQTrunc ( HYPRE_Solver solver, HYPRE_Real q_trunc ); HYPRE_Int HYPRE_BoomerAMGSetSmoothInterpVectors ( HYPRE_Solver solver, HYPRE_Int smooth_interp_vectors ); HYPRE_Int HYPRE_BoomerAMGSetInterpRefine ( HYPRE_Solver solver, HYPRE_Int num_refine ); HYPRE_Int HYPRE_BoomerAMGSetInterpVecFirstLevel ( HYPRE_Solver solver, HYPRE_Int level ); HYPRE_Int HYPRE_BoomerAMGSetAdditive ( HYPRE_Solver solver, HYPRE_Int additive ); HYPRE_Int HYPRE_BoomerAMGGetAdditive ( HYPRE_Solver solver, HYPRE_Int *additive ); HYPRE_Int HYPRE_BoomerAMGSetMultAdditive ( HYPRE_Solver solver, HYPRE_Int mult_additive ); HYPRE_Int HYPRE_BoomerAMGGetMultAdditive ( HYPRE_Solver solver, HYPRE_Int *mult_additive ); HYPRE_Int HYPRE_BoomerAMGSetSimple ( HYPRE_Solver solver, HYPRE_Int simple ); HYPRE_Int HYPRE_BoomerAMGGetSimple ( HYPRE_Solver solver, HYPRE_Int *simple ); HYPRE_Int HYPRE_BoomerAMGSetAddLastLvl ( HYPRE_Solver solver, HYPRE_Int add_last_lvl ); HYPRE_Int HYPRE_BoomerAMGSetNonGalerkinTol ( HYPRE_Solver solver, HYPRE_Real nongalerkin_tol ); HYPRE_Int HYPRE_BoomerAMGSetLevelNonGalerkinTol ( HYPRE_Solver solver, HYPRE_Real nongalerkin_tol, HYPRE_Int level ); HYPRE_Int HYPRE_BoomerAMGSetNonGalerkTol ( HYPRE_Solver solver, HYPRE_Int nongalerk_num_tol, HYPRE_Real *nongalerk_tol ); HYPRE_Int HYPRE_BoomerAMGSetRAP2 ( HYPRE_Solver solver, HYPRE_Int rap2 ); HYPRE_Int HYPRE_BoomerAMGSetModuleRAP2 ( HYPRE_Solver solver, HYPRE_Int mod_rap2 ); HYPRE_Int HYPRE_BoomerAMGSetKeepTranspose ( HYPRE_Solver solver, HYPRE_Int keepTranspose ); #ifdef HYPRE_USING_DSUPERLU HYPRE_Int HYPRE_BoomerAMGSetDSLUThreshold ( HYPRE_Solver solver, HYPRE_Int slu_threshold ); #endif HYPRE_Int HYPRE_BoomerAMGSetCpointsToKeep( HYPRE_Solver solver, HYPRE_Int cpt_coarse_level, HYPRE_Int num_cpt_coarse, HYPRE_BigInt *cpt_coarse_index); HYPRE_Int HYPRE_BoomerAMGSetCPoints( HYPRE_Solver solver, HYPRE_Int cpt_coarse_level, HYPRE_Int num_cpt_coarse, HYPRE_BigInt *cpt_coarse_index); HYPRE_Int HYPRE_BoomerAMGSetIsolatedFPoints( HYPRE_Solver solver, HYPRE_Int num_isolated_fpt, HYPRE_BigInt *isolated_fpt_index ); HYPRE_Int HYPRE_BoomerAMGSetFPoints( HYPRE_Solver solver, HYPRE_Int num_fpt, HYPRE_BigInt *fpt_index ); HYPRE_Int HYPRE_BoomerAMGSetCumNnzAP ( HYPRE_Solver solver, HYPRE_Real cum_nnz_AP ); HYPRE_Int HYPRE_BoomerAMGGetCumNnzAP ( HYPRE_Solver solver, HYPRE_Real *cum_nnz_AP ); /* HYPRE_parcsr_amgdd.c */ HYPRE_Int HYPRE_BoomerAMGDDSetup ( HYPRE_Solver solver, HYPRE_ParCSRMatrix A, HYPRE_ParVector b, HYPRE_ParVector x ); HYPRE_Int HYPRE_BoomerAMGDDSolve ( HYPRE_Solver solver, HYPRE_ParCSRMatrix A, HYPRE_ParVector b, HYPRE_ParVector x ); HYPRE_Int HYPRE_BoomerAMGDDSetStartLevel ( HYPRE_Solver solver, HYPRE_Int start_level ); HYPRE_Int HYPRE_BoomerAMGDDGetStartLevel ( HYPRE_Solver solver, HYPRE_Int *start_level ); HYPRE_Int HYPRE_BoomerAMGDDSetFACNumCycles ( HYPRE_Solver solver, HYPRE_Int fac_num_cycles ); HYPRE_Int HYPRE_BoomerAMGDDGetFACNumCycles ( HYPRE_Solver solver, HYPRE_Int *fac_num_cycles ); HYPRE_Int HYPRE_BoomerAMGDDSetFACCycleType ( HYPRE_Solver solver, HYPRE_Int fac_cycle_type ); HYPRE_Int HYPRE_BoomerAMGDDGetFACCycleType ( HYPRE_Solver solver, HYPRE_Int *fac_cycle_type ); HYPRE_Int HYPRE_BoomerAMGDDSetFACNumRelax ( HYPRE_Solver solver, HYPRE_Int fac_num_relax ); HYPRE_Int HYPRE_BoomerAMGDDGetFACNumRelax ( HYPRE_Solver solver, HYPRE_Int *fac_num_relax ); HYPRE_Int HYPRE_BoomerAMGDDSetFACRelaxType ( HYPRE_Solver solver, HYPRE_Int fac_relax_type ); HYPRE_Int HYPRE_BoomerAMGDDGetFACRelaxType ( HYPRE_Solver solver, HYPRE_Int *fac_relax_type ); HYPRE_Int HYPRE_BoomerAMGDDSetFACRelaxWeight ( HYPRE_Solver solver, HYPRE_Real fac_relax_weight ); HYPRE_Int HYPRE_BoomerAMGDDGetFACRelaxWeight ( HYPRE_Solver solver, HYPRE_Real *fac_relax_weight ); HYPRE_Int HYPRE_BoomerAMGDDSetPadding ( HYPRE_Solver solver, HYPRE_Int padding ); HYPRE_Int HYPRE_BoomerAMGDDGetPadding ( HYPRE_Solver solver, HYPRE_Int *padding ); HYPRE_Int HYPRE_BoomerAMGDDSetNumGhostLayers ( HYPRE_Solver solver, HYPRE_Int num_ghost_layers ); HYPRE_Int HYPRE_BoomerAMGDDGetNumGhostLayers ( HYPRE_Solver solver, HYPRE_Int *num_ghost_layers ); HYPRE_Int HYPRE_BoomerAMGDDSetUserFACRelaxation( HYPRE_Solver solver, HYPRE_Int (*userFACRelaxation)( void *amgdd_vdata, HYPRE_Int level, HYPRE_Int cycle_param ) ); HYPRE_Int HYPRE_BoomerAMGDDGetAMG ( HYPRE_Solver solver, HYPRE_Solver *amg_solver ); /* HYPRE_parcsr_bicgstab.c */ HYPRE_Int HYPRE_ParCSRBiCGSTABCreate ( MPI_Comm comm, HYPRE_Solver *solver ); HYPRE_Int HYPRE_ParCSRBiCGSTABDestroy ( HYPRE_Solver solver ); HYPRE_Int HYPRE_ParCSRBiCGSTABSetup ( HYPRE_Solver solver, HYPRE_ParCSRMatrix A, HYPRE_ParVector b, HYPRE_ParVector x ); HYPRE_Int HYPRE_ParCSRBiCGSTABSolve ( HYPRE_Solver solver, HYPRE_ParCSRMatrix A, HYPRE_ParVector b, HYPRE_ParVector x ); HYPRE_Int HYPRE_ParCSRBiCGSTABSetTol ( HYPRE_Solver solver, HYPRE_Real tol ); HYPRE_Int HYPRE_ParCSRBiCGSTABSetAbsoluteTol ( HYPRE_Solver solver, HYPRE_Real a_tol ); HYPRE_Int HYPRE_ParCSRBiCGSTABSetMinIter ( HYPRE_Solver solver, HYPRE_Int min_iter ); HYPRE_Int HYPRE_ParCSRBiCGSTABSetMaxIter ( HYPRE_Solver solver, HYPRE_Int max_iter ); HYPRE_Int HYPRE_ParCSRBiCGSTABSetStopCrit ( HYPRE_Solver solver, HYPRE_Int stop_crit ); HYPRE_Int HYPRE_ParCSRBiCGSTABSetPrecond ( HYPRE_Solver solver, HYPRE_PtrToParSolverFcn precond, HYPRE_PtrToParSolverFcn precond_setup, HYPRE_Solver precond_solver ); HYPRE_Int HYPRE_ParCSRBiCGSTABGetPrecond ( HYPRE_Solver solver, HYPRE_Solver *precond_data_ptr ); HYPRE_Int HYPRE_ParCSRBiCGSTABSetLogging ( HYPRE_Solver solver, HYPRE_Int logging ); HYPRE_Int HYPRE_ParCSRBiCGSTABSetPrintLevel ( HYPRE_Solver solver, HYPRE_Int print_level ); HYPRE_Int HYPRE_ParCSRBiCGSTABGetNumIterations ( HYPRE_Solver solver, HYPRE_Int *num_iterations ); HYPRE_Int HYPRE_ParCSRBiCGSTABGetFinalRelativeResidualNorm ( HYPRE_Solver solver, HYPRE_Real *norm ); HYPRE_Int HYPRE_ParCSRBiCGSTABGetResidual ( HYPRE_Solver solver, HYPRE_ParVector *residual ); /* HYPRE_parcsr_block.c */ HYPRE_Int HYPRE_BlockTridiagCreate ( HYPRE_Solver *solver ); HYPRE_Int HYPRE_BlockTridiagDestroy ( HYPRE_Solver solver ); HYPRE_Int HYPRE_BlockTridiagSetup ( HYPRE_Solver solver, HYPRE_ParCSRMatrix A, HYPRE_ParVector b, HYPRE_ParVector x ); HYPRE_Int HYPRE_BlockTridiagSolve ( HYPRE_Solver solver, HYPRE_ParCSRMatrix A, HYPRE_ParVector b, HYPRE_ParVector x ); HYPRE_Int HYPRE_BlockTridiagSetIndexSet ( HYPRE_Solver solver, HYPRE_Int n, HYPRE_Int *inds ); HYPRE_Int HYPRE_BlockTridiagSetAMGStrengthThreshold ( HYPRE_Solver solver, HYPRE_Real thresh ); HYPRE_Int HYPRE_BlockTridiagSetAMGNumSweeps ( HYPRE_Solver solver, HYPRE_Int num_sweeps ); HYPRE_Int HYPRE_BlockTridiagSetAMGRelaxType ( HYPRE_Solver solver, HYPRE_Int relax_type ); HYPRE_Int HYPRE_BlockTridiagSetPrintLevel ( HYPRE_Solver solver, HYPRE_Int print_level ); /* HYPRE_parcsr_cgnr.c */ HYPRE_Int HYPRE_ParCSRCGNRCreate ( MPI_Comm comm, HYPRE_Solver *solver ); HYPRE_Int HYPRE_ParCSRCGNRDestroy ( HYPRE_Solver solver ); HYPRE_Int HYPRE_ParCSRCGNRSetup ( HYPRE_Solver solver, HYPRE_ParCSRMatrix A, HYPRE_ParVector b, HYPRE_ParVector x ); HYPRE_Int HYPRE_ParCSRCGNRSolve ( HYPRE_Solver solver, HYPRE_ParCSRMatrix A, HYPRE_ParVector b, HYPRE_ParVector x ); HYPRE_Int HYPRE_ParCSRCGNRSetTol ( HYPRE_Solver solver, HYPRE_Real tol ); HYPRE_Int HYPRE_ParCSRCGNRSetMinIter ( HYPRE_Solver solver, HYPRE_Int min_iter ); HYPRE_Int HYPRE_ParCSRCGNRSetMaxIter ( HYPRE_Solver solver, HYPRE_Int max_iter ); HYPRE_Int HYPRE_ParCSRCGNRSetStopCrit ( HYPRE_Solver solver, HYPRE_Int stop_crit ); HYPRE_Int HYPRE_ParCSRCGNRSetPrecond ( HYPRE_Solver solver, HYPRE_PtrToParSolverFcn precond, HYPRE_PtrToParSolverFcn precondT, HYPRE_PtrToParSolverFcn precond_setup, HYPRE_Solver precond_solver ); HYPRE_Int HYPRE_ParCSRCGNRGetPrecond ( HYPRE_Solver solver, HYPRE_Solver *precond_data_ptr ); HYPRE_Int HYPRE_ParCSRCGNRSetLogging ( HYPRE_Solver solver, HYPRE_Int logging ); HYPRE_Int HYPRE_ParCSRCGNRGetNumIterations ( HYPRE_Solver solver, HYPRE_Int *num_iterations ); HYPRE_Int HYPRE_ParCSRCGNRGetFinalRelativeResidualNorm ( HYPRE_Solver solver, HYPRE_Real *norm ); /* HYPRE_parcsr_Euclid.c */ HYPRE_Int HYPRE_EuclidCreate ( MPI_Comm comm, HYPRE_Solver *solver ); HYPRE_Int HYPRE_EuclidDestroy ( HYPRE_Solver solver ); HYPRE_Int HYPRE_EuclidSetup ( HYPRE_Solver solver, HYPRE_ParCSRMatrix A, HYPRE_ParVector b, HYPRE_ParVector x ); HYPRE_Int HYPRE_EuclidSolve ( HYPRE_Solver solver, HYPRE_ParCSRMatrix A, HYPRE_ParVector bb, HYPRE_ParVector xx ); HYPRE_Int HYPRE_EuclidSetParams ( HYPRE_Solver solver, HYPRE_Int argc, char *argv []); HYPRE_Int HYPRE_EuclidSetParamsFromFile ( HYPRE_Solver solver, char *filename ); HYPRE_Int HYPRE_EuclidSetLevel ( HYPRE_Solver solver, HYPRE_Int level ); HYPRE_Int HYPRE_EuclidSetBJ ( HYPRE_Solver solver, HYPRE_Int bj ); HYPRE_Int HYPRE_EuclidSetStats ( HYPRE_Solver solver, HYPRE_Int eu_stats ); HYPRE_Int HYPRE_EuclidSetMem ( HYPRE_Solver solver, HYPRE_Int eu_mem ); HYPRE_Int HYPRE_EuclidSetSparseA ( HYPRE_Solver solver, HYPRE_Real sparse_A ); HYPRE_Int HYPRE_EuclidSetRowScale ( HYPRE_Solver solver, HYPRE_Int row_scale ); HYPRE_Int HYPRE_EuclidSetILUT ( HYPRE_Solver solver, HYPRE_Real ilut ); /* HYPRE_parcsr_flexgmres.c */ HYPRE_Int HYPRE_ParCSRFlexGMRESCreate ( MPI_Comm comm, HYPRE_Solver *solver ); HYPRE_Int HYPRE_ParCSRFlexGMRESDestroy ( HYPRE_Solver solver ); HYPRE_Int HYPRE_ParCSRFlexGMRESSetup ( HYPRE_Solver solver, HYPRE_ParCSRMatrix A, HYPRE_ParVector b, HYPRE_ParVector x ); HYPRE_Int HYPRE_ParCSRFlexGMRESSolve ( HYPRE_Solver solver, HYPRE_ParCSRMatrix A, HYPRE_ParVector b, HYPRE_ParVector x ); HYPRE_Int HYPRE_ParCSRFlexGMRESSetKDim ( HYPRE_Solver solver, HYPRE_Int k_dim ); HYPRE_Int HYPRE_ParCSRFlexGMRESSetTol ( HYPRE_Solver solver, HYPRE_Real tol ); HYPRE_Int HYPRE_ParCSRFlexGMRESSetAbsoluteTol ( HYPRE_Solver solver, HYPRE_Real a_tol ); HYPRE_Int HYPRE_ParCSRFlexGMRESSetMinIter ( HYPRE_Solver solver, HYPRE_Int min_iter ); HYPRE_Int HYPRE_ParCSRFlexGMRESSetMaxIter ( HYPRE_Solver solver, HYPRE_Int max_iter ); HYPRE_Int HYPRE_ParCSRFlexGMRESSetPrecond ( HYPRE_Solver solver, HYPRE_PtrToParSolverFcn precond, HYPRE_PtrToParSolverFcn precond_setup, HYPRE_Solver precond_solver ); HYPRE_Int HYPRE_ParCSRFlexGMRESGetPrecond ( HYPRE_Solver solver, HYPRE_Solver *precond_data_ptr ); HYPRE_Int HYPRE_ParCSRFlexGMRESSetLogging ( HYPRE_Solver solver, HYPRE_Int logging ); HYPRE_Int HYPRE_ParCSRFlexGMRESSetPrintLevel ( HYPRE_Solver solver, HYPRE_Int print_level ); HYPRE_Int HYPRE_ParCSRFlexGMRESGetNumIterations ( HYPRE_Solver solver, HYPRE_Int *num_iterations ); HYPRE_Int HYPRE_ParCSRFlexGMRESGetFinalRelativeResidualNorm ( HYPRE_Solver solver, HYPRE_Real *norm ); HYPRE_Int HYPRE_ParCSRFlexGMRESGetResidual ( HYPRE_Solver solver, HYPRE_ParVector *residual ); HYPRE_Int HYPRE_ParCSRFlexGMRESSetModifyPC ( HYPRE_Solver solver, HYPRE_PtrToModifyPCFcn modify_pc ); /* HYPRE_parcsr_gmres.c */ HYPRE_Int HYPRE_ParCSRGMRESCreate ( MPI_Comm comm, HYPRE_Solver *solver ); HYPRE_Int HYPRE_ParCSRGMRESDestroy ( HYPRE_Solver solver ); HYPRE_Int HYPRE_ParCSRGMRESSetup ( HYPRE_Solver solver, HYPRE_ParCSRMatrix A, HYPRE_ParVector b, HYPRE_ParVector x ); HYPRE_Int HYPRE_ParCSRGMRESSolve ( HYPRE_Solver solver, HYPRE_ParCSRMatrix A, HYPRE_ParVector b, HYPRE_ParVector x ); HYPRE_Int HYPRE_ParCSRGMRESSetKDim ( HYPRE_Solver solver, HYPRE_Int k_dim ); HYPRE_Int HYPRE_ParCSRGMRESSetTol ( HYPRE_Solver solver, HYPRE_Real tol ); HYPRE_Int HYPRE_ParCSRGMRESSetAbsoluteTol ( HYPRE_Solver solver, HYPRE_Real a_tol ); HYPRE_Int HYPRE_ParCSRGMRESSetMinIter ( HYPRE_Solver solver, HYPRE_Int min_iter ); HYPRE_Int HYPRE_ParCSRGMRESSetMaxIter ( HYPRE_Solver solver, HYPRE_Int max_iter ); HYPRE_Int HYPRE_ParCSRGMRESSetStopCrit ( HYPRE_Solver solver, HYPRE_Int stop_crit ); HYPRE_Int HYPRE_ParCSRGMRESSetPrecond ( HYPRE_Solver solver, HYPRE_PtrToParSolverFcn precond, HYPRE_PtrToParSolverFcn precond_setup, HYPRE_Solver precond_solver ); HYPRE_Int HYPRE_ParCSRGMRESGetPrecond ( HYPRE_Solver solver, HYPRE_Solver *precond_data_ptr ); HYPRE_Int HYPRE_ParCSRGMRESSetLogging ( HYPRE_Solver solver, HYPRE_Int logging ); HYPRE_Int HYPRE_ParCSRGMRESSetPrintLevel ( HYPRE_Solver solver, HYPRE_Int print_level ); HYPRE_Int HYPRE_ParCSRGMRESGetNumIterations ( HYPRE_Solver solver, HYPRE_Int *num_iterations ); HYPRE_Int HYPRE_ParCSRGMRESGetFinalRelativeResidualNorm ( HYPRE_Solver solver, HYPRE_Real *norm ); HYPRE_Int HYPRE_ParCSRGMRESGetResidual ( HYPRE_Solver solver, HYPRE_ParVector *residual ); /*HYPRE_parcsr_cogmres.c*/ HYPRE_Int HYPRE_ParCSRCOGMRESCreate ( MPI_Comm comm, HYPRE_Solver *solver ); HYPRE_Int HYPRE_ParCSRCOGMRESDestroy ( HYPRE_Solver solver ); HYPRE_Int HYPRE_ParCSRCOGMRESSetup ( HYPRE_Solver solver, HYPRE_ParCSRMatrix A, HYPRE_ParVector b, HYPRE_ParVector x ); HYPRE_Int HYPRE_ParCSRCOGMRESSolve ( HYPRE_Solver solver, HYPRE_ParCSRMatrix A, HYPRE_ParVector b, HYPRE_ParVector x ); HYPRE_Int HYPRE_ParCSRCOGMRESSetKDim ( HYPRE_Solver solver, HYPRE_Int k_dim ); HYPRE_Int HYPRE_ParCSRCOGMRESSetCGS2 ( HYPRE_Solver solver, HYPRE_Int cgs2 ); HYPRE_Int HYPRE_ParCSRCOGMRESSetTol ( HYPRE_Solver solver, HYPRE_Real tol ); HYPRE_Int HYPRE_ParCSRCOGMRESSetAbsoluteTol ( HYPRE_Solver solver, HYPRE_Real a_tol ); HYPRE_Int HYPRE_ParCSRCOGMRESSetMinIter ( HYPRE_Solver solver, HYPRE_Int min_iter ); HYPRE_Int HYPRE_ParCSRCOGMRESSetMaxIter ( HYPRE_Solver solver, HYPRE_Int max_iter ); HYPRE_Int HYPRE_ParCSRCOGMRESSetPrecond ( HYPRE_Solver solver, HYPRE_PtrToParSolverFcn precond, HYPRE_PtrToParSolverFcn precond_setup, HYPRE_Solver precond_solver ); HYPRE_Int HYPRE_ParCSRCOGMRESGetPrecond ( HYPRE_Solver solver, HYPRE_Solver *precond_data_ptr ); HYPRE_Int HYPRE_ParCSRCOGMRESSetLogging ( HYPRE_Solver solver, HYPRE_Int logging ); HYPRE_Int HYPRE_ParCSRCOGMRESSetPrintLevel ( HYPRE_Solver solver, HYPRE_Int print_level ); HYPRE_Int HYPRE_ParCSRCOGMRESGetNumIterations ( HYPRE_Solver solver, HYPRE_Int *num_iterations ); HYPRE_Int HYPRE_ParCSRCOGMRESGetFinalRelativeResidualNorm ( HYPRE_Solver solver, HYPRE_Real *norm ); HYPRE_Int HYPRE_ParCSRCOGMRESGetResidual ( HYPRE_Solver solver, HYPRE_ParVector *residual ); /* HYPRE_parcsr_hybrid.c */ HYPRE_Int HYPRE_ParCSRHybridCreate ( HYPRE_Solver *solver ); HYPRE_Int HYPRE_ParCSRHybridDestroy ( HYPRE_Solver solver ); HYPRE_Int HYPRE_ParCSRHybridSetup ( HYPRE_Solver solver, HYPRE_ParCSRMatrix A, HYPRE_ParVector b, HYPRE_ParVector x ); HYPRE_Int HYPRE_ParCSRHybridSolve ( HYPRE_Solver solver, HYPRE_ParCSRMatrix A, HYPRE_ParVector b, HYPRE_ParVector x ); HYPRE_Int HYPRE_ParCSRHybridSetTol ( HYPRE_Solver solver, HYPRE_Real tol ); HYPRE_Int HYPRE_ParCSRHybridSetAbsoluteTol ( HYPRE_Solver solver, HYPRE_Real tol ); HYPRE_Int HYPRE_ParCSRHybridSetConvergenceTol ( HYPRE_Solver solver, HYPRE_Real cf_tol ); HYPRE_Int HYPRE_ParCSRHybridSetDSCGMaxIter ( HYPRE_Solver solver, HYPRE_Int dscg_max_its ); HYPRE_Int HYPRE_ParCSRHybridSetPCGMaxIter ( HYPRE_Solver solver, HYPRE_Int pcg_max_its ); HYPRE_Int HYPRE_ParCSRHybridSetSetupType ( HYPRE_Solver solver, HYPRE_Int setup_type ); HYPRE_Int HYPRE_ParCSRHybridSetSolverType ( HYPRE_Solver solver, HYPRE_Int solver_type ); HYPRE_Int HYPRE_ParCSRHybridSetKDim ( HYPRE_Solver solver, HYPRE_Int k_dim ); HYPRE_Int HYPRE_ParCSRHybridSetTwoNorm ( HYPRE_Solver solver, HYPRE_Int two_norm ); HYPRE_Int HYPRE_ParCSRHybridSetStopCrit ( HYPRE_Solver solver, HYPRE_Int stop_crit ); HYPRE_Int HYPRE_ParCSRHybridSetRelChange ( HYPRE_Solver solver, HYPRE_Int rel_change ); HYPRE_Int HYPRE_ParCSRHybridSetPrecond ( HYPRE_Solver solver, HYPRE_PtrToParSolverFcn precond, HYPRE_PtrToParSolverFcn precond_setup, HYPRE_Solver precond_solver ); HYPRE_Int HYPRE_ParCSRHybridSetLogging ( HYPRE_Solver solver, HYPRE_Int logging ); HYPRE_Int HYPRE_ParCSRHybridSetPrintLevel ( HYPRE_Solver solver, HYPRE_Int print_level ); HYPRE_Int HYPRE_ParCSRHybridSetStrongThreshold ( HYPRE_Solver solver, HYPRE_Real strong_threshold ); HYPRE_Int HYPRE_ParCSRHybridSetMaxRowSum ( HYPRE_Solver solver, HYPRE_Real max_row_sum ); HYPRE_Int HYPRE_ParCSRHybridSetTruncFactor ( HYPRE_Solver solver, HYPRE_Real trunc_factor ); HYPRE_Int HYPRE_ParCSRHybridSetPMaxElmts ( HYPRE_Solver solver, HYPRE_Int p_max ); HYPRE_Int HYPRE_ParCSRHybridSetMaxLevels ( HYPRE_Solver solver, HYPRE_Int max_levels ); HYPRE_Int HYPRE_ParCSRHybridSetMeasureType ( HYPRE_Solver solver, HYPRE_Int measure_type ); HYPRE_Int HYPRE_ParCSRHybridSetCoarsenType ( HYPRE_Solver solver, HYPRE_Int coarsen_type ); HYPRE_Int HYPRE_ParCSRHybridSetInterpType ( HYPRE_Solver solver, HYPRE_Int interp_type ); HYPRE_Int HYPRE_ParCSRHybridSetCycleType ( HYPRE_Solver solver, HYPRE_Int cycle_type ); HYPRE_Int HYPRE_ParCSRHybridSetNumGridSweeps ( HYPRE_Solver solver, HYPRE_Int *num_grid_sweeps ); HYPRE_Int HYPRE_ParCSRHybridSetGridRelaxType ( HYPRE_Solver solver, HYPRE_Int *grid_relax_type ); HYPRE_Int HYPRE_ParCSRHybridSetGridRelaxPoints ( HYPRE_Solver solver, HYPRE_Int **grid_relax_points ); HYPRE_Int HYPRE_ParCSRHybridSetNumSweeps ( HYPRE_Solver solver, HYPRE_Int num_sweeps ); HYPRE_Int HYPRE_ParCSRHybridSetCycleNumSweeps ( HYPRE_Solver solver, HYPRE_Int num_sweeps, HYPRE_Int k ); HYPRE_Int HYPRE_ParCSRHybridSetRelaxType ( HYPRE_Solver solver, HYPRE_Int relax_type ); HYPRE_Int HYPRE_ParCSRHybridSetKeepTranspose ( HYPRE_Solver solver, HYPRE_Int keepT ); HYPRE_Int HYPRE_ParCSRHybridSetCycleRelaxType ( HYPRE_Solver solver, HYPRE_Int relax_type, HYPRE_Int k ); HYPRE_Int HYPRE_ParCSRHybridSetRelaxOrder ( HYPRE_Solver solver, HYPRE_Int relax_order ); HYPRE_Int HYPRE_ParCSRHybridSetMaxCoarseSize ( HYPRE_Solver solver, HYPRE_Int max_coarse_size ); HYPRE_Int HYPRE_ParCSRHybridSetMinCoarseSize ( HYPRE_Solver solver, HYPRE_Int min_coarse_size ); HYPRE_Int HYPRE_ParCSRHybridSetSeqThreshold ( HYPRE_Solver solver, HYPRE_Int seq_threshold ); HYPRE_Int HYPRE_ParCSRHybridSetRelaxWt ( HYPRE_Solver solver, HYPRE_Real relax_wt ); HYPRE_Int HYPRE_ParCSRHybridSetLevelRelaxWt ( HYPRE_Solver solver, HYPRE_Real relax_wt, HYPRE_Int level ); HYPRE_Int HYPRE_ParCSRHybridSetOuterWt ( HYPRE_Solver solver, HYPRE_Real outer_wt ); HYPRE_Int HYPRE_ParCSRHybridSetLevelOuterWt ( HYPRE_Solver solver, HYPRE_Real outer_wt, HYPRE_Int level ); HYPRE_Int HYPRE_ParCSRHybridSetRelaxWeight ( HYPRE_Solver solver, HYPRE_Real *relax_weight ); HYPRE_Int HYPRE_ParCSRHybridSetOmega ( HYPRE_Solver solver, HYPRE_Real *omega ); HYPRE_Int HYPRE_ParCSRHybridSetAggNumLevels ( HYPRE_Solver solver, HYPRE_Int agg_num_levels ); HYPRE_Int HYPRE_ParCSRHybridSetNumPaths ( HYPRE_Solver solver, HYPRE_Int num_paths ); HYPRE_Int HYPRE_ParCSRHybridSetNumFunctions ( HYPRE_Solver solver, HYPRE_Int num_functions ); HYPRE_Int HYPRE_ParCSRHybridSetNodal ( HYPRE_Solver solver, HYPRE_Int nodal ); HYPRE_Int HYPRE_ParCSRHybridSetDofFunc ( HYPRE_Solver solver, HYPRE_Int *dof_func ); HYPRE_Int HYPRE_ParCSRHybridSetNonGalerkinTol ( HYPRE_Solver solver, HYPRE_Int nongalerk_num_tol, HYPRE_Real *nongalerkin_tol ); HYPRE_Int HYPRE_ParCSRHybridGetNumIterations ( HYPRE_Solver solver, HYPRE_Int *num_its ); HYPRE_Int HYPRE_ParCSRHybridGetDSCGNumIterations ( HYPRE_Solver solver, HYPRE_Int *dscg_num_its ); HYPRE_Int HYPRE_ParCSRHybridGetPCGNumIterations ( HYPRE_Solver solver, HYPRE_Int *pcg_num_its ); HYPRE_Int HYPRE_ParCSRHybridGetFinalRelativeResidualNorm ( HYPRE_Solver solver, HYPRE_Real *norm ); HYPRE_Int HYPRE_ParCSRHybridGetSetupSolveTime( HYPRE_Solver solver, HYPRE_Real *time ); /* HYPRE_parcsr_int.c */ HYPRE_Int hypre_ParSetRandomValues ( void *v, HYPRE_Int seed ); HYPRE_Int hypre_ParPrintVector ( void *v, const char *file ); void *hypre_ParReadVector ( MPI_Comm comm, const char *file ); HYPRE_Int hypre_ParVectorSize ( void *x ); HYPRE_Int HYPRE_ParCSRMultiVectorPrint ( void *x_, const char *fileName ); void *HYPRE_ParCSRMultiVectorRead ( MPI_Comm comm, void *ii_, const char *fileName ); HYPRE_Int aux_maskCount ( HYPRE_Int n, HYPRE_Int *mask ); void aux_indexFromMask ( HYPRE_Int n, HYPRE_Int *mask, HYPRE_Int *index ); HYPRE_Int HYPRE_TempParCSRSetupInterpreter ( mv_InterfaceInterpreter *i ); HYPRE_Int HYPRE_ParCSRSetupInterpreter ( mv_InterfaceInterpreter *i ); HYPRE_Int HYPRE_ParCSRSetupMatvec ( HYPRE_MatvecFunctions *mv ); /* HYPRE_parcsr_lgmres.c */ HYPRE_Int HYPRE_ParCSRLGMRESCreate ( MPI_Comm comm, HYPRE_Solver *solver ); HYPRE_Int HYPRE_ParCSRLGMRESDestroy ( HYPRE_Solver solver ); HYPRE_Int HYPRE_ParCSRLGMRESSetup ( HYPRE_Solver solver, HYPRE_ParCSRMatrix A, HYPRE_ParVector b, HYPRE_ParVector x ); HYPRE_Int HYPRE_ParCSRLGMRESSolve ( HYPRE_Solver solver, HYPRE_ParCSRMatrix A, HYPRE_ParVector b, HYPRE_ParVector x ); HYPRE_Int HYPRE_ParCSRLGMRESSetKDim ( HYPRE_Solver solver, HYPRE_Int k_dim ); HYPRE_Int HYPRE_ParCSRLGMRESSetAugDim ( HYPRE_Solver solver, HYPRE_Int aug_dim ); HYPRE_Int HYPRE_ParCSRLGMRESSetTol ( HYPRE_Solver solver, HYPRE_Real tol ); HYPRE_Int HYPRE_ParCSRLGMRESSetAbsoluteTol ( HYPRE_Solver solver, HYPRE_Real a_tol ); HYPRE_Int HYPRE_ParCSRLGMRESSetMinIter ( HYPRE_Solver solver, HYPRE_Int min_iter ); HYPRE_Int HYPRE_ParCSRLGMRESSetMaxIter ( HYPRE_Solver solver, HYPRE_Int max_iter ); HYPRE_Int HYPRE_ParCSRLGMRESSetPrecond ( HYPRE_Solver solver, HYPRE_PtrToParSolverFcn precond, HYPRE_PtrToParSolverFcn precond_setup, HYPRE_Solver precond_solver ); HYPRE_Int HYPRE_ParCSRLGMRESGetPrecond ( HYPRE_Solver solver, HYPRE_Solver *precond_data_ptr ); HYPRE_Int HYPRE_ParCSRLGMRESSetLogging ( HYPRE_Solver solver, HYPRE_Int logging ); HYPRE_Int HYPRE_ParCSRLGMRESSetPrintLevel ( HYPRE_Solver solver, HYPRE_Int print_level ); HYPRE_Int HYPRE_ParCSRLGMRESGetNumIterations ( HYPRE_Solver solver, HYPRE_Int *num_iterations ); HYPRE_Int HYPRE_ParCSRLGMRESGetFinalRelativeResidualNorm ( HYPRE_Solver solver, HYPRE_Real *norm ); HYPRE_Int HYPRE_ParCSRLGMRESGetResidual ( HYPRE_Solver solver, HYPRE_ParVector *residual ); /* HYPRE_parcsr_ParaSails.c */ HYPRE_Int HYPRE_ParCSRParaSailsCreate ( MPI_Comm comm, HYPRE_Solver *solver ); HYPRE_Int HYPRE_ParCSRParaSailsDestroy ( HYPRE_Solver solver ); HYPRE_Int HYPRE_ParCSRParaSailsSetup ( HYPRE_Solver solver, HYPRE_ParCSRMatrix A, HYPRE_ParVector b, HYPRE_ParVector x ); HYPRE_Int HYPRE_ParCSRParaSailsSolve ( HYPRE_Solver solver, HYPRE_ParCSRMatrix A, HYPRE_ParVector b, HYPRE_ParVector x ); HYPRE_Int HYPRE_ParCSRParaSailsSetParams ( HYPRE_Solver solver, HYPRE_Real thresh, HYPRE_Int nlevels ); HYPRE_Int HYPRE_ParCSRParaSailsSetFilter ( HYPRE_Solver solver, HYPRE_Real filter ); HYPRE_Int HYPRE_ParCSRParaSailsGetFilter ( HYPRE_Solver solver, HYPRE_Real *filter ); HYPRE_Int HYPRE_ParCSRParaSailsSetSym ( HYPRE_Solver solver, HYPRE_Int sym ); HYPRE_Int HYPRE_ParCSRParaSailsSetLoadbal ( HYPRE_Solver solver, HYPRE_Real loadbal ); HYPRE_Int HYPRE_ParCSRParaSailsGetLoadbal ( HYPRE_Solver solver, HYPRE_Real *loadbal ); HYPRE_Int HYPRE_ParCSRParaSailsSetReuse ( HYPRE_Solver solver, HYPRE_Int reuse ); HYPRE_Int HYPRE_ParCSRParaSailsSetLogging ( HYPRE_Solver solver, HYPRE_Int logging ); HYPRE_Int HYPRE_ParaSailsCreate ( MPI_Comm comm, HYPRE_Solver *solver ); HYPRE_Int HYPRE_ParaSailsDestroy ( HYPRE_Solver solver ); HYPRE_Int HYPRE_ParaSailsSetup ( HYPRE_Solver solver, HYPRE_ParCSRMatrix A, HYPRE_ParVector b, HYPRE_ParVector x ); HYPRE_Int HYPRE_ParaSailsSolve ( HYPRE_Solver solver, HYPRE_ParCSRMatrix A, HYPRE_ParVector b, HYPRE_ParVector x ); HYPRE_Int HYPRE_ParaSailsSetParams ( HYPRE_Solver solver, HYPRE_Real thresh, HYPRE_Int nlevels ); HYPRE_Int HYPRE_ParaSailsSetThresh ( HYPRE_Solver solver, HYPRE_Real thresh ); HYPRE_Int HYPRE_ParaSailsGetThresh ( HYPRE_Solver solver, HYPRE_Real *thresh ); HYPRE_Int HYPRE_ParaSailsSetNlevels ( HYPRE_Solver solver, HYPRE_Int nlevels ); HYPRE_Int HYPRE_ParaSailsGetNlevels ( HYPRE_Solver solver, HYPRE_Int *nlevels ); HYPRE_Int HYPRE_ParaSailsSetFilter ( HYPRE_Solver solver, HYPRE_Real filter ); HYPRE_Int HYPRE_ParaSailsGetFilter ( HYPRE_Solver solver, HYPRE_Real *filter ); HYPRE_Int HYPRE_ParaSailsSetSym ( HYPRE_Solver solver, HYPRE_Int sym ); HYPRE_Int HYPRE_ParaSailsGetSym ( HYPRE_Solver solver, HYPRE_Int *sym ); HYPRE_Int HYPRE_ParaSailsSetLoadbal ( HYPRE_Solver solver, HYPRE_Real loadbal ); HYPRE_Int HYPRE_ParaSailsGetLoadbal ( HYPRE_Solver solver, HYPRE_Real *loadbal ); HYPRE_Int HYPRE_ParaSailsSetReuse ( HYPRE_Solver solver, HYPRE_Int reuse ); HYPRE_Int HYPRE_ParaSailsGetReuse ( HYPRE_Solver solver, HYPRE_Int *reuse ); HYPRE_Int HYPRE_ParaSailsSetLogging ( HYPRE_Solver solver, HYPRE_Int logging ); HYPRE_Int HYPRE_ParaSailsGetLogging ( HYPRE_Solver solver, HYPRE_Int *logging ); HYPRE_Int HYPRE_ParaSailsBuildIJMatrix ( HYPRE_Solver solver, HYPRE_IJMatrix *pij_A ); /* HYPRE_parcsr_fsai.c */ HYPRE_Int HYPRE_FSAICreate ( HYPRE_Solver *solver); HYPRE_Int HYPRE_FSAIDestroy ( HYPRE_Solver solver ); HYPRE_Int HYPRE_FSAISetup ( HYPRE_Solver solver, HYPRE_ParCSRMatrix A, HYPRE_ParVector b, HYPRE_ParVector x ); HYPRE_Int HYPRE_FSAISolve ( HYPRE_Solver solver, HYPRE_ParCSRMatrix A, HYPRE_ParVector b, HYPRE_ParVector x ); HYPRE_Int HYPRE_FSAISetAlgoType ( HYPRE_Solver solver, HYPRE_Int algo_type ); HYPRE_Int HYPRE_FSAIGetAlgoType ( HYPRE_Solver solver, HYPRE_Int *algo_type ); HYPRE_Int HYPRE_FSAISetLocalSolveType ( HYPRE_Solver solver, HYPRE_Int local_solve_type ); HYPRE_Int HYPRE_FSAIGetLocalSolveType ( HYPRE_Solver solver, HYPRE_Int *local_solve_type ); HYPRE_Int HYPRE_FSAISetMaxSteps ( HYPRE_Solver solver, HYPRE_Int max_steps ); HYPRE_Int HYPRE_FSAIGetMaxSteps ( HYPRE_Solver solver, HYPRE_Int *max_steps ); HYPRE_Int HYPRE_FSAISetMaxStepSize ( HYPRE_Solver solver, HYPRE_Int max_step_size ); HYPRE_Int HYPRE_FSAIGetMaxStepSize ( HYPRE_Solver solver, HYPRE_Int *max_step_size ); HYPRE_Int HYPRE_FSAISetMaxNnzRow ( HYPRE_Solver solver, HYPRE_Int max_nnz_row ); HYPRE_Int HYPRE_FSAIGetMaxNnzRow ( HYPRE_Solver solver, HYPRE_Int *max_nnz_row ); HYPRE_Int HYPRE_FSAISetNumLevels ( HYPRE_Solver solver, HYPRE_Int num_levels ); HYPRE_Int HYPRE_FSAIGetNumLevels ( HYPRE_Solver solver, HYPRE_Int *num_levels ); HYPRE_Int HYPRE_FSAISetThreshold ( HYPRE_Solver solver, HYPRE_Real threshold ); HYPRE_Int HYPRE_FSAIGetThreshold ( HYPRE_Solver solver, HYPRE_Real *threshold ); HYPRE_Int HYPRE_FSAISetKapTolerance ( HYPRE_Solver solver, HYPRE_Real kap_tolerance ); HYPRE_Int HYPRE_FSAIGetKapTolerance ( HYPRE_Solver solver, HYPRE_Real *kap_tolerance ); HYPRE_Int HYPRE_FSAISetTolerance ( HYPRE_Solver solver, HYPRE_Real tolerance ); HYPRE_Int HYPRE_FSAIGetTolerance ( HYPRE_Solver solver, HYPRE_Real *tolerance ); HYPRE_Int HYPRE_FSAISetOmega ( HYPRE_Solver solver, HYPRE_Real omega ); HYPRE_Int HYPRE_FSAIGetOmega ( HYPRE_Solver solver, HYPRE_Real *omega ); HYPRE_Int HYPRE_FSAISetMaxIterations ( HYPRE_Solver solver, HYPRE_Int max_iterations ); HYPRE_Int HYPRE_FSAIGetMaxIterations ( HYPRE_Solver solver, HYPRE_Int *max_iterations ); HYPRE_Int HYPRE_FSAISetEigMaxIters ( HYPRE_Solver solver, HYPRE_Int eig_max_iters ); HYPRE_Int HYPRE_FSAIGetEigMaxIters ( HYPRE_Solver solver, HYPRE_Int *eig_max_iters ); HYPRE_Int HYPRE_FSAISetZeroGuess ( HYPRE_Solver solver, HYPRE_Int zero_guess ); HYPRE_Int HYPRE_FSAIGetZeroGuess ( HYPRE_Solver solver, HYPRE_Int *zero_guess ); HYPRE_Int HYPRE_FSAISetPrintLevel ( HYPRE_Solver solver, HYPRE_Int print_level ); HYPRE_Int HYPRE_FSAIGetPrintLevel ( HYPRE_Solver solver, HYPRE_Int *print_level ); /* HYPRE_parcsr_pcg.c */ HYPRE_Int HYPRE_ParCSRPCGCreate ( MPI_Comm comm, HYPRE_Solver *solver ); HYPRE_Int HYPRE_ParCSRPCGDestroy ( HYPRE_Solver solver ); HYPRE_Int HYPRE_ParCSRPCGSetup ( HYPRE_Solver solver, HYPRE_ParCSRMatrix A, HYPRE_ParVector b, HYPRE_ParVector x ); HYPRE_Int HYPRE_ParCSRPCGSolve ( HYPRE_Solver solver, HYPRE_ParCSRMatrix A, HYPRE_ParVector b, HYPRE_ParVector x ); HYPRE_Int HYPRE_ParCSRPCGSetTol ( HYPRE_Solver solver, HYPRE_Real tol ); HYPRE_Int HYPRE_ParCSRPCGSetAbsoluteTol ( HYPRE_Solver solver, HYPRE_Real a_tol ); HYPRE_Int HYPRE_ParCSRPCGSetMaxIter ( HYPRE_Solver solver, HYPRE_Int max_iter ); HYPRE_Int HYPRE_ParCSRPCGSetStopCrit ( HYPRE_Solver solver, HYPRE_Int stop_crit ); HYPRE_Int HYPRE_ParCSRPCGSetTwoNorm ( HYPRE_Solver solver, HYPRE_Int two_norm ); HYPRE_Int HYPRE_ParCSRPCGSetRelChange ( HYPRE_Solver solver, HYPRE_Int rel_change ); HYPRE_Int HYPRE_ParCSRPCGSetPrecond ( HYPRE_Solver solver, HYPRE_PtrToParSolverFcn precond, HYPRE_PtrToParSolverFcn precond_setup, HYPRE_Solver precond_solver ); HYPRE_Int HYPRE_ParCSRPCGGetPrecond ( HYPRE_Solver solver, HYPRE_Solver *precond_data_ptr ); HYPRE_Int HYPRE_ParCSRPCGSetPrintLevel ( HYPRE_Solver solver, HYPRE_Int level ); HYPRE_Int HYPRE_ParCSRPCGSetLogging ( HYPRE_Solver solver, HYPRE_Int level ); HYPRE_Int HYPRE_ParCSRPCGGetNumIterations ( HYPRE_Solver solver, HYPRE_Int *num_iterations ); HYPRE_Int HYPRE_ParCSRPCGGetFinalRelativeResidualNorm ( HYPRE_Solver solver, HYPRE_Real *norm ); HYPRE_Int HYPRE_ParCSRPCGGetResidual ( HYPRE_Solver solver, HYPRE_ParVector *residual ); HYPRE_Int HYPRE_ParCSRDiagScaleSetup ( HYPRE_Solver solver, HYPRE_ParCSRMatrix A, HYPRE_ParVector y, HYPRE_ParVector x ); HYPRE_Int HYPRE_ParCSRDiagScale ( HYPRE_Solver solver, HYPRE_ParCSRMatrix HA, HYPRE_ParVector Hy, HYPRE_ParVector Hx ); HYPRE_Int HYPRE_ParCSROnProcTriSetup ( HYPRE_Solver solver, HYPRE_ParCSRMatrix HA, HYPRE_ParVector Hy, HYPRE_ParVector Hx ); HYPRE_Int HYPRE_ParCSROnProcTriSolve ( HYPRE_Solver solver, HYPRE_ParCSRMatrix HA, HYPRE_ParVector Hy, HYPRE_ParVector Hx ); /* HYPRE_parcsr_pilut.c */ HYPRE_Int HYPRE_ParCSRPilutCreate ( MPI_Comm comm, HYPRE_Solver *solver ); HYPRE_Int HYPRE_ParCSRPilutDestroy ( HYPRE_Solver solver ); HYPRE_Int HYPRE_ParCSRPilutSetup ( HYPRE_Solver solver, HYPRE_ParCSRMatrix A, HYPRE_ParVector b, HYPRE_ParVector x ); HYPRE_Int HYPRE_ParCSRPilutSolve ( HYPRE_Solver solver, HYPRE_ParCSRMatrix A, HYPRE_ParVector b, HYPRE_ParVector x ); HYPRE_Int HYPRE_ParCSRPilutSetMaxIter ( HYPRE_Solver solver, HYPRE_Int max_iter ); HYPRE_Int HYPRE_ParCSRPilutSetDropTolerance ( HYPRE_Solver solver, HYPRE_Real tol ); HYPRE_Int HYPRE_ParCSRPilutSetFactorRowSize ( HYPRE_Solver solver, HYPRE_Int size ); /* HYPRE_parcsr_schwarz.c */ HYPRE_Int HYPRE_SchwarzCreate ( HYPRE_Solver *solver ); HYPRE_Int HYPRE_SchwarzDestroy ( HYPRE_Solver solver ); HYPRE_Int HYPRE_SchwarzSetup ( HYPRE_Solver solver, HYPRE_ParCSRMatrix A, HYPRE_ParVector b, HYPRE_ParVector x ); HYPRE_Int HYPRE_SchwarzSolve ( HYPRE_Solver solver, HYPRE_ParCSRMatrix A, HYPRE_ParVector b, HYPRE_ParVector x ); HYPRE_Int HYPRE_SchwarzSetVariant ( HYPRE_Solver solver, HYPRE_Int variant ); HYPRE_Int HYPRE_SchwarzSetOverlap ( HYPRE_Solver solver, HYPRE_Int overlap ); HYPRE_Int HYPRE_SchwarzSetDomainType ( HYPRE_Solver solver, HYPRE_Int domain_type ); HYPRE_Int HYPRE_SchwarzSetDomainStructure ( HYPRE_Solver solver, HYPRE_CSRMatrix domain_structure ); HYPRE_Int HYPRE_SchwarzSetNumFunctions ( HYPRE_Solver solver, HYPRE_Int num_functions ); HYPRE_Int HYPRE_SchwarzSetNonSymm ( HYPRE_Solver solver, HYPRE_Int use_nonsymm ); HYPRE_Int HYPRE_SchwarzSetRelaxWeight ( HYPRE_Solver solver, HYPRE_Real relax_weight ); HYPRE_Int HYPRE_SchwarzSetDofFunc ( HYPRE_Solver solver, HYPRE_Int *dof_func ); /* par_add_cycle.c */ HYPRE_Int hypre_BoomerAMGAdditiveCycle ( void *amg_vdata ); HYPRE_Int hypre_CreateLambda ( void *amg_vdata ); HYPRE_Int hypre_CreateDinv ( void *amg_vdata ); /* par_amg.c */ void *hypre_BoomerAMGCreate ( void ); HYPRE_Int hypre_BoomerAMGDestroy ( void *data ); HYPRE_Int hypre_BoomerAMGSetRestriction ( void *data, HYPRE_Int restr_par ); HYPRE_Int hypre_BoomerAMGSetIsTriangular ( void *data, HYPRE_Int is_triangular ); HYPRE_Int hypre_BoomerAMGSetGMRESSwitchR ( void *data, HYPRE_Int gmres_switch ); HYPRE_Int hypre_BoomerAMGSetMaxLevels ( void *data, HYPRE_Int max_levels ); HYPRE_Int hypre_BoomerAMGGetMaxLevels ( void *data, HYPRE_Int *max_levels ); HYPRE_Int hypre_BoomerAMGSetMaxCoarseSize ( void *data, HYPRE_Int max_coarse_size ); HYPRE_Int hypre_BoomerAMGGetMaxCoarseSize ( void *data, HYPRE_Int *max_coarse_size ); HYPRE_Int hypre_BoomerAMGSetMinCoarseSize ( void *data, HYPRE_Int min_coarse_size ); HYPRE_Int hypre_BoomerAMGGetMinCoarseSize ( void *data, HYPRE_Int *min_coarse_size ); HYPRE_Int hypre_BoomerAMGSetSeqThreshold ( void *data, HYPRE_Int seq_threshold ); HYPRE_Int hypre_BoomerAMGGetSeqThreshold ( void *data, HYPRE_Int *seq_threshold ); HYPRE_Int hypre_BoomerAMGSetCoarsenCutFactor( void *data, HYPRE_Int coarsen_cut_factor ); HYPRE_Int hypre_BoomerAMGGetCoarsenCutFactor( void *data, HYPRE_Int *coarsen_cut_factor ); HYPRE_Int hypre_BoomerAMGSetRedundant ( void *data, HYPRE_Int redundant ); HYPRE_Int hypre_BoomerAMGGetRedundant ( void *data, HYPRE_Int *redundant ); HYPRE_Int hypre_BoomerAMGSetStrongThreshold ( void *data, HYPRE_Real strong_threshold ); HYPRE_Int hypre_BoomerAMGGetStrongThreshold ( void *data, HYPRE_Real *strong_threshold ); HYPRE_Int hypre_BoomerAMGSetStrongThresholdR ( void *data, HYPRE_Real strong_threshold ); HYPRE_Int hypre_BoomerAMGGetStrongThresholdR ( void *data, HYPRE_Real *strong_threshold ); HYPRE_Int hypre_BoomerAMGSetFilterThresholdR ( void *data, HYPRE_Real filter_threshold ); HYPRE_Int hypre_BoomerAMGGetFilterThresholdR ( void *data, HYPRE_Real *filter_threshold ); HYPRE_Int hypre_BoomerAMGSetSabs ( void *data, HYPRE_Int Sabs ); HYPRE_Int hypre_BoomerAMGSetMaxRowSum ( void *data, HYPRE_Real max_row_sum ); HYPRE_Int hypre_BoomerAMGGetMaxRowSum ( void *data, HYPRE_Real *max_row_sum ); HYPRE_Int hypre_BoomerAMGSetTruncFactor ( void *data, HYPRE_Real trunc_factor ); HYPRE_Int hypre_BoomerAMGGetTruncFactor ( void *data, HYPRE_Real *trunc_factor ); HYPRE_Int hypre_BoomerAMGSetPMaxElmts ( void *data, HYPRE_Int P_max_elmts ); HYPRE_Int hypre_BoomerAMGGetPMaxElmts ( void *data, HYPRE_Int *P_max_elmts ); HYPRE_Int hypre_BoomerAMGSetJacobiTruncThreshold ( void *data, HYPRE_Real jacobi_trunc_threshold ); HYPRE_Int hypre_BoomerAMGGetJacobiTruncThreshold ( void *data, HYPRE_Real *jacobi_trunc_threshold ); HYPRE_Int hypre_BoomerAMGSetPostInterpType ( void *data, HYPRE_Int post_interp_type ); HYPRE_Int hypre_BoomerAMGGetPostInterpType ( void *data, HYPRE_Int *post_interp_type ); HYPRE_Int hypre_BoomerAMGSetInterpType ( void *data, HYPRE_Int interp_type ); HYPRE_Int hypre_BoomerAMGGetInterpType ( void *data, HYPRE_Int *interp_type ); HYPRE_Int hypre_BoomerAMGSetSepWeight ( void *data, HYPRE_Int sep_weight ); HYPRE_Int hypre_BoomerAMGSetMinIter ( void *data, HYPRE_Int min_iter ); HYPRE_Int hypre_BoomerAMGGetMinIter ( void *data, HYPRE_Int *min_iter ); HYPRE_Int hypre_BoomerAMGSetMaxIter ( void *data, HYPRE_Int max_iter ); HYPRE_Int hypre_BoomerAMGGetMaxIter ( void *data, HYPRE_Int *max_iter ); HYPRE_Int hypre_BoomerAMGSetCoarsenType ( void *data, HYPRE_Int coarsen_type ); HYPRE_Int hypre_BoomerAMGGetCoarsenType ( void *data, HYPRE_Int *coarsen_type ); HYPRE_Int hypre_BoomerAMGSetMeasureType ( void *data, HYPRE_Int measure_type ); HYPRE_Int hypre_BoomerAMGGetMeasureType ( void *data, HYPRE_Int *measure_type ); HYPRE_Int hypre_BoomerAMGSetSetupType ( void *data, HYPRE_Int setup_type ); HYPRE_Int hypre_BoomerAMGGetSetupType ( void *data, HYPRE_Int *setup_type ); HYPRE_Int hypre_BoomerAMGSetFCycle ( void *data, HYPRE_Int fcycle ); HYPRE_Int hypre_BoomerAMGGetFCycle ( void *data, HYPRE_Int *fcycle ); HYPRE_Int hypre_BoomerAMGSetCycleType ( void *data, HYPRE_Int cycle_type ); HYPRE_Int hypre_BoomerAMGGetCycleType ( void *data, HYPRE_Int *cycle_type ); HYPRE_Int hypre_BoomerAMGSetConvergeType ( void *data, HYPRE_Int type ); HYPRE_Int hypre_BoomerAMGGetConvergeType ( void *data, HYPRE_Int *type ); HYPRE_Int hypre_BoomerAMGSetTol ( void *data, HYPRE_Real tol ); HYPRE_Int hypre_BoomerAMGGetTol ( void *data, HYPRE_Real *tol ); HYPRE_Int hypre_BoomerAMGSetNumSweeps ( void *data, HYPRE_Int num_sweeps ); HYPRE_Int hypre_BoomerAMGSetCycleNumSweeps ( void *data, HYPRE_Int num_sweeps, HYPRE_Int k ); HYPRE_Int hypre_BoomerAMGGetCycleNumSweeps ( void *data, HYPRE_Int *num_sweeps, HYPRE_Int k ); HYPRE_Int hypre_BoomerAMGSetNumGridSweeps ( void *data, HYPRE_Int *num_grid_sweeps ); HYPRE_Int hypre_BoomerAMGGetNumGridSweeps ( void *data, HYPRE_Int **num_grid_sweeps ); HYPRE_Int hypre_BoomerAMGSetRelaxType ( void *data, HYPRE_Int relax_type ); HYPRE_Int hypre_BoomerAMGSetCycleRelaxType ( void *data, HYPRE_Int relax_type, HYPRE_Int k ); HYPRE_Int hypre_BoomerAMGGetCycleRelaxType ( void *data, HYPRE_Int *relax_type, HYPRE_Int k ); HYPRE_Int hypre_BoomerAMGSetRelaxOrder ( void *data, HYPRE_Int relax_order ); HYPRE_Int hypre_BoomerAMGGetRelaxOrder ( void *data, HYPRE_Int *relax_order ); HYPRE_Int hypre_BoomerAMGSetGridRelaxType ( void *data, HYPRE_Int *grid_relax_type ); HYPRE_Int hypre_BoomerAMGGetGridRelaxType ( void *data, HYPRE_Int **grid_relax_type ); HYPRE_Int hypre_BoomerAMGSetGridRelaxPoints ( void *data, HYPRE_Int **grid_relax_points ); HYPRE_Int hypre_BoomerAMGGetGridRelaxPoints ( void *data, HYPRE_Int ***grid_relax_points ); HYPRE_Int hypre_BoomerAMGSetRelaxWeight ( void *data, HYPRE_Real *relax_weight ); HYPRE_Int hypre_BoomerAMGGetRelaxWeight ( void *data, HYPRE_Real **relax_weight ); HYPRE_Int hypre_BoomerAMGSetRelaxWt ( void *data, HYPRE_Real relax_weight ); HYPRE_Int hypre_BoomerAMGSetLevelRelaxWt ( void *data, HYPRE_Real relax_weight, HYPRE_Int level ); HYPRE_Int hypre_BoomerAMGGetLevelRelaxWt ( void *data, HYPRE_Real *relax_weight, HYPRE_Int level ); HYPRE_Int hypre_BoomerAMGSetOmega ( void *data, HYPRE_Real *omega ); HYPRE_Int hypre_BoomerAMGGetOmega ( void *data, HYPRE_Real **omega ); HYPRE_Int hypre_BoomerAMGSetOuterWt ( void *data, HYPRE_Real omega ); HYPRE_Int hypre_BoomerAMGSetLevelOuterWt ( void *data, HYPRE_Real omega, HYPRE_Int level ); HYPRE_Int hypre_BoomerAMGGetLevelOuterWt ( void *data, HYPRE_Real *omega, HYPRE_Int level ); HYPRE_Int hypre_BoomerAMGSetSmoothType ( void *data, HYPRE_Int smooth_type ); HYPRE_Int hypre_BoomerAMGGetSmoothType ( void *data, HYPRE_Int *smooth_type ); HYPRE_Int hypre_BoomerAMGSetSmoothNumLevels ( void *data, HYPRE_Int smooth_num_levels ); HYPRE_Int hypre_BoomerAMGGetSmoothNumLevels ( void *data, HYPRE_Int *smooth_num_levels ); HYPRE_Int hypre_BoomerAMGSetSmoothNumSweeps ( void *data, HYPRE_Int smooth_num_sweeps ); HYPRE_Int hypre_BoomerAMGGetSmoothNumSweeps ( void *data, HYPRE_Int *smooth_num_sweeps ); HYPRE_Int hypre_BoomerAMGSetLogging ( void *data, HYPRE_Int logging ); HYPRE_Int hypre_BoomerAMGGetLogging ( void *data, HYPRE_Int *logging ); HYPRE_Int hypre_BoomerAMGSetPrintLevel ( void *data, HYPRE_Int print_level ); HYPRE_Int hypre_BoomerAMGGetPrintLevel ( void *data, HYPRE_Int *print_level ); HYPRE_Int hypre_BoomerAMGSetPrintFileName ( void *data, const char *print_file_name ); HYPRE_Int hypre_BoomerAMGGetPrintFileName ( void *data, char **print_file_name ); HYPRE_Int hypre_BoomerAMGSetNumIterations ( void *data, HYPRE_Int num_iterations ); HYPRE_Int hypre_BoomerAMGSetDebugFlag ( void *data, HYPRE_Int debug_flag ); HYPRE_Int hypre_BoomerAMGGetDebugFlag ( void *data, HYPRE_Int *debug_flag ); HYPRE_Int hypre_BoomerAMGSetGSMG ( void *data, HYPRE_Int par ); HYPRE_Int hypre_BoomerAMGSetNumSamples ( void *data, HYPRE_Int par ); HYPRE_Int hypre_BoomerAMGSetCGCIts ( void *data, HYPRE_Int its ); HYPRE_Int hypre_BoomerAMGSetPlotGrids ( void *data, HYPRE_Int plotgrids ); HYPRE_Int hypre_BoomerAMGSetPlotFileName ( void *data, const char *plot_file_name ); HYPRE_Int hypre_BoomerAMGSetCoordDim ( void *data, HYPRE_Int coorddim ); HYPRE_Int hypre_BoomerAMGSetCoordinates ( void *data, float *coordinates ); HYPRE_Int hypre_BoomerAMGGetGridHierarchy(void *data, HYPRE_Int *cgrid ); HYPRE_Int hypre_BoomerAMGSetNumFunctions ( void *data, HYPRE_Int num_functions ); HYPRE_Int hypre_BoomerAMGGetNumFunctions ( void *data, HYPRE_Int *num_functions ); HYPRE_Int hypre_BoomerAMGSetFilterFunctions ( void *data, HYPRE_Int filter_functions ); HYPRE_Int hypre_BoomerAMGGetFilterFunctions ( void *data, HYPRE_Int *filter_functions ); HYPRE_Int hypre_BoomerAMGSetNodal ( void *data, HYPRE_Int nodal ); HYPRE_Int hypre_BoomerAMGSetNodalLevels ( void *data, HYPRE_Int nodal_levels ); HYPRE_Int hypre_BoomerAMGSetNodalDiag ( void *data, HYPRE_Int nodal ); HYPRE_Int hypre_BoomerAMGSetKeepSameSign ( void *data, HYPRE_Int keep_same_sign ); HYPRE_Int hypre_BoomerAMGSetNumPaths ( void *data, HYPRE_Int num_paths ); HYPRE_Int hypre_BoomerAMGSetAggNumLevels ( void *data, HYPRE_Int agg_num_levels ); HYPRE_Int hypre_BoomerAMGSetAggInterpType ( void *data, HYPRE_Int agg_interp_type ); HYPRE_Int hypre_BoomerAMGSetAggPMaxElmts ( void *data, HYPRE_Int agg_P_max_elmts ); HYPRE_Int hypre_BoomerAMGSetMultAddPMaxElmts ( void *data, HYPRE_Int add_P_max_elmts ); HYPRE_Int hypre_BoomerAMGSetAddRelaxType ( void *data, HYPRE_Int add_rlx_type ); HYPRE_Int hypre_BoomerAMGSetAddRelaxWt ( void *data, HYPRE_Real add_rlx_wt ); HYPRE_Int hypre_BoomerAMGSetAggP12MaxElmts ( void *data, HYPRE_Int agg_P12_max_elmts ); HYPRE_Int hypre_BoomerAMGSetAggTruncFactor ( void *data, HYPRE_Real agg_trunc_factor ); HYPRE_Int hypre_BoomerAMGSetMultAddTruncFactor ( void *data, HYPRE_Real add_trunc_factor ); HYPRE_Int hypre_BoomerAMGSetAggP12TruncFactor ( void *data, HYPRE_Real agg_P12_trunc_factor ); HYPRE_Int hypre_BoomerAMGSetNumCRRelaxSteps ( void *data, HYPRE_Int num_CR_relax_steps ); HYPRE_Int hypre_BoomerAMGSetCRRate ( void *data, HYPRE_Real CR_rate ); HYPRE_Int hypre_BoomerAMGSetCRStrongTh ( void *data, HYPRE_Real CR_strong_th ); HYPRE_Int hypre_BoomerAMGSetADropTol( void *data, HYPRE_Real A_drop_tol ); HYPRE_Int hypre_BoomerAMGSetADropType( void *data, HYPRE_Int A_drop_type ); HYPRE_Int hypre_BoomerAMGSetISType ( void *data, HYPRE_Int IS_type ); HYPRE_Int hypre_BoomerAMGSetCRUseCG ( void *data, HYPRE_Int CR_use_CG ); HYPRE_Int hypre_BoomerAMGSetNumPoints ( void *data, HYPRE_Int num_points ); HYPRE_Int hypre_BoomerAMGSetDofFunc ( void *data, HYPRE_Int *dof_func ); HYPRE_Int hypre_BoomerAMGSetPointDofMap ( void *data, HYPRE_Int *point_dof_map ); HYPRE_Int hypre_BoomerAMGSetDofPoint ( void *data, HYPRE_Int *dof_point ); HYPRE_Int hypre_BoomerAMGGetNumIterations ( void *data, HYPRE_Int *num_iterations ); HYPRE_Int hypre_BoomerAMGGetCumNumIterations ( void *data, HYPRE_Int *cum_num_iterations ); HYPRE_Int hypre_BoomerAMGGetResidual ( void *data, hypre_ParVector **resid ); HYPRE_Int hypre_BoomerAMGGetRelResidualNorm ( void *data, HYPRE_Real *rel_resid_norm ); HYPRE_Int hypre_BoomerAMGSetVariant ( void *data, HYPRE_Int variant ); HYPRE_Int hypre_BoomerAMGGetVariant ( void *data, HYPRE_Int *variant ); HYPRE_Int hypre_BoomerAMGSetOverlap ( void *data, HYPRE_Int overlap ); HYPRE_Int hypre_BoomerAMGGetOverlap ( void *data, HYPRE_Int *overlap ); HYPRE_Int hypre_BoomerAMGSetDomainType ( void *data, HYPRE_Int domain_type ); HYPRE_Int hypre_BoomerAMGGetDomainType ( void *data, HYPRE_Int *domain_type ); HYPRE_Int hypre_BoomerAMGSetSchwarzRlxWeight ( void *data, HYPRE_Real schwarz_rlx_weight ); HYPRE_Int hypre_BoomerAMGGetSchwarzRlxWeight ( void *data, HYPRE_Real *schwarz_rlx_weight ); HYPRE_Int hypre_BoomerAMGSetSchwarzUseNonSymm ( void *data, HYPRE_Int use_nonsymm ); HYPRE_Int hypre_BoomerAMGSetSym ( void *data, HYPRE_Int sym ); HYPRE_Int hypre_BoomerAMGSetLevel ( void *data, HYPRE_Int level ); HYPRE_Int hypre_BoomerAMGSetThreshold ( void *data, HYPRE_Real thresh ); HYPRE_Int hypre_BoomerAMGSetFilter ( void *data, HYPRE_Real filter ); HYPRE_Int hypre_BoomerAMGSetDropTol ( void *data, HYPRE_Real drop_tol ); HYPRE_Int hypre_BoomerAMGSetMaxNzPerRow ( void *data, HYPRE_Int max_nz_per_row ); HYPRE_Int hypre_BoomerAMGSetEuclidFile ( void *data, char *euclidfile ); HYPRE_Int hypre_BoomerAMGSetEuLevel ( void *data, HYPRE_Int eu_level ); HYPRE_Int hypre_BoomerAMGSetEuSparseA ( void *data, HYPRE_Real eu_sparse_A ); HYPRE_Int hypre_BoomerAMGSetEuBJ ( void *data, HYPRE_Int eu_bj ); HYPRE_Int hypre_BoomerAMGSetILUType( void *data, HYPRE_Int ilu_type ); HYPRE_Int hypre_BoomerAMGSetILULevel( void *data, HYPRE_Int ilu_lfil ); HYPRE_Int hypre_BoomerAMGSetILUDroptol( void *data, HYPRE_Real ilu_droptol ); HYPRE_Int hypre_BoomerAMGSetILUTriSolve( void *data, HYPRE_Int ilu_tri_solve ); HYPRE_Int hypre_BoomerAMGSetILULowerJacobiIters( void *data, HYPRE_Int ilu_lower_jacobi_iters ); HYPRE_Int hypre_BoomerAMGSetILUUpperJacobiIters( void *data, HYPRE_Int ilu_upper_jacobi_iters ); HYPRE_Int hypre_BoomerAMGSetILUMaxIter( void *data, HYPRE_Int ilu_max_iter ); HYPRE_Int hypre_BoomerAMGSetILUMaxRowNnz( void *data, HYPRE_Int ilu_max_row_nnz ); HYPRE_Int hypre_BoomerAMGSetILULocalReordering( void *data, HYPRE_Int ilu_reordering_type ); HYPRE_Int hypre_BoomerAMGSetILUIterSetupType( void *data, HYPRE_Int ilu_iter_setup_type ); HYPRE_Int hypre_BoomerAMGSetILUIterSetupOption( void *data, HYPRE_Int ilu_iter_setup_option ); HYPRE_Int hypre_BoomerAMGSetILUIterSetupMaxIter( void *data, HYPRE_Int ilu_iter_setup_max_iter ); HYPRE_Int hypre_BoomerAMGSetILUIterSetupTolerance( void *data, HYPRE_Real ilu_iter_setup_tolerance ); HYPRE_Int hypre_BoomerAMGSetFSAIAlgoType ( void *data, HYPRE_Int fsai_algo_type ); HYPRE_Int hypre_BoomerAMGSetFSAILocalSolveType ( void *data, HYPRE_Int local_solve_type ); HYPRE_Int hypre_BoomerAMGSetFSAIMaxSteps ( void *data, HYPRE_Int fsai_max_steps ); HYPRE_Int hypre_BoomerAMGSetFSAIMaxStepSize ( void *data, HYPRE_Int fsai_max_step_size ); HYPRE_Int hypre_BoomerAMGSetFSAIMaxNnzRow ( void *data, HYPRE_Int fsai_max_nnz_row ); HYPRE_Int hypre_BoomerAMGSetFSAINumLevels ( void *data, HYPRE_Int fsai_num_levels ); HYPRE_Int hypre_BoomerAMGSetFSAIEigMaxIters ( void *data, HYPRE_Int fsai_eig_max_iters ); HYPRE_Int hypre_BoomerAMGSetFSAIThreshold ( void *data, HYPRE_Real fsai_threshold ); HYPRE_Int hypre_BoomerAMGSetFSAIKapTolerance ( void *data, HYPRE_Real fsai_kap_tolerance ); HYPRE_Int hypre_BoomerAMGSetChebyOrder ( void *data, HYPRE_Int order ); HYPRE_Int hypre_BoomerAMGSetChebyFraction ( void *data, HYPRE_Real ratio ); HYPRE_Int hypre_BoomerAMGSetChebyEigEst ( void *data, HYPRE_Int eig_est ); HYPRE_Int hypre_BoomerAMGSetChebyVariant ( void *data, HYPRE_Int variant ); HYPRE_Int hypre_BoomerAMGSetChebyScale ( void *data, HYPRE_Int scale ); HYPRE_Int hypre_BoomerAMGSetInterpVectors ( void *solver, HYPRE_Int num_vectors, hypre_ParVector **interp_vectors ); HYPRE_Int hypre_BoomerAMGSetInterpVecVariant ( void *solver, HYPRE_Int var ); HYPRE_Int hypre_BoomerAMGSetInterpVecQMax ( void *data, HYPRE_Int q_max ); HYPRE_Int hypre_BoomerAMGSetInterpVecAbsQTrunc ( void *data, HYPRE_Real q_trunc ); HYPRE_Int hypre_BoomerAMGSetSmoothInterpVectors ( void *solver, HYPRE_Int smooth_interp_vectors ); HYPRE_Int hypre_BoomerAMGSetInterpRefine ( void *data, HYPRE_Int num_refine ); HYPRE_Int hypre_BoomerAMGSetInterpVecFirstLevel ( void *data, HYPRE_Int level ); HYPRE_Int hypre_BoomerAMGSetAdditive ( void *data, HYPRE_Int additive ); HYPRE_Int hypre_BoomerAMGGetAdditive ( void *data, HYPRE_Int *additive ); HYPRE_Int hypre_BoomerAMGSetMultAdditive ( void *data, HYPRE_Int mult_additive ); HYPRE_Int hypre_BoomerAMGGetMultAdditive ( void *data, HYPRE_Int *mult_additive ); HYPRE_Int hypre_BoomerAMGSetSimple ( void *data, HYPRE_Int simple ); HYPRE_Int hypre_BoomerAMGGetSimple ( void *data, HYPRE_Int *simple ); HYPRE_Int hypre_BoomerAMGSetAddLastLvl ( void *data, HYPRE_Int add_last_lvl ); HYPRE_Int hypre_BoomerAMGSetNonGalerkinTol ( void *data, HYPRE_Real nongalerkin_tol ); HYPRE_Int hypre_BoomerAMGSetLevelNonGalerkinTol ( void *data, HYPRE_Real nongalerkin_tol, HYPRE_Int level ); HYPRE_Int hypre_BoomerAMGSetNonGalerkTol ( void *data, HYPRE_Int nongalerk_num_tol, HYPRE_Real *nongalerk_tol ); HYPRE_Int hypre_BoomerAMGSetRAP2 ( void *data, HYPRE_Int rap2 ); HYPRE_Int hypre_BoomerAMGSetModuleRAP2 ( void *data, HYPRE_Int mod_rap2 ); HYPRE_Int hypre_BoomerAMGSetKeepTranspose ( void *data, HYPRE_Int keepTranspose ); #ifdef HYPRE_USING_DSUPERLU HYPRE_Int hypre_BoomerAMGSetDSLUThreshold ( void *data, HYPRE_Int slu_threshold ); #endif HYPRE_Int hypre_BoomerAMGSetCPoints( void *data, HYPRE_Int cpt_coarse_level, HYPRE_Int num_cpt_coarse, HYPRE_BigInt *cpt_coarse_index ); HYPRE_Int hypre_BoomerAMGSetFPoints( void *data, HYPRE_Int isolated, HYPRE_Int num_points, HYPRE_BigInt *indices ); HYPRE_Int hypre_BoomerAMGSetCumNnzAP ( void *data, HYPRE_Real cum_nnz_AP ); HYPRE_Int hypre_BoomerAMGGetCumNnzAP ( void *data, HYPRE_Real *cum_nnz_AP ); /* par_amg_setup.c */ HYPRE_Int hypre_BoomerAMGSetup ( void *amg_vdata, hypre_ParCSRMatrix *A, hypre_ParVector *f, hypre_ParVector *u ); /* par_amg_solve.c */ HYPRE_Int hypre_BoomerAMGSolve ( void *amg_vdata, hypre_ParCSRMatrix *A, hypre_ParVector *f, hypre_ParVector *u ); /* par_amg_solveT.c */ HYPRE_Int hypre_BoomerAMGSolveT ( void *amg_vdata, hypre_ParCSRMatrix *A, hypre_ParVector *f, hypre_ParVector *u ); HYPRE_Int hypre_BoomerAMGCycleT ( void *amg_vdata, hypre_ParVector **F_array, hypre_ParVector **U_array ); HYPRE_Int hypre_BoomerAMGRelaxT ( hypre_ParCSRMatrix *A, hypre_ParVector *f, HYPRE_Int *cf_marker, HYPRE_Int relax_type, HYPRE_Int relax_points, HYPRE_Real relax_weight, hypre_ParVector *u, hypre_ParVector *Vtemp ); /* par_cgc_coarsen.c */ HYPRE_Int hypre_BoomerAMGCoarsenCGCb ( hypre_ParCSRMatrix *S, hypre_ParCSRMatrix *A, HYPRE_Int measure_type, HYPRE_Int coarsen_type, HYPRE_Int cgc_its, HYPRE_Int debug_flag, hypre_IntArray **CF_marker_ptr ); HYPRE_Int hypre_BoomerAMGCoarsenCGC ( hypre_ParCSRMatrix *S, HYPRE_Int numberofgrids, HYPRE_Int coarsen_type, HYPRE_Int *CF_marker ); HYPRE_Int hypre_AmgCGCPrepare ( hypre_ParCSRMatrix *S, HYPRE_Int nlocal, HYPRE_Int *CF_marker, HYPRE_Int **CF_marker_offd, HYPRE_Int coarsen_type, HYPRE_Int **vrange ); //HYPRE_Int hypre_AmgCGCPrepare ( hypre_ParCSRMatrix *S , HYPRE_Int nlocal , HYPRE_Int *CF_marker , HYPRE_BigInt **CF_marker_offd , HYPRE_Int coarsen_type , HYPRE_BigInt **vrange ); HYPRE_Int hypre_AmgCGCGraphAssemble ( hypre_ParCSRMatrix *S, HYPRE_Int *vertexrange, HYPRE_Int *CF_marker, HYPRE_Int *CF_marker_offd, HYPRE_Int coarsen_type, HYPRE_IJMatrix *ijG ); HYPRE_Int hypre_AmgCGCChoose ( hypre_CSRMatrix *G, HYPRE_Int *vertexrange, HYPRE_Int mpisize, HYPRE_Int **coarse ); HYPRE_Int hypre_AmgCGCBoundaryFix ( hypre_ParCSRMatrix *S, HYPRE_Int *CF_marker, HYPRE_Int *CF_marker_offd ); /* par_cg_relax_wt.c */ HYPRE_Int hypre_BoomerAMGCGRelaxWt ( void *amg_vdata, HYPRE_Int level, HYPRE_Int num_cg_sweeps, HYPRE_Real *rlx_wt_ptr ); HYPRE_Int hypre_Bisection ( HYPRE_Int n, HYPRE_Real *diag, HYPRE_Real *offd, HYPRE_Real y, HYPRE_Real z, HYPRE_Real tol, HYPRE_Int k, HYPRE_Real *ev_ptr ); /* par_cheby.c */ HYPRE_Int hypre_ParCSRRelax_Cheby_Setup ( hypre_ParCSRMatrix *A, HYPRE_Real max_eig, HYPRE_Real min_eig, HYPRE_Real fraction, HYPRE_Int order, HYPRE_Int scale, HYPRE_Int variant, HYPRE_Real **coefs_ptr, HYPRE_Real **ds_ptr ); HYPRE_Int hypre_ParCSRRelax_Cheby_Solve ( hypre_ParCSRMatrix *A, hypre_ParVector *f, HYPRE_Real *ds_data, HYPRE_Real *coefs, HYPRE_Int order, HYPRE_Int scale, HYPRE_Int variant, hypre_ParVector *u, hypre_ParVector *v, hypre_ParVector *r, hypre_ParVector *orig_u_vec, hypre_ParVector *tmp_vec); HYPRE_Int hypre_ParCSRRelax_Cheby_SolveHost ( hypre_ParCSRMatrix *A, hypre_ParVector *f, HYPRE_Real *ds_data, HYPRE_Real *coefs, HYPRE_Int order, HYPRE_Int scale, HYPRE_Int variant, hypre_ParVector *u, hypre_ParVector *v, hypre_ParVector *r, hypre_ParVector *orig_u_vec, hypre_ParVector *tmp_vec); /* par_cheby_device.c */ HYPRE_Int hypre_ParCSRRelax_Cheby_SolveDevice ( hypre_ParCSRMatrix *A, hypre_ParVector *f, HYPRE_Real *ds_data, HYPRE_Real *coefs, HYPRE_Int order, HYPRE_Int scale, HYPRE_Int variant, hypre_ParVector *u, hypre_ParVector *v, hypre_ParVector *r, hypre_ParVector *orig_u_vec, hypre_ParVector *tmp_vec); /* par_coarsen.c */ HYPRE_Int hypre_BoomerAMGCoarsen ( hypre_ParCSRMatrix *S, hypre_ParCSRMatrix *A, HYPRE_Int CF_init, HYPRE_Int debug_flag, hypre_IntArray **CF_marker_ptr ); HYPRE_Int hypre_BoomerAMGCoarsenRuge ( hypre_ParCSRMatrix *S, hypre_ParCSRMatrix *A, HYPRE_Int measure_type, HYPRE_Int coarsen_type, HYPRE_Int cut_factor, HYPRE_Int debug_flag, hypre_IntArray **CF_marker_ptr ); HYPRE_Int hypre_BoomerAMGCoarsenFalgout ( hypre_ParCSRMatrix *S, hypre_ParCSRMatrix *A, HYPRE_Int measure_type, HYPRE_Int cut_factor, HYPRE_Int debug_flag, hypre_IntArray **CF_marker_ptr ); HYPRE_Int hypre_BoomerAMGCoarsenHMIS ( hypre_ParCSRMatrix *S, hypre_ParCSRMatrix *A, HYPRE_Int measure_type, HYPRE_Int cut_factor, HYPRE_Int debug_flag, hypre_IntArray **CF_marker_ptr ); HYPRE_Int hypre_BoomerAMGCoarsenPMIS ( hypre_ParCSRMatrix *S, hypre_ParCSRMatrix *A, HYPRE_Int CF_init, HYPRE_Int debug_flag, hypre_IntArray **CF_marker_ptr ); HYPRE_Int hypre_BoomerAMGCoarsenPMISHost ( hypre_ParCSRMatrix *S, hypre_ParCSRMatrix *A, HYPRE_Int CF_init, HYPRE_Int debug_flag, hypre_IntArray **CF_marker_ptr ); HYPRE_Int hypre_BoomerAMGCoarsenPMISDevice( hypre_ParCSRMatrix *S, hypre_ParCSRMatrix *A, HYPRE_Int CF_init, HYPRE_Int debug_flag, hypre_IntArray **CF_marker_ptr ); /* par_coarsen_device.c */ HYPRE_Int hypre_GetGlobalMeasureDevice( hypre_ParCSRMatrix *S, hypre_ParCSRCommPkg *comm_pkg, HYPRE_Int CF_init, HYPRE_Int aug_rand, HYPRE_Real *measure_diag, HYPRE_Real *measure_offd, HYPRE_Real *real_send_buf ); /* par_coarse_parms.c */ HYPRE_Int hypre_BoomerAMGCoarseParms ( MPI_Comm comm, HYPRE_Int local_num_variables, HYPRE_Int num_functions, hypre_IntArray *dof_func, hypre_IntArray *CF_marker, hypre_IntArray **coarse_dof_func_ptr, HYPRE_BigInt *coarse_pnts_global ); HYPRE_Int hypre_BoomerAMGCoarseParmsHost ( MPI_Comm comm, HYPRE_Int local_num_variables, HYPRE_Int num_functions, hypre_IntArray *dof_func, hypre_IntArray *CF_marker, hypre_IntArray **coarse_dof_func_ptr, HYPRE_BigInt *coarse_pnts_global ); HYPRE_Int hypre_BoomerAMGCoarseParmsDevice ( MPI_Comm comm, HYPRE_Int local_num_variables, HYPRE_Int num_functions, hypre_IntArray *dof_func, hypre_IntArray *CF_marker, hypre_IntArray **coarse_dof_func_ptr, HYPRE_BigInt *coarse_pnts_global ); HYPRE_Int hypre_BoomerAMGInitDofFuncDevice( HYPRE_Int *dof_func, HYPRE_Int local_size, HYPRE_Int offset, HYPRE_Int num_functions ); /* par_coordinates.c */ float *hypre_GenerateCoordinates ( MPI_Comm comm, HYPRE_BigInt nx, HYPRE_BigInt ny, HYPRE_BigInt nz, HYPRE_Int P, HYPRE_Int Q, HYPRE_Int R, HYPRE_Int p, HYPRE_Int q, HYPRE_Int r, HYPRE_Int coorddim ); /* par_cr.c */ HYPRE_Int hypre_BoomerAMGCoarsenCR1 ( hypre_ParCSRMatrix *A, hypre_IntArray **CF_marker_ptr, HYPRE_BigInt *coarse_size_ptr, HYPRE_Int num_CR_relax_steps, HYPRE_Int IS_type, HYPRE_Int CRaddCpoints ); HYPRE_Int hypre_cr ( HYPRE_Int *A_i, HYPRE_Int *A_j, HYPRE_Real *A_data, HYPRE_Int n, HYPRE_Int *cf, HYPRE_Int rlx, HYPRE_Real omega, HYPRE_Real tg, HYPRE_Int mu ); HYPRE_Int hypre_GraphAdd ( Link *list, HYPRE_Int *head, HYPRE_Int *tail, HYPRE_Int index, HYPRE_Int istack ); HYPRE_Int hypre_GraphRemove ( Link *list, HYPRE_Int *head, HYPRE_Int *tail, HYPRE_Int index ); HYPRE_Int hypre_IndepSetGreedy ( HYPRE_Int *A_i, HYPRE_Int *A_j, HYPRE_Int n, HYPRE_Int *cf ); HYPRE_Int hypre_IndepSetGreedyS ( HYPRE_Int *A_i, HYPRE_Int *A_j, HYPRE_Int n, HYPRE_Int *cf ); HYPRE_Int hypre_fptjaccr ( HYPRE_Int *cf, HYPRE_Int *A_i, HYPRE_Int *A_j, HYPRE_Real *A_data, HYPRE_Int n, HYPRE_Real *e0, HYPRE_Real omega, HYPRE_Real *e1 ); HYPRE_Int hypre_fptgscr ( HYPRE_Int *cf, HYPRE_Int *A_i, HYPRE_Int *A_j, HYPRE_Real *A_data, HYPRE_Int n, HYPRE_Real *e0, HYPRE_Real *e1 ); HYPRE_Int hypre_formu ( HYPRE_Int *cf, HYPRE_Int n, HYPRE_Real *e1, HYPRE_Int *A_i, HYPRE_Real rho ); HYPRE_Int hypre_BoomerAMGIndepRS ( hypre_ParCSRMatrix *S, HYPRE_Int measure_type, HYPRE_Int debug_flag, HYPRE_Int *CF_marker ); HYPRE_Int hypre_BoomerAMGIndepRSa ( hypre_ParCSRMatrix *S, HYPRE_Int measure_type, HYPRE_Int debug_flag, HYPRE_Int *CF_marker ); HYPRE_Int hypre_BoomerAMGIndepHMIS ( hypre_ParCSRMatrix *S, HYPRE_Int measure_type, HYPRE_Int debug_flag, HYPRE_Int *CF_marker ); HYPRE_Int hypre_BoomerAMGIndepHMISa ( hypre_ParCSRMatrix *S, HYPRE_Int measure_type, HYPRE_Int debug_flag, HYPRE_Int *CF_marker ); HYPRE_Int hypre_BoomerAMGIndepPMIS ( hypre_ParCSRMatrix *S, HYPRE_Int CF_init, HYPRE_Int debug_flag, HYPRE_Int *CF_marker ); HYPRE_Int hypre_BoomerAMGIndepPMISa ( hypre_ParCSRMatrix *S, HYPRE_Int CF_init, HYPRE_Int debug_flag, HYPRE_Int *CF_marker ); HYPRE_Int hypre_BoomerAMGCoarsenCR ( hypre_ParCSRMatrix *A, hypre_IntArray **CF_marker_ptr, HYPRE_BigInt *coarse_size_ptr, HYPRE_Int num_CR_relax_steps, HYPRE_Int IS_type, HYPRE_Int num_functions, HYPRE_Int rlx_type, HYPRE_Real relax_weight, HYPRE_Real omega, HYPRE_Real theta, HYPRE_Solver smoother, hypre_ParCSRMatrix *AN, HYPRE_Int useCG, hypre_ParCSRMatrix *S ); /* par_cycle.c */ HYPRE_Int hypre_BoomerAMGCycle ( void *amg_vdata, hypre_ParVector **F_array, hypre_ParVector **U_array ); /* par_difconv.c */ HYPRE_ParCSRMatrix GenerateDifConv ( MPI_Comm comm, HYPRE_BigInt nx, HYPRE_BigInt ny, HYPRE_BigInt nz, HYPRE_Int P, HYPRE_Int Q, HYPRE_Int R, HYPRE_Int p, HYPRE_Int q, HYPRE_Int r, HYPRE_Real *value ); /* par_gsmg.c */ HYPRE_Int hypre_ParCSRMatrixFillSmooth ( HYPRE_Int nsamples, HYPRE_Real *samples, hypre_ParCSRMatrix *S, hypre_ParCSRMatrix *A, HYPRE_Int num_functions, HYPRE_Int *dof_func ); HYPRE_Real hypre_ParCSRMatrixChooseThresh ( hypre_ParCSRMatrix *S ); HYPRE_Int hypre_ParCSRMatrixThreshold ( hypre_ParCSRMatrix *A, HYPRE_Real thresh ); HYPRE_Int hypre_BoomerAMGCreateSmoothVecs ( void *data, hypre_ParCSRMatrix *A, HYPRE_Int num_sweeps, HYPRE_Int level, HYPRE_Real **SmoothVecs_p ); HYPRE_Int hypre_BoomerAMGCreateSmoothDirs ( void *data, hypre_ParCSRMatrix *A, HYPRE_Real *SmoothVecs, HYPRE_Real thresh, HYPRE_Int num_functions, HYPRE_Int *dof_func, hypre_ParCSRMatrix **S_ptr ); HYPRE_Int hypre_BoomerAMGNormalizeVecs ( HYPRE_Int n, HYPRE_Int num, HYPRE_Real *V ); HYPRE_Int hypre_BoomerAMGFitVectors ( HYPRE_Int ip, HYPRE_Int n, HYPRE_Int num, const HYPRE_Real *V, HYPRE_Int nc, const HYPRE_Int *ind, HYPRE_Real *val ); HYPRE_Int hypre_BoomerAMGBuildInterpLS ( hypre_ParCSRMatrix *A, HYPRE_Int *CF_marker, hypre_ParCSRMatrix *S, HYPRE_BigInt *num_cpts_global, HYPRE_Int num_functions, HYPRE_Int *dof_func, HYPRE_Int debug_flag, HYPRE_Real trunc_factor, HYPRE_Int num_smooth, HYPRE_Real *SmoothVecs, hypre_ParCSRMatrix **P_ptr ); HYPRE_Int hypre_BoomerAMGBuildInterpGSMG ( hypre_ParCSRMatrix *A, HYPRE_Int *CF_marker, hypre_ParCSRMatrix *S, HYPRE_BigInt *num_cpts_global, HYPRE_Int num_functions, HYPRE_Int *dof_func, HYPRE_Int debug_flag, HYPRE_Real trunc_factor, hypre_ParCSRMatrix **P_ptr ); /* par_indepset.c */ HYPRE_Int hypre_BoomerAMGIndepSetInit ( hypre_ParCSRMatrix *S, HYPRE_Real *measure_array, HYPRE_Int seq_rand ); HYPRE_Int hypre_BoomerAMGIndepSet ( hypre_ParCSRMatrix *S, HYPRE_Real *measure_array, HYPRE_Int *graph_array, HYPRE_Int graph_array_size, HYPRE_Int *graph_array_offd, HYPRE_Int graph_array_offd_size, HYPRE_Int *IS_marker, HYPRE_Int *IS_marker_offd ); HYPRE_Int hypre_BoomerAMGIndepSetInitDevice( hypre_ParCSRMatrix *S, HYPRE_Real *measure_array, HYPRE_Int aug_rand); HYPRE_Int hypre_BoomerAMGIndepSetDevice( hypre_ParCSRMatrix *S, HYPRE_Real *measure_diag, HYPRE_Real *measure_offd, HYPRE_Int graph_diag_size, HYPRE_Int *graph_diag, HYPRE_Int *IS_marker_diag, HYPRE_Int *IS_marker_offd, hypre_ParCSRCommPkg *comm_pkg, HYPRE_Int *int_send_buf ); /* par_interp.c */ HYPRE_Int hypre_BoomerAMGBuildInterp ( hypre_ParCSRMatrix *A, HYPRE_Int *CF_marker, hypre_ParCSRMatrix *S, HYPRE_BigInt *num_cpts_global, HYPRE_Int num_functions, HYPRE_Int *dof_func, HYPRE_Int debug_flag, HYPRE_Real trunc_factor, HYPRE_Int max_elmts, hypre_ParCSRMatrix **P_ptr ); HYPRE_Int hypre_BoomerAMGBuildInterpHE ( hypre_ParCSRMatrix *A, HYPRE_Int *CF_marker, hypre_ParCSRMatrix *S, HYPRE_BigInt *num_cpts_global, HYPRE_Int num_functions, HYPRE_Int *dof_func, HYPRE_Int debug_flag, HYPRE_Real trunc_factor, HYPRE_Int max_elmts, hypre_ParCSRMatrix **P_ptr ); HYPRE_Int hypre_BoomerAMGBuildDirInterp ( hypre_ParCSRMatrix *A, HYPRE_Int *CF_marker, hypre_ParCSRMatrix *S, HYPRE_BigInt *num_cpts_global, HYPRE_Int num_functions, HYPRE_Int *dof_func, HYPRE_Int debug_flag, HYPRE_Real trunc_factor, HYPRE_Int max_elmts, HYPRE_Int interp_type, hypre_ParCSRMatrix **P_ptr ); HYPRE_Int hypre_BoomerAMGBuildDirInterpDevice( hypre_ParCSRMatrix *A, HYPRE_Int *CF_marker, hypre_ParCSRMatrix *S, HYPRE_BigInt *num_cpts_global, HYPRE_Int num_functions, HYPRE_Int *dof_func, HYPRE_Int debug_flag, HYPRE_Real trunc_factor, HYPRE_Int max_elmts, HYPRE_Int interp_type, hypre_ParCSRMatrix **P_ptr ); HYPRE_Int hypre_BoomerAMGInterpTruncation ( hypre_ParCSRMatrix *P, HYPRE_Real trunc_factor, HYPRE_Int max_elmts ); HYPRE_Int hypre_BoomerAMGInterpTruncationDevice( hypre_ParCSRMatrix *P, HYPRE_Real trunc_factor, HYPRE_Int max_elmts ); HYPRE_Int hypre_BoomerAMGBuildInterpModUnk ( hypre_ParCSRMatrix *A, HYPRE_Int *CF_marker, hypre_ParCSRMatrix *S, HYPRE_BigInt *num_cpts_global, HYPRE_Int num_functions, HYPRE_Int *dof_func, HYPRE_Int debug_flag, HYPRE_Real trunc_factor, HYPRE_Int max_elmts, hypre_ParCSRMatrix **P_ptr ); HYPRE_Int hypre_BoomerAMGTruncandBuild ( hypre_ParCSRMatrix *P, HYPRE_Real trunc_factor, HYPRE_Int max_elmts ); hypre_ParCSRMatrix *hypre_CreateC ( hypre_ParCSRMatrix *A, HYPRE_Real w ); HYPRE_Int hypre_BoomerAMGBuildInterpOnePntHost( hypre_ParCSRMatrix *A, HYPRE_Int *CF_marker, hypre_ParCSRMatrix *S, HYPRE_BigInt *num_cpts_global, HYPRE_Int num_functions, HYPRE_Int *dof_func, HYPRE_Int debug_flag, hypre_ParCSRMatrix **P_ptr); HYPRE_Int hypre_BoomerAMGBuildInterpOnePntDevice( hypre_ParCSRMatrix *A, HYPRE_Int *CF_marker, hypre_ParCSRMatrix *S, HYPRE_BigInt *num_cpts_global, HYPRE_Int num_functions, HYPRE_Int *dof_func, HYPRE_Int debug_flag, hypre_ParCSRMatrix **P_ptr); HYPRE_Int hypre_BoomerAMGBuildInterpOnePnt( hypre_ParCSRMatrix *A, HYPRE_Int *CF_marker, hypre_ParCSRMatrix *S, HYPRE_BigInt *num_cpts_global, HYPRE_Int num_functions, HYPRE_Int *dof_func, HYPRE_Int debug_flag, hypre_ParCSRMatrix **P_ptr); /* par_jacobi_interp.c */ void hypre_BoomerAMGJacobiInterp ( hypre_ParCSRMatrix *A, hypre_ParCSRMatrix **P, hypre_ParCSRMatrix *S, HYPRE_Int num_functions, HYPRE_Int *dof_func, HYPRE_Int *CF_marker, HYPRE_Int level, HYPRE_Real truncation_threshold, HYPRE_Real truncation_threshold_minus ); void hypre_BoomerAMGJacobiInterp_1 ( hypre_ParCSRMatrix *A, hypre_ParCSRMatrix **P, hypre_ParCSRMatrix *S, HYPRE_Int *CF_marker, HYPRE_Int level, HYPRE_Real truncation_threshold, HYPRE_Real truncation_threshold_minus, HYPRE_Int *dof_func, HYPRE_Int *dof_func_offd, HYPRE_Real weight_AF ); void hypre_BoomerAMGTruncateInterp ( hypre_ParCSRMatrix *P, HYPRE_Real eps, HYPRE_Real dlt, HYPRE_Int *CF_marker ); HYPRE_Int hypre_ParCSRMatrix_dof_func_offd ( hypre_ParCSRMatrix *A, HYPRE_Int num_functions, HYPRE_Int *dof_func, HYPRE_Int **dof_func_offd ); /* par_laplace_27pt.c */ HYPRE_ParCSRMatrix GenerateLaplacian27pt ( MPI_Comm comm, HYPRE_BigInt nx, HYPRE_BigInt ny, HYPRE_BigInt nz, HYPRE_Int P, HYPRE_Int Q, HYPRE_Int R, HYPRE_Int p, HYPRE_Int q, HYPRE_Int r, HYPRE_Real *value ); HYPRE_Int hypre_map3 ( HYPRE_BigInt ix, HYPRE_BigInt iy, HYPRE_BigInt iz, HYPRE_Int p, HYPRE_Int q, HYPRE_Int r, HYPRE_Int P, HYPRE_Int Q, HYPRE_Int R, HYPRE_BigInt *nx_part, HYPRE_BigInt *ny_part, HYPRE_BigInt *nz_part ); /* par_laplace_9pt.c */ HYPRE_ParCSRMatrix GenerateLaplacian9pt ( MPI_Comm comm, HYPRE_BigInt nx, HYPRE_BigInt ny, HYPRE_Int P, HYPRE_Int Q, HYPRE_Int p, HYPRE_Int q, HYPRE_Real *value ); HYPRE_BigInt hypre_map2 ( HYPRE_BigInt ix, HYPRE_BigInt iy, HYPRE_Int p, HYPRE_Int q, HYPRE_BigInt nx, HYPRE_BigInt *nx_part, HYPRE_BigInt *ny_part ); /* par_laplace.c */ HYPRE_ParCSRMatrix GenerateLaplacian ( MPI_Comm comm, HYPRE_BigInt ix, HYPRE_BigInt ny, HYPRE_BigInt nz, HYPRE_Int P, HYPRE_Int Q, HYPRE_Int R, HYPRE_Int p, HYPRE_Int q, HYPRE_Int r, HYPRE_Real *value ); HYPRE_BigInt hypre_map ( HYPRE_BigInt ix, HYPRE_BigInt iy, HYPRE_BigInt iz, HYPRE_Int p, HYPRE_Int q, HYPRE_Int r, HYPRE_BigInt nx, HYPRE_BigInt ny, HYPRE_BigInt *nx_part, HYPRE_BigInt *ny_part, HYPRE_BigInt *nz_part ); HYPRE_ParCSRMatrix GenerateSysLaplacian ( MPI_Comm comm, HYPRE_BigInt nx, HYPRE_BigInt ny, HYPRE_BigInt nz, HYPRE_Int P, HYPRE_Int Q, HYPRE_Int R, HYPRE_Int p, HYPRE_Int q, HYPRE_Int r, HYPRE_Int num_fun, HYPRE_Real *mtrx, HYPRE_Real *value ); HYPRE_ParCSRMatrix GenerateSysLaplacianVCoef ( MPI_Comm comm, HYPRE_BigInt nx, HYPRE_BigInt ny, HYPRE_BigInt nz, HYPRE_Int P, HYPRE_Int Q, HYPRE_Int R, HYPRE_Int p, HYPRE_Int q, HYPRE_Int r, HYPRE_Int num_fun, HYPRE_Real *mtrx, HYPRE_Real *value ); /* par_lr_interp.c */ HYPRE_Int hypreDevice_extendWtoP ( HYPRE_Int P_nr_of_rows, HYPRE_Int W_nr_of_rows, HYPRE_Int W_nr_of_cols, HYPRE_Int *CF_marker, HYPRE_Int W_diag_nnz, HYPRE_Int *W_diag_i, HYPRE_Int *W_diag_j, HYPRE_Complex *W_diag_data, HYPRE_Int *P_diag_i, HYPRE_Int *P_diag_j, HYPRE_Complex *P_diag_data, HYPRE_Int *W_offd_i, HYPRE_Int *P_offd_i ); HYPRE_Int hypre_BoomerAMGBuildStdInterp ( hypre_ParCSRMatrix *A, HYPRE_Int *CF_marker, hypre_ParCSRMatrix *S, HYPRE_BigInt *num_cpts_global, HYPRE_Int num_functions, HYPRE_Int *dof_func, HYPRE_Int debug_flag, HYPRE_Real trunc_factor, HYPRE_Int max_elmts, HYPRE_Int sep_weight, hypre_ParCSRMatrix **P_ptr ); HYPRE_Int hypre_BoomerAMGBuildExtPIInterp ( hypre_ParCSRMatrix *A, HYPRE_Int *CF_marker, hypre_ParCSRMatrix *S, HYPRE_BigInt *num_cpts_global, HYPRE_Int num_functions, HYPRE_Int *dof_func, HYPRE_Int debug_flag, HYPRE_Real trunc_factor, HYPRE_Int max_elmts, hypre_ParCSRMatrix **P_ptr ); HYPRE_Int hypre_BoomerAMGBuildExtPIInterpHost ( hypre_ParCSRMatrix *A, HYPRE_Int *CF_marker, hypre_ParCSRMatrix *S, HYPRE_BigInt *num_cpts_global, HYPRE_Int num_functions, HYPRE_Int *dof_func, HYPRE_Int debug_flag, HYPRE_Real trunc_factor, HYPRE_Int max_elmts, hypre_ParCSRMatrix **P_ptr ); HYPRE_Int hypre_BoomerAMGBuildExtPICCInterp ( hypre_ParCSRMatrix *A, HYPRE_Int *CF_marker, hypre_ParCSRMatrix *S, HYPRE_BigInt *num_cpts_global, HYPRE_Int num_functions, HYPRE_Int *dof_func, HYPRE_Int debug_flag, HYPRE_Real trunc_factor, HYPRE_Int max_elmts, hypre_ParCSRMatrix **P_ptr ); HYPRE_Int hypre_BoomerAMGBuildFFInterp ( hypre_ParCSRMatrix *A, HYPRE_Int *CF_marker, hypre_ParCSRMatrix *S, HYPRE_BigInt *num_cpts_global, HYPRE_Int num_functions, HYPRE_Int *dof_func, HYPRE_Int debug_flag, HYPRE_Real trunc_factor, HYPRE_Int max_elmts, hypre_ParCSRMatrix **P_ptr ); HYPRE_Int hypre_BoomerAMGBuildFF1Interp ( hypre_ParCSRMatrix *A, HYPRE_Int *CF_marker, hypre_ParCSRMatrix *S, HYPRE_BigInt *num_cpts_global, HYPRE_Int num_functions, HYPRE_Int *dof_func, HYPRE_Int debug_flag, HYPRE_Real trunc_factor, HYPRE_Int max_elmts, hypre_ParCSRMatrix **P_ptr ); HYPRE_Int hypre_BoomerAMGBuildExtInterp ( hypre_ParCSRMatrix *A, HYPRE_Int *CF_marker, hypre_ParCSRMatrix *S, HYPRE_BigInt *num_cpts_global, HYPRE_Int num_functions, HYPRE_Int *dof_func, HYPRE_Int debug_flag, HYPRE_Real trunc_factor, HYPRE_Int max_elmts, hypre_ParCSRMatrix **P_ptr ); /* par_lr_interp_device.c */ HYPRE_Int hypre_BoomerAMGBuildExtInterpDevice(hypre_ParCSRMatrix *A, HYPRE_Int *CF_marker, hypre_ParCSRMatrix *S, HYPRE_BigInt *num_cpts_global, HYPRE_Int num_functions, HYPRE_Int *dof_func, HYPRE_Int debug_flag, HYPRE_Real trunc_factor, HYPRE_Int max_elmts, hypre_ParCSRMatrix **P_ptr); HYPRE_Int hypre_BoomerAMGBuildExtPIInterpDevice( hypre_ParCSRMatrix *A, HYPRE_Int *CF_marker, hypre_ParCSRMatrix *S, HYPRE_BigInt *num_cpts_global, HYPRE_Int num_functions, HYPRE_Int *dof_func, HYPRE_Int debug_flag, HYPRE_Real trunc_factor, HYPRE_Int max_elmts, hypre_ParCSRMatrix **P_ptr); HYPRE_Int hypre_BoomerAMGBuildExtPEInterpDevice(hypre_ParCSRMatrix *A, HYPRE_Int *CF_marker, hypre_ParCSRMatrix *S, HYPRE_BigInt *num_cpts_global, HYPRE_Int num_functions, HYPRE_Int *dof_func, HYPRE_Int debug_flag, HYPRE_Real trunc_factor, HYPRE_Int max_elmts, hypre_ParCSRMatrix **P_ptr); /* par_mod_lr_interp.c */ HYPRE_Int hypre_BoomerAMGBuildModExtInterp(hypre_ParCSRMatrix *A, HYPRE_Int *CF_marker, hypre_ParCSRMatrix *S, HYPRE_BigInt *num_cpts_global, HYPRE_Int num_functions, HYPRE_Int *dof_func, HYPRE_Int debug_flag, HYPRE_Real trunc_factor, HYPRE_Int max_elmts, hypre_ParCSRMatrix **P_ptr); HYPRE_Int hypre_BoomerAMGBuildModExtPIInterp(hypre_ParCSRMatrix *A, HYPRE_Int *CF_marker, hypre_ParCSRMatrix *S, HYPRE_BigInt *num_cpts_global, HYPRE_Int num_functions, HYPRE_Int *dof_func, HYPRE_Int debug_flag, HYPRE_Real trunc_factor, HYPRE_Int max_elmts, hypre_ParCSRMatrix **P_ptr); HYPRE_Int hypre_BoomerAMGBuildModExtPEInterp(hypre_ParCSRMatrix *A, HYPRE_Int *CF_marker, hypre_ParCSRMatrix *S, HYPRE_BigInt *num_cpts_global, HYPRE_Int num_functions, HYPRE_Int *dof_func, HYPRE_Int debug_flag, HYPRE_Real trunc_factor, HYPRE_Int max_elmts, hypre_ParCSRMatrix **P_ptr); /* par_2s_interp.c */ HYPRE_Int hypre_BoomerAMGBuildModPartialExtInterpHost ( hypre_ParCSRMatrix *A, HYPRE_Int *CF_marker, hypre_ParCSRMatrix *S, HYPRE_BigInt *num_cpts_global, HYPRE_BigInt *num_old_cpts_global, HYPRE_Int num_functions, HYPRE_Int *dof_func, HYPRE_Int debug_flag, HYPRE_Real trunc_factor, HYPRE_Int max_elmts, hypre_ParCSRMatrix **P_ptr ); HYPRE_Int hypre_BoomerAMGBuildModPartialExtInterpDevice ( hypre_ParCSRMatrix *A, HYPRE_Int *CF_marker, hypre_ParCSRMatrix *S, HYPRE_BigInt *num_cpts_global, HYPRE_BigInt *num_old_cpts_global, HYPRE_Int debug_flag, HYPRE_Real trunc_factor, HYPRE_Int max_elmts, hypre_ParCSRMatrix **P_ptr ); HYPRE_Int hypre_BoomerAMGBuildModPartialExtInterp ( hypre_ParCSRMatrix *A, HYPRE_Int *CF_marker, hypre_ParCSRMatrix *S, HYPRE_BigInt *num_cpts_global, HYPRE_BigInt *num_old_cpts_global, HYPRE_Int num_functions, HYPRE_Int *dof_func, HYPRE_Int debug_flag, HYPRE_Real trunc_factor, HYPRE_Int max_elmts, hypre_ParCSRMatrix **P_ptr ); HYPRE_Int hypre_BoomerAMGBuildModPartialExtPEInterpHost ( hypre_ParCSRMatrix *A, HYPRE_Int *CF_marker, hypre_ParCSRMatrix *S, HYPRE_BigInt *num_cpts_global, HYPRE_BigInt *num_old_cpts_global, HYPRE_Int num_functions, HYPRE_Int *dof_func, HYPRE_Int debug_flag, HYPRE_Real trunc_factor, HYPRE_Int max_elmts, hypre_ParCSRMatrix **P_ptr ); HYPRE_Int hypre_BoomerAMGBuildModPartialExtPEInterpDevice ( hypre_ParCSRMatrix *A, HYPRE_Int *CF_marker, hypre_ParCSRMatrix *S, HYPRE_BigInt *num_cpts_global, HYPRE_BigInt *num_old_cpts_global, HYPRE_Int debug_flag, HYPRE_Real trunc_factor, HYPRE_Int max_elmts, hypre_ParCSRMatrix **P_ptr ); HYPRE_Int hypre_BoomerAMGBuildModPartialExtPEInterp ( hypre_ParCSRMatrix *A, HYPRE_Int *CF_marker, hypre_ParCSRMatrix *S, HYPRE_BigInt *num_cpts_global, HYPRE_BigInt *num_old_cpts_global, HYPRE_Int num_functions, HYPRE_Int *dof_func, HYPRE_Int debug_flag, HYPRE_Real trunc_factor, HYPRE_Int max_elmts, hypre_ParCSRMatrix **P_ptr ); /* par_mod_multi_interp.c */ HYPRE_Int hypre_BoomerAMGBuildModMultipass ( hypre_ParCSRMatrix *A, HYPRE_Int *CF_marker, hypre_ParCSRMatrix *S, HYPRE_BigInt *num_cpts_global, HYPRE_Real trunc_factor, HYPRE_Int P_max_elmts, HYPRE_Int interp_type, HYPRE_Int num_functions, HYPRE_Int *dof_func, hypre_ParCSRMatrix **P_ptr ); HYPRE_Int hypre_BoomerAMGBuildModMultipassHost ( hypre_ParCSRMatrix *A, HYPRE_Int *CF_marker, hypre_ParCSRMatrix *S, HYPRE_BigInt *num_cpts_global, HYPRE_Real trunc_factor, HYPRE_Int P_max_elmts, HYPRE_Int interp_type, HYPRE_Int num_functions, HYPRE_Int *dof_func, hypre_ParCSRMatrix **P_ptr ); HYPRE_Int hypre_GenerateMultipassPi ( hypre_ParCSRMatrix *A, hypre_ParCSRMatrix *S, HYPRE_BigInt *c_pts_starts, HYPRE_Int *pass_order, HYPRE_Int *pass_marker, HYPRE_Int *pass_marker_offd, HYPRE_Int num_points, HYPRE_Int color, HYPRE_Real *row_sums, hypre_ParCSRMatrix **P_ptr ); HYPRE_Int hypre_GenerateMultiPi ( hypre_ParCSRMatrix *A, hypre_ParCSRMatrix *S, hypre_ParCSRMatrix *P, HYPRE_BigInt *c_pts_starts, HYPRE_Int *pass_order, HYPRE_Int *pass_marker, HYPRE_Int *pass_marker_offd, HYPRE_Int num_points, HYPRE_Int color, HYPRE_Int num_functions, HYPRE_Int *dof_func, HYPRE_Int *dof_func_offd, hypre_ParCSRMatrix **Pi_ptr ); HYPRE_Int hypre_BoomerAMGBuildModMultipassDevice ( hypre_ParCSRMatrix *A, HYPRE_Int *CF_marker, hypre_ParCSRMatrix *S, HYPRE_BigInt *num_cpts_global, HYPRE_Real trunc_factor, HYPRE_Int P_max_elmts, HYPRE_Int interp_type, HYPRE_Int num_functions, HYPRE_Int *dof_func, hypre_ParCSRMatrix **P_ptr ); HYPRE_Int hypre_GenerateMultipassPiDevice ( hypre_ParCSRMatrix *A, hypre_ParCSRMatrix *S, HYPRE_BigInt *c_pts_starts, HYPRE_Int *pass_order, HYPRE_Int *pass_marker, HYPRE_Int *pass_marker_offd, HYPRE_Int num_points, HYPRE_Int color, HYPRE_Real *row_sums, hypre_ParCSRMatrix **P_ptr ); HYPRE_Int hypre_GenerateMultiPiDevice ( hypre_ParCSRMatrix *A, hypre_ParCSRMatrix *S, hypre_ParCSRMatrix *P, HYPRE_BigInt *c_pts_starts, HYPRE_Int *pass_order, HYPRE_Int *pass_marker, HYPRE_Int *pass_marker_offd, HYPRE_Int num_points, HYPRE_Int color, HYPRE_Int num_functions, HYPRE_Int *dof_func, HYPRE_Int *dof_func_offd, hypre_ParCSRMatrix **Pi_ptr ); /* par_multi_interp.c */ HYPRE_Int hypre_BoomerAMGBuildMultipass ( hypre_ParCSRMatrix *A, HYPRE_Int *CF_marker, hypre_ParCSRMatrix *S, HYPRE_BigInt *num_cpts_global, HYPRE_Int num_functions, HYPRE_Int *dof_func, HYPRE_Int debug_flag, HYPRE_Real trunc_factor, HYPRE_Int P_max_elmts, HYPRE_Int weight_option, hypre_ParCSRMatrix **P_ptr ); HYPRE_Int hypre_BoomerAMGBuildMultipassHost ( hypre_ParCSRMatrix *A, HYPRE_Int *CF_marker, hypre_ParCSRMatrix *S, HYPRE_BigInt *num_cpts_global, HYPRE_Int num_functions, HYPRE_Int *dof_func, HYPRE_Int debug_flag, HYPRE_Real trunc_factor, HYPRE_Int P_max_elmts, HYPRE_Int weight_option, hypre_ParCSRMatrix **P_ptr ); /* par_nodal_systems.c */ HYPRE_Int hypre_BoomerAMGCreateNodalA ( hypre_ParCSRMatrix *A, HYPRE_Int num_functions, HYPRE_Int *dof_func, HYPRE_Int option, HYPRE_Int diag_option, hypre_ParCSRMatrix **AN_ptr ); HYPRE_Int hypre_BoomerAMGCreateScalarCFS ( hypre_ParCSRMatrix *SN, hypre_ParCSRMatrix *A, HYPRE_Int *CFN_marker, HYPRE_Int num_functions, HYPRE_Int nodal, HYPRE_Int keep_same_sign, hypre_IntArray **dof_func_ptr, hypre_IntArray **CF_marker_ptr, hypre_ParCSRMatrix **S_ptr ); HYPRE_Int hypre_BoomerAMGCreateScalarCF ( HYPRE_Int *CFN_marker, HYPRE_Int num_functions, HYPRE_Int num_nodes, hypre_IntArray **dof_func_ptr, hypre_IntArray **CF_marker_ptr ); /* par_nongalerkin.c */ HYPRE_Int hypre_GrabSubArray ( HYPRE_Int *indices, HYPRE_Int start, HYPRE_Int end, HYPRE_BigInt *array, HYPRE_BigInt *output ); HYPRE_Int hypre_IntersectTwoArrays ( HYPRE_Int *x, HYPRE_Real *x_data, HYPRE_Int x_length, HYPRE_Int *y, HYPRE_Int y_length, HYPRE_Int *z, HYPRE_Real *output_x_data, HYPRE_Int *intersect_length ); HYPRE_Int hypre_IntersectTwoBigArrays ( HYPRE_BigInt *x, HYPRE_Real *x_data, HYPRE_Int x_length, HYPRE_BigInt *y, HYPRE_Int y_length, HYPRE_BigInt *z, HYPRE_Real *output_x_data, HYPRE_Int *intersect_length ); HYPRE_Int hypre_SortedCopyParCSRData ( hypre_ParCSRMatrix *A, hypre_ParCSRMatrix *B ); HYPRE_Int hypre_BoomerAMG_MyCreateS ( hypre_ParCSRMatrix *A, HYPRE_Real strength_threshold, HYPRE_Real max_row_sum, HYPRE_Int num_functions, HYPRE_Int *dof_func, hypre_ParCSRMatrix **S_ptr ); HYPRE_Int hypre_BoomerAMGCreateSFromCFMarker(hypre_ParCSRMatrix *A, HYPRE_Real strength_threshold, HYPRE_Real max_row_sum, HYPRE_Int *CF_marker, HYPRE_Int num_functions, HYPRE_Int *dof_func, HYPRE_Int SMRK, hypre_ParCSRMatrix **S_ptr); HYPRE_Int hypre_NonGalerkinIJBufferInit ( HYPRE_Int *ijbuf_cnt, HYPRE_Int *ijbuf_rowcounter, HYPRE_Int *ijbuf_numcols ); HYPRE_Int hypre_NonGalerkinIJBigBufferInit ( HYPRE_Int *ijbuf_cnt, HYPRE_Int *ijbuf_rowcounter, HYPRE_BigInt *ijbuf_numcols ); HYPRE_Int hypre_NonGalerkinIJBufferNewRow ( HYPRE_BigInt *ijbuf_rownums, HYPRE_Int *ijbuf_numcols, HYPRE_Int *ijbuf_rowcounter, HYPRE_BigInt new_row ); HYPRE_Int hypre_NonGalerkinIJBufferCompressRow ( HYPRE_Int *ijbuf_cnt, HYPRE_Int ijbuf_rowcounter, HYPRE_Real *ijbuf_data, HYPRE_BigInt *ijbuf_cols, HYPRE_BigInt *ijbuf_rownums, HYPRE_Int *ijbuf_numcols ); HYPRE_Int hypre_NonGalerkinIJBufferCompress ( HYPRE_MemoryLocation memory_location, HYPRE_Int ijbuf_size, HYPRE_Int *ijbuf_cnt, HYPRE_Int *ijbuf_rowcounter, HYPRE_Real **ijbuf_data, HYPRE_BigInt **ijbuf_cols, HYPRE_BigInt **ijbuf_rownums, HYPRE_Int **ijbuf_numcols ); HYPRE_Int hypre_NonGalerkinIJBufferWrite ( HYPRE_IJMatrix B, HYPRE_Int *ijbuf_cnt, HYPRE_Int ijbuf_size, HYPRE_Int *ijbuf_rowcounter, HYPRE_Real **ijbuf_data, HYPRE_BigInt **ijbuf_cols, HYPRE_BigInt **ijbuf_rownums, HYPRE_Int **ijbuf_numcols, HYPRE_BigInt row_to_write, HYPRE_BigInt col_to_write, HYPRE_Real val_to_write ); HYPRE_Int hypre_NonGalerkinIJBufferEmpty ( HYPRE_IJMatrix B, HYPRE_Int ijbuf_size, HYPRE_Int *ijbuf_cnt, HYPRE_Int ijbuf_rowcounter, HYPRE_Real **ijbuf_data, HYPRE_BigInt **ijbuf_cols, HYPRE_BigInt **ijbuf_rownums, HYPRE_Int **ijbuf_numcols ); hypre_ParCSRMatrix * hypre_NonGalerkinSparsityPattern(hypre_ParCSRMatrix *R_IAP, hypre_ParCSRMatrix *RAP, HYPRE_Int * CF_marker, HYPRE_Real droptol, HYPRE_Int sym_collapse, HYPRE_Int collapse_beta ); HYPRE_Int hypre_BoomerAMGBuildNonGalerkinCoarseOperator( hypre_ParCSRMatrix **RAP_ptr, hypre_ParCSRMatrix *AP, HYPRE_Real strong_threshold, HYPRE_Real max_row_sum, HYPRE_Int num_functions, HYPRE_Int * dof_func_value, HYPRE_Int * CF_marker, HYPRE_Real droptol, HYPRE_Int sym_collapse, HYPRE_Real lump_percent, HYPRE_Int collapse_beta ); /* par_rap.c */ HYPRE_Int hypre_BoomerAMGBuildCoarseOperator ( hypre_ParCSRMatrix *RT, hypre_ParCSRMatrix *A, hypre_ParCSRMatrix *P, hypre_ParCSRMatrix **RAP_ptr ); HYPRE_Int hypre_BoomerAMGBuildCoarseOperatorKT ( hypre_ParCSRMatrix *RT, hypre_ParCSRMatrix *A, hypre_ParCSRMatrix *P, HYPRE_Int keepTranspose, hypre_ParCSRMatrix **RAP_ptr ); /* par_rap_communication.c */ HYPRE_Int hypre_GetCommPkgRTFromCommPkgA ( hypre_ParCSRMatrix *RT, hypre_ParCSRMatrix *A, HYPRE_Int *fine_to_coarse, HYPRE_Int *tmp_map_offd ); HYPRE_Int hypre_GenerateSendMapAndCommPkg ( MPI_Comm comm, HYPRE_Int num_sends, HYPRE_Int num_recvs, HYPRE_Int *recv_procs, HYPRE_Int *send_procs, HYPRE_Int *recv_vec_starts, hypre_ParCSRMatrix *A ); /* par_ge_device.c */ HYPRE_Int hypre_GaussElimSetupDevice ( hypre_ParAMGData *amg_data, HYPRE_Int level, HYPRE_Int solver_type ); HYPRE_Int hypre_GaussElimSolveDevice ( hypre_ParAMGData *amg_data, HYPRE_Int level, HYPRE_Int solver_type ); /* par_gauss_elim.c */ HYPRE_Int hypre_GaussElimSetup ( hypre_ParAMGData *amg_data, HYPRE_Int level, HYPRE_Int solver_type ); HYPRE_Int hypre_GaussElimSolve ( hypre_ParAMGData *amg_data, HYPRE_Int level, HYPRE_Int solver_type ); /* par_relax.c */ HYPRE_Int hypre_BoomerAMGRelax ( hypre_ParCSRMatrix *A, hypre_ParVector *f, HYPRE_Int *cf_marker, HYPRE_Int relax_type, HYPRE_Int relax_points, HYPRE_Real relax_weight, HYPRE_Real omega, HYPRE_Real *l1_norms, hypre_ParVector *u, hypre_ParVector *Vtemp, hypre_ParVector *Ztemp ); HYPRE_Int hypre_BoomerAMGRelaxHybridGaussSeidel_core( hypre_ParCSRMatrix *A, hypre_ParVector *f, HYPRE_Int *cf_marker, HYPRE_Int relax_points, HYPRE_Real relax_weight, HYPRE_Real omega, HYPRE_Real *l1_norms, hypre_ParVector *u, hypre_ParVector *Vtemp, hypre_ParVector *Ztemp, HYPRE_Int GS_order, HYPRE_Int Symm, HYPRE_Int Skip_diag, HYPRE_Int forced_seq, HYPRE_Int Topo_order ); HYPRE_Int hypre_BoomerAMGRelax0WeightedJacobi( hypre_ParCSRMatrix *A, hypre_ParVector *f, HYPRE_Int *cf_marker, HYPRE_Int relax_points, HYPRE_Real relax_weight, hypre_ParVector *u, hypre_ParVector *Vtemp ); HYPRE_Int hypre_BoomerAMGRelaxHybridSOR( hypre_ParCSRMatrix *A, hypre_ParVector *f, HYPRE_Int *cf_marker, HYPRE_Int relax_points, HYPRE_Real relax_weight, HYPRE_Real omega, HYPRE_Real *l1_norms, hypre_ParVector *u, hypre_ParVector *Vtemp, hypre_ParVector *Ztemp, HYPRE_Int direction, HYPRE_Int symm, HYPRE_Int skip_diag, HYPRE_Int force_seq ); HYPRE_Int hypre_BoomerAMGRelax1GaussSeidel( hypre_ParCSRMatrix *A, hypre_ParVector *f, HYPRE_Int *cf_marker, HYPRE_Int relax_points, hypre_ParVector *u ); HYPRE_Int hypre_BoomerAMGRelax2GaussSeidel( hypre_ParCSRMatrix *A, hypre_ParVector *f, HYPRE_Int *cf_marker, HYPRE_Int relax_points, hypre_ParVector *u ); HYPRE_Int hypre_BoomerAMGRelax5ChaoticHybridGaussSeidel( hypre_ParCSRMatrix *A, hypre_ParVector *f, HYPRE_Int *cf_marker, HYPRE_Int relax_points, hypre_ParVector *u ); HYPRE_Int hypre_BoomerAMGRelax3HybridGaussSeidel( hypre_ParCSRMatrix *A, hypre_ParVector *f, HYPRE_Int *cf_marker, HYPRE_Int relax_points, HYPRE_Real relax_weight, HYPRE_Real omega, hypre_ParVector *u, hypre_ParVector *Vtemp, hypre_ParVector *Ztemp ); HYPRE_Int hypre_BoomerAMGRelax4HybridGaussSeidel( hypre_ParCSRMatrix *A, hypre_ParVector *f, HYPRE_Int *cf_marker, HYPRE_Int relax_points, HYPRE_Real relax_weight, HYPRE_Real omega, hypre_ParVector *u, hypre_ParVector *Vtemp, hypre_ParVector *Ztemp ); HYPRE_Int hypre_BoomerAMGRelax6HybridSSOR( hypre_ParCSRMatrix *A, hypre_ParVector *f, HYPRE_Int *cf_marker, HYPRE_Int relax_points, HYPRE_Real relax_weight, HYPRE_Real omega, hypre_ParVector *u, hypre_ParVector *Vtemp, hypre_ParVector *Ztemp ); HYPRE_Int hypre_BoomerAMGRelax7Jacobi( hypre_ParCSRMatrix *A, hypre_ParVector *f, HYPRE_Int *cf_marker, HYPRE_Int relax_points, HYPRE_Real relax_weight, HYPRE_Real *l1_norms, hypre_ParVector *u, hypre_ParVector *Vtemp ); HYPRE_Int hypre_BoomerAMGRelax8HybridL1SSOR( hypre_ParCSRMatrix *A, hypre_ParVector *f, HYPRE_Int *cf_marker, HYPRE_Int relax_points, HYPRE_Real relax_weight, HYPRE_Real omega, HYPRE_Real *l1_norms, hypre_ParVector *u, hypre_ParVector *Vtemp, hypre_ParVector *Ztemp ); HYPRE_Int hypre_BoomerAMGRelax10TopoOrderedGaussSeidel( hypre_ParCSRMatrix *A, hypre_ParVector *f, HYPRE_Int *cf_marker, HYPRE_Int relax_points, HYPRE_Real relax_weight, HYPRE_Real omega, hypre_ParVector *u, hypre_ParVector *Vtemp, hypre_ParVector *Ztemp ); HYPRE_Int hypre_BoomerAMGRelax13HybridL1GaussSeidel( hypre_ParCSRMatrix *A, hypre_ParVector *f, HYPRE_Int *cf_marker, HYPRE_Int relax_points, HYPRE_Real relax_weight, HYPRE_Real omega, HYPRE_Real *l1_norms, hypre_ParVector *u, hypre_ParVector *Vtemp, hypre_ParVector *Ztemp ); HYPRE_Int hypre_BoomerAMGRelax14HybridL1GaussSeidel( hypre_ParCSRMatrix *A, hypre_ParVector *f, HYPRE_Int *cf_marker, HYPRE_Int relax_points, HYPRE_Real relax_weight, HYPRE_Real omega, HYPRE_Real *l1_norms, hypre_ParVector *u, hypre_ParVector *Vtemp, hypre_ParVector *Ztemp ); HYPRE_Int hypre_BoomerAMGRelax88HybridL1SSOR( hypre_ParCSRMatrix *A, hypre_ParVector *f, HYPRE_Int *cf_marker, HYPRE_Int relax_points, HYPRE_Real relax_weight, HYPRE_Real omega, HYPRE_Real *l1_norms, hypre_ParVector *u, hypre_ParVector *Vtemp, hypre_ParVector *Ztemp ); HYPRE_Int hypre_BoomerAMGRelax89HybridL1SSOR( hypre_ParCSRMatrix *A, hypre_ParVector *f, HYPRE_Int *cf_marker, HYPRE_Int relax_points, HYPRE_Real relax_weight, HYPRE_Real omega, HYPRE_Real *l1_norms, hypre_ParVector *u, hypre_ParVector *Vtemp, hypre_ParVector *Ztemp ); HYPRE_Int hypre_BoomerAMGRelax18WeightedL1Jacobi( hypre_ParCSRMatrix *A, hypre_ParVector *f, HYPRE_Int *cf_marker, HYPRE_Int relax_points, HYPRE_Real relax_weight, HYPRE_Real *l1_norms, hypre_ParVector *u, hypre_ParVector *Vtemp ); HYPRE_Int hypre_BoomerAMGRelaxKaczmarz( hypre_ParCSRMatrix *A, hypre_ParVector *f, HYPRE_Real omega, HYPRE_Real *l1_norms, hypre_ParVector *u ); HYPRE_Int hypre_BoomerAMGRelaxTwoStageGaussSeidelDevice ( hypre_ParCSRMatrix *A, hypre_ParVector *f, HYPRE_Real relax_weight, HYPRE_Real omega, HYPRE_Real *A_diag_diag, hypre_ParVector *u, hypre_ParVector *r, hypre_ParVector *z, HYPRE_Int choice ); HYPRE_Int hypre_BoomerAMGRelax11TwoStageGaussSeidel( hypre_ParCSRMatrix *A, hypre_ParVector *f, HYPRE_Int *cf_marker, HYPRE_Int relax_points, HYPRE_Real relax_weight, HYPRE_Real omega, HYPRE_Real *A_diag_diag, hypre_ParVector *u, hypre_ParVector *Vtemp, hypre_ParVector *Ztemp ); HYPRE_Int hypre_BoomerAMGRelax12TwoStageGaussSeidel( hypre_ParCSRMatrix *A, hypre_ParVector *f, HYPRE_Int *cf_marker, HYPRE_Int relax_points, HYPRE_Real relax_weight, HYPRE_Real omega, HYPRE_Real *A_diag_diag, hypre_ParVector *u, hypre_ParVector *Vtemp, hypre_ParVector *Ztemp ); HYPRE_Int hypre_BoomerAMGRelaxComputeL1Norms( hypre_ParCSRMatrix *A, HYPRE_Int relax_type, HYPRE_Int relax_order, HYPRE_Int coarsest_lvl, hypre_IntArray *CF_marker, HYPRE_Real **l1_norms_data_ptr ); /* par_relax_device.c */ HYPRE_Int hypre_BoomerAMGRelaxHybridGaussSeidelDevice( hypre_ParCSRMatrix *A, hypre_ParVector *f, HYPRE_Int *cf_marker, HYPRE_Int relax_points, HYPRE_Real relax_weight, HYPRE_Real omega, HYPRE_Real *l1_norms, hypre_ParVector *u, hypre_ParVector *Vtemp, hypre_ParVector *Ztemp, HYPRE_Int GS_order, HYPRE_Int Symm ); /* par_relax_interface.c */ HYPRE_Int hypre_BoomerAMGRelaxIF ( hypre_ParCSRMatrix *A, hypre_ParVector *f, HYPRE_Int *cf_marker, HYPRE_Int relax_type, HYPRE_Int relax_order, HYPRE_Int cycle_type, HYPRE_Real relax_weight, HYPRE_Real omega, HYPRE_Real *l1_norms, hypre_ParVector *u, hypre_ParVector *Vtemp, hypre_ParVector *Ztemp ); /* par_relax_more.c */ HYPRE_Int hypre_ParCSRMaxEigEstimate ( hypre_ParCSRMatrix *A, HYPRE_Int scale, HYPRE_Real *max_eig, HYPRE_Real *min_eig ); HYPRE_Int hypre_ParCSRMaxEigEstimateHost ( hypre_ParCSRMatrix *A, HYPRE_Int scale, HYPRE_Real *max_eig, HYPRE_Real *min_eig ); HYPRE_Int hypre_ParCSRMaxEigEstimateCG ( hypre_ParCSRMatrix *A, HYPRE_Int scale, HYPRE_Int max_iter, HYPRE_Real *max_eig, HYPRE_Real *min_eig ); HYPRE_Int hypre_ParCSRMaxEigEstimateCGHost ( hypre_ParCSRMatrix *A, HYPRE_Int scale, HYPRE_Int max_iter, HYPRE_Real *max_eig, HYPRE_Real *min_eig ); HYPRE_Int hypre_ParCSRRelax_Cheby ( hypre_ParCSRMatrix *A, hypre_ParVector *f, HYPRE_Real max_eig, HYPRE_Real min_eig, HYPRE_Real fraction, HYPRE_Int order, HYPRE_Int scale, HYPRE_Int variant, hypre_ParVector *u, hypre_ParVector *v, hypre_ParVector *r ); HYPRE_Int hypre_BoomerAMGRelax_FCFJacobi ( hypre_ParCSRMatrix *A, hypre_ParVector *f, HYPRE_Int *cf_marker, HYPRE_Real relax_weight, hypre_ParVector *u, hypre_ParVector *Vtemp ); HYPRE_Int hypre_ParCSRRelax_CG ( HYPRE_Solver solver, hypre_ParCSRMatrix *A, hypre_ParVector *f, hypre_ParVector *u, HYPRE_Int num_its ); HYPRE_Int hypre_LINPACKcgtql1 ( HYPRE_Int *n, HYPRE_Real *d, HYPRE_Real *e, HYPRE_Int *ierr ); HYPRE_Real hypre_LINPACKcgpthy ( HYPRE_Real *a, HYPRE_Real *b ); HYPRE_Int hypre_ParCSRRelax_L1_Jacobi ( hypre_ParCSRMatrix *A, hypre_ParVector *f, HYPRE_Int *cf_marker, HYPRE_Int relax_points, HYPRE_Real relax_weight, HYPRE_Real *l1_norms, hypre_ParVector *u, hypre_ParVector *Vtemp ); HYPRE_Int hypre_LINPACKcgtql1(HYPRE_Int*, HYPRE_Real *, HYPRE_Real *, HYPRE_Int *); HYPRE_Real hypre_LINPACKcgpthy(HYPRE_Real*, HYPRE_Real*); /* par_relax_more_device.c */ HYPRE_Int hypre_ParCSRMaxEigEstimateDevice ( hypre_ParCSRMatrix *A, HYPRE_Int scale, HYPRE_Real *max_eig, HYPRE_Real *min_eig ); HYPRE_Int hypre_ParCSRMaxEigEstimateCGDevice ( hypre_ParCSRMatrix *A, HYPRE_Int scale, HYPRE_Int max_iter, HYPRE_Real *max_eig, HYPRE_Real *min_eig ); /* par_rotate_7pt.c */ HYPRE_ParCSRMatrix GenerateRotate7pt ( MPI_Comm comm, HYPRE_BigInt nx, HYPRE_BigInt ny, HYPRE_Int P, HYPRE_Int Q, HYPRE_Int p, HYPRE_Int q, HYPRE_Real alpha, HYPRE_Real eps ); /* par_scaled_matnorm.c */ HYPRE_Int hypre_ParCSRMatrixScaledNorm ( hypre_ParCSRMatrix *A, HYPRE_Real *scnorm ); /* par_schwarz.c */ void *hypre_SchwarzCreate ( void ); HYPRE_Int hypre_SchwarzDestroy ( void *data ); HYPRE_Int hypre_SchwarzSetup ( void *schwarz_vdata, hypre_ParCSRMatrix *A, hypre_ParVector *f, hypre_ParVector *u ); HYPRE_Int hypre_SchwarzSolve ( void *schwarz_vdata, hypre_ParCSRMatrix *A, hypre_ParVector *f, hypre_ParVector *u ); HYPRE_Int hypre_SchwarzCFSolve ( void *schwarz_vdata, hypre_ParCSRMatrix *A, hypre_ParVector *f, hypre_ParVector *u, HYPRE_Int *CF_marker, HYPRE_Int rlx_pt ); HYPRE_Int hypre_SchwarzSetVariant ( void *data, HYPRE_Int variant ); HYPRE_Int hypre_SchwarzSetDomainType ( void *data, HYPRE_Int domain_type ); HYPRE_Int hypre_SchwarzSetOverlap ( void *data, HYPRE_Int overlap ); HYPRE_Int hypre_SchwarzSetNumFunctions ( void *data, HYPRE_Int num_functions ); HYPRE_Int hypre_SchwarzSetNonSymm ( void *data, HYPRE_Int value ); HYPRE_Int hypre_SchwarzSetRelaxWeight ( void *data, HYPRE_Real relax_weight ); HYPRE_Int hypre_SchwarzSetDomainStructure ( void *data, hypre_CSRMatrix *domain_structure ); HYPRE_Int hypre_SchwarzSetScale ( void *data, HYPRE_Real *scale ); HYPRE_Int hypre_SchwarzReScale ( void *data, HYPRE_Int size, HYPRE_Real value ); HYPRE_Int hypre_SchwarzSetDofFunc ( void *data, HYPRE_Int *dof_func ); /* par_stats.c */ HYPRE_Int hypre_BoomerAMGSetupStats ( void *amg_vdata, hypre_ParCSRMatrix *A ); HYPRE_Int hypre_BoomerAMGWriteSolverParams ( void *data ); const char* hypre_BoomerAMGGetProlongationName( hypre_ParAMGData *amg_data ); const char* hypre_BoomerAMGGetAggProlongationName( hypre_ParAMGData *amg_data ); const char* hypre_BoomerAMGGetCoarseningName( hypre_ParAMGData *amg_data ); const char* hypre_BoomerAMGGetCycleName( hypre_ParAMGData *amg_data ); HYPRE_Int hypre_BoomerAMGPrintGeneralInfo( hypre_ParAMGData *amg_data, HYPRE_Int shift ); /* par_strength.c */ HYPRE_Int hypre_BoomerAMGCreateS ( hypre_ParCSRMatrix *A, HYPRE_Real strength_threshold, HYPRE_Real max_row_sum, HYPRE_Int num_functions, HYPRE_Int *dof_func, hypre_ParCSRMatrix **S_ptr ); HYPRE_Int hypre_BoomerAMGCreateSabs ( hypre_ParCSRMatrix *A, HYPRE_Real strength_threshold, HYPRE_Real max_row_sum, HYPRE_Int num_functions, HYPRE_Int *dof_func, hypre_ParCSRMatrix **S_ptr ); HYPRE_Int hypre_BoomerAMGCreateSCommPkg ( hypre_ParCSRMatrix *A, hypre_ParCSRMatrix *S, HYPRE_Int **col_offd_S_to_A_ptr ); HYPRE_Int hypre_BoomerAMGCreate2ndS ( hypre_ParCSRMatrix *S, HYPRE_Int *CF_marker, HYPRE_Int num_paths, HYPRE_BigInt *coarse_row_starts, hypre_ParCSRMatrix **C_ptr ); HYPRE_Int hypre_BoomerAMGCorrectCFMarker ( hypre_IntArray *CF_marker, hypre_IntArray *new_CF_marker ); HYPRE_Int hypre_BoomerAMGCorrectCFMarkerHost ( hypre_IntArray *CF_marker, hypre_IntArray *new_CF_marker ); HYPRE_Int hypre_BoomerAMGCorrectCFMarkerDevice ( hypre_IntArray *CF_marker, hypre_IntArray *new_CF_marker ); HYPRE_Int hypre_BoomerAMGCorrectCFMarker2 ( hypre_IntArray *CF_marker, hypre_IntArray *new_CF_marker ); HYPRE_Int hypre_BoomerAMGCorrectCFMarker2Host ( hypre_IntArray *CF_marker, hypre_IntArray *new_CF_marker ); HYPRE_Int hypre_BoomerAMGCorrectCFMarker2Device ( hypre_IntArray *CF_marker, hypre_IntArray *new_CF_marker ); HYPRE_Int hypre_BoomerAMGCreateSHost(hypre_ParCSRMatrix *A, HYPRE_Real strength_threshold, HYPRE_Real max_row_sum, HYPRE_Int num_functions, HYPRE_Int *dof_func, hypre_ParCSRMatrix **S_ptr); HYPRE_Int hypre_BoomerAMGCreateSDevice(hypre_ParCSRMatrix *A, HYPRE_Int abs_soc, HYPRE_Real strength_threshold, HYPRE_Real max_row_sum, HYPRE_Int num_functions, HYPRE_Int *dof_func, hypre_ParCSRMatrix **S_ptr); HYPRE_Int hypre_BoomerAMGCreateSabsHost ( hypre_ParCSRMatrix *A, HYPRE_Real strength_threshold, HYPRE_Real max_row_sum, HYPRE_Int num_functions, HYPRE_Int *dof_func, hypre_ParCSRMatrix **S_ptr ); HYPRE_Int hypre_BoomerAMGCreate2ndSDevice( hypre_ParCSRMatrix *S, HYPRE_Int *CF_marker, HYPRE_Int num_paths, HYPRE_BigInt *coarse_row_starts, hypre_ParCSRMatrix **C_ptr); HYPRE_Int hypre_BoomerAMGMakeSocFromSDevice( hypre_ParCSRMatrix *A, hypre_ParCSRMatrix *S); /* par_sv_interp.c */ HYPRE_Int hypre_BoomerAMGSmoothInterpVectors ( hypre_ParCSRMatrix *A, HYPRE_Int num_smooth_vecs, hypre_ParVector **smooth_vecs, HYPRE_Int smooth_steps ); HYPRE_Int hypre_BoomerAMGCoarsenInterpVectors ( hypre_ParCSRMatrix *P, HYPRE_Int num_smooth_vecs, hypre_ParVector **smooth_vecs, HYPRE_Int *CF_marker, hypre_ParVector ***new_smooth_vecs, HYPRE_Int expand_level, HYPRE_Int num_functions ); HYPRE_Int hypre_BoomerAMG_GMExpandInterp ( hypre_ParCSRMatrix *A, hypre_ParCSRMatrix **P, HYPRE_Int num_smooth_vecs, hypre_ParVector **smooth_vecs, HYPRE_Int *nf, HYPRE_Int *dof_func, hypre_IntArray **coarse_dof_func, HYPRE_Int variant, HYPRE_Int level, HYPRE_Real abs_trunc, HYPRE_Real *weights, HYPRE_Int q_max, HYPRE_Int *CF_marker, HYPRE_Int interp_vec_first_level ); HYPRE_Int hypre_BoomerAMGRefineInterp ( hypre_ParCSRMatrix *A, hypre_ParCSRMatrix *P, HYPRE_BigInt *num_cpts_global, HYPRE_Int *nf, HYPRE_Int *dof_func, HYPRE_Int *CF_marker, HYPRE_Int level ); /* par_sv_interp_ln.c */ HYPRE_Int hypre_BoomerAMG_LNExpandInterp ( hypre_ParCSRMatrix *A, hypre_ParCSRMatrix **P, HYPRE_BigInt *num_cpts_global, HYPRE_Int *nf, HYPRE_Int *dof_func, hypre_IntArray **coarse_dof_func, HYPRE_Int *CF_marker, HYPRE_Int level, HYPRE_Real *weights, HYPRE_Int num_smooth_vecs, hypre_ParVector **smooth_vecs, HYPRE_Real abs_trunc, HYPRE_Int q_max, HYPRE_Int interp_vec_first_level ); /* par_sv_interp_lsfit.c */ HYPRE_Int hypre_BoomerAMGFitInterpVectors ( hypre_ParCSRMatrix *A, hypre_ParCSRMatrix **P, HYPRE_Int num_smooth_vecs, hypre_ParVector **smooth_vecs, hypre_ParVector **coarse_smooth_vecs, HYPRE_Real delta, HYPRE_Int num_functions, HYPRE_Int *dof_func, HYPRE_Int *CF_marker, HYPRE_Int max_elmts, HYPRE_Real trunc_factor, HYPRE_Int variant, HYPRE_Int level ); /* partial.c */ HYPRE_Int hypre_BoomerAMGBuildPartialExtPIInterp ( hypre_ParCSRMatrix *A, HYPRE_Int *CF_marker, hypre_ParCSRMatrix *S, HYPRE_BigInt *num_cpts_global, HYPRE_BigInt *num_old_cpts_global, HYPRE_Int num_functions, HYPRE_Int *dof_func, HYPRE_Int debug_flag, HYPRE_Real trunc_factor, HYPRE_Int max_elmts, hypre_ParCSRMatrix **P_ptr ); HYPRE_Int hypre_BoomerAMGBuildPartialStdInterp ( hypre_ParCSRMatrix *A, HYPRE_Int *CF_marker, hypre_ParCSRMatrix *S, HYPRE_BigInt *num_cpts_global, HYPRE_BigInt *num_old_cpts_global, HYPRE_Int num_functions, HYPRE_Int *dof_func, HYPRE_Int debug_flag, HYPRE_Real trunc_factor, HYPRE_Int max_elmts, HYPRE_Int sep_weight, hypre_ParCSRMatrix **P_ptr ); HYPRE_Int hypre_BoomerAMGBuildPartialExtInterp ( hypre_ParCSRMatrix *A, HYPRE_Int *CF_marker, hypre_ParCSRMatrix *S, HYPRE_BigInt *num_cpts_global, HYPRE_BigInt *num_old_cpts_global, HYPRE_Int num_functions, HYPRE_Int *dof_func, HYPRE_Int debug_flag, HYPRE_Real trunc_factor, HYPRE_Int max_elmts, hypre_ParCSRMatrix **P_ptr ); /* par_vardifconv.c */ HYPRE_ParCSRMatrix GenerateVarDifConv ( MPI_Comm comm, HYPRE_BigInt nx, HYPRE_BigInt ny, HYPRE_BigInt nz, HYPRE_Int P, HYPRE_Int Q, HYPRE_Int R, HYPRE_Int p, HYPRE_Int q, HYPRE_Int r, HYPRE_Real eps, HYPRE_ParVector *rhs_ptr ); HYPRE_Real afun ( HYPRE_Real xx, HYPRE_Real yy, HYPRE_Real zz ); HYPRE_Real bfun ( HYPRE_Real xx, HYPRE_Real yy, HYPRE_Real zz ); HYPRE_Real cfun ( HYPRE_Real xx, HYPRE_Real yy, HYPRE_Real zz ); HYPRE_Real dfun ( HYPRE_Real xx, HYPRE_Real yy, HYPRE_Real zz ); HYPRE_Real efun ( HYPRE_Real xx, HYPRE_Real yy, HYPRE_Real zz ); HYPRE_Real ffun ( HYPRE_Real xx, HYPRE_Real yy, HYPRE_Real zz ); HYPRE_Real gfun ( HYPRE_Real xx, HYPRE_Real yy, HYPRE_Real zz ); HYPRE_Real rfun ( HYPRE_Real xx, HYPRE_Real yy, HYPRE_Real zz ); HYPRE_Real bndfun ( HYPRE_Real xx, HYPRE_Real yy, HYPRE_Real zz ); /* par_vardifconv_rs.c */ HYPRE_ParCSRMatrix GenerateRSVarDifConv ( MPI_Comm comm, HYPRE_BigInt nx, HYPRE_BigInt ny, HYPRE_BigInt nz, HYPRE_Int P, HYPRE_Int Q, HYPRE_Int R, HYPRE_Int p, HYPRE_Int q, HYPRE_Int r, HYPRE_Real eps, HYPRE_ParVector *rhs_ptr, HYPRE_Int type ); HYPRE_Real afun_rs ( HYPRE_Real xx, HYPRE_Real yy, HYPRE_Real zz ); HYPRE_Real bfun_rs ( HYPRE_Real xx, HYPRE_Real yy, HYPRE_Real zz ); HYPRE_Real cfun_rs ( HYPRE_Real xx, HYPRE_Real yy, HYPRE_Real zz ); HYPRE_Real dfun_rs ( HYPRE_Real xx, HYPRE_Real yy, HYPRE_Real zz ); HYPRE_Real efun_rs ( HYPRE_Real xx, HYPRE_Real yy, HYPRE_Real zz ); HYPRE_Real ffun_rs ( HYPRE_Real xx, HYPRE_Real yy, HYPRE_Real zz ); HYPRE_Real gfun_rs ( HYPRE_Real xx, HYPRE_Real yy, HYPRE_Real zz ); HYPRE_Real rfun_rs ( HYPRE_Real xx, HYPRE_Real yy, HYPRE_Real zz ); HYPRE_Real bndfun_rs ( HYPRE_Real xx, HYPRE_Real yy, HYPRE_Real zz ); /* pcg_par.c */ void *hypre_ParKrylovCAlloc ( size_t count, size_t elt_size, HYPRE_MemoryLocation location ); HYPRE_Int hypre_ParKrylovFree ( void *ptr ); void *hypre_ParKrylovCreateVector ( void *vvector ); void *hypre_ParKrylovCreateVectorArray ( HYPRE_Int n, void *vvector ); HYPRE_Int hypre_ParKrylovDestroyVector ( void *vvector ); void *hypre_ParKrylovMatvecCreate ( void *A, void *x ); HYPRE_Int hypre_ParKrylovMatvec ( void *matvec_data, HYPRE_Complex alpha, void *A, void *x, HYPRE_Complex beta, void *y ); HYPRE_Int hypre_ParKrylovMatvecT ( void *matvec_data, HYPRE_Complex alpha, void *A, void *x, HYPRE_Complex beta, void *y ); HYPRE_Int hypre_ParKrylovMatvecDestroy ( void *matvec_data ); HYPRE_Real hypre_ParKrylovInnerProd ( void *x, void *y ); HYPRE_Int hypre_ParKrylovMassInnerProd ( void *x, void **y, HYPRE_Int k, HYPRE_Int unroll, void *result ); HYPRE_Int hypre_ParKrylovMassDotpTwo ( void *x, void *y, void **z, HYPRE_Int k, HYPRE_Int unroll, void *result_x, void *result_y ); HYPRE_Int hypre_ParKrylovMassAxpy( HYPRE_Complex *alpha, void **x, void *y, HYPRE_Int k, HYPRE_Int unroll); HYPRE_Int hypre_ParKrylovCopyVector ( void *x, void *y ); HYPRE_Int hypre_ParKrylovClearVector ( void *x ); HYPRE_Int hypre_ParKrylovScaleVector ( HYPRE_Complex alpha, void *x ); HYPRE_Int hypre_ParKrylovAxpy ( HYPRE_Complex alpha, void *x, void *y ); HYPRE_Int hypre_ParKrylovCommInfo ( void *A, HYPRE_Int *my_id, HYPRE_Int *num_procs ); HYPRE_Int hypre_ParKrylovIdentitySetup ( void *vdata, void *A, void *b, void *x ); HYPRE_Int hypre_ParKrylovIdentity ( void *vdata, void *A, void *b, void *x ); /* schwarz.c */ HYPRE_Int hypre_AMGNodalSchwarzSmoother ( hypre_CSRMatrix *A, HYPRE_Int num_functions, HYPRE_Int option, hypre_CSRMatrix **domain_structure_pointer ); HYPRE_Int hypre_ParMPSchwarzSolve ( hypre_ParCSRMatrix *par_A, hypre_CSRMatrix *A_boundary, hypre_ParVector *rhs_vector, hypre_CSRMatrix *domain_structure, hypre_ParVector *par_x, HYPRE_Real relax_wt, HYPRE_Real *scale, hypre_ParVector *Vtemp, HYPRE_Int *pivots, HYPRE_Int use_nonsymm ); HYPRE_Int hypre_MPSchwarzSolve ( hypre_ParCSRMatrix *par_A, hypre_Vector *rhs_vector, hypre_CSRMatrix *domain_structure, hypre_ParVector *par_x, HYPRE_Real relax_wt, hypre_Vector *aux_vector, HYPRE_Int *pivots, HYPRE_Int use_nonsymm ); HYPRE_Int hypre_MPSchwarzCFSolve ( hypre_ParCSRMatrix *par_A, hypre_Vector *rhs_vector, hypre_CSRMatrix *domain_structure, hypre_ParVector *par_x, HYPRE_Real relax_wt, hypre_Vector *aux_vector, HYPRE_Int *CF_marker, HYPRE_Int rlx_pt, HYPRE_Int *pivots, HYPRE_Int use_nonsymm ); HYPRE_Int hypre_MPSchwarzFWSolve ( hypre_ParCSRMatrix *par_A, hypre_Vector *rhs_vector, hypre_CSRMatrix *domain_structure, hypre_ParVector *par_x, HYPRE_Real relax_wt, hypre_Vector *aux_vector, HYPRE_Int *pivots, HYPRE_Int use_nonsymm ); HYPRE_Int hypre_MPSchwarzCFFWSolve ( hypre_ParCSRMatrix *par_A, hypre_Vector *rhs_vector, hypre_CSRMatrix *domain_structure, hypre_ParVector *par_x, HYPRE_Real relax_wt, hypre_Vector *aux_vector, HYPRE_Int *CF_marker, HYPRE_Int rlx_pt, HYPRE_Int *pivots, HYPRE_Int use_nonsymm ); HYPRE_Int transpose_matrix_create ( HYPRE_Int **i_face_element_pointer, HYPRE_Int **j_face_element_pointer, HYPRE_Int *i_element_face, HYPRE_Int *j_element_face, HYPRE_Int num_elements, HYPRE_Int num_faces ); HYPRE_Int matrix_matrix_product ( HYPRE_Int **i_element_edge_pointer, HYPRE_Int **j_element_edge_pointer, HYPRE_Int *i_element_face, HYPRE_Int *j_element_face, HYPRE_Int *i_face_edge, HYPRE_Int *j_face_edge, HYPRE_Int num_elements, HYPRE_Int num_faces, HYPRE_Int num_edges ); HYPRE_Int hypre_AMGCreateDomainDof ( hypre_CSRMatrix *A, HYPRE_Int domain_type, HYPRE_Int overlap, HYPRE_Int num_functions, HYPRE_Int *dof_func, hypre_CSRMatrix **domain_structure_pointer, HYPRE_Int **piv_pointer, HYPRE_Int use_nonsymm ); HYPRE_Int hypre_AMGeAgglomerate ( HYPRE_Int *i_AE_element, HYPRE_Int *j_AE_element, HYPRE_Int *i_face_face, HYPRE_Int *j_face_face, HYPRE_Int *w_face_face, HYPRE_Int *i_face_element, HYPRE_Int *j_face_element, HYPRE_Int *i_element_face, HYPRE_Int *j_element_face, HYPRE_Int *i_face_to_prefer_weight, HYPRE_Int *i_face_weight, HYPRE_Int num_faces, HYPRE_Int num_elements, HYPRE_Int *num_AEs_pointer ); HYPRE_Int hypre_update_entry ( HYPRE_Int weight, HYPRE_Int *weight_max, HYPRE_Int *previous, HYPRE_Int *next, HYPRE_Int *first, HYPRE_Int *last, HYPRE_Int head, HYPRE_Int tail, HYPRE_Int i ); HYPRE_Int hypre_remove_entry ( HYPRE_Int weight, HYPRE_Int *weight_max, HYPRE_Int *previous, HYPRE_Int *next, HYPRE_Int *first, HYPRE_Int *last, HYPRE_Int head, HYPRE_Int tail, HYPRE_Int i ); HYPRE_Int hypre_move_entry ( HYPRE_Int weight, HYPRE_Int *weight_max, HYPRE_Int *previous, HYPRE_Int *next, HYPRE_Int *first, HYPRE_Int *last, HYPRE_Int head, HYPRE_Int tail, HYPRE_Int i ); HYPRE_Int hypre_matinv ( HYPRE_Real *x, HYPRE_Real *a, HYPRE_Int k ); HYPRE_Int hypre_parCorrRes ( hypre_ParCSRMatrix *A, hypre_ParVector *x, hypre_Vector *rhs, hypre_Vector **tmp_ptr ); HYPRE_Int hypre_AdSchwarzSolve ( hypre_ParCSRMatrix *par_A, hypre_ParVector *par_rhs, hypre_CSRMatrix *domain_structure, HYPRE_Real *scale, hypre_ParVector *par_x, hypre_ParVector *par_aux, HYPRE_Int *pivots, HYPRE_Int use_nonsymm ); HYPRE_Int hypre_AdSchwarzCFSolve ( hypre_ParCSRMatrix *par_A, hypre_ParVector *par_rhs, hypre_CSRMatrix *domain_structure, HYPRE_Real *scale, hypre_ParVector *par_x, hypre_ParVector *par_aux, HYPRE_Int *CF_marker, HYPRE_Int rlx_pt, HYPRE_Int *pivots, HYPRE_Int use_nonsymm ); HYPRE_Int hypre_GenerateScale ( hypre_CSRMatrix *domain_structure, HYPRE_Int num_variables, HYPRE_Real relaxation_weight, HYPRE_Real **scale_pointer ); HYPRE_Int hypre_ParAdSchwarzSolve ( hypre_ParCSRMatrix *A, hypre_ParVector *F, hypre_CSRMatrix *domain_structure, HYPRE_Real *scale, hypre_ParVector *X, hypre_ParVector *Vtemp, HYPRE_Int *pivots, HYPRE_Int use_nonsymm ); HYPRE_Int hypre_ParAMGCreateDomainDof ( hypre_ParCSRMatrix *A, HYPRE_Int domain_type, HYPRE_Int overlap, HYPRE_Int num_functions, HYPRE_Int *dof_func, hypre_CSRMatrix **domain_structure_pointer, HYPRE_Int **piv_pointer, HYPRE_Int use_nonsymm ); HYPRE_Int hypre_ParGenerateScale ( hypre_ParCSRMatrix *A, hypre_CSRMatrix *domain_structure, HYPRE_Real relaxation_weight, HYPRE_Real **scale_pointer ); HYPRE_Int hypre_ParGenerateHybridScale ( hypre_ParCSRMatrix *A, hypre_CSRMatrix *domain_structure, hypre_CSRMatrix **A_boundary_pointer, HYPRE_Real **scale_pointer ); /* par_restr.c, par_lr_restr.c */ HYPRE_Int hypre_BoomerAMGBuildRestrAIR( hypre_ParCSRMatrix *A, HYPRE_Int *CF_marker, hypre_ParCSRMatrix *S, HYPRE_BigInt *num_cpts_global, HYPRE_Int num_functions, HYPRE_Int *dof_func, HYPRE_Real filter_thresholdR, HYPRE_Int debug_flag, hypre_ParCSRMatrix **R_ptr, HYPRE_Int is_triangular, HYPRE_Int gmres_switch); HYPRE_Int hypre_BoomerAMGBuildRestrDist2AIR( hypre_ParCSRMatrix *A, HYPRE_Int *CF_marker, hypre_ParCSRMatrix *S, HYPRE_BigInt *num_cpts_global, HYPRE_Int num_functions, HYPRE_Int *dof_func, HYPRE_Real filter_thresholdR, HYPRE_Int debug_flag, hypre_ParCSRMatrix **R_ptr, HYPRE_Int AIR1_5, HYPRE_Int is_triangular, HYPRE_Int gmres_switch); HYPRE_Int hypre_BoomerAMGBuildRestrNeumannAIR( hypre_ParCSRMatrix *A, HYPRE_Int *CF_marker, HYPRE_BigInt *num_cpts_global, HYPRE_Int num_functions, HYPRE_Int *dof_func, HYPRE_Int NeumannDeg, HYPRE_Real strong_thresholdR, HYPRE_Real filter_thresholdR, HYPRE_Int debug_flag, hypre_ParCSRMatrix **R_ptr); HYPRE_Int hypre_BoomerAMGBuildRestrNeumannAIRDevice( hypre_ParCSRMatrix *A, HYPRE_Int *CF_marker, HYPRE_BigInt *num_cpts_global, HYPRE_Int num_functions, HYPRE_Int *dof_func, HYPRE_Int NeumannDeg, HYPRE_Real strong_thresholdR, HYPRE_Real filter_thresholdR, HYPRE_Int debug_flag, hypre_ParCSRMatrix **R_ptr); HYPRE_Int hypre_BoomerAMGCFMarkerTo1minus1Device( HYPRE_Int *CF_marker, HYPRE_Int size ); #ifdef HYPRE_USING_DSUPERLU /* superlu.c */ HYPRE_Int hypre_SLUDistSetup( HYPRE_Solver *solver, hypre_ParCSRMatrix *A, HYPRE_Int print_level); HYPRE_Int hypre_SLUDistSolve( void* solver, hypre_ParVector *b, hypre_ParVector *x); HYPRE_Int hypre_SLUDistDestroy( void* solver); #endif /* par_mgr.c */ void *hypre_MGRCreate ( void ); HYPRE_Int hypre_MGRDestroy ( void *mgr_vdata ); HYPRE_Int hypre_MGRCycle( void *mgr_vdata, hypre_ParVector **F_array, hypre_ParVector **U_array ); void *hypre_MGRCreateFrelaxVcycleData( void ); HYPRE_Int hypre_MGRDestroyFrelaxVcycleData( void *mgr_vdata ); void *hypre_MGRCreateGSElimData( void ); HYPRE_Int hypre_MGRDestroyGSElimData( void *mgr_vdata ); HYPRE_Int hypre_MGRSetupFrelaxVcycleData( void *mgr_vdata, hypre_ParCSRMatrix *A, hypre_ParVector *f, hypre_ParVector *u, HYPRE_Int level ); HYPRE_Int hypre_MGRFrelaxVcycle ( void *mgr_vdata, hypre_ParVector *f, hypre_ParVector *u ); HYPRE_Int hypre_MGRSetCpointsByBlock( void *mgr_vdata, HYPRE_Int block_size, HYPRE_Int max_num_levels, HYPRE_Int *block_num_coarse_points, HYPRE_Int **block_coarse_indexes ); HYPRE_Int hypre_MGRSetCpointsByContiguousBlock( void *mgr_vdata, HYPRE_Int block_size, HYPRE_Int max_num_levels, HYPRE_BigInt *begin_idx_array, HYPRE_Int *block_num_coarse_points, HYPRE_Int **block_coarse_indexes ); HYPRE_Int hypre_MGRSetCpointsByPointMarkerArray( void *mgr_vdata, HYPRE_Int block_size, HYPRE_Int max_num_levels, HYPRE_Int *block_num_coarse_points, HYPRE_Int **block_coarse_indexes, HYPRE_Int *point_marker_array ); HYPRE_Int hypre_MGRCoarsen( hypre_ParCSRMatrix *S, hypre_ParCSRMatrix *A, HYPRE_Int final_coarse_size, HYPRE_Int *final_coarse_indexes, HYPRE_Int debug_flag, hypre_IntArray **CF_marker, HYPRE_Int last_level ); HYPRE_Int hypre_MGRSetReservedCoarseNodes( void *mgr_vdata, HYPRE_Int reserved_coarse_size, HYPRE_BigInt *reserved_coarse_nodes ); HYPRE_Int hypre_MGRSetReservedCpointsLevelToKeep( void *mgr_vdata, HYPRE_Int level ); HYPRE_Int hypre_MGRSetMaxGlobalSmoothIters( void *mgr_vdata, HYPRE_Int max_iter ); HYPRE_Int hypre_MGRSetGlobalSmoothType( void *mgr_vdata, HYPRE_Int iter_type ); HYPRE_Int hypre_MGRSetNonCpointsToFpoints( void *mgr_vdata, HYPRE_Int nonCptToFptFlag ); //HYPRE_Int hypre_MGRInitCFMarker(HYPRE_Int num_variables, HYPRE_Int *CF_marker, HYPRE_Int initial_coarse_size,HYPRE_Int *initial_coarse_indexes); //HYPRE_Int hypre_MGRUpdateCoarseIndexes(HYPRE_Int num_variables, HYPRE_Int *CF_marker, HYPRE_Int initial_coarse_size,HYPRE_Int *initial_coarse_indexes); HYPRE_Int hypre_ParCSRMatrixExtractBlockDiagHost( hypre_ParCSRMatrix *par_A, HYPRE_Int blk_size, HYPRE_Int num_points, HYPRE_Int point_type, HYPRE_Int *CF_marker, HYPRE_Int diag_size, HYPRE_Int diag_type, HYPRE_Real *diag_data ); HYPRE_Int hypre_ParCSRMatrixBlockDiagMatrix( hypre_ParCSRMatrix *A, HYPRE_Int blk_size, HYPRE_Int point_type, HYPRE_Int *CF_marker, HYPRE_Int diag_type, hypre_ParCSRMatrix **B_ptr ); HYPRE_Int hypre_ParCSRMatrixBlockDiagMatrixHost( hypre_ParCSRMatrix *A, HYPRE_Int blk_size, HYPRE_Int point_type, HYPRE_Int *CF_marker, HYPRE_Int diag_type, hypre_ParCSRMatrix **B_ptr ); HYPRE_Int hypre_MGRSetCoarseSolver( void *mgr_vdata, HYPRE_Int (*cgrid_solver_solve)(void*, void*, void*, void*), HYPRE_Int (*cgrid_solver_setup)(void*, void*, void*, void*), void *coarse_grid_solver ); HYPRE_Int hypre_MGRSetFSolver( void *mgr_vdata, HYPRE_Int (*fine_grid_solver_solve)(void*, void*, void*, void*), HYPRE_Int (*fine_grid_solver_setup)(void*, void*, void*, void*), void *fsolver ); HYPRE_Int hypre_MGRSetFSolverAtLevel( void *mgr_vdata, void *fsolver, HYPRE_Int level ); HYPRE_Int hypre_MGRSetup( void *mgr_vdata, hypre_ParCSRMatrix *A, hypre_ParVector *f, hypre_ParVector *u ); HYPRE_Int hypre_MGRSolve( void *mgr_vdata, hypre_ParCSRMatrix *A, hypre_ParVector *f, hypre_ParVector *u ); HYPRE_Int hypre_block_jacobi_scaling( hypre_ParCSRMatrix *A, hypre_ParCSRMatrix **B_ptr, void *mgr_vdata, HYPRE_Int debug_flag ); HYPRE_Int hypre_MGRBlockRelaxSolveDevice( hypre_ParCSRMatrix *B, hypre_ParCSRMatrix *A, hypre_ParVector *f, hypre_ParVector *u, hypre_ParVector *Vtemp, HYPRE_Real relax_weight ); HYPRE_Int hypre_MGRBlockRelaxSolve( hypre_ParCSRMatrix *A, hypre_ParVector *f, hypre_ParVector *u, HYPRE_Int blk_size, HYPRE_Int n_block, HYPRE_Int left_size, HYPRE_Int method, HYPRE_Real *diaginv, hypre_ParVector *Vtemp ); HYPRE_Int hypre_BlockDiagInvLapack( HYPRE_Real *diag, HYPRE_Int N, HYPRE_Int blk_size ); HYPRE_Int hypre_MGRBlockRelaxSetup( hypre_ParCSRMatrix *A, HYPRE_Int blk_size, HYPRE_Real **diaginvptr ); //HYPRE_Int hypre_blockRelax(hypre_ParCSRMatrix *A, hypre_ParVector *f, hypre_ParVector *u, // HYPRE_Int blk_size, HYPRE_Int reserved_coarse_size, HYPRE_Int method, hypre_ParVector *Vtemp, // hypre_ParVector *Ztemp); HYPRE_Int hypre_block_jacobi_solve( hypre_ParCSRMatrix *A, hypre_ParVector *f, hypre_ParVector *u, HYPRE_Int blk_size, HYPRE_Int method, HYPRE_Real *diaginv, hypre_ParVector *Vtemp ); //HYPRE_Int hypre_MGRBuildAffRAP( MPI_Comm comm, HYPRE_Int local_num_variables, HYPRE_Int num_functions, //HYPRE_Int *dof_func, HYPRE_Int *CF_marker, HYPRE_Int **coarse_dof_func_ptr, HYPRE_BigInt **coarse_pnts_global_ptr, //hypre_ParCSRMatrix *A, HYPRE_Int debug_flag, hypre_ParCSRMatrix **P_f_ptr, hypre_ParCSRMatrix **A_ff_ptr ); HYPRE_Int hypre_MGRGetSubBlock( hypre_ParCSRMatrix *A, HYPRE_Int *row_cf_marker, HYPRE_Int *col_cf_marker, HYPRE_Int debug_flag, hypre_ParCSRMatrix **A_ff_ptr ); HYPRE_Int hypre_MGRBuildAff( hypre_ParCSRMatrix *A, HYPRE_Int *CF_marker, HYPRE_Int debug_flag, hypre_ParCSRMatrix **A_ff_ptr ); HYPRE_Int hypre_MGRApproximateInverse( hypre_ParCSRMatrix *A, hypre_ParCSRMatrix **A_inv ); HYPRE_Int hypre_MGRAddVectorP( hypre_IntArray *CF_marker, HYPRE_Int point_type, HYPRE_Real a, hypre_ParVector *fromVector, HYPRE_Real b, hypre_ParVector **toVector ); HYPRE_Int hypre_MGRAddVectorR( hypre_IntArray *CF_marker, HYPRE_Int point_type, HYPRE_Real a, hypre_ParVector *fromVector, HYPRE_Real b, hypre_ParVector **toVector ); HYPRE_Int hypre_MGRTruncateAcfCPRDevice( hypre_ParCSRMatrix *A_CF, hypre_ParCSRMatrix **A_CF_new_ptr ); HYPRE_Int hypre_MGRSetAffSolverType( void *systg_vdata, HYPRE_Int *aff_solver_type ); HYPRE_Int hypre_MGRSetCoarseSolverType( void *systg_vdata, HYPRE_Int coarse_solver_type ); HYPRE_Int hypre_MGRSetCoarseSolverIter( void *systg_vdata, HYPRE_Int coarse_solver_iter ); HYPRE_Int hypre_MGRSetFineSolverIter( void *systg_vdata, HYPRE_Int fine_solver_iter ); HYPRE_Int hypre_MGRSetFineSolverMaxLevels( void *systg_vdata, HYPRE_Int fine_solver_max_levels ); HYPRE_Int hypre_MGRSetMaxCoarseLevels( void *mgr_vdata, HYPRE_Int maxlev ); HYPRE_Int hypre_MGRSetBlockSize( void *mgr_vdata, HYPRE_Int bsize ); HYPRE_Int hypre_MGRSetRelaxType( void *mgr_vdata, HYPRE_Int relax_type ); HYPRE_Int hypre_MGRSetFRelaxMethod( void *mgr_vdata, HYPRE_Int relax_method ); HYPRE_Int hypre_MGRSetLevelFRelaxMethod( void *mgr_vdata, HYPRE_Int *relax_method ); HYPRE_Int hypre_MGRSetLevelFRelaxType( void *mgr_vdata, HYPRE_Int *relax_type ); HYPRE_Int hypre_MGRSetLevelFRelaxNumFunctions( void *mgr_vdata, HYPRE_Int *num_functions ); HYPRE_Int hypre_MGRSetCoarseGridMethod( void *mgr_vdata, HYPRE_Int *cg_method ); HYPRE_Int hypre_MGRSetNonGalerkinMaxElmts( void *mgr_vdata, HYPRE_Int max_elmts ); HYPRE_Int hypre_MGRSetLevelNonGalerkinMaxElmts( void *mgr_vdata, HYPRE_Int *max_elmts ); HYPRE_Int hypre_MGRSetRestrictType( void *mgr_vdata, HYPRE_Int restrictType ); HYPRE_Int hypre_MGRSetLevelRestrictType( void *mgr_vdata, HYPRE_Int *restrictType ); HYPRE_Int hypre_MGRSetInterpType( void *mgr_vdata, HYPRE_Int interpType ); HYPRE_Int hypre_MGRSetLevelInterpType( void *mgr_vdata, HYPRE_Int *interpType ); HYPRE_Int hypre_MGRSetNumRelaxSweeps( void *mgr_vdata, HYPRE_Int nsweeps ); HYPRE_Int hypre_MGRSetLevelNumRelaxSweeps( void *mgr_vdata, HYPRE_Int *nsweeps ); HYPRE_Int hypre_MGRSetNumInterpSweeps( void *mgr_vdata, HYPRE_Int nsweeps ); HYPRE_Int hypre_MGRSetNumRestrictSweeps( void *mgr_vdata, HYPRE_Int nsweeps ); HYPRE_Int hypre_MGRSetLevelSmoothType( void *mgr_vdata, HYPRE_Int *level_smooth_type ); HYPRE_Int hypre_MGRSetLevelSmoothIters( void *mgr_vdata, HYPRE_Int *level_smooth_iters ); HYPRE_Int hypre_MGRSetGlobalSmoothCycle( void *mgr_vdata, HYPRE_Int global_smooth_cycle ); HYPRE_Int hypre_MGRSetGlobalSmootherAtLevel( void *mgr_vdata, HYPRE_Solver smoother, HYPRE_Int level ); HYPRE_Int hypre_MGRSetPrintLevel( void *mgr_vdata, HYPRE_Int print_level ); HYPRE_Int hypre_MGRSetFrelaxPrintLevel( void *mgr_vdata, HYPRE_Int print_level ); HYPRE_Int hypre_MGRSetCoarseGridPrintLevel( void *mgr_vdata, HYPRE_Int print_level ); HYPRE_Int hypre_MGRSetTruncateCoarseGridThreshold( void *mgr_vdata, HYPRE_Real threshold ); HYPRE_Int hypre_MGRSetBlockJacobiBlockSize( void *mgr_vdata, HYPRE_Int blk_size ); HYPRE_Int hypre_MGRSetLogging( void *mgr_vdata, HYPRE_Int logging ); HYPRE_Int hypre_MGRSetMaxIter( void *mgr_vdata, HYPRE_Int max_iter ); HYPRE_Int hypre_MGRSetPMaxElmts( void *mgr_vdata, HYPRE_Int P_max_elmts ); HYPRE_Int hypre_MGRSetLevelPMaxElmts( void *mgr_vdata, HYPRE_Int *P_max_elmts ); HYPRE_Int hypre_MGRSetTol( void *mgr_vdata, HYPRE_Real tol ); HYPRE_Int hypre_MGRDataPrint(void *mgr_vdata); #ifdef HYPRE_USING_DSUPERLU void *hypre_MGRDirectSolverCreate( void ); HYPRE_Int hypre_MGRDirectSolverSetup( void *solver, hypre_ParCSRMatrix *A, hypre_ParVector *f, hypre_ParVector *u ); HYPRE_Int hypre_MGRDirectSolverSolve( void *solver, hypre_ParCSRMatrix *A, hypre_ParVector *f, hypre_ParVector *u ); HYPRE_Int hypre_MGRDirectSolverDestroy( void *solver ); #endif // Accessor functions HYPRE_Int hypre_MGRGetNumIterations( void *mgr_vdata, HYPRE_Int *num_iterations ); HYPRE_Int hypre_MGRGetFinalRelativeResidualNorm( void *mgr_vdata, HYPRE_Real *res_norm ); HYPRE_Int hypre_MGRGetCoarseGridConvergenceFactor( void *mgr_data, HYPRE_Real *conv_factor ); /* par_mgr_interp.c */ HYPRE_Int hypre_MGRBuildInterp( hypre_ParCSRMatrix *A, hypre_ParCSRMatrix *A_FF, hypre_ParCSRMatrix *A_FC, hypre_ParCSRMatrix *S, hypre_IntArray *CF_marker, HYPRE_BigInt *num_cpts_global, HYPRE_Real trunc_factor, HYPRE_Int max_elmts, HYPRE_Int block_jacobi_bsize, HYPRE_Int method, HYPRE_Int num_sweeps_post, hypre_ParCSRMatrix **Wp_ptr, hypre_ParCSRMatrix **P_ptr ); HYPRE_Int hypre_MGRBuildRestrict( hypre_ParCSRMatrix *A, hypre_ParCSRMatrix *A_FF, hypre_ParCSRMatrix *A_FC, hypre_ParCSRMatrix *A_CF, hypre_IntArray *CF_marker, HYPRE_BigInt *num_cpts_global, HYPRE_Real trunc_factor, HYPRE_Int max_elmts, HYPRE_Real strong_threshold, HYPRE_Real max_row_sum, HYPRE_Int blk_size, HYPRE_Int method, hypre_ParCSRMatrix **W_ptr, hypre_ParCSRMatrix **R_ptr, hypre_ParCSRMatrix **RT_ptr ); HYPRE_Int hypre_MGRBuildPFromWp( hypre_ParCSRMatrix *A, hypre_ParCSRMatrix *Wp, HYPRE_Int *CF_marker, hypre_ParCSRMatrix **P_ptr ); HYPRE_Int hypre_MGRBuildPFromWpHost( hypre_ParCSRMatrix *A, hypre_ParCSRMatrix *Wp, HYPRE_Int *CF_marker, hypre_ParCSRMatrix **P_ptr ); HYPRE_Int hypre_MGRBuildBlockJacobiWp( hypre_ParCSRMatrix *A_FF, hypre_ParCSRMatrix *A_FC, HYPRE_Int blk_size, hypre_ParCSRMatrix **Wp_ptr ); HYPRE_Int hypre_MGRBuildBlockJacobiP( hypre_ParCSRMatrix *A, hypre_ParCSRMatrix *A_FF, hypre_ParCSRMatrix *A_FC, hypre_ParCSRMatrix *Wp, HYPRE_Int blk_size, HYPRE_Int *CF_marker, hypre_ParCSRMatrix **P_ptr ); HYPRE_Int hypre_MGRBuildP( hypre_ParCSRMatrix *A, HYPRE_Int *CF_marker, HYPRE_BigInt *num_cpts_global, HYPRE_Int method, HYPRE_Int debug_flag, hypre_ParCSRMatrix **P_ptr ); HYPRE_Int hypre_MGRBuildPHost( hypre_ParCSRMatrix *A, hypre_ParCSRMatrix *A_FF, hypre_ParCSRMatrix *A_FC, HYPRE_Int *CF_marker, HYPRE_BigInt *num_cpts_global, HYPRE_Int method, hypre_ParCSRMatrix **Wp_ptr, hypre_ParCSRMatrix **P_ptr ); HYPRE_Int hypre_MGRBuildInterpApproximateInverse( hypre_ParCSRMatrix *A, HYPRE_Int *CF_marker, HYPRE_BigInt *num_cpts_global, hypre_ParCSRMatrix **P_ptr ); HYPRE_Int hypre_MGRTruncateAcfCPR( hypre_ParCSRMatrix *A_CF, hypre_ParCSRMatrix **A_CF_new_ptr ); HYPRE_Int hypre_MGRBuildRFromWr( hypre_IntArray *C_map, hypre_IntArray *F_map, HYPRE_BigInt global_num_rows_R, HYPRE_BigInt global_num_cols_R, HYPRE_BigInt *row_starts_R, HYPRE_BigInt *col_starts_R, hypre_ParCSRMatrix *Wr, hypre_ParCSRMatrix **R_ptr ); HYPRE_Int hypre_MGRBlockColLumpedRestrict( hypre_ParCSRMatrix *A, hypre_ParCSRMatrix *A_FF, hypre_ParCSRMatrix *A_CF, hypre_IntArray *CF_marker, HYPRE_Int blk_dim, hypre_ParCSRMatrix **Wr_ptr, hypre_ParCSRMatrix **R_ptr); HYPRE_Int hypre_MGRColLumpedRestrict(hypre_ParCSRMatrix *A, hypre_ParCSRMatrix *A_FF, hypre_ParCSRMatrix *A_CF, hypre_IntArray *CF_marker, hypre_ParCSRMatrix **Wr_ptr, hypre_ParCSRMatrix **R_ptr); /* par_mgr_rap.c */ HYPRE_Int hypre_MGRBuildCoarseOperator(void *mgr_data, hypre_ParCSRMatrix *A_FF, hypre_ParCSRMatrix *A_FC, hypre_ParCSRMatrix *A_CF, hypre_ParCSRMatrix **A_CC_ptr, hypre_ParCSRMatrix *Wp, hypre_ParCSRMatrix *Wr, HYPRE_Int level); /* par_mgr_coarsen.c */ HYPRE_Int hypre_MGRCoarseParms( MPI_Comm comm, HYPRE_Int num_rows, hypre_IntArray *CF_marker, HYPRE_BigInt *row_starts_cpts, HYPRE_BigInt *row_starts_fpts ); /* par_mgr_device.c */ HYPRE_Int hypre_MGRRelaxL1JacobiDevice( hypre_ParCSRMatrix *A, hypre_ParVector *f, HYPRE_Int *CF_marker_host, HYPRE_Int relax_points, HYPRE_Real relax_weight, HYPRE_Real *l1_norms, hypre_ParVector *u, hypre_ParVector *Vtemp ); HYPRE_Int hypre_MGRBuildPFromWpDevice( hypre_ParCSRMatrix *A, hypre_ParCSRMatrix *Wp, HYPRE_Int *CF_marker, hypre_ParCSRMatrix **P_ptr); HYPRE_Int hypre_MGRBuildPDevice( hypre_ParCSRMatrix *A, HYPRE_Int *CF_marker, HYPRE_BigInt *num_cpts_global, HYPRE_Int method, hypre_ParCSRMatrix **P_ptr ); HYPRE_Int hypre_ParCSRMatrixExtractBlockDiagDevice( hypre_ParCSRMatrix *A, HYPRE_Int blk_size, HYPRE_Int num_points, HYPRE_Int point_type, HYPRE_Int *CF_marker, HYPRE_Int diag_size, HYPRE_Int diag_type, HYPRE_Int *B_diag_i, HYPRE_Int *B_diag_j, HYPRE_Complex *B_diag_data ); HYPRE_Int hypre_ParCSRMatrixBlockDiagMatrixDevice( hypre_ParCSRMatrix *A, HYPRE_Int blk_size, HYPRE_Int point_type, HYPRE_Int *CF_marker, HYPRE_Int diag_type, hypre_ParCSRMatrix **B_ptr ); /* par_mgr_stats.c */ HYPRE_Int hypre_MGRSetupStats( void *mgr_vdata ); /* par_ilu.c */ void *hypre_ILUCreate ( void ); HYPRE_Int hypre_ILUDestroy ( void *ilu_vdata ); HYPRE_Int hypre_ILUSetLevelOfFill( void *ilu_vdata, HYPRE_Int lfil ); HYPRE_Int hypre_ILUSetMaxNnzPerRow( void *ilu_vdata, HYPRE_Int nzmax ); HYPRE_Int hypre_ILUSetDropThreshold( void *ilu_vdata, HYPRE_Real threshold ); HYPRE_Int hypre_ILUSetDropThresholdArray( void *ilu_vdata, HYPRE_Real *threshold ); HYPRE_Int hypre_ILUSetType( void *ilu_vdata, HYPRE_Int ilu_type ); HYPRE_Int hypre_ILUSetMaxIter( void *ilu_vdata, HYPRE_Int max_iter ); HYPRE_Int hypre_ILUSetTol( void *ilu_vdata, HYPRE_Real tol ); HYPRE_Int hypre_ILUSetIterativeSetupType( void *ilu_vdata, HYPRE_Int iter_setup_type ); HYPRE_Int hypre_ILUSetIterativeSetupOption( void *ilu_vdata, HYPRE_Int iter_setup_option ); HYPRE_Int hypre_ILUSetIterativeSetupMaxIter( void *ilu_vdata, HYPRE_Int iter_setup_max_iter ); HYPRE_Int hypre_ILUSetIterativeSetupTolerance( void *ilu_vdata, HYPRE_Real iter_setup_tolerance ); HYPRE_Int hypre_ILUGetIterativeSetupHistory( void *ilu_vdata, HYPRE_Complex **iter_setup_history ); HYPRE_Int hypre_ILUSetTriSolve( void *ilu_vdata, HYPRE_Int tri_solve ); HYPRE_Int hypre_ILUSetLowerJacobiIters( void *ilu_vdata, HYPRE_Int lower_jacobi_iters ); HYPRE_Int hypre_ILUSetUpperJacobiIters( void *ilu_vdata, HYPRE_Int upper_jacobi_iters ); HYPRE_Int hypre_ILUSetPrintLevel( void *ilu_vdata, HYPRE_Int print_level ); HYPRE_Int hypre_ILUSetLogging( void *ilu_vdata, HYPRE_Int logging ); HYPRE_Int hypre_ILUSetLocalReordering( void *ilu_vdata, HYPRE_Int ordering_type ); HYPRE_Int hypre_ILUSetSchurSolverMaxIter( void *ilu_vdata, HYPRE_Int ss_max_iter ); HYPRE_Int hypre_ILUSetSchurSolverTol( void *ilu_vdata, HYPRE_Real ss_tol ); HYPRE_Int hypre_ILUSetSchurSolverAbsoluteTol( void *ilu_vdata, HYPRE_Real ss_absolute_tol ); HYPRE_Int hypre_ILUSetSchurSolverLogging( void *ilu_vdata, HYPRE_Int ss_logging ); HYPRE_Int hypre_ILUSetSchurSolverPrintLevel( void *ilu_vdata, HYPRE_Int ss_print_level ); HYPRE_Int hypre_ILUSetSchurSolverRelChange( void *ilu_vdata, HYPRE_Int ss_rel_change ); HYPRE_Int hypre_ILUSetSchurPrecondILUType( void *ilu_vdata, HYPRE_Int sp_ilu_type ); HYPRE_Int hypre_ILUSetSchurPrecondILULevelOfFill( void *ilu_vdata, HYPRE_Int sp_ilu_lfil ); HYPRE_Int hypre_ILUSetSchurPrecondILUMaxNnzPerRow( void *ilu_vdata, HYPRE_Int sp_ilu_max_row_nnz ); HYPRE_Int hypre_ILUSetSchurPrecondILUDropThreshold( void *ilu_vdata, HYPRE_Real sp_ilu_droptol ); HYPRE_Int hypre_ILUSetSchurPrecondILUDropThresholdArray( void *ilu_vdata, HYPRE_Real *sp_ilu_droptol ); HYPRE_Int hypre_ILUSetSchurPrecondPrintLevel( void *ilu_vdata, HYPRE_Int sp_print_level ); HYPRE_Int hypre_ILUSetSchurPrecondMaxIter( void *ilu_vdata, HYPRE_Int sp_max_iter ); HYPRE_Int hypre_ILUSetSchurPrecondTriSolve( void *ilu_vdata, HYPRE_Int sp_tri_solve ); HYPRE_Int hypre_ILUSetSchurPrecondLowerJacobiIters( void *ilu_vdata, HYPRE_Int sp_lower_jacobi_iters ); HYPRE_Int hypre_ILUSetSchurPrecondUpperJacobiIters( void *ilu_vdata, HYPRE_Int sp_upper_jacobi_iters ); HYPRE_Int hypre_ILUSetSchurPrecondTol( void *ilu_vdata, HYPRE_Int sp_tol ); HYPRE_Int hypre_ILUSetSchurNSHDropThreshold( void *ilu_vdata, HYPRE_Real threshold ); HYPRE_Int hypre_ILUSetSchurNSHDropThresholdArray( void *ilu_vdata, HYPRE_Real *threshold ); HYPRE_Int hypre_ILUGetNumIterations( void *ilu_vdata, HYPRE_Int *num_iterations ); HYPRE_Int hypre_ILUGetFinalRelativeResidualNorm( void *ilu_vdata, HYPRE_Real *res_norm ); HYPRE_Int hypre_ILUWriteSolverParams( void *ilu_vdata ); HYPRE_Int hypre_ILUMinHeapAddI( HYPRE_Int *heap, HYPRE_Int len ); HYPRE_Int hypre_ILUMinHeapAddIIIi( HYPRE_Int *heap, HYPRE_Int *I1, HYPRE_Int *Ii1, HYPRE_Int len ); HYPRE_Int hypre_ILUMinHeapAddIRIi( HYPRE_Int *heap, HYPRE_Real *I1, HYPRE_Int *Ii1, HYPRE_Int len ); HYPRE_Int hypre_ILUMaxrHeapAddRabsI( HYPRE_Real *heap, HYPRE_Int *I1, HYPRE_Int len ); HYPRE_Int hypre_ILUMinHeapRemoveI( HYPRE_Int *heap, HYPRE_Int len ); HYPRE_Int hypre_ILUMinHeapRemoveIIIi( HYPRE_Int *heap, HYPRE_Int *I1, HYPRE_Int *Ii1, HYPRE_Int len ); HYPRE_Int hypre_ILUMinHeapRemoveIRIi( HYPRE_Int *heap, HYPRE_Real *I1, HYPRE_Int *Ii1, HYPRE_Int len ); HYPRE_Int hypre_ILUMaxrHeapRemoveRabsI( HYPRE_Real *heap, HYPRE_Int *I1, HYPRE_Int len ); HYPRE_Int hypre_ILUMaxQSplitRabsI( HYPRE_Real *arrayR, HYPRE_Int *arrayI, HYPRE_Int left, HYPRE_Int bound, HYPRE_Int right ); HYPRE_Int hypre_ILUMaxRabs( HYPRE_Real *array_data, HYPRE_Int *array_j, HYPRE_Int start, HYPRE_Int end, HYPRE_Int nLU, HYPRE_Int *rperm, HYPRE_Real *value, HYPRE_Int *index, HYPRE_Real *l1_norm, HYPRE_Int *nnz ); HYPRE_Int hypre_ILUGetPermddPQPre( HYPRE_Int n, HYPRE_Int nLU, HYPRE_Int *A_diag_i, HYPRE_Int *A_diag_j, HYPRE_Real *A_diag_data, HYPRE_Real tol, HYPRE_Int *perm, HYPRE_Int *rperm, HYPRE_Int *pperm_pre, HYPRE_Int *qperm_pre, HYPRE_Int *nB ); HYPRE_Int hypre_ILUGetPermddPQ( hypre_ParCSRMatrix *A, HYPRE_Int **io_pperm, HYPRE_Int **io_qperm, HYPRE_Real tol, HYPRE_Int *nB, HYPRE_Int *nI, HYPRE_Int reordering_type ); HYPRE_Int hypre_ILUGetInteriorExteriorPerm( hypre_ParCSRMatrix *A, HYPRE_MemoryLocation memory_location, HYPRE_Int **perm, HYPRE_Int *nLU, HYPRE_Int reordering_type ); HYPRE_Int hypre_ILUGetLocalPerm( hypre_ParCSRMatrix *A, HYPRE_Int **perm_ptr, HYPRE_Int *nLU, HYPRE_Int reordering_type ); HYPRE_Int hypre_ILUBuildRASExternalMatrix( hypre_ParCSRMatrix *A, HYPRE_Int *rperm, HYPRE_Int **E_i, HYPRE_Int **E_j, HYPRE_Real **E_data ); HYPRE_Int hypre_ILUSortOffdColmap( hypre_ParCSRMatrix *A ); HYPRE_Int hypre_ILULocalRCMBuildFinalPerm( HYPRE_Int start, HYPRE_Int end, HYPRE_Int * G_perm, HYPRE_Int *perm, HYPRE_Int *qperm, HYPRE_Int **permp, HYPRE_Int **qpermp ); HYPRE_Int hypre_ILULocalRCM( hypre_CSRMatrix *A, HYPRE_Int start, HYPRE_Int end, HYPRE_Int **permp, HYPRE_Int **qpermp, HYPRE_Int sym ); HYPRE_Int hypre_ILULocalRCMMindegree( HYPRE_Int n, HYPRE_Int *degree, HYPRE_Int *marker, HYPRE_Int *rootp ); HYPRE_Int hypre_ILULocalRCMOrder( hypre_CSRMatrix *A, HYPRE_Int *perm ); HYPRE_Int hypre_ILULocalRCMFindPPNode( hypre_CSRMatrix *A, HYPRE_Int *rootp, HYPRE_Int *marker ); HYPRE_Int hypre_ILULocalRCMBuildLevel( hypre_CSRMatrix *A, HYPRE_Int root, HYPRE_Int *marker, HYPRE_Int *level_i, HYPRE_Int *level_j, HYPRE_Int *nlevp ); HYPRE_Int hypre_ILULocalRCMNumbering( hypre_CSRMatrix *A, HYPRE_Int root, HYPRE_Int *marker, HYPRE_Int *perm, HYPRE_Int *current_nump ); HYPRE_Int hypre_ILULocalRCMQsort( HYPRE_Int *perm, HYPRE_Int start, HYPRE_Int end, HYPRE_Int *degree ); HYPRE_Int hypre_ILULocalRCMReverse( HYPRE_Int *perm, HYPRE_Int start, HYPRE_Int end ); #if defined(HYPRE_USING_GPU) HYPRE_Int hypre_ParILUSchurGMRESDummySolveDevice( void *ilu_vdata, void *ilu_vdata2, hypre_ParVector *f, hypre_ParVector *u ); HYPRE_Int hypre_ParILUSchurGMRESCommInfoDevice( void *ilu_vdata, HYPRE_Int *my_id, HYPRE_Int *num_procs ); HYPRE_Int hypre_ParILURAPSchurGMRESSolveDevice( void *ilu_vdata, void *ilu_vdata2, hypre_ParVector *par_f, hypre_ParVector *par_u ); HYPRE_Int hypre_ParILURAPSchurGMRESMatvecDevice( void *matvec_data, HYPRE_Complex alpha, void *ilu_vdata, void *x, HYPRE_Complex beta, void *y ); #endif HYPRE_Int hypre_ParILURAPSchurGMRESCommInfoHost( void *ilu_vdata, HYPRE_Int *my_id, HYPRE_Int *num_procs ); HYPRE_Int hypre_ParILURAPSchurGMRESSolveHost( void *ilu_vdata, void *ilu_vdata2, hypre_ParVector *f, hypre_ParVector *u ); HYPRE_Int hypre_ParILURAPSchurGMRESMatvecHost( void *matvec_data, HYPRE_Complex alpha, void *ilu_vdata, void *x, HYPRE_Complex beta, void *y ); void * hypre_NSHCreate( void ); HYPRE_Int hypre_NSHDestroy( void *data ); HYPRE_Int hypre_NSHWriteSolverParams( void *nsh_vdata ); HYPRE_Int hypre_NSHSetPrintLevel( void *nsh_vdata, HYPRE_Int print_level ); HYPRE_Int hypre_NSHSetLogging( void *nsh_vdata, HYPRE_Int logging ); HYPRE_Int hypre_NSHSetMaxIter( void *nsh_vdata, HYPRE_Int max_iter ); HYPRE_Int hypre_NSHSetTol( void *nsh_vdata, HYPRE_Real tol ); HYPRE_Int hypre_NSHSetGlobalSolver( void *nsh_vdata, HYPRE_Int global_solver ); HYPRE_Int hypre_NSHSetDropThreshold( void *nsh_vdata, HYPRE_Real droptol ); HYPRE_Int hypre_NSHSetDropThresholdArray( void *nsh_vdata, HYPRE_Real *droptol ); HYPRE_Int hypre_NSHSetMRMaxIter( void *nsh_vdata, HYPRE_Int mr_max_iter ); HYPRE_Int hypre_NSHSetMRTol( void *nsh_vdata, HYPRE_Real mr_tol ); HYPRE_Int hypre_NSHSetMRMaxRowNnz( void *nsh_vdata, HYPRE_Int mr_max_row_nnz ); HYPRE_Int hypre_NSHSetColVersion( void *nsh_vdata, HYPRE_Int mr_col_version ); HYPRE_Int hypre_NSHSetNSHMaxIter( void *nsh_vdata, HYPRE_Int nsh_max_iter ); HYPRE_Int hypre_NSHSetNSHTol( void *nsh_vdata, HYPRE_Real nsh_tol ); HYPRE_Int hypre_NSHSetNSHMaxRowNnz( void *nsh_vdata, HYPRE_Int nsh_max_row_nnz ); HYPRE_Int hypre_CSRMatrixNormFro( hypre_CSRMatrix *A, HYPRE_Real *norm_io); HYPRE_Int hypre_CSRMatrixResNormFro( hypre_CSRMatrix *A, HYPRE_Real *norm_io); HYPRE_Int hypre_ParCSRMatrixNormFro( hypre_ParCSRMatrix *A, HYPRE_Real *norm_io); HYPRE_Int hypre_ParCSRMatrixResNormFro( hypre_ParCSRMatrix *A, HYPRE_Real *norm_io); HYPRE_Int hypre_CSRMatrixTrace( hypre_CSRMatrix *A, HYPRE_Real *trace_io); HYPRE_Int hypre_CSRMatrixDropInplace( hypre_CSRMatrix *A, HYPRE_Real droptol, HYPRE_Int max_row_nnz ); HYPRE_Int hypre_ILUCSRMatrixInverseSelfPrecondMRGlobal( hypre_CSRMatrix *matA, hypre_CSRMatrix **M, HYPRE_Real droptol, HYPRE_Real tol, HYPRE_Real eps_tol, HYPRE_Int max_row_nnz, HYPRE_Int max_iter, HYPRE_Int print_level ); HYPRE_Int hypre_ILUParCSRInverseNSH( hypre_ParCSRMatrix *A, hypre_ParCSRMatrix **M, HYPRE_Real *droptol, HYPRE_Real mr_tol, HYPRE_Real nsh_tol, HYPRE_Real eps_tol, HYPRE_Int mr_max_row_nnz, HYPRE_Int nsh_max_row_nnz, HYPRE_Int mr_max_iter, HYPRE_Int nsh_max_iter, HYPRE_Int mr_col_version, HYPRE_Int print_level ); /* par_ilu_setup.c */ HYPRE_Int hypre_ILUSetup( void *ilu_vdata, hypre_ParCSRMatrix *A, hypre_ParVector *f, hypre_ParVector *u ); HYPRE_Int hypre_ParILUExtractEBFC( hypre_CSRMatrix *A_diag, HYPRE_Int nLU, hypre_CSRMatrix **Bp, hypre_CSRMatrix **Cp, hypre_CSRMatrix **Ep, hypre_CSRMatrix **Fp ); HYPRE_Int hypre_ParILURAPReorder( hypre_ParCSRMatrix *A, HYPRE_Int *perm, HYPRE_Int *rqperm, hypre_ParCSRMatrix **A_pq ); HYPRE_Int hypre_ILUSetupLDUtoCusparse( hypre_ParCSRMatrix *L, HYPRE_Real *D, hypre_ParCSRMatrix *U, hypre_ParCSRMatrix **LDUp ); HYPRE_Int hypre_ILUSetupRAPMILU0( hypre_ParCSRMatrix *A, hypre_ParCSRMatrix **ALUp, HYPRE_Int modified ); HYPRE_Int hypre_ILUSetupRAPILU0Device( hypre_ParCSRMatrix *A, HYPRE_Int *perm, HYPRE_Int n, HYPRE_Int nLU, hypre_ParCSRMatrix **Apermptr, hypre_ParCSRMatrix **matSptr, hypre_CSRMatrix **ALUptr, hypre_CSRMatrix **BLUptr, hypre_CSRMatrix **CLUptr, hypre_CSRMatrix **Eptr, hypre_CSRMatrix **Fptr, HYPRE_Int test_opt ); HYPRE_Int hypre_ILUSetupRAPILU0( hypre_ParCSRMatrix *A, HYPRE_Int *perm, HYPRE_Int n, HYPRE_Int nLU, hypre_ParCSRMatrix **Lptr, HYPRE_Real **Dptr, hypre_ParCSRMatrix **Uptr, hypre_ParCSRMatrix **mLptr, HYPRE_Real **mDptr, hypre_ParCSRMatrix **mUptr, HYPRE_Int **u_end ); HYPRE_Int hypre_ILUSetupILU0( hypre_ParCSRMatrix *A, HYPRE_Int *perm, HYPRE_Int *qperm, HYPRE_Int nLU, HYPRE_Int nI, hypre_ParCSRMatrix **Lptr, HYPRE_Real **Dptr, hypre_ParCSRMatrix **Uptr, hypre_ParCSRMatrix **Sptr, HYPRE_Int **u_end ); HYPRE_Int hypre_ILUSetupMILU0( hypre_ParCSRMatrix *A, HYPRE_Int *permp, HYPRE_Int *qpermp, HYPRE_Int nLU, HYPRE_Int nI, hypre_ParCSRMatrix **Lptr, HYPRE_Real **Dptr, hypre_ParCSRMatrix **Uptr, hypre_ParCSRMatrix **Sptr, HYPRE_Int **u_end, HYPRE_Int modified ); HYPRE_Int hypre_ILUSetupILUKSymbolic( HYPRE_Int n, HYPRE_Int *A_diag_i, HYPRE_Int *A_diag_j, HYPRE_Int lfil, HYPRE_Int *perm, HYPRE_Int *rperm, HYPRE_Int *iw, HYPRE_Int nLU, HYPRE_Int *L_diag_i, HYPRE_Int *U_diag_i, HYPRE_Int *S_diag_i, HYPRE_Int **L_diag_j, HYPRE_Int **U_diag_j, HYPRE_Int **S_diag_j, HYPRE_Int **u_end ); HYPRE_Int hypre_ILUSetupILUK( hypre_ParCSRMatrix *A, HYPRE_Int lfil, HYPRE_Int *permp, HYPRE_Int *qpermp, HYPRE_Int nLU, HYPRE_Int nI, hypre_ParCSRMatrix **Lptr, HYPRE_Real **Dptr, hypre_ParCSRMatrix **Uptr, hypre_ParCSRMatrix **Sptr, HYPRE_Int **u_end ); HYPRE_Int hypre_ILUSetupILUT( hypre_ParCSRMatrix *A, HYPRE_Int lfil, HYPRE_Real *tol, HYPRE_Int *permp, HYPRE_Int *qpermp, HYPRE_Int nLU, HYPRE_Int nI, hypre_ParCSRMatrix **Lptr, HYPRE_Real **Dptr, hypre_ParCSRMatrix **Uptr, hypre_ParCSRMatrix **Sptr, HYPRE_Int **u_end ); HYPRE_Int hypre_NSHSetup( void *nsh_vdata, hypre_ParCSRMatrix *A, hypre_ParVector *f, hypre_ParVector *u ); HYPRE_Int hypre_ILUSetupILU0RAS( hypre_ParCSRMatrix *A, HYPRE_Int *perm, HYPRE_Int nLU, hypre_ParCSRMatrix **Lptr, HYPRE_Real **Dptr, hypre_ParCSRMatrix **Uptr ); HYPRE_Int hypre_ILUSetupILUKRASSymbolic( HYPRE_Int n, HYPRE_Int *A_diag_i, HYPRE_Int *A_diag_j, HYPRE_Int *A_offd_i, HYPRE_Int *A_offd_j, HYPRE_Int *E_i, HYPRE_Int *E_j, HYPRE_Int ext, HYPRE_Int lfil, HYPRE_Int *perm, HYPRE_Int *rperm, HYPRE_Int *iw, HYPRE_Int nLU, HYPRE_Int *L_diag_i, HYPRE_Int *U_diag_i, HYPRE_Int **L_diag_j, HYPRE_Int **U_diag_j ); HYPRE_Int hypre_ILUSetupILUKRAS( hypre_ParCSRMatrix *A, HYPRE_Int lfil, HYPRE_Int *perm, HYPRE_Int nLU, hypre_ParCSRMatrix **Lptr, HYPRE_Real **Dptr, hypre_ParCSRMatrix **Uptr ); HYPRE_Int hypre_ILUSetupILUTRAS( hypre_ParCSRMatrix *A, HYPRE_Int lfil, HYPRE_Real *tol, HYPRE_Int *perm, HYPRE_Int nLU, hypre_ParCSRMatrix **Lptr, HYPRE_Real **Dptr, hypre_ParCSRMatrix **Uptr ); /* par_ilu_setup_device.c */ #if defined(HYPRE_USING_GPU) HYPRE_Int hypre_ILUSetupDevice(hypre_ParILUData *ilu_data, hypre_ParCSRMatrix *A, HYPRE_Int *perm_data, HYPRE_Int *qperm_data, HYPRE_Int n, HYPRE_Int nLU, hypre_CSRMatrix **BLUptr, hypre_ParCSRMatrix **matSptr, hypre_CSRMatrix **Eptr, hypre_CSRMatrix **Fptr); HYPRE_Int hypre_ILUSetupIterativeILU0Device( hypre_CSRMatrix *A, HYPRE_Int type, HYPRE_Int option, HYPRE_Int max_iter, HYPRE_Real tolerance, HYPRE_Int *num_iter_ptr, HYPRE_Real **history_ptr ); #endif /* par_ilu_solve.c */ HYPRE_Int hypre_ILUSolve( void *ilu_vdata, hypre_ParCSRMatrix *A, hypre_ParVector *f, hypre_ParVector *u ); HYPRE_Int hypre_ILUSolveSchurGMRES( hypre_ParCSRMatrix *A, hypre_ParVector *f, hypre_ParVector *u, HYPRE_Int *perm, HYPRE_Int *qperm, HYPRE_Int nLU, hypre_ParCSRMatrix *L, HYPRE_Real *D, hypre_ParCSRMatrix *U, hypre_ParCSRMatrix *S, hypre_ParVector *ftemp, hypre_ParVector *utemp, HYPRE_Solver schur_solver, HYPRE_Solver schur_precond, hypre_ParVector *rhs, hypre_ParVector *x, HYPRE_Int *u_end ); HYPRE_Int hypre_ILUSolveSchurNSH( hypre_ParCSRMatrix *A, hypre_ParVector *f, hypre_ParVector *u, HYPRE_Int *perm, HYPRE_Int nLU, hypre_ParCSRMatrix *L, HYPRE_Real *D, hypre_ParCSRMatrix *U, hypre_ParCSRMatrix *S, hypre_ParVector *ftemp, hypre_ParVector *utemp, HYPRE_Solver schur_solver, hypre_ParVector *rhs, hypre_ParVector *x, HYPRE_Int *u_end ); HYPRE_Int hypre_ILUSolveLU( hypre_ParCSRMatrix *A, hypre_ParVector *f, hypre_ParVector *u, HYPRE_Int *perm, HYPRE_Int nLU, hypre_ParCSRMatrix *L, HYPRE_Real *D, hypre_ParCSRMatrix *U, hypre_ParVector *ftemp, hypre_ParVector *utemp ); HYPRE_Int hypre_ILUSolveLUIter( hypre_ParCSRMatrix *A, hypre_ParVector *f, hypre_ParVector *u, HYPRE_Int *perm, HYPRE_Int nLU, hypre_ParCSRMatrix *L, HYPRE_Real *D, hypre_ParCSRMatrix *U, hypre_ParVector *ftemp, hypre_ParVector *utemp, HYPRE_Int lower_jacobi_iters, HYPRE_Int upper_jacobi_iters ); HYPRE_Int hypre_ILUSolveLURAS( hypre_ParCSRMatrix *A, hypre_ParVector *f, hypre_ParVector *u, HYPRE_Int *perm, hypre_ParCSRMatrix *L, HYPRE_Real *D, hypre_ParCSRMatrix *U, hypre_ParVector *ftemp, hypre_ParVector *utemp, HYPRE_Real *fext, HYPRE_Real *uext ); HYPRE_Int hypre_ILUSolveRAPGMRESHost( hypre_ParCSRMatrix *A, hypre_ParVector *f, hypre_ParVector *u, HYPRE_Int *perm, HYPRE_Int nLU, hypre_ParCSRMatrix *L, HYPRE_Real *D, hypre_ParCSRMatrix *U, hypre_ParCSRMatrix *mL, HYPRE_Real *mD, hypre_ParCSRMatrix *mU, hypre_ParVector *ftemp, hypre_ParVector *utemp, hypre_ParVector *xtemp, hypre_ParVector *ytemp, HYPRE_Solver schur_solver, HYPRE_Solver schur_precond, hypre_ParVector *rhs, hypre_ParVector *x, HYPRE_Int *u_end ); HYPRE_Int hypre_NSHSolve( void *nsh_vdata, hypre_ParCSRMatrix *A, hypre_ParVector *f, hypre_ParVector *u ); HYPRE_Int hypre_NSHSolveInverse( hypre_ParCSRMatrix *A, hypre_ParVector *f, hypre_ParVector *u, hypre_ParCSRMatrix *M, hypre_ParVector *ftemp, hypre_ParVector *utemp ); /* par_ilu_solve_device.c */ #if defined(HYPRE_USING_GPU) HYPRE_Int hypre_ILUSolveLUDevice( hypre_ParCSRMatrix *A, hypre_CSRMatrix *matLU_d, hypre_ParVector *f, hypre_ParVector *u, HYPRE_Int *perm, hypre_ParVector *ftemp, hypre_ParVector *utemp ); HYPRE_Int hypre_ILUApplyLowerJacIterDevice( hypre_CSRMatrix *A, hypre_Vector *input, hypre_Vector *work, hypre_Vector *output, HYPRE_Int lower_jacobi_iters ); HYPRE_Int hypre_ILUApplyUpperJacIterDevice( hypre_CSRMatrix *A, hypre_Vector *input, hypre_Vector *work, hypre_Vector *output, hypre_Vector *diag, HYPRE_Int upper_jacobi_iters ); HYPRE_Int hypre_ILUApplyLowerUpperJacIterDevice( hypre_CSRMatrix *A, hypre_Vector *work1, hypre_Vector *work2, hypre_Vector *inout, hypre_Vector *diag, HYPRE_Int lower_jacobi_iters, HYPRE_Int upper_jacobi_iters ); HYPRE_Int hypre_ILUSolveLUIterDevice( hypre_ParCSRMatrix *A, hypre_CSRMatrix *matLU, hypre_ParVector *f, hypre_ParVector *u, HYPRE_Int *perm, hypre_ParVector *ftemp, hypre_ParVector *utemp, hypre_ParVector *xtemp, hypre_Vector **diag_ptr, HYPRE_Int lower_jacobi_iters, HYPRE_Int upper_jacobi_iters ); HYPRE_Int hypre_ParILUSchurGMRESMatvecDevice( void *matvec_data, HYPRE_Complex alpha, void *ilu_vdata, void *x, HYPRE_Complex beta, void *y ); HYPRE_Int hypre_ILUSolveSchurGMRESDevice( hypre_ParCSRMatrix *A, hypre_ParVector *f, hypre_ParVector *u, HYPRE_Int *perm, HYPRE_Int nLU, hypre_ParCSRMatrix *S, hypre_ParVector *ftemp, hypre_ParVector *utemp, HYPRE_Solver schur_solver, HYPRE_Solver schur_precond, hypre_ParVector *rhs, hypre_ParVector *x, HYPRE_Int *u_end, hypre_CSRMatrix *matBLU_d, hypre_CSRMatrix *matE_d, hypre_CSRMatrix *matF_d ); HYPRE_Int hypre_ILUSolveSchurGMRESJacIterDevice( hypre_ParCSRMatrix *A, hypre_ParVector *f, hypre_ParVector *u, HYPRE_Int *perm, HYPRE_Int nLU, hypre_ParCSRMatrix *S, hypre_ParVector *ftemp, hypre_ParVector *utemp, HYPRE_Solver schur_solver, HYPRE_Solver schur_precond, hypre_ParVector *rhs, hypre_ParVector *x, HYPRE_Int *u_end, hypre_CSRMatrix *matBLU_d, hypre_CSRMatrix *matE_d, hypre_CSRMatrix *matF_d, hypre_ParVector *ztemp, hypre_Vector **Adiag_diag, hypre_Vector **Sdiag_diag, HYPRE_Int lower_jacobi_iters, HYPRE_Int upper_jacobi_iters ); HYPRE_Int hypre_ParILUSchurGMRESMatvecJacIterDevice( void *matvec_data, HYPRE_Complex alpha, void *ilu_vdata, void *x, HYPRE_Complex beta, void *y ); HYPRE_Int hypre_ILUSolveRAPGMRESDevice( hypre_ParCSRMatrix *A, hypre_ParVector *f, hypre_ParVector *u, HYPRE_Int *perm, HYPRE_Int nLU, hypre_ParCSRMatrix *S, hypre_ParVector *ftemp, hypre_ParVector *utemp, hypre_ParVector *xtemp, hypre_ParVector *ytemp, HYPRE_Solver schur_solver, HYPRE_Solver schur_precond, hypre_ParVector *rhs, hypre_ParVector *x, HYPRE_Int *u_end, hypre_ParCSRMatrix *Aperm, hypre_CSRMatrix *matALU_d, hypre_CSRMatrix *matBLU_d, hypre_CSRMatrix *matE_d, hypre_CSRMatrix *matF_d, HYPRE_Int test_opt ); #endif /* par_amgdd.c */ void *hypre_BoomerAMGDDCreate ( void ); HYPRE_Int hypre_BoomerAMGDDDestroy ( void *data ); HYPRE_Int hypre_BoomerAMGDDSetStartLevel ( void *data, HYPRE_Int start_level ); HYPRE_Int hypre_BoomerAMGDDGetStartLevel ( void *data, HYPRE_Int *start_level ); HYPRE_Int hypre_BoomerAMGDDSetFACNumCycles ( void *data, HYPRE_Int fac_num_cycles ); HYPRE_Int hypre_BoomerAMGDDGetFACNumCycles ( void *data, HYPRE_Int *fac_num_cycles ); HYPRE_Int hypre_BoomerAMGDDSetFACCycleType ( void *data, HYPRE_Int fac_cycle_type ); HYPRE_Int hypre_BoomerAMGDDGetFACCycleType ( void *data, HYPRE_Int *fac_cycle_type ); HYPRE_Int hypre_BoomerAMGDDSetFACNumRelax ( void *data, HYPRE_Int fac_num_relax ); HYPRE_Int hypre_BoomerAMGDDGetFACNumRelax ( void *data, HYPRE_Int *fac_num_relax ); HYPRE_Int hypre_BoomerAMGDDSetFACRelaxType ( void *data, HYPRE_Int fac_relax_type ); HYPRE_Int hypre_BoomerAMGDDGetFACRelaxType ( void *data, HYPRE_Int *fac_relax_type ); HYPRE_Int hypre_BoomerAMGDDSetFACRelaxWeight ( void *data, HYPRE_Real fac_relax_weight ); HYPRE_Int hypre_BoomerAMGDDGetFACRelaxWeight ( void *data, HYPRE_Real *fac_relax_weight ); HYPRE_Int hypre_BoomerAMGDDSetPadding ( void *data, HYPRE_Int padding ); HYPRE_Int hypre_BoomerAMGDDGetPadding ( void *data, HYPRE_Int *padding ); HYPRE_Int hypre_BoomerAMGDDSetNumGhostLayers ( void *data, HYPRE_Int num_ghost_layers ); HYPRE_Int hypre_BoomerAMGDDGetNumGhostLayers ( void *data, HYPRE_Int *num_ghost_layers ); HYPRE_Int hypre_BoomerAMGDDSetUserFACRelaxation( void *data, HYPRE_Int (*userFACRelaxation)( void *amgdd_vdata, HYPRE_Int level, HYPRE_Int cycle_param ) ); HYPRE_Int hypre_BoomerAMGDDGetAMG ( void *data, void **amg_solver ); /* par_amgdd_solve.c */ HYPRE_Int hypre_BoomerAMGDDSolve ( void *solver, hypre_ParCSRMatrix *A, hypre_ParVector *b, hypre_ParVector *x ); HYPRE_Int hypre_BoomerAMGDD_Cycle ( hypre_ParAMGDDData *amgdd_data ); HYPRE_Int hypre_BoomerAMGDD_ResidualCommunication ( hypre_ParAMGDDData *amgdd_data ); HYPRE_Complex* hypre_BoomerAMGDD_PackResidualBuffer ( hypre_AMGDDCompGrid **compGrid, hypre_AMGDDCommPkg *compGridCommPkg, HYPRE_Int current_level, HYPRE_Int proc ); HYPRE_Int hypre_BoomerAMGDD_UnpackResidualBuffer ( HYPRE_Complex *buffer, hypre_AMGDDCompGrid **compGrid, hypre_AMGDDCommPkg *compGridCommPkg, HYPRE_Int current_level, HYPRE_Int proc ); /* par_amgdd_setup.c */ HYPRE_Int hypre_BoomerAMGDDSetup ( void *amgdd_vdata, hypre_ParCSRMatrix *A, hypre_ParVector *b, hypre_ParVector *x ); /* par_amgdd_fac_cycle.c */ HYPRE_Int hypre_BoomerAMGDD_FAC ( void *amgdd_vdata, HYPRE_Int first_iteration ); HYPRE_Int hypre_BoomerAMGDD_FAC_Cycle ( void *amgdd_vdata, HYPRE_Int level, HYPRE_Int cycle_type, HYPRE_Int first_iteration ); HYPRE_Int hypre_BoomerAMGDD_FAC_FCycle ( void *amgdd_vdata, HYPRE_Int first_iteration ); HYPRE_Int hypre_BoomerAMGDD_FAC_Interpolate ( hypre_AMGDDCompGrid *compGrid_f, hypre_AMGDDCompGrid *compGrid_c ); HYPRE_Int hypre_BoomerAMGDD_FAC_Restrict ( hypre_AMGDDCompGrid *compGrid_f, hypre_AMGDDCompGrid *compGrid_c, HYPRE_Int first_iteration ); HYPRE_Int hypre_BoomerAMGDD_FAC_Relax ( void *amgdd_vdata, HYPRE_Int level, HYPRE_Int cycle_param ); HYPRE_Int hypre_BoomerAMGDD_FAC_CFL1JacobiHost ( void *amgdd_vdata, HYPRE_Int level, HYPRE_Int relax_set ); HYPRE_Int hypre_BoomerAMGDD_FAC_Jacobi ( void *amgdd_vdata, HYPRE_Int level, HYPRE_Int cycle_param ); HYPRE_Int hypre_BoomerAMGDD_FAC_JacobiHost ( void *amgdd_vdata, HYPRE_Int level ); HYPRE_Int hypre_BoomerAMGDD_FAC_GaussSeidel ( void *amgdd_vdata, HYPRE_Int level, HYPRE_Int cycle_param ); HYPRE_Int hypre_BoomerAMGDD_FAC_CFL1Jacobi ( void *amgdd_vdata, HYPRE_Int level, HYPRE_Int cycle_param ); HYPRE_Int hypre_BoomerAMGDD_FAC_OrderedGaussSeidel ( void *amgdd_vdata, HYPRE_Int level, HYPRE_Int cycle_param ); /* par_amgdd_fac_cycles_device.c */ HYPRE_Int hypre_BoomerAMGDD_FAC_JacobiDevice ( void *amgdd_vdata, HYPRE_Int level ); HYPRE_Int hypre_BoomerAMGDD_FAC_CFL1JacobiDevice ( void *amgdd_vdata, HYPRE_Int level, HYPRE_Int relax_set ); /* par_amgdd_comp_grid.c */ hypre_AMGDDCompGridMatrix* hypre_AMGDDCompGridMatrixCreate( void ); HYPRE_Int hypre_AMGDDCompGridMatrixDestroy ( hypre_AMGDDCompGridMatrix *matrix ); HYPRE_Int hypre_AMGDDCompGridMatvec ( HYPRE_Complex alpha, hypre_AMGDDCompGridMatrix *A, hypre_AMGDDCompGridVector *x, HYPRE_Complex beta, hypre_AMGDDCompGridVector *y ); HYPRE_Int hypre_AMGDDCompGridRealMatvec ( HYPRE_Complex alpha, hypre_AMGDDCompGridMatrix *A, hypre_AMGDDCompGridVector *x, HYPRE_Complex beta, hypre_AMGDDCompGridVector *y ); hypre_AMGDDCompGridVector* hypre_AMGDDCompGridVectorCreate( void ); HYPRE_Int hypre_AMGDDCompGridVectorInitialize ( hypre_AMGDDCompGridVector *vector, HYPRE_Int num_owned, HYPRE_Int num_nonowned, HYPRE_Int num_real ); HYPRE_Int hypre_AMGDDCompGridVectorDestroy ( hypre_AMGDDCompGridVector *vector ); HYPRE_Real hypre_AMGDDCompGridVectorInnerProd ( hypre_AMGDDCompGridVector *x, hypre_AMGDDCompGridVector *y ); HYPRE_Real hypre_AMGDDCompGridVectorRealInnerProd ( hypre_AMGDDCompGridVector *x, hypre_AMGDDCompGridVector *y ); HYPRE_Int hypre_AMGDDCompGridVectorScale ( HYPRE_Complex alpha, hypre_AMGDDCompGridVector *x ); HYPRE_Int hypre_AMGDDCompGridVectorRealScale ( HYPRE_Complex alpha, hypre_AMGDDCompGridVector *x ); HYPRE_Int hypre_AMGDDCompGridVectorAxpy ( HYPRE_Complex alpha, hypre_AMGDDCompGridVector *x, hypre_AMGDDCompGridVector *y ); HYPRE_Int hypre_AMGDDCompGridVectorRealAxpy ( HYPRE_Complex alpha, hypre_AMGDDCompGridVector *x, hypre_AMGDDCompGridVector *y ); HYPRE_Int hypre_AMGDDCompGridVectorSetConstantValues ( hypre_AMGDDCompGridVector *vector, HYPRE_Complex value ); HYPRE_Int hypre_AMGDDCompGridVectorRealSetConstantValues ( hypre_AMGDDCompGridVector *vector, HYPRE_Complex value ); HYPRE_Int hypre_AMGDDCompGridVectorCopy ( hypre_AMGDDCompGridVector *x, hypre_AMGDDCompGridVector *y ); HYPRE_Int hypre_AMGDDCompGridVectorRealCopy ( hypre_AMGDDCompGridVector *x, hypre_AMGDDCompGridVector *y ); hypre_AMGDDCompGrid *hypre_AMGDDCompGridCreate( void ); HYPRE_Int hypre_AMGDDCompGridDestroy ( hypre_AMGDDCompGrid *compGrid ); HYPRE_Int hypre_AMGDDCompGridInitialize ( hypre_ParAMGDDData *amgdd_data, HYPRE_Int padding, HYPRE_Int level ); HYPRE_Int hypre_AMGDDCompGridSetupRelax ( hypre_ParAMGDDData *amgdd_data ); HYPRE_Int hypre_AMGDDCompGridFinalize ( hypre_ParAMGDDData *amgdd_data ); HYPRE_Int hypre_AMGDDCompGridSetupRealDofMarker ( hypre_AMGDDCompGrid **compGrid, HYPRE_Int num_levels, HYPRE_Int num_ghost_layers ); HYPRE_Int hypre_AMGDDCompGridResize ( hypre_AMGDDCompGrid *compGrid, HYPRE_Int new_size, HYPRE_Int need_coarse_info ); HYPRE_Int hypre_AMGDDCompGridSetupLocalIndices ( hypre_AMGDDCompGrid **compGrid, HYPRE_Int *num_added_nodes, HYPRE_Int ****recv_map, HYPRE_Int num_recv_procs, HYPRE_Int **A_tmp_info, HYPRE_Int start_level, HYPRE_Int num_levels ); HYPRE_Int hypre_AMGDDCompGridSetupLocalIndicesP ( hypre_ParAMGDDData *amgdd_data ); hypre_AMGDDCommPkg *hypre_AMGDDCommPkgCreate ( HYPRE_Int num_levels ); HYPRE_Int hypre_AMGDDCommPkgSendLevelDestroy ( hypre_AMGDDCommPkg *amgddCommPkg, HYPRE_Int level, HYPRE_Int proc ); HYPRE_Int hypre_AMGDDCommPkgRecvLevelDestroy ( hypre_AMGDDCommPkg *amgddCommPkg, HYPRE_Int level, HYPRE_Int proc ); HYPRE_Int hypre_AMGDDCommPkgDestroy ( hypre_AMGDDCommPkg *compGridCommPkg ); HYPRE_Int hypre_AMGDDCommPkgFinalize ( hypre_ParAMGData* amg_data, hypre_AMGDDCommPkg *compGridCommPkg, hypre_AMGDDCompGrid **compGrid ); /* par_amgdd_helpers.c */ HYPRE_Int hypre_BoomerAMGDD_SetupNearestProcessorNeighbors ( hypre_ParCSRMatrix *A, hypre_AMGDDCommPkg *compGridCommPkg, HYPRE_Int level, HYPRE_Int *padding, HYPRE_Int num_ghost_layers ); HYPRE_Int hypre_BoomerAMGDD_RecursivelyBuildPsiComposite ( HYPRE_Int node, HYPRE_Int m, hypre_AMGDDCompGrid *compGrid, HYPRE_Int *add_flag, HYPRE_Int use_sort ); HYPRE_Int hypre_BoomerAMGDD_MarkCoarse ( HYPRE_Int *list, HYPRE_Int *marker, HYPRE_Int *owned_coarse_indices, HYPRE_Int *nonowned_coarse_indices, HYPRE_Int *sort_map, HYPRE_Int num_owned, HYPRE_Int total_num_nodes, HYPRE_Int num_owned_coarse, HYPRE_Int list_size, HYPRE_Int dist, HYPRE_Int use_sort, HYPRE_Int *nodes_to_add ); HYPRE_Int hypre_BoomerAMGDD_UnpackRecvBuffer ( hypre_ParAMGDDData *amgdd_data, HYPRE_Int *recv_buffer, HYPRE_Int **A_tmp_info, HYPRE_Int *recv_map_send_buffer_size, HYPRE_Int *nodes_added_on_level, HYPRE_Int current_level, HYPRE_Int buffer_number ); HYPRE_Int* hypre_BoomerAMGDD_PackSendBuffer ( hypre_ParAMGDDData *amgdd_data, HYPRE_Int proc, HYPRE_Int current_level, HYPRE_Int *padding, HYPRE_Int *send_flag_buffer_size ); HYPRE_Int hypre_BoomerAMGDD_PackRecvMapSendBuffer ( HYPRE_Int *recv_map_send_buffer, HYPRE_Int **recv_red_marker, HYPRE_Int *num_recv_nodes, HYPRE_Int *recv_buffer_size, HYPRE_Int current_level, HYPRE_Int num_levels ); HYPRE_Int hypre_BoomerAMGDD_UnpackSendFlagBuffer ( hypre_AMGDDCompGrid **compGrid, HYPRE_Int *send_flag_buffer, HYPRE_Int **send_flag, HYPRE_Int *num_send_nodes, HYPRE_Int *send_buffer_size, HYPRE_Int current_level, HYPRE_Int num_levels ); HYPRE_Int hypre_BoomerAMGDD_CommunicateRemainingMatrixInfo ( hypre_ParAMGDDData* amgdd_data ); HYPRE_Int hypre_BoomerAMGDD_FixUpRecvMaps ( hypre_AMGDDCompGrid **compGrid, hypre_AMGDDCommPkg *compGridCommPkg, HYPRE_Int start_level, HYPRE_Int num_levels ); /* par_fsai.c */ void* hypre_FSAICreate( void ); HYPRE_Int hypre_FSAIDestroy ( void *data ); HYPRE_Int hypre_FSAISetAlgoType ( void *data, HYPRE_Int algo_type ); HYPRE_Int hypre_FSAISetLocalSolveType ( void *data, HYPRE_Int local_solve_type ); HYPRE_Int hypre_FSAISetMaxSteps ( void *data, HYPRE_Int max_steps ); HYPRE_Int hypre_FSAISetMaxStepSize ( void *data, HYPRE_Int max_step_size ); HYPRE_Int hypre_FSAISetMaxNnzRow ( void *data, HYPRE_Int max_nnz_row ); HYPRE_Int hypre_FSAISetNumLevels ( void *data, HYPRE_Int num_levels ); HYPRE_Int hypre_FSAISetThreshold ( void *data, HYPRE_Real threshold ); HYPRE_Int hypre_FSAISetKapTolerance ( void *data, HYPRE_Real kap_tolerance ); HYPRE_Int hypre_FSAISetMaxIterations ( void *data, HYPRE_Int max_iterations ); HYPRE_Int hypre_FSAISetEigMaxIters ( void *data, HYPRE_Int eig_max_iters ); HYPRE_Int hypre_FSAISetZeroGuess ( void *data, HYPRE_Int zero_guess ); HYPRE_Int hypre_FSAISetTolerance ( void *data, HYPRE_Real tolerance ); HYPRE_Int hypre_FSAISetOmega ( void *data, HYPRE_Real omega ); HYPRE_Int hypre_FSAISetLogging ( void *data, HYPRE_Int logging ); HYPRE_Int hypre_FSAISetNumIterations ( void *data, HYPRE_Int num_iterations ); HYPRE_Int hypre_FSAISetPrintLevel ( void *data, HYPRE_Int print_level ); HYPRE_Int hypre_FSAIGetAlgoType ( void *data, HYPRE_Int *algo_type ); HYPRE_Int hypre_FSAIGetLocalSolveType ( void *data, HYPRE_Int *local_solve_type ); HYPRE_Int hypre_FSAIGetMaxSteps ( void *data, HYPRE_Int *max_steps ); HYPRE_Int hypre_FSAIGetMaxStepSize ( void *data, HYPRE_Int *max_step_size ); HYPRE_Int hypre_FSAIGetMaxNnzRow ( void *data, HYPRE_Int *max_nnz_row ); HYPRE_Int hypre_FSAIGetNumLevels ( void *data, HYPRE_Int *num_levels ); HYPRE_Int hypre_FSAIGetThreshold ( void *data, HYPRE_Real *threshold ); HYPRE_Int hypre_FSAIGetKapTolerance ( void *data, HYPRE_Real *kap_tolerance ); HYPRE_Int hypre_FSAIGetMaxIterations ( void *data, HYPRE_Int *max_iterations ); HYPRE_Int hypre_FSAIGetEigMaxIters ( void *data, HYPRE_Int *eig_max_iters ); HYPRE_Int hypre_FSAIGetZeroGuess ( void *data, HYPRE_Int *zero_guess ); HYPRE_Int hypre_FSAIGetTolerance ( void *data, HYPRE_Real *tolerance ); HYPRE_Int hypre_FSAIGetOmega ( void *data, HYPRE_Real *omega ); HYPRE_Int hypre_FSAIGetLogging ( void *data, HYPRE_Int *logging ); HYPRE_Int hypre_FSAIGetNumIterations ( void *data, HYPRE_Int *num_iterations ); HYPRE_Int hypre_FSAIGetPrintLevel ( void *data, HYPRE_Int *print_level ); /* par_fsai_setup.c */ HYPRE_Int hypre_CSRMatrixExtractDenseMat ( hypre_CSRMatrix *A, hypre_Vector *A_sub, HYPRE_Int *S_Pattern, HYPRE_Int S_nnz, HYPRE_Int *marker ); HYPRE_Int hypre_CSRMatrixExtractDenseRow ( hypre_CSRMatrix *A, hypre_Vector *A_subrow, HYPRE_Int *marker, HYPRE_Int row_num ); HYPRE_Int hypre_FindKapGrad ( hypre_CSRMatrix *A_diag, hypre_Vector *kaporin_gradient, HYPRE_Int *kap_grad_nonzeros, hypre_Vector *G_temp, HYPRE_Int *S_Pattern, HYPRE_Int S_nnz, HYPRE_Int max_row_size, HYPRE_Int row_num, HYPRE_Int *kg_marker ); HYPRE_Int hypre_AddToPattern ( hypre_Vector *kaporin_gradient, HYPRE_Int *kap_grad_nonzeros, HYPRE_Int *S_Pattern, HYPRE_Int *S_nnz, HYPRE_Int *kg_marker, HYPRE_Int max_step_size ); HYPRE_Int hypre_FSAISetup ( void *fsai_vdata, hypre_ParCSRMatrix *A, hypre_ParVector *f, hypre_ParVector *u ); HYPRE_Int hypre_FSAISetupNative ( void *fsai_vdata, hypre_ParCSRMatrix *A, hypre_ParVector *f, hypre_ParVector *u ); HYPRE_Int hypre_FSAISetupOMPDyn ( void *fsai_vdata, hypre_ParCSRMatrix *A, hypre_ParVector *f, hypre_ParVector *u ); HYPRE_Int hypre_FSAIPrintStats ( void *fsai_vdata, hypre_ParCSRMatrix *A ); HYPRE_Int hypre_FSAIComputeOmega ( void *fsai_vdata, hypre_ParCSRMatrix *A ); void hypre_swap2_ci ( HYPRE_Complex *v, HYPRE_Int *w, HYPRE_Int i, HYPRE_Int j ); void hypre_qsort2_ci ( HYPRE_Complex *v, HYPRE_Int *w, HYPRE_Int left, HYPRE_Int right ); HYPRE_Int hypre_FSAIDumpLocalLSDense ( void *fsai_vdata, const char *filename, hypre_ParCSRMatrix *A ); /* par_fsai_solve.c */ HYPRE_Int hypre_FSAISolve ( void *fsai_vdata, hypre_ParCSRMatrix *A, hypre_ParVector *b, hypre_ParVector *x ); HYPRE_Int hypre_FSAIApply ( void *fsai_vdata, HYPRE_Complex alpha, hypre_ParVector *b, hypre_ParVector *x ); /* par_fsai_device.c */ HYPRE_Int hypre_FSAISetupDevice( void *fsai_vdata, hypre_ParCSRMatrix *A, hypre_ParVector *f, hypre_ParVector *u ); #ifdef __cplusplus } #endif #endif hypre-2.33.0/src/parcsr_ls/ads.c000066400000000000000000002004121477326011500164250ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "_hypre_onedpl.hpp" #include "_hypre_parcsr_ls.h" #include "float.h" #include "ams.h" #include "ads.h" #include "_hypre_utilities.hpp" #if defined(HYPRE_USING_GPU) #if defined(HYPRE_USING_SYCL) SYCL_EXTERNAL #endif __global__ void hypreGPUKernel_AMSComputePi_copy1(hypre_DeviceItem &item, HYPRE_Int nnz, HYPRE_Int dim, HYPRE_Int *j_in, HYPRE_Int *j_out); #if defined(HYPRE_USING_SYCL) SYCL_EXTERNAL #endif __global__ void hypreGPUKernel_AMSComputePi_copy2(hypre_DeviceItem &item, HYPRE_Int nrows, HYPRE_Int dim, HYPRE_Int *i_in, HYPRE_Real *data_in, HYPRE_Real *Gx_data, HYPRE_Real *Gy_data, HYPRE_Real *Gz_data, HYPRE_Real *data_out); #if defined(HYPRE_USING_SYCL) SYCL_EXTERNAL #endif __global__ void hypreGPUKernel_AMSComputePixyz_copy(hypre_DeviceItem &item, HYPRE_Int nrows, HYPRE_Int dim, HYPRE_Int *i_in, HYPRE_Real *data_in, HYPRE_Real *Gx_data, HYPRE_Real *Gy_data, HYPRE_Real *Gz_data, HYPRE_Real *data_x_out, HYPRE_Real *data_y_out, HYPRE_Real *data_z_out ); #endif /*-------------------------------------------------------------------------- * hypre_ADSCreate * * Allocate the ADS solver structure. *--------------------------------------------------------------------------*/ void * hypre_ADSCreate(void) { hypre_ADSData *ads_data; ads_data = hypre_CTAlloc(hypre_ADSData, 1, HYPRE_MEMORY_HOST); /* Default parameters */ ads_data -> maxit = 20; /* perform at most 20 iterations */ ads_data -> tol = 1e-6; /* convergence tolerance */ ads_data -> print_level = 1; /* print residual norm at each step */ ads_data -> cycle_type = 1; /* a 3-level multiplicative solver */ ads_data -> A_relax_type = 2; /* offd-l1-scaled GS */ ads_data -> A_relax_times = 1; /* one relaxation sweep */ ads_data -> A_relax_weight = 1.0; /* damping parameter */ ads_data -> A_omega = 1.0; /* SSOR coefficient */ ads_data -> A_cheby_order = 2; /* Cheby: order (1 -4 are vaild) */ ads_data -> A_cheby_fraction = 0.3; /* Cheby: fraction of spectrum to smooth */ ads_data -> B_C_cycle_type = 11; /* a 5-level multiplicative solver */ ads_data -> B_C_coarsen_type = 10; /* HMIS coarsening */ ads_data -> B_C_agg_levels = 1; /* Levels of aggressive coarsening */ ads_data -> B_C_relax_type = 3; /* hybrid G-S/Jacobi */ ads_data -> B_C_theta = 0.25; /* strength threshold */ ads_data -> B_C_interp_type = 0; /* interpolation type */ ads_data -> B_C_Pmax = 0; /* max nonzero elements in interp. rows */ ads_data -> B_Pi_coarsen_type = 10; /* HMIS coarsening */ ads_data -> B_Pi_agg_levels = 1; /* Levels of aggressive coarsening */ ads_data -> B_Pi_relax_type = 3; /* hybrid G-S/Jacobi */ ads_data -> B_Pi_theta = 0.25; /* strength threshold */ ads_data -> B_Pi_interp_type = 0; /* interpolation type */ ads_data -> B_Pi_Pmax = 0; /* max nonzero elements in interp. rows */ /* The rest of the fields are initialized using the Set functions */ ads_data -> A = NULL; ads_data -> C = NULL; ads_data -> A_C = NULL; ads_data -> B_C = 0; ads_data -> Pi = NULL; ads_data -> A_Pi = NULL; ads_data -> B_Pi = 0; ads_data -> Pix = NULL; ads_data -> Piy = NULL; ads_data -> Piz = NULL; ads_data -> A_Pix = NULL; ads_data -> A_Piy = NULL; ads_data -> A_Piz = NULL; ads_data -> B_Pix = 0; ads_data -> B_Piy = 0; ads_data -> B_Piz = 0; ads_data -> G = NULL; ads_data -> x = NULL; ads_data -> y = NULL; ads_data -> z = NULL; ads_data -> zz = NULL; ads_data -> r0 = NULL; ads_data -> g0 = NULL; ads_data -> r1 = NULL; ads_data -> g1 = NULL; ads_data -> r2 = NULL; ads_data -> g2 = NULL; ads_data -> A_l1_norms = NULL; ads_data -> A_max_eig_est = 0; ads_data -> A_min_eig_est = 0; ads_data -> owns_Pi = 1; ads_data -> ND_Pi = NULL; ads_data -> ND_Pix = NULL; ads_data -> ND_Piy = NULL; ads_data -> ND_Piz = NULL; return (void *) ads_data; } /*-------------------------------------------------------------------------- * hypre_ADSDestroy * * Deallocate the ADS solver structure. Note that the input data (given * through the Set functions) is not destroyed. *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ADSDestroy(void *solver) { hypre_ADSData *ads_data = (hypre_ADSData *) solver; if (!ads_data) { hypre_error_in_arg(1); return hypre_error_flag; } if (ads_data -> A_C) { hypre_ParCSRMatrixDestroy(ads_data -> A_C); } if (ads_data -> B_C) { HYPRE_AMSDestroy(ads_data -> B_C); } if (ads_data -> owns_Pi && ads_data -> Pi) { hypre_ParCSRMatrixDestroy(ads_data -> Pi); } if (ads_data -> A_Pi) { hypre_ParCSRMatrixDestroy(ads_data -> A_Pi); } if (ads_data -> B_Pi) { HYPRE_BoomerAMGDestroy(ads_data -> B_Pi); } if (ads_data -> owns_Pi && ads_data -> Pix) { hypre_ParCSRMatrixDestroy(ads_data -> Pix); } if (ads_data -> A_Pix) { hypre_ParCSRMatrixDestroy(ads_data -> A_Pix); } if (ads_data -> B_Pix) { HYPRE_BoomerAMGDestroy(ads_data -> B_Pix); } if (ads_data -> owns_Pi && ads_data -> Piy) { hypre_ParCSRMatrixDestroy(ads_data -> Piy); } if (ads_data -> A_Piy) { hypre_ParCSRMatrixDestroy(ads_data -> A_Piy); } if (ads_data -> B_Piy) { HYPRE_BoomerAMGDestroy(ads_data -> B_Piy); } if (ads_data -> owns_Pi && ads_data -> Piz) { hypre_ParCSRMatrixDestroy(ads_data -> Piz); } if (ads_data -> A_Piz) { hypre_ParCSRMatrixDestroy(ads_data -> A_Piz); } if (ads_data -> B_Piz) { HYPRE_BoomerAMGDestroy(ads_data -> B_Piz); } if (ads_data -> r0) { hypre_ParVectorDestroy(ads_data -> r0); } if (ads_data -> g0) { hypre_ParVectorDestroy(ads_data -> g0); } if (ads_data -> r1) { hypre_ParVectorDestroy(ads_data -> r1); } if (ads_data -> g1) { hypre_ParVectorDestroy(ads_data -> g1); } if (ads_data -> r2) { hypre_ParVectorDestroy(ads_data -> r2); } if (ads_data -> g2) { hypre_ParVectorDestroy(ads_data -> g2); } if (ads_data -> zz) { hypre_ParVectorDestroy(ads_data -> zz); } hypre_SeqVectorDestroy(ads_data -> A_l1_norms); /* C, G, x, y and z are not destroyed */ if (ads_data) { hypre_TFree(ads_data, HYPRE_MEMORY_HOST); } return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_ADSSetDiscreteCurl * * Set the discrete curl matrix C. * This function should be called before hypre_ADSSetup()! *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ADSSetDiscreteCurl(void *solver, hypre_ParCSRMatrix *C) { hypre_ADSData *ads_data = (hypre_ADSData *) solver; ads_data -> C = C; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_ADSSetDiscreteGradient * * Set the discrete gradient matrix G. * This function should be called before hypre_ADSSetup()! *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ADSSetDiscreteGradient(void *solver, hypre_ParCSRMatrix *G) { hypre_ADSData *ads_data = (hypre_ADSData *) solver; ads_data -> G = G; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_ADSSetCoordinateVectors * * Set the x, y and z coordinates of the vertices in the mesh. * This function should be called before hypre_ADSSetup()! *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ADSSetCoordinateVectors(void *solver, hypre_ParVector *x, hypre_ParVector *y, hypre_ParVector *z) { hypre_ADSData *ads_data = (hypre_ADSData *) solver; ads_data -> x = x; ads_data -> y = y; ads_data -> z = z; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_ADSSetInterpolations * * Set the (components of) the Raviart-Thomas (RT_Pi) and the Nedelec (ND_Pi) * interpolation matrices. * * This function is generally intended to be used only for high-order H(div) * discretizations (in the lowest order case, these matrices are constructed * internally in ADS from the discreet gradient and curl matrices and the * coordinates of the vertices), though it can also be used in the lowest-order * case or for other types of discretizations. * * By definition, RT_Pi and ND_Pi are the matrix representations of the linear * operators that interpolate (high-order) vector nodal finite elements into the * (high-order) Raviart-Thomas and Nedelec spaces. The component matrices are * defined in both cases as Pix phi = Pi (phi,0,0) and similarly for Piy and * Piz. Note that all these operators depend on the choice of the basis and * degrees of freedom in the high-order spaces. * * The column numbering of RT_Pi and ND_Pi should be node-based, i.e. the x/y/z * components of the first node (vertex or high-order dof) should be listed * first, followed by the x/y/z components of the second node and so on (see the * documentation of HYPRE_BoomerAMGSetDofFunc). * * If used, this function should be called before hypre_ADSSetup() and there is * no need to provide the vertex coordinates. Furthermore, only one of the sets * {RT_Pi} and {RT_Pix,RT_Piy,RT_Piz} needs to be specified (though it is OK to * provide both). If RT_Pix is NULL, then scalar Pi-based ADS cycles, i.e. * those with cycle_type > 10, will be unavailable. Similarly, ADS cycles based * on monolithic Pi (cycle_type < 10) require that RT_Pi is not NULL. The same * restrictions hold for the sets {ND_Pi} and {ND_Pix,ND_Piy,ND_Piz} -- only one * of them needs to be specified, and the availability of each enables different * AMS cycle type options for the subspace solve. *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ADSSetInterpolations(void *solver, hypre_ParCSRMatrix *RT_Pi, hypre_ParCSRMatrix *RT_Pix, hypre_ParCSRMatrix *RT_Piy, hypre_ParCSRMatrix *RT_Piz, hypre_ParCSRMatrix *ND_Pi, hypre_ParCSRMatrix *ND_Pix, hypre_ParCSRMatrix *ND_Piy, hypre_ParCSRMatrix *ND_Piz) { hypre_ADSData *ads_data = (hypre_ADSData *) solver; ads_data -> Pi = RT_Pi; ads_data -> Pix = RT_Pix; ads_data -> Piy = RT_Piy; ads_data -> Piz = RT_Piz; ads_data -> ND_Pi = ND_Pi; ads_data -> ND_Pix = ND_Pix; ads_data -> ND_Piy = ND_Piy; ads_data -> ND_Piz = ND_Piz; ads_data -> owns_Pi = 0; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_ADSSetMaxIter * * Set the maximum number of iterations in the auxiliary-space method. * The default value is 20. To use the ADS solver as a preconditioner, * set maxit to 1, tol to 0.0 and print_level to 0. *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ADSSetMaxIter(void *solver, HYPRE_Int maxit) { hypre_ADSData *ads_data = (hypre_ADSData *) solver; ads_data -> maxit = maxit; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_ADSSetTol * * Set the convergence tolerance (if the method is used as a solver). * The default value is 1e-6. *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ADSSetTol(void *solver, HYPRE_Real tol) { hypre_ADSData *ads_data = (hypre_ADSData *) solver; ads_data -> tol = tol; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_ADSSetCycleType * * Choose which three-level solver to use. Possible values are: * * 1 = 3-level multipl. solver (01210) <-- small solution time * 2 = 3-level additive solver (0+1+2) * 3 = 3-level multipl. solver (02120) * 4 = 3-level additive solver (010+2) * 5 = 3-level multipl. solver (0102010) <-- small solution time * 6 = 3-level additive solver (1+020) * 7 = 3-level multipl. solver (0201020) <-- small number of iterations * 8 = 3-level additive solver (0(1+2)0) <-- small solution time * 9 = 3-level multipl. solver (01210) with discrete divergence * 11 = 5-level multipl. solver (013454310) <-- small solution time, memory * 12 = 5-level additive solver (0+1+3+4+5) * 13 = 5-level multipl. solver (034515430) <-- small solution time, memory * 14 = 5-level additive solver (01(3+4+5)10) * * The default value is 1. *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ADSSetCycleType(void *solver, HYPRE_Int cycle_type) { hypre_ADSData *ads_data = (hypre_ADSData *) solver; ads_data -> cycle_type = cycle_type; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_ADSSetPrintLevel * * Control how much information is printed during the solution iterations. * The defaut values is 1 (print residual norm at each step). *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ADSSetPrintLevel(void *solver, HYPRE_Int print_level) { hypre_ADSData *ads_data = (hypre_ADSData *) solver; ads_data -> print_level = print_level; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_ADSSetSmoothingOptions * * Set relaxation parameters for A. Default values: 2, 1, 1.0, 1.0. *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ADSSetSmoothingOptions(void *solver, HYPRE_Int A_relax_type, HYPRE_Int A_relax_times, HYPRE_Real A_relax_weight, HYPRE_Real A_omega) { hypre_ADSData *ads_data = (hypre_ADSData *) solver; ads_data -> A_relax_type = A_relax_type; ads_data -> A_relax_times = A_relax_times; ads_data -> A_relax_weight = A_relax_weight; ads_data -> A_omega = A_omega; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_ADSSetChebySmoothingOptions * * Set parameters for Chebyshev relaxation. Default values: 2, 0.3. *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ADSSetChebySmoothingOptions(void *solver, HYPRE_Int A_cheby_order, HYPRE_Real A_cheby_fraction) { hypre_ADSData *ads_data = (hypre_ADSData *) solver; ads_data -> A_cheby_order = A_cheby_order; ads_data -> A_cheby_fraction = A_cheby_fraction; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_ADSSetAMSOptions * * Set AMS parameters for B_C. Default values: 11, 10, 1, 3, 0.25, 0, 0. * * Note that B_C_cycle_type should be greater than 10, unless the high-order * interface of hypre_ADSSetInterpolations is being used! *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ADSSetAMSOptions(void *solver, HYPRE_Int B_C_cycle_type, HYPRE_Int B_C_coarsen_type, HYPRE_Int B_C_agg_levels, HYPRE_Int B_C_relax_type, HYPRE_Real B_C_theta, HYPRE_Int B_C_interp_type, HYPRE_Int B_C_Pmax) { hypre_ADSData *ads_data = (hypre_ADSData *) solver; ads_data -> B_C_cycle_type = B_C_cycle_type; ads_data -> B_C_coarsen_type = B_C_coarsen_type; ads_data -> B_C_agg_levels = B_C_agg_levels; ads_data -> B_C_relax_type = B_C_relax_type; ads_data -> B_C_theta = B_C_theta; ads_data -> B_C_interp_type = B_C_interp_type; ads_data -> B_C_Pmax = B_C_Pmax; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_ADSSetAMGOptions * * Set AMG parameters for B_Pi. Default values: 10, 1, 3, 0.25, 0, 0. *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ADSSetAMGOptions(void *solver, HYPRE_Int B_Pi_coarsen_type, HYPRE_Int B_Pi_agg_levels, HYPRE_Int B_Pi_relax_type, HYPRE_Real B_Pi_theta, HYPRE_Int B_Pi_interp_type, HYPRE_Int B_Pi_Pmax) { hypre_ADSData *ads_data = (hypre_ADSData *) solver; ads_data -> B_Pi_coarsen_type = B_Pi_coarsen_type; ads_data -> B_Pi_agg_levels = B_Pi_agg_levels; ads_data -> B_Pi_relax_type = B_Pi_relax_type; ads_data -> B_Pi_theta = B_Pi_theta; ads_data -> B_Pi_interp_type = B_Pi_interp_type; ads_data -> B_Pi_Pmax = B_Pi_Pmax; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_ADSComputePi * * Construct the Pi interpolation matrix, which maps the space of vector * linear finite elements to the space of face finite elements. * * The construction is based on the fact that Pi = [Pi_x, Pi_y, Pi_z], where * each block has the same sparsity structure as C*G, with entries that can be * computed from the vectors RT100, RT010 and RT001. * * We assume a constant number of vertices per face (no prisms or pyramids). *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ADSComputePi(hypre_ParCSRMatrix *A, hypre_ParCSRMatrix *C, hypre_ParCSRMatrix *G, hypre_ParVector *x, hypre_ParVector *y, hypre_ParVector *z, hypre_ParCSRMatrix *PiNDx, hypre_ParCSRMatrix *PiNDy, hypre_ParCSRMatrix *PiNDz, hypre_ParCSRMatrix **Pi_ptr) { #if defined(HYPRE_USING_GPU) HYPRE_ExecutionPolicy exec = hypre_GetExecPolicy1( hypre_ParCSRMatrixMemoryLocation(A) ); #else HYPRE_UNUSED_VAR(A); #endif hypre_ParCSRMatrix *Pi; /* Compute the representations of the coordinate vectors, RT100, RT010 and RT001, in the Raviart-Thomas space, by observing that the RT coordinates of (1,0,0) = -curl (0,z,0) are given by C*PiNDy*z, etc. (We ignore the minus sign since it is irrelevant for the coarse-grid correction.) */ hypre_ParVector *RT100, *RT010, *RT001; { hypre_ParVector *PiNDlin = hypre_ParVectorInRangeOf(PiNDx); RT100 = hypre_ParVectorInRangeOf(C); hypre_ParCSRMatrixMatvec(1.0, PiNDy, z, 0.0, PiNDlin); hypre_ParCSRMatrixMatvec(1.0, C, PiNDlin, 0.0, RT100); RT010 = hypre_ParVectorInRangeOf(C); hypre_ParCSRMatrixMatvec(1.0, PiNDz, x, 0.0, PiNDlin); hypre_ParCSRMatrixMatvec(1.0, C, PiNDlin, 0.0, RT010); RT001 = hypre_ParVectorInRangeOf(C); hypre_ParCSRMatrixMatvec(1.0, PiNDx, y, 0.0, PiNDlin); hypre_ParCSRMatrixMatvec(1.0, C, PiNDlin, 0.0, RT001); hypre_ParVectorDestroy(PiNDlin); } /* Compute Pi = [Pi_x, Pi_y, Pi_z] */ { HYPRE_Int i, j, d; HYPRE_Real *RT100_data = hypre_VectorData(hypre_ParVectorLocalVector(RT100)); HYPRE_Real *RT010_data = hypre_VectorData(hypre_ParVectorLocalVector(RT010)); HYPRE_Real *RT001_data = hypre_VectorData(hypre_ParVectorLocalVector(RT001)); /* Each component of Pi has the sparsity pattern of the topological face-to-vertex matrix. */ hypre_ParCSRMatrix *F2V; #if defined(HYPRE_USING_GPU) if (exec == HYPRE_EXEC_DEVICE) { F2V = hypre_ParCSRMatMat(C, G); } else #endif { F2V = hypre_ParMatmul(C, G); } /* Create the parallel interpolation matrix */ { MPI_Comm comm = hypre_ParCSRMatrixComm(F2V); HYPRE_BigInt global_num_rows = hypre_ParCSRMatrixGlobalNumRows(F2V); HYPRE_BigInt global_num_cols = 3 * hypre_ParCSRMatrixGlobalNumCols(F2V); HYPRE_BigInt *row_starts = hypre_ParCSRMatrixRowStarts(F2V); HYPRE_BigInt *col_starts; HYPRE_Int col_starts_size; HYPRE_Int num_cols_offd = 3 * hypre_CSRMatrixNumCols(hypre_ParCSRMatrixOffd(F2V)); HYPRE_Int num_nonzeros_diag = 3 * hypre_CSRMatrixNumNonzeros(hypre_ParCSRMatrixDiag(F2V)); HYPRE_Int num_nonzeros_offd = 3 * hypre_CSRMatrixNumNonzeros(hypre_ParCSRMatrixOffd(F2V)); HYPRE_BigInt *col_starts_F2V = hypre_ParCSRMatrixColStarts(F2V); col_starts_size = 2; col_starts = hypre_TAlloc(HYPRE_BigInt, col_starts_size, HYPRE_MEMORY_HOST); for (i = 0; i < col_starts_size; i++) { col_starts[i] = 3 * col_starts_F2V[i]; } Pi = hypre_ParCSRMatrixCreate(comm, global_num_rows, global_num_cols, row_starts, col_starts, num_cols_offd, num_nonzeros_diag, num_nonzeros_offd); hypre_ParCSRMatrixOwnsData(Pi) = 1; hypre_ParCSRMatrixInitialize(Pi); } /* Fill-in the diagonal part */ { hypre_CSRMatrix *F2V_diag = hypre_ParCSRMatrixDiag(F2V); HYPRE_Int *F2V_diag_I = hypre_CSRMatrixI(F2V_diag); HYPRE_Int *F2V_diag_J = hypre_CSRMatrixJ(F2V_diag); HYPRE_Int F2V_diag_nrows = hypre_CSRMatrixNumRows(F2V_diag); HYPRE_Int F2V_diag_nnz = hypre_CSRMatrixNumNonzeros(F2V_diag); hypre_CSRMatrix *Pi_diag = hypre_ParCSRMatrixDiag(Pi); HYPRE_Int *Pi_diag_I = hypre_CSRMatrixI(Pi_diag); HYPRE_Int *Pi_diag_J = hypre_CSRMatrixJ(Pi_diag); HYPRE_Real *Pi_diag_data = hypre_CSRMatrixData(Pi_diag); #if defined(HYPRE_USING_GPU) if (exec == HYPRE_EXEC_DEVICE) { hypreDevice_IntScalen( F2V_diag_I, F2V_diag_nrows + 1, Pi_diag_I, 3); dim3 bDim = hypre_GetDefaultDeviceBlockDimension(); dim3 gDim = hypre_GetDefaultDeviceGridDimension(F2V_diag_nnz, "thread", bDim); HYPRE_GPU_LAUNCH( hypreGPUKernel_AMSComputePi_copy1, gDim, bDim, F2V_diag_nnz, 3, F2V_diag_J, Pi_diag_J ); gDim = hypre_GetDefaultDeviceGridDimension(F2V_diag_nrows, "warp", bDim); HYPRE_GPU_LAUNCH( hypreGPUKernel_AMSComputePi_copy2, gDim, bDim, F2V_diag_nrows, 3, F2V_diag_I, NULL, RT100_data, RT010_data, RT001_data, Pi_diag_data ); } else #endif { for (i = 0; i < F2V_diag_nrows + 1; i++) { Pi_diag_I[i] = 3 * F2V_diag_I[i]; } for (i = 0; i < F2V_diag_nnz; i++) for (d = 0; d < 3; d++) { Pi_diag_J[3 * i + d] = 3 * F2V_diag_J[i] + d; } for (i = 0; i < F2V_diag_nrows; i++) for (j = F2V_diag_I[i]; j < F2V_diag_I[i + 1]; j++) { *Pi_diag_data++ = RT100_data[i]; *Pi_diag_data++ = RT010_data[i]; *Pi_diag_data++ = RT001_data[i]; } } } /* Fill-in the off-diagonal part */ { hypre_CSRMatrix *F2V_offd = hypre_ParCSRMatrixOffd(F2V); HYPRE_Int *F2V_offd_I = hypre_CSRMatrixI(F2V_offd); HYPRE_Int *F2V_offd_J = hypre_CSRMatrixJ(F2V_offd); HYPRE_Int F2V_offd_nrows = hypre_CSRMatrixNumRows(F2V_offd); HYPRE_Int F2V_offd_ncols = hypre_CSRMatrixNumCols(F2V_offd); HYPRE_Int F2V_offd_nnz = hypre_CSRMatrixNumNonzeros(F2V_offd); hypre_CSRMatrix *Pi_offd = hypre_ParCSRMatrixOffd(Pi); HYPRE_Int *Pi_offd_I = hypre_CSRMatrixI(Pi_offd); HYPRE_Int *Pi_offd_J = hypre_CSRMatrixJ(Pi_offd); HYPRE_Real *Pi_offd_data = hypre_CSRMatrixData(Pi_offd); HYPRE_BigInt *F2V_cmap = hypre_ParCSRMatrixColMapOffd(F2V); HYPRE_BigInt *Pi_cmap = hypre_ParCSRMatrixColMapOffd(Pi); #if defined(HYPRE_USING_GPU) if (exec == HYPRE_EXEC_DEVICE) { if (F2V_offd_ncols) { hypreDevice_IntScalen( F2V_offd_I, F2V_offd_nrows + 1, Pi_offd_I, 3 ); } dim3 bDim = hypre_GetDefaultDeviceBlockDimension(); dim3 gDim = hypre_GetDefaultDeviceGridDimension(F2V_offd_nnz, "thread", bDim); HYPRE_GPU_LAUNCH( hypreGPUKernel_AMSComputePi_copy1, gDim, bDim, F2V_offd_nnz, 3, F2V_offd_J, Pi_offd_J ); gDim = hypre_GetDefaultDeviceGridDimension(F2V_offd_nrows, "warp", bDim); HYPRE_GPU_LAUNCH( hypreGPUKernel_AMSComputePi_copy2, gDim, bDim, F2V_offd_nrows, 3, F2V_offd_I, NULL, RT100_data, RT010_data, RT001_data, Pi_offd_data ); } else #endif { if (F2V_offd_ncols) for (i = 0; i < F2V_offd_nrows + 1; i++) { Pi_offd_I[i] = 3 * F2V_offd_I[i]; } for (i = 0; i < F2V_offd_nnz; i++) for (d = 0; d < 3; d++) { Pi_offd_J[3 * i + d] = 3 * F2V_offd_J[i] + d; } for (i = 0; i < F2V_offd_nrows; i++) for (j = F2V_offd_I[i]; j < F2V_offd_I[i + 1]; j++) { *Pi_offd_data++ = RT100_data[i]; *Pi_offd_data++ = RT010_data[i]; *Pi_offd_data++ = RT001_data[i]; } } for (i = 0; i < F2V_offd_ncols; i++) for (d = 0; d < 3; d++) { Pi_cmap[3 * i + d] = 3 * F2V_cmap[i] + (HYPRE_BigInt)d; } } hypre_ParCSRMatrixDestroy(F2V); } hypre_ParVectorDestroy(RT100); hypre_ParVectorDestroy(RT010); hypre_ParVectorDestroy(RT001); *Pi_ptr = Pi; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_ADSComputePixyz * * Construct the components Pix, Piy, Piz of the interpolation matrix Pi, which * maps the space of vector linear finite elements to the space of face finite * elements. * * The construction is based on the fact that each component has the same * sparsity structure as the matrix C*G, with entries that can be computed from * the vectors RT100, RT010 and RT001. * * We assume a constant number of vertices per face (no prisms or pyramids). *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ADSComputePixyz(hypre_ParCSRMatrix *A, hypre_ParCSRMatrix *C, hypre_ParCSRMatrix *G, hypre_ParVector *x, hypre_ParVector *y, hypre_ParVector *z, hypre_ParCSRMatrix *PiNDx, hypre_ParCSRMatrix *PiNDy, hypre_ParCSRMatrix *PiNDz, hypre_ParCSRMatrix **Pix_ptr, hypre_ParCSRMatrix **Piy_ptr, hypre_ParCSRMatrix **Piz_ptr) { hypre_ParCSRMatrix *Pix, *Piy, *Piz; #if defined(HYPRE_USING_GPU) HYPRE_ExecutionPolicy exec = hypre_GetExecPolicy1( hypre_ParCSRMatrixMemoryLocation(A) ); #else HYPRE_UNUSED_VAR(A); #endif /* Compute the representations of the coordinate vectors, RT100, RT010 and RT001, in the Raviart-Thomas space, by observing that the RT coordinates of (1,0,0) = -curl (0,z,0) are given by C*PiNDy*z, etc. (We ignore the minus sign since it is irrelevant for the coarse-grid correction.) */ hypre_ParVector *RT100, *RT010, *RT001; { hypre_ParVector *PiNDlin = hypre_ParVectorInRangeOf(PiNDx); RT100 = hypre_ParVectorInRangeOf(C); hypre_ParCSRMatrixMatvec(1.0, PiNDy, z, 0.0, PiNDlin); hypre_ParCSRMatrixMatvec(1.0, C, PiNDlin, 0.0, RT100); RT010 = hypre_ParVectorInRangeOf(C); hypre_ParCSRMatrixMatvec(1.0, PiNDz, x, 0.0, PiNDlin); hypre_ParCSRMatrixMatvec(1.0, C, PiNDlin, 0.0, RT010); RT001 = hypre_ParVectorInRangeOf(C); hypre_ParCSRMatrixMatvec(1.0, PiNDx, y, 0.0, PiNDlin); hypre_ParCSRMatrixMatvec(1.0, C, PiNDlin, 0.0, RT001); hypre_ParVectorDestroy(PiNDlin); } /* Compute Pix, Piy, Piz */ { HYPRE_Int i, j; HYPRE_Real *RT100_data = hypre_VectorData(hypre_ParVectorLocalVector(RT100)); HYPRE_Real *RT010_data = hypre_VectorData(hypre_ParVectorLocalVector(RT010)); HYPRE_Real *RT001_data = hypre_VectorData(hypre_ParVectorLocalVector(RT001)); /* Each component of Pi has the sparsity pattern of the topological face-to-vertex matrix. */ hypre_ParCSRMatrix *F2V; #if defined(HYPRE_USING_GPU) if (exec == HYPRE_EXEC_DEVICE) { F2V = hypre_ParCSRMatMat(C, G); } else #endif { F2V = hypre_ParMatmul(C, G); } /* Create the components of the parallel interpolation matrix */ { MPI_Comm comm = hypre_ParCSRMatrixComm(F2V); HYPRE_BigInt global_num_rows = hypre_ParCSRMatrixGlobalNumRows(F2V); HYPRE_BigInt global_num_cols = hypre_ParCSRMatrixGlobalNumCols(F2V); HYPRE_BigInt *row_starts = hypre_ParCSRMatrixRowStarts(F2V); HYPRE_BigInt *col_starts = hypre_ParCSRMatrixColStarts(F2V); HYPRE_Int num_cols_offd = hypre_CSRMatrixNumCols(hypre_ParCSRMatrixOffd(F2V)); HYPRE_Int num_nonzeros_diag = hypre_CSRMatrixNumNonzeros(hypre_ParCSRMatrixDiag(F2V)); HYPRE_Int num_nonzeros_offd = hypre_CSRMatrixNumNonzeros(hypre_ParCSRMatrixOffd(F2V)); Pix = hypre_ParCSRMatrixCreate(comm, global_num_rows, global_num_cols, row_starts, col_starts, num_cols_offd, num_nonzeros_diag, num_nonzeros_offd); hypre_ParCSRMatrixOwnsData(Pix) = 1; hypre_ParCSRMatrixInitialize(Pix); Piy = hypre_ParCSRMatrixCreate(comm, global_num_rows, global_num_cols, row_starts, col_starts, num_cols_offd, num_nonzeros_diag, num_nonzeros_offd); hypre_ParCSRMatrixOwnsData(Piy) = 1; hypre_ParCSRMatrixInitialize(Piy); Piz = hypre_ParCSRMatrixCreate(comm, global_num_rows, global_num_cols, row_starts, col_starts, num_cols_offd, num_nonzeros_diag, num_nonzeros_offd); hypre_ParCSRMatrixOwnsData(Piz) = 1; hypre_ParCSRMatrixInitialize(Piz); } /* Fill-in the diagonal part */ { hypre_CSRMatrix *F2V_diag = hypre_ParCSRMatrixDiag(F2V); HYPRE_Int *F2V_diag_I = hypre_CSRMatrixI(F2V_diag); HYPRE_Int *F2V_diag_J = hypre_CSRMatrixJ(F2V_diag); HYPRE_Int F2V_diag_nrows = hypre_CSRMatrixNumRows(F2V_diag); HYPRE_Int F2V_diag_nnz = hypre_CSRMatrixNumNonzeros(F2V_diag); hypre_CSRMatrix *Pix_diag = hypre_ParCSRMatrixDiag(Pix); HYPRE_Int *Pix_diag_I = hypre_CSRMatrixI(Pix_diag); HYPRE_Int *Pix_diag_J = hypre_CSRMatrixJ(Pix_diag); HYPRE_Real *Pix_diag_data = hypre_CSRMatrixData(Pix_diag); hypre_CSRMatrix *Piy_diag = hypre_ParCSRMatrixDiag(Piy); HYPRE_Int *Piy_diag_I = hypre_CSRMatrixI(Piy_diag); HYPRE_Int *Piy_diag_J = hypre_CSRMatrixJ(Piy_diag); HYPRE_Real *Piy_diag_data = hypre_CSRMatrixData(Piy_diag); hypre_CSRMatrix *Piz_diag = hypre_ParCSRMatrixDiag(Piz); HYPRE_Int *Piz_diag_I = hypre_CSRMatrixI(Piz_diag); HYPRE_Int *Piz_diag_J = hypre_CSRMatrixJ(Piz_diag); HYPRE_Real *Piz_diag_data = hypre_CSRMatrixData(Piz_diag); #if defined(HYPRE_USING_GPU) if (exec == HYPRE_EXEC_DEVICE) { #if defined(HYPRE_USING_SYCL) HYPRE_ONEDPL_CALL( std::copy_n, oneapi::dpl::make_zip_iterator(F2V_diag_I, F2V_diag_I, F2V_diag_I), F2V_diag_nrows + 1, oneapi::dpl::make_zip_iterator(Pix_diag_I, Piy_diag_I, Piz_diag_I) ); HYPRE_ONEDPL_CALL( std::copy_n, oneapi::dpl::make_zip_iterator(F2V_diag_J, F2V_diag_J, F2V_diag_J), F2V_diag_nnz, oneapi::dpl::make_zip_iterator(Pix_diag_J, Piy_diag_J, Piz_diag_J) ); #else HYPRE_THRUST_CALL( copy_n, thrust::make_zip_iterator(thrust::make_tuple(F2V_diag_I, F2V_diag_I, F2V_diag_I)), F2V_diag_nrows + 1, thrust::make_zip_iterator(thrust::make_tuple(Pix_diag_I, Piy_diag_I, Piz_diag_I)) ); HYPRE_THRUST_CALL( copy_n, thrust::make_zip_iterator(thrust::make_tuple(F2V_diag_J, F2V_diag_J, F2V_diag_J)), F2V_diag_nnz, thrust::make_zip_iterator(thrust::make_tuple(Pix_diag_J, Piy_diag_J, Piz_diag_J)) ); #endif dim3 bDim = hypre_GetDefaultDeviceBlockDimension(); dim3 gDim = hypre_GetDefaultDeviceGridDimension(F2V_diag_nrows, "warp", bDim); HYPRE_GPU_LAUNCH( hypreGPUKernel_AMSComputePixyz_copy, gDim, bDim, F2V_diag_nrows, 3, F2V_diag_I, NULL, RT100_data, RT010_data, RT001_data, Pix_diag_data, Piy_diag_data, Piz_diag_data ); } else #endif { for (i = 0; i < F2V_diag_nrows + 1; i++) { Pix_diag_I[i] = F2V_diag_I[i]; Piy_diag_I[i] = F2V_diag_I[i]; Piz_diag_I[i] = F2V_diag_I[i]; } for (i = 0; i < F2V_diag_nnz; i++) { Pix_diag_J[i] = F2V_diag_J[i]; Piy_diag_J[i] = F2V_diag_J[i]; Piz_diag_J[i] = F2V_diag_J[i]; } for (i = 0; i < F2V_diag_nrows; i++) for (j = F2V_diag_I[i]; j < F2V_diag_I[i + 1]; j++) { *Pix_diag_data++ = RT100_data[i]; *Piy_diag_data++ = RT010_data[i]; *Piz_diag_data++ = RT001_data[i]; } } } /* Fill-in the off-diagonal part */ { hypre_CSRMatrix *F2V_offd = hypre_ParCSRMatrixOffd(F2V); HYPRE_Int *F2V_offd_I = hypre_CSRMatrixI(F2V_offd); HYPRE_Int *F2V_offd_J = hypre_CSRMatrixJ(F2V_offd); HYPRE_Int F2V_offd_nrows = hypre_CSRMatrixNumRows(F2V_offd); HYPRE_Int F2V_offd_ncols = hypre_CSRMatrixNumCols(F2V_offd); HYPRE_Int F2V_offd_nnz = hypre_CSRMatrixNumNonzeros(F2V_offd); hypre_CSRMatrix *Pix_offd = hypre_ParCSRMatrixOffd(Pix); HYPRE_Int *Pix_offd_I = hypre_CSRMatrixI(Pix_offd); HYPRE_Int *Pix_offd_J = hypre_CSRMatrixJ(Pix_offd); HYPRE_Real *Pix_offd_data = hypre_CSRMatrixData(Pix_offd); hypre_CSRMatrix *Piy_offd = hypre_ParCSRMatrixOffd(Piy); HYPRE_Int *Piy_offd_I = hypre_CSRMatrixI(Piy_offd); HYPRE_Int *Piy_offd_J = hypre_CSRMatrixJ(Piy_offd); HYPRE_Real *Piy_offd_data = hypre_CSRMatrixData(Piy_offd); hypre_CSRMatrix *Piz_offd = hypre_ParCSRMatrixOffd(Piz); HYPRE_Int *Piz_offd_I = hypre_CSRMatrixI(Piz_offd); HYPRE_Int *Piz_offd_J = hypre_CSRMatrixJ(Piz_offd); HYPRE_Real *Piz_offd_data = hypre_CSRMatrixData(Piz_offd); HYPRE_BigInt *F2V_cmap = hypre_ParCSRMatrixColMapOffd(F2V); HYPRE_BigInt *Pix_cmap = hypre_ParCSRMatrixColMapOffd(Pix); HYPRE_BigInt *Piy_cmap = hypre_ParCSRMatrixColMapOffd(Piy); HYPRE_BigInt *Piz_cmap = hypre_ParCSRMatrixColMapOffd(Piz); #if defined(HYPRE_USING_GPU) if (exec == HYPRE_EXEC_DEVICE) { #if defined(HYPRE_USING_SYCL) if (F2V_offd_ncols) { HYPRE_ONEDPL_CALL( std::copy_n, oneapi::dpl::make_zip_iterator(F2V_offd_I, F2V_offd_I, F2V_offd_I), F2V_offd_nrows + 1, oneapi::dpl::make_zip_iterator(Pix_offd_I, Piy_offd_I, Piz_offd_I) ); } HYPRE_ONEDPL_CALL( std::copy_n, oneapi::dpl::make_zip_iterator(F2V_offd_J, F2V_offd_J, F2V_offd_J), F2V_offd_nnz, oneapi::dpl::make_zip_iterator(Pix_offd_J, Piy_offd_J, Piz_offd_J) ); #else if (F2V_offd_ncols) { HYPRE_THRUST_CALL( copy_n, thrust::make_zip_iterator(thrust::make_tuple(F2V_offd_I, F2V_offd_I, F2V_offd_I)), F2V_offd_nrows + 1, thrust::make_zip_iterator(thrust::make_tuple(Pix_offd_I, Piy_offd_I, Piz_offd_I)) ); } HYPRE_THRUST_CALL( copy_n, thrust::make_zip_iterator(thrust::make_tuple(F2V_offd_J, F2V_offd_J, F2V_offd_J)), F2V_offd_nnz, thrust::make_zip_iterator(thrust::make_tuple(Pix_offd_J, Piy_offd_J, Piz_offd_J)) ); #endif dim3 bDim = hypre_GetDefaultDeviceBlockDimension(); dim3 gDim = hypre_GetDefaultDeviceGridDimension(F2V_offd_nrows, "warp", bDim); HYPRE_GPU_LAUNCH( hypreGPUKernel_AMSComputePixyz_copy, gDim, bDim, F2V_offd_nrows, 3, F2V_offd_I, NULL, RT100_data, RT010_data, RT001_data, Pix_offd_data, Piy_offd_data, Piz_offd_data ); } else #endif { if (F2V_offd_ncols) for (i = 0; i < F2V_offd_nrows + 1; i++) { Pix_offd_I[i] = F2V_offd_I[i]; Piy_offd_I[i] = F2V_offd_I[i]; Piz_offd_I[i] = F2V_offd_I[i]; } for (i = 0; i < F2V_offd_nnz; i++) { Pix_offd_J[i] = F2V_offd_J[i]; Piy_offd_J[i] = F2V_offd_J[i]; Piz_offd_J[i] = F2V_offd_J[i]; } for (i = 0; i < F2V_offd_nrows; i++) for (j = F2V_offd_I[i]; j < F2V_offd_I[i + 1]; j++) { *Pix_offd_data++ = RT100_data[i]; *Piy_offd_data++ = RT010_data[i]; *Piz_offd_data++ = RT001_data[i]; } } for (i = 0; i < F2V_offd_ncols; i++) { Pix_cmap[i] = F2V_cmap[i]; Piy_cmap[i] = F2V_cmap[i]; Piz_cmap[i] = F2V_cmap[i]; } } if (HYPRE_AssumedPartitionCheck()) { hypre_ParCSRMatrixDestroy(F2V); } else { hypre_ParCSRBooleanMatrixDestroy((hypre_ParCSRBooleanMatrix*)F2V); } } hypre_ParVectorDestroy(RT100); hypre_ParVectorDestroy(RT010); hypre_ParVectorDestroy(RT001); *Pix_ptr = Pix; *Piy_ptr = Piy; *Piz_ptr = Piz; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_ADSSetup * * Construct the ADS solver components. * * The following functions need to be called before hypre_ADSSetup(): * - hypre_ADSSetDiscreteCurl() * - hypre_ADSSetDiscreteGradient() * - hypre_ADSSetCoordinateVectors() *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ADSSetup(void *solver, hypre_ParCSRMatrix *A, hypre_ParVector *b, hypre_ParVector *x) { HYPRE_UNUSED_VAR(b); HYPRE_UNUSED_VAR(x); #if defined(HYPRE_USING_GPU) HYPRE_ExecutionPolicy exec = hypre_GetExecPolicy1( hypre_ParCSRMatrixMemoryLocation(A) ); #endif hypre_ADSData *ads_data = (hypre_ADSData *) solver; hypre_AMSData *ams_data; ads_data -> A = A; /* Make sure that the first entry in each row is the diagonal one. */ /* hypre_CSRMatrixReorder(hypre_ParCSRMatrixDiag(ads_data -> A)); */ /* Compute the l1 norm of the rows of A */ if (ads_data -> A_relax_type >= 1 && ads_data -> A_relax_type <= 4) { HYPRE_Real *l1_norm_data = NULL; hypre_ParCSRComputeL1Norms(ads_data -> A, ads_data -> A_relax_type, NULL, &l1_norm_data); ads_data -> A_l1_norms = hypre_SeqVectorCreate(hypre_ParCSRMatrixNumRows(ads_data -> A)); hypre_VectorData(ads_data -> A_l1_norms) = l1_norm_data; hypre_SeqVectorInitialize_v2(ads_data -> A_l1_norms, hypre_ParCSRMatrixMemoryLocation(ads_data -> A)); } /* Chebyshev? */ if (ads_data -> A_relax_type == 16) { hypre_ParCSRMaxEigEstimateCG(ads_data->A, 1, 10, &ads_data->A_max_eig_est, &ads_data->A_min_eig_est); } /* Create the AMS solver on the range of C^T */ { HYPRE_AMSCreate(&ads_data -> B_C); HYPRE_AMSSetDimension(ads_data -> B_C, 3); /* B_C is a preconditioner */ HYPRE_AMSSetMaxIter(ads_data -> B_C, 1); HYPRE_AMSSetTol(ads_data -> B_C, 0.0); HYPRE_AMSSetPrintLevel(ads_data -> B_C, 0); HYPRE_AMSSetCycleType(ads_data -> B_C, ads_data -> B_C_cycle_type); HYPRE_AMSSetDiscreteGradient(ads_data -> B_C, (HYPRE_ParCSRMatrix) ads_data -> G); if (ads_data -> ND_Pi == NULL && ads_data -> ND_Pix == NULL) { if (ads_data -> B_C_cycle_type < 10) { hypre_error_w_msg(HYPRE_ERROR_GENERIC, "Unsupported AMS cycle type in ADS!"); } HYPRE_AMSSetCoordinateVectors(ads_data -> B_C, (HYPRE_ParVector) ads_data -> x, (HYPRE_ParVector) ads_data -> y, (HYPRE_ParVector) ads_data -> z); } else { if ((ads_data -> B_C_cycle_type < 10 && ads_data -> ND_Pi == NULL) || (ads_data -> B_C_cycle_type > 10 && ads_data -> ND_Pix == NULL)) { hypre_error_w_msg(HYPRE_ERROR_GENERIC, "Unsupported AMS cycle type in ADS!"); } HYPRE_AMSSetInterpolations(ads_data -> B_C, (HYPRE_ParCSRMatrix) ads_data -> ND_Pi, (HYPRE_ParCSRMatrix) ads_data -> ND_Pix, (HYPRE_ParCSRMatrix) ads_data -> ND_Piy, (HYPRE_ParCSRMatrix) ads_data -> ND_Piz); } /* beta=0 in the subspace */ HYPRE_AMSSetBetaPoissonMatrix(ads_data -> B_C, NULL); /* Reuse A's relaxation parameters for A_C */ HYPRE_AMSSetSmoothingOptions(ads_data -> B_C, ads_data -> A_relax_type, ads_data -> A_relax_times, ads_data -> A_relax_weight, ads_data -> A_omega); HYPRE_AMSSetAlphaAMGOptions(ads_data -> B_C, ads_data -> B_C_coarsen_type, ads_data -> B_C_agg_levels, ads_data -> B_C_relax_type, ads_data -> B_C_theta, ads_data -> B_C_interp_type, ads_data -> B_C_Pmax); /* No need to call HYPRE_AMSSetBetaAMGOptions */ /* Construct the coarse space matrix by RAP */ if (!ads_data -> A_C) { if (!hypre_ParCSRMatrixCommPkg(ads_data -> C)) { hypre_MatvecCommPkgCreate(ads_data -> C); } if (!hypre_ParCSRMatrixCommPkg(ads_data -> A)) { hypre_MatvecCommPkgCreate(ads_data -> A); } #if defined(HYPRE_USING_GPU) if (exec == HYPRE_EXEC_DEVICE) { ads_data -> A_C = hypre_ParCSRMatrixRAPKT(ads_data -> C, ads_data -> A, ads_data -> C, 1); } else #endif { hypre_BoomerAMGBuildCoarseOperator(ads_data -> C, ads_data -> A, ads_data -> C, &ads_data -> A_C); } /* Make sure that A_C has no zero rows (this can happen if beta is zero in part of the domain). */ hypre_ParCSRMatrixFixZeroRows(ads_data -> A_C); } HYPRE_AMSSetup(ads_data -> B_C, (HYPRE_ParCSRMatrix)ads_data -> A_C, 0, 0); } ams_data = (hypre_AMSData *) ads_data -> B_C; if (ads_data -> Pi == NULL && ads_data -> Pix == NULL) { if (ads_data -> cycle_type > 10) { /* Construct Pi{x,y,z} instead of Pi = [Pix,Piy,Piz] */ hypre_ADSComputePixyz(ads_data -> A, ads_data -> C, ads_data -> G, ads_data -> x, ads_data -> y, ads_data -> z, ams_data -> Pix, ams_data -> Piy, ams_data -> Piz, &ads_data -> Pix, &ads_data -> Piy, &ads_data -> Piz); } else { /* Construct the Pi interpolation matrix */ hypre_ADSComputePi(ads_data -> A, ads_data -> C, ads_data -> G, ads_data -> x, ads_data -> y, ads_data -> z, ams_data -> Pix, ams_data -> Piy, ams_data -> Piz, &ads_data -> Pi); } } if (ads_data -> cycle_type > 10) /* Create the AMG solvers on the range of Pi{x,y,z}^T */ { HYPRE_BoomerAMGCreate(&ads_data -> B_Pix); HYPRE_BoomerAMGSetCoarsenType(ads_data -> B_Pix, ads_data -> B_Pi_coarsen_type); HYPRE_BoomerAMGSetAggNumLevels(ads_data -> B_Pix, ads_data -> B_Pi_agg_levels); HYPRE_BoomerAMGSetRelaxType(ads_data -> B_Pix, ads_data -> B_Pi_relax_type); HYPRE_BoomerAMGSetNumSweeps(ads_data -> B_Pix, 1); HYPRE_BoomerAMGSetMaxLevels(ads_data -> B_Pix, 25); HYPRE_BoomerAMGSetTol(ads_data -> B_Pix, 0.0); HYPRE_BoomerAMGSetMaxIter(ads_data -> B_Pix, 1); HYPRE_BoomerAMGSetStrongThreshold(ads_data -> B_Pix, ads_data -> B_Pi_theta); HYPRE_BoomerAMGSetInterpType(ads_data -> B_Pix, ads_data -> B_Pi_interp_type); HYPRE_BoomerAMGSetPMaxElmts(ads_data -> B_Pix, ads_data -> B_Pi_Pmax); HYPRE_BoomerAMGCreate(&ads_data -> B_Piy); HYPRE_BoomerAMGSetCoarsenType(ads_data -> B_Piy, ads_data -> B_Pi_coarsen_type); HYPRE_BoomerAMGSetAggNumLevels(ads_data -> B_Piy, ads_data -> B_Pi_agg_levels); HYPRE_BoomerAMGSetRelaxType(ads_data -> B_Piy, ads_data -> B_Pi_relax_type); HYPRE_BoomerAMGSetNumSweeps(ads_data -> B_Piy, 1); HYPRE_BoomerAMGSetMaxLevels(ads_data -> B_Piy, 25); HYPRE_BoomerAMGSetTol(ads_data -> B_Piy, 0.0); HYPRE_BoomerAMGSetMaxIter(ads_data -> B_Piy, 1); HYPRE_BoomerAMGSetStrongThreshold(ads_data -> B_Piy, ads_data -> B_Pi_theta); HYPRE_BoomerAMGSetInterpType(ads_data -> B_Piy, ads_data -> B_Pi_interp_type); HYPRE_BoomerAMGSetPMaxElmts(ads_data -> B_Piy, ads_data -> B_Pi_Pmax); HYPRE_BoomerAMGCreate(&ads_data -> B_Piz); HYPRE_BoomerAMGSetCoarsenType(ads_data -> B_Piz, ads_data -> B_Pi_coarsen_type); HYPRE_BoomerAMGSetAggNumLevels(ads_data -> B_Piz, ads_data -> B_Pi_agg_levels); HYPRE_BoomerAMGSetRelaxType(ads_data -> B_Piz, ads_data -> B_Pi_relax_type); HYPRE_BoomerAMGSetNumSweeps(ads_data -> B_Piz, 1); HYPRE_BoomerAMGSetMaxLevels(ads_data -> B_Piz, 25); HYPRE_BoomerAMGSetTol(ads_data -> B_Piz, 0.0); HYPRE_BoomerAMGSetMaxIter(ads_data -> B_Piz, 1); HYPRE_BoomerAMGSetStrongThreshold(ads_data -> B_Piz, ads_data -> B_Pi_theta); HYPRE_BoomerAMGSetInterpType(ads_data -> B_Piz, ads_data -> B_Pi_interp_type); HYPRE_BoomerAMGSetPMaxElmts(ads_data -> B_Piz, ads_data -> B_Pi_Pmax); /* Don't use exact solve on the coarsest level (matrices may be singular) */ HYPRE_BoomerAMGSetCycleRelaxType(ads_data -> B_Pix, ads_data -> B_Pi_relax_type, 3); HYPRE_BoomerAMGSetCycleRelaxType(ads_data -> B_Piy, ads_data -> B_Pi_relax_type, 3); HYPRE_BoomerAMGSetCycleRelaxType(ads_data -> B_Piz, ads_data -> B_Pi_relax_type, 3); /* Construct the coarse space matrices by RAP */ if (!hypre_ParCSRMatrixCommPkg(ads_data -> Pix)) { hypre_MatvecCommPkgCreate(ads_data -> Pix); } #if defined(HYPRE_USING_GPU) if (exec == HYPRE_EXEC_DEVICE) { ads_data -> A_Pix = hypre_ParCSRMatrixRAPKT(ads_data -> Pix, ads_data -> A, ads_data -> Pix, 1); } else #endif { hypre_BoomerAMGBuildCoarseOperator(ads_data -> Pix, ads_data -> A, ads_data -> Pix, &ads_data -> A_Pix); } HYPRE_BoomerAMGSetup(ads_data -> B_Pix, (HYPRE_ParCSRMatrix)ads_data -> A_Pix, NULL, NULL); if (!hypre_ParCSRMatrixCommPkg(ads_data -> Piy)) { hypre_MatvecCommPkgCreate(ads_data -> Piy); } #if defined(HYPRE_USING_GPU) if (exec == HYPRE_EXEC_DEVICE) { ads_data -> A_Piy = hypre_ParCSRMatrixRAPKT(ads_data -> Piy, ads_data -> A, ads_data -> Piy, 1); } else #endif { hypre_BoomerAMGBuildCoarseOperator(ads_data -> Piy, ads_data -> A, ads_data -> Piy, &ads_data -> A_Piy); } HYPRE_BoomerAMGSetup(ads_data -> B_Piy, (HYPRE_ParCSRMatrix)ads_data -> A_Piy, NULL, NULL); if (!hypre_ParCSRMatrixCommPkg(ads_data -> Piz)) { hypre_MatvecCommPkgCreate(ads_data -> Piz); } #if defined(HYPRE_USING_GPU) if (exec == HYPRE_EXEC_DEVICE) { ads_data -> A_Piz = hypre_ParCSRMatrixRAPKT(ads_data -> Piz, ads_data -> A, ads_data -> Piz, 1); } else #endif { hypre_BoomerAMGBuildCoarseOperator(ads_data -> Piz, ads_data -> A, ads_data -> Piz, &ads_data -> A_Piz); } HYPRE_BoomerAMGSetup(ads_data -> B_Piz, (HYPRE_ParCSRMatrix)ads_data -> A_Piz, NULL, NULL); } else { /* Create the AMG solver on the range of Pi^T */ HYPRE_BoomerAMGCreate(&ads_data -> B_Pi); HYPRE_BoomerAMGSetCoarsenType(ads_data -> B_Pi, ads_data -> B_Pi_coarsen_type); HYPRE_BoomerAMGSetAggNumLevels(ads_data -> B_Pi, ads_data -> B_Pi_agg_levels); HYPRE_BoomerAMGSetRelaxType(ads_data -> B_Pi, ads_data -> B_Pi_relax_type); HYPRE_BoomerAMGSetNumSweeps(ads_data -> B_Pi, 1); HYPRE_BoomerAMGSetMaxLevels(ads_data -> B_Pi, 25); HYPRE_BoomerAMGSetTol(ads_data -> B_Pi, 0.0); HYPRE_BoomerAMGSetMaxIter(ads_data -> B_Pi, 1); HYPRE_BoomerAMGSetStrongThreshold(ads_data -> B_Pi, ads_data -> B_Pi_theta); HYPRE_BoomerAMGSetInterpType(ads_data -> B_Pi, ads_data -> B_Pi_interp_type); HYPRE_BoomerAMGSetPMaxElmts(ads_data -> B_Pi, ads_data -> B_Pi_Pmax); /* Don't use exact solve on the coarsest level (matrix may be singular) */ HYPRE_BoomerAMGSetCycleRelaxType(ads_data -> B_Pi, ads_data -> B_Pi_relax_type, 3); /* Construct the coarse space matrix by RAP and notify BoomerAMG that this is a 3 x 3 block system. */ if (!ads_data -> A_Pi) { if (!hypre_ParCSRMatrixCommPkg(ads_data -> Pi)) { hypre_MatvecCommPkgCreate(ads_data -> Pi); } if (!hypre_ParCSRMatrixCommPkg(ads_data -> A)) { hypre_MatvecCommPkgCreate(ads_data -> A); } #if defined(HYPRE_USING_GPU) if (exec == HYPRE_EXEC_DEVICE) { ads_data -> A_Pi = hypre_ParCSRMatrixRAPKT(ads_data -> Pi, ads_data -> A, ads_data -> Pi, 1); } else #endif { hypre_BoomerAMGBuildCoarseOperator(ads_data -> Pi, ads_data -> A, ads_data -> Pi, &ads_data -> A_Pi); } HYPRE_BoomerAMGSetNumFunctions(ads_data -> B_Pi, 3); /* HYPRE_BoomerAMGSetNodal(ads_data -> B_Pi, 1); */ } HYPRE_BoomerAMGSetup(ads_data -> B_Pi, (HYPRE_ParCSRMatrix)ads_data -> A_Pi, NULL, NULL); } /* Allocate temporary vectors */ ads_data -> r0 = hypre_ParVectorInRangeOf(ads_data -> A); ads_data -> g0 = hypre_ParVectorInRangeOf(ads_data -> A); if (ads_data -> A_C) { ads_data -> r1 = hypre_ParVectorInRangeOf(ads_data -> A_C); ads_data -> g1 = hypre_ParVectorInRangeOf(ads_data -> A_C); } if (ads_data -> cycle_type > 10) { ads_data -> r2 = hypre_ParVectorInDomainOf(ads_data -> Pix); ads_data -> g2 = hypre_ParVectorInDomainOf(ads_data -> Pix); } else { ads_data -> r2 = hypre_ParVectorInDomainOf(ads_data -> Pi); ads_data -> g2 = hypre_ParVectorInDomainOf(ads_data -> Pi); } return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_ADSSolve * * Solve the system A x = b. *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ADSSolve(void *solver, hypre_ParCSRMatrix *A, hypre_ParVector *b, hypre_ParVector *x) { hypre_ADSData *ads_data = (hypre_ADSData *) solver; HYPRE_Int i, my_id = -1; HYPRE_Real r0_norm = 1.0; HYPRE_Real r_norm = 1.0; HYPRE_Real b_norm = 1.0; HYPRE_Real relative_resid = 0, old_resid; char cycle[30]; hypre_ParCSRMatrix *Ai[5], *Pi[5]; HYPRE_Solver Bi[5]; HYPRE_PtrToSolverFcn HBi[5]; hypre_ParVector *ri[5], *gi[5]; HYPRE_Int needZ = 0; hypre_ParVector *z = ads_data -> zz; Ai[0] = ads_data -> A_C; Pi[0] = ads_data -> C; Ai[1] = ads_data -> A_Pi; Pi[1] = ads_data -> Pi; Ai[2] = ads_data -> A_Pix; Pi[2] = ads_data -> Pix; Ai[3] = ads_data -> A_Piy; Pi[3] = ads_data -> Piy; Ai[4] = ads_data -> A_Piz; Pi[4] = ads_data -> Piz; Bi[0] = ads_data -> B_C; HBi[0] = (HYPRE_PtrToSolverFcn) hypre_AMSSolve; Bi[1] = ads_data -> B_Pi; HBi[1] = (HYPRE_PtrToSolverFcn) hypre_BoomerAMGBlockSolve; Bi[2] = ads_data -> B_Pix; HBi[2] = (HYPRE_PtrToSolverFcn) hypre_BoomerAMGSolve; Bi[3] = ads_data -> B_Piy; HBi[3] = (HYPRE_PtrToSolverFcn) hypre_BoomerAMGSolve; Bi[4] = ads_data -> B_Piz; HBi[4] = (HYPRE_PtrToSolverFcn) hypre_BoomerAMGSolve; ri[0] = ads_data -> r1; gi[0] = ads_data -> g1; ri[1] = ads_data -> r2; gi[1] = ads_data -> g2; ri[2] = ads_data -> r2; gi[2] = ads_data -> g2; ri[3] = ads_data -> r2; gi[3] = ads_data -> g2; ri[4] = ads_data -> r2; gi[4] = ads_data -> g2; #if defined(HYPRE_USING_GPU) HYPRE_ExecutionPolicy exec = hypre_GetExecPolicy1( hypre_ParCSRMatrixMemoryLocation(A) ); #endif /* may need to create an additional temporary vector for relaxation */ #if defined(HYPRE_USING_GPU) if (exec == HYPRE_EXEC_DEVICE) { needZ = ads_data -> A_relax_type == 2 || ads_data -> A_relax_type == 4 || ads_data -> A_relax_type == 16; } else #endif { needZ = hypre_NumThreads() > 1 || ads_data -> A_relax_type == 16; } if (needZ && !z) { z = hypre_ParVectorCreate(hypre_ParCSRMatrixComm(A), hypre_ParCSRMatrixGlobalNumRows(A), hypre_ParCSRMatrixRowStarts(A)); hypre_ParVectorInitialize(z); ads_data -> zz = z; } if (ads_data -> print_level > 0) { hypre_MPI_Comm_rank(hypre_ParCSRMatrixComm(A), &my_id); } switch (ads_data -> cycle_type) { case 1: default: hypre_sprintf(cycle, "%s", "01210"); break; case 2: hypre_sprintf(cycle, "%s", "(0+1+2)"); break; case 3: hypre_sprintf(cycle, "%s", "02120"); break; case 4: hypre_sprintf(cycle, "%s", "(010+2)"); break; case 5: hypre_sprintf(cycle, "%s", "0102010"); break; case 6: hypre_sprintf(cycle, "%s", "(020+1)"); break; case 7: hypre_sprintf(cycle, "%s", "0201020"); break; case 8: hypre_sprintf(cycle, "%s", "0(+1+2)0"); break; case 9: hypre_sprintf(cycle, "%s", "01210"); break; case 11: hypre_sprintf(cycle, "%s", "013454310"); break; case 12: hypre_sprintf(cycle, "%s", "(0+1+3+4+5)"); break; case 13: hypre_sprintf(cycle, "%s", "034515430"); break; case 14: hypre_sprintf(cycle, "%s", "01(+3+4+5)10"); break; } for (i = 0; i < ads_data -> maxit; i++) { /* Compute initial residual norms */ if (ads_data -> maxit > 1 && i == 0) { hypre_ParVectorCopy(b, ads_data -> r0); hypre_ParCSRMatrixMatvec(-1.0, ads_data -> A, x, 1.0, ads_data -> r0); r_norm = hypre_sqrt(hypre_ParVectorInnerProd(ads_data -> r0, ads_data -> r0)); r0_norm = r_norm; b_norm = hypre_sqrt(hypre_ParVectorInnerProd(b, b)); if (b_norm) { relative_resid = r_norm / b_norm; } else { relative_resid = r_norm; } if (my_id == 0 && ads_data -> print_level > 0) { hypre_printf(" relative\n"); hypre_printf(" residual factor residual\n"); hypre_printf(" -------- ------ --------\n"); hypre_printf(" Initial %e %e\n", r_norm, relative_resid); } } /* Apply the preconditioner */ hypre_ParCSRSubspacePrec(ads_data -> A, ads_data -> A_relax_type, ads_data -> A_relax_times, ads_data -> A_l1_norms ? hypre_VectorData(ads_data -> A_l1_norms) : NULL, ads_data -> A_relax_weight, ads_data -> A_omega, ads_data -> A_max_eig_est, ads_data -> A_min_eig_est, ads_data -> A_cheby_order, ads_data -> A_cheby_fraction, Ai, Bi, HBi, Pi, ri, gi, b, x, ads_data -> r0, ads_data -> g0, cycle, z); /* Compute new residual norms */ if (ads_data -> maxit > 1) { old_resid = r_norm; hypre_ParVectorCopy(b, ads_data -> r0); hypre_ParCSRMatrixMatvec(-1.0, ads_data -> A, x, 1.0, ads_data -> r0); r_norm = hypre_sqrt(hypre_ParVectorInnerProd(ads_data -> r0, ads_data -> r0)); if (b_norm) { relative_resid = r_norm / b_norm; } else { relative_resid = r_norm; } if (my_id == 0 && ads_data -> print_level > 0) hypre_printf(" Cycle %2d %e %f %e \n", i + 1, r_norm, r_norm / old_resid, relative_resid); } if (relative_resid < ads_data -> tol) { i++; break; } } if (my_id == 0 && ads_data -> print_level > 0 && ads_data -> maxit > 1) { hypre_printf("\n\n Average Convergence Factor = %f\n\n", hypre_pow((r_norm / r0_norm), (1.0 / (HYPRE_Real) i))); } ads_data -> num_iterations = i; ads_data -> rel_resid_norm = relative_resid; if (ads_data -> num_iterations == ads_data -> maxit && ads_data -> tol > 0.0) { hypre_error(HYPRE_ERROR_CONV); } return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_ADSGetNumIterations * * Get the number of ADS iterations. *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ADSGetNumIterations(void *solver, HYPRE_Int *num_iterations) { hypre_ADSData *ads_data = (hypre_ADSData *) solver; *num_iterations = ads_data -> num_iterations; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_ADSGetFinalRelativeResidualNorm * * Get the final relative residual norm in ADS. *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ADSGetFinalRelativeResidualNorm(void *solver, HYPRE_Real *rel_resid_norm) { hypre_ADSData *ads_data = (hypre_ADSData *) solver; *rel_resid_norm = ads_data -> rel_resid_norm; return hypre_error_flag; } hypre-2.33.0/src/parcsr_ls/ads.h000066400000000000000000000136101477326011500164340ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #ifndef hypre_ADS_DATA_HEADER #define hypre_ADS_DATA_HEADER /*-------------------------------------------------------------------------- * Auxiliary space Divergence Solver data *--------------------------------------------------------------------------*/ typedef struct { /* Face element (RT0) stiffness matrix */ hypre_ParCSRMatrix *A; /* Discrete curl matrix (edge-to-face) */ hypre_ParCSRMatrix *C; /* Coarse grid matrix on the range of C^T */ hypre_ParCSRMatrix *A_C; /* AMS solver for A_C */ HYPRE_Solver B_C; /* Raviart-Thomas nodal interpolation matrix (vertex^3-to-face) */ hypre_ParCSRMatrix *Pi; /* Coarse grid matrix on the range of Pi^T */ hypre_ParCSRMatrix *A_Pi; /* AMG solver for A_Pi */ HYPRE_Solver B_Pi; /* Components of the face interpolation matrix (vertex-to-face each) */ hypre_ParCSRMatrix *Pix, *Piy, *Piz; /* Coarse grid matrices on the ranges of Pi{x,y,z}^T */ hypre_ParCSRMatrix *A_Pix, *A_Piy, *A_Piz; /* AMG solvers for A_Pi{x,y,z} */ HYPRE_Solver B_Pix, B_Piy, B_Piz; /* Does the solver own the RT/ND interpolations matrices? */ HYPRE_Int owns_Pi; /* The (high-order) edge interpolation matrix and its components */ hypre_ParCSRMatrix *ND_Pi, *ND_Pix, *ND_Piy, *ND_Piz; /* Discrete gradient matrix (vertex-to-edge) */ hypre_ParCSRMatrix *G; /* Coordinates of the vertices */ hypre_ParVector *x, *y, *z; /* Solver options */ HYPRE_Int maxit; HYPRE_Real tol; HYPRE_Int cycle_type; HYPRE_Int print_level; /* Smoothing options for A */ HYPRE_Int A_relax_type; HYPRE_Int A_relax_times; hypre_Vector *A_l1_norms; HYPRE_Real A_relax_weight; HYPRE_Real A_omega; HYPRE_Real A_max_eig_est; HYPRE_Real A_min_eig_est; HYPRE_Int A_cheby_order; HYPRE_Real A_cheby_fraction; /* AMS options for B_C */ HYPRE_Int B_C_cycle_type; HYPRE_Int B_C_coarsen_type; HYPRE_Int B_C_agg_levels; HYPRE_Int B_C_relax_type; HYPRE_Real B_C_theta; HYPRE_Int B_C_interp_type; HYPRE_Int B_C_Pmax; /* AMG options for B_Pi */ HYPRE_Int B_Pi_coarsen_type; HYPRE_Int B_Pi_agg_levels; HYPRE_Int B_Pi_relax_type; HYPRE_Real B_Pi_theta; HYPRE_Int B_Pi_interp_type; HYPRE_Int B_Pi_Pmax; /* Temporary vectors */ hypre_ParVector *r0, *g0, *r1, *g1, *r2, *g2, *zz; /* Output log info */ HYPRE_Int num_iterations; HYPRE_Real rel_resid_norm; } hypre_ADSData; /* Face stiffness matrix */ #define hypre_ADSDataA(ads_data) ((ads_data)->A) /* Face space data */ #define hypre_ADSDataDiscreteCurl(ads_data) ((ads_data)->C) #define hypre_ADSDataCurlCurlA(ads_data) ((ads_data)->A_C) #define hypre_ADSDataCurlCurlAMS(ads_data) ((ads_data)->B_C) /* Vector vertex space data */ #define hypre_ADSDataPiInterpolation(ads_data) ((ads_data)->Pi) #define hypre_ADSDataOwnsPiInterpolation(ads_data) ((ads_data)->owns_Pi) #define hypre_ADSDataPoissonA(ads_data) ((ads_data)->A_Pi) #define hypre_ADSDataPoissonAMG(ads_data) ((ads_data)->B_Pi) /* Discrete gradient and coordinates of the vertices */ #define hypre_ADSDataDiscreteGradient(ads_data) ((ads_data)->G) #define hypre_ADSDataVertexCoordinateX(ads_data) ((ads_data)->x) #define hypre_ADSDataVertexCoordinateY(ads_data) ((ads_data)->y) #define hypre_ADSDataVertexCoordinateZ(ads_data) ((ads_data)->z) /* Solver options */ #define hypre_ADSDataMaxIter(ads_data) ((ads_data)->maxit) #define hypre_ADSDataTol(ads_data) ((ads_data)->tol) #define hypre_ADSDataCycleType(ads_data) ((ads_data)->cycle_type) #define hypre_ADSDataPrintLevel(ads_data) ((ads_data)->print_level) /* Smoothing options */ #define hypre_ADSDataARelaxType(ads_data) ((ads_data)->A_relax_type) #define hypre_ADSDataARelaxTimes(ads_data) ((ads_data)->A_relax_times) #define hypre_ADSDataAL1Norms(ads_data) ((ads_data)->A_l1_norms) #define hypre_ADSDataARelaxWeight(ads_data) ((ads_data)->A_relax_weight) #define hypre_ADSDataAOmega(ads_data) ((ads_data)->A_omega) #define hypre_ADSDataAMaxEigEst(ads_data) ((ads_data)->A_max_eig_est) #define hypre_ADSDataAMinEigEst(ads_data) ((ads_data)->A_min_eig_est) #define hypre_ADSDataAChebyOrder(ads_data) ((ads_data)->A_cheby_order) #define hypre_ADSDataAChebyFraction(ads_data) ((ads_data)->A_cheby_fraction) /* AMS options */ #define hypre_ADSDataAMSCycleType(ads_data) ((ads_data)->B_C_cycle_type) #define hypre_ADSDataAMSCoarsenType(ads_data) ((ads_data)->B_C_coarsen_type) #define hypre_ADSDataAMSAggLevels(ads_data) ((ads_data)->B_C_agg_levels) #define hypre_ADSDataAMSRelaxType(ads_data) ((ads_data)->B_C_relax_type) #define hypre_ADSDataAMSStrengthThreshold(ads_data) ((ads_data)->B_C_theta) #define hypre_ADSDataAMSInterpType(ads_data) ((ads_data)->B_C_interp_type) #define hypre_ADSDataAMSPmax(ads_data) ((ads_data)->B_C_Pmax) /* AMG options */ #define hypre_ADSDataAMGCoarsenType(ads_data) ((ads_data)->B_Pi_coarsen_type) #define hypre_ADSDataAMGAggLevels(ads_data) ((ads_data)->B_Pi_agg_levels) #define hypre_ADSDataAMGRelaxType(ads_data) ((ads_data)->B_Pi_relax_type) #define hypre_ADSDataAMGStrengthThreshold(ads_data) ((ads_data)->B_Pi_theta) #define hypre_ADSDataAMGInterpType(ads_data) ((ads_data)->B_Pi_interp_type) #define hypre_ADSDataAMGPmax(ads_data) ((ads_data)->B_Pi_Pmax) /* Temporary vectors */ #define hypre_ADSDataTempFaceVectorR(ads_data) ((ads_data)->r0) #define hypre_ADSDataTempFaceVectorG(ads_data) ((ads_data)->g0) #define hypre_ADSDataTempEdgeVectorR(ads_data) ((ads_data)->r1) #define hypre_ADSDataTempEdgeVectorG(ads_data) ((ads_data)->g1) #define hypre_ADSDataTempVertexVectorR(ads_data) ((ads_data)->r2) #define hypre_ADSDataTempVertexVectorG(ads_data) ((ads_data)->g2) #endif hypre-2.33.0/src/parcsr_ls/ame.c000066400000000000000000000740351477326011500164320ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "_hypre_onedpl.hpp" #include "_hypre_parcsr_ls.h" #include "float.h" #include "ams.h" #include "temp_multivector.h" #include "lobpcg.h" #include "ame.h" #include "_hypre_utilities.hpp" /*-------------------------------------------------------------------------- * hypre_AMECreate * * Allocate the AMS eigensolver structure. *--------------------------------------------------------------------------*/ void * hypre_AMECreate(void) { hypre_AMEData *ame_data; ame_data = hypre_CTAlloc(hypre_AMEData, 1, HYPRE_MEMORY_HOST); /* Default parameters */ ame_data -> block_size = 1; /* compute 1 eigenvector */ ame_data -> pcg_maxit = 20; /* perform at most 20 PCG-AMG */ ame_data -> maxit = 100; /* perform at most 100 iterations */ ame_data -> atol = 1e-6; /* absolute convergence tolerance */ ame_data -> rtol = 1e-6; /* relative convergence tolerance */ ame_data -> print_level = 1; /* print max residual norm at each step */ /* These will be computed during setup */ ame_data -> eigenvectors = NULL; ame_data -> eigenvalues = NULL; ame_data -> interpreter = NULL; ame_data -> G = NULL; ame_data -> A_G = NULL; ame_data -> B1_G = NULL; ame_data -> B2_G = NULL; ame_data -> t1 = NULL; ame_data -> t2 = NULL; ame_data -> t3 = NULL; /* The rest of the fields are initialized using the Set functions */ ame_data -> precond = NULL; ame_data -> M = NULL; return (void *) ame_data; } /*-------------------------------------------------------------------------- * hypre_AMEDestroy * * Deallocate the AMS eigensolver structure. If hypre_AMEGetEigenvectors() * has been called, the eigenvalue/vector data will not be destroyed. *--------------------------------------------------------------------------*/ HYPRE_Int hypre_AMEDestroy(void *esolver) { hypre_AMEData *ame_data = (hypre_AMEData *) esolver; hypre_AMSData *ams_data; mv_InterfaceInterpreter* interpreter; mv_MultiVectorPtr eigenvectors; if (!ame_data) { hypre_error_in_arg(1); return hypre_error_flag; } ams_data = ame_data -> precond; interpreter = (mv_InterfaceInterpreter*) ame_data -> interpreter; eigenvectors = (mv_MultiVectorPtr) ame_data -> eigenvectors; if (!ams_data || !interpreter || !eigenvectors) { hypre_error_in_arg(1); return hypre_error_flag; } if (ame_data -> G) { hypre_ParCSRMatrixDestroy(ame_data -> G); } if (ame_data -> A_G) { hypre_ParCSRMatrixDestroy(ame_data -> A_G); } if (ame_data -> B1_G) { HYPRE_BoomerAMGDestroy(ame_data -> B1_G); } if (ame_data -> B2_G) { HYPRE_ParCSRPCGDestroy(ame_data -> B2_G); } if (ame_data -> eigenvalues) { hypre_TFree(ame_data -> eigenvalues, HYPRE_MEMORY_HOST); } if (eigenvectors) { mv_MultiVectorDestroy(eigenvectors); } if (interpreter) { hypre_TFree(interpreter, HYPRE_MEMORY_HOST); } if (ams_data -> beta_is_zero) { if (ame_data -> t1) { hypre_ParVectorDestroy(ame_data -> t1); } if (ame_data -> t2) { hypre_ParVectorDestroy(ame_data -> t2); } } if (ame_data) { hypre_TFree(ame_data, HYPRE_MEMORY_HOST); } /* Fields initialized using the Set functions are not destroyed */ return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_AMESetAMSSolver * * Sets the AMS solver to be used as a preconditioner in the eigensolver. * This function should be called before hypre_AMESetup()! *--------------------------------------------------------------------------*/ HYPRE_Int hypre_AMESetAMSSolver(void *esolver, void *ams_solver) { hypre_AMEData *ame_data = (hypre_AMEData *) esolver; ame_data -> precond = (hypre_AMSData*) ams_solver; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_AMESetMassMatrix * * Sets the edge mass matrix, which appear on the rhs of the eigenproblem. * This function should be called before hypre_AMESetup()! *--------------------------------------------------------------------------*/ HYPRE_Int hypre_AMESetMassMatrix(void *esolver, hypre_ParCSRMatrix *M) { hypre_AMEData *ame_data = (hypre_AMEData *) esolver; ame_data -> M = M; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_AMESetBlockSize * * Sets the block size -- the number of eigenvalues/eigenvectors to be * computed. This function should be called before hypre_AMESetup()! *--------------------------------------------------------------------------*/ HYPRE_Int hypre_AMESetBlockSize(void *esolver, HYPRE_Int block_size) { hypre_AMEData *ame_data = (hypre_AMEData *) esolver; ame_data -> block_size = block_size; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_AMESetMaxIter * * Set the maximum number of iterations. The default value is 100. *--------------------------------------------------------------------------*/ HYPRE_Int hypre_AMESetMaxIter(void *esolver, HYPRE_Int maxit) { hypre_AMEData *ame_data = (hypre_AMEData *) esolver; ame_data -> maxit = maxit; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_AMESetMaxPCGIter * * Set the maximum number of iterations. The default value is 20. *--------------------------------------------------------------------------*/ HYPRE_Int hypre_AMESetMaxPCGIter(void *esolver, HYPRE_Int maxit) { hypre_AMEData *ame_data = (hypre_AMEData *) esolver; ame_data -> pcg_maxit = maxit; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_AMESetTol * * Set the absolute convergence tolerance. The default value is 1e-6. *--------------------------------------------------------------------------*/ HYPRE_Int hypre_AMESetTol(void *esolver, HYPRE_Real tol) { hypre_AMEData *ame_data = (hypre_AMEData *) esolver; ame_data -> atol = tol; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_AMESetRTol * * Set the relative convergence tolerance. The default value is 1e-6. *--------------------------------------------------------------------------*/ HYPRE_Int hypre_AMESetRTol(void *esolver, HYPRE_Real tol) { hypre_AMEData *ame_data = (hypre_AMEData *) esolver; ame_data -> rtol = tol; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_AMESetPrintLevel * * Control how much information is printed during the solution iterations. * The default values is 1. *--------------------------------------------------------------------------*/ HYPRE_Int hypre_AMESetPrintLevel(void *esolver, HYPRE_Int print_level) { hypre_AMEData *ame_data = (hypre_AMEData *) esolver; ame_data -> print_level = print_level; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_AMESetup * * Construct an eigensolver based on existing AMS solver. The number of * desired (minimal nonzero) eigenvectors is set by hypre_AMESetBlockSize(). * * The following functions need to be called before hypre_AMSSetup(): * - hypre_AMESetAMSSolver() * - hypre_AMESetMassMatrix() *--------------------------------------------------------------------------*/ #if defined(HYPRE_USING_GPU) __global__ void hypreGPUKernel_GtEliminateBoundary( hypre_DeviceItem &item, HYPRE_Int nrows, HYPRE_Int *Gt_diag_i, HYPRE_Int *Gt_diag_j, HYPRE_Complex *Gt_diag_data, HYPRE_Int *Gt_offd_i, HYPRE_Int *Gt_offd_j, HYPRE_Complex *Gt_offd_data, HYPRE_Int *edge_bc, HYPRE_Int *edge_bc_offd) { HYPRE_Int row_i = hypre_gpu_get_grid_warp_id<1, 1>(item); if (row_i >= nrows) { return; } HYPRE_Int lane = hypre_gpu_get_lane_id<1>(item); HYPRE_Int p1 = 0, q1, p2 = 0, q2 = 0; bool nonempty_offd = Gt_offd_j != NULL; bool bdr = false; if (lane < 2) { p1 = read_only_load(Gt_diag_i + row_i + lane); if (nonempty_offd) { p2 = read_only_load(Gt_offd_i + row_i + lane); } } q1 = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, p1, 1); p1 = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, p1, 0); if (nonempty_offd) { q2 = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, p2, 1); p2 = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, p2, 0); } for (HYPRE_Int j = p1 + lane; warp_any_sync(item, HYPRE_WARP_FULL_MASK, j < q1); j += HYPRE_WARP_SIZE) { const hypre_int k = j < q1 && read_only_load(&edge_bc[read_only_load(&Gt_diag_j[j])]) != 0; if ( warp_any_sync(item, HYPRE_WARP_FULL_MASK, k) ) { bdr = true; break; } } if (!bdr) { for (HYPRE_Int j = p2 + lane; warp_any_sync(item, HYPRE_WARP_FULL_MASK, j < q2); j += HYPRE_WARP_SIZE) { const hypre_int k = j < q2 && read_only_load(&edge_bc_offd[read_only_load(&Gt_offd_j[j])]) != 0; if ( warp_any_sync(item, HYPRE_WARP_FULL_MASK, k) ) { bdr = true; break; } } } if (bdr) { for (HYPRE_Int j = p1 + lane; j < q1; j += HYPRE_WARP_SIZE) { Gt_diag_data[j] = 0.0; } for (HYPRE_Int j = p2 + lane; j < q2; j += HYPRE_WARP_SIZE) { Gt_offd_data[j] = 0.0; } } } #endif HYPRE_Int hypre_AMESetup(void *esolver) { HYPRE_Int ne, *edge_bc; hypre_AMEData *ame_data = (hypre_AMEData *) esolver; hypre_AMSData *ams_data = ame_data -> precond; if (ams_data -> beta_is_zero) { ame_data -> t1 = hypre_ParVectorInDomainOf(ams_data -> G); ame_data -> t2 = hypre_ParVectorInDomainOf(ams_data -> G); } else { ame_data -> t1 = ams_data -> r1; ame_data -> t2 = ams_data -> g1; } ame_data -> t3 = ams_data -> r0; HYPRE_MemoryLocation memory_location = hypre_ParCSRMatrixMemoryLocation(ams_data -> A); #if defined(HYPRE_USING_GPU) HYPRE_ExecutionPolicy exec = hypre_GetExecPolicy1(memory_location); #endif /* Eliminate boundary conditions in G = [Gii, Gib; 0, Gbb], i.e., compute [Gii, 0; 0, 0] */ { HYPRE_Int i, j, k, nv; HYPRE_Int *offd_edge_bc; hypre_ParCSRMatrix *Gt; nv = hypre_ParCSRMatrixNumCols(ams_data -> G); ne = hypre_ParCSRMatrixNumRows(ams_data -> G); edge_bc = hypre_CTAlloc(HYPRE_Int, ne, memory_location); /* Find boundary (eliminated) edges */ { hypre_CSRMatrix *Ad = hypre_ParCSRMatrixDiag(ams_data -> A); HYPRE_Int *AdI = hypre_CSRMatrixI(Ad); HYPRE_Int *AdJ = hypre_CSRMatrixJ(Ad); HYPRE_Real *AdA = hypre_CSRMatrixData(Ad); hypre_CSRMatrix *Ao = hypre_ParCSRMatrixOffd(ams_data -> A); HYPRE_Int *AoI = hypre_CSRMatrixI(Ao); HYPRE_Real *AoA = hypre_CSRMatrixData(Ao); /* A row (edge) is boundary if its off-diag l1 norm is less than eps */ HYPRE_Real eps = DBL_EPSILON * 1e+4; #if defined(HYPRE_USING_GPU) if (exec == HYPRE_EXEC_DEVICE) { HYPRE_Real *l1norm_arr = hypre_TAlloc(HYPRE_Real, ne, memory_location); hypre_CSRMatrixExtractDiagonalDevice(Ad, l1norm_arr, 1); #if defined(HYPRE_USING_SYCL) HYPRE_ONEDPL_CALL( std::transform, l1norm_arr, l1norm_arr + ne, l1norm_arr, std::negate() ); #else HYPRE_THRUST_CALL( transform, l1norm_arr, l1norm_arr + ne, l1norm_arr, thrust::negate() ); #endif hypre_CSRMatrixComputeRowSumDevice(Ad, NULL, NULL, l1norm_arr, 1, 1.0, "add"); if (AoA) { hypre_CSRMatrixComputeRowSumDevice(Ao, NULL, NULL, l1norm_arr, 1, 1.0, "add"); } #if defined(HYPRE_USING_SYCL) hypreSycl_transform_if( edge_bc, edge_bc + ne, l1norm_arr, edge_bc, [] (const auto & x) {return 1;}, less_than(eps) ); #else HYPRE_THRUST_CALL( replace_if, edge_bc, edge_bc + ne, l1norm_arr, less_than(eps), 1 ); #endif hypre_TFree(l1norm_arr, memory_location); } else #endif { HYPRE_Real l1_norm; for (i = 0; i < ne; i++) { l1_norm = 0.0; for (j = AdI[i]; j < AdI[i + 1]; j++) if (AdJ[j] != i) { l1_norm += hypre_abs(AdA[j]); } if (AoI) for (j = AoI[i]; j < AoI[i + 1]; j++) { l1_norm += hypre_abs(AoA[j]); } if (l1_norm < eps) { edge_bc[i] = 1; } } } } hypre_ParCSRMatrixTranspose(ams_data->G, &Gt, 1); hypre_assert( hypre_ParCSRMatrixMemoryLocation(ams_data->G) == memory_location); /* Use a Matvec communication to find which of the edges connected to local vertices are on the boundary */ { hypre_ParCSRCommHandle *comm_handle; hypre_ParCSRCommPkg *comm_pkg; HYPRE_Int num_sends, *int_buf_data; HYPRE_Int index, start; offd_edge_bc = hypre_TAlloc(HYPRE_Int, hypre_CSRMatrixNumCols(hypre_ParCSRMatrixOffd(Gt)), memory_location); hypre_MatvecCommPkgCreate(Gt); comm_pkg = hypre_ParCSRMatrixCommPkg(Gt); num_sends = hypre_ParCSRCommPkgNumSends(comm_pkg); int_buf_data = hypre_TAlloc(HYPRE_Int, hypre_ParCSRCommPkgSendMapStart(comm_pkg, num_sends), memory_location ); #if defined(HYPRE_USING_GPU) if (exec == HYPRE_EXEC_DEVICE) { hypre_ParCSRCommPkgCopySendMapElmtsToDevice(comm_pkg); #if defined(HYPRE_USING_SYCL) hypreSycl_gather( hypre_ParCSRCommPkgDeviceSendMapElmts(comm_pkg), hypre_ParCSRCommPkgDeviceSendMapElmts(comm_pkg) + hypre_ParCSRCommPkgSendMapStart(comm_pkg, num_sends), edge_bc, int_buf_data ); #else HYPRE_THRUST_CALL( gather, hypre_ParCSRCommPkgDeviceSendMapElmts(comm_pkg), hypre_ParCSRCommPkgDeviceSendMapElmts(comm_pkg) + hypre_ParCSRCommPkgSendMapStart(comm_pkg, num_sends), edge_bc, int_buf_data ); #endif #if defined(HYPRE_USING_THRUST_NOSYNC) /* RL: make sure int_buf_data is ready before issuing GPU-GPU MPI */ if (hypre_GetGpuAwareMPI()) { hypre_ForceSyncComputeStream(); } #endif } else #endif { index = 0; for (i = 0; i < num_sends; i++) { start = hypre_ParCSRCommPkgSendMapStart(comm_pkg, i); for (j = start; j < hypre_ParCSRCommPkgSendMapStart(comm_pkg, i + 1); j++) { k = hypre_ParCSRCommPkgSendMapElmt(comm_pkg, j); int_buf_data[index++] = edge_bc[k]; } } } comm_handle = hypre_ParCSRCommHandleCreate_v2(11, comm_pkg, memory_location, int_buf_data, memory_location, offd_edge_bc); hypre_ParCSRCommHandleDestroy(comm_handle); hypre_TFree(int_buf_data, memory_location); } /* Eliminate boundary vertex entries in G^t */ { hypre_CSRMatrix *Gtd = hypre_ParCSRMatrixDiag(Gt); HYPRE_Int *GtdI = hypre_CSRMatrixI(Gtd); HYPRE_Int *GtdJ = hypre_CSRMatrixJ(Gtd); HYPRE_Real *GtdA = hypre_CSRMatrixData(Gtd); hypre_CSRMatrix *Gto = hypre_ParCSRMatrixOffd(Gt); HYPRE_Int *GtoI = hypre_CSRMatrixI(Gto); HYPRE_Int *GtoJ = hypre_CSRMatrixJ(Gto); HYPRE_Real *GtoA = hypre_CSRMatrixData(Gto); HYPRE_Int bdr; #if defined(HYPRE_USING_GPU) if (exec == HYPRE_EXEC_DEVICE) { dim3 bDim = hypre_GetDefaultDeviceBlockDimension(); dim3 gDim = hypre_GetDefaultDeviceGridDimension(nv, "warp", bDim); HYPRE_GPU_LAUNCH( hypreGPUKernel_GtEliminateBoundary, gDim, bDim, nv, GtdI, GtdJ, GtdA, GtoI, GtoJ, GtoA, edge_bc, offd_edge_bc ); } else #endif { for (i = 0; i < nv; i++) { bdr = 0; /* A vertex is boundary if it belongs to a boundary edge */ for (j = GtdI[i]; j < GtdI[i + 1]; j++) if (edge_bc[GtdJ[j]]) { bdr = 1; break; } if (!bdr && GtoI) for (j = GtoI[i]; j < GtoI[i + 1]; j++) if (offd_edge_bc[GtoJ[j]]) { bdr = 1; break; } if (bdr) { for (j = GtdI[i]; j < GtdI[i + 1]; j++) /* if (!edge_bc[GtdJ[j]]) */ { GtdA[j] = 0.0; } if (GtoI) for (j = GtoI[i]; j < GtoI[i + 1]; j++) /* if (!offd_edge_bc[GtoJ[j]]) */ { GtoA[j] = 0.0; } } } } } hypre_ParCSRMatrixTranspose(Gt, &ame_data -> G, 1); hypre_ParCSRMatrixDestroy(Gt); hypre_TFree(offd_edge_bc, memory_location); } /* Compute G^t M G */ { if (!hypre_ParCSRMatrixCommPkg(ame_data -> G)) { hypre_MatvecCommPkgCreate(ame_data -> G); } if (!hypre_ParCSRMatrixCommPkg(ame_data -> M)) { hypre_MatvecCommPkgCreate(ame_data -> M); } #if defined(HYPRE_USING_GPU) if (exec == HYPRE_EXEC_DEVICE) { ame_data -> A_G = hypre_ParCSRMatrixRAPKT(ame_data -> G, ame_data -> M, ame_data -> G, 1); } else #endif { hypre_BoomerAMGBuildCoarseOperator(ame_data -> G, ame_data -> M, ame_data -> G, &ame_data -> A_G); } hypre_ParCSRMatrixFixZeroRows(ame_data -> A_G); } /* Create AMG preconditioner and PCG-AMG solver for G^tMG */ { HYPRE_BoomerAMGCreate(&ame_data -> B1_G); HYPRE_BoomerAMGSetCoarsenType(ame_data -> B1_G, ams_data -> B_G_coarsen_type); HYPRE_BoomerAMGSetAggNumLevels(ame_data -> B1_G, ams_data -> B_G_agg_levels); HYPRE_BoomerAMGSetRelaxType(ame_data -> B1_G, ams_data -> B_G_relax_type); HYPRE_BoomerAMGSetNumSweeps(ame_data -> B1_G, 1); HYPRE_BoomerAMGSetMaxLevels(ame_data -> B1_G, 25); HYPRE_BoomerAMGSetTol(ame_data -> B1_G, 0.0); HYPRE_BoomerAMGSetMaxIter(ame_data -> B1_G, 1); HYPRE_BoomerAMGSetStrongThreshold(ame_data -> B1_G, ams_data -> B_G_theta); /* don't use exact solve on the coarsest level (matrix may be singular) */ HYPRE_BoomerAMGSetCycleRelaxType(ame_data -> B1_G, ams_data -> B_G_relax_type, 3); HYPRE_ParCSRPCGCreate(hypre_ParCSRMatrixComm(ame_data->A_G), &ame_data -> B2_G); HYPRE_PCGSetPrintLevel(ame_data -> B2_G, 0); HYPRE_PCGSetTol(ame_data -> B2_G, 1e-12); HYPRE_PCGSetMaxIter(ame_data -> B2_G, ame_data -> pcg_maxit); HYPRE_PCGSetPrecond(ame_data -> B2_G, (HYPRE_PtrToSolverFcn) HYPRE_BoomerAMGSolve, (HYPRE_PtrToSolverFcn) HYPRE_BoomerAMGSetup, ame_data -> B1_G); HYPRE_ParCSRPCGSetup(ame_data -> B2_G, (HYPRE_ParCSRMatrix)ame_data->A_G, (HYPRE_ParVector)ame_data->t1, (HYPRE_ParVector)ame_data->t2); } /* Setup LOBPCG */ { HYPRE_Int seed = 75; mv_InterfaceInterpreter* interpreter; mv_MultiVectorPtr eigenvectors; ame_data -> interpreter = hypre_CTAlloc(mv_InterfaceInterpreter, 1, HYPRE_MEMORY_HOST); interpreter = (mv_InterfaceInterpreter*) ame_data -> interpreter; HYPRE_ParCSRSetupInterpreter(interpreter); ame_data -> eigenvalues = hypre_CTAlloc(HYPRE_Real, ame_data -> block_size, HYPRE_MEMORY_HOST); ame_data -> eigenvectors = mv_MultiVectorCreateFromSampleVector(interpreter, ame_data -> block_size, ame_data -> t3); eigenvectors = (mv_MultiVectorPtr) ame_data -> eigenvectors; mv_MultiVectorSetRandom (eigenvectors, seed); /* Make the initial vectors discretely divergence free */ { HYPRE_Int i, j; HYPRE_Real *data; mv_TempMultiVector* tmp = (mv_TempMultiVector*) mv_MultiVectorGetData(eigenvectors); HYPRE_ParVector *v = (HYPRE_ParVector*)(tmp -> vector); hypre_ParVector *vi; for (i = 0; i < ame_data -> block_size; i++) { vi = (hypre_ParVector*) v[i]; data = hypre_VectorData(hypre_ParVectorLocalVector(vi)); #if defined(HYPRE_USING_GPU) if (exec == HYPRE_EXEC_DEVICE) { #if defined(HYPRE_USING_SYCL) hypreSycl_transform_if( data, data + ne, edge_bc, data, [] (const auto & x) {return 0.0;}, [] (const auto & x) {return x;} ); #else HYPRE_THRUST_CALL( replace_if, data, data + ne, edge_bc, thrust::identity(), 0.0 ); #endif } else #endif { for (j = 0; j < ne; j++) if (edge_bc[j]) { data[j] = 0.0; } } hypre_AMEDiscrDivFreeComponent(esolver, vi); } } } hypre_TFree(edge_bc, memory_location); return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_AMSDiscrDivFreeComponent * * Remove the component of b in the range of G, i.e., compute * b = (I - G (G^t M G)^{-1} G^t M) b * This way b will be orthogonal to gradients of linear functions. * The problem with G^t M G is solved only approximately by PCG-AMG. *--------------------------------------------------------------------------*/ HYPRE_Int hypre_AMEDiscrDivFreeComponent(void *esolver, hypre_ParVector *b) { hypre_AMEData *ame_data = (hypre_AMEData *) esolver; /* t3 = M b */ hypre_ParCSRMatrixMatvec(1.0, ame_data -> M, b, 0.0, ame_data -> t3); /* t1 = G^t t3 */ hypre_ParCSRMatrixMatvecT(1.0, ame_data -> G, ame_data -> t3, 0.0, ame_data -> t1); /* (G^t M G) t2 = t1 */ hypre_ParVectorSetConstantValues(ame_data -> t2, 0.0); HYPRE_ParCSRPCGSolve(ame_data -> B2_G, (HYPRE_ParCSRMatrix)ame_data -> A_G, (HYPRE_ParVector)ame_data -> t1, (HYPRE_ParVector)ame_data -> t2); /* b = b - G t2 */ hypre_ParCSRMatrixMatvec(-1.0, ame_data -> G, ame_data -> t2, 1.0, b); return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_AMEOperatorA and hypre_AMEMultiOperatorA * * The stiffness matrix considered as an operator on (multi)vectors. *--------------------------------------------------------------------------*/ void hypre_AMEOperatorA(void *data, void* x, void* y) { hypre_AMEData *ame_data = (hypre_AMEData *) data; hypre_AMSData *ams_data = ame_data -> precond; hypre_ParCSRMatrixMatvec(1.0, ams_data -> A, (hypre_ParVector*)x, 0.0, (hypre_ParVector*)y); } void hypre_AMEMultiOperatorA(void *data, void* x, void* y) { hypre_AMEData *ame_data = (hypre_AMEData *) data; mv_InterfaceInterpreter* interpreter = (mv_InterfaceInterpreter*) ame_data -> interpreter; interpreter -> Eval(hypre_AMEOperatorA, data, x, y); } /*-------------------------------------------------------------------------- * hypre_AMEOperatorM and hypre_AMEMultiOperatorM * * The mass matrix considered as an operator on (multi)vectors. *--------------------------------------------------------------------------*/ void hypre_AMEOperatorM(void *data, void* x, void* y) { hypre_AMEData *ame_data = (hypre_AMEData *) data; hypre_ParCSRMatrixMatvec(1.0, ame_data -> M, (hypre_ParVector*)x, 0.0, (hypre_ParVector*)y); } void hypre_AMEMultiOperatorM(void *data, void* x, void* y) { hypre_AMEData *ame_data = (hypre_AMEData *) data; mv_InterfaceInterpreter* interpreter = (mv_InterfaceInterpreter*) ame_data -> interpreter; interpreter -> Eval(hypre_AMEOperatorM, data, x, y); } /*-------------------------------------------------------------------------- * hypre_AMEOperatorB and hypre_AMEMultiOperatorB * * The AMS method considered as an operator on (multi)vectors. * Make sure that the result is discr. div. free. *--------------------------------------------------------------------------*/ void hypre_AMEOperatorB(void *data, void* x, void* y) { hypre_AMEData *ame_data = (hypre_AMEData *) data; hypre_AMSData *ams_data = ame_data -> precond; hypre_ParVectorSetConstantValues((hypre_ParVector*)y, 0.0); hypre_AMSSolve(ame_data -> precond, ams_data -> A, (hypre_ParVector*) x, (hypre_ParVector*) y); hypre_AMEDiscrDivFreeComponent(data, (hypre_ParVector *)y); } void hypre_AMEMultiOperatorB(void *data, void* x, void* y) { hypre_AMEData *ame_data = (hypre_AMEData *) data; mv_InterfaceInterpreter* interpreter = (mv_InterfaceInterpreter*) ame_data -> interpreter; interpreter -> Eval(hypre_AMEOperatorB, data, x, y); } /*-------------------------------------------------------------------------- * hypre_AMESolve * * Solve the eigensystem A u = lambda M u, G^t u = 0 using a subspace * version of LOBPCG (i.e. we iterate in the discr. div. free space). *--------------------------------------------------------------------------*/ HYPRE_Int hypre_AMESolve(void *esolver) { hypre_AMEData *ame_data = (hypre_AMEData *) esolver; HYPRE_Int nit; lobpcg_BLASLAPACKFunctions blap_fn; lobpcg_Tolerance lobpcg_tol; HYPRE_Real *residuals; blap_fn.dsygv = hypre_dsygv; blap_fn.dpotrf = hypre_dpotrf; lobpcg_tol.relative = ame_data -> rtol; lobpcg_tol.absolute = ame_data -> atol; residuals = hypre_TAlloc(HYPRE_Real, ame_data -> block_size, HYPRE_MEMORY_HOST); lobpcg_solve((mv_MultiVectorPtr) ame_data -> eigenvectors, esolver, hypre_AMEMultiOperatorA, esolver, hypre_AMEMultiOperatorM, esolver, hypre_AMEMultiOperatorB, NULL, blap_fn, lobpcg_tol, ame_data -> maxit, ame_data -> print_level, &nit, ame_data -> eigenvalues, NULL, ame_data -> block_size, residuals, NULL, ame_data -> block_size); hypre_TFree(residuals, HYPRE_MEMORY_HOST); return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_AMEGetEigenvectors * * Return a pointer to the computed eigenvectors. *--------------------------------------------------------------------------*/ HYPRE_Int hypre_AMEGetEigenvectors(void *esolver, HYPRE_ParVector **eigenvectors_ptr) { hypre_AMEData *ame_data = (hypre_AMEData *) esolver; mv_MultiVectorPtr eigenvectors = (mv_MultiVectorPtr) ame_data -> eigenvectors; mv_TempMultiVector* tmp = (mv_TempMultiVector*) mv_MultiVectorGetData(eigenvectors); *eigenvectors_ptr = (HYPRE_ParVector*)(tmp -> vector); tmp -> vector = NULL; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_AMEGetEigenvalues * * Return a pointer to the computed eigenvalues. *--------------------------------------------------------------------------*/ HYPRE_Int hypre_AMEGetEigenvalues(void *esolver, HYPRE_Real **eigenvalues_ptr) { hypre_AMEData *ame_data = (hypre_AMEData *) esolver; *eigenvalues_ptr = ame_data -> eigenvalues; ame_data -> eigenvalues = NULL; return hypre_error_flag; } hypre-2.33.0/src/parcsr_ls/ame.h000066400000000000000000000027041477326011500164310ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #ifndef hypre_AME_HEADER #define hypre_AME_HEADER /*-------------------------------------------------------------------------- * Auxiliary space Maxwell Eigensolver *--------------------------------------------------------------------------*/ typedef struct { /* The AMS preconditioner */ hypre_AMSData *precond; /* The edge element mass matrix */ hypre_ParCSRMatrix *M; /* Discrete gradient matrix with eliminated boundary */ hypre_ParCSRMatrix *G; /* The Laplacian matrix G^t M G */ hypre_ParCSRMatrix *A_G; /* AMG preconditioner for A_G */ HYPRE_Solver B1_G; /* PCG-AMG solver for A_G */ HYPRE_Solver B2_G; /* Eigensystem for A x = lambda M x, G^t x = 0 */ HYPRE_Int block_size; void *eigenvectors; HYPRE_Real *eigenvalues; /* Eigensolver (LOBPCG) options */ HYPRE_Int pcg_maxit; HYPRE_Int maxit; HYPRE_Real atol; HYPRE_Real rtol; HYPRE_Int print_level; /* Matrix-vector interface interpreter */ void *interpreter; /* Temporary vectors */ hypre_ParVector *t1, *t2, *t3; } hypre_AMEData; #include "_hypre_lapack.h" #endif hypre-2.33.0/src/parcsr_ls/amg_hybrid.c000066400000000000000000002222531477326011500177720ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * *****************************************************************************/ #include "_hypre_parcsr_ls.h" /*-------------------------------------------------------------------------- * hypre_AMGHybridData: *--------------------------------------------------------------------------*/ typedef struct { HYPRE_Real tol; HYPRE_Real a_tol; HYPRE_Real cf_tol; HYPRE_Int dscg_max_its; HYPRE_Int pcg_max_its; HYPRE_Int two_norm; HYPRE_Int stop_crit; HYPRE_Int rel_change; HYPRE_Int recompute_residual; HYPRE_Int recompute_residual_p; HYPRE_Int solver_type; HYPRE_Int k_dim; HYPRE_Int pcg_default; /* boolean */ HYPRE_Int (*pcg_precond_solve)(void*, void*, void*, void*); HYPRE_Int (*pcg_precond_setup)(void*, void*, void*, void*); void *pcg_precond; void *pcg_solver; /* log info (always logged) */ HYPRE_Int dscg_num_its; HYPRE_Int pcg_num_its; HYPRE_Real final_rel_res_norm; HYPRE_Int time_index; HYPRE_Real setup_time1; HYPRE_Real setup_time2; HYPRE_Real solve_time1; HYPRE_Real solve_time2; MPI_Comm comm; /* additional information (place-holder currently used to print norms) */ HYPRE_Int logging; HYPRE_Int print_level; /* info for BoomerAMG */ HYPRE_Real strong_threshold; HYPRE_Real max_row_sum; HYPRE_Real trunc_factor; HYPRE_Int pmax; HYPRE_Int setup_type; HYPRE_Int max_levels; HYPRE_Int measure_type; HYPRE_Int coarsen_type; HYPRE_Int interp_type; HYPRE_Int cycle_type; HYPRE_Int relax_order; HYPRE_Int keepT; HYPRE_Int max_coarse_size; HYPRE_Int min_coarse_size; HYPRE_Int seq_threshold; HYPRE_Int *num_grid_sweeps; HYPRE_Int *grid_relax_type; HYPRE_Int **grid_relax_points; HYPRE_Real *relax_weight; HYPRE_Real *omega; HYPRE_Int num_paths; HYPRE_Int agg_num_levels; HYPRE_Int agg_interp_type; HYPRE_Int num_functions; HYPRE_Int nodal; HYPRE_Int *dof_func; /* data needed for non-Galerkin option */ HYPRE_Int nongalerk_num_tol; HYPRE_Real *nongalerkin_tol; } hypre_AMGHybridData; /*-------------------------------------------------------------------------- * hypre_AMGHybridCreate *--------------------------------------------------------------------------*/ void * hypre_AMGHybridCreate( void ) { hypre_AMGHybridData *AMGhybrid_data; AMGhybrid_data = hypre_CTAlloc(hypre_AMGHybridData, 1, HYPRE_MEMORY_HOST); (AMGhybrid_data -> time_index) = hypre_InitializeTiming("AMGHybrid"); /* set defaults */ (AMGhybrid_data -> tol) = 1.0e-06; (AMGhybrid_data -> a_tol) = 0.0; (AMGhybrid_data -> cf_tol) = 0.90; (AMGhybrid_data -> dscg_max_its) = 1000; (AMGhybrid_data -> pcg_max_its) = 200; (AMGhybrid_data -> two_norm) = 0; (AMGhybrid_data -> stop_crit) = 0; (AMGhybrid_data -> rel_change) = 0; (AMGhybrid_data -> pcg_default) = 1; (AMGhybrid_data -> solver_type) = 1; (AMGhybrid_data -> pcg_precond_solve) = NULL; (AMGhybrid_data -> pcg_precond_setup) = NULL; (AMGhybrid_data -> pcg_precond) = NULL; (AMGhybrid_data -> pcg_solver) = NULL; (AMGhybrid_data -> setup_time1) = 0.0; (AMGhybrid_data -> setup_time2) = 0.0; (AMGhybrid_data -> solve_time1) = 0.0; (AMGhybrid_data -> solve_time2) = 0.0; /* initialize */ (AMGhybrid_data -> dscg_num_its) = 0; (AMGhybrid_data -> pcg_num_its) = 0; (AMGhybrid_data -> logging) = 0; (AMGhybrid_data -> print_level) = 0; (AMGhybrid_data -> k_dim) = 5; /* BoomerAMG info */ (AMGhybrid_data -> setup_type) = 1; (AMGhybrid_data -> strong_threshold) = 0.25; (AMGhybrid_data -> max_row_sum) = 0.9; (AMGhybrid_data -> trunc_factor) = 0.0; (AMGhybrid_data -> pmax) = 4; (AMGhybrid_data -> max_levels) = 25; (AMGhybrid_data -> measure_type) = 0; (AMGhybrid_data -> coarsen_type) = 10; (AMGhybrid_data -> interp_type) = 6; (AMGhybrid_data -> cycle_type) = 1; (AMGhybrid_data -> relax_order) = 0; (AMGhybrid_data -> keepT) = 0; (AMGhybrid_data -> max_coarse_size) = 9; (AMGhybrid_data -> min_coarse_size) = 1; (AMGhybrid_data -> seq_threshold) = 0; (AMGhybrid_data -> num_grid_sweeps) = NULL; (AMGhybrid_data -> grid_relax_type) = NULL; (AMGhybrid_data -> grid_relax_points) = NULL; (AMGhybrid_data -> relax_weight) = NULL; (AMGhybrid_data -> omega) = NULL; (AMGhybrid_data -> agg_num_levels) = 0; (AMGhybrid_data -> agg_interp_type) = 4; (AMGhybrid_data -> num_paths) = 1; (AMGhybrid_data -> num_functions) = 1; (AMGhybrid_data -> nodal) = 0; (AMGhybrid_data -> dof_func) = NULL; (AMGhybrid_data -> nongalerk_num_tol) = 0; (AMGhybrid_data -> nongalerkin_tol) = NULL; return (void *) AMGhybrid_data; } /*-------------------------------------------------------------------------- * hypre_AMGHybridDestroy *--------------------------------------------------------------------------*/ HYPRE_Int hypre_AMGHybridDestroy( void *AMGhybrid_vdata ) { hypre_AMGHybridData *AMGhybrid_data = (hypre_AMGHybridData *)AMGhybrid_vdata; HYPRE_Int i; if (AMGhybrid_data) { HYPRE_Int solver_type = (AMGhybrid_data -> solver_type); /*HYPRE_Int pcg_default = (AMGhybrid_data -> pcg_default);*/ void *pcg_solver = (AMGhybrid_data -> pcg_solver); void *pcg_precond = (AMGhybrid_data -> pcg_precond); if (pcg_precond) { hypre_BoomerAMGDestroy(pcg_precond); } if (solver_type == 1) { hypre_PCGDestroy(pcg_solver); } if (solver_type == 2) { hypre_GMRESDestroy(pcg_solver); } if (solver_type == 3) { hypre_BiCGSTABDestroy(pcg_solver); } if (AMGhybrid_data -> num_grid_sweeps) { hypre_TFree( (AMGhybrid_data -> num_grid_sweeps), HYPRE_MEMORY_HOST); (AMGhybrid_data -> num_grid_sweeps) = NULL; } if (AMGhybrid_data -> grid_relax_type) { hypre_TFree( (AMGhybrid_data -> grid_relax_type), HYPRE_MEMORY_HOST); (AMGhybrid_data -> grid_relax_type) = NULL; } if (AMGhybrid_data -> grid_relax_points) { for (i = 0; i < 4; i++) { hypre_TFree( (AMGhybrid_data -> grid_relax_points)[i], HYPRE_MEMORY_HOST); } hypre_TFree( (AMGhybrid_data -> grid_relax_points), HYPRE_MEMORY_HOST); (AMGhybrid_data -> grid_relax_points) = NULL; } if (AMGhybrid_data -> relax_weight) { hypre_TFree( (AMGhybrid_data -> relax_weight), HYPRE_MEMORY_HOST); (AMGhybrid_data -> relax_weight) = NULL; } if (AMGhybrid_data -> omega) { hypre_TFree( (AMGhybrid_data -> omega), HYPRE_MEMORY_HOST); (AMGhybrid_data -> omega) = NULL; } if (AMGhybrid_data -> dof_func) { hypre_TFree( (AMGhybrid_data -> dof_func), HYPRE_MEMORY_HOST); (AMGhybrid_data -> dof_func) = NULL; } hypre_TFree(AMGhybrid_data, HYPRE_MEMORY_HOST); } return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_AMGHybridSetTol *--------------------------------------------------------------------------*/ HYPRE_Int hypre_AMGHybridSetTol( void *AMGhybrid_vdata, HYPRE_Real tol ) { hypre_AMGHybridData *AMGhybrid_data = (hypre_AMGHybridData *) AMGhybrid_vdata; if (!AMGhybrid_data) { hypre_error_in_arg(1); return hypre_error_flag; } if (tol < 0 || tol > 1) { hypre_error_in_arg(2); return hypre_error_flag; } (AMGhybrid_data -> tol) = tol; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_AMGHybridSetAbsoluteTol *--------------------------------------------------------------------------*/ HYPRE_Int hypre_AMGHybridSetAbsoluteTol( void *AMGhybrid_vdata, HYPRE_Real a_tol ) { hypre_AMGHybridData *AMGhybrid_data = (hypre_AMGHybridData *) AMGhybrid_vdata; if (!AMGhybrid_data) { hypre_error_in_arg(1); return hypre_error_flag; } if (a_tol < 0 || a_tol > 1) { hypre_error_in_arg(2); return hypre_error_flag; } (AMGhybrid_data -> a_tol) = a_tol; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_AMGHybridSetConvergenceTol *--------------------------------------------------------------------------*/ HYPRE_Int hypre_AMGHybridSetConvergenceTol( void *AMGhybrid_vdata, HYPRE_Real cf_tol ) { hypre_AMGHybridData *AMGhybrid_data = (hypre_AMGHybridData *) AMGhybrid_vdata; if (!AMGhybrid_data) { hypre_error_in_arg(1); return hypre_error_flag; } if (cf_tol < 0 || cf_tol > 1) { hypre_error_in_arg(2); return hypre_error_flag; } (AMGhybrid_data -> cf_tol) = cf_tol; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_AMGHybridSetNonGalerkinTol *--------------------------------------------------------------------------*/ HYPRE_Int hypre_AMGHybridSetNonGalerkinTol( void *AMGhybrid_vdata, HYPRE_Int nongalerk_num_tol, HYPRE_Real *nongalerkin_tol ) { hypre_AMGHybridData *AMGhybrid_data = (hypre_AMGHybridData *) AMGhybrid_vdata; if (!AMGhybrid_data) { hypre_error_in_arg(1); return hypre_error_flag; } if (nongalerk_num_tol < 0) { hypre_error_in_arg(2); return hypre_error_flag; } (AMGhybrid_data -> nongalerk_num_tol) = nongalerk_num_tol; (AMGhybrid_data -> nongalerkin_tol) = nongalerkin_tol; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_AMGHybridSetDSCGMaxIter *--------------------------------------------------------------------------*/ HYPRE_Int hypre_AMGHybridSetDSCGMaxIter( void *AMGhybrid_vdata, HYPRE_Int dscg_max_its ) { hypre_AMGHybridData *AMGhybrid_data = (hypre_AMGHybridData *) AMGhybrid_vdata; if (!AMGhybrid_data) { hypre_error_in_arg(1); return hypre_error_flag; } if (dscg_max_its < 0) { hypre_error_in_arg(2); return hypre_error_flag; } (AMGhybrid_data -> dscg_max_its) = dscg_max_its; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_AMGHybridSetPCGMaxIter *--------------------------------------------------------------------------*/ HYPRE_Int hypre_AMGHybridSetPCGMaxIter( void *AMGhybrid_vdata, HYPRE_Int pcg_max_its ) { hypre_AMGHybridData *AMGhybrid_data = (hypre_AMGHybridData *) AMGhybrid_vdata; if (!AMGhybrid_data) { hypre_error_in_arg(1); return hypre_error_flag; } if (pcg_max_its < 0) { hypre_error_in_arg(2); return hypre_error_flag; } (AMGhybrid_data -> pcg_max_its) = pcg_max_its; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_AMGHybridSetSetupType *--------------------------------------------------------------------------*/ HYPRE_Int hypre_AMGHybridSetSetupType( void *AMGhybrid_vdata, HYPRE_Int setup_type ) { hypre_AMGHybridData *AMGhybrid_data = (hypre_AMGHybridData *) AMGhybrid_vdata; if (!AMGhybrid_data) { hypre_error_in_arg(1); return hypre_error_flag; } (AMGhybrid_data -> setup_type) = setup_type; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_AMGHybridSetSolverType *--------------------------------------------------------------------------*/ HYPRE_Int hypre_AMGHybridSetSolverType( void *AMGhybrid_vdata, HYPRE_Int solver_type ) { hypre_AMGHybridData *AMGhybrid_data = (hypre_AMGHybridData *) AMGhybrid_vdata; if (!AMGhybrid_data) { hypre_error_in_arg(1); return hypre_error_flag; } (AMGhybrid_data -> solver_type) = solver_type; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_AMGHybridSetRecomputeResidual *--------------------------------------------------------------------------*/ HYPRE_Int hypre_AMGHybridSetRecomputeResidual( void *AMGhybrid_vdata, HYPRE_Int recompute_residual ) { hypre_AMGHybridData *AMGhybrid_data = (hypre_AMGHybridData *)AMGhybrid_vdata; if (!AMGhybrid_data) { hypre_error_in_arg(1); return hypre_error_flag; } (AMGhybrid_data -> recompute_residual) = recompute_residual; return hypre_error_flag; } HYPRE_Int hypre_AMGHybridGetRecomputeResidual( void *AMGhybrid_vdata, HYPRE_Int *recompute_residual ) { hypre_AMGHybridData *AMGhybrid_data = (hypre_AMGHybridData *)AMGhybrid_vdata; if (!AMGhybrid_data) { hypre_error_in_arg(1); return hypre_error_flag; } *recompute_residual = (AMGhybrid_data -> recompute_residual); return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_AMGHybridSetRecomputeResidualP *--------------------------------------------------------------------------*/ HYPRE_Int hypre_AMGHybridSetRecomputeResidualP( void *AMGhybrid_vdata, HYPRE_Int recompute_residual_p ) { hypre_AMGHybridData *AMGhybrid_data = (hypre_AMGHybridData *)AMGhybrid_vdata; if (!AMGhybrid_data) { hypre_error_in_arg(1); return hypre_error_flag; } (AMGhybrid_data -> recompute_residual_p) = recompute_residual_p; return hypre_error_flag; } HYPRE_Int hypre_AMGHybridGetRecomputeResidualP( void *AMGhybrid_vdata, HYPRE_Int *recompute_residual_p ) { hypre_AMGHybridData *AMGhybrid_data = (hypre_AMGHybridData *)AMGhybrid_vdata; if (!AMGhybrid_data) { hypre_error_in_arg(1); return hypre_error_flag; } *recompute_residual_p = (AMGhybrid_data -> recompute_residual_p); return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_AMGHybridSetKDim *--------------------------------------------------------------------------*/ HYPRE_Int hypre_AMGHybridSetKDim( void *AMGhybrid_vdata, HYPRE_Int k_dim ) { hypre_AMGHybridData *AMGhybrid_data = (hypre_AMGHybridData *) AMGhybrid_vdata; if (!AMGhybrid_data) { hypre_error_in_arg(1); return hypre_error_flag; } if (k_dim < 1) { hypre_error_in_arg(2); return hypre_error_flag; } (AMGhybrid_data -> k_dim) = k_dim; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_AMGHybridSetStopCrit *--------------------------------------------------------------------------*/ HYPRE_Int hypre_AMGHybridSetStopCrit( void *AMGhybrid_vdata, HYPRE_Int stop_crit ) { hypre_AMGHybridData *AMGhybrid_data = (hypre_AMGHybridData *) AMGhybrid_vdata; if (!AMGhybrid_data) { hypre_error_in_arg(1); return hypre_error_flag; } (AMGhybrid_data -> stop_crit) = stop_crit; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_AMGHybridSetTwoNorm *--------------------------------------------------------------------------*/ HYPRE_Int hypre_AMGHybridSetTwoNorm( void *AMGhybrid_vdata, HYPRE_Int two_norm ) { hypre_AMGHybridData *AMGhybrid_data = (hypre_AMGHybridData *) AMGhybrid_vdata; if (!AMGhybrid_data) { hypre_error_in_arg(1); return hypre_error_flag; } (AMGhybrid_data -> two_norm) = two_norm; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_AMGHybridSetRelChange *--------------------------------------------------------------------------*/ HYPRE_Int hypre_AMGHybridSetRelChange( void *AMGhybrid_vdata, HYPRE_Int rel_change ) { hypre_AMGHybridData *AMGhybrid_data = (hypre_AMGHybridData *) AMGhybrid_vdata; if (!AMGhybrid_data) { hypre_error_in_arg(1); return hypre_error_flag; } (AMGhybrid_data -> rel_change) = rel_change; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_AMGHybridSetPrecond *--------------------------------------------------------------------------*/ HYPRE_Int hypre_AMGHybridSetPrecond( void *pcg_vdata, HYPRE_Int (*pcg_precond_solve)(void*, void*, void*, void*), HYPRE_Int (*pcg_precond_setup)(void*, void*, void*, void*), void *pcg_precond ) { hypre_AMGHybridData *pcg_data = (hypre_AMGHybridData *) pcg_vdata; if (!pcg_data) { hypre_error_in_arg(1); return hypre_error_flag; } (pcg_data -> pcg_default) = 0; (pcg_data -> pcg_precond_solve) = pcg_precond_solve; (pcg_data -> pcg_precond_setup) = pcg_precond_setup; (pcg_data -> pcg_precond) = pcg_precond; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_AMGHybridSetLogging *--------------------------------------------------------------------------*/ HYPRE_Int hypre_AMGHybridSetLogging( void *AMGhybrid_vdata, HYPRE_Int logging ) { hypre_AMGHybridData *AMGhybrid_data = (hypre_AMGHybridData *) AMGhybrid_vdata; if (!AMGhybrid_data) { hypre_error_in_arg(1); return hypre_error_flag; } (AMGhybrid_data -> logging) = logging; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_AMGHybridSetPrintLevel *--------------------------------------------------------------------------*/ HYPRE_Int hypre_AMGHybridSetPrintLevel( void *AMGhybrid_vdata, HYPRE_Int print_level ) { hypre_AMGHybridData *AMGhybrid_data = (hypre_AMGHybridData *) AMGhybrid_vdata; if (!AMGhybrid_data) { hypre_error_in_arg(1); return hypre_error_flag; } (AMGhybrid_data -> print_level) = print_level; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_AMGHybridSetStrongThreshold *--------------------------------------------------------------------------*/ HYPRE_Int hypre_AMGHybridSetStrongThreshold( void *AMGhybrid_vdata, HYPRE_Real strong_threshold) { hypre_AMGHybridData *AMGhybrid_data = (hypre_AMGHybridData *) AMGhybrid_vdata; if (!AMGhybrid_data) { hypre_error_in_arg(1); return hypre_error_flag; } if (strong_threshold < 0 || strong_threshold > 1) { hypre_error_in_arg(2); return hypre_error_flag; } (AMGhybrid_data -> strong_threshold) = strong_threshold; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_AMGHybridSetMaxRowSum *--------------------------------------------------------------------------*/ HYPRE_Int hypre_AMGHybridSetMaxRowSum( void *AMGhybrid_vdata, HYPRE_Real max_row_sum ) { hypre_AMGHybridData *AMGhybrid_data = (hypre_AMGHybridData *) AMGhybrid_vdata; if (!AMGhybrid_data) { hypre_error_in_arg(1); return hypre_error_flag; } if (max_row_sum < 0 || max_row_sum > 1) { hypre_error_in_arg(2); return hypre_error_flag; } (AMGhybrid_data -> max_row_sum) = max_row_sum; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_AMGHybridSetTruncFactor *--------------------------------------------------------------------------*/ HYPRE_Int hypre_AMGHybridSetTruncFactor( void *AMGhybrid_vdata, HYPRE_Real trunc_factor ) { hypre_AMGHybridData *AMGhybrid_data = (hypre_AMGHybridData *) AMGhybrid_vdata; if (!AMGhybrid_data) { hypre_error_in_arg(1); return hypre_error_flag; } if (trunc_factor < 0 || trunc_factor > 1) { hypre_error_in_arg(2); return hypre_error_flag; } (AMGhybrid_data -> trunc_factor) = trunc_factor; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_AMGHybridSetPMaxElmts *--------------------------------------------------------------------------*/ HYPRE_Int hypre_AMGHybridSetPMaxElmts( void *AMGhybrid_vdata, HYPRE_Int P_max_elmts ) { hypre_AMGHybridData *AMGhybrid_data = (hypre_AMGHybridData *) AMGhybrid_vdata; if (!AMGhybrid_data) { hypre_error_in_arg(1); return hypre_error_flag; } if (P_max_elmts < 0) { hypre_error_in_arg(2); return hypre_error_flag; } (AMGhybrid_data -> pmax) = P_max_elmts; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_AMGHybridSetMaxLevels *--------------------------------------------------------------------------*/ HYPRE_Int hypre_AMGHybridSetMaxLevels( void *AMGhybrid_vdata, HYPRE_Int max_levels ) { hypre_AMGHybridData *AMGhybrid_data = (hypre_AMGHybridData *) AMGhybrid_vdata; if (!AMGhybrid_data) { hypre_error_in_arg(1); return hypre_error_flag; } if (max_levels < 1) { hypre_error_in_arg(2); return hypre_error_flag; } (AMGhybrid_data -> max_levels) = max_levels; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_AMGHybridSetMeasureType *--------------------------------------------------------------------------*/ HYPRE_Int hypre_AMGHybridSetMeasureType( void *AMGhybrid_vdata, HYPRE_Int measure_type ) { hypre_AMGHybridData *AMGhybrid_data = (hypre_AMGHybridData *) AMGhybrid_vdata; if (!AMGhybrid_data) { hypre_error_in_arg(1); return hypre_error_flag; } (AMGhybrid_data -> measure_type) = measure_type; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_AMGHybridSetCoarsenType *--------------------------------------------------------------------------*/ HYPRE_Int hypre_AMGHybridSetCoarsenType( void *AMGhybrid_vdata, HYPRE_Int coarsen_type ) { hypre_AMGHybridData *AMGhybrid_data = (hypre_AMGHybridData *) AMGhybrid_vdata; if (!AMGhybrid_data) { hypre_error_in_arg(1); return hypre_error_flag; } (AMGhybrid_data -> coarsen_type) = coarsen_type; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_AMGHybridSetInterpType *--------------------------------------------------------------------------*/ HYPRE_Int hypre_AMGHybridSetInterpType( void *AMGhybrid_vdata, HYPRE_Int interp_type ) { hypre_AMGHybridData *AMGhybrid_data = (hypre_AMGHybridData *) AMGhybrid_vdata; if (!AMGhybrid_data) { hypre_error_in_arg(1); return hypre_error_flag; } if (interp_type < 0) { hypre_error_in_arg(2); return hypre_error_flag; } (AMGhybrid_data -> interp_type) = interp_type; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_AMGHybridSetCycleType *--------------------------------------------------------------------------*/ HYPRE_Int hypre_AMGHybridSetCycleType( void *AMGhybrid_vdata, HYPRE_Int cycle_type ) { hypre_AMGHybridData *AMGhybrid_data = (hypre_AMGHybridData *) AMGhybrid_vdata; if (!AMGhybrid_data) { hypre_error_in_arg(1); return hypre_error_flag; } if (cycle_type < 1 || cycle_type > 2) { hypre_error_in_arg(2); return hypre_error_flag; } (AMGhybrid_data -> cycle_type) = cycle_type; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_AMGHybridSetNumSweeps *--------------------------------------------------------------------------*/ HYPRE_Int hypre_AMGHybridSetNumSweeps( void *AMGhybrid_vdata, HYPRE_Int num_sweeps ) { hypre_AMGHybridData *AMGhybrid_data = (hypre_AMGHybridData *) AMGhybrid_vdata; HYPRE_Int *num_grid_sweeps; HYPRE_Int i; if (!AMGhybrid_data) { hypre_error_in_arg(1); return hypre_error_flag; } if (num_sweeps < 1) { hypre_error_in_arg(2); return hypre_error_flag; } if ((AMGhybrid_data -> num_grid_sweeps) == NULL) { (AMGhybrid_data -> num_grid_sweeps) = hypre_CTAlloc(HYPRE_Int, 4, HYPRE_MEMORY_HOST); } num_grid_sweeps = (AMGhybrid_data -> num_grid_sweeps); for (i = 0; i < 3; i++) { num_grid_sweeps[i] = num_sweeps; } num_grid_sweeps[3] = 1; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_AMGHybridSetCycleNumSweeps *--------------------------------------------------------------------------*/ HYPRE_Int hypre_AMGHybridSetCycleNumSweeps( void *AMGhybrid_vdata, HYPRE_Int num_sweeps, HYPRE_Int k) { hypre_AMGHybridData *AMGhybrid_data = (hypre_AMGHybridData *) AMGhybrid_vdata; HYPRE_Int *num_grid_sweeps; HYPRE_Int i; if (!AMGhybrid_data) { hypre_error_in_arg(1); return hypre_error_flag; } if (num_sweeps < 1) { hypre_error_in_arg(2); return hypre_error_flag; } if (k < 1 || k > 3) { if (AMGhybrid_data -> print_level) { hypre_printf (" Warning! Invalid cycle! num_sweeps not set!\n"); } hypre_error_in_arg(3); return hypre_error_flag; } num_grid_sweeps = (AMGhybrid_data -> num_grid_sweeps); if (num_grid_sweeps == NULL) { (AMGhybrid_data -> num_grid_sweeps) = hypre_CTAlloc(HYPRE_Int, 4, HYPRE_MEMORY_HOST); num_grid_sweeps = (AMGhybrid_data -> num_grid_sweeps); for (i = 0; i < 4; i++) { num_grid_sweeps[i] = 1; } } num_grid_sweeps[k] = num_sweeps; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_AMGHybridSetRelaxType *--------------------------------------------------------------------------*/ HYPRE_Int hypre_AMGHybridSetRelaxType( void *AMGhybrid_vdata, HYPRE_Int relax_type ) { hypre_AMGHybridData *AMGhybrid_data = (hypre_AMGHybridData *) AMGhybrid_vdata; HYPRE_Int *grid_relax_type; HYPRE_Int i; if (!AMGhybrid_data) { hypre_error_in_arg(1); return hypre_error_flag; } if ((AMGhybrid_data -> grid_relax_type) == NULL ) { (AMGhybrid_data -> grid_relax_type) = hypre_CTAlloc(HYPRE_Int, 4, HYPRE_MEMORY_HOST); } grid_relax_type = (AMGhybrid_data -> grid_relax_type); for (i = 0; i < 3; i++) { grid_relax_type[i] = relax_type; } grid_relax_type[3] = 9; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_AMGHybridSetCycleRelaxType *--------------------------------------------------------------------------*/ HYPRE_Int hypre_AMGHybridSetCycleRelaxType( void *AMGhybrid_vdata, HYPRE_Int relax_type, HYPRE_Int k ) { hypre_AMGHybridData *AMGhybrid_data = (hypre_AMGHybridData *) AMGhybrid_vdata; HYPRE_Int *grid_relax_type; if (!AMGhybrid_data) { hypre_error_in_arg(1); return hypre_error_flag; } if (k < 1 || k > 3) { if (AMGhybrid_data -> print_level) { hypre_printf (" Warning! Invalid cycle! Relax type not set!\n"); } hypre_error_in_arg(3); return hypre_error_flag; } grid_relax_type = (AMGhybrid_data -> grid_relax_type); if (grid_relax_type == NULL ) { (AMGhybrid_data -> grid_relax_type) = hypre_CTAlloc(HYPRE_Int, 4, HYPRE_MEMORY_HOST); grid_relax_type = (AMGhybrid_data -> grid_relax_type); grid_relax_type[1] = 13; grid_relax_type[2] = 14; grid_relax_type[3] = 9; } grid_relax_type[k] = relax_type; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_AMGHybridSetRelaxOrder *--------------------------------------------------------------------------*/ HYPRE_Int hypre_AMGHybridSetRelaxOrder( void *AMGhybrid_vdata, HYPRE_Int relax_order ) { hypre_AMGHybridData *AMGhybrid_data = (hypre_AMGHybridData *) AMGhybrid_vdata; if (!AMGhybrid_data) { hypre_error_in_arg(1); return hypre_error_flag; } (AMGhybrid_data -> relax_order) = relax_order; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_AMGHybridSetKeepTranspose *--------------------------------------------------------------------------*/ HYPRE_Int hypre_AMGHybridSetKeepTranspose( void *AMGhybrid_vdata, HYPRE_Int keepT ) { hypre_AMGHybridData *AMGhybrid_data = (hypre_AMGHybridData *) AMGhybrid_vdata; if (!AMGhybrid_data) { hypre_error_in_arg(1); return hypre_error_flag; } (AMGhybrid_data -> keepT) = keepT; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_AMGHybridSetMaxCoarseSize *--------------------------------------------------------------------------*/ HYPRE_Int hypre_AMGHybridSetMaxCoarseSize( void *AMGhybrid_vdata, HYPRE_Int max_coarse_size ) { hypre_AMGHybridData *AMGhybrid_data = (hypre_AMGHybridData *) AMGhybrid_vdata; if (!AMGhybrid_data) { hypre_error_in_arg(1); return hypre_error_flag; } if (max_coarse_size < 1) { hypre_error_in_arg(2); return hypre_error_flag; } (AMGhybrid_data -> max_coarse_size) = max_coarse_size; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_AMGHybridSetMinCoarseSize *--------------------------------------------------------------------------*/ HYPRE_Int hypre_AMGHybridSetMinCoarseSize( void *AMGhybrid_vdata, HYPRE_Int min_coarse_size ) { hypre_AMGHybridData *AMGhybrid_data = (hypre_AMGHybridData *) AMGhybrid_vdata; if (!AMGhybrid_data) { hypre_error_in_arg(1); return hypre_error_flag; } if (min_coarse_size < 0) { hypre_error_in_arg(2); return hypre_error_flag; } (AMGhybrid_data -> min_coarse_size) = min_coarse_size; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_AMGHybridSetSeqThreshold *--------------------------------------------------------------------------*/ HYPRE_Int hypre_AMGHybridSetSeqThreshold( void *AMGhybrid_vdata, HYPRE_Int seq_threshold ) { hypre_AMGHybridData *AMGhybrid_data = (hypre_AMGHybridData *) AMGhybrid_vdata; if (!AMGhybrid_data) { hypre_error_in_arg(1); return hypre_error_flag; } if (seq_threshold < 0) { hypre_error_in_arg(2); return hypre_error_flag; } (AMGhybrid_data -> seq_threshold) = seq_threshold; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_AMGHybridSetNumGridSweeps *--------------------------------------------------------------------------*/ HYPRE_Int hypre_AMGHybridSetNumGridSweeps( void *AMGhybrid_vdata, HYPRE_Int *num_grid_sweeps ) { hypre_AMGHybridData *AMGhybrid_data = (hypre_AMGHybridData *) AMGhybrid_vdata; if (!AMGhybrid_data) { hypre_error_in_arg(1); return hypre_error_flag; } if (!num_grid_sweeps) { hypre_error_in_arg(2); return hypre_error_flag; } if ((AMGhybrid_data -> num_grid_sweeps) != NULL) { hypre_TFree((AMGhybrid_data -> num_grid_sweeps), HYPRE_MEMORY_HOST); } (AMGhybrid_data -> num_grid_sweeps) = num_grid_sweeps; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_AMGHybridSetGridRelaxType *--------------------------------------------------------------------------*/ HYPRE_Int hypre_AMGHybridSetGridRelaxType( void *AMGhybrid_vdata, HYPRE_Int *grid_relax_type ) { hypre_AMGHybridData *AMGhybrid_data = (hypre_AMGHybridData *) AMGhybrid_vdata; if (!AMGhybrid_data) { hypre_error_in_arg(1); return hypre_error_flag; } if (!grid_relax_type) { hypre_error_in_arg(2); return hypre_error_flag; } if ((AMGhybrid_data -> grid_relax_type) != NULL ) { hypre_TFree((AMGhybrid_data -> grid_relax_type), HYPRE_MEMORY_HOST); } (AMGhybrid_data -> grid_relax_type) = grid_relax_type; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_AMGHybridSetGridRelaxPoints *--------------------------------------------------------------------------*/ HYPRE_Int hypre_AMGHybridSetGridRelaxPoints( void *AMGhybrid_vdata, HYPRE_Int **grid_relax_points ) { hypre_AMGHybridData *AMGhybrid_data = (hypre_AMGHybridData *) AMGhybrid_vdata; if (!AMGhybrid_data) { hypre_error_in_arg(1); return hypre_error_flag; } if (!grid_relax_points) { hypre_error_in_arg(2); return hypre_error_flag; } if ((AMGhybrid_data -> grid_relax_points) != NULL ) { hypre_TFree((AMGhybrid_data -> grid_relax_points), HYPRE_MEMORY_HOST); } (AMGhybrid_data -> grid_relax_points) = grid_relax_points; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_AMGHybridSetRelaxWeight *--------------------------------------------------------------------------*/ HYPRE_Int hypre_AMGHybridSetRelaxWeight( void *AMGhybrid_vdata, HYPRE_Real *relax_weight ) { hypre_AMGHybridData *AMGhybrid_data = (hypre_AMGHybridData *) AMGhybrid_vdata; if (!AMGhybrid_data) { hypre_error_in_arg(1); return hypre_error_flag; } if (!relax_weight) { hypre_error_in_arg(2); return hypre_error_flag; } if ((AMGhybrid_data -> relax_weight) != NULL ) { hypre_TFree((AMGhybrid_data -> relax_weight), HYPRE_MEMORY_HOST); } (AMGhybrid_data -> relax_weight) = relax_weight; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_AMGHybridSetOmega *--------------------------------------------------------------------------*/ HYPRE_Int hypre_AMGHybridSetOmega( void *AMGhybrid_vdata, HYPRE_Real *omega ) { hypre_AMGHybridData *AMGhybrid_data = (hypre_AMGHybridData *) AMGhybrid_vdata; if (!AMGhybrid_data) { hypre_error_in_arg(1); return hypre_error_flag; } if (!omega) { hypre_error_in_arg(2); return hypre_error_flag; } if ((AMGhybrid_data -> omega) != NULL ) { hypre_TFree((AMGhybrid_data -> omega), HYPRE_MEMORY_HOST); } (AMGhybrid_data -> omega) = omega; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_AMGHybridSetRelaxWt *--------------------------------------------------------------------------*/ HYPRE_Int hypre_AMGHybridSetRelaxWt( void *AMGhybrid_vdata, HYPRE_Real relax_wt ) { hypre_AMGHybridData *AMGhybrid_data = (hypre_AMGHybridData *) AMGhybrid_vdata; HYPRE_Int i, num_levels; HYPRE_Real *relax_wt_array; if (!AMGhybrid_data) { hypre_error_in_arg(1); return hypre_error_flag; } num_levels = (AMGhybrid_data -> max_levels); relax_wt_array = (AMGhybrid_data -> relax_weight); if (relax_wt_array == NULL) { relax_wt_array = hypre_CTAlloc(HYPRE_Real, num_levels, HYPRE_MEMORY_HOST); (AMGhybrid_data -> relax_weight) = relax_wt_array; } for (i = 0; i < num_levels; i++) { relax_wt_array[i] = relax_wt; } return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_AMGHybridSetLevelRelaxWt *--------------------------------------------------------------------------*/ HYPRE_Int hypre_AMGHybridSetLevelRelaxWt( void *AMGhybrid_vdata, HYPRE_Real relax_wt, HYPRE_Int level ) { hypre_AMGHybridData *AMGhybrid_data = (hypre_AMGHybridData *) AMGhybrid_vdata; HYPRE_Int i, num_levels; HYPRE_Real *relax_wt_array; if (!AMGhybrid_data) { hypre_error_in_arg(1); return hypre_error_flag; } num_levels = (AMGhybrid_data -> max_levels); if (level > num_levels - 1) { if (AMGhybrid_data -> print_level) { hypre_printf (" Warning! Invalid level! Relax weight not set!\n"); } hypre_error_in_arg(3); return hypre_error_flag; } relax_wt_array = (AMGhybrid_data -> relax_weight); if (relax_wt_array == NULL) { relax_wt_array = hypre_CTAlloc(HYPRE_Real, num_levels, HYPRE_MEMORY_HOST); for (i = 0; i < num_levels; i++) { relax_wt_array[i] = 1.0; } (AMGhybrid_data -> relax_weight) = relax_wt_array; } relax_wt_array[level] = relax_wt; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_AMGHybridSetOuterWt *--------------------------------------------------------------------------*/ HYPRE_Int hypre_AMGHybridSetOuterWt( void *AMGhybrid_vdata, HYPRE_Real outer_wt ) { hypre_AMGHybridData *AMGhybrid_data = (hypre_AMGHybridData *) AMGhybrid_vdata; HYPRE_Int i, num_levels; HYPRE_Real *outer_wt_array; if (!AMGhybrid_data) { hypre_error_in_arg(1); return hypre_error_flag; } num_levels = (AMGhybrid_data -> max_levels); outer_wt_array = (AMGhybrid_data -> omega); if (outer_wt_array == NULL) { outer_wt_array = hypre_CTAlloc(HYPRE_Real, num_levels, HYPRE_MEMORY_HOST); (AMGhybrid_data -> omega) = outer_wt_array; } for (i = 0; i < num_levels; i++) { outer_wt_array[i] = outer_wt; } return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_AMGHybridSetLevelOuterWt *--------------------------------------------------------------------------*/ HYPRE_Int hypre_AMGHybridSetLevelOuterWt( void *AMGhybrid_vdata, HYPRE_Real outer_wt, HYPRE_Int level ) { hypre_AMGHybridData *AMGhybrid_data = (hypre_AMGHybridData *) AMGhybrid_vdata; HYPRE_Int i, num_levels; HYPRE_Real *outer_wt_array; if (!AMGhybrid_data) { hypre_error_in_arg(1); return hypre_error_flag; } num_levels = (AMGhybrid_data -> max_levels); if (level > num_levels - 1) { if (AMGhybrid_data -> print_level) { hypre_printf (" Warning! Invalid level! Outer weight not set!\n"); } hypre_error_in_arg(3); return hypre_error_flag; } outer_wt_array = (AMGhybrid_data -> omega); if (outer_wt_array == NULL) { outer_wt_array = hypre_CTAlloc(HYPRE_Real, num_levels, HYPRE_MEMORY_HOST); for (i = 0; i < num_levels; i++) { outer_wt_array[i] = 1.0; } (AMGhybrid_data -> omega) = outer_wt_array; } outer_wt_array[level] = outer_wt; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_AMGHybridSetNumPaths *--------------------------------------------------------------------------*/ HYPRE_Int hypre_AMGHybridSetNumPaths( void *AMGhybrid_vdata, HYPRE_Int num_paths ) { hypre_AMGHybridData *AMGhybrid_data = (hypre_AMGHybridData *) AMGhybrid_vdata; if (!AMGhybrid_data) { hypre_error_in_arg(1); return hypre_error_flag; } if (num_paths < 1) { hypre_error_in_arg(2); return hypre_error_flag; } (AMGhybrid_data -> num_paths) = num_paths; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_AMGHybridSetDofFunc *--------------------------------------------------------------------------*/ HYPRE_Int hypre_AMGHybridSetDofFunc( void *AMGhybrid_vdata, HYPRE_Int *dof_func ) { hypre_AMGHybridData *AMGhybrid_data = (hypre_AMGHybridData *) AMGhybrid_vdata; if (!AMGhybrid_data) { hypre_error_in_arg(1); return hypre_error_flag; } if (!dof_func) { hypre_error_in_arg(2); return hypre_error_flag; } if ((AMGhybrid_data -> dof_func) != NULL ) { hypre_TFree((AMGhybrid_data -> dof_func), HYPRE_MEMORY_HOST); } (AMGhybrid_data -> dof_func) = dof_func; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_AMGHybridSetAggNumLevels *--------------------------------------------------------------------------*/ HYPRE_Int hypre_AMGHybridSetAggNumLevels( void *AMGhybrid_vdata, HYPRE_Int agg_num_levels ) { hypre_AMGHybridData *AMGhybrid_data = (hypre_AMGHybridData *) AMGhybrid_vdata; if (!AMGhybrid_data) { hypre_error_in_arg(1); return hypre_error_flag; } if (agg_num_levels < 0) { hypre_error_in_arg(2); return hypre_error_flag; } (AMGhybrid_data -> agg_num_levels) = agg_num_levels; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_AMGHybridSetAggInterpType *--------------------------------------------------------------------------*/ HYPRE_Int hypre_AMGHybridSetAggInterpType( void *AMGhybrid_vdata, HYPRE_Int agg_interp_type ) { hypre_AMGHybridData *AMGhybrid_data = (hypre_AMGHybridData *) AMGhybrid_vdata; if (!AMGhybrid_data) { hypre_error_in_arg(1); return hypre_error_flag; } (AMGhybrid_data -> agg_interp_type) = agg_interp_type; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_AMGHybridSetNumFunctions *--------------------------------------------------------------------------*/ HYPRE_Int hypre_AMGHybridSetNumFunctions( void *AMGhybrid_vdata, HYPRE_Int num_functions ) { hypre_AMGHybridData *AMGhybrid_data = (hypre_AMGHybridData *) AMGhybrid_vdata; if (!AMGhybrid_data) { hypre_error_in_arg(1); return hypre_error_flag; } if (num_functions < 1) { hypre_error_in_arg(2); return hypre_error_flag; } (AMGhybrid_data -> num_functions) = num_functions; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_AMGHybridSetNodal *--------------------------------------------------------------------------*/ HYPRE_Int hypre_AMGHybridSetNodal( void *AMGhybrid_vdata, HYPRE_Int nodal ) { hypre_AMGHybridData *AMGhybrid_data = (hypre_AMGHybridData *) AMGhybrid_vdata; if (!AMGhybrid_data) { hypre_error_in_arg(1); return hypre_error_flag; } (AMGhybrid_data -> nodal) = nodal; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_AMGHybridGetNumIterations *--------------------------------------------------------------------------*/ HYPRE_Int hypre_AMGHybridGetSetupSolveTime( void *AMGhybrid_vdata, HYPRE_Real *time ) { hypre_AMGHybridData *AMGhybrid_data = (hypre_AMGHybridData *) AMGhybrid_vdata; if (!AMGhybrid_data) { hypre_error_in_arg(1); return hypre_error_flag; } HYPRE_Real t[4]; t[0] = AMGhybrid_data->setup_time1; t[1] = AMGhybrid_data->solve_time1; t[2] = AMGhybrid_data->setup_time2; t[3] = AMGhybrid_data->solve_time2; MPI_Comm comm = AMGhybrid_data->comm; hypre_MPI_Allreduce(t, time, 4, hypre_MPI_REAL, hypre_MPI_MAX, comm); return hypre_error_flag; } HYPRE_Int hypre_AMGHybridGetNumIterations( void *AMGhybrid_vdata, HYPRE_Int *num_its ) { hypre_AMGHybridData *AMGhybrid_data = (hypre_AMGHybridData *) AMGhybrid_vdata; if (!AMGhybrid_data) { hypre_error_in_arg(1); return hypre_error_flag; } *num_its = (AMGhybrid_data -> dscg_num_its) + (AMGhybrid_data -> pcg_num_its); return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_AMGHybridGetDSCGNumIterations *--------------------------------------------------------------------------*/ HYPRE_Int hypre_AMGHybridGetDSCGNumIterations( void *AMGhybrid_vdata, HYPRE_Int *dscg_num_its ) { hypre_AMGHybridData *AMGhybrid_data = (hypre_AMGHybridData *) AMGhybrid_vdata; if (!AMGhybrid_data) { hypre_error_in_arg(1); return hypre_error_flag; } *dscg_num_its = (AMGhybrid_data -> dscg_num_its); return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_AMGHybridGetPCGNumIterations *--------------------------------------------------------------------------*/ HYPRE_Int hypre_AMGHybridGetPCGNumIterations( void *AMGhybrid_vdata, HYPRE_Int *pcg_num_its ) { hypre_AMGHybridData *AMGhybrid_data = (hypre_AMGHybridData *) AMGhybrid_vdata; if (!AMGhybrid_data) { hypre_error_in_arg(1); return hypre_error_flag; } *pcg_num_its = (AMGhybrid_data -> pcg_num_its); return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_AMGHybridGetFinalRelativeResidualNorm *--------------------------------------------------------------------------*/ HYPRE_Int hypre_AMGHybridGetFinalRelativeResidualNorm( void *AMGhybrid_vdata, HYPRE_Real *final_rel_res_norm ) { hypre_AMGHybridData *AMGhybrid_data = (hypre_AMGHybridData *) AMGhybrid_vdata; if (!AMGhybrid_data) { hypre_error_in_arg(1); return hypre_error_flag; } *final_rel_res_norm = (AMGhybrid_data -> final_rel_res_norm); return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_AMGHybridSetup *--------------------------------------------------------------------------*/ HYPRE_Int hypre_AMGHybridSetup( void *AMGhybrid_vdata, hypre_ParCSRMatrix *A, hypre_ParVector *b, hypre_ParVector *x ) { HYPRE_UNUSED_VAR(A); HYPRE_UNUSED_VAR(b); HYPRE_UNUSED_VAR(x); hypre_AMGHybridData *AMGhybrid_data = (hypre_AMGHybridData *) AMGhybrid_vdata; if (!AMGhybrid_data) { hypre_error_in_arg(1); return hypre_error_flag; } return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_AMGHybridSolve *-------------------------------------------------------------------------- * * This solver is designed to solve Ax=b using a AMGhybrid algorithm. First * the solver uses diagonally scaled conjugate gradients. If sufficient * progress is not made, the algorithm switches to preconditioned * conjugate gradients with user-specified preconditioner. * *--------------------------------------------------------------------------*/ HYPRE_Int hypre_AMGHybridSolve( void *AMGhybrid_vdata, hypre_ParCSRMatrix *A, hypre_ParVector *b, hypre_ParVector *x ) { hypre_AMGHybridData *AMGhybrid_data = (hypre_AMGHybridData *) AMGhybrid_vdata; HYPRE_Real tol; HYPRE_Real a_tol; HYPRE_Real cf_tol; HYPRE_Int dscg_max_its; HYPRE_Int pcg_max_its; HYPRE_Int two_norm; HYPRE_Int stop_crit; HYPRE_Int rel_change; HYPRE_Int recompute_residual; HYPRE_Int recompute_residual_p; HYPRE_Int logging; HYPRE_Int print_level; HYPRE_Int setup_type; HYPRE_Int solver_type; HYPRE_Int k_dim; /* BoomerAMG info */ HYPRE_Real strong_threshold; HYPRE_Real max_row_sum; HYPRE_Real trunc_factor; HYPRE_Int pmax; HYPRE_Int max_levels; HYPRE_Int measure_type; HYPRE_Int coarsen_type; HYPRE_Int interp_type; HYPRE_Int cycle_type; HYPRE_Int num_paths; HYPRE_Int agg_num_levels; HYPRE_Int agg_interp_type; HYPRE_Int num_functions; HYPRE_Int nodal; HYPRE_Int relax_order; HYPRE_Int keepT; HYPRE_Int *num_grid_sweeps; HYPRE_Int *grid_relax_type; HYPRE_Int **grid_relax_points; HYPRE_Real *relax_weight; HYPRE_Real *omega; HYPRE_Int *dof_func; HYPRE_Int *boom_ngs; HYPRE_Int *boom_grt; HYPRE_Int *boom_dof_func; HYPRE_Int **boom_grp; HYPRE_Real *boom_rlxw; HYPRE_Real *boom_omega; HYPRE_Int pcg_default; HYPRE_Int (*pcg_precond_solve)(void*, void*, void*, void*); HYPRE_Int (*pcg_precond_setup)(void*, void*, void*, void*); void *pcg_precond; void *pcg_solver; hypre_PCGFunctions *pcg_functions; hypre_GMRESFunctions *gmres_functions; hypre_BiCGSTABFunctions *bicgstab_functions; HYPRE_Int dscg_num_its = 0; HYPRE_Int pcg_num_its = 0; HYPRE_Int converged = 0; HYPRE_Int num_variables = hypre_VectorSize(hypre_ParVectorLocalVector(b)); HYPRE_Real res_norm; HYPRE_Int i, j; HYPRE_Int sol_print_level; /* print_level for solver */ HYPRE_Int pre_print_level; /* print_level for preconditioner */ HYPRE_Int max_coarse_size, seq_threshold; HYPRE_Int min_coarse_size; HYPRE_Int nongalerk_num_tol; HYPRE_Real *nongalerkin_tol; HYPRE_Real tt1, tt2; if (!AMGhybrid_data) { hypre_error_in_arg(1); return hypre_error_flag; } AMGhybrid_data->setup_time1 = 0.0; AMGhybrid_data->setup_time2 = 0.0; AMGhybrid_data->solve_time1 = 0.0; AMGhybrid_data->solve_time2 = 0.0; MPI_Comm comm = hypre_ParCSRMatrixComm(A); (AMGhybrid_data -> comm) = comm; /*----------------------------------------------------------------------- * Setup diagonal scaled solver *-----------------------------------------------------------------------*/ tol = (AMGhybrid_data -> tol); a_tol = (AMGhybrid_data -> a_tol); cf_tol = (AMGhybrid_data -> cf_tol); dscg_max_its = (AMGhybrid_data -> dscg_max_its); pcg_max_its = (AMGhybrid_data -> pcg_max_its); two_norm = (AMGhybrid_data -> two_norm); stop_crit = (AMGhybrid_data -> stop_crit); rel_change = (AMGhybrid_data -> rel_change); recompute_residual = (AMGhybrid_data -> recompute_residual); recompute_residual_p = (AMGhybrid_data -> recompute_residual_p); logging = (AMGhybrid_data -> logging); print_level = (AMGhybrid_data -> print_level); setup_type = (AMGhybrid_data -> setup_type); solver_type = (AMGhybrid_data -> solver_type); k_dim = (AMGhybrid_data -> k_dim); strong_threshold = (AMGhybrid_data -> strong_threshold); max_row_sum = (AMGhybrid_data -> max_row_sum); trunc_factor = (AMGhybrid_data -> trunc_factor); pmax = (AMGhybrid_data -> pmax); max_levels = (AMGhybrid_data -> max_levels); measure_type = (AMGhybrid_data -> measure_type); coarsen_type = (AMGhybrid_data -> coarsen_type); interp_type = (AMGhybrid_data -> interp_type); cycle_type = (AMGhybrid_data -> cycle_type); num_paths = (AMGhybrid_data -> num_paths); agg_num_levels = (AMGhybrid_data -> agg_num_levels); agg_interp_type = (AMGhybrid_data -> agg_interp_type); num_functions = (AMGhybrid_data -> num_functions); nodal = (AMGhybrid_data -> nodal); num_grid_sweeps = (AMGhybrid_data -> num_grid_sweeps); grid_relax_type = (AMGhybrid_data -> grid_relax_type); grid_relax_points = (AMGhybrid_data -> grid_relax_points); relax_weight = (AMGhybrid_data -> relax_weight); relax_order = (AMGhybrid_data -> relax_order); keepT = (AMGhybrid_data -> keepT); omega = (AMGhybrid_data -> omega); max_coarse_size = (AMGhybrid_data -> max_coarse_size); min_coarse_size = (AMGhybrid_data -> min_coarse_size); seq_threshold = (AMGhybrid_data -> seq_threshold); dof_func = (AMGhybrid_data -> dof_func); pcg_default = (AMGhybrid_data -> pcg_default); nongalerk_num_tol = (AMGhybrid_data -> nongalerk_num_tol); nongalerkin_tol = (AMGhybrid_data -> nongalerkin_tol); if (!b) { hypre_error_in_arg(3); return hypre_error_flag; } num_variables = hypre_VectorSize(hypre_ParVectorLocalVector(b)); if (!A) { hypre_error_in_arg(2); return hypre_error_flag; } if (!x) { hypre_error_in_arg(4); return hypre_error_flag; } /* print_level definitions: xy, sol_print_level = y, pre_print_level = x */ pre_print_level = print_level / 10; sol_print_level = print_level - pre_print_level * 10; pcg_solver = (AMGhybrid_data -> pcg_solver); pcg_precond = (AMGhybrid_data -> pcg_precond); (AMGhybrid_data -> dscg_num_its) = 0; (AMGhybrid_data -> pcg_num_its) = 0; if (setup_type || pcg_precond == NULL) { if (pcg_precond) { hypre_BoomerAMGDestroy(pcg_precond); pcg_precond = NULL; (AMGhybrid_data -> pcg_precond) = NULL; } if (solver_type == 1) { tt1 = hypre_MPI_Wtime(); if (pcg_solver == NULL) { pcg_functions = hypre_PCGFunctionsCreate( hypre_ParKrylovCAlloc, hypre_ParKrylovFree, hypre_ParKrylovCommInfo, hypre_ParKrylovCreateVector, hypre_ParKrylovDestroyVector, hypre_ParKrylovMatvecCreate, hypre_ParKrylovMatvec, hypre_ParKrylovMatvecDestroy, hypre_ParKrylovInnerProd, hypre_ParKrylovCopyVector, hypre_ParKrylovClearVector, hypre_ParKrylovScaleVector, hypre_ParKrylovAxpy, hypre_ParKrylovIdentitySetup, hypre_ParKrylovIdentity ); pcg_solver = hypre_PCGCreate( pcg_functions ); hypre_PCGSetTol(pcg_solver, tol); hypre_PCGSetAbsoluteTol(pcg_solver, a_tol); hypre_PCGSetTwoNorm(pcg_solver, two_norm); hypre_PCGSetStopCrit(pcg_solver, stop_crit); hypre_PCGSetRelChange(pcg_solver, rel_change); hypre_PCGSetRecomputeResidual(pcg_solver, recompute_residual); hypre_PCGSetRecomputeResidualP(pcg_solver, recompute_residual_p); hypre_PCGSetLogging(pcg_solver, logging); hypre_PCGSetPrintLevel(pcg_solver, sol_print_level); hypre_PCGSetHybrid(pcg_solver, -1); pcg_precond = NULL; } hypre_PCGSetMaxIter(pcg_solver, dscg_max_its); hypre_PCGSetConvergenceFactorTol(pcg_solver, cf_tol); hypre_PCGSetPrecond((void*) pcg_solver, (HYPRE_Int (*)(void*, void*, void*, void*)) HYPRE_ParCSRDiagScale, (HYPRE_Int (*)(void*, void*, void*, void*)) HYPRE_ParCSRDiagScaleSetup, (void*) pcg_precond); hypre_PCGSetup(pcg_solver, (void*) A, (void*) b, (void*) x); (AMGhybrid_data -> pcg_solver) = pcg_solver; tt2 = hypre_MPI_Wtime(); AMGhybrid_data->setup_time1 = tt2 - tt1; /*--------------------------------------------------------------------- * Solve with DSCG. *---------------------------------------------------------------------*/ tt1 = tt2; hypre_PCGSolve(pcg_solver, (void*) A, (void*) b, (void*) x); /*--------------------------------------------------------------------- * Get information for DSCG. *---------------------------------------------------------------------*/ hypre_PCGGetNumIterations(pcg_solver, &dscg_num_its); (AMGhybrid_data -> dscg_num_its) = dscg_num_its; hypre_PCGGetFinalRelativeResidualNorm(pcg_solver, &res_norm); hypre_PCGGetConverged(pcg_solver, &converged); tt2 = hypre_MPI_Wtime(); AMGhybrid_data->solve_time1 = tt2 - tt1; } else if (solver_type == 2) { tt1 = hypre_MPI_Wtime(); if (pcg_solver == NULL) { gmres_functions = hypre_GMRESFunctionsCreate( hypre_ParKrylovCAlloc, hypre_ParKrylovFree, hypre_ParKrylovCommInfo, hypre_ParKrylovCreateVector, hypre_ParKrylovCreateVectorArray, hypre_ParKrylovDestroyVector, hypre_ParKrylovMatvecCreate, hypre_ParKrylovMatvec, hypre_ParKrylovMatvecDestroy, hypre_ParKrylovInnerProd, hypre_ParKrylovCopyVector, hypre_ParKrylovClearVector, hypre_ParKrylovScaleVector, hypre_ParKrylovAxpy, hypre_ParKrylovIdentitySetup, hypre_ParKrylovIdentity ); pcg_solver = hypre_GMRESCreate( gmres_functions ); hypre_GMRESSetTol(pcg_solver, tol); hypre_GMRESSetAbsoluteTol(pcg_solver, a_tol); hypre_GMRESSetKDim(pcg_solver, k_dim); hypre_GMRESSetStopCrit(pcg_solver, stop_crit); hypre_GMRESSetRelChange(pcg_solver, rel_change); hypre_GMRESSetLogging(pcg_solver, logging); hypre_GMRESSetPrintLevel(pcg_solver, sol_print_level); hypre_GMRESSetHybrid(pcg_solver, -1); pcg_precond = NULL; } hypre_GMRESSetMaxIter(pcg_solver, dscg_max_its); hypre_GMRESSetConvergenceFactorTol(pcg_solver, cf_tol); hypre_GMRESSetPrecond((void*) pcg_solver, (HYPRE_Int (*)(void*, void*, void*, void*)) HYPRE_ParCSRDiagScale, (HYPRE_Int (*)(void*, void*, void*, void*)) HYPRE_ParCSRDiagScaleSetup, (void*) pcg_precond); hypre_GMRESSetup(pcg_solver, (void*) A, (void*) b, (void*) x); (AMGhybrid_data -> pcg_solver) = pcg_solver; tt2 = hypre_MPI_Wtime(); AMGhybrid_data->setup_time1 = tt2 - tt1; /*--------------------------------------------------------------------- * Solve with diagonal scaled GMRES *---------------------------------------------------------------------*/ tt1 = tt2; hypre_GMRESSolve(pcg_solver, (void*) A, (void*) b, (void*) x); /*--------------------------------------------------------------------- * Get information for GMRES *---------------------------------------------------------------------*/ hypre_GMRESGetNumIterations(pcg_solver, &dscg_num_its); (AMGhybrid_data -> dscg_num_its) = dscg_num_its; hypre_GMRESGetFinalRelativeResidualNorm(pcg_solver, &res_norm); hypre_GMRESGetConverged(pcg_solver, &converged); tt2 = hypre_MPI_Wtime(); AMGhybrid_data->solve_time1 = tt2 - tt1; } else if (solver_type == 3) { tt1 = hypre_MPI_Wtime(); if (pcg_solver == NULL) { bicgstab_functions = hypre_BiCGSTABFunctionsCreate( hypre_ParKrylovCreateVector, hypre_ParKrylovDestroyVector, hypre_ParKrylovMatvecCreate, hypre_ParKrylovMatvec, hypre_ParKrylovMatvecDestroy, hypre_ParKrylovInnerProd, hypre_ParKrylovCopyVector, hypre_ParKrylovClearVector, hypre_ParKrylovScaleVector, hypre_ParKrylovAxpy, hypre_ParKrylovCommInfo, hypre_ParKrylovIdentitySetup, hypre_ParKrylovIdentity ); pcg_solver = hypre_BiCGSTABCreate( bicgstab_functions ); hypre_BiCGSTABSetTol(pcg_solver, tol); hypre_BiCGSTABSetAbsoluteTol(pcg_solver, a_tol); hypre_BiCGSTABSetStopCrit(pcg_solver, stop_crit); hypre_BiCGSTABSetLogging(pcg_solver, logging); hypre_BiCGSTABSetPrintLevel(pcg_solver, sol_print_level); hypre_BiCGSTABSetHybrid(pcg_solver, -1); pcg_precond = NULL; } hypre_BiCGSTABSetMaxIter(pcg_solver, dscg_max_its); hypre_BiCGSTABSetConvergenceFactorTol(pcg_solver, cf_tol); hypre_BiCGSTABSetPrecond((void*) pcg_solver, (HYPRE_Int (*)(void*, void*, void*, void*)) HYPRE_ParCSRDiagScale, (HYPRE_Int (*)(void*, void*, void*, void*)) HYPRE_ParCSRDiagScaleSetup, (void*) pcg_precond); hypre_BiCGSTABSetup(pcg_solver, (void*) A, (void*) b, (void*) x); (AMGhybrid_data -> pcg_solver) = pcg_solver; tt2 = hypre_MPI_Wtime(); AMGhybrid_data->setup_time1 = tt2 - tt1; /*--------------------------------------------------------------------- * Solve with diagonal scaled BiCGSTAB *---------------------------------------------------------------------*/ tt1 = tt2; hypre_BiCGSTABSolve(pcg_solver, (void*) A, (void*) b, (void*) x); /*--------------------------------------------------------------------- * Get information for BiCGSTAB *---------------------------------------------------------------------*/ hypre_BiCGSTABGetNumIterations(pcg_solver, &dscg_num_its); (AMGhybrid_data -> dscg_num_its) = dscg_num_its; hypre_BiCGSTABGetFinalRelativeResidualNorm(pcg_solver, &res_norm); hypre_BiCGSTABGetConverged(pcg_solver, &converged); tt2 = hypre_MPI_Wtime(); AMGhybrid_data->solve_time1 = tt2 - tt1; } } /*--------------------------------------------------------------------- * If converged, done... *---------------------------------------------------------------------*/ if (converged) { if (logging) { (AMGhybrid_data -> final_rel_res_norm) = res_norm; } } /*----------------------------------------------------------------------- * ... otherwise, use AMG+solver *-----------------------------------------------------------------------*/ else { tt1 = hypre_MPI_Wtime(); /*-------------------------------------------------------------------- * Free up previous PCG solver structure and set up a new one. *--------------------------------------------------------------------*/ if (solver_type == 1) { hypre_PCGSetMaxIter(pcg_solver, pcg_max_its); hypre_PCGSetConvergenceFactorTol(pcg_solver, 0.0); hypre_PCGSetHybrid(pcg_solver, 0); } else if (solver_type == 2) { hypre_GMRESSetMaxIter(pcg_solver, pcg_max_its); hypre_GMRESSetConvergenceFactorTol(pcg_solver, 0.0); hypre_GMRESSetHybrid(pcg_solver, 0); } else if (solver_type == 3) { hypre_BiCGSTABSetMaxIter(pcg_solver, pcg_max_its); hypre_BiCGSTABSetConvergenceFactorTol(pcg_solver, 0.0); hypre_BiCGSTABSetHybrid(pcg_solver, 0); } /* Setup preconditioner */ if (setup_type && pcg_default) { pcg_precond = hypre_BoomerAMGCreate(); hypre_BoomerAMGSetMaxIter(pcg_precond, 1); hypre_BoomerAMGSetTol(pcg_precond, 0.0); hypre_BoomerAMGSetCoarsenType(pcg_precond, coarsen_type); hypre_BoomerAMGSetInterpType(pcg_precond, interp_type); hypre_BoomerAMGSetSetupType(pcg_precond, setup_type); hypre_BoomerAMGSetMeasureType(pcg_precond, measure_type); hypre_BoomerAMGSetStrongThreshold(pcg_precond, strong_threshold); hypre_BoomerAMGSetTruncFactor(pcg_precond, trunc_factor); hypre_BoomerAMGSetPMaxElmts(pcg_precond, pmax); hypre_BoomerAMGSetCycleType(pcg_precond, cycle_type); hypre_BoomerAMGSetPrintLevel(pcg_precond, pre_print_level); hypre_BoomerAMGSetMaxLevels(pcg_precond, max_levels); hypre_BoomerAMGSetMaxRowSum(pcg_precond, max_row_sum); hypre_BoomerAMGSetMaxCoarseSize(pcg_precond, max_coarse_size); hypre_BoomerAMGSetMinCoarseSize(pcg_precond, min_coarse_size); hypre_BoomerAMGSetSeqThreshold(pcg_precond, seq_threshold); hypre_BoomerAMGSetAggNumLevels(pcg_precond, agg_num_levels); hypre_BoomerAMGSetAggInterpType(pcg_precond, agg_interp_type); hypre_BoomerAMGSetNumPaths(pcg_precond, num_paths); hypre_BoomerAMGSetNumFunctions(pcg_precond, num_functions); hypre_BoomerAMGSetNodal(pcg_precond, nodal); hypre_BoomerAMGSetRelaxOrder(pcg_precond, relax_order); hypre_BoomerAMGSetKeepTranspose(pcg_precond, keepT); hypre_BoomerAMGSetNonGalerkTol(pcg_precond, nongalerk_num_tol, nongalerkin_tol); if (grid_relax_type) { boom_grt = hypre_CTAlloc(HYPRE_Int, 4, HYPRE_MEMORY_HOST); for (i = 0; i < 4; i++) { boom_grt[i] = grid_relax_type[i]; } hypre_BoomerAMGSetGridRelaxType(pcg_precond, boom_grt); } else { boom_grt = hypre_CTAlloc(HYPRE_Int, 4, HYPRE_MEMORY_HOST); boom_grt[0] = 3; boom_grt[1] = 13; boom_grt[2] = 14; boom_grt[3] = 9; hypre_BoomerAMGSetGridRelaxType(pcg_precond, boom_grt); } hypre_ParAMGDataUserCoarseRelaxType((hypre_ParAMGData *) pcg_precond) = boom_grt[3]; hypre_ParAMGDataUserRelaxType((hypre_ParAMGData *) pcg_precond) = boom_grt[0]; if (relax_weight) { boom_rlxw = hypre_CTAlloc(HYPRE_Real, max_levels, HYPRE_MEMORY_HOST); for (i = 0; i < max_levels; i++) { boom_rlxw[i] = relax_weight[i]; } hypre_BoomerAMGSetRelaxWeight(pcg_precond, boom_rlxw); } if (omega) { boom_omega = hypre_CTAlloc(HYPRE_Real, max_levels, HYPRE_MEMORY_HOST); for (i = 0; i < max_levels; i++) { boom_omega[i] = omega[i]; } hypre_BoomerAMGSetOmega(pcg_precond, boom_omega); } if (num_grid_sweeps) { boom_ngs = hypre_CTAlloc(HYPRE_Int, 4, HYPRE_MEMORY_HOST); for (i = 0; i < 4; i++) { boom_ngs[i] = num_grid_sweeps[i]; } hypre_BoomerAMGSetNumGridSweeps(pcg_precond, boom_ngs); if (grid_relax_points) { boom_grp = hypre_CTAlloc(HYPRE_Int*, 4, HYPRE_MEMORY_HOST); for (i = 0; i < 4; i++) { boom_grp[i] = hypre_CTAlloc(HYPRE_Int, num_grid_sweeps[i], HYPRE_MEMORY_HOST); for (j = 0; j < num_grid_sweeps[i]; j++) { boom_grp[i][j] = grid_relax_points[i][j]; } } hypre_BoomerAMGSetGridRelaxPoints(pcg_precond, boom_grp); } } if (dof_func) { boom_dof_func = hypre_CTAlloc(HYPRE_Int, num_variables, HYPRE_MEMORY_HOST); for (i = 0; i < num_variables; i++) { boom_dof_func[i] = dof_func[i]; } hypre_BoomerAMGSetDofFunc(pcg_precond, boom_dof_func); } pcg_precond_solve = (HYPRE_Int (*)(void*, void*, void*, void*)) hypre_BoomerAMGSolve; pcg_precond_setup = (HYPRE_Int (*)(void*, void*, void*, void*)) hypre_BoomerAMGSetup; (AMGhybrid_data -> pcg_precond_setup) = pcg_precond_setup; (AMGhybrid_data -> pcg_precond_solve) = pcg_precond_solve; (AMGhybrid_data -> pcg_precond) = pcg_precond; /*(AMGhybrid_data -> pcg_default) = 0;*/ /*(AMGhybrid_data -> setup_type) = 0;*/ } else { pcg_precond = (AMGhybrid_data -> pcg_precond); pcg_precond_solve = (AMGhybrid_data -> pcg_precond_solve); pcg_precond_setup = (AMGhybrid_data -> pcg_precond_setup); hypre_BoomerAMGSetSetupType(pcg_precond, setup_type); } /* Complete setup of solver+AMG */ if (solver_type == 1) { hypre_PCGSetPrecond((void*) pcg_solver, (HYPRE_Int (*)(void*, void*, void*, void*)) pcg_precond_solve, (HYPRE_Int (*)(void*, void*, void*, void*)) pcg_precond_setup, (void*) pcg_precond); hypre_PCGSetup(pcg_solver, (void*) A, (void*) b, (void*) x); tt2 = hypre_MPI_Wtime(); AMGhybrid_data->setup_time2 = tt2 - tt1; /* Solve */ tt1 = tt2; hypre_PCGSolve(pcg_solver, (void*) A, (void*) b, (void*) x); /* Get information from PCG that is always logged in AMGhybrid solver*/ hypre_PCGGetNumIterations(pcg_solver, &pcg_num_its); (AMGhybrid_data -> pcg_num_its) = pcg_num_its; if (logging) { hypre_PCGGetFinalRelativeResidualNorm(pcg_solver, &res_norm); (AMGhybrid_data -> final_rel_res_norm) = res_norm; } tt2 = hypre_MPI_Wtime(); AMGhybrid_data->solve_time2 = tt2 - tt1; } else if (solver_type == 2) { hypre_GMRESSetPrecond((void*) pcg_solver, (HYPRE_Int (*)(void*, void*, void*, void*)) pcg_precond_solve, (HYPRE_Int (*)(void*, void*, void*, void*)) pcg_precond_setup, (void*) pcg_precond); hypre_GMRESSetup(pcg_solver, (void*) A, (void*) b, (void*) x); tt2 = hypre_MPI_Wtime(); AMGhybrid_data->setup_time2 = tt2 - tt1; /* Solve */ tt1 = tt2; hypre_GMRESSolve(pcg_solver, (void*) A, (void*) b, (void*) x); /* Get information from GMRES that is always logged in AMGhybrid solver*/ hypre_GMRESGetNumIterations(pcg_solver, &pcg_num_its); (AMGhybrid_data -> pcg_num_its) = pcg_num_its; if (logging) { hypre_GMRESGetFinalRelativeResidualNorm(pcg_solver, &res_norm); (AMGhybrid_data -> final_rel_res_norm) = res_norm; } tt2 = hypre_MPI_Wtime(); AMGhybrid_data->solve_time2 = tt2 - tt1; } else if (solver_type == 3) { hypre_BiCGSTABSetPrecond((void*) pcg_solver, (HYPRE_Int (*)(void*, void*, void*, void*)) pcg_precond_solve, (HYPRE_Int (*)(void*, void*, void*, void*)) pcg_precond_setup, (void*) pcg_precond); hypre_BiCGSTABSetup(pcg_solver, (void*) A, (void*) b, (void*) x); tt2 = hypre_MPI_Wtime(); AMGhybrid_data->setup_time2 = tt2 - tt1; /* Solve */ tt1 = tt2; hypre_BiCGSTABSolve(pcg_solver, (void*) A, (void*) b, (void*) x); /* Get information from BiCGSTAB that is always logged in AMGhybrid solver*/ hypre_BiCGSTABGetNumIterations(pcg_solver, &pcg_num_its); (AMGhybrid_data -> pcg_num_its) = pcg_num_its; if (logging) { hypre_BiCGSTABGetFinalRelativeResidualNorm(pcg_solver, &res_norm); (AMGhybrid_data -> final_rel_res_norm) = res_norm; } tt2 = hypre_MPI_Wtime(); AMGhybrid_data->solve_time2 = tt2 - tt1; } } return hypre_error_flag; } hypre-2.33.0/src/parcsr_ls/ams.c000066400000000000000000005262151477326011500164520ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "_hypre_onedpl.hpp" #include "_hypre_parcsr_ls.h" #include "float.h" #include "ams.h" #include "_hypre_utilities.hpp" /*-------------------------------------------------------------------------- * hypre_ParCSRRelax * * Relaxation on the ParCSR matrix A with right-hand side f and * initial guess u. Possible values for relax_type are: * * 1 = l1-scaled (or weighted) Jacobi * 2 = l1-scaled block Gauss-Seidel/SSOR * 3 = Kaczmarz * 4 = truncated version of 2 (Remark 6.2 in smoothers paper) * x = BoomerAMG relaxation with relax_type = |x| * (16 = Cheby) * * The default value of relax_type is 2. *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ParCSRRelax( hypre_ParCSRMatrix *A, /* matrix to relax with */ hypre_ParVector *f, /* right-hand side */ HYPRE_Int relax_type, /* relaxation type */ HYPRE_Int relax_times, /* number of sweeps */ HYPRE_Real *l1_norms, /* l1 norms of the rows of A */ HYPRE_Real relax_weight, /* damping coefficient (usually <= 1) */ HYPRE_Real omega, /* SOR parameter (usually in (0,2) */ HYPRE_Real max_eig_est, /* for cheby smoothers */ HYPRE_Real min_eig_est, HYPRE_Int cheby_order, HYPRE_Real cheby_fraction, hypre_ParVector *u, /* initial/updated approximation */ hypre_ParVector *v, /* temporary vector */ hypre_ParVector *z /* temporary vector */ ) { HYPRE_Int sweep; for (sweep = 0; sweep < relax_times; sweep++) { if (relax_type == 1) /* l1-scaled Jacobi */ { hypre_BoomerAMGRelax(A, f, NULL, 7, 0, relax_weight, 1.0, l1_norms, u, v, z); } else if (relax_type == 2 || relax_type == 4) /* offd-l1-scaled block GS */ { /* !!! Note: relax_weight and omega flipped !!! */ hypre_BoomerAMGRelaxHybridSOR(A, f, NULL, 0, omega, relax_weight, l1_norms, u, v, z, 1, 1, 0, 1); } else if (relax_type == 3) /* Kaczmarz */ { hypre_BoomerAMGRelax(A, f, NULL, 20, 0, relax_weight, omega, l1_norms, u, v, z); } else /* call BoomerAMG relaxation */ { if (relax_type == 16) { hypre_ParCSRRelax_Cheby(A, f, max_eig_est, min_eig_est, cheby_fraction, cheby_order, 1, 0, u, v, z); } else { hypre_BoomerAMGRelax(A, f, NULL, hypre_abs(relax_type), 0, relax_weight, omega, l1_norms, u, v, z); } } } return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_ParVectorInRangeOf * * Return a vector that belongs to the range of a given matrix. *--------------------------------------------------------------------------*/ hypre_ParVector *hypre_ParVectorInRangeOf(hypre_ParCSRMatrix *A) { hypre_ParVector *x; x = hypre_ParVectorCreate(hypre_ParCSRMatrixComm(A), hypre_ParCSRMatrixGlobalNumRows(A), hypre_ParCSRMatrixRowStarts(A)); hypre_ParVectorInitialize(x); hypre_ParVectorOwnsData(x) = 1; return x; } /*-------------------------------------------------------------------------- * hypre_ParVectorInDomainOf * * Return a vector that belongs to the domain of a given matrix. *--------------------------------------------------------------------------*/ hypre_ParVector *hypre_ParVectorInDomainOf(hypre_ParCSRMatrix *A) { hypre_ParVector *x; x = hypre_ParVectorCreate(hypre_ParCSRMatrixComm(A), hypre_ParCSRMatrixGlobalNumCols(A), hypre_ParCSRMatrixColStarts(A)); hypre_ParVectorInitialize(x); hypre_ParVectorOwnsData(x) = 1; return x; } /*-------------------------------------------------------------------------- * hypre_ParVectorBlockSplit * * Extract the dim sub-vectors x_0,...,x_{dim-1} composing a parallel * block vector x. It is assumed that &x[i] = [x_0[i],...,x_{dim-1}[i]]. *--------------------------------------------------------------------------*/ #if defined(HYPRE_USING_GPU) template __global__ void hypreGPUKernel_ParVectorBlockSplitGather(hypre_DeviceItem &item, HYPRE_Int size, HYPRE_Int dim, HYPRE_Real *x0, HYPRE_Real *x1, HYPRE_Real *x2, HYPRE_Real *x) { const HYPRE_Int i = hypre_gpu_get_grid_thread_id<1, 1>(item); if (i >= size * dim) { return; } HYPRE_Real *xx[3]; xx[0] = x0; xx[1] = x1; xx[2] = x2; const HYPRE_Int d = i % dim; const HYPRE_Int k = i / dim; if (dir == 0) { xx[d][k] = x[i]; } else if (dir == 1) { x[i] = xx[d][k]; } } #endif HYPRE_Int hypre_ParVectorBlockSplit(hypre_ParVector *x, hypre_ParVector *x_[3], HYPRE_Int dim) { HYPRE_Int i, d, size_; HYPRE_Real *x_data, *x_data_[3]; #if defined(HYPRE_USING_GPU) HYPRE_ExecutionPolicy exec = hypre_GetExecPolicy1( hypre_ParVectorMemoryLocation(x) ); #endif size_ = hypre_VectorSize(hypre_ParVectorLocalVector(x_[0])); x_data = hypre_VectorData(hypre_ParVectorLocalVector(x)); for (d = 0; d < dim; d++) { x_data_[d] = hypre_VectorData(hypre_ParVectorLocalVector(x_[d])); } #if defined(HYPRE_USING_GPU) if (exec == HYPRE_EXEC_DEVICE) { dim3 bDim = hypre_GetDefaultDeviceBlockDimension(); dim3 gDim = hypre_GetDefaultDeviceGridDimension(size_ * dim, "thread", bDim); HYPRE_GPU_LAUNCH( hypreGPUKernel_ParVectorBlockSplitGather<0>, gDim, bDim, size_, dim, x_data_[0], x_data_[1], x_data_[2], x_data); } else #endif { for (i = 0; i < size_; i++) { for (d = 0; d < dim; d++) { x_data_[d][i] = x_data[dim * i + d]; } } } return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_ParVectorBlockGather * * Compose a parallel block vector x from dim given sub-vectors * x_0,...,x_{dim-1}, such that &x[i] = [x_0[i],...,x_{dim-1}[i]]. *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ParVectorBlockGather(hypre_ParVector *x, hypre_ParVector *x_[3], HYPRE_Int dim) { HYPRE_Int i, d, size_; HYPRE_Real *x_data, *x_data_[3]; #if defined(HYPRE_USING_GPU) HYPRE_ExecutionPolicy exec = hypre_GetExecPolicy1( hypre_ParVectorMemoryLocation(x) ); #endif size_ = hypre_VectorSize(hypre_ParVectorLocalVector(x_[0])); x_data = hypre_VectorData(hypre_ParVectorLocalVector(x)); for (d = 0; d < dim; d++) { x_data_[d] = hypre_VectorData(hypre_ParVectorLocalVector(x_[d])); } #if defined(HYPRE_USING_GPU) if (exec == HYPRE_EXEC_DEVICE) { dim3 bDim = hypre_GetDefaultDeviceBlockDimension(); dim3 gDim = hypre_GetDefaultDeviceGridDimension(size_ * dim, "thread", bDim); HYPRE_GPU_LAUNCH( hypreGPUKernel_ParVectorBlockSplitGather<1>, gDim, bDim, size_, dim, x_data_[0], x_data_[1], x_data_[2], x_data); } else #endif { for (i = 0; i < size_; i++) { for (d = 0; d < dim; d++) { x_data[dim * i + d] = x_data_[d][i]; } } } return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_BoomerAMGBlockSolve * * Apply the block-diagonal solver diag(B) to the system diag(A) x = b. * Here B is a given BoomerAMG solver for A, while x and b are "block" * parallel vectors. *--------------------------------------------------------------------------*/ HYPRE_Int hypre_BoomerAMGBlockSolve(void *B, hypre_ParCSRMatrix *A, hypre_ParVector *b, hypre_ParVector *x) { HYPRE_Int d, dim = 1; hypre_ParVector *b_[3] = {NULL, NULL, NULL}; hypre_ParVector *x_[3] = {NULL, NULL, NULL}; dim = hypre_ParVectorGlobalSize(x) / hypre_ParCSRMatrixGlobalNumRows(A); if (dim == 1) { hypre_BoomerAMGSolve(B, A, b, x); return hypre_error_flag; } for (d = 0; d < dim; d++) { b_[d] = hypre_ParVectorInRangeOf(A); x_[d] = hypre_ParVectorInRangeOf(A); } hypre_ParVectorBlockSplit(b, b_, dim); hypre_ParVectorBlockSplit(x, x_, dim); for (d = 0; d < dim; d++) { hypre_BoomerAMGSolve(B, A, b_[d], x_[d]); } hypre_ParVectorBlockGather(x, x_, dim); for (d = 0; d < dim; d++) { hypre_ParVectorDestroy(b_[d]); hypre_ParVectorDestroy(x_[d]); } return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_ParCSRMatrixFixZeroRows * * For every zero row in the matrix: set the diagonal element to 1. *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ParCSRMatrixFixZeroRowsHost(hypre_ParCSRMatrix *A) { HYPRE_Int i, j; HYPRE_Real l1_norm; HYPRE_Int num_rows = hypre_ParCSRMatrixNumRows(A); hypre_CSRMatrix *A_diag = hypre_ParCSRMatrixDiag(A); HYPRE_Int *A_diag_I = hypre_CSRMatrixI(A_diag); HYPRE_Int *A_diag_J = hypre_CSRMatrixJ(A_diag); HYPRE_Real *A_diag_data = hypre_CSRMatrixData(A_diag); hypre_CSRMatrix *A_offd = hypre_ParCSRMatrixOffd(A); HYPRE_Int *A_offd_I = hypre_CSRMatrixI(A_offd); HYPRE_Real *A_offd_data = hypre_CSRMatrixData(A_offd); HYPRE_Int num_cols_offd = hypre_CSRMatrixNumCols(A_offd); /* a row will be considered zero if its l1 norm is less than eps */ HYPRE_Real eps = 0.0; /* DBL_EPSILON * 1e+4; */ for (i = 0; i < num_rows; i++) { l1_norm = 0.0; for (j = A_diag_I[i]; j < A_diag_I[i + 1]; j++) { l1_norm += hypre_abs(A_diag_data[j]); } if (num_cols_offd) for (j = A_offd_I[i]; j < A_offd_I[i + 1]; j++) { l1_norm += hypre_abs(A_offd_data[j]); } if (l1_norm <= eps) { for (j = A_diag_I[i]; j < A_diag_I[i + 1]; j++) if (A_diag_J[j] == i) { A_diag_data[j] = 1.0; } else { A_diag_data[j] = 0.0; } if (num_cols_offd) for (j = A_offd_I[i]; j < A_offd_I[i + 1]; j++) { A_offd_data[j] = 0.0; } } } return hypre_error_flag; } #if defined(HYPRE_USING_GPU) __global__ void hypreGPUKernel_ParCSRMatrixFixZeroRows( hypre_DeviceItem &item, HYPRE_Int nrows, HYPRE_Int *A_diag_i, HYPRE_Int *A_diag_j, HYPRE_Complex *A_diag_data, HYPRE_Int *A_offd_i, HYPRE_Complex *A_offd_data, HYPRE_Int num_cols_offd) { HYPRE_Int row_i = hypre_gpu_get_grid_warp_id<1, 1>(item); if (row_i >= nrows) { return; } HYPRE_Int lane = hypre_gpu_get_lane_id<1>(item); HYPRE_Real eps = 0.0; /* DBL_EPSILON * 1e+4; */ HYPRE_Real l1_norm = 0.0; HYPRE_Int p1 = 0, q1, p2 = 0, q2 = 0; if (lane < 2) { p1 = read_only_load(A_diag_i + row_i + lane); if (num_cols_offd) { p2 = read_only_load(A_offd_i + row_i + lane); } } q1 = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, p1, 1); p1 = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, p1, 0); if (num_cols_offd) { q2 = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, p2, 1); p2 = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, p2, 0); } for (HYPRE_Int j = p1 + lane; j < q1; j += HYPRE_WARP_SIZE) { l1_norm += hypre_abs(A_diag_data[j]); } for (HYPRE_Int j = p2 + lane; j < q2; j += HYPRE_WARP_SIZE) { l1_norm += hypre_abs(A_offd_data[j]); } l1_norm = warp_allreduce_sum(item, l1_norm); if (l1_norm <= eps) { for (HYPRE_Int j = p1 + lane; j < q1; j += HYPRE_WARP_SIZE) { if (row_i == read_only_load(&A_diag_j[j])) { A_diag_data[j] = 1.0; } else { A_diag_data[j] = 0.0; } } for (HYPRE_Int j = p2 + lane; j < q2; j += HYPRE_WARP_SIZE) { A_offd_data[j] = 0.0; } } } HYPRE_Int hypre_ParCSRMatrixFixZeroRowsDevice(hypre_ParCSRMatrix *A) { HYPRE_Int nrows = hypre_ParCSRMatrixNumRows(A); hypre_CSRMatrix *A_diag = hypre_ParCSRMatrixDiag(A); HYPRE_Real *A_diag_data = hypre_CSRMatrixData(A_diag); HYPRE_Int *A_diag_i = hypre_CSRMatrixI(A_diag); HYPRE_Int *A_diag_j = hypre_CSRMatrixJ(A_diag); hypre_CSRMatrix *A_offd = hypre_ParCSRMatrixOffd(A); HYPRE_Real *A_offd_data = hypre_CSRMatrixData(A_offd); HYPRE_Int *A_offd_i = hypre_CSRMatrixI(A_offd); HYPRE_Int num_cols_offd = hypre_CSRMatrixNumCols(A_offd); dim3 bDim = hypre_GetDefaultDeviceBlockDimension(); dim3 gDim = hypre_GetDefaultDeviceGridDimension(nrows, "warp", bDim); HYPRE_GPU_LAUNCH(hypreGPUKernel_ParCSRMatrixFixZeroRows, gDim, bDim, nrows, A_diag_i, A_diag_j, A_diag_data, A_offd_i, A_offd_data, num_cols_offd); //hypre_SyncComputeStream(); return hypre_error_flag; } #endif HYPRE_Int hypre_ParCSRMatrixFixZeroRows(hypre_ParCSRMatrix *A) { #if defined(HYPRE_USING_GPU) HYPRE_ExecutionPolicy exec = hypre_GetExecPolicy1( hypre_ParCSRMatrixMemoryLocation(A) ); if (exec == HYPRE_EXEC_DEVICE) { return hypre_ParCSRMatrixFixZeroRowsDevice(A); } else #endif { return hypre_ParCSRMatrixFixZeroRowsHost(A); } } /*-------------------------------------------------------------------------- * hypre_ParCSRComputeL1Norms * * Compute the l1 norms of the rows of a given matrix, depending on * the option parameter: * * option 1 = Compute the l1 norm of the rows * option 2 = Compute the l1 norm of the (processor) off-diagonal * part of the rows plus the diagonal of A * option 3 = Compute the l2 norm^2 of the rows * option 4 = Truncated version of option 2 based on Remark 6.2 in "Multigrid * Smoothers for Ultra-Parallel Computing" * * The above computations are done in a CF manner, whenever the provided * cf_marker is not NULL. *--------------------------------------------------------------------------*/ #if defined(HYPRE_USING_GPU) #if defined(HYPRE_USING_SYCL) struct l1_norm_op1 #else struct l1_norm_op1 : public thrust::binary_function #endif { __host__ __device__ HYPRE_Complex operator()(const HYPRE_Complex &x, const HYPRE_Complex &y) const { return x <= 4.0 / 3.0 * y ? y : x; } }; #endif #if defined(HYPRE_USING_GPU) #if defined(HYPRE_USING_SYCL) struct l1_norm_op6 #else struct l1_norm_op6 : public thrust::binary_function #endif { __host__ __device__ HYPRE_Complex operator()(const HYPRE_Complex &d, const HYPRE_Complex &l) const { return (l + d + sqrt(l * l + d * d)) * 0.5; } }; #endif HYPRE_Int hypre_ParCSRComputeL1Norms(hypre_ParCSRMatrix *A, HYPRE_Int option, HYPRE_Int *cf_marker, HYPRE_Real **l1_norm_ptr) { HYPRE_Int i; HYPRE_Int num_rows = hypre_ParCSRMatrixNumRows(A); hypre_CSRMatrix *A_diag = hypre_ParCSRMatrixDiag(A); hypre_CSRMatrix *A_offd = hypre_ParCSRMatrixOffd(A); HYPRE_Int num_cols_offd = hypre_CSRMatrixNumCols(A_offd); HYPRE_MemoryLocation memory_location_l1 = hypre_ParCSRMatrixMemoryLocation(A); HYPRE_ExecutionPolicy exec = hypre_GetExecPolicy1( memory_location_l1 ); if (exec == HYPRE_EXEC_HOST) { HYPRE_Int num_threads = hypre_NumThreads(); if (num_threads > 1) { return hypre_ParCSRComputeL1NormsThreads(A, option, num_threads, cf_marker, l1_norm_ptr); } } HYPRE_Real *l1_norm = hypre_TAlloc(HYPRE_Real, num_rows, memory_location_l1); HYPRE_MemoryLocation memory_location_tmp = exec == HYPRE_EXEC_HOST ? HYPRE_MEMORY_HOST : HYPRE_MEMORY_DEVICE; HYPRE_Real *diag_tmp = NULL; HYPRE_Int *cf_marker_offd = NULL; /* collect the cf marker data from other procs */ if (cf_marker != NULL) { HYPRE_Int num_sends; HYPRE_Int *int_buf_data = NULL; hypre_ParCSRCommPkg *comm_pkg = hypre_ParCSRMatrixCommPkg(A); hypre_ParCSRCommHandle *comm_handle; if (num_cols_offd) { cf_marker_offd = hypre_CTAlloc(HYPRE_Int, num_cols_offd, memory_location_tmp); } num_sends = hypre_ParCSRCommPkgNumSends(comm_pkg); if (hypre_ParCSRCommPkgSendMapStart(comm_pkg, num_sends)) { int_buf_data = hypre_CTAlloc(HYPRE_Int, hypre_ParCSRCommPkgSendMapStart(comm_pkg, num_sends), memory_location_tmp); } #if defined(HYPRE_USING_GPU) if (exec == HYPRE_EXEC_DEVICE) { hypre_ParCSRCommPkgCopySendMapElmtsToDevice(comm_pkg); #if defined(HYPRE_USING_SYCL) hypreSycl_gather( hypre_ParCSRCommPkgDeviceSendMapElmts(comm_pkg), hypre_ParCSRCommPkgDeviceSendMapElmts(comm_pkg) + hypre_ParCSRCommPkgSendMapStart(comm_pkg, num_sends), cf_marker, int_buf_data ); #else HYPRE_THRUST_CALL( gather, hypre_ParCSRCommPkgDeviceSendMapElmts(comm_pkg), hypre_ParCSRCommPkgDeviceSendMapElmts(comm_pkg) + hypre_ParCSRCommPkgSendMapStart(comm_pkg, num_sends), cf_marker, int_buf_data ); #endif #if defined(HYPRE_USING_THRUST_NOSYNC) /* RL: make sure int_buf_data is ready before issuing GPU-GPU MPI */ if (hypre_GetGpuAwareMPI()) { hypre_ForceSyncComputeStream(); } #endif } else #endif { HYPRE_Int index = 0; HYPRE_Int start; HYPRE_Int j; for (i = 0; i < num_sends; i++) { start = hypre_ParCSRCommPkgSendMapStart(comm_pkg, i); for (j = start; j < hypre_ParCSRCommPkgSendMapStart(comm_pkg, i + 1); j++) { int_buf_data[index++] = cf_marker[hypre_ParCSRCommPkgSendMapElmt(comm_pkg, j)]; } } } comm_handle = hypre_ParCSRCommHandleCreate_v2(11, comm_pkg, memory_location_tmp, int_buf_data, memory_location_tmp, cf_marker_offd); hypre_ParCSRCommHandleDestroy(comm_handle); hypre_TFree(int_buf_data, memory_location_tmp); } if (option == 1) { /* Set the l1 norm of the diag part */ hypre_CSRMatrixComputeRowSum(A_diag, cf_marker, cf_marker, l1_norm, 1, 1.0, "set"); /* Add the l1 norm of the offd part */ if (num_cols_offd) { hypre_CSRMatrixComputeRowSum(A_offd, cf_marker, cf_marker_offd, l1_norm, 1, 1.0, "add"); } } else if (option == 2) { /* Set the abs(diag) element */ hypre_CSRMatrixExtractDiagonal(A_diag, l1_norm, 1); /* Add the l1 norm of the offd part */ if (num_cols_offd) { hypre_CSRMatrixComputeRowSum(A_offd, cf_marker, cf_marker, l1_norm, 1, 1.0, "add"); } } else if (option == 3) { /* Set the CF l2 norm of the diag part */ hypre_CSRMatrixComputeRowSum(A_diag, NULL, NULL, l1_norm, 2, 1.0, "set"); /* Add the CF l2 norm of the offd part */ if (num_cols_offd) { hypre_CSRMatrixComputeRowSum(A_offd, NULL, NULL, l1_norm, 2, 1.0, "add"); } } else if (option == 4) { /* Set the abs(diag) element */ hypre_CSRMatrixExtractDiagonal(A_diag, l1_norm, 1); diag_tmp = hypre_TAlloc(HYPRE_Real, num_rows, memory_location_tmp); hypre_TMemcpy(diag_tmp, l1_norm, HYPRE_Real, num_rows, memory_location_tmp, memory_location_l1); /* Add the scaled l1 norm of the offd part */ if (num_cols_offd) { hypre_CSRMatrixComputeRowSum(A_offd, cf_marker, cf_marker_offd, l1_norm, 1, 0.5, "add"); } /* Truncate according to Remark 6.2 */ #if defined(HYPRE_USING_GPU) if (exec == HYPRE_EXEC_DEVICE) { #if defined(HYPRE_USING_SYCL) HYPRE_ONEDPL_CALL( std::transform, l1_norm, l1_norm + num_rows, diag_tmp, l1_norm, l1_norm_op1() ); #else HYPRE_THRUST_CALL( transform, l1_norm, l1_norm + num_rows, diag_tmp, l1_norm, l1_norm_op1() ); #endif } else #endif { for (i = 0; i < num_rows; i++) { if (l1_norm[i] <= 4.0 / 3.0 * diag_tmp[i]) { l1_norm[i] = diag_tmp[i]; } } } } else if (option == 5) /*stores diagonal of A for Jacobi using matvec, rlx 7 */ { /* Set the diag element */ hypre_CSRMatrixExtractDiagonal(A_diag, l1_norm, 0); #if defined(HYPRE_USING_GPU) if ( exec == HYPRE_EXEC_DEVICE) { #if defined(HYPRE_USING_SYCL) HYPRE_ONEDPL_CALL( std::replace_if, l1_norm, l1_norm + num_rows, [] (const auto & x) {return !x;}, 1.0 ); #else thrust::identity identity; HYPRE_THRUST_CALL( replace_if, l1_norm, l1_norm + num_rows, HYPRE_THRUST_NOT(identity), 1.0 ); #endif } else #endif { for (i = 0; i < num_rows; i++) { if (l1_norm[i] == 0.0) { l1_norm[i] = 1.0; } } } *l1_norm_ptr = l1_norm; return hypre_error_flag; } else if (option == 6) { /* Set the abs(diag) element */ hypre_CSRMatrixExtractDiagonal(A_diag, l1_norm, 1); /* Add the scaled l1 norm of the offd part */ if (num_cols_offd) { diag_tmp = hypre_TAlloc(HYPRE_Real, num_rows, memory_location_tmp); hypre_CSRMatrixComputeRowSum(A_offd, cf_marker, cf_marker_offd, diag_tmp, 1, 1.0, "set"); #if defined(HYPRE_USING_GPU) if (exec == HYPRE_EXEC_DEVICE) { #if defined(HYPRE_USING_SYCL) HYPRE_ONEDPL_CALL( std::transform, l1_norm, l1_norm + num_rows, diag_tmp, l1_norm, l1_norm_op6() ); #else HYPRE_THRUST_CALL( transform, l1_norm, l1_norm + num_rows, diag_tmp, l1_norm, l1_norm_op6() ); #endif } else #endif { for (i = 0; i < num_rows; i++) { l1_norm[i] = 0.5 * (diag_tmp[i] + l1_norm[i] + hypre_sqrt(hypre_squared(diag_tmp[i]) + hypre_squared(l1_norm[i]))); } } } } /* Handle negative definite matrices */ if (!diag_tmp) { diag_tmp = hypre_TAlloc(HYPRE_Real, num_rows, memory_location_tmp); } /* Set the diag element */ hypre_CSRMatrixExtractDiagonal(A_diag, diag_tmp, 0); #if defined(HYPRE_USING_GPU) if (exec == HYPRE_EXEC_DEVICE) { #if defined(HYPRE_USING_SYCL) hypreSycl_transform_if( l1_norm, l1_norm + num_rows, diag_tmp, l1_norm, std::negate(), is_negative() ); bool any_zero = 0.0 == HYPRE_ONEDPL_CALL( std::reduce, l1_norm, l1_norm + num_rows, 1.0, oneapi::dpl::minimum() ); #else HYPRE_THRUST_CALL( transform_if, l1_norm, l1_norm + num_rows, diag_tmp, l1_norm, thrust::negate(), is_negative() ); bool any_zero = 0.0 == HYPRE_THRUST_CALL( reduce, l1_norm, l1_norm + num_rows, 1.0, thrust::minimum() ); #endif if ( any_zero ) { hypre_error_in_arg(1); } } else #endif { for (i = 0; i < num_rows; i++) { if (diag_tmp[i] < 0.0) { l1_norm[i] = -l1_norm[i]; } } for (i = 0; i < num_rows; i++) { /* if (hypre_abs(l1_norm[i]) < DBL_EPSILON) */ if (hypre_abs(l1_norm[i]) == 0.0) { hypre_error_in_arg(1); break; } } } hypre_TFree(cf_marker_offd, memory_location_tmp); hypre_TFree(diag_tmp, memory_location_tmp); *l1_norm_ptr = l1_norm; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_ParCSRMatrixSetDiagRows * * For every row containing only a diagonal element: set it to d. *--------------------------------------------------------------------------*/ #if defined(HYPRE_USING_GPU) __global__ void hypreGPUKernel_ParCSRMatrixSetDiagRows(hypre_DeviceItem &item, HYPRE_Int nrows, HYPRE_Int *A_diag_I, HYPRE_Int *A_diag_J, HYPRE_Complex *A_diag_data, HYPRE_Int *A_offd_I, HYPRE_Int num_cols_offd, HYPRE_Real d) { const HYPRE_Int i = hypre_gpu_get_grid_thread_id<1, 1>(item); if (i >= nrows) { return; } HYPRE_Int j = read_only_load(&A_diag_I[i]); if ( (read_only_load(&A_diag_I[i + 1]) == j + 1) && (read_only_load(&A_diag_J[j]) == i) && (!num_cols_offd || (read_only_load(&A_offd_I[i + 1]) == read_only_load(&A_offd_I[i]))) ) { A_diag_data[j] = d; } } #endif HYPRE_Int hypre_ParCSRMatrixSetDiagRows(hypre_ParCSRMatrix *A, HYPRE_Real d) { HYPRE_Int i, j; HYPRE_Int num_rows = hypre_ParCSRMatrixNumRows(A); hypre_CSRMatrix *A_diag = hypre_ParCSRMatrixDiag(A); HYPRE_Int *A_diag_I = hypre_CSRMatrixI(A_diag); HYPRE_Int *A_diag_J = hypre_CSRMatrixJ(A_diag); HYPRE_Real *A_diag_data = hypre_CSRMatrixData(A_diag); hypre_CSRMatrix *A_offd = hypre_ParCSRMatrixOffd(A); HYPRE_Int *A_offd_I = hypre_CSRMatrixI(A_offd); HYPRE_Int num_cols_offd = hypre_CSRMatrixNumCols(A_offd); #if defined(HYPRE_USING_GPU) HYPRE_ExecutionPolicy exec = hypre_GetExecPolicy1( hypre_ParCSRMatrixMemoryLocation(A) ); if (exec == HYPRE_EXEC_DEVICE) { dim3 bDim = hypre_GetDefaultDeviceBlockDimension(); dim3 gDim = hypre_GetDefaultDeviceGridDimension(num_rows, "thread", bDim); HYPRE_GPU_LAUNCH( hypreGPUKernel_ParCSRMatrixSetDiagRows, gDim, bDim, num_rows, A_diag_I, A_diag_J, A_diag_data, A_offd_I, num_cols_offd, d); } else #endif { for (i = 0; i < num_rows; i++) { j = A_diag_I[i]; if ((A_diag_I[i + 1] == j + 1) && (A_diag_J[j] == i) && (!num_cols_offd || (A_offd_I[i + 1] == A_offd_I[i]))) { A_diag_data[j] = d; } } } return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_AMSCreate * * Allocate the AMS solver structure. *--------------------------------------------------------------------------*/ void * hypre_AMSCreate(void) { hypre_AMSData *ams_data; ams_data = hypre_CTAlloc(hypre_AMSData, 1, HYPRE_MEMORY_HOST); /* Default parameters */ ams_data -> dim = 3; /* 3D problem */ ams_data -> maxit = 20; /* perform at most 20 iterations */ ams_data -> tol = 1e-6; /* convergence tolerance */ ams_data -> print_level = 1; /* print residual norm at each step */ ams_data -> cycle_type = 1; /* a 3-level multiplicative solver */ ams_data -> A_relax_type = 2; /* offd-l1-scaled GS */ ams_data -> A_relax_times = 1; /* one relaxation sweep */ ams_data -> A_relax_weight = 1.0; /* damping parameter */ ams_data -> A_omega = 1.0; /* SSOR coefficient */ ams_data -> A_cheby_order = 2; /* Cheby: order (1 -4 are vaild) */ ams_data -> A_cheby_fraction = .3; /* Cheby: fraction of spectrum to smooth */ ams_data -> B_G_coarsen_type = 10; /* HMIS coarsening */ ams_data -> B_G_agg_levels = 1; /* Levels of aggressive coarsening */ ams_data -> B_G_relax_type = 3; /* hybrid G-S/Jacobi */ ams_data -> B_G_theta = 0.25; /* strength threshold */ ams_data -> B_G_interp_type = 0; /* interpolation type */ ams_data -> B_G_Pmax = 0; /* max nonzero elements in interp. rows */ ams_data -> B_Pi_coarsen_type = 10; /* HMIS coarsening */ ams_data -> B_Pi_agg_levels = 1; /* Levels of aggressive coarsening */ ams_data -> B_Pi_relax_type = 3; /* hybrid G-S/Jacobi */ ams_data -> B_Pi_theta = 0.25; /* strength threshold */ ams_data -> B_Pi_interp_type = 0; /* interpolation type */ ams_data -> B_Pi_Pmax = 0; /* max nonzero elements in interp. rows */ ams_data -> beta_is_zero = 0; /* the problem has a mass term */ /* By default, do l1-GS smoothing on the coarsest grid */ ams_data -> B_G_coarse_relax_type = 8; ams_data -> B_Pi_coarse_relax_type = 8; /* The rest of the fields are initialized using the Set functions */ ams_data -> A = NULL; ams_data -> G = NULL; ams_data -> A_G = NULL; ams_data -> B_G = 0; ams_data -> Pi = NULL; ams_data -> A_Pi = NULL; ams_data -> B_Pi = 0; ams_data -> x = NULL; ams_data -> y = NULL; ams_data -> z = NULL; ams_data -> Gx = NULL; ams_data -> Gy = NULL; ams_data -> Gz = NULL; ams_data -> r0 = NULL; ams_data -> g0 = NULL; ams_data -> r1 = NULL; ams_data -> g1 = NULL; ams_data -> r2 = NULL; ams_data -> g2 = NULL; ams_data -> zz = NULL; ams_data -> Pix = NULL; ams_data -> Piy = NULL; ams_data -> Piz = NULL; ams_data -> A_Pix = NULL; ams_data -> A_Piy = NULL; ams_data -> A_Piz = NULL; ams_data -> B_Pix = 0; ams_data -> B_Piy = 0; ams_data -> B_Piz = 0; ams_data -> interior_nodes = NULL; ams_data -> G0 = NULL; ams_data -> A_G0 = NULL; ams_data -> B_G0 = 0; ams_data -> projection_frequency = 5; ams_data -> A_l1_norms = NULL; ams_data -> A_max_eig_est = 0; ams_data -> A_min_eig_est = 0; ams_data -> owns_Pi = 1; ams_data -> owns_A_G = 0; ams_data -> owns_A_Pi = 0; return (void *) ams_data; } /*-------------------------------------------------------------------------- * hypre_AMSDestroy * * Deallocate the AMS solver structure. Note that the input data (given * through the Set functions) is not destroyed. *--------------------------------------------------------------------------*/ HYPRE_Int hypre_AMSDestroy(void *solver) { hypre_AMSData *ams_data = (hypre_AMSData *) solver; if (!ams_data) { hypre_error_in_arg(1); return hypre_error_flag; } if (ams_data -> owns_A_G) if (ams_data -> A_G) { hypre_ParCSRMatrixDestroy(ams_data -> A_G); } if (!ams_data -> beta_is_zero) if (ams_data -> B_G) { HYPRE_BoomerAMGDestroy(ams_data -> B_G); } if (ams_data -> owns_Pi && ams_data -> Pi) { hypre_ParCSRMatrixDestroy(ams_data -> Pi); } if (ams_data -> owns_A_Pi) if (ams_data -> A_Pi) { hypre_ParCSRMatrixDestroy(ams_data -> A_Pi); } if (ams_data -> B_Pi) { HYPRE_BoomerAMGDestroy(ams_data -> B_Pi); } if (ams_data -> owns_Pi && ams_data -> Pix) { hypre_ParCSRMatrixDestroy(ams_data -> Pix); } if (ams_data -> A_Pix) { hypre_ParCSRMatrixDestroy(ams_data -> A_Pix); } if (ams_data -> B_Pix) { HYPRE_BoomerAMGDestroy(ams_data -> B_Pix); } if (ams_data -> owns_Pi && ams_data -> Piy) { hypre_ParCSRMatrixDestroy(ams_data -> Piy); } if (ams_data -> A_Piy) { hypre_ParCSRMatrixDestroy(ams_data -> A_Piy); } if (ams_data -> B_Piy) { HYPRE_BoomerAMGDestroy(ams_data -> B_Piy); } if (ams_data -> owns_Pi && ams_data -> Piz) { hypre_ParCSRMatrixDestroy(ams_data -> Piz); } if (ams_data -> A_Piz) { hypre_ParCSRMatrixDestroy(ams_data -> A_Piz); } if (ams_data -> B_Piz) { HYPRE_BoomerAMGDestroy(ams_data -> B_Piz); } if (ams_data -> r0) { hypre_ParVectorDestroy(ams_data -> r0); } if (ams_data -> g0) { hypre_ParVectorDestroy(ams_data -> g0); } if (ams_data -> r1) { hypre_ParVectorDestroy(ams_data -> r1); } if (ams_data -> g1) { hypre_ParVectorDestroy(ams_data -> g1); } if (ams_data -> r2) { hypre_ParVectorDestroy(ams_data -> r2); } if (ams_data -> g2) { hypre_ParVectorDestroy(ams_data -> g2); } if (ams_data -> zz) { hypre_ParVectorDestroy(ams_data -> zz); } if (ams_data -> G0) { hypre_ParCSRMatrixDestroy(ams_data -> A); } if (ams_data -> G0) { hypre_ParCSRMatrixDestroy(ams_data -> G0); } if (ams_data -> A_G0) { hypre_ParCSRMatrixDestroy(ams_data -> A_G0); } if (ams_data -> B_G0) { HYPRE_BoomerAMGDestroy(ams_data -> B_G0); } hypre_SeqVectorDestroy(ams_data -> A_l1_norms); /* G, x, y ,z, Gx, Gy and Gz are not destroyed */ if (ams_data) { hypre_TFree(ams_data, HYPRE_MEMORY_HOST); } return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_AMSSetDimension * * Set problem dimension (2 or 3). By default we assume dim = 3. *--------------------------------------------------------------------------*/ HYPRE_Int hypre_AMSSetDimension(void *solver, HYPRE_Int dim) { hypre_AMSData *ams_data = (hypre_AMSData *) solver; if (dim != 1 && dim != 2 && dim != 3) { hypre_error_in_arg(2); } ams_data -> dim = dim; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_AMSSetDiscreteGradient * * Set the discrete gradient matrix G. * This function should be called before hypre_AMSSetup()! *--------------------------------------------------------------------------*/ HYPRE_Int hypre_AMSSetDiscreteGradient(void *solver, hypre_ParCSRMatrix *G) { hypre_AMSData *ams_data = (hypre_AMSData *) solver; ams_data -> G = G; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_AMSSetCoordinateVectors * * Set the x, y and z coordinates of the vertices in the mesh. * * Either SetCoordinateVectors or SetEdgeConstantVectors should be * called before hypre_AMSSetup()! *--------------------------------------------------------------------------*/ HYPRE_Int hypre_AMSSetCoordinateVectors(void *solver, hypre_ParVector *x, hypre_ParVector *y, hypre_ParVector *z) { hypre_AMSData *ams_data = (hypre_AMSData *) solver; ams_data -> x = x; ams_data -> y = y; ams_data -> z = z; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_AMSSetEdgeConstantVectors * * Set the vectors Gx, Gy and Gz which give the representations of * the constant vector fields (1,0,0), (0,1,0) and (0,0,1) in the * edge element basis. * * Either SetCoordinateVectors or SetEdgeConstantVectors should be * called before hypre_AMSSetup()! *--------------------------------------------------------------------------*/ HYPRE_Int hypre_AMSSetEdgeConstantVectors(void *solver, hypre_ParVector *Gx, hypre_ParVector *Gy, hypre_ParVector *Gz) { hypre_AMSData *ams_data = (hypre_AMSData *) solver; ams_data -> Gx = Gx; ams_data -> Gy = Gy; ams_data -> Gz = Gz; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_AMSSetInterpolations * * Set the (components of) the Nedelec interpolation matrix Pi=[Pix,Piy,Piz]. * * This function is generally intended to be used only for high-order Nedelec * discretizations (in the lowest order case, Pi is constructed internally in * AMS from the discreet gradient matrix and the coordinates of the vertices), * though it can also be used in the lowest-order case or for other types of * discretizations (e.g. ones based on the second family of Nedelec elements). * * By definition, Pi is the matrix representation of the linear operator that * interpolates (high-order) vector nodal finite elements into the (high-order) * Nedelec space. The component matrices are defined as Pix phi = Pi (phi,0,0) * and similarly for Piy and Piz. Note that all these operators depend on the * choice of the basis and degrees of freedom in the high-order spaces. * * The column numbering of Pi should be node-based, i.e. the x/y/z components of * the first node (vertex or high-order dof) should be listed first, followed by * the x/y/z components of the second node and so on (see the documentation of * HYPRE_BoomerAMGSetDofFunc). * * If used, this function should be called before hypre_AMSSetup() and there is * no need to provide the vertex coordinates. Furthermore, only one of the sets * {Pi} and {Pix,Piy,Piz} needs to be specified (though it is OK to provide * both). If Pix is NULL, then scalar Pi-based AMS cycles, i.e. those with * cycle_type > 10, will be unavailable. Similarly, AMS cycles based on * monolithic Pi (cycle_type < 10) require that Pi is not NULL. *--------------------------------------------------------------------------*/ HYPRE_Int hypre_AMSSetInterpolations(void *solver, hypre_ParCSRMatrix *Pi, hypre_ParCSRMatrix *Pix, hypre_ParCSRMatrix *Piy, hypre_ParCSRMatrix *Piz) { hypre_AMSData *ams_data = (hypre_AMSData *) solver; ams_data -> Pi = Pi; ams_data -> Pix = Pix; ams_data -> Piy = Piy; ams_data -> Piz = Piz; ams_data -> owns_Pi = 0; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_AMSSetAlphaPoissonMatrix * * Set the matrix corresponding to the Poisson problem with coefficient * alpha (the curl-curl term coefficient in the Maxwell problem). * * If this function is called, the coarse space solver on the range * of Pi^T is a block-diagonal version of A_Pi. If this function is not * called, the coarse space solver on the range of Pi^T is constructed * as Pi^T A Pi in hypre_AMSSetup(). *--------------------------------------------------------------------------*/ HYPRE_Int hypre_AMSSetAlphaPoissonMatrix(void *solver, hypre_ParCSRMatrix *A_Pi) { hypre_AMSData *ams_data = (hypre_AMSData *) solver; ams_data -> A_Pi = A_Pi; /* Penalize the eliminated degrees of freedom */ hypre_ParCSRMatrixSetDiagRows(A_Pi, HYPRE_REAL_MAX); /* Make sure that the first entry in each row is the diagonal one. */ /* hypre_CSRMatrixReorder(hypre_ParCSRMatrixDiag(A_Pi)); */ return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_AMSSetBetaPoissonMatrix * * Set the matrix corresponding to the Poisson problem with coefficient * beta (the mass term coefficient in the Maxwell problem). * * This function call is optional - if not given, the Poisson matrix will * be computed in hypre_AMSSetup(). If the given matrix is NULL, we assume * that beta is 0 and use two-level (instead of three-level) methods. *--------------------------------------------------------------------------*/ HYPRE_Int hypre_AMSSetBetaPoissonMatrix(void *solver, hypre_ParCSRMatrix *A_G) { hypre_AMSData *ams_data = (hypre_AMSData *) solver; ams_data -> A_G = A_G; if (!A_G) { ams_data -> beta_is_zero = 1; } else { /* Penalize the eliminated degrees of freedom */ hypre_ParCSRMatrixSetDiagRows(A_G, HYPRE_REAL_MAX); /* Make sure that the first entry in each row is the diagonal one. */ /* hypre_CSRMatrixReorder(hypre_ParCSRMatrixDiag(A_G)); */ } return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_AMSSetInteriorNodes * * Set the list of nodes which are interior to the zero-conductivity region. * A node is interior if interior_nodes[i] == 1.0. * * Should be called before hypre_AMSSetup()! *--------------------------------------------------------------------------*/ HYPRE_Int hypre_AMSSetInteriorNodes(void *solver, hypre_ParVector *interior_nodes) { hypre_AMSData *ams_data = (hypre_AMSData *) solver; ams_data -> interior_nodes = interior_nodes; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_AMSSetProjectionFrequency * * How often to project the r.h.s. onto the compatible sub-space Ker(G0^T), * when iterating with the solver. * * The default value is every 5th iteration. *--------------------------------------------------------------------------*/ HYPRE_Int hypre_AMSSetProjectionFrequency(void *solver, HYPRE_Int projection_frequency) { hypre_AMSData *ams_data = (hypre_AMSData *) solver; ams_data -> projection_frequency = projection_frequency; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_AMSSetMaxIter * * Set the maximum number of iterations in the three-level method. * The default value is 20. To use the AMS solver as a preconditioner, * set maxit to 1, tol to 0.0 and print_level to 0. *--------------------------------------------------------------------------*/ HYPRE_Int hypre_AMSSetMaxIter(void *solver, HYPRE_Int maxit) { hypre_AMSData *ams_data = (hypre_AMSData *) solver; ams_data -> maxit = maxit; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_AMSSetTol * * Set the convergence tolerance (if the method is used as a solver). * The default value is 1e-6. *--------------------------------------------------------------------------*/ HYPRE_Int hypre_AMSSetTol(void *solver, HYPRE_Real tol) { hypre_AMSData *ams_data = (hypre_AMSData *) solver; ams_data -> tol = tol; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_AMSSetCycleType * * Choose which three-level solver to use. Possible values are: * * 1 = 3-level multipl. solver (01210) <-- small solution time * 2 = 3-level additive solver (0+1+2) * 3 = 3-level multipl. solver (02120) * 4 = 3-level additive solver (010+2) * 5 = 3-level multipl. solver (0102010) <-- small solution time * 6 = 3-level additive solver (1+020) * 7 = 3-level multipl. solver (0201020) <-- small number of iterations * 8 = 3-level additive solver (0(1+2)0) <-- small solution time * 9 = 3-level multipl. solver (01210) with discrete divergence * 11 = 5-level multipl. solver (013454310) <-- small solution time, memory * 12 = 5-level additive solver (0+1+3+4+5) * 13 = 5-level multipl. solver (034515430) <-- small solution time, memory * 14 = 5-level additive solver (01(3+4+5)10) * 20 = 2-level multipl. solver (0[12]0) * * 0 = a Hiptmair-like smoother (010) * * The default value is 1. *--------------------------------------------------------------------------*/ HYPRE_Int hypre_AMSSetCycleType(void *solver, HYPRE_Int cycle_type) { hypre_AMSData *ams_data = (hypre_AMSData *) solver; ams_data -> cycle_type = cycle_type; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_AMSSetPrintLevel * * Control how much information is printed during the solution iterations. * The defaut values is 1 (print residual norm at each step). *--------------------------------------------------------------------------*/ HYPRE_Int hypre_AMSSetPrintLevel(void *solver, HYPRE_Int print_level) { hypre_AMSData *ams_data = (hypre_AMSData *) solver; ams_data -> print_level = print_level; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_AMSSetSmoothingOptions * * Set relaxation parameters for A. Default values: 2, 1, 1.0, 1.0. *--------------------------------------------------------------------------*/ HYPRE_Int hypre_AMSSetSmoothingOptions(void *solver, HYPRE_Int A_relax_type, HYPRE_Int A_relax_times, HYPRE_Real A_relax_weight, HYPRE_Real A_omega) { hypre_AMSData *ams_data = (hypre_AMSData *) solver; ams_data -> A_relax_type = A_relax_type; ams_data -> A_relax_times = A_relax_times; ams_data -> A_relax_weight = A_relax_weight; ams_data -> A_omega = A_omega; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_AMSSetChebySmoothingOptions * AB: note: this could be added to the above, * but I didn't want to change parameter list) * Set parameters for chebyshev smoother for A. Default values: 2,.3. *--------------------------------------------------------------------------*/ HYPRE_Int hypre_AMSSetChebySmoothingOptions(void *solver, HYPRE_Int A_cheby_order, HYPRE_Real A_cheby_fraction) { hypre_AMSData *ams_data = (hypre_AMSData *) solver; ams_data -> A_cheby_order = A_cheby_order; ams_data -> A_cheby_fraction = A_cheby_fraction; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_AMSSetAlphaAMGOptions * * Set AMG parameters for B_Pi. Default values: 10, 1, 3, 0.25, 0, 0. *--------------------------------------------------------------------------*/ HYPRE_Int hypre_AMSSetAlphaAMGOptions(void *solver, HYPRE_Int B_Pi_coarsen_type, HYPRE_Int B_Pi_agg_levels, HYPRE_Int B_Pi_relax_type, HYPRE_Real B_Pi_theta, HYPRE_Int B_Pi_interp_type, HYPRE_Int B_Pi_Pmax) { hypre_AMSData *ams_data = (hypre_AMSData *) solver; ams_data -> B_Pi_coarsen_type = B_Pi_coarsen_type; ams_data -> B_Pi_agg_levels = B_Pi_agg_levels; ams_data -> B_Pi_relax_type = B_Pi_relax_type; ams_data -> B_Pi_theta = B_Pi_theta; ams_data -> B_Pi_interp_type = B_Pi_interp_type; ams_data -> B_Pi_Pmax = B_Pi_Pmax; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_AMSSetAlphaAMGCoarseRelaxType * * Set the AMG coarsest level relaxation for B_Pi. Default value: 8. *--------------------------------------------------------------------------*/ HYPRE_Int hypre_AMSSetAlphaAMGCoarseRelaxType(void *solver, HYPRE_Int B_Pi_coarse_relax_type) { hypre_AMSData *ams_data = (hypre_AMSData *)solver; ams_data -> B_Pi_coarse_relax_type = B_Pi_coarse_relax_type; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_AMSSetBetaAMGOptions * * Set AMG parameters for B_G. Default values: 10, 1, 3, 0.25, 0, 0. *--------------------------------------------------------------------------*/ HYPRE_Int hypre_AMSSetBetaAMGOptions(void *solver, HYPRE_Int B_G_coarsen_type, HYPRE_Int B_G_agg_levels, HYPRE_Int B_G_relax_type, HYPRE_Real B_G_theta, HYPRE_Int B_G_interp_type, HYPRE_Int B_G_Pmax) { hypre_AMSData *ams_data = (hypre_AMSData *) solver; ams_data -> B_G_coarsen_type = B_G_coarsen_type; ams_data -> B_G_agg_levels = B_G_agg_levels; ams_data -> B_G_relax_type = B_G_relax_type; ams_data -> B_G_theta = B_G_theta; ams_data -> B_G_interp_type = B_G_interp_type; ams_data -> B_G_Pmax = B_G_Pmax; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_AMSSetBetaAMGCoarseRelaxType * * Set the AMG coarsest level relaxation for B_G. Default value: 8. *--------------------------------------------------------------------------*/ HYPRE_Int hypre_AMSSetBetaAMGCoarseRelaxType(void *solver, HYPRE_Int B_G_coarse_relax_type) { hypre_AMSData *ams_data = (hypre_AMSData *) solver; ams_data -> B_G_coarse_relax_type = B_G_coarse_relax_type; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_AMSComputePi * * Construct the Pi interpolation matrix, which maps the space of vector * linear finite elements to the space of edge finite elements. * * The construction is based on the fact that Pi = [Pi_x, Pi_y, Pi_z], * where each block has the same sparsity structure as G, and the entries * can be computed from the vectors Gx, Gy, Gz. *--------------------------------------------------------------------------*/ #if defined(HYPRE_USING_GPU) __global__ void hypreGPUKernel_AMSComputePi_copy1(hypre_DeviceItem &item, HYPRE_Int nnz, HYPRE_Int dim, HYPRE_Int *j_in, HYPRE_Int *j_out) { const HYPRE_Int i = hypre_gpu_get_grid_thread_id<1, 1>(item); if (i < nnz) { const HYPRE_Int j = dim * i; for (HYPRE_Int d = 0; d < dim; d++) { j_out[j + d] = dim * read_only_load(&j_in[i]) + d; } } } __global__ void hypreGPUKernel_AMSComputePi_copy2(hypre_DeviceItem &item, HYPRE_Int nrows, HYPRE_Int dim, HYPRE_Int *i_in, HYPRE_Real *data_in, HYPRE_Real *Gx_data, HYPRE_Real *Gy_data, HYPRE_Real *Gz_data, HYPRE_Real *data_out) { const HYPRE_Int i = hypre_gpu_get_grid_warp_id<1, 1>(item); if (i >= nrows) { return; } const HYPRE_Int lane_id = hypre_gpu_get_lane_id<1>(item); HYPRE_Int j = 0, istart, iend; HYPRE_Real t, G[3], *Gdata[3]; Gdata[0] = Gx_data; Gdata[1] = Gy_data; Gdata[2] = Gz_data; if (lane_id < 2) { j = read_only_load(i_in + i + lane_id); } istart = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, j, 0); iend = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, j, 1); if (lane_id < dim) { t = read_only_load(Gdata[lane_id] + i); } for (HYPRE_Int d = 0; d < dim; d++) { G[d] = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, t, d); } for (j = istart + lane_id; j < iend; j += HYPRE_WARP_SIZE) { const HYPRE_Real v = data_in ? hypre_abs(read_only_load(&data_in[j])) * 0.5 : 1.0; const HYPRE_Int k = j * dim; for (HYPRE_Int d = 0; d < dim; d++) { data_out[k + d] = v * G[d]; } } } #endif HYPRE_Int hypre_AMSComputePi(hypre_ParCSRMatrix *A, hypre_ParCSRMatrix *G, hypre_ParVector *Gx, hypre_ParVector *Gy, hypre_ParVector *Gz, HYPRE_Int dim, hypre_ParCSRMatrix **Pi_ptr) { HYPRE_UNUSED_VAR(A); hypre_ParCSRMatrix *Pi; /* Compute Pi = [Pi_x, Pi_y, Pi_z] */ { HYPRE_Int i, j, d; HYPRE_Real *Gx_data, *Gy_data = NULL, *Gz_data = NULL; MPI_Comm comm = hypre_ParCSRMatrixComm(G); HYPRE_BigInt *col_starts_G = hypre_ParCSRMatrixColStarts(G); HYPRE_BigInt global_num_rows = hypre_ParCSRMatrixGlobalNumRows(G); HYPRE_BigInt global_num_cols = dim * hypre_ParCSRMatrixGlobalNumCols(G); HYPRE_BigInt *row_starts = hypre_ParCSRMatrixRowStarts(G); HYPRE_BigInt col_starts[2] = {(HYPRE_BigInt)dim * col_starts_G[0], (HYPRE_BigInt)dim * col_starts_G[1] }; HYPRE_Int num_cols_offd = dim * hypre_CSRMatrixNumCols(hypre_ParCSRMatrixOffd(G)); HYPRE_Int num_nonzeros_diag = dim * hypre_CSRMatrixNumNonzeros(hypre_ParCSRMatrixDiag(G)); HYPRE_Int num_nonzeros_offd = dim * hypre_CSRMatrixNumNonzeros(hypre_ParCSRMatrixOffd(G)); Pi = hypre_ParCSRMatrixCreate(comm, global_num_rows, global_num_cols, row_starts, col_starts, num_cols_offd, num_nonzeros_diag, num_nonzeros_offd); hypre_ParCSRMatrixOwnsData(Pi) = 1; hypre_ParCSRMatrixInitialize(Pi); Gx_data = hypre_VectorData(hypre_ParVectorLocalVector(Gx)); if (dim >= 2) { Gy_data = hypre_VectorData(hypre_ParVectorLocalVector(Gy)); } if (dim == 3) { Gz_data = hypre_VectorData(hypre_ParVectorLocalVector(Gz)); } #if defined(HYPRE_USING_GPU) HYPRE_ExecutionPolicy exec = hypre_GetExecPolicy2( hypre_ParCSRMatrixMemoryLocation(G), hypre_ParCSRMatrixMemoryLocation(Pi) ); #endif /* Fill-in the diagonal part */ { hypre_CSRMatrix *G_diag = hypre_ParCSRMatrixDiag(G); HYPRE_Int *G_diag_I = hypre_CSRMatrixI(G_diag); HYPRE_Int *G_diag_J = hypre_CSRMatrixJ(G_diag); HYPRE_Real *G_diag_data = hypre_CSRMatrixData(G_diag); HYPRE_Int G_diag_nrows = hypre_CSRMatrixNumRows(G_diag); HYPRE_Int G_diag_nnz = hypre_CSRMatrixNumNonzeros(G_diag); hypre_CSRMatrix *Pi_diag = hypre_ParCSRMatrixDiag(Pi); HYPRE_Int *Pi_diag_I = hypre_CSRMatrixI(Pi_diag); HYPRE_Int *Pi_diag_J = hypre_CSRMatrixJ(Pi_diag); HYPRE_Real *Pi_diag_data = hypre_CSRMatrixData(Pi_diag); #if defined(HYPRE_USING_GPU) if (exec == HYPRE_EXEC_DEVICE) { hypreDevice_IntScalen( G_diag_I, G_diag_nrows + 1, Pi_diag_I, dim ); dim3 bDim = hypre_GetDefaultDeviceBlockDimension(); dim3 gDim = hypre_GetDefaultDeviceGridDimension(G_diag_nnz, "thread", bDim); HYPRE_GPU_LAUNCH( hypreGPUKernel_AMSComputePi_copy1, gDim, bDim, G_diag_nnz, dim, G_diag_J, Pi_diag_J ); gDim = hypre_GetDefaultDeviceGridDimension(G_diag_nrows, "warp", bDim); HYPRE_GPU_LAUNCH( hypreGPUKernel_AMSComputePi_copy2, gDim, bDim, G_diag_nrows, dim, G_diag_I, G_diag_data, Gx_data, Gy_data, Gz_data, Pi_diag_data ); } else #endif { for (i = 0; i < G_diag_nrows + 1; i++) { Pi_diag_I[i] = dim * G_diag_I[i]; } for (i = 0; i < G_diag_nnz; i++) for (d = 0; d < dim; d++) { Pi_diag_J[dim * i + d] = dim * G_diag_J[i] + d; } for (i = 0; i < G_diag_nrows; i++) for (j = G_diag_I[i]; j < G_diag_I[i + 1]; j++) { *Pi_diag_data++ = hypre_abs(G_diag_data[j]) * 0.5 * Gx_data[i]; if (dim >= 2) { *Pi_diag_data++ = hypre_abs(G_diag_data[j]) * 0.5 * Gy_data[i]; } if (dim == 3) { *Pi_diag_data++ = hypre_abs(G_diag_data[j]) * 0.5 * Gz_data[i]; } } } } /* Fill-in the off-diagonal part */ { hypre_CSRMatrix *G_offd = hypre_ParCSRMatrixOffd(G); HYPRE_Int *G_offd_I = hypre_CSRMatrixI(G_offd); HYPRE_Int *G_offd_J = hypre_CSRMatrixJ(G_offd); HYPRE_Real *G_offd_data = hypre_CSRMatrixData(G_offd); HYPRE_Int G_offd_nrows = hypre_CSRMatrixNumRows(G_offd); HYPRE_Int G_offd_ncols = hypre_CSRMatrixNumCols(G_offd); HYPRE_Int G_offd_nnz = hypre_CSRMatrixNumNonzeros(G_offd); hypre_CSRMatrix *Pi_offd = hypre_ParCSRMatrixOffd(Pi); HYPRE_Int *Pi_offd_I = hypre_CSRMatrixI(Pi_offd); HYPRE_Int *Pi_offd_J = hypre_CSRMatrixJ(Pi_offd); HYPRE_Real *Pi_offd_data = hypre_CSRMatrixData(Pi_offd); HYPRE_BigInt *G_cmap = hypre_ParCSRMatrixColMapOffd(G); HYPRE_BigInt *Pi_cmap = hypre_ParCSRMatrixColMapOffd(Pi); #if defined(HYPRE_USING_GPU) if (exec == HYPRE_EXEC_DEVICE) { if (G_offd_ncols) { hypreDevice_IntScalen( G_offd_I, G_offd_nrows + 1, Pi_offd_I, dim ); } dim3 bDim = hypre_GetDefaultDeviceBlockDimension(); dim3 gDim = hypre_GetDefaultDeviceGridDimension(G_offd_nnz, "thread", bDim); HYPRE_GPU_LAUNCH( hypreGPUKernel_AMSComputePi_copy1, gDim, bDim, G_offd_nnz, dim, G_offd_J, Pi_offd_J ); gDim = hypre_GetDefaultDeviceGridDimension(G_offd_nrows, "warp", bDim); HYPRE_GPU_LAUNCH( hypreGPUKernel_AMSComputePi_copy2, gDim, bDim, G_offd_nrows, dim, G_offd_I, G_offd_data, Gx_data, Gy_data, Gz_data, Pi_offd_data ); } else #endif { if (G_offd_ncols) for (i = 0; i < G_offd_nrows + 1; i++) { Pi_offd_I[i] = dim * G_offd_I[i]; } for (i = 0; i < G_offd_nnz; i++) for (d = 0; d < dim; d++) { Pi_offd_J[dim * i + d] = dim * G_offd_J[i] + d; } for (i = 0; i < G_offd_nrows; i++) for (j = G_offd_I[i]; j < G_offd_I[i + 1]; j++) { *Pi_offd_data++ = hypre_abs(G_offd_data[j]) * 0.5 * Gx_data[i]; if (dim >= 2) { *Pi_offd_data++ = hypre_abs(G_offd_data[j]) * 0.5 * Gy_data[i]; } if (dim == 3) { *Pi_offd_data++ = hypre_abs(G_offd_data[j]) * 0.5 * Gz_data[i]; } } } for (i = 0; i < G_offd_ncols; i++) for (d = 0; d < dim; d++) { Pi_cmap[dim * i + d] = (HYPRE_BigInt)dim * G_cmap[i] + (HYPRE_BigInt)d; } } } *Pi_ptr = Pi; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_AMSComputePixyz * * Construct the components Pix, Piy, Piz of the interpolation matrix Pi, * which maps the space of vector linear finite elements to the space of * edge finite elements. * * The construction is based on the fact that each component has the same * sparsity structure as G, and the entries can be computed from the vectors * Gx, Gy, Gz. *--------------------------------------------------------------------------*/ #if defined(HYPRE_USING_GPU) __global__ void hypreGPUKernel_AMSComputePixyz_copy(hypre_DeviceItem &item, HYPRE_Int nrows, HYPRE_Int dim, HYPRE_Int *i_in, HYPRE_Real *data_in, HYPRE_Real *Gx_data, HYPRE_Real *Gy_data, HYPRE_Real *Gz_data, HYPRE_Real *data_x_out, HYPRE_Real *data_y_out, HYPRE_Real *data_z_out ) { const HYPRE_Int i = hypre_gpu_get_grid_warp_id<1, 1>(item); if (i >= nrows) { return; } const HYPRE_Int lane_id = hypre_gpu_get_lane_id<1>(item); HYPRE_Int j = 0, istart, iend; HYPRE_Real t, G[3], *Gdata[3], *Odata[3]; Gdata[0] = Gx_data; Gdata[1] = Gy_data; Gdata[2] = Gz_data; Odata[0] = data_x_out; Odata[1] = data_y_out; Odata[2] = data_z_out; if (lane_id < 2) { j = read_only_load(i_in + i + lane_id); } istart = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, j, 0); iend = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, j, 1); if (lane_id < dim) { t = read_only_load(Gdata[lane_id] + i); } for (HYPRE_Int d = 0; d < dim; d++) { G[d] = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, t, d); } for (j = istart + lane_id; j < iend; j += HYPRE_WARP_SIZE) { const HYPRE_Real v = data_in ? hypre_abs(read_only_load(&data_in[j])) * 0.5 : 1.0; for (HYPRE_Int d = 0; d < dim; d++) { Odata[d][j] = v * G[d]; } } } #endif HYPRE_Int hypre_AMSComputePixyz(hypre_ParCSRMatrix *A, hypre_ParCSRMatrix *G, hypre_ParVector *Gx, hypre_ParVector *Gy, hypre_ParVector *Gz, HYPRE_Int dim, hypre_ParCSRMatrix **Pix_ptr, hypre_ParCSRMatrix **Piy_ptr, hypre_ParCSRMatrix **Piz_ptr) { HYPRE_UNUSED_VAR(A); hypre_ParCSRMatrix *Pix, *Piy = NULL, *Piz = NULL; #if defined(HYPRE_USING_GPU) HYPRE_ExecutionPolicy exec = hypre_GetExecPolicy1( hypre_ParCSRMatrixMemoryLocation(G) ); #endif /* Compute Pix, Piy, Piz */ { HYPRE_Int i, j; HYPRE_Real *Gx_data, *Gy_data, *Gz_data; MPI_Comm comm = hypre_ParCSRMatrixComm(G); HYPRE_BigInt global_num_rows = hypre_ParCSRMatrixGlobalNumRows(G); HYPRE_BigInt global_num_cols = hypre_ParCSRMatrixGlobalNumCols(G); HYPRE_BigInt *row_starts = hypre_ParCSRMatrixRowStarts(G); HYPRE_BigInt *col_starts = hypre_ParCSRMatrixColStarts(G); HYPRE_Int num_cols_offd = hypre_CSRMatrixNumCols(hypre_ParCSRMatrixOffd(G)); HYPRE_Int num_nonzeros_diag = hypre_CSRMatrixNumNonzeros(hypre_ParCSRMatrixDiag(G)); HYPRE_Int num_nonzeros_offd = hypre_CSRMatrixNumNonzeros(hypre_ParCSRMatrixOffd(G)); Pix = hypre_ParCSRMatrixCreate(comm, global_num_rows, global_num_cols, row_starts, col_starts, num_cols_offd, num_nonzeros_diag, num_nonzeros_offd); hypre_ParCSRMatrixOwnsData(Pix) = 1; hypre_ParCSRMatrixInitialize(Pix); if (dim >= 2) { Piy = hypre_ParCSRMatrixCreate(comm, global_num_rows, global_num_cols, row_starts, col_starts, num_cols_offd, num_nonzeros_diag, num_nonzeros_offd); hypre_ParCSRMatrixOwnsData(Piy) = 1; hypre_ParCSRMatrixInitialize(Piy); } if (dim == 3) { Piz = hypre_ParCSRMatrixCreate(comm, global_num_rows, global_num_cols, row_starts, col_starts, num_cols_offd, num_nonzeros_diag, num_nonzeros_offd); hypre_ParCSRMatrixOwnsData(Piz) = 1; hypre_ParCSRMatrixInitialize(Piz); } Gx_data = hypre_VectorData(hypre_ParVectorLocalVector(Gx)); if (dim >= 2) { Gy_data = hypre_VectorData(hypre_ParVectorLocalVector(Gy)); } if (dim == 3) { Gz_data = hypre_VectorData(hypre_ParVectorLocalVector(Gz)); } /* Fill-in the diagonal part */ if (dim == 3) { hypre_CSRMatrix *G_diag = hypre_ParCSRMatrixDiag(G); HYPRE_Int *G_diag_I = hypre_CSRMatrixI(G_diag); HYPRE_Int *G_diag_J = hypre_CSRMatrixJ(G_diag); HYPRE_Real *G_diag_data = hypre_CSRMatrixData(G_diag); HYPRE_Int G_diag_nrows = hypre_CSRMatrixNumRows(G_diag); HYPRE_Int G_diag_nnz = hypre_CSRMatrixNumNonzeros(G_diag); hypre_CSRMatrix *Pix_diag = hypre_ParCSRMatrixDiag(Pix); HYPRE_Int *Pix_diag_I = hypre_CSRMatrixI(Pix_diag); HYPRE_Int *Pix_diag_J = hypre_CSRMatrixJ(Pix_diag); HYPRE_Real *Pix_diag_data = hypre_CSRMatrixData(Pix_diag); hypre_CSRMatrix *Piy_diag = hypre_ParCSRMatrixDiag(Piy); HYPRE_Int *Piy_diag_I = hypre_CSRMatrixI(Piy_diag); HYPRE_Int *Piy_diag_J = hypre_CSRMatrixJ(Piy_diag); HYPRE_Real *Piy_diag_data = hypre_CSRMatrixData(Piy_diag); hypre_CSRMatrix *Piz_diag = hypre_ParCSRMatrixDiag(Piz); HYPRE_Int *Piz_diag_I = hypre_CSRMatrixI(Piz_diag); HYPRE_Int *Piz_diag_J = hypre_CSRMatrixJ(Piz_diag); HYPRE_Real *Piz_diag_data = hypre_CSRMatrixData(Piz_diag); #if defined(HYPRE_USING_GPU) if (exec == HYPRE_EXEC_DEVICE) { #if defined(HYPRE_USING_SYCL) HYPRE_ONEDPL_CALL( std::copy_n, oneapi::dpl::make_zip_iterator(G_diag_I, G_diag_I, G_diag_I), G_diag_nrows + 1, oneapi::dpl::make_zip_iterator(Pix_diag_I, Piy_diag_I, Piz_diag_I) ); HYPRE_ONEDPL_CALL( std::copy_n, oneapi::dpl::make_zip_iterator(G_diag_J, G_diag_J, G_diag_J), G_diag_nnz, oneapi::dpl::make_zip_iterator(Pix_diag_J, Piy_diag_J, Piz_diag_J) ); #else HYPRE_THRUST_CALL( copy_n, thrust::make_zip_iterator(thrust::make_tuple(G_diag_I, G_diag_I, G_diag_I)), G_diag_nrows + 1, thrust::make_zip_iterator(thrust::make_tuple(Pix_diag_I, Piy_diag_I, Piz_diag_I)) ); HYPRE_THRUST_CALL( copy_n, thrust::make_zip_iterator(thrust::make_tuple(G_diag_J, G_diag_J, G_diag_J)), G_diag_nnz, thrust::make_zip_iterator(thrust::make_tuple(Pix_diag_J, Piy_diag_J, Piz_diag_J)) ); #endif dim3 bDim = hypre_GetDefaultDeviceBlockDimension(); dim3 gDim = hypre_GetDefaultDeviceGridDimension(G_diag_nrows, "warp", bDim); HYPRE_GPU_LAUNCH( hypreGPUKernel_AMSComputePixyz_copy, gDim, bDim, G_diag_nrows, dim, G_diag_I, G_diag_data, Gx_data, Gy_data, Gz_data, Pix_diag_data, Piy_diag_data, Piz_diag_data ); } else #endif { for (i = 0; i < G_diag_nrows + 1; i++) { Pix_diag_I[i] = G_diag_I[i]; Piy_diag_I[i] = G_diag_I[i]; Piz_diag_I[i] = G_diag_I[i]; } for (i = 0; i < G_diag_nnz; i++) { Pix_diag_J[i] = G_diag_J[i]; Piy_diag_J[i] = G_diag_J[i]; Piz_diag_J[i] = G_diag_J[i]; } for (i = 0; i < G_diag_nrows; i++) { for (j = G_diag_I[i]; j < G_diag_I[i + 1]; j++) { *Pix_diag_data++ = hypre_abs(G_diag_data[j]) * 0.5 * Gx_data[i]; *Piy_diag_data++ = hypre_abs(G_diag_data[j]) * 0.5 * Gy_data[i]; *Piz_diag_data++ = hypre_abs(G_diag_data[j]) * 0.5 * Gz_data[i]; } } } } else if (dim == 2) { hypre_CSRMatrix *G_diag = hypre_ParCSRMatrixDiag(G); HYPRE_Int *G_diag_I = hypre_CSRMatrixI(G_diag); HYPRE_Int *G_diag_J = hypre_CSRMatrixJ(G_diag); HYPRE_Real *G_diag_data = hypre_CSRMatrixData(G_diag); HYPRE_Int G_diag_nrows = hypre_CSRMatrixNumRows(G_diag); HYPRE_Int G_diag_nnz = hypre_CSRMatrixNumNonzeros(G_diag); hypre_CSRMatrix *Pix_diag = hypre_ParCSRMatrixDiag(Pix); HYPRE_Int *Pix_diag_I = hypre_CSRMatrixI(Pix_diag); HYPRE_Int *Pix_diag_J = hypre_CSRMatrixJ(Pix_diag); HYPRE_Real *Pix_diag_data = hypre_CSRMatrixData(Pix_diag); hypre_CSRMatrix *Piy_diag = hypre_ParCSRMatrixDiag(Piy); HYPRE_Int *Piy_diag_I = hypre_CSRMatrixI(Piy_diag); HYPRE_Int *Piy_diag_J = hypre_CSRMatrixJ(Piy_diag); HYPRE_Real *Piy_diag_data = hypre_CSRMatrixData(Piy_diag); #if defined(HYPRE_USING_GPU) if (exec == HYPRE_EXEC_DEVICE) { #if defined(HYPRE_USING_SYCL) HYPRE_ONEDPL_CALL( std::copy_n, oneapi::dpl::make_zip_iterator(G_diag_I, G_diag_I), G_diag_nrows + 1, oneapi::dpl::make_zip_iterator(Pix_diag_I, Piy_diag_I) ); HYPRE_ONEDPL_CALL( std::copy_n, oneapi::dpl::make_zip_iterator(G_diag_J, G_diag_J), G_diag_nnz, oneapi::dpl::make_zip_iterator(Pix_diag_J, Piy_diag_J) ); #else HYPRE_THRUST_CALL( copy_n, thrust::make_zip_iterator(thrust::make_tuple(G_diag_I, G_diag_I)), G_diag_nrows + 1, thrust::make_zip_iterator(thrust::make_tuple(Pix_diag_I, Piy_diag_I)) ); HYPRE_THRUST_CALL( copy_n, thrust::make_zip_iterator(thrust::make_tuple(G_diag_J, G_diag_J)), G_diag_nnz, thrust::make_zip_iterator(thrust::make_tuple(Pix_diag_J, Piy_diag_J)) ); #endif dim3 bDim = hypre_GetDefaultDeviceBlockDimension(); dim3 gDim = hypre_GetDefaultDeviceGridDimension(G_diag_nrows, "warp", bDim); HYPRE_GPU_LAUNCH( hypreGPUKernel_AMSComputePixyz_copy, gDim, bDim, G_diag_nrows, dim, G_diag_I, G_diag_data, Gx_data, Gy_data, NULL, Pix_diag_data, Piy_diag_data, NULL ); } else #endif { for (i = 0; i < G_diag_nrows + 1; i++) { Pix_diag_I[i] = G_diag_I[i]; Piy_diag_I[i] = G_diag_I[i]; } for (i = 0; i < G_diag_nnz; i++) { Pix_diag_J[i] = G_diag_J[i]; Piy_diag_J[i] = G_diag_J[i]; } for (i = 0; i < G_diag_nrows; i++) for (j = G_diag_I[i]; j < G_diag_I[i + 1]; j++) { *Pix_diag_data++ = hypre_abs(G_diag_data[j]) * 0.5 * Gx_data[i]; *Piy_diag_data++ = hypre_abs(G_diag_data[j]) * 0.5 * Gy_data[i]; } } } else { hypre_CSRMatrix *G_diag = hypre_ParCSRMatrixDiag(G); HYPRE_Int *G_diag_I = hypre_CSRMatrixI(G_diag); HYPRE_Int *G_diag_J = hypre_CSRMatrixJ(G_diag); HYPRE_Real *G_diag_data = hypre_CSRMatrixData(G_diag); HYPRE_Int G_diag_nrows = hypre_CSRMatrixNumRows(G_diag); HYPRE_Int G_diag_nnz = hypre_CSRMatrixNumNonzeros(G_diag); hypre_CSRMatrix *Pix_diag = hypre_ParCSRMatrixDiag(Pix); HYPRE_Int *Pix_diag_I = hypre_CSRMatrixI(Pix_diag); HYPRE_Int *Pix_diag_J = hypre_CSRMatrixJ(Pix_diag); HYPRE_Real *Pix_diag_data = hypre_CSRMatrixData(Pix_diag); #if defined(HYPRE_USING_GPU) if (exec == HYPRE_EXEC_DEVICE) { #if defined(HYPRE_USING_SYCL) HYPRE_ONEDPL_CALL( std::copy_n, G_diag_I, G_diag_nrows + 1, Pix_diag_I ); HYPRE_ONEDPL_CALL( std::copy_n, G_diag_J, G_diag_nnz, Pix_diag_J ); #else HYPRE_THRUST_CALL( copy_n, G_diag_I, G_diag_nrows + 1, Pix_diag_I ); HYPRE_THRUST_CALL( copy_n, G_diag_J, G_diag_nnz, Pix_diag_J ); #endif dim3 bDim = hypre_GetDefaultDeviceBlockDimension(); dim3 gDim = hypre_GetDefaultDeviceGridDimension(G_diag_nrows, "warp", bDim); HYPRE_GPU_LAUNCH( hypreGPUKernel_AMSComputePixyz_copy, gDim, bDim, G_diag_nrows, dim, G_diag_I, G_diag_data, Gx_data, NULL, NULL, Pix_diag_data, NULL, NULL ); } else #endif { for (i = 0; i < G_diag_nrows + 1; i++) { Pix_diag_I[i] = G_diag_I[i]; } for (i = 0; i < G_diag_nnz; i++) { Pix_diag_J[i] = G_diag_J[i]; } for (i = 0; i < G_diag_nrows; i++) for (j = G_diag_I[i]; j < G_diag_I[i + 1]; j++) { *Pix_diag_data++ = hypre_abs(G_diag_data[j]) * 0.5 * Gx_data[i]; } } } /* Fill-in the off-diagonal part */ if (dim == 3) { hypre_CSRMatrix *G_offd = hypre_ParCSRMatrixOffd(G); HYPRE_Int *G_offd_I = hypre_CSRMatrixI(G_offd); HYPRE_Int *G_offd_J = hypre_CSRMatrixJ(G_offd); HYPRE_Real *G_offd_data = hypre_CSRMatrixData(G_offd); HYPRE_Int G_offd_nrows = hypre_CSRMatrixNumRows(G_offd); HYPRE_Int G_offd_ncols = hypre_CSRMatrixNumCols(G_offd); HYPRE_Int G_offd_nnz = hypre_CSRMatrixNumNonzeros(G_offd); hypre_CSRMatrix *Pix_offd = hypre_ParCSRMatrixOffd(Pix); HYPRE_Int *Pix_offd_I = hypre_CSRMatrixI(Pix_offd); HYPRE_Int *Pix_offd_J = hypre_CSRMatrixJ(Pix_offd); HYPRE_Real *Pix_offd_data = hypre_CSRMatrixData(Pix_offd); hypre_CSRMatrix *Piy_offd = hypre_ParCSRMatrixOffd(Piy); HYPRE_Int *Piy_offd_I = hypre_CSRMatrixI(Piy_offd); HYPRE_Int *Piy_offd_J = hypre_CSRMatrixJ(Piy_offd); HYPRE_Real *Piy_offd_data = hypre_CSRMatrixData(Piy_offd); hypre_CSRMatrix *Piz_offd = hypre_ParCSRMatrixOffd(Piz); HYPRE_Int *Piz_offd_I = hypre_CSRMatrixI(Piz_offd); HYPRE_Int *Piz_offd_J = hypre_CSRMatrixJ(Piz_offd); HYPRE_Real *Piz_offd_data = hypre_CSRMatrixData(Piz_offd); HYPRE_BigInt *G_cmap = hypre_ParCSRMatrixColMapOffd(G); HYPRE_BigInt *Pix_cmap = hypre_ParCSRMatrixColMapOffd(Pix); HYPRE_BigInt *Piy_cmap = hypre_ParCSRMatrixColMapOffd(Piy); HYPRE_BigInt *Piz_cmap = hypre_ParCSRMatrixColMapOffd(Piz); #if defined(HYPRE_USING_GPU) if (exec == HYPRE_EXEC_DEVICE) { #if defined(HYPRE_USING_SYCL) if (G_offd_ncols) { HYPRE_ONEDPL_CALL( std::copy_n, oneapi::dpl::make_zip_iterator(G_offd_I, G_offd_I, G_offd_I), G_offd_nrows + 1, oneapi::dpl::make_zip_iterator(Pix_offd_I, Piy_offd_I, Piz_offd_I) ); } HYPRE_ONEDPL_CALL( std::copy_n, oneapi::dpl::make_zip_iterator(G_offd_J, G_offd_J, G_offd_J), G_offd_nnz, oneapi::dpl::make_zip_iterator(Pix_offd_J, Piy_offd_J, Piz_offd_J) ); #else if (G_offd_ncols) { HYPRE_THRUST_CALL( copy_n, thrust::make_zip_iterator(thrust::make_tuple(G_offd_I, G_offd_I, G_offd_I)), G_offd_nrows + 1, thrust::make_zip_iterator(thrust::make_tuple(Pix_offd_I, Piy_offd_I, Piz_offd_I)) ); } HYPRE_THRUST_CALL( copy_n, thrust::make_zip_iterator(thrust::make_tuple(G_offd_J, G_offd_J, G_offd_J)), G_offd_nnz, thrust::make_zip_iterator(thrust::make_tuple(Pix_offd_J, Piy_offd_J, Piz_offd_J)) ); #endif dim3 bDim = hypre_GetDefaultDeviceBlockDimension(); dim3 gDim = hypre_GetDefaultDeviceGridDimension(G_offd_nrows, "warp", bDim); HYPRE_GPU_LAUNCH( hypreGPUKernel_AMSComputePixyz_copy, gDim, bDim, G_offd_nrows, dim, G_offd_I, G_offd_data, Gx_data, Gy_data, Gz_data, Pix_offd_data, Piy_offd_data, Piz_offd_data ); } else #endif { if (G_offd_ncols) for (i = 0; i < G_offd_nrows + 1; i++) { Pix_offd_I[i] = G_offd_I[i]; Piy_offd_I[i] = G_offd_I[i]; Piz_offd_I[i] = G_offd_I[i]; } for (i = 0; i < G_offd_nnz; i++) { Pix_offd_J[i] = G_offd_J[i]; Piy_offd_J[i] = G_offd_J[i]; Piz_offd_J[i] = G_offd_J[i]; } for (i = 0; i < G_offd_nrows; i++) for (j = G_offd_I[i]; j < G_offd_I[i + 1]; j++) { *Pix_offd_data++ = hypre_abs(G_offd_data[j]) * 0.5 * Gx_data[i]; *Piy_offd_data++ = hypre_abs(G_offd_data[j]) * 0.5 * Gy_data[i]; *Piz_offd_data++ = hypre_abs(G_offd_data[j]) * 0.5 * Gz_data[i]; } } for (i = 0; i < G_offd_ncols; i++) { Pix_cmap[i] = G_cmap[i]; Piy_cmap[i] = G_cmap[i]; Piz_cmap[i] = G_cmap[i]; } } else if (dim == 2) { hypre_CSRMatrix *G_offd = hypre_ParCSRMatrixOffd(G); HYPRE_Int *G_offd_I = hypre_CSRMatrixI(G_offd); HYPRE_Int *G_offd_J = hypre_CSRMatrixJ(G_offd); HYPRE_Real *G_offd_data = hypre_CSRMatrixData(G_offd); HYPRE_Int G_offd_nrows = hypre_CSRMatrixNumRows(G_offd); HYPRE_Int G_offd_ncols = hypre_CSRMatrixNumCols(G_offd); HYPRE_Int G_offd_nnz = hypre_CSRMatrixNumNonzeros(G_offd); hypre_CSRMatrix *Pix_offd = hypre_ParCSRMatrixOffd(Pix); HYPRE_Int *Pix_offd_I = hypre_CSRMatrixI(Pix_offd); HYPRE_Int *Pix_offd_J = hypre_CSRMatrixJ(Pix_offd); HYPRE_Real *Pix_offd_data = hypre_CSRMatrixData(Pix_offd); hypre_CSRMatrix *Piy_offd = hypre_ParCSRMatrixOffd(Piy); HYPRE_Int *Piy_offd_I = hypre_CSRMatrixI(Piy_offd); HYPRE_Int *Piy_offd_J = hypre_CSRMatrixJ(Piy_offd); HYPRE_Real *Piy_offd_data = hypre_CSRMatrixData(Piy_offd); HYPRE_BigInt *G_cmap = hypre_ParCSRMatrixColMapOffd(G); HYPRE_BigInt *Pix_cmap = hypre_ParCSRMatrixColMapOffd(Pix); HYPRE_BigInt *Piy_cmap = hypre_ParCSRMatrixColMapOffd(Piy); #if defined(HYPRE_USING_GPU) if (exec == HYPRE_EXEC_DEVICE) { #if defined(HYPRE_USING_SYCL) if (G_offd_ncols) { HYPRE_ONEDPL_CALL( std::copy_n, oneapi::dpl::make_zip_iterator(G_offd_I, G_offd_I), G_offd_nrows + 1, oneapi::dpl::make_zip_iterator(Pix_offd_I, Piy_offd_I) ); } HYPRE_ONEDPL_CALL( std::copy_n, oneapi::dpl::make_zip_iterator(G_offd_J, G_offd_J), G_offd_nnz, oneapi::dpl::make_zip_iterator(Pix_offd_J, Piy_offd_J) ); #else if (G_offd_ncols) { HYPRE_THRUST_CALL( copy_n, thrust::make_zip_iterator(thrust::make_tuple(G_offd_I, G_offd_I)), G_offd_nrows + 1, thrust::make_zip_iterator(thrust::make_tuple(Pix_offd_I, Piy_offd_I)) ); } HYPRE_THRUST_CALL( copy_n, thrust::make_zip_iterator(thrust::make_tuple(G_offd_J, G_offd_J)), G_offd_nnz, thrust::make_zip_iterator(thrust::make_tuple(Pix_offd_J, Piy_offd_J)) ); #endif dim3 bDim = hypre_GetDefaultDeviceBlockDimension(); dim3 gDim = hypre_GetDefaultDeviceGridDimension(G_offd_nrows, "warp", bDim); HYPRE_GPU_LAUNCH( hypreGPUKernel_AMSComputePixyz_copy, gDim, bDim, G_offd_nrows, dim, G_offd_I, G_offd_data, Gx_data, Gy_data, NULL, Pix_offd_data, Piy_offd_data, NULL ); } else #endif { if (G_offd_ncols) { for (i = 0; i < G_offd_nrows + 1; i++) { Pix_offd_I[i] = G_offd_I[i]; Piy_offd_I[i] = G_offd_I[i]; } } for (i = 0; i < G_offd_nnz; i++) { Pix_offd_J[i] = G_offd_J[i]; Piy_offd_J[i] = G_offd_J[i]; } for (i = 0; i < G_offd_nrows; i++) { for (j = G_offd_I[i]; j < G_offd_I[i + 1]; j++) { *Pix_offd_data++ = hypre_abs(G_offd_data[j]) * 0.5 * Gx_data[i]; *Piy_offd_data++ = hypre_abs(G_offd_data[j]) * 0.5 * Gy_data[i]; } } } for (i = 0; i < G_offd_ncols; i++) { Pix_cmap[i] = G_cmap[i]; Piy_cmap[i] = G_cmap[i]; } } else { hypre_CSRMatrix *G_offd = hypre_ParCSRMatrixOffd(G); HYPRE_Int *G_offd_I = hypre_CSRMatrixI(G_offd); HYPRE_Int *G_offd_J = hypre_CSRMatrixJ(G_offd); HYPRE_Real *G_offd_data = hypre_CSRMatrixData(G_offd); HYPRE_Int G_offd_nrows = hypre_CSRMatrixNumRows(G_offd); HYPRE_Int G_offd_ncols = hypre_CSRMatrixNumCols(G_offd); HYPRE_Int G_offd_nnz = hypre_CSRMatrixNumNonzeros(G_offd); hypre_CSRMatrix *Pix_offd = hypre_ParCSRMatrixOffd(Pix); HYPRE_Int *Pix_offd_I = hypre_CSRMatrixI(Pix_offd); HYPRE_Int *Pix_offd_J = hypre_CSRMatrixJ(Pix_offd); HYPRE_Real *Pix_offd_data = hypre_CSRMatrixData(Pix_offd); HYPRE_BigInt *G_cmap = hypre_ParCSRMatrixColMapOffd(G); HYPRE_BigInt *Pix_cmap = hypre_ParCSRMatrixColMapOffd(Pix); #if defined(HYPRE_USING_GPU) if (exec == HYPRE_EXEC_DEVICE) { #if defined(HYPRE_USING_SYCL) if (G_offd_ncols) { HYPRE_ONEDPL_CALL( std::copy_n, G_offd_I, G_offd_nrows + 1, Pix_offd_I ); } HYPRE_ONEDPL_CALL( std::copy_n, G_offd_J, G_offd_nnz, Pix_offd_J ); #else if (G_offd_ncols) { HYPRE_THRUST_CALL( copy_n, G_offd_I, G_offd_nrows + 1, Pix_offd_I ); } HYPRE_THRUST_CALL( copy_n, G_offd_J, G_offd_nnz, Pix_offd_J ); #endif dim3 bDim = hypre_GetDefaultDeviceBlockDimension(); dim3 gDim = hypre_GetDefaultDeviceGridDimension(G_offd_nrows, "warp", bDim); HYPRE_GPU_LAUNCH( hypreGPUKernel_AMSComputePixyz_copy, gDim, bDim, G_offd_nrows, dim, G_offd_I, G_offd_data, Gx_data, NULL, NULL, Pix_offd_data, NULL, NULL ); } else #endif { if (G_offd_ncols) for (i = 0; i < G_offd_nrows + 1; i++) { Pix_offd_I[i] = G_offd_I[i]; } for (i = 0; i < G_offd_nnz; i++) { Pix_offd_J[i] = G_offd_J[i]; } for (i = 0; i < G_offd_nrows; i++) for (j = G_offd_I[i]; j < G_offd_I[i + 1]; j++) { *Pix_offd_data++ = hypre_abs(G_offd_data[j]) * 0.5 * Gx_data[i]; } } for (i = 0; i < G_offd_ncols; i++) { Pix_cmap[i] = G_cmap[i]; } } } *Pix_ptr = Pix; if (dim >= 2) { *Piy_ptr = Piy; } if (dim == 3) { *Piz_ptr = Piz; } return hypre_error_flag; } #if defined(HYPRE_USING_GPU) __global__ void hypreGPUKernel_AMSComputeGPi_copy2(hypre_DeviceItem &item, HYPRE_Int nrows, HYPRE_Int dim, HYPRE_Int *i_in, HYPRE_Real *data_in, HYPRE_Real *Gx_data, HYPRE_Real *Gy_data, HYPRE_Real *Gz_data, HYPRE_Real *data_out) { const HYPRE_Int i = hypre_gpu_get_grid_warp_id<1, 1>(item); if (i >= nrows) { return; } const HYPRE_Int lane_id = hypre_gpu_get_lane_id<1>(item); HYPRE_Int j = 0, istart, iend; HYPRE_Real t, G[3], *Gdata[3]; Gdata[0] = Gx_data; Gdata[1] = Gy_data; Gdata[2] = Gz_data; if (lane_id < 2) { j = read_only_load(i_in + i + lane_id); } istart = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, j, 0); iend = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, j, 1); if (lane_id < dim - 1) { t = read_only_load(Gdata[lane_id] + i); } for (HYPRE_Int d = 0; d < dim - 1; d++) { G[d] = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, t, d); } for (j = istart + lane_id; j < iend; j += HYPRE_WARP_SIZE) { const HYPRE_Real u = read_only_load(&data_in[j]); const HYPRE_Real v = hypre_abs(u) * 0.5; const HYPRE_Int k = j * dim; data_out[k] = u; for (HYPRE_Int d = 0; d < dim - 1; d++) { data_out[k + d + 1] = v * G[d]; } } } #endif /*-------------------------------------------------------------------------- * hypre_AMSComputeGPi * * Construct the matrix [G,Pi] which can be considered an interpolation * matrix from S_h^4 (4 copies of the scalar linear finite element space) * to the edge finite elements space. *--------------------------------------------------------------------------*/ HYPRE_Int hypre_AMSComputeGPi(hypre_ParCSRMatrix *A, hypre_ParCSRMatrix *G, hypre_ParVector *Gx, hypre_ParVector *Gy, hypre_ParVector *Gz, HYPRE_Int dim, hypre_ParCSRMatrix **GPi_ptr) { HYPRE_UNUSED_VAR(A); hypre_ParCSRMatrix *GPi; /* Take into account G */ dim++; /* Compute GPi = [Pi_x, Pi_y, Pi_z, G] */ { HYPRE_Int i, j, d; HYPRE_Real *Gx_data, *Gy_data = NULL, *Gz_data = NULL; MPI_Comm comm = hypre_ParCSRMatrixComm(G); HYPRE_BigInt *col_starts_G = hypre_ParCSRMatrixColStarts(G); HYPRE_BigInt global_num_rows = hypre_ParCSRMatrixGlobalNumRows(G); HYPRE_BigInt global_num_cols = dim * hypre_ParCSRMatrixGlobalNumCols(G); HYPRE_BigInt *row_starts = hypre_ParCSRMatrixRowStarts(G); HYPRE_BigInt col_starts[2] = {(HYPRE_BigInt)dim * col_starts_G[0], (HYPRE_BigInt)dim * col_starts_G[1] }; HYPRE_Int num_cols_offd = dim * hypre_CSRMatrixNumCols(hypre_ParCSRMatrixOffd(G)); HYPRE_Int num_nonzeros_diag = dim * hypre_CSRMatrixNumNonzeros(hypre_ParCSRMatrixDiag(G)); HYPRE_Int num_nonzeros_offd = dim * hypre_CSRMatrixNumNonzeros(hypre_ParCSRMatrixOffd(G)); GPi = hypre_ParCSRMatrixCreate(comm, global_num_rows, global_num_cols, row_starts, col_starts, num_cols_offd, num_nonzeros_diag, num_nonzeros_offd); hypre_ParCSRMatrixOwnsData(GPi) = 1; hypre_ParCSRMatrixInitialize(GPi); Gx_data = hypre_VectorData(hypre_ParVectorLocalVector(Gx)); if (dim >= 3) { Gy_data = hypre_VectorData(hypre_ParVectorLocalVector(Gy)); } if (dim == 4) { Gz_data = hypre_VectorData(hypre_ParVectorLocalVector(Gz)); } #if defined(HYPRE_USING_GPU) HYPRE_ExecutionPolicy exec = hypre_GetExecPolicy2( hypre_ParCSRMatrixMemoryLocation(G), hypre_ParCSRMatrixMemoryLocation(GPi) ); #endif /* Fill-in the diagonal part */ { hypre_CSRMatrix *G_diag = hypre_ParCSRMatrixDiag(G); HYPRE_Int *G_diag_I = hypre_CSRMatrixI(G_diag); HYPRE_Int *G_diag_J = hypre_CSRMatrixJ(G_diag); HYPRE_Real *G_diag_data = hypre_CSRMatrixData(G_diag); HYPRE_Int G_diag_nrows = hypre_CSRMatrixNumRows(G_diag); HYPRE_Int G_diag_nnz = hypre_CSRMatrixNumNonzeros(G_diag); hypre_CSRMatrix *GPi_diag = hypre_ParCSRMatrixDiag(GPi); HYPRE_Int *GPi_diag_I = hypre_CSRMatrixI(GPi_diag); HYPRE_Int *GPi_diag_J = hypre_CSRMatrixJ(GPi_diag); HYPRE_Real *GPi_diag_data = hypre_CSRMatrixData(GPi_diag); #if defined(HYPRE_USING_GPU) if (exec == HYPRE_EXEC_DEVICE) { hypreDevice_IntScalen( G_diag_I, G_diag_nrows + 1, GPi_diag_I, dim ); dim3 bDim = hypre_GetDefaultDeviceBlockDimension(); dim3 gDim = hypre_GetDefaultDeviceGridDimension(G_diag_nnz, "thread", bDim); HYPRE_GPU_LAUNCH( hypreGPUKernel_AMSComputePi_copy1, gDim, bDim, G_diag_nnz, dim, G_diag_J, GPi_diag_J ); gDim = hypre_GetDefaultDeviceGridDimension(G_diag_nrows, "warp", bDim); HYPRE_GPU_LAUNCH( hypreGPUKernel_AMSComputeGPi_copy2, gDim, bDim, G_diag_nrows, dim, G_diag_I, G_diag_data, Gx_data, Gy_data, Gz_data, GPi_diag_data ); } else #endif { for (i = 0; i < G_diag_nrows + 1; i++) { GPi_diag_I[i] = dim * G_diag_I[i]; } for (i = 0; i < G_diag_nnz; i++) for (d = 0; d < dim; d++) { GPi_diag_J[dim * i + d] = dim * G_diag_J[i] + d; } for (i = 0; i < G_diag_nrows; i++) for (j = G_diag_I[i]; j < G_diag_I[i + 1]; j++) { *GPi_diag_data++ = G_diag_data[j]; *GPi_diag_data++ = hypre_abs(G_diag_data[j]) * 0.5 * Gx_data[i]; if (dim >= 3) { *GPi_diag_data++ = hypre_abs(G_diag_data[j]) * 0.5 * Gy_data[i]; } if (dim == 4) { *GPi_diag_data++ = hypre_abs(G_diag_data[j]) * 0.5 * Gz_data[i]; } } } } /* Fill-in the off-diagonal part */ { hypre_CSRMatrix *G_offd = hypre_ParCSRMatrixOffd(G); HYPRE_Int *G_offd_I = hypre_CSRMatrixI(G_offd); HYPRE_Int *G_offd_J = hypre_CSRMatrixJ(G_offd); HYPRE_Real *G_offd_data = hypre_CSRMatrixData(G_offd); HYPRE_Int G_offd_nrows = hypre_CSRMatrixNumRows(G_offd); HYPRE_Int G_offd_ncols = hypre_CSRMatrixNumCols(G_offd); HYPRE_Int G_offd_nnz = hypre_CSRMatrixNumNonzeros(G_offd); hypre_CSRMatrix *GPi_offd = hypre_ParCSRMatrixOffd(GPi); HYPRE_Int *GPi_offd_I = hypre_CSRMatrixI(GPi_offd); HYPRE_Int *GPi_offd_J = hypre_CSRMatrixJ(GPi_offd); HYPRE_Real *GPi_offd_data = hypre_CSRMatrixData(GPi_offd); HYPRE_BigInt *G_cmap = hypre_ParCSRMatrixColMapOffd(G); HYPRE_BigInt *GPi_cmap = hypre_ParCSRMatrixColMapOffd(GPi); #if defined(HYPRE_USING_GPU) if (exec == HYPRE_EXEC_DEVICE) { if (G_offd_ncols) { hypreDevice_IntScalen( G_offd_I, G_offd_nrows + 1, GPi_offd_I, dim ); } dim3 bDim = hypre_GetDefaultDeviceBlockDimension(); dim3 gDim = hypre_GetDefaultDeviceGridDimension(G_offd_nnz, "thread", bDim); HYPRE_GPU_LAUNCH( hypreGPUKernel_AMSComputePi_copy1, gDim, bDim, G_offd_nnz, dim, G_offd_J, GPi_offd_J ); gDim = hypre_GetDefaultDeviceGridDimension(G_offd_nrows, "warp", bDim); HYPRE_GPU_LAUNCH( hypreGPUKernel_AMSComputeGPi_copy2, gDim, bDim, G_offd_nrows, dim, G_offd_I, G_offd_data, Gx_data, Gy_data, Gz_data, GPi_offd_data ); } else #endif { if (G_offd_ncols) for (i = 0; i < G_offd_nrows + 1; i++) { GPi_offd_I[i] = dim * G_offd_I[i]; } for (i = 0; i < G_offd_nnz; i++) for (d = 0; d < dim; d++) { GPi_offd_J[dim * i + d] = dim * G_offd_J[i] + d; } for (i = 0; i < G_offd_nrows; i++) for (j = G_offd_I[i]; j < G_offd_I[i + 1]; j++) { *GPi_offd_data++ = G_offd_data[j]; *GPi_offd_data++ = hypre_abs(G_offd_data[j]) * 0.5 * Gx_data[i]; if (dim >= 3) { *GPi_offd_data++ = hypre_abs(G_offd_data[j]) * 0.5 * Gy_data[i]; } if (dim == 4) { *GPi_offd_data++ = hypre_abs(G_offd_data[j]) * 0.5 * Gz_data[i]; } } } for (i = 0; i < G_offd_ncols; i++) for (d = 0; d < dim; d++) { GPi_cmap[dim * i + d] = dim * G_cmap[i] + d; } } } *GPi_ptr = GPi; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_AMSSetup * * Construct the AMS solver components. * * The following functions need to be called before hypre_AMSSetup(): * - hypre_AMSSetDimension() (if solving a 2D problem) * - hypre_AMSSetDiscreteGradient() * - hypre_AMSSetCoordinateVectors() or hypre_AMSSetEdgeConstantVectors *--------------------------------------------------------------------------*/ #if defined(HYPRE_USING_GPU) __global__ void hypreGPUKernel_FixInterNodes( hypre_DeviceItem &item, HYPRE_Int nrows, HYPRE_Int *G0t_diag_i, HYPRE_Complex *G0t_diag_data, HYPRE_Int *G0t_offd_i, HYPRE_Complex *G0t_offd_data, HYPRE_Real *interior_nodes_data) { HYPRE_Int row_i = hypre_gpu_get_grid_warp_id<1, 1>(item); if (row_i >= nrows) { return; } HYPRE_Int lane = hypre_gpu_get_lane_id<1>(item); HYPRE_Int not1 = 0; if (lane == 0) { not1 = read_only_load(&interior_nodes_data[row_i]) != 1.0; } not1 = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, not1, 0); if (!not1) { return; } HYPRE_Int p1 = 0, q1, p2 = 0, q2 = 0; bool nonempty_offd = G0t_offd_data != NULL; if (lane < 2) { p1 = read_only_load(G0t_diag_i + row_i + lane); if (nonempty_offd) { p2 = read_only_load(G0t_offd_i + row_i + lane); } } q1 = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, p1, 1); p1 = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, p1, 0); if (nonempty_offd) { q2 = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, p2, 1); p2 = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, p2, 0); } for (HYPRE_Int j = p1 + lane; j < q1; j += HYPRE_WARP_SIZE) { G0t_diag_data[j] = 0.0; } for (HYPRE_Int j = p2 + lane; j < q2; j += HYPRE_WARP_SIZE) { G0t_offd_data[j] = 0.0; } } __global__ void hypreGPUKernel_AMSSetupScaleGGt( hypre_DeviceItem &item, HYPRE_Int Gt_num_rows, HYPRE_Int *Gt_diag_i, HYPRE_Int *Gt_diag_j, HYPRE_Real *Gt_diag_data, HYPRE_Int *Gt_offd_i, HYPRE_Real *Gt_offd_data, HYPRE_Real *Gx_data, HYPRE_Real *Gy_data, HYPRE_Real *Gz_data ) { HYPRE_Int row_i = hypre_gpu_get_grid_warp_id<1, 1>(item); if (row_i >= Gt_num_rows) { return; } HYPRE_Int lane = hypre_gpu_get_lane_id<1>(item); HYPRE_Real h2 = 0.0; HYPRE_Int ne, p1 = 0, q1, p2 = 0, q2 = 0; if (lane < 2) { p1 = read_only_load(Gt_diag_i + row_i + lane); } q1 = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, p1, 1); p1 = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, p1, 0); ne = q1 - p1; if (ne == 0) { return; } if (Gt_offd_data != NULL) { if (lane < 2) { p2 = read_only_load(Gt_offd_i + row_i + lane); } q2 = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, p2, 1); p2 = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, p2, 0); } for (HYPRE_Int j = p1 + lane; j < q1; j += HYPRE_WARP_SIZE) { const HYPRE_Int k = read_only_load(&Gt_diag_j[j]); const HYPRE_Real Gx = read_only_load(&Gx_data[k]); const HYPRE_Real Gy = read_only_load(&Gy_data[k]); const HYPRE_Real Gz = read_only_load(&Gz_data[k]); h2 += Gx * Gx + Gy * Gy + Gz * Gz; } h2 = warp_allreduce_sum(item, h2) / ne; for (HYPRE_Int j = p1 + lane; j < q1; j += HYPRE_WARP_SIZE) { Gt_diag_data[j] *= h2; } for (HYPRE_Int j = p2 + lane; j < q2; j += HYPRE_WARP_SIZE) { Gt_offd_data[j] *= h2; } } #endif HYPRE_Int hypre_AMSSetup(void *solver, hypre_ParCSRMatrix *A, hypre_ParVector *b, hypre_ParVector *x) { HYPRE_UNUSED_VAR(b); HYPRE_UNUSED_VAR(x); #if defined(HYPRE_USING_GPU) HYPRE_ExecutionPolicy exec = hypre_GetExecPolicy1( hypre_ParCSRMatrixMemoryLocation(A) ); #endif hypre_AMSData *ams_data = (hypre_AMSData *) solver; HYPRE_Int input_info = 0; ams_data -> A = A; /* Modifications for problems with zero-conductivity regions */ if (ams_data -> interior_nodes) { hypre_ParCSRMatrix *G0t, *Aorig = A; /* Make sure that multiple Setup()+Solve() give identical results */ ams_data -> solve_counter = 0; /* Construct the discrete gradient matrix for the zero-conductivity region by eliminating the zero-conductivity nodes from G^t. The range of G0 represents the kernel of A, i.e. the gradients of nodal basis functions supported in zero-conductivity regions. */ hypre_ParCSRMatrixTranspose(ams_data -> G, &G0t, 1); { HYPRE_Int i, j; HYPRE_Int nv = hypre_ParCSRMatrixNumCols(ams_data -> G); hypre_CSRMatrix *G0td = hypre_ParCSRMatrixDiag(G0t); HYPRE_Int *G0tdI = hypre_CSRMatrixI(G0td); HYPRE_Real *G0tdA = hypre_CSRMatrixData(G0td); hypre_CSRMatrix *G0to = hypre_ParCSRMatrixOffd(G0t); HYPRE_Int *G0toI = hypre_CSRMatrixI(G0to); HYPRE_Real *G0toA = hypre_CSRMatrixData(G0to); HYPRE_Real *interior_nodes_data = hypre_VectorData( hypre_ParVectorLocalVector((hypre_ParVector*) ams_data -> interior_nodes)); #if defined(HYPRE_USING_GPU) if (exec == HYPRE_EXEC_DEVICE) { dim3 bDim = hypre_GetDefaultDeviceBlockDimension(); dim3 gDim = hypre_GetDefaultDeviceGridDimension(nv, "warp", bDim); HYPRE_GPU_LAUNCH( hypreGPUKernel_FixInterNodes, gDim, bDim, nv, G0tdI, G0tdA, G0toI, G0toA, interior_nodes_data ); } else #endif { for (i = 0; i < nv; i++) { if (interior_nodes_data[i] != 1) { for (j = G0tdI[i]; j < G0tdI[i + 1]; j++) { G0tdA[j] = 0.0; } if (G0toI) for (j = G0toI[i]; j < G0toI[i + 1]; j++) { G0toA[j] = 0.0; } } } } } hypre_ParCSRMatrixTranspose(G0t, & ams_data -> G0, 1); /* Construct the subspace matrix A_G0 = G0^T G0 */ #if defined(HYPRE_USING_GPU) if (exec == HYPRE_EXEC_DEVICE) { ams_data -> A_G0 = hypre_ParCSRMatMat(G0t, ams_data -> G0); } else #endif { ams_data -> A_G0 = hypre_ParMatmul(G0t, ams_data -> G0); } hypre_ParCSRMatrixFixZeroRows(ams_data -> A_G0); /* Create AMG solver for A_G0 */ HYPRE_BoomerAMGCreate(&ams_data -> B_G0); HYPRE_BoomerAMGSetCoarsenType(ams_data -> B_G0, ams_data -> B_G_coarsen_type); HYPRE_BoomerAMGSetAggNumLevels(ams_data -> B_G0, ams_data -> B_G_agg_levels); HYPRE_BoomerAMGSetRelaxType(ams_data -> B_G0, ams_data -> B_G_relax_type); HYPRE_BoomerAMGSetNumSweeps(ams_data -> B_G0, 1); HYPRE_BoomerAMGSetMaxLevels(ams_data -> B_G0, 25); HYPRE_BoomerAMGSetTol(ams_data -> B_G0, 0.0); HYPRE_BoomerAMGSetMaxIter(ams_data -> B_G0, 3); /* use just a few V-cycles */ HYPRE_BoomerAMGSetStrongThreshold(ams_data -> B_G0, ams_data -> B_G_theta); HYPRE_BoomerAMGSetInterpType(ams_data -> B_G0, ams_data -> B_G_interp_type); HYPRE_BoomerAMGSetPMaxElmts(ams_data -> B_G0, ams_data -> B_G_Pmax); HYPRE_BoomerAMGSetMinCoarseSize(ams_data -> B_G0, 2); /* don't coarsen to 0 */ /* Generally, don't use exact solve on the coarsest level (matrix may be singular) */ HYPRE_BoomerAMGSetCycleRelaxType(ams_data -> B_G0, ams_data -> B_G_coarse_relax_type, 3); HYPRE_BoomerAMGSetup(ams_data -> B_G0, (HYPRE_ParCSRMatrix)ams_data -> A_G0, 0, 0); /* Construct the preconditioner for ams_data->A = A + G0 G0^T. NOTE: this can be optimized significantly by taking into account that the sparsity pattern of A is subset of the sparsity pattern of G0 G0^T */ { #if defined(HYPRE_USING_GPU) hypre_ParCSRMatrix *A; if (exec == HYPRE_EXEC_DEVICE) { A = hypre_ParCSRMatMat(ams_data -> G0, G0t); } else #endif { A = hypre_ParMatmul(ams_data -> G0, G0t); } hypre_ParCSRMatrix *B = Aorig; hypre_ParCSRMatrix **C_ptr = &ams_data -> A; hypre_ParCSRMatrix *C; HYPRE_Real factor, lfactor; /* scale (penalize) G0 G0^T before adding it to the matrix */ { HYPRE_Int i; HYPRE_Int B_num_rows = hypre_CSRMatrixNumRows(hypre_ParCSRMatrixDiag(B)); HYPRE_Real *B_diag_data = hypre_CSRMatrixData(hypre_ParCSRMatrixDiag(B)); HYPRE_Real *B_offd_data = hypre_CSRMatrixData(hypre_ParCSRMatrixOffd(B)); HYPRE_Int *B_diag_i = hypre_CSRMatrixI(hypre_ParCSRMatrixDiag(B)); HYPRE_Int *B_offd_i = hypre_CSRMatrixI(hypre_ParCSRMatrixOffd(B)); lfactor = -1; #if defined(HYPRE_USING_GPU) if (exec == HYPRE_EXEC_DEVICE) { HYPRE_Int nnz_diag = hypre_CSRMatrixNumNonzeros(hypre_ParCSRMatrixDiag(B)); HYPRE_Int nnz_offd = hypre_CSRMatrixNumNonzeros(hypre_ParCSRMatrixOffd(B)); #if defined(HYPRE_DEBUG) HYPRE_Int nnz; hypre_TMemcpy(&nnz, &B_diag_i[B_num_rows], HYPRE_Int, 1, HYPRE_MEMORY_HOST, HYPRE_MEMORY_DEVICE); hypre_assert(nnz == nnz_diag); hypre_TMemcpy(&nnz, &B_offd_i[B_num_rows], HYPRE_Int, 1, HYPRE_MEMORY_HOST, HYPRE_MEMORY_DEVICE); hypre_assert(nnz == nnz_offd); #endif #if defined(HYPRE_USING_SYCL) if (nnz_diag) { lfactor = HYPRE_ONEDPL_CALL( std::reduce, oneapi::dpl::make_transform_iterator(B_diag_data, absolute_value()), oneapi::dpl::make_transform_iterator(B_diag_data + nnz_diag, absolute_value()), -1.0, sycl::maximum() ); } if (nnz_offd) { lfactor = HYPRE_ONEDPL_CALL( std::reduce, oneapi::dpl::make_transform_iterator(B_offd_data, absolute_value()), oneapi::dpl::make_transform_iterator(B_offd_data + nnz_offd, absolute_value()), lfactor, sycl::maximum() ); } #else if (nnz_diag) { lfactor = HYPRE_THRUST_CALL( reduce, thrust::make_transform_iterator(B_diag_data, absolute_value()), thrust::make_transform_iterator(B_diag_data + nnz_diag, absolute_value()), -1.0, thrust::maximum() ); } if (nnz_offd) { lfactor = HYPRE_THRUST_CALL( reduce, thrust::make_transform_iterator(B_offd_data, absolute_value()), thrust::make_transform_iterator(B_offd_data + nnz_offd, absolute_value()), lfactor, thrust::maximum() ); } #endif } else #endif { for (i = 0; i < B_diag_i[B_num_rows]; i++) if (hypre_abs(B_diag_data[i]) > lfactor) { lfactor = hypre_abs(B_diag_data[i]); } for (i = 0; i < B_offd_i[B_num_rows]; i++) if (hypre_abs(B_offd_data[i]) > lfactor) { lfactor = hypre_abs(B_offd_data[i]); } } lfactor *= 1e-10; /* scaling factor: max|A_ij|*1e-10 */ hypre_MPI_Allreduce(&lfactor, &factor, 1, HYPRE_MPI_REAL, hypre_MPI_MAX, hypre_ParCSRMatrixComm(A)); } hypre_ParCSRMatrixAdd(factor, A, 1.0, B, &C); /*hypre_CSRMatrix *A_local, *B_local, *C_local, *C_tmp; MPI_Comm comm = hypre_ParCSRMatrixComm(A); HYPRE_BigInt global_num_rows = hypre_ParCSRMatrixGlobalNumRows(A); HYPRE_BigInt global_num_cols = hypre_ParCSRMatrixGlobalNumCols(A); HYPRE_BigInt *row_starts = hypre_ParCSRMatrixRowStarts(A); HYPRE_BigInt *col_starts = hypre_ParCSRMatrixColStarts(A); HYPRE_Int A_num_cols_offd = hypre_CSRMatrixNumCols(hypre_ParCSRMatrixOffd(A)); HYPRE_Int A_num_nonzeros_diag = hypre_CSRMatrixNumNonzeros(hypre_ParCSRMatrixDiag(A)); HYPRE_Int A_num_nonzeros_offd = hypre_CSRMatrixNumNonzeros(hypre_ParCSRMatrixOffd(A)); HYPRE_Int B_num_cols_offd = hypre_CSRMatrixNumCols(hypre_ParCSRMatrixOffd(B)); HYPRE_Int B_num_nonzeros_diag = hypre_CSRMatrixNumNonzeros(hypre_ParCSRMatrixDiag(B)); HYPRE_Int B_num_nonzeros_offd = hypre_CSRMatrixNumNonzeros(hypre_ParCSRMatrixOffd(B)); A_local = hypre_MergeDiagAndOffd(A); B_local = hypre_MergeDiagAndOffd(B);*/ /* scale (penalize) G0 G0^T before adding it to the matrix */ /*{ HYPRE_Int i, nnz = hypre_CSRMatrixNumNonzeros(A_local); HYPRE_Real *data = hypre_CSRMatrixData(A_local); HYPRE_Real *dataB = hypre_CSRMatrixData(B_local); HYPRE_Int nnzB = hypre_CSRMatrixNumNonzeros(B_local); HYPRE_Real factor, lfactor; lfactor = -1; for (i = 0; i < nnzB; i++) if (hypre_abs(dataB[i]) > lfactor) lfactor = hypre_abs(dataB[i]); lfactor *= 1e-10; hypre_MPI_Allreduce(&lfactor, &factor, 1, HYPRE_MPI_REAL, hypre_MPI_MAX, hypre_ParCSRMatrixComm(A)); for (i = 0; i < nnz; i++) data[i] *= factor; } C_tmp = hypre_CSRMatrixBigAdd(A_local, B_local); C_local = hypre_CSRMatrixBigDeleteZeros(C_tmp,0.0); if (C_local) hypre_CSRMatrixDestroy(C_tmp); else C_local = C_tmp; C = hypre_ParCSRMatrixCreate (comm, global_num_rows, global_num_cols, row_starts, col_starts, A_num_cols_offd + B_num_cols_offd, A_num_nonzeros_diag + B_num_nonzeros_diag, A_num_nonzeros_offd + B_num_nonzeros_offd); GenerateDiagAndOffd(C_local, C, hypre_ParCSRMatrixFirstColDiag(A), hypre_ParCSRMatrixLastColDiag(A)); hypre_CSRMatrixDestroy(A_local); hypre_CSRMatrixDestroy(B_local); hypre_CSRMatrixDestroy(C_local); */ hypre_ParCSRMatrixDestroy(A); *C_ptr = C; } hypre_ParCSRMatrixDestroy(G0t); } /* Make sure that the first entry in each row is the diagonal one. */ /* hypre_CSRMatrixReorder(hypre_ParCSRMatrixDiag(ams_data -> A)); */ /* Compute the l1 norm of the rows of A */ if (ams_data -> A_relax_type >= 1 && ams_data -> A_relax_type <= 4) { HYPRE_Real *l1_norm_data = NULL; hypre_ParCSRComputeL1Norms(ams_data -> A, ams_data -> A_relax_type, NULL, &l1_norm_data); ams_data -> A_l1_norms = hypre_SeqVectorCreate(hypre_ParCSRMatrixNumRows(ams_data -> A)); hypre_VectorData(ams_data -> A_l1_norms) = l1_norm_data; hypre_SeqVectorInitialize_v2(ams_data -> A_l1_norms, hypre_ParCSRMatrixMemoryLocation(ams_data -> A)); } /* Chebyshev? */ if (ams_data -> A_relax_type == 16) { hypre_ParCSRMaxEigEstimateCG(ams_data->A, 1, 10, &ams_data->A_max_eig_est, &ams_data->A_min_eig_est); } /* If not given, compute Gx, Gy and Gz */ { if (ams_data -> x != NULL && (ams_data -> dim == 1 || ams_data -> y != NULL) && (ams_data -> dim <= 2 || ams_data -> z != NULL)) { input_info = 1; } if (ams_data -> Gx != NULL && (ams_data -> dim == 1 || ams_data -> Gy != NULL) && (ams_data -> dim <= 2 || ams_data -> Gz != NULL)) { input_info = 2; } if (input_info == 1) { ams_data -> Gx = hypre_ParVectorInRangeOf(ams_data -> G); hypre_ParCSRMatrixMatvec (1.0, ams_data -> G, ams_data -> x, 0.0, ams_data -> Gx); if (ams_data -> dim >= 2) { ams_data -> Gy = hypre_ParVectorInRangeOf(ams_data -> G); hypre_ParCSRMatrixMatvec (1.0, ams_data -> G, ams_data -> y, 0.0, ams_data -> Gy); } if (ams_data -> dim == 3) { ams_data -> Gz = hypre_ParVectorInRangeOf(ams_data -> G); hypre_ParCSRMatrixMatvec (1.0, ams_data -> G, ams_data -> z, 0.0, ams_data -> Gz); } } } if (ams_data -> Pi == NULL && ams_data -> Pix == NULL) { if (ams_data -> cycle_type == 20) /* Construct the combined interpolation matrix [G,Pi] */ hypre_AMSComputeGPi(ams_data -> A, ams_data -> G, ams_data -> Gx, ams_data -> Gy, ams_data -> Gz, ams_data -> dim, &ams_data -> Pi); else if (ams_data -> cycle_type > 10) /* Construct Pi{x,y,z} instead of Pi = [Pix,Piy,Piz] */ hypre_AMSComputePixyz(ams_data -> A, ams_data -> G, ams_data -> Gx, ams_data -> Gy, ams_data -> Gz, ams_data -> dim, &ams_data -> Pix, &ams_data -> Piy, &ams_data -> Piz); else /* Construct the Pi interpolation matrix */ hypre_AMSComputePi(ams_data -> A, ams_data -> G, ams_data -> Gx, ams_data -> Gy, ams_data -> Gz, ams_data -> dim, &ams_data -> Pi); } /* Keep Gx, Gy and Gz only if use the method with discrete divergence stabilization (where we use them to compute the local mesh size). */ if (input_info == 1 && ams_data -> cycle_type != 9) { hypre_ParVectorDestroy(ams_data -> Gx); if (ams_data -> dim >= 2) { hypre_ParVectorDestroy(ams_data -> Gy); } if (ams_data -> dim == 3) { hypre_ParVectorDestroy(ams_data -> Gz); } } /* Create the AMG solver on the range of G^T */ if (!ams_data -> beta_is_zero && ams_data -> cycle_type != 20) { HYPRE_BoomerAMGCreate(&ams_data -> B_G); HYPRE_BoomerAMGSetCoarsenType(ams_data -> B_G, ams_data -> B_G_coarsen_type); HYPRE_BoomerAMGSetAggNumLevels(ams_data -> B_G, ams_data -> B_G_agg_levels); HYPRE_BoomerAMGSetRelaxType(ams_data -> B_G, ams_data -> B_G_relax_type); HYPRE_BoomerAMGSetNumSweeps(ams_data -> B_G, 1); HYPRE_BoomerAMGSetMaxLevels(ams_data -> B_G, 25); HYPRE_BoomerAMGSetTol(ams_data -> B_G, 0.0); HYPRE_BoomerAMGSetMaxIter(ams_data -> B_G, 1); HYPRE_BoomerAMGSetStrongThreshold(ams_data -> B_G, ams_data -> B_G_theta); HYPRE_BoomerAMGSetInterpType(ams_data -> B_G, ams_data -> B_G_interp_type); HYPRE_BoomerAMGSetPMaxElmts(ams_data -> B_G, ams_data -> B_G_Pmax); HYPRE_BoomerAMGSetMinCoarseSize(ams_data -> B_G, 2); /* don't coarsen to 0 */ /* Generally, don't use exact solve on the coarsest level (matrix may be singular) */ HYPRE_BoomerAMGSetCycleRelaxType(ams_data -> B_G, ams_data -> B_G_coarse_relax_type, 3); if (ams_data -> cycle_type == 0) { HYPRE_BoomerAMGSetMaxLevels(ams_data -> B_G, 2); } /* If not given, construct the coarse space matrix by RAP */ if (!ams_data -> A_G) { if (!hypre_ParCSRMatrixCommPkg(ams_data -> G)) { hypre_MatvecCommPkgCreate(ams_data -> G); } if (!hypre_ParCSRMatrixCommPkg(ams_data -> A)) { hypre_MatvecCommPkgCreate(ams_data -> A); } #if defined(HYPRE_USING_GPU) if (exec == HYPRE_EXEC_DEVICE) { ams_data -> A_G = hypre_ParCSRMatrixRAPKT(ams_data -> G, ams_data -> A, ams_data -> G, 1); } else #endif { hypre_BoomerAMGBuildCoarseOperator(ams_data -> G, ams_data -> A, ams_data -> G, &ams_data -> A_G); } /* Make sure that A_G has no zero rows (this can happen if beta is zero in part of the domain). */ hypre_ParCSRMatrixFixZeroRows(ams_data -> A_G); ams_data -> owns_A_G = 1; } HYPRE_BoomerAMGSetup(ams_data -> B_G, (HYPRE_ParCSRMatrix)ams_data -> A_G, NULL, NULL); } if (ams_data -> cycle_type > 10 && ams_data -> cycle_type != 20) /* Create the AMG solvers on the range of Pi{x,y,z}^T */ { HYPRE_BoomerAMGCreate(&ams_data -> B_Pix); HYPRE_BoomerAMGSetCoarsenType(ams_data -> B_Pix, ams_data -> B_Pi_coarsen_type); HYPRE_BoomerAMGSetAggNumLevels(ams_data -> B_Pix, ams_data -> B_Pi_agg_levels); HYPRE_BoomerAMGSetRelaxType(ams_data -> B_Pix, ams_data -> B_Pi_relax_type); HYPRE_BoomerAMGSetNumSweeps(ams_data -> B_Pix, 1); HYPRE_BoomerAMGSetMaxLevels(ams_data -> B_Pix, 25); HYPRE_BoomerAMGSetTol(ams_data -> B_Pix, 0.0); HYPRE_BoomerAMGSetMaxIter(ams_data -> B_Pix, 1); HYPRE_BoomerAMGSetStrongThreshold(ams_data -> B_Pix, ams_data -> B_Pi_theta); HYPRE_BoomerAMGSetInterpType(ams_data -> B_Pix, ams_data -> B_Pi_interp_type); HYPRE_BoomerAMGSetPMaxElmts(ams_data -> B_Pix, ams_data -> B_Pi_Pmax); HYPRE_BoomerAMGSetMinCoarseSize(ams_data -> B_Pix, 2); HYPRE_BoomerAMGCreate(&ams_data -> B_Piy); HYPRE_BoomerAMGSetCoarsenType(ams_data -> B_Piy, ams_data -> B_Pi_coarsen_type); HYPRE_BoomerAMGSetAggNumLevels(ams_data -> B_Piy, ams_data -> B_Pi_agg_levels); HYPRE_BoomerAMGSetRelaxType(ams_data -> B_Piy, ams_data -> B_Pi_relax_type); HYPRE_BoomerAMGSetNumSweeps(ams_data -> B_Piy, 1); HYPRE_BoomerAMGSetMaxLevels(ams_data -> B_Piy, 25); HYPRE_BoomerAMGSetTol(ams_data -> B_Piy, 0.0); HYPRE_BoomerAMGSetMaxIter(ams_data -> B_Piy, 1); HYPRE_BoomerAMGSetStrongThreshold(ams_data -> B_Piy, ams_data -> B_Pi_theta); HYPRE_BoomerAMGSetInterpType(ams_data -> B_Piy, ams_data -> B_Pi_interp_type); HYPRE_BoomerAMGSetPMaxElmts(ams_data -> B_Piy, ams_data -> B_Pi_Pmax); HYPRE_BoomerAMGSetMinCoarseSize(ams_data -> B_Piy, 2); HYPRE_BoomerAMGCreate(&ams_data -> B_Piz); HYPRE_BoomerAMGSetCoarsenType(ams_data -> B_Piz, ams_data -> B_Pi_coarsen_type); HYPRE_BoomerAMGSetAggNumLevels(ams_data -> B_Piz, ams_data -> B_Pi_agg_levels); HYPRE_BoomerAMGSetRelaxType(ams_data -> B_Piz, ams_data -> B_Pi_relax_type); HYPRE_BoomerAMGSetNumSweeps(ams_data -> B_Piz, 1); HYPRE_BoomerAMGSetMaxLevels(ams_data -> B_Piz, 25); HYPRE_BoomerAMGSetTol(ams_data -> B_Piz, 0.0); HYPRE_BoomerAMGSetMaxIter(ams_data -> B_Piz, 1); HYPRE_BoomerAMGSetStrongThreshold(ams_data -> B_Piz, ams_data -> B_Pi_theta); HYPRE_BoomerAMGSetInterpType(ams_data -> B_Piz, ams_data -> B_Pi_interp_type); HYPRE_BoomerAMGSetPMaxElmts(ams_data -> B_Piz, ams_data -> B_Pi_Pmax); HYPRE_BoomerAMGSetMinCoarseSize(ams_data -> B_Piz, 2); /* Generally, don't use exact solve on the coarsest level (matrices may be singular) */ HYPRE_BoomerAMGSetCycleRelaxType(ams_data -> B_Pix, ams_data -> B_Pi_coarse_relax_type, 3); HYPRE_BoomerAMGSetCycleRelaxType(ams_data -> B_Piy, ams_data -> B_Pi_coarse_relax_type, 3); HYPRE_BoomerAMGSetCycleRelaxType(ams_data -> B_Piz, ams_data -> B_Pi_coarse_relax_type, 3); if (ams_data -> cycle_type == 0) { HYPRE_BoomerAMGSetMaxLevels(ams_data -> B_Pix, 2); HYPRE_BoomerAMGSetMaxLevels(ams_data -> B_Piy, 2); HYPRE_BoomerAMGSetMaxLevels(ams_data -> B_Piz, 2); } /* Construct the coarse space matrices by RAP */ if (!hypre_ParCSRMatrixCommPkg(ams_data -> Pix)) { hypre_MatvecCommPkgCreate(ams_data -> Pix); } #if defined(HYPRE_USING_GPU) if (exec == HYPRE_EXEC_DEVICE) { ams_data -> A_Pix = hypre_ParCSRMatrixRAPKT(ams_data -> Pix, ams_data -> A, ams_data -> Pix, 1); } else #endif { hypre_BoomerAMGBuildCoarseOperator(ams_data -> Pix, ams_data -> A, ams_data -> Pix, &ams_data -> A_Pix); } /* Make sure that A_Pix has no zero rows (this can happen for some kinds of boundary conditions with contact). */ hypre_ParCSRMatrixFixZeroRows(ams_data -> A_Pix); HYPRE_BoomerAMGSetup(ams_data -> B_Pix, (HYPRE_ParCSRMatrix)ams_data -> A_Pix, NULL, NULL); if (ams_data -> Piy) { if (!hypre_ParCSRMatrixCommPkg(ams_data -> Piy)) { hypre_MatvecCommPkgCreate(ams_data -> Piy); } #if defined(HYPRE_USING_GPU) if (exec == HYPRE_EXEC_DEVICE) { ams_data -> A_Piy = hypre_ParCSRMatrixRAPKT(ams_data -> Piy, ams_data -> A, ams_data -> Piy, 1); } else #endif { hypre_BoomerAMGBuildCoarseOperator(ams_data -> Piy, ams_data -> A, ams_data -> Piy, &ams_data -> A_Piy); } /* Make sure that A_Piy has no zero rows (this can happen for some kinds of boundary conditions with contact). */ hypre_ParCSRMatrixFixZeroRows(ams_data -> A_Piy); HYPRE_BoomerAMGSetup(ams_data -> B_Piy, (HYPRE_ParCSRMatrix)ams_data -> A_Piy, NULL, NULL); } if (ams_data -> Piz) { if (!hypre_ParCSRMatrixCommPkg(ams_data -> Piz)) { hypre_MatvecCommPkgCreate(ams_data -> Piz); } #if defined(HYPRE_USING_GPU) if (exec == HYPRE_EXEC_DEVICE) { ams_data -> A_Piz = hypre_ParCSRMatrixRAPKT(ams_data -> Piz, ams_data -> A, ams_data -> Piz, 1); } else #endif { hypre_BoomerAMGBuildCoarseOperator(ams_data -> Piz, ams_data -> A, ams_data -> Piz, &ams_data -> A_Piz); } /* Make sure that A_Piz has no zero rows (this can happen for some kinds of boundary conditions with contact). */ hypre_ParCSRMatrixFixZeroRows(ams_data -> A_Piz); HYPRE_BoomerAMGSetup(ams_data -> B_Piz, (HYPRE_ParCSRMatrix)ams_data -> A_Piz, NULL, NULL); } } else /* Create the AMG solver on the range of Pi^T */ { HYPRE_BoomerAMGCreate(&ams_data -> B_Pi); HYPRE_BoomerAMGSetCoarsenType(ams_data -> B_Pi, ams_data -> B_Pi_coarsen_type); HYPRE_BoomerAMGSetAggNumLevels(ams_data -> B_Pi, ams_data -> B_Pi_agg_levels); HYPRE_BoomerAMGSetRelaxType(ams_data -> B_Pi, ams_data -> B_Pi_relax_type); HYPRE_BoomerAMGSetNumSweeps(ams_data -> B_Pi, 1); HYPRE_BoomerAMGSetMaxLevels(ams_data -> B_Pi, 25); HYPRE_BoomerAMGSetTol(ams_data -> B_Pi, 0.0); HYPRE_BoomerAMGSetMaxIter(ams_data -> B_Pi, 1); HYPRE_BoomerAMGSetStrongThreshold(ams_data -> B_Pi, ams_data -> B_Pi_theta); HYPRE_BoomerAMGSetInterpType(ams_data -> B_Pi, ams_data -> B_Pi_interp_type); HYPRE_BoomerAMGSetPMaxElmts(ams_data -> B_Pi, ams_data -> B_Pi_Pmax); HYPRE_BoomerAMGSetMinCoarseSize(ams_data -> B_Pi, 2); /* don't coarsen to 0 */ /* Generally, don't use exact solve on the coarsest level (matrix may be singular) */ HYPRE_BoomerAMGSetCycleRelaxType(ams_data -> B_Pi, ams_data -> B_Pi_coarse_relax_type, 3); if (ams_data -> cycle_type == 0) { HYPRE_BoomerAMGSetMaxLevels(ams_data -> B_Pi, 2); } /* If not given, construct the coarse space matrix by RAP and notify BoomerAMG that this is a dim x dim block system. */ if (!ams_data -> A_Pi) { if (!hypre_ParCSRMatrixCommPkg(ams_data -> Pi)) { hypre_MatvecCommPkgCreate(ams_data -> Pi); } if (!hypre_ParCSRMatrixCommPkg(ams_data -> A)) { hypre_MatvecCommPkgCreate(ams_data -> A); } if (ams_data -> cycle_type == 9) { /* Add a discrete divergence term to A before computing Pi^t A Pi */ { hypre_ParCSRMatrix *Gt, *GGt = NULL, *ApGGt; hypre_ParCSRMatrixTranspose(ams_data -> G, &Gt, 1); /* scale GGt by h^2 */ { HYPRE_Real h2; HYPRE_Int i, j, k, ne; hypre_CSRMatrix *Gt_diag = hypre_ParCSRMatrixDiag(Gt); HYPRE_Int Gt_num_rows = hypre_CSRMatrixNumRows(Gt_diag); HYPRE_Int *Gt_diag_I = hypre_CSRMatrixI(Gt_diag); HYPRE_Int *Gt_diag_J = hypre_CSRMatrixJ(Gt_diag); HYPRE_Real *Gt_diag_data = hypre_CSRMatrixData(Gt_diag); hypre_CSRMatrix *Gt_offd = hypre_ParCSRMatrixOffd(Gt); HYPRE_Int *Gt_offd_I = hypre_CSRMatrixI(Gt_offd); HYPRE_Real *Gt_offd_data = hypre_CSRMatrixData(Gt_offd); HYPRE_Real *Gx_data = hypre_VectorData(hypre_ParVectorLocalVector(ams_data -> Gx)); HYPRE_Real *Gy_data = hypre_VectorData(hypre_ParVectorLocalVector(ams_data -> Gy)); HYPRE_Real *Gz_data = hypre_VectorData(hypre_ParVectorLocalVector(ams_data -> Gz)); #if defined(HYPRE_USING_GPU) if (exec == HYPRE_EXEC_DEVICE) { dim3 bDim = hypre_GetDefaultDeviceBlockDimension(); dim3 gDim = hypre_GetDefaultDeviceGridDimension(Gt_num_rows, "warp", bDim); HYPRE_GPU_LAUNCH( hypreGPUKernel_AMSSetupScaleGGt, gDim, bDim, Gt_num_rows, Gt_diag_I, Gt_diag_J, Gt_diag_data, Gt_offd_I, Gt_offd_data, Gx_data, Gy_data, Gz_data ); } else #endif { for (i = 0; i < Gt_num_rows; i++) { /* determine the characteristic mesh size for vertex i */ h2 = 0.0; ne = 0; for (j = Gt_diag_I[i]; j < Gt_diag_I[i + 1]; j++) { k = Gt_diag_J[j]; h2 += Gx_data[k] * Gx_data[k] + Gy_data[k] * Gy_data[k] + Gz_data[k] * Gz_data[k]; ne++; } if (ne != 0) { h2 /= ne; for (j = Gt_diag_I[i]; j < Gt_diag_I[i + 1]; j++) { Gt_diag_data[j] *= h2; } for (j = Gt_offd_I[i]; j < Gt_offd_I[i + 1]; j++) { Gt_offd_data[j] *= h2; } } } } } /* we only needed Gx, Gy and Gz to compute the local mesh size */ if (input_info == 1) { hypre_ParVectorDestroy(ams_data -> Gx); if (ams_data -> dim >= 2) { hypre_ParVectorDestroy(ams_data -> Gy); } if (ams_data -> dim == 3) { hypre_ParVectorDestroy(ams_data -> Gz); } } #if defined(HYPRE_USING_GPU) if (exec == HYPRE_EXEC_DEVICE) { GGt = hypre_ParCSRMatMat(ams_data -> G, Gt); } else #endif { GGt = hypre_ParMatmul(ams_data -> G, Gt); } hypre_ParCSRMatrixDestroy(Gt); /* hypre_ParCSRMatrixAdd(GGt, A, &ams_data -> A); */ hypre_ParCSRMatrixAdd(1.0, GGt, 1.0, ams_data -> A, &ApGGt); /*{ hypre_ParCSRMatrix *A = GGt; hypre_ParCSRMatrix *B = ams_data -> A; hypre_ParCSRMatrix **C_ptr = &ApGGt; hypre_ParCSRMatrix *C; hypre_CSRMatrix *A_local, *B_local, *C_local; MPI_Comm comm = hypre_ParCSRMatrixComm(A); HYPRE_BigInt global_num_rows = hypre_ParCSRMatrixGlobalNumRows(A); HYPRE_BigInt global_num_cols = hypre_ParCSRMatrixGlobalNumCols(A); HYPRE_BigInt *row_starts = hypre_ParCSRMatrixRowStarts(A); HYPRE_BigInt *col_starts = hypre_ParCSRMatrixColStarts(A); HYPRE_Int A_num_cols_offd = hypre_CSRMatrixNumCols(hypre_ParCSRMatrixOffd(A)); HYPRE_Int A_num_nonzeros_diag = hypre_CSRMatrixNumNonzeros(hypre_ParCSRMatrixDiag(A)); HYPRE_Int A_num_nonzeros_offd = hypre_CSRMatrixNumNonzeros(hypre_ParCSRMatrixOffd(A)); HYPRE_Int B_num_cols_offd = hypre_CSRMatrixNumCols(hypre_ParCSRMatrixOffd(B)); HYPRE_Int B_num_nonzeros_diag = hypre_CSRMatrixNumNonzeros(hypre_ParCSRMatrixDiag(B)); HYPRE_Int B_num_nonzeros_offd = hypre_CSRMatrixNumNonzeros(hypre_ParCSRMatrixOffd(B)); A_local = hypre_MergeDiagAndOffd(A); B_local = hypre_MergeDiagAndOffd(B); C_local = hypre_CSRMatrixBigAdd(A_local, B_local); hypre_CSRMatrixBigJtoJ(C_local); C = hypre_ParCSRMatrixCreate (comm, global_num_rows, global_num_cols, row_starts, col_starts, A_num_cols_offd + B_num_cols_offd, A_num_nonzeros_diag + B_num_nonzeros_diag, A_num_nonzeros_offd + B_num_nonzeros_offd); GenerateDiagAndOffd(C_local, C, hypre_ParCSRMatrixFirstColDiag(A), hypre_ParCSRMatrixLastColDiag(A)); hypre_CSRMatrixDestroy(A_local); hypre_CSRMatrixDestroy(B_local); hypre_CSRMatrixDestroy(C_local); *C_ptr = C; }*/ hypre_ParCSRMatrixDestroy(GGt); #if defined(HYPRE_USING_GPU) if (exec == HYPRE_EXEC_DEVICE) { ams_data -> A_Pi = hypre_ParCSRMatrixRAPKT(ams_data -> Pi, ApGGt, ams_data -> Pi, 1); } else #endif { hypre_BoomerAMGBuildCoarseOperator(ams_data -> Pi, ApGGt, ams_data -> Pi, &ams_data -> A_Pi); } } } else { #if defined(HYPRE_USING_GPU) if (exec == HYPRE_EXEC_DEVICE) { ams_data -> A_Pi = hypre_ParCSRMatrixRAPKT(ams_data -> Pi, ams_data -> A, ams_data -> Pi, 1); } else #endif { hypre_BoomerAMGBuildCoarseOperator(ams_data -> Pi, ams_data -> A, ams_data -> Pi, &ams_data -> A_Pi); } } ams_data -> owns_A_Pi = 1; if (ams_data -> cycle_type != 20) { HYPRE_BoomerAMGSetNumFunctions(ams_data -> B_Pi, ams_data -> dim); } else { HYPRE_BoomerAMGSetNumFunctions(ams_data -> B_Pi, ams_data -> dim + 1); } /* HYPRE_BoomerAMGSetNodal(ams_data -> B_Pi, 1); */ } /* Make sure that A_Pi has no zero rows (this can happen for some kinds of boundary conditions with contact). */ hypre_ParCSRMatrixFixZeroRows(ams_data -> A_Pi); HYPRE_BoomerAMGSetup(ams_data -> B_Pi, (HYPRE_ParCSRMatrix)ams_data -> A_Pi, 0, 0); } /* Allocate temporary vectors */ ams_data -> r0 = hypre_ParVectorInRangeOf(ams_data -> A); ams_data -> g0 = hypre_ParVectorInRangeOf(ams_data -> A); if (ams_data -> A_G) { ams_data -> r1 = hypre_ParVectorInRangeOf(ams_data -> A_G); ams_data -> g1 = hypre_ParVectorInRangeOf(ams_data -> A_G); } if (ams_data -> r1 == NULL && ams_data -> A_Pix) { ams_data -> r1 = hypre_ParVectorInRangeOf(ams_data -> A_Pix); ams_data -> g1 = hypre_ParVectorInRangeOf(ams_data -> A_Pix); } if (ams_data -> Pi) { ams_data -> r2 = hypre_ParVectorInDomainOf(ams_data -> Pi); ams_data -> g2 = hypre_ParVectorInDomainOf(ams_data -> Pi); } return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_AMSSolve * * Solve the system A x = b. *--------------------------------------------------------------------------*/ HYPRE_Int hypre_AMSSolve(void *solver, hypre_ParCSRMatrix *A, hypre_ParVector *b, hypre_ParVector *x) { hypre_AMSData *ams_data = (hypre_AMSData *) solver; HYPRE_Int i, my_id = -1; HYPRE_Real r0_norm = 1.0; HYPRE_Real r_norm = 1.0; HYPRE_Real b_norm = 1.0; HYPRE_Real relative_resid = 0, old_resid; char cycle[30]; hypre_ParCSRMatrix *Ai[5], *Pi[5]; HYPRE_Solver Bi[5]; HYPRE_PtrToSolverFcn HBi[5]; hypre_ParVector *ri[5], *gi[5]; HYPRE_Int needZ = 0; hypre_ParVector *z = ams_data -> zz; Ai[0] = ams_data -> A_G; Pi[0] = ams_data -> G; Ai[1] = ams_data -> A_Pi; Pi[1] = ams_data -> Pi; Ai[2] = ams_data -> A_Pix; Pi[2] = ams_data -> Pix; Ai[3] = ams_data -> A_Piy; Pi[3] = ams_data -> Piy; Ai[4] = ams_data -> A_Piz; Pi[4] = ams_data -> Piz; Bi[0] = ams_data -> B_G; HBi[0] = (HYPRE_PtrToSolverFcn) hypre_BoomerAMGSolve; Bi[1] = ams_data -> B_Pi; HBi[1] = (HYPRE_PtrToSolverFcn) hypre_BoomerAMGBlockSolve; Bi[2] = ams_data -> B_Pix; HBi[2] = (HYPRE_PtrToSolverFcn) hypre_BoomerAMGSolve; Bi[3] = ams_data -> B_Piy; HBi[3] = (HYPRE_PtrToSolverFcn) hypre_BoomerAMGSolve; Bi[4] = ams_data -> B_Piz; HBi[4] = (HYPRE_PtrToSolverFcn) hypre_BoomerAMGSolve; ri[0] = ams_data -> r1; gi[0] = ams_data -> g1; ri[1] = ams_data -> r2; gi[1] = ams_data -> g2; ri[2] = ams_data -> r1; gi[2] = ams_data -> g1; ri[3] = ams_data -> r1; gi[3] = ams_data -> g1; ri[4] = ams_data -> r1; gi[4] = ams_data -> g1; /* may need to create an additional temporary vector for relaxation */ #if defined(HYPRE_USING_GPU) HYPRE_ExecutionPolicy exec = hypre_GetExecPolicy1( hypre_ParCSRMatrixMemoryLocation(A) ); if (exec == HYPRE_EXEC_DEVICE) { needZ = ams_data -> A_relax_type == 2 || ams_data -> A_relax_type == 4 || ams_data -> A_relax_type == 16; } else #endif { needZ = hypre_NumThreads() > 1 || ams_data -> A_relax_type == 16; } if (needZ && !z) { z = hypre_ParVectorCreate(hypre_ParCSRMatrixComm(A), hypre_ParCSRMatrixGlobalNumRows(A), hypre_ParCSRMatrixRowStarts(A)); hypre_ParVectorInitialize(z); ams_data -> zz = z; } if (ams_data -> print_level > 0) { hypre_MPI_Comm_rank(hypre_ParCSRMatrixComm(A), &my_id); } /* Compatible subspace projection for problems with zero-conductivity regions. Note that this modifies the input (r.h.s.) vector b! */ if ( (ams_data -> B_G0) && (++ams_data->solve_counter % ( ams_data -> projection_frequency ) == 0) ) { /* hypre_printf("Projecting onto the compatible subspace...\n"); */ hypre_AMSProjectOutGradients(ams_data, b); } if (ams_data -> beta_is_zero) { switch (ams_data -> cycle_type) { case 0: hypre_sprintf(cycle, "%s", "0"); break; case 1: case 3: case 5: case 7: default: hypre_sprintf(cycle, "%s", "020"); break; case 2: case 4: case 6: case 8: hypre_sprintf(cycle, "%s", "(0+2)"); break; case 11: case 13: hypre_sprintf(cycle, "%s", "0345430"); break; case 12: hypre_sprintf(cycle, "%s", "(0+3+4+5)"); break; case 14: hypre_sprintf(cycle, "%s", "0(+3+4+5)0"); break; } } else { switch (ams_data -> cycle_type) { case 0: hypre_sprintf(cycle, "%s", "010"); break; case 1: default: hypre_sprintf(cycle, "%s", "01210"); break; case 2: hypre_sprintf(cycle, "%s", "(0+1+2)"); break; case 3: hypre_sprintf(cycle, "%s", "02120"); break; case 4: hypre_sprintf(cycle, "%s", "(010+2)"); break; case 5: hypre_sprintf(cycle, "%s", "0102010"); break; case 6: hypre_sprintf(cycle, "%s", "(020+1)"); break; case 7: hypre_sprintf(cycle, "%s", "0201020"); break; case 8: hypre_sprintf(cycle, "%s", "0(+1+2)0"); break; case 9: hypre_sprintf(cycle, "%s", "01210"); break; case 11: hypre_sprintf(cycle, "%s", "013454310"); break; case 12: hypre_sprintf(cycle, "%s", "(0+1+3+4+5)"); break; case 13: hypre_sprintf(cycle, "%s", "034515430"); break; case 14: hypre_sprintf(cycle, "%s", "01(+3+4+5)10"); break; case 20: hypre_sprintf(cycle, "%s", "020"); break; } } for (i = 0; i < ams_data -> maxit; i++) { /* Compute initial residual norms */ if (ams_data -> maxit > 1 && i == 0) { hypre_ParVectorCopy(b, ams_data -> r0); hypre_ParCSRMatrixMatvec(-1.0, ams_data -> A, x, 1.0, ams_data -> r0); r_norm = hypre_sqrt(hypre_ParVectorInnerProd(ams_data -> r0, ams_data -> r0)); r0_norm = r_norm; b_norm = hypre_sqrt(hypre_ParVectorInnerProd(b, b)); if (b_norm) { relative_resid = r_norm / b_norm; } else { relative_resid = r_norm; } if (my_id == 0 && ams_data -> print_level > 0) { hypre_printf(" relative\n"); hypre_printf(" residual factor residual\n"); hypre_printf(" -------- ------ --------\n"); hypre_printf(" Initial %e %e\n", r_norm, relative_resid); } } /* Apply the preconditioner */ hypre_ParCSRSubspacePrec(ams_data -> A, ams_data -> A_relax_type, ams_data -> A_relax_times, ams_data -> A_l1_norms ? hypre_VectorData(ams_data -> A_l1_norms) : NULL, ams_data -> A_relax_weight, ams_data -> A_omega, ams_data -> A_max_eig_est, ams_data -> A_min_eig_est, ams_data -> A_cheby_order, ams_data -> A_cheby_fraction, Ai, Bi, HBi, Pi, ri, gi, b, x, ams_data -> r0, ams_data -> g0, cycle, z); /* Compute new residual norms */ if (ams_data -> maxit > 1) { old_resid = r_norm; hypre_ParVectorCopy(b, ams_data -> r0); hypre_ParCSRMatrixMatvec(-1.0, ams_data -> A, x, 1.0, ams_data -> r0); r_norm = hypre_sqrt(hypre_ParVectorInnerProd(ams_data -> r0, ams_data -> r0)); if (b_norm) { relative_resid = r_norm / b_norm; } else { relative_resid = r_norm; } if (my_id == 0 && ams_data -> print_level > 0) hypre_printf(" Cycle %2d %e %f %e \n", i + 1, r_norm, r_norm / old_resid, relative_resid); } if (relative_resid < ams_data -> tol) { i++; break; } } if (my_id == 0 && ams_data -> print_level > 0 && ams_data -> maxit > 1) { hypre_printf("\n\n Average Convergence Factor = %f\n\n", hypre_pow((r_norm / r0_norm), (1.0 / (HYPRE_Real) i))); } ams_data -> num_iterations = i; ams_data -> rel_resid_norm = relative_resid; if (ams_data -> num_iterations == ams_data -> maxit && ams_data -> tol > 0.0) { hypre_error(HYPRE_ERROR_CONV); } return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_ParCSRSubspacePrec * * General subspace preconditioner for A0 y = x, based on ParCSR storage. * * P[i] and A[i] are the interpolation and coarse grid matrices for * the (i+1)'th subspace. B[i] is an AMG solver for A[i]. r[i] and g[i] * are temporary vectors. A0_* are the fine grid smoothing parameters. * * The default mode is multiplicative, '+' changes the next correction * to additive, based on residual computed at '('. *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ParCSRSubspacePrec(/* fine space matrix */ hypre_ParCSRMatrix *A0, /* relaxation parameters */ HYPRE_Int A0_relax_type, HYPRE_Int A0_relax_times, HYPRE_Real *A0_l1_norms, HYPRE_Real A0_relax_weight, HYPRE_Real A0_omega, HYPRE_Real A0_max_eig_est, HYPRE_Real A0_min_eig_est, HYPRE_Int A0_cheby_order, HYPRE_Real A0_cheby_fraction, /* subspace matrices */ hypre_ParCSRMatrix **A, /* subspace preconditioners */ HYPRE_Solver *B, /* hypre solver functions for B */ HYPRE_PtrToSolverFcn *HB, /* subspace interpolations */ hypre_ParCSRMatrix **P, /* temporary subspace vectors */ hypre_ParVector **r, hypre_ParVector **g, /* right-hand side */ hypre_ParVector *x, /* current approximation */ hypre_ParVector *y, /* current residual */ hypre_ParVector *r0, /* temporary vector */ hypre_ParVector *g0, char *cycle, /* temporary vector */ hypre_ParVector *z) { char *op; HYPRE_Int use_saved_residual = 0; for (op = cycle; *op != '\0'; op++) { /* do nothing */ if (*op == ')') { continue; } /* compute the residual: r = x - Ay */ else if (*op == '(') { hypre_ParVectorCopy(x, r0); hypre_ParCSRMatrixMatvec(-1.0, A0, y, 1.0, r0); } /* switch to additive correction */ else if (*op == '+') { use_saved_residual = 1; continue; } /* smooth: y += S (x - Ay) */ else if (*op == '0') { hypre_ParCSRRelax(A0, x, A0_relax_type, A0_relax_times, A0_l1_norms, A0_relax_weight, A0_omega, A0_max_eig_est, A0_min_eig_est, A0_cheby_order, A0_cheby_fraction, y, g0, z); } /* subspace correction: y += P B^{-1} P^t r */ else { HYPRE_Int i = *op - '1'; if (i < 0) { hypre_error_in_arg(16); } /* skip empty subspaces */ if (!A[i]) { continue; } /* compute the residual? */ if (use_saved_residual) { use_saved_residual = 0; hypre_ParCSRMatrixMatvecT(1.0, P[i], r0, 0.0, r[i]); } else { hypre_ParVectorCopy(x, g0); hypre_ParCSRMatrixMatvec(-1.0, A0, y, 1.0, g0); hypre_ParCSRMatrixMatvecT(1.0, P[i], g0, 0.0, r[i]); } hypre_ParVectorSetConstantValues(g[i], 0.0); (*HB[i]) (B[i], (HYPRE_Matrix)A[i], (HYPRE_Vector)r[i], (HYPRE_Vector)g[i]); hypre_ParCSRMatrixMatvec(1.0, P[i], g[i], 0.0, g0); hypre_ParVectorAxpy(1.0, g0, y); } } return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_AMSGetNumIterations * * Get the number of AMS iterations. *--------------------------------------------------------------------------*/ HYPRE_Int hypre_AMSGetNumIterations(void *solver, HYPRE_Int *num_iterations) { hypre_AMSData *ams_data = (hypre_AMSData *) solver; *num_iterations = ams_data -> num_iterations; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_AMSGetFinalRelativeResidualNorm * * Get the final relative residual norm in AMS. *--------------------------------------------------------------------------*/ HYPRE_Int hypre_AMSGetFinalRelativeResidualNorm(void *solver, HYPRE_Real *rel_resid_norm) { hypre_AMSData *ams_data = (hypre_AMSData *) solver; *rel_resid_norm = ams_data -> rel_resid_norm; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_AMSProjectOutGradients * * For problems with zero-conductivity regions, project the vector onto the * compatible subspace: x = (I - G0 (G0^t G0)^{-1} G0^T) x, where G0 is the * discrete gradient restricted to the interior nodes of the regions with * zero conductivity. This ensures that x is orthogonal to the gradients in * the range of G0. * * This function is typically called after the solution iteration is complete, * in order to facilitate the visualization of the computed field. Without it * the values in the zero-conductivity regions contain kernel components. *--------------------------------------------------------------------------*/ HYPRE_Int hypre_AMSProjectOutGradients(void *solver, hypre_ParVector *x) { hypre_AMSData *ams_data = (hypre_AMSData *) solver; if (ams_data -> B_G0) { hypre_ParCSRMatrixMatvecT(1.0, ams_data -> G0, x, 0.0, ams_data -> r1); hypre_ParVectorSetConstantValues(ams_data -> g1, 0.0); hypre_BoomerAMGSolve(ams_data -> B_G0, ams_data -> A_G0, ams_data -> r1, ams_data -> g1); hypre_ParCSRMatrixMatvec(1.0, ams_data -> G0, ams_data -> g1, 0.0, ams_data -> g0); hypre_ParVectorAxpy(-1.0, ams_data -> g0, x); } return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_AMSConstructDiscreteGradient * * Construct and return the lowest-order discrete gradient matrix G, based on: * - a matrix on the egdes (e.g. the stiffness matrix A) * - a vector on the vertices (e.g. the x coordinates) * - the array edge_vertex, which lists the global indexes of the * vertices of the local edges. * * We assume that edge_vertex lists the edge vertices consecutively, * and that the orientation of all edges is consistent. More specificaly: * If edge_orientation = 1, the edges are already oriented. * If edge_orientation = 2, the orientation of edge i depends only on the * sign of edge_vertex[2*i+1] - edge_vertex[2*i]. *--------------------------------------------------------------------------*/ HYPRE_Int hypre_AMSConstructDiscreteGradient(hypre_ParCSRMatrix *A, hypre_ParVector *x_coord, HYPRE_BigInt *edge_vertex, HYPRE_Int edge_orientation, hypre_ParCSRMatrix **G_ptr) { hypre_ParCSRMatrix *G; HYPRE_Int nedges; nedges = hypre_ParCSRMatrixNumRows(A); /* Construct the local part of G based on edge_vertex and the edge and vertex partitionings from A and x_coord */ { HYPRE_Int i, *I = hypre_CTAlloc(HYPRE_Int, nedges + 1, HYPRE_MEMORY_HOST); HYPRE_Real *data = hypre_CTAlloc(HYPRE_Real, 2 * nedges, HYPRE_MEMORY_HOST); hypre_CSRMatrix *local = hypre_CSRMatrixCreate (nedges, hypre_ParVectorGlobalSize(x_coord), 2 * nedges); for (i = 0; i <= nedges; i++) { I[i] = 2 * i; } if (edge_orientation == 1) { /* Assume that the edges are already oriented */ for (i = 0; i < 2 * nedges; i += 2) { data[i] = -1.0; data[i + 1] = 1.0; } } else if (edge_orientation == 2) { /* Assume that the edge orientation is based on the vertex indexes */ for (i = 0; i < 2 * nedges; i += 2) { if (edge_vertex[i] < edge_vertex[i + 1]) { data[i] = -1.0; data[i + 1] = 1.0; } else { data[i] = 1.0; data[i + 1] = -1.0; } } } else { hypre_error_in_arg(4); } hypre_CSRMatrixI(local) = I; hypre_CSRMatrixBigJ(local) = edge_vertex; hypre_CSRMatrixData(local) = data; hypre_CSRMatrixRownnz(local) = NULL; hypre_CSRMatrixOwnsData(local) = 1; hypre_CSRMatrixNumRownnz(local) = nedges; /* Generate the discrete gradient matrix */ G = hypre_ParCSRMatrixCreate(hypre_ParCSRMatrixComm(A), hypre_ParCSRMatrixGlobalNumRows(A), hypre_ParVectorGlobalSize(x_coord), hypre_ParCSRMatrixRowStarts(A), hypre_ParVectorPartitioning(x_coord), 0, 0, 0); hypre_CSRMatrixBigJtoJ(local); GenerateDiagAndOffd(local, G, hypre_ParVectorFirstIndex(x_coord), hypre_ParVectorLastIndex(x_coord)); /* Account for empty rows in G. These may appear when A includes only the interior (non-Dirichlet b.c.) edges. */ { hypre_CSRMatrix *G_diag = hypre_ParCSRMatrixDiag(G); G_diag->num_cols = hypre_VectorSize(hypre_ParVectorLocalVector(x_coord)); } /* Free the local matrix */ hypre_CSRMatrixDestroy(local); } *G_ptr = G; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_AMSFEISetup * * Construct an AMS solver object based on the following data: * * A - the edge element stiffness matrix * num_vert - number of vertices (nodes) in the processor * num_local_vert - number of vertices owned by the processor * vert_number - global indexes of the vertices in the processor * vert_coord - coordinates of the vertices in the processor * num_edges - number of edges owned by the processor * edge_vertex - the vertices of the edges owned by the processor. * Vertices are in local numbering (the same as in * vert_number), and edge orientation is always from * the first to the second vertex. * * Here we distinguish between vertices that belong to elements in the * current processor, and the subset of these vertices that is owned by * the processor. * * This function is written specifically for input from the FEI and should * be called before hypre_AMSSetup(). *--------------------------------------------------------------------------*/ HYPRE_Int hypre_AMSFEISetup(void *solver, hypre_ParCSRMatrix *A, hypre_ParVector *b, hypre_ParVector *x, HYPRE_Int num_vert, HYPRE_Int num_local_vert, HYPRE_BigInt *vert_number, HYPRE_Real *vert_coord, HYPRE_Int num_edges, HYPRE_BigInt *edge_vertex) { HYPRE_UNUSED_VAR(b); HYPRE_UNUSED_VAR(x); hypre_AMSData *ams_data = (hypre_AMSData *) solver; HYPRE_Int i, j; hypre_ParCSRMatrix *G; hypre_ParVector *x_coord, *y_coord, *z_coord; HYPRE_Real *x_data, *y_data, *z_data; MPI_Comm comm = hypre_ParCSRMatrixComm(A); HYPRE_BigInt vert_part[2], num_global_vert; HYPRE_BigInt vert_start, vert_end; HYPRE_BigInt big_local_vert = (HYPRE_BigInt) num_local_vert; /* Find the processor partitioning of the vertices */ hypre_MPI_Scan(&big_local_vert, &vert_part[1], 1, HYPRE_MPI_BIG_INT, hypre_MPI_SUM, comm); vert_part[0] = vert_part[1] - big_local_vert; hypre_MPI_Allreduce(&big_local_vert, &num_global_vert, 1, HYPRE_MPI_BIG_INT, hypre_MPI_SUM, comm); /* Construct hypre parallel vectors for the vertex coordinates */ x_coord = hypre_ParVectorCreate(comm, num_global_vert, vert_part); hypre_ParVectorInitialize(x_coord); hypre_ParVectorOwnsData(x_coord) = 1; x_data = hypre_VectorData(hypre_ParVectorLocalVector(x_coord)); y_coord = hypre_ParVectorCreate(comm, num_global_vert, vert_part); hypre_ParVectorInitialize(y_coord); hypre_ParVectorOwnsData(y_coord) = 1; y_data = hypre_VectorData(hypre_ParVectorLocalVector(y_coord)); z_coord = hypre_ParVectorCreate(comm, num_global_vert, vert_part); hypre_ParVectorInitialize(z_coord); hypre_ParVectorOwnsData(z_coord) = 1; z_data = hypre_VectorData(hypre_ParVectorLocalVector(z_coord)); vert_start = hypre_ParVectorFirstIndex(x_coord); vert_end = hypre_ParVectorLastIndex(x_coord); /* Save coordinates of locally owned vertices */ for (i = 0; i < num_vert; i++) { if (vert_number[i] >= vert_start && vert_number[i] <= vert_end) { j = (HYPRE_Int)(vert_number[i] - vert_start); x_data[j] = vert_coord[3 * i]; y_data[j] = vert_coord[3 * i + 1]; z_data[j] = vert_coord[3 * i + 2]; } } /* Change vertex numbers from local to global */ for (i = 0; i < 2 * num_edges; i++) { edge_vertex[i] = vert_number[edge_vertex[i]]; } /* Construct the local part of G based on edge_vertex */ { /* HYPRE_Int num_edges = hypre_ParCSRMatrixNumRows(A); */ HYPRE_Int *I = hypre_CTAlloc(HYPRE_Int, num_edges + 1, HYPRE_MEMORY_HOST); HYPRE_Real *data = hypre_CTAlloc(HYPRE_Real, 2 * num_edges, HYPRE_MEMORY_HOST); hypre_CSRMatrix *local = hypre_CSRMatrixCreate (num_edges, num_global_vert, 2 * num_edges); for (i = 0; i <= num_edges; i++) { I[i] = 2 * i; } /* Assume that the edge orientation is based on the vertex indexes */ for (i = 0; i < 2 * num_edges; i += 2) { data[i] = 1.0; data[i + 1] = -1.0; } hypre_CSRMatrixI(local) = I; hypre_CSRMatrixBigJ(local) = edge_vertex; hypre_CSRMatrixData(local) = data; hypre_CSRMatrixRownnz(local) = NULL; hypre_CSRMatrixOwnsData(local) = 1; hypre_CSRMatrixNumRownnz(local) = num_edges; G = hypre_ParCSRMatrixCreate(comm, hypre_ParCSRMatrixGlobalNumRows(A), num_global_vert, hypre_ParCSRMatrixRowStarts(A), vert_part, 0, 0, 0); hypre_CSRMatrixBigJtoJ(local); GenerateDiagAndOffd(local, G, vert_start, vert_end); //hypre_CSRMatrixJ(local) = NULL; hypre_CSRMatrixDestroy(local); } ams_data -> G = G; ams_data -> x = x_coord; ams_data -> y = y_coord; ams_data -> z = z_coord; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_AMSFEIDestroy * * Free the additional memory allocated in hypre_AMSFEISetup(). * * This function is written specifically for input from the FEI and should * be called before hypre_AMSDestroy(). *--------------------------------------------------------------------------*/ HYPRE_Int hypre_AMSFEIDestroy(void *solver) { hypre_AMSData *ams_data = (hypre_AMSData *) solver; if (ams_data -> G) { hypre_ParCSRMatrixDestroy(ams_data -> G); } if (ams_data -> x) { hypre_ParVectorDestroy(ams_data -> x); } if (ams_data -> y) { hypre_ParVectorDestroy(ams_data -> y); } if (ams_data -> z) { hypre_ParVectorDestroy(ams_data -> z); } return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_ParCSRComputeL1Norms Threads * * Compute the l1 norms of the rows of a given matrix, depending on * the option parameter: * * option 1 = Compute the l1 norm of the rows * option 2 = Compute the l1 norm of the (processor) off-diagonal * part of the rows plus the diagonal of A * option 3 = Compute the l2 norm^2 of the rows * option 4 = Truncated version of option 2 based on Remark 6.2 in "Multigrid * Smoothers for Ultra-Parallel Computing" * * The above computations are done in a CF manner, whenever the provided * cf_marker is not NULL. *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ParCSRComputeL1NormsThreads(hypre_ParCSRMatrix *A, HYPRE_Int option, HYPRE_Int num_threads, HYPRE_Int *cf_marker, HYPRE_Real **l1_norm_ptr) { HYPRE_Int i, j, k; HYPRE_Int num_rows = hypre_ParCSRMatrixNumRows(A); hypre_CSRMatrix *A_diag = hypre_ParCSRMatrixDiag(A); HYPRE_Int *A_diag_I = hypre_CSRMatrixI(A_diag); HYPRE_Int *A_diag_J = hypre_CSRMatrixJ(A_diag); HYPRE_Real *A_diag_data = hypre_CSRMatrixData(A_diag); hypre_CSRMatrix *A_offd = hypre_ParCSRMatrixOffd(A); HYPRE_Int *A_offd_I = hypre_CSRMatrixI(A_offd); HYPRE_Int *A_offd_J = hypre_CSRMatrixJ(A_offd); HYPRE_Real *A_offd_data = hypre_CSRMatrixData(A_offd); HYPRE_Int num_cols_offd = hypre_CSRMatrixNumCols(A_offd); HYPRE_Real diag = 0.0; HYPRE_Real *l1_norm = hypre_TAlloc(HYPRE_Real, num_rows, hypre_ParCSRMatrixMemoryLocation(A)); HYPRE_Int ii, ns, ne, rest, size; HYPRE_Int *cf_marker_offd = NULL; HYPRE_Int cf_diag; /* collect the cf marker data from other procs */ if (cf_marker != NULL) { HYPRE_Int index; HYPRE_Int num_sends; HYPRE_Int start; HYPRE_Int *int_buf_data = NULL; hypre_ParCSRCommPkg *comm_pkg = hypre_ParCSRMatrixCommPkg(A); hypre_ParCSRCommHandle *comm_handle; if (num_cols_offd) { cf_marker_offd = hypre_CTAlloc(HYPRE_Int, num_cols_offd, HYPRE_MEMORY_HOST); } num_sends = hypre_ParCSRCommPkgNumSends(comm_pkg); if (hypre_ParCSRCommPkgSendMapStart(comm_pkg, num_sends)) int_buf_data = hypre_CTAlloc(HYPRE_Int, hypre_ParCSRCommPkgSendMapStart(comm_pkg, num_sends), HYPRE_MEMORY_HOST); index = 0; for (i = 0; i < num_sends; i++) { start = hypre_ParCSRCommPkgSendMapStart(comm_pkg, i); for (j = start; j < hypre_ParCSRCommPkgSendMapStart(comm_pkg, i + 1); j++) { int_buf_data[index++] = cf_marker[hypre_ParCSRCommPkgSendMapElmt(comm_pkg, j)]; } } comm_handle = hypre_ParCSRCommHandleCreate(11, comm_pkg, int_buf_data, cf_marker_offd); hypre_ParCSRCommHandleDestroy(comm_handle); hypre_TFree(int_buf_data, HYPRE_MEMORY_HOST); } #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i,ii,j,k,ns,ne,rest,size,diag,cf_diag) HYPRE_SMP_SCHEDULE #endif for (k = 0; k < num_threads; k++) { size = num_rows / num_threads; rest = num_rows - size * num_threads; if (k < rest) { ns = k * size + k; ne = (k + 1) * size + k + 1; } else { ns = k * size + rest; ne = (k + 1) * size + rest; } if (option == 1) { for (i = ns; i < ne; i++) { l1_norm[i] = 0.0; if (cf_marker == NULL) { /* Add the l1 norm of the diag part of the ith row */ for (j = A_diag_I[i]; j < A_diag_I[i + 1]; j++) { l1_norm[i] += hypre_abs(A_diag_data[j]); } /* Add the l1 norm of the offd part of the ith row */ if (num_cols_offd) { for (j = A_offd_I[i]; j < A_offd_I[i + 1]; j++) { l1_norm[i] += hypre_abs(A_offd_data[j]); } } } else { cf_diag = cf_marker[i]; /* Add the CF l1 norm of the diag part of the ith row */ for (j = A_diag_I[i]; j < A_diag_I[i + 1]; j++) if (cf_diag == cf_marker[A_diag_J[j]]) { l1_norm[i] += hypre_abs(A_diag_data[j]); } /* Add the CF l1 norm of the offd part of the ith row */ if (num_cols_offd) { for (j = A_offd_I[i]; j < A_offd_I[i + 1]; j++) if (cf_diag == cf_marker_offd[A_offd_J[j]]) { l1_norm[i] += hypre_abs(A_offd_data[j]); } } } } } else if (option == 2) { for (i = ns; i < ne; i++) { l1_norm[i] = 0.0; if (cf_marker == NULL) { /* Add the diagonal and the local off-thread part of the ith row */ for (j = A_diag_I[i]; j < A_diag_I[i + 1]; j++) { ii = A_diag_J[j]; if (ii == i || ii < ns || ii >= ne) { l1_norm[i] += hypre_abs(A_diag_data[j]); } } /* Add the l1 norm of the offd part of the ith row */ if (num_cols_offd) { for (j = A_offd_I[i]; j < A_offd_I[i + 1]; j++) { l1_norm[i] += hypre_abs(A_offd_data[j]); } } } else { cf_diag = cf_marker[i]; /* Add the diagonal and the local off-thread part of the ith row */ for (j = A_diag_I[i]; j < A_diag_I[i + 1]; j++) { ii = A_diag_J[j]; if ((ii == i || ii < ns || ii >= ne) && (cf_diag == cf_marker[A_diag_J[j]])) { l1_norm[i] += hypre_abs(A_diag_data[j]); } } /* Add the CF l1 norm of the offd part of the ith row */ if (num_cols_offd) { for (j = A_offd_I[i]; j < A_offd_I[i + 1]; j++) { if (cf_diag == cf_marker_offd[A_offd_J[j]]) { l1_norm[i] += hypre_abs(A_offd_data[j]); } } } } } } else if (option == 3) { for (i = ns; i < ne; i++) { l1_norm[i] = 0.0; for (j = A_diag_I[i]; j < A_diag_I[i + 1]; j++) { l1_norm[i] += A_diag_data[j] * A_diag_data[j]; } if (num_cols_offd) { for (j = A_offd_I[i]; j < A_offd_I[i + 1]; j++) { l1_norm[i] += A_offd_data[j] * A_offd_data[j]; } } } } else if (option == 4) { for (i = ns; i < ne; i++) { l1_norm[i] = 0.0; if (cf_marker == NULL) { /* Add the diagonal and the local off-thread part of the ith row */ diag = 0.0; for (j = A_diag_I[i]; j < A_diag_I[i + 1]; j++) { ii = A_diag_J[j]; if (ii == i || ii < ns || ii >= ne) { if (ii == i) { diag = hypre_abs(A_diag_data[j]); l1_norm[i] += hypre_abs(A_diag_data[j]); } else { l1_norm[i] += 0.5 * hypre_abs(A_diag_data[j]); } } } /* Add the l1 norm of the offd part of the ith row */ if (num_cols_offd) { for (j = A_offd_I[i]; j < A_offd_I[i + 1]; j++) { l1_norm[i] += 0.5 * hypre_abs(A_offd_data[j]); } } } else { cf_diag = cf_marker[i]; /* Add the diagonal and the local off-thread part of the ith row */ diag = 0.0; for (j = A_diag_I[i]; j < A_diag_I[i + 1]; j++) { ii = A_diag_J[j]; if ((ii == i || ii < ns || ii >= ne) && (cf_diag == cf_marker[A_diag_J[j]])) { if (ii == i) { diag = hypre_abs(A_diag_data[j]); l1_norm[i] += hypre_abs(A_diag_data[j]); } else { l1_norm[i] += 0.5 * hypre_abs(A_diag_data[j]); } } } /* Add the CF l1 norm of the offd part of the ith row */ if (num_cols_offd) { for (j = A_offd_I[i]; j < A_offd_I[i + 1]; j++) { if (cf_diag == cf_marker_offd[A_offd_J[j]]) { l1_norm[i] += 0.5 * hypre_abs(A_offd_data[j]); } } } } /* Truncate according to Remark 6.2 */ if (l1_norm[i] <= (4.0 / 3.0) * diag) { l1_norm[i] = diag; } } } else if (option == 5) /*stores diagonal of A for Jacobi using matvec, rlx 7 */ { /* Set the diag element */ for (i = ns; i < ne; i++) { l1_norm[i] = A_diag_data[A_diag_I[i]]; if (l1_norm[i] == 0) { l1_norm[i] = 1.0; } } } else if (option == 6) { for (i = ns; i < ne; i++) { l1_norm[i] = 0.0; if (cf_marker == NULL) { /* Add the diagonal and the local off-thread part of the ith row */ diag = 0.0; for (j = A_diag_I[i]; j < A_diag_I[i + 1]; j++) { ii = A_diag_J[j]; if (ii == i || ii < ns || ii >= ne) { if (ii == i) { diag = hypre_abs(A_diag_data[j]); } else { l1_norm[i] += 0.5 * hypre_abs(A_diag_data[j]); } } } /* Add the l1 norm of the offd part of the ith row */ if (num_cols_offd) { for (j = A_offd_I[i]; j < A_offd_I[i + 1]; j++) { l1_norm[i] += 0.5 * hypre_abs(A_offd_data[j]); } } l1_norm[i] = (diag + l1_norm[i] + hypre_sqrt(diag * diag + l1_norm[i] * l1_norm[i])) * 0.5; } else { cf_diag = cf_marker[i]; /* Add the diagonal and the local off-thread part of the ith row */ diag = 0.0; for (j = A_diag_I[i]; j < A_diag_I[i + 1]; j++) { ii = A_diag_J[j]; if ((ii == i || ii < ns || ii >= ne) && (cf_diag == cf_marker[A_diag_J[j]])) { if (ii == i) { diag = hypre_abs(A_diag_data[j]); } else { l1_norm[i] += 0.5 * hypre_abs(A_diag_data[j]); } } } /* Add the CF l1 norm of the offd part of the ith row */ if (num_cols_offd) { for (j = A_offd_I[i]; j < A_offd_I[i + 1]; j++) { if (cf_diag == cf_marker_offd[A_offd_J[j]]) { l1_norm[i] += 0.5 * hypre_abs(A_offd_data[j]); } } } l1_norm[i] = (diag + l1_norm[i] + hypre_sqrt(diag * diag + l1_norm[i] * l1_norm[i])) * 0.5; } } } if (option < 5) { /* Handle negative definite matrices */ for (i = ns; i < ne; i++) if (A_diag_data[A_diag_I[i]] < 0) { l1_norm[i] = -l1_norm[i]; } for (i = ns; i < ne; i++) /* if (hypre_abs(l1_norm[i]) < DBL_EPSILON) */ if (hypre_abs(l1_norm[i]) == 0.0) { hypre_error_in_arg(1); break; } } } hypre_TFree(cf_marker_offd, HYPRE_MEMORY_HOST); *l1_norm_ptr = l1_norm; return hypre_error_flag; } hypre-2.33.0/src/parcsr_ls/ams.h000066400000000000000000000211501477326011500164430ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #ifndef hypre_AMS_DATA_HEADER #define hypre_AMS_DATA_HEADER /*-------------------------------------------------------------------------- * Auxiliary space Maxwell Solver data *--------------------------------------------------------------------------*/ typedef struct { /* Space dimension (2 or 3) */ HYPRE_Int dim; /* Edge element (ND1) stiffness matrix */ hypre_ParCSRMatrix *A; /* Discrete gradient matrix (vertex-to-edge) */ hypre_ParCSRMatrix *G; /* Coarse grid matrix on the range of G^T */ hypre_ParCSRMatrix *A_G; /* AMG solver for A_G */ HYPRE_Solver B_G; /* Is the mass term coefficient zero? */ HYPRE_Int beta_is_zero; /* Nedelec nodal interpolation matrix (vertex^dim-to-edge) */ hypre_ParCSRMatrix *Pi; /* Coarse grid matrix on the range of Pi^T */ hypre_ParCSRMatrix *A_Pi; /* AMG solver for A_Pi */ HYPRE_Solver B_Pi; /* Components of the Nedelec interpolation matrix (vertex-to-edge each) */ hypre_ParCSRMatrix *Pix, *Piy, *Piz; /* Coarse grid matrices on the ranges of Pi{x,y,z}^T */ hypre_ParCSRMatrix *A_Pix, *A_Piy, *A_Piz; /* AMG solvers for A_Pi{x,y,z} */ HYPRE_Solver B_Pix, B_Piy, B_Piz; /* Does the solver own the Nedelec interpolations? */ HYPRE_Int owns_Pi; /* Does the solver own the coarse grid matrices? */ HYPRE_Int owns_A_G, owns_A_Pi; /* Coordinates of the vertices (z = 0 if dim == 2) */ hypre_ParVector *x, *y, *z; /* Representations of the constant vectors in the Nedelec basis */ hypre_ParVector *Gx, *Gy, *Gz; /* Nodes in the interior of the zero-conductivity region */ hypre_ParVector *interior_nodes; /* Discrete gradient matrix for the interior nodes only */ hypre_ParCSRMatrix *G0; /* Coarse grid matrix on the interior nodes */ hypre_ParCSRMatrix *A_G0; /* AMG solver for A_G0 */ HYPRE_Solver B_G0; /* How frequently to project the r.h.s. onto Ker(G0^T)? */ HYPRE_Int projection_frequency; /* Internal counter to use with projection_frequency in PCG */ HYPRE_Int solve_counter; /* Solver options */ HYPRE_Int maxit; HYPRE_Real tol; HYPRE_Int cycle_type; HYPRE_Int print_level; /* Smoothing options for A */ HYPRE_Int A_relax_type; HYPRE_Int A_relax_times; hypre_Vector *A_l1_norms; HYPRE_Real A_relax_weight; HYPRE_Real A_omega; HYPRE_Real A_max_eig_est; HYPRE_Real A_min_eig_est; HYPRE_Int A_cheby_order; HYPRE_Real A_cheby_fraction; /* AMG options for B_G */ HYPRE_Int B_G_coarsen_type; HYPRE_Int B_G_agg_levels; HYPRE_Int B_G_relax_type; HYPRE_Int B_G_coarse_relax_type; HYPRE_Real B_G_theta; HYPRE_Int B_G_interp_type; HYPRE_Int B_G_Pmax; /* AMG options for B_Pi */ HYPRE_Int B_Pi_coarsen_type; HYPRE_Int B_Pi_agg_levels; HYPRE_Int B_Pi_relax_type; HYPRE_Int B_Pi_coarse_relax_type; HYPRE_Real B_Pi_theta; HYPRE_Int B_Pi_interp_type; HYPRE_Int B_Pi_Pmax; /* Temporary vectors */ hypre_ParVector *r0, *g0, *r1, *g1, *r2, *g2, *zz; /* Output log info */ HYPRE_Int num_iterations; HYPRE_Real rel_resid_norm; } hypre_AMSData; /* Space dimension */ #define hypre_AMSDataDimension(ams_data) ((ams_data)->dim) /* Edge stiffness matrix */ #define hypre_AMSDataA(ams_data) ((ams_data)->A) /* Vertex space data */ #define hypre_AMSDataDiscreteGradient(ams_data) ((ams_data)->G) #define hypre_AMSDataPoissonBeta(ams_data) ((ams_data)->A_G) #define hypre_AMSDataPoissonBetaAMG(ams_data) ((ams_data)->B_G) #define hypre_AMSDataOwnsPoissonBeta(ams_data) ((ams_data)->owns_A_G) #define hypre_AMSDataBetaIsZero(ams_data) ((ams_data)->beta_is_zero) /* Vector vertex space data */ #define hypre_AMSDataPiInterpolation(ams_data) ((ams_data)->Pi) #define hypre_AMSDataOwnsPiInterpolation(ams_data) ((ams_data)->owns_Pi) #define hypre_AMSDataPoissonAlpha(ams_data) ((ams_data)->A_Pi) #define hypre_AMSDataPoissonAlphaAMG(ams_data) ((ams_data)->B_Pi) #define hypre_AMSDataOwnsPoissonAlpha(ams_data) ((ams_data)->owns_A_Pi) /* Vector vertex components data */ #define hypre_AMSDataPiXInterpolation(ams_data) ((ams_data)->Pix) #define hypre_AMSDataPiYInterpolation(ams_data) ((ams_data)->Piy) #define hypre_AMSDataPiZInterpolation(ams_data) ((ams_data)->Piz) #define hypre_AMSDataPoissonAlphaX(ams_data) ((ams_data)->A_Pix) #define hypre_AMSDataPoissonAlphaY(ams_data) ((ams_data)->A_Piy) #define hypre_AMSDataPoissonAlphaZ(ams_data) ((ams_data)->A_Piz) #define hypre_AMSDataPoissonAlphaXAMG(ams_data) ((ams_data)->B_Pix) #define hypre_AMSDataPoissonAlphaYAMG(ams_data) ((ams_data)->B_Piy) #define hypre_AMSDataPoissonAlphaZAMG(ams_data) ((ams_data)->B_Piz) /* Coordinates of the vertices */ #define hypre_AMSDataVertexCoordinateX(ams_data) ((ams_data)->x) #define hypre_AMSDataVertexCoordinateY(ams_data) ((ams_data)->y) #define hypre_AMSDataVertexCoordinateZ(ams_data) ((ams_data)->z) /* Representations of the constant vectors in the Nedelec basis */ #define hypre_AMSDataEdgeConstantX(ams_data) ((ams_data)->Gx) #define hypre_AMSDataEdgeConstantY(ams_data) ((ams_data)->Gy) #define hypre_AMSDataEdgeConstantZ(ams_data) ((ams_data)->Gz) /* Interior zero conductivity region */ #define hypre_AMSDataInteriorNodes(ams_data) ((ams_data)->interior_nodes) #define hypre_AMSDataInteriorDiscreteGradient(ams_data) ((ams_data)->G0) #define hypre_AMSDataInteriorPoissonBeta(ams_data) ((ams_data)->A_G0) #define hypre_AMSDataInteriorPoissonBetaAMG(ams_data) ((ams_data)->B_G0) #define hypre_AMSDataInteriorProjectionFrequency(ams_data) ((ams_data)->projection_frequency) #define hypre_AMSDataInteriorSolveCounter(ams_data) ((ams_data)->solve_counter) /* Solver options */ #define hypre_AMSDataMaxIter(ams_data) ((ams_data)->maxit) #define hypre_AMSDataTol(ams_data) ((ams_data)->tol) #define hypre_AMSDataCycleType(ams_data) ((ams_data)->cycle_type) #define hypre_AMSDataPrintLevel(ams_data) ((ams_data)->print_level) /* Smoothing and AMG options */ #define hypre_AMSDataARelaxType(ams_data) ((ams_data)->A_relax_type) #define hypre_AMSDataARelaxTimes(ams_data) ((ams_data)->A_relax_times) #define hypre_AMSDataAL1Norms(ams_data) ((ams_data)->A_l1_norms) #define hypre_AMSDataARelaxWeight(ams_data) ((ams_data)->A_relax_weight) #define hypre_AMSDataAOmega(ams_data) ((ams_data)->A_omega) #define hypre_AMSDataAMaxEigEst(ams_data) ((ams_data)->A_max_eig_est) #define hypre_AMSDataAMinEigEst(ams_data) ((ams_data)->A_min_eig_est) #define hypre_AMSDataAChebyOrder(ams_data) ((ams_data)->A_cheby_order) #define hypre_AMSDataAChebyFraction(ams_data) ((ams_data)->A_cheby_fraction) #define hypre_AMSDataPoissonBetaAMGCoarsenType(ams_data) ((ams_data)->B_G_coarsen_type) #define hypre_AMSDataPoissonBetaAMGAggLevels(ams_data) ((ams_data)->B_G_agg_levels) #define hypre_AMSDataPoissonBetaAMGRelaxType(ams_data) ((ams_data)->B_G_relax_type) #define hypre_AMSDataPoissonBetaAMGCoarseRelaxType(ams_data) ((ams_data)->B_G_coarse_relax_type) #define hypre_AMSDataPoissonBetaAMGStrengthThreshold(ams_data) ((ams_data)->B_G_theta) #define hypre_AMSDataPoissonBetaAMGInterpType(ams_data) ((ams_data)->B_G_interp_type) #define hypre_AMSDataPoissonBetaAMGPMax(ams_data) ((ams_data)->B_G_Pmax) #define hypre_AMSDataPoissonAlphaAMGCoarsenType(ams_data) ((ams_data)->B_Pi_coarsen_type) #define hypre_AMSDataPoissonAlphaAMGAggLevels(ams_data) ((ams_data)->B_Pi_agg_levels) #define hypre_AMSDataPoissonAlphaAMGRelaxType(ams_data) ((ams_data)->B_Pi_relax_type) #define hypre_AMSDataPoissonAlphaAMGCoarseRelaxType(ams_data) ((ams_data)->B_Pi_coarse_relax_type) #define hypre_AMSDataPoissonAlphaAMGStrengthThreshold(ams_data) ((ams_data)->B_Pi_theta) #define hypre_AMSDataPoissonAlphaAMGInterpType(ams_data) ((ams_data)->B_Pi_interp_type) #define hypre_AMSDataPoissonAlphaAMGPMax(ams_data) ((ams_data)->B_Pi_Pmax) /* Temporary vectors */ #define hypre_AMSDataTempEdgeVectorR(ams_data) ((ams_data)->r0) #define hypre_AMSDataTempEdgeVectorG(ams_data) ((ams_data)->g0) #define hypre_AMSDataTempVertexVectorR(ams_data) ((ams_data)->r1) #define hypre_AMSDataTempVertexVectorG(ams_data) ((ams_data)->g1) #define hypre_AMSDataTempVecVertexVectorR(ams_data) ((ams_data)->r2) #define hypre_AMSDataTempVecVertexVectorG(ams_data) ((ams_data)->g2) #define hypre_AMSDataTempVecVertexVectorZZ(ams_data) ((ams_data)->zz) /* Output log info */ #define hypre_AMSDataNumIterations(ams_data) ((ams_data)->num_iterations) #define hypre_AMSDataResidualNorm(ams_data) ((ams_data)->rel_resid_norm) #endif hypre-2.33.0/src/parcsr_ls/aux_interp.c000066400000000000000000000707231477326011500200460ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "_hypre_parcsr_ls.h" #include "aux_interp.h" /*--------------------------------------------------------------------------- * Auxilary routines for the long range interpolation methods. * Implemented: "standard", "extended", "multipass", "FF" *--------------------------------------------------------------------------*/ /* AHB 11/06: Modification of the above original - takes two communication packages and inserts nodes to position expected for OUT_marker offd nodes from comm_pkg take up first chunk of CF_marker_offd, offd nodes from extend_comm_pkg take up the second chunk of CF_marker_offd. */ HYPRE_Int hypre_alt_insert_new_nodes(hypre_ParCSRCommPkg *comm_pkg, hypre_ParCSRCommPkg *extend_comm_pkg, HYPRE_Int *IN_marker, HYPRE_Int full_off_procNodes, HYPRE_Int *OUT_marker) { HYPRE_UNUSED_VAR(full_off_procNodes); hypre_ParCSRCommHandle *comm_handle; HYPRE_Int i, index, shift; HYPRE_Int num_sends, num_recvs; HYPRE_Int *recv_vec_starts; HYPRE_Int e_num_sends; HYPRE_Int *int_buf_data; HYPRE_Int *e_out_marker; num_sends = hypre_ParCSRCommPkgNumSends(comm_pkg); num_recvs = hypre_ParCSRCommPkgNumRecvs(comm_pkg); recv_vec_starts = hypre_ParCSRCommPkgRecvVecStarts(comm_pkg); e_num_sends = hypre_ParCSRCommPkgNumSends(extend_comm_pkg); index = hypre_max(hypre_ParCSRCommPkgSendMapStart(comm_pkg, num_sends), hypre_ParCSRCommPkgSendMapStart(extend_comm_pkg, e_num_sends)); int_buf_data = hypre_CTAlloc(HYPRE_Int, index, HYPRE_MEMORY_HOST); /* orig commpkg data*/ index = 0; HYPRE_Int begin = hypre_ParCSRCommPkgSendMapStart(comm_pkg, 0); HYPRE_Int end = hypre_ParCSRCommPkgSendMapStart(comm_pkg, num_sends); #ifdef HYPRE_USING_OPENMP #pragma omp parallel for HYPRE_SMP_SCHEDULE #endif for (i = begin; i < end; ++i) { int_buf_data[i - begin] = IN_marker[hypre_ParCSRCommPkgSendMapElmt(comm_pkg, i)]; } comm_handle = hypre_ParCSRCommHandleCreate( 11, comm_pkg, int_buf_data, OUT_marker); hypre_ParCSRCommHandleDestroy(comm_handle); comm_handle = NULL; /* now do the extend commpkg */ /* first we need to shift our position in the OUT_marker */ shift = recv_vec_starts[num_recvs]; e_out_marker = OUT_marker + shift; index = 0; begin = hypre_ParCSRCommPkgSendMapStart(extend_comm_pkg, 0); end = hypre_ParCSRCommPkgSendMapStart(extend_comm_pkg, e_num_sends); #ifdef HYPRE_USING_OPENMP #pragma omp parallel for HYPRE_SMP_SCHEDULE #endif for (i = begin; i < end; ++i) { int_buf_data[i - begin] = IN_marker[hypre_ParCSRCommPkgSendMapElmt(extend_comm_pkg, i)]; } comm_handle = hypre_ParCSRCommHandleCreate( 11, extend_comm_pkg, int_buf_data, e_out_marker); hypre_ParCSRCommHandleDestroy(comm_handle); comm_handle = NULL; hypre_TFree(int_buf_data, HYPRE_MEMORY_HOST); return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_big_insert_new_nodes *--------------------------------------------------------------------------*/ HYPRE_Int hypre_big_insert_new_nodes(hypre_ParCSRCommPkg *comm_pkg, hypre_ParCSRCommPkg *extend_comm_pkg, HYPRE_Int *IN_marker, HYPRE_Int full_off_procNodes, HYPRE_BigInt offset, HYPRE_BigInt *OUT_marker) { HYPRE_UNUSED_VAR(full_off_procNodes); hypre_ParCSRCommHandle *comm_handle; HYPRE_Int i, index, shift; HYPRE_Int num_sends, num_recvs; HYPRE_Int *recv_vec_starts; HYPRE_Int e_num_sends; HYPRE_BigInt *int_buf_data; HYPRE_BigInt *e_out_marker; num_sends = hypre_ParCSRCommPkgNumSends(comm_pkg); num_recvs = hypre_ParCSRCommPkgNumRecvs(comm_pkg); recv_vec_starts = hypre_ParCSRCommPkgRecvVecStarts(comm_pkg); e_num_sends = hypre_ParCSRCommPkgNumSends(extend_comm_pkg); index = hypre_max(hypre_ParCSRCommPkgSendMapStart(comm_pkg, num_sends), hypre_ParCSRCommPkgSendMapStart(extend_comm_pkg, e_num_sends)); int_buf_data = hypre_CTAlloc(HYPRE_BigInt, index, HYPRE_MEMORY_HOST); /* orig commpkg data*/ index = 0; HYPRE_Int begin = hypre_ParCSRCommPkgSendMapStart(comm_pkg, 0); HYPRE_Int end = hypre_ParCSRCommPkgSendMapStart(comm_pkg, num_sends); #ifdef HYPRE_USING_OPENMP #pragma omp parallel for HYPRE_SMP_SCHEDULE #endif for (i = begin; i < end; ++i) { int_buf_data[i - begin] = offset + (HYPRE_BigInt) IN_marker[hypre_ParCSRCommPkgSendMapElmt(comm_pkg, i)]; } comm_handle = hypre_ParCSRCommHandleCreate(21, comm_pkg, int_buf_data, OUT_marker); hypre_ParCSRCommHandleDestroy(comm_handle); comm_handle = NULL; /* now do the extend commpkg */ /* first we need to shift our position in the OUT_marker */ shift = recv_vec_starts[num_recvs]; e_out_marker = OUT_marker + shift; index = 0; begin = hypre_ParCSRCommPkgSendMapStart(extend_comm_pkg, 0); end = hypre_ParCSRCommPkgSendMapStart(extend_comm_pkg, e_num_sends); #ifdef HYPRE_USING_OPENMP #pragma omp parallel for HYPRE_SMP_SCHEDULE #endif for (i = begin; i < end; ++i) { int_buf_data[i - begin] = offset + (HYPRE_BigInt) IN_marker[hypre_ParCSRCommPkgSendMapElmt(extend_comm_pkg, i)]; } comm_handle = hypre_ParCSRCommHandleCreate( 21, extend_comm_pkg, int_buf_data, e_out_marker); hypre_ParCSRCommHandleDestroy(comm_handle); comm_handle = NULL; hypre_TFree(int_buf_data, HYPRE_MEMORY_HOST); return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_ssort * * Sort for non-ordered arrays * * TODO (VPM): move this to utilities? *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ssort(HYPRE_BigInt *data, HYPRE_Int n) { HYPRE_Int i, si; HYPRE_Int change = 0; if (n > 0) { for (i = n - 1; i > 0; i--) { si = hypre_index_of_minimum(data, i + 1); if (i != si) { hypre_swap_int(data, i, si); change = 1; } } } return change; } /*-------------------------------------------------------------------------- * hypre_index_of_minimum * * TODO (VPM): move this to utilities? *--------------------------------------------------------------------------*/ HYPRE_Int hypre_index_of_minimum(HYPRE_BigInt *data, HYPRE_Int n) { HYPRE_Int answer; HYPRE_Int i; answer = 0; for (i = 1; i < n; i++) { if (data[answer] < data[i]) { answer = i; } } return answer; } /*-------------------------------------------------------------------------- * hypre_swap_int * * TODO (VPM): move this to utilities? *--------------------------------------------------------------------------*/ void hypre_swap_int(HYPRE_BigInt *data, HYPRE_Int a, HYPRE_Int b) { HYPRE_BigInt temp; temp = data[a]; data[a] = data[b]; data[b] = temp; return; } /*-------------------------------------------------------------------------- * hypre_initialize_vecs * * Initialize CF_marker_offd, CF_marker, P_marker, P_marker_offd, tmp *--------------------------------------------------------------------------*/ void hypre_initialize_vecs(HYPRE_Int diag_n, HYPRE_Int offd_n, HYPRE_Int *diag_ftc, HYPRE_BigInt *offd_ftc, HYPRE_Int *diag_pm, HYPRE_Int *offd_pm, HYPRE_Int *tmp_CF) { HYPRE_Int i; /* Quicker initialization */ if (offd_n < diag_n) { #ifdef HYPRE_USING_OPENMP #pragma omp parallel for HYPRE_SMP_SCHEDULE #endif for (i = 0; i < offd_n; i++) { diag_ftc[i] = -1; offd_ftc[i] = -1; tmp_CF[i] = -1; if (diag_pm != NULL) { diag_pm[i] = -1; } if (offd_pm != NULL) { offd_pm[i] = -1; } } #ifdef HYPRE_USING_OPENMP #pragma omp parallel for HYPRE_SMP_SCHEDULE #endif for (i = offd_n; i < diag_n; i++) { diag_ftc[i] = -1; if (diag_pm != NULL) { diag_pm[i] = -1; } } } else { #ifdef HYPRE_USING_OPENMP #pragma omp parallel for HYPRE_SMP_SCHEDULE #endif for (i = 0; i < diag_n; i++) { diag_ftc[i] = -1; offd_ftc[i] = -1; tmp_CF[i] = -1; if (diag_pm != NULL) { diag_pm[i] = -1; } if (offd_pm != NULL) { offd_pm[i] = -1; } } #ifdef HYPRE_USING_OPENMP #pragma omp parallel for HYPRE_SMP_SCHEDULE #endif for (i = diag_n; i < offd_n; i++) { offd_ftc[i] = -1; tmp_CF[i] = -1; if (offd_pm != NULL) { offd_pm[i] = -1; } } } return; } /*-------------------------------------------------------------------------- * hypre_new_offd_nodes * * Find nodes that are offd and are not contained in original offd * (neighbors of neighbors) *--------------------------------------------------------------------------*/ static HYPRE_Int hypre_new_offd_nodes(HYPRE_BigInt **found, HYPRE_Int num_cols_A_offd, HYPRE_Int *A_ext_i, HYPRE_BigInt *A_ext_j, HYPRE_Int num_cols_S_offd, HYPRE_BigInt *col_map_offd, HYPRE_BigInt col_1, HYPRE_BigInt col_n, HYPRE_Int *Sop_i, HYPRE_BigInt *Sop_j, HYPRE_Int *CF_marker_offd) { HYPRE_UNUSED_VAR(num_cols_S_offd); #ifdef HYPRE_PROFILE hypre_profile_times[HYPRE_TIMER_ID_RENUMBER_COLIDX] -= hypre_MPI_Wtime(); #endif HYPRE_BigInt big_i1, big_k1; HYPRE_Int i, j, kk; HYPRE_Int got_loc, loc_col; /*HYPRE_Int min;*/ HYPRE_Int newoff = 0; #ifdef HYPRE_CONCURRENT_HOPSCOTCH hypre_UnorderedBigIntMap col_map_offd_inverse; hypre_UnorderedBigIntMapCreate(&col_map_offd_inverse, 2 * num_cols_A_offd, 16 * hypre_NumThreads()); #pragma omp parallel for HYPRE_SMP_SCHEDULE for (i = 0; i < num_cols_A_offd; i++) { hypre_UnorderedBigIntMapPutIfAbsent(&col_map_offd_inverse, col_map_offd[i], i); } /* Find nodes that will be added to the off diag list */ HYPRE_Int size_offP = A_ext_i[num_cols_A_offd]; hypre_UnorderedBigIntSet set; hypre_UnorderedBigIntSetCreate(&set, size_offP, 16 * hypre_NumThreads()); #pragma omp parallel private(i,j,big_i1) { #pragma omp for HYPRE_SMP_SCHEDULE for (i = 0; i < num_cols_A_offd; i++) { if (CF_marker_offd[i] < 0) { for (j = A_ext_i[i]; j < A_ext_i[i + 1]; j++) { big_i1 = A_ext_j[j]; if (big_i1 < col_1 || big_i1 >= col_n) { if (!hypre_UnorderedBigIntSetContains(&set, big_i1)) { HYPRE_Int k = hypre_UnorderedBigIntMapGet(&col_map_offd_inverse, big_i1); if (-1 == k) { hypre_UnorderedBigIntSetPut(&set, big_i1); } else { A_ext_j[j] = -k - 1; } } } } for (j = Sop_i[i]; j < Sop_i[i + 1]; j++) { big_i1 = Sop_j[j]; if (big_i1 < col_1 || big_i1 >= col_n) { if (!hypre_UnorderedBigIntSetContains(&set, big_i1)) { HYPRE_Int k = hypre_UnorderedBigIntMapGet(&col_map_offd_inverse, big_i1); if (-1 == k) { hypre_UnorderedBigIntSetPut(&set, big_i1); } else { Sop_j[j] = -k - 1; } } } } } /* CF_marker_offd[i] < 0 */ } /* for each row */ } /* omp parallel */ hypre_UnorderedBigIntMapDestroy(&col_map_offd_inverse); HYPRE_BigInt *tmp_found = hypre_UnorderedBigIntSetCopyToArray(&set, &newoff); hypre_UnorderedBigIntSetDestroy(&set); /* Put found in monotone increasing order */ #ifdef HYPRE_PROFILE hypre_profile_times[HYPRE_TIMER_ID_MERGE] -= hypre_MPI_Wtime(); #endif hypre_UnorderedBigIntMap tmp_found_inverse; if (newoff > 0) { hypre_big_sort_and_create_inverse_map(tmp_found, newoff, &tmp_found, &tmp_found_inverse); } #ifdef HYPRE_PROFILE hypre_profile_times[HYPRE_TIMER_ID_MERGE] += hypre_MPI_Wtime(); #endif /* Set column indices for Sop and A_ext such that offd nodes are * negatively indexed */ #pragma omp parallel for private(kk,big_k1,got_loc,loc_col) HYPRE_SMP_SCHEDULE for (i = 0; i < num_cols_A_offd; i++) { if (CF_marker_offd[i] < 0) { for (kk = Sop_i[i]; kk < Sop_i[i + 1]; kk++) { big_k1 = Sop_j[kk]; if (big_k1 > -1 && (big_k1 < col_1 || big_k1 >= col_n)) { got_loc = hypre_UnorderedBigIntMapGet(&tmp_found_inverse, big_k1); loc_col = got_loc + num_cols_A_offd; Sop_j[kk] = (HYPRE_BigInt)(-loc_col - 1); } } for (kk = A_ext_i[i]; kk < A_ext_i[i + 1]; kk++) { big_k1 = A_ext_j[kk]; if (big_k1 > -1 && (big_k1 < col_1 || big_k1 >= col_n)) { got_loc = hypre_UnorderedBigIntMapGet(&tmp_found_inverse, big_k1); loc_col = got_loc + num_cols_A_offd; A_ext_j[kk] = (HYPRE_BigInt)(-loc_col - 1); } } } } if (newoff) { hypre_UnorderedBigIntMapDestroy(&tmp_found_inverse); } #else /* !HYPRE_CONCURRENT_HOPSCOTCH */ HYPRE_Int size_offP; HYPRE_BigInt *tmp_found; HYPRE_Int min; HYPRE_Int ifound; HYPRE_BigInt ifound_big; size_offP = A_ext_i[num_cols_A_offd] + Sop_i[num_cols_A_offd]; tmp_found = hypre_CTAlloc(HYPRE_BigInt, size_offP, HYPRE_MEMORY_HOST); /* Find nodes that will be added to the off diag list */ for (i = 0; i < num_cols_A_offd; i++) { if (CF_marker_offd[i] < 0) { for (j = A_ext_i[i]; j < A_ext_i[i + 1]; j++) { big_i1 = A_ext_j[j]; if (big_i1 < col_1 || big_i1 >= col_n) { ifound = hypre_BigBinarySearch(col_map_offd, big_i1, num_cols_A_offd); if (ifound == -1) { tmp_found[newoff] = big_i1; newoff++; } else { A_ext_j[j] = (HYPRE_BigInt)(-ifound - 1); } } } for (j = Sop_i[i]; j < Sop_i[i + 1]; j++) { big_i1 = Sop_j[j]; if (big_i1 < col_1 || big_i1 >= col_n) { ifound = hypre_BigBinarySearch(col_map_offd, big_i1, num_cols_A_offd); if (ifound == -1) { tmp_found[newoff] = big_i1; newoff++; } else { Sop_j[j] = (HYPRE_BigInt)(-ifound - 1); } } } } } /* Put found in monotone increasing order */ if (newoff > 0) { hypre_BigQsort0(tmp_found, 0, newoff - 1); ifound_big = tmp_found[0]; min = 1; for (i = 1; i < newoff; i++) { if (tmp_found[i] > ifound_big) { ifound_big = tmp_found[i]; tmp_found[min++] = ifound_big; } } newoff = min; } /* Set column indices for Sop and A_ext such that offd nodes are * negatively indexed */ for (i = 0; i < num_cols_A_offd; i++) { if (CF_marker_offd[i] < 0) { for (kk = Sop_i[i]; kk < Sop_i[i + 1]; kk++) { big_k1 = Sop_j[kk]; if (big_k1 > -1 && (big_k1 < col_1 || big_k1 >= col_n)) { got_loc = hypre_BigBinarySearch(tmp_found, big_k1, newoff); if (got_loc > -1) { loc_col = got_loc + num_cols_A_offd; Sop_j[kk] = (HYPRE_BigInt)(-loc_col - 1); } } } for (kk = A_ext_i[i]; kk < A_ext_i[i + 1]; kk++) { big_k1 = A_ext_j[kk]; if (big_k1 > -1 && (big_k1 < col_1 || big_k1 >= col_n)) { got_loc = hypre_BigBinarySearch(tmp_found, big_k1, newoff); if (got_loc > -1) { loc_col = got_loc + num_cols_A_offd; A_ext_j[kk] = (HYPRE_BigInt)(-loc_col - 1); } } } } } #endif /* !HYPRE_CONCURRENT_HOPSCOTCH */ *found = tmp_found; #ifdef HYPRE_PROFILE hypre_profile_times[HYPRE_TIMER_ID_RENUMBER_COLIDX] += hypre_MPI_Wtime(); #endif return newoff; } /*-------------------------------------------------------------------------- * hypre_exchange_marker *--------------------------------------------------------------------------*/ HYPRE_Int hypre_exchange_marker(hypre_ParCSRCommPkg *comm_pkg, HYPRE_Int *IN_marker, HYPRE_Int *OUT_marker) { HYPRE_Int num_sends = hypre_ParCSRCommPkgNumSends(comm_pkg); HYPRE_Int begin = hypre_ParCSRCommPkgSendMapStart(comm_pkg, 0); HYPRE_Int end = hypre_ParCSRCommPkgSendMapStart(comm_pkg, num_sends); HYPRE_Int *int_buf_data = hypre_CTAlloc(HYPRE_Int, end, HYPRE_MEMORY_HOST); hypre_ParCSRCommHandle *comm_handle; HYPRE_Int i; #ifdef HYPRE_USING_OPENMP #pragma omp parallel for HYPRE_SMP_SCHEDULE #endif for (i = begin; i < end; ++i) { int_buf_data[i - begin] = IN_marker[hypre_ParCSRCommPkgSendMapElmt(comm_pkg, i)]; } comm_handle = hypre_ParCSRCommHandleCreate(11, comm_pkg, int_buf_data, OUT_marker); hypre_ParCSRCommHandleDestroy(comm_handle); hypre_TFree(int_buf_data, HYPRE_MEMORY_HOST); return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_exchange_interp_data * * skip_fine_or_same_sign: if we want to skip fine points in S and nnz with * the same sign as diagonal in A *--------------------------------------------------------------------------*/ HYPRE_Int hypre_exchange_interp_data(HYPRE_Int **CF_marker_offd, HYPRE_Int **dof_func_offd, hypre_CSRMatrix **A_ext, HYPRE_Int *full_off_procNodes, hypre_CSRMatrix **Sop, hypre_ParCSRCommPkg **extend_comm_pkg, hypre_ParCSRMatrix *A, HYPRE_Int *CF_marker, hypre_ParCSRMatrix *S, HYPRE_Int num_functions, HYPRE_Int *dof_func, HYPRE_Int skip_fine_or_same_sign) { #ifdef HYPRE_PROFILE hypre_profile_times[HYPRE_TIMER_ID_EXCHANGE_INTERP_DATA] -= hypre_MPI_Wtime(); #endif hypre_ParCSRCommPkg *comm_pkg = hypre_ParCSRMatrixCommPkg(A); hypre_CSRMatrix *A_diag = hypre_ParCSRMatrixDiag(A); hypre_CSRMatrix *A_offd = hypre_ParCSRMatrixOffd(A); HYPRE_Int num_cols_A_offd = hypre_CSRMatrixNumCols(A_offd); HYPRE_BigInt *col_map_offd = hypre_ParCSRMatrixColMapOffd(A); HYPRE_BigInt col_1 = hypre_ParCSRMatrixFirstRowIndex(A); HYPRE_Int local_numrows = hypre_CSRMatrixNumRows(A_diag); HYPRE_BigInt col_n = col_1 + (HYPRE_BigInt) local_numrows; HYPRE_BigInt *found = NULL; hypre_ParCSRCommHandle *comm_handle_s_idx; /*---------------------------------------------------------------------- * Get the off processors rows for A and S, associated with columns in * A_offd and S_offd. *---------------------------------------------------------------------*/ *CF_marker_offd = hypre_TAlloc(HYPRE_Int, num_cols_A_offd, HYPRE_MEMORY_HOST); hypre_exchange_marker(comm_pkg, CF_marker, *CF_marker_offd); hypre_ParCSRCommHandle *comm_handle_a_idx, *comm_handle_a_data; *A_ext = hypre_ParCSRMatrixExtractBExt_Overlap(A, A, 1, &comm_handle_a_idx, &comm_handle_a_data, CF_marker, *CF_marker_offd, skip_fine_or_same_sign, skip_fine_or_same_sign); HYPRE_Int *A_ext_i = hypre_CSRMatrixI(*A_ext); HYPRE_BigInt *A_ext_j = hypre_CSRMatrixBigJ(*A_ext); HYPRE_Int A_ext_rows = hypre_CSRMatrixNumRows(*A_ext); *Sop = hypre_ParCSRMatrixExtractBExt_Overlap(S, A, 0, &comm_handle_s_idx, NULL, CF_marker, *CF_marker_offd, skip_fine_or_same_sign, 0); HYPRE_Int *Sop_i = hypre_CSRMatrixI(*Sop); HYPRE_BigInt *Sop_j = hypre_CSRMatrixBigJ(*Sop); HYPRE_Int Soprows = hypre_CSRMatrixNumRows(*Sop); HYPRE_Int *send_idx = (HYPRE_Int *) comm_handle_s_idx->send_data; hypre_ParCSRCommHandleDestroy(comm_handle_s_idx); hypre_TFree(send_idx, HYPRE_MEMORY_HOST); send_idx = (HYPRE_Int *)comm_handle_a_idx->send_data; hypre_ParCSRCommHandleDestroy(comm_handle_a_idx); hypre_TFree(send_idx, HYPRE_MEMORY_HOST); /* Find nodes that are neighbors of neighbors, not found in offd */ #ifdef HYPRE_PROFILE hypre_profile_times[HYPRE_TIMER_ID_EXCHANGE_INTERP_DATA] += hypre_MPI_Wtime(); #endif HYPRE_Int newoff = hypre_new_offd_nodes(&found, A_ext_rows, A_ext_i, A_ext_j, Soprows, col_map_offd, col_1, col_n, Sop_i, Sop_j, *CF_marker_offd); #ifdef HYPRE_PROFILE hypre_profile_times[HYPRE_TIMER_ID_EXCHANGE_INTERP_DATA] -= hypre_MPI_Wtime(); #endif if (newoff >= 0) { *full_off_procNodes = newoff + num_cols_A_offd; } else { return hypre_error_flag; } /* Possibly add new points and new processors to the comm_pkg, all * processors need new_comm_pkg */ /* AHB - create a new comm package just for extended info - this will work better with the assumed partition*/ hypre_ParCSRFindExtendCommPkg(hypre_ParCSRMatrixComm(A), hypre_ParCSRMatrixGlobalNumCols(A), hypre_ParCSRMatrixFirstColDiag(A), hypre_CSRMatrixNumCols(A_diag), hypre_ParCSRMatrixColStarts(A), hypre_ParCSRMatrixAssumedPartition(A), newoff, found, extend_comm_pkg); *CF_marker_offd = hypre_TReAlloc(*CF_marker_offd, HYPRE_Int, *full_off_procNodes, HYPRE_MEMORY_HOST); hypre_exchange_marker(*extend_comm_pkg, CF_marker, *CF_marker_offd + A_ext_rows); if (num_functions > 1) { if (*full_off_procNodes > 0) { *dof_func_offd = hypre_CTAlloc(HYPRE_Int, *full_off_procNodes, HYPRE_MEMORY_HOST); } hypre_alt_insert_new_nodes(comm_pkg, *extend_comm_pkg, dof_func, *full_off_procNodes, *dof_func_offd); } hypre_TFree(found, HYPRE_MEMORY_HOST); HYPRE_Real *send_data = (HYPRE_Real *)comm_handle_a_data->send_data; hypre_ParCSRCommHandleDestroy(comm_handle_a_data); hypre_TFree(send_data, HYPRE_MEMORY_HOST); #ifdef HYPRE_PROFILE hypre_profile_times[HYPRE_TIMER_ID_EXCHANGE_INTERP_DATA] += hypre_MPI_Wtime(); #endif return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_build_interp_colmap *--------------------------------------------------------------------------*/ void hypre_build_interp_colmap(hypre_ParCSRMatrix *P, HYPRE_Int full_off_procNodes, HYPRE_Int *tmp_CF_marker_offd, HYPRE_BigInt *fine_to_coarse_offd) { #ifdef HYPRE_PROFILE hypre_profile_times[HYPRE_TIMER_ID_RENUMBER_COLIDX] -= hypre_MPI_Wtime(); #endif HYPRE_Int n_fine = hypre_CSRMatrixNumRows(P->diag); HYPRE_Int P_offd_size = P->offd->i[n_fine]; HYPRE_Int *P_offd_j = P->offd->j; HYPRE_BigInt *col_map_offd_P = NULL; HYPRE_Int *P_marker = NULL; HYPRE_Int *prefix_sum_workspace; HYPRE_Int num_cols_P_offd = 0; HYPRE_Int i, index; if (full_off_procNodes) { P_marker = hypre_TAlloc(HYPRE_Int, full_off_procNodes, HYPRE_MEMORY_HOST); } prefix_sum_workspace = hypre_TAlloc(HYPRE_Int, hypre_NumThreads() + 1, HYPRE_MEMORY_HOST); #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i) HYPRE_SMP_SCHEDULE #endif for (i = 0; i < full_off_procNodes; i++) { P_marker[i] = 0; } /* These two loops set P_marker[i] to 1 if it appears in P_offd_j and if * tmp_CF_marker_offd has i marked. num_cols_P_offd is then set to the * total number of times P_marker is set */ #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i,index) HYPRE_SMP_SCHEDULE #endif for (i = 0; i < P_offd_size; i++) { index = P_offd_j[i]; if (tmp_CF_marker_offd[index] >= 0) { P_marker[index] = 1; } } #ifdef HYPRE_USING_OPENMP #pragma omp parallel private(i) #endif { HYPRE_Int i_begin, i_end; hypre_GetSimpleThreadPartition(&i_begin, &i_end, full_off_procNodes); HYPRE_Int local_num_cols_P_offd = 0; for (i = i_begin; i < i_end; i++) { if (P_marker[i] == 1) { local_num_cols_P_offd++; } } hypre_prefix_sum(&local_num_cols_P_offd, &num_cols_P_offd, prefix_sum_workspace); #ifdef HYPRE_USING_OPENMP #pragma omp master #endif { if (num_cols_P_offd) { col_map_offd_P = hypre_TAlloc(HYPRE_BigInt, num_cols_P_offd, HYPRE_MEMORY_HOST); } } #ifdef HYPRE_USING_OPENMP #pragma omp barrier #endif for (i = i_begin; i < i_end; i++) { if (P_marker[i] == 1) { col_map_offd_P[local_num_cols_P_offd++] = fine_to_coarse_offd[i]; } } } hypre_UnorderedBigIntMap col_map_offd_P_inverse; hypre_big_sort_and_create_inverse_map(col_map_offd_P, num_cols_P_offd, &col_map_offd_P, &col_map_offd_P_inverse); // find old idx -> new idx map #ifdef HYPRE_USING_OPENMP #pragma omp parallel for #endif for (i = 0; i < full_off_procNodes; i++) { P_marker[i] = hypre_UnorderedBigIntMapGet(&col_map_offd_P_inverse, fine_to_coarse_offd[i]); } if (num_cols_P_offd) { hypre_UnorderedBigIntMapDestroy(&col_map_offd_P_inverse); } #ifdef HYPRE_USING_OPENMP #pragma omp parallel for #endif for (i = 0; i < P_offd_size; i++) { P_offd_j[i] = P_marker[P_offd_j[i]]; } hypre_TFree(P_marker, HYPRE_MEMORY_HOST); hypre_TFree(prefix_sum_workspace, HYPRE_MEMORY_HOST); if (num_cols_P_offd) { hypre_ParCSRMatrixColMapOffd(P) = col_map_offd_P; hypre_CSRMatrixNumCols(P->offd) = num_cols_P_offd; } #ifdef HYPRE_PROFILE hypre_profile_times[HYPRE_TIMER_ID_RENUMBER_COLIDX] += hypre_MPI_Wtime(); #endif } hypre-2.33.0/src/parcsr_ls/aux_interp.h000066400000000000000000000040031477326011500200370ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #ifdef __cplusplus extern "C" { #endif void hypre_ParCSRCommExtendA(hypre_ParCSRMatrix *A, HYPRE_Int newoff, HYPRE_Int *found, HYPRE_Int *p_num_recvs, HYPRE_Int **p_recv_procs, HYPRE_Int **p_recv_vec_starts, HYPRE_Int *p_num_sends, HYPRE_Int **p_send_procs, HYPRE_Int **p_send_map_starts, HYPRE_Int **p_send_map_elmts, HYPRE_Int **p_node_add); HYPRE_Int alt_insert_new_nodes(hypre_ParCSRCommPkg *comm_pkg, hypre_ParCSRCommPkg *extend_comm_pkg, HYPRE_Int *IN_marker, HYPRE_Int full_off_procNodes, HYPRE_Int *OUT_marker); HYPRE_Int hypre_ssort(HYPRE_BigInt *data, HYPRE_Int n); HYPRE_Int index_of_minimum(HYPRE_BigInt *data, HYPRE_Int n); void swap_int(HYPRE_BigInt *data, HYPRE_Int a, HYPRE_Int b); void initialize_vecs(HYPRE_Int diag_n, HYPRE_Int offd_n, HYPRE_Int *diag_ftc, HYPRE_Int *offd_ftc, HYPRE_Int *diag_pm, HYPRE_Int *offd_pm, HYPRE_Int *tmp_CF); HYPRE_Int exchange_interp_data( HYPRE_Int **CF_marker_offd, HYPRE_Int **dof_func_offd, hypre_CSRMatrix **A_ext, HYPRE_Int *full_off_procNodes, hypre_CSRMatrix **Sop, hypre_ParCSRCommPkg **extend_comm_pkg, hypre_ParCSRMatrix *A, HYPRE_Int *CF_marker, hypre_ParCSRMatrix *S, HYPRE_Int num_functions, HYPRE_Int *dof_func, HYPRE_Int skip_fine_or_same_sign); void build_interp_colmap(hypre_ParCSRMatrix *P, HYPRE_Int full_off_procNodes, HYPRE_Int *tmp_CF_marker_offd, HYPRE_Int *fine_to_coarse_offd); #ifdef __cplusplus } #endif hypre-2.33.0/src/parcsr_ls/block_tridiag.c000066400000000000000000000303321477326011500204550ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * BlockTridiag functions * *****************************************************************************/ #include "HYPRE.h" #include "utilities/_hypre_utilities.h" #include "IJ_mv/_hypre_IJ_mv.h" #include "parcsr_mv/_hypre_parcsr_mv.h" #include "block_tridiag.h" /*-------------------------------------------------------------------------- * hypre_BlockTridiagCreate *--------------------------------------------------------------------------*/ void *hypre_BlockTridiagCreate(void) { hypre_BlockTridiagData *b_data; b_data = hypre_CTAlloc(hypre_BlockTridiagData, 1, HYPRE_MEMORY_HOST); b_data->threshold = 0.0; b_data->num_sweeps = 1; b_data->relax_type = 6; b_data->print_level = 0; b_data->index_set1 = NULL; b_data->index_set2 = NULL; b_data->F1 = NULL; b_data->F2 = NULL; b_data->U1 = NULL; b_data->U2 = NULL; b_data->A11 = NULL; b_data->A21 = NULL; b_data->A22 = NULL; b_data->precon1 = NULL; b_data->precon2 = NULL; return (void *) b_data; } /*-------------------------------------------------------------------------- * hypre_BoomerAMGDestroy *--------------------------------------------------------------------------*/ HYPRE_Int hypre_BlockTridiagDestroy(void *data) { hypre_BlockTridiagData *b_data = (hypre_BlockTridiagData *) data; if (b_data->F1) { hypre_ParVectorDestroy(b_data->F1); b_data->F1 = NULL; } if (b_data->F2) { hypre_ParVectorDestroy(b_data->F2); b_data->F2 = NULL; } if (b_data->U1) { hypre_ParVectorDestroy(b_data->U1); b_data->U1 = NULL; } if (b_data->U2) { hypre_ParVectorDestroy(b_data->U2); b_data->U2 = NULL; } if (b_data->index_set1) { hypre_TFree(b_data->index_set1, HYPRE_MEMORY_HOST); b_data->index_set1 = NULL; } if (b_data->index_set2) { hypre_TFree(b_data->index_set2, HYPRE_MEMORY_HOST); b_data->index_set2 = NULL; } if (b_data->A11) { hypre_ParCSRMatrixDestroy(b_data->A11); b_data->A11 = NULL; } if (b_data->A21) { hypre_ParCSRMatrixDestroy(b_data->A21); b_data->A21 = NULL; } if (b_data->A22) { hypre_ParCSRMatrixDestroy(b_data->A22); b_data->A22 = NULL; } if (b_data->precon1) { HYPRE_BoomerAMGDestroy(b_data->precon1); b_data->precon1 = NULL; } if (b_data->precon2) { HYPRE_BoomerAMGDestroy(b_data->precon2); b_data->precon2 = NULL; } hypre_TFree(b_data, HYPRE_MEMORY_HOST); return (0); } /*-------------------------------------------------------------------------- * Routines to setup the preconditioner *--------------------------------------------------------------------------*/ HYPRE_Int hypre_BlockTridiagSetup(void *data, hypre_ParCSRMatrix *A, hypre_ParVector *b, hypre_ParVector *x) { HYPRE_UNUSED_VAR(b); HYPRE_UNUSED_VAR(x); HYPRE_Int i, j, *index_set1, print_level, nsweeps, relax_type; HYPRE_Int nrows, nrows1, nrows2, start1, start2, *index_set2; HYPRE_Int count, ierr; HYPRE_Real threshold; hypre_ParCSRMatrix **submatrices; HYPRE_Solver precon1; HYPRE_Solver precon2; HYPRE_IJVector ij_u1, ij_u2, ij_f1, ij_f2; hypre_ParVector *vector; MPI_Comm comm; hypre_BlockTridiagData *b_data = (hypre_BlockTridiagData *) data; HYPRE_ParCSRMatrixGetComm((HYPRE_ParCSRMatrix) A, &comm); index_set1 = b_data->index_set1; nrows1 = index_set1[0]; nrows = hypre_ParCSRMatrixNumRows(A); nrows2 = nrows - nrows1; b_data->index_set2 = hypre_CTAlloc(HYPRE_Int, nrows2 + 1, HYPRE_MEMORY_HOST); index_set2 = b_data->index_set2; index_set2[0] = nrows2; count = 1; for (i = 0; i < index_set1[1]; i++) { index_set2[count++] = i; } for (i = 1; i < nrows1; i++) for (j = index_set1[i] + 1; j < index_set1[i + 1]; j++) { index_set2[count++] = j; } for (i = index_set1[nrows1] + 1; i < nrows; i++) { index_set2[count++] = i; } submatrices = hypre_CTAlloc(hypre_ParCSRMatrix *, 4, HYPRE_MEMORY_HOST); hypre_ParCSRMatrixExtractSubmatrices(A, index_set1, &submatrices); nrows1 = hypre_ParCSRMatrixNumRows(submatrices[0]); nrows2 = hypre_ParCSRMatrixNumRows(submatrices[3]); start1 = hypre_ParCSRMatrixFirstRowIndex(submatrices[0]); start2 = hypre_ParCSRMatrixFirstRowIndex(submatrices[3]); HYPRE_IJVectorCreate(comm, start1, start1 + nrows1 - 1, &ij_u1); HYPRE_IJVectorSetObjectType(ij_u1, HYPRE_PARCSR); ierr = HYPRE_IJVectorInitialize(ij_u1); ierr += HYPRE_IJVectorAssemble(ij_u1); hypre_assert(!ierr); HYPRE_IJVectorCreate(comm, start1, start1 + nrows1 - 1, &ij_f1); HYPRE_IJVectorSetObjectType(ij_f1, HYPRE_PARCSR); ierr = HYPRE_IJVectorInitialize(ij_f1); ierr += HYPRE_IJVectorAssemble(ij_f1); hypre_assert(!ierr); HYPRE_IJVectorCreate(comm, start2, start2 + nrows2 - 1, &ij_u2); HYPRE_IJVectorSetObjectType(ij_u2, HYPRE_PARCSR); ierr = HYPRE_IJVectorInitialize(ij_u2); ierr += HYPRE_IJVectorAssemble(ij_u2); hypre_assert(!ierr); HYPRE_IJVectorCreate(comm, start2, start2 + nrows1 - 1, &ij_f2); HYPRE_IJVectorSetObjectType(ij_f2, HYPRE_PARCSR); ierr = HYPRE_IJVectorInitialize(ij_f2); ierr += HYPRE_IJVectorAssemble(ij_f2); hypre_assert(!ierr); HYPRE_IJVectorGetObject(ij_f1, (void **) &vector); b_data->F1 = vector; HYPRE_IJVectorGetObject(ij_u1, (void **) &vector); b_data->U1 = vector; HYPRE_IJVectorGetObject(ij_f2, (void **) &vector); b_data->F2 = vector; HYPRE_IJVectorGetObject(ij_u2, (void **) &vector); b_data->U2 = vector; print_level = b_data->print_level; threshold = b_data->threshold; nsweeps = b_data->num_sweeps; relax_type = b_data->relax_type; threshold = b_data->threshold; HYPRE_BoomerAMGCreate(&precon1); HYPRE_BoomerAMGSetMaxIter(precon1, 1); HYPRE_BoomerAMGSetCycleType(precon1, 1); HYPRE_BoomerAMGSetPrintLevel(precon1, print_level); HYPRE_BoomerAMGSetMaxLevels(precon1, 25); HYPRE_BoomerAMGSetMeasureType(precon1, 0); HYPRE_BoomerAMGSetCoarsenType(precon1, 0); HYPRE_BoomerAMGSetStrongThreshold(precon1, threshold); HYPRE_BoomerAMGSetNumFunctions(precon1, 1); HYPRE_BoomerAMGSetNumSweeps(precon1, nsweeps); HYPRE_BoomerAMGSetRelaxType(precon1, relax_type); hypre_BoomerAMGSetup(precon1, submatrices[0], b_data->U1, b_data->F1); HYPRE_BoomerAMGCreate(&precon2); HYPRE_BoomerAMGSetMaxIter(precon2, 1); HYPRE_BoomerAMGSetCycleType(precon2, 1); HYPRE_BoomerAMGSetPrintLevel(precon2, print_level); HYPRE_BoomerAMGSetMaxLevels(precon2, 25); HYPRE_BoomerAMGSetMeasureType(precon2, 0); HYPRE_BoomerAMGSetCoarsenType(precon2, 0); HYPRE_BoomerAMGSetMeasureType(precon2, 1); HYPRE_BoomerAMGSetStrongThreshold(precon2, threshold); HYPRE_BoomerAMGSetNumFunctions(precon2, 1); HYPRE_BoomerAMGSetNumSweeps(precon2, nsweeps); HYPRE_BoomerAMGSetRelaxType(precon2, relax_type); hypre_BoomerAMGSetup(precon2, submatrices[3], NULL, NULL); b_data->precon1 = precon1; b_data->precon2 = precon2; b_data->A11 = submatrices[0]; hypre_ParCSRMatrixDestroy(submatrices[1]); b_data->A21 = submatrices[2]; b_data->A22 = submatrices[3]; hypre_TFree(submatrices, HYPRE_MEMORY_HOST); return (0); } /*-------------------------------------------------------------------------- * Routines to solve the preconditioner *--------------------------------------------------------------------------*/ HYPRE_Int hypre_BlockTridiagSolve(void *data, hypre_ParCSRMatrix *A, hypre_ParVector *b, hypre_ParVector *x) { HYPRE_UNUSED_VAR(A); HYPRE_Int i, ind, nrows1, nrows2, *index_set1, *index_set2; HYPRE_Real *ffv, *uuv, *f1v, *f2v, *u1v, *u2v; HYPRE_ParCSRMatrix A21, A11, A22; hypre_ParVector *F1, *U1, *F2, *U2; HYPRE_Solver precon1, precon2; hypre_BlockTridiagData *b_data = (hypre_BlockTridiagData *) data; index_set1 = b_data->index_set1; index_set2 = b_data->index_set2; nrows1 = index_set1[0]; nrows2 = index_set2[0]; precon1 = b_data->precon1; precon2 = b_data->precon2; A11 = (HYPRE_ParCSRMatrix) b_data->A11; A22 = (HYPRE_ParCSRMatrix) b_data->A22; A21 = (HYPRE_ParCSRMatrix) b_data->A21; F1 = b_data->F1; U1 = b_data->U1; F2 = b_data->F2; U2 = b_data->U2; ffv = hypre_VectorData(hypre_ParVectorLocalVector(b)); uuv = hypre_VectorData(hypre_ParVectorLocalVector(x)); f1v = hypre_VectorData(hypre_ParVectorLocalVector(F1)); u1v = hypre_VectorData(hypre_ParVectorLocalVector(U1)); f2v = hypre_VectorData(hypre_ParVectorLocalVector(F2)); u2v = hypre_VectorData(hypre_ParVectorLocalVector(U2)); for (i = 0; i < nrows1; i++) { ind = index_set1[i + 1]; f1v[i] = ffv[ind]; u1v[i] = 0.0; } HYPRE_BoomerAMGSolve(precon1, A11, (HYPRE_ParVector) F1, (HYPRE_ParVector) U1); for (i = 0; i < nrows2; i++) { ind = index_set2[i + 1]; f2v[i] = ffv[ind]; u2v[i] = 0.0; } HYPRE_ParCSRMatrixMatvec(-1.0, A21, (HYPRE_ParVector) U1, 1.0, (HYPRE_ParVector) F2); HYPRE_BoomerAMGSolve(precon2, A22, (HYPRE_ParVector) F2, (HYPRE_ParVector) U2); for (i = 0; i < nrows1; i++) { ind = index_set1[i + 1]; uuv[ind] = u1v[i]; } for (i = 0; i < nrows2; i++) { ind = index_set2[i + 1]; uuv[ind] = u2v[i]; } return (0); } /*-------------------------------------------------------------------------- * Routines to set the index set for block 1 *--------------------------------------------------------------------------*/ HYPRE_Int hypre_BlockTridiagSetIndexSet(void *data, HYPRE_Int n, HYPRE_Int *inds) { HYPRE_Int i, ierr = 0, *indices; hypre_BlockTridiagData *b_data = (hypre_BlockTridiagData *) data; if (n <= 0 || inds == NULL) { ierr = 1; } b_data->index_set1 = hypre_CTAlloc(HYPRE_Int, n + 1, HYPRE_MEMORY_HOST); indices = b_data->index_set1; indices[0] = n; for (i = 0; i < n; i++) { indices[i + 1] = inds[i]; } return (ierr); } /*-------------------------------------------------------------------------- * Routines to set the strength threshold for AMG *--------------------------------------------------------------------------*/ HYPRE_Int hypre_BlockTridiagSetAMGStrengthThreshold(void *data, HYPRE_Real thresh) { hypre_BlockTridiagData *b_data = (hypre_BlockTridiagData *) data; b_data->threshold = thresh; return (0); } /*-------------------------------------------------------------------------- * Routines to set the number of relaxation sweeps for AMG *--------------------------------------------------------------------------*/ HYPRE_Int hypre_BlockTridiagSetAMGNumSweeps(void *data, HYPRE_Int nsweeps) { hypre_BlockTridiagData *b_data = (hypre_BlockTridiagData *) data; b_data->num_sweeps = nsweeps; return (0); } /*-------------------------------------------------------------------------- * Routines to set the relaxation method for AMG *--------------------------------------------------------------------------*/ HYPRE_Int hypre_BlockTridiagSetAMGRelaxType(void *data, HYPRE_Int relax_type) { hypre_BlockTridiagData *b_data = (hypre_BlockTridiagData *) data; b_data->relax_type = relax_type; return (0); } /*-------------------------------------------------------------------------- * Routines to set the print level *--------------------------------------------------------------------------*/ HYPRE_Int hypre_BlockTridiagSetPrintLevel(void *data, HYPRE_Int print_level) { hypre_BlockTridiagData *b_data = (hypre_BlockTridiagData *) data; b_data->print_level = print_level; return (0); } hypre-2.33.0/src/parcsr_ls/block_tridiag.h000066400000000000000000000035731477326011500204710ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #ifndef hypre_BLOCKTRIDIAG_HEADER #define hypre_BLOCKTRIDIAG_HEADER #include "parcsr_mv/_hypre_parcsr_mv.h" #include "parcsr_ls/_hypre_parcsr_ls.h" /*-------------------------------------------------------------------------- * hypre_BlockTridiag *--------------------------------------------------------------------------*/ typedef struct { HYPRE_Int num_sweeps; HYPRE_Int relax_type; HYPRE_Int *index_set1, *index_set2; HYPRE_Int print_level; HYPRE_Real threshold; hypre_ParCSRMatrix *A11, *A21, *A22; hypre_ParVector *F1, *U1, *F2, *U2; HYPRE_Solver precon1, precon2; } hypre_BlockTridiagData; /*-------------------------------------------------------------------------- * functions for hypre_BlockTridiag *--------------------------------------------------------------------------*/ void *hypre_BlockTridiagCreate(void); HYPRE_Int hypre_BlockTridiagDestroy(void *); HYPRE_Int hypre_BlockTridiagSetup(void *, hypre_ParCSRMatrix *, hypre_ParVector *, hypre_ParVector *); HYPRE_Int hypre_BlockTridiagSolve(void *, hypre_ParCSRMatrix *, hypre_ParVector *, hypre_ParVector *); HYPRE_Int hypre_BlockTridiagSetIndexSet(void *, HYPRE_Int, HYPRE_Int *); HYPRE_Int hypre_BlockTridiagSetAMGStrengthThreshold(void *, HYPRE_Real); HYPRE_Int hypre_BlockTridiagSetAMGNumSweeps(void *, HYPRE_Int); HYPRE_Int hypre_BlockTridiagSetAMGRelaxType(void *, HYPRE_Int); HYPRE_Int hypre_BlockTridiagSetPrintLevel(void *, HYPRE_Int); #endif hypre-2.33.0/src/parcsr_ls/csr_block_matrix.h000066400000000000000000000157251477326011500212230ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * Header info for CSR Block Matrix data structures * * Note: this matrix currently uses 0-based indexing. * Note: everything is in terms of blocks (ie. num_rows is the number * of block rows) * *****************************************************************************/ #ifndef hypre_CSR_BLOCK_MATRIX_HEADER #define hypre_CSR_BLOCK_MATRIX_HEADER #include "seq_mv.h" #include "_hypre_utilities.h" #ifdef __cplusplus extern "C" { #endif /*-------------------------------------------------------------------------- * CSR Block Matrix *--------------------------------------------------------------------------*/ typedef struct { HYPRE_Complex *data; HYPRE_Int *i; HYPRE_Int *j; HYPRE_BigInt *big_j; HYPRE_Int block_size; HYPRE_Int num_rows; HYPRE_Int num_cols; HYPRE_Int num_nonzeros; HYPRE_Int owns_data; } hypre_CSRBlockMatrix; /*-------------------------------------------------------------------------- * Accessor functions for the CSR Block Matrix structure *--------------------------------------------------------------------------*/ #define hypre_CSRBlockMatrixData(matrix) ((matrix) -> data) #define hypre_CSRBlockMatrixI(matrix) ((matrix) -> i) #define hypre_CSRBlockMatrixJ(matrix) ((matrix) -> j) #define hypre_CSRBlockMatrixBigJ(matrix) ((matrix) -> big_j) #define hypre_CSRBlockMatrixBlockSize(matrix) ((matrix) -> block_size) #define hypre_CSRBlockMatrixNumRows(matrix) ((matrix) -> num_rows) #define hypre_CSRBlockMatrixNumCols(matrix) ((matrix) -> num_cols) #define hypre_CSRBlockMatrixNumNonzeros(matrix) ((matrix) -> num_nonzeros) #define hypre_CSRBlockMatrixOwnsData(matrix) ((matrix) -> owns_data) /*-------------------------------------------------------------------------- * other functions for the CSR Block Matrix structure *--------------------------------------------------------------------------*/ hypre_CSRBlockMatrix *hypre_CSRBlockMatrixCreate(HYPRE_Int, HYPRE_Int, HYPRE_Int, HYPRE_Int); HYPRE_Int hypre_CSRBlockMatrixDestroy(hypre_CSRBlockMatrix *); HYPRE_Int hypre_CSRBlockMatrixInitialize(hypre_CSRBlockMatrix *); HYPRE_Int hypre_CSRBlockMatrixBigInitialize(hypre_CSRBlockMatrix *); HYPRE_Int hypre_CSRBlockMatrixSetDataOwner(hypre_CSRBlockMatrix *, HYPRE_Int); hypre_CSRMatrix *hypre_CSRBlockMatrixCompress(hypre_CSRBlockMatrix *); hypre_CSRMatrix *hypre_CSRBlockMatrixConvertToCSRMatrix(hypre_CSRBlockMatrix *); hypre_CSRBlockMatrix *hypre_CSRBlockMatrixConvertFromCSRMatrix(hypre_CSRMatrix *, HYPRE_Int); HYPRE_Int hypre_CSRBlockMatrixBlockAdd(HYPRE_Complex *, HYPRE_Complex *, HYPRE_Complex*, HYPRE_Int); HYPRE_Int hypre_CSRBlockMatrixBlockMultAdd(HYPRE_Complex *, HYPRE_Complex *, HYPRE_Complex, HYPRE_Complex *, HYPRE_Int); HYPRE_Int hypre_CSRBlockMatrixBlockMultAddDiag(HYPRE_Complex *, HYPRE_Complex *, HYPRE_Complex, HYPRE_Complex *, HYPRE_Int); HYPRE_Int hypre_CSRBlockMatrixBlockMultAddDiag2(HYPRE_Complex* i1, HYPRE_Complex* i2, HYPRE_Complex beta, HYPRE_Complex* o, HYPRE_Int block_size); HYPRE_Int hypre_CSRBlockMatrixBlockMultAddDiag3(HYPRE_Complex* i1, HYPRE_Complex* i2, HYPRE_Complex beta, HYPRE_Complex* o, HYPRE_Int block_size); HYPRE_Int hypre_CSRBlockMatrixBlockInvMult(HYPRE_Complex *, HYPRE_Complex *, HYPRE_Complex *, HYPRE_Int); HYPRE_Int hypre_CSRBlockMatrixBlockInvMultDiag(HYPRE_Complex *, HYPRE_Complex *, HYPRE_Complex *, HYPRE_Int); HYPRE_Int hypre_CSRBlockMatrixBlockInvMultDiag2(HYPRE_Complex* i1, HYPRE_Complex* i2, HYPRE_Complex* o, HYPRE_Int block_size); HYPRE_Int hypre_CSRBlockMatrixBlockInvMultDiag3(HYPRE_Complex* i1, HYPRE_Complex* i2, HYPRE_Complex* o, HYPRE_Int block_size); HYPRE_Int hypre_CSRBlockMatrixBlockMultInv(HYPRE_Complex *, HYPRE_Complex *, HYPRE_Complex *, HYPRE_Int); HYPRE_Int hypre_CSRBlockMatrixBlockTranspose(HYPRE_Complex *, HYPRE_Complex *, HYPRE_Int); HYPRE_Int hypre_CSRBlockMatrixTranspose(hypre_CSRBlockMatrix *A, hypre_CSRBlockMatrix **AT, HYPRE_Int data); HYPRE_Int hypre_CSRBlockMatrixBlockCopyData(HYPRE_Complex*, HYPRE_Complex*, HYPRE_Complex, HYPRE_Int); HYPRE_Int hypre_CSRBlockMatrixBlockCopyDataDiag(HYPRE_Complex*, HYPRE_Complex*, HYPRE_Complex, HYPRE_Int); HYPRE_Int hypre_CSRBlockMatrixBlockAddAccumulate(HYPRE_Complex*, HYPRE_Complex*, HYPRE_Int); HYPRE_Int hypre_CSRBlockMatrixBlockAddAccumulateDiag(HYPRE_Complex* i1, HYPRE_Complex* o, HYPRE_Int block_size); HYPRE_Int hypre_CSRBlockMatrixMatvec(HYPRE_Complex alpha, hypre_CSRBlockMatrix *A, hypre_Vector *x, HYPRE_Complex beta, hypre_Vector *y); HYPRE_Int hypre_CSRBlockMatrixMatvecT( HYPRE_Complex alpha, hypre_CSRBlockMatrix *A, hypre_Vector *x, HYPRE_Complex beta, hypre_Vector *y ); HYPRE_Int hypre_CSRBlockMatrixBlockInvMatvec(HYPRE_Complex* mat, HYPRE_Complex* v, HYPRE_Complex* ov, HYPRE_Int block_size); HYPRE_Int hypre_CSRBlockMatrixBlockMatvec(HYPRE_Complex alpha, HYPRE_Complex* mat, HYPRE_Complex* v, HYPRE_Complex beta, HYPRE_Complex* ov, HYPRE_Int block_size); HYPRE_Int hypre_CSRBlockMatrixBlockNorm(HYPRE_Int norm_type, HYPRE_Complex* data, HYPRE_Real* out, HYPRE_Int block_size); HYPRE_Int hypre_CSRBlockMatrixBlockSetScalar(HYPRE_Complex* o, HYPRE_Complex beta, HYPRE_Int block_size); HYPRE_Int hypre_CSRBlockMatrixComputeSign(HYPRE_Complex *i1, HYPRE_Complex *o, HYPRE_Int block_size); HYPRE_Int hypre_CSRBlockMatrixBlockAddAccumulateDiagCheckSign(HYPRE_Complex* i1, HYPRE_Complex* o, HYPRE_Int block_size, HYPRE_Real *sign); HYPRE_Int hypre_CSRBlockMatrixBlockMultAddDiagCheckSign(HYPRE_Complex* i1, HYPRE_Complex* i2, HYPRE_Complex beta, HYPRE_Complex* o, HYPRE_Int block_size, HYPRE_Real *sign); #ifdef __cplusplus } #endif #endif hypre-2.33.0/src/parcsr_ls/driver.c000066400000000000000000001463271477326011500171670ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "_hypre_parcsr_ls.h" /*-------------------------------------------------------------------------- * Test driver for unstructured matrix interfoace (parcsr storage). * Do `driver -help' for usage info. *--------------------------------------------------------------------------*/ HYPRE_Int main( HYPRE_Int argc, char *argv[] ) { HYPRE_Int arg_index; HYPRE_Int print_usage; HYPRE_Int build_matrix_type; HYPRE_Int build_matrix_arg_index; HYPRE_Int build_rhs_type; HYPRE_Int build_rhs_arg_index; HYPRE_Int solver_id; HYPRE_Int ioutdat; HYPRE_Int debug_flag; HYPRE_Int ierr, i; HYPRE_Int max_levels = 25; HYPRE_Int num_iterations; HYPRE_Real norm; HYPRE_Real final_res_norm; HYPRE_ParCSRMatrix A; HYPRE_ParVector b; HYPRE_ParVector x; HYPRE_Solver amg_solver; HYPRE_Solver pcg_solver; HYPRE_Solver pcg_precond; HYPRE_Int num_procs, myid; HYPRE_Int global_m, global_n; HYPRE_Int *partitioning; HYPRE_Int time_index; /* parameters for BoomerAMG */ HYPRE_Real strong_threshold; HYPRE_Real trunc_factor; HYPRE_Int cycle_type; HYPRE_Int coarsen_type = 0; HYPRE_Int hybrid = 1; HYPRE_Int measure_type = 0; HYPRE_Int *num_grid_sweeps; HYPRE_Int *grid_relax_type; HYPRE_Int **grid_relax_points; HYPRE_Int relax_default; HYPRE_Real *relax_weight; HYPRE_Real tol = 1.0e-6; /* parameters for PILUT */ HYPRE_Real drop_tol = -1; HYPRE_Int nonzeros_to_keep = -1; /* parameters for GMRES */ HYPRE_Int k_dim; /*----------------------------------------------------------- * Initialize some stuff *-----------------------------------------------------------*/ /* Initialize MPI */ hypre_MPI_Init(&argc, &argv); hypre_MPI_Comm_size(hypre_MPI_COMM_WORLD, &num_procs ); hypre_MPI_Comm_rank(hypre_MPI_COMM_WORLD, &myid ); /*----------------------------------------------------------- * Set defaults *-----------------------------------------------------------*/ build_matrix_type = 1; build_matrix_arg_index = argc; build_rhs_type = 0; build_rhs_arg_index = argc; relax_default = 3; debug_flag = 0; solver_id = 0; ioutdat = 3; /*----------------------------------------------------------- * Parse command line *-----------------------------------------------------------*/ print_usage = 0; arg_index = 1; while ( (arg_index < argc) && (!print_usage) ) { if ( strcmp(argv[arg_index], "-fromfile") == 0 ) { arg_index++; build_matrix_type = 0; build_matrix_arg_index = arg_index; } else if ( strcmp(argv[arg_index], "-fromonefile") == 0 ) { arg_index++; build_matrix_type = 2; build_matrix_arg_index = arg_index; } else if ( strcmp(argv[arg_index], "-laplacian") == 0 ) { arg_index++; build_matrix_type = 1; build_matrix_arg_index = arg_index; } else if ( strcmp(argv[arg_index], "-9pt") == 0 ) { arg_index++; build_matrix_type = 3; build_matrix_arg_index = arg_index; } else if ( strcmp(argv[arg_index], "-27pt") == 0 ) { arg_index++; build_matrix_type = 4; build_matrix_arg_index = arg_index; } else if ( strcmp(argv[arg_index], "-difconv") == 0 ) { arg_index++; build_matrix_type = 5; build_matrix_arg_index = arg_index; } else if ( strcmp(argv[arg_index], "-solver") == 0 ) { arg_index++; solver_id = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-rhsfromfile") == 0 ) { arg_index++; build_rhs_type = 1; build_rhs_arg_index = arg_index; } else if ( strcmp(argv[arg_index], "-rhsfromonefile") == 0 ) { arg_index++; build_rhs_type = 2; build_rhs_arg_index = arg_index; } else if ( strcmp(argv[arg_index], "-rhsrand") == 0 ) { arg_index++; build_rhs_type = 3; build_rhs_arg_index = arg_index; } else if ( strcmp(argv[arg_index], "-ruge") == 0 ) { arg_index++; coarsen_type = 1; } else if ( strcmp(argv[arg_index], "-ruge2b") == 0 ) { arg_index++; coarsen_type = 2; } else if ( strcmp(argv[arg_index], "-ruge3") == 0 ) { arg_index++; coarsen_type = 3; } else if ( strcmp(argv[arg_index], "-ruge3c") == 0 ) { arg_index++; coarsen_type = 4; } else if ( strcmp(argv[arg_index], "-rugerlx") == 0 ) { arg_index++; coarsen_type = 5; } else if ( strcmp(argv[arg_index], "-falgout") == 0 ) { arg_index++; coarsen_type = 6; } else if ( strcmp(argv[arg_index], "-nohybrid") == 0 ) { arg_index++; hybrid = -1; } else if ( strcmp(argv[arg_index], "-gm") == 0 ) { arg_index++; measure_type = 1; } else if ( strcmp(argv[arg_index], "-xisone") == 0 ) { arg_index++; build_rhs_type = 4; build_rhs_arg_index = arg_index; } else if ( strcmp(argv[arg_index], "-rlx") == 0 ) { arg_index++; relax_default = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-dbg") == 0 ) { arg_index++; debug_flag = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-help") == 0 ) { print_usage = 1; } else { arg_index++; } } /* for CGNR preconditioned with Boomeramg, only relaxation scheme 2 is implemented, i.e. Jacobi relaxation with Matvec */ if (solver_id == 5) { relax_default = 2; } /* defaults for BoomerAMG */ strong_threshold = 0.25; trunc_factor = 0.0; cycle_type = 1; num_grid_sweeps = hypre_CTAlloc(HYPRE_Int, 4, HYPRE_MEMORY_HOST); grid_relax_type = hypre_CTAlloc(HYPRE_Int, 4, HYPRE_MEMORY_HOST); grid_relax_points = hypre_CTAlloc(HYPRE_Int *, 4, HYPRE_MEMORY_HOST); relax_weight = hypre_CTAlloc(HYPRE_Real, max_levels, HYPRE_MEMORY_HOST); for (i = 0; i < max_levels; i++) { relax_weight[i] = 0.0; } if (coarsen_type == 5) { /* fine grid */ num_grid_sweeps[0] = 3; grid_relax_type[0] = relax_default; grid_relax_points[0] = hypre_CTAlloc(HYPRE_Int, 4, HYPRE_MEMORY_HOST); grid_relax_points[0][0] = -2; grid_relax_points[0][1] = -1; grid_relax_points[0][2] = 1; /* down cycle */ num_grid_sweeps[1] = 4; grid_relax_type[1] = relax_default; grid_relax_points[1] = hypre_CTAlloc(HYPRE_Int, 4, HYPRE_MEMORY_HOST); grid_relax_points[1][0] = -1; grid_relax_points[1][1] = 1; grid_relax_points[1][2] = -2; grid_relax_points[1][3] = -2; /* up cycle */ num_grid_sweeps[2] = 4; grid_relax_type[2] = relax_default; grid_relax_points[2] = hypre_CTAlloc(HYPRE_Int, 4, HYPRE_MEMORY_HOST); grid_relax_points[2][0] = -2; grid_relax_points[2][1] = -2; grid_relax_points[2][2] = 1; grid_relax_points[2][3] = -1; } else { /* fine grid */ num_grid_sweeps[0] = 2; grid_relax_type[0] = relax_default; grid_relax_points[0] = hypre_CTAlloc(HYPRE_Int, 2, HYPRE_MEMORY_HOST); grid_relax_points[0][0] = 1; grid_relax_points[0][1] = -1; /* down cycle */ num_grid_sweeps[1] = 2; grid_relax_type[1] = relax_default; grid_relax_points[1] = hypre_CTAlloc(HYPRE_Int, 2, HYPRE_MEMORY_HOST); grid_relax_points[1][0] = 1; grid_relax_points[1][1] = -1; /* up cycle */ num_grid_sweeps[2] = 2; grid_relax_type[2] = relax_default; grid_relax_points[2] = hypre_CTAlloc(HYPRE_Int, 2, HYPRE_MEMORY_HOST); grid_relax_points[2][0] = -1; grid_relax_points[2][1] = 1; } /* coarsest grid */ num_grid_sweeps[3] = 1; grid_relax_type[3] = 9; grid_relax_points[3] = hypre_CTAlloc(HYPRE_Int, 1, HYPRE_MEMORY_HOST); grid_relax_points[3][0] = 0; /* defaults for GMRES */ k_dim = 5; arg_index = 0; while (arg_index < argc) { if ( strcmp(argv[arg_index], "-k") == 0 ) { arg_index++; k_dim = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-w") == 0 ) { arg_index++; relax_weight[0] = atof(argv[arg_index++]); for (i = 1; i < max_levels; i++) { relax_weight[i] = relax_weight[0]; } } else if ( strcmp(argv[arg_index], "-th") == 0 ) { arg_index++; strong_threshold = atof(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-tol") == 0 ) { arg_index++; tol = atof(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-drop_tol") == 0 ) { arg_index++; drop_tol = atof(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-nonzeros_to_keep") == 0 ) { arg_index++; nonzeros_to_keep = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-tr") == 0 ) { arg_index++; trunc_factor = atof(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-iout") == 0 ) { arg_index++; ioutdat = atoi(argv[arg_index++]); } else { arg_index++; } } /*----------------------------------------------------------- * Print usage info *-----------------------------------------------------------*/ if ( (print_usage) && (myid == 0) ) { hypre_printf("\n"); hypre_printf("Usage: %s []\n", argv[0]); hypre_printf("\n"); hypre_printf(" -fromfile : matrix from distributed file\n"); hypre_printf(" -fromonefile : matrix from standard CSR file\n"); hypre_printf("\n"); hypre_printf(" -laplacian [] : build laplacian matrix\n"); hypre_printf(" -9pt [] : build 9pt 2D laplacian matrix\n"); hypre_printf(" -27pt [] : build 27pt 3D laplacian matrix\n"); hypre_printf(" -difconv [] : build convection-diffusion matrix\n"); hypre_printf(" -n : problem size per processor\n"); hypre_printf(" -P : processor topology\n"); hypre_printf(" -c : diffusion coefficients\n"); hypre_printf(" -a : convection coefficients\n"); hypre_printf("\n"); hypre_printf(" -rhsfromfile : from distributed file (NOT YET)\n"); hypre_printf(" -rhsfromonefile : from vector file \n"); hypre_printf(" -rhsrand : rhs is random vector, ||x||=1\n"); hypre_printf(" -xisone : rhs of all ones\n"); hypre_printf("\n"); hypre_printf(" -solver : solver ID\n"); hypre_printf(" 1=AMG-PCG 2=DS-PCG \n"); hypre_printf(" 3=AMG-GMRES 4=DS-GMRES \n"); hypre_printf(" 5=AMG-CGNR 6=DS-CGNR \n"); hypre_printf(" 7=PILUT-GMRES \n"); hypre_printf("\n"); hypre_printf(" -ruge : Ruge coarsening (local)\n"); hypre_printf(" -ruge3 : third pass on boundary\n"); hypre_printf(" -ruge3c : third pass on boundary, keep c-points\n"); hypre_printf(" -ruge2b : 2nd pass is global\n"); hypre_printf(" -rugerlx : relaxes special points\n"); hypre_printf(" -falgout : local ruge followed by LJP\n"); hypre_printf(" -nohybrid : no switch in coarsening\n"); hypre_printf(" -gm : use global measures\n"); hypre_printf("\n"); hypre_printf(" -rlx : relaxation type\n"); hypre_printf(" 0=Weighted Jacobi \n"); hypre_printf(" 3=Hybrid Jacobi/Gauss-Seidel \n"); hypre_printf("\n"); hypre_printf(" -th : set AMG threshold Theta = val \n"); hypre_printf(" -tr : set AMG interpolation truncation factor = val \n"); hypre_printf(" -tol : set AMG convergence tolerance to val\n"); hypre_printf(" -w : set Jacobi relax weight = val\n"); hypre_printf(" -k : dimension Krylov space for GMRES\n"); hypre_printf("\n"); hypre_printf(" -drop_tol : set threshold for dropping in PILUT\n"); hypre_printf(" -nonzeros_to_keep : number of nonzeros in each row to keep\n"); hypre_printf("\n"); hypre_printf(" -iout : set output flag\n"); hypre_printf(" 0=no output 1=matrix stats\n"); hypre_printf(" 2=cycle stats 3=matrix & cycle stats\n"); hypre_printf("\n"); hypre_printf(" -dbg : set debug flag\n"); hypre_printf(" 0=no debugging\n 1=internal timing\n 2=interpolation truncation\n 3=more detailed timing in coarsening routine\n"); exit(1); } /*----------------------------------------------------------- * Check a few things *-----------------------------------------------------------*/ /*----------------------------------------------------------- * Print driver parameters *-----------------------------------------------------------*/ if (myid == 0) { hypre_printf("Running with these driver parameters:\n"); hypre_printf(" solver ID = %d\n", solver_id); } /*----------------------------------------------------------- * Set up matrix *-----------------------------------------------------------*/ if ( build_matrix_type == 0 ) { BuildParFromFile(argc, argv, build_matrix_arg_index, &A); } else if ( build_matrix_type == 1 ) { BuildParLaplacian(argc, argv, build_matrix_arg_index, &A); } else if ( build_matrix_type == 2 ) { BuildParFromOneFile(argc, argv, build_matrix_arg_index, &A); } else if ( build_matrix_type == 3 ) { BuildParLaplacian9pt(argc, argv, build_matrix_arg_index, &A); } else if ( build_matrix_type == 4 ) { BuildParLaplacian27pt(argc, argv, build_matrix_arg_index, &A); } else if ( build_matrix_type == 5 ) { BuildParDifConv(argc, argv, build_matrix_arg_index, &A); } /*----------------------------------------------------------- * Set up the RHS and initial guess *-----------------------------------------------------------*/ #if 0 HYPRE_ParCSRMatrixPrint(A, "driver.out.A"); #endif if (build_rhs_type == 1) { /* BuildRHSParFromFile(argc, argv, build_rhs_arg_index, &b); */ hypre_printf("Rhs from file not yet implemented. Defaults to b=0\n"); HYPRE_ParCSRMatrixGetRowPartitioning(A, &partitioning); HYPRE_ParCSRMatrixGetDims(A, &global_m, &global_n); HYPRE_ParVectorCreate(hypre_MPI_COMM_WORLD, global_m, partitioning, &b); HYPRE_ParVectorInitialize(b); HYPRE_ParVectorSetConstantValues(b, 0.0); HYPRE_ParVectorCreate(hypre_MPI_COMM_WORLD, global_n, partitioning, &x); HYPRE_ParVectorInitialize(x); HYPRE_ParVectorSetConstantValues(x, 1.0); } else if ( build_rhs_type == 2 ) { BuildRhsParFromOneFile(argc, argv, build_rhs_arg_index, A, &b); HYPRE_ParCSRMatrixGetRowPartitioning(A, &partitioning); HYPRE_ParCSRMatrixGetDims(A, &global_m, &global_n); HYPRE_ParVectorCreate(hypre_MPI_COMM_WORLD, global_n, partitioning, &x); HYPRE_ParVectorInitialize(x); HYPRE_ParVectorSetConstantValues(x, 0.0); } else if ( build_rhs_type == 3 ) { HYPRE_ParCSRMatrixGetRowPartitioning(A, &partitioning); HYPRE_ParCSRMatrixGetDims(A, &global_m, &global_n); HYPRE_ParVectorCreate(hypre_MPI_COMM_WORLD, global_m, partitioning, &b); HYPRE_ParVectorInitialize(b); HYPRE_ParVectorSetRandomValues(b, 22775); HYPRE_ParVectorInnerProd(b, b, &norm); norm = 1.0 / hypre_sqrt(norm); ierr = HYPRE_ParVectorScale(norm, b); HYPRE_ParVectorCreate(hypre_MPI_COMM_WORLD, global_n, partitioning, &x); HYPRE_ParVectorInitialize(x); HYPRE_ParVectorSetConstantValues(x, 0.0); } else if ( build_rhs_type == 4 ) { HYPRE_ParCSRMatrixGetRowPartitioning(A, &partitioning); HYPRE_ParCSRMatrixGetDims(A, &global_m, &global_n); HYPRE_ParVectorCreate(hypre_MPI_COMM_WORLD, global_n, partitioning, &x); HYPRE_ParVectorInitialize(x); HYPRE_ParVectorSetConstantValues(x, 1.0); HYPRE_ParVectorCreate(hypre_MPI_COMM_WORLD, global_m, partitioning, &b); HYPRE_ParVectorInitialize(b); HYPRE_ParCSRMatrixMatvec(1.0, A, x, 0.0, b); HYPRE_ParVectorSetConstantValues(x, 0.0); } else /* if ( build_rhs_type == 0 ) */ { HYPRE_ParCSRMatrixGetRowPartitioning(A, &partitioning); HYPRE_ParCSRMatrixGetDims(A, &global_m, &global_n); HYPRE_ParVectorCreate(hypre_MPI_COMM_WORLD, global_m, partitioning, &b); HYPRE_ParVectorInitialize(b); HYPRE_ParVectorSetConstantValues(b, 0.0); HYPRE_ParVectorCreate(hypre_MPI_COMM_WORLD, global_n, partitioning, &x); HYPRE_ParVectorInitialize(x); HYPRE_ParVectorSetConstantValues(x, 1.0); } /*----------------------------------------------------------- * Solve the system using AMG *-----------------------------------------------------------*/ if (solver_id == 0) { time_index = hypre_InitializeTiming("BoomerAMG Setup"); hypre_BeginTiming(time_index); HYPRE_BoomerAMGCreate(&amg_solver); HYPRE_BoomerAMGSetCoarsenType(amg_solver, (hybrid * coarsen_type)); HYPRE_BoomerAMGSetMeasureType(amg_solver, measure_type); HYPRE_BoomerAMGSetTol(amg_solver, tol); HYPRE_BoomerAMGSetStrongThreshold(amg_solver, strong_threshold); HYPRE_BoomerAMGSetTruncFactor(amg_solver, trunc_factor); HYPRE_BoomerAMGSetPrintLevel(amg_solver, ioutdat); HYPRE_BoomerAMGSetPrintFileName(amg_solver, "driver.out.log"); HYPRE_BoomerAMGSetCycleType(amg_solver, cycle_type); HYPRE_BoomerAMGSetNumGridSweeps(amg_solver, num_grid_sweeps); HYPRE_BoomerAMGSetGridRelaxType(amg_solver, grid_relax_type); HYPRE_BoomerAMGSetRelaxWeight(amg_solver, relax_weight); HYPRE_BoomerAMGSetGridRelaxPoints(amg_solver, grid_relax_points); HYPRE_BoomerAMGSetMaxLevels(amg_solver, max_levels); HYPRE_BoomerAMGSetDebugFlag(amg_solver, debug_flag); HYPRE_BoomerAMGSetup(amg_solver, A, b, x); hypre_EndTiming(time_index); hypre_PrintTiming("Setup phase times", hypre_MPI_COMM_WORLD); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); time_index = hypre_InitializeTiming("BoomerAMG Solve"); hypre_BeginTiming(time_index); HYPRE_BoomerAMGSolve(amg_solver, A, b, x); hypre_EndTiming(time_index); hypre_PrintTiming("Solve phase times", hypre_MPI_COMM_WORLD); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); HYPRE_BoomerAMGDestroy(amg_solver); } /*----------------------------------------------------------- * Solve the system using PCG *-----------------------------------------------------------*/ if (solver_id == 1 || solver_id == 2) { time_index = hypre_InitializeTiming("PCG Setup"); hypre_BeginTiming(time_index); HYPRE_ParCSRPCGCreate(hypre_MPI_COMM_WORLD, &pcg_solver); HYPRE_ParCSRPCGSetMaxIter(pcg_solver, 500); HYPRE_ParCSRPCGSetTol(pcg_solver, tol); HYPRE_ParCSRPCGSetTwoNorm(pcg_solver, 1); HYPRE_ParCSRPCGSetRelChange(pcg_solver, 0); HYPRE_ParCSRPCGSetPrintLevel(pcg_solver, 1); if (solver_id == 1) { /* use BoomerAMG as preconditioner */ HYPRE_BoomerAMGCreate(&pcg_precond); HYPRE_BoomerAMGSetCoarsenType(pcg_precond, (hybrid * coarsen_type)); HYPRE_BoomerAMGSetMeasureType(pcg_precond, measure_type); HYPRE_BoomerAMGSetStrongThreshold(pcg_precond, strong_threshold); HYPRE_BoomerAMGSetPrintLevel(pcg_precond, ioutdat); HYPRE_BoomerAMGSetPrintFileName(pcg_precond, "driver.out.log"); HYPRE_BoomerAMGSetMaxIter(pcg_precond, 1); HYPRE_BoomerAMGSetCycleType(pcg_precond, cycle_type); HYPRE_BoomerAMGSetNumGridSweeps(pcg_precond, num_grid_sweeps); HYPRE_BoomerAMGSetGridRelaxType(pcg_precond, grid_relax_type); HYPRE_BoomerAMGSetRelaxWeight(pcg_precond, relax_weight); HYPRE_BoomerAMGSetGridRelaxPoints(pcg_precond, grid_relax_points); HYPRE_BoomerAMGSetMaxLevels(pcg_precond, max_levels); HYPRE_ParCSRPCGSetPrecond(pcg_solver, HYPRE_BoomerAMGSolve, HYPRE_BoomerAMGSetup, pcg_precond); } else if (solver_id == 2) { /* use diagonal scaling as preconditioner */ pcg_precond = NULL; HYPRE_ParCSRPCGSetPrecond(pcg_solver, HYPRE_ParCSRDiagScale, HYPRE_ParCSRDiagScaleSetup, pcg_precond); } HYPRE_ParCSRPCGSetup(pcg_solver, A, b, x); hypre_EndTiming(time_index); hypre_PrintTiming("Setup phase times", hypre_MPI_COMM_WORLD); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); time_index = hypre_InitializeTiming("PCG Solve"); hypre_BeginTiming(time_index); HYPRE_ParCSRPCGSolve(pcg_solver, A, b, x); hypre_EndTiming(time_index); hypre_PrintTiming("Solve phase times", hypre_MPI_COMM_WORLD); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); HYPRE_ParCSRPCGGetNumIterations(pcg_solver, &num_iterations); HYPRE_ParCSRPCGGetFinalRelativeResidualNorm(pcg_solver, &final_res_norm); HYPRE_ParCSRPCGDestroy(pcg_solver); if (solver_id == 1) { HYPRE_BoomerAMGDestroy(pcg_precond); } if (myid == 0) { hypre_printf("\n"); hypre_printf("Iterations = %d\n", num_iterations); hypre_printf("Final Relative Residual Norm = %e\n", final_res_norm); hypre_printf("\n"); } } /*----------------------------------------------------------- * Solve the system using GMRES *-----------------------------------------------------------*/ if (solver_id == 3 || solver_id == 4 || solver_id == 7) { time_index = hypre_InitializeTiming("GMRES Setup"); hypre_BeginTiming(time_index); HYPRE_ParCSRGMRESCreate(hypre_MPI_COMM_WORLD, &pcg_solver); HYPRE_ParCSRGMRESSetKDim(pcg_solver, k_dim); HYPRE_ParCSRGMRESSetMaxIter(pcg_solver, 100); HYPRE_ParCSRGMRESSetTol(pcg_solver, tol); HYPRE_ParCSRGMRESSetLogging(pcg_solver, 1); if (solver_id == 3) { /* use BoomerAMG as preconditioner */ HYPRE_BoomerAMGCreate(&pcg_precond); HYPRE_BoomerAMGSetCoarsenType(pcg_precond, (hybrid * coarsen_type)); HYPRE_BoomerAMGSetMeasureType(pcg_precond, measure_type); HYPRE_BoomerAMGSetStrongThreshold(pcg_precond, strong_threshold); HYPRE_BoomerAMGSetPrintLevel(pcg_precond, ioutdat); HYPRE_BoomerAMGSetPrintFileName(pcg_precond, "driver.out.log"); HYPRE_BoomerAMGSetMaxIter(pcg_precond, 1); HYPRE_BoomerAMGSetCycleType(pcg_precond, cycle_type); HYPRE_BoomerAMGSetNumGridSweeps(pcg_precond, num_grid_sweeps); HYPRE_BoomerAMGSetGridRelaxType(pcg_precond, grid_relax_type); HYPRE_BoomerAMGSetRelaxWeight(pcg_precond, relax_weight); HYPRE_BoomerAMGSetGridRelaxPoints(pcg_precond, grid_relax_points); HYPRE_BoomerAMGSetMaxLevels(pcg_precond, max_levels); HYPRE_ParCSRGMRESSetPrecond(pcg_solver, HYPRE_BoomerAMGSolve, HYPRE_BoomerAMGSetup, pcg_precond); } else if (solver_id == 4) { /* use diagonal scaling as preconditioner */ pcg_precond = NULL; HYPRE_ParCSRGMRESSetPrecond(pcg_solver, HYPRE_ParCSRDiagScale, HYPRE_ParCSRDiagScaleSetup, pcg_precond); } else if (solver_id == 7) { /* use PILUT as preconditioner */ ierr = HYPRE_ParCSRPilutCreate( hypre_MPI_COMM_WORLD, &pcg_precond ); if (ierr) { hypre_printf("Error in ParPilutCreate\n"); } HYPRE_ParCSRGMRESSetPrecond(pcg_solver, HYPRE_ParCSRPilutSolve, HYPRE_ParCSRPilutSetup, pcg_precond); if (drop_tol >= 0 ) HYPRE_ParCSRPilutSetDropTolerance( pcg_precond, drop_tol ); if (nonzeros_to_keep >= 0 ) HYPRE_ParCSRPilutSetFactorRowSize( pcg_precond, nonzeros_to_keep ); } HYPRE_ParCSRGMRESSetup(pcg_solver, A, b, x); hypre_EndTiming(time_index); hypre_PrintTiming("Setup phase times", hypre_MPI_COMM_WORLD); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); time_index = hypre_InitializeTiming("GMRES Solve"); hypre_BeginTiming(time_index); HYPRE_ParCSRGMRESSolve(pcg_solver, A, b, x); hypre_EndTiming(time_index); hypre_PrintTiming("Solve phase times", hypre_MPI_COMM_WORLD); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); HYPRE_ParCSRGMRESGetNumIterations(pcg_solver, &num_iterations); HYPRE_ParCSRGMRESGetFinalRelativeResidualNorm(pcg_solver, &final_res_norm); HYPRE_ParCSRGMRESDestroy(pcg_solver); if (solver_id == 3) { HYPRE_BoomerAMGDestroy(pcg_precond); } if (solver_id == 7) { HYPRE_ParCSRPilutDestroy(pcg_precond); } if (myid == 0) { hypre_printf("\n"); hypre_printf("GMRES Iterations = %d\n", num_iterations); hypre_printf("Final GMRES Relative Residual Norm = %e\n", final_res_norm); hypre_printf("\n"); } } /*----------------------------------------------------------- * Solve the system using CGNR *-----------------------------------------------------------*/ if (solver_id == 5 || solver_id == 6) { time_index = hypre_InitializeTiming("CGNR Setup"); hypre_BeginTiming(time_index); HYPRE_ParCSRCGNRCreate(hypre_MPI_COMM_WORLD, &pcg_solver); HYPRE_ParCSRCGNRSetMaxIter(pcg_solver, 1000); HYPRE_ParCSRCGNRSetTol(pcg_solver, tol); HYPRE_ParCSRCGNRSetLogging(pcg_solver, 1); if (solver_id == 5) { /* use BoomerAMG as preconditioner */ HYPRE_BoomerAMGCreate(&pcg_precond); HYPRE_BoomerAMGSetCoarsenType(pcg_precond, (hybrid * coarsen_type)); HYPRE_BoomerAMGSetMeasureType(pcg_precond, measure_type); HYPRE_BoomerAMGSetStrongThreshold(pcg_precond, strong_threshold); HYPRE_BoomerAMGSetPrintLevel(pcg_precond, ioutdat); HYPRE_BoomerAMGSetPrintFileName(pcg_precond, "driver.out.log"); HYPRE_BoomerAMGSetMaxIter(pcg_precond, 1); HYPRE_BoomerAMGSetCycleType(pcg_precond, cycle_type); HYPRE_BoomerAMGSetNumGridSweeps(pcg_precond, num_grid_sweeps); HYPRE_BoomerAMGSetGridRelaxType(pcg_precond, grid_relax_type); HYPRE_BoomerAMGSetRelaxWeight(pcg_precond, relax_weight); HYPRE_BoomerAMGSetGridRelaxPoints(pcg_precond, grid_relax_points); HYPRE_BoomerAMGSetMaxLevels(pcg_precond, max_levels); HYPRE_ParCSRCGNRSetPrecond(pcg_solver, HYPRE_BoomerAMGSolve, HYPRE_BoomerAMGSolveT, HYPRE_BoomerAMGSetup, pcg_precond); } else if (solver_id == 6) { /* use diagonal scaling as preconditioner */ pcg_precond = NULL; HYPRE_ParCSRCGNRSetPrecond(pcg_solver, HYPRE_ParCSRDiagScale, HYPRE_ParCSRDiagScale, HYPRE_ParCSRDiagScaleSetup, pcg_precond); } HYPRE_ParCSRCGNRSetup(pcg_solver, A, b, x); hypre_EndTiming(time_index); hypre_PrintTiming("Setup phase times", hypre_MPI_COMM_WORLD); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); time_index = hypre_InitializeTiming("CGNR Solve"); hypre_BeginTiming(time_index); HYPRE_ParCSRCGNRSolve(pcg_solver, A, b, x); hypre_EndTiming(time_index); hypre_PrintTiming("Solve phase times", hypre_MPI_COMM_WORLD); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); HYPRE_ParCSRCGNRGetNumIterations(pcg_solver, &num_iterations); HYPRE_ParCSRCGNRGetFinalRelativeResidualNorm(pcg_solver, &final_res_norm); HYPRE_ParCSRCGNRDestroy(pcg_solver); if (solver_id == 5) { HYPRE_BoomerAMGDestroy(pcg_precond); } if (myid == 0) { hypre_printf("\n"); hypre_printf("Iterations = %d\n", num_iterations); hypre_printf("Final Relative Residual Norm = %e\n", final_res_norm); hypre_printf("\n"); } } /*----------------------------------------------------------- * Print the solution and other info *-----------------------------------------------------------*/ #if 0 HYPRE_PrintCSRVector(x, "driver.out.x"); #endif /*----------------------------------------------------------- * Finalize things *-----------------------------------------------------------*/ HYPRE_ParCSRMatrixDestroy(A); HYPRE_ParVectorDestroy(b); HYPRE_ParVectorDestroy(x); /* Finalize MPI */ hypre_MPI_Finalize(); return (0); } /*---------------------------------------------------------------------- * Build matrix from file. Expects three files on each processor. * filename.D.n contains the diagonal part, filename.O.n contains * the offdiagonal part and filename.INFO.n contains global row * and column numbers, number of columns of offdiagonal matrix * and the mapping of offdiagonal column numbers to global column numbers. * Parameters given in command line. *----------------------------------------------------------------------*/ HYPRE_Int BuildParFromFile( HYPRE_Int argc, char *argv[], HYPRE_Int arg_index, HYPRE_ParCSRMatrix *A_ptr ) { char *filename; HYPRE_ParCSRMatrix A; HYPRE_Int myid; /*----------------------------------------------------------- * Initialize some stuff *-----------------------------------------------------------*/ hypre_MPI_Comm_rank(hypre_MPI_COMM_WORLD, &myid ); /*----------------------------------------------------------- * Parse command line *-----------------------------------------------------------*/ if (arg_index < argc) { filename = argv[arg_index]; } else { hypre_printf("Error: No filename specified \n"); exit(1); } /*----------------------------------------------------------- * Print driver parameters *-----------------------------------------------------------*/ if (myid == 0) { hypre_printf(" FromFile: %s\n", filename); } /*----------------------------------------------------------- * Generate the matrix *-----------------------------------------------------------*/ A = HYPRE_ParCSRMatrixRead(hypre_MPI_COMM_WORLD, filename); *A_ptr = A; return (0); } /*---------------------------------------------------------------------- * Build standard 7-point laplacian in 3D with grid and anisotropy. * Parameters given in command line. *----------------------------------------------------------------------*/ HYPRE_Int BuildParLaplacian( HYPRE_Int argc, char *argv[], HYPRE_Int arg_index, HYPRE_ParCSRMatrix *A_ptr ) { HYPRE_Int nx, ny, nz; HYPRE_Int P, Q, R; HYPRE_Real cx, cy, cz; HYPRE_ParCSRMatrix A; HYPRE_Int num_procs, myid; HYPRE_Int p, q, r; HYPRE_Real *values; /*----------------------------------------------------------- * Initialize some stuff *-----------------------------------------------------------*/ hypre_MPI_Comm_size(hypre_MPI_COMM_WORLD, &num_procs ); hypre_MPI_Comm_rank(hypre_MPI_COMM_WORLD, &myid ); /*----------------------------------------------------------- * Set defaults *-----------------------------------------------------------*/ nx = 10; ny = 10; nz = 10; P = 1; Q = num_procs; R = 1; cx = 1.0; cy = 1.0; cz = 1.0; /*----------------------------------------------------------- * Parse command line *-----------------------------------------------------------*/ arg_index = 0; while (arg_index < argc) { if ( strcmp(argv[arg_index], "-n") == 0 ) { arg_index++; nx = atoi(argv[arg_index++]); ny = atoi(argv[arg_index++]); nz = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-P") == 0 ) { arg_index++; P = atoi(argv[arg_index++]); Q = atoi(argv[arg_index++]); R = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-c") == 0 ) { arg_index++; cx = atof(argv[arg_index++]); cy = atof(argv[arg_index++]); cz = atof(argv[arg_index++]); } else { arg_index++; } } /*----------------------------------------------------------- * Check a few things *-----------------------------------------------------------*/ if ((P * Q * R) != num_procs) { hypre_printf("Error: Invalid number of processors or processor topology \n"); exit(1); } /*----------------------------------------------------------- * Print driver parameters *-----------------------------------------------------------*/ if (myid == 0) { hypre_printf(" Laplacian:\n"); hypre_printf(" (nx, ny, nz) = (%d, %d, %d)\n", nx, ny, nz); hypre_printf(" (Px, Py, Pz) = (%d, %d, %d)\n", P, Q, R); hypre_printf(" (cx, cy, cz) = (%f, %f, %f)\n", cx, cy, cz); } /*----------------------------------------------------------- * Set up the grid structure *-----------------------------------------------------------*/ /* compute p,q,r from P,Q,R and myid */ p = myid % P; q = (( myid - p) / P) % Q; r = ( myid - p - P * q) / ( P * Q ); /*----------------------------------------------------------- * Generate the matrix *-----------------------------------------------------------*/ values = hypre_CTAlloc(HYPRE_Real, 4, HYPRE_MEMORY_HOST); values[1] = -cx; values[2] = -cy; values[3] = -cz; values[0] = 0.0; if (nx > 1) { values[0] += 2.0 * cx; } if (ny > 1) { values[0] += 2.0 * cy; } if (nz > 1) { values[0] += 2.0 * cz; } A = (HYPRE_ParCSRMatrix) GenerateLaplacian(hypre_MPI_COMM_WORLD, nx, ny, nz, P, Q, R, p, q, r, values); hypre_TFree(values, HYPRE_MEMORY_HOST); *A_ptr = A; return (0); } /*---------------------------------------------------------------------- * Build standard 7-point convection-diffusion operator * Parameters given in command line. * Operator: * * -cx Dxx - cy Dyy - cz Dzz + ax Dx + ay Dy + az Dz = f * *----------------------------------------------------------------------*/ HYPRE_Int BuildParDifConv( HYPRE_Int argc, char *argv[], HYPRE_Int arg_index, HYPRE_ParCSRMatrix *A_ptr ) { HYPRE_Int nx, ny, nz; HYPRE_Int P, Q, R; HYPRE_Real cx, cy, cz; HYPRE_Real ax, ay, az; HYPRE_Real hinx, hiny, hinz; HYPRE_ParCSRMatrix A; HYPRE_Int num_procs, myid; HYPRE_Int p, q, r; HYPRE_Real *values; /*----------------------------------------------------------- * Initialize some stuff *-----------------------------------------------------------*/ hypre_MPI_Comm_size(hypre_MPI_COMM_WORLD, &num_procs ); hypre_MPI_Comm_rank(hypre_MPI_COMM_WORLD, &myid ); /*----------------------------------------------------------- * Set defaults *-----------------------------------------------------------*/ nx = 10; ny = 10; nz = 10; hinx = 1.0 / (nx + 1); hiny = 1.0 / (ny + 1); hinz = 1.0 / (nz + 1); P = 1; Q = num_procs; R = 1; cx = 1.0; cy = 1.0; cz = 1.0; ax = 1.0; ay = 1.0; az = 1.0; /*----------------------------------------------------------- * Parse command line *-----------------------------------------------------------*/ arg_index = 0; while (arg_index < argc) { if ( strcmp(argv[arg_index], "-n") == 0 ) { arg_index++; nx = atoi(argv[arg_index++]); ny = atoi(argv[arg_index++]); nz = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-P") == 0 ) { arg_index++; P = atoi(argv[arg_index++]); Q = atoi(argv[arg_index++]); R = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-c") == 0 ) { arg_index++; cx = atof(argv[arg_index++]); cy = atof(argv[arg_index++]); cz = atof(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-a") == 0 ) { arg_index++; ax = atof(argv[arg_index++]); ay = atof(argv[arg_index++]); az = atof(argv[arg_index++]); } else { arg_index++; } } /*----------------------------------------------------------- * Check a few things *-----------------------------------------------------------*/ if ((P * Q * R) != num_procs) { hypre_printf("Error: Invalid number of processors or processor topology \n"); exit(1); } /*----------------------------------------------------------- * Print driver parameters *-----------------------------------------------------------*/ if (myid == 0) { hypre_printf(" Convection-Diffusion: \n"); hypre_printf(" -cx Dxx - cy Dyy - cz Dzz + ax Dx + ay Dy + az Dz = f\n"); hypre_printf(" (nx, ny, nz) = (%d, %d, %d)\n", nx, ny, nz); hypre_printf(" (Px, Py, Pz) = (%d, %d, %d)\n", P, Q, R); hypre_printf(" (cx, cy, cz) = (%f, %f, %f)\n", cx, cy, cz); hypre_printf(" (ax, ay, az) = (%f, %f, %f)\n", ax, ay, az); } /*----------------------------------------------------------- * Set up the grid structure *-----------------------------------------------------------*/ /* compute p,q,r from P,Q,R and myid */ p = myid % P; q = (( myid - p) / P) % Q; r = ( myid - p - P * q) / ( P * Q ); /*----------------------------------------------------------- * Generate the matrix *-----------------------------------------------------------*/ values = hypre_CTAlloc(HYPRE_Real, 7, HYPRE_MEMORY_HOST); values[1] = -cx / (hinx * hinx); values[2] = -cy / (hiny * hiny); values[3] = -cz / (hinz * hinz); values[4] = -cx / (hinx * hinx) + ax / hinx; values[5] = -cy / (hiny * hiny) + ay / hiny; values[6] = -cz / (hinz * hinz) + az / hinz; values[0] = 0.0; if (nx > 1) { values[0] += 2.0 * cx / (hinx * hinx) - 1.0 * ax / hinx; } if (ny > 1) { values[0] += 2.0 * cy / (hiny * hiny) - 1.0 * ay / hiny; } if (nz > 1) { values[0] += 2.0 * cz / (hinz * hinz) - 1.0 * az / hinz; } A = (HYPRE_ParCSRMatrix) GenerateDifConv(hypre_MPI_COMM_WORLD, nx, ny, nz, P, Q, R, p, q, r, values); hypre_TFree(values, HYPRE_MEMORY_HOST); *A_ptr = A; return (0); } /*---------------------------------------------------------------------- * Build matrix from one file on Proc. 0. Expects matrix to be in * CSR format. Distributes matrix across processors giving each about * the same number of rows. * Parameters given in command line. *----------------------------------------------------------------------*/ HYPRE_Int BuildParFromOneFile( HYPRE_Int argc, char *argv[], HYPRE_Int arg_index, HYPRE_ParCSRMatrix *A_ptr ) { char *filename; HYPRE_ParCSRMatrix A; HYPRE_CSRMatrix A_CSR; HYPRE_Int myid; /*----------------------------------------------------------- * Initialize some stuff *-----------------------------------------------------------*/ hypre_MPI_Comm_rank(hypre_MPI_COMM_WORLD, &myid ); /*----------------------------------------------------------- * Parse command line *-----------------------------------------------------------*/ if (arg_index < argc) { filename = argv[arg_index]; } else { hypre_printf("Error: No filename specified \n"); exit(1); } /*----------------------------------------------------------- * Print driver parameters *-----------------------------------------------------------*/ if (myid == 0) { hypre_printf(" FromFile: %s\n", filename); /*----------------------------------------------------------- * Generate the matrix *-----------------------------------------------------------*/ A_CSR = HYPRE_CSRMatrixRead(filename); } A = HYPRE_CSRMatrixToParCSRMatrix(hypre_MPI_COMM_WORLD, A_CSR, NULL, NULL); *A_ptr = A; HYPRE_CSRMatrixDestroy(A_CSR); return (0); } /*---------------------------------------------------------------------- * Build Rhs from one file on Proc. 0. Distributes vector across processors * giving each about using the distribution of the matrix A. *----------------------------------------------------------------------*/ HYPRE_Int BuildRhsParFromOneFile( HYPRE_Int argc, char *argv[], HYPRE_Int arg_index, HYPRE_ParCSRMatrix A, HYPRE_ParVector *b_ptr ) { char *filename; HYPRE_ParVector b; HYPRE_Vector b_CSR; HYPRE_Int myid; HYPRE_Int *partitioning; /*----------------------------------------------------------- * Initialize some stuff *-----------------------------------------------------------*/ hypre_MPI_Comm_rank(hypre_MPI_COMM_WORLD, &myid ); /*----------------------------------------------------------- * Parse command line *-----------------------------------------------------------*/ if (arg_index < argc) { filename = argv[arg_index]; } else { hypre_printf("Error: No filename specified \n"); exit(1); } /*----------------------------------------------------------- * Print driver parameters *-----------------------------------------------------------*/ if (myid == 0) { hypre_printf(" Rhs FromFile: %s\n", filename); /*----------------------------------------------------------- * Generate the matrix *-----------------------------------------------------------*/ b_CSR = HYPRE_VectorRead(filename); } HYPRE_ParCSRMatrixGetRowPartitioning(A, &partitioning); b = HYPRE_VectorToParVector(hypre_MPI_COMM_WORLD, b_CSR, partitioning); *b_ptr = b; HYPRE_VectorDestroy(b_CSR); return (0); } /*---------------------------------------------------------------------- * Build standard 9-point laplacian in 2D with grid and anisotropy. * Parameters given in command line. *----------------------------------------------------------------------*/ HYPRE_Int BuildParLaplacian9pt( HYPRE_Int argc, char *argv[], HYPRE_Int arg_index, HYPRE_ParCSRMatrix *A_ptr ) { HYPRE_Int nx, ny; HYPRE_Int P, Q; HYPRE_ParCSRMatrix A; HYPRE_Int num_procs, myid; HYPRE_Int p, q; HYPRE_Real *values; /*----------------------------------------------------------- * Initialize some stuff *-----------------------------------------------------------*/ hypre_MPI_Comm_size(hypre_MPI_COMM_WORLD, &num_procs ); hypre_MPI_Comm_rank(hypre_MPI_COMM_WORLD, &myid ); /*----------------------------------------------------------- * Set defaults *-----------------------------------------------------------*/ nx = 10; ny = 10; P = 1; Q = num_procs; /*----------------------------------------------------------- * Parse command line *-----------------------------------------------------------*/ arg_index = 0; while (arg_index < argc) { if ( strcmp(argv[arg_index], "-n") == 0 ) { arg_index++; nx = atoi(argv[arg_index++]); ny = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-P") == 0 ) { arg_index++; P = atoi(argv[arg_index++]); Q = atoi(argv[arg_index++]); } else { arg_index++; } } /*----------------------------------------------------------- * Check a few things *-----------------------------------------------------------*/ if ((P * Q) != num_procs) { hypre_printf("Error: Invalid number of processors or processor topology \n"); exit(1); } /*----------------------------------------------------------- * Print driver parameters *-----------------------------------------------------------*/ if (myid == 0) { hypre_printf(" Laplacian 9pt:\n"); hypre_printf(" (nx, ny) = (%d, %d)\n", nx, ny); hypre_printf(" (Px, Py) = (%d, %d)\n", P, Q); } /*----------------------------------------------------------- * Set up the grid structure *-----------------------------------------------------------*/ /* compute p,q from P,Q and myid */ p = myid % P; q = ( myid - p) / P; /*----------------------------------------------------------- * Generate the matrix *-----------------------------------------------------------*/ values = hypre_CTAlloc(HYPRE_Real, 2, HYPRE_MEMORY_HOST); values[1] = -1.0; values[0] = 0.0; if (nx > 1) { values[0] += 2.0; } if (ny > 1) { values[0] += 2.0; } if (nx > 1 && ny > 1) { values[0] += 4.0; } A = (HYPRE_ParCSRMatrix) GenerateLaplacian9pt(hypre_MPI_COMM_WORLD, nx, ny, P, Q, p, q, values); hypre_TFree(values, HYPRE_MEMORY_HOST); *A_ptr = A; return (0); } /*---------------------------------------------------------------------- * Build 27-point laplacian in 3D, * Parameters given in command line. *----------------------------------------------------------------------*/ HYPRE_Int BuildParLaplacian27pt( HYPRE_Int argc, char *argv[], HYPRE_Int arg_index, HYPRE_ParCSRMatrix *A_ptr ) { HYPRE_Int nx, ny, nz; HYPRE_Int P, Q, R; HYPRE_ParCSRMatrix A; HYPRE_Int num_procs, myid; HYPRE_Int p, q, r; HYPRE_Real *values; /*----------------------------------------------------------- * Initialize some stuff *-----------------------------------------------------------*/ hypre_MPI_Comm_size(hypre_MPI_COMM_WORLD, &num_procs ); hypre_MPI_Comm_rank(hypre_MPI_COMM_WORLD, &myid ); /*----------------------------------------------------------- * Set defaults *-----------------------------------------------------------*/ nx = 10; ny = 10; nz = 10; P = 1; Q = num_procs; R = 1; /*----------------------------------------------------------- * Parse command line *-----------------------------------------------------------*/ arg_index = 0; while (arg_index < argc) { if ( strcmp(argv[arg_index], "-n") == 0 ) { arg_index++; nx = atoi(argv[arg_index++]); ny = atoi(argv[arg_index++]); nz = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-P") == 0 ) { arg_index++; P = atoi(argv[arg_index++]); Q = atoi(argv[arg_index++]); R = atoi(argv[arg_index++]); } else { arg_index++; } } /*----------------------------------------------------------- * Check a few things *-----------------------------------------------------------*/ if ((P * Q * R) != num_procs) { hypre_printf("Error: Invalid number of processors or processor topology \n"); exit(1); } /*----------------------------------------------------------- * Print driver parameters *-----------------------------------------------------------*/ if (myid == 0) { hypre_printf(" Laplacian_27pt:\n"); hypre_printf(" (nx, ny, nz) = (%d, %d, %d)\n", nx, ny, nz); hypre_printf(" (Px, Py, Pz) = (%d, %d, %d)\n", P, Q, R); } /*----------------------------------------------------------- * Set up the grid structure *-----------------------------------------------------------*/ /* compute p,q,r from P,Q,R and myid */ p = myid % P; q = (( myid - p) / P) % Q; r = ( myid - p - P * q) / ( P * Q ); /*----------------------------------------------------------- * Generate the matrix *-----------------------------------------------------------*/ values = hypre_CTAlloc(HYPRE_Real, 2, HYPRE_MEMORY_HOST); values[0] = 26.0; if (nx == 1 || ny == 1 || nz == 1) { values[0] = 8.0; } if (nx * ny == 1 || nx * nz == 1 || ny * nz == 1) { values[0] = 2.0; } values[1] = -1.0; A = (HYPRE_ParCSRMatrix) GenerateLaplacian27pt(hypre_MPI_COMM_WORLD, nx, ny, nz, P, Q, R, p, q, r, values); hypre_TFree(values, HYPRE_MEMORY_HOST); *A_ptr = A; return (0); } hypre-2.33.0/src/parcsr_ls/dsuperlu.c000066400000000000000000000223311477326011500175230ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "_hypre_parcsr_ls.h" #include #ifdef HYPRE_USING_DSUPERLU #include "dsuperlu.h" #include #include "superlu_ddefs.h" /* #ifndef hypre_DSLU_DATA_HEADER #define hypre_DSLU_DATA_HEADER typedef struct { HYPRE_BigInt global_num_rows; SuperMatrix A_dslu; HYPRE_Real *berr; dLUstruct_t dslu_data_LU; SuperLUStat_t dslu_data_stat; superlu_dist_options_t dslu_options; gridinfo_t dslu_data_grid; dScalePermstruct_t dslu_ScalePermstruct; dSOLVEstruct_t dslu_solve; } hypre_DSLUData; #endif */ /*-------------------------------------------------------------------------- * hypre_SLUDistSetup *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SLUDistSetup(HYPRE_Solver *solver, hypre_ParCSRMatrix *A, HYPRE_Int print_level) { /* Par Data Structure variables */ HYPRE_BigInt global_num_rows = hypre_ParCSRMatrixGlobalNumRows(A); MPI_Comm comm = hypre_ParCSRMatrixComm(A); hypre_CSRMatrix *A_local; HYPRE_Int pcols = 1; HYPRE_Int prows = 1; hypre_DSLUData *dslu_data = NULL; HYPRE_Int nrhs = 0; HYPRE_Int num_rows; HYPRE_Int num_procs, my_id; HYPRE_Int i; /* SuperLU_Dist variables. Note it uses "int_t" to denote integer types */ hypre_int slu_info = 0; int_t *slu_rowptr; int_t *slu_colidx; hypre_double *slu_data; hypre_MPI_Comm_size(comm, &num_procs); hypre_MPI_Comm_rank(comm, &my_id); /* destroy solver if already setup */ // if (solver != NULL) { hypre_SLUDistDestroy(solver); } /* allocate memory for new solver */ dslu_data = hypre_CTAlloc(hypre_DSLUData, 1, HYPRE_MEMORY_HOST); /* Merge diag and offd into one matrix (global ids) */ A_local = hypre_MergeDiagAndOffd(A); #if defined(HYPRE_USING_GPU) if (hypre_GetActualMemLocation(hypre_CSRMatrixMemoryLocation(A_local)) != hypre_MEMORY_HOST) { hypre_CSRMatrixMigrate(A_local, HYPRE_MEMORY_HOST); } #endif num_rows = hypre_CSRMatrixNumRows(A_local); /* SuperLU uses int_t to denote its integer type. Hence, the conversion/checks below: */ if (sizeof(int_t) != sizeof(HYPRE_Int)) { slu_rowptr = hypre_CTAlloc(int_t, (num_rows + 1), hypre_CSRMatrixMemoryLocation(A_local)); for (i = 0; i < num_rows + 1; i++) { slu_rowptr[i] = (int_t) hypre_CSRMatrixI(A_local)[i]; } } else { slu_rowptr = (int_t*) hypre_CSRMatrixI(A_local); } if (sizeof(int_t) != sizeof(HYPRE_BigInt)) { slu_colidx = hypre_CTAlloc(int_t, hypre_CSRMatrixNumNonzeros(A_local), hypre_CSRMatrixMemoryLocation(A_local)); for (i = 0; i < hypre_CSRMatrixNumNonzeros(A_local); i++) { slu_colidx[i] = (int_t) hypre_CSRMatrixBigJ(A_local)[i]; } } else { slu_colidx = (int_t*) hypre_CSRMatrixBigJ(A_local); } /* SuperLU uses dbl to denote its floating point type. Hence, the conversion/checks below: */ if (sizeof(hypre_double) != sizeof(HYPRE_Complex)) { slu_data = hypre_CTAlloc(hypre_double, hypre_CSRMatrixNumNonzeros(A_local), hypre_CSRMatrixMemoryLocation(A_local)); for (i = 0; i < hypre_CSRMatrixNumNonzeros(A_local); i++) { slu_data[i] = (hypre_double) hypre_CSRMatrixData(A_local)[i]; } } else { slu_data = (hypre_double*) hypre_CSRMatrixData(A_local); } /* Now convert hypre matrix to a SuperMatrix */ dCreate_CompRowLoc_Matrix_dist( &(dslu_data->A_dslu), (int_t) global_num_rows, (int_t) global_num_rows, (int_t) hypre_CSRMatrixNumNonzeros(A_local), (int_t) num_rows, (int_t) hypre_ParCSRMatrixFirstRowIndex(A), slu_data, slu_colidx, slu_rowptr, SLU_NR_loc, SLU_D, SLU_GE); /* DOK: SuperLU frees assigned data, so set them to null before calling hypre_CSRMatrixdestroy on A_local to avoid memory errors. */ if ((void*) slu_rowptr == (void*) hypre_CSRMatrixI(A_local)) { hypre_CSRMatrixI(A_local) = NULL; } if ((void*) slu_colidx == (void*) hypre_CSRMatrixBigJ(A_local)) { hypre_CSRMatrixBigJ(A_local) = NULL; } if ((void*) slu_data == (void*) hypre_CSRMatrixData(A_local)) { hypre_CSRMatrixData(A_local) = NULL; } hypre_CSRMatrixDestroy(A_local); /* Create process grid */ while (prows * pcols <= num_procs) { ++prows; } --prows; pcols = num_procs / prows; while (prows * pcols != num_procs) { prows -= 1; pcols = num_procs / prows; } //hypre_printf(" prows %d pcols %d\n", prows, pcols); superlu_gridinit(comm, prows, pcols, &(dslu_data->dslu_data_grid)); set_default_options_dist(&(dslu_data->dslu_options)); dslu_data->dslu_options.Fact = DOFACT; if (print_level == 0 || print_level == 2) { dslu_data->dslu_options.PrintStat = NO; } /*dslu_data->dslu_options.IterRefine = SLU_DOUBLE; dslu_data->dslu_options.ColPerm = MMD_AT_PLUS_A; dslu_data->dslu_options.DiagPivotThresh = 1.0; dslu_data->dslu_options.ReplaceTinyPivot = NO; */ dScalePermstructInit(global_num_rows, global_num_rows, &(dslu_data->dslu_ScalePermstruct)); dLUstructInit(global_num_rows, &(dslu_data->dslu_data_LU)); PStatInit(&(dslu_data->dslu_data_stat)); dslu_data->global_num_rows = global_num_rows; dslu_data->berr = hypre_CTAlloc(HYPRE_Real, 1, HYPRE_MEMORY_HOST); dslu_data->berr[0] = 0.0; pdgssvx(&(dslu_data->dslu_options), &(dslu_data->A_dslu), &(dslu_data->dslu_ScalePermstruct), NULL, num_rows, nrhs, &(dslu_data->dslu_data_grid), &(dslu_data->dslu_data_LU), &(dslu_data->dslu_solve), dslu_data->berr, &(dslu_data->dslu_data_stat), &slu_info); dslu_data->dslu_options.Fact = FACTORED; *solver = (HYPRE_Solver) dslu_data; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_SLUDistSolve *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SLUDistSolve(void *solver, hypre_ParVector *b, hypre_ParVector *x) { hypre_DSLUData *dslu_data = (hypre_DSLUData *) solver; HYPRE_Real *x_data; HYPRE_Int size = hypre_VectorSize(hypre_ParVectorLocalVector(x)); HYPRE_Int nrhs = 1; HYPRE_Int i; hypre_int slu_info; hypre_double *slu_data; hypre_ParVectorCopy(b, x); #if defined(HYPRE_USING_GPU) hypre_ParVector *x_host = NULL; if (hypre_GetActualMemLocation(hypre_ParVectorMemoryLocation(x)) != hypre_MEMORY_HOST) { x_host = hypre_ParVectorCloneDeep_v2(x, HYPRE_MEMORY_HOST); x_data = hypre_VectorData(hypre_ParVectorLocalVector(x_host)); } else #endif { x_data = hypre_VectorData(hypre_ParVectorLocalVector(x)); } /* SuperLU uses sbl to denote its floating point type. Hence, the conversion/checks below: */ if (sizeof(hypre_double) != sizeof(HYPRE_Complex)) { slu_data = hypre_CTAlloc(hypre_double, size, HYPRE_MEMORY_HOST); for (i = 0; i < size; i++) { slu_data[i] = (hypre_double) x_data[i]; } } else { slu_data = (hypre_double*) x_data; } pdgssvx(&(dslu_data->dslu_options), &(dslu_data->A_dslu), &(dslu_data->dslu_ScalePermstruct), slu_data, (int_t) size, (int_t) nrhs, &(dslu_data->dslu_data_grid), &(dslu_data->dslu_data_LU), &(dslu_data->dslu_solve), dslu_data->berr, &(dslu_data->dslu_data_stat), &slu_info); /* Free memory */ if ((void*) slu_data != (void*) x_data) { hypre_TFree(slu_data, HYPRE_MEMORY_HOST); } #if defined(HYPRE_USING_GPU) if (x_host) { hypre_ParVectorCopy(x_host, x); hypre_ParVectorDestroy(x_host); } #endif return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_SLUDistDestroy *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SLUDistDestroy(void* solver) { hypre_DSLUData *dslu_data = (hypre_DSLUData *) solver; PStatFree(&(dslu_data->dslu_data_stat)); Destroy_CompRowLoc_Matrix_dist(&(dslu_data->A_dslu)); dScalePermstructFree(&(dslu_data->dslu_ScalePermstruct)); dDestroy_LU(dslu_data->global_num_rows, &(dslu_data->dslu_data_grid), &(dslu_data->dslu_data_LU)); dLUstructFree(&(dslu_data->dslu_data_LU)); if (dslu_data->dslu_options.SolveInitialized) { dSolveFinalize(&(dslu_data->dslu_options), &(dslu_data->dslu_solve)); } superlu_gridexit(&(dslu_data->dslu_data_grid)); hypre_TFree(dslu_data->berr, HYPRE_MEMORY_HOST); hypre_TFree(dslu_data, HYPRE_MEMORY_HOST); return hypre_error_flag; } #endif hypre-2.33.0/src/parcsr_ls/dsuperlu.h000066400000000000000000000020171477326011500175270ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #ifndef hypre_DSLU_DATA_HEADER #define hypre_DSLU_DATA_HEADER #include "superlu_ddefs.h" /*-------------------------------------------------------------------------- * hypre_DSLUData *--------------------------------------------------------------------------*/ typedef struct { HYPRE_BigInt global_num_rows; SuperMatrix A_dslu; hypre_double *berr; dLUstruct_t dslu_data_LU; SuperLUStat_t dslu_data_stat; superlu_dist_options_t dslu_options; gridinfo_t dslu_data_grid; dScalePermstruct_t dslu_ScalePermstruct; dSOLVEstruct_t dslu_solve; } hypre_DSLUData; #endif hypre-2.33.0/src/parcsr_ls/gen_redcs_mat.c000066400000000000000000000515321477326011500204570ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "_hypre_parcsr_ls.h" #include "par_amg.h" #define USE_ALLTOALL 0 /* here we have the sequential setup and solve - called from the * parallel one - for the coarser levels */ HYPRE_Int hypre_seqAMGSetup( hypre_ParAMGData *amg_data, HYPRE_Int p_level, HYPRE_Int coarse_threshold) { HYPRE_UNUSED_VAR(coarse_threshold); /* Par Data Structure variables */ hypre_ParCSRMatrix **Par_A_array = hypre_ParAMGDataAArray(amg_data); MPI_Comm comm = hypre_ParCSRMatrixComm(Par_A_array[0]); MPI_Comm new_comm, seq_comm; hypre_ParCSRMatrix *A_seq = NULL; hypre_CSRMatrix *A_seq_diag; hypre_CSRMatrix *A_seq_offd; hypre_ParVector *F_seq = NULL; hypre_ParVector *U_seq = NULL; hypre_ParCSRMatrix *A; hypre_IntArray **dof_func_array; HYPRE_Int num_procs, my_id; HYPRE_Int level; HYPRE_Int redundant; HYPRE_Int num_functions; HYPRE_Solver coarse_solver; /* misc */ dof_func_array = hypre_ParAMGDataDofFuncArray(amg_data); num_functions = hypre_ParAMGDataNumFunctions(amg_data); redundant = hypre_ParAMGDataRedundant(amg_data); /*MPI Stuff */ hypre_MPI_Comm_size(comm, &num_procs); /*initial */ level = p_level; /* convert A at this level to sequential */ A = Par_A_array[level]; HYPRE_MemoryLocation memory_location = hypre_ParCSRMatrixMemoryLocation(A); { HYPRE_Real *A_seq_data = NULL; HYPRE_Int *A_seq_i = NULL; HYPRE_Int *A_seq_offd_i = NULL; HYPRE_Int *A_seq_j = NULL; HYPRE_Int *seq_dof_func = NULL; HYPRE_Real *A_tmp_data = NULL; HYPRE_Int *A_tmp_i = NULL; HYPRE_Int *A_tmp_j = NULL; HYPRE_Int *info = NULL; HYPRE_Int *displs = NULL; HYPRE_Int *displs2 = NULL; HYPRE_Int i, j, size, num_nonzeros, total_nnz = 0, cnt; hypre_CSRMatrix *A_diag = hypre_ParCSRMatrixDiag(A); hypre_CSRMatrix *A_offd = hypre_ParCSRMatrixOffd(A); HYPRE_BigInt *col_map_offd = hypre_ParCSRMatrixColMapOffd(A); HYPRE_Int *A_diag_i = hypre_CSRMatrixI(A_diag); HYPRE_Int *A_offd_i = hypre_CSRMatrixI(A_offd); HYPRE_Int *A_diag_j = hypre_CSRMatrixJ(A_diag); HYPRE_Int *A_offd_j = hypre_CSRMatrixJ(A_offd); HYPRE_Real *A_diag_data = hypre_CSRMatrixData(A_diag); HYPRE_Real *A_offd_data = hypre_CSRMatrixData(A_offd); HYPRE_Int num_rows = hypre_CSRMatrixNumRows(A_diag); HYPRE_BigInt first_row_index = hypre_ParCSRMatrixFirstRowIndex(A); HYPRE_Int new_num_procs; HYPRE_BigInt row_starts[2]; hypre_GenerateSubComm(comm, num_rows, &new_comm); /*hypre_MPI_Group orig_group, new_group; HYPRE_Int *ranks, new_num_procs, *row_starts; info = hypre_CTAlloc(HYPRE_Int, num_procs, HYPRE_MEMORY_HOST); hypre_MPI_Allgather(&num_rows, 1, HYPRE_MPI_INT, info, 1, HYPRE_MPI_INT, comm); ranks = hypre_CTAlloc(HYPRE_Int, num_procs, HYPRE_MEMORY_HOST); new_num_procs = 0; for (i=0; i < num_procs; i++) if (info[i]) { ranks[new_num_procs] = i; info[new_num_procs++] = info[i]; } hypre_MPI_Comm_group(comm, &orig_group); hypre_MPI_Group_incl(orig_group, new_num_procs, ranks, &new_group); hypre_MPI_Comm_create(comm, new_group, &new_comm); hypre_MPI_Group_free(&new_group); hypre_MPI_Group_free(&orig_group); */ if (num_rows) { hypre_ParAMGDataParticipate(amg_data) = 1; hypre_MPI_Comm_size(new_comm, &new_num_procs); hypre_MPI_Comm_rank(new_comm, &my_id); info = hypre_CTAlloc(HYPRE_Int, new_num_procs, HYPRE_MEMORY_HOST); if (redundant) { hypre_MPI_Allgather(&num_rows, 1, HYPRE_MPI_INT, info, 1, HYPRE_MPI_INT, new_comm); } else { hypre_MPI_Gather(&num_rows, 1, HYPRE_MPI_INT, info, 1, HYPRE_MPI_INT, 0, new_comm); } /* alloc space in seq data structure only for participating procs*/ if (redundant || my_id == 0) { HYPRE_BoomerAMGCreate(&coarse_solver); HYPRE_BoomerAMGSetMaxRowSum(coarse_solver, hypre_ParAMGDataMaxRowSum(amg_data)); HYPRE_BoomerAMGSetStrongThreshold(coarse_solver, hypre_ParAMGDataStrongThreshold(amg_data)); HYPRE_BoomerAMGSetCoarsenType(coarse_solver, hypre_ParAMGDataCoarsenType(amg_data)); HYPRE_BoomerAMGSetInterpType(coarse_solver, hypre_ParAMGDataInterpType(amg_data)); HYPRE_BoomerAMGSetTruncFactor(coarse_solver, hypre_ParAMGDataTruncFactor(amg_data)); HYPRE_BoomerAMGSetPMaxElmts(coarse_solver, hypre_ParAMGDataPMaxElmts(amg_data)); if (hypre_ParAMGDataUserRelaxType(amg_data) > -1) HYPRE_BoomerAMGSetRelaxType(coarse_solver, hypre_ParAMGDataUserRelaxType(amg_data)); HYPRE_BoomerAMGSetRelaxOrder(coarse_solver, hypre_ParAMGDataRelaxOrder(amg_data)); HYPRE_BoomerAMGSetRelaxWt(coarse_solver, hypre_ParAMGDataUserRelaxWeight(amg_data)); if (hypre_ParAMGDataUserNumSweeps(amg_data) > -1) HYPRE_BoomerAMGSetNumSweeps(coarse_solver, hypre_ParAMGDataUserNumSweeps(amg_data)); HYPRE_BoomerAMGSetNumFunctions(coarse_solver, num_functions); HYPRE_BoomerAMGSetMaxIter(coarse_solver, 1); HYPRE_BoomerAMGSetTol(coarse_solver, 0); } /* Create CSR Matrix, will be Diag part of new matrix */ A_tmp_i = hypre_CTAlloc(HYPRE_Int, num_rows + 1, HYPRE_MEMORY_HOST); A_tmp_i[0] = 0; for (i = 1; i < num_rows + 1; i++) { A_tmp_i[i] = A_diag_i[i] - A_diag_i[i - 1] + A_offd_i[i] - A_offd_i[i - 1]; } num_nonzeros = A_offd_i[num_rows] + A_diag_i[num_rows]; A_tmp_j = hypre_CTAlloc(HYPRE_Int, num_nonzeros, HYPRE_MEMORY_HOST); A_tmp_data = hypre_CTAlloc(HYPRE_Real, num_nonzeros, HYPRE_MEMORY_HOST); cnt = 0; for (i = 0; i < num_rows; i++) { for (j = A_diag_i[i]; j < A_diag_i[i + 1]; j++) { A_tmp_j[cnt] = A_diag_j[j] + (HYPRE_Int)first_row_index; A_tmp_data[cnt++] = A_diag_data[j]; } for (j = A_offd_i[i]; j < A_offd_i[i + 1]; j++) { A_tmp_j[cnt] = (HYPRE_Int)col_map_offd[A_offd_j[j]]; A_tmp_data[cnt++] = A_offd_data[j]; } } displs = hypre_CTAlloc(HYPRE_Int, new_num_procs + 1, HYPRE_MEMORY_HOST); displs[0] = 0; for (i = 1; i < new_num_procs + 1; i++) { displs[i] = displs[i - 1] + info[i - 1]; } size = displs[new_num_procs]; if (redundant || my_id == 0) { A_seq_i = hypre_CTAlloc(HYPRE_Int, size + 1, memory_location); A_seq_offd_i = hypre_CTAlloc(HYPRE_Int, size + 1, memory_location); if (num_functions > 1) { seq_dof_func = hypre_CTAlloc(HYPRE_Int, size, memory_location); } } if (redundant) { hypre_MPI_Allgatherv ( &A_tmp_i[1], num_rows, HYPRE_MPI_INT, &A_seq_i[1], info, displs, HYPRE_MPI_INT, new_comm ); if (num_functions > 1) { hypre_MPI_Allgatherv ( hypre_IntArrayData(dof_func_array[level]), num_rows, HYPRE_MPI_INT, seq_dof_func, info, displs, HYPRE_MPI_INT, new_comm ); HYPRE_BoomerAMGSetDofFunc(coarse_solver, seq_dof_func); } } else { if (A_seq_i) hypre_MPI_Gatherv ( &A_tmp_i[1], num_rows, HYPRE_MPI_INT, &A_seq_i[1], info, displs, HYPRE_MPI_INT, 0, new_comm ); else hypre_MPI_Gatherv ( &A_tmp_i[1], num_rows, HYPRE_MPI_INT, A_seq_i, info, displs, HYPRE_MPI_INT, 0, new_comm ); if (num_functions > 1) { hypre_MPI_Gatherv ( hypre_IntArrayData(dof_func_array[level]), num_rows, HYPRE_MPI_INT, seq_dof_func, info, displs, HYPRE_MPI_INT, 0, new_comm ); if (my_id == 0) { HYPRE_BoomerAMGSetDofFunc(coarse_solver, seq_dof_func); } } } if (redundant || my_id == 0) { displs2 = hypre_CTAlloc(HYPRE_Int, new_num_procs + 1, HYPRE_MEMORY_HOST); A_seq_i[0] = 0; displs2[0] = 0; for (j = 1; j < displs[1]; j++) { A_seq_i[j] = A_seq_i[j] + A_seq_i[j - 1]; } for (i = 1; i < new_num_procs; i++) { for (j = displs[i]; j < displs[i + 1]; j++) { A_seq_i[j] = A_seq_i[j] + A_seq_i[j - 1]; } } A_seq_i[size] = A_seq_i[size] + A_seq_i[size - 1]; displs2[new_num_procs] = A_seq_i[size]; for (i = 1; i < new_num_procs + 1; i++) { displs2[i] = A_seq_i[displs[i]]; info[i - 1] = displs2[i] - displs2[i - 1]; } total_nnz = displs2[new_num_procs]; A_seq_j = hypre_CTAlloc(HYPRE_Int, total_nnz, memory_location); A_seq_data = hypre_CTAlloc(HYPRE_Real, total_nnz, memory_location); } if (redundant) { hypre_MPI_Allgatherv ( A_tmp_j, num_nonzeros, HYPRE_MPI_INT, A_seq_j, info, displs2, HYPRE_MPI_INT, new_comm ); hypre_MPI_Allgatherv ( A_tmp_data, num_nonzeros, HYPRE_MPI_REAL, A_seq_data, info, displs2, HYPRE_MPI_REAL, new_comm ); } else { hypre_MPI_Gatherv ( A_tmp_j, num_nonzeros, HYPRE_MPI_INT, A_seq_j, info, displs2, HYPRE_MPI_INT, 0, new_comm ); hypre_MPI_Gatherv ( A_tmp_data, num_nonzeros, HYPRE_MPI_REAL, A_seq_data, info, displs2, HYPRE_MPI_REAL, 0, new_comm ); } hypre_TFree(info, HYPRE_MEMORY_HOST); hypre_TFree(displs, HYPRE_MEMORY_HOST); hypre_TFree(A_tmp_i, HYPRE_MEMORY_HOST); hypre_TFree(A_tmp_j, HYPRE_MEMORY_HOST); hypre_TFree(A_tmp_data, HYPRE_MEMORY_HOST); if (redundant || my_id == 0) { hypre_TFree(displs2, HYPRE_MEMORY_HOST); row_starts[0] = 0; row_starts[1] = size; /* Create 1 proc communicator */ seq_comm = hypre_MPI_COMM_SELF; A_seq = hypre_ParCSRMatrixCreate(seq_comm, size, size, row_starts, row_starts, 0, total_nnz, 0); A_seq_diag = hypre_ParCSRMatrixDiag(A_seq); A_seq_offd = hypre_ParCSRMatrixOffd(A_seq); hypre_CSRMatrixData(A_seq_diag) = A_seq_data; hypre_CSRMatrixI(A_seq_diag) = A_seq_i; hypre_CSRMatrixJ(A_seq_diag) = A_seq_j; hypre_CSRMatrixI(A_seq_offd) = A_seq_offd_i; F_seq = hypre_ParVectorCreate(seq_comm, size, row_starts); U_seq = hypre_ParVectorCreate(seq_comm, size, row_starts); hypre_ParVectorInitialize(F_seq); hypre_ParVectorInitialize(U_seq); hypre_BoomerAMGSetup(coarse_solver, A_seq, F_seq, U_seq); hypre_ParAMGDataCoarseSolver(amg_data) = coarse_solver; hypre_ParAMGDataACoarse(amg_data) = A_seq; hypre_ParAMGDataFCoarse(amg_data) = F_seq; hypre_ParAMGDataUCoarse(amg_data) = U_seq; } hypre_ParAMGDataNewComm(amg_data) = new_comm; } } return 0; } /*-------------------------------------------------------------------------- * hypre_seqAMGCycle *--------------------------------------------------------------------------*/ HYPRE_Int hypre_seqAMGCycle( hypre_ParAMGData *amg_data, HYPRE_Int p_level, hypre_ParVector **Par_F_array, hypre_ParVector **Par_U_array ) { hypre_ParVector *Aux_U; hypre_ParVector *Aux_F; /* Local variables */ HYPRE_Int Solve_err_flag = 0; HYPRE_Int n; HYPRE_Int i; hypre_Vector *u_local; HYPRE_Real *u_data; HYPRE_Int first_index; /* Acquire seq data */ MPI_Comm new_comm = hypre_ParAMGDataNewComm(amg_data); HYPRE_Solver coarse_solver = hypre_ParAMGDataCoarseSolver(amg_data); hypre_ParCSRMatrix *A_coarse = hypre_ParAMGDataACoarse(amg_data); hypre_ParVector *F_coarse = hypre_ParAMGDataFCoarse(amg_data); hypre_ParVector *U_coarse = hypre_ParAMGDataUCoarse(amg_data); HYPRE_Int redundant = hypre_ParAMGDataRedundant(amg_data); Aux_U = Par_U_array[p_level]; Aux_F = Par_F_array[p_level]; first_index = (HYPRE_Int)hypre_ParVectorFirstIndex(Aux_U); u_local = hypre_ParVectorLocalVector(Aux_U); u_data = hypre_VectorData(u_local); n = hypre_VectorSize(u_local); /*if (A_coarse)*/ if (hypre_ParAMGDataParticipate(amg_data)) { HYPRE_Real *f_data; hypre_Vector *f_local; hypre_Vector *tmp_vec; HYPRE_Int nf; HYPRE_Int local_info; HYPRE_Real *recv_buf = NULL; HYPRE_Int *displs = NULL; HYPRE_Int *info = NULL; HYPRE_Int new_num_procs, my_id; hypre_MPI_Comm_size(new_comm, &new_num_procs); hypre_MPI_Comm_rank(new_comm, &my_id); f_local = hypre_ParVectorLocalVector(Aux_F); f_data = hypre_VectorData(f_local); nf = hypre_VectorSize(f_local); /* first f */ info = hypre_CTAlloc(HYPRE_Int, new_num_procs, HYPRE_MEMORY_HOST); local_info = nf; if (redundant) { hypre_MPI_Allgather(&local_info, 1, HYPRE_MPI_INT, info, 1, HYPRE_MPI_INT, new_comm); } else { hypre_MPI_Gather(&local_info, 1, HYPRE_MPI_INT, info, 1, HYPRE_MPI_INT, 0, new_comm); } if (redundant || my_id == 0) { displs = hypre_CTAlloc(HYPRE_Int, new_num_procs + 1, HYPRE_MEMORY_HOST); displs[0] = 0; for (i = 1; i < new_num_procs + 1; i++) { displs[i] = displs[i - 1] + info[i - 1]; } if (F_coarse) { tmp_vec = hypre_ParVectorLocalVector(F_coarse); recv_buf = hypre_VectorData(tmp_vec); } } if (redundant) hypre_MPI_Allgatherv ( f_data, nf, HYPRE_MPI_REAL, recv_buf, info, displs, HYPRE_MPI_REAL, new_comm ); else hypre_MPI_Gatherv ( f_data, nf, HYPRE_MPI_REAL, recv_buf, info, displs, HYPRE_MPI_REAL, 0, new_comm ); if (redundant || my_id == 0) { tmp_vec = hypre_ParVectorLocalVector(U_coarse); recv_buf = hypre_VectorData(tmp_vec); } /*then u */ if (redundant) { hypre_MPI_Allgatherv ( u_data, n, HYPRE_MPI_REAL, recv_buf, info, displs, HYPRE_MPI_REAL, new_comm ); hypre_TFree(displs, HYPRE_MEMORY_HOST); hypre_TFree(info, HYPRE_MEMORY_HOST); } else hypre_MPI_Gatherv ( u_data, n, HYPRE_MPI_REAL, recv_buf, info, displs, HYPRE_MPI_REAL, 0, new_comm ); /* clean up */ if (redundant || my_id == 0) { hypre_BoomerAMGSolve(coarse_solver, A_coarse, F_coarse, U_coarse); } /*copy my part of U to parallel vector */ if (redundant) { HYPRE_Real *local_data; local_data = hypre_VectorData(hypre_ParVectorLocalVector(U_coarse)); for (i = 0; i < n; i++) { u_data[i] = local_data[first_index + i]; } } else { HYPRE_Real *local_data = NULL; if (my_id == 0) { local_data = hypre_VectorData(hypre_ParVectorLocalVector(U_coarse)); } hypre_MPI_Scatterv ( local_data, info, displs, HYPRE_MPI_REAL, u_data, n, HYPRE_MPI_REAL, 0, new_comm ); /*if (my_id == 0) local_data = hypre_VectorData(hypre_ParVectorLocalVector(F_coarse)); hypre_MPI_Scatterv ( local_data, info, displs, HYPRE_MPI_REAL, f_data, n, HYPRE_MPI_REAL, 0, new_comm );*/ if (my_id == 0) { hypre_TFree(displs, HYPRE_MEMORY_HOST); } hypre_TFree(info, HYPRE_MEMORY_HOST); } } return (Solve_err_flag); } /*-------------------------------------------------------------------------- * hypre_GenerateSubComm * * generate sub communicator, which contains no idle processors *--------------------------------------------------------------------------*/ HYPRE_Int hypre_GenerateSubComm(MPI_Comm comm, HYPRE_Int participate, MPI_Comm *new_comm_ptr) { MPI_Comm new_comm; hypre_MPI_Group orig_group, new_group; hypre_MPI_Op hypre_MPI_MERGE; HYPRE_Int *info, *ranks, new_num_procs, my_info, my_id, num_procs; HYPRE_Int *list_len; hypre_MPI_Comm_rank(comm, &my_id); if (participate) { my_info = 1; } else { my_info = 0; } hypre_MPI_Allreduce(&my_info, &new_num_procs, 1, HYPRE_MPI_INT, hypre_MPI_SUM, comm); if (new_num_procs == 0) { new_comm = hypre_MPI_COMM_NULL; *new_comm_ptr = new_comm; return hypre_error_flag; } ranks = hypre_CTAlloc(HYPRE_Int, new_num_procs + 2, HYPRE_MEMORY_HOST); if (new_num_procs == 1) { if (participate) { my_info = my_id; } hypre_MPI_Allreduce(&my_info, &ranks[2], 1, HYPRE_MPI_INT, hypre_MPI_SUM, comm); } else { info = hypre_CTAlloc(HYPRE_Int, new_num_procs + 2, HYPRE_MEMORY_HOST); list_len = hypre_CTAlloc(HYPRE_Int, 1, HYPRE_MEMORY_HOST); if (participate) { info[0] = 1; info[1] = 1; info[2] = my_id; } else { info[0] = 0; } list_len[0] = new_num_procs + 2; hypre_MPI_Op_create((hypre_MPI_User_function *)hypre_merge_lists, 0, &hypre_MPI_MERGE); hypre_MPI_Allreduce(info, ranks, list_len[0], HYPRE_MPI_INT, hypre_MPI_MERGE, comm); hypre_MPI_Op_free (&hypre_MPI_MERGE); hypre_TFree(list_len, HYPRE_MEMORY_HOST); hypre_TFree(info, HYPRE_MEMORY_HOST); } hypre_MPI_Comm_size(comm, &num_procs); hypre_MPI_Comm_group(comm, &orig_group); hypre_MPI_Group_incl(orig_group, new_num_procs, &ranks[2], &new_group); hypre_MPI_Comm_create(comm, new_group, &new_comm); hypre_MPI_Group_free(&new_group); hypre_MPI_Group_free(&orig_group); hypre_TFree(ranks, HYPRE_MEMORY_HOST); *new_comm_ptr = new_comm; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_merge_lists *--------------------------------------------------------------------------*/ void hypre_merge_lists(HYPRE_Int *list1, HYPRE_Int *list2, hypre_int *np1, hypre_MPI_Datatype *dptr) { HYPRE_UNUSED_VAR(dptr); HYPRE_Int i, len1, len2, indx1, indx2; if (list1[0] == 0) { return; } else { list2[0] = 1; len1 = list1[1]; len2 = list2[1]; list2[1] = len1 + len2; if ((hypre_int)(list2[1]) > *np1 + 2) // RL:??? { printf("segfault in MPI User function merge_list\n"); } indx1 = len1 + 1; indx2 = len2 + 1; for (i = len1 + len2 + 1; i > 1; i--) { if (indx2 > 1 && indx1 > 1 && list1[indx1] > list2[indx2]) { list2[i] = list1[indx1]; indx1--; } else if (indx2 > 1) { list2[i] = list2[indx2]; indx2--; } else if (indx1 > 1) { list2[i] = list1[indx1]; indx1--; } } } } hypre-2.33.0/src/parcsr_ls/headers000077500000000000000000000031501477326011500170530ustar00rootroot00000000000000#!/bin/bash # Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) INTERNAL_HEADER=_hypre_parcsr_ls.h #=========================================================================== # Include guards and other includes #=========================================================================== cat > $INTERNAL_HEADER <<@ /*** DO NOT EDIT THIS FILE DIRECTLY (use 'headers' to generate) ***/ #ifndef hypre_PARCSR_LS_HEADER #define hypre_PARCSR_LS_HEADER #include #include "HYPRE_parcsr_ls.h" #include "_hypre_parcsr_mv.h" #include "krylov.h" #include "HYPRE_lobpcg.h" #ifdef __cplusplus extern "C" { #endif typedef struct { HYPRE_Int prev; HYPRE_Int next; } Link; @ cat par_amg.h >> $INTERNAL_HEADER cat par_amgdd_comp_grid.h >> $INTERNAL_HEADER cat par_amgdd.h >> $INTERNAL_HEADER cat par_fsai.h >> $INTERNAL_HEADER cat ams.h >> $INTERNAL_HEADER cat par_ilu.h >> $INTERNAL_HEADER cat protos.h >> $INTERNAL_HEADER #=========================================================================== # Structures and prototypes #=========================================================================== #../utilities/protos [!F]*.c >> $INTERNAL_HEADER #=========================================================================== # Include guards #=========================================================================== cat >> $INTERNAL_HEADER <<@ #ifdef __cplusplus } #endif #endif @ hypre-2.33.0/src/parcsr_ls/par_2s_interp.c000066400000000000000000001362721477326011500204410ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "_hypre_parcsr_ls.h" /*--------------------------------------------------------------------------- * hypre_BoomerAMGBuildModExtInterp * Comment: *--------------------------------------------------------------------------*/ HYPRE_Int hypre_BoomerAMGBuildModPartialExtInterpHost( hypre_ParCSRMatrix *A, HYPRE_Int *CF_marker, hypre_ParCSRMatrix *S, HYPRE_BigInt *num_cpts_global, HYPRE_BigInt *num_old_cpts_global, HYPRE_Int num_functions, HYPRE_Int *dof_func, HYPRE_Int debug_flag, HYPRE_Real trunc_factor, HYPRE_Int max_elmts, hypre_ParCSRMatrix **P_ptr ) { HYPRE_UNUSED_VAR(num_functions); HYPRE_UNUSED_VAR(dof_func); HYPRE_UNUSED_VAR(debug_flag); /* Communication Variables */ MPI_Comm comm = hypre_ParCSRMatrixComm(A); HYPRE_MemoryLocation memory_location_P = hypre_ParCSRMatrixMemoryLocation(A); hypre_ParCSRCommHandle *comm_handle = NULL; hypre_ParCSRCommPkg *comm_pkg = hypre_ParCSRMatrixCommPkg(A); HYPRE_Int my_id, num_procs; /* Variables to store input variables */ hypre_CSRMatrix *A_diag = hypre_ParCSRMatrixDiag(A); HYPRE_Real *A_diag_data = hypre_CSRMatrixData(A_diag); HYPRE_Int *A_diag_i = hypre_CSRMatrixI(A_diag); //HYPRE_Int *A_diag_j = hypre_CSRMatrixJ(A_diag); hypre_CSRMatrix *A_offd = hypre_ParCSRMatrixOffd(A); HYPRE_Real *A_offd_data = hypre_CSRMatrixData(A_offd); HYPRE_Int *A_offd_i = hypre_CSRMatrixI(A_offd); /*HYPRE_Int *A_offd_j = hypre_CSRMatrixJ(A_offd); hypre_CSRMatrix *S_diag = hypre_ParCSRMatrixDiag(S); HYPRE_Int *S_diag_j = hypre_CSRMatrixJ(S_diag); HYPRE_Int *S_diag_i = hypre_CSRMatrixI(S_diag); hypre_CSRMatrix *S_offd = hypre_ParCSRMatrixOffd(S); HYPRE_Int *S_offd_j = hypre_CSRMatrixJ(S_offd); HYPRE_Int *S_offd_i = hypre_CSRMatrixI(S_offd);*/ HYPRE_Int n_fine = hypre_CSRMatrixNumRows(A_diag); HYPRE_BigInt total_global_cpts; HYPRE_BigInt total_old_global_cpts; /* Interpolation matrix P */ hypre_ParCSRMatrix *P; hypre_CSRMatrix *P_diag; hypre_CSRMatrix *P_offd; HYPRE_Real *P_diag_data = NULL; HYPRE_Int *P_diag_i, *P_diag_j = NULL; HYPRE_Real *P_offd_data = NULL; HYPRE_Int *P_offd_i, *P_offd_j = NULL; /* Intermediate matrices */ hypre_ParCSRMatrix *As_FF, *As_FC, *W; HYPRE_Real *D_q, *D_w; HYPRE_Real *D_q_offd = NULL; hypre_CSRMatrix *As_FF_diag; hypre_CSRMatrix *As_FF_offd; hypre_CSRMatrix *As_FC_diag; hypre_CSRMatrix *As_FC_offd; hypre_CSRMatrix *W_diag; hypre_CSRMatrix *W_offd; HYPRE_Int *As_FF_diag_i; HYPRE_Int *As_FF_diag_j; HYPRE_Int *As_FF_offd_i; HYPRE_Int *As_FF_offd_j; HYPRE_Int *As_FC_diag_i; HYPRE_Int *As_FC_offd_i; HYPRE_Int *W_diag_i; HYPRE_Int *W_offd_i; HYPRE_Int *W_diag_j; HYPRE_Int *W_offd_j; HYPRE_Real *As_FF_diag_data; HYPRE_Real *As_FF_offd_data; HYPRE_Real *As_FC_diag_data; HYPRE_Real *As_FC_offd_data; HYPRE_Real *W_diag_data; HYPRE_Real *W_offd_data; HYPRE_Real *buf_data = NULL; HYPRE_BigInt *col_map_offd_P = NULL; HYPRE_BigInt *new_col_map_offd = NULL; HYPRE_Int P_diag_size; HYPRE_Int P_offd_size; HYPRE_Int num_cols_A_FF_offd; HYPRE_Int new_ncols_P_offd; HYPRE_Int num_cols_P_offd; HYPRE_Int *P_marker = NULL; //HYPRE_Int *dof_func_offd = NULL; /* Loop variables */ HYPRE_Int index; HYPRE_Int i, j; HYPRE_Int *cpt_array; HYPRE_Int *new_fpt_array; HYPRE_Int *start_array; HYPRE_Int *new_fine_to_fine; HYPRE_Int start, stop, startf, stopf, startnewf, stopnewf; HYPRE_Int cnt_diag, cnt_offd, row, c_pt, fpt; HYPRE_Int startc, num_sends; /* Definitions */ //HYPRE_Real wall_time; HYPRE_Int n_Cpts, n_Fpts, n_old_Cpts, n_new_Fpts; HYPRE_Int num_threads = hypre_NumThreads(); //if (debug_flag==4) wall_time = time_getWallclockSeconds(); /* BEGIN */ hypre_MPI_Comm_size(comm, &num_procs); hypre_MPI_Comm_rank(comm, &my_id); if (my_id == (num_procs - 1)) { total_global_cpts = num_cpts_global[1]; } if (my_id == (num_procs - 1)) { total_old_global_cpts = num_old_cpts_global[1]; } hypre_MPI_Bcast(&total_global_cpts, 1, HYPRE_MPI_BIG_INT, num_procs - 1, comm); hypre_MPI_Bcast(&total_old_global_cpts, 1, HYPRE_MPI_BIG_INT, num_procs - 1, comm); n_Cpts = num_cpts_global[1] - num_cpts_global[0]; n_old_Cpts = num_old_cpts_global[1] - num_old_cpts_global[0]; hypre_ParCSRMatrixGenerateFFFC3(A, CF_marker, num_cpts_global, S, &As_FC, &As_FF); As_FC_diag = hypre_ParCSRMatrixDiag(As_FC); As_FC_diag_i = hypre_CSRMatrixI(As_FC_diag); As_FC_diag_data = hypre_CSRMatrixData(As_FC_diag); As_FC_offd = hypre_ParCSRMatrixOffd(As_FC); As_FC_offd_i = hypre_CSRMatrixI(As_FC_offd); As_FC_offd_data = hypre_CSRMatrixData(As_FC_offd); As_FF_diag = hypre_ParCSRMatrixDiag(As_FF); As_FF_diag_i = hypre_CSRMatrixI(As_FF_diag); As_FF_diag_j = hypre_CSRMatrixJ(As_FF_diag); As_FF_diag_data = hypre_CSRMatrixData(As_FF_diag); As_FF_offd = hypre_ParCSRMatrixOffd(As_FF); As_FF_offd_i = hypre_CSRMatrixI(As_FF_offd); As_FF_offd_j = hypre_CSRMatrixJ(As_FF_offd); As_FF_offd_data = hypre_CSRMatrixData(As_FF_offd); n_new_Fpts = hypre_CSRMatrixNumRows(As_FF_diag); n_Fpts = hypre_CSRMatrixNumRows(As_FC_diag); n_new_Fpts = n_old_Cpts - n_Cpts; num_cols_A_FF_offd = hypre_CSRMatrixNumCols(As_FF_offd); D_q = hypre_CTAlloc(HYPRE_Real, n_Fpts, memory_location_P); new_fine_to_fine = hypre_CTAlloc(HYPRE_Int, n_new_Fpts, HYPRE_MEMORY_HOST); D_w = hypre_CTAlloc(HYPRE_Real, n_new_Fpts, memory_location_P); cpt_array = hypre_CTAlloc(HYPRE_Int, num_threads, HYPRE_MEMORY_HOST); new_fpt_array = hypre_CTAlloc(HYPRE_Int, num_threads, HYPRE_MEMORY_HOST); start_array = hypre_CTAlloc(HYPRE_Int, num_threads + 1, HYPRE_MEMORY_HOST); #ifdef HYPRE_USING_OPENMP #pragma omp parallel private(i,j,start,stop,startf,stopf,startnewf,stopnewf,row,fpt) #endif { HYPRE_Int my_thread_num = hypre_GetThreadNum(); HYPRE_Real beta, gamma; start = (n_fine / num_threads) * my_thread_num; if (my_thread_num == num_threads - 1) { stop = n_fine; } else { stop = (n_fine / num_threads) * (my_thread_num + 1); } start_array[my_thread_num + 1] = stop; row = 0; for (i = start; i < stop; i++) { if (CF_marker[i] > 0) { cpt_array[my_thread_num]++; } else if (CF_marker[i] == -2) { new_fpt_array[my_thread_num]++; } } #ifdef HYPRE_USING_OPENMP #pragma omp barrier #endif if (my_thread_num == 0) { for (i = 1; i < num_threads; i++) { cpt_array[i] += cpt_array[i - 1]; new_fpt_array[i] += new_fpt_array[i - 1]; } /*if (num_functions > 1) { HYPRE_Int *int_buf_data = NULL; HYPRE_Int num_sends, startc; HYPRE_Int num_cols_A_offd = hypre_CSRMatrixNumCols(A_offd); dof_func_offd = hypre_CTAlloc(HYPRE_Int, num_cols_A_offd, memory_location_P); index = 0; num_sends = hypre_ParCSRCommPkgNumSends(comm_pkg); int_buf_data = hypre_CTAlloc(HYPRE_Int, hypre_ParCSRCommPkgSendMapStart(comm_pkg, num_sends), memory_location_P); for (i = 0; i < num_sends; i++) { startc = hypre_ParCSRCommPkgSendMapStart(comm_pkg, i); for (j = startc; j < hypre_ParCSRCommPkgSendMapStart(comm_pkg, i+1); j++) { int_buf_data[index++] = dof_func[hypre_ParCSRCommPkgSendMapElmt(comm_pkg,j)]; } } comm_handle = hypre_ParCSRCommHandleCreate( 11, comm_pkg, int_buf_data, dof_func_offd); hypre_ParCSRCommHandleDestroy(comm_handle); hypre_TFree(int_buf_data, memory_location_P); }*/ } #ifdef HYPRE_USING_OPENMP #pragma omp barrier #endif if (my_thread_num > 0) { startf = start - cpt_array[my_thread_num - 1]; } else { startf = 0; } if (my_thread_num < num_threads - 1) { stopf = stop - cpt_array[my_thread_num]; } else { stopf = n_Fpts; } /* Create D_q = D_beta */ for (i = startf; i < stopf; i++) { for (j = As_FC_diag_i[i]; j < As_FC_diag_i[i + 1]; j++) { D_q[i] += As_FC_diag_data[j]; } for (j = As_FC_offd_i[i]; j < As_FC_offd_i[i + 1]; j++) { D_q[i] += As_FC_offd_data[j]; } } row = 0; if (my_thread_num) { row = new_fpt_array[my_thread_num - 1]; } fpt = startf; for (i = start; i < stop; i++) { if (CF_marker[i] == -2) { new_fine_to_fine[row++] = fpt++; } else if (CF_marker[i] < 0) { fpt++; } } #ifdef HYPRE_USING_OPENMP #pragma omp barrier #endif if (my_thread_num == 0) { if (num_cols_A_FF_offd) { D_q_offd = hypre_CTAlloc(HYPRE_Real, num_cols_A_FF_offd, memory_location_P); } index = 0; comm_pkg = hypre_ParCSRMatrixCommPkg(As_FF); if (!comm_pkg) { hypre_MatvecCommPkgCreate(As_FF); comm_pkg = hypre_ParCSRMatrixCommPkg(As_FF); } num_sends = hypre_ParCSRCommPkgNumSends(comm_pkg); buf_data = hypre_CTAlloc(HYPRE_Real, hypre_ParCSRCommPkgSendMapStart(comm_pkg, num_sends), memory_location_P); for (i = 0; i < num_sends; i++) { startc = hypre_ParCSRCommPkgSendMapStart(comm_pkg, i); for (j = startc; j < hypre_ParCSRCommPkgSendMapStart(comm_pkg, i + 1); j++) { buf_data[index++] = D_q[hypre_ParCSRCommPkgSendMapElmt(comm_pkg, j)]; } } comm_handle = hypre_ParCSRCommHandleCreate( 1, comm_pkg, buf_data, D_q_offd); hypre_ParCSRCommHandleDestroy(comm_handle); } #ifdef HYPRE_USING_OPENMP #pragma omp barrier #endif /* Create D_w = D_alpha + D_gamma */ row = 0; if (my_thread_num) { row = new_fpt_array[my_thread_num - 1]; } for (i = start; i < stop; i++) { if (CF_marker[i] == -2) { /*if (num_functions > 1) { HYPRE_Int jA, jC, jS; jC = A_diag_i[i]; for (j=S_diag_i[i]; j < S_diag_i[i+1]; j++) { jS = S_diag_j[j]; jA = A_diag_j[jC]; while (jA != jS) { if (dof_func[i] == dof_func[jA]) { D_w[row] += A_diag_data[jC++]; } else jC++; jA = A_diag_j[jC]; } jC++; } for (j=jC; j < A_diag_i[i+1]; j++) { if (dof_func[i] == dof_func[A_diag_j[j]]) D_w[row] += A_diag_data[j]; } jC = A_offd_i[i]; for (j=S_offd_i[i]; j < S_offd_i[i+1]; j++) { jS = S_offd_j[j]; jA = A_offd_j[jC]; while (jA != jS) { if (dof_func[i] == dof_func_offd[jA]) { D_w[row] += A_offd_data[jC++]; } else jC++; jA = A_offd_j[jC]; } jC++; } for (j=jC; j < A_offd_i[i+1]; j++) { if (dof_func[i] == dof_func_offd[A_offd_j[j]]) D_w[row] += A_offd_data[j]; } row++; } else*/ { for (j = A_diag_i[i]; j < A_diag_i[i + 1]; j++) { D_w[row] += A_diag_data[j]; } for (j = A_offd_i[i]; j < A_offd_i[i + 1]; j++) { D_w[row] += A_offd_data[j]; } for (j = As_FF_diag_i[row] + 1; j < As_FF_diag_i[row + 1]; j++) { if (D_q[As_FF_diag_j[j]]) { D_w[row] -= As_FF_diag_data[j]; } } for (j = As_FF_offd_i[row]; j < As_FF_offd_i[row + 1]; j++) { if (D_q_offd[As_FF_offd_j[j]]) { D_w[row] -= As_FF_offd_data[j]; } } D_w[row] -= D_q[new_fine_to_fine[row]]; row++; } } } #ifdef HYPRE_USING_OPENMP #pragma omp barrier #endif startnewf = 0; if (my_thread_num) { startnewf = new_fpt_array[my_thread_num - 1]; } stopnewf = new_fpt_array[my_thread_num]; for (i = startnewf; i < stopnewf; i++) { j = As_FF_diag_i[i]; if (D_w[i]) { beta = 1.0 / D_w[i]; As_FF_diag_data[j] = beta * D_q[new_fine_to_fine[i]]; for (j = As_FF_diag_i[i] + 1; j < As_FF_diag_i[i + 1]; j++) { As_FF_diag_data[j] *= beta; } for (j = As_FF_offd_i[i]; j < As_FF_offd_i[i + 1]; j++) { As_FF_offd_data[j] *= beta; } } } for (i = startf; i < stopf; i++) { if (D_q[i]) { gamma = -1.0 / D_q[i]; } else { gamma = 0.0; } for (j = As_FC_diag_i[i]; j < As_FC_diag_i[i + 1]; j++) { As_FC_diag_data[j] *= gamma; } for (j = As_FC_offd_i[i]; j < As_FC_offd_i[i + 1]; j++) { As_FC_offd_data[j] *= gamma; } } } /* end parallel region */ W = hypre_ParMatmul(As_FF, As_FC); W_diag = hypre_ParCSRMatrixDiag(W); W_offd = hypre_ParCSRMatrixOffd(W); W_diag_i = hypre_CSRMatrixI(W_diag); W_diag_j = hypre_CSRMatrixJ(W_diag); W_diag_data = hypre_CSRMatrixData(W_diag); W_offd_i = hypre_CSRMatrixI(W_offd); W_offd_j = hypre_CSRMatrixJ(W_offd); W_offd_data = hypre_CSRMatrixData(W_offd); num_cols_P_offd = hypre_CSRMatrixNumCols(W_offd); /*----------------------------------------------------------------------- * Intialize data for P *-----------------------------------------------------------------------*/ P_diag_i = hypre_CTAlloc(HYPRE_Int, n_old_Cpts + 1, memory_location_P); P_offd_i = hypre_CTAlloc(HYPRE_Int, n_old_Cpts + 1, memory_location_P); P_diag_size = n_Cpts + hypre_CSRMatrixI(W_diag)[n_new_Fpts]; P_offd_size = hypre_CSRMatrixI(W_offd)[n_new_Fpts]; if (P_diag_size) { P_diag_j = hypre_CTAlloc(HYPRE_Int, P_diag_size, memory_location_P); P_diag_data = hypre_CTAlloc(HYPRE_Real, P_diag_size, memory_location_P); } if (P_offd_size) { P_offd_j = hypre_CTAlloc(HYPRE_Int, P_offd_size, memory_location_P); P_offd_data = hypre_CTAlloc(HYPRE_Real, P_offd_size, memory_location_P); } #ifdef HYPRE_USING_OPENMP #pragma omp parallel private(i,j,start,stop,startnewf,stopnewf,c_pt,row,cnt_diag,cnt_offd) #endif { HYPRE_Int rowp; HYPRE_Int my_thread_num = hypre_GetThreadNum(); start = start_array[my_thread_num]; stop = start_array[my_thread_num + 1]; if (my_thread_num > 0) { c_pt = cpt_array[my_thread_num - 1]; } else { c_pt = 0; } row = 0; if (my_thread_num) { row = new_fpt_array[my_thread_num - 1]; } rowp = row; if (my_thread_num > 0) { rowp = row + cpt_array[my_thread_num - 1]; } cnt_diag = W_diag_i[row] + c_pt; cnt_offd = W_offd_i[row]; for (i = start; i < stop; i++) { if (CF_marker[i] > 0) { rowp++; P_diag_j[cnt_diag] = c_pt++; P_diag_data[cnt_diag++] = 1.0; P_diag_i[rowp] = cnt_diag; P_offd_i[rowp] = cnt_offd; } else if (CF_marker[i] == -2) { rowp++; for (j = W_diag_i[row]; j < W_diag_i[row + 1]; j++) { P_diag_j[cnt_diag] = W_diag_j[j]; P_diag_data[cnt_diag++] = W_diag_data[j]; } for (j = W_offd_i[row]; j < W_offd_i[row + 1]; j++) { P_offd_j[cnt_offd] = W_offd_j[j]; P_offd_data[cnt_offd++] = W_offd_data[j]; } row++; P_diag_i[rowp] = cnt_diag; P_offd_i[rowp] = cnt_offd; } } } /* end parallel region */ /*----------------------------------------------------------------------- * Create matrix *-----------------------------------------------------------------------*/ P = hypre_ParCSRMatrixCreate(comm, total_old_global_cpts, total_global_cpts, num_old_cpts_global, num_cpts_global, num_cols_P_offd, P_diag_i[n_old_Cpts], P_offd_i[n_old_Cpts]); P_diag = hypre_ParCSRMatrixDiag(P); hypre_CSRMatrixData(P_diag) = P_diag_data; hypre_CSRMatrixI(P_diag) = P_diag_i; hypre_CSRMatrixJ(P_diag) = P_diag_j; P_offd = hypre_ParCSRMatrixOffd(P); hypre_CSRMatrixData(P_offd) = P_offd_data; hypre_CSRMatrixI(P_offd) = P_offd_i; hypre_CSRMatrixJ(P_offd) = P_offd_j; hypre_ParCSRMatrixColMapOffd(P) = hypre_ParCSRMatrixColMapOffd(W); hypre_ParCSRMatrixColMapOffd(W) = NULL; hypre_CSRMatrixMemoryLocation(P_diag) = memory_location_P; hypre_CSRMatrixMemoryLocation(P_offd) = memory_location_P; /* Compress P, removing coefficients smaller than trunc_factor * Max */ if (trunc_factor != 0.0 || max_elmts > 0) { HYPRE_Int *map; hypre_BoomerAMGInterpTruncation(P, trunc_factor, max_elmts); P_diag_data = hypre_CSRMatrixData(P_diag); P_diag_i = hypre_CSRMatrixI(P_diag); P_diag_j = hypre_CSRMatrixJ(P_diag); P_offd_data = hypre_CSRMatrixData(P_offd); P_offd_i = hypre_CSRMatrixI(P_offd); P_offd_j = hypre_CSRMatrixJ(P_offd); P_diag_size = P_diag_i[n_old_Cpts]; P_offd_size = P_offd_i[n_old_Cpts]; col_map_offd_P = hypre_ParCSRMatrixColMapOffd(P); if (num_cols_P_offd) { P_marker = hypre_CTAlloc(HYPRE_Int, num_cols_P_offd, HYPRE_MEMORY_HOST); for (i = 0; i < P_offd_size; i++) { P_marker[P_offd_j[i]] = 1; } new_ncols_P_offd = 0; for (i = 0; i < num_cols_P_offd; i++) if (P_marker[i]) { new_ncols_P_offd++; } new_col_map_offd = hypre_CTAlloc(HYPRE_BigInt, new_ncols_P_offd, HYPRE_MEMORY_HOST); map = hypre_CTAlloc(HYPRE_Int, new_ncols_P_offd, HYPRE_MEMORY_HOST); index = 0; for (i = 0; i < num_cols_P_offd; i++) if (P_marker[i]) { new_col_map_offd[index] = col_map_offd_P[i]; map[index++] = i; } hypre_TFree(P_marker, HYPRE_MEMORY_HOST); #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i) HYPRE_SMP_SCHEDULE #endif for (i = 0; i < P_offd_size; i++) { P_offd_j[i] = hypre_BinarySearch(map, P_offd_j[i], new_ncols_P_offd); } hypre_TFree(col_map_offd_P, HYPRE_MEMORY_HOST); hypre_ParCSRMatrixColMapOffd(P) = new_col_map_offd; hypre_CSRMatrixNumCols(P_offd) = new_ncols_P_offd; hypre_TFree(map, HYPRE_MEMORY_HOST); } } hypre_MatvecCommPkgCreate(P); *P_ptr = P; /* Deallocate memory */ hypre_TFree(D_q, memory_location_P); hypre_TFree(D_q_offd, memory_location_P); hypre_TFree(D_w, memory_location_P); //hypre_TFree(dof_func_offd, HYPRE_MEMORY_HOST); hypre_TFree(cpt_array, HYPRE_MEMORY_HOST); hypre_TFree(new_fpt_array, HYPRE_MEMORY_HOST); hypre_TFree(start_array, HYPRE_MEMORY_HOST); hypre_TFree(new_fine_to_fine, HYPRE_MEMORY_HOST); hypre_TFree(buf_data, memory_location_P); hypre_ParCSRMatrixDestroy(As_FF); hypre_ParCSRMatrixDestroy(As_FC); hypre_ParCSRMatrixDestroy(W); return hypre_error_flag; } HYPRE_Int hypre_BoomerAMGBuildModPartialExtInterp( hypre_ParCSRMatrix *A, HYPRE_Int *CF_marker, hypre_ParCSRMatrix *S, HYPRE_BigInt *num_cpts_global, HYPRE_BigInt *num_old_cpts_global, HYPRE_Int num_functions, HYPRE_Int *dof_func, HYPRE_Int debug_flag, HYPRE_Real trunc_factor, HYPRE_Int max_elmts, hypre_ParCSRMatrix **P_ptr ) { hypre_GpuProfilingPushRange("PartialExtInterp"); HYPRE_Int ierr = 0; #if defined(HYPRE_USING_GPU) HYPRE_ExecutionPolicy exec = hypre_GetExecPolicy1( hypre_ParCSRMatrixMemoryLocation(A) ); if (exec == HYPRE_EXEC_DEVICE) { ierr = hypre_BoomerAMGBuildModPartialExtInterpDevice(A, CF_marker, S, num_cpts_global, num_old_cpts_global, debug_flag, trunc_factor, max_elmts, P_ptr); } else #endif { ierr = hypre_BoomerAMGBuildModPartialExtInterpHost(A, CF_marker, S, num_cpts_global, num_old_cpts_global, num_functions, dof_func, debug_flag, trunc_factor, max_elmts, P_ptr); } hypre_GpuProfilingPopRange(); return ierr; } HYPRE_Int hypre_BoomerAMGBuildModPartialExtPEInterpHost( hypre_ParCSRMatrix *A, HYPRE_Int *CF_marker, hypre_ParCSRMatrix *S, HYPRE_BigInt *num_cpts_global, HYPRE_BigInt *num_old_cpts_global, HYPRE_Int num_functions, HYPRE_Int *dof_func, HYPRE_Int debug_flag, HYPRE_Real trunc_factor, HYPRE_Int max_elmts, hypre_ParCSRMatrix **P_ptr) { HYPRE_UNUSED_VAR(debug_flag); /* Communication Variables */ MPI_Comm comm = hypre_ParCSRMatrixComm(A); HYPRE_MemoryLocation memory_location_P = hypre_ParCSRMatrixMemoryLocation(A); hypre_ParCSRCommHandle *comm_handle = NULL; hypre_ParCSRCommPkg *comm_pkg = hypre_ParCSRMatrixCommPkg(A); HYPRE_Int my_id, num_procs; /* Variables to store input variables */ hypre_CSRMatrix *A_diag = hypre_ParCSRMatrixDiag(A); HYPRE_Real *A_diag_data = hypre_CSRMatrixData(A_diag); HYPRE_Int *A_diag_i = hypre_CSRMatrixI(A_diag); HYPRE_Int *A_diag_j = hypre_CSRMatrixJ(A_diag); hypre_CSRMatrix *A_offd = hypre_ParCSRMatrixOffd(A); HYPRE_Real *A_offd_data = hypre_CSRMatrixData(A_offd); HYPRE_Int *A_offd_i = hypre_CSRMatrixI(A_offd); HYPRE_Int *A_offd_j = hypre_CSRMatrixJ(A_offd); hypre_CSRMatrix *S_diag = hypre_ParCSRMatrixDiag(S); HYPRE_Int *S_diag_j = hypre_CSRMatrixJ(S_diag); HYPRE_Int *S_diag_i = hypre_CSRMatrixI(S_diag); hypre_CSRMatrix *S_offd = hypre_ParCSRMatrixOffd(S); HYPRE_Int *S_offd_j = hypre_CSRMatrixJ(S_offd); HYPRE_Int *S_offd_i = hypre_CSRMatrixI(S_offd); HYPRE_Int n_fine = hypre_CSRMatrixNumRows(A_diag); HYPRE_BigInt total_global_cpts; HYPRE_BigInt total_old_global_cpts; /* Interpolation matrix P */ hypre_ParCSRMatrix *P; hypre_CSRMatrix *P_diag; hypre_CSRMatrix *P_offd; HYPRE_Real *P_diag_data = NULL; HYPRE_Int *P_diag_i, *P_diag_j = NULL; HYPRE_Real *P_offd_data = NULL; HYPRE_Int *P_offd_i, *P_offd_j = NULL; /* Intermediate matrices */ hypre_ParCSRMatrix *As_FF, *As_FC, *W; HYPRE_Real *D_q, *D_w, *D_lambda, *D_inv, *D_tau; HYPRE_Real *D_lambda_offd = NULL, *D_inv_offd = NULL; hypre_CSRMatrix *As_FF_diag; hypre_CSRMatrix *As_FF_offd; hypre_CSRMatrix *As_FC_diag; hypre_CSRMatrix *As_FC_offd; hypre_CSRMatrix *W_diag; hypre_CSRMatrix *W_offd; HYPRE_Int *As_FF_diag_i; HYPRE_Int *As_FF_diag_j; HYPRE_Int *As_FF_offd_i; HYPRE_Int *As_FF_offd_j; HYPRE_Int *As_FC_diag_i; HYPRE_Int *As_FC_offd_i; HYPRE_Int *W_diag_i; HYPRE_Int *W_offd_i; HYPRE_Int *W_diag_j; HYPRE_Int *W_offd_j; HYPRE_Real *As_FF_diag_data; HYPRE_Real *As_FF_offd_data; HYPRE_Real *As_FC_diag_data; HYPRE_Real *As_FC_offd_data; HYPRE_Real *W_diag_data; HYPRE_Real *W_offd_data; HYPRE_Real *buf_data = NULL; HYPRE_BigInt *col_map_offd_P = NULL; HYPRE_BigInt *new_col_map_offd = NULL; HYPRE_Int P_diag_size; HYPRE_Int P_offd_size; HYPRE_Int num_cols_A_FF_offd; HYPRE_Int new_ncols_P_offd; HYPRE_Int num_cols_P_offd; HYPRE_Int *P_marker = NULL; HYPRE_Int *dof_func_offd = NULL; /* Loop variables */ HYPRE_Int index; HYPRE_Int i, j; HYPRE_Int *cpt_array; HYPRE_Int *new_fpt_array; HYPRE_Int *start_array; HYPRE_Int *new_fine_to_fine; HYPRE_Int start, stop, startf, stopf, startnewf, stopnewf; HYPRE_Int cnt_diag, cnt_offd, row, c_pt, fpt; HYPRE_Int startc, num_sends; /* Definitions */ //HYPRE_Real wall_time; HYPRE_Int n_Cpts, n_Fpts, n_old_Cpts, n_new_Fpts; HYPRE_Int num_threads = hypre_NumThreads(); //if (debug_flag==4) wall_time = time_getWallclockSeconds(); /* BEGIN */ hypre_MPI_Comm_size(comm, &num_procs); hypre_MPI_Comm_rank(comm, &my_id); if (my_id == (num_procs - 1)) { total_global_cpts = num_cpts_global[1]; } if (my_id == (num_procs - 1)) { total_old_global_cpts = num_old_cpts_global[1]; } hypre_MPI_Bcast(&total_global_cpts, 1, HYPRE_MPI_BIG_INT, num_procs - 1, comm); hypre_MPI_Bcast(&total_old_global_cpts, 1, HYPRE_MPI_BIG_INT, num_procs - 1, comm); n_Cpts = num_cpts_global[1] - num_cpts_global[0]; n_old_Cpts = num_old_cpts_global[1] - num_old_cpts_global[0]; hypre_ParCSRMatrixGenerateFFFCD3(A, CF_marker, num_cpts_global, S, &As_FC, &As_FF, &D_lambda); As_FC_diag = hypre_ParCSRMatrixDiag(As_FC); As_FC_diag_i = hypre_CSRMatrixI(As_FC_diag); As_FC_diag_data = hypre_CSRMatrixData(As_FC_diag); As_FC_offd = hypre_ParCSRMatrixOffd(As_FC); As_FC_offd_i = hypre_CSRMatrixI(As_FC_offd); As_FC_offd_data = hypre_CSRMatrixData(As_FC_offd); As_FF_diag = hypre_ParCSRMatrixDiag(As_FF); As_FF_diag_i = hypre_CSRMatrixI(As_FF_diag); As_FF_diag_j = hypre_CSRMatrixJ(As_FF_diag); As_FF_diag_data = hypre_CSRMatrixData(As_FF_diag); As_FF_offd = hypre_ParCSRMatrixOffd(As_FF); As_FF_offd_i = hypre_CSRMatrixI(As_FF_offd); As_FF_offd_j = hypre_CSRMatrixJ(As_FF_offd); As_FF_offd_data = hypre_CSRMatrixData(As_FF_offd); n_new_Fpts = hypre_CSRMatrixNumRows(As_FF_diag); n_Fpts = hypre_CSRMatrixNumRows(As_FC_diag); n_new_Fpts = n_old_Cpts - n_Cpts; num_cols_A_FF_offd = hypre_CSRMatrixNumCols(As_FF_offd); D_q = hypre_CTAlloc(HYPRE_Real, n_Fpts, memory_location_P); D_inv = hypre_CTAlloc(HYPRE_Real, n_Fpts, memory_location_P); new_fine_to_fine = hypre_CTAlloc(HYPRE_Int, n_new_Fpts, HYPRE_MEMORY_HOST); D_w = hypre_CTAlloc(HYPRE_Real, n_new_Fpts, memory_location_P); D_tau = hypre_CTAlloc(HYPRE_Real, n_new_Fpts, memory_location_P); cpt_array = hypre_CTAlloc(HYPRE_Int, num_threads, HYPRE_MEMORY_HOST); new_fpt_array = hypre_CTAlloc(HYPRE_Int, num_threads, HYPRE_MEMORY_HOST); start_array = hypre_CTAlloc(HYPRE_Int, num_threads + 1, HYPRE_MEMORY_HOST); #ifdef HYPRE_USING_OPENMP #pragma omp parallel private(i,j,start,stop,startf,stopf,startnewf,stopnewf,row,fpt,index) #endif { HYPRE_Int my_thread_num = hypre_GetThreadNum(); HYPRE_Real beta, gamma; start = (n_fine / num_threads) * my_thread_num; if (my_thread_num == num_threads - 1) { stop = n_fine; } else { stop = (n_fine / num_threads) * (my_thread_num + 1); } start_array[my_thread_num + 1] = stop; row = 0; for (i = start; i < stop; i++) { if (CF_marker[i] > 0) { cpt_array[my_thread_num]++; } else if (CF_marker[i] == -2) { new_fpt_array[my_thread_num]++; } } #ifdef HYPRE_USING_OPENMP #pragma omp barrier #endif if (my_thread_num == 0) { for (i = 1; i < num_threads; i++) { cpt_array[i] += cpt_array[i - 1]; new_fpt_array[i] += new_fpt_array[i - 1]; } if (num_functions > 1) { HYPRE_Int *int_buf_data = NULL; HYPRE_Int num_sends, startc; HYPRE_Int num_cols_A_offd = hypre_CSRMatrixNumCols(A_offd); dof_func_offd = hypre_CTAlloc(HYPRE_Int, num_cols_A_offd, memory_location_P); index = 0; num_sends = hypre_ParCSRCommPkgNumSends(comm_pkg); int_buf_data = hypre_CTAlloc(HYPRE_Int, hypre_ParCSRCommPkgSendMapStart(comm_pkg, num_sends), memory_location_P); for (i = 0; i < num_sends; i++) { startc = hypre_ParCSRCommPkgSendMapStart(comm_pkg, i); for (j = startc; j < hypre_ParCSRCommPkgSendMapStart(comm_pkg, i + 1); j++) { int_buf_data[index++] = dof_func[hypre_ParCSRCommPkgSendMapElmt(comm_pkg, j)]; } } comm_handle = hypre_ParCSRCommHandleCreate( 11, comm_pkg, int_buf_data, dof_func_offd); hypre_ParCSRCommHandleDestroy(comm_handle); hypre_TFree(int_buf_data, memory_location_P); } } #ifdef HYPRE_USING_OPENMP #pragma omp barrier #endif if (my_thread_num > 0) { startf = start - cpt_array[my_thread_num - 1]; } else { startf = 0; } if (my_thread_num < num_threads - 1) { stopf = stop - cpt_array[my_thread_num]; } else { stopf = n_Fpts; } /* Create D_q = D_beta, D_inv = 1/(D_q+D_lambda) */ for (i = startf; i < stopf; i++) { for (j = As_FC_diag_i[i]; j < As_FC_diag_i[i + 1]; j++) { D_q[i] += As_FC_diag_data[j]; } for (j = As_FC_offd_i[i]; j < As_FC_offd_i[i + 1]; j++) { D_q[i] += As_FC_offd_data[j]; } if (D_q[i] + D_lambda[i]) { D_inv[i] = 1.0 / (D_q[i] + D_lambda[i]); } } row = 0; if (my_thread_num) { row = new_fpt_array[my_thread_num - 1]; } fpt = startf; for (i = start; i < stop; i++) { if (CF_marker[i] == -2) { new_fine_to_fine[row++] = fpt++; } else if (CF_marker[i] < 0) { fpt++; } } #ifdef HYPRE_USING_OPENMP #pragma omp barrier #endif if (my_thread_num == 0) { if (num_cols_A_FF_offd) { D_lambda_offd = hypre_CTAlloc(HYPRE_Real, num_cols_A_FF_offd, memory_location_P); D_inv_offd = hypre_CTAlloc(HYPRE_Real, num_cols_A_FF_offd, memory_location_P); } index = 0; comm_pkg = hypre_ParCSRMatrixCommPkg(As_FF); if (!comm_pkg) { hypre_MatvecCommPkgCreate(As_FF); comm_pkg = hypre_ParCSRMatrixCommPkg(As_FF); } num_sends = hypre_ParCSRCommPkgNumSends(comm_pkg); buf_data = hypre_CTAlloc(HYPRE_Real, hypre_ParCSRCommPkgSendMapStart(comm_pkg, num_sends), memory_location_P); for (i = 0; i < num_sends; i++) { startc = hypre_ParCSRCommPkgSendMapStart(comm_pkg, i); for (j = startc; j < hypre_ParCSRCommPkgSendMapStart(comm_pkg, i + 1); j++) { buf_data[index++] = D_lambda[hypre_ParCSRCommPkgSendMapElmt(comm_pkg, j)]; } } comm_handle = hypre_ParCSRCommHandleCreate( 1, comm_pkg, buf_data, D_lambda_offd); hypre_ParCSRCommHandleDestroy(comm_handle); index = 0; for (i = 0; i < num_sends; i++) { startc = hypre_ParCSRCommPkgSendMapStart(comm_pkg, i); for (j = startc; j < hypre_ParCSRCommPkgSendMapStart(comm_pkg, i + 1); j++) { buf_data[index++] = D_inv[hypre_ParCSRCommPkgSendMapElmt(comm_pkg, j)]; } } comm_handle = hypre_ParCSRCommHandleCreate( 1, comm_pkg, buf_data, D_inv_offd); hypre_ParCSRCommHandleDestroy(comm_handle); } #ifdef HYPRE_USING_OPENMP #pragma omp barrier #endif /* Create D_tau */ startnewf = 0; if (my_thread_num) { startnewf = new_fpt_array[my_thread_num - 1]; } stopnewf = new_fpt_array[my_thread_num]; for (i = startnewf; i < stopnewf; i++) { for (j = As_FF_diag_i[i] + 1; j < As_FF_diag_i[i + 1]; j++) { index = As_FF_diag_j[j]; D_tau[i] += As_FF_diag_data[j] * D_lambda[index] * D_inv[index]; } for (j = As_FF_offd_i[i]; j < As_FF_offd_i[i + 1]; j++) { index = As_FF_offd_j[j]; D_tau[i] += As_FF_offd_data[j] * D_lambda_offd[index] * D_inv_offd[index]; } } #ifdef HYPRE_USING_OPENMP #pragma omp barrier #endif /* Create D_w = D_alpha + D_gamma + D_tau */ row = 0; if (my_thread_num) { row = new_fpt_array[my_thread_num - 1]; } for (i = start; i < stop; i++) { if (CF_marker[i] == -2) { if (num_functions > 1) { HYPRE_Int jA, jC, jS; jC = A_diag_i[i]; for (j = S_diag_i[i]; j < S_diag_i[i + 1]; j++) { jS = S_diag_j[j]; jA = A_diag_j[jC]; while (jA != jS) { if (dof_func[i] == dof_func[jA]) { D_w[row] += A_diag_data[jC++]; } else { jC++; } jA = A_diag_j[jC]; } jC++; } for (j = jC; j < A_diag_i[i + 1]; j++) { if (dof_func[i] == dof_func[A_diag_j[j]]) { D_w[row] += A_diag_data[j]; } } jC = A_offd_i[i]; for (j = S_offd_i[i]; j < S_offd_i[i + 1]; j++) { jS = S_offd_j[j]; jA = A_offd_j[jC]; while (jA != jS) { if (dof_func[i] == dof_func_offd[jA]) { D_w[row] += A_offd_data[jC++]; } else { jC++; } jA = A_offd_j[jC]; } jC++; } for (j = jC; j < A_offd_i[i + 1]; j++) { if (dof_func[i] == dof_func_offd[A_offd_j[j]]) { D_w[row] += A_offd_data[j]; } } D_w[row] += D_tau[row]; row++; } else { for (j = A_diag_i[i]; j < A_diag_i[i + 1]; j++) { D_w[row] += A_diag_data[j]; } for (j = A_offd_i[i]; j < A_offd_i[i + 1]; j++) { D_w[row] += A_offd_data[j]; } for (j = As_FF_diag_i[row] + 1; j < As_FF_diag_i[row + 1]; j++) { if (D_inv[As_FF_diag_j[j]]) { D_w[row] -= As_FF_diag_data[j]; } } for (j = As_FF_offd_i[row]; j < As_FF_offd_i[row + 1]; j++) { if (D_inv_offd[As_FF_offd_j[j]]) { D_w[row] -= As_FF_offd_data[j]; } } D_w[row] += D_tau[row] - D_q[new_fine_to_fine[row]]; row++; } } } #ifdef HYPRE_USING_OPENMP #pragma omp barrier #endif startnewf = 0; if (my_thread_num) { startnewf = new_fpt_array[my_thread_num - 1]; } stopnewf = new_fpt_array[my_thread_num]; for (i = startnewf; i < stopnewf; i++) { j = As_FF_diag_i[i]; if (D_w[i]) { beta = -1.0 / D_w[i]; As_FF_diag_data[j] = beta * (D_q[new_fine_to_fine[i]] + D_lambda[new_fine_to_fine[i]]); for (j = As_FF_diag_i[i] + 1; j < As_FF_diag_i[i + 1]; j++) { As_FF_diag_data[j] *= beta; } for (j = As_FF_offd_i[i]; j < As_FF_offd_i[i + 1]; j++) { As_FF_offd_data[j] *= beta; } } } for (i = startf; i < stopf; i++) { gamma = D_inv[i]; for (j = As_FC_diag_i[i]; j < As_FC_diag_i[i + 1]; j++) { As_FC_diag_data[j] *= gamma; } for (j = As_FC_offd_i[i]; j < As_FC_offd_i[i + 1]; j++) { As_FC_offd_data[j] *= gamma; } } } /* end parallel region */ W = hypre_ParMatmul(As_FF, As_FC); W_diag = hypre_ParCSRMatrixDiag(W); W_offd = hypre_ParCSRMatrixOffd(W); W_diag_i = hypre_CSRMatrixI(W_diag); W_diag_j = hypre_CSRMatrixJ(W_diag); W_diag_data = hypre_CSRMatrixData(W_diag); W_offd_i = hypre_CSRMatrixI(W_offd); W_offd_j = hypre_CSRMatrixJ(W_offd); W_offd_data = hypre_CSRMatrixData(W_offd); num_cols_P_offd = hypre_CSRMatrixNumCols(W_offd); /*----------------------------------------------------------------------- * Intialize data for P *-----------------------------------------------------------------------*/ P_diag_i = hypre_CTAlloc(HYPRE_Int, n_old_Cpts + 1, memory_location_P); P_offd_i = hypre_CTAlloc(HYPRE_Int, n_old_Cpts + 1, memory_location_P); P_diag_size = n_Cpts + hypre_CSRMatrixI(W_diag)[n_new_Fpts]; P_offd_size = hypre_CSRMatrixI(W_offd)[n_new_Fpts]; if (P_diag_size) { P_diag_j = hypre_CTAlloc(HYPRE_Int, P_diag_size, memory_location_P); P_diag_data = hypre_CTAlloc(HYPRE_Real, P_diag_size, memory_location_P); } if (P_offd_size) { P_offd_j = hypre_CTAlloc(HYPRE_Int, P_offd_size, memory_location_P); P_offd_data = hypre_CTAlloc(HYPRE_Real, P_offd_size, memory_location_P); } #ifdef HYPRE_USING_OPENMP #pragma omp parallel private(i,j,start,stop,c_pt,row,cnt_diag,cnt_offd) #endif { HYPRE_Int rowp; HYPRE_Int my_thread_num = hypre_GetThreadNum(); start = start_array[my_thread_num]; stop = start_array[my_thread_num + 1]; if (my_thread_num > 0) { c_pt = cpt_array[my_thread_num - 1]; } else { c_pt = 0; } row = 0; if (my_thread_num) { row = new_fpt_array[my_thread_num - 1]; } rowp = row; if (my_thread_num > 0) { rowp = row + cpt_array[my_thread_num - 1]; } cnt_diag = W_diag_i[row] + c_pt; cnt_offd = W_offd_i[row]; for (i = start; i < stop; i++) { if (CF_marker[i] > 0) { rowp++; P_diag_j[cnt_diag] = c_pt++; P_diag_data[cnt_diag++] = 1.0; P_diag_i[rowp] = cnt_diag; P_offd_i[rowp] = cnt_offd; } else if (CF_marker[i] == -2) { rowp++; for (j = W_diag_i[row]; j < W_diag_i[row + 1]; j++) { P_diag_j[cnt_diag] = W_diag_j[j]; P_diag_data[cnt_diag++] = W_diag_data[j]; } for (j = W_offd_i[row]; j < W_offd_i[row + 1]; j++) { P_offd_j[cnt_offd] = W_offd_j[j]; P_offd_data[cnt_offd++] = W_offd_data[j]; } row++; P_diag_i[rowp] = cnt_diag; P_offd_i[rowp] = cnt_offd; } } } /* end parallel region */ /*----------------------------------------------------------------------- * Create matrix *-----------------------------------------------------------------------*/ P = hypre_ParCSRMatrixCreate(comm, total_old_global_cpts, total_global_cpts, num_old_cpts_global, num_cpts_global, num_cols_P_offd, P_diag_i[n_old_Cpts], P_offd_i[n_old_Cpts]); P_diag = hypre_ParCSRMatrixDiag(P); hypre_CSRMatrixData(P_diag) = P_diag_data; hypre_CSRMatrixI(P_diag) = P_diag_i; hypre_CSRMatrixJ(P_diag) = P_diag_j; P_offd = hypre_ParCSRMatrixOffd(P); hypre_CSRMatrixData(P_offd) = P_offd_data; hypre_CSRMatrixI(P_offd) = P_offd_i; hypre_CSRMatrixJ(P_offd) = P_offd_j; hypre_ParCSRMatrixColMapOffd(P) = hypre_ParCSRMatrixColMapOffd(W); hypre_ParCSRMatrixColMapOffd(W) = NULL; hypre_CSRMatrixMemoryLocation(P_diag) = memory_location_P; hypre_CSRMatrixMemoryLocation(P_offd) = memory_location_P; /* Compress P, removing coefficients smaller than trunc_factor * Max */ if (trunc_factor != 0.0 || max_elmts > 0) { HYPRE_Int *map; hypre_BoomerAMGInterpTruncation(P, trunc_factor, max_elmts); P_diag_data = hypre_CSRMatrixData(P_diag); P_diag_i = hypre_CSRMatrixI(P_diag); P_diag_j = hypre_CSRMatrixJ(P_diag); P_offd_data = hypre_CSRMatrixData(P_offd); P_offd_i = hypre_CSRMatrixI(P_offd); P_offd_j = hypre_CSRMatrixJ(P_offd); P_diag_size = P_diag_i[n_old_Cpts]; P_offd_size = P_offd_i[n_old_Cpts]; col_map_offd_P = hypre_ParCSRMatrixColMapOffd(P); if (num_cols_P_offd) { P_marker = hypre_CTAlloc(HYPRE_Int, num_cols_P_offd, HYPRE_MEMORY_HOST); for (i = 0; i < P_offd_size; i++) { P_marker[P_offd_j[i]] = 1; } new_ncols_P_offd = 0; for (i = 0; i < num_cols_P_offd; i++) { if (P_marker[i]) { new_ncols_P_offd++; } } new_col_map_offd = hypre_CTAlloc(HYPRE_BigInt, new_ncols_P_offd, HYPRE_MEMORY_HOST); map = hypre_CTAlloc(HYPRE_Int, new_ncols_P_offd, HYPRE_MEMORY_HOST); index = 0; for (i = 0; i < num_cols_P_offd; i++) { if (P_marker[i]) { new_col_map_offd[index] = col_map_offd_P[i]; map[index++] = i; } } hypre_TFree(P_marker, HYPRE_MEMORY_HOST); #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i) HYPRE_SMP_SCHEDULE #endif for (i = 0; i < P_offd_size; i++) { P_offd_j[i] = hypre_BinarySearch(map, P_offd_j[i], new_ncols_P_offd); } hypre_TFree(col_map_offd_P, HYPRE_MEMORY_HOST); hypre_ParCSRMatrixColMapOffd(P) = new_col_map_offd; hypre_CSRMatrixNumCols(P_offd) = new_ncols_P_offd; hypre_TFree(map, HYPRE_MEMORY_HOST); } } hypre_MatvecCommPkgCreate(P); *P_ptr = P; /* Deallocate memory */ hypre_TFree(D_q, memory_location_P); hypre_TFree(D_inv, memory_location_P); hypre_TFree(D_inv_offd, memory_location_P); hypre_TFree(D_lambda, memory_location_P); hypre_TFree(D_lambda_offd, memory_location_P); hypre_TFree(D_tau, memory_location_P); hypre_TFree(D_w, memory_location_P); hypre_TFree(dof_func_offd, HYPRE_MEMORY_HOST); hypre_TFree(cpt_array, HYPRE_MEMORY_HOST); hypre_TFree(new_fpt_array, HYPRE_MEMORY_HOST); hypre_TFree(start_array, HYPRE_MEMORY_HOST); hypre_TFree(new_fine_to_fine, HYPRE_MEMORY_HOST); hypre_TFree(buf_data, memory_location_P); hypre_ParCSRMatrixDestroy(As_FF); hypre_ParCSRMatrixDestroy(As_FC); hypre_ParCSRMatrixDestroy(W); return hypre_error_flag; } HYPRE_Int hypre_BoomerAMGBuildModPartialExtPEInterp( hypre_ParCSRMatrix *A, HYPRE_Int *CF_marker, hypre_ParCSRMatrix *S, HYPRE_BigInt *num_cpts_global, HYPRE_BigInt *num_old_cpts_global, HYPRE_Int num_functions, HYPRE_Int *dof_func, HYPRE_Int debug_flag, HYPRE_Real trunc_factor, HYPRE_Int max_elmts, hypre_ParCSRMatrix **P_ptr ) { hypre_GpuProfilingPushRange("PartialExtPEInterp"); HYPRE_Int ierr = 0; #if defined(HYPRE_USING_GPU) HYPRE_ExecutionPolicy exec = hypre_GetExecPolicy1( hypre_ParCSRMatrixMemoryLocation(A) ); if (exec == HYPRE_EXEC_DEVICE) { ierr = hypre_BoomerAMGBuildModPartialExtPEInterpDevice(A, CF_marker, S, num_cpts_global, num_old_cpts_global, debug_flag, trunc_factor, max_elmts, P_ptr); } else #endif { ierr = hypre_BoomerAMGBuildModPartialExtPEInterpHost(A, CF_marker, S, num_cpts_global, num_old_cpts_global, num_functions, dof_func, debug_flag, trunc_factor, max_elmts, P_ptr); } hypre_GpuProfilingPopRange(); return ierr; } hypre-2.33.0/src/parcsr_ls/par_2s_interp_device.c000066400000000000000000001147301477326011500217530ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "_hypre_onedpl.hpp" #include "_hypre_parcsr_ls.h" #include "_hypre_utilities.hpp" #if defined(HYPRE_USING_GPU) #if defined(HYPRE_USING_SYCL) SYCL_EXTERNAL #endif __global__ void hypreGPUKernel_compute_weak_rowsums( hypre_DeviceItem &item, HYPRE_Int nr_of_rows, bool has_offd, HYPRE_Int *CF_marker, HYPRE_Int *A_diag_i, HYPRE_Complex *A_diag_a, HYPRE_Int *S_diag_j, HYPRE_Int *A_offd_i, HYPRE_Complex *A_offd_a, HYPRE_Int *S_offd_j, HYPRE_Real *rs, HYPRE_Int flag ); __global__ void hypreGPUKernel_MMInterpScaleAFF( hypre_DeviceItem &item, HYPRE_Int AFF_nrows, HYPRE_Int *AFF_diag_i, HYPRE_Int *AFF_diag_j, HYPRE_Complex *AFF_diag_a, HYPRE_Int *AFF_offd_i, HYPRE_Int *AFF_offd_j, HYPRE_Complex *AFF_offd_a, HYPRE_Complex *beta_diag, HYPRE_Complex *beta_offd, HYPRE_Int *F2_to_F, HYPRE_Real *rsW ); #if defined(HYPRE_USING_SYCL) SYCL_EXTERNAL #endif __global__ void hypreGPUKernel_compute_dlam_dtmp( hypre_DeviceItem &item, HYPRE_Int nr_of_rows, HYPRE_Int *AFF_diag_i, HYPRE_Int *AFF_diag_j, HYPRE_Complex *AFF_diag_data, HYPRE_Int *AFF_offd_i, HYPRE_Complex *AFF_offd_data, HYPRE_Complex *rsFC, HYPRE_Complex *dlam, HYPRE_Complex *dtmp ); __global__ void hypreGPUKernel_MMPEInterpScaleAFF( hypre_DeviceItem &item, HYPRE_Int AFF_nrows, HYPRE_Int *AFF_diag_i, HYPRE_Int *AFF_diag_j, HYPRE_Complex *AFF_diag_a, HYPRE_Int *AFF_offd_i, HYPRE_Int *AFF_offd_j, HYPRE_Complex *AFF_offd_a, HYPRE_Complex *tmp_diag, HYPRE_Complex *tmp_offd, HYPRE_Complex *lam_diag, HYPRE_Complex *lam_offd, HYPRE_Int *F2_to_F, HYPRE_Real *rsW ); /*--------------------------------------------------------------------------------------*/ HYPRE_Int hypre_BoomerAMGBuildModPartialExtInterpDevice( hypre_ParCSRMatrix *A, HYPRE_Int *CF_marker, hypre_ParCSRMatrix *S, HYPRE_BigInt *num_cpts_global, /* C2 */ HYPRE_BigInt *num_old_cpts_global, /* C2 + F2 */ HYPRE_Int debug_flag, HYPRE_Real trunc_factor, HYPRE_Int max_elmts, hypre_ParCSRMatrix **P_ptr ) { HYPRE_UNUSED_VAR(debug_flag); HYPRE_Int A_nr_local = hypre_ParCSRMatrixNumRows(A); hypre_CSRMatrix *A_diag = hypre_ParCSRMatrixDiag(A); HYPRE_Complex *A_diag_data = hypre_CSRMatrixData(A_diag); HYPRE_Int *A_diag_i = hypre_CSRMatrixI(A_diag); hypre_CSRMatrix *A_offd = hypre_ParCSRMatrixOffd(A); HYPRE_Complex *A_offd_data = hypre_CSRMatrixData(A_offd); HYPRE_Int *A_offd_i = hypre_CSRMatrixI(A_offd); HYPRE_Int A_offd_nnz = hypre_CSRMatrixNumNonzeros(A_offd); HYPRE_Complex *Dbeta, *Dbeta_offd, *rsWA, *rsW; hypre_ParCSRMatrix *As_F2F, *As_FC, *W, *P; hypre_BoomerAMGMakeSocFromSDevice(A, S); HYPRE_Int *Soc_diag_j = hypre_ParCSRMatrixSocDiagJ(S); HYPRE_Int *Soc_offd_j = hypre_ParCSRMatrixSocOffdJ(S); /* As_F2F = As_{F2, F}, As_FC = As_{F, C2} */ hypre_ParCSRMatrixGenerateFFFC3Device(A, CF_marker, num_cpts_global, S, &As_FC, &As_F2F); HYPRE_Int AFC_nr_local = hypre_ParCSRMatrixNumRows(As_FC); HYPRE_Int AF2F_nr_local = hypre_ParCSRMatrixNumRows(As_F2F); /* row sum of AFC, i.e., D_beta */ Dbeta = hypre_TAlloc(HYPRE_Complex, AFC_nr_local, HYPRE_MEMORY_DEVICE); hypre_CSRMatrixComputeRowSumDevice(hypre_ParCSRMatrixDiag(As_FC), NULL, NULL, Dbeta, 0, 1.0, "set"); hypre_CSRMatrixComputeRowSumDevice(hypre_ParCSRMatrixOffd(As_FC), NULL, NULL, Dbeta, 0, 1.0, "add"); /* collect off-processor D_beta */ hypre_ParCSRCommPkg *comm_pkg = hypre_ParCSRMatrixCommPkg(As_F2F); hypre_ParCSRCommHandle *comm_handle; if (!comm_pkg) { hypre_MatvecCommPkgCreate(As_F2F); comm_pkg = hypre_ParCSRMatrixCommPkg(As_F2F); } Dbeta_offd = hypre_TAlloc(HYPRE_Complex, hypre_CSRMatrixNumCols(hypre_ParCSRMatrixOffd(As_F2F)), HYPRE_MEMORY_DEVICE); HYPRE_Int num_sends = hypre_ParCSRCommPkgNumSends(comm_pkg); HYPRE_Int num_elmts_send = hypre_ParCSRCommPkgSendMapStart(comm_pkg, num_sends); HYPRE_Complex *send_buf = hypre_TAlloc(HYPRE_Complex, num_elmts_send, HYPRE_MEMORY_DEVICE); hypre_ParCSRCommPkgCopySendMapElmtsToDevice(comm_pkg); #if defined(HYPRE_USING_SYCL) hypreSycl_gather( hypre_ParCSRCommPkgDeviceSendMapElmts(comm_pkg), hypre_ParCSRCommPkgDeviceSendMapElmts(comm_pkg) + num_elmts_send, Dbeta, send_buf ); #else HYPRE_THRUST_CALL( gather, hypre_ParCSRCommPkgDeviceSendMapElmts(comm_pkg), hypre_ParCSRCommPkgDeviceSendMapElmts(comm_pkg) + num_elmts_send, Dbeta, send_buf ); #endif #if defined(HYPRE_USING_THRUST_NOSYNC) /* RL: make sure send_buf is ready before issuing GPU-GPU MPI */ if (hypre_GetGpuAwareMPI()) { hypre_ForceSyncComputeStream(); } #endif comm_handle = hypre_ParCSRCommHandleCreate_v2(1, comm_pkg, HYPRE_MEMORY_DEVICE, send_buf, HYPRE_MEMORY_DEVICE, Dbeta_offd); hypre_ParCSRCommHandleDestroy(comm_handle); hypre_TFree(send_buf, HYPRE_MEMORY_DEVICE); /* weak row sum and diagonal, i.e., DF2F2 + Dgamma */ rsWA = hypre_TAlloc(HYPRE_Complex, A_nr_local, HYPRE_MEMORY_DEVICE); dim3 bDim = hypre_GetDefaultDeviceBlockDimension(); dim3 gDim = hypre_GetDefaultDeviceGridDimension(A_nr_local, "warp", bDim); /* only for rows corresponding to F2 (notice flag == -1) */ HYPRE_GPU_LAUNCH( hypreGPUKernel_compute_weak_rowsums, gDim, bDim, A_nr_local, A_offd_nnz > 0, CF_marker, A_diag_i, A_diag_data, Soc_diag_j, A_offd_i, A_offd_data, Soc_offd_j, rsWA, -1 ); rsW = hypre_TAlloc(HYPRE_Complex, AF2F_nr_local, HYPRE_MEMORY_DEVICE); #if defined(HYPRE_USING_SYCL) HYPRE_Complex *new_end = hypreSycl_copy_if( rsWA, rsWA + A_nr_local, CF_marker, rsW, equal(-2) ); #else HYPRE_Complex *new_end = HYPRE_THRUST_CALL( copy_if, rsWA, rsWA + A_nr_local, CF_marker, rsW, equal(-2) ); #endif hypre_assert(new_end - rsW == AF2F_nr_local); hypre_TFree(rsWA, HYPRE_MEMORY_DEVICE); /* map from F2 to F */ HYPRE_Int *map_to_F = hypre_TAlloc(HYPRE_Int, A_nr_local, HYPRE_MEMORY_DEVICE); #if defined(HYPRE_USING_SYCL) HYPRE_ONEDPL_CALL( std::exclusive_scan, oneapi::dpl::make_transform_iterator(CF_marker, is_negative()), oneapi::dpl::make_transform_iterator(CF_marker + A_nr_local, is_negative()), map_to_F, HYPRE_Int(0) );/* *MUST* pass init value since input and output types diff. */ #else HYPRE_THRUST_CALL( exclusive_scan, thrust::make_transform_iterator(CF_marker, is_negative()), thrust::make_transform_iterator(CF_marker + A_nr_local, is_negative()), map_to_F, HYPRE_Int(0) );/* *MUST* pass init value since input and output types diff. */ #endif HYPRE_Int *map_F2_to_F = hypre_TAlloc(HYPRE_Int, AF2F_nr_local, HYPRE_MEMORY_DEVICE); #if defined(HYPRE_USING_SYCL) HYPRE_Int *tmp_end = hypreSycl_copy_if( map_to_F, map_to_F + A_nr_local, CF_marker, map_F2_to_F, equal(-2) ); #else HYPRE_Int *tmp_end = HYPRE_THRUST_CALL( copy_if, map_to_F, map_to_F + A_nr_local, CF_marker, map_F2_to_F, equal(-2) ); #endif hypre_assert(tmp_end - map_F2_to_F == AF2F_nr_local); hypre_TFree(map_to_F, HYPRE_MEMORY_DEVICE); /* add to rsW those in AF2F that correspond to Dbeta == 0 * diagnoally scale As_F2F (from both sides) and replace the diagonal */ gDim = hypre_GetDefaultDeviceGridDimension(AF2F_nr_local, "warp", bDim); HYPRE_Int *As_F2F_diag_i = hypre_CSRMatrixI(hypre_ParCSRMatrixDiag(As_F2F)); HYPRE_Int *As_F2F_diag_j = hypre_CSRMatrixJ(hypre_ParCSRMatrixDiag(As_F2F)); HYPRE_Complex *As_F2F_diag_data = hypre_CSRMatrixData(hypre_ParCSRMatrixDiag(As_F2F)); HYPRE_Int *As_F2F_offd_i = hypre_CSRMatrixI(hypre_ParCSRMatrixOffd(As_F2F)); HYPRE_Int *As_F2F_offd_j = hypre_CSRMatrixJ(hypre_ParCSRMatrixOffd(As_F2F)); HYPRE_Complex *As_F2F_offd_data = hypre_CSRMatrixData(hypre_ParCSRMatrixOffd(As_F2F)); HYPRE_GPU_LAUNCH( hypreGPUKernel_MMInterpScaleAFF, gDim, bDim, AF2F_nr_local, As_F2F_diag_i, As_F2F_diag_j, As_F2F_diag_data, As_F2F_offd_i, As_F2F_offd_j, As_F2F_offd_data, Dbeta, Dbeta_offd, map_F2_to_F, rsW ); hypre_TFree(Dbeta, HYPRE_MEMORY_DEVICE); hypre_TFree(Dbeta_offd, HYPRE_MEMORY_DEVICE); hypre_TFree(map_F2_to_F, HYPRE_MEMORY_DEVICE); hypre_TFree(rsW, HYPRE_MEMORY_DEVICE); /* Perform matrix-matrix multiplication */ W = hypre_ParCSRMatMatDevice(As_F2F, As_FC); hypre_ParCSRMatrixDestroy(As_F2F); hypre_ParCSRMatrixDestroy(As_FC); /* Construct P from matrix product W */ HYPRE_Int *P_diag_i, *P_diag_j, *P_offd_i; HYPRE_Complex *P_diag_data; HYPRE_Int P_nr_local = A_nr_local - (AFC_nr_local - AF2F_nr_local); HYPRE_Int P_diag_nnz = hypre_CSRMatrixNumNonzeros(hypre_ParCSRMatrixDiag(W)) + hypre_ParCSRMatrixNumCols(W); hypre_assert(P_nr_local == hypre_ParCSRMatrixNumRows(W) + hypre_ParCSRMatrixNumCols(W)); P_diag_i = hypre_TAlloc(HYPRE_Int, P_nr_local + 1, HYPRE_MEMORY_DEVICE); P_diag_j = hypre_TAlloc(HYPRE_Int, P_diag_nnz, HYPRE_MEMORY_DEVICE); P_diag_data = hypre_TAlloc(HYPRE_Complex, P_diag_nnz, HYPRE_MEMORY_DEVICE); P_offd_i = hypre_TAlloc(HYPRE_Int, P_nr_local + 1, HYPRE_MEMORY_DEVICE); HYPRE_Int *C2F2_marker = hypre_TAlloc(HYPRE_Int, P_nr_local, HYPRE_MEMORY_DEVICE); #if defined(HYPRE_USING_SYCL) tmp_end = hypreSycl_copy_if( CF_marker, CF_marker + A_nr_local, CF_marker, C2F2_marker, out_of_range(-1, 0) /* -2 or 1 */ ); #else tmp_end = HYPRE_THRUST_CALL( copy_if, CF_marker, CF_marker + A_nr_local, CF_marker, C2F2_marker, out_of_range(-1, 0) /* -2 or 1 */ ); #endif hypre_assert(tmp_end - C2F2_marker == P_nr_local); hypreDevice_extendWtoP( P_nr_local, AF2F_nr_local, hypre_ParCSRMatrixNumCols(W), C2F2_marker, hypre_CSRMatrixNumNonzeros(hypre_ParCSRMatrixDiag(W)), hypre_CSRMatrixI(hypre_ParCSRMatrixDiag(W)), hypre_CSRMatrixJ(hypre_ParCSRMatrixDiag(W)), hypre_CSRMatrixData(hypre_ParCSRMatrixDiag(W)), P_diag_i, P_diag_j, P_diag_data, hypre_CSRMatrixI(hypre_ParCSRMatrixOffd(W)), P_offd_i ); hypre_TFree(C2F2_marker, HYPRE_MEMORY_DEVICE); // final P P = hypre_ParCSRMatrixCreate(hypre_ParCSRMatrixComm(A), hypre_ParCSRMatrixGlobalNumRows(W) + hypre_ParCSRMatrixGlobalNumCols(W), hypre_ParCSRMatrixGlobalNumCols(W), num_old_cpts_global, num_cpts_global, hypre_CSRMatrixNumCols(hypre_ParCSRMatrixOffd(W)), P_diag_nnz, hypre_CSRMatrixNumNonzeros(hypre_ParCSRMatrixOffd(W))); hypre_CSRMatrixI(hypre_ParCSRMatrixDiag(P)) = P_diag_i; hypre_CSRMatrixJ(hypre_ParCSRMatrixDiag(P)) = P_diag_j; hypre_CSRMatrixData(hypre_ParCSRMatrixDiag(P)) = P_diag_data; hypre_CSRMatrixI(hypre_ParCSRMatrixOffd(P)) = P_offd_i; hypre_CSRMatrixJ(hypre_ParCSRMatrixOffd(P)) = hypre_CSRMatrixJ(hypre_ParCSRMatrixOffd(W)); hypre_CSRMatrixData(hypre_ParCSRMatrixOffd(P)) = hypre_CSRMatrixData(hypre_ParCSRMatrixOffd(W)); hypre_CSRMatrixJ(hypre_ParCSRMatrixOffd(W)) = NULL; hypre_CSRMatrixData(hypre_ParCSRMatrixOffd(W)) = NULL; hypre_CSRMatrixMemoryLocation(hypre_ParCSRMatrixDiag(P)) = HYPRE_MEMORY_DEVICE; hypre_CSRMatrixMemoryLocation(hypre_ParCSRMatrixOffd(P)) = HYPRE_MEMORY_DEVICE; hypre_ParCSRMatrixDeviceColMapOffd(P) = hypre_ParCSRMatrixDeviceColMapOffd(W); hypre_ParCSRMatrixColMapOffd(P) = hypre_ParCSRMatrixColMapOffd(W); hypre_ParCSRMatrixDeviceColMapOffd(W) = NULL; hypre_ParCSRMatrixColMapOffd(W) = NULL; hypre_ParCSRMatrixNumNonzeros(P) = hypre_ParCSRMatrixNumNonzeros(W) + hypre_ParCSRMatrixGlobalNumCols(W); hypre_ParCSRMatrixDNumNonzeros(P) = (HYPRE_Real) hypre_ParCSRMatrixNumNonzeros(P); hypre_ParCSRMatrixDestroy(W); if (trunc_factor != 0.0 || max_elmts > 0) { hypre_BoomerAMGInterpTruncationDevice(P, trunc_factor, max_elmts ); } *P_ptr = P; return hypre_error_flag; } /*--------------------------------------------------------------------------------------*/ HYPRE_Int hypre_BoomerAMGBuildModPartialExtPEInterpDevice( hypre_ParCSRMatrix *A, HYPRE_Int *CF_marker, hypre_ParCSRMatrix *S, HYPRE_BigInt *num_cpts_global, /* C2 */ HYPRE_BigInt *num_old_cpts_global, /* C2 + F2 */ HYPRE_Int debug_flag, HYPRE_Real trunc_factor, HYPRE_Int max_elmts, hypre_ParCSRMatrix **P_ptr ) { HYPRE_UNUSED_VAR(debug_flag); HYPRE_Int A_nr_local = hypre_ParCSRMatrixNumRows(A); hypre_CSRMatrix *A_diag = hypre_ParCSRMatrixDiag(A); HYPRE_Complex *A_diag_data = hypre_CSRMatrixData(A_diag); HYPRE_Int *A_diag_i = hypre_CSRMatrixI(A_diag); hypre_CSRMatrix *A_offd = hypre_ParCSRMatrixOffd(A); HYPRE_Complex *A_offd_data = hypre_CSRMatrixData(A_offd); HYPRE_Int *A_offd_i = hypre_CSRMatrixI(A_offd); HYPRE_Int A_offd_nnz = hypre_CSRMatrixNumNonzeros(A_offd); HYPRE_Complex *Dbeta, *rsWA, *rsW, *dlam, *dlam_offd, *dtmp, *dtmp_offd; hypre_ParCSRMatrix *As_F2F, *As_FF, *As_FC, *W, *P; hypre_BoomerAMGMakeSocFromSDevice(A, S); HYPRE_Int *Soc_diag_j = hypre_ParCSRMatrixSocDiagJ(S); HYPRE_Int *Soc_offd_j = hypre_ParCSRMatrixSocOffdJ(S); /* As_F2F = As_{F2, F}, As_FC = As_{F, C2} */ hypre_ParCSRMatrixGenerateFFFC3Device(A, CF_marker, num_cpts_global, S, &As_FC, &As_F2F); HYPRE_Int AFC_nr_local = hypre_ParCSRMatrixNumRows(As_FC); HYPRE_Int AF2F_nr_local = hypre_ParCSRMatrixNumRows(As_F2F); /* row sum of AFC, i.e., D_beta */ Dbeta = hypre_TAlloc(HYPRE_Complex, AFC_nr_local, HYPRE_MEMORY_DEVICE); hypre_CSRMatrixComputeRowSumDevice(hypre_ParCSRMatrixDiag(As_FC), NULL, NULL, Dbeta, 0, 1.0, "set"); hypre_CSRMatrixComputeRowSumDevice(hypre_ParCSRMatrixOffd(As_FC), NULL, NULL, Dbeta, 0, 1.0, "add"); /* As_FF = As_{F,F} */ hypre_ParCSRMatrixGenerateFFFCDevice(A, CF_marker, num_cpts_global, S, NULL, &As_FF); hypre_assert(AFC_nr_local == hypre_ParCSRMatrixNumRows(As_FF)); dim3 bDim = hypre_GetDefaultDeviceBlockDimension(); dim3 gDim = hypre_GetDefaultDeviceGridDimension(AFC_nr_local, "warp", bDim); /* Generate D_lambda in the paper: D_beta + (row sum of AFF without diagonal elements / row_nnz) */ /* Generate D_tmp, i.e., D_mu / D_lambda */ dlam = hypre_TAlloc(HYPRE_Complex, AFC_nr_local, HYPRE_MEMORY_DEVICE); dtmp = hypre_TAlloc(HYPRE_Complex, AFC_nr_local, HYPRE_MEMORY_DEVICE); HYPRE_Int *As_FF_diag_i = hypre_CSRMatrixI(hypre_ParCSRMatrixDiag(As_FF)); HYPRE_Int *As_FF_diag_j = hypre_CSRMatrixJ(hypre_ParCSRMatrixDiag(As_FF)); HYPRE_Complex *As_FF_diag_data = hypre_CSRMatrixData(hypre_ParCSRMatrixDiag(As_FF)); HYPRE_Int *As_FF_offd_i = hypre_CSRMatrixI(hypre_ParCSRMatrixOffd(As_FF)); HYPRE_Complex *As_FF_offd_data = hypre_CSRMatrixData(hypre_ParCSRMatrixOffd(As_FF)); HYPRE_GPU_LAUNCH( hypreGPUKernel_compute_dlam_dtmp, gDim, bDim, AFC_nr_local, As_FF_diag_i, As_FF_diag_j, As_FF_diag_data, As_FF_offd_i, As_FF_offd_data, Dbeta, dlam, dtmp ); hypre_ParCSRMatrixDestroy(As_FF); hypre_TFree(Dbeta, HYPRE_MEMORY_DEVICE); /* collect off-processor dtmp and dlam */ dtmp_offd = hypre_TAlloc(HYPRE_Complex, hypre_CSRMatrixNumCols(hypre_ParCSRMatrixOffd(As_F2F)), HYPRE_MEMORY_DEVICE); dlam_offd = hypre_TAlloc(HYPRE_Complex, hypre_CSRMatrixNumCols(hypre_ParCSRMatrixOffd(As_F2F)), HYPRE_MEMORY_DEVICE); hypre_ParCSRCommPkg *comm_pkg = hypre_ParCSRMatrixCommPkg(As_F2F); hypre_ParCSRCommHandle *comm_handle; if (!comm_pkg) { hypre_MatvecCommPkgCreate(As_F2F); comm_pkg = hypre_ParCSRMatrixCommPkg(As_F2F); } HYPRE_Int num_sends = hypre_ParCSRCommPkgNumSends(comm_pkg); HYPRE_Int num_elmts_send = hypre_ParCSRCommPkgSendMapStart(comm_pkg, num_sends); HYPRE_Complex *send_buf = hypre_TAlloc(HYPRE_Complex, num_elmts_send, HYPRE_MEMORY_DEVICE); hypre_ParCSRCommPkgCopySendMapElmtsToDevice(comm_pkg); #if defined(HYPRE_USING_SYCL) hypreSycl_gather( hypre_ParCSRCommPkgDeviceSendMapElmts(comm_pkg), hypre_ParCSRCommPkgDeviceSendMapElmts(comm_pkg) + num_elmts_send, dtmp, send_buf ); #else HYPRE_THRUST_CALL( gather, hypre_ParCSRCommPkgDeviceSendMapElmts(comm_pkg), hypre_ParCSRCommPkgDeviceSendMapElmts(comm_pkg) + num_elmts_send, dtmp, send_buf ); #endif #if defined(HYPRE_USING_THRUST_NOSYNC) /* RL: make sure send_buf is ready before issuing GPU-GPU MPI */ if (hypre_GetGpuAwareMPI()) { hypre_ForceSyncComputeStream(); } #endif comm_handle = hypre_ParCSRCommHandleCreate_v2(1, comm_pkg, HYPRE_MEMORY_DEVICE, send_buf, HYPRE_MEMORY_DEVICE, dtmp_offd); hypre_ParCSRCommHandleDestroy(comm_handle); #if defined(HYPRE_USING_SYCL) hypreSycl_gather( hypre_ParCSRCommPkgDeviceSendMapElmts(comm_pkg), hypre_ParCSRCommPkgDeviceSendMapElmts(comm_pkg) + num_elmts_send, dlam, send_buf ); #else HYPRE_THRUST_CALL( gather, hypre_ParCSRCommPkgDeviceSendMapElmts(comm_pkg), hypre_ParCSRCommPkgDeviceSendMapElmts(comm_pkg) + num_elmts_send, dlam, send_buf ); #endif #if defined(HYPRE_USING_THRUST_NOSYNC) /* RL: make sure send_buf is ready before issuing GPU-GPU MPI */ if (hypre_GetGpuAwareMPI()) { hypre_ForceSyncComputeStream(); } #endif comm_handle = hypre_ParCSRCommHandleCreate_v2(1, comm_pkg, HYPRE_MEMORY_DEVICE, send_buf, HYPRE_MEMORY_DEVICE, dlam_offd); hypre_ParCSRCommHandleDestroy(comm_handle); hypre_TFree(send_buf, HYPRE_MEMORY_DEVICE); /* weak row sum and diagonal, i.e., DFF + Dgamma */ rsWA = hypre_TAlloc(HYPRE_Complex, A_nr_local, HYPRE_MEMORY_DEVICE); gDim = hypre_GetDefaultDeviceGridDimension(A_nr_local, "warp", bDim); /* only for rows corresponding to F2 (notice flag == -1) */ HYPRE_GPU_LAUNCH( hypreGPUKernel_compute_weak_rowsums, gDim, bDim, A_nr_local, A_offd_nnz > 0, CF_marker, A_diag_i, A_diag_data, Soc_diag_j, A_offd_i, A_offd_data, Soc_offd_j, rsWA, -1 ); rsW = hypre_TAlloc(HYPRE_Complex, AF2F_nr_local, HYPRE_MEMORY_DEVICE); #if defined(HYPRE_USING_SYCL) HYPRE_Complex *new_end = hypreSycl_copy_if( rsWA, rsWA + A_nr_local, CF_marker, rsW, equal(-2) ); #else HYPRE_Complex *new_end = HYPRE_THRUST_CALL( copy_if, rsWA, rsWA + A_nr_local, CF_marker, rsW, equal(-2) ); #endif hypre_assert(new_end - rsW == AF2F_nr_local); hypre_TFree(rsWA, HYPRE_MEMORY_DEVICE); /* map from F2 to F */ HYPRE_Int *map_to_F = hypre_TAlloc(HYPRE_Int, A_nr_local, HYPRE_MEMORY_DEVICE); #if defined(HYPRE_USING_SYCL) HYPRE_ONEDPL_CALL( std::exclusive_scan, oneapi::dpl::make_transform_iterator(CF_marker, is_negative()), oneapi::dpl::make_transform_iterator(CF_marker + A_nr_local, is_negative()), map_to_F, HYPRE_Int(0) ); /* *MUST* pass init value since input and output types diff. */ #else HYPRE_THRUST_CALL( exclusive_scan, thrust::make_transform_iterator(CF_marker, is_negative()), thrust::make_transform_iterator(CF_marker + A_nr_local, is_negative()), map_to_F, HYPRE_Int(0) ); /* *MUST* pass init value since input and output types diff. */ #endif HYPRE_Int *map_F2_to_F = hypre_TAlloc(HYPRE_Int, AF2F_nr_local, HYPRE_MEMORY_DEVICE); #if defined(HYPRE_USING_SYCL) HYPRE_Int *tmp_end = hypreSycl_copy_if( map_to_F, map_to_F + A_nr_local, CF_marker, map_F2_to_F, equal(-2) ); #else HYPRE_Int *tmp_end = HYPRE_THRUST_CALL( copy_if, map_to_F, map_to_F + A_nr_local, CF_marker, map_F2_to_F, equal(-2) ); #endif hypre_assert(tmp_end - map_F2_to_F == AF2F_nr_local); hypre_TFree(map_to_F, HYPRE_MEMORY_DEVICE); /* add to rsW those in AFF that correspond to lam == 0 * diagnoally scale As_F2F (from both sides) and replace the diagonal */ gDim = hypre_GetDefaultDeviceGridDimension(AF2F_nr_local, "warp", bDim); HYPRE_Int *As_F2F_diag_i = hypre_CSRMatrixI(hypre_ParCSRMatrixDiag(As_F2F)); HYPRE_Int *As_F2F_diag_j = hypre_CSRMatrixJ(hypre_ParCSRMatrixDiag(As_F2F)); HYPRE_Complex *As_F2F_diag_data = hypre_CSRMatrixData(hypre_ParCSRMatrixDiag(As_F2F)); HYPRE_Int *As_F2F_offd_i = hypre_CSRMatrixI(hypre_ParCSRMatrixOffd(As_F2F)); HYPRE_Int *As_F2F_offd_j = hypre_CSRMatrixJ(hypre_ParCSRMatrixOffd(As_F2F)); HYPRE_Complex *As_F2F_offd_data = hypre_CSRMatrixData(hypre_ParCSRMatrixOffd(As_F2F)); HYPRE_GPU_LAUNCH( hypreGPUKernel_MMPEInterpScaleAFF, gDim, bDim, AF2F_nr_local, As_F2F_diag_i, As_F2F_diag_j, As_F2F_diag_data, As_F2F_offd_i, As_F2F_offd_j, As_F2F_offd_data, dtmp, dtmp_offd, dlam, dlam_offd, map_F2_to_F, rsW ); hypre_TFree(dlam, HYPRE_MEMORY_DEVICE); hypre_TFree(dlam_offd, HYPRE_MEMORY_DEVICE); hypre_TFree(dtmp, HYPRE_MEMORY_DEVICE); hypre_TFree(dtmp_offd, HYPRE_MEMORY_DEVICE); hypre_TFree(map_F2_to_F, HYPRE_MEMORY_DEVICE); hypre_TFree(rsW, HYPRE_MEMORY_DEVICE); /* Perform matrix-matrix multiplication */ W = hypre_ParCSRMatMatDevice(As_F2F, As_FC); hypre_ParCSRMatrixDestroy(As_F2F); hypre_ParCSRMatrixDestroy(As_FC); /* Construct P from matrix product W */ HYPRE_Int *P_diag_i, *P_diag_j, *P_offd_i; HYPRE_Complex *P_diag_data; HYPRE_Int P_nr_local = A_nr_local - (AFC_nr_local - AF2F_nr_local); HYPRE_Int P_diag_nnz = hypre_CSRMatrixNumNonzeros(hypre_ParCSRMatrixDiag(W)) + hypre_ParCSRMatrixNumCols(W); hypre_assert(P_nr_local == hypre_ParCSRMatrixNumRows(W) + hypre_ParCSRMatrixNumCols(W)); P_diag_i = hypre_TAlloc(HYPRE_Int, P_nr_local + 1, HYPRE_MEMORY_DEVICE); P_diag_j = hypre_TAlloc(HYPRE_Int, P_diag_nnz, HYPRE_MEMORY_DEVICE); P_diag_data = hypre_TAlloc(HYPRE_Complex, P_diag_nnz, HYPRE_MEMORY_DEVICE); P_offd_i = hypre_TAlloc(HYPRE_Int, P_nr_local + 1, HYPRE_MEMORY_DEVICE); HYPRE_Int *C2F2_marker = hypre_TAlloc(HYPRE_Int, P_nr_local, HYPRE_MEMORY_DEVICE); #if defined(HYPRE_USING_SYCL) tmp_end = hypreSycl_copy_if( CF_marker, CF_marker + A_nr_local, CF_marker, C2F2_marker, out_of_range(-1, 0) /* -2 or 1 */ ); #else tmp_end = HYPRE_THRUST_CALL( copy_if, CF_marker, CF_marker + A_nr_local, CF_marker, C2F2_marker, out_of_range(-1, 0) /* -2 or 1 */ ); #endif hypre_assert(tmp_end - C2F2_marker == P_nr_local); hypreDevice_extendWtoP( P_nr_local, AF2F_nr_local, hypre_ParCSRMatrixNumCols(W), C2F2_marker, hypre_CSRMatrixNumNonzeros(hypre_ParCSRMatrixDiag(W)), hypre_CSRMatrixI(hypre_ParCSRMatrixDiag(W)), hypre_CSRMatrixJ(hypre_ParCSRMatrixDiag(W)), hypre_CSRMatrixData(hypre_ParCSRMatrixDiag(W)), P_diag_i, P_diag_j, P_diag_data, hypre_CSRMatrixI(hypre_ParCSRMatrixOffd(W)), P_offd_i ); hypre_TFree(C2F2_marker, HYPRE_MEMORY_DEVICE); // final P P = hypre_ParCSRMatrixCreate(hypre_ParCSRMatrixComm(A), hypre_ParCSRMatrixGlobalNumRows(W) + hypre_ParCSRMatrixGlobalNumCols(W), hypre_ParCSRMatrixGlobalNumCols(W), num_old_cpts_global, num_cpts_global, hypre_CSRMatrixNumCols(hypre_ParCSRMatrixOffd(W)), P_diag_nnz, hypre_CSRMatrixNumNonzeros(hypre_ParCSRMatrixOffd(W))); hypre_CSRMatrixI(hypre_ParCSRMatrixDiag(P)) = P_diag_i; hypre_CSRMatrixJ(hypre_ParCSRMatrixDiag(P)) = P_diag_j; hypre_CSRMatrixData(hypre_ParCSRMatrixDiag(P)) = P_diag_data; hypre_CSRMatrixI(hypre_ParCSRMatrixOffd(P)) = P_offd_i; hypre_CSRMatrixJ(hypre_ParCSRMatrixOffd(P)) = hypre_CSRMatrixJ(hypre_ParCSRMatrixOffd(W)); hypre_CSRMatrixData(hypre_ParCSRMatrixOffd(P)) = hypre_CSRMatrixData(hypre_ParCSRMatrixOffd(W)); hypre_CSRMatrixJ(hypre_ParCSRMatrixOffd(W)) = NULL; hypre_CSRMatrixData(hypre_ParCSRMatrixOffd(W)) = NULL; hypre_CSRMatrixMemoryLocation(hypre_ParCSRMatrixDiag(P)) = HYPRE_MEMORY_DEVICE; hypre_CSRMatrixMemoryLocation(hypre_ParCSRMatrixOffd(P)) = HYPRE_MEMORY_DEVICE; hypre_ParCSRMatrixDeviceColMapOffd(P) = hypre_ParCSRMatrixDeviceColMapOffd(W); hypre_ParCSRMatrixColMapOffd(P) = hypre_ParCSRMatrixColMapOffd(W); hypre_ParCSRMatrixDeviceColMapOffd(W) = NULL; hypre_ParCSRMatrixColMapOffd(W) = NULL; hypre_ParCSRMatrixNumNonzeros(P) = hypre_ParCSRMatrixNumNonzeros(W) + hypre_ParCSRMatrixGlobalNumCols(W); hypre_ParCSRMatrixDNumNonzeros(P) = (HYPRE_Real) hypre_ParCSRMatrixNumNonzeros(P); hypre_ParCSRMatrixDestroy(W); if (trunc_factor != 0.0 || max_elmts > 0) { hypre_BoomerAMGInterpTruncationDevice(P, trunc_factor, max_elmts ); } *P_ptr = P; return hypre_error_flag; } //----------------------------------------------------------------------- __global__ void hypreGPUKernel_MMInterpScaleAFF( hypre_DeviceItem &item, HYPRE_Int AFF_nrows, HYPRE_Int *AFF_diag_i, HYPRE_Int *AFF_diag_j, HYPRE_Complex *AFF_diag_a, HYPRE_Int *AFF_offd_i, HYPRE_Int *AFF_offd_j, HYPRE_Complex *AFF_offd_a, HYPRE_Complex *beta_diag, HYPRE_Complex *beta_offd, HYPRE_Int *F2_to_F, HYPRE_Real *rsW ) { HYPRE_Int row = hypre_gpu_get_grid_warp_id<1, 1>(item); if (row >= AFF_nrows) { return; } HYPRE_Int lane = hypre_gpu_get_lane_id<1>(item); HYPRE_Int ib_diag = 0, ie_diag; HYPRE_Int rowF = 0; if (lane == 0) { rowF = read_only_load(&F2_to_F[row]); } rowF = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, rowF, 0); if (lane < 2) { ib_diag = read_only_load(AFF_diag_i + row + lane); } ie_diag = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, ib_diag, 1); ib_diag = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, ib_diag, 0); HYPRE_Complex rl = 0.0; for (HYPRE_Int i = ib_diag + lane; warp_any_sync(item, HYPRE_WARP_FULL_MASK, i < ie_diag); i += HYPRE_WARP_SIZE) { if (i < ie_diag) { HYPRE_Int j = read_only_load(&AFF_diag_j[i]); if (j == rowF) { /* diagonal */ AFF_diag_a[i] = 1.0; } else { /* off-diagonal */ HYPRE_Complex beta = read_only_load(&beta_diag[j]); HYPRE_Complex val = AFF_diag_a[i]; if (beta == 0.0) { rl += val; AFF_diag_a[i] = 0.0; } else { AFF_diag_a[i] = val / beta; } } } } HYPRE_Int ib_offd = 0, ie_offd; if (lane < 2) { ib_offd = read_only_load(AFF_offd_i + row + lane); } ie_offd = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, ib_offd, 1); ib_offd = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, ib_offd, 0); for (HYPRE_Int i = ib_offd + lane; warp_any_sync(item, HYPRE_WARP_FULL_MASK, i < ie_offd); i += HYPRE_WARP_SIZE) { if (i < ie_offd) { HYPRE_Int j = read_only_load(&AFF_offd_j[i]); HYPRE_Complex beta = read_only_load(&beta_offd[j]); HYPRE_Complex val = AFF_offd_a[i]; if (beta == 0.0) { rl += val; AFF_offd_a[i] = 0.0; } else { AFF_offd_a[i] = val / beta; } } } rl = warp_reduce_sum(item, rl); if (lane == 0) { rl += read_only_load(&rsW[row]); rl = rl == 0.0 ? 0.0 : -1.0 / rl; } rl = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, rl, 0); for (HYPRE_Int i = ib_diag + lane; warp_any_sync(item, HYPRE_WARP_FULL_MASK, i < ie_diag); i += HYPRE_WARP_SIZE) { if (i < ie_diag) { AFF_diag_a[i] *= rl; } } for (HYPRE_Int i = ib_offd + lane; warp_any_sync(item, HYPRE_WARP_FULL_MASK, i < ie_offd); i += HYPRE_WARP_SIZE) { if (i < ie_offd) { AFF_offd_a[i] *= rl; } } } //----------------------------------------------------------------------- __global__ void hypreGPUKernel_MMPEInterpScaleAFF( hypre_DeviceItem &item, HYPRE_Int AFF_nrows, HYPRE_Int *AFF_diag_i, HYPRE_Int *AFF_diag_j, HYPRE_Complex *AFF_diag_a, HYPRE_Int *AFF_offd_i, HYPRE_Int *AFF_offd_j, HYPRE_Complex *AFF_offd_a, HYPRE_Complex *tmp_diag, HYPRE_Complex *tmp_offd, HYPRE_Complex *lam_diag, HYPRE_Complex *lam_offd, HYPRE_Int *F2_to_F, HYPRE_Real *rsW ) { HYPRE_Int row = hypre_gpu_get_grid_warp_id<1, 1>(item); if (row >= AFF_nrows) { return; } HYPRE_Int lane = hypre_gpu_get_lane_id<1>(item); HYPRE_Int ib_diag = 0, ie_diag; HYPRE_Int rowF = 0; if (lane == 0) { rowF = read_only_load(&F2_to_F[row]); } rowF = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, rowF, 0); if (lane < 2) { ib_diag = read_only_load(AFF_diag_i + row + lane); } ie_diag = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, ib_diag, 1); ib_diag = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, ib_diag, 0); HYPRE_Complex rl = 0.0; for (HYPRE_Int i = ib_diag + lane; warp_any_sync(item, HYPRE_WARP_FULL_MASK, i < ie_diag); i += HYPRE_WARP_SIZE) { if (i < ie_diag) { HYPRE_Int j = read_only_load(&AFF_diag_j[i]); if (j == rowF) { /* diagonal */ AFF_diag_a[i] = 1.0; } else { /* off-diagonal */ HYPRE_Complex lam = read_only_load(&lam_diag[j]); HYPRE_Complex val = AFF_diag_a[i]; if (lam == 0.0) { rl += val; AFF_diag_a[i] = 0.0; } else { rl += val * read_only_load(&tmp_diag[j]); AFF_diag_a[i] = val / lam; } } } } HYPRE_Int ib_offd = 0, ie_offd; if (lane < 2) { ib_offd = read_only_load(AFF_offd_i + row + lane); } ie_offd = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, ib_offd, 1); ib_offd = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, ib_offd, 0); for (HYPRE_Int i = ib_offd + lane; warp_any_sync(item, HYPRE_WARP_FULL_MASK, i < ie_offd); i += HYPRE_WARP_SIZE) { if (i < ie_offd) { HYPRE_Int j = read_only_load(&AFF_offd_j[i]); HYPRE_Complex lam = read_only_load(&lam_offd[j]); HYPRE_Complex val = AFF_offd_a[i]; if (lam == 0.0) { rl += val; AFF_offd_a[i] = 0.0; } else { rl += val * read_only_load(&tmp_offd[j]); AFF_offd_a[i] = val / lam; } } } rl = warp_reduce_sum(item, rl); if (lane == 0) { rl += read_only_load(&rsW[row]); rl = rl == 0.0 ? 0.0 : -1.0 / rl; } rl = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, rl, 0); for (HYPRE_Int i = ib_diag + lane; warp_any_sync(item, HYPRE_WARP_FULL_MASK, i < ie_diag); i += HYPRE_WARP_SIZE) { if (i < ie_diag) { AFF_diag_a[i] *= rl; } } for (HYPRE_Int i = ib_offd + lane; warp_any_sync(item, HYPRE_WARP_FULL_MASK, i < ie_offd); i += HYPRE_WARP_SIZE) { if (i < ie_offd) { AFF_offd_a[i] *= rl; } } } #endif /* #if defined(HYPRE_USING_GPU) */ hypre-2.33.0/src/parcsr_ls/par_add_cycle.c000066400000000000000000001217111477326011500204330ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * ParAMG cycling routine * *****************************************************************************/ #include "_hypre_parcsr_ls.h" #include "par_amg.h" /*-------------------------------------------------------------------------- * hypre_BoomerAMGCycle *--------------------------------------------------------------------------*/ HYPRE_Int hypre_BoomerAMGAdditiveCycle( void *amg_vdata) { hypre_ParAMGData *amg_data = (hypre_ParAMGData*) amg_vdata; /* Data Structure variables */ hypre_ParCSRMatrix **A_array; hypre_ParCSRMatrix **P_array; hypre_ParCSRMatrix **R_array; hypre_ParCSRMatrix *Lambda; hypre_ParCSRMatrix *Atilde; hypre_ParVector **F_array; hypre_ParVector **U_array; hypre_ParVector *Vtemp; hypre_ParVector *Ztemp; hypre_ParVector *Xtilde, *Rtilde; hypre_IntArray **CF_marker_array; HYPRE_Int *CF_marker; HYPRE_Int num_levels; HYPRE_Int addlvl, add_end; HYPRE_Int additive; HYPRE_Int mult_additive; HYPRE_Int simple; HYPRE_Int add_last_lvl; HYPRE_Int i, j, num_rows; HYPRE_Int n_global; HYPRE_Int rlx_order; /* Local variables */ HYPRE_Int Solve_err_flag = 0; HYPRE_Int level; HYPRE_Int coarse_grid; HYPRE_Int fine_grid; HYPRE_Int rlx_down; HYPRE_Int rlx_up; HYPRE_Int rlx_coarse; HYPRE_Int *grid_relax_type; HYPRE_Int *num_grid_sweeps; hypre_Vector **l1_norms; HYPRE_Real alpha, beta; HYPRE_Real *u_data; HYPRE_Real *v_data; hypre_Vector *l1_norms_lvl; HYPRE_Real *D_inv; HYPRE_Real *x_global; HYPRE_Real *r_global; HYPRE_Real *relax_weight; HYPRE_Real *omega; #if 0 HYPRE_Real *D_mat; HYPRE_Real *S_vec; #endif HYPRE_ANNOTATE_FUNC_BEGIN; /* Acquire data and allocate storage */ A_array = hypre_ParAMGDataAArray(amg_data); F_array = hypre_ParAMGDataFArray(amg_data); U_array = hypre_ParAMGDataUArray(amg_data); P_array = hypre_ParAMGDataPArray(amg_data); R_array = hypre_ParAMGDataRArray(amg_data); CF_marker_array = hypre_ParAMGDataCFMarkerArray(amg_data); Vtemp = hypre_ParAMGDataVtemp(amg_data); Ztemp = hypre_ParAMGDataZtemp(amg_data); num_levels = hypre_ParAMGDataNumLevels(amg_data); additive = hypre_ParAMGDataAdditive(amg_data); mult_additive = hypre_ParAMGDataMultAdditive(amg_data); simple = hypre_ParAMGDataSimple(amg_data); add_last_lvl = hypre_ParAMGDataAddLastLvl(amg_data); grid_relax_type = hypre_ParAMGDataGridRelaxType(amg_data); Lambda = hypre_ParAMGDataLambda(amg_data); Atilde = hypre_ParAMGDataAtilde(amg_data); Xtilde = hypre_ParAMGDataXtilde(amg_data); Rtilde = hypre_ParAMGDataRtilde(amg_data); l1_norms = hypre_ParAMGDataL1Norms(amg_data); D_inv = hypre_ParAMGDataDinv(amg_data); relax_weight = hypre_ParAMGDataRelaxWeight(amg_data); omega = hypre_ParAMGDataOmega(amg_data); rlx_order = hypre_ParAMGDataRelaxOrder(amg_data); num_grid_sweeps = hypre_ParAMGDataNumGridSweeps(amg_data); /* Initialize */ addlvl = hypre_max(additive, mult_additive); addlvl = hypre_max(addlvl, simple); if (add_last_lvl == -1 ) { add_end = num_levels - 1; } else { add_end = add_last_lvl; } Solve_err_flag = 0; /*--------------------------------------------------------------------- * Main loop of cycling --- multiplicative version --- V-cycle *--------------------------------------------------------------------*/ /* down cycle */ rlx_down = grid_relax_type[1]; rlx_up = grid_relax_type[2]; rlx_coarse = grid_relax_type[3]; for (level = 0; level < num_levels - 1; level++) { HYPRE_ANNOTATE_MGLEVEL_BEGIN(level); fine_grid = level; coarse_grid = level + 1; u_data = hypre_VectorData(hypre_ParVectorLocalVector(U_array[fine_grid])); v_data = hypre_VectorData(hypre_ParVectorLocalVector(Vtemp)); l1_norms_lvl = l1_norms[level]; hypre_ParVectorSetConstantValues(U_array[coarse_grid], 0.0); if (level < addlvl || level > add_end) /* multiplicative version */ { /* smoothing step */ if (rlx_down == 0) { HYPRE_Real *A_data = hypre_CSRMatrixData(hypre_ParCSRMatrixDiag(A_array[fine_grid])); HYPRE_Int *A_i = hypre_CSRMatrixI(hypre_ParCSRMatrixDiag(A_array[fine_grid])); num_rows = hypre_CSRMatrixNumRows(hypre_ParCSRMatrixDiag(A_array[fine_grid])); for (j = 0; j < num_grid_sweeps[1]; j++) { hypre_ParVectorCopy(F_array[fine_grid], Vtemp); #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i) HYPRE_SMP_SCHEDULE #endif for (i = 0; i < num_rows; i++) { u_data[i] = relax_weight[level] * v_data[i] / A_data[A_i[i]]; } } } else if (rlx_down != 18) { /*hypre_BoomerAMGRelax(A_array[fine_grid],F_array[fine_grid],NULL,rlx_down,0,*/ CF_marker = hypre_IntArrayData(CF_marker_array[fine_grid]); for (j = 0; j < num_grid_sweeps[1]; j++) { hypre_BoomerAMGRelaxIF(A_array[fine_grid], F_array[fine_grid], CF_marker, rlx_down, rlx_order, 1, relax_weight[fine_grid], omega[fine_grid], l1_norms[level] ? hypre_VectorData(l1_norms[level]) : NULL, U_array[fine_grid], Vtemp, Ztemp); hypre_ParVectorCopy(F_array[fine_grid], Vtemp); } } else { num_rows = hypre_CSRMatrixNumRows(hypre_ParCSRMatrixDiag(A_array[fine_grid])); for (j = 0; j < num_grid_sweeps[1]; j++) { hypre_ParVectorCopy(F_array[fine_grid], Vtemp); #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i) HYPRE_SMP_SCHEDULE #endif for (i = 0; i < num_rows; i++) { u_data[i] += v_data[i] / hypre_VectorData(l1_norms_lvl)[i]; } } } alpha = -1.0; beta = 1.0; hypre_ParCSRMatrixMatvec(alpha, A_array[fine_grid], U_array[fine_grid], beta, Vtemp); alpha = 1.0; beta = 0.0; hypre_ParCSRMatrixMatvecT(alpha, R_array[fine_grid], Vtemp, beta, F_array[coarse_grid]); } else /* additive version */ { hypre_ParVectorCopy(F_array[fine_grid], Vtemp); if (level == 0) /* compute residual */ { hypre_ParVectorCopy(Vtemp, Rtilde); hypre_ParVectorCopy(U_array[fine_grid], Xtilde); } alpha = 1.0; beta = 0.0; hypre_ParCSRMatrixMatvecT(alpha, R_array[fine_grid], Vtemp, beta, F_array[coarse_grid]); } HYPRE_ANNOTATE_MGLEVEL_END(level); } /* additive smoothing and solve coarse grid */ HYPRE_ANNOTATE_MGLEVEL_BEGIN(num_levels - 1); if (addlvl < num_levels) { if (simple > -1) { x_global = hypre_VectorData(hypre_ParVectorLocalVector(Xtilde)); r_global = hypre_VectorData(hypre_ParVectorLocalVector(Rtilde)); n_global = hypre_VectorSize(hypre_ParVectorLocalVector(Xtilde)); #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i) HYPRE_SMP_SCHEDULE #endif for (i = 0; i < n_global; i++) { x_global[i] += D_inv[i] * r_global[i]; } } else { if (num_grid_sweeps[1] > 1) { n_global = hypre_VectorSize(hypre_ParVectorLocalVector(Rtilde)); hypre_ParVector *Tmptilde = hypre_CTAlloc(hypre_ParVector, 1, HYPRE_MEMORY_HOST); hypre_Vector *Tmptilde_local = hypre_SeqVectorCreate(n_global); hypre_SeqVectorInitialize(Tmptilde_local); hypre_ParVectorLocalVector(Tmptilde) = Tmptilde_local; hypre_ParVectorOwnsData(Tmptilde) = 1; hypre_ParCSRMatrixMatvec(1.0, Lambda, Rtilde, 0.0, Tmptilde); hypre_ParVectorScale(2.0, Rtilde); hypre_ParCSRMatrixMatvec(-1.0, Atilde, Tmptilde, 1.0, Rtilde); hypre_ParVectorDestroy(Tmptilde); } hypre_ParCSRMatrixMatvec(1.0, Lambda, Rtilde, 1.0, Xtilde); } if (addlvl == 0) { hypre_ParVectorCopy(Xtilde, U_array[0]); } } if (add_end < num_levels - 1) { fine_grid = num_levels - 1; for (j = 0; j < num_grid_sweeps[3]; j++) if (rlx_coarse == 18) hypre_ParCSRRelax(A_array[fine_grid], F_array[fine_grid], 1, 1, l1_norms[fine_grid] ? hypre_VectorData(l1_norms[fine_grid]) : NULL, 1.0, 1.0, 0.0, 0.0, 0, 0.0, U_array[fine_grid], Vtemp, Ztemp); else hypre_BoomerAMGRelaxIF(A_array[fine_grid], F_array[fine_grid], NULL, rlx_coarse, 0, 0, relax_weight[fine_grid], omega[fine_grid], l1_norms[fine_grid] ? hypre_VectorData(l1_norms[fine_grid]) : NULL, U_array[fine_grid], Vtemp, Ztemp); } HYPRE_ANNOTATE_MGLEVEL_END(num_levels - 1); /* up cycle */ for (level = num_levels - 1; level > 0; level--) { HYPRE_ANNOTATE_MGLEVEL_BEGIN(level); fine_grid = level - 1; coarse_grid = level; if (level <= addlvl || level > add_end + 1) /* multiplicative version */ { alpha = 1.0; beta = 1.0; hypre_ParCSRMatrixMatvec(alpha, P_array[fine_grid], U_array[coarse_grid], beta, U_array[fine_grid]); if (rlx_up != 18) { /*hypre_BoomerAMGRelax(A_array[fine_grid],F_array[fine_grid],NULL,rlx_up,0,*/ CF_marker = hypre_IntArrayData(CF_marker_array[fine_grid]); for (j = 0; j < num_grid_sweeps[2]; j++) { hypre_BoomerAMGRelaxIF(A_array[fine_grid], F_array[fine_grid], CF_marker, rlx_up, rlx_order, 2, relax_weight[fine_grid], omega[fine_grid], l1_norms[fine_grid] ? hypre_VectorData(l1_norms[fine_grid]) : NULL, U_array[fine_grid], Vtemp, Ztemp); } } else if (rlx_order) { CF_marker = hypre_IntArrayData(CF_marker_array[fine_grid]); HYPRE_Int loc_relax_points[2]; loc_relax_points[0] = -1; loc_relax_points[1] = 1; for (j = 0; j < num_grid_sweeps[2]; j++) { for (i = 0; i < 2; i++) { hypre_ParCSRRelax_L1_Jacobi(A_array[fine_grid], F_array[fine_grid], CF_marker, loc_relax_points[i], 1.0, l1_norms[fine_grid] ? hypre_VectorData(l1_norms[fine_grid]) : NULL, U_array[fine_grid], Vtemp); } } } else for (j = 0; j < num_grid_sweeps[2]; j++) { hypre_ParCSRRelax(A_array[fine_grid], F_array[fine_grid], 1, 1, l1_norms[fine_grid] ? hypre_VectorData(l1_norms[fine_grid]) : NULL, 1.0, 1.0, 0.0, 0.0, 0, 0.0, U_array[fine_grid], Vtemp, Ztemp); } } else /* additive version */ { alpha = 1.0; beta = 1.0; hypre_ParCSRMatrixMatvec(alpha, P_array[fine_grid], U_array[coarse_grid], beta, U_array[fine_grid]); } HYPRE_ANNOTATE_MGLEVEL_END(level); } HYPRE_ANNOTATE_FUNC_END; return (Solve_err_flag); } HYPRE_Int hypre_CreateLambda(void *amg_vdata) { hypre_ParAMGData *amg_data = (hypre_ParAMGData*) amg_vdata; /* Data Structure variables */ MPI_Comm comm; hypre_ParCSRMatrix **A_array; hypre_ParVector **F_array; hypre_ParVector **U_array; hypre_ParCSRMatrix *A_tmp; hypre_ParCSRMatrix *Lambda; hypre_CSRMatrix *L_diag; hypre_CSRMatrix *L_offd; hypre_ParCSRMatrix *Atilde; hypre_CSRMatrix *Atilde_diag = NULL; hypre_CSRMatrix *Atilde_offd = NULL; HYPRE_Real *Atilde_diag_data = NULL; HYPRE_Real *Atilde_offd_data = NULL; hypre_CSRMatrix *A_tmp_diag; hypre_CSRMatrix *A_tmp_offd; hypre_ParVector *Xtilde; hypre_ParVector *Rtilde; hypre_Vector *Xtilde_local; hypre_Vector *Rtilde_local; hypre_ParCSRCommPkg *comm_pkg; hypre_ParCSRCommPkg *L_comm_pkg = NULL; hypre_ParCSRCommHandle *comm_handle; HYPRE_Real *L_diag_data = NULL; HYPRE_Real *L_offd_data = NULL; HYPRE_Real *buf_data = NULL; HYPRE_Real *tmp_data; HYPRE_Real *x_data; HYPRE_Real *r_data; hypre_Vector *l1_norms; HYPRE_Real *A_tmp_diag_data = NULL; HYPRE_Real *A_tmp_offd_data = NULL; HYPRE_Real *D_data = NULL; HYPRE_Real *D_data_offd = NULL; HYPRE_Int *L_diag_i; HYPRE_Int *L_diag_j = NULL; HYPRE_Int *L_offd_i; HYPRE_Int *L_offd_j = NULL; HYPRE_Int *Atilde_diag_i = NULL; HYPRE_Int *Atilde_diag_j = NULL; HYPRE_Int *Atilde_offd_i = NULL; HYPRE_Int *Atilde_offd_j = NULL; HYPRE_Int *A_tmp_diag_i; HYPRE_Int *A_tmp_offd_i; HYPRE_Int *A_tmp_diag_j; HYPRE_Int *A_tmp_offd_j; HYPRE_Int *L_recv_ptr = NULL; HYPRE_Int *L_send_ptr = NULL; HYPRE_Int *L_recv_procs = NULL; HYPRE_Int *L_send_procs = NULL; HYPRE_Int *L_send_map_elmts = NULL; HYPRE_Int *recv_procs; HYPRE_Int *send_procs; HYPRE_Int *send_map_elmts = NULL; HYPRE_Int *send_map_starts = NULL; HYPRE_Int *recv_vec_starts; HYPRE_Int *all_send_procs = NULL; HYPRE_Int *all_recv_procs = NULL; HYPRE_Int *remap = NULL; HYPRE_Int *level_start; HYPRE_Int addlvl; HYPRE_Int additive; HYPRE_Int mult_additive; HYPRE_Int num_levels; HYPRE_Int num_add_lvls; HYPRE_Int num_procs; HYPRE_Int num_sends, num_recvs; HYPRE_Int num_sends_L = 0; HYPRE_Int num_recvs_L = 0; HYPRE_Int send_data_L = 0; HYPRE_Int num_rows_L = 0; HYPRE_Int num_rows_tmp = 0; HYPRE_Int num_cols_offd_L = 0; HYPRE_Int num_cols_offd = 0; HYPRE_Int level, i, j, k; HYPRE_Int this_proc, cnt, cnt_diag, cnt_offd; HYPRE_Int A_cnt_diag, A_cnt_offd; HYPRE_Int cnt_recv, cnt_send, cnt_row, row_start; HYPRE_Int start_diag, start_offd, indx, cnt_map; HYPRE_Int start, j_indx, index, cnt_level; HYPRE_Int max_sends, max_recvs; HYPRE_Int ns; /* Local variables */ HYPRE_Int Solve_err_flag = 0; HYPRE_Int num_nonzeros_diag; HYPRE_Int num_nonzeros_offd; hypre_Vector **l1_norms_ptr = NULL; /*HYPRE_Real *relax_weight = NULL; HYPRE_Int relax_type; */ HYPRE_Int add_rlx; HYPRE_Int add_last_lvl, add_end; HYPRE_Real add_rlx_wt; /* Acquire data and allocate storage */ A_array = hypre_ParAMGDataAArray(amg_data); F_array = hypre_ParAMGDataFArray(amg_data); U_array = hypre_ParAMGDataUArray(amg_data); additive = hypre_ParAMGDataAdditive(amg_data); mult_additive = hypre_ParAMGDataMultAdditive(amg_data); add_last_lvl = hypre_ParAMGDataAddLastLvl(amg_data); num_levels = hypre_ParAMGDataNumLevels(amg_data); /*relax_weight = hypre_ParAMGDataRelaxWeight(amg_data); relax_type = hypre_ParAMGDataGridRelaxType(amg_data)[1];*/ comm = hypre_ParCSRMatrixComm(A_array[0]); add_rlx = hypre_ParAMGDataAddRelaxType(amg_data); add_rlx_wt = hypre_ParAMGDataAddRelaxWt(amg_data); ns = hypre_ParAMGDataNumGridSweeps(amg_data)[1]; hypre_MPI_Comm_size(comm, &num_procs); l1_norms_ptr = hypre_ParAMGDataL1Norms(amg_data); addlvl = hypre_max(additive, mult_additive); if (add_last_lvl != -1) { add_end = add_last_lvl + 1; } else { add_end = num_levels; } num_add_lvls = add_end + 1 - addlvl; level_start = hypre_CTAlloc(HYPRE_Int, num_add_lvls + 1, HYPRE_MEMORY_HOST); send_data_L = 0; num_rows_L = 0; num_cols_offd_L = 0; num_nonzeros_diag = 0; num_nonzeros_offd = 0; level_start[0] = 0; cnt = 1; max_sends = 0; max_recvs = 0; for (i = addlvl; i < add_end; i++) { A_tmp = A_array[i]; A_tmp_diag = hypre_ParCSRMatrixDiag(A_tmp); A_tmp_offd = hypre_ParCSRMatrixOffd(A_tmp); A_tmp_diag_i = hypre_CSRMatrixI(A_tmp_diag); A_tmp_offd_i = hypre_CSRMatrixI(A_tmp_offd); num_rows_tmp = hypre_CSRMatrixNumRows(A_tmp_diag); num_cols_offd = hypre_CSRMatrixNumCols(A_tmp_offd); num_rows_L += num_rows_tmp; level_start[cnt] = level_start[cnt - 1] + num_rows_tmp; cnt++; num_cols_offd_L += num_cols_offd; num_nonzeros_diag += A_tmp_diag_i[num_rows_tmp]; num_nonzeros_offd += A_tmp_offd_i[num_rows_tmp]; comm_pkg = hypre_ParCSRMatrixCommPkg(A_tmp); if (comm_pkg) { num_sends = hypre_ParCSRCommPkgNumSends(comm_pkg); max_sends += num_sends; if (num_sends) { send_data_L += hypre_ParCSRCommPkgSendMapStart(comm_pkg, num_sends); } max_recvs += hypre_ParCSRCommPkgNumRecvs(comm_pkg); } } if (max_sends >= num_procs || max_recvs >= num_procs) { max_sends = num_procs; max_recvs = num_procs; } if (max_sends) { all_send_procs = hypre_CTAlloc(HYPRE_Int, max_sends, HYPRE_MEMORY_HOST); } if (max_recvs) { all_recv_procs = hypre_CTAlloc(HYPRE_Int, max_recvs, HYPRE_MEMORY_HOST); } cnt_send = 0; cnt_recv = 0; if (max_sends || max_recvs) { if (max_sends < num_procs && max_recvs < num_procs) { for (i = addlvl; i < add_end; i++) { A_tmp = A_array[i]; comm_pkg = hypre_ParCSRMatrixCommPkg(A_tmp); if (comm_pkg) { num_sends = hypre_ParCSRCommPkgNumSends(comm_pkg); num_recvs = hypre_ParCSRCommPkgNumRecvs(comm_pkg); send_procs = hypre_ParCSRCommPkgSendProcs(comm_pkg); recv_procs = hypre_ParCSRCommPkgRecvProcs(comm_pkg); for (j = 0; j < num_sends; j++) { all_send_procs[cnt_send++] = send_procs[j]; } for (j = 0; j < num_recvs; j++) { all_recv_procs[cnt_recv++] = recv_procs[j]; } } } if (max_sends) { hypre_qsort0(all_send_procs, 0, max_sends - 1); num_sends_L = 1; this_proc = all_send_procs[0]; for (i = 1; i < max_sends; i++) { if (all_send_procs[i] > this_proc) { this_proc = all_send_procs[i]; all_send_procs[num_sends_L++] = this_proc; } } L_send_procs = hypre_CTAlloc(HYPRE_Int, num_sends_L, HYPRE_MEMORY_HOST); for (j = 0; j < num_sends_L; j++) { L_send_procs[j] = all_send_procs[j]; } hypre_TFree(all_send_procs, HYPRE_MEMORY_HOST); } if (max_recvs) { hypre_qsort0(all_recv_procs, 0, max_recvs - 1); num_recvs_L = 1; this_proc = all_recv_procs[0]; for (i = 1; i < max_recvs; i++) { if (all_recv_procs[i] > this_proc) { this_proc = all_recv_procs[i]; all_recv_procs[num_recvs_L++] = this_proc; } } L_recv_procs = hypre_CTAlloc(HYPRE_Int, num_recvs_L, HYPRE_MEMORY_HOST); for (j = 0; j < num_recvs_L; j++) { L_recv_procs[j] = all_recv_procs[j]; } hypre_TFree(all_recv_procs, HYPRE_MEMORY_HOST); } L_recv_ptr = hypre_CTAlloc(HYPRE_Int, num_recvs_L + 1, HYPRE_MEMORY_HOST); L_send_ptr = hypre_CTAlloc(HYPRE_Int, num_sends_L + 1, HYPRE_MEMORY_HOST); for (i = addlvl; i < add_end; i++) { A_tmp = A_array[i]; comm_pkg = hypre_ParCSRMatrixCommPkg(A_tmp); if (comm_pkg) { num_sends = hypre_ParCSRCommPkgNumSends(comm_pkg); num_recvs = hypre_ParCSRCommPkgNumRecvs(comm_pkg); send_procs = hypre_ParCSRCommPkgSendProcs(comm_pkg); recv_procs = hypre_ParCSRCommPkgRecvProcs(comm_pkg); send_map_starts = hypre_ParCSRCommPkgSendMapStarts(comm_pkg); recv_vec_starts = hypre_ParCSRCommPkgRecvVecStarts(comm_pkg); } else { num_sends = 0; num_recvs = 0; } for (k = 0; k < num_sends; k++) { this_proc = hypre_BinarySearch(L_send_procs, send_procs[k], num_sends_L); L_send_ptr[this_proc + 1] += send_map_starts[k + 1] - send_map_starts[k]; } for (k = 0; k < num_recvs; k++) { this_proc = hypre_BinarySearch(L_recv_procs, recv_procs[k], num_recvs_L); L_recv_ptr[this_proc + 1] += recv_vec_starts[k + 1] - recv_vec_starts[k]; } } L_recv_ptr[0] = 0; for (i = 1; i < num_recvs_L; i++) { L_recv_ptr[i + 1] += L_recv_ptr[i]; } L_send_ptr[0] = 0; for (i = 1; i < num_sends_L; i++) { L_send_ptr[i + 1] += L_send_ptr[i]; } } else { num_recvs_L = 0; num_sends_L = 0; for (i = addlvl; i < add_end; i++) { A_tmp = A_array[i]; comm_pkg = hypre_ParCSRMatrixCommPkg(A_tmp); if (comm_pkg) { num_sends = hypre_ParCSRCommPkgNumSends(comm_pkg); num_recvs = hypre_ParCSRCommPkgNumRecvs(comm_pkg); send_procs = hypre_ParCSRCommPkgSendProcs(comm_pkg); recv_procs = hypre_ParCSRCommPkgRecvProcs(comm_pkg); send_map_starts = hypre_ParCSRCommPkgSendMapStarts(comm_pkg); recv_vec_starts = hypre_ParCSRCommPkgRecvVecStarts(comm_pkg); for (j = 0; j < num_sends; j++) { this_proc = send_procs[j]; if (all_send_procs[this_proc] == 0) { num_sends_L++; } all_send_procs[this_proc] += send_map_starts[j + 1] - send_map_starts[j]; } for (j = 0; j < num_recvs; j++) { this_proc = recv_procs[j]; if (all_recv_procs[this_proc] == 0) { num_recvs_L++; } all_recv_procs[this_proc] += recv_vec_starts[j + 1] - recv_vec_starts[j]; } } } if (max_sends) { L_send_procs = hypre_CTAlloc(HYPRE_Int, num_sends_L, HYPRE_MEMORY_HOST); L_send_ptr = hypre_CTAlloc(HYPRE_Int, num_sends_L + 1, HYPRE_MEMORY_HOST); num_sends_L = 0; for (j = 0; j < num_procs; j++) { this_proc = all_send_procs[j]; if (this_proc) { L_send_procs[num_sends_L++] = j; L_send_ptr[num_sends_L] = this_proc + L_send_ptr[num_sends_L - 1]; } } } if (max_recvs) { L_recv_procs = hypre_CTAlloc(HYPRE_Int, num_recvs_L, HYPRE_MEMORY_HOST); L_recv_ptr = hypre_CTAlloc(HYPRE_Int, num_recvs_L + 1, HYPRE_MEMORY_HOST); num_recvs_L = 0; for (j = 0; j < num_procs; j++) { this_proc = all_recv_procs[j]; if (this_proc) { L_recv_procs[num_recvs_L++] = j; L_recv_ptr[num_recvs_L] = this_proc + L_recv_ptr[num_recvs_L - 1]; } } } } } if (max_sends) { hypre_TFree(all_send_procs, HYPRE_MEMORY_HOST); } if (max_recvs) { hypre_TFree(all_recv_procs, HYPRE_MEMORY_HOST); } L_diag = hypre_CSRMatrixCreate(num_rows_L, num_rows_L, num_nonzeros_diag); L_offd = hypre_CSRMatrixCreate(num_rows_L, num_cols_offd_L, num_nonzeros_offd); hypre_CSRMatrixInitialize(L_diag); hypre_CSRMatrixInitialize(L_offd); if (num_nonzeros_diag) { L_diag_data = hypre_CSRMatrixData(L_diag); L_diag_j = hypre_CSRMatrixJ(L_diag); } L_diag_i = hypre_CSRMatrixI(L_diag); if (num_nonzeros_offd) { L_offd_data = hypre_CSRMatrixData(L_offd); L_offd_j = hypre_CSRMatrixJ(L_offd); } L_offd_i = hypre_CSRMatrixI(L_offd); if (ns > 1) { Atilde_diag = hypre_CSRMatrixCreate(num_rows_L, num_rows_L, num_nonzeros_diag); Atilde_offd = hypre_CSRMatrixCreate(num_rows_L, num_cols_offd_L, num_nonzeros_offd); hypre_CSRMatrixInitialize(Atilde_diag); hypre_CSRMatrixInitialize(Atilde_offd); if (num_nonzeros_diag) { Atilde_diag_data = hypre_CSRMatrixData(Atilde_diag); Atilde_diag_j = hypre_CSRMatrixJ(Atilde_diag); } Atilde_diag_i = hypre_CSRMatrixI(Atilde_diag); if (num_nonzeros_offd) { Atilde_offd_data = hypre_CSRMatrixData(Atilde_offd); Atilde_offd_j = hypre_CSRMatrixJ(Atilde_offd); } Atilde_offd_i = hypre_CSRMatrixI(Atilde_offd); } if (num_rows_L) { D_data = hypre_CTAlloc(HYPRE_Real, num_rows_L, HYPRE_MEMORY_HOST); } if (send_data_L) { L_send_map_elmts = hypre_CTAlloc(HYPRE_Int, send_data_L, HYPRE_MEMORY_HOST); buf_data = hypre_CTAlloc(HYPRE_Real, send_data_L, HYPRE_MEMORY_HOST); } if (num_cols_offd_L) { D_data_offd = hypre_CTAlloc(HYPRE_Real, num_cols_offd_L, HYPRE_MEMORY_HOST); /*L_col_map_offd = hypre_CTAlloc(HYPRE_Int, num_cols_offd_L);*/ remap = hypre_CTAlloc(HYPRE_Int, num_cols_offd_L, HYPRE_MEMORY_HOST); } Rtilde = hypre_CTAlloc(hypre_ParVector, 1, HYPRE_MEMORY_HOST); Rtilde_local = hypre_SeqVectorCreate(num_rows_L); hypre_SeqVectorInitialize(Rtilde_local); hypre_ParVectorLocalVector(Rtilde) = Rtilde_local; hypre_ParVectorOwnsData(Rtilde) = 1; Xtilde = hypre_CTAlloc(hypre_ParVector, 1, HYPRE_MEMORY_HOST); Xtilde_local = hypre_SeqVectorCreate(num_rows_L); hypre_SeqVectorInitialize(Xtilde_local); hypre_ParVectorLocalVector(Xtilde) = Xtilde_local; hypre_ParVectorOwnsData(Xtilde) = 1; x_data = hypre_VectorData(hypre_ParVectorLocalVector(Xtilde)); r_data = hypre_VectorData(hypre_ParVectorLocalVector(Rtilde)); cnt = 0; cnt_level = 0; cnt_diag = 0; cnt_offd = 0; cnt_row = 1; L_diag_i[0] = 0; L_offd_i[0] = 0; if (ns > 1) { A_cnt_diag = 0; A_cnt_offd = 0; Atilde_diag_i[0] = 0; Atilde_offd_i[0] = 0; } for (level = addlvl; level < add_end; level++) { row_start = level_start[cnt_level]; if (level != 0) { tmp_data = hypre_VectorData(hypre_ParVectorLocalVector(F_array[level])); if (tmp_data) { hypre_TFree(tmp_data, hypre_VectorMemoryLocation(hypre_ParVectorLocalVector(F_array[level]))); } hypre_VectorData(hypre_ParVectorLocalVector(F_array[level])) = &r_data[row_start]; hypre_VectorOwnsData(hypre_ParVectorLocalVector(F_array[level])) = 0; tmp_data = hypre_VectorData(hypre_ParVectorLocalVector(U_array[level])); if (tmp_data) { hypre_TFree(tmp_data, hypre_VectorMemoryLocation(hypre_ParVectorLocalVector(U_array[level]))); } hypre_VectorData(hypre_ParVectorLocalVector(U_array[level])) = &x_data[row_start]; hypre_VectorOwnsData(hypre_ParVectorLocalVector(U_array[level])) = 0; } cnt_level++; start_diag = L_diag_i[cnt_row - 1]; start_offd = L_offd_i[cnt_row - 1]; A_tmp = A_array[level]; A_tmp_diag = hypre_ParCSRMatrixDiag(A_tmp); A_tmp_offd = hypre_ParCSRMatrixOffd(A_tmp); comm_pkg = hypre_ParCSRMatrixCommPkg(A_tmp); A_tmp_diag_i = hypre_CSRMatrixI(A_tmp_diag); A_tmp_offd_i = hypre_CSRMatrixI(A_tmp_offd); A_tmp_diag_j = hypre_CSRMatrixJ(A_tmp_diag); A_tmp_offd_j = hypre_CSRMatrixJ(A_tmp_offd); A_tmp_diag_data = hypre_CSRMatrixData(A_tmp_diag); A_tmp_offd_data = hypre_CSRMatrixData(A_tmp_offd); num_rows_tmp = hypre_CSRMatrixNumRows(A_tmp_diag); if (comm_pkg) { num_sends = hypre_ParCSRCommPkgNumSends(comm_pkg); num_recvs = hypre_ParCSRCommPkgNumRecvs(comm_pkg); send_procs = hypre_ParCSRCommPkgSendProcs(comm_pkg); recv_procs = hypre_ParCSRCommPkgRecvProcs(comm_pkg); send_map_starts = hypre_ParCSRCommPkgSendMapStarts(comm_pkg); send_map_elmts = hypre_ParCSRCommPkgSendMapElmts(comm_pkg); recv_vec_starts = hypre_ParCSRCommPkgRecvVecStarts(comm_pkg); } else { num_sends = 0; num_recvs = 0; } /* Compute new combined communication package */ for (i = 0; i < num_sends; i++) { this_proc = hypre_BinarySearch(L_send_procs, send_procs[i], num_sends_L); indx = L_send_ptr[this_proc]; for (j = send_map_starts[i]; j < send_map_starts[i + 1]; j++) { L_send_map_elmts[indx++] = row_start + send_map_elmts[j]; } L_send_ptr[this_proc] = indx; } cnt_map = 0; for (i = 0; i < num_recvs; i++) { this_proc = hypre_BinarySearch(L_recv_procs, recv_procs[i], num_recvs_L); indx = L_recv_ptr[this_proc]; for (j = recv_vec_starts[i]; j < recv_vec_starts[i + 1]; j++) { remap[cnt_map++] = indx++; } L_recv_ptr[this_proc] = indx; } /* Compute Lambda */ if (add_rlx == 0) { /*HYPRE_Real rlx_wt = relax_weight[level];*/ #ifdef HYPRE_USING_OPENMP #pragma omp for private(i) HYPRE_SMP_SCHEDULE #endif for (i = 0; i < num_rows_tmp; i++) { D_data[i] = add_rlx_wt / A_tmp_diag_data[A_tmp_diag_i[i]]; L_diag_i[cnt_row + i] = start_diag + A_tmp_diag_i[i + 1]; L_offd_i[cnt_row + i] = start_offd + A_tmp_offd_i[i + 1]; } if (ns > 1) for (i = 0; i < num_rows_tmp; i++) { Atilde_diag_i[cnt_row + i] = start_diag + A_tmp_diag_i[i + 1]; Atilde_offd_i[cnt_row + i] = start_offd + A_tmp_offd_i[i + 1]; } } else { l1_norms = l1_norms_ptr[level]; #ifdef HYPRE_USING_OPENMP #pragma omp for private(i) HYPRE_SMP_SCHEDULE #endif for (i = 0; i < num_rows_tmp; i++) { D_data[i] = 1.0 / hypre_VectorData(l1_norms)[i]; L_diag_i[cnt_row + i] = start_diag + A_tmp_diag_i[i + 1]; L_offd_i[cnt_row + i] = start_offd + A_tmp_offd_i[i + 1]; } if (ns > 1) { for (i = 0; i < num_rows_tmp; i++) { Atilde_diag_i[cnt_row + i] = start_diag + A_tmp_diag_i[i + 1]; Atilde_offd_i[cnt_row + i] = start_offd + A_tmp_offd_i[i + 1]; } } } if (num_procs > 1) { index = 0; for (i = 0; i < num_sends; i++) { start = send_map_starts[i]; for (j = start; j < send_map_starts[i + 1]; j++) { buf_data[index++] = D_data[send_map_elmts[j]]; } } comm_handle = hypre_ParCSRCommHandleCreate(1, comm_pkg, buf_data, D_data_offd); hypre_ParCSRCommHandleDestroy(comm_handle); } for (i = 0; i < num_rows_tmp; i++) { j_indx = A_tmp_diag_i[i]; if (ns > 1) { Atilde_diag_data[A_cnt_diag] = A_tmp_diag_data[j_indx]; Atilde_diag_j[A_cnt_diag++] = i + row_start; } L_diag_data[cnt_diag] = (2.0 - A_tmp_diag_data[j_indx] * D_data[i]) * D_data[i]; L_diag_j[cnt_diag++] = i + row_start; for (j = A_tmp_diag_i[i] + 1; j < A_tmp_diag_i[i + 1]; j++) { j_indx = A_tmp_diag_j[j]; L_diag_data[cnt_diag] = (- A_tmp_diag_data[j] * D_data[j_indx]) * D_data[i]; L_diag_j[cnt_diag++] = j_indx + row_start; } for (j = A_tmp_offd_i[i]; j < A_tmp_offd_i[i + 1]; j++) { j_indx = A_tmp_offd_j[j]; L_offd_data[cnt_offd] = (- A_tmp_offd_data[j] * D_data_offd[j_indx]) * D_data[i]; L_offd_j[cnt_offd++] = remap[j_indx]; } if (ns > 1) { for (j = A_tmp_diag_i[i] + 1; j < A_tmp_diag_i[i + 1]; j++) { j_indx = A_tmp_diag_j[j]; Atilde_diag_data[A_cnt_diag] = A_tmp_diag_data[j]; Atilde_diag_j[A_cnt_diag++] = j_indx + row_start; } for (j = A_tmp_offd_i[i]; j < A_tmp_offd_i[i + 1]; j++) { j_indx = A_tmp_offd_j[j]; Atilde_offd_data[A_cnt_offd] = A_tmp_offd_data[j]; Atilde_offd_j[A_cnt_offd++] = remap[j_indx]; } } } cnt_row += num_rows_tmp; } if (L_send_ptr) { for (i = num_sends_L - 1; i > 0; i--) { L_send_ptr[i] = L_send_ptr[i - 1]; } L_send_ptr[0] = 0; } else { L_send_ptr = hypre_CTAlloc(HYPRE_Int, 1, HYPRE_MEMORY_HOST); } if (L_recv_ptr) { for (i = num_recvs_L - 1; i > 0; i--) { L_recv_ptr[i] = L_recv_ptr[i - 1]; } L_recv_ptr[0] = 0; } else { L_recv_ptr = hypre_CTAlloc(HYPRE_Int, 1, HYPRE_MEMORY_HOST); } /* Create and fill communication package */ hypre_ParCSRCommPkgCreateAndFill(comm, num_recvs_L, L_recv_procs, L_recv_ptr, num_sends_L, L_send_procs, L_send_ptr, L_send_map_elmts, &L_comm_pkg); Lambda = hypre_CTAlloc(hypre_ParCSRMatrix, 1, HYPRE_MEMORY_HOST); hypre_ParCSRMatrixDiag(Lambda) = L_diag; hypre_ParCSRMatrixOffd(Lambda) = L_offd; hypre_ParCSRMatrixCommPkg(Lambda) = L_comm_pkg; hypre_ParCSRMatrixComm(Lambda) = comm; hypre_ParCSRMatrixOwnsData(Lambda) = 1; if (ns > 1) { Atilde = hypre_CTAlloc(hypre_ParCSRMatrix, 1, HYPRE_MEMORY_HOST); hypre_ParCSRMatrixDiag(Atilde) = Atilde_diag; hypre_ParCSRMatrixOffd(Atilde) = Atilde_offd; hypre_ParCSRMatrixCommPkg(Atilde) = L_comm_pkg; hypre_ParCSRMatrixComm(Atilde) = comm; hypre_ParCSRMatrixOwnsData(Atilde) = 1; hypre_ParAMGDataAtilde(amg_data) = Atilde; } hypre_ParAMGDataLambda(amg_data) = Lambda; hypre_ParAMGDataRtilde(amg_data) = Rtilde; hypre_ParAMGDataXtilde(amg_data) = Xtilde; hypre_TFree(D_data_offd, HYPRE_MEMORY_HOST); hypre_TFree(D_data, HYPRE_MEMORY_HOST); if (num_procs > 1) { hypre_TFree(buf_data, HYPRE_MEMORY_HOST); } hypre_TFree(remap, HYPRE_MEMORY_HOST); hypre_TFree(buf_data, HYPRE_MEMORY_HOST); hypre_TFree(level_start, HYPRE_MEMORY_HOST); return Solve_err_flag; } HYPRE_Int hypre_CreateDinv(void *amg_vdata) { hypre_ParAMGData *amg_data = (hypre_ParAMGData*) amg_vdata; /* Data Structure variables */ hypre_ParCSRMatrix **A_array; hypre_ParVector **F_array; hypre_ParVector **U_array; hypre_ParCSRMatrix *A_tmp; hypre_CSRMatrix *A_tmp_diag; hypre_ParVector *Xtilde; hypre_ParVector *Rtilde; hypre_Vector *Xtilde_local; hypre_Vector *Rtilde_local; HYPRE_Real *x_data; HYPRE_Real *r_data; HYPRE_Real *tmp_data; HYPRE_Real *D_inv = NULL; /*HYPRE_Real *relax_weight = NULL; HYPRE_Real relax_type;*/ HYPRE_Int addlvl; HYPRE_Int num_levels; HYPRE_Int num_rows_L; HYPRE_Int num_rows_tmp; HYPRE_Int level, i; HYPRE_Int add_rlx; HYPRE_Real add_rlx_wt; HYPRE_Int add_last_lvl, add_end; /* Local variables */ HYPRE_Int Solve_err_flag = 0; hypre_Vector **l1_norms_ptr = NULL; hypre_Vector *l1_norms; HYPRE_Int l1_start; /* Acquire data and allocate storage */ A_array = hypre_ParAMGDataAArray(amg_data); F_array = hypre_ParAMGDataFArray(amg_data); U_array = hypre_ParAMGDataUArray(amg_data); addlvl = hypre_ParAMGDataSimple(amg_data); num_levels = hypre_ParAMGDataNumLevels(amg_data); add_rlx_wt = hypre_ParAMGDataAddRelaxWt(amg_data); add_rlx = hypre_ParAMGDataAddRelaxType(amg_data); add_last_lvl = hypre_ParAMGDataAddLastLvl(amg_data); /*relax_weight = hypre_ParAMGDataRelaxWeight(amg_data); relax_type = hypre_ParAMGDataGridRelaxType(amg_data)[1];*/ l1_norms_ptr = hypre_ParAMGDataL1Norms(amg_data); /* smooth_option = hypre_ParAMGDataSmoothOption(amg_data); */ if (add_last_lvl == -1 ) { add_end = num_levels; } else { add_end = add_last_lvl; } num_rows_L = 0; for (i = addlvl; i < add_end; i++) { A_tmp = A_array[i]; A_tmp_diag = hypre_ParCSRMatrixDiag(A_tmp); num_rows_tmp = hypre_CSRMatrixNumRows(A_tmp_diag); num_rows_L += num_rows_tmp; } Rtilde = hypre_CTAlloc(hypre_ParVector, 1, HYPRE_MEMORY_HOST); Rtilde_local = hypre_SeqVectorCreate(num_rows_L); hypre_SeqVectorInitialize(Rtilde_local); hypre_ParVectorLocalVector(Rtilde) = Rtilde_local; hypre_ParVectorOwnsData(Rtilde) = 1; Xtilde = hypre_CTAlloc(hypre_ParVector, 1, HYPRE_MEMORY_HOST); Xtilde_local = hypre_SeqVectorCreate(num_rows_L); hypre_SeqVectorInitialize(Xtilde_local); hypre_ParVectorLocalVector(Xtilde) = Xtilde_local; hypre_ParVectorOwnsData(Xtilde) = 1; x_data = hypre_VectorData(hypre_ParVectorLocalVector(Xtilde)); r_data = hypre_VectorData(hypre_ParVectorLocalVector(Rtilde)); D_inv = hypre_CTAlloc(HYPRE_Real, num_rows_L, HYPRE_MEMORY_HOST); l1_start = 0; for (level = addlvl; level < add_end; level++) { if (level != 0) { tmp_data = hypre_VectorData(hypre_ParVectorLocalVector(F_array[level])); if (tmp_data) { hypre_TFree(tmp_data, hypre_VectorMemoryLocation(hypre_ParVectorLocalVector(F_array[level]))); } hypre_VectorData(hypre_ParVectorLocalVector(F_array[level])) = &r_data[l1_start]; hypre_VectorOwnsData(hypre_ParVectorLocalVector(F_array[level])) = 0; tmp_data = hypre_VectorData(hypre_ParVectorLocalVector(U_array[level])); if (tmp_data) { hypre_TFree(tmp_data, hypre_VectorMemoryLocation(hypre_ParVectorLocalVector(U_array[level]))); } hypre_VectorData(hypre_ParVectorLocalVector(U_array[level])) = &x_data[l1_start]; hypre_VectorOwnsData(hypre_ParVectorLocalVector(U_array[level])) = 0; } A_tmp = A_array[level]; A_tmp_diag = hypre_ParCSRMatrixDiag(A_tmp); num_rows_tmp = hypre_CSRMatrixNumRows(A_tmp_diag); if (add_rlx == 0) { /*HYPRE_Real rlx_wt = relax_weight[level];*/ HYPRE_Int *A_tmp_diag_i = hypre_CSRMatrixI(A_tmp_diag); HYPRE_Real *A_tmp_diag_data = hypre_CSRMatrixData(A_tmp_diag); #ifdef HYPRE_USING_OPENMP #pragma omp for private(i) HYPRE_SMP_SCHEDULE #endif for (i = 0; i < num_rows_tmp; i++) { D_inv[l1_start + i] = add_rlx_wt / A_tmp_diag_data[A_tmp_diag_i[i]]; } } else { l1_norms = l1_norms_ptr[level]; #ifdef HYPRE_USING_OPENMP #pragma omp for private(i) HYPRE_SMP_SCHEDULE #endif for (i = 0; i < num_rows_tmp; i++) { D_inv[l1_start + i] = 1.0 / hypre_VectorData(l1_norms)[i]; } } l1_start += num_rows_tmp; } hypre_ParAMGDataDinv(amg_data) = D_inv; hypre_ParAMGDataRtilde(amg_data) = Rtilde; hypre_ParAMGDataXtilde(amg_data) = Xtilde; return Solve_err_flag; } hypre-2.33.0/src/parcsr_ls/par_amg.c000066400000000000000000004132451477326011500172760ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * ParAMG functions * *****************************************************************************/ #include "_hypre_parcsr_ls.h" /*-------------------------------------------------------------------------- * hypre_BoomerAMGCreate *--------------------------------------------------------------------------*/ void * hypre_BoomerAMGCreate( void ) { hypre_ParAMGData *amg_data; hypre_Solver *base; /* setup params */ HYPRE_Int max_levels; HYPRE_Int max_coarse_size; HYPRE_Int min_coarse_size; HYPRE_Int coarsen_cut_factor; HYPRE_Real strong_threshold; HYPRE_Real strong_threshold_R; HYPRE_Real filter_threshold_R; HYPRE_Int Sabs; HYPRE_Real max_row_sum; HYPRE_Real trunc_factor; HYPRE_Real agg_trunc_factor; HYPRE_Real agg_P12_trunc_factor; HYPRE_Real jacobi_trunc_threshold; HYPRE_Real CR_rate; HYPRE_Real CR_strong_th; HYPRE_Real A_drop_tol; HYPRE_Int A_drop_type; HYPRE_Int interp_type; HYPRE_Int sep_weight; HYPRE_Int coarsen_type; HYPRE_Int measure_type; HYPRE_Int setup_type; HYPRE_Int P_max_elmts; HYPRE_Int num_functions; HYPRE_Int filter_functions; HYPRE_Int nodal, nodal_levels, nodal_diag; HYPRE_Int keep_same_sign; HYPRE_Int num_paths; HYPRE_Int agg_num_levels; HYPRE_Int agg_interp_type; HYPRE_Int agg_P_max_elmts; HYPRE_Int agg_P12_max_elmts; HYPRE_Int post_interp_type; HYPRE_Int num_CR_relax_steps; HYPRE_Int IS_type; HYPRE_Int CR_use_CG; HYPRE_Int cgc_its; HYPRE_Int seq_threshold; HYPRE_Int redundant; HYPRE_Int rap2; HYPRE_Int keepT; HYPRE_Int modu_rap; /* solve params */ HYPRE_Int min_iter; HYPRE_Int max_iter; HYPRE_Int fcycle; HYPRE_Int cycle_type; HYPRE_Int converge_type; HYPRE_Real tol; HYPRE_Int num_sweeps; HYPRE_Int relax_down; HYPRE_Int relax_up; HYPRE_Int relax_coarse; HYPRE_Int relax_order; HYPRE_Real relax_wt; HYPRE_Real outer_wt; HYPRE_Real nongalerkin_tol; HYPRE_Int smooth_type; HYPRE_Int smooth_num_levels; HYPRE_Int smooth_num_sweeps; HYPRE_Int variant, overlap, domain_type, schwarz_use_nonsymm; HYPRE_Real schwarz_rlx_weight; HYPRE_Int level, sym; HYPRE_Int eu_level, eu_bj; HYPRE_Int max_nz_per_row; HYPRE_Real thresh, filter; HYPRE_Real drop_tol; HYPRE_Real eu_sparse_A; char *euclidfile; HYPRE_Int ilu_lfil; HYPRE_Int ilu_type; HYPRE_Int ilu_max_row_nnz; HYPRE_Int ilu_max_iter; HYPRE_Real ilu_droptol; HYPRE_Int ilu_tri_solve; HYPRE_Int ilu_lower_jacobi_iters; HYPRE_Int ilu_upper_jacobi_iters; HYPRE_Int ilu_reordering_type; HYPRE_Int ilu_iter_setup_type; HYPRE_Int ilu_iter_setup_option; HYPRE_Int ilu_iter_setup_max_iter; HYPRE_Real ilu_iter_setup_tolerance; HYPRE_Int fsai_algo_type; HYPRE_Int fsai_local_solve_type; HYPRE_Int fsai_max_steps; HYPRE_Int fsai_max_step_size; HYPRE_Int fsai_max_nnz_row; HYPRE_Int fsai_num_levels; HYPRE_Real fsai_threshold; HYPRE_Int fsai_eig_maxiter; HYPRE_Real fsai_kap_tolerance; HYPRE_Int cheby_order; HYPRE_Int cheby_eig_est; HYPRE_Int cheby_variant; HYPRE_Int cheby_scale; HYPRE_Real cheby_eig_ratio; HYPRE_Int block_mode; HYPRE_Int additive; HYPRE_Int mult_additive; HYPRE_Int simple; HYPRE_Int add_last_lvl; HYPRE_Real add_trunc_factor; HYPRE_Int add_P_max_elmts; HYPRE_Int add_rlx_type; HYPRE_Real add_rlx_wt; /* log info */ HYPRE_Int num_iterations; HYPRE_Int cum_num_iterations; HYPRE_Real cum_nnz_AP; /* output params */ HYPRE_Int print_level; HYPRE_Int logging; /* HYPRE_Int cycle_op_count; */ char log_file_name[256]; HYPRE_Int debug_flag; char plot_file_name[251] = {0}; HYPRE_MemoryLocation memory_location = hypre_HandleMemoryLocation(hypre_handle()); /*----------------------------------------------------------------------- * Setup default values for parameters *-----------------------------------------------------------------------*/ /* setup params */ max_levels = 25; max_coarse_size = 9; min_coarse_size = 0; seq_threshold = 0; redundant = 0; coarsen_cut_factor = 0; strong_threshold = 0.25; strong_threshold_R = 0.25; filter_threshold_R = 0.0; Sabs = 0; max_row_sum = 0.9; trunc_factor = 0.0; agg_trunc_factor = 0.0; agg_P12_trunc_factor = 0.0; jacobi_trunc_threshold = 0.01; sep_weight = 0; coarsen_type = 10; interp_type = 6; measure_type = 0; setup_type = 1; P_max_elmts = 4; agg_P_max_elmts = 0; agg_P12_max_elmts = 0; num_functions = 1; filter_functions = 0; nodal = 0; nodal_levels = max_levels; nodal_diag = 0; keep_same_sign = 0; num_paths = 1; agg_num_levels = 0; post_interp_type = 0; agg_interp_type = 4; num_CR_relax_steps = 2; CR_rate = 0.7; CR_strong_th = 0; A_drop_tol = 0.0; A_drop_type = -1; IS_type = 1; CR_use_CG = 0; cgc_its = 1; variant = 0; overlap = 1; domain_type = 2; schwarz_rlx_weight = 1.0; smooth_num_sweeps = 1; smooth_num_levels = 0; smooth_type = 6; schwarz_use_nonsymm = 0; level = 1; sym = 0; thresh = 0.1; filter = 0.05; drop_tol = 0.0001; max_nz_per_row = 20; euclidfile = NULL; eu_level = 0; eu_sparse_A = 0.0; eu_bj = 0; ilu_lfil = 0; ilu_type = 0; ilu_max_row_nnz = 20; ilu_max_iter = 1; ilu_droptol = 0.01; ilu_tri_solve = 1; ilu_lower_jacobi_iters = 5; ilu_upper_jacobi_iters = 5; ilu_reordering_type = 1; ilu_iter_setup_type = 0; ilu_iter_setup_option = 10; ilu_iter_setup_max_iter = 20; ilu_iter_setup_tolerance = 1.e-3; /* FSAI smoother params */ #if defined (HYPRE_USING_CUDA) || defined (HYPRE_USING_HIP) if (hypre_GetExecPolicy1(memory_location) == HYPRE_EXEC_DEVICE) { fsai_algo_type = 3; } else #endif { fsai_algo_type = hypre_NumThreads() > 4 ? 2 : 1; } fsai_local_solve_type = 0; fsai_max_steps = 4; fsai_max_step_size = 2; fsai_max_nnz_row = 8; fsai_num_levels = 1; fsai_threshold = 0.01; fsai_eig_maxiter = 5; fsai_kap_tolerance = 0.001; /* solve params */ min_iter = 0; max_iter = 20; fcycle = 0; cycle_type = 1; converge_type = 0; tol = 1.0e-6; num_sweeps = 1; relax_down = 13; relax_up = 14; relax_coarse = 9; relax_order = 0; relax_wt = 1.0; outer_wt = 1.0; cheby_order = 2; cheby_variant = 0; cheby_scale = 1; cheby_eig_est = 10; cheby_eig_ratio = .3; block_mode = 0; additive = -1; mult_additive = -1; simple = -1; add_last_lvl = -1; add_trunc_factor = 0.0; add_P_max_elmts = 0; add_rlx_type = 18; add_rlx_wt = 1.0; /* log info */ num_iterations = 0; cum_num_iterations = 0; cum_nnz_AP = -1.0; /* output params */ print_level = 0; logging = 0; hypre_sprintf(log_file_name, "%s", "amg.out.log"); /* cycle_op_count = 0; */ debug_flag = 0; nongalerkin_tol = 0.0; rap2 = 0; keepT = 0; modu_rap = 0; if (hypre_GetExecPolicy1(memory_location) == HYPRE_EXEC_DEVICE) { keepT = 1; modu_rap = 1; coarsen_type = 8; relax_down = 18; relax_up = 18; agg_interp_type = 7; } HYPRE_ANNOTATE_FUNC_BEGIN; /*----------------------------------------------------------------------- * Create the hypre_ParAMGData structure and return *-----------------------------------------------------------------------*/ amg_data = hypre_CTAlloc(hypre_ParAMGData, 1, HYPRE_MEMORY_HOST); base = (hypre_Solver*) amg_data; /* Set base solver function pointers */ hypre_SolverSetup(base) = (HYPRE_PtrToSolverFcn) HYPRE_BoomerAMGSetup; hypre_SolverSolve(base) = (HYPRE_PtrToSolverFcn) HYPRE_BoomerAMGSolve; hypre_SolverDestroy(base) = (HYPRE_PtrToDestroyFcn) HYPRE_BoomerAMGDestroy; /* memory location will be reset at the setup */ hypre_ParAMGDataMemoryLocation(amg_data) = memory_location; hypre_ParAMGDataPartialCycleCoarsestLevel(amg_data) = -1; hypre_ParAMGDataPartialCycleControl(amg_data) = -1; hypre_ParAMGDataMaxLevels(amg_data) = max_levels; hypre_ParAMGDataUserCoarseRelaxType(amg_data) = 9; hypre_ParAMGDataUserRelaxType(amg_data) = -1; hypre_ParAMGDataUserNumSweeps(amg_data) = -1; hypre_ParAMGDataUserRelaxWeight(amg_data) = relax_wt; hypre_ParAMGDataOuterWt(amg_data) = outer_wt; hypre_BoomerAMGSetMaxCoarseSize(amg_data, max_coarse_size); hypre_BoomerAMGSetMinCoarseSize(amg_data, min_coarse_size); hypre_BoomerAMGSetCoarsenCutFactor(amg_data, coarsen_cut_factor); hypre_BoomerAMGSetStrongThreshold(amg_data, strong_threshold); hypre_BoomerAMGSetStrongThresholdR(amg_data, strong_threshold_R); hypre_BoomerAMGSetFilterThresholdR(amg_data, filter_threshold_R); hypre_BoomerAMGSetSabs(amg_data, Sabs); hypre_BoomerAMGSetMaxRowSum(amg_data, max_row_sum); hypre_BoomerAMGSetTruncFactor(amg_data, trunc_factor); hypre_BoomerAMGSetAggTruncFactor(amg_data, agg_trunc_factor); hypre_BoomerAMGSetAggP12TruncFactor(amg_data, agg_P12_trunc_factor); hypre_BoomerAMGSetJacobiTruncThreshold(amg_data, jacobi_trunc_threshold); hypre_BoomerAMGSetSepWeight(amg_data, sep_weight); hypre_BoomerAMGSetMeasureType(amg_data, measure_type); hypre_BoomerAMGSetCoarsenType(amg_data, coarsen_type); hypre_BoomerAMGSetInterpType(amg_data, interp_type); hypre_BoomerAMGSetSetupType(amg_data, setup_type); hypre_BoomerAMGSetPMaxElmts(amg_data, P_max_elmts); hypre_BoomerAMGSetAggPMaxElmts(amg_data, agg_P_max_elmts); hypre_BoomerAMGSetAggP12MaxElmts(amg_data, agg_P12_max_elmts); hypre_BoomerAMGSetNumFunctions(amg_data, num_functions); hypre_BoomerAMGSetFilterFunctions(amg_data, filter_functions); hypre_BoomerAMGSetNodal(amg_data, nodal); hypre_BoomerAMGSetNodalLevels(amg_data, nodal_levels); hypre_BoomerAMGSetNodal(amg_data, nodal_diag); hypre_BoomerAMGSetKeepSameSign(amg_data, keep_same_sign); hypre_BoomerAMGSetNumPaths(amg_data, num_paths); hypre_BoomerAMGSetAggNumLevels(amg_data, agg_num_levels); hypre_BoomerAMGSetAggInterpType(amg_data, agg_interp_type); hypre_BoomerAMGSetPostInterpType(amg_data, post_interp_type); hypre_BoomerAMGSetNumCRRelaxSteps(amg_data, num_CR_relax_steps); hypre_BoomerAMGSetCRRate(amg_data, CR_rate); hypre_BoomerAMGSetCRStrongTh(amg_data, CR_strong_th); hypre_BoomerAMGSetADropTol(amg_data, A_drop_tol); hypre_BoomerAMGSetADropType(amg_data, A_drop_type); hypre_BoomerAMGSetISType(amg_data, IS_type); hypre_BoomerAMGSetCRUseCG(amg_data, CR_use_CG); hypre_BoomerAMGSetCGCIts(amg_data, cgc_its); hypre_BoomerAMGSetVariant(amg_data, variant); hypre_BoomerAMGSetOverlap(amg_data, overlap); hypre_BoomerAMGSetSchwarzRlxWeight(amg_data, schwarz_rlx_weight); hypre_BoomerAMGSetSchwarzUseNonSymm(amg_data, schwarz_use_nonsymm); hypre_BoomerAMGSetDomainType(amg_data, domain_type); hypre_BoomerAMGSetSym(amg_data, sym); hypre_BoomerAMGSetLevel(amg_data, level); hypre_BoomerAMGSetThreshold(amg_data, thresh); hypre_BoomerAMGSetFilter(amg_data, filter); hypre_BoomerAMGSetDropTol(amg_data, drop_tol); hypre_BoomerAMGSetMaxNzPerRow(amg_data, max_nz_per_row); hypre_BoomerAMGSetEuclidFile(amg_data, euclidfile); hypre_BoomerAMGSetEuLevel(amg_data, eu_level); hypre_BoomerAMGSetEuSparseA(amg_data, eu_sparse_A); hypre_BoomerAMGSetEuBJ(amg_data, eu_bj); hypre_BoomerAMGSetILUType(amg_data, ilu_type); hypre_BoomerAMGSetILULevel(amg_data, ilu_lfil); hypre_BoomerAMGSetILUMaxRowNnz(amg_data, ilu_max_row_nnz); hypre_BoomerAMGSetILUDroptol(amg_data, ilu_droptol); hypre_BoomerAMGSetILUTriSolve(amg_data, ilu_tri_solve); hypre_BoomerAMGSetILULowerJacobiIters(amg_data, ilu_lower_jacobi_iters); hypre_BoomerAMGSetILUUpperJacobiIters(amg_data, ilu_upper_jacobi_iters); hypre_BoomerAMGSetILUMaxIter(amg_data, ilu_max_iter); hypre_BoomerAMGSetILULocalReordering(amg_data, ilu_reordering_type); hypre_BoomerAMGSetILUIterSetupType(amg_data, ilu_iter_setup_type); hypre_BoomerAMGSetILUIterSetupOption(amg_data, ilu_iter_setup_option); hypre_BoomerAMGSetILUIterSetupMaxIter(amg_data, ilu_iter_setup_max_iter); hypre_BoomerAMGSetILUIterSetupTolerance(amg_data, ilu_iter_setup_tolerance); hypre_BoomerAMGSetFSAIAlgoType(amg_data, fsai_algo_type); hypre_BoomerAMGSetFSAILocalSolveType(amg_data, fsai_local_solve_type); hypre_BoomerAMGSetFSAIMaxSteps(amg_data, fsai_max_steps); hypre_BoomerAMGSetFSAIMaxStepSize(amg_data, fsai_max_step_size); hypre_BoomerAMGSetFSAIMaxNnzRow(amg_data, fsai_max_nnz_row); hypre_BoomerAMGSetFSAINumLevels(amg_data, fsai_num_levels); hypre_BoomerAMGSetFSAIThreshold(amg_data, fsai_threshold); hypre_BoomerAMGSetFSAIEigMaxIters(amg_data, fsai_eig_maxiter); hypre_BoomerAMGSetFSAIKapTolerance(amg_data, fsai_kap_tolerance); hypre_BoomerAMGSetMinIter(amg_data, min_iter); hypre_BoomerAMGSetMaxIter(amg_data, max_iter); hypre_BoomerAMGSetCycleType(amg_data, cycle_type); hypre_BoomerAMGSetFCycle(amg_data, fcycle); hypre_BoomerAMGSetConvergeType(amg_data, converge_type); hypre_BoomerAMGSetTol(amg_data, tol); hypre_BoomerAMGSetNumSweeps(amg_data, num_sweeps); hypre_BoomerAMGSetCycleRelaxType(amg_data, relax_down, 1); hypre_BoomerAMGSetCycleRelaxType(amg_data, relax_up, 2); hypre_BoomerAMGSetCycleRelaxType(amg_data, relax_coarse, 3); hypre_BoomerAMGSetRelaxOrder(amg_data, relax_order); hypre_BoomerAMGSetRelaxWt(amg_data, relax_wt); hypre_BoomerAMGSetOuterWt(amg_data, outer_wt); hypre_BoomerAMGSetSmoothType(amg_data, smooth_type); hypre_BoomerAMGSetSmoothNumLevels(amg_data, smooth_num_levels); hypre_BoomerAMGSetSmoothNumSweeps(amg_data, smooth_num_sweeps); hypre_BoomerAMGSetChebyOrder(amg_data, cheby_order); hypre_BoomerAMGSetChebyFraction(amg_data, cheby_eig_ratio); hypre_BoomerAMGSetChebyEigEst(amg_data, cheby_eig_est); hypre_BoomerAMGSetChebyVariant(amg_data, cheby_variant); hypre_BoomerAMGSetChebyScale(amg_data, cheby_scale); hypre_BoomerAMGSetNumIterations(amg_data, num_iterations); hypre_BoomerAMGSetAdditive(amg_data, additive); hypre_BoomerAMGSetMultAdditive(amg_data, mult_additive); hypre_BoomerAMGSetSimple(amg_data, simple); hypre_BoomerAMGSetMultAddPMaxElmts(amg_data, add_P_max_elmts); hypre_BoomerAMGSetMultAddTruncFactor(amg_data, add_trunc_factor); hypre_BoomerAMGSetAddRelaxType(amg_data, add_rlx_type); hypre_BoomerAMGSetAddRelaxWt(amg_data, add_rlx_wt); hypre_ParAMGDataAddLastLvl(amg_data) = add_last_lvl; hypre_ParAMGDataLambda(amg_data) = NULL; hypre_ParAMGDataXtilde(amg_data) = NULL; hypre_ParAMGDataRtilde(amg_data) = NULL; hypre_ParAMGDataDinv(amg_data) = NULL; #ifdef CUMNUMIT hypre_ParAMGDataCumNumIterations(amg_data) = cum_num_iterations; #endif hypre_BoomerAMGSetPrintLevel(amg_data, print_level); hypre_BoomerAMGSetLogging(amg_data, logging); hypre_BoomerAMGSetPrintFileName(amg_data, log_file_name); hypre_BoomerAMGSetDebugFlag(amg_data, debug_flag); hypre_BoomerAMGSetRestriction(amg_data, 0); hypre_BoomerAMGSetIsTriangular(amg_data, 0); hypre_BoomerAMGSetGMRESSwitchR(amg_data, 64); hypre_BoomerAMGSetGSMG(amg_data, 0); hypre_BoomerAMGSetNumSamples(amg_data, 0); hypre_ParAMGDataAArray(amg_data) = NULL; hypre_ParAMGDataPArray(amg_data) = NULL; hypre_ParAMGDataRArray(amg_data) = NULL; hypre_ParAMGDataCFMarkerArray(amg_data) = NULL; hypre_ParAMGDataVtemp(amg_data) = NULL; hypre_ParAMGDataRtemp(amg_data) = NULL; hypre_ParAMGDataPtemp(amg_data) = NULL; hypre_ParAMGDataZtemp(amg_data) = NULL; hypre_ParAMGDataFArray(amg_data) = NULL; hypre_ParAMGDataUArray(amg_data) = NULL; hypre_ParAMGDataDofFunc(amg_data) = NULL; hypre_ParAMGDataDofFuncArray(amg_data) = NULL; hypre_ParAMGDataDofPointArray(amg_data) = NULL; hypre_ParAMGDataDofPointArray(amg_data) = NULL; hypre_ParAMGDataPointDofMapArray(amg_data) = NULL; hypre_ParAMGDataSmoother(amg_data) = NULL; hypre_ParAMGDataL1Norms(amg_data) = NULL; hypre_ParAMGDataABlockArray(amg_data) = NULL; hypre_ParAMGDataPBlockArray(amg_data) = NULL; hypre_ParAMGDataRBlockArray(amg_data) = NULL; /* this can not be set by the user currently */ hypre_ParAMGDataBlockMode(amg_data) = block_mode; /* Stuff for Chebyshev smoothing */ hypre_ParAMGDataMaxEigEst(amg_data) = NULL; hypre_ParAMGDataMinEigEst(amg_data) = NULL; hypre_ParAMGDataChebyDS(amg_data) = NULL; hypre_ParAMGDataChebyCoefs(amg_data) = NULL; /* BM Oct 22, 2006 */ hypre_ParAMGDataPlotGrids(amg_data) = 0; hypre_BoomerAMGSetPlotFileName (amg_data, plot_file_name); /* BM Oct 17, 2006 */ hypre_ParAMGDataCoordDim(amg_data) = 0; hypre_ParAMGDataCoordinates(amg_data) = NULL; /* for fitting vectors for interp */ hypre_BoomerAMGSetInterpVecVariant(amg_data, 0); hypre_BoomerAMGSetInterpVectors(amg_data, 0, NULL); hypre_ParAMGNumLevelsInterpVectors(amg_data) = max_levels; hypre_ParAMGInterpVectorsArray(amg_data) = NULL; hypre_ParAMGInterpVecQMax(amg_data) = 0; hypre_ParAMGInterpVecAbsQTrunc(amg_data) = 0.0; hypre_ParAMGInterpRefine(amg_data) = 0; hypre_ParAMGInterpVecFirstLevel(amg_data) = 0; hypre_ParAMGNumInterpVectors(amg_data) = 0; hypre_ParAMGSmoothInterpVectors(amg_data) = 0; hypre_ParAMGDataExpandPWeights(amg_data) = NULL; /* for redundant coarse grid solve */ hypre_ParAMGDataSeqThreshold(amg_data) = seq_threshold; hypre_ParAMGDataRedundant(amg_data) = redundant; hypre_ParAMGDataCoarseSolver(amg_data) = NULL; hypre_ParAMGDataACoarse(amg_data) = NULL; hypre_ParAMGDataFCoarse(amg_data) = NULL; hypre_ParAMGDataUCoarse(amg_data) = NULL; hypre_ParAMGDataNewComm(amg_data) = hypre_MPI_COMM_NULL; /* for Gaussian elimination coarse grid solve */ hypre_ParAMGDataGSSetup(amg_data) = 0; hypre_ParAMGDataGEMemoryLocation(amg_data) = HYPRE_MEMORY_UNDEFINED; hypre_ParAMGDataCommInfo(amg_data) = NULL; hypre_ParAMGDataAMat(amg_data) = NULL; hypre_ParAMGDataAWork(amg_data) = NULL; hypre_ParAMGDataAPiv(amg_data) = NULL; hypre_ParAMGDataBVec(amg_data) = NULL; hypre_ParAMGDataUVec(amg_data) = NULL; hypre_ParAMGDataNonGalerkinTol(amg_data) = nongalerkin_tol; hypre_ParAMGDataNonGalTolArray(amg_data) = NULL; hypre_ParAMGDataRAP2(amg_data) = rap2; hypre_ParAMGDataKeepTranspose(amg_data) = keepT; hypre_ParAMGDataModularizedMatMat(amg_data) = modu_rap; /* information for preserving indices as coarse grid points */ hypre_ParAMGDataCPointsMarker(amg_data) = NULL; hypre_ParAMGDataCPointsLocalMarker(amg_data) = NULL; hypre_ParAMGDataCPointsLevel(amg_data) = 0; hypre_ParAMGDataNumCPoints(amg_data) = 0; /* information for preserving indices as special fine grid points */ hypre_ParAMGDataIsolatedFPointsMarker(amg_data) = NULL; hypre_ParAMGDataNumIsolatedFPoints(amg_data) = 0; hypre_ParAMGDataCumNnzAP(amg_data) = cum_nnz_AP; #ifdef HYPRE_USING_DSUPERLU hypre_ParAMGDataDSLUThreshold(amg_data) = 0; hypre_ParAMGDataDSLUSolver(amg_data) = NULL; #endif HYPRE_ANNOTATE_FUNC_END; return (void *) amg_data; } /*-------------------------------------------------------------------------- * hypre_BoomerAMGDestroy *--------------------------------------------------------------------------*/ HYPRE_Int hypre_BoomerAMGDestroy( void *data ) { hypre_ParAMGData *amg_data = (hypre_ParAMGData*) data; HYPRE_ANNOTATE_FUNC_BEGIN; if (amg_data) { HYPRE_Int num_levels = hypre_ParAMGDataNumLevels(amg_data); HYPRE_Int smooth_num_levels = hypre_ParAMGDataSmoothNumLevels(amg_data); HYPRE_Solver *smoother = hypre_ParAMGDataSmoother(amg_data); void *amg = hypre_ParAMGDataCoarseSolver(amg_data); MPI_Comm new_comm = hypre_ParAMGDataNewComm(amg_data); HYPRE_Int *grid_relax_type = hypre_ParAMGDataGridRelaxType(amg_data); HYPRE_Int i; HYPRE_MemoryLocation memory_location = hypre_ParAMGDataMemoryLocation(amg_data); #ifdef HYPRE_USING_DSUPERLU // if (hypre_ParAMGDataDSLUThreshold(amg_data) > 0) if (hypre_ParAMGDataDSLUSolver(amg_data) != NULL) { hypre_SLUDistDestroy(hypre_ParAMGDataDSLUSolver(amg_data)); hypre_ParAMGDataDSLUSolver(amg_data) = NULL; } #endif if (hypre_ParAMGDataMaxEigEst(amg_data)) { hypre_TFree(hypre_ParAMGDataMaxEigEst(amg_data), HYPRE_MEMORY_HOST); hypre_ParAMGDataMaxEigEst(amg_data) = NULL; } if (hypre_ParAMGDataMinEigEst(amg_data)) { hypre_TFree(hypre_ParAMGDataMinEigEst(amg_data), HYPRE_MEMORY_HOST); hypre_ParAMGDataMinEigEst(amg_data) = NULL; } if (hypre_ParAMGDataNumGridSweeps(amg_data)) { hypre_TFree(hypre_ParAMGDataNumGridSweeps(amg_data), HYPRE_MEMORY_HOST); hypre_ParAMGDataNumGridSweeps(amg_data) = NULL; } if (grid_relax_type) { HYPRE_Int num_levels = hypre_ParAMGDataNumLevels(amg_data); if (grid_relax_type[1] == 15 || grid_relax_type[3] == 15 ) { if (grid_relax_type[1] == 15) { for (i = 0; i < num_levels; i++) { HYPRE_ParCSRPCGDestroy(smoother[i]); } } if (grid_relax_type[3] == 15 && grid_relax_type[1] != 15) { HYPRE_ParCSRPCGDestroy(smoother[num_levels - 1]); } hypre_TFree(smoother, HYPRE_MEMORY_HOST); } hypre_TFree(hypre_ParAMGDataGridRelaxType(amg_data), HYPRE_MEMORY_HOST); hypre_ParAMGDataGridRelaxType(amg_data) = NULL; } if (hypre_ParAMGDataRelaxWeight(amg_data)) { hypre_TFree(hypre_ParAMGDataRelaxWeight(amg_data), HYPRE_MEMORY_HOST); hypre_ParAMGDataRelaxWeight(amg_data) = NULL; } if (hypre_ParAMGDataOmega(amg_data)) { hypre_TFree(hypre_ParAMGDataOmega(amg_data), HYPRE_MEMORY_HOST); hypre_ParAMGDataOmega(amg_data) = NULL; } if (hypre_ParAMGDataNonGalTolArray(amg_data)) { hypre_TFree(hypre_ParAMGDataNonGalTolArray(amg_data), HYPRE_MEMORY_HOST); hypre_ParAMGDataNonGalTolArray(amg_data) = NULL; } if (hypre_ParAMGDataDofFunc(amg_data)) { hypre_IntArrayDestroy(hypre_ParAMGDataDofFunc(amg_data)); hypre_ParAMGDataDofFunc(amg_data) = NULL; } for (i = 1; i < num_levels; i++) { hypre_ParVectorDestroy(hypre_ParAMGDataFArray(amg_data)[i]); hypre_ParVectorDestroy(hypre_ParAMGDataUArray(amg_data)[i]); if (hypre_ParAMGDataAArray(amg_data)[i]) { hypre_ParCSRMatrixDestroy(hypre_ParAMGDataAArray(amg_data)[i]); } if (hypre_ParAMGDataPArray(amg_data)[i - 1]) { hypre_ParCSRMatrixDestroy(hypre_ParAMGDataPArray(amg_data)[i - 1]); } if (hypre_ParAMGDataRestriction(amg_data)) { if (hypre_ParAMGDataRArray(amg_data)[i - 1]) { hypre_ParCSRMatrixDestroy(hypre_ParAMGDataRArray(amg_data)[i - 1]); } } hypre_IntArrayDestroy(hypre_ParAMGDataCFMarkerArray(amg_data)[i - 1]); /* get rid of any block structures */ if (hypre_ParAMGDataABlockArray(amg_data)[i]) { hypre_ParCSRBlockMatrixDestroy(hypre_ParAMGDataABlockArray(amg_data)[i]); } if (hypre_ParAMGDataPBlockArray(amg_data)[i - 1]) { hypre_ParCSRBlockMatrixDestroy(hypre_ParAMGDataPBlockArray(amg_data)[i - 1]); } /* RL */ if (hypre_ParAMGDataRestriction(amg_data)) { if (hypre_ParAMGDataRBlockArray(amg_data)[i - 1]) { hypre_ParCSRBlockMatrixDestroy(hypre_ParAMGDataRBlockArray(amg_data)[i - 1]); } } } if (hypre_ParAMGDataGridRelaxPoints(amg_data)) { for (i = 0; i < 4; i++) { hypre_TFree(hypre_ParAMGDataGridRelaxPoints(amg_data)[i], HYPRE_MEMORY_HOST); } hypre_TFree(hypre_ParAMGDataGridRelaxPoints(amg_data), HYPRE_MEMORY_HOST); hypre_ParAMGDataGridRelaxPoints(amg_data) = NULL; } hypre_ParCSRMatrixDestroy(hypre_ParAMGDataLambda(amg_data)); if (hypre_ParAMGDataAtilde(amg_data)) { hypre_ParCSRMatrix *Atilde = hypre_ParAMGDataAtilde(amg_data); hypre_CSRMatrixDestroy(hypre_ParCSRMatrixDiag(Atilde)); hypre_CSRMatrixDestroy(hypre_ParCSRMatrixOffd(Atilde)); hypre_TFree(Atilde, HYPRE_MEMORY_HOST); } hypre_ParVectorDestroy(hypre_ParAMGDataXtilde(amg_data)); hypre_ParVectorDestroy(hypre_ParAMGDataRtilde(amg_data)); if (hypre_ParAMGDataL1Norms(amg_data)) { for (i = 0; i < num_levels; i++) { hypre_SeqVectorDestroy(hypre_ParAMGDataL1Norms(amg_data)[i]); } hypre_TFree(hypre_ParAMGDataL1Norms(amg_data), HYPRE_MEMORY_HOST); } if (hypre_ParAMGDataChebyCoefs(amg_data)) { for (i = 0; i < num_levels; i++) { if (hypre_ParAMGDataChebyCoefs(amg_data)[i]) { hypre_TFree(hypre_ParAMGDataChebyCoefs(amg_data)[i], HYPRE_MEMORY_HOST); } } hypre_TFree(hypre_ParAMGDataChebyCoefs(amg_data), HYPRE_MEMORY_HOST); } if (hypre_ParAMGDataChebyDS(amg_data)) { for (i = 0; i < num_levels; i++) { hypre_SeqVectorDestroy(hypre_ParAMGDataChebyDS(amg_data)[i]); } hypre_TFree(hypre_ParAMGDataChebyDS(amg_data), HYPRE_MEMORY_HOST); } hypre_TFree(hypre_ParAMGDataDinv(amg_data), HYPRE_MEMORY_HOST); /* get rid of a fine level block matrix */ if (hypre_ParAMGDataABlockArray(amg_data)) { if (hypre_ParAMGDataABlockArray(amg_data)[0]) { hypre_ParCSRBlockMatrixDestroy(hypre_ParAMGDataABlockArray(amg_data)[0]); } } /* see comments in par_coarsen.c regarding special case for CF_marker */ if (num_levels == 1) { hypre_IntArrayDestroy(hypre_ParAMGDataCFMarkerArray(amg_data)[0]); } hypre_ParVectorDestroy(hypre_ParAMGDataVtemp(amg_data)); hypre_TFree(hypre_ParAMGDataFArray(amg_data), HYPRE_MEMORY_HOST); hypre_TFree(hypre_ParAMGDataUArray(amg_data), HYPRE_MEMORY_HOST); hypre_TFree(hypre_ParAMGDataAArray(amg_data), HYPRE_MEMORY_HOST); hypre_TFree(hypre_ParAMGDataABlockArray(amg_data), HYPRE_MEMORY_HOST); hypre_TFree(hypre_ParAMGDataPBlockArray(amg_data), HYPRE_MEMORY_HOST); hypre_TFree(hypre_ParAMGDataPArray(amg_data), HYPRE_MEMORY_HOST); hypre_TFree(hypre_ParAMGDataCFMarkerArray(amg_data), HYPRE_MEMORY_HOST); hypre_ParVectorDestroy(hypre_ParAMGDataRtemp(amg_data)); hypre_ParVectorDestroy(hypre_ParAMGDataPtemp(amg_data)); hypre_ParVectorDestroy(hypre_ParAMGDataZtemp(amg_data)); if (hypre_ParAMGDataDofFuncArray(amg_data)) { for (i = 1; i < num_levels; i++) { hypre_IntArrayDestroy(hypre_ParAMGDataDofFuncArray(amg_data)[i]); } hypre_TFree(hypre_ParAMGDataDofFuncArray(amg_data), HYPRE_MEMORY_HOST); hypre_ParAMGDataDofFuncArray(amg_data) = NULL; } if (hypre_ParAMGDataRestriction(amg_data)) { hypre_TFree(hypre_ParAMGDataRBlockArray(amg_data), HYPRE_MEMORY_HOST); hypre_TFree(hypre_ParAMGDataRArray(amg_data), HYPRE_MEMORY_HOST); hypre_ParAMGDataRArray(amg_data) = NULL; } if (hypre_ParAMGDataDofPointArray(amg_data)) { for (i = 0; i < num_levels; i++) { hypre_TFree(hypre_ParAMGDataDofPointArray(amg_data)[i], HYPRE_MEMORY_HOST); } hypre_TFree(hypre_ParAMGDataDofPointArray(amg_data), HYPRE_MEMORY_HOST); hypre_ParAMGDataDofPointArray(amg_data) = NULL; } if (hypre_ParAMGDataPointDofMapArray(amg_data)) { for (i = 0; i < num_levels; i++) { hypre_TFree(hypre_ParAMGDataPointDofMapArray(amg_data)[i], HYPRE_MEMORY_HOST); } hypre_TFree(hypre_ParAMGDataPointDofMapArray(amg_data), HYPRE_MEMORY_HOST); hypre_ParAMGDataPointDofMapArray(amg_data) = NULL; } if (smooth_num_levels) { if ( hypre_ParAMGDataSmoothType(amg_data) == 7 || hypre_ParAMGDataSmoothType(amg_data) == 17 ) { for (i = 0; i < smooth_num_levels; i++) { HYPRE_ParCSRPilutDestroy(smoother[i]); } } else if ( hypre_ParAMGDataSmoothType(amg_data) == 8 || hypre_ParAMGDataSmoothType(amg_data) == 18 ) { for (i = 0; i < smooth_num_levels; i++) { HYPRE_ParCSRParaSailsDestroy(smoother[i]); } } else if ( hypre_ParAMGDataSmoothType(amg_data) == 9 || hypre_ParAMGDataSmoothType(amg_data) == 19 ) { for (i = 0; i < smooth_num_levels; i++) { HYPRE_EuclidDestroy(smoother[i]); } } else if ( hypre_ParAMGDataSmoothType(amg_data) == 4 ) { for (i = 0; i < smooth_num_levels; i++) { HYPRE_FSAIDestroy(smoother[i]); } } else if ( hypre_ParAMGDataSmoothType(amg_data) == 5 || hypre_ParAMGDataSmoothType(amg_data) == 15 ) { for (i = 0; i < smooth_num_levels; i++) { HYPRE_ILUDestroy(smoother[i]); } } else if ( hypre_ParAMGDataSmoothType(amg_data) == 6 || hypre_ParAMGDataSmoothType(amg_data) == 16 ) { for (i = 0; i < smooth_num_levels; i++) { HYPRE_SchwarzDestroy(smoother[i]); } } hypre_TFree(hypre_ParAMGDataSmoother(amg_data), HYPRE_MEMORY_HOST); } hypre_ParVectorDestroy(hypre_ParAMGDataResidual(amg_data)); hypre_ParAMGDataResidual(amg_data) = NULL; if ( hypre_ParAMGInterpVecVariant(amg_data) > 0 && hypre_ParAMGNumInterpVectors(amg_data) > 0) { HYPRE_Int num_vecs = hypre_ParAMGNumInterpVectors(amg_data); hypre_ParVector **sm_vecs; HYPRE_Int j, num_il; num_il = hypre_min(hypre_ParAMGNumLevelsInterpVectors(amg_data), num_levels); /* don't destroy lev = 0 - this was user input */ for (i = 1; i < num_il; i++) { sm_vecs = hypre_ParAMGInterpVectorsArray(amg_data)[i]; for (j = 0; j < num_vecs; j++) { hypre_ParVectorDestroy(sm_vecs[j]); } hypre_TFree(sm_vecs, HYPRE_MEMORY_HOST); } hypre_TFree(hypre_ParAMGInterpVectorsArray(amg_data), HYPRE_MEMORY_HOST); } hypre_BoomerAMGDestroy(amg); hypre_ParCSRMatrixDestroy(hypre_ParAMGDataACoarse(amg_data)); hypre_ParVectorDestroy(hypre_ParAMGDataUCoarse(amg_data)); hypre_ParVectorDestroy(hypre_ParAMGDataFCoarse(amg_data)); /* destroy input CF_marker data */ hypre_TFree(hypre_ParAMGDataCPointsMarker(amg_data), memory_location); hypre_TFree(hypre_ParAMGDataCPointsLocalMarker(amg_data), memory_location); hypre_TFree(hypre_ParAMGDataFPointsMarker(amg_data), HYPRE_MEMORY_HOST); hypre_TFree(hypre_ParAMGDataIsolatedFPointsMarker(amg_data), HYPRE_MEMORY_HOST); /* Direct solver for the coarsest level */ #if defined(HYPRE_USING_MAGMA) hypre_TFree(hypre_ParAMGDataAPiv(amg_data), HYPRE_MEMORY_HOST); #else hypre_TFree(hypre_ParAMGDataAPiv(amg_data), hypre_ParAMGDataGEMemoryLocation(amg_data)); #endif hypre_TFree(hypre_ParAMGDataAMat(amg_data), hypre_ParAMGDataGEMemoryLocation(amg_data)); hypre_TFree(hypre_ParAMGDataAWork(amg_data), hypre_ParAMGDataGEMemoryLocation(amg_data)); hypre_TFree(hypre_ParAMGDataBVec(amg_data), hypre_ParAMGDataGEMemoryLocation(amg_data)); hypre_TFree(hypre_ParAMGDataUVec(amg_data), hypre_ParAMGDataGEMemoryLocation(amg_data)); hypre_TFree(hypre_ParAMGDataCommInfo(amg_data), HYPRE_MEMORY_HOST); if (new_comm != hypre_MPI_COMM_NULL) { hypre_MPI_Comm_free(&new_comm); } hypre_TFree(amg_data, HYPRE_MEMORY_HOST); } HYPRE_ANNOTATE_FUNC_END; return hypre_error_flag; } /*-------------------------------------------------------------------------- * Routines to set the setup phase parameters *--------------------------------------------------------------------------*/ HYPRE_Int hypre_BoomerAMGSetRestriction( void *data, HYPRE_Int restr_par ) { hypre_ParAMGData *amg_data = (hypre_ParAMGData*) data; if (!amg_data) { hypre_error_in_arg(1); return hypre_error_flag; } /* RL: currently, only 0: R = P^T * 1: AIR * 2: AIR-2 * 15: a special version of AIR-2 with less communication cost * k(k>=3,k!=15): Neumann AIR of degree k-3 */ if (restr_par < 0) { hypre_error_in_arg(2); return hypre_error_flag; } hypre_ParAMGDataRestriction(amg_data) = restr_par; return hypre_error_flag; } HYPRE_Int hypre_BoomerAMGSetIsTriangular(void *data, HYPRE_Int is_triangular ) { hypre_ParAMGData *amg_data = (hypre_ParAMGData*) data; if (!amg_data) { hypre_error_in_arg(1); return hypre_error_flag; } hypre_ParAMGDataIsTriangular(amg_data) = is_triangular; return hypre_error_flag; } HYPRE_Int hypre_BoomerAMGSetGMRESSwitchR(void *data, HYPRE_Int gmres_switch ) { hypre_ParAMGData *amg_data = (hypre_ParAMGData*) data; if (!amg_data) { hypre_error_in_arg(1); return hypre_error_flag; } hypre_ParAMGDataGMRESSwitchR(amg_data) = gmres_switch; return hypre_error_flag; } HYPRE_Int hypre_BoomerAMGSetMaxLevels( void *data, HYPRE_Int max_levels ) { hypre_ParAMGData *amg_data = (hypre_ParAMGData*) data; HYPRE_Int old_max_levels; if (!amg_data) { hypre_error_in_arg(1); return hypre_error_flag; } if (max_levels < 1) { hypre_error_in_arg(2); return hypre_error_flag; } old_max_levels = hypre_ParAMGDataMaxLevels(amg_data); if (old_max_levels < max_levels) { HYPRE_Real *relax_weight, *omega, *nongal_tol_array; HYPRE_Real relax_wt, outer_wt, nongalerkin_tol; HYPRE_Int i; relax_weight = hypre_ParAMGDataRelaxWeight(amg_data); if (relax_weight) { relax_wt = hypre_ParAMGDataUserRelaxWeight(amg_data); relax_weight = hypre_TReAlloc(relax_weight, HYPRE_Real, max_levels, HYPRE_MEMORY_HOST); for (i = old_max_levels; i < max_levels; i++) { relax_weight[i] = relax_wt; } hypre_ParAMGDataRelaxWeight(amg_data) = relax_weight; } omega = hypre_ParAMGDataOmega(amg_data); if (omega) { outer_wt = hypre_ParAMGDataOuterWt(amg_data); omega = hypre_TReAlloc(omega, HYPRE_Real, max_levels, HYPRE_MEMORY_HOST); for (i = old_max_levels; i < max_levels; i++) { omega[i] = outer_wt; } hypre_ParAMGDataOmega(amg_data) = omega; } nongal_tol_array = hypre_ParAMGDataNonGalTolArray(amg_data); if (nongal_tol_array) { nongalerkin_tol = hypre_ParAMGDataNonGalerkinTol(amg_data); nongal_tol_array = hypre_TReAlloc(nongal_tol_array, HYPRE_Real, max_levels, HYPRE_MEMORY_HOST); for (i = old_max_levels; i < max_levels; i++) { nongal_tol_array[i] = nongalerkin_tol; } hypre_ParAMGDataNonGalTolArray(amg_data) = nongal_tol_array; } } hypre_ParAMGDataMaxLevels(amg_data) = max_levels; return hypre_error_flag; } HYPRE_Int hypre_BoomerAMGGetMaxLevels( void *data, HYPRE_Int * max_levels ) { hypre_ParAMGData *amg_data = (hypre_ParAMGData*) data; if (!amg_data) { hypre_error_in_arg(1); return hypre_error_flag; } *max_levels = hypre_ParAMGDataMaxLevels(amg_data); return hypre_error_flag; } HYPRE_Int hypre_BoomerAMGSetMaxCoarseSize( void *data, HYPRE_Int max_coarse_size ) { hypre_ParAMGData *amg_data = (hypre_ParAMGData*) data; if (!amg_data) { hypre_error_in_arg(1); return hypre_error_flag; } if (max_coarse_size < 1) { hypre_error_in_arg(2); return hypre_error_flag; } hypre_ParAMGDataMaxCoarseSize(amg_data) = max_coarse_size; return hypre_error_flag; } HYPRE_Int hypre_BoomerAMGGetMaxCoarseSize( void *data, HYPRE_Int * max_coarse_size ) { hypre_ParAMGData *amg_data = (hypre_ParAMGData*) data; if (!amg_data) { hypre_error_in_arg(1); return hypre_error_flag; } *max_coarse_size = hypre_ParAMGDataMaxCoarseSize(amg_data); return hypre_error_flag; } HYPRE_Int hypre_BoomerAMGSetMinCoarseSize( void *data, HYPRE_Int min_coarse_size ) { hypre_ParAMGData *amg_data = (hypre_ParAMGData*) data; if (!amg_data) { hypre_error_in_arg(1); return hypre_error_flag; } if (min_coarse_size < 0) { hypre_error_in_arg(2); return hypre_error_flag; } hypre_ParAMGDataMinCoarseSize(amg_data) = min_coarse_size; return hypre_error_flag; } HYPRE_Int hypre_BoomerAMGGetMinCoarseSize( void *data, HYPRE_Int * min_coarse_size ) { hypre_ParAMGData *amg_data = (hypre_ParAMGData*) data; if (!amg_data) { hypre_error_in_arg(1); return hypre_error_flag; } *min_coarse_size = hypre_ParAMGDataMinCoarseSize(amg_data); return hypre_error_flag; } HYPRE_Int hypre_BoomerAMGSetSeqThreshold( void *data, HYPRE_Int seq_threshold ) { hypre_ParAMGData *amg_data = (hypre_ParAMGData*) data; if (!amg_data) { hypre_error_in_arg(1); return hypre_error_flag; } if (seq_threshold < 0) { hypre_error_in_arg(2); return hypre_error_flag; } hypre_ParAMGDataSeqThreshold(amg_data) = seq_threshold; return hypre_error_flag; } HYPRE_Int hypre_BoomerAMGGetSeqThreshold( void *data, HYPRE_Int * seq_threshold ) { hypre_ParAMGData *amg_data = (hypre_ParAMGData*) data; if (!amg_data) { hypre_error_in_arg(1); return hypre_error_flag; } *seq_threshold = hypre_ParAMGDataSeqThreshold(amg_data); return hypre_error_flag; } HYPRE_Int hypre_BoomerAMGSetRedundant( void *data, HYPRE_Int redundant ) { hypre_ParAMGData *amg_data = (hypre_ParAMGData*) data; if (!amg_data) { hypre_error_in_arg(1); return hypre_error_flag; } if (redundant < 0) { hypre_error_in_arg(2); return hypre_error_flag; } hypre_ParAMGDataRedundant(amg_data) = redundant; return hypre_error_flag; } HYPRE_Int hypre_BoomerAMGGetRedundant( void *data, HYPRE_Int * redundant ) { hypre_ParAMGData *amg_data = (hypre_ParAMGData*) data; if (!amg_data) { hypre_error_in_arg(1); return hypre_error_flag; } *redundant = hypre_ParAMGDataRedundant(amg_data); return hypre_error_flag; } HYPRE_Int hypre_BoomerAMGSetCoarsenCutFactor( void *data, HYPRE_Int coarsen_cut_factor ) { hypre_ParAMGData *amg_data = (hypre_ParAMGData*) data; if (!amg_data) { hypre_error_in_arg(1); return hypre_error_flag; } if (coarsen_cut_factor < 0) { hypre_error_in_arg(2); return hypre_error_flag; } hypre_ParAMGDataCoarsenCutFactor(amg_data) = coarsen_cut_factor; return hypre_error_flag; } HYPRE_Int hypre_BoomerAMGGetCoarsenCutFactor( void *data, HYPRE_Int *coarsen_cut_factor ) { hypre_ParAMGData *amg_data = (hypre_ParAMGData*) data; if (!amg_data) { hypre_error_in_arg(1); return hypre_error_flag; } *coarsen_cut_factor = hypre_ParAMGDataCoarsenCutFactor(amg_data); return hypre_error_flag; } HYPRE_Int hypre_BoomerAMGSetStrongThreshold( void *data, HYPRE_Real strong_threshold ) { hypre_ParAMGData *amg_data = (hypre_ParAMGData*) data; if (!amg_data) { hypre_error_in_arg(1); return hypre_error_flag; } if (strong_threshold < 0 || strong_threshold > 1) { hypre_error_in_arg(2); return hypre_error_flag; } hypre_ParAMGDataStrongThreshold(amg_data) = strong_threshold; return hypre_error_flag; } HYPRE_Int hypre_BoomerAMGGetStrongThreshold( void *data, HYPRE_Real * strong_threshold ) { hypre_ParAMGData *amg_data = (hypre_ParAMGData*) data; if (!amg_data) { hypre_error_in_arg(1); return hypre_error_flag; } *strong_threshold = hypre_ParAMGDataStrongThreshold(amg_data); return hypre_error_flag; } HYPRE_Int hypre_BoomerAMGSetStrongThresholdR( void *data, HYPRE_Real strong_threshold ) { hypre_ParAMGData *amg_data = (hypre_ParAMGData*) data; if (!amg_data) { hypre_error_in_arg(1); return hypre_error_flag; } if (strong_threshold < 0 || strong_threshold > 1) { hypre_error_in_arg(2); return hypre_error_flag; } hypre_ParAMGDataStrongThresholdR(amg_data) = strong_threshold; return hypre_error_flag; } HYPRE_Int hypre_BoomerAMGGetStrongThresholdR( void *data, HYPRE_Real *strong_threshold ) { hypre_ParAMGData *amg_data = (hypre_ParAMGData*) data; if (!amg_data) { hypre_error_in_arg(1); return hypre_error_flag; } *strong_threshold = hypre_ParAMGDataStrongThresholdR(amg_data); return hypre_error_flag; } HYPRE_Int hypre_BoomerAMGSetFilterThresholdR( void *data, HYPRE_Real filter_threshold ) { hypre_ParAMGData *amg_data = (hypre_ParAMGData*) data; if (!amg_data) { hypre_error_in_arg(1); return hypre_error_flag; } if (filter_threshold < 0 || filter_threshold > 1) { hypre_error_in_arg(2); return hypre_error_flag; } hypre_ParAMGDataFilterThresholdR(amg_data) = filter_threshold; return hypre_error_flag; } HYPRE_Int hypre_BoomerAMGGetFilterThresholdR( void *data, HYPRE_Real *filter_threshold ) { hypre_ParAMGData *amg_data = (hypre_ParAMGData*) data; if (!amg_data) { hypre_error_in_arg(1); return hypre_error_flag; } *filter_threshold = hypre_ParAMGDataFilterThresholdR(amg_data); return hypre_error_flag; } HYPRE_Int hypre_BoomerAMGSetSabs( void *data, HYPRE_Int Sabs ) { hypre_ParAMGData *amg_data = (hypre_ParAMGData*) data; if (!amg_data) { hypre_error_in_arg(1); return hypre_error_flag; } hypre_ParAMGDataSabs(amg_data) = Sabs != 0; return hypre_error_flag; } HYPRE_Int hypre_BoomerAMGSetMaxRowSum( void *data, HYPRE_Real max_row_sum ) { hypre_ParAMGData *amg_data = (hypre_ParAMGData*) data; if (!amg_data) { hypre_error_in_arg(1); return hypre_error_flag; } if (max_row_sum <= 0 || max_row_sum > 1) { hypre_error_in_arg(2); return hypre_error_flag; } hypre_ParAMGDataMaxRowSum(amg_data) = max_row_sum; return hypre_error_flag; } HYPRE_Int hypre_BoomerAMGGetMaxRowSum( void *data, HYPRE_Real * max_row_sum ) { hypre_ParAMGData *amg_data = (hypre_ParAMGData*) data; if (!amg_data) { hypre_error_in_arg(1); return hypre_error_flag; } *max_row_sum = hypre_ParAMGDataMaxRowSum(amg_data); return hypre_error_flag; } HYPRE_Int hypre_BoomerAMGSetTruncFactor( void *data, HYPRE_Real trunc_factor ) { hypre_ParAMGData *amg_data = (hypre_ParAMGData*) data; if (!amg_data) { hypre_error_in_arg(1); return hypre_error_flag; } if (trunc_factor < 0 || trunc_factor >= 1) { hypre_error_in_arg(2); return hypre_error_flag; } hypre_ParAMGDataTruncFactor(amg_data) = trunc_factor; return hypre_error_flag; } HYPRE_Int hypre_BoomerAMGGetTruncFactor( void *data, HYPRE_Real * trunc_factor ) { hypre_ParAMGData *amg_data = (hypre_ParAMGData*) data; if (!amg_data) { hypre_error_in_arg(1); return hypre_error_flag; } *trunc_factor = hypre_ParAMGDataTruncFactor(amg_data); return hypre_error_flag; } HYPRE_Int hypre_BoomerAMGSetPMaxElmts( void *data, HYPRE_Int P_max_elmts ) { hypre_ParAMGData *amg_data = (hypre_ParAMGData*) data; if (!amg_data) { hypre_error_in_arg(1); return hypre_error_flag; } if (P_max_elmts < 0) { hypre_error_in_arg(2); return hypre_error_flag; } hypre_ParAMGDataPMaxElmts(amg_data) = P_max_elmts; return hypre_error_flag; } HYPRE_Int hypre_BoomerAMGGetPMaxElmts( void *data, HYPRE_Int * P_max_elmts ) { hypre_ParAMGData *amg_data = (hypre_ParAMGData*) data; if (!amg_data) { hypre_error_in_arg(1); return hypre_error_flag; } *P_max_elmts = hypre_ParAMGDataPMaxElmts(amg_data); return hypre_error_flag; } HYPRE_Int hypre_BoomerAMGSetJacobiTruncThreshold( void *data, HYPRE_Real jacobi_trunc_threshold ) { hypre_ParAMGData *amg_data = (hypre_ParAMGData*) data; if (!amg_data) { hypre_error_in_arg(1); return hypre_error_flag; } if (jacobi_trunc_threshold < 0 || jacobi_trunc_threshold >= 1) { hypre_error_in_arg(2); return hypre_error_flag; } hypre_ParAMGDataJacobiTruncThreshold(amg_data) = jacobi_trunc_threshold; return hypre_error_flag; } HYPRE_Int hypre_BoomerAMGGetJacobiTruncThreshold( void *data, HYPRE_Real * jacobi_trunc_threshold ) { hypre_ParAMGData *amg_data = (hypre_ParAMGData*) data; if (!amg_data) { hypre_error_in_arg(1); return hypre_error_flag; } *jacobi_trunc_threshold = hypre_ParAMGDataJacobiTruncThreshold(amg_data); return hypre_error_flag; } HYPRE_Int hypre_BoomerAMGSetPostInterpType( void *data, HYPRE_Int post_interp_type ) { hypre_ParAMGData *amg_data = (hypre_ParAMGData*) data; if (!amg_data) { hypre_error_in_arg(1); return hypre_error_flag; } if (post_interp_type < 0) { hypre_error_in_arg(2); return hypre_error_flag; } hypre_ParAMGDataPostInterpType(amg_data) = post_interp_type; return hypre_error_flag; } HYPRE_Int hypre_BoomerAMGGetPostInterpType( void *data, HYPRE_Int * post_interp_type ) { hypre_ParAMGData *amg_data = (hypre_ParAMGData*) data; if (!amg_data) { hypre_error_in_arg(1); return hypre_error_flag; } *post_interp_type = hypre_ParAMGDataPostInterpType(amg_data); return hypre_error_flag; } HYPRE_Int hypre_BoomerAMGSetInterpType( void *data, HYPRE_Int interp_type ) { hypre_ParAMGData *amg_data = (hypre_ParAMGData*) data; if (!amg_data) { hypre_error_in_arg(1); return hypre_error_flag; } if ((interp_type < 0 || interp_type > 25) && interp_type != 100) { hypre_error_in_arg(2); return hypre_error_flag; } hypre_ParAMGDataInterpType(amg_data) = interp_type; return hypre_error_flag; } HYPRE_Int hypre_BoomerAMGGetInterpType( void *data, HYPRE_Int * interp_type ) { hypre_ParAMGData *amg_data = (hypre_ParAMGData*) data; if (!amg_data) { hypre_error_in_arg(1); return hypre_error_flag; } *interp_type = hypre_ParAMGDataInterpType(amg_data); return hypre_error_flag; } HYPRE_Int hypre_BoomerAMGSetSepWeight( void *data, HYPRE_Int sep_weight ) { hypre_ParAMGData *amg_data = (hypre_ParAMGData*) data; if (!amg_data) { hypre_error_in_arg(1); return hypre_error_flag; } hypre_ParAMGDataSepWeight(amg_data) = sep_weight; return hypre_error_flag; } HYPRE_Int hypre_BoomerAMGSetMinIter( void *data, HYPRE_Int min_iter ) { hypre_ParAMGData *amg_data = (hypre_ParAMGData*) data; if (!amg_data) { hypre_error_in_arg(1); return hypre_error_flag; } hypre_ParAMGDataMinIter(amg_data) = min_iter; return hypre_error_flag; } HYPRE_Int hypre_BoomerAMGGetMinIter( void *data, HYPRE_Int * min_iter ) { hypre_ParAMGData *amg_data = (hypre_ParAMGData*) data; if (!amg_data) { hypre_error_in_arg(1); return hypre_error_flag; } *min_iter = hypre_ParAMGDataMinIter(amg_data); return hypre_error_flag; } HYPRE_Int hypre_BoomerAMGSetMaxIter( void *data, HYPRE_Int max_iter ) { hypre_ParAMGData *amg_data = (hypre_ParAMGData*) data; if (!amg_data) { hypre_error_in_arg(1); return hypre_error_flag; } if (max_iter < 0) { hypre_error_in_arg(2); return hypre_error_flag; } hypre_ParAMGDataMaxIter(amg_data) = max_iter; return hypre_error_flag; } HYPRE_Int hypre_BoomerAMGGetMaxIter( void *data, HYPRE_Int * max_iter ) { hypre_ParAMGData *amg_data = (hypre_ParAMGData*) data; if (!amg_data) { hypre_error_in_arg(1); return hypre_error_flag; } *max_iter = hypre_ParAMGDataMaxIter(amg_data); return hypre_error_flag; } HYPRE_Int hypre_BoomerAMGSetCoarsenType( void *data, HYPRE_Int coarsen_type ) { hypre_ParAMGData *amg_data = (hypre_ParAMGData*) data; if (!amg_data) { hypre_error_in_arg(1); return hypre_error_flag; } hypre_ParAMGDataCoarsenType(amg_data) = coarsen_type; return hypre_error_flag; } HYPRE_Int hypre_BoomerAMGGetCoarsenType( void *data, HYPRE_Int * coarsen_type ) { hypre_ParAMGData *amg_data = (hypre_ParAMGData*) data; if (!amg_data) { hypre_error_in_arg(1); return hypre_error_flag; } *coarsen_type = hypre_ParAMGDataCoarsenType(amg_data); return hypre_error_flag; } HYPRE_Int hypre_BoomerAMGSetMeasureType( void *data, HYPRE_Int measure_type ) { hypre_ParAMGData *amg_data = (hypre_ParAMGData*) data; if (!amg_data) { hypre_error_in_arg(1); return hypre_error_flag; } hypre_ParAMGDataMeasureType(amg_data) = measure_type; return hypre_error_flag; } HYPRE_Int hypre_BoomerAMGGetMeasureType( void *data, HYPRE_Int * measure_type ) { hypre_ParAMGData *amg_data = (hypre_ParAMGData*) data; if (!amg_data) { hypre_error_in_arg(1); return hypre_error_flag; } *measure_type = hypre_ParAMGDataMeasureType(amg_data); return hypre_error_flag; } HYPRE_Int hypre_BoomerAMGSetSetupType( void *data, HYPRE_Int setup_type ) { hypre_ParAMGData *amg_data = (hypre_ParAMGData*) data; if (!amg_data) { hypre_error_in_arg(1); return hypre_error_flag; } hypre_ParAMGDataSetupType(amg_data) = setup_type; return hypre_error_flag; } HYPRE_Int hypre_BoomerAMGGetSetupType( void *data, HYPRE_Int * setup_type ) { hypre_ParAMGData *amg_data = (hypre_ParAMGData*) data; if (!amg_data) { hypre_error_in_arg(1); return hypre_error_flag; } *setup_type = hypre_ParAMGDataSetupType(amg_data); return hypre_error_flag; } HYPRE_Int hypre_BoomerAMGSetCycleType( void *data, HYPRE_Int cycle_type ) { hypre_ParAMGData *amg_data = (hypre_ParAMGData*) data; if (!amg_data) { hypre_error_in_arg(1); return hypre_error_flag; } if (cycle_type < 0 || cycle_type > 2) { hypre_error_in_arg(2); return hypre_error_flag; } hypre_ParAMGDataCycleType(amg_data) = cycle_type; return hypre_error_flag; } HYPRE_Int hypre_BoomerAMGGetCycleType( void *data, HYPRE_Int * cycle_type ) { hypre_ParAMGData *amg_data = (hypre_ParAMGData*) data; if (!amg_data) { hypre_error_in_arg(1); return hypre_error_flag; } *cycle_type = hypre_ParAMGDataCycleType(amg_data); return hypre_error_flag; } HYPRE_Int hypre_BoomerAMGSetFCycle( void *data, HYPRE_Int fcycle ) { hypre_ParAMGData *amg_data = (hypre_ParAMGData*) data; if (!amg_data) { hypre_error_in_arg(1); return hypre_error_flag; } hypre_ParAMGDataFCycle(amg_data) = fcycle != 0; return hypre_error_flag; } HYPRE_Int hypre_BoomerAMGGetFCycle( void *data, HYPRE_Int *fcycle ) { hypre_ParAMGData *amg_data = (hypre_ParAMGData*) data; if (!amg_data) { hypre_error_in_arg(1); return hypre_error_flag; } *fcycle = hypre_ParAMGDataFCycle(amg_data); return hypre_error_flag; } HYPRE_Int hypre_BoomerAMGSetConvergeType( void *data, HYPRE_Int type ) { /* type 0: default. relative over ||b|| * 1: relative over ||r0|| */ hypre_ParAMGData *amg_data = (hypre_ParAMGData*) data; if (!amg_data) { hypre_error_in_arg(1); return hypre_error_flag; } /* if () { hypre_error_in_arg(2); return hypre_error_flag; } */ hypre_ParAMGDataConvergeType(amg_data) = type; return hypre_error_flag; } HYPRE_Int hypre_BoomerAMGGetConvergeType( void *data, HYPRE_Int *type ) { hypre_ParAMGData *amg_data = (hypre_ParAMGData*) data; if (!amg_data) { hypre_error_in_arg(1); return hypre_error_flag; } *type = hypre_ParAMGDataConvergeType(amg_data); return hypre_error_flag; } HYPRE_Int hypre_BoomerAMGSetTol( void *data, HYPRE_Real tol ) { hypre_ParAMGData *amg_data = (hypre_ParAMGData*) data; if (!amg_data) { hypre_error_in_arg(1); return hypre_error_flag; } if (tol < 0 || tol > 1) { hypre_error_in_arg(2); return hypre_error_flag; } hypre_ParAMGDataTol(amg_data) = tol; return hypre_error_flag; } HYPRE_Int hypre_BoomerAMGGetTol( void *data, HYPRE_Real * tol ) { hypre_ParAMGData *amg_data = (hypre_ParAMGData*) data; if (!amg_data) { hypre_error_in_arg(1); return hypre_error_flag; } *tol = hypre_ParAMGDataTol(amg_data); return hypre_error_flag; } /* The "Get" function for SetNumSweeps is GetCycleNumSweeps. */ HYPRE_Int hypre_BoomerAMGSetNumSweeps( void *data, HYPRE_Int num_sweeps ) { HYPRE_Int i; HYPRE_Int *num_grid_sweeps; hypre_ParAMGData *amg_data = (hypre_ParAMGData*) data; if (!amg_data) { hypre_error_in_arg(1); return hypre_error_flag; } if (num_sweeps < 1) { hypre_error_in_arg(2); return hypre_error_flag; } if (hypre_ParAMGDataNumGridSweeps(amg_data) == NULL) { hypre_ParAMGDataNumGridSweeps(amg_data) = hypre_CTAlloc(HYPRE_Int, 4, HYPRE_MEMORY_HOST); } num_grid_sweeps = hypre_ParAMGDataNumGridSweeps(amg_data); for (i = 0; i < 3; i++) { num_grid_sweeps[i] = num_sweeps; } num_grid_sweeps[3] = 1; hypre_ParAMGDataUserNumSweeps(amg_data) = num_sweeps; return hypre_error_flag; } HYPRE_Int hypre_BoomerAMGSetCycleNumSweeps( void *data, HYPRE_Int num_sweeps, HYPRE_Int k ) { HYPRE_Int i; HYPRE_Int *num_grid_sweeps; hypre_ParAMGData *amg_data = (hypre_ParAMGData*) data; if (!amg_data) { hypre_error_in_arg(1); return hypre_error_flag; } if (num_sweeps < 0) { hypre_error_in_arg(2); return hypre_error_flag; } if (k < 1 || k > 3) { hypre_error_in_arg(3); return hypre_error_flag; } if (hypre_ParAMGDataNumGridSweeps(amg_data) == NULL) { num_grid_sweeps = hypre_CTAlloc(HYPRE_Int, 4, HYPRE_MEMORY_HOST); for (i = 0; i < 4; i++) { num_grid_sweeps[i] = 1; } hypre_ParAMGDataNumGridSweeps(amg_data) = num_grid_sweeps; } hypre_ParAMGDataNumGridSweeps(amg_data)[k] = num_sweeps; return hypre_error_flag; } HYPRE_Int hypre_BoomerAMGGetCycleNumSweeps( void *data, HYPRE_Int * num_sweeps, HYPRE_Int k ) { hypre_ParAMGData *amg_data = (hypre_ParAMGData*) data; if (!amg_data) { hypre_error_in_arg(1); return hypre_error_flag; } if (k < 1 || k > 3) { hypre_error_in_arg(3); return hypre_error_flag; } if (hypre_ParAMGDataNumGridSweeps(amg_data) == NULL) { hypre_error_in_arg(1); return hypre_error_flag; } *num_sweeps = hypre_ParAMGDataNumGridSweeps(amg_data)[k]; return hypre_error_flag; } HYPRE_Int hypre_BoomerAMGSetNumGridSweeps( void *data, HYPRE_Int *num_grid_sweeps ) { hypre_ParAMGData *amg_data = (hypre_ParAMGData*) data; if (!amg_data) { hypre_error_in_arg(1); return hypre_error_flag; } if (!num_grid_sweeps) { hypre_error_in_arg(2); return hypre_error_flag; } if (hypre_ParAMGDataNumGridSweeps(amg_data)) { hypre_TFree(hypre_ParAMGDataNumGridSweeps(amg_data), HYPRE_MEMORY_HOST); } hypre_ParAMGDataNumGridSweeps(amg_data) = num_grid_sweeps; return hypre_error_flag; } HYPRE_Int hypre_BoomerAMGGetNumGridSweeps( void *data, HYPRE_Int ** num_grid_sweeps ) { hypre_ParAMGData *amg_data = (hypre_ParAMGData*) data; if (!amg_data) { hypre_error_in_arg(1); return hypre_error_flag; } *num_grid_sweeps = hypre_ParAMGDataNumGridSweeps(amg_data); return hypre_error_flag; } /* The "Get" function for SetRelaxType is GetCycleRelaxType. */ HYPRE_Int hypre_BoomerAMGSetRelaxType( void *data, HYPRE_Int relax_type ) { HYPRE_Int i; HYPRE_Int *grid_relax_type; hypre_ParAMGData *amg_data = (hypre_ParAMGData*) data; if (!amg_data) { hypre_error_in_arg(1); return hypre_error_flag; } if (relax_type < 0) { hypre_error_in_arg(2); return hypre_error_flag; } if (hypre_ParAMGDataGridRelaxType(amg_data) == NULL) { hypre_ParAMGDataGridRelaxType(amg_data) = hypre_CTAlloc(HYPRE_Int, 4, HYPRE_MEMORY_HOST); } grid_relax_type = hypre_ParAMGDataGridRelaxType(amg_data); for (i = 0; i < 3; i++) { grid_relax_type[i] = relax_type; } grid_relax_type[3] = 9; hypre_ParAMGDataUserCoarseRelaxType(amg_data) = 9; hypre_ParAMGDataUserRelaxType(amg_data) = relax_type; return hypre_error_flag; } HYPRE_Int hypre_BoomerAMGSetCycleRelaxType( void *data, HYPRE_Int relax_type, HYPRE_Int k ) { HYPRE_Int i; HYPRE_Int *grid_relax_type; hypre_ParAMGData *amg_data = (hypre_ParAMGData*) data; if (!amg_data) { hypre_error_in_arg(1); return hypre_error_flag; } if (k < 1 || k > 3) { hypre_error_in_arg(3); return hypre_error_flag; } if (relax_type < 0) { hypre_error_in_arg(2); return hypre_error_flag; } if (hypre_ParAMGDataGridRelaxType(amg_data) == NULL) { grid_relax_type = hypre_CTAlloc(HYPRE_Int, 4, HYPRE_MEMORY_HOST); for (i = 0; i < 3; i++) { grid_relax_type[i] = 3; } grid_relax_type[3] = 9; hypre_ParAMGDataGridRelaxType(amg_data) = grid_relax_type; } hypre_ParAMGDataGridRelaxType(amg_data)[k] = relax_type; if (k == 3) { hypre_ParAMGDataUserCoarseRelaxType(amg_data) = relax_type; } return hypre_error_flag; } HYPRE_Int hypre_BoomerAMGGetCycleRelaxType( void *data, HYPRE_Int * relax_type, HYPRE_Int k ) { hypre_ParAMGData *amg_data = (hypre_ParAMGData*) data; if (!amg_data) { hypre_error_in_arg(1); return hypre_error_flag; } if (k < 1 || k > 3) { hypre_error_in_arg(3); return hypre_error_flag; } if (hypre_ParAMGDataGridRelaxType(amg_data) == NULL) { hypre_error_in_arg(1); return hypre_error_flag; } *relax_type = hypre_ParAMGDataGridRelaxType(amg_data)[k]; return hypre_error_flag; } HYPRE_Int hypre_BoomerAMGSetRelaxOrder( void *data, HYPRE_Int relax_order) { hypre_ParAMGData *amg_data = (hypre_ParAMGData*) data; if (!amg_data) { hypre_error_in_arg(1); return hypre_error_flag; } hypre_ParAMGDataRelaxOrder(amg_data) = relax_order; return hypre_error_flag; } HYPRE_Int hypre_BoomerAMGGetRelaxOrder( void *data, HYPRE_Int * relax_order) { hypre_ParAMGData *amg_data = (hypre_ParAMGData*) data; if (!amg_data) { hypre_error_in_arg(1); return hypre_error_flag; } *relax_order = hypre_ParAMGDataRelaxOrder(amg_data); return hypre_error_flag; } HYPRE_Int hypre_BoomerAMGSetGridRelaxType( void *data, HYPRE_Int *grid_relax_type ) { hypre_ParAMGData *amg_data = (hypre_ParAMGData*) data; if (!amg_data) { hypre_error_in_arg(1); return hypre_error_flag; } if (!grid_relax_type) { hypre_error_in_arg(2); return hypre_error_flag; } if (hypre_ParAMGDataGridRelaxType(amg_data)) { hypre_TFree(hypre_ParAMGDataGridRelaxType(amg_data), HYPRE_MEMORY_HOST); } hypre_ParAMGDataGridRelaxType(amg_data) = grid_relax_type; hypre_ParAMGDataUserCoarseRelaxType(amg_data) = grid_relax_type[3]; return hypre_error_flag; } HYPRE_Int hypre_BoomerAMGGetGridRelaxType( void *data, HYPRE_Int ** grid_relax_type ) { hypre_ParAMGData *amg_data = (hypre_ParAMGData*) data; if (!amg_data) { hypre_error_in_arg(1); return hypre_error_flag; } *grid_relax_type = hypre_ParAMGDataGridRelaxType(amg_data); return hypre_error_flag; } HYPRE_Int hypre_BoomerAMGSetGridRelaxPoints( void *data, HYPRE_Int **grid_relax_points ) { HYPRE_Int i; hypre_ParAMGData *amg_data = (hypre_ParAMGData*) data; if (!amg_data) { hypre_error_in_arg(1); return hypre_error_flag; } if (!grid_relax_points) { hypre_error_in_arg(2); return hypre_error_flag; } if (hypre_ParAMGDataGridRelaxPoints(amg_data)) { for (i = 0; i < 4; i++) { hypre_TFree(hypre_ParAMGDataGridRelaxPoints(amg_data)[i], HYPRE_MEMORY_HOST); } hypre_TFree(hypre_ParAMGDataGridRelaxPoints(amg_data), HYPRE_MEMORY_HOST); } hypre_ParAMGDataGridRelaxPoints(amg_data) = grid_relax_points; return hypre_error_flag; } HYPRE_Int hypre_BoomerAMGGetGridRelaxPoints( void *data, HYPRE_Int *** grid_relax_points ) { hypre_ParAMGData *amg_data = (hypre_ParAMGData*) data; if (!amg_data) { hypre_error_in_arg(1); return hypre_error_flag; } *grid_relax_points = hypre_ParAMGDataGridRelaxPoints(amg_data); return hypre_error_flag; } HYPRE_Int hypre_BoomerAMGSetRelaxWeight( void *data, HYPRE_Real *relax_weight ) { hypre_ParAMGData *amg_data = (hypre_ParAMGData*) data; if (!amg_data) { hypre_error_in_arg(1); return hypre_error_flag; } if (!relax_weight) { hypre_error_in_arg(2); return hypre_error_flag; } if (hypre_ParAMGDataRelaxWeight(amg_data)) { hypre_TFree(hypre_ParAMGDataRelaxWeight(amg_data), HYPRE_MEMORY_HOST); } hypre_ParAMGDataRelaxWeight(amg_data) = relax_weight; return hypre_error_flag; } HYPRE_Int hypre_BoomerAMGGetRelaxWeight( void *data, HYPRE_Real ** relax_weight ) { hypre_ParAMGData *amg_data = (hypre_ParAMGData*) data; if (!amg_data) { hypre_error_in_arg(1); return hypre_error_flag; } *relax_weight = hypre_ParAMGDataRelaxWeight(amg_data); return hypre_error_flag; } HYPRE_Int hypre_BoomerAMGSetRelaxWt( void *data, HYPRE_Real relax_weight ) { HYPRE_Int i, num_levels; HYPRE_Real *relax_weight_array; hypre_ParAMGData *amg_data = (hypre_ParAMGData*) data; if (!amg_data) { hypre_error_in_arg(1); return hypre_error_flag; } num_levels = hypre_ParAMGDataMaxLevels(amg_data); if (hypre_ParAMGDataRelaxWeight(amg_data) == NULL) { hypre_ParAMGDataRelaxWeight(amg_data) = hypre_CTAlloc(HYPRE_Real, num_levels, HYPRE_MEMORY_HOST); } relax_weight_array = hypre_ParAMGDataRelaxWeight(amg_data); for (i = 0; i < num_levels; i++) { relax_weight_array[i] = relax_weight; } hypre_ParAMGDataUserRelaxWeight(amg_data) = relax_weight; return hypre_error_flag; } HYPRE_Int hypre_BoomerAMGSetLevelRelaxWt( void *data, HYPRE_Real relax_weight, HYPRE_Int level ) { HYPRE_Int i, num_levels; hypre_ParAMGData *amg_data = (hypre_ParAMGData*) data; if (!amg_data) { hypre_error_in_arg(1); return hypre_error_flag; } num_levels = hypre_ParAMGDataMaxLevels(amg_data); if (level > num_levels - 1 || level < 0) { hypre_error_in_arg(3); return hypre_error_flag; } if (hypre_ParAMGDataRelaxWeight(amg_data) == NULL) { hypre_ParAMGDataRelaxWeight(amg_data) = hypre_CTAlloc(HYPRE_Real, num_levels, HYPRE_MEMORY_HOST); for (i = 0; i < num_levels; i++) { hypre_ParAMGDataRelaxWeight(amg_data)[i] = 1.0; } } hypre_ParAMGDataRelaxWeight(amg_data)[level] = relax_weight; return hypre_error_flag; } HYPRE_Int hypre_BoomerAMGGetLevelRelaxWt( void *data, HYPRE_Real * relax_weight, HYPRE_Int level ) { HYPRE_Int num_levels; hypre_ParAMGData *amg_data = (hypre_ParAMGData*) data; if (!amg_data) { hypre_error_in_arg(1); return hypre_error_flag; } num_levels = hypre_ParAMGDataMaxLevels(amg_data); if (level > num_levels - 1 || level < 0) { hypre_error_in_arg(3); return hypre_error_flag; } if (hypre_ParAMGDataRelaxWeight(amg_data) == NULL) { hypre_error_in_arg(1); return hypre_error_flag; } *relax_weight = hypre_ParAMGDataRelaxWeight(amg_data)[level]; return hypre_error_flag; } HYPRE_Int hypre_BoomerAMGSetOmega( void *data, HYPRE_Real *omega ) { hypre_ParAMGData *amg_data = (hypre_ParAMGData*) data; if (!amg_data) { hypre_error_in_arg(1); return hypre_error_flag; } if (!omega) { hypre_error_in_arg(2); return hypre_error_flag; } if (hypre_ParAMGDataOmega(amg_data)) { hypre_TFree(hypre_ParAMGDataOmega(amg_data), HYPRE_MEMORY_HOST); } hypre_ParAMGDataOmega(amg_data) = omega; return hypre_error_flag; } HYPRE_Int hypre_BoomerAMGGetOmega( void *data, HYPRE_Real ** omega ) { hypre_ParAMGData *amg_data = (hypre_ParAMGData*) data; if (!amg_data) { hypre_error_in_arg(1); return hypre_error_flag; } *omega = hypre_ParAMGDataOmega(amg_data); return hypre_error_flag; } HYPRE_Int hypre_BoomerAMGSetOuterWt( void *data, HYPRE_Real omega ) { HYPRE_Int i, num_levels; HYPRE_Real *omega_array; hypre_ParAMGData *amg_data = (hypre_ParAMGData*) data; if (!amg_data) { hypre_error_in_arg(1); return hypre_error_flag; } num_levels = hypre_ParAMGDataMaxLevels(amg_data); if (hypre_ParAMGDataOmega(amg_data) == NULL) { hypre_ParAMGDataOmega(amg_data) = hypre_CTAlloc(HYPRE_Real, num_levels, HYPRE_MEMORY_HOST); } omega_array = hypre_ParAMGDataOmega(amg_data); for (i = 0; i < num_levels; i++) { omega_array[i] = omega; } hypre_ParAMGDataOuterWt(amg_data) = omega; return hypre_error_flag; } HYPRE_Int hypre_BoomerAMGSetLevelOuterWt( void *data, HYPRE_Real omega, HYPRE_Int level ) { HYPRE_Int i, num_levels; hypre_ParAMGData *amg_data = (hypre_ParAMGData*) data; if (!amg_data) { hypre_error_in_arg(1); return hypre_error_flag; } num_levels = hypre_ParAMGDataMaxLevels(amg_data); if (level > num_levels - 1) { hypre_error_in_arg(3); return hypre_error_flag; } if (hypre_ParAMGDataOmega(amg_data) == NULL) { hypre_ParAMGDataOmega(amg_data) = hypre_CTAlloc(HYPRE_Real, num_levels, HYPRE_MEMORY_HOST); for (i = 0; i < num_levels; i++) { hypre_ParAMGDataOmega(amg_data)[i] = 1.0; } } hypre_ParAMGDataOmega(amg_data)[level] = omega; return hypre_error_flag; } HYPRE_Int hypre_BoomerAMGGetLevelOuterWt( void *data, HYPRE_Real * omega, HYPRE_Int level ) { HYPRE_Int num_levels; hypre_ParAMGData *amg_data = (hypre_ParAMGData*) data; if (!amg_data) { hypre_error_in_arg(1); return hypre_error_flag; } num_levels = hypre_ParAMGDataMaxLevels(amg_data); if (level > num_levels - 1) { hypre_error_in_arg(3); return hypre_error_flag; } if (hypre_ParAMGDataOmega(amg_data) == NULL) { hypre_error_in_arg(1); return hypre_error_flag; } *omega = hypre_ParAMGDataOmega(amg_data)[level]; return hypre_error_flag; } HYPRE_Int hypre_BoomerAMGSetSmoothType( void *data, HYPRE_Int smooth_type ) { hypre_ParAMGData *amg_data = (hypre_ParAMGData*) data; if (!amg_data) { hypre_error_in_arg(1); return hypre_error_flag; } hypre_ParAMGDataSmoothType(amg_data) = smooth_type; return hypre_error_flag; } HYPRE_Int hypre_BoomerAMGGetSmoothType( void *data, HYPRE_Int * smooth_type ) { hypre_ParAMGData *amg_data = (hypre_ParAMGData*) data; if (!amg_data) { hypre_error_in_arg(1); return hypre_error_flag; } *smooth_type = hypre_ParAMGDataSmoothType(amg_data); return hypre_error_flag; } HYPRE_Int hypre_BoomerAMGSetSmoothNumLevels( void *data, HYPRE_Int smooth_num_levels ) { hypre_ParAMGData *amg_data = (hypre_ParAMGData*) data; if (!amg_data) { hypre_error_in_arg(1); return hypre_error_flag; } if (smooth_num_levels < 0) { hypre_error_in_arg(2); return hypre_error_flag; } hypre_ParAMGDataSmoothNumLevels(amg_data) = smooth_num_levels; return hypre_error_flag; } HYPRE_Int hypre_BoomerAMGGetSmoothNumLevels( void *data, HYPRE_Int * smooth_num_levels ) { hypre_ParAMGData *amg_data = (hypre_ParAMGData*) data; if (!amg_data) { hypre_error_in_arg(1); return hypre_error_flag; } *smooth_num_levels = hypre_ParAMGDataSmoothNumLevels(amg_data); return hypre_error_flag; } HYPRE_Int hypre_BoomerAMGSetSmoothNumSweeps( void *data, HYPRE_Int smooth_num_sweeps ) { hypre_ParAMGData *amg_data = (hypre_ParAMGData*) data; if (!amg_data) { hypre_error_in_arg(1); return hypre_error_flag; } if (smooth_num_sweeps < 0) { hypre_error_in_arg(2); return hypre_error_flag; } hypre_ParAMGDataSmoothNumSweeps(amg_data) = smooth_num_sweeps; return hypre_error_flag; } HYPRE_Int hypre_BoomerAMGGetSmoothNumSweeps( void *data, HYPRE_Int * smooth_num_sweeps ) { hypre_ParAMGData *amg_data = (hypre_ParAMGData*) data; if (!amg_data) { hypre_error_in_arg(1); return hypre_error_flag; } *smooth_num_sweeps = hypre_ParAMGDataSmoothNumSweeps(amg_data); return hypre_error_flag; } HYPRE_Int hypre_BoomerAMGSetLogging( void *data, HYPRE_Int logging ) { /* This function should be called before Setup. Logging changes may require allocation or freeing of arrays, which is presently only done there. It may be possible to support logging changes at other times, but there is little need. */ hypre_ParAMGData *amg_data = (hypre_ParAMGData*) data; if (!amg_data) { hypre_error_in_arg(1); return hypre_error_flag; } hypre_ParAMGDataLogging(amg_data) = logging; return hypre_error_flag; } HYPRE_Int hypre_BoomerAMGGetLogging( void *data, HYPRE_Int * logging ) { hypre_ParAMGData *amg_data = (hypre_ParAMGData*) data; if (!amg_data) { hypre_error_in_arg(1); return hypre_error_flag; } *logging = hypre_ParAMGDataLogging(amg_data); return hypre_error_flag; } HYPRE_Int hypre_BoomerAMGSetPrintLevel( void *data, HYPRE_Int print_level ) { hypre_ParAMGData *amg_data = (hypre_ParAMGData*) data; if (!amg_data) { hypre_error_in_arg(1); return hypre_error_flag; } hypre_ParAMGDataPrintLevel(amg_data) = print_level; return hypre_error_flag; } HYPRE_Int hypre_BoomerAMGGetPrintLevel( void *data, HYPRE_Int * print_level ) { hypre_ParAMGData *amg_data = (hypre_ParAMGData*) data; if (!amg_data) { hypre_error_in_arg(1); return hypre_error_flag; } *print_level = hypre_ParAMGDataPrintLevel(amg_data); return hypre_error_flag; } HYPRE_Int hypre_BoomerAMGSetPrintFileName( void *data, const char *print_file_name ) { hypre_ParAMGData *amg_data = (hypre_ParAMGData*)data; if (!amg_data) { hypre_error_in_arg(1); return hypre_error_flag; } if ( strlen(print_file_name) > 256 ) { hypre_error_in_arg(2); return hypre_error_flag; } hypre_sprintf(hypre_ParAMGDataLogFileName(amg_data), "%s", print_file_name); return hypre_error_flag; } HYPRE_Int hypre_BoomerAMGGetPrintFileName( void *data, char ** print_file_name ) { hypre_ParAMGData *amg_data = (hypre_ParAMGData*) data; if (!amg_data) { hypre_error_in_arg(1); return hypre_error_flag; } hypre_sprintf( *print_file_name, "%s", hypre_ParAMGDataLogFileName(amg_data) ); return hypre_error_flag; } HYPRE_Int hypre_BoomerAMGSetNumIterations( void *data, HYPRE_Int num_iterations ) { hypre_ParAMGData *amg_data = (hypre_ParAMGData*) data; if (!amg_data) { hypre_error_in_arg(1); return hypre_error_flag; } hypre_ParAMGDataNumIterations(amg_data) = num_iterations; return hypre_error_flag; } HYPRE_Int hypre_BoomerAMGSetDebugFlag( void *data, HYPRE_Int debug_flag ) { hypre_ParAMGData *amg_data = (hypre_ParAMGData*) data; if (!amg_data) { hypre_error_in_arg(1); return hypre_error_flag; } hypre_ParAMGDataDebugFlag(amg_data) = debug_flag; return hypre_error_flag; } HYPRE_Int hypre_BoomerAMGGetDebugFlag( void *data, HYPRE_Int * debug_flag ) { hypre_ParAMGData *amg_data = (hypre_ParAMGData*) data; if (!amg_data) { hypre_error_in_arg(1); return hypre_error_flag; } *debug_flag = hypre_ParAMGDataDebugFlag(amg_data); return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_BoomerAMGSetGSMG *--------------------------------------------------------------------------*/ HYPRE_Int hypre_BoomerAMGSetGSMG( void *data, HYPRE_Int par ) { hypre_ParAMGData *amg_data = (hypre_ParAMGData*) data; if (!amg_data) { hypre_error_in_arg(1); return hypre_error_flag; } amg_data->gsmg = par; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_BoomerAMGSetNumSamples *--------------------------------------------------------------------------*/ HYPRE_Int hypre_BoomerAMGSetNumSamples( void *data, HYPRE_Int par ) { hypre_ParAMGData *amg_data = (hypre_ParAMGData*) data; if (!amg_data) { hypre_error_in_arg(1); return hypre_error_flag; } amg_data->num_samples = par; return hypre_error_flag; } /* BM Aug 25, 2006 */ HYPRE_Int hypre_BoomerAMGSetCGCIts( void *data, HYPRE_Int its) { HYPRE_Int ierr = 0; hypre_ParAMGData *amg_data = (hypre_ParAMGData*) data; hypre_ParAMGDataCGCIts(amg_data) = its; return (ierr); } /* BM Oct 22, 2006 */ HYPRE_Int hypre_BoomerAMGSetPlotGrids( void *data, HYPRE_Int plotgrids) { HYPRE_Int ierr = 0; hypre_ParAMGData *amg_data = (hypre_ParAMGData*) data; hypre_ParAMGDataPlotGrids(amg_data) = plotgrids; return (ierr); } HYPRE_Int hypre_BoomerAMGSetPlotFileName( void *data, const char *plot_file_name ) { hypre_ParAMGData *amg_data = (hypre_ParAMGData*) data; if (!amg_data) { hypre_error_in_arg(1); return hypre_error_flag; } if ( strlen(plot_file_name) > 251 ) { hypre_error_in_arg(2); return hypre_error_flag; } if (strlen(plot_file_name) == 0 ) { hypre_sprintf(hypre_ParAMGDataPlotFileName(amg_data), "%s", "AMGgrids.CF.dat"); } else { hypre_sprintf(hypre_ParAMGDataPlotFileName(amg_data), "%s", plot_file_name); } return hypre_error_flag; } /* Get the coarse grid hierarchy. Assumes cgrid is preallocated to the size of the local matrix. * Adapted from par_amg_setup.c, and simplified by ignoring printing in block mode. * We do a memcpy on the final grid hierarchy to avoid modifying user allocated data. */ HYPRE_Int hypre_BoomerAMGGetGridHierarchy( void *data, HYPRE_Int *cgrid ) { HYPRE_Int *ibuff = NULL; HYPRE_Int *wbuff, *cbuff, *tmp; HYPRE_Int local_size, lev_size, i, j, level, num_levels, block_mode; hypre_IntArray *CF_marker_array; hypre_IntArray *CF_marker_array_host; HYPRE_Int *CF_marker; hypre_ParAMGData *amg_data = (hypre_ParAMGData*) data; if (!amg_data) { hypre_error_in_arg(1); return hypre_error_flag; } if (!cgrid) { hypre_error_in_arg(2); return hypre_error_flag; } block_mode = hypre_ParAMGDataBlockMode(amg_data); if ( block_mode) { hypre_ParCSRBlockMatrix **A_block_array; A_block_array = hypre_ParAMGDataABlockArray(amg_data); if (A_block_array == NULL) { hypre_error_w_msg(HYPRE_ERROR_GENERIC, "Invalid AMG data. AMG setup has not been called!!\n"); return hypre_error_flag; } // get local size and allocate some memory local_size = hypre_CSRMatrixNumRows(hypre_ParCSRBlockMatrixDiag(A_block_array[0])); ibuff = hypre_CTAlloc(HYPRE_Int, (2 * local_size), HYPRE_MEMORY_HOST); wbuff = ibuff; cbuff = ibuff + local_size; num_levels = hypre_ParAMGDataNumLevels(amg_data); for (level = (num_levels - 2); level >= 0; level--) { /* get the CF marker array on the host */ CF_marker_array = hypre_ParAMGDataCFMarkerArray(amg_data)[level]; if (hypre_GetActualMemLocation(hypre_IntArrayMemoryLocation(CF_marker_array)) == hypre_MEMORY_DEVICE) { CF_marker_array_host = hypre_IntArrayCloneDeep_v2(CF_marker_array, HYPRE_MEMORY_HOST); } else { CF_marker_array_host = CF_marker_array; } CF_marker = hypre_IntArrayData(CF_marker_array_host); /* swap pointers */ tmp = wbuff; wbuff = cbuff; cbuff = tmp; lev_size = hypre_CSRMatrixNumRows(hypre_ParCSRBlockMatrixDiag(A_block_array[level])); for (i = 0, j = 0; i < lev_size; i++) { /* if a C-point */ cbuff[i] = 0; if (CF_marker[i] > -1) { cbuff[i] = wbuff[j] + 1; j++; } } /* destroy copy host copy if necessary */ if (hypre_GetActualMemLocation(hypre_IntArrayMemoryLocation(CF_marker_array)) == hypre_MEMORY_DEVICE) { hypre_IntArrayDestroy(CF_marker_array_host); } } } else { hypre_ParCSRMatrix **A_array; A_array = hypre_ParAMGDataAArray(amg_data); if (A_array == NULL) { hypre_error_w_msg(HYPRE_ERROR_GENERIC, "Invalid AMG data. AMG setup has not been called!!\n"); return hypre_error_flag; } // get local size and allocate some memory local_size = hypre_CSRMatrixNumRows(hypre_ParCSRMatrixDiag(A_array[0])); wbuff = hypre_CTAlloc(HYPRE_Int, (2 * local_size), HYPRE_MEMORY_HOST); cbuff = wbuff + local_size; num_levels = hypre_ParAMGDataNumLevels(amg_data); for (level = (num_levels - 2); level >= 0; level--) { /* get the CF marker array on the host */ CF_marker_array = hypre_ParAMGDataCFMarkerArray(amg_data)[level]; if (hypre_GetActualMemLocation(hypre_IntArrayMemoryLocation(CF_marker_array)) == hypre_MEMORY_DEVICE) { CF_marker_array_host = hypre_IntArrayCloneDeep_v2(CF_marker_array, HYPRE_MEMORY_HOST); } else { CF_marker_array_host = CF_marker_array; } CF_marker = hypre_IntArrayData(CF_marker_array_host); /* swap pointers */ tmp = wbuff; wbuff = cbuff; cbuff = tmp; lev_size = hypre_CSRMatrixNumRows(hypre_ParCSRMatrixDiag(A_array[level])); for (i = 0, j = 0; i < lev_size; i++) { /* if a C-point */ cbuff[i] = 0; if (CF_marker[i] > -1) { cbuff[i] = wbuff[j] + 1; j++; } } /* destroy copy host copy if necessary */ if (hypre_GetActualMemLocation(hypre_IntArrayMemoryLocation(CF_marker_array)) == hypre_MEMORY_DEVICE) { hypre_IntArrayDestroy(CF_marker_array_host); } } } // copy hierarchy into user provided array hypre_TMemcpy(cgrid, cbuff, HYPRE_Int, local_size, HYPRE_MEMORY_HOST, HYPRE_MEMORY_HOST); // free memory hypre_TFree(ibuff, HYPRE_MEMORY_HOST); return hypre_error_flag; } /* BM Oct 17, 2006 */ HYPRE_Int hypre_BoomerAMGSetCoordDim( void *data, HYPRE_Int coorddim) { HYPRE_Int ierr = 0; hypre_ParAMGData *amg_data = (hypre_ParAMGData*) data; hypre_ParAMGDataCoordDim(amg_data) = coorddim; return (ierr); } HYPRE_Int hypre_BoomerAMGSetCoordinates( void *data, float *coordinates) { HYPRE_Int ierr = 0; hypre_ParAMGData *amg_data = (hypre_ParAMGData*) data; hypre_ParAMGDataCoordinates(amg_data) = coordinates; return (ierr); } /*-------------------------------------------------------------------------- * Routines to set the problem data parameters *--------------------------------------------------------------------------*/ HYPRE_Int hypre_BoomerAMGSetNumFunctions( void *data, HYPRE_Int num_functions ) { hypre_ParAMGData *amg_data = (hypre_ParAMGData*) data; if (!amg_data) { hypre_error_in_arg(1); return hypre_error_flag; } if (num_functions < 1) { hypre_error_in_arg(2); return hypre_error_flag; } hypre_ParAMGDataNumFunctions(amg_data) = num_functions; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_BoomerAMGGetNumFunctions *--------------------------------------------------------------------------*/ HYPRE_Int hypre_BoomerAMGGetNumFunctions( void *data, HYPRE_Int *num_functions ) { hypre_ParAMGData *amg_data = (hypre_ParAMGData*) data; if (!amg_data) { hypre_error_in_arg(1); return hypre_error_flag; } *num_functions = hypre_ParAMGDataNumFunctions(amg_data); return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_BoomerAMGSetFilterFunctions *--------------------------------------------------------------------------*/ HYPRE_Int hypre_BoomerAMGSetFilterFunctions( void *data, HYPRE_Int filter_functions ) { hypre_ParAMGData *amg_data = (hypre_ParAMGData*) data; if (!amg_data) { hypre_error_in_arg(1); return hypre_error_flag; } if (filter_functions < 0 || filter_functions > 1) { hypre_error_in_arg(2); return hypre_error_flag; } hypre_ParAMGDataFilterFunctions(amg_data) = filter_functions; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_BoomerAMGGetFilterFunctions *--------------------------------------------------------------------------*/ HYPRE_Int hypre_BoomerAMGGetFilterFunctions( void *data, HYPRE_Int *filter_functions ) { hypre_ParAMGData *amg_data = (hypre_ParAMGData*) data; if (!amg_data) { hypre_error_in_arg(1); return hypre_error_flag; } *filter_functions = hypre_ParAMGDataFilterFunctions(amg_data); return hypre_error_flag; } /*-------------------------------------------------------------------------- * Indicate whether to use nodal systems function *--------------------------------------------------------------------------*/ HYPRE_Int hypre_BoomerAMGSetNodal( void *data, HYPRE_Int nodal ) { hypre_ParAMGData *amg_data = (hypre_ParAMGData*) data; if (!amg_data) { hypre_error_in_arg(1); return hypre_error_flag; } hypre_ParAMGDataNodal(amg_data) = nodal; return hypre_error_flag; } /*-------------------------------------------------------------------------- * Indicate number of levels for nodal coarsening *--------------------------------------------------------------------------*/ HYPRE_Int hypre_BoomerAMGSetNodalLevels( void *data, HYPRE_Int nodal_levels ) { hypre_ParAMGData *amg_data = (hypre_ParAMGData*) data; if (!amg_data) { hypre_error_in_arg(1); return hypre_error_flag; } hypre_ParAMGDataNodalLevels(amg_data) = nodal_levels; return hypre_error_flag; } /*-------------------------------------------------------------------------- * Indicate how to treat diag for primary matrix with nodal systems function *--------------------------------------------------------------------------*/ HYPRE_Int hypre_BoomerAMGSetNodalDiag( void *data, HYPRE_Int nodal ) { hypre_ParAMGData *amg_data = (hypre_ParAMGData*) data; if (!amg_data) { hypre_error_in_arg(1); return hypre_error_flag; } hypre_ParAMGDataNodalDiag(amg_data) = nodal; return hypre_error_flag; } /*-------------------------------------------------------------------------- * Indicate whether to discard same sign coefficients in S for nodal>0 *--------------------------------------------------------------------------*/ HYPRE_Int hypre_BoomerAMGSetKeepSameSign( void *data, HYPRE_Int keep_same_sign ) { hypre_ParAMGData *amg_data = (hypre_ParAMGData*) data; if (!amg_data) { hypre_error_in_arg(1); return hypre_error_flag; } hypre_ParAMGDataKeepSameSign(amg_data) = keep_same_sign; return hypre_error_flag; } /*-------------------------------------------------------------------------- * Indicate the degree of aggressive coarsening *--------------------------------------------------------------------------*/ HYPRE_Int hypre_BoomerAMGSetNumPaths( void *data, HYPRE_Int num_paths ) { hypre_ParAMGData *amg_data = (hypre_ParAMGData*) data; if (!amg_data) { hypre_error_in_arg(1); return hypre_error_flag; } if (num_paths < 1) { hypre_error_in_arg(2); return hypre_error_flag; } hypre_ParAMGDataNumPaths(amg_data) = num_paths; return hypre_error_flag; } /*-------------------------------------------------------------------------- * Indicates the number of levels of aggressive coarsening *--------------------------------------------------------------------------*/ HYPRE_Int hypre_BoomerAMGSetAggNumLevels( void *data, HYPRE_Int agg_num_levels ) { hypre_ParAMGData *amg_data = (hypre_ParAMGData*) data; if (!amg_data) { hypre_error_in_arg(1); return hypre_error_flag; } if (agg_num_levels < 0) { hypre_error_in_arg(2); return hypre_error_flag; } hypre_ParAMGDataAggNumLevels(amg_data) = agg_num_levels; return hypre_error_flag; } /*-------------------------------------------------------------------------- * Indicates the interpolation used with aggressive coarsening *--------------------------------------------------------------------------*/ HYPRE_Int hypre_BoomerAMGSetAggInterpType( void *data, HYPRE_Int agg_interp_type ) { hypre_ParAMGData *amg_data = (hypre_ParAMGData*) data; if (!amg_data) { hypre_error_in_arg(1); return hypre_error_flag; } if (agg_interp_type < 0 || agg_interp_type > 9) { hypre_error_in_arg(2); return hypre_error_flag; } hypre_ParAMGDataAggInterpType(amg_data) = agg_interp_type; return hypre_error_flag; } /*-------------------------------------------------------------------------- * Indicates max number of elements per row for aggressive coarsening * interpolation *--------------------------------------------------------------------------*/ HYPRE_Int hypre_BoomerAMGSetAggPMaxElmts( void *data, HYPRE_Int agg_P_max_elmts ) { hypre_ParAMGData *amg_data = (hypre_ParAMGData*) data; if (!amg_data) { hypre_error_in_arg(1); return hypre_error_flag; } if (agg_P_max_elmts < 0) { hypre_error_in_arg(2); return hypre_error_flag; } hypre_ParAMGDataAggPMaxElmts(amg_data) = agg_P_max_elmts; return hypre_error_flag; } /*-------------------------------------------------------------------------- * Indicates max number of elements per row for smoothed * interpolation in mult-additive or simple method *--------------------------------------------------------------------------*/ HYPRE_Int hypre_BoomerAMGSetMultAddPMaxElmts( void *data, HYPRE_Int add_P_max_elmts ) { hypre_ParAMGData *amg_data = (hypre_ParAMGData*) data; if (!amg_data) { hypre_error_in_arg(1); return hypre_error_flag; } if (add_P_max_elmts < 0) { hypre_error_in_arg(2); return hypre_error_flag; } hypre_ParAMGDataMultAddPMaxElmts(amg_data) = add_P_max_elmts; return hypre_error_flag; } /*-------------------------------------------------------------------------- * Indicates Relaxtion Type for Additive Cycle *--------------------------------------------------------------------------*/ HYPRE_Int hypre_BoomerAMGSetAddRelaxType( void *data, HYPRE_Int add_rlx_type ) { hypre_ParAMGData *amg_data = (hypre_ParAMGData*) data; if (!amg_data) { hypre_error_in_arg(1); return hypre_error_flag; } hypre_ParAMGDataAddRelaxType(amg_data) = add_rlx_type; return hypre_error_flag; } /*-------------------------------------------------------------------------- * Indicates Relaxation Weight for Additive Cycle *--------------------------------------------------------------------------*/ HYPRE_Int hypre_BoomerAMGSetAddRelaxWt( void *data, HYPRE_Real add_rlx_wt ) { hypre_ParAMGData *amg_data = (hypre_ParAMGData*) data; if (!amg_data) { hypre_error_in_arg(1); return hypre_error_flag; } hypre_ParAMGDataAddRelaxWt(amg_data) = add_rlx_wt; return hypre_error_flag; } /*-------------------------------------------------------------------------- * Indicates max number of elements per row for 1st stage of aggressive * coarsening two-stage interpolation *--------------------------------------------------------------------------*/ HYPRE_Int hypre_BoomerAMGSetAggP12MaxElmts( void *data, HYPRE_Int agg_P12_max_elmts ) { hypre_ParAMGData *amg_data = (hypre_ParAMGData*) data; if (!amg_data) { hypre_error_in_arg(1); return hypre_error_flag; } if (agg_P12_max_elmts < 0) { hypre_error_in_arg(2); return hypre_error_flag; } hypre_ParAMGDataAggP12MaxElmts(amg_data) = agg_P12_max_elmts; return hypre_error_flag; } /*-------------------------------------------------------------------------- * Indicates truncation factor for aggressive coarsening interpolation *--------------------------------------------------------------------------*/ HYPRE_Int hypre_BoomerAMGSetAggTruncFactor( void *data, HYPRE_Real agg_trunc_factor ) { hypre_ParAMGData *amg_data = (hypre_ParAMGData*) data; if (!amg_data) { hypre_error_in_arg(1); return hypre_error_flag; } if (agg_trunc_factor < 0) { hypre_error_in_arg(2); return hypre_error_flag; } hypre_ParAMGDataAggTruncFactor(amg_data) = agg_trunc_factor; return hypre_error_flag; } /*-------------------------------------------------------------------------- * Indicates the truncation factor for smoothed interpolation when using * mult-additive or simple method *--------------------------------------------------------------------------*/ HYPRE_Int hypre_BoomerAMGSetMultAddTruncFactor( void *data, HYPRE_Real add_trunc_factor ) { hypre_ParAMGData *amg_data = (hypre_ParAMGData*) data; if (!amg_data) { hypre_error_in_arg(1); return hypre_error_flag; } if (add_trunc_factor < 0) { hypre_error_in_arg(2); return hypre_error_flag; } hypre_ParAMGDataMultAddTruncFactor(amg_data) = add_trunc_factor; return hypre_error_flag; } /*-------------------------------------------------------------------------- * Indicates truncation factor for 1 stage of aggressive coarsening * two stage interpolation *--------------------------------------------------------------------------*/ HYPRE_Int hypre_BoomerAMGSetAggP12TruncFactor( void *data, HYPRE_Real agg_P12_trunc_factor ) { hypre_ParAMGData *amg_data = (hypre_ParAMGData*) data; if (!amg_data) { hypre_error_in_arg(1); return hypre_error_flag; } if (agg_P12_trunc_factor < 0) { hypre_error_in_arg(2); return hypre_error_flag; } hypre_ParAMGDataAggP12TruncFactor(amg_data) = agg_P12_trunc_factor; return hypre_error_flag; } /*-------------------------------------------------------------------------- * Indicates the number of relaxation steps for Compatible relaxation *--------------------------------------------------------------------------*/ HYPRE_Int hypre_BoomerAMGSetNumCRRelaxSteps( void *data, HYPRE_Int num_CR_relax_steps ) { hypre_ParAMGData *amg_data = (hypre_ParAMGData*) data; if (!amg_data) { hypre_error_in_arg(1); return hypre_error_flag; } if (num_CR_relax_steps < 1) { hypre_error_in_arg(2); return hypre_error_flag; } hypre_ParAMGDataNumCRRelaxSteps(amg_data) = num_CR_relax_steps; return hypre_error_flag; } /*-------------------------------------------------------------------------- * Indicates the desired convergence rate for Compatible relaxation *--------------------------------------------------------------------------*/ HYPRE_Int hypre_BoomerAMGSetCRRate( void *data, HYPRE_Real CR_rate ) { hypre_ParAMGData *amg_data = (hypre_ParAMGData*) data; if (!amg_data) { hypre_error_in_arg(1); return hypre_error_flag; } hypre_ParAMGDataCRRate(amg_data) = CR_rate; return hypre_error_flag; } /*-------------------------------------------------------------------------- * Indicates the desired convergence rate for Compatible relaxation *--------------------------------------------------------------------------*/ HYPRE_Int hypre_BoomerAMGSetCRStrongTh( void *data, HYPRE_Real CR_strong_th ) { hypre_ParAMGData *amg_data = (hypre_ParAMGData*) data; if (!amg_data) { hypre_error_in_arg(1); return hypre_error_flag; } hypre_ParAMGDataCRStrongTh(amg_data) = CR_strong_th; return hypre_error_flag; } /*-------------------------------------------------------------------------- * Indicates the drop tolerance for A-matrices from the 2nd level of AMG *--------------------------------------------------------------------------*/ HYPRE_Int hypre_BoomerAMGSetADropTol( void *data, HYPRE_Real A_drop_tol ) { hypre_ParAMGData *amg_data = (hypre_ParAMGData*) data; if (!amg_data) { hypre_error_in_arg(1); return hypre_error_flag; } hypre_ParAMGDataADropTol(amg_data) = A_drop_tol; return hypre_error_flag; } HYPRE_Int hypre_BoomerAMGSetADropType( void *data, HYPRE_Int A_drop_type ) { hypre_ParAMGData *amg_data = (hypre_ParAMGData*) data; if (!amg_data) { hypre_error_in_arg(1); return hypre_error_flag; } hypre_ParAMGDataADropType(amg_data) = A_drop_type; return hypre_error_flag; } /*-------------------------------------------------------------------------- * Indicates which independent set algorithm is used for CR *--------------------------------------------------------------------------*/ HYPRE_Int hypre_BoomerAMGSetISType( void *data, HYPRE_Int IS_type ) { hypre_ParAMGData *amg_data = (hypre_ParAMGData*) data; if (!amg_data) { hypre_error_in_arg(1); return hypre_error_flag; } if (IS_type < 0) { hypre_error_in_arg(2); return hypre_error_flag; } hypre_ParAMGDataISType(amg_data) = IS_type; return hypre_error_flag; } /*-------------------------------------------------------------------------- * Indicates whether to use CG for compatible relaxation *--------------------------------------------------------------------------*/ HYPRE_Int hypre_BoomerAMGSetCRUseCG( void *data, HYPRE_Int CR_use_CG ) { hypre_ParAMGData *amg_data = (hypre_ParAMGData*) data; if (!amg_data) { hypre_error_in_arg(1); return hypre_error_flag; } hypre_ParAMGDataCRUseCG(amg_data) = CR_use_CG; return hypre_error_flag; } HYPRE_Int hypre_BoomerAMGSetNumPoints( void *data, HYPRE_Int num_points ) { hypre_ParAMGData *amg_data = (hypre_ParAMGData*) data; if (!amg_data) { hypre_error_in_arg(1); return hypre_error_flag; } hypre_ParAMGDataNumPoints(amg_data) = num_points; return hypre_error_flag; } HYPRE_Int hypre_BoomerAMGSetDofFunc( void *data, HYPRE_Int *dof_func) { hypre_ParAMGData *amg_data = (hypre_ParAMGData*) data; if (!amg_data) { hypre_error_in_arg(1); return hypre_error_flag; } hypre_IntArrayDestroy(hypre_ParAMGDataDofFunc(amg_data)); /* NOTE: size and memory location of hypre_IntArray will be set during AMG setup */ if (dof_func == NULL) { hypre_ParAMGDataDofFunc(amg_data) = NULL; } else { hypre_ParAMGDataDofFunc(amg_data) = hypre_IntArrayCreate(-1); hypre_IntArrayData(hypre_ParAMGDataDofFunc(amg_data)) = dof_func; } return hypre_error_flag; } HYPRE_Int hypre_BoomerAMGSetPointDofMap( void *data, HYPRE_Int *point_dof_map ) { hypre_ParAMGData *amg_data = (hypre_ParAMGData*) data; if (!amg_data) { hypre_error_in_arg(1); return hypre_error_flag; } hypre_TFree(hypre_ParAMGDataPointDofMap(amg_data), HYPRE_MEMORY_HOST); hypre_ParAMGDataPointDofMap(amg_data) = point_dof_map; return hypre_error_flag; } HYPRE_Int hypre_BoomerAMGSetDofPoint( void *data, HYPRE_Int *dof_point ) { hypre_ParAMGData *amg_data = (hypre_ParAMGData*) data; if (!amg_data) { hypre_error_in_arg(1); return hypre_error_flag; } hypre_TFree(hypre_ParAMGDataDofPoint(amg_data), HYPRE_MEMORY_HOST); hypre_ParAMGDataDofPoint(amg_data) = dof_point; return hypre_error_flag; } HYPRE_Int hypre_BoomerAMGGetNumIterations( void *data, HYPRE_Int *num_iterations ) { hypre_ParAMGData *amg_data = (hypre_ParAMGData*) data; if (!amg_data) { hypre_error_in_arg(1); return hypre_error_flag; } *num_iterations = hypre_ParAMGDataNumIterations(amg_data); return hypre_error_flag; } HYPRE_Int hypre_BoomerAMGGetCumNumIterations( void *data, HYPRE_Int *cum_num_iterations ) { hypre_ParAMGData *amg_data = (hypre_ParAMGData*) data; if (!amg_data) { hypre_error_in_arg(1); return hypre_error_flag; } #ifdef CUMNUMIT *cum_num_iterations = hypre_ParAMGDataCumNumIterations(amg_data); #endif return hypre_error_flag; } HYPRE_Int hypre_BoomerAMGGetResidual( void * data, hypre_ParVector ** resid ) { hypre_ParAMGData *amg_data = (hypre_ParAMGData*) data; if (!amg_data) { hypre_error_in_arg(1); return hypre_error_flag; } *resid = hypre_ParAMGDataResidual( amg_data ); return hypre_error_flag; } HYPRE_Int hypre_BoomerAMGGetRelResidualNorm( void *data, HYPRE_Real *rel_resid_norm ) { hypre_ParAMGData *amg_data = (hypre_ParAMGData*) data; if (!amg_data) { hypre_error_in_arg(1); return hypre_error_flag; } *rel_resid_norm = hypre_ParAMGDataRelativeResidualNorm(amg_data); return hypre_error_flag; } HYPRE_Int hypre_BoomerAMGSetVariant( void *data, HYPRE_Int variant) { hypre_ParAMGData *amg_data = (hypre_ParAMGData*) data; if (!amg_data) { hypre_error_in_arg(1); return hypre_error_flag; } if (variant < 0) { hypre_error_in_arg(2); return hypre_error_flag; } hypre_ParAMGDataVariant(amg_data) = variant; return hypre_error_flag; } HYPRE_Int hypre_BoomerAMGGetVariant( void *data, HYPRE_Int * variant) { hypre_ParAMGData *amg_data = (hypre_ParAMGData*) data; if (!amg_data) { hypre_error_in_arg(1); return hypre_error_flag; } *variant = hypre_ParAMGDataVariant(amg_data); return hypre_error_flag; } HYPRE_Int hypre_BoomerAMGSetOverlap( void *data, HYPRE_Int overlap) { hypre_ParAMGData *amg_data = (hypre_ParAMGData*) data; if (!amg_data) { hypre_error_in_arg(1); return hypre_error_flag; } if (overlap < 0) { hypre_error_in_arg(2); return hypre_error_flag; } hypre_ParAMGDataOverlap(amg_data) = overlap; return hypre_error_flag; } HYPRE_Int hypre_BoomerAMGGetOverlap( void *data, HYPRE_Int * overlap) { hypre_ParAMGData *amg_data = (hypre_ParAMGData*) data; if (!amg_data) { hypre_error_in_arg(1); return hypre_error_flag; } *overlap = hypre_ParAMGDataOverlap(amg_data); return hypre_error_flag; } HYPRE_Int hypre_BoomerAMGSetDomainType( void *data, HYPRE_Int domain_type) { hypre_ParAMGData *amg_data = (hypre_ParAMGData*) data; if (!amg_data) { hypre_error_in_arg(1); return hypre_error_flag; } if (domain_type < 0) { hypre_error_in_arg(2); return hypre_error_flag; } hypre_ParAMGDataDomainType(amg_data) = domain_type; return hypre_error_flag; } HYPRE_Int hypre_BoomerAMGGetDomainType( void *data, HYPRE_Int * domain_type) { hypre_ParAMGData *amg_data = (hypre_ParAMGData*) data; if (!amg_data) { hypre_error_in_arg(1); return hypre_error_flag; } *domain_type = hypre_ParAMGDataDomainType(amg_data); return hypre_error_flag; } HYPRE_Int hypre_BoomerAMGSetSchwarzRlxWeight( void *data, HYPRE_Real schwarz_rlx_weight) { hypre_ParAMGData *amg_data = (hypre_ParAMGData*)data; if (!amg_data) { hypre_error_in_arg(1); return hypre_error_flag; } hypre_ParAMGDataSchwarzRlxWeight(amg_data) = schwarz_rlx_weight; return hypre_error_flag; } HYPRE_Int hypre_BoomerAMGGetSchwarzRlxWeight( void *data, HYPRE_Real * schwarz_rlx_weight) { hypre_ParAMGData *amg_data = (hypre_ParAMGData*) data; if (!amg_data) { hypre_error_in_arg(1); return hypre_error_flag; } *schwarz_rlx_weight = hypre_ParAMGDataSchwarzRlxWeight(amg_data); return hypre_error_flag; } HYPRE_Int hypre_BoomerAMGSetSchwarzUseNonSymm( void *data, HYPRE_Int use_nonsymm) { hypre_ParAMGData *amg_data = (hypre_ParAMGData*) data; if (!amg_data) { hypre_error_in_arg(1); return hypre_error_flag; } hypre_ParAMGDataSchwarzUseNonSymm(amg_data) = use_nonsymm; return hypre_error_flag; } HYPRE_Int hypre_BoomerAMGSetSym( void *data, HYPRE_Int sym) { hypre_ParAMGData *amg_data = (hypre_ParAMGData*) data; if (!amg_data) { hypre_error_in_arg(1); return hypre_error_flag; } hypre_ParAMGDataSym(amg_data) = sym; return hypre_error_flag; } HYPRE_Int hypre_BoomerAMGSetLevel( void *data, HYPRE_Int level) { hypre_ParAMGData *amg_data = (hypre_ParAMGData*) data; if (!amg_data) { hypre_error_in_arg(1); return hypre_error_flag; } hypre_ParAMGDataLevel(amg_data) = level; return hypre_error_flag; } HYPRE_Int hypre_BoomerAMGSetThreshold( void *data, HYPRE_Real thresh) { hypre_ParAMGData *amg_data = (hypre_ParAMGData*) data; if (!amg_data) { hypre_error_in_arg(1); return hypre_error_flag; } hypre_ParAMGDataThreshold(amg_data) = thresh; return hypre_error_flag; } HYPRE_Int hypre_BoomerAMGSetFilter( void *data, HYPRE_Real filter) { hypre_ParAMGData *amg_data = (hypre_ParAMGData*) data; if (!amg_data) { hypre_error_in_arg(1); return hypre_error_flag; } hypre_ParAMGDataFilter(amg_data) = filter; return hypre_error_flag; } HYPRE_Int hypre_BoomerAMGSetDropTol( void *data, HYPRE_Real drop_tol) { hypre_ParAMGData *amg_data = (hypre_ParAMGData*) data; if (!amg_data) { hypre_error_in_arg(1); return hypre_error_flag; } hypre_ParAMGDataDropTol(amg_data) = drop_tol; return hypre_error_flag; } HYPRE_Int hypre_BoomerAMGSetMaxNzPerRow( void *data, HYPRE_Int max_nz_per_row) { hypre_ParAMGData *amg_data = (hypre_ParAMGData*) data; if (!amg_data) { hypre_error_in_arg(1); return hypre_error_flag; } if (max_nz_per_row < 0) { hypre_error_in_arg(2); return hypre_error_flag; } hypre_ParAMGDataMaxNzPerRow(amg_data) = max_nz_per_row; return hypre_error_flag; } HYPRE_Int hypre_BoomerAMGSetEuclidFile( void *data, char *euclidfile) { hypre_ParAMGData *amg_data = (hypre_ParAMGData*) data; if (!amg_data) { hypre_error_in_arg(1); return hypre_error_flag; } hypre_ParAMGDataEuclidFile(amg_data) = euclidfile; return hypre_error_flag; } HYPRE_Int hypre_BoomerAMGSetEuLevel( void *data, HYPRE_Int eu_level) { hypre_ParAMGData *amg_data = (hypre_ParAMGData*) data; if (!amg_data) { hypre_error_in_arg(1); return hypre_error_flag; } hypre_ParAMGDataEuLevel(amg_data) = eu_level; return hypre_error_flag; } HYPRE_Int hypre_BoomerAMGSetEuSparseA( void *data, HYPRE_Real eu_sparse_A) { hypre_ParAMGData *amg_data = (hypre_ParAMGData*) data; if (!amg_data) { hypre_error_in_arg(1); return hypre_error_flag; } hypre_ParAMGDataEuSparseA(amg_data) = eu_sparse_A; return hypre_error_flag; } HYPRE_Int hypre_BoomerAMGSetEuBJ( void *data, HYPRE_Int eu_bj) { hypre_ParAMGData *amg_data = (hypre_ParAMGData*) data; if (!amg_data) { hypre_error_in_arg(1); return hypre_error_flag; } hypre_ParAMGDataEuBJ(amg_data) = eu_bj; return hypre_error_flag; } HYPRE_Int hypre_BoomerAMGSetILUType( void *data, HYPRE_Int ilu_type) { hypre_ParAMGData *amg_data = (hypre_ParAMGData*) data; if (!amg_data) { hypre_error_in_arg(1); return hypre_error_flag; } hypre_ParAMGDataILUType(amg_data) = ilu_type; return hypre_error_flag; } HYPRE_Int hypre_BoomerAMGSetILULevel( void *data, HYPRE_Int ilu_lfil) { hypre_ParAMGData *amg_data = (hypre_ParAMGData*) data; if (!amg_data) { hypre_error_in_arg(1); return hypre_error_flag; } hypre_ParAMGDataILULevel(amg_data) = ilu_lfil; return hypre_error_flag; } HYPRE_Int hypre_BoomerAMGSetILUDroptol( void *data, HYPRE_Real ilu_droptol) { hypre_ParAMGData *amg_data = (hypre_ParAMGData*) data; if (!amg_data) { hypre_error_in_arg(1); return hypre_error_flag; } hypre_ParAMGDataILUDroptol(amg_data) = ilu_droptol; return hypre_error_flag; } HYPRE_Int hypre_BoomerAMGSetILUTriSolve( void *data, HYPRE_Int ilu_tri_solve) { hypre_ParAMGData *amg_data = (hypre_ParAMGData*) data; if (!amg_data) { hypre_error_in_arg(1); return hypre_error_flag; } hypre_ParAMGDataILUTriSolve(amg_data) = ilu_tri_solve; return hypre_error_flag; } HYPRE_Int hypre_BoomerAMGSetILULowerJacobiIters( void *data, HYPRE_Int ilu_lower_jacobi_iters) { hypre_ParAMGData *amg_data = (hypre_ParAMGData*) data; if (!amg_data) { hypre_error_in_arg(1); return hypre_error_flag; } hypre_ParAMGDataILULowerJacobiIters(amg_data) = ilu_lower_jacobi_iters; return hypre_error_flag; } HYPRE_Int hypre_BoomerAMGSetILUUpperJacobiIters( void *data, HYPRE_Int ilu_upper_jacobi_iters) { hypre_ParAMGData *amg_data = (hypre_ParAMGData*) data; if (!amg_data) { hypre_error_in_arg(1); return hypre_error_flag; } hypre_ParAMGDataILUUpperJacobiIters(amg_data) = ilu_upper_jacobi_iters; return hypre_error_flag; } HYPRE_Int hypre_BoomerAMGSetILUMaxIter( void *data, HYPRE_Int ilu_max_iter) { hypre_ParAMGData *amg_data = (hypre_ParAMGData*) data; if (!amg_data) { hypre_error_in_arg(1); return hypre_error_flag; } hypre_ParAMGDataILUMaxIter(amg_data) = ilu_max_iter; return hypre_error_flag; } HYPRE_Int hypre_BoomerAMGSetILUMaxRowNnz( void *data, HYPRE_Int ilu_max_row_nnz) { hypre_ParAMGData *amg_data = (hypre_ParAMGData*) data; if (!amg_data) { hypre_error_in_arg(1); return hypre_error_flag; } hypre_ParAMGDataILUMaxRowNnz(amg_data) = ilu_max_row_nnz; return hypre_error_flag; } HYPRE_Int hypre_BoomerAMGSetILULocalReordering( void *data, HYPRE_Int ilu_reordering_type) { hypre_ParAMGData *amg_data = (hypre_ParAMGData*) data; if (!amg_data) { hypre_error_in_arg(1); return hypre_error_flag; } hypre_ParAMGDataILULocalReordering(amg_data) = ilu_reordering_type; return hypre_error_flag; } HYPRE_Int hypre_BoomerAMGSetILUIterSetupType( void *data, HYPRE_Int ilu_iter_setup_type) { hypre_ParAMGData *amg_data = (hypre_ParAMGData*) data; if (!amg_data) { hypre_error_in_arg(1); return hypre_error_flag; } hypre_ParAMGDataILUIterSetupType(amg_data) = ilu_iter_setup_type; return hypre_error_flag; } HYPRE_Int hypre_BoomerAMGSetILUIterSetupOption( void *data, HYPRE_Int ilu_iter_setup_option) { hypre_ParAMGData *amg_data = (hypre_ParAMGData*) data; if (!amg_data) { hypre_error_in_arg(1); return hypre_error_flag; } hypre_ParAMGDataILUIterSetupOption(amg_data) = ilu_iter_setup_option; return hypre_error_flag; } HYPRE_Int hypre_BoomerAMGSetILUIterSetupMaxIter( void *data, HYPRE_Int ilu_iter_setup_max_iter) { hypre_ParAMGData *amg_data = (hypre_ParAMGData*) data; if (!amg_data) { hypre_error_in_arg(1); return hypre_error_flag; } hypre_ParAMGDataILUIterSetupMaxIter(amg_data) = ilu_iter_setup_max_iter; return hypre_error_flag; } HYPRE_Int hypre_BoomerAMGSetILUIterSetupTolerance( void *data, HYPRE_Real ilu_iter_setup_tolerance) { hypre_ParAMGData *amg_data = (hypre_ParAMGData*) data; if (!amg_data) { hypre_error_in_arg(1); return hypre_error_flag; } hypre_ParAMGDataILUIterSetupTolerance(amg_data) = ilu_iter_setup_tolerance; return hypre_error_flag; } HYPRE_Int hypre_BoomerAMGSetFSAIAlgoType( void *data, HYPRE_Int fsai_algo_type) { hypre_ParAMGData *amg_data = (hypre_ParAMGData*) data; if (!amg_data) { hypre_error_in_arg(1); return hypre_error_flag; } hypre_ParAMGDataFSAIAlgoType(amg_data) = fsai_algo_type; return hypre_error_flag; } HYPRE_Int hypre_BoomerAMGSetFSAILocalSolveType( void *data, HYPRE_Int fsai_local_solve_type) { hypre_ParAMGData *amg_data = (hypre_ParAMGData*) data; if (!amg_data) { hypre_error_in_arg(1); return hypre_error_flag; } hypre_ParAMGDataFSAILocalSolveType(amg_data) = fsai_local_solve_type; return hypre_error_flag; } HYPRE_Int hypre_BoomerAMGSetFSAIMaxSteps( void *data, HYPRE_Int fsai_max_steps) { hypre_ParAMGData *amg_data = (hypre_ParAMGData*) data; if (!amg_data) { hypre_error_in_arg(1); return hypre_error_flag; } hypre_ParAMGDataFSAIMaxSteps(amg_data) = fsai_max_steps; return hypre_error_flag; } HYPRE_Int hypre_BoomerAMGSetFSAIMaxStepSize( void *data, HYPRE_Int fsai_max_step_size) { hypre_ParAMGData *amg_data = (hypre_ParAMGData*) data; if (!amg_data) { hypre_error_in_arg(1); return hypre_error_flag; } hypre_ParAMGDataFSAIMaxStepSize(amg_data) = fsai_max_step_size; return hypre_error_flag; } HYPRE_Int hypre_BoomerAMGSetFSAIMaxNnzRow( void *data, HYPRE_Int fsai_max_nnz_row) { hypre_ParAMGData *amg_data = (hypre_ParAMGData*) data; if (!amg_data) { hypre_error_in_arg(1); return hypre_error_flag; } hypre_ParAMGDataFSAIMaxNnzRow(amg_data) = fsai_max_nnz_row; return hypre_error_flag; } HYPRE_Int hypre_BoomerAMGSetFSAINumLevels( void *data, HYPRE_Int fsai_num_levels) { hypre_ParAMGData *amg_data = (hypre_ParAMGData*) data; if (!amg_data) { hypre_error_in_arg(1); return hypre_error_flag; } hypre_ParAMGDataFSAINumLevels(amg_data) = fsai_num_levels; return hypre_error_flag; } HYPRE_Int hypre_BoomerAMGSetFSAIThreshold( void *data, HYPRE_Real fsai_threshold) { hypre_ParAMGData *amg_data = (hypre_ParAMGData*) data; if (!amg_data) { hypre_error_in_arg(1); return hypre_error_flag; } hypre_ParAMGDataFSAIThreshold(amg_data) = fsai_threshold; return hypre_error_flag; } HYPRE_Int hypre_BoomerAMGSetFSAIEigMaxIters( void *data, HYPRE_Int fsai_eig_max_iters) { hypre_ParAMGData *amg_data = (hypre_ParAMGData*) data; if (!amg_data) { hypre_error_in_arg(1); return hypre_error_flag; } hypre_ParAMGDataFSAIEigMaxIters(amg_data) = fsai_eig_max_iters; return hypre_error_flag; } HYPRE_Int hypre_BoomerAMGSetFSAIKapTolerance( void *data, HYPRE_Real fsai_kap_tolerance) { hypre_ParAMGData *amg_data = (hypre_ParAMGData*) data; if (!amg_data) { hypre_error_in_arg(1); return hypre_error_flag; } hypre_ParAMGDataFSAIKapTolerance(amg_data) = fsai_kap_tolerance; return hypre_error_flag; } HYPRE_Int hypre_BoomerAMGSetChebyOrder( void *data, HYPRE_Int order) { hypre_ParAMGData *amg_data = (hypre_ParAMGData*) data; if (!amg_data) { hypre_error_in_arg(1); return hypre_error_flag; } if (order < 1) { hypre_error_in_arg(2); return hypre_error_flag; } hypre_ParAMGDataChebyOrder(amg_data) = order; return hypre_error_flag; } HYPRE_Int hypre_BoomerAMGSetChebyFraction( void *data, HYPRE_Real ratio) { hypre_ParAMGData *amg_data = (hypre_ParAMGData*) data; if (!amg_data) { hypre_error_in_arg(1); return hypre_error_flag; } if (ratio <= 0.0 || ratio > 1.0 ) { hypre_error_in_arg(2); return hypre_error_flag; } hypre_ParAMGDataChebyFraction(amg_data) = ratio; return hypre_error_flag; } HYPRE_Int hypre_BoomerAMGSetChebyEigEst( void *data, HYPRE_Int cheby_eig_est) { hypre_ParAMGData *amg_data = (hypre_ParAMGData*) data; if (!amg_data) { hypre_error_in_arg(1); return hypre_error_flag; } if (cheby_eig_est < 0) { hypre_error_in_arg(2); return hypre_error_flag; } hypre_ParAMGDataChebyEigEst(amg_data) = cheby_eig_est; return hypre_error_flag; } HYPRE_Int hypre_BoomerAMGSetChebyVariant( void *data, HYPRE_Int cheby_variant) { hypre_ParAMGData *amg_data = (hypre_ParAMGData*) data; if (!amg_data) { hypre_error_in_arg(1); return hypre_error_flag; } hypre_ParAMGDataChebyVariant(amg_data) = cheby_variant; return hypre_error_flag; } HYPRE_Int hypre_BoomerAMGSetChebyScale( void *data, HYPRE_Int cheby_scale) { hypre_ParAMGData *amg_data = (hypre_ParAMGData*) data; if (!amg_data) { hypre_error_in_arg(1); return hypre_error_flag; } hypre_ParAMGDataChebyScale(amg_data) = cheby_scale; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_BoomerAMGSetInterpVectors * -used for post-interpolation fitting of smooth vectors *--------------------------------------------------------------------------*/ HYPRE_Int hypre_BoomerAMGSetInterpVectors(void *solver, HYPRE_Int num_vectors, hypre_ParVector **interp_vectors) { hypre_ParAMGData *amg_data = (hypre_ParAMGData*) solver; if (!amg_data) { hypre_error_in_arg(1); return hypre_error_flag; } hypre_ParAMGInterpVectors(amg_data) = interp_vectors; hypre_ParAMGNumInterpVectors(amg_data) = num_vectors; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_BoomerAMGSetInterpVectorValues * -used for post-interpolation fitting of smooth vectors *--------------------------------------------------------------------------*/ /*HYPRE_Int hypre_BoomerAMGSetInterpVectorValues(void *solver, HYPRE_Int num_vectors, HYPRE_Complex *interp_vector_values) { hypre_ParAMGData *amg_data = solver; if (!amg_data) { hypre_error_in_arg(1); return hypre_error_flag; } hypre_ParAMGInterpVectors(amg_data) = interp_vectors; hypre_ParAMGNumInterpVectors(amg_data) = num_vectors; return hypre_error_flag; }*/ HYPRE_Int hypre_BoomerAMGSetInterpVecVariant(void *solver, HYPRE_Int var) { hypre_ParAMGData *amg_data = (hypre_ParAMGData*) solver; if (!amg_data) { hypre_error_in_arg(1); return hypre_error_flag; } if (var < 1) { var = 0; } if (var > 3) { var = 3; } hypre_ParAMGInterpVecVariant(amg_data) = var; return hypre_error_flag; } HYPRE_Int hypre_BoomerAMGSetInterpVecQMax( void *data, HYPRE_Int q_max) { hypre_ParAMGData *amg_data = (hypre_ParAMGData*) data; if (!amg_data) { hypre_error_in_arg(1); return hypre_error_flag; } hypre_ParAMGInterpVecQMax(amg_data) = q_max; return hypre_error_flag; } HYPRE_Int hypre_BoomerAMGSetInterpVecAbsQTrunc( void *data, HYPRE_Real q_trunc) { hypre_ParAMGData *amg_data = (hypre_ParAMGData*) data; if (!amg_data) { hypre_error_in_arg(1); return hypre_error_flag; } hypre_ParAMGInterpVecAbsQTrunc(amg_data) = q_trunc; return hypre_error_flag; } HYPRE_Int hypre_BoomerAMGSetSmoothInterpVectors(void *solver, HYPRE_Int smooth_interp_vectors) { hypre_ParAMGData *amg_data = (hypre_ParAMGData*) solver; if (!amg_data) { hypre_error_in_arg(1); return hypre_error_flag; } hypre_ParAMGSmoothInterpVectors(amg_data) = smooth_interp_vectors; return hypre_error_flag; } HYPRE_Int hypre_BoomerAMGSetInterpRefine( void *data, HYPRE_Int num_refine ) { hypre_ParAMGData *amg_data = (hypre_ParAMGData*) data; if (!amg_data) { hypre_error_in_arg(1); return hypre_error_flag; } hypre_ParAMGInterpRefine(amg_data) = num_refine; return hypre_error_flag; } HYPRE_Int hypre_BoomerAMGSetInterpVecFirstLevel( void *data, HYPRE_Int level ) { hypre_ParAMGData *amg_data = (hypre_ParAMGData*) data; if (!amg_data) { hypre_error_in_arg(1); return hypre_error_flag; } hypre_ParAMGInterpVecFirstLevel(amg_data) = level; return hypre_error_flag; } HYPRE_Int hypre_BoomerAMGSetAdditive( void *data, HYPRE_Int additive ) { hypre_ParAMGData *amg_data = (hypre_ParAMGData*) data; if (!amg_data) { hypre_error_in_arg(1); return hypre_error_flag; } hypre_ParAMGDataAdditive(amg_data) = additive; return hypre_error_flag; } HYPRE_Int hypre_BoomerAMGGetAdditive( void *data, HYPRE_Int * additive ) { hypre_ParAMGData *amg_data = (hypre_ParAMGData*) data; if (!amg_data) { hypre_error_in_arg(1); return hypre_error_flag; } *additive = hypre_ParAMGDataAdditive(amg_data); return hypre_error_flag; } HYPRE_Int hypre_BoomerAMGSetMultAdditive( void *data, HYPRE_Int mult_additive ) { hypre_ParAMGData *amg_data = (hypre_ParAMGData*) data; if (!amg_data) { hypre_error_in_arg(1); return hypre_error_flag; } hypre_ParAMGDataMultAdditive(amg_data) = mult_additive; return hypre_error_flag; } HYPRE_Int hypre_BoomerAMGGetMultAdditive( void *data, HYPRE_Int * mult_additive ) { hypre_ParAMGData *amg_data = (hypre_ParAMGData*) data; if (!amg_data) { hypre_error_in_arg(1); return hypre_error_flag; } *mult_additive = hypre_ParAMGDataMultAdditive(amg_data); return hypre_error_flag; } HYPRE_Int hypre_BoomerAMGSetSimple( void *data, HYPRE_Int simple ) { hypre_ParAMGData *amg_data = (hypre_ParAMGData*) data; if (!amg_data) { hypre_error_in_arg(1); return hypre_error_flag; } hypre_ParAMGDataSimple(amg_data) = simple; return hypre_error_flag; } HYPRE_Int hypre_BoomerAMGGetSimple( void *data, HYPRE_Int * simple ) { hypre_ParAMGData *amg_data = (hypre_ParAMGData*) data; if (!amg_data) { hypre_error_in_arg(1); return hypre_error_flag; } *simple = hypre_ParAMGDataSimple(amg_data); return hypre_error_flag; } HYPRE_Int hypre_BoomerAMGSetAddLastLvl( void *data, HYPRE_Int add_last_lvl ) { hypre_ParAMGData *amg_data = (hypre_ParAMGData*) data; if (!amg_data) { hypre_error_in_arg(1); return hypre_error_flag; } hypre_ParAMGDataAddLastLvl(amg_data) = add_last_lvl; return hypre_error_flag; } HYPRE_Int hypre_BoomerAMGSetNonGalerkinTol( void *data, HYPRE_Real nongalerkin_tol) { hypre_ParAMGData *amg_data = (hypre_ParAMGData*) data; HYPRE_Int i, max_num_levels; HYPRE_Real *nongal_tol_array; if (!amg_data) { hypre_error_in_arg(1); return hypre_error_flag; } if (nongalerkin_tol < 0) { hypre_error_in_arg(2); return hypre_error_flag; } max_num_levels = hypre_ParAMGDataMaxLevels(amg_data); nongal_tol_array = hypre_ParAMGDataNonGalTolArray(amg_data); if (nongal_tol_array == NULL) { nongal_tol_array = hypre_CTAlloc(HYPRE_Real, max_num_levels, HYPRE_MEMORY_HOST); hypre_ParAMGDataNonGalTolArray(amg_data) = nongal_tol_array; } hypre_ParAMGDataNonGalerkinTol(amg_data) = nongalerkin_tol; for (i = 0; i < max_num_levels; i++) { nongal_tol_array[i] = nongalerkin_tol; } return hypre_error_flag; } HYPRE_Int hypre_BoomerAMGSetLevelNonGalerkinTol( void *data, HYPRE_Real nongalerkin_tol, HYPRE_Int level) { hypre_ParAMGData *amg_data = (hypre_ParAMGData*) data; HYPRE_Real *nongal_tol_array; HYPRE_Int max_num_levels; if (!amg_data) { hypre_error_in_arg(1); return hypre_error_flag; } if (nongalerkin_tol < 0) { hypre_error_in_arg(2); return hypre_error_flag; } nongal_tol_array = hypre_ParAMGDataNonGalTolArray(amg_data); max_num_levels = hypre_ParAMGDataMaxLevels(amg_data); if (nongal_tol_array == NULL) { nongal_tol_array = hypre_CTAlloc(HYPRE_Real, max_num_levels, HYPRE_MEMORY_HOST); hypre_ParAMGDataNonGalTolArray(amg_data) = nongal_tol_array; } if (level + 1 > max_num_levels) { hypre_error_in_arg(3); return hypre_error_flag; } nongal_tol_array[level] = nongalerkin_tol; return hypre_error_flag; } HYPRE_Int hypre_BoomerAMGSetNonGalerkTol( void *data, HYPRE_Int nongalerk_num_tol, HYPRE_Real *nongalerk_tol) { hypre_ParAMGData *amg_data = (hypre_ParAMGData*) data; hypre_ParAMGDataNonGalerkNumTol(amg_data) = nongalerk_num_tol; hypre_ParAMGDataNonGalerkTol(amg_data) = nongalerk_tol; return hypre_error_flag; } HYPRE_Int hypre_BoomerAMGSetRAP2( void *data, HYPRE_Int rap2 ) { hypre_ParAMGData *amg_data = (hypre_ParAMGData*) data; hypre_ParAMGDataRAP2(amg_data) = rap2; return hypre_error_flag; } HYPRE_Int hypre_BoomerAMGSetModuleRAP2( void *data, HYPRE_Int mod_rap2 ) { hypre_ParAMGData *amg_data = (hypre_ParAMGData*) data; hypre_ParAMGDataModularizedMatMat(amg_data) = mod_rap2; return hypre_error_flag; } HYPRE_Int hypre_BoomerAMGSetKeepTranspose( void *data, HYPRE_Int keepTranspose) { hypre_ParAMGData *amg_data = (hypre_ParAMGData*) data; hypre_ParAMGDataKeepTranspose(amg_data) = keepTranspose; return hypre_error_flag; } #ifdef HYPRE_USING_DSUPERLU HYPRE_Int hypre_BoomerAMGSetDSLUThreshold( void *data, HYPRE_Int dslu_threshold) { hypre_ParAMGData *amg_data = (hypre_ParAMGData*) data; hypre_ParAMGDataDSLUThreshold(amg_data) = dslu_threshold; return hypre_error_flag; } #endif HYPRE_Int hypre_BoomerAMGSetCPoints(void *data, HYPRE_Int cpt_coarse_level, HYPRE_Int num_cpt_coarse, HYPRE_BigInt *cpt_coarse_index) { hypre_ParAMGData *amg_data = (hypre_ParAMGData*) data; HYPRE_BigInt *C_points_marker = NULL; HYPRE_Int *C_points_local_marker = NULL; HYPRE_Int cpt_level; if (!amg_data) { hypre_error_w_msg(HYPRE_ERROR_GENERIC, "Warning! AMG object empty!\n"); hypre_error_in_arg(1); return hypre_error_flag; } if (cpt_coarse_level < 0) { hypre_error_w_msg(HYPRE_ERROR_GENERIC, "Warning! cpt_coarse_level < 0 !\n"); hypre_error_in_arg(2); return hypre_error_flag; } if (num_cpt_coarse < 0) { hypre_error_w_msg(HYPRE_ERROR_GENERIC, "Warning! num_cpt_coarse < 0 !\n"); hypre_error_in_arg(3); return hypre_error_flag; } HYPRE_MemoryLocation memory_location = hypre_ParAMGDataMemoryLocation(amg_data); /* free data not previously destroyed */ if (hypre_ParAMGDataCPointsLevel(amg_data)) { hypre_TFree(hypre_ParAMGDataCPointsMarker(amg_data), memory_location); hypre_TFree(hypre_ParAMGDataCPointsLocalMarker(amg_data), memory_location); } /* set Cpoint data */ if (hypre_ParAMGDataMaxLevels(amg_data) < cpt_coarse_level) { cpt_level = hypre_ParAMGDataNumLevels(amg_data); } else { cpt_level = cpt_coarse_level; } if (cpt_level) { C_points_marker = hypre_CTAlloc(HYPRE_BigInt, num_cpt_coarse, memory_location); C_points_local_marker = hypre_CTAlloc(HYPRE_Int, num_cpt_coarse, memory_location); hypre_TMemcpy(C_points_marker, cpt_coarse_index, HYPRE_BigInt, num_cpt_coarse, memory_location, HYPRE_MEMORY_HOST); } hypre_ParAMGDataCPointsMarker(amg_data) = C_points_marker; hypre_ParAMGDataCPointsLocalMarker(amg_data) = C_points_local_marker; hypre_ParAMGDataNumCPoints(amg_data) = num_cpt_coarse; hypre_ParAMGDataCPointsLevel(amg_data) = cpt_level; return hypre_error_flag; } HYPRE_Int hypre_BoomerAMGSetFPoints(void *data, HYPRE_Int isolated, HYPRE_Int num_points, HYPRE_BigInt *indices) { hypre_ParAMGData *amg_data = (hypre_ParAMGData*) data; HYPRE_BigInt *marker = NULL; HYPRE_Int i; if (!amg_data) { hypre_error_w_msg(HYPRE_ERROR_GENERIC, "AMG object empty!\n"); hypre_error_in_arg(1); return hypre_error_flag; } if (num_points < 0) { hypre_error_w_msg(HYPRE_ERROR_GENERIC, "Warning! negative number of points!\n"); hypre_error_in_arg(2); return hypre_error_flag; } if ((num_points > 0) && (!indices)) { hypre_error_w_msg(HYPRE_ERROR_GENERIC, "Warning! indices not given!\n"); hypre_error_in_arg(4); return hypre_error_flag; } /* Set marker data */ if (num_points > 0) { marker = hypre_CTAlloc(HYPRE_BigInt, num_points, HYPRE_MEMORY_HOST); for (i = 0; i < num_points; i++) { marker[i] = indices[i]; } } if (isolated) { /* Free data not previously destroyed */ if (hypre_ParAMGDataIsolatedFPointsMarker(amg_data)) { hypre_TFree(hypre_ParAMGDataIsolatedFPointsMarker(amg_data), HYPRE_MEMORY_HOST); hypre_ParAMGDataIsolatedFPointsMarker(amg_data) = NULL; } hypre_ParAMGDataNumIsolatedFPoints(amg_data) = num_points; hypre_ParAMGDataIsolatedFPointsMarker(amg_data) = marker; } else { /* Free data not previously destroyed */ if (hypre_ParAMGDataFPointsMarker(amg_data)) { hypre_TFree(hypre_ParAMGDataFPointsMarker(amg_data), HYPRE_MEMORY_HOST); hypre_ParAMGDataFPointsMarker(amg_data) = NULL; } hypre_ParAMGDataNumFPoints(amg_data) = num_points; hypre_ParAMGDataFPointsMarker(amg_data) = marker; } return hypre_error_flag; } HYPRE_Int hypre_BoomerAMGSetCumNnzAP( void *data, HYPRE_Real cum_nnz_AP ) { hypre_ParAMGData *amg_data = (hypre_ParAMGData*) data; if (!amg_data) { hypre_error_in_arg(1); return hypre_error_flag; } hypre_ParAMGDataCumNnzAP(amg_data) = cum_nnz_AP; return hypre_error_flag; } HYPRE_Int hypre_BoomerAMGGetCumNnzAP( void *data, HYPRE_Real *cum_nnz_AP ) { hypre_ParAMGData *amg_data = (hypre_ParAMGData*) data; if (!amg_data) { hypre_error_in_arg(1); return hypre_error_flag; } *cum_nnz_AP = hypre_ParAMGDataCumNnzAP(amg_data); return hypre_error_flag; } hypre-2.33.0/src/parcsr_ls/par_amg.h000066400000000000000000000640631477326011500173030ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #ifndef hypre_ParAMG_DATA_HEADER #define hypre_ParAMG_DATA_HEADER #define CUMNUMIT #include "par_csr_block_matrix.h" /*-------------------------------------------------------------------------- * hypre_ParAMGData *--------------------------------------------------------------------------*/ typedef struct { /* Base solver data structure */ hypre_Solver base; /* Memory location of matrices/vectors in AMGData */ HYPRE_MemoryLocation memory_location; /* setup params */ HYPRE_Int max_levels; HYPRE_Real strong_threshold; HYPRE_Int coarsen_cut_factor; HYPRE_Real strong_thresholdR; /* theta for build R: defines strong F neighbors */ HYPRE_Real filter_thresholdR; /* theta for filtering R */ HYPRE_Real max_row_sum; HYPRE_Real trunc_factor; HYPRE_Real agg_trunc_factor; HYPRE_Real agg_P12_trunc_factor; HYPRE_Real jacobi_trunc_threshold; HYPRE_Real S_commpkg_switch; HYPRE_Real CR_rate; HYPRE_Real CR_strong_th; HYPRE_Real A_drop_tol; HYPRE_Int A_drop_type; HYPRE_Int measure_type; HYPRE_Int setup_type; HYPRE_Int coarsen_type; HYPRE_Int P_max_elmts; HYPRE_Int interp_type; HYPRE_Int sep_weight; HYPRE_Int agg_interp_type; HYPRE_Int agg_P_max_elmts; HYPRE_Int agg_P12_max_elmts; HYPRE_Int restr_par; HYPRE_Int is_triangular; HYPRE_Int gmres_switch; HYPRE_Int agg_num_levels; HYPRE_Int num_paths; HYPRE_Int post_interp_type; HYPRE_Int num_CR_relax_steps; HYPRE_Int IS_type; HYPRE_Int CR_use_CG; HYPRE_Int cgc_its; HYPRE_Int max_coarse_size; HYPRE_Int min_coarse_size; HYPRE_Int seq_threshold; HYPRE_Int redundant; HYPRE_Int participate; HYPRE_Int Sabs; /* solve params */ HYPRE_Int max_iter; HYPRE_Int min_iter; HYPRE_Int fcycle; HYPRE_Int cycle_type; HYPRE_Int *num_grid_sweeps; HYPRE_Int *grid_relax_type; HYPRE_Int **grid_relax_points; HYPRE_Int relax_order; HYPRE_Int user_coarse_relax_type; HYPRE_Int user_relax_type; HYPRE_Int user_num_sweeps; HYPRE_Real user_relax_weight; HYPRE_Real outer_wt; HYPRE_Real *relax_weight; HYPRE_Real *omega; HYPRE_Int converge_type; HYPRE_Real tol; HYPRE_Int partial_cycle_coarsest_level; HYPRE_Int partial_cycle_control; /* problem data */ hypre_ParCSRMatrix *A; HYPRE_Int num_variables; HYPRE_Int num_functions; HYPRE_Int filter_functions; HYPRE_Int nodal; HYPRE_Int nodal_levels; HYPRE_Int nodal_diag; HYPRE_Int keep_same_sign; HYPRE_Int num_points; hypre_IntArray *dof_func; HYPRE_Int *dof_point; HYPRE_Int *point_dof_map; /* data generated in the setup phase */ hypre_ParCSRMatrix **A_array; hypre_ParVector **F_array; hypre_ParVector **U_array; hypre_ParCSRMatrix **P_array; hypre_ParCSRMatrix **R_array; hypre_IntArray **CF_marker_array; hypre_IntArray **dof_func_array; HYPRE_Int **dof_point_array; HYPRE_Int **point_dof_map_array; HYPRE_Int num_levels; hypre_Vector **l1_norms; /* Block data */ hypre_ParCSRBlockMatrix **A_block_array; hypre_ParCSRBlockMatrix **P_block_array; hypre_ParCSRBlockMatrix **R_block_array; HYPRE_Int block_mode; /* data for more complex smoothers */ HYPRE_Int smooth_num_levels; HYPRE_Int smooth_type; HYPRE_Solver *smoother; HYPRE_Int smooth_num_sweeps; HYPRE_Int schw_variant; HYPRE_Int schw_overlap; HYPRE_Int schw_domain_type; HYPRE_Real schwarz_rlx_weight; HYPRE_Int schwarz_use_nonsymm; HYPRE_Int ps_sym; HYPRE_Int ps_level; HYPRE_Int pi_max_nz_per_row; HYPRE_Int eu_level; HYPRE_Int eu_bj; HYPRE_Real ps_threshold; HYPRE_Real ps_filter; HYPRE_Real pi_drop_tol; HYPRE_Real eu_sparse_A; char *euclidfile; /* ILU parameters */ HYPRE_Int ilu_lfil; HYPRE_Int ilu_type; HYPRE_Int ilu_max_row_nnz; HYPRE_Int ilu_max_iter; HYPRE_Real ilu_droptol; HYPRE_Int ilu_tri_solve; HYPRE_Int ilu_lower_jacobi_iters; HYPRE_Int ilu_upper_jacobi_iters; HYPRE_Int ilu_reordering_type; HYPRE_Int ilu_iter_setup_type; HYPRE_Int ilu_iter_setup_option; HYPRE_Int ilu_iter_setup_max_iter; HYPRE_Real ilu_iter_setup_tolerance; /* FSAI parameters */ HYPRE_Int fsai_algo_type; HYPRE_Int fsai_local_solve_type; HYPRE_Int fsai_max_steps; HYPRE_Int fsai_max_step_size; HYPRE_Int fsai_max_nnz_row; HYPRE_Int fsai_num_levels; HYPRE_Real fsai_threshold; HYPRE_Int fsai_eig_max_iters; HYPRE_Real fsai_kap_tolerance; HYPRE_Real *max_eig_est; HYPRE_Real *min_eig_est; HYPRE_Int cheby_eig_est; HYPRE_Int cheby_order; HYPRE_Int cheby_variant; HYPRE_Int cheby_scale; HYPRE_Real cheby_fraction; hypre_Vector **cheby_ds; HYPRE_Real **cheby_coefs; HYPRE_Real cum_nnz_AP; /* data needed for non-Galerkin option */ HYPRE_Int nongalerk_num_tol; HYPRE_Real *nongalerk_tol; HYPRE_Real nongalerkin_tol; HYPRE_Real *nongal_tol_array; /* data generated in the solve phase */ hypre_ParVector *Vtemp; hypre_Vector *Vtemp_local; HYPRE_Real *Vtemp_local_data; HYPRE_Real cycle_op_count; hypre_ParVector *Rtemp; hypre_ParVector *Ptemp; hypre_ParVector *Ztemp; /* fields used by GSMG and LS interpolation */ HYPRE_Int gsmg; /* nonzero indicates use of GSMG */ HYPRE_Int num_samples; /* number of sample vectors */ /* log info */ HYPRE_Int logging; HYPRE_Int num_iterations; #ifdef CUMNUMIT HYPRE_Int cum_num_iterations; #endif HYPRE_Real rel_resid_norm; hypre_ParVector *residual; /* available if logging>1 */ /* output params */ HYPRE_Int print_level; char log_file_name[256]; HYPRE_Int debug_flag; /* whether to print the constructed coarse grids BM Oct 22, 2006 */ HYPRE_Int plot_grids; char plot_filename[251]; /* coordinate data BM Oct 17, 2006 */ HYPRE_Int coorddim; float *coordinates; /* data for fitting vectors in interpolation */ HYPRE_Int num_interp_vectors; HYPRE_Int num_levels_interp_vectors; /* not set by user */ hypre_ParVector **interp_vectors; hypre_ParVector ***interp_vectors_array; HYPRE_Int interp_vec_variant; HYPRE_Int interp_vec_first_level; HYPRE_Real interp_vectors_abs_q_trunc; HYPRE_Int interp_vectors_q_max; HYPRE_Int interp_refine; HYPRE_Int smooth_interp_vectors; HYPRE_Real *expandp_weights; /* currently not set by user */ /* enable redundant coarse grid solve */ HYPRE_Solver coarse_solver; hypre_ParCSRMatrix *A_coarse; hypre_ParVector *f_coarse; hypre_ParVector *u_coarse; MPI_Comm new_comm; /* store matrix, vector and communication info for Gaussian elimination */ HYPRE_MemoryLocation ge_memory_location; HYPRE_Int gs_setup; HYPRE_Int *comm_info; HYPRE_Int *A_piv; HYPRE_Real *A_mat; HYPRE_Real *A_work; HYPRE_Real *b_vec; HYPRE_Real *u_vec; /* information for multiplication with Lambda - additive AMG */ HYPRE_Int additive; HYPRE_Int mult_additive; HYPRE_Int simple; HYPRE_Int add_last_lvl; HYPRE_Int add_P_max_elmts; HYPRE_Real add_trunc_factor; HYPRE_Int add_rlx_type; HYPRE_Real add_rlx_wt; hypre_ParCSRMatrix *Lambda; hypre_ParCSRMatrix *Atilde; hypre_ParVector *Rtilde; hypre_ParVector *Xtilde; HYPRE_Real *D_inv; /* Use 2 mat-mat-muls instead of triple product*/ HYPRE_Int rap2; HYPRE_Int keepTranspose; HYPRE_Int modularized_matmat; /* information for preserving indices as coarse grid points */ HYPRE_Int num_C_points; HYPRE_Int C_points_coarse_level; HYPRE_Int *C_points_local_marker; HYPRE_BigInt *C_points_marker; /* information for preserving indices as special fine grid points */ HYPRE_Int num_isolated_F_points; HYPRE_BigInt *isolated_F_points_marker; /* information for preserving indices as fine grid points */ HYPRE_Int num_F_points; HYPRE_BigInt *F_points_marker; #ifdef HYPRE_USING_DSUPERLU /* Parameters and data for SuperLU_Dist */ HYPRE_Int dslu_threshold; HYPRE_Solver dslu_solver; #endif } hypre_ParAMGData; /*-------------------------------------------------------------------------- * Accessor functions for the hypre_AMGData structure *--------------------------------------------------------------------------*/ /* setup params */ #define hypre_ParAMGDataMemoryLocation(amg_data) ((amg_data) -> memory_location) #define hypre_ParAMGDataRestriction(amg_data) ((amg_data) -> restr_par) #define hypre_ParAMGDataIsTriangular(amg_data) ((amg_data) -> is_triangular) #define hypre_ParAMGDataGMRESSwitchR(amg_data) ((amg_data) -> gmres_switch) #define hypre_ParAMGDataMaxLevels(amg_data) ((amg_data) -> max_levels) #define hypre_ParAMGDataCoarsenCutFactor(amg_data) ((amg_data) -> coarsen_cut_factor) #define hypre_ParAMGDataStrongThreshold(amg_data) ((amg_data) -> strong_threshold) #define hypre_ParAMGDataStrongThresholdR(amg_data) ((amg_data) -> strong_thresholdR) #define hypre_ParAMGDataFilterThresholdR(amg_data) ((amg_data) -> filter_thresholdR) #define hypre_ParAMGDataSabs(amg_data) ((amg_data) -> Sabs) #define hypre_ParAMGDataMaxRowSum(amg_data) ((amg_data) -> max_row_sum) #define hypre_ParAMGDataTruncFactor(amg_data) ((amg_data) -> trunc_factor) #define hypre_ParAMGDataAggTruncFactor(amg_data) ((amg_data) -> agg_trunc_factor) #define hypre_ParAMGDataAggP12TruncFactor(amg_data) ((amg_data) -> agg_P12_trunc_factor) #define hypre_ParAMGDataJacobiTruncThreshold(amg_data) ((amg_data) -> jacobi_trunc_threshold) #define hypre_ParAMGDataSCommPkgSwitch(amg_data) ((amg_data) -> S_commpkg_switch) #define hypre_ParAMGDataInterpType(amg_data) ((amg_data) -> interp_type) #define hypre_ParAMGDataSepWeight(amg_data) ((amg_data) -> sep_weight) #define hypre_ParAMGDataAggInterpType(amg_data) ((amg_data) -> agg_interp_type) #define hypre_ParAMGDataCoarsenType(amg_data) ((amg_data) -> coarsen_type) #define hypre_ParAMGDataMeasureType(amg_data) ((amg_data) -> measure_type) #define hypre_ParAMGDataSetupType(amg_data) ((amg_data) -> setup_type) #define hypre_ParAMGDataPMaxElmts(amg_data) ((amg_data) -> P_max_elmts) #define hypre_ParAMGDataAggPMaxElmts(amg_data) ((amg_data) -> agg_P_max_elmts) #define hypre_ParAMGDataAggP12MaxElmts(amg_data) ((amg_data) -> agg_P12_max_elmts) #define hypre_ParAMGDataNumPaths(amg_data) ((amg_data) -> num_paths) #define hypre_ParAMGDataAggNumLevels(amg_data) ((amg_data) -> agg_num_levels) #define hypre_ParAMGDataPostInterpType(amg_data) ((amg_data) -> post_interp_type) #define hypre_ParAMGDataNumCRRelaxSteps(amg_data) ((amg_data) -> num_CR_relax_steps) #define hypre_ParAMGDataCRRate(amg_data) ((amg_data) -> CR_rate) #define hypre_ParAMGDataCRStrongTh(amg_data) ((amg_data) -> CR_strong_th) #define hypre_ParAMGDataADropTol(amg_data) ((amg_data) -> A_drop_tol) #define hypre_ParAMGDataADropType(amg_data) ((amg_data) -> A_drop_type) #define hypre_ParAMGDataISType(amg_data) ((amg_data) -> IS_type) #define hypre_ParAMGDataCRUseCG(amg_data) ((amg_data) -> CR_use_CG) #define hypre_ParAMGDataL1Norms(amg_data) ((amg_data) -> l1_norms) #define hypre_ParAMGDataCGCIts(amg_data) ((amg_data) -> cgc_its) #define hypre_ParAMGDataMaxCoarseSize(amg_data) ((amg_data) -> max_coarse_size) #define hypre_ParAMGDataMinCoarseSize(amg_data) ((amg_data) -> min_coarse_size) #define hypre_ParAMGDataSeqThreshold(amg_data) ((amg_data) -> seq_threshold) /* solve params */ #define hypre_ParAMGDataMinIter(amg_data) ((amg_data)->min_iter) #define hypre_ParAMGDataMaxIter(amg_data) ((amg_data)->max_iter) #define hypre_ParAMGDataFCycle(amg_data) ((amg_data)->fcycle) #define hypre_ParAMGDataCycleType(amg_data) ((amg_data)->cycle_type) #define hypre_ParAMGDataConvergeType(amg_data) ((amg_data)->converge_type) #define hypre_ParAMGDataTol(amg_data) ((amg_data)->tol) #define hypre_ParAMGDataPartialCycleCoarsestLevel(amg_data) ((amg_data)->partial_cycle_coarsest_level) #define hypre_ParAMGDataPartialCycleControl(amg_data) ((amg_data)->partial_cycle_control) #define hypre_ParAMGDataNumGridSweeps(amg_data) ((amg_data)->num_grid_sweeps) #define hypre_ParAMGDataUserCoarseRelaxType(amg_data) ((amg_data)->user_coarse_relax_type) #define hypre_ParAMGDataUserRelaxType(amg_data) ((amg_data)->user_relax_type) #define hypre_ParAMGDataUserRelaxWeight(amg_data) ((amg_data)->user_relax_weight) #define hypre_ParAMGDataUserNumSweeps(amg_data) ((amg_data)->user_num_sweeps) #define hypre_ParAMGDataGridRelaxType(amg_data) ((amg_data)->grid_relax_type) #define hypre_ParAMGDataGridRelaxPoints(amg_data) ((amg_data)->grid_relax_points) #define hypre_ParAMGDataRelaxOrder(amg_data) ((amg_data)->relax_order) #define hypre_ParAMGDataRelaxWeight(amg_data) ((amg_data)->relax_weight) #define hypre_ParAMGDataOmega(amg_data) ((amg_data)->omega) #define hypre_ParAMGDataOuterWt(amg_data) ((amg_data)->outer_wt) /* problem data parameters */ #define hypre_ParAMGDataNumVariables(amg_data) ((amg_data)->num_variables) #define hypre_ParAMGDataNumFunctions(amg_data) ((amg_data)->num_functions) #define hypre_ParAMGDataFilterFunctions(amg_data) ((amg_data)->filter_functions) #define hypre_ParAMGDataNodal(amg_data) ((amg_data)->nodal) #define hypre_ParAMGDataNodalLevels(amg_data) ((amg_data)->nodal_levels) #define hypre_ParAMGDataNodalDiag(amg_data) ((amg_data)->nodal_diag) #define hypre_ParAMGDataKeepSameSign(amg_data) ((amg_data)->keep_same_sign) #define hypre_ParAMGDataNumPoints(amg_data) ((amg_data)->num_points) #define hypre_ParAMGDataDofFunc(amg_data) ((amg_data)->dof_func) #define hypre_ParAMGDataDofPoint(amg_data) ((amg_data)->dof_point) #define hypre_ParAMGDataPointDofMap(amg_data) ((amg_data)->point_dof_map) /* data generated by the setup phase */ #define hypre_ParAMGDataCFMarkerArray(amg_data) ((amg_data)-> CF_marker_array) #define hypre_ParAMGDataAArray(amg_data) ((amg_data)->A_array) #define hypre_ParAMGDataFArray(amg_data) ((amg_data)->F_array) #define hypre_ParAMGDataUArray(amg_data) ((amg_data)->U_array) #define hypre_ParAMGDataPArray(amg_data) ((amg_data)->P_array) #define hypre_ParAMGDataRArray(amg_data) ((amg_data)->R_array) #define hypre_ParAMGDataDofFuncArray(amg_data) ((amg_data)->dof_func_array) #define hypre_ParAMGDataDofPointArray(amg_data) ((amg_data)->dof_point_array) #define hypre_ParAMGDataPointDofMapArray(amg_data) \ ((amg_data)->point_dof_map_array) #define hypre_ParAMGDataNumLevels(amg_data) ((amg_data)->num_levels) #define hypre_ParAMGDataSmoothType(amg_data) ((amg_data)->smooth_type) #define hypre_ParAMGDataSmoothNumLevels(amg_data) \ ((amg_data)->smooth_num_levels) #define hypre_ParAMGDataSmoothNumSweeps(amg_data) \ ((amg_data)->smooth_num_sweeps) #define hypre_ParAMGDataSmoother(amg_data) ((amg_data)->smoother) #define hypre_ParAMGDataVariant(amg_data) ((amg_data)->schw_variant) #define hypre_ParAMGDataOverlap(amg_data) ((amg_data)->schw_overlap) #define hypre_ParAMGDataDomainType(amg_data) ((amg_data)->schw_domain_type) #define hypre_ParAMGDataSchwarzRlxWeight(amg_data) \ ((amg_data)->schwarz_rlx_weight) #define hypre_ParAMGDataSchwarzUseNonSymm(amg_data) \ ((amg_data)->schwarz_use_nonsymm) #define hypre_ParAMGDataSym(amg_data) ((amg_data)->ps_sym) #define hypre_ParAMGDataLevel(amg_data) ((amg_data)->ps_level) #define hypre_ParAMGDataMaxNzPerRow(amg_data) ((amg_data)->pi_max_nz_per_row) #define hypre_ParAMGDataThreshold(amg_data) ((amg_data)->ps_threshold) #define hypre_ParAMGDataFilter(amg_data) ((amg_data)->ps_filter) #define hypre_ParAMGDataDropTol(amg_data) ((amg_data)->pi_drop_tol) #define hypre_ParAMGDataEuclidFile(amg_data) ((amg_data)->euclidfile) #define hypre_ParAMGDataEuLevel(amg_data) ((amg_data)->eu_level) #define hypre_ParAMGDataEuSparseA(amg_data) ((amg_data)->eu_sparse_A) #define hypre_ParAMGDataEuBJ(amg_data) ((amg_data)->eu_bj) #define hypre_ParAMGDataILUType(amg_data) ((amg_data)->ilu_type) #define hypre_ParAMGDataILULevel(amg_data) ((amg_data)->ilu_lfil) #define hypre_ParAMGDataILUMaxRowNnz(amg_data) ((amg_data)->ilu_max_row_nnz) #define hypre_ParAMGDataILUDroptol(amg_data) ((amg_data)->ilu_droptol) #define hypre_ParAMGDataILUTriSolve(amg_data) ((amg_data)->ilu_tri_solve) #define hypre_ParAMGDataILULowerJacobiIters(amg_data) ((amg_data)->ilu_lower_jacobi_iters) #define hypre_ParAMGDataILUUpperJacobiIters(amg_data) ((amg_data)->ilu_upper_jacobi_iters) #define hypre_ParAMGDataILUMaxIter(amg_data) ((amg_data)->ilu_max_iter) #define hypre_ParAMGDataILULocalReordering(amg_data) ((amg_data)->ilu_reordering_type) #define hypre_ParAMGDataILUIterSetupType(amg_data) ((amg_data)->ilu_iter_setup_type) #define hypre_ParAMGDataILUIterSetupOption(amg_data) ((amg_data)->ilu_iter_setup_option) #define hypre_ParAMGDataILUIterSetupMaxIter(amg_data) ((amg_data)->ilu_iter_setup_max_iter) #define hypre_ParAMGDataILUIterSetupTolerance(amg_data) ((amg_data)->ilu_iter_setup_tolerance) #define hypre_ParAMGDataFSAIAlgoType(amg_data) ((amg_data)->fsai_algo_type) #define hypre_ParAMGDataFSAILocalSolveType(amg_data) ((amg_data)->fsai_local_solve_type) #define hypre_ParAMGDataFSAIMaxSteps(amg_data) ((amg_data)->fsai_max_steps) #define hypre_ParAMGDataFSAIMaxStepSize(amg_data) ((amg_data)->fsai_max_step_size) #define hypre_ParAMGDataFSAIMaxNnzRow(amg_data) ((amg_data)->fsai_max_nnz_row) #define hypre_ParAMGDataFSAINumLevels(amg_data) ((amg_data)->fsai_num_levels) #define hypre_ParAMGDataFSAIThreshold(amg_data) ((amg_data)->fsai_threshold) #define hypre_ParAMGDataFSAIEigMaxIters(amg_data) ((amg_data)->fsai_eig_max_iters) #define hypre_ParAMGDataFSAIKapTolerance(amg_data) ((amg_data)->fsai_kap_tolerance) #define hypre_ParAMGDataMaxEigEst(amg_data) ((amg_data)->max_eig_est) #define hypre_ParAMGDataMinEigEst(amg_data) ((amg_data)->min_eig_est) #define hypre_ParAMGDataChebyOrder(amg_data) ((amg_data)->cheby_order) #define hypre_ParAMGDataChebyFraction(amg_data) ((amg_data)->cheby_fraction) #define hypre_ParAMGDataChebyEigEst(amg_data) ((amg_data)->cheby_eig_est) #define hypre_ParAMGDataChebyVariant(amg_data) ((amg_data)->cheby_variant) #define hypre_ParAMGDataChebyScale(amg_data) ((amg_data)->cheby_scale) #define hypre_ParAMGDataChebyDS(amg_data) ((amg_data)->cheby_ds) #define hypre_ParAMGDataChebyCoefs(amg_data) ((amg_data)->cheby_coefs) #define hypre_ParAMGDataCumNnzAP(amg_data) ((amg_data)->cum_nnz_AP) /* block */ #define hypre_ParAMGDataABlockArray(amg_data) ((amg_data)->A_block_array) #define hypre_ParAMGDataPBlockArray(amg_data) ((amg_data)->P_block_array) #define hypre_ParAMGDataRBlockArray(amg_data) ((amg_data)->R_block_array) #define hypre_ParAMGDataBlockMode(amg_data) ((amg_data)->block_mode) /* data generated in the solve phase */ #define hypre_ParAMGDataVtemp(amg_data) ((amg_data)->Vtemp) #define hypre_ParAMGDataVtempLocal(amg_data) ((amg_data)->Vtemp_local) #define hypre_ParAMGDataVtemplocalData(amg_data) ((amg_data)->Vtemp_local_data) #define hypre_ParAMGDataCycleOpCount(amg_data) ((amg_data)->cycle_op_count) #define hypre_ParAMGDataRtemp(amg_data) ((amg_data)->Rtemp) #define hypre_ParAMGDataPtemp(amg_data) ((amg_data)->Ptemp) #define hypre_ParAMGDataZtemp(amg_data) ((amg_data)->Ztemp) /* fields used by GSMG */ #define hypre_ParAMGDataGSMG(amg_data) ((amg_data)->gsmg) #define hypre_ParAMGDataNumSamples(amg_data) ((amg_data)->num_samples) /* log info data */ #define hypre_ParAMGDataLogging(amg_data) ((amg_data)->logging) #define hypre_ParAMGDataNumIterations(amg_data) ((amg_data)->num_iterations) #ifdef CUMNUMIT #define hypre_ParAMGDataCumNumIterations(amg_data) ((amg_data)->cum_num_iterations) #endif #define hypre_ParAMGDataRelativeResidualNorm(amg_data) ((amg_data)->rel_resid_norm) #define hypre_ParAMGDataResidual(amg_data) ((amg_data)->residual) /* output parameters */ #define hypre_ParAMGDataPrintLevel(amg_data) ((amg_data)->print_level) #define hypre_ParAMGDataLogFileName(amg_data) ((amg_data)->log_file_name) #define hypre_ParAMGDataDebugFlag(amg_data) ((amg_data)->debug_flag) /* BM Oct 22, 2006 */ #define hypre_ParAMGDataPlotGrids(amg_data) ((amg_data)->plot_grids) #define hypre_ParAMGDataPlotFileName(amg_data) ((amg_data)->plot_filename) /* coordinates BM Oct 17, 2006 */ #define hypre_ParAMGDataCoordDim(amg_data) ((amg_data)->coorddim) #define hypre_ParAMGDataCoordinates(amg_data) ((amg_data)->coordinates) #define hypre_ParAMGNumInterpVectors(amg_data) ((amg_data)->num_interp_vectors) #define hypre_ParAMGNumLevelsInterpVectors(amg_data) ((amg_data)->num_levels_interp_vectors) #define hypre_ParAMGInterpVectors(amg_data) ((amg_data)->interp_vectors) #define hypre_ParAMGInterpVectorsArray(amg_data) ((amg_data)->interp_vectors_array) #define hypre_ParAMGInterpVecVariant(amg_data) ((amg_data)->interp_vec_variant) #define hypre_ParAMGInterpVecFirstLevel(amg_data) ((amg_data)->interp_vec_first_level) #define hypre_ParAMGInterpVecAbsQTrunc(amg_data) ((amg_data)->interp_vectors_abs_q_trunc) #define hypre_ParAMGInterpVecQMax(amg_data) ((amg_data)->interp_vectors_q_max) #define hypre_ParAMGInterpRefine(amg_data) ((amg_data)->interp_refine) #define hypre_ParAMGSmoothInterpVectors(amg_data) ((amg_data)->smooth_interp_vectors) #define hypre_ParAMGDataExpandPWeights(amg_data) ((amg_data)->expandp_weights) #define hypre_ParAMGDataCoarseSolver(amg_data) ((amg_data)->coarse_solver) #define hypre_ParAMGDataACoarse(amg_data) ((amg_data)->A_coarse) #define hypre_ParAMGDataFCoarse(amg_data) ((amg_data)->f_coarse) #define hypre_ParAMGDataUCoarse(amg_data) ((amg_data)->u_coarse) #define hypre_ParAMGDataNewComm(amg_data) ((amg_data)->new_comm) #define hypre_ParAMGDataRedundant(amg_data) ((amg_data)->redundant) #define hypre_ParAMGDataParticipate(amg_data) ((amg_data)->participate) #define hypre_ParAMGDataGSSetup(amg_data) ((amg_data)->gs_setup) #define hypre_ParAMGDataGEMemoryLocation(amg_data) ((amg_data)->ge_memory_location) #define hypre_ParAMGDataAMat(amg_data) ((amg_data)->A_mat) #define hypre_ParAMGDataAWork(amg_data) ((amg_data)->A_work) #define hypre_ParAMGDataAPiv(amg_data) ((amg_data)->A_piv) #define hypre_ParAMGDataBVec(amg_data) ((amg_data)->b_vec) #define hypre_ParAMGDataUVec(amg_data) ((amg_data)->u_vec) #define hypre_ParAMGDataCommInfo(amg_data) ((amg_data)->comm_info) /* additive AMG parameters */ #define hypre_ParAMGDataAdditive(amg_data) ((amg_data)->additive) #define hypre_ParAMGDataMultAdditive(amg_data) ((amg_data)->mult_additive) #define hypre_ParAMGDataSimple(amg_data) ((amg_data)->simple) #define hypre_ParAMGDataAddLastLvl(amg_data) ((amg_data)->add_last_lvl) #define hypre_ParAMGDataMultAddPMaxElmts(amg_data) ((amg_data)->add_P_max_elmts) #define hypre_ParAMGDataMultAddTruncFactor(amg_data) ((amg_data)->add_trunc_factor) #define hypre_ParAMGDataAddRelaxType(amg_data) ((amg_data)->add_rlx_type) #define hypre_ParAMGDataAddRelaxWt(amg_data) ((amg_data)->add_rlx_wt) #define hypre_ParAMGDataLambda(amg_data) ((amg_data)->Lambda) #define hypre_ParAMGDataAtilde(amg_data) ((amg_data)->Atilde) #define hypre_ParAMGDataRtilde(amg_data) ((amg_data)->Rtilde) #define hypre_ParAMGDataXtilde(amg_data) ((amg_data)->Xtilde) #define hypre_ParAMGDataDinv(amg_data) ((amg_data)->D_inv) /* non-Galerkin parameters */ #define hypre_ParAMGDataNonGalerkNumTol(amg_data) ((amg_data)->nongalerk_num_tol) #define hypre_ParAMGDataNonGalerkTol(amg_data) ((amg_data)->nongalerk_tol) #define hypre_ParAMGDataNonGalerkinTol(amg_data) ((amg_data)->nongalerkin_tol) #define hypre_ParAMGDataNonGalTolArray(amg_data) ((amg_data)->nongal_tol_array) #define hypre_ParAMGDataRAP2(amg_data) ((amg_data)->rap2) #define hypre_ParAMGDataKeepTranspose(amg_data) ((amg_data)->keepTranspose) #define hypre_ParAMGDataModularizedMatMat(amg_data) ((amg_data)->modularized_matmat) /*indices for the dof which will keep coarsening to the coarse level */ #define hypre_ParAMGDataNumCPoints(amg_data) ((amg_data)->num_C_points) #define hypre_ParAMGDataCPointsLevel(amg_data) ((amg_data)->C_points_coarse_level) #define hypre_ParAMGDataCPointsLocalMarker(amg_data) ((amg_data)->C_points_local_marker) #define hypre_ParAMGDataCPointsMarker(amg_data) ((amg_data)->C_points_marker) /* information for preserving indices as special fine grid points */ #define hypre_ParAMGDataNumIsolatedFPoints(amg_data) ((amg_data)->num_isolated_F_points) #define hypre_ParAMGDataIsolatedFPointsMarker(amg_data) ((amg_data)->isolated_F_points_marker) /* information for preserving indices as fine grid points */ #define hypre_ParAMGDataNumFPoints(amg_data) ((amg_data)->num_F_points) #define hypre_ParAMGDataFPointsMarker(amg_data) ((amg_data)->F_points_marker) /* Parameters and data for SuperLU_Dist */ #ifdef HYPRE_USING_DSUPERLU #define hypre_ParAMGDataDSLUThreshold(amg_data) ((amg_data)->dslu_threshold) #define hypre_ParAMGDataDSLUSolver(amg_data) ((amg_data)->dslu_solver) #endif #endif hypre-2.33.0/src/parcsr_ls/par_amg_setup.c000066400000000000000000005213371477326011500205200ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "_hypre_onedpl.hpp" #include "_hypre_parcsr_ls.h" #include "par_amg.h" #include "../parcsr_block_mv/par_csr_block_matrix.h" #include "_hypre_utilities.hpp" #define DEBUG 0 #define PRINT_CF 0 #define DEBUG_SAVE_ALL_OPS 0 /***************************************************************************** * * Routine for driving the setup phase of AMG * *****************************************************************************/ /*-------------------------------------------------------------------------- * hypre_BoomerAMGSetup *--------------------------------------------------------------------------*/ HYPRE_Int hypre_BoomerAMGSetup( void *amg_vdata, hypre_ParCSRMatrix *A, hypre_ParVector *f, hypre_ParVector *u ) { MPI_Comm comm = hypre_ParCSRMatrixComm(A); hypre_ParAMGData *amg_data = (hypre_ParAMGData*) amg_vdata; hypre_ParCSRMatrix *A_tilde = A; /* Data Structure variables */ HYPRE_Int num_vectors; hypre_ParCSRMatrix **A_array; hypre_ParVector **F_array; hypre_ParVector **U_array; hypre_ParVector *Vtemp = NULL; hypre_ParVector *Rtemp = NULL; hypre_ParVector *Ptemp = NULL; hypre_ParVector *Ztemp = NULL; hypre_ParCSRMatrix **P_array; hypre_ParCSRMatrix **R_array; hypre_ParVector *Residual_array; hypre_IntArray **CF_marker_array; hypre_IntArray **dof_func_array; hypre_IntArray *dof_func; HYPRE_Int *dof_func_data; HYPRE_Real *relax_weight; HYPRE_Real *omega; HYPRE_Real schwarz_relax_wt = 1; HYPRE_Real strong_threshold; HYPRE_Int coarsen_cut_factor; HYPRE_Int useSabs; HYPRE_Real CR_strong_th; HYPRE_Real max_row_sum; HYPRE_Real trunc_factor, jacobi_trunc_threshold; HYPRE_Real agg_trunc_factor, agg_P12_trunc_factor; HYPRE_Real CR_rate; HYPRE_Int relax_order; HYPRE_Int max_levels; HYPRE_Int amg_logging; HYPRE_Int amg_print_level; HYPRE_Int debug_flag; HYPRE_Int dbg_flg; HYPRE_Int local_num_vars; HYPRE_Int P_max_elmts; HYPRE_Int agg_P_max_elmts; HYPRE_Int agg_P12_max_elmts; HYPRE_Int IS_type; HYPRE_Int num_CR_relax_steps; HYPRE_Int CR_use_CG; HYPRE_Int cgc_its; /* BM Aug 25, 2006 */ HYPRE_Int mult_additive = hypre_ParAMGDataMultAdditive(amg_data); HYPRE_Int additive = hypre_ParAMGDataAdditive(amg_data); HYPRE_Int simple = hypre_ParAMGDataSimple(amg_data); HYPRE_Int add_last_lvl = hypre_ParAMGDataAddLastLvl(amg_data); HYPRE_Int add_P_max_elmts = hypre_ParAMGDataMultAddPMaxElmts(amg_data); HYPRE_Int keep_same_sign = hypre_ParAMGDataKeepSameSign(amg_data); HYPRE_Real add_trunc_factor = hypre_ParAMGDataMultAddTruncFactor(amg_data); HYPRE_Int add_rlx = hypre_ParAMGDataAddRelaxType(amg_data); HYPRE_Real add_rlx_wt = hypre_ParAMGDataAddRelaxWt(amg_data); hypre_ParCSRBlockMatrix **A_block_array, **P_block_array, **R_block_array; HYPRE_MemoryLocation memory_location = hypre_ParCSRMatrixMemoryLocation(A); hypre_ParAMGDataMemoryLocation(amg_data) = memory_location; #if defined(HYPRE_USING_GPU) HYPRE_ExecutionPolicy exec = hypre_GetExecPolicy1(memory_location); #endif /* Local variables */ HYPRE_Int *CF_marker; hypre_IntArray *CFN_marker = NULL; hypre_IntArray *CF2_marker = NULL; hypre_IntArray *CF3_marker = NULL; hypre_ParCSRMatrix *S = NULL, *Sabs = NULL; hypre_ParCSRMatrix *S2; hypre_ParCSRMatrix *SN = NULL; hypre_ParCSRMatrix *SCR; hypre_ParCSRMatrix *P = NULL; hypre_ParCSRMatrix *R = NULL; hypre_ParCSRMatrix *A_H; hypre_ParCSRMatrix *AN = NULL; hypre_ParCSRMatrix *P1; hypre_ParCSRMatrix *P2; hypre_ParCSRMatrix *Pnew = NULL; HYPRE_Real *SmoothVecs = NULL; hypre_Vector **l1_norms = NULL; hypre_Vector **cheby_ds = NULL; HYPRE_Real **cheby_coefs = NULL; HYPRE_Int old_num_levels, num_levels; HYPRE_Int level; HYPRE_Int local_size, i, row; HYPRE_BigInt first_local_row; HYPRE_BigInt coarse_size; HYPRE_Int coarsen_type; HYPRE_Int measure_type; HYPRE_Int setup_type; HYPRE_BigInt fine_size; HYPRE_Int offset; HYPRE_Int not_finished_coarsening = 1; HYPRE_Int coarse_threshold = hypre_ParAMGDataMaxCoarseSize(amg_data); HYPRE_Int min_coarse_size = hypre_ParAMGDataMinCoarseSize(amg_data); HYPRE_Int seq_threshold = hypre_ParAMGDataSeqThreshold(amg_data); HYPRE_Int j, k; HYPRE_Int num_procs, my_id; #if !defined(HYPRE_USING_GPU) HYPRE_Int num_threads = hypre_NumThreads(); #endif HYPRE_Int *grid_relax_type = hypre_ParAMGDataGridRelaxType(amg_data); HYPRE_Int num_functions = hypre_ParAMGDataNumFunctions(amg_data); HYPRE_Int filter_functions = hypre_ParAMGDataFilterFunctions(amg_data); HYPRE_Int nodal = hypre_ParAMGDataNodal(amg_data); HYPRE_Int nodal_levels = hypre_ParAMGDataNodalLevels(amg_data); HYPRE_Int nodal_diag = hypre_ParAMGDataNodalDiag(amg_data); HYPRE_Int num_paths = hypre_ParAMGDataNumPaths(amg_data); HYPRE_Int agg_num_levels = hypre_ParAMGDataAggNumLevels(amg_data); HYPRE_Int agg_interp_type = hypre_ParAMGDataAggInterpType(amg_data); HYPRE_Int sep_weight = hypre_ParAMGDataSepWeight(amg_data); hypre_IntArray *coarse_dof_func = NULL; HYPRE_BigInt coarse_pnts_global[2]; HYPRE_BigInt coarse_pnts_global1[2]; HYPRE_Int num_cg_sweeps; HYPRE_Real *max_eig_est = NULL; HYPRE_Real *min_eig_est = NULL; HYPRE_Solver *smoother = hypre_ParAMGDataSmoother(amg_data); HYPRE_Int smooth_type = hypre_ParAMGDataSmoothType(amg_data); HYPRE_Int smooth_num_levels = hypre_ParAMGDataSmoothNumLevels(amg_data); HYPRE_Int sym; HYPRE_Int nlevel; HYPRE_Real thresh; HYPRE_Real filter; HYPRE_Real drop_tol; HYPRE_Int max_nz_per_row; char *euclidfile; HYPRE_Int eu_level; HYPRE_Int eu_bj; HYPRE_Real eu_sparse_A; HYPRE_Int ilu_type; HYPRE_Int ilu_lfil; HYPRE_Int ilu_max_row_nnz; HYPRE_Int ilu_max_iter; HYPRE_Int ilu_tri_solve; HYPRE_Int ilu_lower_jacobi_iters; HYPRE_Int ilu_upper_jacobi_iters; HYPRE_Real ilu_droptol; HYPRE_Int ilu_reordering_type; HYPRE_Int fsai_algo_type; HYPRE_Int fsai_local_solve_type; HYPRE_Int fsai_max_steps; HYPRE_Int fsai_max_step_size; HYPRE_Int fsai_max_nnz_row; HYPRE_Int fsai_num_levels; HYPRE_Real fsai_threshold; HYPRE_Int fsai_eig_max_iters; HYPRE_Real fsai_kap_tolerance; HYPRE_Int needZ = 0; HYPRE_Int interp_type, restri_type; HYPRE_Int post_interp_type; /* what to do after computing the interpolation matrix 0 for nothing, 1 for a Jacobi step */ /*for fittting interp vectors */ /*HYPRE_Int smooth_interp_vectors= hypre_ParAMGSmoothInterpVectors(amg_data); */ HYPRE_Real abs_q_trunc = hypre_ParAMGInterpVecAbsQTrunc(amg_data); HYPRE_Int q_max = hypre_ParAMGInterpVecQMax(amg_data); HYPRE_Int num_interp_vectors = hypre_ParAMGNumInterpVectors(amg_data); HYPRE_Int num_levels_interp_vectors = hypre_ParAMGNumLevelsInterpVectors(amg_data); hypre_ParVector **interp_vectors = hypre_ParAMGInterpVectors(amg_data); hypre_ParVector ***interp_vectors_array = hypre_ParAMGInterpVectorsArray(amg_data); HYPRE_Int interp_vec_variant = hypre_ParAMGInterpVecVariant(amg_data); HYPRE_Int interp_refine = hypre_ParAMGInterpRefine(amg_data); HYPRE_Int interp_vec_first_level = hypre_ParAMGInterpVecFirstLevel(amg_data); HYPRE_Real *expandp_weights = hypre_ParAMGDataExpandPWeights(amg_data); /* parameters for non-Galerkin stuff */ HYPRE_Int nongalerk_num_tol = hypre_ParAMGDataNonGalerkNumTol (amg_data); HYPRE_Real *nongalerk_tol = hypre_ParAMGDataNonGalerkTol (amg_data); HYPRE_Real nongalerk_tol_l = 0.0; HYPRE_Real *nongal_tol_array = hypre_ParAMGDataNonGalTolArray (amg_data); hypre_ParCSRBlockMatrix *A_H_block; HYPRE_Int block_mode = 0; HYPRE_Int mult_addlvl = hypre_max(mult_additive, simple); HYPRE_Int addlvl = hypre_max(mult_addlvl, additive); HYPRE_Int rap2 = hypre_ParAMGDataRAP2(amg_data); HYPRE_Int keepTranspose = hypre_ParAMGDataKeepTranspose(amg_data); HYPRE_Int local_coarse_size; HYPRE_Int num_C_points_coarse = hypre_ParAMGDataNumCPoints(amg_data); HYPRE_Int *C_points_local_marker = hypre_ParAMGDataCPointsLocalMarker(amg_data); HYPRE_BigInt *C_points_marker = hypre_ParAMGDataCPointsMarker(amg_data); HYPRE_Int num_F_points = hypre_ParAMGDataNumFPoints(amg_data); HYPRE_BigInt *F_points_marker = hypre_ParAMGDataFPointsMarker(amg_data); HYPRE_Int num_isolated_F_points = hypre_ParAMGDataNumIsolatedFPoints(amg_data); HYPRE_BigInt *isolated_F_points_marker = hypre_ParAMGDataIsolatedFPointsMarker(amg_data); HYPRE_Int *num_grid_sweeps = hypre_ParAMGDataNumGridSweeps(amg_data); HYPRE_Int ns = num_grid_sweeps[1]; HYPRE_Real wall_time = 0.0; /* for debugging instrumentation */ HYPRE_Int add_end; #ifdef HYPRE_USING_DSUPERLU HYPRE_Int dslu_threshold = hypre_ParAMGDataDSLUThreshold(amg_data); #endif char nvtx_name[1024]; HYPRE_Real cum_nnz_AP = hypre_ParAMGDataCumNnzAP(amg_data); HYPRE_ANNOTATE_FUNC_BEGIN; hypre_GpuProfilingPushRange("AMGsetup"); hypre_MemoryPrintUsage(comm, hypre_HandleLogLevel(hypre_handle()), "BoomerAMG setup begin", 0); hypre_MPI_Comm_size(comm, &num_procs); hypre_MPI_Comm_rank(comm, &my_id); /*A_new = hypre_CSRMatrixDeleteZeros(hypre_ParCSRMatrixDiag(A), 1.e-16); hypre_CSRMatrixPrint(A_new, "Atestnew"); */ old_num_levels = hypre_ParAMGDataNumLevels(amg_data); max_levels = hypre_ParAMGDataMaxLevels(amg_data); add_end = hypre_min(add_last_lvl, max_levels - 1); if (add_end == -1) { add_end = max_levels - 1; } amg_logging = hypre_ParAMGDataLogging(amg_data); amg_print_level = hypre_ParAMGDataPrintLevel(amg_data); coarsen_type = hypre_ParAMGDataCoarsenType(amg_data); measure_type = hypre_ParAMGDataMeasureType(amg_data); setup_type = hypre_ParAMGDataSetupType(amg_data); debug_flag = hypre_ParAMGDataDebugFlag(amg_data); relax_weight = hypre_ParAMGDataRelaxWeight(amg_data); omega = hypre_ParAMGDataOmega(amg_data); sym = hypre_ParAMGDataSym(amg_data); nlevel = hypre_ParAMGDataLevel(amg_data); filter = hypre_ParAMGDataFilter(amg_data); thresh = hypre_ParAMGDataThreshold(amg_data); drop_tol = hypre_ParAMGDataDropTol(amg_data); max_nz_per_row = hypre_ParAMGDataMaxNzPerRow(amg_data); euclidfile = hypre_ParAMGDataEuclidFile(amg_data); eu_level = hypre_ParAMGDataEuLevel(amg_data); eu_sparse_A = hypre_ParAMGDataEuSparseA(amg_data); eu_bj = hypre_ParAMGDataEuBJ(amg_data); ilu_type = hypre_ParAMGDataILUType(amg_data); ilu_lfil = hypre_ParAMGDataILULevel(amg_data); ilu_max_row_nnz = hypre_ParAMGDataILUMaxRowNnz(amg_data); ilu_droptol = hypre_ParAMGDataILUDroptol(amg_data); ilu_tri_solve = hypre_ParAMGDataILUTriSolve(amg_data); ilu_lower_jacobi_iters = hypre_ParAMGDataILULowerJacobiIters(amg_data); ilu_upper_jacobi_iters = hypre_ParAMGDataILUUpperJacobiIters(amg_data); ilu_max_iter = hypre_ParAMGDataILUMaxIter(amg_data); ilu_reordering_type = hypre_ParAMGDataILULocalReordering(amg_data); fsai_algo_type = hypre_ParAMGDataFSAIAlgoType(amg_data); fsai_local_solve_type = hypre_ParAMGDataFSAILocalSolveType(amg_data); fsai_max_steps = hypre_ParAMGDataFSAIMaxSteps(amg_data); fsai_max_step_size = hypre_ParAMGDataFSAIMaxStepSize(amg_data); fsai_max_nnz_row = hypre_ParAMGDataFSAIMaxNnzRow(amg_data); fsai_num_levels = hypre_ParAMGDataFSAINumLevels(amg_data); fsai_threshold = hypre_ParAMGDataFSAIThreshold(amg_data); fsai_eig_max_iters = hypre_ParAMGDataFSAIEigMaxIters(amg_data); fsai_kap_tolerance = hypre_ParAMGDataFSAIKapTolerance(amg_data); interp_type = hypre_ParAMGDataInterpType(amg_data); restri_type = hypre_ParAMGDataRestriction(amg_data); /* RL */ post_interp_type = hypre_ParAMGDataPostInterpType(amg_data); IS_type = hypre_ParAMGDataISType(amg_data); num_CR_relax_steps = hypre_ParAMGDataNumCRRelaxSteps(amg_data); CR_rate = hypre_ParAMGDataCRRate(amg_data); CR_use_CG = hypre_ParAMGDataCRUseCG(amg_data); cgc_its = hypre_ParAMGDataCGCIts(amg_data); relax_order = hypre_ParAMGDataRelaxOrder(amg_data); hypre_ParCSRMatrixSetNumNonzeros(A); hypre_ParCSRMatrixSetDNumNonzeros(A); hypre_ParAMGDataNumVariables(amg_data) = hypre_ParCSRMatrixNumRows(A); if (num_procs == 1) { seq_threshold = 0; } if (setup_type == 0) { return hypre_error_flag; } S = NULL; A_array = hypre_ParAMGDataAArray(amg_data); P_array = hypre_ParAMGDataPArray(amg_data); R_array = hypre_ParAMGDataRArray(amg_data); CF_marker_array = hypre_ParAMGDataCFMarkerArray(amg_data); dof_func_array = hypre_ParAMGDataDofFuncArray(amg_data); dof_func = hypre_ParAMGDataDofFunc(amg_data); local_size = hypre_CSRMatrixNumRows(hypre_ParCSRMatrixDiag(A)); first_local_row = hypre_ParCSRMatrixFirstRowIndex(A); /* set size of dof_func hypre_IntArray if necessary */ if (dof_func && hypre_IntArraySize(dof_func) < 0) { hypre_IntArraySize(dof_func) = local_size; hypre_IntArrayMemoryLocation(dof_func) = memory_location; } A_block_array = hypre_ParAMGDataABlockArray(amg_data); P_block_array = hypre_ParAMGDataPBlockArray(amg_data); R_block_array = hypre_ParAMGDataRBlockArray(amg_data); grid_relax_type[3] = hypre_ParAMGDataUserCoarseRelaxType(amg_data); /* Get the number of vector components when LHS/RHS are passed in */ if ((f != NULL) && (u != NULL)) { /* Verify that the number of vectors held by f and u match */ if (hypre_ParVectorNumVectors(f) != hypre_ParVectorNumVectors(u)) { hypre_error_w_msg(HYPRE_ERROR_GENERIC, "Error: num_vectors for RHS and LHS do not match!\n"); return hypre_error_flag; } num_vectors = hypre_ParVectorNumVectors(f); } else { num_vectors = 1; } /* change in definition of standard and multipass interpolation, by eliminating interp_type 9 and 5 and setting sep_weight instead when using separation of weights option */ if (interp_type == 9) { interp_type = 8; sep_weight = 1; } else if (interp_type == 5) { interp_type = 4; sep_weight = 1; } /* Verify that if the user has selected the interp_vec_variant > 0 (so GM or LN interpolation) then they have nodal coarsening selected also */ if (interp_vec_variant > 0 && nodal < 1) { nodal = 1; hypre_error_w_msg(HYPRE_ERROR_GENERIC, "WARNING: Changing to node-based coarsening because LN of GM interpolation has been specified via HYPRE_BoomerAMGSetInterpVecVariant.\n"); } /* Verify that settings are correct for solving systems */ /* If the user has specified either a block interpolation or a block relaxation then we need to make sure the other has been chosen as well - so we can be in "block mode" - storing only block matrices on the coarse levels*/ /* Furthermore, if we are using systems and nodal = 0, then we will change nodal to 1 */ /* probably should disable stuff like smooth number levels at some point */ if (grid_relax_type[0] >= 20 && grid_relax_type[0] != 30 && grid_relax_type[0] != 88 && grid_relax_type[0] != 89) { /* block relaxation chosen */ if (!((interp_type >= 20 && interp_type != 100) || interp_type == 11 || interp_type == 10 ) ) { hypre_ParAMGDataInterpType(amg_data) = 20; interp_type = hypre_ParAMGDataInterpType(amg_data) ; } for (i = 1; i < 3; i++) { if (grid_relax_type[i] < 20) { grid_relax_type[i] = 23; } } if (grid_relax_type[3] < 20) { grid_relax_type[3] = 29; /* GE */ } block_mode = 1; } if ((interp_type >= 20 && interp_type != 100) || interp_type == 11 || interp_type == 10 ) /* block interp choosen */ { if (!(nodal)) { hypre_ParAMGDataNodal(amg_data) = 1; nodal = hypre_ParAMGDataNodal(amg_data); } for (i = 0; i < 3; i++) { if (grid_relax_type[i] < 20) { grid_relax_type[i] = 23; } } if (grid_relax_type[3] < 20) { grid_relax_type[3] = 29; } /* GE */ block_mode = 1; } hypre_ParAMGDataBlockMode(amg_data) = block_mode; /* end of systems checks */ /* free up storage in case of new setup without previous destroy */ if (A_array || A_block_array || P_array || P_block_array || CF_marker_array || dof_func_array || R_array || R_block_array) { for (j = 1; j < old_num_levels; j++) { if (A_array[j]) { hypre_ParCSRMatrixDestroy(A_array[j]); A_array[j] = NULL; } if (A_block_array[j]) { hypre_ParCSRBlockMatrixDestroy(A_block_array[j]); A_block_array[j] = NULL; } hypre_IntArrayDestroy(dof_func_array[j]); dof_func_array[j] = NULL; } for (j = 0; j < old_num_levels - 1; j++) { if (P_array[j]) { hypre_ParCSRMatrixDestroy(P_array[j]); P_array[j] = NULL; } if (P_block_array[j]) { hypre_ParCSRBlockMatrixDestroy(P_block_array[j]); P_block_array[j] = NULL; } /* RL */ if (R_array[j]) { hypre_ParCSRMatrixDestroy(R_array[j]); R_array[j] = NULL; } if (R_block_array[j]) { hypre_ParCSRBlockMatrixDestroy(R_block_array[j]); R_block_array[j] = NULL; } } /* Special case use of CF_marker_array when old_num_levels == 1 requires us to attempt this deallocation every time */ hypre_IntArrayDestroy(CF_marker_array[0]); CF_marker_array[0] = NULL; for (j = 1; j < old_num_levels - 1; j++) { hypre_IntArrayDestroy(CF_marker_array[j]); CF_marker_array[j] = NULL; } } { MPI_Comm new_comm = hypre_ParAMGDataNewComm(amg_data); void *amg = hypre_ParAMGDataCoarseSolver(amg_data); if (hypre_ParAMGDataRtemp(amg_data)) { hypre_ParVectorDestroy(hypre_ParAMGDataRtemp(amg_data)); hypre_ParAMGDataRtemp(amg_data) = NULL; } if (hypre_ParAMGDataPtemp(amg_data)) { hypre_ParVectorDestroy(hypre_ParAMGDataPtemp(amg_data)); hypre_ParAMGDataPtemp(amg_data) = NULL; } if (hypre_ParAMGDataZtemp(amg_data)) { hypre_ParVectorDestroy(hypre_ParAMGDataZtemp(amg_data)); hypre_ParAMGDataZtemp(amg_data) = NULL; } if (hypre_ParAMGDataACoarse(amg_data)) { hypre_ParCSRMatrixDestroy(hypre_ParAMGDataACoarse(amg_data)); hypre_ParAMGDataACoarse(amg_data) = NULL; } if (hypre_ParAMGDataUCoarse(amg_data)) { hypre_ParVectorDestroy(hypre_ParAMGDataUCoarse(amg_data)); hypre_ParAMGDataUCoarse(amg_data) = NULL; } if (hypre_ParAMGDataFCoarse(amg_data)) { hypre_ParVectorDestroy(hypre_ParAMGDataFCoarse(amg_data)); hypre_ParAMGDataFCoarse(amg_data) = NULL; } #if defined(HYPRE_USING_MAGMA) hypre_TFree(hypre_ParAMGDataAPiv(amg_data), HYPRE_MEMORY_HOST); #else hypre_TFree(hypre_ParAMGDataAPiv(amg_data), hypre_ParAMGDataGEMemoryLocation(amg_data)); #endif hypre_TFree(hypre_ParAMGDataAMat(amg_data), hypre_ParAMGDataGEMemoryLocation(amg_data)); hypre_TFree(hypre_ParAMGDataAWork(amg_data), hypre_ParAMGDataGEMemoryLocation(amg_data)); hypre_TFree(hypre_ParAMGDataBVec(amg_data), hypre_ParAMGDataGEMemoryLocation(amg_data)); hypre_TFree(hypre_ParAMGDataUVec(amg_data), hypre_ParAMGDataGEMemoryLocation(amg_data)); hypre_TFree(hypre_ParAMGDataCommInfo(amg_data), HYPRE_MEMORY_HOST); if (new_comm != hypre_MPI_COMM_NULL) { hypre_MPI_Comm_free (&new_comm); hypre_ParAMGDataNewComm(amg_data) = hypre_MPI_COMM_NULL; } if (amg) { hypre_BoomerAMGDestroy (amg); hypre_ParAMGDataCoarseSolver(amg_data) = NULL; } hypre_TFree(hypre_ParAMGDataMaxEigEst(amg_data), HYPRE_MEMORY_HOST); hypre_TFree(hypre_ParAMGDataMinEigEst(amg_data), HYPRE_MEMORY_HOST); if (hypre_ParAMGDataChebyDS(amg_data)) { for (i = 0; i < old_num_levels; i++) { hypre_SeqVectorDestroy(hypre_ParAMGDataChebyDS(amg_data)[i]); } hypre_TFree(hypre_ParAMGDataChebyDS(amg_data), HYPRE_MEMORY_HOST); } if (hypre_ParAMGDataChebyCoefs(amg_data)) { for (i = 0; i < old_num_levels; i++) { hypre_TFree(hypre_ParAMGDataChebyCoefs(amg_data)[i], HYPRE_MEMORY_HOST); } hypre_TFree(hypre_ParAMGDataChebyCoefs(amg_data), HYPRE_MEMORY_HOST); } if (hypre_ParAMGDataL1Norms(amg_data)) { for (i = 0; i < old_num_levels; i++) { hypre_SeqVectorDestroy(hypre_ParAMGDataL1Norms(amg_data)[i]); } hypre_TFree(hypre_ParAMGDataL1Norms(amg_data), HYPRE_MEMORY_HOST); } if (smooth_num_levels && smoother) { if (smooth_num_levels > 1 && smooth_num_levels > old_num_levels - 1) { smooth_num_levels = old_num_levels - 1; } if (hypre_ParAMGDataSmoothType(amg_data) == 7) { for (i = 0; i < smooth_num_levels; i++) { if (smoother[i]) { HYPRE_ParCSRPilutDestroy(smoother[i]); smoother[i] = NULL; } } } else if (hypre_ParAMGDataSmoothType(amg_data) == 8) { for (i = 0; i < smooth_num_levels; i++) { if (smoother[i]) { HYPRE_ParCSRParaSailsDestroy(smoother[i]); smoother[i] = NULL; } } } else if (hypre_ParAMGDataSmoothType(amg_data) == 9) { for (i = 0; i < smooth_num_levels; i++) { if (smoother[i]) { HYPRE_EuclidDestroy(smoother[i]); smoother[i] = NULL; } } } else if (hypre_ParAMGDataSmoothType(amg_data) == 4) { for (i = 0; i < smooth_num_levels; i++) { if (smoother[i]) { HYPRE_FSAIDestroy(smoother[i]); smoother[i] = NULL; } } } else if (hypre_ParAMGDataSmoothType(amg_data) == 5) { for (i = 0; i < smooth_num_levels; i++) { if (smoother[i]) { HYPRE_ILUDestroy(smoother[i]); smoother[i] = NULL; } } } else if (hypre_ParAMGDataSmoothType(amg_data) == 6) { for (i = 0; i < smooth_num_levels; i++) { if (smoother[i]) { HYPRE_SchwarzDestroy(smoother[i]); smoother[i] = NULL; } } } hypre_TFree(hypre_ParAMGDataSmoother(amg_data), HYPRE_MEMORY_HOST); } if ( hypre_ParAMGDataResidual(amg_data) ) { hypre_ParVectorDestroy( hypre_ParAMGDataResidual(amg_data) ); hypre_ParAMGDataResidual(amg_data) = NULL; } } if (A_array == NULL) { A_array = hypre_CTAlloc(hypre_ParCSRMatrix*, max_levels, HYPRE_MEMORY_HOST); } if (A_block_array == NULL) { A_block_array = hypre_CTAlloc(hypre_ParCSRBlockMatrix*, max_levels, HYPRE_MEMORY_HOST); } if (P_array == NULL && max_levels > 1) { P_array = hypre_CTAlloc(hypre_ParCSRMatrix*, max_levels - 1, HYPRE_MEMORY_HOST); } if (P_block_array == NULL && max_levels > 1) { P_block_array = hypre_CTAlloc(hypre_ParCSRBlockMatrix*, max_levels - 1, HYPRE_MEMORY_HOST); } /* RL: if retri_type != 0, R != P^T, allocate R matrices */ if (restri_type) { if (R_array == NULL && max_levels > 1) { R_array = hypre_CTAlloc(hypre_ParCSRMatrix*, max_levels - 1, HYPRE_MEMORY_HOST); } if (R_block_array == NULL && max_levels > 1) { R_block_array = hypre_CTAlloc(hypre_ParCSRBlockMatrix*, max_levels - 1, HYPRE_MEMORY_HOST); } } if (CF_marker_array == NULL) { CF_marker_array = hypre_CTAlloc(hypre_IntArray*, max_levels, HYPRE_MEMORY_HOST); } if (num_C_points_coarse > 0) { #if defined(HYPRE_USING_GPU) if (exec == HYPRE_EXEC_DEVICE) { #if defined(HYPRE_USING_SYCL) HYPRE_Int *new_end = hypreSycl_copy_if( C_points_marker, C_points_marker + num_C_points_coarse, C_points_marker, C_points_local_marker, in_range(first_local_row, first_local_row + local_size - 1) ); HYPRE_ONEDPL_CALL( std::transform, C_points_local_marker, C_points_local_marker + num_C_points_coarse, C_points_local_marker, [first_local_row = first_local_row] (const auto & x) {return x - first_local_row;} ); #else HYPRE_Int *new_end = HYPRE_THRUST_CALL( copy_if, thrust::make_transform_iterator(C_points_marker, _1 - first_local_row), thrust::make_transform_iterator(C_points_marker + num_C_points_coarse, _1 - first_local_row), C_points_marker, C_points_local_marker, in_range(first_local_row, first_local_row + local_size - 1) ); #endif num_C_points_coarse = new_end - C_points_local_marker; } else #endif /* defined(HYPRE_USING_GPU) */ { k = 0; for (j = 0; j < num_C_points_coarse; j++) { row = (HYPRE_Int) (C_points_marker[j] - first_local_row); if ((row >= 0) && (row < local_size)) { C_points_local_marker[k++] = row; } } num_C_points_coarse = k; } } if (dof_func_array == NULL) { dof_func_array = hypre_CTAlloc(hypre_IntArray*, max_levels, HYPRE_MEMORY_HOST); } if (num_functions > 1 && dof_func == NULL) { dof_func = hypre_IntArrayCreate(local_size); hypre_IntArrayInitialize_v2(dof_func, memory_location); offset = (HYPRE_Int) ( first_local_row % ((HYPRE_BigInt) num_functions) ); #if defined(HYPRE_USING_GPU) if (exec == HYPRE_EXEC_DEVICE) { hypre_BoomerAMGInitDofFuncDevice(hypre_IntArrayData(dof_func), local_size, offset, num_functions); } else #endif /* defined(HYPRE_USING_GPU) */ { for (i = 0; i < local_size; i++) { hypre_IntArrayData(dof_func)[i] = (i + offset) % num_functions; } } } /* Eliminate inter-variable connections among functions for preconditioning purposes */ if (num_functions > 1 && filter_functions) { hypre_ParCSRMatrixBlkFilter(A, num_functions, &A_tilde); } A_array[0] = A_tilde; /* interp vectors setup */ if (interp_vec_variant == 1) { num_levels_interp_vectors = interp_vec_first_level + 1; hypre_ParAMGNumLevelsInterpVectors(amg_data) = num_levels_interp_vectors; } if (interp_vec_variant > 0 && num_interp_vectors > 0) { interp_vectors_array = hypre_CTAlloc(hypre_ParVector**, num_levels_interp_vectors, HYPRE_MEMORY_HOST); interp_vectors_array[0] = interp_vectors; hypre_ParAMGInterpVectorsArray(amg_data) = interp_vectors_array; } if (block_mode) { A_block_array[0] = hypre_ParCSRBlockMatrixConvertFromParCSRMatrix(A_array[0], num_functions); hypre_ParCSRBlockMatrixSetNumNonzeros(A_block_array[0]); hypre_ParCSRBlockMatrixSetDNumNonzeros(A_block_array[0]); } dof_func_array[0] = dof_func; hypre_ParAMGDataCFMarkerArray(amg_data) = CF_marker_array; hypre_ParAMGDataNumCPoints(amg_data) = num_C_points_coarse; hypre_ParAMGDataDofFunc(amg_data) = dof_func; hypre_ParAMGDataDofFuncArray(amg_data) = dof_func_array; hypre_ParAMGDataAArray(amg_data) = A_array; hypre_ParAMGDataPArray(amg_data) = P_array; /* RL: if R != P^T */ if (restri_type) { hypre_ParAMGDataRArray(amg_data) = R_array; } else { hypre_ParAMGDataRArray(amg_data) = P_array; } hypre_ParAMGDataABlockArray(amg_data) = A_block_array; hypre_ParAMGDataPBlockArray(amg_data) = P_block_array; /* RL: if R != P^T */ if (restri_type) { hypre_ParAMGDataRBlockArray(amg_data) = R_block_array; } else { hypre_ParAMGDataRBlockArray(amg_data) = P_block_array; } Vtemp = hypre_ParAMGDataVtemp(amg_data); if (Vtemp != NULL) { hypre_ParVectorDestroy(Vtemp); Vtemp = NULL; } Vtemp = hypre_ParVectorCreate(hypre_ParCSRMatrixComm(A_array[0]), hypre_ParCSRMatrixGlobalNumRows(A_array[0]), hypre_ParCSRMatrixRowStarts(A_array[0])); hypre_ParVectorNumVectors(Vtemp) = num_vectors; hypre_ParVectorInitialize_v2(Vtemp, memory_location); hypre_ParAMGDataVtemp(amg_data) = Vtemp; /* If we are doing Cheby relaxation, we also need up two more temp vectors. * If cheby_scale is false, only need one, otherwise need two */ if ((smooth_num_levels > 0 && smooth_type > 9) || relax_weight[0] < 0 || omega[0] < 0 || hypre_ParAMGDataSchwarzRlxWeight(amg_data) < 0 || (grid_relax_type[0] == 16 || grid_relax_type[1] == 16 || grid_relax_type[2] == 16 || grid_relax_type[3] == 16)) { Ptemp = hypre_ParVectorCreate(hypre_ParCSRMatrixComm(A_array[0]), hypre_ParCSRMatrixGlobalNumRows(A_array[0]), hypre_ParCSRMatrixRowStarts(A_array[0])); hypre_ParVectorNumVectors(Ptemp) = num_vectors; hypre_ParVectorInitialize_v2(Ptemp, memory_location); hypre_ParAMGDataPtemp(amg_data) = Ptemp; /* If not doing chebyshev relaxation, or (doing chebyshev relaxation and scaling) */ if (!(grid_relax_type[0] == 16 || grid_relax_type[1] == 16 || grid_relax_type[2] == 16 || grid_relax_type[3] == 16) || (hypre_ParAMGDataChebyScale(amg_data))) { Rtemp = hypre_ParVectorCreate(hypre_ParCSRMatrixComm(A_array[0]), hypre_ParCSRMatrixGlobalNumRows(A_array[0]), hypre_ParCSRMatrixRowStarts(A_array[0])); hypre_ParVectorNumVectors(Rtemp) = num_vectors; hypre_ParVectorInitialize_v2(Rtemp, memory_location); hypre_ParAMGDataRtemp(amg_data) = Rtemp; } } /* See if we need the Ztemp vector */ if ( (smooth_num_levels > 0 && smooth_type > 6) || relax_weight[0] < 0 || omega[0] < 0 || hypre_ParAMGDataSchwarzRlxWeight(amg_data) < 0 ) { needZ = hypre_max(needZ, 1); } if ( grid_relax_type[0] == 16 || grid_relax_type[1] == 16 || grid_relax_type[2] == 16 || grid_relax_type[3] == 16 ) { /* Chebyshev */ needZ = hypre_max(needZ, 1); } #if !defined(HYPRE_USING_GPU) /* GPU impl. needs Z */ if (num_threads > 1) #endif { /* we need the temp Z vector for relaxation 3 and 6 now if we are using threading */ for (j = 0; j < 4; j++) { if (grid_relax_type[j] == 3 || grid_relax_type[j] == 4 || grid_relax_type[j] == 6 || grid_relax_type[j] == 8 || grid_relax_type[j] == 13 || grid_relax_type[j] == 14 || grid_relax_type[j] == 11 || grid_relax_type[j] == 12 || grid_relax_type[j] == 88 || grid_relax_type[j] == 89) { needZ = hypre_max(needZ, 1); break; } } } if (needZ) { Ztemp = hypre_ParMultiVectorCreate(hypre_ParCSRMatrixComm(A_array[0]), hypre_ParCSRMatrixGlobalNumRows(A_array[0]), hypre_ParCSRMatrixRowStarts(A_array[0]), num_vectors); hypre_ParVectorInitialize_v2(Ztemp, memory_location); hypre_ParAMGDataZtemp(amg_data) = Ztemp; } F_array = hypre_ParAMGDataFArray(amg_data); U_array = hypre_ParAMGDataUArray(amg_data); if (F_array != NULL || U_array != NULL) { for (j = 1; j < old_num_levels; j++) { if (F_array[j] != NULL) { hypre_ParVectorDestroy(F_array[j]); F_array[j] = NULL; } if (U_array[j] != NULL) { hypre_ParVectorDestroy(U_array[j]); U_array[j] = NULL; } } } if (F_array == NULL) { F_array = hypre_CTAlloc(hypre_ParVector*, max_levels, HYPRE_MEMORY_HOST); } if (U_array == NULL) { U_array = hypre_CTAlloc(hypre_ParVector*, max_levels, HYPRE_MEMORY_HOST); } F_array[0] = f; U_array[0] = u; hypre_ParAMGDataFArray(amg_data) = F_array; hypre_ParAMGDataUArray(amg_data) = U_array; /*---------------------------------------------------------- * Initialize hypre_ParAMGData *----------------------------------------------------------*/ not_finished_coarsening = 1; level = 0; HYPRE_ANNOTATE_MGLEVEL_BEGIN(level); hypre_sprintf(nvtx_name, "%s-%d", "AMG Level", level); hypre_GpuProfilingPushRange(nvtx_name); strong_threshold = hypre_ParAMGDataStrongThreshold(amg_data); coarsen_cut_factor = hypre_ParAMGDataCoarsenCutFactor(amg_data); useSabs = hypre_ParAMGDataSabs(amg_data); CR_strong_th = hypre_ParAMGDataCRStrongTh(amg_data); max_row_sum = hypre_ParAMGDataMaxRowSum(amg_data); trunc_factor = hypre_ParAMGDataTruncFactor(amg_data); agg_trunc_factor = hypre_ParAMGDataAggTruncFactor(amg_data); agg_P12_trunc_factor = hypre_ParAMGDataAggP12TruncFactor(amg_data); P_max_elmts = hypre_ParAMGDataPMaxElmts(amg_data); agg_P_max_elmts = hypre_ParAMGDataAggPMaxElmts(amg_data); agg_P12_max_elmts = hypre_ParAMGDataAggP12MaxElmts(amg_data); jacobi_trunc_threshold = hypre_ParAMGDataJacobiTruncThreshold(amg_data); smooth_num_levels = hypre_ParAMGDataSmoothNumLevels(amg_data); if (smooth_num_levels > level) { smoother = hypre_CTAlloc(HYPRE_Solver, smooth_num_levels, HYPRE_MEMORY_HOST); hypre_ParAMGDataSmoother(amg_data) = smoother; } /*----------------------------------------------------- * Enter Coarsening Loop *-----------------------------------------------------*/ while (not_finished_coarsening) { /* only do nodal coarsening on a fixed number of levels */ if (level >= nodal_levels) { nodal = 0; } if (block_mode) { fine_size = hypre_ParCSRBlockMatrixGlobalNumRows(A_block_array[level]); } else { fine_size = hypre_ParCSRMatrixGlobalNumRows(A_array[level]); } if (level > 0) { if (block_mode) { F_array[level] = hypre_ParVectorCreateFromBlock(hypre_ParCSRBlockMatrixComm(A_block_array[level]), hypre_ParCSRMatrixGlobalNumRows(A_block_array[level]), hypre_ParCSRBlockMatrixRowStarts(A_block_array[level]), hypre_ParCSRBlockMatrixBlockSize(A_block_array[level])); hypre_ParVectorInitialize(F_array[level]); U_array[level] = hypre_ParVectorCreateFromBlock(hypre_ParCSRBlockMatrixComm(A_block_array[level]), hypre_ParCSRMatrixGlobalNumRows(A_block_array[level]), hypre_ParCSRBlockMatrixRowStarts(A_block_array[level]), hypre_ParCSRBlockMatrixBlockSize(A_block_array[level])); hypre_ParVectorInitialize(U_array[level]); } else { F_array[level] = hypre_ParVectorCreate(hypre_ParCSRMatrixComm(A_array[level]), hypre_ParCSRMatrixGlobalNumRows(A_array[level]), hypre_ParCSRMatrixRowStarts(A_array[level])); hypre_ParVectorNumVectors(F_array[level]) = num_vectors; hypre_ParVectorInitialize_v2(F_array[level], memory_location); U_array[level] = hypre_ParVectorCreate(hypre_ParCSRMatrixComm(A_array[level]), hypre_ParCSRMatrixGlobalNumRows(A_array[level]), hypre_ParCSRMatrixRowStarts(A_array[level])); hypre_ParVectorNumVectors(U_array[level]) = num_vectors; hypre_ParVectorInitialize_v2(U_array[level], memory_location); } } /*------------------------------------------------------------- * Select coarse-grid points on 'level' : returns CF_marker * for the level. Returns strength matrix, S *--------------------------------------------------------------*/ dof_func_data = NULL; if (dof_func_array[level] != NULL) { dof_func_data = hypre_IntArrayData(dof_func_array[level]); } if (debug_flag == 1) { wall_time = time_getWallclockSeconds(); } if (debug_flag == 3) { hypre_printf("\n ===== Proc = %d Level = %d =====\n", my_id, level); fflush(NULL); } if (max_levels == 1) { S = NULL; CF_marker_array[level] = hypre_IntArrayCreate(local_size); hypre_IntArrayInitialize(CF_marker_array[level]); hypre_IntArraySetConstantValues(CF_marker_array[level], 1); coarse_size = fine_size; } else /* max_levels > 1 */ { if (block_mode) { local_num_vars = hypre_CSRBlockMatrixNumRows(hypre_ParCSRBlockMatrixDiag(A_block_array[level])); } else { local_num_vars = hypre_CSRMatrixNumRows(hypre_ParCSRMatrixDiag(A_array[level])); } if (hypre_ParAMGDataGSMG(amg_data) || hypre_ParAMGDataInterpType(amg_data) == 1) { hypre_BoomerAMGCreateSmoothVecs(amg_data, A_array[level], hypre_ParAMGDataNumGridSweeps(amg_data)[1], level, &SmoothVecs); } /**** Get the Strength Matrix ****/ if (hypre_ParAMGDataGSMG(amg_data) == 0) { if (nodal) /* if we are solving systems and not using the unknown approach then we need to convert A to a nodal matrix - values that represent the blocks - before getting the strength matrix*/ { if (block_mode) { hypre_BoomerAMGBlockCreateNodalA(A_block_array[level], hypre_abs(nodal), nodal_diag, &AN); } else { hypre_BoomerAMGCreateNodalA(A_array[level], num_functions, dof_func_data, hypre_abs(nodal), nodal_diag, &AN); } /* dof array not needed for creating S because we pass in that the number of functions is 1 */ /* creat s two different ways - depending on if any entries in AN are negative: */ /* first: positive and negative entries */ if (nodal == 3 || nodal == 6 || nodal_diag > 0) { hypre_BoomerAMGCreateS(AN, strong_threshold, max_row_sum, 1, NULL, &SN); } else /* all entries are positive */ { hypre_BoomerAMGCreateSabs(AN, strong_threshold, max_row_sum, 1, NULL, &SN); } } else /* standard AMG or unknown approach */ { if (!useSabs) { hypre_BoomerAMGCreateS(A_array[level], strong_threshold, max_row_sum, num_functions, dof_func_data, &S); } else { /* hypre_BoomerAMGCreateSabs(A_array[level], strong_threshold, max_row_sum, num_functions, dof_func_array[level], &S); */ hypre_BoomerAMGCreateSabs(A_array[level], strong_threshold, 1.0, 1, NULL, &S); } } /* for AIR, need absolute value SOC: use a different threshold */ if (restri_type == 1 || restri_type == 2 || restri_type == 15) { HYPRE_Real strong_thresholdR; strong_thresholdR = hypre_ParAMGDataStrongThresholdR(amg_data); hypre_BoomerAMGCreateSabs(A_array[level], strong_thresholdR, 1.0, 1, NULL, &Sabs); } } else { hypre_BoomerAMGCreateSmoothDirs(amg_data, A_array[level], SmoothVecs, strong_threshold, num_functions, dof_func_data, &S); } /* Allocate CF_marker for the current level */ CF_marker_array[level] = hypre_IntArrayCreate(local_num_vars); hypre_IntArrayInitialize(CF_marker_array[level]); CF_marker = hypre_IntArrayData(CF_marker_array[level]); /* Set isolated fine points (SF_PT) given by the user */ if ((num_isolated_F_points > 0) && (level == 0)) { if (block_mode) { first_local_row = hypre_ParCSRBlockMatrixFirstRowIndex(A_block_array[level]); } else { first_local_row = hypre_ParCSRMatrixFirstRowIndex(A_array[level]); } #if defined(HYPRE_USING_GPU) HYPRE_ExecutionPolicy exec = hypre_GetExecPolicy1( hypre_IntArrayMemoryLocation( CF_marker_array[level]) ); if (exec == HYPRE_EXEC_DEVICE) { #if defined(HYPRE_USING_SYCL) auto perm_it = oneapi::dpl::make_permutation_iterator( hypre_IntArrayData(CF_marker_array[level]), oneapi::dpl::make_transform_iterator( isolated_F_points_marker, [first_local_row = first_local_row] (const auto & x) {return x - first_local_row;} ) ); hypreSycl_transform_if( perm_it, perm_it + num_isolated_F_points, isolated_F_points_marker, perm_it, [] (const auto & x) {return -3;}, in_range(first_local_row, first_local_row + local_size - 1) ); #else HYPRE_THRUST_CALL( scatter_if, thrust::make_constant_iterator(-3), thrust::make_constant_iterator(-3) + num_isolated_F_points, thrust::make_transform_iterator(isolated_F_points_marker, _1 - first_local_row), isolated_F_points_marker, hypre_IntArrayData(CF_marker_array[level]), in_range(first_local_row, first_local_row + local_size - 1) ); #endif } else #endif { for (j = 0; j < num_isolated_F_points; j++) { row = (HYPRE_Int) (isolated_F_points_marker[j] - first_local_row); if ((row >= 0) && (row < local_size)) { hypre_IntArrayData(CF_marker_array[level])[row] = -3; // Assumes SF_PT == -3 } } } } /**** Do the appropriate coarsening ****/ HYPRE_ANNOTATE_REGION_BEGIN("%s", "Coarsening"); if (nodal == 0) /* no nodal coarsening */ { if (coarsen_type == 6) hypre_BoomerAMGCoarsenFalgout(S, A_array[level], measure_type, coarsen_cut_factor, debug_flag, &(CF_marker_array[level])); else if (coarsen_type == 7) hypre_BoomerAMGCoarsen(S, A_array[level], 2, debug_flag, &(CF_marker_array[level])); else if (coarsen_type == 8) hypre_BoomerAMGCoarsenPMIS(S, A_array[level], 0, debug_flag, &(CF_marker_array[level])); else if (coarsen_type == 9) hypre_BoomerAMGCoarsenPMIS(S, A_array[level], 2, debug_flag, &(CF_marker_array[level])); else if (coarsen_type == 10) hypre_BoomerAMGCoarsenHMIS(S, A_array[level], measure_type, coarsen_cut_factor, debug_flag, &(CF_marker_array[level])); else if (coarsen_type == 21 || coarsen_type == 22) { #ifdef HYPRE_MIXEDINT hypre_error_w_msg(HYPRE_ERROR_GENERIC, "CGC coarsening is not available in mixedint mode!"); return hypre_error_flag; #endif hypre_BoomerAMGCoarsenCGCb(S, A_array[level], measure_type, coarsen_type, cgc_its, debug_flag, &(CF_marker_array[level])); } else if (coarsen_type == 98) hypre_BoomerAMGCoarsenCR1(A_array[level], &(CF_marker_array[level]), &coarse_size, num_CR_relax_steps, IS_type, 0); else if (coarsen_type == 99) { hypre_BoomerAMGCreateS(A_array[level], CR_strong_th, 1, num_functions, dof_func_data, &SCR); hypre_BoomerAMGCoarsenCR(A_array[level], &(CF_marker_array[level]), &coarse_size, num_CR_relax_steps, IS_type, 1, grid_relax_type[0], relax_weight[level], omega[level], CR_rate, NULL, NULL, CR_use_CG, SCR); hypre_ParCSRMatrixDestroy(SCR); } else if (coarsen_type) { hypre_BoomerAMGCoarsenRuge(S, A_array[level], measure_type, coarsen_type, coarsen_cut_factor, debug_flag, &(CF_marker_array[level])); /* DEBUG: SAVE CF the splitting HYPRE_Int my_id; MPI_Comm comm = hypre_ParCSRMatrixComm(A_array[level]); hypre_MPI_Comm_rank(comm, &my_id); char CFfile[256]; hypre_sprintf(CFfile, "hypreCF_%d.txt.%d", level, my_id); FILE *fp = fopen(CFfile, "w"); for (i=0; i 0) { if (coarsen_type == 6) hypre_BoomerAMGCoarsenFalgout(SN, SN, measure_type, coarsen_cut_factor, debug_flag, &CFN_marker); else if (coarsen_type == 7) { hypre_BoomerAMGCoarsen(SN, SN, 2, debug_flag, &CFN_marker); } else if (coarsen_type == 8) { hypre_BoomerAMGCoarsenPMIS(SN, SN, 0, debug_flag, &CFN_marker); } else if (coarsen_type == 9) { hypre_BoomerAMGCoarsenPMIS(SN, SN, 2, debug_flag, &CFN_marker); } else if (coarsen_type == 10) hypre_BoomerAMGCoarsenHMIS(SN, SN, measure_type, coarsen_cut_factor, debug_flag, &CFN_marker); else if (coarsen_type == 21 || coarsen_type == 22) hypre_BoomerAMGCoarsenCGCb(SN, SN, measure_type, coarsen_type, cgc_its, debug_flag, &CFN_marker); else if (coarsen_type) hypre_BoomerAMGCoarsenRuge(SN, SN, measure_type, coarsen_type, coarsen_cut_factor, debug_flag, &CFN_marker); else hypre_BoomerAMGCoarsen(SN, SN, 0, debug_flag, &CFN_marker); if (level < agg_num_levels) { hypre_BoomerAMGCoarseParms(comm, local_num_vars / num_functions, 1, dof_func_array[level], CFN_marker, &coarse_dof_func, coarse_pnts_global1); hypre_BoomerAMGCreate2ndS(SN, hypre_IntArrayData(CFN_marker), num_paths, coarse_pnts_global1, &S2); if (coarsen_type == 10) { hypre_BoomerAMGCoarsenHMIS(S2, S2, measure_type + 3, coarsen_cut_factor, debug_flag, &CF2_marker); } else if (coarsen_type == 8) { hypre_BoomerAMGCoarsenPMIS(S2, S2, 3, debug_flag, &CF2_marker); } else if (coarsen_type == 9) { hypre_BoomerAMGCoarsenPMIS(S2, S2, 4, debug_flag, &CF2_marker); } else if (coarsen_type == 6) { hypre_BoomerAMGCoarsenFalgout(S2, S2, measure_type, coarsen_cut_factor, debug_flag, &CF2_marker); } else if (coarsen_type == 21 || coarsen_type == 22) { hypre_BoomerAMGCoarsenCGCb(S2, S2, measure_type, coarsen_type, cgc_its, debug_flag, &CF2_marker); } else if (coarsen_type == 7) { hypre_BoomerAMGCoarsen(S2, S2, 2, debug_flag, &CF2_marker); } else if (coarsen_type) { hypre_BoomerAMGCoarsenRuge(S2, S2, measure_type, coarsen_type, coarsen_cut_factor, debug_flag, &CF2_marker); } else { hypre_BoomerAMGCoarsen(S2, S2, 0, debug_flag, &CF2_marker); } hypre_ParCSRMatrixDestroy(S2); S2 = NULL; } else { hypre_BoomerAMGCreateScalarCFS(SN, A_array[level], hypre_IntArrayData(CFN_marker), num_functions, nodal, keep_same_sign, &dof_func, &(CF_marker_array[level]), &S); hypre_IntArrayDestroy(CFN_marker); CFN_marker = NULL; hypre_ParCSRMatrixDestroy(SN); SN = NULL; hypre_ParCSRMatrixDestroy(AN); AN = NULL; } } /**************************************************/ /*********Set the fixed index to CF_marker*********/ /* copy CF_marker to the host if needed */ /* Set fine points (F_PT) given by the user */ if ( (num_F_points > 0) && (level == 0) ) { #if defined(HYPRE_USING_GPU) HYPRE_ExecutionPolicy exec = hypre_GetExecPolicy1( hypre_IntArrayMemoryLocation( CF_marker_array[level]) ); if (exec == HYPRE_EXEC_DEVICE) { #if defined(HYPRE_USING_SYCL) auto perm_it = oneapi::dpl::make_permutation_iterator( hypre_IntArrayData(CF_marker_array[level]), oneapi::dpl::make_transform_iterator( F_points_marker, [first_local_row = first_local_row] (const auto & x) {return x - first_local_row;} ) ); hypreSycl_transform_if( perm_it, perm_it + num_F_points, F_points_marker, perm_it, [] (const auto & x) {return -1;}, in_range(first_local_row, first_local_row + local_size - 1) ); #else HYPRE_THRUST_CALL( scatter_if, thrust::make_constant_iterator(-1), thrust::make_constant_iterator(-1) + num_F_points, thrust::make_transform_iterator(F_points_marker, _1 - first_local_row), F_points_marker, hypre_IntArrayData(CF_marker_array[level]), in_range(first_local_row, first_local_row + local_size - 1) ); #endif } else #endif { for (j = 0; j < num_F_points; j++) { row = (HYPRE_Int) (F_points_marker[j] - first_local_row); if ((row >= 0) && (row < local_size)) { hypre_IntArrayData(CF_marker_array[level])[row] = -1; // Assumes F_PT == -1 } } } } if (num_C_points_coarse > 0) { if (block_mode) { hypre_error_w_msg(HYPRE_ERROR_GENERIC, "Keeping coarse nodes in block mode is not implemented\n"); } else if (level < hypre_ParAMGDataCPointsLevel(amg_data)) { #if defined(HYPRE_USING_GPU) HYPRE_MemoryLocation memory_location = hypre_IntArrayMemoryLocation(CF_marker_array[level]); HYPRE_ExecutionPolicy exec = hypre_GetExecPolicy1(memory_location); if (exec == HYPRE_EXEC_DEVICE) { #if defined(HYPRE_USING_SYCL) auto perm_it = oneapi::dpl::make_permutation_iterator(hypre_IntArrayData(CF_marker_array[level]), C_points_local_marker); HYPRE_ONEDPL_CALL( std::transform, perm_it, perm_it + num_C_points_coarse, perm_it, [] (const auto & x) {return 2;} ); #else HYPRE_THRUST_CALL( scatter, thrust::make_constant_iterator(2), thrust::make_constant_iterator(2) + num_C_points_coarse, C_points_local_marker, hypre_IntArrayData(CF_marker_array[level]) ); #endif if ( level + 1 < hypre_ParAMGDataCPointsLevel(amg_data) ) { HYPRE_Int *tmp = hypre_TAlloc(HYPRE_Int, local_num_vars, memory_location); #if defined(HYPRE_USING_SYCL) HYPRE_ONEDPL_CALL( std::exclusive_scan, oneapi::dpl::make_transform_iterator(hypre_IntArrayData(CF_marker_array[level]), in_range(1, 2)), oneapi::dpl::make_transform_iterator(hypre_IntArrayData(CF_marker_array[level]) + local_num_vars, in_range(1, 2)), tmp, HYPRE_Int(0) ); /* RL: total local_coarse_size is not computed. I don't think it's needed */ hypreSycl_copy_if( tmp, tmp + local_num_vars, hypre_IntArrayData(CF_marker_array[level]), C_points_local_marker, equal(2) ); #else HYPRE_THRUST_CALL( exclusive_scan, thrust::make_transform_iterator(hypre_IntArrayData(CF_marker_array[level]), in_range(1, 2)), thrust::make_transform_iterator(hypre_IntArrayData(CF_marker_array[level]) + local_num_vars, in_range(1, 2)), tmp, HYPRE_Int(0) ); /* RL: total local_coarse_size is not computed. I don't think it's needed */ HYPRE_THRUST_CALL( copy_if, tmp, tmp + local_num_vars, hypre_IntArrayData(CF_marker_array[level]), C_points_local_marker, equal(2) ); #endif hypre_TFree(tmp, memory_location); } #if defined(HYPRE_USING_SYCL) HYPRE_ONEDPL_CALL( std::replace, hypre_IntArrayData(CF_marker_array[level]), hypre_IntArrayData(CF_marker_array[level]) + local_num_vars, 2, 1 ); #else HYPRE_THRUST_CALL( replace, hypre_IntArrayData(CF_marker_array[level]), hypre_IntArrayData(CF_marker_array[level]) + local_num_vars, 2, 1 ); #endif } else #endif { for (j = 0; j < num_C_points_coarse; j++) { hypre_IntArrayData(CF_marker_array[level])[C_points_local_marker[j]] = 2; } local_coarse_size = 0; k = 0; for (j = 0; j < local_num_vars; j ++) { if (hypre_IntArrayData(CF_marker_array[level])[j] == 1) { local_coarse_size++; } else if (hypre_IntArrayData(CF_marker_array[level])[j] == 2) { if ((level + 1) < hypre_ParAMGDataCPointsLevel(amg_data)) { C_points_local_marker[k++] = local_coarse_size; } local_coarse_size++; hypre_IntArrayData(CF_marker_array[level])[j] = 1; } } // RL: so k is not used after this? update num_C_points_coarse? } } } /*****xxxxxxxxxxxxx changes for min_coarse_size */ /* here we will determine the coarse grid size to be able to determine if it is not smaller than requested minimal size */ hypre_GpuProfilingPushRange("CheckMinSize"); if (level >= agg_num_levels) { if (block_mode) { hypre_BoomerAMGCoarseParms(comm, hypre_CSRMatrixNumRows(hypre_ParCSRMatrixDiag(AN)), 1, NULL, CF_marker_array[level], NULL, coarse_pnts_global); } else { hypre_BoomerAMGCoarseParms(comm, local_num_vars, num_functions, dof_func_array[level], CF_marker_array[level], &coarse_dof_func, coarse_pnts_global); } if (my_id == num_procs - 1) { coarse_size = coarse_pnts_global[1]; } hypre_MPI_Bcast(&coarse_size, 1, HYPRE_MPI_BIG_INT, num_procs - 1, comm); /* if no coarse-grid, stop coarsening, and set the * coarsest solve to be a single sweep of default smoother or smoother set by user */ if ((coarse_size == 0) || (coarse_size == fine_size)) { HYPRE_Int *num_grid_sweeps = hypre_ParAMGDataNumGridSweeps(amg_data); HYPRE_Int **grid_relax_points = hypre_ParAMGDataGridRelaxPoints(amg_data); if (grid_relax_type[3] == 9 || grid_relax_type[3] == 99 || grid_relax_type[3] == 19 || grid_relax_type[3] == 98) { grid_relax_type[3] = grid_relax_type[0]; num_grid_sweeps[3] = 1; if (grid_relax_points) { grid_relax_points[3][0] = 0; } } if (S) { hypre_ParCSRMatrixDestroy(S); } if (SN) { hypre_ParCSRMatrixDestroy(SN); } if (AN) { hypre_ParCSRMatrixDestroy(AN); } //hypre_TFree(CF_marker, HYPRE_MEMORY_HOST); if (level > 0) { /* note special case treatment of CF_marker is necessary * to do CF relaxation correctly when num_levels = 1 */ hypre_IntArrayDestroy(CF_marker_array[level]); CF_marker_array[level] = NULL; hypre_ParVectorDestroy(F_array[level]); hypre_ParVectorDestroy(U_array[level]); } coarse_size = fine_size; if (Sabs) { hypre_ParCSRMatrixDestroy(Sabs); Sabs = NULL; } if (coarse_dof_func) { hypre_IntArrayDestroy(coarse_dof_func); coarse_dof_func = NULL; } HYPRE_ANNOTATE_REGION_END("%s", "Coarsening"); break; } if (coarse_size < min_coarse_size) { if (S) { hypre_ParCSRMatrixDestroy(S); } if (SN) { hypre_ParCSRMatrixDestroy(SN); } if (AN) { hypre_ParCSRMatrixDestroy(AN); } if (num_functions > 1) { hypre_IntArrayDestroy(coarse_dof_func); coarse_dof_func = NULL; } hypre_IntArrayDestroy(CF_marker_array[level]); CF_marker_array[level] = NULL; if (level > 0) { hypre_ParVectorDestroy(F_array[level]); hypre_ParVectorDestroy(U_array[level]); } coarse_size = fine_size; if (Sabs) { hypre_ParCSRMatrixDestroy(Sabs); Sabs = NULL; } HYPRE_ANNOTATE_REGION_END("%s", "Coarsening"); break; } } hypre_GpuProfilingPopRange(); /*****xxxxxxxxxxxxx changes for min_coarse_size end */ HYPRE_ANNOTATE_REGION_END("%s", "Coarsening"); HYPRE_ANNOTATE_REGION_BEGIN("%s", "Interpolation"); if (level < agg_num_levels) { if (nodal == 0) { if (agg_interp_type == 1) { hypre_BoomerAMGBuildExtPIInterp(A_array[level], CF_marker, S, coarse_pnts_global1, num_functions, dof_func_data, debug_flag, agg_P12_trunc_factor, agg_P12_max_elmts, &P1); } else if (agg_interp_type == 2) { hypre_BoomerAMGBuildStdInterp(A_array[level], CF_marker, S, coarse_pnts_global1, num_functions, dof_func_data, debug_flag, agg_P12_trunc_factor, agg_P12_max_elmts, 0, &P1); } else if (agg_interp_type == 3) { hypre_BoomerAMGBuildExtInterp(A_array[level], CF_marker, S, coarse_pnts_global1, num_functions, dof_func_data, debug_flag, agg_P12_trunc_factor, agg_P12_max_elmts, &P1); } else if (agg_interp_type == 5) { hypre_BoomerAMGBuildModExtInterp(A_array[level], CF_marker, S, coarse_pnts_global1, num_functions, dof_func_data, debug_flag, agg_P12_trunc_factor, agg_P12_max_elmts, &P1); } else if (agg_interp_type == 6) { hypre_BoomerAMGBuildModExtPIInterp(A_array[level], CF_marker, S, coarse_pnts_global1, num_functions, dof_func_data, debug_flag, agg_P12_trunc_factor, agg_P12_max_elmts, &P1); } else if (agg_interp_type == 7) { hypre_BoomerAMGBuildModExtPEInterp(A_array[level], CF_marker, S, coarse_pnts_global1, num_functions, dof_func_data, debug_flag, agg_P12_trunc_factor, agg_P12_max_elmts, &P1); } if (agg_interp_type == 4) { hypre_BoomerAMGCorrectCFMarker(CF_marker_array[level], CFN_marker); hypre_IntArrayDestroy(CFN_marker); CFN_marker = NULL; hypre_BoomerAMGCoarseParms(comm, local_num_vars, num_functions, dof_func_array[level], CF_marker_array[level], &coarse_dof_func, coarse_pnts_global); hypre_BoomerAMGBuildMultipass(A_array[level], CF_marker, S, coarse_pnts_global, num_functions, dof_func_data, debug_flag, agg_trunc_factor, agg_P_max_elmts, sep_weight, &P); } else if (agg_interp_type == 8) { hypre_BoomerAMGCorrectCFMarker(CF_marker_array[level], CFN_marker); hypre_IntArrayDestroy(CFN_marker); CFN_marker = NULL; hypre_BoomerAMGCoarseParms(comm, local_num_vars, num_functions, dof_func_array[level], CF_marker_array[level], &coarse_dof_func, coarse_pnts_global); hypre_BoomerAMGBuildModMultipass(A_array[level], CF_marker, S, coarse_pnts_global, agg_trunc_factor, agg_P_max_elmts, 8, num_functions, dof_func_data, &P); } else if (agg_interp_type == 9) { hypre_BoomerAMGCorrectCFMarker(CF_marker_array[level], CFN_marker); hypre_IntArrayDestroy(CFN_marker); CFN_marker = NULL; hypre_BoomerAMGCoarseParms(comm, local_num_vars, num_functions, dof_func_array[level], CF_marker_array[level], &coarse_dof_func, coarse_pnts_global); hypre_BoomerAMGBuildModMultipass(A_array[level], CF_marker, S, coarse_pnts_global, agg_trunc_factor, agg_P_max_elmts, 9, num_functions, dof_func_data, &P); } else { hypre_BoomerAMGCorrectCFMarker2 (CF_marker_array[level], (CFN_marker)); hypre_IntArrayDestroy(CFN_marker); CFN_marker = NULL; hypre_BoomerAMGCoarseParms(comm, local_num_vars, num_functions, dof_func_array[level], CF_marker_array[level], &coarse_dof_func, coarse_pnts_global); if (agg_interp_type == 1 || agg_interp_type == 6 ) { hypre_BoomerAMGBuildPartialExtPIInterp(A_array[level], CF_marker, S, coarse_pnts_global, coarse_pnts_global1, num_functions, dof_func_data, debug_flag, agg_P12_trunc_factor, agg_P12_max_elmts, &P2); } else if (agg_interp_type == 2) { hypre_BoomerAMGBuildPartialStdInterp(A_array[level], CF_marker, S, coarse_pnts_global, coarse_pnts_global1, num_functions, dof_func_data, debug_flag, agg_P12_trunc_factor, agg_P12_max_elmts, sep_weight, &P2); } else if (agg_interp_type == 3) { hypre_BoomerAMGBuildPartialExtInterp(A_array[level], CF_marker, S, coarse_pnts_global, coarse_pnts_global1, num_functions, dof_func_data, debug_flag, agg_P12_trunc_factor, agg_P12_max_elmts, &P2); } else if (agg_interp_type == 5) { hypre_BoomerAMGBuildModPartialExtInterp(A_array[level], CF_marker, S, coarse_pnts_global, coarse_pnts_global1, num_functions, dof_func_data, debug_flag, agg_P12_trunc_factor, agg_P12_max_elmts, &P2); } else if (agg_interp_type == 7) { hypre_BoomerAMGBuildModPartialExtPEInterp(A_array[level], CF_marker, S, coarse_pnts_global, coarse_pnts_global1, num_functions, dof_func_data, debug_flag, agg_P12_trunc_factor, agg_P12_max_elmts, &P2); } if (hypre_ParAMGDataModularizedMatMat(amg_data)) { P = hypre_ParCSRMatMat(P1, P2); } else { P = hypre_ParMatmul(P1, P2); } hypre_BoomerAMGInterpTruncation(P, agg_trunc_factor, agg_P_max_elmts); if (agg_trunc_factor != 0.0 || agg_P_max_elmts > 0 || agg_P12_trunc_factor != 0.0 || agg_P12_max_elmts > 0) { hypre_ParCSRMatrixCompressOffdMap(P); } hypre_MatvecCommPkgCreate(P); hypre_ParCSRMatrixDestroy(P1); hypre_ParCSRMatrixDestroy(P2); } } else if (nodal > 0) { if (agg_interp_type == 4) { hypre_BoomerAMGCorrectCFMarker(CFN_marker, CF2_marker); hypre_IntArrayDestroy(CF2_marker); CF2_marker = NULL; hypre_BoomerAMGCreateScalarCFS(SN, A_array[level], hypre_IntArrayData(CFN_marker), num_functions, nodal, keep_same_sign, &dof_func, &(CF_marker_array[level]), &S); hypre_IntArrayDestroy(CFN_marker); CFN_marker = NULL; hypre_BoomerAMGCoarseParms(comm, local_num_vars, num_functions, dof_func_array[level], CF_marker_array[level], &coarse_dof_func, coarse_pnts_global); hypre_BoomerAMGBuildMultipass(A_array[level], CF_marker, S, coarse_pnts_global, num_functions, dof_func_data, debug_flag, agg_trunc_factor, agg_P_max_elmts, sep_weight, &P); } else if (agg_interp_type == 8) { hypre_BoomerAMGCorrectCFMarker(CFN_marker, CF2_marker); hypre_IntArrayDestroy(CF2_marker); CF2_marker = NULL; hypre_BoomerAMGCreateScalarCFS(SN, A_array[level], hypre_IntArrayData(CFN_marker), num_functions, nodal, keep_same_sign, &dof_func, &(CF_marker_array[level]), &S); hypre_IntArrayDestroy(CFN_marker); CFN_marker = NULL; hypre_BoomerAMGCoarseParms(comm, local_num_vars, num_functions, dof_func_array[level], CF_marker_array[level], &coarse_dof_func, coarse_pnts_global); hypre_BoomerAMGBuildModMultipass(A_array[level], CF_marker, S, coarse_pnts_global, agg_trunc_factor, agg_P_max_elmts, 8, num_functions, dof_func_data, &P); } else if (agg_interp_type == 9) { hypre_BoomerAMGCorrectCFMarker(CFN_marker, CF2_marker); hypre_IntArrayDestroy(CF2_marker); CF2_marker = NULL; hypre_BoomerAMGCreateScalarCFS(SN, A_array[level], hypre_IntArrayData(CFN_marker), num_functions, nodal, keep_same_sign, &dof_func, &(CF_marker_array[level]), &S); hypre_IntArrayDestroy(CFN_marker); CFN_marker = NULL; hypre_BoomerAMGCoarseParms(comm, local_num_vars, num_functions, dof_func_array[level], CF_marker_array[level], &coarse_dof_func, coarse_pnts_global); hypre_BoomerAMGBuildModMultipass(A_array[level], CF_marker, S, coarse_pnts_global, agg_trunc_factor, agg_P_max_elmts, 9, num_functions, dof_func_data, &P); } else { hypre_BoomerAMGCreateScalarCFS(SN, A_array[level], hypre_IntArrayData(CFN_marker), num_functions, nodal, keep_same_sign, &dof_func, &CF3_marker, &S); for (i = 0; i < 2; i++) { coarse_pnts_global1[i] *= num_functions; } if (agg_interp_type == 1) { hypre_BoomerAMGBuildExtPIInterp(A_array[level], hypre_IntArrayData(CF3_marker), S, coarse_pnts_global1, num_functions, dof_func_data, debug_flag, agg_P12_trunc_factor, agg_P12_max_elmts, &P1); } else if (agg_interp_type == 2) { hypre_BoomerAMGBuildStdInterp(A_array[level], hypre_IntArrayData(CF3_marker), S, coarse_pnts_global1, num_functions, dof_func_data, debug_flag, agg_P12_trunc_factor, agg_P12_max_elmts, 0, &P1); } else if (agg_interp_type == 3) { hypre_BoomerAMGBuildExtInterp(A_array[level], hypre_IntArrayData(CF3_marker), S, coarse_pnts_global1, num_functions, dof_func_data, debug_flag, agg_P12_trunc_factor, agg_P12_max_elmts, &P1); } else if (agg_interp_type == 5) { hypre_BoomerAMGBuildModExtInterp(A_array[level], hypre_IntArrayData(CF3_marker), S, coarse_pnts_global1, num_functions, dof_func_data, debug_flag, agg_P12_trunc_factor, agg_P12_max_elmts, &P1); } else if (agg_interp_type == 6) { hypre_BoomerAMGBuildModExtPIInterp(A_array[level], hypre_IntArrayData(CF3_marker), S, coarse_pnts_global1, num_functions, dof_func_data, debug_flag, agg_P12_trunc_factor, agg_P12_max_elmts, &P1); } else if (agg_interp_type == 7 ) { hypre_BoomerAMGBuildModExtPEInterp(A_array[level], hypre_IntArrayData(CF3_marker), S, coarse_pnts_global1, num_functions, dof_func_data, debug_flag, agg_P12_trunc_factor, agg_P12_max_elmts, &P1); } hypre_BoomerAMGCorrectCFMarker2 (CFN_marker, CF2_marker); hypre_IntArrayDestroy(CF2_marker); CF2_marker = NULL; hypre_IntArrayDestroy(CF3_marker); CF3_marker = NULL; hypre_ParCSRMatrixDestroy(S); hypre_BoomerAMGCreateScalarCFS(SN, A_array[level], hypre_IntArrayData(CFN_marker), num_functions, nodal, keep_same_sign, &dof_func, &(CF_marker_array[level]), &S); hypre_IntArrayDestroy(CFN_marker); CFN_marker = NULL; hypre_BoomerAMGCoarseParms(comm, local_num_vars, num_functions, dof_func_array[level], CF_marker_array[level], &coarse_dof_func, coarse_pnts_global); if (agg_interp_type == 1 || agg_interp_type == 6) { hypre_BoomerAMGBuildPartialExtPIInterp(A_array[level], CF_marker, S, coarse_pnts_global, coarse_pnts_global1, num_functions, dof_func_data, debug_flag, agg_P12_trunc_factor, agg_P12_max_elmts, &P2); } else if (agg_interp_type == 2) { hypre_BoomerAMGBuildPartialStdInterp(A_array[level], CF_marker, S, coarse_pnts_global, coarse_pnts_global1, num_functions, dof_func_data, debug_flag, agg_P12_trunc_factor, agg_P12_max_elmts, sep_weight, &P2); } else if (agg_interp_type == 3) { hypre_BoomerAMGBuildPartialExtInterp(A_array[level], CF_marker, S, coarse_pnts_global, coarse_pnts_global1, num_functions, dof_func_data, debug_flag, agg_P12_trunc_factor, agg_P12_max_elmts, &P2); } else if (agg_interp_type == 5) { hypre_BoomerAMGBuildModPartialExtInterp(A_array[level], CF_marker, S, coarse_pnts_global, coarse_pnts_global1, num_functions, dof_func_data, debug_flag, agg_P12_trunc_factor, agg_P12_max_elmts, &P2); } else if (agg_interp_type == 7) { hypre_BoomerAMGBuildModPartialExtPEInterp(A_array[level], CF_marker, S, coarse_pnts_global, coarse_pnts_global1, num_functions, dof_func_data, debug_flag, agg_P12_trunc_factor, agg_P12_max_elmts, &P2); } if (hypre_ParAMGDataModularizedMatMat(amg_data)) { P = hypre_ParCSRMatMat(P1, P2); } else { P = hypre_ParMatmul(P1, P2); } hypre_BoomerAMGInterpTruncation(P, agg_trunc_factor, agg_P_max_elmts); if (agg_trunc_factor != 0.0 || agg_P_max_elmts > 0 || agg_P12_trunc_factor != 0.0 || agg_P12_max_elmts > 0) { hypre_ParCSRMatrixCompressOffdMap(P); } hypre_MatvecCommPkgCreate(P); hypre_ParCSRMatrixDestroy(P1); hypre_ParCSRMatrixDestroy(P2); } if (SN) { hypre_ParCSRMatrixDestroy(SN); } SN = NULL; if (AN) { hypre_ParCSRMatrixDestroy(AN); } AN = NULL; } if (my_id == (num_procs - 1)) { coarse_size = coarse_pnts_global[1]; } hypre_MPI_Bcast(&coarse_size, 1, HYPRE_MPI_BIG_INT, num_procs - 1, comm); } else /* no aggressive coarsening */ { /**** Get the coarse parameters ****/ /* xxxxxxxxxxxxxxxxxxxxxxxxx change for min_coarse_size if (block_mode ) { hypre_BoomerAMGCoarseParms(comm, hypre_CSRMatrixNumRows(hypre_ParCSRMatrixDiag(AN)), 1, NULL, CF_marker, NULL, coarse_pnts_global); } else { hypre_BoomerAMGCoarseParms(comm, local_num_vars, num_functions, dof_func_array[level], CF_marker, &coarse_dof_func, coarse_pnts_global); } if (my_id == (num_procs -1)) coarse_size = coarse_pnts_global[1]; hypre_MPI_Bcast(&coarse_size, 1, HYPRE_MPI_BIG_INT, num_procs-1, comm); xxxxxxxxxxxxxxxxxxxxxxxxx change for min_coarse_size */ if (debug_flag == 1) { wall_time = time_getWallclockSeconds() - wall_time; hypre_printf("Proc = %d Level = %d Coarsen Time = %f\n", my_id, level, wall_time); fflush(NULL); } /* RL: build restriction */ if (restri_type) { HYPRE_Real filter_thresholdR; filter_thresholdR = hypre_ParAMGDataFilterThresholdR(amg_data); HYPRE_Int is_triangular = hypre_ParAMGDataIsTriangular(amg_data); HYPRE_Int gmres_switch = hypre_ParAMGDataGMRESSwitchR(amg_data); /* !!! RL: ensure that CF_marker contains -1 or 1 !!! */ #if defined(HYPRE_USING_GPU) HYPRE_MemoryLocation memory_location = hypre_IntArrayMemoryLocation(CF_marker_array[level]); HYPRE_ExecutionPolicy exec = hypre_GetExecPolicy1(memory_location); if (exec == HYPRE_EXEC_DEVICE) { hypre_BoomerAMGCFMarkerTo1minus1Device(CF_marker, hypre_CSRMatrixNumRows(hypre_ParCSRMatrixDiag(A_array[level]))); } else #endif { for (i = 0; i < hypre_CSRMatrixNumRows(hypre_ParCSRMatrixDiag(A_array[level])); i++) { CF_marker[i] = CF_marker[i] > 0 ? 1 : -1; } } if (restri_type == 1) /* distance-1 AIR */ { hypre_BoomerAMGBuildRestrAIR(A_array[level], CF_marker, Sabs, coarse_pnts_global, 1, NULL, filter_thresholdR, debug_flag, &R, is_triangular, gmres_switch ); } else if (restri_type == 2 || restri_type == 15) /* distance-2, 1.5 AIR */ { hypre_BoomerAMGBuildRestrDist2AIR(A_array[level], CF_marker, Sabs, coarse_pnts_global, 1, NULL, filter_thresholdR, debug_flag, &R, restri_type == 15, is_triangular, gmres_switch); } else { HYPRE_Int NeumannAIRDeg = restri_type - 3; hypre_assert(NeumannAIRDeg >= 0); HYPRE_Real strong_thresholdR; strong_thresholdR = hypre_ParAMGDataStrongThresholdR(amg_data); hypre_BoomerAMGBuildRestrNeumannAIR(A_array[level], CF_marker, coarse_pnts_global, 1, NULL, NeumannAIRDeg, strong_thresholdR, filter_thresholdR, debug_flag, &R ); } #if DEBUG_SAVE_ALL_OPS char file[256]; hypre_sprintf(file, "R_%d.mtx", level); hypre_ParCSRMatrixPrintIJ(R, 1, 1, file); #endif if (Sabs) { hypre_ParCSRMatrixDestroy(Sabs); Sabs = NULL; } } if (debug_flag == 1) { wall_time = time_getWallclockSeconds(); } if (interp_type == 4) { hypre_BoomerAMGBuildMultipass(A_array[level], CF_marker, S, coarse_pnts_global, num_functions, dof_func_data, debug_flag, trunc_factor, P_max_elmts, sep_weight, &P); } else if (interp_type == 1) { hypre_BoomerAMGNormalizeVecs( hypre_CSRMatrixNumRows(hypre_ParCSRMatrixDiag(A_array[level])), hypre_ParAMGDataNumSamples(amg_data), SmoothVecs); hypre_BoomerAMGBuildInterpLS(NULL, CF_marker, S, coarse_pnts_global, num_functions, dof_func_data, debug_flag, trunc_factor, hypre_ParAMGDataNumSamples(amg_data), SmoothVecs, &P); } else if (interp_type == 2) { hypre_BoomerAMGBuildInterpHE(A_array[level], CF_marker, S, coarse_pnts_global, num_functions, dof_func_data, debug_flag, trunc_factor, P_max_elmts, &P); } else if (interp_type == 3 || interp_type == 15) { hypre_BoomerAMGBuildDirInterp(A_array[level], CF_marker, S, coarse_pnts_global, num_functions, dof_func_data, debug_flag, trunc_factor, P_max_elmts, interp_type, &P); } else if (interp_type == 6) /*Extended+i classical interpolation */ { hypre_BoomerAMGBuildExtPIInterp(A_array[level], CF_marker, S, coarse_pnts_global, num_functions, dof_func_data, debug_flag, trunc_factor, P_max_elmts, &P); } else if (interp_type == 14) /*Extended classical interpolation */ { hypre_BoomerAMGBuildExtInterp(A_array[level], CF_marker, S, coarse_pnts_global, num_functions, dof_func_data, debug_flag, trunc_factor, P_max_elmts, &P); } else if (interp_type == 16) /*Extended classical MM interpolation */ { hypre_BoomerAMGBuildModExtInterp(A_array[level], CF_marker, S, coarse_pnts_global, num_functions, dof_func_data, debug_flag, trunc_factor, P_max_elmts, &P); } else if (interp_type == 17) /*Extended+i MM interpolation */ { hypre_BoomerAMGBuildModExtPIInterp(A_array[level], CF_marker, S, coarse_pnts_global, num_functions, dof_func_data, debug_flag, trunc_factor, P_max_elmts, &P); } else if (interp_type == 18) /*Extended+e MM interpolation */ { hypre_BoomerAMGBuildModExtPEInterp(A_array[level], CF_marker, S, coarse_pnts_global, num_functions, dof_func_data, debug_flag, trunc_factor, P_max_elmts, &P); } else if (interp_type == 7) /*Extended+i (if no common C) interpolation */ { hypre_BoomerAMGBuildExtPICCInterp(A_array[level], CF_marker, S, coarse_pnts_global, num_functions, dof_func_data, debug_flag, trunc_factor, P_max_elmts, &P); } else if (interp_type == 12) /*FF interpolation */ { hypre_BoomerAMGBuildFFInterp(A_array[level], CF_marker, S, coarse_pnts_global, num_functions, dof_func_data, debug_flag, trunc_factor, P_max_elmts, &P); } else if (interp_type == 13) /*FF1 interpolation */ { hypre_BoomerAMGBuildFF1Interp(A_array[level], CF_marker, S, coarse_pnts_global, num_functions, dof_func_data, debug_flag, trunc_factor, P_max_elmts, &P); } else if (interp_type == 8) /*Standard interpolation */ { hypre_BoomerAMGBuildStdInterp(A_array[level], CF_marker, S, coarse_pnts_global, num_functions, dof_func_data, debug_flag, trunc_factor, P_max_elmts, sep_weight, &P); } else if (interp_type == 100) /* 1pt interpolation */ { hypre_BoomerAMGBuildInterpOnePnt(A_array[level], CF_marker, S, coarse_pnts_global, 1, NULL, debug_flag, &P); #if DEBUG_SAVE_ALL_OPS char file[256]; hypre_sprintf(file, "P_%d.mtx", level); hypre_ParCSRMatrixPrintIJ(P, 1, 1, file); #endif } else if (hypre_ParAMGDataGSMG(amg_data) == 0) /* none of above choosen and not GMSMG */ { if (block_mode) /* nodal interpolation */ { /* convert A to a block matrix if there isn't already a block matrix - there should be one already*/ if (!(A_block_array[level])) { A_block_array[level] = hypre_ParCSRBlockMatrixConvertFromParCSRMatrix( A_array[level], num_functions); } /* note that the current CF_marker is nodal */ if (interp_type == 11) { hypre_BoomerAMGBuildBlockInterpDiag( A_block_array[level], CF_marker, SN, coarse_pnts_global, 1, NULL, debug_flag, trunc_factor, P_max_elmts, 1, &P_block_array[level]); } else if (interp_type == 22) { hypre_BoomerAMGBuildBlockInterpRV( A_block_array[level], CF_marker, SN, coarse_pnts_global, 1, NULL, debug_flag, trunc_factor, P_max_elmts, &P_block_array[level]); } else if (interp_type == 23) { hypre_BoomerAMGBuildBlockInterpRV( A_block_array[level], CF_marker, SN, coarse_pnts_global, 1, NULL, debug_flag, trunc_factor, P_max_elmts, &P_block_array[level]); } else if (interp_type == 20) { hypre_BoomerAMGBuildBlockInterp( A_block_array[level], CF_marker, SN, coarse_pnts_global, 1, NULL, debug_flag, trunc_factor, P_max_elmts, 0, &P_block_array[level]); } else if (interp_type == 21) { hypre_BoomerAMGBuildBlockInterpDiag( A_block_array[level], CF_marker, SN, coarse_pnts_global, 1, NULL, debug_flag, trunc_factor, P_max_elmts, 0, &P_block_array[level]); } else if (interp_type == 24) { hypre_BoomerAMGBuildBlockDirInterp( A_block_array[level], CF_marker, SN, coarse_pnts_global, 1, NULL, debug_flag, trunc_factor, P_max_elmts, &P_block_array[level]); } else /* interp_type ==10 */ { hypre_BoomerAMGBuildBlockInterp( A_block_array[level], CF_marker, SN, coarse_pnts_global, 1, NULL, debug_flag, trunc_factor, P_max_elmts, 1, &P_block_array[level]); } /* we need to set the global number of cols in P, as this was not done in the interp (which calls the matrix create) since we didn't have the global partition */ /* this has to be done before converting from block to non-block*/ hypre_ParCSRBlockMatrixGlobalNumCols(P_block_array[level]) = coarse_size; /* if we don't do nodal relaxation, we need a CF_array that is not nodal - right now we don't allow this to happen though*/ /* if (grid_relax_type[0] < 20 ) { hypre_BoomerAMGCreateScalarCF(CFN_marker, num_functions, hypre_CSRMatrixNumRows(hypre_ParCSRMatrixDiag(AN)), &dof_func1, &CF_marker); dof_func_array[level+1] = dof_func1; hypre_TFree(CFN_marker, HYPRE_MEMORY_HOST); CF_marker_array[level] = CF_marker; } */ /* clean up other things */ hypre_ParCSRMatrixDestroy(AN); hypre_ParCSRMatrixDestroy(SN); } else /* not block mode - use default interp (interp_type = 0) */ { if (nodal > -1) /* non-systems, or systems with unknown approach interpolation*/ { /* if systems, do we want to use an interp. that uses the full strength matrix?*/ if ( (num_functions > 1) && (interp_type == 19 || interp_type == 18 || interp_type == 17 || interp_type == 16)) { /* so create a second strength matrix and build interp with with num_functions = 1 */ hypre_BoomerAMGCreateS(A_array[level], strong_threshold, max_row_sum, 1, dof_func_data, &S2); switch (interp_type) { case 19: dbg_flg = debug_flag; if (amg_print_level) { dbg_flg = -debug_flag; } hypre_BoomerAMGBuildInterp(A_array[level], CF_marker, S2, coarse_pnts_global, 1, dof_func_data, dbg_flg, trunc_factor, P_max_elmts, &P); break; case 18: hypre_BoomerAMGBuildStdInterp(A_array[level], CF_marker, S2, coarse_pnts_global, 1, dof_func_data, debug_flag, trunc_factor, P_max_elmts, 0, &P); break; case 17: hypre_BoomerAMGBuildExtPIInterp(A_array[level], CF_marker, S2, coarse_pnts_global, 1, dof_func_data, debug_flag, trunc_factor, P_max_elmts, &P); break; case 16: dbg_flg = debug_flag; if (amg_print_level) { dbg_flg = -debug_flag; } hypre_BoomerAMGBuildInterpModUnk(A_array[level], CF_marker, S2, coarse_pnts_global, num_functions, dof_func_data, dbg_flg, trunc_factor, P_max_elmts, &P); break; } hypre_ParCSRMatrixDestroy(S2); } else /* one function only or unknown-based interpolation- */ { dbg_flg = debug_flag; if (amg_print_level) { dbg_flg = -debug_flag; } hypre_BoomerAMGBuildInterp(A_array[level], CF_marker, S, coarse_pnts_global, num_functions, dof_func_data, dbg_flg, trunc_factor, P_max_elmts, &P); } } } } else { hypre_BoomerAMGBuildInterpGSMG(NULL, CF_marker, S, coarse_pnts_global, num_functions, dof_func_data, debug_flag, trunc_factor, &P); } } /* end of no aggressive coarsening */ dof_func_array[level + 1] = NULL; if (num_functions > 1 && nodal > -1 && (!block_mode) ) { dof_func_array[level + 1] = coarse_dof_func; } HYPRE_ANNOTATE_REGION_END("%s", "Interpolation"); } /* end of if max_levels > 1 */ /* if no coarse-grid, stop coarsening, and set the * coarsest solve to be a single sweep of Jacobi */ if ( (coarse_size == 0) || (coarse_size == fine_size) ) { HYPRE_Int *num_grid_sweeps = hypre_ParAMGDataNumGridSweeps(amg_data); HYPRE_Int **grid_relax_points = hypre_ParAMGDataGridRelaxPoints(amg_data); if (grid_relax_type[3] == 9 || grid_relax_type[3] == 99 || grid_relax_type[3] == 19 || grid_relax_type[3] == 98) { grid_relax_type[3] = grid_relax_type[0]; num_grid_sweeps[3] = 1; if (grid_relax_points) { grid_relax_points[3][0] = 0; } } if (S) { hypre_ParCSRMatrixDestroy(S); } if (P) { hypre_ParCSRMatrixDestroy(P); } if (level > 0) { /* note special case treatment of CF_marker is necessary * to do CF relaxation correctly when num_levels = 1 */ hypre_IntArrayDestroy(CF_marker_array[level]); CF_marker_array[level] = NULL; hypre_ParVectorDestroy(F_array[level]); hypre_ParVectorDestroy(U_array[level]); } if (level + 1 < max_levels) { hypre_IntArrayDestroy(dof_func_array[level + 1]); dof_func_array[level + 1] = NULL; } break; } if (level < agg_num_levels && coarse_size < min_coarse_size) { if (S) { hypre_ParCSRMatrixDestroy(S); } if (P) { hypre_ParCSRMatrixDestroy(P); } if (level > 0) { hypre_IntArrayDestroy(CF_marker_array[level]); CF_marker_array[level] = NULL; hypre_ParVectorDestroy(F_array[level]); hypre_ParVectorDestroy(U_array[level]); } hypre_IntArrayDestroy(dof_func_array[level + 1]); dof_func_array[level + 1] = NULL; coarse_size = fine_size; break; } /*------------------------------------------------------------- * Build prolongation matrix, P, and place in P_array[level] *--------------------------------------------------------------*/ if (interp_refine > 0) { for (k = 0; k < interp_refine; k++) hypre_BoomerAMGRefineInterp(A_array[level], P, coarse_pnts_global, &num_functions, dof_func_data, hypre_IntArrayData(CF_marker_array[level]), level); } /* Post processing of interpolation operators to incorporate smooth vectors NOTE: must pick nodal coarsening !!! (nodal is changed above to 1 if it is 0) */ if (interp_vec_variant && nodal && num_interp_vectors) { /* TO DO: add option of smoothing the vectors at * coarser levels?*/ if (level < interp_vec_first_level) { /* coarsen the smooth vecs */ hypre_BoomerAMGCoarsenInterpVectors( P, num_interp_vectors, interp_vectors_array[level], hypre_IntArrayData(CF_marker_array[level]), &interp_vectors_array[level + 1], 0, num_functions); } /* do GM 2 and LN (3) at all levels and GM 1 only on first level */ if (( interp_vec_variant > 1 && level >= interp_vec_first_level) || (interp_vec_variant == 1 && interp_vec_first_level == level)) { /*if (level == 0) { hypre_ParCSRMatrixPrintIJ(A_array[0], 0, 0, "A"); hypre_ParVectorPrintIJ(interp_vectors_array[0][0], 0, "rbm"); }*/ if (interp_vec_variant < 3) /* GM */ { hypre_BoomerAMG_GMExpandInterp( A_array[level], &P, num_interp_vectors, interp_vectors_array[level], &num_functions, dof_func_data, &dof_func_array[level + 1], interp_vec_variant, level, abs_q_trunc, expandp_weights, q_max, hypre_IntArrayData(CF_marker_array[level]), interp_vec_first_level); } else /* LN */ { hypre_BoomerAMG_LNExpandInterp( A_array[level], &P, coarse_pnts_global, &num_functions, dof_func_data, &dof_func_array[level + 1], hypre_IntArrayData(CF_marker_array[level]), level, expandp_weights, num_interp_vectors, interp_vectors_array[level], abs_q_trunc, q_max, interp_vec_first_level); } if (level == interp_vec_first_level) { /* check to see if we made A bigger - this can happen * in 3D with certain coarsenings - if so, need to fix vtemp*/ HYPRE_Int local_sz = hypre_ParVectorActualLocalSize(Vtemp); HYPRE_Int local_P_sz = hypre_CSRMatrixNumCols(hypre_ParCSRMatrixDiag(P)); if (local_sz < local_P_sz) { hypre_Vector *Vtemp_local = hypre_ParVectorLocalVector(Vtemp); hypre_TFree(hypre_VectorData(Vtemp_local), memory_location); hypre_VectorSize(Vtemp_local) = local_P_sz; hypre_VectorData(Vtemp_local) = hypre_CTAlloc(HYPRE_Complex, local_P_sz * num_vectors, memory_location); if (Ztemp) { hypre_Vector *Ztemp_local = hypre_ParVectorLocalVector(Ztemp); hypre_TFree(hypre_VectorData(Ztemp_local), memory_location); hypre_VectorSize(Ztemp_local) = local_P_sz; hypre_VectorData(Ztemp_local) = hypre_CTAlloc(HYPRE_Complex, local_P_sz * num_vectors, memory_location); } if (Ptemp) { hypre_Vector *Ptemp_local = hypre_ParVectorLocalVector(Ptemp); hypre_TFree(hypre_VectorData(Ptemp_local), memory_location); hypre_VectorSize(Ptemp_local) = local_P_sz; hypre_VectorData(Ptemp_local) = hypre_CTAlloc(HYPRE_Complex, local_P_sz * num_vectors, memory_location); } if (Rtemp) { hypre_Vector *Rtemp_local = hypre_ParVectorLocalVector(Rtemp); hypre_TFree(hypre_VectorData(Rtemp_local), memory_location); hypre_VectorSize(Rtemp_local) = local_P_sz; hypre_VectorData(Rtemp_local) = hypre_CTAlloc(HYPRE_Complex, local_P_sz * num_vectors, memory_location); } } /*if (hypre_ParCSRMatrixGlobalNumRows(A_array[0]) < hypre_ParCSRMatrixGlobalNumCols(P)) { hypre_ParVectorDestroy(Vtemp); Vtemp = NULL; Vtemp = hypre_ParVectorCreate(hypre_ParCSRMatrixComm(P), hypre_ParCSRMatrixGlobalNumCols(P), hypre_ParCSRMatrixColStarts(P)); hypre_ParVectorInitialize(Vtemp); hypre_ParAMGDataVtemp(amg_data) = Vtemp; }*/ } /* at the first level we have to add space for the new * unknowns in the smooth vectors */ if (interp_vec_variant > 1 && level < max_levels) { HYPRE_Int expand_level = 0; if (level == interp_vec_first_level) { expand_level = 1; } hypre_BoomerAMGCoarsenInterpVectors( P, num_interp_vectors, interp_vectors_array[level], hypre_IntArrayData(CF_marker_array[level]), &interp_vectors_array[level + 1], expand_level, num_functions); } } /* end apply variant */ }/* end interp_vec_variant > 0 */ /* Improve on P with Jacobi interpolation */ for (i = 0; i < post_interp_type; i++) { hypre_BoomerAMGJacobiInterp( A_array[level], &P, S, num_functions, dof_func_data, hypre_IntArrayData(CF_marker_array[level]), level, jacobi_trunc_threshold, 0.5 * jacobi_trunc_threshold ); } dof_func_data = NULL; if (dof_func_array[level + 1]) { dof_func_data = hypre_IntArrayData(dof_func_array[level + 1]); } if (!block_mode) { if (mult_addlvl > -1 && level >= mult_addlvl && level <= add_end) { hypre_Vector *d_diag = NULL; if (ns == 1) { d_diag = hypre_SeqVectorCreate(hypre_ParCSRMatrixNumRows(A_array[level])); if (add_rlx == 0) { hypre_CSRMatrix *lvl_Adiag = hypre_ParCSRMatrixDiag(A_array[level]); HYPRE_Int lvl_nrows = hypre_CSRMatrixNumRows(lvl_Adiag); HYPRE_Int *lvl_i = hypre_CSRMatrixI(lvl_Adiag); HYPRE_Real *lvl_data = hypre_CSRMatrixData(lvl_Adiag); HYPRE_Real w_inv = 1.0 / add_rlx_wt; /*HYPRE_Real w_inv = 1.0/hypre_ParAMGDataRelaxWeight(amg_data)[level];*/ hypre_SeqVectorInitialize_v2(d_diag, HYPRE_MEMORY_HOST); for (i = 0; i < lvl_nrows; i++) { hypre_VectorData(d_diag)[i] = lvl_data[lvl_i[i]] * w_inv; } } else { HYPRE_Real *d_diag_data = NULL; hypre_ParCSRComputeL1Norms(A_array[level], 1, NULL, &d_diag_data); hypre_VectorData(d_diag) = d_diag_data; hypre_SeqVectorInitialize_v2(d_diag, hypre_ParCSRMatrixMemoryLocation(A_array[level])); } } HYPRE_ANNOTATE_REGION_BEGIN("%s", "RAP"); if (ns == 1) { hypre_ParCSRMatrix *Q = NULL; if (hypre_ParAMGDataModularizedMatMat(amg_data)) { Q = hypre_ParCSRMatMat(A_array[level], P); hypre_ParCSRMatrixAminvDB(P, Q, hypre_VectorData(d_diag), &P_array[level]); A_H = hypre_ParCSRTMatMat(P, Q); } else { Q = hypre_ParMatmul(A_array[level], P); hypre_ParCSRMatrixAminvDB(P, Q, hypre_VectorData(d_diag), &P_array[level]); A_H = hypre_ParTMatmul(P, Q); } if (num_procs > 1) { hypre_MatvecCommPkgCreate(A_H); } /*hypre_ParCSRMatrixDestroy(P); */ hypre_SeqVectorDestroy(d_diag); /* Set NonGalerkin drop tol on each level */ if (level < nongalerk_num_tol) { nongalerk_tol_l = nongalerk_tol[level]; } if (nongal_tol_array) { nongalerk_tol_l = nongal_tol_array[level]; } if (nongalerk_tol_l > 0.0) { /* Build Non-Galerkin Coarse Grid */ hypre_ParCSRMatrix *Q = NULL; hypre_BoomerAMGBuildNonGalerkinCoarseOperator(&A_H, Q, 0.333 * strong_threshold, max_row_sum, num_functions, dof_func_data, hypre_IntArrayData(CF_marker_array[level]), /* nongalerk_tol, sym_collapse, lump_percent, beta );*/ nongalerk_tol_l, 1, 0.5, 1.0 ); hypre_ParCSRMatrixColStarts(P_array[level])[0] = hypre_ParCSRMatrixRowStarts(A_H)[0]; hypre_ParCSRMatrixColStarts(P_array[level])[1] = hypre_ParCSRMatrixRowStarts(A_H)[1]; if (!hypre_ParCSRMatrixCommPkg(A_H)) { hypre_MatvecCommPkgCreate(A_H); } } hypre_ParCSRMatrixDestroy(Q); } else { HYPRE_Int ns_tmp = ns; hypre_ParCSRMatrix *C = NULL; hypre_ParCSRMatrix *Ptmp = NULL; /* Set NonGalerkin drop tol on each level */ if (level < nongalerk_num_tol) { nongalerk_tol_l = nongalerk_tol[level]; } if (nongal_tol_array) { nongalerk_tol_l = nongal_tol_array[level]; } if (nongalerk_tol_l > 0.0) { /* Construct AP, and then RAP */ hypre_ParCSRMatrix *Q = NULL; if (hypre_ParAMGDataModularizedMatMat(amg_data)) { Q = hypre_ParCSRMatMat(A_array[level], P); A_H = hypre_ParCSRTMatMatKT(P, Q, keepTranspose); } else { Q = hypre_ParMatmul(A_array[level], P); A_H = hypre_ParTMatmul(P, Q); } if (num_procs > 1) { hypre_MatvecCommPkgCreate(A_H); } /* Build Non-Galerkin Coarse Grid */ hypre_BoomerAMGBuildNonGalerkinCoarseOperator(&A_H, Q, 0.333 * strong_threshold, max_row_sum, num_functions, dof_func_data, hypre_IntArrayData(CF_marker_array[level]), /* nongalerk_tol, sym_collapse, lump_percent, beta );*/ nongalerk_tol_l, 1, 0.5, 1.0 ); if (!hypre_ParCSRMatrixCommPkg(A_H)) { hypre_MatvecCommPkgCreate(A_H); } /* Delete AP */ hypre_ParCSRMatrixDestroy(Q); } else if (rap2) { /* Use two matrix products to generate A_H */ hypre_ParCSRMatrix *Q = NULL; if (hypre_ParAMGDataModularizedMatMat(amg_data)) { Q = hypre_ParCSRMatMat(A_array[level], P); A_H = hypre_ParCSRTMatMatKT(P, Q, keepTranspose); } else { Q = hypre_ParMatmul(A_array[level], P); A_H = hypre_ParTMatmul(P, Q); } if (num_procs > 1) { hypre_MatvecCommPkgCreate(A_H); } /* Delete AP */ hypre_ParCSRMatrixDestroy(Q); } else { if (hypre_ParAMGDataModularizedMatMat(amg_data)) { A_H = hypre_ParCSRMatrixRAPKT(P, A_array[level], P, keepTranspose); } else { hypre_BoomerAMGBuildCoarseOperatorKT(P, A_array[level], P, keepTranspose, &A_H); } } if (add_rlx == 18) { C = hypre_CreateC(A_array[level], 0.0); } else { C = hypre_CreateC(A_array[level], add_rlx_wt); } Ptmp = P; while (ns_tmp > 0) { Pnew = Ptmp; Ptmp = NULL; if (hypre_ParAMGDataModularizedMatMat(amg_data)) { Ptmp = hypre_ParCSRMatMat(C, Pnew); } else { Ptmp = hypre_ParMatmul(C, Pnew); } if (ns_tmp < ns) { hypre_ParCSRMatrixDestroy(Pnew); } ns_tmp--; } Pnew = Ptmp; P_array[level] = Pnew; hypre_ParCSRMatrixDestroy(C); } /* if (ns == 1) */ HYPRE_ANNOTATE_REGION_END("%s", "RAP"); if (add_P_max_elmts || add_trunc_factor) { hypre_BoomerAMGTruncandBuild(P_array[level], add_trunc_factor, add_P_max_elmts); } /*else hypre_MatvecCommPkgCreate(P_array[level]); */ hypre_ParCSRMatrixDestroy(P); } else { P_array[level] = P; /* RL: save R matrix */ if (restri_type) { R_array[level] = R; } } } if (S) { hypre_ParCSRMatrixDestroy(S); } S = NULL; hypre_TFree(SmoothVecs, HYPRE_MEMORY_HOST); if (debug_flag == 1) { wall_time = time_getWallclockSeconds() - wall_time; hypre_printf("Proc = %d Level = %d Build Interp Time = %f\n", my_id, level, wall_time); fflush(NULL); } /*------------------------------------------------------------- * Build coarse-grid operator, A_array[level+1] by R*A*P *--------------------------------------------------------------*/ HYPRE_ANNOTATE_REGION_BEGIN("%s", "RAP"); if (debug_flag == 1) { wall_time = time_getWallclockSeconds(); } if (block_mode) { hypre_ParCSRBlockMatrixRAP(P_block_array[level], A_block_array[level], P_block_array[level], &A_H_block); hypre_ParCSRBlockMatrixSetNumNonzeros(A_H_block); hypre_ParCSRBlockMatrixSetDNumNonzeros(A_H_block); A_block_array[level + 1] = A_H_block; } else if (mult_addlvl == -1 || level < mult_addlvl || level > add_end) { /* Set NonGalerkin drop tol on each level */ if (level < nongalerk_num_tol) { nongalerk_tol_l = nongalerk_tol[level]; } if (nongal_tol_array) { nongalerk_tol_l = nongal_tol_array[level]; } if (nongalerk_tol_l > 0.0) { /* Construct AP, and then RAP */ hypre_ParCSRMatrix *Q = NULL; if (hypre_ParAMGDataModularizedMatMat(amg_data)) { Q = hypre_ParCSRMatMat(A_array[level], P_array[level]); A_H = hypre_ParCSRTMatMatKT(P_array[level], Q, keepTranspose); } else { Q = hypre_ParMatmul(A_array[level], P_array[level]); A_H = hypre_ParTMatmul(P_array[level], Q); } if (num_procs > 1) { hypre_MatvecCommPkgCreate(A_H); } /* Build Non-Galerkin Coarse Grid */ hypre_BoomerAMGBuildNonGalerkinCoarseOperator(&A_H, Q, 0.333 * strong_threshold, max_row_sum, num_functions, dof_func_data, hypre_IntArrayData(CF_marker_array[level]), /* nongalerk_tol, sym_collapse, lump_percent, beta );*/ nongalerk_tol_l, 1, 0.5, 1.0 ); if (!hypre_ParCSRMatrixCommPkg(A_H)) { hypre_MatvecCommPkgCreate(A_H); } /* Delete AP */ hypre_ParCSRMatrixDestroy(Q); } else if (restri_type) /* RL: */ { /* Use two matrix products to generate A_H */ hypre_ParCSRMatrix *AP = NULL; if (hypre_ParAMGDataModularizedMatMat(amg_data)) { AP = hypre_ParCSRMatMat(A_array[level], P_array[level]); A_H = hypre_ParCSRMatMat(R_array[level], AP); hypre_CSRMatrixReorder(hypre_ParCSRMatrixDiag(A_H)); } else { AP = hypre_ParMatmul(A_array[level], P_array[level]); A_H = hypre_ParMatmul(R_array[level], AP); } if (num_procs > 1) { hypre_MatvecCommPkgCreate(A_H); } /* Delete AP */ hypre_ParCSRMatrixDestroy(AP); } else if (rap2) { /* Use two matrix products to generate A_H */ hypre_ParCSRMatrix *Q = NULL; if (hypre_ParAMGDataModularizedMatMat(amg_data)) { Q = hypre_ParCSRMatMat(A_array[level], P_array[level]); A_H = hypre_ParCSRTMatMatKT(P_array[level], Q, keepTranspose); } else { Q = hypre_ParMatmul(A_array[level], P_array[level]); A_H = hypre_ParTMatmul(P_array[level], Q); } if (num_procs > 1) { hypre_MatvecCommPkgCreate(A_H); } /* Delete AP */ hypre_ParCSRMatrixDestroy(Q); } else { /* Compute standard Galerkin coarse-grid product */ if (hypre_ParAMGDataModularizedMatMat(amg_data)) { A_H = hypre_ParCSRMatrixRAPKT(P_array[level], A_array[level], P_array[level], keepTranspose); } else { hypre_BoomerAMGBuildCoarseOperatorKT(P_array[level], A_array[level], P_array[level], keepTranspose, &A_H); } if (Pnew && ns == 1) { hypre_ParCSRMatrixDestroy(P); P_array[level] = Pnew; } } } #if DEBUG_SAVE_ALL_OPS if (level == 0) { hypre_ParCSRMatrixPrintIJ(A_array[0], 0, 0, "A_00.IJ.out"); } char file[256]; hypre_sprintf(file, "A_%02d.IJ.out", level + 1); hypre_ParCSRMatrixPrintIJ(A_H, 0, 0, file); hypre_sprintf(file, "P_%02d.IJ.out", level); hypre_ParCSRMatrixPrintIJ(P_array[level], 0, 0, file); #endif HYPRE_ANNOTATE_REGION_END("%s", "RAP"); if (debug_flag == 1) { wall_time = time_getWallclockSeconds() - wall_time; hypre_printf("Proc = %d Level = %d Build Coarse Operator Time = %f\n", my_id, level, wall_time); fflush(NULL); } HYPRE_ANNOTATE_MGLEVEL_END(level); hypre_GpuProfilingPopRange(); ++level; HYPRE_ANNOTATE_MGLEVEL_BEGIN(level); hypre_sprintf(nvtx_name, "%s-%d", "AMG Level", level); hypre_GpuProfilingPushRange(nvtx_name); if (!block_mode) { /* dropping in A_H */ hypre_ParCSRMatrixDropSmallEntries(A_H, hypre_ParAMGDataADropTol(amg_data), hypre_ParAMGDataADropType(amg_data)); /* if CommPkg for A_H was not built */ if (num_procs > 1 && hypre_ParCSRMatrixCommPkg(A_H) == NULL) { hypre_MatvecCommPkgCreate(A_H); } /* NumNonzeros was set in hypre_ParCSRMatrixDropSmallEntries */ if (hypre_ParAMGDataADropTol(amg_data) <= 0.0) { hypre_ParCSRMatrixSetNumNonzeros(A_H); hypre_ParCSRMatrixSetDNumNonzeros(A_H); } A_array[level] = A_H; } #if defined(HYPRE_USING_GPU) if (exec == HYPRE_EXEC_HOST) #endif { HYPRE_Real size = ((HYPRE_Real)fine_size) * .75; if (coarsen_type > 0 && coarse_size >= (HYPRE_BigInt)size) { coarsen_type = 0; } } { HYPRE_Int max_thresh = hypre_max(coarse_threshold, seq_threshold); #if defined(HYPRE_USING_DSUPERLU) max_thresh = hypre_max(max_thresh, dslu_threshold); #endif if ( (level == max_levels - 1) || (coarse_size <= (HYPRE_BigInt) max_thresh) ) { not_finished_coarsening = 0; } } } /* end of coarsening loop: while (not_finished_coarsening) */ HYPRE_ANNOTATE_REGION_BEGIN("%s", "Coarse solve"); /* redundant coarse grid solve */ if ((seq_threshold >= coarse_threshold) && (coarse_size > (HYPRE_BigInt) coarse_threshold) && (level != max_levels - 1)) { hypre_seqAMGSetup(amg_data, level, coarse_threshold); } #if defined(HYPRE_USING_DSUPERLU) else if ((dslu_threshold >= coarse_threshold) && (coarse_size > (HYPRE_BigInt)coarse_threshold) && (level != max_levels - 1)) { HYPRE_Solver dslu_solver; hypre_SLUDistSetup(&dslu_solver, A_array[level], amg_print_level); hypre_ParAMGDataDSLUSolver(amg_data) = dslu_solver; } #endif else if (grid_relax_type[3] == 9 || grid_relax_type[3] == 19 || grid_relax_type[3] == 98 || grid_relax_type[3] == 99 || grid_relax_type[3] == 198 || grid_relax_type[3] == 199) { /* Gaussian elimination on the coarsest level */ if (coarse_size <= coarse_threshold) { hypre_GaussElimSetup(amg_data, level, grid_relax_type[3]); } else { grid_relax_type[3] = grid_relax_type[1]; } } HYPRE_ANNOTATE_REGION_END("%s", "Coarse solve"); HYPRE_ANNOTATE_MGLEVEL_END(level); hypre_GpuProfilingPopRange(); if (level > 0) { if (block_mode) { F_array[level] = hypre_ParVectorCreateFromBlock(hypre_ParCSRBlockMatrixComm(A_block_array[level]), hypre_ParCSRMatrixGlobalNumRows(A_block_array[level]), hypre_ParCSRBlockMatrixRowStarts(A_block_array[level]), hypre_ParCSRBlockMatrixBlockSize(A_block_array[level])); hypre_ParVectorInitialize(F_array[level]); U_array[level] = hypre_ParVectorCreateFromBlock(hypre_ParCSRBlockMatrixComm(A_block_array[level]), hypre_ParCSRMatrixGlobalNumRows(A_block_array[level]), hypre_ParCSRBlockMatrixRowStarts(A_block_array[level]), hypre_ParCSRBlockMatrixBlockSize(A_block_array[level])); hypre_ParVectorInitialize(U_array[level]); } else { F_array[level] = hypre_ParVectorCreate(hypre_ParCSRMatrixComm(A_array[level]), hypre_ParCSRMatrixGlobalNumRows(A_array[level]), hypre_ParCSRMatrixRowStarts(A_array[level])); hypre_ParVectorNumVectors(F_array[level]) = num_vectors; hypre_ParVectorInitialize_v2(F_array[level], memory_location); U_array[level] = hypre_ParVectorCreate(hypre_ParCSRMatrixComm(A_array[level]), hypre_ParCSRMatrixGlobalNumRows(A_array[level]), hypre_ParCSRMatrixRowStarts(A_array[level])); hypre_ParVectorNumVectors(U_array[level]) = num_vectors; hypre_ParVectorInitialize_v2(U_array[level], memory_location); } } /*----------------------------------------------------------------------- * enter all the stuff created, A[level], P[level], CF_marker[level], * for levels 1 through coarsest, into amg_data data structure *-----------------------------------------------------------------------*/ num_levels = level + 1; hypre_ParAMGDataNumLevels(amg_data) = num_levels; if (hypre_ParAMGDataSmoothNumLevels(amg_data) > num_levels - 1) { hypre_ParAMGDataSmoothNumLevels(amg_data) = num_levels; } smooth_num_levels = hypre_ParAMGDataSmoothNumLevels(amg_data); /*----------------------------------------------------------------------- * Setup of special smoothers when needed *-----------------------------------------------------------------------*/ hypre_GpuProfilingPushRange("Relaxation"); if (addlvl > -1 || grid_relax_type[1] == 7 || grid_relax_type[2] == 7 || grid_relax_type[3] == 7 || grid_relax_type[1] == 8 || grid_relax_type[2] == 8 || grid_relax_type[3] == 8 || grid_relax_type[1] == 11 || grid_relax_type[2] == 11 || grid_relax_type[3] == 11 || grid_relax_type[1] == 12 || grid_relax_type[2] == 12 || grid_relax_type[3] == 12 || grid_relax_type[1] == 13 || grid_relax_type[2] == 13 || grid_relax_type[3] == 13 || grid_relax_type[1] == 14 || grid_relax_type[2] == 14 || grid_relax_type[3] == 14 || grid_relax_type[1] == 18 || grid_relax_type[2] == 18 || grid_relax_type[3] == 18 || grid_relax_type[1] == 30 || grid_relax_type[2] == 30 || grid_relax_type[3] == 30 || grid_relax_type[1] == 88 || grid_relax_type[2] == 88 || grid_relax_type[3] == 88 || grid_relax_type[1] == 89 || grid_relax_type[2] == 89 || grid_relax_type[3] == 89) { l1_norms = hypre_CTAlloc(hypre_Vector*, num_levels, HYPRE_MEMORY_HOST); hypre_ParAMGDataL1Norms(amg_data) = l1_norms; } /* Chebyshev */ if (grid_relax_type[0] == 16 || grid_relax_type[1] == 16 || grid_relax_type[2] == 16 || grid_relax_type[3] == 16) { max_eig_est = hypre_CTAlloc(HYPRE_Real, num_levels, HYPRE_MEMORY_HOST); min_eig_est = hypre_CTAlloc(HYPRE_Real, num_levels, HYPRE_MEMORY_HOST); hypre_ParAMGDataMaxEigEst(amg_data) = max_eig_est; hypre_ParAMGDataMinEigEst(amg_data) = min_eig_est; cheby_ds = hypre_CTAlloc(hypre_Vector *, num_levels, HYPRE_MEMORY_HOST); cheby_coefs = hypre_CTAlloc(HYPRE_Real *, num_levels, HYPRE_MEMORY_HOST); hypre_ParAMGDataChebyDS(amg_data) = cheby_ds; hypre_ParAMGDataChebyCoefs(amg_data) = cheby_coefs; } /* CG */ if (grid_relax_type[0] == 15 || grid_relax_type[1] == 15 || grid_relax_type[2] == 15 || grid_relax_type[3] == 15) { smoother = hypre_CTAlloc(HYPRE_Solver, num_levels, HYPRE_MEMORY_HOST); hypre_ParAMGDataSmoother(amg_data) = smoother; } if (addlvl == -1) { addlvl = num_levels; } for (j = 0; j < addlvl; j++) { HYPRE_Real *l1_norm_data = NULL; HYPRE_ANNOTATE_MGLEVEL_BEGIN(j); HYPRE_ANNOTATE_REGION_BEGIN("%s", "Relaxation"); hypre_sprintf(nvtx_name, "%s-%d", "AMG Level", level); hypre_GpuProfilingPushRange(nvtx_name); hypre_sprintf(nvtx_name, "%s-%d", "Relaxation", j); hypre_GpuProfilingPushRange(nvtx_name); if (j < num_levels - 1 && (grid_relax_type[1] == 8 || grid_relax_type[1] == 89 || grid_relax_type[1] == 13 || grid_relax_type[1] == 14 || grid_relax_type[2] == 8 || grid_relax_type[2] == 89 || grid_relax_type[2] == 13 || grid_relax_type[2] == 14)) { if (relax_order) { hypre_ParCSRComputeL1Norms(A_array[j], 4, hypre_IntArrayData(CF_marker_array[j]), &l1_norm_data); } else { hypre_ParCSRComputeL1Norms(A_array[j], 4, NULL, &l1_norm_data); } } else if (j == num_levels - 1 && (grid_relax_type[3] == 8 || grid_relax_type[3] == 89 || grid_relax_type[3] == 13 || grid_relax_type[3] == 14)) { hypre_ParCSRComputeL1Norms(A_array[j], 4, NULL, &l1_norm_data); } if (j < num_levels - 1 && (grid_relax_type[1] == 30 || grid_relax_type[2] == 30)) { if (relax_order) { hypre_ParCSRComputeL1Norms(A_array[j], 3, hypre_IntArrayData(CF_marker_array[j]), &l1_norm_data); } else { hypre_ParCSRComputeL1Norms(A_array[j], 3, NULL, &l1_norm_data); } } else if (j == num_levels - 1 && grid_relax_type[3] == 30) { hypre_ParCSRComputeL1Norms(A_array[j], 3, NULL, &l1_norm_data); } if (j < num_levels - 1 && (grid_relax_type[1] == 88 || grid_relax_type[2] == 88 )) { if (relax_order) { hypre_ParCSRComputeL1Norms(A_array[j], 6, hypre_IntArrayData(CF_marker_array[j]), &l1_norm_data); } else { hypre_ParCSRComputeL1Norms(A_array[j], 6, NULL, &l1_norm_data); } } else if (j == num_levels - 1 && (grid_relax_type[3] == 88)) { hypre_ParCSRComputeL1Norms(A_array[j], 6, NULL, &l1_norm_data); } if (j < num_levels - 1 && (grid_relax_type[1] == 18 || grid_relax_type[2] == 18)) { if (relax_order) { hypre_ParCSRComputeL1Norms(A_array[j], 1, hypre_IntArrayData(CF_marker_array[j]), &l1_norm_data); } else { hypre_ParCSRComputeL1Norms(A_array[j], 1, NULL, &l1_norm_data); } } else if (j == num_levels - 1 && grid_relax_type[3] == 18) { hypre_ParCSRComputeL1Norms(A_array[j], 1, NULL, &l1_norm_data); } if (l1_norm_data) { l1_norms[j] = hypre_SeqVectorCreate(hypre_ParCSRMatrixNumRows(A_array[j])); hypre_VectorData(l1_norms[j]) = l1_norm_data; hypre_SeqVectorInitialize_v2(l1_norms[j], hypre_ParCSRMatrixMemoryLocation(A_array[j])); } HYPRE_ANNOTATE_REGION_END("%s", "Relaxation"); HYPRE_ANNOTATE_MGLEVEL_END(j); hypre_GpuProfilingPopRange(); hypre_GpuProfilingPopRange(); } for (j = addlvl; j < hypre_min(add_end + 1, num_levels) ; j++) { if (add_rlx == 18 ) { HYPRE_Real *l1_norm_data = NULL; HYPRE_ANNOTATE_MGLEVEL_BEGIN(j); HYPRE_ANNOTATE_REGION_BEGIN("%s", "Relaxation"); hypre_sprintf(nvtx_name, "%s-%d", "AMG Level", level); hypre_GpuProfilingPushRange(nvtx_name); hypre_sprintf(nvtx_name, "%s-%d", "Relaxation", j); hypre_GpuProfilingPushRange(nvtx_name); hypre_ParCSRComputeL1Norms(A_array[j], 1, NULL, &l1_norm_data); l1_norms[j] = hypre_SeqVectorCreate(hypre_ParCSRMatrixNumRows(A_array[j])); hypre_VectorData(l1_norms[j]) = l1_norm_data; hypre_SeqVectorInitialize_v2(l1_norms[j], hypre_ParCSRMatrixMemoryLocation(A_array[j])); HYPRE_ANNOTATE_REGION_END("%s", "Relaxation"); HYPRE_ANNOTATE_MGLEVEL_END(j); hypre_GpuProfilingPopRange(); hypre_GpuProfilingPopRange(); } } for (j = add_end + 1; j < num_levels; j++) { HYPRE_Real *l1_norm_data = NULL; HYPRE_ANNOTATE_MGLEVEL_BEGIN(j); HYPRE_ANNOTATE_REGION_BEGIN("%s", "Relaxation"); hypre_sprintf(nvtx_name, "%s-%d", "AMG Level", level); hypre_GpuProfilingPushRange(nvtx_name); hypre_sprintf(nvtx_name, "%s-%d", "Relaxation", j); hypre_GpuProfilingPushRange(nvtx_name); if (j < num_levels - 1 && (grid_relax_type[1] == 8 || grid_relax_type[1] == 13 || grid_relax_type[1] == 14 || grid_relax_type[2] == 8 || grid_relax_type[2] == 13 || grid_relax_type[2] == 14)) { if (relax_order) { hypre_ParCSRComputeL1Norms(A_array[j], 4, hypre_IntArrayData(CF_marker_array[j]), &l1_norm_data); } else { hypre_ParCSRComputeL1Norms(A_array[j], 4, NULL, &l1_norm_data); } } else if ((grid_relax_type[3] == 8 || grid_relax_type[3] == 13 || grid_relax_type[3] == 14) && j == num_levels - 1) { hypre_ParCSRComputeL1Norms(A_array[j], 4, NULL, &l1_norm_data); } if ((grid_relax_type[1] == 18 || grid_relax_type[2] == 18) && j < num_levels - 1) { if (relax_order) { hypre_ParCSRComputeL1Norms(A_array[j], 1, hypre_IntArrayData(CF_marker_array[j]), &l1_norm_data); } else { hypre_ParCSRComputeL1Norms(A_array[j], 1, NULL, &l1_norm_data); } } else if (grid_relax_type[3] == 18 && j == num_levels - 1) { hypre_ParCSRComputeL1Norms(A_array[j], 1, NULL, &l1_norm_data); } if (l1_norm_data) { l1_norms[j] = hypre_SeqVectorCreate(hypre_ParCSRMatrixNumRows(A_array[j])); hypre_VectorData(l1_norms[j]) = l1_norm_data; hypre_SeqVectorInitialize_v2(l1_norms[j], hypre_ParCSRMatrixMemoryLocation(A_array[j])); } HYPRE_ANNOTATE_REGION_END("%s", "Relaxation"); HYPRE_ANNOTATE_MGLEVEL_END(j); hypre_GpuProfilingPopRange(); hypre_GpuProfilingPopRange(); } for (j = 0; j < num_levels; j++) { HYPRE_ANNOTATE_MGLEVEL_BEGIN(j); HYPRE_ANNOTATE_REGION_BEGIN("%s", "Relaxation"); hypre_sprintf(nvtx_name, "%s-%d", "AMG Level", level); hypre_GpuProfilingPushRange(nvtx_name); hypre_sprintf(nvtx_name, "%s-%d", "Relaxation", j); hypre_GpuProfilingPushRange(nvtx_name); if ( grid_relax_type[1] == 7 || grid_relax_type[2] == 7 || (grid_relax_type[3] == 7 && j == (num_levels - 1)) || grid_relax_type[1] == 11 || grid_relax_type[2] == 11 || (grid_relax_type[3] == 11 && j == (num_levels - 1)) || grid_relax_type[1] == 12 || grid_relax_type[2] == 12 || (grid_relax_type[3] == 12 && j == (num_levels - 1)) ) { HYPRE_Real *l1_norm_data = NULL; hypre_ParCSRComputeL1Norms(A_array[j], 5, NULL, &l1_norm_data); l1_norms[j] = hypre_SeqVectorCreate(hypre_ParCSRMatrixNumRows(A_array[j])); hypre_VectorData(l1_norms[j]) = l1_norm_data; hypre_SeqVectorInitialize_v2(l1_norms[j], hypre_ParCSRMatrixMemoryLocation(A_array[j])); } else if (grid_relax_type[1] == 16 || grid_relax_type[2] == 16 || (grid_relax_type[3] == 16 && j == (num_levels - 1))) { HYPRE_Int scale = hypre_ParAMGDataChebyScale(amg_data); /* If the full array is being considered, create the relevant temp vectors */ HYPRE_Int variant = hypre_ParAMGDataChebyVariant(amg_data); HYPRE_Real max_eig, min_eig = 0; HYPRE_Real *coefs = NULL; HYPRE_Int cheby_order = hypre_ParAMGDataChebyOrder(amg_data); HYPRE_Int cheby_eig_est = hypre_ParAMGDataChebyEigEst(amg_data); HYPRE_Real cheby_fraction = hypre_ParAMGDataChebyFraction(amg_data); if (cheby_eig_est) { hypre_ParCSRMaxEigEstimateCG(A_array[j], scale, cheby_eig_est, &max_eig, &min_eig); } else { hypre_ParCSRMaxEigEstimate(A_array[j], scale, &max_eig, &min_eig); } max_eig_est[j] = max_eig; min_eig_est[j] = min_eig; cheby_ds[j] = hypre_SeqVectorCreate(hypre_ParCSRMatrixNumRows(A_array[j])); hypre_VectorVectorStride(cheby_ds[j]) = hypre_ParCSRMatrixNumRows(A_array[j]); hypre_VectorIndexStride(cheby_ds[j]) = 1; hypre_VectorMemoryLocation(cheby_ds[j]) = hypre_ParCSRMatrixMemoryLocation(A_array[j]); hypre_ParCSRRelax_Cheby_Setup(A_array[j], max_eig, min_eig, cheby_fraction, cheby_order, scale, variant, &coefs, &hypre_VectorData(cheby_ds[j])); cheby_coefs[j] = coefs; } else if (grid_relax_type[1] == 15 || (grid_relax_type[3] == 15 && j == (num_levels - 1)) ) { HYPRE_ParCSRPCGCreate(comm, &smoother[j]); /*HYPRE_ParCSRPCGSetup(smoother[j], (HYPRE_ParCSRMatrix) A_array[j], (HYPRE_ParVector) F_array[j], (HYPRE_ParVector) U_array[j]);*/ HYPRE_PCGSetTol(smoother[j], 1e-12); /* make small */ HYPRE_PCGSetTwoNorm(smoother[j], 1); /* use 2-norm*/ HYPRE_ParCSRPCGSetup(smoother[j], (HYPRE_ParCSRMatrix) A_array[j], (HYPRE_ParVector) F_array[j], (HYPRE_ParVector) U_array[j]); } if (relax_weight[j] == 0.0) { hypre_ParCSRMatrixScaledNorm(A_array[j], &relax_weight[j]); if (relax_weight[j] != 0.0) { relax_weight[j] = 4.0 / 3.0 / relax_weight[j]; } else { hypre_error_w_msg(HYPRE_ERROR_GENERIC, " Warning ! Matrix norm is zero !!!"); } } if ((smooth_type == 6 || smooth_type == 16) && smooth_num_levels > j) { /* Sanity check */ if (num_vectors > 1) { hypre_error_w_msg(HYPRE_ERROR_GENERIC, "Schwarz smoothing doesn't support multicomponent vectors"); return hypre_error_flag; } schwarz_relax_wt = hypre_ParAMGDataSchwarzRlxWeight(amg_data); HYPRE_SchwarzCreate(&smoother[j]); HYPRE_SchwarzSetNumFunctions(smoother[j], num_functions); HYPRE_SchwarzSetVariant(smoother[j], hypre_ParAMGDataVariant(amg_data)); HYPRE_SchwarzSetOverlap(smoother[j], hypre_ParAMGDataOverlap(amg_data)); HYPRE_SchwarzSetDomainType(smoother[j], hypre_ParAMGDataDomainType(amg_data)); HYPRE_SchwarzSetNonSymm(smoother[j], hypre_ParAMGDataSchwarzUseNonSymm(amg_data)); if (schwarz_relax_wt > 0) { HYPRE_SchwarzSetRelaxWeight(smoother[j], schwarz_relax_wt); } HYPRE_SchwarzSetup(smoother[j], (HYPRE_ParCSRMatrix) A_array[j], (HYPRE_ParVector) f, (HYPRE_ParVector) u); if (schwarz_relax_wt < 0 ) { num_cg_sweeps = (HYPRE_Int) (-schwarz_relax_wt); hypre_BoomerAMGCGRelaxWt(amg_data, j, num_cg_sweeps, &schwarz_relax_wt); /*hypre_printf (" schwarz weight %f \n", schwarz_relax_wt);*/ HYPRE_SchwarzSetRelaxWeight(smoother[j], schwarz_relax_wt); if (hypre_ParAMGDataVariant(amg_data) > 0) { local_size = hypre_CSRMatrixNumRows(hypre_ParCSRMatrixDiag(A_array[j])); hypre_SchwarzReScale(smoother[j], local_size, schwarz_relax_wt); } schwarz_relax_wt = 1; } } else if ((smooth_type == 9 || smooth_type == 19) && smooth_num_levels > j) { /* Sanity checks */ #ifdef HYPRE_MIXEDINT hypre_error_w_msg(HYPRE_ERROR_GENERIC, "Euclid smoothing is not available in mixedint mode!"); return hypre_error_flag; #endif if (num_vectors > 1) { hypre_error_w_msg(HYPRE_ERROR_GENERIC, "Euclid smoothing doesn't support multicomponent vectors"); return hypre_error_flag; } HYPRE_EuclidCreate(comm, &smoother[j]); if (euclidfile) { HYPRE_EuclidSetParamsFromFile(smoother[j], euclidfile); } HYPRE_EuclidSetLevel(smoother[j], eu_level); if (eu_bj) { HYPRE_EuclidSetBJ(smoother[j], eu_bj); } if (eu_sparse_A) { HYPRE_EuclidSetSparseA(smoother[j], eu_sparse_A); } HYPRE_EuclidSetup(smoother[j], (HYPRE_ParCSRMatrix) A_array[j], (HYPRE_ParVector) F_array[j], (HYPRE_ParVector) U_array[j]); } else if ((smooth_type == 4 || smooth_type == 14) && smooth_num_levels > j) { /* Sanity check */ if (num_vectors > 1) { hypre_error_w_msg(HYPRE_ERROR_GENERIC, "FSAI smoothing doesn't support multicomponent vectors"); return hypre_error_flag; } HYPRE_FSAICreate(&smoother[j]); HYPRE_FSAISetAlgoType(smoother[j], fsai_algo_type); HYPRE_FSAISetLocalSolveType(smoother[j], fsai_local_solve_type); HYPRE_FSAISetMaxSteps(smoother[j], fsai_max_steps); HYPRE_FSAISetMaxStepSize(smoother[j], fsai_max_step_size); HYPRE_FSAISetMaxNnzRow(smoother[j], fsai_max_nnz_row); HYPRE_FSAISetNumLevels(smoother[j], fsai_num_levels); HYPRE_FSAISetThreshold(smoother[j], fsai_threshold); HYPRE_FSAISetKapTolerance(smoother[j], fsai_kap_tolerance); HYPRE_FSAISetTolerance(smoother[j], 0.0); HYPRE_FSAISetOmega(smoother[j], relax_weight[level]); HYPRE_FSAISetEigMaxIters(smoother[j], fsai_eig_max_iters); HYPRE_FSAISetPrintLevel(smoother[j], (amg_print_level >= 1) ? 1 : 0); HYPRE_FSAISetup(smoother[j], (HYPRE_ParCSRMatrix) A_array[j], (HYPRE_ParVector) F_array[j], (HYPRE_ParVector) U_array[j]); #if DEBUG_SAVE_ALL_OPS { char filename[256]; hypre_sprintf(filename, "G_%02d.IJ.out", j); hypre_ParCSRMatrixPrintIJ(hypre_ParFSAIDataGmat((hypre_ParFSAIData*) smoother[j]), 0, 0, filename); } #endif } else if ((smooth_type == 5 || smooth_type == 15) && smooth_num_levels > j) { /* Sanity check */ if (num_vectors > 1) { hypre_error_w_msg(HYPRE_ERROR_GENERIC, "ILU smoothing doesn't support multicomponent vectors"); return hypre_error_flag; } HYPRE_ILUCreate(&smoother[j]); HYPRE_ILUSetType(smoother[j], ilu_type); HYPRE_ILUSetLocalReordering( smoother[j], ilu_reordering_type); HYPRE_ILUSetMaxIter(smoother[j], ilu_max_iter); HYPRE_ILUSetTriSolve(smoother[j], ilu_tri_solve); HYPRE_ILUSetLowerJacobiIters(smoother[j], ilu_lower_jacobi_iters); HYPRE_ILUSetUpperJacobiIters(smoother[j], ilu_upper_jacobi_iters); HYPRE_ILUSetTol(smoother[j], 0.); HYPRE_ILUSetDropThreshold(smoother[j], ilu_droptol); HYPRE_ILUSetLogging(smoother[j], 0); HYPRE_ILUSetPrintLevel(smoother[j], 0); HYPRE_ILUSetLevelOfFill(smoother[j], ilu_lfil); HYPRE_ILUSetMaxNnzPerRow(smoother[j], ilu_max_row_nnz); HYPRE_ILUSetup(smoother[j], (HYPRE_ParCSRMatrix) A_array[j], (HYPRE_ParVector) F_array[j], (HYPRE_ParVector) U_array[j]); } else if ((smooth_type == 8 || smooth_type == 18) && smooth_num_levels > j) { /* Sanity checks */ #ifdef HYPRE_MIXEDINT hypre_error_w_msg(HYPRE_ERROR_GENERIC, "ParaSails smoothing is not available in mixedint mode!"); return hypre_error_flag; #endif if (num_vectors > 1) { hypre_error_w_msg(HYPRE_ERROR_GENERIC, "ParaSails smoothing doesn't support multicomponent vectors"); return hypre_error_flag; } HYPRE_ParCSRParaSailsCreate(comm, &smoother[j]); HYPRE_ParCSRParaSailsSetParams(smoother[j], thresh, nlevel); HYPRE_ParCSRParaSailsSetFilter(smoother[j], filter); HYPRE_ParCSRParaSailsSetSym(smoother[j], sym); HYPRE_ParCSRParaSailsSetup(smoother[j], (HYPRE_ParCSRMatrix) A_array[j], (HYPRE_ParVector) F_array[j], (HYPRE_ParVector) U_array[j]); } else if ((smooth_type == 7 || smooth_type == 17) && smooth_num_levels > j) { /* Sanity checks */ #ifdef HYPRE_MIXEDINT hypre_error_w_msg(HYPRE_ERROR_GENERIC, "Pilut smoothing is not available in mixedint mode!"); return hypre_error_flag; #endif if (num_vectors > 1) { hypre_error_w_msg(HYPRE_ERROR_GENERIC, "Pilut smoothing doesn't support multicomponent vectors"); return hypre_error_flag; } HYPRE_ParCSRPilutCreate(comm, &smoother[j]); HYPRE_ParCSRPilutSetup(smoother[j], (HYPRE_ParCSRMatrix) A_array[j], (HYPRE_ParVector) F_array[j], (HYPRE_ParVector) U_array[j]); HYPRE_ParCSRPilutSetDropTolerance(smoother[j], drop_tol); HYPRE_ParCSRPilutSetFactorRowSize(smoother[j], max_nz_per_row); } else if ( (j < num_levels - 1) || ((j == num_levels - 1) && (grid_relax_type[3] != 9 && grid_relax_type[3] != 99 && grid_relax_type[3] != 19 && grid_relax_type[3] != 98) && coarse_size > 9) ) { if (relax_weight[j] < 0) { num_cg_sweeps = (HYPRE_Int) (-relax_weight[j]); hypre_BoomerAMGCGRelaxWt(amg_data, j, num_cg_sweeps, &relax_weight[j]); } if (omega[j] < 0) { num_cg_sweeps = (HYPRE_Int) (-omega[j]); hypre_BoomerAMGCGRelaxWt(amg_data, j, num_cg_sweeps, &omega[j]); } } HYPRE_ANNOTATE_REGION_END("%s", "Relaxation"); HYPRE_ANNOTATE_MGLEVEL_END(j); hypre_GpuProfilingPopRange(); hypre_GpuProfilingPopRange(); } /* end of levels loop */ hypre_GpuProfilingPopRange(); /* Relaxation */ if (amg_logging > 1) { Residual_array = hypre_ParVectorCreate(hypre_ParCSRMatrixComm(A_array[0]), hypre_ParCSRMatrixGlobalNumRows(A_array[0]), hypre_ParCSRMatrixRowStarts(A_array[0]) ); hypre_ParVectorInitialize_v2(Residual_array, memory_location); hypre_ParAMGDataResidual(amg_data) = Residual_array; } else { hypre_ParAMGDataResidual(amg_data) = NULL; } if (simple > -1 && simple < num_levels) { hypre_CreateDinv(amg_data); } else if ( (mult_additive > -1 && mult_additive < num_levels) || (additive > -1 && additive < num_levels) ) { hypre_CreateLambda(amg_data); } if (cum_nnz_AP > 0.0) { cum_nnz_AP = hypre_ParCSRMatrixDNumNonzeros(A_array[0]); for (j = 0; j < num_levels - 1; j++) { hypre_ParCSRMatrixSetDNumNonzeros(P_array[j]); cum_nnz_AP += hypre_ParCSRMatrixDNumNonzeros(P_array[j]); cum_nnz_AP += hypre_ParCSRMatrixDNumNonzeros(A_array[j + 1]); } hypre_ParAMGDataCumNnzAP(amg_data) = cum_nnz_AP; } /*----------------------------------------------------------------------- * Print some stuff *-----------------------------------------------------------------------*/ if (amg_print_level == 1 || amg_print_level == 3) { hypre_BoomerAMGSetupStats(amg_data, A); } /* Destroy filtered matrix */ if (A_tilde != A) { hypre_ParCSRMatrixDestroy(A_tilde); A_array[0] = A; } /* Print out CF info to plot grids in matlab (see 'tools/AMGgrids.m') */ if (hypre_ParAMGDataPlotGrids(amg_data)) { HYPRE_Int *CF, *CFc, *itemp; FILE* fp; char filename[256]; HYPRE_Int coorddim = hypre_ParAMGDataCoordDim (amg_data); float *coordinates = hypre_ParAMGDataCoordinates (amg_data); if (!coordinates) { coorddim = 0; } if (block_mode) { local_size = hypre_CSRMatrixNumRows(hypre_ParCSRBlockMatrixDiag(A_block_array[0])); } else { local_size = hypre_CSRMatrixNumRows(hypre_ParCSRMatrixDiag(A)); } CF = hypre_CTAlloc(HYPRE_Int, local_size, HYPRE_MEMORY_HOST); CFc = hypre_CTAlloc(HYPRE_Int, local_size, HYPRE_MEMORY_HOST); for (level = (num_levels - 2); level >= 0; level--) { /* swap pointers */ itemp = CFc; CFc = CF; CF = itemp; if (block_mode) { local_size = hypre_CSRMatrixNumRows(hypre_ParCSRBlockMatrixDiag(A_block_array[level])); } else { local_size = hypre_CSRMatrixNumRows(hypre_ParCSRMatrixDiag(A_array[level])); } /* copy CF_marker to the host if needed */ hypre_IntArray *CF_marker_host; if (hypre_GetActualMemLocation(hypre_IntArrayMemoryLocation(CF_marker_array[level])) == hypre_MEMORY_DEVICE) { CF_marker_host = hypre_IntArrayCloneDeep_v2(CF_marker_array[level], HYPRE_MEMORY_HOST); } else { CF_marker_host = CF_marker_array[level]; } CF_marker = hypre_IntArrayData(CF_marker_host); for (i = 0, j = 0; i < local_size; i++) { /* if a C-point */ CF[i] = 0; if (CF_marker[i] > -1) { CF[i] = CFc[j] + 1; j++; } } /* copy back to device and destroy host copy */ if (hypre_GetActualMemLocation(hypre_IntArrayMemoryLocation(CF_marker_array[level])) == hypre_MEMORY_DEVICE) { hypre_IntArrayCopy(CF_marker_host, CF_marker_array[level]); hypre_IntArrayDestroy(CF_marker_host); } } if (block_mode) { local_size = hypre_CSRMatrixNumRows(hypre_ParCSRBlockMatrixDiag(A_block_array[0])); } else { local_size = hypre_CSRMatrixNumRows(hypre_ParCSRMatrixDiag(A)); } hypre_sprintf (filename, "%s.%05d", hypre_ParAMGDataPlotFileName (amg_data), my_id); fp = fopen(filename, "w"); for (i = 0; i < local_size; i++) { for (j = 0; j < coorddim; j++) { hypre_fprintf (fp, "% f ", (HYPRE_Real) coordinates[coorddim * i + j]); } hypre_fprintf(fp, "%d\n", CF[i]); } fclose(fp); hypre_TFree(CF, HYPRE_MEMORY_HOST); hypre_TFree(CFc, HYPRE_MEMORY_HOST); } /* print out matrices on all levels */ #if DEBUG { char filename[256]; if (block_mode) { hypre_ParCSRMatrix *temp_A; for (level = 0; level < num_levels; level++) { hypre_sprintf(filename, "BoomerAMG.out.A_blk.%02d.ij", level); temp_A = hypre_ParCSRBlockMatrixConvertToParCSRMatrix( A_block_array[level]); hypre_ParCSRMatrixPrintIJ(temp_A, 0, 0, filename); hypre_ParCSRMatrixDestroy(temp_A); } } else { for (level = 0; level < num_levels; level++) { hypre_sprintf(filename, "BoomerAMG.out.A.%02d.ij", level); hypre_ParCSRMatrixPrintIJ(A_array[level], 0, 0, filename); } for (level = 0; level < (num_levels - 1); level++) { hypre_sprintf(filename, "BoomerAMG.out.P.%02d.ij", level); hypre_ParCSRMatrixPrintIJ(P_array[level], 0, 0, filename); } } } #endif /* run compatible relaxation on all levels and print results */ #if 0 { hypre_ParVector *u_vec, *f_vec; HYPRE_Real *u, rho0, rho1, rho; HYPRE_Int n; for (level = 0; level < (num_levels - 1); level++) { u_vec = hypre_ParVectorCreate(hypre_ParCSRMatrixComm(A_array[level]), hypre_ParCSRMatrixGlobalNumRows(A_array[level]), hypre_ParCSRMatrixRowStarts(A_array[level])); hypre_ParVectorInitialize(u_vec); f_vec = hypre_ParVectorCreate(hypre_ParCSRMatrixComm(A_array[level]), hypre_ParCSRMatrixGlobalNumRows(A_array[level]), hypre_ParCSRMatrixRowStarts(A_array[level])); hypre_ParVectorInitialize(f_vec); hypre_ParVectorSetRandomValues(u_vec, 99); hypre_ParVectorSetConstantValues(f_vec, 0.0); /* set C-pt values to zero */ n = hypre_VectorSize(hypre_ParVectorLocalVector(u_vec)); u = hypre_VectorData(hypre_ParVectorLocalVector(u_vec)); for (i = 0; i < n; i++) { if (CF_marker_array[level][i] == 1) { u[i] = 0.0; } } rho1 = hypre_ParVectorInnerProd(u_vec, u_vec); for (i = 0; i < 5; i++) { rho0 = rho1; hypre_BoomerAMGRelax(A_array[level], f_vec, CF_marker_array[level], grid_relax_type[0], -1, relax_weight[level], omega[level], l1_norms[level], u_vec, Vtemp, Ztemp); rho1 = hypre_ParVectorInnerProd(u_vec, u_vec); rho = hypre_sqrt(rho1 / rho0); if (rho < 0.01) { break; } } hypre_ParVectorDestroy(u_vec); hypre_ParVectorDestroy(f_vec); if (my_id == 0) { hypre_printf("level = %d, rhocr = %f\n", level, rho); } } } #endif hypre_MemoryPrintUsage(comm, hypre_HandleLogLevel(hypre_handle()), "BoomerAMG setup end", 0); hypre_GpuProfilingPopRange(); HYPRE_ANNOTATE_FUNC_END; return (hypre_error_flag); } hypre-2.33.0/src/parcsr_ls/par_amg_solve.c000066400000000000000000000340501477326011500204770ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * AMG solve routine * *****************************************************************************/ #include "_hypre_parcsr_ls.h" #include "par_amg.h" /*-------------------------------------------------------------------- * hypre_BoomerAMGSolve *--------------------------------------------------------------------*/ HYPRE_Int hypre_BoomerAMGSolve( void *amg_vdata, hypre_ParCSRMatrix *A, hypre_ParVector *f, hypre_ParVector *u ) { MPI_Comm comm = hypre_ParCSRMatrixComm(A); hypre_ParAMGData *amg_data = (hypre_ParAMGData*) amg_vdata; /* Data Structure variables */ HYPRE_Int amg_print_level; HYPRE_Int amg_logging; HYPRE_Int cycle_count; HYPRE_Int num_levels; HYPRE_Int converge_type; HYPRE_Int block_mode; HYPRE_Int additive; HYPRE_Int mult_additive; HYPRE_Int simple; HYPRE_Int min_iter; HYPRE_Int max_iter; HYPRE_Real tol; hypre_ParCSRMatrix **A_array; hypre_ParVector **F_array; hypre_ParVector **U_array; hypre_ParCSRBlockMatrix **A_block_array; /* Local variables */ HYPRE_Int j; HYPRE_Int Solve_err_flag; HYPRE_Int num_procs, my_id; HYPRE_Int num_vectors; HYPRE_Real alpha = 1.0; HYPRE_Real beta = -1.0; HYPRE_Real cycle_op_count; HYPRE_Real total_coeffs; HYPRE_Real total_variables; HYPRE_Real *num_coeffs; HYPRE_Real *num_variables; HYPRE_Real cycle_cmplxty = 0.0; HYPRE_Real operat_cmplxty; HYPRE_Real grid_cmplxty; HYPRE_Real conv_factor = 0.0; HYPRE_Real resid_nrm = 1.0; HYPRE_Real resid_nrm_init = 0.0; HYPRE_Real relative_resid; HYPRE_Real rhs_norm = 0.0; HYPRE_Real old_resid; HYPRE_Real ieee_check = 0.; hypre_ParVector *Vtemp; hypre_ParVector *Rtemp; hypre_ParVector *Ptemp; hypre_ParVector *Ztemp; hypre_ParVector *Residual = NULL; HYPRE_ANNOTATE_FUNC_BEGIN; hypre_MPI_Comm_size(comm, &num_procs); hypre_MPI_Comm_rank(comm, &my_id); amg_print_level = hypre_ParAMGDataPrintLevel(amg_data); amg_logging = hypre_ParAMGDataLogging(amg_data); if (amg_logging > 1) { Residual = hypre_ParAMGDataResidual(amg_data); } num_levels = hypre_ParAMGDataNumLevels(amg_data); A_array = hypre_ParAMGDataAArray(amg_data); F_array = hypre_ParAMGDataFArray(amg_data); U_array = hypre_ParAMGDataUArray(amg_data); converge_type = hypre_ParAMGDataConvergeType(amg_data); tol = hypre_ParAMGDataTol(amg_data); min_iter = hypre_ParAMGDataMinIter(amg_data); max_iter = hypre_ParAMGDataMaxIter(amg_data); additive = hypre_ParAMGDataAdditive(amg_data); simple = hypre_ParAMGDataSimple(amg_data); mult_additive = hypre_ParAMGDataMultAdditive(amg_data); block_mode = hypre_ParAMGDataBlockMode(amg_data); A_block_array = hypre_ParAMGDataABlockArray(amg_data); Vtemp = hypre_ParAMGDataVtemp(amg_data); Rtemp = hypre_ParAMGDataRtemp(amg_data); Ptemp = hypre_ParAMGDataPtemp(amg_data); Ztemp = hypre_ParAMGDataZtemp(amg_data); num_vectors = hypre_ParVectorNumVectors(f); A_array[0] = A; F_array[0] = f; U_array[0] = u; /* Verify that the number of vectors held by f and u match */ if (hypre_ParVectorNumVectors(f) != hypre_ParVectorNumVectors(u)) { hypre_error_w_msg(HYPRE_ERROR_GENERIC, "Error: num_vectors for RHS and LHS do not match!\n"); return hypre_error_flag; } /* Update work vectors */ hypre_ParVectorResize(Vtemp, num_vectors); hypre_ParVectorResize(Rtemp, num_vectors); hypre_ParVectorResize(Ptemp, num_vectors); hypre_ParVectorResize(Ztemp, num_vectors); if (amg_logging > 1) { hypre_ParVectorResize(Residual, num_vectors); } for (j = 1; j < num_levels; j++) { hypre_ParVectorResize(F_array[j], num_vectors); hypre_ParVectorResize(U_array[j], num_vectors); } /*----------------------------------------------------------------------- * Write the solver parameters *-----------------------------------------------------------------------*/ if (my_id == 0 && amg_print_level > 1) { hypre_BoomerAMGWriteSolverParams(amg_data); } /*----------------------------------------------------------------------- * Initialize the solver error flag and assorted bookkeeping variables *-----------------------------------------------------------------------*/ Solve_err_flag = 0; total_coeffs = 0; total_variables = 0; cycle_count = 0; operat_cmplxty = 0; grid_cmplxty = 0; /*----------------------------------------------------------------------- * write some initial info *-----------------------------------------------------------------------*/ if (my_id == 0 && amg_print_level > 1 && tol > 0.) { hypre_printf("\n\nAMG SOLUTION INFO:\n"); } /*----------------------------------------------------------------------- * Compute initial fine-grid residual and print *-----------------------------------------------------------------------*/ if (amg_print_level > 1 || amg_logging > 1 || tol > 0.) { if ( amg_logging > 1 ) { hypre_ParVectorCopy(F_array[0], Residual); if (tol > 0) { hypre_ParCSRMatrixMatvec(alpha, A_array[0], U_array[0], beta, Residual); } resid_nrm = hypre_sqrt(hypre_ParVectorInnerProd( Residual, Residual )); } else { hypre_ParVectorCopy(F_array[0], Vtemp); if (tol > 0) { hypre_ParCSRMatrixMatvec(alpha, A_array[0], U_array[0], beta, Vtemp); } resid_nrm = hypre_sqrt(hypre_ParVectorInnerProd(Vtemp, Vtemp)); } /* Since it does not diminish performance, attempt to return an error flag and notify users when they supply bad input. */ if (resid_nrm != 0.) { ieee_check = resid_nrm / resid_nrm; /* INF -> NaN conversion */ } if (ieee_check != ieee_check) { /* ...INFs or NaNs in input can make ieee_check a NaN. This test for ieee_check self-equality works on all IEEE-compliant compilers/ machines, c.f. page 8 of "Lecture Notes on the Status of IEEE 754" by W. Kahan, May 31, 1996. Currently (July 2002) this paper may be found at http://HTTP.CS.Berkeley.EDU/~wkahan/ieee754status/IEEE754.PDF */ if (amg_print_level > 0) { hypre_printf("\n\nERROR detected by Hypre ... BEGIN\n"); hypre_printf("ERROR -- hypre_BoomerAMGSolve: INFs and/or NaNs detected in input.\n"); hypre_printf("User probably placed non-numerics in supplied A, x_0, or b.\n"); hypre_printf("ERROR detected by Hypre ... END\n\n\n"); } hypre_error(HYPRE_ERROR_GENERIC); HYPRE_ANNOTATE_FUNC_END; return hypre_error_flag; } /* r0 */ resid_nrm_init = resid_nrm; if (0 == converge_type) { rhs_norm = hypre_sqrt(hypre_ParVectorInnerProd(f, f)); if (rhs_norm) { relative_resid = resid_nrm_init / rhs_norm; } else { relative_resid = resid_nrm_init; } } else { /* converge_type != 0, test convergence with ||r|| / ||r0|| */ relative_resid = 1.0; } } else { relative_resid = 1.; } if (my_id == 0 && amg_print_level > 1) { hypre_printf(" relative\n"); hypre_printf(" residual factor residual\n"); hypre_printf(" -------- ------ --------\n"); hypre_printf(" Initial %e %e\n", resid_nrm_init, relative_resid); } /*----------------------------------------------------------------------- * Main V-cycle loop *-----------------------------------------------------------------------*/ while ( (relative_resid >= tol || cycle_count < min_iter) && cycle_count < max_iter ) { hypre_ParAMGDataCycleOpCount(amg_data) = 0; /* Op count only needed for one cycle */ if ( (additive < 0 || additive >= num_levels) && (mult_additive < 0 || mult_additive >= num_levels) && (simple < 0 || simple >= num_levels) ) { hypre_BoomerAMGCycle(amg_data, F_array, U_array); } else { /* RL TODO: for now, force u's all-zero flag to be FALSE */ hypre_ParVectorAllZeros(u) = 0; hypre_BoomerAMGAdditiveCycle(amg_data); } /*--------------------------------------------------------------- * Compute fine-grid residual and residual norm *----------------------------------------------------------------*/ if (amg_print_level > 1 || amg_logging > 1 || tol > 0.) { old_resid = resid_nrm; if (amg_logging > 1) { hypre_ParCSRMatrixMatvecOutOfPlace(alpha, A_array[0], U_array[0], beta, F_array[0], Residual); resid_nrm = hypre_sqrt(hypre_ParVectorInnerProd(Residual, Residual)); } else { hypre_ParCSRMatrixMatvecOutOfPlace(alpha, A_array[0], U_array[0], beta, F_array[0], Vtemp); resid_nrm = hypre_sqrt(hypre_ParVectorInnerProd(Vtemp, Vtemp)); } if (old_resid) { conv_factor = resid_nrm / old_resid; } else { conv_factor = resid_nrm; } if (0 == converge_type) { if (rhs_norm) { relative_resid = resid_nrm / rhs_norm; } else { relative_resid = resid_nrm; } } else { relative_resid = resid_nrm / resid_nrm_init; } hypre_ParAMGDataRelativeResidualNorm(amg_data) = relative_resid; } ++cycle_count; hypre_ParAMGDataNumIterations(amg_data) = cycle_count; #ifdef CUMNUMIT ++hypre_ParAMGDataCumNumIterations(amg_data); #endif if (my_id == 0 && amg_print_level > 1) { hypre_printf(" Cycle %2d %e %f %e \n", cycle_count, resid_nrm, conv_factor, relative_resid); } } if (cycle_count == max_iter && tol > 0.) { Solve_err_flag = 1; hypre_error(HYPRE_ERROR_CONV); } /*----------------------------------------------------------------------- * Compute closing statistics *-----------------------------------------------------------------------*/ if (cycle_count > 0 && resid_nrm_init) { conv_factor = hypre_pow((resid_nrm / resid_nrm_init), (1.0 / (HYPRE_Real) cycle_count)); } else { conv_factor = 1.; } if (amg_print_level > 1) { num_coeffs = hypre_CTAlloc(HYPRE_Real, num_levels, HYPRE_MEMORY_HOST); num_variables = hypre_CTAlloc(HYPRE_Real, num_levels, HYPRE_MEMORY_HOST); num_coeffs[0] = hypre_ParCSRMatrixDNumNonzeros(A); num_variables[0] = hypre_ParCSRMatrixGlobalNumRows(A); if (block_mode) { for (j = 1; j < num_levels; j++) { num_coeffs[j] = (HYPRE_Real) hypre_ParCSRBlockMatrixNumNonzeros(A_block_array[j]); num_variables[j] = (HYPRE_Real) hypre_ParCSRBlockMatrixGlobalNumRows(A_block_array[j]); } num_coeffs[0] = hypre_ParCSRBlockMatrixDNumNonzeros(A_block_array[0]); num_variables[0] = hypre_ParCSRBlockMatrixGlobalNumRows(A_block_array[0]); } else { for (j = 1; j < num_levels; j++) { num_coeffs[j] = (HYPRE_Real) hypre_ParCSRMatrixNumNonzeros(A_array[j]); num_variables[j] = (HYPRE_Real) hypre_ParCSRMatrixGlobalNumRows(A_array[j]); } } for (j = 0; j < hypre_ParAMGDataNumLevels(amg_data); j++) { total_coeffs += num_coeffs[j]; total_variables += num_variables[j]; } cycle_op_count = hypre_ParAMGDataCycleOpCount(amg_data); if (num_variables[0]) { grid_cmplxty = total_variables / num_variables[0]; } if (num_coeffs[0]) { operat_cmplxty = total_coeffs / num_coeffs[0]; cycle_cmplxty = cycle_op_count / num_coeffs[0]; } if (my_id == 0) { if (Solve_err_flag == 1) { hypre_printf("\n\n=============================================="); hypre_printf("\n NOTE: Convergence tolerance was not achieved\n"); hypre_printf(" within the allowed %d V-cycles\n", max_iter); hypre_printf("=============================================="); } hypre_printf("\n\n Average Convergence Factor = %f", conv_factor); hypre_printf("\n\n Complexity: grid = %f\n", grid_cmplxty); hypre_printf(" operator = %f\n", operat_cmplxty); hypre_printf(" cycle = %f\n\n\n\n", cycle_cmplxty); } hypre_TFree(num_coeffs, HYPRE_MEMORY_HOST); hypre_TFree(num_variables, HYPRE_MEMORY_HOST); } HYPRE_ANNOTATE_FUNC_END; return hypre_error_flag; } hypre-2.33.0/src/parcsr_ls/par_amg_solveT.c000066400000000000000000000603551477326011500206320ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * AMG transpose solve routines * *****************************************************************************/ #include "_hypre_parcsr_ls.h" #include "par_amg.h" /*-------------------------------------------------------------------- * hypre_BoomerAMGSolveT *--------------------------------------------------------------------*/ HYPRE_Int hypre_BoomerAMGSolveT( void *amg_vdata, hypre_ParCSRMatrix *A, hypre_ParVector *f, hypre_ParVector *u ) { MPI_Comm comm = hypre_ParCSRMatrixComm(A); hypre_ParAMGData *amg_data = (hypre_ParAMGData*) amg_vdata; /* Data Structure variables */ HYPRE_Int amg_print_level; HYPRE_Int amg_logging; HYPRE_Real *num_coeffs; HYPRE_Int *num_variables; HYPRE_Real cycle_op_count; HYPRE_Int num_levels; /* HYPRE_Int num_unknowns; */ HYPRE_Real tol; hypre_ParCSRMatrix **A_array; hypre_ParVector **F_array; hypre_ParVector **U_array; /* Local variables */ /*FILE *fp;*/ HYPRE_Int j; HYPRE_Int Solve_err_flag; HYPRE_Int min_iter; HYPRE_Int max_iter; HYPRE_Int cycle_count; HYPRE_Real total_coeffs; HYPRE_Int total_variables; HYPRE_Int num_procs, my_id; HYPRE_Real alpha = 1.0; HYPRE_Real beta = -1.0; HYPRE_Real cycle_cmplxty = 0.0; HYPRE_Real operat_cmplxty; HYPRE_Real grid_cmplxty; HYPRE_Real conv_factor; HYPRE_Real resid_nrm; HYPRE_Real resid_nrm_init; HYPRE_Real relative_resid; HYPRE_Real rhs_norm; HYPRE_Real old_resid; hypre_ParVector *Vtemp; hypre_ParVector *Residual; hypre_MPI_Comm_size(comm, &num_procs); hypre_MPI_Comm_rank(comm, &my_id); amg_print_level = hypre_ParAMGDataPrintLevel(amg_data); amg_logging = hypre_ParAMGDataLogging(amg_data); if ( amg_logging > 1 ) { Residual = hypre_ParAMGDataResidual(amg_data); } /* num_unknowns = hypre_ParAMGDataNumUnknowns(amg_data); */ num_levels = hypre_ParAMGDataNumLevels(amg_data); A_array = hypre_ParAMGDataAArray(amg_data); F_array = hypre_ParAMGDataFArray(amg_data); U_array = hypre_ParAMGDataUArray(amg_data); tol = hypre_ParAMGDataTol(amg_data); min_iter = hypre_ParAMGDataMinIter(amg_data); max_iter = hypre_ParAMGDataMaxIter(amg_data); num_coeffs = hypre_CTAlloc(HYPRE_Real, num_levels, HYPRE_MEMORY_HOST); num_variables = hypre_CTAlloc(HYPRE_Int, num_levels, HYPRE_MEMORY_HOST); num_coeffs[0] = hypre_ParCSRMatrixDNumNonzeros(A_array[0]); num_variables[0] = hypre_ParCSRMatrixGlobalNumRows(A_array[0]); A_array[0] = A; F_array[0] = f; U_array[0] = u; HYPRE_ANNOTATE_FUNC_BEGIN; /* Vtemp = hypre_ParVectorCreate(hypre_ParCSRMatrixComm(A_array[0]), hypre_ParCSRMatrixGlobalNumRows(A_array[0]), hypre_ParCSRMatrixRowStarts(A_array[0])); hypre_ParVectorInitialize(Vtemp); hypre_ParAMGDataVtemp(amg_data) = Vtemp; */ Vtemp = hypre_ParAMGDataVtemp(amg_data); for (j = 1; j < num_levels; j++) { num_coeffs[j] = hypre_ParCSRMatrixDNumNonzeros(A_array[j]); num_variables[j] = hypre_ParCSRMatrixGlobalNumRows(A_array[j]); } /*----------------------------------------------------------------------- * Write the solver parameters *-----------------------------------------------------------------------*/ if (my_id == 0 && amg_print_level > 1) { hypre_BoomerAMGWriteSolverParams(amg_data); } /*----------------------------------------------------------------------- * Initialize the solver error flag and assorted bookkeeping variables *-----------------------------------------------------------------------*/ Solve_err_flag = 0; total_coeffs = 0; total_variables = 0; cycle_count = 0; operat_cmplxty = 0; grid_cmplxty = 0; /*----------------------------------------------------------------------- * open the log file and write some initial info *-----------------------------------------------------------------------*/ if (my_id == 0 && amg_print_level > 1) { /*fp = fopen(file_name, "a");*/ hypre_printf("\n\nAMG SOLUTION INFO:\n"); } /*----------------------------------------------------------------------- * Compute initial fine-grid residual and print to logfile *-----------------------------------------------------------------------*/ if ( amg_logging > 1 ) { hypre_ParVectorCopy(F_array[0], Residual ); hypre_ParCSRMatrixMatvecT(alpha, A_array[0], U_array[0], beta, Residual ); resid_nrm = hypre_sqrt(hypre_ParVectorInnerProd( Residual, Residual )); } else { hypre_ParVectorCopy(F_array[0], Vtemp); hypre_ParCSRMatrixMatvecT(alpha, A_array[0], U_array[0], beta, Vtemp); resid_nrm = hypre_sqrt(hypre_ParVectorInnerProd(Vtemp, Vtemp)); } resid_nrm_init = resid_nrm; rhs_norm = hypre_sqrt(hypre_ParVectorInnerProd(f, f)); relative_resid = 9999; if (rhs_norm) { relative_resid = resid_nrm_init / rhs_norm; } if (my_id == 0 && (amg_print_level > 1)) { hypre_printf(" relative\n"); hypre_printf(" residual factor residual\n"); hypre_printf(" -------- ------ --------\n"); hypre_printf(" Initial %e %e\n", resid_nrm_init, relative_resid); } /*----------------------------------------------------------------------- * Main V-cycle loop *-----------------------------------------------------------------------*/ while ((relative_resid >= tol || cycle_count < min_iter) && cycle_count < max_iter && Solve_err_flag == 0) { hypre_ParAMGDataCycleOpCount(amg_data) = 0; /* Op count only needed for one cycle */ Solve_err_flag = hypre_BoomerAMGCycleT(amg_data, F_array, U_array); old_resid = resid_nrm; /*--------------------------------------------------------------- * Compute fine-grid residual and residual norm *----------------------------------------------------------------*/ if ( amg_logging > 1 ) { hypre_ParVectorCopy(F_array[0], Residual ); hypre_ParCSRMatrixMatvecT(alpha, A_array[0], U_array[0], beta, Residual ); resid_nrm = hypre_sqrt(hypre_ParVectorInnerProd( Residual, Residual )); } else { hypre_ParVectorCopy(F_array[0], Vtemp); hypre_ParCSRMatrixMatvecT(alpha, A_array[0], U_array[0], beta, Vtemp); resid_nrm = hypre_sqrt(hypre_ParVectorInnerProd(Vtemp, Vtemp)); } conv_factor = resid_nrm / old_resid; relative_resid = 9999; if (rhs_norm) { relative_resid = resid_nrm / rhs_norm; } ++cycle_count; hypre_ParAMGDataRelativeResidualNorm(amg_data) = relative_resid; hypre_ParAMGDataNumIterations(amg_data) = cycle_count; if (my_id == 0 && (amg_print_level > 1)) { hypre_printf(" Cycle %2d %e %f %e \n", cycle_count, resid_nrm, conv_factor, relative_resid); } } if (cycle_count == max_iter) { Solve_err_flag = 1; } /*----------------------------------------------------------------------- * Compute closing statistics *-----------------------------------------------------------------------*/ conv_factor = hypre_pow((resid_nrm / resid_nrm_init), (1.0 / ((HYPRE_Real) cycle_count))); for (j = 0; j < hypre_ParAMGDataNumLevels(amg_data); j++) { total_coeffs += num_coeffs[j]; total_variables += num_variables[j]; } cycle_op_count = hypre_ParAMGDataCycleOpCount(amg_data); if (num_variables[0]) { grid_cmplxty = ((HYPRE_Real) total_variables) / ((HYPRE_Real) num_variables[0]); } if (num_coeffs[0]) { operat_cmplxty = total_coeffs / num_coeffs[0]; cycle_cmplxty = cycle_op_count / num_coeffs[0]; } if (my_id == 0 && amg_print_level > 1) { if (Solve_err_flag == 1) { hypre_printf("\n\n=============================================="); hypre_printf("\n NOTE: Convergence tolerance was not achieved\n"); hypre_printf(" within the allowed %d V-cycles\n", max_iter); hypre_printf("=============================================="); } hypre_printf("\n\n Average Convergence Factor = %f", conv_factor); hypre_printf("\n\n Complexity: grid = %f\n", grid_cmplxty); hypre_printf(" operator = %f\n", operat_cmplxty); hypre_printf(" cycle = %f\n\n", cycle_cmplxty); } /*---------------------------------------------------------- * Close the output file (if open) *----------------------------------------------------------*/ /*if (my_id == 0 && amg_print_level >= 1) { fclose(fp); }*/ hypre_TFree(num_coeffs, HYPRE_MEMORY_HOST); hypre_TFree(num_variables, HYPRE_MEMORY_HOST); HYPRE_ANNOTATE_FUNC_END; return (Solve_err_flag); } /****************************************************************************** * * ParAMG cycling routine * *****************************************************************************/ /*-------------------------------------------------------------------------- * hypre_BoomerAMGCycleT *--------------------------------------------------------------------------*/ HYPRE_Int hypre_BoomerAMGCycleT( void *amg_vdata, hypre_ParVector **F_array, hypre_ParVector **U_array ) { hypre_ParAMGData *amg_data = (hypre_ParAMGData*) amg_vdata; /* Data Structure variables */ hypre_ParCSRMatrix **A_array; hypre_ParCSRMatrix **P_array; hypre_ParCSRMatrix **R_array; hypre_ParVector *Vtemp; hypre_IntArray **CF_marker_array; HYPRE_Int *CF_marker; /* HYPRE_Int **unknown_map_array; */ /* HYPRE_Int **point_map_array; */ /* HYPRE_Int **v_at_point_array; */ HYPRE_Real cycle_op_count; HYPRE_Int cycle_type; HYPRE_Int num_levels; HYPRE_Int max_levels; HYPRE_Real *num_coeffs; HYPRE_Int *num_grid_sweeps; HYPRE_Int *grid_relax_type; HYPRE_Int **grid_relax_points; /* Local variables */ HYPRE_Int *lev_counter; HYPRE_Int Solve_err_flag; HYPRE_Int k; HYPRE_Int j; HYPRE_Int level; HYPRE_Int cycle_param; HYPRE_Int coarse_grid; HYPRE_Int fine_grid; HYPRE_Int Not_Finished; HYPRE_Int num_sweep; HYPRE_Int relax_type; HYPRE_Int relax_points = 0; HYPRE_Real *relax_weight; HYPRE_Int old_version = 0; HYPRE_Real alpha; HYPRE_Real beta; #if 0 HYPRE_Real *D_mat; HYPRE_Real *S_vec; #endif HYPRE_ANNOTATE_FUNC_BEGIN; /* Acquire data and allocate storage */ A_array = hypre_ParAMGDataAArray(amg_data); P_array = hypre_ParAMGDataPArray(amg_data); R_array = hypre_ParAMGDataRArray(amg_data); CF_marker_array = hypre_ParAMGDataCFMarkerArray(amg_data); /* unknown_map_array = hypre_ParAMGDataUnknownMapArray(amg_data); */ /* point_map_array = hypre_ParAMGDataPointMapArray(amg_data); */ /* v_at_point_array = hypre_ParAMGDataVatPointArray(amg_data); */ Vtemp = hypre_ParAMGDataVtemp(amg_data); num_levels = hypre_ParAMGDataNumLevels(amg_data); max_levels = hypre_ParAMGDataMaxLevels(amg_data); cycle_type = hypre_ParAMGDataCycleType(amg_data); /* num_unknowns = hypre_ParCSRMatrixNumRows(A_array[0]); */ num_grid_sweeps = hypre_ParAMGDataNumGridSweeps(amg_data); grid_relax_type = hypre_ParAMGDataGridRelaxType(amg_data); grid_relax_points = hypre_ParAMGDataGridRelaxPoints(amg_data); relax_weight = hypre_ParAMGDataRelaxWeight(amg_data); cycle_op_count = hypre_ParAMGDataCycleOpCount(amg_data); lev_counter = hypre_CTAlloc(HYPRE_Int, num_levels, HYPRE_MEMORY_HOST); /* Initialize */ Solve_err_flag = 0; if (grid_relax_points) { old_version = 1; } num_coeffs = hypre_CTAlloc(HYPRE_Real, num_levels, HYPRE_MEMORY_HOST); num_coeffs[0] = hypre_ParCSRMatrixDNumNonzeros(A_array[0]); for (j = 1; j < num_levels; j++) { num_coeffs[j] = hypre_ParCSRMatrixDNumNonzeros(A_array[j]); } /*--------------------------------------------------------------------- * Initialize cycling control counter * * Cycling is controlled using a level counter: lev_counter[k] * * Each time relaxation is performed on level k, the * counter is decremented by 1. If the counter is then * negative, we go to the next finer level. If non- * negative, we go to the next coarser level. The * following actions control cycling: * * a. lev_counter[0] is initialized to 1. * b. lev_counter[k] is initialized to cycle_type for k>0. * * c. During cycling, when going down to level k, lev_counter[k] * is set to the max of (lev_counter[k],cycle_type) *---------------------------------------------------------------------*/ Not_Finished = 1; lev_counter[0] = 1; for (k = 1; k < num_levels; ++k) { lev_counter[k] = cycle_type; } level = 0; cycle_param = 0; /*--------------------------------------------------------------------- * Main loop of cycling *--------------------------------------------------------------------*/ HYPRE_ANNOTATE_MGLEVEL_BEGIN(level); while (Not_Finished) { num_sweep = num_grid_sweeps[cycle_param]; relax_type = grid_relax_type[cycle_param]; if (relax_type != 7 && relax_type != 9) { relax_type = 7; } /*------------------------------------------------------------------ * Do the relaxation num_sweep times *-----------------------------------------------------------------*/ for (j = 0; j < num_sweep; j++) { if (num_levels == 1 && max_levels > 1) { relax_points = 0; } else { if (old_version) { relax_points = grid_relax_points[cycle_param][j]; } } /*----------------------------------------------- * VERY sloppy approximation to cycle complexity *-----------------------------------------------*/ if (old_version && level < num_levels - 1) { switch (relax_points) { case 1: cycle_op_count += num_coeffs[level + 1]; break; case -1: cycle_op_count += (num_coeffs[level] - num_coeffs[level + 1]); break; } } else { cycle_op_count += num_coeffs[level]; } /* note: this does not use relax_points, so it doesn't matter if its the "old version" */ if (CF_marker_array[level] == NULL) { CF_marker = NULL; } else { CF_marker = hypre_IntArrayData(CF_marker_array[level]); } Solve_err_flag = hypre_BoomerAMGRelaxT(A_array[level], F_array[level], CF_marker, relax_type, relax_points, relax_weight[level], U_array[level], Vtemp); if (Solve_err_flag != 0) { hypre_TFree(lev_counter, HYPRE_MEMORY_HOST); hypre_TFree(num_coeffs, HYPRE_MEMORY_HOST); HYPRE_ANNOTATE_MGLEVEL_END(level); HYPRE_ANNOTATE_FUNC_END; return (Solve_err_flag); } } /*------------------------------------------------------------------ * Decrement the control counter and determine which grid to visit next *-----------------------------------------------------------------*/ --lev_counter[level]; if (lev_counter[level] >= 0 && level != num_levels - 1) { /*--------------------------------------------------------------- * Visit coarser level next. Compute residual using hypre_ParCSRMatrixMatvec. * Use interpolation (since transpose i.e. P^TATR instead of * RAP) using hypre_ParCSRMatrixMatvecT. * Reset counters and cycling parameters for coarse level *--------------------------------------------------------------*/ fine_grid = level; coarse_grid = level + 1; hypre_ParVectorSetConstantValues(U_array[coarse_grid], 0.0); hypre_ParVectorCopy(F_array[fine_grid], Vtemp); alpha = -1.0; beta = 1.0; hypre_ParCSRMatrixMatvecT(alpha, A_array[fine_grid], U_array[fine_grid], beta, Vtemp); alpha = 1.0; beta = 0.0; hypre_ParCSRMatrixMatvecT(alpha, P_array[fine_grid], Vtemp, beta, F_array[coarse_grid]); HYPRE_ANNOTATE_MGLEVEL_END(level); ++level; lev_counter[level] = hypre_max(lev_counter[level], cycle_type); cycle_param = 1; if (level == num_levels - 1) { cycle_param = 3; } HYPRE_ANNOTATE_MGLEVEL_BEGIN(level); } else if (level != 0) { /*--------------------------------------------------------------- * Visit finer level next. * Use restriction (since transpose i.e. P^TA^TR instead of RAP) * and add correction using hypre_ParCSRMatrixMatvec. * Reset counters and cycling parameters for finer level. *--------------------------------------------------------------*/ fine_grid = level - 1; coarse_grid = level; alpha = 1.0; beta = 1.0; hypre_ParCSRMatrixMatvec(alpha, R_array[fine_grid], U_array[coarse_grid], beta, U_array[fine_grid]); HYPRE_ANNOTATE_MGLEVEL_END(level); --level; cycle_param = 2; if (level == 0) { cycle_param = 0; } HYPRE_ANNOTATE_MGLEVEL_BEGIN(level); } else { Not_Finished = 0; } } HYPRE_ANNOTATE_MGLEVEL_END(level); hypre_ParAMGDataCycleOpCount(amg_data) = cycle_op_count; hypre_TFree(lev_counter, HYPRE_MEMORY_HOST); hypre_TFree(num_coeffs, HYPRE_MEMORY_HOST); HYPRE_ANNOTATE_FUNC_END; return (Solve_err_flag); } /****************************************************************************** * * Relaxation scheme * *****************************************************************************/ /*-------------------------------------------------------------------------- * hypre_BoomerAMGRelaxT *--------------------------------------------------------------------------*/ HYPRE_Int hypre_BoomerAMGRelaxT( hypre_ParCSRMatrix *A, hypre_ParVector *f, HYPRE_Int *cf_marker, HYPRE_Int relax_type, HYPRE_Int relax_points, HYPRE_Real relax_weight, hypre_ParVector *u, hypre_ParVector *Vtemp ) { HYPRE_UNUSED_VAR(cf_marker); HYPRE_UNUSED_VAR(relax_points); hypre_CSRMatrix *A_diag = hypre_ParCSRMatrixDiag(A); HYPRE_Real *A_diag_data = hypre_CSRMatrixData(A_diag); HYPRE_Int *A_diag_i = hypre_CSRMatrixI(A_diag); HYPRE_BigInt global_num_rows = hypre_ParCSRMatrixGlobalNumRows(A); HYPRE_Int n = hypre_CSRMatrixNumRows(A_diag); HYPRE_BigInt first_index = hypre_ParVectorFirstIndex(u); hypre_Vector *u_local = hypre_ParVectorLocalVector(u); HYPRE_Real *u_data = hypre_VectorData(u_local); hypre_Vector *Vtemp_local = hypre_ParVectorLocalVector(Vtemp); HYPRE_Real *Vtemp_data = hypre_VectorData(Vtemp_local); hypre_CSRMatrix *A_CSR; HYPRE_Int *A_CSR_i; HYPRE_Int *A_CSR_j; HYPRE_Real *A_CSR_data; hypre_Vector *f_vector; HYPRE_Real *f_vector_data; HYPRE_Int i; HYPRE_Int jj; HYPRE_Int column; HYPRE_Int relax_error = 0; HYPRE_Real *A_mat; HYPRE_Real *b_vec; HYPRE_Real zero = 0.0; HYPRE_ANNOTATE_FUNC_BEGIN; /*----------------------------------------------------------------------- * Switch statement to direct control based on relax_type: * relax_type = 7 -> Jacobi (uses ParMatvec) * relax_type = 9 -> Direct Solve *-----------------------------------------------------------------------*/ switch (relax_type) { case 7: /* Jacobi (uses ParMatvec) */ { /*----------------------------------------------------------------- * Copy f into temporary vector. *-----------------------------------------------------------------*/ hypre_ParVectorCopy(f, Vtemp); /*----------------------------------------------------------------- * Perform MatvecT Vtemp=f-A^Tu *-----------------------------------------------------------------*/ hypre_ParCSRMatrixMatvecT(-1.0, A, u, 1.0, Vtemp); for (i = 0; i < n; i++) { /*----------------------------------------------------------- * If diagonal is nonzero, relax point i; otherwise, skip it. *-----------------------------------------------------------*/ if (A_diag_data[A_diag_i[i]] != zero) { u_data[i] += relax_weight * Vtemp_data[i] / A_diag_data[A_diag_i[i]]; } } } break; case 9: /* Direct solve: use gaussian elimination */ { HYPRE_Int n_global = (HYPRE_Int) global_num_rows; /*----------------------------------------------------------------- * Generate CSR matrix from ParCSRMatrix A *-----------------------------------------------------------------*/ A_CSR = hypre_ParCSRMatrixToCSRMatrixAll(A); f_vector = hypre_ParVectorToVectorAll(f); if (n) { A_CSR_i = hypre_CSRMatrixI(A_CSR); A_CSR_j = hypre_CSRMatrixJ(A_CSR); A_CSR_data = hypre_CSRMatrixData(A_CSR); f_vector_data = hypre_VectorData(f_vector); A_mat = hypre_CTAlloc(HYPRE_Real, n_global * n_global, HYPRE_MEMORY_HOST); b_vec = hypre_CTAlloc(HYPRE_Real, n_global, HYPRE_MEMORY_HOST); /*--------------------------------------------------------------- * Load transpose of CSR matrix into A_mat. *---------------------------------------------------------------*/ for (i = 0; i < n_global; i++) { for (jj = A_CSR_i[i]; jj < A_CSR_i[i + 1]; jj++) { column = A_CSR_j[jj]; A_mat[column * n_global + i] = A_CSR_data[jj]; } b_vec[i] = f_vector_data[i]; } hypre_gselim(A_mat, b_vec, n_global, relax_error); for (i = 0; i < n; i++) { u_data[i] = b_vec[first_index + i]; } hypre_TFree(A_mat, HYPRE_MEMORY_HOST); hypre_TFree(b_vec, HYPRE_MEMORY_HOST); hypre_CSRMatrixDestroy(A_CSR); A_CSR = NULL; hypre_SeqVectorDestroy(f_vector); f_vector = NULL; } } break; } HYPRE_ANNOTATE_FUNC_END; return (relax_error); } hypre-2.33.0/src/parcsr_ls/par_amgdd.c000066400000000000000000000230621477326011500176000ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * ParAMGDD functions * *****************************************************************************/ #include "_hypre_parcsr_ls.h" /*-------------------------------------------------------------------------- * hypre_BoomerAMGDDCreate *--------------------------------------------------------------------------*/ void * hypre_BoomerAMGDDCreate( void ) { hypre_ParAMGDDData *amgdd_data = hypre_CTAlloc(hypre_ParAMGDDData, 1, HYPRE_MEMORY_HOST); hypre_ParAMGDDDataAMG(amgdd_data) = (hypre_ParAMGData*) hypre_BoomerAMGCreate(); hypre_ParAMGDDDataFACNumCycles(amgdd_data) = 2; hypre_ParAMGDDDataFACCycleType(amgdd_data) = 1; hypre_ParAMGDDDataFACRelaxType(amgdd_data) = 3; hypre_ParAMGDDDataFACNumRelax(amgdd_data) = 1; hypre_ParAMGDDDataFACRelaxWeight(amgdd_data) = 1.0; hypre_ParAMGDDDataPadding(amgdd_data) = 1; hypre_ParAMGDDDataNumGhostLayers(amgdd_data) = 1; hypre_ParAMGDDDataCommPkg(amgdd_data) = NULL; hypre_ParAMGDDDataCompGrid(amgdd_data) = NULL; hypre_ParAMGDDDataUserFACRelaxation(amgdd_data) = hypre_BoomerAMGDD_FAC_CFL1Jacobi; return (void *) amgdd_data; } /*-------------------------------------------------------------------------- * hypre_BoomerAMGDDDestroy *--------------------------------------------------------------------------*/ HYPRE_Int hypre_BoomerAMGDDDestroy( void *data ) { hypre_ParAMGDDData *amgdd_data = (hypre_ParAMGDDData*) data; hypre_ParAMGData *amg_data; HYPRE_Int num_levels; HYPRE_Int i; if (amgdd_data) { amg_data = hypre_ParAMGDDDataAMG(amgdd_data); num_levels = hypre_ParAMGDataNumLevels(amg_data); /* destroy amgdd composite grids and commpkg */ if (hypre_ParAMGDDDataCompGrid(amgdd_data)) { for (i = 0; i < num_levels; i++) { hypre_AMGDDCompGridDestroy(hypre_ParAMGDDDataCompGrid(amgdd_data)[i]); } hypre_TFree(hypre_ParAMGDDDataCompGrid(amgdd_data), HYPRE_MEMORY_HOST); } if (hypre_ParAMGDDDataCommPkg(amgdd_data)) { hypre_AMGDDCommPkgDestroy(hypre_ParAMGDDDataCommPkg(amgdd_data)); } /* destroy temporary vector */ hypre_ParVectorDestroy(hypre_ParAMGDDDataZtemp(amgdd_data)); /* destroy the underlying amg */ hypre_BoomerAMGDestroy((void*) amg_data); hypre_TFree(amgdd_data, HYPRE_MEMORY_HOST); } return hypre_error_flag; } /*-------------------------------------------------------------------------- * Routines to set parameters *--------------------------------------------------------------------------*/ HYPRE_Int hypre_BoomerAMGDDSetStartLevel( void *data, HYPRE_Int start_level ) { hypre_ParAMGDDData *amgdd_data = (hypre_ParAMGDDData*) data; if (!amgdd_data) { hypre_error_in_arg(1); return hypre_error_flag; } hypre_ParAMGDDDataStartLevel(amgdd_data) = start_level; return hypre_error_flag; } HYPRE_Int hypre_BoomerAMGDDGetStartLevel( void *data, HYPRE_Int *start_level ) { hypre_ParAMGDDData *amgdd_data = (hypre_ParAMGDDData*) data; if (!amgdd_data) { hypre_error_in_arg(1); return hypre_error_flag; } *start_level = hypre_ParAMGDDDataStartLevel(amgdd_data); return hypre_error_flag; } HYPRE_Int hypre_BoomerAMGDDSetFACNumRelax( void *data, HYPRE_Int fac_num_relax ) { hypre_ParAMGDDData *amgdd_data = (hypre_ParAMGDDData*) data; if (!amgdd_data) { hypre_error_in_arg(1); return hypre_error_flag; } hypre_ParAMGDDDataFACNumRelax(amgdd_data) = fac_num_relax; return hypre_error_flag; } HYPRE_Int hypre_BoomerAMGDDGetFACNumRelax( void *data, HYPRE_Int *fac_num_relax ) { hypre_ParAMGDDData *amgdd_data = (hypre_ParAMGDDData*) data; if (!amgdd_data) { hypre_error_in_arg(1); return hypre_error_flag; } *fac_num_relax = hypre_ParAMGDDDataFACNumRelax(amgdd_data); return hypre_error_flag; } HYPRE_Int hypre_BoomerAMGDDSetFACNumCycles( void *data, HYPRE_Int fac_num_cycles ) { hypre_ParAMGDDData *amgdd_data = (hypre_ParAMGDDData*) data; if (!amgdd_data) { hypre_error_in_arg(1); return hypre_error_flag; } hypre_ParAMGDDDataFACNumCycles(amgdd_data) = fac_num_cycles; return hypre_error_flag; } HYPRE_Int hypre_BoomerAMGDDGetFACNumCycles( void *data, HYPRE_Int *fac_num_cycles ) { hypre_ParAMGDDData *amgdd_data = (hypre_ParAMGDDData*) data; if (!amgdd_data) { hypre_error_in_arg(1); return hypre_error_flag; } *fac_num_cycles = hypre_ParAMGDDDataFACNumCycles(amgdd_data); return hypre_error_flag; } HYPRE_Int hypre_BoomerAMGDDSetFACCycleType( void *data, HYPRE_Int fac_cycle_type ) { hypre_ParAMGDDData *amgdd_data = (hypre_ParAMGDDData*) data; if (!amgdd_data) { hypre_error_in_arg(1); return hypre_error_flag; } hypre_ParAMGDDDataFACCycleType(amgdd_data) = fac_cycle_type; return hypre_error_flag; } HYPRE_Int hypre_BoomerAMGDDGetFACCycleType( void *data, HYPRE_Int *fac_cycle_type ) { hypre_ParAMGDDData *amgdd_data = (hypre_ParAMGDDData*) data; if (!amgdd_data) { hypre_error_in_arg(1); return hypre_error_flag; } *fac_cycle_type = hypre_ParAMGDDDataFACCycleType(amgdd_data); return hypre_error_flag; } HYPRE_Int hypre_BoomerAMGDDSetFACRelaxType( void *data, HYPRE_Int fac_relax_type ) { hypre_ParAMGDDData *amgdd_data = (hypre_ParAMGDDData*) data; if (!amgdd_data) { hypre_error_in_arg(1); return hypre_error_flag; } hypre_ParAMGDDDataFACRelaxType(amgdd_data) = fac_relax_type; return hypre_error_flag; } HYPRE_Int hypre_BoomerAMGDDGetFACRelaxType( void *data, HYPRE_Int *fac_relax_type ) { hypre_ParAMGDDData *amgdd_data = (hypre_ParAMGDDData*) data; if (!amgdd_data) { hypre_error_in_arg(1); return hypre_error_flag; } *fac_relax_type = hypre_ParAMGDDDataFACRelaxType(amgdd_data); return hypre_error_flag; } HYPRE_Int hypre_BoomerAMGDDSetFACRelaxWeight( void *data, HYPRE_Real fac_relax_weight ) { hypre_ParAMGDDData *amgdd_data = (hypre_ParAMGDDData*) data; if (!amgdd_data) { hypre_error_in_arg(1); return hypre_error_flag; } hypre_ParAMGDDDataFACRelaxWeight(amgdd_data) = fac_relax_weight; return hypre_error_flag; } HYPRE_Int hypre_BoomerAMGDDGetFACRelaxWeight( void *data, HYPRE_Real *fac_relax_weight ) { hypre_ParAMGDDData *amgdd_data = (hypre_ParAMGDDData*) data; if (!amgdd_data) { hypre_error_in_arg(1); return hypre_error_flag; } *fac_relax_weight = hypre_ParAMGDDDataFACRelaxWeight(amgdd_data); return hypre_error_flag; } HYPRE_Int hypre_BoomerAMGDDSetPadding( void *data, HYPRE_Int padding ) { hypre_ParAMGDDData *amgdd_data = (hypre_ParAMGDDData*) data; if (!amgdd_data) { hypre_error_in_arg(1); return hypre_error_flag; } hypre_ParAMGDDDataPadding(amgdd_data) = padding; return hypre_error_flag; } HYPRE_Int hypre_BoomerAMGDDGetPadding( void *data, HYPRE_Int *padding ) { hypre_ParAMGDDData *amgdd_data = (hypre_ParAMGDDData*) data; if (!amgdd_data) { hypre_error_in_arg(1); return hypre_error_flag; } *padding = hypre_ParAMGDDDataPadding(amgdd_data); return hypre_error_flag; } HYPRE_Int hypre_BoomerAMGDDSetNumGhostLayers( void *data, HYPRE_Int num_ghost_layers ) { hypre_ParAMGDDData *amgdd_data = (hypre_ParAMGDDData*) data; if (!amgdd_data) { hypre_error_in_arg(1); return hypre_error_flag; } hypre_ParAMGDDDataNumGhostLayers(amgdd_data) = num_ghost_layers; return hypre_error_flag; } HYPRE_Int hypre_BoomerAMGDDGetNumGhostLayers( void *data, HYPRE_Int *num_ghost_layers ) { hypre_ParAMGDDData *amgdd_data = (hypre_ParAMGDDData*) data; if (!amgdd_data) { hypre_error_in_arg(1); return hypre_error_flag; } *num_ghost_layers = hypre_ParAMGDDDataNumGhostLayers(amgdd_data); return hypre_error_flag; } HYPRE_Int hypre_BoomerAMGDDSetUserFACRelaxation( void *data, HYPRE_Int (*userFACRelaxation)( void *amgdd_vdata, HYPRE_Int level, HYPRE_Int cycle_param )) { hypre_ParAMGDDData *amgdd_data = (hypre_ParAMGDDData*) data; hypre_ParAMGDDDataUserFACRelaxation(amgdd_data) = userFACRelaxation; return 0; } HYPRE_Int hypre_BoomerAMGDDGetAMG( void *data, void **amg_solver ) { hypre_ParAMGDDData *amgdd_data = (hypre_ParAMGDDData*) data; if (!amgdd_data) { hypre_error_in_arg(1); return hypre_error_flag; } *amg_solver = (void*) hypre_ParAMGDDDataAMG(amgdd_data); return hypre_error_flag; } hypre-2.33.0/src/parcsr_ls/par_amgdd.h000066400000000000000000000052631477326011500176100ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #ifndef hypre_ParAMGDD_DATA_HEADER #define hypre_ParAMGDD_DATA_HEADER /*-------------------------------------------------------------------------- * hypre_ParAMGDDData *--------------------------------------------------------------------------*/ typedef struct { /* The underlying AMG hierarchy */ hypre_ParAMGData *amg_data; /* AMG-DD parameters and info */ HYPRE_Int start_level; HYPRE_Int fac_num_cycles; HYPRE_Int fac_cycle_type; HYPRE_Int fac_relax_type; HYPRE_Int fac_num_relax; HYPRE_Real fac_relax_weight; HYPRE_Int padding; HYPRE_Int num_ghost_layers; hypre_AMGDDCompGrid **amgdd_comp_grid; hypre_AMGDDCommPkg *amgdd_comm_pkg; hypre_ParVector *Ztemp; HYPRE_Int (*amgddUserFACRelaxation)( void *amgdd_vdata, HYPRE_Int level, HYPRE_Int cycle_param ); } hypre_ParAMGDDData; /*-------------------------------------------------------------------------- * Accessor functions for the hypre_AMGDDData structure *--------------------------------------------------------------------------*/ #define hypre_ParAMGDDDataAMG(amgdd_data) ((amgdd_data)->amg_data) #define hypre_ParAMGDDDataStartLevel(amgdd_data) ((amgdd_data)->start_level) #define hypre_ParAMGDDDataFACNumCycles(amgdd_data) ((amgdd_data)->fac_num_cycles) #define hypre_ParAMGDDDataFACCycleType(amgdd_data) ((amgdd_data)->fac_cycle_type) #define hypre_ParAMGDDDataFACRelaxType(amgdd_data) ((amgdd_data)->fac_relax_type) #define hypre_ParAMGDDDataFACNumRelax(amgdd_data) ((amgdd_data)->fac_num_relax) #define hypre_ParAMGDDDataFACRelaxWeight(amgdd_data) ((amgdd_data)->fac_relax_weight) #define hypre_ParAMGDDDataPadding(amgdd_data) ((amgdd_data)->padding) #define hypre_ParAMGDDDataNumGhostLayers(amgdd_data) ((amgdd_data)->num_ghost_layers) #define hypre_ParAMGDDDataCompGrid(amgdd_data) ((amgdd_data)->amgdd_comp_grid) #define hypre_ParAMGDDDataCommPkg(amgdd_data) ((amgdd_data)->amgdd_comm_pkg) #define hypre_ParAMGDDDataZtemp(amg_data) ((amgdd_data)->Ztemp) #define hypre_ParAMGDDDataUserFACRelaxation(amgdd_data) ((amgdd_data)->amgddUserFACRelaxation) #endif hypre-2.33.0/src/parcsr_ls/par_amgdd_comp_grid.c000066400000000000000000002737361477326011500216420ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * Member functions for hypre_AMGDDCompGrid and hypre_AMGDDCommPkg classes. * *****************************************************************************/ #include "_hypre_parcsr_ls.h" #include "_hypre_utilities.h" HYPRE_Int hypre_AMGDDCompGridLocalIndexBinarySearch( hypre_AMGDDCompGrid *compGrid, HYPRE_Int global_index ) { HYPRE_Int *nonowned_global_indices; HYPRE_Int *inv_map; HYPRE_Int left; HYPRE_Int right; HYPRE_Int index, sorted_index; // Set data nonowned_global_indices = hypre_AMGDDCompGridNonOwnedGlobalIndices(compGrid); inv_map = hypre_AMGDDCompGridNonOwnedInvSort(compGrid); left = 0; right = hypre_AMGDDCompGridNumNonOwnedNodes(compGrid) - 1; while (left <= right) { sorted_index = (left + right) / 2; index = inv_map[sorted_index]; if (nonowned_global_indices[index] < global_index) { left = sorted_index + 1; } else if (nonowned_global_indices[index] > global_index) { right = sorted_index - 1; } else { return index; } } return -1; } hypre_AMGDDCompGridMatrix* hypre_AMGDDCompGridMatrixCreate( void ) { hypre_AMGDDCompGridMatrix *matrix = hypre_CTAlloc(hypre_AMGDDCompGridMatrix, 1, HYPRE_MEMORY_HOST); hypre_AMGDDCompGridMatrixOwnedDiag(matrix) = NULL; hypre_AMGDDCompGridMatrixOwnedOffd(matrix) = NULL; hypre_AMGDDCompGridMatrixNonOwnedDiag(matrix) = NULL; hypre_AMGDDCompGridMatrixNonOwnedOffd(matrix) = NULL; hypre_AMGDDCompGridMatrixRealReal(matrix) = NULL; hypre_AMGDDCompGridMatrixRealGhost(matrix) = NULL; hypre_AMGDDCompGridMatrixOwnsOwnedMatrices(matrix) = 0; hypre_AMGDDCompGridMatrixOwnsOffdColIndices(matrix) = 0; return matrix; } HYPRE_Int hypre_AMGDDCompGridMatrixDestroy( hypre_AMGDDCompGridMatrix *matrix ) { if (matrix) { if (hypre_AMGDDCompGridMatrixOwnsOwnedMatrices(matrix)) { hypre_CSRMatrixDestroy(hypre_AMGDDCompGridMatrixOwnedDiag(matrix)); hypre_CSRMatrixDestroy(hypre_AMGDDCompGridMatrixOwnedOffd(matrix)); } else if (hypre_AMGDDCompGridMatrixOwnsOffdColIndices(matrix)) { HYPRE_MemoryLocation memory_location = hypre_CSRMatrixMemoryLocation( hypre_AMGDDCompGridMatrixOwnedOffd(matrix)); if (hypre_CSRMatrixJ(hypre_AMGDDCompGridMatrixOwnedOffd(matrix))) { hypre_TFree(hypre_CSRMatrixJ(hypre_AMGDDCompGridMatrixOwnedOffd(matrix)), memory_location); } #if defined(HYPRE_USING_CUSPARSE) || defined(HYPRE_USING_ROCSPARSE) || defined(HYPRE_USING_ONEMKLSPARSE) hypre_TFree(hypre_CSRMatrixSortedData(hypre_AMGDDCompGridMatrixOwnedOffd(matrix)), memory_location); hypre_TFree(hypre_CSRMatrixSortedJ(hypre_AMGDDCompGridMatrixOwnedOffd(matrix)), memory_location); hypre_CsrsvDataDestroy(hypre_CSRMatrixCsrsvData(hypre_AMGDDCompGridMatrixOwnedOffd(matrix))); hypre_GpuMatDataDestroy(hypre_CSRMatrixGPUMatData(hypre_AMGDDCompGridMatrixOwnedOffd(matrix))); #endif hypre_TFree(hypre_AMGDDCompGridMatrixOwnedOffd(matrix), HYPRE_MEMORY_HOST); } hypre_CSRMatrixDestroy(hypre_AMGDDCompGridMatrixNonOwnedDiag(matrix)); hypre_CSRMatrixDestroy(hypre_AMGDDCompGridMatrixNonOwnedOffd(matrix)); hypre_CSRMatrixDestroy(hypre_AMGDDCompGridMatrixRealReal(matrix)); hypre_CSRMatrixDestroy(hypre_AMGDDCompGridMatrixRealGhost(matrix)); hypre_TFree(matrix, HYPRE_MEMORY_HOST); } return hypre_error_flag; } HYPRE_Int hypre_AMGDDCompGridMatrixSetupRealMatvec( hypre_AMGDDCompGridMatrix *A ) { hypre_CSRMatrix *A_real_real = hypre_AMGDDCompGridMatrixRealReal(A); hypre_CSRMatrix *A_real_ghost = hypre_AMGDDCompGridMatrixRealGhost(A); hypre_CSRMatrix *A_diag = hypre_AMGDDCompGridMatrixNonOwnedDiag(A); HYPRE_Int *A_i, *A_j; HYPRE_Int *A_rri, *A_rrj; HYPRE_Int *A_rgi, *A_rgj; HYPRE_Complex *A_data, *A_rrdata, *A_rgdata; HYPRE_Int num_real = hypre_CSRMatrixNumRows(A_real_real); HYPRE_Int A_real_real_nnz; HYPRE_Int A_real_ghost_nnz; HYPRE_Int i, j, col_ind; // Initialize matrices hypre_CSRMatrixInitialize(A_real_real); hypre_CSRMatrixInitialize(A_real_ghost); // Set some data A_i = hypre_CSRMatrixI(A_diag); A_rri = hypre_CSRMatrixI(A_real_real); A_rgi = hypre_CSRMatrixI(A_real_ghost); A_j = hypre_CSRMatrixJ(A_diag); A_rrj = hypre_CSRMatrixJ(A_real_real); A_rgj = hypre_CSRMatrixJ(A_real_ghost); A_data = hypre_CSRMatrixData(A_diag); A_rrdata = hypre_CSRMatrixData(A_real_real); A_rgdata = hypre_CSRMatrixData(A_real_ghost); A_real_real_nnz = A_real_ghost_nnz = 0; for (i = 0; i < num_real; i++) { A_rri[i] = A_real_real_nnz; A_rgi[i] = A_real_ghost_nnz; for (j = A_i[i]; j < A_i[i + 1]; j++) { col_ind = A_j[j]; if (col_ind < num_real) { A_rrj[A_real_real_nnz] = col_ind; A_rrdata[A_real_real_nnz] = A_data[j]; A_real_real_nnz++; } else { A_rgj[A_real_ghost_nnz] = col_ind; A_rgdata[A_real_ghost_nnz] = A_data[j]; A_real_ghost_nnz++; } } } A_rri[num_real] = A_real_real_nnz; A_rgi[num_real] = A_real_ghost_nnz; return hypre_error_flag; } HYPRE_Int hypre_AMGDDCompGridMatvec( HYPRE_Complex alpha, hypre_AMGDDCompGridMatrix *A, hypre_AMGDDCompGridVector *x, HYPRE_Complex beta, hypre_AMGDDCompGridVector *y ) { hypre_CSRMatrix *owned_diag = hypre_AMGDDCompGridMatrixOwnedDiag(A); hypre_CSRMatrix *owned_offd = hypre_AMGDDCompGridMatrixOwnedOffd(A); hypre_CSRMatrix *nonowned_diag = hypre_AMGDDCompGridMatrixNonOwnedDiag(A); hypre_CSRMatrix *nonowned_offd = hypre_AMGDDCompGridMatrixNonOwnedOffd(A); hypre_Vector *x_owned = hypre_AMGDDCompGridVectorOwned(x); hypre_Vector *x_nonowned = hypre_AMGDDCompGridVectorNonOwned(x); hypre_Vector *y_owned = hypre_AMGDDCompGridVectorOwned(y); hypre_Vector *y_nonowned = hypre_AMGDDCompGridVectorNonOwned(y); hypre_CSRMatrixMatvec(alpha, owned_diag, x_owned, beta, y_owned); if (owned_offd) { hypre_CSRMatrixMatvec(alpha, owned_offd, x_nonowned, 1.0, y_owned); } if (nonowned_diag) { hypre_CSRMatrixMatvec(alpha, nonowned_diag, x_nonowned, beta, y_nonowned); } if (nonowned_offd) { hypre_CSRMatrixMatvec(alpha, nonowned_offd, x_owned, 1.0, y_nonowned); } return hypre_error_flag; } HYPRE_Int hypre_AMGDDCompGridRealMatvec( HYPRE_Complex alpha, hypre_AMGDDCompGridMatrix *A, hypre_AMGDDCompGridVector *x, HYPRE_Complex beta, hypre_AMGDDCompGridVector *y ) { hypre_CSRMatrix *owned_diag = hypre_AMGDDCompGridMatrixOwnedDiag(A); hypre_CSRMatrix *owned_offd = hypre_AMGDDCompGridMatrixOwnedOffd(A); hypre_CSRMatrix *nonowned_diag = hypre_AMGDDCompGridMatrixRealReal(A); hypre_CSRMatrix *nonowned_offd = hypre_AMGDDCompGridMatrixNonOwnedOffd(A); hypre_Vector *x_owned = hypre_AMGDDCompGridVectorOwned(x); hypre_Vector *x_nonowned = hypre_AMGDDCompGridVectorNonOwned(x); hypre_Vector *y_owned = hypre_AMGDDCompGridVectorOwned(y); hypre_Vector *y_nonowned = hypre_AMGDDCompGridVectorNonOwned(y); if (!hypre_CSRMatrixData(hypre_AMGDDCompGridMatrixRealReal(A))) { hypre_AMGDDCompGridMatrixSetupRealMatvec(A); } hypre_CSRMatrixMatvec(alpha, owned_diag, x_owned, beta, y_owned); if (owned_offd) { hypre_CSRMatrixMatvec(alpha, owned_offd, x_nonowned, 1.0, y_owned); } if (nonowned_diag) { hypre_CSRMatrixMatvec(alpha, nonowned_diag, x_nonowned, beta, y_nonowned); } if (nonowned_offd) { hypre_CSRMatrixMatvec(alpha, nonowned_offd, x_owned, 1.0, y_nonowned); } return hypre_error_flag; } hypre_AMGDDCompGridVector *hypre_AMGDDCompGridVectorCreate( void ) { hypre_AMGDDCompGridVector *vector = hypre_CTAlloc(hypre_AMGDDCompGridVector, 1, HYPRE_MEMORY_HOST); hypre_AMGDDCompGridVectorOwned(vector) = NULL; hypre_AMGDDCompGridVectorNonOwned(vector) = NULL; hypre_AMGDDCompGridVectorOwnsOwnedVector(vector) = 0; return vector; } HYPRE_Int hypre_AMGDDCompGridVectorInitialize( hypre_AMGDDCompGridVector *vector, HYPRE_Int num_owned, HYPRE_Int num_nonowned, HYPRE_Int num_real ) { hypre_AMGDDCompGridVectorOwned(vector) = hypre_SeqVectorCreate(num_owned); hypre_SeqVectorInitialize(hypre_AMGDDCompGridVectorOwned(vector)); hypre_AMGDDCompGridVectorOwnsOwnedVector(vector) = 1; hypre_AMGDDCompGridVectorNumReal(vector) = num_real; hypre_AMGDDCompGridVectorNonOwned(vector) = hypre_SeqVectorCreate(num_nonowned); hypre_SeqVectorInitialize(hypre_AMGDDCompGridVectorNonOwned(vector)); return hypre_error_flag; } HYPRE_Int hypre_AMGDDCompGridVectorDestroy(hypre_AMGDDCompGridVector *vector) { if (vector) { if (hypre_AMGDDCompGridVectorOwnsOwnedVector(vector)) { if (hypre_AMGDDCompGridVectorOwned(vector)) { hypre_SeqVectorDestroy(hypre_AMGDDCompGridVectorOwned(vector)); } } if (hypre_AMGDDCompGridVectorNonOwned(vector)) { hypre_SeqVectorDestroy(hypre_AMGDDCompGridVectorNonOwned(vector)); } hypre_TFree(vector, HYPRE_MEMORY_HOST); } return hypre_error_flag; } HYPRE_Real hypre_AMGDDCompGridVectorInnerProd( hypre_AMGDDCompGridVector *x, hypre_AMGDDCompGridVector *y ) { hypre_Vector *x_owned = hypre_AMGDDCompGridVectorOwned(x); hypre_Vector *x_nonowned = hypre_AMGDDCompGridVectorNonOwned(x); hypre_Vector *y_owned = hypre_AMGDDCompGridVectorOwned(y); hypre_Vector *y_nonowned = hypre_AMGDDCompGridVectorNonOwned(y); HYPRE_Real res; res = hypre_SeqVectorInnerProd(x_owned, y_owned); res += hypre_SeqVectorInnerProd(x_nonowned, y_nonowned); return res; } HYPRE_Real hypre_AMGDDCompGridVectorRealInnerProd( hypre_AMGDDCompGridVector *x, hypre_AMGDDCompGridVector *y) { hypre_Vector *x_nonowned = hypre_AMGDDCompGridVectorNonOwned(x); hypre_Vector *y_nonowned = hypre_AMGDDCompGridVectorNonOwned(y); HYPRE_Int orig_x_size = hypre_VectorSize(x_nonowned); HYPRE_Int orig_y_size = hypre_VectorSize(y_nonowned); HYPRE_Real res; hypre_VectorSize(x_nonowned) = hypre_AMGDDCompGridVectorNumReal(x); hypre_VectorSize(y_nonowned) = hypre_AMGDDCompGridVectorNumReal(y); res = hypre_AMGDDCompGridVectorInnerProd(x, y); hypre_VectorSize(hypre_AMGDDCompGridVectorNonOwned(x)) = orig_x_size; hypre_VectorSize(hypre_AMGDDCompGridVectorNonOwned(y)) = orig_y_size; return res; } HYPRE_Int hypre_AMGDDCompGridVectorScale( HYPRE_Complex alpha, hypre_AMGDDCompGridVector *x ) { hypre_SeqVectorScale(alpha, hypre_AMGDDCompGridVectorOwned(x)); hypre_SeqVectorScale(alpha, hypre_AMGDDCompGridVectorNonOwned(x)); return hypre_error_flag; } HYPRE_Int hypre_AMGDDCompGridVectorRealScale( HYPRE_Complex alpha, hypre_AMGDDCompGridVector *x ) { hypre_Vector *x_nonowned = hypre_AMGDDCompGridVectorNonOwned(x); HYPRE_Int orig_x_size = hypre_VectorSize(hypre_AMGDDCompGridVectorNonOwned(x)); hypre_VectorSize(x_nonowned) = hypre_AMGDDCompGridVectorNumReal(x); hypre_AMGDDCompGridVectorScale(alpha, x); hypre_VectorSize(hypre_AMGDDCompGridVectorNonOwned(x)) = orig_x_size; return hypre_error_flag; } HYPRE_Int hypre_AMGDDCompGridVectorAxpy( HYPRE_Complex alpha, hypre_AMGDDCompGridVector *x, hypre_AMGDDCompGridVector *y ) { hypre_Vector *x_owned = hypre_AMGDDCompGridVectorOwned(x); hypre_Vector *x_nonowned = hypre_AMGDDCompGridVectorNonOwned(x); hypre_Vector *y_owned = hypre_AMGDDCompGridVectorOwned(y); hypre_Vector *y_nonowned = hypre_AMGDDCompGridVectorNonOwned(y); if (x_owned) { hypre_SeqVectorAxpy(alpha, x_owned, y_owned); } if (x_nonowned) { hypre_SeqVectorAxpy(alpha, x_nonowned, y_nonowned); } return hypre_error_flag; } HYPRE_Int hypre_AMGDDCompGridVectorRealAxpy( HYPRE_Complex alpha, hypre_AMGDDCompGridVector *x, hypre_AMGDDCompGridVector *y ) { hypre_Vector *x_nonowned = hypre_AMGDDCompGridVectorNonOwned(x); hypre_Vector *y_nonowned = hypre_AMGDDCompGridVectorNonOwned(y); HYPRE_Int orig_x_size = hypre_VectorSize(x_nonowned); HYPRE_Int orig_y_size = hypre_VectorSize(y_nonowned); hypre_VectorSize(x_nonowned) = hypre_AMGDDCompGridVectorNumReal(x); hypre_VectorSize(y_nonowned) = hypre_AMGDDCompGridVectorNumReal(y); hypre_AMGDDCompGridVectorAxpy(alpha, x, y); hypre_VectorSize(x_nonowned) = orig_x_size; hypre_VectorSize(y_nonowned) = orig_y_size; return hypre_error_flag; } HYPRE_Int hypre_AMGDDCompGridVectorSetConstantValues( hypre_AMGDDCompGridVector *vector, HYPRE_Complex value ) { hypre_Vector *vector_owned = hypre_AMGDDCompGridVectorOwned(vector); hypre_Vector *vector_nonowned = hypre_AMGDDCompGridVectorNonOwned(vector); if (vector_owned) { hypre_SeqVectorSetConstantValues(vector_owned, value); } if (vector_nonowned) { hypre_SeqVectorSetConstantValues(vector_nonowned, value); } return hypre_error_flag; } HYPRE_Int hypre_AMGDDCompGridVectorRealSetConstantValues( hypre_AMGDDCompGridVector *vector, HYPRE_Complex value ) { hypre_Vector *vector_nonowned = hypre_AMGDDCompGridVectorNonOwned(vector); HYPRE_Int orig_vec_size = hypre_VectorSize(vector_nonowned); hypre_VectorSize(vector_nonowned) = hypre_AMGDDCompGridVectorNumReal(vector); hypre_AMGDDCompGridVectorSetConstantValues(vector, value); hypre_VectorSize(vector_nonowned) = orig_vec_size; return hypre_error_flag; } HYPRE_Int hypre_AMGDDCompGridVectorCopy( hypre_AMGDDCompGridVector *x, hypre_AMGDDCompGridVector *y ) { hypre_Vector *x_owned = hypre_AMGDDCompGridVectorOwned(x); hypre_Vector *x_nonowned = hypre_AMGDDCompGridVectorNonOwned(x); hypre_Vector *y_owned = hypre_AMGDDCompGridVectorOwned(y); hypre_Vector *y_nonowned = hypre_AMGDDCompGridVectorNonOwned(y); if (x_owned && y_owned) { hypre_SeqVectorCopy(x_owned, y_owned); } if (x_nonowned && y_nonowned) { hypre_SeqVectorCopy(x_nonowned, y_nonowned); } return hypre_error_flag; } HYPRE_Int hypre_AMGDDCompGridVectorRealCopy( hypre_AMGDDCompGridVector *x, hypre_AMGDDCompGridVector *y ) { hypre_Vector *x_nonowned = hypre_AMGDDCompGridVectorNonOwned(x); hypre_Vector *y_nonowned = hypre_AMGDDCompGridVectorNonOwned(y); HYPRE_Int orig_x_size = hypre_VectorSize(hypre_AMGDDCompGridVectorNonOwned(x)); HYPRE_Int orig_y_size = hypre_VectorSize(hypre_AMGDDCompGridVectorNonOwned(y)); hypre_VectorSize(x_nonowned) = hypre_AMGDDCompGridVectorNumReal(x); hypre_VectorSize(y_nonowned) = hypre_AMGDDCompGridVectorNumReal(y); hypre_AMGDDCompGridVectorCopy(x, y); hypre_VectorSize(x_nonowned) = orig_x_size; hypre_VectorSize(y_nonowned) = orig_y_size; return hypre_error_flag; } hypre_AMGDDCompGrid *hypre_AMGDDCompGridCreate ( void ) { hypre_AMGDDCompGrid *compGrid; compGrid = hypre_CTAlloc(hypre_AMGDDCompGrid, 1, HYPRE_MEMORY_HOST); hypre_AMGDDCompGridMemoryLocation(compGrid) = HYPRE_MEMORY_UNDEFINED; hypre_AMGDDCompGridFirstGlobalIndex(compGrid) = 0; hypre_AMGDDCompGridLastGlobalIndex(compGrid) = 0; hypre_AMGDDCompGridNumOwnedNodes(compGrid) = 0; hypre_AMGDDCompGridNumNonOwnedNodes(compGrid) = 0; hypre_AMGDDCompGridNumNonOwnedRealNodes(compGrid) = 0; hypre_AMGDDCompGridNumMissingColIndices(compGrid) = 0; hypre_AMGDDCompGridNonOwnedGlobalIndices(compGrid) = NULL; hypre_AMGDDCompGridNonOwnedCoarseIndices(compGrid) = NULL; hypre_AMGDDCompGridNonOwnedRealMarker(compGrid) = NULL; hypre_AMGDDCompGridNonOwnedSort(compGrid) = NULL; hypre_AMGDDCompGridNonOwnedInvSort(compGrid) = NULL; hypre_AMGDDCompGridNonOwnedDiagMissingColIndices(compGrid) = NULL; hypre_AMGDDCompGridOwnedCoarseIndices(compGrid) = NULL; hypre_AMGDDCompGridA(compGrid) = NULL; hypre_AMGDDCompGridP(compGrid) = NULL; hypre_AMGDDCompGridR(compGrid) = NULL; hypre_AMGDDCompGridU(compGrid) = NULL; hypre_AMGDDCompGridF(compGrid) = NULL; hypre_AMGDDCompGridT(compGrid) = NULL; hypre_AMGDDCompGridS(compGrid) = NULL; hypre_AMGDDCompGridQ(compGrid) = NULL; hypre_AMGDDCompGridTemp(compGrid) = NULL; hypre_AMGDDCompGridTemp2(compGrid) = NULL; hypre_AMGDDCompGridTemp3(compGrid) = NULL; hypre_AMGDDCompGridL1Norms(compGrid) = NULL; hypre_AMGDDCompGridCFMarkerArray(compGrid) = NULL; hypre_AMGDDCompGridOwnedRelaxOrdering(compGrid) = NULL; hypre_AMGDDCompGridNonOwnedRelaxOrdering(compGrid) = NULL; return compGrid; } HYPRE_Int hypre_AMGDDCompGridDestroy( hypre_AMGDDCompGrid *compGrid ) { HYPRE_MemoryLocation memory_location; if (compGrid) { memory_location = hypre_AMGDDCompGridMemoryLocation(compGrid); hypre_TFree(hypre_AMGDDCompGridNonOwnedGlobalIndices(compGrid), memory_location); hypre_TFree(hypre_AMGDDCompGridNonOwnedCoarseIndices(compGrid), memory_location); hypre_TFree(hypre_AMGDDCompGridNonOwnedRealMarker(compGrid), memory_location); hypre_TFree(hypre_AMGDDCompGridNonOwnedSort(compGrid), memory_location); hypre_TFree(hypre_AMGDDCompGridNonOwnedInvSort(compGrid), memory_location); hypre_TFree(hypre_AMGDDCompGridNonOwnedDiagMissingColIndices(compGrid), memory_location); hypre_TFree(hypre_AMGDDCompGridOwnedCoarseIndices(compGrid), memory_location); hypre_TFree(hypre_AMGDDCompGridL1Norms(compGrid), memory_location); hypre_TFree(hypre_AMGDDCompGridCFMarkerArray(compGrid), memory_location); hypre_TFree(hypre_AMGDDCompGridOwnedRelaxOrdering(compGrid), memory_location); hypre_TFree(hypre_AMGDDCompGridNonOwnedRelaxOrdering(compGrid), memory_location); hypre_AMGDDCompGridMatrixDestroy(hypre_AMGDDCompGridA(compGrid)); hypre_AMGDDCompGridMatrixDestroy(hypre_AMGDDCompGridP(compGrid)); hypre_AMGDDCompGridMatrixDestroy(hypre_AMGDDCompGridR(compGrid)); hypre_AMGDDCompGridVectorDestroy(hypre_AMGDDCompGridU(compGrid)); hypre_AMGDDCompGridVectorDestroy(hypre_AMGDDCompGridF(compGrid)); hypre_AMGDDCompGridVectorDestroy(hypre_AMGDDCompGridT(compGrid)); hypre_AMGDDCompGridVectorDestroy(hypre_AMGDDCompGridS(compGrid)); hypre_AMGDDCompGridVectorDestroy(hypre_AMGDDCompGridQ(compGrid)); hypre_AMGDDCompGridVectorDestroy(hypre_AMGDDCompGridTemp(compGrid)); hypre_AMGDDCompGridVectorDestroy(hypre_AMGDDCompGridTemp2(compGrid)); hypre_AMGDDCompGridVectorDestroy(hypre_AMGDDCompGridTemp3(compGrid)); hypre_TFree(compGrid, HYPRE_MEMORY_HOST); } return hypre_error_flag; } HYPRE_Int hypre_AMGDDCompGridInitialize( hypre_ParAMGDDData *amgdd_data, HYPRE_Int padding, HYPRE_Int level ) { // Get info from the amg data structure hypre_ParAMGData *amg_data = hypre_ParAMGDDDataAMG(amgdd_data); hypre_AMGDDCompGrid *compGrid = hypre_ParAMGDDDataCompGrid(amgdd_data)[level]; HYPRE_Int *CF_marker_array; hypre_AMGDDCompGridMatrix *A; hypre_CSRMatrix *A_diag_original; hypre_CSRMatrix *A_offd_original; hypre_AMGDDCompGridMatrix *P; hypre_CSRMatrix *P_offd_original; hypre_AMGDDCompGridMatrix *R; hypre_CSRMatrix *R_offd_original; hypre_ParCSRMatrix **A_array; hypre_ParCSRMatrix **P_array; hypre_ParCSRMatrix **R_array; hypre_ParVector **F_array; HYPRE_MemoryLocation memory_location; HYPRE_Int avg_nnz_per_row; HYPRE_Int num_owned_nodes; HYPRE_Int max_nonowned; HYPRE_Int max_nonowned_diag_nnz; HYPRE_Int max_nonowned_offd_nnz; HYPRE_Int coarseIndexCounter, i; // Set some data A_array = hypre_ParAMGDataAArray(amg_data); P_array = hypre_ParAMGDataPArray(amg_data); R_array = hypre_ParAMGDataRArray(amg_data); F_array = hypre_ParAMGDataFArray(amg_data); A_diag_original = hypre_ParCSRMatrixDiag(A_array[level]); A_offd_original = hypre_ParCSRMatrixOffd(A_array[level]); if (hypre_ParAMGDataCFMarkerArray(amg_data)[level]) { CF_marker_array = hypre_IntArrayData(hypre_ParAMGDataCFMarkerArray(amg_data)[level]); } else { CF_marker_array = NULL; } hypre_AMGDDCompGridLevel(compGrid) = level; hypre_AMGDDCompGridFirstGlobalIndex(compGrid) = hypre_ParVectorFirstIndex(F_array[level]); hypre_AMGDDCompGridLastGlobalIndex(compGrid) = hypre_ParVectorLastIndex(F_array[level]); hypre_AMGDDCompGridNumOwnedNodes(compGrid) = hypre_VectorSize(hypre_ParVectorLocalVector( F_array[level])); hypre_AMGDDCompGridNumNonOwnedNodes(compGrid) = hypre_CSRMatrixNumCols(A_offd_original); hypre_AMGDDCompGridNumMissingColIndices(compGrid) = 0; hypre_AMGDDCompGridMemoryLocation(compGrid) = hypre_ParCSRMatrixMemoryLocation( A_array[level]); memory_location = hypre_AMGDDCompGridMemoryLocation(compGrid); num_owned_nodes = hypre_AMGDDCompGridNumOwnedNodes(compGrid); // !!! Check on how good a guess this is for eventual size of the nononwed dofs and nnz max_nonowned = 2 * (padding + hypre_ParAMGDDDataNumGhostLayers(amgdd_data)) * hypre_CSRMatrixNumCols(A_offd_original); avg_nnz_per_row = 0; if (hypre_CSRMatrixNumRows(A_diag_original)) { avg_nnz_per_row = (HYPRE_Int) (hypre_CSRMatrixNumNonzeros(A_diag_original) / hypre_CSRMatrixNumRows( A_diag_original)); } max_nonowned_diag_nnz = max_nonowned * avg_nnz_per_row; max_nonowned_offd_nnz = hypre_CSRMatrixNumNonzeros(A_offd_original); // Setup CompGridMatrix A A = hypre_AMGDDCompGridMatrixCreate(); hypre_AMGDDCompGridMatrixOwnedDiag(A) = A_diag_original; hypre_AMGDDCompGridMatrixOwnedOffd(A) = A_offd_original; hypre_AMGDDCompGridMatrixOwnsOwnedMatrices(A) = 0; hypre_AMGDDCompGridMatrixNonOwnedDiag(A) = hypre_CSRMatrixCreate(max_nonowned, max_nonowned, max_nonowned_diag_nnz); hypre_CSRMatrixInitialize(hypre_AMGDDCompGridMatrixNonOwnedDiag(A)); hypre_AMGDDCompGridMatrixNonOwnedOffd(A) = hypre_CSRMatrixCreate(max_nonowned, num_owned_nodes, max_nonowned_offd_nnz); hypre_CSRMatrixInitialize(hypre_AMGDDCompGridMatrixNonOwnedOffd(A)); hypre_AMGDDCompGridA(compGrid) = A; hypre_AMGDDCompGridNonOwnedDiagMissingColIndices(compGrid) = hypre_CTAlloc(HYPRE_Int, max_nonowned_diag_nnz, memory_location); // Setup CompGridMatrix P and R if appropriate if (level != hypre_ParAMGDataNumLevels(amg_data) - 1) { P = hypre_AMGDDCompGridMatrixCreate(); hypre_AMGDDCompGridMatrixOwnedDiag(P) = hypre_ParCSRMatrixDiag(P_array[level]); // Use original rowptr and data from P, but need to use new col indices (init to global index, then setup local indices later) P_offd_original = hypre_ParCSRMatrixOffd(P_array[level] ); hypre_AMGDDCompGridMatrixOwnedOffd(P) = hypre_CSRMatrixCreate(hypre_CSRMatrixNumRows( P_offd_original), hypre_CSRMatrixNumCols(P_offd_original), hypre_CSRMatrixNumNonzeros(P_offd_original)); hypre_CSRMatrixI(hypre_AMGDDCompGridMatrixOwnedOffd(P)) = hypre_CSRMatrixI(P_offd_original); hypre_CSRMatrixData(hypre_AMGDDCompGridMatrixOwnedOffd(P)) = hypre_CSRMatrixData(P_offd_original); hypre_CSRMatrixJ(hypre_AMGDDCompGridMatrixOwnedOffd(P)) = hypre_CTAlloc(HYPRE_Int, hypre_CSRMatrixNumNonzeros(P_offd_original), memory_location); // Initialize P owned offd col ind to their global indices for (i = 0; i < hypre_CSRMatrixNumNonzeros(hypre_AMGDDCompGridMatrixOwnedOffd(P)); i++) { hypre_CSRMatrixJ(hypre_AMGDDCompGridMatrixOwnedOffd(P))[i] = hypre_ParCSRMatrixColMapOffd( P_array[level])[ hypre_CSRMatrixJ(P_offd_original)[i] ]; } hypre_AMGDDCompGridMatrixOwnsOwnedMatrices(P) = 0; hypre_AMGDDCompGridMatrixOwnsOffdColIndices(P) = 1; hypre_AMGDDCompGridP(compGrid) = P; if (hypre_ParAMGDataRestriction(amg_data)) { R = hypre_AMGDDCompGridMatrixCreate(); hypre_AMGDDCompGridMatrixOwnedDiag(R) = hypre_ParCSRMatrixDiag(R_array[level]); // Use original rowptr and data from R, but need to use new col indices (init to global index, then setup local indices later) R_offd_original = hypre_ParCSRMatrixOffd(R_array[level]); hypre_AMGDDCompGridMatrixOwnedOffd(R) = hypre_CSRMatrixCreate(hypre_CSRMatrixNumRows( R_offd_original), hypre_CSRMatrixNumCols(R_offd_original), hypre_CSRMatrixNumNonzeros(R_offd_original)); hypre_CSRMatrixI(hypre_AMGDDCompGridMatrixOwnedOffd(R)) = hypre_CSRMatrixI(R_offd_original); hypre_CSRMatrixData(hypre_AMGDDCompGridMatrixOwnedOffd(R)) = hypre_CSRMatrixData(R_offd_original); hypre_CSRMatrixJ(hypre_AMGDDCompGridMatrixOwnedOffd(R)) = hypre_CTAlloc(HYPRE_Int, hypre_CSRMatrixNumNonzeros(R_offd_original), memory_location); // Initialize R owned offd col ind to their global indices for (i = 0; i < hypre_CSRMatrixNumNonzeros(hypre_AMGDDCompGridMatrixOwnedOffd(R)); i++) { hypre_CSRMatrixJ(hypre_AMGDDCompGridMatrixOwnedOffd(R))[i] = hypre_ParCSRMatrixColMapOffd( R_array[level])[ hypre_CSRMatrixJ(R_offd_original)[i] ]; } hypre_AMGDDCompGridMatrixOwnsOwnedMatrices(R) = 0; hypre_AMGDDCompGridMatrixOwnsOffdColIndices(R) = 1; hypre_AMGDDCompGridR(compGrid) = R; } } // Allocate some extra arrays used during AMG-DD setup hypre_AMGDDCompGridNonOwnedGlobalIndices(compGrid) = hypre_CTAlloc(HYPRE_Int, max_nonowned, memory_location); hypre_AMGDDCompGridNonOwnedRealMarker(compGrid) = hypre_CTAlloc(HYPRE_Int, max_nonowned, memory_location); hypre_AMGDDCompGridNonOwnedSort(compGrid) = hypre_CTAlloc(HYPRE_Int, max_nonowned, memory_location); hypre_AMGDDCompGridNonOwnedInvSort(compGrid) = hypre_CTAlloc(HYPRE_Int, max_nonowned, memory_location); // Initialize nonowned global indices, real marker, and the sort and invsort arrays for (i = 0; i < hypre_CSRMatrixNumCols(A_offd_original); i++) { hypre_AMGDDCompGridNonOwnedGlobalIndices(compGrid)[i] = hypre_ParCSRMatrixColMapOffd( A_array[level])[i]; hypre_AMGDDCompGridNonOwnedSort(compGrid)[i] = i; hypre_AMGDDCompGridNonOwnedInvSort(compGrid)[i] = i; hypre_AMGDDCompGridNonOwnedRealMarker(compGrid)[i] = 1; // NOTE: Assume that padding is at least 1, i.e. first layer of points are real } if (level != hypre_ParAMGDataNumLevels(amg_data) - 1) { hypre_AMGDDCompGridNonOwnedCoarseIndices(compGrid) = hypre_CTAlloc(HYPRE_Int, max_nonowned, memory_location); hypre_AMGDDCompGridOwnedCoarseIndices(compGrid) = hypre_CTAlloc(HYPRE_Int, num_owned_nodes, memory_location); // Setup the owned coarse indices if ( CF_marker_array ) { coarseIndexCounter = 0; for (i = 0; i < num_owned_nodes; i++) { if ( CF_marker_array[i] > 0 ) { hypre_AMGDDCompGridOwnedCoarseIndices(compGrid)[i] = coarseIndexCounter++; } else { hypre_AMGDDCompGridOwnedCoarseIndices(compGrid)[i] = -1; } } } else { for (i = 0; i < num_owned_nodes; i++) { hypre_AMGDDCompGridOwnedCoarseIndices(compGrid)[i] = -1; } } } return hypre_error_flag; } HYPRE_Int hypre_AMGDDCompGridSetupRelax( hypre_ParAMGDDData *amgdd_data ) { hypre_ParAMGData *amg_data = hypre_ParAMGDDDataAMG(amgdd_data); hypre_AMGDDCompGrid *compGrid; hypre_CSRMatrix *diag; hypre_CSRMatrix *offd; HYPRE_Int total_num_nodes; HYPRE_Int cf_diag; HYPRE_Int level, i, j; // Default to CFL1 Jacobi if (hypre_ParAMGDDDataFACRelaxType(amgdd_data) == 0) { hypre_ParAMGDDDataUserFACRelaxation(amgdd_data) = hypre_BoomerAMGDD_FAC_Jacobi; } else if (hypre_ParAMGDDDataFACRelaxType(amgdd_data) == 1) { hypre_ParAMGDDDataUserFACRelaxation(amgdd_data) = hypre_BoomerAMGDD_FAC_GaussSeidel; } else if (hypre_ParAMGDDDataFACRelaxType(amgdd_data) == 2) { hypre_ParAMGDDDataUserFACRelaxation(amgdd_data) = hypre_BoomerAMGDD_FAC_OrderedGaussSeidel; } else if (hypre_ParAMGDDDataFACRelaxType(amgdd_data) == 3) { hypre_ParAMGDDDataUserFACRelaxation(amgdd_data) = hypre_BoomerAMGDD_FAC_CFL1Jacobi; } else { hypre_error_w_msg(HYPRE_ERROR_GENERIC, "WARNING: unknown AMGDD FAC relaxation type. Defaulting to CFL1 Jacobi.\n"); hypre_ParAMGDDDataUserFACRelaxation(amgdd_data) = hypre_BoomerAMGDD_FAC_CFL1Jacobi; hypre_ParAMGDDDataFACRelaxType(amgdd_data) = 3; } if (hypre_ParAMGDDDataFACRelaxType(amgdd_data) == 3) { for (level = hypre_ParAMGDDDataStartLevel(amgdd_data); level < hypre_ParAMGDataNumLevels(amg_data); level++) { compGrid = hypre_ParAMGDDDataCompGrid(amgdd_data)[level]; // Calculate l1_norms total_num_nodes = hypre_AMGDDCompGridNumOwnedNodes(compGrid) + hypre_AMGDDCompGridNumNonOwnedNodes( compGrid); hypre_AMGDDCompGridL1Norms(compGrid) = hypre_CTAlloc(HYPRE_Real, total_num_nodes, hypre_AMGDDCompGridMemoryLocation(compGrid)); diag = hypre_AMGDDCompGridMatrixOwnedDiag(hypre_AMGDDCompGridA(compGrid)); offd = hypre_AMGDDCompGridMatrixOwnedOffd(hypre_AMGDDCompGridA(compGrid)); for (i = 0; i < hypre_AMGDDCompGridNumOwnedNodes(compGrid); i++) { cf_diag = hypre_AMGDDCompGridCFMarkerArray(compGrid)[i]; for (j = hypre_CSRMatrixI(diag)[i]; j < hypre_CSRMatrixI(diag)[i + 1]; j++) { if (hypre_AMGDDCompGridCFMarkerArray(compGrid)[ hypre_CSRMatrixJ(diag)[j] ] == cf_diag) { hypre_AMGDDCompGridL1Norms(compGrid)[i] += hypre_cabs(hypre_CSRMatrixData(diag)[j]); } } for (j = hypre_CSRMatrixI(offd)[i]; j < hypre_CSRMatrixI(offd)[i + 1]; j++) { if (hypre_AMGDDCompGridCFMarkerArray(compGrid)[ hypre_CSRMatrixJ(offd)[j] + hypre_AMGDDCompGridNumOwnedNodes(compGrid) ] == cf_diag) { hypre_AMGDDCompGridL1Norms(compGrid)[i] += hypre_cabs(hypre_CSRMatrixData(offd)[j]); } } } diag = hypre_AMGDDCompGridMatrixNonOwnedDiag(hypre_AMGDDCompGridA(compGrid)); offd = hypre_AMGDDCompGridMatrixNonOwnedOffd(hypre_AMGDDCompGridA(compGrid)); for (i = 0; i < hypre_AMGDDCompGridNumNonOwnedNodes(compGrid); i++) { cf_diag = hypre_AMGDDCompGridCFMarkerArray(compGrid)[i + hypre_AMGDDCompGridNumOwnedNodes( compGrid)]; for (j = hypre_CSRMatrixI(diag)[i]; j < hypre_CSRMatrixI(diag)[i + 1]; j++) { if (hypre_AMGDDCompGridCFMarkerArray(compGrid)[ hypre_CSRMatrixJ(diag)[j] + hypre_AMGDDCompGridNumOwnedNodes(compGrid) ] == cf_diag) { hypre_AMGDDCompGridL1Norms(compGrid)[i + hypre_AMGDDCompGridNumOwnedNodes(compGrid)] += hypre_cabs( hypre_CSRMatrixData(diag)[j]); } } for (j = hypre_CSRMatrixI(offd)[i]; j < hypre_CSRMatrixI(offd)[i + 1]; j++) { if (hypre_AMGDDCompGridCFMarkerArray(compGrid)[ hypre_CSRMatrixJ(offd)[j]] == cf_diag) { hypre_AMGDDCompGridL1Norms(compGrid)[i + hypre_AMGDDCompGridNumOwnedNodes(compGrid)] += hypre_cabs( hypre_CSRMatrixData(offd)[j]); } } } } } return hypre_error_flag; } HYPRE_Int hypre_AMGDDCompGridFinalize( hypre_ParAMGDDData *amgdd_data ) { hypre_ParAMGData *amg_data = hypre_ParAMGDDDataAMG(amgdd_data); hypre_AMGDDCompGrid **compGrid = hypre_ParAMGDDDataCompGrid(amgdd_data); hypre_AMGDDCommPkg *amgddCommPkg = hypre_ParAMGDDDataCommPkg(amgdd_data); HYPRE_Int num_levels = hypre_ParAMGDataNumLevels(amg_data); HYPRE_Int start_level = hypre_ParAMGDDDataStartLevel(amgdd_data); HYPRE_MemoryLocation memory_location; hypre_CSRMatrix *A_diag; hypre_CSRMatrix *A_offd; HYPRE_Int A_diag_nnz; HYPRE_Int new_col_ind; HYPRE_Int *new_A_diag_rowPtr; HYPRE_Int *new_A_diag_colInd; HYPRE_Complex *new_A_diag_data; HYPRE_Int A_offd_nnz; HYPRE_Int *new_A_offd_rowPtr; HYPRE_Int *new_A_offd_colInd; HYPRE_Complex *new_A_offd_data; HYPRE_Int A_real_real_nnz; HYPRE_Int A_real_ghost_nnz; hypre_CSRMatrix *P_diag; hypre_CSRMatrix *P_offd; HYPRE_Int P_diag_nnz; HYPRE_Int *new_P_diag_rowPtr = NULL; HYPRE_Int *new_P_diag_colInd = NULL; HYPRE_Complex *new_P_diag_data; HYPRE_Int P_offd_nnz; HYPRE_Int *new_P_offd_rowPtr = NULL; HYPRE_Int *new_P_offd_colInd = NULL; HYPRE_Complex *new_P_offd_data; hypre_CSRMatrix *R_diag = NULL; hypre_CSRMatrix *R_offd = NULL; HYPRE_Int R_diag_nnz; HYPRE_Int *new_R_diag_rowPtr = NULL; HYPRE_Int *new_R_diag_colInd = NULL; HYPRE_Complex *new_R_diag_data = NULL; HYPRE_Int R_offd_nnz; HYPRE_Int *new_R_offd_rowPtr = NULL; HYPRE_Int *new_R_offd_colInd = NULL; HYPRE_Complex *new_R_offd_data = NULL; HYPRE_Int A_diag_cnt; HYPRE_Int A_offd_cnt; HYPRE_Int P_diag_cnt; HYPRE_Int P_offd_cnt; HYPRE_Int R_diag_cnt; HYPRE_Int R_offd_cnt; HYPRE_Int node_cnt; HYPRE_Int *new_indices; HYPRE_Int num_nonowned; HYPRE_Int num_owned; HYPRE_Int num_nonowned_real_nodes; HYPRE_Int num_send_nodes; HYPRE_Int num_send_procs; HYPRE_Int new_num_send_nodes; HYPRE_Int new_num_send_procs; HYPRE_Int num_recv_nodes; HYPRE_Int num_recv_procs; HYPRE_Int new_num_recv_nodes; HYPRE_Int new_num_recv_procs; HYPRE_Int real_cnt, ghost_cnt; HYPRE_Int proc, outer_level, level, i, j; // Post process to remove -1 entries from matrices and reorder so that extra nodes are [real, ghost] for (level = start_level; level < num_levels; level++) { memory_location = hypre_AMGDDCompGridMemoryLocation(compGrid[level]); num_nonowned = hypre_AMGDDCompGridNumNonOwnedNodes(compGrid[level]); num_owned = hypre_AMGDDCompGridNumOwnedNodes(compGrid[level]); num_nonowned_real_nodes = 0; for (i = 0; i < num_nonowned; i++) { if (hypre_AMGDDCompGridNonOwnedRealMarker(compGrid[level])[i]) { num_nonowned_real_nodes++; } } hypre_AMGDDCompGridNumNonOwnedRealNodes(compGrid[level]) = num_nonowned_real_nodes; new_indices = hypre_CTAlloc(HYPRE_Int, num_nonowned, memory_location); real_cnt = ghost_cnt = 0; for (i = 0; i < num_nonowned; i++) { if (hypre_AMGDDCompGridNonOwnedRealMarker(compGrid[level])[i]) { new_indices[i] = real_cnt++; } else { new_indices[i] = num_nonowned_real_nodes + ghost_cnt++; } } // Transform indices in send_flag and recv_map if (amgddCommPkg) { for (outer_level = start_level; outer_level < num_levels; outer_level++) { for (proc = 0; proc < hypre_AMGDDCommPkgNumSendProcs(amgddCommPkg)[outer_level]; proc++) { num_send_nodes = hypre_AMGDDCommPkgNumSendNodes(amgddCommPkg)[outer_level][proc][level]; new_num_send_nodes = 0; for (i = 0; i < num_send_nodes; i++) { if (hypre_AMGDDCommPkgSendFlag(amgddCommPkg)[outer_level][proc][level][i] >= num_owned) { hypre_AMGDDCommPkgSendFlag(amgddCommPkg)[outer_level][proc][level][new_num_send_nodes++] = new_indices[ hypre_AMGDDCommPkgSendFlag(amgddCommPkg)[outer_level][proc][level][i] - num_owned ] + num_owned; } else if (hypre_AMGDDCommPkgSendFlag(amgddCommPkg)[outer_level][proc][level][i] >= 0) { hypre_AMGDDCommPkgSendFlag(amgddCommPkg)[outer_level][proc][level][new_num_send_nodes++] = hypre_AMGDDCommPkgSendFlag(amgddCommPkg)[outer_level][proc][level][i]; } } hypre_AMGDDCommPkgNumSendNodes(amgddCommPkg)[outer_level][proc][level] = new_num_send_nodes; } for (proc = 0; proc < hypre_AMGDDCommPkgNumRecvProcs(amgddCommPkg)[outer_level]; proc++) { num_recv_nodes = hypre_AMGDDCommPkgNumRecvNodes(amgddCommPkg)[outer_level][proc][level]; new_num_recv_nodes = 0; for (i = 0; i < num_recv_nodes; i++) { if (hypre_AMGDDCommPkgRecvMap(amgddCommPkg)[outer_level][proc][level][i] >= 0) { hypre_AMGDDCommPkgRecvMap(amgddCommPkg)[outer_level][proc][level][new_num_recv_nodes++] = new_indices[hypre_AMGDDCommPkgRecvMap(amgddCommPkg)[outer_level][proc][level][i]]; } } hypre_AMGDDCommPkgNumRecvNodes(amgddCommPkg)[outer_level][proc][level] = new_num_recv_nodes; } } } // Setup CF marker array hypre_AMGDDCompGridCFMarkerArray(compGrid[level]) = hypre_CTAlloc(HYPRE_Int, num_owned + num_nonowned, memory_location); if (level != num_levels - 1) { // Setup CF marker array for (i = 0; i < num_owned; i++) { if (hypre_AMGDDCompGridOwnedCoarseIndices(compGrid[level])[i] >= 0) { hypre_AMGDDCompGridCFMarkerArray(compGrid[level])[i] = 1; } else { hypre_AMGDDCompGridCFMarkerArray(compGrid[level])[i] = -1; } } for (i = 0; i < num_nonowned; i++) { if (hypre_AMGDDCompGridNonOwnedCoarseIndices(compGrid[level])[i] >= 0) { hypre_AMGDDCompGridCFMarkerArray(compGrid[level])[new_indices[i] + num_owned] = 1; } else { hypre_AMGDDCompGridCFMarkerArray(compGrid[level])[new_indices[i] + num_owned] = -1; } } } else { for (i = 0; i < num_owned + num_nonowned; i++) { hypre_AMGDDCompGridCFMarkerArray(compGrid[level])[i] = -1; } } // Reorder nonowned matrices A_diag = hypre_AMGDDCompGridMatrixNonOwnedDiag(hypre_AMGDDCompGridA(compGrid[level])); A_offd = hypre_AMGDDCompGridMatrixNonOwnedOffd(hypre_AMGDDCompGridA(compGrid[level])); A_diag_nnz = hypre_CSRMatrixI(A_diag)[num_nonowned]; new_A_diag_rowPtr = hypre_CTAlloc(HYPRE_Int, num_nonowned + 1, memory_location); new_A_diag_colInd = hypre_CTAlloc(HYPRE_Int, A_diag_nnz, memory_location); new_A_diag_data = hypre_CTAlloc(HYPRE_Complex, A_diag_nnz, memory_location); A_offd_nnz = hypre_CSRMatrixI(A_offd)[num_nonowned]; new_A_offd_rowPtr = hypre_CTAlloc(HYPRE_Int, num_nonowned + 1, memory_location); new_A_offd_colInd = hypre_CTAlloc(HYPRE_Int, A_offd_nnz, memory_location); new_A_offd_data = hypre_CTAlloc(HYPRE_Complex, A_offd_nnz, memory_location); A_real_real_nnz = 0; A_real_ghost_nnz = 0; if (level != num_levels - 1 && num_nonowned) { P_diag = hypre_AMGDDCompGridMatrixNonOwnedDiag(hypre_AMGDDCompGridP(compGrid[level])); P_offd = hypre_AMGDDCompGridMatrixNonOwnedOffd(hypre_AMGDDCompGridP(compGrid[level])); P_diag_nnz = hypre_CSRMatrixI(P_diag)[num_nonowned]; new_P_diag_rowPtr = hypre_CTAlloc(HYPRE_Int, num_nonowned + 1, memory_location); new_P_diag_colInd = hypre_CTAlloc(HYPRE_Int, P_diag_nnz, memory_location); new_P_diag_data = hypre_CTAlloc(HYPRE_Complex, P_diag_nnz, memory_location); P_offd_nnz = hypre_CSRMatrixI(P_offd)[num_nonowned]; new_P_offd_rowPtr = hypre_CTAlloc(HYPRE_Int, num_nonowned + 1, memory_location); new_P_offd_colInd = hypre_CTAlloc(HYPRE_Int, P_offd_nnz, memory_location); new_P_offd_data = hypre_CTAlloc(HYPRE_Complex, P_offd_nnz, memory_location); } if (hypre_ParAMGDataRestriction(amg_data) && level != 0 && num_nonowned) { R_diag = hypre_AMGDDCompGridMatrixNonOwnedDiag(hypre_AMGDDCompGridR(compGrid[level - 1])); R_offd = hypre_AMGDDCompGridMatrixNonOwnedOffd(hypre_AMGDDCompGridR(compGrid[level - 1])); R_diag_nnz = hypre_CSRMatrixI(R_diag)[num_nonowned]; new_R_diag_rowPtr = hypre_CTAlloc(HYPRE_Int, num_nonowned + 1, memory_location); new_R_diag_colInd = hypre_CTAlloc(HYPRE_Int, R_diag_nnz, memory_location); new_R_diag_data = hypre_CTAlloc(HYPRE_Complex, R_diag_nnz, memory_location); R_offd_nnz = hypre_CSRMatrixI(R_offd)[num_nonowned]; new_R_offd_rowPtr = hypre_CTAlloc(HYPRE_Int, num_nonowned + 1, memory_location); new_R_offd_colInd = hypre_CTAlloc(HYPRE_Int, R_offd_nnz, memory_location); new_R_offd_data = hypre_CTAlloc(HYPRE_Complex, R_offd_nnz, memory_location); } A_diag_cnt = 0; A_offd_cnt = 0; P_diag_cnt = 0; P_offd_cnt = 0; R_diag_cnt = 0; R_offd_cnt = 0; node_cnt = 0; // Real nodes for (i = 0; i < num_nonowned; i++) { if (hypre_AMGDDCompGridNonOwnedRealMarker(compGrid[level])[i]) { new_A_diag_rowPtr[node_cnt] = A_diag_cnt; for (j = hypre_CSRMatrixI(A_diag)[i]; j < hypre_CSRMatrixI(A_diag)[i + 1]; j++) { if (hypre_CSRMatrixJ(A_diag)[j] >= 0) { new_col_ind = new_indices[ hypre_CSRMatrixJ(A_diag)[j] ]; new_A_diag_colInd[A_diag_cnt] = new_col_ind; new_A_diag_data[A_diag_cnt] = hypre_CSRMatrixData(A_diag)[j]; A_diag_cnt++; if (new_col_ind < num_nonowned_real_nodes) { A_real_real_nnz++; } else { A_real_ghost_nnz++; } } } new_A_offd_rowPtr[node_cnt] = A_offd_cnt; for (j = hypre_CSRMatrixI(A_offd)[i]; j < hypre_CSRMatrixI(A_offd)[i + 1]; j++) { if (hypre_CSRMatrixJ(A_offd)[j] >= 0) { new_A_offd_colInd[A_offd_cnt] = hypre_CSRMatrixJ(A_offd)[j]; new_A_offd_data[A_offd_cnt] = hypre_CSRMatrixData(A_offd)[j]; A_offd_cnt++; } } if (level != num_levels - 1) { new_P_diag_rowPtr[node_cnt] = P_diag_cnt; for (j = hypre_CSRMatrixI(P_diag)[i]; j < hypre_CSRMatrixI(P_diag)[i + 1]; j++) { if (hypre_CSRMatrixJ(P_diag)[j] >= 0) { new_P_diag_colInd[P_diag_cnt] = hypre_CSRMatrixJ(P_diag)[j]; new_P_diag_data[P_diag_cnt] = hypre_CSRMatrixData(P_diag)[j]; P_diag_cnt++; } } new_P_offd_rowPtr[node_cnt] = P_offd_cnt; for (j = hypre_CSRMatrixI(P_offd)[i]; j < hypre_CSRMatrixI(P_offd)[i + 1]; j++) { if (hypre_CSRMatrixJ(P_offd)[j] >= 0) { new_P_offd_colInd[P_offd_cnt] = hypre_CSRMatrixJ(P_offd)[j]; new_P_offd_data[P_offd_cnt] = hypre_CSRMatrixData(P_offd)[j]; P_offd_cnt++; } } } if (hypre_ParAMGDataRestriction(amg_data) && level != 0) { new_R_diag_rowPtr[node_cnt] = R_diag_cnt; for (j = hypre_CSRMatrixI(R_diag)[i]; j < hypre_CSRMatrixI(R_diag)[i + 1]; j++) { if (hypre_CSRMatrixJ(R_diag)[j] >= 0) { new_R_diag_colInd[R_diag_cnt] = hypre_CSRMatrixJ(R_diag)[j]; new_R_diag_data[R_diag_cnt] = hypre_CSRMatrixData(R_diag)[j]; R_diag_cnt++; } } new_R_offd_rowPtr[node_cnt] = R_offd_cnt; for (j = hypre_CSRMatrixI(R_offd)[i]; j < hypre_CSRMatrixI(R_offd)[i + 1]; j++) { if (hypre_CSRMatrixJ(R_offd)[j] >= 0) { new_R_offd_colInd[R_offd_cnt] = hypre_CSRMatrixJ(R_offd)[j]; new_R_offd_data[R_offd_cnt] = hypre_CSRMatrixData(R_offd)[j]; R_offd_cnt++; } } } node_cnt++; } } // Ghost nodes for (i = 0; i < num_nonowned; i++) { if (!hypre_AMGDDCompGridNonOwnedRealMarker(compGrid[level])[i]) { new_A_diag_rowPtr[node_cnt] = A_diag_cnt; for (j = hypre_CSRMatrixI(A_diag)[i]; j < hypre_CSRMatrixI(A_diag)[i + 1]; j++) { if (hypre_CSRMatrixJ(A_diag)[j] >= 0) { new_A_diag_colInd[A_diag_cnt] = new_indices[ hypre_CSRMatrixJ(A_diag)[j] ]; new_A_diag_data[A_diag_cnt] = hypre_CSRMatrixData(A_diag)[j]; A_diag_cnt++; } } new_A_offd_rowPtr[node_cnt] = A_offd_cnt; for (j = hypre_CSRMatrixI(A_offd)[i]; j < hypre_CSRMatrixI(A_offd)[i + 1]; j++) { if (hypre_CSRMatrixJ(A_offd)[j] >= 0) { new_A_offd_colInd[A_offd_cnt] = hypre_CSRMatrixJ(A_offd)[j]; new_A_offd_data[A_offd_cnt] = hypre_CSRMatrixData(A_offd)[j]; A_offd_cnt++; } } if (level != num_levels - 1) { new_P_diag_rowPtr[node_cnt] = P_diag_cnt; for (j = hypre_CSRMatrixI(P_diag)[i]; j < hypre_CSRMatrixI(P_diag)[i + 1]; j++) { if (hypre_CSRMatrixJ(P_diag)[j] >= 0) { new_P_diag_colInd[P_diag_cnt] = hypre_CSRMatrixJ(P_diag)[j]; new_P_diag_data[P_diag_cnt] = hypre_CSRMatrixData(P_diag)[j]; P_diag_cnt++; } } new_P_offd_rowPtr[node_cnt] = P_offd_cnt; for (j = hypre_CSRMatrixI(P_offd)[i]; j < hypre_CSRMatrixI(P_offd)[i + 1]; j++) { if (hypre_CSRMatrixJ(P_offd)[j] >= 0) { new_P_offd_colInd[P_offd_cnt] = hypre_CSRMatrixJ(P_offd)[j]; new_P_offd_data[P_offd_cnt] = hypre_CSRMatrixData(P_offd)[j]; P_offd_cnt++; } } } if (hypre_ParAMGDataRestriction(amg_data) && level != 0) { new_R_diag_rowPtr[node_cnt] = R_diag_cnt; for (j = hypre_CSRMatrixI(R_diag)[i]; j < hypre_CSRMatrixI(R_diag)[i + 1]; j++) { if (hypre_CSRMatrixJ(R_diag)[j] >= 0) { new_R_diag_colInd[R_diag_cnt] = hypre_CSRMatrixJ(R_diag)[j]; new_R_diag_data[R_diag_cnt] = hypre_CSRMatrixData(R_diag)[j]; R_diag_cnt++; } } new_R_offd_rowPtr[node_cnt] = R_offd_cnt; for (j = hypre_CSRMatrixI(R_offd)[i]; j < hypre_CSRMatrixI(R_offd)[i + 1]; j++) { if (hypre_CSRMatrixJ(R_offd)[j] >= 0) { new_R_offd_colInd[R_offd_cnt] = hypre_CSRMatrixJ(R_offd)[j]; new_R_offd_data[R_offd_cnt] = hypre_CSRMatrixData(R_offd)[j]; R_offd_cnt++; } } } node_cnt++; } } new_A_diag_rowPtr[num_nonowned] = A_diag_cnt; new_A_offd_rowPtr[num_nonowned] = A_offd_cnt; // Create these matrices, but don't initialize (will be allocated later if necessary) hypre_AMGDDCompGridMatrixRealReal(hypre_AMGDDCompGridA(compGrid[level])) = hypre_CSRMatrixCreate( num_nonowned_real_nodes, num_nonowned_real_nodes, A_real_real_nnz); hypre_AMGDDCompGridMatrixRealGhost(hypre_AMGDDCompGridA(compGrid[level])) = hypre_CSRMatrixCreate( num_nonowned_real_nodes, num_nonowned, A_real_ghost_nnz); if (level != num_levels - 1 && num_nonowned) { new_P_diag_rowPtr[num_nonowned] = P_diag_cnt; new_P_offd_rowPtr[num_nonowned] = P_offd_cnt; } if (hypre_ParAMGDataRestriction(amg_data) && level != 0 && num_nonowned) { new_R_diag_rowPtr[num_nonowned] = R_diag_cnt; new_R_offd_rowPtr[num_nonowned] = R_offd_cnt; } // Fix up P col indices on finer level if (level != start_level && hypre_AMGDDCompGridNumNonOwnedNodes(compGrid[level - 1])) { P_diag = hypre_AMGDDCompGridMatrixNonOwnedDiag(hypre_AMGDDCompGridP(compGrid[level - 1])); P_offd = hypre_AMGDDCompGridMatrixOwnedOffd(hypre_AMGDDCompGridP(compGrid[level - 1])); for (i = 0; i < hypre_CSRMatrixI(P_diag)[ hypre_AMGDDCompGridNumNonOwnedNodes(compGrid[level - 1]) ]; i++) { hypre_CSRMatrixJ(P_diag)[i] = new_indices[ hypre_CSRMatrixJ(P_diag)[i] ]; } // Also fix up owned offd col indices for (i = 0; i < hypre_CSRMatrixI(P_offd)[ hypre_AMGDDCompGridNumOwnedNodes(compGrid[level - 1]) ]; i++) { hypre_CSRMatrixJ(P_offd)[i] = new_indices[ hypre_CSRMatrixJ(P_offd)[i] ]; } } // Fix up R col indices on this level if (hypre_ParAMGDataRestriction(amg_data) && level != num_levels - 1 && num_nonowned) { R_diag = hypre_AMGDDCompGridMatrixNonOwnedDiag(hypre_AMGDDCompGridR(compGrid[level])); R_offd = hypre_AMGDDCompGridMatrixOwnedOffd(hypre_AMGDDCompGridR(compGrid[level])); for (i = 0; i < hypre_CSRMatrixI(R_diag)[ hypre_AMGDDCompGridNumNonOwnedNodes(compGrid[level + 1]) ]; i++) { if (hypre_CSRMatrixJ(R_diag)[i] >= 0) { hypre_CSRMatrixJ(R_diag)[i] = new_indices[ hypre_CSRMatrixJ(R_diag)[i] ]; } } // Also fix up owned offd col indices for (i = 0; i < hypre_CSRMatrixI(R_offd)[ hypre_AMGDDCompGridNumOwnedNodes(compGrid[level + 1]) ]; i++) { if (hypre_CSRMatrixJ(R_offd)[i] >= 0) { hypre_CSRMatrixJ(R_offd)[i] = new_indices[ hypre_CSRMatrixJ(R_offd)[i] ]; } } } // Clean up memory, deallocate old arrays and reset pointers to new arrays hypre_TFree(hypre_CSRMatrixI(A_diag), memory_location); hypre_TFree(hypre_CSRMatrixJ(A_diag), memory_location); hypre_TFree(hypre_CSRMatrixData(A_diag), memory_location); hypre_CSRMatrixI(A_diag) = new_A_diag_rowPtr; hypre_CSRMatrixJ(A_diag) = new_A_diag_colInd; hypre_CSRMatrixData(A_diag) = new_A_diag_data; hypre_CSRMatrixNumRows(A_diag) = num_nonowned; hypre_CSRMatrixNumRownnz(A_diag) = num_nonowned; hypre_CSRMatrixNumCols(A_diag) = num_nonowned; hypre_CSRMatrixNumNonzeros(A_diag) = hypre_CSRMatrixI(A_diag)[num_nonowned]; hypre_TFree(hypre_CSRMatrixI(A_offd), memory_location); hypre_TFree(hypre_CSRMatrixJ(A_offd), memory_location); hypre_TFree(hypre_CSRMatrixData(A_offd), memory_location); hypre_CSRMatrixI(A_offd) = new_A_offd_rowPtr; hypre_CSRMatrixJ(A_offd) = new_A_offd_colInd; hypre_CSRMatrixData(A_offd) = new_A_offd_data; hypre_CSRMatrixNumRows(A_offd) = num_nonowned; hypre_CSRMatrixNumRownnz(A_offd) = num_nonowned; hypre_CSRMatrixNumCols(A_offd) = hypre_AMGDDCompGridNumOwnedNodes(compGrid[level]); hypre_CSRMatrixNumNonzeros(A_offd) = hypre_CSRMatrixI(A_offd)[num_nonowned]; if (level != num_levels - 1 && num_nonowned) { P_diag = hypre_AMGDDCompGridMatrixNonOwnedDiag(hypre_AMGDDCompGridP(compGrid[level])); P_offd = hypre_AMGDDCompGridMatrixNonOwnedOffd(hypre_AMGDDCompGridP(compGrid[level])); hypre_TFree(hypre_CSRMatrixI(P_diag), memory_location); hypre_TFree(hypre_CSRMatrixJ(P_diag), memory_location); hypre_TFree(hypre_CSRMatrixData(P_diag), memory_location); hypre_CSRMatrixI(P_diag) = new_P_diag_rowPtr; hypre_CSRMatrixJ(P_diag) = new_P_diag_colInd; hypre_CSRMatrixData(P_diag) = new_P_diag_data; hypre_CSRMatrixNumRows(P_diag) = num_nonowned; hypre_CSRMatrixNumRownnz(P_diag) = num_nonowned; hypre_CSRMatrixNumCols(P_diag) = hypre_AMGDDCompGridNumNonOwnedNodes(compGrid[level + 1]); hypre_CSRMatrixNumNonzeros(P_diag) = hypre_CSRMatrixI(P_diag)[num_nonowned]; hypre_TFree(hypre_CSRMatrixI(P_offd), memory_location); hypre_TFree(hypre_CSRMatrixJ(P_offd), memory_location); hypre_TFree(hypre_CSRMatrixData(P_offd), memory_location); hypre_CSRMatrixI(P_offd) = new_P_offd_rowPtr; hypre_CSRMatrixJ(P_offd) = new_P_offd_colInd; hypre_CSRMatrixData(P_offd) = new_P_offd_data; hypre_CSRMatrixNumRows(P_offd) = num_nonowned; hypre_CSRMatrixNumRownnz(P_offd) = num_nonowned; hypre_CSRMatrixNumCols(P_offd) = hypre_AMGDDCompGridNumOwnedNodes(compGrid[level + 1]); hypre_CSRMatrixNumNonzeros(P_offd) = hypre_CSRMatrixI(P_offd)[num_nonowned]; hypre_CSRMatrixNumCols(hypre_AMGDDCompGridMatrixOwnedOffd(hypre_AMGDDCompGridP( compGrid[level]))) = hypre_AMGDDCompGridNumNonOwnedNodes(compGrid[level + 1]); } if (hypre_ParAMGDataRestriction(amg_data) && level != 0 && num_nonowned) { R_diag = hypre_AMGDDCompGridMatrixNonOwnedDiag(hypre_AMGDDCompGridR(compGrid[level - 1])); R_offd = hypre_AMGDDCompGridMatrixNonOwnedOffd(hypre_AMGDDCompGridR(compGrid[level - 1])); hypre_TFree(hypre_CSRMatrixI(R_diag), memory_location); hypre_TFree(hypre_CSRMatrixJ(R_diag), memory_location); hypre_TFree(hypre_CSRMatrixData(R_diag), memory_location); hypre_CSRMatrixI(R_diag) = new_R_diag_rowPtr; hypre_CSRMatrixJ(R_diag) = new_R_diag_colInd; hypre_CSRMatrixData(R_diag) = new_R_diag_data; hypre_CSRMatrixNumRows(R_diag) = num_nonowned; hypre_CSRMatrixNumRownnz(R_diag) = num_nonowned; hypre_CSRMatrixNumCols(R_diag) = hypre_AMGDDCompGridNumNonOwnedNodes(compGrid[level - 1]); hypre_CSRMatrixNumNonzeros(R_diag) = hypre_CSRMatrixI(R_diag)[num_nonowned]; hypre_TFree(hypre_CSRMatrixI(R_offd), memory_location); hypre_TFree(hypre_CSRMatrixJ(R_offd), memory_location); hypre_TFree(hypre_CSRMatrixData(R_offd), memory_location); hypre_CSRMatrixI(R_offd) = new_R_offd_rowPtr; hypre_CSRMatrixJ(R_offd) = new_R_offd_colInd; hypre_CSRMatrixData(R_offd) = new_R_offd_data; hypre_CSRMatrixNumRows(R_offd) = num_nonowned; hypre_CSRMatrixNumRownnz(R_offd) = num_nonowned; hypre_CSRMatrixNumCols(R_offd) = hypre_AMGDDCompGridNumOwnedNodes(compGrid[level - 1]); hypre_CSRMatrixNumNonzeros(R_offd) = hypre_CSRMatrixI(R_offd)[num_nonowned]; hypre_CSRMatrixNumCols(hypre_AMGDDCompGridMatrixOwnedOffd(hypre_AMGDDCompGridR( compGrid[level - 1]))) = hypre_AMGDDCompGridNumNonOwnedNodes(compGrid[level - 1]); } // Setup comp grid vectors hypre_AMGDDCompGridU(compGrid[level]) = hypre_AMGDDCompGridVectorCreate(); hypre_AMGDDCompGridVectorOwned(hypre_AMGDDCompGridU(compGrid[level])) = hypre_ParVectorLocalVector( hypre_ParAMGDataUArray(amg_data)[level] ); hypre_AMGDDCompGridVectorOwnsOwnedVector(hypre_AMGDDCompGridU(compGrid[level])) = 0; hypre_AMGDDCompGridVectorNumReal(hypre_AMGDDCompGridU(compGrid[level])) = num_nonowned_real_nodes; hypre_AMGDDCompGridVectorNonOwned(hypre_AMGDDCompGridU(compGrid[level])) = hypre_SeqVectorCreate( num_nonowned); hypre_SeqVectorInitialize(hypre_AMGDDCompGridVectorNonOwned(hypre_AMGDDCompGridU(compGrid[level]))); hypre_AMGDDCompGridF(compGrid[level]) = hypre_AMGDDCompGridVectorCreate(); hypre_AMGDDCompGridVectorOwned(hypre_AMGDDCompGridF(compGrid[level])) = hypre_ParVectorLocalVector( hypre_ParAMGDataFArray(amg_data)[level] ); hypre_AMGDDCompGridVectorOwnsOwnedVector(hypre_AMGDDCompGridF(compGrid[level])) = 0; hypre_AMGDDCompGridVectorNumReal(hypre_AMGDDCompGridF(compGrid[level])) = num_nonowned_real_nodes; hypre_AMGDDCompGridVectorNonOwned(hypre_AMGDDCompGridF(compGrid[level])) = hypre_SeqVectorCreate( num_nonowned); hypre_SeqVectorInitialize(hypre_AMGDDCompGridVectorNonOwned(hypre_AMGDDCompGridF(compGrid[level]))); hypre_AMGDDCompGridTemp(compGrid[level]) = hypre_AMGDDCompGridVectorCreate(); hypre_AMGDDCompGridVectorInitialize(hypre_AMGDDCompGridTemp(compGrid[level]), num_owned, num_nonowned, num_nonowned_real_nodes); if (level < num_levels) { hypre_AMGDDCompGridS(compGrid[level]) = hypre_AMGDDCompGridVectorCreate(); hypre_AMGDDCompGridVectorInitialize(hypre_AMGDDCompGridS(compGrid[level]), num_owned, num_nonowned, num_nonowned_real_nodes); hypre_AMGDDCompGridT(compGrid[level]) = hypre_AMGDDCompGridVectorCreate(); hypre_AMGDDCompGridVectorInitialize(hypre_AMGDDCompGridT(compGrid[level]), num_owned, num_nonowned, num_nonowned_real_nodes); } // Free up arrays we no longer need if (hypre_AMGDDCompGridNonOwnedRealMarker(compGrid[level])) { hypre_TFree(hypre_AMGDDCompGridNonOwnedRealMarker(compGrid[level]), memory_location); hypre_AMGDDCompGridNonOwnedRealMarker(compGrid[level]) = NULL; } if (hypre_AMGDDCompGridNonOwnedGlobalIndices(compGrid[level])) { hypre_TFree(hypre_AMGDDCompGridNonOwnedGlobalIndices(compGrid[level]), memory_location); hypre_AMGDDCompGridNonOwnedGlobalIndices(compGrid[level]) = NULL; } if (hypre_AMGDDCompGridNonOwnedCoarseIndices(compGrid[level])) { hypre_TFree(hypre_AMGDDCompGridNonOwnedCoarseIndices(compGrid[level]), memory_location); hypre_AMGDDCompGridNonOwnedCoarseIndices(compGrid[level]) = NULL; } if (hypre_AMGDDCompGridOwnedCoarseIndices(compGrid[level])) { hypre_TFree(hypre_AMGDDCompGridOwnedCoarseIndices(compGrid[level]), memory_location); hypre_AMGDDCompGridOwnedCoarseIndices(compGrid[level]) = NULL; } if (hypre_AMGDDCompGridNonOwnedSort(compGrid[level])) { hypre_TFree(hypre_AMGDDCompGridNonOwnedSort(compGrid[level]), memory_location); hypre_AMGDDCompGridNonOwnedSort(compGrid[level]) = NULL; } if (hypre_AMGDDCompGridNonOwnedInvSort(compGrid[level])) { hypre_TFree(hypre_AMGDDCompGridNonOwnedInvSort(compGrid[level]), memory_location); hypre_AMGDDCompGridNonOwnedInvSort(compGrid[level]) = NULL; } hypre_TFree(new_indices, memory_location); } // Setup R = P^T if R not specified if (!hypre_ParAMGDataRestriction(amg_data)) { for (level = start_level; level < num_levels - 1; level++) { // !!! TODO: if BoomerAMG explicitly stores R = P^T, use those matrices in hypre_AMGDDCompGridR(compGrid[level]) = hypre_AMGDDCompGridMatrixCreate(); hypre_AMGDDCompGridMatrixOwnsOwnedMatrices(hypre_AMGDDCompGridR(compGrid[level])) = 1; hypre_CSRMatrixTranspose(hypre_AMGDDCompGridMatrixOwnedDiag(hypre_AMGDDCompGridP(compGrid[level])), &hypre_AMGDDCompGridMatrixOwnedDiag(hypre_AMGDDCompGridR(compGrid[level])), 1); if (hypre_AMGDDCompGridNumNonOwnedNodes(compGrid[level])) { hypre_CSRMatrixTranspose(hypre_AMGDDCompGridMatrixNonOwnedOffd(hypre_AMGDDCompGridP( compGrid[level])), &hypre_AMGDDCompGridMatrixOwnedOffd(hypre_AMGDDCompGridR(compGrid[level])), 1); } hypre_CSRMatrixTranspose(hypre_AMGDDCompGridMatrixOwnedOffd(hypre_AMGDDCompGridP(compGrid[level])), &hypre_AMGDDCompGridMatrixNonOwnedOffd(hypre_AMGDDCompGridR(compGrid[level])), 1); if (hypre_AMGDDCompGridNumNonOwnedNodes(compGrid[level])) { hypre_CSRMatrixTranspose(hypre_AMGDDCompGridMatrixNonOwnedDiag(hypre_AMGDDCompGridP( compGrid[level])), &hypre_AMGDDCompGridMatrixNonOwnedDiag(hypre_AMGDDCompGridR(compGrid[level])), 1); } } } // Finish up comm pkg if (amgddCommPkg) { for (outer_level = start_level; outer_level < num_levels; outer_level++) { num_send_procs = hypre_AMGDDCommPkgNumSendProcs(amgddCommPkg)[outer_level]; new_num_send_procs = 0; for (proc = 0; proc < num_send_procs; proc++) { hypre_AMGDDCommPkgSendBufferSize(amgddCommPkg)[outer_level][new_num_send_procs] = 0; for (level = outer_level; level < num_levels; level++) { hypre_AMGDDCommPkgSendBufferSize(amgddCommPkg)[outer_level][new_num_send_procs] += hypre_AMGDDCommPkgNumSendNodes(amgddCommPkg)[outer_level][proc][level]; } if (hypre_AMGDDCommPkgSendBufferSize(amgddCommPkg)[outer_level][new_num_send_procs]) { hypre_AMGDDCommPkgSendProcs(amgddCommPkg)[outer_level][new_num_send_procs] = hypre_AMGDDCommPkgSendProcs(amgddCommPkg)[outer_level][proc]; for (level = outer_level; level < num_levels; level++) { hypre_AMGDDCommPkgNumSendNodes(amgddCommPkg)[outer_level][new_num_send_procs][level] = hypre_AMGDDCommPkgNumSendNodes(amgddCommPkg)[outer_level][proc][level]; hypre_AMGDDCommPkgSendFlag(amgddCommPkg)[outer_level][new_num_send_procs][level] = hypre_AMGDDCommPkgSendFlag(amgddCommPkg)[outer_level][proc][level]; } new_num_send_procs++; } } // Free memory for (j = new_num_send_procs; j < num_send_procs; j++) { hypre_AMGDDCommPkgSendLevelDestroy(amgddCommPkg, outer_level, j); } // Update number of send processes hypre_AMGDDCommPkgNumSendProcs(amgddCommPkg)[outer_level] = new_num_send_procs; num_recv_procs = hypre_AMGDDCommPkgNumRecvProcs(amgddCommPkg)[outer_level]; new_num_recv_procs = 0; for (proc = 0; proc < num_recv_procs; proc++) { hypre_AMGDDCommPkgRecvBufferSize(amgddCommPkg)[outer_level][new_num_recv_procs] = 0; for (level = outer_level; level < num_levels; level++) { hypre_AMGDDCommPkgRecvBufferSize(amgddCommPkg)[outer_level][new_num_recv_procs] += hypre_AMGDDCommPkgNumRecvNodes(amgddCommPkg)[outer_level][proc][level]; } if (hypre_AMGDDCommPkgRecvBufferSize(amgddCommPkg)[outer_level][new_num_recv_procs]) { hypre_AMGDDCommPkgRecvProcs(amgddCommPkg)[outer_level][new_num_recv_procs] = hypre_AMGDDCommPkgRecvProcs(amgddCommPkg)[outer_level][proc]; for (level = outer_level; level < num_levels; level++) { hypre_AMGDDCommPkgNumRecvNodes(amgddCommPkg)[outer_level][new_num_recv_procs][level] = hypre_AMGDDCommPkgNumRecvNodes(amgddCommPkg)[outer_level][proc][level]; hypre_AMGDDCommPkgRecvMap(amgddCommPkg)[outer_level][new_num_recv_procs][level] = hypre_AMGDDCommPkgRecvMap(amgddCommPkg)[outer_level][proc][level]; } new_num_recv_procs++; } } // Free memory for (j = new_num_recv_procs; j < num_recv_procs; j++) { hypre_AMGDDCommPkgRecvLevelDestroy(amgddCommPkg, outer_level, j); } // Update number of recv processes hypre_AMGDDCommPkgNumRecvProcs(amgddCommPkg)[outer_level] = new_num_recv_procs; } } return hypre_error_flag; } HYPRE_Int hypre_AMGDDCompGridResize( hypre_AMGDDCompGrid *compGrid, HYPRE_Int new_size, HYPRE_Int need_coarse_info ) { // This function reallocates memory to hold nonowned info for the comp grid HYPRE_MemoryLocation memory_location = hypre_AMGDDCompGridMemoryLocation(compGrid); hypre_CSRMatrix *nonowned_diag; hypre_CSRMatrix *nonowned_offd; HYPRE_Int old_size = hypre_AMGDDCompGridNumNonOwnedNodes(compGrid); hypre_AMGDDCompGridNonOwnedGlobalIndices(compGrid) = hypre_TReAlloc_v2( hypre_AMGDDCompGridNonOwnedGlobalIndices(compGrid), HYPRE_Int, old_size, HYPRE_Int, new_size, memory_location); hypre_AMGDDCompGridNonOwnedRealMarker(compGrid) = hypre_TReAlloc_v2( hypre_AMGDDCompGridNonOwnedRealMarker(compGrid), HYPRE_Int, old_size, HYPRE_Int, new_size, memory_location); hypre_AMGDDCompGridNonOwnedSort(compGrid) = hypre_TReAlloc_v2(hypre_AMGDDCompGridNonOwnedSort( compGrid), HYPRE_Int, old_size, HYPRE_Int, new_size, memory_location); hypre_AMGDDCompGridNonOwnedInvSort(compGrid) = hypre_TReAlloc_v2(hypre_AMGDDCompGridNonOwnedInvSort( compGrid), HYPRE_Int, old_size, HYPRE_Int, new_size, memory_location); nonowned_diag = hypre_AMGDDCompGridMatrixNonOwnedDiag(hypre_AMGDDCompGridA(compGrid)); nonowned_offd = hypre_AMGDDCompGridMatrixNonOwnedOffd(hypre_AMGDDCompGridA(compGrid)); hypre_CSRMatrixResize(nonowned_diag, new_size, new_size, hypre_CSRMatrixNumNonzeros(nonowned_diag)); hypre_CSRMatrixResize(nonowned_offd, new_size, hypre_CSRMatrixNumCols(nonowned_offd), hypre_CSRMatrixNumNonzeros(nonowned_offd)); if (need_coarse_info) { hypre_AMGDDCompGridNonOwnedCoarseIndices(compGrid) = hypre_TReAlloc_v2( hypre_AMGDDCompGridNonOwnedCoarseIndices(compGrid), HYPRE_Int, old_size, HYPRE_Int, new_size, memory_location); } return hypre_error_flag; } HYPRE_Int hypre_AMGDDCompGridSetupLocalIndices( hypre_AMGDDCompGrid **compGrid, HYPRE_Int *nodes_added_on_level, HYPRE_Int ****recv_map, HYPRE_Int num_recv_procs, HYPRE_Int **A_tmp_info, HYPRE_Int current_level, HYPRE_Int num_levels ) { // when nodes are added to a composite grid, global info is copied over, but local indices must be generated appropriately for all added nodes // this must be done on each level as info is added to correctly construct subsequent Psi_c grids // also done after each ghost layer is added hypre_AMGDDCompGridMatrix *A = hypre_AMGDDCompGridA(compGrid[current_level]); hypre_CSRMatrix *owned_offd = hypre_AMGDDCompGridMatrixOwnedOffd(A); hypre_CSRMatrix *nonowned_diag = hypre_AMGDDCompGridMatrixNonOwnedDiag(A); hypre_CSRMatrix *nonowned_offd = hypre_AMGDDCompGridMatrixNonOwnedOffd(A); // On current_level, need to deal with A_tmp_info HYPRE_Int row = hypre_CSRMatrixNumCols(owned_offd) + 1; HYPRE_Int diag_rowptr = hypre_CSRMatrixI(nonowned_diag)[ hypre_CSRMatrixNumCols(owned_offd) ]; HYPRE_Int offd_rowptr = hypre_CSRMatrixI(nonowned_offd)[ hypre_CSRMatrixNumCols(owned_offd) ]; HYPRE_Int level, proc, i, j, cnt; HYPRE_Int global_index, local_index, coarse_index; HYPRE_Int remaining_dofs; HYPRE_Int row_size; HYPRE_Int incoming_index; HYPRE_Int num_missing_col_ind; HYPRE_Int is_real; for (proc = 0; proc < num_recv_procs; proc++) { cnt = 0; remaining_dofs = A_tmp_info[proc][cnt++]; for (i = 0; i < remaining_dofs; i++) { row_size = A_tmp_info[proc][cnt++]; for (j = 0; j < row_size; j++) { incoming_index = A_tmp_info[proc][cnt++]; // Incoming is a global index (could be owned or nonowned) if (incoming_index < 0) { incoming_index = -(incoming_index + 1); // See whether global index is owned on this proc (if so, can directly setup appropriate local index) if ( incoming_index >= hypre_AMGDDCompGridFirstGlobalIndex(compGrid[current_level]) && incoming_index <= hypre_AMGDDCompGridLastGlobalIndex(compGrid[current_level] )) { // Add to offd if (offd_rowptr >= hypre_CSRMatrixNumNonzeros(nonowned_offd)) { hypre_CSRMatrixResize(nonowned_offd, hypre_CSRMatrixNumRows(nonowned_offd), hypre_CSRMatrixNumCols(nonowned_offd), (HYPRE_Int)hypre_ceil(1.5 * hypre_CSRMatrixNumNonzeros(nonowned_offd))); } hypre_CSRMatrixJ(nonowned_offd)[offd_rowptr++] = incoming_index - hypre_AMGDDCompGridFirstGlobalIndex(compGrid[current_level]); } else { // Add to diag (global index, not in buffer, so need to do local binary search) if (diag_rowptr >= hypre_CSRMatrixNumNonzeros(nonowned_diag)) { hypre_AMGDDCompGridNonOwnedDiagMissingColIndices(compGrid[current_level]) = hypre_TReAlloc_v2(hypre_AMGDDCompGridNonOwnedDiagMissingColIndices(compGrid[current_level]), HYPRE_Int, hypre_CSRMatrixNumNonzeros(nonowned_diag), HYPRE_Int, (HYPRE_Int)hypre_ceil(1.5 * hypre_CSRMatrixNumNonzeros(nonowned_diag)), hypre_AMGDDCompGridMemoryLocation(compGrid[current_level])); hypre_CSRMatrixResize(nonowned_diag, hypre_CSRMatrixNumRows(nonowned_diag), hypre_CSRMatrixNumCols(nonowned_diag), (HYPRE_Int)hypre_ceil(1.5 * hypre_CSRMatrixNumNonzeros(nonowned_diag))); } // If we dof not found in comp grid, then mark this as a missing connection hypre_AMGDDCompGridNonOwnedDiagMissingColIndices( compGrid[current_level])[ hypre_AMGDDCompGridNumMissingColIndices(compGrid[current_level])++ ] = diag_rowptr; hypre_CSRMatrixJ(nonowned_diag)[diag_rowptr++] = -(incoming_index + 1); } } // Incoming is an index to dofs within the buffer (by construction, nonowned) else { // Add to diag (index is within buffer, so we can directly go to local index) if (diag_rowptr >= hypre_CSRMatrixNumNonzeros(nonowned_diag)) { hypre_AMGDDCompGridNonOwnedDiagMissingColIndices(compGrid[current_level]) = hypre_TReAlloc_v2(hypre_AMGDDCompGridNonOwnedDiagMissingColIndices(compGrid[current_level]), HYPRE_Int, hypre_CSRMatrixNumNonzeros(nonowned_diag), HYPRE_Int, (HYPRE_Int)hypre_ceil(1.5 * hypre_CSRMatrixNumNonzeros(nonowned_diag)), hypre_AMGDDCompGridMemoryLocation(compGrid[current_level])); hypre_CSRMatrixResize(nonowned_diag, hypre_CSRMatrixNumRows(nonowned_diag), hypre_CSRMatrixNumCols(nonowned_diag), (HYPRE_Int)hypre_ceil(1.5 * hypre_CSRMatrixNumNonzeros(nonowned_diag))); } local_index = recv_map[current_level][proc][current_level][ incoming_index ]; if (local_index < 0) { local_index = -(local_index + 1); } hypre_CSRMatrixJ(nonowned_diag)[diag_rowptr++] = local_index - hypre_AMGDDCompGridNumOwnedNodes( compGrid[current_level]); } } // Update row pointers hypre_CSRMatrixI(nonowned_offd)[ row ] = offd_rowptr; hypre_CSRMatrixI(nonowned_diag)[ row ] = diag_rowptr; row++; } hypre_TFree(A_tmp_info[proc], hypre_AMGDDCompGridMemoryLocation(compGrid[current_level])); } hypre_TFree(A_tmp_info, HYPRE_MEMORY_HOST); // Loop over levels from current to coarsest for (level = current_level; level < num_levels; level++) { A = hypre_AMGDDCompGridA(compGrid[level]); nonowned_diag = hypre_AMGDDCompGridMatrixNonOwnedDiag(A); // If we have added nodes on this level if (nodes_added_on_level[level]) { // Look for missing col ind connections num_missing_col_ind = hypre_AMGDDCompGridNumMissingColIndices(compGrid[level]); hypre_AMGDDCompGridNumMissingColIndices(compGrid[level]) = 0; for (i = 0; i < num_missing_col_ind; i++) { j = hypre_AMGDDCompGridNonOwnedDiagMissingColIndices(compGrid[level])[i]; global_index = hypre_CSRMatrixJ(nonowned_diag)[ j ]; global_index = -(global_index + 1); local_index = hypre_AMGDDCompGridLocalIndexBinarySearch(compGrid[level], global_index); // If we dof not found in comp grid, then mark this as a missing connection if (local_index == -1) { local_index = -(global_index + 1); hypre_AMGDDCompGridNonOwnedDiagMissingColIndices( compGrid[level])[ hypre_AMGDDCompGridNumMissingColIndices(compGrid[level])++ ] = j; } hypre_CSRMatrixJ(nonowned_diag)[ j ] = local_index; } } // if we are not on the coarsest level if (level != num_levels - 1) { // loop over indices of non-owned nodes on this level // No guarantee that previous ghost dofs converted to real dofs have coarse local indices setup... // Thus we go over all non-owned dofs here instead of just the added ones, but we only setup coarse local index where necessary. // NOTE: can't use nodes_added_on_level here either because real overwritten by ghost doesn't count as added node (so you can miss setting these up) for (i = 0; i < hypre_AMGDDCompGridNumNonOwnedNodes(compGrid[level]); i++) { // fix up the coarse local indices coarse_index = hypre_AMGDDCompGridNonOwnedCoarseIndices(compGrid[level])[i]; is_real = hypre_AMGDDCompGridNonOwnedRealMarker(compGrid[level])[i]; // setup coarse local index if necessary if (coarse_index < -1 && is_real) { coarse_index = -(coarse_index + 2); // Map back to regular global index local_index = hypre_AMGDDCompGridLocalIndexBinarySearch(compGrid[level + 1], coarse_index); hypre_AMGDDCompGridNonOwnedCoarseIndices(compGrid[level])[i] = local_index; } } } } return hypre_error_flag; } HYPRE_Int hypre_AMGDDCompGridSetupLocalIndicesP( hypre_ParAMGDDData *amgdd_data ) { hypre_ParAMGData *amg_data = hypre_ParAMGDDDataAMG(amgdd_data); hypre_AMGDDCompGrid **compGrid = hypre_ParAMGDDDataCompGrid(amgdd_data); HYPRE_Int num_levels = hypre_ParAMGDataNumLevels(amg_data); HYPRE_Int start_level = hypre_ParAMGDDDataStartLevel(amgdd_data); hypre_CSRMatrix *owned_offd; hypre_CSRMatrix *nonowned_diag; HYPRE_Int i, level; HYPRE_Int local_index; for (level = start_level; level < num_levels - 1; level++) { // Setup owned offd col indices owned_offd = hypre_AMGDDCompGridMatrixOwnedOffd(hypre_AMGDDCompGridP(compGrid[level])); for (i = 0; i < hypre_CSRMatrixI(owned_offd)[hypre_AMGDDCompGridNumOwnedNodes(compGrid[level])]; i++) { local_index = hypre_AMGDDCompGridLocalIndexBinarySearch(compGrid[level + 1], hypre_CSRMatrixJ(owned_offd)[i]); if (local_index == -1) { hypre_CSRMatrixJ(owned_offd)[i] = -(hypre_CSRMatrixJ(owned_offd)[i] + 1); } else { hypre_CSRMatrixJ(owned_offd)[i] = local_index; } } // Setup nonowned diag col indices nonowned_diag = hypre_AMGDDCompGridMatrixNonOwnedDiag(hypre_AMGDDCompGridP(compGrid[level])); for (i = 0; i < hypre_CSRMatrixI(nonowned_diag)[hypre_AMGDDCompGridNumNonOwnedNodes(compGrid[level])]; i++) { local_index = hypre_AMGDDCompGridLocalIndexBinarySearch(compGrid[level + 1], hypre_CSRMatrixJ(nonowned_diag)[i]); if (local_index == -1) { hypre_CSRMatrixJ(nonowned_diag)[i] = -(hypre_CSRMatrixJ(nonowned_diag)[i] + 1); } else { hypre_CSRMatrixJ(nonowned_diag)[i] = local_index; } } } if (hypre_ParAMGDataRestriction(amg_data)) { for (level = start_level; level < num_levels - 1; level++) { // Setup owned offd col indices owned_offd = hypre_AMGDDCompGridMatrixOwnedOffd(hypre_AMGDDCompGridR(compGrid[level])); for (i = 0; i < hypre_CSRMatrixI(owned_offd)[hypre_AMGDDCompGridNumOwnedNodes(compGrid[level + 1])]; i++) { local_index = hypre_AMGDDCompGridLocalIndexBinarySearch(compGrid[level], hypre_CSRMatrixJ(owned_offd)[i]); if (local_index == -1) { hypre_CSRMatrixJ(owned_offd)[i] = -(hypre_CSRMatrixJ(owned_offd)[i] + 1); } else { hypre_CSRMatrixJ(owned_offd)[i] = local_index; } } // Setup nonowned diag col indices nonowned_diag = hypre_AMGDDCompGridMatrixNonOwnedDiag(hypre_AMGDDCompGridR(compGrid[level])); for (i = 0; i < hypre_CSRMatrixI(nonowned_diag)[hypre_AMGDDCompGridNumNonOwnedNodes(compGrid[level + 1])]; i++) { local_index = hypre_AMGDDCompGridLocalIndexBinarySearch(compGrid[level], hypre_CSRMatrixJ(nonowned_diag)[i]); if (local_index == -1) { hypre_CSRMatrixJ(nonowned_diag)[i] = -(hypre_CSRMatrixJ(nonowned_diag)[i] + 1); } else { hypre_CSRMatrixJ(nonowned_diag)[i] = local_index; } } } } return hypre_error_flag; } hypre_AMGDDCommPkg* hypre_AMGDDCommPkgCreate(HYPRE_Int num_levels) { hypre_AMGDDCommPkg *amgddCommPkg; amgddCommPkg = hypre_CTAlloc(hypre_AMGDDCommPkg, 1, HYPRE_MEMORY_HOST); hypre_AMGDDCommPkgNumLevels(amgddCommPkg) = num_levels; hypre_AMGDDCommPkgNumSendProcs(amgddCommPkg) = hypre_CTAlloc(HYPRE_Int, num_levels, HYPRE_MEMORY_HOST); hypre_AMGDDCommPkgNumRecvProcs(amgddCommPkg) = hypre_CTAlloc(HYPRE_Int, num_levels, HYPRE_MEMORY_HOST); hypre_AMGDDCommPkgSendProcs(amgddCommPkg) = hypre_CTAlloc(HYPRE_Int *, num_levels, HYPRE_MEMORY_HOST); hypre_AMGDDCommPkgRecvProcs(amgddCommPkg) = hypre_CTAlloc(HYPRE_Int *, num_levels, HYPRE_MEMORY_HOST); hypre_AMGDDCommPkgSendBufferSize(amgddCommPkg) = hypre_CTAlloc(HYPRE_Int *, num_levels, HYPRE_MEMORY_HOST); hypre_AMGDDCommPkgRecvBufferSize(amgddCommPkg) = hypre_CTAlloc(HYPRE_Int *, num_levels, HYPRE_MEMORY_HOST); hypre_AMGDDCommPkgNumSendNodes(amgddCommPkg) = hypre_CTAlloc(HYPRE_Int **, num_levels, HYPRE_MEMORY_HOST); hypre_AMGDDCommPkgNumRecvNodes(amgddCommPkg) = hypre_CTAlloc(HYPRE_Int **, num_levels, HYPRE_MEMORY_HOST); hypre_AMGDDCommPkgSendFlag(amgddCommPkg) = hypre_CTAlloc(HYPRE_Int ***, num_levels, HYPRE_MEMORY_HOST); hypre_AMGDDCommPkgRecvMap(amgddCommPkg) = hypre_CTAlloc(HYPRE_Int ***, num_levels, HYPRE_MEMORY_HOST); hypre_AMGDDCommPkgRecvRedMarker(amgddCommPkg) = hypre_CTAlloc(HYPRE_Int ***, num_levels, HYPRE_MEMORY_HOST); return amgddCommPkg; } HYPRE_Int hypre_AMGDDCommPkgSendLevelDestroy( hypre_AMGDDCommPkg *amgddCommPkg, HYPRE_Int level, HYPRE_Int proc ) { HYPRE_Int k; if (hypre_AMGDDCommPkgSendFlag(amgddCommPkg)) { for (k = 0; k < hypre_AMGDDCommPkgNumLevels(amgddCommPkg); k++) { if (hypre_AMGDDCommPkgSendFlag(amgddCommPkg)[level][proc][k]) { hypre_TFree(hypre_AMGDDCommPkgSendFlag(amgddCommPkg)[level][proc][k], HYPRE_MEMORY_HOST); } } hypre_TFree( hypre_AMGDDCommPkgSendFlag(amgddCommPkg)[level][proc], HYPRE_MEMORY_HOST ); } if (hypre_AMGDDCommPkgNumSendNodes(amgddCommPkg)) { hypre_TFree(hypre_AMGDDCommPkgNumSendNodes(amgddCommPkg)[level][proc], HYPRE_MEMORY_HOST); } return hypre_error_flag; } HYPRE_Int hypre_AMGDDCommPkgRecvLevelDestroy( hypre_AMGDDCommPkg *amgddCommPkg, HYPRE_Int level, HYPRE_Int proc ) { HYPRE_Int k; if (hypre_AMGDDCommPkgRecvMap(amgddCommPkg)) { for (k = 0; k < hypre_AMGDDCommPkgNumLevels(amgddCommPkg); k++) { if (hypre_AMGDDCommPkgRecvMap(amgddCommPkg)[level][proc][k]) { hypre_TFree(hypre_AMGDDCommPkgRecvMap(amgddCommPkg)[level][proc][k], HYPRE_MEMORY_HOST); } } hypre_TFree(hypre_AMGDDCommPkgRecvMap(amgddCommPkg)[level][proc], HYPRE_MEMORY_HOST); } if (hypre_AMGDDCommPkgRecvRedMarker(amgddCommPkg)) { for (k = 0; k < hypre_AMGDDCommPkgNumLevels(amgddCommPkg); k++) { if (hypre_AMGDDCommPkgRecvRedMarker(amgddCommPkg)[level][proc][k]) { hypre_TFree(hypre_AMGDDCommPkgRecvRedMarker(amgddCommPkg)[level][proc][k], HYPRE_MEMORY_HOST); } } hypre_TFree(hypre_AMGDDCommPkgRecvRedMarker(amgddCommPkg)[level][proc], HYPRE_MEMORY_HOST); } if (hypre_AMGDDCommPkgNumRecvNodes(amgddCommPkg)) { hypre_TFree(hypre_AMGDDCommPkgNumRecvNodes(amgddCommPkg)[level][proc], HYPRE_MEMORY_HOST); } return hypre_error_flag; } HYPRE_Int hypre_AMGDDCommPkgDestroy ( hypre_AMGDDCommPkg *amgddCommPkg ) { HYPRE_Int i, j, k; if ( hypre_AMGDDCommPkgSendProcs(amgddCommPkg) ) { for (i = 0; i < hypre_AMGDDCommPkgNumLevels(amgddCommPkg); i++) { hypre_TFree(hypre_AMGDDCommPkgSendProcs(amgddCommPkg)[i], HYPRE_MEMORY_HOST); } hypre_TFree(hypre_AMGDDCommPkgSendProcs(amgddCommPkg), HYPRE_MEMORY_HOST); } if ( hypre_AMGDDCommPkgRecvProcs(amgddCommPkg) ) { for (i = 0; i < hypre_AMGDDCommPkgNumLevels(amgddCommPkg); i++) { hypre_TFree(hypre_AMGDDCommPkgRecvProcs(amgddCommPkg)[i], HYPRE_MEMORY_HOST); } hypre_TFree(hypre_AMGDDCommPkgRecvProcs(amgddCommPkg), HYPRE_MEMORY_HOST); } if ( hypre_AMGDDCommPkgSendBufferSize(amgddCommPkg) ) { for (i = 0; i < hypre_AMGDDCommPkgNumLevels(amgddCommPkg); i++) { hypre_TFree(hypre_AMGDDCommPkgSendBufferSize(amgddCommPkg)[i], HYPRE_MEMORY_HOST); } hypre_TFree(hypre_AMGDDCommPkgSendBufferSize(amgddCommPkg), HYPRE_MEMORY_HOST); } if ( hypre_AMGDDCommPkgRecvBufferSize(amgddCommPkg) ) { for (i = 0; i < hypre_AMGDDCommPkgNumLevels(amgddCommPkg); i++) { hypre_TFree(hypre_AMGDDCommPkgRecvBufferSize(amgddCommPkg)[i], HYPRE_MEMORY_HOST); } hypre_TFree(hypre_AMGDDCommPkgRecvBufferSize(amgddCommPkg), HYPRE_MEMORY_HOST); } if ( hypre_AMGDDCommPkgSendFlag(amgddCommPkg) ) { for (i = 0; i < hypre_AMGDDCommPkgNumLevels(amgddCommPkg); i++) { for (j = 0; j < hypre_AMGDDCommPkgNumSendProcs(amgddCommPkg)[i]; j++) { for (k = 0; k < hypre_AMGDDCommPkgNumLevels(amgddCommPkg); k++) { if (hypre_AMGDDCommPkgSendFlag(amgddCommPkg)[i][j][k]) { hypre_TFree(hypre_AMGDDCommPkgSendFlag(amgddCommPkg)[i][j][k], HYPRE_MEMORY_HOST); } } hypre_TFree(hypre_AMGDDCommPkgSendFlag(amgddCommPkg)[i][j], HYPRE_MEMORY_HOST); } hypre_TFree(hypre_AMGDDCommPkgSendFlag(amgddCommPkg)[i], HYPRE_MEMORY_HOST); } hypre_TFree(hypre_AMGDDCommPkgSendFlag(amgddCommPkg), HYPRE_MEMORY_HOST); } if ( hypre_AMGDDCommPkgRecvMap(amgddCommPkg) ) { for (i = 0; i < hypre_AMGDDCommPkgNumLevels(amgddCommPkg); i++) { for (j = 0; j < hypre_AMGDDCommPkgNumRecvProcs(amgddCommPkg)[i]; j++) { for (k = 0; k < hypre_AMGDDCommPkgNumLevels(amgddCommPkg); k++) { if (hypre_AMGDDCommPkgRecvMap(amgddCommPkg)[i][j][k]) { hypre_TFree(hypre_AMGDDCommPkgRecvMap(amgddCommPkg)[i][j][k], HYPRE_MEMORY_HOST); } } hypre_TFree(hypre_AMGDDCommPkgRecvMap(amgddCommPkg)[i][j], HYPRE_MEMORY_HOST); } hypre_TFree(hypre_AMGDDCommPkgRecvMap(amgddCommPkg)[i], HYPRE_MEMORY_HOST); } hypre_TFree(hypre_AMGDDCommPkgRecvMap(amgddCommPkg), HYPRE_MEMORY_HOST); } if ( hypre_AMGDDCommPkgRecvRedMarker(amgddCommPkg) ) { for (i = 0; i < hypre_AMGDDCommPkgNumLevels(amgddCommPkg); i++) { for (j = 0; j < hypre_AMGDDCommPkgNumRecvProcs(amgddCommPkg)[i]; j++) { for (k = 0; k < hypre_AMGDDCommPkgNumLevels(amgddCommPkg); k++) { if (hypre_AMGDDCommPkgRecvRedMarker(amgddCommPkg)[i][j][k]) { hypre_TFree(hypre_AMGDDCommPkgRecvRedMarker(amgddCommPkg)[i][j][k], HYPRE_MEMORY_HOST); } } hypre_TFree(hypre_AMGDDCommPkgRecvRedMarker(amgddCommPkg)[i][j], HYPRE_MEMORY_HOST); } hypre_TFree(hypre_AMGDDCommPkgRecvRedMarker(amgddCommPkg)[i], HYPRE_MEMORY_HOST); } hypre_TFree(hypre_AMGDDCommPkgRecvRedMarker(amgddCommPkg), HYPRE_MEMORY_HOST); } if ( hypre_AMGDDCommPkgNumSendNodes(amgddCommPkg) ) { for (i = 0; i < hypre_AMGDDCommPkgNumLevels(amgddCommPkg); i++) { for (j = 0; j < hypre_AMGDDCommPkgNumSendProcs(amgddCommPkg)[i]; j++) { hypre_TFree(hypre_AMGDDCommPkgNumSendNodes(amgddCommPkg)[i][j], HYPRE_MEMORY_HOST); } hypre_TFree(hypre_AMGDDCommPkgNumSendNodes(amgddCommPkg)[i], HYPRE_MEMORY_HOST); } hypre_TFree(hypre_AMGDDCommPkgNumSendNodes(amgddCommPkg), HYPRE_MEMORY_HOST); } if ( hypre_AMGDDCommPkgNumRecvNodes(amgddCommPkg) ) { for (i = 0; i < hypre_AMGDDCommPkgNumLevels(amgddCommPkg); i++) { for (j = 0; j < hypre_AMGDDCommPkgNumRecvProcs(amgddCommPkg)[i]; j++) { hypre_TFree(hypre_AMGDDCommPkgNumRecvNodes(amgddCommPkg)[i][j], HYPRE_MEMORY_HOST); } hypre_TFree(hypre_AMGDDCommPkgNumRecvNodes(amgddCommPkg)[i], HYPRE_MEMORY_HOST); } hypre_TFree(hypre_AMGDDCommPkgNumRecvNodes(amgddCommPkg), HYPRE_MEMORY_HOST); } if ( hypre_AMGDDCommPkgNumSendProcs(amgddCommPkg) ) { hypre_TFree(hypre_AMGDDCommPkgNumSendProcs(amgddCommPkg), HYPRE_MEMORY_HOST); } if ( hypre_AMGDDCommPkgNumRecvProcs(amgddCommPkg) ) { hypre_TFree(hypre_AMGDDCommPkgNumRecvProcs(amgddCommPkg), HYPRE_MEMORY_HOST); } hypre_TFree(amgddCommPkg, HYPRE_MEMORY_HOST); return hypre_error_flag; } hypre-2.33.0/src/parcsr_ls/par_amgdd_comp_grid.h000066400000000000000000000237571477326011500216430ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #ifndef hypre_PAR_AMGDD_COMP_GRID_HEADER #define hypre_PAR_AMGDD_COMP_GRID_HEADER /*-------------------------------------------------------------------------- * hypre_AMGDDCommPkg *--------------------------------------------------------------------------*/ typedef struct { // Info needed for subsequent psi_c residual communication HYPRE_Int num_levels; // levels in the amg hierarchy HYPRE_Int *num_send_procs; // number of send procs to communicate with HYPRE_Int *num_recv_procs; // number of recv procs to communicate with HYPRE_Int **send_procs; // list of send procs HYPRE_Int **recv_procs; // list of recv procs HYPRE_Int **send_buffer_size; // size of send buffer on each level for each proc HYPRE_Int **recv_buffer_size; // size of recv buffer on each level for each proc HYPRE_Int ***num_send_nodes; // number of nodes to send on each composite level HYPRE_Int ***num_recv_nodes; // number of nodes to recv on each composite level HYPRE_Int ****send_flag; // flags which nodes to send after composite grid is built HYPRE_Int ****recv_map; // mapping from recv buffer to appropriate local indices on each comp grid HYPRE_Int ****recv_red_marker; // marker indicating a redundant recv } hypre_AMGDDCommPkg; /*-------------------------------------------------------------------------- * Accessor functions for the Comp Grid Comm Pkg structure *--------------------------------------------------------------------------*/ #define hypre_AMGDDCommPkgNumLevels(compGridCommPkg) ((compGridCommPkg) -> num_levels) #define hypre_AMGDDCommPkgNumSendProcs(compGridCommPkg) ((compGridCommPkg) -> num_send_procs) #define hypre_AMGDDCommPkgNumRecvProcs(compGridCommPkg) ((compGridCommPkg) -> num_recv_procs) #define hypre_AMGDDCommPkgSendProcs(compGridCommPkg) ((compGridCommPkg) -> send_procs) #define hypre_AMGDDCommPkgRecvProcs(compGridCommPkg) ((compGridCommPkg) -> recv_procs) #define hypre_AMGDDCommPkgSendBufferSize(compGridCommPkg) ((compGridCommPkg) -> send_buffer_size) #define hypre_AMGDDCommPkgRecvBufferSize(compGridCommPkg) ((compGridCommPkg) -> recv_buffer_size) #define hypre_AMGDDCommPkgNumSendNodes(compGridCommPkg) ((compGridCommPkg) -> num_send_nodes) #define hypre_AMGDDCommPkgNumRecvNodes(compGridCommPkg) ((compGridCommPkg) -> num_recv_nodes) #define hypre_AMGDDCommPkgSendFlag(compGridCommPkg) ((compGridCommPkg) -> send_flag) #define hypre_AMGDDCommPkgRecvMap(compGridCommPkg) ((compGridCommPkg) -> recv_map) #define hypre_AMGDDCommPkgRecvRedMarker(compGridCommPkg) ((compGridCommPkg) -> recv_red_marker) /*-------------------------------------------------------------------------- * AMGDDCompGridMatrix (basically a coupled collection of CSR matrices) *--------------------------------------------------------------------------*/ typedef struct { hypre_CSRMatrix *owned_diag; // Domain: owned domain of mat. Range: owned range of mat. hypre_CSRMatrix *owned_offd; // Domain: nonowned domain of mat. Range: owned range of mat. hypre_CSRMatrix *nonowned_diag; // Domain: nonowned domain of mat. Range: nonowned range of mat. hypre_CSRMatrix *nonowned_offd; // Domain: owned domain of mat. Range: nonowned range of mat. hypre_CSRMatrix *real_real; // Domain: nonowned real. Range: nonowned real. hypre_CSRMatrix *real_ghost; // Domain: nonowned ghost. Range: nonowned real. HYPRE_Int owns_owned_matrices; HYPRE_Int owns_offd_col_indices; } hypre_AMGDDCompGridMatrix; /*-------------------------------------------------------------------------- * Accessor functions for the AMGDDCompGridMatrix structure *--------------------------------------------------------------------------*/ #define hypre_AMGDDCompGridMatrixOwnedDiag(matrix) ((matrix) -> owned_diag) #define hypre_AMGDDCompGridMatrixOwnedOffd(matrix) ((matrix) -> owned_offd) #define hypre_AMGDDCompGridMatrixNonOwnedDiag(matrix) ((matrix) -> nonowned_diag) #define hypre_AMGDDCompGridMatrixNonOwnedOffd(matrix) ((matrix) -> nonowned_offd) #define hypre_AMGDDCompGridMatrixRealReal(matrix) ((matrix) -> real_real) #define hypre_AMGDDCompGridMatrixRealGhost(matrix) ((matrix) -> real_ghost) #define hypre_AMGDDCompGridMatrixOwnsOwnedMatrices(matrix) ((matrix) -> owns_owned_matrices) #define hypre_AMGDDCompGridMatrixOwnsOffdColIndices(matrix) ((matrix) -> owns_offd_col_indices) /*-------------------------------------------------------------------------- * AMGDDCompGridVector *--------------------------------------------------------------------------*/ typedef struct { hypre_Vector *owned_vector; // Original on-processor points (should be ordered) hypre_Vector *nonowned_vector; // Off-processor points (not ordered) HYPRE_Int num_real; HYPRE_Int owns_owned_vector; } hypre_AMGDDCompGridVector; /*-------------------------------------------------------------------------- * Accessor functions for the AMGDDCompGridVector structure *--------------------------------------------------------------------------*/ #define hypre_AMGDDCompGridVectorOwned(matrix) ((matrix) -> owned_vector) #define hypre_AMGDDCompGridVectorNonOwned(matrix) ((matrix) -> nonowned_vector) #define hypre_AMGDDCompGridVectorNumReal(vector) ((vector) -> num_real) #define hypre_AMGDDCompGridVectorOwnsOwnedVector(matrix) ((matrix) -> owns_owned_vector) /*-------------------------------------------------------------------------- * hypre_AMGDDCompGrid *--------------------------------------------------------------------------*/ typedef struct { HYPRE_Int level; HYPRE_MemoryLocation memory_location; /* memory location of matrices/vectors */ HYPRE_BigInt first_global_index; HYPRE_BigInt last_global_index; HYPRE_Int num_owned_nodes; HYPRE_Int num_nonowned_nodes; HYPRE_Int num_nonowned_real_nodes; HYPRE_Int num_missing_col_indices; HYPRE_Int *nonowned_global_indices; HYPRE_Int *nonowned_coarse_indices; HYPRE_Int *nonowned_real_marker; HYPRE_Int *nonowned_sort; HYPRE_Int *nonowned_invsort; HYPRE_Int *nonowned_diag_missing_col_indices; HYPRE_Int *owned_coarse_indices; hypre_AMGDDCompGridMatrix *A; hypre_AMGDDCompGridMatrix *P; hypre_AMGDDCompGridMatrix *R; hypre_AMGDDCompGridVector *u; hypre_AMGDDCompGridVector *f; hypre_AMGDDCompGridVector *t; hypre_AMGDDCompGridVector *s; hypre_AMGDDCompGridVector *q; hypre_AMGDDCompGridVector *temp; hypre_AMGDDCompGridVector *temp2; hypre_AMGDDCompGridVector *temp3; HYPRE_Real *l1_norms; HYPRE_Int *cf_marker_array; HYPRE_Int *owned_relax_ordering; HYPRE_Int *nonowned_relax_ordering; } hypre_AMGDDCompGrid; /*-------------------------------------------------------------------------- * Accessor functions for the Comp Grid structure *--------------------------------------------------------------------------*/ #define hypre_AMGDDCompGridLevel(compGrid) ((compGrid) -> level) #define hypre_AMGDDCompGridMemoryLocation(compGrid) ((compGrid) -> memory_location) #define hypre_AMGDDCompGridFirstGlobalIndex(compGrid) ((compGrid) -> first_global_index) #define hypre_AMGDDCompGridLastGlobalIndex(compGrid) ((compGrid) -> last_global_index) #define hypre_AMGDDCompGridNumOwnedNodes(compGrid) ((compGrid) -> num_owned_nodes) #define hypre_AMGDDCompGridNumNonOwnedNodes(compGrid) ((compGrid) -> num_nonowned_nodes) #define hypre_AMGDDCompGridNumNonOwnedRealNodes(compGrid) ((compGrid) -> num_nonowned_real_nodes) #define hypre_AMGDDCompGridNumMissingColIndices(compGrid) ((compGrid) -> num_missing_col_indices) #define hypre_AMGDDCompGridNonOwnedGlobalIndices(compGrid) ((compGrid) -> nonowned_global_indices) #define hypre_AMGDDCompGridNonOwnedCoarseIndices(compGrid) ((compGrid) -> nonowned_coarse_indices) #define hypre_AMGDDCompGridNonOwnedRealMarker(compGrid) ((compGrid) -> nonowned_real_marker) #define hypre_AMGDDCompGridNonOwnedSort(compGrid) ((compGrid) -> nonowned_sort) #define hypre_AMGDDCompGridNonOwnedInvSort(compGrid) ((compGrid) -> nonowned_invsort) #define hypre_AMGDDCompGridOwnedCoarseIndices(compGrid) ((compGrid) -> owned_coarse_indices) #define hypre_AMGDDCompGridNonOwnedDiagMissingColIndices(compGrid) ((compGrid) -> nonowned_diag_missing_col_indices) #define hypre_AMGDDCompGridA(compGrid) ((compGrid) -> A) #define hypre_AMGDDCompGridP(compGrid) ((compGrid) -> P) #define hypre_AMGDDCompGridR(compGrid) ((compGrid) -> R) #define hypre_AMGDDCompGridU(compGrid) ((compGrid) -> u) #define hypre_AMGDDCompGridF(compGrid) ((compGrid) -> f) #define hypre_AMGDDCompGridT(compGrid) ((compGrid) -> t) #define hypre_AMGDDCompGridS(compGrid) ((compGrid) -> s) #define hypre_AMGDDCompGridQ(compGrid) ((compGrid) -> q) #define hypre_AMGDDCompGridTemp(compGrid) ((compGrid) -> temp) #define hypre_AMGDDCompGridTemp2(compGrid) ((compGrid) -> temp2) #define hypre_AMGDDCompGridTemp3(compGrid) ((compGrid) -> temp3) #define hypre_AMGDDCompGridL1Norms(compGrid) ((compGrid) -> l1_norms) #define hypre_AMGDDCompGridCFMarkerArray(compGrid) ((compGrid) -> cf_marker_array) #define hypre_AMGDDCompGridOwnedRelaxOrdering(compGrid) ((compGrid) -> owned_relax_ordering) #define hypre_AMGDDCompGridNonOwnedRelaxOrdering(compGrid) ((compGrid) -> nonowned_relax_ordering) #endif hypre-2.33.0/src/parcsr_ls/par_amgdd_fac_cycle.c000066400000000000000000000736501477326011500216000ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "_hypre_parcsr_ls.h" HYPRE_Int hypre_BoomerAMGDD_FAC( void *amgdd_vdata, HYPRE_Int first_iteration ) { hypre_ParAMGDDData *amgdd_data = (hypre_ParAMGDDData*) amgdd_vdata; HYPRE_Int cycle_type = hypre_ParAMGDDDataFACCycleType(amgdd_data); HYPRE_Int start_level = hypre_ParAMGDDDataStartLevel(amgdd_data); if (cycle_type == 1 || cycle_type == 2) { hypre_BoomerAMGDD_FAC_Cycle(amgdd_vdata, start_level, cycle_type, first_iteration); } else if (cycle_type == 3) { hypre_BoomerAMGDD_FAC_FCycle(amgdd_vdata, first_iteration); } else { hypre_error_w_msg(HYPRE_ERROR_GENERIC, "WARNING: unknown AMG-DD FAC cycle type. Defaulting to 1 (V-cycle).\n"); hypre_ParAMGDDDataFACCycleType(amgdd_data) = 1; hypre_BoomerAMGDD_FAC_Cycle(amgdd_vdata, start_level, 1, first_iteration); } return hypre_error_flag; } HYPRE_Int hypre_BoomerAMGDD_FAC_Cycle( void *amgdd_vdata, HYPRE_Int level, HYPRE_Int cycle_type, HYPRE_Int first_iteration ) { hypre_ParAMGDDData *amgdd_data = (hypre_ParAMGDDData*) amgdd_vdata; hypre_ParAMGData *amg_data = hypre_ParAMGDDDataAMG(amgdd_data); hypre_AMGDDCompGrid **compGrid = hypre_ParAMGDDDataCompGrid(amgdd_data); HYPRE_Int num_levels = hypre_ParAMGDataNumLevels(amg_data); HYPRE_Int i; // Relax on the real nodes hypre_BoomerAMGDD_FAC_Relax(amgdd_vdata, level, 1); // Restrict the residual at all fine points (real and ghost) and set residual at coarse points not under the fine grid if (num_levels > 1) { hypre_BoomerAMGDD_FAC_Restrict(compGrid[level], compGrid[level + 1], first_iteration); hypre_AMGDDCompGridVectorSetConstantValues(hypre_AMGDDCompGridS(compGrid[level]), 0.0); hypre_AMGDDCompGridVectorSetConstantValues(hypre_AMGDDCompGridT(compGrid[level]), 0.0); // Either solve on the coarse level or recurse if (level + 1 == num_levels - 1) { hypre_BoomerAMGDD_FAC_Relax(amgdd_vdata, num_levels - 1, 3); } else for (i = 0; i < cycle_type; i++) { hypre_BoomerAMGDD_FAC_Cycle(amgdd_vdata, level + 1, cycle_type, first_iteration); first_iteration = 0; } // Interpolate up and relax hypre_BoomerAMGDD_FAC_Interpolate(compGrid[level], compGrid[level + 1]); } hypre_BoomerAMGDD_FAC_Relax(amgdd_vdata, level, 2); return hypre_error_flag; } HYPRE_Int hypre_BoomerAMGDD_FAC_FCycle( void *amgdd_vdata, HYPRE_Int first_iteration ) { hypre_ParAMGDDData *amgdd_data = (hypre_ParAMGDDData*) amgdd_vdata; hypre_ParAMGData *amg_data = hypre_ParAMGDDDataAMG(amgdd_data); hypre_AMGDDCompGrid **compGrid = hypre_ParAMGDDDataCompGrid(amgdd_data); HYPRE_Int num_levels = hypre_ParAMGDataNumLevels(amg_data); HYPRE_Int level; // ... work down to coarsest ... if (!first_iteration) { for (level = hypre_ParAMGDDDataStartLevel(amgdd_data); level < num_levels - 1; level++) { hypre_BoomerAMGDD_FAC_Restrict(compGrid[level], compGrid[level + 1], 0); hypre_AMGDDCompGridVectorSetConstantValues(hypre_AMGDDCompGridS(compGrid[level]), 0.0); hypre_AMGDDCompGridVectorSetConstantValues(hypre_AMGDDCompGridT(compGrid[level]), 0.0); } } // ... solve on coarsest level ... hypre_BoomerAMGDD_FAC_Relax(amgdd_vdata, num_levels - 1, 3); // ... and work back up to the finest for (level = num_levels - 2; level > -1; level--) { // Interpolate up and relax hypre_BoomerAMGDD_FAC_Interpolate(compGrid[level], compGrid[level + 1]); // V-cycle hypre_BoomerAMGDD_FAC_Cycle(amgdd_vdata, level, 1, 0); } return hypre_error_flag; } HYPRE_Int hypre_BoomerAMGDD_FAC_Interpolate( hypre_AMGDDCompGrid *compGrid_f, hypre_AMGDDCompGrid *compGrid_c ) { hypre_AMGDDCompGridMatvec(1.0, hypre_AMGDDCompGridP(compGrid_f), hypre_AMGDDCompGridU(compGrid_c), 1.0, hypre_AMGDDCompGridU(compGrid_f)); return hypre_error_flag; } HYPRE_Int hypre_BoomerAMGDD_FAC_Restrict( hypre_AMGDDCompGrid *compGrid_f, hypre_AMGDDCompGrid *compGrid_c, HYPRE_Int first_iteration ) { // Recalculate residual on coarse grid if (!first_iteration) { hypre_AMGDDCompGridMatvec(-1.0, hypre_AMGDDCompGridA(compGrid_c), hypre_AMGDDCompGridU(compGrid_c), 1.0, hypre_AMGDDCompGridF(compGrid_c)); } // Get update: s_l <- A_lt_l + s_l hypre_AMGDDCompGridMatvec(1.0, hypre_AMGDDCompGridA(compGrid_f), hypre_AMGDDCompGridT(compGrid_f), 1.0, hypre_AMGDDCompGridS(compGrid_f)); // If we need to preserve the updates on the next level if (hypre_AMGDDCompGridS(compGrid_c)) { hypre_AMGDDCompGridMatvec(1.0, hypre_AMGDDCompGridR(compGrid_f), hypre_AMGDDCompGridS(compGrid_f), 0.0, hypre_AMGDDCompGridS(compGrid_c)); // Subtract restricted update from recalculated residual: f_{l+1} <- f_{l+1} - s_{l+1} hypre_AMGDDCompGridVectorAxpy(-1.0, hypre_AMGDDCompGridS(compGrid_c), hypre_AMGDDCompGridF(compGrid_c)); } else { // Restrict and subtract update from recalculated residual: f_{l+1} <- f_{l+1} - P_l^Ts_l hypre_AMGDDCompGridMatvec(-1.0, hypre_AMGDDCompGridR(compGrid_f), hypre_AMGDDCompGridS(compGrid_f), 1.0, hypre_AMGDDCompGridF(compGrid_c)); } // Zero out initial guess on coarse grid hypre_AMGDDCompGridVectorSetConstantValues(hypre_AMGDDCompGridU(compGrid_c), 0.0); return hypre_error_flag; } HYPRE_Int hypre_BoomerAMGDD_FAC_Relax( void *amgdd_vdata, HYPRE_Int level, HYPRE_Int cycle_param ) { hypre_ParAMGDDData *amgdd_data = (hypre_ParAMGDDData*) amgdd_vdata; hypre_AMGDDCompGrid *compGrid = hypre_ParAMGDDDataCompGrid(amgdd_data)[level]; HYPRE_Int numRelax = hypre_ParAMGDDDataFACNumRelax(amgdd_data); HYPRE_Int i; if (hypre_AMGDDCompGridT(compGrid) || hypre_AMGDDCompGridQ(compGrid)) { hypre_AMGDDCompGridVectorCopy(hypre_AMGDDCompGridU(compGrid), hypre_AMGDDCompGridTemp(compGrid)); hypre_AMGDDCompGridVectorScale(-1.0, hypre_AMGDDCompGridTemp(compGrid)); } for (i = 0; i < numRelax; i++) { (*hypre_ParAMGDDDataUserFACRelaxation(amgdd_data))(amgdd_vdata, level, cycle_param); } if (hypre_AMGDDCompGridT(compGrid) || hypre_AMGDDCompGridQ(compGrid)) { hypre_AMGDDCompGridVectorAxpy(1.0, hypre_AMGDDCompGridU(compGrid), hypre_AMGDDCompGridTemp(compGrid)); if (hypre_AMGDDCompGridT(compGrid)) { hypre_AMGDDCompGridVectorAxpy(1.0, hypre_AMGDDCompGridTemp(compGrid), hypre_AMGDDCompGridT(compGrid)); } if (hypre_AMGDDCompGridQ(compGrid)) { hypre_AMGDDCompGridVectorAxpy(1.0, hypre_AMGDDCompGridTemp(compGrid), hypre_AMGDDCompGridQ(compGrid)); } } return hypre_error_flag; } HYPRE_Int hypre_BoomerAMGDD_FAC_Jacobi( void *amgdd_vdata, HYPRE_Int level, HYPRE_Int cycle_param ) { HYPRE_UNUSED_VAR(cycle_param); #if defined(HYPRE_USING_GPU) hypre_ParAMGDDData *amgdd_data = (hypre_ParAMGDDData*) amgdd_vdata; hypre_AMGDDCompGrid *compGrid = hypre_ParAMGDDDataCompGrid(amgdd_data)[level]; HYPRE_MemoryLocation memory_location = hypre_AMGDDCompGridMemoryLocation(compGrid); HYPRE_ExecutionPolicy exec = hypre_GetExecPolicy1(memory_location); if (exec == HYPRE_EXEC_DEVICE) { hypre_BoomerAMGDD_FAC_JacobiDevice(amgdd_vdata, level); } else #endif { hypre_BoomerAMGDD_FAC_JacobiHost(amgdd_vdata, level); } return hypre_error_flag; } HYPRE_Int hypre_BoomerAMGDD_FAC_JacobiHost( void *amgdd_vdata, HYPRE_Int level ) { hypre_ParAMGDDData *amgdd_data = (hypre_ParAMGDDData*) amgdd_vdata; hypre_AMGDDCompGrid *compGrid = hypre_ParAMGDDDataCompGrid(amgdd_data)[level]; HYPRE_Real relax_weight = hypre_ParAMGDDDataFACRelaxWeight(amgdd_data); HYPRE_MemoryLocation memory_location = hypre_AMGDDCompGridMemoryLocation(compGrid); hypre_AMGDDCompGridMatrix *A = hypre_AMGDDCompGridA(compGrid); hypre_AMGDDCompGridVector *f = hypre_AMGDDCompGridF(compGrid); hypre_AMGDDCompGridVector *u = hypre_AMGDDCompGridU(compGrid); hypre_CSRMatrix *diag; HYPRE_Int total_real_nodes; HYPRE_Int i, j; // Calculate l1_norms if necessary (right now, I'm just using this vector for the diagonal of A and doing straight ahead Jacobi) if (!hypre_AMGDDCompGridL1Norms(compGrid)) { total_real_nodes = hypre_AMGDDCompGridNumOwnedNodes(compGrid) + hypre_AMGDDCompGridNumNonOwnedRealNodes(compGrid); hypre_AMGDDCompGridL1Norms(compGrid) = hypre_CTAlloc(HYPRE_Real, total_real_nodes, memory_location); diag = hypre_AMGDDCompGridMatrixOwnedDiag(A); for (i = 0; i < hypre_AMGDDCompGridNumOwnedNodes(compGrid); i++) { for (j = hypre_CSRMatrixI(diag)[i]; j < hypre_CSRMatrixI(diag)[i + 1]; j++) { // hypre_AMGDDCompGridL1Norms(compGrid)[i] += hypre_abs(hypre_CSRMatrixData(diag)[j]); if (hypre_CSRMatrixJ(diag)[j] == i) { hypre_AMGDDCompGridL1Norms(compGrid)[i] = hypre_CSRMatrixData(diag)[j]; } } } diag = hypre_AMGDDCompGridMatrixNonOwnedDiag(A); for (i = 0; i < hypre_AMGDDCompGridNumNonOwnedRealNodes(compGrid); i++) { for (j = hypre_CSRMatrixI(diag)[i]; j < hypre_CSRMatrixI(diag)[i + 1]; j++) { // hypre_AMGDDCompGridL1Norms(compGrid)[i + hypre_AMGDDCompGridNumOwnedNodes(compGrid)] += hypre_abs(hypre_CSRMatrixData(diag)[j]); if (hypre_CSRMatrixJ(diag)[j] == i) { hypre_AMGDDCompGridL1Norms(compGrid)[i + hypre_AMGDDCompGridNumOwnedNodes( compGrid)] = hypre_CSRMatrixData(diag)[j]; } } } } // Allocate temporary vector if necessary if (!hypre_AMGDDCompGridTemp2(compGrid)) { hypre_AMGDDCompGridTemp2(compGrid) = hypre_AMGDDCompGridVectorCreate(); hypre_AMGDDCompGridVectorInitialize(hypre_AMGDDCompGridTemp2(compGrid), hypre_AMGDDCompGridNumOwnedNodes(compGrid), hypre_AMGDDCompGridNumNonOwnedNodes(compGrid), hypre_AMGDDCompGridNumNonOwnedRealNodes(compGrid)); } hypre_AMGDDCompGridVectorCopy(f, hypre_AMGDDCompGridTemp2(compGrid)); hypre_AMGDDCompGridMatvec(-relax_weight, A, u, relax_weight, hypre_AMGDDCompGridTemp2(compGrid)); for (i = 0; i < hypre_AMGDDCompGridNumOwnedNodes(compGrid); i++) { hypre_VectorData(hypre_AMGDDCompGridVectorOwned(u))[i] += hypre_VectorData(hypre_AMGDDCompGridVectorOwned(hypre_AMGDDCompGridTemp2(compGrid)))[i] / hypre_AMGDDCompGridL1Norms(compGrid)[i]; } for (i = 0; i < hypre_AMGDDCompGridNumNonOwnedRealNodes(compGrid); i++) { hypre_VectorData(hypre_AMGDDCompGridVectorNonOwned(u))[i] += hypre_VectorData(hypre_AMGDDCompGridVectorNonOwned(hypre_AMGDDCompGridTemp2(compGrid)))[i] / hypre_AMGDDCompGridL1Norms(compGrid)[i + hypre_AMGDDCompGridNumOwnedNodes(compGrid)]; } return hypre_error_flag; } HYPRE_Int hypre_BoomerAMGDD_FAC_GaussSeidel( void *amgdd_vdata, HYPRE_Int level, HYPRE_Int cycle_param ) { HYPRE_UNUSED_VAR(cycle_param); hypre_ParAMGDDData *amgdd_data = (hypre_ParAMGDDData*) amgdd_vdata; hypre_AMGDDCompGrid *compGrid = hypre_ParAMGDDDataCompGrid(amgdd_data)[level]; hypre_AMGDDCompGridMatrix *A = hypre_AMGDDCompGridA(compGrid); hypre_AMGDDCompGridVector *f = hypre_AMGDDCompGridF(compGrid); hypre_AMGDDCompGridVector *u = hypre_AMGDDCompGridU(compGrid); hypre_CSRMatrix *owned_diag = hypre_AMGDDCompGridMatrixOwnedDiag(A); hypre_CSRMatrix *owned_offd = hypre_AMGDDCompGridMatrixOwnedOffd(A); hypre_CSRMatrix *nonowned_diag = hypre_AMGDDCompGridMatrixNonOwnedDiag(A); hypre_CSRMatrix *nonowned_offd = hypre_AMGDDCompGridMatrixNonOwnedOffd(A); HYPRE_Complex *u_owned_data = hypre_VectorData(hypre_AMGDDCompGridVectorOwned(u)); HYPRE_Complex *u_nonowned_data = hypre_VectorData(hypre_AMGDDCompGridVectorNonOwned(u)); HYPRE_Complex *f_owned_data = hypre_VectorData(hypre_AMGDDCompGridVectorOwned(f)); HYPRE_Complex *f_nonowned_data = hypre_VectorData(hypre_AMGDDCompGridVectorNonOwned(f)); HYPRE_Int i, j; // loop variables HYPRE_Complex diagonal; // placeholder for the diagonal of A // Do Gauss-Seidel relaxation on the owned nodes for (i = 0; i < hypre_AMGDDCompGridNumOwnedNodes(compGrid); i++) { // Initialize u as RHS u_owned_data[i] = f_owned_data[i]; diagonal = 0.0; // Loop over diag entries for (j = hypre_CSRMatrixI(owned_diag)[i]; j < hypre_CSRMatrixI(owned_diag)[i + 1]; j++) { if (hypre_CSRMatrixJ(owned_diag)[j] == i) { diagonal = hypre_CSRMatrixData(owned_diag)[j]; } else { u_owned_data[i] -= hypre_CSRMatrixData(owned_diag)[j] * u_owned_data[ hypre_CSRMatrixJ( owned_diag)[j] ]; } } // Loop over offd entries for (j = hypre_CSRMatrixI(owned_offd)[i]; j < hypre_CSRMatrixI(owned_offd)[i + 1]; j++) { u_owned_data[i] -= hypre_CSRMatrixData(owned_offd)[j] * u_nonowned_data[ hypre_CSRMatrixJ( owned_offd)[j] ]; } // Divide by diagonal if (diagonal == 0.0) { hypre_error_w_msg(HYPRE_ERROR_GENERIC, "WARNING: Divide by zero diagonal in hypre_BoomerAMGDD_FAC_GaussSeidel().\n"); } u_owned_data[i] /= diagonal; } // Do Gauss-Seidel relaxation on the nonowned nodes for (i = 0; i < hypre_AMGDDCompGridNumNonOwnedRealNodes(compGrid); i++) { // Initialize u as RHS u_nonowned_data[i] = f_nonowned_data[i]; diagonal = 0.0; // Loop over diag entries for (j = hypre_CSRMatrixI(nonowned_diag)[i]; j < hypre_CSRMatrixI(nonowned_diag)[i + 1]; j++) { if (hypre_CSRMatrixJ(nonowned_diag)[j] == i) { diagonal = hypre_CSRMatrixData(nonowned_diag)[j]; } else { u_nonowned_data[i] -= hypre_CSRMatrixData(nonowned_diag)[j] * u_nonowned_data[ hypre_CSRMatrixJ( nonowned_diag)[j] ]; } } // Loop over offd entries for (j = hypre_CSRMatrixI(nonowned_offd)[i]; j < hypre_CSRMatrixI(nonowned_offd)[i + 1]; j++) { u_nonowned_data[i] -= hypre_CSRMatrixData(nonowned_offd)[j] * u_owned_data[ hypre_CSRMatrixJ( nonowned_offd)[j] ]; } // Divide by diagonal if (diagonal == 0.0) { hypre_error_w_msg(HYPRE_ERROR_GENERIC, "WARNING: Divide by zero diagonal in hypre_BoomerAMGDD_FAC_GaussSeidel().\n"); } u_nonowned_data[i] /= diagonal; } return hypre_error_flag; } HYPRE_Int hypre_BoomerAMGDD_FAC_OrderedGaussSeidel( void *amgdd_vdata, HYPRE_Int level, HYPRE_Int cycle_param ) { HYPRE_UNUSED_VAR(cycle_param); hypre_ParAMGDDData *amgdd_data = (hypre_ParAMGDDData*) amgdd_vdata; hypre_AMGDDCompGrid *compGrid = hypre_ParAMGDDDataCompGrid(amgdd_data)[level]; hypre_AMGDDCompGridMatrix *A = hypre_AMGDDCompGridA(compGrid); hypre_AMGDDCompGridVector *f = hypre_AMGDDCompGridF(compGrid); hypre_AMGDDCompGridVector *u = hypre_AMGDDCompGridU(compGrid); HYPRE_Int unordered_i, i, j; // loop variables HYPRE_Complex diagonal; // placeholder for the diagonal of A if (!hypre_AMGDDCompGridOwnedRelaxOrdering(compGrid)) { hypre_AMGDDCompGridOwnedRelaxOrdering(compGrid) = hypre_CTAlloc(HYPRE_Int, hypre_AMGDDCompGridNumOwnedNodes(compGrid), hypre_AMGDDCompGridMemoryLocation(compGrid)); hypre_topo_sort(hypre_CSRMatrixI(hypre_AMGDDCompGridMatrixOwnedDiag(hypre_AMGDDCompGridA( compGrid))), hypre_CSRMatrixJ(hypre_AMGDDCompGridMatrixOwnedDiag(hypre_AMGDDCompGridA(compGrid))), hypre_CSRMatrixData(hypre_AMGDDCompGridMatrixOwnedDiag(hypre_AMGDDCompGridA(compGrid))), hypre_AMGDDCompGridOwnedRelaxOrdering(compGrid), hypre_AMGDDCompGridNumOwnedNodes(compGrid)); } if (!hypre_AMGDDCompGridNonOwnedRelaxOrdering(compGrid)) { hypre_AMGDDCompGridNonOwnedRelaxOrdering(compGrid) = hypre_CTAlloc(HYPRE_Int, hypre_AMGDDCompGridNumNonOwnedNodes(compGrid), hypre_AMGDDCompGridMemoryLocation(compGrid)); hypre_topo_sort(hypre_CSRMatrixI(hypre_AMGDDCompGridMatrixNonOwnedDiag(hypre_AMGDDCompGridA( compGrid))), hypre_CSRMatrixJ(hypre_AMGDDCompGridMatrixNonOwnedDiag(hypre_AMGDDCompGridA(compGrid))), hypre_CSRMatrixData(hypre_AMGDDCompGridMatrixNonOwnedDiag(hypre_AMGDDCompGridA(compGrid))), hypre_AMGDDCompGridNonOwnedRelaxOrdering(compGrid), hypre_AMGDDCompGridNumNonOwnedNodes(compGrid)); } // Get all the info HYPRE_Complex *u_owned_data = hypre_VectorData(hypre_AMGDDCompGridVectorOwned(u)); HYPRE_Complex *u_nonowned_data = hypre_VectorData(hypre_AMGDDCompGridVectorNonOwned(u)); HYPRE_Complex *f_owned_data = hypre_VectorData(hypre_AMGDDCompGridVectorOwned(f)); HYPRE_Complex *f_nonowned_data = hypre_VectorData(hypre_AMGDDCompGridVectorNonOwned(f)); hypre_CSRMatrix *owned_diag = hypre_AMGDDCompGridMatrixOwnedDiag(A); hypre_CSRMatrix *owned_offd = hypre_AMGDDCompGridMatrixOwnedOffd(A); hypre_CSRMatrix *nonowned_diag = hypre_AMGDDCompGridMatrixNonOwnedDiag(A); hypre_CSRMatrix *nonowned_offd = hypre_AMGDDCompGridMatrixNonOwnedOffd(A); // Do Gauss-Seidel relaxation on the nonowned real nodes for (unordered_i = 0; unordered_i < hypre_AMGDDCompGridNumNonOwnedRealNodes(compGrid); unordered_i++) { i = hypre_AMGDDCompGridNonOwnedRelaxOrdering(compGrid)[unordered_i]; // Initialize u as RHS u_nonowned_data[i] = f_nonowned_data[i]; diagonal = 0.0; // Loop over diag entries for (j = hypre_CSRMatrixI(nonowned_diag)[i]; j < hypre_CSRMatrixI(nonowned_diag)[i + 1]; j++) { if (hypre_CSRMatrixJ(nonowned_diag)[j] == i) { diagonal = hypre_CSRMatrixData(nonowned_diag)[j]; } else { u_nonowned_data[i] -= hypre_CSRMatrixData(nonowned_diag)[j] * u_nonowned_data[ hypre_CSRMatrixJ( nonowned_diag)[j] ]; } } // Loop over offd entries for (j = hypre_CSRMatrixI(nonowned_offd)[i]; j < hypre_CSRMatrixI(nonowned_offd)[i + 1]; j++) { u_nonowned_data[i] -= hypre_CSRMatrixData(nonowned_offd)[j] * u_owned_data[ hypre_CSRMatrixJ( nonowned_offd)[j] ]; } // Divide by diagonal if (diagonal == 0.0) { hypre_error_w_msg(HYPRE_ERROR_GENERIC, "WARNING: Divide by zero diagonal in hypre_BoomerAMGDD_FAC_OrderedGaussSeidel().\n"); } u_nonowned_data[i] /= diagonal; } // Do Gauss-Seidel relaxation on the owned nodes for (unordered_i = 0; unordered_i < hypre_AMGDDCompGridNumOwnedNodes(compGrid); unordered_i++) { i = hypre_AMGDDCompGridOwnedRelaxOrdering(compGrid)[unordered_i]; // Initialize u as RHS u_owned_data[i] = f_owned_data[i]; diagonal = 0.0; // Loop over diag entries for (j = hypre_CSRMatrixI(owned_diag)[i]; j < hypre_CSRMatrixI(owned_diag)[i + 1]; j++) { if (hypre_CSRMatrixJ(owned_diag)[j] == i) { diagonal = hypre_CSRMatrixData(owned_diag)[j]; } else { u_owned_data[i] -= hypre_CSRMatrixData(owned_diag)[j] * u_owned_data[ hypre_CSRMatrixJ( owned_diag)[j] ]; } } // Loop over offd entries for (j = hypre_CSRMatrixI(owned_offd)[i]; j < hypre_CSRMatrixI(owned_offd)[i + 1]; j++) { u_owned_data[i] -= hypre_CSRMatrixData(owned_offd)[j] * u_nonowned_data[ hypre_CSRMatrixJ( owned_offd)[j] ]; } // Divide by diagonal if (diagonal == 0.0) { hypre_error_w_msg(HYPRE_ERROR_GENERIC, "WARNING: Divide by zero diagonal in hypre_BoomerAMGDD_FAC_OrderedGaussSeidel().\n"); } u_owned_data[i] /= diagonal; } return hypre_error_flag; } HYPRE_Int hypre_BoomerAMGDD_FAC_CFL1Jacobi( void *amgdd_vdata, HYPRE_Int level, HYPRE_Int cycle_param ) { #if defined(HYPRE_USING_GPU) hypre_ParAMGDDData *amgdd_data = (hypre_ParAMGDDData*) amgdd_vdata; hypre_AMGDDCompGrid *compGrid = hypre_ParAMGDDDataCompGrid(amgdd_data)[level]; HYPRE_MemoryLocation memory_location = hypre_AMGDDCompGridMemoryLocation(compGrid); HYPRE_ExecutionPolicy exec = hypre_GetExecPolicy1(memory_location); if (exec == HYPRE_EXEC_DEVICE) { if (cycle_param == 1) { hypre_BoomerAMGDD_FAC_CFL1JacobiDevice(amgdd_vdata, level, 1); hypre_BoomerAMGDD_FAC_CFL1JacobiDevice(amgdd_vdata, level, -1); } else if (cycle_param == 2) { hypre_BoomerAMGDD_FAC_CFL1JacobiDevice(amgdd_vdata, level, -1); hypre_BoomerAMGDD_FAC_CFL1JacobiDevice(amgdd_vdata, level, 1); } else { hypre_BoomerAMGDD_FAC_CFL1JacobiDevice(amgdd_vdata, level, -1); } } else #endif { if (cycle_param == 1) { hypre_BoomerAMGDD_FAC_CFL1JacobiHost(amgdd_vdata, level, 1); hypre_BoomerAMGDD_FAC_CFL1JacobiHost(amgdd_vdata, level, -1); } else if (cycle_param == 2) { hypre_BoomerAMGDD_FAC_CFL1JacobiHost(amgdd_vdata, level, -1); hypre_BoomerAMGDD_FAC_CFL1JacobiHost(amgdd_vdata, level, 1); } else { hypre_BoomerAMGDD_FAC_CFL1JacobiHost(amgdd_vdata, level, -1); } } return hypre_error_flag; } HYPRE_Int hypre_BoomerAMGDD_FAC_CFL1JacobiHost( void *amgdd_vdata, HYPRE_Int level, HYPRE_Int relax_set ) { hypre_ParAMGDDData *amgdd_data = (hypre_ParAMGDDData*) amgdd_vdata; hypre_AMGDDCompGrid *compGrid = hypre_ParAMGDDDataCompGrid(amgdd_data)[level]; HYPRE_Real relax_weight = hypre_ParAMGDDDataFACRelaxWeight(amgdd_data); hypre_CSRMatrix *owned_diag = hypre_AMGDDCompGridMatrixOwnedDiag(hypre_AMGDDCompGridA( compGrid)); hypre_CSRMatrix *owned_offd = hypre_AMGDDCompGridMatrixOwnedOffd(hypre_AMGDDCompGridA( compGrid)); hypre_CSRMatrix *nonowned_diag = hypre_AMGDDCompGridMatrixNonOwnedDiag(hypre_AMGDDCompGridA( compGrid)); hypre_CSRMatrix *nonowned_offd = hypre_AMGDDCompGridMatrixNonOwnedOffd(hypre_AMGDDCompGridA( compGrid)); HYPRE_Complex *owned_u = hypre_VectorData(hypre_AMGDDCompGridVectorOwned( hypre_AMGDDCompGridU(compGrid))); HYPRE_Complex *nonowned_u = hypre_VectorData(hypre_AMGDDCompGridVectorNonOwned( hypre_AMGDDCompGridU(compGrid))); HYPRE_Complex *owned_f = hypre_VectorData(hypre_AMGDDCompGridVectorOwned( hypre_AMGDDCompGridF(compGrid))); HYPRE_Complex *nonowned_f = hypre_VectorData(hypre_AMGDDCompGridVectorNonOwned( hypre_AMGDDCompGridF(compGrid))); HYPRE_Real *l1_norms = hypre_AMGDDCompGridL1Norms(compGrid); HYPRE_Int *cf_marker = hypre_AMGDDCompGridCFMarkerArray(compGrid); HYPRE_Complex *owned_tmp; HYPRE_Complex *nonowned_tmp; HYPRE_Int i, j; HYPRE_Real res; /*----------------------------------------------------------------- * Create and initialize Temp2 vector if not done before. *-----------------------------------------------------------------*/ if (!hypre_AMGDDCompGridTemp2(compGrid)) { hypre_AMGDDCompGridTemp2(compGrid) = hypre_AMGDDCompGridVectorCreate(); hypre_AMGDDCompGridVectorInitialize(hypre_AMGDDCompGridTemp2(compGrid), hypre_AMGDDCompGridNumOwnedNodes(compGrid), hypre_AMGDDCompGridNumNonOwnedNodes(compGrid), hypre_AMGDDCompGridNumNonOwnedRealNodes(compGrid)); } owned_tmp = hypre_VectorData(hypre_AMGDDCompGridVectorOwned(hypre_AMGDDCompGridTemp2(compGrid))); nonowned_tmp = hypre_VectorData(hypre_AMGDDCompGridVectorNonOwned(hypre_AMGDDCompGridTemp2( compGrid))); /*----------------------------------------------------------------- * Copy current approximation into temporary vector. *-----------------------------------------------------------------*/ #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i) HYPRE_SMP_SCHEDULE #endif for (i = 0; i < hypre_AMGDDCompGridNumOwnedNodes(compGrid); i++) { owned_tmp[i] = owned_u[i]; } #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i) HYPRE_SMP_SCHEDULE #endif for (i = 0; i < hypre_AMGDDCompGridNumNonOwnedNodes(compGrid); i++) { nonowned_tmp[i] = nonowned_u[i]; } /*----------------------------------------------------------------- * Relax only C or F points as determined by relax_points. *-----------------------------------------------------------------*/ #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i,j,res) HYPRE_SMP_SCHEDULE #endif for (i = 0; i < hypre_AMGDDCompGridNumOwnedNodes(compGrid); i++) { if (cf_marker[i] == relax_set) { res = owned_f[i]; for (j = hypre_CSRMatrixI(owned_diag)[i]; j < hypre_CSRMatrixI(owned_diag)[i + 1]; j++) { res -= hypre_CSRMatrixData(owned_diag)[j] * owned_tmp[ hypre_CSRMatrixJ(owned_diag)[j] ]; } for (j = hypre_CSRMatrixI(owned_offd)[i]; j < hypre_CSRMatrixI(owned_offd)[i + 1]; j++) { res -= hypre_CSRMatrixData(owned_offd)[j] * nonowned_tmp[ hypre_CSRMatrixJ(owned_offd)[j] ]; } owned_u[i] += (relax_weight * res) / l1_norms[i]; } } for (i = 0; i < hypre_AMGDDCompGridNumNonOwnedRealNodes(compGrid); i++) { if (cf_marker[i + hypre_AMGDDCompGridNumOwnedNodes(compGrid)] == relax_set) { res = nonowned_f[i]; for (j = hypre_CSRMatrixI(nonowned_diag)[i]; j < hypre_CSRMatrixI(nonowned_diag)[i + 1]; j++) { res -= hypre_CSRMatrixData(nonowned_diag)[j] * nonowned_tmp[ hypre_CSRMatrixJ(nonowned_diag)[j] ]; } for (j = hypre_CSRMatrixI(nonowned_offd)[i]; j < hypre_CSRMatrixI(nonowned_offd)[i + 1]; j++) { res -= hypre_CSRMatrixData(nonowned_offd)[j] * owned_tmp[ hypre_CSRMatrixJ(nonowned_offd)[j] ]; } nonowned_u[i] += (relax_weight * res) / l1_norms[i + hypre_AMGDDCompGridNumOwnedNodes(compGrid)]; } } return hypre_error_flag; } hypre-2.33.0/src/parcsr_ls/par_amgdd_fac_cycle_device.c000066400000000000000000000163351477326011500231140ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "_hypre_parcsr_ls.h" #include "_hypre_utilities.hpp" #if defined(HYPRE_USING_GPU) HYPRE_Int hypre_BoomerAMGDD_FAC_JacobiDevice( void *amgdd_vdata, HYPRE_Int level ) { hypre_ParAMGDDData *amgdd_data = (hypre_ParAMGDDData*) amgdd_vdata; hypre_AMGDDCompGrid *compGrid = hypre_ParAMGDDDataCompGrid(amgdd_data)[level]; HYPRE_Real relax_weight = hypre_ParAMGDDDataFACRelaxWeight(amgdd_data); HYPRE_MemoryLocation memory_location = hypre_AMGDDCompGridMemoryLocation(compGrid); hypre_AMGDDCompGridMatrix *A = hypre_AMGDDCompGridA(compGrid); hypre_AMGDDCompGridVector *f = hypre_AMGDDCompGridF(compGrid); hypre_AMGDDCompGridVector *u = hypre_AMGDDCompGridU(compGrid); hypre_CSRMatrix *diag; HYPRE_Int total_real_nodes; HYPRE_Int i, j; // Calculate l1_norms if necessary (right now, I'm just using this vector for the diagonal of A and doing straight ahead Jacobi) if (!hypre_AMGDDCompGridL1Norms(compGrid)) { total_real_nodes = hypre_AMGDDCompGridNumOwnedNodes(compGrid) + hypre_AMGDDCompGridNumNonOwnedRealNodes(compGrid); hypre_AMGDDCompGridL1Norms(compGrid) = hypre_CTAlloc(HYPRE_Real, total_real_nodes, memory_location); diag = hypre_AMGDDCompGridMatrixOwnedDiag(A); for (i = 0; i < hypre_AMGDDCompGridNumOwnedNodes(compGrid); i++) { for (j = hypre_CSRMatrixI(diag)[i]; j < hypre_CSRMatrixI(diag)[i + 1]; j++) { // hypre_AMGDDCompGridL1Norms(compGrid)[i] += hypre_abs(hypre_CSRMatrixData(diag)[j]); if (hypre_CSRMatrixJ(diag)[j] == i) { hypre_AMGDDCompGridL1Norms(compGrid)[i] = hypre_CSRMatrixData(diag)[j]; } } } diag = hypre_AMGDDCompGridMatrixNonOwnedDiag(A); for (i = 0; i < hypre_AMGDDCompGridNumNonOwnedRealNodes(compGrid); i++) { for (j = hypre_CSRMatrixI(diag)[i]; j < hypre_CSRMatrixI(diag)[i + 1]; j++) { // hypre_AMGDDCompGridL1Norms(compGrid)[i + hypre_AMGDDCompGridNumOwnedNodes(compGrid)] += hypre_abs(hypre_CSRMatrixData(diag)[j]); if (hypre_CSRMatrixJ(diag)[j] == i) { hypre_AMGDDCompGridL1Norms(compGrid)[i + hypre_AMGDDCompGridNumOwnedNodes( compGrid)] = hypre_CSRMatrixData(diag)[j]; } } } } // Allocate temporary vector if necessary if (!hypre_AMGDDCompGridTemp2(compGrid)) { hypre_AMGDDCompGridTemp2(compGrid) = hypre_AMGDDCompGridVectorCreate(); hypre_AMGDDCompGridVectorInitialize(hypre_AMGDDCompGridTemp2(compGrid), hypre_AMGDDCompGridNumOwnedNodes(compGrid), hypre_AMGDDCompGridNumNonOwnedNodes(compGrid), hypre_AMGDDCompGridNumNonOwnedRealNodes(compGrid)); } hypre_AMGDDCompGridVectorCopy(f, hypre_AMGDDCompGridTemp2(compGrid)); hypre_AMGDDCompGridMatvec(-relax_weight, A, u, relax_weight, hypre_AMGDDCompGridTemp2(compGrid)); hypreDevice_IVAXPY(hypre_AMGDDCompGridNumOwnedNodes(compGrid), hypre_AMGDDCompGridL1Norms(compGrid), hypre_VectorData(hypre_AMGDDCompGridVectorOwned(hypre_AMGDDCompGridTemp2(compGrid))), hypre_VectorData(hypre_AMGDDCompGridVectorOwned(u))); hypreDevice_IVAXPY(hypre_AMGDDCompGridNumNonOwnedRealNodes(compGrid), &(hypre_AMGDDCompGridL1Norms(compGrid)[hypre_AMGDDCompGridNumOwnedNodes(compGrid)]), hypre_VectorData(hypre_AMGDDCompGridVectorNonOwned(hypre_AMGDDCompGridTemp2(compGrid))), hypre_VectorData(hypre_AMGDDCompGridVectorNonOwned(u))); return hypre_error_flag; } HYPRE_Int hypre_BoomerAMGDD_FAC_CFL1JacobiDevice( void *amgdd_vdata, HYPRE_Int level, HYPRE_Int relax_set ) { hypre_ParAMGDDData *amgdd_data = (hypre_ParAMGDDData*) amgdd_vdata; hypre_AMGDDCompGrid *compGrid = hypre_ParAMGDDDataCompGrid(amgdd_data)[level]; HYPRE_Real relax_weight = hypre_ParAMGDDDataFACRelaxWeight(amgdd_data); hypre_Vector *owned_u = hypre_AMGDDCompGridVectorOwned(hypre_AMGDDCompGridU( compGrid)); hypre_Vector *nonowned_u = hypre_AMGDDCompGridVectorNonOwned(hypre_AMGDDCompGridU( compGrid)); HYPRE_Int num_owned = hypre_AMGDDCompGridNumOwnedNodes(compGrid); HYPRE_Int num_nonowned = hypre_AMGDDCompGridNumNonOwnedNodes(compGrid); HYPRE_Int num_nonowned_r = hypre_AMGDDCompGridNumNonOwnedRealNodes(compGrid); hypre_Vector *owned_tmp; hypre_Vector *nonowned_tmp; // Allocate temporary vector if necessary if (!hypre_AMGDDCompGridTemp2(compGrid)) { hypre_AMGDDCompGridTemp2(compGrid) = hypre_AMGDDCompGridVectorCreate(); hypre_AMGDDCompGridVectorInitialize(hypre_AMGDDCompGridTemp2(compGrid), num_owned, num_nonowned, num_nonowned_r); } hypre_AMGDDCompGridVectorCopy(hypre_AMGDDCompGridF(compGrid), hypre_AMGDDCompGridTemp2(compGrid)); hypre_AMGDDCompGridMatvec(-relax_weight, hypre_AMGDDCompGridA(compGrid), hypre_AMGDDCompGridU(compGrid), relax_weight, hypre_AMGDDCompGridTemp2(compGrid)); owned_tmp = hypre_AMGDDCompGridVectorOwned(hypre_AMGDDCompGridTemp2(compGrid)); nonowned_tmp = hypre_AMGDDCompGridVectorNonOwned(hypre_AMGDDCompGridTemp2(compGrid)); hypreDevice_IVAXPYMarked(num_owned, hypre_AMGDDCompGridL1Norms(compGrid), hypre_VectorData(owned_tmp), hypre_VectorData(owned_u), hypre_AMGDDCompGridCFMarkerArray(compGrid), relax_set); hypreDevice_IVAXPYMarked(num_nonowned_r, &(hypre_AMGDDCompGridL1Norms(compGrid)[num_owned]), hypre_VectorData(nonowned_tmp), hypre_VectorData(nonowned_u), hypre_AMGDDCompGridCFMarkerArray(compGrid) + num_owned, relax_set); return hypre_error_flag; } #endif // defined(HYPRE_USING_GPU) hypre-2.33.0/src/parcsr_ls/par_amgdd_helpers.c000066400000000000000000005076221477326011500213330ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "_hypre_parcsr_ls.h" #include "_hypre_utilities.h" HYPRE_Int hypre_BoomerAMGDD_LocalToGlobalIndex( hypre_AMGDDCompGrid *compGrid, HYPRE_Int local_index ) { /* Local index starts with 0 at beginning of owned dofs and continues through the nonowned (possible indices that are too large marking real overwriting ghost) */ if (local_index < 0) { local_index = -(local_index + 1); } else if (local_index >= hypre_AMGDDCompGridNumOwnedNodes(compGrid) + hypre_AMGDDCompGridNumNonOwnedNodes(compGrid)) { local_index -= hypre_AMGDDCompGridNumOwnedNodes(compGrid) + hypre_AMGDDCompGridNumNonOwnedNodes(compGrid); } if (local_index < hypre_AMGDDCompGridNumOwnedNodes(compGrid)) { return local_index + hypre_AMGDDCompGridFirstGlobalIndex(compGrid); } else { return hypre_AMGDDCompGridNonOwnedGlobalIndices(compGrid)[local_index - hypre_AMGDDCompGridNumOwnedNodes(compGrid)]; } } HYPRE_Int hypre_BoomerAMGDD_GetDofRecvProc( HYPRE_Int neighbor_local_index, hypre_ParCSRMatrix *A ) { // Use that column index to find which processor this dof is received from hypre_ParCSRCommPkg *commPkg = hypre_ParCSRMatrixCommPkg(A); HYPRE_Int recv_proc = -1; HYPRE_Int i; for (i = 0; i < hypre_ParCSRCommPkgNumRecvs(commPkg); i++) { if (neighbor_local_index >= hypre_ParCSRCommPkgRecvVecStart(commPkg, i) && neighbor_local_index < hypre_ParCSRCommPkgRecvVecStart(commPkg, i + 1)) { /* recv_proc = hypre_ParCSRCommPkgRecvProc(commPkg,i); */ recv_proc = i; break; } } return recv_proc; } HYPRE_Int hypre_BoomerAMGDD_RecursivelyFindNeighborNodes( HYPRE_Int dof_index, HYPRE_Int distance, hypre_ParCSRMatrix *A, HYPRE_Int *add_flag, HYPRE_Int *add_flag_requests) { hypre_CSRMatrix *diag = hypre_ParCSRMatrixDiag(A); hypre_CSRMatrix *offd = hypre_ParCSRMatrixOffd(A); HYPRE_Int neighbor_index; HYPRE_Int i; // Look at diag neighbors for (i = hypre_CSRMatrixI(diag)[dof_index]; i < hypre_CSRMatrixI(diag)[dof_index + 1]; i++) { // Get the index of the neighbor neighbor_index = hypre_CSRMatrixJ(diag)[i]; // If the neighbor info is available on this proc // And if we still need to visit this index (note that send_dofs[neighbor_index] = distance means we have already added all distance-1 neighbors of index) // See whether this dof is in the send dofs if (add_flag[neighbor_index] < distance) { add_flag[neighbor_index] = distance; if (distance - 1 > 0) { hypre_BoomerAMGDD_RecursivelyFindNeighborNodes(neighbor_index, distance - 1, A, add_flag, add_flag_requests); } } } // Look at offd neighbors for (i = hypre_CSRMatrixI(offd)[dof_index]; i < hypre_CSRMatrixI(offd)[dof_index + 1]; i++) { neighbor_index = hypre_CSRMatrixJ(offd)[i]; if (add_flag_requests[neighbor_index] < distance) { add_flag_requests[neighbor_index] = distance; } } return hypre_error_flag; } HYPRE_Int hypre_BoomerAMGDD_AddToSendAndRequestDofs( hypre_ParCSRMatrix *A, HYPRE_Int *add_flag, HYPRE_Int *add_flag_requests, HYPRE_Int level, HYPRE_Int send_proc, hypre_AMGDDCommPkg *compGridCommPkg, HYPRE_Int **distances, hypre_UnorderedIntMap **send_dof_maps, HYPRE_Int *send_dof_capacities, HYPRE_Int num_csr_recv_procs, HYPRE_Int **num_req_dofs, HYPRE_Int ***req_dofs, HYPRE_Int ***req_dof_dist ) { HYPRE_Int *req_cnt; HYPRE_Int neighbor_global_index; HYPRE_Int recv_proc; HYPRE_Int i, idx; for (i = 0; i < hypre_ParCSRMatrixNumRows(A); i++) { if (add_flag[i]) { idx = hypre_UnorderedIntMapGet(send_dof_maps[send_proc], i); // Recall: key = local owned dof idx, data = idx into sendflag array if (idx == -1) { idx = hypre_AMGDDCommPkgNumSendNodes(compGridCommPkg)[level][send_proc][level]++; // Check whether a resize of the send dofs (and related arrays) is necessary if (idx == send_dof_capacities[send_proc]) { send_dof_capacities[send_proc] *= 2; hypre_AMGDDCommPkgSendFlag(compGridCommPkg)[level][send_proc][level] = hypre_TReAlloc( hypre_AMGDDCommPkgSendFlag(compGridCommPkg)[level][send_proc][level], HYPRE_Int, send_dof_capacities[send_proc], HYPRE_MEMORY_HOST); distances[send_proc] = hypre_TReAlloc(distances[send_proc], HYPRE_Int, send_dof_capacities[send_proc], HYPRE_MEMORY_HOST); } hypre_AMGDDCommPkgSendFlag(compGridCommPkg)[level][send_proc][level][idx] = i; distances[send_proc][idx] = add_flag[i]; hypre_UnorderedIntMapPutIfAbsent(send_dof_maps[send_proc], i, idx); } else if (distances[send_proc][idx] < add_flag[i]) { distances[send_proc][idx] = add_flag[i]; } } } // Count request dofs and alloc/realloc req_dofs and req_dof_dist req_cnt = hypre_CTAlloc(HYPRE_Int, num_csr_recv_procs, HYPRE_MEMORY_HOST); for (i = 0; i < num_csr_recv_procs; i++) { req_cnt[i] = num_req_dofs[i][send_proc]; } for (i = 0; i < hypre_CSRMatrixNumCols(hypre_ParCSRMatrixOffd(A)); i++) { if (add_flag_requests[i]) { recv_proc = hypre_BoomerAMGDD_GetDofRecvProc(i, A); if (hypre_AMGDDCommPkgRecvProcs(compGridCommPkg)[level][recv_proc] != hypre_AMGDDCommPkgSendProcs( compGridCommPkg)[level][send_proc]) { num_req_dofs[recv_proc][send_proc]++; } } } for (i = 0; i < num_csr_recv_procs; i++) { if (num_req_dofs[i][send_proc]) { if (req_dofs[i][send_proc]) { req_dofs[i][send_proc] = hypre_TReAlloc(req_dofs[i][send_proc], HYPRE_Int, num_req_dofs[i][send_proc], HYPRE_MEMORY_HOST); req_dof_dist[i][send_proc] = hypre_TReAlloc(req_dof_dist[i][send_proc], HYPRE_Int, num_req_dofs[i][send_proc], HYPRE_MEMORY_HOST); } else { req_dofs[i][send_proc] = hypre_CTAlloc(HYPRE_Int, num_req_dofs[i][send_proc], HYPRE_MEMORY_HOST); req_dof_dist[i][send_proc] = hypre_CTAlloc(HYPRE_Int, num_req_dofs[i][send_proc], HYPRE_MEMORY_HOST); } } } // Fill the req dof info for (i = 0; i < hypre_CSRMatrixNumCols(hypre_ParCSRMatrixOffd(A)); i++) { if (add_flag_requests[i]) { neighbor_global_index = hypre_ParCSRMatrixColMapOffd(A)[i]; recv_proc = hypre_BoomerAMGDD_GetDofRecvProc(i, A); if (hypre_AMGDDCommPkgRecvProcs(compGridCommPkg)[level][recv_proc] != hypre_AMGDDCommPkgSendProcs( compGridCommPkg)[level][send_proc]) { req_dofs[recv_proc][send_proc][ req_cnt[recv_proc] ] = neighbor_global_index; req_dof_dist[recv_proc][send_proc][ req_cnt[recv_proc] ] = add_flag_requests[i]; req_cnt[recv_proc]++; } } } // Clean up memory hypre_TFree(req_cnt, HYPRE_MEMORY_HOST); return hypre_error_flag; } HYPRE_Int hypre_BoomerAMGDD_FindNeighborProcessors( hypre_ParCSRMatrix *A, hypre_AMGDDCommPkg *compGridCommPkg, HYPRE_Int ***distances_ptr, hypre_UnorderedIntMap ***send_dof_maps_ptr, HYPRE_Int *send_proc_capacity_ptr, HYPRE_Int **send_dof_capacities_ptr, HYPRE_Int *recv_proc_capacity_ptr, HYPRE_Int ***starting_dofs_ptr, HYPRE_Int **num_starting_dofs_ptr, HYPRE_Int level, HYPRE_Int max_distance ) { HYPRE_Int **distances = *distances_ptr; hypre_UnorderedIntMap **send_dof_maps = *send_dof_maps_ptr; HYPRE_Int send_proc_capacity = *send_proc_capacity_ptr; HYPRE_Int *send_dof_capacities = *send_dof_capacities_ptr; HYPRE_Int recv_proc_capacity = *recv_proc_capacity_ptr; HYPRE_Int **starting_dofs = *starting_dofs_ptr; HYPRE_Int *num_starting_dofs = *num_starting_dofs_ptr; hypre_ParCSRCommPkg *commPkg = hypre_ParCSRMatrixCommPkg(A); HYPRE_Int csr_num_sends = hypre_ParCSRCommPkgNumSends(commPkg); HYPRE_Int csr_num_recvs = hypre_ParCSRCommPkgNumRecvs(commPkg); HYPRE_Int i, j, k; // Nodes to request from other processors. Note, requests are only issued to processors within distance 1, i.e. within the original communication stencil for A HYPRE_Int **num_req_dofs = hypre_CTAlloc(HYPRE_Int*, csr_num_recvs, HYPRE_MEMORY_HOST); HYPRE_Int ***req_dofs = hypre_CTAlloc(HYPRE_Int**, csr_num_recvs, HYPRE_MEMORY_HOST); HYPRE_Int ***req_dof_dist = hypre_CTAlloc(HYPRE_Int**, csr_num_recvs, HYPRE_MEMORY_HOST); for (i = 0; i < csr_num_recvs; i++) { num_req_dofs[i] = hypre_CTAlloc(HYPRE_Int, hypre_AMGDDCommPkgNumSendProcs(compGridCommPkg)[level], HYPRE_MEMORY_HOST); req_dofs[i] = hypre_CTAlloc(HYPRE_Int*, hypre_AMGDDCommPkgNumSendProcs(compGridCommPkg)[level], HYPRE_MEMORY_HOST); req_dof_dist[i] = hypre_CTAlloc(HYPRE_Int*, hypre_AMGDDCommPkgNumSendProcs(compGridCommPkg)[level], HYPRE_MEMORY_HOST); } HYPRE_Int *add_flag = hypre_CTAlloc(HYPRE_Int, hypre_ParCSRMatrixNumRows(A), HYPRE_MEMORY_HOST); HYPRE_Int *add_flag_requests = hypre_CTAlloc(HYPRE_Int, hypre_CSRMatrixNumCols(hypre_ParCSRMatrixOffd(A)), HYPRE_MEMORY_HOST); // Recursively search through the operator stencil to find longer distance neighboring dofs // Loop over longdistance send procs for (i = 0; i < hypre_AMGDDCommPkgNumSendProcs(compGridCommPkg)[level]; i++) { if (num_starting_dofs[i]) { // Initialize the add_flag at the starting dofs for (j = 0; j < num_starting_dofs[i]; j++) { HYPRE_Int idx = starting_dofs[i][j]; HYPRE_Int send_dof = hypre_AMGDDCommPkgSendFlag(compGridCommPkg)[level][i][level][idx]; add_flag[send_dof] = distances[i][idx]; } // Recursively search for longer distance dofs for (j = 0; j < num_starting_dofs[i]; j++) { HYPRE_Int idx = starting_dofs[i][j]; HYPRE_Int send_dof = hypre_AMGDDCommPkgSendFlag(compGridCommPkg)[level][i][level][idx]; hypre_BoomerAMGDD_RecursivelyFindNeighborNodes(send_dof, distances[i][idx] - 1, A, add_flag, add_flag_requests); } num_starting_dofs[i] = 0; hypre_TFree(starting_dofs[i], HYPRE_MEMORY_HOST); starting_dofs[i] = NULL; // Update the send flag and request dofs hypre_BoomerAMGDD_AddToSendAndRequestDofs(A, add_flag, add_flag_requests, level, i, compGridCommPkg, distances, send_dof_maps, send_dof_capacities, csr_num_recvs, num_req_dofs, req_dofs, req_dof_dist); // Reset add flags hypre_Memset(add_flag, 0, sizeof(HYPRE_Int)*hypre_ParCSRMatrixNumRows(A), HYPRE_MEMORY_HOST); hypre_Memset(add_flag_requests, 0, sizeof(HYPRE_Int)*hypre_CSRMatrixNumCols(hypre_ParCSRMatrixOffd(A)), HYPRE_MEMORY_HOST); } } hypre_TFree(add_flag, HYPRE_MEMORY_HOST); hypre_TFree(add_flag_requests, HYPRE_MEMORY_HOST); ////////////////////////////////////////////////// // Communicate newly connected longer-distance processors to send procs: // sending to current longdistance send_procs and receiving from current // longdistance recv_procs ////////////////////////////////////////////////// // Get the sizes hypre_MPI_Request *requests = hypre_CTAlloc(hypre_MPI_Request, hypre_AMGDDCommPkgNumSendProcs(compGridCommPkg)[level] + hypre_AMGDDCommPkgNumRecvProcs( compGridCommPkg)[level], HYPRE_MEMORY_HOST); hypre_MPI_Status *statuses = hypre_CTAlloc(hypre_MPI_Status, hypre_AMGDDCommPkgNumSendProcs(compGridCommPkg)[level] + hypre_AMGDDCommPkgNumRecvProcs( compGridCommPkg)[level], HYPRE_MEMORY_HOST); HYPRE_Int request_cnt = 0; HYPRE_Int *recv_sizes = hypre_CTAlloc(HYPRE_Int, hypre_AMGDDCommPkgNumRecvProcs(compGridCommPkg)[level], HYPRE_MEMORY_HOST); for (i = 0; i < hypre_AMGDDCommPkgNumRecvProcs(compGridCommPkg)[level]; i++) { hypre_MPI_Irecv(&(recv_sizes[i]), 1, HYPRE_MPI_INT, hypre_AMGDDCommPkgRecvProcs(compGridCommPkg)[level][i], 6, hypre_MPI_COMM_WORLD, &(requests[request_cnt++])); } HYPRE_Int *send_sizes = hypre_CTAlloc(HYPRE_Int, hypre_AMGDDCommPkgNumSendProcs(compGridCommPkg)[level], HYPRE_MEMORY_HOST); for (i = 0; i < hypre_AMGDDCommPkgNumSendProcs(compGridCommPkg)[level]; i++) { for (j = 0; j < csr_num_recvs; j++) { if (num_req_dofs[j][i]) { send_sizes[i]++; } } hypre_MPI_Isend(&(send_sizes[i]), 1, HYPRE_MPI_INT, hypre_AMGDDCommPkgSendProcs(compGridCommPkg)[level][i], 6, hypre_MPI_COMM_WORLD, &(requests[request_cnt++])); } // Wait hypre_MPI_Waitall(hypre_AMGDDCommPkgNumSendProcs(compGridCommPkg)[level] + hypre_AMGDDCommPkgNumRecvProcs(compGridCommPkg)[level], requests, statuses); hypre_TFree(requests, HYPRE_MEMORY_HOST); hypre_TFree(statuses, HYPRE_MEMORY_HOST); requests = hypre_CTAlloc(hypre_MPI_Request, hypre_AMGDDCommPkgNumSendProcs(compGridCommPkg)[level] + hypre_AMGDDCommPkgNumRecvProcs( compGridCommPkg)[level], HYPRE_MEMORY_HOST); statuses = hypre_CTAlloc(hypre_MPI_Status, hypre_AMGDDCommPkgNumSendProcs(compGridCommPkg)[level] + hypre_AMGDDCommPkgNumRecvProcs( compGridCommPkg)[level], HYPRE_MEMORY_HOST); request_cnt = 0; // Allocate and post the recvs HYPRE_Int **recv_buffers = hypre_CTAlloc(HYPRE_Int*, hypre_AMGDDCommPkgNumRecvProcs(compGridCommPkg)[level], HYPRE_MEMORY_HOST); for (i = 0; i < hypre_AMGDDCommPkgNumRecvProcs(compGridCommPkg)[level]; i++) { recv_buffers[i] = hypre_CTAlloc(HYPRE_Int, recv_sizes[i], HYPRE_MEMORY_HOST); hypre_MPI_Irecv(recv_buffers[i], recv_sizes[i], HYPRE_MPI_INT, hypre_AMGDDCommPkgRecvProcs(compGridCommPkg)[level][i], 7, hypre_MPI_COMM_WORLD, &(requests[request_cnt++])); } // Setup and send the send buffers HYPRE_Int **send_buffers = hypre_CTAlloc(HYPRE_Int*, hypre_AMGDDCommPkgNumSendProcs(compGridCommPkg)[level], HYPRE_MEMORY_HOST); for (i = 0; i < hypre_AMGDDCommPkgNumSendProcs(compGridCommPkg)[level]; i++) { send_buffers[i] = hypre_CTAlloc(HYPRE_Int, send_sizes[i], HYPRE_MEMORY_HOST); HYPRE_Int inner_cnt = 0; for (j = 0; j < csr_num_recvs; j++) { if (num_req_dofs[j][i]) { send_buffers[i][inner_cnt++] = hypre_AMGDDCommPkgRecvProcs(compGridCommPkg)[level][j]; } } hypre_MPI_Isend(send_buffers[i], send_sizes[i], HYPRE_MPI_INT, hypre_AMGDDCommPkgSendProcs(compGridCommPkg)[level][i], 7, hypre_MPI_COMM_WORLD, &(requests[request_cnt++])); } // Wait hypre_MPI_Waitall(hypre_AMGDDCommPkgNumSendProcs(compGridCommPkg)[level] + hypre_AMGDDCommPkgNumRecvProcs(compGridCommPkg)[level], requests, statuses); hypre_TFree(requests, HYPRE_MEMORY_HOST); hypre_TFree(statuses, HYPRE_MEMORY_HOST); // Update recv_procs HYPRE_Int old_num_recv_procs = hypre_AMGDDCommPkgNumRecvProcs(compGridCommPkg)[level]; for (i = 0; i < old_num_recv_procs; i++) { for (j = 0; j < recv_sizes[i]; j++) { // For each incoming longer-distance recv proc, need to check whether it is already accounted for // !!! Optimization: can add a hypre set here for looking up previous recv procs if necessary (replace linear search) HYPRE_Int accounted_for = 0; for (k = 0; k < hypre_AMGDDCommPkgNumRecvProcs(compGridCommPkg)[level]; k++) { if (hypre_AMGDDCommPkgRecvProcs(compGridCommPkg)[level][k] == recv_buffers[i][j]) { accounted_for = 1; break; } } if (!accounted_for) { // Check whether we need to reallocate if (hypre_AMGDDCommPkgNumRecvProcs(compGridCommPkg)[level] == recv_proc_capacity) { recv_proc_capacity *= 2; hypre_AMGDDCommPkgRecvProcs(compGridCommPkg)[level] = hypre_TReAlloc(hypre_AMGDDCommPkgRecvProcs( compGridCommPkg)[level], HYPRE_Int, recv_proc_capacity, HYPRE_MEMORY_HOST); } hypre_AMGDDCommPkgRecvProcs(compGridCommPkg)[level][ hypre_AMGDDCommPkgNumRecvProcs( compGridCommPkg)[level]++ ] = recv_buffers[i][j]; } } } // Clean up memory for (i = 0; i < old_num_recv_procs; i++) { hypre_TFree(recv_buffers[i], HYPRE_MEMORY_HOST); } for (i = 0; i < hypre_AMGDDCommPkgNumSendProcs(compGridCommPkg)[level]; i++) { hypre_TFree(send_buffers[i], HYPRE_MEMORY_HOST); } hypre_TFree(recv_buffers, HYPRE_MEMORY_HOST); hypre_TFree(send_buffers, HYPRE_MEMORY_HOST); hypre_TFree(recv_sizes, HYPRE_MEMORY_HOST); hypre_TFree(send_sizes, HYPRE_MEMORY_HOST); ////////////////////////////////////////////////// // Communicate request dofs to processors that I recv from: sending to request_procs and receiving from distance 1 send procs ////////////////////////////////////////////////// // Count up the send size: 1 + sum_{destination_procs}(2 + 2*num_requested_dofs) // send_buffer = [num destination procs, [request info for proc], [request info for proc], ... ] // [request info for proc] = [proc id, num requested dofs, [(dof index, distance), (dof index, distance), ...] ] // Exchange message sizes send_sizes = hypre_CTAlloc(HYPRE_Int, csr_num_recvs, HYPRE_MEMORY_HOST); recv_sizes = hypre_CTAlloc(HYPRE_Int, csr_num_sends, HYPRE_MEMORY_HOST); requests = hypre_CTAlloc(hypre_MPI_Request, csr_num_sends + csr_num_recvs, HYPRE_MEMORY_HOST); statuses = hypre_CTAlloc(hypre_MPI_Status, csr_num_sends + csr_num_recvs, HYPRE_MEMORY_HOST); request_cnt = 0; for (i = 0; i < csr_num_sends; i++) { hypre_MPI_Irecv(&(recv_sizes[i]), 1, HYPRE_MPI_INT, hypre_ParCSRCommPkgSendProc(commPkg, i), 4, hypre_MPI_COMM_WORLD, &(requests[request_cnt++])); } for (i = 0; i < csr_num_recvs; i++) { send_sizes[i]++; for (j = 0; j < hypre_AMGDDCommPkgNumSendProcs(compGridCommPkg)[level]; j++) { if (num_req_dofs[i][j]) { send_sizes[i] += 2 + 2 * num_req_dofs[i][j]; } } hypre_MPI_Isend(&(send_sizes[i]), 1, HYPRE_MPI_INT, hypre_ParCSRCommPkgRecvProc(commPkg, i), 4, hypre_MPI_COMM_WORLD, &(requests[request_cnt++])); } // Wait on the recv sizes, then free and re-allocate the requests and statuses hypre_MPI_Waitall(csr_num_sends + csr_num_recvs, requests, statuses); hypre_TFree(requests, HYPRE_MEMORY_HOST); hypre_TFree(statuses, HYPRE_MEMORY_HOST); requests = hypre_CTAlloc(hypre_MPI_Request, csr_num_sends + csr_num_recvs, HYPRE_MEMORY_HOST); statuses = hypre_CTAlloc(hypre_MPI_Status, csr_num_sends + csr_num_recvs, HYPRE_MEMORY_HOST); request_cnt = 0; // Allocate recv buffers and post the recvs recv_buffers = hypre_CTAlloc(HYPRE_Int*, csr_num_sends, HYPRE_MEMORY_HOST); for (i = 0; i < csr_num_sends; i++) { recv_buffers[i] = hypre_CTAlloc(HYPRE_Int, recv_sizes[i], HYPRE_MEMORY_HOST); hypre_MPI_Irecv(recv_buffers[i], recv_sizes[i], HYPRE_MPI_INT, hypre_ParCSRCommPkgSendProc(commPkg, i), 5, hypre_MPI_COMM_WORLD, &(requests[request_cnt++])); } // Setup the send buffer and post the sends send_buffers = hypre_CTAlloc(HYPRE_Int*, csr_num_recvs, HYPRE_MEMORY_HOST); for (i = 0; i < csr_num_recvs; i++) { send_buffers[i] = hypre_CTAlloc(HYPRE_Int, send_sizes[i], HYPRE_MEMORY_HOST); HYPRE_Int inner_cnt = 1; for (j = 0; j < hypre_AMGDDCommPkgNumSendProcs(compGridCommPkg)[level]; j++) { if (num_req_dofs[i][j]) { send_buffers[i][0]++; send_buffers[i][inner_cnt++] = hypre_AMGDDCommPkgSendProcs(compGridCommPkg)[level][j]; send_buffers[i][inner_cnt++] = num_req_dofs[i][j]; for (k = 0; k < num_req_dofs[i][j]; k++) { send_buffers[i][inner_cnt++] = req_dofs[i][j][k]; send_buffers[i][inner_cnt++] = req_dof_dist[i][j][k]; } } } hypre_MPI_Isend(send_buffers[i], send_sizes[i], HYPRE_MPI_INT, hypre_ParCSRCommPkgRecvProc(commPkg, i), 5, hypre_MPI_COMM_WORLD, &(requests[request_cnt++])); } // Free the req dof info for (i = 0; i < csr_num_recvs; i++) { for (j = 0; j < hypre_AMGDDCommPkgNumSendProcs(compGridCommPkg)[level]; j++) { if (req_dofs[i][j]) { hypre_TFree(req_dofs[i][j], HYPRE_MEMORY_HOST); hypre_TFree(req_dof_dist[i][j], HYPRE_MEMORY_HOST); } } hypre_TFree(num_req_dofs[i], HYPRE_MEMORY_HOST); hypre_TFree(req_dofs[i], HYPRE_MEMORY_HOST); hypre_TFree(req_dof_dist[i], HYPRE_MEMORY_HOST); } hypre_TFree(num_req_dofs, HYPRE_MEMORY_HOST); hypre_TFree(req_dofs, HYPRE_MEMORY_HOST); hypre_TFree(req_dof_dist, HYPRE_MEMORY_HOST); // Wait hypre_MPI_Waitall(csr_num_sends + csr_num_recvs, requests, statuses); hypre_TFree(requests, HYPRE_MEMORY_HOST); hypre_TFree(statuses, HYPRE_MEMORY_HOST); // Update send_proc_dofs and starting_dofs // Loop over send_proc's, i.e. the processors that we just received from for (i = 0; i < csr_num_sends; i++) { HYPRE_Int cnt = 0; HYPRE_Int num_destination_procs = recv_buffers[i][cnt++]; HYPRE_Int destination_proc; for (destination_proc = 0; destination_proc < num_destination_procs; destination_proc++) { // Get destination proc id and the number of requested dofs HYPRE_Int proc_id = recv_buffers[i][cnt++]; HYPRE_Int num_requested_dofs = recv_buffers[i][cnt++]; // create new map for this destination proc if it doesn't already exist HYPRE_Int new_proc = 0; HYPRE_Int p_idx = -1; for (j = 0; j < hypre_AMGDDCommPkgNumSendProcs(compGridCommPkg)[level]; j++) { if (hypre_AMGDDCommPkgSendProcs(compGridCommPkg)[level][j] == proc_id) { p_idx = j; break; } } if (p_idx < 0) { new_proc = 1; p_idx = hypre_AMGDDCommPkgNumSendProcs(compGridCommPkg)[level]; if (p_idx == send_proc_capacity) { send_proc_capacity *= 2; hypre_AMGDDCommPkgSendProcs(compGridCommPkg)[level] = hypre_TReAlloc(hypre_AMGDDCommPkgSendProcs( compGridCommPkg)[level], HYPRE_Int, send_proc_capacity, HYPRE_MEMORY_HOST); hypre_AMGDDCommPkgSendFlag(compGridCommPkg)[level] = hypre_TReAlloc(hypre_AMGDDCommPkgSendFlag( compGridCommPkg)[level], HYPRE_Int**, send_proc_capacity, HYPRE_MEMORY_HOST); hypre_AMGDDCommPkgNumSendNodes(compGridCommPkg)[level] = hypre_TReAlloc( hypre_AMGDDCommPkgNumSendNodes(compGridCommPkg)[level], HYPRE_Int*, send_proc_capacity, HYPRE_MEMORY_HOST); starting_dofs = hypre_TReAlloc(starting_dofs, HYPRE_Int*, send_proc_capacity, HYPRE_MEMORY_HOST); num_starting_dofs = hypre_TReAlloc(num_starting_dofs, HYPRE_Int, send_proc_capacity, HYPRE_MEMORY_HOST); send_dof_capacities = hypre_TReAlloc(send_dof_capacities, HYPRE_Int, send_proc_capacity, HYPRE_MEMORY_HOST); distances = hypre_TReAlloc(distances, HYPRE_Int*, send_proc_capacity, HYPRE_MEMORY_HOST); send_dof_maps = hypre_TReAlloc(send_dof_maps, hypre_UnorderedIntMap*, send_proc_capacity, HYPRE_MEMORY_HOST); } hypre_AMGDDCommPkgNumSendProcs(compGridCommPkg)[level]++; hypre_AMGDDCommPkgSendProcs(compGridCommPkg)[level][p_idx] = proc_id; hypre_AMGDDCommPkgSendFlag(compGridCommPkg)[level][p_idx] = hypre_CTAlloc(HYPRE_Int*, hypre_AMGDDCommPkgNumLevels(compGridCommPkg), HYPRE_MEMORY_HOST); hypre_AMGDDCommPkgNumSendNodes(compGridCommPkg)[level][p_idx] = hypre_CTAlloc(HYPRE_Int, hypre_AMGDDCommPkgNumLevels(compGridCommPkg), HYPRE_MEMORY_HOST); send_dof_capacities[p_idx] = num_requested_dofs; hypre_AMGDDCommPkgSendFlag(compGridCommPkg)[level][p_idx][level] = hypre_CTAlloc(HYPRE_Int, send_dof_capacities[p_idx], HYPRE_MEMORY_HOST); distances[p_idx] = hypre_CTAlloc(HYPRE_Int, send_dof_capacities[p_idx], HYPRE_MEMORY_HOST); send_dof_maps[p_idx] = hypre_CTAlloc(hypre_UnorderedIntMap, 1, HYPRE_MEMORY_HOST); hypre_UnorderedIntMapCreate(send_dof_maps[p_idx], 2 * max_distance * num_requested_dofs, 16 * hypre_NumThreads()); // !!! Is this a "safe" upper bound on map size? starting_dofs[p_idx] = hypre_CTAlloc(HYPRE_Int, num_requested_dofs, HYPRE_MEMORY_HOST); num_starting_dofs[p_idx] = 0; } else { if (starting_dofs[p_idx]) { starting_dofs[p_idx] = hypre_TReAlloc(starting_dofs[p_idx], HYPRE_Int, num_starting_dofs[p_idx] + num_requested_dofs, HYPRE_MEMORY_HOST); } else { starting_dofs[p_idx] = hypre_CTAlloc(HYPRE_Int, num_requested_dofs, HYPRE_MEMORY_HOST); } } // Loop over the requested dofs for this destination proc HYPRE_Int j; for (j = 0; j < num_requested_dofs; j++) { // Get the local index for this dof on this processor HYPRE_Int req_dof_local_index = recv_buffers[i][cnt++] - hypre_ParCSRMatrixFirstRowIndex(A); HYPRE_Int req_dof_incoming_dist = recv_buffers[i][cnt++]; // If this proc alreay has send dofs, look up to see whether this dof is already accounted for HYPRE_Int d_idx = -1; if (!new_proc) { d_idx = hypre_UnorderedIntMapGet(send_dof_maps[p_idx], req_dof_local_index); } // If dof is not found, then add local index and distance info, and add to starting dofs if (d_idx < 0) { d_idx = hypre_AMGDDCommPkgNumSendNodes(compGridCommPkg)[level][p_idx][level]; // Realloc if necessary if (d_idx == send_dof_capacities[p_idx]) { send_dof_capacities[p_idx] *= 2; hypre_AMGDDCommPkgSendFlag(compGridCommPkg)[level][p_idx][level] = hypre_TReAlloc( hypre_AMGDDCommPkgSendFlag(compGridCommPkg)[level][p_idx][level], HYPRE_Int, send_dof_capacities[p_idx], HYPRE_MEMORY_HOST); distances[p_idx] = hypre_TReAlloc(distances[p_idx], HYPRE_Int, send_dof_capacities[p_idx], HYPRE_MEMORY_HOST); } hypre_AMGDDCommPkgNumSendNodes(compGridCommPkg)[level][p_idx][level]++; hypre_AMGDDCommPkgSendFlag(compGridCommPkg)[level][p_idx][level][d_idx] = req_dof_local_index; hypre_UnorderedIntMapPutIfAbsent(send_dof_maps[p_idx], req_dof_local_index, d_idx); distances[p_idx][d_idx] = req_dof_incoming_dist; starting_dofs[p_idx][ num_starting_dofs[p_idx]++ ] = d_idx; } // If dof is found, but at a closer distance (larger dist value), then update distances and add to starting dofs else if (distances[p_idx][d_idx] < req_dof_incoming_dist) { distances[p_idx][d_idx] = req_dof_incoming_dist; starting_dofs[p_idx][ num_starting_dofs[p_idx]++ ] = d_idx; } } } } // Clean up memory for (i = 0; i < csr_num_sends; i++) { hypre_TFree(recv_buffers[i], HYPRE_MEMORY_HOST); } for (i = 0; i < csr_num_recvs; i++) { hypre_TFree(send_buffers[i], HYPRE_MEMORY_HOST); } hypre_TFree(recv_buffers, HYPRE_MEMORY_HOST); hypre_TFree(send_buffers, HYPRE_MEMORY_HOST); hypre_TFree(recv_sizes, HYPRE_MEMORY_HOST); hypre_TFree(send_sizes, HYPRE_MEMORY_HOST); // Return ptrs in case of reallocation (*distances_ptr) = distances; (*send_dof_maps_ptr) = send_dof_maps; (*send_proc_capacity_ptr) = send_proc_capacity; (*send_dof_capacities_ptr) = send_dof_capacities; (*recv_proc_capacity_ptr) = recv_proc_capacity; (*starting_dofs_ptr) = starting_dofs; (*num_starting_dofs_ptr) = num_starting_dofs; return hypre_error_flag; } HYPRE_Int hypre_BoomerAMGDD_SetupNearestProcessorNeighbors( hypre_ParCSRMatrix *A, hypre_AMGDDCommPkg *compGridCommPkg, HYPRE_Int level, HYPRE_Int *padding, HYPRE_Int num_ghost_layers) { hypre_ParCSRCommPkg *commPkg = hypre_ParCSRMatrixCommPkg(A); HYPRE_Int start, finish; HYPRE_Int i, j; HYPRE_Int num_levels = hypre_AMGDDCommPkgNumLevels(compGridCommPkg); HYPRE_Int max_distance = padding[level] + num_ghost_layers; // Get the default (distance 1) number of send and recv procs HYPRE_Int csr_num_sends = hypre_ParCSRCommPkgNumSends(commPkg); HYPRE_Int csr_num_recvs = hypre_ParCSRCommPkgNumRecvs(commPkg); // If csr_num_sends and csr_num_recvs are zero, then simply note that in compGridCommPkg and we are done if (csr_num_sends == 0 && csr_num_recvs == 0) { hypre_AMGDDCommPkgNumSendProcs(compGridCommPkg)[level] = 0; hypre_AMGDDCommPkgNumRecvProcs(compGridCommPkg)[level] = 0; } else { // Initialize send info (send procs, send dofs, starting dofs, distances, map for lookups in send dofs) hypre_AMGDDCommPkgNumSendProcs(compGridCommPkg)[level] = csr_num_sends; HYPRE_Int send_proc_capacity = 2 * csr_num_sends; hypre_AMGDDCommPkgSendProcs(compGridCommPkg)[level] = hypre_CTAlloc(HYPRE_Int, send_proc_capacity, HYPRE_MEMORY_HOST); hypre_AMGDDCommPkgNumSendNodes(compGridCommPkg)[level] = hypre_CTAlloc(HYPRE_Int*, send_proc_capacity, HYPRE_MEMORY_HOST); hypre_AMGDDCommPkgSendFlag(compGridCommPkg)[level] = hypre_CTAlloc(HYPRE_Int**, send_proc_capacity, HYPRE_MEMORY_HOST); HYPRE_Int *num_starting_dofs = hypre_CTAlloc(HYPRE_Int, send_proc_capacity, HYPRE_MEMORY_HOST); HYPRE_Int *send_dof_capacities = hypre_CTAlloc(HYPRE_Int, send_proc_capacity, HYPRE_MEMORY_HOST); HYPRE_Int **starting_dofs = hypre_CTAlloc(HYPRE_Int*, send_proc_capacity, HYPRE_MEMORY_HOST); HYPRE_Int **distances = hypre_CTAlloc(HYPRE_Int*, send_proc_capacity, HYPRE_MEMORY_HOST); hypre_UnorderedIntMap **send_dof_maps = hypre_CTAlloc(hypre_UnorderedIntMap*, send_proc_capacity, HYPRE_MEMORY_HOST); for (i = 0; i < csr_num_sends; i++) { hypre_AMGDDCommPkgSendProcs(compGridCommPkg)[level][i] = hypre_ParCSRCommPkgSendProc(commPkg, i); start = hypre_ParCSRCommPkgSendMapStart(commPkg, i); finish = hypre_ParCSRCommPkgSendMapStart(commPkg, i + 1); HYPRE_Int num_send_dofs = finish - start; send_dof_capacities[i] = max_distance * num_send_dofs; num_starting_dofs[i] = num_send_dofs; hypre_AMGDDCommPkgNumSendNodes(compGridCommPkg)[level][i] = hypre_CTAlloc(HYPRE_Int, num_levels, HYPRE_MEMORY_HOST); hypre_AMGDDCommPkgNumSendNodes(compGridCommPkg)[level][i][level] = num_send_dofs; hypre_AMGDDCommPkgSendFlag(compGridCommPkg)[level][i] = hypre_CTAlloc(HYPRE_Int*, num_levels, HYPRE_MEMORY_HOST); hypre_AMGDDCommPkgSendFlag(compGridCommPkg)[level][i][level] = hypre_CTAlloc(HYPRE_Int, send_dof_capacities[i], HYPRE_MEMORY_HOST); starting_dofs[i] = hypre_CTAlloc(HYPRE_Int, num_send_dofs, HYPRE_MEMORY_HOST); distances[i] = hypre_CTAlloc(HYPRE_Int, send_dof_capacities[i], HYPRE_MEMORY_HOST); send_dof_maps[i] = hypre_CTAlloc(hypre_UnorderedIntMap, 1, HYPRE_MEMORY_HOST); hypre_UnorderedIntMapCreate(send_dof_maps[i], 2 * max_distance * num_send_dofs, // !!! Is this a "safe" upper bound on the map size? 16 * hypre_NumThreads()); for (j = start; j < finish; j++) { HYPRE_Int send_dof = hypre_ParCSRCommPkgSendMapElmt(commPkg, j); hypre_AMGDDCommPkgSendFlag(compGridCommPkg)[level][i][level][j - start] = send_dof; starting_dofs[i][j - start] = j - start; distances[i][j - start] = max_distance; hypre_UnorderedIntMapPutIfAbsent(send_dof_maps[i], send_dof, j - start); } } //Initialize the recv_procs hypre_AMGDDCommPkgNumRecvProcs(compGridCommPkg)[level] = csr_num_recvs; HYPRE_Int recv_proc_capacity = 2 * csr_num_recvs; hypre_AMGDDCommPkgRecvProcs(compGridCommPkg)[level] = hypre_CTAlloc(HYPRE_Int, recv_proc_capacity, HYPRE_MEMORY_HOST); for (i = 0; i < csr_num_recvs; i++) { hypre_AMGDDCommPkgRecvProcs(compGridCommPkg)[level][i] = hypre_ParCSRCommPkgRecvProc(commPkg, i); } // Iteratively communicate with longer and longer distance neighbors to grow the communication stencils for (i = 0; i < max_distance - 1; i++) { hypre_BoomerAMGDD_FindNeighborProcessors(A, compGridCommPkg, &distances, &send_dof_maps, &send_proc_capacity, &send_dof_capacities, &recv_proc_capacity, &starting_dofs, &num_starting_dofs, level, max_distance); } // Update sendflag to encode ghost layers with negative mapped indices and enforce global index ordering beyond original send dofs for (i = 0; i < hypre_AMGDDCommPkgNumSendProcs(compGridCommPkg)[level]; i++) { HYPRE_Int num_orig_sends = 0; if (i < csr_num_sends) { num_orig_sends = hypre_ParCSRCommPkgSendMapStart(commPkg, i + 1) - hypre_ParCSRCommPkgSendMapStart(commPkg, i); } hypre_qsort0(hypre_AMGDDCommPkgSendFlag(compGridCommPkg)[level][i][level], num_orig_sends, hypre_AMGDDCommPkgNumSendNodes(compGridCommPkg)[level][i][level] - 1); for (j = num_orig_sends; j < hypre_AMGDDCommPkgNumSendNodes(compGridCommPkg)[level][i][level]; j++) { if (distances[i][j] <= num_ghost_layers) { hypre_AMGDDCommPkgSendFlag(compGridCommPkg)[level][i][level][j] = -(hypre_AMGDDCommPkgSendFlag( compGridCommPkg)[level][i][level][j] + 1 ); } } } // Clean up memory for (i = 0; i < hypre_AMGDDCommPkgNumSendProcs(compGridCommPkg)[level]; i++) { if (starting_dofs[i]) { hypre_TFree(starting_dofs[i], HYPRE_MEMORY_HOST); } if (distances[i]) { hypre_TFree(distances[i], HYPRE_MEMORY_HOST); } if (send_dof_maps[i]) { hypre_UnorderedIntMapDestroy(send_dof_maps[i]); hypre_TFree(send_dof_maps[i], HYPRE_MEMORY_HOST); } } hypre_TFree(num_starting_dofs, HYPRE_MEMORY_HOST); hypre_TFree(send_dof_capacities, HYPRE_MEMORY_HOST); hypre_TFree(starting_dofs, HYPRE_MEMORY_HOST); hypre_TFree(distances, HYPRE_MEMORY_HOST); hypre_TFree(send_dof_maps, HYPRE_MEMORY_HOST); } return hypre_error_flag; } HYPRE_Int hypre_BoomerAMGDD_UnpackRecvBuffer( hypre_ParAMGDDData *amgdd_data, HYPRE_Int *recv_buffer, HYPRE_Int **A_tmp_info, HYPRE_Int *recv_map_send_buffer_size, HYPRE_Int *nodes_added_on_level, HYPRE_Int current_level, HYPRE_Int buffer_number ) { // recv_buffer = [ num_psi_levels , [level] , [level] , ... ] // level = [ num send nodes, [global indices] , [coarse global indices] , [A row sizes] , [A col ind] ] hypre_ParAMGData *amg_data = hypre_ParAMGDDDataAMG(amgdd_data); hypre_AMGDDCompGrid **compGrid = hypre_ParAMGDDDataCompGrid(amgdd_data); hypre_AMGDDCommPkg *compGridCommPkg = hypre_ParAMGDDDataCommPkg(amgdd_data); hypre_ParCSRCommPkg *commPkg = hypre_ParCSRMatrixCommPkg(hypre_ParAMGDataAArray( amg_data)[current_level]); HYPRE_Int num_levels = hypre_ParAMGDataNumLevels(amg_data); HYPRE_Int ****recv_map = hypre_AMGDDCommPkgRecvMap(compGridCommPkg); HYPRE_Int ***num_recv_nodes = hypre_AMGDDCommPkgNumRecvNodes(compGridCommPkg); HYPRE_Int ****recv_red_marker = hypre_AMGDDCommPkgRecvRedMarker(compGridCommPkg); HYPRE_Int level, i, j, cnt; HYPRE_Int num_psi_levels; HYPRE_Int level_start; HYPRE_Int add_node_cnt; // initialize the counter cnt = 0; // get the number of levels received num_psi_levels = recv_buffer[cnt++]; // Init the recv_map_send_buffer_size !!! I think this can just be set a priori instead of counting it up in this function... !!! *recv_map_send_buffer_size = num_levels - current_level - 1; //////////////////////////////////////////////////////////////////// // Treat current_level specially: no redundancy here, and recv positions need to agree with original ParCSRCommPkg (extra comp grid points at the end) //////////////////////////////////////////////////////////////////// // Get the compgrid matrix, specifically the nonowned parts that will be added to hypre_AMGDDCompGridMatrix *A = hypre_AMGDDCompGridA(compGrid[current_level]); hypre_CSRMatrix *nonowned_diag = hypre_AMGDDCompGridMatrixNonOwnedDiag(A); hypre_CSRMatrix *nonowned_offd = hypre_AMGDDCompGridMatrixNonOwnedOffd(A); // get the number of nodes on this level num_recv_nodes[current_level][buffer_number][current_level] = recv_buffer[cnt++]; nodes_added_on_level[current_level] += num_recv_nodes[current_level][buffer_number][current_level]; // if necessary, reallocate more space for nonowned dofs HYPRE_Int max_nonowned = hypre_CSRMatrixNumRows(nonowned_diag); HYPRE_Int start_extra_dofs = hypre_AMGDDCompGridNumNonOwnedNodes(compGrid[current_level]); if (num_recv_nodes[current_level][buffer_number][current_level] + start_extra_dofs > max_nonowned) { HYPRE_Int new_size = (HYPRE_Int)hypre_ceil(1.5 * max_nonowned); if (new_size < num_recv_nodes[current_level][buffer_number][current_level] + start_extra_dofs) { new_size = num_recv_nodes[current_level][buffer_number][current_level] + start_extra_dofs; } hypre_AMGDDCompGridResize(compGrid[current_level], new_size, current_level != num_levels - 1); // !!! Is there a better way to manage memory? !!! } // Get the original number of recv dofs in the ParCSRCommPkg (if this proc was recv'd from in original) HYPRE_Int num_original_recv_dofs = 0; if (commPkg) if (buffer_number < hypre_ParCSRCommPkgNumRecvs(commPkg)) { num_original_recv_dofs = hypre_ParCSRCommPkgRecvVecStart(commPkg, buffer_number + 1) - hypre_ParCSRCommPkgRecvVecStart(commPkg, buffer_number); } // Skip over original commPkg recv dofs !!! Optimization: can avoid sending GIDs here HYPRE_Int remaining_dofs = num_recv_nodes[current_level][buffer_number][current_level] - num_original_recv_dofs; cnt += num_original_recv_dofs; // Setup the recv map on current level recv_map[current_level][buffer_number][current_level] = hypre_CTAlloc(HYPRE_Int, num_recv_nodes[current_level][buffer_number][current_level], HYPRE_MEMORY_HOST); for (i = 0; i < num_original_recv_dofs; i++) { recv_map[current_level][buffer_number][current_level][i] = i + hypre_ParCSRCommPkgRecvVecStart( commPkg, buffer_number) + hypre_AMGDDCompGridNumOwnedNodes(compGrid[current_level]); } // Unpack global indices and setup sort and invsort hypre_AMGDDCompGridNumNonOwnedNodes(compGrid[current_level]) += remaining_dofs; HYPRE_Int *sort_map = hypre_AMGDDCompGridNonOwnedSort(compGrid[current_level]); HYPRE_Int *inv_sort_map = hypre_AMGDDCompGridNonOwnedInvSort(compGrid[current_level]); HYPRE_Int *new_inv_sort_map = hypre_CTAlloc(HYPRE_Int, hypre_CSRMatrixNumRows(nonowned_diag), hypre_AMGDDCompGridMemoryLocation(compGrid[current_level])); HYPRE_Int sort_cnt = 0; HYPRE_Int compGrid_cnt = 0; HYPRE_Int incoming_cnt = 0; while (incoming_cnt < remaining_dofs && compGrid_cnt < start_extra_dofs) { // !!! Optimization: don't have to do these assignments every time... probably doesn't save much (i.e. only update incoming_global_index when necessary, etc.) HYPRE_Int incoming_global_index = recv_buffer[cnt]; HYPRE_Int compGrid_global_index = hypre_AMGDDCompGridNonOwnedGlobalIndices( compGrid[current_level])[ inv_sort_map[compGrid_cnt] ]; HYPRE_Int incoming_is_real = 1; if (incoming_global_index < 0) { incoming_global_index = -(incoming_global_index + 1); incoming_is_real = 0; } if (incoming_global_index < compGrid_global_index) { // Set global index and real marker for incoming extra dof hypre_AMGDDCompGridNonOwnedGlobalIndices(compGrid[current_level])[ incoming_cnt + start_extra_dofs ] = incoming_global_index; hypre_AMGDDCompGridNonOwnedRealMarker(compGrid[current_level])[ incoming_cnt + start_extra_dofs ] = incoming_is_real; if (incoming_is_real) { recv_map[current_level][buffer_number][current_level][incoming_cnt + num_original_recv_dofs] = incoming_cnt + start_extra_dofs + hypre_AMGDDCompGridNumOwnedNodes(compGrid[current_level]); } else { recv_map[current_level][buffer_number][current_level][incoming_cnt + num_original_recv_dofs] = - (incoming_cnt + start_extra_dofs + hypre_AMGDDCompGridNumOwnedNodes(compGrid[current_level]) + 1); } sort_map[ incoming_cnt + start_extra_dofs ] = sort_cnt; new_inv_sort_map[sort_cnt] = incoming_cnt + start_extra_dofs; sort_cnt++; incoming_cnt++; cnt++; } else { sort_map[ inv_sort_map[compGrid_cnt] ] = sort_cnt; new_inv_sort_map[sort_cnt] = inv_sort_map[compGrid_cnt]; compGrid_cnt++; sort_cnt++; } } while (incoming_cnt < remaining_dofs) { HYPRE_Int incoming_global_index = recv_buffer[cnt]; HYPRE_Int incoming_is_real = 1; if (incoming_global_index < 0) { incoming_global_index = -(incoming_global_index + 1); incoming_is_real = 0; } hypre_AMGDDCompGridNonOwnedGlobalIndices(compGrid[current_level])[ incoming_cnt + start_extra_dofs ] = incoming_global_index; hypre_AMGDDCompGridNonOwnedRealMarker(compGrid[current_level])[ incoming_cnt + start_extra_dofs ] = incoming_is_real; if (incoming_is_real) { recv_map[current_level][buffer_number][current_level][incoming_cnt + num_original_recv_dofs] = incoming_cnt + start_extra_dofs + hypre_AMGDDCompGridNumOwnedNodes(compGrid[current_level]); } else { recv_map[current_level][buffer_number][current_level][incoming_cnt + num_original_recv_dofs] = - (incoming_cnt + start_extra_dofs + hypre_AMGDDCompGridNumOwnedNodes(compGrid[current_level]) + 1); } sort_map[ incoming_cnt + start_extra_dofs ] = sort_cnt; new_inv_sort_map[sort_cnt] = incoming_cnt + start_extra_dofs; sort_cnt++; incoming_cnt++; cnt++; } while (compGrid_cnt < start_extra_dofs) { sort_map[ inv_sort_map[compGrid_cnt] ] = sort_cnt; new_inv_sort_map[sort_cnt] = inv_sort_map[compGrid_cnt]; compGrid_cnt++; sort_cnt++; } hypre_TFree(inv_sort_map, hypre_AMGDDCompGridMemoryLocation(compGrid[current_level])); hypre_AMGDDCompGridNonOwnedInvSort(compGrid[current_level]) = new_inv_sort_map; // Unpack coarse global indices (need these for original commPkg recvs as well). // NOTE: store global indices for now, will be adjusted to local indices during SetupLocalIndices if (current_level != num_levels - 1) { for (i = 0; i < num_original_recv_dofs; i++) { HYPRE_Int coarse_index = recv_buffer[cnt++]; if (coarse_index != -1) { coarse_index = -(coarse_index + 2); } // Marking coarse indices that need setup by negative mapping hypre_AMGDDCompGridNonOwnedCoarseIndices(compGrid[current_level])[i + hypre_ParCSRCommPkgRecvVecStart(commPkg, buffer_number)] = coarse_index; } for (i = 0; i < remaining_dofs; i++) { HYPRE_Int coarse_index = recv_buffer[cnt++]; if (coarse_index != -1) { coarse_index = -(coarse_index + 2); } // Marking coarse indices that need setup by negative mapping hypre_AMGDDCompGridNonOwnedCoarseIndices(compGrid[current_level])[i + start_extra_dofs] = coarse_index; } } // Unpack the col indices of A HYPRE_Int row_sizes_start = cnt; cnt += num_recv_nodes[current_level][buffer_number][current_level]; // Setup col indices for original commPkg dofs for (i = 0; i < num_original_recv_dofs; i++) { HYPRE_Int diag_rowptr = hypre_CSRMatrixI(nonowned_diag)[ hypre_ParCSRCommPkgRecvVecStart(commPkg, buffer_number) + i ]; HYPRE_Int offd_rowptr = hypre_CSRMatrixI(nonowned_offd)[ hypre_ParCSRCommPkgRecvVecStart(commPkg, buffer_number) + i ]; HYPRE_Int row_size = recv_buffer[ i + row_sizes_start ]; for (j = 0; j < row_size; j++) { HYPRE_Int incoming_index = recv_buffer[cnt++]; // Incoming is a global index (could be owned or nonowned) if (incoming_index < 0) { incoming_index = -(incoming_index + 1); // See whether global index is owned on this proc (if so, can directly setup appropriate local index) if (incoming_index >= hypre_AMGDDCompGridFirstGlobalIndex(compGrid[current_level]) && incoming_index <= hypre_AMGDDCompGridLastGlobalIndex(compGrid[current_level])) { // Add to offd if (offd_rowptr >= hypre_CSRMatrixNumNonzeros(nonowned_offd)) { hypre_CSRMatrixResize(nonowned_offd, hypre_CSRMatrixNumRows(nonowned_offd), hypre_CSRMatrixNumCols(nonowned_offd), (HYPRE_Int)hypre_ceil(1.5 * hypre_CSRMatrixNumNonzeros(nonowned_offd) + 1)); } hypre_CSRMatrixJ(nonowned_offd)[offd_rowptr++] = incoming_index - hypre_AMGDDCompGridFirstGlobalIndex(compGrid[current_level]); } else { // Add to diag (global index, not in buffer, so we store global index and get a local index during SetupLocalIndices) if (diag_rowptr >= hypre_CSRMatrixNumNonzeros(nonowned_diag)) { hypre_AMGDDCompGridNonOwnedDiagMissingColIndices(compGrid[current_level]) = hypre_TReAlloc_v2( hypre_AMGDDCompGridNonOwnedDiagMissingColIndices(compGrid[current_level]), HYPRE_Int, hypre_CSRMatrixNumNonzeros(nonowned_diag), HYPRE_Int, (HYPRE_Int)hypre_ceil(1.5 * hypre_CSRMatrixNumNonzeros(nonowned_diag) + 1), hypre_AMGDDCompGridMemoryLocation(compGrid[current_level])); hypre_CSRMatrixResize(nonowned_diag, hypre_CSRMatrixNumRows(nonowned_diag), hypre_CSRMatrixNumCols(nonowned_diag), (HYPRE_Int)hypre_ceil(1.5 * hypre_CSRMatrixNumNonzeros(nonowned_diag) + 1)); } hypre_AMGDDCompGridNonOwnedDiagMissingColIndices( compGrid[current_level])[ hypre_AMGDDCompGridNumMissingColIndices(compGrid[current_level])++ ] = diag_rowptr; hypre_CSRMatrixJ(nonowned_diag)[diag_rowptr++] = -(incoming_index + 1); } } // Incoming is an index to dofs within the buffer (by construction, nonowned) else { // Add to diag (index is within buffer, so we can directly go to local index) if (diag_rowptr >= hypre_CSRMatrixNumNonzeros(nonowned_diag)) { hypre_AMGDDCompGridNonOwnedDiagMissingColIndices(compGrid[current_level]) = hypre_TReAlloc_v2( hypre_AMGDDCompGridNonOwnedDiagMissingColIndices(compGrid[current_level]), HYPRE_Int, hypre_CSRMatrixNumNonzeros(nonowned_diag), HYPRE_Int, (HYPRE_Int)hypre_ceil(1.5 * hypre_CSRMatrixNumNonzeros(nonowned_diag) + 1), hypre_AMGDDCompGridMemoryLocation(compGrid[current_level])); hypre_CSRMatrixResize(nonowned_diag, hypre_CSRMatrixNumRows(nonowned_diag), hypre_CSRMatrixNumCols(nonowned_diag), (HYPRE_Int)hypre_ceil(1.5 * hypre_CSRMatrixNumNonzeros(nonowned_diag) + 1)); } if (incoming_index < num_original_recv_dofs) { hypre_CSRMatrixJ(nonowned_diag)[diag_rowptr++] = incoming_index + hypre_ParCSRCommPkgRecvVecStart( commPkg, buffer_number); } else { hypre_CSRMatrixJ(nonowned_diag)[diag_rowptr++] = incoming_index - num_original_recv_dofs + start_extra_dofs; } } } // Update row pointers hypre_CSRMatrixI(nonowned_diag)[ hypre_ParCSRCommPkgRecvVecStart(commPkg, buffer_number) + i + 1 ] = diag_rowptr; hypre_CSRMatrixI(nonowned_offd)[ hypre_ParCSRCommPkgRecvVecStart(commPkg, buffer_number) + i + 1 ] = offd_rowptr; } // Temporary storage for extra comp grid dofs on this level (will be setup after all recv's during SetupLocalIndices) // A_tmp_info[buffer_number] = [ size, [row], size, [row], ... ] HYPRE_Int A_tmp_info_size = 1 + remaining_dofs; for (i = num_original_recv_dofs; i < num_recv_nodes[current_level][buffer_number][current_level]; i++) { HYPRE_Int row_size = recv_buffer[ i + row_sizes_start ]; A_tmp_info_size += row_size; } A_tmp_info[buffer_number] = hypre_CTAlloc(HYPRE_Int, A_tmp_info_size, hypre_AMGDDCompGridMemoryLocation(compGrid[current_level])); HYPRE_Int A_tmp_info_cnt = 0; A_tmp_info[buffer_number][A_tmp_info_cnt++] = remaining_dofs; for (i = num_original_recv_dofs; i < num_recv_nodes[current_level][buffer_number][current_level]; i++) { HYPRE_Int row_size = recv_buffer[ i + row_sizes_start ]; A_tmp_info[buffer_number][A_tmp_info_cnt++] = row_size; for (j = 0; j < row_size; j++) { A_tmp_info[buffer_number][A_tmp_info_cnt++] = recv_buffer[cnt++]; } } //////////////////////////////////////////////////////////////////// // loop over coarser psi levels //////////////////////////////////////////////////////////////////// for (level = current_level + 1; level < current_level + num_psi_levels; level++) { // get the number of nodes on this level num_recv_nodes[current_level][buffer_number][level] = recv_buffer[cnt++]; level_start = cnt; *recv_map_send_buffer_size += num_recv_nodes[current_level][buffer_number][level]; A = hypre_AMGDDCompGridA(compGrid[level]); nonowned_diag = hypre_AMGDDCompGridMatrixNonOwnedDiag(A); nonowned_offd = hypre_AMGDDCompGridMatrixNonOwnedOffd(A); HYPRE_Int num_nonowned = hypre_AMGDDCompGridNumNonOwnedNodes(compGrid[level]); HYPRE_Int diag_rowptr = hypre_CSRMatrixI(nonowned_diag)[ num_nonowned ]; HYPRE_Int offd_rowptr = hypre_CSRMatrixI(nonowned_offd)[ num_nonowned ]; // Incoming nodes and existing (non-owned) nodes in the comp grid are both sorted by global index, so here we merge these lists together (getting rid of redundant nodes along the way) add_node_cnt = 0; // NOTE: Don't free incoming_dest because we set that as recv_map and use it outside this function HYPRE_Int *incoming_dest = hypre_CTAlloc(HYPRE_Int, num_recv_nodes[current_level][buffer_number][level], HYPRE_MEMORY_HOST); recv_red_marker[current_level][buffer_number][level] = hypre_CTAlloc(HYPRE_Int, num_recv_nodes[current_level][buffer_number][level], HYPRE_MEMORY_HOST); // if necessary, reallocate more space for compGrid if (num_recv_nodes[current_level][buffer_number][level] + num_nonowned > hypre_CSRMatrixNumRows( nonowned_diag)) { HYPRE_Int new_size = (HYPRE_Int)hypre_ceil(1.5 * hypre_CSRMatrixNumRows(nonowned_diag)); if (new_size < num_recv_nodes[current_level][buffer_number][level] + num_nonowned) { new_size = num_recv_nodes[current_level][buffer_number][level] + num_nonowned; } hypre_AMGDDCompGridResize(compGrid[level], new_size, level != num_levels - 1); // !!! Is there a better way to manage memory? !!! } sort_map = hypre_AMGDDCompGridNonOwnedSort(compGrid[level]); inv_sort_map = hypre_AMGDDCompGridNonOwnedInvSort(compGrid[level]); new_inv_sort_map = hypre_CTAlloc(HYPRE_Int, hypre_CSRMatrixNumRows(nonowned_diag), hypre_AMGDDCompGridMemoryLocation(compGrid[level])); sort_cnt = 0; compGrid_cnt = 0; incoming_cnt = 0; HYPRE_Int dest = num_nonowned; while (incoming_cnt < num_recv_nodes[current_level][buffer_number][level] && compGrid_cnt < num_nonowned) { HYPRE_Int incoming_global_index = recv_buffer[cnt]; HYPRE_Int incoming_is_real = 1; if (incoming_global_index < 0) { incoming_global_index = -(incoming_global_index + 1); incoming_is_real = 0; } // If incoming is owned, go on to the next if (incoming_global_index >= hypre_AMGDDCompGridFirstGlobalIndex(compGrid[level]) && incoming_global_index <= hypre_AMGDDCompGridLastGlobalIndex(compGrid[level])) { recv_red_marker[current_level][buffer_number][level][incoming_cnt] = 1; if (incoming_is_real) { incoming_dest[incoming_cnt] = incoming_global_index - hypre_AMGDDCompGridFirstGlobalIndex( compGrid[level]); // Save location info for use below } else { incoming_dest[incoming_cnt] = -(incoming_global_index - hypre_AMGDDCompGridFirstGlobalIndex( compGrid[level]) + 1); // Save location info for use below } incoming_cnt++; cnt++; } // Otherwise, merge else { HYPRE_Int compGrid_global_index = hypre_AMGDDCompGridNonOwnedGlobalIndices( compGrid[level])[ inv_sort_map[compGrid_cnt] ]; if (incoming_global_index < compGrid_global_index) { sort_map[dest] = sort_cnt; new_inv_sort_map[sort_cnt] = dest; if (incoming_is_real) { incoming_dest[incoming_cnt] = dest + hypre_AMGDDCompGridNumOwnedNodes(compGrid[level]); } else { incoming_dest[incoming_cnt] = -(dest + hypre_AMGDDCompGridNumOwnedNodes(compGrid[level]) + 1); } sort_cnt++; incoming_cnt++; dest++; cnt++; add_node_cnt++; } else if (incoming_global_index > compGrid_global_index) { sort_map[ inv_sort_map[compGrid_cnt] ] = sort_cnt; new_inv_sort_map[sort_cnt] = inv_sort_map[compGrid_cnt]; compGrid_cnt++; sort_cnt++; } else { if (incoming_is_real && !hypre_AMGDDCompGridNonOwnedRealMarker(compGrid[level])[ inv_sort_map[compGrid_cnt] ]) { hypre_AMGDDCompGridNonOwnedRealMarker(compGrid[level])[ inv_sort_map[compGrid_cnt] ] = 1; incoming_dest[incoming_cnt] = inv_sort_map[compGrid_cnt] + hypre_AMGDDCompGridNumOwnedNodes( compGrid[level]); // Incoming real dof received to existing ghost location incoming_cnt++; cnt++; } else { recv_red_marker[current_level][buffer_number][level][incoming_cnt] = 1; if (incoming_is_real) { incoming_dest[incoming_cnt] = inv_sort_map[compGrid_cnt] + hypre_AMGDDCompGridNumOwnedNodes( compGrid[level]); // Save location info for use below } else { incoming_dest[incoming_cnt] = -(inv_sort_map[compGrid_cnt] + hypre_AMGDDCompGridNumOwnedNodes( compGrid[level]) + 1); // Save location info for use below } incoming_cnt++; cnt++; } } } } while (incoming_cnt < num_recv_nodes[current_level][buffer_number][level]) { HYPRE_Int incoming_global_index = recv_buffer[cnt]; HYPRE_Int incoming_is_real = 1; if (incoming_global_index < 0) { incoming_global_index = -(incoming_global_index + 1); incoming_is_real = 0; } // If incoming is owned, go on to the next if (incoming_global_index >= hypre_AMGDDCompGridFirstGlobalIndex(compGrid[level]) && incoming_global_index <= hypre_AMGDDCompGridLastGlobalIndex(compGrid[level])) { recv_red_marker[current_level][buffer_number][level][incoming_cnt] = 1; if (incoming_is_real) { incoming_dest[incoming_cnt] = incoming_global_index - hypre_AMGDDCompGridFirstGlobalIndex( compGrid[level]); // Save location info for use below } else { incoming_dest[incoming_cnt] = -(incoming_global_index - hypre_AMGDDCompGridFirstGlobalIndex( compGrid[level]) + 1); // Save location info for use below } incoming_cnt++; cnt++; } else { sort_map[dest] = sort_cnt; new_inv_sort_map[sort_cnt] = dest; if (incoming_is_real) { incoming_dest[incoming_cnt] = dest + hypre_AMGDDCompGridNumOwnedNodes(compGrid[level]); } else { incoming_dest[incoming_cnt] = -(dest + hypre_AMGDDCompGridNumOwnedNodes(compGrid[level]) + 1); } sort_cnt++; incoming_cnt++; dest++; cnt++; add_node_cnt++; } } while (compGrid_cnt < num_nonowned) { sort_map[ inv_sort_map[compGrid_cnt] ] = sort_cnt; new_inv_sort_map[sort_cnt] = inv_sort_map[compGrid_cnt]; compGrid_cnt++; sort_cnt++; } nodes_added_on_level[level] += add_node_cnt; // Free the old inv sort map and set new hypre_TFree(inv_sort_map, hypre_AMGDDCompGridMemoryLocation(compGrid[level])); hypre_AMGDDCompGridNonOwnedInvSort(compGrid[level]) = new_inv_sort_map; // Set recv_map[current_level] to incoming_dest recv_map[current_level][buffer_number][level] = incoming_dest; // Now copy in the new nodes to their appropriate positions cnt = level_start; for (i = 0; i < num_recv_nodes[current_level][buffer_number][level]; i++) { if (!recv_red_marker[current_level][buffer_number][level][i]) { dest = incoming_dest[i]; if (dest < 0) { dest = -(dest + 1); } dest -= hypre_AMGDDCompGridNumOwnedNodes(compGrid[level]); HYPRE_Int global_index = recv_buffer[cnt]; if (global_index < 0) { global_index = -(global_index + 1); hypre_AMGDDCompGridNonOwnedRealMarker(compGrid[level])[ dest ] = 0; } else { hypre_AMGDDCompGridNonOwnedRealMarker(compGrid[level])[ dest ] = 1; } hypre_AMGDDCompGridNonOwnedGlobalIndices(compGrid[level])[ dest ] = global_index; } cnt++; } if (level != num_levels - 1) { for (i = 0; i < num_recv_nodes[current_level][buffer_number][level]; i++) { if (!recv_red_marker[current_level][buffer_number][level][i]) { dest = incoming_dest[i]; if (dest < 0) { dest = -(dest + 1); } dest -= hypre_AMGDDCompGridNumOwnedNodes(compGrid[level]); HYPRE_Int coarse_index = recv_buffer[cnt]; if (coarse_index != -1) { coarse_index = -(coarse_index + 2); } // Marking coarse indices that need setup by negative mapping hypre_AMGDDCompGridNonOwnedCoarseIndices(compGrid[level])[ dest ] = coarse_index; } cnt++; } } // Setup col indices row_sizes_start = cnt; cnt += num_recv_nodes[current_level][buffer_number][level]; for (i = 0; i < num_recv_nodes[current_level][buffer_number][level]; i++) { HYPRE_Int row_size = recv_buffer[ i + row_sizes_start ]; // !!! Optimization: (probably small gain) right now, I disregard incoming info for real overwriting ghost (internal buf connectivity could be used to avoid a few binary searches later) dest = incoming_dest[i]; if (dest < 0) { dest = -(dest + 1); } dest -= hypre_AMGDDCompGridNumOwnedNodes(compGrid[level]); if (dest >= num_nonowned) { for (j = 0; j < row_size; j++) { HYPRE_Int incoming_index = recv_buffer[cnt++]; // Incoming is a global index (could be owned or nonowned) if (incoming_index < 0) { incoming_index = -(incoming_index + 1); // See whether global index is owned on this proc (if so, can directly setup appropriate local index) if (incoming_index >= hypre_AMGDDCompGridFirstGlobalIndex(compGrid[level]) && incoming_index <= hypre_AMGDDCompGridLastGlobalIndex(compGrid[level])) { // Add to offd if (offd_rowptr >= hypre_CSRMatrixNumNonzeros(nonowned_offd)) { hypre_CSRMatrixResize(nonowned_offd, hypre_CSRMatrixNumRows(nonowned_offd), hypre_CSRMatrixNumCols(nonowned_offd), (HYPRE_Int)hypre_ceil(1.5 * hypre_CSRMatrixNumNonzeros(nonowned_offd) + 1)); } hypre_CSRMatrixJ(nonowned_offd)[offd_rowptr++] = incoming_index - hypre_AMGDDCompGridFirstGlobalIndex(compGrid[level]); } else { // Add to diag (global index, not in buffer, so we store global index and get a local index during SetupLocalIndices) if (diag_rowptr >= hypre_CSRMatrixNumNonzeros(nonowned_diag)) { hypre_AMGDDCompGridNonOwnedDiagMissingColIndices(compGrid[level]) = hypre_TReAlloc_v2( hypre_AMGDDCompGridNonOwnedDiagMissingColIndices(compGrid[level]), HYPRE_Int, hypre_CSRMatrixNumNonzeros(nonowned_diag), HYPRE_Int, (HYPRE_Int)hypre_ceil(1.5 * hypre_CSRMatrixNumNonzeros(nonowned_diag) + 1), hypre_AMGDDCompGridMemoryLocation(compGrid[level])); hypre_CSRMatrixResize(nonowned_diag, hypre_CSRMatrixNumRows(nonowned_diag), hypre_CSRMatrixNumCols(nonowned_diag), (HYPRE_Int)hypre_ceil(1.5 * hypre_CSRMatrixNumNonzeros(nonowned_diag) + 1)); } hypre_AMGDDCompGridNonOwnedDiagMissingColIndices( compGrid[level])[ hypre_AMGDDCompGridNumMissingColIndices(compGrid[level])++ ] = diag_rowptr; hypre_CSRMatrixJ(nonowned_diag)[diag_rowptr++] = -(incoming_index + 1); } } // Incoming is an index to dofs within the buffer (could be owned or nonowned) else { HYPRE_Int local_index = incoming_dest[ incoming_index ]; if (local_index < 0) { local_index = -(local_index + 1); } // Check whether dof is owned or nonowned if (local_index < hypre_AMGDDCompGridNumOwnedNodes(compGrid[level])) { // Add to offd if (offd_rowptr >= hypre_CSRMatrixNumNonzeros(nonowned_offd)) { hypre_CSRMatrixResize(nonowned_offd, hypre_CSRMatrixNumRows(nonowned_offd), hypre_CSRMatrixNumCols(nonowned_offd), (HYPRE_Int)hypre_ceil(1.5 * hypre_CSRMatrixNumNonzeros(nonowned_offd) + 1)); } hypre_CSRMatrixJ(nonowned_offd)[offd_rowptr++] = local_index; } else { // Add to diag (index is within buffer, so we can directly go to local index) if (diag_rowptr >= hypre_CSRMatrixNumNonzeros(nonowned_diag)) { hypre_AMGDDCompGridNonOwnedDiagMissingColIndices(compGrid[level]) = hypre_TReAlloc_v2( hypre_AMGDDCompGridNonOwnedDiagMissingColIndices(compGrid[level]), HYPRE_Int, hypre_CSRMatrixNumNonzeros(nonowned_diag), HYPRE_Int, (HYPRE_Int)hypre_ceil(1.5 * hypre_CSRMatrixNumNonzeros(nonowned_diag) + 1), hypre_AMGDDCompGridMemoryLocation(compGrid[level])); hypre_CSRMatrixResize(nonowned_diag, hypre_CSRMatrixNumRows(nonowned_diag), hypre_CSRMatrixNumCols(nonowned_diag), (HYPRE_Int)hypre_ceil(1.5 * hypre_CSRMatrixNumNonzeros(nonowned_diag) + 1)); } hypre_CSRMatrixJ(nonowned_diag)[diag_rowptr++] = local_index - hypre_AMGDDCompGridNumOwnedNodes( compGrid[level]); } } } // Update row pointers hypre_CSRMatrixI(nonowned_diag)[ dest + 1 ] = diag_rowptr; hypre_CSRMatrixI(nonowned_offd)[ dest + 1 ] = offd_rowptr; } else { cnt += row_size; } } hypre_AMGDDCompGridNumNonOwnedNodes(compGrid[level]) += add_node_cnt; } return hypre_error_flag; } HYPRE_Int hypre_BoomerAMGDD_PackColInd( HYPRE_Int *send_flag, HYPRE_Int num_send_nodes, HYPRE_Int *add_flag, hypre_AMGDDCompGrid *compGrid, HYPRE_Int *send_buffer, HYPRE_Int starting_cnt) { HYPRE_Int i, j, send_elmt, add_flag_index; HYPRE_Int cnt = starting_cnt; HYPRE_Int total_num_nodes = hypre_AMGDDCompGridNumOwnedNodes(compGrid) + hypre_AMGDDCompGridNumNonOwnedNodes(compGrid); for (i = 0; i < num_send_nodes; i++) { send_elmt = send_flag[i]; if (send_elmt < 0) { send_elmt = -(send_elmt + 1); } // Owned point if (send_elmt < hypre_AMGDDCompGridNumOwnedNodes(compGrid)) { hypre_CSRMatrix *diag = hypre_AMGDDCompGridMatrixOwnedDiag(hypre_AMGDDCompGridA(compGrid)); hypre_CSRMatrix *offd = hypre_AMGDDCompGridMatrixOwnedOffd(hypre_AMGDDCompGridA(compGrid)); // Get diag connections for (j = hypre_CSRMatrixI(diag)[send_elmt]; j < hypre_CSRMatrixI(diag)[send_elmt + 1]; j++) { add_flag_index = hypre_CSRMatrixJ(diag)[j]; if (add_flag[add_flag_index] > 0) { send_buffer[cnt++] = add_flag[add_flag_index] - 1; // Buffer connection } else { send_buffer[cnt++] = -(add_flag_index + hypre_AMGDDCompGridFirstGlobalIndex( compGrid) + 1); // -(GID + 1) } } // Get offd connections for (j = hypre_CSRMatrixI(offd)[send_elmt]; j < hypre_CSRMatrixI(offd)[send_elmt + 1]; j++) { add_flag_index = hypre_CSRMatrixJ(offd)[j] + hypre_AMGDDCompGridNumOwnedNodes(compGrid); if (add_flag[add_flag_index] > 0) { send_buffer[cnt++] = add_flag[add_flag_index] - 1; // Buffer connection } else { send_buffer[cnt++] = -(hypre_AMGDDCompGridNonOwnedGlobalIndices(compGrid)[ hypre_CSRMatrixJ( offd)[j] ] + 1); // -(GID + 1) } } } // NonOwned point else if (send_elmt < total_num_nodes) { HYPRE_Int nonowned_index = send_elmt - hypre_AMGDDCompGridNumOwnedNodes(compGrid); hypre_CSRMatrix *diag = hypre_AMGDDCompGridMatrixNonOwnedDiag(hypre_AMGDDCompGridA(compGrid)); hypre_CSRMatrix *offd = hypre_AMGDDCompGridMatrixNonOwnedOffd(hypre_AMGDDCompGridA(compGrid)); // Get diag connections for (j = hypre_CSRMatrixI(diag)[nonowned_index]; j < hypre_CSRMatrixI(diag)[nonowned_index + 1]; j++) { if (hypre_CSRMatrixJ(diag)[j] >= 0) { add_flag_index = hypre_CSRMatrixJ(diag)[j] + hypre_AMGDDCompGridNumOwnedNodes(compGrid); if (add_flag[add_flag_index] > 0) { send_buffer[cnt++] = add_flag[add_flag_index] - 1; // Buffer connection } else { send_buffer[cnt++] = -(hypre_AMGDDCompGridNonOwnedGlobalIndices(compGrid)[ hypre_CSRMatrixJ( diag)[j] ] + 1); // -(GID + 1) } } else { send_buffer[cnt++] = hypre_CSRMatrixJ(diag)[j]; // -(GID + 1) } } // Get offd connections for (j = hypre_CSRMatrixI(offd)[nonowned_index]; j < hypre_CSRMatrixI(offd)[nonowned_index + 1]; j++) { add_flag_index = hypre_CSRMatrixJ(offd)[j]; if (add_flag[add_flag_index] > 0) { send_buffer[cnt++] = add_flag[add_flag_index] - 1; // Buffer connection } else { send_buffer[cnt++] = -(add_flag_index + hypre_AMGDDCompGridFirstGlobalIndex( compGrid) + 1); // -(GID + 1) } } } else { send_flag[i] = send_elmt - total_num_nodes; } } return cnt; } HYPRE_Int hypre_BoomerAMGDD_MarkCoarse(HYPRE_Int *list, HYPRE_Int *marker, HYPRE_Int *owned_coarse_indices, HYPRE_Int *nonowned_coarse_indices, HYPRE_Int *sort_map, HYPRE_Int num_owned, HYPRE_Int total_num_nodes, HYPRE_Int num_owned_coarse, HYPRE_Int list_size, HYPRE_Int dist, HYPRE_Int use_sort, HYPRE_Int *nodes_to_add) { HYPRE_Int i, coarse_index; for (i = 0; i < list_size; i++) { HYPRE_Int idx = list[i]; if (idx >= 0) { if (idx >= total_num_nodes) { idx -= total_num_nodes; } if (idx < num_owned) { coarse_index = owned_coarse_indices[idx]; if (coarse_index >= 0) { marker[ coarse_index ] = dist; (*nodes_to_add) = 1; } } else { idx -= num_owned; coarse_index = nonowned_coarse_indices[idx]; if (coarse_index >= 0) { if (use_sort) { coarse_index = sort_map[ coarse_index ] + num_owned_coarse; } else { coarse_index = coarse_index + num_owned_coarse; } marker[ coarse_index ] = dist; (*nodes_to_add) = 1; } } } } return hypre_error_flag; } HYPRE_Int* hypre_BoomerAMGDD_AddFlagToSendFlag( hypre_AMGDDCompGrid *compGrid, HYPRE_Int *add_flag, HYPRE_Int *num_send_nodes, HYPRE_Int num_ghost_layers ) { HYPRE_Int i, cnt, add_flag_index; HYPRE_Int total_num_nodes = hypre_AMGDDCompGridNumOwnedNodes(compGrid) + hypre_AMGDDCompGridNumNonOwnedNodes(compGrid); for (i = 0; i < total_num_nodes; i++) { if (add_flag[i] > 0) { (*num_send_nodes)++; } } HYPRE_Int *inv_sort_map = hypre_AMGDDCompGridNonOwnedInvSort(compGrid); HYPRE_Int *send_flag = hypre_CTAlloc( HYPRE_Int, (*num_send_nodes), HYPRE_MEMORY_HOST ); cnt = 0; i = 0; // First the nonowned indices coming before the owned block if (hypre_AMGDDCompGridNumNonOwnedNodes(compGrid)) { while (hypre_AMGDDCompGridNonOwnedGlobalIndices(compGrid)[inv_sort_map[i]] < hypre_AMGDDCompGridFirstGlobalIndex(compGrid)) { add_flag_index = i + hypre_AMGDDCompGridNumOwnedNodes(compGrid); if (add_flag[add_flag_index] > num_ghost_layers) { send_flag[cnt] = inv_sort_map[i] + hypre_AMGDDCompGridNumOwnedNodes(compGrid); cnt++; } else if (add_flag[add_flag_index] > 0) { send_flag[cnt] = -(inv_sort_map[i] + hypre_AMGDDCompGridNumOwnedNodes(compGrid) + 1); cnt++; } i++; if (i == hypre_AMGDDCompGridNumNonOwnedNodes(compGrid)) { break; } } } // Then the owned block for (add_flag_index = 0; add_flag_index < hypre_AMGDDCompGridNumOwnedNodes(compGrid); add_flag_index++) { if (add_flag[add_flag_index] > num_ghost_layers) { send_flag[cnt] = add_flag_index; cnt++; } else if (add_flag[add_flag_index] > 0) { send_flag[cnt] = -(add_flag_index + 1); cnt++; } } // Finally the nonowned indices coming after the owned block while (i < hypre_AMGDDCompGridNumNonOwnedNodes(compGrid)) { add_flag_index = i + hypre_AMGDDCompGridNumOwnedNodes(compGrid); if (add_flag[add_flag_index] > num_ghost_layers) { send_flag[cnt] = inv_sort_map[i] + hypre_AMGDDCompGridNumOwnedNodes(compGrid); cnt++; } else if (add_flag[add_flag_index] > 0) { send_flag[cnt] = -(inv_sort_map[i] + hypre_AMGDDCompGridNumOwnedNodes(compGrid) + 1); cnt++; } i++; } return send_flag; } HYPRE_Int hypre_BoomerAMGDD_SubtractLists( hypre_AMGDDCompGrid *compGrid, HYPRE_Int *current_list, HYPRE_Int *current_list_length, HYPRE_Int *prev_list, HYPRE_Int prev_list_length ) { // send_flag's are in global index ordering on each level, so can merge HYPRE_Int prev_cnt = 0; HYPRE_Int current_cnt = 0; HYPRE_Int new_cnt = 0; while (current_cnt < (*current_list_length) && prev_cnt < prev_list_length) { // Get the global indices HYPRE_Int current_global_index = hypre_BoomerAMGDD_LocalToGlobalIndex(compGrid, current_list[current_cnt]); HYPRE_Int prev_global_index = hypre_BoomerAMGDD_LocalToGlobalIndex(compGrid, prev_list[prev_cnt]); // Do the merge if (current_global_index > prev_global_index) { prev_cnt++; } else if (current_global_index < prev_global_index) { current_list[new_cnt] = current_list[current_cnt]; new_cnt++; current_cnt++; } else { // Special treatment for ghosts sent later as real if (prev_list[prev_cnt] < 0 && current_list[current_cnt] >= 0) { // This is the case of real dof sent to overwrite ghost. // Current list is a positive local index here. Map beyond the range of total dofs to mark. if (current_list[current_cnt] < hypre_AMGDDCompGridNumOwnedNodes(compGrid) + hypre_AMGDDCompGridNumNonOwnedNodes(compGrid)) { current_list[new_cnt] = current_list[current_cnt] + hypre_AMGDDCompGridNumOwnedNodes( compGrid) + hypre_AMGDDCompGridNumNonOwnedNodes(compGrid); } else { current_list[new_cnt] = current_list[current_cnt]; } new_cnt++; current_cnt++; prev_cnt++; } else { prev_cnt++; current_cnt++; } } } while (current_cnt < (*current_list_length)) { current_list[new_cnt] = current_list[current_cnt]; new_cnt++; current_cnt++; } (*current_list_length) = new_cnt; return hypre_error_flag; } HYPRE_Int hypre_BoomerAMGDD_RemoveRedundancy( hypre_ParAMGData *amg_data, HYPRE_Int ****send_flag, HYPRE_Int ***num_send_nodes, hypre_AMGDDCompGrid **compGrid, hypre_AMGDDCommPkg *compGridCommPkg, HYPRE_Int current_level, HYPRE_Int proc, HYPRE_Int level ) { HYPRE_Int current_send_proc = hypre_AMGDDCommPkgSendProcs(compGridCommPkg)[current_level][proc]; HYPRE_Int prev_proc, prev_level; for (prev_level = current_level + 1; prev_level <= level; prev_level++) { hypre_ParCSRCommPkg *original_commPkg = hypre_ParCSRMatrixCommPkg(hypre_ParAMGDataAArray( amg_data)[prev_level]); for (prev_proc = 0; prev_proc < hypre_AMGDDCommPkgNumSendProcs(compGridCommPkg)[prev_level]; prev_proc++) { if (hypre_AMGDDCommPkgSendProcs(compGridCommPkg)[prev_level][prev_proc] == current_send_proc) { HYPRE_Int prev_list_end = num_send_nodes[prev_level][prev_proc][level]; if (prev_level == level) { HYPRE_Int original_proc; for (original_proc = 0; original_proc < hypre_ParCSRCommPkgNumSends(original_commPkg); original_proc++) { if (hypre_ParCSRCommPkgSendProc(original_commPkg, original_proc) == current_send_proc) { prev_list_end = hypre_ParCSRCommPkgSendMapStart(original_commPkg, original_proc + 1) - hypre_ParCSRCommPkgSendMapStart(original_commPkg, original_proc); break; } } } hypre_BoomerAMGDD_SubtractLists(compGrid[level], send_flag[current_level][proc][level], &(num_send_nodes[current_level][proc][level]), send_flag[prev_level][prev_proc][level], prev_list_end); if (num_send_nodes[prev_level][prev_proc][level] - prev_list_end > 0) { hypre_BoomerAMGDD_SubtractLists(compGrid[level], send_flag[current_level][proc][level], &(num_send_nodes[current_level][proc][level]), &(send_flag[prev_level][prev_proc][level][prev_list_end]), num_send_nodes[prev_level][prev_proc][level] - prev_list_end); } } } for (prev_proc = 0; prev_proc < hypre_AMGDDCommPkgNumRecvProcs(compGridCommPkg)[prev_level]; prev_proc++) { if (hypre_AMGDDCommPkgRecvProcs(compGridCommPkg)[prev_level][prev_proc] == current_send_proc) { HYPRE_Int prev_list_end = hypre_AMGDDCommPkgNumRecvNodes( compGridCommPkg)[prev_level][prev_proc][level]; if (prev_level == level) { HYPRE_Int original_proc; for (original_proc = 0; original_proc < hypre_ParCSRCommPkgNumRecvs(original_commPkg); original_proc++) { if (hypre_ParCSRCommPkgRecvProc(original_commPkg, original_proc) == current_send_proc) { prev_list_end = hypre_ParCSRCommPkgRecvVecStart(original_commPkg, original_proc + 1) - hypre_ParCSRCommPkgRecvVecStart(original_commPkg, original_proc); break; } } } hypre_BoomerAMGDD_SubtractLists(compGrid[level], send_flag[current_level][proc][level], &(num_send_nodes[current_level][proc][level]), hypre_AMGDDCommPkgRecvMap(compGridCommPkg)[prev_level][prev_proc][level], prev_list_end); if (hypre_AMGDDCommPkgNumRecvNodes(compGridCommPkg)[prev_level][prev_proc][level] - prev_list_end > 0) { hypre_BoomerAMGDD_SubtractLists(compGrid[level], send_flag[current_level][proc][level], &(num_send_nodes[current_level][proc][level]), &(hypre_AMGDDCommPkgRecvMap(compGridCommPkg)[prev_level][prev_proc][level][prev_list_end]), hypre_AMGDDCommPkgNumRecvNodes(compGridCommPkg)[prev_level][prev_proc][level] - prev_list_end); } } } } return hypre_error_flag; } HYPRE_Int hypre_BoomerAMGDD_RecursivelyBuildPsiComposite( HYPRE_Int node, HYPRE_Int m, hypre_AMGDDCompGrid *compGrid, HYPRE_Int *add_flag, HYPRE_Int use_sort) { HYPRE_Int i, index, sort_index; HYPRE_Int error_code = 0; HYPRE_Int *sort_map = hypre_AMGDDCompGridNonOwnedSort(compGrid); hypre_CSRMatrix *diag; hypre_CSRMatrix *offd; HYPRE_Int owned; if (node < hypre_AMGDDCompGridNumOwnedNodes(compGrid)) { owned = 1; diag = hypre_AMGDDCompGridMatrixOwnedDiag( hypre_AMGDDCompGridA(compGrid) ); offd = hypre_AMGDDCompGridMatrixOwnedOffd( hypre_AMGDDCompGridA(compGrid) ); } else { owned = 0; node = node - hypre_AMGDDCompGridNumOwnedNodes(compGrid); diag = hypre_AMGDDCompGridMatrixNonOwnedDiag( hypre_AMGDDCompGridA(compGrid) ); offd = hypre_AMGDDCompGridMatrixNonOwnedOffd( hypre_AMGDDCompGridA(compGrid) ); } // Look at neighbors in diag for (i = hypre_CSRMatrixI(diag)[node]; i < hypre_CSRMatrixI(diag)[node + 1]; i++) { // Get the index of the neighbor index = hypre_CSRMatrixJ(diag)[i]; if (index >= 0) { if (owned) { sort_index = index; } else { if (use_sort) { sort_index = sort_map[index] + hypre_AMGDDCompGridNumOwnedNodes(compGrid); } else { sort_index = index + hypre_AMGDDCompGridNumOwnedNodes(compGrid); } index += hypre_AMGDDCompGridNumOwnedNodes(compGrid); } // If we still need to visit this index (note that add_flag[index] = m means we have already added all distance m-1 neighbors of index) if (add_flag[sort_index] < m) { add_flag[sort_index] = m; // Recursively call to find distance m-1 neighbors of index if (m - 1 > 0) { error_code = hypre_BoomerAMGDD_RecursivelyBuildPsiComposite(index, m - 1, compGrid, add_flag, use_sort); } } } else { error_code = 1; hypre_error_w_msg(HYPRE_ERROR_GENERIC, "WARNING: Negative col index encountered during hypre_BoomerAMGDD_RecursivelyBuildPsiComposite().\n"); } } // Look at neighbors in offd for (i = hypre_CSRMatrixI(offd)[node]; i < hypre_CSRMatrixI(offd)[node + 1]; i++) { // Get the index of the neighbor index = hypre_CSRMatrixJ(offd)[i]; if (index >= 0) { if (!owned) { sort_index = index; } else { if (use_sort) { sort_index = sort_map[index] + hypre_AMGDDCompGridNumOwnedNodes(compGrid); } else { sort_index = index + hypre_AMGDDCompGridNumOwnedNodes(compGrid); } index += hypre_AMGDDCompGridNumOwnedNodes(compGrid); } // If we still need to visit this index (note that add_flag[index] = m means we have already added all distance m-1 neighbors of index) if (add_flag[sort_index] < m) { add_flag[sort_index] = m; // Recursively call to find distance m-1 neighbors of index if (m - 1 > 0) { error_code = hypre_BoomerAMGDD_RecursivelyBuildPsiComposite(index, m - 1, compGrid, add_flag, use_sort); } } } else { error_code = 1; hypre_error_w_msg(HYPRE_ERROR_GENERIC, "WARNING: Negative col index encountered during hypre_BoomerAMGDD_RecursivelyBuildPsiComposite().\n"); } } return error_code; } HYPRE_Int* hypre_BoomerAMGDD_PackSendBuffer( hypre_ParAMGDDData *amgdd_data, HYPRE_Int proc, HYPRE_Int current_level, HYPRE_Int *padding, HYPRE_Int *send_flag_buffer_size ) { // send_buffer = [ num_psi_levels , [level] , [level] , ... ] // level = [ num send nodes, [global indices] , [coarse global indices] , [A row sizes] , [A col ind: either global indices or local col indices within buffer] ] hypre_ParAMGData *amg_data = hypre_ParAMGDDDataAMG(amgdd_data); hypre_AMGDDCompGrid **compGrid = hypre_ParAMGDDDataCompGrid(amgdd_data); hypre_AMGDDCommPkg *compGridCommPkg = hypre_ParAMGDDDataCommPkg(amgdd_data); HYPRE_Int num_levels = hypre_ParAMGDataNumLevels(amg_data); HYPRE_Int num_ghost_layers = hypre_ParAMGDDDataNumGhostLayers(amgdd_data); HYPRE_Int ****send_flag = hypre_AMGDDCommPkgSendFlag(compGridCommPkg); HYPRE_Int ***num_send_nodes = hypre_AMGDDCommPkgNumSendNodes(compGridCommPkg); HYPRE_Int **send_buffer_size = hypre_AMGDDCommPkgSendBufferSize(compGridCommPkg); HYPRE_Int **add_flag; HYPRE_Int *send_buffer; hypre_CSRMatrix *diag; hypre_CSRMatrix *offd; HYPRE_MemoryLocation memory_location; HYPRE_Int level, i, ii, cnt, row_length, send_elmt, add_flag_index; HYPRE_Int nodes_to_add = 0; HYPRE_Int num_psi_levels = 1; HYPRE_Int total_num_nodes; HYPRE_Int nonowned_index; HYPRE_Int nonowned_coarse_index; // initialize send map buffer size (*send_flag_buffer_size) = num_levels - current_level - 1; ////////////////////////////////////////////////////////////////////////////////////////////////////////////// // Mark the nodes to send (including Psi_c grid plus ghost nodes) ////////////////////////////////////////////////////////////////////////////////////////////////////////////// // Count up the buffer size for the starting nodes add_flag = hypre_CTAlloc(HYPRE_Int *, num_levels, HYPRE_MEMORY_HOST); total_num_nodes = hypre_AMGDDCompGridNumOwnedNodes(compGrid[current_level]) + hypre_AMGDDCompGridNumNonOwnedNodes(compGrid[current_level]); memory_location = hypre_AMGDDCompGridMemoryLocation(compGrid[current_level]); add_flag[current_level] = hypre_CTAlloc(HYPRE_Int, total_num_nodes, memory_location); send_buffer_size[current_level][proc] += 2; if (current_level != num_levels - 1) { send_buffer_size[current_level][proc] += 3 * num_send_nodes[current_level][proc][current_level]; } else { send_buffer_size[current_level][proc] += 2 * num_send_nodes[current_level][proc][current_level]; } for (i = 0; i < num_send_nodes[current_level][proc][current_level]; i++) { send_elmt = send_flag[current_level][proc][current_level][i]; if (send_elmt < 0) { send_elmt = -(send_elmt + 1); } add_flag[current_level][send_elmt] = i + 1; diag = hypre_AMGDDCompGridMatrixOwnedDiag(hypre_AMGDDCompGridA(compGrid[current_level])); offd = hypre_AMGDDCompGridMatrixOwnedOffd(hypre_AMGDDCompGridA(compGrid[current_level])); send_buffer_size[current_level][proc] += hypre_CSRMatrixI(diag)[send_elmt + 1] - hypre_CSRMatrixI( diag)[send_elmt]; send_buffer_size[current_level][proc] += hypre_CSRMatrixI(offd)[send_elmt + 1] - hypre_CSRMatrixI( offd)[send_elmt]; } // Add the nodes listed by the coarse grid counterparts if applicable // Note that the compGridCommPkg is set up to list all nodes within the padding plus ghost layers if (current_level != num_levels - 1) { total_num_nodes = hypre_AMGDDCompGridNumOwnedNodes(compGrid[current_level + 1]) + hypre_AMGDDCompGridNumNonOwnedNodes(compGrid[current_level + 1]); memory_location = hypre_AMGDDCompGridMemoryLocation(compGrid[current_level + 1]); add_flag[current_level + 1] = hypre_CTAlloc(HYPRE_Int, total_num_nodes, memory_location); total_num_nodes = hypre_AMGDDCompGridNumOwnedNodes(compGrid[current_level]) + hypre_AMGDDCompGridNumNonOwnedNodes(compGrid[current_level]); hypre_BoomerAMGDD_MarkCoarse(send_flag[current_level][proc][current_level], add_flag[current_level + 1], hypre_AMGDDCompGridOwnedCoarseIndices(compGrid[current_level]), hypre_AMGDDCompGridNonOwnedCoarseIndices(compGrid[current_level]), hypre_AMGDDCompGridNonOwnedSort(compGrid[current_level + 1]), hypre_AMGDDCompGridNumOwnedNodes(compGrid[current_level]), total_num_nodes, hypre_AMGDDCompGridNumOwnedNodes(compGrid[current_level + 1]), num_send_nodes[current_level][proc][current_level], padding[current_level + 1] + num_ghost_layers + 1, 1, &nodes_to_add); } ////////////////////////////////////////////////////////////////////////////////////////////////////////////// // Now build out the psi_c composite grid (along with required ghost nodes) on coarser levels ////////////////////////////////////////////////////////////////////////////////////////////////////////////// for (level = current_level + 1; level < num_levels; level++) { // if there are nodes to add on this grid if (nodes_to_add) { num_psi_levels++; send_buffer_size[current_level][proc]++; nodes_to_add = 0; // if we need coarse info, allocate space for the add flag on the next level if (level != num_levels - 1) { total_num_nodes = hypre_AMGDDCompGridNumOwnedNodes(compGrid[level + 1]) + hypre_AMGDDCompGridNumNonOwnedNodes(compGrid[level + 1]); memory_location = hypre_AMGDDCompGridMemoryLocation(compGrid[current_level + 1]); add_flag[level + 1] = hypre_CTAlloc(HYPRE_Int, total_num_nodes, memory_location); } // Expand by the padding on this level and add coarse grid counterparts if applicable total_num_nodes = hypre_AMGDDCompGridNumOwnedNodes(compGrid[level]) + hypre_AMGDDCompGridNumNonOwnedNodes(compGrid[level]); for (i = 0; i < total_num_nodes; i++) { if (i < hypre_AMGDDCompGridNumOwnedNodes(compGrid[level])) { add_flag_index = i; } else { ii = i - hypre_AMGDDCompGridNumOwnedNodes(compGrid[level]); add_flag_index = hypre_AMGDDCompGridNonOwnedSort(compGrid[level])[ii] + hypre_AMGDDCompGridNumOwnedNodes(compGrid[level]); } if (add_flag[level][add_flag_index] == padding[level] + num_ghost_layers + 1) { hypre_BoomerAMGDD_RecursivelyBuildPsiComposite(i, padding[level] + num_ghost_layers, compGrid[level], add_flag[level], 1); } } send_flag[current_level][proc][level] = hypre_BoomerAMGDD_AddFlagToSendFlag(compGrid[level], add_flag[level], &(num_send_nodes[current_level][proc][level]), num_ghost_layers); // Compare with previous send/recvs to eliminate redundant info hypre_BoomerAMGDD_RemoveRedundancy(amg_data, send_flag, num_send_nodes, compGrid, compGridCommPkg, current_level, proc, level); // Mark the points to start from on the next level if (level != num_levels - 1) { total_num_nodes = hypre_AMGDDCompGridNumOwnedNodes(compGrid[level]) + hypre_AMGDDCompGridNumNonOwnedNodes(compGrid[level]); hypre_BoomerAMGDD_MarkCoarse(send_flag[current_level][proc][level], add_flag[level + 1], hypre_AMGDDCompGridOwnedCoarseIndices(compGrid[level]), hypre_AMGDDCompGridNonOwnedCoarseIndices(compGrid[level]), hypre_AMGDDCompGridNonOwnedSort(compGrid[level + 1]), hypre_AMGDDCompGridNumOwnedNodes(compGrid[level]), total_num_nodes, hypre_AMGDDCompGridNumOwnedNodes(compGrid[level + 1]), num_send_nodes[current_level][proc][level], padding[level + 1] + num_ghost_layers + 1, 1, &nodes_to_add); } // Count up the buffer sizes and adjust the add_flag total_num_nodes = hypre_AMGDDCompGridNumOwnedNodes(compGrid[level]) + hypre_AMGDDCompGridNumNonOwnedNodes(compGrid[level]); hypre_Memset(add_flag[level], 0, sizeof(HYPRE_Int)*total_num_nodes, memory_location); (*send_flag_buffer_size) += num_send_nodes[current_level][proc][level]; if (level != num_levels - 1) { send_buffer_size[current_level][proc] += 3 * num_send_nodes[current_level][proc][level]; } else { send_buffer_size[current_level][proc] += 2 * num_send_nodes[current_level][proc][level]; } for (i = 0; i < num_send_nodes[current_level][proc][level]; i++) { send_elmt = send_flag[current_level][proc][level][i]; if (send_elmt < 0) { send_elmt = -(send_elmt + 1); } if (send_elmt < hypre_AMGDDCompGridNumOwnedNodes(compGrid[level])) { add_flag[level][send_elmt] = i + 1; diag = hypre_AMGDDCompGridMatrixOwnedDiag(hypre_AMGDDCompGridA(compGrid[level])); offd = hypre_AMGDDCompGridMatrixOwnedOffd(hypre_AMGDDCompGridA(compGrid[level])); send_buffer_size[current_level][proc] += hypre_CSRMatrixI(diag)[send_elmt + 1] - hypre_CSRMatrixI( diag)[send_elmt]; send_buffer_size[current_level][proc] += hypre_CSRMatrixI(offd)[send_elmt + 1] - hypre_CSRMatrixI( offd)[send_elmt]; } else if (send_elmt < hypre_AMGDDCompGridNumOwnedNodes(compGrid[level]) + hypre_AMGDDCompGridNumNonOwnedNodes(compGrid[level])) { add_flag[level][send_elmt] = i + 1; send_elmt -= hypre_AMGDDCompGridNumOwnedNodes(compGrid[level]); diag = hypre_AMGDDCompGridMatrixNonOwnedDiag(hypre_AMGDDCompGridA(compGrid[level])); offd = hypre_AMGDDCompGridMatrixNonOwnedOffd(hypre_AMGDDCompGridA(compGrid[level])); send_buffer_size[current_level][proc] += hypre_CSRMatrixI(diag)[send_elmt + 1] - hypre_CSRMatrixI( diag)[send_elmt]; send_buffer_size[current_level][proc] += hypre_CSRMatrixI(offd)[send_elmt + 1] - hypre_CSRMatrixI( offd)[send_elmt]; } else { send_elmt -= hypre_AMGDDCompGridNumOwnedNodes(compGrid[level]) + hypre_AMGDDCompGridNumNonOwnedNodes(compGrid[level]); add_flag[level][send_elmt] = i + 1; } } } else { break; } } ////////////////////////////////////////////////////////////////////////////////////////////////////////////// // Pack the buffer ////////////////////////////////////////////////////////////////////////////////////////////////////////////// send_buffer = hypre_CTAlloc(HYPRE_Int, send_buffer_size[current_level][proc], HYPRE_MEMORY_HOST); send_buffer[0] = num_psi_levels; cnt = 1; for (level = current_level; level < current_level + num_psi_levels; level++) { total_num_nodes = hypre_AMGDDCompGridNumOwnedNodes(compGrid[level]) + hypre_AMGDDCompGridNumNonOwnedNodes(compGrid[level]); // store the number of nodes on this level send_buffer[cnt++] = num_send_nodes[current_level][proc][level]; // copy all global indices for (i = 0; i < num_send_nodes[current_level][proc][level]; i++) { send_elmt = send_flag[current_level][proc][level][i]; if (send_elmt < 0) { send_elmt = -(send_elmt + 1); if (send_elmt < hypre_AMGDDCompGridNumOwnedNodes(compGrid[level])) { send_buffer[cnt++] = -(send_elmt + hypre_AMGDDCompGridFirstGlobalIndex(compGrid[level]) + 1); } else { send_buffer[cnt++] = -(hypre_AMGDDCompGridNonOwnedGlobalIndices(compGrid[level])[ send_elmt - hypre_AMGDDCompGridNumOwnedNodes(compGrid[level]) ] + 1); } } else { if (send_elmt >= total_num_nodes) { send_elmt -= total_num_nodes; } if (send_elmt < hypre_AMGDDCompGridNumOwnedNodes(compGrid[level])) { send_buffer[cnt++] = send_elmt + hypre_AMGDDCompGridFirstGlobalIndex(compGrid[level]); } else { send_buffer[cnt++] = hypre_AMGDDCompGridNonOwnedGlobalIndices(compGrid[level])[send_elmt - hypre_AMGDDCompGridNumOwnedNodes(compGrid[level])]; } } } // if not on last level, copy coarse gobal indices if (level != num_levels - 1) { for (i = 0; i < num_send_nodes[current_level][proc][level]; i++) { send_elmt = send_flag[current_level][proc][level][i]; if (send_elmt < 0) { send_elmt = -(send_elmt + 1); } else if (send_elmt >= total_num_nodes) { send_elmt -= total_num_nodes; } if (send_elmt < hypre_AMGDDCompGridNumOwnedNodes(compGrid[level])) { if (hypre_AMGDDCompGridOwnedCoarseIndices(compGrid[level])[ send_elmt ] >= 0) { send_buffer[cnt++] = hypre_AMGDDCompGridOwnedCoarseIndices(compGrid[level])[send_elmt] + hypre_AMGDDCompGridFirstGlobalIndex(compGrid[level + 1]); } else { send_buffer[cnt++] = hypre_AMGDDCompGridOwnedCoarseIndices(compGrid[level])[send_elmt]; } } else { nonowned_index = send_elmt - hypre_AMGDDCompGridNumOwnedNodes(compGrid[level]); nonowned_coarse_index = hypre_AMGDDCompGridNonOwnedCoarseIndices(compGrid[level])[nonowned_index]; if (nonowned_coarse_index >= 0) { send_buffer[cnt++] = hypre_AMGDDCompGridNonOwnedGlobalIndices(compGrid[level + 1])[ nonowned_coarse_index ]; } else if (nonowned_coarse_index == -1) { send_buffer[cnt++] = nonowned_coarse_index; } else { send_buffer[cnt++] = -(nonowned_coarse_index + 2); } } } } // store the row length for matrix A for (i = 0; i < num_send_nodes[current_level][proc][level]; i++) { send_elmt = send_flag[current_level][proc][level][i]; if (send_elmt < 0) { send_elmt = -(send_elmt + 1); } if (send_elmt < hypre_AMGDDCompGridNumOwnedNodes(compGrid[level])) { diag = hypre_AMGDDCompGridMatrixOwnedDiag(hypre_AMGDDCompGridA(compGrid[level])); offd = hypre_AMGDDCompGridMatrixOwnedOffd(hypre_AMGDDCompGridA(compGrid[level])); row_length = hypre_CSRMatrixI(diag)[send_elmt + 1] - hypre_CSRMatrixI(diag)[send_elmt] + hypre_CSRMatrixI(offd)[send_elmt + 1] - hypre_CSRMatrixI(offd)[send_elmt]; } else if (send_elmt < total_num_nodes) { nonowned_index = send_elmt - hypre_AMGDDCompGridNumOwnedNodes(compGrid[level]); diag = hypre_AMGDDCompGridMatrixNonOwnedDiag(hypre_AMGDDCompGridA(compGrid[level])); offd = hypre_AMGDDCompGridMatrixNonOwnedOffd(hypre_AMGDDCompGridA(compGrid[level])); row_length = hypre_CSRMatrixI(diag)[nonowned_index + 1] - hypre_CSRMatrixI(diag)[nonowned_index] + hypre_CSRMatrixI(offd)[nonowned_index + 1] - hypre_CSRMatrixI(offd)[nonowned_index]; } else { row_length = 0; /* send_flag[current_level][proc][level][i] -= hypre_AMGDDCompGridNumOwnedNodes(compGrid[level]) + hypre_AMGDDCompGridNumNonOwnedNodes(compGrid[level]); */ } send_buffer[cnt++] = row_length; } // copy indices for matrix A (local connectivity within buffer where available, global index otherwise) cnt = hypre_BoomerAMGDD_PackColInd(send_flag[current_level][proc][level], num_send_nodes[current_level][proc][level], add_flag[level], compGrid[level], send_buffer, cnt); } // Clean up memory for (level = 0; level < num_levels; level++) { if (add_flag[level]) { hypre_TFree(add_flag[level], hypre_AMGDDCompGridMemoryLocation(compGrid[level])); } } hypre_TFree(add_flag, HYPRE_MEMORY_HOST); // Return the send buffer return send_buffer; } HYPRE_Int hypre_BoomerAMGDD_PackRecvMapSendBuffer( HYPRE_Int *recv_map_send_buffer, HYPRE_Int **recv_red_marker, HYPRE_Int *num_recv_nodes, HYPRE_Int *recv_buffer_size, HYPRE_Int current_level, HYPRE_Int num_levels ) { HYPRE_Int level, i, cnt, num_nodes; cnt = 0; *recv_buffer_size = 0; for (level = current_level + 1; level < num_levels; level++) { // if there were nodes in psiComposite on this level if (recv_red_marker[level]) { // store the number of nodes on this level num_nodes = num_recv_nodes[level]; recv_map_send_buffer[cnt++] = num_nodes; for (i = 0; i < num_nodes; i++) { // store the map values for each node recv_map_send_buffer[cnt++] = recv_red_marker[level][i]; } } // otherwise record that there were zero nodes on this level else { recv_map_send_buffer[cnt++] = 0; } } return hypre_error_flag; } HYPRE_Int hypre_BoomerAMGDD_UnpackSendFlagBuffer( hypre_AMGDDCompGrid **compGrid, HYPRE_Int *send_flag_buffer, HYPRE_Int **send_flag, HYPRE_Int *num_send_nodes, HYPRE_Int *send_buffer_size, HYPRE_Int current_level, HYPRE_Int num_levels ) { HYPRE_UNUSED_VAR(compGrid); HYPRE_Int level, i, cnt, num_nodes; cnt = 0; *send_buffer_size = 0; for (level = current_level + 1; level < num_levels; level++) { num_nodes = send_flag_buffer[cnt++]; num_send_nodes[level] = 0; for (i = 0; i < num_nodes; i++) { if (send_flag_buffer[cnt++] == 0) { send_flag[level][ num_send_nodes[level]++ ] = send_flag[level][i]; (*send_buffer_size)++; } } send_flag[level] = hypre_TReAlloc(send_flag[level], HYPRE_Int, num_send_nodes[level], HYPRE_MEMORY_HOST); } return hypre_error_flag; } HYPRE_Int hypre_BoomerAMGDD_CommunicateRemainingMatrixInfo( hypre_ParAMGDDData* amgdd_data ) { hypre_ParAMGData *amg_data = hypre_ParAMGDDDataAMG(amgdd_data); hypre_AMGDDCompGrid **compGrid = hypre_ParAMGDDDataCompGrid(amgdd_data); hypre_AMGDDCommPkg *compGridCommPkg = hypre_ParAMGDDDataCommPkg(amgdd_data); HYPRE_Int num_levels = hypre_AMGDDCommPkgNumLevels(compGridCommPkg); HYPRE_Int amgdd_start_level = hypre_ParAMGDDDataStartLevel(amgdd_data); hypre_CSRMatrix *diag; hypre_CSRMatrix *offd; HYPRE_Int *P_row_cnt = hypre_CTAlloc(HYPRE_Int, num_levels, HYPRE_MEMORY_HOST); HYPRE_Int *R_row_cnt = hypre_CTAlloc(HYPRE_Int, num_levels, HYPRE_MEMORY_HOST); HYPRE_Int *A_row_cnt = hypre_CTAlloc(HYPRE_Int, num_levels, HYPRE_MEMORY_HOST); HYPRE_Int outer_level, proc, level, i, j; for (outer_level = num_levels - 1; outer_level >= amgdd_start_level; outer_level--) { // Initialize nonowned matrices for P (and R) if (outer_level != num_levels - 1) { hypre_CSRMatrix *P_diag_original = hypre_ParCSRMatrixDiag(hypre_ParAMGDataPArray( amg_data)[outer_level]); hypre_CSRMatrix *P_offd_original = hypre_ParCSRMatrixOffd(hypre_ParAMGDataPArray( amg_data)[outer_level]); HYPRE_Int ave_nnz_per_row = 1; if (hypre_ParAMGDataPMaxElmts(amg_data)) { ave_nnz_per_row = hypre_ParAMGDataPMaxElmts(amg_data); } else if (hypre_CSRMatrixNumRows(P_diag_original)) { ave_nnz_per_row = (HYPRE_Int) (hypre_CSRMatrixNumNonzeros(P_diag_original) / hypre_CSRMatrixNumRows( P_diag_original)); } HYPRE_Int max_nonowned_diag_nnz = hypre_AMGDDCompGridNumNonOwnedNodes( compGrid[outer_level]) * ave_nnz_per_row; HYPRE_Int max_nonowned_offd_nnz = hypre_CSRMatrixNumNonzeros(P_offd_original); hypre_AMGDDCompGridMatrixNonOwnedDiag(hypre_AMGDDCompGridP(compGrid[outer_level])) = hypre_CSRMatrixCreate(hypre_AMGDDCompGridNumNonOwnedNodes(compGrid[outer_level]), hypre_AMGDDCompGridNumNonOwnedNodes(compGrid[outer_level + 1]), max_nonowned_diag_nnz); hypre_CSRMatrixInitialize(hypre_AMGDDCompGridMatrixNonOwnedDiag(hypre_AMGDDCompGridP( compGrid[outer_level]))); hypre_AMGDDCompGridMatrixNonOwnedOffd(hypre_AMGDDCompGridP(compGrid[outer_level])) = hypre_CSRMatrixCreate(hypre_AMGDDCompGridNumNonOwnedNodes(compGrid[outer_level]), hypre_AMGDDCompGridNumOwnedNodes(compGrid[outer_level + 1]), max_nonowned_offd_nnz); hypre_CSRMatrixInitialize(hypre_AMGDDCompGridMatrixNonOwnedOffd(hypre_AMGDDCompGridP( compGrid[outer_level]))); } if (hypre_ParAMGDataRestriction(amg_data) && outer_level != 0) { hypre_CSRMatrix *R_diag_original = hypre_ParCSRMatrixDiag(hypre_ParAMGDataPArray( amg_data)[outer_level - 1]); hypre_CSRMatrix *R_offd_original = hypre_ParCSRMatrixOffd(hypre_ParAMGDataPArray( amg_data)[outer_level - 1]); HYPRE_Int ave_nnz_per_row = 1; if (hypre_CSRMatrixNumRows(R_diag_original)) { ave_nnz_per_row = (HYPRE_Int) (hypre_CSRMatrixNumNonzeros(R_diag_original) / hypre_CSRMatrixNumRows( R_diag_original)); } HYPRE_Int max_nonowned_diag_nnz = hypre_AMGDDCompGridNumNonOwnedNodes( compGrid[outer_level]) * ave_nnz_per_row; HYPRE_Int max_nonowned_offd_nnz = hypre_CSRMatrixNumNonzeros(R_offd_original); hypre_AMGDDCompGridMatrixNonOwnedDiag(hypre_AMGDDCompGridR(compGrid[outer_level - 1])) = hypre_CSRMatrixCreate(hypre_AMGDDCompGridNumNonOwnedNodes(compGrid[outer_level]), hypre_AMGDDCompGridNumNonOwnedNodes(compGrid[outer_level - 1]), max_nonowned_diag_nnz); hypre_CSRMatrixInitialize(hypre_AMGDDCompGridMatrixNonOwnedDiag(hypre_AMGDDCompGridR( compGrid[outer_level - 1]))); hypre_AMGDDCompGridMatrixNonOwnedOffd(hypre_AMGDDCompGridR(compGrid[outer_level - 1])) = hypre_CSRMatrixCreate(hypre_AMGDDCompGridNumNonOwnedNodes(compGrid[outer_level]), hypre_AMGDDCompGridNumOwnedNodes(compGrid[outer_level - 1]), max_nonowned_offd_nnz); hypre_CSRMatrixInitialize(hypre_AMGDDCompGridMatrixNonOwnedOffd(hypre_AMGDDCompGridR( compGrid[outer_level - 1]))); } // Get send/recv info from the comp grid comm pkg HYPRE_Int num_send_procs = hypre_AMGDDCommPkgNumSendProcs(compGridCommPkg)[outer_level]; HYPRE_Int num_recv_procs = hypre_AMGDDCommPkgNumRecvProcs(compGridCommPkg)[outer_level]; HYPRE_Int *send_procs = hypre_AMGDDCommPkgSendProcs(compGridCommPkg)[outer_level]; HYPRE_Int *recv_procs = hypre_AMGDDCommPkgRecvProcs(compGridCommPkg)[outer_level]; if (num_send_procs || num_recv_procs) { //////////////////////////////////// // Get the buffer sizes //////////////////////////////////// HYPRE_Int *send_sizes = hypre_CTAlloc(HYPRE_Int, 2 * num_send_procs, HYPRE_MEMORY_HOST); for (proc = 0; proc < num_send_procs; proc++) { for (level = outer_level; level < num_levels; level++) { HYPRE_Int idx; HYPRE_Int A_row_size = 0; HYPRE_Int P_row_size = 0; HYPRE_Int R_row_size = 0; for (i = 0; i < hypre_AMGDDCommPkgNumSendNodes(compGridCommPkg)[outer_level][proc][level]; i++) { idx = hypre_AMGDDCommPkgSendFlag(compGridCommPkg)[outer_level][proc][level][i]; if (idx < 0) { idx = -(idx + 1); } // Owned diag and offd if (idx < hypre_AMGDDCompGridNumOwnedNodes(compGrid[level])) { diag = hypre_AMGDDCompGridMatrixOwnedDiag(hypre_AMGDDCompGridA(compGrid[level])); offd = hypre_AMGDDCompGridMatrixOwnedOffd(hypre_AMGDDCompGridA(compGrid[level])); A_row_size = hypre_CSRMatrixI(diag)[idx + 1] - hypre_CSRMatrixI(diag)[idx] + hypre_CSRMatrixI(offd)[idx + 1] - hypre_CSRMatrixI(offd)[idx]; if (level != num_levels - 1) { diag = hypre_AMGDDCompGridMatrixOwnedDiag(hypre_AMGDDCompGridP(compGrid[level])); offd = hypre_AMGDDCompGridMatrixOwnedOffd(hypre_AMGDDCompGridP(compGrid[level])); P_row_size = hypre_CSRMatrixI(diag)[idx + 1] - hypre_CSRMatrixI(diag)[idx] + hypre_CSRMatrixI(offd)[idx + 1] - hypre_CSRMatrixI(offd)[idx]; } if (hypre_ParAMGDataRestriction(amg_data) && level != 0) { diag = hypre_AMGDDCompGridMatrixOwnedDiag(hypre_AMGDDCompGridR(compGrid[level - 1])); offd = hypre_AMGDDCompGridMatrixOwnedOffd(hypre_AMGDDCompGridR(compGrid[level - 1])); R_row_size = hypre_CSRMatrixI(diag)[idx + 1] - hypre_CSRMatrixI(diag)[idx] + hypre_CSRMatrixI(offd)[idx + 1] - hypre_CSRMatrixI(offd)[idx]; } } // Nonowned diag and offd else { idx -= hypre_AMGDDCompGridNumOwnedNodes(compGrid[level]); // Count diag and offd diag = hypre_AMGDDCompGridMatrixNonOwnedDiag(hypre_AMGDDCompGridA(compGrid[level])); offd = hypre_AMGDDCompGridMatrixNonOwnedOffd(hypre_AMGDDCompGridA(compGrid[level])); A_row_size = hypre_CSRMatrixI(diag)[idx + 1] - hypre_CSRMatrixI(diag)[idx] + hypre_CSRMatrixI(offd)[idx + 1] - hypre_CSRMatrixI(offd)[idx]; if (level != num_levels - 1) { diag = hypre_AMGDDCompGridMatrixNonOwnedDiag(hypre_AMGDDCompGridP(compGrid[level])); offd = hypre_AMGDDCompGridMatrixNonOwnedOffd(hypre_AMGDDCompGridP(compGrid[level])); P_row_size = hypre_CSRMatrixI(diag)[idx + 1] - hypre_CSRMatrixI(diag)[idx] + hypre_CSRMatrixI(offd)[idx + 1] - hypre_CSRMatrixI(offd)[idx]; } if (hypre_ParAMGDataRestriction(amg_data) && level != 0) { diag = hypre_AMGDDCompGridMatrixNonOwnedDiag(hypre_AMGDDCompGridR(compGrid[level - 1])); offd = hypre_AMGDDCompGridMatrixNonOwnedOffd(hypre_AMGDDCompGridR(compGrid[level - 1])); R_row_size = hypre_CSRMatrixI(diag)[idx + 1] - hypre_CSRMatrixI(diag)[idx] + hypre_CSRMatrixI(offd)[idx + 1] - hypre_CSRMatrixI(offd)[idx]; } } send_sizes[2 * proc] += A_row_size + P_row_size + R_row_size; send_sizes[2 * proc + 1] += A_row_size + P_row_size + R_row_size; } if (level != num_levels - 1) { send_sizes[2 * proc] += hypre_AMGDDCommPkgNumSendNodes(compGridCommPkg)[outer_level][proc][level]; } if (hypre_ParAMGDataRestriction(amg_data) && level != 0) { send_sizes[2 * proc] += hypre_AMGDDCommPkgNumSendNodes(compGridCommPkg)[outer_level][proc][level]; } } } HYPRE_Int **int_recv_buffers = hypre_CTAlloc(HYPRE_Int*, num_recv_procs, HYPRE_MEMORY_HOST); HYPRE_Complex **complex_recv_buffers = hypre_CTAlloc(HYPRE_Complex*, num_recv_procs, HYPRE_MEMORY_HOST); // Communicate buffer sizes hypre_MPI_Request *size_requests = hypre_CTAlloc(hypre_MPI_Request, num_send_procs + num_recv_procs, HYPRE_MEMORY_HOST); HYPRE_Int request_cnt = 0; hypre_MPI_Status *size_statuses = hypre_CTAlloc(hypre_MPI_Status, num_send_procs + num_recv_procs, HYPRE_MEMORY_HOST); HYPRE_Int *recv_sizes = hypre_CTAlloc(HYPRE_Int, 2 * num_recv_procs, HYPRE_MEMORY_HOST); for (proc = 0; proc < num_recv_procs; proc++) { hypre_MPI_Irecv(&(recv_sizes[2 * proc]), 2, HYPRE_MPI_INT, recv_procs[proc], 1, hypre_MPI_COMM_WORLD, &(size_requests[request_cnt++])); } for (proc = 0; proc < num_send_procs; proc++) { hypre_MPI_Isend(&(send_sizes[2 * proc]), 2, HYPRE_MPI_INT, send_procs[proc], 1, hypre_MPI_COMM_WORLD, &(size_requests[request_cnt++])); } //////////////////////////////////// // Pack buffers //////////////////////////////////// // int_send_buffer = [ [level] , [level] , ... , [level] ] // level = [ [A col ind], [P_rows], ( [R_rows] ) ] // P_row = [ row_size, [col_ind] ] // complex_send_buffer = [ [level] , [level] , ... , [level] ] // level = [ [A_data] , [P_data], ( [R_data] ) ] hypre_MPI_Request *buf_requests = hypre_CTAlloc(hypre_MPI_Request, 2 * (num_send_procs + num_recv_procs), HYPRE_MEMORY_HOST); request_cnt = 0; hypre_MPI_Status *buf_statuses = hypre_CTAlloc(hypre_MPI_Status, 2 * (num_send_procs + num_recv_procs), HYPRE_MEMORY_HOST); HYPRE_Int **int_send_buffers = hypre_CTAlloc(HYPRE_Int*, num_send_procs, HYPRE_MEMORY_HOST); HYPRE_Complex **complex_send_buffers = hypre_CTAlloc(HYPRE_Complex*, num_send_procs, HYPRE_MEMORY_HOST); for (proc = 0; proc < num_send_procs; proc++) { int_send_buffers[proc] = hypre_CTAlloc(HYPRE_Int, send_sizes[2 * proc], HYPRE_MEMORY_HOST); complex_send_buffers[proc] = hypre_CTAlloc(HYPRE_Complex, send_sizes[2 * proc + 1], HYPRE_MEMORY_HOST); HYPRE_Int int_cnt = 0; HYPRE_Int complex_cnt = 0; for (level = outer_level; level < num_levels; level++) { // Pack A for (i = 0; i < hypre_AMGDDCommPkgNumSendNodes(compGridCommPkg)[outer_level][proc][level]; i++) { HYPRE_Int idx = hypre_AMGDDCommPkgSendFlag(compGridCommPkg)[outer_level][proc][level][i]; if (idx < 0) { idx = -(idx + 1); } // Owned diag and offd if (idx < hypre_AMGDDCompGridNumOwnedNodes(compGrid[level])) { diag = hypre_AMGDDCompGridMatrixOwnedDiag(hypre_AMGDDCompGridA(compGrid[level])); offd = hypre_AMGDDCompGridMatrixOwnedOffd(hypre_AMGDDCompGridA(compGrid[level])); for (j = hypre_CSRMatrixI(diag)[idx]; j < hypre_CSRMatrixI(diag)[idx + 1]; j++) { int_send_buffers[proc][int_cnt++] = hypre_CSRMatrixJ(diag)[j] + hypre_AMGDDCompGridFirstGlobalIndex( compGrid[level]); complex_send_buffers[proc][complex_cnt++] = hypre_CSRMatrixData(diag)[j]; } for (j = hypre_CSRMatrixI(offd)[idx]; j < hypre_CSRMatrixI(offd)[idx + 1]; j++) { int_send_buffers[proc][int_cnt++] = hypre_AMGDDCompGridNonOwnedGlobalIndices( compGrid[level])[ hypre_CSRMatrixJ(offd)[j] ]; complex_send_buffers[proc][complex_cnt++] = hypre_CSRMatrixData(offd)[j]; } } // Nonowned diag and offd else { idx -= hypre_AMGDDCompGridNumOwnedNodes(compGrid[level]); diag = hypre_AMGDDCompGridMatrixNonOwnedDiag(hypre_AMGDDCompGridA(compGrid[level])); offd = hypre_AMGDDCompGridMatrixNonOwnedOffd(hypre_AMGDDCompGridA(compGrid[level])); for (j = hypre_CSRMatrixI(diag)[idx]; j < hypre_CSRMatrixI(diag)[idx + 1]; j++) { if (hypre_CSRMatrixJ(diag)[j] < 0) { int_send_buffers[proc][int_cnt++] = -(hypre_CSRMatrixJ(diag)[j] + 1); } else { int_send_buffers[proc][int_cnt++] = hypre_AMGDDCompGridNonOwnedGlobalIndices(compGrid[level])[ hypre_CSRMatrixJ(diag)[j] ]; } complex_send_buffers[proc][complex_cnt++] = hypre_CSRMatrixData(diag)[j]; } for (j = hypre_CSRMatrixI(offd)[idx]; j < hypre_CSRMatrixI(offd)[idx + 1]; j++) { int_send_buffers[proc][int_cnt++] = hypre_CSRMatrixJ(offd)[j] + hypre_AMGDDCompGridFirstGlobalIndex( compGrid[level]); complex_send_buffers[proc][complex_cnt++] = hypre_CSRMatrixData(offd)[j]; } } } // Pack P if (level != num_levels - 1) { for (i = 0; i < hypre_AMGDDCommPkgNumSendNodes(compGridCommPkg)[outer_level][proc][level]; i++) { HYPRE_Int idx = hypre_AMGDDCommPkgSendFlag(compGridCommPkg)[outer_level][proc][level][i]; if (idx < 0) { idx = -(idx + 1); } // Owned diag and offd if (idx < hypre_AMGDDCompGridNumOwnedNodes(compGrid[level])) { diag = hypre_AMGDDCompGridMatrixOwnedDiag(hypre_AMGDDCompGridP(compGrid[level])); offd = hypre_AMGDDCompGridMatrixOwnedOffd(hypre_AMGDDCompGridP(compGrid[level])); int_send_buffers[proc][int_cnt++] = hypre_CSRMatrixI(diag)[idx + 1] - hypre_CSRMatrixI(diag)[idx] + hypre_CSRMatrixI(offd)[idx + 1] - hypre_CSRMatrixI(offd)[idx]; for (j = hypre_CSRMatrixI(diag)[idx]; j < hypre_CSRMatrixI(diag)[idx + 1]; j++) { int_send_buffers[proc][int_cnt++] = hypre_CSRMatrixJ(diag)[j] + hypre_AMGDDCompGridFirstGlobalIndex( compGrid[level + 1]); complex_send_buffers[proc][complex_cnt++] = hypre_CSRMatrixData(diag)[j]; } for (j = hypre_CSRMatrixI(offd)[idx]; j < hypre_CSRMatrixI(offd)[idx + 1]; j++) { int_send_buffers[proc][int_cnt++] = hypre_CSRMatrixJ(offd)[j]; complex_send_buffers[proc][complex_cnt++] = hypre_CSRMatrixData(offd)[j]; } } // Nonowned diag and offd else { idx -= hypre_AMGDDCompGridNumOwnedNodes(compGrid[level]); diag = hypre_AMGDDCompGridMatrixNonOwnedDiag(hypre_AMGDDCompGridP(compGrid[level])); offd = hypre_AMGDDCompGridMatrixNonOwnedOffd(hypre_AMGDDCompGridP(compGrid[level])); int_send_buffers[proc][int_cnt++] = hypre_CSRMatrixI(diag)[idx + 1] - hypre_CSRMatrixI(diag)[idx] + hypre_CSRMatrixI(offd)[idx + 1] - hypre_CSRMatrixI(offd)[idx]; for (j = hypre_CSRMatrixI(diag)[idx]; j < hypre_CSRMatrixI(diag)[idx + 1]; j++) { int_send_buffers[proc][int_cnt++] = hypre_CSRMatrixJ(diag)[j]; complex_send_buffers[proc][complex_cnt++] = hypre_CSRMatrixData(diag)[j]; } for (j = hypre_CSRMatrixI(offd)[idx]; j < hypre_CSRMatrixI(offd)[idx + 1]; j++) { int_send_buffers[proc][int_cnt++] = hypre_CSRMatrixJ(offd)[j] + hypre_AMGDDCompGridFirstGlobalIndex( compGrid[level + 1]); complex_send_buffers[proc][complex_cnt++] = hypre_CSRMatrixData(offd)[j]; } } } } // Pack R if (hypre_ParAMGDataRestriction(amg_data) && level != 0) { for (i = 0; i < hypre_AMGDDCommPkgNumSendNodes(compGridCommPkg)[outer_level][proc][level]; i++) { HYPRE_Int idx = hypre_AMGDDCommPkgSendFlag(compGridCommPkg)[outer_level][proc][level][i]; if (idx < 0) { idx = -(idx + 1); } // Owned diag and offd if (idx < hypre_AMGDDCompGridNumOwnedNodes(compGrid[level])) { diag = hypre_AMGDDCompGridMatrixOwnedDiag(hypre_AMGDDCompGridR(compGrid[level - 1])); offd = hypre_AMGDDCompGridMatrixOwnedOffd(hypre_AMGDDCompGridR(compGrid[level - 1])); int_send_buffers[proc][int_cnt++] = hypre_CSRMatrixI(diag)[idx + 1] - hypre_CSRMatrixI(diag)[idx] + hypre_CSRMatrixI(offd)[idx + 1] - hypre_CSRMatrixI(offd)[idx]; for (j = hypre_CSRMatrixI(diag)[idx]; j < hypre_CSRMatrixI(diag)[idx + 1]; j++) { int_send_buffers[proc][int_cnt++] = hypre_CSRMatrixJ(diag)[j] + hypre_AMGDDCompGridFirstGlobalIndex( compGrid[level - 1]); complex_send_buffers[proc][complex_cnt++] = hypre_CSRMatrixData(diag)[j]; } for (j = hypre_CSRMatrixI(offd)[idx]; j < hypre_CSRMatrixI(offd)[idx + 1]; j++) { int_send_buffers[proc][int_cnt++] = hypre_CSRMatrixJ(offd)[j]; complex_send_buffers[proc][complex_cnt++] = hypre_CSRMatrixData(offd)[j]; } } // Nonowned diag and offd else { idx -= hypre_AMGDDCompGridNumOwnedNodes(compGrid[level]); diag = hypre_AMGDDCompGridMatrixNonOwnedDiag(hypre_AMGDDCompGridR(compGrid[level - 1])); offd = hypre_AMGDDCompGridMatrixNonOwnedOffd(hypre_AMGDDCompGridR(compGrid[level - 1])); int_send_buffers[proc][int_cnt++] = hypre_CSRMatrixI(diag)[idx + 1] - hypre_CSRMatrixI(diag)[idx] + hypre_CSRMatrixI(offd)[idx + 1] - hypre_CSRMatrixI(offd)[idx]; for (j = hypre_CSRMatrixI(diag)[idx]; j < hypre_CSRMatrixI(diag)[idx + 1]; j++) { int_send_buffers[proc][int_cnt++] = hypre_CSRMatrixJ(diag)[j]; complex_send_buffers[proc][complex_cnt++] = hypre_CSRMatrixData(diag)[j]; } for (j = hypre_CSRMatrixI(offd)[idx]; j < hypre_CSRMatrixI(offd)[idx + 1]; j++) { int_send_buffers[proc][int_cnt++] = hypre_CSRMatrixJ(offd)[j] + hypre_AMGDDCompGridFirstGlobalIndex( compGrid[level - 1]); complex_send_buffers[proc][complex_cnt++] = hypre_CSRMatrixData(offd)[j]; } } } } } } //////////////////////////////////// // Communicate //////////////////////////////////// for (proc = 0; proc < num_send_procs; proc++) { hypre_MPI_Isend(int_send_buffers[proc], send_sizes[2 * proc], HYPRE_MPI_INT, send_procs[proc], 2, hypre_MPI_COMM_WORLD, &(buf_requests[request_cnt++])); hypre_MPI_Isend(complex_send_buffers[proc], send_sizes[2 * proc + 1], HYPRE_MPI_COMPLEX, send_procs[proc], 3, hypre_MPI_COMM_WORLD, &(buf_requests[request_cnt++])); } // Wait on buffer sizes hypre_MPI_Waitall( num_send_procs + num_recv_procs, size_requests, size_statuses ); // Allocate and post recvs for (proc = 0; proc < num_recv_procs; proc++) { int_recv_buffers[proc] = hypre_CTAlloc(HYPRE_Int, recv_sizes[2 * proc], HYPRE_MEMORY_HOST); complex_recv_buffers[proc] = hypre_CTAlloc(HYPRE_Complex, recv_sizes[2 * proc + 1], HYPRE_MEMORY_HOST); hypre_MPI_Irecv(int_recv_buffers[proc], recv_sizes[2 * proc], HYPRE_MPI_INT, recv_procs[proc], 2, hypre_MPI_COMM_WORLD, &(buf_requests[request_cnt++])); hypre_MPI_Irecv(complex_recv_buffers[proc], recv_sizes[2 * proc + 1], HYPRE_MPI_COMPLEX, recv_procs[proc], 3, hypre_MPI_COMM_WORLD, &(buf_requests[request_cnt++])); } // Wait on buffers hypre_MPI_Waitall( 2 * (num_send_procs + num_recv_procs), buf_requests, buf_statuses ); for (proc = 0; proc < num_send_procs; proc++) { hypre_TFree(int_send_buffers[proc], HYPRE_MEMORY_HOST); } for (proc = 0; proc < num_send_procs; proc++) { hypre_TFree(complex_send_buffers[proc], HYPRE_MEMORY_HOST); } hypre_TFree(int_send_buffers, HYPRE_MEMORY_HOST); hypre_TFree(complex_send_buffers, HYPRE_MEMORY_HOST); hypre_TFree(size_requests, HYPRE_MEMORY_HOST); hypre_TFree(size_statuses, HYPRE_MEMORY_HOST); hypre_TFree(buf_requests, HYPRE_MEMORY_HOST); hypre_TFree(buf_statuses, HYPRE_MEMORY_HOST); // P_tmp_info[buffer_number] = [ size, [row], size, [row], ... ] HYPRE_Int **P_tmp_info_int = NULL; HYPRE_Complex **P_tmp_info_complex = NULL; HYPRE_Int P_tmp_info_size = 0; HYPRE_Int P_tmp_info_cnt = 0; if (outer_level != num_levels - 1) { for (proc = 0; proc < num_recv_procs; proc++) { P_tmp_info_size += hypre_AMGDDCommPkgNumRecvNodes(compGridCommPkg)[outer_level][proc][outer_level]; } P_tmp_info_size -= hypre_CSRMatrixNumCols(hypre_AMGDDCompGridMatrixOwnedOffd(hypre_AMGDDCompGridA( compGrid[outer_level]))); P_tmp_info_int = hypre_CTAlloc(HYPRE_Int*, P_tmp_info_size, HYPRE_MEMORY_HOST); P_tmp_info_complex = hypre_CTAlloc(HYPRE_Complex*, P_tmp_info_size, HYPRE_MEMORY_HOST); } // R_tmp_info[buffer_number] = [ size, [row], size, [row], ... ] HYPRE_Int **R_tmp_info_int = NULL; HYPRE_Complex **R_tmp_info_complex = NULL; HYPRE_Int R_tmp_info_size = 0; HYPRE_Int R_tmp_info_cnt = 0; if (hypre_ParAMGDataRestriction(amg_data) && outer_level != 0) { for (proc = 0; proc < num_recv_procs; proc++) { R_tmp_info_size += hypre_AMGDDCommPkgNumRecvNodes(compGridCommPkg)[outer_level][proc][outer_level]; } R_tmp_info_size -= hypre_CSRMatrixNumCols(hypre_AMGDDCompGridMatrixOwnedOffd(hypre_AMGDDCompGridA( compGrid[outer_level]))); R_tmp_info_int = hypre_CTAlloc(HYPRE_Int*, R_tmp_info_size, HYPRE_MEMORY_HOST); R_tmp_info_complex = hypre_CTAlloc(HYPRE_Complex*, R_tmp_info_size, HYPRE_MEMORY_HOST); } //////////////////////////////////// // Unpack recvs //////////////////////////////////// for (proc = 0; proc < num_recv_procs; proc++) { HYPRE_Int int_cnt = 0; HYPRE_Int complex_cnt = 0; for (level = outer_level; level < num_levels; level++) { for (i = 0; i < hypre_AMGDDCommPkgNumRecvNodes(compGridCommPkg)[outer_level][proc][level]; i++) { HYPRE_Int idx = hypre_AMGDDCommPkgRecvMap(compGridCommPkg)[outer_level][proc][level][i]; if (idx < 0) { idx = -(idx + 1); } // !!! Optimization: I send (and setup) A info twice for ghosts overwritten as real // Unpack A data diag = hypre_AMGDDCompGridMatrixNonOwnedDiag(hypre_AMGDDCompGridA(compGrid[level])); offd = hypre_AMGDDCompGridMatrixNonOwnedOffd(hypre_AMGDDCompGridA(compGrid[level])); HYPRE_Int diag_rowptr = hypre_CSRMatrixI(diag)[idx]; HYPRE_Int offd_rowptr = hypre_CSRMatrixI(offd)[idx]; while (diag_rowptr < hypre_CSRMatrixI(diag)[idx + 1] || offd_rowptr < hypre_CSRMatrixI(offd)[idx + 1]) { HYPRE_Int incoming_index = int_recv_buffers[proc][int_cnt++]; // See whether global index is owned if (incoming_index >= hypre_AMGDDCompGridFirstGlobalIndex(compGrid[level]) && incoming_index <= hypre_AMGDDCompGridLastGlobalIndex(compGrid[level])) { // Don't overwrite data if already accounted for (ordering can change and screw things up) if (level == outer_level || idx == A_row_cnt[level]) { hypre_CSRMatrixData(offd)[offd_rowptr++] = complex_recv_buffers[proc][complex_cnt++]; } else { complex_cnt++; offd_rowptr++; } } else { // Don't overwrite data if already accounted for (ordering can change and screw things up) if (level == outer_level || idx == A_row_cnt[level]) { hypre_CSRMatrixData(diag)[diag_rowptr++] = complex_recv_buffers[proc][complex_cnt++]; } else { complex_cnt++; diag_rowptr++; } } } if (level != outer_level && idx == A_row_cnt[level]) { A_row_cnt[level]++; } } if (level == outer_level) { A_row_cnt[level] += hypre_AMGDDCommPkgNumRecvNodes(compGridCommPkg)[outer_level][proc][level]; } // Unpack P data and col indices if (level != num_levels - 1) { diag = hypre_AMGDDCompGridMatrixNonOwnedDiag(hypre_AMGDDCompGridP(compGrid[level])); offd = hypre_AMGDDCompGridMatrixNonOwnedOffd(hypre_AMGDDCompGridP(compGrid[level])); for (i = 0; i < hypre_AMGDDCommPkgNumRecvNodes(compGridCommPkg)[outer_level][proc][level]; i++) { HYPRE_Int idx = hypre_AMGDDCommPkgRecvMap(compGridCommPkg)[outer_level][proc][level][i]; if (idx < 0) { idx = -(idx + 1); } // Setup orig commPkg recv dofs if (idx == P_row_cnt[level]) { HYPRE_Int row_size = int_recv_buffers[proc][int_cnt++]; HYPRE_Int diag_rowptr = hypre_CSRMatrixI(diag)[idx]; HYPRE_Int offd_rowptr = hypre_CSRMatrixI(offd)[idx]; for (j = 0; j < row_size; j++) { HYPRE_Int incoming_index = int_recv_buffers[proc][int_cnt++]; // See whether global index is owned if (incoming_index >= hypre_AMGDDCompGridFirstGlobalIndex(compGrid[level + 1]) && incoming_index <= hypre_AMGDDCompGridLastGlobalIndex(compGrid[level + 1])) { if (offd_rowptr >= hypre_CSRMatrixNumNonzeros(offd)) { hypre_CSRMatrixResize(offd, hypre_CSRMatrixNumRows(offd), hypre_CSRMatrixNumCols(offd), (HYPRE_Int)hypre_ceil(1.5 * hypre_CSRMatrixNumNonzeros(offd) + 1)); } hypre_CSRMatrixJ(offd)[offd_rowptr] = incoming_index - hypre_AMGDDCompGridFirstGlobalIndex( compGrid[level + 1]); hypre_CSRMatrixData(offd)[offd_rowptr] = complex_recv_buffers[proc][complex_cnt++]; offd_rowptr++; } else { if (diag_rowptr >= hypre_CSRMatrixNumNonzeros(diag)) { hypre_CSRMatrixResize(diag, hypre_CSRMatrixNumRows(diag), hypre_CSRMatrixNumCols(diag), (HYPRE_Int)hypre_ceil(1.5 * hypre_CSRMatrixNumNonzeros(diag) + 1)); } hypre_CSRMatrixJ(diag)[diag_rowptr] = incoming_index; hypre_CSRMatrixData(diag)[diag_rowptr] = complex_recv_buffers[proc][complex_cnt++]; diag_rowptr++; } } hypre_CSRMatrixI(diag)[idx + 1] = diag_rowptr; hypre_CSRMatrixI(offd)[idx + 1] = offd_rowptr; P_row_cnt[level]++; } // Store info for later setup on current outer level else if (level == outer_level) { HYPRE_Int row_size = int_recv_buffers[proc][int_cnt++]; P_tmp_info_int[P_tmp_info_cnt] = hypre_CTAlloc(HYPRE_Int, row_size + 1, HYPRE_MEMORY_HOST); P_tmp_info_complex[P_tmp_info_cnt] = hypre_CTAlloc(HYPRE_Complex, row_size, HYPRE_MEMORY_HOST); P_tmp_info_int[P_tmp_info_cnt][0] = row_size; for (j = 0; j < row_size; j++) { P_tmp_info_int[P_tmp_info_cnt][j + 1] = int_recv_buffers[proc][int_cnt++]; P_tmp_info_complex[P_tmp_info_cnt][j] = complex_recv_buffers[proc][complex_cnt++]; } P_tmp_info_cnt++; } // Otherwise, simply advance counters appropriately else { HYPRE_Int row_size = int_recv_buffers[proc][int_cnt++]; for (j = 0; j < row_size; j++) { int_cnt++; complex_cnt++; } } } } // Unpack R data and col indices if (hypre_ParAMGDataRestriction(amg_data) && level != 0) { diag = hypre_AMGDDCompGridMatrixNonOwnedDiag(hypre_AMGDDCompGridR(compGrid[level - 1])); offd = hypre_AMGDDCompGridMatrixNonOwnedOffd(hypre_AMGDDCompGridR(compGrid[level - 1])); for (i = 0; i < hypre_AMGDDCommPkgNumRecvNodes(compGridCommPkg)[outer_level][proc][level]; i++) { HYPRE_Int idx = hypre_AMGDDCommPkgRecvMap(compGridCommPkg)[outer_level][proc][level][i]; if (idx < 0) { idx = -(idx + 1); } // Setup orig commPkg recv dofs if (idx == R_row_cnt[level - 1]) { HYPRE_Int row_size = int_recv_buffers[proc][int_cnt++]; HYPRE_Int diag_rowptr = hypre_CSRMatrixI(diag)[idx]; HYPRE_Int offd_rowptr = hypre_CSRMatrixI(offd)[idx]; for (j = 0; j < row_size; j++) { HYPRE_Int incoming_index = int_recv_buffers[proc][int_cnt++]; // See whether global index is owned if (incoming_index >= hypre_AMGDDCompGridFirstGlobalIndex(compGrid[level - 1]) && incoming_index <= hypre_AMGDDCompGridLastGlobalIndex(compGrid[level - 1])) { if (offd_rowptr >= hypre_CSRMatrixNumNonzeros(offd)) { hypre_CSRMatrixResize(offd, hypre_CSRMatrixNumRows(offd), hypre_CSRMatrixNumCols(offd), (HYPRE_Int)hypre_ceil(1.5 * hypre_CSRMatrixNumNonzeros(offd) + 1)); } hypre_CSRMatrixJ(offd)[offd_rowptr] = incoming_index - hypre_AMGDDCompGridFirstGlobalIndex( compGrid[level - 1]); hypre_CSRMatrixData(offd)[offd_rowptr] = complex_recv_buffers[proc][complex_cnt++]; offd_rowptr++; } else { if (diag_rowptr >= hypre_CSRMatrixNumNonzeros(diag)) { hypre_CSRMatrixResize(diag, hypre_CSRMatrixNumRows(diag), hypre_CSRMatrixNumCols(diag), (HYPRE_Int)hypre_ceil(1.5 * hypre_CSRMatrixNumNonzeros(diag) + 1)); } hypre_CSRMatrixJ(diag)[diag_rowptr] = incoming_index; hypre_CSRMatrixData(diag)[diag_rowptr] = complex_recv_buffers[proc][complex_cnt++]; diag_rowptr++; } } hypre_CSRMatrixI(diag)[idx + 1] = diag_rowptr; hypre_CSRMatrixI(offd)[idx + 1] = offd_rowptr; R_row_cnt[level - 1]++; } // Store info for later setup on current outer level else if (level == outer_level) { HYPRE_Int row_size = int_recv_buffers[proc][int_cnt++]; R_tmp_info_int[R_tmp_info_cnt] = hypre_CTAlloc(HYPRE_Int, row_size + 1, HYPRE_MEMORY_HOST); R_tmp_info_complex[R_tmp_info_cnt] = hypre_CTAlloc(HYPRE_Complex, row_size, HYPRE_MEMORY_HOST); R_tmp_info_int[R_tmp_info_cnt][0] = row_size; for (j = 0; j < row_size; j++) { R_tmp_info_int[R_tmp_info_cnt][j + 1] = int_recv_buffers[proc][int_cnt++]; R_tmp_info_complex[R_tmp_info_cnt][j] = complex_recv_buffers[proc][complex_cnt++]; } R_tmp_info_cnt++; } // Otherwise, simply advance counters appropriately else { HYPRE_Int row_size = int_recv_buffers[proc][int_cnt++]; for (j = 0; j < row_size; j++) { int_cnt++; complex_cnt++; } } } } } } // Setup temporary info for P on current level if (outer_level != num_levels - 1) { diag = hypre_AMGDDCompGridMatrixNonOwnedDiag(hypre_AMGDDCompGridP(compGrid[outer_level])); offd = hypre_AMGDDCompGridMatrixNonOwnedOffd(hypre_AMGDDCompGridP(compGrid[outer_level])); HYPRE_Int diag_rowptr = hypre_CSRMatrixI(diag)[ P_row_cnt[outer_level] ]; HYPRE_Int offd_rowptr = hypre_CSRMatrixI(offd)[ P_row_cnt[outer_level] ]; for (i = 0; i < P_tmp_info_size; i++) { if (P_tmp_info_int[i]) { HYPRE_Int row_size = P_tmp_info_int[i][0]; for (j = 0; j < row_size; j++) { HYPRE_Int incoming_index = P_tmp_info_int[i][j + 1]; // See whether global index is owned if (incoming_index >= hypre_AMGDDCompGridFirstGlobalIndex(compGrid[outer_level + 1]) && incoming_index <= hypre_AMGDDCompGridLastGlobalIndex(compGrid[outer_level + 1])) { if (offd_rowptr >= hypre_CSRMatrixNumNonzeros(offd)) { hypre_CSRMatrixResize(offd, hypre_CSRMatrixNumRows(offd), hypre_CSRMatrixNumCols(offd), (HYPRE_Int)hypre_ceil(1.5 * hypre_CSRMatrixNumNonzeros(offd) + 1)); } hypre_CSRMatrixJ(offd)[offd_rowptr] = incoming_index - hypre_AMGDDCompGridFirstGlobalIndex( compGrid[outer_level + 1]); hypre_CSRMatrixData(offd)[offd_rowptr] = P_tmp_info_complex[i][j]; offd_rowptr++; } else { if (diag_rowptr >= hypre_CSRMatrixNumNonzeros(diag)) { hypre_CSRMatrixResize(diag, hypre_CSRMatrixNumRows(diag), hypre_CSRMatrixNumCols(diag), (HYPRE_Int)hypre_ceil(1.5 * hypre_CSRMatrixNumNonzeros(diag) + 1)); } hypre_CSRMatrixJ(diag)[diag_rowptr] = incoming_index; hypre_CSRMatrixData(diag)[diag_rowptr] = P_tmp_info_complex[i][j]; diag_rowptr++; } } hypre_CSRMatrixI(diag)[P_row_cnt[outer_level] + 1] = diag_rowptr; hypre_CSRMatrixI(offd)[P_row_cnt[outer_level] + 1] = offd_rowptr; P_row_cnt[outer_level]++; hypre_TFree(P_tmp_info_int[i], HYPRE_MEMORY_HOST); hypre_TFree(P_tmp_info_complex[i], HYPRE_MEMORY_HOST); } } hypre_TFree(P_tmp_info_int, HYPRE_MEMORY_HOST); hypre_TFree(P_tmp_info_complex, HYPRE_MEMORY_HOST); } // Setup temporary info for R on current level if (hypre_ParAMGDataRestriction(amg_data) && outer_level != 0) { diag = hypre_AMGDDCompGridMatrixNonOwnedDiag(hypre_AMGDDCompGridR(compGrid[outer_level - 1])); offd = hypre_AMGDDCompGridMatrixNonOwnedOffd(hypre_AMGDDCompGridR(compGrid[outer_level - 1])); HYPRE_Int diag_rowptr = hypre_CSRMatrixI(diag)[ R_row_cnt[outer_level - 1] ]; HYPRE_Int offd_rowptr = hypre_CSRMatrixI(offd)[ R_row_cnt[outer_level - 1] ]; for (i = 0; i < R_tmp_info_size; i++) { if (R_tmp_info_int[i]) { HYPRE_Int row_size = R_tmp_info_int[i][0]; for (j = 0; j < row_size; j++) { HYPRE_Int incoming_index = R_tmp_info_int[i][j + 1]; // See whether global index is owned if (incoming_index >= hypre_AMGDDCompGridFirstGlobalIndex(compGrid[outer_level - 1]) && incoming_index <= hypre_AMGDDCompGridLastGlobalIndex(compGrid[outer_level - 1])) { if (offd_rowptr >= hypre_CSRMatrixNumNonzeros(offd)) { hypre_CSRMatrixResize(offd, hypre_CSRMatrixNumRows(offd), hypre_CSRMatrixNumCols(offd), (HYPRE_Int)hypre_ceil(1.5 * hypre_CSRMatrixNumNonzeros(offd) + 1)); } hypre_CSRMatrixJ(offd)[offd_rowptr] = incoming_index - hypre_AMGDDCompGridFirstGlobalIndex( compGrid[outer_level - 1]); hypre_CSRMatrixData(offd)[offd_rowptr] = R_tmp_info_complex[i][j]; offd_rowptr++; } else { if (diag_rowptr >= hypre_CSRMatrixNumNonzeros(diag)) { hypre_CSRMatrixResize(diag, hypre_CSRMatrixNumRows(diag), hypre_CSRMatrixNumCols(diag), (HYPRE_Int)hypre_ceil(1.5 * hypre_CSRMatrixNumNonzeros(diag) + 1)); } hypre_CSRMatrixJ(diag)[diag_rowptr] = incoming_index; hypre_CSRMatrixData(diag)[diag_rowptr] = R_tmp_info_complex[i][j]; diag_rowptr++; } } hypre_CSRMatrixI(diag)[R_row_cnt[outer_level - 1] + 1] = diag_rowptr; hypre_CSRMatrixI(offd)[R_row_cnt[outer_level - 1] + 1] = offd_rowptr; R_row_cnt[outer_level - 1]++; hypre_TFree(R_tmp_info_int[i], HYPRE_MEMORY_HOST); hypre_TFree(R_tmp_info_complex[i], HYPRE_MEMORY_HOST); } } hypre_TFree(R_tmp_info_int, HYPRE_MEMORY_HOST); hypre_TFree(R_tmp_info_complex, HYPRE_MEMORY_HOST); } // Clean up memory for (proc = 0; proc < num_recv_procs; proc++) { hypre_TFree(int_recv_buffers[proc], HYPRE_MEMORY_HOST); } for (proc = 0; proc < num_recv_procs; proc++) { hypre_TFree(complex_recv_buffers[proc], HYPRE_MEMORY_HOST); } hypre_TFree(int_recv_buffers, HYPRE_MEMORY_HOST); hypre_TFree(complex_recv_buffers, HYPRE_MEMORY_HOST); hypre_TFree(send_sizes, HYPRE_MEMORY_HOST); hypre_TFree(recv_sizes, HYPRE_MEMORY_HOST); } } // Clean up memory hypre_TFree(P_row_cnt, HYPRE_MEMORY_HOST); hypre_TFree(R_row_cnt, HYPRE_MEMORY_HOST); hypre_TFree(A_row_cnt, HYPRE_MEMORY_HOST); return hypre_error_flag; } HYPRE_Int hypre_BoomerAMGDD_FixUpRecvMaps( hypre_AMGDDCompGrid **compGrid, hypre_AMGDDCommPkg *compGridCommPkg, HYPRE_Int start_level, HYPRE_Int num_levels ) { HYPRE_Int ****recv_red_marker; HYPRE_Int proc; HYPRE_Int inner_level; HYPRE_Int num_nodes; HYPRE_Int redundant; HYPRE_Int map_val; HYPRE_Int level, i; // Initial fix up of recv map: // Get rid of redundant recvs and index from beginning of nonowned (instead of owned) if (compGridCommPkg) { recv_red_marker = hypre_AMGDDCommPkgRecvRedMarker(compGridCommPkg); for (level = start_level; level < num_levels; level++) { for (proc = 0; proc < hypre_AMGDDCommPkgNumRecvProcs(compGridCommPkg)[level]; proc++) { for (inner_level = level; inner_level < num_levels; inner_level++) { // if there were nodes in psiComposite on this level if (hypre_AMGDDCommPkgRecvMap(compGridCommPkg)[level][proc][inner_level]) { // store the number of nodes on this level num_nodes = hypre_AMGDDCommPkgNumRecvNodes(compGridCommPkg)[level][proc][inner_level]; hypre_AMGDDCommPkgNumRecvNodes(compGridCommPkg)[level][proc][inner_level] = 0; for (i = 0; i < num_nodes; i++) { if (inner_level == level) { redundant = 0; } else { redundant = recv_red_marker[level][proc][inner_level][i]; } if (!redundant) { map_val = hypre_AMGDDCommPkgRecvMap(compGridCommPkg)[level][proc][inner_level][i]; if (map_val < 0) { map_val += hypre_AMGDDCompGridNumOwnedNodes(compGrid[inner_level]); } else { map_val -= hypre_AMGDDCompGridNumOwnedNodes(compGrid[inner_level]); } hypre_AMGDDCommPkgRecvMap( compGridCommPkg)[level][proc][inner_level][ hypre_AMGDDCommPkgNumRecvNodes( compGridCommPkg)[level][proc][inner_level]++ ] = map_val; } } hypre_AMGDDCommPkgRecvMap(compGridCommPkg)[level][proc][inner_level] = hypre_TReAlloc(hypre_AMGDDCommPkgRecvMap(compGridCommPkg)[level][proc][inner_level], HYPRE_Int, hypre_AMGDDCommPkgNumRecvNodes(compGridCommPkg)[level][proc][inner_level], HYPRE_MEMORY_HOST); } } } } } return hypre_error_flag; } hypre-2.33.0/src/parcsr_ls/par_amgdd_setup.c000066400000000000000000000344451477326011500210270ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "_hypre_parcsr_ls.h" #include "_hypre_utilities.h" /***************************************************************************** * * Routine for setting up the composite grids in AMG-DD *****************************************************************************/ /***************************************************************************** * hypre_BoomerAMGDDSetup *****************************************************************************/ HYPRE_Int hypre_BoomerAMGDDSetup( void *amgdd_vdata, hypre_ParCSRMatrix *A, hypre_ParVector *b, hypre_ParVector *x ) { MPI_Comm comm; hypre_ParAMGDDData *amgdd_data = (hypre_ParAMGDDData*) amgdd_vdata; hypre_ParAMGData *amg_data = hypre_ParAMGDDDataAMG(amgdd_data); HYPRE_Int pad; HYPRE_Int num_levels; HYPRE_Int amgdd_start_level; HYPRE_Int num_ghost_layers; hypre_ParCSRMatrix **A_array; hypre_AMGDDCompGrid **compGrid; hypre_AMGDDCommPkg *compGridCommPkg; HYPRE_Int *padding; HYPRE_Int *nodes_added_on_level; HYPRE_Int **A_tmp_info; hypre_MPI_Request *requests; hypre_MPI_Status *status; HYPRE_Int **send_buffer_size; HYPRE_Int **recv_buffer_size; HYPRE_Int ***num_send_nodes; HYPRE_Int ***num_recv_nodes; HYPRE_Int ****send_flag; HYPRE_Int ****recv_map; HYPRE_Int ****recv_red_marker; HYPRE_Int **send_buffer = NULL; HYPRE_Int **recv_buffer = NULL; HYPRE_Int **send_flag_buffer = NULL; HYPRE_Int **recv_map_send_buffer = NULL; HYPRE_Int *send_flag_buffer_size = NULL; HYPRE_Int *recv_map_send_buffer_size = NULL; HYPRE_Int num_procs; HYPRE_Int num_send_procs; HYPRE_Int num_recv_procs; HYPRE_Int level, i, j; HYPRE_Int num_requests; HYPRE_Int request_counter; /* Sanity check */ if (hypre_ParVectorNumVectors(b) > 1) { hypre_error_w_msg(HYPRE_ERROR_GENERIC, "BoomerAMGDD doesn't support multicomponent vectors"); return hypre_error_flag; } // If the underlying AMG data structure has not yet been set up, call BoomerAMGSetup() if (!hypre_ParAMGDataAArray(amg_data)) { hypre_BoomerAMGSetup((void*) amg_data, A, b, x); } // Get number of processes comm = hypre_ParCSRMatrixComm(A); hypre_MPI_Comm_size(comm, &num_procs); // get info from amg about how to setup amgdd A_array = hypre_ParAMGDataAArray(amg_data); pad = hypre_ParAMGDDDataPadding(amgdd_data); num_levels = hypre_ParAMGDataNumLevels(amg_data); num_ghost_layers = hypre_ParAMGDDDataNumGhostLayers(amgdd_data); amgdd_start_level = hypre_ParAMGDDDataStartLevel(amgdd_data); if (amgdd_start_level >= (num_levels - 1)) { amgdd_start_level = num_levels - 2; hypre_ParAMGDDDataStartLevel(amgdd_data) = amgdd_start_level; } // Allocate pointer for the composite grids compGrid = hypre_CTAlloc(hypre_AMGDDCompGrid *, num_levels, HYPRE_MEMORY_HOST); hypre_ParAMGDDDataCompGrid(amgdd_data) = compGrid; // In the 1 processor case, just need to initialize the comp grids if (num_procs == 1) { for (level = amgdd_start_level; level < num_levels; level++) { compGrid[level] = hypre_AMGDDCompGridCreate(); hypre_AMGDDCompGridInitialize(amgdd_data, 0, level); } hypre_AMGDDCompGridFinalize(amgdd_data); hypre_AMGDDCompGridSetupRelax(amgdd_data); return hypre_error_flag; } // Get the padding on each level padding = hypre_CTAlloc(HYPRE_Int, num_levels, HYPRE_MEMORY_HOST); for (level = amgdd_start_level; level < num_levels; level++) { padding[level] = pad; } // Initialize composite grid structures for (level = amgdd_start_level; level < num_levels; level++) { compGrid[level] = hypre_AMGDDCompGridCreate(); hypre_AMGDDCompGridInitialize(amgdd_data, padding[level], level); } // Create the compGridCommPkg and grab a few frequently used variables compGridCommPkg = hypre_AMGDDCommPkgCreate(num_levels); hypre_ParAMGDDDataCommPkg(amgdd_data) = compGridCommPkg; send_buffer_size = hypre_AMGDDCommPkgSendBufferSize(compGridCommPkg); recv_buffer_size = hypre_AMGDDCommPkgRecvBufferSize(compGridCommPkg); send_flag = hypre_AMGDDCommPkgSendFlag(compGridCommPkg); num_send_nodes = hypre_AMGDDCommPkgNumSendNodes(compGridCommPkg); num_recv_nodes = hypre_AMGDDCommPkgNumRecvNodes(compGridCommPkg); recv_map = hypre_AMGDDCommPkgRecvMap(compGridCommPkg); recv_red_marker = hypre_AMGDDCommPkgRecvRedMarker(compGridCommPkg); nodes_added_on_level = hypre_CTAlloc(HYPRE_Int, num_levels, HYPRE_MEMORY_HOST); // On each level, setup the compGridCommPkg so that it has communication info for distance (eta + numGhostLayers) for (level = amgdd_start_level; level < num_levels; level++) { hypre_BoomerAMGDD_SetupNearestProcessorNeighbors(A_array[level], compGridCommPkg, level, padding, num_ghost_layers); } // Find maximum number of requests and allocate memory num_requests = 0; for (level = num_levels - 1; level >= amgdd_start_level; level--) { comm = hypre_ParCSRMatrixComm(A_array[level]); num_send_procs = hypre_AMGDDCommPkgNumSendProcs(compGridCommPkg)[level]; num_recv_procs = hypre_AMGDDCommPkgNumRecvProcs(compGridCommPkg)[level]; num_requests = hypre_max(num_requests, num_send_procs + num_recv_procs); } requests = hypre_CTAlloc(hypre_MPI_Request, num_requests, HYPRE_MEMORY_HOST); status = hypre_CTAlloc(hypre_MPI_Status, num_requests, HYPRE_MEMORY_HOST); ///////////////////////////////////////////////////////////////// // Loop over levels from coarsest to finest to build up the composite grids ///////////////////////////////////////////////////////////////// for (level = num_levels - 1; level >= amgdd_start_level; level--) { comm = hypre_ParCSRMatrixComm(A_array[level]); num_send_procs = hypre_AMGDDCommPkgNumSendProcs(compGridCommPkg)[level]; num_recv_procs = hypre_AMGDDCommPkgNumRecvProcs(compGridCommPkg)[level]; num_requests = num_send_procs + num_recv_procs; // Initialize request counter request_counter = 0; //////////// Communicate buffer sizes //////////// if (num_recv_procs) { recv_buffer = hypre_CTAlloc(HYPRE_Int*, num_recv_procs, HYPRE_MEMORY_HOST); recv_buffer_size[level] = hypre_CTAlloc(HYPRE_Int, num_recv_procs, HYPRE_MEMORY_HOST); recv_map[level] = hypre_CTAlloc(HYPRE_Int**, num_recv_procs, HYPRE_MEMORY_HOST); recv_red_marker[level] = hypre_CTAlloc(HYPRE_Int**, num_recv_procs, HYPRE_MEMORY_HOST); num_recv_nodes[level] = hypre_CTAlloc(HYPRE_Int*, num_recv_procs, HYPRE_MEMORY_HOST); recv_map_send_buffer = hypre_CTAlloc(HYPRE_Int*, num_recv_procs, HYPRE_MEMORY_HOST); recv_map_send_buffer_size = hypre_CTAlloc(HYPRE_Int, num_recv_procs, HYPRE_MEMORY_HOST); // Post the receives for the buffer size for (i = 0; i < num_recv_procs; i++) { hypre_MPI_Irecv(&(recv_buffer_size[level][i]), 1, HYPRE_MPI_INT, hypre_AMGDDCommPkgRecvProcs(compGridCommPkg)[level][i], 0, comm, &(requests[request_counter++])); } } if (num_send_procs) { send_buffer = hypre_CTAlloc(HYPRE_Int*, num_send_procs, HYPRE_MEMORY_HOST); send_buffer_size[level] = hypre_CTAlloc(HYPRE_Int, num_send_procs, HYPRE_MEMORY_HOST); send_flag_buffer = hypre_CTAlloc(HYPRE_Int*, num_send_procs, HYPRE_MEMORY_HOST); send_flag_buffer_size = hypre_CTAlloc(HYPRE_Int, num_send_procs, HYPRE_MEMORY_HOST); // Pack send buffers for (i = 0; i < num_send_procs; i++) { send_buffer[i] = hypre_BoomerAMGDD_PackSendBuffer(amgdd_data, i, level, padding, &(send_flag_buffer_size[i])); } // Send the buffer sizes for (i = 0; i < num_send_procs; i++) { hypre_MPI_Isend(&(send_buffer_size[level][i]), 1, HYPRE_MPI_INT, hypre_AMGDDCommPkgSendProcs(compGridCommPkg)[level][i], 0, comm, &(requests[request_counter++])); } } // Wait for all buffer sizes to be received hypre_MPI_Waitall(num_requests, requests, status); request_counter = 0; //////////// Communicate buffers //////////// for (i = 0; i < num_recv_procs; i++) { recv_buffer[i] = hypre_CTAlloc(HYPRE_Int, recv_buffer_size[level][i], HYPRE_MEMORY_HOST); hypre_MPI_Irecv(recv_buffer[i], recv_buffer_size[level][i], HYPRE_MPI_INT, hypre_AMGDDCommPkgRecvProcs(compGridCommPkg)[level][i], 1, comm, &(requests[request_counter++])); } for (i = 0; i < num_send_procs; i++) { hypre_MPI_Isend(send_buffer[i], send_buffer_size[level][i], HYPRE_MPI_INT, hypre_AMGDDCommPkgSendProcs(compGridCommPkg)[level][i], 1, comm, &(requests[request_counter++])); } // Wait for buffers to be received hypre_MPI_Waitall(num_requests, requests, status); request_counter = 0; //////////// Unpack the received buffers //////////// A_tmp_info = hypre_CTAlloc(HYPRE_Int*, num_recv_procs, HYPRE_MEMORY_HOST); for (i = 0; i < num_recv_procs; i++) { recv_map[level][i] = hypre_CTAlloc(HYPRE_Int*, num_levels, HYPRE_MEMORY_HOST); recv_red_marker[level][i] = hypre_CTAlloc(HYPRE_Int*, num_levels, HYPRE_MEMORY_HOST); num_recv_nodes[level][i] = hypre_CTAlloc(HYPRE_Int, num_levels, HYPRE_MEMORY_HOST); hypre_BoomerAMGDD_UnpackRecvBuffer(amgdd_data, recv_buffer[i], A_tmp_info, &(recv_map_send_buffer_size[i]), nodes_added_on_level, level, i); recv_map_send_buffer[i] = hypre_CTAlloc(HYPRE_Int, recv_map_send_buffer_size[i], HYPRE_MEMORY_HOST); hypre_BoomerAMGDD_PackRecvMapSendBuffer(recv_map_send_buffer[i], recv_red_marker[level][i], num_recv_nodes[level][i], &(recv_buffer_size[level][i]), level, num_levels); } //////////// Setup local indices for the composite grid //////////// hypre_AMGDDCompGridSetupLocalIndices(compGrid, nodes_added_on_level, recv_map, num_recv_procs, A_tmp_info, level, num_levels); for (j = level; j < num_levels; j++) { nodes_added_on_level[j] = 0; } //////////// Communicate redundancy info //////////// // post receives for send maps for (i = 0; i < num_send_procs; i++) { send_flag_buffer[i] = hypre_CTAlloc(HYPRE_Int, send_flag_buffer_size[i], HYPRE_MEMORY_HOST); hypre_MPI_Irecv(send_flag_buffer[i], send_flag_buffer_size[i], HYPRE_MPI_INT, hypre_AMGDDCommPkgSendProcs(compGridCommPkg)[level][i], 2, comm, &(requests[request_counter++])); } // send the recv_map_send_buffer's for (i = 0; i < num_recv_procs; i++) { hypre_MPI_Isend(recv_map_send_buffer[i], recv_map_send_buffer_size[i], HYPRE_MPI_INT, hypre_AMGDDCommPkgRecvProcs(compGridCommPkg)[level][i], 2, comm, &(requests[request_counter++])); } // wait for maps to be received hypre_MPI_Waitall(num_requests, requests, status); // unpack and setup the send flag arrays for (i = 0; i < num_send_procs; i++) { hypre_BoomerAMGDD_UnpackSendFlagBuffer(compGrid, send_flag_buffer[i], send_flag[level][i], num_send_nodes[level][i], &(send_buffer_size[level][i]), level, num_levels); } // clean up memory for this level for (i = 0; i < num_send_procs; i++) { hypre_TFree(send_buffer[i], HYPRE_MEMORY_HOST); hypre_TFree(send_flag_buffer[i], HYPRE_MEMORY_HOST); } for (i = 0; i < num_recv_procs; i++) { hypre_TFree(recv_buffer[i], HYPRE_MEMORY_HOST); hypre_TFree(recv_map_send_buffer[i], HYPRE_MEMORY_HOST); } if (num_send_procs) { hypre_TFree(send_buffer, HYPRE_MEMORY_HOST); hypre_TFree(send_flag_buffer, HYPRE_MEMORY_HOST); hypre_TFree(send_flag_buffer_size, HYPRE_MEMORY_HOST); } if (num_recv_procs) { hypre_TFree(recv_buffer, HYPRE_MEMORY_HOST); hypre_TFree(recv_map_send_buffer, HYPRE_MEMORY_HOST); hypre_TFree(recv_map_send_buffer_size, HYPRE_MEMORY_HOST); } } ///////////////////////////////////////////////////////////////// // Done with loop over levels. Now just finalize things. ///////////////////////////////////////////////////////////////// hypre_BoomerAMGDD_FixUpRecvMaps(compGrid, compGridCommPkg, amgdd_start_level, num_levels); // Communicate data for A and all info for P hypre_BoomerAMGDD_CommunicateRemainingMatrixInfo(amgdd_data); // Setup the local indices for P hypre_AMGDDCompGridSetupLocalIndicesP(amgdd_data); // Finalize the comp grid structures hypre_AMGDDCompGridFinalize(amgdd_data); // Setup extra info for specific relaxation methods hypre_AMGDDCompGridSetupRelax(amgdd_data); // Cleanup memory hypre_TFree(padding, HYPRE_MEMORY_HOST); hypre_TFree(nodes_added_on_level, HYPRE_MEMORY_HOST); hypre_TFree(requests, HYPRE_MEMORY_HOST); hypre_TFree(status, HYPRE_MEMORY_HOST); return hypre_error_flag; } hypre-2.33.0/src/parcsr_ls/par_amgdd_solve.c000066400000000000000000000505561477326011500210200ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "_hypre_parcsr_ls.h" HYPRE_Int hypre_BoomerAMGDDSolve( void *amgdd_vdata, hypre_ParCSRMatrix *A, hypre_ParVector *f, hypre_ParVector *u ) { hypre_ParAMGDDData *amgdd_data = (hypre_ParAMGDDData*) amgdd_vdata; hypre_ParAMGData *amg_data = hypre_ParAMGDDDataAMG(amgdd_data); hypre_AMGDDCompGrid **compGrids; hypre_ParCSRMatrix **A_array; hypre_ParCSRMatrix **P_array; hypre_ParVector **F_array; hypre_ParVector **U_array; hypre_ParVector *res = NULL; hypre_ParVector *Vtemp; hypre_ParVector *Ztemp; HYPRE_Int myid; HYPRE_Int min_iter; HYPRE_Int max_iter; HYPRE_Int converge_type; HYPRE_Int i, level; HYPRE_Int num_levels; HYPRE_Int amgdd_start_level; HYPRE_Int fac_num_cycles; HYPRE_Int cycle_count; HYPRE_Int amg_print_level; HYPRE_Int amg_logging; HYPRE_Real tol; HYPRE_Real resid_nrm = 0.0; HYPRE_Real resid_nrm_init = 1.0; HYPRE_Real rhs_norm = 1.0; HYPRE_Real old_resid; HYPRE_Real relative_resid; HYPRE_Real conv_factor; HYPRE_Real alpha = -1.0; HYPRE_Real beta = 1.0; HYPRE_Real ieee_check = 0.0; hypre_MPI_Comm_rank(hypre_MPI_COMM_WORLD, &myid ); /* Set some data */ amgdd_start_level = hypre_ParAMGDDDataStartLevel(amgdd_data); fac_num_cycles = hypre_ParAMGDDDataFACNumCycles(amgdd_data); compGrids = hypre_ParAMGDDDataCompGrid(amgdd_data); amg_print_level = hypre_ParAMGDataPrintLevel(amg_data); amg_logging = hypre_ParAMGDataLogging(amg_data); num_levels = hypre_ParAMGDataNumLevels(amg_data); converge_type = hypre_ParAMGDataConvergeType(amg_data); min_iter = hypre_ParAMGDataMinIter(amg_data); max_iter = hypre_ParAMGDataMaxIter(amg_data); A_array = hypre_ParAMGDataAArray(amg_data); P_array = hypre_ParAMGDataPArray(amg_data); F_array = hypre_ParAMGDataFArray(amg_data); U_array = hypre_ParAMGDataUArray(amg_data); Vtemp = hypre_ParAMGDataVtemp(amg_data); Ztemp = hypre_ParAMGDDDataZtemp(amg_data); tol = hypre_ParAMGDataTol(amg_data); cycle_count = 0; if (amg_logging > 1) { res = hypre_ParAMGDataResidual(amg_data); } // Setup extra temporary variable to hold the solution if necessary if (!Ztemp) { Ztemp = hypre_ParVectorCreate(hypre_ParCSRMatrixComm(A_array[amgdd_start_level]), hypre_ParCSRMatrixGlobalNumRows(A_array[amgdd_start_level]), hypre_ParCSRMatrixRowStarts(A_array[amgdd_start_level])); hypre_ParVectorInitialize(Ztemp); hypre_ParAMGDDDataZtemp(amg_data) = Ztemp; } /*----------------------------------------------------------------------- * Write the solver parameters *-----------------------------------------------------------------------*/ if (myid == 0 && amg_print_level > 1) { hypre_BoomerAMGWriteSolverParams(amg_data); } /*----------------------------------------------------------------------- * Set the fine grid operator, left-hand side, and right-hand side *-----------------------------------------------------------------------*/ A_array[0] = A; F_array[0] = f; U_array[0] = u; if (A != A_array[0]) { hypre_error_w_msg(HYPRE_ERROR_GENERIC, "WARNING: calling hypre_BoomerAMGDDSolve with different matrix than what was used for initial setup. " "Non-owned parts of fine-grid matrix and fine-grid communication patterns may be incorrect.\n"); hypre_AMGDDCompGridMatrixOwnedDiag(hypre_AMGDDCompGridA(compGrids[0])) = hypre_ParCSRMatrixDiag(A); hypre_AMGDDCompGridMatrixOwnedOffd(hypre_AMGDDCompGridA(compGrids[0])) = hypre_ParCSRMatrixOffd(A); } if (compGrids[0]) { hypre_AMGDDCompGridVectorOwned(hypre_AMGDDCompGridU(compGrids[0])) = hypre_ParVectorLocalVector(u); hypre_AMGDDCompGridVectorOwned(hypre_AMGDDCompGridF(compGrids[0])) = hypre_ParVectorLocalVector(f); } /*----------------------------------------------------------------------- * Compute initial fine-grid residual and print *-----------------------------------------------------------------------*/ if (amg_print_level > 1 || amg_logging > 1 || tol > 0.) { if (amg_logging > 1) { hypre_ParVectorCopy(F_array[0], res); if (tol > 0.) { hypre_ParCSRMatrixMatvec(alpha, A_array[0], U_array[0], beta, res); } resid_nrm = hypre_sqrt(hypre_ParVectorInnerProd(res, res)); } else { hypre_ParVectorCopy(F_array[0], Vtemp); if (tol > 0.) { hypre_ParCSRMatrixMatvec(alpha, A_array[0], U_array[0], beta, Vtemp); } resid_nrm = hypre_sqrt(hypre_ParVectorInnerProd(Vtemp, Vtemp)); } /* Since it does not diminish performance, attempt to return an error flag and notify users when they supply bad input. */ if (resid_nrm != 0.) { ieee_check = resid_nrm / resid_nrm; /* INF -> NaN conversion */ } if (ieee_check != ieee_check) { /* ...INFs or NaNs in input can make ieee_check a NaN. This test for ieee_check self-equality works on all IEEE-compliant compilers/ machines, c.f. page 8 of "Lecture Notes on the Status of IEEE 754" by W. Kahan, May 31, 1996. Currently (July 2002) this paper may be found at http://HTTP.CS.Berkeley.EDU/~wkahan/ieee754status/IEEE754.PDF */ if (amg_print_level > 0) { hypre_printf("\n\nERROR detected by Hypre ... BEGIN\n"); hypre_printf("ERROR -- hypre_BoomerAMGDDSolve: INFs and/or NaNs detected in input.\n"); hypre_printf("User probably placed non-numerics in supplied A, x_0, or b.\n"); hypre_printf("ERROR detected by Hypre ... END\n\n\n"); } hypre_error(HYPRE_ERROR_GENERIC); return hypre_error_flag; } /* r0 */ resid_nrm_init = resid_nrm; if (0 == converge_type) { rhs_norm = hypre_sqrt(hypre_ParVectorInnerProd(f, f)); if (rhs_norm) { relative_resid = resid_nrm_init / rhs_norm; } else { relative_resid = resid_nrm_init; } } else { /* converge_type != 0, test convergence with ||r|| / ||r0|| */ relative_resid = 1.0; } } else { relative_resid = 1.; } if (myid == 0 && amg_print_level > 1) { hypre_printf(" relative\n"); hypre_printf(" residual factor residual\n"); hypre_printf(" -------- ------ --------\n"); hypre_printf(" Initial %e %e\n", resid_nrm_init, relative_resid); } /*----------------------------------------------------------------------- * Main cycle loop *-----------------------------------------------------------------------*/ while ( (relative_resid >= tol || cycle_count < min_iter) && cycle_count < max_iter ) { // Do normal AMG V-cycle down-sweep to where we start AMG-DD if (amgdd_start_level > 0) { hypre_ParAMGDataPartialCycleCoarsestLevel(amg_data) = amgdd_start_level - 1; hypre_ParAMGDataPartialCycleControl(amg_data) = 0; hypre_BoomerAMGCycle( (void*) amg_data, F_array, U_array); } else { // Store the original fine grid right-hand side in Vtemp and use f as the current fine grid residual hypre_ParVectorCopy(F_array[amgdd_start_level], Vtemp); hypre_ParCSRMatrixMatvec(alpha, A_array[amgdd_start_level], U_array[amgdd_start_level], beta, F_array[amgdd_start_level]); } // AMG-DD cycle hypre_BoomerAMGDD_ResidualCommunication(amgdd_data); // Save the original solution (updated at the end of the AMG-DD cycle) hypre_ParVectorCopy(U_array[amgdd_start_level], Ztemp); // Zero solution on all levels for (level = amgdd_start_level; level < num_levels; level++) { hypre_AMGDDCompGridVectorSetConstantValues(hypre_AMGDDCompGridU(compGrids[level]), 0.0); if (hypre_AMGDDCompGridQ(compGrids[level])) { hypre_AMGDDCompGridVectorSetConstantValues(hypre_AMGDDCompGridQ(compGrids[level]), 0.0); } } for (level = amgdd_start_level; level < num_levels; level++) { hypre_AMGDDCompGridVectorSetConstantValues(hypre_AMGDDCompGridT(compGrids[level]), 0.0 ); hypre_AMGDDCompGridVectorSetConstantValues(hypre_AMGDDCompGridS(compGrids[level]), 0.0 ); } // Do FAC cycles if (fac_num_cycles > 0) { hypre_BoomerAMGDD_FAC((void*) amgdd_data, 1); } for (i = 1; i < fac_num_cycles; i++) { hypre_BoomerAMGDD_FAC((void*) amgdd_data, 0); } // Update fine grid solution hypre_ParVectorAxpy(1.0, Ztemp, U_array[amgdd_start_level]); // Do normal AMG V-cycle up-sweep back up to the fine grid if (amgdd_start_level > 0) { // Interpolate hypre_ParCSRMatrixMatvec(1.0, P_array[amgdd_start_level - 1], U_array[amgdd_start_level], 1.0, U_array[amgdd_start_level - 1]); // V-cycle back to finest grid hypre_ParAMGDataPartialCycleCoarsestLevel(amg_data) = amgdd_start_level - 1; hypre_ParAMGDataPartialCycleControl(amg_data) = 1; hypre_BoomerAMGCycle((void*) amg_data, F_array, U_array); hypre_ParAMGDataPartialCycleCoarsestLevel(amg_data) = - 1; hypre_ParAMGDataPartialCycleControl(amg_data) = -1; } else { // Copy RHS back into f hypre_ParVectorCopy(Vtemp, F_array[amgdd_start_level]); } /*--------------------------------------------------------------- * Compute fine-grid residual and residual norm *----------------------------------------------------------------*/ if (amg_print_level > 1 || amg_logging > 1 || tol > 0.) { old_resid = resid_nrm; if (amg_logging > 1) { hypre_ParCSRMatrixMatvecOutOfPlace(alpha, A_array[0], U_array[0], beta, F_array[0], res); resid_nrm = hypre_sqrt(hypre_ParVectorInnerProd(res, res)); } else { hypre_ParCSRMatrixMatvecOutOfPlace(alpha, A_array[0], U_array[0], beta, F_array[0], Vtemp); resid_nrm = hypre_sqrt(hypre_ParVectorInnerProd(Vtemp, Vtemp)); } if (old_resid) { conv_factor = resid_nrm / old_resid; } else { conv_factor = resid_nrm; } if (0 == converge_type) { if (rhs_norm) { relative_resid = resid_nrm / rhs_norm; } else { relative_resid = resid_nrm; } } else { relative_resid = resid_nrm / resid_nrm_init; } hypre_ParAMGDataRelativeResidualNorm(amg_data) = relative_resid; } if (myid == 0 && amg_print_level > 1) { hypre_printf(" Cycle %2d %e %f %e \n", cycle_count, resid_nrm, conv_factor, relative_resid); } // Update cycle counter ++cycle_count; hypre_ParAMGDataNumIterations(amg_data) = cycle_count; } if (cycle_count == max_iter && tol > 0.) { if (myid == 0) { hypre_printf("\n\n=============================================="); hypre_printf("\n NOTE: Convergence tolerance was not achieved\n"); hypre_printf(" within the allowed %d V-cycles\n", max_iter); hypre_printf("=============================================="); } hypre_error(HYPRE_ERROR_CONV); } if (myid == 0 && amg_print_level > 1) { hypre_printf("\n"); } return hypre_error_flag; } /*-------------------------------------------------------------------------- * TODO: Don't reallocate requests/sends at each level. Implement * a hypre_AMGDDCommPkgHandle data structure (see hypre_ParCSRCommHandle) *--------------------------------------------------------------------------*/ HYPRE_Int hypre_BoomerAMGDD_ResidualCommunication( hypre_ParAMGDDData *amgdd_data ) { hypre_ParAMGData *amg_data = hypre_ParAMGDDDataAMG(amgdd_data); // info from amg hypre_ParCSRMatrix **A_array; hypre_ParCSRMatrix **R_array; hypre_ParVector **F_array; hypre_AMGDDCommPkg *compGridCommPkg; hypre_AMGDDCompGrid **compGrid; // temporary arrays used for communication during comp grid setup HYPRE_Complex **send_buffers; HYPRE_Complex **recv_buffers; // MPI stuff MPI_Comm comm; hypre_MPI_Request *requests; hypre_MPI_Status *status; HYPRE_Int request_counter = 0; HYPRE_Int num_procs; HYPRE_Int num_sends, num_recvs; HYPRE_Int send_buffer_size, recv_buffer_size; HYPRE_Int num_levels, amgdd_start_level; HYPRE_Int level, i; // Get info from amg num_levels = hypre_ParAMGDataNumLevels(amg_data); amgdd_start_level = hypre_ParAMGDDDataStartLevel(amgdd_data); compGrid = hypre_ParAMGDDDataCompGrid(amgdd_data); compGridCommPkg = hypre_ParAMGDDDataCommPkg(amgdd_data); A_array = hypre_ParAMGDataAArray(amg_data); R_array = hypre_ParAMGDataRArray(amg_data); F_array = hypre_ParAMGDataFArray(amg_data); // Restrict residual down to all levels for (level = amgdd_start_level; level < num_levels - 1; level++) { if (hypre_ParAMGDataRestriction(amg_data)) { hypre_ParCSRMatrixMatvec(1.0, R_array[level], F_array[level], 0.0, F_array[level + 1]); } else { hypre_ParCSRMatrixMatvecT(1.0, R_array[level], F_array[level], 0.0, F_array[level + 1]); } } /* Outer loop over levels: Start from coarsest level and work up to finest */ for (level = num_levels - 1; level >= amgdd_start_level; level--) { // Get some communication info comm = hypre_ParCSRMatrixComm(A_array[level]); hypre_MPI_Comm_size(comm, &num_procs); if (num_procs > 1) { num_sends = hypre_AMGDDCommPkgNumSendProcs(compGridCommPkg)[level]; num_recvs = hypre_AMGDDCommPkgNumRecvProcs(compGridCommPkg)[level]; if ( num_sends || num_recvs ) // If there are any owned nodes on this level { // allocate space for the buffers, buffer sizes, requests and status, psiComposite_send, psiComposite_recv, send and recv maps recv_buffers = hypre_CTAlloc(HYPRE_Complex *, num_recvs, HYPRE_MEMORY_HOST); send_buffers = hypre_CTAlloc(HYPRE_Complex *, num_sends, HYPRE_MEMORY_HOST); request_counter = 0; requests = hypre_CTAlloc(hypre_MPI_Request, num_sends + num_recvs, HYPRE_MEMORY_HOST); status = hypre_CTAlloc(hypre_MPI_Status, num_sends + num_recvs, HYPRE_MEMORY_HOST); // allocate space for the receive buffers and post the receives for (i = 0; i < num_recvs; i++) { recv_buffer_size = hypre_AMGDDCommPkgRecvBufferSize(compGridCommPkg)[level][i]; recv_buffers[i] = hypre_CTAlloc(HYPRE_Complex, recv_buffer_size, HYPRE_MEMORY_HOST); hypre_MPI_Irecv(recv_buffers[i], recv_buffer_size, HYPRE_MPI_COMPLEX, hypre_AMGDDCommPkgRecvProcs(compGridCommPkg)[level][i], 3, comm, &requests[request_counter++]); } for (i = 0; i < num_sends; i++) { send_buffer_size = hypre_AMGDDCommPkgSendBufferSize(compGridCommPkg)[level][i]; send_buffers[i] = hypre_BoomerAMGDD_PackResidualBuffer(compGrid, compGridCommPkg, level, i); hypre_MPI_Isend(send_buffers[i], send_buffer_size, HYPRE_MPI_COMPLEX, hypre_AMGDDCommPkgSendProcs(compGridCommPkg)[level][i], 3, comm, &requests[request_counter++]); } // wait for buffers to be received hypre_MPI_Waitall( request_counter, requests, status ); hypre_TFree(requests, HYPRE_MEMORY_HOST); hypre_TFree(status, HYPRE_MEMORY_HOST); for (i = 0; i < num_sends; i++) { hypre_TFree(send_buffers[i], HYPRE_MEMORY_HOST); } hypre_TFree(send_buffers, HYPRE_MEMORY_HOST); // Unpack recv buffers for (i = 0; i < num_recvs; i++) { hypre_BoomerAMGDD_UnpackResidualBuffer(recv_buffers[i], compGrid, compGridCommPkg, level, i); } // clean up memory for this level for (i = 0; i < num_recvs; i++) { hypre_TFree(recv_buffers[i], HYPRE_MEMORY_HOST); } hypre_TFree(recv_buffers, HYPRE_MEMORY_HOST); } } } return hypre_error_flag; } HYPRE_Complex* hypre_BoomerAMGDD_PackResidualBuffer( hypre_AMGDDCompGrid **compGrid, hypre_AMGDDCommPkg *compGridCommPkg, HYPRE_Int current_level, HYPRE_Int proc ) { HYPRE_Complex *buffer; HYPRE_Int level, i; HYPRE_Int send_elmt; HYPRE_Int cnt = 0; buffer = hypre_CTAlloc(HYPRE_Complex, hypre_AMGDDCommPkgSendBufferSize(compGridCommPkg)[current_level][proc], HYPRE_MEMORY_HOST); for (level = current_level; level < hypre_AMGDDCommPkgNumLevels(compGridCommPkg); level++) { for (i = 0; i < hypre_AMGDDCommPkgNumSendNodes(compGridCommPkg)[current_level][proc][level]; i++) { send_elmt = hypre_AMGDDCommPkgSendFlag(compGridCommPkg)[current_level][proc][level][i]; if (send_elmt < hypre_AMGDDCompGridNumOwnedNodes(compGrid[level])) { buffer[cnt++] = hypre_VectorData(hypre_AMGDDCompGridVectorOwned(hypre_AMGDDCompGridF( compGrid[level])))[send_elmt]; } else { send_elmt -= hypre_AMGDDCompGridNumOwnedNodes(compGrid[level]); buffer[cnt++] = hypre_VectorData(hypre_AMGDDCompGridVectorNonOwned(hypre_AMGDDCompGridF( compGrid[level])))[send_elmt]; } } } return buffer; } HYPRE_Int hypre_BoomerAMGDD_UnpackResidualBuffer( HYPRE_Complex *buffer, hypre_AMGDDCompGrid **compGrid, hypre_AMGDDCommPkg *compGridCommPkg, HYPRE_Int current_level, HYPRE_Int proc ) { HYPRE_Int recv_elmt; HYPRE_Int level, i; HYPRE_Int cnt = 0; for (level = current_level; level < hypre_AMGDDCommPkgNumLevels(compGridCommPkg); level++) { for (i = 0; i < hypre_AMGDDCommPkgNumRecvNodes(compGridCommPkg)[current_level][proc][level]; i++) { recv_elmt = hypre_AMGDDCommPkgRecvMap(compGridCommPkg)[current_level][proc][level][i]; hypre_VectorData(hypre_AMGDDCompGridVectorNonOwned(hypre_AMGDDCompGridF( compGrid[level])))[recv_elmt] = buffer[cnt++]; } } return hypre_error_flag; } hypre-2.33.0/src/parcsr_ls/par_cg_relax_wt.c000066400000000000000000000326241477326011500210260ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * ParAMG cycling routine * *****************************************************************************/ #include "_hypre_parcsr_ls.h" #include "par_amg.h" /*-------------------------------------------------------------------------- * hypre_BoomerAMGCGRelaxWt *--------------------------------------------------------------------------*/ HYPRE_Int hypre_BoomerAMGCGRelaxWt( void *amg_vdata, HYPRE_Int level, HYPRE_Int num_cg_sweeps, HYPRE_Real *rlx_wt_ptr) { hypre_ParAMGData *amg_data = (hypre_ParAMGData*) amg_vdata; MPI_Comm comm; HYPRE_Solver *smoother = NULL; /* Data Structure variables */ /* hypre_ParCSRMatrix **A_array = hypre_ParAMGDataAArray(amg_data); */ /* hypre_ParCSRMatrix **R_array = hypre_ParAMGDataRArray(amg_data); */ hypre_ParCSRMatrix *A = hypre_ParAMGDataAArray(amg_data)[level]; /* hypre_ParVector **F_array = hypre_ParAMGDataFArray(amg_data); */ /* hypre_ParVector **U_array = hypre_ParAMGDataUArray(amg_data); */ hypre_ParVector *Utemp = NULL; hypre_ParVector *Vtemp; hypre_ParVector *Ptemp; hypre_ParVector *Rtemp; hypre_ParVector *Ztemp; hypre_ParVector *Qtemp = NULL; HYPRE_Int *CF_marker; HYPRE_Real *Ptemp_data; HYPRE_Real *Ztemp_data; /* HYPRE_Int **unknown_map_array; HYPRE_Int **point_map_array; HYPRE_Int **v_at_point_array; */ HYPRE_Int *grid_relax_type; /* Local variables */ HYPRE_Int Solve_err_flag; HYPRE_Int i, j, jj; HYPRE_Int num_sweeps; HYPRE_Int relax_type; HYPRE_Int local_size; HYPRE_Int old_size; HYPRE_Int my_id = 0; HYPRE_Int smooth_type; HYPRE_Int smooth_num_levels; HYPRE_Int smooth_option = 0; HYPRE_Int needQ = 0; hypre_Vector *l1_norms = NULL; HYPRE_Real alpha; HYPRE_Real beta; HYPRE_Real gamma = 1.0; HYPRE_Real gammaold; HYPRE_Real *tridiag; HYPRE_Real *trioffd; HYPRE_Real alphinv, row_sum = 0; HYPRE_Real max_row_sum = 0; HYPRE_Real rlx_wt = 0; HYPRE_Real rlx_wt_old = 0; HYPRE_Real lambda_max, lambda_max_old; /* HYPRE_Real lambda_min, lambda_min_old; */ #if 0 HYPRE_Real *D_mat; HYPRE_Real *S_vec; #endif #if !defined(HYPRE_USING_GPU) HYPRE_Int num_threads = hypre_NumThreads(); #endif /* Acquire data and allocate storage */ tridiag = hypre_CTAlloc(HYPRE_Real, num_cg_sweeps + 1, HYPRE_MEMORY_HOST); trioffd = hypre_CTAlloc(HYPRE_Real, num_cg_sweeps + 1, HYPRE_MEMORY_HOST); for (i = 0; i < num_cg_sweeps + 1; i++) { tridiag[i] = 0; trioffd[i] = 0; } Vtemp = hypre_ParAMGDataVtemp(amg_data); Rtemp = hypre_ParVectorCreate(hypre_ParCSRMatrixComm(A), hypre_ParCSRMatrixGlobalNumRows(A), hypre_ParCSRMatrixRowStarts(A)); hypre_ParVectorInitialize(Rtemp); Ptemp = hypre_ParVectorCreate(hypre_ParCSRMatrixComm(A), hypre_ParCSRMatrixGlobalNumRows(A), hypre_ParCSRMatrixRowStarts(A)); hypre_ParVectorInitialize(Ptemp); Ztemp = hypre_ParVectorCreate(hypre_ParCSRMatrixComm(A), hypre_ParCSRMatrixGlobalNumRows(A), hypre_ParCSRMatrixRowStarts(A)); hypre_ParVectorInitialize(Ztemp); if (hypre_ParAMGDataL1Norms(amg_data) != NULL) { l1_norms = hypre_ParAMGDataL1Norms(amg_data)[level]; } #if !defined(HYPRE_USING_GPU) if (num_threads > 1) #endif { needQ = 1; } grid_relax_type = hypre_ParAMGDataGridRelaxType(amg_data); smooth_type = hypre_ParAMGDataSmoothType(amg_data); smooth_num_levels = hypre_ParAMGDataSmoothNumLevels(amg_data); CF_marker = (hypre_ParAMGDataCFMarkerArray(amg_data)[level] != NULL) ? hypre_IntArrayData(hypre_ParAMGDataCFMarkerArray(amg_data)[level]) : NULL; /* Initialize */ Solve_err_flag = 0; comm = hypre_ParCSRMatrixComm(A); hypre_MPI_Comm_rank(comm, &my_id); if (smooth_num_levels > level) { smoother = hypre_ParAMGDataSmoother(amg_data); smooth_option = smooth_type; if (smooth_type > 6 && smooth_type < 10) { Utemp = hypre_ParVectorCreate(hypre_ParCSRMatrixComm(A), hypre_ParCSRMatrixGlobalNumRows(A), hypre_ParCSRMatrixRowStarts(A)); hypre_ParVectorInitialize(Utemp); } } /*--------------------------------------------------------------------- * Main loop of cycling *--------------------------------------------------------------------*/ relax_type = grid_relax_type[1]; num_sweeps = 1; local_size = hypre_CSRMatrixNumRows(hypre_ParCSRMatrixDiag(A)); old_size = hypre_VectorSize(hypre_ParVectorLocalVector(Vtemp)); hypre_VectorSize(hypre_ParVectorLocalVector(Vtemp)) = hypre_CSRMatrixNumRows(hypre_ParCSRMatrixDiag(A)); Ptemp_data = hypre_VectorData(hypre_ParVectorLocalVector(Ptemp)); Ztemp_data = hypre_VectorData(hypre_ParVectorLocalVector(Ztemp)); /* if (level == 0) hypre_ParVectorCopy(hypre_ParAMGDataFArray(amg_data)[0],Rtemp); else { hypre_ParVectorCopy(F_array[level-1],Vtemp); alpha = -1.0; beta = 1.0; hypre_ParCSRMatrixMatvec(alpha, A_array[level-1], U_array[level-1], beta, Vtemp); alpha = 1.0; beta = 0.0; hypre_ParCSRMatrixMatvecT(alpha,R_array[level-1],Vtemp, beta,F_array[level]); hypre_ParVectorCopy(F_array[level],Rtemp); } */ hypre_ParVectorSetRandomValues(Rtemp, 5128); if (needQ) { Qtemp = hypre_ParMultiVectorCreate(hypre_ParCSRMatrixComm(A), hypre_ParCSRMatrixGlobalNumRows(A), hypre_ParCSRMatrixRowStarts(A), needQ); hypre_ParVectorInitialize(Qtemp); } /*------------------------------------------------------------------ * Do the relaxation num_sweeps times *-----------------------------------------------------------------*/ for (jj = 0; jj < num_cg_sweeps; jj++) { hypre_ParVectorSetConstantValues(Ztemp, 0.0); for (j = 0; j < num_sweeps; j++) { if (smooth_num_levels > level) { if (smooth_option > 6) { hypre_ParVectorCopy(Rtemp, Vtemp); alpha = -1.0; beta = 1.0; hypre_ParCSRMatrixMatvec(alpha, A, Ztemp, beta, Vtemp); if (smooth_option == 8) { HYPRE_ParCSRParaSailsSolve(smoother[level], (HYPRE_ParCSRMatrix) A, (HYPRE_ParVector) Vtemp, (HYPRE_ParVector) Utemp); } else if (smooth_option == 7) { HYPRE_ParCSRPilutSolve(smoother[level], (HYPRE_ParCSRMatrix) A, (HYPRE_ParVector) Vtemp, (HYPRE_ParVector) Utemp); hypre_ParVectorAxpy(1.0, Utemp, Ztemp); } else if (smooth_option == 9) { HYPRE_EuclidSolve(smoother[level], (HYPRE_ParCSRMatrix) A, (HYPRE_ParVector) Vtemp, (HYPRE_ParVector) Utemp); hypre_ParVectorAxpy(1.0, Utemp, Ztemp); } } else if (smooth_option == 6) { HYPRE_SchwarzSolve(smoother[level], (HYPRE_ParCSRMatrix) A, (HYPRE_ParVector) Rtemp, (HYPRE_ParVector) Ztemp); } } else { Solve_err_flag = hypre_BoomerAMGRelax(A, Rtemp, CF_marker, relax_type, 0, 1.0, 1.0, l1_norms ? hypre_VectorData(l1_norms) : NULL, Ztemp, Vtemp, Qtemp); } if (Solve_err_flag != 0) { hypre_ParVectorDestroy(Ptemp); hypre_TFree(tridiag, HYPRE_MEMORY_HOST); hypre_TFree(trioffd, HYPRE_MEMORY_HOST); return (Solve_err_flag); } } gammaold = gamma; gamma = hypre_ParVectorInnerProd(Rtemp, Ztemp); if (jj == 0) { hypre_ParVectorCopy(Ztemp, Ptemp); beta = 1.0; } else { beta = gamma / gammaold; for (i = 0; i < local_size; i++) { Ptemp_data[i] = Ztemp_data[i] + beta * Ptemp_data[i]; } } hypre_ParCSRMatrixMatvec(1.0, A, Ptemp, 0.0, Vtemp); alpha = gamma / (hypre_ParVectorInnerProd(Ptemp, Vtemp) + HYPRE_REAL_MIN); alphinv = 1.0 / (alpha + HYPRE_REAL_MIN); tridiag[jj + 1] = alphinv; tridiag[jj] *= beta; tridiag[jj] += alphinv; trioffd[jj] *= hypre_sqrt(beta); trioffd[jj + 1] = -alphinv; row_sum = hypre_abs(tridiag[jj]) + hypre_abs(trioffd[jj]); if (row_sum > max_row_sum) { max_row_sum = row_sum; } if (jj > 0) { row_sum = hypre_abs(tridiag[jj - 1]) + hypre_abs(trioffd[jj - 1]) + hypre_abs(trioffd[jj]); if (row_sum > max_row_sum) { max_row_sum = row_sum; } /* lambda_min_old = lambda_min; */ lambda_max_old = lambda_max; rlx_wt_old = rlx_wt; hypre_Bisection(jj + 1, tridiag, trioffd, lambda_max_old, max_row_sum, 1.e-3, jj + 1, &lambda_max); rlx_wt = 1.0 / lambda_max; /* hypre_Bisection(jj+1, tridiag, trioffd, 0.0, lambda_min_old, 1.e-3, 1, &lambda_min); rlx_wt = 2.0/(lambda_min+lambda_max); */ if (hypre_abs(rlx_wt - rlx_wt_old) < 1.e-3 ) { /* if (my_id == 0) hypre_printf (" cg sweeps : %d\n", (jj+1)); */ break; } } else { /* lambda_min = tridiag[0]; */ lambda_max = tridiag[0]; } hypre_ParVectorAxpy(-alpha, Vtemp, Rtemp); } /*if (my_id == 0) hypre_printf (" lambda-min: %f lambda-max: %f\n", lambda_min, lambda_max); rlx_wt = hypre_abs(tridiag[0])+hypre_abs(trioffd[1]); for (i=1; i < num_cg_sweeps-1; i++) { row_sum = hypre_abs(tridiag[i]) + hypre_abs(trioffd[i]) + hypre_abs(trioffd[i+1]); if (row_sum > rlx_wt) rlx_wt = row_sum; } row_sum = hypre_abs(tridiag[num_cg_sweeps-1]) + hypre_abs(trioffd[num_cg_sweeps-1]); if (row_sum > rlx_wt) rlx_wt = row_sum; hypre_Bisection(num_cg_sweeps, tridiag, trioffd, 0.0, rlx_wt, 1.e-3, 1, &lambda_min); hypre_Bisection(num_cg_sweeps, tridiag, trioffd, 0.0, rlx_wt, 1.e-3, num_cg_sweeps, &lambda_max); */ hypre_VectorSize(hypre_ParVectorLocalVector(Vtemp)) = old_size; hypre_ParVectorDestroy(Ztemp); hypre_ParVectorDestroy(Ptemp); hypre_ParVectorDestroy(Rtemp); if (Qtemp) { hypre_ParVectorDestroy(Qtemp); } hypre_TFree(tridiag, HYPRE_MEMORY_HOST); hypre_TFree(trioffd, HYPRE_MEMORY_HOST); if (smooth_option > 6 && smooth_option < 10) { hypre_ParVectorDestroy(Utemp); } *rlx_wt_ptr = rlx_wt; return (Solve_err_flag); } /*-------------------------------------------------------------------------- * hypre_Bisection *--------------------------------------------------------------------------*/ HYPRE_Int hypre_Bisection(HYPRE_Int n, HYPRE_Real *diag, HYPRE_Real *offd, HYPRE_Real y, HYPRE_Real z, HYPRE_Real tol, HYPRE_Int k, HYPRE_Real *ev_ptr) { HYPRE_Real x; HYPRE_Real eigen_value; HYPRE_Int ierr = 0; HYPRE_Int sign_change = 0; HYPRE_Int i; HYPRE_Real p0, p1, p2; while (hypre_abs(y - z) > tol * (hypre_abs(y) + hypre_abs(z))) { x = (y + z) / 2; sign_change = 0; p0 = 1; p1 = diag[0] - x; if (p0 * p1 <= 0) { sign_change++; } for (i = 1; i < n; i++) { p2 = (diag[i] - x) * p1 - offd[i] * offd[i] * p0; p0 = p1; p1 = p2; if (p0 * p1 <= 0) { sign_change++; } } if (sign_change >= k) { z = x; } else { y = x; } } eigen_value = (y + z) / 2; *ev_ptr = eigen_value; return ierr; } hypre-2.33.0/src/parcsr_ls/par_cgc_coarsen.c000066400000000000000000001434671477326011500210060ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * *****************************************************************************/ /* following should be in a header file */ #include "_hypre_parcsr_ls.h" #include "../HYPRE.h" /* BM Aug 15, 2006 */ #include "_hypre_IJ_mv.h" #define C_PT 1 #define F_PT -1 #define Z_PT -2 #define SF_PT -3 /* special fine points */ #define UNDECIDED 0 /************************************************************** * * CGC Coarsening routine * **************************************************************/ HYPRE_Int hypre_BoomerAMGCoarsenCGCb( hypre_ParCSRMatrix *S, hypre_ParCSRMatrix *A, HYPRE_Int measure_type, HYPRE_Int coarsen_type, HYPRE_Int cgc_its, HYPRE_Int debug_flag, hypre_IntArray **CF_marker_ptr) { #ifdef HYPRE_MIXEDINT hypre_error_w_msg(HYPRE_ERROR_GENERIC, "CGC coarsening is not enabled in mixedint mode!"); return hypre_error_flag; #endif MPI_Comm comm = hypre_ParCSRMatrixComm(S); hypre_ParCSRCommPkg *comm_pkg = hypre_ParCSRMatrixCommPkg(S); hypre_ParCSRCommHandle *comm_handle; hypre_CSRMatrix *S_diag = hypre_ParCSRMatrixDiag(S); hypre_CSRMatrix *S_offd = hypre_ParCSRMatrixOffd(S); HYPRE_Int *S_i = hypre_CSRMatrixI(S_diag); HYPRE_Int *S_j = hypre_CSRMatrixJ(S_diag); HYPRE_Int *S_offd_i = hypre_CSRMatrixI(S_offd); /*HYPRE_Int *S_offd_j = hypre_CSRMatrixJ(S_offd);*/ HYPRE_Int num_variables = hypre_CSRMatrixNumRows(S_diag); HYPRE_Int num_cols_offd = hypre_CSRMatrixNumCols(S_offd); hypre_CSRMatrix *S_ext = NULL; HYPRE_Int *S_ext_i; HYPRE_BigInt *S_ext_j; hypre_CSRMatrix *ST; HYPRE_Int *ST_i; HYPRE_Int *ST_j; HYPRE_Int *CF_marker; HYPRE_Int *CF_marker_offd = NULL; HYPRE_Int ci_tilde = -1; HYPRE_Int ci_tilde_mark = -1; HYPRE_Int *measure_array; HYPRE_Int *measure_array_master; HYPRE_Int *graph_array; HYPRE_Int *int_buf_data = NULL; /*HYPRE_Int *ci_array=NULL;*/ HYPRE_Int i, j, k, l, jS; HYPRE_Int ji, jj, index; HYPRE_Int set_empty = 1; HYPRE_Int C_i_nonempty = 0; HYPRE_Int num_nonzeros; HYPRE_Int num_procs, my_id; HYPRE_Int num_sends = 0; HYPRE_BigInt first_col; HYPRE_Int start; /*HYPRE_Int col_0, col_n;*/ hypre_LinkList LoL_head; hypre_LinkList LoL_tail; HYPRE_Int *lists, *where; HYPRE_Int measure, new_meas; HYPRE_Int num_left; HYPRE_Int nabor, nabor_two; HYPRE_Int use_commpkg_A = 0; HYPRE_Real wall_time = 0.0; HYPRE_Int measure_max = 0; /* BM Aug 30, 2006: maximal measure, needed for CGC */ if (coarsen_type < 0) { coarsen_type = -coarsen_type; } /*------------------------------------------------------- * Initialize the C/F marker, LoL_head, LoL_tail arrays *-------------------------------------------------------*/ LoL_head = NULL; LoL_tail = NULL; lists = hypre_CTAlloc(HYPRE_Int, num_variables, HYPRE_MEMORY_HOST); where = hypre_CTAlloc(HYPRE_Int, num_variables, HYPRE_MEMORY_HOST); #if 0 /* debugging */ char filename[256]; FILE *fp; HYPRE_Int iter = 0; #endif /*-------------------------------------------------------------- * Compute a CSR strength matrix, S. * * For now, the "strength" of dependence/influence is defined in * the following way: i depends on j if * aij > hypre_max (k != i) aik, aii < 0 * or * aij < hypre_min (k != i) aik, aii >= 0 * Then S_ij = 1, else S_ij = 0. * * NOTE: the entries are negative initially, corresponding * to "unaccounted-for" dependence. *----------------------------------------------------------------*/ if (debug_flag == 3) { wall_time = time_getWallclockSeconds(); } hypre_MPI_Comm_size(comm, &num_procs); hypre_MPI_Comm_rank(comm, &my_id); if (!comm_pkg) { use_commpkg_A = 1; comm_pkg = hypre_ParCSRMatrixCommPkg(A); } if (!comm_pkg) { hypre_MatvecCommPkgCreate(A); comm_pkg = hypre_ParCSRMatrixCommPkg(A); } num_sends = hypre_ParCSRCommPkgNumSends(comm_pkg); /*if (num_cols_offd) S_offd_j = hypre_CSRMatrixJ(S_offd);*/ jS = S_i[num_variables]; ST = hypre_CSRMatrixCreate(num_variables, num_variables, jS); ST_i = hypre_CTAlloc(HYPRE_Int, num_variables + 1, HYPRE_MEMORY_HOST); ST_j = hypre_CTAlloc(HYPRE_Int, jS, HYPRE_MEMORY_HOST); hypre_CSRMatrixI(ST) = ST_i; hypre_CSRMatrixJ(ST) = ST_j; hypre_CSRMatrixMemoryLocation(ST) = HYPRE_MEMORY_HOST; /*---------------------------------------------------------- * generate transpose of S, ST *----------------------------------------------------------*/ for (i = 0; i <= num_variables; i++) { ST_i[i] = 0; } for (i = 0; i < jS; i++) { ST_i[S_j[i] + 1]++; } for (i = 0; i < num_variables; i++) { ST_i[i + 1] += ST_i[i]; } for (i = 0; i < num_variables; i++) { for (j = S_i[i]; j < S_i[i + 1]; j++) { index = S_j[j]; ST_j[ST_i[index]] = i; ST_i[index]++; } } for (i = num_variables; i > 0; i--) { ST_i[i] = ST_i[i - 1]; } ST_i[0] = 0; /*---------------------------------------------------------- * Compute the measures * * The measures are given by the row sums of ST. * Hence, measure_array[i] is the number of influences * of variable i. * correct actual measures through adding influences from * neighbor processors *----------------------------------------------------------*/ measure_array_master = hypre_CTAlloc(HYPRE_Int, num_variables, HYPRE_MEMORY_HOST); measure_array = hypre_CTAlloc(HYPRE_Int, num_variables, HYPRE_MEMORY_HOST); for (i = 0; i < num_variables; i++) { measure_array_master[i] = ST_i[i + 1] - ST_i[i]; } if ((measure_type || (coarsen_type != 1 && coarsen_type != 11)) && num_procs > 1) { if (use_commpkg_A) { S_ext = hypre_ParCSRMatrixExtractBExt(S, A, 0); } else { S_ext = hypre_ParCSRMatrixExtractBExt(S, S, 0); } S_ext_i = hypre_CSRMatrixI(S_ext); S_ext_j = hypre_CSRMatrixBigJ(S_ext); num_nonzeros = S_ext_i[num_cols_offd]; first_col = hypre_ParCSRMatrixFirstColDiag(S); /*col_0 = first_col-1; col_n = col_0+num_variables;*/ if (measure_type) { for (i = 0; i < num_nonzeros; i++) { index = (HYPRE_Int)(S_ext_j[i] - first_col); if (index > -1 && index < num_variables) { measure_array_master[index]++; } } } } /*--------------------------------------------------- * Loop until all points are either fine or coarse. *---------------------------------------------------*/ if (debug_flag == 3) { wall_time = time_getWallclockSeconds(); } /* first coarsening phase */ /************************************************************* * * Initialize the lists * *************************************************************/ /* Allocate CF_marker if not done before */ if (*CF_marker_ptr == NULL) { *CF_marker_ptr = hypre_IntArrayCreate(num_variables); hypre_IntArrayInitialize(*CF_marker_ptr); } CF_marker = hypre_IntArrayData(*CF_marker_ptr); num_left = 0; for (j = 0; j < num_variables; j++) { if ((S_i[j + 1] - S_i[j]) == 0 && (S_offd_i[j + 1] - S_offd_i[j]) == 0) { CF_marker[j] = SF_PT; measure_array_master[j] = 0; } else { CF_marker[j] = UNDECIDED; /* num_left++; */ /* BM May 19, 2006: see below*/ } } if (coarsen_type == 22) { /* BM Sep 8, 2006: allow_emptygrids only if the following holds for all points j: (a) the point has no strong connections at all, OR (b) the point has a strong connection across a boundary */ for (j = 0; j < num_variables; j++) if (S_i[j + 1] > S_i[j] && S_offd_i[j + 1] == S_offd_i[j]) {coarsen_type = 21; break;} } for (l = 1; l <= cgc_its; l++) { LoL_head = NULL; LoL_tail = NULL; num_left = 0; /* compute num_left before each RS coarsening loop */ hypre_TMemcpy(measure_array, measure_array_master, HYPRE_Int, num_variables, HYPRE_MEMORY_HOST, HYPRE_MEMORY_HOST); memset (lists, 0, sizeof(HYPRE_Int)*num_variables); memset (where, 0, sizeof(HYPRE_Int)*num_variables); for (j = 0; j < num_variables; j++) { measure = measure_array[j]; if (CF_marker[j] != SF_PT) { if (measure > 0) { hypre_enter_on_lists(&LoL_head, &LoL_tail, measure, j, lists, where); num_left++; /* compute num_left before each RS coarsening loop */ } else if (CF_marker[j] == 0) /* increase weight of strongly coupled neighbors only if j is not conained in a previously constructed coarse grid. Reason: these neighbors should start with the same initial weight in each CGC iteration. BM Aug 30, 2006 */ { if (measure < 0) { hypre_error_w_msg(HYPRE_ERROR_GENERIC, "negative measure!\n"); } /* CF_marker[j] = f_pnt; */ for (k = S_i[j]; k < S_i[j + 1]; k++) { nabor = S_j[k]; /* if (CF_marker[nabor] != SF_PT) */ if (CF_marker[nabor] == 0) /* BM Aug 30, 2006: don't alter weights of points contained in other candidate coarse grids */ { if (nabor < j) { new_meas = measure_array[nabor]; if (new_meas > 0) hypre_remove_point(&LoL_head, &LoL_tail, new_meas, nabor, lists, where); else { num_left++; } /* BM Aug 29, 2006 */ new_meas = ++(measure_array[nabor]); hypre_enter_on_lists(&LoL_head, &LoL_tail, new_meas, nabor, lists, where); } else { new_meas = ++(measure_array[nabor]); } } } /* --num_left; */ /* BM May 19, 2006 */ } } } /* BM Aug 30, 2006: first iteration: determine maximal weight */ if (num_left && l == 1) { measure_max = measure_array[LoL_head->head]; } /* BM Aug 30, 2006: break CGC iteration if no suitable starting point is available any more */ if (!num_left || measure_array[LoL_head->head] < measure_max) { while (LoL_head) { hypre_LinkList list_ptr = LoL_head; LoL_head = LoL_head->next_elt; hypre_dispose_elt (list_ptr); } break; } /**************************************************************** * * Main loop of Ruge-Stueben first coloring pass. * * WHILE there are still points to classify DO: * 1) find first point, i, on list with max_measure * make i a C-point, remove it from the lists * 2) For each point, j, in S_i^T, * a) Set j to be an F-point * b) For each point, k, in S_j * move k to the list in LoL with measure one * greater than it occupies (creating new LoL * entry if necessary) * 3) For each point, j, in S_i, * move j to the list in LoL with measure one * smaller than it occupies (creating new LoL * entry if necessary) * ****************************************************************/ while (num_left > 0) { index = LoL_head -> head; /* index = LoL_head -> tail; */ /* CF_marker[index] = C_PT; */ CF_marker[index] = l; /* BM Aug 18, 2006 */ measure = measure_array[index]; measure_array[index] = 0; measure_array_master[index] = 0; /* BM May 19: for CGC */ --num_left; hypre_remove_point(&LoL_head, &LoL_tail, measure, index, lists, where); for (j = ST_i[index]; j < ST_i[index + 1]; j++) { nabor = ST_j[j]; /* if (CF_marker[nabor] == UNDECIDED) */ if (measure_array[nabor] > 0) /* undecided point */ { /* CF_marker[nabor] = F_PT; */ /* BM Aug 18, 2006 */ measure = measure_array[nabor]; measure_array[nabor] = 0; hypre_remove_point(&LoL_head, &LoL_tail, measure, nabor, lists, where); --num_left; for (k = S_i[nabor]; k < S_i[nabor + 1]; k++) { nabor_two = S_j[k]; /* if (CF_marker[nabor_two] == UNDECIDED) */ if (measure_array[nabor_two] > 0) /* undecided point */ { measure = measure_array[nabor_two]; hypre_remove_point(&LoL_head, &LoL_tail, measure, nabor_two, lists, where); new_meas = ++(measure_array[nabor_two]); hypre_enter_on_lists(&LoL_head, &LoL_tail, new_meas, nabor_two, lists, where); } } } } for (j = S_i[index]; j < S_i[index + 1]; j++) { nabor = S_j[j]; /* if (CF_marker[nabor] == UNDECIDED) */ if (measure_array[nabor] > 0) /* undecided point */ { measure = measure_array[nabor]; hypre_remove_point(&LoL_head, &LoL_tail, measure, nabor, lists, where); measure_array[nabor] = --measure; if (measure > 0) hypre_enter_on_lists(&LoL_head, &LoL_tail, measure, nabor, lists, where); else { /* CF_marker[nabor] = F_PT; */ /* BM Aug 18, 2006 */ --num_left; for (k = S_i[nabor]; k < S_i[nabor + 1]; k++) { nabor_two = S_j[k]; /* if (CF_marker[nabor_two] == UNDECIDED) */ if (measure_array[nabor_two] > 0) { new_meas = measure_array[nabor_two]; hypre_remove_point(&LoL_head, &LoL_tail, new_meas, nabor_two, lists, where); new_meas = ++(measure_array[nabor_two]); hypre_enter_on_lists(&LoL_head, &LoL_tail, new_meas, nabor_two, lists, where); } } } } } } if (LoL_head) { hypre_error_w_msg (HYPRE_ERROR_GENERIC, "Linked list not empty!\n"); } /*head: %d\n",LoL_head->head);*/ } l--; /* BM Aug 15, 2006 */ hypre_TFree(measure_array, HYPRE_MEMORY_HOST); hypre_TFree(measure_array_master, HYPRE_MEMORY_HOST); hypre_CSRMatrixDestroy(ST); if (debug_flag == 3) { wall_time = time_getWallclockSeconds() - wall_time; hypre_printf("Proc = %d Coarsen 1st pass = %f\n", my_id, wall_time); } hypre_TFree(lists, HYPRE_MEMORY_HOST); hypre_TFree(where, HYPRE_MEMORY_HOST); if (num_procs > 1) { if (debug_flag == 3) { wall_time = time_getWallclockSeconds(); } hypre_BoomerAMGCoarsenCGC (S, l, coarsen_type, CF_marker); if (debug_flag == 3) { wall_time = time_getWallclockSeconds() - wall_time; hypre_printf("Proc = %d Coarsen CGC = %f\n", my_id, wall_time); } } else { /* the first candiate coarse grid is the coarse grid */ for (j = 0; j < num_variables; j++) { if (CF_marker[j] == 1) { CF_marker[j] = C_PT; } else { CF_marker[j] = F_PT; } } } /* BM May 19, 2006: Set all undecided points to be fine grid points. */ for (j = 0; j < num_variables; j++) if (!CF_marker[j]) { CF_marker[j] = F_PT; } /*--------------------------------------------------- * Initialize the graph array *---------------------------------------------------*/ graph_array = hypre_CTAlloc(HYPRE_Int, num_variables, HYPRE_MEMORY_HOST); for (i = 0; i < num_variables; i++) { graph_array[i] = -1; } if (debug_flag == 3) { wall_time = time_getWallclockSeconds(); } for (i = 0; i < num_variables; i++) { if (ci_tilde_mark != i) { ci_tilde = -1; } if (CF_marker[i] == -1) { for (ji = S_i[i]; ji < S_i[i + 1]; ji++) { j = S_j[ji]; if (CF_marker[j] > 0) { graph_array[j] = i; } } for (ji = S_i[i]; ji < S_i[i + 1]; ji++) { j = S_j[ji]; if (CF_marker[j] == -1) { set_empty = 1; for (jj = S_i[j]; jj < S_i[j + 1]; jj++) { index = S_j[jj]; if (graph_array[index] == i) { set_empty = 0; break; } } if (set_empty) { if (C_i_nonempty) { CF_marker[i] = 1; if (ci_tilde > -1) { CF_marker[ci_tilde] = -1; ci_tilde = -1; } C_i_nonempty = 0; break; } else { ci_tilde = j; ci_tilde_mark = i; CF_marker[j] = 1; C_i_nonempty = 1; i--; break; } } } } } } if (debug_flag == 3 && coarsen_type != 2) { wall_time = time_getWallclockSeconds() - wall_time; hypre_printf("Proc = %d Coarsen 2nd pass = %f\n", my_id, wall_time); } /* third pass, check boundary fine points for coarse neighbors */ /*------------------------------------------------ * Exchange boundary data for CF_marker *------------------------------------------------*/ if (debug_flag == 3) { wall_time = time_getWallclockSeconds(); } CF_marker_offd = hypre_CTAlloc(HYPRE_Int, num_cols_offd, HYPRE_MEMORY_HOST); int_buf_data = hypre_CTAlloc(HYPRE_Int, hypre_ParCSRCommPkgSendMapStart(comm_pkg, num_sends), HYPRE_MEMORY_HOST); index = 0; for (i = 0; i < num_sends; i++) { start = hypre_ParCSRCommPkgSendMapStart(comm_pkg, i); for (j = start; j < hypre_ParCSRCommPkgSendMapStart(comm_pkg, i + 1); j++) int_buf_data[index++] = CF_marker[hypre_ParCSRCommPkgSendMapElmt(comm_pkg, j)]; } if (num_procs > 1) { comm_handle = hypre_ParCSRCommHandleCreate(11, comm_pkg, int_buf_data, CF_marker_offd); hypre_ParCSRCommHandleDestroy(comm_handle); } hypre_AmgCGCBoundaryFix (S, CF_marker, CF_marker_offd); if (debug_flag == 3) { wall_time = time_getWallclockSeconds() - wall_time; hypre_printf("Proc = %d CGC boundary fix = %f\n", my_id, wall_time); } /*--------------------------------------------------- * Clean up and return *---------------------------------------------------*/ /*if (coarsen_type != 1) { */ if (CF_marker_offd) { hypre_TFree(CF_marker_offd, HYPRE_MEMORY_HOST); } /* BM Aug 21, 2006 */ if (int_buf_data) { hypre_TFree(int_buf_data, HYPRE_MEMORY_HOST); } /* BM Aug 21, 2006 */ /*if (ci_array) hypre_TFree(ci_array);*/ /* BM Aug 21, 2006 */ /*} */ hypre_TFree(graph_array, HYPRE_MEMORY_HOST); if ((measure_type || (coarsen_type != 1 && coarsen_type != 11)) && num_procs > 1) { hypre_CSRMatrixDestroy(S_ext); } return hypre_error_flag; } /* begin Bram added */ HYPRE_Int hypre_BoomerAMGCoarsenCGC (hypre_ParCSRMatrix *S, HYPRE_Int numberofgrids, HYPRE_Int coarsen_type, HYPRE_Int *CF_marker) /* CGC algorithm * ==================================================================================================== * coupling : the strong couplings * numberofgrids : the number of grids * coarsen_type : the coarsening type * gridpartition : the grid partition * =====================================================================================================*/ { HYPRE_Int j,/*p,*/mpisize, mpirank,/*rstart,rend,*/choice, *coarse; HYPRE_Int *vertexrange = NULL; HYPRE_Int *vertexrange_all = NULL; HYPRE_Int *CF_marker_offd = NULL; HYPRE_Int num_variables = hypre_CSRMatrixNumRows (hypre_ParCSRMatrixDiag(S)); /* HYPRE_Int num_cols_offd = hypre_CSRMatrixNumCols (hypre_ParCSRMatrixOffd (S)); */ /* HYPRE_Int *col_map_offd = hypre_ParCSRMatrixColMapOffd (S); */ /* HYPRE_Real wall_time; */ HYPRE_IJMatrix ijG; hypre_ParCSRMatrix *G; hypre_CSRMatrix *Gseq; MPI_Comm comm = hypre_ParCSRMatrixComm(S); hypre_MPI_Comm_size (comm, &mpisize); hypre_MPI_Comm_rank (comm, &mpirank); #if 0 if (!mpirank) { wall_time = time_getWallclockSeconds(); hypre_printf ("Starting CGC preparation\n"); } #endif hypre_AmgCGCPrepare (S, numberofgrids, CF_marker, &CF_marker_offd, coarsen_type, &vertexrange); #if 0 /* debugging */ if (!mpirank) { wall_time = time_getWallclockSeconds() - wall_time; hypre_printf ("Finished CGC preparation, wall_time = %f s\n", wall_time); wall_time = time_getWallclockSeconds(); hypre_printf ("Starting CGC matrix assembly\n"); } #endif hypre_AmgCGCGraphAssemble (S, vertexrange, CF_marker, CF_marker_offd, coarsen_type, &ijG); #if 0 HYPRE_IJMatrixPrint (ijG, "graph.txt"); #endif HYPRE_IJMatrixGetObject (ijG, (void**)&G); #if 0 /* debugging */ if (!mpirank) { wall_time = time_getWallclockSeconds() - wall_time; hypre_printf ("Finished CGC matrix assembly, wall_time = %f s\n", wall_time); wall_time = time_getWallclockSeconds(); hypre_printf ("Starting CGC matrix communication\n"); } #endif { /* classical CGC does not really make sense with an assumed partition, but anyway, here it is: */ HYPRE_Int nlocal = vertexrange[1] - vertexrange[0]; vertexrange_all = hypre_CTAlloc(HYPRE_Int, mpisize + 1, HYPRE_MEMORY_HOST); hypre_MPI_Allgather (&nlocal, 1, HYPRE_MPI_INT, vertexrange_all + 1, 1, HYPRE_MPI_INT, comm); vertexrange_all[0] = 0; for (j = 2; j <= mpisize; j++) { vertexrange_all[j] += vertexrange_all[j - 1]; } } Gseq = hypre_ParCSRMatrixToCSRMatrixAll(G); #if 0 /* debugging */ if (!mpirank) { wall_time = time_getWallclockSeconds() - wall_time; hypre_printf ("Finished CGC matrix communication, wall_time = %f s\n", wall_time); } #endif if (Gseq) /* BM Aug 31, 2006: Gseq==NULL if G has no local rows */ { #if 0 /* debugging */ if (!mpirank) { wall_time = time_getWallclockSeconds(); hypre_printf ("Starting CGC election\n"); } #endif hypre_AmgCGCChoose (Gseq, vertexrange_all, mpisize, &coarse); #if 0 /* debugging */ if (!mpirank) { wall_time = time_getWallclockSeconds() - wall_time; hypre_printf ("Finished CGC election, wall_time = %f s\n", wall_time); } #endif #if 0 /* debugging */ if (!mpirank) { for (j = 0; j < mpisize; j++) { hypre_printf ("Processor %d, choice = %d of range %d - %d\n", j, coarse[j], vertexrange_all[j] + 1, vertexrange_all[j + 1]); } } fflush(stdout); #endif #if 0 /* debugging */ if (!mpirank) { wall_time = time_getWallclockSeconds(); hypre_printf ("Starting CGC CF assignment\n"); } #endif choice = coarse[mpirank]; for (j = 0; j < num_variables; j++) { if (CF_marker[j] == choice) { CF_marker[j] = C_PT; } else { CF_marker[j] = F_PT; } } hypre_CSRMatrixDestroy (Gseq); hypre_TFree(coarse, HYPRE_MEMORY_HOST); } else for (j = 0; j < num_variables; j++) { CF_marker[j] = F_PT; } #if 0 if (!mpirank) { wall_time = time_getWallclockSeconds() - wall_time; hypre_printf ("Finished CGC CF assignment, wall_time = %f s\n", wall_time); } #endif #if 0 /* debugging */ if (!mpirank) { wall_time = time_getWallclockSeconds(); hypre_printf ("Starting CGC cleanup\n"); } #endif HYPRE_IJMatrixDestroy (ijG); hypre_TFree(vertexrange, HYPRE_MEMORY_HOST); hypre_TFree(vertexrange_all, HYPRE_MEMORY_HOST); hypre_TFree(CF_marker_offd, HYPRE_MEMORY_HOST); #if 0 if (!mpirank) { wall_time = time_getWallclockSeconds() - wall_time; hypre_printf ("Finished CGC cleanup, wall_time = %f s\n", wall_time); } #endif return hypre_error_flag; } HYPRE_Int hypre_AmgCGCPrepare (hypre_ParCSRMatrix *S, HYPRE_Int nlocal, HYPRE_Int *CF_marker, HYPRE_Int **CF_marker_offd, HYPRE_Int coarsen_type, HYPRE_Int **vrange) /* assemble a graph representing the connections between the grids * ================================================================================================ * S : the strength matrix * nlocal : the number of locally created coarse grids * CF_marker, CF_marker_offd : the coare/fine markers * coarsen_type : the coarsening type * vrange : the ranges of the vertices representing coarse grids * ================================================================================================*/ { HYPRE_Int mpisize, mpirank; HYPRE_Int num_sends; HYPRE_Int *vertexrange = NULL; HYPRE_Int vstart/*,vend*/; HYPRE_Int *int_buf_data; HYPRE_Int start; HYPRE_Int i, ii, j; HYPRE_Int num_variables = hypre_CSRMatrixNumRows (hypre_ParCSRMatrixDiag(S)); HYPRE_Int num_cols_offd = hypre_CSRMatrixNumCols (hypre_ParCSRMatrixOffd (S)); MPI_Comm comm = hypre_ParCSRMatrixComm(S); /* hypre_MPI_Status status; */ hypre_ParCSRCommPkg *comm_pkg = hypre_ParCSRMatrixCommPkg (S); hypre_ParCSRCommHandle *comm_handle; hypre_MPI_Comm_size (comm, &mpisize); hypre_MPI_Comm_rank (comm, &mpirank); if (!comm_pkg) { hypre_MatvecCommPkgCreate (S); comm_pkg = hypre_ParCSRMatrixCommPkg (S); } num_sends = hypre_ParCSRCommPkgNumSends (comm_pkg); if (coarsen_type % 2 == 0) { nlocal++; } /* even coarsen_type means allow_emptygrids */ { HYPRE_Int scan_recv; vertexrange = hypre_CTAlloc(HYPRE_Int, 2, HYPRE_MEMORY_HOST); hypre_MPI_Scan(&nlocal, &scan_recv, 1, HYPRE_MPI_INT, hypre_MPI_SUM, comm); /* first point in my range */ vertexrange[0] = scan_recv - nlocal; /* first point in next proc's range */ vertexrange[1] = scan_recv; vstart = vertexrange[0]; /*vend = vertexrange[1];*/ } /* Note: vstart uses 0-based indexing, while CF_marker uses 1-based indexing */ if (coarsen_type % 2 == 1) /* see above */ { for (i = 0; i < num_variables; i++) if (CF_marker[i] > 0) { CF_marker[i] += vstart; } } else { /* hypre_printf ("processor %d: empty grid allowed\n",mpirank); */ for (i = 0; i < num_variables; i++) { if (CF_marker[i] > 0) { CF_marker[i] += vstart + 1; } /* add one because vertexrange[mpirank]+1 denotes the empty grid. Hence, vertexrange[mpirank]+2 is the first coarse grid denoted in global indices, ... */ } } /* exchange data */ *CF_marker_offd = hypre_CTAlloc(HYPRE_Int, num_cols_offd, HYPRE_MEMORY_HOST); int_buf_data = hypre_CTAlloc(HYPRE_Int, hypre_ParCSRCommPkgSendMapStart (comm_pkg, num_sends), HYPRE_MEMORY_HOST); for (i = 0, ii = 0; i < num_sends; i++) { start = hypre_ParCSRCommPkgSendMapStart (comm_pkg, i); for (j = start; j < hypre_ParCSRCommPkgSendMapStart (comm_pkg, i + 1); j++) { int_buf_data [ii++] = CF_marker[hypre_ParCSRCommPkgSendMapElmt(comm_pkg, j)]; } } if (mpisize > 1) { comm_handle = hypre_ParCSRCommHandleCreate (11, comm_pkg, int_buf_data, *CF_marker_offd); hypre_ParCSRCommHandleDestroy (comm_handle); } hypre_TFree(int_buf_data, HYPRE_MEMORY_HOST); *vrange = vertexrange; return hypre_error_flag; } #define tag_pointrange 301 #define tag_vertexrange 302 /*-------------------------------------------------------------------------- * hypre_AmgCGCGraphAssemble * * Assemble a graph representing the connections between the grids * * S : the strength matrix * vertexrange : the parallel layout of the candidate coarse grid vertices * CF_marker, CF_marker_offd : the coarse/fine markers * coarsen_type : the coarsening type * ijG : the created graph *--------------------------------------------------------------------------*/ HYPRE_Int hypre_AmgCGCGraphAssemble(hypre_ParCSRMatrix *S, HYPRE_Int *vertexrange, HYPRE_Int *CF_marker, HYPRE_Int *CF_marker_offd, HYPRE_Int coarsen_type, HYPRE_IJMatrix *ijG) { HYPRE_UNUSED_VAR(coarsen_type); HYPRE_Int i,/* ii,ip,*/ j, jj, m, n, p; HYPRE_Int mpisize, mpirank; MPI_Comm comm = hypre_ParCSRMatrixComm(S); /* hypre_MPI_Status status; */ HYPRE_IJMatrix ijmatrix; hypre_CSRMatrix *S_diag = hypre_ParCSRMatrixDiag (S); hypre_CSRMatrix *S_offd = hypre_ParCSRMatrixOffd (S); /* HYPRE_Int *S_i = hypre_CSRMatrixI(S_diag); */ /* HYPRE_Int *S_j = hypre_CSRMatrixJ(S_diag); */ HYPRE_Int *S_offd_i = hypre_CSRMatrixI(S_offd); HYPRE_Int *S_offd_j = NULL; HYPRE_Int num_variables = hypre_CSRMatrixNumRows (S_diag); HYPRE_Int num_cols_offd = hypre_CSRMatrixNumCols (S_offd); HYPRE_BigInt *col_map_offd = hypre_ParCSRMatrixColMapOffd (S); HYPRE_BigInt *pointrange; HYPRE_Int *pointrange_nonlocal, *pointrange_strong = NULL; HYPRE_Int vertexrange_start, vertexrange_end; HYPRE_Int *vertexrange_strong = NULL; HYPRE_Int *vertexrange_nonlocal; HYPRE_Int num_recvs, num_recvs_strong; HYPRE_Int *recv_procs, *recv_procs_strong = NULL; HYPRE_Int /* *zeros,*rownz,*/*rownz_diag, *rownz_offd; HYPRE_Int nz; HYPRE_Int nlocal; //HYPRE_Int one=1; hypre_ParCSRCommPkg *comm_pkg = hypre_ParCSRMatrixCommPkg (S); hypre_MPI_Comm_size (comm, &mpisize); hypre_MPI_Comm_rank (comm, &mpirank); /* determine neighbor processors */ num_recvs = hypre_ParCSRCommPkgNumRecvs (comm_pkg); recv_procs = hypre_ParCSRCommPkgRecvProcs (comm_pkg); pointrange = hypre_ParCSRMatrixRowStarts (S); pointrange_nonlocal = hypre_CTAlloc(HYPRE_Int, 2 * num_recvs, HYPRE_MEMORY_HOST); vertexrange_nonlocal = hypre_CTAlloc(HYPRE_Int, 2 * num_recvs, HYPRE_MEMORY_HOST); { HYPRE_Int num_sends = hypre_ParCSRCommPkgNumSends (comm_pkg); HYPRE_Int *send_procs = hypre_ParCSRCommPkgSendProcs (comm_pkg); HYPRE_Int *int_buf_data = hypre_CTAlloc(HYPRE_Int, 4 * num_sends, HYPRE_MEMORY_HOST); HYPRE_Int *int_buf_data2 = int_buf_data + 2 * num_sends; hypre_MPI_Request *sendrequest, *recvrequest; HYPRE_Int pointrange_start, pointrange_end; nlocal = vertexrange[1] - vertexrange[0]; pointrange_start = pointrange[0]; pointrange_end = pointrange[1]; vertexrange_start = vertexrange[0]; vertexrange_end = vertexrange[1]; sendrequest = hypre_CTAlloc(hypre_MPI_Request, 2 * (num_sends + num_recvs), HYPRE_MEMORY_HOST); recvrequest = sendrequest + 2 * num_sends; for (i = 0; i < num_recvs; i++) { hypre_MPI_Irecv (pointrange_nonlocal + 2 * i, 2, HYPRE_MPI_INT, recv_procs[i], tag_pointrange, comm, &recvrequest[2 * i]); hypre_MPI_Irecv (vertexrange_nonlocal + 2 * i, 2, HYPRE_MPI_INT, recv_procs[i], tag_vertexrange, comm, &recvrequest[2 * i + 1]); } for (i = 0; i < num_sends; i++) { int_buf_data[2 * i] = pointrange_start; int_buf_data[2 * i + 1] = pointrange_end; int_buf_data2[2 * i] = vertexrange_start; int_buf_data2[2 * i + 1] = vertexrange_end; hypre_MPI_Isend (int_buf_data + 2 * i, 2, HYPRE_MPI_INT, send_procs[i], tag_pointrange, comm, &sendrequest[2 * i]); hypre_MPI_Isend (int_buf_data2 + 2 * i, 2, HYPRE_MPI_INT, send_procs[i], tag_vertexrange, comm, &sendrequest[2 * i + 1]); } hypre_MPI_Waitall (2 * (num_sends + num_recvs), sendrequest, hypre_MPI_STATUSES_IGNORE); hypre_TFree(int_buf_data, HYPRE_MEMORY_HOST); hypre_TFree(sendrequest, HYPRE_MEMORY_HOST); } /* now we have the array recv_procs. However, it may contain too many entries as it is inherited from A. We now have to determine the subset which contains only the strongly connected neighbors */ if (num_cols_offd) { S_offd_j = hypre_CSRMatrixJ(S_offd); recv_procs_strong = hypre_CTAlloc(HYPRE_Int, num_recvs, HYPRE_MEMORY_HOST); memset (recv_procs_strong, 0, num_recvs * sizeof(HYPRE_Int)); /* don't forget to shorten the pointrange and vertexrange arrays accordingly */ pointrange_strong = hypre_CTAlloc(HYPRE_Int, 2 * num_recvs, HYPRE_MEMORY_HOST); memset (pointrange_strong, 0, 2 * num_recvs * sizeof(HYPRE_Int)); vertexrange_strong = hypre_CTAlloc(HYPRE_Int, 2 * num_recvs, HYPRE_MEMORY_HOST); memset (vertexrange_strong, 0, 2 * num_recvs * sizeof(HYPRE_Int)); for (i = 0; i < num_variables; i++) for (j = S_offd_i[i]; j < S_offd_i[i + 1]; j++) { jj = col_map_offd[S_offd_j[j]]; for (p = 0; p < num_recvs; p++) /* S_offd_j is NOT sorted! */ if (jj >= pointrange_nonlocal[2 * p] && jj < pointrange_nonlocal[2 * p + 1]) { break; } #if 0 hypre_printf ("Processor %d, remote point %d on processor %d\n", mpirank, jj, recv_procs[p]); #endif recv_procs_strong [p] = 1; } for (p = 0, num_recvs_strong = 0; p < num_recvs; p++) { if (recv_procs_strong[p]) { recv_procs_strong[num_recvs_strong] = recv_procs[p]; pointrange_strong[2 * num_recvs_strong] = pointrange_nonlocal[2 * p]; pointrange_strong[2 * num_recvs_strong + 1] = pointrange_nonlocal[2 * p + 1]; vertexrange_strong[2 * num_recvs_strong] = vertexrange_nonlocal[2 * p]; vertexrange_strong[2 * num_recvs_strong + 1] = vertexrange_nonlocal[2 * p + 1]; num_recvs_strong++; } } } else { num_recvs_strong = 0; } hypre_TFree(pointrange_nonlocal, HYPRE_MEMORY_HOST); hypre_TFree(vertexrange_nonlocal, HYPRE_MEMORY_HOST); rownz_diag = hypre_CTAlloc(HYPRE_Int, 2 * nlocal, HYPRE_MEMORY_HOST); rownz_offd = rownz_diag + nlocal; for (p = 0, nz = 0; p < num_recvs_strong; p++) { nz += vertexrange_strong[2 * p + 1] - vertexrange_strong[2 * p]; } for (m = 0; m < nlocal; m++) { rownz_diag[m] = nlocal - 1; rownz_offd[m] = nz; } HYPRE_IJMatrixCreate(comm, vertexrange_start, vertexrange_end - 1, vertexrange_start, vertexrange_end - 1, &ijmatrix); HYPRE_IJMatrixSetObjectType(ijmatrix, HYPRE_PARCSR); HYPRE_IJMatrixSetDiagOffdSizes (ijmatrix, rownz_diag, rownz_offd); HYPRE_IJMatrixInitialize(ijmatrix); hypre_TFree(rownz_diag, HYPRE_MEMORY_HOST); HYPRE_MemoryLocation memory_location = hypre_IJMatrixMemoryLocation(ijmatrix); HYPRE_BigInt *big_m_n = hypre_TAlloc(HYPRE_BigInt, 2, memory_location); HYPRE_Real *weight = hypre_TAlloc(HYPRE_Real, 1, memory_location); /* initialize graph */ weight[0] = -1; for (m = vertexrange_start; m < vertexrange_end; m++) { big_m_n[0] = (HYPRE_BigInt) m; for (p = 0; p < num_recvs_strong; p++) { for (n = vertexrange_strong[2 * p]; n < vertexrange_strong[2 * p + 1]; n++) { big_m_n[1] = (HYPRE_BigInt) n; HYPRE_IJMatrixAddToValues (ijmatrix, 1, NULL, &big_m_n[0], &big_m_n[1], &weight[0]); /*#if 0 if (ierr) hypre_printf ("Processor %d: error %d while initializing graphs at (%d, %d)\n",mpirank,ierr,m,n); #endif*/ } } } /* weight graph */ for (i = 0; i < num_variables; i++) { for (j = S_offd_i[i]; j < S_offd_i[i + 1]; j++) { jj = S_offd_j[j]; /* jj is not a global index!!! */ /* determine processor */ for (p = 0; p < num_recvs_strong; p++) if (col_map_offd[jj] >= pointrange_strong[2 * p] && col_map_offd[jj] < pointrange_strong[2 * p + 1]) { break; } /*ip=recv_procs_strong[p];*/ /* loop over all coarse grids constructed on this processor domain */ for (m = vertexrange_start; m < vertexrange_end; m++) { big_m_n[0] = (HYPRE_BigInt) m; /* loop over all coarse grids constructed on neighbor processor domain */ for (n = vertexrange_strong[2 * p]; n < vertexrange_strong[2 * p + 1]; n++) { big_m_n[1] = (HYPRE_BigInt) n; /* coarse grid counting inside gridpartition->local/gridpartition->nonlocal starts with one while counting inside range starts with zero */ if (CF_marker[i] - 1 == m && CF_marker_offd[jj] - 1 == n) /* C-C-coupling */ { weight[0] = -1; } else if ( (CF_marker[i] - 1 == m && (CF_marker_offd[jj] == 0 || CF_marker_offd[jj] - 1 != n) ) || ( (CF_marker[i] == 0 || CF_marker[i] - 1 != m) && CF_marker_offd[jj] - 1 == n ) ) /* C-F-coupling */ { weight[0] = 0; } else { weight[0] = -8; } /* F-F-coupling */ HYPRE_IJMatrixAddToValues (ijmatrix, 1, NULL, &big_m_n[0], &big_m_n[1], &weight[0]); /*#if 0 if (ierr) hypre_printf ("Processor %d: error %d while adding %lf to entry (%d, %d)\n",mpirank,ierr,weight,m,n); #endif*/ } } } } /* assemble */ HYPRE_IJMatrixAssemble (ijmatrix); /*if (num_recvs_strong) {*/ hypre_TFree(recv_procs_strong, HYPRE_MEMORY_HOST); hypre_TFree(pointrange_strong, HYPRE_MEMORY_HOST); hypre_TFree(vertexrange_strong, HYPRE_MEMORY_HOST); hypre_TFree(big_m_n, memory_location); hypre_TFree(weight, memory_location); /*} */ *ijG = ijmatrix; return hypre_error_flag; } HYPRE_Int hypre_AmgCGCChoose (hypre_CSRMatrix *G, HYPRE_Int *vertexrange, HYPRE_Int mpisize, HYPRE_Int **coarse) /* chooses one grid for every processor * ============================================================ * G : the connectivity graph * map : the parallel layout * mpisize : number of procs * coarse : the chosen coarse grids * ===========================================================*/ { HYPRE_Int i, j, jj, p, choice, *processor; HYPRE_Int measure, new_measure; /* MPI_Comm comm = hypre_ParCSRMatrixComm(G); */ /* hypre_ParCSRCommPkg *comm_pkg = hypre_ParCSRMatrixCommPkg (G); */ /* hypre_ParCSRCommHandle *comm_handle; */ HYPRE_Real *G_data = hypre_CSRMatrixData (G); HYPRE_Real max; HYPRE_Int *G_i = hypre_CSRMatrixI(G); HYPRE_Int *G_j = hypre_CSRMatrixJ(G); hypre_CSRMatrix *H, *HT; HYPRE_Int *H_i, *H_j, *HT_i, *HT_j; HYPRE_Int jG, jH; HYPRE_Int num_vertices = hypre_CSRMatrixNumRows (G); HYPRE_Int *measure_array; HYPRE_Int *lists, *where; hypre_LinkList LoL_head = NULL; hypre_LinkList LoL_tail = NULL; processor = hypre_CTAlloc(HYPRE_Int, num_vertices, HYPRE_MEMORY_HOST); *coarse = hypre_CTAlloc(HYPRE_Int, mpisize, HYPRE_MEMORY_HOST); memset (*coarse, 0, sizeof(HYPRE_Int)*mpisize); measure_array = hypre_CTAlloc(HYPRE_Int, num_vertices, HYPRE_MEMORY_HOST); lists = hypre_CTAlloc(HYPRE_Int, num_vertices, HYPRE_MEMORY_HOST); where = hypre_CTAlloc(HYPRE_Int, num_vertices, HYPRE_MEMORY_HOST); /* for (p=0;p= 0.0) { hypre_printf ("G[%d,%d]=0. G_j(j)=%d, G_data(j)=%f.\n", i, G_j[j], j, G_data[j]); } #endif /* G_data is always negative, so this test is sufficient */ if (choice == -1 || G_data[j] > max) { choice = G_j[j]; max = G_data[j]; } if (j == G_i[i + 1] - 1 || processor[G_j[j + 1]] > processor[choice]) { /* we are done for this processor boundary */ H_j[jj++] = choice; H_i[i + 1]++; #if 0 hypre_printf (" %d", choice); #endif choice = -1; max = 0; } } #if 0 hypre_printf("\n"); #endif } /****************************************************************** * compute H^T, the transpose of H ******************************************************************/ jH = H_i[num_vertices]; HT = hypre_CSRMatrixCreate (num_vertices, num_vertices, jH); HT_i = hypre_CTAlloc(HYPRE_Int, num_vertices + 1, HYPRE_MEMORY_HOST); HT_j = hypre_CTAlloc(HYPRE_Int, jH, HYPRE_MEMORY_HOST); hypre_CSRMatrixI(HT) = HT_i; hypre_CSRMatrixJ(HT) = HT_j; hypre_CSRMatrixMemoryLocation(HT) = HYPRE_MEMORY_HOST; for (i = 0; i <= num_vertices; i++) { HT_i[i] = 0; } for (i = 0; i < jH; i++) { HT_i[H_j[i] + 1]++; } for (i = 0; i < num_vertices; i++) { HT_i[i + 1] += HT_i[i]; } for (i = 0; i < num_vertices; i++) { for (j = H_i[i]; j < H_i[i + 1]; j++) { HYPRE_Int myindex = H_j[j]; HT_j[HT_i[myindex]] = i; HT_i[myindex]++; } } for (i = num_vertices; i > 0; i--) { HT_i[i] = HT_i[i - 1]; } HT_i[0] = 0; /***************************************************************** * set initial vertex weights *****************************************************************/ for (i = 0; i < num_vertices; i++) { measure_array[i] = H_i[i + 1] - H_i[i] + HT_i[i + 1] - HT_i[i]; hypre_enter_on_lists (&LoL_head, &LoL_tail, measure_array[i], i, lists, where); } /****************************************************************** * apply CGC iteration ******************************************************************/ while (LoL_head && measure_array[LoL_head->head]) { choice = LoL_head->head; measure = measure_array[choice]; #if 0 hypre_printf ("Choice: %d, measure %d, processor %d\n", choice, measure, processor[choice]); fflush(stdout); #endif (*coarse)[processor[choice]] = choice + 1; /* add one because coarsegrid indexing starts with 1, not 0 */ /* new maximal weight */ new_measure = measure + 1; for (i = vertexrange[processor[choice]]; i < vertexrange[processor[choice] + 1]; i++) { /* set weights for all remaining vertices on this processor to zero */ measure = measure_array[i]; hypre_remove_point (&LoL_head, &LoL_tail, measure, i, lists, where); measure_array[i] = 0; } for (j = H_i[choice]; j < H_i[choice + 1]; j++) { jj = H_j[j]; /* if no vertex is chosen on this proc, set weights of all heavily coupled vertices to max1 */ if (!(*coarse)[processor[jj]]) { measure = measure_array[jj]; hypre_remove_point (&LoL_head, &LoL_tail, measure, jj, lists, where); hypre_enter_on_lists (&LoL_head, &LoL_tail, new_measure, jj, lists, where); measure_array[jj] = new_measure; } } for (j = HT_i[choice]; j < HT_i[choice + 1]; j++) { jj = HT_j[j]; /* if no vertex is chosen on this proc, set weights of all heavily coupled vertices to max1 */ if (!(*coarse)[processor[jj]]) { measure = measure_array[jj]; hypre_remove_point (&LoL_head, &LoL_tail, measure, jj, lists, where); hypre_enter_on_lists (&LoL_head, &LoL_tail, new_measure, jj, lists, where); measure_array[jj] = new_measure; } } } /* remove remaining list elements, if they exist. They all should have measure 0 */ while (LoL_head) { i = LoL_head->head; measure = measure_array[i]; #if 0 hypre_assert (measure == 0); #endif hypre_remove_point (&LoL_head, &LoL_tail, measure, i, lists, where); } for (p = 0; p < mpisize; p++) /* if the algorithm has not determined a coarse vertex for this proc, simply take the last one Do not take the first one, it might by empty! */ if (!(*coarse)[p]) { (*coarse)[p] = vertexrange[p + 1]; /* hypre_printf ("choice for processor %d: %d\n",p,range[p]+1); */ } /******************************************** * clean up ********************************************/ hypre_CSRMatrixDestroy (H); hypre_CSRMatrixDestroy (HT); hypre_TFree(processor, HYPRE_MEMORY_HOST); hypre_TFree(measure_array, HYPRE_MEMORY_HOST); hypre_TFree(lists, HYPRE_MEMORY_HOST); hypre_TFree(where, HYPRE_MEMORY_HOST); return hypre_error_flag; } HYPRE_Int hypre_AmgCGCBoundaryFix (hypre_ParCSRMatrix *S, HYPRE_Int *CF_marker, HYPRE_Int *CF_marker_offd) /* Checks whether an interpolation is possible for a fine grid point with strong couplings. * Required after CGC coarsening * ======================================================================================== * S : the strength matrix * CF_marker, CF_marker_offd : the coarse/fine markers * ========================================================================================*/ { HYPRE_Int mpirank, i, j, has_c_pt; hypre_CSRMatrix *S_diag = hypre_ParCSRMatrixDiag (S); hypre_CSRMatrix *S_offd = hypre_ParCSRMatrixOffd (S); HYPRE_Int *S_i = hypre_CSRMatrixI(S_diag); HYPRE_Int *S_j = hypre_CSRMatrixJ(S_diag); HYPRE_Int *S_offd_i = hypre_CSRMatrixI(S_offd); HYPRE_Int *S_offd_j = NULL; HYPRE_Int num_variables = hypre_CSRMatrixNumRows (S_diag); HYPRE_Int num_cols_offd = hypre_CSRMatrixNumCols (S_offd); //HYPRE_Int added_cpts = 0; MPI_Comm comm = hypre_ParCSRMatrixComm(S); hypre_MPI_Comm_rank (comm, &mpirank); if (num_cols_offd) { S_offd_j = hypre_CSRMatrixJ(S_offd); } for (i = 0; i < num_variables; i++) { if (S_offd_i[i] == S_offd_i[i + 1] || CF_marker[i] == C_PT) { continue; } has_c_pt = 0; /* fine grid point with strong connections across the boundary */ for (j = S_i[i]; j < S_i[i + 1]; j++) if (CF_marker[S_j[j]] == C_PT) {has_c_pt = 1; break;} if (has_c_pt) { continue; } for (j = S_offd_i[i]; j < S_offd_i[i + 1]; j++) if (CF_marker_offd[S_offd_j[j]] == C_PT) {has_c_pt = 1; break;} if (has_c_pt) { continue; } /* all points i is strongly coupled to are fine: make i C_PT */ CF_marker[i] = C_PT; #if 0 hypre_printf ("Processor %d: added point %d in hypre_AmgCGCBoundaryFix\n", mpirank, i); added_cpts++; #endif } #if 0 if (added_cpts) { hypre_printf ("Processor %d: added %d points in hypre_AmgCGCBoundaryFix\n", mpirank, added_cpts); } fflush(stdout); #endif return hypre_error_flag; } hypre-2.33.0/src/parcsr_ls/par_cheby.c000066400000000000000000000354761477326011500176320ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * Chebyshev setup and solve * *****************************************************************************/ #include "_hypre_parcsr_ls.h" #include "_hypre_parcsr_mv.h" #include "float.h" /****************************************************************************** Chebyshev relaxation Can specify order 1-4 (this is the order of the resid polynomial)- here we explicitly code the coefficients (instead of iteratively determining) variant 0: standard chebyshev this is rlx 11 if scale = 0, and 16 if scale == 1 variant 1: modified cheby: T(t)* f(t) where f(t) = (1-b/t) this is rlx 15 if scale = 0, and 17 if scale == 1 ratio indicates the percentage of the whole spectrum to use (so .5 means half, and .1 means 10percent) *******************************************************************************/ /** * @brief Setups of coefficients (and optional diagonal scaling elements) for * Chebyshev relaxation * * Will calculate ds_ptr on device/host depending on where A is located * * @param[in] A Matrix for which to seteup * @param[in] max_eig Maximum eigenvalue * @param[in] min_eig Maximum eigenvalue * @param[in] fraction Fraction used to calculate lower bound * @param[in] order Polynomial order to use [1,4] * @param[in] scale Whether or not to scale by the diagonal * @param[in] variant Whether or not to use a variant of Chebyshev (0 standard, 1 variant) * @param[out] coefs_ptr *coefs_ptr will be allocated to contain coefficients of the polynomial * @param[out] ds_ptr *ds_ptr will be allocated to allow scaling by the diagonal */ HYPRE_Int hypre_ParCSRRelax_Cheby_Setup(hypre_ParCSRMatrix *A, /* matrix to relax with */ HYPRE_Real max_eig, HYPRE_Real min_eig, HYPRE_Real fraction, HYPRE_Int order, /* polynomial order */ HYPRE_Int scale, /* scale by diagonal?*/ HYPRE_Int variant, HYPRE_Real **coefs_ptr, HYPRE_Real **ds_ptr) /* initial/updated approximation */ { hypre_CSRMatrix *A_diag = hypre_ParCSRMatrixDiag(A); HYPRE_Real theta, delta; HYPRE_Real den; HYPRE_Real upper_bound, lower_bound; HYPRE_Int num_rows = hypre_CSRMatrixNumRows(A_diag); HYPRE_Real *coefs = NULL; HYPRE_Int cheby_order; HYPRE_Real *ds_data = NULL; /* u = u + p(A)r */ if (order > 4) { order = 4; } if (order < 1) { order = 1; } coefs = hypre_CTAlloc(HYPRE_Real, order + 1, HYPRE_MEMORY_HOST); /* we are using the order of p(A) */ cheby_order = order - 1; if (max_eig <= 0.0) { upper_bound = min_eig * 1.1; lower_bound = max_eig - (max_eig - upper_bound) * fraction; } else { /* make sure we are large enough - Adams et al. 2003 */ upper_bound = max_eig * 1.1; /* lower_bound = max_eig/fraction; */ lower_bound = (upper_bound - min_eig) * fraction + min_eig; } /* theta and delta */ theta = (upper_bound + lower_bound) / 2; delta = (upper_bound - lower_bound) / 2; if (variant == 1) { switch (cheby_order) /* these are the corresponding cheby polynomials: u = u_o + s(A)r_0 - so order is one less that resid poly: r(t) = 1 - t*s(t) */ { case 0: coefs[0] = 1.0 / theta; break; case 1: /* (del - t + 2*th)/(th^2 + del*th) */ den = (theta * theta + delta * theta); coefs[0] = (delta + 2 * theta) / den; coefs[1] = -1.0 / den; break; case 2: /* (4*del*th - del^2 - t*(2*del + 6*th) + 2*t^2 + 6*th^2)/(2*del*th^2 - del^2*th - del^3 + 2*th^3)*/ den = 2 * delta * theta * theta - delta * delta * theta - hypre_pow(delta, 3) + 2 * hypre_pow(theta, 3); coefs[0] = (4 * delta * theta - hypre_pow(delta, 2) + 6 * hypre_pow(theta, 2)) / den; coefs[1] = -(2 * delta + 6 * theta) / den; coefs[2] = 2 / den; break; case 3: /* -(6*del^2*th - 12*del*th^2 - t^2*(4*del + 16*th) + t*(12*del*th - 3*del^2 + 24*th^2) + 3*del^3 + 4*t^3 - 16*th^3)/(4*del*th^3 - 3*del^2*th^2 - 3*del^3*th + 4*th^4)*/ den = - 4 * delta * hypre_pow(theta, 3) + 3 * hypre_pow(delta, 2) * hypre_pow(theta, 2) + 3 * hypre_pow(delta, 3) * theta - 4 * hypre_pow(theta, 4); coefs[0] = (6 * hypre_pow(delta, 2) * theta - 12 * delta * hypre_pow(theta, 2) + 3 * hypre_pow(delta, 3) - 16 * hypre_pow(theta, 3) ) / den; coefs[1] = (12 * delta * theta - 3 * hypre_pow(delta, 2) + 24 * hypre_pow(theta, 2)) / den; coefs[2] = -( 4 * delta + 16 * theta) / den; coefs[3] = 4 / den; break; } } else /* standard chebyshev */ { switch (cheby_order) /* these are the corresponding cheby polynomials: u = u_o + s(A)r_0 - so order is one less thatn resid poly: r(t) = 1 - t*s(t) */ { case 0: coefs[0] = 1.0 / theta; break; case 1: /* ( 2*t - 4*th)/(del^2 - 2*th^2) */ den = delta * delta - 2 * theta * theta; coefs[0] = -4 * theta / den; coefs[1] = 2 / den; break; case 2: /* (3*del^2 - 4*t^2 + 12*t*th - 12*th^2)/(3*del^2*th - 4*th^3)*/ den = 3 * (delta * delta) * theta - 4 * (theta * theta * theta); coefs[0] = (3 * delta * delta - 12 * theta * theta) / den; coefs[1] = 12 * theta / den; coefs[2] = -4 / den; break; case 3: /*(t*(8*del^2 - 48*th^2) - 16*del^2*th + 32*t^2*th - 8*t^3 + 32*th^3)/(del^4 - 8*del^2*th^2 + 8*th^4)*/ den = hypre_pow(delta, 4) - 8 * delta * delta * theta * theta + 8 * hypre_pow(theta, 4); coefs[0] = (32 * hypre_pow(theta, 3) - 16 * delta * delta * theta) / den; coefs[1] = (8 * delta * delta - 48 * theta * theta) / den; coefs[2] = 32 * theta / den; coefs[3] = -8 / den; break; } } *coefs_ptr = coefs; if (scale) { /*grab 1/hypre_sqrt(abs(diagonal)) */ ds_data = hypre_CTAlloc(HYPRE_Real, num_rows, hypre_ParCSRMatrixMemoryLocation(A)); hypre_CSRMatrixExtractDiagonal(hypre_ParCSRMatrixDiag(A), ds_data, 4); } /* end of scaling code */ *ds_ptr = ds_data; return hypre_error_flag; } /** * @brief Solve using a chebyshev polynomial on the host * * @param[in] A Matrix to relax with * @param[in] f right-hand side * @param[in] ds_data Diagonal information * @param[in] coefs Polynomial coefficients * @param[in] order Order of the polynomial * @param[in] scale Whether or not to scale by diagonal * @param[in] scale Whether or not to use a variant * @param[in,out] u Initial/updated approximation * @param[in] v Temp vector * @param[in] r Temp Vector * @param[in] orig_u_vec Temp Vector * @param[in] tmp Temp Vector */ HYPRE_Int hypre_ParCSRRelax_Cheby_SolveHost(hypre_ParCSRMatrix *A, /* matrix to relax with */ hypre_ParVector *f, /* right-hand side */ HYPRE_Real *ds_data, HYPRE_Real *coefs, HYPRE_Int order, /* polynomial order */ HYPRE_Int scale, /* scale by diagonal?*/ HYPRE_Int variant, hypre_ParVector *u, /* initial/updated approximation */ hypre_ParVector *v, /* temporary vector */ hypre_ParVector *r, /* another vector */ hypre_ParVector *orig_u_vec, /*another temp vector */ hypre_ParVector *tmp_vec) /*a potential temp vector */ { HYPRE_UNUSED_VAR(variant); hypre_CSRMatrix *A_diag = hypre_ParCSRMatrixDiag(A); HYPRE_Real *u_data = hypre_VectorData(hypre_ParVectorLocalVector(u)); HYPRE_Real *f_data = hypre_VectorData(hypre_ParVectorLocalVector(f)); HYPRE_Real *v_data = hypre_VectorData(hypre_ParVectorLocalVector(v)); HYPRE_Real *r_data = hypre_VectorData(hypre_ParVectorLocalVector(r)); HYPRE_Int i, j; HYPRE_Int num_rows = hypre_CSRMatrixNumRows(A_diag); HYPRE_Real mult; HYPRE_Real *orig_u; HYPRE_Int cheby_order; HYPRE_Real *tmp_data; /* u = u + p(A)r */ if (order > 4) { order = 4; } if (order < 1) { order = 1; } /* we are using the order of p(A) */ cheby_order = order - 1; hypre_assert(hypre_VectorSize(hypre_ParVectorLocalVector(orig_u_vec)) >= num_rows); orig_u = hypre_VectorData(hypre_ParVectorLocalVector(orig_u_vec)); if (!scale) { /* get residual: r = f - A*u */ hypre_ParVectorCopy(f, r); hypre_ParCSRMatrixMatvec(-1.0, A, u, 1.0, r); /* o = u; u = r .* coef */ for ( i = 0; i < num_rows; i++ ) { orig_u[i] = u_data[i]; u_data[i] = r_data[i] * coefs[cheby_order]; } for (i = cheby_order - 1; i >= 0; i-- ) { hypre_ParCSRMatrixMatvec(1.0, A, u, 0.0, v); mult = coefs[i]; /* u = mult * r + v */ #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(j) HYPRE_SMP_SCHEDULE #endif for ( j = 0; j < num_rows; j++ ) { u_data[j] = mult * r_data[j] + v_data[j]; } } /* u = o + u */ #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i) HYPRE_SMP_SCHEDULE #endif for ( i = 0; i < num_rows; i++ ) { u_data[i] = orig_u[i] + u_data[i]; } } else /* scaling! */ { /*grab 1/hypre_sqrt(diagonal) */ tmp_data = hypre_VectorData(hypre_ParVectorLocalVector(tmp_vec)); /* get ds_data and get scaled residual: r = D^(-1/2)f - * D^(-1/2)A*u */ hypre_ParCSRMatrixMatvec(-1.0, A, u, 0.0, tmp_vec); /* r = ds .* (f + tmp) */ #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(j) HYPRE_SMP_SCHEDULE #endif for ( j = 0; j < num_rows; j++ ) { r_data[j] = ds_data[j] * (f_data[j] + tmp_data[j]); } /* save original u, then start the iteration by multiplying r by the cheby coef.*/ /* o = u; u = r * coef */ #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(j) HYPRE_SMP_SCHEDULE #endif for ( j = 0; j < num_rows; j++ ) { orig_u[j] = u_data[j]; /* orig, unscaled u */ u_data[j] = r_data[j] * coefs[cheby_order]; } /* now do the other coefficients */ for (i = cheby_order - 1; i >= 0; i-- ) { /* v = D^(-1/2)AD^(-1/2)u */ /* tmp = ds .* u */ #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(j) HYPRE_SMP_SCHEDULE #endif for ( j = 0; j < num_rows; j++ ) { tmp_data[j] = ds_data[j] * u_data[j]; } hypre_ParCSRMatrixMatvec(1.0, A, tmp_vec, 0.0, v); /* u_new = coef*r + v*/ mult = coefs[i]; /* u = coef * r + ds .* v */ #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(j) HYPRE_SMP_SCHEDULE #endif for ( j = 0; j < num_rows; j++ ) { u_data[j] = mult * r_data[j] + ds_data[j] * v_data[j]; } } /* end of cheby_order loop */ /* now we have to scale u_data before adding it to u_orig*/ /* u = orig_u + ds .* u */ #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(j) HYPRE_SMP_SCHEDULE #endif for ( j = 0; j < num_rows; j++ ) { u_data[j] = orig_u[j] + ds_data[j] * u_data[j]; } }/* end of scaling code */ return hypre_error_flag; } /** * @brief Solve using a chebyshev polynomial * * Determines whether to solve on host or device * * @param[in] A Matrix to relax with * @param[in] f right-hand side * @param[in] ds_data Diagonal information * @param[in] coefs Polynomial coefficients * @param[in] order Order of the polynomial * @param[in] scale Whether or not to scale by diagonal * @param[in] scale Whether or not to use a variant * @param[in,out] u Initial/updated approximation * @param[out] v Temp vector * @param[out] r Temp Vector * @param[out] orig_u_vec Temp Vector * @param[out] tmp_vec Temp Vector */ HYPRE_Int hypre_ParCSRRelax_Cheby_Solve(hypre_ParCSRMatrix *A, /* matrix to relax with */ hypre_ParVector *f, /* right-hand side */ HYPRE_Real *ds_data, HYPRE_Real *coefs, HYPRE_Int order, /* polynomial order */ HYPRE_Int scale, /* scale by diagonal?*/ HYPRE_Int variant, hypre_ParVector *u, /* initial/updated approximation */ hypre_ParVector *v, /* temporary vector */ hypre_ParVector *r, /*another temp vector */ hypre_ParVector *orig_u_vec, /*another temp vector */ hypre_ParVector *tmp_vec) /*another temp vector */ { hypre_GpuProfilingPushRange("ParCSRRelaxChebySolve"); HYPRE_Int ierr = 0; /* Sanity check */ if (hypre_ParVectorNumVectors(f) > 1) { hypre_error_w_msg(HYPRE_ERROR_GENERIC, "Requested relaxation type doesn't support multicomponent vectors"); return hypre_error_flag; } #if defined(HYPRE_USING_GPU) HYPRE_ExecutionPolicy exec = hypre_GetExecPolicy1(hypre_ParCSRMatrixMemoryLocation(A)); if (exec == HYPRE_EXEC_DEVICE) { ierr = hypre_ParCSRRelax_Cheby_SolveDevice(A, f, ds_data, coefs, order, scale, variant, u, v, r, orig_u_vec, tmp_vec); } else #endif { ierr = hypre_ParCSRRelax_Cheby_SolveHost(A, f, ds_data, coefs, order, scale, variant, u, v, r, orig_u_vec, tmp_vec); } hypre_GpuProfilingPopRange(); return ierr; } hypre-2.33.0/src/parcsr_ls/par_cheby_device.c000066400000000000000000000233771477326011500211460ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * Chebyshev setup and solve Device * *****************************************************************************/ #include "_hypre_onedpl.hpp" #include "_hypre_parcsr_ls.h" #include "_hypre_parcsr_mv.h" #include "float.h" #if defined(HYPRE_USING_GPU) #include "_hypre_utilities.hpp" #if defined(HYPRE_USING_SYCL) namespace thrust = std; #endif /** * @brief waxpyz * * Performs * w = a*x+y.*z * For scalars w,x,y,z and constant a (indices 0, 1, 2, 3 respectively) */ template struct waxpyz { typedef thrust::tuple Tuple; const T scale; waxpyz(T _scale) : scale(_scale) {} __host__ __device__ void operator()(Tuple t) const { thrust::get<0>(t) = scale * thrust::get<1>(t) + thrust::get<2>(t) * thrust::get<3>(t); } }; /** * @brief wxypz * * Performs * o = x * (y .+ z) * For scalars o,x,y,z (indices 0, 1, 2, 3 respectively) */ template struct wxypz { typedef thrust::tuple Tuple; __host__ __device__ void operator()(Tuple t) const { thrust::get<0>(t) = thrust::get<1>(t) * (thrust::get<2>(t) + thrust::get<3>(t)); } }; /** * @brief Saves u into o, then scales r placing the result in u * * Performs * o = u * u = r * a * For scalars o and u, with constant a */ template struct save_and_scale { typedef thrust::tuple Tuple; const T scale; save_and_scale(T _scale) : scale(_scale) {} __host__ __device__ void operator()(Tuple t) const { thrust::get<0>(t) = thrust::get<1>(t); thrust::get<1>(t) = thrust::get<2>(t) * scale; } }; /** * @brief xpyz * * Performs * y = x + y .* z * For scalars x,y,z (indices 1,0,2 respectively) */ template struct xpyz { typedef thrust::tuple Tuple; __host__ __device__ void operator()(Tuple t) const { thrust::get<0>(t) = thrust::get<1>(t) + thrust::get<2>(t) * thrust::get<0>(t); } }; /** * @brief Solve using a chebyshev polynomial on the device * * @param[in] A Matrix to relax with * @param[in] f right-hand side * @param[in] ds_data Diagonal information * @param[in] coefs Polynomial coefficients * @param[in] order Order of the polynomial * @param[in] scale Whether or not to scale by diagonal * @param[in] scale Whether or not to use a variant * @param[in,out] u Initial/updated approximation * @param[out] v Temp vector * @param[out] v Temp Vector */ HYPRE_Int hypre_ParCSRRelax_Cheby_SolveDevice(hypre_ParCSRMatrix *A, /* matrix to relax with */ hypre_ParVector *f, /* right-hand side */ HYPRE_Real *ds_data, HYPRE_Real *coefs, HYPRE_Int order, /* polynomial order */ HYPRE_Int scale, /* scale by diagonal?*/ HYPRE_Int variant, hypre_ParVector *u, /* initial/updated approximation */ hypre_ParVector *v, /* temporary vector */ hypre_ParVector *r, /*another temp vector */ hypre_ParVector *orig_u_vec, /*another temp vector */ hypre_ParVector *tmp_vec) /*a potential temp vector */ { HYPRE_UNUSED_VAR(variant); hypre_CSRMatrix *A_diag = hypre_ParCSRMatrixDiag(A); HYPRE_Real *u_data = hypre_VectorData(hypre_ParVectorLocalVector(u)); HYPRE_Real *f_data = hypre_VectorData(hypre_ParVectorLocalVector(f)); HYPRE_Real *v_data = hypre_VectorData(hypre_ParVectorLocalVector(v)); HYPRE_Real *r_data = hypre_VectorData(hypre_ParVectorLocalVector(r)); HYPRE_Int i; HYPRE_Int num_rows = hypre_CSRMatrixNumRows(A_diag); HYPRE_Real mult; HYPRE_Int cheby_order; HYPRE_Real *tmp_data; /* u = u + p(A)r */ if (order > 4) { order = 4; } if (order < 1) { order = 1; } /* we are using the order of p(A) */ cheby_order = order - 1; hypre_assert(hypre_VectorSize(hypre_ParVectorLocalVector(orig_u_vec)) >= num_rows); HYPRE_Real *orig_u = hypre_VectorData(hypre_ParVectorLocalVector(orig_u_vec)); if (!scale) { /* get residual: r = f - A*u */ hypre_ParVectorCopy(f, r); hypre_ParCSRMatrixMatvec(-1.0, A, u, 1.0, r); /* o = u; u = r .* coef */ #if defined(HYPRE_USING_SYCL) HYPRE_ONEDPL_CALL( std::for_each, oneapi::dpl::make_zip_iterator(orig_u, u_data, r_data), oneapi::dpl::make_zip_iterator(orig_u + num_rows, u_data + num_rows, r_data + num_rows), save_and_scale(coefs[cheby_order])); #else HYPRE_THRUST_CALL( for_each, thrust::make_zip_iterator(thrust::make_tuple(orig_u, u_data, r_data)), thrust::make_zip_iterator(thrust::make_tuple(orig_u + num_rows, u_data + num_rows, r_data + num_rows)), save_and_scale(coefs[cheby_order])); #endif for (i = cheby_order - 1; i >= 0; i--) { hypre_ParCSRMatrixMatvec(1.0, A, u, 0.0, v); mult = coefs[i]; /* u = mult * r + v */ hypreDevice_ComplexAxpyn( r_data, num_rows, v_data, u_data, mult ); } /* u = o + u */ hypreDevice_ComplexAxpyn( orig_u, num_rows, u_data, u_data, 1.0); } else /* scaling! */ { /*grab 1/hypre_sqrt(diagonal) */ tmp_data = hypre_VectorData(hypre_ParVectorLocalVector(tmp_vec)); /* get ds_data and get scaled residual: r = D^(-1/2)f - * D^(-1/2)A*u */ hypre_ParCSRMatrixMatvec(-1.0, A, u, 0.0, tmp_vec); /* r = ds .* (f + tmp) */ /* TODO: It might be possible to merge this and the next call to: * r[j] = ds_data[j] * (f_data[j] + tmp_data[j]); o[j] = u[j]; u[j] = r[j] * coef */ #if defined(HYPRE_USING_SYCL) HYPRE_ONEDPL_CALL(std::for_each, oneapi::dpl::make_zip_iterator(r_data, ds_data, f_data, tmp_data), oneapi::dpl::make_zip_iterator(r_data, ds_data, f_data, tmp_data) + num_rows, wxypz()); #else HYPRE_THRUST_CALL(for_each, thrust::make_zip_iterator(thrust::make_tuple(r_data, ds_data, f_data, tmp_data)), thrust::make_zip_iterator(thrust::make_tuple(r_data, ds_data, f_data, tmp_data)) + num_rows, wxypz()); #endif /* save original u, then start the iteration by multiplying r by the cheby coef.*/ /* o = u; u = r * coef */ #if defined(HYPRE_USING_SYCL) HYPRE_ONEDPL_CALL(std::for_each, oneapi::dpl::make_zip_iterator(orig_u, u_data, r_data), oneapi::dpl::make_zip_iterator(orig_u, u_data, r_data) + num_rows, save_and_scale(coefs[cheby_order])); #else HYPRE_THRUST_CALL(for_each, thrust::make_zip_iterator(thrust::make_tuple(orig_u, u_data, r_data)), thrust::make_zip_iterator(thrust::make_tuple(orig_u, u_data, r_data)) + num_rows, save_and_scale(coefs[cheby_order])); #endif /* now do the other coefficients */ for (i = cheby_order - 1; i >= 0; i--) { /* v = D^(-1/2)AD^(-1/2)u */ /* tmp = ds .* u */ #if defined(HYPRE_USING_SYCL) HYPRE_ONEDPL_CALL( std::transform, ds_data, ds_data + num_rows, u_data, tmp_data, std::multiplies() ); #else HYPRE_THRUST_CALL( transform, ds_data, ds_data + num_rows, u_data, tmp_data, _1 * _2 ); #endif hypre_ParCSRMatrixMatvec(1.0, A, tmp_vec, 0.0, v); /* u_new = coef*r + v*/ mult = coefs[i]; /* u = coef * r + ds .* v */ #if defined(HYPRE_USING_SYCL) HYPRE_ONEDPL_CALL(std::for_each, oneapi::dpl::make_zip_iterator(u_data, r_data, ds_data, v_data), oneapi::dpl::make_zip_iterator(u_data, r_data, ds_data, v_data) + num_rows, waxpyz(mult)); #else HYPRE_THRUST_CALL(for_each, thrust::make_zip_iterator(thrust::make_tuple(u_data, r_data, ds_data, v_data)), thrust::make_zip_iterator(thrust::make_tuple(u_data, r_data, ds_data, v_data)) + num_rows, waxpyz(mult)); #endif } /* end of cheby_order loop */ /* now we have to scale u_data before adding it to u_orig*/ /* u = orig_u + ds .* u */ #if defined(HYPRE_USING_SYCL) HYPRE_ONEDPL_CALL( std::for_each, oneapi::dpl::make_zip_iterator(u_data, orig_u, ds_data), oneapi::dpl::make_zip_iterator(u_data + num_rows, orig_u + num_rows, ds_data + num_rows), xpyz()); #else HYPRE_THRUST_CALL( for_each, thrust::make_zip_iterator(thrust::make_tuple(u_data, orig_u, ds_data)), thrust::make_zip_iterator(thrust::make_tuple(u_data + num_rows, orig_u + num_rows, ds_data + num_rows)), xpyz()); #endif } /* end of scaling code */ return hypre_error_flag; } #endif hypre-2.33.0/src/parcsr_ls/par_coarse_parms.c000066400000000000000000000106611477326011500212030ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "_hypre_parcsr_ls.h" /** Generates global coarse_size and dof_func for next coarser level Notes: \begin{itemize} \item The routine returns the following: \begin{itemize} \item an integer array containing the function values for the local coarse points \item the global number of coarse points \end{itemize} \end{itemize} {\bf Input files:} _hypre_parcsr_ls.h @return Error code. @param comm [IN] MPI Communicator @param local_num_variables [IN] number of points on local processor @param dof_func [IN] array that contains the function numbers for all local points @param CF_marker [IN] marker array for coarse points @param coarse_dof_func_ptr [OUT] pointer to array which contains the function numbers for local coarse points @param coarse_pnts_global [OUT] pointer to array which contains the number of the first coarse point on each processor and the total number of coarse points in its last element @see */ /*--------------------------------------------------------------------------*/ HYPRE_Int hypre_BoomerAMGCoarseParmsHost(MPI_Comm comm, HYPRE_Int local_num_variables, HYPRE_Int num_functions, hypre_IntArray *dof_func, hypre_IntArray *CF_marker, hypre_IntArray **coarse_dof_func_ptr, HYPRE_BigInt *coarse_pnts_global) { #ifdef HYPRE_PROFILE hypre_profile_times[HYPRE_TIMER_ID_COARSE_PARAMS] -= hypre_MPI_Wtime(); #endif HYPRE_Int i; HYPRE_BigInt local_coarse_size = 0; HYPRE_Int *coarse_dof_func; /*-------------------------------------------------------------- *----------------------------------------------------------------*/ for (i = 0; i < local_num_variables; i++) { if (hypre_IntArrayData(CF_marker)[i] == 1) { local_coarse_size++; } } if (num_functions > 1) { *coarse_dof_func_ptr = hypre_IntArrayCreate(local_coarse_size); hypre_IntArrayInitialize(*coarse_dof_func_ptr); coarse_dof_func = hypre_IntArrayData(*coarse_dof_func_ptr); local_coarse_size = 0; for (i = 0; i < local_num_variables; i++) { if (hypre_IntArrayData(CF_marker)[i] == 1) { coarse_dof_func[local_coarse_size++] = hypre_IntArrayData(dof_func)[i]; } } } { HYPRE_BigInt scan_recv; hypre_MPI_Scan(&local_coarse_size, &scan_recv, 1, HYPRE_MPI_BIG_INT, hypre_MPI_SUM, comm); /* first point in my range */ coarse_pnts_global[0] = scan_recv - local_coarse_size; /* first point in next proc's range */ coarse_pnts_global[1] = scan_recv; } #ifdef HYPRE_PROFILE hypre_profile_times[HYPRE_TIMER_ID_COARSE_PARAMS] += hypre_MPI_Wtime(); #endif return hypre_error_flag; } HYPRE_Int hypre_BoomerAMGCoarseParms(MPI_Comm comm, HYPRE_Int local_num_variables, HYPRE_Int num_functions, hypre_IntArray *dof_func, hypre_IntArray *CF_marker, hypre_IntArray **coarse_dof_func_ptr, HYPRE_BigInt *coarse_pnts_global) { #if defined(HYPRE_USING_GPU) HYPRE_ExecutionPolicy exec; if (num_functions > 1) { exec = hypre_GetExecPolicy2(hypre_IntArrayMemoryLocation(CF_marker), hypre_IntArrayMemoryLocation(dof_func)); } else { exec = hypre_GetExecPolicy1(hypre_IntArrayMemoryLocation(CF_marker)); } if (exec == HYPRE_EXEC_DEVICE) { return hypre_BoomerAMGCoarseParmsDevice(comm, local_num_variables, num_functions, dof_func, CF_marker, coarse_dof_func_ptr, coarse_pnts_global); } else #endif { return hypre_BoomerAMGCoarseParmsHost(comm, local_num_variables, num_functions, dof_func, CF_marker, coarse_dof_func_ptr, coarse_pnts_global); } } hypre-2.33.0/src/parcsr_ls/par_coarse_parms_device.c000066400000000000000000000125471477326011500225270ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * *****************************************************************************/ /* following should be in a header file */ #include "_hypre_onedpl.hpp" #include "_hypre_parcsr_ls.h" #include "_hypre_utilities.hpp" #if defined(HYPRE_USING_GPU) /** Generates global coarse_size and dof_func for next coarser level Notes: \begin{itemize} \item The routine returns the following: \begin{itemize} \item an integer array containing the function values for the local coarse points \item the global number of coarse points \end{itemize} \end{itemize} {\bf Input files:} _hypre_parcsr_ls.h @return Error code. @param comm [IN] MPI Communicator @param local_num_variables [IN] number of points on local processor @param dof_func [IN] array that contains the function numbers for all local points @param CF_marker [IN] marker array for coarse points @param coarse_dof_func_ptr [OUT] pointer to array which contains the function numbers for local coarse points @param coarse_pnts_global [OUT] pointer to array which contains the number of the first coarse point on each processor and the total number of coarse points in its last element @see */ /*--------------------------------------------------------------------------*/ HYPRE_Int hypre_BoomerAMGCoarseParmsDevice(MPI_Comm comm, HYPRE_Int local_num_variables, HYPRE_Int num_functions, hypre_IntArray *dof_func, hypre_IntArray *CF_marker, hypre_IntArray **coarse_dof_func_ptr, HYPRE_BigInt *coarse_pnts_global) { #ifdef HYPRE_PROFILE hypre_profile_times[HYPRE_TIMER_ID_COARSE_PARAMS] -= hypre_MPI_Wtime(); #endif HYPRE_Int ierr = 0; HYPRE_BigInt local_coarse_size = 0; /*-------------------------------------------------------------- *----------------------------------------------------------------*/ #if defined(HYPRE_USING_SYCL) local_coarse_size = HYPRE_ONEDPL_CALL( std::count_if, hypre_IntArrayData(CF_marker), hypre_IntArrayData(CF_marker) + local_num_variables, equal(1) ); #else local_coarse_size = HYPRE_THRUST_CALL( count_if, hypre_IntArrayData(CF_marker), hypre_IntArrayData(CF_marker) + local_num_variables, equal(1) ); #endif if (num_functions > 1) { *coarse_dof_func_ptr = hypre_IntArrayCreate(local_coarse_size); hypre_IntArrayInitialize_v2(*coarse_dof_func_ptr, HYPRE_MEMORY_DEVICE); #if defined(HYPRE_USING_SYCL) hypreSycl_copy_if( hypre_IntArrayData(dof_func), hypre_IntArrayData(dof_func) + local_num_variables, hypre_IntArrayData(CF_marker), hypre_IntArrayData(*coarse_dof_func_ptr), equal(1) ); #else HYPRE_THRUST_CALL( copy_if, hypre_IntArrayData(dof_func), hypre_IntArrayData(dof_func) + local_num_variables, hypre_IntArrayData(CF_marker), hypre_IntArrayData(*coarse_dof_func_ptr), equal(1) ); #endif } { HYPRE_BigInt scan_recv; hypre_MPI_Scan(&local_coarse_size, &scan_recv, 1, HYPRE_MPI_BIG_INT, hypre_MPI_SUM, comm); /* first point in my range */ coarse_pnts_global[0] = scan_recv - local_coarse_size; /* first point in next proc's range */ coarse_pnts_global[1] = scan_recv; } #ifdef HYPRE_PROFILE hypre_profile_times[HYPRE_TIMER_ID_COARSE_PARAMS] += hypre_MPI_Wtime(); #endif return (ierr); } HYPRE_Int hypre_BoomerAMGInitDofFuncDevice( HYPRE_Int *dof_func, HYPRE_Int local_size, HYPRE_Int offset, HYPRE_Int num_functions ) { #if defined(HYPRE_USING_SYCL) hypreSycl_sequence(dof_func, dof_func + local_size, offset); HYPRE_ONEDPL_CALL( std::transform, dof_func, dof_func + local_size, dof_func, modulo(num_functions) ); #else HYPRE_THRUST_CALL( sequence, dof_func, dof_func + local_size, offset, 1 ); HYPRE_THRUST_CALL( transform, dof_func, dof_func + local_size, dof_func, modulo(num_functions) ); #endif return hypre_error_flag; } #endif // #if defined(HYPRE_USING_GPU) hypre-2.33.0/src/parcsr_ls/par_coarsen.c000066400000000000000000002666501477326011500201720ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * *****************************************************************************/ /* following should be in a header file */ #include "_hypre_parcsr_ls.h" /*==========================================================================*/ /*==========================================================================*/ /** Selects a coarse "grid" based on the graph of a matrix. Notes: \begin{itemize} \item The underlying matrix storage scheme is a hypre_ParCSR matrix. \item The routine returns the following: \begin{itemize} \item S - a ParCSR matrix representing the "strength matrix". This is used in the "build interpolation" routine. \item CF\_marker - an array indicating both C-pts (value = 1) and F-pts (value = -1) \end{itemize} \item We define the following temporary storage: \begin{itemize} \item measure\_array - an array containing the "measures" for each of the fine-grid points \item graph\_array - an array containing the list of points in the "current subgraph" being considered in the coarsening process. \end{itemize} \item The graph of the "strength matrix" for A is a subgraph of the graph of A, but requires nonsymmetric storage even if A is symmetric. This is because of the directional nature of the "strengh of dependence" notion (see below). Since we are using nonsymmetric storage for A right now, this is not a problem. If we ever add the ability to store A symmetrically, then we could store the strength graph as floats instead of doubles to save space. \item This routine currently "compresses" the strength matrix. We should consider the possibility of defining this matrix to have the same "nonzero structure" as A. To do this, we could use the same A\_i and A\_j arrays, and would need only define the S\_data array. There are several pros and cons to discuss. \end{itemize} Terminology: \begin{itemize} \item Ruge's terminology: A point is "strongly connected to" $j$, or "strongly depends on" $j$, if $-a_ij >= \theta max_{l != j} \{-a_il\}$. \item Here, we retain some of this terminology, but with a more generalized notion of "strength". We also retain the "natural" graph notation for representing the directed graph of a matrix. That is, the nonzero entry $a_ij$ is represented as: i --> j. In the strength matrix, S, the entry $s_ij$ is also graphically denoted as above, and means both of the following: \begin{itemize} \item $i$ "depends on" $j$ with "strength" $s_ij$ \item $j$ "influences" $i$ with "strength" $s_ij$ \end{itemize} \end{itemize} {\bf Input files:} _hypre_parcsr_ls.h @return Error code. @param A [IN] coefficient matrix @param strength_threshold [IN] threshold parameter used to define strength @param S_ptr [OUT] strength matrix @param CF_marker_ptr [IN/OUT] array indicating C/F points @see */ /*--------------------------------------------------------------------------*/ #define C_PT 1 #define F_PT -1 #define SF_PT -3 #define COMMON_C_PT 2 #define Z_PT -2 HYPRE_Int hypre_BoomerAMGCoarsen( hypre_ParCSRMatrix *S, hypre_ParCSRMatrix *A, HYPRE_Int CF_init, HYPRE_Int debug_flag, hypre_IntArray **CF_marker_ptr) { MPI_Comm comm = hypre_ParCSRMatrixComm(S); hypre_ParCSRCommPkg *comm_pkg = hypre_ParCSRMatrixCommPkg(S); hypre_ParCSRCommHandle *comm_handle = NULL; hypre_CSRMatrix *S_diag = hypre_ParCSRMatrixDiag(S); HYPRE_Int *S_diag_i = hypre_CSRMatrixI(S_diag); HYPRE_Int *S_diag_j = hypre_CSRMatrixJ(S_diag); hypre_CSRMatrix *S_offd = hypre_ParCSRMatrixOffd(S); HYPRE_Int *S_offd_i = hypre_CSRMatrixI(S_offd); HYPRE_Int *S_offd_j = NULL; HYPRE_BigInt *col_map_offd = hypre_ParCSRMatrixColMapOffd(S); HYPRE_Int num_variables = hypre_CSRMatrixNumRows(S_diag); HYPRE_BigInt col_1 = hypre_ParCSRMatrixFirstColDiag(S); HYPRE_BigInt col_n = col_1 + (HYPRE_BigInt)hypre_CSRMatrixNumCols(S_diag); HYPRE_Int num_cols_offd = 0; hypre_CSRMatrix *S_ext; HYPRE_Int *S_ext_i = NULL; HYPRE_BigInt *S_ext_j = NULL; HYPRE_Int num_sends = 0; HYPRE_Int *int_buf_data; HYPRE_Real *buf_data; HYPRE_Int *CF_marker; HYPRE_Int *CF_marker_offd; HYPRE_Real *measure_array; HYPRE_Int *graph_array; HYPRE_Int *graph_array_offd; HYPRE_Int graph_size; HYPRE_BigInt big_graph_size; HYPRE_Int graph_offd_size; HYPRE_BigInt global_graph_size; HYPRE_Int i, j, k, kc, jS, kS, ig, elmt; HYPRE_Int index, start, my_id, num_procs, jrow, cnt, nnzrow; HYPRE_Int use_commpkg_A = 0; HYPRE_Int break_var = 1; HYPRE_Real wall_time = 0.0; HYPRE_Int iter = 0; HYPRE_BigInt big_k; #if 0 /* debugging */ char filename[256]; FILE *fp; HYPRE_Int iter = 0; #endif /*-------------------------------------------------------------- * Compute a ParCSR strength matrix, S. * * For now, the "strength" of dependence/influence is defined in * the following way: i depends on j if * aij > hypre_max (k != i) aik, aii < 0 * or * aij < hypre_min (k != i) aik, aii >= 0 * Then S_ij = 1, else S_ij = 0. * * NOTE: the entries are negative initially, corresponding * to "unaccounted-for" dependence. *----------------------------------------------------------------*/ S_ext = NULL; if (debug_flag == 3) { wall_time = time_getWallclockSeconds(); } hypre_MPI_Comm_size(comm, &num_procs); hypre_MPI_Comm_rank(comm, &my_id); if (!comm_pkg) { use_commpkg_A = 1; comm_pkg = hypre_ParCSRMatrixCommPkg(A); } if (!comm_pkg) { hypre_MatvecCommPkgCreate(A); comm_pkg = hypre_ParCSRMatrixCommPkg(A); } num_sends = hypre_ParCSRCommPkgNumSends(comm_pkg); int_buf_data = hypre_CTAlloc(HYPRE_Int, hypre_ParCSRCommPkgSendMapStart(comm_pkg, num_sends), HYPRE_MEMORY_HOST); buf_data = hypre_CTAlloc(HYPRE_Real, hypre_ParCSRCommPkgSendMapStart(comm_pkg, num_sends), HYPRE_MEMORY_HOST); num_cols_offd = hypre_CSRMatrixNumCols(S_offd); S_diag_j = hypre_CSRMatrixJ(S_diag); if (num_cols_offd) { S_offd_j = hypre_CSRMatrixJ(S_offd); } /*---------------------------------------------------------- * Compute the measures * * The measures are currently given by the column sums of S. * Hence, measure_array[i] is the number of influences * of variable i. * * The measures are augmented by a random number * between 0 and 1. *----------------------------------------------------------*/ measure_array = hypre_CTAlloc(HYPRE_Real, num_variables + num_cols_offd, HYPRE_MEMORY_HOST); for (i = 0; i < S_offd_i[num_variables]; i++) { measure_array[num_variables + S_offd_j[i]] += 1.0; } if (num_procs > 1) { comm_handle = hypre_ParCSRCommHandleCreate(2, comm_pkg, &measure_array[num_variables], buf_data); } for (i = 0; i < S_diag_i[num_variables]; i++) { measure_array[S_diag_j[i]] += 1.0; } if (num_procs > 1) { hypre_ParCSRCommHandleDestroy(comm_handle); } index = 0; for (i = 0; i < num_sends; i++) { start = hypre_ParCSRCommPkgSendMapStart(comm_pkg, i); for (j = start; j < hypre_ParCSRCommPkgSendMapStart(comm_pkg, i + 1); j++) measure_array[hypre_ParCSRCommPkgSendMapElmt(comm_pkg, j)] += buf_data[index++]; } for (i = num_variables; i < num_variables + num_cols_offd; i++) { measure_array[i] = 0; } /* this augments the measures */ if (CF_init == 2) { hypre_BoomerAMGIndepSetInit(S, measure_array, 1); } else { hypre_BoomerAMGIndepSetInit(S, measure_array, 0); } /*--------------------------------------------------- * Initialize the graph array * graph_array contains interior points in elements 0 ... num_variables-1 * followed by boundary values *---------------------------------------------------*/ graph_array = hypre_CTAlloc(HYPRE_Int, num_variables, HYPRE_MEMORY_HOST); if (num_cols_offd) { graph_array_offd = hypre_CTAlloc(HYPRE_Int, num_cols_offd, HYPRE_MEMORY_HOST); } else { graph_array_offd = NULL; } /* initialize measure array and graph array */ for (ig = 0; ig < num_cols_offd; ig++) { graph_array_offd[ig] = ig; } /*--------------------------------------------------- * Initialize the C/F marker array * C/F marker array contains interior points in elements 0 ... * num_variables-1 followed by boundary values *---------------------------------------------------*/ graph_offd_size = num_cols_offd; /* Allocate CF_marker if not done before */ if (*CF_marker_ptr == NULL) { *CF_marker_ptr = hypre_IntArrayCreate(num_variables); hypre_IntArrayInitialize(*CF_marker_ptr); } CF_marker = hypre_IntArrayData(*CF_marker_ptr); if (CF_init == 1) { cnt = 0; for (i = 0; i < num_variables; i++) { if ( CF_marker[i] != SF_PT ) { if ( (S_offd_i[i + 1] - S_offd_i[i]) > 0 || (CF_marker[i] == F_PT) ) { CF_marker[i] = 0; } if ( CF_marker[i] == Z_PT) { if ( (S_diag_i[i + 1] - S_diag_i[i]) > 0 || (measure_array[i] >= 1.0) ) { CF_marker[i] = 0; graph_array[cnt++] = i; } else { CF_marker[i] = F_PT; } } else { graph_array[cnt++] = i; } } else { measure_array[i] = 0; } } } else { cnt = 0; for (i = 0; i < num_variables; i++) { if ( CF_marker[i] != SF_PT ) { CF_marker[i] = 0; nnzrow = (S_diag_i[i + 1] - S_diag_i[i]) + (S_offd_i[i + 1] - S_offd_i[i]); if (nnzrow == 0) { CF_marker[i] = SF_PT; measure_array[i] = 0; } else { graph_array[cnt++] = i; } } else { measure_array[i] = 0; } } } graph_size = cnt; if (num_cols_offd) { CF_marker_offd = hypre_CTAlloc(HYPRE_Int, num_cols_offd, HYPRE_MEMORY_HOST); } else { CF_marker_offd = NULL; } for (i = 0; i < num_cols_offd; i++) { CF_marker_offd[i] = 0; } /*--------------------------------------------------- * Loop until all points are either fine or coarse. *---------------------------------------------------*/ if (num_procs > 1) { if (use_commpkg_A) { S_ext = hypre_ParCSRMatrixExtractBExt(S, A, 0); } else { S_ext = hypre_ParCSRMatrixExtractBExt(S, S, 0); } S_ext_i = hypre_CSRMatrixI(S_ext); S_ext_j = hypre_CSRMatrixBigJ(S_ext); } /* compress S_ext and convert column numbers*/ index = 0; for (i = 0; i < num_cols_offd; i++) { for (j = S_ext_i[i]; j < S_ext_i[i + 1]; j++) { big_k = S_ext_j[j]; if (big_k >= col_1 && big_k < col_n) { S_ext_j[index++] = big_k - col_1; } else { kc = hypre_BigBinarySearch(col_map_offd, big_k, num_cols_offd); if (kc > -1) { S_ext_j[index++] = (HYPRE_BigInt)(-kc - 1); } } } S_ext_i[i] = index; } for (i = num_cols_offd; i > 0; i--) { S_ext_i[i] = S_ext_i[i - 1]; } if (num_procs > 1) { S_ext_i[0] = 0; } if (debug_flag == 3) { wall_time = time_getWallclockSeconds() - wall_time; hypre_printf("Proc = %d Initialize CLJP phase = %f\n", my_id, wall_time); } while (1) { /*------------------------------------------------ * Exchange boundary data, i.i. get measures and S_ext_data *------------------------------------------------*/ if (num_procs > 1) comm_handle = hypre_ParCSRCommHandleCreate(2, comm_pkg, &measure_array[num_variables], buf_data); if (num_procs > 1) { hypre_ParCSRCommHandleDestroy(comm_handle); } index = 0; for (i = 0; i < num_sends; i++) { start = hypre_ParCSRCommPkgSendMapStart(comm_pkg, i); for (j = start; j < hypre_ParCSRCommPkgSendMapStart(comm_pkg, i + 1); j++) measure_array[hypre_ParCSRCommPkgSendMapElmt(comm_pkg, j)] += buf_data[index++]; } /*------------------------------------------------ * Set F-pts and update subgraph *------------------------------------------------*/ if (iter || (CF_init != 1)) { for (ig = 0; ig < graph_size; ig++) { i = graph_array[ig]; if ( (CF_marker[i] != C_PT) && (measure_array[i] < 1) ) { /* set to be an F-pt */ CF_marker[i] = F_PT; /* make sure all dependencies have been accounted for */ for (jS = S_diag_i[i]; jS < S_diag_i[i + 1]; jS++) { if (S_diag_j[jS] > -1) { CF_marker[i] = 0; } } for (jS = S_offd_i[i]; jS < S_offd_i[i + 1]; jS++) { if (S_offd_j[jS] > -1) { CF_marker[i] = 0; } } } if (CF_marker[i]) { measure_array[i] = 0; /* take point out of the subgraph */ graph_size--; graph_array[ig] = graph_array[graph_size]; graph_array[graph_size] = i; ig--; } } } /*------------------------------------------------ * Exchange boundary data, i.i. get measures *------------------------------------------------*/ if (debug_flag == 3) { wall_time = time_getWallclockSeconds(); } index = 0; for (i = 0; i < num_sends; i++) { start = hypre_ParCSRCommPkgSendMapStart(comm_pkg, i); for (j = start; j < hypre_ParCSRCommPkgSendMapStart(comm_pkg, i + 1); j++) { jrow = hypre_ParCSRCommPkgSendMapElmt(comm_pkg, j); buf_data[index++] = measure_array[jrow]; } } if (num_procs > 1) { comm_handle = hypre_ParCSRCommHandleCreate(1, comm_pkg, buf_data, &measure_array[num_variables]); hypre_ParCSRCommHandleDestroy(comm_handle); } /*------------------------------------------------ * Debugging: * * Uncomment the sections of code labeled * "debugging" to generate several files that * can be visualized using the `coarsen.m' * matlab routine. *------------------------------------------------*/ #if 0 /* debugging */ /* print out measures */ hypre_sprintf(filename, "coarsen.out.measures.%04d", iter); fp = fopen(filename, "w"); for (i = 0; i < num_variables; i++) { hypre_fprintf(fp, "%f\n", measure_array[i]); } fclose(fp); /* print out strength matrix */ hypre_sprintf(filename, "coarsen.out.strength.%04d", iter); hypre_CSRMatrixPrint(S, filename); /* print out C/F marker */ hypre_sprintf(filename, "coarsen.out.CF.%04d", iter); fp = fopen(filename, "w"); for (i = 0; i < num_variables; i++) { hypre_fprintf(fp, "%d\n", CF_marker[i]); } fclose(fp); iter++; #endif /*------------------------------------------------ * Test for convergence *------------------------------------------------*/ big_graph_size = (HYPRE_BigInt) graph_size; hypre_MPI_Allreduce(&big_graph_size, &global_graph_size, 1, HYPRE_MPI_BIG_INT, hypre_MPI_SUM, comm); if (global_graph_size == 0) { break; } /*------------------------------------------------ * Pick an independent set of points with * maximal measure. *------------------------------------------------*/ if (iter || (CF_init != 1)) { hypre_BoomerAMGIndepSet(S, measure_array, graph_array, graph_size, graph_array_offd, graph_offd_size, CF_marker, CF_marker_offd); if (num_procs > 1) { comm_handle = hypre_ParCSRCommHandleCreate(12, comm_pkg, CF_marker_offd, int_buf_data); hypre_ParCSRCommHandleDestroy(comm_handle); } index = 0; for (i = 0; i < num_sends; i++) { start = hypre_ParCSRCommPkgSendMapStart(comm_pkg, i); for (j = start; j < hypre_ParCSRCommPkgSendMapStart(comm_pkg, i + 1); j++) { elmt = hypre_ParCSRCommPkgSendMapElmt(comm_pkg, j); if (!int_buf_data[index++] && CF_marker[elmt] > 0) { CF_marker[elmt] = 0; } } } } iter++; /*------------------------------------------------ * Exchange boundary data for CF_marker *------------------------------------------------*/ index = 0; for (i = 0; i < num_sends; i++) { start = hypre_ParCSRCommPkgSendMapStart(comm_pkg, i); for (j = start; j < hypre_ParCSRCommPkgSendMapStart(comm_pkg, i + 1); j++) { elmt = hypre_ParCSRCommPkgSendMapElmt(comm_pkg, j); int_buf_data[index++] = CF_marker[elmt]; } } if (num_procs > 1) { comm_handle = hypre_ParCSRCommHandleCreate(11, comm_pkg, int_buf_data, CF_marker_offd); hypre_ParCSRCommHandleDestroy(comm_handle); } for (ig = 0; ig < graph_offd_size; ig++) { i = graph_array_offd[ig]; if (CF_marker_offd[i] < 0) { /* take point out of the subgraph */ graph_offd_size--; graph_array_offd[ig] = graph_array_offd[graph_offd_size]; graph_array_offd[graph_offd_size] = i; ig--; } } if (debug_flag == 3) { wall_time = time_getWallclockSeconds() - wall_time; hypre_printf("Proc = %d iter %d comm. and subgraph update = %f\n", my_id, iter, wall_time); } /*------------------------------------------------ * Set C_pts and apply heuristics. *------------------------------------------------*/ for (i = num_variables; i < num_variables + num_cols_offd; i++) { measure_array[i] = 0; } if (debug_flag == 3) { wall_time = time_getWallclockSeconds(); } for (ig = 0; ig < graph_size; ig++) { i = graph_array[ig]; /*--------------------------------------------- * Heuristic: C-pts don't interpolate from * neighbors that influence them. *---------------------------------------------*/ if (CF_marker[i] > 0) { /* set to be a C-pt */ CF_marker[i] = C_PT; for (jS = S_diag_i[i]; jS < S_diag_i[i + 1]; jS++) { j = S_diag_j[jS]; if (j > -1) { /* "remove" edge from S */ S_diag_j[jS] = -S_diag_j[jS] - 1; /* decrement measures of unmarked neighbors */ if (!CF_marker[j]) { measure_array[j]--; } } } for (jS = S_offd_i[i]; jS < S_offd_i[i + 1]; jS++) { j = S_offd_j[jS]; if (j > -1) { /* "remove" edge from S */ S_offd_j[jS] = -S_offd_j[jS] - 1; /* decrement measures of unmarked neighbors */ if (!CF_marker_offd[j]) { measure_array[j + num_variables]--; } } } } else { /* marked dependencies */ for (jS = S_diag_i[i]; jS < S_diag_i[i + 1]; jS++) { j = S_diag_j[jS]; if (j < 0) { j = -j - 1; } if (CF_marker[j] > 0) { if (S_diag_j[jS] > -1) { /* "remove" edge from S */ S_diag_j[jS] = -S_diag_j[jS] - 1; } /* IMPORTANT: consider all dependencies */ /* temporarily modify CF_marker */ CF_marker[j] = COMMON_C_PT; } else if (CF_marker[j] == SF_PT) { if (S_diag_j[jS] > -1) { /* "remove" edge from S */ S_diag_j[jS] = -S_diag_j[jS] - 1; } } } for (jS = S_offd_i[i]; jS < S_offd_i[i + 1]; jS++) { j = S_offd_j[jS]; if (j < 0) { j = -j - 1; } if (CF_marker_offd[j] > 0) { if (S_offd_j[jS] > -1) { /* "remove" edge from S */ S_offd_j[jS] = -S_offd_j[jS] - 1; } /* IMPORTANT: consider all dependencies */ /* temporarily modify CF_marker */ CF_marker_offd[j] = COMMON_C_PT; } else if (CF_marker_offd[j] == SF_PT) { if (S_offd_j[jS] > -1) { /* "remove" edge from S */ S_offd_j[jS] = -S_offd_j[jS] - 1; } } } /* unmarked dependencies */ for (jS = S_diag_i[i]; jS < S_diag_i[i + 1]; jS++) { if (S_diag_j[jS] > -1) { j = S_diag_j[jS]; break_var = 1; /* check for common C-pt */ for (kS = S_diag_i[j]; kS < S_diag_i[j + 1]; kS++) { k = S_diag_j[kS]; if (k < 0) { k = -k - 1; } /* IMPORTANT: consider all dependencies */ if (CF_marker[k] == COMMON_C_PT) { /* "remove" edge from S and update measure*/ S_diag_j[jS] = -S_diag_j[jS] - 1; measure_array[j]--; break_var = 0; break; } } if (break_var) { for (kS = S_offd_i[j]; kS < S_offd_i[j + 1]; kS++) { k = S_offd_j[kS]; if (k < 0) { k = -k - 1; } /* IMPORTANT: consider all dependencies */ if ( CF_marker_offd[k] == COMMON_C_PT) { /* "remove" edge from S and update measure*/ S_diag_j[jS] = -S_diag_j[jS] - 1; measure_array[j]--; break; } } } } } for (jS = S_offd_i[i]; jS < S_offd_i[i + 1]; jS++) { if (S_offd_j[jS] > -1) { j = S_offd_j[jS]; /* check for common C-pt */ for (kS = S_ext_i[j]; kS < S_ext_i[j + 1]; kS++) { k = (HYPRE_Int)S_ext_j[kS]; if (k >= 0) { /* IMPORTANT: consider all dependencies */ if (CF_marker[k] == COMMON_C_PT) { /* "remove" edge from S and update measure*/ S_offd_j[jS] = -S_offd_j[jS] - 1; measure_array[j + num_variables]--; break; } } else { kc = -k - 1; if (kc > -1 && CF_marker_offd[kc] == COMMON_C_PT) { /* "remove" edge from S and update measure*/ S_offd_j[jS] = -S_offd_j[jS] - 1; measure_array[j + num_variables]--; break; } } } } } } /* reset CF_marker */ for (jS = S_diag_i[i]; jS < S_diag_i[i + 1]; jS++) { j = S_diag_j[jS]; if (j < 0) { j = -j - 1; } if (CF_marker[j] == COMMON_C_PT) { CF_marker[j] = C_PT; } } for (jS = S_offd_i[i]; jS < S_offd_i[i + 1]; jS++) { j = S_offd_j[jS]; if (j < 0) { j = -j - 1; } if (CF_marker_offd[j] == COMMON_C_PT) { CF_marker_offd[j] = C_PT; } } } if (debug_flag == 3) { wall_time = time_getWallclockSeconds() - wall_time; hypre_printf("Proc = %d CLJP phase = %f graph_size = %d nc_offd = %d\n", my_id, wall_time, graph_size, num_cols_offd); } } /*--------------------------------------------------- * Clean up and return *---------------------------------------------------*/ /* Reset S_matrix */ for (i = 0; i < S_diag_i[num_variables]; i++) { if (S_diag_j[i] < 0) { S_diag_j[i] = -S_diag_j[i] - 1; } } for (i = 0; i < S_offd_i[num_variables]; i++) { if (S_offd_j[i] < 0) { S_offd_j[i] = -S_offd_j[i] - 1; } } /*for (i=0; i < num_variables; i++) if (CF_marker[i] == SF_PT) CF_marker[i] = F_PT;*/ hypre_TFree(measure_array, HYPRE_MEMORY_HOST); hypre_TFree(graph_array, HYPRE_MEMORY_HOST); if (num_cols_offd) { hypre_TFree(graph_array_offd, HYPRE_MEMORY_HOST); } hypre_TFree(buf_data, HYPRE_MEMORY_HOST); hypre_TFree(int_buf_data, HYPRE_MEMORY_HOST); hypre_TFree(CF_marker_offd, HYPRE_MEMORY_HOST); if (num_procs > 1) { hypre_CSRMatrixDestroy(S_ext); } return hypre_error_flag; } /*========================================================================== * Ruge's coarsening algorithm *==========================================================================*/ #define C_PT 1 #define F_PT -1 #define Z_PT -2 #define SF_PT -3 /* special fine points */ #define SC_PT 3 /* special coarse points */ #define UNDECIDED 0 /************************************************************** * * Ruge Coarsening routine * **************************************************************/ HYPRE_Int hypre_BoomerAMGCoarsenRuge( hypre_ParCSRMatrix *S, hypre_ParCSRMatrix *A, HYPRE_Int measure_type, HYPRE_Int coarsen_type, HYPRE_Int cut_factor, HYPRE_Int debug_flag, hypre_IntArray **CF_marker_ptr) { MPI_Comm comm = hypre_ParCSRMatrixComm(S); hypre_ParCSRCommPkg *comm_pkg = hypre_ParCSRMatrixCommPkg(S); hypre_ParCSRCommHandle *comm_handle; hypre_CSRMatrix *A_diag = hypre_ParCSRMatrixDiag(A); hypre_CSRMatrix *S_diag = hypre_ParCSRMatrixDiag(S); hypre_CSRMatrix *A_offd = hypre_ParCSRMatrixOffd(A); hypre_CSRMatrix *S_offd = hypre_ParCSRMatrixOffd(S); HYPRE_Int *A_i = hypre_CSRMatrixI(A_diag); HYPRE_Int *S_i = hypre_CSRMatrixI(S_diag); HYPRE_Int *S_j = hypre_CSRMatrixJ(S_diag); HYPRE_Int *A_offd_i = hypre_CSRMatrixI(A_offd); HYPRE_Int *S_offd_i = hypre_CSRMatrixI(S_offd); HYPRE_Int *S_offd_j = NULL; HYPRE_Int num_variables = hypre_CSRMatrixNumRows(S_diag); HYPRE_Int num_cols_offd = hypre_CSRMatrixNumCols(S_offd); HYPRE_BigInt *col_map_offd = hypre_ParCSRMatrixColMapOffd(S); HYPRE_BigInt num_nonzeros = hypre_ParCSRMatrixNumNonzeros(A); HYPRE_BigInt global_num_rows = hypre_ParCSRMatrixGlobalNumRows(A); HYPRE_Int avg_nnzrow; hypre_CSRMatrix *S_ext = NULL; HYPRE_Int *S_ext_i = NULL; HYPRE_BigInt *S_ext_j = NULL; hypre_CSRMatrix *ST; HYPRE_Int *ST_i; HYPRE_Int *ST_j; HYPRE_Int *CF_marker; HYPRE_Int *CF_marker_offd = NULL; HYPRE_Int ci_tilde = -1; HYPRE_Int ci_tilde_mark = -1; HYPRE_Int ci_tilde_offd = -1; HYPRE_Int ci_tilde_offd_mark = -1; HYPRE_Int *measure_array; HYPRE_Int *graph_array; HYPRE_Int *int_buf_data = NULL; HYPRE_Int *ci_array = NULL; HYPRE_BigInt big_k; HYPRE_Int i, j, k, jS; HYPRE_Int ji, jj, jk, jm, index; HYPRE_Int set_empty = 1; HYPRE_Int C_i_nonempty = 0; HYPRE_Int cut, nnzrow; HYPRE_Int num_procs, my_id; HYPRE_Int num_sends = 0; HYPRE_BigInt first_col; HYPRE_Int start; HYPRE_BigInt col_0, col_n; hypre_LinkList LoL_head; hypre_LinkList LoL_tail; HYPRE_Int *lists, *where; HYPRE_Int measure, new_meas; HYPRE_Int meas_type = 0; HYPRE_Int agg_2 = 0; HYPRE_Int num_left, elmt; HYPRE_Int nabor, nabor_two; HYPRE_Int use_commpkg_A = 0; HYPRE_Int break_var = 0; HYPRE_Int f_pnt = F_PT; HYPRE_Real wall_time = 0.0; if (coarsen_type < 0) { coarsen_type = -coarsen_type; } if (measure_type == 1 || measure_type == 4) { meas_type = 1; } if (measure_type == 4 || measure_type == 3) { agg_2 = 1; } /*------------------------------------------------------- * Initialize the C/F marker, LoL_head, LoL_tail arrays *-------------------------------------------------------*/ LoL_head = NULL; LoL_tail = NULL; lists = hypre_CTAlloc(HYPRE_Int, num_variables, HYPRE_MEMORY_HOST); where = hypre_CTAlloc(HYPRE_Int, num_variables, HYPRE_MEMORY_HOST); #if 0 /* debugging */ char filename[256]; FILE *fp; HYPRE_Int iter = 0; #endif /*-------------------------------------------------------------- * Compute a CSR strength matrix, S. * * For now, the "strength" of dependence/influence is defined in * the following way: i depends on j if * aij > hypre_max (k != i) aik, aii < 0 * or * aij < hypre_min (k != i) aik, aii >= 0 * Then S_ij = 1, else S_ij = 0. * * NOTE: the entries are negative initially, corresponding * to "unaccounted-for" dependence. *----------------------------------------------------------------*/ if (debug_flag == 3) { wall_time = time_getWallclockSeconds(); } first_col = hypre_ParCSRMatrixFirstColDiag(S); col_0 = first_col - 1; col_n = col_0 + (HYPRE_BigInt)num_variables; hypre_MPI_Comm_size(comm, &num_procs); hypre_MPI_Comm_rank(comm, &my_id); if (!comm_pkg) { use_commpkg_A = 1; comm_pkg = hypre_ParCSRMatrixCommPkg(A); } if (!comm_pkg) { hypre_MatvecCommPkgCreate(A); comm_pkg = hypre_ParCSRMatrixCommPkg(A); } num_sends = hypre_ParCSRCommPkgNumSends(comm_pkg); if (num_cols_offd) { S_offd_j = hypre_CSRMatrixJ(S_offd); } jS = S_i[num_variables]; ST = hypre_CSRMatrixCreate(num_variables, num_variables, jS); hypre_CSRMatrixMemoryLocation(ST) = HYPRE_MEMORY_HOST; ST_i = hypre_CTAlloc(HYPRE_Int, num_variables + 1, HYPRE_MEMORY_HOST); ST_j = hypre_CTAlloc(HYPRE_Int, jS, HYPRE_MEMORY_HOST); hypre_CSRMatrixI(ST) = ST_i; hypre_CSRMatrixJ(ST) = ST_j; /*---------------------------------------------------------- * generate transpose of S, ST *----------------------------------------------------------*/ for (i = 0; i <= num_variables; i++) { ST_i[i] = 0; } for (i = 0; i < jS; i++) { ST_i[S_j[i] + 1]++; } for (i = 0; i < num_variables; i++) { ST_i[i + 1] += ST_i[i]; } for (i = 0; i < num_variables; i++) { for (j = S_i[i]; j < S_i[i + 1]; j++) { index = S_j[j]; ST_j[ST_i[index]] = i; ST_i[index]++; } } for (i = num_variables; i > 0; i--) { ST_i[i] = ST_i[i - 1]; } ST_i[0] = 0; /*---------------------------------------------------------- * Compute the measures * * The measures are given by the row sums of ST. * Hence, measure_array[i] is the number of influences * of variable i. * correct actual measures through adding influences from * neighbor processors *----------------------------------------------------------*/ measure_array = hypre_CTAlloc(HYPRE_Int, num_variables, HYPRE_MEMORY_HOST); for (i = 0; i < num_variables; i++) { measure_array[i] = ST_i[i + 1] - ST_i[i]; } /* special case for Falgout coarsening */ if (coarsen_type == 6) { f_pnt = Z_PT; coarsen_type = 1; } if (coarsen_type == 10) { f_pnt = Z_PT; coarsen_type = 11; } if ((meas_type || (coarsen_type != 1 && coarsen_type != 11)) && num_procs > 1) { if (use_commpkg_A) { S_ext = hypre_ParCSRMatrixExtractBExt(S, A, 0); } else { S_ext = hypre_ParCSRMatrixExtractBExt(S, S, 0); } S_ext_i = hypre_CSRMatrixI(S_ext); S_ext_j = hypre_CSRMatrixBigJ(S_ext); HYPRE_Int num_nonzeros = S_ext_i[num_cols_offd]; /*first_col = hypre_ParCSRMatrixFirstColDiag(S); col_0 = first_col-1; col_n = col_0+num_variables; */ if (meas_type) { for (i = 0; i < num_nonzeros; i++) { index = (HYPRE_Int)(S_ext_j[i] - first_col); if (index > -1 && index < num_variables) { measure_array[index]++; } } } } /*--------------------------------------------------- * Loop until all points are either fine or coarse. *---------------------------------------------------*/ if (debug_flag == 3) { wall_time = time_getWallclockSeconds(); } /* first coarsening phase */ /************************************************************* * * Initialize the lists * *************************************************************/ /* Allocate CF_marker if not done before */ if (*CF_marker_ptr == NULL) { *CF_marker_ptr = hypre_IntArrayCreate(num_variables); hypre_IntArrayInitialize_v2(*CF_marker_ptr, HYPRE_MEMORY_HOST); } CF_marker = hypre_IntArrayData(*CF_marker_ptr); num_left = 0; for (j = 0; j < num_variables; j++) { if (CF_marker[j] == 0) { nnzrow = (S_i[j + 1] - S_i[j]) + (S_offd_i[j + 1] - S_offd_i[j]); if (nnzrow == 0) { CF_marker[j] = SF_PT; if (agg_2) { CF_marker[j] = SC_PT; } measure_array[j] = 0; } else { CF_marker[j] = UNDECIDED; num_left++; } } else { measure_array[j] = 0; } } /* Set dense rows as SF_PT */ if ((cut_factor > 0) && (global_num_rows > 0)) { avg_nnzrow = num_nonzeros / global_num_rows; cut = cut_factor * avg_nnzrow; for (j = 0; j < num_variables; j++) { nnzrow = (A_i[j + 1] - A_i[j]) + (A_offd_i[j + 1] - A_offd_i[j]); if (nnzrow > cut) { if (CF_marker[j] == UNDECIDED) { num_left--; } CF_marker[j] = SF_PT; } } } for (j = 0; j < num_variables; j++) { measure = measure_array[j]; if (CF_marker[j] != SF_PT && CF_marker[j] != SC_PT) { if (measure > 0) { hypre_enter_on_lists(&LoL_head, &LoL_tail, measure, j, lists, where); } else { if (measure < 0) { hypre_error_w_msg(HYPRE_ERROR_GENERIC, "negative measure!\n"); } CF_marker[j] = f_pnt; for (k = S_i[j]; k < S_i[j + 1]; k++) { nabor = S_j[k]; if (CF_marker[nabor] != SF_PT && CF_marker[nabor] != SC_PT) { if (nabor < j) { new_meas = measure_array[nabor]; if (new_meas > 0) { hypre_remove_point(&LoL_head, &LoL_tail, new_meas, nabor, lists, where); } new_meas = ++(measure_array[nabor]); hypre_enter_on_lists(&LoL_head, &LoL_tail, new_meas, nabor, lists, where); } else { new_meas = ++(measure_array[nabor]); } } } --num_left; } } } /**************************************************************** * * Main loop of Ruge-Stueben first coloring pass. * * WHILE there are still points to classify DO: * 1) find first point, i, on list with max_measure * make i a C-point, remove it from the lists * 2) For each point, j, in S_i^T, * a) Set j to be an F-point * b) For each point, k, in S_j * move k to the list in LoL with measure one * greater than it occupies (creating new LoL * entry if necessary) * 3) For each point, j, in S_i, * move j to the list in LoL with measure one * smaller than it occupies (creating new LoL * entry if necessary) * ****************************************************************/ while (num_left > 0) { index = LoL_head -> head; CF_marker[index] = C_PT; measure = measure_array[index]; measure_array[index] = 0; --num_left; hypre_remove_point(&LoL_head, &LoL_tail, measure, index, lists, where); for (j = ST_i[index]; j < ST_i[index + 1]; j++) { nabor = ST_j[j]; if (CF_marker[nabor] == UNDECIDED) { CF_marker[nabor] = F_PT; measure = measure_array[nabor]; hypre_remove_point(&LoL_head, &LoL_tail, measure, nabor, lists, where); --num_left; for (k = S_i[nabor]; k < S_i[nabor + 1]; k++) { nabor_two = S_j[k]; if (CF_marker[nabor_two] == UNDECIDED) { measure = measure_array[nabor_two]; hypre_remove_point(&LoL_head, &LoL_tail, measure, nabor_two, lists, where); new_meas = ++(measure_array[nabor_two]); hypre_enter_on_lists(&LoL_head, &LoL_tail, new_meas, nabor_two, lists, where); } } } } for (j = S_i[index]; j < S_i[index + 1]; j++) { nabor = S_j[j]; if (CF_marker[nabor] == UNDECIDED) { measure = measure_array[nabor]; hypre_remove_point(&LoL_head, &LoL_tail, measure, nabor, lists, where); measure_array[nabor] = --measure; if (measure > 0) { hypre_enter_on_lists(&LoL_head, &LoL_tail, measure, nabor, lists, where); } else { CF_marker[nabor] = F_PT; --num_left; for (k = S_i[nabor]; k < S_i[nabor + 1]; k++) { nabor_two = S_j[k]; if (CF_marker[nabor_two] == UNDECIDED) { new_meas = measure_array[nabor_two]; hypre_remove_point(&LoL_head, &LoL_tail, new_meas, nabor_two, lists, where); new_meas = ++(measure_array[nabor_two]); hypre_enter_on_lists(&LoL_head, &LoL_tail, new_meas, nabor_two, lists, where); } } } } } } hypre_TFree(measure_array, HYPRE_MEMORY_HOST); hypre_CSRMatrixDestroy(ST); if (debug_flag == 3) { wall_time = time_getWallclockSeconds() - wall_time; hypre_printf("Proc = %d Coarsen 1st pass = %f\n", my_id, wall_time); } hypre_TFree(lists, HYPRE_MEMORY_HOST); hypre_TFree(where, HYPRE_MEMORY_HOST); hypre_TFree(LoL_head, HYPRE_MEMORY_HOST); hypre_TFree(LoL_tail, HYPRE_MEMORY_HOST); for (i = 0; i < num_variables; i++) { if (CF_marker[i] == SC_PT) { CF_marker[i] = C_PT; } } if (coarsen_type == 11) { if (meas_type && num_procs > 1) { hypre_CSRMatrixDestroy(S_ext); } return 0; } /* second pass, check fine points for coarse neighbors for coarsen_type = 2, the second pass includes off-processore boundary points */ /*--------------------------------------------------- * Initialize the graph array *---------------------------------------------------*/ graph_array = hypre_CTAlloc(HYPRE_Int, num_variables, HYPRE_MEMORY_HOST); for (i = 0; i < num_variables; i++) { graph_array[i] = -1; } if (debug_flag == 3) { wall_time = time_getWallclockSeconds(); } if (coarsen_type == 2) { /*------------------------------------------------ * Exchange boundary data for CF_marker *------------------------------------------------*/ CF_marker_offd = hypre_CTAlloc(HYPRE_Int, num_cols_offd, HYPRE_MEMORY_HOST); int_buf_data = hypre_CTAlloc(HYPRE_Int, hypre_ParCSRCommPkgSendMapStart(comm_pkg, num_sends), HYPRE_MEMORY_HOST); index = 0; for (i = 0; i < num_sends; i++) { start = hypre_ParCSRCommPkgSendMapStart(comm_pkg, i); for (j = start; j < hypre_ParCSRCommPkgSendMapStart(comm_pkg, i + 1); j++) { int_buf_data[index++] = CF_marker[hypre_ParCSRCommPkgSendMapElmt(comm_pkg, j)]; } } if (num_procs > 1) { comm_handle = hypre_ParCSRCommHandleCreate(11, comm_pkg, int_buf_data, CF_marker_offd); hypre_ParCSRCommHandleDestroy(comm_handle); } ci_array = hypre_CTAlloc(HYPRE_Int, num_cols_offd, HYPRE_MEMORY_HOST); for (i = 0; i < num_cols_offd; i++) { ci_array[i] = -1; } for (i = 0; i < num_variables; i++) { if (ci_tilde_mark != i) { ci_tilde = -1; } if (ci_tilde_offd_mark != i) { ci_tilde_offd = -1; } if (CF_marker[i] == -1) { break_var = 1; for (ji = S_i[i]; ji < S_i[i + 1]; ji++) { j = S_j[ji]; if (CF_marker[j] > 0) { graph_array[j] = i; } } for (ji = S_offd_i[i]; ji < S_offd_i[i + 1]; ji++) { j = S_offd_j[ji]; if (CF_marker_offd[j] > 0) { ci_array[j] = i; } } for (ji = S_i[i]; ji < S_i[i + 1]; ji++) { j = S_j[ji]; if (CF_marker[j] == -1) { set_empty = 1; for (jj = S_i[j]; jj < S_i[j + 1]; jj++) { index = S_j[jj]; if (graph_array[index] == i) { set_empty = 0; break; } } if (set_empty) { for (jj = S_offd_i[j]; jj < S_offd_i[j + 1]; jj++) { index = S_offd_j[jj]; if (ci_array[index] == i) { set_empty = 0; break; } } } if (set_empty) { if (C_i_nonempty) { CF_marker[i] = 1; if (ci_tilde > -1) { CF_marker[ci_tilde] = -1; ci_tilde = -1; } if (ci_tilde_offd > -1) { CF_marker_offd[ci_tilde_offd] = -1; ci_tilde_offd = -1; } C_i_nonempty = 0; break_var = 0; break; } else { ci_tilde = j; ci_tilde_mark = i; CF_marker[j] = 1; C_i_nonempty = 1; i--; break_var = 0; break; } } } } if (break_var) { for (ji = S_offd_i[i]; ji < S_offd_i[i + 1]; ji++) { j = S_offd_j[ji]; if (CF_marker_offd[j] == -1) { set_empty = 1; for (jj = S_ext_i[j]; jj < S_ext_i[j + 1]; jj++) { big_k = S_ext_j[jj]; if (big_k > col_0 && big_k < col_n) /* index interior */ { if (graph_array[(HYPRE_Int)(big_k - first_col)] == i) { set_empty = 0; break; } } else { jk = hypre_BigBinarySearch(col_map_offd, big_k, num_cols_offd); if (jk != -1) { if (ci_array[jk] == i) { set_empty = 0; break; } } } } if (set_empty) { if (C_i_nonempty) { CF_marker[i] = 1; if (ci_tilde > -1) { CF_marker[ci_tilde] = -1; ci_tilde = -1; } if (ci_tilde_offd > -1) { CF_marker_offd[ci_tilde_offd] = -1; ci_tilde_offd = -1; } C_i_nonempty = 0; break; } else { ci_tilde_offd = j; ci_tilde_offd_mark = i; CF_marker_offd[j] = 1; C_i_nonempty = 1; i--; break; } } } } } } } } else { for (i = 0; i < num_variables; i++) { if (ci_tilde_mark != i) { ci_tilde = -1; } if (CF_marker[i] == -1) { for (ji = S_i[i]; ji < S_i[i + 1]; ji++) { j = S_j[ji]; if (CF_marker[j] > 0) { graph_array[j] = i; } } for (ji = S_i[i]; ji < S_i[i + 1]; ji++) { j = S_j[ji]; if (CF_marker[j] == -1) { set_empty = 1; for (jj = S_i[j]; jj < S_i[j + 1]; jj++) { index = S_j[jj]; if (graph_array[index] == i) { set_empty = 0; break; } } if (set_empty) { if (C_i_nonempty) { CF_marker[i] = 1; if (ci_tilde > -1) { CF_marker[ci_tilde] = -1; ci_tilde = -1; } C_i_nonempty = 0; break; } else { ci_tilde = j; ci_tilde_mark = i; CF_marker[j] = 1; C_i_nonempty = 1; i--; break; } } } } } } } if (debug_flag == 3 && coarsen_type != 2) { wall_time = time_getWallclockSeconds() - wall_time; hypre_printf("Proc = %d Coarsen 2nd pass = %f\n", my_id, wall_time); } /* third pass, check boundary fine points for coarse neighbors */ if (coarsen_type == 3 || coarsen_type == 4) { if (debug_flag == 3) { wall_time = time_getWallclockSeconds(); } CF_marker_offd = hypre_CTAlloc(HYPRE_Int, num_cols_offd, HYPRE_MEMORY_HOST); int_buf_data = hypre_CTAlloc(HYPRE_Int, hypre_ParCSRCommPkgSendMapStart(comm_pkg, num_sends), HYPRE_MEMORY_HOST); /*------------------------------------------------ * Exchange boundary data for CF_marker *------------------------------------------------*/ index = 0; for (i = 0; i < num_sends; i++) { start = hypre_ParCSRCommPkgSendMapStart(comm_pkg, i); for (j = start; j < hypre_ParCSRCommPkgSendMapStart(comm_pkg, i + 1); j++) int_buf_data[index++] = CF_marker[hypre_ParCSRCommPkgSendMapElmt(comm_pkg, j)]; } if (num_procs > 1) { comm_handle = hypre_ParCSRCommHandleCreate(11, comm_pkg, int_buf_data, CF_marker_offd); hypre_ParCSRCommHandleDestroy(comm_handle); } ci_array = hypre_CTAlloc(HYPRE_Int, num_cols_offd, HYPRE_MEMORY_HOST); for (i = 0; i < num_cols_offd; i++) { ci_array[i] = -1; } } if (coarsen_type > 1 && coarsen_type < 5) { for (i = 0; i < num_variables; i++) { graph_array[i] = -1; } for (i = 0; i < num_cols_offd; i++) { if (ci_tilde_mark != i) { ci_tilde = -1; } if (ci_tilde_offd_mark != i) { ci_tilde_offd = -1; } if (CF_marker_offd[i] == -1) { for (ji = S_ext_i[i]; ji < S_ext_i[i + 1]; ji++) { big_k = S_ext_j[ji]; if (big_k > col_0 && big_k < col_n) { j = (HYPRE_Int)(big_k - first_col); if (CF_marker[j] > 0) { graph_array[j] = i; } } else { jj = hypre_BigBinarySearch(col_map_offd, big_k, num_cols_offd); if (jj != -1 && CF_marker_offd[jj] > 0) { ci_array[jj] = i; } } } for (ji = S_ext_i[i]; ji < S_ext_i[i + 1]; ji++) { big_k = S_ext_j[ji]; if (big_k > col_0 && big_k < col_n) { j = (HYPRE_Int)(big_k - first_col); if ( CF_marker[j] == -1) { set_empty = 1; for (jj = S_i[j]; jj < S_i[j + 1]; jj++) { index = S_j[jj]; if (graph_array[index] == i) { set_empty = 0; break; } } for (jj = S_offd_i[j]; jj < S_offd_i[j + 1]; jj++) { index = S_offd_j[jj]; if (ci_array[index] == i) { set_empty = 0; break; } } if (set_empty) { if (C_i_nonempty) { CF_marker_offd[i] = 1; if (ci_tilde > -1) { CF_marker[ci_tilde] = -1; ci_tilde = -1; } if (ci_tilde_offd > -1) { CF_marker_offd[ci_tilde_offd] = -1; ci_tilde_offd = -1; } C_i_nonempty = 0; break; } else { ci_tilde = j; ci_tilde_mark = i; CF_marker[j] = 1; C_i_nonempty = 1; i--; break; } } } } else { jm = hypre_BigBinarySearch(col_map_offd, big_k, num_cols_offd); if (jm != -1 && CF_marker_offd[jm] == -1) { set_empty = 1; for (jj = S_ext_i[jm]; jj < S_ext_i[jm + 1]; jj++) { big_k = S_ext_j[jj]; if (big_k > col_0 && big_k < col_n) { if (graph_array[(HYPRE_Int)(big_k - first_col)] == i) { set_empty = 0; break; } } else { jk = hypre_BigBinarySearch(col_map_offd, big_k, num_cols_offd); if (jk != -1) { if (ci_array[jk] == i) { set_empty = 0; break; } } } } if (set_empty) { if (C_i_nonempty) { CF_marker_offd[i] = 1; if (ci_tilde > -1) { CF_marker[ci_tilde] = -1; ci_tilde = -1; } if (ci_tilde_offd > -1) { CF_marker_offd[ci_tilde_offd] = -1; ci_tilde_offd = -1; } C_i_nonempty = 0; break; } else { ci_tilde_offd = jm; ci_tilde_offd_mark = i; CF_marker_offd[jm] = 1; C_i_nonempty = 1; i--; break; } } } } } } } /*------------------------------------------------ * Send boundary data for CF_marker back *------------------------------------------------*/ if (num_procs > 1) { comm_handle = hypre_ParCSRCommHandleCreate(12, comm_pkg, CF_marker_offd, int_buf_data); hypre_ParCSRCommHandleDestroy(comm_handle); } /* only CF_marker entries from larger procs are accepted if coarsen_type = 4 coarse points are not overwritten */ index = 0; if (coarsen_type != 4) { for (i = 0; i < num_sends; i++) { start = hypre_ParCSRCommPkgSendMapStart(comm_pkg, i); if (hypre_ParCSRCommPkgSendProc(comm_pkg, i) > my_id) { for (j = start; j < hypre_ParCSRCommPkgSendMapStart(comm_pkg, i + 1); j++) CF_marker[hypre_ParCSRCommPkgSendMapElmt(comm_pkg, j)] = int_buf_data[index++]; } else { index += hypre_ParCSRCommPkgSendMapStart(comm_pkg, i + 1) - start; } } } else { for (i = 0; i < num_sends; i++) { start = hypre_ParCSRCommPkgSendMapStart(comm_pkg, i); if (hypre_ParCSRCommPkgSendProc(comm_pkg, i) > my_id) { for (j = start; j < hypre_ParCSRCommPkgSendMapStart(comm_pkg, i + 1); j++) { elmt = hypre_ParCSRCommPkgSendMapElmt(comm_pkg, j); if (CF_marker[elmt] != 1) { CF_marker[elmt] = int_buf_data[index]; } index++; } } else { index += hypre_ParCSRCommPkgSendMapStart(comm_pkg, i + 1) - start; } } } if (debug_flag == 3) { wall_time = time_getWallclockSeconds() - wall_time; if (coarsen_type == 4) hypre_printf("Proc = %d Coarsen 3rd pass = %f\n", my_id, wall_time); if (coarsen_type == 3) hypre_printf("Proc = %d Coarsen 3rd pass = %f\n", my_id, wall_time); if (coarsen_type == 2) hypre_printf("Proc = %d Coarsen 2nd pass = %f\n", my_id, wall_time); } } if (coarsen_type == 5) { /*------------------------------------------------ * Exchange boundary data for CF_marker *------------------------------------------------*/ if (debug_flag == 3) { wall_time = time_getWallclockSeconds(); } CF_marker_offd = hypre_CTAlloc(HYPRE_Int, num_cols_offd, HYPRE_MEMORY_HOST); int_buf_data = hypre_CTAlloc(HYPRE_Int, hypre_ParCSRCommPkgSendMapStart(comm_pkg, num_sends), HYPRE_MEMORY_HOST); index = 0; for (i = 0; i < num_sends; i++) { start = hypre_ParCSRCommPkgSendMapStart(comm_pkg, i); for (j = start; j < hypre_ParCSRCommPkgSendMapStart(comm_pkg, i + 1); j++) int_buf_data[index++] = CF_marker[hypre_ParCSRCommPkgSendMapElmt(comm_pkg, j)]; } if (num_procs > 1) { comm_handle = hypre_ParCSRCommHandleCreate(11, comm_pkg, int_buf_data, CF_marker_offd); hypre_ParCSRCommHandleDestroy(comm_handle); } ci_array = hypre_CTAlloc(HYPRE_Int, num_cols_offd, HYPRE_MEMORY_HOST); for (i = 0; i < num_cols_offd; i++) { ci_array[i] = -1; } for (i = 0; i < num_variables; i++) { graph_array[i] = -1; } for (i = 0; i < num_variables; i++) { if (CF_marker[i] == -1 && (S_offd_i[i + 1] - S_offd_i[i]) > 0) { break_var = 1; for (ji = S_i[i]; ji < S_i[i + 1]; ji++) { j = S_j[ji]; if (CF_marker[j] > 0) { graph_array[j] = i; } } for (ji = S_offd_i[i]; ji < S_offd_i[i + 1]; ji++) { j = S_offd_j[ji]; if (CF_marker_offd[j] > 0) { ci_array[j] = i; } } for (ji = S_offd_i[i]; ji < S_offd_i[i + 1]; ji++) { j = S_offd_j[ji]; if (CF_marker_offd[j] == -1) { set_empty = 1; for (jj = S_ext_i[j]; jj < S_ext_i[j + 1]; jj++) { big_k = S_ext_j[jj]; if (big_k > col_0 && big_k < col_n) /* index interior */ { if (graph_array[(HYPRE_Int)(big_k - first_col)] == i) { set_empty = 0; break; } } else { jk = hypre_BigBinarySearch(col_map_offd, big_k, num_cols_offd); if (jk != -1) { if (ci_array[jk] == i) { set_empty = 0; break; } } } } if (set_empty) { if (C_i_nonempty) { CF_marker[i] = -2; C_i_nonempty = 0; break; } else { C_i_nonempty = 1; i--; break; } } } } } } if (debug_flag == 3) { wall_time = time_getWallclockSeconds() - wall_time; hypre_printf("Proc = %d Coarsen special points = %f\n", my_id, wall_time); } } /*--------------------------------------------------- * Clean up and return *---------------------------------------------------*/ /*if (coarsen_type != 1) { */ hypre_TFree(CF_marker_offd, HYPRE_MEMORY_HOST); hypre_TFree(int_buf_data, HYPRE_MEMORY_HOST); hypre_TFree(ci_array, HYPRE_MEMORY_HOST); /*} */ hypre_TFree(graph_array, HYPRE_MEMORY_HOST); if ((meas_type || (coarsen_type != 1 && coarsen_type != 11)) && num_procs > 1) { hypre_CSRMatrixDestroy(S_ext); } return hypre_error_flag; } HYPRE_Int hypre_BoomerAMGCoarsenFalgout( hypre_ParCSRMatrix *S, hypre_ParCSRMatrix *A, HYPRE_Int measure_type, HYPRE_Int cut_factor, HYPRE_Int debug_flag, hypre_IntArray **CF_marker_ptr) { HYPRE_Int ierr = 0; /*------------------------------------------------------- * Perform Ruge coarsening followed by CLJP coarsening *-------------------------------------------------------*/ ierr += hypre_BoomerAMGCoarsenRuge (S, A, measure_type, 6, cut_factor, debug_flag, CF_marker_ptr); ierr += hypre_BoomerAMGCoarsen (S, A, 1, debug_flag, CF_marker_ptr); return (ierr); } /*--------------------------------------------------------------------------*/ #define C_PT 1 #define F_PT -1 #define SF_PT -3 #define COMMON_C_PT 2 #define Z_PT -2 /* begin HANS added */ /************************************************************** * * Modified Independent Set Coarsening routine * (don't worry about strong F-F connections * without a common C point) * **************************************************************/ HYPRE_Int hypre_BoomerAMGCoarsenPMISHost( hypre_ParCSRMatrix *S, hypre_ParCSRMatrix *A, HYPRE_Int CF_init, HYPRE_Int debug_flag, hypre_IntArray **CF_marker_ptr) { #ifdef HYPRE_PROFILE hypre_profile_times[HYPRE_TIMER_ID_PMIS] -= hypre_MPI_Wtime(); #endif MPI_Comm comm = hypre_ParCSRMatrixComm(S); hypre_ParCSRCommPkg *comm_pkg = hypre_ParCSRMatrixCommPkg(S); hypre_ParCSRCommHandle *comm_handle = NULL; hypre_CSRMatrix *S_diag = hypre_ParCSRMatrixDiag(S); HYPRE_Int *S_diag_i = hypre_CSRMatrixI(S_diag); HYPRE_Int *S_diag_j = hypre_CSRMatrixJ(S_diag); hypre_CSRMatrix *S_offd = hypre_ParCSRMatrixOffd(S); HYPRE_Int *S_offd_i = hypre_CSRMatrixI(S_offd); HYPRE_Int *S_offd_j = NULL; HYPRE_Int num_variables = hypre_CSRMatrixNumRows(S_diag); HYPRE_Int num_cols_offd = 0; /* hypre_CSRMatrix *S_ext; HYPRE_Int *S_ext_i; HYPRE_Int *S_ext_j; */ HYPRE_Int num_sends = 0; HYPRE_Int *int_buf_data; HYPRE_Real *buf_data; HYPRE_Int *CF_marker; HYPRE_Int *CF_marker_offd; HYPRE_Real *measure_array; HYPRE_Int *graph_array; HYPRE_Int *graph_array_offd; HYPRE_Int graph_size; HYPRE_BigInt big_graph_size; HYPRE_Int graph_offd_size; HYPRE_BigInt global_graph_size; HYPRE_Int i, j, jj, jS, ig; HYPRE_Int index, start, my_id, num_procs, jrow, cnt, elmt; HYPRE_Int nnzrow; HYPRE_Int ierr = 0; HYPRE_Real wall_time; HYPRE_Int iter = 0; HYPRE_Int *prefix_sum_workspace; #if 0 /* debugging */ char filename[256]; FILE *fp; HYPRE_Int iter = 0; #endif /******************************************************************************* BEFORE THE INDEPENDENT SET COARSENING LOOP: measure_array: calculate the measures, and communicate them (this array contains measures for both local and external nodes) CF_marker, CF_marker_offd: initialize CF_marker (separate arrays for local and external; 0=unassigned, negative=F point, positive=C point) ******************************************************************************/ /*-------------------------------------------------------------- * Use the ParCSR strength matrix, S. * * For now, the "strength" of dependence/influence is defined in * the following way: i depends on j if * aij > hypre_max (k != i) aik, aii < 0 * or * aij < hypre_min (k != i) aik, aii >= 0 * Then S_ij = 1, else S_ij = 0. * * NOTE: S_data is not used; in stead, only strong columns are retained * in S_j, which can then be used like S_data *----------------------------------------------------------------*/ /*S_ext = NULL; */ if (debug_flag == 3) { wall_time = time_getWallclockSeconds(); } hypre_MPI_Comm_size(comm, &num_procs); hypre_MPI_Comm_rank(comm, &my_id); if (!comm_pkg) { comm_pkg = hypre_ParCSRMatrixCommPkg(A); } if (!comm_pkg) { hypre_MatvecCommPkgCreate(A); comm_pkg = hypre_ParCSRMatrixCommPkg(A); } num_sends = hypre_ParCSRCommPkgNumSends(comm_pkg); int_buf_data = hypre_CTAlloc(HYPRE_Int, hypre_ParCSRCommPkgSendMapStart(comm_pkg, num_sends), HYPRE_MEMORY_HOST); buf_data = hypre_CTAlloc(HYPRE_Real, hypre_ParCSRCommPkgSendMapStart(comm_pkg, num_sends), HYPRE_MEMORY_HOST); num_cols_offd = hypre_CSRMatrixNumCols(S_offd); S_diag_j = hypre_CSRMatrixJ(S_diag); if (num_cols_offd) { S_offd_j = hypre_CSRMatrixJ(S_offd); } /*---------------------------------------------------------- * Compute the measures * * The measures are currently given by the column sums of S. * Hence, measure_array[i] is the number of influences * of variable i. * * The measures are augmented by a random number * between 0 and 1. *----------------------------------------------------------*/ measure_array = hypre_CTAlloc(HYPRE_Real, num_variables + num_cols_offd, HYPRE_MEMORY_HOST); /* first calculate the local part of the sums for the external nodes */ #ifdef HYPRE_USING_OPENMP HYPRE_Int *measure_array_temp = hypre_CTAlloc(HYPRE_Int, num_variables + num_cols_offd, HYPRE_MEMORY_HOST); #pragma omp parallel for private(i) HYPRE_SMP_SCHEDULE for (i = 0; i < S_offd_i[num_variables]; i++) { #pragma omp atomic measure_array_temp[num_variables + S_offd_j[i]]++; } #pragma omp parallel for private(i) HYPRE_SMP_SCHEDULE for (i = 0; i < num_cols_offd; i++) { measure_array[i + num_variables] = measure_array_temp[i + num_variables]; } #else for (i = 0; i < S_offd_i[num_variables]; i++) { measure_array[num_variables + S_offd_j[i]] += 1.0; } #endif // HYPRE_USING_OPENMP /* now send those locally calculated values for the external nodes to the neighboring processors */ if (num_procs > 1) { comm_handle = hypre_ParCSRCommHandleCreate(2, comm_pkg, &measure_array[num_variables], buf_data); } /* calculate the local part for the local nodes */ #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i) HYPRE_SMP_SCHEDULE for (i = 0; i < S_diag_i[num_variables]; i++) { #pragma omp atomic measure_array_temp[S_diag_j[i]]++; } #pragma omp parallel for private(i) HYPRE_SMP_SCHEDULE for (i = 0; i < num_variables; i++) { measure_array[i] = measure_array_temp[i]; } hypre_TFree(measure_array_temp, HYPRE_MEMORY_HOST); #else for (i = 0; i < S_diag_i[num_variables]; i++) { measure_array[S_diag_j[i]] += 1.0; } #endif // HYPRE_USING_OPENMP /* finish the communication */ if (num_procs > 1) { hypre_ParCSRCommHandleDestroy(comm_handle); } /* now add the externally calculated part of the local nodes to the local nodes */ index = 0; for (i = 0; i < num_sends; i++) { start = hypre_ParCSRCommPkgSendMapStart(comm_pkg, i); for (j = start; j < hypre_ParCSRCommPkgSendMapStart(comm_pkg, i + 1); j++) { measure_array[hypre_ParCSRCommPkgSendMapElmt(comm_pkg, j)] += buf_data[index++]; } } /* set the measures of the external nodes to zero */ for (i = num_variables; i < num_variables + num_cols_offd; i++) { measure_array[i] = 0; } /* this augments the measures with a random number between 0 and 1 */ /* (only for the local part) */ /* this augments the measures */ if (CF_init == 2 || CF_init == 4) { hypre_BoomerAMGIndepSetInit(S, measure_array, 1); } else { hypre_BoomerAMGIndepSetInit(S, measure_array, 0); } /*--------------------------------------------------- * Initialize the graph arrays, and CF_marker arrays *---------------------------------------------------*/ /* first the off-diagonal part of the graph array */ if (num_cols_offd) { graph_array_offd = hypre_CTAlloc(HYPRE_Int, num_cols_offd, HYPRE_MEMORY_HOST); } else { graph_array_offd = NULL; } for (ig = 0; ig < num_cols_offd; ig++) { graph_array_offd[ig] = ig; } graph_offd_size = num_cols_offd; /* now the local part of the graph array, and the local CF_marker array */ graph_array = hypre_CTAlloc(HYPRE_Int, num_variables, HYPRE_MEMORY_HOST); /* Allocate CF_marker if not done before */ if (*CF_marker_ptr == NULL) { *CF_marker_ptr = hypre_IntArrayCreate(num_variables); hypre_IntArrayInitialize(*CF_marker_ptr); } CF_marker = hypre_IntArrayData(*CF_marker_ptr); if (CF_init == 1) { cnt = 0; for (i = 0; i < num_variables; i++) { if (CF_marker[i] != SF_PT) { if (S_offd_i[i + 1] - S_offd_i[i] > 0 || CF_marker[i] == -1) { CF_marker[i] = 0; } if (CF_marker[i] == Z_PT) { if (measure_array[i] >= 1.0 || S_diag_i[i + 1] - S_diag_i[i] > 0) { CF_marker[i] = 0; graph_array[cnt++] = i; } else { CF_marker[i] = F_PT; } } else { graph_array[cnt++] = i; } } else { measure_array[i] = 0; } } } else { cnt = 0; for (i = 0; i < num_variables; i++) { CF_marker[i] = 0; nnzrow = (S_diag_i[i + 1] - S_diag_i[i]) + (S_offd_i[i + 1] - S_offd_i[i]); if (nnzrow == 0) { CF_marker[i] = SF_PT; /* an isolated fine grid */ if (CF_init == 3 || CF_init == 4) { CF_marker[i] = C_PT; } measure_array[i] = 0; } else { graph_array[cnt++] = i; } } } graph_size = cnt; /* now the off-diagonal part of CF_marker */ if (num_cols_offd) { CF_marker_offd = hypre_CTAlloc(HYPRE_Int, num_cols_offd, HYPRE_MEMORY_HOST); } else { CF_marker_offd = NULL; } for (i = 0; i < num_cols_offd; i++) { CF_marker_offd[i] = 0; } /*------------------------------------------------ * Communicate the local measures, which are complete, to the external nodes *------------------------------------------------*/ index = 0; for (i = 0; i < num_sends; i++) { start = hypre_ParCSRCommPkgSendMapStart(comm_pkg, i); for (j = start; j < hypre_ParCSRCommPkgSendMapStart(comm_pkg, i + 1); j++) { jrow = hypre_ParCSRCommPkgSendMapElmt(comm_pkg, j); buf_data[index++] = measure_array[jrow]; } } if (num_procs > 1) { comm_handle = hypre_ParCSRCommHandleCreate(1, comm_pkg, buf_data, &measure_array[num_variables]); hypre_ParCSRCommHandleDestroy(comm_handle); } if (debug_flag == 3) { wall_time = time_getWallclockSeconds() - wall_time; hypre_printf("Proc = %d Initialize CLJP phase = %f\n", my_id, wall_time); } /* graph_array2 */ HYPRE_Int *graph_array2 = hypre_CTAlloc(HYPRE_Int, num_variables, HYPRE_MEMORY_HOST); HYPRE_Int *graph_array_offd2 = NULL; if (num_cols_offd) { graph_array_offd2 = hypre_CTAlloc(HYPRE_Int, num_cols_offd, HYPRE_MEMORY_HOST); } /******************************************************************************* THE INDEPENDENT SET COARSENING LOOP: ******************************************************************************/ /*--------------------------------------------------- * Loop until all points are either fine or coarse. *---------------------------------------------------*/ while (1) { big_graph_size = (HYPRE_BigInt) graph_size; /* stop the coarsening if nothing left to be coarsened */ hypre_MPI_Allreduce(&big_graph_size, &global_graph_size, 1, HYPRE_MPI_BIG_INT, hypre_MPI_SUM, comm); /* if (my_id == 0) { hypre_printf("graph size %b\n", global_graph_size); } */ if (global_graph_size == 0) { break; } /* hypre_printf("\n"); hypre_printf("*** MIS iteration %d\n",iter); hypre_printf("graph_size remaining %d\n",graph_size); */ /*----------------------------------------------------------------------------------------- * Pick an independent set of points with maximal measure * At the end, CF_marker is complete, but still needs to be communicated to CF_marker_offd * for CF_init == 1, as in HMIS, the first IS was fed from prior R-S coarsening *----------------------------------------------------------------------------------------*/ if (!CF_init || iter) { /* hypre_BoomerAMGIndepSet(S, measure_array, graph_array, graph_size, graph_array_offd, graph_offd_size, CF_marker, CF_marker_offd); */ #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(ig, i) HYPRE_SMP_SCHEDULE #endif for (ig = 0; ig < graph_size; ig++) { i = graph_array[ig]; if (measure_array[i] > 1) { CF_marker[i] = 1; } } #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(ig, i) HYPRE_SMP_SCHEDULE #endif for (ig = 0; ig < graph_offd_size; ig++) { i = graph_array_offd[ig]; if (measure_array[i + num_variables] > 1) { CF_marker_offd[i] = 1; } } /*------------------------------------------------------- * Remove nodes from the initial independent set *-------------------------------------------------------*/ #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(ig, i, jS, j, jj) HYPRE_SMP_SCHEDULE #endif for (ig = 0; ig < graph_size; ig++) { i = graph_array[ig]; if (measure_array[i] > 1) { /* for each local neighbor j of i */ for (jS = S_diag_i[i]; jS < S_diag_i[i + 1]; jS++) { j = S_diag_j[jS]; if (measure_array[j] > 1) { if (measure_array[i] > measure_array[j]) { CF_marker[j] = 0; } else if (measure_array[j] > measure_array[i]) { CF_marker[i] = 0; } } } /* for each offd neighbor j of i */ for (jS = S_offd_i[i]; jS < S_offd_i[i + 1]; jS++) { jj = S_offd_j[jS]; j = num_variables + jj; if (measure_array[j] > 1) { if (measure_array[i] > measure_array[j]) { CF_marker_offd[jj] = 0; } else if (measure_array[j] > measure_array[i]) { CF_marker[i] = 0; } } } } /* for each node with measure > 1 */ } /* for each node i */ /*------------------------------------------------------------------------------ * Exchange boundary data for CF_marker: send external CF to internal CF *------------------------------------------------------------------------------*/ if (num_procs > 1) { comm_handle = hypre_ParCSRCommHandleCreate(12, comm_pkg, CF_marker_offd, int_buf_data); hypre_ParCSRCommHandleDestroy(comm_handle); } index = 0; for (i = 0; i < num_sends; i++) { start = hypre_ParCSRCommPkgSendMapStart(comm_pkg, i); for (j = start; j < hypre_ParCSRCommPkgSendMapStart(comm_pkg, i + 1); j++) { elmt = hypre_ParCSRCommPkgSendMapElmt(comm_pkg, j); if (!int_buf_data[index] && CF_marker[elmt] > 0) { CF_marker[elmt] = 0; index++; } else { int_buf_data[index++] = CF_marker[elmt]; } } } if (num_procs > 1) { comm_handle = hypre_ParCSRCommHandleCreate(11, comm_pkg, int_buf_data, CF_marker_offd); hypre_ParCSRCommHandleDestroy(comm_handle); } } /* if (!CF_init || iter) */ iter++; /*------------------------------------------------ * Set C-pts and F-pts. *------------------------------------------------*/ #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(ig, i, jS, j) HYPRE_SMP_SCHEDULE #endif for (ig = 0; ig < graph_size; ig++) { i = graph_array[ig]; /*--------------------------------------------- * If the measure of i is smaller than 1, then * make i and F point (because it does not influence * any other point) *---------------------------------------------*/ if (measure_array[i] < 1) { CF_marker[i] = F_PT; } /*--------------------------------------------- * First treat the case where point i is in the * independent set: make i a C point, *---------------------------------------------*/ if (CF_marker[i] > 0) { CF_marker[i] = C_PT; } /*--------------------------------------------- * Now treat the case where point i is not in the * independent set: loop over * all the points j that influence equation i; if * j is a C point, then make i an F point. *---------------------------------------------*/ else { /* first the local part */ for (jS = S_diag_i[i]; jS < S_diag_i[i + 1]; jS++) { /* j is the column number, or the local number of the point influencing i */ j = S_diag_j[jS]; if (CF_marker[j] > 0) /* j is a C-point */ { CF_marker[i] = F_PT; } } /* now the external part */ for (jS = S_offd_i[i]; jS < S_offd_i[i + 1]; jS++) { j = S_offd_j[jS]; if (CF_marker_offd[j] > 0) /* j is a C-point */ { CF_marker[i] = F_PT; } } } /* end else */ } /* end first loop over graph */ /* now communicate CF_marker to CF_marker_offd, to make sure that new external F points are known on this processor */ /*------------------------------------------------------------------------------ * Exchange boundary data for CF_marker: send internal points to external points *------------------------------------------------------------------------------*/ index = 0; for (i = 0; i < num_sends; i++) { start = hypre_ParCSRCommPkgSendMapStart(comm_pkg, i); for (j = start; j < hypre_ParCSRCommPkgSendMapStart(comm_pkg, i + 1); j++) { int_buf_data[index++] = CF_marker[hypre_ParCSRCommPkgSendMapElmt(comm_pkg, j)]; } } if (num_procs > 1) { comm_handle = hypre_ParCSRCommHandleCreate(11, comm_pkg, int_buf_data, CF_marker_offd); hypre_ParCSRCommHandleDestroy(comm_handle); } /*------------------------------------------------ * Update subgraph *------------------------------------------------*/ /*HYPRE_Int prefix_sum_workspace[2*(hypre_NumThreads() + 1)];*/ prefix_sum_workspace = hypre_TAlloc(HYPRE_Int, 2 * (hypre_NumThreads() + 1), HYPRE_MEMORY_HOST); #ifdef HYPRE_USING_OPENMP #pragma omp parallel private(ig,i) #endif { HYPRE_Int private_graph_size_cnt = 0; HYPRE_Int private_graph_offd_size_cnt = 0; HYPRE_Int ig_begin, ig_end; hypre_GetSimpleThreadPartition(&ig_begin, &ig_end, graph_size); HYPRE_Int ig_offd_begin, ig_offd_end; hypre_GetSimpleThreadPartition(&ig_offd_begin, &ig_offd_end, graph_offd_size); for (ig = ig_begin; ig < ig_end; ig++) { i = graph_array[ig]; if (CF_marker[i] != 0) /* C or F point */ { /* the independent set subroutine needs measure 0 for removed nodes */ measure_array[i] = 0; } else { private_graph_size_cnt++; } } for (ig = ig_offd_begin; ig < ig_offd_end; ig++) { i = graph_array_offd[ig]; if (CF_marker_offd[i] != 0) /* C of F point */ { /* the independent set subroutine needs measure 0 for removed nodes */ measure_array[i + num_variables] = 0; } else { private_graph_offd_size_cnt++; } } hypre_prefix_sum_pair(&private_graph_size_cnt, &graph_size, &private_graph_offd_size_cnt, &graph_offd_size, prefix_sum_workspace); for (ig = ig_begin; ig < ig_end; ig++) { i = graph_array[ig]; if (CF_marker[i] == 0) { graph_array2[private_graph_size_cnt++] = i; } } for (ig = ig_offd_begin; ig < ig_offd_end; ig++) { i = graph_array_offd[ig]; if (CF_marker_offd[i] == 0) { graph_array_offd2[private_graph_offd_size_cnt++] = i; } } } /* omp parallel */ HYPRE_Int *temp = graph_array; graph_array = graph_array2; graph_array2 = temp; temp = graph_array_offd; graph_array_offd = graph_array_offd2; graph_array_offd2 = temp; hypre_TFree(prefix_sum_workspace, HYPRE_MEMORY_HOST); } /* end while */ /* hypre_printf("*** MIS iteration %d\n",iter); hypre_printf("graph_size remaining %d\n",graph_size); hypre_printf("num_cols_offd %d\n",num_cols_offd); for (i=0;i 1) hypre_CSRMatrixDestroy(S_ext);*/ #ifdef HYPRE_PROFILE hypre_profile_times[HYPRE_TIMER_ID_PMIS] += hypre_MPI_Wtime(); #endif return (ierr); } HYPRE_Int hypre_BoomerAMGCoarsenPMIS( hypre_ParCSRMatrix *S, hypre_ParCSRMatrix *A, HYPRE_Int CF_init, HYPRE_Int debug_flag, hypre_IntArray **CF_marker_ptr) { hypre_GpuProfilingPushRange("PMIS"); #if defined(HYPRE_USING_GPU) HYPRE_ExecutionPolicy exec = hypre_GetExecPolicy1( hypre_ParCSRMatrixMemoryLocation(A) ); if (exec == HYPRE_EXEC_DEVICE) { hypre_BoomerAMGCoarsenPMISDevice(S, A, CF_init, debug_flag, CF_marker_ptr); } else #endif { hypre_BoomerAMGCoarsenPMISHost(S, A, CF_init, debug_flag, CF_marker_ptr); } hypre_GpuProfilingPopRange(); return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_BoomerAMGCoarsenHMIS * * Ruge coarsening followed by CLJP coarsening *--------------------------------------------------------------------------*/ HYPRE_Int hypre_BoomerAMGCoarsenHMIS( hypre_ParCSRMatrix *S, hypre_ParCSRMatrix *A, HYPRE_Int measure_type, HYPRE_Int cut_factor, HYPRE_Int debug_flag, hypre_IntArray **CF_marker_ptr) { hypre_ParCSRMatrix *h_A, *h_S; hypre_IntArray *CF_marker = NULL; HYPRE_MemoryLocation CF_memory_location; /* Clone matrices on the host if needed */ h_S = hypre_GetActualMemLocation(hypre_ParCSRMatrixMemoryLocation(S)) == hypre_MEMORY_DEVICE ? hypre_ParCSRMatrixClone_v2(S, 0, HYPRE_MEMORY_HOST) : S; h_A = hypre_GetActualMemLocation(hypre_ParCSRMatrixMemoryLocation(A)) == hypre_MEMORY_DEVICE ? hypre_ParCSRMatrixClone_v2(A, 0, HYPRE_MEMORY_HOST) : A; /* Clone/Create CF_marker on the host if needed */ if (*CF_marker_ptr) { CF_memory_location = hypre_IntArrayMemoryLocation(*CF_marker_ptr); CF_marker = hypre_GetActualMemLocation(CF_memory_location) == hypre_MEMORY_DEVICE ? hypre_IntArrayCloneDeep_v2(*CF_marker_ptr, HYPRE_MEMORY_HOST) : *CF_marker_ptr; } else { CF_memory_location = HYPRE_MEMORY_HOST; CF_marker = hypre_IntArrayCreate(hypre_ParCSRMatrixNumRows(A)); hypre_IntArrayInitialize_v2(CF_marker, CF_memory_location); } /* Perform Ruge coarsening on the host */ hypre_BoomerAMGCoarsenRuge(h_S, h_A, measure_type, 10, cut_factor, debug_flag, &CF_marker); /* Free cloned matrices on the host */ if (h_S != S) { hypre_ParCSRMatrixDestroy(h_S); } if (h_A != A) { hypre_ParCSRMatrixDestroy(h_A); } /* Move CF_marker to device if needed */ #if defined(HYPRE_USING_GPU) if (hypre_GetExecPolicy1(hypre_ParCSRMatrixMemoryLocation(A)) == HYPRE_EXEC_DEVICE) { if (*CF_marker_ptr && (*CF_marker_ptr != CF_marker)) { hypre_IntArrayCopy(CF_marker, *CF_marker_ptr); hypre_IntArrayDestroy(CF_marker); CF_marker = NULL; } else if (*CF_marker_ptr == NULL) { *CF_marker_ptr = hypre_IntArrayCloneDeep_v2(CF_marker, HYPRE_MEMORY_DEVICE); hypre_IntArrayDestroy(CF_marker); } } else #endif { *CF_marker_ptr = CF_marker; } /* Perform PMIS coarsening on the host or device */ hypre_BoomerAMGCoarsenPMIS(S, A, 1, debug_flag, CF_marker_ptr); return hypre_error_flag; } hypre-2.33.0/src/parcsr_ls/par_coarsen_device.c000066400000000000000000000606571477326011500215100ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "_hypre_onedpl.hpp" #include "_hypre_parcsr_ls.h" #include "_hypre_utilities.hpp" #define C_PT 1 #define F_PT -1 #define SF_PT -3 #define COMMON_C_PT 2 #define Z_PT -2 #if defined(HYPRE_USING_GPU) HYPRE_Int hypre_PMISCoarseningInitDevice( hypre_ParCSRMatrix *S, hypre_ParCSRCommPkg *comm_pkg, HYPRE_Int CF_init, HYPRE_Real *measure_diag, HYPRE_Real *measure_offd, HYPRE_Real *real_send_buf, HYPRE_Int *graph_diag_size, HYPRE_Int *graph_diag, HYPRE_Int *CF_marker_diag); HYPRE_Int hypre_PMISCoarseningUpdateCFDevice( hypre_ParCSRMatrix *S, HYPRE_Real *measure_diag, HYPRE_Real *measure_offd, HYPRE_Int graph_diag_size, HYPRE_Int *graph_diag, HYPRE_Int *CF_marker_diag, HYPRE_Int *CF_marker_offd, hypre_ParCSRCommPkg *comm_pkg, HYPRE_Real *real_send_buf, HYPRE_Int *int_send_buf); HYPRE_Int hypre_BoomerAMGCoarsenPMISDevice( hypre_ParCSRMatrix *S, hypre_ParCSRMatrix *A, HYPRE_Int CF_init, HYPRE_Int debug_flag, hypre_IntArray **CF_marker_ptr ) { HYPRE_UNUSED_VAR(debug_flag); HYPRE_UNUSED_VAR(CF_init); MPI_Comm comm = hypre_ParCSRMatrixComm(S); hypre_ParCSRCommPkg *comm_pkg = hypre_ParCSRMatrixCommPkg(S); hypre_ParCSRCommHandle *comm_handle; hypre_CSRMatrix *S_diag = hypre_ParCSRMatrixDiag(S); hypre_CSRMatrix *S_offd = hypre_ParCSRMatrixOffd(S); HYPRE_Int num_cols_diag = hypre_CSRMatrixNumCols(S_diag); HYPRE_Int num_cols_offd = hypre_CSRMatrixNumCols(S_offd); HYPRE_Real *measure_diag; HYPRE_Real *measure_offd; HYPRE_Int graph_diag_size; HYPRE_Int *graph_diag; HYPRE_Int *diag_iwork; HYPRE_Int *CF_marker_diag; HYPRE_Int *CF_marker_offd; HYPRE_Int iter = 0; void *send_buf; HYPRE_Int my_id, num_procs; HYPRE_Int aug_rand; #ifdef HYPRE_PROFILE hypre_profile_times[HYPRE_TIMER_ID_PMIS] -= hypre_MPI_Wtime(); #endif hypre_MPI_Comm_size(comm, &num_procs); hypre_MPI_Comm_rank(comm, &my_id); if (!comm_pkg) { comm_pkg = hypre_ParCSRMatrixCommPkg(A); } if (!comm_pkg) { hypre_MatvecCommPkgCreate(A); comm_pkg = hypre_ParCSRMatrixCommPkg(A); } HYPRE_Int num_sends = hypre_ParCSRCommPkgNumSends(comm_pkg); /* CF marker */ if (*CF_marker_ptr == NULL) { *CF_marker_ptr = hypre_IntArrayCreate(num_cols_diag); hypre_IntArrayInitialize(*CF_marker_ptr); } CF_marker_diag = hypre_IntArrayData(*CF_marker_ptr); CF_marker_offd = hypre_CTAlloc(HYPRE_Int, num_cols_offd, HYPRE_MEMORY_DEVICE); /* arrays for global measure diag and offd parts */ measure_diag = hypre_TAlloc(HYPRE_Real, num_cols_diag, HYPRE_MEMORY_DEVICE); measure_offd = hypre_TAlloc(HYPRE_Real, num_cols_offd, HYPRE_MEMORY_DEVICE); /* arrays for nodes that are still in the graph (undetermined nodes) */ graph_diag = hypre_TAlloc(HYPRE_Int, num_cols_diag, HYPRE_MEMORY_DEVICE); diag_iwork = hypre_TAlloc(HYPRE_Int, num_cols_diag, HYPRE_MEMORY_DEVICE); if ( sizeof(HYPRE_Real) >= sizeof(HYPRE_Int) ) { send_buf = (void *) hypre_TAlloc(HYPRE_Real, hypre_ParCSRCommPkgSendMapStart(comm_pkg, num_sends), HYPRE_MEMORY_DEVICE); } else { send_buf = (void *) hypre_TAlloc(HYPRE_Int, hypre_ParCSRCommPkgSendMapStart(comm_pkg, num_sends), HYPRE_MEMORY_DEVICE); } /*------------------------------------------------------------------- * Compute the global measures * The measures are currently given by the column sums of S * Hence, measure_array[i] is the number of influences of variable i * The measures are augmented by a random number between 0 and 1 * Note that measure_offd is not sync'ed *-------------------------------------------------------------------*/ if (CF_init == 2 || CF_init == 4) { /* seq rand */ aug_rand = hypre_HandleUseGpuRand(hypre_handle()) ? 11 : 12; } else { /* each proc generate rand numbers independently */ aug_rand = hypre_HandleUseGpuRand(hypre_handle()) ? 1 : 2; } hypre_GetGlobalMeasureDevice(S, comm_pkg, CF_init, aug_rand, measure_diag, measure_offd, (HYPRE_Real *) send_buf); /* initialize CF marker, graph arrays and measure_diag, measure_offd is sync'ed * Note: CF_marker_offd is not sync'ed */ hypre_PMISCoarseningInitDevice(S, comm_pkg, CF_init, measure_diag, measure_offd, (HYPRE_Real *) send_buf, &graph_diag_size, graph_diag, CF_marker_diag); while (1) { HYPRE_BigInt big_graph_size, global_graph_size; big_graph_size = graph_diag_size; /* stop the coarsening if nothing left to be coarsened */ hypre_MPI_Allreduce(&big_graph_size, &global_graph_size, 1, HYPRE_MPI_BIG_INT, hypre_MPI_SUM, comm); /* if (my_id == 0) { hypre_printf("graph size %b\n", global_graph_size); } */ if (global_graph_size == 0) { break; } if (CF_init == 0 || CF_init == 2 || iter) { /* on input CF_marker_offd does not need to be sync'ed, (but has minimal requirement on * the values, see comments therein), and will NOT be sync'ed on exit */ hypre_BoomerAMGIndepSetDevice(S, measure_diag, measure_offd, graph_diag_size, graph_diag, CF_marker_diag, CF_marker_offd, comm_pkg, (HYPRE_Int *) send_buf); /* sync CF_marker_offd: so it has correct 1/0 now */ #if defined(HYPRE_USING_SYCL) hypreSycl_gather( hypre_ParCSRCommPkgDeviceSendMapElmts(comm_pkg), hypre_ParCSRCommPkgDeviceSendMapElmts(comm_pkg) + hypre_ParCSRCommPkgSendMapStart(comm_pkg, num_sends), CF_marker_diag, (HYPRE_Int *) send_buf ); #else HYPRE_THRUST_CALL( gather, hypre_ParCSRCommPkgDeviceSendMapElmts(comm_pkg), hypre_ParCSRCommPkgDeviceSendMapElmts(comm_pkg) + hypre_ParCSRCommPkgSendMapStart(comm_pkg, num_sends), CF_marker_diag, (HYPRE_Int *) send_buf ); #endif #if defined(HYPRE_USING_THRUST_NOSYNC) /* RL: make sure send_buf is ready before issuing GPU-GPU MPI */ if (hypre_GetGpuAwareMPI()) { hypre_ForceSyncComputeStream(); } #endif comm_handle = hypre_ParCSRCommHandleCreate_v2(11, comm_pkg, HYPRE_MEMORY_DEVICE, (HYPRE_Int *) send_buf, HYPRE_MEMORY_DEVICE, CF_marker_offd); hypre_ParCSRCommHandleDestroy(comm_handle); } iter ++; /* From the IS, set C/F-pts in CF_marker_diag (for the nodes still in graph) and * clear their values in measure_diag. measure_offd is sync'ed afterwards. * Note: CF_marker_offd Needs to be sync'ed on entry is NOT sync'ed on exit */ hypre_PMISCoarseningUpdateCFDevice(S, measure_diag, measure_offd, graph_diag_size, graph_diag, CF_marker_diag, CF_marker_offd, comm_pkg, (HYPRE_Real *) send_buf, (HYPRE_Int *)send_buf); /* Update graph_diag. Remove the nodes with CF_marker_diag != 0 */ #if defined(HYPRE_USING_SYCL) hypreSycl_gather( graph_diag, graph_diag + graph_diag_size, CF_marker_diag, diag_iwork ); HYPRE_Int *new_end = hypreSycl_remove_if( graph_diag, graph_diag + graph_diag_size, diag_iwork, [] (const auto & x) {return x;} ); #else HYPRE_THRUST_CALL( gather, graph_diag, graph_diag + graph_diag_size, CF_marker_diag, diag_iwork ); HYPRE_Int *new_end = HYPRE_THRUST_CALL( remove_if, graph_diag, graph_diag + graph_diag_size, diag_iwork, thrust::identity() ); #endif graph_diag_size = new_end - graph_diag; } /*--------------------------------------------------- * Clean up and return *---------------------------------------------------*/ hypre_TFree(measure_diag, HYPRE_MEMORY_DEVICE); hypre_TFree(measure_offd, HYPRE_MEMORY_DEVICE); hypre_TFree(graph_diag, HYPRE_MEMORY_DEVICE); hypre_TFree(diag_iwork, HYPRE_MEMORY_DEVICE); hypre_TFree(CF_marker_offd, HYPRE_MEMORY_DEVICE); hypre_TFree(send_buf, HYPRE_MEMORY_DEVICE); #ifdef HYPRE_PROFILE hypre_profile_times[HYPRE_TIMER_ID_PMIS] += hypre_MPI_Wtime(); #endif return hypre_error_flag; } HYPRE_Int hypre_GetGlobalMeasureDevice( hypre_ParCSRMatrix *S, hypre_ParCSRCommPkg *comm_pkg, HYPRE_Int CF_init, HYPRE_Int aug_rand, HYPRE_Real *measure_diag, HYPRE_Real *measure_offd, HYPRE_Real *real_send_buf ) { HYPRE_UNUSED_VAR(CF_init); hypre_ParCSRCommHandle *comm_handle; HYPRE_Int num_sends = hypre_ParCSRCommPkgNumSends(comm_pkg); hypre_CSRMatrix *S_diag = hypre_ParCSRMatrixDiag(S); hypre_CSRMatrix *S_offd = hypre_ParCSRMatrixOffd(S); /* Compute global column nnz */ /* compute local column nnz of the offd part */ hypre_CSRMatrixColNNzRealDevice(S_offd, measure_offd); if (hypre_GetGpuAwareMPI()) { /* RL: make sure measure_offd is ready before issuing GPU-GPU MPI */ hypre_ForceSyncComputeStream(); } /* send local column nnz of the offd part to neighbors */ comm_handle = hypre_ParCSRCommHandleCreate_v2(2, comm_pkg, HYPRE_MEMORY_DEVICE, measure_offd, HYPRE_MEMORY_DEVICE, real_send_buf); /* compute local column nnz of the diag part */ hypre_CSRMatrixColNNzRealDevice(S_diag, measure_diag); hypre_ParCSRCommHandleDestroy(comm_handle); /* add to the local column nnz of the diag part */ hypre_ParCSRCommPkgCopySendMapElmtsToDevice(comm_pkg); hypreDevice_GenScatterAdd(measure_diag, hypre_ParCSRCommPkgSendMapStart(comm_pkg, num_sends), hypre_ParCSRCommPkgDeviceSendMapElmts(comm_pkg), real_send_buf, NULL); /* Augments the measures with a random number between 0 and 1 (only for the local part) */ if (aug_rand) { hypre_BoomerAMGIndepSetInitDevice(S, measure_diag, aug_rand); } /* Note that measure_offd is not sync'ed (communicated) here * and is not set to zero as in the cpu pmis */ return hypre_error_flag; } __global__ void hypreGPUKernel_PMISCoarseningInit(hypre_DeviceItem &item, HYPRE_Int nrows, HYPRE_Int CF_init, HYPRE_Int *S_diag_i, HYPRE_Int *S_offd_i, HYPRE_Real *measure_diag, HYPRE_Int *CF_marker_diag) { /* global_thread_id */ const HYPRE_Int i = hypre_gpu_get_grid_thread_id<1, 1>(item); if (i >= nrows) { return; } HYPRE_Int CF_marker_i = 0; if (CF_init == 1) { CF_marker_i = read_only_load(&CF_marker_diag[i]); if (CF_marker_i != SF_PT) { if (read_only_load(&S_offd_i[i + 1]) - read_only_load(&S_offd_i[i]) > 0 || CF_marker_i == F_PT) { CF_marker_i = 0; } if (CF_marker_i == Z_PT) { if (measure_diag[i] > 1.0 || read_only_load(&S_diag_i[i + 1]) - read_only_load(&S_diag_i[i])) { CF_marker_i = 0; } else { CF_marker_i = SF_PT; } } } else { measure_diag[i] = 0.0; } } else { if ( read_only_load(&S_diag_i[i + 1]) - read_only_load(&S_diag_i[i]) == 0 && read_only_load(&S_offd_i[i + 1]) - read_only_load(&S_offd_i[i]) == 0 ) { CF_marker_i = (CF_init == 3 || CF_init == 4) ? C_PT : SF_PT; measure_diag[i] = 0.0; } } /*--------------------------------------------- * If the measure of i is smaller than 1, then * make i and F point (because it does not influence * any other point) * RL: move this step to pmis init and don't do the check * in pmis iterations. different from cpu impl *---------------------------------------------*/ if (CF_marker_i == 0 && measure_diag[i] < 1.0) { CF_marker_i = F_PT; measure_diag[i] = 0.0; } CF_marker_diag[i] = CF_marker_i; } HYPRE_Int hypre_PMISCoarseningInitDevice( hypre_ParCSRMatrix *S, /* in */ hypre_ParCSRCommPkg *comm_pkg, /* in */ HYPRE_Int CF_init, /* in */ HYPRE_Real *measure_diag, /* in */ HYPRE_Real *measure_offd, /* out */ HYPRE_Real *real_send_buf, /* in */ HYPRE_Int *graph_diag_size, /* out */ HYPRE_Int *graph_diag, /* out */ HYPRE_Int *CF_marker_diag /* in/out */ ) { hypre_CSRMatrix *S_diag = hypre_ParCSRMatrixDiag(S); hypre_CSRMatrix *S_offd = hypre_ParCSRMatrixOffd(S); HYPRE_Int *S_diag_i = hypre_CSRMatrixI(S_diag); HYPRE_Int *S_offd_i = hypre_CSRMatrixI(S_offd); HYPRE_Int num_rows_diag = hypre_CSRMatrixNumRows(S_diag); HYPRE_Int num_sends = hypre_ParCSRCommPkgNumSends(comm_pkg); dim3 bDim = hypre_GetDefaultDeviceBlockDimension(); dim3 gDim = hypre_GetDefaultDeviceGridDimension(num_rows_diag, "thread", bDim); hypre_ParCSRCommHandle *comm_handle; HYPRE_Int *new_end; /* init CF_marker_diag and measure_diag: remove some special nodes */ HYPRE_GPU_LAUNCH( hypreGPUKernel_PMISCoarseningInit, gDim, bDim, num_rows_diag, CF_init, S_diag_i, S_offd_i, measure_diag, CF_marker_diag ); /* communicate for measure_offd */ #if defined(HYPRE_USING_SYCL) hypreSycl_gather( hypre_ParCSRCommPkgDeviceSendMapElmts(comm_pkg), hypre_ParCSRCommPkgDeviceSendMapElmts(comm_pkg) + hypre_ParCSRCommPkgSendMapStart(comm_pkg, num_sends), measure_diag, real_send_buf ); #else HYPRE_THRUST_CALL(gather, hypre_ParCSRCommPkgDeviceSendMapElmts(comm_pkg), hypre_ParCSRCommPkgDeviceSendMapElmts(comm_pkg) + hypre_ParCSRCommPkgSendMapStart(comm_pkg, num_sends), measure_diag, real_send_buf); #endif #if defined(HYPRE_USING_THRUST_NOSYNC) /* RL: make sure real_send_buf is ready before issuing GPU-GPU MPI */ if (hypre_GetGpuAwareMPI()) { hypre_ForceSyncComputeStream(); } #endif comm_handle = hypre_ParCSRCommHandleCreate_v2(1, comm_pkg, HYPRE_MEMORY_DEVICE, real_send_buf, HYPRE_MEMORY_DEVICE, measure_offd); hypre_ParCSRCommHandleDestroy(comm_handle); /* graph_diag consists points with CF_marker_diag == 0 */ #if defined(HYPRE_USING_SYCL) oneapi::dpl::counting_iterator count(0); new_end = hypreSycl_remove_copy_if( count, count + num_rows_diag, CF_marker_diag, graph_diag, [] (const auto & x) {return x;} ); #else new_end = HYPRE_THRUST_CALL( remove_copy_if, thrust::make_counting_iterator(0), thrust::make_counting_iterator(num_rows_diag), CF_marker_diag, graph_diag, thrust::identity()); #endif *graph_diag_size = new_end - graph_diag; return hypre_error_flag; } __global__ void hypreGPUKernel_PMISCoarseningUpdateCF(hypre_DeviceItem &item, HYPRE_Int graph_diag_size, HYPRE_Int *graph_diag, HYPRE_Int *S_diag_i, HYPRE_Int *S_diag_j, HYPRE_Int *S_offd_i, HYPRE_Int *S_offd_j, HYPRE_Real *measure_diag, HYPRE_Int *CF_marker_diag, HYPRE_Int *CF_marker_offd) { HYPRE_Int warp_id = hypre_gpu_get_grid_warp_id<1, 1>(item); if (warp_id >= graph_diag_size) { return; } HYPRE_Int lane = hypre_gpu_get_lane_id<1>(item); HYPRE_Int row = 0, i = 0, marker_row, row_start, row_end; if (lane < 2) { row = read_only_load(graph_diag + warp_id); i = read_only_load(CF_marker_diag + row); } marker_row = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, i, 0); if (marker_row > 0) { if (lane == 0) { measure_diag[row] = 0.0; /* this node is in the IS, mark it as C_PT */ /* given the fact that C_PT == 1, can skip */ /* CF_marker_diag[row] = C_PT; */ } } else { hypre_device_assert(marker_row == 0); /*------------------------------------------------- * Now treat the case where this node is not in the * independent set: loop over * all the points j that influence equation 'row'; if * any j is a C point, then make row an F point and * clear the measure *-------------------------------------------------*/ if (lane < 2) { i = read_only_load(S_diag_i + row + lane); } row_start = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, i, 0); row_end = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, i, 1); for (i = row_start + lane; i < row_end; i += HYPRE_WARP_SIZE) { HYPRE_Int j = read_only_load(S_diag_j + i); /* CF_marker_diag is not r.o. in this kernel */ HYPRE_Int marker_j = CF_marker_diag[j]; if (marker_j > 0) { marker_row = -1; break; } } marker_row = warp_allreduce_min(item, marker_row); if (marker_row == 0) { if (lane < 2) { i = read_only_load(S_offd_i + row + lane); } row_start = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, i, 0); row_end = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, i, 1); for (i = row_start + lane; i < row_end; i += HYPRE_WARP_SIZE) { HYPRE_Int j = read_only_load(S_offd_j + i); HYPRE_Int marker_j = read_only_load(CF_marker_offd + j); if (marker_j > 0) { marker_row = -1; break; } } marker_row = warp_reduce_min(item, marker_row); } if (lane == 0 && marker_row == -1) { CF_marker_diag[row] = F_PT; measure_diag[row] = 0.0; } } } HYPRE_Int hypre_PMISCoarseningUpdateCFDevice( hypre_ParCSRMatrix *S, /* in */ HYPRE_Real *measure_diag, HYPRE_Real *measure_offd, HYPRE_Int graph_diag_size, /* in */ HYPRE_Int *graph_diag, /* in */ HYPRE_Int *CF_marker_diag, /* in/out */ HYPRE_Int *CF_marker_offd, /* in/out */ hypre_ParCSRCommPkg *comm_pkg, HYPRE_Real *real_send_buf, HYPRE_Int *int_send_buf ) { HYPRE_UNUSED_VAR(int_send_buf); hypre_CSRMatrix *S_diag = hypre_ParCSRMatrixDiag(S); HYPRE_Int *S_diag_i = hypre_CSRMatrixI(S_diag); HYPRE_Int *S_diag_j = hypre_CSRMatrixJ(S_diag); hypre_CSRMatrix *S_offd = hypre_ParCSRMatrixOffd(S); HYPRE_Int *S_offd_i = hypre_CSRMatrixI(S_offd); HYPRE_Int *S_offd_j = hypre_CSRMatrixJ(S_offd); HYPRE_Int num_sends = hypre_ParCSRCommPkgNumSends(comm_pkg); dim3 bDim = hypre_GetDefaultDeviceBlockDimension(); dim3 gDim = hypre_GetDefaultDeviceGridDimension(graph_diag_size, "warp", bDim); HYPRE_GPU_LAUNCH( hypreGPUKernel_PMISCoarseningUpdateCF, gDim, bDim, graph_diag_size, graph_diag, S_diag_i, S_diag_j, S_offd_i, S_offd_j, measure_diag, CF_marker_diag, CF_marker_offd ); hypre_ParCSRCommHandle *comm_handle; /* communicate for measure_offd */ #if defined(HYPRE_USING_SYCL) hypreSycl_gather( hypre_ParCSRCommPkgDeviceSendMapElmts(comm_pkg), hypre_ParCSRCommPkgDeviceSendMapElmts(comm_pkg) + hypre_ParCSRCommPkgSendMapStart(comm_pkg, num_sends), measure_diag, real_send_buf ); #else HYPRE_THRUST_CALL(gather, hypre_ParCSRCommPkgDeviceSendMapElmts(comm_pkg), hypre_ParCSRCommPkgDeviceSendMapElmts(comm_pkg) + hypre_ParCSRCommPkgSendMapStart(comm_pkg, num_sends), measure_diag, real_send_buf); #endif #if defined(HYPRE_USING_THRUST_NOSYNC) /* RL: make sure real_send_buf is ready before issuing GPU-GPU MPI */ if (hypre_GetGpuAwareMPI()) { hypre_ForceSyncComputeStream(); } #endif comm_handle = hypre_ParCSRCommHandleCreate_v2(1, comm_pkg, HYPRE_MEMORY_DEVICE, real_send_buf, HYPRE_MEMORY_DEVICE, measure_offd); hypre_ParCSRCommHandleDestroy(comm_handle); #if 0 /* now communicate CF_marker to CF_marker_offd, to make sure that new external F points are known on this processor */ HYPRE_THRUST_CALL(gather, hypre_ParCSRCommPkgDeviceSendMapElmts(comm_pkg), hypre_ParCSRCommPkgDeviceSendMapElmts(comm_pkg) + hypre_ParCSRCommPkgSendMapStart(comm_pkg, num_sends), CF_marker_diag, int_send_buf); #if defined(HYPRE_USING_THRUST_NOSYNC) /* RL: make sure int_send_buf is ready before issuing GPU-GPU MPI */ if (hypre_GetGpuAwareMPI()) { hypre_ForceSyncComputeStream(); } #endif comm_handle = hypre_ParCSRCommHandleCreate_v2(11, comm_pkg, HYPRE_MEMORY_DEVICE, int_send_buf, HYPRE_MEMORY_DEVICE, CF_marker_offd); hypre_ParCSRCommHandleDestroy(comm_handle); #endif return hypre_error_flag; } #endif // #if defined(HYPRE_USING_GPU) hypre-2.33.0/src/parcsr_ls/par_coordinates.c000066400000000000000000000046761477326011500210500ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "_hypre_parcsr_ls.h" /*-------------------------------------------------------------------------- * hypre_GenerateCoordinates *--------------------------------------------------------------------------*/ float * hypre_GenerateCoordinates( MPI_Comm comm, HYPRE_BigInt nx, HYPRE_BigInt ny, HYPRE_BigInt nz, HYPRE_Int P, HYPRE_Int Q, HYPRE_Int R, HYPRE_Int p, HYPRE_Int q, HYPRE_Int r, HYPRE_Int coorddim) { HYPRE_UNUSED_VAR(comm); HYPRE_BigInt ix, iy, iz; HYPRE_Int cnt; HYPRE_Int nx_local, ny_local, nz_local; HYPRE_Int local_num_rows; HYPRE_BigInt *nx_part; HYPRE_BigInt *ny_part; HYPRE_BigInt *nz_part; float *coord = NULL; if (coorddim < 1 || coorddim > 3) { return NULL; } hypre_GeneratePartitioning(nx, P, &nx_part); hypre_GeneratePartitioning(ny, Q, &ny_part); hypre_GeneratePartitioning(nz, R, &nz_part); nx_local = (HYPRE_Int)(nx_part[p + 1] - nx_part[p]); ny_local = (HYPRE_Int)(ny_part[q + 1] - ny_part[q]); nz_local = (HYPRE_Int)(nz_part[r + 1] - nz_part[r]); local_num_rows = nx_local * ny_local * nz_local; coord = hypre_CTAlloc(float, coorddim * local_num_rows, HYPRE_MEMORY_HOST); cnt = 0; for (iz = nz_part[r]; iz < nz_part[r + 1]; iz++) { for (iy = ny_part[q]; iy < ny_part[q + 1]; iy++) { for (ix = nx_part[p]; ix < nx_part[p + 1]; ix++) { /* set coordinates BM Oct 17, 2006 */ if (coord) { if (nx > 1) { coord[cnt++] = ix; } if (ny > 1) { coord[cnt++] = iy; } if (nz > 1) { coord[cnt++] = iz; } } } } } hypre_TFree(nx_part, HYPRE_MEMORY_HOST); hypre_TFree(ny_part, HYPRE_MEMORY_HOST); hypre_TFree(nz_part, HYPRE_MEMORY_HOST); return coord; } hypre-2.33.0/src/parcsr_ls/par_cr.c000066400000000000000000003103321477326011500171270ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /*==================== * Functions to run cr *====================*/ #include <_hypre_parcsr_ls.h> #define RelaxScheme1 3 /* cr type */ #define fptOmegaJac 1 /* 1 is f pt weighted jacobi */ #define omega1 1.0 /* weight */ #define fptgs 3 /* 3 is f pt GS */ #define theta_global1 .7 /* cr stop criteria */ #define mu1 5 /* # of cr sweeps */ #define cpt 1 #define fpt -1 #define cand 0 HYPRE_Int hypre_BoomerAMGCoarsenCR1( hypre_ParCSRMatrix *A, hypre_IntArray **CF_marker_ptr, HYPRE_BigInt *coarse_size_ptr, HYPRE_Int num_CR_relax_steps, HYPRE_Int IS_type, HYPRE_Int CRaddCpoints) { HYPRE_UNUSED_VAR(num_CR_relax_steps); HYPRE_UNUSED_VAR(IS_type); HYPRE_Int i; /* HYPRE_Real theta_global;*/ hypre_CSRMatrix *A_diag = hypre_ParCSRMatrixDiag(A); HYPRE_Int *A_i = hypre_CSRMatrixI(A_diag); HYPRE_Int *A_j = hypre_CSRMatrixJ(A_diag); HYPRE_Real *A_data = hypre_CSRMatrixData(A_diag); HYPRE_Int num_variables = hypre_CSRMatrixNumRows(A_diag); HYPRE_Int *CF_marker; HYPRE_Int coarse_size; if (CRaddCpoints == 0) { *CF_marker_ptr = hypre_IntArrayCreate(num_variables); hypre_IntArrayInitialize(*CF_marker_ptr); hypre_IntArraySetConstantValues(*CF_marker_ptr, fpt); } CF_marker = hypre_IntArrayData(*CF_marker_ptr); /* Run the CR routine */ hypre_fprintf(stdout, "\n... Building CF using CR ...\n\n"); hypre_cr(A_i, A_j, A_data, num_variables, CF_marker, RelaxScheme1, omega1, theta_global1, mu1); hypre_fprintf(stdout, "\n... Done \n\n"); coarse_size = 0; for ( i = 0 ; i < num_variables; i++) { if ( CF_marker[i] == cpt) { coarse_size++; } } *coarse_size_ptr = coarse_size; return hypre_error_flag; } /* main cr routine */ HYPRE_Int hypre_cr(HYPRE_Int *A_i, HYPRE_Int *A_j, HYPRE_Real *A_data, HYPRE_Int n, HYPRE_Int *cf, HYPRE_Int rlx, HYPRE_Real omega, HYPRE_Real tg, HYPRE_Int mu) { HYPRE_Int i, nstages = 0; HYPRE_Real rho, rho0, rho1, *e0, *e1; HYPRE_Real nc = 0.0; e0 = hypre_CTAlloc(HYPRE_Real, n, HYPRE_MEMORY_HOST); e1 = hypre_CTAlloc(HYPRE_Real, n, HYPRE_MEMORY_HOST); hypre_fprintf(stdout, "Stage \t rho \t alpha \n"); hypre_fprintf(stdout, "-----------------------\n"); for (i = 0; i < n; i++) { e1[i] = 1.0e0 + .1 * hypre_RandI(); } /* stages */ while (1) { if (nstages > 0) { for (i = 0; i < n; i++) { if (cf[i] == cpt) { e0[i] = 0.0e0; e1[i] = 0.0e0; } } } switch (rlx) { case fptOmegaJac: for (i = 0; i < mu; i++) { hypre_fptjaccr(cf, A_i, A_j, A_data, n, e0, omega, e1); } break; case fptgs: for (i = 0; i < mu; i++) { hypre_fptgscr(cf, A_i, A_j, A_data, n, e0, e1); } break; } rho = 0.0e0; rho0 = 0.0e0; rho1 = 0.0e0; for (i = 0; i < n; i++) { rho0 += hypre_pow(e0[i], 2); rho1 += hypre_pow(e1[i], 2); } rho = hypre_sqrt(rho1) / hypre_sqrt(rho0); if (rho > tg) { hypre_formu(cf, n, e1, A_i, rho); hypre_IndepSetGreedy(A_i, A_j, n, cf); hypre_fprintf(stdout, " %d \t%2.3f \t%2.3f \n", nstages, rho, nc / n); /* update for next sweep */ nc = 0.0e0; for (i = 0; i < n; i++) { if (cf[i] == cpt) { nc += 1.0e0; } else if (cf[i] == fpt) { e0[i] = 1.0e0 + .1 * hypre_RandI(); e1[i] = 1.0e0 + .1 * hypre_RandI(); } } nstages += 1; } else { hypre_fprintf(stdout, " %d \t%2.3f \t%2.3f \n", nstages, rho, nc / n); break; } } hypre_TFree(e0, HYPRE_MEMORY_HOST); hypre_TFree(e1, HYPRE_MEMORY_HOST); return hypre_error_flag; } /* take an ind. set over the candidates*/ HYPRE_Int hypre_GraphAdd( Link *list, HYPRE_Int *head, HYPRE_Int *tail, HYPRE_Int index, HYPRE_Int istack ) { HYPRE_Int prev = tail[-istack]; list[index].prev = prev; if (prev < 0) { head[-istack] = index; } else { list[prev].next = index; } list[index].next = -istack; tail[-istack] = index; return hypre_error_flag; } HYPRE_Int hypre_GraphRemove( Link *list, HYPRE_Int *head, HYPRE_Int *tail, HYPRE_Int index ) { HYPRE_Int prev = list[index].prev; HYPRE_Int next = list[index].next; if (prev < 0) { head[prev] = next; } else { list[prev].next = next; } if (next < 0) { tail[next] = prev; } else { list[next].prev = prev; } return hypre_error_flag; } HYPRE_Int hypre_IndepSetGreedy(HYPRE_Int *A_i, HYPRE_Int *A_j, HYPRE_Int n, HYPRE_Int *cf) { Link *list; HYPRE_Int *head, *head_mem, *ma; HYPRE_Int *tail, *tail_mem; HYPRE_Int i, ji, jj, jl, index, istack, stack_size; ma = hypre_CTAlloc(HYPRE_Int, n, HYPRE_MEMORY_HOST); /* Initialize the graph and measure array * * ma: cands >= 1 * cpts = -1 * else = 0 * Note: only cands are put into graph */ istack = 0; for (i = 0; i < n; i++) { if (cf[i] == cand) { ma[i] = 1; for (ji = A_i[i] + 1; ji < A_i[i + 1]; ji++) { jj = A_j[ji]; if (cf[jj] != cpt) { ma[i]++; } } if (ma[i] > istack) { istack = (HYPRE_Int) ma[i]; } } else if (cf[i] == cpt) { ma[i] = -1; } else { ma[i] = 0; } } stack_size = 2 * istack; /* initialize graph */ head_mem = hypre_CTAlloc(HYPRE_Int, stack_size, HYPRE_MEMORY_HOST); head = head_mem + stack_size; tail_mem = hypre_CTAlloc(HYPRE_Int, stack_size, HYPRE_MEMORY_HOST); tail = tail_mem + stack_size; list = hypre_CTAlloc(Link, n, HYPRE_MEMORY_HOST); for (i = -1; i >= -stack_size; i--) { head[i] = i; tail[i] = i; } for (i = 0; i < n; i++) { if (ma[i] > 0) { hypre_GraphAdd(list, head, tail, i, (HYPRE_Int) ma[i]); } } /* Loop until all points are either F or C */ while (istack > 0) { /* i w/ max measure at head of stacks */ i = head[-istack]; /* make i C point */ cf[i] = cpt; ma[i] = -1; /* remove i from graph */ hypre_GraphRemove(list, head, tail, i); /* update nbs and nbs-of-nbs */ for (ji = A_i[i] + 1; ji < A_i[i + 1]; ji++) { jj = A_j[ji]; /* if not "decided" C or F */ if (ma[jj] > -1) { /* if a candidate, remove jj from graph */ if (ma[jj] > 0) { hypre_GraphRemove(list, head, tail, jj); } /* make jj an F point and mark "decided" */ cf[jj] = fpt; ma[jj] = -1; for (jl = A_i[jj] + 1; jl < A_i[jj + 1]; jl++) { index = A_j[jl]; /* if a candidate, increase ma */ if (ma[index] > 0) { ma[index]++; /* move index in graph */ hypre_GraphRemove(list, head, tail, index); hypre_GraphAdd(list, head, tail, index, (HYPRE_Int) ma[index]); if (ma[index] > istack) { istack = (HYPRE_Int) ma[index]; } } } } } /* reset istack to point to biggest non-empty stack */ for ( ; istack > 0; istack--) { /* if non-negative, break */ if (head[-istack] > -1) { break; } } } hypre_TFree(ma, HYPRE_MEMORY_HOST); hypre_TFree(list, HYPRE_MEMORY_HOST); hypre_TFree(head_mem, HYPRE_MEMORY_HOST); hypre_TFree(tail_mem, HYPRE_MEMORY_HOST); return hypre_error_flag; } HYPRE_Int hypre_IndepSetGreedyS(HYPRE_Int *A_i, HYPRE_Int *A_j, HYPRE_Int n, HYPRE_Int *cf) { Link *list; HYPRE_Int *head, *head_mem, *ma; HYPRE_Int *tail, *tail_mem; HYPRE_Int i, ji, jj, jl, index, istack, stack_size; ma = hypre_CTAlloc(HYPRE_Int, n, HYPRE_MEMORY_HOST); /* Initialize the graph and measure array * * ma: cands >= 1 * cpts = -1 * else = 0 * Note: only cands are put into graph */ istack = 0; for (i = 0; i < n; i++) { if (cf[i] == cand) { ma[i] = 1; for (ji = A_i[i]; ji < A_i[i + 1]; ji++) { jj = A_j[ji]; if (cf[jj] != cpt) { ma[i]++; } } if (ma[i] > istack) { istack = (HYPRE_Int) ma[i]; } } else if (cf[i] == cpt) { ma[i] = -1; } else { ma[i] = 0; } } stack_size = 2 * istack; /* initialize graph */ head_mem = hypre_CTAlloc(HYPRE_Int, stack_size, HYPRE_MEMORY_HOST); head = head_mem + stack_size; tail_mem = hypre_CTAlloc(HYPRE_Int, stack_size, HYPRE_MEMORY_HOST); tail = tail_mem + stack_size; list = hypre_CTAlloc(Link, n, HYPRE_MEMORY_HOST); for (i = -1; i >= -stack_size; i--) { head[i] = i; tail[i] = i; } for (i = 0; i < n; i++) { if (ma[i] > 0) { hypre_GraphAdd(list, head, tail, i, (HYPRE_Int) ma[i]); } } /* Loop until all points are either F or C */ while (istack > 0) { /* i w/ max measure at head of stacks */ i = head[-istack]; /* make i C point */ cf[i] = cpt; ma[i] = -1; /* remove i from graph */ hypre_GraphRemove(list, head, tail, i); /* update nbs and nbs-of-nbs */ for (ji = A_i[i]; ji < A_i[i + 1]; ji++) { jj = A_j[ji]; /* if not "decided" C or F */ if (ma[jj] > -1) { /* if a candidate, remove jj from graph */ if (ma[jj] > 0) { hypre_GraphRemove(list, head, tail, jj); } /* make jj an F point and mark "decided" */ cf[jj] = fpt; ma[jj] = -1; for (jl = A_i[jj]; jl < A_i[jj + 1]; jl++) { index = A_j[jl]; /* if a candidate, increase ma */ if (ma[index] > 0) { ma[index]++; /* move index in graph */ hypre_GraphRemove(list, head, tail, index); hypre_GraphAdd(list, head, tail, index, (HYPRE_Int) ma[index]); if (ma[index] > istack) { istack = (HYPRE_Int) ma[index]; } } } } } /* reset istack to point to biggest non-empty stack */ for ( ; istack > 0; istack--) { /* if non-negative, break */ if (head[-istack] > -1) { break; } } } hypre_TFree(ma, HYPRE_MEMORY_HOST); hypre_TFree(list, HYPRE_MEMORY_HOST); hypre_TFree(head_mem, HYPRE_MEMORY_HOST); hypre_TFree(tail_mem, HYPRE_MEMORY_HOST); return hypre_error_flag; } /* f point jac cr */ HYPRE_Int hypre_fptjaccr(HYPRE_Int *cf, HYPRE_Int *A_i, HYPRE_Int *A_j, HYPRE_Real *A_data, HYPRE_Int n, HYPRE_Real *e0, HYPRE_Real omega, HYPRE_Real *e1) { HYPRE_Int i, j; HYPRE_Real res; for (i = 0; i < n; i++) if (cf[i] == fpt) { e0[i] = e1[i]; } for (i = 0; i < n; i++) { res = 0.0e0; if (cf[i] == fpt) { for (j = A_i[i] + 1; j < A_i[i + 1]; j++) { if (cf[A_j[j]] == fpt) { res -= (A_data[j] * e0[A_j[j]]); } } e1[i] *= (1.0 - omega); e1[i] += omega * res / A_data[A_i[i]]; } } return hypre_error_flag; } /* f point GS cr */ HYPRE_Int hypre_fptgscr(HYPRE_Int *cf, HYPRE_Int *A_i, HYPRE_Int *A_j, HYPRE_Real *A_data, HYPRE_Int n, HYPRE_Real *e0, HYPRE_Real *e1) { HYPRE_Int i, j; HYPRE_Real res; for (i = 0; i < n; i++) if (cf[i] == fpt) { e0[i] = e1[i]; } for (i = 0; i < n; i++) { if (cf[i] == fpt) { res = 0.0e0; for ( j = A_i[i] + 1; j < A_i[i + 1]; j++) { if (cf[A_j[j]] == fpt) { res -= (A_data[j] * e1[A_j[j]]); } } e1[i] = res / A_data[A_i[i]]; } } return hypre_error_flag; } /* form the candidate set U */ HYPRE_Int hypre_formu(HYPRE_Int *cf, HYPRE_Int n, HYPRE_Real *e1, HYPRE_Int *A_i, HYPRE_Real rho) { HYPRE_Int i; HYPRE_Real candmeas = 0.0e0, max = 0.0e0; HYPRE_Real thresh = 1 - rho; for (i = 0; i < n; i++) if (hypre_abs(e1[i]) > max) { max = hypre_abs(e1[i]); } for (i = 0; i < n; i++) { if (cf[i] == fpt) { candmeas = hypre_pow(hypre_abs(e1[i]), 1.0) / max; if (candmeas > thresh && A_i[i + 1] - A_i[i] > 1) { cf[i] = cand; } } } return hypre_error_flag; } /*========================================================================== * Ruge's coarsening algorithm *==========================================================================*/ #define C_PT 1 #define F_PT -1 #define Z_PT -2 #define SF_PT -3 /* special fine points */ #define UNDECIDED 0 /************************************************************** * * Ruge Coarsening routine * **************************************************************/ HYPRE_Int hypre_BoomerAMGIndepRS( hypre_ParCSRMatrix *S, HYPRE_Int measure_type, HYPRE_Int debug_flag, HYPRE_Int *CF_marker) { MPI_Comm comm = hypre_ParCSRMatrixComm(S); hypre_ParCSRCommPkg *comm_pkg = hypre_ParCSRMatrixCommPkg(S); hypre_CSRMatrix *S_diag = hypre_ParCSRMatrixDiag(S); hypre_CSRMatrix *S_offd = hypre_ParCSRMatrixOffd(S); HYPRE_Int *S_i = hypre_CSRMatrixI(S_diag); HYPRE_Int *S_j = hypre_CSRMatrixJ(S_diag); HYPRE_Int *S_offd_i = hypre_CSRMatrixI(S_offd); HYPRE_Int *S_offd_j = NULL; HYPRE_Int num_variables = hypre_CSRMatrixNumRows(S_diag); HYPRE_Int num_cols_offd = hypre_CSRMatrixNumCols(S_offd); hypre_ParCSRCommHandle *comm_handle; hypre_CSRMatrix *ST; HYPRE_Int *ST_i; HYPRE_Int *ST_j; HYPRE_Int *measure_array; HYPRE_Int *CF_marker_offd; HYPRE_Int *int_buf_data; HYPRE_Int i, j, k, jS; HYPRE_Int index; HYPRE_Int num_procs, my_id; HYPRE_Int num_sends = 0; HYPRE_Int start, jrow; hypre_LinkList LoL_head; hypre_LinkList LoL_tail; HYPRE_Int *lists, *where; HYPRE_Int measure, new_meas; HYPRE_Int num_left = 0; HYPRE_Int nabor, nabor_two; HYPRE_Int f_pnt = F_PT; HYPRE_Real wall_time; /*------------------------------------------------------- * Initialize the C/F marker, LoL_head, LoL_tail arrays *-------------------------------------------------------*/ LoL_head = NULL; LoL_tail = NULL; lists = hypre_CTAlloc(HYPRE_Int, num_variables, HYPRE_MEMORY_HOST); where = hypre_CTAlloc(HYPRE_Int, num_variables, HYPRE_MEMORY_HOST); #if 0 /* debugging */ char filename[256]; FILE *fp; HYPRE_Int iter = 0; #endif /*-------------------------------------------------------------- * Compute a CSR strength matrix, S. * * For now, the "strength" of dependence/influence is defined in * the following way: i depends on j if * aij > hypre_max (k != i) aik, aii < 0 * or * aij < hypre_min (k != i) aik, aii >= 0 * Then S_ij = 1, else S_ij = 0. * * NOTE: the entries are negative initially, corresponding * to "unaccounted-for" dependence. *----------------------------------------------------------------*/ if (debug_flag == 3) { wall_time = time_getWallclockSeconds(); } hypre_MPI_Comm_size(comm, &num_procs); hypre_MPI_Comm_rank(comm, &my_id); if (!comm_pkg) { comm_pkg = hypre_ParCSRMatrixCommPkg(S); } if (!comm_pkg) { hypre_MatvecCommPkgCreate(S); comm_pkg = hypre_ParCSRMatrixCommPkg(S); } num_sends = hypre_ParCSRCommPkgNumSends(comm_pkg); if (num_cols_offd) { S_offd_j = hypre_CSRMatrixJ(S_offd); } jS = S_i[num_variables]; ST = hypre_CSRMatrixCreate(num_variables, num_variables, jS); ST_i = hypre_CTAlloc(HYPRE_Int, num_variables + 1, HYPRE_MEMORY_HOST); ST_j = hypre_CTAlloc(HYPRE_Int, jS, HYPRE_MEMORY_HOST); hypre_CSRMatrixI(ST) = ST_i; hypre_CSRMatrixJ(ST) = ST_j; /*---------------------------------------------------------- * generate transpose of S, ST *----------------------------------------------------------*/ for (i = 0; i <= num_variables; i++) { ST_i[i] = 0; } for (i = 0; i < jS; i++) { ST_i[S_j[i] + 1]++; } for (i = 0; i < num_variables; i++) { ST_i[i + 1] += ST_i[i]; } for (i = 0; i < num_variables; i++) { for (j = S_i[i]; j < S_i[i + 1]; j++) { index = S_j[j]; ST_j[ST_i[index]] = i; ST_i[index]++; } } for (i = num_variables; i > 0; i--) { ST_i[i] = ST_i[i - 1]; } ST_i[0] = 0; /*---------------------------------------------------------- * Compute the measures * * The measures are given by the row sums of ST. * Hence, measure_array[i] is the number of influences * of variable i. * correct actual measures through adding influences from * neighbor processors *----------------------------------------------------------*/ if (measure_type == 0) { measure_array = hypre_CTAlloc(HYPRE_Int, num_variables, HYPRE_MEMORY_HOST); for (i = 0; i < num_variables; i++) { measure_array[i] = 0; } for (i = 0; i < num_variables; i++) { if (CF_marker[i] < 1) { for (j = S_i[i]; j < S_i[i + 1]; j++) { if (CF_marker[S_j[j]] < 1) { measure_array[S_j[j]]++; } } } } } else { /* now the off-diagonal part of CF_marker */ if (num_cols_offd) { CF_marker_offd = hypre_CTAlloc(HYPRE_Int, num_cols_offd, HYPRE_MEMORY_HOST); } else { CF_marker_offd = NULL; } for (i = 0; i < num_cols_offd; i++) { CF_marker_offd[i] = 0; } /*------------------------------------------------ * Communicate the CF_marker values to the external nodes *------------------------------------------------*/ int_buf_data = hypre_CTAlloc(HYPRE_Int, hypre_ParCSRCommPkgSendMapStart(comm_pkg, num_sends), HYPRE_MEMORY_HOST); index = 0; for (i = 0; i < num_sends; i++) { start = hypre_ParCSRCommPkgSendMapStart(comm_pkg, i); for (j = start; j < hypre_ParCSRCommPkgSendMapStart(comm_pkg, i + 1); j++) { jrow = hypre_ParCSRCommPkgSendMapElmt(comm_pkg, j); int_buf_data[index++] = CF_marker[jrow]; } } if (num_procs > 1) { comm_handle = hypre_ParCSRCommHandleCreate(11, comm_pkg, int_buf_data, CF_marker_offd); hypre_ParCSRCommHandleDestroy(comm_handle); } measure_array = hypre_CTAlloc(HYPRE_Int, num_variables + num_cols_offd, HYPRE_MEMORY_HOST); for (i = 0; i < num_variables + num_cols_offd; i++) { measure_array[i] = 0; } for (i = 0; i < num_variables; i++) { if (CF_marker[i] < 1) { for (j = S_i[i]; j < S_i[i + 1]; j++) { if (CF_marker[S_j[j]] < 1) { measure_array[S_j[j]]++; } } for (j = S_offd_i[i]; j < S_offd_i[i + 1]; j++) { if (CF_marker_offd[S_offd_j[j]] < 1) { measure_array[num_variables + S_offd_j[j]]++; } } } } hypre_TFree(CF_marker_offd, HYPRE_MEMORY_HOST); /* now send those locally calculated values for the external nodes to the neighboring processors */ if (num_procs > 1) comm_handle = hypre_ParCSRCommHandleCreate(12, comm_pkg, &measure_array[num_variables], int_buf_data); /* finish the communication */ if (num_procs > 1) { hypre_ParCSRCommHandleDestroy(comm_handle); } /* now add the externally calculated part of the local nodes to the local nodes */ index = 0; for (i = 0; i < num_sends; i++) { start = hypre_ParCSRCommPkgSendMapStart(comm_pkg, i); for (j = start; j < hypre_ParCSRCommPkgSendMapStart(comm_pkg, i + 1); j++) measure_array[hypre_ParCSRCommPkgSendMapElmt(comm_pkg, j)] += int_buf_data[index++]; } hypre_TFree(int_buf_data, HYPRE_MEMORY_HOST); } if (measure_type == 2 && num_procs > 1) { for (i = 0; i < num_variables; i++) { if (CF_marker[i] == 0) { if ((S_offd_i[i + 1] - S_offd_i[i]) == 0) { num_left++; } else { measure_array[i] = 0; CF_marker[i] = 2; } } else if (CF_marker[i] < 0) { measure_array[i] = 0; } else { measure_array[i] = -1; } } } else { for (i = 0; i < num_variables; i++) { if (CF_marker[i] == 0) { num_left++; } else if (CF_marker[i] < 0) { measure_array[i] = 0; } else { measure_array[i] = -1; } } } /*--------------------------------------------------- * Loop until all points are either fine or coarse. *---------------------------------------------------*/ if (debug_flag == 3) { wall_time = time_getWallclockSeconds(); } /* first coarsening phase */ /************************************************************* * * Initialize the lists * *************************************************************/ for (j = 0; j < num_variables; j++) { measure = measure_array[j]; if (CF_marker[j] == 0) { if (measure > 0) { hypre_enter_on_lists(&LoL_head, &LoL_tail, measure, j, lists, where); } else { if (measure < 0) { hypre_printf("negative measure!\n"); } CF_marker[j] = f_pnt; for (k = S_i[j]; k < S_i[j + 1]; k++) { nabor = S_j[k]; if (CF_marker[nabor] != SF_PT && CF_marker[nabor] < 1) { if (nabor < j) { new_meas = measure_array[nabor]; if (new_meas > 0) hypre_remove_point(&LoL_head, &LoL_tail, new_meas, nabor, lists, where); new_meas = ++(measure_array[nabor]); hypre_enter_on_lists(&LoL_head, &LoL_tail, new_meas, nabor, lists, where); } else { new_meas = ++(measure_array[nabor]); } } } --num_left; } } } /**************************************************************** * * Main loop of Ruge-Stueben first coloring pass. * * WHILE there are still points to classify DO: * 1) find first point, i, on list with max_measure * make i a C-point, remove it from the lists * 2) For each point, j, in S_i^T, * a) Set j to be an F-point * b) For each point, k, in S_j * move k to the list in LoL with measure one * greater than it occupies (creating new LoL * entry if necessary) * 3) For each point, j, in S_i, * move j to the list in LoL with measure one * smaller than it occupies (creating new LoL * entry if necessary) * ****************************************************************/ while (num_left > 0) { index = LoL_head -> head; CF_marker[index] = C_PT; measure = measure_array[index]; measure_array[index] = 0; --num_left; hypre_remove_point(&LoL_head, &LoL_tail, measure, index, lists, where); for (j = ST_i[index]; j < ST_i[index + 1]; j++) { nabor = ST_j[j]; if (CF_marker[nabor] == UNDECIDED) { CF_marker[nabor] = F_PT; measure = measure_array[nabor]; hypre_remove_point(&LoL_head, &LoL_tail, measure, nabor, lists, where); --num_left; for (k = S_i[nabor] + 1; k < S_i[nabor + 1]; k++) { nabor_two = S_j[k]; if (CF_marker[nabor_two] == UNDECIDED) { measure = measure_array[nabor_two]; hypre_remove_point(&LoL_head, &LoL_tail, measure, nabor_two, lists, where); new_meas = ++(measure_array[nabor_two]); hypre_enter_on_lists(&LoL_head, &LoL_tail, new_meas, nabor_two, lists, where); } } } } for (j = S_i[index]; j < S_i[index + 1]; j++) { nabor = S_j[j]; if (CF_marker[nabor] == UNDECIDED) { measure = measure_array[nabor]; hypre_remove_point(&LoL_head, &LoL_tail, measure, nabor, lists, where); measure_array[nabor] = --measure; if (measure > 0) hypre_enter_on_lists(&LoL_head, &LoL_tail, measure, nabor, lists, where); else { CF_marker[nabor] = F_PT; --num_left; for (k = S_i[nabor] + 1; k < S_i[nabor + 1]; k++) { nabor_two = S_j[k]; if (CF_marker[nabor_two] == UNDECIDED) { new_meas = measure_array[nabor_two]; hypre_remove_point(&LoL_head, &LoL_tail, new_meas, nabor_two, lists, where); new_meas = ++(measure_array[nabor_two]); hypre_enter_on_lists(&LoL_head, &LoL_tail, new_meas, nabor_two, lists, where); } } } } } } hypre_TFree(measure_array, HYPRE_MEMORY_HOST); hypre_CSRMatrixDestroy(ST); if (debug_flag == 3) { wall_time = time_getWallclockSeconds() - wall_time; hypre_printf("Proc = %d Coarsen 1st pass = %f\n", my_id, wall_time); } if (measure_type == 2) { for (i = 0; i < num_variables; i++) if (CF_marker[i] == 2) { CF_marker[i] = 0; } } hypre_TFree(lists, HYPRE_MEMORY_HOST); hypre_TFree(where, HYPRE_MEMORY_HOST); hypre_TFree(LoL_head, HYPRE_MEMORY_HOST); hypre_TFree(LoL_tail, HYPRE_MEMORY_HOST); return hypre_error_flag; } /************************************************************** * * Ruge Coarsening routine * **************************************************************/ HYPRE_Int hypre_BoomerAMGIndepRSa( hypre_ParCSRMatrix *S, HYPRE_Int measure_type, HYPRE_Int debug_flag, HYPRE_Int *CF_marker) { MPI_Comm comm = hypre_ParCSRMatrixComm(S); hypre_ParCSRCommPkg *comm_pkg = hypre_ParCSRMatrixCommPkg(S); hypre_CSRMatrix *S_diag = hypre_ParCSRMatrixDiag(S); hypre_CSRMatrix *S_offd = hypre_ParCSRMatrixOffd(S); HYPRE_Int *S_i = hypre_CSRMatrixI(S_diag); HYPRE_Int *S_j = hypre_CSRMatrixJ(S_diag); HYPRE_Int *S_offd_i = hypre_CSRMatrixI(S_offd); HYPRE_Int *S_offd_j = NULL; HYPRE_Int num_variables = hypre_CSRMatrixNumRows(S_diag); HYPRE_Int num_cols_offd = hypre_CSRMatrixNumCols(S_offd); hypre_ParCSRCommHandle *comm_handle; hypre_CSRMatrix *ST; HYPRE_Int *ST_i; HYPRE_Int *ST_j; HYPRE_Int *measure_array; HYPRE_Int *CF_marker_offd; HYPRE_Int *int_buf_data; HYPRE_Int i, j, k, jS; HYPRE_Int index; HYPRE_Int num_procs, my_id; HYPRE_Int num_sends = 0; HYPRE_Int start, jrow; hypre_LinkList LoL_head; hypre_LinkList LoL_tail; HYPRE_Int *lists, *where; HYPRE_Int measure, new_meas; HYPRE_Int num_left = 0; HYPRE_Int nabor, nabor_two; HYPRE_Int f_pnt = F_PT; HYPRE_Real wall_time; /*------------------------------------------------------- * Initialize the C/F marker, LoL_head, LoL_tail arrays *-------------------------------------------------------*/ LoL_head = NULL; LoL_tail = NULL; lists = hypre_CTAlloc(HYPRE_Int, num_variables, HYPRE_MEMORY_HOST); where = hypre_CTAlloc(HYPRE_Int, num_variables, HYPRE_MEMORY_HOST); #if 0 /* debugging */ char filename[256]; FILE *fp; HYPRE_Int iter = 0; #endif /*-------------------------------------------------------------- * Compute a CSR strength matrix, S. * * For now, the "strength" of dependence/influence is defined in * the following way: i depends on j if * aij > hypre_max (k != i) aik, aii < 0 * or * aij < hypre_min (k != i) aik, aii >= 0 * Then S_ij = 1, else S_ij = 0. * * NOTE: the entries are negative initially, corresponding * to "unaccounted-for" dependence. *----------------------------------------------------------------*/ if (debug_flag == 3) { wall_time = time_getWallclockSeconds(); } hypre_MPI_Comm_size(comm, &num_procs); hypre_MPI_Comm_rank(comm, &my_id); if (!comm_pkg) { comm_pkg = hypre_ParCSRMatrixCommPkg(S); } if (!comm_pkg) { hypre_MatvecCommPkgCreate(S); comm_pkg = hypre_ParCSRMatrixCommPkg(S); } num_sends = hypre_ParCSRCommPkgNumSends(comm_pkg); if (num_cols_offd) { S_offd_j = hypre_CSRMatrixJ(S_offd); } jS = S_i[num_variables]; ST = hypre_CSRMatrixCreate(num_variables, num_variables, jS); ST_i = hypre_CTAlloc(HYPRE_Int, num_variables + 1, HYPRE_MEMORY_HOST); ST_j = hypre_CTAlloc(HYPRE_Int, jS, HYPRE_MEMORY_HOST); hypre_CSRMatrixI(ST) = ST_i; hypre_CSRMatrixJ(ST) = ST_j; /*---------------------------------------------------------- * generate transpose of S, ST *----------------------------------------------------------*/ for (i = 0; i <= num_variables; i++) { ST_i[i] = 0; } for (i = 0; i < jS; i++) { ST_i[S_j[i] + 1]++; } for (i = 0; i < num_variables; i++) { ST_i[i + 1] += ST_i[i]; } for (i = 0; i < num_variables; i++) { for (j = S_i[i]; j < S_i[i + 1]; j++) { index = S_j[j]; ST_j[ST_i[index]] = i; ST_i[index]++; } } for (i = num_variables; i > 0; i--) { ST_i[i] = ST_i[i - 1]; } ST_i[0] = 0; /*---------------------------------------------------------- * Compute the measures * * The measures are given by the row sums of ST. * Hence, measure_array[i] is the number of influences * of variable i. * correct actual measures through adding influences from * neighbor processors *----------------------------------------------------------*/ if (measure_type == 0) { measure_array = hypre_CTAlloc(HYPRE_Int, num_variables, HYPRE_MEMORY_HOST); for (i = 0; i < num_variables; i++) { measure_array[i] = 0; } for (i = 0; i < num_variables; i++) { if (CF_marker[i] < 1) { for (j = S_i[i] + 1; j < S_i[i + 1]; j++) { if (CF_marker[S_j[j]] < 1) { measure_array[S_j[j]]++; } } } } } else { /* now the off-diagonal part of CF_marker */ if (num_cols_offd) { CF_marker_offd = hypre_CTAlloc(HYPRE_Int, num_cols_offd, HYPRE_MEMORY_HOST); } else { CF_marker_offd = NULL; } for (i = 0; i < num_cols_offd; i++) { CF_marker_offd[i] = 0; } /*------------------------------------------------ * Communicate the CF_marker values to the external nodes *------------------------------------------------*/ int_buf_data = hypre_CTAlloc(HYPRE_Int, hypre_ParCSRCommPkgSendMapStart(comm_pkg, num_sends), HYPRE_MEMORY_HOST); index = 0; for (i = 0; i < num_sends; i++) { start = hypre_ParCSRCommPkgSendMapStart(comm_pkg, i); for (j = start; j < hypre_ParCSRCommPkgSendMapStart(comm_pkg, i + 1); j++) { jrow = hypre_ParCSRCommPkgSendMapElmt(comm_pkg, j); int_buf_data[index++] = CF_marker[jrow]; } } if (num_procs > 1) { comm_handle = hypre_ParCSRCommHandleCreate(11, comm_pkg, int_buf_data, CF_marker_offd); hypre_ParCSRCommHandleDestroy(comm_handle); } measure_array = hypre_CTAlloc(HYPRE_Int, num_variables + num_cols_offd, HYPRE_MEMORY_HOST); for (i = 0; i < num_variables + num_cols_offd; i++) { measure_array[i] = 0; } for (i = 0; i < num_variables; i++) { if (CF_marker[i] < 1) { for (j = S_i[i] + 1; j < S_i[i + 1]; j++) { if (CF_marker[S_j[j]] < 1) { measure_array[S_j[j]]++; } } for (j = S_offd_i[i]; j < S_offd_i[i + 1]; j++) { if (CF_marker_offd[S_offd_j[j]] < 1) { measure_array[num_variables + S_offd_j[j]]++; } } } } hypre_TFree(CF_marker_offd, HYPRE_MEMORY_HOST); /* now send those locally calculated values for the external nodes to the neighboring processors */ if (num_procs > 1) comm_handle = hypre_ParCSRCommHandleCreate(12, comm_pkg, &measure_array[num_variables], int_buf_data); /* finish the communication */ if (num_procs > 1) { hypre_ParCSRCommHandleDestroy(comm_handle); } /* now add the externally calculated part of the local nodes to the local nodes */ index = 0; for (i = 0; i < num_sends; i++) { start = hypre_ParCSRCommPkgSendMapStart(comm_pkg, i); for (j = start; j < hypre_ParCSRCommPkgSendMapStart(comm_pkg, i + 1); j++) measure_array[hypre_ParCSRCommPkgSendMapElmt(comm_pkg, j)] += int_buf_data[index++]; } hypre_TFree(int_buf_data, HYPRE_MEMORY_HOST); } if (measure_type == 2 && num_procs > 1) { for (i = 0; i < num_variables; i++) { if (CF_marker[i] == 0) { if ((S_offd_i[i + 1] - S_offd_i[i]) == 0) { num_left++; } else { measure_array[i] = 0; CF_marker[i] = 2; } } else if (CF_marker[i] < 0) { measure_array[i] = 0; } else { measure_array[i] = -1; } } } else { for (i = 0; i < num_variables; i++) { if (CF_marker[i] == 0) { num_left++; } else if (CF_marker[i] < 0) { measure_array[i] = 0; } else { measure_array[i] = -1; } } } /*--------------------------------------------------- * Loop until all points are either fine or coarse. *---------------------------------------------------*/ if (debug_flag == 3) { wall_time = time_getWallclockSeconds(); } /* first coarsening phase */ /************************************************************* * * Initialize the lists * *************************************************************/ for (j = 0; j < num_variables; j++) { measure = measure_array[j]; if (CF_marker[j] == 0) { if (measure > 0) { hypre_enter_on_lists(&LoL_head, &LoL_tail, measure, j, lists, where); } else { if (measure < 0) { hypre_printf("negative measure!\n"); } CF_marker[j] = f_pnt; for (k = S_i[j] + 1; k < S_i[j + 1]; k++) { nabor = S_j[k]; if (CF_marker[nabor] != SF_PT && CF_marker[nabor] < 1) { if (nabor < j) { new_meas = measure_array[nabor]; if (new_meas > 0) hypre_remove_point(&LoL_head, &LoL_tail, new_meas, nabor, lists, where); new_meas = ++(measure_array[nabor]); hypre_enter_on_lists(&LoL_head, &LoL_tail, new_meas, nabor, lists, where); } else { new_meas = ++(measure_array[nabor]); } } } --num_left; } } } /**************************************************************** * * Main loop of Ruge-Stueben first coloring pass. * * WHILE there are still points to classify DO: * 1) find first point, i, on list with max_measure * make i a C-point, remove it from the lists * 2) For each point, j, in S_i^T, * a) Set j to be an F-point * b) For each point, k, in S_j * move k to the list in LoL with measure one * greater than it occupies (creating new LoL * entry if necessary) * 3) For each point, j, in S_i, * move j to the list in LoL with measure one * smaller than it occupies (creating new LoL * entry if necessary) * ****************************************************************/ while (num_left > 0) { index = LoL_head -> head; CF_marker[index] = C_PT; measure = measure_array[index]; measure_array[index] = 0; --num_left; hypre_remove_point(&LoL_head, &LoL_tail, measure, index, lists, where); for (j = ST_i[index] + 1; j < ST_i[index + 1]; j++) { nabor = ST_j[j]; if (CF_marker[nabor] == UNDECIDED) { CF_marker[nabor] = F_PT; measure = measure_array[nabor]; hypre_remove_point(&LoL_head, &LoL_tail, measure, nabor, lists, where); --num_left; for (k = S_i[nabor] + 1; k < S_i[nabor + 1]; k++) { nabor_two = S_j[k]; if (CF_marker[nabor_two] == UNDECIDED) { measure = measure_array[nabor_two]; hypre_remove_point(&LoL_head, &LoL_tail, measure, nabor_two, lists, where); new_meas = ++(measure_array[nabor_two]); hypre_enter_on_lists(&LoL_head, &LoL_tail, new_meas, nabor_two, lists, where); } } } } for (j = S_i[index] + 1; j < S_i[index + 1]; j++) { nabor = S_j[j]; if (CF_marker[nabor] == UNDECIDED) { measure = measure_array[nabor]; hypre_remove_point(&LoL_head, &LoL_tail, measure, nabor, lists, where); measure_array[nabor] = --measure; if (measure > 0) hypre_enter_on_lists(&LoL_head, &LoL_tail, measure, nabor, lists, where); else { CF_marker[nabor] = F_PT; --num_left; for (k = S_i[nabor] + 1; k < S_i[nabor + 1]; k++) { nabor_two = S_j[k]; if (CF_marker[nabor_two] == UNDECIDED) { new_meas = measure_array[nabor_two]; hypre_remove_point(&LoL_head, &LoL_tail, new_meas, nabor_two, lists, where); new_meas = ++(measure_array[nabor_two]); hypre_enter_on_lists(&LoL_head, &LoL_tail, new_meas, nabor_two, lists, where); } } } } } } hypre_TFree(measure_array, HYPRE_MEMORY_HOST); hypre_CSRMatrixDestroy(ST); if (debug_flag == 3) { wall_time = time_getWallclockSeconds() - wall_time; hypre_printf("Proc = %d Coarsen 1st pass = %f\n", my_id, wall_time); } if (measure_type == 2) { for (i = 0; i < num_variables; i++) if (CF_marker[i] == 2) { CF_marker[i] = 0; } } hypre_TFree(lists, HYPRE_MEMORY_HOST); hypre_TFree(where, HYPRE_MEMORY_HOST); hypre_TFree(LoL_head, HYPRE_MEMORY_HOST); hypre_TFree(LoL_tail, HYPRE_MEMORY_HOST); return hypre_error_flag; } HYPRE_Int hypre_BoomerAMGIndepHMIS( hypre_ParCSRMatrix *S, HYPRE_Int measure_type, HYPRE_Int debug_flag, HYPRE_Int *CF_marker) { HYPRE_UNUSED_VAR(measure_type); HYPRE_Int num_procs; MPI_Comm comm = hypre_ParCSRMatrixComm(S); hypre_MPI_Comm_size(comm, &num_procs); /*------------------------------------------------------- * Perform Ruge coarsening followed by CLJP coarsening *-------------------------------------------------------*/ hypre_BoomerAMGIndepRS(S, 2, debug_flag, CF_marker); if (num_procs > 1) { hypre_BoomerAMGIndepPMIS(S, 0, debug_flag, CF_marker); } return hypre_error_flag; } HYPRE_Int hypre_BoomerAMGIndepHMISa( hypre_ParCSRMatrix *S, HYPRE_Int measure_type, HYPRE_Int debug_flag, HYPRE_Int *CF_marker) { HYPRE_UNUSED_VAR(measure_type); HYPRE_Int num_procs; MPI_Comm comm = hypre_ParCSRMatrixComm(S); hypre_MPI_Comm_size(comm, &num_procs); /*------------------------------------------------------- * Perform Ruge coarsening followed by CLJP coarsening *-------------------------------------------------------*/ hypre_BoomerAMGIndepRSa(S, 2, debug_flag, CF_marker); if (num_procs > 1) { hypre_BoomerAMGIndepPMISa(S, 0, debug_flag, CF_marker); } return hypre_error_flag; } /*--------------------------------------------------------------------------*/ #define C_PT 1 #define F_PT -1 #define SF_PT -3 #define COMMON_C_PT 2 #define Z_PT -2 /* begin HANS added */ /************************************************************** * * Modified Independent Set Coarsening routine * (don't worry about strong F-F connections * without a common C point) * **************************************************************/ HYPRE_Int hypre_BoomerAMGIndepPMIS( hypre_ParCSRMatrix *S, HYPRE_Int CF_init, HYPRE_Int debug_flag, HYPRE_Int *CF_marker) { MPI_Comm comm = hypre_ParCSRMatrixComm(S); hypre_ParCSRCommPkg *comm_pkg = hypre_ParCSRMatrixCommPkg(S); hypre_ParCSRCommHandle *comm_handle; hypre_CSRMatrix *S_diag = hypre_ParCSRMatrixDiag(S); HYPRE_Int *S_diag_i = hypre_CSRMatrixI(S_diag); HYPRE_Int *S_diag_j = hypre_CSRMatrixJ(S_diag); hypre_CSRMatrix *S_offd = hypre_ParCSRMatrixOffd(S); HYPRE_Int *S_offd_i = hypre_CSRMatrixI(S_offd); HYPRE_Int *S_offd_j = NULL; HYPRE_Int num_variables = hypre_CSRMatrixNumRows(S_diag); HYPRE_Int num_cols_offd = 0; HYPRE_Int num_sends = 0; HYPRE_Int *int_buf_data; HYPRE_Real *buf_data; HYPRE_Int *CF_marker_offd; HYPRE_Real *measure_array; HYPRE_Int *graph_array; HYPRE_Int *graph_array_offd; HYPRE_Int graph_size; HYPRE_Int graph_offd_size; HYPRE_BigInt global_graph_size; HYPRE_Int i, j, jj, jS, ig; HYPRE_Int index, start, my_id, num_procs, jrow, cnt, elmt; HYPRE_Real wall_time; #if 0 /* debugging */ char filename[256]; FILE *fp; HYPRE_Int iter = 0; #endif /******************************************************************************* BEFORE THE INDEPENDENT SET COARSENING LOOP: measure_array: calculate the measures, and communicate them (this array contains measures for both local and external nodes) CF_marker, CF_marker_offd: initialize CF_marker (separate arrays for local and external; 0=unassigned, negative=F point, positive=C point) ******************************************************************************/ /*-------------------------------------------------------------- * Use the ParCSR strength matrix, S. * * For now, the "strength" of dependence/influence is defined in * the following way: i depends on j if * aij > hypre_max (k != i) aik, aii < 0 * or * aij < hypre_min (k != i) aik, aii >= 0 * Then S_ij = 1, else S_ij = 0. * * NOTE: S_data is not used; in stead, only strong columns are retained * in S_j, which can then be used like S_data *----------------------------------------------------------------*/ /*S_ext = NULL; */ if (debug_flag == 3) { wall_time = time_getWallclockSeconds(); } hypre_MPI_Comm_size(comm, &num_procs); hypre_MPI_Comm_rank(comm, &my_id); if (!comm_pkg) { comm_pkg = hypre_ParCSRMatrixCommPkg(S); } if (!comm_pkg) { hypre_MatvecCommPkgCreate(S); comm_pkg = hypre_ParCSRMatrixCommPkg(S); } num_sends = hypre_ParCSRCommPkgNumSends(comm_pkg); int_buf_data = hypre_CTAlloc(HYPRE_Int, hypre_ParCSRCommPkgSendMapStart(comm_pkg, num_sends), HYPRE_MEMORY_HOST); buf_data = hypre_CTAlloc(HYPRE_Real, hypre_ParCSRCommPkgSendMapStart(comm_pkg, num_sends), HYPRE_MEMORY_HOST); num_cols_offd = hypre_CSRMatrixNumCols(S_offd); S_diag_j = hypre_CSRMatrixJ(S_diag); if (num_cols_offd) { S_offd_j = hypre_CSRMatrixJ(S_offd); } /* now the off-diagonal part of CF_marker */ if (num_cols_offd) { CF_marker_offd = hypre_CTAlloc(HYPRE_Int, num_cols_offd, HYPRE_MEMORY_HOST); } else { CF_marker_offd = NULL; } for (i = 0; i < num_cols_offd; i++) { CF_marker_offd[i] = 0; } /*------------------------------------------------ * Communicate the CF_marker values to the external nodes *------------------------------------------------*/ index = 0; for (i = 0; i < num_sends; i++) { start = hypre_ParCSRCommPkgSendMapStart(comm_pkg, i); for (j = start; j < hypre_ParCSRCommPkgSendMapStart(comm_pkg, i + 1); j++) { jrow = hypre_ParCSRCommPkgSendMapElmt(comm_pkg, j); int_buf_data[index++] = CF_marker[jrow]; } } if (num_procs > 1) { comm_handle = hypre_ParCSRCommHandleCreate(11, comm_pkg, int_buf_data, CF_marker_offd); hypre_ParCSRCommHandleDestroy(comm_handle); } /*---------------------------------------------------------- * Compute the measures * * The measures are currently given by the column sums of S. * Hence, measure_array[i] is the number of influences * of variable i. * * The measures are augmented by a random number * between 0 and 1. *----------------------------------------------------------*/ measure_array = hypre_CTAlloc(HYPRE_Real, num_variables + num_cols_offd, HYPRE_MEMORY_HOST); for (i = 0; i < num_variables + num_cols_offd; i++) { measure_array[i] = 0; } /* calculate the local part for the local nodes */ for (i = 0; i < num_variables; i++) { if (CF_marker[i] < 1) { for (j = S_diag_i[i]; j < S_diag_i[i + 1]; j++) { if (CF_marker[S_diag_j[j]] < 1) { measure_array[S_diag_j[j]] += 1.0; } } for (j = S_offd_i[i]; j < S_offd_i[i + 1]; j++) { if (CF_marker_offd[S_offd_j[j]] < 1) { measure_array[num_variables + S_offd_j[j]] += 1.0; } } } } /* now send those locally calculated values for the external nodes to the neighboring processors */ if (num_procs > 1) comm_handle = hypre_ParCSRCommHandleCreate(2, comm_pkg, &measure_array[num_variables], buf_data); /* finish the communication */ if (num_procs > 1) { hypre_ParCSRCommHandleDestroy(comm_handle); } /* now add the externally calculated part of the local nodes to the local nodes */ index = 0; for (i = 0; i < num_sends; i++) { start = hypre_ParCSRCommPkgSendMapStart(comm_pkg, i); for (j = start; j < hypre_ParCSRCommPkgSendMapStart(comm_pkg, i + 1); j++) measure_array[hypre_ParCSRCommPkgSendMapElmt(comm_pkg, j)] += buf_data[index++]; } /* set the measures of the external nodes to zero */ for (i = num_variables; i < num_variables + num_cols_offd; i++) { measure_array[i] = 0; } /* this augments the measures with a random number between 0 and 1 */ /* (only for the local part) */ /* this augments the measures */ i = 2747 + my_id; hypre_SeedRand(i); for (i = 0; i < num_variables; i++) { measure_array[i] += hypre_Rand(); } /*--------------------------------------------------- * Initialize the graph arrays, and CF_marker arrays *---------------------------------------------------*/ /* first the off-diagonal part of the graph array */ if (num_cols_offd) { graph_array_offd = hypre_CTAlloc(HYPRE_Int, num_cols_offd, HYPRE_MEMORY_HOST); } else { graph_array_offd = NULL; } for (ig = 0; ig < num_cols_offd; ig++) { graph_array_offd[ig] = ig; } graph_offd_size = num_cols_offd; /* now the local part of the graph array, and the local CF_marker array */ graph_array = hypre_CTAlloc(HYPRE_Int, num_variables, HYPRE_MEMORY_HOST); if (CF_init == 1) { cnt = 0; for (i = 0; i < num_variables; i++) { if ( (S_offd_i[i + 1] - S_offd_i[i]) > 0 || CF_marker[i] == -1) { CF_marker[i] = 0; } if (CF_marker[i] == SF_PT) { measure_array[i] = 0; } else if ( CF_marker[i] < 1) { if (measure_array[i] >= 1.0 ) { CF_marker[i] = 0; graph_array[cnt++] = i; } else { CF_marker[i] = F_PT; measure_array[i] = 0; } } else { measure_array[i] = 0; } } } else { cnt = 0; for (i = 0; i < num_variables; i++) { if (CF_marker[i] == 0) { if ( measure_array[i] >= 1.0 ) { graph_array[cnt++] = i; } else { CF_marker[i] = F_PT; } } else { measure_array[i] = 0; } } } graph_size = cnt; /*------------------------------------------------ * Communicate the local measures, which are complete, to the external nodes *------------------------------------------------*/ index = 0; for (i = 0; i < num_sends; i++) { start = hypre_ParCSRCommPkgSendMapStart(comm_pkg, i); for (j = start; j < hypre_ParCSRCommPkgSendMapStart(comm_pkg, i + 1); j++) { jrow = hypre_ParCSRCommPkgSendMapElmt(comm_pkg, j); buf_data[index++] = measure_array[jrow]; } } if (num_procs > 1) { comm_handle = hypre_ParCSRCommHandleCreate(1, comm_pkg, buf_data, &measure_array[num_variables]); hypre_ParCSRCommHandleDestroy(comm_handle); } if (debug_flag == 3) { wall_time = time_getWallclockSeconds() - wall_time; hypre_printf("Proc = %d Initialize CLJP phase = %f\n", my_id, wall_time); } /******************************************************************************* THE INDEPENDENT SET COARSENING LOOP: ******************************************************************************/ /*--------------------------------------------------- * Loop until all points are either fine or coarse. *---------------------------------------------------*/ while (1) { HYPRE_BigInt big_graph_size = (HYPRE_BigInt) graph_size; /* stop the coarsening if nothing left to be coarsened */ hypre_MPI_Allreduce(&big_graph_size, &global_graph_size, 1, HYPRE_MPI_BIG_INT, hypre_MPI_SUM, comm); if (global_graph_size == 0) { break; } /* hypre_printf("\n"); hypre_printf("*** MIS iteration %d\n",iter); hypre_printf("graph_size remaining %d\n",graph_size);*/ /*------------------------------------------------ * Pick an independent set of points with * maximal measure. At the end, CF_marker is complete, but still needs to be communicated to CF_marker_offd *------------------------------------------------*/ if (1) { /* hypre_BoomerAMGIndepSet(S, measure_array, graph_array, graph_size, graph_array_offd, graph_offd_size, CF_marker, CF_marker_offd);*/ for (ig = 0; ig < graph_size; ig++) { i = graph_array[ig]; if (measure_array[i] > 1) { CF_marker[i] = 1; } } for (ig = 0; ig < graph_offd_size; ig++) { i = graph_array_offd[ig]; if (measure_array[i + num_variables] > 1) { CF_marker_offd[i] = 1; } } /*------------------------------------------------------- * Remove nodes from the initial independent set *-------------------------------------------------------*/ for (ig = 0; ig < graph_size; ig++) { i = graph_array[ig]; if (measure_array[i] > 1) { for (jS = S_diag_i[i]; jS < S_diag_i[i + 1]; jS++) { j = S_diag_j[jS]; if (measure_array[j] > 1) { if (measure_array[i] > measure_array[j]) { CF_marker[j] = 0; } else if (measure_array[j] > measure_array[i]) { CF_marker[i] = 0; } } } for (jS = S_offd_i[i]; jS < S_offd_i[i + 1]; jS++) { jj = S_offd_j[jS]; j = num_variables + jj; if (measure_array[j] > 1) { if (measure_array[i] > measure_array[j]) { CF_marker_offd[jj] = 0; } else if (measure_array[j] > measure_array[i]) { CF_marker[i] = 0; } } } } } /*------------------------------------------------ * Exchange boundary data for CF_marker: send internal points to external points *------------------------------------------------*/ if (num_procs > 1) { comm_handle = hypre_ParCSRCommHandleCreate(12, comm_pkg, CF_marker_offd, int_buf_data); hypre_ParCSRCommHandleDestroy(comm_handle); } index = 0; for (i = 0; i < num_sends; i++) { start = hypre_ParCSRCommPkgSendMapStart(comm_pkg, i); for (j = start; j < hypre_ParCSRCommPkgSendMapStart(comm_pkg, i + 1); j++) { elmt = hypre_ParCSRCommPkgSendMapElmt(comm_pkg, j); if (!int_buf_data[index] && CF_marker[elmt] > 0) { CF_marker[elmt] = 0; index++; } else { int_buf_data[index++] = CF_marker[elmt]; } } } if (num_procs > 1) { comm_handle = hypre_ParCSRCommHandleCreate(11, comm_pkg, int_buf_data, CF_marker_offd); hypre_ParCSRCommHandleDestroy(comm_handle); } } #if 0 /* debugging */ iter++; #endif /*------------------------------------------------ * Set C-pts and F-pts. *------------------------------------------------*/ for (ig = 0; ig < graph_size; ig++) { i = graph_array[ig]; /*--------------------------------------------- * If measure smaller than 1 * make i an F point, *---------------------------------------------*/ if (measure_array[i] < 1.) { /* set to be a F-pt */ CF_marker[i] = F_PT; } /*--------------------------------------------- * First treat the case where point i is in the * independent set: make i a C point, *---------------------------------------------*/ if (CF_marker[i] > 0) { /* set to be a C-pt */ CF_marker[i] = C_PT; } /*--------------------------------------------- * Now treat the case where point i is not in the * independent set: loop over * all the points j that influence equation i; if * j is a C point, then make i an F point. *---------------------------------------------*/ else { /* first the local part */ for (jS = S_diag_i[i]; jS < S_diag_i[i + 1]; jS++) { /* j is the column number, or the local number of the point influencing i */ j = S_diag_j[jS]; if (CF_marker[j] > 0) /* j is a C-point */ { CF_marker[i] = F_PT; } } /* now the external part */ for (jS = S_offd_i[i]; jS < S_offd_i[i + 1]; jS++) { j = S_offd_j[jS]; if (CF_marker_offd[j] > 0) /* j is a C-point */ { CF_marker[i] = F_PT; } } } /* end else */ } /* end first loop over graph */ /* now communicate CF_marker to CF_marker_offd, to make sure that new external F points are known on this processor */ /*------------------------------------------------ * Exchange boundary data for CF_marker: send internal points to external points *------------------------------------------------*/ index = 0; for (i = 0; i < num_sends; i++) { start = hypre_ParCSRCommPkgSendMapStart(comm_pkg, i); for (j = start; j < hypre_ParCSRCommPkgSendMapStart(comm_pkg, i + 1); j++) int_buf_data[index++] = CF_marker[hypre_ParCSRCommPkgSendMapElmt(comm_pkg, j)]; } if (num_procs > 1) { comm_handle = hypre_ParCSRCommHandleCreate(11, comm_pkg, int_buf_data, CF_marker_offd); hypre_ParCSRCommHandleDestroy(comm_handle); } /*------------------------------------------------ * Update subgraph *------------------------------------------------*/ for (ig = 0; ig < graph_size; ig++) { i = graph_array[ig]; if (CF_marker[i] != 0) /* C or F point */ { /* the independent set subroutine needs measure 0 for removed nodes */ measure_array[i] = 0; /* take point out of the subgraph */ graph_size--; graph_array[ig] = graph_array[graph_size]; graph_array[graph_size] = i; ig--; } } for (ig = 0; ig < graph_offd_size; ig++) { i = graph_array_offd[ig]; if (CF_marker_offd[i] != 0) /* C or F point */ { /* the independent set subroutine needs measure 0 for removed nodes */ measure_array[i + num_variables] = 0; /* take point out of the subgraph */ graph_offd_size--; graph_array_offd[ig] = graph_array_offd[graph_offd_size]; graph_array_offd[graph_offd_size] = i; ig--; } } } /* end while */ /* hypre_printf("*** MIS iteration %d\n",iter); hypre_printf("graph_size remaining %d\n",graph_size); hypre_printf("num_cols_offd %d\n",num_cols_offd); for (i=0;i hypre_max (k != i) aik, aii < 0 * or * aij < hypre_min (k != i) aik, aii >= 0 * Then S_ij = 1, else S_ij = 0. * * NOTE: S_data is not used; in stead, only strong columns are retained * in S_j, which can then be used like S_data *----------------------------------------------------------------*/ /*S_ext = NULL; */ if (debug_flag == 3) { wall_time = time_getWallclockSeconds(); } hypre_MPI_Comm_size(comm, &num_procs); hypre_MPI_Comm_rank(comm, &my_id); if (!comm_pkg) { comm_pkg = hypre_ParCSRMatrixCommPkg(S); } if (!comm_pkg) { hypre_MatvecCommPkgCreate(S); comm_pkg = hypre_ParCSRMatrixCommPkg(S); } num_sends = hypre_ParCSRCommPkgNumSends(comm_pkg); int_buf_data = hypre_CTAlloc(HYPRE_Int, hypre_ParCSRCommPkgSendMapStart(comm_pkg, num_sends), HYPRE_MEMORY_HOST); buf_data = hypre_CTAlloc(HYPRE_Real, hypre_ParCSRCommPkgSendMapStart(comm_pkg, num_sends), HYPRE_MEMORY_HOST); num_cols_offd = hypre_CSRMatrixNumCols(S_offd); S_diag_j = hypre_CSRMatrixJ(S_diag); if (num_cols_offd) { S_offd_j = hypre_CSRMatrixJ(S_offd); } /* now the off-diagonal part of CF_marker */ if (num_cols_offd) { CF_marker_offd = hypre_CTAlloc(HYPRE_Int, num_cols_offd, HYPRE_MEMORY_HOST); } else { CF_marker_offd = NULL; } for (i = 0; i < num_cols_offd; i++) { CF_marker_offd[i] = 0; } /*------------------------------------------------ * Communicate the CF_marker values to the external nodes *------------------------------------------------*/ index = 0; for (i = 0; i < num_sends; i++) { start = hypre_ParCSRCommPkgSendMapStart(comm_pkg, i); for (j = start; j < hypre_ParCSRCommPkgSendMapStart(comm_pkg, i + 1); j++) { jrow = hypre_ParCSRCommPkgSendMapElmt(comm_pkg, j); int_buf_data[index++] = CF_marker[jrow]; } } if (num_procs > 1) { comm_handle = hypre_ParCSRCommHandleCreate(11, comm_pkg, int_buf_data, CF_marker_offd); hypre_ParCSRCommHandleDestroy(comm_handle); } /*---------------------------------------------------------- * Compute the measures * * The measures are currently given by the column sums of S. * Hence, measure_array[i] is the number of influences * of variable i. * * The measures are augmented by a random number * between 0 and 1. *----------------------------------------------------------*/ measure_array = hypre_CTAlloc(HYPRE_Real, num_variables + num_cols_offd, HYPRE_MEMORY_HOST); for (i = 0; i < num_variables + num_cols_offd; i++) { measure_array[i] = 0; } /* calculate the local part for the local nodes */ for (i = 0; i < num_variables; i++) { if (CF_marker[i] < 1) { for (j = S_diag_i[i] + 1; j < S_diag_i[i + 1]; j++) { if (CF_marker[S_diag_j[j]] < 1) { measure_array[S_diag_j[j]] += 1.0; } } for (j = S_offd_i[i]; j < S_offd_i[i + 1]; j++) { if (CF_marker_offd[S_offd_j[j]] < 1) { measure_array[num_variables + S_offd_j[j]] += 1.0; } } } } /* now send those locally calculated values for the external nodes to the neighboring processors */ if (num_procs > 1) comm_handle = hypre_ParCSRCommHandleCreate(2, comm_pkg, &measure_array[num_variables], buf_data); /* finish the communication */ if (num_procs > 1) { hypre_ParCSRCommHandleDestroy(comm_handle); } /* now add the externally calculated part of the local nodes to the local nodes */ index = 0; for (i = 0; i < num_sends; i++) { start = hypre_ParCSRCommPkgSendMapStart(comm_pkg, i); for (j = start; j < hypre_ParCSRCommPkgSendMapStart(comm_pkg, i + 1); j++) measure_array[hypre_ParCSRCommPkgSendMapElmt(comm_pkg, j)] += buf_data[index++]; } /* set the measures of the external nodes to zero */ for (i = num_variables; i < num_variables + num_cols_offd; i++) { measure_array[i] = 0; } /* this augments the measures with a random number between 0 and 1 */ /* (only for the local part) */ /* this augments the measures */ i = 2747 + my_id; hypre_SeedRand(i); for (i = 0; i < num_variables; i++) { measure_array[i] += hypre_Rand(); } /*--------------------------------------------------- * Initialize the graph arrays, and CF_marker arrays *---------------------------------------------------*/ /* first the off-diagonal part of the graph array */ if (num_cols_offd) { graph_array_offd = hypre_CTAlloc(HYPRE_Int, num_cols_offd, HYPRE_MEMORY_HOST); } else { graph_array_offd = NULL; } for (ig = 0; ig < num_cols_offd; ig++) { graph_array_offd[ig] = ig; } graph_offd_size = num_cols_offd; /* now the local part of the graph array, and the local CF_marker array */ graph_array = hypre_CTAlloc(HYPRE_Int, num_variables, HYPRE_MEMORY_HOST); if (CF_init == 1) { cnt = 0; for (i = 0; i < num_variables; i++) { if ( (S_offd_i[i + 1] - S_offd_i[i]) > 0 || CF_marker[i] == -1) { CF_marker[i] = 0; } if (CF_marker[i] == SF_PT) { measure_array[i] = 0; } else if ( CF_marker[i] < 1) { if (measure_array[i] >= 1.0 ) { CF_marker[i] = 0; graph_array[cnt++] = i; } else { CF_marker[i] = F_PT; measure_array[i] = 0; } } else { measure_array[i] = 0; } } } else { cnt = 0; for (i = 0; i < num_variables; i++) { if (CF_marker[i] == 0 && measure_array[i] >= 1.0 ) { graph_array[cnt++] = i; } else { measure_array[i] = 0; } } } graph_size = cnt; /*------------------------------------------------ * Communicate the local measures, which are complete, to the external nodes *------------------------------------------------*/ index = 0; for (i = 0; i < num_sends; i++) { start = hypre_ParCSRCommPkgSendMapStart(comm_pkg, i); for (j = start; j < hypre_ParCSRCommPkgSendMapStart(comm_pkg, i + 1); j++) { jrow = hypre_ParCSRCommPkgSendMapElmt(comm_pkg, j); buf_data[index++] = measure_array[jrow]; } } if (num_procs > 1) { comm_handle = hypre_ParCSRCommHandleCreate(1, comm_pkg, buf_data, &measure_array[num_variables]); hypre_ParCSRCommHandleDestroy(comm_handle); } if (debug_flag == 3) { wall_time = time_getWallclockSeconds() - wall_time; hypre_printf("Proc = %d Initialize CLJP phase = %f\n", my_id, wall_time); } /******************************************************************************* THE INDEPENDENT SET COARSENING LOOP: ******************************************************************************/ /*--------------------------------------------------- * Loop until all points are either fine or coarse. *---------------------------------------------------*/ while (1) { HYPRE_BigInt big_graph_size = (HYPRE_BigInt) graph_size; /* stop the coarsening if nothing left to be coarsened */ hypre_MPI_Allreduce(&big_graph_size, &global_graph_size, 1, HYPRE_MPI_BIG_INT, hypre_MPI_SUM, comm); if (global_graph_size == 0) { break; } /* hypre_printf("\n"); hypre_printf("*** MIS iteration %d\n",iter); hypre_printf("graph_size remaining %d\n",graph_size);*/ /*------------------------------------------------ * Pick an independent set of points with * maximal measure. At the end, CF_marker is complete, but still needs to be communicated to CF_marker_offd *------------------------------------------------*/ if (1) { /* hypre_BoomerAMGIndepSet(S, measure_array, graph_array, graph_size, graph_array_offd, graph_offd_size, CF_marker, CF_marker_offd);*/ for (ig = 0; ig < graph_size; ig++) { i = graph_array[ig]; if (measure_array[i] > 1) { CF_marker[i] = 1; } } for (ig = 0; ig < graph_offd_size; ig++) { i = graph_array_offd[ig]; if (measure_array[i + num_variables] > 1) { CF_marker_offd[i] = 1; } } /*------------------------------------------------------- * Remove nodes from the initial independent set *-------------------------------------------------------*/ for (ig = 0; ig < graph_size; ig++) { i = graph_array[ig]; if (measure_array[i] > 1) { for (jS = S_diag_i[i] + 1; jS < S_diag_i[i + 1]; jS++) { j = S_diag_j[jS]; if (measure_array[j] > 1) { if (measure_array[i] > measure_array[j]) { CF_marker[j] = 0; } else if (measure_array[j] > measure_array[i]) { CF_marker[i] = 0; } } } for (jS = S_offd_i[i]; jS < S_offd_i[i + 1]; jS++) { jj = S_offd_j[jS]; j = num_variables + jj; if (measure_array[j] > 1) { if (measure_array[i] > measure_array[j]) { CF_marker_offd[jj] = 0; } else if (measure_array[j] > measure_array[i]) { CF_marker[i] = 0; } } } } } /*------------------------------------------------ * Exchange boundary data for CF_marker: send internal points to external points *------------------------------------------------*/ if (num_procs > 1) { comm_handle = hypre_ParCSRCommHandleCreate(12, comm_pkg, CF_marker_offd, int_buf_data); hypre_ParCSRCommHandleDestroy(comm_handle); } index = 0; for (i = 0; i < num_sends; i++) { start = hypre_ParCSRCommPkgSendMapStart(comm_pkg, i); for (j = start; j < hypre_ParCSRCommPkgSendMapStart(comm_pkg, i + 1); j++) { elmt = hypre_ParCSRCommPkgSendMapElmt(comm_pkg, j); if (!int_buf_data[index] && CF_marker[elmt] > 0) { CF_marker[elmt] = 0; index++; } else { int_buf_data[index++] = CF_marker[elmt]; } } } if (num_procs > 1) { comm_handle = hypre_ParCSRCommHandleCreate(11, comm_pkg, int_buf_data, CF_marker_offd); hypre_ParCSRCommHandleDestroy(comm_handle); } } #if 0 /* debugging */ iter++; #endif /*------------------------------------------------ * Set C-pts and F-pts. *------------------------------------------------*/ for (ig = 0; ig < graph_size; ig++) { i = graph_array[ig]; /*--------------------------------------------- * First treat the case where point i is in the * independent set: make i a C point, *---------------------------------------------*/ if (CF_marker[i] > 0) { /* set to be a C-pt */ CF_marker[i] = C_PT; } /*--------------------------------------------- * Now treat the case where point i is not in the * independent set: loop over * all the points j that influence equation i; if * j is a C point, then make i an F point. *---------------------------------------------*/ else { /* first the local part */ for (jS = S_diag_i[i] + 1; jS < S_diag_i[i + 1]; jS++) { /* j is the column number, or the local number of the point influencing i */ j = S_diag_j[jS]; if (CF_marker[j] > 0) /* j is a C-point */ { CF_marker[i] = F_PT; } } /* now the external part */ for (jS = S_offd_i[i]; jS < S_offd_i[i + 1]; jS++) { j = S_offd_j[jS]; if (CF_marker_offd[j] > 0) /* j is a C-point */ { CF_marker[i] = F_PT; } } } /* end else */ } /* end first loop over graph */ /* now communicate CF_marker to CF_marker_offd, to make sure that new external F points are known on this processor */ /*------------------------------------------------ * Exchange boundary data for CF_marker: send internal points to external points *------------------------------------------------*/ index = 0; for (i = 0; i < num_sends; i++) { start = hypre_ParCSRCommPkgSendMapStart(comm_pkg, i); for (j = start; j < hypre_ParCSRCommPkgSendMapStart(comm_pkg, i + 1); j++) int_buf_data[index++] = CF_marker[hypre_ParCSRCommPkgSendMapElmt(comm_pkg, j)]; } if (num_procs > 1) { comm_handle = hypre_ParCSRCommHandleCreate(11, comm_pkg, int_buf_data, CF_marker_offd); hypre_ParCSRCommHandleDestroy(comm_handle); } /*------------------------------------------------ * Update subgraph *------------------------------------------------*/ for (ig = 0; ig < graph_size; ig++) { i = graph_array[ig]; if (CF_marker[i] != 0) /* C or F point */ { /* the independent set subroutine needs measure 0 for removed nodes */ measure_array[i] = 0; /* take point out of the subgraph */ graph_size--; graph_array[ig] = graph_array[graph_size]; graph_array[graph_size] = i; ig--; } } for (ig = 0; ig < graph_offd_size; ig++) { i = graph_array_offd[ig]; if (CF_marker_offd[i] != 0) /* C or F point */ { /* the independent set subroutine needs measure 0 for removed nodes */ measure_array[i + num_variables] = 0; /* take point out of the subgraph */ graph_offd_size--; graph_array_offd[ig] = graph_array_offd[graph_offd_size]; graph_array_offd[graph_offd_size] = i; ig--; } } } /* end while */ /* hypre_printf("*** MIS iteration %d\n",iter); hypre_printf("graph_size remaining %d\n",graph_size); hypre_printf("num_cols_offd %d\n",num_cols_offd); for (i=0;i 1) { Relax_temp = hypre_ParVectorCreate(comm, global_num_rows, row_starts); hypre_ParVectorInitialize(Relax_temp); } e0 = hypre_VectorData(hypre_ParVectorLocalVector(e0_vec)); e1 = hypre_VectorData(hypre_ParVectorLocalVector(e1_vec)); e2 = hypre_VectorData(hypre_ParVectorLocalVector(e2_vec)); if (my_id == 0) { hypre_fprintf(stdout, "Stage \t rho \t alpha \n"); hypre_fprintf(stdout, "-----------------------\n"); } for (i = 0; i < num_variables; i++) { e1[i] = 1.0e0; } /*e1[i] = 1.0e0+.1*hypre_RandI();*/ /* stages */ while (1) { if (nstages > 0) { if (num_functions == 1) { for (i = 0; i < num_variables; i++) { Vtemp_data[i] = 0.0e0; if (CF_marker[i] == cpt) { e0[i] = 0.0e0; e1[i] = 0.0e0; } } } else { jj = 0; for (i = 0; i < num_nodes; i++) { for (j = 0; j < num_functions; j++) { if (CF_marker[i] == cpt) { e0[jj] = 0.0e0; e1[jj] = 0.0e0; } Vtemp_data[jj++] = 0.0e0; } } } } /*for (i=0;i= 0.1 * theta && (i < num_CR_relax_steps || relrho >= 0.1)) /*for (i=0;i theta) { if (useCG) { for (i = 0; i < num_variables; i++) { if (CF_marker[i] == fpt) { e1[i] = 1.0e0; /*e1[i] = 1.0e0+.1*hypre_RandI();*/ e0[i] = e1[i]; } } hypre_ParVectorSetConstantValues(Rtemp, 0); rho1 = hypre_ParVectorInnerProd(e1_vec, e1_vec); rho0 = rho1; i = 0; while (rho1 / rho0 > 1.e-2 && i < num_CR_relax_steps) { if (i == 0) { hypre_ParCSRMatrixMatvec_FF(-1.0, A, e0_vec, 0.0, Rtemp, CF_marker, fpt); } /*hypre_BoomerAMGRelax(A, Rtemp, CF_marker, rlx_type, fpt, relax_weight, omega, NULL, Ztemp, Vtemp);*/ HYPRE_ParCSRDiagScale(NULL, (HYPRE_ParCSRMatrix) A, (HYPRE_ParVector) Rtemp, (HYPRE_ParVector) Ztemp); gammaold = gamma; gamma = hypre_ParVectorInnerProd(Rtemp, Ztemp); if (i == 0) { hypre_ParVectorCopy(Ztemp, Ptemp); beta = 1.0; } else { beta = gamma / gammaold; for (j = 0; j < num_variables; j++) if (CF_marker[j] == fpt) { Ptemp_data[j] = Ztemp_data[j] + beta * Ptemp_data[j]; } } hypre_ParCSRMatrixMatvec_FF(1.0, A, Ptemp, 0.0, Qtemp, CF_marker, fpt); alpha = gamma / hypre_ParVectorInnerProd(Ptemp, Qtemp); hypre_ParVectorAxpy(-alpha, Qtemp, Rtemp); for (j = 0; j < num_variables; j++) if (CF_marker[j] == fpt) { e0[j] = e1[j]; } hypre_ParVectorAxpy(-alpha, Ptemp, e1_vec); rho1 = hypre_ParVectorInnerProd(e1_vec, e1_vec); i++; } } /*formu(CF_marker,num_variables,e1,A_i,rho);*/ if (nstages) { thresh = 0.5; } else { thresh = 0.3; } for (i = 1; i < num_CR_relax_steps; i++) { thresh *= 0.3; } /*thresh=0.1;*/ if (num_functions == 1) /*if(CRaddCpoints == 0)*/ { local_max = 0.0; for (i = 0; i < num_variables; i++) if (hypre_abs(e1[i]) > local_max) { local_max = hypre_abs(e1[i]); } } else { jj = 0; local_max = 0.0; for (i = 0; i < num_nodes; i++) { /*CF_marker[jj] = CFN_marker[i];*/ sum[i] = hypre_abs(e1[jj++]); for (j = 1; j < num_functions; j++) { /*CF_marker[jj] = CFN_marker[i];*/ sum[i] += hypre_abs(e1[jj++]); } if (sum[i] > local_max) { local_max = sum[i]; } } } hypre_MPI_Allreduce(&local_max, &global_max, 1, HYPRE_MPI_REAL, hypre_MPI_MAX, comm); if (num_functions == 1) /*if(CRaddCpoints == 0)*/ { for (i = 0; i < num_variables; i++) { if (CF_marker[i] == fpt) { candmeas = hypre_pow(hypre_abs(e1[i]), 1.0) / global_max; if (candmeas > thresh && (A_i[i + 1] - A_i[i] + A_offd_i[i + 1] - A_offd_i[i]) > 1) { CF_marker[i] = cand; } } } if (IS_type == 1) { hypre_BoomerAMGIndepHMIS(S, 0, 0, CF_marker); } else if (IS_type == 7) { hypre_BoomerAMGIndepHMISa(A, 0, 0, CF_marker); } else if (IS_type == 2) { hypre_BoomerAMGIndepPMISa(A, 0, 0, CF_marker); } else if (IS_type == 5) { hypre_BoomerAMGIndepPMIS(S, 0, 0, CF_marker); } else if (IS_type == 3) { hypre_IndepSetGreedy(A_i, A_j, num_variables, CF_marker); } else if (IS_type == 6) { hypre_IndepSetGreedyS(S_i, S_j, num_variables, CF_marker); } else if (IS_type == 4) { hypre_BoomerAMGIndepRS(S, 1, 0, CF_marker); } else { hypre_BoomerAMGIndepRSa(A, 1, 0, CF_marker); } } else { AN_i = hypre_CSRMatrixI(hypre_ParCSRMatrixDiag(AN)); AN_offd_i = hypre_CSRMatrixI(hypre_ParCSRMatrixOffd(AN)); for (i = 0; i < num_nodes; i++) { /*if (CFN_marker[i] == fpt)*/ if (CF_marker[i] == fpt) { candmeas = sum[i] / global_max; if (candmeas > thresh && (AN_i[i + 1] - AN_i[i] + AN_offd_i[i + 1] - AN_offd_i[i]) > 1) { /*CFN_marker[i] = cand; */ CF_marker[i] = cand; } } } if (IS_type == 1) { hypre_BoomerAMGIndepHMIS(AN, 0, 0, CF_marker); } /*hypre_BoomerAMGIndepHMIS(AN,0,0,CFN_marker);*/ else if (IS_type == 2) { hypre_BoomerAMGIndepPMIS(AN, 0, 0, CF_marker); } /*hypre_BoomerAMGIndepPMIS(AN,0,0,CFN_marker);*/ else if (IS_type == 3) { hypre_IndepSetGreedy(hypre_CSRMatrixI(hypre_ParCSRMatrixDiag(AN)), hypre_CSRMatrixJ(hypre_ParCSRMatrixDiag(AN)), num_nodes, CF_marker); /*num_nodes,CFN_marker);*/ } else { hypre_BoomerAMGIndepRS(AN, 1, 0, CF_marker); } /*hypre_BoomerAMGIndepRS(AN,1,0,CFN_marker);*/ } if (my_id == 0) hypre_fprintf(stdout, " %d \t%2.3f \t%2.3f \n", nstages, rho, (HYPRE_Real)global_nc / (HYPRE_Real)global_num_variables); /* update for next sweep */ num_coarse = 0; if (num_functions == 1) /*if(CRaddCpoints == 0)*/ { for (i = 0; i < num_variables; i++) { if (CF_marker[i] == cpt) { num_coarse++; } else if (CF_marker[i] == fpt) { e0[i] = 1.0e0 + .1 * hypre_RandI(); e1[i] = 1.0e0 + .1 * hypre_RandI(); } } } else { jj = 0; for (i = 0; i < num_nodes; i++) { /*if (CFN_marker[i] == cpt) */ if (CF_marker[i] == cpt) { num_coarse++; jj += num_functions; /*for (j=0; j < num_functions; j++) CF_marker[jj++] = CFN_marker[i];*/ } /*else if (CFN_marker[i] == fpt)*/ else if (CF_marker[i] == fpt) { for (j = 0; j < num_functions; j++) { /*CF_marker[jj] = CFN_marker[i]; e0[jj] = 1.0e0+.1*hypre_RandI(); e1[jj++] = 1.0e0+.1*hypre_RandI();*/ e0[jj] = 1.0e0; e1[jj++] = 1.0e0; } } /*else { for (j=0; j < num_functions; j++) CF_marker[jj++] = CFN_marker[i]; } */ } } nstages += 1; hypre_MPI_Allreduce(&num_coarse, &global_nc, 1, HYPRE_MPI_INT, hypre_MPI_MAX, comm); } else { if (my_id == 0) hypre_fprintf(stdout, " %d \t%2.3f \t%2.3f \n", nstages, rho, (HYPRE_Real)global_nc / (HYPRE_Real)global_num_variables); break; } } hypre_ParVectorDestroy(e0_vec); hypre_ParVectorDestroy(e1_vec); hypre_ParVectorDestroy(e2_vec); hypre_ParVectorDestroy(Vtemp); hypre_ParVectorDestroy(Ptemp); hypre_ParVectorDestroy(Qtemp); hypre_ParVectorDestroy(Rtemp); hypre_ParVectorDestroy(Ztemp); if (num_threads > 1) { hypre_ParVectorDestroy(Relax_temp); } if (my_id == 0) { hypre_fprintf(stdout, "\n... Done \n\n"); } coarse_size = 0; for ( i = 0 ; i < num_variables; i++) { if ( CF_marker[i] == cpt) { coarse_size++; } } /*if(CRaddCpoints) hypre_TFree(CFN_marker);*/ *coarse_size_ptr = coarse_size; hypre_TFree(sum, HYPRE_MEMORY_HOST); return hypre_error_flag; } hypre-2.33.0/src/parcsr_ls/par_cycle.c000066400000000000000000000750301477326011500176250ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * ParAMG cycling routine * *****************************************************************************/ #include "_hypre_parcsr_ls.h" #include "par_amg.h" #include "../parcsr_block_mv/par_csr_block_matrix.h" /*-------------------------------------------------------------------------- * hypre_BoomerAMGCycle *--------------------------------------------------------------------------*/ HYPRE_Int hypre_BoomerAMGCycle( void *amg_vdata, hypre_ParVector **F_array, hypre_ParVector **U_array ) { hypre_ParAMGData *amg_data = (hypre_ParAMGData*) amg_vdata; HYPRE_Solver *smoother; /* Data Structure variables */ hypre_ParCSRMatrix **A_array; hypre_ParCSRMatrix **P_array; hypre_ParCSRMatrix **R_array; hypre_ParVector *Utemp = NULL; hypre_ParVector *Vtemp; hypre_ParVector *Rtemp; hypre_ParVector *Ptemp; hypre_ParVector *Ztemp; hypre_ParVector *Aux_U; hypre_ParVector *Aux_F; hypre_ParCSRBlockMatrix **A_block_array; hypre_ParCSRBlockMatrix **P_block_array; hypre_ParCSRBlockMatrix **R_block_array; HYPRE_Real *Ztemp_data = NULL; HYPRE_Real *Ptemp_data = NULL; hypre_IntArray **CF_marker_array; HYPRE_Int *CF_marker; /* HYPRE_Int **unknown_map_array; HYPRE_Int **point_map_array; HYPRE_Int **v_at_point_array; */ HYPRE_Real cycle_op_count; HYPRE_Int cycle_type; HYPRE_Int fcycle, fcycle_lev; HYPRE_Int num_levels; HYPRE_Int max_levels; HYPRE_Real *num_coeffs; HYPRE_Int *num_grid_sweeps; HYPRE_Int *grid_relax_type; HYPRE_Int **grid_relax_points; HYPRE_Int block_mode; HYPRE_Int cheby_order; /* Local variables */ HYPRE_Int *lev_counter; HYPRE_Int Solve_err_flag; HYPRE_Int k; HYPRE_Int i, j, jj; HYPRE_Int level; HYPRE_Int cycle_param; HYPRE_Int coarse_grid; HYPRE_Int fine_grid; HYPRE_Int Not_Finished; HYPRE_Int num_sweep; HYPRE_Int cg_num_sweep = 1; HYPRE_Int relax_type; HYPRE_Int relax_points = 0; HYPRE_Int relax_order; HYPRE_Int relax_local; HYPRE_Int old_version = 0; HYPRE_Real *relax_weight; HYPRE_Real *omega; HYPRE_Real alfa, beta, gammaold; HYPRE_Real gamma = 1.0; HYPRE_Int local_size = 0; /* HYPRE_Int *smooth_option; */ HYPRE_Int smooth_type; HYPRE_Int smooth_num_levels; HYPRE_Int my_id; HYPRE_Int restri_type; HYPRE_Real alpha; hypre_Vector **l1_norms = NULL; hypre_Vector *l1_norms_level; hypre_Vector **ds = hypre_ParAMGDataChebyDS(amg_data); HYPRE_Real **coefs = hypre_ParAMGDataChebyCoefs(amg_data); HYPRE_Int seq_cg = 0; HYPRE_Int partial_cycle_coarsest_level; HYPRE_Int partial_cycle_control; MPI_Comm comm; char nvtx_name[1024]; #if 0 HYPRE_Real *D_mat; HYPRE_Real *S_vec; #endif HYPRE_ANNOTATE_FUNC_BEGIN; hypre_GpuProfilingPushRange("AMGCycle"); /* Acquire data and allocate storage */ A_array = hypre_ParAMGDataAArray(amg_data); P_array = hypre_ParAMGDataPArray(amg_data); R_array = hypre_ParAMGDataRArray(amg_data); CF_marker_array = hypre_ParAMGDataCFMarkerArray(amg_data); Vtemp = hypre_ParAMGDataVtemp(amg_data); Rtemp = hypre_ParAMGDataRtemp(amg_data); Ptemp = hypre_ParAMGDataPtemp(amg_data); Ztemp = hypre_ParAMGDataZtemp(amg_data); num_levels = hypre_ParAMGDataNumLevels(amg_data); max_levels = hypre_ParAMGDataMaxLevels(amg_data); cycle_type = hypre_ParAMGDataCycleType(amg_data); fcycle = hypre_ParAMGDataFCycle(amg_data); A_block_array = hypre_ParAMGDataABlockArray(amg_data); P_block_array = hypre_ParAMGDataPBlockArray(amg_data); R_block_array = hypre_ParAMGDataRBlockArray(amg_data); block_mode = hypre_ParAMGDataBlockMode(amg_data); num_grid_sweeps = hypre_ParAMGDataNumGridSweeps(amg_data); grid_relax_type = hypre_ParAMGDataGridRelaxType(amg_data); grid_relax_points = hypre_ParAMGDataGridRelaxPoints(amg_data); relax_order = hypre_ParAMGDataRelaxOrder(amg_data); relax_weight = hypre_ParAMGDataRelaxWeight(amg_data); omega = hypre_ParAMGDataOmega(amg_data); smooth_type = hypre_ParAMGDataSmoothType(amg_data); smooth_num_levels = hypre_ParAMGDataSmoothNumLevels(amg_data); l1_norms = hypre_ParAMGDataL1Norms(amg_data); /* smooth_option = hypre_ParAMGDataSmoothOption(amg_data); */ /* RL */ restri_type = hypre_ParAMGDataRestriction(amg_data); partial_cycle_coarsest_level = hypre_ParAMGDataPartialCycleCoarsestLevel(amg_data); partial_cycle_control = hypre_ParAMGDataPartialCycleControl(amg_data); /*max_eig_est = hypre_ParAMGDataMaxEigEst(amg_data); min_eig_est = hypre_ParAMGDataMinEigEst(amg_data); cheby_fraction = hypre_ParAMGDataChebyFraction(amg_data);*/ cheby_order = hypre_ParAMGDataChebyOrder(amg_data); cycle_op_count = hypre_ParAMGDataCycleOpCount(amg_data); lev_counter = hypre_CTAlloc(HYPRE_Int, num_levels, HYPRE_MEMORY_HOST); if (hypre_ParAMGDataParticipate(amg_data)) { seq_cg = 1; } /* Initialize */ Solve_err_flag = 0; if (grid_relax_points) { old_version = 1; } num_coeffs = hypre_CTAlloc(HYPRE_Real, num_levels, HYPRE_MEMORY_HOST); num_coeffs[0] = hypre_ParCSRMatrixDNumNonzeros(A_array[0]); comm = hypre_ParCSRMatrixComm(A_array[0]); hypre_MPI_Comm_rank(comm, &my_id); if (block_mode) { for (j = 1; j < num_levels; j++) { num_coeffs[j] = hypre_ParCSRBlockMatrixNumNonzeros(A_block_array[j]); } } else { for (j = 1; j < num_levels; j++) { num_coeffs[j] = hypre_ParCSRMatrixDNumNonzeros(A_array[j]); } } /*--------------------------------------------------------------------- * Initialize cycling control counter * * Cycling is controlled using a level counter: lev_counter[k] * * Each time relaxation is performed on level k, the * counter is decremented by 1. If the counter is then * negative, we go to the next finer level. If non- * negative, we go to the next coarser level. The * following actions control cycling: * * a. lev_counter[0] is initialized to 1. * b. lev_counter[k] is initialized to cycle_type for k>0. * * c. During cycling, when going down to level k, lev_counter[k] * is set to the max of (lev_counter[k],cycle_type) *---------------------------------------------------------------------*/ Not_Finished = 1; lev_counter[0] = 1; for (k = 1; k < num_levels; ++k) { if (fcycle) { lev_counter[k] = 1; } else { lev_counter[k] = cycle_type; } } fcycle_lev = num_levels - 2; level = 0; cycle_param = 1; smoother = hypre_ParAMGDataSmoother(amg_data); if (smooth_num_levels > 0) { if (smooth_type == 7 || smooth_type == 8 || smooth_type == 9 || smooth_type == 17 || smooth_type == 18 || smooth_type == 19) { HYPRE_Int actual_local_size = hypre_ParVectorActualLocalSize(Vtemp); Utemp = hypre_ParVectorCreate(comm, hypre_ParVectorGlobalSize(Vtemp), hypre_ParVectorPartitioning(Vtemp)); local_size = hypre_VectorSize(hypre_ParVectorLocalVector(Vtemp)); if (local_size < actual_local_size) { hypre_VectorData(hypre_ParVectorLocalVector(Utemp)) = hypre_CTAlloc(HYPRE_Complex, actual_local_size, HYPRE_MEMORY_HOST); hypre_ParVectorActualLocalSize(Utemp) = actual_local_size; } else { hypre_ParVectorInitialize(Utemp); } } } /* Override level control and cycle param in the case of a partial cycle */ if (partial_cycle_coarsest_level >= 0) { if (partial_cycle_control == 0) { level = 0; cycle_param = 1; } else { level = partial_cycle_coarsest_level; if (level == num_levels - 1) { cycle_param = 3; } else { cycle_param = 2; } for (k = 0; k < num_levels; ++k) { lev_counter[k] = 0; } } } /*--------------------------------------------------------------------- * Main loop of cycling *--------------------------------------------------------------------*/ HYPRE_ANNOTATE_MGLEVEL_BEGIN(level); hypre_sprintf(nvtx_name, "%s-%d", "AMG Level", level); hypre_GpuProfilingPushRange(nvtx_name); while (Not_Finished) { if (num_levels > 1) { local_size = hypre_VectorSize(hypre_ParVectorLocalVector(F_array[level])); hypre_ParVectorSetLocalSize(Vtemp, local_size); if (smooth_num_levels <= level) { cg_num_sweep = 1; num_sweep = num_grid_sweeps[cycle_param]; Aux_U = U_array[level]; Aux_F = F_array[level]; } else if (smooth_type > 9) { hypre_ParVectorSetLocalSize(Ztemp, local_size); hypre_ParVectorSetLocalSize(Rtemp, local_size); hypre_ParVectorSetLocalSize(Ptemp, local_size); Ztemp_data = hypre_VectorData(hypre_ParVectorLocalVector(Ztemp)); Ptemp_data = hypre_VectorData(hypre_ParVectorLocalVector(Ptemp)); hypre_ParVectorSetConstantValues(Ztemp, 0.0); alpha = -1.0; beta = 1.0; hypre_ParCSRMatrixMatvecOutOfPlace(alpha, A_array[level], U_array[level], beta, F_array[level], Rtemp); cg_num_sweep = hypre_ParAMGDataSmoothNumSweeps(amg_data); num_sweep = num_grid_sweeps[cycle_param]; Aux_U = Ztemp; Aux_F = Rtemp; } else { cg_num_sweep = 1; num_sweep = hypre_ParAMGDataSmoothNumSweeps(amg_data); Aux_U = U_array[level]; Aux_F = F_array[level]; } relax_type = grid_relax_type[cycle_param]; } else /* AB: 4/08: removed the max_levels > 1 check - should do this when max-levels = 1 also */ { /* If no coarsening occurred, apply a simple smoother once */ Aux_U = U_array[level]; Aux_F = F_array[level]; num_sweep = num_grid_sweeps[0]; /* TK: Use the user relax type (instead of 0) to allow for setting a convergent smoother (e.g. in the solution of singular problems). */ relax_type = hypre_ParAMGDataUserRelaxType(amg_data); if (relax_type == -1) { relax_type = 6; } } if (CF_marker_array[level] != NULL) { CF_marker = hypre_IntArrayData(CF_marker_array[level]); } else { CF_marker = NULL; } if (l1_norms != NULL) { l1_norms_level = l1_norms[level]; } else { l1_norms_level = NULL; } if (cycle_param == 3 && seq_cg) { HYPRE_ANNOTATE_REGION_BEGIN("%s", "Coarse solve"); hypre_GpuProfilingPushRange("Coarse solve"); hypre_seqAMGCycle(amg_data, level, F_array, U_array); HYPRE_ANNOTATE_REGION_END("%s", "Coarse solve"); hypre_GpuProfilingPopRange(); } #ifdef HYPRE_USING_DSUPERLU else if (cycle_param == 3 && hypre_ParAMGDataDSLUSolver(amg_data) != NULL) { HYPRE_ANNOTATE_REGION_BEGIN("%s", "Coarse solve"); hypre_GpuProfilingPushRange("Coarse solve"); hypre_SLUDistSolve(hypre_ParAMGDataDSLUSolver(amg_data), Aux_F, Aux_U); HYPRE_ANNOTATE_REGION_END("%s", "Coarse solve"); hypre_GpuProfilingPopRange(); } #endif else { /*------------------------------------------------------------------ * Do the relaxation num_sweep times *-----------------------------------------------------------------*/ HYPRE_ANNOTATE_REGION_BEGIN("%s", "Relaxation"); hypre_GpuProfilingPushRange("Relaxation"); for (jj = 0; jj < cg_num_sweep; jj++) { if (smooth_num_levels > level && smooth_type > 9) { hypre_ParVectorSetConstantValues(Aux_U, 0.0); } for (j = 0; j < num_sweep; j++) { if (num_levels == 1 && max_levels > 1) { relax_points = 0; relax_local = 0; } else { if (old_version) { relax_points = grid_relax_points[cycle_param][j]; } relax_local = relax_order; } /*----------------------------------------------- * VERY sloppy approximation to cycle complexity *-----------------------------------------------*/ if (old_version && level < num_levels - 1) { switch (relax_points) { case 1: cycle_op_count += num_coeffs[level + 1]; break; case -1: cycle_op_count += (num_coeffs[level] - num_coeffs[level + 1]); break; } } else { cycle_op_count += num_coeffs[level]; } /*----------------------------------------------- Choose Smoother -----------------------------------------------*/ if ( (smooth_num_levels > level) && (smooth_type == 7 || smooth_type == 8 || smooth_type == 9 || smooth_type == 17 || smooth_type == 18 || smooth_type == 19) ) { hypre_ParVectorSetLocalSize(Utemp, local_size); alpha = -1.0; beta = 1.0; hypre_ParCSRMatrixMatvecOutOfPlace(alpha, A_array[level], U_array[level], beta, Aux_F, Vtemp); if (smooth_type == 7 || smooth_type == 17) { HYPRE_ParCSRPilutSolve(smoother[level], (HYPRE_ParCSRMatrix) A_array[level], (HYPRE_ParVector) Vtemp, (HYPRE_ParVector) Utemp); } else if (smooth_type == 8 || smooth_type == 18) { HYPRE_ParCSRParaSailsSolve(smoother[level], (HYPRE_ParCSRMatrix) A_array[level], (HYPRE_ParVector) Vtemp, (HYPRE_ParVector) Utemp); } else if (smooth_type == 9 || smooth_type == 19) { HYPRE_EuclidSolve(smoother[level], (HYPRE_ParCSRMatrix) A_array[level], (HYPRE_ParVector) Vtemp, (HYPRE_ParVector) Utemp); } hypre_ParVectorAxpy(relax_weight[level], Utemp, Aux_U); } else if ( smooth_num_levels > level && (smooth_type == 4) ) { HYPRE_FSAISetZeroGuess(smoother[level], cycle_param - 2); HYPRE_FSAISetMaxIterations(smoother[level], num_grid_sweeps[cycle_param]); HYPRE_FSAISolve(smoother[level], (HYPRE_ParCSRMatrix) A_array[level], (HYPRE_ParVector) Aux_F, (HYPRE_ParVector) Aux_U); } else if ( smooth_num_levels > level && (smooth_type == 5 || smooth_type == 15) ) { HYPRE_ILUSolve(smoother[level], (HYPRE_ParCSRMatrix) A_array[level], (HYPRE_ParVector) Aux_F, (HYPRE_ParVector) Aux_U); } else if ( smooth_num_levels > level && (smooth_type == 6 || smooth_type == 16) ) { HYPRE_SchwarzSolve(smoother[level], (HYPRE_ParCSRMatrix) A_array[level], (HYPRE_ParVector) Aux_F, (HYPRE_ParVector) Aux_U); } else if (relax_type == 9 || relax_type == 19 || relax_type == 98 || relax_type == 99 || relax_type == 198 || relax_type == 199) { /* Gaussian elimination */ hypre_GaussElimSolve(amg_data, level, relax_type); } else if (relax_type == 18) { /* L1 - Jacobi*/ Solve_err_flag = hypre_BoomerAMGRelaxIF(A_array[level], Aux_F, CF_marker, relax_type, relax_order, cycle_param, relax_weight[level], omega[level], l1_norms_level ? hypre_VectorData(l1_norms_level) : NULL, Aux_U, Vtemp, Ztemp); } else if (relax_type == 15) { /* CG */ if (j == 0) /* do num sweep iterations of CG */ { hypre_ParCSRRelax_CG( smoother[level], A_array[level], Aux_F, Aux_U, num_sweep); } } else if (relax_type == 16) { /* scaled Chebyshev */ HYPRE_Int scale = hypre_ParAMGDataChebyScale(amg_data); HYPRE_Int variant = hypre_ParAMGDataChebyVariant(amg_data); hypre_ParCSRRelax_Cheby_Solve(A_array[level], Aux_F, hypre_VectorData(ds[level]), coefs[level], cheby_order, scale, variant, Aux_U, Vtemp, Ztemp, Ptemp, Rtemp ); } else if (relax_type == 17) { if (level == num_levels - 1) { /* if we are on the coarsest level, the cf_marker will be null and we just do one sweep regular Jacobi */ hypre_assert(cycle_param == 3); hypre_BoomerAMGRelax(A_array[level], Aux_F, CF_marker, 0, 0, relax_weight[level], 0.0, NULL, Aux_U, Vtemp, NULL); } else { hypre_BoomerAMGRelax_FCFJacobi(A_array[level], Aux_F, CF_marker, relax_weight[level], Aux_U, Vtemp); } } else if (old_version) { Solve_err_flag = hypre_BoomerAMGRelax(A_array[level], Aux_F, CF_marker, relax_type, relax_points, relax_weight[level], omega[level], l1_norms_level ? hypre_VectorData(l1_norms_level) : NULL, Aux_U, Vtemp, Ztemp); } else { /* smoother than can have CF ordering */ if (block_mode) { Solve_err_flag = hypre_BoomerAMGBlockRelaxIF(A_block_array[level], Aux_F, CF_marker, relax_type, relax_local, cycle_param, relax_weight[level], omega[level], Aux_U, Vtemp); } else { Solve_err_flag = hypre_BoomerAMGRelaxIF(A_array[level], Aux_F, CF_marker, relax_type, relax_local, cycle_param, relax_weight[level], omega[level], l1_norms_level ? hypre_VectorData(l1_norms_level) : NULL, Aux_U, Vtemp, Ztemp); } } if (Solve_err_flag != 0) { HYPRE_ANNOTATE_REGION_END("%s", "Relaxation"); HYPRE_ANNOTATE_MGLEVEL_END(level); HYPRE_ANNOTATE_FUNC_END; hypre_GpuProfilingPopRange(); hypre_GpuProfilingPopRange(); hypre_GpuProfilingPopRange(); return (Solve_err_flag); } } /* for (j = 0; j < num_sweep; j++) */ if (smooth_num_levels > level && smooth_type > 9) { gammaold = gamma; gamma = hypre_ParVectorInnerProd(Rtemp, Ztemp); if (jj == 0) { hypre_ParVectorCopy(Ztemp, Ptemp); } else { beta = gamma / gammaold; /* TODO (VPM): Use a ParVector routine to do the following */ for (i = 0; i < local_size; i++) { Ptemp_data[i] = Ztemp_data[i] + beta * Ptemp_data[i]; } } hypre_ParCSRMatrixMatvec(1.0, A_array[level], Ptemp, 0.0, Vtemp); alfa = gamma / hypre_ParVectorInnerProd(Ptemp, Vtemp); hypre_ParVectorAxpy(alfa, Ptemp, U_array[level]); hypre_ParVectorAxpy(-alfa, Vtemp, Rtemp); } } /* for (jj = 0; jj < cg_num_sweep; jj++) */ HYPRE_ANNOTATE_REGION_END("%s", "Relaxation"); hypre_GpuProfilingPopRange(); } /*------------------------------------------------------------------ * Decrement the control counter and determine which grid to visit next *-----------------------------------------------------------------*/ --lev_counter[level]; //if ( level != num_levels-1 && lev_counter[level] >= 0 ) if (lev_counter[level] >= 0 && level != num_levels - 1) { /*--------------------------------------------------------------- * Visit coarser level next. * Compute residual using hypre_ParCSRMatrixMatvec. * Perform restriction using hypre_ParCSRMatrixMatvecT. * Reset counters and cycling parameters for coarse level *--------------------------------------------------------------*/ fine_grid = level; coarse_grid = level + 1; hypre_ParVectorSetZeros(U_array[coarse_grid]); alpha = -1.0; beta = 1.0; HYPRE_ANNOTATE_REGION_BEGIN("%s", "Residual"); hypre_GpuProfilingPushRange("Residual"); if (block_mode) { hypre_ParVectorCopy(F_array[fine_grid], Vtemp); hypre_ParCSRBlockMatrixMatvec(alpha, A_block_array[fine_grid], U_array[fine_grid], beta, Vtemp); } else { // JSP: avoid unnecessary copy using out-of-place version of SpMV hypre_ParCSRMatrixMatvecOutOfPlace(alpha, A_array[fine_grid], U_array[fine_grid], beta, F_array[fine_grid], Vtemp); } HYPRE_ANNOTATE_REGION_END("%s", "Residual"); hypre_GpuProfilingPopRange(); alpha = 1.0; beta = 0.0; HYPRE_ANNOTATE_REGION_BEGIN("%s", "Restriction"); hypre_GpuProfilingPushRange("Restriction"); if (block_mode) { hypre_ParCSRBlockMatrixMatvecT(alpha, R_block_array[fine_grid], Vtemp, beta, F_array[coarse_grid]); } else { if (restri_type) { /* RL: no transpose for R */ hypre_ParCSRMatrixMatvec(alpha, R_array[fine_grid], Vtemp, beta, F_array[coarse_grid]); } else { hypre_ParCSRMatrixMatvecT(alpha, R_array[fine_grid], Vtemp, beta, F_array[coarse_grid]); } } HYPRE_ANNOTATE_REGION_END("%s", "Restriction"); HYPRE_ANNOTATE_MGLEVEL_END(level); hypre_GpuProfilingPopRange(); hypre_GpuProfilingPopRange(); ++level; lev_counter[level] = hypre_max(lev_counter[level], cycle_type); cycle_param = 1; if (level == num_levels - 1) { cycle_param = 3; } if (partial_cycle_coarsest_level >= 0 && level == partial_cycle_coarsest_level + 1) { Not_Finished = 0; } HYPRE_ANNOTATE_MGLEVEL_BEGIN(level); hypre_sprintf(nvtx_name, "%s-%d", "AMG Level", level); hypre_GpuProfilingPushRange(nvtx_name); } else if (level != 0) { /*--------------------------------------------------------------- * Visit finer level next. * Interpolate and add correction using hypre_ParCSRMatrixMatvec. * Reset counters and cycling parameters for finer level. *--------------------------------------------------------------*/ fine_grid = level - 1; coarse_grid = level; alpha = 1.0; beta = 1.0; HYPRE_ANNOTATE_REGION_BEGIN("%s", "Interpolation"); hypre_GpuProfilingPushRange("Interpolation"); if (block_mode) { hypre_ParCSRBlockMatrixMatvec(alpha, P_block_array[fine_grid], U_array[coarse_grid], beta, U_array[fine_grid]); } else { /* printf("Proc %d: level %d, n %d, Interpolation\n", my_id, level, local_size); */ hypre_ParCSRMatrixMatvec(alpha, P_array[fine_grid], U_array[coarse_grid], beta, U_array[fine_grid]); /* printf("Proc %d: level %d, n %d, Interpolation done\n", my_id, level, local_size); */ } hypre_ParVectorAllZeros(U_array[fine_grid]) = 0; HYPRE_ANNOTATE_REGION_END("%s", "Interpolation"); HYPRE_ANNOTATE_MGLEVEL_END(level); hypre_GpuProfilingPopRange(); hypre_GpuProfilingPopRange(); --level; cycle_param = 2; if (fcycle && fcycle_lev == level) { lev_counter[level] = hypre_max(lev_counter[level], 1); fcycle_lev --; } HYPRE_ANNOTATE_MGLEVEL_BEGIN(level); hypre_sprintf(nvtx_name, "%s-%d", "AMG Level", level); hypre_GpuProfilingPushRange(nvtx_name); } else { Not_Finished = 0; } } /* main loop: while (Not_Finished) */ HYPRE_ANNOTATE_MGLEVEL_END(level); hypre_GpuProfilingPopRange(); hypre_ParAMGDataCycleOpCount(amg_data) = cycle_op_count; hypre_TFree(lev_counter, HYPRE_MEMORY_HOST); hypre_TFree(num_coeffs, HYPRE_MEMORY_HOST); if (smooth_num_levels > 0) { if (smooth_type == 7 || smooth_type == 8 || smooth_type == 9 || smooth_type == 17 || smooth_type == 18 || smooth_type == 19 ) { hypre_ParVectorDestroy(Utemp); } } HYPRE_ANNOTATE_FUNC_END; hypre_GpuProfilingPopRange(); return (Solve_err_flag); } hypre-2.33.0/src/parcsr_ls/par_difconv.c000066400000000000000000000237061477326011500201610ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "_hypre_parcsr_ls.h" /*-------------------------------------------------------------------------- * hypre_GenerateDifConv *--------------------------------------------------------------------------*/ HYPRE_ParCSRMatrix GenerateDifConv( MPI_Comm comm, HYPRE_BigInt nx, HYPRE_BigInt ny, HYPRE_BigInt nz, HYPRE_Int P, HYPRE_Int Q, HYPRE_Int R, HYPRE_Int p, HYPRE_Int q, HYPRE_Int r, HYPRE_Real *value ) { hypre_ParCSRMatrix *A; hypre_CSRMatrix *diag; hypre_CSRMatrix *offd; HYPRE_Int *diag_i; HYPRE_Int *diag_j; HYPRE_Real *diag_data; HYPRE_Int *offd_i; HYPRE_Int *offd_j = NULL; HYPRE_BigInt *big_offd_j = NULL; HYPRE_Real *offd_data = NULL; HYPRE_BigInt global_part[2]; HYPRE_BigInt ix, iy, iz; HYPRE_Int ip, iq, ir; HYPRE_Int cnt, o_cnt; HYPRE_Int local_num_rows; HYPRE_BigInt *col_map_offd = NULL; HYPRE_Int row_index; HYPRE_Int i, j; HYPRE_Int nx_local, ny_local, nz_local; HYPRE_Int num_cols_offd; HYPRE_BigInt grid_size; HYPRE_BigInt *nx_part; HYPRE_BigInt *ny_part; HYPRE_BigInt *nz_part; HYPRE_Int num_procs; HYPRE_Int P_busy, Q_busy, R_busy; hypre_MPI_Comm_size(comm, &num_procs); grid_size = nx * ny * nz; hypre_GeneratePartitioning(nx, P, &nx_part); hypre_GeneratePartitioning(ny, Q, &ny_part); hypre_GeneratePartitioning(nz, R, &nz_part); nx_local = (HYPRE_Int)(nx_part[p + 1] - nx_part[p]); ny_local = (HYPRE_Int)(ny_part[q + 1] - ny_part[q]); nz_local = (HYPRE_Int)(nz_part[r + 1] - nz_part[r]); local_num_rows = nx_local * ny_local * nz_local; ip = p; iq = q; ir = r; global_part[0] = nz_part[ir] * nx * ny + (ny_part[iq] * nx + nx_part[ip] * ny_local) * nz_local; global_part[1] = global_part[0] + (HYPRE_BigInt)local_num_rows; diag_i = hypre_CTAlloc(HYPRE_Int, local_num_rows + 1, HYPRE_MEMORY_HOST); offd_i = hypre_CTAlloc(HYPRE_Int, local_num_rows + 1, HYPRE_MEMORY_HOST); P_busy = hypre_min(nx, P); Q_busy = hypre_min(ny, Q); R_busy = hypre_min(nz, R); num_cols_offd = 0; if (p) { num_cols_offd += ny_local * nz_local; } if (p < P_busy - 1) { num_cols_offd += ny_local * nz_local; } if (q) { num_cols_offd += nx_local * nz_local; } if (q < Q_busy - 1) { num_cols_offd += nx_local * nz_local; } if (r) { num_cols_offd += nx_local * ny_local; } if (r < R_busy - 1) { num_cols_offd += nx_local * ny_local; } if (!local_num_rows) { num_cols_offd = 0; } cnt = 1; o_cnt = 1; diag_i[0] = 0; offd_i[0] = 0; for (iz = nz_part[ir]; iz < nz_part[ir + 1]; iz++) { for (iy = ny_part[iq]; iy < ny_part[iq + 1]; iy++) { for (ix = nx_part[ip]; ix < nx_part[ip + 1]; ix++) { diag_i[cnt] = diag_i[cnt - 1]; offd_i[o_cnt] = offd_i[o_cnt - 1]; diag_i[cnt]++; if (iz > nz_part[ir]) { diag_i[cnt]++; } else { if (iz) { offd_i[o_cnt]++; } } if (iy > ny_part[iq]) { diag_i[cnt]++; } else { if (iy) { offd_i[o_cnt]++; } } if (ix > nx_part[ip]) { diag_i[cnt]++; } else { if (ix) { offd_i[o_cnt]++; } } if (ix + 1 < nx_part[ip + 1]) { diag_i[cnt]++; } else { if (ix + 1 < nx) { offd_i[o_cnt]++; } } if (iy + 1 < ny_part[iq + 1]) { diag_i[cnt]++; } else { if (iy + 1 < ny) { offd_i[o_cnt]++; } } if (iz + 1 < nz_part[ir + 1]) { diag_i[cnt]++; } else { if (iz + 1 < nz) { offd_i[o_cnt]++; } } cnt++; o_cnt++; } } } diag_j = hypre_CTAlloc(HYPRE_Int, diag_i[local_num_rows], HYPRE_MEMORY_HOST); diag_data = hypre_CTAlloc(HYPRE_Real, diag_i[local_num_rows], HYPRE_MEMORY_HOST); if (offd_i[local_num_rows]) { offd_j = hypre_CTAlloc(HYPRE_Int, offd_i[local_num_rows], HYPRE_MEMORY_HOST); big_offd_j = hypre_CTAlloc(HYPRE_BigInt, offd_i[local_num_rows], HYPRE_MEMORY_HOST); offd_data = hypre_CTAlloc(HYPRE_Real, offd_i[local_num_rows], HYPRE_MEMORY_HOST); } row_index = 0; cnt = 0; o_cnt = 0; for (iz = nz_part[ir]; iz < nz_part[ir + 1]; iz++) { for (iy = ny_part[iq]; iy < ny_part[iq + 1]; iy++) { for (ix = nx_part[ip]; ix < nx_part[ip + 1]; ix++) { diag_j[cnt] = row_index; diag_data[cnt++] = value[0]; if (iz > nz_part[ir]) { diag_j[cnt] = row_index - nx_local * ny_local; diag_data[cnt++] = value[3]; } else { if (iz) { big_offd_j[o_cnt] = hypre_map(ix, iy, iz - 1, ip, iq, ir - 1, nx, ny, nx_part, ny_part, nz_part); offd_data[o_cnt++] = value[3]; } } if (iy > ny_part[iq]) { diag_j[cnt] = row_index - nx_local; diag_data[cnt++] = value[2]; } else { if (iy) { big_offd_j[o_cnt] = hypre_map(ix, iy - 1, iz, ip, iq - 1, ir, nx, ny, nx_part, ny_part, nz_part); offd_data[o_cnt++] = value[2]; } } if (ix > nx_part[ip]) { diag_j[cnt] = row_index - 1; diag_data[cnt++] = value[1]; } else { if (ix) { big_offd_j[o_cnt] = hypre_map(ix - 1, iy, iz, ip - 1, iq, ir, nx, ny, nx_part, ny_part, nz_part); offd_data[o_cnt++] = value[1]; } } if (ix + 1 < nx_part[ip + 1]) { diag_j[cnt] = row_index + 1; diag_data[cnt++] = value[4]; } else { if (ix + 1 < nx) { big_offd_j[o_cnt] = hypre_map(ix + 1, iy, iz, ip + 1, iq, ir, nx, ny, nx_part, ny_part, nz_part); offd_data[o_cnt++] = value[4]; } } if (iy + 1 < ny_part[iq + 1]) { diag_j[cnt] = row_index + nx_local; diag_data[cnt++] = value[5]; } else { if (iy + 1 < ny) { big_offd_j[o_cnt] = hypre_map(ix, iy + 1, iz, ip, iq + 1, ir, nx, ny, nx_part, ny_part, nz_part); offd_data[o_cnt++] = value[5]; } } if (iz + 1 < nz_part[ir + 1]) { diag_j[cnt] = row_index + nx_local * ny_local; diag_data[cnt++] = value[6]; } else { if (iz + 1 < nz) { big_offd_j[o_cnt] = hypre_map(ix, iy, iz + 1, ip, iq, ir + 1, nx, ny, nx_part, ny_part, nz_part); offd_data[o_cnt++] = value[6]; } } row_index++; } } } if (num_cols_offd) { col_map_offd = hypre_CTAlloc(HYPRE_BigInt, num_cols_offd, HYPRE_MEMORY_HOST); for (i = 0; i < num_cols_offd; i++) { col_map_offd[i] = big_offd_j[i]; } hypre_BigQsort0(col_map_offd, 0, num_cols_offd - 1); for (i = 0; i < num_cols_offd; i++) for (j = 0; j < num_cols_offd; j++) if (big_offd_j[i] == col_map_offd[j]) { offd_j[i] = j; break; } } A = hypre_ParCSRMatrixCreate(comm, grid_size, grid_size, global_part, global_part, num_cols_offd, diag_i[local_num_rows], offd_i[local_num_rows]); hypre_ParCSRMatrixColMapOffd(A) = col_map_offd; diag = hypre_ParCSRMatrixDiag(A); hypre_CSRMatrixI(diag) = diag_i; hypre_CSRMatrixJ(diag) = diag_j; hypre_CSRMatrixData(diag) = diag_data; offd = hypre_ParCSRMatrixOffd(A); hypre_CSRMatrixI(offd) = offd_i; if (num_cols_offd) { hypre_CSRMatrixJ(offd) = offd_j; hypre_CSRMatrixData(offd) = offd_data; } hypre_CSRMatrixMemoryLocation(diag) = HYPRE_MEMORY_HOST; hypre_CSRMatrixMemoryLocation(offd) = HYPRE_MEMORY_HOST; hypre_ParCSRMatrixMigrate(A, hypre_HandleMemoryLocation(hypre_handle())); hypre_TFree(nx_part, HYPRE_MEMORY_HOST); hypre_TFree(ny_part, HYPRE_MEMORY_HOST); hypre_TFree(nz_part, HYPRE_MEMORY_HOST); hypre_TFree(big_offd_j, HYPRE_MEMORY_HOST); return (HYPRE_ParCSRMatrix) A; } hypre-2.33.0/src/parcsr_ls/par_fsai.c000066400000000000000000000421621477326011500174500ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) *******************************************************************************/ #include "_hypre_parcsr_ls.h" #include "par_fsai.h" /****************************************************************************** * HYPRE_FSAICreate ******************************************************************************/ void * hypre_FSAICreate( void ) { hypre_ParFSAIData *fsai_data; /* setup params */ HYPRE_Int algo_type; HYPRE_Int local_solve_type; HYPRE_Int max_steps; HYPRE_Int max_step_size; HYPRE_Int max_nnz_row; HYPRE_Int num_levels; HYPRE_Real kap_tolerance; /* solver params */ HYPRE_Int eig_max_iters; HYPRE_Int max_iterations; HYPRE_Int num_iterations; HYPRE_Real tolerance; HYPRE_Real omega; /* log info */ HYPRE_Int logging; /* output params */ HYPRE_Int print_level; /*----------------------------------------------------------------------- * Setup default values for parameters *-----------------------------------------------------------------------*/ fsai_data = hypre_CTAlloc(hypre_ParFSAIData, 1, HYPRE_MEMORY_HOST); /* setup params */ local_solve_type = 0; max_steps = 3; max_step_size = 5; max_nnz_row = max_steps * max_step_size; num_levels = 2; kap_tolerance = 1.0e-3; /* parameters that depend on the execution policy */ #if defined (HYPRE_USING_CUDA) || defined (HYPRE_USING_HIP) HYPRE_MemoryLocation memory_location = hypre_HandleMemoryLocation(hypre_handle()); if (hypre_GetExecPolicy1(memory_location) == HYPRE_EXEC_DEVICE) { algo_type = 3; } else #endif { algo_type = hypre_NumThreads() > 4 ? 2 : 1; } /* solver params */ eig_max_iters = 0; max_iterations = 20; tolerance = 1.0e-6; omega = 1.0; /* log info */ logging = 0; num_iterations = 0; /* output params */ print_level = 0; HYPRE_ANNOTATE_FUNC_BEGIN; /*----------------------------------------------------------------------- * Create the hypre_ParFSAIData structure and return *-----------------------------------------------------------------------*/ hypre_ParFSAIDataGmat(fsai_data) = NULL; hypre_ParFSAIDataGTmat(fsai_data) = NULL; hypre_ParFSAIDataRWork(fsai_data) = NULL; hypre_ParFSAIDataZWork(fsai_data) = NULL; hypre_ParFSAIDataZeroGuess(fsai_data) = 0; hypre_FSAISetAlgoType(fsai_data, algo_type); hypre_FSAISetLocalSolveType(fsai_data, local_solve_type); hypre_FSAISetMaxSteps(fsai_data, max_steps); hypre_FSAISetMaxStepSize(fsai_data, max_step_size); hypre_FSAISetMaxNnzRow(fsai_data, max_nnz_row); hypre_FSAISetNumLevels(fsai_data, num_levels); hypre_FSAISetKapTolerance(fsai_data, kap_tolerance); hypre_FSAISetMaxIterations(fsai_data, max_iterations); hypre_FSAISetEigMaxIters(fsai_data, eig_max_iters); hypre_FSAISetTolerance(fsai_data, tolerance); hypre_FSAISetOmega(fsai_data, omega); hypre_FSAISetLogging(fsai_data, logging); hypre_FSAISetNumIterations(fsai_data, num_iterations); hypre_FSAISetPrintLevel(fsai_data, print_level); HYPRE_ANNOTATE_FUNC_END; return (void *) fsai_data; } /****************************************************************************** * HYPRE_FSAIDestroy ******************************************************************************/ HYPRE_Int hypre_FSAIDestroy( void *data ) { hypre_ParFSAIData *fsai_data = (hypre_ParFSAIData*)data; HYPRE_ANNOTATE_FUNC_BEGIN; if (fsai_data) { if (hypre_ParFSAIDataGmat(fsai_data)) { hypre_ParCSRMatrixDestroy(hypre_ParFSAIDataGmat(fsai_data)); } if (hypre_ParFSAIDataGTmat(fsai_data)) { hypre_ParCSRMatrixDestroy(hypre_ParFSAIDataGTmat(fsai_data)); } hypre_ParVectorDestroy(hypre_ParFSAIDataRWork(fsai_data)); hypre_ParVectorDestroy(hypre_ParFSAIDataZWork(fsai_data)); hypre_TFree(fsai_data, HYPRE_MEMORY_HOST); } HYPRE_ANNOTATE_FUNC_END; return hypre_error_flag; } /****************************************************************************** * Routines to SET the setup phase parameters ******************************************************************************/ HYPRE_Int hypre_FSAISetAlgoType( void *data, HYPRE_Int algo_type ) { hypre_ParFSAIData *fsai_data = (hypre_ParFSAIData*) data; if (!fsai_data) { hypre_error_in_arg(1); return hypre_error_flag; } if (algo_type < 0) { hypre_error_in_arg(2); return hypre_error_flag; } hypre_ParFSAIDataAlgoType(fsai_data) = algo_type; return hypre_error_flag; } HYPRE_Int hypre_FSAISetLocalSolveType( void *data, HYPRE_Int local_solve_type ) { hypre_ParFSAIData *fsai_data = (hypre_ParFSAIData*) data; if (!fsai_data) { hypre_error_in_arg(1); return hypre_error_flag; } if (local_solve_type < 0 || local_solve_type > 2) { hypre_error_in_arg(2); return hypre_error_flag; } hypre_ParFSAIDataLocalSolveType(fsai_data) = local_solve_type; return hypre_error_flag; } HYPRE_Int hypre_FSAISetMaxSteps( void *data, HYPRE_Int max_steps ) { hypre_ParFSAIData *fsai_data = (hypre_ParFSAIData*) data; if (!fsai_data) { hypre_error_in_arg(1); return hypre_error_flag; } if (max_steps < 0) { hypre_error_in_arg(2); return hypre_error_flag; } hypre_ParFSAIDataMaxSteps(fsai_data) = max_steps; return hypre_error_flag; } HYPRE_Int hypre_FSAISetMaxStepSize( void *data, HYPRE_Int max_step_size ) { hypre_ParFSAIData *fsai_data = (hypre_ParFSAIData*) data; if (!fsai_data) { hypre_error_in_arg(1); return hypre_error_flag; } if (max_step_size < 0) { hypre_error_in_arg(2); return hypre_error_flag; } hypre_ParFSAIDataMaxStepSize(fsai_data) = max_step_size; return hypre_error_flag; } HYPRE_Int hypre_FSAISetMaxNnzRow( void *data, HYPRE_Int max_nnz_row ) { hypre_ParFSAIData *fsai_data = (hypre_ParFSAIData*) data; if (!fsai_data) { hypre_error_in_arg(1); return hypre_error_flag; } if (max_nnz_row < 0) { hypre_error_in_arg(2); return hypre_error_flag; } hypre_ParFSAIDataMaxNnzRow(fsai_data) = max_nnz_row; return hypre_error_flag; } HYPRE_Int hypre_FSAISetNumLevels( void *data, HYPRE_Int num_levels ) { hypre_ParFSAIData *fsai_data = (hypre_ParFSAIData*) data; if (!fsai_data) { hypre_error_in_arg(1); return hypre_error_flag; } if (num_levels < 1) { hypre_error_in_arg(2); return hypre_error_flag; } hypre_ParFSAIDataNumLevels(fsai_data) = num_levels; return hypre_error_flag; } HYPRE_Int hypre_FSAISetThreshold( void *data, HYPRE_Real threshold ) { hypre_ParFSAIData *fsai_data = (hypre_ParFSAIData*) data; if (!fsai_data) { hypre_error_in_arg(1); return hypre_error_flag; } if (threshold < 0) { hypre_error_in_arg(2); return hypre_error_flag; } hypre_ParFSAIDataThreshold(fsai_data) = threshold; return hypre_error_flag; } HYPRE_Int hypre_FSAISetKapTolerance( void *data, HYPRE_Real kap_tolerance ) { hypre_ParFSAIData *fsai_data = (hypre_ParFSAIData*) data; if (!fsai_data) { hypre_error_in_arg(1); return hypre_error_flag; } if (kap_tolerance < 0) { hypre_error_in_arg(2); return hypre_error_flag; } hypre_ParFSAIDataKapTolerance(fsai_data) = kap_tolerance; return hypre_error_flag; } HYPRE_Int hypre_FSAISetMaxIterations( void *data, HYPRE_Int max_iterations ) { hypre_ParFSAIData *fsai_data = (hypre_ParFSAIData*) data; if (!fsai_data) { hypre_error_in_arg(1); return hypre_error_flag; } if (max_iterations < 0) { hypre_error_in_arg(2); return hypre_error_flag; } hypre_ParFSAIDataMaxIterations(fsai_data) = max_iterations; return hypre_error_flag; } HYPRE_Int hypre_FSAISetEigMaxIters( void *data, HYPRE_Int eig_max_iters ) { hypre_ParFSAIData *fsai_data = (hypre_ParFSAIData*) data; if (!fsai_data) { hypre_error_in_arg(1); return hypre_error_flag; } if (eig_max_iters < 0) { hypre_error_in_arg(2); return hypre_error_flag; } hypre_ParFSAIDataEigMaxIters(fsai_data) = eig_max_iters; return hypre_error_flag; } HYPRE_Int hypre_FSAISetZeroGuess( void *data, HYPRE_Int zero_guess ) { hypre_ParFSAIData *fsai_data = (hypre_ParFSAIData*) data; if (!fsai_data) { hypre_error_in_arg(1); return hypre_error_flag; } if (zero_guess != 0) { hypre_ParFSAIDataZeroGuess(fsai_data) = 1; } else { hypre_ParFSAIDataZeroGuess(fsai_data) = 0; } return hypre_error_flag; } HYPRE_Int hypre_FSAISetTolerance( void *data, HYPRE_Real tolerance ) { hypre_ParFSAIData *fsai_data = (hypre_ParFSAIData*) data; if (!fsai_data) { hypre_error_in_arg(1); return hypre_error_flag; } if (tolerance < 0) { hypre_error_in_arg(2); return hypre_error_flag; } hypre_ParFSAIDataTolerance(fsai_data) = tolerance; return hypre_error_flag; } HYPRE_Int hypre_FSAISetOmega( void *data, HYPRE_Real omega ) { hypre_ParFSAIData *fsai_data = (hypre_ParFSAIData*) data; if (!fsai_data) { hypre_error_in_arg(1); return hypre_error_flag; } if (omega < 0) { hypre_error_w_msg(HYPRE_ERROR_GENERIC, "Negative omega not allowed!"); return hypre_error_flag; } hypre_ParFSAIDataOmega(fsai_data) = omega; return hypre_error_flag; } HYPRE_Int hypre_FSAISetLogging( void *data, HYPRE_Int logging ) { hypre_ParFSAIData *fsai_data = (hypre_ParFSAIData*) data; if (!fsai_data) { hypre_error_in_arg(1); return hypre_error_flag; } if (logging < 0) { hypre_error_in_arg(2); return hypre_error_flag; } hypre_ParFSAIDataLogging(fsai_data) = logging; return hypre_error_flag; } HYPRE_Int hypre_FSAISetNumIterations( void *data, HYPRE_Int num_iterations ) { hypre_ParFSAIData *fsai_data = (hypre_ParFSAIData*) data; if (!fsai_data) { hypre_error_in_arg(1); return hypre_error_flag; } if (num_iterations < 0) { hypre_error_in_arg(2); return hypre_error_flag; } hypre_ParFSAIDataNumIterations(fsai_data) = num_iterations; return hypre_error_flag; } HYPRE_Int hypre_FSAISetPrintLevel( void *data, HYPRE_Int print_level ) { hypre_ParFSAIData *fsai_data = (hypre_ParFSAIData*) data; if (!fsai_data) { hypre_error_in_arg(1); return hypre_error_flag; } if (print_level < 0) { hypre_error_in_arg(2); return hypre_error_flag; } hypre_ParFSAIDataPrintLevel(fsai_data) = print_level; return hypre_error_flag; } /****************************************************************************** * Routines to GET the setup phase parameters ******************************************************************************/ HYPRE_Int hypre_FSAIGetAlgoType( void *data, HYPRE_Int *algo_type ) { hypre_ParFSAIData *fsai_data = (hypre_ParFSAIData*) data; if (!fsai_data) { hypre_error_in_arg(1); return hypre_error_flag; } *algo_type = hypre_ParFSAIDataAlgoType(fsai_data); return hypre_error_flag; } HYPRE_Int hypre_FSAIGetLocalSolveType( void *data, HYPRE_Int *local_solve_type ) { hypre_ParFSAIData *fsai_data = (hypre_ParFSAIData*) data; if (!fsai_data) { hypre_error_in_arg(1); return hypre_error_flag; } *local_solve_type = hypre_ParFSAIDataLocalSolveType(fsai_data); return hypre_error_flag; } HYPRE_Int hypre_FSAIGetMaxSteps( void *data, HYPRE_Int *algo_type ) { hypre_ParFSAIData *fsai_data = (hypre_ParFSAIData*) data; if (!fsai_data) { hypre_error_in_arg(1); return hypre_error_flag; } *algo_type = hypre_ParFSAIDataMaxSteps(fsai_data); return hypre_error_flag; } HYPRE_Int hypre_FSAIGetMaxStepSize( void *data, HYPRE_Int *max_step_size ) { hypre_ParFSAIData *fsai_data = (hypre_ParFSAIData*) data; if (!fsai_data) { hypre_error_in_arg(1); return hypre_error_flag; } *max_step_size = hypre_ParFSAIDataMaxStepSize(fsai_data); return hypre_error_flag; } HYPRE_Int hypre_FSAIGetMaxNnzRow( void *data, HYPRE_Int *max_nnz_row ) { hypre_ParFSAIData *fsai_data = (hypre_ParFSAIData*) data; if (!fsai_data) { hypre_error_in_arg(1); return hypre_error_flag; } *max_nnz_row = hypre_ParFSAIDataMaxNnzRow(fsai_data); return hypre_error_flag; } HYPRE_Int hypre_FSAIGetNumLevels( void *data, HYPRE_Int *num_levels ) { hypre_ParFSAIData *fsai_data = (hypre_ParFSAIData*) data; if (!fsai_data) { hypre_error_in_arg(1); return hypre_error_flag; } *num_levels = hypre_ParFSAIDataNumLevels(fsai_data); return hypre_error_flag; } HYPRE_Int hypre_FSAIGetThreshold( void *data, HYPRE_Real *threshold ) { hypre_ParFSAIData *fsai_data = (hypre_ParFSAIData*) data; if (!fsai_data) { hypre_error_in_arg(1); return hypre_error_flag; } *threshold = hypre_ParFSAIDataThreshold(fsai_data); return hypre_error_flag; } HYPRE_Int hypre_FSAIGetKapTolerance( void *data, HYPRE_Real *kap_tolerance ) { hypre_ParFSAIData *fsai_data = (hypre_ParFSAIData*) data; if (!fsai_data) { hypre_error_in_arg(1); return hypre_error_flag; } *kap_tolerance = hypre_ParFSAIDataKapTolerance(fsai_data); return hypre_error_flag; } HYPRE_Int hypre_FSAIGetMaxIterations( void *data, HYPRE_Int *max_iterations ) { hypre_ParFSAIData *fsai_data = (hypre_ParFSAIData*) data; if (!fsai_data) { hypre_error_in_arg(1); return hypre_error_flag; } *max_iterations = hypre_ParFSAIDataMaxIterations(fsai_data); return hypre_error_flag; } HYPRE_Int hypre_FSAIGetEigMaxIters( void *data, HYPRE_Int *eig_max_iters ) { hypre_ParFSAIData *fsai_data = (hypre_ParFSAIData*) data; if (!fsai_data) { hypre_error_in_arg(1); return hypre_error_flag; } *eig_max_iters = hypre_ParFSAIDataEigMaxIters(fsai_data); return hypre_error_flag; } HYPRE_Int hypre_FSAIGetZeroGuess( void *data, HYPRE_Int *zero_guess ) { hypre_ParFSAIData *fsai_data = (hypre_ParFSAIData*) data; if (!fsai_data) { hypre_error_in_arg(1); return hypre_error_flag; } *zero_guess = hypre_ParFSAIDataZeroGuess(fsai_data); return hypre_error_flag; } HYPRE_Int hypre_FSAIGetTolerance( void *data, HYPRE_Real *tolerance ) { hypre_ParFSAIData *fsai_data = (hypre_ParFSAIData*) data; if (!fsai_data) { hypre_error_in_arg(1); return hypre_error_flag; } *tolerance = hypre_ParFSAIDataTolerance(fsai_data); return hypre_error_flag; } HYPRE_Int hypre_FSAIGetOmega( void *data, HYPRE_Real *omega ) { hypre_ParFSAIData *fsai_data = (hypre_ParFSAIData*) data; if (!fsai_data) { hypre_error_in_arg(1); return hypre_error_flag; } *omega = hypre_ParFSAIDataOmega(fsai_data); return hypre_error_flag; } HYPRE_Int hypre_FSAIGetLogging( void *data, HYPRE_Int *logging ) { hypre_ParFSAIData *fsai_data = (hypre_ParFSAIData*) data; if (!fsai_data) { hypre_error_in_arg(1); return hypre_error_flag; } *logging = hypre_ParFSAIDataLogging(fsai_data); return hypre_error_flag; } HYPRE_Int hypre_FSAIGetNumIterations( void *data, HYPRE_Int *num_iterations ) { hypre_ParFSAIData *fsai_data = (hypre_ParFSAIData*) data; if (!fsai_data) { hypre_error_in_arg(1); return hypre_error_flag; } *num_iterations = hypre_ParFSAIDataNumIterations(fsai_data); return hypre_error_flag; } HYPRE_Int hypre_FSAIGetPrintLevel( void *data, HYPRE_Int *print_level ) { hypre_ParFSAIData *fsai_data = (hypre_ParFSAIData*) data; if (!fsai_data) { hypre_error_in_arg(1); return hypre_error_flag; } *print_level = hypre_ParFSAIDataPrintLevel(fsai_data); return hypre_error_flag; } hypre-2.33.0/src/parcsr_ls/par_fsai.h000066400000000000000000000114111477326011500174460ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #ifndef hypre_ParFSAI_DATA_HEADER #define hypre_ParFSAI_DATA_HEADER //#define DEBUG_FSAI /*-------------------------------------------------------------------------- * hypre_ParFSAIData *--------------------------------------------------------------------------*/ typedef struct hypre_ParFSAIData_struct { /* FSAI Setup input data */ HYPRE_Int algo_type; /* FSAI algorithm type */ HYPRE_Int local_solve_type; /* Local linear solver type */ HYPRE_Int max_steps; /* Max. iterations run per row */ HYPRE_Int max_step_size; /* Max. number of nonzeros added to a row of G per step */ HYPRE_Int max_nnz_row; /* Max. number of nonzeros per row of G */ HYPRE_Int num_levels; /* Number of levels for computing the candidate pattern */ HYPRE_Real threshold; /* Filtering threshold for the candidate pattern */ HYPRE_Real kap_tolerance; /* Min. amount of change between two steps */ /* FSAI Setup data */ HYPRE_Real density; /* Density of matrix G wrt. A */ hypre_ParCSRMatrix *Gmat; /* Matrix holding FSAI factor. M^(-1) = G'G */ hypre_ParCSRMatrix *GTmat; /* Matrix holding the transpose of the FSAI factor */ /* Solver data */ HYPRE_Int zero_guess; /* Flag indicating x0 = 0 */ HYPRE_Int eig_max_iters; /* Iters for computing max. eigenvalue of G^T*G*A */ HYPRE_Int max_iterations; /* Maximum iterations run for the solver */ HYPRE_Int num_iterations; /* Number of iterations the solver ran */ HYPRE_Real omega; /* Step size for Preconditioned Richardson Solver */ HYPRE_Real tolerance; /* Tolerance for the solver */ HYPRE_Real rel_resnorm; /* available if logging > 1 */ /* Work data */ hypre_ParVector *r_work; /* work vector used to compute the residual */ hypre_ParVector *z_work; /* work vector used for applying FSAI */ /* Log info data */ HYPRE_Int logging; HYPRE_Int print_level; } hypre_ParFSAIData; /*-------------------------------------------------------------------------- * Accessor functions for the hypre_ParFSAIData structure *--------------------------------------------------------------------------*/ /* FSAI Setup input data */ #define hypre_ParFSAIDataAlgoType(fsai_data) ((fsai_data) -> algo_type) #define hypre_ParFSAIDataLocalSolveType(fsai_data) ((fsai_data) -> local_solve_type) #define hypre_ParFSAIDataMaxSteps(fsai_data) ((fsai_data) -> max_steps) #define hypre_ParFSAIDataMaxStepSize(fsai_data) ((fsai_data) -> max_step_size) #define hypre_ParFSAIDataMaxNnzRow(fsai_data) ((fsai_data) -> max_nnz_row) #define hypre_ParFSAIDataNumLevels(fsai_data) ((fsai_data) -> num_levels) #define hypre_ParFSAIDataThreshold(fsai_data) ((fsai_data) -> threshold) #define hypre_ParFSAIDataKapTolerance(fsai_data) ((fsai_data) -> kap_tolerance) /* FSAI Setup data */ #define hypre_ParFSAIDataGmat(fsai_data) ((fsai_data) -> Gmat) #define hypre_ParFSAIDataGTmat(fsai_data) ((fsai_data) -> GTmat) #define hypre_ParFSAIDataDensity(fsai_data) ((fsai_data) -> density) /* Solver problem data */ #define hypre_ParFSAIDataZeroGuess(fsai_data) ((fsai_data) -> zero_guess) #define hypre_ParFSAIDataEigMaxIters(fsai_data) ((fsai_data) -> eig_max_iters) #define hypre_ParFSAIDataMaxIterations(fsai_data) ((fsai_data) -> max_iterations) #define hypre_ParFSAIDataNumIterations(fsai_data) ((fsai_data) -> num_iterations) #define hypre_ParFSAIDataOmega(fsai_data) ((fsai_data) -> omega) #define hypre_ParFSAIDataRelResNorm(fsai_data) ((fsai_data) -> rel_resnorm) #define hypre_ParFSAIDataTolerance(fsai_data) ((fsai_data) -> tolerance) /* Work data */ #define hypre_ParFSAIDataRWork(fsai_data) ((fsai_data) -> r_work) #define hypre_ParFSAIDataZWork(fsai_data) ((fsai_data) -> z_work) /* Log info data */ #define hypre_ParFSAIDataLogging(fsai_data) ((fsai_data) -> logging) #define hypre_ParFSAIDataPrintLevel(fsai_data) ((fsai_data) -> print_level) #endif hypre-2.33.0/src/parcsr_ls/par_fsai_device.c000066400000000000000000001277311477326011500207750ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "_hypre_parcsr_ls.h" #include "_hypre_utilities.hpp" #include "par_fsai.h" #if defined(HYPRE_USING_CUDA) || defined(HYPRE_USING_HIP) #define mat_(l, k, i, j) mat_data[l * (l * k + i) + j] #define rhs_(l, i, j) rhs_data[l * i + j] #define sol_(l, i, j) sol_data[l * i + j] #define ls_(i, j) ls_data[batch_dim * j + i] #define HYPRE_THRUST_ZIP3(A, B, C) thrust::make_zip_iterator(thrust::make_tuple(A, B, C)) /*-------------------------------------------------------------------------- * hypreGPUKernel_BatchedGaussJordanSolve *--------------------------------------------------------------------------*/ __global__ void __launch_bounds__(1024, 1) hypreGPUKernel_BatchedGaussJordanSolve( hypre_DeviceItem &item, HYPRE_Int batch_num_items, HYPRE_Int batch_dim, HYPRE_Complex *mat_data, HYPRE_Complex *rhs_data, HYPRE_Complex *sol_data ) { extern __shared__ void* shmem[]; HYPRE_Complex *ls_data = (HYPRE_Complex*) shmem; HYPRE_Complex *coef = (HYPRE_Complex*) (ls_data + batch_dim * (batch_dim + 1)); HYPRE_Int *pos = (HYPRE_Int*) (coef + 2); HYPRE_Int tidx = threadIdx.x; HYPRE_Int tidy = threadIdx.y; HYPRE_Int btid = blockIdx.y * gridDim.x + blockIdx.x; HYPRE_Int i, k; HYPRE_Int posA; HYPRE_Complex coefA, coefB; HYPRE_Complex *ptrA; if (btid < batch_num_items) { /* Shift to LS belonging to the current batch ID (btid) */ mat_data += btid * batch_dim * batch_dim; rhs_data += btid * batch_dim; sol_data += btid * batch_dim; /* Copy matrix into shared memory */ if (tidy < batch_dim) { ls_(tidx, tidy) = mat_data[tidy * batch_dim + tidx]; } /* Copy RHS into shared memory */ if (tidy == batch_dim) { ls_(tidx, tidy) = rhs_data[tidx]; } /* Perform elimination */ for (k = 0; k < batch_dim; k++) { /* Pivot computation */ __syncthreads(); if ((tidx < 2) && (tidy == 0)) { i = k + 1 + tidx; posA = k; ptrA = &ls_(i, k); coefA = fabs(ls_(k, k)); #pragma unroll 1 for (; i < batch_dim; i += 2) { coefB = fabs(*ptrA); if (coefA < coefB) { coefA = coefB; posA = i; } ptrA += 2; } pos[tidx] = posA; coef[tidx] = coefA; } /* Swap row coefficients */ __syncthreads(); if ((tidx == k) && (tidy >= k)) { posA = (coef[1] > coef[0]) ? pos[1] : pos[0]; coefA = ls_(posA, tidy); ls_(posA, tidy) = ls_(tidx, tidy); ls_(tidx, tidy) = coefA; } /* Row scaling */ __syncthreads(); if ((tidx == k) && (tidy > k)) { ls_(tidx, tidy) = ls_(tidx, tidy) * (1.0 / ls_(tidx, k)); } /* Row elimination */ __syncthreads(); if ((tidx != k) && (tidy > k)) { ls_(tidx, tidy) -= ls_(tidx, k) * ls_(k, tidy); } } __syncthreads(); if (tidy == batch_dim) { sol_data[tidx] = ls_(tidx, batch_dim); } } } /*-------------------------------------------------------------------- * hypreGPUKernel_FSAIExtractSubSystems * * Output: * 1) mat_data: dense matrix coefficients. * 2) rhs_data: right hand side coefficients. * 3) G_r: number of nonzero coefficients per row of the matrix G. * * TODO: * 1) Minimize intra-warp divergence. *--------------------------------------------------------------------*/ __global__ void hypreGPUKernel_FSAIExtractSubSystems( hypre_DeviceItem &item, HYPRE_Int num_rows, HYPRE_Int *A_i, HYPRE_Int *A_j, HYPRE_Complex *A_a, HYPRE_Int *P_i, HYPRE_Int *P_e, HYPRE_Int *P_j, HYPRE_Int batch_dim, HYPRE_Complex *mat_data, HYPRE_Complex *rhs_data, HYPRE_Int *G_r ) { HYPRE_Int lane = hypre_gpu_get_lane_id<1>(item); HYPRE_Int i, j, jj, k; HYPRE_Int pj, qj; HYPRE_Int pk, qk; HYPRE_Int A_col, P_col; HYPRE_Complex val; hypre_mask bitmask; /* Grid-stride loop over matrix rows */ for (i = hypre_gpu_get_grid_warp_id<1, 1>(item); i < num_rows; i += hypre_gpu_get_grid_num_warps<1, 1>(item)) { /* Set identity matrix */ for (j = lane; j < batch_dim; j += HYPRE_WARP_SIZE) { mat_(batch_dim, i, j, j) = 1.0; } if (lane == 0) { pj = read_only_load(P_i + i); qj = read_only_load(P_e + i); } qj = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, qj, 0, HYPRE_WARP_SIZE); pj = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, pj, 0, HYPRE_WARP_SIZE); if (lane < 2) { pk = read_only_load(A_i + i + lane); } qk = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, pk, 1, HYPRE_WARP_SIZE); pk = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, pk, 0, HYPRE_WARP_SIZE); /* Set right hand side vector */ for (j = pj; j < qj; j++) { if (lane == 0) { P_col = read_only_load(P_j + j); } P_col = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, P_col, 0, HYPRE_WARP_SIZE); for (k = pk + lane; warp_any_sync(item, HYPRE_WARP_FULL_MASK, k < qk); k += HYPRE_WARP_SIZE) { if (k < qk) { A_col = read_only_load(A_j + k); } else { A_col = -1; } bitmask = hypre_ballot_sync(item, HYPRE_WARP_FULL_MASK, A_col == P_col); if (bitmask > 0) { if (lane == (hypre_ffs(bitmask) - 1)) { rhs_(batch_dim, i, j - pj) = - read_only_load(A_a + k); } break; } } } /* Loop over requested rows */ for (j = pj; j < qj; j++) { if (lane < 2) { pk = read_only_load(A_i + P_j[j] + lane); } qk = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, pk, 1, HYPRE_WARP_SIZE); pk = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, pk, 0, HYPRE_WARP_SIZE); /* Visit only the lower triangular part */ for (jj = pj; jj <= j; jj++) { if (lane == 0) { P_col = read_only_load(P_j + jj); } P_col = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, P_col, 0, HYPRE_WARP_SIZE); for (k = pk + lane; warp_any_sync(item, HYPRE_WARP_FULL_MASK, k < qk); k += HYPRE_WARP_SIZE) { if (k < qk) { A_col = read_only_load(A_j + k); } else { A_col = -1; } bitmask = hypre_ballot_sync(item, HYPRE_WARP_FULL_MASK, A_col == P_col); if (bitmask > 0) { if (lane == (hypre_ffs(bitmask) - 1)) { val = read_only_load(A_a + k); mat_(batch_dim, i, j - pj, jj - pj) = val; mat_(batch_dim, i, jj - pj, j - pj) = val; } break; } } } } /* Set number of nonzero coefficients per row of G */ if (lane == 0) { G_r[i] = qj - pj + 1; } } /* Grid-stride loop over matrix rows */ } /*-------------------------------------------------------------------- * hypreGPUKernel_FSAIScaling * * TODO: unroll inner loop * Use fma? *--------------------------------------------------------------------*/ __global__ void hypreGPUKernel_FSAIScaling( hypre_DeviceItem &item, HYPRE_Int num_rows, HYPRE_Int batch_dim, HYPRE_Complex *sol_data, HYPRE_Complex *rhs_data, HYPRE_Complex *scaling, HYPRE_Int *info ) { HYPRE_Int i, j; HYPRE_Complex val; /* Grid-stride loop over matrix rows */ for (i = hypre_gpu_get_grid_thread_id<1, 1>(item); i < num_rows; i += hypre_gpu_get_grid_num_threads<1, 1>(item)) { val = scaling[i]; for (j = 0; j < batch_dim; j++) { val += sol_(batch_dim, i, j) * rhs_(batch_dim, i, j); } if (val > 0) { scaling[i] = 1.0 / sqrt(val); } else { scaling[i] = 1.0 / sqrt(scaling[i]); info[i] = 1; } } } /*-------------------------------------------------------------------- * hypreGPUKernel_FSAIGatherEntries * * Output: * 1) G_j: column indices of G_diag * 2) G_a: coefficients of G_diag * * TODO: * 1) Use a (sub-)warp per row of G *--------------------------------------------------------------------*/ __global__ void hypreGPUKernel_FSAIGatherEntries( hypre_DeviceItem &item, HYPRE_Int num_rows, HYPRE_Int batch_dim, HYPRE_Complex *sol_data, HYPRE_Complex *scaling, HYPRE_Int *K_i, HYPRE_Int *K_e, HYPRE_Int *K_j, HYPRE_Int *G_i, HYPRE_Int *G_j, HYPRE_Complex *G_a ) { HYPRE_Int i, j; HYPRE_Int cnt, il; HYPRE_Int col; HYPRE_Complex val; /* Grid-stride loop over matrix rows */ for (i = hypre_gpu_get_grid_thread_id<1, 1>(item); i < num_rows; i += hypre_gpu_get_grid_num_threads<1, 1>(item)) { /* Set scaling factor */ val = scaling[i]; /* Set diagonal coefficient */ cnt = G_i[i]; G_j[cnt] = i; G_a[cnt] = val; cnt++; /* Set off-diagonal coefficients */ il = 0; for (j = K_i[i]; j < K_e[i]; j++) { col = K_j[j]; G_j[cnt + il] = col; G_a[cnt + il] = sol_(batch_dim, i, il) * val; il++; } } } /*-------------------------------------------------------------------- * hypreGPUKernel_FSAITruncateCandidateOrdered * * Truncates the candidate pattern matrix (K). This function extracts * lower triangular portion of the matrix up to the largest * "max_nonzeros_row" coefficients in absolute value. * * Assumptions: * 1) columns are ordered with descreasing absolute coef. values * 2) max_nonzeros_row < warp_size. * * TODO: * 1) Perform truncation with COO matrix * 2) Use less than one warp per row when possible *--------------------------------------------------------------------*/ __global__ void hypreGPUKernel_FSAITruncateCandidateOrdered( hypre_DeviceItem &item, HYPRE_Int max_nonzeros_row, HYPRE_Int num_rows, HYPRE_Int *K_i, HYPRE_Int *K_j, HYPRE_Complex *K_a ) { HYPRE_Int lane = hypre_gpu_get_lane_id<1>(item); HYPRE_Int p = 0; HYPRE_Int q = 0; HYPRE_Int i, j, k, kk, cnt; HYPRE_Int col; hypre_mask bitmask; HYPRE_Complex val; HYPRE_Int max_lane; HYPRE_Int max_idx; HYPRE_Complex max_val; HYPRE_Complex warp_max_val; /* Grid-stride loop over matrix rows */ for (i = hypre_gpu_get_grid_warp_id<1, 1>(item); i < num_rows; i += hypre_gpu_get_grid_num_warps<1, 1>(item)) { if (lane < 2) { p = read_only_load(K_i + i + lane); } q = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, p, 1, HYPRE_WARP_SIZE); p = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, p, 0, HYPRE_WARP_SIZE); k = 0; while (k < max_nonzeros_row) { /* Initialize variables */ j = p + k + lane; max_val = 0.0; max_idx = -1; /* Find maximum val/col pair in each lane */ if (j < q) { if (K_j[j] < i) { max_val = abs(K_a[j]); max_idx = j; } } for (j += HYPRE_WARP_SIZE; j < q; j += HYPRE_WARP_SIZE) { if (K_j[j] < i) { val = abs(K_a[j]); if (val > max_val) { max_val = val; max_idx = j; } } } /* Find maximum coefficient in absolute value in the warp */ warp_max_val = warp_allreduce_max(item, max_val); /* Reorder col/val entries associated with warp_max_val */ bitmask = hypre_ballot_sync(item, HYPRE_WARP_FULL_MASK, warp_max_val == max_val); if (warp_max_val > 0.0) { cnt = min(hypre_popc(bitmask), max_nonzeros_row - k); for (kk = 0; kk < cnt; kk++) { /* warp_sync(item); */ max_lane = hypre_ffs(bitmask) - 1; if (lane == max_lane) { col = K_j[p + k + kk]; val = K_a[p + k + kk]; K_j[p + k + kk] = K_j[max_idx]; K_a[p + k + kk] = max_val; K_j[max_idx] = col; K_a[max_idx] = val; } /* Update bitmask */ bitmask = hypre_mask_flip_at(bitmask, max_lane); } /* Update number of nonzeros per row */ k += cnt; } else { break; } } /* Exclude remaining columns */ for (j = p + k + lane; j < q; j += HYPRE_WARP_SIZE) { K_j[j] = -1; } } } /*-------------------------------------------------------------------- * hypreGPUKernel_FSAITruncateCandidateUnordered * * Truncates the candidate pattern matrix (K). This function extracts * lower triangular portion of the matrix up to the largest * "max_nonzeros_row" coefficients in absolute value. * * Assumptions: * 1) max_nonzeros_row < warp_size. * * TODO: * 1) Use less than one warp per row when possible *--------------------------------------------------------------------*/ __global__ void hypreGPUKernel_FSAITruncateCandidateUnordered( hypre_DeviceItem &item, HYPRE_Int max_nonzeros_row, HYPRE_Int num_rows, HYPRE_Int *K_i, HYPRE_Int *K_e, HYPRE_Int *K_j, HYPRE_Complex *K_a ) { HYPRE_Int lane = hypre_gpu_get_lane_id<1>(item); HYPRE_Int p = 0; HYPRE_Int q = 0; HYPRE_Int ee, e, i, j, k, kk, cnt; hypre_mask bitmask; HYPRE_Complex val; HYPRE_Int max_lane; HYPRE_Int max_idx; HYPRE_Int max_col; HYPRE_Int colK; HYPRE_Complex valK; HYPRE_Complex max_val; HYPRE_Complex warp_max_val; /* Grid-stride loop over matrix rows */ for (i = hypre_gpu_get_grid_warp_id<1, 1>(item); i < num_rows; i += hypre_gpu_get_grid_num_warps<1, 1>(item)) { if (lane < 2) { p = read_only_load(K_i + i + lane); } q = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, p, 1, HYPRE_WARP_SIZE); p = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, p, 0, HYPRE_WARP_SIZE); k = 0; while (k < max_nonzeros_row) { /* Initialize variables */ j = p + k + lane; max_val = 0.0; max_idx = -1; /* Find maximum val/col pair in each lane */ if (j < q) { if (K_j[j] < i) { max_val = abs(K_a[j]); max_idx = j; } } for (j += HYPRE_WARP_SIZE; j < q; j += HYPRE_WARP_SIZE) { if (K_j[j] < i) { val = abs(K_a[j]); if (val > max_val) { max_val = val; max_idx = j; } } } /* Find maximum coefficient in absolute value in the warp */ warp_max_val = warp_allreduce_max(item, max_val); /* Reorder col/val entries associated with warp_max_val */ bitmask = hypre_ballot_sync(item, HYPRE_WARP_FULL_MASK, warp_max_val == max_val); if (warp_max_val > 0.0) { cnt = min(hypre_popc(bitmask), max_nonzeros_row - k); for (kk = 0; kk < cnt; kk++) { /* warp_sync(item); */ max_lane = hypre_ffs(bitmask) - 1; if (lane == max_lane) { colK = K_j[p + k + kk]; valK = K_a[p + k + kk]; max_col = K_j[max_idx]; if (k + kk == 0) { K_j[p] = max_col; K_a[p] = max_val; K_j[max_idx] = colK; K_a[max_idx] = valK; } else { if (max_col > K_j[p + k + kk - 1]) { /* Insert from the right */ K_j[p + k + kk] = max_col; K_a[p + k + kk] = max_val; K_j[max_idx] = colK; K_a[max_idx] = valK; } else if (max_col < K_j[p]) { /* Insert from the left */ for (ee = k + kk; ee > 0; ee--) { K_j[p + ee] = K_j[p + ee - 1]; K_a[p + ee] = K_a[p + ee - 1]; } K_j[p] = max_col; K_a[p] = max_val; if (max_idx > p + k + kk) { K_j[max_idx] = colK; K_a[max_idx] = valK; } } else { /* Insert in the middle */ for (e = k + kk - 1; e >= 0; e--) { if (K_j[p + e] < max_col) { for (ee = k + kk - 1; ee > e; ee--) { K_j[p + ee + 1] = K_j[p + ee]; K_a[p + ee + 1] = K_a[p + ee]; } K_j[p + e + 1] = max_col; K_a[p + e + 1] = max_val; if (max_idx > p + k + kk) { K_j[max_idx] = colK; K_a[max_idx] = valK; } break; } } } } } /* Update bitmask */ bitmask = hypre_mask_flip_at(bitmask, max_lane); } /* Update number of nonzeros per row */ k += cnt; } else { break; } } /* Set pointer to the end of this row */ if (lane == 0) { K_e[i] = p + k; } } } /*-------------------------------------------------------------------------- * hypre_BatchedGaussJordanSolveDevice * * Solve dense linear systems with less than 32 unknowns via Gauss-Jordan * elimination. *--------------------------------------------------------------------------*/ HYPRE_Int hypre_BatchedGaussJordanSolveDevice( HYPRE_Int batch_num_items, HYPRE_Int batch_dim, HYPRE_Complex *mat_data, HYPRE_Complex *rhs_data, HYPRE_Complex *sol_data ) { if (batch_dim > 31) { hypre_error_w_msg(HYPRE_ERROR_GENERIC, "Error: cannot solve for local systems larger than 31."); return hypre_error_flag; } /* Assign one linear system per thread block*/ dim3 bDim = hypre_dim3(batch_dim, batch_dim + 1, 1); dim3 gDim = hypre_dim3(batch_num_items, 1, 1); HYPRE_Int shared_mem_size = (sizeof(HYPRE_Complex) * ((batch_dim + 1) * batch_dim + 2) + sizeof(HYPRE_Int) * 2); HYPRE_GPU_LAUNCH2(hypreGPUKernel_BatchedGaussJordanSolve, gDim, bDim, shared_mem_size, batch_num_items, batch_dim, mat_data, rhs_data, sol_data); return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_FSAIExtractSubSystemsDevice * * TODO (VPM): This could be a hypre_CSRMatrix routine *--------------------------------------------------------------------------*/ HYPRE_Int hypre_FSAIExtractSubSystemsDevice( HYPRE_Int num_rows, HYPRE_Int *A_i, HYPRE_Int *A_j, HYPRE_Complex *A_a, HYPRE_Int *P_i, HYPRE_Int *P_e, HYPRE_Int *P_j, HYPRE_Int batch_dim, HYPRE_Complex *mat_data, HYPRE_Complex *rhs_data, HYPRE_Int *G_r ) { /* trivial case */ if (num_rows <= 0) { return hypre_error_flag; } dim3 bDim = hypre_GetDefaultDeviceBlockDimension(); dim3 gDim = hypre_GetDefaultDeviceGridDimension(num_rows, "warp", bDim); HYPRE_GPU_LAUNCH( hypreGPUKernel_FSAIExtractSubSystems, gDim, bDim, num_rows, A_i, A_j, A_a, P_i, P_e, P_j, batch_dim, mat_data, rhs_data, G_r ); return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_FSAIScalingDevice *--------------------------------------------------------------------------*/ HYPRE_Int hypre_FSAIScalingDevice( HYPRE_Int num_rows, HYPRE_Int batch_dim, HYPRE_Complex *sol_data, HYPRE_Complex *rhs_data, HYPRE_Complex *scaling, HYPRE_Int *info ) { /* trivial case */ if (num_rows <= 0) { return hypre_error_flag; } dim3 bDim = hypre_GetDefaultDeviceBlockDimension(); dim3 gDim = hypre_GetDefaultDeviceGridDimension(num_rows, "thread", bDim); HYPRE_GPU_LAUNCH( hypreGPUKernel_FSAIScaling, gDim, bDim, num_rows, batch_dim, sol_data, rhs_data, scaling, info ); return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_FSAIGatherEntriesDevice *--------------------------------------------------------------------------*/ HYPRE_Int hypre_FSAIGatherEntriesDevice( HYPRE_Int num_rows, HYPRE_Int batch_dim, HYPRE_Complex *sol_data, HYPRE_Complex *scaling, HYPRE_Int *K_i, HYPRE_Int *K_e, HYPRE_Int *K_j, HYPRE_Int *G_i, HYPRE_Int *G_j, HYPRE_Complex *G_a ) { /* trivial case */ if (num_rows <= 0) { return hypre_error_flag; } dim3 bDim = hypre_GetDefaultDeviceBlockDimension(); dim3 gDim = hypre_GetDefaultDeviceGridDimension(num_rows, "thread", bDim); HYPRE_GPU_LAUNCH( hypreGPUKernel_FSAIGatherEntries, gDim, bDim, num_rows, batch_dim, sol_data, scaling, K_i, K_e, K_j, G_i, G_j, G_a ); return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_FSAITruncateCandidateDevice *--------------------------------------------------------------------------*/ HYPRE_Int hypre_FSAITruncateCandidateDevice( hypre_CSRMatrix *matrix, HYPRE_Int **matrix_e, HYPRE_Int max_nonzeros_row ) { HYPRE_Int num_rows = hypre_CSRMatrixNumRows(matrix); HYPRE_Int *mat_i = hypre_CSRMatrixI(matrix); HYPRE_Int *mat_j = hypre_CSRMatrixJ(matrix); HYPRE_Complex *mat_a = hypre_CSRMatrixData(matrix); HYPRE_Int *mat_e; /* Sanity check */ if (num_rows <= 0) { *matrix_e = NULL; return hypre_error_flag; } /*----------------------------------------------------- * Keep only the largest coefficients in absolute value *-----------------------------------------------------*/ /* Allocate memory for row indices array */ hypre_GpuProfilingPushRange("Storage1"); mat_e = hypre_TAlloc(HYPRE_Int, num_rows, HYPRE_MEMORY_DEVICE); hypre_GpuProfilingPopRange(); /* Mark unwanted entries with -1 */ dim3 bDim = hypre_GetDefaultDeviceBlockDimension(); dim3 gDim = hypre_GetDefaultDeviceGridDimension(num_rows, "warp", bDim); hypre_GpuProfilingPushRange("TruncCand"); HYPRE_GPU_LAUNCH(hypreGPUKernel_FSAITruncateCandidateUnordered, gDim, bDim, max_nonzeros_row, num_rows, mat_i, mat_e, mat_j, mat_a ); hypre_GpuProfilingPopRange(); *matrix_e = mat_e; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_FSAISetupStaticPowerDevice *--------------------------------------------------------------------------*/ HYPRE_Int hypre_FSAISetupStaticPowerDevice( void *fsai_vdata, hypre_ParCSRMatrix *A, hypre_ParVector *f, hypre_ParVector *u ) { HYPRE_UNUSED_VAR(f); HYPRE_UNUSED_VAR(u); hypre_ParFSAIData *fsai_data = (hypre_ParFSAIData*) fsai_vdata; hypre_ParCSRMatrix *G = hypre_ParFSAIDataGmat(fsai_data); hypre_CSRMatrix *G_diag = hypre_ParCSRMatrixDiag(G); HYPRE_Int local_solve_type = hypre_ParFSAIDataLocalSolveType(fsai_data); HYPRE_Int max_nnz_row = hypre_ParFSAIDataMaxNnzRow(fsai_data); HYPRE_Int num_levels = hypre_ParFSAIDataNumLevels(fsai_data); HYPRE_Real threshold = hypre_ParFSAIDataThreshold(fsai_data); hypre_CSRMatrix *A_diag = hypre_ParCSRMatrixDiag(A); HYPRE_Int num_rows = hypre_CSRMatrixNumRows(A_diag); HYPRE_Int block_size = max_nnz_row * max_nnz_row; HYPRE_Int num_nonzeros_G; HYPRE_Complex **sol_aop = NULL; HYPRE_Complex **mat_aop = NULL; hypre_ParCSRMatrix *Atilde; hypre_ParCSRMatrix *B; hypre_ParCSRMatrix *Ktilde; hypre_CSRMatrix *K_diag; HYPRE_Int *K_e = NULL; HYPRE_Int i; /* Local linear solve data */ #if defined (HYPRE_USING_MAGMA) magma_queue_t queue = hypre_HandleMagmaQueue(hypre_handle()); #endif #if defined (HYPRE_USING_CUSOLVER) || defined (HYPRE_USING_ROCSOLVER) vendorSolverHandle_t vs_handle = hypre_HandleVendorSolverHandle(hypre_handle()); #endif /* TODO: Move to fsai_data? */ HYPRE_Complex *scaling; HYPRE_Int *info; HYPRE_Int *h_info; /* Error code array for FSAI */ info = hypre_CTAlloc(HYPRE_Int, num_rows, HYPRE_MEMORY_DEVICE); h_info = hypre_TAlloc(HYPRE_Int, num_rows, HYPRE_MEMORY_HOST); /*----------------------------------------------------- * Sanity checks *-----------------------------------------------------*/ /* Check local linear solve algorithm */ if (local_solve_type == 1) { #if !(defined (HYPRE_USING_CUSOLVER) || defined(HYPRE_USING_ROCSOLVER)) hypre_error_w_msg(HYPRE_ERROR_GENERIC, "local_solve_type == 1 requires cuSOLVER (CUDA) or rocSOLVER (HIP)\n"); return hypre_error_flag; #endif } else if (local_solve_type == 2) { #if !defined (HYPRE_USING_MAGMA) hypre_error_w_msg(HYPRE_ERROR_GENERIC, "local_solve_type == 2 requires MAGMA\n"); return hypre_error_flag; #endif } else if (local_solve_type == 0) { if (max_nnz_row > 31) { hypre_ParFSAIDataMaxNnzRow(fsai_data) = max_nnz_row = 31; } } else { hypre_error_w_msg(HYPRE_ERROR_GENERIC, "Unknown local linear solve type!\n"); return hypre_error_flag; } /*----------------------------------------------------- * Compute candidate pattern *-----------------------------------------------------*/ hypre_GpuProfilingPushRange("CandPat"); /* Compute filtered version of A */ Atilde = hypre_ParCSRMatrixClone(A, 1); /* Pre-filter to reduce SpGEMM cost */ if (num_levels > 1) { hypre_ParCSRMatrixDropSmallEntriesDevice(Atilde, threshold, 2); } /* TODO: Check if Atilde is diagonal */ /* Compute power pattern */ switch (num_levels) { case 1: Ktilde = Atilde; break; case 2: Ktilde = hypre_ParCSRMatMatDevice(Atilde, Atilde); break; case 3: /* First pass */ B = hypre_ParCSRMatMatDevice(Atilde, Atilde); /* Second pass */ Ktilde = hypre_ParCSRMatMatDevice(Atilde, B); hypre_ParCSRMatrixDestroy(B); break; case 4: /* First pass */ B = hypre_ParCSRMatMatDevice(Atilde, Atilde); hypre_ParCSRMatrixDropSmallEntriesDevice(B, threshold, 2); /* Second pass */ Ktilde = hypre_ParCSRMatMatDevice(B, B); hypre_ParCSRMatrixDestroy(B); break; default: Ktilde = hypre_ParCSRMatrixClone(Atilde, 1); for (i = 1; i < num_levels; i++) { /* Compute temporary matrix */ B = hypre_ParCSRMatMatDevice(Atilde, Ktilde); /* Update resulting matrix */ hypre_ParCSRMatrixDestroy(Ktilde); Ktilde = hypre_ParCSRMatrixClone(B, 1); } } hypre_GpuProfilingPopRange(); /*----------------------------------------------------- * Filter candidate pattern *-----------------------------------------------------*/ hypre_GpuProfilingPushRange("FilterPat"); #if defined (DEBUG_FSAI) { hypre_ParCSRMatrixPrintIJ(Ktilde, 0, 0, "FSAI.out.H.ij"); } #endif /* Set pattern matrix diagonal matrix */ K_diag = hypre_ParCSRMatrixDiag(Ktilde); /* Filter candidate pattern */ hypre_FSAITruncateCandidateDevice(K_diag, &K_e, max_nnz_row); #if defined (DEBUG_FSAI) { hypre_ParCSRMatrixPrintIJ(Ktilde, 0, 0, "FSAI.out.K.ij"); } #endif hypre_GpuProfilingPopRange(); /*----------------------------------------------------- * Preprocess input matrix *-----------------------------------------------------*/ hypre_GpuProfilingPushRange("PreProcessA"); /* TODO: implement faster diagonal extraction (use "i == A_j[A_i[i]]")*/ scaling = hypre_TAlloc(HYPRE_Complex, num_rows, HYPRE_MEMORY_DEVICE); hypre_CSRMatrixExtractDiagonalDevice(A_diag, scaling, 0); hypre_GpuProfilingPopRange(); /*----------------------------------------------------- * Extract local linear systems *-----------------------------------------------------*/ /* Allocate storage */ hypre_GpuProfilingPushRange("Storage1"); HYPRE_Complex *mat_data = hypre_CTAlloc(HYPRE_Complex, block_size * num_rows, HYPRE_MEMORY_DEVICE); HYPRE_Complex *rhs_data = hypre_CTAlloc(HYPRE_Complex, max_nnz_row * num_rows, HYPRE_MEMORY_DEVICE); HYPRE_Complex *sol_data = hypre_CTAlloc(HYPRE_Complex, max_nnz_row * num_rows, HYPRE_MEMORY_DEVICE); hypre_GpuProfilingPopRange(); /* Gather dense linear subsystems */ hypre_GpuProfilingPushRange("ExtractLS"); hypre_FSAIExtractSubSystemsDevice(num_rows, hypre_CSRMatrixI(A_diag), hypre_CSRMatrixJ(A_diag), hypre_CSRMatrixData(A_diag), hypre_CSRMatrixI(K_diag), K_e, hypre_CSRMatrixJ(K_diag), max_nnz_row, mat_data, rhs_data, hypre_CSRMatrixI(G_diag) + 1); hypre_GpuProfilingPopRange(); /* Copy rhs to solution vector */ hypre_GpuProfilingPushRange("CopyRHS"); hypre_TMemcpy(sol_data, rhs_data, HYPRE_Complex, max_nnz_row * num_rows, HYPRE_MEMORY_DEVICE, HYPRE_MEMORY_DEVICE); hypre_GpuProfilingPopRange(); /* Build array of pointers */ if (local_solve_type != 0) { hypre_GpuProfilingPushRange("Storage2"); sol_aop = hypre_TAlloc(HYPRE_Complex *, num_rows, HYPRE_MEMORY_DEVICE); mat_aop = hypre_TAlloc(HYPRE_Complex *, num_rows, HYPRE_MEMORY_DEVICE); hypre_GpuProfilingPopRange(); hypre_GpuProfilingPushRange("FormAOP"); hypreDevice_ComplexArrayToArrayOfPtrs(num_rows, block_size, mat_data, mat_aop); hypreDevice_ComplexArrayToArrayOfPtrs(num_rows, max_nnz_row, sol_data, sol_aop); hypre_GpuProfilingPopRange(); } /*----------------------------------------------------- * Solve local linear systems *-----------------------------------------------------*/ hypre_GpuProfilingPushRange("BatchedSolve"); if (num_rows) { hypre_GpuProfilingPushRange("Factorization"); if (local_solve_type == 1) { #if defined (HYPRE_USING_CUSOLVER) HYPRE_CUSOLVER_CALL(cusolverDnDpotrfBatched(vs_handle, CUBLAS_FILL_MODE_LOWER, max_nnz_row, mat_aop, max_nnz_row, info, num_rows)); #elif defined (HYPRE_USING_ROCSOLVER) HYPRE_ROCSOLVER_CALL(rocsolver_dpotrf_batched(vs_handle, rocblas_fill_lower, max_nnz_row, mat_aop, max_nnz_row, info, num_rows)); #endif } else if (local_solve_type == 2) { #if defined (HYPRE_USING_MAGMA) HYPRE_MAGMA_CALL(magma_dpotrf_batched(MagmaLower, max_nnz_row, mat_aop, max_nnz_row, info, num_rows, queue)); #endif } hypre_GpuProfilingPopRange(); /* Factorization */ #if defined (HYPRE_DEBUG) hypre_TMemcpy(h_info, info, HYPRE_Int, num_rows, HYPRE_MEMORY_HOST, HYPRE_MEMORY_DEVICE); for (HYPRE_Int k = 0; k < num_rows; k++) { if (h_info[k] != 0) { hypre_printf("Cholesky factorization failed at system #%d, subrow %d\n", k, h_info[k]); } } #endif hypre_GpuProfilingPushRange("Solve"); if (local_solve_type == 0) { hypre_BatchedGaussJordanSolveDevice(num_rows, max_nnz_row, mat_data, rhs_data, sol_data); } else if (local_solve_type == 1) { #if defined (HYPRE_USING_CUSOLVER) HYPRE_CUSOLVER_CALL(cusolverDnDpotrsBatched(vs_handle, CUBLAS_FILL_MODE_LOWER, max_nnz_row, 1, mat_aop, max_nnz_row, sol_aop, max_nnz_row, info, num_rows)); #elif defined (HYPRE_USING_ROCSOLVER) HYPRE_ROCSOLVER_CALL(rocsolver_dpotrs_batched(vs_handle, rocblas_fill_lower, max_nnz_row, 1, mat_aop, max_nnz_row, sol_aop, max_nnz_row, num_rows)); #endif } else if (local_solve_type == 2) { #if defined (HYPRE_USING_MAGMA) HYPRE_MAGMA_CALL(magma_dpotrs_batched(MagmaLower, max_nnz_row, 1, mat_aop, max_nnz_row, sol_aop, max_nnz_row, num_rows, queue)); #endif } hypre_GpuProfilingPopRange(); /* Solve */ #if defined (HYPRE_DEBUG) hypre_TMemcpy(h_info, info, HYPRE_Int, num_rows, HYPRE_MEMORY_HOST, HYPRE_MEMORY_DEVICE); for (HYPRE_Int k = 0; k < num_rows; k++) { if (h_info[k] != 0) { hypre_printf("Cholesky solution failed at system #%d with code %d\n", k, h_info[k]); } } #endif } hypre_GpuProfilingPopRange(); /* BatchedSolve */ /*----------------------------------------------------- * Finalize construction of the triangular factor *-----------------------------------------------------*/ hypre_GpuProfilingPushRange("BuildFSAI"); /* Update scaling factor */ hypre_FSAIScalingDevice(num_rows, max_nnz_row, sol_data, rhs_data, scaling, info); /* Compute the row pointer G_i */ hypreDevice_IntegerInclusiveScan(num_rows + 1, hypre_CSRMatrixI(G_diag)); /* Get the actual number of nonzero coefficients of G_diag */ hypre_TMemcpy(&num_nonzeros_G, hypre_CSRMatrixI(G_diag) + num_rows, HYPRE_Int, 1, HYPRE_MEMORY_HOST, HYPRE_MEMORY_DEVICE); /* Update the nonzero count of matrix G */ hypre_CSRMatrixNumNonzeros(G_diag) = num_nonzeros_G; /* Set column indices and coefficients of G */ hypre_FSAIGatherEntriesDevice(num_rows, max_nnz_row, sol_data, scaling, hypre_CSRMatrixI(K_diag), K_e, hypre_CSRMatrixJ(K_diag), hypre_CSRMatrixI(G_diag), hypre_CSRMatrixJ(G_diag), hypre_CSRMatrixData(G_diag)); hypre_GpuProfilingPopRange(); /* TODO: Reallocate memory for G_j/G_a? */ /*----------------------------------------------------- * Free memory *-----------------------------------------------------*/ hypre_ParCSRMatrixDestroy(Ktilde); if (num_levels > 1) { hypre_ParCSRMatrixDestroy(Atilde); } /* TODO: can we free some of these earlier? */ hypre_TFree(K_e, HYPRE_MEMORY_DEVICE); hypre_TFree(rhs_data, HYPRE_MEMORY_DEVICE); hypre_TFree(sol_data, HYPRE_MEMORY_DEVICE); hypre_TFree(mat_data, HYPRE_MEMORY_DEVICE); hypre_TFree(sol_aop, HYPRE_MEMORY_DEVICE); hypre_TFree(mat_aop, HYPRE_MEMORY_DEVICE); hypre_TFree(scaling, HYPRE_MEMORY_DEVICE); hypre_TFree(info, HYPRE_MEMORY_DEVICE); hypre_TFree(h_info, HYPRE_MEMORY_HOST); return hypre_error_flag; } #endif /* if defined(HYPRE_USING_CUDA) || defined(HYPRE_USING_HIP) */ #if defined(HYPRE_USING_GPU) /*-------------------------------------------------------------------------- * hypre_FSAISetupDevice *--------------------------------------------------------------------------*/ HYPRE_Int hypre_FSAISetupDevice( void *fsai_vdata, hypre_ParCSRMatrix *A, hypre_ParVector *f, hypre_ParVector *u ) { hypre_ParFSAIData *fsai_data = (hypre_ParFSAIData*) fsai_vdata; HYPRE_Int algo_type = hypre_ParFSAIDataAlgoType(fsai_data); hypre_ParCSRMatrix *G = hypre_ParFSAIDataGmat(fsai_data); hypre_ParCSRMatrix *h_A; hypre_GpuProfilingPushRange("FSAISetup"); if (algo_type == 1 || algo_type == 2) { /* Initialize matrix G on host */ hypre_ParCSRMatrixInitialize_v2(G, HYPRE_MEMORY_HOST); /* Clone input matrix on host */ h_A = hypre_ParCSRMatrixClone_v2(A, 1, HYPRE_MEMORY_HOST); /* Compute FSAI factor on host */ switch (algo_type) { case 2: hypre_FSAISetupOMPDyn(fsai_vdata, h_A, f, u); break; default: hypre_FSAISetupNative(fsai_vdata, h_A, f, u); break; } /* Move FSAI factor G to device */ hypre_ParCSRMatrixMigrate(G, HYPRE_MEMORY_DEVICE); /* Destroy temporary data on host */ HYPRE_ParCSRMatrixDestroy(h_A); } else { #if defined(HYPRE_USING_CUDA) || defined(HYPRE_USING_HIP) /* Initialize matrix G on device */ hypre_ParCSRMatrixInitialize_v2(G, HYPRE_MEMORY_DEVICE); if (algo_type == 3) { hypre_FSAISetupStaticPowerDevice(fsai_vdata, A, f, u); } #else hypre_error_w_msg(HYPRE_ERROR_GENERIC, "Device FSAI not implemented for SYCL!\n"); #endif } hypre_GpuProfilingPopRange(); return hypre_error_flag; } #endif /* if defined(HYPRE_USING_GPU) */ hypre-2.33.0/src/parcsr_ls/par_fsai_setup.c000066400000000000000000001353401477326011500206710ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "_hypre_parcsr_ls.h" #include "_hypre_blas.h" #include "_hypre_lapack.h" /***************************************************************************** * * Routine for driving the setup phase of FSAI * ******************************************************************************/ /*-------------------------------------------------------------------------- * hypre_CSRMatrixExtractDenseMat * * Extract A[P, P] into a dense matrix. * * Parameters: * - A: The hypre_CSRMatrix whose submatrix will be extracted. * - A_sub: A patt_size^2 - sized array to hold the lower triangular of * the symmetric submatrix A[P, P]. * - pattern: A patt_size - sized array to hold the wanted rows/cols. * - marker: A work array of length equal to the number of columns in A. * All values should be -1. *--------------------------------------------------------------------------*/ HYPRE_Int hypre_CSRMatrixExtractDenseMat( hypre_CSRMatrix *A, hypre_Vector *A_sub, HYPRE_Int *pattern, HYPRE_Int patt_size, HYPRE_Int *marker ) { HYPRE_Int *A_i = hypre_CSRMatrixI(A); HYPRE_Int *A_j = hypre_CSRMatrixJ(A); HYPRE_Complex *A_a = hypre_CSRMatrixData(A); HYPRE_Complex *A_sub_data = hypre_VectorData(A_sub); /* Local variables */ HYPRE_Int cc, i, ii, j; // TODO: Do we need to reinitialize all entries? for (i = 0; i < hypre_VectorSize(A_sub); i++) { A_sub_data[i] = 0.0; } for (i = 0; i < patt_size; i++) { ii = pattern[i]; for (j = A_i[ii]; j < A_i[ii + 1]; j++) { if ((A_j[j] <= ii) && (cc = marker[A_j[j]]) >= 0) { A_sub_data[cc * patt_size + i] = A_a[j]; } } } return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_CSRMatrixExtractDenseRow * * Extract the dense subrow from a matrix (A[i, P]) * * Parameters: * - A: The hypre_CSRMatrix whose subrow will be extracted. * - A_subrow: The extracted subrow of A[i, P]. * - marker: A work array of length equal to the number of row in A. * Assumed to be set to all -1. * - row_num: which row index of A we want to extract data from. *--------------------------------------------------------------------------*/ HYPRE_Int hypre_CSRMatrixExtractDenseRow( hypre_CSRMatrix *A, hypre_Vector *A_subrow, HYPRE_Int *marker, HYPRE_Int row_num ) { HYPRE_Int *A_i = hypre_CSRMatrixI(A); HYPRE_Int *A_j = hypre_CSRMatrixJ(A); HYPRE_Complex *A_a = hypre_CSRMatrixData(A); HYPRE_Complex *sub_row_data = hypre_VectorData(A_subrow); /* Local variables */ HYPRE_Int j, cc; for (j = 0; j < hypre_VectorSize(A_subrow); j++) { sub_row_data[j] = 0.0; } for (j = A_i[row_num]; j < A_i[row_num + 1]; j++) { if ((cc = marker[A_j[j]]) >= 0) { sub_row_data[cc] = A_a[j]; } } return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_FindKapGrad * * Finding the Kaporin Gradient contribution (psi) of a given row. * * Parameters: * - A: CSR matrix diagonal of A. * - kap_grad: Array holding the kaporin gradient. * This will we modified. * - kg_pos: Array of the nonzero column indices of kap_grad. * To be modified. * - G_temp: Work array of G for row i. * - pattern: Array of column indices of the nonzeros of G_temp. * - patt_size: Number of column indices of the nonzeros of G_temp. * - max_row_size: To ensure we don't overfill kap_grad. * - row_num: Which row of G we are working on. * - marker: Array of length equal to the number of rows in A. * Assumed to all be set to -1. *--------------------------------------------------------------------------*/ HYPRE_Int hypre_FindKapGrad( hypre_CSRMatrix *A_diag, hypre_Vector *kap_grad, HYPRE_Int *kg_pos, hypre_Vector *G_temp, HYPRE_Int *pattern, HYPRE_Int patt_size, HYPRE_Int max_row_size, HYPRE_Int row_num, HYPRE_Int *kg_marker ) { HYPRE_UNUSED_VAR(max_row_size); HYPRE_Int *A_i = hypre_CSRMatrixI(A_diag); HYPRE_Int *A_j = hypre_CSRMatrixJ(A_diag); HYPRE_Complex *A_a = hypre_CSRMatrixData(A_diag); HYPRE_Complex *G_temp_data = hypre_VectorData(G_temp); HYPRE_Complex *kap_grad_data = hypre_VectorData(kap_grad); /* Local Variables */ HYPRE_Int i, ii, j, k, count, col; count = 0; /* Compute A[row_num, 0:(row_num-1)]*G_temp[i,i] */ for (j = A_i[row_num]; j < A_i[row_num + 1]; j++) { col = A_j[j]; if (col < row_num) { if (kg_marker[col] > -1) { /* Add A[row_num, col] to the tentative pattern */ kg_marker[col] = count + 1; kg_pos[count] = col; kap_grad_data[count] = A_a[j]; count++; } } } /* Compute A[0:(row_num-1), P]*G_temp[P, i] */ for (i = 0; i < patt_size; i++) { ii = pattern[i]; for (j = A_i[ii]; j < A_i[ii + 1]; j++) { col = A_j[j]; if (col < row_num) { k = kg_marker[col]; if (k == 0) { /* New entry in the tentative pattern */ kg_marker[col] = count + 1; kg_pos[count] = col; kap_grad_data[count] = G_temp_data[i] * A_a[j]; count++; } else if (k > 0) { /* Already existing entry in the tentative pattern */ kap_grad_data[k - 1] += G_temp_data[i] * A_a[j]; } } } } /* Update number of nonzero coefficients held in kap_grad */ hypre_VectorSize(kap_grad) = count; /* Update to absolute values */ for (i = 0; i < count; i++) { kap_grad_data[i] = hypre_cabs(kap_grad_data[i]); } return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_swap2_ci *--------------------------------------------------------------------------*/ void hypre_swap2_ci( HYPRE_Complex *v, HYPRE_Int *w, HYPRE_Int i, HYPRE_Int j ) { HYPRE_Complex temp; HYPRE_Int temp2; temp = v[i]; v[i] = v[j]; v[j] = temp; temp2 = w[i]; w[i] = w[j]; w[j] = temp2; } /*-------------------------------------------------------------------------- * hypre_qsort2_ci * * Quick Sort (largest to smallest) for complex arrays. * Sort on real portion of v (HYPRE_Complex), move w. *--------------------------------------------------------------------------*/ void hypre_qsort2_ci( HYPRE_Complex *v, HYPRE_Int *w, HYPRE_Int left, HYPRE_Int right ) { HYPRE_Int i, last; if (left >= right) { return; } hypre_swap2_ci(v, w, left, (left + right) / 2); last = left; for (i = left + 1; i <= right; i++) { if (hypre_creal(v[i]) > hypre_creal(v[left])) { hypre_swap2_ci(v, w, ++last, i); } } hypre_swap2_ci(v, w, left, last); hypre_qsort2_ci(v, w, left, last - 1); hypre_qsort2_ci(v, w, last + 1, right); } /*-------------------------------------------------------------------------- * hypre_PartialSelectSortCI *--------------------------------------------------------------------------*/ HYPRE_Int hypre_PartialSelectSortCI( HYPRE_Complex *v, HYPRE_Int *w, HYPRE_Int size, HYPRE_Int nentries ) { HYPRE_Int i, k, pos; for (k = 0; k < nentries; k++) { /* Find largest kth entry */ pos = k; for (i = k + 1; i < size; i++) { if (hypre_creal(v[i]) > hypre_creal(v[pos])) { pos = i; } } /* Move entry to beggining of the array */ hypre_swap2_ci(v, w, k, pos); } return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_AddToPattern * * Take the largest elements from the kaporin gradient and add their * locations to pattern. *--------------------------------------------------------------------------*/ HYPRE_Int hypre_AddToPattern( hypre_Vector *kap_grad, HYPRE_Int *kg_pos, HYPRE_Int *pattern, HYPRE_Int *patt_size, HYPRE_Int *kg_marker, HYPRE_Int max_step_size ) { HYPRE_Int kap_grad_size = hypre_VectorSize(kap_grad); HYPRE_Complex *kap_grad_data = hypre_VectorData(kap_grad); HYPRE_Int i, nentries; /* Number of entries that can be added */ nentries = hypre_min(kap_grad_size, max_step_size); /* Reorder candidates according to larger weights */ //hypre_qsort2_ci(kap_grad_data, &kg_pos, 0, kap_grad_size-1); hypre_PartialSelectSortCI(kap_grad_data, kg_pos, kap_grad_size, nentries); /* Update pattern with new entries */ for (i = 0; i < nentries; i++) { pattern[*patt_size + i] = kg_pos[i]; } *patt_size += nentries; /* Put pattern in ascending order */ hypre_qsort0(pattern, 0, (*patt_size) - 1); /* Reset marked entries that are added to pattern */ for (i = 0; i < nentries; i++) { kg_marker[kg_pos[i]] = -1; } for (i = nentries; i < kap_grad_size; i++) { kg_marker[kg_pos[i]] = 0; } return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_DenseSPDSystemSolve * * Solve the dense SPD linear system with LAPACK: * * mat*lhs = -rhs * * Note: the contents of A change to its Cholesky factor. *--------------------------------------------------------------------------*/ HYPRE_Int hypre_DenseSPDSystemSolve( hypre_Vector *mat, hypre_Vector *rhs, hypre_Vector *lhs ) { HYPRE_Int size = hypre_VectorSize(rhs); HYPRE_Complex *mat_data = hypre_VectorData(mat); HYPRE_Complex *rhs_data = hypre_VectorData(rhs); HYPRE_Complex *lhs_data = hypre_VectorData(lhs); /* Local variables */ HYPRE_Int num_rhs = 1; char uplo = 'L'; char msg[512]; HYPRE_Int i, info; /* Copy RHS into LHS */ for (i = 0; i < size; i++) { lhs_data[i] = -rhs_data[i]; } /* Compute Cholesky factor */ hypre_dpotrf(&uplo, &size, mat_data, &size, &info); if (info) { hypre_sprintf(msg, "Error: dpotrf failed with code %d\n", info); hypre_error_w_msg(HYPRE_ERROR_GENERIC, msg); return hypre_error_flag; } /* Solve dense linear system */ hypre_dpotrs(&uplo, &size, &num_rhs, mat_data, &size, lhs_data, &size, &info); if (info) { hypre_sprintf(msg, "Error: dpotrs failed with code %d\n", info); hypre_error_w_msg(HYPRE_ERROR_GENERIC, msg); return hypre_error_flag; } return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_FSAISetupNative *--------------------------------------------------------------------------*/ HYPRE_Int hypre_FSAISetupNative( void *fsai_vdata, hypre_ParCSRMatrix *A, hypre_ParVector *f, hypre_ParVector *u ) { HYPRE_UNUSED_VAR(f); HYPRE_UNUSED_VAR(u); /* Data structure variables */ hypre_ParFSAIData *fsai_data = (hypre_ParFSAIData*) fsai_vdata; HYPRE_Real kap_tolerance = hypre_ParFSAIDataKapTolerance(fsai_data); HYPRE_Int max_steps = hypre_ParFSAIDataMaxSteps(fsai_data); HYPRE_Int max_step_size = hypre_ParFSAIDataMaxStepSize(fsai_data); /* CSRMatrix A_diag variables */ hypre_CSRMatrix *A_diag = hypre_ParCSRMatrixDiag(A); HYPRE_Int *A_i = hypre_CSRMatrixI(A_diag); HYPRE_Complex *A_a = hypre_CSRMatrixData(A_diag); HYPRE_Int num_rows_diag_A = hypre_CSRMatrixNumRows(A_diag); /* Matrix G variables */ hypre_ParCSRMatrix *G = hypre_ParFSAIDataGmat(fsai_data); hypre_CSRMatrix *G_diag; HYPRE_Int *G_i; HYPRE_Int *G_j; HYPRE_Complex *G_a; HYPRE_Int max_nnzrow_diag_G; /* Max. number of nonzeros per row in G_diag */ /* Local variables */ char msg[512]; /* Warning message */ HYPRE_Int *twspace; /* shared work space for omp threads */ /* Initalize some variables */ max_nnzrow_diag_G = max_steps * max_step_size + 1; G_diag = hypre_ParCSRMatrixDiag(G); G_a = hypre_CSRMatrixData(G_diag); G_i = hypre_CSRMatrixI(G_diag); G_j = hypre_CSRMatrixJ(G_diag); /* Allocate shared work space array for OpenMP threads */ twspace = hypre_CTAlloc(HYPRE_Int, hypre_NumThreads() + 1, HYPRE_MEMORY_HOST); /********************************************************************** * Start of Adaptive FSAI algorithm ***********************************************************************/ /* Cycle through each of the local rows */ HYPRE_ANNOTATE_REGION_BEGIN("%s", "MainLoop"); #ifdef HYPRE_USING_OPENMP #pragma omp parallel #endif { hypre_Vector *G_temp; /* Vector holding the values of G[i,:] */ hypre_Vector *A_sub; /* Vector holding the dense submatrix A[P, P] */ hypre_Vector *A_subrow; /* Vector holding A[i, P] */ hypre_Vector *kap_grad; /* Vector holding the Kaporin gradient values */ HYPRE_Int *kg_pos; /* Indices of nonzero entries of kap_grad */ HYPRE_Int *kg_marker; /* Marker array with nonzeros pointing to kg_pos */ HYPRE_Int *marker; /* Marker array with nonzeros pointing to P */ HYPRE_Int *pattern; /* Array holding column indices of G[i,:] */ HYPRE_Int patt_size; /* Number of entries in current pattern */ HYPRE_Int patt_size_old; /* Number of entries in previous pattern */ HYPRE_Int ii; /* Thread identifier */ HYPRE_Int num_threads; /* Number of active threads */ HYPRE_Int ns, ne; /* Initial and last row indices */ HYPRE_Int i, j, k, iloc; /* Loop variables */ HYPRE_Complex old_psi; /* GAG' before k-th interation of aFSAI */ HYPRE_Complex new_psi; /* GAG' after k-th interation of aFSAI */ HYPRE_Complex row_scale; /* Scaling factor for G_temp */ HYPRE_Complex *G_temp_data; HYPRE_Complex *A_subrow_data; HYPRE_Int num_rows_Gloc; HYPRE_Int num_nnzs_Gloc; HYPRE_Int *Gloc_i; HYPRE_Int *Gloc_j; HYPRE_Complex *Gloc_a; /* Allocate and initialize local vector variables */ G_temp = hypre_SeqVectorCreate(max_nnzrow_diag_G); A_subrow = hypre_SeqVectorCreate(max_nnzrow_diag_G); kap_grad = hypre_SeqVectorCreate(num_rows_diag_A); A_sub = hypre_SeqVectorCreate(max_nnzrow_diag_G * max_nnzrow_diag_G); pattern = hypre_CTAlloc(HYPRE_Int, max_nnzrow_diag_G, HYPRE_MEMORY_HOST); kg_pos = hypre_CTAlloc(HYPRE_Int, num_rows_diag_A, HYPRE_MEMORY_HOST); kg_marker = hypre_CTAlloc(HYPRE_Int, num_rows_diag_A, HYPRE_MEMORY_HOST); marker = hypre_TAlloc(HYPRE_Int, num_rows_diag_A, HYPRE_MEMORY_HOST); hypre_SeqVectorInitialize_v2(G_temp, HYPRE_MEMORY_HOST); hypre_SeqVectorInitialize_v2(A_subrow, HYPRE_MEMORY_HOST); hypre_SeqVectorInitialize_v2(kap_grad, HYPRE_MEMORY_HOST); hypre_SeqVectorInitialize_v2(A_sub, HYPRE_MEMORY_HOST); hypre_Memset(marker, -1, num_rows_diag_A * sizeof(HYPRE_Int), HYPRE_MEMORY_HOST); /* Setting data variables for vectors */ G_temp_data = hypre_VectorData(G_temp); A_subrow_data = hypre_VectorData(A_subrow); ii = hypre_GetThreadNum(); num_threads = hypre_NumActiveThreads(); hypre_partition1D(num_rows_diag_A, num_threads, ii, &ns, &ne); num_rows_Gloc = ne - ns; if (num_threads == 1) { Gloc_i = G_i; Gloc_j = G_j; Gloc_a = G_a; } else { num_nnzs_Gloc = num_rows_Gloc * max_nnzrow_diag_G; Gloc_i = hypre_CTAlloc(HYPRE_Int, num_rows_Gloc + 1, HYPRE_MEMORY_HOST); Gloc_j = hypre_CTAlloc(HYPRE_Int, num_nnzs_Gloc, HYPRE_MEMORY_HOST); Gloc_a = hypre_CTAlloc(HYPRE_Complex, num_nnzs_Gloc, HYPRE_MEMORY_HOST); } for (i = ns; i < ne; i++) { patt_size = 0; /* Set old_psi up front so we don't have to compute GAG' twice in the inner for-loop */ new_psi = old_psi = A_a[A_i[i]]; /* Cycle through each iteration for that row */ for (k = 0; k < max_steps; k++) { /* Compute Kaporin Gradient */ hypre_FindKapGrad(A_diag, kap_grad, kg_pos, G_temp, pattern, patt_size, max_nnzrow_diag_G, i, kg_marker); /* Find max_step_size largest values of the kaporin gradient, find their column indices, and add it to pattern */ patt_size_old = patt_size; hypre_AddToPattern(kap_grad, kg_pos, pattern, &patt_size, kg_marker, max_step_size); /* Update sizes */ hypre_VectorSize(A_sub) = patt_size * patt_size; hypre_VectorSize(A_subrow) = patt_size; hypre_VectorSize(G_temp) = patt_size; if (patt_size == patt_size_old) { new_psi = old_psi; break; } else { /* Gather A[P, P] and -A[i, P] */ for (j = 0; j < patt_size; j++) { marker[pattern[j]] = j; } hypre_CSRMatrixExtractDenseMat(A_diag, A_sub, pattern, patt_size, marker); hypre_CSRMatrixExtractDenseRow(A_diag, A_subrow, marker, i); /* Solve A[P, P] G[i, P]' = -A[i, P] */ hypre_DenseSPDSystemSolve(A_sub, A_subrow, G_temp); /* Determine psi_{k+1} = G_temp[i] * A[P, P] * G_temp[i]' */ new_psi = A_a[A_i[i]]; for (j = 0; j < patt_size; j++) { new_psi += G_temp_data[j] * A_subrow_data[j]; } /* Check psi reduction */ if (hypre_cabs(new_psi - old_psi) < hypre_creal(kap_tolerance * old_psi)) { break; } else { old_psi = new_psi; } } } /* Reset marker for building dense linear system */ for (j = 0; j < patt_size; j++) { marker[pattern[j]] = -1; } /* Compute scaling factor */ if (hypre_creal(new_psi) > 0 && hypre_cimag(new_psi) == 0) { row_scale = 1.0 / hypre_csqrt(new_psi); } else { hypre_sprintf(msg, "Warning: complex scaling factor found in row %d\n", i); hypre_error_w_msg(HYPRE_ERROR_GENERIC, msg); row_scale = 1.0 / hypre_cabs(A_a[A_i[i]]); hypre_VectorSize(G_temp) = patt_size = 0; } /* Pass values of G_temp into G */ iloc = i - ns; Gloc_j[Gloc_i[iloc]] = i; Gloc_a[Gloc_i[iloc]] = row_scale; for (k = 0; k < patt_size; k++) { j = Gloc_i[iloc] + k + 1; Gloc_j[j] = pattern[k]; Gloc_a[j] = row_scale * G_temp_data[k]; kg_marker[pattern[k]] = 0; } Gloc_i[iloc + 1] = Gloc_i[iloc] + k + 1; } /* Copy data to shared memory */ twspace[ii + 1] = Gloc_i[num_rows_Gloc] - Gloc_i[0]; #ifdef HYPRE_USING_OPENMP #pragma omp barrier #pragma omp single #endif { for (i = 0; i < num_threads; i++) { twspace[i + 1] += twspace[i]; } } if (num_threads > 1) { /* Correct row pointer G_i */ G_i[ns] = twspace[ii]; for (i = ns; i < ne; i++) { iloc = i - ns; G_i[i + 1] = G_i[i] + Gloc_i[iloc + 1] - Gloc_i[iloc]; } /* Move G_j and G_a */ for (i = ns; i < ne; i++) { for (j = G_i[i]; j < G_i[i + 1]; j++) { G_j[j] = Gloc_j[j - G_i[ns]]; G_a[j] = Gloc_a[j - G_i[ns]]; } } hypre_TFree(Gloc_i, HYPRE_MEMORY_HOST); hypre_TFree(Gloc_j, HYPRE_MEMORY_HOST); hypre_TFree(Gloc_a, HYPRE_MEMORY_HOST); } /* Free memory */ hypre_SeqVectorDestroy(G_temp); hypre_SeqVectorDestroy(A_subrow); hypre_SeqVectorDestroy(kap_grad); hypre_SeqVectorDestroy(A_sub); hypre_TFree(kg_pos, HYPRE_MEMORY_HOST); hypre_TFree(pattern, HYPRE_MEMORY_HOST); hypre_TFree(marker, HYPRE_MEMORY_HOST); hypre_TFree(kg_marker, HYPRE_MEMORY_HOST); } /* end openmp region */ HYPRE_ANNOTATE_REGION_END("%s", "MainLoop"); /* Free memory */ hypre_TFree(twspace, HYPRE_MEMORY_HOST); /* Update local number of nonzeros of G */ hypre_CSRMatrixNumNonzeros(G_diag) = G_i[num_rows_diag_A]; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_FSAISetupOMPDyn *--------------------------------------------------------------------------*/ HYPRE_Int hypre_FSAISetupOMPDyn( void *fsai_vdata, hypre_ParCSRMatrix *A, hypre_ParVector *f, hypre_ParVector *u ) { HYPRE_UNUSED_VAR(f); HYPRE_UNUSED_VAR(u); /* Data structure variables */ hypre_ParFSAIData *fsai_data = (hypre_ParFSAIData*) fsai_vdata; HYPRE_Real kap_tolerance = hypre_ParFSAIDataKapTolerance(fsai_data); HYPRE_Int max_steps = hypre_ParFSAIDataMaxSteps(fsai_data); HYPRE_Int max_step_size = hypre_ParFSAIDataMaxStepSize(fsai_data); /* CSRMatrix A_diag variables */ hypre_CSRMatrix *A_diag = hypre_ParCSRMatrixDiag(A); HYPRE_Int *A_i = hypre_CSRMatrixI(A_diag); HYPRE_Complex *A_a = hypre_CSRMatrixData(A_diag); HYPRE_Int num_rows_diag_A = hypre_CSRMatrixNumRows(A_diag); /* Matrix G variables */ hypre_ParCSRMatrix *G = hypre_ParFSAIDataGmat(fsai_data); hypre_CSRMatrix *G_diag; HYPRE_Int *G_i; HYPRE_Int *G_j; HYPRE_Complex *G_a; HYPRE_Int *G_nnzcnt; /* Array holding number of nonzeros of row G[i,:] */ HYPRE_Int max_nnzrow_diag_G; /* Max. number of nonzeros per row in G_diag */ /* Local variables */ HYPRE_Int i, j, jj; char msg[512]; /* Warning message */ HYPRE_Complex *twspace; /* shared work space for omp threads */ /* Initalize some variables */ max_nnzrow_diag_G = max_steps * max_step_size + 1; G_diag = hypre_ParCSRMatrixDiag(G); G_a = hypre_CSRMatrixData(G_diag); G_i = hypre_CSRMatrixI(G_diag); G_j = hypre_CSRMatrixJ(G_diag); G_nnzcnt = hypre_CTAlloc(HYPRE_Int, num_rows_diag_A, HYPRE_MEMORY_HOST); /* Allocate shared work space array for OpenMP threads */ twspace = hypre_CTAlloc(HYPRE_Complex, hypre_NumThreads() + 1, HYPRE_MEMORY_HOST); /********************************************************************** * Start of Adaptive FSAI algorithm ***********************************************************************/ /* Cycle through each of the local rows */ HYPRE_ANNOTATE_REGION_BEGIN("%s", "MainLoop"); #ifdef HYPRE_USING_OPENMP #pragma omp parallel #endif { hypre_Vector *G_temp; /* Vector holding the values of G[i,:] */ hypre_Vector *A_sub; /* Vector holding the dense submatrix A[P, P] */ hypre_Vector *A_subrow; /* Vector holding A[i, P] */ hypre_Vector *kap_grad; /* Vector holding the Kaporin gradient values */ HYPRE_Int *kg_pos; /* Indices of nonzero entries of kap_grad */ HYPRE_Int *kg_marker; /* Marker array with nonzeros pointing to kg_pos */ HYPRE_Int *marker; /* Marker array with nonzeros pointing to P */ HYPRE_Int *pattern; /* Array holding column indices of G[i,:] */ HYPRE_Int patt_size; /* Number of entries in current pattern */ HYPRE_Int patt_size_old; /* Number of entries in previous pattern */ HYPRE_Int i, j, k; /* Loop variables */ HYPRE_Complex old_psi; /* GAG' before k-th interation of aFSAI */ HYPRE_Complex new_psi; /* GAG' after k-th interation of aFSAI */ HYPRE_Complex row_scale; /* Scaling factor for G_temp */ HYPRE_Complex *G_temp_data; HYPRE_Complex *A_subrow_data; /* Allocate and initialize local vector variables */ G_temp = hypre_SeqVectorCreate(max_nnzrow_diag_G); A_subrow = hypre_SeqVectorCreate(max_nnzrow_diag_G); kap_grad = hypre_SeqVectorCreate(num_rows_diag_A); A_sub = hypre_SeqVectorCreate(max_nnzrow_diag_G * max_nnzrow_diag_G); pattern = hypre_CTAlloc(HYPRE_Int, max_nnzrow_diag_G, HYPRE_MEMORY_HOST); kg_pos = hypre_CTAlloc(HYPRE_Int, num_rows_diag_A, HYPRE_MEMORY_HOST); kg_marker = hypre_CTAlloc(HYPRE_Int, num_rows_diag_A, HYPRE_MEMORY_HOST); marker = hypre_TAlloc(HYPRE_Int, num_rows_diag_A, HYPRE_MEMORY_HOST); hypre_SeqVectorInitialize_v2(G_temp, HYPRE_MEMORY_HOST); hypre_SeqVectorInitialize_v2(A_subrow, HYPRE_MEMORY_HOST); hypre_SeqVectorInitialize_v2(kap_grad, HYPRE_MEMORY_HOST); hypre_SeqVectorInitialize_v2(A_sub, HYPRE_MEMORY_HOST); hypre_Memset(marker, -1, num_rows_diag_A * sizeof(HYPRE_Int), HYPRE_MEMORY_HOST); /* Setting data variables for vectors */ G_temp_data = hypre_VectorData(G_temp); A_subrow_data = hypre_VectorData(A_subrow); #ifdef HYPRE_USING_OPENMP #pragma omp for schedule(dynamic) #endif for (i = 0; i < num_rows_diag_A; i++) { patt_size = 0; /* Set old_psi up front so we don't have to compute GAG' twice in the inner for-loop */ new_psi = old_psi = A_a[A_i[i]]; /* Cycle through each iteration for that row */ for (k = 0; k < max_steps; k++) { /* Compute Kaporin Gradient */ hypre_FindKapGrad(A_diag, kap_grad, kg_pos, G_temp, pattern, patt_size, max_nnzrow_diag_G, i, kg_marker); /* Find max_step_size largest values of the kaporin gradient, find their column indices, and add it to pattern */ patt_size_old = patt_size; hypre_AddToPattern(kap_grad, kg_pos, pattern, &patt_size, kg_marker, max_step_size); /* Update sizes */ hypre_VectorSize(A_sub) = patt_size * patt_size; hypre_VectorSize(A_subrow) = patt_size; hypre_VectorSize(G_temp) = patt_size; if (patt_size == patt_size_old) { new_psi = old_psi; break; } else { /* Gather A[P, P] and -A[i, P] */ for (j = 0; j < patt_size; j++) { marker[pattern[j]] = j; } hypre_CSRMatrixExtractDenseMat(A_diag, A_sub, pattern, patt_size, marker); hypre_CSRMatrixExtractDenseRow(A_diag, A_subrow, marker, i); /* Solve A[P, P] G[i, P]' = -A[i, P] */ hypre_DenseSPDSystemSolve(A_sub, A_subrow, G_temp); /* Determine psi_{k+1} = G_temp[i] * A[P, P] * G_temp[i]' */ new_psi = A_a[A_i[i]]; for (j = 0; j < patt_size; j++) { new_psi += G_temp_data[j] * A_subrow_data[j]; } /* Check psi reduction */ if (hypre_cabs(new_psi - old_psi) < hypre_creal(kap_tolerance * old_psi)) { break; } else { old_psi = new_psi; } } } /* Reset marker for building dense linear system */ for (j = 0; j < patt_size; j++) { marker[pattern[j]] = -1; } /* Compute scaling factor */ if (hypre_creal(new_psi) > 0 && hypre_cimag(new_psi) == 0) { row_scale = 1.0 / hypre_csqrt(new_psi); } else { hypre_sprintf(msg, "Warning: complex scaling factor found in row %d\n", i); hypre_error_w_msg(HYPRE_ERROR_GENERIC, msg); row_scale = 1.0 / hypre_cabs(A_a[A_i[i]]); hypre_VectorSize(G_temp) = patt_size = 0; } /* Pass values of G_temp into G */ j = i * max_nnzrow_diag_G; G_j[j] = i; G_a[j] = row_scale; j++; for (k = 0; k < patt_size; k++) { G_j[j] = pattern[k]; G_a[j++] = row_scale * G_temp_data[k]; kg_marker[pattern[k]] = 0; } G_nnzcnt[i] = patt_size + 1; } /* omp for schedule(dynamic) */ /* Free memory */ hypre_SeqVectorDestroy(G_temp); hypre_SeqVectorDestroy(A_subrow); hypre_SeqVectorDestroy(kap_grad); hypre_SeqVectorDestroy(A_sub); hypre_TFree(kg_pos, HYPRE_MEMORY_HOST); hypre_TFree(pattern, HYPRE_MEMORY_HOST); hypre_TFree(marker, HYPRE_MEMORY_HOST); hypre_TFree(kg_marker, HYPRE_MEMORY_HOST); } /* end openmp region */ HYPRE_ANNOTATE_REGION_END("%s", "MainLoop"); /* Reorder array */ G_i[0] = 0; for (i = 0; i < num_rows_diag_A; i++) { G_i[i + 1] = G_i[i] + G_nnzcnt[i]; jj = i * max_nnzrow_diag_G; for (j = G_i[i]; j < G_i[i + 1]; j++) { G_j[j] = G_j[jj]; G_a[j] = G_a[jj++]; } } /* Free memory */ hypre_TFree(twspace, HYPRE_MEMORY_HOST); hypre_TFree(G_nnzcnt, HYPRE_MEMORY_HOST); /* Update local number of nonzeros of G */ hypre_CSRMatrixNumNonzeros(G_diag) = G_i[num_rows_diag_A]; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_FSAISetup *--------------------------------------------------------------------------*/ HYPRE_Int hypre_FSAISetup( void *fsai_vdata, hypre_ParCSRMatrix *A, hypre_ParVector *f, hypre_ParVector *u ) { hypre_ParFSAIData *fsai_data = (hypre_ParFSAIData*) fsai_vdata; HYPRE_Int max_steps = hypre_ParFSAIDataMaxSteps(fsai_data); HYPRE_Int max_step_size = hypre_ParFSAIDataMaxStepSize(fsai_data); HYPRE_Int max_nnz_row = hypre_ParFSAIDataMaxNnzRow(fsai_data); HYPRE_Int algo_type = hypre_ParFSAIDataAlgoType(fsai_data); HYPRE_Int print_level = hypre_ParFSAIDataPrintLevel(fsai_data); HYPRE_Int eig_max_iters = hypre_ParFSAIDataEigMaxIters(fsai_data); /* ParCSRMatrix A variables */ MPI_Comm comm = hypre_ParCSRMatrixComm(A); HYPRE_BigInt num_rows_A = hypre_ParCSRMatrixGlobalNumRows(A); HYPRE_BigInt num_cols_A = hypre_ParCSRMatrixGlobalNumCols(A); HYPRE_BigInt *row_starts_A = hypre_ParCSRMatrixRowStarts(A); HYPRE_BigInt *col_starts_A = hypre_ParCSRMatrixColStarts(A); /* CSRMatrix A_diag variables */ hypre_CSRMatrix *A_diag = hypre_ParCSRMatrixDiag(A); HYPRE_Int num_rows_diag_A = hypre_CSRMatrixNumRows(A_diag); /* Work vectors */ hypre_ParVector *r_work; hypre_ParVector *z_work; /* G variables */ hypre_ParCSRMatrix *G; HYPRE_Int max_nnzrow_diag_G; /* Max. number of nonzeros per row in G_diag */ HYPRE_Int max_nonzeros_diag_G; /* Max. number of nonzeros in G_diag */ /* Sanity check */ if (f && hypre_ParVectorNumVectors(f) > 1) { hypre_error_w_msg(HYPRE_ERROR_GENERIC, "FSAI doesn't support multicomponent vectors"); return hypre_error_flag; } HYPRE_ANNOTATE_FUNC_BEGIN; /* Create and initialize work vectors used in the solve phase */ r_work = hypre_ParVectorCreate(comm, num_rows_A, row_starts_A); z_work = hypre_ParVectorCreate(comm, num_rows_A, row_starts_A); hypre_ParVectorInitialize(r_work); hypre_ParVectorInitialize(z_work); hypre_ParFSAIDataRWork(fsai_data) = r_work; hypre_ParFSAIDataZWork(fsai_data) = z_work; /* Create the matrix G */ if (algo_type == 1 || algo_type == 2) { max_nnzrow_diag_G = max_steps * max_step_size + 1; } else { max_nnzrow_diag_G = max_nnz_row + 1; } max_nonzeros_diag_G = num_rows_diag_A * max_nnzrow_diag_G; G = hypre_ParCSRMatrixCreate(comm, num_rows_A, num_cols_A, row_starts_A, col_starts_A, 0, max_nonzeros_diag_G, 0); hypre_ParFSAIDataGmat(fsai_data) = G; /* Initialize and compute lower triangular factor G */ #if defined(HYPRE_USING_CUDA) || defined(HYPRE_USING_HIP) HYPRE_MemoryLocation memloc_A = hypre_ParCSRMatrixMemoryLocation(A); HYPRE_ExecutionPolicy exec = hypre_GetExecPolicy1(memloc_A); if (exec == HYPRE_EXEC_DEVICE) { hypre_FSAISetupDevice(fsai_vdata, A, f, u); } else #endif { /* Initialize matrix */ hypre_ParCSRMatrixInitialize(G); switch (algo_type) { case 1: // TODO: Change name to hypre_FSAISetupAdaptive hypre_FSAISetupNative(fsai_vdata, A, f, u); break; case 2: // TODO: Change name to hypre_FSAISetupAdaptiveOMPDynamic hypre_FSAISetupOMPDyn(fsai_vdata, A, f, u); break; default: hypre_FSAISetupNative(fsai_vdata, A, f, u); break; } } /* Compute G^T */ G = hypre_ParFSAIDataGmat(fsai_data); hypre_ParCSRMatrixTranspose(G, &hypre_ParFSAIDataGTmat(fsai_data), 1); /* Update omega if requested */ if (eig_max_iters) { hypre_FSAIComputeOmega(fsai_vdata, A); } /* Print setup info */ if (print_level == 1) { hypre_FSAIPrintStats(fsai_data, A); } else if (print_level > 2) { char filename[] = "FSAI.out.G.ij"; hypre_ParCSRMatrixPrintIJ(G, 0, 0, filename); } #if defined (DEBUG_FSAI) #if !defined (HYPRE_USING_GPU) || (defined (HYPRE_USING_GPU) && defined (HYPRE_USING_UNIFIED_MEMORY)) hypre_FSAIDumpLocalLSDense(fsai_vdata, "fsai_dense_ls.out", A); #endif #endif HYPRE_ANNOTATE_FUNC_END; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_FSAIPrintStats *--------------------------------------------------------------------------*/ HYPRE_Int hypre_FSAIPrintStats( void *fsai_vdata, hypre_ParCSRMatrix *A ) { /* Data structure variables */ hypre_ParFSAIData *fsai_data = (hypre_ParFSAIData*) fsai_vdata; HYPRE_Int algo_type = hypre_ParFSAIDataAlgoType(fsai_data); HYPRE_Int local_solve_type = hypre_ParFSAIDataLocalSolveType(fsai_data); HYPRE_Real kap_tolerance = hypre_ParFSAIDataKapTolerance(fsai_data); HYPRE_Int max_steps = hypre_ParFSAIDataMaxSteps(fsai_data); HYPRE_Int max_step_size = hypre_ParFSAIDataMaxStepSize(fsai_data); HYPRE_Int max_nnz_row = hypre_ParFSAIDataMaxNnzRow(fsai_data); HYPRE_Int num_levels = hypre_ParFSAIDataNumLevels(fsai_data); HYPRE_Real threshold = hypre_ParFSAIDataThreshold(fsai_data); HYPRE_Int eig_max_iters = hypre_ParFSAIDataEigMaxIters(fsai_data); HYPRE_Real density; hypre_ParCSRMatrix *G = hypre_ParFSAIDataGmat(fsai_data); /* Local variables */ HYPRE_Int nprocs; HYPRE_Int my_id; hypre_MPI_Comm_size(hypre_ParCSRMatrixComm(A), &nprocs); hypre_MPI_Comm_rank(hypre_ParCSRMatrixComm(A), &my_id); /* Compute density */ hypre_ParCSRMatrixSetDNumNonzeros(G); hypre_ParCSRMatrixSetDNumNonzeros(A); density = hypre_ParCSRMatrixDNumNonzeros(G) / hypre_ParCSRMatrixDNumNonzeros(A); hypre_ParFSAIDataDensity(fsai_data) = density; if (!my_id) { hypre_printf("*************************\n"); hypre_printf("* HYPRE FSAI Setup Info *\n"); hypre_printf("*************************\n\n"); hypre_printf("+---------------------------+\n"); hypre_printf("| No. MPI tasks: %6d |\n", nprocs); hypre_printf("| No. threads: %6d |\n", hypre_NumThreads()); hypre_printf("| Algorithm type: %6d |\n", algo_type); hypre_printf("| Local solve type: %6d |\n", local_solve_type); if (algo_type == 1 || algo_type == 2) { hypre_printf("| Max no. steps: %6d |\n", max_steps); hypre_printf("| Max step size: %6d |\n", max_step_size); hypre_printf("| Kap grad tol: %8.1e |\n", kap_tolerance); } else { hypre_printf("| Max nnz. row: %6d |\n", max_nnz_row); hypre_printf("| Number of levels: %6d |\n", num_levels); hypre_printf("| Threshold: %8.1e |\n", threshold); } hypre_printf("| Prec. density: %8.3f |\n", density); hypre_printf("| Eig max iters: %6d |\n", eig_max_iters); hypre_printf("| Omega factor: %8.3f |\n", hypre_ParFSAIDataOmega(fsai_data)); hypre_printf("+---------------------------+\n"); hypre_printf("\n\n"); } return hypre_error_flag; } /***************************************************************************** * hypre_FSAIComputeOmega * * Approximates the relaxation factor omega with 1/eigmax(G^T*G*A), where the * maximum eigenvalue is computed with a fixed number of iterations via the * power method. ******************************************************************************/ HYPRE_Int hypre_FSAIComputeOmega( void *fsai_vdata, hypre_ParCSRMatrix *A ) { hypre_ParFSAIData *fsai_data = (hypre_ParFSAIData*) fsai_vdata; hypre_ParCSRMatrix *G = hypre_ParFSAIDataGmat(fsai_data); hypre_ParCSRMatrix *GT = hypre_ParFSAIDataGTmat(fsai_data); hypre_ParVector *r_work = hypre_ParFSAIDataRWork(fsai_data); hypre_ParVector *z_work = hypre_ParFSAIDataZWork(fsai_data); HYPRE_Int eig_max_iters = hypre_ParFSAIDataEigMaxIters(fsai_data); HYPRE_MemoryLocation memory_location = hypre_ParCSRMatrixMemoryLocation(A); hypre_ParVector *eigvec; hypre_ParVector *eigvec_old; HYPRE_Int i; HYPRE_Real norm, invnorm, lambda, omega; eigvec_old = hypre_ParVectorCreate(hypre_ParCSRMatrixComm(A), hypre_ParCSRMatrixGlobalNumRows(A), hypre_ParCSRMatrixRowStarts(A)); eigvec = hypre_ParVectorCreate(hypre_ParCSRMatrixComm(A), hypre_ParCSRMatrixGlobalNumRows(A), hypre_ParCSRMatrixRowStarts(A)); hypre_ParVectorInitialize_v2(eigvec, memory_location); hypre_ParVectorInitialize_v2(eigvec_old, memory_location); #if defined(HYPRE_USING_GPU) /* Make random number generation faster on GPUs */ if (hypre_GetExecPolicy1(memory_location) == HYPRE_EXEC_DEVICE) { hypre_Vector *eigvec_local = hypre_ParVectorLocalVector(eigvec); HYPRE_Complex *eigvec_data = hypre_VectorData(eigvec_local); HYPRE_Int eigvec_size = hypre_VectorSize(eigvec_local); hypre_CurandUniform(eigvec_size, eigvec_data, 0, 0, 0, 0); } else #endif { hypre_ParVectorSetRandomValues(eigvec, 256); } /* Power method iteration */ for (i = 0; i < eig_max_iters; i++) { norm = hypre_ParVectorInnerProd(eigvec, eigvec); invnorm = 1.0 / hypre_sqrt(norm); hypre_ParVectorScale(invnorm, eigvec); if (i == (eig_max_iters - 1)) { hypre_ParVectorCopy(eigvec, eigvec_old); } /* eigvec = GT * G * A * eigvec */ hypre_ParCSRMatrixMatvec(1.0, A, eigvec, 0.0, r_work); hypre_ParCSRMatrixMatvec(1.0, G, r_work, 0.0, z_work); hypre_ParCSRMatrixMatvec(1.0, GT, z_work, 0.0, eigvec); } norm = hypre_ParVectorInnerProd(eigvec, eigvec_old); lambda = hypre_sqrt(norm); /* Check lambda */ if (lambda < HYPRE_REAL_EPSILON) { hypre_error_w_msg(HYPRE_ERROR_GENERIC, "Found small lambda. Reseting it to one!"); lambda = 1.0; } /* Free memory */ hypre_ParVectorDestroy(eigvec_old); hypre_ParVectorDestroy(eigvec); /* Update omega */ omega = 1.0 / lambda; hypre_FSAISetOmega(fsai_vdata, omega); return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_FSAIDumpLocalLSDense * * Dump local linear systems to file. Matrices are written in dense format. * This functions serves for debugging. *--------------------------------------------------------------------------*/ HYPRE_Int hypre_FSAIDumpLocalLSDense( void *fsai_vdata, const char *filename, hypre_ParCSRMatrix *A ) { hypre_ParFSAIData *fsai_data = (hypre_ParFSAIData*) fsai_vdata; /* Data structure variables */ MPI_Comm comm = hypre_ParCSRMatrixComm(A); HYPRE_Int max_steps = hypre_ParFSAIDataMaxSteps(fsai_data); HYPRE_Int max_step_size = hypre_ParFSAIDataMaxStepSize(fsai_data); hypre_ParCSRMatrix *G = hypre_ParFSAIDataGmat(fsai_data); hypre_CSRMatrix *G_diag = hypre_ParCSRMatrixDiag(G); HYPRE_Int *G_i = hypre_CSRMatrixI(G_diag); HYPRE_Int *G_j = hypre_CSRMatrixJ(G_diag); HYPRE_Int num_rows_diag_G = hypre_CSRMatrixNumRows(G_diag); /* CSRMatrix A_diag variables */ hypre_CSRMatrix *A_diag = hypre_ParCSRMatrixDiag(A); HYPRE_Int *A_i = hypre_CSRMatrixI(A_diag); HYPRE_Int *A_j = hypre_CSRMatrixJ(A_diag); HYPRE_Complex *A_a = hypre_CSRMatrixData(A_diag); FILE *fp; char new_filename[1024]; HYPRE_Int myid; HYPRE_Int i, j, k, m, n; HYPRE_Int ii, jj; HYPRE_Int nnz, col, index; HYPRE_Int *indices; HYPRE_Int *marker; HYPRE_Real *data; HYPRE_Int data_size; HYPRE_Real density; HYPRE_Int width = 20; //6 HYPRE_Int prec = 16; //2 hypre_MPI_Comm_rank(comm, &myid); hypre_sprintf(new_filename, "%s.%05d", filename, myid); if ((fp = fopen(new_filename, "w")) == NULL) { hypre_error_w_msg(HYPRE_ERROR_GENERIC, "Error: can't open output file %s\n"); return hypre_error_flag; } /* Allocate memory */ data_size = (max_steps * max_step_size) * (max_steps * max_step_size + 1); indices = hypre_CTAlloc(HYPRE_Int, data_size, HYPRE_MEMORY_HOST); data = hypre_CTAlloc(HYPRE_Real, data_size, HYPRE_MEMORY_HOST); marker = hypre_TAlloc(HYPRE_Int, num_rows_diag_G, HYPRE_MEMORY_HOST); hypre_Memset(marker, -1, num_rows_diag_G * sizeof(HYPRE_Int), HYPRE_MEMORY_HOST); /* Write header info */ hypre_fprintf(fp, "num_linear_sys = %d\n", num_rows_diag_G); hypre_fprintf(fp, "max_data_size = %d\n", data_size); hypre_fprintf(fp, "max_num_steps = %d\n", hypre_ParFSAIDataMaxSteps(fsai_data)); hypre_fprintf(fp, "max_step_size = %d\n", hypre_ParFSAIDataMaxStepSize(fsai_data)); hypre_fprintf(fp, "max_step_size = %g\n", hypre_ParFSAIDataKapTolerance(fsai_data)); hypre_fprintf(fp, "algo_type = %d\n\n", hypre_ParFSAIDataAlgoType(fsai_data)); /* Write local full linear systems */ for (i = 0; i < num_rows_diag_G; i++) { /* Build marker array */ n = G_i[i + 1] - G_i[i] - 1; m = n + 1; for (j = (G_i[i] + 1); j < G_i[i + 1]; j++) { marker[G_j[j]] = j - G_i[i] - 1; } /* Gather matrix coefficients */ nnz = 0; for (j = (G_i[i] + 1); j < G_i[i + 1]; j++) { for (k = A_i[G_j[j]]; k < A_i[G_j[j] + 1]; k++) { if ((col = marker[A_j[k]]) >= 0) { /* Add A(i,j) entry */ index = (j - G_i[i] - 1) * n + col; data[index] = A_a[k]; indices[nnz] = index; nnz++; } } } density = (n > 0) ? (HYPRE_Real) nnz / (n * n) : 0.0; /* Gather RHS coefficients */ for (j = A_i[i]; j < A_i[i + 1]; j++) { if ((col = marker[A_j[j]]) >= 0) { index = (m - 1) * n + col; data[index] = A_a[j]; indices[nnz] = index; nnz++; } } /* Write coefficients to file */ hypre_fprintf(fp, "id = %d, (m, n) = (%d, %d), rho = %.3f\n", i, m, n, density); for (ii = 0; ii < n; ii++) { for (jj = 0; jj < n; jj++) { hypre_fprintf(fp, "%*.*f ", width, prec, data[ii * n + jj]); } hypre_fprintf(fp, "\n"); } for (jj = 0; jj < n; jj++) { hypre_fprintf(fp, "%*.*f ", width, prec, data[ii * n + jj]); } hypre_fprintf(fp, "\n"); /* Reset work arrays */ for (j = (G_i[i] + 1); j < G_i[i + 1]; j++) { marker[G_j[j]] = -1; } for (k = 0; k < nnz; k++) { data[indices[k]] = 0.0; } } /* Close stream */ fclose(fp); /* Free memory */ hypre_TFree(indices, HYPRE_MEMORY_HOST); hypre_TFree(marker, HYPRE_MEMORY_HOST); hypre_TFree(data, HYPRE_MEMORY_HOST); return hypre_error_flag; } hypre-2.33.0/src/parcsr_ls/par_fsai_solve.c000066400000000000000000000127101477326011500206540ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) *******************************************************************************/ /****************************************************************************** * * FSAI solve routine * ******************************************************************************/ #include "_hypre_parcsr_ls.h" /*-------------------------------------------------------------------- * hypre_FSAISolve *--------------------------------------------------------------------*/ HYPRE_Int hypre_FSAISolve( void *fsai_vdata, hypre_ParCSRMatrix *A, hypre_ParVector *b, hypre_ParVector *x ) { MPI_Comm comm = hypre_ParCSRMatrixComm(A); hypre_ParFSAIData *fsai_data = (hypre_ParFSAIData*) fsai_vdata; /* Data structure variables */ hypre_ParVector *r_work = hypre_ParFSAIDataRWork(fsai_data); HYPRE_Real tol = hypre_ParFSAIDataTolerance(fsai_data); HYPRE_Int zero_guess = hypre_ParFSAIDataZeroGuess(fsai_data); HYPRE_Int max_iter = hypre_ParFSAIDataMaxIterations(fsai_data); HYPRE_Int print_level = hypre_ParFSAIDataPrintLevel(fsai_data); HYPRE_Int logging = hypre_ParFSAIDataLogging(fsai_data); /* Local variables */ HYPRE_Int iter, my_id; HYPRE_Real old_resnorm, resnorm = 0.0, rel_resnorm; HYPRE_Complex one = 1.0; HYPRE_Complex neg_one = -1.0; HYPRE_Complex zero = 0.0; /* Sanity check */ if (hypre_ParVectorNumVectors(b) > 1) { hypre_error_w_msg(HYPRE_ERROR_GENERIC, "FSAI doesn't support multicomponent vectors"); return hypre_error_flag; } HYPRE_ANNOTATE_FUNC_BEGIN; hypre_GpuProfilingPushRange("FSAISolve"); hypre_MPI_Comm_rank(comm, &my_id); /*----------------------------------------------------------------- * Preconditioned Richardson - Main solver loop * x(k+1) = x(k) + omega * (G^T*G) * (b - A*x(k)) * ----------------------------------------------------------------*/ if (my_id == 0 && print_level > 1) { hypre_printf("\n\n FSAI SOLVER SOLUTION INFO:\n"); } iter = 0; rel_resnorm = resnorm = 1.0; if (my_id == 0 && print_level > 1) { hypre_printf(" new relative\n"); hypre_printf(" iter # res norm res norm\n"); hypre_printf(" -------- -------- --------\n"); } if (max_iter > 0) { /* First iteration */ if (zero_guess) { /* Compute: x(k+1) = omega*G^T*G*b */ hypre_FSAIApply(fsai_vdata, zero, b, x); } else { /* Compute: x(k+1) = x(k) + omega*G^T*G*(b - A*x(k)) */ hypre_ParCSRMatrixMatvecOutOfPlace(neg_one, A, x, one, b, r_work); hypre_FSAIApply(fsai_vdata, one, r_work, x); } /* Update iteration count */ iter++; } else { hypre_ParVectorCopy(b, x); } /* Apply remaining iterations */ for (; iter < max_iter; iter++) { /* Update residual */ hypre_ParCSRMatrixMatvecOutOfPlace(neg_one, A, x, one, b, r_work); if (tol > 0.0) { old_resnorm = resnorm; resnorm = hypre_ParVectorInnerProd(r_work, r_work); /* Compute rel_resnorm */ rel_resnorm = resnorm / old_resnorm; if (my_id == 0 && print_level > 1) { hypre_printf(" %e %e %e\n", iter, resnorm, rel_resnorm); } /* Exit if convergence tolerance has been achieved */ if (rel_resnorm >= tol) { break; } } /* Compute: x(k+1) = x(k) + omega*inv(M)*r */ hypre_FSAIApply(fsai_vdata, one, r_work, x); } if (logging > 1) { hypre_ParFSAIDataNumIterations(fsai_data) = iter; hypre_ParFSAIDataRelResNorm(fsai_data) = rel_resnorm; } else { hypre_ParFSAIDataNumIterations(fsai_data) = 0; hypre_ParFSAIDataRelResNorm(fsai_data) = 0.0; } hypre_GpuProfilingPopRange(); HYPRE_ANNOTATE_FUNC_END; return hypre_error_flag; } /*-------------------------------------------------------------------- * hypre_FSAIApply * * Computes x(k+1) = alpha*x(k) + omega*G^T*G*b *--------------------------------------------------------------------*/ HYPRE_Int hypre_FSAIApply( void *fsai_vdata, HYPRE_Complex alpha, hypre_ParVector *b, hypre_ParVector *x ) { hypre_ParFSAIData *fsai_data = (hypre_ParFSAIData*) fsai_vdata; /* Data structure variables */ hypre_ParCSRMatrix *G = hypre_ParFSAIDataGmat(fsai_data); hypre_ParCSRMatrix *GT = hypre_ParFSAIDataGTmat(fsai_data); hypre_ParVector *z_work = hypre_ParFSAIDataZWork(fsai_data); HYPRE_Real omega = hypre_ParFSAIDataOmega(fsai_data); HYPRE_Complex one = 1.0; HYPRE_Complex zero = 0.0; HYPRE_ANNOTATE_FUNC_BEGIN; hypre_GpuProfilingPushRange("FSAIApply"); hypre_ParCSRMatrixMatvec(one, G, b, zero, z_work); hypre_ParCSRMatrixMatvec(omega, GT, z_work, alpha, x); hypre_GpuProfilingPopRange(); HYPRE_ANNOTATE_FUNC_END; return hypre_error_flag; } hypre-2.33.0/src/parcsr_ls/par_gauss_elim.c000066400000000000000000000620561477326011500206620ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "_hypre_parcsr_ls.h" #include "_hypre_blas.h" #include "_hypre_lapack.h" /*-------------------------------------------------------------------------- * hypre_GaussElimSetup * * Gaussian elimination setup routine. * * Solver options for which local matrices/vectors are formed via MPI * collectives on a sub-communicator defined with active ranks: * * - 9: hypre's internal Gaussian elimination on the host. * - 99: LU factorization with pivoting. * - 199: explicit (dense) inverse A_inv = U^{-1}*L^{-1}. * * Solver options for which local matrices/vectors are formed via * hypre_DataExchangeList: * * - 19: hypre's internal Gaussian elimination on the host. * - 98: LU factorization with pivoting. * - 198: explicit (dense) inverse A_inv = U^{-1}*L^{-1}. *--------------------------------------------------------------------------*/ HYPRE_Int hypre_GaussElimSetup(hypre_ParAMGData *amg_data, HYPRE_Int level, HYPRE_Int solver_type) { /* Par Data Structure variables */ hypre_ParCSRMatrix *A = hypre_ParAMGDataAArray(amg_data)[level]; MPI_Comm comm = hypre_ParCSRMatrixComm(A); HYPRE_Int num_rows = hypre_ParCSRMatrixNumRows(A); HYPRE_Int global_num_rows = (HYPRE_Int) hypre_ParCSRMatrixGlobalNumRows(A); HYPRE_BigInt first_row_index = hypre_ParCSRMatrixFirstRowIndex(A); HYPRE_BigInt *col_map_offd = hypre_ParCSRMatrixColMapOffd(A); hypre_CSRMatrix *A_diag = hypre_ParCSRMatrixDiag(A); hypre_CSRMatrix *A_offd = hypre_ParCSRMatrixOffd(A); HYPRE_MemoryLocation memory_location = hypre_ParCSRMatrixMemoryLocation(A); /* Local matrices */ hypre_CSRMatrix *A_diag_host; hypre_CSRMatrix *A_offd_host; hypre_CSRMatrix *A_CSR; HYPRE_Int *A_CSR_i; HYPRE_Int *A_CSR_j; HYPRE_Complex *A_CSR_data; HYPRE_Int *A_diag_i; HYPRE_Int *A_offd_i; HYPRE_Int *A_diag_j; HYPRE_Int *A_offd_j; HYPRE_Complex *A_diag_data; HYPRE_Complex *A_offd_data; HYPRE_Complex *A_mat_local; HYPRE_Int *comm_info, *info, *displs; HYPRE_Int *mat_info, *mat_displs; HYPRE_Int new_num_procs, A_mat_local_size; /* Local variables */ MPI_Comm new_comm; HYPRE_Int global_size = global_num_rows * global_num_rows; HYPRE_Real *A_mat = NULL; HYPRE_Real *AT_mat = NULL; HYPRE_Int *A_piv = NULL; HYPRE_MemoryLocation ge_memory_location; HYPRE_Int i, jj, col; HYPRE_Int ierr = 0; /*----------------------------------------------------------------- * Sanity checks *-----------------------------------------------------------------*/ /* Check for relaxation type */ if (solver_type != 9 && solver_type != 99 && solver_type != 199 && solver_type != 19 && solver_type != 98 && solver_type != 198) { hypre_error_w_msg(HYPRE_ERROR_GENERIC, "Unsupported solver type!"); return hypre_error_flag; } /*----------------------------------------------------------------- * Determine mem. location of the GE lin. system and allocate data *-----------------------------------------------------------------*/ if (solver_type == 9 || solver_type == 19) { ge_memory_location = HYPRE_MEMORY_HOST; } else { /* Fallback to host execution when dependency libraries are not met (cuSOLVER/MAGMA) */ #if defined(HYPRE_USING_CUDA) && !defined(HYPRE_USING_CUSOLVER) && !defined(HYPRE_USING_MAGMA) ||\ (defined(HYPRE_USING_HIP) && !defined(HYPRE_USING_MAGMA)) ge_memory_location = HYPRE_MEMORY_HOST; #else ge_memory_location = memory_location; #endif } hypre_ParAMGDataGEMemoryLocation(amg_data) = ge_memory_location; /* Allocate dense linear system data */ if (num_rows) { hypre_ParAMGDataAMat(amg_data) = hypre_CTAlloc(HYPRE_Real, global_size, ge_memory_location); hypre_ParAMGDataAWork(amg_data) = hypre_CTAlloc(HYPRE_Real, global_size, ge_memory_location); hypre_ParAMGDataBVec(amg_data) = hypre_CTAlloc(HYPRE_Real, global_num_rows, ge_memory_location); /* solver types 198 and 199 need a work space for the solution vector */ if (solver_type == 198 || solver_type == 199) { hypre_ParAMGDataUVec(amg_data) = hypre_CTAlloc(HYPRE_Real, global_num_rows, ge_memory_location); } /* solver types other than 9 and 19 need an array for storing pivots */ if (solver_type != 9 && solver_type != 19) { #if defined(HYPRE_USING_MAGMA) /* MAGMA's getrf/getrs expect Apiv to be on the host */ hypre_ParAMGDataAPiv(amg_data) = hypre_CTAlloc(HYPRE_Int, global_num_rows, HYPRE_MEMORY_HOST); #else hypre_ParAMGDataAPiv(amg_data) = hypre_CTAlloc(HYPRE_Int, global_num_rows, ge_memory_location); #endif } A_piv = hypre_ParAMGDataAPiv(amg_data); } /*----------------------------------------------------------------- * Gaussian elimination setup *-----------------------------------------------------------------*/ #ifdef HYPRE_PROFILE hypre_profile_times[HYPRE_TIMER_ID_GS_ELIM_SETUP] -= hypre_MPI_Wtime(); #endif HYPRE_ANNOTATE_FUNC_BEGIN; hypre_GpuProfilingPushRange("GESetup"); if (solver_type == 9 || solver_type == 99 || solver_type == 199) { /* Generate sub communicator - processes that have nonzero num_rows */ hypre_GenerateSubComm(comm, num_rows, &new_comm); hypre_ParAMGDataNewComm(amg_data) = new_comm; if (num_rows) { hypre_MPI_Comm_size(new_comm, &new_num_procs); A_diag_host = (hypre_GetActualMemLocation(memory_location) == hypre_MEMORY_DEVICE) ? hypre_CSRMatrixClone_v2(A_diag, 1, HYPRE_MEMORY_HOST) : A_diag; A_offd_host = (hypre_GetActualMemLocation(memory_location) == hypre_MEMORY_DEVICE) ? hypre_CSRMatrixClone_v2(A_offd, 1, HYPRE_MEMORY_HOST) : A_offd; A_diag_i = hypre_CSRMatrixI(A_diag_host); A_offd_i = hypre_CSRMatrixI(A_offd_host); A_diag_j = hypre_CSRMatrixJ(A_diag_host); A_offd_j = hypre_CSRMatrixJ(A_offd_host); A_diag_data = hypre_CSRMatrixData(A_diag_host); A_offd_data = hypre_CSRMatrixData(A_offd_host); comm_info = hypre_CTAlloc(HYPRE_Int, 2 * new_num_procs + 1, HYPRE_MEMORY_HOST); mat_info = hypre_CTAlloc(HYPRE_Int, new_num_procs, HYPRE_MEMORY_HOST); mat_displs = hypre_CTAlloc(HYPRE_Int, new_num_procs + 1, HYPRE_MEMORY_HOST); info = &comm_info[0]; displs = &comm_info[new_num_procs]; hypre_ParAMGDataCommInfo(amg_data) = comm_info; hypre_MPI_Allgather(&num_rows, 1, HYPRE_MPI_INT, info, 1, HYPRE_MPI_INT, new_comm); displs[0] = 0; mat_displs[0] = 0; for (i = 0; i < new_num_procs; i++) { displs[i + 1] = displs[i] + info[i]; mat_displs[i + 1] = global_num_rows * displs[i + 1]; mat_info[i] = global_num_rows * info[i]; } A_mat_local_size = global_num_rows * num_rows; A_mat_local = hypre_CTAlloc(HYPRE_Real, A_mat_local_size, HYPRE_MEMORY_HOST); A_mat = (hypre_GetActualMemLocation(ge_memory_location) == hypre_MEMORY_DEVICE) ? hypre_CTAlloc(HYPRE_Real, global_size, HYPRE_MEMORY_HOST) : hypre_ParAMGDataAMat(amg_data); /*--------------------------------------------------------------- * Load local matrix into A_mat_local. *---------------------------------------------------------------*/ for (i = 0; i < num_rows; i++) { for (jj = A_diag_i[i]; jj < A_diag_i[i + 1]; jj++) { /* using row major */ col = A_diag_j[jj] + first_row_index; A_mat_local[i * global_num_rows + col] = A_diag_data[jj]; } for (jj = A_offd_i[i]; jj < A_offd_i[i + 1]; jj++) { /* using row major */ col = col_map_offd[A_offd_j[jj]]; A_mat_local[i * global_num_rows + col] = A_offd_data[jj]; } } hypre_MPI_Allgatherv(A_mat_local, A_mat_local_size, HYPRE_MPI_REAL, A_mat, mat_info, mat_displs, HYPRE_MPI_REAL, new_comm); /* Set dense matrix - We store it in row-major format when using hypre's internal Gaussian Elimination or in column-major format if using LAPACK solvers */ if (solver_type != 9 && solver_type != 19) { AT_mat = (hypre_GetActualMemLocation(ge_memory_location) == hypre_MEMORY_DEVICE) ? hypre_CTAlloc(HYPRE_Real, global_size, HYPRE_MEMORY_HOST) : hypre_ParAMGDataAWork(amg_data); /* Compute A transpose, i.e., store A in column-major format */ for (i = 0; i < global_num_rows; i++) { for (jj = 0; jj < global_num_rows; jj++) { AT_mat[i * global_num_rows + jj] = A_mat[i + jj * global_num_rows]; } } if (hypre_ParAMGDataAWork(amg_data) != AT_mat) { /* Copy A^T to destination variable */ hypre_TMemcpy(hypre_ParAMGDataAMat(amg_data), AT_mat, HYPRE_Real, global_size, ge_memory_location, HYPRE_MEMORY_HOST); hypre_TFree(AT_mat, HYPRE_MEMORY_HOST); } else { /* Swap pointers */ hypre_ParAMGDataAWork(amg_data) = hypre_ParAMGDataAMat(amg_data); hypre_ParAMGDataAMat(amg_data) = AT_mat; } } hypre_TFree(mat_info, HYPRE_MEMORY_HOST); hypre_TFree(mat_displs, HYPRE_MEMORY_HOST); hypre_TFree(A_mat_local, HYPRE_MEMORY_HOST); if (hypre_GetActualMemLocation(ge_memory_location) == hypre_MEMORY_DEVICE) { hypre_TFree(A_mat, HYPRE_MEMORY_HOST); } if (A_diag_host != A_diag) { hypre_CSRMatrixDestroy(A_diag_host); } if (A_offd_host != A_offd) { hypre_CSRMatrixDestroy(A_offd_host); } } else { /* Skip setup if this rank has no rows. */ hypre_ParAMGDataGSSetup(amg_data) = 1; /* Finalize profiling */ hypre_GpuProfilingPopRange(); HYPRE_ANNOTATE_FUNC_END; return hypre_error_flag; } } else /* if (solver_type == 19 || solver_type = 98 || solver_type == 198) */ { /* Generate CSR matrix from ParCSRMatrix A */ A_CSR = hypre_ParCSRMatrixToCSRMatrixAll_v2(A, HYPRE_MEMORY_HOST); if (num_rows) { A_CSR_i = hypre_CSRMatrixI(A_CSR); A_CSR_j = hypre_CSRMatrixJ(A_CSR); A_CSR_data = hypre_CSRMatrixData(A_CSR); /*--------------------------------------------------------------- * Load CSR matrix into A_mat. *---------------------------------------------------------------*/ /* Allocate memory */ A_mat = (hypre_GetActualMemLocation(ge_memory_location) == hypre_MEMORY_DEVICE) ? hypre_CTAlloc(HYPRE_Real, global_size, HYPRE_MEMORY_HOST) : hypre_ParAMGDataAMat(amg_data); /* TODO (VPM): Add OpenMP support */ for (i = 0; i < global_num_rows; i++) { for (jj = A_CSR_i[i]; jj < A_CSR_i[i + 1]; jj++) { /* need col major */ col = A_CSR_j[jj]; A_mat[i + global_num_rows * col] = (HYPRE_Real) A_CSR_data[jj]; } } if (hypre_ParAMGDataAMat(amg_data) != A_mat) { hypre_TMemcpy(hypre_ParAMGDataAMat(amg_data), A_mat, HYPRE_Real, global_size, ge_memory_location, HYPRE_MEMORY_HOST); hypre_TFree(A_mat, HYPRE_MEMORY_HOST); } } else { /* Free memory */ hypre_CSRMatrixDestroy(A_CSR); /* Skip setup if this rank has no rows. */ hypre_ParAMGDataGSSetup(amg_data) = 1; /* Finalize profiling */ hypre_GpuProfilingPopRange(); HYPRE_ANNOTATE_FUNC_END; return hypre_error_flag; } /* Free memory */ hypre_CSRMatrixDestroy(A_CSR); } /* Exit if no rows in this rank */ if (!num_rows) { hypre_ParAMGDataGSSetup(amg_data) = 1; /* Finalize profiling */ hypre_GpuProfilingPopRange(); HYPRE_ANNOTATE_FUNC_END; return hypre_error_flag; } /*----------------------------------------------------------------- * Factorization phase *-----------------------------------------------------------------*/ #if defined(HYPRE_USING_CUDA) || defined(HYPRE_USING_HIP) HYPRE_ExecutionPolicy exec = hypre_GetExecPolicy1(ge_memory_location); if (exec == HYPRE_EXEC_DEVICE) { hypre_GaussElimSetupDevice(amg_data, level, solver_type); } else #endif { if (solver_type != 9 && solver_type != 19) { /* Perform factorization */ hypre_dgetrf(&global_num_rows, &global_num_rows, hypre_ParAMGDataAMat(amg_data), &global_num_rows, A_piv, &ierr); if (ierr != 0) { hypre_error_w_msg(HYPRE_ERROR_GENERIC, "Problem with dgetrf!"); /* Finalize profiling */ hypre_GpuProfilingPopRange(); HYPRE_ANNOTATE_FUNC_END; return hypre_error_flag; } /* Compute explicit inverse */ if (solver_type == 198 || solver_type == 199) { HYPRE_Int query = -1, lwork; HYPRE_Real lwork_opt; HYPRE_Real *work; /* Compute buffer size */ hypre_dgetri(&global_num_rows, hypre_ParAMGDataAMat(amg_data), &global_num_rows, A_piv, &lwork_opt, &query, &ierr); if (ierr != 0) { hypre_error_w_msg(HYPRE_ERROR_GENERIC, "Problem with dgetri (query)!"); /* Finalize profiling */ hypre_GpuProfilingPopRange(); HYPRE_ANNOTATE_FUNC_END; return hypre_error_flag; } /* Allocate work space */ lwork = (HYPRE_Int) lwork_opt; work = hypre_TAlloc(HYPRE_Real, lwork, HYPRE_MEMORY_HOST); /* Compute dense inverse */ hypre_dgetri(&global_num_rows, hypre_ParAMGDataAMat(amg_data), &global_num_rows, A_piv, work, &lwork, &ierr); if (ierr != 0) { hypre_error_w_msg(HYPRE_ERROR_GENERIC, "Problem with dgetri!"); /* Finalize profiling */ hypre_GpuProfilingPopRange(); HYPRE_ANNOTATE_FUNC_END; return hypre_error_flag; } hypre_TFree(work, HYPRE_MEMORY_HOST); } } } /*----------------------------------------------------------------- * Finalize *-----------------------------------------------------------------*/ hypre_ParAMGDataGSSetup(amg_data) = 1; /* Finalize profiling */ hypre_GpuProfilingPopRange(); HYPRE_ANNOTATE_FUNC_END; #ifdef HYPRE_PROFILE hypre_profile_times[HYPRE_TIMER_ID_GS_ELIM_SETUP] += hypre_MPI_Wtime(); #endif return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_GaussElimSolve * * Gaussian elimination solve. See hypre_GaussElimSetup for comments. * * TODO (VPM): remove (u/f)_data_h. Communicate device buffers instead. *--------------------------------------------------------------------------*/ HYPRE_Int hypre_GaussElimSolve(hypre_ParAMGData *amg_data, HYPRE_Int level, HYPRE_Int solver_type) { hypre_ParCSRMatrix *A = hypre_ParAMGDataAArray(amg_data)[level]; HYPRE_Int first_row_index = (HYPRE_Int) hypre_ParCSRMatrixFirstRowIndex(A); HYPRE_Int global_num_rows = (HYPRE_Int) hypre_ParCSRMatrixGlobalNumRows(A); HYPRE_Int num_rows = hypre_ParCSRMatrixNumRows(A); HYPRE_MemoryLocation memory_location = hypre_ParCSRMatrixMemoryLocation(A); HYPRE_MemoryLocation ge_memory_location = hypre_ParAMGDataGEMemoryLocation(amg_data); HYPRE_Real *b_vec = hypre_ParAMGDataBVec(amg_data); hypre_ParVector *f = hypre_ParAMGDataFArray(amg_data)[level]; HYPRE_Real *f_data = hypre_VectorData(hypre_ParVectorLocalVector(f)); HYPRE_Real *f_data_h = NULL; HYPRE_Real *b_data_h = NULL; hypre_Vector *f_all = NULL; hypre_ParVector *u = hypre_ParAMGDataUArray(amg_data)[level]; HYPRE_Real *u_data = hypre_VectorData(hypre_ParVectorLocalVector(u)); HYPRE_Real *u_data_h = NULL; HYPRE_Real *u_vec = hypre_ParAMGDataUVec(amg_data); /* Coarse solver data */ HYPRE_Int *A_piv = hypre_ParAMGDataAPiv(amg_data); HYPRE_Real *A_mat = hypre_ParAMGDataAMat(amg_data); HYPRE_Real *A_work = hypre_ParAMGDataAWork(amg_data); /* Constants */ HYPRE_Int one_i = 1; HYPRE_Real one = 1.0; HYPRE_Real zero = 0.0; /* Local variables */ MPI_Comm new_comm = hypre_ParAMGDataNewComm(amg_data); HYPRE_Int *comm_info = hypre_ParAMGDataCommInfo(amg_data); HYPRE_Int global_size = global_num_rows * global_num_rows; HYPRE_Int ierr = 0; HYPRE_Int *displs, *info; HYPRE_Int new_num_procs; #ifdef HYPRE_PROFILE hypre_profile_times[HYPRE_TIMER_ID_GS_ELIM_SOLVE] -= hypre_MPI_Wtime(); #endif HYPRE_ANNOTATE_FUNC_BEGIN; hypre_GpuProfilingPushRange("GESolve"); /*----------------------------------------------------------------- * Sanity checks *-----------------------------------------------------------------*/ /* Call setup if not done before */ if (hypre_ParAMGDataGSSetup(amg_data) == 0) { hypre_GaussElimSetup(amg_data, level, solver_type); } /* Check for relaxation type */ if (solver_type != 9 && solver_type != 99 && solver_type != 199 && solver_type != 19 && solver_type != 98 && solver_type != 198) { hypre_error_w_msg(HYPRE_ERROR_GENERIC, "Unsupported solver type!"); return hypre_error_flag; } /* Check if we need to allocate a work space for setting the values of uvec/bvec */ if (hypre_GetActualMemLocation(ge_memory_location) != hypre_MEMORY_HOST) { b_data_h = hypre_TAlloc(HYPRE_Real, global_num_rows, HYPRE_MEMORY_HOST); u_data_h = hypre_TAlloc(HYPRE_Real, global_num_rows, HYPRE_MEMORY_HOST); } else { b_data_h = b_vec; u_data_h = u_vec; } /*----------------------------------------------------------------- * Gather RHS phase *-----------------------------------------------------------------*/ if (solver_type == 9 || solver_type == 99 || solver_type == 199) { /* Exit if no rows in this rank */ if (!num_rows) { if (u_data_h != u_vec) { hypre_TFree(u_data_h, HYPRE_MEMORY_HOST); } if (b_data_h != b_vec) { hypre_TFree(b_data_h, HYPRE_MEMORY_HOST); } /* Finalize profiling */ hypre_GpuProfilingPopRange(); HYPRE_ANNOTATE_FUNC_END; return hypre_error_flag; } hypre_MPI_Comm_size(new_comm, &new_num_procs); info = &comm_info[0]; displs = &comm_info[new_num_procs]; if (hypre_GetActualMemLocation(hypre_ParVectorMemoryLocation(f)) != hypre_MEMORY_HOST) { f_data_h = hypre_TAlloc(HYPRE_Real, num_rows, HYPRE_MEMORY_HOST); hypre_TMemcpy(f_data_h, f_data, HYPRE_Real, num_rows, HYPRE_MEMORY_HOST, hypre_ParVectorMemoryLocation(f)); } else { f_data_h = f_data; } /* TODO (VPM): Add GPU-aware MPI support to buffers */ hypre_MPI_Allgatherv(f_data_h, num_rows, HYPRE_MPI_REAL, b_data_h, info, displs, HYPRE_MPI_REAL, new_comm); if (f_data_h != f_data) { hypre_TFree(f_data_h, HYPRE_MEMORY_HOST); } } else /* if (solver_type == 19 || solver_type == 98 || solver_type == 198) */ { f_all = hypre_ParVectorToVectorAll_v2(f, HYPRE_MEMORY_HOST); } /* Complete the computation of bvec and free work space if needed */ if (f_all) { hypre_TMemcpy(b_vec, hypre_VectorData(f_all), HYPRE_Real, global_num_rows, ge_memory_location, HYPRE_MEMORY_HOST); } else { if (b_data_h != b_vec) { hypre_TMemcpy(b_vec, b_data_h, HYPRE_Real, global_num_rows, ge_memory_location, HYPRE_MEMORY_HOST); hypre_TFree(b_data_h, HYPRE_MEMORY_HOST); } } /* Exit if no rows in this rank */ if (!num_rows) { if (u_data_h != u_vec) { hypre_TFree(u_data_h, HYPRE_MEMORY_HOST); } if (b_data_h != b_vec) { hypre_TFree(b_data_h, HYPRE_MEMORY_HOST); } /* Finalize profiling */ hypre_GpuProfilingPopRange(); HYPRE_ANNOTATE_FUNC_END; return hypre_error_flag; } /*----------------------------------------------------------------- * Gaussian elimination solve *-----------------------------------------------------------------*/ #if defined(HYPRE_USING_CUDA) || defined(HYPRE_USING_HIP) HYPRE_ExecutionPolicy exec = hypre_GetExecPolicy1(ge_memory_location); if (exec == HYPRE_EXEC_DEVICE) { hypre_GaussElimSolveDevice(amg_data, level, solver_type); } else #endif { if (solver_type == 9 || solver_type == 19) { /* Copy matrix to work space */ hypre_TMemcpy(A_work, A_mat, HYPRE_Real, global_size, HYPRE_MEMORY_HOST, HYPRE_MEMORY_HOST); /* Run hypre's internal gaussian elimination */ hypre_gselim(A_work, b_vec, global_num_rows, ierr); if (ierr != 0) { hypre_error_w_msg(HYPRE_ERROR_GENERIC, "Problem with hypre_gselim!"); } hypre_TMemcpy(u_data, b_data_h + first_row_index, HYPRE_Real, num_rows, memory_location, HYPRE_MEMORY_HOST); } else if (solver_type == 98 || solver_type == 99) { /* Run LAPACK's triangular solver */ hypre_dgetrs("N", &global_num_rows, &one_i, A_mat, &global_num_rows, A_piv, b_vec, &global_num_rows, &ierr); if (ierr != 0) { hypre_error_w_msg(HYPRE_ERROR_GENERIC, "Problem with hypre_dgetrs!"); } hypre_TMemcpy(u_data, b_data_h + first_row_index, HYPRE_Real, num_rows, memory_location, HYPRE_MEMORY_HOST); } else /* if (solver_type == 198 || solver_type == 199) */ { hypre_dgemv("N", &global_num_rows, &global_num_rows, &one, A_mat, &global_num_rows, b_vec, &one_i, &zero, u_data_h, &one_i); hypre_TMemcpy(u_data, u_data_h + first_row_index, HYPRE_Real, num_rows, memory_location, HYPRE_MEMORY_HOST); } } /* Free memory - TODO (VPM): do we need to create and destroy f_all at every solve call? */ hypre_SeqVectorDestroy(f_all); if (u_data_h != u_vec) { hypre_TFree(u_data_h, HYPRE_MEMORY_HOST); } if (b_data_h != b_vec) { hypre_TFree(b_data_h, HYPRE_MEMORY_HOST); } /* Finalize profiling */ hypre_GpuProfilingPopRange(); HYPRE_ANNOTATE_FUNC_END; #ifdef HYPRE_PROFILE hypre_profile_times[HYPRE_TIMER_ID_GS_ELIM_SOLVE] += hypre_MPI_Wtime(); #endif return hypre_error_flag; } hypre-2.33.0/src/parcsr_ls/par_ge_device.c000066400000000000000000000332221477326011500204350ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "_hypre_parcsr_ls.h" #include "_hypre_utilities.hpp" #if defined(HYPRE_USING_CUDA) || defined(HYPRE_USING_HIP) /*-------------------------------------------------------------------------- * hypre_GaussElimSetupDevice * * Gaussian elimination setup routine on the device. This uses MAGMA by * default or any of the vendor math libraries (cuBLAS, rocSOLVER) when * MAGMA is not available. * * See hypre_GaussElimSetup for more info. *--------------------------------------------------------------------------*/ HYPRE_Int hypre_GaussElimSetupDevice(hypre_ParAMGData *amg_data, HYPRE_Int level, HYPRE_Int solver_type) { /* Input data */ hypre_ParCSRMatrix *par_A = hypre_ParAMGDataAArray(amg_data)[level]; HYPRE_Int global_num_rows = (HYPRE_Int) hypre_ParCSRMatrixGlobalNumRows(par_A); HYPRE_Int num_rows = hypre_ParCSRMatrixNumRows(par_A); HYPRE_Int *A_piv = hypre_ParAMGDataAPiv(amg_data); HYPRE_Real *A_mat = hypre_ParAMGDataAMat(amg_data); HYPRE_Real *A_work = hypre_ParAMGDataAWork(amg_data); HYPRE_Int global_size = global_num_rows * global_num_rows; /* Local variables */ HYPRE_Int buffer_size = 0; HYPRE_Int ierr = 0; HYPRE_Int *d_ierr = NULL; char msg[1024]; /* Sanity checks */ if (!num_rows || !global_size) { return hypre_error_flag; } if (global_size < 0) { hypre_error_w_msg(HYPRE_ERROR_GENERIC, "Detected overflow!"); return hypre_error_flag; } /*----------------------------------------------------------------- * Compute the factorization A = L*U *-----------------------------------------------------------------*/ #if defined(HYPRE_USING_MAGMA) HYPRE_MAGMA_CALL(hypre_magma_getrf_nat(global_num_rows, global_num_rows, A_mat, global_num_rows, A_piv, &ierr)); #elif defined(HYPRE_USING_CUSOLVER) /* Allocate space for device error code */ d_ierr = hypre_CTAlloc(HYPRE_Int, 1, HYPRE_MEMORY_DEVICE); /* Compute buffer size */ HYPRE_CUSOLVER_CALL(hypre_cusolver_dngetrf_bs(hypre_HandleVendorSolverHandle(hypre_handle()), global_num_rows, global_num_rows, A_mat, global_num_rows, &buffer_size)); /* We use A_work as workspace */ if (buffer_size > global_size) { A_work = hypre_TReAlloc_v2(A_work, HYPRE_Real, global_size, HYPRE_Real, buffer_size, HYPRE_MEMORY_DEVICE); hypre_ParAMGDataAWork(amg_data) = A_work; } /* Factorize */ HYPRE_CUSOLVER_CALL(hypre_cusolver_dngetrf(hypre_HandleVendorSolverHandle(hypre_handle()), global_num_rows, global_num_rows, A_mat, global_num_rows, A_work, A_piv, d_ierr)); /* Move error code to host */ hypre_TMemcpy(&ierr, d_ierr, HYPRE_Int, 1, HYPRE_MEMORY_HOST, HYPRE_MEMORY_DEVICE); #elif defined(HYPRE_USING_ROCSOLVER) /************** * TODO (VPM) * **************/ HYPRE_UNUSED_VAR(A_piv); HYPRE_UNUSED_VAR(A_mat); HYPRE_UNUSED_VAR(A_work); HYPRE_UNUSED_VAR(buffer_size); #else /* Silence declared but never referenced warnings */ (A_piv += 0); (A_mat += 0); (A_work += 0); (buffer_size *= 1); hypre_error_w_msg(HYPRE_ERROR_GENERIC, "Missing dependency library for running gaussian elimination!"); #endif /* Free memory */ hypre_TFree(d_ierr, HYPRE_MEMORY_DEVICE); if (ierr < 0) { hypre_sprintf(msg, "Problem with getrf's %d-th input argument", -ierr); hypre_error_w_msg(HYPRE_ERROR_GENERIC, msg); return hypre_error_flag; } else if (ierr > 0) { hypre_sprintf(msg, "Found that U(%d, %d) = 0", ierr, ierr); hypre_error_w_msg(HYPRE_ERROR_GENERIC, msg); return hypre_error_flag; } /*----------------------------------------------------------------- * Compute the explicit inverse: A^{-1} = inv(A) *-----------------------------------------------------------------*/ if (solver_type == 198 || solver_type == 199) { #if defined(HYPRE_USING_MAGMA) /* Determine workspace size */ buffer_size = global_num_rows * hypre_magma_getri_nb(global_num_rows); /* We use A_work as workspace */ if (buffer_size > global_size) { A_work = hypre_TReAlloc_v2(A_work, HYPRE_Real, global_size, HYPRE_Real, buffer_size, HYPRE_MEMORY_DEVICE); hypre_ParAMGDataAWork(amg_data) = A_work; } HYPRE_MAGMA_CALL(hypre_magma_getri_gpu(global_num_rows, A_mat, global_num_rows, A_piv, A_work, buffer_size, &ierr)); #elif defined(HYPRE_USING_CUSOLVER) /* Allocate space for device error code */ d_ierr = hypre_CTAlloc(HYPRE_Int, 1, HYPRE_MEMORY_DEVICE); /* Create identity dense matrix */ hypre_Memset((void*) A_work, 0, (size_t) global_size * sizeof(HYPRE_Real), HYPRE_MEMORY_DEVICE); HYPRE_THRUST_CALL(for_each, thrust::make_counting_iterator(0), thrust::make_counting_iterator(global_num_rows), hypreFunctor_DenseMatrixIdentity(global_num_rows, A_work)); /* Compute inverse */ HYPRE_CUSOLVER_CALL(hypre_cusolver_dngetrs(hypre_HandleVendorSolverHandle(hypre_handle()), CUBLAS_OP_N, global_num_rows, global_num_rows, A_mat, global_num_rows, A_piv, A_work, global_num_rows, d_ierr)); /* Store the inverse in A_mat */ hypre_TMemcpy(A_mat, A_work, HYPRE_Real, global_size, HYPRE_MEMORY_DEVICE, HYPRE_MEMORY_DEVICE); /* Free memory */ hypre_TFree(d_ierr, HYPRE_MEMORY_DEVICE); #elif defined(HYPRE_USING_ROCSOLVER) /************** * TODO (VPM) * **************/ #else hypre_error_w_msg(HYPRE_ERROR_GENERIC, "Missing dependency library for running gaussian elimination!"); #endif } return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_GaussElimSolveDevice * * Gaussian elimination solve routine on the device. * * See hypre_GaussElimSolve and hypre_GaussElimSetupDevice for more info. *--------------------------------------------------------------------------*/ HYPRE_Int hypre_GaussElimSolveDevice(hypre_ParAMGData *amg_data, HYPRE_Int level, HYPRE_Int solver_type) { /* Input variables */ hypre_ParCSRMatrix *A = hypre_ParAMGDataAArray(amg_data)[level]; HYPRE_Int global_num_rows = (HYPRE_Int) hypre_ParCSRMatrixGlobalNumRows(A); HYPRE_Int first_row_index = (HYPRE_Int) hypre_ParCSRMatrixFirstRowIndex(A); HYPRE_Int num_rows = hypre_ParCSRMatrixNumRows(A); HYPRE_MemoryLocation memory_location = hypre_ParCSRMatrixMemoryLocation(A); HYPRE_MemoryLocation ge_memory_location = hypre_ParAMGDataGEMemoryLocation(amg_data); hypre_ParVector *par_u = hypre_ParAMGDataUArray(amg_data)[level]; HYPRE_Real *u_data = hypre_VectorData(hypre_ParVectorLocalVector(par_u)); HYPRE_Real *b_vec = hypre_ParAMGDataBVec(amg_data); HYPRE_Real *u_vec = hypre_ParAMGDataUVec(amg_data); HYPRE_Real *A_mat = hypre_ParAMGDataAMat(amg_data); HYPRE_Int *A_piv = hypre_ParAMGDataAPiv(amg_data); /* Local variables */ HYPRE_Real *work; HYPRE_Int *d_ierr = NULL; HYPRE_Int ierr = 0; HYPRE_Int i_one = 1; HYPRE_Complex d_one = 1.0; HYPRE_Complex zero = 0.0; char msg[1024]; /* Sanity check */ if (!num_rows || !global_num_rows) { return hypre_error_flag; } #if defined(HYPRE_USING_MAGMA) if (solver_type == 98 || solver_type == 99) { HYPRE_MAGMA_CALL(hypre_magma_getrs_gpu(MagmaNoTrans, global_num_rows, i_one, A_mat, global_num_rows, A_piv, b_vec, global_num_rows, &ierr)); } else if (solver_type == 198 || solver_type == 199) { HYPRE_MAGMA_VCALL(hypre_magma_gemv(MagmaNoTrans, global_num_rows, global_num_rows, d_one, A_mat, global_num_rows, b_vec, i_one, zero, u_vec, i_one, hypre_HandleMagmaQueue(hypre_handle()))); } #elif defined(HYPRE_USING_CUSOLVER) && defined(HYPRE_USING_CUBLAS) if (solver_type == 98 || solver_type == 99) { d_ierr = hypre_CTAlloc(HYPRE_Int, 1, HYPRE_MEMORY_DEVICE); HYPRE_CUSOLVER_CALL(hypre_cusolver_dngetrs(hypre_HandleVendorSolverHandle(hypre_handle()), CUBLAS_OP_N, global_num_rows, d_one, A_mat, global_num_rows, A_piv, b_vec, global_num_rows, d_ierr)); hypre_TMemcpy(&ierr, d_ierr, HYPRE_Int, 1, HYPRE_MEMORY_HOST, HYPRE_MEMORY_DEVICE); } else if (solver_type == 198 || solver_type == 199) { HYPRE_CUBLAS_CALL(hypre_cublas_gemv(hypre_HandleCublasHandle(hypre_handle()), CUBLAS_OP_N, global_num_rows, global_num_rows, &d_one, A_mat, global_num_rows, b_vec, i_one, &zero, u_vec, i_one)); } #elif defined(HYPRE_USING_ROCSOLVER) /************** * TODO (VPM) * **************/ HYPRE_UNUSED_VAR(A_piv); HYPRE_UNUSED_VAR(A_mat); HYPRE_UNUSED_VAR(i_one); HYPRE_UNUSED_VAR(d_one); HYPRE_UNUSED_VAR(zero); #else /* Silence declared but never referenced warnings */ (A_mat += 0); (A_piv += 0); (i_one *= 1); (d_one *= 1.0); (zero *= zero); hypre_error_w_msg(HYPRE_ERROR_GENERIC, "Missing dependency library for running gaussian elimination!"); #endif /* Check error code */ if (ierr < 0) { hypre_sprintf(msg, "Problem with getrs' %d-th input argument", -ierr); hypre_error_w_msg(HYPRE_ERROR_GENERIC, msg); return hypre_error_flag; } /* Copy solution vector to proper variable */ work = (solver_type == 198 || solver_type == 199) ? u_vec : b_vec; hypre_TMemcpy(u_data, work + first_row_index, HYPRE_Complex, num_rows, memory_location, ge_memory_location); /* Free memory */ hypre_TFree(d_ierr, HYPRE_MEMORY_DEVICE); return hypre_error_flag; } #endif /* if defined(HYPRE_USING_CUDA) || defined(HYPRE_USING_HIP) */ hypre-2.33.0/src/parcsr_ls/par_gsmg.c000066400000000000000000002111331477326011500174570ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * Geometrically smooth interpolation multigrid * *****************************************************************************/ #include #include #include "_hypre_parcsr_ls.h" #include "par_amg.h" #include "_hypre_lapack.h" #ifndef ABS #define ABS(x) ((x)>0 ? (x) : -(x)) #endif #ifndef MAX #define MAX(a,b) ((a)>(b)?(a):(b)) #endif static HYPRE_Real mydnrm2(HYPRE_Int n, HYPRE_Real *x) { HYPRE_Real temp = 0.; HYPRE_Int i; for (i = 0; i < n; i++) { temp = temp + x[i] * x[i]; } return hypre_sqrt(temp); } static void mydscal(HYPRE_Int n, HYPRE_Real a, HYPRE_Real *x) { HYPRE_Int i; for (i = 0; i < n; i++) { x[i] = a * x[i]; } } /*-------------------------------------------------------------------------- * hypre_ParCSRMatrixFillSmooth * - fill in smooth matrix * - this function will scale the smooth vectors *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ParCSRMatrixFillSmooth(HYPRE_Int nsamples, HYPRE_Real *samples, hypre_ParCSRMatrix *S, hypre_ParCSRMatrix *A, HYPRE_Int num_functions, HYPRE_Int *dof_func) { hypre_ParCSRCommPkg *comm_pkg = hypre_ParCSRMatrixCommPkg(A); hypre_ParCSRCommHandle *comm_handle; hypre_CSRMatrix *S_diag = hypre_ParCSRMatrixDiag(S); HYPRE_Int *S_diag_i = hypre_CSRMatrixI(S_diag); HYPRE_Int *S_diag_j = hypre_CSRMatrixJ(S_diag); HYPRE_Real *S_diag_data = hypre_CSRMatrixData(S_diag); hypre_CSRMatrix *S_offd = hypre_ParCSRMatrixOffd(S); HYPRE_Int *S_offd_i = hypre_CSRMatrixI(S_offd); HYPRE_Int *S_offd_j = hypre_CSRMatrixJ(S_offd); HYPRE_Real *S_offd_data = hypre_CSRMatrixData(S_offd); hypre_CSRMatrix *A_diag = hypre_ParCSRMatrixDiag(A); HYPRE_Real *A_diag_data = hypre_CSRMatrixData(A_diag); hypre_CSRMatrix *A_offd = hypre_ParCSRMatrixOffd(A); HYPRE_Real *A_offd_data = hypre_CSRMatrixData(A_offd); HYPRE_Int n = hypre_CSRMatrixNumRows(S_diag); HYPRE_Int i, j, k, ii, index, start; HYPRE_Int num_cols_offd; HYPRE_Int num_sends; HYPRE_Int *dof_func_offd = NULL; HYPRE_Int *int_buf_data; HYPRE_Real temp; HYPRE_Real *p; HYPRE_Real *p_offd; HYPRE_Real *p_ptr; HYPRE_Real *buf_data; HYPRE_Real nm; #if 0 HYPRE_Real mx = 0., my = 1.e+10; #endif /* normalize each sample vector and divide by number of samples */ for (k = 0; k < nsamples; k++) { nm = mydnrm2(n, samples + k * n); nm = 1. / nm / nsamples; mydscal(n, nm, samples + k * n); } num_cols_offd = hypre_CSRMatrixNumCols(S_offd); num_sends = hypre_ParCSRCommPkgNumSends(comm_pkg); buf_data = hypre_CTAlloc(HYPRE_Real, hypre_ParCSRCommPkgSendMapStart(comm_pkg, num_sends), HYPRE_MEMORY_HOST); p_offd = hypre_CTAlloc(HYPRE_Real, nsamples * num_cols_offd, HYPRE_MEMORY_HOST); p_ptr = p_offd; p = samples; for (k = 0; k < nsamples; k++) { index = 0; for (i = 0; i < num_sends; i++) { start = hypre_ParCSRCommPkgSendMapStart(comm_pkg, i); for (j = start; j < hypre_ParCSRCommPkgSendMapStart(comm_pkg, i + 1); j++) buf_data[index++] = p[hypre_ParCSRCommPkgSendMapElmt(comm_pkg, j)]; } comm_handle = hypre_ParCSRCommHandleCreate( 1, comm_pkg, buf_data, p_offd); hypre_ParCSRCommHandleDestroy(comm_handle); p = p + n; p_offd = p_offd + num_cols_offd; } hypre_TFree(buf_data, HYPRE_MEMORY_HOST); if (num_functions > 1) { dof_func_offd = hypre_CTAlloc(HYPRE_Int, num_cols_offd, HYPRE_MEMORY_HOST); int_buf_data = hypre_CTAlloc(HYPRE_Int, hypre_ParCSRCommPkgSendMapStart(comm_pkg, num_sends), HYPRE_MEMORY_HOST); index = 0; for (i = 0; i < num_sends; i++) { start = hypre_ParCSRCommPkgSendMapStart(comm_pkg, i); for (j = start; j < hypre_ParCSRCommPkgSendMapStart(comm_pkg, i + 1); j++) int_buf_data[index++] = dof_func[hypre_ParCSRCommPkgSendMapElmt(comm_pkg, j)]; } comm_handle = hypre_ParCSRCommHandleCreate( 11, comm_pkg, int_buf_data, dof_func_offd); hypre_ParCSRCommHandleDestroy(comm_handle); hypre_TFree(int_buf_data, HYPRE_MEMORY_HOST); } for (i = 0; i < n; i++) { for (j = S_diag_i[i] + 1; j < S_diag_i[i + 1]; j++) { ii = S_diag_j[j]; /* only interpolate between like functions */ if (num_functions > 1 && dof_func[i] != dof_func[ii]) { S_diag_data[j] = 0.; continue; } /* explicit zeros */ if (A_diag_data[j] == 0.) { S_diag_data[j] = 0.; continue; } temp = 0.; p = samples; for (k = 0; k < nsamples; k++) { temp = temp + ABS(p[i] - p[ii]); p = p + n; } /* explicit zeros in matrix may cause this */ if (temp == 0.) { S_diag_data[j] = 0.; continue; } temp = 1. / temp; /* reciprocal */ #if 0 my = hypre_min(my, temp); mx = hypre_max(mx, temp); #endif S_diag_data[j] = temp; } for (j = S_offd_i[i]; j < S_offd_i[i + 1]; j++) { ii = S_offd_j[j]; /* only interpolate between like functions */ if (num_functions > 1 && dof_func[i] != dof_func_offd[ii]) { S_offd_data[j] = 0.; continue; } /* explicit zeros */ if (A_offd_data[j] == 0.) { S_offd_data[j] = 0.; continue; } temp = 0.; p = samples; p_offd = p_ptr; for (k = 0; k < nsamples; k++) { temp = temp + ABS(p[i] - p_offd[ii]); p = p + n; p_offd = p_offd + num_cols_offd; } /* explicit zeros in matrix may cause this */ if (temp == 0.) { S_offd_data[j] = 0.; continue; } temp = 1. / temp; /* reciprocal */ #if 0 my = hypre_min(my, temp); mx = hypre_max(mx, temp); #endif S_offd_data[j] = temp; } } #if 0 hypre_printf("MIN, MAX: %f %f\n", my, mx); #endif hypre_TFree(p_ptr, HYPRE_MEMORY_HOST); if (num_functions > 1) { hypre_TFree(dof_func_offd, HYPRE_MEMORY_HOST); } return 0; } /*-------------------------------------------------------------------------- * hypre_ParCSRMatrixChooseThresh *--------------------------------------------------------------------------*/ HYPRE_Real hypre_ParCSRMatrixChooseThresh(hypre_ParCSRMatrix *S) { MPI_Comm comm = hypre_ParCSRMatrixComm(S); hypre_CSRMatrix *S_diag = hypre_ParCSRMatrixDiag(S); hypre_CSRMatrix *S_offd = hypre_ParCSRMatrixOffd(S); HYPRE_Int *S_diag_i = hypre_CSRMatrixI(S_diag); HYPRE_Int *S_offd_i = hypre_CSRMatrixI(S_offd); HYPRE_Real *S_diag_data = hypre_CSRMatrixData(S_diag); HYPRE_Real *S_offd_data = hypre_CSRMatrixData(S_offd); HYPRE_Int n = hypre_CSRMatrixNumRows(S_diag); HYPRE_Int i, j; HYPRE_Real mx, minimax = 1.e+10; HYPRE_Real minmin; for (i = 0; i < n; i++) { mx = 0.; for (j = S_diag_i[i]; j < S_diag_i[i + 1]; j++) { mx = hypre_max(mx, S_diag_data[j]); } for (j = S_offd_i[i]; j < S_offd_i[i + 1]; j++) { mx = hypre_max(mx, S_offd_data[j]); } if (mx != 0.) { minimax = hypre_min(minimax, mx); } } hypre_MPI_Allreduce(&minimax, &minmin, 1, HYPRE_MPI_REAL, hypre_MPI_MIN, comm); return minmin; } /*-------------------------------------------------------------------------- * hypre_ParCSRMatrixThreshold *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ParCSRMatrixThreshold(hypre_ParCSRMatrix *A, HYPRE_Real thresh) { hypre_CSRMatrix *A_diag = hypre_ParCSRMatrixDiag(A); HYPRE_Int *A_diag_i = hypre_CSRMatrixI(A_diag); HYPRE_Int *A_diag_j = hypre_CSRMatrixJ(A_diag); HYPRE_Real *A_diag_data = hypre_CSRMatrixData(A_diag); hypre_CSRMatrix *A_offd = hypre_ParCSRMatrixOffd(A); HYPRE_Int *A_offd_i = hypre_CSRMatrixI(A_offd); HYPRE_Int *A_offd_j = hypre_CSRMatrixJ(A_offd); HYPRE_Real *A_offd_data = hypre_CSRMatrixData(A_offd); HYPRE_Int n = hypre_CSRMatrixNumRows(A_diag); HYPRE_Int num_nonzeros_diag = A_diag_i[n]; HYPRE_Int num_nonzeros_offd = A_offd_i[n]; HYPRE_Int *S_diag_i; HYPRE_Int *S_diag_j; HYPRE_Real *S_diag_data; HYPRE_Int *S_offd_i; HYPRE_Int *S_offd_j; HYPRE_Real *S_offd_data; HYPRE_Int count, i, jS, jA; /* first count the number of nonzeros we will need */ count = 0; for (i = 0; i < num_nonzeros_diag; i++) if (A_diag_data[i] >= thresh) { count++; } /* allocate vectors */ S_diag_i = hypre_CTAlloc(HYPRE_Int, n + 1, HYPRE_MEMORY_HOST); S_diag_j = hypre_CTAlloc(HYPRE_Int, count, HYPRE_MEMORY_HOST); S_diag_data = hypre_CTAlloc(HYPRE_Real, count, HYPRE_MEMORY_HOST); jS = 0; for (i = 0; i < n; i++) { S_diag_i[i] = jS; for (jA = A_diag_i[i]; jA < A_diag_i[i + 1]; jA++) { if (A_diag_data[jA] >= thresh) { S_diag_data[jS] = A_diag_data[jA]; S_diag_j[jS] = A_diag_j[jA]; jS++; } } } S_diag_i[n] = jS; hypre_CSRMatrixNumNonzeros(A_diag) = jS; /* free the vectors we don't need */ hypre_TFree(A_diag_i, HYPRE_MEMORY_HOST); hypre_TFree(A_diag_j, HYPRE_MEMORY_HOST); hypre_TFree(A_diag_data, HYPRE_MEMORY_HOST); /* assign the new vectors */ hypre_CSRMatrixI(A_diag) = S_diag_i; hypre_CSRMatrixJ(A_diag) = S_diag_j; hypre_CSRMatrixData(A_diag) = S_diag_data; /* * Offd part */ /* first count the number of nonzeros we will need */ count = 0; for (i = 0; i < num_nonzeros_offd; i++) if (A_offd_data[i] >= thresh) { count++; } /* allocate vectors */ S_offd_i = hypre_CTAlloc(HYPRE_Int, n + 1, HYPRE_MEMORY_HOST); S_offd_j = hypre_CTAlloc(HYPRE_Int, count, HYPRE_MEMORY_HOST); S_offd_data = hypre_CTAlloc(HYPRE_Real, count, HYPRE_MEMORY_HOST); jS = 0; for (i = 0; i < n; i++) { S_offd_i[i] = jS; for (jA = A_offd_i[i]; jA < A_offd_i[i + 1]; jA++) { if (A_offd_data[jA] >= thresh) { S_offd_data[jS] = A_offd_data[jA]; S_offd_j[jS] = A_offd_j[jA]; jS++; } } } S_offd_i[n] = jS; hypre_CSRMatrixNumNonzeros(A_offd) = jS; /* free the vectors we don't need */ hypre_TFree(A_offd_i, HYPRE_MEMORY_HOST); hypre_TFree(A_offd_j, HYPRE_MEMORY_HOST); hypre_TFree(A_offd_data, HYPRE_MEMORY_HOST); /* assign the new vectors */ hypre_CSRMatrixI(A_offd) = S_offd_i; hypre_CSRMatrixJ(A_offd) = S_offd_j; hypre_CSRMatrixData(A_offd) = S_offd_data; return 0; } /*-------------------------------------------------------------------------- * CreateSmoothVecs * - smoother depends on the level being used *--------------------------------------------------------------------------*/ HYPRE_Int hypre_BoomerAMGCreateSmoothVecs(void *data, hypre_ParCSRMatrix *A, HYPRE_Int num_sweeps, HYPRE_Int level, HYPRE_Real **SmoothVecs_p) { hypre_ParAMGData *amg_data = (hypre_ParAMGData*) data; MPI_Comm comm = hypre_ParCSRMatrixComm(A); hypre_ParCSRCommPkg *comm_pkg = hypre_ParCSRMatrixCommPkg(A); hypre_CSRMatrix *A_diag = hypre_ParCSRMatrixDiag(A); hypre_ParVector *Zero; hypre_ParVector *Temp; hypre_ParVector *U; hypre_ParVector *Qtemp = NULL; HYPRE_Int i; HYPRE_BigInt n = hypre_ParCSRMatrixGlobalNumRows(A); HYPRE_Int n_local = hypre_CSRMatrixNumRows(A_diag); HYPRE_BigInt *starts = hypre_ParCSRMatrixRowStarts(A); HYPRE_Int sample; HYPRE_Int nsamples = hypre_ParAMGDataNumSamples(amg_data); HYPRE_Int ret; HYPRE_Real *datax, *bp, *p; HYPRE_Int rlx_type; HYPRE_Int smooth_type; HYPRE_Int smooth_option = 0; HYPRE_Int smooth_num_levels; HYPRE_Solver *smoother = NULL; HYPRE_Int debug_flag = hypre_ParAMGDataDebugFlag(amg_data); HYPRE_Int num_threads; num_threads = hypre_NumThreads(); if (!comm_pkg) { hypre_MatvecCommPkgCreate(A); comm_pkg = hypre_ParCSRMatrixCommPkg(A); } if (debug_flag >= 1) hypre_printf("Creating smooth dirs, %d sweeps, %d samples\n", num_sweeps, nsamples); smooth_type = hypre_ParAMGDataSmoothType(amg_data); smooth_num_levels = hypre_ParAMGDataSmoothNumLevels(amg_data); if (smooth_num_levels > level) { smooth_option = smooth_type; smoother = hypre_ParAMGDataSmoother(amg_data); num_sweeps = hypre_ParAMGDataSmoothNumSweeps(amg_data); } rlx_type = hypre_ParAMGDataGridRelaxType(amg_data)[0]; /* rlx_wt = hypre_ParAMGDataRelaxWeight(amg_data)[level]; */ /* omega = hypre_ParAMGDataOmega(amg_data)[level]; */ /* generate par vectors */ Zero = hypre_ParVectorCreate(comm, n, starts); hypre_ParVectorInitialize(Zero); datax = hypre_VectorData(hypre_ParVectorLocalVector(Zero)); for (i = 0; i < n_local; i++) { datax[i] = 0.; } Temp = hypre_ParVectorCreate(comm, n, starts); hypre_ParVectorInitialize(Temp); datax = hypre_VectorData(hypre_ParVectorLocalVector(Temp)); for (i = 0; i < n_local; i++) { datax[i] = 0.; } U = hypre_ParVectorCreate(comm, n, starts); hypre_ParVectorInitialize(U); datax = hypre_VectorData(hypre_ParVectorLocalVector(U)); if (num_threads > 1) { Qtemp = hypre_ParVectorCreate(comm, n, starts); hypre_ParVectorInitialize(Qtemp); } /* allocate space for the vectors */ bp = hypre_CTAlloc(HYPRE_Real, nsamples * n_local, HYPRE_MEMORY_HOST); p = bp; /* generate random vectors */ for (sample = 0; sample < nsamples; sample++) { for (i = 0; i < n_local; i++) { datax[i] = hypre_Rand() - .5; } for (i = 0; i < num_sweeps; i++) { if ((smooth_num_levels > level) && (smooth_option == 6)) { HYPRE_SchwarzSolve(smoother[level], (HYPRE_ParCSRMatrix) A, (HYPRE_ParVector) Zero, (HYPRE_ParVector) U); } else { ret = hypre_BoomerAMGRelax(A, Zero, NULL /*CFmarker*/, rlx_type, 0 /*rel pts*/, 1.0 /*weight*/, 1.0 /*omega*/, NULL, U, Temp, Qtemp); hypre_assert(ret == 0); } } /* copy out the solution */ for (i = 0; i < n_local; i++) { *p++ = datax[i]; } } hypre_ParVectorDestroy(Zero); hypre_ParVectorDestroy(Temp); hypre_ParVectorDestroy(U); if (num_threads > 1) { hypre_ParVectorDestroy(Qtemp); } *SmoothVecs_p = bp; return 0; } /*-------------------------------------------------------------------------- * CreateSmoothDirs replaces CreateS in AMG * - smoother depends on the level being used * - in this version, CreateSmoothVecs must be called prior to this function *--------------------------------------------------------------------------*/ HYPRE_Int hypre_BoomerAMGCreateSmoothDirs(void *data, hypre_ParCSRMatrix *A, HYPRE_Real *SmoothVecs, HYPRE_Real thresh, HYPRE_Int num_functions, HYPRE_Int *dof_func, hypre_ParCSRMatrix **S_ptr) { hypre_ParAMGData *amg_data = (hypre_ParAMGData*) data; hypre_ParCSRMatrix *S; HYPRE_Real minimax; HYPRE_Int debug_flag = hypre_ParAMGDataDebugFlag(amg_data); S = hypre_ParCSRMatrixClone(A, 0); /* Traverse S and fill in differences */ hypre_ParCSRMatrixFillSmooth( hypre_ParAMGDataNumSamples(amg_data), SmoothVecs, S, A, num_functions, dof_func); minimax = hypre_ParCSRMatrixChooseThresh(S); if (debug_flag >= 1) { hypre_printf("Minimax chosen: %f\n", minimax); } /* Threshold and compress */ hypre_ParCSRMatrixThreshold(S, thresh * minimax); *S_ptr = S; return 0; } /*--------------------------------------------------------------------------- * hypre_BoomerAMGNormalizeVecs * * Normalize the smooth vectors and also make the first vector the constant * vector * * inputs: * n = length of smooth vectors * num = number of smooth vectors * V = smooth vectors (array of length n*num), also an output * * output: * V = adjusted smooth vectors *--------------------------------------------------------------------------*/ HYPRE_Int hypre_BoomerAMGNormalizeVecs(HYPRE_Int n, HYPRE_Int num, HYPRE_Real *V) { HYPRE_Int i, j; HYPRE_Real nrm; /* change first vector to the constant vector */ for (i = 0; i < n; i++) { V[i] = 1.0; } for (j = 0; j < num; j++) { nrm = mydnrm2(n, &V[j * n]); mydscal(n, 1. / nrm, &V[j * n]); } return 0; } /*--------------------------------------------------------------------------- * hypre_BoomerAMGFitVectors * * Construct interpolation weights based on fitting smooth vectors * * inputs: * ip = row number of row in P being processed (0-based) * n = length of smooth vectors * num = number of smooth vectors * V = smooth vectors (array of length n*num), also an output * nc = number of coarse grid points * ind = indices of coarse grid points (0-based) * * output: * val = interpolation weights for the coarse grid points * V = smooth vectors; first one has been changed to constant vector; * vectors have also been normalized; this is also an input *--------------------------------------------------------------------------*/ HYPRE_Int hypre_BoomerAMGFitVectors(HYPRE_Int ip, HYPRE_Int n, HYPRE_Int num, const HYPRE_Real *V, HYPRE_Int nc, const HYPRE_Int *ind, HYPRE_Real *val) { HYPRE_Real *a, *b; HYPRE_Real *ap; HYPRE_Int i, j; HYPRE_Real *work; HYPRE_Int work_size; HYPRE_Int info; HYPRE_Int temp; /* hypre_printf("Fit: row %d, n %d num %d, nc = %d ", ip, n, num, nc); for (i=0; i 1 && num_cols_S_offd) { dof_func_offd = hypre_CTAlloc(HYPRE_Int, num_cols_S_offd, HYPRE_MEMORY_HOST); } if (!comm_pkg) { hypre_MatvecCommPkgCreate(S); comm_pkg = hypre_ParCSRMatrixCommPkg(S); } num_sends = hypre_ParCSRCommPkgNumSends(comm_pkg); int_buf_data = hypre_CTAlloc(HYPRE_Int, hypre_ParCSRCommPkgSendMapStart(comm_pkg, num_sends), HYPRE_MEMORY_HOST); index = 0; for (i = 0; i < num_sends; i++) { start = hypre_ParCSRCommPkgSendMapStart(comm_pkg, i); for (j = start; j < hypre_ParCSRCommPkgSendMapStart(comm_pkg, i + 1); j++) int_buf_data[index++] = CF_marker[hypre_ParCSRCommPkgSendMapElmt(comm_pkg, j)]; } comm_handle = hypre_ParCSRCommHandleCreate( 11, comm_pkg, int_buf_data, CF_marker_offd); hypre_ParCSRCommHandleDestroy(comm_handle); if (num_functions > 1) { index = 0; for (i = 0; i < num_sends; i++) { start = hypre_ParCSRCommPkgSendMapStart(comm_pkg, i); for (j = start; j < hypre_ParCSRCommPkgSendMapStart(comm_pkg, i + 1); j++) int_buf_data[index++] = dof_func[hypre_ParCSRCommPkgSendMapElmt(comm_pkg, j)]; } comm_handle = hypre_ParCSRCommHandleCreate( 11, comm_pkg, int_buf_data, dof_func_offd); hypre_ParCSRCommHandleDestroy(comm_handle); } hypre_TFree(int_buf_data, HYPRE_MEMORY_HOST); if (debug_flag == 4) { wall_time = time_getWallclockSeconds() - wall_time; hypre_printf("Proc = %d Interp: Comm 1 CF_marker = %f\n", my_id, wall_time); fflush(NULL); } /*---------------------------------------------------------------------- * Get the ghost rows of S *---------------------------------------------------------------------*/ if (debug_flag == 4) { wall_time = time_getWallclockSeconds(); } if (num_procs > 1) { S_ext = hypre_ParCSRMatrixExtractBExt(S, S, 1); //S_ext_i = hypre_CSRMatrixI(S_ext); //S_ext_j = hypre_CSRMatrixBigJ(S_ext); //S_ext_data = hypre_CSRMatrixData(S_ext); } if (debug_flag == 4) { wall_time = time_getWallclockSeconds() - wall_time; hypre_printf("Proc = %d Interp: Comm 2 Get S_ext = %f\n", my_id, wall_time); fflush(NULL); } /*----------------------------------------------------------------------- * First Pass: Determine size of P and fill in fine_to_coarse mapping. *-----------------------------------------------------------------------*/ /*----------------------------------------------------------------------- * Intialize counters and allocate mapping vector. *-----------------------------------------------------------------------*/ coarse_counter = hypre_CTAlloc(HYPRE_Int, num_threads, HYPRE_MEMORY_HOST); jj_count = hypre_CTAlloc(HYPRE_Int, num_threads, HYPRE_MEMORY_HOST); jj_count_offd = hypre_CTAlloc(HYPRE_Int, num_threads, HYPRE_MEMORY_HOST); fine_to_coarse = hypre_CTAlloc(HYPRE_Int, n_fine, HYPRE_MEMORY_HOST); #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i) HYPRE_SMP_SCHEDULE #endif for (i = 0; i < n_fine; i++) { fine_to_coarse[i] = -1; } jj_counter = start_indexing; jj_counter_offd = start_indexing; /*----------------------------------------------------------------------- * Loop over fine grid. *-----------------------------------------------------------------------*/ /* RDF: this looks a little tricky, but doable */ #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i,j,i1,jj,ns,ne,size,rest) HYPRE_SMP_SCHEDULE #endif for (j = 0; j < num_threads; j++) { size = n_fine / num_threads; rest = n_fine - size * num_threads; if (j < rest) { ns = j * size + j; ne = (j + 1) * size + j + 1; } else { ns = j * size + rest; ne = (j + 1) * size + rest; } for (i = ns; i < ne; i++) { /*-------------------------------------------------------------------- * If i is a C-point, interpolation is the identity. Also set up * mapping vector. *--------------------------------------------------------------------*/ if (CF_marker[i] >= 0) { jj_count[j]++; fine_to_coarse[i] = coarse_counter[j]; coarse_counter[j]++; } /*-------------------------------------------------------------------- * If i is an F-point, interpolation is from the C-points that * strongly influence i. *--------------------------------------------------------------------*/ else { for (jj = S_diag_i[i]; jj < S_diag_i[i + 1]; jj++) { i1 = S_diag_j[jj]; if (CF_marker[i1] >= 0) { jj_count[j]++; } } if (num_procs > 1) { /* removed */ } } } } /*----------------------------------------------------------------------- * Allocate arrays. *-----------------------------------------------------------------------*/ for (i = 0; i < num_threads - 1; i++) { coarse_counter[i + 1] += coarse_counter[i]; jj_count[i + 1] += jj_count[i]; jj_count_offd[i + 1] += jj_count_offd[i]; } i = num_threads - 1; jj_counter = jj_count[i]; jj_counter_offd = jj_count_offd[i]; P_diag_size = jj_counter; P_diag_i = hypre_CTAlloc(HYPRE_Int, n_fine + 1, HYPRE_MEMORY_HOST); P_diag_j = hypre_CTAlloc(HYPRE_Int, P_diag_size, HYPRE_MEMORY_HOST); P_diag_data = hypre_CTAlloc(HYPRE_Real, P_diag_size, HYPRE_MEMORY_HOST); P_diag_i[n_fine] = jj_counter; P_offd_size = jj_counter_offd; P_offd_i = hypre_CTAlloc(HYPRE_Int, n_fine + 1, HYPRE_MEMORY_HOST); P_offd_j = hypre_CTAlloc(HYPRE_Int, P_offd_size, HYPRE_MEMORY_HOST); P_offd_data = hypre_CTAlloc(HYPRE_Real, P_offd_size, HYPRE_MEMORY_HOST); /*----------------------------------------------------------------------- * Intialize some stuff. *-----------------------------------------------------------------------*/ jj_counter = start_indexing; jj_counter_offd = start_indexing; if (debug_flag == 4) { wall_time = time_getWallclockSeconds() - wall_time; hypre_printf("Proc = %d Interp: Internal work 1 = %f\n", my_id, wall_time); fflush(NULL); } /*----------------------------------------------------------------------- * Send and receive fine_to_coarse info. *-----------------------------------------------------------------------*/ if (debug_flag == 4) { wall_time = time_getWallclockSeconds(); } /*fine_to_coarse_offd = hypre_CTAlloc(HYPRE_BigInt, num_cols_S_offd, HYPRE_MEMORY_HOST); big_buf_data = hypre_CTAlloc(HYPRE_BigInt, hypre_ParCSRCommPkgSendMapStart(comm_pkg, num_sends), HYPRE_MEMORY_HOST);*/ #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i,j,ns,ne,size,rest,coarse_shift) HYPRE_SMP_SCHEDULE #endif for (j = 0; j < num_threads; j++) { coarse_shift = 0; if (j > 0) { coarse_shift = coarse_counter[j - 1]; } size = n_fine / num_threads; rest = n_fine - size * num_threads; if (j < rest) { ns = j * size + j; ne = (j + 1) * size + j + 1; } else { ns = j * size + rest; ne = (j + 1) * size + rest; } for (i = ns; i < ne; i++) { fine_to_coarse[i] += coarse_shift; } } /*index = 0; for (i = 0; i < num_sends; i++) { start = hypre_ParCSRCommPkgSendMapStart(comm_pkg, i); for (j = start; j < hypre_ParCSRCommPkgSendMapStart(comm_pkg, i+1); j++) big_buf_data[index++] = my_first_cpt+(HYPRE_BigInt)fine_to_coarse[hypre_ParCSRCommPkgSendMapElmt(comm_pkg,j)]; } comm_handle = hypre_ParCSRCommHandleCreate( 21, comm_pkg, big_buf_data, fine_to_coarse_offd); hypre_ParCSRCommHandleDestroy(comm_handle); if (debug_flag==4) { wall_time = time_getWallclockSeconds() - wall_time; hypre_printf("Proc = %d Interp: Comm 4 FineToCoarse = %f\n", my_id, wall_time); fflush(NULL); } if (debug_flag==4) wall_time = time_getWallclockSeconds();*/ /*----------------------------------------------------------------------- * Loop over fine grid points. *-----------------------------------------------------------------------*/ #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i,j,jl,i1,jj,ns,ne,size,rest,P_marker,jj_counter,jj_counter_offd) HYPRE_SMP_SCHEDULE #endif for (jl = 0; jl < num_threads; jl++) { size = n_fine / num_threads; rest = n_fine - size * num_threads; if (jl < rest) { ns = jl * size + jl; ne = (jl + 1) * size + jl + 1; } else { ns = jl * size + rest; ne = (jl + 1) * size + rest; } jj_counter = 0; if (jl > 0) { jj_counter = jj_count[jl - 1]; } jj_counter_offd = 0; if (jl > 0) { jj_counter_offd = jj_count_offd[jl - 1]; } for (i = ns; i < ne; i++) { /*-------------------------------------------------------------------- * If i is a c-point, interpolation is the identity. *--------------------------------------------------------------------*/ if (CF_marker[i] >= 0) { P_diag_i[i] = jj_counter; P_diag_j[jj_counter] = fine_to_coarse[i]; P_diag_data[jj_counter] = one; jj_counter++; } /*-------------------------------------------------------------------- * If i is an F-point, build interpolation. *--------------------------------------------------------------------*/ else { HYPRE_Int kk; HYPRE_Int indices[1000]; /* kludge */ /* Diagonal part of P */ P_diag_i[i] = jj_counter; kk = 0; for (jj = S_diag_i[i]; jj < S_diag_i[i + 1]; jj++) { i1 = S_diag_j[jj]; /*-------------------------------------------------------------- * If neighbor i1 is a C-point, set column number in P_diag_j * and initialize interpolation weight to zero. *--------------------------------------------------------------*/ if (CF_marker[i1] >= 0) { P_diag_j[jj_counter] = fine_to_coarse[i1]; jj_counter++; indices[kk] = i1; kk++; } } hypre_BoomerAMGFitVectors(i, n_fine, num_smooth, SmoothVecs, kk, indices, &P_diag_data[P_diag_i[i]]); /* Off-Diagonal part of P */ /* undone */ } } } P_diag_i[i] = jj_counter; /* check that this is in right place for threads */ P = hypre_ParCSRMatrixCreate(comm, hypre_ParCSRMatrixGlobalNumRows(S), total_global_cpts, hypre_ParCSRMatrixColStarts(S), num_cpts_global, 0, P_diag_i[n_fine], P_offd_i[n_fine]); P_diag = hypre_ParCSRMatrixDiag(P); hypre_CSRMatrixData(P_diag) = P_diag_data; hypre_CSRMatrixI(P_diag) = P_diag_i; hypre_CSRMatrixJ(P_diag) = P_diag_j; P_offd = hypre_ParCSRMatrixOffd(P); hypre_CSRMatrixData(P_offd) = P_offd_data; hypre_CSRMatrixI(P_offd) = P_offd_i; hypre_CSRMatrixJ(P_offd) = P_offd_j; /* Compress P, removing coefficients smaller than trunc_factor * Max */ if (trunc_factor != 0.0) { hypre_BoomerAMGInterpTruncation(P, trunc_factor, 0); P_diag_data = hypre_CSRMatrixData(P_diag); P_diag_i = hypre_CSRMatrixI(P_diag); P_diag_j = hypre_CSRMatrixJ(P_diag); P_offd_data = hypre_CSRMatrixData(P_offd); P_offd_i = hypre_CSRMatrixI(P_offd); P_offd_j = hypre_CSRMatrixJ(P_offd); P_diag_size = P_diag_i[n_fine]; P_offd_size = P_offd_i[n_fine]; } num_cols_P_offd = 0; if (P_offd_size) { P_marker = hypre_CTAlloc(HYPRE_Int, P_offd_size, HYPRE_MEMORY_HOST); #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i) HYPRE_SMP_SCHEDULE #endif for (i = 0; i < P_offd_size; i++) { P_marker[i] = P_offd_j[i]; } hypre_qsort0(P_marker, 0, P_offd_size - 1); num_cols_P_offd = 1; index = P_marker[0]; for (i = 1; i < P_offd_size; i++) { if (P_marker[i] > index) { index = P_marker[i]; P_marker[num_cols_P_offd++] = index; } } col_map_offd_P = hypre_CTAlloc(HYPRE_BigInt, num_cols_P_offd, HYPRE_MEMORY_HOST); tmp_map_offd = hypre_CTAlloc(HYPRE_Int, num_cols_P_offd, HYPRE_MEMORY_HOST); for (i = 0; i < num_cols_P_offd; i++) { tmp_map_offd[i] = P_marker[i]; } #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i) HYPRE_SMP_SCHEDULE #endif for (i = 0; i < P_offd_size; i++) P_offd_j[i] = hypre_BinarySearch(tmp_map_offd, P_offd_j[i], num_cols_P_offd); hypre_TFree(P_marker, HYPRE_MEMORY_HOST); } if (num_cols_P_offd) { hypre_ParCSRMatrixColMapOffd(P) = col_map_offd_P; hypre_CSRMatrixNumCols(P_offd) = num_cols_P_offd; } hypre_GetCommPkgRTFromCommPkgA(P, S, fine_to_coarse, tmp_map_offd); *P_ptr = P; hypre_TFree(CF_marker_offd, HYPRE_MEMORY_HOST); hypre_TFree(tmp_map_offd, HYPRE_MEMORY_HOST); hypre_TFree(dof_func_offd, HYPRE_MEMORY_HOST); //hypre_TFree(big_buf_data, HYPRE_MEMORY_HOST); hypre_TFree(fine_to_coarse, HYPRE_MEMORY_HOST); hypre_TFree(coarse_counter, HYPRE_MEMORY_HOST); hypre_TFree(jj_count, HYPRE_MEMORY_HOST); hypre_TFree(jj_count_offd, HYPRE_MEMORY_HOST); hypre_CSRMatrixDestroy(S_ext); return hypre_error_flag; } /*--------------------------------------------------------------------------- * hypre_BoomerAMGBuildInterpGSMG * * Difference with hypre_BoomerAMGBuildInterp is that S contains values * and is used to build interpolation weights. Matrix A is not used. *--------------------------------------------------------------------------*/ HYPRE_Int hypre_BoomerAMGBuildInterpGSMG( hypre_ParCSRMatrix *A, HYPRE_Int *CF_marker, hypre_ParCSRMatrix *S, HYPRE_BigInt *num_cpts_global, HYPRE_Int num_functions, HYPRE_Int *dof_func, HYPRE_Int debug_flag, HYPRE_Real trunc_factor, hypre_ParCSRMatrix **P_ptr) { HYPRE_UNUSED_VAR(A); MPI_Comm comm = hypre_ParCSRMatrixComm(S); hypre_ParCSRCommPkg *comm_pkg = hypre_ParCSRMatrixCommPkg(S); hypre_ParCSRCommHandle *comm_handle; hypre_CSRMatrix *S_diag = hypre_ParCSRMatrixDiag(S); HYPRE_Real *S_diag_data = hypre_CSRMatrixData(S_diag); HYPRE_Int *S_diag_i = hypre_CSRMatrixI(S_diag); HYPRE_Int *S_diag_j = hypre_CSRMatrixJ(S_diag); hypre_CSRMatrix *S_offd = hypre_ParCSRMatrixOffd(S); HYPRE_Real *S_offd_data = hypre_CSRMatrixData(S_offd); HYPRE_Int *S_offd_i = hypre_CSRMatrixI(S_offd); HYPRE_Int *S_offd_j = hypre_CSRMatrixJ(S_offd); HYPRE_Int num_cols_S_offd = hypre_CSRMatrixNumCols(S_offd); HYPRE_BigInt *col_map_offd = hypre_ParCSRMatrixColMapOffd(S); HYPRE_Int *tmp_map_offd = NULL; hypre_ParCSRMatrix *P; HYPRE_BigInt *col_map_offd_P; HYPRE_Int *CF_marker_offd; HYPRE_Int *dof_func_offd = NULL; hypre_CSRMatrix *S_ext = NULL; HYPRE_Real *S_ext_data = NULL; HYPRE_Int *S_ext_i = NULL; HYPRE_BigInt *S_ext_j = NULL; hypre_CSRMatrix *P_diag; hypre_CSRMatrix *P_offd; HYPRE_Real *P_diag_data; HYPRE_Int *P_diag_i; HYPRE_Int *P_diag_j; HYPRE_Real *P_offd_data; HYPRE_Int *P_offd_i; HYPRE_Int *P_offd_j; HYPRE_Int P_diag_size, P_offd_size; HYPRE_Int *P_marker, *P_marker_offd; HYPRE_Int jj_counter, jj_counter_offd; HYPRE_Int *jj_count, *jj_count_offd; HYPRE_Int jj_begin_row, jj_begin_row_offd; HYPRE_Int jj_end_row, jj_end_row_offd; HYPRE_Int start_indexing = 0; /* start indexing for P_data at 0 */ HYPRE_Int n_fine = hypre_CSRMatrixNumRows(S_diag); HYPRE_Int strong_f_marker; HYPRE_Int *fine_to_coarse; HYPRE_Int *coarse_counter; //HYPRE_Int coarse_shift; HYPRE_BigInt total_global_cpts; HYPRE_Int num_cols_P_offd; //HYPRE_BigInt my_first_cpt; HYPRE_BigInt big_i2; HYPRE_Int i, i1, i2; HYPRE_Int j, jl, jj, jj1; HYPRE_Int start; HYPRE_Int c_num; HYPRE_Real sum; HYPRE_Real distribute; HYPRE_Real zero = 0.0; HYPRE_Real one = 1.0; HYPRE_Int my_id; HYPRE_Int num_procs; HYPRE_Int num_threads; HYPRE_Int num_sends; HYPRE_Int index; HYPRE_Int ns, ne, size, rest; HYPRE_Int *int_buf_data; HYPRE_BigInt col_1 = hypre_ParCSRMatrixFirstRowIndex(S); HYPRE_Int local_numrows = hypre_CSRMatrixNumRows(S_diag); HYPRE_BigInt col_n = col_1 + (HYPRE_BigInt)local_numrows; HYPRE_Real wall_time; /* for debugging instrumentation */ hypre_MPI_Comm_size(comm, &num_procs); hypre_MPI_Comm_rank(comm, &my_id); num_threads = hypre_NumThreads(); //my_first_cpt = num_cpts_global[0]; total_global_cpts = 0; /* we will set this later for the matrix in the setup */ /* if (myid == (num_procs -1)) total_global_cpts = coarse_pts_global[1]; hypre_MPI_Bcast(&total_global_cpts, 1, HYPRE_MPI_INT, num_procs-1, comm);*/ /*------------------------------------------------------------------- * Get the CF_marker data for the off-processor columns *-------------------------------------------------------------------*/ if (debug_flag == 4) { wall_time = time_getWallclockSeconds(); } CF_marker_offd = hypre_CTAlloc(HYPRE_Int, num_cols_S_offd, HYPRE_MEMORY_HOST); if (num_functions > 1 && num_cols_S_offd) { dof_func_offd = hypre_CTAlloc(HYPRE_Int, num_cols_S_offd, HYPRE_MEMORY_HOST); } if (!comm_pkg) { hypre_MatvecCommPkgCreate(S); comm_pkg = hypre_ParCSRMatrixCommPkg(S); } num_sends = hypre_ParCSRCommPkgNumSends(comm_pkg); int_buf_data = hypre_CTAlloc(HYPRE_Int, hypre_ParCSRCommPkgSendMapStart(comm_pkg, num_sends), HYPRE_MEMORY_HOST); index = 0; for (i = 0; i < num_sends; i++) { start = hypre_ParCSRCommPkgSendMapStart(comm_pkg, i); for (j = start; j < hypre_ParCSRCommPkgSendMapStart(comm_pkg, i + 1); j++) int_buf_data[index++] = CF_marker[hypre_ParCSRCommPkgSendMapElmt(comm_pkg, j)]; } comm_handle = hypre_ParCSRCommHandleCreate( 11, comm_pkg, int_buf_data, CF_marker_offd); hypre_ParCSRCommHandleDestroy(comm_handle); if (num_functions > 1) { index = 0; for (i = 0; i < num_sends; i++) { start = hypre_ParCSRCommPkgSendMapStart(comm_pkg, i); for (j = start; j < hypre_ParCSRCommPkgSendMapStart(comm_pkg, i + 1); j++) int_buf_data[index++] = dof_func[hypre_ParCSRCommPkgSendMapElmt(comm_pkg, j)]; } comm_handle = hypre_ParCSRCommHandleCreate( 11, comm_pkg, int_buf_data, dof_func_offd); hypre_ParCSRCommHandleDestroy(comm_handle); } if (debug_flag == 4) { wall_time = time_getWallclockSeconds() - wall_time; hypre_printf("Proc = %d Interp: Comm 1 CF_marker = %f\n", my_id, wall_time); fflush(NULL); } /*---------------------------------------------------------------------- * Get the ghost rows of S *---------------------------------------------------------------------*/ if (debug_flag == 4) { wall_time = time_getWallclockSeconds(); } if (num_procs > 1) { S_ext = hypre_ParCSRMatrixExtractBExt(S, S, 1); S_ext_i = hypre_CSRMatrixI(S_ext); S_ext_j = hypre_CSRMatrixBigJ(S_ext); S_ext_data = hypre_CSRMatrixData(S_ext); } if (debug_flag == 4) { wall_time = time_getWallclockSeconds() - wall_time; hypre_printf("Proc = %d Interp: Comm 2 Get S_ext = %f\n", my_id, wall_time); fflush(NULL); } /*----------------------------------------------------------------------- * First Pass: Determine size of P and fill in fine_to_coarse mapping. *-----------------------------------------------------------------------*/ /*----------------------------------------------------------------------- * Intialize counters and allocate mapping vector. *-----------------------------------------------------------------------*/ coarse_counter = hypre_CTAlloc(HYPRE_Int, num_threads, HYPRE_MEMORY_HOST); jj_count = hypre_CTAlloc(HYPRE_Int, num_threads, HYPRE_MEMORY_HOST); jj_count_offd = hypre_CTAlloc(HYPRE_Int, num_threads, HYPRE_MEMORY_HOST); fine_to_coarse = hypre_CTAlloc(HYPRE_Int, n_fine, HYPRE_MEMORY_HOST); #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i) HYPRE_SMP_SCHEDULE #endif for (i = 0; i < n_fine; i++) { fine_to_coarse[i] = -1; } jj_counter = start_indexing; jj_counter_offd = start_indexing; /*----------------------------------------------------------------------- * Loop over fine grid. *-----------------------------------------------------------------------*/ /* RDF: this looks a little tricky, but doable */ #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i,j,i1,jj,ns,ne,size,rest) HYPRE_SMP_SCHEDULE #endif for (j = 0; j < num_threads; j++) { size = n_fine / num_threads; rest = n_fine - size * num_threads; if (j < rest) { ns = j * size + j; ne = (j + 1) * size + j + 1; } else { ns = j * size + rest; ne = (j + 1) * size + rest; } for (i = ns; i < ne; i++) { /*-------------------------------------------------------------------- * If i is a C-point, interpolation is the identity. Also set up * mapping vector. *--------------------------------------------------------------------*/ if (CF_marker[i] >= 0) { jj_count[j]++; fine_to_coarse[i] = coarse_counter[j]; coarse_counter[j]++; } /*-------------------------------------------------------------------- * If i is an F-point, interpolation is from the C-points that * strongly influence i. *--------------------------------------------------------------------*/ else { for (jj = S_diag_i[i]; jj < S_diag_i[i + 1]; jj++) { i1 = S_diag_j[jj]; if (CF_marker[i1] >= 0) { jj_count[j]++; } } if (num_procs > 1) { for (jj = S_offd_i[i]; jj < S_offd_i[i + 1]; jj++) { i1 = S_offd_j[jj]; if (CF_marker_offd[i1] >= 0) { jj_count_offd[j]++; } } } } } } /*----------------------------------------------------------------------- * Allocate arrays. *-----------------------------------------------------------------------*/ for (i = 0; i < num_threads - 1; i++) { coarse_counter[i + 1] += coarse_counter[i]; jj_count[i + 1] += jj_count[i]; jj_count_offd[i + 1] += jj_count_offd[i]; } i = num_threads - 1; jj_counter = jj_count[i]; jj_counter_offd = jj_count_offd[i]; P_diag_size = jj_counter; P_diag_i = hypre_CTAlloc(HYPRE_Int, n_fine + 1, HYPRE_MEMORY_HOST); P_diag_j = hypre_CTAlloc(HYPRE_Int, P_diag_size, HYPRE_MEMORY_HOST); P_diag_data = hypre_CTAlloc(HYPRE_Real, P_diag_size, HYPRE_MEMORY_HOST); P_diag_i[n_fine] = jj_counter; P_offd_size = jj_counter_offd; P_offd_i = hypre_CTAlloc(HYPRE_Int, n_fine + 1, HYPRE_MEMORY_HOST); P_offd_j = hypre_CTAlloc(HYPRE_Int, P_offd_size, HYPRE_MEMORY_HOST); P_offd_data = hypre_CTAlloc(HYPRE_Real, P_offd_size, HYPRE_MEMORY_HOST); /*----------------------------------------------------------------------- * Intialize some stuff. *-----------------------------------------------------------------------*/ jj_counter = start_indexing; jj_counter_offd = start_indexing; if (debug_flag == 4) { wall_time = time_getWallclockSeconds() - wall_time; hypre_printf("Proc = %d Interp: Internal work 1 = %f\n", my_id, wall_time); fflush(NULL); } /*----------------------------------------------------------------------- * Send and receive fine_to_coarse info. *-----------------------------------------------------------------------*/ if (debug_flag == 4) { wall_time = time_getWallclockSeconds(); } /*----------------------------------------------------------------------- * Loop over fine grid points. *-----------------------------------------------------------------------*/ #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i,j,jl,i1,i2,jj,jj1,ns,ne,size,rest,sum,distribute,P_marker,P_marker_offd,strong_f_marker,jj_counter,jj_counter_offd,c_num,jj_begin_row,jj_end_row,jj_begin_row_offd,jj_end_row_offd) HYPRE_SMP_SCHEDULE #endif for (jl = 0; jl < num_threads; jl++) { size = n_fine / num_threads; rest = n_fine - size * num_threads; if (jl < rest) { ns = jl * size + jl; ne = (jl + 1) * size + jl + 1; } else { ns = jl * size + rest; ne = (jl + 1) * size + rest; } jj_counter = 0; if (jl > 0) { jj_counter = jj_count[jl - 1]; } jj_counter_offd = 0; if (jl > 0) { jj_counter_offd = jj_count_offd[jl - 1]; } P_marker = hypre_CTAlloc(HYPRE_Int, n_fine, HYPRE_MEMORY_HOST); P_marker_offd = hypre_CTAlloc(HYPRE_Int, num_cols_S_offd, HYPRE_MEMORY_HOST); for (i = 0; i < n_fine; i++) { P_marker[i] = -1; } for (i = 0; i < num_cols_S_offd; i++) { P_marker_offd[i] = -1; } strong_f_marker = -2; for (i = ns; i < ne; i++) { /*-------------------------------------------------------------------- * If i is a c-point, interpolation is the identity. *--------------------------------------------------------------------*/ if (CF_marker[i] >= 0) { P_diag_i[i] = jj_counter; P_diag_j[jj_counter] = fine_to_coarse[i]; P_diag_data[jj_counter] = one; jj_counter++; } /*-------------------------------------------------------------------- * If i is an F-point, build interpolation. *--------------------------------------------------------------------*/ else { /* Diagonal part of P */ P_diag_i[i] = jj_counter; jj_begin_row = jj_counter; for (jj = S_diag_i[i]; jj < S_diag_i[i + 1]; jj++) { i1 = S_diag_j[jj]; /*-------------------------------------------------------------- * If neighbor i1 is a C-point, set column number in P_diag_j * and initialize interpolation weight to zero. *--------------------------------------------------------------*/ if (CF_marker[i1] >= 0) { P_marker[i1] = jj_counter; P_diag_j[jj_counter] = fine_to_coarse[i1]; P_diag_data[jj_counter] = zero; jj_counter++; } /*-------------------------------------------------------------- * If neighbor i1 is an F-point, mark it as a strong F-point * whose connection needs to be distributed. *--------------------------------------------------------------*/ else { P_marker[i1] = strong_f_marker; } } jj_end_row = jj_counter; /* Off-Diagonal part of P */ P_offd_i[i] = jj_counter_offd; jj_begin_row_offd = jj_counter_offd; if (num_procs > 1) { for (jj = S_offd_i[i]; jj < S_offd_i[i + 1]; jj++) { i1 = S_offd_j[jj]; /*----------------------------------------------------------- * If neighbor i1 is a C-point, set column number in P_offd_j * and initialize interpolation weight to zero. *-----------------------------------------------------------*/ if (CF_marker_offd[i1] >= 0) { P_marker_offd[i1] = jj_counter_offd; P_offd_j[jj_counter_offd] = i1; P_offd_data[jj_counter_offd] = zero; jj_counter_offd++; } /*----------------------------------------------------------- * If neighbor i1 is an F-point, mark it as a strong F-point * whose connection needs to be distributed. *-----------------------------------------------------------*/ else { P_marker_offd[i1] = strong_f_marker; } } } jj_end_row_offd = jj_counter_offd; /* Loop over ith row of S. First, the diagonal part of S */ for (jj = S_diag_i[i]; jj < S_diag_i[i + 1]; jj++) { i1 = S_diag_j[jj]; /*-------------------------------------------------------------- * Case 1: neighbor i1 is a C-point and strongly influences i, * accumulate a_{i,i1} into the interpolation weight. *--------------------------------------------------------------*/ if (P_marker[i1] >= jj_begin_row) { P_diag_data[P_marker[i1]] += S_diag_data[jj]; } /*-------------------------------------------------------------- * Case 2: neighbor i1 is an F-point and strongly influences i, * distribute a_{i,i1} to C-points that strongly infuence i. * Note: currently no distribution to the diagonal in this case. *--------------------------------------------------------------*/ else if (P_marker[i1] == strong_f_marker) { sum = zero; /*----------------------------------------------------------- * Loop over row of S for point i1 and calculate the sum * of the connections to c-points that strongly influence i. *-----------------------------------------------------------*/ /* Diagonal block part of row i1 */ for (jj1 = S_diag_i[i1]; jj1 < S_diag_i[i1 + 1]; jj1++) { i2 = S_diag_j[jj1]; if (P_marker[i2] >= jj_begin_row) { sum += S_diag_data[jj1]; } } /* Off-Diagonal block part of row i1 */ if (num_procs > 1) { for (jj1 = S_offd_i[i1]; jj1 < S_offd_i[i1 + 1]; jj1++) { i2 = S_offd_j[jj1]; if (P_marker_offd[i2] >= jj_begin_row_offd) { sum += S_offd_data[jj1]; } } } if (sum != 0) { distribute = S_diag_data[jj] / sum; /*----------------------------------------------------------- * Loop over row of S for point i1 and do the distribution. *-----------------------------------------------------------*/ /* Diagonal block part of row i1 */ for (jj1 = S_diag_i[i1]; jj1 < S_diag_i[i1 + 1]; jj1++) { i2 = S_diag_j[jj1]; if (P_marker[i2] >= jj_begin_row) P_diag_data[P_marker[i2]] += distribute * S_diag_data[jj1]; } /* Off-Diagonal block part of row i1 */ if (num_procs > 1) { for (jj1 = S_offd_i[i1]; jj1 < S_offd_i[i1 + 1]; jj1++) { i2 = S_offd_j[jj1]; if (P_marker_offd[i2] >= jj_begin_row_offd) P_offd_data[P_marker_offd[i2]] += distribute * S_offd_data[jj1]; } } } else { /* do nothing */ } } /*-------------------------------------------------------------- * Case 3: neighbor i1 weakly influences i, accumulate a_{i,i1} * into the diagonal. *--------------------------------------------------------------*/ else { /* do nothing */ } } /*---------------------------------------------------------------- * Still looping over ith row of S. Next, loop over the * off-diagonal part of S *---------------------------------------------------------------*/ if (num_procs > 1) { for (jj = S_offd_i[i]; jj < S_offd_i[i + 1]; jj++) { i1 = S_offd_j[jj]; /*-------------------------------------------------------------- * Case 1: neighbor i1 is a C-point and strongly influences i, * accumulate a_{i,i1} into the interpolation weight. *--------------------------------------------------------------*/ if (P_marker_offd[i1] >= jj_begin_row_offd) { P_offd_data[P_marker_offd[i1]] += S_offd_data[jj]; } /*------------------------------------------------------------ * Case 2: neighbor i1 is an F-point and strongly influences i, * distribute a_{i,i1} to C-points that strongly infuence i. * Note: currently no distribution to the diagonal in this case. *-----------------------------------------------------------*/ else if (P_marker_offd[i1] == strong_f_marker) { sum = zero; /*--------------------------------------------------------- * Loop over row of S_ext for point i1 and calculate the sum * of the connections to c-points that strongly influence i. *---------------------------------------------------------*/ /* find row number */ c_num = S_offd_j[jj]; for (jj1 = S_ext_i[c_num]; jj1 < S_ext_i[c_num + 1]; jj1++) { big_i2 = S_ext_j[jj1]; if (big_i2 >= col_1 && big_i2 < col_n) { /* in the diagonal block */ if (P_marker[(HYPRE_Int)(big_i2 - col_1)] >= jj_begin_row) { sum += S_ext_data[jj1]; } } else { /* in the off_diagonal block */ j = hypre_BigBinarySearch(col_map_offd, big_i2, num_cols_S_offd); if (j != -1) { if (P_marker_offd[j] >= jj_begin_row_offd) { sum += S_ext_data[jj1]; } } } } if (sum != 0) { distribute = S_offd_data[jj] / sum; /*--------------------------------------------------------- * Loop over row of S_ext for point i1 and do * the distribution. *--------------------------------------------------------*/ /* Diagonal block part of row i1 */ for (jj1 = S_ext_i[c_num]; jj1 < S_ext_i[c_num + 1]; jj1++) { big_i2 = S_ext_j[jj1]; if (big_i2 >= col_1 && big_i2 < col_n) /* in the diagonal block */ { if (P_marker[(HYPRE_Int)(big_i2 - col_1)] >= jj_begin_row) P_diag_data[P_marker[(HYPRE_Int)(big_i2 - col_1)]] += distribute * S_ext_data[jj1]; } else { /* check to see if it is in the off_diagonal block */ j = hypre_BigBinarySearch(col_map_offd, big_i2, num_cols_S_offd); if (j != -1) { if (P_marker_offd[j] >= jj_begin_row_offd) P_offd_data[P_marker_offd[j]] += distribute * S_ext_data[jj1]; } } } } else { /* do nothing */ } } /*----------------------------------------------------------- * Case 3: neighbor i1 weakly influences i, accumulate a_{i,i1} * into the diagonal. *-----------------------------------------------------------*/ else { /* do nothing */ } } } /*----------------------------------------------------------------- * Set interpolation weight by dividing by the diagonal. *-----------------------------------------------------------------*/ sum = 0.; for (jj = jj_begin_row; jj < jj_end_row; jj++) { sum += P_diag_data[jj]; } for (jj = jj_begin_row_offd; jj < jj_end_row_offd; jj++) { sum += P_offd_data[jj]; } for (jj = jj_begin_row; jj < jj_end_row; jj++) { P_diag_data[jj] /= sum; } for (jj = jj_begin_row_offd; jj < jj_end_row_offd; jj++) { P_offd_data[jj] /= sum; } } strong_f_marker--; P_offd_i[i + 1] = jj_counter_offd; } hypre_TFree(P_marker, HYPRE_MEMORY_HOST); hypre_TFree(P_marker_offd, HYPRE_MEMORY_HOST); } P = hypre_ParCSRMatrixCreate(comm, hypre_ParCSRMatrixGlobalNumRows(S), total_global_cpts, hypre_ParCSRMatrixColStarts(S), num_cpts_global, 0, P_diag_i[n_fine], P_offd_i[n_fine]); P_diag = hypre_ParCSRMatrixDiag(P); hypre_CSRMatrixData(P_diag) = P_diag_data; hypre_CSRMatrixI(P_diag) = P_diag_i; hypre_CSRMatrixJ(P_diag) = P_diag_j; P_offd = hypre_ParCSRMatrixOffd(P); hypre_CSRMatrixData(P_offd) = P_offd_data; hypre_CSRMatrixI(P_offd) = P_offd_i; hypre_CSRMatrixJ(P_offd) = P_offd_j; /* Compress P, removing coefficients smaller than trunc_factor * Max */ if (trunc_factor != 0.0) { hypre_BoomerAMGInterpTruncation(P, trunc_factor, 0); P_diag_data = hypre_CSRMatrixData(P_diag); P_diag_i = hypre_CSRMatrixI(P_diag); P_diag_j = hypre_CSRMatrixJ(P_diag); P_offd_data = hypre_CSRMatrixData(P_offd); P_offd_i = hypre_CSRMatrixI(P_offd); P_offd_j = hypre_CSRMatrixJ(P_offd); P_diag_size = P_diag_i[n_fine]; P_offd_size = P_offd_i[n_fine]; } num_cols_P_offd = 0; if (P_offd_size) { P_marker = hypre_CTAlloc(HYPRE_Int, P_offd_size, HYPRE_MEMORY_HOST); #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i) HYPRE_SMP_SCHEDULE #endif for (i = 0; i < P_offd_size; i++) { P_marker[i] = P_offd_j[i]; } hypre_qsort0(P_marker, 0, P_offd_size - 1); num_cols_P_offd = 1; index = P_marker[0]; for (i = 1; i < P_offd_size; i++) { if (P_marker[i] > index) { index = P_marker[i]; P_marker[num_cols_P_offd++] = index; } } col_map_offd_P = hypre_CTAlloc(HYPRE_BigInt, num_cols_P_offd, HYPRE_MEMORY_HOST); tmp_map_offd = hypre_CTAlloc(HYPRE_Int, num_cols_P_offd, HYPRE_MEMORY_HOST); for (i = 0; i < num_cols_P_offd; i++) { tmp_map_offd[i] = P_marker[i]; } #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i) HYPRE_SMP_SCHEDULE #endif for (i = 0; i < P_offd_size; i++) P_offd_j[i] = hypre_BinarySearch(tmp_map_offd, P_offd_j[i], num_cols_P_offd); hypre_TFree(P_marker, HYPRE_MEMORY_HOST); } if (num_cols_P_offd) { hypre_ParCSRMatrixColMapOffd(P) = col_map_offd_P; hypre_CSRMatrixNumCols(P_offd) = num_cols_P_offd; } hypre_GetCommPkgRTFromCommPkgA(P, S, fine_to_coarse, tmp_map_offd); *P_ptr = P; hypre_TFree(CF_marker_offd, HYPRE_MEMORY_HOST); hypre_TFree(dof_func_offd, HYPRE_MEMORY_HOST); hypre_TFree(int_buf_data, HYPRE_MEMORY_HOST); hypre_TFree(fine_to_coarse, HYPRE_MEMORY_HOST); hypre_TFree(tmp_map_offd, HYPRE_MEMORY_HOST); hypre_TFree(coarse_counter, HYPRE_MEMORY_HOST); hypre_TFree(jj_count, HYPRE_MEMORY_HOST); hypre_TFree(jj_count_offd, HYPRE_MEMORY_HOST); hypre_CSRMatrixDestroy(S_ext); return hypre_error_flag; } hypre-2.33.0/src/parcsr_ls/par_ilu.c000066400000000000000000004520551477326011500173250ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * Incomplete LU factorization smoother * *****************************************************************************/ #include "_hypre_parcsr_ls.h" /*-------------------------------------------------------------------------- * hypre_ILUCreate *--------------------------------------------------------------------------*/ void * hypre_ILUCreate( void ) { hypre_ParILUData *ilu_data; hypre_Solver *base; ilu_data = hypre_CTAlloc(hypre_ParILUData, 1, HYPRE_MEMORY_HOST); base = (hypre_Solver*) ilu_data; /* Set base solver function pointers */ hypre_SolverSetup(base) = (HYPRE_PtrToSolverFcn) HYPRE_ILUSetup; hypre_SolverSolve(base) = (HYPRE_PtrToSolverFcn) HYPRE_ILUSolve; hypre_SolverDestroy(base) = (HYPRE_PtrToDestroyFcn) HYPRE_ILUDestroy; #if defined(HYPRE_USING_GPU) hypre_ParILUDataAperm(ilu_data) = NULL; hypre_ParILUDataMatBILUDevice(ilu_data) = NULL; hypre_ParILUDataMatSILUDevice(ilu_data) = NULL; hypre_ParILUDataMatEDevice(ilu_data) = NULL; hypre_ParILUDataMatFDevice(ilu_data) = NULL; hypre_ParILUDataR(ilu_data) = NULL; hypre_ParILUDataP(ilu_data) = NULL; hypre_ParILUDataFTempUpper(ilu_data) = NULL; hypre_ParILUDataUTempLower(ilu_data) = NULL; hypre_ParILUDataADiagDiag(ilu_data) = NULL; hypre_ParILUDataSDiagDiag(ilu_data) = NULL; #endif /* general data */ hypre_ParILUDataGlobalSolver(ilu_data) = 0; hypre_ParILUDataMatA(ilu_data) = NULL; hypre_ParILUDataMatL(ilu_data) = NULL; hypre_ParILUDataMatD(ilu_data) = NULL; hypre_ParILUDataMatU(ilu_data) = NULL; hypre_ParILUDataMatS(ilu_data) = NULL; hypre_ParILUDataSchurSolver(ilu_data) = NULL; hypre_ParILUDataSchurPrecond(ilu_data) = NULL; hypre_ParILUDataRhs(ilu_data) = NULL; hypre_ParILUDataX(ilu_data) = NULL; /* TODO (VPM): Transform this into a stack array */ hypre_ParILUDataDroptol(ilu_data) = hypre_TAlloc(HYPRE_Real, 3, HYPRE_MEMORY_HOST); hypre_ParILUDataDroptol(ilu_data)[0] = 1.0e-02; /* droptol for B */ hypre_ParILUDataDroptol(ilu_data)[1] = 1.0e-02; /* droptol for E and F */ hypre_ParILUDataDroptol(ilu_data)[2] = 1.0e-02; /* droptol for S */ hypre_ParILUDataLfil(ilu_data) = 0; hypre_ParILUDataMaxRowNnz(ilu_data) = 1000; hypre_ParILUDataCFMarkerArray(ilu_data) = NULL; hypre_ParILUDataPerm(ilu_data) = NULL; hypre_ParILUDataQPerm(ilu_data) = NULL; hypre_ParILUDataTolDDPQ(ilu_data) = 1.0e-01; hypre_ParILUDataF(ilu_data) = NULL; hypre_ParILUDataU(ilu_data) = NULL; hypre_ParILUDataFTemp(ilu_data) = NULL; hypre_ParILUDataUTemp(ilu_data) = NULL; hypre_ParILUDataXTemp(ilu_data) = NULL; hypre_ParILUDataYTemp(ilu_data) = NULL; hypre_ParILUDataZTemp(ilu_data) = NULL; hypre_ParILUDataUExt(ilu_data) = NULL; hypre_ParILUDataFExt(ilu_data) = NULL; hypre_ParILUDataResidual(ilu_data) = NULL; hypre_ParILUDataRelResNorms(ilu_data) = NULL; hypre_ParILUDataNumIterations(ilu_data) = 0; hypre_ParILUDataMaxIter(ilu_data) = 20; hypre_ParILUDataTriSolve(ilu_data) = 1; hypre_ParILUDataLowerJacobiIters(ilu_data) = 5; hypre_ParILUDataUpperJacobiIters(ilu_data) = 5; hypre_ParILUDataTol(ilu_data) = 1.0e-7; hypre_ParILUDataLogging(ilu_data) = 0; hypre_ParILUDataPrintLevel(ilu_data) = 0; hypre_ParILUDataL1Norms(ilu_data) = NULL; hypre_ParILUDataOperatorComplexity(ilu_data) = 0.; hypre_ParILUDataIluType(ilu_data) = 0; hypre_ParILUDataNLU(ilu_data) = 0; hypre_ParILUDataNI(ilu_data) = 0; hypre_ParILUDataUEnd(ilu_data) = NULL; /* Iterative setup variables */ hypre_ParILUDataIterativeSetupType(ilu_data) = 0; hypre_ParILUDataIterativeSetupOption(ilu_data) = 0; hypre_ParILUDataIterativeSetupMaxIter(ilu_data) = 100; hypre_ParILUDataIterativeSetupNumIter(ilu_data) = 0; hypre_ParILUDataIterativeSetupTolerance(ilu_data) = 1.e-6; hypre_ParILUDataIterativeSetupHistory(ilu_data) = NULL; /* reordering_type default to use local RCM */ hypre_ParILUDataReorderingType(ilu_data) = 1; /* see hypre_ILUSetType for more default values */ hypre_ParILUDataTestOption(ilu_data) = 0; /* -> General slots */ hypre_ParILUDataSchurSolverLogging(ilu_data) = 0; hypre_ParILUDataSchurSolverPrintLevel(ilu_data) = 0; /* -> Schur-GMRES */ hypre_ParILUDataSchurGMRESKDim(ilu_data) = 5; hypre_ParILUDataSchurGMRESMaxIter(ilu_data) = 5; hypre_ParILUDataSchurGMRESTol(ilu_data) = 0.0; hypre_ParILUDataSchurGMRESAbsoluteTol(ilu_data) = 0.0; hypre_ParILUDataSchurGMRESRelChange(ilu_data) = 0; /* -> Schur precond data */ hypre_ParILUDataSchurPrecondIluType(ilu_data) = 0; hypre_ParILUDataSchurPrecondIluLfil(ilu_data) = 0; hypre_ParILUDataSchurPrecondIluMaxRowNnz(ilu_data) = 100; hypre_ParILUDataSchurPrecondIluDroptol(ilu_data) = NULL; hypre_ParILUDataSchurPrecondPrintLevel(ilu_data) = 0; hypre_ParILUDataSchurPrecondMaxIter(ilu_data) = 1; hypre_ParILUDataSchurPrecondTriSolve(ilu_data) = 1; hypre_ParILUDataSchurPrecondLowerJacobiIters(ilu_data) = 5; hypre_ParILUDataSchurPrecondUpperJacobiIters(ilu_data) = 5; hypre_ParILUDataSchurPrecondTol(ilu_data) = 0.0; /* -> Schur-NSH */ hypre_ParILUDataSchurNSHSolveMaxIter(ilu_data) = 5; hypre_ParILUDataSchurNSHSolveTol(ilu_data) = 0.0; hypre_ParILUDataSchurNSHDroptol(ilu_data) = NULL; hypre_ParILUDataSchurNSHMaxNumIter(ilu_data) = 2; hypre_ParILUDataSchurNSHMaxRowNnz(ilu_data) = 1000; hypre_ParILUDataSchurNSHTol(ilu_data) = 1e-09; hypre_ParILUDataSchurMRMaxIter(ilu_data) = 2; hypre_ParILUDataSchurMRColVersion(ilu_data) = 0; hypre_ParILUDataSchurMRMaxRowNnz(ilu_data) = 200; hypre_ParILUDataSchurMRTol(ilu_data) = 1e-09; return ilu_data; } /*-------------------------------------------------------------------------- * hypre_ILUDestroy *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ILUDestroy( void *data ) { hypre_ParILUData *ilu_data = (hypre_ParILUData*) data; HYPRE_MemoryLocation memory_location; if (ilu_data) { /* Get memory location from L factor */ if (hypre_ParILUDataMatL(ilu_data)) { memory_location = hypre_ParCSRMatrixMemoryLocation(hypre_ParILUDataMatL(ilu_data)); } else { /* Use default memory location */ HYPRE_GetMemoryLocation(&memory_location); } /* GPU additional data */ #if defined(HYPRE_USING_GPU) hypre_ParCSRMatrixDestroy( hypre_ParILUDataAperm(ilu_data) ); hypre_ParCSRMatrixDestroy( hypre_ParILUDataR(ilu_data) ); hypre_ParCSRMatrixDestroy( hypre_ParILUDataP(ilu_data) ); hypre_CSRMatrixDestroy( hypre_ParILUDataMatAILUDevice(ilu_data) ); hypre_CSRMatrixDestroy( hypre_ParILUDataMatBILUDevice(ilu_data) ); hypre_CSRMatrixDestroy( hypre_ParILUDataMatSILUDevice(ilu_data) ); hypre_CSRMatrixDestroy( hypre_ParILUDataMatEDevice(ilu_data) ); hypre_CSRMatrixDestroy( hypre_ParILUDataMatFDevice(ilu_data) ); hypre_SeqVectorDestroy( hypre_ParILUDataFTempUpper(ilu_data) ); hypre_SeqVectorDestroy( hypre_ParILUDataUTempLower(ilu_data) ); hypre_SeqVectorDestroy( hypre_ParILUDataADiagDiag(ilu_data) ); hypre_SeqVectorDestroy( hypre_ParILUDataSDiagDiag(ilu_data) ); #endif /* final residual vector */ hypre_ParVectorDestroy( hypre_ParILUDataResidual(ilu_data) ); hypre_TFree( hypre_ParILUDataRelResNorms(ilu_data), HYPRE_MEMORY_HOST ); /* temp vectors for solve phase */ hypre_ParVectorDestroy( hypre_ParILUDataUTemp(ilu_data) ); hypre_ParVectorDestroy( hypre_ParILUDataFTemp(ilu_data) ); hypre_ParVectorDestroy( hypre_ParILUDataXTemp(ilu_data) ); hypre_ParVectorDestroy( hypre_ParILUDataYTemp(ilu_data) ); hypre_ParVectorDestroy( hypre_ParILUDataZTemp(ilu_data) ); hypre_ParVectorDestroy( hypre_ParILUDataRhs(ilu_data) ); hypre_ParVectorDestroy( hypre_ParILUDataX(ilu_data) ); hypre_TFree( hypre_ParILUDataUExt(ilu_data), HYPRE_MEMORY_HOST ); hypre_TFree( hypre_ParILUDataFExt(ilu_data), HYPRE_MEMORY_HOST ); /* l1_norms */ hypre_TFree( hypre_ParILUDataL1Norms(ilu_data), HYPRE_MEMORY_HOST ); /* u_end */ hypre_TFree( hypre_ParILUDataUEnd(ilu_data), HYPRE_MEMORY_HOST ); /* Factors */ hypre_ParCSRMatrixDestroy( hypre_ParILUDataMatS(ilu_data) ); hypre_ParCSRMatrixDestroy( hypre_ParILUDataMatL(ilu_data) ); hypre_ParCSRMatrixDestroy( hypre_ParILUDataMatU(ilu_data) ); hypre_ParCSRMatrixDestroy( hypre_ParILUDataMatLModified(ilu_data) ); hypre_ParCSRMatrixDestroy( hypre_ParILUDataMatUModified(ilu_data) ); hypre_TFree( hypre_ParILUDataMatD(ilu_data), memory_location ); hypre_TFree( hypre_ParILUDataMatDModified(ilu_data), memory_location ); if (hypre_ParILUDataSchurSolver(ilu_data)) { switch (hypre_ParILUDataIluType(ilu_data)) { case 10: case 11: case 40: case 41: case 50: /* GMRES for Schur */ HYPRE_ParCSRGMRESDestroy(hypre_ParILUDataSchurSolver(ilu_data)); break; case 20: case 21: /* NSH for Schur */ hypre_NSHDestroy(hypre_ParILUDataSchurSolver(ilu_data)); break; default: break; } } /* ILU as precond for Schur */ if ( hypre_ParILUDataSchurPrecond(ilu_data) && #if defined(HYPRE_USING_GPU) hypre_ParILUDataIluType(ilu_data) != 10 && hypre_ParILUDataIluType(ilu_data) != 11 && #endif (hypre_ParILUDataIluType(ilu_data) == 10 || hypre_ParILUDataIluType(ilu_data) == 11 || hypre_ParILUDataIluType(ilu_data) == 40 || hypre_ParILUDataIluType(ilu_data) == 41) ) { HYPRE_ILUDestroy( hypre_ParILUDataSchurPrecond(ilu_data) ); } /* CF marker array */ hypre_TFree( hypre_ParILUDataCFMarkerArray(ilu_data), HYPRE_MEMORY_HOST ); /* permutation array */ hypre_TFree( hypre_ParILUDataPerm(ilu_data), memory_location ); hypre_TFree( hypre_ParILUDataQPerm(ilu_data), memory_location ); /* Iterative ILU data */ hypre_TFree( hypre_ParILUDataIterativeSetupHistory(ilu_data), HYPRE_MEMORY_HOST ); /* droptol array - TODO (VPM): remove this after changing to static array */ hypre_TFree( hypre_ParILUDataDroptol(ilu_data), HYPRE_MEMORY_HOST ); hypre_TFree( hypre_ParILUDataSchurPrecondIluDroptol(ilu_data), HYPRE_MEMORY_HOST ); hypre_TFree( hypre_ParILUDataSchurNSHDroptol(ilu_data), HYPRE_MEMORY_HOST ); } /* ILU data */ hypre_TFree(ilu_data, HYPRE_MEMORY_HOST); return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_ILUSetLevelOfFill * * Set fill level for ILUK *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ILUSetLevelOfFill( void *ilu_vdata, HYPRE_Int lfil ) { hypre_ParILUData *ilu_data = (hypre_ParILUData*) ilu_vdata; hypre_ParILUDataLfil(ilu_data) = lfil; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_ILUSetMaxNnzPerRow * * Set max non-zeros per row in factors for ILUT *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ILUSetMaxNnzPerRow( void *ilu_vdata, HYPRE_Int nzmax ) { hypre_ParILUData *ilu_data = (hypre_ParILUData*) ilu_vdata; hypre_ParILUDataMaxRowNnz(ilu_data) = nzmax; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_ILUSetDropThreshold * * Set threshold for dropping in LU factors for ILUT *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ILUSetDropThreshold( void *ilu_vdata, HYPRE_Real threshold ) { hypre_ParILUData *ilu_data = (hypre_ParILUData*) ilu_vdata; if (!(hypre_ParILUDataDroptol(ilu_data))) { hypre_ParILUDataDroptol(ilu_data) = hypre_TAlloc(HYPRE_Real, 3, HYPRE_MEMORY_HOST); } hypre_ParILUDataDroptol(ilu_data)[0] = threshold; hypre_ParILUDataDroptol(ilu_data)[1] = threshold; hypre_ParILUDataDroptol(ilu_data)[2] = threshold; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_ILUSetDropThresholdArray * * Set array of threshold for dropping in LU factors for ILUT *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ILUSetDropThresholdArray( void *ilu_vdata, HYPRE_Real *threshold ) { hypre_ParILUData *ilu_data = (hypre_ParILUData*) ilu_vdata; if (!(hypre_ParILUDataDroptol(ilu_data))) { hypre_ParILUDataDroptol(ilu_data) = hypre_TAlloc(HYPRE_Real, 3, HYPRE_MEMORY_HOST); } hypre_ParILUDataDroptol(ilu_data)[0] = threshold[0]; hypre_ParILUDataDroptol(ilu_data)[1] = threshold[1]; hypre_ParILUDataDroptol(ilu_data)[2] = threshold[2]; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_ILUSetType * * Set ILU factorization type *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ILUSetType( void *ilu_vdata, HYPRE_Int ilu_type ) { hypre_ParILUData *ilu_data = (hypre_ParILUData*) ilu_vdata; /* Destroy schur solver and/or preconditioner if already have one */ if (hypre_ParILUDataSchurSolver(ilu_data)) { switch (hypre_ParILUDataIluType(ilu_data)) { case 10: case 11: case 40: case 41: case 50: //GMRES for Schur HYPRE_ParCSRGMRESDestroy(hypre_ParILUDataSchurSolver(ilu_data)); break; case 20: case 21: // NSH for Schur hypre_NSHDestroy(hypre_ParILUDataSchurSolver(ilu_data)); break; default: break; } hypre_ParILUDataSchurSolver(ilu_data) = NULL; } /* ILU as precond for Schur */ if ( hypre_ParILUDataSchurPrecond(ilu_data) && #if defined(HYPRE_USING_GPU) (hypre_ParILUDataIluType(ilu_data) != 10 && hypre_ParILUDataIluType(ilu_data) != 11) && #endif (hypre_ParILUDataIluType(ilu_data) == 10 || hypre_ParILUDataIluType(ilu_data) == 11 || hypre_ParILUDataIluType(ilu_data) == 40 || hypre_ParILUDataIluType(ilu_data) == 41) ) { HYPRE_ILUDestroy(hypre_ParILUDataSchurPrecond(ilu_data)); hypre_ParILUDataSchurPrecond(ilu_data) = NULL; } hypre_ParILUDataIluType(ilu_data) = ilu_type; /* reset default value, not a large cost * assume we won't change back from */ switch (ilu_type) { /* NSH type */ case 20: case 21: { /* only set value when user has not assiged value before */ if (!(hypre_ParILUDataSchurNSHDroptol(ilu_data))) { hypre_ParILUDataSchurNSHDroptol(ilu_data) = hypre_TAlloc(HYPRE_Real, 2, HYPRE_MEMORY_HOST); hypre_ParILUDataSchurNSHDroptol(ilu_data)[0] = 1e-02; hypre_ParILUDataSchurNSHDroptol(ilu_data)[1] = 1e-02; } break; } case 10: case 11: case 40: case 41: case 50: { /* Set value of droptol for solving Schur system (if not set by user) */ /* NOTE: This is currently not exposed to users */ if (!(hypre_ParILUDataSchurPrecondIluDroptol(ilu_data))) { hypre_ParILUDataSchurPrecondIluDroptol(ilu_data) = hypre_TAlloc(HYPRE_Real, 3, HYPRE_MEMORY_HOST); hypre_ParILUDataSchurPrecondIluDroptol(ilu_data)[0] = 1e-02; hypre_ParILUDataSchurPrecondIluDroptol(ilu_data)[1] = 1e-02; hypre_ParILUDataSchurPrecondIluDroptol(ilu_data)[2] = 1e-02; } break; } default: break; } return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_ILUSetMaxIter * * Set max number of iterations for ILU solver *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ILUSetMaxIter( void *ilu_vdata, HYPRE_Int max_iter ) { hypre_ParILUData *ilu_data = (hypre_ParILUData*) ilu_vdata; hypre_ParILUDataMaxIter(ilu_data) = max_iter; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_ILUSetIterativeSetupType * * Set iterative ILU setup algorithm *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ILUSetIterativeSetupType( void *ilu_vdata, HYPRE_Int iter_setup_type) { hypre_ParILUData *ilu_data = (hypre_ParILUData*) ilu_vdata; hypre_ParILUDataIterativeSetupType(ilu_data) = iter_setup_type; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_ILUSetIterativeSetupOption * * Set iterative ILU compute option *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ILUSetIterativeSetupOption( void *ilu_vdata, HYPRE_Int iter_setup_option) { hypre_ParILUData *ilu_data = (hypre_ParILUData*) ilu_vdata; /* Compute residuals when using the stopping criteria, if not chosen by the user */ iter_setup_option |= ((iter_setup_option & 0x02) && !(iter_setup_option & 0x0C)) ? 0x08 : 0; /* Compute residuals when asking for conv. history, if not chosen by the user */ iter_setup_option |= ((iter_setup_option & 0x10) && !(iter_setup_option & 0x08)) ? 0x08 : 0; /* Zero out first bit of option (turn off rocSPARSE logging) */ iter_setup_option &= ~0x01; /* Set internal iter_setup_option */ hypre_ParILUDataIterativeSetupOption(ilu_data) = iter_setup_option; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_ILUSetIterativeSetupMaxIter * * Set maximum number of iterations for iterative ILU setup *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ILUSetIterativeSetupMaxIter( void *ilu_vdata, HYPRE_Int iter_setup_max_iter) { hypre_ParILUData *ilu_data = (hypre_ParILUData*) ilu_vdata; hypre_ParILUDataIterativeSetupMaxIter(ilu_data) = iter_setup_max_iter; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_ILUSetIterativeSetupTolerance * * Set dropping tolerance for iterative ILU setup *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ILUSetIterativeSetupTolerance( void *ilu_vdata, HYPRE_Real iter_setup_tolerance) { hypre_ParILUData *ilu_data = (hypre_ParILUData*) ilu_vdata; hypre_ParILUDataIterativeSetupTolerance(ilu_data) = iter_setup_tolerance; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_ILUGetIterativeSetupHistory * * Get array of corrections and/or residual norms computed during ILU's * iterative setup algorithm. *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ILUGetIterativeSetupHistory( void *ilu_vdata, HYPRE_Complex **iter_setup_history) { hypre_ParILUData *ilu_data = (hypre_ParILUData*) ilu_vdata; *iter_setup_history = hypre_ParILUDataIterativeSetupHistory(ilu_data); return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_ILUSetTriSolve * * Set ILU triangular solver type *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ILUSetTriSolve( void *ilu_vdata, HYPRE_Int tri_solve ) { hypre_ParILUData *ilu_data = (hypre_ParILUData*) ilu_vdata; hypre_ParILUDataTriSolve(ilu_data) = tri_solve; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_ILUSetLowerJacobiIters * * Set Lower Jacobi iterations for iterative triangular solver *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ILUSetLowerJacobiIters( void *ilu_vdata, HYPRE_Int lower_jacobi_iters ) { hypre_ParILUData *ilu_data = (hypre_ParILUData*) ilu_vdata; hypre_ParILUDataLowerJacobiIters(ilu_data) = lower_jacobi_iters; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_ILUSetUpperJacobiIters * * Set Upper Jacobi iterations for iterative triangular solver *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ILUSetUpperJacobiIters( void *ilu_vdata, HYPRE_Int upper_jacobi_iters ) { hypre_ParILUData *ilu_data = (hypre_ParILUData*) ilu_vdata; hypre_ParILUDataUpperJacobiIters(ilu_data) = upper_jacobi_iters; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_ILUSetTol * * Set convergence tolerance for ILU solver *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ILUSetTol( void *ilu_vdata, HYPRE_Real tol ) { hypre_ParILUData *ilu_data = (hypre_ParILUData*) ilu_vdata; hypre_ParILUDataTol(ilu_data) = tol; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_ILUSetPrintLevel * * Set print level for ILU solver *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ILUSetPrintLevel( void *ilu_vdata, HYPRE_Int print_level ) { hypre_ParILUData *ilu_data = (hypre_ParILUData*) ilu_vdata; hypre_ParILUDataPrintLevel(ilu_data) = print_level; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_ILUSetLogging * * Set print level for ilu solver *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ILUSetLogging( void *ilu_vdata, HYPRE_Int logging ) { hypre_ParILUData *ilu_data = (hypre_ParILUData*) ilu_vdata; hypre_ParILUDataLogging(ilu_data) = logging; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_ILUSetLocalReordering * * Set type of reordering for local matrix *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ILUSetLocalReordering( void *ilu_vdata, HYPRE_Int ordering_type ) { hypre_ParILUData *ilu_data = (hypre_ParILUData*) ilu_vdata; hypre_ParILUDataReorderingType(ilu_data) = ordering_type; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_ILUSetSchurSolverKDIM * * Set KDim (for GMRES) for Solver of Schur System *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ILUSetSchurSolverKDIM( void *ilu_vdata, HYPRE_Int ss_kDim ) { hypre_ParILUData *ilu_data = (hypre_ParILUData*) ilu_vdata; hypre_ParILUDataSchurGMRESKDim(ilu_data) = ss_kDim; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_ILUSetSchurSolverMaxIter * * Set max iteration for Solver of Schur System *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ILUSetSchurSolverMaxIter( void *ilu_vdata, HYPRE_Int ss_max_iter ) { hypre_ParILUData *ilu_data = (hypre_ParILUData*) ilu_vdata; /* for the GMRES solve, the max iter is same as kdim by default */ hypre_ParILUDataSchurGMRESKDim(ilu_data) = ss_max_iter; hypre_ParILUDataSchurGMRESMaxIter(ilu_data) = ss_max_iter; /* also set this value for NSH solve */ hypre_ParILUDataSchurNSHSolveMaxIter(ilu_data) = ss_max_iter; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_ILUSetSchurSolverTol * * Set convergence tolerance for Solver of Schur System *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ILUSetSchurSolverTol( void *ilu_vdata, HYPRE_Real ss_tol ) { hypre_ParILUData *ilu_data = (hypre_ParILUData*) ilu_vdata; hypre_ParILUDataSchurGMRESTol(ilu_data) = ss_tol; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_ILUSetSchurSolverAbsoluteTol * * Set absolute tolerance for Solver of Schur System *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ILUSetSchurSolverAbsoluteTol( void *ilu_vdata, HYPRE_Real ss_absolute_tol ) { hypre_ParILUData *ilu_data = (hypre_ParILUData*) ilu_vdata; hypre_ParILUDataSchurGMRESAbsoluteTol(ilu_data) = ss_absolute_tol; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_ILUSetSchurSolverLogging * * Set logging for Solver of Schur System *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ILUSetSchurSolverLogging( void *ilu_vdata, HYPRE_Int ss_logging ) { hypre_ParILUData *ilu_data = (hypre_ParILUData*) ilu_vdata; hypre_ParILUDataSchurSolverLogging(ilu_data) = ss_logging; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_ILUSetSchurSolverPrintLevel * * Set print level for Solver of Schur System *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ILUSetSchurSolverPrintLevel( void *ilu_vdata, HYPRE_Int ss_print_level ) { hypre_ParILUData *ilu_data = (hypre_ParILUData*) ilu_vdata; hypre_ParILUDataSchurSolverPrintLevel(ilu_data) = ss_print_level; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_ILUSetSchurSolverRelChange * * Set rel change (for GMRES) for Solver of Schur System *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ILUSetSchurSolverRelChange( void *ilu_vdata, HYPRE_Int ss_rel_change ) { hypre_ParILUData *ilu_data = (hypre_ParILUData*) ilu_vdata; hypre_ParILUDataSchurGMRESRelChange(ilu_data) = ss_rel_change; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_ILUSetSchurPrecondILUType * * Set ILU type for Precond of Schur System *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ILUSetSchurPrecondILUType( void *ilu_vdata, HYPRE_Int sp_ilu_type ) { hypre_ParILUData *ilu_data = (hypre_ParILUData*) ilu_vdata; hypre_ParILUDataSchurPrecondIluType(ilu_data) = sp_ilu_type; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_ILUSetSchurPrecondILULevelOfFill * * Set ILU level of fill for Precond of Schur System *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ILUSetSchurPrecondILULevelOfFill( void *ilu_vdata, HYPRE_Int sp_ilu_lfil ) { hypre_ParILUData *ilu_data = (hypre_ParILUData*) ilu_vdata; hypre_ParILUDataSchurPrecondIluLfil(ilu_data) = sp_ilu_lfil; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_ILUSetSchurPrecondILUMaxNnzPerRow * * Set ILU max nonzeros per row for Precond of Schur System *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ILUSetSchurPrecondILUMaxNnzPerRow( void *ilu_vdata, HYPRE_Int sp_ilu_max_row_nnz ) { hypre_ParILUData *ilu_data = (hypre_ParILUData*) ilu_vdata; hypre_ParILUDataSchurPrecondIluMaxRowNnz(ilu_data) = sp_ilu_max_row_nnz; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_ILUSetSchurPrecondILUDropThreshold * * Set ILU drop threshold for ILUT for Precond of Schur System * We don't want to influence the original ILU, so create new array if * not own data *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ILUSetSchurPrecondILUDropThreshold( void *ilu_vdata, HYPRE_Real sp_ilu_droptol ) { hypre_ParILUData *ilu_data = (hypre_ParILUData*) ilu_vdata; if (!(hypre_ParILUDataSchurPrecondIluDroptol(ilu_data))) { hypre_ParILUDataSchurPrecondIluDroptol(ilu_data) = hypre_TAlloc(HYPRE_Real, 3, HYPRE_MEMORY_HOST); } hypre_ParILUDataSchurPrecondIluDroptol(ilu_data)[0] = sp_ilu_droptol; hypre_ParILUDataSchurPrecondIluDroptol(ilu_data)[1] = sp_ilu_droptol; hypre_ParILUDataSchurPrecondIluDroptol(ilu_data)[2] = sp_ilu_droptol; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_ILUSetSchurPrecondILUDropThresholdArray * * Set array of ILU drop threshold for ILUT for Precond of Schur System *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ILUSetSchurPrecondILUDropThresholdArray( void *ilu_vdata, HYPRE_Real *sp_ilu_droptol ) { hypre_ParILUData *ilu_data = (hypre_ParILUData*) ilu_vdata; if (!(hypre_ParILUDataSchurPrecondIluDroptol(ilu_data))) { hypre_ParILUDataSchurPrecondIluDroptol(ilu_data) = hypre_TAlloc(HYPRE_Real, 3, HYPRE_MEMORY_HOST); } hypre_ParILUDataSchurPrecondIluDroptol(ilu_data)[0] = sp_ilu_droptol[0]; hypre_ParILUDataSchurPrecondIluDroptol(ilu_data)[1] = sp_ilu_droptol[1]; hypre_ParILUDataSchurPrecondIluDroptol(ilu_data)[2] = sp_ilu_droptol[2]; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_ILUSetSchurPrecondPrintLevel * * Set print level for Precond of Schur System *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ILUSetSchurPrecondPrintLevel( void *ilu_vdata, HYPRE_Int sp_print_level ) { hypre_ParILUData *ilu_data = (hypre_ParILUData*) ilu_vdata; hypre_ParILUDataSchurPrecondPrintLevel(ilu_data) = sp_print_level; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_ILUSetSchurPrecondMaxIter * * Set max number of iterations for Precond of Schur System *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ILUSetSchurPrecondMaxIter( void *ilu_vdata, HYPRE_Int sp_max_iter ) { hypre_ParILUData *ilu_data = (hypre_ParILUData*) ilu_vdata; hypre_ParILUDataSchurPrecondMaxIter(ilu_data) = sp_max_iter; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_ILUSetSchurPrecondTriSolve * * Set triangular solver type for Precond of Schur System *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ILUSetSchurPrecondTriSolve( void *ilu_vdata, HYPRE_Int sp_tri_solve ) { hypre_ParILUData *ilu_data = (hypre_ParILUData*) ilu_vdata; hypre_ParILUDataSchurPrecondTriSolve(ilu_data) = sp_tri_solve; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_ILUSetSchurPrecondLowerJacobiIters * * Set Lower Jacobi iterations for Precond of Schur System *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ILUSetSchurPrecondLowerJacobiIters( void *ilu_vdata, HYPRE_Int sp_lower_jacobi_iters ) { hypre_ParILUData *ilu_data = (hypre_ParILUData*) ilu_vdata; hypre_ParILUDataSchurPrecondLowerJacobiIters(ilu_data) = sp_lower_jacobi_iters; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_ILUSetSchurPrecondUpperJacobiIters * * Set Upper Jacobi iterations for Precond of Schur System *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ILUSetSchurPrecondUpperJacobiIters( void *ilu_vdata, HYPRE_Int sp_upper_jacobi_iters ) { hypre_ParILUData *ilu_data = (hypre_ParILUData*) ilu_vdata; hypre_ParILUDataSchurPrecondUpperJacobiIters(ilu_data) = sp_upper_jacobi_iters; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_ILUSetSchurPrecondTol * * Set convergence tolerance for Precond of Schur System *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ILUSetSchurPrecondTol( void *ilu_vdata, HYPRE_Int sp_tol ) { hypre_ParILUData *ilu_data = (hypre_ParILUData*) ilu_vdata; hypre_ParILUDataSchurPrecondTol(ilu_data) = sp_tol; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_ILUSetSchurNSHDropThreshold * * Set tolorance for dropping in NSH for Schur System * We don't want to influence the original ILU, so create new array if * not own data *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ILUSetSchurNSHDropThreshold( void *ilu_vdata, HYPRE_Real threshold ) { hypre_ParILUData *ilu_data = (hypre_ParILUData*) ilu_vdata; if (!(hypre_ParILUDataSchurNSHDroptol(ilu_data))) { hypre_ParILUDataSchurNSHDroptol(ilu_data) = hypre_TAlloc(HYPRE_Real, 2, HYPRE_MEMORY_HOST); } hypre_ParILUDataSchurNSHDroptol(ilu_data)[0] = threshold; hypre_ParILUDataSchurNSHDroptol(ilu_data)[1] = threshold; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_ILUSetSchurNSHDropThresholdArray * * Set tolorance array for NSH for Schur System * - threshold[0] : threshold for Minimal Residual iteration (initial guess for NSH). * - threshold[1] : threshold for Newton-Schulz-Hotelling iteration. *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ILUSetSchurNSHDropThresholdArray( void *ilu_vdata, HYPRE_Real *threshold ) { hypre_ParILUData *ilu_data = (hypre_ParILUData*) ilu_vdata; if (!(hypre_ParILUDataSchurNSHDroptol(ilu_data))) { hypre_ParILUDataSchurNSHDroptol(ilu_data) = hypre_TAlloc(HYPRE_Real, 2, HYPRE_MEMORY_HOST); } hypre_ParILUDataSchurNSHDroptol(ilu_data)[0] = threshold[0]; hypre_ParILUDataSchurNSHDroptol(ilu_data)[1] = threshold[1]; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_ILUGetNumIterations * * Get number of iterations for ILU solver *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ILUGetNumIterations( void *ilu_vdata, HYPRE_Int *num_iterations ) { hypre_ParILUData *ilu_data = (hypre_ParILUData*) ilu_vdata; if (!ilu_data) { hypre_error_in_arg(1); return hypre_error_flag; } *num_iterations = hypre_ParILUDataNumIterations(ilu_data); return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_ILUGetFinalRelativeResidualNorm * * Get residual norms for ILU solver *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ILUGetFinalRelativeResidualNorm( void *ilu_vdata, HYPRE_Real *res_norm ) { hypre_ParILUData *ilu_data = (hypre_ParILUData*) ilu_vdata; if (!ilu_data) { hypre_error_in_arg(1); return hypre_error_flag; } *res_norm = hypre_ParILUDataFinalRelResidualNorm(ilu_data); return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_ILUWriteSolverParams * * Print solver params * * TODO (VPM): check runtime switch to decide whether running on host or device *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ILUWriteSolverParams(void *ilu_vdata) { hypre_ParILUData *ilu_data = (hypre_ParILUData*) ilu_vdata; hypre_printf("ILU Setup parameters: \n"); hypre_printf("ILU factorization type: %d : ", hypre_ParILUDataIluType(ilu_data)); switch (hypre_ParILUDataIluType(ilu_data)) { case 0: #if defined(HYPRE_USING_GPU) if ( hypre_ParILUDataLfil(ilu_data) == 0 ) { hypre_printf("Block Jacobi with GPU-accelerated ILU0 \n"); hypre_printf("Operator Complexity (Fill factor) = %f \n", hypre_ParILUDataOperatorComplexity(ilu_data)); } else #endif { hypre_printf("Block Jacobi with ILU(%d) \n", hypre_ParILUDataLfil(ilu_data)); hypre_printf("Operator Complexity (Fill factor) = %f \n", hypre_ParILUDataOperatorComplexity(ilu_data)); } break; case 1: hypre_printf("Block Jacobi with ILUT \n"); hypre_printf("drop tolerance for B = %e, E&F = %e, S = %e \n", hypre_ParILUDataDroptol(ilu_data)[0], hypre_ParILUDataDroptol(ilu_data)[1], hypre_ParILUDataDroptol(ilu_data)[2]); hypre_printf("Max nnz per row = %d \n", hypre_ParILUDataMaxRowNnz(ilu_data)); hypre_printf("Operator Complexity (Fill factor) = %f \n", hypre_ParILUDataOperatorComplexity(ilu_data)); break; case 10: #if defined(HYPRE_USING_GPU) if ( hypre_ParILUDataLfil(ilu_data) == 0 ) { hypre_printf("ILU-GMRES with GPU-accelerated ILU0 \n"); hypre_printf("Operator Complexity (Fill factor) = %f \n", hypre_ParILUDataOperatorComplexity(ilu_data)); } else #endif { hypre_printf("ILU-GMRES with ILU(%d) \n", hypre_ParILUDataLfil(ilu_data)); hypre_printf("Operator Complexity (Fill factor) = %f \n", hypre_ParILUDataOperatorComplexity(ilu_data)); } break; case 11: hypre_printf("ILU-GMRES with ILUT \n"); hypre_printf("drop tolerance for B = %e, E&F = %e, S = %e \n", hypre_ParILUDataDroptol(ilu_data)[0], hypre_ParILUDataDroptol(ilu_data)[1], hypre_ParILUDataDroptol(ilu_data)[2]); hypre_printf("Max nnz per row = %d \n", hypre_ParILUDataMaxRowNnz(ilu_data)); hypre_printf("Operator Complexity (Fill factor) = %f \n", hypre_ParILUDataOperatorComplexity(ilu_data)); break; case 20: hypre_printf("Newton-Schulz-Hotelling with ILU(%d) \n", hypre_ParILUDataLfil(ilu_data)); hypre_printf("Operator Complexity (Fill factor) = %f \n", hypre_ParILUDataOperatorComplexity(ilu_data)); break; case 21: hypre_printf("Newton-Schulz-Hotelling with ILUT \n"); hypre_printf("drop tolerance for B = %e, E&F = %e, S = %e \n", hypre_ParILUDataDroptol(ilu_data)[0], hypre_ParILUDataDroptol(ilu_data)[1], hypre_ParILUDataDroptol(ilu_data)[2]); hypre_printf("Max nnz per row = %d \n", hypre_ParILUDataMaxRowNnz(ilu_data)); hypre_printf("Operator Complexity (Fill factor) = %f \n", hypre_ParILUDataOperatorComplexity(ilu_data)); break; case 30: hypre_printf("RAS with ILU(%d) \n", hypre_ParILUDataLfil(ilu_data)); hypre_printf("Operator Complexity (Fill factor) = %f \n", hypre_ParILUDataOperatorComplexity(ilu_data)); break; case 31: hypre_printf("RAS with ILUT \n"); hypre_printf("drop tolerance for B = %e, E&F = %e, S = %e \n", hypre_ParILUDataDroptol(ilu_data)[0], hypre_ParILUDataDroptol(ilu_data)[1], hypre_ParILUDataDroptol(ilu_data)[2]); hypre_printf("Max nnz per row = %d \n", hypre_ParILUDataMaxRowNnz(ilu_data)); hypre_printf("Operator Complexity (Fill factor) = %f \n", hypre_ParILUDataOperatorComplexity(ilu_data)); break; case 40: hypre_printf("ddPQ-ILU-GMRES with ILU(%d) \n", hypre_ParILUDataLfil(ilu_data)); hypre_printf("Operator Complexity (Fill factor) = %f \n", hypre_ParILUDataOperatorComplexity(ilu_data)); break; case 41: hypre_printf("ddPQ-ILU-GMRES with ILUT \n"); hypre_printf("drop tolerance for B = %e, E&F = %e, S = %e \n", hypre_ParILUDataDroptol(ilu_data)[0], hypre_ParILUDataDroptol(ilu_data)[1], hypre_ParILUDataDroptol(ilu_data)[2]); hypre_printf("Max nnz per row = %d \n", hypre_ParILUDataMaxRowNnz(ilu_data)); hypre_printf("Operator Complexity (Fill factor) = %f \n", hypre_ParILUDataOperatorComplexity(ilu_data)); break; case 50: hypre_printf("RAP-Modified-ILU with ILU(%d) \n", hypre_ParILUDataLfil(ilu_data)); hypre_printf("Operator Complexity (Fill factor) = %f \n", hypre_ParILUDataOperatorComplexity(ilu_data)); break; default: hypre_printf("Unknown type \n"); break; } hypre_printf("\n ILU Solver Parameters: \n"); hypre_printf("Max number of iterations: %d\n", hypre_ParILUDataMaxIter(ilu_data)); if (hypre_ParILUDataTriSolve(ilu_data)) { hypre_printf(" Triangular solver type: exact (1)\n"); } else { hypre_printf(" Triangular solver type: iterative (0)\n"); hypre_printf(" Lower Jacobi Iterations: %d\n", hypre_ParILUDataLowerJacobiIters(ilu_data)); hypre_printf(" Upper Jacobi Iterations: %d\n", hypre_ParILUDataUpperJacobiIters(ilu_data)); } hypre_printf(" Stopping tolerance: %e\n", hypre_ParILUDataTol(ilu_data)); return hypre_error_flag; } /****************************************************************************** * * ILU helper functions * * TODO (VPM): move these to a new "par_ilu_utils.c" file * *****************************************************************************/ /*-------------------------------------------------------------------------- * hypre_ILUMinHeapAddI * * Add an element to the heap * I means HYPRE_Int * R means HYPRE_Real * max/min heap * r means heap goes from 0 to -1, -2 instead of 0 1 2 * Ii and Ri means orderd by value of heap, like iw for ILU * heap: array of that heap * len: the current length of the heap * WARNING: You should first put that element to the end of the heap * and add the length of heap by one before call this function. * the reason is that we don't want to change something outside the * heap, so left it to the user *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ILUMinHeapAddI(HYPRE_Int *heap, HYPRE_Int len) { /* parent, left, right */ HYPRE_Int p; len--; /* now len is the current index */ while (len > 0) { /* get the parent index */ p = (len - 1) / 2; if (heap[p] > heap[len]) { /* this is smaller */ hypre_swap(heap, p, len); len = p; } else { break; } } return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_ILUMinHeapAddIIIi * * See hypre_ILUMinHeapAddI for detail instructions *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ILUMinHeapAddIIIi(HYPRE_Int *heap, HYPRE_Int *I1, HYPRE_Int *Ii1, HYPRE_Int len) { /* parent, left, right */ HYPRE_Int p; len--; /* now len is the current index */ while (len > 0) { /* get the parent index */ p = (len - 1) / 2; if (heap[p] > heap[len]) { /* this is smaller */ hypre_swap(Ii1, heap[p], heap[len]); hypre_swap2i(heap, I1, p, len); len = p; } else { break; } } return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_ILUMinHeapAddIRIi * * see hypre_ILUMinHeapAddI for detail instructions *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ILUMinHeapAddIRIi(HYPRE_Int *heap, HYPRE_Real *I1, HYPRE_Int *Ii1, HYPRE_Int len) { /* parent, left, right */ HYPRE_Int p; len--; /* now len is the current index */ while (len > 0) { /* get the parent index */ p = (len - 1) / 2; if (heap[p] > heap[len]) { /* this is smaller */ hypre_swap(Ii1, heap[p], heap[len]); hypre_swap2(heap, I1, p, len); len = p; } else { break; } } return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_ILUMaxrHeapAddRabsI * * See hypre_ILUMinHeapAddI for detail instructions *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ILUMaxrHeapAddRabsI(HYPRE_Real *heap, HYPRE_Int *I1, HYPRE_Int len) { /* parent, left, right */ HYPRE_Int p; len--;/* now len is the current index */ while (len > 0) { /* get the parent index */ p = (len - 1) / 2; if (hypre_abs(heap[-p]) < hypre_abs(heap[-len])) { /* this is smaller */ hypre_swap2(I1, heap, -p, -len); len = p; } else { break; } } return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_ILUMinHeapRemoveI * * Swap the first element with the last element of the heap, * reduce size by one, and maintain the heap structure * I means HYPRE_Int * R means HYPRE_Real * max/min heap * r means heap goes from 0 to -1, -2 instead of 0 1 2 * Ii and Ri means orderd by value of heap, like iw for ILU * heap: aray of that heap * len: current length of the heap * WARNING: Remember to change the len yourself *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ILUMinHeapRemoveI(HYPRE_Int *heap, HYPRE_Int len) { /* parent, left, right */ HYPRE_Int p, l, r; len--; /* now len is the max index */ /* swap the first element to last */ hypre_swap(heap, 0, len); p = 0; l = 1; /* while I'm still in the heap */ while (l < len) { r = 2 * p + 2; /* two childs, pick the smaller one */ l = r >= len || heap[l] < heap[r] ? l : r; if (heap[l] < heap[p]) { hypre_swap(heap, l, p); p = l; l = 2 * p + 1; } else { break; } } return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_ILUMinHeapRemoveIIIi * * See hypre_ILUMinHeapRemoveI for detail instructions *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ILUMinHeapRemoveIIIi(HYPRE_Int *heap, HYPRE_Int *I1, HYPRE_Int *Ii1, HYPRE_Int len) { /* parent, left, right */ HYPRE_Int p, l, r; len--;/* now len is the max index */ /* swap the first element to last */ hypre_swap(Ii1, heap[0], heap[len]); hypre_swap2i(heap, I1, 0, len); p = 0; l = 1; /* while I'm still in the heap */ while (l < len) { r = 2 * p + 2; /* two childs, pick the smaller one */ l = r >= len || heap[l] < heap[r] ? l : r; if (heap[l] < heap[p]) { hypre_swap(Ii1, heap[p], heap[l]); hypre_swap2i(heap, I1, l, p); p = l; l = 2 * p + 1; } else { break; } } return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_ILUMinHeapRemoveIRIi * * See hypre_ILUMinHeapRemoveI for detail instructions *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ILUMinHeapRemoveIRIi(HYPRE_Int *heap, HYPRE_Real *I1, HYPRE_Int *Ii1, HYPRE_Int len) { /* parent, left, right */ HYPRE_Int p, l, r; len--;/* now len is the max index */ /* swap the first element to last */ hypre_swap(Ii1, heap[0], heap[len]); hypre_swap2(heap, I1, 0, len); p = 0; l = 1; /* while I'm still in the heap */ while (l < len) { r = 2 * p + 2; /* two childs, pick the smaller one */ l = r >= len || heap[l] < heap[r] ? l : r; if (heap[l] < heap[p]) { hypre_swap(Ii1, heap[p], heap[l]); hypre_swap2(heap, I1, l, p); p = l; l = 2 * p + 1; } else { break; } } return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_ILUMaxrHeapRemoveRabsI * * See hypre_ILUMinHeapRemoveI for detail instructions *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ILUMaxrHeapRemoveRabsI(HYPRE_Real *heap, HYPRE_Int *I1, HYPRE_Int len) { /* parent, left, right */ HYPRE_Int p, l, r; len--;/* now len is the max index */ /* swap the first element to last */ hypre_swap2(I1, heap, 0, -len); p = 0; l = 1; /* while I'm still in the heap */ while (l < len) { r = 2 * p + 2; /* two childs, pick the smaller one */ l = r >= len || hypre_abs(heap[-l]) > hypre_abs(heap[-r]) ? l : r; if (hypre_abs(heap[-l]) > hypre_abs(heap[-p])) { hypre_swap2(I1, heap, -l, -p); p = l; l = 2 * p + 1; } else { break; } } return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_ILUMaxQSplitRabsI * * Split based on quick sort algorithm (avoid sorting the entire array) * find the largest k elements out of original array * * arrayR: input array for compare * arrayI: integer array bind with array * k: largest k elements * len: length of the array *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ILUMaxQSplitRabsI(HYPRE_Real *arrayR, HYPRE_Int *arrayI, HYPRE_Int left, HYPRE_Int bound, HYPRE_Int right) { HYPRE_Int i, last; if (left >= right) { return hypre_error_flag; } hypre_swap2(arrayI, arrayR, left, (left + right) / 2); last = left; for (i = left + 1 ; i <= right ; i ++) { if (hypre_abs(arrayR[i]) > hypre_abs(arrayR[left])) { hypre_swap2(arrayI, arrayR, ++last, i); } } hypre_swap2(arrayI, arrayR, left, last); hypre_ILUMaxQSplitRabsI(arrayR, arrayI, left, bound, last - 1); if (bound > last) { hypre_ILUMaxQSplitRabsI(arrayR, arrayI, last + 1, bound, right); } return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_ILUMaxRabs * * Helper function to search max value from a row * array: the array we work on * start: the start of the search range * end: the end of the search range * nLU: ignore rows (new row index) after nLU * rperm: reverse permutation array rperm[old] = new. * if rperm set to NULL, ingore nLU and rperm * value: return the value ge get (absolute value) * index: return the index of that value, could be NULL which means not return * l1_norm: return the l1_norm of the array, could be NULL which means no return * nnz: return the number of nonzeros inside this array, could be NULL which means no return *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ILUMaxRabs(HYPRE_Real *array_data, HYPRE_Int *array_j, HYPRE_Int start, HYPRE_Int end, HYPRE_Int nLU, HYPRE_Int *rperm, HYPRE_Real *value, HYPRE_Int *index, HYPRE_Real *l1_norm, HYPRE_Int *nnz) { HYPRE_Int i, idx, col, nz; HYPRE_Real val, max_value, norm; nz = 0; norm = 0.0; max_value = -1.0; idx = -1; if (rperm) { /* apply rperm and nLU */ for (i = start ; i < end ; i ++) { col = rperm[array_j[i]]; if (col > nLU) { /* this old column is in new external part */ continue; } nz ++; val = hypre_abs(array_data[i]); norm += val; if (max_value < val) { max_value = val; idx = i; } } } else { /* basic search */ for (i = start ; i < end ; i ++) { val = hypre_abs(array_data[i]); norm += val; if (max_value < val) { max_value = val; idx = i; } } nz = end - start; } *value = max_value; if (index) { *index = idx; } if (l1_norm) { *l1_norm = norm; } if (nnz) { *nnz = nz; } return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_ILUGetPermddPQPre * * Pre selection for ddPQ, this is the basic version considering row sparsity * n: size of matrix * nLU: size we consider ddPQ reorder, only first nLU*nLU block is considered * A_diag_i/j/data: information of A * tol: tol for ddPQ, normally between 0.1-0.3 * *perm: current row order * *rperm: current column order * *pperm_pre: output ddPQ pre row roder * *qperm_pre: output ddPQ pre column order *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ILUGetPermddPQPre(HYPRE_Int n, HYPRE_Int nLU, HYPRE_Int *A_diag_i, HYPRE_Int *A_diag_j, HYPRE_Real *A_diag_data, HYPRE_Real tol, HYPRE_Int *perm, HYPRE_Int *rperm, HYPRE_Int *pperm_pre, HYPRE_Int *qperm_pre, HYPRE_Int *nB) { HYPRE_UNUSED_VAR(n); HYPRE_Int i, ii, nB_pre, k1, k2; HYPRE_Real gtol, max_value, norm; HYPRE_Int *jcol, *jnnz; HYPRE_Real *weight; weight = hypre_TAlloc(HYPRE_Real, nLU + 1, HYPRE_MEMORY_HOST); jcol = hypre_TAlloc(HYPRE_Int, nLU + 1, HYPRE_MEMORY_HOST); jnnz = hypre_TAlloc(HYPRE_Int, nLU + 1, HYPRE_MEMORY_HOST); max_value = -1.0; /* first need to build gtol */ for (ii = 0; ii < nLU; ii++) { /* find real row */ i = perm[ii]; k1 = A_diag_i[i]; k2 = A_diag_i[i + 1]; /* find max|a| of that row and its index */ hypre_ILUMaxRabs(A_diag_data, A_diag_j, k1, k2, nLU, rperm, weight + ii, jcol + ii, &norm, jnnz + ii); weight[ii] /= norm; if (weight[ii] > max_value) { max_value = weight[ii]; } } gtol = tol * max_value; /* second loop to pre select B */ nB_pre = 0; for ( ii = 0 ; ii < nLU ; ii ++) { /* keep this row */ if (weight[ii] > gtol) { weight[nB_pre] /= (HYPRE_Real)(jnnz[ii]); pperm_pre[nB_pre] = perm[ii]; qperm_pre[nB_pre++] = A_diag_j[jcol[ii]]; } } *nB = nB_pre; /* sort from small to large */ hypre_qsort3(weight, pperm_pre, qperm_pre, 0, nB_pre - 1); hypre_TFree(weight, HYPRE_MEMORY_HOST); hypre_TFree(jcol, HYPRE_MEMORY_HOST); hypre_TFree(jnnz, HYPRE_MEMORY_HOST); return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_ILUGetPermddPQ * * Get ddPQ version perm array for ParCSR matrices. ddPQ is a two-side * permutation for diagonal dominance. Greedy matching selection * * Parameters: * A: the input matrix * pperm: row permutation (lives at memory_location_A) * qperm: col permutation (lives at memory_location_A) * nB: the size of B block * nI: number of interial nodes * tol: the dropping tolorance for ddPQ * reordering_type: Type of reordering for the interior nodes. * * Currently only supports RCM reordering. Set to 0 for no reordering. * * TODO (VPM): Change permutation arrays types to hypre_IntArray *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ILUGetPermddPQ(hypre_ParCSRMatrix *A, HYPRE_Int **io_pperm, HYPRE_Int **io_qperm, HYPRE_Real tol, HYPRE_Int *nB, HYPRE_Int *nI, HYPRE_Int reordering_type) { /* data objects for A */ hypre_CSRMatrix *A_diag = hypre_ParCSRMatrixDiag(A); HYPRE_Int n = hypre_CSRMatrixNumRows(A_diag); HYPRE_MemoryLocation memory_location = hypre_CSRMatrixMemoryLocation(A_diag); hypre_CSRMatrix *h_A_diag; HYPRE_Int *A_diag_i; HYPRE_Int *A_diag_j; HYPRE_Complex *A_diag_data; /* Local variables */ HYPRE_Int i, nB_pre, irow, jcol, nLU; HYPRE_Int *pperm, *qperm; HYPRE_Int *new_pperm, *new_qperm; HYPRE_Int *rpperm, *rqperm, *pperm_pre, *qperm_pre; HYPRE_MemoryLocation memory_location_perm; /* 1: Setup and create memory */ pperm = NULL; qperm = hypre_TAlloc(HYPRE_Int, n, HYPRE_MEMORY_HOST); rpperm = hypre_TAlloc(HYPRE_Int, n, HYPRE_MEMORY_HOST); rqperm = hypre_TAlloc(HYPRE_Int, n, HYPRE_MEMORY_HOST); /* 2: Find interior nodes first */ hypre_ILUGetInteriorExteriorPerm(A, HYPRE_MEMORY_HOST, &pperm, &nLU, 0); /* 3: Pre selection on interial nodes * this pre selection puts external nodes to the last * also provide candidate rows for B block */ /* build reverse permutation array * rperm[old] = new */ for (i = 0 ; i < n ; i ++) { rpperm[pperm[i]] = i; } /* build place holder for pre selection pairs */ pperm_pre = hypre_TAlloc(HYPRE_Int, nLU, HYPRE_MEMORY_HOST); qperm_pre = hypre_TAlloc(HYPRE_Int, nLU, HYPRE_MEMORY_HOST); /* Set/Move A_diag to host memory */ h_A_diag = (hypre_GetActualMemLocation(memory_location) == hypre_MEMORY_DEVICE) ? hypre_CSRMatrixClone_v2(A_diag, 1, HYPRE_MEMORY_HOST) : A_diag; A_diag_i = hypre_CSRMatrixI(h_A_diag); A_diag_j = hypre_CSRMatrixJ(h_A_diag); A_diag_data = hypre_CSRMatrixData(h_A_diag); /* pre selection */ hypre_ILUGetPermddPQPre(n, nLU, A_diag_i, A_diag_j, A_diag_data, tol, pperm, rpperm, pperm_pre, qperm_pre, &nB_pre); /* 4: Build B block * Greedy selection */ /* rperm[old] = new */ for (i = 0 ; i < nLU ; i ++) { rpperm[pperm[i]] = -1; } hypre_TMemcpy(rqperm, rpperm, HYPRE_Int, n, HYPRE_MEMORY_HOST, HYPRE_MEMORY_HOST); hypre_TMemcpy(qperm, pperm, HYPRE_Int, n, HYPRE_MEMORY_HOST, HYPRE_MEMORY_HOST); /* we sort from small to large, so we need to go from back to start * we only need nB_pre to start the loop, after that we could use it for size of B */ for (i = nB_pre - 1, nB_pre = 0 ; i >= 0 ; i --) { irow = pperm_pre[i]; jcol = qperm_pre[i]; /* this col is not yet taken */ if (rqperm[jcol] < 0) { rpperm[irow] = nB_pre; rqperm[jcol] = nB_pre; pperm[nB_pre] = irow; qperm[nB_pre++] = jcol; } } /* 5: Complete the permutation * rperm[old] = new * those still mapped to a new index means not yet covered */ nLU = nB_pre; for (i = 0 ; i < n ; i ++) { if (rpperm[i] < 0) { pperm[nB_pre++] = i; } } nB_pre = nLU; for (i = 0 ; i < n ; i ++) { if (rqperm[i] < 0) { qperm[nB_pre++] = i; } } /* Apply RCM reordering */ if (reordering_type != 0) { hypre_ILULocalRCM(h_A_diag, 0, nLU, &pperm, &qperm, 0); memory_location_perm = memory_location; } else { memory_location_perm = HYPRE_MEMORY_HOST; } /* Move to device memory if needed */ if (memory_location_perm != memory_location) { new_pperm = hypre_TAlloc(HYPRE_Int, n, memory_location); new_qperm = hypre_TAlloc(HYPRE_Int, n, memory_location); hypre_TMemcpy(new_pperm, pperm, HYPRE_Int, n, memory_location, memory_location_perm); hypre_TMemcpy(new_qperm, qperm, HYPRE_Int, n, memory_location, memory_location_perm); hypre_TFree(pperm, memory_location_perm); hypre_TFree(qperm, memory_location_perm); pperm = new_pperm; qperm = new_qperm; } /* Output pointers */ *nI = nLU; *nB = nLU; *io_pperm = pperm; *io_qperm = qperm; /* Free memory */ if (h_A_diag != A_diag) { hypre_CSRMatrixDestroy(h_A_diag); } hypre_TFree(rpperm, HYPRE_MEMORY_HOST); hypre_TFree(rqperm, HYPRE_MEMORY_HOST); hypre_TFree(pperm_pre, HYPRE_MEMORY_HOST); hypre_TFree(qperm_pre, HYPRE_MEMORY_HOST); return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_ILUGetInteriorExteriorPerm * * Get perm array from parcsr matrix based on diag and offdiag matrix * Just simply loop through the rows of offd of A, check for nonzero rows * Put interior nodes at the beginning * * Parameters: * A: parcsr matrix * perm: permutation array * nLU: number of interial nodes * reordering_type: Type of (additional) reordering for the interior nodes. * * Currently only supports RCM reordering. Set to 0 for no reordering. *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ILUGetInteriorExteriorPerm(hypre_ParCSRMatrix *A, HYPRE_MemoryLocation memory_location, HYPRE_Int **perm, HYPRE_Int *nLU, HYPRE_Int reordering_type) { /* get basic information of A */ HYPRE_Int n = hypre_ParCSRMatrixNumRows(A); hypre_CSRMatrix *A_diag = hypre_ParCSRMatrixDiag(A); hypre_CSRMatrix *A_offd = hypre_ParCSRMatrixOffd(A); hypre_ParCSRCommPkg *comm_pkg = hypre_ParCSRMatrixCommPkg(A); HYPRE_MemoryLocation A_memory_location = hypre_ParCSRMatrixMemoryLocation(A); HYPRE_Int *A_offd_i; HYPRE_Int i, j, first, last, start, end; HYPRE_Int num_sends, send_map_start, send_map_end, col; /* Local arrays */ HYPRE_Int *tperm = hypre_TAlloc(HYPRE_Int, n, memory_location); HYPRE_Int *h_tperm = hypre_CTAlloc(HYPRE_Int, n, HYPRE_MEMORY_HOST); HYPRE_Int *marker = hypre_CTAlloc(HYPRE_Int, n, HYPRE_MEMORY_HOST); /* Get comm_pkg, create one if not present */ if (!comm_pkg) { hypre_MatvecCommPkgCreate(A); comm_pkg = hypre_ParCSRMatrixCommPkg(A); } /* Set A_offd_i on the host */ if (hypre_GetActualMemLocation(A_memory_location) == hypre_MEMORY_DEVICE) { /* Move A_offd_i to host */ A_offd_i = hypre_CTAlloc(HYPRE_Int, n + 1, HYPRE_MEMORY_HOST); hypre_TMemcpy(A_offd_i, hypre_CSRMatrixI(A_offd), HYPRE_Int, n + 1, HYPRE_MEMORY_HOST, HYPRE_MEMORY_DEVICE); } else { A_offd_i = hypre_CSRMatrixI(A_offd); } /* Set initial interior/exterior pointers */ first = 0; last = n - 1; /* now directly take advantage of comm_pkg */ num_sends = hypre_ParCSRCommPkgNumSends(comm_pkg); for (i = 0; i < num_sends; i++) { send_map_start = hypre_ParCSRCommPkgSendMapStart(comm_pkg, i); send_map_end = hypre_ParCSRCommPkgSendMapStart(comm_pkg, i + 1); for (j = send_map_start; j < send_map_end; j++) { col = hypre_ParCSRCommPkgSendMapElmt(comm_pkg, j); if (marker[col] == 0) { h_tperm[last--] = col; marker[col] = -1; } } } /* now deal with the row */ for (i = 0; i < n; i++) { if (marker[i] == 0) { start = A_offd_i[i]; end = A_offd_i[i + 1]; if (start == end) { h_tperm[first++] = i; } else { h_tperm[last--] = i; } } } if (reordering_type != 0) { /* Apply RCM. Note: h_tperm lives at A_memory_location at output */ hypre_ILULocalRCM(A_diag, 0, first, &h_tperm, &h_tperm, 1); /* Move permutation vector to final memory location */ hypre_TMemcpy(tperm, h_tperm, HYPRE_Int, n, memory_location, A_memory_location); /* Free memory */ hypre_TFree(h_tperm, A_memory_location); } else { /* Move permutation vector to final memory location */ hypre_TMemcpy(tperm, h_tperm, HYPRE_Int, n, memory_location, HYPRE_MEMORY_HOST); /* Free memory */ hypre_TFree(h_tperm, HYPRE_MEMORY_HOST); } /* Free memory */ hypre_TFree(marker, HYPRE_MEMORY_HOST); if (A_offd_i != hypre_CSRMatrixI(A_offd)) { hypre_TFree(A_offd_i, HYPRE_MEMORY_HOST); } /* Set output values */ if ((*perm) != NULL) { hypre_TFree(*perm, memory_location); } *perm = tperm; *nLU = first; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_ILUGetLocalPerm * * Get the (local) ordering of the diag (local) matrix (no permutation). * This is the permutation used for the block-jacobi case. * * Parameters: * A: parcsr matrix * perm: permutation array * nLU: number of interior nodes * reordering_type: Type of (additional) reordering for the nodes. * * Currently only supports RCM reordering. Set to 0 for no reordering. *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ILUGetLocalPerm(hypre_ParCSRMatrix *A, HYPRE_Int **perm_ptr, HYPRE_Int *nLU, HYPRE_Int reordering_type) { /* get basic information of A */ HYPRE_Int num_rows = hypre_ParCSRMatrixNumRows(A); hypre_CSRMatrix *A_diag = hypre_ParCSRMatrixDiag(A); /* Local variables */ HYPRE_Int *perm = NULL; /* Compute local RCM ordering on the host */ if (reordering_type != 0) { hypre_ILULocalRCM(A_diag, 0, num_rows, &perm, &perm, 1); } /* Set output pointers */ *nLU = num_rows; *perm_ptr = perm; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_ILUBuildRASExternalMatrix * * Build the expanded matrix for RAS-1 * A: input ParCSR matrix * E_i, E_j, E_data: information for external matrix * rperm: reverse permutation to build real index, rperm[old] = new *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ILUBuildRASExternalMatrix(hypre_ParCSRMatrix *A, HYPRE_Int *rperm, HYPRE_Int **E_i, HYPRE_Int **E_j, HYPRE_Real **E_data) { /* data objects for communication */ MPI_Comm comm = hypre_ParCSRMatrixComm(A); HYPRE_Int my_id; /* data objects for A */ hypre_CSRMatrix *A_diag = hypre_ParCSRMatrixDiag(A); hypre_CSRMatrix *A_offd = hypre_ParCSRMatrixOffd(A); HYPRE_BigInt *A_col_starts = hypre_ParCSRMatrixColStarts(A); HYPRE_BigInt *A_offd_colmap = hypre_ParCSRMatrixColMapOffd(A); HYPRE_Int *A_diag_i = hypre_CSRMatrixI(A_diag); HYPRE_Int *A_offd_i = hypre_CSRMatrixI(A_offd); /* data objects for external A matrix */ // Need to check the new version of hypre_ParcsrGetExternalRows hypre_CSRMatrix *A_ext = NULL; // # up to local offd cols, no need to be HYPRE_BigInt HYPRE_Int *A_ext_i = NULL; // Return global index, HYPRE_BigInt required HYPRE_BigInt *A_ext_j = NULL; HYPRE_Real *A_ext_data = NULL; /* data objects for output */ HYPRE_Int E_nnz; HYPRE_Int *E_ext_i = NULL; // Local index, no need to use HYPRE_BigInt HYPRE_Int *E_ext_j = NULL; HYPRE_Real *E_ext_data = NULL; //guess non-zeros for E before start HYPRE_Int E_init_alloc; /* size */ HYPRE_Int n = hypre_CSRMatrixNumCols(A_diag); HYPRE_Int m = hypre_CSRMatrixNumCols(A_offd); HYPRE_Int A_diag_nnz = A_diag_i[n]; HYPRE_Int A_offd_nnz = A_offd_i[n]; HYPRE_Int i, j, idx; HYPRE_BigInt big_col; /* 1: Set up phase and get external rows * Use the HYPRE build-in function */ /* MPI stuff */ //hypre_MPI_Comm_size(comm, &num_procs); hypre_MPI_Comm_rank(comm, &my_id); /* Param of hypre_ParcsrGetExternalRows: * hypre_ParCSRMatrix *A [in] -> Input parcsr matrix. * HYPRE_Int indies_len [in] -> Input length of indices_len array * HYPRE_Int *indices [in] -> Input global indices of rows we want to get * hypre_CSRMatrix **A_ext [out] -> Return the external CSR matrix. * hypre_ParCSRCommPkg commpkg_out [out] -> Return commpkg if set to a point. Use NULL here since we don't want it. */ // hypre_ParcsrGetExternalRows( A, m, A_offd_colmap, &A_ext, NULL ); A_ext = hypre_ParCSRMatrixExtractBExt(A, A, 1); A_ext_i = hypre_CSRMatrixI(A_ext); //This should be HYPRE_BigInt since this is global index, use big_j in csr */ A_ext_j = hypre_CSRMatrixBigJ(A_ext); A_ext_data = hypre_CSRMatrixData(A_ext); /* guess memory we need to allocate to E_j */ E_init_alloc = hypre_max( (HYPRE_Int) ( A_diag_nnz / (HYPRE_Real) n / (HYPRE_Real) n * (HYPRE_Real) m * (HYPRE_Real) m + A_offd_nnz), 1); /* Initial guess */ E_ext_i = hypre_TAlloc(HYPRE_Int, m + 1, HYPRE_MEMORY_HOST); E_ext_j = hypre_TAlloc(HYPRE_Int, E_init_alloc, HYPRE_MEMORY_HOST); E_ext_data = hypre_TAlloc(HYPRE_Real, E_init_alloc, HYPRE_MEMORY_HOST); /* 2: Discard unecessary cols * Search A_ext_j, discard those cols not belong to current proc * First check diag, and search in offd_col_map */ E_nnz = 0; E_ext_i[0] = 0; for ( i = 0 ; i < m ; i ++) { E_ext_i[i] = E_nnz; for ( j = A_ext_i[i] ; j < A_ext_i[i + 1] ; j ++) { big_col = A_ext_j[j]; /* First check if that belongs to the diagonal part */ if ( big_col >= A_col_starts[0] && big_col < A_col_starts[1] ) { /* this is a diagonal entry, rperm (map old to new) and shift it */ /* Note here, the result of big_col - A_col_starts[0] in no longer a HYPRE_BigInt */ idx = (HYPRE_Int)(big_col - A_col_starts[0]); E_ext_j[E_nnz] = rperm[idx]; E_ext_data[E_nnz++] = A_ext_data[j]; } /* If not, apply binary search to check if is offdiagonal */ else { /* Search, result is not HYPRE_BigInt */ E_ext_j[E_nnz] = hypre_BigBinarySearch( A_offd_colmap, big_col, m); if ( E_ext_j[E_nnz] >= 0) { /* this is an offdiagonal entry */ E_ext_j[E_nnz] = E_ext_j[E_nnz] + n; E_ext_data[E_nnz++] = A_ext_data[j]; } else { /* skip capacity check */ continue; } } /* capacity check, allocate new memory when full */ if (E_nnz >= E_init_alloc) { HYPRE_Int tmp; tmp = E_init_alloc; E_init_alloc = (HYPRE_Int)(E_init_alloc * EXPAND_FACT + 1); E_ext_j = hypre_TReAlloc_v2(E_ext_j, HYPRE_Int, tmp, HYPRE_Int, E_init_alloc, HYPRE_MEMORY_HOST); E_ext_data = hypre_TReAlloc_v2(E_ext_data, HYPRE_Real, tmp, HYPRE_Real, E_init_alloc, HYPRE_MEMORY_HOST); } } } E_ext_i[m] = E_nnz; /* 3: Free and finish up * Free memory, set E_i, E_j and E_data */ *E_i = E_ext_i; *E_j = E_ext_j; *E_data = E_ext_data; hypre_CSRMatrixDestroy(A_ext); return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_ILUSortOffdColmap * * This function sort offdiagonal map as well as J array for offdiagonal part * A: The input CSR matrix. * * TODO (VPM): This work should be done via hypre_ParCSRMatrixPermute. This * function needs to be implemented. *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ILUSortOffdColmap(hypre_ParCSRMatrix *A) { hypre_CSRMatrix *A_offd = hypre_ParCSRMatrixOffd(A); HYPRE_Int *A_offd_j = hypre_CSRMatrixJ(A_offd); HYPRE_Int A_offd_nnz = hypre_CSRMatrixNumNonzeros(A_offd); HYPRE_Int A_offd_num_cols = hypre_CSRMatrixNumCols(A_offd); HYPRE_MemoryLocation memory_location = hypre_CSRMatrixMemoryLocation(A_offd); HYPRE_BigInt *col_map_offd = hypre_ParCSRMatrixColMapOffd(A); HYPRE_Int *h_A_offd_j; HYPRE_Int *perm = hypre_TAlloc(HYPRE_Int, A_offd_num_cols, HYPRE_MEMORY_HOST); HYPRE_Int *rperm = hypre_TAlloc(HYPRE_Int, A_offd_num_cols, HYPRE_MEMORY_HOST); HYPRE_Int i; /* Set/Move A_offd_j on the host */ if (hypre_GetActualMemLocation(memory_location) == hypre_MEMORY_DEVICE) { h_A_offd_j = hypre_TAlloc(HYPRE_Int, A_offd_nnz, HYPRE_MEMORY_HOST); hypre_TMemcpy(h_A_offd_j, A_offd_j, HYPRE_Int, A_offd_nnz, HYPRE_MEMORY_HOST, HYPRE_MEMORY_DEVICE); } else { h_A_offd_j = A_offd_j; } for (i = 0; i < A_offd_num_cols; i++) { perm[i] = i; } hypre_BigQsort2i(col_map_offd, perm, 0, A_offd_num_cols - 1); for (i = 0; i < A_offd_num_cols; i++) { rperm[perm[i]] = i; } for (i = 0; i < A_offd_nnz; i++) { h_A_offd_j[i] = rperm[h_A_offd_j[i]]; } if (h_A_offd_j != A_offd_j) { hypre_TMemcpy(A_offd_j, h_A_offd_j, HYPRE_Int, A_offd_nnz, HYPRE_MEMORY_DEVICE, HYPRE_MEMORY_HOST); hypre_TFree(h_A_offd_j, HYPRE_MEMORY_HOST); } /* Free memory */ hypre_TFree(perm, HYPRE_MEMORY_HOST); hypre_TFree(rperm, HYPRE_MEMORY_HOST); return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_ILULocalRCMBuildFinalPerm *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ILULocalRCMBuildFinalPerm(HYPRE_Int start, HYPRE_Int end, HYPRE_Int *G_perm, HYPRE_Int *perm, HYPRE_Int *qperm, HYPRE_Int **permp, HYPRE_Int **qpermp) { /* update to new index */ HYPRE_Int i = 0; HYPRE_Int num_nodes = end - start; HYPRE_Int *perm_temp = hypre_TAlloc(HYPRE_Int, num_nodes, HYPRE_MEMORY_HOST); for ( i = 0 ; i < num_nodes ; i ++) { perm_temp[i] = perm[i + start]; } for ( i = 0 ; i < num_nodes ; i ++) { perm[i + start] = perm_temp[G_perm[i]]; } if (perm != qperm) { for ( i = 0 ; i < num_nodes ; i ++) { perm_temp[i] = qperm[i + start]; } for ( i = 0 ; i < num_nodes ; i ++) { qperm[i + start] = perm_temp[G_perm[i]]; } } *permp = perm; *qpermp = qperm; hypre_TFree(perm_temp, HYPRE_MEMORY_HOST); return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_ILULocalRCM * * This function computes the RCM ordering of a sub matrix of * sparse matrix B = A(perm,perm) * For nonsymmetrix problem, is the RCM ordering of B + B' * A: The input CSR matrix * start: the start position of the submatrix in B * end: the end position of the submatrix in B ( exclude end, [start,end) ) * permp: pointer to the row permutation array such that B = A(perm, perm) * point to NULL if you want to work directly on A * on return, permp will point to the new permutation where * in [start, end) the matrix will reordered. if *permp is not NULL, * we assume that it lives on the host memory at input. At output, * it lives in the same memory location as A. * qpermp: pointer to the col permutation array such that B = A(perm, perm) * point to NULL or equal to permp if you want symmetric order * on return, qpermp will point to the new permutation where * in [start, end) the matrix will reordered. if *qpermp is not NULL, * we assume that it lives on the host memory at input. At output, * it lives in the same memory location as A. * sym: set to nonzero to work on A only(symmetric), otherwise A + A'. * WARNING: if you use non-symmetric reordering, that is, * different row and col reordering, the resulting A might be non-symmetric. * Be careful if you are using non-symmetric reordering * * TODO (VPM): Implement RCM computation on the device. * Use IntArray for perm. * Move this function and internal RCM calls to parcsr_mv. *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ILULocalRCM(hypre_CSRMatrix *A, HYPRE_Int start, HYPRE_Int end, HYPRE_Int **permp, HYPRE_Int **qpermp, HYPRE_Int sym) { /* Input variables */ HYPRE_Int num_nodes = end - start; HYPRE_Int n = hypre_CSRMatrixNumRows(A); HYPRE_Int ncol = hypre_CSRMatrixNumCols(A); HYPRE_MemoryLocation memory_location = hypre_CSRMatrixMemoryLocation(A); HYPRE_Int A_nnz = hypre_CSRMatrixNumNonzeros(A); HYPRE_Int *A_i; HYPRE_Int *A_j; /* Local variables */ hypre_CSRMatrix *GT = NULL; hypre_CSRMatrix *GGT = NULL; hypre_CSRMatrix *G = NULL; HYPRE_Int *G_i = NULL; HYPRE_Int *G_j = NULL; HYPRE_Int *G_perm = NULL; HYPRE_Int *perm_temp = NULL; HYPRE_Int *rqperm = NULL; HYPRE_Int *d_perm = NULL; HYPRE_Int *d_qperm = NULL; HYPRE_Int *perm = *permp; HYPRE_Int *qperm = *qpermp; HYPRE_Int perm_is_qperm; HYPRE_Int i, j, row, col, r1, r2; HYPRE_Int G_nnz, G_capacity; /* Set flag for computing row and column permutations (true) or only row permutation (false) */ perm_is_qperm = (perm == qperm) ? 1 : 0; /* 1: Preprosessing * Check error in input, set some parameters */ if (num_nodes <= 0) { /* don't do this if we are too small */ return hypre_error_flag; } if (n != ncol || end > n || start < 0) { /* don't do this if the input has error */ hypre_printf("Error input, abort RCM\n"); return hypre_error_flag; } HYPRE_ANNOTATE_FUNC_BEGIN; hypre_GpuProfilingPushRange("ILULocalRCM"); /* create permutation array if we don't have one yet */ if (!perm) { perm = hypre_TAlloc(HYPRE_Int, n, HYPRE_MEMORY_HOST); for (i = 0; i < n; i++) { perm[i] = i; } } /* Check for symmetric reordering, then point qperm to row reordering */ if (!qperm) { qperm = perm; } /* Compute reverse qperm ordering */ rqperm = hypre_TAlloc(HYPRE_Int, n, HYPRE_MEMORY_HOST); for (i = 0; i < n; i++) { rqperm[qperm[i]] = i; } /* Set/Move A_i and A_j to host */ if (hypre_GetActualMemLocation(memory_location) == hypre_MEMORY_DEVICE) { A_i = hypre_TAlloc(HYPRE_Int, n + 1, HYPRE_MEMORY_HOST); A_j = hypre_TAlloc(HYPRE_Int, A_nnz, HYPRE_MEMORY_HOST); hypre_TMemcpy(A_i, hypre_CSRMatrixI(A), HYPRE_Int, n + 1, HYPRE_MEMORY_HOST, HYPRE_MEMORY_DEVICE); hypre_TMemcpy(A_j, hypre_CSRMatrixJ(A), HYPRE_Int, A_nnz, HYPRE_MEMORY_HOST, HYPRE_MEMORY_DEVICE); } else { A_i = hypre_CSRMatrixI(A); A_j = hypre_CSRMatrixJ(A); } /* 2: Build Graph * Build Graph for RCM ordering */ G_nnz = 0; G_capacity = hypre_max((A_nnz * n * n / num_nodes / num_nodes) - num_nodes, 1); G_i = hypre_TAlloc(HYPRE_Int, num_nodes + 1, HYPRE_MEMORY_HOST); G_j = hypre_TAlloc(HYPRE_Int, G_capacity, HYPRE_MEMORY_HOST); /* TODO (VPM): Extend hypre_CSRMatrixPermute to replace the block below */ for (i = 0; i < num_nodes; i++) { G_i[i] = G_nnz; row = perm[i + start]; r1 = A_i[row]; r2 = A_i[row + 1]; for (j = r1; j < r2; j ++) { col = rqperm[A_j[j]]; if (col != row && col >= start && col < end) { /* this is an entry in G */ G_j[G_nnz++] = col - start; if (G_nnz >= G_capacity) { HYPRE_Int tmp = G_capacity; G_capacity = (HYPRE_Int) (G_capacity * EXPAND_FACT + 1); G_j = hypre_TReAlloc_v2(G_j, HYPRE_Int, tmp, HYPRE_Int, G_capacity, HYPRE_MEMORY_HOST); } } } } G_i[num_nodes] = G_nnz; /* Free memory */ if (A_i != hypre_CSRMatrixI(A)) { hypre_TFree(A_i, HYPRE_MEMORY_HOST); } if (A_j != hypre_CSRMatrixJ(A)) { hypre_TFree(A_j, HYPRE_MEMORY_HOST); } /* Create matrix G on the host */ G = hypre_CSRMatrixCreate(num_nodes, num_nodes, G_nnz); hypre_CSRMatrixMemoryLocation(G) = HYPRE_MEMORY_HOST; hypre_CSRMatrixI(G) = G_i; hypre_CSRMatrixJ(G) = G_j; /* Check if G is not empty (no need to do any kind of RCM) */ if (G_nnz > 0) { /* Sum G with G' if G is nonsymmetric */ if (!sym) { hypre_CSRMatrixData(G) = hypre_CTAlloc(HYPRE_Complex, G_nnz, HYPRE_MEMORY_HOST); hypre_CSRMatrixTranspose(G, >, 1); GGT = hypre_CSRMatrixAdd(1.0, G, 1.0, GT); hypre_CSRMatrixDestroy(G); hypre_CSRMatrixDestroy(GT); G = GGT; GGT = NULL; } /* 3: Build RCM on the host */ G_perm = hypre_TAlloc(HYPRE_Int, num_nodes, HYPRE_MEMORY_HOST); hypre_ILULocalRCMOrder(G, G_perm); /* 4: Post processing * Free, set value, return */ /* update to new index */ perm_temp = hypre_TAlloc(HYPRE_Int, num_nodes, HYPRE_MEMORY_HOST); hypre_TMemcpy(perm_temp, &perm[start], HYPRE_Int, num_nodes, HYPRE_MEMORY_HOST, HYPRE_MEMORY_HOST); for (i = 0; i < num_nodes; i++) { perm[i + start] = perm_temp[G_perm[i]]; } if (!perm_is_qperm) { hypre_TMemcpy(perm_temp, &qperm[start], HYPRE_Int, num_nodes, HYPRE_MEMORY_HOST, HYPRE_MEMORY_HOST); for (i = 0; i < num_nodes; i++) { qperm[i + start] = perm_temp[G_perm[i]]; } } } /* Move to device memory if needed */ if (memory_location == HYPRE_MEMORY_DEVICE) { d_perm = hypre_TAlloc(HYPRE_Int, n, HYPRE_MEMORY_DEVICE); hypre_TMemcpy(d_perm, perm, HYPRE_Int, n, HYPRE_MEMORY_DEVICE, HYPRE_MEMORY_HOST); hypre_TFree(perm, HYPRE_MEMORY_HOST); perm = d_perm; if (perm_is_qperm) { qperm = d_perm; } else { d_qperm = hypre_TAlloc(HYPRE_Int, n, HYPRE_MEMORY_DEVICE); hypre_TMemcpy(d_qperm, qperm, HYPRE_Int, n, HYPRE_MEMORY_DEVICE, HYPRE_MEMORY_HOST); hypre_TFree(qperm, HYPRE_MEMORY_HOST); qperm = d_qperm; } } /* Set output pointers */ *permp = perm; *qpermp = qperm; /* Free memory */ hypre_CSRMatrixDestroy(G); hypre_TFree(G_perm, HYPRE_MEMORY_HOST); hypre_TFree(perm_temp, HYPRE_MEMORY_HOST); hypre_TFree(rqperm, HYPRE_MEMORY_HOST); hypre_GpuProfilingPopRange(); HYPRE_ANNOTATE_FUNC_END; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_ILULocalRCMMindegree * * This function finds the unvisited node with the minimum degree *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ILULocalRCMMindegree(HYPRE_Int n, HYPRE_Int *degree, HYPRE_Int *marker, HYPRE_Int *rootp) { HYPRE_Int i; HYPRE_Int min_degree = n + 1; HYPRE_Int root = 0; for (i = 0 ; i < n ; i ++) { if (marker[i] < 0) { if (degree[i] < min_degree) { root = i; min_degree = degree[i]; } } } *rootp = root; return 0; } /*-------------------------------------------------------------------------- * hypre_ILULocalRCMOrder * * This function actually does the RCM ordering of a symmetric CSR matrix (entire) * A: the csr matrix, A_data is not needed * perm: the permutation array, space should be allocated outside * This is pure host code. *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ILULocalRCMOrder( hypre_CSRMatrix *A, HYPRE_Int *perm) { HYPRE_Int i, root; HYPRE_Int *degree = NULL; HYPRE_Int *marker = NULL; HYPRE_Int *A_i = hypre_CSRMatrixI(A); HYPRE_Int n = hypre_CSRMatrixNumRows(A); HYPRE_Int current_num; /* get the degree for each node */ degree = hypre_TAlloc(HYPRE_Int, n, HYPRE_MEMORY_HOST); marker = hypre_TAlloc(HYPRE_Int, n, HYPRE_MEMORY_HOST); for (i = 0 ; i < n ; i ++) { degree[i] = A_i[i + 1] - A_i[i]; marker[i] = -1; } /* start RCM loop */ current_num = 0; while (current_num < n) { hypre_ILULocalRCMMindegree( n, degree, marker, &root); /* This is a new connect component */ hypre_ILULocalRCMFindPPNode(A, &root, marker); /* Numbering of this component */ hypre_ILULocalRCMNumbering(A, root, marker, perm, ¤t_num); } /* Free */ hypre_TFree(degree, HYPRE_MEMORY_HOST); hypre_TFree(marker, HYPRE_MEMORY_HOST); return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_ILULocalRCMFindPPNode * * This function find a pseudo-peripheral node start from root * A: the csr matrix, A_data is not needed * rootp: pointer to the root, on return will be a end of the pseudo-peripheral * marker: the marker array for unvisited node *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ILULocalRCMFindPPNode( hypre_CSRMatrix *A, HYPRE_Int *rootp, HYPRE_Int *marker) { HYPRE_Int i, r1, r2, row, min_degree, lev_degree, nlev, newnlev; HYPRE_Int root = *rootp; HYPRE_Int n = hypre_CSRMatrixNumRows(A); HYPRE_Int *A_i = hypre_CSRMatrixI(A); /* at most n levels */ HYPRE_Int *level_i = hypre_TAlloc(HYPRE_Int, n + 1, HYPRE_MEMORY_HOST); HYPRE_Int *level_j = hypre_TAlloc(HYPRE_Int, n, HYPRE_MEMORY_HOST); /* build initial level structure from root */ hypre_ILULocalRCMBuildLevel(A, root, marker, level_i, level_j, &newnlev); nlev = newnlev - 1; while (nlev < newnlev) { nlev = newnlev; r1 = level_i[nlev - 1]; r2 = level_i[nlev]; min_degree = n; for (i = r1 ; i < r2 ; i ++) { /* select the last level, pick min-degree node */ row = level_j[i]; lev_degree = A_i[row + 1] - A_i[row]; if (min_degree > lev_degree) { min_degree = lev_degree; root = row; } } hypre_ILULocalRCMBuildLevel( A, root, marker, level_i, level_j, &newnlev); } /* Set output pointers */ *rootp = root; /* Free */ hypre_TFree(level_i, HYPRE_MEMORY_HOST); hypre_TFree(level_j, HYPRE_MEMORY_HOST); return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_ILULocalRCMBuildLevel * * This function build level structure start from root * A: the csr matrix, A_data is not needed * root: pointer to the root * marker: the marker array for unvisited node * level_i: points to the start/end of position on level_j, similar to CSR Matrix * level_j: store node number on each level * nlevp: return the number of level on this level structure *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ILULocalRCMBuildLevel(hypre_CSRMatrix *A, HYPRE_Int root, HYPRE_Int *marker, HYPRE_Int *level_i, HYPRE_Int *level_j, HYPRE_Int *nlevp) { HYPRE_Int i, j, l1, l2, l_current, r1, r2, rowi, rowj, nlev; HYPRE_Int *A_i = hypre_CSRMatrixI(A); HYPRE_Int *A_j = hypre_CSRMatrixJ(A); /* set first level first */ level_i[0] = 0; level_j[0] = root; marker[root] = 0; nlev = 1; l1 = 0; l2 = 1; l_current = l2; /* Explore nbhds of all nodes in current level */ while (l2 > l1) { level_i[nlev++] = l2; /* loop through last level */ for (i = l1 ; i < l2 ; i ++) { /* the node to explore */ rowi = level_j[i]; r1 = A_i[rowi]; r2 = A_i[rowi + 1]; for (j = r1 ; j < r2 ; j ++) { rowj = A_j[j]; if ( marker[rowj] < 0 ) { /* Aha, an unmarked row */ marker[rowj] = 0; level_j[l_current++] = rowj; } } } l1 = l2; l2 = l_current; } /* after this we always have a "ghost" last level */ nlev --; /* reset marker */ for (i = 0 ; i < l2 ; i ++) { marker[level_j[i]] = -1; } *nlevp = nlev; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_ILULocalRCMNumbering * * This function generate numbering for a connect component * A: the csr matrix, A_data is not needed * root: pointer to the root * marker: the marker array for unvisited node * perm: permutation array * current_nump: number of nodes already have a perm value *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ILULocalRCMNumbering(hypre_CSRMatrix *A, HYPRE_Int root, HYPRE_Int *marker, HYPRE_Int *perm, HYPRE_Int *current_nump) { HYPRE_Int i, j, l1, l2, r1, r2, rowi, rowj, row_start, row_end; HYPRE_Int *A_i = hypre_CSRMatrixI(A); HYPRE_Int *A_j = hypre_CSRMatrixJ(A); HYPRE_Int current_num = *current_nump; marker[root] = 0; l1 = current_num; perm[current_num++] = root; l2 = current_num; while (l2 > l1) { /* loop through all nodes is current level */ for (i = l1 ; i < l2 ; i ++) { rowi = perm[i]; r1 = A_i[rowi]; r2 = A_i[rowi + 1]; row_start = current_num; for (j = r1 ; j < r2 ; j ++) { rowj = A_j[j]; if (marker[rowj] < 0) { /* save the degree in marker and add it to perm */ marker[rowj] = A_i[rowj + 1] - A_i[rowj]; perm[current_num++] = rowj; } } row_end = current_num; hypre_ILULocalRCMQsort(perm, row_start, row_end - 1, marker); } l1 = l2; l2 = current_num; } //reverse hypre_ILULocalRCMReverse(perm, *current_nump, current_num - 1); *current_nump = current_num; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_ILULocalRCMQsort * * This qsort is very specialized, not worth to put into utilities * Sort a part of array perm based on degree value (ascend) * That is, if degree[perm[i]] < degree[perm[j]], we should have i < j * perm: the perm array * start: start in perm * end: end in perm * degree: degree array *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ILULocalRCMQsort(HYPRE_Int *perm, HYPRE_Int start, HYPRE_Int end, HYPRE_Int *degree) { HYPRE_Int i, mid; if (start >= end) { return hypre_error_flag; } hypre_swap(perm, start, (start + end) / 2); mid = start; /* Loop to split */ for (i = start + 1 ; i <= end ; i ++) { if (degree[perm[i]] < degree[perm[start]]) { hypre_swap(perm, ++mid, i); } } hypre_swap(perm, start, mid); hypre_ILULocalRCMQsort(perm, mid + 1, end, degree); hypre_ILULocalRCMQsort(perm, start, mid - 1, degree); return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_ILULocalRCMReverse * * Last step in RCM, reverse it * perm: perm array * srart: start position * end: end position *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ILULocalRCMReverse(HYPRE_Int *perm, HYPRE_Int start, HYPRE_Int end) { HYPRE_Int i, j; HYPRE_Int mid = (start + end + 1) / 2; for (i = start, j = end ; i < mid ; i ++, j--) { hypre_swap(perm, i, j); } return hypre_error_flag; } /* TODO (VPM): Change this block to another file? */ #if defined(HYPRE_USING_GPU) /*-------------------------------------------------------------------------- * hypre_ParILUSchurGMRESDummySolveDevice * * Unit GMRES preconditioner, just copy data from one slot to another *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ParILUSchurGMRESDummySolveDevice( void *ilu_vdata, void *ilu_vdata2, hypre_ParVector *f, hypre_ParVector *u ) { HYPRE_UNUSED_VAR(ilu_vdata); HYPRE_UNUSED_VAR(ilu_vdata2); hypre_ParILUData *ilu_data = (hypre_ParILUData*) ilu_vdata; hypre_ParCSRMatrix *S = hypre_ParILUDataMatS(ilu_data); HYPRE_Int n_local = hypre_ParCSRMatrixNumRows(S); hypre_Vector *u_local = hypre_ParVectorLocalVector(u); HYPRE_Complex *u_data = hypre_VectorData(u_local); hypre_Vector *f_local = hypre_ParVectorLocalVector(f); HYPRE_Complex *f_data = hypre_VectorData(f_local); hypre_TMemcpy(u_data, f_data, HYPRE_Real, n_local, HYPRE_MEMORY_DEVICE, HYPRE_MEMORY_DEVICE); return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_ParILUSchurGMRESCommInfoDevice *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ParILUSchurGMRESCommInfoDevice(void *ilu_vdata, HYPRE_Int *my_id, HYPRE_Int *num_procs) { /* get comm info from ilu_data */ hypre_ParILUData *ilu_data = (hypre_ParILUData*) ilu_vdata; hypre_ParCSRMatrix *S = hypre_ParILUDataMatS(ilu_data); MPI_Comm comm = hypre_ParCSRMatrixComm(S); hypre_MPI_Comm_size(comm, num_procs); hypre_MPI_Comm_rank(comm, my_id); return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_ParILURAPSchurGMRESSolveDevice *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ParILURAPSchurGMRESSolveDevice( void *ilu_vdata, void *ilu_vdata2, hypre_ParVector *par_f, hypre_ParVector *par_u ) { HYPRE_UNUSED_VAR(ilu_vdata); HYPRE_UNUSED_VAR(ilu_vdata2); hypre_ParILUData *ilu_data = (hypre_ParILUData*) ilu_vdata; hypre_ParCSRMatrix *S = hypre_ParILUDataMatS(ilu_data); hypre_CSRMatrix *SLU = hypre_ParCSRMatrixDiag(S); hypre_ParVector *par_rhs = hypre_ParILUDataRhs(ilu_data); hypre_Vector *rhs = hypre_ParVectorLocalVector(par_rhs); hypre_Vector *f = hypre_ParVectorLocalVector(par_f); hypre_Vector *u = hypre_ParVectorLocalVector(par_u); /* L solve */ hypre_CSRMatrixTriLowerUpperSolveDevice('L', 1, SLU, NULL, f, rhs); /* U solve */ hypre_CSRMatrixTriLowerUpperSolveDevice('U', 0, SLU, NULL, rhs, u); return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_ParILURAPSchurGMRESMatvecDevice * * Compute y = alpha * S * x + beta * y * * TODO (VPM): Unify this function with hypre_ParILURAPSchurGMRESMatvecHost *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ParILURAPSchurGMRESMatvecDevice( void *matvec_data, HYPRE_Complex alpha, void *ilu_vdata, void *x, HYPRE_Complex beta, void *y ) { HYPRE_UNUSED_VAR(matvec_data); /* Get matrix information first */ hypre_ParILUData *ilu_data = (hypre_ParILUData*) ilu_vdata; HYPRE_Int test_opt = hypre_ParILUDataTestOption(ilu_data); hypre_ParCSRMatrix *Aperm = hypre_ParILUDataAperm(ilu_data); HYPRE_Int n = hypre_CSRMatrixNumRows(hypre_ParCSRMatrixDiag(Aperm)); hypre_CSRMatrix *EiU = hypre_ParILUDataMatEDevice(ilu_data); hypre_CSRMatrix *iLF = hypre_ParILUDataMatFDevice(ilu_data); hypre_CSRMatrix *BLU = hypre_ParILUDataMatBILUDevice(ilu_data); hypre_CSRMatrix *C = hypre_ParILUDataMatSILUDevice(ilu_data); hypre_ParVector *x_vec = (hypre_ParVector *) x; hypre_Vector *x_local = hypre_ParVectorLocalVector(x_vec); HYPRE_Real *x_data = hypre_VectorData(x_local); hypre_ParVector *xtemp = hypre_ParILUDataUTemp(ilu_data); hypre_Vector *xtemp_local = hypre_ParVectorLocalVector(xtemp); HYPRE_Real *xtemp_data = hypre_VectorData(xtemp_local); hypre_ParVector *y_vec = (hypre_ParVector *) y; hypre_Vector *y_local = hypre_ParVectorLocalVector(y_vec); hypre_ParVector *ytemp = hypre_ParILUDataYTemp(ilu_data); hypre_Vector *ytemp_local = hypre_ParVectorLocalVector(ytemp); HYPRE_Real *ytemp_data = hypre_VectorData(ytemp_local); HYPRE_Int nLU; HYPRE_Int m; hypre_Vector *xtemp_upper; hypre_Vector *xtemp_lower; hypre_Vector *ytemp_upper; hypre_Vector *ytemp_lower; switch (test_opt) { case 1: /* S = R * A * P */ nLU = hypre_CSRMatrixNumRows(BLU); m = n - nLU; xtemp_upper = hypre_SeqVectorCreate(nLU); ytemp_upper = hypre_SeqVectorCreate(nLU); xtemp_lower = hypre_SeqVectorCreate(m); hypre_VectorOwnsData(xtemp_upper) = 0; hypre_VectorOwnsData(ytemp_upper) = 0; hypre_VectorOwnsData(xtemp_lower) = 0; hypre_VectorData(xtemp_upper) = xtemp_data; hypre_VectorData(ytemp_upper) = ytemp_data; hypre_VectorData(xtemp_lower) = xtemp_data + nLU; hypre_SeqVectorInitialize(xtemp_upper); hypre_SeqVectorInitialize(ytemp_upper); hypre_SeqVectorInitialize(xtemp_lower); /* first step, compute P*x put in y */ /* -Fx */ hypre_CSRMatrixMatvec(-1.0, iLF, x_local, 0.0, ytemp_upper); /* -L^{-1}Fx */ /* L solve */ hypre_CSRMatrixTriLowerUpperSolveDevice('L', 1, BLU, NULL, ytemp_local, xtemp_local); /* -U{-1}L^{-1}Fx */ /* U solve */ hypre_CSRMatrixTriLowerUpperSolveDevice('U', 0, BLU, NULL, xtemp_local, ytemp_local); /* now copy data to y_lower */ hypre_TMemcpy(ytemp_data + nLU, x_data, HYPRE_Real, m, HYPRE_MEMORY_DEVICE, HYPRE_MEMORY_DEVICE); /* second step, compute A*P*x store in xtemp */ hypre_ParCSRMatrixMatvec(1.0, Aperm, ytemp, 0.0, xtemp); /* third step, compute R*A*P*x */ /* solve L^{-1} */ /* L solve */ hypre_CSRMatrixTriLowerUpperSolveDevice('L', 1, BLU, NULL, xtemp_local, ytemp_local); /* U^{-1}L^{-1} */ /* U solve */ hypre_CSRMatrixTriLowerUpperSolveDevice('U', 0, BLU, NULL, ytemp_local, xtemp_local); /* -EU^{-1}L^{-1} */ hypre_CSRMatrixMatvec(-alpha, EiU, xtemp_upper, beta, y_local); /* I*lower-EU^{-1}L^{-1}*upper */ hypre_SeqVectorAxpy(alpha, xtemp_lower, y_local); hypre_SeqVectorDestroy(xtemp_upper); hypre_SeqVectorDestroy(ytemp_upper); hypre_SeqVectorDestroy(xtemp_lower); break; case 2: /* S = C - EU^{-1} * L^{-1}F */ nLU = hypre_CSRMatrixNumRows(C); xtemp_upper = hypre_SeqVectorCreate(nLU); hypre_VectorOwnsData(xtemp_upper) = 0; hypre_VectorData(xtemp_upper) = xtemp_data; hypre_SeqVectorInitialize(xtemp_upper); /* first step, compute EB^{-1}F*x put in y */ /* -L^{-1}Fx */ hypre_CSRMatrixMatvec(-1.0, iLF, x_local, 0.0, xtemp_upper); /* - alpha EU^{-1}L^{-1}Fx + beta * y */ hypre_CSRMatrixMatvec(alpha, EiU, xtemp_upper, beta, y_local); /* alpha * C - alpha EU^{-1}L^{-1}Fx + beta y */ hypre_CSRMatrixMatvec(alpha, C, x_local, 1.0, y_local); hypre_SeqVectorDestroy(xtemp_upper); break; case 3: /* S = C - EU^{-1} * L^{-1}F */ nLU = hypre_CSRMatrixNumRows(C); xtemp_upper = hypre_SeqVectorCreate(nLU); hypre_VectorOwnsData(xtemp_upper) = 0; hypre_VectorData(xtemp_upper) = xtemp_data; hypre_SeqVectorInitialize(xtemp_upper); /* first step, compute EB^{-1}F*x put in y */ /* -Fx */ hypre_CSRMatrixMatvec(-1.0, iLF, x_local, 0.0, xtemp_upper); /* -L^{-1}Fx */ /* L solve */ hypre_CSRMatrixTriLowerUpperSolveDevice('L', 1, BLU, NULL, xtemp_local, ytemp_local); /* -U^{-1}L^{-1}Fx */ /* U solve */ hypre_CSRMatrixTriLowerUpperSolveDevice('U', 0, BLU, NULL, ytemp_local, xtemp_local); /* - alpha EU^{-1}L^{-1}Fx + beta * y */ hypre_CSRMatrixMatvec(alpha, EiU, xtemp_upper, beta, y_local); /* alpha * C - alpha EU^{-1}L^{-1}Fx + beta y */ hypre_CSRMatrixMatvec(alpha, C, x_local, 1.0, y_local); hypre_SeqVectorDestroy(xtemp_upper); break; case 0: default: /* S = R * A * P */ nLU = hypre_CSRMatrixNumRows(BLU); m = n - nLU; xtemp_upper = hypre_SeqVectorCreate(nLU); ytemp_upper = hypre_SeqVectorCreate(nLU); ytemp_lower = hypre_SeqVectorCreate(m); hypre_VectorOwnsData(xtemp_upper) = 0; hypre_VectorOwnsData(ytemp_upper) = 0; hypre_VectorOwnsData(ytemp_lower) = 0; hypre_VectorData(xtemp_upper) = xtemp_data; hypre_VectorData(ytemp_upper) = ytemp_data; hypre_VectorData(ytemp_lower) = ytemp_data + nLU; hypre_SeqVectorInitialize(xtemp_upper); hypre_SeqVectorInitialize(ytemp_upper); hypre_SeqVectorInitialize(ytemp_lower); /* first step, compute P*x put in y */ /* -L^{-1}Fx */ hypre_CSRMatrixMatvec(-1.0, iLF, x_local, 0.0, xtemp_upper); /* -U{-1}L^{-1}Fx */ /* U solve */ hypre_CSRMatrixTriLowerUpperSolveDevice('U', 0, BLU, NULL, xtemp_local, ytemp_local); /* now copy data to y_lower */ hypre_TMemcpy(ytemp_data + nLU, x_data, HYPRE_Real, m, HYPRE_MEMORY_DEVICE, HYPRE_MEMORY_DEVICE); /* second step, compute A*P*x store in xtemp */ hypre_ParCSRMatrixMatvec(1.0, Aperm, ytemp, 0.0, xtemp); /* third step, compute R*A*P*x */ /* copy partial data in */ hypre_TMemcpy(ytemp_data + nLU, xtemp_data + nLU, HYPRE_Real, m, HYPRE_MEMORY_DEVICE, HYPRE_MEMORY_DEVICE); /* solve L^{-1} */ /* L solve */ hypre_CSRMatrixTriLowerUpperSolveDevice('L', 1, BLU, NULL, xtemp_local, ytemp_local); /* -EU^{-1}L^{-1} */ hypre_CSRMatrixMatvec(-alpha, EiU, ytemp_upper, beta, y_local); hypre_SeqVectorAxpy(alpha, ytemp_lower, y_local); /* over */ hypre_SeqVectorDestroy(xtemp_upper); hypre_SeqVectorDestroy(ytemp_upper); hypre_SeqVectorDestroy(ytemp_lower); break; } /* switch (test_opt) */ return hypre_error_flag; } #endif /* if defined(HYPRE_USING_GPU) */ /*-------------------------------------------------------------------------- * hypre_ParILURAPSchurGMRESSolveHost *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ParILURAPSchurGMRESSolveHost( void *ilu_vdata, void *ilu_vdata2, hypre_ParVector *f, hypre_ParVector *u ) { HYPRE_UNUSED_VAR(ilu_vdata2); hypre_ParILUData *ilu_data = (hypre_ParILUData*) ilu_vdata; hypre_ParCSRMatrix *L = hypre_ParILUDataMatLModified(ilu_data); hypre_CSRMatrix *L_diag = hypre_ParCSRMatrixDiag(L); HYPRE_Int *L_diag_i = hypre_CSRMatrixI(L_diag); HYPRE_Int *L_diag_j = hypre_CSRMatrixJ(L_diag); HYPRE_Real *L_diag_data = hypre_CSRMatrixData(L_diag); HYPRE_Real *D = hypre_ParILUDataMatDModified(ilu_data); hypre_ParCSRMatrix *U = hypre_ParILUDataMatUModified(ilu_data); hypre_CSRMatrix *U_diag = hypre_ParCSRMatrixDiag(U); HYPRE_Int *U_diag_i = hypre_CSRMatrixI(U_diag); HYPRE_Int *U_diag_j = hypre_CSRMatrixJ(U_diag); HYPRE_Real *U_diag_data = hypre_CSRMatrixData(U_diag); HYPRE_Int n = hypre_CSRMatrixNumRows(L_diag); HYPRE_Int nLU = hypre_ParILUDataNLU(ilu_data); HYPRE_Int m = n - nLU; hypre_Vector *f_local = hypre_ParVectorLocalVector(f); HYPRE_Real *f_data = hypre_VectorData(f_local); hypre_Vector *u_local = hypre_ParVectorLocalVector(u); HYPRE_Real *u_data = hypre_VectorData(u_local); hypre_ParVector *utemp = hypre_ParILUDataUTemp(ilu_data); hypre_Vector *utemp_local = hypre_ParVectorLocalVector(utemp); HYPRE_Real *utemp_data = hypre_VectorData(utemp_local); HYPRE_Int *u_end = hypre_ParILUDataUEnd(ilu_data); HYPRE_Int i, j, k1, k2, col; /* permuted L solve */ for (i = 0 ; i < m ; i ++) { utemp_data[i] = f_data[i]; k1 = u_end[i + nLU] ; k2 = L_diag_i[i + nLU + 1]; for (j = k1 ; j < k2 ; j ++) { col = L_diag_j[j]; utemp_data[i] -= L_diag_data[j] * utemp_data[col - nLU]; } } /* U solve */ for (i = m - 1 ; i >= 0 ; i --) { u_data[i] = utemp_data[i]; k1 = U_diag_i[i + nLU] ; k2 = U_diag_i[i + 1 + nLU]; for (j = k1 ; j < k2 ; j ++) { col = U_diag_j[j]; u_data[i] -= U_diag_data[j] * u_data[col - nLU]; } u_data[i] *= D[i]; } return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_ParILURAPSchurGMRESCommInfoHost *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ParILURAPSchurGMRESCommInfoHost(void *ilu_vdata, HYPRE_Int *my_id, HYPRE_Int *num_procs) { /* get comm info from ilu_data */ hypre_ParILUData *ilu_data = (hypre_ParILUData*) ilu_vdata; hypre_ParCSRMatrix *A = hypre_ParILUDataMatA(ilu_data); MPI_Comm comm = hypre_ParCSRMatrixComm(A); hypre_MPI_Comm_size(comm, num_procs); hypre_MPI_Comm_rank(comm, my_id); return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_ParILURAPSchurGMRESMatvecHost * * Compute y = alpha * S * x + beta * y * * TODO (VPM): Unify this function with hypre_ParILURAPSchurGMRESMatvecDevice *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ParILURAPSchurGMRESMatvecHost( void *matvec_data, HYPRE_Complex alpha, void *ilu_vdata, void *x, HYPRE_Complex beta, void *y ) { HYPRE_UNUSED_VAR(matvec_data); /* get matrix information first */ hypre_ParILUData *ilu_data = (hypre_ParILUData*) ilu_vdata; /* only option 1, use W and Z */ HYPRE_Int *u_end = hypre_ParILUDataUEnd(ilu_data); hypre_ParCSRMatrix *A = hypre_ParILUDataMatA(ilu_data); hypre_ParCSRMatrix *mL = hypre_ParILUDataMatLModified(ilu_data); HYPRE_Real *mD = hypre_ParILUDataMatDModified(ilu_data); hypre_ParCSRMatrix *mU = hypre_ParILUDataMatUModified(ilu_data); hypre_CSRMatrix *mL_diag = hypre_ParCSRMatrixDiag(mL); HYPRE_Int *mL_diag_i = hypre_CSRMatrixI(mL_diag); HYPRE_Int *mL_diag_j = hypre_CSRMatrixJ(mL_diag); HYPRE_Real *mL_diag_data = hypre_CSRMatrixData(mL_diag); hypre_CSRMatrix *mU_diag = hypre_ParCSRMatrixDiag(mU); HYPRE_Int *mU_diag_i = hypre_CSRMatrixI(mU_diag); HYPRE_Int *mU_diag_j = hypre_CSRMatrixJ(mU_diag); HYPRE_Real *mU_diag_data = hypre_CSRMatrixData(mU_diag); HYPRE_Int *perm = hypre_ParILUDataPerm(ilu_data); HYPRE_Int n = hypre_ParCSRMatrixNumRows(A); HYPRE_Int nLU = hypre_ParILUDataNLU(ilu_data); hypre_ParVector *x_vec = (hypre_ParVector *) x; hypre_Vector *x_local = hypre_ParVectorLocalVector(x_vec); HYPRE_Real *x_data = hypre_VectorData(x_local); hypre_ParVector *y_vec = (hypre_ParVector *) y; hypre_Vector *y_local = hypre_ParVectorLocalVector(y_vec); HYPRE_Real *y_data = hypre_VectorData(y_local); hypre_ParVector *utemp = hypre_ParILUDataUTemp(ilu_data); hypre_Vector *utemp_local = hypre_ParVectorLocalVector(utemp); HYPRE_Real *utemp_data = hypre_VectorData(utemp_local); hypre_ParVector *ftemp = hypre_ParILUDataFTemp(ilu_data); hypre_Vector *ftemp_local = hypre_ParVectorLocalVector(ftemp); HYPRE_Real *ftemp_data = hypre_VectorData(ftemp_local); hypre_ParVector *ytemp = hypre_ParILUDataYTemp(ilu_data); hypre_Vector *ytemp_local = hypre_ParVectorLocalVector(ytemp); HYPRE_Real *ytemp_data = hypre_VectorData(ytemp_local); HYPRE_Int i, j, k1, k2, col; HYPRE_Real one = 1.0; HYPRE_Real zero = 0.0; /* S = R * A * P */ /* matvec */ /* first compute alpha * P * x * P = [ -U\inv U_12 ] * [ I ] */ /* matvec */ for (i = 0 ; i < nLU ; i ++) { ytemp_data[i] = 0.0; k1 = u_end[i] ; k2 = mU_diag_i[i + 1]; for (j = k1 ; j < k2 ; j ++) { col = mU_diag_j[j]; ytemp_data[i] -= alpha * mU_diag_data[j] * x_data[col - nLU]; } } /* U solve */ for (i = nLU - 1 ; i >= 0 ; i --) { ftemp_data[perm[i]] = ytemp_data[i]; k1 = mU_diag_i[i] ; k2 = u_end[i]; for (j = k1 ; j < k2 ; j ++) { col = mU_diag_j[j]; ftemp_data[perm[i]] -= mU_diag_data[j] * ftemp_data[perm[col]]; } ftemp_data[perm[i]] *= mD[i]; } /* update with I */ for (i = nLU ; i < n ; i ++) { ftemp_data[perm[i]] = alpha * x_data[i - nLU]; } /* apply alpha*A*P*x */ hypre_ParCSRMatrixMatvec(one, A, ftemp, zero, utemp); // R = [-L21 L\inv, I] /* first is L solve */ for (i = 0 ; i < nLU ; i ++) { ytemp_data[i] = utemp_data[perm[i]]; k1 = mL_diag_i[i] ; k2 = mL_diag_i[i + 1]; for (j = k1 ; j < k2 ; j ++) { col = mL_diag_j[j]; ytemp_data[i] -= mL_diag_data[j] * ytemp_data[col]; } } /* apply -W * utemp on this, and take care of the I part */ for (i = nLU ; i < n ; i ++) { y_data[i - nLU] = beta * y_data[i - nLU] + utemp_data[perm[i]]; k1 = mL_diag_i[i] ; k2 = u_end[i]; for (j = k1 ; j < k2 ; j ++) { col = mL_diag_j[j]; y_data[i - nLU] -= mL_diag_data[j] * ytemp_data[col]; } } return hypre_error_flag; } /****************************************************************************** * * NSH create and solve and help functions. * * TODO (VPM): Move NSH code to separate files? *****************************************************************************/ /*-------------------------------------------------------------------------- * hypre_NSHCreate *--------------------------------------------------------------------------*/ void * hypre_NSHCreate( void ) { hypre_ParNSHData *nsh_data; nsh_data = hypre_CTAlloc(hypre_ParNSHData, 1, HYPRE_MEMORY_HOST); /* general data */ hypre_ParNSHDataMatA(nsh_data) = NULL; hypre_ParNSHDataMatM(nsh_data) = NULL; hypre_ParNSHDataF(nsh_data) = NULL; hypre_ParNSHDataU(nsh_data) = NULL; hypre_ParNSHDataResidual(nsh_data) = NULL; hypre_ParNSHDataRelResNorms(nsh_data) = NULL; hypre_ParNSHDataNumIterations(nsh_data) = 0; hypre_ParNSHDataL1Norms(nsh_data) = NULL; hypre_ParNSHDataFinalRelResidualNorm(nsh_data) = 0.0; hypre_ParNSHDataTol(nsh_data) = 1e-09; hypre_ParNSHDataLogging(nsh_data) = 2; hypre_ParNSHDataPrintLevel(nsh_data) = 2; hypre_ParNSHDataMaxIter(nsh_data) = 5; hypre_ParNSHDataOperatorComplexity(nsh_data) = 0.0; hypre_ParNSHDataDroptol(nsh_data) = hypre_TAlloc(HYPRE_Real, 2, HYPRE_MEMORY_HOST); hypre_ParNSHDataOwnDroptolData(nsh_data) = 1; hypre_ParNSHDataDroptol(nsh_data)[0] = 1.0e-02;/* droptol for MR */ hypre_ParNSHDataDroptol(nsh_data)[1] = 1.0e-02;/* droptol for NSH */ hypre_ParNSHDataUTemp(nsh_data) = NULL; hypre_ParNSHDataFTemp(nsh_data) = NULL; /* MR data */ hypre_ParNSHDataMRMaxIter(nsh_data) = 2; hypre_ParNSHDataMRTol(nsh_data) = 1e-09; hypre_ParNSHDataMRMaxRowNnz(nsh_data) = 800; hypre_ParNSHDataMRColVersion(nsh_data) = 0; /* NSH data */ hypre_ParNSHDataNSHMaxIter(nsh_data) = 2; hypre_ParNSHDataNSHTol(nsh_data) = 1e-09; hypre_ParNSHDataNSHMaxRowNnz(nsh_data) = 1000; return (void *) nsh_data; } /*-------------------------------------------------------------------------- * hypre_NSHDestroy *--------------------------------------------------------------------------*/ HYPRE_Int hypre_NSHDestroy( void *data ) { hypre_ParNSHData * nsh_data = (hypre_ParNSHData*) data; /* residual */ hypre_ParVectorDestroy( hypre_ParNSHDataResidual(nsh_data) ); hypre_ParNSHDataResidual(nsh_data) = NULL; /* residual norms */ hypre_TFree( hypre_ParNSHDataRelResNorms(nsh_data), HYPRE_MEMORY_HOST ); hypre_ParNSHDataRelResNorms(nsh_data) = NULL; /* l1 norms */ hypre_TFree( hypre_ParNSHDataL1Norms(nsh_data), HYPRE_MEMORY_HOST ); hypre_ParNSHDataL1Norms(nsh_data) = NULL; /* temp arrays */ hypre_ParVectorDestroy( hypre_ParNSHDataUTemp(nsh_data) ); hypre_ParVectorDestroy( hypre_ParNSHDataFTemp(nsh_data) ); hypre_ParNSHDataUTemp(nsh_data) = NULL; hypre_ParNSHDataFTemp(nsh_data) = NULL; /* approx inverse matrix */ hypre_ParCSRMatrixDestroy( hypre_ParNSHDataMatM(nsh_data) ); hypre_ParNSHDataMatM(nsh_data) = NULL; /* droptol array */ if (hypre_ParNSHDataOwnDroptolData(nsh_data)) { hypre_TFree(hypre_ParNSHDataDroptol(nsh_data), HYPRE_MEMORY_HOST); hypre_ParNSHDataOwnDroptolData(nsh_data) = 0; hypre_ParNSHDataDroptol(nsh_data) = NULL; } /* nsh data */ hypre_TFree(nsh_data, HYPRE_MEMORY_HOST); return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_NSHWriteSolverParams * * Print solver params *--------------------------------------------------------------------------*/ HYPRE_Int hypre_NSHWriteSolverParams( void *nsh_vdata ) { hypre_ParNSHData *nsh_data = (hypre_ParNSHData*) nsh_vdata; hypre_printf("Newton-Schulz-Hotelling Setup parameters: \n"); hypre_printf("NSH max iterations = %d \n", hypre_ParNSHDataNSHMaxIter(nsh_data)); hypre_printf("NSH drop tolerance = %e \n", hypre_ParNSHDataDroptol(nsh_data)[1]); hypre_printf("NSH max nnz per row = %d \n", hypre_ParNSHDataNSHMaxRowNnz(nsh_data)); hypre_printf("MR max iterations = %d \n", hypre_ParNSHDataMRMaxIter(nsh_data)); hypre_printf("MR drop tolerance = %e \n", hypre_ParNSHDataDroptol(nsh_data)[0]); hypre_printf("MR max nnz per row = %d \n", hypre_ParNSHDataMRMaxRowNnz(nsh_data)); hypre_printf("Operator Complexity (Fill factor) = %f \n", hypre_ParNSHDataOperatorComplexity(nsh_data)); hypre_printf("\n Newton-Schulz-Hotelling Solver Parameters: \n"); hypre_printf("Max number of iterations: %d\n", hypre_ParNSHDataMaxIter(nsh_data)); hypre_printf("Stopping tolerance: %e\n", hypre_ParNSHDataTol(nsh_data)); return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_NSHSetPrintLevel *--------------------------------------------------------------------------*/ HYPRE_Int hypre_NSHSetPrintLevel( void *nsh_vdata, HYPRE_Int print_level ) { hypre_ParNSHData *nsh_data = (hypre_ParNSHData*) nsh_vdata; hypre_ParNSHDataPrintLevel(nsh_data) = print_level; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_NSHSetLogging *--------------------------------------------------------------------------*/ HYPRE_Int hypre_NSHSetLogging( void *nsh_vdata, HYPRE_Int logging ) { hypre_ParNSHData *nsh_data = (hypre_ParNSHData*) nsh_vdata; hypre_ParNSHDataLogging(nsh_data) = logging; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_NSHSetMaxIter *--------------------------------------------------------------------------*/ HYPRE_Int hypre_NSHSetMaxIter( void *nsh_vdata, HYPRE_Int max_iter ) { hypre_ParNSHData *nsh_data = (hypre_ParNSHData*) nsh_vdata; hypre_ParNSHDataMaxIter(nsh_data) = max_iter; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_NSHSetTol *--------------------------------------------------------------------------*/ HYPRE_Int hypre_NSHSetTol( void *nsh_vdata, HYPRE_Real tol ) { hypre_ParNSHData *nsh_data = (hypre_ParNSHData*) nsh_vdata; hypre_ParNSHDataTol(nsh_data) = tol; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_NSHSetGlobalSolver *--------------------------------------------------------------------------*/ HYPRE_Int hypre_NSHSetGlobalSolver( void *nsh_vdata, HYPRE_Int global_solver ) { hypre_ParNSHData *nsh_data = (hypre_ParNSHData*) nsh_vdata; hypre_ParNSHDataGlobalSolver(nsh_data) = global_solver; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_NSHSetDropThreshold *--------------------------------------------------------------------------*/ HYPRE_Int hypre_NSHSetDropThreshold( void *nsh_vdata, HYPRE_Real droptol ) { hypre_ParNSHData *nsh_data = (hypre_ParNSHData*) nsh_vdata; hypre_ParNSHDataDroptol(nsh_data)[0] = droptol; hypre_ParNSHDataDroptol(nsh_data)[1] = droptol; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_NSHSetDropThresholdArray *--------------------------------------------------------------------------*/ HYPRE_Int hypre_NSHSetDropThresholdArray( void *nsh_vdata, HYPRE_Real *droptol ) { hypre_ParNSHData *nsh_data = (hypre_ParNSHData*) nsh_vdata; if (hypre_ParNSHDataOwnDroptolData(nsh_data)) { hypre_TFree(hypre_ParNSHDataDroptol(nsh_data), HYPRE_MEMORY_HOST); hypre_ParNSHDataOwnDroptolData(nsh_data) = 0; } hypre_ParNSHDataDroptol(nsh_data) = droptol; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_NSHSetMRMaxIter *--------------------------------------------------------------------------*/ HYPRE_Int hypre_NSHSetMRMaxIter( void *nsh_vdata, HYPRE_Int mr_max_iter ) { hypre_ParNSHData *nsh_data = (hypre_ParNSHData*) nsh_vdata; hypre_ParNSHDataMRMaxIter(nsh_data) = mr_max_iter; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_NSHSetMRTol *--------------------------------------------------------------------------*/ HYPRE_Int hypre_NSHSetMRTol( void *nsh_vdata, HYPRE_Real mr_tol ) { hypre_ParNSHData *nsh_data = (hypre_ParNSHData*) nsh_vdata; hypre_ParNSHDataMRTol(nsh_data) = mr_tol; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_NSHSetMRMaxRowNnz *--------------------------------------------------------------------------*/ HYPRE_Int hypre_NSHSetMRMaxRowNnz( void *nsh_vdata, HYPRE_Int mr_max_row_nnz ) { hypre_ParNSHData *nsh_data = (hypre_ParNSHData*) nsh_vdata; hypre_ParNSHDataMRMaxRowNnz(nsh_data) = mr_max_row_nnz; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_NSHSetColVersion * * set MR version, column version or global version *--------------------------------------------------------------------------*/ HYPRE_Int hypre_NSHSetColVersion( void *nsh_vdata, HYPRE_Int mr_col_version ) { hypre_ParNSHData *nsh_data = (hypre_ParNSHData*) nsh_vdata; hypre_ParNSHDataMRColVersion(nsh_data) = mr_col_version; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_NSHSetNSHMaxIter *--------------------------------------------------------------------------*/ HYPRE_Int hypre_NSHSetNSHMaxIter( void *nsh_vdata, HYPRE_Int nsh_max_iter ) { hypre_ParNSHData *nsh_data = (hypre_ParNSHData*) nsh_vdata; hypre_ParNSHDataNSHMaxIter(nsh_data) = nsh_max_iter; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_NSHSetNSHTol *--------------------------------------------------------------------------*/ HYPRE_Int hypre_NSHSetNSHTol( void *nsh_vdata, HYPRE_Real nsh_tol ) { hypre_ParNSHData *nsh_data = (hypre_ParNSHData*) nsh_vdata; hypre_ParNSHDataNSHTol(nsh_data) = nsh_tol; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_NSHSetNSHMaxRowNnz * * Set NSH max nonzeros of a row *--------------------------------------------------------------------------*/ HYPRE_Int hypre_NSHSetNSHMaxRowNnz( void *nsh_vdata, HYPRE_Int nsh_max_row_nnz ) { hypre_ParNSHData *nsh_data = (hypre_ParNSHData*) nsh_vdata; hypre_ParNSHDataNSHMaxRowNnz(nsh_data) = nsh_max_row_nnz; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_CSRMatrixNormFro * * Compute the F norm of CSR matrix * A: the target CSR matrix * norm_io: output * * TODO (VPM): Move this function to seq_mv *--------------------------------------------------------------------------*/ HYPRE_Int hypre_CSRMatrixNormFro(hypre_CSRMatrix *A, HYPRE_Real *norm_io) { HYPRE_Real norm = 0.0; HYPRE_Real *data = hypre_CSRMatrixData(A); HYPRE_Int i, k; k = hypre_CSRMatrixNumNonzeros(A); /* main loop */ for (i = 0 ; i < k ; i ++) { norm += data[i] * data[i]; } *norm_io = hypre_sqrt(norm); return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_CSRMatrixResNormFro * * Compute the norm of I-A where I is identity matrix and A is a CSR matrix * A: the target CSR matrix * norm_io: the output * * TODO (VPM): Move this function to seq_mv *--------------------------------------------------------------------------*/ HYPRE_Int hypre_CSRMatrixResNormFro(hypre_CSRMatrix *A, HYPRE_Real *norm_io) { HYPRE_Real norm = 0.0, value; HYPRE_Int i, j, k1, k2, n; HYPRE_Int *idx = hypre_CSRMatrixI(A); HYPRE_Int *cols = hypre_CSRMatrixJ(A); HYPRE_Real *data = hypre_CSRMatrixData(A); n = hypre_CSRMatrixNumRows(A); /* main loop to sum up data */ for (i = 0 ; i < n ; i ++) { k1 = idx[i]; k2 = idx[i + 1]; /* check if we have diagonal in A */ if (k2 > k1) { if (cols[k1] == i) { /* reduce 1 on diagonal */ value = data[k1] - 1.0; norm += value * value; } else { /* we don't have diagonal in A, so we need to add 1 to norm */ norm += 1.0; norm += data[k1] * data[k1]; } } else { /* we don't have diagonal in A, so we need to add 1 to norm */ norm += 1.0; } /* and the rest of the code */ for (j = k1 + 1 ; j < k2 ; j ++) { norm += data[j] * data[j]; } } *norm_io = hypre_sqrt(norm); return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_ParCSRMatrixNormFro * * Compute the F norm of ParCSR matrix * A: the target CSR matrix * * TODO (VPM): Move this function to parcsr_mv *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ParCSRMatrixNormFro(hypre_ParCSRMatrix *A, HYPRE_Real *norm_io) { HYPRE_Real local_norm = 0.0; HYPRE_Real global_norm; MPI_Comm comm = hypre_ParCSRMatrixComm(A); hypre_CSRMatrix *A_diag = hypre_ParCSRMatrixDiag(A); hypre_CSRMatrix *A_offd = hypre_ParCSRMatrixOffd(A); hypre_CSRMatrixNormFro(A_diag, &local_norm); /* use global_norm to store offd for now */ hypre_CSRMatrixNormFro(A_offd, &global_norm); /* square and sum them */ local_norm *= local_norm; local_norm += global_norm * global_norm; /* do communication to get global total sum */ hypre_MPI_Allreduce(&local_norm, &global_norm, 1, HYPRE_MPI_REAL, hypre_MPI_SUM, comm); *norm_io = hypre_sqrt(global_norm); return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_ParCSRMatrixResNormFro * * Compute the F norm of ParCSR matrix * Norm of I-A * A: the target CSR matrix * * TODO (VPM): Move this function to parcsr_mv *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ParCSRMatrixResNormFro(hypre_ParCSRMatrix *A, HYPRE_Real *norm_io) { HYPRE_Real local_norm = 0.0; HYPRE_Real global_norm; MPI_Comm comm = hypre_ParCSRMatrixComm(A); hypre_CSRMatrix *A_diag = hypre_ParCSRMatrixDiag(A); hypre_CSRMatrix *A_offd = hypre_ParCSRMatrixOffd(A); /* compute I-A for diagonal */ hypre_CSRMatrixResNormFro(A_diag, &local_norm); /* use global_norm to store offd for now */ hypre_CSRMatrixNormFro(A_offd, &global_norm); /* square and sum them */ local_norm *= local_norm; local_norm += global_norm * global_norm; /* do communication to get global total sum */ hypre_MPI_Allreduce(&local_norm, &global_norm, 1, HYPRE_MPI_REAL, hypre_MPI_SUM, comm); *norm_io = hypre_sqrt(global_norm); return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_CSRMatrixTrace * * Compute the trace of CSR matrix * A: the target CSR matrix * trace_io: the output trace * * TODO (VPM): Move this function to seq_mv *--------------------------------------------------------------------------*/ HYPRE_Int hypre_CSRMatrixTrace(hypre_CSRMatrix *A, HYPRE_Real *trace_io) { HYPRE_Real trace = 0.0; HYPRE_Int *idx = hypre_CSRMatrixI(A); HYPRE_Int *cols = hypre_CSRMatrixJ(A); HYPRE_Real *data = hypre_CSRMatrixData(A); HYPRE_Int i, k1, k2, n; n = hypre_CSRMatrixNumRows(A); for (i = 0 ; i < n ; i ++) { k1 = idx[i]; k2 = idx[i + 1]; if (cols[k1] == i && k2 > k1) { /* only add when diagonal is nonzero */ trace += data[k1]; } } *trace_io = trace; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_CSRMatrixDropInplace * * Apply dropping to CSR matrix * A: the target CSR matrix * droptol: all entries have smaller absolute value than this will be dropped * max_row_nnz: max nonzeros allowed for each row, only largest max_row_nnz kept * we NEVER drop diagonal entry if exists * * TODO (VPM): Move this function to seq_mv *--------------------------------------------------------------------------*/ HYPRE_Int hypre_CSRMatrixDropInplace(hypre_CSRMatrix *A, HYPRE_Real droptol, HYPRE_Int max_row_nnz) { HYPRE_Int i, j, k1, k2; HYPRE_Int *idx, len, drop_len; HYPRE_Real *data, value, itol, norm; /* info of matrix A */ HYPRE_Int n = hypre_CSRMatrixNumRows(A); HYPRE_Int m = hypre_CSRMatrixNumCols(A); HYPRE_Int *A_i = hypre_CSRMatrixI(A); HYPRE_Int *A_j = hypre_CSRMatrixJ(A); HYPRE_Real *A_data = hypre_CSRMatrixData(A); HYPRE_Real nnzA = hypre_CSRMatrixNumNonzeros(A); HYPRE_MemoryLocation memory_location = hypre_CSRMatrixMemoryLocation(A); /* new data */ HYPRE_Int *new_i; HYPRE_Int *new_j; HYPRE_Real *new_data; /* memory */ HYPRE_Int capacity; HYPRE_Int ctrA; /* setup */ capacity = (HYPRE_Int)(nnzA * 0.3 + 1); ctrA = 0; new_i = hypre_TAlloc(HYPRE_Int, n + 1, memory_location); new_j = hypre_TAlloc(HYPRE_Int, capacity, memory_location); new_data = hypre_TAlloc(HYPRE_Real, capacity, memory_location); idx = hypre_TAlloc(HYPRE_Int, m, memory_location); data = hypre_TAlloc(HYPRE_Real, m, memory_location); /* start of main loop */ new_i[0] = 0; for (i = 0 ; i < n ; i ++) { len = 0; k1 = A_i[i]; k2 = A_i[i + 1]; /* compute droptol for current row */ norm = 0.0; for (j = k1 ; j < k2 ; j ++) { norm += hypre_abs(A_data[j]); } if (k2 > k1) { norm /= (HYPRE_Real)(k2 - k1); } itol = droptol * norm; /* we don't want to drop the diagonal entry, so use an if statement here */ if (A_j[k1] == i) { /* we have diagonal entry, skip it */ idx[len] = A_j[k1]; data[len++] = A_data[k1]; for (j = k1 + 1 ; j < k2 ; j ++) { value = A_data[j]; if (hypre_abs(value) < itol) { /* skip small element */ continue; } idx[len] = A_j[j]; data[len++] = A_data[j]; } /* now apply drop on length */ if (len > max_row_nnz) { drop_len = max_row_nnz; hypre_ILUMaxQSplitRabsI( data + 1, idx + 1, 0, drop_len - 1, len - 2); } else { /* don't need to sort, we keep all of them */ drop_len = len; } /* copy data */ while (ctrA + drop_len > capacity) { HYPRE_Int tmp = capacity; capacity = (HYPRE_Int)(capacity * EXPAND_FACT + 1); new_j = hypre_TReAlloc_v2(new_j, HYPRE_Int, tmp, HYPRE_Int, capacity, memory_location); new_data = hypre_TReAlloc_v2(new_data, HYPRE_Real, tmp, HYPRE_Real, capacity, memory_location); } hypre_TMemcpy(new_j + ctrA, idx, HYPRE_Int, drop_len, memory_location, memory_location); hypre_TMemcpy(new_data + ctrA, data, HYPRE_Real, drop_len, memory_location, memory_location); ctrA += drop_len; new_i[i + 1] = ctrA; } else { /* we don't have diagonal entry */ for (j = k1 ; j < k2 ; j ++) { value = A_data[j]; if (hypre_abs(value) < itol) { /* skip small element */ continue; } idx[len] = A_j[j]; data[len++] = A_data[j]; } /* now apply drop on length */ if (len > max_row_nnz) { drop_len = max_row_nnz; hypre_ILUMaxQSplitRabsI( data, idx, 0, drop_len, len - 1); } else { /* don't need to sort, we keep all of them */ drop_len = len; } /* copy data */ while (ctrA + drop_len > capacity) { HYPRE_Int tmp = capacity; capacity = (HYPRE_Int)(capacity * EXPAND_FACT + 1); new_j = hypre_TReAlloc_v2(new_j, HYPRE_Int, tmp, HYPRE_Int, capacity, memory_location); new_data = hypre_TReAlloc_v2(new_data, HYPRE_Real, tmp, HYPRE_Real, capacity, memory_location); } hypre_TMemcpy(new_j + ctrA, idx, HYPRE_Int, drop_len, memory_location, memory_location); hypre_TMemcpy(new_data + ctrA, data, HYPRE_Real, drop_len, memory_location, memory_location); ctrA += drop_len; new_i[i + 1] = ctrA; } }/* end of main loop */ /* destory data if A own them */ if (hypre_CSRMatrixOwnsData(A)) { hypre_TFree(A_i, memory_location); hypre_TFree(A_j, memory_location); hypre_TFree(A_data, memory_location); } hypre_CSRMatrixI(A) = new_i; hypre_CSRMatrixJ(A) = new_j; hypre_CSRMatrixData(A) = new_data; hypre_CSRMatrixNumNonzeros(A) = ctrA; hypre_CSRMatrixOwnsData(A) = 1; hypre_TFree(idx, memory_location); hypre_TFree(data, memory_location); return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_ILUCSRMatrixInverseSelfPrecondMRGlobal * * Compute the inverse with MR of original CSR matrix * Global(not by each column) and out place version * A: the input matrix * M: the output matrix * droptol: the dropping tolorance * tol: when to stop the iteration * eps_tol: to avoid divide by 0 * max_row_nnz: max number of nonzeros per row * max_iter: max number of iterations * print_level: the print level of this algorithm *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ILUCSRMatrixInverseSelfPrecondMRGlobal(hypre_CSRMatrix *matA, hypre_CSRMatrix **M, HYPRE_Real droptol, HYPRE_Real tol, HYPRE_Real eps_tol, HYPRE_Int max_row_nnz, HYPRE_Int max_iter, HYPRE_Int print_level) { /* matrix A */ HYPRE_Int *A_i = hypre_CSRMatrixI(matA); HYPRE_Int *A_j = hypre_CSRMatrixJ(matA); HYPRE_Real *A_data = hypre_CSRMatrixData(matA); HYPRE_MemoryLocation memory_location = hypre_CSRMatrixMemoryLocation(matA); /* complexity */ HYPRE_Real nnzA = hypre_CSRMatrixNumNonzeros(matA); HYPRE_Real nnzM = 1.0; /* inverse matrix */ hypre_CSRMatrix *inM = *M; hypre_CSRMatrix *matM; HYPRE_Int *M_i; HYPRE_Int *M_j; HYPRE_Real *M_data; /* idendity matrix */ hypre_CSRMatrix *matI; HYPRE_Int *I_i; HYPRE_Int *I_j; HYPRE_Real *I_data; /* helper matrices */ hypre_CSRMatrix *matR; hypre_CSRMatrix *matR_temp; hypre_CSRMatrix *matZ; hypre_CSRMatrix *matC; hypre_CSRMatrix *matW; HYPRE_Real time_s = 0.0, time_e; HYPRE_Int i, k1, k2; HYPRE_Real value, trace1, trace2, alpha, r_norm = 0.0; HYPRE_Int n = hypre_CSRMatrixNumRows(matA); /* create initial guess and matrix I */ matM = hypre_CSRMatrixCreate(n, n, n); M_i = hypre_TAlloc(HYPRE_Int, n + 1, memory_location); M_j = hypre_TAlloc(HYPRE_Int, n, memory_location); M_data = hypre_TAlloc(HYPRE_Real, n, memory_location); matI = hypre_CSRMatrixCreate(n, n, n); I_i = hypre_TAlloc(HYPRE_Int, n + 1, memory_location); I_j = hypre_TAlloc(HYPRE_Int, n, memory_location); I_data = hypre_TAlloc(HYPRE_Real, n, memory_location); /* now loop to create initial guess */ M_i[0] = 0; I_i[0] = 0; for (i = 0 ; i < n ; i ++) { M_i[i + 1] = i + 1; M_j[i] = i; k1 = A_i[i]; k2 = A_i[i + 1]; if (k2 > k1) { if (A_j[k1] == i) { value = A_data[k1]; if (hypre_abs(value) < MAT_TOL) { value = 1.0; } M_data[i] = 1.0 / value; } else { M_data[i] = 1.0; } } else { M_data[i] = 1.0; } I_i[i + 1] = i + 1; I_j[i] = i; I_data[i] = 1.0; } hypre_CSRMatrixI(matM) = M_i; hypre_CSRMatrixJ(matM) = M_j; hypre_CSRMatrixData(matM) = M_data; hypre_CSRMatrixOwnsData(matM) = 1; hypre_CSRMatrixI(matI) = I_i; hypre_CSRMatrixJ(matI) = I_j; hypre_CSRMatrixData(matI) = I_data; hypre_CSRMatrixOwnsData(matI) = 1; /* now start the main loop */ if (print_level > 1) { /* time the iteration */ time_s = hypre_MPI_Wtime(); } /* main loop */ for (i = 0 ; i < max_iter ; i ++) { nnzM = hypre_CSRMatrixNumNonzeros(matM); /* R = I - AM */ matR_temp = hypre_CSRMatrixMultiply(matA, matM); hypre_CSRMatrixScale(matR_temp, -1.0); matR = hypre_CSRMatrixAdd(1.0, matI, 1.0, matR_temp); hypre_CSRMatrixDestroy(matR_temp); /* r_norm */ hypre_CSRMatrixNormFro(matR, &r_norm); if (r_norm < tol) { break; } /* Z = MR and dropping */ matZ = hypre_CSRMatrixMultiply(matM, matR); //hypre_CSRMatrixNormFro(matZ, &z_norm); hypre_CSRMatrixDropInplace(matZ, droptol, max_row_nnz); /* C = A*Z */ matC = hypre_CSRMatrixMultiply(matA, matZ); /* W = R' * C */ hypre_CSRMatrixTranspose(matR, &matR_temp, 1); matW = hypre_CSRMatrixMultiply(matR_temp, matC); /* trace and alpha */ hypre_CSRMatrixTrace(matW, &trace1); hypre_CSRMatrixNormFro(matC, &trace2); trace2 *= trace2; if (hypre_abs(trace2) < eps_tol) { break; } alpha = trace1 / trace2; /* M - M + alpha * Z */ hypre_CSRMatrixScale(matZ, alpha); hypre_CSRMatrixDestroy(matR); matR = hypre_CSRMatrixAdd(1.0, matM, 1.0, matZ); hypre_CSRMatrixDestroy(matM); matM = matR; hypre_CSRMatrixDestroy(matZ); hypre_CSRMatrixDestroy(matW); hypre_CSRMatrixDestroy(matC); hypre_CSRMatrixDestroy(matR_temp); } /* end of main loop i for compute inverse matrix */ /* time if we need to print */ if (print_level > 1) { time_e = hypre_MPI_Wtime(); if (i == 0) { i = 1; } hypre_printf("matrix size %5d\nfinal norm at loop %5d is %16.12f, time per iteration is %16.12f, complexity is %16.12f out of maximum %16.12f\n", n, i, r_norm, (time_e - time_s) / i, nnzM / nnzA, n / nnzA * n); } hypre_CSRMatrixDestroy(matI); if (inM) { hypre_CSRMatrixDestroy(inM); } *M = matM; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_ILUParCSRInverseNSH * * Compute inverse with NSH method * Use MR to get local initial guess * A: input matrix * M: output matrix * droptol: droptol array. droptol[0] for MR and droptol[1] for NSH. * mr_tol: tol for stop iteration for MR * nsh_tol: tol for stop iteration for NSH * esp_tol: tol for avoid divide by 0 * mr_max_row_nnz: max number of nonzeros for MR * nsh_max_row_nnz: max number of nonzeros for NSH * mr_max_iter: max number of iterations for MR * nsh_max_iter: max number of iterations for NSH * mr_col_version: column version of global version *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ILUParCSRInverseNSH(hypre_ParCSRMatrix *A, hypre_ParCSRMatrix **M, HYPRE_Real *droptol, HYPRE_Real mr_tol, HYPRE_Real nsh_tol, HYPRE_Real eps_tol, HYPRE_Int mr_max_row_nnz, HYPRE_Int nsh_max_row_nnz, HYPRE_Int mr_max_iter, HYPRE_Int nsh_max_iter, HYPRE_Int mr_col_version, HYPRE_Int print_level) { HYPRE_UNUSED_VAR(nsh_max_row_nnz); /* data slots for matrices */ hypre_ParCSRMatrix *matM = NULL; hypre_ParCSRMatrix *inM = *M; hypre_ParCSRMatrix *AM, *MAM; HYPRE_Real norm, s_norm; MPI_Comm comm = hypre_ParCSRMatrixComm(A); HYPRE_Int myid; HYPRE_MemoryLocation memory_location = hypre_ParCSRMatrixMemoryLocation(A); hypre_CSRMatrix *A_diag = hypre_ParCSRMatrixDiag(A); hypre_CSRMatrix *M_diag = NULL; hypre_CSRMatrix *M_offd; HYPRE_Int *M_offd_i; HYPRE_Real time_s = 0.0, time_e; HYPRE_Int n = hypre_CSRMatrixNumRows(A_diag); HYPRE_Int i; /* setup */ hypre_MPI_Comm_rank(comm, &myid); M_offd_i = hypre_CTAlloc(HYPRE_Int, n + 1, memory_location); if (mr_col_version) { hypre_printf("Column version is not yet support, switch to global version\n"); } /* call MR to build loacl initial matrix * droptol here should be larger * we want same number for MR and NSH to let user set them eaiser * but we don't want a too dense MR initial guess */ hypre_ILUCSRMatrixInverseSelfPrecondMRGlobal(A_diag, &M_diag, droptol[0] * 10.0, mr_tol, eps_tol, mr_max_row_nnz, mr_max_iter, print_level ); /* create parCSR matM */ matM = hypre_ParCSRMatrixCreate( comm, hypre_ParCSRMatrixGlobalNumRows(A), hypre_ParCSRMatrixGlobalNumRows(A), hypre_ParCSRMatrixRowStarts(A), hypre_ParCSRMatrixColStarts(A), 0, hypre_CSRMatrixNumNonzeros(M_diag), 0 ); hypre_CSRMatrixDestroy(hypre_ParCSRMatrixDiag(matM)); hypre_ParCSRMatrixDiag(matM) = M_diag; M_offd = hypre_ParCSRMatrixOffd(matM); hypre_CSRMatrixI(M_offd) = M_offd_i; hypre_CSRMatrixNumRownnz(M_offd) = 0; hypre_CSRMatrixOwnsData(M_offd) = 1; /* now start NSH * Mj+1 = 2Mj - MjAMj */ AM = hypre_ParMatmul(A, matM); hypre_ParCSRMatrixResNormFro(AM, &norm); s_norm = norm; hypre_ParCSRMatrixDestroy(AM); if (print_level > 1) { if (myid == 0) { hypre_printf("before NSH the norm is %16.12f\n", norm); } time_s = hypre_MPI_Wtime(); } for (i = 0 ; i < nsh_max_iter ; i ++) { /* compute XjAXj */ AM = hypre_ParMatmul(A, matM); hypre_ParCSRMatrixResNormFro(AM, &norm); if (norm < nsh_tol) { break; } MAM = hypre_ParMatmul(matM, AM); hypre_ParCSRMatrixDestroy(AM); /* apply dropping */ //hypre_ParCSRMatrixNormFro(MAM, &norm); /* drop small entries based on 2-norm */ hypre_ParCSRMatrixDropSmallEntries(MAM, droptol[1], 2); /* update Mj+1 = 2Mj - MjAMj * the result holds it own start/end data! */ hypre_ParCSRMatrixAdd(2.0, matM, -1.0, MAM, &AM); hypre_ParCSRMatrixDestroy(matM); matM = AM; /* destroy */ hypre_ParCSRMatrixDestroy(MAM); } if (print_level > 1) { time_e = hypre_MPI_Wtime(); /* at this point of time, norm has to be already computed */ if (i == 0) { i = 1; } if (myid == 0) { hypre_printf("after %5d NSH iterations the norm is %16.12f, time per iteration is %16.12f\n", i, norm, (time_e - time_s) / i); } } if (s_norm < norm) { /* the residual norm increase after NSH iteration, need to let user know */ if (myid == 0) { hypre_printf("Warning: NSH divergence, probably bad approximate invese matrix.\n"); } } if (inM) { hypre_ParCSRMatrixDestroy(inM); } *M = matM; return hypre_error_flag; } hypre-2.33.0/src/parcsr_ls/par_ilu.h000066400000000000000000000435671477326011500173360ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #ifndef hypre_ParILU_DATA_HEADER #define hypre_ParILU_DATA_HEADER /*-------------------------------------------------------------------------- * hypre_ParILUData *--------------------------------------------------------------------------*/ typedef struct hypre_ParILUData_struct { /* Base solver data structure */ hypre_Solver base; /* General data */ HYPRE_Int global_solver; hypre_ParCSRMatrix *matA; hypre_ParCSRMatrix *matL; HYPRE_Real *matD; hypre_ParCSRMatrix *matU; hypre_ParCSRMatrix *matmL; HYPRE_Real *matmD; hypre_ParCSRMatrix *matmU; hypre_ParCSRMatrix *matS; HYPRE_Real *droptol; /* Array of 3 elements, for B, (E and F), S respectively */ HYPRE_Int lfil; HYPRE_Int maxRowNnz; HYPRE_Int *CF_marker_array; HYPRE_Int *perm; HYPRE_Int *qperm; HYPRE_Real tol_ddPQ; hypre_ParVector *F; hypre_ParVector *U; hypre_ParVector *residual; HYPRE_Real *rel_res_norms; HYPRE_Int num_iterations; HYPRE_Real *l1_norms; HYPRE_Real final_rel_residual_norm; HYPRE_Real tol; HYPRE_Real operator_complexity; HYPRE_Int logging; HYPRE_Int print_level; HYPRE_Int max_iter; HYPRE_Int tri_solve; HYPRE_Int lower_jacobi_iters; HYPRE_Int upper_jacobi_iters; HYPRE_Int ilu_type; HYPRE_Int nLU; HYPRE_Int nI; HYPRE_Int *u_end; /* used when schur block is formed */ /* Iterative ILU parameters */ HYPRE_Int iter_setup_type; HYPRE_Int iter_setup_option; HYPRE_Int setup_max_iter; HYPRE_Int setup_num_iter; HYPRE_Real setup_tolerance; HYPRE_Complex *setup_history; /* temp vectors for solve phase */ hypre_ParVector *Utemp; hypre_ParVector *Ftemp; hypre_ParVector *Xtemp; hypre_ParVector *Ytemp; hypre_ParVector *Ztemp; HYPRE_Real *uext; HYPRE_Real *fext; /* On GPU, we have to form E and F explicitly, since we don't have much control to it */ #if defined(HYPRE_USING_GPU) hypre_CSRMatrix *matALU_d; /* Matrix holding ILU of A (for A-smoothing) */ hypre_CSRMatrix *matBLU_d; /* Matrix holding ILU of B */ hypre_CSRMatrix *matSLU_d; /* Matrix holding ILU of S */ hypre_CSRMatrix *matE_d; hypre_CSRMatrix *matF_d; hypre_ParCSRMatrix *Aperm; hypre_ParCSRMatrix *R; hypre_ParCSRMatrix *P; hypre_Vector *Ftemp_upper; hypre_Vector *Utemp_lower; hypre_Vector *Adiag_diag; hypre_Vector *Sdiag_diag; #endif /* data structure sor solving Schur System */ HYPRE_Solver schur_solver; HYPRE_Solver schur_precond; hypre_ParVector *rhs; hypre_ParVector *x; /* Schur solver data */ HYPRE_Int ss_logging; HYPRE_Int ss_print_level; /* Schur-GMRES */ HYPRE_Int ss_kDim; /* max number of iterations for GMRES */ HYPRE_Int ss_max_iter; /* max number of iterations for GMRES solve */ HYPRE_Real ss_tol; /* stop iteration tol for GMRES */ HYPRE_Real ss_absolute_tol; /* absolute tol for GMRES or tol for NSH solve */ HYPRE_Int ss_rel_change; /* Schur-NSH */ HYPRE_Int ss_nsh_setup_max_iter; /* number of iterations for NSH inverse */ HYPRE_Int ss_nsh_solve_max_iter; /* max number of iterations for NSH solve */ HYPRE_Real ss_nsh_setup_tol; /* stop iteration tol for NSH inverse */ HYPRE_Real ss_nsh_solve_tol; /* absolute tol for NSH solve */ HYPRE_Int ss_nsh_max_row_nnz; /* max rows of nonzeros for NSH */ HYPRE_Int ss_nsh_mr_col_version; /* MR column version setting in NSH */ HYPRE_Int ss_nsh_mr_max_row_nnz; /* max rows for MR */ HYPRE_Real *ss_nsh_droptol; /* droptol array for NSH */ HYPRE_Int ss_nsh_mr_max_iter; /* max MR iteration */ HYPRE_Real ss_nsh_mr_tol; /* Schur precond data */ HYPRE_Int sp_ilu_type; /* ilu type is use ILU */ HYPRE_Int sp_ilu_lfil; /* level of fill in for ILUK */ HYPRE_Int sp_ilu_max_row_nnz; /* max rows for ILUT */ /* droptol for ILUT or MR * ILUT: [0], [1], [2] B, E&F, S respectively * NSH: [0] for MR, [1] for NSH */ HYPRE_Real *sp_ilu_droptol; /* droptol array for ILUT */ HYPRE_Int sp_print_level; HYPRE_Int sp_max_iter; /* max precond iter or max MR iteration */ HYPRE_Int sp_tri_solve; HYPRE_Int sp_lower_jacobi_iters; HYPRE_Int sp_upper_jacobi_iters; HYPRE_Real sp_tol; HYPRE_Int test_opt; /* TODO (VPM): change this to something more descriptive*/ /* local reordering */ HYPRE_Int reordering_type; } hypre_ParILUData; #define hypre_ParILUDataTestOption(ilu_data) ((ilu_data) -> test_opt) #if defined(HYPRE_USING_GPU) #define hypre_ParILUDataMatAILUDevice(ilu_data) ((ilu_data) -> matALU_d) #define hypre_ParILUDataMatBILUDevice(ilu_data) ((ilu_data) -> matBLU_d) #define hypre_ParILUDataMatSILUDevice(ilu_data) ((ilu_data) -> matSLU_d) #define hypre_ParILUDataMatEDevice(ilu_data) ((ilu_data) -> matE_d) #define hypre_ParILUDataMatFDevice(ilu_data) ((ilu_data) -> matF_d) #define hypre_ParILUDataAperm(ilu_data) ((ilu_data) -> Aperm) #define hypre_ParILUDataR(ilu_data) ((ilu_data) -> R) #define hypre_ParILUDataP(ilu_data) ((ilu_data) -> P) #define hypre_ParILUDataFTempUpper(ilu_data) ((ilu_data) -> Ftemp_upper) #define hypre_ParILUDataUTempLower(ilu_data) ((ilu_data) -> Utemp_lower) #define hypre_ParILUDataADiagDiag(ilu_data) ((ilu_data) -> Adiag_diag) #define hypre_ParILUDataSDiagDiag(ilu_data) ((ilu_data) -> Sdiag_diag) #endif #define hypre_ParILUDataGlobalSolver(ilu_data) ((ilu_data) -> global_solver) #define hypre_ParILUDataMatA(ilu_data) ((ilu_data) -> matA) #define hypre_ParILUDataMatL(ilu_data) ((ilu_data) -> matL) #define hypre_ParILUDataMatD(ilu_data) ((ilu_data) -> matD) #define hypre_ParILUDataMatU(ilu_data) ((ilu_data) -> matU) #define hypre_ParILUDataMatLModified(ilu_data) ((ilu_data) -> matmL) #define hypre_ParILUDataMatDModified(ilu_data) ((ilu_data) -> matmD) #define hypre_ParILUDataMatUModified(ilu_data) ((ilu_data) -> matmU) #define hypre_ParILUDataMatS(ilu_data) ((ilu_data) -> matS) #define hypre_ParILUDataDroptol(ilu_data) ((ilu_data) -> droptol) #define hypre_ParILUDataLfil(ilu_data) ((ilu_data) -> lfil) #define hypre_ParILUDataMaxRowNnz(ilu_data) ((ilu_data) -> maxRowNnz) #define hypre_ParILUDataCFMarkerArray(ilu_data) ((ilu_data) -> CF_marker_array) #define hypre_ParILUDataPerm(ilu_data) ((ilu_data) -> perm) #define hypre_ParILUDataPPerm(ilu_data) ((ilu_data) -> perm) #define hypre_ParILUDataQPerm(ilu_data) ((ilu_data) -> qperm) #define hypre_ParILUDataTolDDPQ(ilu_data) ((ilu_data) -> tol_ddPQ) #define hypre_ParILUDataF(ilu_data) ((ilu_data) -> F) #define hypre_ParILUDataU(ilu_data) ((ilu_data) -> U) #define hypre_ParILUDataResidual(ilu_data) ((ilu_data) -> residual) #define hypre_ParILUDataRelResNorms(ilu_data) ((ilu_data) -> rel_res_norms) #define hypre_ParILUDataNumIterations(ilu_data) ((ilu_data) -> num_iterations) #define hypre_ParILUDataL1Norms(ilu_data) ((ilu_data) -> l1_norms) #define hypre_ParILUDataFinalRelResidualNorm(ilu_data) ((ilu_data) -> final_rel_residual_norm) #define hypre_ParILUDataTol(ilu_data) ((ilu_data) -> tol) #define hypre_ParILUDataOperatorComplexity(ilu_data) ((ilu_data) -> operator_complexity) #define hypre_ParILUDataLogging(ilu_data) ((ilu_data) -> logging) #define hypre_ParILUDataPrintLevel(ilu_data) ((ilu_data) -> print_level) #define hypre_ParILUDataMaxIter(ilu_data) ((ilu_data) -> max_iter) #define hypre_ParILUDataTriSolve(ilu_data) ((ilu_data) -> tri_solve) #define hypre_ParILUDataLowerJacobiIters(ilu_data) ((ilu_data) -> lower_jacobi_iters) #define hypre_ParILUDataUpperJacobiIters(ilu_data) ((ilu_data) -> upper_jacobi_iters) #define hypre_ParILUDataIluType(ilu_data) ((ilu_data) -> ilu_type) #define hypre_ParILUDataNLU(ilu_data) ((ilu_data) -> nLU) #define hypre_ParILUDataNI(ilu_data) ((ilu_data) -> nI) #define hypre_ParILUDataUEnd(ilu_data) ((ilu_data) -> u_end) #define hypre_ParILUDataUTemp(ilu_data) ((ilu_data) -> Utemp) #define hypre_ParILUDataFTemp(ilu_data) ((ilu_data) -> Ftemp) #define hypre_ParILUDataXTemp(ilu_data) ((ilu_data) -> Xtemp) #define hypre_ParILUDataYTemp(ilu_data) ((ilu_data) -> Ytemp) #define hypre_ParILUDataZTemp(ilu_data) ((ilu_data) -> Ztemp) #define hypre_ParILUDataUExt(ilu_data) ((ilu_data) -> uext) #define hypre_ParILUDataFExt(ilu_data) ((ilu_data) -> fext) #define hypre_ParILUDataSchurSolver(ilu_data) ((ilu_data) -> schur_solver) #define hypre_ParILUDataSchurPrecond(ilu_data) ((ilu_data) -> schur_precond) #define hypre_ParILUDataRhs(ilu_data) ((ilu_data) -> rhs) #define hypre_ParILUDataX(ilu_data) ((ilu_data) -> x) #define hypre_ParILUDataReorderingType(ilu_data) ((ilu_data) -> reordering_type) /* Iterative ILU setup */ #define hypre_ParILUDataIterativeSetupType(ilu_data) ((ilu_data) -> iter_setup_type) #define hypre_ParILUDataIterativeSetupOption(ilu_data) ((ilu_data) -> iter_setup_option) #define hypre_ParILUDataIterativeSetupMaxIter(ilu_data) ((ilu_data) -> setup_max_iter) #define hypre_ParILUDataIterativeSetupNumIter(ilu_data) ((ilu_data) -> setup_num_iter) #define hypre_ParILUDataIterativeSetupTolerance(ilu_data) ((ilu_data) -> setup_tolerance) #define hypre_ParILUDataIterativeSetupHistory(ilu_data) ((ilu_data) -> setup_history) #define hypre_ParILUDataIterSetupCorrectionNorm(ilu_data,i) ((ilu_data) -> setup_history[i]) #define hypre_ParILUDataIterSetupResidualNorm(ilu_data,i) (((ilu_data) -> setup_history + \ (ilu_data) -> setup_num_iter)[i]) /* Schur System */ #define hypre_ParILUDataSchurGMRESKDim(ilu_data) ((ilu_data) -> ss_kDim) #define hypre_ParILUDataSchurGMRESMaxIter(ilu_data) ((ilu_data) -> ss_max_iter) #define hypre_ParILUDataSchurGMRESTol(ilu_data) ((ilu_data) -> ss_tol) #define hypre_ParILUDataSchurGMRESAbsoluteTol(ilu_data) ((ilu_data) -> ss_absolute_tol) #define hypre_ParILUDataSchurGMRESRelChange(ilu_data) ((ilu_data) -> ss_rel_change) #define hypre_ParILUDataSchurPrecondIluType(ilu_data) ((ilu_data) -> sp_ilu_type) #define hypre_ParILUDataSchurPrecondIluLfil(ilu_data) ((ilu_data) -> sp_ilu_lfil) #define hypre_ParILUDataSchurPrecondIluMaxRowNnz(ilu_data) ((ilu_data) -> sp_ilu_max_row_nnz) #define hypre_ParILUDataSchurPrecondIluDroptol(ilu_data) ((ilu_data) -> sp_ilu_droptol) #define hypre_ParILUDataSchurPrecondPrintLevel(ilu_data) ((ilu_data) -> sp_print_level) #define hypre_ParILUDataSchurPrecondMaxIter(ilu_data) ((ilu_data) -> sp_max_iter) #define hypre_ParILUDataSchurPrecondTriSolve(ilu_data) ((ilu_data) -> sp_tri_solve) #define hypre_ParILUDataSchurPrecondLowerJacobiIters(ilu_data) ((ilu_data) -> sp_lower_jacobi_iters) #define hypre_ParILUDataSchurPrecondUpperJacobiIters(ilu_data) ((ilu_data) -> sp_upper_jacobi_iters) #define hypre_ParILUDataSchurPrecondTol(ilu_data) ((ilu_data) -> sp_tol) #define hypre_ParILUDataSchurNSHMaxNumIter(ilu_data) ((ilu_data) -> ss_nsh_setup_max_iter) #define hypre_ParILUDataSchurNSHSolveMaxIter(ilu_data) ((ilu_data) -> ss_nsh_solve_max_iter) #define hypre_ParILUDataSchurNSHTol(ilu_data) ((ilu_data) -> ss_nsh_setup_tol) #define hypre_ParILUDataSchurNSHSolveTol(ilu_data) ((ilu_data) -> ss_nsh_solve_tol) #define hypre_ParILUDataSchurNSHMaxRowNnz(ilu_data) ((ilu_data) -> ss_nsh_max_row_nnz) #define hypre_ParILUDataSchurMRColVersion(ilu_data) ((ilu_data) -> ss_nsh_mr_col_version) #define hypre_ParILUDataSchurMRMaxRowNnz(ilu_data) ((ilu_data) -> ss_nsh_mr_max_row_nnz) #define hypre_ParILUDataSchurNSHDroptol(ilu_data) ((ilu_data) -> ss_nsh_droptol) #define hypre_ParILUDataSchurMRMaxIter(ilu_data) ((ilu_data) -> ss_nsh_mr_max_iter) #define hypre_ParILUDataSchurMRTol(ilu_data) ((ilu_data) -> ss_nsh_mr_tol) #define hypre_ParILUDataSchurSolverLogging(ilu_data) ((ilu_data) -> ss_logging) #define hypre_ParILUDataSchurSolverPrintLevel(ilu_data) ((ilu_data) -> ss_print_level) #define FMRK -1 #define CMRK 1 #define UMRK 0 #define S_CMRK 2 #define FPT(i, bsize) (((i) % (bsize)) == FMRK) #define CPT(i, bsize) (((i) % (bsize)) == CMRK) #define MAT_TOL 1e-14 #define EXPAND_FACT 1.3 /* NSH data structure */ typedef struct hypre_ParNSHData_struct { /* solver information */ HYPRE_Int global_solver; hypre_ParCSRMatrix *matA; hypre_ParCSRMatrix *matM; hypre_ParVector *F; hypre_ParVector *U; hypre_ParVector *residual; HYPRE_Real *rel_res_norms; HYPRE_Int num_iterations; HYPRE_Real *l1_norms; HYPRE_Real final_rel_residual_norm; HYPRE_Real tol; HYPRE_Real operator_complexity; HYPRE_Int logging; HYPRE_Int print_level; HYPRE_Int max_iter; /* common data slots */ HYPRE_Real *droptol; /* 2 drop torelances for {MR, NSH}*/ HYPRE_Int own_droptol_data; /* temp vectors for solve phase */ hypre_ParVector *Utemp; hypre_ParVector *Ftemp; /* data slots for local MR */ HYPRE_Int mr_max_iter; HYPRE_Real mr_tol; HYPRE_Int mr_max_row_nnz; HYPRE_Int mr_col_version; /* global version or column version MR */ /* data slots for global NSH */ HYPRE_Int nsh_max_iter; HYPRE_Real nsh_tol; HYPRE_Int nsh_max_row_nnz; } hypre_ParNSHData; #define hypre_ParNSHDataGlobalSolver(nsh_data) ((nsh_data) -> global_solver) #define hypre_ParNSHDataMatA(nsh_data) ((nsh_data) -> matA) #define hypre_ParNSHDataMatM(nsh_data) ((nsh_data) -> matM) #define hypre_ParNSHDataF(nsh_data) ((nsh_data) -> F) #define hypre_ParNSHDataU(nsh_data) ((nsh_data) -> U) #define hypre_ParNSHDataResidual(nsh_data) ((nsh_data) -> residual) #define hypre_ParNSHDataRelResNorms(nsh_data) ((nsh_data) -> rel_res_norms) #define hypre_ParNSHDataNumIterations(nsh_data) ((nsh_data) -> num_iterations) #define hypre_ParNSHDataL1Norms(nsh_data) ((nsh_data) -> l1_norms) #define hypre_ParNSHDataFinalRelResidualNorm(nsh_data) ((nsh_data) -> final_rel_residual_norm) #define hypre_ParNSHDataTol(nsh_data) ((nsh_data) -> tol) #define hypre_ParNSHDataOperatorComplexity(nsh_data) ((nsh_data) -> operator_complexity) #define hypre_ParNSHDataLogging(nsh_data) ((nsh_data) -> logging) #define hypre_ParNSHDataPrintLevel(nsh_data) ((nsh_data) -> print_level) #define hypre_ParNSHDataMaxIter(nsh_data) ((nsh_data) -> max_iter) #define hypre_ParNSHDataDroptol(nsh_data) ((nsh_data) -> droptol) #define hypre_ParNSHDataOwnDroptolData(nsh_data) ((nsh_data) -> own_droptol_data) #define hypre_ParNSHDataUTemp(nsh_data) ((nsh_data) -> Utemp) #define hypre_ParNSHDataFTemp(nsh_data) ((nsh_data) -> Ftemp) #define hypre_ParNSHDataMRMaxIter(nsh_data) ((nsh_data) -> mr_max_iter) #define hypre_ParNSHDataMRTol(nsh_data) ((nsh_data) -> mr_tol) #define hypre_ParNSHDataMRMaxRowNnz(nsh_data) ((nsh_data) -> mr_max_row_nnz) #define hypre_ParNSHDataMRColVersion(nsh_data) ((nsh_data) -> mr_col_version) #define hypre_ParNSHDataNSHMaxIter(nsh_data) ((nsh_data) -> nsh_max_iter) #define hypre_ParNSHDataNSHTol(nsh_data) ((nsh_data) -> nsh_tol) #define hypre_ParNSHDataNSHMaxRowNnz(nsh_data) ((nsh_data) -> nsh_max_row_nnz) #endif /* #ifndef hypre_ParILU_DATA_HEADER */ hypre-2.33.0/src/parcsr_ls/par_ilu_setup.c000066400000000000000000010007271477326011500205410ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "_hypre_parcsr_ls.h" /*-------------------------------------------------------------------------- * hypre_ILUSetup *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ILUSetup( void *ilu_vdata, hypre_ParCSRMatrix *A, hypre_ParVector *f, hypre_ParVector *u ) { MPI_Comm comm = hypre_ParCSRMatrixComm(A); HYPRE_MemoryLocation memory_location = hypre_ParCSRMatrixMemoryLocation(A); hypre_ParILUData *ilu_data = (hypre_ParILUData*) ilu_vdata; hypre_ParILUData *schur_precond_ilu; hypre_ParNSHData *schur_solver_nsh; /* Pointers to ilu data */ HYPRE_Int logging = hypre_ParILUDataLogging(ilu_data); HYPRE_Int print_level = hypre_ParILUDataPrintLevel(ilu_data); HYPRE_Int ilu_type = hypre_ParILUDataIluType(ilu_data); HYPRE_Int nLU = hypre_ParILUDataNLU(ilu_data); HYPRE_Int nI = hypre_ParILUDataNI(ilu_data); HYPRE_Int fill_level = hypre_ParILUDataLfil(ilu_data); HYPRE_Int max_row_elmts = hypre_ParILUDataMaxRowNnz(ilu_data); HYPRE_Real *droptol = hypre_ParILUDataDroptol(ilu_data); HYPRE_Int *CF_marker_array = hypre_ParILUDataCFMarkerArray(ilu_data); HYPRE_Int *perm = hypre_ParILUDataPerm(ilu_data); HYPRE_Int *qperm = hypre_ParILUDataQPerm(ilu_data); HYPRE_Real tol_ddPQ = hypre_ParILUDataTolDDPQ(ilu_data); /* Pointers to device data, note that they are not NULL only when needed */ #if defined(HYPRE_USING_GPU) #if defined(HYPRE_USING_UNIFIED_MEMORY) HYPRE_Int test_opt = hypre_ParILUDataTestOption(ilu_data); #endif hypre_ParCSRMatrix *Aperm = hypre_ParILUDataAperm(ilu_data); hypre_ParCSRMatrix *R = hypre_ParILUDataR(ilu_data); hypre_ParCSRMatrix *P = hypre_ParILUDataP(ilu_data); hypre_CSRMatrix *matALU_d = hypre_ParILUDataMatAILUDevice(ilu_data); hypre_CSRMatrix *matBLU_d = hypre_ParILUDataMatBILUDevice(ilu_data); hypre_CSRMatrix *matSLU_d = hypre_ParILUDataMatSILUDevice(ilu_data); hypre_CSRMatrix *matE_d = hypre_ParILUDataMatEDevice(ilu_data); hypre_CSRMatrix *matF_d = hypre_ParILUDataMatFDevice(ilu_data); hypre_Vector *Ftemp_upper = NULL; hypre_Vector *Utemp_lower = NULL; hypre_Vector *Adiag_diag = NULL; hypre_Vector *Sdiag_diag = NULL; #endif hypre_ParCSRMatrix *matA = hypre_ParILUDataMatA(ilu_data); hypre_ParCSRMatrix *matL = hypre_ParILUDataMatL(ilu_data); HYPRE_Real *matD = hypre_ParILUDataMatD(ilu_data); hypre_ParCSRMatrix *matU = hypre_ParILUDataMatU(ilu_data); hypre_ParCSRMatrix *matmL = hypre_ParILUDataMatLModified(ilu_data); HYPRE_Real *matmD = hypre_ParILUDataMatDModified(ilu_data); hypre_ParCSRMatrix *matmU = hypre_ParILUDataMatUModified(ilu_data); hypre_ParCSRMatrix *matS = hypre_ParILUDataMatS(ilu_data); HYPRE_Int n = hypre_CSRMatrixNumRows(hypre_ParCSRMatrixDiag(A)); HYPRE_Int reordering_type = hypre_ParILUDataReorderingType(ilu_data); HYPRE_Real nnzS; /* Total nnz in S */ HYPRE_Real nnzS_offd_local; HYPRE_Real nnzS_offd; HYPRE_Int size_C /* Total size of coarse grid */; hypre_ParVector *Utemp = NULL; hypre_ParVector *Ftemp = NULL; hypre_ParVector *Xtemp = NULL; hypre_ParVector *Ytemp = NULL; hypre_ParVector *Ztemp = NULL; HYPRE_Real *uext = NULL; HYPRE_Real *fext = NULL; hypre_ParVector *rhs = NULL; hypre_ParVector *x = NULL; /* TODO (VPM): Change F_array and U_array variable names */ hypre_ParVector *F_array = hypre_ParILUDataF(ilu_data); hypre_ParVector *U_array = hypre_ParILUDataU(ilu_data); hypre_ParVector *residual = hypre_ParILUDataResidual(ilu_data); HYPRE_Real *rel_res_norms = hypre_ParILUDataRelResNorms(ilu_data); /* might need for Schur Complement */ HYPRE_Int *u_end = NULL; HYPRE_Solver schur_solver = NULL; HYPRE_Solver schur_precond = NULL; HYPRE_Solver schur_precond_gotten = NULL; /* Whether or not to use exact (direct) triangular solves */ HYPRE_Int tri_solve = hypre_ParILUDataTriSolve(ilu_data); /* help to build external */ hypre_ParCSRCommPkg *comm_pkg; HYPRE_Int buffer_size; HYPRE_Int num_sends; HYPRE_Int send_size; HYPRE_Int recv_size; HYPRE_Int num_procs, my_id; #if defined (HYPRE_USING_GPU) HYPRE_ExecutionPolicy exec = hypre_GetExecPolicy1(hypre_ParCSRMatrixMemoryLocation(A)); /* TODO (VPM): Placeholder check to avoid -Wunused-variable warning. Remove this! */ if (exec != HYPRE_EXEC_DEVICE && exec != HYPRE_EXEC_HOST) { hypre_error_w_msg(HYPRE_ERROR_GENERIC, "Need to run either on host or device!"); return hypre_error_flag; } #endif /* Sanity checks */ #if defined(HYPRE_USING_CUDA) && !defined(HYPRE_USING_CUSPARSE) { hypre_error_w_msg(HYPRE_ERROR_GENERIC, "ILU CUDA build requires cuSPARSE!"); return hypre_error_flag; } #elif defined(HYPRE_USING_HIP) && !defined(HYPRE_USING_ROCSPARSE) { hypre_error_w_msg(HYPRE_ERROR_GENERIC, "ILU HIP build requires rocSPARSE!"); return hypre_error_flag; } #elif defined(HYPRE_USING_SYCL) && !defined(HYPRE_USING_ONEMKLSPARSE) { hypre_error_w_msg(HYPRE_ERROR_GENERIC, "ILU SYCL build requires oneMKLSparse!"); return hypre_error_flag; } #endif /* ----- begin -----*/ HYPRE_ANNOTATE_FUNC_BEGIN; hypre_GpuProfilingPushRange("hypre_ILUSetup"); hypre_MPI_Comm_size(comm, &num_procs); hypre_MPI_Comm_rank(comm, &my_id); #if defined(HYPRE_USING_GPU) hypre_CSRMatrixDestroy(matALU_d); matALU_d = NULL; hypre_CSRMatrixDestroy(matSLU_d); matSLU_d = NULL; hypre_CSRMatrixDestroy(matBLU_d); matBLU_d = NULL; hypre_CSRMatrixDestroy(matE_d); matE_d = NULL; hypre_CSRMatrixDestroy(matF_d); matF_d = NULL; hypre_ParCSRMatrixDestroy(Aperm); Aperm = NULL; hypre_ParCSRMatrixDestroy(R); R = NULL; hypre_ParCSRMatrixDestroy(P); P = NULL; hypre_SeqVectorDestroy(hypre_ParILUDataFTempUpper(ilu_data)); hypre_SeqVectorDestroy(hypre_ParILUDataUTempLower(ilu_data)); hypre_ParVectorDestroy(hypre_ParILUDataXTemp(ilu_data)); hypre_ParVectorDestroy(hypre_ParILUDataYTemp(ilu_data)); hypre_ParVectorDestroy(hypre_ParILUDataZTemp(ilu_data)); hypre_SeqVectorDestroy(hypre_ParILUDataADiagDiag(ilu_data)); hypre_SeqVectorDestroy(hypre_ParILUDataSDiagDiag(ilu_data)); hypre_ParILUDataFTempUpper(ilu_data) = NULL; hypre_ParILUDataUTempLower(ilu_data) = NULL; hypre_ParILUDataXTemp(ilu_data) = NULL; hypre_ParILUDataYTemp(ilu_data) = NULL; hypre_ParILUDataZTemp(ilu_data) = NULL; hypre_ParILUDataADiagDiag(ilu_data) = NULL; hypre_ParILUDataSDiagDiag(ilu_data) = NULL; #endif /* Free previously allocated data, if any not destroyed */ hypre_ParCSRMatrixDestroy(matL); matL = NULL; hypre_ParCSRMatrixDestroy(matU); matU = NULL; hypre_ParCSRMatrixDestroy(matmL); matmL = NULL; hypre_ParCSRMatrixDestroy(matmU); matmU = NULL; hypre_ParCSRMatrixDestroy(matS); matS = NULL; hypre_TFree(matD, HYPRE_MEMORY_DEVICE); hypre_TFree(matmD, HYPRE_MEMORY_DEVICE); hypre_TFree(CF_marker_array, HYPRE_MEMORY_HOST); /* clear old l1_norm data, if created */ hypre_TFree(hypre_ParILUDataL1Norms(ilu_data), HYPRE_MEMORY_HOST); /* setup temporary storage * first check is they've already here */ hypre_ParVectorDestroy(hypre_ParILUDataUTemp(ilu_data)); hypre_ParVectorDestroy(hypre_ParILUDataFTemp(ilu_data)); hypre_ParVectorDestroy(hypre_ParILUDataRhs(ilu_data)); hypre_ParVectorDestroy(hypre_ParILUDataX(ilu_data)); hypre_ParVectorDestroy(hypre_ParILUDataResidual(ilu_data)); hypre_TFree(hypre_ParILUDataUExt(ilu_data), HYPRE_MEMORY_HOST); hypre_TFree(hypre_ParILUDataFExt(ilu_data), HYPRE_MEMORY_HOST); hypre_TFree(hypre_ParILUDataUEnd(ilu_data), HYPRE_MEMORY_HOST); hypre_TFree(hypre_ParILUDataRelResNorms(ilu_data), HYPRE_MEMORY_HOST); hypre_ParILUDataUTemp(ilu_data) = NULL; hypre_ParILUDataFTemp(ilu_data) = NULL; hypre_ParILUDataRhs(ilu_data) = NULL; hypre_ParILUDataX(ilu_data) = NULL; hypre_ParILUDataResidual(ilu_data) = NULL; if (hypre_ParILUDataSchurSolver(ilu_data)) { switch (ilu_type) { case 10: case 11: case 40: case 41: case 50: HYPRE_ParCSRGMRESDestroy(hypre_ParILUDataSchurSolver(ilu_data)); //GMRES for Schur break; case 20: case 21: hypre_NSHDestroy(hypre_ParILUDataSchurSolver(ilu_data)); //NSH for Schur break; default: break; } (hypre_ParILUDataSchurSolver(ilu_data)) = NULL; } /* ILU as precond for Schur */ if ( hypre_ParILUDataSchurPrecond(ilu_data) && #if defined(HYPRE_USING_GPU) hypre_ParILUDataIluType(ilu_data) != 10 && hypre_ParILUDataIluType(ilu_data) != 11 && #endif (hypre_ParILUDataIluType(ilu_data) == 10 || hypre_ParILUDataIluType(ilu_data) == 11 || hypre_ParILUDataIluType(ilu_data) == 40 || hypre_ParILUDataIluType(ilu_data) == 41) ) { HYPRE_ILUDestroy(hypre_ParILUDataSchurPrecond(ilu_data)); hypre_ParILUDataSchurPrecond(ilu_data) = NULL; } /* Create work vectors */ Utemp = hypre_ParVectorCreate(hypre_ParCSRMatrixComm(A), hypre_ParCSRMatrixGlobalNumRows(A), hypre_ParCSRMatrixRowStarts(A)); hypre_ParVectorInitialize(Utemp); hypre_ParILUDataUTemp(ilu_data) = Utemp; Ftemp = hypre_ParVectorCreate(hypre_ParCSRMatrixComm(A), hypre_ParCSRMatrixGlobalNumRows(A), hypre_ParCSRMatrixRowStarts(A)); hypre_ParVectorInitialize(Ftemp); hypre_ParILUDataFTemp(ilu_data) = Ftemp; /* set matrix, solution and rhs pointers */ matA = A; F_array = f; U_array = u; /* Create perm array if necessary */ if (!perm) { switch (ilu_type) { case 10: case 11: case 20: case 21: case 30: case 31: case 50: /* symmetric */ hypre_ILUGetInteriorExteriorPerm(matA, memory_location, &perm, &nLU, reordering_type); break; case 40: case 41: /* ddPQ */ hypre_ILUGetPermddPQ(matA, &perm, &qperm, tol_ddPQ, &nLU, &nI, reordering_type); break; case 0: case 1: default: /* RCM or none */ hypre_ILUGetLocalPerm(matA, &perm, &nLU, reordering_type); break; } } /* Factorization */ switch (ilu_type) { case 0: /* BJ + hypre_iluk() */ #if defined(HYPRE_USING_GPU) if (exec == HYPRE_EXEC_DEVICE) { hypre_ILUSetupDevice(ilu_data, matA, perm, perm, n, n, &matBLU_d, &matS, &matE_d, &matF_d); } else #endif { hypre_ILUSetupILUK(matA, fill_level, perm, perm, n, n, &matL, &matD, &matU, &matS, &u_end); } break; case 1: /* BJ + hypre_ilut() */ #if defined(HYPRE_USING_GPU) if (exec == HYPRE_EXEC_DEVICE) { hypre_ILUSetupDevice(ilu_data, matA, perm, perm, n, n, &matBLU_d, &matS, &matE_d, &matF_d); } else #endif { hypre_ILUSetupILUT(matA, max_row_elmts, droptol, perm, perm, n, n, &matL, &matD, &matU, &matS, &u_end); } break; case 10: /* GMRES + hypre_iluk() */ #if defined(HYPRE_USING_GPU) if (exec == HYPRE_EXEC_DEVICE) { hypre_ILUSetupDevice(ilu_data, matA, perm, perm, n, nLU, &matBLU_d, &matS, &matE_d, &matF_d); } else #endif { hypre_ILUSetupILUK(matA, fill_level, perm, perm, nLU, nLU, &matL, &matD, &matU, &matS, &u_end); } break; case 11: /* GMRES + hypre_ilut() */ #if defined(HYPRE_USING_GPU) if (exec == HYPRE_EXEC_DEVICE) { hypre_ILUSetupDevice(ilu_data, matA, perm, perm, n, nLU, &matBLU_d, &matS, &matE_d, &matF_d); } else #endif { hypre_ILUSetupILUT(matA, max_row_elmts, droptol, perm, perm, nLU, nLU, &matL, &matD, &matU, &matS, &u_end); } break; case 20: /* Newton Schulz Hotelling + hypre_iluk() */ #if defined(HYPRE_USING_GPU) && !defined(HYPRE_USING_UNIFIED_MEMORY) if (exec == HYPRE_EXEC_DEVICE) { hypre_error_w_msg(HYPRE_ERROR_GENERIC, "NSH+ILUK setup on device runs requires unified memory!"); return hypre_error_flag; } #endif hypre_ILUSetupILUK(matA, fill_level, perm, perm, nLU, nLU, &matL, &matD, &matU, &matS, &u_end); break; case 21: /* Newton Schulz Hotelling + hypre_ilut() */ #if defined(HYPRE_USING_GPU) && !defined(HYPRE_USING_UNIFIED_MEMORY) if (exec == HYPRE_EXEC_DEVICE) { hypre_error_w_msg(HYPRE_ERROR_GENERIC, "NSH+ILUT setup on device runs requires unified memory!"); return hypre_error_flag; } #endif hypre_ILUSetupILUT(matA, max_row_elmts, droptol, perm, perm, nLU, nLU, &matL, &matD, &matU, &matS, &u_end); break; case 30: /* RAS + hypre_iluk() */ #if defined(HYPRE_USING_GPU) && !defined(HYPRE_USING_UNIFIED_MEMORY) if (exec == HYPRE_EXEC_DEVICE) { hypre_error_w_msg(HYPRE_ERROR_GENERIC, "RAS+ILUK setup on device runs requires unified memory!"); return hypre_error_flag; } #endif hypre_ILUSetupILUKRAS(matA, fill_level, perm, nLU, &matL, &matD, &matU); break; case 31: /* RAS + hypre_ilut() */ #if defined(HYPRE_USING_GPU) && !defined(HYPRE_USING_UNIFIED_MEMORY) if (exec == HYPRE_EXEC_DEVICE) { hypre_error_w_msg(HYPRE_ERROR_GENERIC, "RAS+ILUT setup on device runs requires unified memory!"); return hypre_error_flag; } #endif hypre_ILUSetupILUTRAS(matA, max_row_elmts, droptol, perm, nLU, &matL, &matD, &matU); break; case 40: /* ddPQ + GMRES + hypre_iluk() */ #if defined(HYPRE_USING_GPU) && !defined(HYPRE_USING_UNIFIED_MEMORY) if (exec == HYPRE_EXEC_DEVICE) { hypre_error_w_msg(HYPRE_ERROR_GENERIC, "ddPQ+GMRES+ILUK setup on device runs requires unified memory!"); return hypre_error_flag; } #endif hypre_ILUSetupILUK(matA, fill_level, perm, qperm, nLU, nI, &matL, &matD, &matU, &matS, &u_end); break; case 41: /* ddPQ + GMRES + hypre_ilut() */ #if defined(HYPRE_USING_GPU) && !defined(HYPRE_USING_UNIFIED_MEMORY) if (exec == HYPRE_EXEC_DEVICE) { hypre_error_w_msg(HYPRE_ERROR_GENERIC, "ddPQ+GMRES+ILUT setup on device runs requires unified memory!"); return hypre_error_flag; } #endif hypre_ILUSetupILUT(matA, max_row_elmts, droptol, perm, qperm, nLU, nI, &matL, &matD, &matU, &matS, &u_end); break; case 50: /* RAP + hypre_modified_ilu0 */ #if defined(HYPRE_USING_GPU) if (exec == HYPRE_EXEC_DEVICE) { #if !defined(HYPRE_USING_UNIFIED_MEMORY) hypre_error_w_msg(HYPRE_ERROR_GENERIC, "GMRES+ILU0-RAP setup on device runs requires unified memory!"); return hypre_error_flag; #else hypre_ILUSetupRAPILU0Device(matA, perm, n, nLU, &Aperm, &matS, &matALU_d, &matBLU_d, &matSLU_d, &matE_d, &matF_d, test_opt); #endif } else #endif { hypre_ILUSetupRAPILU0(matA, perm, n, nLU, &matL, &matD, &matU, &matmL, &matmD, &matmU, &u_end); } break; default: /* BJ + device_ilu0() */ #if defined(HYPRE_USING_GPU) if (exec == HYPRE_EXEC_DEVICE) { hypre_ILUSetupDevice(ilu_data, matA, perm, perm, n, n, &matBLU_d, &matS, &matE_d, &matF_d); } else #endif { hypre_ILUSetupILU0(matA, perm, perm, n, n, &matL, &matD, &matU, &matS, &u_end); } break; } /* Create additional temporary vector for iterative triangular solve */ if (!tri_solve) { Ztemp = hypre_ParVectorCreate(hypre_ParCSRMatrixComm(A), hypre_ParCSRMatrixGlobalNumRows(A), hypre_ParCSRMatrixRowStarts(A)); hypre_ParVectorInitialize(Ztemp); } /* setup Schur solver - TODO (VPM): merge host and device paths below */ switch (ilu_type) { case 0: case 1: default: break; case 10: case 11: if (matS) { /* Create work vectors */ #if defined(HYPRE_USING_GPU) if (exec == HYPRE_EXEC_DEVICE) { Xtemp = hypre_ParVectorCreate(hypre_ParCSRMatrixComm(matS), hypre_ParCSRMatrixGlobalNumRows(matS), hypre_ParCSRMatrixRowStarts(matS)); hypre_ParVectorInitialize(Xtemp); Ytemp = hypre_ParVectorCreate(hypre_ParCSRMatrixComm(matS), hypre_ParCSRMatrixGlobalNumRows(matS), hypre_ParCSRMatrixRowStarts(matS)); hypre_ParVectorInitialize(Ytemp); Ftemp_upper = hypre_SeqVectorCreate(nLU); hypre_VectorOwnsData(Ftemp_upper) = 0; hypre_VectorData(Ftemp_upper) = hypre_VectorData( hypre_ParVectorLocalVector(Ftemp)); hypre_SeqVectorInitialize(Ftemp_upper); Utemp_lower = hypre_SeqVectorCreate(n - nLU); hypre_VectorOwnsData(Utemp_lower) = 0; hypre_VectorData(Utemp_lower) = hypre_VectorData( hypre_ParVectorLocalVector(Utemp)) + nLU; hypre_SeqVectorInitialize(Utemp_lower); /* create GMRES */ // HYPRE_ParCSRGMRESCreate(comm, &schur_solver); hypre_GMRESFunctions * gmres_functions; gmres_functions = hypre_GMRESFunctionsCreate( hypre_ParKrylovCAlloc, hypre_ParKrylovFree, hypre_ParILUSchurGMRESCommInfoDevice, //parCSR A -> ilu_data hypre_ParKrylovCreateVector, hypre_ParKrylovCreateVectorArray, hypre_ParKrylovDestroyVector, hypre_ParKrylovMatvecCreate, //parCSR A -- inactive ((tri_solve == 1) ? hypre_ParILUSchurGMRESMatvecDevice : hypre_ParILUSchurGMRESMatvecJacIterDevice), //parCSR A -> ilu_data hypre_ParKrylovMatvecDestroy, //parCSR A -- inactive hypre_ParKrylovInnerProd, hypre_ParKrylovCopyVector, hypre_ParKrylovClearVector, hypre_ParKrylovScaleVector, hypre_ParKrylovAxpy, hypre_ParKrylovIdentitySetup, //parCSR A -- inactive hypre_ParKrylovIdentity ); //parCSR A -- inactive schur_solver = ( (HYPRE_Solver) hypre_GMRESCreate( gmres_functions ) ); /* setup GMRES parameters */ HYPRE_GMRESSetKDim (schur_solver, hypre_ParILUDataSchurGMRESKDim(ilu_data)); HYPRE_GMRESSetMaxIter (schur_solver, hypre_ParILUDataSchurGMRESMaxIter(ilu_data));/* we don't need that many solves */ HYPRE_GMRESSetTol (schur_solver, hypre_ParILUDataSchurGMRESTol(ilu_data)); HYPRE_GMRESSetAbsoluteTol (schur_solver, hypre_ParILUDataSchurGMRESAbsoluteTol(ilu_data)); HYPRE_GMRESSetLogging (schur_solver, hypre_ParILUDataSchurSolverLogging(ilu_data)); HYPRE_GMRESSetPrintLevel (schur_solver, hypre_ParILUDataSchurSolverPrintLevel(ilu_data));/* set to zero now, don't print */ HYPRE_GMRESSetRelChange (schur_solver, hypre_ParILUDataSchurGMRESRelChange(ilu_data)); /* setup preconditioner parameters */ /* create Unit precond */ schur_precond = (HYPRE_Solver) ilu_vdata; /* add preconditioner to solver */ HYPRE_GMRESSetPrecond(schur_solver, (HYPRE_PtrToSolverFcn) hypre_ParILUSchurGMRESDummySolveDevice, (HYPRE_PtrToSolverFcn) hypre_ParKrylovIdentitySetup, schur_precond); HYPRE_GMRESGetPrecond(schur_solver, &schur_precond_gotten); if (schur_precond_gotten != (schur_precond)) { hypre_error_w_msg(HYPRE_ERROR_GENERIC, "Schur complement got bad precond!"); hypre_GpuProfilingPopRange(); HYPRE_ANNOTATE_FUNC_END; return hypre_error_flag; } /* need to create working vector rhs and x for Schur System */ rhs = hypre_ParVectorCreate(comm, hypre_ParCSRMatrixGlobalNumRows(matS), hypre_ParCSRMatrixRowStarts(matS)); hypre_ParVectorInitialize(rhs); x = hypre_ParVectorCreate(comm, hypre_ParCSRMatrixGlobalNumRows(matS), hypre_ParCSRMatrixRowStarts(matS)); hypre_ParVectorInitialize(x); /* setup solver */ HYPRE_GMRESSetup(schur_solver, (HYPRE_Matrix) ilu_vdata, (HYPRE_Vector) rhs, (HYPRE_Vector) x); /* solve for right-hand-side consists of only 1 */ hypre_Vector *rhs_local = hypre_ParVectorLocalVector(rhs); //HYPRE_Real *Xtemp_data = hypre_VectorData(Xtemp_local); hypre_SeqVectorSetConstantValues(rhs_local, 1.0); /* update ilu_data */ hypre_ParILUDataSchurSolver (ilu_data) = schur_solver; hypre_ParILUDataSchurPrecond (ilu_data) = schur_precond; hypre_ParILUDataRhs (ilu_data) = rhs; hypre_ParILUDataX (ilu_data) = x; } else #endif { /* setup GMRES parameters */ HYPRE_ParCSRGMRESCreate(comm, &schur_solver); HYPRE_GMRESSetKDim (schur_solver, hypre_ParILUDataSchurGMRESKDim(ilu_data)); HYPRE_GMRESSetMaxIter (schur_solver, hypre_ParILUDataSchurGMRESMaxIter(ilu_data));/* we don't need that many solves */ HYPRE_GMRESSetTol (schur_solver, hypre_ParILUDataSchurGMRESTol(ilu_data)); HYPRE_GMRESSetAbsoluteTol (schur_solver, hypre_ParILUDataSchurGMRESAbsoluteTol(ilu_data)); HYPRE_GMRESSetLogging (schur_solver, hypre_ParILUDataSchurSolverLogging(ilu_data)); HYPRE_GMRESSetPrintLevel (schur_solver, hypre_ParILUDataSchurSolverPrintLevel(ilu_data));/* set to zero now, don't print */ HYPRE_GMRESSetRelChange (schur_solver, hypre_ParILUDataSchurGMRESRelChange(ilu_data)); /* setup preconditioner parameters */ /* create precond, the default is ILU0 */ HYPRE_ILUCreate (&schur_precond); HYPRE_ILUSetType (schur_precond, hypre_ParILUDataSchurPrecondIluType(ilu_data)); HYPRE_ILUSetLevelOfFill (schur_precond, hypre_ParILUDataSchurPrecondIluLfil(ilu_data)); HYPRE_ILUSetMaxNnzPerRow (schur_precond, hypre_ParILUDataSchurPrecondIluMaxRowNnz(ilu_data)); HYPRE_ILUSetDropThresholdArray(schur_precond, hypre_ParILUDataSchurPrecondIluDroptol(ilu_data)); HYPRE_ILUSetPrintLevel (schur_precond, hypre_ParILUDataSchurPrecondPrintLevel(ilu_data)); HYPRE_ILUSetTriSolve (schur_precond, hypre_ParILUDataSchurPrecondTriSolve(ilu_data)); HYPRE_ILUSetMaxIter (schur_precond, hypre_ParILUDataSchurPrecondMaxIter(ilu_data)); HYPRE_ILUSetLowerJacobiIters (schur_precond, hypre_ParILUDataSchurPrecondLowerJacobiIters(ilu_data)); HYPRE_ILUSetUpperJacobiIters (schur_precond, hypre_ParILUDataSchurPrecondUpperJacobiIters(ilu_data)); HYPRE_ILUSetTol (schur_precond, hypre_ParILUDataSchurPrecondTol(ilu_data)); /* add preconditioner to solver */ HYPRE_GMRESSetPrecond(schur_solver, (HYPRE_PtrToSolverFcn) HYPRE_ILUSolve, (HYPRE_PtrToSolverFcn) HYPRE_ILUSetup, schur_precond); HYPRE_GMRESGetPrecond(schur_solver, &schur_precond_gotten); if (schur_precond_gotten != (schur_precond)) { hypre_error_w_msg(HYPRE_ERROR_GENERIC, "Schur complement got bad precond!"); hypre_GpuProfilingPopRange(); HYPRE_ANNOTATE_FUNC_END; return hypre_error_flag; } /* need to create working vector rhs and x for Schur System */ rhs = hypre_ParVectorCreate(comm, hypre_ParCSRMatrixGlobalNumRows(matS), hypre_ParCSRMatrixRowStarts(matS)); hypre_ParVectorInitialize(rhs); x = hypre_ParVectorCreate(comm, hypre_ParCSRMatrixGlobalNumRows(matS), hypre_ParCSRMatrixRowStarts(matS)); hypre_ParVectorInitialize(x); /* setup solver */ HYPRE_GMRESSetup(schur_solver, (HYPRE_Matrix) matS, (HYPRE_Vector) rhs, (HYPRE_Vector) x); /* update ilu_data */ hypre_ParILUDataSchurSolver (ilu_data) = schur_solver; hypre_ParILUDataSchurPrecond (ilu_data) = schur_precond; hypre_ParILUDataRhs (ilu_data) = rhs; hypre_ParILUDataX (ilu_data) = x; } } break; case 20: case 21: if (matS) { /* approximate inverse preconditioner */ schur_solver = (HYPRE_Solver)hypre_NSHCreate(); /* set NSH parameters */ hypre_NSHSetMaxIter (schur_solver, hypre_ParILUDataSchurNSHSolveMaxIter(ilu_data)); hypre_NSHSetTol (schur_solver, hypre_ParILUDataSchurNSHSolveTol(ilu_data)); hypre_NSHSetLogging (schur_solver, hypre_ParILUDataSchurSolverLogging(ilu_data)); hypre_NSHSetPrintLevel (schur_solver, hypre_ParILUDataSchurSolverPrintLevel(ilu_data)); hypre_NSHSetDropThresholdArray(schur_solver, hypre_ParILUDataSchurNSHDroptol(ilu_data)); hypre_NSHSetNSHMaxIter (schur_solver, hypre_ParILUDataSchurNSHMaxNumIter(ilu_data)); hypre_NSHSetNSHMaxRowNnz (schur_solver, hypre_ParILUDataSchurNSHMaxRowNnz(ilu_data)); hypre_NSHSetNSHTol (schur_solver, hypre_ParILUDataSchurNSHTol(ilu_data)); hypre_NSHSetMRMaxIter (schur_solver, hypre_ParILUDataSchurMRMaxIter(ilu_data)); hypre_NSHSetMRMaxRowNnz (schur_solver, hypre_ParILUDataSchurMRMaxRowNnz(ilu_data)); hypre_NSHSetMRTol (schur_solver, hypre_ParILUDataSchurMRTol(ilu_data)); hypre_NSHSetColVersion (schur_solver, hypre_ParILUDataSchurMRColVersion(ilu_data)); /* need to create working vector rhs and x for Schur System */ rhs = hypre_ParVectorCreate(comm, hypre_ParCSRMatrixGlobalNumRows(matS), hypre_ParCSRMatrixRowStarts(matS)); hypre_ParVectorInitialize(rhs); x = hypre_ParVectorCreate(comm, hypre_ParCSRMatrixGlobalNumRows(matS), hypre_ParCSRMatrixRowStarts(matS)); hypre_ParVectorInitialize(x); /* setup solver */ hypre_NSHSetup(schur_solver, matS, rhs, x); hypre_ParILUDataSchurSolver(ilu_data) = schur_solver; hypre_ParILUDataRhs (ilu_data) = rhs; hypre_ParILUDataX (ilu_data) = x; } break; case 30 : case 31: /* now check communication package */ comm_pkg = hypre_ParCSRMatrixCommPkg(matA); /* create if not yet built */ if (!comm_pkg) { hypre_MatvecCommPkgCreate(matA); comm_pkg = hypre_ParCSRMatrixCommPkg(matA); } /* create uext and fext */ num_sends = hypre_ParCSRCommPkgNumSends(comm_pkg); send_size = hypre_ParCSRCommPkgSendMapStart(comm_pkg, num_sends) - hypre_ParCSRCommPkgSendMapStart(comm_pkg, 0); recv_size = hypre_CSRMatrixNumCols(hypre_ParCSRMatrixOffd(matA)); buffer_size = send_size > recv_size ? send_size : recv_size; /* TODO (VPM): Check these memory locations */ fext = hypre_TAlloc(HYPRE_Real, buffer_size, HYPRE_MEMORY_HOST); uext = hypre_TAlloc(HYPRE_Real, buffer_size, HYPRE_MEMORY_HOST); break; case 40: case 41: if (matS) { /* setup GMRES parameters */ HYPRE_ParCSRGMRESCreate(comm, &schur_solver); HYPRE_GMRESSetKDim (schur_solver, hypre_ParILUDataSchurGMRESKDim(ilu_data)); HYPRE_GMRESSetMaxIter (schur_solver, hypre_ParILUDataSchurGMRESMaxIter(ilu_data));/* we don't need that many solves */ HYPRE_GMRESSetTol (schur_solver, hypre_ParILUDataSchurGMRESTol(ilu_data)); HYPRE_GMRESSetAbsoluteTol (schur_solver, hypre_ParILUDataSchurGMRESAbsoluteTol(ilu_data)); HYPRE_GMRESSetLogging (schur_solver, hypre_ParILUDataSchurSolverLogging(ilu_data)); HYPRE_GMRESSetPrintLevel (schur_solver, hypre_ParILUDataSchurSolverPrintLevel(ilu_data));/* set to zero now, don't print */ HYPRE_GMRESSetRelChange (schur_solver, hypre_ParILUDataSchurGMRESRelChange(ilu_data)); /* setup preconditioner parameters */ /* create precond, the default is ILU0 */ HYPRE_ILUCreate (&schur_precond); HYPRE_ILUSetType (schur_precond, hypre_ParILUDataSchurPrecondIluType(ilu_data)); HYPRE_ILUSetLevelOfFill (schur_precond, hypre_ParILUDataSchurPrecondIluLfil(ilu_data)); HYPRE_ILUSetMaxNnzPerRow (schur_precond, hypre_ParILUDataSchurPrecondIluMaxRowNnz(ilu_data)); HYPRE_ILUSetDropThresholdArray(schur_precond, hypre_ParILUDataSchurPrecondIluDroptol(ilu_data)); HYPRE_ILUSetPrintLevel (schur_precond, hypre_ParILUDataSchurPrecondPrintLevel(ilu_data)); HYPRE_ILUSetMaxIter (schur_precond, hypre_ParILUDataSchurPrecondMaxIter(ilu_data)); HYPRE_ILUSetTriSolve (schur_precond, hypre_ParILUDataSchurPrecondTriSolve(ilu_data)); HYPRE_ILUSetLowerJacobiIters (schur_precond, hypre_ParILUDataSchurPrecondLowerJacobiIters(ilu_data)); HYPRE_ILUSetUpperJacobiIters (schur_precond, hypre_ParILUDataSchurPrecondUpperJacobiIters(ilu_data)); HYPRE_ILUSetTol (schur_precond, hypre_ParILUDataSchurPrecondTol(ilu_data)); /* add preconditioner to solver */ HYPRE_GMRESSetPrecond(schur_solver, (HYPRE_PtrToSolverFcn) HYPRE_ILUSolve, (HYPRE_PtrToSolverFcn) HYPRE_ILUSetup, schur_precond); HYPRE_GMRESGetPrecond(schur_solver, &schur_precond_gotten); if (schur_precond_gotten != (schur_precond)) { hypre_error_w_msg(HYPRE_ERROR_GENERIC, "Schur complement got bad precond!"); hypre_GpuProfilingPopRange(); HYPRE_ANNOTATE_FUNC_END; return hypre_error_flag; } /* need to create working vector rhs and x for Schur System */ rhs = hypre_ParVectorCreate(comm, hypre_ParCSRMatrixGlobalNumRows(matS), hypre_ParCSRMatrixRowStarts(matS)); hypre_ParVectorInitialize(rhs); x = hypre_ParVectorCreate(comm, hypre_ParCSRMatrixGlobalNumRows(matS), hypre_ParCSRMatrixRowStarts(matS)); hypre_ParVectorInitialize(x); /* setup solver */ HYPRE_GMRESSetup(schur_solver, (HYPRE_Matrix) matS, (HYPRE_Vector) rhs, (HYPRE_Vector) x); /* update ilu_data */ hypre_ParILUDataSchurSolver (ilu_data) = schur_solver; hypre_ParILUDataSchurPrecond (ilu_data) = schur_precond; hypre_ParILUDataRhs (ilu_data) = rhs; hypre_ParILUDataX (ilu_data) = x; } break; case 50: #if defined(HYPRE_USING_GPU) if (matS && exec == HYPRE_EXEC_DEVICE) { Xtemp = hypre_ParVectorCreate(hypre_ParCSRMatrixComm(matA), hypre_ParCSRMatrixGlobalNumRows(matA), hypre_ParCSRMatrixRowStarts(matA)); hypre_ParVectorInitialize(Xtemp); Ytemp = hypre_ParVectorCreate(hypre_ParCSRMatrixComm(matA), hypre_ParCSRMatrixGlobalNumRows(matA), hypre_ParCSRMatrixRowStarts(matA)); hypre_ParVectorInitialize(Ytemp); Ftemp_upper = hypre_SeqVectorCreate(nLU); hypre_VectorOwnsData(Ftemp_upper) = 0; hypre_VectorData(Ftemp_upper) = hypre_VectorData(hypre_ParVectorLocalVector(Ftemp)); hypre_SeqVectorInitialize(Ftemp_upper); Utemp_lower = hypre_SeqVectorCreate(n - nLU); hypre_VectorOwnsData(Utemp_lower) = 0; hypre_VectorData(Utemp_lower) = nLU + hypre_VectorData(hypre_ParVectorLocalVector(Utemp)); hypre_SeqVectorInitialize(Utemp_lower); /* create GMRES */ // HYPRE_ParCSRGMRESCreate(comm, &schur_solver); hypre_GMRESFunctions * gmres_functions; gmres_functions = hypre_GMRESFunctionsCreate( hypre_ParKrylovCAlloc, hypre_ParKrylovFree, hypre_ParILUSchurGMRESCommInfoDevice, //parCSR A -> ilu_data hypre_ParKrylovCreateVector, hypre_ParKrylovCreateVectorArray, hypre_ParKrylovDestroyVector, hypre_ParKrylovMatvecCreate, //parCSR A -- inactive hypre_ParILURAPSchurGMRESMatvecDevice, //parCSR A -> ilu_data hypre_ParKrylovMatvecDestroy, //parCSR A -- inactive hypre_ParKrylovInnerProd, hypre_ParKrylovCopyVector, hypre_ParKrylovClearVector, hypre_ParKrylovScaleVector, hypre_ParKrylovAxpy, hypre_ParKrylovIdentitySetup, //parCSR A -- inactive hypre_ParKrylovIdentity ); //parCSR A -- inactive schur_solver = (HYPRE_Solver) hypre_GMRESCreate(gmres_functions); /* setup GMRES parameters */ /* at least should apply 1 solve */ if (hypre_ParILUDataSchurGMRESKDim(ilu_data) == 0) { hypre_ParILUDataSchurGMRESKDim(ilu_data)++; } HYPRE_GMRESSetKDim (schur_solver, hypre_ParILUDataSchurGMRESKDim(ilu_data)); HYPRE_GMRESSetMaxIter (schur_solver, hypre_ParILUDataSchurGMRESMaxIter(ilu_data));/* we don't need that many solves */ HYPRE_GMRESSetTol (schur_solver, hypre_ParILUDataSchurGMRESTol(ilu_data)); HYPRE_GMRESSetAbsoluteTol (schur_solver, hypre_ParILUDataSchurGMRESAbsoluteTol(ilu_data)); HYPRE_GMRESSetLogging (schur_solver, hypre_ParILUDataSchurSolverLogging(ilu_data)); HYPRE_GMRESSetPrintLevel (schur_solver, hypre_ParILUDataSchurSolverPrintLevel(ilu_data));/* set to zero now, don't print */ HYPRE_GMRESSetRelChange (schur_solver, hypre_ParILUDataSchurGMRESRelChange(ilu_data)); /* setup preconditioner parameters */ /* create Schur precond */ schur_precond = (HYPRE_Solver) ilu_vdata; /* add preconditioner to solver */ HYPRE_GMRESSetPrecond(schur_solver, (HYPRE_PtrToSolverFcn) hypre_ParILURAPSchurGMRESSolveDevice, (HYPRE_PtrToSolverFcn) hypre_ParKrylovIdentitySetup, schur_precond); HYPRE_GMRESGetPrecond(schur_solver, &schur_precond_gotten); if (schur_precond_gotten != (schur_precond)) { hypre_error_w_msg(HYPRE_ERROR_GENERIC, "Schur complement got bad precond!"); hypre_GpuProfilingPopRange(); HYPRE_ANNOTATE_FUNC_END; return hypre_error_flag; } /* need to create working vector rhs and x for Schur System */ rhs = hypre_ParVectorCreate(comm, hypre_ParCSRMatrixGlobalNumRows(matS), hypre_ParCSRMatrixRowStarts(matS)); hypre_ParVectorInitialize(rhs); x = hypre_ParVectorCreate(comm, hypre_ParCSRMatrixGlobalNumRows(matS), hypre_ParCSRMatrixRowStarts(matS)); hypre_ParVectorInitialize(x); /* setup solver */ HYPRE_GMRESSetup(schur_solver, (HYPRE_Matrix) ilu_vdata, (HYPRE_Vector) rhs, (HYPRE_Vector) x); /* solve for right-hand-side consists of only 1 */ //hypre_Vector *rhs_local = hypre_ParVectorLocalVector(rhs); //HYPRE_Real *Xtemp_data = hypre_VectorData(Xtemp_local); //hypre_SeqVectorSetConstantValues(rhs_local, 1.0); /* Update ilu_data */ hypre_ParILUDataSchurSolver(ilu_data) = schur_solver; hypre_ParILUDataSchurPrecond(ilu_data) = schur_precond; hypre_ParILUDataRhs(ilu_data) = rhs; hypre_ParILUDataX(ilu_data) = x; } else #endif { /* Need to create working vector rhs and x for Schur System */ HYPRE_Int m = n - nLU; HYPRE_BigInt global_start, S_total_rows, S_row_starts[2]; HYPRE_BigInt big_m = (HYPRE_BigInt) m; hypre_MPI_Allreduce(&big_m, &S_total_rows, 1, HYPRE_MPI_BIG_INT, hypre_MPI_SUM, comm); if (S_total_rows > 0) { Xtemp = hypre_ParVectorCreate(hypre_ParCSRMatrixComm(matA), hypre_ParCSRMatrixGlobalNumRows(matA), hypre_ParCSRMatrixRowStarts(matA)); hypre_ParVectorInitialize(Xtemp); Ytemp = hypre_ParVectorCreate(hypre_ParCSRMatrixComm(matA), hypre_ParCSRMatrixGlobalNumRows(matA), hypre_ParCSRMatrixRowStarts(matA)); hypre_ParVectorInitialize(Ytemp); hypre_MPI_Scan(&big_m, &global_start, 1, HYPRE_MPI_BIG_INT, hypre_MPI_SUM, comm); S_row_starts[0] = global_start - big_m; S_row_starts[1] = global_start; rhs = hypre_ParVectorCreate(comm, S_total_rows, S_row_starts); hypre_ParVectorInitialize(rhs); x = hypre_ParVectorCreate(comm, S_total_rows, S_row_starts); hypre_ParVectorInitialize(x); /* create GMRES */ // HYPRE_ParCSRGMRESCreate(comm, &schur_solver); hypre_GMRESFunctions * gmres_functions; gmres_functions = hypre_GMRESFunctionsCreate( hypre_ParKrylovCAlloc, hypre_ParKrylovFree, hypre_ParILURAPSchurGMRESCommInfoHost, //parCSR A -> ilu_data hypre_ParKrylovCreateVector, hypre_ParKrylovCreateVectorArray, hypre_ParKrylovDestroyVector, hypre_ParKrylovMatvecCreate, //parCSR A -- inactive hypre_ParILURAPSchurGMRESMatvecHost, //parCSR A -> ilu_data hypre_ParKrylovMatvecDestroy, //parCSR A -- inactive hypre_ParKrylovInnerProd, hypre_ParKrylovCopyVector, hypre_ParKrylovClearVector, hypre_ParKrylovScaleVector, hypre_ParKrylovAxpy, hypre_ParKrylovIdentitySetup, //parCSR A -- inactive hypre_ParKrylovIdentity ); //parCSR A -- inactive schur_solver = (HYPRE_Solver) hypre_GMRESCreate(gmres_functions); /* setup GMRES parameters */ /* at least should apply 1 solve */ if (hypre_ParILUDataSchurGMRESKDim(ilu_data) == 0) { hypre_ParILUDataSchurGMRESKDim(ilu_data)++; } HYPRE_GMRESSetKDim (schur_solver, hypre_ParILUDataSchurGMRESKDim(ilu_data)); HYPRE_GMRESSetMaxIter (schur_solver, hypre_ParILUDataSchurGMRESMaxIter(ilu_data));/* we don't need that many solves */ HYPRE_GMRESSetTol (schur_solver, hypre_ParILUDataSchurGMRESTol(ilu_data)); HYPRE_GMRESSetAbsoluteTol (schur_solver, hypre_ParILUDataSchurGMRESAbsoluteTol(ilu_data)); HYPRE_GMRESSetLogging (schur_solver, hypre_ParILUDataSchurSolverLogging(ilu_data)); HYPRE_GMRESSetPrintLevel (schur_solver, hypre_ParILUDataSchurSolverPrintLevel(ilu_data));/* set to zero now, don't print */ HYPRE_GMRESSetRelChange (schur_solver, hypre_ParILUDataSchurGMRESRelChange(ilu_data)); /* setup preconditioner parameters */ /* create Schur precond */ schur_precond = (HYPRE_Solver) ilu_vdata; /* add preconditioner to solver */ HYPRE_GMRESSetPrecond(schur_solver, (HYPRE_PtrToSolverFcn) hypre_ParILURAPSchurGMRESSolveHost, (HYPRE_PtrToSolverFcn) hypre_ParKrylovIdentitySetup, schur_precond); HYPRE_GMRESGetPrecond(schur_solver, &schur_precond_gotten); if (schur_precond_gotten != (schur_precond)) { hypre_error_w_msg(HYPRE_ERROR_GENERIC, "Schur complement got bad precond!"); hypre_GpuProfilingPopRange(); HYPRE_ANNOTATE_FUNC_END; return hypre_error_flag; } /* setup solver */ HYPRE_GMRESSetup(schur_solver, (HYPRE_Matrix) ilu_vdata, (HYPRE_Vector) rhs, (HYPRE_Vector) x); /* solve for right-hand-side consists of only 1 */ //hypre_Vector *rhs_local = hypre_ParVectorLocalVector(rhs); //HYPRE_Real *Xtemp_data = hypre_VectorData(Xtemp_local); //hypre_SeqVectorSetConstantValues(rhs_local, 1.0); } /* if (S_total_rows > 0) */ /* Update ilu_data */ hypre_ParILUDataSchurSolver(ilu_data) = schur_solver; hypre_ParILUDataSchurPrecond(ilu_data) = schur_precond; hypre_ParILUDataRhs(ilu_data) = rhs; hypre_ParILUDataX(ilu_data) = x; } break; } /* set pointers to ilu data */ /* set device data pointers */ #if defined(HYPRE_USING_GPU) hypre_ParILUDataMatAILUDevice(ilu_data) = matALU_d; hypre_ParILUDataMatBILUDevice(ilu_data) = matBLU_d; hypre_ParILUDataMatSILUDevice(ilu_data) = matSLU_d; hypre_ParILUDataMatEDevice(ilu_data) = matE_d; hypre_ParILUDataMatFDevice(ilu_data) = matF_d; hypre_ParILUDataAperm(ilu_data) = Aperm; hypre_ParILUDataR(ilu_data) = R; hypre_ParILUDataP(ilu_data) = P; hypre_ParILUDataFTempUpper(ilu_data) = Ftemp_upper; hypre_ParILUDataUTempLower(ilu_data) = Utemp_lower; hypre_ParILUDataADiagDiag(ilu_data) = Adiag_diag; hypre_ParILUDataSDiagDiag(ilu_data) = Sdiag_diag; #endif /* Set pointers to ilu data */ hypre_ParILUDataMatA(ilu_data) = matA; hypre_ParILUDataXTemp(ilu_data) = Xtemp; hypre_ParILUDataYTemp(ilu_data) = Ytemp; hypre_ParILUDataZTemp(ilu_data) = Ztemp; hypre_ParILUDataF(ilu_data) = F_array; hypre_ParILUDataU(ilu_data) = U_array; hypre_ParILUDataMatL(ilu_data) = matL; hypre_ParILUDataMatD(ilu_data) = matD; hypre_ParILUDataMatU(ilu_data) = matU; hypre_ParILUDataMatLModified(ilu_data) = matmL; hypre_ParILUDataMatDModified(ilu_data) = matmD; hypre_ParILUDataMatUModified(ilu_data) = matmU; hypre_ParILUDataMatS(ilu_data) = matS; hypre_ParILUDataCFMarkerArray(ilu_data) = CF_marker_array; hypre_ParILUDataPerm(ilu_data) = perm; hypre_ParILUDataQPerm(ilu_data) = qperm; hypre_ParILUDataNLU(ilu_data) = nLU; hypre_ParILUDataNI(ilu_data) = nI; hypre_ParILUDataUEnd(ilu_data) = u_end; hypre_ParILUDataUExt(ilu_data) = uext; hypre_ParILUDataFExt(ilu_data) = fext; /* compute operator complexity */ hypre_ParCSRMatrixSetDNumNonzeros(matA); nnzS = 0.0; /* size_C is the size of global coarse grid, upper left part */ size_C = hypre_ParCSRMatrixGlobalNumRows(matA); /* switch to compute complexity */ #if defined(HYPRE_USING_GPU) HYPRE_Int nnzBEF = 0; HYPRE_Int nnzG; /* Global nnz */ if (ilu_type == 0 && fill_level == 0) { /* The nnz is for sure 1.0 in this case */ hypre_ParILUDataOperatorComplexity(ilu_data) = 1.0; } else if (ilu_type == 10 && fill_level == 0) { /* The nnz is the sum of different parts */ if (matBLU_d) { nnzBEF += hypre_CSRMatrixNumNonzeros(matBLU_d); } if (matE_d) { nnzBEF += hypre_CSRMatrixNumNonzeros(matE_d); } if (matF_d) { nnzBEF += hypre_CSRMatrixNumNonzeros(matF_d); } hypre_MPI_Allreduce(&nnzBEF, &nnzG, 1, HYPRE_MPI_INT, hypre_MPI_SUM, comm); if (matS) { hypre_ParCSRMatrixSetDNumNonzeros(matS); nnzS = hypre_ParCSRMatrixDNumNonzeros(matS); /* if we have Schur system need to reduce it from size_C */ } hypre_ParILUDataOperatorComplexity(ilu_data) = ((HYPRE_Real)nnzG + nnzS) / hypre_ParCSRMatrixDNumNonzeros(matA); } else if (ilu_type == 50) { hypre_ParILUDataOperatorComplexity(ilu_data) = 1.0; } else if (ilu_type == 0 || ilu_type == 1 || ilu_type == 10 || ilu_type == 11) { if (matBLU_d) { nnzBEF += hypre_CSRMatrixNumNonzeros(matBLU_d); } if (matE_d) { nnzBEF += hypre_CSRMatrixNumNonzeros(matE_d); } if (matF_d) { nnzBEF += hypre_CSRMatrixNumNonzeros(matF_d); } hypre_MPI_Allreduce(&nnzBEF, &nnzG, 1, HYPRE_MPI_INT, hypre_MPI_SUM, comm); if (matS) { hypre_ParCSRMatrixSetDNumNonzeros(matS); nnzS = hypre_ParCSRMatrixDNumNonzeros(matS); /* if we have Schur system need to reduce it from size_C */ } hypre_ParILUDataOperatorComplexity(ilu_data) = ((HYPRE_Real)nnzG + nnzS) / hypre_ParCSRMatrixDNumNonzeros(matA); } else #endif { if (matS) { hypre_ParCSRMatrixSetDNumNonzeros(matS); nnzS = hypre_ParCSRMatrixDNumNonzeros(matS); /* If we have Schur system need to reduce it from size_C */ size_C -= hypre_ParCSRMatrixGlobalNumRows(matS); switch (ilu_type) { case 10: case 11: case 40: case 41: case 50: /* Now we need to compute the preconditioner */ schur_precond_ilu = (hypre_ParILUData*) (hypre_ParILUDataSchurPrecond(ilu_data)); /* borrow i for local nnz of S */ nnzS_offd_local = hypre_CSRMatrixNumNonzeros(hypre_ParCSRMatrixOffd(matS)); hypre_MPI_Allreduce(&nnzS_offd_local, &nnzS_offd, 1, HYPRE_MPI_REAL, hypre_MPI_SUM, comm); nnzS = nnzS * hypre_ParILUDataOperatorComplexity(schur_precond_ilu) + nnzS_offd; break; case 20: case 21: schur_solver_nsh = (hypre_ParNSHData*) hypre_ParILUDataSchurSolver(ilu_data); nnzS *= hypre_ParNSHDataOperatorComplexity(schur_solver_nsh); break; default: break; } } hypre_ParILUDataOperatorComplexity(ilu_data) = ((HYPRE_Real)size_C + nnzS + hypre_ParCSRMatrixDNumNonzeros(matL) + hypre_ParCSRMatrixDNumNonzeros(matU)) / hypre_ParCSRMatrixDNumNonzeros(matA); } /* TODO (VPM): Move ILU statistics printout to its own function */ if ((my_id == 0) && (print_level > 0)) { hypre_printf("ILU SETUP: operator complexity = %f \n", hypre_ParILUDataOperatorComplexity(ilu_data)); if (hypre_ParILUDataTriSolve(ilu_data)) { hypre_printf("ILU SOLVE: using direct triangular solves\n", hypre_ParILUDataOperatorComplexity(ilu_data)); } else { hypre_printf("ILU SOLVE: using iterative triangular solves\n", hypre_ParILUDataOperatorComplexity(ilu_data)); } #if defined (HYPRE_USING_ROCSPARSE) HYPRE_Int i; if (hypre_ParILUDataIterativeSetupType(ilu_data)) { hypre_printf("ILU: iterative setup type = %d\n", hypre_ParILUDataIterativeSetupType(ilu_data)); hypre_printf("ILU: iterative setup option = %d\n", hypre_ParILUDataIterativeSetupOption(ilu_data)); if (hypre_ParILUDataIterativeSetupOption(ilu_data) & 0x2) { /* This path enables termination based on stopping tolerance */ hypre_printf("ILU: iterative setup tolerance = %g\n", hypre_ParILUDataIterativeSetupTolerance(ilu_data)); } else { /* This path enables termination based on number of iterations */ hypre_printf("ILU: iterative setup max. iters = %d\n", hypre_ParILUDataIterativeSetupMaxIter(ilu_data)); } /* TODO (VPM): Add min, max, avg statistics across ranks */ hypre_printf("ILU: iterative setup num. iters at rank 0 = %d\n", hypre_ParILUDataIterativeSetupNumIter(ilu_data)); /* Show convergence history */ if (hypre_ParILUDataIterativeSetupOption(ilu_data) & 0x10) { hypre_printf("ILU: iterative setup convergence history at rank 0:\n"); hypre_printf("%8s", "iter"); if (hypre_ParILUDataIterativeSetupOption(ilu_data) & 0x08) { hypre_printf(" %14s %14s", "residual", "rate"); } if (hypre_ParILUDataIterativeSetupOption(ilu_data) & 0x04) { hypre_printf(" %14s %14s", "correction", "rate"); } hypre_printf("\n"); printf("%8d", 0); if (hypre_ParILUDataIterativeSetupOption(ilu_data) & 0x08) { hypre_printf(" %14.5e %14.5e", hypre_ParILUDataIterSetupResidualNorm(ilu_data, 0), 1.0); } if (hypre_ParILUDataIterativeSetupOption(ilu_data) & 0x04) { hypre_printf(" %14.5e %14.5e", hypre_ParILUDataIterSetupCorrectionNorm(ilu_data, 0), 1.0); } hypre_printf("\n"); for (i = 1; i < hypre_ParILUDataIterativeSetupNumIter(ilu_data); i++) { printf("%8d", i); if (hypre_ParILUDataIterativeSetupOption(ilu_data) & 0x08) { hypre_printf(" %14.5e %14.5e", hypre_ParILUDataIterSetupResidualNorm(ilu_data, i), hypre_ParILUDataIterSetupResidualNorm(ilu_data, i) / hypre_ParILUDataIterSetupResidualNorm(ilu_data, i - 1)); } if (hypre_ParILUDataIterativeSetupOption(ilu_data) & 0x04) { hypre_printf(" %14.5e %14.5e", hypre_ParILUDataIterSetupCorrectionNorm(ilu_data, i), hypre_ParILUDataIterSetupCorrectionNorm(ilu_data, i) / hypre_ParILUDataIterSetupCorrectionNorm(ilu_data, i - 1)); } hypre_printf("\n"); } } } #endif } if (logging > 1) { residual = hypre_ParVectorCreate(hypre_ParCSRMatrixComm(matA), hypre_ParCSRMatrixGlobalNumRows(matA), hypre_ParCSRMatrixRowStarts(matA) ); hypre_ParVectorInitialize(residual); hypre_ParILUDataResidual(ilu_data) = residual; } else { hypre_ParILUDataResidual(ilu_data) = NULL; } rel_res_norms = hypre_CTAlloc(HYPRE_Real, hypre_ParILUDataMaxIter(ilu_data), HYPRE_MEMORY_HOST); hypre_ParILUDataRelResNorms(ilu_data) = rel_res_norms; hypre_GpuProfilingPopRange(); HYPRE_ANNOTATE_FUNC_END; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_ParILUExtractEBFC * * Extract submatrix from diagonal part of A into * | B F | * | E C | * * A = input matrix * perm = permutation array indicating ordering of rows. Perm could come from a * CF_marker array or a reordering routine. * qperm = permutation array indicating ordering of columns * Bp = pointer to the output B matrix. * Cp = pointer to the output C matrix. * Ep = pointer to the output E matrix. * Fp = pointer to the output F matrix. *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ParILUExtractEBFC(hypre_CSRMatrix *A_diag, HYPRE_Int nLU, hypre_CSRMatrix **Bp, hypre_CSRMatrix **Cp, hypre_CSRMatrix **Ep, hypre_CSRMatrix **Fp) { /* Get necessary slots */ HYPRE_Int n = hypre_CSRMatrixNumRows(A_diag); HYPRE_Int nnz_A_diag = hypre_CSRMatrixNumNonzeros(A_diag); HYPRE_MemoryLocation memory_location = hypre_CSRMatrixMemoryLocation(A_diag); hypre_CSRMatrix *B = NULL; hypre_CSRMatrix *C = NULL; hypre_CSRMatrix *E = NULL; hypre_CSRMatrix *F = NULL; HYPRE_Int i, j, row, col; hypre_assert(nLU >= 0 && nLU <= n); if (nLU == n) { /* No Schur complement */ B = hypre_CSRMatrixCreate(n, n, nnz_A_diag); C = hypre_CSRMatrixCreate(0, 0, 0); E = hypre_CSRMatrixCreate(0, 0, 0); F = hypre_CSRMatrixCreate(0, 0, 0); hypre_CSRMatrixInitialize_v2(B, 0, memory_location); hypre_CSRMatrixInitialize_v2(C, 0, memory_location); hypre_CSRMatrixInitialize_v2(E, 0, memory_location); hypre_CSRMatrixInitialize_v2(F, 0, memory_location); hypre_CSRMatrixCopy(A_diag, B, 1); } else if (nLU == 0) { /* All Schur complement */ C = hypre_CSRMatrixCreate(n, n, nnz_A_diag); B = hypre_CSRMatrixCreate(0, 0, 0); E = hypre_CSRMatrixCreate(0, 0, 0); F = hypre_CSRMatrixCreate(0, 0, 0); hypre_CSRMatrixInitialize_v2(C, 0, memory_location); hypre_CSRMatrixInitialize_v2(B, 0, memory_location); hypre_CSRMatrixInitialize_v2(E, 0, memory_location); hypre_CSRMatrixInitialize_v2(F, 0, memory_location); hypre_CSRMatrixCopy(A_diag, C, 1); } else { /* Has schur complement */ HYPRE_Int m = n - nLU; HYPRE_Int capacity_B; HYPRE_Int capacity_E; HYPRE_Int capacity_F; HYPRE_Int capacity_C; HYPRE_Int ctrB; HYPRE_Int ctrC; HYPRE_Int ctrE; HYPRE_Int ctrF; HYPRE_Int *B_i = NULL; HYPRE_Int *C_i = NULL; HYPRE_Int *E_i = NULL; HYPRE_Int *F_i = NULL; HYPRE_Int *B_j = NULL; HYPRE_Int *C_j = NULL; HYPRE_Int *E_j = NULL; HYPRE_Int *F_j = NULL; HYPRE_Complex *B_data = NULL; HYPRE_Complex *C_data = NULL; HYPRE_Complex *E_data = NULL; HYPRE_Complex *F_data = NULL; hypre_CSRMatrix *h_A_diag; HYPRE_Int *A_diag_i; HYPRE_Int *A_diag_j; HYPRE_Complex *A_diag_data; /* Create/Get host pointer for A_diag */ h_A_diag = (hypre_GetActualMemLocation(memory_location) == hypre_MEMORY_DEVICE) ? hypre_CSRMatrixClone_v2(A_diag, 1, HYPRE_MEMORY_HOST) : A_diag; A_diag_i = hypre_CSRMatrixI(h_A_diag); A_diag_j = hypre_CSRMatrixJ(h_A_diag); A_diag_data = hypre_CSRMatrixData(h_A_diag); /* Estimate # of nonzeros */ capacity_B = (HYPRE_Int) (nLU + hypre_ceil(nnz_A_diag * 1.0 * nLU / n * nLU / n)); capacity_C = (HYPRE_Int) (m + hypre_ceil(nnz_A_diag * 1.0 * m / n * m / n)); capacity_E = (HYPRE_Int) (hypre_min(m, nLU) + hypre_ceil(nnz_A_diag * 1.0 * nLU / n * m / n)); capacity_F = capacity_E; /* Create CSRMatrices */ B = hypre_CSRMatrixCreate(nLU, nLU, capacity_B); C = hypre_CSRMatrixCreate(m, m, capacity_C); E = hypre_CSRMatrixCreate(m, nLU, capacity_E); F = hypre_CSRMatrixCreate(nLU, m, capacity_F); /* Initialize matrices on the host */ hypre_CSRMatrixInitialize_v2(B, 0, HYPRE_MEMORY_HOST); hypre_CSRMatrixInitialize_v2(C, 0, HYPRE_MEMORY_HOST); hypre_CSRMatrixInitialize_v2(E, 0, HYPRE_MEMORY_HOST); hypre_CSRMatrixInitialize_v2(F, 0, HYPRE_MEMORY_HOST); /* Access pointers */ B_i = hypre_CSRMatrixI(B); B_j = hypre_CSRMatrixJ(B); B_data = hypre_CSRMatrixData(B); C_i = hypre_CSRMatrixI(C); C_j = hypre_CSRMatrixJ(C); C_data = hypre_CSRMatrixData(C); E_i = hypre_CSRMatrixI(E); E_j = hypre_CSRMatrixJ(E); E_data = hypre_CSRMatrixData(E); F_i = hypre_CSRMatrixI(F); F_j = hypre_CSRMatrixJ(F); F_data = hypre_CSRMatrixData(F); ctrB = ctrC = ctrE = ctrF = 0; /* Loop to copy data */ /* B and F first */ for (i = 0; i < nLU; i++) { B_i[i] = ctrB; F_i[i] = ctrF; for (j = A_diag_i[i]; j < A_diag_i[i + 1]; j++) { col = A_diag_j[j]; if (col >= nLU) { break; } B_j[ctrB] = col; B_data[ctrB++] = A_diag_data[j]; /* check capacity */ if (ctrB >= capacity_B) { HYPRE_Int tmp; tmp = capacity_B; capacity_B = (HYPRE_Int)(capacity_B * EXPAND_FACT + 1); B_j = hypre_TReAlloc_v2(B_j, HYPRE_Int, tmp, HYPRE_Int, capacity_B, HYPRE_MEMORY_HOST); B_data = hypre_TReAlloc_v2(B_data, HYPRE_Complex, tmp, HYPRE_Complex, capacity_B, HYPRE_MEMORY_HOST); } } for (; j < A_diag_i[i + 1]; j++) { col = A_diag_j[j] - nLU; hypre_assert(col >= 0); F_j[ctrF] = col; F_data[ctrF++] = A_diag_data[j]; if (ctrF >= capacity_F) { HYPRE_Int tmp; tmp = capacity_F; capacity_F = (HYPRE_Int)(capacity_F * EXPAND_FACT + 1); F_j = hypre_TReAlloc_v2(F_j, HYPRE_Int, tmp, HYPRE_Int, capacity_F, HYPRE_MEMORY_HOST); F_data = hypre_TReAlloc_v2(F_data, HYPRE_Complex, tmp, HYPRE_Complex, capacity_F, HYPRE_MEMORY_HOST); } } } B_i[nLU] = ctrB; F_i[nLU] = ctrF; /* E and C afterward */ for (i = nLU; i < n; i++) { row = i - nLU; E_i[row] = ctrE; C_i[row] = ctrC; for (j = A_diag_i[i]; j < A_diag_i[i + 1]; j++) { col = A_diag_j[j]; if (col >= nLU) { break; } E_j[ctrE] = col; E_data[ctrE++] = A_diag_data[j]; /* check capacity */ if (ctrE >= capacity_E) { HYPRE_Int tmp; tmp = capacity_E; capacity_E = (HYPRE_Int)(capacity_E * EXPAND_FACT + 1); E_j = hypre_TReAlloc_v2(E_j, HYPRE_Int, tmp, HYPRE_Int, capacity_E, HYPRE_MEMORY_HOST); E_data = hypre_TReAlloc_v2(E_data, HYPRE_Complex, tmp, HYPRE_Complex, capacity_E, HYPRE_MEMORY_HOST); } } for (; j < A_diag_i[i + 1]; j++) { col = A_diag_j[j] - nLU; hypre_assert(col >= 0); C_j[ctrC] = col; C_data[ctrC++] = A_diag_data[j]; if (ctrC >= capacity_C) { HYPRE_Int tmp; tmp = capacity_C; capacity_C = (HYPRE_Int)(capacity_C * EXPAND_FACT + 1); C_j = hypre_TReAlloc_v2(C_j, HYPRE_Int, tmp, HYPRE_Int, capacity_C, HYPRE_MEMORY_HOST); C_data = hypre_TReAlloc_v2(C_data, HYPRE_Complex, tmp, HYPRE_Complex, capacity_C, HYPRE_MEMORY_HOST); } } } E_i[m] = ctrE; C_i[m] = ctrC; hypre_assert((ctrB + ctrC + ctrE + ctrF) == nnz_A_diag); /* Update pointers */ hypre_CSRMatrixJ(B) = B_j; hypre_CSRMatrixData(B) = B_data; hypre_CSRMatrixNumNonzeros(B) = ctrB; hypre_CSRMatrixJ(C) = C_j; hypre_CSRMatrixData(C) = C_data; hypre_CSRMatrixNumNonzeros(C) = ctrC; hypre_CSRMatrixJ(E) = E_j; hypre_CSRMatrixData(E) = E_data; hypre_CSRMatrixNumNonzeros(E) = ctrE; hypre_CSRMatrixJ(F) = F_j; hypre_CSRMatrixData(F) = F_data; hypre_CSRMatrixNumNonzeros(F) = ctrF; /* Migrate to final memory location */ hypre_CSRMatrixMigrate(B, memory_location); hypre_CSRMatrixMigrate(C, memory_location); hypre_CSRMatrixMigrate(E, memory_location); hypre_CSRMatrixMigrate(F, memory_location); /* Free memory */ if (h_A_diag != A_diag) { hypre_CSRMatrixDestroy(h_A_diag); } } /* Set output pointers */ *Bp = B; *Cp = C; *Ep = E; *Fp = F; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_ParILURAPReorder * * Reorder matrix A based on local permutation, i.e., combine local * permutation into global permutation) * * WARNING: We don't put diagonal to the first entry of each row * * A = input matrix * perm = permutation array indicating ordering of rows. * Perm could come from a CF_marker array or a reordering routine. * rqperm = reverse permutation array indicating ordering of columns * A_pq = pointer to the output par CSR matrix. *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ParILURAPReorder(hypre_ParCSRMatrix *A, HYPRE_Int *perm, HYPRE_Int *rqperm, hypre_ParCSRMatrix **A_pq) { /* Get necessary slots */ MPI_Comm comm = hypre_ParCSRMatrixComm(A); hypre_CSRMatrix *A_diag = hypre_ParCSRMatrixDiag(A); HYPRE_Int n = hypre_CSRMatrixNumRows(A_diag); HYPRE_MemoryLocation memory_location = hypre_ParCSRMatrixMemoryLocation(A); /* Permutation matrices */ hypre_ParCSRMatrix *P, *Q, *PAQ, *PA; hypre_CSRMatrix *P_diag, *Q_diag; HYPRE_Int *P_diag_i, *P_diag_j, *Q_diag_i, *Q_diag_j; HYPRE_Complex *P_diag_data, *Q_diag_data; HYPRE_Int *h_perm, *h_rqperm; /* Local variables */ HYPRE_Int i; /* Trivial case */ if (!perm && !rqperm) { *A_pq = hypre_ParCSRMatrixClone(A, 1); return hypre_error_flag; } else if (!perm && rqperm) { hypre_error_w_msg(HYPRE_ERROR_ARG, "(!perm && rqperm) should not be possible!"); } else if (perm && !rqperm) { hypre_error_w_msg(HYPRE_ERROR_ARG, "(perm && !rqperm) should not be possible!"); } /* Create permutation matrices P = I(perm,:) and Q(rqperm,:), such that Apq = PAQ */ P = hypre_ParCSRMatrixCreate(comm, hypre_ParCSRMatrixGlobalNumRows(A), hypre_ParCSRMatrixGlobalNumRows(A), hypre_ParCSRMatrixRowStarts(A), hypre_ParCSRMatrixColStarts(A), 0, n, 0); Q = hypre_ParCSRMatrixCreate(comm, hypre_ParCSRMatrixGlobalNumRows(A), hypre_ParCSRMatrixGlobalNumRows(A), hypre_ParCSRMatrixRowStarts(A), hypre_ParCSRMatrixColStarts(A), 0, n, 0); hypre_ParCSRMatrixInitialize_v2(P, HYPRE_MEMORY_HOST); hypre_ParCSRMatrixInitialize_v2(Q, HYPRE_MEMORY_HOST); P_diag = hypre_ParCSRMatrixDiag(P); Q_diag = hypre_ParCSRMatrixDiag(Q); P_diag_i = hypre_CSRMatrixI(P_diag); P_diag_j = hypre_CSRMatrixJ(P_diag); P_diag_data = hypre_CSRMatrixData(P_diag); Q_diag_i = hypre_CSRMatrixI(Q_diag); Q_diag_j = hypre_CSRMatrixJ(Q_diag); Q_diag_data = hypre_CSRMatrixData(Q_diag); /* Set/Move permutation vectors on host */ if (hypre_GetActualMemLocation(memory_location) == hypre_MEMORY_DEVICE) { h_perm = hypre_TAlloc(HYPRE_Int, n, HYPRE_MEMORY_HOST); h_rqperm = hypre_TAlloc(HYPRE_Int, n, HYPRE_MEMORY_HOST); hypre_TMemcpy(h_perm, perm, HYPRE_Int, n, HYPRE_MEMORY_HOST, memory_location); hypre_TMemcpy(h_rqperm, rqperm, HYPRE_Int, n, HYPRE_MEMORY_HOST, memory_location); } else { h_perm = perm; h_rqperm = rqperm; } /* Fill data */ #if defined(HYPRE_USING_OPENMP) #pragma omp parallel for private(i) HYPRE_SMP_SCHEDULE #endif for (i = 0; i < n; i++) { P_diag_i[i] = i; P_diag_j[i] = h_perm[i]; P_diag_data[i] = 1.0; Q_diag_i[i] = i; Q_diag_j[i] = h_rqperm[i]; Q_diag_data[i] = 1.0; } P_diag_i[n] = n; Q_diag_i[n] = n; /* Move to final memory location */ hypre_ParCSRMatrixMigrate(P, memory_location); hypre_ParCSRMatrixMigrate(Q, memory_location); /* Update A */ PA = hypre_ParCSRMatMat(P, A); PAQ = hypre_ParCSRMatMat(PA, Q); //PAQ = hypre_ParCSRMatrixRAPKT(P, A, Q, 0); /* free and return */ hypre_ParCSRMatrixDestroy(P); hypre_ParCSRMatrixDestroy(Q); hypre_ParCSRMatrixDestroy(PA); if (h_perm != perm) { hypre_TFree(h_perm, HYPRE_MEMORY_HOST); } if (h_rqperm != rqperm) { hypre_TFree(h_rqperm, HYPRE_MEMORY_HOST); } *A_pq = PAQ; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_ILUSetupLDUtoCusparse * * Convert the L, D, U style to the cusparse style * Assume the diagonal of L and U are the ilu factorization, directly combine them * * TODO (VPM): Check this function's name *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ILUSetupLDUtoCusparse(hypre_ParCSRMatrix *L, HYPRE_Real *D, hypre_ParCSRMatrix *U, hypre_ParCSRMatrix **LDUp) { MPI_Comm comm = hypre_ParCSRMatrixComm(L); hypre_CSRMatrix *L_diag = hypre_ParCSRMatrixDiag(L); hypre_CSRMatrix *U_diag = hypre_ParCSRMatrixDiag(U); HYPRE_Int *L_diag_i = hypre_CSRMatrixI(L_diag); HYPRE_Int *L_diag_j = hypre_CSRMatrixJ(L_diag); HYPRE_Real *L_diag_a = hypre_CSRMatrixData(L_diag); HYPRE_Int *U_diag_i = hypre_CSRMatrixI(U_diag); HYPRE_Int *U_diag_j = hypre_CSRMatrixJ(U_diag); HYPRE_Real *U_diag_a = hypre_CSRMatrixData(U_diag); HYPRE_Int n = hypre_ParCSRMatrixNumRows(L); HYPRE_Int nnz_L = L_diag_i[n]; HYPRE_Int nnz_U = U_diag_i[n]; HYPRE_Int nnz_LDU = n + nnz_L + nnz_U; hypre_ParCSRMatrix *LDU; hypre_CSRMatrix *LDU_diag; HYPRE_Int *LDU_diag_i; HYPRE_Int *LDU_diag_j; HYPRE_Real *LDU_diag_a; HYPRE_Int i, j, pos; /* Create matrix */ LDU = hypre_ParCSRMatrixCreate(comm, hypre_ParCSRMatrixGlobalNumRows(L), hypre_ParCSRMatrixGlobalNumRows(L), hypre_ParCSRMatrixRowStarts(L), hypre_ParCSRMatrixColStarts(L), 0, nnz_LDU, 0); hypre_ParCSRMatrixInitialize_v2(LDU, HYPRE_MEMORY_HOST); LDU_diag = hypre_ParCSRMatrixDiag(LDU); LDU_diag_i = hypre_CSRMatrixI(LDU_diag); LDU_diag_j = hypre_CSRMatrixJ(LDU_diag); LDU_diag_a = hypre_CSRMatrixData(LDU_diag); pos = 0; for (i = 0; i < n; i++) { LDU_diag_i[i] = pos; for (j = L_diag_i[i]; j < L_diag_i[i + 1]; j++) { LDU_diag_j[pos] = L_diag_j[j]; LDU_diag_a[pos++] = L_diag_a[j]; } LDU_diag_j[pos] = i; LDU_diag_a[pos++] = 1.0 / D[i]; for (j = U_diag_i[i]; j < U_diag_i[i + 1]; j++) { LDU_diag_j[pos] = U_diag_j[j]; LDU_diag_a[pos++] = U_diag_a[j]; } } LDU_diag_i[n] = pos; /* Migrate to device (abstract memory space) */ hypre_ParCSRMatrixMigrate(LDU, HYPRE_MEMORY_DEVICE); #if defined(HYPRE_USING_GPU) hypre_CSRMatrixSortRow(hypre_ParCSRMatrixDiag(LDU)); #endif *LDUp = LDU; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_ILUSetupRAPMILU0 * * Apply the (modified) ILU factorization to the diagonal block of A only. * * A: matrix * ALUp: pointer to the result, factorization stroed on the diagonal * modified: set to 0 to use classical ILU0 *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ILUSetupRAPMILU0(hypre_ParCSRMatrix *A, hypre_ParCSRMatrix **ALUp, HYPRE_Int modified) { HYPRE_Int n = hypre_CSRMatrixNumRows(hypre_ParCSRMatrixDiag(A)); /* Get necessary slots */ hypre_ParCSRMatrix *L, *U, *S, *ALU; HYPRE_Real *D; HYPRE_Int *u_end; /* u_end is the end position of the upper triangular part (if we need E and F implicitly), not used here */ hypre_ILUSetupMILU0(A, NULL, NULL, n, n, &L, &D, &U, &S, &u_end, modified); hypre_TFree(u_end, HYPRE_MEMORY_HOST); /* TODO (VPM): Change this function's name */ hypre_ILUSetupLDUtoCusparse(L, D, U, &ALU); /* Free memory */ hypre_ParCSRMatrixDestroy(L); hypre_TFree(D, hypre_ParCSRMatrixMemoryLocation(A)); hypre_ParCSRMatrixDestroy(U); *ALUp = ALU; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_ILUSetupRAPILU0Device * * Modified ILU(0) with RAP like solve * A = input matrix * * TODO (VPM): Move this function to par_setup_device.c? *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ILUSetupRAPILU0Device(hypre_ParCSRMatrix *A, HYPRE_Int *perm, HYPRE_Int n, HYPRE_Int nLU, hypre_ParCSRMatrix **Apermptr, hypre_ParCSRMatrix **matSptr, hypre_CSRMatrix **ALUptr, hypre_CSRMatrix **BLUptr, hypre_CSRMatrix **CLUptr, hypre_CSRMatrix **Eptr, hypre_CSRMatrix **Fptr, HYPRE_Int test_opt) { MPI_Comm comm = hypre_ParCSRMatrixComm(A); HYPRE_Int *rperm = NULL; HYPRE_Int m = n - nLU; HYPRE_Int i; HYPRE_Int num_procs, my_id; /* Matrix Structure */ hypre_ParCSRMatrix *Apq, *ALU, *ALUm, *S; hypre_CSRMatrix *Amd, *Ad, *SLU, *Apq_diag; hypre_MPI_Comm_size(comm, &num_procs); hypre_MPI_Comm_rank(comm, &my_id); rperm = hypre_CTAlloc(HYPRE_Int, n, HYPRE_MEMORY_HOST); for (i = 0; i < n; i++) { rperm[perm[i]] = i; } /* first we need to compute the ILU0 factorization of B */ /* Copy diagonal matrix into a new place with permutation * That is, Apq = A(perm,qperm); */ hypre_ParILURAPReorder(A, perm, rperm, &Apq); /* do the full ILU0 and modified ILU0 */ hypre_ILUSetupRAPMILU0(Apq, &ALU, 0); hypre_ILUSetupRAPMILU0(Apq, &ALUm, 1); hypre_CSRMatrix *dB, *dS, *dE, *dF; /* get modified and extract LU factorization */ Amd = hypre_ParCSRMatrixDiag(ALUm); Ad = hypre_ParCSRMatrixDiag(ALU); switch (test_opt) { case 1: { /* RAP where we save E and F */ Apq_diag = hypre_ParCSRMatrixDiag(Apq); #if defined(HYPRE_USING_GPU) hypre_CSRMatrixSortRow(Apq_diag); #endif hypre_ParILUExtractEBFC(Apq_diag, nLU, &dB, &dS, Eptr, Fptr); /* get modified ILU of B */ hypre_ParILUExtractEBFC(Amd, nLU, BLUptr, &SLU, &dE, &dF); hypre_CSRMatrixDestroy(dB); hypre_CSRMatrixDestroy(dS); hypre_CSRMatrixDestroy(dE); hypre_CSRMatrixDestroy(dF); break; } case 2: { /* C-EB^{-1}F where we save EU^{-1}, L^{-1}F as sparse matrices */ Apq_diag = hypre_ParCSRMatrixDiag(Apq); #if defined(HYPRE_USING_GPU) hypre_CSRMatrixSortRow(Apq_diag); #endif hypre_ParILUExtractEBFC(Apq_diag, nLU, &dB, CLUptr, &dE, &dF); /* get modified ILU of B */ hypre_ParILUExtractEBFC(Amd, nLU, BLUptr, &SLU, Eptr, Fptr); hypre_CSRMatrixDestroy(dB); hypre_CSRMatrixDestroy(dE); hypre_CSRMatrixDestroy(dF); break; } case 3: { /* C-EB^{-1}F where we save E and F */ Apq_diag = hypre_ParCSRMatrixDiag(Apq); #if defined(HYPRE_USING_GPU) hypre_CSRMatrixSortRow(Apq_diag); #endif hypre_ParILUExtractEBFC(Apq_diag, nLU, &dB, CLUptr, Eptr, Fptr); /* get modified ILU of B */ hypre_ParILUExtractEBFC(Amd, nLU, BLUptr, &SLU, &dE, &dF); hypre_CSRMatrixDestroy(dB); hypre_CSRMatrixDestroy(dE); hypre_CSRMatrixDestroy(dF); break; } case 4: { /* RAP where we save EU^{-1}, L^{-1}F as sparse matrices */ hypre_ParILUExtractEBFC(Ad, nLU, BLUptr, &SLU, Eptr, Fptr); break; } case 0: default: { /* RAP where we save EU^{-1}, L^{-1}F as sparse matrices */ hypre_ParILUExtractEBFC(Amd, nLU, BLUptr, &SLU, Eptr, Fptr); break; } } *ALUptr = hypre_ParCSRMatrixDiag(ALU); hypre_ParCSRMatrixDiag(ALU) = NULL; /* not a good practice to manipulate parcsr's csr */ hypre_ParCSRMatrixDestroy(ALU); hypre_ParCSRMatrixDestroy(ALUm); /* start forming parCSR matrix S */ HYPRE_BigInt S_total_rows, S_row_starts[2]; HYPRE_BigInt big_m = (HYPRE_BigInt)m; hypre_MPI_Allreduce(&big_m, &S_total_rows, 1, HYPRE_MPI_BIG_INT, hypre_MPI_SUM, comm); if (S_total_rows > 0) { { HYPRE_BigInt global_start; hypre_MPI_Scan(&big_m, &global_start, 1, HYPRE_MPI_BIG_INT, hypre_MPI_SUM, comm); S_row_starts[0] = global_start - big_m; S_row_starts[1] = global_start; } S = hypre_ParCSRMatrixCreate( hypre_ParCSRMatrixComm(A), S_total_rows, S_total_rows, S_row_starts, S_row_starts, 0, 0, 0); hypre_CSRMatrixDestroy(hypre_ParCSRMatrixDiag(S)); hypre_ParCSRMatrixDiag(S) = SLU; } else { S = NULL; hypre_CSRMatrixDestroy(SLU); } *matSptr = S; *Apermptr = Apq; hypre_TFree(rperm, HYPRE_MEMORY_HOST); return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_ILUSetupRAPILU0 * * Modified ILU(0) with RAP like solve * * A = input matrix * Not explicitly forming the matrix *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ILUSetupRAPILU0(hypre_ParCSRMatrix *A, HYPRE_Int *perm, HYPRE_Int n, HYPRE_Int nLU, hypre_ParCSRMatrix **Lptr, HYPRE_Real **Dptr, hypre_ParCSRMatrix **Uptr, hypre_ParCSRMatrix **mLptr, HYPRE_Real **mDptr, hypre_ParCSRMatrix **mUptr, HYPRE_Int **u_end) { hypre_ParCSRMatrix *S_temp = NULL; HYPRE_Int *u_temp = NULL; HYPRE_Int *u_end_array; hypre_CSRMatrix *L_diag, *U_diag; HYPRE_Int *L_diag_i, *U_diag_i; HYPRE_Int *L_diag_j, *U_diag_j; HYPRE_Complex *L_diag_data, *U_diag_data; hypre_CSRMatrix *mL_diag, *mU_diag; HYPRE_Int *mL_diag_i, *mU_diag_i; HYPRE_Int *mL_diag_j, *mU_diag_j; HYPRE_Complex *mL_diag_data, *mU_diag_data; HYPRE_Int i; /* Standard ILU0 factorization */ hypre_ILUSetupMILU0(A, perm, perm, n, n, Lptr, Dptr, Uptr, &S_temp, &u_temp, 0); /* Free memory */ hypre_ParCSRMatrixDestroy(S_temp); hypre_TFree(u_temp, HYPRE_MEMORY_HOST); /* Modified ILU0 factorization */ hypre_ILUSetupMILU0(A, perm, perm, n, n, mLptr, mDptr, mUptr, &S_temp, &u_temp, 1); /* Free memory */ hypre_ParCSRMatrixDestroy(S_temp); hypre_TFree(u_temp, HYPRE_MEMORY_HOST); /* Pointer to the start location */ u_end_array = hypre_TAlloc(HYPRE_Int, n, HYPRE_MEMORY_HOST); U_diag = hypre_ParCSRMatrixDiag(*Uptr); U_diag_i = hypre_CSRMatrixI(U_diag); U_diag_j = hypre_CSRMatrixJ(U_diag); U_diag_data = hypre_CSRMatrixData(U_diag); mU_diag = hypre_ParCSRMatrixDiag(*mUptr); mU_diag_i = hypre_CSRMatrixI(mU_diag); mU_diag_j = hypre_CSRMatrixJ(mU_diag); mU_diag_data = hypre_CSRMatrixData(mU_diag); /* first sort the Upper part U */ for (i = 0; i < nLU; i++) { hypre_qsort1(U_diag_j, U_diag_data, U_diag_i[i], U_diag_i[i + 1] - 1); hypre_qsort1(mU_diag_j, mU_diag_data, mU_diag_i[i], mU_diag_i[i + 1] - 1); hypre_BinarySearch2(U_diag_j, nLU, U_diag_i[i], U_diag_i[i + 1] - 1, u_end_array + i); } L_diag = hypre_ParCSRMatrixDiag(*Lptr); L_diag_i = hypre_CSRMatrixI(L_diag); L_diag_j = hypre_CSRMatrixJ(L_diag); L_diag_data = hypre_CSRMatrixData(L_diag); mL_diag = hypre_ParCSRMatrixDiag(*mLptr); mL_diag_i = hypre_CSRMatrixI(mL_diag); mL_diag_j = hypre_CSRMatrixJ(mL_diag); mL_diag_data = hypre_CSRMatrixData(mL_diag); /* now sort the Lower part L */ for (i = nLU; i < n; i++) { hypre_qsort1(L_diag_j, L_diag_data, L_diag_i[i], L_diag_i[i + 1] - 1); hypre_qsort1(mL_diag_j, mL_diag_data, mL_diag_i[i], mL_diag_i[i + 1] - 1); hypre_BinarySearch2(L_diag_j, nLU, L_diag_i[i], L_diag_i[i + 1] - 1, u_end_array + i); } *u_end = u_end_array; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_ILUSetupILU0 * * Setup ILU(0) * * A = input matrix * perm = permutation array indicating ordering of rows. * Perm could come from a CF_marker array or a reordering routine. * When set to NULL, identity permutation is used. * qperm = permutation array indicating ordering of columns. * When set to NULL, identity permutation is used. * nI = number of interial unknowns * nLU = size of incomplete factorization, nLU should obey nLU <= nI. * Schur complement is formed if nLU < n * Lptr, Dptr, Uptr, Sptr = L, D, U, S factors. * will form global Schur Matrix if nLU < n *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ILUSetupILU0(hypre_ParCSRMatrix *A, HYPRE_Int *perm, HYPRE_Int *qperm, HYPRE_Int nLU, HYPRE_Int nI, hypre_ParCSRMatrix **Lptr, HYPRE_Real **Dptr, hypre_ParCSRMatrix **Uptr, hypre_ParCSRMatrix **Sptr, HYPRE_Int **u_end) { return hypre_ILUSetupMILU0(A, perm, qperm, nLU, nI, Lptr, Dptr, Uptr, Sptr, u_end, 0); } /*-------------------------------------------------------------------------- * hypre_ILUSetupILU0 * * Setup modified ILU(0) * * A = input matrix * perm = permutation array indicating ordering of rows. * Perm could come from a CF_marker array or a reordering routine. * When set to NULL, indentity permutation is used. * qperm = permutation array indicating ordering of columns. * When set to NULL, identity permutation is used. * nI = number of interior unknowns * nLU = size of incomplete factorization, nLU should obey nLU <= nI. * Schur complement is formed if nLU < n * Lptr, Dptr, Uptr, Sptr = L, D, U, S factors. * modified set to 0 to use classical ILU * will form global Schur Matrix if nLU < n *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ILUSetupMILU0(hypre_ParCSRMatrix *A, HYPRE_Int *permp, HYPRE_Int *qpermp, HYPRE_Int nLU, HYPRE_Int nI, hypre_ParCSRMatrix **Lptr, HYPRE_Real **Dptr, hypre_ParCSRMatrix **Uptr, hypre_ParCSRMatrix **Sptr, HYPRE_Int **u_end, HYPRE_Int modified) { HYPRE_Int i, ii, j, k, k1, k2, k3, ctrU, ctrL, ctrS; HYPRE_Int lenl, lenu, jpiv, col, jpos; HYPRE_Int *iw, *iL, *iU; HYPRE_Real dd, t, dpiv, lxu, *wU, *wL; HYPRE_Real drop; /* communication stuffs for S */ MPI_Comm comm = hypre_ParCSRMatrixComm(A); HYPRE_Int S_offd_nnz, S_offd_ncols; hypre_ParCSRCommPkg *comm_pkg; hypre_ParCSRCommHandle *comm_handle; HYPRE_Int num_sends, begin, end; HYPRE_BigInt *send_buf = NULL; HYPRE_Int num_procs, my_id; /* data objects for A */ hypre_CSRMatrix *A_diag = hypre_ParCSRMatrixDiag(A); hypre_CSRMatrix *A_offd = hypre_ParCSRMatrixOffd(A); HYPRE_Real *A_diag_data = hypre_CSRMatrixData(A_diag); HYPRE_Int *A_diag_i = hypre_CSRMatrixI(A_diag); HYPRE_Int *A_diag_j = hypre_CSRMatrixJ(A_diag); HYPRE_Real *A_offd_data = hypre_CSRMatrixData(A_offd); HYPRE_Int *A_offd_i = hypre_CSRMatrixI(A_offd); HYPRE_Int *A_offd_j = hypre_CSRMatrixJ(A_offd); HYPRE_MemoryLocation memory_location = hypre_ParCSRMatrixMemoryLocation(A); /* size of problem and schur system */ HYPRE_Int n = hypre_CSRMatrixNumRows(A_diag); HYPRE_Int m = n - nLU; HYPRE_Int e = nI - nLU; HYPRE_Int m_e = n - nI; HYPRE_Real local_nnz, total_nnz; HYPRE_Int *u_end_array; /* data objects for L, D, U */ hypre_ParCSRMatrix *matL; hypre_ParCSRMatrix *matU; hypre_CSRMatrix *L_diag; hypre_CSRMatrix *U_diag; HYPRE_Real *D_data; HYPRE_Real *L_diag_data; HYPRE_Int *L_diag_i; HYPRE_Int *L_diag_j; HYPRE_Real *U_diag_data; HYPRE_Int *U_diag_i; HYPRE_Int *U_diag_j; /* data objects for S */ hypre_ParCSRMatrix *matS = NULL; hypre_CSRMatrix *S_diag; hypre_CSRMatrix *S_offd; HYPRE_Real *S_diag_data = NULL; HYPRE_Int *S_diag_i = NULL; HYPRE_Int *S_diag_j = NULL; HYPRE_Int *S_offd_i = NULL; HYPRE_Int *S_offd_j = NULL; HYPRE_BigInt *S_offd_colmap = NULL; HYPRE_Real *S_offd_data; HYPRE_BigInt col_starts[2]; HYPRE_BigInt total_rows; /* memory management */ HYPRE_Int initial_alloc = 0; HYPRE_Int capacity_L; HYPRE_Int capacity_U; HYPRE_Int capacity_S = 0; HYPRE_Int nnz_A = A_diag_i[n]; /* reverse permutation array */ HYPRE_Int *rperm; HYPRE_Int *perm, *qperm; /* start setup * get communication stuffs first */ hypre_MPI_Comm_size(comm, &num_procs); hypre_MPI_Comm_rank(comm, &my_id); comm_pkg = hypre_ParCSRMatrixCommPkg(A); /* setup if not yet built */ if (!comm_pkg) { hypre_MatvecCommPkgCreate(A); comm_pkg = hypre_ParCSRMatrixCommPkg(A); } /* check for correctness */ if (nLU < 0 || nLU > n) { hypre_error_w_msg(HYPRE_ERROR_ARG, "WARNING: nLU out of range.\n"); } if (e < 0) { hypre_error_w_msg(HYPRE_ERROR_ARG, "WARNING: nLU should not exceed nI.\n"); } /* Allocate memory for u_end array */ u_end_array = hypre_TAlloc(HYPRE_Int, nLU, HYPRE_MEMORY_HOST); /* Allocate memory for L,D,U,S factors */ if (n > 0) { initial_alloc = (HYPRE_Int)(nLU + hypre_ceil((nnz_A / 2.0) * nLU / n)); capacity_S = (HYPRE_Int)(m + hypre_ceil((nnz_A / 2.0) * m / n)); } capacity_L = initial_alloc; capacity_U = initial_alloc; D_data = hypre_TAlloc(HYPRE_Real, n, memory_location); L_diag_i = hypre_TAlloc(HYPRE_Int, n + 1, memory_location); L_diag_j = hypre_TAlloc(HYPRE_Int, capacity_L, memory_location); L_diag_data = hypre_TAlloc(HYPRE_Real, capacity_L, memory_location); U_diag_i = hypre_TAlloc(HYPRE_Int, n + 1, memory_location); U_diag_j = hypre_TAlloc(HYPRE_Int, capacity_U, memory_location); U_diag_data = hypre_TAlloc(HYPRE_Real, capacity_U, memory_location); S_diag_i = hypre_TAlloc(HYPRE_Int, m + 1, memory_location); S_diag_j = hypre_TAlloc(HYPRE_Int, capacity_S, memory_location); S_diag_data = hypre_TAlloc(HYPRE_Real, capacity_S, memory_location); /* allocate working arrays */ iw = hypre_TAlloc(HYPRE_Int, 3 * n, HYPRE_MEMORY_HOST); iL = iw + n; rperm = iw + 2 * n; wL = hypre_TAlloc(HYPRE_Real, n, HYPRE_MEMORY_HOST); ctrU = ctrL = ctrS = 0; L_diag_i[0] = U_diag_i[0] = S_diag_i[0] = 0; /* set marker array iw to -1 */ for (i = 0; i < n; i++) { iw[i] = -1; } /* get reverse permutation (rperm). * create permutation if they are null * rperm holds the reordered indexes. * rperm only used for column */ if (!permp) { perm = hypre_TAlloc(HYPRE_Int, n, memory_location); for (i = 0; i < n; i++) { perm[i] = i; } } else { perm = permp; } if (!qpermp) { qperm = hypre_TAlloc(HYPRE_Int, n, memory_location); for (i = 0; i < n; i++) { qperm[i] = i; } } else { qperm = qpermp; } for (i = 0; i < n; i++) { rperm[qperm[i]] = i; } /*--------- Begin Factorization. Work in permuted space ----*/ for (ii = 0; ii < nLU; ii++) { // get row i i = perm[ii]; // get extents of row i k1 = A_diag_i[i]; k2 = A_diag_i[i + 1]; // track the drop drop = 0.0; /*-------------------- unpack L & U-parts of row of A in arrays w */ iU = iL + ii; wU = wL + ii; /*-------------------- diagonal entry */ dd = 0.0; lenl = lenu = 0; iw[ii] = ii; /*-------------------- scan & unwrap column */ for (j = k1; j < k2; j++) { col = rperm[A_diag_j[j]]; t = A_diag_data[j]; if ( col < ii ) { iw[col] = lenl; iL[lenl] = col; wL[lenl++] = t; } else if (col > ii) { iw[col] = lenu; iU[lenu] = col; wU[lenu++] = t; } else { dd = t; } } /* eliminate row */ /*------------------------------------------------------------------------- * In order to do the elimination in the correct order we must select the * smallest column index among iL[k], k = j, j+1, ..., lenl-1. For ILU(0), * no new fill-ins are expect, so we can pre-sort iL and wL prior to the * entering the elimination loop. *-----------------------------------------------------------------------*/ // hypre_quickSortIR(iL, wL, iw, 0, (lenl-1)); hypre_qsort3ir(iL, wL, iw, 0, (lenl - 1)); for (j = 0; j < lenl; j++) { jpiv = iL[j]; /* get factor/ pivot element */ dpiv = wL[j] * D_data[jpiv]; /* store entry in L */ wL[j] = dpiv; /* zero out element - reset pivot */ iw[jpiv] = -1; /* combine current row and pivot row */ for (k = U_diag_i[jpiv]; k < U_diag_i[jpiv + 1]; k++) { col = U_diag_j[k]; jpos = iw[col]; /* Only fill-in nonzero pattern (jpos != 0) */ if (jpos < 0) { drop = drop - U_diag_data[k] * dpiv; continue; } lxu = - U_diag_data[k] * dpiv; if (col < ii) { /* dealing with L part */ wL[jpos] += lxu; } else if (col > ii) { /* dealing with U part */ wU[jpos] += lxu; } else { /* diagonal update */ dd += lxu; } } } /* modify when necessary */ if (modified) { dd = dd + drop; } /* restore iw (only need to restore diagonal and U part */ iw[ii] = -1; for (j = 0; j < lenu; j++) { iw[iU[j]] = -1; } /* Update LDU factors */ /* L part */ /* Check that memory is sufficient */ if (lenl > 0) { while ((ctrL + lenl) > capacity_L) { HYPRE_Int tmp = capacity_L; capacity_L = (HYPRE_Int)(capacity_L * EXPAND_FACT + 1); L_diag_j = hypre_TReAlloc_v2(L_diag_j, HYPRE_Int, tmp, HYPRE_Int, capacity_L, memory_location); L_diag_data = hypre_TReAlloc_v2(L_diag_data, HYPRE_Real, tmp, HYPRE_Real, capacity_L, memory_location); } hypre_TMemcpy(&L_diag_j[ctrL], iL, HYPRE_Int, lenl, memory_location, HYPRE_MEMORY_HOST); hypre_TMemcpy(&L_diag_data[ctrL], wL, HYPRE_Real, lenl, memory_location, HYPRE_MEMORY_HOST); } L_diag_i[ii + 1] = (ctrL += lenl); /* diagonal part (we store the inverse) */ if (hypre_abs(dd) < MAT_TOL) { dd = 1.0e-6; } D_data[ii] = 1. / dd; /* U part */ /* Check that memory is sufficient */ if (lenu > 0) { while ((ctrU + lenu) > capacity_U) { HYPRE_Int tmp = capacity_U; capacity_U = (HYPRE_Int)(capacity_U * EXPAND_FACT + 1); U_diag_j = hypre_TReAlloc_v2(U_diag_j, HYPRE_Int, tmp, HYPRE_Int, capacity_U, memory_location); U_diag_data = hypre_TReAlloc_v2(U_diag_data, HYPRE_Real, tmp, HYPRE_Real, capacity_U, memory_location); } hypre_TMemcpy(&U_diag_j[ctrU], iU, HYPRE_Int, lenu, memory_location, HYPRE_MEMORY_HOST); hypre_TMemcpy(&U_diag_data[ctrU], wU, HYPRE_Real, lenu, memory_location, HYPRE_MEMORY_HOST); } U_diag_i[ii + 1] = (ctrU += lenu); /* check and build u_end array */ if (m > 0) { hypre_qsort1(U_diag_j, U_diag_data, U_diag_i[ii], U_diag_i[ii + 1] - 1); hypre_BinarySearch2(U_diag_j, nLU, U_diag_i[ii], U_diag_i[ii + 1] - 1, u_end_array + ii); } else { /* Everything is in U */ u_end_array[ii] = ctrU; } } /*--------- Begin Factorization in Schur Complement part ----*/ for (ii = nLU; ii < n; ii++) { // get row i i = perm[ii]; // get extents of row i k1 = A_diag_i[i]; k2 = A_diag_i[i + 1]; drop = 0.0; /*-------------------- unpack L & U-parts of row of A in arrays w */ iU = iL + nLU + 1; wU = wL + nLU + 1; /*-------------------- diagonal entry */ dd = 0.0; lenl = lenu = 0; iw[ii] = nLU; /*-------------------- scan & unwrap column */ for (j = k1; j < k2; j++) { col = rperm[A_diag_j[j]]; t = A_diag_data[j]; if ( col < nLU ) { iw[col] = lenl; iL[lenl] = col; wL[lenl++] = t; } else if (col != ii) { iw[col] = lenu; iU[lenu] = col; wU[lenu++] = t; } else { dd = t; } } /* eliminate row */ /*------------------------------------------------------------------------- * In order to do the elimination in the correct order we must select the * smallest column index among iL[k], k = j, j+1, ..., lenl-1. For ILU(0), * no new fill-ins are expect, so we can pre-sort iL and wL prior to the * entering the elimination loop. *-----------------------------------------------------------------------*/ // hypre_quickSortIR(iL, wL, iw, 0, (lenl-1)); hypre_qsort3ir(iL, wL, iw, 0, (lenl - 1)); for (j = 0; j < lenl; j++) { jpiv = iL[j]; /* get factor/ pivot element */ dpiv = wL[j] * D_data[jpiv]; /* store entry in L */ wL[j] = dpiv; /* zero out element - reset pivot */ iw[jpiv] = -1; /* combine current row and pivot row */ for (k = U_diag_i[jpiv]; k < U_diag_i[jpiv + 1]; k++) { col = U_diag_j[k]; jpos = iw[col]; /* Only fill-in nonzero pattern (jpos != 0) */ if (jpos < 0) { drop = drop - U_diag_data[k] * dpiv; continue; } lxu = - U_diag_data[k] * dpiv; if (col < nLU) { /* dealing with L part */ wL[jpos] += lxu; } else if (col != ii) { /* dealing with U part */ wU[jpos] += lxu; } else { /* diagonal update */ dd += lxu; } } } if (modified) { dd = dd + drop; } /* restore iw (only need to restore diagonal and U part */ iw[ii] = -1; for (j = 0; j < lenu; j++) { iw[iU[j]] = -1; } /* Update LDU factors */ /* L part */ /* Check that memory is sufficient */ if (lenl > 0) { while ((ctrL + lenl) > capacity_L) { HYPRE_Int tmp = capacity_L; capacity_L = (HYPRE_Int)(capacity_L * EXPAND_FACT + 1); L_diag_j = hypre_TReAlloc_v2(L_diag_j, HYPRE_Int, tmp, HYPRE_Int, capacity_L, memory_location); L_diag_data = hypre_TReAlloc_v2(L_diag_data, HYPRE_Real, tmp, HYPRE_Real, capacity_L, memory_location); } hypre_TMemcpy(&L_diag_j[ctrL], iL, HYPRE_Int, lenl, memory_location, HYPRE_MEMORY_HOST); hypre_TMemcpy(&L_diag_data[ctrL], wL, HYPRE_Real, lenl, memory_location, HYPRE_MEMORY_HOST); } L_diag_i[ii + 1] = (ctrL += lenl); /* S part */ /* Check that memory is sufficient */ while ((ctrS + lenu + 1) > capacity_S) { HYPRE_Int tmp = capacity_S; capacity_S = (HYPRE_Int)(capacity_S * EXPAND_FACT + 1); S_diag_j = hypre_TReAlloc_v2(S_diag_j, HYPRE_Int, tmp, HYPRE_Int, capacity_S, memory_location); S_diag_data = hypre_TReAlloc_v2(S_diag_data, HYPRE_Real, tmp, HYPRE_Real, capacity_S, memory_location); } /* remember S in under a new index system! */ S_diag_j[ctrS] = ii - nLU; S_diag_data[ctrS] = dd; for (j = 0; j < lenu; j++) { S_diag_j[ctrS + 1 + j] = iU[j] - nLU; } //hypre_TMemcpy(S_diag_data+ctrS+1, wU, HYPRE_Real, lenu, memory_location, HYPRE_MEMORY_HOST); hypre_TMemcpy(S_diag_data + ctrS + 1, wU, HYPRE_Real, lenu, memory_location, HYPRE_MEMORY_HOST); S_diag_i[ii - nLU + 1] = ctrS += (lenu + 1); } /* Assemble LDUS matrices */ /* zero out unfactored rows for U and D */ for (k = nLU; k < n; k++) { U_diag_i[k + 1] = ctrU; D_data[k] = 1.; } /* First create Schur complement if necessary * Check if we need to create Schur complement */ HYPRE_BigInt big_m = (HYPRE_BigInt)m; hypre_MPI_Allreduce(&big_m, &total_rows, 1, HYPRE_MPI_BIG_INT, hypre_MPI_SUM, comm); /* only form when total_rows > 0 */ if (total_rows > 0) { /* now create S */ /* need to get new column start */ { HYPRE_BigInt global_start; hypre_MPI_Scan(&big_m, &global_start, 1, HYPRE_MPI_BIG_INT, hypre_MPI_SUM, comm); col_starts[0] = global_start - m; col_starts[1] = global_start; } /* We did nothing to A_offd, so all the data kept, just reorder them * The create function takes comm, global num rows/cols, * row/col start, num cols offd, nnz diag, nnz offd */ S_offd_nnz = hypre_CSRMatrixNumNonzeros(A_offd); S_offd_ncols = hypre_CSRMatrixNumCols(A_offd); matS = hypre_ParCSRMatrixCreate( comm, total_rows, total_rows, col_starts, col_starts, S_offd_ncols, ctrS, S_offd_nnz); /* first put diagonal data in */ S_diag = hypre_ParCSRMatrixDiag(matS); hypre_CSRMatrixI(S_diag) = S_diag_i; hypre_CSRMatrixData(S_diag) = S_diag_data; hypre_CSRMatrixJ(S_diag) = S_diag_j; /* now start to construct offdiag of S */ S_offd = hypre_ParCSRMatrixOffd(matS); S_offd_i = hypre_TAlloc(HYPRE_Int, m + 1, memory_location); S_offd_j = hypre_TAlloc(HYPRE_Int, S_offd_nnz, memory_location); S_offd_data = hypre_TAlloc(HYPRE_Real, S_offd_nnz, memory_location); S_offd_colmap = hypre_CTAlloc(HYPRE_BigInt, S_offd_ncols, HYPRE_MEMORY_HOST); /* simply use a loop to copy data from A_offd */ S_offd_i[0] = 0; k3 = 0; for (i = 1; i <= e; i++) { S_offd_i[i] = k3; } for (i = 0; i < m_e; i++) { col = perm[i + nI]; k1 = A_offd_i[col]; k2 = A_offd_i[col + 1]; for (j = k1; j < k2; j++) { S_offd_j[k3] = A_offd_j[j]; S_offd_data[k3++] = A_offd_data[j]; } S_offd_i[i + 1 + e] = k3; } /* give I, J, DATA to S_offd */ hypre_CSRMatrixI(S_offd) = S_offd_i; hypre_CSRMatrixJ(S_offd) = S_offd_j; hypre_CSRMatrixData(S_offd) = S_offd_data; /* now we need to update S_offd_colmap */ /* get total num of send */ num_sends = hypre_ParCSRCommPkgNumSends(comm_pkg); begin = hypre_ParCSRCommPkgSendMapStart(comm_pkg, 0); end = hypre_ParCSRCommPkgSendMapStart(comm_pkg, num_sends); send_buf = hypre_TAlloc(HYPRE_BigInt, end - begin, HYPRE_MEMORY_HOST); /* copy new index into send_buf */ for (i = begin; i < end; i++) { send_buf[i - begin] = rperm[hypre_ParCSRCommPkgSendMapElmt(comm_pkg, i)] - nLU + col_starts[0]; } /* main communication */ comm_handle = hypre_ParCSRCommHandleCreate(21, comm_pkg, send_buf, S_offd_colmap); hypre_ParCSRCommHandleDestroy(comm_handle); /* setup index */ hypre_ParCSRMatrixColMapOffd(matS) = S_offd_colmap; hypre_ILUSortOffdColmap(matS); /* free */ hypre_TFree(send_buf, HYPRE_MEMORY_HOST); } /* end of forming S */ /* create S finished */ matL = hypre_ParCSRMatrixCreate( comm, hypre_ParCSRMatrixGlobalNumRows(A), hypre_ParCSRMatrixGlobalNumRows(A), hypre_ParCSRMatrixRowStarts(A), hypre_ParCSRMatrixColStarts(A), 0, ctrL, 0 ); L_diag = hypre_ParCSRMatrixDiag(matL); hypre_CSRMatrixI(L_diag) = L_diag_i; if (ctrL) { hypre_CSRMatrixData(L_diag) = L_diag_data; hypre_CSRMatrixJ(L_diag) = L_diag_j; } else { /* we've allocated some memory, so free if not used */ hypre_TFree(L_diag_j, memory_location); hypre_TFree(L_diag_data, memory_location); } /* store (global) total number of nonzeros */ local_nnz = (HYPRE_Real) ctrL; hypre_MPI_Allreduce(&local_nnz, &total_nnz, 1, HYPRE_MPI_REAL, hypre_MPI_SUM, comm); hypre_ParCSRMatrixDNumNonzeros(matL) = total_nnz; matU = hypre_ParCSRMatrixCreate( comm, hypre_ParCSRMatrixGlobalNumRows(A), hypre_ParCSRMatrixGlobalNumRows(A), hypre_ParCSRMatrixRowStarts(A), hypre_ParCSRMatrixColStarts(A), 0, ctrU, 0 ); U_diag = hypre_ParCSRMatrixDiag(matU); hypre_CSRMatrixI(U_diag) = U_diag_i; if (ctrU) { hypre_CSRMatrixData(U_diag) = U_diag_data; hypre_CSRMatrixJ(U_diag) = U_diag_j; } else { /* we've allocated some memory, so free if not used */ hypre_TFree(U_diag_j, memory_location); hypre_TFree(U_diag_data, memory_location); } /* store (global) total number of nonzeros */ local_nnz = (HYPRE_Real) ctrU; hypre_MPI_Allreduce(&local_nnz, &total_nnz, 1, HYPRE_MPI_REAL, hypre_MPI_SUM, comm); hypre_ParCSRMatrixDNumNonzeros(matU) = total_nnz; /* free memory */ hypre_TFree(wL, HYPRE_MEMORY_HOST); hypre_TFree(iw, HYPRE_MEMORY_HOST); if (!matS) { /* we allocate some memory for S, need to free if unused */ hypre_TFree(S_diag_i, memory_location); } if (!permp) { hypre_TFree(perm, memory_location); } if (!qpermp) { hypre_TFree(qperm, memory_location); } /* set matrix pointers */ *Lptr = matL; *Dptr = D_data; *Uptr = matU; *Sptr = matS; *u_end = u_end_array; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_ILUSetupILUKSymbolic * * Setup ILU(k) symbolic factorization * * n = total rows of input * lfil = level of fill-in, the k in ILU(k) * perm = permutation array indicating ordering of factorization. * rperm = reverse permutation array, used here to avoid duplicate memory allocation * iw = working array, used here to avoid duplicate memory allocation * nLU = size of computed LDU factorization. * A/L/U/S_diag_i = the I slot of A, L, U and S * A/L/U/S_diag_j = the J slot of A, L, U and S * * Will form global Schur Matrix if nLU < n *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ILUSetupILUKSymbolic(HYPRE_Int n, HYPRE_Int *A_diag_i, HYPRE_Int *A_diag_j, HYPRE_Int lfil, HYPRE_Int *perm, HYPRE_Int *rperm, HYPRE_Int *iw, HYPRE_Int nLU, HYPRE_Int *L_diag_i, HYPRE_Int *U_diag_i, HYPRE_Int *S_diag_i, HYPRE_Int **L_diag_j, HYPRE_Int **U_diag_j, HYPRE_Int **S_diag_j, HYPRE_Int **u_end) { /* * 1: Setup and create buffers * A_diag_*: tempory pointer for the diagonal matrix of A and its '*' slot * ii: outer loop from 0 to nLU - 1 * i: the real col number in diag inside the outer loop * iw: working array store the reverse of active col number * iL: working array store the active col number * iLev: working array store the active level of current row * lenl/u: current position in iw and so * ctrL/U/S: global position in J */ HYPRE_Int *temp_L_diag_j, *temp_U_diag_j, *temp_S_diag_j = NULL, *u_levels; HYPRE_Int *iL, *iLev; HYPRE_Int ii, i, j, k, ku, lena, lenl, lenu, lenh, ilev, lev, col, icol; HYPRE_Int m = n - nLU; HYPRE_Int *u_end_array; /* memory management */ HYPRE_Int ctrL; HYPRE_Int ctrU; HYPRE_Int ctrS; HYPRE_Int capacity_L; HYPRE_Int capacity_U; HYPRE_Int capacity_S = 0; HYPRE_Int initial_alloc = 0; HYPRE_Int nnz_A; HYPRE_MemoryLocation memory_location; /* Get default memory location */ HYPRE_GetMemoryLocation(&memory_location); /* set iL and iLev to right place in iw array */ iL = iw + n; iLev = iw + 2 * n; /* setup initial memory used */ nnz_A = A_diag_i[n]; if (n > 0) { initial_alloc = (HYPRE_Int)(nLU + hypre_ceil((nnz_A / 2.0) * nLU / n)); } capacity_L = initial_alloc; capacity_U = initial_alloc; /* allocate other memory for L and U struct */ temp_L_diag_j = hypre_CTAlloc(HYPRE_Int, capacity_L, memory_location); temp_U_diag_j = hypre_CTAlloc(HYPRE_Int, capacity_U, memory_location); if (m > 0) { capacity_S = (HYPRE_Int)(m + hypre_ceil(nnz_A / 2.0 * m / n)); temp_S_diag_j = hypre_CTAlloc(HYPRE_Int, capacity_S, memory_location); } u_end_array = hypre_TAlloc(HYPRE_Int, nLU, HYPRE_MEMORY_HOST); u_levels = hypre_CTAlloc(HYPRE_Int, capacity_U, HYPRE_MEMORY_HOST); ctrL = ctrU = ctrS = 0; /* set initial value for working array */ for (ii = 0 ; ii < n; ii++) { iw[ii] = -1; } /* * 2: Start of main loop * those in iL are NEW col index (after permutation) */ for (ii = 0; ii < nLU; ii++) { i = perm[ii]; lenl = 0; lenh = 0;/* this is the current length of heap */ lenu = ii; lena = A_diag_i[i + 1]; /* put those already inside original pattern, and set their level to 0 */ for (j = A_diag_i[i]; j < lena; j++) { /* get the neworder of that col */ col = rperm[A_diag_j[j]]; if (col < ii) { /* * this is an entry in L * we maintain a heap structure for L part */ iL[lenh] = col; iLev[lenh] = 0; iw[col] = lenh++; /*now miantian a heap structure*/ hypre_ILUMinHeapAddIIIi(iL, iLev, iw, lenh); } else if (col > ii) { /* this is an entry in U */ iL[lenu] = col; iLev[lenu] = 0; iw[col] = lenu++; } }/* end of j loop for adding pattern in original matrix */ /* * search lower part of current row and update pattern based on level */ while (lenh > 0) { /* * k is now the new col index after permutation * the first element of the heap is the smallest */ k = iL[0]; ilev = iLev[0]; /* * we now need to maintain the heap structure */ hypre_ILUMinHeapRemoveIIIi(iL, iLev, iw, lenh); lenh--; /* copy to the end of array */ lenl++; /* reset iw for that, not using anymore */ iw[k] = -1; hypre_swap2i(iL, iLev, ii - lenl, lenh); /* * now the elimination on current row could start. * eliminate row k (new index) from current row */ ku = U_diag_i[k + 1]; for (j = U_diag_i[k]; j < ku; j++) { col = temp_U_diag_j[j]; lev = u_levels[j] + ilev + 1; /* ignore large level */ icol = iw[col]; /* skill large level */ if (lev > lfil) { continue; } if (icol < 0) { /* not yet in */ if (col < ii) { /* * if we add to the left L, we need to maintian the * heap structure */ iL[lenh] = col; iLev[lenh] = lev; iw[col] = lenh++; /*swap it with the element right after the heap*/ /* maintain the heap */ hypre_ILUMinHeapAddIIIi(iL, iLev, iw, lenh); } else if (col > ii) { iL[lenu] = col; iLev[lenu] = lev; iw[col] = lenu++; } } else { iLev[icol] = hypre_min(lev, iLev[icol]); } }/* end of loop j for level update */ }/* end of while loop for iith row */ /* now update everything, indices, levels and so */ L_diag_i[ii + 1] = L_diag_i[ii] + lenl; if (lenl > 0) { /* check if memory is enough */ while (ctrL + lenl > capacity_L) { HYPRE_Int tmp = capacity_L; capacity_L = (HYPRE_Int)(capacity_L * EXPAND_FACT + 1); temp_L_diag_j = hypre_TReAlloc_v2(temp_L_diag_j, HYPRE_Int, tmp, HYPRE_Int, capacity_L, memory_location); } /* now copy L data, reverse order */ for (j = 0; j < lenl; j++) { temp_L_diag_j[ctrL + j] = iL[ii - j - 1]; } ctrL += lenl; } k = lenu - ii; U_diag_i[ii + 1] = U_diag_i[ii] + k; if (k > 0) { /* check if memory is enough */ while (ctrU + k > capacity_U) { HYPRE_Int tmp = capacity_U; capacity_U = (HYPRE_Int)(capacity_U * EXPAND_FACT + 1); temp_U_diag_j = hypre_TReAlloc_v2(temp_U_diag_j, HYPRE_Int, tmp, HYPRE_Int, capacity_U, memory_location); u_levels = hypre_TReAlloc_v2(u_levels, HYPRE_Int, tmp, HYPRE_Int, capacity_U, HYPRE_MEMORY_HOST); } //hypre_TMemcpy(temp_U_diag_j+ctrU,iL+ii,HYPRE_Int,k,memory_location,HYPRE_MEMORY_HOST); hypre_TMemcpy(temp_U_diag_j + ctrU, iL + ii, HYPRE_Int, k, memory_location, HYPRE_MEMORY_HOST); hypre_TMemcpy(u_levels + ctrU, iLev + ii, HYPRE_Int, k, HYPRE_MEMORY_HOST, HYPRE_MEMORY_HOST); ctrU += k; } if (m > 0) { hypre_qsort2i(temp_U_diag_j, u_levels, U_diag_i[ii], U_diag_i[ii + 1] - 1); hypre_BinarySearch2(temp_U_diag_j, nLU, U_diag_i[ii], U_diag_i[ii + 1] - 1, u_end_array + ii); } else { /* Everything is in U */ u_end_array[ii] = ctrU; } /* reset iw */ for (j = ii; j < lenu; j++) { iw[iL[j]] = -1; } }/* end of main loop ii from 0 to nLU-1 */ /* another loop to set EU^-1 and Schur complement */ for (ii = nLU; ii < n; ii++) { i = perm[ii]; lenl = 0; lenh = 0;/* this is the current length of heap */ lenu = nLU;/* now this stores S, start from nLU */ lena = A_diag_i[i + 1]; /* put those already inside original pattern, and set their level to 0 */ for (j = A_diag_i[i]; j < lena; j++) { /* get the neworder of that col */ col = rperm[A_diag_j[j]]; if (col < nLU) { /* * this is an entry in L * we maintain a heap structure for L part */ iL[lenh] = col; iLev[lenh] = 0; iw[col] = lenh++; /*now miantian a heap structure*/ hypre_ILUMinHeapAddIIIi(iL, iLev, iw, lenh); } else if (col != ii) /* we for sure to add ii, avoid duplicate */ { /* this is an entry in S */ iL[lenu] = col; iLev[lenu] = 0; iw[col] = lenu++; } }/* end of j loop for adding pattern in original matrix */ /* * search lower part of current row and update pattern based on level */ while (lenh > 0) { /* * k is now the new col index after permutation * the first element of the heap is the smallest */ k = iL[0]; ilev = iLev[0]; /* * we now need to maintain the heap structure */ hypre_ILUMinHeapRemoveIIIi(iL, iLev, iw, lenh); lenh--; /* copy to the end of array */ lenl++; /* reset iw for that, not using anymore */ iw[k] = -1; hypre_swap2i(iL, iLev, nLU - lenl, lenh); /* * now the elimination on current row could start. * eliminate row k (new index) from current row */ ku = U_diag_i[k + 1]; for (j = U_diag_i[k]; j < ku; j++) { col = temp_U_diag_j[j]; lev = u_levels[j] + ilev + 1; /* ignore large level */ icol = iw[col]; /* skill large level */ if (lev > lfil) { continue; } if (icol < 0) { /* not yet in */ if (col < nLU) { /* * if we add to the left L, we need to maintian the * heap structure */ iL[lenh] = col; iLev[lenh] = lev; iw[col] = lenh++; /*swap it with the element right after the heap*/ /* maintain the heap */ hypre_ILUMinHeapAddIIIi(iL, iLev, iw, lenh); } else if (col != ii) { /* S part */ iL[lenu] = col; iLev[lenu] = lev; iw[col] = lenu++; } } else { iLev[icol] = hypre_min(lev, iLev[icol]); } }/* end of loop j for level update */ }/* end of while loop for iith row */ /* now update everything, indices, levels and so */ L_diag_i[ii + 1] = L_diag_i[ii] + lenl; if (lenl > 0) { /* check if memory is enough */ while (ctrL + lenl > capacity_L) { HYPRE_Int tmp = capacity_L; capacity_L = (HYPRE_Int)(capacity_L * EXPAND_FACT + 1); temp_L_diag_j = hypre_TReAlloc_v2(temp_L_diag_j, HYPRE_Int, tmp, HYPRE_Int, capacity_L, memory_location); } /* now copy L data, reverse order */ for (j = 0; j < lenl; j++) { temp_L_diag_j[ctrL + j] = iL[nLU - j - 1]; } ctrL += lenl; } k = lenu - nLU + 1; /* check if memory is enough */ while (ctrS + k > capacity_S) { HYPRE_Int tmp = capacity_S; capacity_S = (HYPRE_Int)(capacity_S * EXPAND_FACT + 1); temp_S_diag_j = hypre_TReAlloc_v2(temp_S_diag_j, HYPRE_Int, tmp, HYPRE_Int, capacity_S, memory_location); } temp_S_diag_j[ctrS] = ii;/* must have diagonal */ //hypre_TMemcpy(temp_S_diag_j+ctrS+1,iL+nLU,HYPRE_Int,k-1,memory_location,HYPRE_MEMORY_HOST); hypre_TMemcpy(temp_S_diag_j + ctrS + 1, iL + nLU, HYPRE_Int, k - 1, memory_location, HYPRE_MEMORY_HOST); ctrS += k; S_diag_i[ii - nLU + 1] = ctrS; /* reset iw */ for (j = nLU; j < lenu; j++) { iw[iL[j]] = -1; } }/* end of main loop ii from nLU to n-1 */ /* * 3: Update the struct for L, U and S */ for (k = nLU; k < n; k++) { U_diag_i[k + 1] = U_diag_i[nLU]; } /* * 4: Finishing up and free memory */ hypre_TFree(u_levels, HYPRE_MEMORY_HOST); *L_diag_j = temp_L_diag_j; *U_diag_j = temp_U_diag_j; *S_diag_j = temp_S_diag_j; *u_end = u_end_array; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_ILUSetupILUK * * Setup ILU(k) numeric factorization * * A: input matrix * lfil: level of fill-in, the k in ILU(k) * permp: permutation array indicating ordering of factorization. * Perm could come from a CF_marker array or a reordering routine. * qpermp: column permutation array. * nLU: size of computed LDU factorization. * nI: number of interial unknowns, nI should obey nI >= nLU * Lptr, Dptr, Uptr: L, D, U factors. * Sprt: Schur Complement, if no Schur Complement, it will be set to NULL *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ILUSetupILUK(hypre_ParCSRMatrix *A, HYPRE_Int lfil, HYPRE_Int *permp, HYPRE_Int *qpermp, HYPRE_Int nLU, HYPRE_Int nI, hypre_ParCSRMatrix **Lptr, HYPRE_Real **Dptr, hypre_ParCSRMatrix **Uptr, hypre_ParCSRMatrix **Sptr, HYPRE_Int **u_end) { /* * 1: Setup and create buffers * matL/U: the ParCSR matrix for L and U * L/U_diag: the diagonal csr matrix of matL/U * A_diag_*: tempory pointer for the diagonal matrix of A and its '*' slot * ii = outer loop from 0 to nLU - 1 * i = the real col number in diag inside the outer loop * iw = working array store the reverse of active col number * iL = working array store the active col number */ /* call ILU0 if lfil is 0 */ if (lfil == 0) { return hypre_ILUSetupILU0( A, permp, qpermp, nLU, nI, Lptr, Dptr, Uptr, Sptr, u_end); } HYPRE_Real local_nnz, total_nnz; HYPRE_Int i, ii, j, k, k1, k2, k3, kl, ku, jpiv, col, icol; HYPRE_Int *iw; MPI_Comm comm = hypre_ParCSRMatrixComm(A); HYPRE_Int num_procs, my_id; /* data objects for A */ hypre_CSRMatrix *A_diag = hypre_ParCSRMatrixDiag(A); hypre_CSRMatrix *A_offd = hypre_ParCSRMatrixOffd(A); HYPRE_Real *A_diag_data = hypre_CSRMatrixData(A_diag); HYPRE_Int *A_diag_i = hypre_CSRMatrixI(A_diag); HYPRE_Int *A_diag_j = hypre_CSRMatrixJ(A_diag); HYPRE_Real *A_offd_data = hypre_CSRMatrixData(A_offd); HYPRE_Int *A_offd_i = hypre_CSRMatrixI(A_offd); HYPRE_Int *A_offd_j = hypre_CSRMatrixJ(A_offd); HYPRE_MemoryLocation memory_location = hypre_ParCSRMatrixMemoryLocation(A); /* data objects for L, D, U */ hypre_ParCSRMatrix *matL; hypre_ParCSRMatrix *matU; hypre_CSRMatrix *L_diag; hypre_CSRMatrix *U_diag; HYPRE_Real *D_data; HYPRE_Real *L_diag_data = NULL; HYPRE_Int *L_diag_i; HYPRE_Int *L_diag_j = NULL; HYPRE_Real *U_diag_data = NULL; HYPRE_Int *U_diag_i; HYPRE_Int *U_diag_j = NULL; /* data objects for S */ hypre_ParCSRMatrix *matS = NULL; hypre_CSRMatrix *S_diag; hypre_CSRMatrix *S_offd; HYPRE_Real *S_diag_data = NULL; HYPRE_Int *S_diag_i = NULL; HYPRE_Int *S_diag_j = NULL; HYPRE_Int *S_offd_i = NULL; HYPRE_Int *S_offd_j = NULL; HYPRE_BigInt *S_offd_colmap = NULL; HYPRE_Real *S_offd_data; HYPRE_Int S_offd_nnz, S_offd_ncols; HYPRE_BigInt col_starts[2]; HYPRE_BigInt total_rows; /* communication */ hypre_ParCSRCommPkg *comm_pkg; hypre_ParCSRCommHandle *comm_handle; HYPRE_BigInt *send_buf = NULL; /* problem size */ HYPRE_Int n; HYPRE_Int m; HYPRE_Int e; HYPRE_Int m_e; /* reverse permutation array */ HYPRE_Int *rperm; HYPRE_Int *perm, *qperm; /* start setup */ /* check input and get problem size */ n = hypre_CSRMatrixNumRows(A_diag); if (nLU < 0 || nLU > n) { hypre_error_w_msg(HYPRE_ERROR_ARG, "WARNING: nLU out of range.\n"); } m = n - nLU; e = nI - nLU; m_e = n - nI; if (e < 0) { hypre_error_w_msg(HYPRE_ERROR_ARG, "WARNING: nLU should not exceed nI.\n"); } /* Init I array anyway. S's might be freed later */ D_data = hypre_CTAlloc(HYPRE_Real, n, memory_location); L_diag_i = hypre_CTAlloc(HYPRE_Int, (n + 1), memory_location); U_diag_i = hypre_CTAlloc(HYPRE_Int, (n + 1), memory_location); S_diag_i = hypre_CTAlloc(HYPRE_Int, (m + 1), memory_location); /* set Comm_Pkg if not yet built */ hypre_MPI_Comm_size(comm, &num_procs); hypre_MPI_Comm_rank(comm, &my_id); comm_pkg = hypre_ParCSRMatrixCommPkg(A); if (!comm_pkg) { hypre_MatvecCommPkgCreate(A); comm_pkg = hypre_ParCSRMatrixCommPkg(A); } /* * 2: Symbolic factorization * setup iw and rperm first */ /* allocate work arrays */ iw = hypre_CTAlloc(HYPRE_Int, 4 * n, HYPRE_MEMORY_HOST); rperm = iw + 3 * n; L_diag_i[0] = U_diag_i[0] = S_diag_i[0] = 0; /* get reverse permutation (rperm). * rperm holds the reordered indexes. */ if (!permp) { perm = hypre_TAlloc(HYPRE_Int, n, memory_location); for (i = 0; i < n; i++) { perm[i] = i; } } else { perm = permp; } if (!qpermp) { qperm = hypre_TAlloc(HYPRE_Int, n, memory_location); for (i = 0; i < n; i++) { qperm[i] = i; } } else { qperm = qpermp; } for (i = 0; i < n; i++) { rperm[qperm[i]] = i; } /* do symbolic factorization */ hypre_ILUSetupILUKSymbolic(n, A_diag_i, A_diag_j, lfil, perm, rperm, iw, nLU, L_diag_i, U_diag_i, S_diag_i, &L_diag_j, &U_diag_j, &S_diag_j, u_end); /* * after this, we have our I,J for L, U and S ready, and L sorted * iw are still -1 after symbolic factorization * now setup helper array here */ if (L_diag_i[n]) { L_diag_data = hypre_CTAlloc(HYPRE_Real, L_diag_i[n], memory_location); } if (U_diag_i[n]) { U_diag_data = hypre_CTAlloc(HYPRE_Real, U_diag_i[n], memory_location); } if (S_diag_i[m]) { S_diag_data = hypre_CTAlloc(HYPRE_Real, S_diag_i[m], memory_location); } /* * 3: Begin real factorization * we already have L and U structure ready, so no extra working array needed */ /* first loop for upper part */ for (ii = 0; ii < nLU; ii++) { // get row i i = perm[ii]; kl = L_diag_i[ii + 1]; ku = U_diag_i[ii + 1]; k1 = A_diag_i[i]; k2 = A_diag_i[i + 1]; /* set up working arrays */ for (j = L_diag_i[ii]; j < kl; j++) { col = L_diag_j[j]; iw[col] = j; } D_data[ii] = 0.0; iw[ii] = ii; for (j = U_diag_i[ii]; j < ku; j++) { col = U_diag_j[j]; iw[col] = j; } /* copy data from A into L, D and U */ for (j = k1; j < k2; j++) { /* compute everything in new index */ col = rperm[A_diag_j[j]]; icol = iw[col]; /* A for sure to be inside the pattern */ if (col < ii) { L_diag_data[icol] = A_diag_data[j]; } else if (col == ii) { D_data[ii] = A_diag_data[j]; } else { U_diag_data[icol] = A_diag_data[j]; } } /* elimination */ for (j = L_diag_i[ii]; j < kl; j++) { jpiv = L_diag_j[j]; L_diag_data[j] *= D_data[jpiv]; ku = U_diag_i[jpiv + 1]; for (k = U_diag_i[jpiv]; k < ku; k++) { col = U_diag_j[k]; icol = iw[col]; if (icol < 0) { /* not in partern */ continue; } if (col < ii) { /* L part */ L_diag_data[icol] -= L_diag_data[j] * U_diag_data[k]; } else if (col == ii) { /* diag part */ D_data[icol] -= L_diag_data[j] * U_diag_data[k]; } else { /* U part */ U_diag_data[icol] -= L_diag_data[j] * U_diag_data[k]; } } } /* reset working array */ ku = U_diag_i[ii + 1]; for (j = L_diag_i[ii]; j < kl; j++) { col = L_diag_j[j]; iw[col] = -1; } iw[ii] = -1; for (j = U_diag_i[ii]; j < ku ; j++) { col = U_diag_j[j]; iw[col] = -1; } /* diagonal part (we store the inverse) */ if (hypre_abs(D_data[ii]) < MAT_TOL) { D_data[ii] = 1.0e-06; } D_data[ii] = 1. / D_data[ii]; } /* Now lower part for Schur complement */ for (ii = nLU; ii < n; ii++) { // get row i i = perm[ii]; kl = L_diag_i[ii + 1]; ku = S_diag_i[ii - nLU + 1]; k1 = A_diag_i[i]; k2 = A_diag_i[i + 1]; /* set up working arrays */ for (j = L_diag_i[ii]; j < kl; j++) { col = L_diag_j[j]; iw[col] = j; } for (j = S_diag_i[ii - nLU]; j < ku; j++) { col = S_diag_j[j]; iw[col] = j; } /* copy data from A into L, and S */ for (j = k1; j < k2; j++) { /* compute everything in new index */ col = rperm[A_diag_j[j]]; icol = iw[col]; /* A for sure to be inside the pattern */ if (col < nLU) { L_diag_data[icol] = A_diag_data[j]; } else { S_diag_data[icol] = A_diag_data[j]; } } /* elimination */ for (j = L_diag_i[ii]; j < kl; j++) { jpiv = L_diag_j[j]; L_diag_data[j] *= D_data[jpiv]; ku = U_diag_i[jpiv + 1]; for (k = U_diag_i[jpiv]; k < ku; k++) { col = U_diag_j[k]; icol = iw[col]; if (icol < 0) { /* not in partern */ continue; } if (col < nLU) { /* L part */ L_diag_data[icol] -= L_diag_data[j] * U_diag_data[k]; } else { /* S part */ S_diag_data[icol] -= L_diag_data[j] * U_diag_data[k]; } } } /* reset working array */ for (j = L_diag_i[ii]; j < kl ; j++) { col = L_diag_j[j]; iw[col] = -1; } ku = S_diag_i[ii - nLU + 1]; for (j = S_diag_i[ii - nLU]; j < ku; j++) { col = S_diag_j[j]; iw[col] = -1; /* remember to update index, S is smaller! */ S_diag_j[j] -= nLU; } } /* * 4: Finishing up and free */ /* First create Schur complement if necessary * Check if we need to create Schur complement */ HYPRE_BigInt big_m = (HYPRE_BigInt)m; hypre_MPI_Allreduce(&big_m, &total_rows, 1, HYPRE_MPI_BIG_INT, hypre_MPI_SUM, comm); /* only form when total_rows > 0 */ if ( total_rows > 0 ) { /* now create S */ /* need to get new column start */ { HYPRE_BigInt global_start; hypre_MPI_Scan(&big_m, &global_start, 1, HYPRE_MPI_BIG_INT, hypre_MPI_SUM, comm); col_starts[0] = global_start - m; col_starts[1] = global_start; } /* We did nothing to A_offd, so all the data kept, just reorder them * The create function takes comm, global num rows/cols, * row/col start, num cols offd, nnz diag, nnz offd */ S_offd_nnz = hypre_CSRMatrixNumNonzeros(A_offd); S_offd_ncols = hypre_CSRMatrixNumCols(A_offd); matS = hypre_ParCSRMatrixCreate( comm, total_rows, total_rows, col_starts, col_starts, S_offd_ncols, S_diag_i[m], S_offd_nnz); /* first put diagonal data in */ S_diag = hypre_ParCSRMatrixDiag(matS); hypre_CSRMatrixI(S_diag) = S_diag_i; hypre_CSRMatrixData(S_diag) = S_diag_data; hypre_CSRMatrixJ(S_diag) = S_diag_j; /* now start to construct offdiag of S */ S_offd = hypre_ParCSRMatrixOffd(matS); S_offd_i = hypre_TAlloc(HYPRE_Int, m + 1, memory_location); S_offd_j = hypre_TAlloc(HYPRE_Int, S_offd_nnz, memory_location); S_offd_data = hypre_TAlloc(HYPRE_Real, S_offd_nnz, memory_location); S_offd_colmap = hypre_CTAlloc(HYPRE_BigInt, S_offd_ncols, HYPRE_MEMORY_HOST); /* simply use a loop to copy data from A_offd */ S_offd_i[0] = 0; k3 = 0; for (i = 1; i <= e; i++) { S_offd_i[i + 1] = k3; } for (i = 0; i < m_e; i++) { col = perm[i + nI]; k1 = A_offd_i[col]; k2 = A_offd_i[col + 1]; for (j = k1; j < k2; j++) { S_offd_j[k3] = A_offd_j[j]; S_offd_data[k3++] = A_offd_data[j]; } S_offd_i[i + e + 1] = k3; } /* give I, J, DATA to S_offd */ hypre_CSRMatrixI(S_offd) = S_offd_i; hypre_CSRMatrixJ(S_offd) = S_offd_j; hypre_CSRMatrixData(S_offd) = S_offd_data; /* now we need to update S_offd_colmap */ /* get total num of send */ HYPRE_Int num_sends = hypre_ParCSRCommPkgNumSends(comm_pkg); HYPRE_Int begin = hypre_ParCSRCommPkgSendMapStart(comm_pkg, 0); HYPRE_Int end = hypre_ParCSRCommPkgSendMapStart(comm_pkg, num_sends); send_buf = hypre_TAlloc(HYPRE_BigInt, end - begin, HYPRE_MEMORY_HOST); /* copy new index into send_buf */ for (i = begin; i < end; i++) { send_buf[i - begin] = rperm[hypre_ParCSRCommPkgSendMapElmt(comm_pkg, i)] - nLU + col_starts[0]; } /* main communication */ comm_handle = hypre_ParCSRCommHandleCreate(21, comm_pkg, send_buf, S_offd_colmap); hypre_ParCSRCommHandleDestroy(comm_handle); /* setup index */ hypre_ParCSRMatrixColMapOffd(matS) = S_offd_colmap; hypre_ILUSortOffdColmap(matS); /* free */ hypre_TFree(send_buf, HYPRE_MEMORY_HOST); } /* end of forming S */ /* Assemble LDU matrices */ /* zero out unfactored rows */ for (k = nLU; k < n; k++) { D_data[k] = 1.; } matL = hypre_ParCSRMatrixCreate( comm, hypre_ParCSRMatrixGlobalNumRows(A), hypre_ParCSRMatrixGlobalNumRows(A), hypre_ParCSRMatrixRowStarts(A), hypre_ParCSRMatrixColStarts(A), 0 /* num_cols_offd */, L_diag_i[n], 0 /* num_nonzeros_offd */); L_diag = hypre_ParCSRMatrixDiag(matL); hypre_CSRMatrixI(L_diag) = L_diag_i; if (L_diag_i[n] > 0) { hypre_CSRMatrixData(L_diag) = L_diag_data; hypre_CSRMatrixJ(L_diag) = L_diag_j; } else { /* we allocated some initial length, so free them */ hypre_TFree(L_diag_j, memory_location); } /* store (global) total number of nonzeros */ local_nnz = (HYPRE_Real) (L_diag_i[n]); hypre_MPI_Allreduce(&local_nnz, &total_nnz, 1, HYPRE_MPI_REAL, hypre_MPI_SUM, comm); hypre_ParCSRMatrixDNumNonzeros(matL) = total_nnz; matU = hypre_ParCSRMatrixCreate( comm, hypre_ParCSRMatrixGlobalNumRows(A), hypre_ParCSRMatrixGlobalNumRows(A), hypre_ParCSRMatrixRowStarts(A), hypre_ParCSRMatrixColStarts(A), 0, U_diag_i[n], 0 ); U_diag = hypre_ParCSRMatrixDiag(matU); hypre_CSRMatrixI(U_diag) = U_diag_i; if (U_diag_i[n] > 0) { hypre_CSRMatrixData(U_diag) = U_diag_data; hypre_CSRMatrixJ(U_diag) = U_diag_j; } else { /* we allocated some initial length, so free them */ hypre_TFree(U_diag_j, memory_location); } /* store (global) total number of nonzeros */ local_nnz = (HYPRE_Real) (U_diag_i[n]); hypre_MPI_Allreduce(&local_nnz, &total_nnz, 1, HYPRE_MPI_REAL, hypre_MPI_SUM, comm); hypre_ParCSRMatrixDNumNonzeros(matU) = total_nnz; /* free */ hypre_TFree(iw, HYPRE_MEMORY_HOST); if (!matS) { /* we allocate some memory for S, need to free if unused */ hypre_TFree(S_diag_i, memory_location); } if (!permp) { hypre_TFree(perm, memory_location); } if (!qpermp) { hypre_TFree(qperm, memory_location); } /* set matrix pointers */ *Lptr = matL; *Dptr = D_data; *Uptr = matU; *Sptr = matS; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_ILUSetupILUT * * Setup ILU(t) numeric factorization * * A: input matrix * lfil: maximum nnz per row in L and U * tol: droptol array in ILUT * tol[0]: matrix B * tol[1]: matrix E and F * tol[2]: matrix S * perm: permutation array indicating ordering of factorization. * Perm could come from a CF_marker array or a reordering routine. * qperm: permutation array for column * nLU: size of computed LDU factorization. * If nLU < n, Schur complement will be formed * nI: number of interial unknowns. nLU should obey nLU <= nI. * Lptr, Dptr, Uptr: L, D, U factors. * Sptr: Schur complement * * Keep the largest lfil entries that is greater than some tol relative * to the input tol and the norm of that row in both L and U *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ILUSetupILUT(hypre_ParCSRMatrix *A, HYPRE_Int lfil, HYPRE_Real *tol, HYPRE_Int *permp, HYPRE_Int *qpermp, HYPRE_Int nLU, HYPRE_Int nI, hypre_ParCSRMatrix **Lptr, HYPRE_Real **Dptr, hypre_ParCSRMatrix **Uptr, hypre_ParCSRMatrix **Sptr, HYPRE_Int **u_end) { /* * 1: Setup and create buffers * matL/U: the ParCSR matrix for L and U * L/U_diag: the diagonal csr matrix of matL/U * A_diag_*: tempory pointer for the diagonal matrix of A and its '*' slot * ii = outer loop from 0 to nLU - 1 * i = the real col number in diag inside the outer loop * iw = working array store the reverse of active col number * iL = working array store the active col number */ HYPRE_Real local_nnz, total_nnz; HYPRE_Int i, ii, j, k, k1, k2, k3, kl, ku, col, icol, lenl, lenu, lenhu, lenhlr, lenhll, jpos, jrow; HYPRE_Real inorm, itolb, itolef, itols, dpiv, lxu; HYPRE_Int *iw, *iL; HYPRE_Real *w; /* memory management */ HYPRE_Int ctrL; HYPRE_Int ctrU; HYPRE_Int initial_alloc = 0; HYPRE_Int capacity_L; HYPRE_Int capacity_U; HYPRE_Int ctrS; HYPRE_Int capacity_S = 0; HYPRE_Int nnz_A; /* communication stuffs for S */ MPI_Comm comm = hypre_ParCSRMatrixComm(A); HYPRE_Int S_offd_nnz, S_offd_ncols; hypre_ParCSRCommPkg *comm_pkg; hypre_ParCSRCommHandle *comm_handle; HYPRE_Int num_procs, my_id; HYPRE_BigInt col_starts[2]; HYPRE_BigInt total_rows; HYPRE_Int num_sends; HYPRE_Int begin, end; /* data objects for A */ hypre_CSRMatrix *A_diag = hypre_ParCSRMatrixDiag(A); hypre_CSRMatrix *A_offd = hypre_ParCSRMatrixOffd(A); HYPRE_Real *A_diag_data = hypre_CSRMatrixData(A_diag); HYPRE_Int *A_diag_i = hypre_CSRMatrixI(A_diag); HYPRE_Int *A_diag_j = hypre_CSRMatrixJ(A_diag); HYPRE_Int *A_offd_i = hypre_CSRMatrixI(A_offd); HYPRE_Int *A_offd_j = hypre_CSRMatrixJ(A_offd); HYPRE_Real *A_offd_data = hypre_CSRMatrixData(A_offd); HYPRE_MemoryLocation memory_location = hypre_ParCSRMatrixMemoryLocation(A); /* data objects for L, D, U */ hypre_ParCSRMatrix *matL; hypre_ParCSRMatrix *matU; hypre_CSRMatrix *L_diag; hypre_CSRMatrix *U_diag; HYPRE_Real *D_data; HYPRE_Real *L_diag_data = NULL; HYPRE_Int *L_diag_i; HYPRE_Int *L_diag_j = NULL; HYPRE_Real *U_diag_data = NULL; HYPRE_Int *U_diag_i; HYPRE_Int *U_diag_j = NULL; /* data objects for S */ hypre_ParCSRMatrix *matS = NULL; hypre_CSRMatrix *S_diag; hypre_CSRMatrix *S_offd; HYPRE_Real *S_diag_data = NULL; HYPRE_Int *S_diag_i = NULL; HYPRE_Int *S_diag_j = NULL; HYPRE_Int *S_offd_i = NULL; HYPRE_Int *S_offd_j = NULL; HYPRE_BigInt *S_offd_colmap = NULL; HYPRE_Real *S_offd_data; HYPRE_BigInt *send_buf = NULL; HYPRE_Int *u_end_array; /* reverse permutation */ HYPRE_Int *rperm; HYPRE_Int *perm, *qperm; /* problem size * m is n - nLU, num of rows of local Schur system * m_e is the size of interface nodes * e is the number of interial rows in local Schur Complement */ HYPRE_Int n; HYPRE_Int m; HYPRE_Int e; HYPRE_Int m_e; /* start setup * check input first */ n = hypre_CSRMatrixNumRows(A_diag); if (nLU < 0 || nLU > n) { hypre_error_w_msg(HYPRE_ERROR_ARG, "WARNING: nLU out of range.\n"); } m = n - nLU; e = nI - nLU; m_e = n - nI; if (e < 0) { hypre_error_w_msg(HYPRE_ERROR_ARG, "WARNING: nLU should not exceed nI.\n"); } u_end_array = hypre_TAlloc(HYPRE_Int, nLU, HYPRE_MEMORY_HOST); /* start set up * setup communication stuffs first */ hypre_MPI_Comm_size(comm, &num_procs); hypre_MPI_Comm_rank(comm, &my_id); comm_pkg = hypre_ParCSRMatrixCommPkg(A); /* create if not yet built */ if (!comm_pkg) { hypre_MatvecCommPkgCreate(A); comm_pkg = hypre_ParCSRMatrixCommPkg(A); } /* setup initial memory, in ILUT, just guess with max nnz per row */ nnz_A = A_diag_i[nLU]; if (n > 0) { initial_alloc = (HYPRE_Int)(hypre_min(nLU + hypre_ceil((nnz_A / 2.0) * nLU / n), nLU * lfil)); } capacity_L = initial_alloc; capacity_U = initial_alloc; D_data = hypre_CTAlloc(HYPRE_Real, n, memory_location); L_diag_i = hypre_CTAlloc(HYPRE_Int, (n + 1), memory_location); U_diag_i = hypre_CTAlloc(HYPRE_Int, (n + 1), memory_location); L_diag_j = hypre_CTAlloc(HYPRE_Int, capacity_L, memory_location); U_diag_j = hypre_CTAlloc(HYPRE_Int, capacity_U, memory_location); L_diag_data = hypre_CTAlloc(HYPRE_Real, capacity_L, memory_location); U_diag_data = hypre_CTAlloc(HYPRE_Real, capacity_U, memory_location); ctrL = ctrU = 0; ctrS = 0; S_diag_i = hypre_CTAlloc(HYPRE_Int, (m + 1), memory_location); S_diag_i[0] = 0; /* only setup S part when n > nLU */ if (m > 0) { capacity_S = (HYPRE_Int)(hypre_min(m + hypre_ceil((nnz_A / 2.0) * m / n), m * lfil)); S_diag_j = hypre_CTAlloc(HYPRE_Int, capacity_S, memory_location); S_diag_data = hypre_CTAlloc(HYPRE_Real, capacity_S, memory_location); } /* setting up working array */ iw = hypre_CTAlloc(HYPRE_Int, 3 * n, HYPRE_MEMORY_HOST); iL = iw + n; w = hypre_CTAlloc(HYPRE_Real, n, HYPRE_MEMORY_HOST); for (i = 0; i < n; i++) { iw[i] = -1; } L_diag_i[0] = U_diag_i[0] = 0; /* get reverse permutation (rperm). * rperm holds the reordered indexes. * rperm[old] -> new * perm[new] -> old */ rperm = iw + 2 * n; if (!permp) { perm = hypre_TAlloc(HYPRE_Int, n, memory_location); for (i = 0; i < n; i++) { perm[i] = i; } } else { perm = permp; } if (!qpermp) { qperm = hypre_TAlloc(HYPRE_Int, n, memory_location); for (i = 0; i < n; i++) { qperm[i] = i; } } else { qperm = qpermp; } for (i = 0; i < n; i++) { rperm[perm[i]] = i; } /* * 2: Main loop of elimination * maintain two heaps * |----->*********<-----|-----*********| * |col heap***value heap|value in U****| */ /* main outer loop for upper part */ for (ii = 0; ii < nLU; ii++) { /* get real row with perm */ i = perm[ii]; k1 = A_diag_i[i]; k2 = A_diag_i[i + 1]; kl = ii - 1; /* reset row norm of ith row */ inorm = .0; for (j = k1; j < k2; j++) { inorm += hypre_abs(A_diag_data[j]); } if (inorm == .0) { hypre_error_w_msg(HYPRE_ERROR_ARG, "WARNING: ILUT with zero row.\n"); } inorm /= (HYPRE_Real)(k2 - k1); /* set the scaled tol for that row */ itolb = tol[0] * inorm; itolef = tol[1] * inorm; /* reset displacement */ lenhll = lenhlr = lenu = 0; w[ii] = 0.0; iw[ii] = ii; /* copy in data from A */ for (j = k1; j < k2; j++) { /* get now col number */ col = rperm[A_diag_j[j]]; if (col < ii) { /* L part of it */ iL[lenhll] = col; w[lenhll] = A_diag_data[j]; iw[col] = lenhll++; /* add to heap, by col number */ hypre_ILUMinHeapAddIRIi(iL, w, iw, lenhll); } else if (col == ii) { w[ii] = A_diag_data[j]; } else { lenu++; jpos = lenu + ii; iL[jpos] = col; w[jpos] = A_diag_data[j]; iw[col] = jpos; } } /* * main elimination * need to maintain 2 heaps for L, one heap for col and one heaps for value * maintian an array for U, and do qsplit with quick sort after that * while the heap of col is greater than zero */ while (lenhll > 0) { /* get the next row from top of the heap */ jrow = iL[0]; dpiv = w[0] * D_data[jrow]; w[0] = dpiv; /* now remove it from the top of the heap */ hypre_ILUMinHeapRemoveIRIi(iL, w, iw, lenhll); lenhll--; /* * reset the drop part to -1 * we don't need this iw anymore */ iw[jrow] = -1; /* need to keep this one, move to the end of the heap */ /* no longer need to maintain iw */ hypre_swap2(iL, w, lenhll, kl - lenhlr); lenhlr++; hypre_ILUMaxrHeapAddRabsI(w + kl, iL + kl, lenhlr); /* loop for elimination */ ku = U_diag_i[jrow + 1]; for (j = U_diag_i[jrow]; j < ku; j++) { col = U_diag_j[j]; icol = iw[col]; lxu = - dpiv * U_diag_data[j]; /* we don't want to fill small number to empty place */ if ((icol == -1) && ((col < nLU && hypre_abs(lxu) < itolb) || (col >= nLU && hypre_abs(lxu) < itolef))) { continue; } if (icol == -1) { if (col < ii) { /* L part * not already in L part * put it to the end of heap * might overwrite some small entries, no issue */ iL[lenhll] = col; w[lenhll] = lxu; iw[col] = lenhll++; /* add to heap, by col number */ hypre_ILUMinHeapAddIRIi(iL, w, iw, lenhll); } else if (col == ii) { w[ii] += lxu; } else { /* * not already in U part * put is to the end of heap */ lenu++; jpos = lenu + ii; iL[jpos] = col; w[jpos] = lxu; iw[col] = jpos; } } else { w[icol] += lxu; } } }/* while loop for the elimination of current row */ if (hypre_abs(w[ii]) < MAT_TOL) { w[ii] = 1.0e-06; } D_data[ii] = 1. / w[ii]; iw[ii] = -1; /* * now pick up the largest lfil from L * L part is guarantee to be larger than itol */ lenl = lenhlr < lfil ? lenhlr : lfil; L_diag_i[ii + 1] = L_diag_i[ii] + lenl; if (lenl > 0) { /* test if memory is enough */ while (ctrL + lenl > capacity_L) { HYPRE_Int tmp = capacity_L; capacity_L = (HYPRE_Int)(capacity_L * EXPAND_FACT + 1); L_diag_j = hypre_TReAlloc_v2(L_diag_j, HYPRE_Int, tmp, HYPRE_Int, capacity_L, memory_location); L_diag_data = hypre_TReAlloc_v2(L_diag_data, HYPRE_Real, tmp, HYPRE_Real, capacity_L, memory_location); } ctrL += lenl; /* copy large data in */ for (j = L_diag_i[ii]; j < ctrL; j++) { L_diag_j[j] = iL[kl]; L_diag_data[j] = w[kl]; hypre_ILUMaxrHeapRemoveRabsI(w + kl, iL + kl, lenhlr); lenhlr--; } } /* * now reset working array * L part already reset when move out of heap, only U part */ ku = lenu + ii; for (j = ii + 1; j <= ku; j++) { iw[iL[j]] = -1; } if (lenu < lfil) { /* we simply keep all of the data, no need to sort */ lenhu = lenu; } else { /* need to sort the first small(hopefully) part of it */ lenhu = lfil; /* quick split, only sort the first small part of the array */ hypre_ILUMaxQSplitRabsI(w, iL, ii + 1, ii + lenhu, ii + lenu); } U_diag_i[ii + 1] = U_diag_i[ii] + lenhu; if (lenhu > 0) { /* test if memory is enough */ while (ctrU + lenhu > capacity_U) { HYPRE_Int tmp = capacity_U; capacity_U = (HYPRE_Int)(capacity_U * EXPAND_FACT + 1); U_diag_j = hypre_TReAlloc_v2(U_diag_j, HYPRE_Int, tmp, HYPRE_Int, capacity_U, memory_location); U_diag_data = hypre_TReAlloc_v2(U_diag_data, HYPRE_Real, tmp, HYPRE_Real, capacity_U, memory_location); } ctrU += lenhu; /* copy large data in */ for (j = U_diag_i[ii]; j < ctrU; j++) { jpos = ii + 1 + j - U_diag_i[ii]; U_diag_j[j] = iL[jpos]; U_diag_data[j] = w[jpos]; } } /* check and build u_end array */ if (m > 0) { hypre_qsort1(U_diag_j, U_diag_data, U_diag_i[ii], U_diag_i[ii + 1] - 1); hypre_BinarySearch2(U_diag_j, nLU, U_diag_i[ii], U_diag_i[ii + 1] - 1, u_end_array + ii); } else { /* Everything is in U */ u_end_array[ii] = ctrU; } }/* end of ii loop from 0 to nLU-1 */ /* now main loop for Schur comlement part */ for (ii = nLU; ii < n; ii++) { /* get real row with perm */ i = perm[ii]; k1 = A_diag_i[i]; k2 = A_diag_i[i + 1]; kl = nLU - 1; /* reset row norm of ith row */ inorm = .0; for (j = k1; j < k2; j++) { inorm += hypre_abs(A_diag_data[j]); } if (inorm == .0) { hypre_error_w_msg(HYPRE_ERROR_ARG, "WARNING: ILUT with zero row.\n"); } inorm /= (HYPRE_Real)(k2 - k1); /* set the scaled tol for that row */ itols = tol[2] * inorm; itolef = tol[1] * inorm; /* reset displacement */ lenhll = lenhlr = lenu = 0; /* copy in data from A */ for (j = k1; j < k2; j++) { /* get now col number */ col = rperm[A_diag_j[j]]; if (col < nLU) { /* L part of it */ iL[lenhll] = col; w[lenhll] = A_diag_data[j]; iw[col] = lenhll++; /* add to heap, by col number */ hypre_ILUMinHeapAddIRIi(iL, w, iw, lenhll); } else if (col == ii) { /* the diagonla entry of S */ iL[nLU] = col; w[nLU] = A_diag_data[j]; iw[col] = nLU; } else { /* S part of it */ lenu++; jpos = lenu + nLU; iL[jpos] = col; w[jpos] = A_diag_data[j]; iw[col] = jpos; } } /* * main elimination * need to maintain 2 heaps for L, one heap for col and one heaps for value * maintian an array for S, and do qsplit with quick sort after that * while the heap of col is greater than zero */ while (lenhll > 0) { /* get the next row from top of the heap */ jrow = iL[0]; dpiv = w[0] * D_data[jrow]; w[0] = dpiv; /* now remove it from the top of the heap */ hypre_ILUMinHeapRemoveIRIi(iL, w, iw, lenhll); lenhll--; /* * reset the drop part to -1 * we don't need this iw anymore */ iw[jrow] = -1; /* need to keep this one, move to the end of the heap */ /* no longer need to maintain iw */ hypre_swap2(iL, w, lenhll, kl - lenhlr); lenhlr++; hypre_ILUMaxrHeapAddRabsI(w + kl, iL + kl, lenhlr); /* loop for elimination */ ku = U_diag_i[jrow + 1]; for (j = U_diag_i[jrow]; j < ku; j++) { col = U_diag_j[j]; icol = iw[col]; lxu = - dpiv * U_diag_data[j]; /* we don't want to fill small number to empty place */ if ((icol == -1) && ((col < nLU && hypre_abs(lxu) < itolef) || (col >= nLU && hypre_abs(lxu) < itols ))) { continue; } if (icol == -1) { if (col < nLU) { /* L part * not already in L part * put it to the end of heap * might overwrite some small entries, no issue */ iL[lenhll] = col; w[lenhll] = lxu; iw[col] = lenhll++; /* add to heap, by col number */ hypre_ILUMinHeapAddIRIi(iL, w, iw, lenhll); } else if (col == ii) { /* the diagonla entry of S */ iL[nLU] = col; w[nLU] = A_diag_data[j]; iw[col] = nLU; } else { /* * not already in S part * put is to the end of heap */ lenu++; jpos = lenu + nLU; iL[jpos] = col; w[jpos] = lxu; iw[col] = jpos; } } else { w[icol] += lxu; } } }/* while loop for the elimination of current row */ /* * now pick up the largest lfil from L * L part is guarantee to be larger than itol */ lenl = lenhlr < lfil ? lenhlr : lfil; L_diag_i[ii + 1] = L_diag_i[ii] + lenl; if (lenl > 0) { /* test if memory is enough */ while (ctrL + lenl > capacity_L) { HYPRE_Int tmp = capacity_L; capacity_L = (HYPRE_Int)(capacity_L * EXPAND_FACT + 1); L_diag_j = hypre_TReAlloc_v2(L_diag_j, HYPRE_Int, tmp, HYPRE_Int, capacity_L, memory_location); L_diag_data = hypre_TReAlloc_v2(L_diag_data, HYPRE_Real, tmp, HYPRE_Real, capacity_L, memory_location); } ctrL += lenl; /* copy large data in */ for (j = L_diag_i[ii]; j < ctrL; j++) { L_diag_j[j] = iL[kl]; L_diag_data[j] = w[kl]; hypre_ILUMaxrHeapRemoveRabsI(w + kl, iL + kl, lenhlr); lenhlr--; } } /* * now reset working array * L part already reset when move out of heap, only S part */ ku = lenu + nLU; for (j = nLU; j <= ku; j++) { iw[iL[j]] = -1; } /* no dropping at this point of time for S */ //lenhu = lenu < lfil ? lenu : lfil; lenhu = lenu; /* quick split, only sort the first small part of the array */ hypre_ILUMaxQSplitRabsI(w, iL, nLU + 1, nLU + lenhu, nLU + lenu); /* we have diagonal in S anyway */ /* test if memory is enough */ while (ctrS + lenhu + 1 > capacity_S) { HYPRE_Int tmp = capacity_S; capacity_S = (HYPRE_Int)(capacity_S * EXPAND_FACT + 1); S_diag_j = hypre_TReAlloc_v2(S_diag_j, HYPRE_Int, tmp, HYPRE_Int, capacity_S, memory_location); S_diag_data = hypre_TReAlloc_v2(S_diag_data, HYPRE_Real, tmp, HYPRE_Real, capacity_S, memory_location); } ctrS += (lenhu + 1); S_diag_i[ii - nLU + 1] = ctrS; /* copy large data in, diagonal first */ S_diag_j[S_diag_i[ii - nLU]] = iL[nLU] - nLU; S_diag_data[S_diag_i[ii - nLU]] = w[nLU]; for (j = S_diag_i[ii - nLU] + 1; j < ctrS; j++) { jpos = nLU + j - S_diag_i[ii - nLU]; S_diag_j[j] = iL[jpos] - nLU; S_diag_data[j] = w[jpos]; } }/* end of ii loop from nLU to n-1 */ /* * 3: Finishing up and free */ /* First create Schur complement if necessary * Check if we need to create Schur complement */ HYPRE_BigInt big_m = (HYPRE_BigInt)m; hypre_MPI_Allreduce(&big_m, &total_rows, 1, HYPRE_MPI_BIG_INT, hypre_MPI_SUM, comm); /* only form when total_rows > 0 */ if ( total_rows > 0 ) { /* now create S */ /* need to get new column start */ { HYPRE_BigInt global_start; hypre_MPI_Scan(&big_m, &global_start, 1, HYPRE_MPI_BIG_INT, hypre_MPI_SUM, comm); col_starts[0] = global_start - m; col_starts[1] = global_start; } /* We did nothing to A_offd, so all the data kept, just reorder them * The create function takes comm, global num rows/cols, * row/col start, num cols offd, nnz diag, nnz offd */ S_offd_nnz = hypre_CSRMatrixNumNonzeros(A_offd); S_offd_ncols = hypre_CSRMatrixNumCols(A_offd); matS = hypre_ParCSRMatrixCreate( comm, total_rows, total_rows, col_starts, col_starts, S_offd_ncols, S_diag_i[m], S_offd_nnz); /* first put diagonal data in */ S_diag = hypre_ParCSRMatrixDiag(matS); hypre_CSRMatrixI(S_diag) = S_diag_i; hypre_CSRMatrixData(S_diag) = S_diag_data; hypre_CSRMatrixJ(S_diag) = S_diag_j; /* now start to construct offdiag of S */ S_offd = hypre_ParCSRMatrixOffd(matS); S_offd_i = hypre_TAlloc(HYPRE_Int, m + 1, memory_location); S_offd_j = hypre_TAlloc(HYPRE_Int, S_offd_nnz, memory_location); S_offd_data = hypre_TAlloc(HYPRE_Real, S_offd_nnz, memory_location); S_offd_colmap = hypre_CTAlloc(HYPRE_BigInt, S_offd_ncols, HYPRE_MEMORY_HOST); /* simply use a loop to copy data from A_offd */ S_offd_i[0] = 0; k3 = 0; for (i = 1; i <= e; i++) { S_offd_i[i] = k3; } for (i = 0; i < m_e; i++) { col = perm[i + nI]; k1 = A_offd_i[col]; k2 = A_offd_i[col + 1]; for (j = k1; j < k2; j++) { S_offd_j[k3] = A_offd_j[j]; S_offd_data[k3++] = A_offd_data[j]; } S_offd_i[i + e + 1] = k3; } /* give I, J, DATA to S_offd */ hypre_CSRMatrixI(S_offd) = S_offd_i; hypre_CSRMatrixJ(S_offd) = S_offd_j; hypre_CSRMatrixData(S_offd) = S_offd_data; /* now we need to update S_offd_colmap */ /* get total num of send */ num_sends = hypre_ParCSRCommPkgNumSends(comm_pkg); begin = hypre_ParCSRCommPkgSendMapStart(comm_pkg, 0); end = hypre_ParCSRCommPkgSendMapStart(comm_pkg, num_sends); send_buf = hypre_TAlloc(HYPRE_BigInt, end - begin, HYPRE_MEMORY_HOST); /* copy new index into send_buf */ for (i = begin; i < end; i++) { send_buf[i - begin] = rperm[hypre_ParCSRCommPkgSendMapElmt(comm_pkg, i)] - nLU + col_starts[0]; } /* main communication */ comm_handle = hypre_ParCSRCommHandleCreate(21, comm_pkg, send_buf, S_offd_colmap); /* need this to synchronize, Isend & Irecv used in above functions */ hypre_ParCSRCommHandleDestroy(comm_handle); /* setup index */ hypre_ParCSRMatrixColMapOffd(matS) = S_offd_colmap; hypre_ILUSortOffdColmap(matS); /* free */ hypre_TFree(send_buf, HYPRE_MEMORY_HOST); } /* end of forming S */ /* now start to construct L and U */ for (k = nLU; k < n; k++) { /* set U after nLU to be 0, and diag to be one */ U_diag_i[k + 1] = U_diag_i[nLU]; D_data[k] = 1.; } /* create parcsr matrix */ matL = hypre_ParCSRMatrixCreate( comm, hypre_ParCSRMatrixGlobalNumRows(A), hypre_ParCSRMatrixGlobalNumRows(A), hypre_ParCSRMatrixRowStarts(A), hypre_ParCSRMatrixColStarts(A), 0, L_diag_i[n], 0 ); hypre_CSRMatrixMemoryLocation(hypre_ParCSRMatrixDiag(matL)) = memory_location; hypre_CSRMatrixMemoryLocation(hypre_ParCSRMatrixOffd(matL)) = memory_location; L_diag = hypre_ParCSRMatrixDiag(matL); hypre_CSRMatrixI(L_diag) = L_diag_i; if (L_diag_i[n] > 0) { hypre_CSRMatrixData(L_diag) = L_diag_data; hypre_CSRMatrixJ(L_diag) = L_diag_j; } else { /* we initialized some anyway, so remove if unused */ hypre_TFree(L_diag_j, memory_location); hypre_TFree(L_diag_data, memory_location); } /* store (global) total number of nonzeros */ local_nnz = (HYPRE_Real) (L_diag_i[n]); hypre_MPI_Allreduce(&local_nnz, &total_nnz, 1, HYPRE_MPI_REAL, hypre_MPI_SUM, comm); hypre_ParCSRMatrixDNumNonzeros(matL) = total_nnz; matU = hypre_ParCSRMatrixCreate( comm, hypre_ParCSRMatrixGlobalNumRows(A), hypre_ParCSRMatrixGlobalNumRows(A), hypre_ParCSRMatrixRowStarts(A), hypre_ParCSRMatrixColStarts(A), 0, U_diag_i[n], 0 ); hypre_CSRMatrixMemoryLocation(hypre_ParCSRMatrixDiag(matU)) = memory_location; hypre_CSRMatrixMemoryLocation(hypre_ParCSRMatrixOffd(matU)) = memory_location; U_diag = hypre_ParCSRMatrixDiag(matU); hypre_CSRMatrixI(U_diag) = U_diag_i; if (U_diag_i[n] > 0) { hypre_CSRMatrixData(U_diag) = U_diag_data; hypre_CSRMatrixJ(U_diag) = U_diag_j; } else { /* we initialized some anyway, so remove if unused */ hypre_TFree(U_diag_j, memory_location); hypre_TFree(U_diag_data, memory_location); } /* store (global) total number of nonzeros */ local_nnz = (HYPRE_Real) (U_diag_i[n]); hypre_MPI_Allreduce(&local_nnz, &total_nnz, 1, HYPRE_MPI_REAL, hypre_MPI_SUM, comm); hypre_ParCSRMatrixDNumNonzeros(matU) = total_nnz; /* free working array */ hypre_TFree(iw, HYPRE_MEMORY_HOST); hypre_TFree(w, HYPRE_MEMORY_HOST); if (!matS) { hypre_TFree(S_diag_i, memory_location); } if (!permp) { hypre_TFree(perm, memory_location); } if (!qpermp) { hypre_TFree(qperm, memory_location); } /* set matrix pointers */ *Lptr = matL; *Dptr = D_data; *Uptr = matU; *Sptr = matS; *u_end = u_end_array; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_NSHSetup *--------------------------------------------------------------------------*/ HYPRE_Int hypre_NSHSetup( void *nsh_vdata, hypre_ParCSRMatrix *A, hypre_ParVector *f, hypre_ParVector *u ) { MPI_Comm comm = hypre_ParCSRMatrixComm(A); hypre_ParNSHData *nsh_data = (hypre_ParNSHData*) nsh_vdata; /* Pointers to NSH data */ HYPRE_Int logging = hypre_ParNSHDataLogging(nsh_data); HYPRE_Int print_level = hypre_ParNSHDataPrintLevel(nsh_data); hypre_ParCSRMatrix *matA = hypre_ParNSHDataMatA(nsh_data); hypre_ParCSRMatrix *matM = hypre_ParNSHDataMatM(nsh_data); hypre_ParVector *Utemp; hypre_ParVector *Ftemp; hypre_ParVector *F_array = hypre_ParNSHDataF(nsh_data); hypre_ParVector *U_array = hypre_ParNSHDataU(nsh_data); hypre_ParVector *residual = hypre_ParNSHDataResidual(nsh_data); HYPRE_Real *rel_res_norms = hypre_ParNSHDataRelResNorms(nsh_data); /* Solver setting */ HYPRE_Real *droptol = hypre_ParNSHDataDroptol(nsh_data); HYPRE_Real mr_tol = hypre_ParNSHDataMRTol(nsh_data); HYPRE_Int mr_max_row_nnz = hypre_ParNSHDataMRMaxRowNnz(nsh_data); HYPRE_Int mr_max_iter = hypre_ParNSHDataMRMaxIter(nsh_data); HYPRE_Int mr_col_version = hypre_ParNSHDataMRColVersion(nsh_data); HYPRE_Real nsh_tol = hypre_ParNSHDataNSHTol(nsh_data); HYPRE_Int nsh_max_row_nnz = hypre_ParNSHDataNSHMaxRowNnz(nsh_data); HYPRE_Int nsh_max_iter = hypre_ParNSHDataNSHMaxIter(nsh_data); HYPRE_Int num_procs, my_id; hypre_MPI_Comm_size(comm, &num_procs); hypre_MPI_Comm_rank(comm, &my_id); /* Free Previously allocated data, if any not destroyed */ hypre_TFree(matM, HYPRE_MEMORY_HOST); hypre_TFree(hypre_ParNSHDataL1Norms(nsh_data), HYPRE_MEMORY_HOST); hypre_ParVectorDestroy(hypre_ParNSHDataUTemp(nsh_data)); hypre_ParVectorDestroy(hypre_ParNSHDataFTemp(nsh_data)); hypre_ParVectorDestroy(hypre_ParNSHDataResidual(nsh_data)); hypre_TFree(hypre_ParNSHDataRelResNorms(nsh_data), HYPRE_MEMORY_HOST); matM = NULL; hypre_ParNSHDataL1Norms(nsh_data) = NULL; hypre_ParNSHDataUTemp(nsh_data) = NULL; hypre_ParNSHDataFTemp(nsh_data) = NULL; hypre_ParNSHDataResidual(nsh_data) = NULL; hypre_ParNSHDataRelResNorms(nsh_data) = NULL; /* start to create working vectors */ Utemp = hypre_ParVectorCreate(hypre_ParCSRMatrixComm(A), hypre_ParCSRMatrixGlobalNumRows(A), hypre_ParCSRMatrixRowStarts(A)); hypre_ParVectorInitialize(Utemp); hypre_ParNSHDataUTemp(nsh_data) = Utemp; Ftemp = hypre_ParVectorCreate(hypre_ParCSRMatrixComm(A), hypre_ParCSRMatrixGlobalNumRows(A), hypre_ParCSRMatrixRowStarts(A)); hypre_ParVectorInitialize(Ftemp); hypre_ParNSHDataFTemp(nsh_data) = Ftemp; /* Set matrix, solution and rhs pointers */ matA = A; F_array = f; U_array = u; /* NSH compute approximate inverse, see par_ilu.c */ hypre_ILUParCSRInverseNSH(matA, &matM, droptol, mr_tol, nsh_tol, HYPRE_REAL_MIN, mr_max_row_nnz, nsh_max_row_nnz, mr_max_iter, nsh_max_iter, mr_col_version, print_level); /* Set pointers to NSH data */ hypre_ParNSHDataMatA(nsh_data) = matA; hypre_ParNSHDataF(nsh_data) = F_array; hypre_ParNSHDataU(nsh_data) = U_array; hypre_ParNSHDataMatM(nsh_data) = matM; /* Compute operator complexity */ hypre_ParCSRMatrixSetDNumNonzeros(matA); hypre_ParCSRMatrixSetDNumNonzeros(matM); /* Compute complexity */ hypre_ParNSHDataOperatorComplexity(nsh_data) = hypre_ParCSRMatrixDNumNonzeros(matM) / hypre_ParCSRMatrixDNumNonzeros(matA); if (my_id == 0 && print_level > 0) { hypre_printf("NSH SETUP: operator complexity = %f \n", hypre_ParNSHDataOperatorComplexity(nsh_data)); } if (logging > 1) { residual = hypre_ParVectorCreate(hypre_ParCSRMatrixComm(matA), hypre_ParCSRMatrixGlobalNumRows(matA), hypre_ParCSRMatrixRowStarts(matA)); hypre_ParVectorInitialize(residual); hypre_ParNSHDataResidual(nsh_data) = residual; } else { hypre_ParNSHDataResidual(nsh_data) = NULL; } rel_res_norms = hypre_CTAlloc(HYPRE_Real, hypre_ParNSHDataMaxIter(nsh_data), HYPRE_MEMORY_HOST); hypre_ParNSHDataRelResNorms(nsh_data) = rel_res_norms; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_ILUSetupILU0RAS * * ILU(0) for RAS, has some external rows * * A = input matrix * perm = permutation array indicating ordering of factorization. * Perm could come from a CF_marker array or a reordering routine. * nLU = size of computed LDU factorization. * Lptr, Dptr, Uptr, Sptr = L, D, U, S factors. * will form global Schur Matrix if nLU < n *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ILUSetupILU0RAS(hypre_ParCSRMatrix *A, HYPRE_Int *perm, HYPRE_Int nLU, hypre_ParCSRMatrix **Lptr, HYPRE_Real **Dptr, hypre_ParCSRMatrix **Uptr) { /* communication stuffs for S */ MPI_Comm comm = hypre_ParCSRMatrixComm(A); HYPRE_Int num_procs; hypre_ParCSRCommPkg *comm_pkg; /* data objects for A */ hypre_CSRMatrix *A_diag = hypre_ParCSRMatrixDiag(A); hypre_CSRMatrix *A_offd = hypre_ParCSRMatrixOffd(A); HYPRE_Real *A_diag_data = hypre_CSRMatrixData(A_diag); HYPRE_Int *A_diag_i = hypre_CSRMatrixI(A_diag); HYPRE_Int *A_diag_j = hypre_CSRMatrixJ(A_diag); HYPRE_Real *A_offd_data = hypre_CSRMatrixData(A_offd); HYPRE_Int *A_offd_i = hypre_CSRMatrixI(A_offd); HYPRE_Int *A_offd_j = hypre_CSRMatrixJ(A_offd); HYPRE_MemoryLocation memory_location = hypre_ParCSRMatrixMemoryLocation(A); /* size of problem and external matrix */ HYPRE_Int n = hypre_CSRMatrixNumRows(A_diag); HYPRE_Int ext = hypre_CSRMatrixNumCols(A_offd); HYPRE_Int total_rows = n + ext; HYPRE_BigInt col_starts[2]; HYPRE_BigInt global_num_rows; HYPRE_Real local_nnz, total_nnz; /* data objects for L, D, U */ hypre_ParCSRMatrix *matL; hypre_ParCSRMatrix *matU; hypre_CSRMatrix *L_diag; hypre_CSRMatrix *U_diag; HYPRE_Real *D_data; HYPRE_Real *L_diag_data; HYPRE_Int *L_diag_i; HYPRE_Int *L_diag_j; HYPRE_Real *U_diag_data; HYPRE_Int *U_diag_i; HYPRE_Int *U_diag_j; /* data objects for E, external matrix */ HYPRE_Int *E_i; HYPRE_Int *E_j; HYPRE_Real *E_data; /* memory management */ HYPRE_Int initial_alloc = 0; HYPRE_Int capacity_L; HYPRE_Int capacity_U; HYPRE_Int nnz_A = A_diag_i[n]; /* reverse permutation array */ HYPRE_Int *rperm; /* the original permutation array */ HYPRE_Int *perm_old; HYPRE_Int i, ii, j, k, k1, k2, ctrU, ctrL, lenl, lenu, jpiv, col, jpos; HYPRE_Int *iw, *iL, *iU; HYPRE_Real dd, t, dpiv, lxu, *wU, *wL; /* start setup * get communication stuffs first */ hypre_MPI_Comm_size(comm, &num_procs); comm_pkg = hypre_ParCSRMatrixCommPkg(A); /* Setup if not yet built */ if (!comm_pkg) { hypre_MatvecCommPkgCreate(A); comm_pkg = hypre_ParCSRMatrixCommPkg(A); } /* check for correctness */ if (nLU < 0 || nLU > n) { hypre_error_w_msg(HYPRE_ERROR_ARG, "WARNING: nLU out of range.\n"); } /* Allocate memory for L,D,U,S factors */ if (n > 0) { initial_alloc = (HYPRE_Int)((n + ext) + hypre_ceil((nnz_A / 2.0) * total_rows / n)); } capacity_L = initial_alloc; capacity_U = initial_alloc; D_data = hypre_TAlloc(HYPRE_Real, total_rows, memory_location); L_diag_i = hypre_TAlloc(HYPRE_Int, total_rows + 1, memory_location); L_diag_j = hypre_TAlloc(HYPRE_Int, capacity_L, memory_location); L_diag_data = hypre_TAlloc(HYPRE_Real, capacity_L, memory_location); U_diag_i = hypre_TAlloc(HYPRE_Int, total_rows + 1, memory_location); U_diag_j = hypre_TAlloc(HYPRE_Int, capacity_U, memory_location); U_diag_data = hypre_TAlloc(HYPRE_Real, capacity_U, memory_location); /* allocate working arrays */ iw = hypre_TAlloc(HYPRE_Int, 4 * total_rows, HYPRE_MEMORY_HOST); iL = iw + total_rows; rperm = iw + 2 * total_rows; perm_old = perm; perm = iw + 3 * total_rows; wL = hypre_TAlloc(HYPRE_Real, total_rows, HYPRE_MEMORY_HOST); ctrU = ctrL = 0; L_diag_i[0] = U_diag_i[0] = 0; /* set marker array iw to -1 */ for (i = 0; i < total_rows; i++) { iw[i] = -1; } /* expand perm to suit extra data, remember to free */ for (i = 0; i < n; i++) { perm[i] = perm_old[i]; } for (i = n; i < total_rows; i++) { perm[i] = i; } /* get reverse permutation (rperm). * rperm holds the reordered indexes. */ for (i = 0; i < total_rows; i++) { rperm[perm[i]] = i; } /* get external rows */ hypre_ILUBuildRASExternalMatrix(A, rperm, &E_i, &E_j, &E_data); /*--------- Begin Factorization. Work in permuted space ---- * this is the first part, without offd */ for (ii = 0; ii < nLU; ii++) { // get row i i = perm[ii]; // get extents of row i k1 = A_diag_i[i]; k2 = A_diag_i[i + 1]; /*-------------------- unpack L & U-parts of row of A in arrays w */ iU = iL + ii; wU = wL + ii; /*-------------------- diagonal entry */ dd = 0.0; lenl = lenu = 0; iw[ii] = ii; /*-------------------- scan & unwrap column */ for (j = k1; j < k2; j++) { col = rperm[A_diag_j[j]]; t = A_diag_data[j]; if ( col < ii ) { iw[col] = lenl; iL[lenl] = col; wL[lenl++] = t; } else if (col > ii) { iw[col] = lenu; iU[lenu] = col; wU[lenu++] = t; } else { dd = t; } } /* eliminate row */ /*------------------------------------------------------------------------- * In order to do the elimination in the correct order we must select the * smallest column index among iL[k], k = j, j+1, ..., lenl-1. For ILU(0), * no new fill-ins are expect, so we can pre-sort iL and wL prior to the * entering the elimination loop. *-----------------------------------------------------------------------*/ // hypre_quickSortIR(iL, wL, iw, 0, (lenl-1)); hypre_qsort3ir(iL, wL, iw, 0, (lenl - 1)); for (j = 0; j < lenl; j++) { jpiv = iL[j]; /* get factor/ pivot element */ dpiv = wL[j] * D_data[jpiv]; /* store entry in L */ wL[j] = dpiv; /* zero out element - reset pivot */ iw[jpiv] = -1; /* combine current row and pivot row */ for (k = U_diag_i[jpiv]; k < U_diag_i[jpiv + 1]; k++) { col = U_diag_j[k]; jpos = iw[col]; /* Only fill-in nonzero pattern (jpos != 0) */ if (jpos < 0) { continue; } lxu = - U_diag_data[k] * dpiv; if (col < ii) { /* dealing with L part */ wL[jpos] += lxu; } else if (col > ii) { /* dealing with U part */ wU[jpos] += lxu; } else { /* diagonal update */ dd += lxu; } } } /* restore iw (only need to restore diagonal and U part */ iw[ii] = -1; for (j = 0; j < lenu; j++) { iw[iU[j]] = -1; } /* Update LDU factors */ /* L part */ /* Check that memory is sufficient */ while ((ctrL + lenl) > capacity_L) { HYPRE_Int tmp = capacity_L; capacity_L = (HYPRE_Int)(capacity_L * EXPAND_FACT + 1); L_diag_j = hypre_TReAlloc_v2(L_diag_j, HYPRE_Int, tmp, HYPRE_Int, capacity_L, memory_location); L_diag_data = hypre_TReAlloc_v2(L_diag_data, HYPRE_Real, tmp, HYPRE_Real, capacity_L, memory_location); } hypre_TMemcpy(&(L_diag_j)[ctrL], iL, HYPRE_Int, lenl, memory_location, HYPRE_MEMORY_HOST); hypre_TMemcpy(&(L_diag_data)[ctrL], wL, HYPRE_Real, lenl, memory_location, HYPRE_MEMORY_HOST); L_diag_i[ii + 1] = (ctrL += lenl); /* diagonal part (we store the inverse) */ if (hypre_abs(dd) < MAT_TOL) { dd = 1.0e-6; } D_data[ii] = 1. / dd; /* U part */ /* Check that memory is sufficient */ while ((ctrU + lenu) > capacity_U) { HYPRE_Int tmp = capacity_U; capacity_U = (HYPRE_Int)(capacity_U * EXPAND_FACT + 1); U_diag_j = hypre_TReAlloc_v2(U_diag_j, HYPRE_Int, tmp, HYPRE_Int, capacity_U, memory_location); U_diag_data = hypre_TReAlloc_v2(U_diag_data, HYPRE_Real, tmp, HYPRE_Real, capacity_U, memory_location); } hypre_TMemcpy(&(U_diag_j)[ctrU], iU, HYPRE_Int, lenu, memory_location, HYPRE_MEMORY_HOST); hypre_TMemcpy(&(U_diag_data)[ctrU], wU, HYPRE_Real, lenu, memory_location, HYPRE_MEMORY_HOST); U_diag_i[ii + 1] = (ctrU += lenu); } /*--------- Begin Factorization in lower part ---- * here we need to get off diagonals in */ for (ii = nLU; ii < n; ii++) { // get row i i = perm[ii]; // get extents of row i k1 = A_diag_i[i]; k2 = A_diag_i[i + 1]; /*-------------------- unpack L & U-parts of row of A in arrays w */ iU = iL + ii; wU = wL + ii; /*-------------------- diagonal entry */ dd = 0.0; lenl = lenu = 0; iw[ii] = ii; /*-------------------- scan & unwrap column */ for (j = k1; j < k2; j++) { col = rperm[A_diag_j[j]]; t = A_diag_data[j]; if (col < ii) { iw[col] = lenl; iL[lenl] = col; wL[lenl++] = t; } else if (col > ii) { iw[col] = lenu; iU[lenu] = col; wU[lenu++] = t; } else { dd = t; } } /*------------------ sjcan offd*/ k1 = A_offd_i[i]; k2 = A_offd_i[i + 1]; for (j = k1; j < k2; j++) { /* add offd to U part, all offd are U for this part */ col = A_offd_j[j] + n; t = A_offd_data[j]; iw[col] = lenu; iU[lenu] = col; wU[lenu++] = t; } /* eliminate row */ /*------------------------------------------------------------------------- * In order to do the elimination in the correct order we must select the * smallest column index among iL[k], k = j, j+1, ..., lenl-1. For ILU(0), * no new fill-ins are expect, so we can pre-sort iL and wL prior to the * entering the elimination loop. *-----------------------------------------------------------------------*/ // hypre_quickSortIR(iL, wL, iw, 0, (lenl-1)); hypre_qsort3ir(iL, wL, iw, 0, (lenl - 1)); for (j = 0; j < lenl; j++) { jpiv = iL[j]; /* get factor/ pivot element */ dpiv = wL[j] * D_data[jpiv]; /* store entry in L */ wL[j] = dpiv; /* zero out element - reset pivot */ iw[jpiv] = -1; /* combine current row and pivot row */ for (k = U_diag_i[jpiv]; k < U_diag_i[jpiv + 1]; k++) { col = U_diag_j[k]; jpos = iw[col]; /* Only fill-in nonzero pattern (jpos != 0) */ if (jpos < 0) { continue; } lxu = - U_diag_data[k] * dpiv; if (col < ii) { /* dealing with L part */ wL[jpos] += lxu; } else if (col > ii) { /* dealing with U part */ wU[jpos] += lxu; } else { /* diagonal update */ dd += lxu; } } } /* restore iw (only need to restore diagonal and U part */ iw[ii] = -1; for (j = 0; j < lenu; j++) { iw[iU[j]] = -1; } /* Update LDU factors */ /* L part */ /* Check that memory is sufficient */ while ((ctrL + lenl) > capacity_L) { HYPRE_Int tmp = capacity_L; capacity_L = (HYPRE_Int)(capacity_L * EXPAND_FACT + 1); L_diag_j = hypre_TReAlloc_v2(L_diag_j, HYPRE_Int, tmp, HYPRE_Int, capacity_L, memory_location); L_diag_data = hypre_TReAlloc_v2(L_diag_data, HYPRE_Real, tmp, HYPRE_Real, capacity_L, memory_location); } hypre_TMemcpy(&(L_diag_j)[ctrL], iL, HYPRE_Int, lenl, memory_location, HYPRE_MEMORY_HOST); hypre_TMemcpy(&(L_diag_data)[ctrL], wL, HYPRE_Real, lenl, memory_location, HYPRE_MEMORY_HOST); L_diag_i[ii + 1] = (ctrL += lenl); /* diagonal part (we store the inverse) */ if (hypre_abs(dd) < MAT_TOL) { dd = 1.0e-6; } D_data[ii] = 1. / dd; /* U part */ /* Check that memory is sufficient */ while ((ctrU + lenu) > capacity_U) { HYPRE_Int tmp = capacity_U; capacity_U = (HYPRE_Int)(capacity_U * EXPAND_FACT + 1); U_diag_j = hypre_TReAlloc_v2(U_diag_j, HYPRE_Int, tmp, HYPRE_Int, capacity_U, memory_location); U_diag_data = hypre_TReAlloc_v2(U_diag_data, HYPRE_Real, tmp, HYPRE_Real, capacity_U, memory_location); } hypre_TMemcpy(&(U_diag_j)[ctrU], iU, HYPRE_Int, lenu, memory_location, HYPRE_MEMORY_HOST); hypre_TMemcpy(&(U_diag_data)[ctrU], wU, HYPRE_Real, lenu, memory_location, HYPRE_MEMORY_HOST); U_diag_i[ii + 1] = (ctrU += lenu); } /*--------- Begin Factorization in external part ---- * here we need to get off diagonals in */ for (ii = n ; ii < total_rows ; ii++) { // get row i i = ii - n; // get extents of row i k1 = E_i[i]; k2 = E_i[i + 1]; /*-------------------- unpack L & U-parts of row of A in arrays w */ iU = iL + ii; wU = wL + ii; /*-------------------- diagonal entry */ dd = 0.0; lenl = lenu = 0; iw[ii] = ii; /*-------------------- scan & unwrap column */ for (j = k1; j < k2; j++) { col = rperm[E_j[j]]; t = E_data[j]; if (col < ii) { iw[col] = lenl; iL[lenl] = col; wL[lenl++] = t; } else if (col > ii) { iw[col] = lenu; iU[lenu] = col; wU[lenu++] = t; } else { dd = t; } } /* eliminate row */ /*------------------------------------------------------------------------- * In order to do the elimination in the correct order we must select the * smallest column index among iL[k], k = j, j+1, ..., lenl-1. For ILU(0), * no new fill-ins are expect, so we can pre-sort iL and wL prior to the * entering the elimination loop. *-----------------------------------------------------------------------*/ // hypre_quickSortIR(iL, wL, iw, 0, (lenl-1)); hypre_qsort3ir(iL, wL, iw, 0, (lenl - 1)); for (j = 0; j < lenl; j++) { jpiv = iL[j]; /* get factor/ pivot element */ dpiv = wL[j] * D_data[jpiv]; /* store entry in L */ wL[j] = dpiv; /* zero out element - reset pivot */ iw[jpiv] = -1; /* combine current row and pivot row */ for (k = U_diag_i[jpiv]; k < U_diag_i[jpiv + 1]; k++) { col = U_diag_j[k]; jpos = iw[col]; /* Only fill-in nonzero pattern (jpos != 0) */ if (jpos < 0) { continue; } lxu = - U_diag_data[k] * dpiv; if (col < ii) { /* dealing with L part */ wL[jpos] += lxu; } else if (col > ii) { /* dealing with U part */ wU[jpos] += lxu; } else { /* diagonal update */ dd += lxu; } } } /* restore iw (only need to restore diagonal and U part */ iw[ii] = -1; for (j = 0; j < lenu; j++) { iw[iU[j]] = -1; } /* Update LDU factors */ /* L part */ /* Check that memory is sufficient */ while ((ctrL + lenl) > capacity_L) { HYPRE_Int tmp = capacity_L; capacity_L = (HYPRE_Int)(capacity_L * EXPAND_FACT + 1); L_diag_j = hypre_TReAlloc_v2(L_diag_j, HYPRE_Int, tmp, HYPRE_Int, capacity_L, memory_location); L_diag_data = hypre_TReAlloc_v2(L_diag_data, HYPRE_Real, tmp, HYPRE_Real, capacity_L, memory_location); } hypre_TMemcpy(&(L_diag_j)[ctrL], iL, HYPRE_Int, lenl, memory_location, HYPRE_MEMORY_HOST); hypre_TMemcpy(&(L_diag_data)[ctrL], wL, HYPRE_Real, lenl, memory_location, HYPRE_MEMORY_HOST); L_diag_i[ii + 1] = (ctrL += lenl); /* diagonal part (we store the inverse) */ if (hypre_abs(dd) < MAT_TOL) { dd = 1.0e-6; } D_data[ii] = 1. / dd; /* U part */ /* Check that memory is sufficient */ while ((ctrU + lenu) > capacity_U) { HYPRE_Int tmp = capacity_U; capacity_U = (HYPRE_Int)(capacity_U * EXPAND_FACT + 1); U_diag_j = hypre_TReAlloc_v2(U_diag_j, HYPRE_Int, tmp, HYPRE_Int, capacity_U, memory_location); U_diag_data = hypre_TReAlloc_v2(U_diag_data, HYPRE_Real, tmp, HYPRE_Real, capacity_U, memory_location); } hypre_TMemcpy(&(U_diag_j)[ctrU], iU, HYPRE_Int, lenu, memory_location, HYPRE_MEMORY_HOST); hypre_TMemcpy(&(U_diag_data)[ctrU], wU, HYPRE_Real, lenu, memory_location, HYPRE_MEMORY_HOST); U_diag_i[ii + 1] = (ctrU += lenu); } HYPRE_BigInt big_total_rows = (HYPRE_BigInt)total_rows; hypre_MPI_Allreduce(&big_total_rows, &global_num_rows, 1, HYPRE_MPI_BIG_INT, hypre_MPI_SUM, comm); /* need to get new column start */ { HYPRE_BigInt global_start; hypre_MPI_Scan(&big_total_rows, &global_start, 1, HYPRE_MPI_BIG_INT, hypre_MPI_SUM, comm); col_starts[0] = global_start - total_rows; col_starts[1] = global_start; } matL = hypre_ParCSRMatrixCreate( comm, global_num_rows, global_num_rows, col_starts, col_starts, 0, ctrL, 0 ); L_diag = hypre_ParCSRMatrixDiag(matL); hypre_CSRMatrixI(L_diag) = L_diag_i; if (ctrL) { hypre_CSRMatrixData(L_diag) = L_diag_data; hypre_CSRMatrixJ(L_diag) = L_diag_j; } else { /* we've allocated some memory, so free if not used */ hypre_TFree(L_diag_j, memory_location); hypre_TFree(L_diag_data, memory_location); } /* store (global) total number of nonzeros */ local_nnz = (HYPRE_Real) ctrL; hypre_MPI_Allreduce(&local_nnz, &total_nnz, 1, HYPRE_MPI_REAL, hypre_MPI_SUM, comm); hypre_ParCSRMatrixDNumNonzeros(matL) = total_nnz; matU = hypre_ParCSRMatrixCreate( comm, global_num_rows, global_num_rows, col_starts, col_starts, 0, ctrU, 0 ); U_diag = hypre_ParCSRMatrixDiag(matU); hypre_CSRMatrixI(U_diag) = U_diag_i; if (ctrU) { hypre_CSRMatrixData(U_diag) = U_diag_data; hypre_CSRMatrixJ(U_diag) = U_diag_j; } else { /* we've allocated some memory, so free if not used */ hypre_TFree(U_diag_j, memory_location); hypre_TFree(U_diag_data, memory_location); } /* store (global) total number of nonzeros */ local_nnz = (HYPRE_Real) ctrU; hypre_MPI_Allreduce(&local_nnz, &total_nnz, 1, HYPRE_MPI_REAL, hypre_MPI_SUM, comm); hypre_ParCSRMatrixDNumNonzeros(matU) = total_nnz; /* free memory */ hypre_TFree(wL, HYPRE_MEMORY_HOST); hypre_TFree(iw, HYPRE_MEMORY_HOST); /* free external data */ if (E_i) { hypre_TFree(E_i, HYPRE_MEMORY_HOST); } if (E_j) { hypre_TFree(E_j, HYPRE_MEMORY_HOST); hypre_TFree(E_data, HYPRE_MEMORY_HOST); } /* set matrix pointers */ *Lptr = matL; *Dptr = D_data; *Uptr = matU; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_ILUSetupILUKRASSymbolic * * ILU(k) symbolic factorization for RAS * * n = total rows of input * lfil = level of fill-in, the k in ILU(k) * perm = permutation array indicating ordering of factorization. * rperm = reverse permutation array, used here to avoid duplicate memory allocation * iw = working array, used here to avoid duplicate memory allocation * nLU = size of computed LDU factorization. * A/L/U/E_i = the I slot of A, L, U and E * A/L/U/E_j = the J slot of A, L, U and E * * Will form global Schur Matrix if nLU < n *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ILUSetupILUKRASSymbolic(HYPRE_Int n, HYPRE_Int *A_diag_i, HYPRE_Int *A_diag_j, HYPRE_Int *A_offd_i, HYPRE_Int *A_offd_j, HYPRE_Int *E_i, HYPRE_Int *E_j, HYPRE_Int ext, HYPRE_Int lfil, HYPRE_Int *perm, HYPRE_Int *rperm, HYPRE_Int *iw, HYPRE_Int nLU, HYPRE_Int *L_diag_i, HYPRE_Int *U_diag_i, HYPRE_Int **L_diag_j, HYPRE_Int **U_diag_j) { /* * 1: Setup and create buffers * A_diag_*: tempory pointer for the diagonal matrix of A and its '*' slot * ii: outer loop from 0 to nLU - 1 * i: the real col number in diag inside the outer loop * iw: working array store the reverse of active col number * iL: working array store the active col number * iLev: working array store the active level of current row * lenl/u: current position in iw and so * ctrL/U/S: global position in J */ HYPRE_Int *temp_L_diag_j, *temp_U_diag_j, *u_levels; HYPRE_Int *iL, *iLev; HYPRE_Int ii, i, j, k, ku, lena, lenl, lenu, lenh, ilev, lev, col, icol; // HYPRE_Int m = n - nLU; HYPRE_Int total_rows = ext + n; /* memory management */ HYPRE_Int ctrL; HYPRE_Int ctrU; HYPRE_Int capacity_L; HYPRE_Int capacity_U; HYPRE_Int initial_alloc = 0; HYPRE_Int nnz_A; HYPRE_MemoryLocation memory_location; /* Get default memory location */ HYPRE_GetMemoryLocation(&memory_location); /* set iL and iLev to right place in iw array */ iL = iw + total_rows; iLev = iw + 2 * total_rows; /* setup initial memory used */ nnz_A = A_diag_i[n]; if (n > 0) { initial_alloc = (HYPRE_Int)((n + ext) + hypre_ceil((nnz_A / 2.0) * total_rows / n)); } capacity_L = initial_alloc; capacity_U = initial_alloc; /* allocate other memory for L and U struct */ temp_L_diag_j = hypre_CTAlloc(HYPRE_Int, capacity_L, memory_location); temp_U_diag_j = hypre_CTAlloc(HYPRE_Int, capacity_U, memory_location); u_levels = hypre_CTAlloc(HYPRE_Int, capacity_U, HYPRE_MEMORY_HOST); ctrL = ctrU = 0; /* set initial value for working array */ for (ii = 0; ii < total_rows; ii++) { iw[ii] = -1; } /* * 2: Start of main loop * those in iL are NEW col index (after permutation) */ for (ii = 0; ii < nLU; ii++) { i = perm[ii]; lenl = 0; lenh = 0;/* this is the current length of heap */ lenu = ii; lena = A_diag_i[i + 1]; /* put those already inside original pattern, and set their level to 0 */ for (j = A_diag_i[i]; j < lena; j++) { /* get the neworder of that col */ col = rperm[A_diag_j[j]]; if (col < ii) { /* * this is an entry in L * we maintain a heap structure for L part */ iL[lenh] = col; iLev[lenh] = 0; iw[col] = lenh++; /*now miantian a heap structure*/ hypre_ILUMinHeapAddIIIi(iL, iLev, iw, lenh); } else if (col > ii) { /* this is an entry in U */ iL[lenu] = col; iLev[lenu] = 0; iw[col] = lenu++; } }/* end of j loop for adding pattern in original matrix */ /* * search lower part of current row and update pattern based on level */ while (lenh > 0) { /* * k is now the new col index after permutation * the first element of the heap is the smallest */ k = iL[0]; ilev = iLev[0]; /* * we now need to maintain the heap structure */ hypre_ILUMinHeapRemoveIIIi(iL, iLev, iw, lenh); lenh--; /* copy to the end of array */ lenl++; /* reset iw for that, not using anymore */ iw[k] = -1; hypre_swap2i(iL, iLev, ii - lenl, lenh); /* * now the elimination on current row could start. * eliminate row k (new index) from current row */ ku = U_diag_i[k + 1]; for (j = U_diag_i[k]; j < ku; j++) { col = temp_U_diag_j[j]; lev = u_levels[j] + ilev + 1; /* ignore large level */ icol = iw[col]; /* skill large level */ if (lev > lfil) { continue; } if (icol < 0) { /* not yet in */ if (col < ii) { /* * if we add to the left L, we need to maintian the * heap structure */ iL[lenh] = col; iLev[lenh] = lev; iw[col] = lenh++; /*swap it with the element right after the heap*/ /* maintain the heap */ hypre_ILUMinHeapAddIIIi(iL, iLev, iw, lenh); } else if (col > ii) { iL[lenu] = col; iLev[lenu] = lev; iw[col] = lenu++; } } else { iLev[icol] = hypre_min(lev, iLev[icol]); } }/* end of loop j for level update */ }/* end of while loop for iith row */ /* now update everything, indices, levels and so */ L_diag_i[ii + 1] = L_diag_i[ii] + lenl; if (lenl > 0) { /* check if memory is enough */ while (ctrL + lenl > capacity_L) { HYPRE_Int tmp = capacity_L; capacity_L = (HYPRE_Int)(capacity_L * EXPAND_FACT + 1); temp_L_diag_j = hypre_TReAlloc_v2(temp_L_diag_j, HYPRE_Int, tmp, HYPRE_Int, capacity_L, memory_location); } /* now copy L data, reverse order */ for (j = 0; j < lenl; j++) { temp_L_diag_j[ctrL + j] = iL[ii - j - 1]; } ctrL += lenl; } k = lenu - ii; U_diag_i[ii + 1] = U_diag_i[ii] + k; if (k > 0) { /* check if memory is enough */ while (ctrU + k > capacity_U) { HYPRE_Int tmp = capacity_U; capacity_U = (HYPRE_Int)(capacity_U * EXPAND_FACT + 1); temp_U_diag_j = hypre_TReAlloc_v2(temp_U_diag_j, HYPRE_Int, tmp, HYPRE_Int, capacity_U, memory_location); u_levels = hypre_TReAlloc_v2(u_levels, HYPRE_Int, tmp, HYPRE_Int, capacity_U, HYPRE_MEMORY_HOST); } //hypre_TMemcpy(temp_U_diag_j+ctrU,iL+ii,HYPRE_Int,k,memory_location,HYPRE_MEMORY_HOST); hypre_TMemcpy(temp_U_diag_j + ctrU, iL + ii, HYPRE_Int, k, memory_location, HYPRE_MEMORY_HOST); hypre_TMemcpy(u_levels + ctrU, iLev + ii, HYPRE_Int, k, HYPRE_MEMORY_HOST, HYPRE_MEMORY_HOST); ctrU += k; } /* reset iw */ for (j = ii; j < lenu; j++) { iw[iL[j]] = -1; } }/* end of main loop ii from 0 to nLU-1 */ /* * Offd part */ for (ii = nLU; ii < n; ii++) { i = perm[ii]; lenl = 0; lenh = 0;/* this is the current length of heap */ lenu = ii; lena = A_diag_i[i + 1]; /* put those already inside original pattern, and set their level to 0 */ for (j = A_diag_i[i]; j < lena; j++) { /* get the neworder of that col */ col = rperm[A_diag_j[j]]; if (col < ii) { /* * this is an entry in L * we maintain a heap structure for L part */ iL[lenh] = col; iLev[lenh] = 0; iw[col] = lenh++; /*now miantian a heap structure*/ hypre_ILUMinHeapAddIIIi(iL, iLev, iw, lenh); } else if (col > ii) { /* this is an entry in U */ iL[lenu] = col; iLev[lenu] = 0; iw[col] = lenu++; } }/* end of j loop for adding pattern in original matrix */ /* put those already inside offd pattern in, and set their level to 0 */ lena = A_offd_i[i + 1]; for (j = A_offd_i[i]; j < lena; j++) { /* the offd cols are in order */ col = A_offd_j[j] + n; /* col for sure to be greater than ii */ iL[lenu] = col; iLev[lenu] = 0; iw[col] = lenu++; } /* * search lower part of current row and update pattern based on level */ while (lenh > 0) { /* * k is now the new col index after permutation * the first element of the heap is the smallest */ k = iL[0]; ilev = iLev[0]; /* * we now need to maintain the heap structure */ hypre_ILUMinHeapRemoveIIIi(iL, iLev, iw, lenh); lenh--; /* copy to the end of array */ lenl++; /* reset iw for that, not using anymore */ iw[k] = -1; hypre_swap2i(iL, iLev, ii - lenl, lenh); /* * now the elimination on current row could start. * eliminate row k (new index) from current row */ ku = U_diag_i[k + 1]; for (j = U_diag_i[k]; j < ku; j++) { col = temp_U_diag_j[j]; lev = u_levels[j] + ilev + 1; /* ignore large level */ icol = iw[col]; /* skill large level */ if (lev > lfil) { continue; } if (icol < 0) { /* not yet in */ if (col < ii) { /* * if we add to the left L, we need to maintian the * heap structure */ iL[lenh] = col; iLev[lenh] = lev; iw[col] = lenh++; /*swap it with the element right after the heap*/ /* maintain the heap */ hypre_ILUMinHeapAddIIIi(iL, iLev, iw, lenh); } else if (col > ii) { iL[lenu] = col; iLev[lenu] = lev; iw[col] = lenu++; } } else { iLev[icol] = hypre_min(lev, iLev[icol]); } }/* end of loop j for level update */ }/* end of while loop for iith row */ /* now update everything, indices, levels and so */ L_diag_i[ii + 1] = L_diag_i[ii] + lenl; if (lenl > 0) { /* check if memory is enough */ while (ctrL + lenl > capacity_L) { HYPRE_Int tmp = capacity_L; capacity_L = (HYPRE_Int)(capacity_L * EXPAND_FACT + 1); temp_L_diag_j = hypre_TReAlloc_v2(temp_L_diag_j, HYPRE_Int, tmp, HYPRE_Int, capacity_L, memory_location); } /* now copy L data, reverse order */ for (j = 0; j < lenl; j++) { temp_L_diag_j[ctrL + j] = iL[ii - j - 1]; } ctrL += lenl; } k = lenu - ii; U_diag_i[ii + 1] = U_diag_i[ii] + k; if (k > 0) { /* check if memory is enough */ while (ctrU + k > capacity_U) { HYPRE_Int tmp = capacity_U; capacity_U = (HYPRE_Int)(capacity_U * EXPAND_FACT + 1); temp_U_diag_j = hypre_TReAlloc_v2(temp_U_diag_j, HYPRE_Int, tmp, HYPRE_Int, capacity_U, memory_location); u_levels = hypre_TReAlloc_v2(u_levels, HYPRE_Int, tmp, HYPRE_Int, capacity_U, HYPRE_MEMORY_HOST); } hypre_TMemcpy(temp_U_diag_j + ctrU, iL + ii, HYPRE_Int, k, memory_location, HYPRE_MEMORY_HOST); hypre_TMemcpy(u_levels + ctrU, iLev + ii, HYPRE_Int, k, HYPRE_MEMORY_HOST, HYPRE_MEMORY_HOST); ctrU += k; } /* reset iw */ for (j = ii; j < lenu; j++) { iw[iL[j]] = -1; } } /* end of main loop ii from nLU to n */ /* external part matrix */ for (ii = n; ii < total_rows; ii++) { i = ii - n; lenl = 0; lenh = 0;/* this is the current length of heap */ lenu = ii; lena = E_i[i + 1]; /* put those already inside original pattern, and set their level to 0 */ for (j = E_i[i]; j < lena; j++) { /* get the neworder of that col */ col = E_j[j]; if (col < ii) { /* * this is an entry in L * we maintain a heap structure for L part */ iL[lenh] = col; iLev[lenh] = 0; iw[col] = lenh++; /*now miantian a heap structure*/ hypre_ILUMinHeapAddIIIi(iL, iLev, iw, lenh); } else if (col > ii) { /* this is an entry in U */ iL[lenu] = col; iLev[lenu] = 0; iw[col] = lenu++; } }/* end of j loop for adding pattern in original matrix */ /* * search lower part of current row and update pattern based on level */ while (lenh > 0) { /* * k is now the new col index after permutation * the first element of the heap is the smallest */ k = iL[0]; ilev = iLev[0]; /* * we now need to maintain the heap structure */ hypre_ILUMinHeapRemoveIIIi(iL, iLev, iw, lenh); lenh--; /* copy to the end of array */ lenl++; /* reset iw for that, not using anymore */ iw[k] = -1; hypre_swap2i(iL, iLev, ii - lenl, lenh); /* * now the elimination on current row could start. * eliminate row k (new index) from current row */ ku = U_diag_i[k + 1]; for (j = U_diag_i[k]; j < ku; j++) { col = temp_U_diag_j[j]; lev = u_levels[j] + ilev + 1; /* ignore large level */ icol = iw[col]; /* skill large level */ if (lev > lfil) { continue; } if (icol < 0) { /* not yet in */ if (col < ii) { /* * if we add to the left L, we need to maintian the * heap structure */ iL[lenh] = col; iLev[lenh] = lev; iw[col] = lenh++; /*swap it with the element right after the heap*/ /* maintain the heap */ hypre_ILUMinHeapAddIIIi(iL, iLev, iw, lenh); } else if (col > ii) { iL[lenu] = col; iLev[lenu] = lev; iw[col] = lenu++; } } else { iLev[icol] = hypre_min(lev, iLev[icol]); } }/* end of loop j for level update */ }/* end of while loop for iith row */ /* now update everything, indices, levels and so */ L_diag_i[ii + 1] = L_diag_i[ii] + lenl; if (lenl > 0) { /* check if memory is enough */ while (ctrL + lenl > capacity_L) { HYPRE_Int tmp = capacity_L; capacity_L = (HYPRE_Int)(capacity_L * EXPAND_FACT + 1); temp_L_diag_j = hypre_TReAlloc_v2(temp_L_diag_j, HYPRE_Int, tmp, HYPRE_Int, capacity_L, memory_location); } /* now copy L data, reverse order */ for (j = 0; j < lenl; j++) { temp_L_diag_j[ctrL + j] = iL[ii - j - 1]; } ctrL += lenl; } k = lenu - ii; U_diag_i[ii + 1] = U_diag_i[ii] + k; if (k > 0) { /* check if memory is enough */ while (ctrU + k > capacity_U) { HYPRE_Int tmp = capacity_U; capacity_U = (HYPRE_Int)(capacity_U * EXPAND_FACT + 1); temp_U_diag_j = hypre_TReAlloc_v2(temp_U_diag_j, HYPRE_Int, tmp, HYPRE_Int, capacity_U, memory_location); u_levels = hypre_TReAlloc_v2(u_levels, HYPRE_Int, tmp, HYPRE_Int, capacity_U, HYPRE_MEMORY_HOST); } hypre_TMemcpy(temp_U_diag_j + ctrU, iL + ii, HYPRE_Int, k, memory_location, HYPRE_MEMORY_HOST); hypre_TMemcpy(u_levels + ctrU, iLev + ii, HYPRE_Int, k, HYPRE_MEMORY_HOST, HYPRE_MEMORY_HOST); ctrU += k; } /* reset iw */ for (j = ii; j < lenu; j++) { iw[iL[j]] = -1; } }/* end of main loop ii from n to total_rows */ /* * 3: Finishing up and free memory */ hypre_TFree(u_levels, HYPRE_MEMORY_HOST); *L_diag_j = temp_L_diag_j; *U_diag_j = temp_U_diag_j; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_ILUSetupILUKRAS * * ILU(k) numeric factorization for RAS * * A: input matrix * lfil: level of fill-in, the k in ILU(k) * perm: permutation array indicating ordering of factorization. * Perm could come from a CF_marker array or a reordering routine. * nLU: size of computed LDU factorization. * Lptr, Dptr, Uptr: L, D, U factors. *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ILUSetupILUKRAS(hypre_ParCSRMatrix *A, HYPRE_Int lfil, HYPRE_Int *perm, HYPRE_Int nLU, hypre_ParCSRMatrix **Lptr, HYPRE_Real **Dptr, hypre_ParCSRMatrix **Uptr) { /* * 1: Setup and create buffers * matL/U: the ParCSR matrix for L and U * L/U_diag: the diagonal csr matrix of matL/U * A_diag_*: tempory pointer for the diagonal matrix of A and its '*' slot * ii = outer loop from 0 to nLU - 1 * i = the real col number in diag inside the outer loop * iw = working array store the reverse of active col number * iL = working array store the active col number */ /* call ILU0 if lfil is 0 */ if (lfil == 0) { return hypre_ILUSetupILU0RAS(A, perm, nLU, Lptr, Dptr, Uptr); } HYPRE_Int i, ii, j, k, k1, k2, kl, ku, jpiv, col, icol; HYPRE_Int *iw; MPI_Comm comm = hypre_ParCSRMatrixComm(A); HYPRE_Int num_procs; /* data objects for A */ hypre_CSRMatrix *A_diag = hypre_ParCSRMatrixDiag(A); hypre_CSRMatrix *A_offd = hypre_ParCSRMatrixOffd(A); HYPRE_Real *A_diag_data = hypre_CSRMatrixData(A_diag); HYPRE_Int *A_diag_i = hypre_CSRMatrixI(A_diag); HYPRE_Int *A_diag_j = hypre_CSRMatrixJ(A_diag); HYPRE_Real *A_offd_data = hypre_CSRMatrixData(A_offd); HYPRE_Int *A_offd_i = hypre_CSRMatrixI(A_offd); HYPRE_Int *A_offd_j = hypre_CSRMatrixJ(A_offd); HYPRE_MemoryLocation memory_location = hypre_ParCSRMatrixMemoryLocation(A); /* data objects for L, D, U */ hypre_ParCSRMatrix *matL; hypre_ParCSRMatrix *matU; hypre_CSRMatrix *L_diag; hypre_CSRMatrix *U_diag; HYPRE_Real *D_data; HYPRE_Real *L_diag_data = NULL; HYPRE_Int *L_diag_i; HYPRE_Int *L_diag_j = NULL; HYPRE_Real *U_diag_data = NULL; HYPRE_Int *U_diag_i; HYPRE_Int *U_diag_j = NULL; /* size of problem and external matrix */ HYPRE_Int n = hypre_CSRMatrixNumRows(A_diag); HYPRE_Int ext = hypre_CSRMatrixNumCols(A_offd); HYPRE_Int total_rows = n + ext; HYPRE_BigInt global_num_rows; HYPRE_BigInt col_starts[2]; HYPRE_Real local_nnz, total_nnz; /* data objects for E, external matrix */ HYPRE_Int *E_i; HYPRE_Int *E_j; HYPRE_Real *E_data; /* communication */ hypre_ParCSRCommPkg *comm_pkg; hypre_MPI_Comm_size(comm, &num_procs); /* reverse permutation array */ HYPRE_Int *rperm; /* temp array for old permutation */ HYPRE_Int *perm_old; /* start setup */ /* check input and get problem size */ n = hypre_CSRMatrixNumRows(A_diag); if (nLU < 0 || nLU > n) { hypre_error_w_msg(HYPRE_ERROR_ARG, "WARNING: nLU out of range.\n"); } /* Init I array anyway. S's might be freed later */ D_data = hypre_CTAlloc(HYPRE_Real, total_rows, memory_location); L_diag_i = hypre_CTAlloc(HYPRE_Int, (total_rows + 1), memory_location); U_diag_i = hypre_CTAlloc(HYPRE_Int, (total_rows + 1), memory_location); /* set Comm_Pkg if not yet built */ comm_pkg = hypre_ParCSRMatrixCommPkg(A); if (!comm_pkg) { hypre_MatvecCommPkgCreate(A); comm_pkg = hypre_ParCSRMatrixCommPkg(A); } /* * 2: Symbolic factorization * setup iw and rperm first */ /* allocate work arrays */ iw = hypre_CTAlloc(HYPRE_Int, 5 * total_rows, HYPRE_MEMORY_HOST); rperm = iw + 3 * total_rows; perm_old = perm; perm = iw + 4 * total_rows; L_diag_i[0] = U_diag_i[0] = 0; /* get reverse permutation (rperm). * rperm holds the reordered indexes. */ for (i = 0; i < n; i++) { perm[i] = perm_old[i]; } for (i = n; i < total_rows; i++) { perm[i] = i; } for (i = 0; i < total_rows; i++) { rperm[perm[i]] = i; } /* get external rows */ hypre_ILUBuildRASExternalMatrix(A, rperm, &E_i, &E_j, &E_data); /* do symbolic factorization */ hypre_ILUSetupILUKRASSymbolic(n, A_diag_i, A_diag_j, A_offd_i, A_offd_j, E_i, E_j, ext, lfil, perm, rperm, iw, nLU, L_diag_i, U_diag_i, &L_diag_j, &U_diag_j); /* * after this, we have our I,J for L, U and S ready, and L sorted * iw are still -1 after symbolic factorization * now setup helper array here */ if (L_diag_i[total_rows]) { L_diag_data = hypre_CTAlloc(HYPRE_Real, L_diag_i[total_rows], memory_location); } if (U_diag_i[total_rows]) { U_diag_data = hypre_CTAlloc(HYPRE_Real, U_diag_i[total_rows], memory_location); } /* * 3: Begin real factorization * we already have L and U structure ready, so no extra working array needed */ /* first loop for upper part */ for (ii = 0; ii < nLU; ii++) { // get row i i = perm[ii]; kl = L_diag_i[ii + 1]; ku = U_diag_i[ii + 1]; k1 = A_diag_i[i]; k2 = A_diag_i[i + 1]; /* set up working arrays */ for (j = L_diag_i[ii]; j < kl; j++) { col = L_diag_j[j]; iw[col] = j; } D_data[ii] = 0.0; iw[ii] = ii; for (j = U_diag_i[ii]; j < ku; j++) { col = U_diag_j[j]; iw[col] = j; } /* copy data from A into L, D and U */ for (j = k1; j < k2; j++) { /* compute everything in new index */ col = rperm[A_diag_j[j]]; icol = iw[col]; /* A for sure to be inside the pattern */ if (col < ii) { L_diag_data[icol] = A_diag_data[j]; } else if (col == ii) { D_data[ii] = A_diag_data[j]; } else { U_diag_data[icol] = A_diag_data[j]; } } /* elimination */ for (j = L_diag_i[ii]; j < kl; j++) { jpiv = L_diag_j[j]; L_diag_data[j] *= D_data[jpiv]; ku = U_diag_i[jpiv + 1]; for (k = U_diag_i[jpiv]; k < ku; k++) { col = U_diag_j[k]; icol = iw[col]; if (icol < 0) { /* not in partern */ continue; } if (col < ii) { /* L part */ L_diag_data[icol] -= L_diag_data[j] * U_diag_data[k]; } else if (col == ii) { /* diag part */ D_data[icol] -= L_diag_data[j] * U_diag_data[k]; } else { /* U part */ U_diag_data[icol] -= L_diag_data[j] * U_diag_data[k]; } } } /* reset working array */ ku = U_diag_i[ii + 1]; for (j = L_diag_i[ii]; j < kl; j++) { col = L_diag_j[j]; iw[col] = -1; } iw[ii] = -1; for (j = U_diag_i[ii]; j < ku; j++) { col = U_diag_j[j]; iw[col] = -1; } /* diagonal part (we store the inverse) */ if (hypre_abs(D_data[ii]) < MAT_TOL) { D_data[ii] = 1.0e-06; } D_data[ii] = 1. / D_data[ii]; }/* end of loop for upper part */ /* first loop for upper part */ for (ii = nLU; ii < n; ii++) { // get row i i = perm[ii]; kl = L_diag_i[ii + 1]; ku = U_diag_i[ii + 1]; /* set up working arrays */ for (j = L_diag_i[ii]; j < kl; j++) { col = L_diag_j[j]; iw[col] = j; } D_data[ii] = 0.0; iw[ii] = ii; for (j = U_diag_i[ii]; j < ku; j++) { col = U_diag_j[j]; iw[col] = j; } /* copy data from A into L, D and U */ k1 = A_diag_i[i]; k2 = A_diag_i[i + 1]; for (j = k1; j < k2; j++) { /* compute everything in new index */ col = rperm[A_diag_j[j]]; icol = iw[col]; /* A for sure to be inside the pattern */ if (col < ii) { L_diag_data[icol] = A_diag_data[j]; } else if (col == ii) { D_data[ii] = A_diag_data[j]; } else { U_diag_data[icol] = A_diag_data[j]; } } /* copy data from A_offd into L, D and U */ k1 = A_offd_i[i]; k2 = A_offd_i[i + 1]; for (j = k1; j < k2; j++) { /* compute everything in new index */ col = A_offd_j[j] + n; icol = iw[col]; U_diag_data[icol] = A_offd_data[j]; } /* elimination */ for (j = L_diag_i[ii]; j < kl; j++) { jpiv = L_diag_j[j]; L_diag_data[j] *= D_data[jpiv]; ku = U_diag_i[jpiv + 1]; for (k = U_diag_i[jpiv]; k < ku; k++) { col = U_diag_j[k]; icol = iw[col]; if (icol < 0) { /* not in partern */ continue; } if (col < ii) { /* L part */ L_diag_data[icol] -= L_diag_data[j] * U_diag_data[k]; } else if (col == ii) { /* diag part */ D_data[icol] -= L_diag_data[j] * U_diag_data[k]; } else { /* U part */ U_diag_data[icol] -= L_diag_data[j] * U_diag_data[k]; } } } /* reset working array */ ku = U_diag_i[ii + 1]; for (j = L_diag_i[ii]; j < kl; j++) { col = L_diag_j[j]; iw[col] = -1; } iw[ii] = -1; for (j = U_diag_i[ii]; j < ku; j++) { col = U_diag_j[j]; iw[col] = -1; } /* diagonal part (we store the inverse) */ if (hypre_abs(D_data[ii]) < MAT_TOL) { D_data[ii] = 1.0e-06; } D_data[ii] = 1. / D_data[ii]; }/* end of loop for lower part */ /* last loop through external */ for (ii = n; ii < total_rows; ii++) { // get row i i = ii - n; kl = L_diag_i[ii + 1]; ku = U_diag_i[ii + 1]; k1 = E_i[i]; k2 = E_i[i + 1]; /* set up working arrays */ for (j = L_diag_i[ii]; j < kl; j++) { col = L_diag_j[j]; iw[col] = j; } D_data[ii] = 0.0; iw[ii] = ii; for (j = U_diag_i[ii]; j < ku; j++) { col = U_diag_j[j]; iw[col] = j; } /* copy data from E into L, D and U */ for (j = k1; j < k2; j++) { /* compute everything in new index */ col = E_j[j]; icol = iw[col]; /* A for sure to be inside the pattern */ if (col < ii) { L_diag_data[icol] = E_data[j]; } else if (col == ii) { D_data[ii] = E_data[j]; } else { U_diag_data[icol] = E_data[j]; } } /* elimination */ for (j = L_diag_i[ii]; j < kl; j++) { jpiv = L_diag_j[j]; L_diag_data[j] *= D_data[jpiv]; ku = U_diag_i[jpiv + 1]; for (k = U_diag_i[jpiv]; k < ku; k++) { col = U_diag_j[k]; icol = iw[col]; if (icol < 0) { /* not in partern */ continue; } if (col < ii) { /* L part */ L_diag_data[icol] -= L_diag_data[j] * U_diag_data[k]; } else if (col == ii) { /* diag part */ D_data[icol] -= L_diag_data[j] * U_diag_data[k]; } else { /* U part */ U_diag_data[icol] -= L_diag_data[j] * U_diag_data[k]; } } } /* reset working array */ ku = U_diag_i[ii + 1]; for (j = L_diag_i[ii]; j < kl; j++) { col = L_diag_j[j]; iw[col] = -1; } iw[ii] = -1; for (j = U_diag_i[ii]; j < ku; j++) { col = U_diag_j[j]; iw[col] = -1; } /* diagonal part (we store the inverse) */ if (hypre_abs(D_data[ii]) < MAT_TOL) { D_data[ii] = 1.0e-06; } D_data[ii] = 1. / D_data[ii]; }/* end of loop for external loop */ /* * 4: Finishing up and free */ HYPRE_BigInt big_total_rows = (HYPRE_BigInt)total_rows; hypre_MPI_Allreduce(&big_total_rows, &global_num_rows, 1, HYPRE_MPI_BIG_INT, hypre_MPI_SUM, comm); /* need to get new column start */ { HYPRE_BigInt global_start; hypre_MPI_Scan(&big_total_rows, &global_start, 1, HYPRE_MPI_BIG_INT, hypre_MPI_SUM, comm); col_starts[0] = global_start - total_rows; col_starts[1] = global_start; } /* Assemble LDU matrices */ matL = hypre_ParCSRMatrixCreate( comm, global_num_rows, global_num_rows, col_starts, col_starts, 0 /* num_cols_offd */, L_diag_i[total_rows], 0 /* num_nonzeros_offd */); L_diag = hypre_ParCSRMatrixDiag(matL); hypre_CSRMatrixI(L_diag) = L_diag_i; if (L_diag_i[total_rows] > 0) { hypre_CSRMatrixData(L_diag) = L_diag_data; hypre_CSRMatrixJ(L_diag) = L_diag_j; } else { /* we allocated some initial length, so free them */ hypre_TFree(L_diag_j, memory_location); } /* store (global) total number of nonzeros */ local_nnz = (HYPRE_Real) (L_diag_i[total_rows]); hypre_MPI_Allreduce(&local_nnz, &total_nnz, 1, HYPRE_MPI_REAL, hypre_MPI_SUM, comm); hypre_ParCSRMatrixDNumNonzeros(matL) = total_nnz; matU = hypre_ParCSRMatrixCreate( comm, global_num_rows, global_num_rows, col_starts, col_starts, 0, U_diag_i[total_rows], 0 ); U_diag = hypre_ParCSRMatrixDiag(matU); hypre_CSRMatrixI(U_diag) = U_diag_i; if (U_diag_i[n] > 0) { hypre_CSRMatrixData(U_diag) = U_diag_data; hypre_CSRMatrixJ(U_diag) = U_diag_j; } else { /* we allocated some initial length, so free them */ hypre_TFree(U_diag_j, memory_location); } /* store (global) total number of nonzeros */ local_nnz = (HYPRE_Real) (U_diag_i[total_rows]); hypre_MPI_Allreduce(&local_nnz, &total_nnz, 1, HYPRE_MPI_REAL, hypre_MPI_SUM, comm); hypre_ParCSRMatrixDNumNonzeros(matU) = total_nnz; /* free */ hypre_TFree(iw, HYPRE_MEMORY_HOST); /* free external data */ if (E_i) { hypre_TFree(E_i, HYPRE_MEMORY_HOST); } if (E_j) { hypre_TFree(E_j, HYPRE_MEMORY_HOST); hypre_TFree(E_data, HYPRE_MEMORY_HOST); } /* set matrix pointers */ *Lptr = matL; *Dptr = D_data; *Uptr = matU; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_ILUSetupILUTRAS * * ILUT for RAS * * A: input matrix * lfil: level of fill-in, the k in ILU(k) * tol: droptol array in ILUT * tol[0]: matrix B * tol[1]: matrix E and F * tol[2]: matrix S * perm: permutation array indicating ordering of factorization. * Perm could come from a CF_marker: array or a reordering routine. * nLU: size of computed LDU factorization. If nLU < n, Schur compelemnt will be formed * Lptr, Dptr, Uptr: L, D, U factors. * Sptr: Schur complement * * Keep the largest lfil entries that is greater than some tol relative * to the input tol and the norm of that row in both L and U *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ILUSetupILUTRAS(hypre_ParCSRMatrix *A, HYPRE_Int lfil, HYPRE_Real *tol, HYPRE_Int *perm, HYPRE_Int nLU, hypre_ParCSRMatrix **Lptr, HYPRE_Real **Dptr, hypre_ParCSRMatrix **Uptr) { /* * 1: Setup and create buffers * matL/U: the ParCSR matrix for L and U * L/U_diag: the diagonal csr matrix of matL/U * A_diag_*: tempory pointer for the diagonal matrix of A and its '*' slot * ii = outer loop from 0 to nLU - 1 * i = the real col number in diag inside the outer loop * iw = working array store the reverse of active col number * iL = working array store the active col number */ HYPRE_Real local_nnz, total_nnz; HYPRE_Int i, ii, j, k1, k2, k12, k22, kl, ku, col, icol, lenl, lenu, lenhu, lenhlr, lenhll, jpos, jrow; HYPRE_Real inorm, itolb, itolef, dpiv, lxu; HYPRE_Int *iw, *iL; HYPRE_Real *w; /* memory management */ HYPRE_Int ctrL; HYPRE_Int ctrU; HYPRE_Int initial_alloc = 0; HYPRE_Int capacity_L; HYPRE_Int capacity_U; HYPRE_Int nnz_A; /* communication stuffs for S */ MPI_Comm comm = hypre_ParCSRMatrixComm(A); HYPRE_Int num_procs; hypre_ParCSRCommPkg *comm_pkg; HYPRE_BigInt col_starts[2]; /* data objects for A */ hypre_CSRMatrix *A_diag = hypre_ParCSRMatrixDiag(A); hypre_CSRMatrix *A_offd = hypre_ParCSRMatrixOffd(A); HYPRE_Real *A_diag_data = hypre_CSRMatrixData(A_diag); HYPRE_Int *A_diag_i = hypre_CSRMatrixI(A_diag); HYPRE_Int *A_diag_j = hypre_CSRMatrixJ(A_diag); HYPRE_Int *A_offd_i = hypre_CSRMatrixI(A_offd); HYPRE_Int *A_offd_j = hypre_CSRMatrixJ(A_offd); HYPRE_Real *A_offd_data = hypre_CSRMatrixData(A_offd); HYPRE_MemoryLocation memory_location = hypre_ParCSRMatrixMemoryLocation(A); /* data objects for L, D, U */ hypre_ParCSRMatrix *matL; hypre_ParCSRMatrix *matU; hypre_CSRMatrix *L_diag; hypre_CSRMatrix *U_diag; HYPRE_Real *D_data; HYPRE_Real *L_diag_data = NULL; HYPRE_Int *L_diag_i; HYPRE_Int *L_diag_j = NULL; HYPRE_Real *U_diag_data = NULL; HYPRE_Int *U_diag_i; HYPRE_Int *U_diag_j = NULL; /* size of problem and external matrix */ HYPRE_Int n = hypre_CSRMatrixNumRows(A_diag); HYPRE_Int ext = hypre_CSRMatrixNumCols(A_offd); HYPRE_Int total_rows = n + ext; HYPRE_BigInt global_num_rows; /* data objects for E, external matrix */ HYPRE_Int *E_i; HYPRE_Int *E_j; HYPRE_Real *E_data; /* reverse permutation */ HYPRE_Int *rperm; /* old permutation */ HYPRE_Int *perm_old; /* start setup * check input first */ n = hypre_CSRMatrixNumRows(A_diag); if (nLU < 0 || nLU > n) { hypre_error_w_msg(HYPRE_ERROR_ARG, "WARNING: nLU out of range.\n"); } /* start set up * setup communication stuffs first */ hypre_MPI_Comm_size(comm, &num_procs); comm_pkg = hypre_ParCSRMatrixCommPkg(A); /* create if not yet built */ if (!comm_pkg) { hypre_MatvecCommPkgCreate(A); comm_pkg = hypre_ParCSRMatrixCommPkg(A); } /* setup initial memory */ nnz_A = A_diag_i[nLU]; if (n > 0) { initial_alloc = (HYPRE_Int)(nLU + hypre_ceil((HYPRE_Real)(nnz_A / 2.0))); } capacity_L = initial_alloc; capacity_U = initial_alloc; D_data = hypre_CTAlloc(HYPRE_Real, total_rows, memory_location); L_diag_i = hypre_CTAlloc(HYPRE_Int, (total_rows + 1), memory_location); U_diag_i = hypre_CTAlloc(HYPRE_Int, (total_rows + 1), memory_location); L_diag_j = hypre_CTAlloc(HYPRE_Int, capacity_L, memory_location); U_diag_j = hypre_CTAlloc(HYPRE_Int, capacity_U, memory_location); L_diag_data = hypre_CTAlloc(HYPRE_Real, capacity_L, memory_location); U_diag_data = hypre_CTAlloc(HYPRE_Real, capacity_U, memory_location); ctrL = ctrU = 0; /* setting up working array */ iw = hypre_CTAlloc(HYPRE_Int, 4 * total_rows, HYPRE_MEMORY_HOST); iL = iw + total_rows; w = hypre_CTAlloc(HYPRE_Real, total_rows, HYPRE_MEMORY_HOST); for (i = 0; i < total_rows; i++) { iw[i] = -1; } L_diag_i[0] = U_diag_i[0] = 0; /* get reverse permutation (rperm). * rperm holds the reordered indexes. * rperm[old] -> new * perm[new] -> old */ rperm = iw + 2 * total_rows; perm_old = perm; perm = iw + 3 * total_rows; for (i = 0; i < n; i++) { perm[i] = perm_old[i]; } for (i = n; i < total_rows; i++) { perm[i] = i; } for (i = 0; i < total_rows; i++) { rperm[perm[i]] = i; } /* get external matrix */ hypre_ILUBuildRASExternalMatrix(A, rperm, &E_i, &E_j, &E_data); /* * 2: Main loop of elimination * maintain two heaps * |----->*********<-----|-----*********| * |col heap***value heap|value in U****| */ /* main outer loop for upper part */ for (ii = 0 ; ii < nLU; ii++) { /* get real row with perm */ i = perm[ii]; k1 = A_diag_i[i]; k2 = A_diag_i[i + 1]; kl = ii - 1; /* reset row norm of ith row */ inorm = .0; for (j = k1; j < k2; j++) { inorm += hypre_abs(A_diag_data[j]); } if (inorm == .0) { hypre_error_w_msg(HYPRE_ERROR_ARG, "WARNING: ILUT with zero row.\n"); } inorm /= (HYPRE_Real)(k2 - k1); /* set the scaled tol for that row */ itolb = tol[0] * inorm; itolef = tol[1] * inorm; /* reset displacement */ lenhll = lenhlr = lenu = 0; w[ii] = 0.0; iw[ii] = ii; /* copy in data from A */ for (j = k1; j < k2; j++) { /* get now col number */ col = rperm[A_diag_j[j]]; if (col < ii) { /* L part of it */ iL[lenhll] = col; w[lenhll] = A_diag_data[j]; iw[col] = lenhll++; /* add to heap, by col number */ hypre_ILUMinHeapAddIRIi(iL, w, iw, lenhll); } else if (col == ii) { w[ii] = A_diag_data[j]; } else { lenu++; jpos = lenu + ii; iL[jpos] = col; w[jpos] = A_diag_data[j]; iw[col] = jpos; } } /* * main elimination * need to maintain 2 heaps for L, one heap for col and one heaps for value * maintian an array for U, and do qsplit with quick sort after that * while the heap of col is greater than zero */ while (lenhll > 0) { /* get the next row from top of the heap */ jrow = iL[0]; dpiv = w[0] * D_data[jrow]; w[0] = dpiv; /* now remove it from the top of the heap */ hypre_ILUMinHeapRemoveIRIi(iL, w, iw, lenhll); lenhll--; /* * reset the drop part to -1 * we don't need this iw anymore */ iw[jrow] = -1; /* need to keep this one, move to the end of the heap */ /* no longer need to maintain iw */ hypre_swap2(iL, w, lenhll, kl - lenhlr); lenhlr++; hypre_ILUMaxrHeapAddRabsI(w + kl, iL + kl, lenhlr); /* loop for elimination */ ku = U_diag_i[jrow + 1]; for (j = U_diag_i[jrow]; j < ku; j++) { col = U_diag_j[j]; icol = iw[col]; lxu = - dpiv * U_diag_data[j]; /* we don't want to fill small number to empty place */ if ((icol == -1) && ((col < nLU && hypre_abs(lxu) < itolb) || (col >= nLU && hypre_abs(lxu) < itolef))) { continue; } if (icol == -1) { if (col < ii) { /* L part * not already in L part * put it to the end of heap * might overwrite some small entries, no issue */ iL[lenhll] = col; w[lenhll] = lxu; iw[col] = lenhll++; /* add to heap, by col number */ hypre_ILUMinHeapAddIRIi(iL, w, iw, lenhll); } else if (col == ii) { w[ii] += lxu; } else { /* * not already in U part * put is to the end of heap */ lenu++; jpos = lenu + ii; iL[jpos] = col; w[jpos] = lxu; iw[col] = jpos; } } else { w[icol] += lxu; } } }/* while loop for the elimination of current row */ if (hypre_abs(w[ii]) < MAT_TOL) { w[ii] = 1.0e-06; } D_data[ii] = 1. / w[ii]; iw[ii] = -1; /* * now pick up the largest lfil from L * L part is guarantee to be larger than itol */ lenl = lenhlr < lfil ? lenhlr : lfil; L_diag_i[ii + 1] = L_diag_i[ii] + lenl; if (lenl > 0) { /* test if memory is enough */ while (ctrL + lenl > capacity_L) { HYPRE_Int tmp = capacity_L; capacity_L = (HYPRE_Int)(capacity_L * EXPAND_FACT + 1); L_diag_j = hypre_TReAlloc_v2(L_diag_j, HYPRE_Int, tmp, HYPRE_Int, capacity_L, memory_location); L_diag_data = hypre_TReAlloc_v2(L_diag_data, HYPRE_Real, tmp, HYPRE_Real, capacity_L, memory_location); } ctrL += lenl; /* copy large data in */ for (j = L_diag_i[ii]; j < ctrL; j++) { L_diag_j[j] = iL[kl]; L_diag_data[j] = w[kl]; hypre_ILUMaxrHeapRemoveRabsI(w + kl, iL + kl, lenhlr); lenhlr--; } } /* * now reset working array * L part already reset when move out of heap, only U part */ ku = lenu + ii; for (j = ii + 1; j <= ku; j++) { iw[iL[j]] = -1; } if (lenu < lfil) { /* we simply keep all of the data, no need to sort */ lenhu = lenu; } else { /* need to sort the first small(hopefully) part of it */ lenhu = lfil; /* quick split, only sort the first small part of the array */ hypre_ILUMaxQSplitRabsI(w, iL, ii + 1, ii + lenhu, ii + lenu); } U_diag_i[ii + 1] = U_diag_i[ii] + lenhu; if (lenhu > 0) { /* test if memory is enough */ while (ctrU + lenhu > capacity_U) { HYPRE_Int tmp = capacity_U; capacity_U = (HYPRE_Int)(capacity_U * EXPAND_FACT + 1); U_diag_j = hypre_TReAlloc_v2(U_diag_j, HYPRE_Int, tmp, HYPRE_Int, capacity_U, memory_location); U_diag_data = hypre_TReAlloc_v2(U_diag_data, HYPRE_Real, tmp, HYPRE_Real, capacity_U, memory_location); } ctrU += lenhu; /* copy large data in */ for (j = U_diag_i[ii]; j < ctrU; j++) { jpos = ii + 1 + j - U_diag_i[ii]; U_diag_j[j] = iL[jpos]; U_diag_data[j] = w[jpos]; } } }/* end of ii loop from 0 to nLU-1 */ /* second outer loop for lower part */ for (ii = nLU; ii < n; ii++) { /* get real row with perm */ i = perm[ii]; k1 = A_diag_i[i]; k2 = A_diag_i[i + 1]; k12 = A_offd_i[i]; k22 = A_offd_i[i + 1]; kl = ii - 1; /* reset row norm of ith row */ inorm = .0; for (j = k1; j < k2; j++) { inorm += hypre_abs(A_diag_data[j]); } for (j = k12; j < k22; j++) { inorm += hypre_abs(A_offd_data[j]); } if (inorm == .0) { hypre_error_w_msg(HYPRE_ERROR_ARG, "WARNING: ILUT with zero row.\n"); } inorm /= (HYPRE_Real)(k2 + k22 - k1 - k12); /* set the scaled tol for that row */ itolb = tol[0] * inorm; itolef = tol[1] * inorm; /* reset displacement */ lenhll = lenhlr = lenu = 0; w[ii] = 0.0; iw[ii] = ii; /* copy in data from A_diag */ for (j = k1; j < k2; j++) { /* get now col number */ col = rperm[A_diag_j[j]]; if (col < ii) { /* L part of it */ iL[lenhll] = col; w[lenhll] = A_diag_data[j]; iw[col] = lenhll++; /* add to heap, by col number */ hypre_ILUMinHeapAddIRIi(iL, w, iw, lenhll); } else if (col == ii) { w[ii] = A_diag_data[j]; } else { lenu++; jpos = lenu + ii; iL[jpos] = col; w[jpos] = A_diag_data[j]; iw[col] = jpos; } } /* copy in data from A_offd */ for (j = k12; j < k22; j++) { /* get now col number */ col = A_offd_j[j] + n; /* all should greater than ii in lower part */ lenu++; jpos = lenu + ii; iL[jpos] = col; w[jpos] = A_offd_data[j]; iw[col] = jpos; } /* * main elimination * need to maintain 2 heaps for L, one heap for col and one heaps for value * maintian an array for U, and do qsplit with quick sort after that * while the heap of col is greater than zero */ while (lenhll > 0) { /* get the next row from top of the heap */ jrow = iL[0]; dpiv = w[0] * D_data[jrow]; w[0] = dpiv; /* now remove it from the top of the heap */ hypre_ILUMinHeapRemoveIRIi(iL, w, iw, lenhll); lenhll--; /* * reset the drop part to -1 * we don't need this iw anymore */ iw[jrow] = -1; /* need to keep this one, move to the end of the heap */ /* no longer need to maintain iw */ hypre_swap2(iL, w, lenhll, kl - lenhlr); lenhlr++; hypre_ILUMaxrHeapAddRabsI(w + kl, iL + kl, lenhlr); /* loop for elimination */ ku = U_diag_i[jrow + 1]; for (j = U_diag_i[jrow]; j < ku; j++) { col = U_diag_j[j]; icol = iw[col]; lxu = - dpiv * U_diag_data[j]; /* we don't want to fill small number to empty place */ if ((icol == -1) && ((col < nLU && hypre_abs(lxu) < itolb) || (col >= nLU && hypre_abs(lxu) < itolef))) { continue; } if (icol == -1) { if (col < ii) { /* L part * not already in L part * put it to the end of heap * might overwrite some small entries, no issue */ iL[lenhll] = col; w[lenhll] = lxu; iw[col] = lenhll++; /* add to heap, by col number */ hypre_ILUMinHeapAddIRIi(iL, w, iw, lenhll); } else if (col == ii) { w[ii] += lxu; } else { /* * not already in U part * put is to the end of heap */ lenu++; jpos = lenu + ii; iL[jpos] = col; w[jpos] = lxu; iw[col] = jpos; } } else { w[icol] += lxu; } } }/* while loop for the elimination of current row */ if (hypre_abs(w[ii]) < MAT_TOL) { w[ii] = 1.0e-06; } D_data[ii] = 1. / w[ii]; iw[ii] = -1; /* * now pick up the largest lfil from L * L part is guarantee to be larger than itol */ lenl = lenhlr < lfil ? lenhlr : lfil; L_diag_i[ii + 1] = L_diag_i[ii] + lenl; if (lenl > 0) { /* test if memory is enough */ while (ctrL + lenl > capacity_L) { HYPRE_Int tmp = capacity_L; capacity_L = (HYPRE_Int)(capacity_L * EXPAND_FACT + 1); L_diag_j = hypre_TReAlloc_v2(L_diag_j, HYPRE_Int, tmp, HYPRE_Int, capacity_L, memory_location); L_diag_data = hypre_TReAlloc_v2(L_diag_data, HYPRE_Real, tmp, HYPRE_Real, capacity_L, memory_location); } ctrL += lenl; /* copy large data in */ for (j = L_diag_i[ii]; j < ctrL; j++) { L_diag_j[j] = iL[kl]; L_diag_data[j] = w[kl]; hypre_ILUMaxrHeapRemoveRabsI(w + kl, iL + kl, lenhlr); lenhlr--; } } /* * now reset working array * L part already reset when move out of heap, only U part */ ku = lenu + ii; for (j = ii + 1; j <= ku; j++) { iw[iL[j]] = -1; } if (lenu < lfil) { /* we simply keep all of the data, no need to sort */ lenhu = lenu; } else { /* need to sort the first small(hopefully) part of it */ lenhu = lfil; /* quick split, only sort the first small part of the array */ hypre_ILUMaxQSplitRabsI(w, iL, ii + 1, ii + lenhu, ii + lenu); } U_diag_i[ii + 1] = U_diag_i[ii] + lenhu; if (lenhu > 0) { /* test if memory is enough */ while (ctrU + lenhu > capacity_U) { HYPRE_Int tmp = capacity_U; capacity_U = (HYPRE_Int)(capacity_U * EXPAND_FACT + 1); U_diag_j = hypre_TReAlloc_v2(U_diag_j, HYPRE_Int, tmp, HYPRE_Int, capacity_U, memory_location); U_diag_data = hypre_TReAlloc_v2(U_diag_data, HYPRE_Real, tmp, HYPRE_Real, capacity_U, memory_location); } ctrU += lenhu; /* copy large data in */ for (j = U_diag_i[ii]; j < ctrU; j++) { jpos = ii + 1 + j - U_diag_i[ii]; U_diag_j[j] = iL[jpos]; U_diag_data[j] = w[jpos]; } } }/* end of ii loop from nLU to n */ /* main outer loop for upper part */ for (ii = n; ii < total_rows; ii++) { /* get real row with perm */ i = ii - n; k1 = E_i[i]; k2 = E_i[i + 1]; kl = ii - 1; /* reset row norm of ith row */ inorm = .0; for (j = k1; j < k2; j++) { inorm += hypre_abs(E_data[j]); } if (inorm == .0) { hypre_error_w_msg(HYPRE_ERROR_ARG, "WARNING: ILUT with zero row.\n"); } inorm /= (HYPRE_Real)(k2 - k1); /* set the scaled tol for that row */ itolb = tol[0] * inorm; itolef = tol[1] * inorm; /* reset displacement */ lenhll = lenhlr = lenu = 0; w[ii] = 0.0; iw[ii] = ii; /* copy in data from A */ for (j = k1; j < k2; j++) { /* get now col number */ col = rperm[E_j[j]]; if (col < ii) { /* L part of it */ iL[lenhll] = col; w[lenhll] = E_data[j]; iw[col] = lenhll++; /* add to heap, by col number */ hypre_ILUMinHeapAddIRIi(iL, w, iw, lenhll); } else if (col == ii) { w[ii] = E_data[j]; } else { lenu++; jpos = lenu + ii; iL[jpos] = col; w[jpos] = E_data[j]; iw[col] = jpos; } } /* * main elimination * need to maintain 2 heaps for L, one heap for col and one heaps for value * maintian an array for U, and do qsplit with quick sort after that * while the heap of col is greater than zero */ while (lenhll > 0) { /* get the next row from top of the heap */ jrow = iL[0]; dpiv = w[0] * D_data[jrow]; w[0] = dpiv; /* now remove it from the top of the heap */ hypre_ILUMinHeapRemoveIRIi(iL, w, iw, lenhll); lenhll--; /* * reset the drop part to -1 * we don't need this iw anymore */ iw[jrow] = -1; /* need to keep this one, move to the end of the heap */ /* no longer need to maintain iw */ hypre_swap2(iL, w, lenhll, kl - lenhlr); lenhlr++; hypre_ILUMaxrHeapAddRabsI(w + kl, iL + kl, lenhlr); /* loop for elimination */ ku = U_diag_i[jrow + 1]; for (j = U_diag_i[jrow]; j < ku; j++) { col = U_diag_j[j]; icol = iw[col]; lxu = - dpiv * U_diag_data[j]; /* we don't want to fill small number to empty place */ if ((icol == -1) && ((col < nLU && hypre_abs(lxu) < itolb) || (col >= nLU && hypre_abs(lxu) < itolef))) { continue; } if (icol == -1) { if (col < ii) { /* L part * not already in L part * put it to the end of heap * might overwrite some small entries, no issue */ iL[lenhll] = col; w[lenhll] = lxu; iw[col] = lenhll++; /* add to heap, by col number */ hypre_ILUMinHeapAddIRIi(iL, w, iw, lenhll); } else if (col == ii) { w[ii] += lxu; } else { /* * not already in U part * put is to the end of heap */ lenu++; jpos = lenu + ii; iL[jpos] = col; w[jpos] = lxu; iw[col] = jpos; } } else { w[icol] += lxu; } } }/* while loop for the elimination of current row */ if (hypre_abs(w[ii]) < MAT_TOL) { w[ii] = 1.0e-06; } D_data[ii] = 1. / w[ii]; iw[ii] = -1; /* * now pick up the largest lfil from L * L part is guarantee to be larger than itol */ lenl = lenhlr < lfil ? lenhlr : lfil; L_diag_i[ii + 1] = L_diag_i[ii] + lenl; if (lenl > 0) { /* test if memory is enough */ while (ctrL + lenl > capacity_L) { HYPRE_Int tmp = capacity_L; capacity_L = (HYPRE_Int)(capacity_L * EXPAND_FACT + 1); L_diag_j = hypre_TReAlloc_v2(L_diag_j, HYPRE_Int, tmp, HYPRE_Int, capacity_L, memory_location); L_diag_data = hypre_TReAlloc_v2(L_diag_data, HYPRE_Real, tmp, HYPRE_Real, capacity_L, memory_location); } ctrL += lenl; /* copy large data in */ for (j = L_diag_i[ii]; j < ctrL; j++) { L_diag_j[j] = iL[kl]; L_diag_data[j] = w[kl]; hypre_ILUMaxrHeapRemoveRabsI(w + kl, iL + kl, lenhlr); lenhlr--; } } /* * now reset working array * L part already reset when move out of heap, only U part */ ku = lenu + ii; for (j = ii + 1; j <= ku; j++) { iw[iL[j]] = -1; } if (lenu < lfil) { /* we simply keep all of the data, no need to sort */ lenhu = lenu; } else { /* need to sort the first small(hopefully) part of it */ lenhu = lfil; /* quick split, only sort the first small part of the array */ hypre_ILUMaxQSplitRabsI(w, iL, ii + 1, ii + lenhu, ii + lenu); } U_diag_i[ii + 1] = U_diag_i[ii] + lenhu; if (lenhu > 0) { /* test if memory is enough */ while (ctrU + lenhu > capacity_U) { HYPRE_Int tmp = capacity_U; capacity_U = (HYPRE_Int)(capacity_U * EXPAND_FACT + 1); U_diag_j = hypre_TReAlloc_v2(U_diag_j, HYPRE_Int, tmp, HYPRE_Int, capacity_U, memory_location); U_diag_data = hypre_TReAlloc_v2(U_diag_data, HYPRE_Real, tmp, HYPRE_Real, capacity_U, memory_location); } ctrU += lenhu; /* copy large data in */ for (j = U_diag_i[ii]; j < ctrU; j++) { jpos = ii + 1 + j - U_diag_i[ii]; U_diag_j[j] = iL[jpos]; U_diag_data[j] = w[jpos]; } } }/* end of ii loop from nLU to total_rows */ /* * 3: Finishing up and free */ HYPRE_BigInt big_total_rows = (HYPRE_BigInt)total_rows; hypre_MPI_Allreduce(&big_total_rows, &global_num_rows, 1, HYPRE_MPI_BIG_INT, hypre_MPI_SUM, comm); /* need to get new column start */ { HYPRE_BigInt global_start; hypre_MPI_Scan(&big_total_rows, &global_start, 1, HYPRE_MPI_BIG_INT, hypre_MPI_SUM, comm); col_starts[0] = global_start - total_rows; col_starts[1] = global_start; } /* create parcsr matrix */ matL = hypre_ParCSRMatrixCreate( comm, global_num_rows, global_num_rows, col_starts, col_starts, 0, L_diag_i[total_rows], 0 ); L_diag = hypre_ParCSRMatrixDiag(matL); hypre_CSRMatrixI(L_diag) = L_diag_i; if (L_diag_i[total_rows] > 0) { hypre_CSRMatrixData(L_diag) = L_diag_data; hypre_CSRMatrixJ(L_diag) = L_diag_j; } else { /* we initialized some anyway, so remove if unused */ hypre_TFree(L_diag_j, memory_location); hypre_TFree(L_diag_data, memory_location); } /* store (global) total number of nonzeros */ local_nnz = (HYPRE_Real) (L_diag_i[total_rows]); hypre_MPI_Allreduce(&local_nnz, &total_nnz, 1, HYPRE_MPI_REAL, hypre_MPI_SUM, comm); hypre_ParCSRMatrixDNumNonzeros(matL) = total_nnz; matU = hypre_ParCSRMatrixCreate( comm, global_num_rows, global_num_rows, col_starts, col_starts, 0, U_diag_i[total_rows], 0 ); U_diag = hypre_ParCSRMatrixDiag(matU); hypre_CSRMatrixI(U_diag) = U_diag_i; if (U_diag_i[total_rows] > 0) { hypre_CSRMatrixData(U_diag) = U_diag_data; hypre_CSRMatrixJ(U_diag) = U_diag_j; } else { /* we initialized some anyway, so remove if unused */ hypre_TFree(U_diag_j, memory_location); hypre_TFree(U_diag_data, memory_location); } /* store (global) total number of nonzeros */ local_nnz = (HYPRE_Real) (U_diag_i[total_rows]); hypre_MPI_Allreduce(&local_nnz, &total_nnz, 1, HYPRE_MPI_REAL, hypre_MPI_SUM, comm); hypre_ParCSRMatrixDNumNonzeros(matU) = total_nnz; /* free working array */ hypre_TFree(iw, HYPRE_MEMORY_HOST); hypre_TFree(w, HYPRE_MEMORY_HOST); /* free external data */ if (E_i) { hypre_TFree(E_i, HYPRE_MEMORY_HOST); } if (E_j) { hypre_TFree(E_j, HYPRE_MEMORY_HOST); hypre_TFree(E_data, HYPRE_MEMORY_HOST); } /* set matrix pointers */ *Lptr = matL; *Dptr = D_data; *Uptr = matU; return hypre_error_flag; } hypre-2.33.0/src/parcsr_ls/par_ilu_setup_device.c000066400000000000000000000573351477326011500220660ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "_hypre_parcsr_ls.h" #include "_hypre_utilities.hpp" #if defined(HYPRE_USING_GPU) /*-------------------------------------------------------------------------- * hypre_ILUSetupDevice * * ILU(0), ILUK, ILUT setup on the device * * Arguments: * A = input matrix * perm_data = permutation array indicating ordering of rows. * Could come from a CF_marker array or a reordering routine. * qperm_data = permutation array indicating ordering of columns * nI = number of internal unknowns * nLU = size of incomplete factorization, nLU should obey nLU <= nI. * Schur complement is formed if nLU < n * * This function will form the global Schur Matrix if nLU < n *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ILUSetupDevice(hypre_ParILUData *ilu_data, hypre_ParCSRMatrix *A, HYPRE_Int *perm_data, HYPRE_Int *qperm_data, HYPRE_Int n, HYPRE_Int nLU, hypre_CSRMatrix **BLUptr, hypre_ParCSRMatrix **matSptr, hypre_CSRMatrix **Eptr, hypre_CSRMatrix **Fptr) { /* Input ILU data */ HYPRE_Int ilu_type = hypre_ParILUDataIluType(ilu_data); HYPRE_Int fill_level = hypre_ParILUDataLfil(ilu_data); HYPRE_Int max_row_nnz = hypre_ParILUDataMaxRowNnz(ilu_data); HYPRE_Real *droptol = hypre_ParILUDataDroptol(ilu_data); HYPRE_Int iter_setup_type = hypre_ParILUDataIterativeSetupType(ilu_data); HYPRE_Int iter_setup_option = hypre_ParILUDataIterativeSetupOption(ilu_data); HYPRE_Int iter_setup_max_iter = hypre_ParILUDataIterativeSetupMaxIter(ilu_data); HYPRE_Complex iter_setup_tol = hypre_ParILUDataIterativeSetupTolerance(ilu_data); /* Input matrix data */ MPI_Comm comm = hypre_ParCSRMatrixComm(A); HYPRE_MemoryLocation memory_location = hypre_ParCSRMatrixMemoryLocation(A); hypre_ParCSRMatrix *matS = NULL; hypre_CSRMatrix *A_diag = NULL; hypre_CSRMatrix *A_offd = hypre_ParCSRMatrixOffd(A); hypre_CSRMatrix *h_A_offd = NULL; HYPRE_Int *A_offd_i = NULL; HYPRE_Int *A_offd_j = NULL; HYPRE_Real *A_offd_data = NULL; hypre_CSRMatrix *SLU = NULL; /* Permutation arrays */ HYPRE_Int *rperm_data = NULL; HYPRE_Int *rqperm_data = NULL; hypre_IntArray *perm = NULL; hypre_IntArray *rperm = NULL; hypre_IntArray *qperm = NULL; hypre_IntArray *rqperm = NULL; hypre_IntArray *h_perm = NULL; hypre_IntArray *h_rperm = NULL; /* Variables for matS */ HYPRE_Int m = n - nLU; HYPRE_Int nI = nLU; //use default HYPRE_Int e = 0; HYPRE_Int m_e = m; HYPRE_Int *S_diag_i = NULL; hypre_CSRMatrix *S_offd = NULL; HYPRE_Int *S_offd_i = NULL; HYPRE_Int *S_offd_j = NULL; HYPRE_Real *S_offd_data = NULL; HYPRE_BigInt *S_offd_colmap = NULL; HYPRE_Int S_offd_nnz; HYPRE_Int S_offd_ncols; HYPRE_Int S_diag_nnz; hypre_ParCSRMatrix *Apq = NULL; hypre_ParCSRMatrix *ALU = NULL; hypre_ParCSRMatrix *parL = NULL; hypre_ParCSRMatrix *parU = NULL; hypre_ParCSRMatrix *parS = NULL; HYPRE_Real *parD = NULL; HYPRE_Int *uend = NULL; /* Local variables */ HYPRE_BigInt *send_buf = NULL; hypre_ParCSRCommPkg *comm_pkg; hypre_ParCSRCommHandle *comm_handle; HYPRE_Int num_sends, begin, end; HYPRE_BigInt total_rows, col_starts[2]; HYPRE_Int i, j, k1, k2, k3, col; HYPRE_Int my_id, num_procs; hypre_MPI_Comm_size(comm, &num_procs); hypre_MPI_Comm_rank(comm, &my_id); /* Sanity checks */ #if !defined(HYPRE_USING_UNIFIED_MEMORY) if (ilu_type == 0 && fill_level) { hypre_error_w_msg(HYPRE_ERROR_GENERIC, "ILUK setup on device runs requires unified memory!"); return hypre_error_flag; } else if (ilu_type == 10 && fill_level) { hypre_error_w_msg(HYPRE_ERROR_GENERIC, "GMRES+ILUK setup on device runs requires unified memory!"); return hypre_error_flag; } #endif /* Build the inverse permutation arrays */ if (perm_data && qperm_data) { /* Create arrays */ perm = hypre_IntArrayCreate(n); qperm = hypre_IntArrayCreate(n); /* Set existing data */ hypre_IntArrayData(perm) = perm_data; hypre_IntArrayData(qperm) = qperm_data; /* Initialize arrays */ hypre_IntArrayInitialize_v2(perm, memory_location); hypre_IntArrayInitialize_v2(qperm, memory_location); /* Compute inverse permutation arrays */ hypre_IntArrayInverseMapping(perm, &rperm); hypre_IntArrayInverseMapping(qperm, &rqperm); rqperm_data = hypre_IntArrayData(rqperm); } /* Only call ILU when we really have a matrix on this processor */ if (n > 0) { /* * Apply ILU factorization to the entire A_diag * * | L \ U (B) L^{-1}F | * | EU^{-1} L \ U (S)| * * Extract submatrix L_B U_B, L_S U_S, EU_B^{-1}, L_B^{-1}F * Note that in this function after ILU, all rows are sorted * in a way different than HYPRE. Diagonal is not listed in the front */ #if !defined(HYPRE_USING_SYCL) if ((fill_level == 0) && !(ilu_type % 10)) { /* Copy diagonal matrix into a new place with permutation * That is, A_diag = A_diag(perm,qperm); */ hypre_CSRMatrixPermute(hypre_ParCSRMatrixDiag(A), perm_data, rqperm_data, &A_diag); /* Compute ILU0 on the device */ if (iter_setup_type) { hypre_ILUSetupIterativeILU0Device(A_diag, iter_setup_type, iter_setup_option, iter_setup_max_iter, iter_setup_tol, &hypre_ParILUDataIterativeSetupNumIter(ilu_data), &hypre_ParILUDataIterativeSetupHistory(ilu_data)); } else { hypre_CSRMatrixILU0(A_diag); } hypre_ParILUExtractEBFC(A_diag, nLU, BLUptr, &SLU, Eptr, Fptr); hypre_CSRMatrixDestroy(A_diag); } else #endif { hypre_ParILURAPReorder(A, perm_data, rqperm_data, &Apq); #if defined(HYPRE_USING_SYCL) /* WM: note - ILU0 is not yet available in oneMKL sparse */ if (fill_level == 0 && !(ilu_type % 10)) { hypre_ILUSetupILU0(Apq, NULL, NULL, n, n, &parL, &parD, &parU, &parS, &uend); } #endif if (fill_level != 0 && !(ilu_type % 10)) { hypre_ILUSetupILUK(Apq, fill_level, NULL, NULL, n, n, &parL, &parD, &parU, &parS, &uend); } else if ((ilu_type % 10) == 1) { hypre_ParCSRMatrixMigrate(Apq, HYPRE_MEMORY_HOST); hypre_ILUSetupILUT(Apq, max_row_nnz, droptol, NULL, NULL, n, n, &parL, &parD, &parU, &parS, &uend); } hypre_ParCSRMatrixDestroy(Apq); hypre_TFree(uend, HYPRE_MEMORY_HOST); hypre_ParCSRMatrixDestroy(parS); hypre_ILUSetupLDUtoCusparse(parL, parD, parU, &ALU); if ((ilu_type % 10) == 1) { hypre_TFree(parD, HYPRE_MEMORY_HOST); } else { hypre_TFree(parD, HYPRE_MEMORY_DEVICE); } hypre_ParCSRMatrixDestroy(parL); hypre_ParCSRMatrixDestroy(parU); hypre_ParILUExtractEBFC(hypre_ParCSRMatrixDiag(ALU), nLU, BLUptr, &SLU, Eptr, Fptr); hypre_ParCSRMatrixDestroy(ALU); } } else { *BLUptr = NULL; *Eptr = NULL; *Fptr = NULL; SLU = NULL; } /* Compute total rows in Schur block */ HYPRE_BigInt big_m = (HYPRE_BigInt) m; hypre_MPI_Allreduce(&big_m, &total_rows, 1, HYPRE_MPI_BIG_INT, hypre_MPI_SUM, comm); /* only form when total_rows > 0 */ if (total_rows > 0) { /* now create S - need to get new column start */ { HYPRE_BigInt global_start; hypre_MPI_Scan(&big_m, &global_start, 1, HYPRE_MPI_BIG_INT, hypre_MPI_SUM, comm); col_starts[0] = global_start - m; col_starts[1] = global_start; } if (!SLU) { SLU = hypre_CSRMatrixCreate(0, 0, 0); hypre_CSRMatrixInitialize(SLU); } S_diag_i = hypre_CSRMatrixI(SLU); hypre_TMemcpy(&S_diag_nnz, S_diag_i + m, HYPRE_Int, 1, HYPRE_MEMORY_HOST, hypre_CSRMatrixMemoryLocation(SLU)); /* Build ParCSRMatrix matS * For example when np == 3 the new matrix takes the following form * |IS_1 E_12 E_13| * |E_21 IS_2 E_22| = S * |E_31 E_32 IS_3| * In which IS_i is the cusparse ILU factorization of S_i in one matrix * */ /* We did nothing to A_offd, so all the data kept, just reorder them * The create function takes comm, global num rows/cols, * row/col start, num cols offd, nnz diag, nnz offd */ S_offd_nnz = hypre_CSRMatrixNumNonzeros(A_offd); S_offd_ncols = hypre_CSRMatrixNumCols(A_offd); matS = hypre_ParCSRMatrixCreate(comm, total_rows, total_rows, col_starts, col_starts, S_offd_ncols, S_diag_nnz, S_offd_nnz); /* first put diagonal data in */ hypre_CSRMatrixDestroy(hypre_ParCSRMatrixDiag(matS)); hypre_ParCSRMatrixDiag(matS) = SLU; /* now start to construct offdiag of S */ S_offd = hypre_ParCSRMatrixOffd(matS); hypre_CSRMatrixInitialize_v2(S_offd, 0, HYPRE_MEMORY_HOST); S_offd_i = hypre_CSRMatrixI(S_offd); S_offd_j = hypre_CSRMatrixJ(S_offd); S_offd_data = hypre_CSRMatrixData(S_offd); S_offd_colmap = hypre_CTAlloc(HYPRE_BigInt, S_offd_ncols, HYPRE_MEMORY_HOST); /* Set/Move A_offd to host */ h_A_offd = (hypre_GetActualMemLocation(memory_location) == hypre_MEMORY_DEVICE) ? hypre_CSRMatrixClone_v2(A_offd, 1, HYPRE_MEMORY_HOST) : A_offd; A_offd_i = hypre_CSRMatrixI(h_A_offd); A_offd_j = hypre_CSRMatrixJ(h_A_offd); A_offd_data = hypre_CSRMatrixData(h_A_offd); /* Clone permutation arrays on the host */ if (rperm && perm) { h_perm = hypre_IntArrayCloneDeep_v2(perm, HYPRE_MEMORY_HOST); h_rperm = hypre_IntArrayCloneDeep_v2(rperm, HYPRE_MEMORY_HOST); perm_data = hypre_IntArrayData(h_perm); rperm_data = hypre_IntArrayData(h_rperm); } /* simply use a loop to copy data from A_offd */ S_offd_i[0] = 0; k3 = 0; for (i = 1; i <= e; i++) { S_offd_i[i] = k3; } for (i = 0; i < m_e; i++) { col = (perm_data) ? perm_data[i + nI] : i + nI; k1 = A_offd_i[col]; k2 = A_offd_i[col + 1]; for (j = k1; j < k2; j++) { S_offd_j[k3] = A_offd_j[j]; S_offd_data[k3++] = A_offd_data[j]; } S_offd_i[i + 1 + e] = k3; } /* give I, J, DATA to S_offd */ hypre_CSRMatrixI(S_offd) = S_offd_i; hypre_CSRMatrixJ(S_offd) = S_offd_j; hypre_CSRMatrixData(S_offd) = S_offd_data; /* now we need to update S_offd_colmap */ comm_pkg = hypre_ParCSRMatrixCommPkg(A); /* setup comm_pkg if not yet built */ if (!comm_pkg) { hypre_MatvecCommPkgCreate(A); comm_pkg = hypre_ParCSRMatrixCommPkg(A); } /* get total num of send */ num_sends = hypre_ParCSRCommPkgNumSends(comm_pkg); begin = hypre_ParCSRCommPkgSendMapStart(comm_pkg, 0); end = hypre_ParCSRCommPkgSendMapStart(comm_pkg, num_sends); send_buf = hypre_TAlloc(HYPRE_BigInt, end - begin, HYPRE_MEMORY_HOST); /* copy new index into send_buf */ for (i = 0; i < (end - begin); i++) { send_buf[i] = (rperm_data) ? rperm_data[hypre_ParCSRCommPkgSendMapElmt(comm_pkg, i + begin)] - nLU + col_starts[0] : hypre_ParCSRCommPkgSendMapElmt(comm_pkg, i + begin) - nLU + col_starts[0]; } /* main communication */ comm_handle = hypre_ParCSRCommHandleCreate(21, comm_pkg, send_buf, S_offd_colmap); hypre_ParCSRCommHandleDestroy(comm_handle); /* setup index */ hypre_ParCSRMatrixColMapOffd(matS) = S_offd_colmap; hypre_ILUSortOffdColmap(matS); /* Move S_offd to final memory location */ hypre_CSRMatrixMigrate(S_offd, memory_location); /* Free memory */ hypre_TFree(send_buf, HYPRE_MEMORY_HOST); if (h_A_offd != A_offd) { hypre_CSRMatrixDestroy(h_A_offd); } } /* end of forming S */ else { hypre_CSRMatrixDestroy(SLU); } /* Set output pointer */ *matSptr = matS; /* Do not free perm_data/qperm_data */ if (perm) { hypre_IntArrayData(perm) = NULL; } if (qperm) { hypre_IntArrayData(qperm) = NULL; } /* Free memory */ hypre_IntArrayDestroy(perm); hypre_IntArrayDestroy(qperm); hypre_IntArrayDestroy(rperm); hypre_IntArrayDestroy(rqperm); hypre_IntArrayDestroy(h_perm); hypre_IntArrayDestroy(h_rperm); return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_ILUSetupIterativeILU0Device * * This function computes an ILU0 iteratively with rocSPARSE. * * Input arguments: * A - input matrix * type - algorithm for computing iterative ILU0 * option - internal flags used by rocSPARSE * max_iter - max. number of iterations * tolerance - stopping criteria in iterative algorithm * * Output arguments: * num_iter_ptr - number of iterations * history_ptr - list of corrections and residual values for each iteration * (computed only when the 5th bit of option is active) * * Note: This function requires rocSPARSE 2.4.0 at least. *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ILUSetupIterativeILU0Device(hypre_CSRMatrix *A, HYPRE_Int type, HYPRE_Int option, HYPRE_Int max_iter, HYPRE_Real tolerance, HYPRE_Int *num_iter_ptr, HYPRE_Real **history_ptr) { #if defined (HYPRE_USING_ROCSPARSE) && (ROCSPARSE_VERSION >= 200400) /* Input matrix data */ HYPRE_Int num_rows = hypre_CSRMatrixNumRows(A); HYPRE_Int num_cols = hypre_CSRMatrixNumCols(A); HYPRE_Int num_nonzeros = hypre_CSRMatrixNumNonzeros(A); HYPRE_Int *A_i = hypre_CSRMatrixI(A); HYPRE_Int *A_j = hypre_CSRMatrixJ(A); HYPRE_Complex *A_data = hypre_CSRMatrixData(A); HYPRE_Complex *A_data_new; /* Vendor math sparse libraries data */ void *buffer = NULL; rocsparse_index_base idx_base = rocsparse_index_base_zero; rocsparse_handle handle = hypre_HandleCusparseHandle(hypre_handle()); rocsparse_datatype data_type; size_t buffer_size; HYPRE_Int history_size; HYPRE_ANNOTATE_FUNC_BEGIN; hypre_GpuProfilingPushRange("CSRMatrixITILU0"); /* Set default output */ *num_iter_ptr = 0; /*------------------------------------------------------------------------------------- * 0. Sanity checks *-------------------------------------------------------------------------------------*/ if (num_rows != num_cols) { hypre_error_w_msg(HYPRE_ERROR_GENERIC, "Not a square matrix!"); return hypre_error_flag; } #if defined(HYPRE_COMPLEX) hypre_error_w_msg(HYPRE_ERROR_GENERIC, "Complex data type is not supported!"); return hypre_error_flag; #elif defined(HYPRE_LONG_DOUBLE) hypre_error_w_msg(HYPRE_ERROR_GENERIC, "Long-double type is not supported!"); return hypre_error_flag; #elif defined(HYPRE_SINGLE) data_type = rocsparse_datatype_f32_r; #else data_type = rocsparse_datatype_f64_r; #endif /*------------------------------------------------------------------------------------- * 1. Sort columns belonging to each row, then copy result to new matrix *-------------------------------------------------------------------------------------*/ hypre_CSRMatrixSortRow(A); /* TODO (VPM): make use of a non-zero initial guess if available. */ A_data_new = hypre_CTAlloc(HYPRE_Complex, num_nonzeros, HYPRE_MEMORY_DEVICE); /*------------------------------------------------------------------------------------- * 2. Get work array size *-------------------------------------------------------------------------------------*/ HYPRE_ROCSPARSE_CALL(rocsparse_csritilu0_buffer_size(handle, (rocsparse_itilu0_alg) type, (rocsparse_int) option, (rocsparse_int) max_iter, (rocsparse_int) num_rows, (rocsparse_int) num_nonzeros, (const rocsparse_int*) A_i, (const rocsparse_int*) A_j, idx_base, data_type, &buffer_size)); /*------------------------------------------------------------------------------------- * 3. Create work array on the device *-------------------------------------------------------------------------------------*/ buffer = hypre_TAlloc(char, buffer_size, HYPRE_MEMORY_DEVICE); /*------------------------------------------------------------------------------------- * 4. Perform the analysis (pre-processing) *-------------------------------------------------------------------------------------*/ hypre_GpuProfilingPushRange("Analysis"); HYPRE_ROCSPARSE_CALL(rocsparse_csritilu0_preprocess(handle, (rocsparse_itilu0_alg) type, (rocsparse_int) option, (rocsparse_int) max_iter, (rocsparse_int) num_rows, (rocsparse_int) num_nonzeros, (const rocsparse_int*) A_i, (const rocsparse_int*) A_j, idx_base, data_type, buffer_size, buffer)); hypre_GpuProfilingPopRange(); /*------------------------------------------------------------------------------------- * 5. Compute the numerical factorization iteratively *-------------------------------------------------------------------------------------*/ *num_iter_ptr = max_iter; hypre_GpuProfilingPushRange("Factorization"); HYPRE_ROCSPARSE_CALL(hypre_rocsparse_csritilu0_compute(handle, (rocsparse_itilu0_alg) type, (rocsparse_int) option, (rocsparse_int*) num_iter_ptr, tolerance, (rocsparse_int) num_rows, (rocsparse_int) num_nonzeros, (const rocsparse_int*) A_i, (const rocsparse_int*) A_j, (const HYPRE_Complex*) A_data, A_data_new, idx_base, buffer_size, buffer)); hypre_GpuProfilingPopRange(); hypre_CSRMatrixData(A) = A_data_new; hypre_TFree(A_data, HYPRE_MEMORY_DEVICE); /*------------------------------------------------------------------------------------- * 6. Compute history if requested *-------------------------------------------------------------------------------------*/ if (option & rocsparse_itilu0_option_convergence_history) { history_size = (*num_iter_ptr) * 2; *history_ptr = hypre_TAlloc(HYPRE_Complex, history_size, HYPRE_MEMORY_HOST); HYPRE_ROCSPARSE_CALL(hypre_rocsparse_csritilu0_history(handle, (rocsparse_itilu0_alg) type, (rocsparse_int*) num_iter_ptr, *history_ptr, buffer_size, buffer)); } /*------------------------------------------------------------------------------------- * 7. Free memory *-------------------------------------------------------------------------------------*/ /* Free buffer */ hypre_TFree(buffer, HYPRE_MEMORY_DEVICE); hypre_GpuProfilingPopRange(); HYPRE_ANNOTATE_FUNC_END; #else HYPRE_UNUSED_VAR(A); HYPRE_UNUSED_VAR(type); HYPRE_UNUSED_VAR(option); HYPRE_UNUSED_VAR(max_iter); HYPRE_UNUSED_VAR(tolerance); HYPRE_UNUSED_VAR(num_iter_ptr); HYPRE_UNUSED_VAR(history_ptr); hypre_error_w_msg(HYPRE_ERROR_GENERIC, "Iterative ILU0 requires rocSPARSE 2.4.0 at least!"); #endif return hypre_error_flag; } #endif /* defined(HYPRE_USING_GPU) */ hypre-2.33.0/src/parcsr_ls/par_ilu_solve.c000066400000000000000000001754031477326011500205340ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * ILU solve routine * *****************************************************************************/ #include "_hypre_parcsr_ls.h" #include "_hypre_utilities.hpp" /*-------------------------------------------------------------------- * hypre_ILUSolve * * TODO (VPM): Change variable names of F_array and U_array *--------------------------------------------------------------------*/ HYPRE_Int hypre_ILUSolve( void *ilu_vdata, hypre_ParCSRMatrix *A, hypre_ParVector *f, hypre_ParVector *u ) { MPI_Comm comm = hypre_ParCSRMatrixComm(A); hypre_ParILUData *ilu_data = (hypre_ParILUData*) ilu_vdata; /* Matrices */ hypre_ParCSRMatrix *matmL = hypre_ParILUDataMatLModified(ilu_data); hypre_ParCSRMatrix *matmU = hypre_ParILUDataMatUModified(ilu_data); hypre_ParCSRMatrix *matA = hypre_ParILUDataMatA(ilu_data); hypre_ParCSRMatrix *matL = hypre_ParILUDataMatL(ilu_data); hypre_ParCSRMatrix *matU = hypre_ParILUDataMatU(ilu_data); hypre_ParCSRMatrix *matS = hypre_ParILUDataMatS(ilu_data); HYPRE_Real *matD = hypre_ParILUDataMatD(ilu_data); HYPRE_Real *matmD = hypre_ParILUDataMatDModified(ilu_data); /* Vectors */ HYPRE_Int ilu_type = hypre_ParILUDataIluType(ilu_data); HYPRE_Int *perm = hypre_ParILUDataPerm(ilu_data); HYPRE_Int *qperm = hypre_ParILUDataQPerm(ilu_data); hypre_ParVector *F_array = hypre_ParILUDataF(ilu_data); hypre_ParVector *U_array = hypre_ParILUDataU(ilu_data); /* Device data */ #if defined(HYPRE_USING_GPU) hypre_CSRMatrix *matALU_d = hypre_ParILUDataMatAILUDevice(ilu_data); hypre_CSRMatrix *matBLU_d = hypre_ParILUDataMatBILUDevice(ilu_data); hypre_CSRMatrix *matE_d = hypre_ParILUDataMatEDevice(ilu_data); hypre_CSRMatrix *matF_d = hypre_ParILUDataMatFDevice(ilu_data); hypre_ParCSRMatrix *Aperm = hypre_ParILUDataAperm(ilu_data); hypre_Vector *Adiag_diag = hypre_ParILUDataADiagDiag(ilu_data); hypre_Vector *Sdiag_diag = hypre_ParILUDataSDiagDiag(ilu_data); hypre_ParVector *Ztemp = hypre_ParILUDataZTemp(ilu_data); HYPRE_Int test_opt = hypre_ParILUDataTestOption(ilu_data); #endif /* Solver settings */ HYPRE_Real tol = hypre_ParILUDataTol(ilu_data); HYPRE_Int logging = hypre_ParILUDataLogging(ilu_data); HYPRE_Int print_level = hypre_ParILUDataPrintLevel(ilu_data); HYPRE_Int max_iter = hypre_ParILUDataMaxIter(ilu_data); HYPRE_Int tri_solve = hypre_ParILUDataTriSolve(ilu_data); HYPRE_Int lower_jacobi_iters = hypre_ParILUDataLowerJacobiIters(ilu_data); HYPRE_Int upper_jacobi_iters = hypre_ParILUDataUpperJacobiIters(ilu_data); HYPRE_Real *norms = hypre_ParILUDataRelResNorms(ilu_data); hypre_ParVector *Ftemp = hypre_ParILUDataFTemp(ilu_data); hypre_ParVector *Utemp = hypre_ParILUDataUTemp(ilu_data); hypre_ParVector *Xtemp = hypre_ParILUDataXTemp(ilu_data); hypre_ParVector *Ytemp = hypre_ParILUDataYTemp(ilu_data); HYPRE_Real *fext = hypre_ParILUDataFExt(ilu_data); HYPRE_Real *uext = hypre_ParILUDataUExt(ilu_data); hypre_ParVector *residual = NULL; HYPRE_Real alpha = -1.0; HYPRE_Real beta = 1.0; HYPRE_Real conv_factor = 0.0; HYPRE_Real resnorm = 1.0; HYPRE_Real init_resnorm = 0.0; HYPRE_Real rel_resnorm; HYPRE_Real rhs_norm = 0.0; HYPRE_Real old_resnorm; HYPRE_Real ieee_check = 0.0; HYPRE_Real operat_cmplxty = hypre_ParILUDataOperatorComplexity(ilu_data); HYPRE_Int Solve_err_flag; HYPRE_Int iter, num_procs, my_id; /* problem size */ HYPRE_Int n = hypre_ParCSRMatrixNumRows(A); HYPRE_Int nLU = hypre_ParILUDataNLU(ilu_data); HYPRE_Int *u_end = hypre_ParILUDataUEnd(ilu_data); /* Schur system solve */ HYPRE_Solver schur_solver = hypre_ParILUDataSchurSolver(ilu_data); HYPRE_Solver schur_precond = hypre_ParILUDataSchurPrecond(ilu_data); hypre_ParVector *rhs = hypre_ParILUDataRhs(ilu_data); hypre_ParVector *x = hypre_ParILUDataX(ilu_data); #if defined(HYPRE_USING_GPU) HYPRE_ExecutionPolicy exec = hypre_GetExecPolicy2( hypre_ParCSRMatrixMemoryLocation(A), hypre_ParVectorMemoryLocation(f) ); /* VPM: Placeholder check to avoid -Wunused-variable warning. TODO: remove this */ if (exec != HYPRE_EXEC_DEVICE && exec != HYPRE_EXEC_HOST) { hypre_error_w_msg(HYPRE_ERROR_GENERIC, "Need to run either on host or device!"); return hypre_error_flag; } #endif HYPRE_ANNOTATE_FUNC_BEGIN; if (logging > 1) { residual = hypre_ParILUDataResidual(ilu_data); } hypre_ParILUDataNumIterations(ilu_data) = 0; hypre_MPI_Comm_size(comm, &num_procs); hypre_MPI_Comm_rank(comm, &my_id); /*----------------------------------------------------------------------- * Write the solver parameters *-----------------------------------------------------------------------*/ if (my_id == 0 && print_level > 1) { hypre_ILUWriteSolverParams(ilu_data); } /*----------------------------------------------------------------------- * Initialize the solver error flag *-----------------------------------------------------------------------*/ Solve_err_flag = 0; /*----------------------------------------------------------------------- * write some initial info *-----------------------------------------------------------------------*/ if (my_id == 0 && print_level > 1 && tol > 0.) { hypre_printf("\n\n ILU SOLVER SOLUTION INFO:\n"); } /*----------------------------------------------------------------------- * Compute initial residual and print *-----------------------------------------------------------------------*/ if (print_level > 1 || logging > 1 || tol > 0.) { if (logging > 1) { hypre_ParVectorCopy(f, residual); if (tol > 0.0) { hypre_ParCSRMatrixMatvec(alpha, A, u, beta, residual); } resnorm = hypre_sqrt(hypre_ParVectorInnerProd(residual, residual)); } else { hypre_ParVectorCopy(f, Ftemp); if (tol > 0.0) { hypre_ParCSRMatrixMatvec(alpha, A, u, beta, Ftemp); } resnorm = hypre_sqrt(hypre_ParVectorInnerProd(Ftemp, Ftemp)); } /* Since it does not diminish performance, attempt to return an error flag and notify users when they supply bad input. */ if (resnorm != 0.) { ieee_check = resnorm / resnorm; /* INF -> NaN conversion */ } if (ieee_check != ieee_check) { /* ...INFs or NaNs in input can make ieee_check a NaN. This test for ieee_check self-equality works on all IEEE-compliant compilers/ machines, c.f. page 8 of "Lecture Notes on the Status of IEEE 754" by W. Kahan, May 31, 1996. Currently (July 2002) this paper may be found at http://HTTP.CS.Berkeley.EDU/~wkahan/ieee754status/IEEE754.PDF */ if (print_level > 0) { hypre_printf("\n\nERROR detected by Hypre ... BEGIN\n"); hypre_printf("ERROR -- hypre_ILUSolve: INFs and/or NaNs detected in input.\n"); hypre_printf("User probably placed non-numerics in supplied A, x_0, or b.\n"); hypre_printf("ERROR detected by Hypre ... END\n\n\n"); } hypre_error(HYPRE_ERROR_GENERIC); HYPRE_ANNOTATE_FUNC_END; return hypre_error_flag; } init_resnorm = resnorm; rhs_norm = hypre_sqrt(hypre_ParVectorInnerProd(f, f)); if (rhs_norm > HYPRE_REAL_EPSILON) { rel_resnorm = init_resnorm / rhs_norm; } else { /* rhs is zero, return a zero solution */ hypre_ParVectorSetConstantValues(U_array, 0.0); if (logging > 0) { rel_resnorm = 0.0; hypre_ParILUDataFinalRelResidualNorm(ilu_data) = rel_resnorm; } HYPRE_ANNOTATE_FUNC_END; return hypre_error_flag; } } else { rel_resnorm = 1.; } if (my_id == 0 && print_level > 1) { hypre_printf(" relative\n"); hypre_printf(" residual factor residual\n"); hypre_printf(" -------- ------ --------\n"); hypre_printf(" Initial %e %e\n", init_resnorm, rel_resnorm); } matA = A; U_array = u; F_array = f; /************** Main Solver Loop - always do 1 iteration ************/ iter = 0; while ((rel_resnorm >= tol || iter < 1) && (iter < max_iter)) { /* Do one solve on LU*e = r */ switch (ilu_type) { case 0: case 1: default: /* TODO (VPM): Encapsulate host and device functions into a single one */ #if defined(HYPRE_USING_GPU) if (exec == HYPRE_EXEC_DEVICE) { /* Apply GPU-accelerated LU solve - BJ-ILU0 */ if (tri_solve == 1) { hypre_ILUSolveLUDevice(matA, matBLU_d, F_array, U_array, perm, Utemp, Ftemp); } else { hypre_ILUSolveLUIterDevice(matA, matBLU_d, F_array, U_array, perm, Utemp, Ftemp, Ztemp, &Adiag_diag, lower_jacobi_iters, upper_jacobi_iters); /* Assign this now, in case it was set in method above */ hypre_ParILUDataADiagDiag(ilu_data) = Adiag_diag; } } else #endif { /* BJ - hypre_ilu */ if (tri_solve == 1) { hypre_ILUSolveLU(matA, F_array, U_array, perm, n, matL, matD, matU, Utemp, Ftemp); } else { hypre_ILUSolveLUIter(matA, F_array, U_array, perm, n, matL, matD, matU, Utemp, Ftemp, lower_jacobi_iters, upper_jacobi_iters); } } break; case 10: case 11: #if defined(HYPRE_USING_GPU) if (exec == HYPRE_EXEC_DEVICE) { /* Apply GPU-accelerated GMRES-ILU solve */ if (tri_solve == 1) { hypre_ILUSolveSchurGMRESDevice(matA, F_array, U_array, perm, nLU, matS, Utemp, Ftemp, schur_solver, schur_precond, rhs, x, u_end, matBLU_d, matE_d, matF_d); } else { hypre_ILUSolveSchurGMRESJacIterDevice(matA, F_array, U_array, perm, nLU, matS, Utemp, Ftemp, schur_solver, schur_precond, rhs, x, u_end, matBLU_d, matE_d, matF_d, Ztemp, &Adiag_diag, &Sdiag_diag, lower_jacobi_iters, upper_jacobi_iters); /* Assign this now, in case it was set in method above */ hypre_ParILUDataADiagDiag(ilu_data) = Adiag_diag; hypre_ParILUDataSDiagDiag(ilu_data) = Sdiag_diag; } } else #endif { hypre_ILUSolveSchurGMRES(matA, F_array, U_array, perm, perm, nLU, matL, matD, matU, matS, Utemp, Ftemp, schur_solver, schur_precond, rhs, x, u_end); } break; case 20: case 21: #if defined(HYPRE_USING_GPU) && !defined(HYPRE_USING_UNIFIED_MEMORY) if (exec == HYPRE_EXEC_DEVICE) { hypre_error_w_msg(HYPRE_ERROR_GENERIC, "NSH+ILU solve on device runs requires unified memory!"); return hypre_error_flag; } #endif /* NSH+ILU */ hypre_ILUSolveSchurNSH(matA, F_array, U_array, perm, nLU, matL, matD, matU, matS, Utemp, Ftemp, schur_solver, rhs, x, u_end); break; case 30: case 31: #if defined(HYPRE_USING_GPU) && !defined(HYPRE_USING_UNIFIED_MEMORY) if (exec == HYPRE_EXEC_DEVICE) { hypre_error_w_msg(HYPRE_ERROR_GENERIC, "RAS+ILU solve on device runs requires unified memory!"); return hypre_error_flag; } #endif /* RAS */ hypre_ILUSolveLURAS(matA, F_array, U_array, perm, matL, matD, matU, Utemp, Utemp, fext, uext); break; case 40: case 41: #if defined(HYPRE_USING_GPU) && !defined(HYPRE_USING_UNIFIED_MEMORY) if (exec == HYPRE_EXEC_DEVICE) { hypre_error_w_msg(HYPRE_ERROR_GENERIC, "ddPQ+GMRES+ILU solve on device runs requires unified memory!"); return hypre_error_flag; } #endif /* ddPQ + GMRES + hypre_ilu[k,t]() */ hypre_ILUSolveSchurGMRES(matA, F_array, U_array, perm, qperm, nLU, matL, matD, matU, matS, Utemp, Ftemp, schur_solver, schur_precond, rhs, x, u_end); break; case 50: /* GMRES-RAP */ #if defined(HYPRE_USING_GPU) if (exec == HYPRE_EXEC_DEVICE) { hypre_ILUSolveRAPGMRESDevice(matA, F_array, U_array, perm, nLU, matS, Utemp, Ftemp, Xtemp, Ytemp, schur_solver, schur_precond, rhs, x, u_end, Aperm, matALU_d, matBLU_d, matE_d, matF_d, test_opt); } else #endif { hypre_ILUSolveRAPGMRESHost(matA, F_array, U_array, perm, nLU, matL, matD, matU, matmL, matmD, matmU, Utemp, Ftemp, Xtemp, Ytemp, schur_solver, schur_precond, rhs, x, u_end); } break; } /*--------------------------------------------------------------- * Compute residual and residual norm *----------------------------------------------------------------*/ if (print_level > 1 || logging > 1 || tol > 0.) { old_resnorm = resnorm; if (logging > 1) { hypre_ParVectorCopy(F_array, residual); hypre_ParCSRMatrixMatvec(alpha, matA, U_array, beta, residual); resnorm = hypre_sqrt(hypre_ParVectorInnerProd(residual, residual)); } else { hypre_ParVectorCopy(F_array, Ftemp); hypre_ParCSRMatrixMatvec(alpha, matA, U_array, beta, Ftemp); resnorm = hypre_sqrt(hypre_ParVectorInnerProd(Ftemp, Ftemp)); } if (old_resnorm) { conv_factor = resnorm / old_resnorm; } else { conv_factor = resnorm; } if (rhs_norm > HYPRE_REAL_EPSILON) { rel_resnorm = resnorm / rhs_norm; } else { rel_resnorm = resnorm; } norms[iter] = rel_resnorm; } ++iter; hypre_ParILUDataNumIterations(ilu_data) = iter; hypre_ParILUDataFinalRelResidualNorm(ilu_data) = rel_resnorm; if (my_id == 0 && print_level > 1) { hypre_printf(" ILUSolve %2d %e %f %e \n", iter, resnorm, conv_factor, rel_resnorm); } } /* check convergence within max_iter */ if (iter == max_iter && tol > 0.) { Solve_err_flag = 1; hypre_error(HYPRE_ERROR_CONV); } /*----------------------------------------------------------------------- * Print closing statistics * Add operator and grid complexity stats *-----------------------------------------------------------------------*/ if (iter > 0 && init_resnorm) { conv_factor = hypre_pow((resnorm / init_resnorm), (1.0 / (HYPRE_Real) iter)); } else { conv_factor = 1.; } if (print_level > 1) { /*** compute operator and grid complexity (fill factor) here ?? ***/ if (my_id == 0) { if (Solve_err_flag == 1) { hypre_printf("\n\n=============================================="); hypre_printf("\n NOTE: Convergence tolerance was not achieved\n"); hypre_printf(" within the allowed %d iterations\n", max_iter); hypre_printf("=============================================="); } hypre_printf("\n\n Average Convergence Factor = %f \n", conv_factor); hypre_printf(" operator = %f\n", operat_cmplxty); } } HYPRE_ANNOTATE_FUNC_END; return hypre_error_flag; } /*-------------------------------------------------------------------- * hypre_ILUSolveSchurGMRES * * Schur Complement solve with GMRES on schur complement * * ParCSRMatrix S is already built in ilu data sturcture, here directly * use S, L, D and U factors only have local scope (no off-diag terms) * so apart from the residual calculation (which uses A), the solves * with the L and U factors are local. * * S is the global Schur complement * schur_solver is a GMRES solver * schur_precond is the ILU preconditioner for GMRES * rhs and x are helper vector for solving Schur system *--------------------------------------------------------------------*/ HYPRE_Int hypre_ILUSolveSchurGMRES(hypre_ParCSRMatrix *A, hypre_ParVector *f, hypre_ParVector *u, HYPRE_Int *perm, HYPRE_Int *qperm, HYPRE_Int nLU, hypre_ParCSRMatrix *L, HYPRE_Real *D, hypre_ParCSRMatrix *U, hypre_ParCSRMatrix *S, hypre_ParVector *ftemp, hypre_ParVector *utemp, HYPRE_Solver schur_solver, HYPRE_Solver schur_precond, hypre_ParVector *rhs, hypre_ParVector *x, HYPRE_Int *u_end) { HYPRE_UNUSED_VAR(schur_precond); /* Data objects for L and U */ hypre_CSRMatrix *L_diag = hypre_ParCSRMatrixDiag(L); HYPRE_Real *L_diag_data = hypre_CSRMatrixData(L_diag); HYPRE_Int *L_diag_i = hypre_CSRMatrixI(L_diag); HYPRE_Int *L_diag_j = hypre_CSRMatrixJ(L_diag); hypre_CSRMatrix *U_diag = hypre_ParCSRMatrixDiag(U); HYPRE_Real *U_diag_data = hypre_CSRMatrixData(U_diag); HYPRE_Int *U_diag_i = hypre_CSRMatrixI(U_diag); HYPRE_Int *U_diag_j = hypre_CSRMatrixJ(U_diag); /* Vectors */ hypre_Vector *utemp_local = hypre_ParVectorLocalVector(utemp); HYPRE_Real *utemp_data = hypre_VectorData(utemp_local); hypre_Vector *ftemp_local = hypre_ParVectorLocalVector(ftemp); HYPRE_Real *ftemp_data = hypre_VectorData(ftemp_local); HYPRE_Real alpha = -1.0; HYPRE_Real beta = 1.0; HYPRE_Int i, j, k1, k2, col; /* Problem size */ HYPRE_Int n = hypre_CSRMatrixNumRows(L_diag); hypre_Vector *rhs_local; HYPRE_Real *rhs_data; hypre_Vector *x_local; HYPRE_Real *x_data; /* Compute residual */ hypre_ParCSRMatrixMatvecOutOfPlace(alpha, A, u, beta, f, ftemp); /* 1st need to solve LBi*xi = fi * L solve, solve xi put in u_temp upper */ /* now update with L to solve */ for (i = 0 ; i < nLU ; i ++) { utemp_data[qperm[i]] = ftemp_data[perm[i]]; k1 = L_diag_i[i] ; k2 = L_diag_i[i + 1]; for (j = k1 ; j < k2 ; j ++) { utemp_data[qperm[i]] -= L_diag_data[j] * utemp_data[qperm[L_diag_j[j]]]; } } /* 2nd need to compute g'i = gi - Ei*UBi^-1*xi * now put g'i into the f_temp lower */ for (i = nLU ; i < n ; i ++) { k1 = L_diag_i[i] ; k2 = L_diag_i[i + 1]; for (j = k1 ; j < k2 ; j ++) { col = L_diag_j[j]; ftemp_data[perm[i]] -= L_diag_data[j] * utemp_data[qperm[col]]; } } /* 3rd need to solve global Schur Complement Sy = g' * for now only solve the local system * solve y put in u_temp lower * only solve whe S is not NULL */ if (S) { /*initialize solution to zero for residual equation */ hypre_ParVectorSetConstantValues(x, 0.0); /* setup vectors for solve */ rhs_local = hypre_ParVectorLocalVector(rhs); rhs_data = hypre_VectorData(rhs_local); x_local = hypre_ParVectorLocalVector(x); x_data = hypre_VectorData(x_local); /* set rhs value */ for (i = nLU ; i < n ; i ++) { rhs_data[i - nLU] = ftemp_data[perm[i]]; } /* solve */ HYPRE_GMRESSolve(schur_solver, (HYPRE_Matrix)S, (HYPRE_Vector)rhs, (HYPRE_Vector)x); /* copy value back to original */ for (i = nLU ; i < n ; i ++) { utemp_data[qperm[i]] = x_data[i - nLU]; } } /* 4th need to compute zi = xi - LBi^-1*Fi*yi * put zi in f_temp upper * only do this computation when nLU < n * U is unsorted, search is expensive when unnecessary */ if (nLU < n) { for (i = 0 ; i < nLU ; i ++) { ftemp_data[perm[i]] = utemp_data[qperm[i]]; k1 = u_end[i] ; k2 = U_diag_i[i + 1]; for (j = k1 ; j < k2 ; j ++) { col = U_diag_j[j]; ftemp_data[perm[i]] -= U_diag_data[j] * utemp_data[qperm[col]]; } } for (i = 0 ; i < nLU ; i ++) { utemp_data[qperm[i]] = ftemp_data[perm[i]]; } } /* 5th need to solve UBi*ui = zi */ /* put result in u_temp upper */ for (i = nLU - 1 ; i >= 0 ; i --) { k1 = U_diag_i[i] ; k2 = u_end[i]; for (j = k1 ; j < k2 ; j ++) { col = U_diag_j[j]; utemp_data[qperm[i]] -= U_diag_data[j] * utemp_data[qperm[col]]; } utemp_data[qperm[i]] *= D[i]; } /* done, now everything are in u_temp, update solution */ hypre_ParVectorAxpy(beta, utemp, u); return hypre_error_flag; } /*-------------------------------------------------------------------- * hypre_ILUSolveSchurNSH * * Newton-Schulz-Hotelling solve * * ParCSRMatrix S is already built in ilu data sturcture * * S here is the INVERSE of Schur Complement * L, D and U factors only have local scope (no off-diag terms) * so apart from the residual calculation (which uses A), the solves * with the L and U factors are local. * S is the inverse global Schur complement * rhs and x are helper vector for solving Schur system *--------------------------------------------------------------------*/ HYPRE_Int hypre_ILUSolveSchurNSH(hypre_ParCSRMatrix *A, hypre_ParVector *f, hypre_ParVector *u, HYPRE_Int *perm, HYPRE_Int nLU, hypre_ParCSRMatrix *L, HYPRE_Real *D, hypre_ParCSRMatrix *U, hypre_ParCSRMatrix *S, hypre_ParVector *ftemp, hypre_ParVector *utemp, HYPRE_Solver schur_solver, hypre_ParVector *rhs, hypre_ParVector *x, HYPRE_Int *u_end) { /* data objects for L and U */ hypre_CSRMatrix *L_diag = hypre_ParCSRMatrixDiag(L); HYPRE_Real *L_diag_data = hypre_CSRMatrixData(L_diag); HYPRE_Int *L_diag_i = hypre_CSRMatrixI(L_diag); HYPRE_Int *L_diag_j = hypre_CSRMatrixJ(L_diag); hypre_CSRMatrix *U_diag = hypre_ParCSRMatrixDiag(U); HYPRE_Real *U_diag_data = hypre_CSRMatrixData(U_diag); HYPRE_Int *U_diag_i = hypre_CSRMatrixI(U_diag); HYPRE_Int *U_diag_j = hypre_CSRMatrixJ(U_diag); /* Vectors */ hypre_Vector *utemp_local = hypre_ParVectorLocalVector(utemp); HYPRE_Real *utemp_data = hypre_VectorData(utemp_local); hypre_Vector *ftemp_local = hypre_ParVectorLocalVector(ftemp); HYPRE_Real *ftemp_data = hypre_VectorData(ftemp_local); HYPRE_Real alpha = -1.0; HYPRE_Real beta = 1.0; HYPRE_Int i, j, k1, k2, col; /* problem size */ HYPRE_Int n = hypre_CSRMatrixNumRows(L_diag); /* other data objects for computation */ hypre_Vector *rhs_local; HYPRE_Real *rhs_data; hypre_Vector *x_local; HYPRE_Real *x_data; /* compute residual */ hypre_ParCSRMatrixMatvecOutOfPlace(alpha, A, u, beta, f, ftemp); /* 1st need to solve LBi*xi = fi * L solve, solve xi put in u_temp upper */ /* now update with L to solve */ for (i = 0 ; i < nLU ; i ++) { utemp_data[perm[i]] = ftemp_data[perm[i]]; k1 = L_diag_i[i] ; k2 = L_diag_i[i + 1]; for (j = k1 ; j < k2 ; j ++) { utemp_data[perm[i]] -= L_diag_data[j] * utemp_data[perm[L_diag_j[j]]]; } } /* 2nd need to compute g'i = gi - Ei*UBi^-1*xi * now put g'i into the f_temp lower */ for (i = nLU ; i < n ; i ++) { k1 = L_diag_i[i] ; k2 = L_diag_i[i + 1]; for (j = k1 ; j < k2 ; j ++) { col = L_diag_j[j]; ftemp_data[perm[i]] -= L_diag_data[j] * utemp_data[perm[col]]; } } /* 3rd need to solve global Schur Complement Sy = g' * for now only solve the local system * solve y put in u_temp lower * only solve when S is not NULL */ if (S) { /* Initialize solution to zero for residual equation */ hypre_ParVectorSetConstantValues(x, 0.0); /* Setup vectors for solve */ rhs_local = hypre_ParVectorLocalVector(rhs); rhs_data = hypre_VectorData(rhs_local); x_local = hypre_ParVectorLocalVector(x); x_data = hypre_VectorData(x_local); /* set rhs value */ for (i = nLU ; i < n ; i ++) { rhs_data[i - nLU] = ftemp_data[perm[i]]; } /* Solve Schur system with approx inverse * x = S*rhs */ hypre_NSHSolve(schur_solver, S, rhs, x); /* copy value back to original */ for (i = nLU ; i < n ; i ++) { utemp_data[perm[i]] = x_data[i - nLU]; } } /* 4th need to compute zi = xi - LBi^-1*yi * put zi in f_temp upper * only do this computation when nLU < n * U is unsorted, search is expensive when unnecessary */ if (nLU < n) { for (i = 0 ; i < nLU ; i ++) { ftemp_data[perm[i]] = utemp_data[perm[i]]; k1 = u_end[i] ; k2 = U_diag_i[i + 1]; for (j = k1 ; j < k2 ; j ++) { col = U_diag_j[j]; ftemp_data[perm[i]] -= U_diag_data[j] * utemp_data[perm[col]]; } } for (i = 0 ; i < nLU ; i ++) { utemp_data[perm[i]] = ftemp_data[perm[i]]; } } /* 5th need to solve UBi*ui = zi */ /* put result in u_temp upper */ for (i = nLU - 1 ; i >= 0 ; i --) { k1 = U_diag_i[i] ; k2 = u_end[i]; for (j = k1 ; j < k2 ; j ++) { col = U_diag_j[j]; utemp_data[perm[i]] -= U_diag_data[j] * utemp_data[perm[col]]; } utemp_data[perm[i]] *= D[i]; } /* Done, now everything are in u_temp, update solution */ hypre_ParVectorAxpy(beta, utemp, u); return hypre_error_flag; } /*-------------------------------------------------------------------- * hypre_ILUSolveLU * * Incomplete LU solve * * L, D and U factors only have local scope (no off-diagterms) * so apart from the residual calculation (which uses A), * the solves with the L and U factors are local. * * Note: perm contains the permutation of indexes corresponding to * user-prescribed reordering strategy. In the block Jacobi case, perm * may be NULL if no reordering is done (for performance, (perm == NULL) * assumes identity mapping of indexes). Hence we need to check the local * solves for this case and avoid segfaults. - DOK *--------------------------------------------------------------------*/ HYPRE_Int hypre_ILUSolveLU(hypre_ParCSRMatrix *A, hypre_ParVector *f, hypre_ParVector *u, HYPRE_Int *perm, HYPRE_Int nLU, hypre_ParCSRMatrix *L, HYPRE_Real *D, hypre_ParCSRMatrix *U, hypre_ParVector *ftemp, hypre_ParVector *utemp) { /* data objects for L and U */ hypre_CSRMatrix *L_diag = hypre_ParCSRMatrixDiag(L); HYPRE_Real *L_diag_data = hypre_CSRMatrixData(L_diag); HYPRE_Int *L_diag_i = hypre_CSRMatrixI(L_diag); HYPRE_Int *L_diag_j = hypre_CSRMatrixJ(L_diag); hypre_CSRMatrix *U_diag = hypre_ParCSRMatrixDiag(U); HYPRE_Real *U_diag_data = hypre_CSRMatrixData(U_diag); HYPRE_Int *U_diag_i = hypre_CSRMatrixI(U_diag); HYPRE_Int *U_diag_j = hypre_CSRMatrixJ(U_diag); /* Vectors */ hypre_Vector *utemp_local = hypre_ParVectorLocalVector(utemp); HYPRE_Real *utemp_data = hypre_VectorData(utemp_local); hypre_Vector *ftemp_local = hypre_ParVectorLocalVector(ftemp); HYPRE_Real *ftemp_data = hypre_VectorData(ftemp_local); HYPRE_Real alpha = -1.0; HYPRE_Real beta = 1.0; HYPRE_Int i, j, k1, k2; /* Initialize Utemp to zero. * This is necessary for correctness, when we use optimized * vector operations in the case where sizeof(L, D or U) < sizeof(A) */ //hypre_ParVectorSetConstantValues( utemp, 0.); /* compute residual */ hypre_ParCSRMatrixMatvecOutOfPlace(alpha, A, u, beta, f, ftemp); /* L solve - Forward solve */ /* copy rhs to account for diagonal of L (which is identity) */ if (perm) { for (i = 0; i < nLU; i++) { utemp_data[perm[i]] = ftemp_data[perm[i]]; } } else { for (i = 0; i < nLU; i++) { utemp_data[i] = ftemp_data[i]; } } /* Update with remaining (off-diagonal) entries of L */ if (perm) { for ( i = 0; i < nLU; i++ ) { k1 = L_diag_i[i] ; k2 = L_diag_i[i + 1]; for (j = k1; j < k2; j++) { utemp_data[perm[i]] -= L_diag_data[j] * utemp_data[perm[L_diag_j[j]]]; } } } else { for ( i = 0; i < nLU; i++ ) { k1 = L_diag_i[i] ; k2 = L_diag_i[i + 1]; for (j = k1; j < k2; j++) { utemp_data[i] -= L_diag_data[j] * utemp_data[L_diag_j[j]]; } } } /*-------------------- U solve - Backward substitution */ if (perm) { for ( i = nLU - 1; i >= 0; i-- ) { /* first update with the remaining (off-diagonal) entries of U */ k1 = U_diag_i[i] ; k2 = U_diag_i[i + 1]; for (j = k1; j < k2; j++) { utemp_data[perm[i]] -= U_diag_data[j] * utemp_data[perm[U_diag_j[j]]]; } /* diagonal scaling (contribution from D. Note: D is stored as its inverse) */ utemp_data[perm[i]] *= D[i]; } } else { for ( i = nLU - 1; i >= 0; i-- ) { /* first update with the remaining (off-diagonal) entries of U */ k1 = U_diag_i[i] ; k2 = U_diag_i[i + 1]; for (j = k1; j < k2; j++) { utemp_data[i] -= U_diag_data[j] * utemp_data[U_diag_j[j]]; } /* diagonal scaling (contribution from D. Note: D is stored as its inverse) */ utemp_data[i] *= D[i]; } } /* Update solution */ hypre_ParVectorAxpy(beta, utemp, u); return hypre_error_flag; } /*-------------------------------------------------------------------- * hypre_ILUSolveLUIter * * Iterative incomplete LU solve * * L, D and U factors only have local scope (no off-diag terms) * so apart from the residual calculation (which uses A), the solves * with the L and U factors are local. * * Note: perm contains the permutation of indexes corresponding to * user-prescribed reordering strategy. In the block Jacobi case, perm * may be NULL if no reordering is done (for performance, (perm == NULL) * assumes identity mapping of indexes). Hence we need to check the local * solves for this case and avoid segfaults. - DOK *--------------------------------------------------------------------*/ HYPRE_Int hypre_ILUSolveLUIter(hypre_ParCSRMatrix *A, hypre_ParVector *f, hypre_ParVector *u, HYPRE_Int *perm, HYPRE_Int nLU, hypre_ParCSRMatrix *L, HYPRE_Real *D, hypre_ParCSRMatrix *U, hypre_ParVector *ftemp, hypre_ParVector *utemp, HYPRE_Int lower_jacobi_iters, HYPRE_Int upper_jacobi_iters) { /* Data objects for L and U */ hypre_CSRMatrix *L_diag = hypre_ParCSRMatrixDiag(L); HYPRE_Real *L_diag_data = hypre_CSRMatrixData(L_diag); HYPRE_Int *L_diag_i = hypre_CSRMatrixI(L_diag); HYPRE_Int *L_diag_j = hypre_CSRMatrixJ(L_diag); hypre_CSRMatrix *U_diag = hypre_ParCSRMatrixDiag(U); HYPRE_Real *U_diag_data = hypre_CSRMatrixData(U_diag); HYPRE_Int *U_diag_i = hypre_CSRMatrixI(U_diag); HYPRE_Int *U_diag_j = hypre_CSRMatrixJ(U_diag); /* Vectors */ hypre_Vector *utemp_local = hypre_ParVectorLocalVector(utemp); HYPRE_Real *utemp_data = hypre_VectorData(utemp_local); hypre_Vector *ftemp_local = hypre_ParVectorLocalVector(ftemp); HYPRE_Real *ftemp_data = hypre_VectorData(ftemp_local); /* Local variables */ HYPRE_Real alpha = -1.0; HYPRE_Real beta = 1.0; HYPRE_Real sum; HYPRE_Int i, j, k1, k2, kk; /* Initialize Utemp to zero. * This is necessary for correctness, when we use optimized * vector operations in the case where sizeof(L, D or U) < sizeof(A) */ //hypre_ParVectorSetConstantValues( utemp, 0.); /* compute residual */ hypre_ParCSRMatrixMatvecOutOfPlace(alpha, A, u, beta, f, ftemp); /* L solve - Forward solve */ /* copy rhs to account for diagonal of L (which is identity) */ /* Initialize iteration to 0 */ if (perm) { for ( i = 0; i < nLU; i++ ) { utemp_data[perm[i]] = 0.0; } } else { for ( i = 0; i < nLU; i++ ) { utemp_data[i] = 0.0; } } /* Jacobi iteration loop */ for ( kk = 0; kk < lower_jacobi_iters; kk++ ) { /* u^{k+1} = f - Lu^k */ /* Do a SpMV with L and save the results in xtemp */ if (perm) { for ( i = nLU - 1; i >= 0; i-- ) { sum = 0.0; k1 = L_diag_i[i] ; k2 = L_diag_i[i + 1]; for (j = k1; j < k2; j++) { sum += L_diag_data[j] * utemp_data[perm[L_diag_j[j]]]; } utemp_data[perm[i]] = ftemp_data[perm[i]] - sum; } } else { for ( i = nLU - 1; i >= 0; i-- ) { sum = 0.0; k1 = L_diag_i[i] ; k2 = L_diag_i[i + 1]; for (j = k1; j < k2; j++) { sum += L_diag_data[j] * utemp_data[L_diag_j[j]]; } utemp_data[i] = ftemp_data[i] - sum; } } } /* end jacobi loop */ /* Initialize iteration to 0 */ if (perm) { for ( i = 0; i < nLU; i++ ) { ftemp_data[perm[i]] = 0.0; } } else { for ( i = 0; i < nLU; i++ ) { ftemp_data[i] = 0.0; } } /* Jacobi iteration loop */ for ( kk = 0; kk < upper_jacobi_iters; kk++ ) { /* u^{k+1} = f - Uu^k */ /* Do a SpMV with U and save the results in xtemp */ if (perm) { for ( i = 0; i < nLU; ++i ) { sum = 0.0; k1 = U_diag_i[i] ; k2 = U_diag_i[i + 1]; for (j = k1; j < k2; j++) { sum += U_diag_data[j] * ftemp_data[perm[U_diag_j[j]]]; } ftemp_data[perm[i]] = D[i] * (utemp_data[perm[i]] - sum); } } else { for ( i = 0; i < nLU; ++i ) { sum = 0.0; k1 = U_diag_i[i] ; k2 = U_diag_i[i + 1]; for (j = k1; j < k2; j++) { sum += U_diag_data[j] * ftemp_data[U_diag_j[j]]; } ftemp_data[i] = D[i] * (utemp_data[i] - sum); } } } /* end jacobi loop */ /* Update solution */ hypre_ParVectorAxpy(beta, ftemp, u); return hypre_error_flag; } /*-------------------------------------------------------------------- * hypre_ILUSolveLURAS * * Incomplete LU solve RAS * * L, D and U factors only have local scope (no off-diag terms) * so apart from the residual calculation (which uses A), the solves * with the L and U factors are local. * fext and uext are tempory arrays for external data *--------------------------------------------------------------------*/ HYPRE_Int hypre_ILUSolveLURAS(hypre_ParCSRMatrix *A, hypre_ParVector *f, hypre_ParVector *u, HYPRE_Int *perm, hypre_ParCSRMatrix *L, HYPRE_Real *D, hypre_ParCSRMatrix *U, hypre_ParVector *ftemp, hypre_ParVector *utemp, HYPRE_Real *fext, HYPRE_Real *uext) { /* Parallel info */ hypre_ParCSRCommPkg *comm_pkg; hypre_ParCSRCommHandle *comm_handle; HYPRE_Int num_sends, begin, end; /* Data objects for L and U */ hypre_CSRMatrix *L_diag = hypre_ParCSRMatrixDiag(L); HYPRE_Real *L_diag_data = hypre_CSRMatrixData(L_diag); HYPRE_Int *L_diag_i = hypre_CSRMatrixI(L_diag); HYPRE_Int *L_diag_j = hypre_CSRMatrixJ(L_diag); hypre_CSRMatrix *U_diag = hypre_ParCSRMatrixDiag(U); HYPRE_Real *U_diag_data = hypre_CSRMatrixData(U_diag); HYPRE_Int *U_diag_i = hypre_CSRMatrixI(U_diag); HYPRE_Int *U_diag_j = hypre_CSRMatrixJ(U_diag); /* Vectors */ HYPRE_Int n = hypre_CSRMatrixNumCols(hypre_ParCSRMatrixDiag(A)); HYPRE_Int m = hypre_CSRMatrixNumCols(hypre_ParCSRMatrixOffd(A)); HYPRE_Int n_total = m + n; hypre_Vector *utemp_local = hypre_ParVectorLocalVector(utemp); HYPRE_Real *utemp_data = hypre_VectorData(utemp_local); hypre_Vector *ftemp_local = hypre_ParVectorLocalVector(ftemp); HYPRE_Real *ftemp_data = hypre_VectorData(ftemp_local); /* Local variables */ HYPRE_Int idx, jcol, col; HYPRE_Int i, j, k1, k2; HYPRE_Real alpha = -1.0; HYPRE_Real beta = 1.0; /* prepare for communication */ comm_pkg = hypre_ParCSRMatrixCommPkg(A); /* setup if not yet built */ if (!comm_pkg) { hypre_MatvecCommPkgCreate(A); comm_pkg = hypre_ParCSRMatrixCommPkg(A); } /* Initialize Utemp to zero. * This is necessary for correctness, when we use optimized * vector operations in the case where sizeof(L, D or U) < sizeof(A) */ //hypre_ParVectorSetConstantValues( utemp, 0.); /* compute residual */ hypre_ParCSRMatrixMatvecOutOfPlace(alpha, A, u, beta, f, ftemp); /* communication to get external data */ /* get total num of send */ num_sends = hypre_ParCSRCommPkgNumSends(comm_pkg); begin = hypre_ParCSRCommPkgSendMapStart(comm_pkg, 0); end = hypre_ParCSRCommPkgSendMapStart(comm_pkg, num_sends); /* copy new index into send_buf */ for (i = begin ; i < end ; i ++) { /* all we need is just send out data, we don't need to worry about the * permutation of offd part, actually we don't need to worry about * permutation at all * borrow uext as send buffer . */ uext[i - begin] = ftemp_data[hypre_ParCSRCommPkgSendMapElmt(comm_pkg, i)]; } /* main communication */ comm_handle = hypre_ParCSRCommHandleCreate(1, comm_pkg, uext, fext); hypre_ParCSRCommHandleDestroy(comm_handle); /* L solve - Forward solve */ for ( i = 0 ; i < n_total ; i ++) { k1 = L_diag_i[i] ; k2 = L_diag_i[i + 1]; if ( i < n ) { /* diag part */ utemp_data[perm[i]] = ftemp_data[perm[i]]; for (j = k1; j < k2; j++) { col = L_diag_j[j]; if ( col < n ) { utemp_data[perm[i]] -= L_diag_data[j] * utemp_data[perm[col]]; } else { jcol = col - n; utemp_data[perm[i]] -= L_diag_data[j] * uext[jcol]; } } } else { /* offd part */ idx = i - n; uext[idx] = fext[idx]; for (j = k1; j < k2; j++) { col = L_diag_j[j]; if (col < n) { uext[idx] -= L_diag_data[j] * utemp_data[perm[col]]; } else { jcol = col - n; uext[idx] -= L_diag_data[j] * uext[jcol]; } } } } /*-------------------- U solve - Backward substitution */ for ( i = n_total - 1; i >= 0; i-- ) { /* first update with the remaining (off-diagonal) entries of U */ k1 = U_diag_i[i] ; k2 = U_diag_i[i + 1]; if ( i < n ) { /* diag part */ for (j = k1; j < k2; j++) { col = U_diag_j[j]; if ( col < n ) { utemp_data[perm[i]] -= U_diag_data[j] * utemp_data[perm[col]]; } else { jcol = col - n; utemp_data[perm[i]] -= U_diag_data[j] * uext[jcol]; } } /* diagonal scaling (contribution from D. Note: D is stored as its inverse) */ utemp_data[perm[i]] *= D[i]; } else { /* 2nd part of offd */ idx = i - n; for (j = k1; j < k2; j++) { col = U_diag_j[j]; if ( col < n ) { uext[idx] -= U_diag_data[j] * utemp_data[perm[col]]; } else { jcol = col - n; uext[idx] -= U_diag_data[j] * uext[jcol]; } } /* diagonal scaling (contribution from D. Note: D is stored as its inverse) */ uext[idx] *= D[i]; } } /* Update solution */ hypre_ParVectorAxpy(beta, utemp, u); return hypre_error_flag; } /*-------------------------------------------------------------------- * hypre_ILUSolveRAPGMRESHost * * Solve with GMRES on schur complement, RAP style. * * ParCSRMatrix S is already built in ilu data sturcture, here directly * use S, L, D and U factors only have local scope (no off-diag terms) * so apart from the residual calculation (which uses A), the solves * with the L and U factors are local. * * S is the global Schur complement * schur_solver is a GMRES solver * schur_precond is the ILU preconditioner for GMRES * rhs and x are helper vector for solving Schur system *--------------------------------------------------------------------*/ HYPRE_Int hypre_ILUSolveRAPGMRESHost(hypre_ParCSRMatrix *A, hypre_ParVector *f, hypre_ParVector *u, HYPRE_Int *perm, HYPRE_Int nLU, hypre_ParCSRMatrix *L, HYPRE_Real *D, hypre_ParCSRMatrix *U, hypre_ParCSRMatrix *mL, HYPRE_Real *mD, hypre_ParCSRMatrix *mU, hypre_ParVector *ftemp, hypre_ParVector *utemp, hypre_ParVector *xtemp, hypre_ParVector *ytemp, HYPRE_Solver schur_solver, HYPRE_Solver schur_precond, hypre_ParVector *rhs, hypre_ParVector *x, HYPRE_Int *u_end) { /* data objects for L and U */ hypre_CSRMatrix *L_diag = hypre_ParCSRMatrixDiag(L); HYPRE_Real *L_diag_data = hypre_CSRMatrixData(L_diag); HYPRE_Int *L_diag_i = hypre_CSRMatrixI(L_diag); HYPRE_Int *L_diag_j = hypre_CSRMatrixJ(L_diag); hypre_CSRMatrix *U_diag = hypre_ParCSRMatrixDiag(U); HYPRE_Real *U_diag_data = hypre_CSRMatrixData(U_diag); HYPRE_Int *U_diag_i = hypre_CSRMatrixI(U_diag); HYPRE_Int *U_diag_j = hypre_CSRMatrixJ(U_diag); hypre_CSRMatrix *mL_diag = hypre_ParCSRMatrixDiag(mL); HYPRE_Real *mL_diag_data = hypre_CSRMatrixData(mL_diag); HYPRE_Int *mL_diag_i = hypre_CSRMatrixI(mL_diag); HYPRE_Int *mL_diag_j = hypre_CSRMatrixJ(mL_diag); hypre_CSRMatrix *mU_diag = hypre_ParCSRMatrixDiag(mU); HYPRE_Real *mU_diag_data = hypre_CSRMatrixData(mU_diag); HYPRE_Int *mU_diag_i = hypre_CSRMatrixI(mU_diag); HYPRE_Int *mU_diag_j = hypre_CSRMatrixJ(mU_diag); /* Vectors */ hypre_Vector *utemp_local = hypre_ParVectorLocalVector(utemp); HYPRE_Real *utemp_data = hypre_VectorData(utemp_local); hypre_Vector *ftemp_local = hypre_ParVectorLocalVector(ftemp); HYPRE_Real *ftemp_data = hypre_VectorData(ftemp_local); hypre_Vector *xtemp_local = NULL; HYPRE_Real *xtemp_data = NULL; hypre_Vector *ytemp_local = NULL; HYPRE_Real *ytemp_data = NULL; HYPRE_Real alpha = -1.0; HYPRE_Real beta = 1.0; HYPRE_Int i, j, k1, k2, col; /* problem size */ HYPRE_Int n = hypre_CSRMatrixNumRows(L_diag); HYPRE_Int m = n - nLU; /* other data objects for computation */ hypre_Vector *rhs_local; HYPRE_Real *rhs_data; hypre_Vector *x_local = NULL; HYPRE_Real *x_data = NULL; /* xtemp might be null when we have no Schur complement */ if (xtemp) { xtemp_local = hypre_ParVectorLocalVector(xtemp); xtemp_data = hypre_VectorData(xtemp_local); ytemp_local = hypre_ParVectorLocalVector(ytemp); ytemp_data = hypre_VectorData(ytemp_local); } /* Setup vectors for solve */ if (m > 0) { rhs_local = hypre_ParVectorLocalVector(rhs); rhs_data = hypre_VectorData(rhs_local); x_local = hypre_ParVectorLocalVector(x); x_data = hypre_VectorData(x_local); } /* only support RAP with partial factorized W and Z */ /* compute residual */ hypre_ParCSRMatrixMatvecOutOfPlace(alpha, A, u, beta, f, ftemp); /* A-smoothing f_temp = [UA \ LA \ (f_temp[perm])] */ /* permuted L solve */ for (i = 0 ; i < n ; i ++) { utemp_data[i] = ftemp_data[perm[i]]; k1 = L_diag_i[i] ; k2 = L_diag_i[i + 1]; for (j = k1 ; j < k2 ; j ++) { col = L_diag_j[j]; utemp_data[i] -= L_diag_data[j] * utemp_data[col]; } } if (!xtemp) { /* in this case, we don't have a Schur complement */ /* U solve */ for (i = n - 1 ; i >= 0 ; i --) { ftemp_data[perm[i]] = utemp_data[i]; k1 = U_diag_i[i] ; k2 = U_diag_i[i + 1]; for (j = k1 ; j < k2 ; j ++) { col = U_diag_j[j]; ftemp_data[perm[i]] -= U_diag_data[j] * ftemp_data[perm[col]]; } ftemp_data[perm[i]] *= D[i]; } hypre_ParVectorAxpy(beta, ftemp, u); return hypre_error_flag; } /* U solve */ for (i = n - 1 ; i >= 0 ; i --) { xtemp_data[perm[i]] = utemp_data[i]; k1 = U_diag_i[i] ; k2 = U_diag_i[i + 1]; for (j = k1 ; j < k2 ; j ++) { col = U_diag_j[j]; xtemp_data[perm[i]] -= U_diag_data[j] * xtemp_data[perm[col]]; } xtemp_data[perm[i]] *= D[i]; } /* coarse-grid correction */ /* now f_temp is the result of A-smoothing * rhs = R*(b - Ax) * */ // utemp = (ftemp - A*xtemp) hypre_ParCSRMatrixMatvecOutOfPlace(alpha, A, xtemp, beta, ftemp, utemp); // R = [-L21 L\inv, I] if (m > 0) { /* first is L solve */ for (i = 0 ; i < nLU ; i ++) { ytemp_data[i] = utemp_data[perm[i]]; k1 = mL_diag_i[i] ; k2 = mL_diag_i[i + 1]; for (j = k1 ; j < k2 ; j ++) { col = mL_diag_j[j]; ytemp_data[i] -= mL_diag_data[j] * ytemp_data[col]; } } /* apply -W * ytemp on this, and take care of the I part */ for (i = nLU ; i < n ; i ++) { rhs_data[i - nLU] = utemp_data[perm[i]]; k1 = mL_diag_i[i] ; k2 = u_end[i]; for (j = k1 ; j < k2 ; j ++) { col = mL_diag_j[j]; rhs_data[i - nLU] -= mL_diag_data[j] * ytemp_data[col]; } } } /* now the rhs is ready */ hypre_SeqVectorSetConstantValues(x_local, 0.0); HYPRE_GMRESSolve(schur_solver, (HYPRE_Matrix) schur_precond, (HYPRE_Vector) rhs, (HYPRE_Vector) x); if (m > 0) { /* for(i = 0 ; i < m ; i ++) { x_data[i] = rhs_data[i]; k1 = u_end[i+nLU] ; k2 = mL_diag_i[i+nLU+1]; for(j = k1 ; j < k2 ; j ++) { col = mL_diag_j[j]; x_data[i] -= mL_diag_data[j] * x_data[col-nLU]; } } for(i = m-1 ; i >= 0 ; i --) { rhs_data[i] = x_data[i]; k1 = mU_diag_i[i+nLU] ; k2 = mU_diag_i[i+1+nLU]; for(j = k1 ; j < k2 ; j ++) { col = mU_diag_j[j]; rhs_data[i] -= mU_diag_data[j] * rhs_data[col-nLU]; } rhs_data[i] *= mD[i]; } */ /* after solve, update x = x + Pv * that is, xtemp = xtemp + P*x */ /* first compute P*x * P = [ -U\inv U_12 ] * [ I ] */ /* matvec */ for (i = 0 ; i < nLU ; i ++) { ytemp_data[i] = 0.0; k1 = u_end[i] ; k2 = mU_diag_i[i + 1]; for (j = k1 ; j < k2 ; j ++) { col = mU_diag_j[j]; ytemp_data[i] -= mU_diag_data[j] * x_data[col - nLU]; } } /* U solve */ for (i = nLU - 1 ; i >= 0 ; i --) { ftemp_data[perm[i]] = ytemp_data[i]; k1 = mU_diag_i[i] ; k2 = u_end[i]; for (j = k1 ; j < k2 ; j ++) { col = mU_diag_j[j]; ftemp_data[perm[i]] -= mU_diag_data[j] * ftemp_data[perm[col]]; } ftemp_data[perm[i]] *= mD[i]; } /* update with I */ for (i = nLU ; i < n ; i ++) { ftemp_data[perm[i]] = x_data[i - nLU]; } hypre_ParVectorAxpy(beta, ftemp, u); } hypre_ParVectorAxpy(beta, xtemp, u); return hypre_error_flag; } /****************************************************************************** * * NSH functions. * *****************************************************************************/ /*-------------------------------------------------------------------- * hypre_NSHSolve *--------------------------------------------------------------------*/ HYPRE_Int hypre_NSHSolve( void *nsh_vdata, hypre_ParCSRMatrix *A, hypre_ParVector *f, hypre_ParVector *u ) { MPI_Comm comm = hypre_ParCSRMatrixComm(A); hypre_ParNSHData *nsh_data = (hypre_ParNSHData*) nsh_vdata; hypre_ParCSRMatrix *matA = hypre_ParNSHDataMatA(nsh_data); hypre_ParCSRMatrix *matM = hypre_ParNSHDataMatM(nsh_data); hypre_ParVector *F_array = hypre_ParNSHDataF(nsh_data); hypre_ParVector *U_array = hypre_ParNSHDataU(nsh_data); HYPRE_Real tol = hypre_ParNSHDataTol(nsh_data); HYPRE_Int logging = hypre_ParNSHDataLogging(nsh_data); HYPRE_Int print_level = hypre_ParNSHDataPrintLevel(nsh_data); HYPRE_Int max_iter = hypre_ParNSHDataMaxIter(nsh_data); HYPRE_Real *norms = hypre_ParNSHDataRelResNorms(nsh_data); hypre_ParVector *Ftemp = hypre_ParNSHDataFTemp(nsh_data); hypre_ParVector *Utemp = hypre_ParNSHDataUTemp(nsh_data); hypre_ParVector *residual = NULL; HYPRE_Real alpha = -1.0; HYPRE_Real beta = 1.0; HYPRE_Real conv_factor = 0.0; HYPRE_Real resnorm = 1.0; HYPRE_Real init_resnorm = 0.0; HYPRE_Real rel_resnorm; HYPRE_Real rhs_norm = 0.0; HYPRE_Real old_resnorm; HYPRE_Real ieee_check = 0.0; HYPRE_Real operat_cmplxty = hypre_ParNSHDataOperatorComplexity(nsh_data); HYPRE_Int iter, num_procs, my_id; HYPRE_Int Solve_err_flag; if (logging > 1) { residual = hypre_ParNSHDataResidual(nsh_data); } hypre_ParNSHDataNumIterations(nsh_data) = 0; hypre_MPI_Comm_size(comm, &num_procs); hypre_MPI_Comm_rank(comm, &my_id); /*----------------------------------------------------------------------- * Write the solver parameters *-----------------------------------------------------------------------*/ if (my_id == 0 && print_level > 1) { hypre_NSHWriteSolverParams(nsh_data); } /*----------------------------------------------------------------------- * Initialize the solver error flag *-----------------------------------------------------------------------*/ Solve_err_flag = 0; /*----------------------------------------------------------------------- * write some initial info *-----------------------------------------------------------------------*/ if (my_id == 0 && print_level > 1 && tol > 0.) { hypre_printf("\n\n Newton-Schulz-Hotelling SOLVER SOLUTION INFO:\n"); } /*----------------------------------------------------------------------- * Compute initial residual and print *-----------------------------------------------------------------------*/ if (print_level > 1 || logging > 1 || tol > 0.) { if (logging > 1) { hypre_ParVectorCopy(f, residual); if (tol > 0.0) { hypre_ParCSRMatrixMatvec(alpha, A, u, beta, residual); } resnorm = hypre_sqrt(hypre_ParVectorInnerProd(residual, residual)); } else { hypre_ParVectorCopy(f, Ftemp); if (tol > 0.0) { hypre_ParCSRMatrixMatvec(alpha, A, u, beta, Ftemp); } resnorm = hypre_sqrt(hypre_ParVectorInnerProd(Ftemp, Ftemp)); } /* Since it does not diminish performance, attempt to return an error flag and notify users when they supply bad input. */ if (resnorm != 0.) { ieee_check = resnorm / resnorm; /* INF -> NaN conversion */ } if (ieee_check != ieee_check) { /* ...INFs or NaNs in input can make ieee_check a NaN. This test for ieee_check self-equality works on all IEEE-compliant compilers/ machines, c.f. page 8 of "Lecture Notes on the Status of IEEE 754" by W. Kahan, May 31, 1996. Currently (July 2002) this paper may be found at http://HTTP.CS.Berkeley.EDU/~wkahan/ieee754status/IEEE754.PDF */ if (print_level > 0) { hypre_printf("\n\nERROR detected by Hypre ... BEGIN\n"); hypre_printf("ERROR -- hypre_NSHSolve: INFs and/or NaNs detected in input.\n"); hypre_printf("User probably placed non-numerics in supplied A, x_0, or b.\n"); hypre_printf("ERROR detected by Hypre ... END\n\n\n"); } hypre_error(HYPRE_ERROR_GENERIC); return hypre_error_flag; } init_resnorm = resnorm; rhs_norm = hypre_sqrt(hypre_ParVectorInnerProd(f, f)); if (rhs_norm > HYPRE_REAL_EPSILON) { rel_resnorm = init_resnorm / rhs_norm; } else { /* rhs is zero, return a zero solution */ hypre_ParVectorSetConstantValues(U_array, 0.0); if (logging > 0) { rel_resnorm = 0.0; hypre_ParNSHDataFinalRelResidualNorm(nsh_data) = rel_resnorm; } return hypre_error_flag; } } else { rel_resnorm = 1.; } if (my_id == 0 && print_level > 1) { hypre_printf(" relative\n"); hypre_printf(" residual factor residual\n"); hypre_printf(" -------- ------ --------\n"); hypre_printf(" Initial %e %e\n", init_resnorm, rel_resnorm); } matA = A; U_array = u; F_array = f; /************** Main Solver Loop - always do 1 iteration ************/ iter = 0; while ((rel_resnorm >= tol || iter < 1) && iter < max_iter) { /* Do one solve on e = Mr */ hypre_NSHSolveInverse(matA, f, u, matM, Utemp, Ftemp); /*--------------------------------------------------------------- * Compute residual and residual norm *----------------------------------------------------------------*/ if (print_level > 1 || logging > 1 || tol > 0.) { old_resnorm = resnorm; if (logging > 1) { hypre_ParVectorCopy(F_array, residual); hypre_ParCSRMatrixMatvec(alpha, matA, U_array, beta, residual ); resnorm = hypre_sqrt(hypre_ParVectorInnerProd( residual, residual )); } else { hypre_ParVectorCopy(F_array, Ftemp); hypre_ParCSRMatrixMatvec(alpha, matA, U_array, beta, Ftemp); resnorm = hypre_sqrt(hypre_ParVectorInnerProd(Ftemp, Ftemp)); } if (old_resnorm) { conv_factor = resnorm / old_resnorm; } else { conv_factor = resnorm; } if (rhs_norm > HYPRE_REAL_EPSILON) { rel_resnorm = resnorm / rhs_norm; } else { rel_resnorm = resnorm; } norms[iter] = rel_resnorm; } ++iter; hypre_ParNSHDataNumIterations(nsh_data) = iter; hypre_ParNSHDataFinalRelResidualNorm(nsh_data) = rel_resnorm; if (my_id == 0 && print_level > 1) { hypre_printf(" NSHSolve %2d %e %f %e \n", iter, resnorm, conv_factor, rel_resnorm); } } /* check convergence within max_iter */ if (iter == max_iter && tol > 0.) { Solve_err_flag = 1; hypre_error(HYPRE_ERROR_CONV); } /*----------------------------------------------------------------------- * Print closing statistics * Add operator and grid complexity stats *-----------------------------------------------------------------------*/ if (iter > 0 && init_resnorm) { conv_factor = hypre_pow((resnorm / init_resnorm), (1.0 / (HYPRE_Real) iter)); } else { conv_factor = 1.; } if (print_level > 1) { /*** compute operator and grid complexity (fill factor) here ?? ***/ if (my_id == 0) { if (Solve_err_flag == 1) { hypre_printf("\n\n=============================================="); hypre_printf("\n NOTE: Convergence tolerance was not achieved\n"); hypre_printf(" within the allowed %d iterations\n", max_iter); hypre_printf("=============================================="); } hypre_printf("\n\n Average Convergence Factor = %f \n", conv_factor); hypre_printf(" operator = %f\n", operat_cmplxty); } } return hypre_error_flag; } /*-------------------------------------------------------------------- * hypre_NSHSolveInverse * * Simply a matvec on residual with approximate inverse * * A: original matrix * f: rhs * u: solution * M: approximate inverse * ftemp, utemp: working vectors *--------------------------------------------------------------------*/ HYPRE_Int hypre_NSHSolveInverse(hypre_ParCSRMatrix *A, hypre_ParVector *f, hypre_ParVector *u, hypre_ParCSRMatrix *M, hypre_ParVector *ftemp, hypre_ParVector *utemp) { HYPRE_Real alpha = -1.0; HYPRE_Real beta = 1.0; HYPRE_Real zero = 0.0; /* r = f - Au */ hypre_ParCSRMatrixMatvecOutOfPlace(alpha, A, u, beta, f, ftemp); /* e = Mr */ hypre_ParCSRMatrixMatvec(beta, M, ftemp, zero, utemp); /* u = u + e */ hypre_ParVectorAxpy(beta, utemp, u); return hypre_error_flag; } hypre-2.33.0/src/parcsr_ls/par_ilu_solve_device.c000066400000000000000000001300461477326011500220450ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "_hypre_onedpl.hpp" #include "_hypre_parcsr_ls.h" #include "_hypre_utilities.hpp" #if defined(HYPRE_USING_GPU) /*-------------------------------------------------------------------------- * hypre_ILUSolveLUDevice * * Incomplete LU solve (GPU) * * L, D and U factors only have local scope (no off-diagonal processor terms) * so apart from the residual calculation (which uses A), the solves with the * L and U factors are local. * * TODO (VPM): Merge this function with hypre_ILUSolveLUIterDevice *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ILUSolveLUDevice(hypre_ParCSRMatrix *A, hypre_CSRMatrix *matLU_d, hypre_ParVector *f, hypre_ParVector *u, HYPRE_Int *perm, hypre_ParVector *ftemp, hypre_ParVector *utemp) { HYPRE_Int num_rows = hypre_ParCSRMatrixNumRows(A); hypre_Vector *utemp_local = hypre_ParVectorLocalVector(utemp); HYPRE_Complex *utemp_data = hypre_VectorData(utemp_local); hypre_Vector *ftemp_local = hypre_ParVectorLocalVector(ftemp); HYPRE_Complex *ftemp_data = hypre_VectorData(ftemp_local); HYPRE_Complex alpha = -1.0; HYPRE_Complex beta = 1.0; /* Sanity check */ if (num_rows == 0) { return hypre_error_flag; } HYPRE_ANNOTATE_FUNC_BEGIN; hypre_GpuProfilingPushRange("ILUSolve"); /* Compute residual */ hypre_ParCSRMatrixMatvecOutOfPlace(alpha, A, u, beta, f, ftemp); /* Apply permutation */ if (perm) { #if defined(HYPRE_USING_SYCL) hypreSycl_gather(perm, perm + num_rows, ftemp_data, utemp_data); #else HYPRE_THRUST_CALL(gather, perm, perm + num_rows, ftemp_data, utemp_data); #endif } else { hypre_TMemcpy(utemp_data, ftemp_data, HYPRE_Complex, num_rows, HYPRE_MEMORY_DEVICE, HYPRE_MEMORY_DEVICE); } /* L solve - Forward solve */ hypre_CSRMatrixTriLowerUpperSolveDevice('L', 1, matLU_d, NULL, utemp_local, ftemp_local); /* U solve - Backward substitution */ hypre_CSRMatrixTriLowerUpperSolveDevice('U', 0, matLU_d, NULL, ftemp_local, utemp_local); /* Apply reverse permutation */ if (perm) { #if defined(HYPRE_USING_SYCL) hypreSycl_scatter(utemp_data, utemp_data + num_rows, perm, ftemp_data); #else HYPRE_THRUST_CALL(scatter, utemp_data, utemp_data + num_rows, perm, ftemp_data); #endif } else { hypre_TMemcpy(ftemp_data, utemp_data, HYPRE_Complex, num_rows, HYPRE_MEMORY_DEVICE, HYPRE_MEMORY_DEVICE); } /* Update solution */ hypre_ParVectorAxpy(beta, ftemp, u); hypre_GpuProfilingPopRange(); HYPRE_ANNOTATE_FUNC_END; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_ILUApplyLowerJacIterDevice * * Incomplete L solve (Forward) of u^{k+1} = L^{-1}u^k on the GPU using the * Jacobi iterative approach. *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ILUApplyLowerJacIterDevice(hypre_CSRMatrix *A, hypre_Vector *input, hypre_Vector *work, hypre_Vector *output, HYPRE_Int lower_jacobi_iters) { HYPRE_Complex *input_data = hypre_VectorData(input); HYPRE_Complex *work_data = hypre_VectorData(work); HYPRE_Complex *output_data = hypre_VectorData(output); HYPRE_Int num_rows = hypre_CSRMatrixNumRows(A); HYPRE_Int kk = 0; /* Since the initial guess to the jacobi iteration is 0, the result of the first L SpMV is 0, so no need to compute. However, we still need to compute the transformation */ hypreDevice_ComplexAxpyn(work_data, num_rows, input_data, output_data, 0.0); /* Do the remaining iterations */ for (kk = 1; kk < lower_jacobi_iters; kk++) { /* Apply SpMV */ hypre_CSRMatrixSpMVDevice(0, 1.0, A, output, 0.0, work, -2); /* Transform */ hypreDevice_ComplexAxpyn(work_data, num_rows, input_data, output_data, -1.0); } return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_ILUApplyUpperJacIterDevice * * Incomplete U solve (Backward) of u^{k+1} = U^{-1}u^k on the GPU using the * Jacobi iterative approach. *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ILUApplyUpperJacIterDevice(hypre_CSRMatrix *A, hypre_Vector *input, hypre_Vector *work, hypre_Vector *output, hypre_Vector *diag, HYPRE_Int upper_jacobi_iters) { HYPRE_Complex *output_data = hypre_VectorData(output); HYPRE_Complex *work_data = hypre_VectorData(work); HYPRE_Complex *input_data = hypre_VectorData(input); HYPRE_Complex *diag_data = hypre_VectorData(diag); HYPRE_Int num_rows = hypre_CSRMatrixNumRows(A); HYPRE_Int kk = 0; /* Since the initial guess to the jacobi iteration is 0, the result of the first U SpMV is 0, so no need to compute. However, we still need to compute the transformation */ hypreDevice_zeqxmydd(num_rows, input_data, 0.0, work_data, output_data, diag_data); /* Do the remaining iterations */ for (kk = 1; kk < upper_jacobi_iters; kk++) { /* apply SpMV */ hypre_CSRMatrixSpMVDevice(0, 1.0, A, output, 0.0, work, 2); /* transform */ hypreDevice_zeqxmydd(num_rows, input_data, -1.0, work_data, output_data, diag_data); } return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_ILUApplyLowerUpperJacIterDevice * * Incomplete LU solve of u^{k+1} = U^{-1} L^{-1} u^k on the GPU using the * Jacobi iterative approach. *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ILUApplyLowerUpperJacIterDevice(hypre_CSRMatrix *A, hypre_Vector *work1, hypre_Vector *work2, hypre_Vector *inout, hypre_Vector *diag, HYPRE_Int lower_jacobi_iters, HYPRE_Int upper_jacobi_iters) { /* Apply the iterative solve to L */ hypre_ILUApplyLowerJacIterDevice(A, inout, work1, work2, lower_jacobi_iters); /* Apply the iterative solve to U */ hypre_ILUApplyUpperJacIterDevice(A, work2, work1, inout, diag, upper_jacobi_iters); return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_ILUSolveLUIterDevice * * Incomplete LU solve using jacobi iterations on GPU. * L, D and U factors only have local scope (no off-diagonal processor terms). * * TODO (VPM): Merge this function with hypre_ILUSolveLUDevice *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ILUSolveLUIterDevice(hypre_ParCSRMatrix *A, hypre_CSRMatrix *matLU, hypre_ParVector *f, hypre_ParVector *u, HYPRE_Int *perm, hypre_ParVector *ftemp, hypre_ParVector *utemp, hypre_ParVector *xtemp, hypre_Vector **diag_ptr, HYPRE_Int lower_jacobi_iters, HYPRE_Int upper_jacobi_iters) { HYPRE_Int num_rows = hypre_ParCSRMatrixNumRows(A); hypre_Vector *diag = *diag_ptr; hypre_Vector *xtemp_local = hypre_ParVectorLocalVector(xtemp); hypre_Vector *utemp_local = hypre_ParVectorLocalVector(utemp); HYPRE_Complex *utemp_data = hypre_VectorData(utemp_local); hypre_Vector *ftemp_local = hypre_ParVectorLocalVector(ftemp); HYPRE_Complex *ftemp_data = hypre_VectorData(ftemp_local); HYPRE_Complex alpha = -1.0; HYPRE_Complex beta = 1.0; /* Sanity check */ if (num_rows == 0) { return hypre_error_flag; } HYPRE_ANNOTATE_FUNC_BEGIN; hypre_GpuProfilingPushRange("ILUSolveLUIter"); /* Grab the main diagonal from the diagonal block. Only do this once */ if (!diag) { /* Storage for the diagonal */ diag = hypre_SeqVectorCreate(num_rows); hypre_SeqVectorInitialize(diag); /* extract with device kernel */ hypre_CSRMatrixExtractDiagonalDevice(matLU, hypre_VectorData(diag), 2); /* Save output pointer */ *diag_ptr = diag; } /* Compute residual */ hypre_ParCSRMatrixMatvecOutOfPlace(alpha, A, u, beta, f, ftemp); /* Apply permutation */ if (perm) { #if defined(HYPRE_USING_SYCL) hypreSycl_gather(perm, perm + num_rows, ftemp_data, utemp_data); #else HYPRE_THRUST_CALL(gather, perm, perm + num_rows, ftemp_data, utemp_data); #endif } else { hypre_TMemcpy(utemp_data, ftemp_data, HYPRE_Complex, num_rows, HYPRE_MEMORY_DEVICE, HYPRE_MEMORY_DEVICE); } /* Apply the iterative solve to L and U */ hypre_ILUApplyLowerUpperJacIterDevice(matLU, ftemp_local, xtemp_local, utemp_local, diag, lower_jacobi_iters, upper_jacobi_iters); /* Apply reverse permutation */ if (perm) { #if defined(HYPRE_USING_SYCL) hypreSycl_scatter(utemp_data, utemp_data + num_rows, perm, ftemp_data); #else HYPRE_THRUST_CALL(scatter, utemp_data, utemp_data + num_rows, perm, ftemp_data); #endif } else { hypre_TMemcpy(ftemp_data, utemp_data, HYPRE_Complex, num_rows, HYPRE_MEMORY_DEVICE, HYPRE_MEMORY_DEVICE); } /* Update solution */ hypre_ParVectorAxpy(beta, ftemp, u); hypre_GpuProfilingPopRange(); HYPRE_ANNOTATE_FUNC_END; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_ParILUSchurGMRESMatvecDevice * * Slightly different, for this new matvec, the diagonal of the original * matrix is the LU factorization. Thus, the matvec is done in an different way * * |IS_1 E_12 E_13| * |E_21 IS_2 E_23| = S * |E_31 E_32 IS_3| * * |IS_1 | * | IS_2 | = M * | IS_3| * * Solve Sy = g is just M^{-1}S = M^{-1}g * * | I IS_1^{-1}E_12 IS_1^{-1}E_13| * |IS_2^{-1}E_21 I IS_2^{-1}E_23| = M^{-1}S * |IS_3^{-1}E_31 IS_3^{-1}E_32 I | *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ParILUSchurGMRESMatvecDevice(void *matvec_data, HYPRE_Complex alpha, void *ilu_vdata, void *x, HYPRE_Complex beta, void *y) { HYPRE_UNUSED_VAR(matvec_data); /* Get matrix information first */ hypre_ParILUData *ilu_data = (hypre_ParILUData*) ilu_vdata; hypre_ParCSRMatrix *S = hypre_ParILUDataMatS(ilu_data); hypre_CSRMatrix *S_diag = hypre_ParCSRMatrixDiag(S); /* Fist step, apply matvec on empty diagonal slot */ HYPRE_Int num_rows = hypre_CSRMatrixNumRows(S_diag); HYPRE_Int num_nonzeros = hypre_CSRMatrixNumNonzeros(S_diag); hypre_ParVector *xtemp = hypre_ParILUDataXTemp(ilu_data); hypre_ParVector *ytemp = hypre_ParILUDataYTemp(ilu_data); hypre_Vector *xtemp_local = hypre_ParVectorLocalVector(xtemp); hypre_Vector *ytemp_local = hypre_ParVectorLocalVector(ytemp); /* Local variables */ HYPRE_Complex zero = 0.0; HYPRE_Complex one = 1.0; /* Matvec with * | O E_12 E_13| * alpha * |E_21 O E_23| * |E_31 E_32 O | * store in xtemp */ /* RL: temp. set S_diag's nnz = 0 to skip the matvec (based on the assumption in seq_mv/csr_matvec impl.) */ hypre_CSRMatrixNumRows(S_diag) = 0; hypre_CSRMatrixNumNonzeros(S_diag) = 0; hypre_ParCSRMatrixMatvec(alpha, (hypre_ParCSRMatrix *) S, (hypre_ParVector *) x, zero, xtemp); hypre_CSRMatrixNumRows(S_diag) = num_rows; hypre_CSRMatrixNumNonzeros(S_diag) = num_nonzeros; /* Compute U^{-1}*L^{-1}*(S_offd * x) * Or in other words, matvec with * | O IS_1^{-1}E_12 IS_1^{-1}E_13| * alpha * |IS_2^{-1}E_21 O IS_2^{-1}E_23| * |IS_3^{-1}E_31 IS_3^{-1}E_32 O | * store in xtemp */ /* L solve - Forward solve */ hypre_CSRMatrixTriLowerUpperSolveDevice('L', 1, S_diag, NULL, xtemp_local, ytemp_local); /* U solve - Backward substitution */ hypre_CSRMatrixTriLowerUpperSolveDevice('U', 0, S_diag, NULL, ytemp_local, xtemp_local); /* xtemp = xtemp + alpha*x */ hypre_ParVectorAxpy(alpha, (hypre_ParVector *) x, xtemp); /* y = xtemp + beta*y */ hypre_ParVectorAxpyz(one, xtemp, beta, (hypre_ParVector *) y, (hypre_ParVector *) y); return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_ILUSolveSchurGMRESDevice * * Schur Complement solve with GMRES on schur complement * * ParCSRMatrix S is already built in ilu data sturcture, here directly use * S, L, D and U factors only have local scope (no off-diag terms) so apart * from the residual calculation (which uses A), the solves with the L and U * factors are local. * S is the global Schur complement * schur_solver is a GMRES solver * schur_precond is the ILU preconditioner for GMRES * rhs and x are helper vectors for solving the Schur system *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ILUSolveSchurGMRESDevice(hypre_ParCSRMatrix *A, hypre_ParVector *f, hypre_ParVector *u, HYPRE_Int *perm, HYPRE_Int nLU, hypre_ParCSRMatrix *S, hypre_ParVector *ftemp, hypre_ParVector *utemp, HYPRE_Solver schur_solver, HYPRE_Solver schur_precond, hypre_ParVector *rhs, hypre_ParVector *x, HYPRE_Int *u_end, hypre_CSRMatrix *matBLU_d, hypre_CSRMatrix *matE_d, hypre_CSRMatrix *matF_d) { HYPRE_UNUSED_VAR(u_end); /* If we don't have S block, just do one L solve and one U solve */ if (!S) { return hypre_ILUSolveLUDevice(A, matBLU_d, f, u, perm, ftemp, utemp); } /* Data objects for temp vector */ hypre_Vector *utemp_local = hypre_ParVectorLocalVector(utemp); HYPRE_Real *utemp_data = hypre_VectorData(utemp_local); hypre_Vector *ftemp_local = hypre_ParVectorLocalVector(ftemp); HYPRE_Real *ftemp_data = hypre_VectorData(ftemp_local); hypre_Vector *rhs_local = hypre_ParVectorLocalVector(rhs); hypre_Vector *x_local = hypre_ParVectorLocalVector(x); HYPRE_Real *x_data = hypre_VectorData(x_local); /* Problem size */ hypre_CSRMatrix *matSLU_d = hypre_ParCSRMatrixDiag(S); HYPRE_Int m = hypre_CSRMatrixNumRows(matSLU_d); HYPRE_Int n = nLU + m; /* Local variables */ HYPRE_Real alpha = -1.0; HYPRE_Real beta = 1.0; hypre_Vector *ftemp_upper; hypre_Vector *utemp_lower; /* Temporary vectors */ ftemp_upper = hypre_SeqVectorCreate(nLU); utemp_lower = hypre_SeqVectorCreate(m); hypre_VectorOwnsData(ftemp_upper) = 0; hypre_VectorOwnsData(utemp_lower) = 0; hypre_VectorData(ftemp_upper) = ftemp_data; hypre_VectorData(utemp_lower) = utemp_data + nLU; hypre_SeqVectorInitialize(ftemp_upper); hypre_SeqVectorInitialize(utemp_lower); /* Compute residual */ hypre_ParCSRMatrixMatvecOutOfPlace(alpha, A, u, beta, f, ftemp); /* 1st need to solve LBi*xi = fi * L solve, solve xi put in u_temp upper */ /* Apply permutation before we can start our solve */ if (perm) { #if defined(HYPRE_USING_SYCL) hypreSycl_gather(perm, perm + n, ftemp_data, utemp_data); #else HYPRE_THRUST_CALL(gather, perm, perm + n, ftemp_data, utemp_data); #endif } else { hypre_TMemcpy(utemp_data, ftemp_data, HYPRE_Complex, n, HYPRE_MEMORY_DEVICE, HYPRE_MEMORY_DEVICE); } /* This solve won't touch data in utemp, thus, gi is still in utemp_lower */ /* L solve - Forward solve */ hypre_CSRMatrixTriLowerUpperSolveDevice('L', 1, matBLU_d, NULL, utemp_local, ftemp_local); /* 2nd need to compute g'i = gi - Ei*UBi^{-1}*xi * Ei*UBi^{-1} is exactly the matE_d here * Now: LBi^{-1}f_i is in ftemp_upper * gi' is in utemp_lower */ hypre_CSRMatrixMatvec(alpha, matE_d, ftemp_upper, beta, utemp_lower); /* 3rd need to solve global Schur Complement M^{-1}Sy = M^{-1}g' * for now only solve the local system * solve y put in u_temp lower * only solve whe S is not NULL */ /* Setup vectors for solve * rhs = M^{-1}g' */ /* L solve */ hypre_CSRMatrixTriLowerUpperSolveDevice_core('L', 1, matSLU_d, NULL, utemp_local, nLU, ftemp_local, nLU); /* U solve */ hypre_CSRMatrixTriLowerUpperSolveDevice_core('U', 0, matSLU_d, NULL, ftemp_local, nLU, rhs_local, 0); /* Solve with tricky initial guess */ HYPRE_GMRESSolve(schur_solver, (HYPRE_Matrix) schur_precond, (HYPRE_Vector) rhs, (HYPRE_Vector) x); /* 4th need to compute zi = xi - LBi^-1*yi * put zi in f_temp upper * only do this computation when nLU < n * U is unsorted, search is expensive when unnecessary */ hypre_CSRMatrixMatvec(alpha, matF_d, x_local, beta, ftemp_upper); /* 5th need to solve UBi*ui = zi */ /* put result in u_temp upper */ /* U solve - Forward solve */ hypre_CSRMatrixTriLowerUpperSolveDevice('U', 0, matBLU_d, NULL, ftemp_local, utemp_local); /* Copy lower part solution into u_temp as well */ hypre_TMemcpy(utemp_data + nLU, x_data, HYPRE_Real, m, HYPRE_MEMORY_DEVICE, HYPRE_MEMORY_DEVICE); /* Perm back */ if (perm) { #if defined(HYPRE_USING_SYCL) hypreSycl_scatter(utemp_data, utemp_data + n, perm, ftemp_data); #else HYPRE_THRUST_CALL(scatter, utemp_data, utemp_data + n, perm, ftemp_data); #endif } else { hypre_TMemcpy(ftemp_data, utemp_data, HYPRE_Complex, n, HYPRE_MEMORY_DEVICE, HYPRE_MEMORY_DEVICE); } /* Done, now everything are in u_temp, update solution */ hypre_ParVectorAxpy(beta, ftemp, u); /* Free memory */ hypre_SeqVectorDestroy(ftemp_upper); hypre_SeqVectorDestroy(utemp_lower); return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_ILUSolveSchurGMRESJacIterDevice * * Schur Complement solve with GMRES. * * ParCSRMatrix S is already built in the ilu data structure. S, L, D and U * factors only have local scope (no off-diag terms). So apart from the * residual calculation (which uses A), the solves with the L and U factors * are local. * S: the global Schur complement * schur_solver: GMRES solver * schur_precond: ILU preconditioner for GMRES * rhs and x are helper vectors for solving the Schur system *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ILUSolveSchurGMRESJacIterDevice(hypre_ParCSRMatrix *A, hypre_ParVector *f, hypre_ParVector *u, HYPRE_Int *perm, HYPRE_Int nLU, hypre_ParCSRMatrix *S, hypre_ParVector *ftemp, hypre_ParVector *utemp, HYPRE_Solver schur_solver, HYPRE_Solver schur_precond, hypre_ParVector *rhs, hypre_ParVector *x, HYPRE_Int *u_end, hypre_CSRMatrix *matBLU_d, hypre_CSRMatrix *matE_d, hypre_CSRMatrix *matF_d, hypre_ParVector *ztemp, hypre_Vector **Adiag_diag, hypre_Vector **Sdiag_diag, HYPRE_Int lower_jacobi_iters, HYPRE_Int upper_jacobi_iters) { HYPRE_UNUSED_VAR(u_end); /* If we don't have S block, just do one L solve and one U solve */ if (!S) { return hypre_ILUSolveLUIterDevice(A, matBLU_d, f, u, perm, ftemp, utemp, ztemp, Adiag_diag, lower_jacobi_iters, upper_jacobi_iters); } /* Data objects for work vectors */ hypre_Vector *utemp_local = hypre_ParVectorLocalVector(utemp); hypre_Vector *ftemp_local = hypre_ParVectorLocalVector(ftemp); hypre_Vector *ztemp_local = hypre_ParVectorLocalVector(ztemp); hypre_Vector *rhs_local = hypre_ParVectorLocalVector(rhs); hypre_Vector *x_local = hypre_ParVectorLocalVector(x); HYPRE_Complex *utemp_data = hypre_VectorData(utemp_local); HYPRE_Complex *ftemp_data = hypre_VectorData(ftemp_local); HYPRE_Complex *x_data = hypre_VectorData(x_local); /* Problem size */ hypre_CSRMatrix *matSLU_d = hypre_ParCSRMatrixDiag(S); HYPRE_Int m = hypre_CSRMatrixNumRows(matSLU_d); HYPRE_Int n = nLU + m; /* Local variables */ HYPRE_Complex alpha = -1.0; HYPRE_Complex beta = 1.0; hypre_Vector *ftemp_upper; hypre_Vector *utemp_lower; hypre_Vector *ftemp_shift; hypre_Vector *utemp_shift; /* Set work vectors */ ftemp_upper = hypre_SeqVectorCreate(nLU); utemp_lower = hypre_SeqVectorCreate(m); ftemp_shift = hypre_SeqVectorCreate(m); utemp_shift = hypre_SeqVectorCreate(m); hypre_VectorOwnsData(ftemp_upper) = 0; hypre_VectorOwnsData(utemp_lower) = 0; hypre_VectorOwnsData(ftemp_shift) = 0; hypre_VectorOwnsData(utemp_shift) = 0; hypre_VectorData(ftemp_upper) = ftemp_data; hypre_VectorData(utemp_lower) = utemp_data + nLU; hypre_VectorData(ftemp_shift) = ftemp_data + nLU; hypre_VectorData(utemp_shift) = utemp_data + nLU; hypre_SeqVectorInitialize(ftemp_upper); hypre_SeqVectorInitialize(utemp_lower); hypre_SeqVectorInitialize(ftemp_shift); hypre_SeqVectorInitialize(utemp_shift); /* Grab the main diagonal from the diagonal block. Only do this once */ if (!(*Adiag_diag)) { /* Storage for the diagonal */ *Adiag_diag = hypre_SeqVectorCreate(n); hypre_SeqVectorInitialize(*Adiag_diag); /* Extract with device kernel */ hypre_CSRMatrixExtractDiagonalDevice(matBLU_d, hypre_VectorData(*Adiag_diag), 2); } /* Compute residual */ hypre_ParCSRMatrixMatvecOutOfPlace(alpha, A, u, beta, f, ftemp); /* 1st need to solve LBi*xi = fi * L solve, solve xi put in u_temp upper */ /* Apply permutation before we can start our solve */ if (perm) { #if defined(HYPRE_USING_SYCL) hypreSycl_gather(perm, perm + n, ftemp_data, utemp_data); #else HYPRE_THRUST_CALL(gather, perm, perm + n, ftemp_data, utemp_data); #endif } else { hypre_TMemcpy(utemp_data, ftemp_data, HYPRE_Complex, n, HYPRE_MEMORY_DEVICE, HYPRE_MEMORY_DEVICE); } if (nLU > 0) { /* Apply the iterative solve to L */ hypre_ILUApplyLowerJacIterDevice(matBLU_d, utemp_local, ztemp_local, ftemp_local, lower_jacobi_iters); /* 2nd need to compute g'i = gi - Ei*UBi^{-1}*xi * Ei*UBi^{-1} is exactly the matE_d here * Now: LBi^{-1}f_i is in ftemp_upper * gi' is in utemp_lower */ hypre_CSRMatrixMatvec(alpha, matE_d, ftemp_upper, beta, utemp_lower); } /* 3rd need to solve global Schur Complement M^{-1}Sy = M^{-1}g' * for now only solve the local system * solve y put in u_temp lower * only solve whe S is not NULL */ /* Setup vectors for solve * rhs = M^{-1}g' */ if (m > 0) { /* Grab the main diagonal from the diagonal block. Only do this once */ if (!(*Sdiag_diag)) { /* Storage for the diagonal */ *Sdiag_diag = hypre_SeqVectorCreate(m); hypre_SeqVectorInitialize(*Sdiag_diag); /* Extract with device kernel */ hypre_CSRMatrixExtractDiagonalDevice(matSLU_d, hypre_VectorData(*Sdiag_diag), 2); } /* Apply the iterative solve to L */ hypre_ILUApplyLowerJacIterDevice(matSLU_d, utemp_shift, rhs_local, ftemp_shift, lower_jacobi_iters); /* Apply the iterative solve to U */ hypre_ILUApplyUpperJacIterDevice(matSLU_d, ftemp_shift, utemp_shift, rhs_local, *Sdiag_diag, upper_jacobi_iters); } /* Solve with tricky initial guess */ HYPRE_GMRESSolve(schur_solver, (HYPRE_Matrix) schur_precond, (HYPRE_Vector) rhs, (HYPRE_Vector) x); /* 4th need to compute zi = xi - LBi^-1*yi * put zi in f_temp upper * only do this computation when nLU < n * U is unsorted, search is expensive when unnecessary */ if (nLU > 0) { hypre_CSRMatrixMatvec(alpha, matF_d, x_local, beta, ftemp_upper); /* 5th need to solve UBi*ui = zi */ /* put result in u_temp upper */ /* Apply the iterative solve to U */ hypre_ILUApplyUpperJacIterDevice(matBLU_d, ftemp_local, ztemp_local, utemp_local, *Adiag_diag, upper_jacobi_iters); } /* Copy lower part solution into u_temp as well */ hypre_TMemcpy(utemp_data + nLU, x_data, HYPRE_Real, m, HYPRE_MEMORY_DEVICE, HYPRE_MEMORY_DEVICE); /* Perm back */ if (perm) { #if defined(HYPRE_USING_SYCL) hypreSycl_scatter(utemp_data, utemp_data + n, perm, ftemp_data); #else HYPRE_THRUST_CALL(scatter, utemp_data, utemp_data + n, perm, ftemp_data); #endif } else { hypre_TMemcpy(ftemp_data, utemp_data, HYPRE_Complex, n, HYPRE_MEMORY_DEVICE, HYPRE_MEMORY_DEVICE); } /* Update solution */ hypre_ParVectorAxpy(beta, ftemp, u); /* Free memory */ hypre_SeqVectorDestroy(ftemp_shift); hypre_SeqVectorDestroy(utemp_shift); hypre_SeqVectorDestroy(ftemp_upper); hypre_SeqVectorDestroy(utemp_lower); return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_ParILUSchurGMRESMatvecJacIterDevice * * Slightly different, for this new matvec, the diagonal of the original matrix * is the LU factorization. Thus, the matvec is done in an different way * * |IS_1 E_12 E_13| * |E_21 IS_2 E_23| = S * |E_31 E_32 IS_3| * * |IS_1 | * | IS_2 | = M * | IS_3| * * Solve Sy = g is just M^{-1}S = M^{-1}g * * | I IS_1^{-1}E_12 IS_1^{-1}E_13| * |IS_2^{-1}E_21 I IS_2^{-1}E_23| = M^{-1}S * |IS_3^{-1}E_31 IS_3^{-1}E_32 I | *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ParILUSchurGMRESMatvecJacIterDevice(void *matvec_data, HYPRE_Complex alpha, void *ilu_vdata, void *x, HYPRE_Complex beta, void *y) { HYPRE_UNUSED_VAR(matvec_data); /* get matrix information first */ hypre_ParILUData *ilu_data = (hypre_ParILUData*) ilu_vdata; hypre_ParCSRMatrix *S = hypre_ParILUDataMatS(ilu_data); hypre_Vector *Sdiag_diag = hypre_ParILUDataSDiagDiag(ilu_data); HYPRE_Int lower_jacobi_iters = hypre_ParILUDataLowerJacobiIters(ilu_data); HYPRE_Int upper_jacobi_iters = hypre_ParILUDataUpperJacobiIters(ilu_data); /* fist step, apply matvec on empty diagonal slot */ hypre_CSRMatrix *S_diag = hypre_ParCSRMatrixDiag(S); HYPRE_Int S_diag_n = hypre_CSRMatrixNumRows(S_diag); HYPRE_Int S_diag_nnz = hypre_CSRMatrixNumNonzeros(S_diag); hypre_ParVector *xtemp = hypre_ParILUDataXTemp(ilu_data); hypre_Vector *xtemp_local = hypre_ParVectorLocalVector(xtemp); hypre_ParVector *ytemp = hypre_ParILUDataYTemp(ilu_data); hypre_Vector *ytemp_local = hypre_ParVectorLocalVector(ytemp); hypre_ParVector *ztemp = hypre_ParILUDataZTemp(ilu_data); hypre_Vector *ztemp_local = hypre_ParVectorLocalVector(ztemp); HYPRE_Real zero = 0.0; HYPRE_Real one = 1.0; /* Matvec with * | O E_12 E_13| * alpha * |E_21 O E_23| * |E_31 E_32 O | * store in xtemp */ /* RL: temp. set S_diag's nnz = 0 to skip the matvec (based on the assumption in seq_mv/csr_matvec impl.) */ hypre_CSRMatrixNumRows(S_diag) = 0; hypre_CSRMatrixNumNonzeros(S_diag) = 0; hypre_ParCSRMatrixMatvec(alpha, (hypre_ParCSRMatrix *) S, (hypre_ParVector *) x, zero, xtemp); hypre_CSRMatrixNumRows(S_diag) = S_diag_n; hypre_CSRMatrixNumNonzeros(S_diag) = S_diag_nnz; /* Grab the main diagonal from the diagonal block. Only do this once */ if (!Sdiag_diag) { /* Storage for the diagonal */ Sdiag_diag = hypre_SeqVectorCreate(S_diag_n); hypre_SeqVectorInitialize(Sdiag_diag); /* Extract with device kernel */ hypre_CSRMatrixExtractDiagonalDevice(S_diag, hypre_VectorData(Sdiag_diag), 2); /* Save Schur diagonal */ hypre_ParILUDataSDiagDiag(ilu_data) = Sdiag_diag; } /* Compute U^{-1}*L^{-1}*(A_offd * x) * Or in another words, matvec with * | O IS_1^{-1}E_12 IS_1^{-1}E_13| * alpha * |IS_2^{-1}E_21 O IS_2^{-1}E_23| * |IS_3^{-1}E_31 IS_3^{-1}E_32 O | * store in xtemp */ if (S_diag_n) { /* apply the iterative solve to L and U */ hypre_ILUApplyLowerUpperJacIterDevice(S_diag, ytemp_local, ztemp_local, xtemp_local, Sdiag_diag, lower_jacobi_iters, upper_jacobi_iters); } /* now add the original x onto it */ hypre_ParVectorAxpy(alpha, (hypre_ParVector *) x, xtemp); /* y = xtemp + beta*y */ hypre_ParVectorAxpyz(one, xtemp, beta, (hypre_ParVector *) y, (hypre_ParVector *) y); return hypre_error_flag; } /*-------------------------------------------------------------------- * hypre_ILUSolveRAPGMRESDevice * * Device solve with GMRES on schur complement, RAP style. * * See hypre_ILUSolveRAPGMRESHost for more comments *--------------------------------------------------------------------*/ HYPRE_Int hypre_ILUSolveRAPGMRESDevice(hypre_ParCSRMatrix *A, hypre_ParVector *f, hypre_ParVector *u, HYPRE_Int *perm, HYPRE_Int nLU, hypre_ParCSRMatrix *S, hypre_ParVector *ftemp, hypre_ParVector *utemp, hypre_ParVector *xtemp, hypre_ParVector *ytemp, HYPRE_Solver schur_solver, HYPRE_Solver schur_precond, hypre_ParVector *rhs, hypre_ParVector *x, HYPRE_Int *u_end, hypre_ParCSRMatrix *Aperm, hypre_CSRMatrix *matALU_d, hypre_CSRMatrix *matBLU_d, hypre_CSRMatrix *matE_d, hypre_CSRMatrix *matF_d, HYPRE_Int test_opt) { HYPRE_UNUSED_VAR(ytemp); HYPRE_UNUSED_VAR(u_end); /* If we don't have S block, just do one L/U solve */ if (!S) { return hypre_ILUSolveLUDevice(A, matBLU_d, f, u, perm, ftemp, utemp); } /* data objects for vectors */ hypre_Vector *utemp_local = hypre_ParVectorLocalVector(utemp); hypre_Vector *ftemp_local = hypre_ParVectorLocalVector(ftemp); hypre_Vector *xtemp_local = hypre_ParVectorLocalVector(xtemp); hypre_Vector *rhs_local = hypre_ParVectorLocalVector(rhs); hypre_Vector *x_local = hypre_ParVectorLocalVector(x); HYPRE_Complex *utemp_data = hypre_VectorData(utemp_local); HYPRE_Complex *ftemp_data = hypre_VectorData(ftemp_local); HYPRE_Complex *xtemp_data = hypre_VectorData(xtemp_local); HYPRE_Complex *rhs_data = hypre_VectorData(rhs_local); HYPRE_Complex *x_data = hypre_VectorData(x_local); hypre_CSRMatrix *matSLU_d = hypre_ParCSRMatrixDiag(S); HYPRE_Int m = hypre_CSRMatrixNumRows(matSLU_d); HYPRE_Int n = nLU + m; HYPRE_Real one = 1.0; HYPRE_Real mone = -1.0; HYPRE_Real zero = 0.0; /* Temporary vectors */ hypre_Vector *ftemp_upper; hypre_Vector *utemp_lower; /* Create temporary vectors */ ftemp_upper = hypre_SeqVectorCreate(nLU); utemp_lower = hypre_SeqVectorCreate(m); hypre_VectorOwnsData(ftemp_upper) = 0; hypre_VectorOwnsData(utemp_lower) = 0; hypre_VectorData(ftemp_upper) = ftemp_data; hypre_VectorData(utemp_lower) = utemp_data + nLU; hypre_SeqVectorInitialize(ftemp_upper); hypre_SeqVectorInitialize(utemp_lower); switch (test_opt) { case 1: case 3: { /* E and F */ /* compute residual */ hypre_ParCSRMatrixMatvecOutOfPlace(mone, A, u, one, f, utemp); /* apply permutation before we can start our solve * Au=f -> (PAQ)Q'u=Pf */ if (perm) { #if defined(HYPRE_USING_SYCL) hypreSycl_gather(perm, perm + n, utemp_data, ftemp_data); #else HYPRE_THRUST_CALL(gather, perm, perm + n, utemp_data, ftemp_data); #endif } else { hypre_TMemcpy(ftemp_data, utemp_data, HYPRE_Complex, n, HYPRE_MEMORY_DEVICE, HYPRE_MEMORY_DEVICE); } /* A-smoothing * x = [UA\(LA\(P*f_u))] fill to xtemp */ /* L solve - Forward solve */ hypre_CSRMatrixTriLowerUpperSolveDevice('L', 1, matALU_d, NULL, ftemp_local, utemp_local); /* U solve - Backward solve */ hypre_CSRMatrixTriLowerUpperSolveDevice('U', 0, matALU_d, NULL, utemp_local, xtemp_local); /* residual, we should not touch xtemp for now * r = R*(f-PAQx) */ hypre_ParCSRMatrixMatvec(mone, Aperm, xtemp, one, ftemp); /* with R is complex */ /* copy partial data in */ hypre_TMemcpy(rhs_data, ftemp_data + nLU, HYPRE_Real, m, HYPRE_MEMORY_DEVICE, HYPRE_MEMORY_DEVICE); /* solve L^{-1} */ hypre_CSRMatrixTriLowerUpperSolveDevice('L', 1, matBLU_d, NULL, ftemp_local, utemp_local); /* -U^{-1}L^{-1} */ hypre_CSRMatrixTriLowerUpperSolveDevice('U', 0, matBLU_d, NULL, utemp_local, ftemp_local); /* -EU^{-1}L^{-1} */ hypre_CSRMatrixMatvec(mone, matE_d, ftemp_upper, one, rhs_local); /* Solve S */ if (S) { /* if we have a schur complement */ hypre_ParVectorSetConstantValues(x, 0.0); HYPRE_GMRESSolve(schur_solver, (HYPRE_Matrix) schur_precond, (HYPRE_Vector) rhs, (HYPRE_Vector) x); /* u = xtemp + P*x */ /* -Fx */ hypre_CSRMatrixMatvec(mone, matF_d, x_local, zero, ftemp_upper); /* -L^{-1}Fx */ hypre_CSRMatrixTriLowerUpperSolveDevice('L', 1, matBLU_d, NULL, ftemp_local, utemp_local); /* -U{-1}L^{-1}Fx */ hypre_CSRMatrixTriLowerUpperSolveDevice('U', 0, matBLU_d, NULL, utemp_local, ftemp_local); /* now copy data to y_lower */ hypre_TMemcpy(ftemp_data + nLU, x_data, HYPRE_Real, m, HYPRE_MEMORY_DEVICE, HYPRE_MEMORY_DEVICE); } else { /* otherwise just apply triangular solves */ /* L solve - Forward solve */ hypre_CSRMatrixTriLowerUpperSolveDevice('L', 1, matSLU_d, NULL, rhs_local, x_local); /* U solve - Backward solve */ hypre_CSRMatrixTriLowerUpperSolveDevice('U', 0, matSLU_d, NULL, x_local, rhs_local); /* u = xtemp + P*x */ /* -Fx */ hypre_CSRMatrixMatvec(mone, matF_d, rhs_local, zero, ftemp_upper); /* -L^{-1}Fx */ hypre_CSRMatrixTriLowerUpperSolveDevice('L', 1, matBLU_d, NULL, ftemp_local, utemp_local); /* -U{-1}L^{-1}Fx */ hypre_CSRMatrixTriLowerUpperSolveDevice('U', 0, matBLU_d, NULL, utemp_local, ftemp_local); /* now copy data to y_lower */ hypre_TMemcpy(ftemp_data + nLU, rhs_data, HYPRE_Real, m, HYPRE_MEMORY_DEVICE, HYPRE_MEMORY_DEVICE); } /* correction to the residual */ hypre_ParVectorAxpy(one, ftemp, xtemp); /* perm back */ if (perm) { #if defined(HYPRE_USING_SYCL) hypreSycl_scatter(xtemp_data, xtemp_data + n, perm, ftemp_data); #else HYPRE_THRUST_CALL(scatter, xtemp_data, xtemp_data + n, perm, ftemp_data); #endif } else { hypre_TMemcpy(ftemp_data, xtemp_data, HYPRE_Complex, n, HYPRE_MEMORY_DEVICE, HYPRE_MEMORY_DEVICE); } } break; case 0: case 2: default: { /* EU^{-1} and L^{-1}F */ /* compute residual */ hypre_ParCSRMatrixMatvecOutOfPlace(mone, A, u, one, f, ftemp); /* apply permutation before we can start our solve * Au=f -> (PAQ)Q'u=Pf */ if (perm) { #if defined(HYPRE_USING_SYCL) hypreSycl_gather(perm, perm + n, ftemp_data, utemp_data); #else HYPRE_THRUST_CALL(gather, perm, perm + n, ftemp_data, utemp_data); #endif } else { hypre_TMemcpy(utemp_data, ftemp_data, HYPRE_Complex, n, HYPRE_MEMORY_DEVICE, HYPRE_MEMORY_DEVICE); } /* A-smoothing * x = [UA\(LA\(P*f_u))] fill to xtemp */ /* L solve - Forward solve */ hypre_CSRMatrixTriLowerUpperSolveDevice('L', 1, matALU_d, NULL, utemp_local, ftemp_local); /* U solve - Backward solve */ hypre_CSRMatrixTriLowerUpperSolveDevice('U', 0, matALU_d, NULL, ftemp_local, xtemp_local); /* residual, we should not touch xtemp for now * r = R*(f-PAQx) */ hypre_ParCSRMatrixMatvec(mone, Aperm, xtemp, one, utemp); /* with R is complex */ /* copy partial data in */ hypre_TMemcpy(rhs_data, utemp_data + nLU, HYPRE_Real, m, HYPRE_MEMORY_DEVICE, HYPRE_MEMORY_DEVICE); /* solve L^{-1} */ hypre_CSRMatrixTriLowerUpperSolveDevice('L', 1, matBLU_d, NULL, utemp_local, ftemp_local); /* -EU^{-1}L^{-1} */ hypre_CSRMatrixMatvec(mone, matE_d, ftemp_upper, one, rhs_local); /* Solve S */ if (S) { /* if we have a schur complement */ hypre_ParVectorSetConstantValues(x, 0.0); HYPRE_GMRESSolve(schur_solver, (HYPRE_Matrix) schur_precond, (HYPRE_Vector) rhs, (HYPRE_Vector) x); /* u = xtemp + P*x */ /* -L^{-1}Fx */ hypre_CSRMatrixMatvec(mone, matF_d, x_local, zero, ftemp_upper); /* -U{-1}L^{-1}Fx */ hypre_CSRMatrixTriLowerUpperSolveDevice('U', 0, matBLU_d, NULL, ftemp_local, utemp_local); /* now copy data to y_lower */ hypre_TMemcpy(utemp_data + nLU, x_data, HYPRE_Real, m, HYPRE_MEMORY_DEVICE, HYPRE_MEMORY_DEVICE); } else { /* otherwise just apply triangular solves */ hypre_CSRMatrixTriLowerUpperSolveDevice('L', 1, matSLU_d, NULL, rhs_local, x_local); hypre_CSRMatrixTriLowerUpperSolveDevice('U', 0, matSLU_d, NULL, x_local, rhs_local); /* u = xtemp + P*x */ /* -L^{-1}Fx */ hypre_CSRMatrixMatvec(mone, matF_d, rhs_local, zero, ftemp_upper); /* -U{-1}L^{-1}Fx */ hypre_CSRMatrixTriLowerUpperSolveDevice('U', 0, matBLU_d, NULL, ftemp_local, utemp_local); /* now copy data to y_lower */ hypre_TMemcpy(utemp_data + nLU, rhs_data, HYPRE_Real, m, HYPRE_MEMORY_DEVICE, HYPRE_MEMORY_DEVICE); } /* Update xtemp */ hypre_ParVectorAxpy(one, utemp, xtemp); /* perm back */ if (perm) { #if defined(HYPRE_USING_SYCL) hypreSycl_scatter(xtemp_data, xtemp_data + n, perm, ftemp_data); #else HYPRE_THRUST_CALL(scatter, xtemp_data, xtemp_data + n, perm, ftemp_data); #endif } else { hypre_TMemcpy(ftemp_data, xtemp_data, HYPRE_Complex, n, HYPRE_MEMORY_DEVICE, HYPRE_MEMORY_DEVICE); } } break; } /* Done, now everything are in u_temp, update solution */ hypre_ParVectorAxpy(one, ftemp, u); /* Destroy temporary vectors */ hypre_SeqVectorDestroy(ftemp_upper); hypre_SeqVectorDestroy(utemp_lower); return hypre_error_flag; } #endif /* defined(HYPRE_USING_GPU) */ hypre-2.33.0/src/parcsr_ls/par_indepset.c000066400000000000000000000150411477326011500203350ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * *****************************************************************************/ #include "_hypre_parcsr_ls.h" /*==========================================================================*/ /*==========================================================================*/ /** Augments measures by some random value between 0 and 1. {\bf Input files:} _hypre_parcsr_ls.h @return Error code. @param S [IN] parent graph matrix in CSR format @param measure_array [IN/OUT] measures assigned to each node of the parent graph @see hypre_AMGIndepSet */ /*--------------------------------------------------------------------------*/ HYPRE_Int hypre_BoomerAMGIndepSetInit( hypre_ParCSRMatrix *S, HYPRE_Real *measure_array, HYPRE_Int seq_rand) { hypre_CSRMatrix *S_diag = hypre_ParCSRMatrixDiag(S); MPI_Comm comm = hypre_ParCSRMatrixComm(S); HYPRE_Int S_num_nodes = hypre_CSRMatrixNumRows(S_diag); HYPRE_BigInt big_i; HYPRE_Int i, my_id; HYPRE_Int ierr = 0; hypre_MPI_Comm_rank(comm, &my_id); i = 2747 + my_id; if (seq_rand) { i = 2747; } hypre_SeedRand(i); if (seq_rand) { for (big_i = 0; big_i < hypre_ParCSRMatrixFirstRowIndex(S); big_i++) { hypre_Rand(); } } for (i = 0; i < S_num_nodes; i++) { measure_array[i] += hypre_Rand(); } return (ierr); } /*==========================================================================*/ /*==========================================================================*/ /** Select an independent set from a graph. This graph is actually a subgraph of some parent graph. The parent graph is described as a matrix in compressed sparse row format, where edges in the graph are represented by nonzero matrix coefficients (zero coefficients are ignored). A positive measure is given for each node in the subgraph, and this is used to pick the independent set. A measure of zero must be given for all other nodes in the parent graph. The subgraph is a collection of nodes in the parent graph. Positive entries in the `IS\_marker' array indicate nodes in the independent set. All other entries are zero. The algorithm proceeds by first setting all nodes in `graph\_array' to be in the independent set. Nodes are then removed from the independent set by simply comparing the measures of adjacent nodes. {\bf Input files:} _hypre_parcsr_ls.h @return Error code. @param S [IN] parent graph matrix in CSR format @param measure_array [IN] measures assigned to each node of the parent graph @param graph_array [IN] node numbers in the subgraph to be partitioned @param graph_array_size [IN] number of nodes in the subgraph to be partitioned @param IS_marker [IN/OUT] marker array for independent set @see hypre_InitAMGIndepSet */ /*--------------------------------------------------------------------------*/ HYPRE_Int hypre_BoomerAMGIndepSet( hypre_ParCSRMatrix *S, HYPRE_Real *measure_array, HYPRE_Int *graph_array, HYPRE_Int graph_array_size, HYPRE_Int *graph_array_offd, HYPRE_Int graph_array_offd_size, HYPRE_Int *IS_marker, HYPRE_Int *IS_marker_offd ) { hypre_CSRMatrix *S_diag = hypre_ParCSRMatrixDiag(S); HYPRE_Int *S_diag_i = hypre_CSRMatrixI(S_diag); HYPRE_Int *S_diag_j = hypre_CSRMatrixJ(S_diag); hypre_CSRMatrix *S_offd = hypre_ParCSRMatrixOffd(S); HYPRE_Int *S_offd_i = hypre_CSRMatrixI(S_offd); HYPRE_Int *S_offd_j = NULL; HYPRE_Int local_num_vars = hypre_CSRMatrixNumRows(S_diag); HYPRE_Int i, j, ig, jS, jj; /*------------------------------------------------------- * Initialize IS_marker by putting all nodes in * the independent set. *-------------------------------------------------------*/ if (hypre_CSRMatrixNumCols(S_offd)) { S_offd_j = hypre_CSRMatrixJ(S_offd); } for (ig = 0; ig < graph_array_size; ig++) { i = graph_array[ig]; if (measure_array[i] > 1) { IS_marker[i] = 1; } } for (ig = 0; ig < graph_array_offd_size; ig++) { i = graph_array_offd[ig]; if (measure_array[i + local_num_vars] > 1) { IS_marker_offd[i] = 1; } } /*------------------------------------------------------- * Remove nodes from the initial independent set *-------------------------------------------------------*/ for (ig = 0; ig < graph_array_size; ig++) { i = graph_array[ig]; if (measure_array[i] > 1) { for (jS = S_diag_i[i]; jS < S_diag_i[i + 1]; jS++) { j = S_diag_j[jS]; if (j < 0) { j = -j - 1; } /* only consider valid graph edges */ /* if ( (measure_array[j] > 1) && (S_diag_data[jS]) ) */ if (measure_array[j] > 1) { if (measure_array[i] > measure_array[j]) { IS_marker[j] = 0; } else if (measure_array[j] > measure_array[i]) { IS_marker[i] = 0; } } } for (jS = S_offd_i[i]; jS < S_offd_i[i + 1]; jS++) { jj = S_offd_j[jS]; if (jj < 0) { jj = -jj - 1; } j = local_num_vars + jj; /* only consider valid graph edges */ /* if ( (measure_array[j] > 1) && (S_offd_data[jS]) ) */ if (measure_array[j] > 1) { if (measure_array[i] > measure_array[j]) { IS_marker_offd[jj] = 0; } else if (measure_array[j] > measure_array[i]) { IS_marker[i] = 0; } } } } } return hypre_error_flag; } hypre-2.33.0/src/parcsr_ls/par_indepset_device.c000066400000000000000000000221731477326011500216600ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * *****************************************************************************/ #include "_hypre_parcsr_ls.h" #include "_hypre_utilities.hpp" #if defined(HYPRE_USING_GPU) __global__ void hypreGPUKernel_IndepSetMain(hypre_DeviceItem &item, HYPRE_Int graph_diag_size, HYPRE_Int *graph_diag, HYPRE_Real *measure_diag, HYPRE_Real *measure_offd, HYPRE_Int *S_diag_i, HYPRE_Int *S_diag_j, HYPRE_Int *S_offd_i, HYPRE_Int *S_offd_j, HYPRE_Int *IS_marker_diag, HYPRE_Int *IS_marker_offd, HYPRE_Int IS_offd_temp_mark) { HYPRE_Int warp_id = hypre_gpu_get_grid_warp_id<1, 1>(item); if (warp_id >= graph_diag_size) { return; } HYPRE_Int lane = hypre_gpu_get_lane_id<1>(item); HYPRE_Int row, row_start, row_end; HYPRE_Int i = 0, j; HYPRE_Real t = 0.0, measure_row; HYPRE_Int marker_row = 1; if (lane < 2) { row = read_only_load(graph_diag + warp_id); i = read_only_load(S_diag_i + row + lane); } row_start = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, i, 0); row_end = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, i, 1); if (lane == 0) { t = read_only_load(measure_diag + row); } measure_row = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, t, 0); for (i = row_start + lane; i < row_end; i += HYPRE_WARP_SIZE) { j = read_only_load(S_diag_j + i); t = read_only_load(measure_diag + j); if (t > 1.0) { if (measure_row > t) { IS_marker_diag[j] = 0; } else if (t > measure_row) { marker_row = 0; } } } if (lane < 2) { i = read_only_load(S_offd_i + row + lane); } row_start = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, i, 0); row_end = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, i, 1); for (i = row_start + lane; i < row_end; i += HYPRE_WARP_SIZE) { j = read_only_load(S_offd_j + i); t = read_only_load(measure_offd + j); if (t > 1.0) { if (measure_row > t) { IS_marker_offd[j] = IS_offd_temp_mark; } else if (t > measure_row) { marker_row = 0; } } } marker_row = warp_reduce_min(item, marker_row); if (lane == 0 && marker_row == 0) { IS_marker_diag[row] = 0; } } __global__ void hypreGPUKernel_IndepSetFixMarker(hypre_DeviceItem &item, HYPRE_Int *IS_marker_diag, HYPRE_Int num_elmts_send, HYPRE_Int *send_map_elmts, HYPRE_Int *int_send_buf, HYPRE_Int IS_offd_temp_mark) { HYPRE_Int thread_id = hypre_gpu_get_grid_thread_id<1, 1>(item); if (thread_id >= num_elmts_send) { return; } if (int_send_buf[thread_id] == IS_offd_temp_mark) { IS_marker_diag[send_map_elmts[thread_id]] = 0; } } /* Find IS in the graph whose vertices are in graph_diag, on exit * mark the vertices in IS by 1 and those not in IS by 0 in IS_marker_diag * Note: IS_marker_offd will not be sync'ed on exit */ HYPRE_Int hypre_BoomerAMGIndepSetDevice( hypre_ParCSRMatrix *S, HYPRE_Real *measure_diag, HYPRE_Real *measure_offd, HYPRE_Int graph_diag_size, HYPRE_Int *graph_diag, HYPRE_Int *IS_marker_diag, HYPRE_Int *IS_marker_offd, hypre_ParCSRCommPkg *comm_pkg, HYPRE_Int *int_send_buf ) { /* This a temporary mark used in PMIS alg. to mark the *offd* nodes that * should not be in the final IS * Must make sure that this number does NOT exist in IS_marker_offd on input */ HYPRE_Int IS_offd_temp_mark = 9999; hypre_CSRMatrix *S_diag = hypre_ParCSRMatrixDiag(S); HYPRE_Int *S_diag_i = hypre_CSRMatrixI(S_diag); HYPRE_Int *S_diag_j = hypre_CSRMatrixJ(S_diag); hypre_CSRMatrix *S_offd = hypre_ParCSRMatrixOffd(S); HYPRE_Int *S_offd_i = hypre_CSRMatrixI(S_offd); HYPRE_Int *S_offd_j = hypre_CSRMatrixJ(S_offd); HYPRE_Int num_sends = hypre_ParCSRCommPkgNumSends(comm_pkg); HYPRE_Int num_elmts_send = hypre_ParCSRCommPkgSendMapStart(comm_pkg, num_sends); HYPRE_Int *send_map_elmts = hypre_ParCSRCommPkgDeviceSendMapElmts(comm_pkg); hypre_ParCSRCommHandle *comm_handle; /*------------------------------------------------------------------ * Initialize IS_marker by putting all nodes in the IS (marked by 1) *------------------------------------------------------------------*/ hypreDevice_ScatterConstant(IS_marker_diag, graph_diag_size, graph_diag, (HYPRE_Int) 1); /*------------------------------------------------------- * Remove nodes from the initial independent set *-------------------------------------------------------*/ dim3 bDim = hypre_GetDefaultDeviceBlockDimension(); dim3 gDim = hypre_GetDefaultDeviceGridDimension(graph_diag_size, "warp", bDim); HYPRE_GPU_LAUNCH( hypreGPUKernel_IndepSetMain, gDim, bDim, graph_diag_size, graph_diag, measure_diag, measure_offd, S_diag_i, S_diag_j, S_offd_i, S_offd_j, IS_marker_diag, IS_marker_offd, IS_offd_temp_mark ); /*-------------------------------------------------------------------- * Exchange boundary data for IS_marker: send external IS to internal *-------------------------------------------------------------------*/ /* RL: make sure IS_marker_offd is ready before issuing GPU-GPU MPI */ if (hypre_GetGpuAwareMPI()) { hypre_ForceSyncComputeStream(); } comm_handle = hypre_ParCSRCommHandleCreate_v2(12, comm_pkg, HYPRE_MEMORY_DEVICE, IS_marker_offd, HYPRE_MEMORY_DEVICE, int_send_buf); hypre_ParCSRCommHandleDestroy(comm_handle); /* adjust IS_marker_diag from the received */ gDim = hypre_GetDefaultDeviceGridDimension(num_elmts_send, "thread", bDim); HYPRE_GPU_LAUNCH( hypreGPUKernel_IndepSetFixMarker, gDim, bDim, IS_marker_diag, num_elmts_send, send_map_elmts, int_send_buf, IS_offd_temp_mark ); /* Note that IS_marker_offd is not sync'ed (communicated) here */ return hypre_error_flag; } /* Augments measures by some random value between 0 and 1 * aug_rand: 1: GPU RAND; 11: GPU SEQ RAND * 2: CPU RAND; 12: CPU SEQ RAND */ HYPRE_Int hypre_BoomerAMGIndepSetInitDevice( hypre_ParCSRMatrix *S, HYPRE_Real *measure_array, HYPRE_Int aug_rand) { MPI_Comm comm = hypre_ParCSRMatrixComm(S); hypre_CSRMatrix *S_diag = hypre_ParCSRMatrixDiag(S); HYPRE_Int num_rows_diag = hypre_CSRMatrixNumRows(S_diag); HYPRE_Int my_id; HYPRE_Real *urand; hypre_MPI_Comm_rank(comm, &my_id); urand = hypre_TAlloc(HYPRE_Real, num_rows_diag, HYPRE_MEMORY_DEVICE); if (aug_rand == 2 || aug_rand == 12) { HYPRE_Real *h_urand; h_urand = hypre_CTAlloc(HYPRE_Real, num_rows_diag, HYPRE_MEMORY_HOST); hypre_BoomerAMGIndepSetInit(S, h_urand, aug_rand == 12); hypre_TMemcpy(urand, h_urand, HYPRE_Real, num_rows_diag, HYPRE_MEMORY_DEVICE, HYPRE_MEMORY_HOST); hypre_TFree(h_urand, HYPRE_MEMORY_HOST); } else if (aug_rand == 11) { HYPRE_BigInt n_global = hypre_ParCSRMatrixGlobalNumRows(S); HYPRE_BigInt n_first = hypre_ParCSRMatrixFirstRowIndex(S); HYPRE_Real *urand_global = hypre_TAlloc(HYPRE_Real, n_global, HYPRE_MEMORY_DEVICE); // To make sure all rank generate the same sequence hypre_CurandUniform(n_global, urand_global, 0, 0, 1, 0); hypre_TMemcpy(urand, urand_global + n_first, HYPRE_Real, num_rows_diag, HYPRE_MEMORY_DEVICE, HYPRE_MEMORY_DEVICE); hypre_TFree(urand_global, HYPRE_MEMORY_DEVICE); } else { hypre_assert(aug_rand == 1); hypre_CurandUniform(num_rows_diag, urand, 0, 0, 0, 0); } hypreDevice_ComplexAxpyn(measure_array, num_rows_diag, urand, measure_array, 1.0); hypre_TFree(urand, HYPRE_MEMORY_DEVICE); return hypre_error_flag; } #endif // #if defined(HYPRE_USING_GPU) hypre-2.33.0/src/parcsr_ls/par_interp.c000066400000000000000000004522771477326011500200430ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "_hypre_parcsr_ls.h" /*--------------------------------------------------------------------------- * hypre_BoomerAMGBuildInterp *--------------------------------------------------------------------------*/ HYPRE_Int hypre_BoomerAMGBuildInterp( hypre_ParCSRMatrix *A, HYPRE_Int *CF_marker, hypre_ParCSRMatrix *S, HYPRE_BigInt *num_cpts_global, HYPRE_Int num_functions, HYPRE_Int *dof_func, HYPRE_Int debug_flag, HYPRE_Real trunc_factor, HYPRE_Int max_elmts, hypre_ParCSRMatrix **P_ptr) { MPI_Comm comm = hypre_ParCSRMatrixComm(A); hypre_ParCSRCommPkg *comm_pkg = hypre_ParCSRMatrixCommPkg(A); hypre_ParCSRCommHandle *comm_handle; HYPRE_MemoryLocation memory_location_P = hypre_ParCSRMatrixMemoryLocation(A); hypre_CSRMatrix *A_diag = hypre_ParCSRMatrixDiag(A); HYPRE_Real *A_diag_data = hypre_CSRMatrixData(A_diag); HYPRE_Int *A_diag_i = hypre_CSRMatrixI(A_diag); HYPRE_Int *A_diag_j = hypre_CSRMatrixJ(A_diag); hypre_CSRMatrix *A_offd = hypre_ParCSRMatrixOffd(A); HYPRE_Real *A_offd_data = hypre_CSRMatrixData(A_offd); HYPRE_Int *A_offd_i = hypre_CSRMatrixI(A_offd); HYPRE_Int *A_offd_j = hypre_CSRMatrixJ(A_offd); HYPRE_Int num_cols_A_offd = hypre_CSRMatrixNumCols(A_offd); HYPRE_BigInt *col_map_offd = hypre_ParCSRMatrixColMapOffd(A); hypre_CSRMatrix *S_diag = hypre_ParCSRMatrixDiag(S); HYPRE_Int *S_diag_i = hypre_CSRMatrixI(S_diag); HYPRE_Int *S_diag_j = hypre_CSRMatrixJ(S_diag); hypre_CSRMatrix *S_offd = hypre_ParCSRMatrixOffd(S); HYPRE_Int *S_offd_i = hypre_CSRMatrixI(S_offd); HYPRE_Int *S_offd_j = hypre_CSRMatrixJ(S_offd); hypre_ParCSRMatrix *P; HYPRE_BigInt *col_map_offd_P; HYPRE_Int *tmp_map_offd = NULL; HYPRE_Int *CF_marker_offd = NULL; HYPRE_Int *dof_func_offd = NULL; hypre_CSRMatrix *A_ext = NULL; HYPRE_Real *A_ext_data = NULL; HYPRE_Int *A_ext_i = NULL; HYPRE_BigInt *A_ext_j = NULL; hypre_CSRMatrix *P_diag; hypre_CSRMatrix *P_offd; HYPRE_Real *P_diag_data; HYPRE_Int *P_diag_i; HYPRE_Int *P_diag_j; HYPRE_Real *P_offd_data; HYPRE_Int *P_offd_i; HYPRE_Int *P_offd_j; HYPRE_Int P_diag_size, P_offd_size; HYPRE_Int *P_marker, *P_marker_offd; HYPRE_Int jj_counter, jj_counter_offd; HYPRE_Int *jj_count, *jj_count_offd; HYPRE_Int jj_begin_row, jj_begin_row_offd; HYPRE_Int jj_end_row, jj_end_row_offd; HYPRE_Int start_indexing = 0; /* start indexing for P_data at 0 */ HYPRE_Int n_fine = hypre_CSRMatrixNumRows(A_diag); HYPRE_Int strong_f_marker; HYPRE_Int *fine_to_coarse; //HYPRE_Int *fine_to_coarse_offd; HYPRE_Int *coarse_counter; HYPRE_Int coarse_shift; HYPRE_BigInt total_global_cpts; //HYPRE_BigInt my_first_cpt; HYPRE_Int num_cols_P_offd; HYPRE_Int i, i1, i2; HYPRE_Int j, jl, jj, jj1; HYPRE_Int kc; HYPRE_BigInt big_k; HYPRE_Int start; HYPRE_Int sgn; HYPRE_Int c_num; HYPRE_Real diagonal; HYPRE_Real sum; HYPRE_Real distribute; HYPRE_Real zero = 0.0; HYPRE_Real one = 1.0; HYPRE_Int my_id; HYPRE_Int num_procs; HYPRE_Int num_threads; HYPRE_Int num_sends; HYPRE_Int index; HYPRE_Int ns, ne, size, rest; HYPRE_Int print_level = 0; HYPRE_Int *int_buf_data; HYPRE_BigInt col_1 = hypre_ParCSRMatrixFirstRowIndex(A); HYPRE_Int local_numrows = hypre_CSRMatrixNumRows(A_diag); HYPRE_BigInt col_n = col_1 + (HYPRE_BigInt)local_numrows; HYPRE_Real wall_time = 0.0; /* for debugging instrumentation */ hypre_MPI_Comm_size(comm, &num_procs); hypre_MPI_Comm_rank(comm, &my_id); num_threads = hypre_NumThreads(); //my_first_cpt = num_cpts_global[0]; if (my_id == (num_procs - 1)) { total_global_cpts = num_cpts_global[1]; } hypre_MPI_Bcast(&total_global_cpts, 1, HYPRE_MPI_BIG_INT, num_procs - 1, comm); /*------------------------------------------------------------------- * Get the CF_marker data for the off-processor columns *-------------------------------------------------------------------*/ if (debug_flag < 0) { debug_flag = -debug_flag; print_level = 1; } if (debug_flag == 4) { wall_time = time_getWallclockSeconds(); } if (num_cols_A_offd) { CF_marker_offd = hypre_CTAlloc(HYPRE_Int, num_cols_A_offd, HYPRE_MEMORY_HOST); } if (num_functions > 1 && num_cols_A_offd) { dof_func_offd = hypre_CTAlloc(HYPRE_Int, num_cols_A_offd, HYPRE_MEMORY_HOST); } if (!comm_pkg) { hypre_MatvecCommPkgCreate(A); comm_pkg = hypre_ParCSRMatrixCommPkg(A); } num_sends = hypre_ParCSRCommPkgNumSends(comm_pkg); int_buf_data = hypre_CTAlloc(HYPRE_Int, hypre_ParCSRCommPkgSendMapStart(comm_pkg, num_sends), HYPRE_MEMORY_HOST); index = 0; for (i = 0; i < num_sends; i++) { start = hypre_ParCSRCommPkgSendMapStart(comm_pkg, i); for (j = start; j < hypre_ParCSRCommPkgSendMapStart(comm_pkg, i + 1); j++) { int_buf_data[index++] = CF_marker[hypre_ParCSRCommPkgSendMapElmt(comm_pkg, j)]; } } comm_handle = hypre_ParCSRCommHandleCreate( 11, comm_pkg, int_buf_data, CF_marker_offd); hypre_ParCSRCommHandleDestroy(comm_handle); if (num_functions > 1) { index = 0; for (i = 0; i < num_sends; i++) { start = hypre_ParCSRCommPkgSendMapStart(comm_pkg, i); for (j = start; j < hypre_ParCSRCommPkgSendMapStart(comm_pkg, i + 1); j++) { int_buf_data[index++] = dof_func[hypre_ParCSRCommPkgSendMapElmt(comm_pkg, j)]; } } comm_handle = hypre_ParCSRCommHandleCreate( 11, comm_pkg, int_buf_data, dof_func_offd); hypre_ParCSRCommHandleDestroy(comm_handle); } if (debug_flag == 4) { wall_time = time_getWallclockSeconds() - wall_time; hypre_printf("Proc = %d Interp: Comm 1 CF_marker = %f\n", my_id, wall_time); fflush(NULL); } /*---------------------------------------------------------------------- * Get the ghost rows of A *---------------------------------------------------------------------*/ if (debug_flag == 4) { wall_time = time_getWallclockSeconds(); } if (num_procs > 1) { A_ext = hypre_ParCSRMatrixExtractBExt(A, A, 1); A_ext_i = hypre_CSRMatrixI(A_ext); A_ext_j = hypre_CSRMatrixBigJ(A_ext); A_ext_data = hypre_CSRMatrixData(A_ext); } index = 0; for (i = 0; i < num_cols_A_offd; i++) { for (j = A_ext_i[i]; j < A_ext_i[i + 1]; j++) { big_k = A_ext_j[j]; if (big_k >= col_1 && big_k < col_n) { A_ext_j[index] = big_k - col_1; A_ext_data[index++] = A_ext_data[j]; } else { kc = hypre_BigBinarySearch(col_map_offd, big_k, num_cols_A_offd); if (kc > -1) { A_ext_j[index] = (HYPRE_BigInt)(-kc - 1); A_ext_data[index++] = A_ext_data[j]; } } } A_ext_i[i] = index; } for (i = num_cols_A_offd; i > 0; i--) { A_ext_i[i] = A_ext_i[i - 1]; } if (num_procs > 1) { A_ext_i[0] = 0; } if (debug_flag == 4) { wall_time = time_getWallclockSeconds() - wall_time; hypre_printf("Proc = %d Interp: Comm 2 Get A_ext = %f\n", my_id, wall_time); fflush(NULL); } /*----------------------------------------------------------------------- * First Pass: Determine size of P and fill in fine_to_coarse mapping. *-----------------------------------------------------------------------*/ /*----------------------------------------------------------------------- * Intialize counters and allocate mapping vector. *-----------------------------------------------------------------------*/ coarse_counter = hypre_CTAlloc(HYPRE_Int, num_threads, HYPRE_MEMORY_HOST); jj_count = hypre_CTAlloc(HYPRE_Int, num_threads, HYPRE_MEMORY_HOST); jj_count_offd = hypre_CTAlloc(HYPRE_Int, num_threads, HYPRE_MEMORY_HOST); fine_to_coarse = hypre_CTAlloc(HYPRE_Int, n_fine, HYPRE_MEMORY_HOST); #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i) HYPRE_SMP_SCHEDULE #endif for (i = 0; i < n_fine; i++) { fine_to_coarse[i] = -1; } jj_counter = start_indexing; jj_counter_offd = start_indexing; /*----------------------------------------------------------------------- * Loop over fine grid. *-----------------------------------------------------------------------*/ /* RDF: this looks a little tricky, but doable */ #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i,j,i1,jj,ns,ne,size,rest) HYPRE_SMP_SCHEDULE #endif for (j = 0; j < num_threads; j++) { size = n_fine / num_threads; rest = n_fine - size * num_threads; if (j < rest) { ns = j * size + j; ne = (j + 1) * size + j + 1; } else { ns = j * size + rest; ne = (j + 1) * size + rest; } for (i = ns; i < ne; i++) { /*-------------------------------------------------------------------- * If i is a C-point, interpolation is the identity. Also set up * mapping vector. *--------------------------------------------------------------------*/ if (CF_marker[i] >= 0) { jj_count[j]++; fine_to_coarse[i] = coarse_counter[j]; coarse_counter[j]++; } /*-------------------------------------------------------------------- * If i is an F-point, interpolation is from the C-points that * strongly influence i. *--------------------------------------------------------------------*/ else { for (jj = S_diag_i[i]; jj < S_diag_i[i + 1]; jj++) { i1 = S_diag_j[jj]; if (CF_marker[i1] >= 0) { jj_count[j]++; } } if (num_procs > 1) { for (jj = S_offd_i[i]; jj < S_offd_i[i + 1]; jj++) { i1 = S_offd_j[jj]; if (CF_marker_offd[i1] >= 0) { jj_count_offd[j]++; } } } } } } /*----------------------------------------------------------------------- * Allocate arrays. *-----------------------------------------------------------------------*/ for (i = 0; i < num_threads - 1; i++) { coarse_counter[i + 1] += coarse_counter[i]; jj_count[i + 1] += jj_count[i]; jj_count_offd[i + 1] += jj_count_offd[i]; } i = num_threads - 1; jj_counter = jj_count[i]; jj_counter_offd = jj_count_offd[i]; P_diag_size = jj_counter; P_diag_i = hypre_CTAlloc(HYPRE_Int, n_fine + 1, memory_location_P); P_diag_j = hypre_CTAlloc(HYPRE_Int, P_diag_size, memory_location_P); P_diag_data = hypre_CTAlloc(HYPRE_Real, P_diag_size, memory_location_P); P_diag_i[n_fine] = jj_counter; P_offd_size = jj_counter_offd; P_offd_i = hypre_CTAlloc(HYPRE_Int, n_fine + 1, memory_location_P); P_offd_j = hypre_CTAlloc(HYPRE_Int, P_offd_size, memory_location_P); P_offd_data = hypre_CTAlloc(HYPRE_Real, P_offd_size, memory_location_P); /*----------------------------------------------------------------------- * Intialize some stuff. *-----------------------------------------------------------------------*/ jj_counter = start_indexing; jj_counter_offd = start_indexing; if (debug_flag == 4) { wall_time = time_getWallclockSeconds() - wall_time; hypre_printf("Proc = %d Interp: Internal work 1 = %f\n", my_id, wall_time); fflush(NULL); } /*----------------------------------------------------------------------- * Send and receive fine_to_coarse info. *-----------------------------------------------------------------------*/ if (debug_flag == 4) { wall_time = time_getWallclockSeconds(); } //fine_to_coarse_offd = hypre_CTAlloc(HYPRE_Int, num_cols_A_offd, HYPRE_MEMORY_HOST); #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i,j,ns,ne,size,rest,coarse_shift) HYPRE_SMP_SCHEDULE #endif for (j = 0; j < num_threads; j++) { coarse_shift = 0; if (j > 0) { coarse_shift = coarse_counter[j - 1]; } size = n_fine / num_threads; rest = n_fine - size * num_threads; if (j < rest) { ns = j * size + j; ne = (j + 1) * size + j + 1; } else { ns = j * size + rest; ne = (j + 1) * size + rest; } for (i = ns; i < ne; i++) { fine_to_coarse[i] += coarse_shift; } //fine_to_coarse[i] += my_first_cpt+coarse_shift; } /*index = 0; for (i = 0; i < num_sends; i++) { start = hypre_ParCSRCommPkgSendMapStart(comm_pkg, i); for (j = start; j < hypre_ParCSRCommPkgSendMapStart(comm_pkg, i+1); j++) int_buf_data[index++] = fine_to_coarse[hypre_ParCSRCommPkgSendMapElmt(comm_pkg,j)]; } comm_handle = hypre_ParCSRCommHandleCreate( 11, comm_pkg, int_buf_data, fine_to_coarse_offd); hypre_ParCSRCommHandleDestroy(comm_handle); if (debug_flag==4) { wall_time = time_getWallclockSeconds() - wall_time; hypre_printf("Proc = %d Interp: Comm 4 FineToCoarse = %f\n", my_id, wall_time); fflush(NULL); }*/ if (debug_flag == 4) { wall_time = time_getWallclockSeconds(); } /*#ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i) HYPRE_SMP_SCHEDULE #endif for (i = 0; i < n_fine; i++) fine_to_coarse[i] -= my_first_cpt; */ /*----------------------------------------------------------------------- * Loop over fine grid points. *-----------------------------------------------------------------------*/ #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i,j,jl,i1,i2,jj,jj1,ns,ne,size,rest,sum,diagonal,distribute,P_marker,P_marker_offd,strong_f_marker,jj_counter,jj_counter_offd,sgn,c_num,jj_begin_row,jj_end_row,jj_begin_row_offd,jj_end_row_offd) HYPRE_SMP_SCHEDULE #endif for (jl = 0; jl < num_threads; jl++) { size = n_fine / num_threads; rest = n_fine - size * num_threads; if (jl < rest) { ns = jl * size + jl; ne = (jl + 1) * size + jl + 1; } else { ns = jl * size + rest; ne = (jl + 1) * size + rest; } jj_counter = 0; if (jl > 0) { jj_counter = jj_count[jl - 1]; } jj_counter_offd = 0; if (jl > 0) { jj_counter_offd = jj_count_offd[jl - 1]; } P_marker = hypre_CTAlloc(HYPRE_Int, n_fine, HYPRE_MEMORY_HOST); if (num_cols_A_offd) { P_marker_offd = hypre_CTAlloc(HYPRE_Int, num_cols_A_offd, HYPRE_MEMORY_HOST); } else { P_marker_offd = NULL; } for (i = 0; i < n_fine; i++) { P_marker[i] = -1; } for (i = 0; i < num_cols_A_offd; i++) { P_marker_offd[i] = -1; } strong_f_marker = -2; for (i = ns; i < ne; i++) { /*-------------------------------------------------------------------- * If i is a c-point, interpolation is the identity. *--------------------------------------------------------------------*/ if (CF_marker[i] >= 0) { P_diag_i[i] = jj_counter; P_diag_j[jj_counter] = fine_to_coarse[i]; P_diag_data[jj_counter] = one; jj_counter++; } /*-------------------------------------------------------------------- * If i is an F-point, build interpolation. *--------------------------------------------------------------------*/ else { /* Diagonal part of P */ P_diag_i[i] = jj_counter; jj_begin_row = jj_counter; for (jj = S_diag_i[i]; jj < S_diag_i[i + 1]; jj++) { i1 = S_diag_j[jj]; /*-------------------------------------------------------------- * If neighbor i1 is a C-point, set column number in P_diag_j * and initialize interpolation weight to zero. *--------------------------------------------------------------*/ if (CF_marker[i1] >= 0) { P_marker[i1] = jj_counter; P_diag_j[jj_counter] = fine_to_coarse[i1]; P_diag_data[jj_counter] = zero; jj_counter++; } /*-------------------------------------------------------------- * If neighbor i1 is an F-point, mark it as a strong F-point * whose connection needs to be distributed. *--------------------------------------------------------------*/ else if (CF_marker[i1] != -3) { P_marker[i1] = strong_f_marker; } } jj_end_row = jj_counter; /* Off-Diagonal part of P */ P_offd_i[i] = jj_counter_offd; jj_begin_row_offd = jj_counter_offd; if (num_procs > 1) { for (jj = S_offd_i[i]; jj < S_offd_i[i + 1]; jj++) { i1 = S_offd_j[jj]; /*----------------------------------------------------------- * If neighbor i1 is a C-point, set column number in P_offd_j * and initialize interpolation weight to zero. *-----------------------------------------------------------*/ if (CF_marker_offd[i1] >= 0) { P_marker_offd[i1] = jj_counter_offd; /*P_offd_j[jj_counter_offd] = fine_to_coarse_offd[i1];*/ P_offd_j[jj_counter_offd] = i1; P_offd_data[jj_counter_offd] = zero; jj_counter_offd++; } /*----------------------------------------------------------- * If neighbor i1 is an F-point, mark it as a strong F-point * whose connection needs to be distributed. *-----------------------------------------------------------*/ else if (CF_marker_offd[i1] != -3) { P_marker_offd[i1] = strong_f_marker; } } } jj_end_row_offd = jj_counter_offd; diagonal = A_diag_data[A_diag_i[i]]; /* Loop over ith row of A. First, the diagonal part of A */ for (jj = A_diag_i[i] + 1; jj < A_diag_i[i + 1]; jj++) { i1 = A_diag_j[jj]; /*-------------------------------------------------------------- * Case 1: neighbor i1 is a C-point and strongly influences i, * accumulate a_{i,i1} into the interpolation weight. *--------------------------------------------------------------*/ if (P_marker[i1] >= jj_begin_row) { P_diag_data[P_marker[i1]] += A_diag_data[jj]; } /*-------------------------------------------------------------- * Case 2: neighbor i1 is an F-point and strongly influences i, * distribute a_{i,i1} to C-points that strongly infuence i. * Note: currently no distribution to the diagonal in this case. *--------------------------------------------------------------*/ else if (P_marker[i1] == strong_f_marker) { sum = zero; /*----------------------------------------------------------- * Loop over row of A for point i1 and calculate the sum * of the connections to c-points that strongly influence i. *-----------------------------------------------------------*/ sgn = 1; if (A_diag_data[A_diag_i[i1]] < 0) { sgn = -1; } /* Diagonal block part of row i1 */ for (jj1 = A_diag_i[i1]; jj1 < A_diag_i[i1 + 1]; jj1++) { i2 = A_diag_j[jj1]; if (P_marker[i2] >= jj_begin_row && (sgn * A_diag_data[jj1]) < 0) { sum += A_diag_data[jj1]; } } /* Off-Diagonal block part of row i1 */ if (num_procs > 1) { for (jj1 = A_offd_i[i1]; jj1 < A_offd_i[i1 + 1]; jj1++) { i2 = A_offd_j[jj1]; if (P_marker_offd[i2] >= jj_begin_row_offd && (sgn * A_offd_data[jj1]) < 0) { sum += A_offd_data[jj1]; } } } if (sum != 0) { distribute = A_diag_data[jj] / sum; /*----------------------------------------------------------- * Loop over row of A for point i1 and do the distribution. *-----------------------------------------------------------*/ /* Diagonal block part of row i1 */ for (jj1 = A_diag_i[i1]; jj1 < A_diag_i[i1 + 1]; jj1++) { i2 = A_diag_j[jj1]; if (P_marker[i2] >= jj_begin_row && (sgn * A_diag_data[jj1]) < 0) { P_diag_data[P_marker[i2]] += distribute * A_diag_data[jj1]; } } /* Off-Diagonal block part of row i1 */ if (num_procs > 1) { for (jj1 = A_offd_i[i1]; jj1 < A_offd_i[i1 + 1]; jj1++) { i2 = A_offd_j[jj1]; if (P_marker_offd[i2] >= jj_begin_row_offd && (sgn * A_offd_data[jj1]) < 0) { P_offd_data[P_marker_offd[i2]] += distribute * A_offd_data[jj1]; } } } } else { if (num_functions == 1 || dof_func[i] == dof_func[i1]) { diagonal += A_diag_data[jj]; } } } /*-------------------------------------------------------------- * Case 3: neighbor i1 weakly influences i, accumulate a_{i,i1} * into the diagonal. *--------------------------------------------------------------*/ else if (CF_marker[i1] != -3) { if (num_functions == 1 || dof_func[i] == dof_func[i1]) { diagonal += A_diag_data[jj]; } } } /*---------------------------------------------------------------- * Still looping over ith row of A. Next, loop over the * off-diagonal part of A *---------------------------------------------------------------*/ if (num_procs > 1) { for (jj = A_offd_i[i]; jj < A_offd_i[i + 1]; jj++) { i1 = A_offd_j[jj]; /*-------------------------------------------------------------- * Case 1: neighbor i1 is a C-point and strongly influences i, * accumulate a_{i,i1} into the interpolation weight. *--------------------------------------------------------------*/ if (P_marker_offd[i1] >= jj_begin_row_offd) { P_offd_data[P_marker_offd[i1]] += A_offd_data[jj]; } /*------------------------------------------------------------ * Case 2: neighbor i1 is an F-point and strongly influences i, * distribute a_{i,i1} to C-points that strongly infuence i. * Note: currently no distribution to the diagonal in this case. *-----------------------------------------------------------*/ else if (P_marker_offd[i1] == strong_f_marker) { sum = zero; /*--------------------------------------------------------- * Loop over row of A_ext for point i1 and calculate the sum * of the connections to c-points that strongly influence i. *---------------------------------------------------------*/ /* find row number */ c_num = A_offd_j[jj]; sgn = 1; if (A_ext_data[A_ext_i[c_num]] < 0) { sgn = -1; } for (jj1 = A_ext_i[c_num]; jj1 < A_ext_i[c_num + 1]; jj1++) { i2 = (HYPRE_Int)A_ext_j[jj1]; if (i2 > -1) { /* in the diagonal block */ if (P_marker[i2] >= jj_begin_row && (sgn * A_ext_data[jj1]) < 0) { sum += A_ext_data[jj1]; } } else { /* in the off_diagonal block */ if (P_marker_offd[-i2 - 1] >= jj_begin_row_offd && (sgn * A_ext_data[jj1]) < 0) { sum += A_ext_data[jj1]; } } } if (sum != 0) { distribute = A_offd_data[jj] / sum; /*--------------------------------------------------------- * Loop over row of A_ext for point i1 and do * the distribution. *--------------------------------------------------------*/ /* Diagonal block part of row i1 */ for (jj1 = A_ext_i[c_num]; jj1 < A_ext_i[c_num + 1]; jj1++) { i2 = (HYPRE_Int)A_ext_j[jj1]; if (i2 > -1) /* in the diagonal block */ { if (P_marker[i2] >= jj_begin_row && (sgn * A_ext_data[jj1]) < 0) { P_diag_data[P_marker[i2]] += distribute * A_ext_data[jj1]; } } else { /* in the off_diagonal block */ if (P_marker_offd[-i2 - 1] >= jj_begin_row_offd && (sgn * A_ext_data[jj1]) < 0) P_offd_data[P_marker_offd[-i2 - 1]] += distribute * A_ext_data[jj1]; } } } else { if (num_functions == 1 || dof_func[i] == dof_func_offd[i1]) { diagonal += A_offd_data[jj]; } } } /*----------------------------------------------------------- * Case 3: neighbor i1 weakly influences i, accumulate a_{i,i1} * into the diagonal. *-----------------------------------------------------------*/ else if (CF_marker_offd[i1] != -3) { if (num_functions == 1 || dof_func[i] == dof_func_offd[i1]) { diagonal += A_offd_data[jj]; } } } } /*----------------------------------------------------------------- * Set interpolation weight by dividing by the diagonal. *-----------------------------------------------------------------*/ if (diagonal == 0.0) { if (print_level) { hypre_printf(" Warning! zero diagonal! Proc id %d row %d\n", my_id, i); } for (jj = jj_begin_row; jj < jj_end_row; jj++) { P_diag_data[jj] = 0.0; } for (jj = jj_begin_row_offd; jj < jj_end_row_offd; jj++) { P_offd_data[jj] = 0.0; } } else { for (jj = jj_begin_row; jj < jj_end_row; jj++) { P_diag_data[jj] /= -diagonal; } for (jj = jj_begin_row_offd; jj < jj_end_row_offd; jj++) { P_offd_data[jj] /= -diagonal; } } } strong_f_marker--; P_offd_i[i + 1] = jj_counter_offd; } hypre_TFree(P_marker, HYPRE_MEMORY_HOST); hypre_TFree(P_marker_offd, HYPRE_MEMORY_HOST); } P = hypre_ParCSRMatrixCreate(comm, hypre_ParCSRMatrixGlobalNumRows(A), total_global_cpts, hypre_ParCSRMatrixColStarts(A), num_cpts_global, 0, P_diag_i[n_fine], P_offd_i[n_fine]); P_diag = hypre_ParCSRMatrixDiag(P); hypre_CSRMatrixData(P_diag) = P_diag_data; hypre_CSRMatrixI(P_diag) = P_diag_i; hypre_CSRMatrixJ(P_diag) = P_diag_j; P_offd = hypre_ParCSRMatrixOffd(P); hypre_CSRMatrixData(P_offd) = P_offd_data; hypre_CSRMatrixI(P_offd) = P_offd_i; hypre_CSRMatrixJ(P_offd) = P_offd_j; /* Compress P, removing coefficients smaller than trunc_factor * Max */ if (trunc_factor != 0.0 || max_elmts > 0) { hypre_BoomerAMGInterpTruncation(P, trunc_factor, max_elmts); P_diag_data = hypre_CSRMatrixData(P_diag); P_diag_i = hypre_CSRMatrixI(P_diag); P_diag_j = hypre_CSRMatrixJ(P_diag); P_offd_data = hypre_CSRMatrixData(P_offd); P_offd_i = hypre_CSRMatrixI(P_offd); P_offd_j = hypre_CSRMatrixJ(P_offd); P_diag_size = P_diag_i[n_fine]; P_offd_size = P_offd_i[n_fine]; } num_cols_P_offd = 0; if (P_offd_size) { P_marker = hypre_CTAlloc(HYPRE_Int, num_cols_A_offd, HYPRE_MEMORY_HOST); #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i) HYPRE_SMP_SCHEDULE #endif for (i = 0; i < num_cols_A_offd; i++) { P_marker[i] = 0; } num_cols_P_offd = 0; for (i = 0; i < P_offd_size; i++) { index = P_offd_j[i]; if (!P_marker[index]) { num_cols_P_offd++; P_marker[index] = 1; } } col_map_offd_P = hypre_CTAlloc(HYPRE_BigInt, num_cols_P_offd, HYPRE_MEMORY_HOST); tmp_map_offd = hypre_CTAlloc(HYPRE_Int, num_cols_P_offd, HYPRE_MEMORY_HOST); index = 0; for (i = 0; i < num_cols_P_offd; i++) { while (P_marker[index] == 0) { index++; } tmp_map_offd[i] = index++; } #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i) HYPRE_SMP_SCHEDULE #endif for (i = 0; i < P_offd_size; i++) P_offd_j[i] = hypre_BinarySearch(tmp_map_offd, P_offd_j[i], num_cols_P_offd); hypre_TFree(P_marker, HYPRE_MEMORY_HOST); } for (i = 0; i < n_fine; i++) { if (CF_marker[i] == -3) { CF_marker[i] = -1; } } if (num_cols_P_offd) { hypre_ParCSRMatrixColMapOffd(P) = col_map_offd_P; hypre_CSRMatrixNumCols(P_offd) = num_cols_P_offd; } hypre_GetCommPkgRTFromCommPkgA(P, A, fine_to_coarse, tmp_map_offd); *P_ptr = P; hypre_TFree(tmp_map_offd, HYPRE_MEMORY_HOST); hypre_TFree(CF_marker_offd, HYPRE_MEMORY_HOST); hypre_TFree(dof_func_offd, HYPRE_MEMORY_HOST); hypre_TFree(int_buf_data, HYPRE_MEMORY_HOST); hypre_TFree(fine_to_coarse, HYPRE_MEMORY_HOST); //hypre_TFree(fine_to_coarse_offd, HYPRE_MEMORY_HOST); hypre_TFree(coarse_counter, HYPRE_MEMORY_HOST); hypre_TFree(jj_count, HYPRE_MEMORY_HOST); hypre_TFree(jj_count_offd, HYPRE_MEMORY_HOST); hypre_CSRMatrixDestroy(A_ext); return hypre_error_flag; } /*--------------------------------------------------------------------------- * hypre_BoomerAMGBuildInterpHE * interpolation routine for hyperbolic PDEs * treats weak fine connections like strong fine connections *--------------------------------------------------------------------------*/ HYPRE_Int hypre_BoomerAMGBuildInterpHE( hypre_ParCSRMatrix *A, HYPRE_Int *CF_marker, hypre_ParCSRMatrix *S, HYPRE_BigInt *num_cpts_global, HYPRE_Int num_functions, HYPRE_Int *dof_func, HYPRE_Int debug_flag, HYPRE_Real trunc_factor, HYPRE_Int max_elmts, hypre_ParCSRMatrix **P_ptr) { MPI_Comm comm = hypre_ParCSRMatrixComm(A); hypre_ParCSRCommPkg *comm_pkg = hypre_ParCSRMatrixCommPkg(A); hypre_ParCSRCommHandle *comm_handle; hypre_CSRMatrix *A_diag = hypre_ParCSRMatrixDiag(A); HYPRE_Real *A_diag_data = hypre_CSRMatrixData(A_diag); HYPRE_Int *A_diag_i = hypre_CSRMatrixI(A_diag); HYPRE_Int *A_diag_j = hypre_CSRMatrixJ(A_diag); hypre_CSRMatrix *A_offd = hypre_ParCSRMatrixOffd(A); HYPRE_Real *A_offd_data = hypre_CSRMatrixData(A_offd); HYPRE_Int *A_offd_i = hypre_CSRMatrixI(A_offd); HYPRE_Int *A_offd_j = hypre_CSRMatrixJ(A_offd); HYPRE_Int num_cols_A_offd = hypre_CSRMatrixNumCols(A_offd); HYPRE_BigInt *col_map_offd = hypre_ParCSRMatrixColMapOffd(A); hypre_CSRMatrix *S_diag = hypre_ParCSRMatrixDiag(S); HYPRE_Int *S_diag_i = hypre_CSRMatrixI(S_diag); HYPRE_Int *S_diag_j = hypre_CSRMatrixJ(S_diag); hypre_CSRMatrix *S_offd = hypre_ParCSRMatrixOffd(S); HYPRE_Int *S_offd_i = hypre_CSRMatrixI(S_offd); HYPRE_Int *S_offd_j = hypre_CSRMatrixJ(S_offd); hypre_ParCSRMatrix *P; HYPRE_BigInt *col_map_offd_P; HYPRE_Int *tmp_map_offd = NULL; HYPRE_Int *CF_marker_offd = NULL; HYPRE_Int *dof_func_offd = NULL; hypre_CSRMatrix *A_ext = NULL; HYPRE_Real *A_ext_data = NULL; HYPRE_Int *A_ext_i = NULL; HYPRE_BigInt *A_ext_j = NULL; hypre_CSRMatrix *P_diag; hypre_CSRMatrix *P_offd; HYPRE_Real *P_diag_data; HYPRE_Int *P_diag_i; HYPRE_Int *P_diag_j; HYPRE_Real *P_offd_data; HYPRE_Int *P_offd_i; HYPRE_Int *P_offd_j; HYPRE_Int P_diag_size, P_offd_size; HYPRE_Int *P_marker, *P_marker_offd; HYPRE_Int jj_counter, jj_counter_offd; HYPRE_Int *jj_count, *jj_count_offd; HYPRE_Int jj_begin_row, jj_begin_row_offd; HYPRE_Int jj_end_row, jj_end_row_offd; HYPRE_Int start_indexing = 0; /* start indexing for P_data at 0 */ HYPRE_Int n_fine = hypre_CSRMatrixNumRows(A_diag); HYPRE_Int *fine_to_coarse; //HYPRE_Int *fine_to_coarse_offd; HYPRE_Int *coarse_counter; HYPRE_Int coarse_shift; HYPRE_BigInt total_global_cpts; //HYPRE_BigInt my_first_cpt; HYPRE_Int num_cols_P_offd; HYPRE_Int i, i1, i2; HYPRE_Int j, jl, jj, jj1; HYPRE_Int kc; HYPRE_BigInt big_k; HYPRE_Int start; HYPRE_Int sgn; HYPRE_Int c_num; HYPRE_Real diagonal; HYPRE_Real sum; HYPRE_Real distribute; HYPRE_Real zero = 0.0; HYPRE_Real one = 1.0; HYPRE_Int my_id; HYPRE_Int num_procs; HYPRE_Int num_threads; HYPRE_Int num_sends; HYPRE_Int index; HYPRE_Int ns, ne, size, rest; HYPRE_Int *int_buf_data; HYPRE_BigInt col_1 = hypre_ParCSRMatrixFirstRowIndex(A); HYPRE_Int local_numrows = hypre_CSRMatrixNumRows(A_diag); HYPRE_BigInt col_n = col_1 + local_numrows; HYPRE_Real wall_time = 0.0; /* for debugging instrumentation */ hypre_MPI_Comm_size(comm, &num_procs); hypre_MPI_Comm_rank(comm, &my_id); num_threads = hypre_NumThreads(); //my_first_cpt = num_cpts_global[0]; if (my_id == (num_procs - 1)) { total_global_cpts = num_cpts_global[1]; } hypre_MPI_Bcast(&total_global_cpts, 1, HYPRE_MPI_BIG_INT, num_procs - 1, comm); /*------------------------------------------------------------------- * Get the CF_marker data for the off-processor columns *-------------------------------------------------------------------*/ if (debug_flag == 4) { wall_time = time_getWallclockSeconds(); } if (num_cols_A_offd) { CF_marker_offd = hypre_CTAlloc(HYPRE_Int, num_cols_A_offd, HYPRE_MEMORY_HOST); } if (num_functions > 1 && num_cols_A_offd) { dof_func_offd = hypre_CTAlloc(HYPRE_Int, num_cols_A_offd, HYPRE_MEMORY_HOST); } if (!comm_pkg) { hypre_MatvecCommPkgCreate(A); comm_pkg = hypre_ParCSRMatrixCommPkg(A); } num_sends = hypre_ParCSRCommPkgNumSends(comm_pkg); int_buf_data = hypre_CTAlloc(HYPRE_Int, hypre_ParCSRCommPkgSendMapStart(comm_pkg, num_sends), HYPRE_MEMORY_HOST); index = 0; for (i = 0; i < num_sends; i++) { start = hypre_ParCSRCommPkgSendMapStart(comm_pkg, i); for (j = start; j < hypre_ParCSRCommPkgSendMapStart(comm_pkg, i + 1); j++) int_buf_data[index++] = CF_marker[hypre_ParCSRCommPkgSendMapElmt(comm_pkg, j)]; } comm_handle = hypre_ParCSRCommHandleCreate( 11, comm_pkg, int_buf_data, CF_marker_offd); hypre_ParCSRCommHandleDestroy(comm_handle); if (num_functions > 1) { index = 0; for (i = 0; i < num_sends; i++) { start = hypre_ParCSRCommPkgSendMapStart(comm_pkg, i); for (j = start; j < hypre_ParCSRCommPkgSendMapStart(comm_pkg, i + 1); j++) int_buf_data[index++] = dof_func[hypre_ParCSRCommPkgSendMapElmt(comm_pkg, j)]; } comm_handle = hypre_ParCSRCommHandleCreate( 11, comm_pkg, int_buf_data, dof_func_offd); hypre_ParCSRCommHandleDestroy(comm_handle); } if (debug_flag == 4) { wall_time = time_getWallclockSeconds() - wall_time; hypre_printf("Proc = %d Interp: Comm 1 CF_marker = %f\n", my_id, wall_time); fflush(NULL); } /*---------------------------------------------------------------------- * Get the ghost rows of A *---------------------------------------------------------------------*/ if (debug_flag == 4) { wall_time = time_getWallclockSeconds(); } if (num_procs > 1) { A_ext = hypre_ParCSRMatrixExtractBExt(A, A, 1); A_ext_i = hypre_CSRMatrixI(A_ext); A_ext_j = hypre_CSRMatrixBigJ(A_ext); A_ext_data = hypre_CSRMatrixData(A_ext); } index = 0; for (i = 0; i < num_cols_A_offd; i++) { for (j = A_ext_i[i]; j < A_ext_i[i + 1]; j++) { big_k = A_ext_j[j]; if (big_k >= col_1 && big_k < col_n) { A_ext_j[index] = big_k - col_1; A_ext_data[index++] = A_ext_data[j]; } else { kc = hypre_BigBinarySearch(col_map_offd, big_k, num_cols_A_offd); if (kc > -1) { A_ext_j[index] = (HYPRE_BigInt)(-kc - 1); A_ext_data[index++] = A_ext_data[j]; } } } A_ext_i[i] = index; } for (i = num_cols_A_offd; i > 0; i--) { A_ext_i[i] = A_ext_i[i - 1]; } if (num_procs > 1) { A_ext_i[0] = 0; } if (debug_flag == 4) { wall_time = time_getWallclockSeconds() - wall_time; hypre_printf("Proc = %d Interp: Comm 2 Get A_ext = %f\n", my_id, wall_time); fflush(NULL); } /*----------------------------------------------------------------------- * First Pass: Determine size of P and fill in fine_to_coarse mapping. *-----------------------------------------------------------------------*/ /*----------------------------------------------------------------------- * Intialize counters and allocate mapping vector. *-----------------------------------------------------------------------*/ coarse_counter = hypre_CTAlloc(HYPRE_Int, num_threads, HYPRE_MEMORY_HOST); jj_count = hypre_CTAlloc(HYPRE_Int, num_threads, HYPRE_MEMORY_HOST); jj_count_offd = hypre_CTAlloc(HYPRE_Int, num_threads, HYPRE_MEMORY_HOST); fine_to_coarse = hypre_CTAlloc(HYPRE_Int, n_fine, HYPRE_MEMORY_HOST); #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i) HYPRE_SMP_SCHEDULE #endif for (i = 0; i < n_fine; i++) { fine_to_coarse[i] = -1; } jj_counter = start_indexing; jj_counter_offd = start_indexing; /*----------------------------------------------------------------------- * Loop over fine grid. *-----------------------------------------------------------------------*/ /* RDF: this looks a little tricky, but doable */ #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i,j,i1,jj,ns,ne,size,rest) HYPRE_SMP_SCHEDULE #endif for (j = 0; j < num_threads; j++) { size = n_fine / num_threads; rest = n_fine - size * num_threads; if (j < rest) { ns = j * size + j; ne = (j + 1) * size + j + 1; } else { ns = j * size + rest; ne = (j + 1) * size + rest; } for (i = ns; i < ne; i++) { /*-------------------------------------------------------------------- * If i is a C-point, interpolation is the identity. Also set up * mapping vector. *--------------------------------------------------------------------*/ if (CF_marker[i] >= 0) { jj_count[j]++; fine_to_coarse[i] = coarse_counter[j]; coarse_counter[j]++; } /*-------------------------------------------------------------------- * If i is an F-point, interpolation is from the C-points that * strongly influence i. *--------------------------------------------------------------------*/ else { for (jj = S_diag_i[i]; jj < S_diag_i[i + 1]; jj++) { i1 = S_diag_j[jj]; if (CF_marker[i1] >= 0) { jj_count[j]++; } } if (num_procs > 1) { for (jj = S_offd_i[i]; jj < S_offd_i[i + 1]; jj++) { i1 = S_offd_j[jj]; if (CF_marker_offd[i1] >= 0) { jj_count_offd[j]++; } } } } } } /*----------------------------------------------------------------------- * Allocate arrays. *-----------------------------------------------------------------------*/ for (i = 0; i < num_threads - 1; i++) { coarse_counter[i + 1] += coarse_counter[i]; jj_count[i + 1] += jj_count[i]; jj_count_offd[i + 1] += jj_count_offd[i]; } i = num_threads - 1; jj_counter = jj_count[i]; jj_counter_offd = jj_count_offd[i]; P_diag_size = jj_counter; P_diag_i = hypre_CTAlloc(HYPRE_Int, n_fine + 1, HYPRE_MEMORY_HOST); P_diag_j = hypre_CTAlloc(HYPRE_Int, P_diag_size, HYPRE_MEMORY_HOST); P_diag_data = hypre_CTAlloc(HYPRE_Real, P_diag_size, HYPRE_MEMORY_HOST); P_diag_i[n_fine] = jj_counter; P_offd_size = jj_counter_offd; P_offd_i = hypre_CTAlloc(HYPRE_Int, n_fine + 1, HYPRE_MEMORY_HOST); P_offd_j = hypre_CTAlloc(HYPRE_Int, P_offd_size, HYPRE_MEMORY_HOST); P_offd_data = hypre_CTAlloc(HYPRE_Real, P_offd_size, HYPRE_MEMORY_HOST); /*----------------------------------------------------------------------- * Intialize some stuff. *-----------------------------------------------------------------------*/ jj_counter = start_indexing; jj_counter_offd = start_indexing; if (debug_flag == 4) { wall_time = time_getWallclockSeconds() - wall_time; hypre_printf("Proc = %d Interp: Internal work 1 = %f\n", my_id, wall_time); fflush(NULL); } /*----------------------------------------------------------------------- * Send and receive fine_to_coarse info. *-----------------------------------------------------------------------*/ if (debug_flag == 4) { wall_time = time_getWallclockSeconds(); } //fine_to_coarse_offd = hypre_CTAlloc(HYPRE_Int, num_cols_A_offd, HYPRE_MEMORY_HOST); #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i,j,ns,ne,size,rest,coarse_shift) HYPRE_SMP_SCHEDULE #endif for (j = 0; j < num_threads; j++) { coarse_shift = 0; if (j > 0) { coarse_shift = coarse_counter[j - 1]; } size = n_fine / num_threads; rest = n_fine - size * num_threads; if (j < rest) { ns = j * size + j; ne = (j + 1) * size + j + 1; } else { ns = j * size + rest; ne = (j + 1) * size + rest; } for (i = ns; i < ne; i++) { fine_to_coarse[i] += coarse_shift; } } /*index = 0; for (i = 0; i < num_sends; i++) { start = hypre_ParCSRCommPkgSendMapStart(comm_pkg, i); for (j = start; j < hypre_ParCSRCommPkgSendMapStart(comm_pkg, i+1); j++) int_buf_data[index++] = fine_to_coarse[hypre_ParCSRCommPkgSendMapElmt(comm_pkg,j)]; } comm_handle = hypre_ParCSRCommHandleCreate( 11, comm_pkg, int_buf_data, fine_to_coarse_offd); hypre_ParCSRCommHandleDestroy(comm_handle); if (debug_flag==4) { wall_time = time_getWallclockSeconds() - wall_time; hypre_printf("Proc = %d Interp: Comm 4 FineToCoarse = %f\n", my_id, wall_time); fflush(NULL); }*/ if (debug_flag == 4) { wall_time = time_getWallclockSeconds(); } /*#ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i) HYPRE_SMP_SCHEDULE #endif for (i = 0; i < n_fine; i++) fine_to_coarse[i] -= my_first_cpt;*/ /*----------------------------------------------------------------------- * Loop over fine grid points. *-----------------------------------------------------------------------*/ #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i,j,jl,i1,i2,jj,jj1,ns,ne,size,rest,sum,diagonal,distribute,P_marker,P_marker_offd,jj_counter,jj_counter_offd,sgn,c_num,jj_begin_row,jj_end_row,jj_begin_row_offd,jj_end_row_offd) HYPRE_SMP_SCHEDULE #endif for (jl = 0; jl < num_threads; jl++) { size = n_fine / num_threads; rest = n_fine - size * num_threads; if (jl < rest) { ns = jl * size + jl; ne = (jl + 1) * size + jl + 1; } else { ns = jl * size + rest; ne = (jl + 1) * size + rest; } jj_counter = 0; if (jl > 0) { jj_counter = jj_count[jl - 1]; } jj_counter_offd = 0; if (jl > 0) { jj_counter_offd = jj_count_offd[jl - 1]; } P_marker = hypre_CTAlloc(HYPRE_Int, n_fine, HYPRE_MEMORY_HOST); if (num_cols_A_offd) { P_marker_offd = hypre_CTAlloc(HYPRE_Int, num_cols_A_offd, HYPRE_MEMORY_HOST); } else { P_marker_offd = NULL; } for (i = 0; i < n_fine; i++) { P_marker[i] = -1; } for (i = 0; i < num_cols_A_offd; i++) { P_marker_offd[i] = -1; } for (i = ns; i < ne; i++) { /*-------------------------------------------------------------------- * If i is a c-point, interpolation is the identity. *--------------------------------------------------------------------*/ if (CF_marker[i] >= 0) { P_diag_i[i] = jj_counter; P_diag_j[jj_counter] = fine_to_coarse[i]; P_diag_data[jj_counter] = one; jj_counter++; } /*-------------------------------------------------------------------- * If i is an F-point, build interpolation. *--------------------------------------------------------------------*/ else { /* Diagonal part of P */ P_diag_i[i] = jj_counter; jj_begin_row = jj_counter; for (jj = S_diag_i[i]; jj < S_diag_i[i + 1]; jj++) { i1 = S_diag_j[jj]; /*-------------------------------------------------------------- * If neighbor i1 is a C-point, set column number in P_diag_j * and initialize interpolation weight to zero. *--------------------------------------------------------------*/ if (CF_marker[i1] >= 0) { P_marker[i1] = jj_counter; P_diag_j[jj_counter] = fine_to_coarse[i1]; P_diag_data[jj_counter] = zero; jj_counter++; } } jj_end_row = jj_counter; /* Off-Diagonal part of P */ P_offd_i[i] = jj_counter_offd; jj_begin_row_offd = jj_counter_offd; if (num_procs > 1) { for (jj = S_offd_i[i]; jj < S_offd_i[i + 1]; jj++) { i1 = S_offd_j[jj]; /*----------------------------------------------------------- * If neighbor i1 is a C-point, set column number in P_offd_j * and initialize interpolation weight to zero. *-----------------------------------------------------------*/ if (CF_marker_offd[i1] >= 0) { P_marker_offd[i1] = jj_counter_offd; P_offd_j[jj_counter_offd] = i1; P_offd_data[jj_counter_offd] = zero; jj_counter_offd++; } } } jj_end_row_offd = jj_counter_offd; diagonal = A_diag_data[A_diag_i[i]]; /* Loop over ith row of A. First, the diagonal part of A */ for (jj = A_diag_i[i] + 1; jj < A_diag_i[i + 1]; jj++) { i1 = A_diag_j[jj]; /*-------------------------------------------------------------- * Case 1: neighbor i1 is a C-point and strongly influences i, * accumulate a_{i,i1} into the interpolation weight. *--------------------------------------------------------------*/ if (P_marker[i1] >= jj_begin_row) { P_diag_data[P_marker[i1]] += A_diag_data[jj]; } /*-------------------------------------------------------------- * Case 2: neighbor i1 is an F-point and influences i, * distribute a_{i,i1} to C-points that strongly influence i. * Note: currently no distribution to the diagonal in this case. *--------------------------------------------------------------*/ else { sum = zero; /*----------------------------------------------------------- * Loop over row of A for point i1 and calculate the sum * of the connections to c-points that strongly influence i. *-----------------------------------------------------------*/ sgn = 1; if (A_diag_data[A_diag_i[i1]] < 0) { sgn = -1; } /* Diagonal block part of row i1 */ for (jj1 = A_diag_i[i1]; jj1 < A_diag_i[i1 + 1]; jj1++) { i2 = A_diag_j[jj1]; if (P_marker[i2] >= jj_begin_row && (sgn * A_diag_data[jj1]) < 0) { sum += A_diag_data[jj1]; } } /* Off-Diagonal block part of row i1 */ if (num_procs > 1) { for (jj1 = A_offd_i[i1]; jj1 < A_offd_i[i1 + 1]; jj1++) { i2 = A_offd_j[jj1]; if (P_marker_offd[i2] >= jj_begin_row_offd && (sgn * A_offd_data[jj1]) < 0) { sum += A_offd_data[jj1]; } } } if (sum != 0) { distribute = A_diag_data[jj] / sum; /*----------------------------------------------------------- * Loop over row of A for point i1 and do the distribution. *-----------------------------------------------------------*/ /* Diagonal block part of row i1 */ for (jj1 = A_diag_i[i1]; jj1 < A_diag_i[i1 + 1]; jj1++) { i2 = A_diag_j[jj1]; if (P_marker[i2] >= jj_begin_row && (sgn * A_diag_data[jj1]) < 0) { P_diag_data[P_marker[i2]] += distribute * A_diag_data[jj1]; } } /* Off-Diagonal block part of row i1 */ if (num_procs > 1) { for (jj1 = A_offd_i[i1]; jj1 < A_offd_i[i1 + 1]; jj1++) { i2 = A_offd_j[jj1]; if (P_marker_offd[i2] >= jj_begin_row_offd && (sgn * A_offd_data[jj1]) < 0) { P_offd_data[P_marker_offd[i2]] += distribute * A_offd_data[jj1]; } } } } else { if (num_functions == 1 || dof_func[i] == dof_func[i1]) { diagonal += A_diag_data[jj]; } } } } /*---------------------------------------------------------------- * Still looping over ith row of A. Next, loop over the * off-diagonal part of A *---------------------------------------------------------------*/ if (num_procs > 1) { for (jj = A_offd_i[i]; jj < A_offd_i[i + 1]; jj++) { i1 = A_offd_j[jj]; /*-------------------------------------------------------------- * Case 1: neighbor i1 is a C-point and strongly influences i, * accumulate a_{i,i1} into the interpolation weight. *--------------------------------------------------------------*/ if (P_marker_offd[i1] >= jj_begin_row_offd) { P_offd_data[P_marker_offd[i1]] += A_offd_data[jj]; } /*------------------------------------------------------------ * Case 2: neighbor i1 is an F-point and influences i, * distribute a_{i,i1} to C-points that strongly infuence i. * Note: currently no distribution to the diagonal in this case. *-----------------------------------------------------------*/ else { sum = zero; /*--------------------------------------------------------- * Loop over row of A_ext for point i1 and calculate the sum * of the connections to c-points that strongly influence i. *---------------------------------------------------------*/ /* find row number */ c_num = A_offd_j[jj]; sgn = 1; if (A_ext_data[A_ext_i[c_num]] < 0) { sgn = -1; } for (jj1 = A_ext_i[c_num]; jj1 < A_ext_i[c_num + 1]; jj1++) { i2 = (HYPRE_Int)A_ext_j[jj1]; if (i2 > -1) { /* in the diagonal block */ if (P_marker[i2] >= jj_begin_row && (sgn * A_ext_data[jj1]) < 0) { sum += A_ext_data[jj1]; } } else { /* in the off_diagonal block */ if (P_marker_offd[-i2 - 1] >= jj_begin_row_offd && (sgn * A_ext_data[jj1]) < 0) { sum += A_ext_data[jj1]; } } } if (sum != 0) { distribute = A_offd_data[jj] / sum; /*--------------------------------------------------------- * Loop over row of A_ext for point i1 and do * the distribution. *--------------------------------------------------------*/ /* Diagonal block part of row i1 */ for (jj1 = A_ext_i[c_num]; jj1 < A_ext_i[c_num + 1]; jj1++) { i2 = (HYPRE_Int)A_ext_j[jj1]; if (i2 > -1) /* in the diagonal block */ { if (P_marker[i2] >= jj_begin_row && (sgn * A_ext_data[jj1]) < 0) { P_diag_data[P_marker[i2]] += distribute * A_ext_data[jj1]; } } else { /* in the off_diagonal block */ if (P_marker_offd[-i2 - 1] >= jj_begin_row_offd && (sgn * A_ext_data[jj1]) < 0) P_offd_data[P_marker_offd[-i2 - 1]] += distribute * A_ext_data[jj1]; } } } else { if (num_functions == 1 || dof_func[i] == dof_func_offd[i1]) { diagonal += A_offd_data[jj]; } } } } } /*----------------------------------------------------------------- * Set interpolation weight by dividing by the diagonal. *-----------------------------------------------------------------*/ for (jj = jj_begin_row; jj < jj_end_row; jj++) { P_diag_data[jj] /= -diagonal; } for (jj = jj_begin_row_offd; jj < jj_end_row_offd; jj++) { P_offd_data[jj] /= -diagonal; } } P_offd_i[i + 1] = jj_counter_offd; } hypre_TFree(P_marker, HYPRE_MEMORY_HOST); hypre_TFree(P_marker_offd, HYPRE_MEMORY_HOST); } P = hypre_ParCSRMatrixCreate(comm, hypre_ParCSRMatrixGlobalNumRows(A), total_global_cpts, hypre_ParCSRMatrixColStarts(A), num_cpts_global, 0, P_diag_i[n_fine], P_offd_i[n_fine]); P_diag = hypre_ParCSRMatrixDiag(P); hypre_CSRMatrixData(P_diag) = P_diag_data; hypre_CSRMatrixI(P_diag) = P_diag_i; hypre_CSRMatrixJ(P_diag) = P_diag_j; P_offd = hypre_ParCSRMatrixOffd(P); hypre_CSRMatrixData(P_offd) = P_offd_data; hypre_CSRMatrixI(P_offd) = P_offd_i; hypre_CSRMatrixJ(P_offd) = P_offd_j; /* Compress P, removing coefficients smaller than trunc_factor * Max */ if (trunc_factor != 0.0 || max_elmts > 0) { hypre_BoomerAMGInterpTruncation(P, trunc_factor, max_elmts); P_diag_data = hypre_CSRMatrixData(P_diag); P_diag_i = hypre_CSRMatrixI(P_diag); P_diag_j = hypre_CSRMatrixJ(P_diag); P_offd_data = hypre_CSRMatrixData(P_offd); P_offd_i = hypre_CSRMatrixI(P_offd); P_offd_j = hypre_CSRMatrixJ(P_offd); P_diag_size = P_diag_i[n_fine]; P_offd_size = P_offd_i[n_fine]; } num_cols_P_offd = 0; if (P_offd_size) { P_marker = hypre_CTAlloc(HYPRE_Int, num_cols_A_offd, HYPRE_MEMORY_HOST); #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i) HYPRE_SMP_SCHEDULE #endif for (i = 0; i < num_cols_A_offd; i++) { P_marker[i] = 0; } num_cols_P_offd = 0; for (i = 0; i < P_offd_size; i++) { index = P_offd_j[i]; if (!P_marker[index]) { num_cols_P_offd++; P_marker[index] = 1; } } col_map_offd_P = hypre_CTAlloc(HYPRE_BigInt, num_cols_P_offd, HYPRE_MEMORY_HOST); tmp_map_offd = hypre_CTAlloc(HYPRE_Int, num_cols_P_offd, HYPRE_MEMORY_HOST); index = 0; for (i = 0; i < num_cols_P_offd; i++) { while (P_marker[index] == 0) { index++; } tmp_map_offd[i] = index++; } #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i) HYPRE_SMP_SCHEDULE #endif for (i = 0; i < P_offd_size; i++) P_offd_j[i] = hypre_BinarySearch(tmp_map_offd, P_offd_j[i], num_cols_P_offd); hypre_TFree(P_marker, HYPRE_MEMORY_HOST); } for (i = 0; i < n_fine; i++) if (CF_marker[i] == -3) { CF_marker[i] = -1; } if (num_cols_P_offd) { hypre_ParCSRMatrixColMapOffd(P) = col_map_offd_P; hypre_CSRMatrixNumCols(P_offd) = num_cols_P_offd; } hypre_GetCommPkgRTFromCommPkgA(P, A, fine_to_coarse, tmp_map_offd); *P_ptr = P; hypre_TFree(CF_marker_offd, HYPRE_MEMORY_HOST); hypre_TFree(dof_func_offd, HYPRE_MEMORY_HOST); hypre_TFree(int_buf_data, HYPRE_MEMORY_HOST); hypre_TFree(fine_to_coarse, HYPRE_MEMORY_HOST); hypre_TFree(tmp_map_offd, HYPRE_MEMORY_HOST); hypre_TFree(coarse_counter, HYPRE_MEMORY_HOST); hypre_TFree(jj_count, HYPRE_MEMORY_HOST); hypre_TFree(jj_count_offd, HYPRE_MEMORY_HOST); hypre_CSRMatrixDestroy(A_ext); return hypre_error_flag; } /*--------------------------------------------------------------------------- * hypre_BoomerAMGBuildDirInterp *--------------------------------------------------------------------------*/ HYPRE_Int hypre_BoomerAMGBuildDirInterpHost( hypre_ParCSRMatrix *A, HYPRE_Int *CF_marker, hypre_ParCSRMatrix *S, HYPRE_BigInt *num_cpts_global, HYPRE_Int num_functions, HYPRE_Int *dof_func, HYPRE_Int debug_flag, HYPRE_Real trunc_factor, HYPRE_Int max_elmts, hypre_ParCSRMatrix **P_ptr) { MPI_Comm comm = hypre_ParCSRMatrixComm(A); hypre_ParCSRCommPkg *comm_pkg = hypre_ParCSRMatrixCommPkg(A); hypre_ParCSRCommHandle *comm_handle; HYPRE_MemoryLocation memory_location_P = hypre_ParCSRMatrixMemoryLocation(A); hypre_CSRMatrix *A_diag = hypre_ParCSRMatrixDiag(A); HYPRE_Real *A_diag_data = hypre_CSRMatrixData(A_diag); HYPRE_Int *A_diag_i = hypre_CSRMatrixI(A_diag); HYPRE_Int *A_diag_j = hypre_CSRMatrixJ(A_diag); hypre_CSRMatrix *A_offd = hypre_ParCSRMatrixOffd(A); HYPRE_Real *A_offd_data = hypre_CSRMatrixData(A_offd); HYPRE_Int *A_offd_i = hypre_CSRMatrixI(A_offd); HYPRE_Int *A_offd_j = hypre_CSRMatrixJ(A_offd); HYPRE_Int num_cols_A_offd = hypre_CSRMatrixNumCols(A_offd); hypre_CSRMatrix *S_diag = hypre_ParCSRMatrixDiag(S); HYPRE_Int *S_diag_i = hypre_CSRMatrixI(S_diag); HYPRE_Int *S_diag_j = hypre_CSRMatrixJ(S_diag); hypre_CSRMatrix *S_offd = hypre_ParCSRMatrixOffd(S); HYPRE_Int *S_offd_i = hypre_CSRMatrixI(S_offd); HYPRE_Int *S_offd_j = hypre_CSRMatrixJ(S_offd); hypre_ParCSRMatrix *P; HYPRE_BigInt *col_map_offd_P; HYPRE_Int *tmp_map_offd = NULL; HYPRE_Int *CF_marker_offd = NULL; HYPRE_Int *dof_func_offd = NULL; hypre_CSRMatrix *P_diag; hypre_CSRMatrix *P_offd; HYPRE_Real *P_diag_data; HYPRE_Int *P_diag_i; HYPRE_Int *P_diag_j; HYPRE_Real *P_offd_data; HYPRE_Int *P_offd_i; HYPRE_Int *P_offd_j; HYPRE_Int P_diag_size, P_offd_size; HYPRE_Int jj_counter, jj_counter_offd; HYPRE_Int *jj_count, *jj_count_offd; HYPRE_Int jj_begin_row, jj_begin_row_offd; HYPRE_Int jj_end_row, jj_end_row_offd; HYPRE_Int start_indexing = 0; /* start indexing for P_data at 0 */ HYPRE_Int n_fine = hypre_CSRMatrixNumRows(A_diag); HYPRE_Int *fine_to_coarse; HYPRE_Int *coarse_counter; HYPRE_Int coarse_shift; HYPRE_BigInt total_global_cpts; HYPRE_Int num_cols_P_offd; //HYPRE_BigInt my_first_cpt; HYPRE_Int i, i1; HYPRE_Int j, jl, jj; HYPRE_Int start; HYPRE_Real diagonal; HYPRE_Real sum_N_pos, sum_P_pos; HYPRE_Real sum_N_neg, sum_P_neg; HYPRE_Real alfa = 1.0; HYPRE_Real beta = 1.0; HYPRE_Real zero = 0.0; HYPRE_Real one = 1.0; HYPRE_Int my_id; HYPRE_Int num_procs; HYPRE_Int num_threads; HYPRE_Int num_sends; HYPRE_Int index; HYPRE_Int ns, ne, size, rest; HYPRE_Int *int_buf_data; HYPRE_Real wall_time; /* for debugging instrumentation */ hypre_MPI_Comm_size(comm, &num_procs); hypre_MPI_Comm_rank(comm, &my_id); num_threads = hypre_NumThreads(); //my_first_cpt = num_cpts_global[0]; if (my_id == (num_procs - 1)) { total_global_cpts = num_cpts_global[1]; } hypre_MPI_Bcast(&total_global_cpts, 1, HYPRE_MPI_BIG_INT, num_procs - 1, comm); /*------------------------------------------------------------------- * Get the CF_marker data for the off-processor columns *-------------------------------------------------------------------*/ if (debug_flag == 4) { wall_time = time_getWallclockSeconds(); } if (num_cols_A_offd) { CF_marker_offd = hypre_CTAlloc(HYPRE_Int, num_cols_A_offd, HYPRE_MEMORY_HOST); } if (num_functions > 1 && num_cols_A_offd) { dof_func_offd = hypre_CTAlloc(HYPRE_Int, num_cols_A_offd, HYPRE_MEMORY_HOST); } if (!comm_pkg) { hypre_MatvecCommPkgCreate(A); comm_pkg = hypre_ParCSRMatrixCommPkg(A); } num_sends = hypre_ParCSRCommPkgNumSends(comm_pkg); int_buf_data = hypre_CTAlloc(HYPRE_Int, hypre_ParCSRCommPkgSendMapStart(comm_pkg, num_sends), HYPRE_MEMORY_HOST); index = 0; for (i = 0; i < num_sends; i++) { start = hypre_ParCSRCommPkgSendMapStart(comm_pkg, i); for (j = start; j < hypre_ParCSRCommPkgSendMapStart(comm_pkg, i + 1); j++) int_buf_data[index++] = CF_marker[hypre_ParCSRCommPkgSendMapElmt(comm_pkg, j)]; } comm_handle = hypre_ParCSRCommHandleCreate( 11, comm_pkg, int_buf_data, CF_marker_offd); hypre_ParCSRCommHandleDestroy(comm_handle); if (num_functions > 1) { index = 0; for (i = 0; i < num_sends; i++) { start = hypre_ParCSRCommPkgSendMapStart(comm_pkg, i); for (j = start; j < hypre_ParCSRCommPkgSendMapStart(comm_pkg, i + 1); j++) int_buf_data[index++] = dof_func[hypre_ParCSRCommPkgSendMapElmt(comm_pkg, j)]; } comm_handle = hypre_ParCSRCommHandleCreate( 11, comm_pkg, int_buf_data, dof_func_offd); hypre_ParCSRCommHandleDestroy(comm_handle); } if (debug_flag == 4) { wall_time = time_getWallclockSeconds() - wall_time; hypre_printf("Proc = %d Interp: Comm 1 CF_marker = %f\n", my_id, wall_time); fflush(NULL); } /*----------------------------------------------------------------------- * First Pass: Determine size of P and fill in fine_to_coarse mapping. *-----------------------------------------------------------------------*/ /*----------------------------------------------------------------------- * Intialize counters and allocate mapping vector. *-----------------------------------------------------------------------*/ coarse_counter = hypre_CTAlloc(HYPRE_Int, num_threads, HYPRE_MEMORY_HOST); jj_count = hypre_CTAlloc(HYPRE_Int, num_threads, HYPRE_MEMORY_HOST); jj_count_offd = hypre_CTAlloc(HYPRE_Int, num_threads, HYPRE_MEMORY_HOST); fine_to_coarse = hypre_CTAlloc(HYPRE_Int, n_fine, HYPRE_MEMORY_HOST); #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i) HYPRE_SMP_SCHEDULE #endif for (i = 0; i < n_fine; i++) { fine_to_coarse[i] = -1; } jj_counter = start_indexing; jj_counter_offd = start_indexing; /*----------------------------------------------------------------------- * Loop over fine grid. *-----------------------------------------------------------------------*/ /* RDF: this looks a little tricky, but doable */ #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i,j,i1,jj,ns,ne,size,rest) HYPRE_SMP_SCHEDULE #endif for (j = 0; j < num_threads; j++) { size = n_fine / num_threads; rest = n_fine - size * num_threads; if (j < rest) { ns = j * size + j; ne = (j + 1) * size + j + 1; } else { ns = j * size + rest; ne = (j + 1) * size + rest; } for (i = ns; i < ne; i++) { /*-------------------------------------------------------------------- * If i is a C-point, interpolation is the identity. Also set up * mapping vector. *--------------------------------------------------------------------*/ if (CF_marker[i] >= 0) { jj_count[j]++; fine_to_coarse[i] = coarse_counter[j]; coarse_counter[j]++; } /*-------------------------------------------------------------------- * If i is an F-point, interpolation is from the C-points that * strongly influence i. *--------------------------------------------------------------------*/ else { for (jj = S_diag_i[i]; jj < S_diag_i[i + 1]; jj++) { i1 = S_diag_j[jj]; if (CF_marker[i1] > 0) { jj_count[j]++; } } if (num_procs > 1) { for (jj = S_offd_i[i]; jj < S_offd_i[i + 1]; jj++) { i1 = S_offd_j[jj]; if (CF_marker_offd[i1] > 0) { jj_count_offd[j]++; } } } } } } /*----------------------------------------------------------------------- * Allocate arrays. *-----------------------------------------------------------------------*/ for (i = 0; i < num_threads - 1; i++) { coarse_counter[i + 1] += coarse_counter[i]; jj_count[i + 1] += jj_count[i]; jj_count_offd[i + 1] += jj_count_offd[i]; } i = num_threads - 1; jj_counter = jj_count[i]; jj_counter_offd = jj_count_offd[i]; P_diag_size = jj_counter; P_diag_i = hypre_CTAlloc(HYPRE_Int, n_fine + 1, memory_location_P); P_diag_j = hypre_CTAlloc(HYPRE_Int, P_diag_size, memory_location_P); P_diag_data = hypre_CTAlloc(HYPRE_Real, P_diag_size, memory_location_P); P_diag_i[n_fine] = jj_counter; P_offd_size = jj_counter_offd; P_offd_i = hypre_CTAlloc(HYPRE_Int, n_fine + 1, memory_location_P); P_offd_j = hypre_CTAlloc(HYPRE_Int, P_offd_size, memory_location_P); P_offd_data = hypre_CTAlloc(HYPRE_Real, P_offd_size, memory_location_P); /*----------------------------------------------------------------------- * Intialize some stuff. *-----------------------------------------------------------------------*/ jj_counter = start_indexing; jj_counter_offd = start_indexing; if (debug_flag == 4) { wall_time = time_getWallclockSeconds() - wall_time; hypre_printf("Proc = %d Interp: Internal work 1 = %f\n", my_id, wall_time); fflush(NULL); } /*----------------------------------------------------------------------- * Send and receive fine_to_coarse info. *-----------------------------------------------------------------------*/ if (debug_flag == 4) { wall_time = time_getWallclockSeconds(); } //fine_to_coarse_offd = hypre_CTAlloc(HYPRE_Int, num_cols_A_offd, HYPRE_MEMORY_HOST); #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i,j,ns,ne,size,rest,coarse_shift) HYPRE_SMP_SCHEDULE #endif for (j = 0; j < num_threads; j++) { coarse_shift = 0; if (j > 0) { coarse_shift = coarse_counter[j - 1]; } size = n_fine / num_threads; rest = n_fine - size * num_threads; if (j < rest) { ns = j * size + j; ne = (j + 1) * size + j + 1; } else { ns = j * size + rest; ne = (j + 1) * size + rest; } for (i = ns; i < ne; i++) { fine_to_coarse[i] += coarse_shift; } } /*index = 0; for (i = 0; i < num_sends; i++) { start = hypre_ParCSRCommPkgSendMapStart(comm_pkg, i); for (j = start; j < hypre_ParCSRCommPkgSendMapStart(comm_pkg, i+1); j++) int_buf_data[index++] = fine_to_coarse[hypre_ParCSRCommPkgSendMapElmt(comm_pkg,j)]; } comm_handle = hypre_ParCSRCommHandleCreate( 11, comm_pkg, int_buf_data, fine_to_coarse_offd); hypre_ParCSRCommHandleDestroy(comm_handle); if (debug_flag==4) { wall_time = time_getWallclockSeconds() - wall_time; hypre_printf("Proc = %d Interp: Comm 4 FineToCoarse = %f\n", my_id, wall_time); fflush(NULL); }*/ if (debug_flag == 4) { wall_time = time_getWallclockSeconds(); } /*#ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i) HYPRE_SMP_SCHEDULE #endif for (i = 0; i < n_fine; i++) fine_to_coarse[i] -= my_first_cpt;*/ /*----------------------------------------------------------------------- * Loop over fine grid points. *-----------------------------------------------------------------------*/ #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i,j,jl,i1,jj,ns,ne,size,rest,diagonal,jj_counter,jj_counter_offd,jj_begin_row,jj_end_row,jj_begin_row_offd,jj_end_row_offd,sum_P_pos,sum_P_neg,sum_N_pos,sum_N_neg,alfa,beta) HYPRE_SMP_SCHEDULE #endif for (jl = 0; jl < num_threads; jl++) { HYPRE_Int *P_marker, *P_marker_offd; alfa = 1.0; beta = 1.0; size = n_fine / num_threads; rest = n_fine - size * num_threads; if (jl < rest) { ns = jl * size + jl; ne = (jl + 1) * size + jl + 1; } else { ns = jl * size + rest; ne = (jl + 1) * size + rest; } jj_counter = 0; if (jl > 0) { jj_counter = jj_count[jl - 1]; } jj_counter_offd = 0; if (jl > 0) { jj_counter_offd = jj_count_offd[jl - 1]; } P_marker = hypre_CTAlloc(HYPRE_Int, n_fine, HYPRE_MEMORY_HOST); if (num_cols_A_offd) { P_marker_offd = hypre_CTAlloc(HYPRE_Int, num_cols_A_offd, HYPRE_MEMORY_HOST); } else { P_marker_offd = NULL; } for (i = 0; i < n_fine; i++) { P_marker[i] = -1; } for (i = 0; i < num_cols_A_offd; i++) { P_marker_offd[i] = -1; } for (i = ns; i < ne; i++) { /*-------------------------------------------------------------------- * If i is a c-point, interpolation is the identity. *--------------------------------------------------------------------*/ if (CF_marker[i] >= 0) { P_diag_i[i] = jj_counter; P_diag_j[jj_counter] = fine_to_coarse[i]; P_diag_data[jj_counter] = one; jj_counter++; } /*-------------------------------------------------------------------- * If i is an F-point, build interpolation. *--------------------------------------------------------------------*/ else { /* Diagonal part of P */ P_diag_i[i] = jj_counter; jj_begin_row = jj_counter; for (jj = S_diag_i[i]; jj < S_diag_i[i + 1]; jj++) { i1 = S_diag_j[jj]; /*-------------------------------------------------------------- * If neighbor i1 is a C-point, set column number in P_diag_j * and initialize interpolation weight to zero. *--------------------------------------------------------------*/ if (CF_marker[i1] >= 0) { P_marker[i1] = jj_counter; P_diag_j[jj_counter] = fine_to_coarse[i1]; P_diag_data[jj_counter] = zero; jj_counter++; } } jj_end_row = jj_counter; /* Off-Diagonal part of P */ P_offd_i[i] = jj_counter_offd; jj_begin_row_offd = jj_counter_offd; if (num_procs > 1) { for (jj = S_offd_i[i]; jj < S_offd_i[i + 1]; jj++) { i1 = S_offd_j[jj]; /*----------------------------------------------------------- * If neighbor i1 is a C-point, set column number in P_offd_j * and initialize interpolation weight to zero. *-----------------------------------------------------------*/ if (CF_marker_offd[i1] >= 0) { P_marker_offd[i1] = jj_counter_offd; P_offd_j[jj_counter_offd] = i1; P_offd_data[jj_counter_offd] = zero; jj_counter_offd++; } } } jj_end_row_offd = jj_counter_offd; diagonal = A_diag_data[A_diag_i[i]]; /* Loop over ith row of A. First, the diagonal part of A */ sum_N_pos = 0; sum_N_neg = 0; sum_P_pos = 0; sum_P_neg = 0; for (jj = A_diag_i[i] + 1; jj < A_diag_i[i + 1]; jj++) { i1 = A_diag_j[jj]; if (num_functions == 1 || dof_func[i1] == dof_func[i]) { if (A_diag_data[jj] > 0) { sum_N_pos += A_diag_data[jj]; } else { sum_N_neg += A_diag_data[jj]; } } /*-------------------------------------------------------------- * Case 1: neighbor i1 is a C-point and strongly influences i, * accumulate a_{i,i1} into the interpolation weight. *--------------------------------------------------------------*/ if (P_marker[i1] >= jj_begin_row) { P_diag_data[P_marker[i1]] += A_diag_data[jj]; if (A_diag_data[jj] > 0) { sum_P_pos += A_diag_data[jj]; } else { sum_P_neg += A_diag_data[jj]; } } } /*---------------------------------------------------------------- * Still looping over ith row of A. Next, loop over the * off-diagonal part of A *---------------------------------------------------------------*/ if (num_procs > 1) { for (jj = A_offd_i[i]; jj < A_offd_i[i + 1]; jj++) { i1 = A_offd_j[jj]; if (num_functions == 1 || dof_func_offd[i1] == dof_func[i]) { if (A_offd_data[jj] > 0) { sum_N_pos += A_offd_data[jj]; } else { sum_N_neg += A_offd_data[jj]; } } /*-------------------------------------------------------------- * Case 1: neighbor i1 is a C-point and strongly influences i, * accumulate a_{i,i1} into the interpolation weight. *--------------------------------------------------------------*/ if (P_marker_offd[i1] >= jj_begin_row_offd) { P_offd_data[P_marker_offd[i1]] += A_offd_data[jj]; if (A_offd_data[jj] > 0) { sum_P_pos += A_offd_data[jj]; } else { sum_P_neg += A_offd_data[jj]; } } } } if (sum_P_neg) { alfa = sum_N_neg / sum_P_neg / diagonal; } if (sum_P_pos) { beta = sum_N_pos / sum_P_pos / diagonal; } /*----------------------------------------------------------------- * Set interpolation weight by dividing by the diagonal. *-----------------------------------------------------------------*/ for (jj = jj_begin_row; jj < jj_end_row; jj++) { if (P_diag_data[jj] > 0) { P_diag_data[jj] *= -beta; } else { P_diag_data[jj] *= -alfa; } } for (jj = jj_begin_row_offd; jj < jj_end_row_offd; jj++) { if (P_offd_data[jj] > 0) { P_offd_data[jj] *= -beta; } else { P_offd_data[jj] *= -alfa; } } } P_offd_i[i + 1] = jj_counter_offd; } hypre_TFree(P_marker, HYPRE_MEMORY_HOST); hypre_TFree(P_marker_offd, HYPRE_MEMORY_HOST); } P = hypre_ParCSRMatrixCreate(comm, hypre_ParCSRMatrixGlobalNumRows(A), total_global_cpts, hypre_ParCSRMatrixColStarts(A), num_cpts_global, 0, P_diag_i[n_fine], P_offd_i[n_fine]); P_diag = hypre_ParCSRMatrixDiag(P); hypre_CSRMatrixData(P_diag) = P_diag_data; hypre_CSRMatrixI(P_diag) = P_diag_i; hypre_CSRMatrixJ(P_diag) = P_diag_j; P_offd = hypre_ParCSRMatrixOffd(P); hypre_CSRMatrixData(P_offd) = P_offd_data; hypre_CSRMatrixI(P_offd) = P_offd_i; hypre_CSRMatrixJ(P_offd) = P_offd_j; /* Compress P, removing coefficients smaller than trunc_factor * Max */ if (trunc_factor != 0.0 || max_elmts > 0) { hypre_BoomerAMGInterpTruncation(P, trunc_factor, max_elmts); P_diag_data = hypre_CSRMatrixData(P_diag); P_diag_i = hypre_CSRMatrixI(P_diag); P_diag_j = hypre_CSRMatrixJ(P_diag); P_offd_data = hypre_CSRMatrixData(P_offd); P_offd_i = hypre_CSRMatrixI(P_offd); P_offd_j = hypre_CSRMatrixJ(P_offd); P_diag_size = P_diag_i[n_fine]; P_offd_size = P_offd_i[n_fine]; } num_cols_P_offd = 0; if (P_offd_size) { HYPRE_Int *P_marker = hypre_CTAlloc(HYPRE_Int, num_cols_A_offd, HYPRE_MEMORY_HOST); #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i) HYPRE_SMP_SCHEDULE #endif for (i = 0; i < num_cols_A_offd; i++) { P_marker[i] = 0; } num_cols_P_offd = 0; for (i = 0; i < P_offd_size; i++) { index = P_offd_j[i]; if (!P_marker[index]) { num_cols_P_offd++; P_marker[index] = 1; } } col_map_offd_P = hypre_CTAlloc(HYPRE_BigInt, num_cols_P_offd, HYPRE_MEMORY_HOST); tmp_map_offd = hypre_CTAlloc(HYPRE_Int, num_cols_P_offd, HYPRE_MEMORY_HOST); index = 0; for (i = 0; i < num_cols_P_offd; i++) { while (P_marker[index] == 0) { index++; } tmp_map_offd[i] = index++; } #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i) HYPRE_SMP_SCHEDULE #endif for (i = 0; i < P_offd_size; i++) { P_offd_j[i] = hypre_BinarySearch(tmp_map_offd, P_offd_j[i], num_cols_P_offd); } hypre_TFree(P_marker, HYPRE_MEMORY_HOST); } for (i = 0; i < n_fine; i++) if (CF_marker[i] == -3) { CF_marker[i] = -1; } if (num_cols_P_offd) { hypre_ParCSRMatrixColMapOffd(P) = col_map_offd_P; hypre_CSRMatrixNumCols(P_offd) = num_cols_P_offd; } hypre_GetCommPkgRTFromCommPkgA(P, A, fine_to_coarse, tmp_map_offd); *P_ptr = P; hypre_TFree(CF_marker_offd, HYPRE_MEMORY_HOST); hypre_TFree(dof_func_offd, HYPRE_MEMORY_HOST); hypre_TFree(int_buf_data, HYPRE_MEMORY_HOST); hypre_TFree(fine_to_coarse, HYPRE_MEMORY_HOST); hypre_TFree(tmp_map_offd, HYPRE_MEMORY_HOST); hypre_TFree(coarse_counter, HYPRE_MEMORY_HOST); hypre_TFree(jj_count, HYPRE_MEMORY_HOST); hypre_TFree(jj_count_offd, HYPRE_MEMORY_HOST); return hypre_error_flag; } HYPRE_Int hypre_BoomerAMGBuildDirInterp( hypre_ParCSRMatrix *A, HYPRE_Int *CF_marker, hypre_ParCSRMatrix *S, HYPRE_BigInt *num_cpts_global, HYPRE_Int num_functions, HYPRE_Int *dof_func, HYPRE_Int debug_flag, HYPRE_Real trunc_factor, HYPRE_Int max_elmts, HYPRE_Int interp_type, hypre_ParCSRMatrix **P_ptr) { HYPRE_UNUSED_VAR(interp_type); hypre_GpuProfilingPushRange("DirInterp"); #if defined(HYPRE_USING_GPU) HYPRE_ExecutionPolicy exec = hypre_GetExecPolicy1( hypre_ParCSRMatrixMemoryLocation(A) ); if (exec == HYPRE_EXEC_DEVICE) { hypre_BoomerAMGBuildDirInterpDevice(A, CF_marker, S, num_cpts_global, num_functions, dof_func, debug_flag, trunc_factor, max_elmts, interp_type, P_ptr); } else #endif { hypre_BoomerAMGBuildDirInterpHost(A, CF_marker, S, num_cpts_global, num_functions, dof_func, debug_flag, trunc_factor, max_elmts, P_ptr); } hypre_GpuProfilingPopRange(); return hypre_error_flag; } /*------------------------------------------------ * Drop entries in interpolation matrix P * max_elmts == 0 means no limit on rownnz *------------------------------------------------*/ HYPRE_Int hypre_BoomerAMGInterpTruncation( hypre_ParCSRMatrix *P, HYPRE_Real trunc_factor, HYPRE_Int max_elmts) { if (trunc_factor <= 0.0 && max_elmts == 0) { return hypre_error_flag; } #if defined(HYPRE_USING_GPU) HYPRE_ExecutionPolicy exec = hypre_GetExecPolicy1( hypre_ParCSRMatrixMemoryLocation(P) ); if (exec == HYPRE_EXEC_DEVICE) { return hypre_BoomerAMGInterpTruncationDevice(P, trunc_factor, max_elmts); } else #endif { HYPRE_Int rescale = 1; // rescale P HYPRE_Int nrm_type = 0; // Use infty-norm of row to perform treshold dropping return hypre_ParCSRMatrixTruncate(P, trunc_factor, max_elmts, rescale, nrm_type); } } /*--------------------------------------------------------------------------- * hypre_BoomerAMGBuildInterpModUnk - this is a modified interpolation for the unknown approach. * here we need to pass in a strength matrix built on the entire matrix. * *--------------------------------------------------------------------------*/ HYPRE_Int hypre_BoomerAMGBuildInterpModUnk( hypre_ParCSRMatrix *A, HYPRE_Int *CF_marker, hypre_ParCSRMatrix *S, HYPRE_BigInt *num_cpts_global, HYPRE_Int num_functions, HYPRE_Int *dof_func, HYPRE_Int debug_flag, HYPRE_Real trunc_factor, HYPRE_Int max_elmts, hypre_ParCSRMatrix **P_ptr) { MPI_Comm comm = hypre_ParCSRMatrixComm(A); hypre_ParCSRCommPkg *comm_pkg = hypre_ParCSRMatrixCommPkg(A); hypre_ParCSRCommHandle *comm_handle; hypre_CSRMatrix *A_diag = hypre_ParCSRMatrixDiag(A); HYPRE_Real *A_diag_data = hypre_CSRMatrixData(A_diag); HYPRE_Int *A_diag_i = hypre_CSRMatrixI(A_diag); HYPRE_Int *A_diag_j = hypre_CSRMatrixJ(A_diag); hypre_CSRMatrix *A_offd = hypre_ParCSRMatrixOffd(A); HYPRE_Real *A_offd_data = hypre_CSRMatrixData(A_offd); HYPRE_Int *A_offd_i = hypre_CSRMatrixI(A_offd); HYPRE_Int *A_offd_j = hypre_CSRMatrixJ(A_offd); HYPRE_Int num_cols_A_offd = hypre_CSRMatrixNumCols(A_offd); HYPRE_BigInt *col_map_offd = hypre_ParCSRMatrixColMapOffd(A); hypre_CSRMatrix *S_diag = hypre_ParCSRMatrixDiag(S); HYPRE_Int *S_diag_i = hypre_CSRMatrixI(S_diag); HYPRE_Int *S_diag_j = hypre_CSRMatrixJ(S_diag); hypre_CSRMatrix *S_offd = hypre_ParCSRMatrixOffd(S); HYPRE_Int *S_offd_i = hypre_CSRMatrixI(S_offd); HYPRE_Int *S_offd_j = hypre_CSRMatrixJ(S_offd); hypre_ParCSRMatrix *P; HYPRE_BigInt *col_map_offd_P; HYPRE_Int *tmp_map_offd = NULL; HYPRE_Int *CF_marker_offd = NULL; HYPRE_Int *dof_func_offd = NULL; hypre_CSRMatrix *A_ext = NULL; HYPRE_Real *A_ext_data = NULL; HYPRE_Int *A_ext_i = NULL; HYPRE_BigInt *A_ext_j = NULL; hypre_CSRMatrix *P_diag; hypre_CSRMatrix *P_offd; HYPRE_Real *P_diag_data; HYPRE_Int *P_diag_i; HYPRE_Int *P_diag_j; HYPRE_Real *P_offd_data; HYPRE_Int *P_offd_i; HYPRE_Int *P_offd_j; HYPRE_Int P_diag_size, P_offd_size; HYPRE_Int *P_marker, *P_marker_offd; HYPRE_Int jj_counter, jj_counter_offd; HYPRE_Int *jj_count, *jj_count_offd; HYPRE_Int jj_begin_row, jj_begin_row_offd; HYPRE_Int jj_end_row, jj_end_row_offd; HYPRE_Int start_indexing = 0; /* start indexing for P_data at 0 */ HYPRE_Int n_fine = hypre_CSRMatrixNumRows(A_diag); HYPRE_Int strong_f_marker; HYPRE_Int *fine_to_coarse; //HYPRE_Int *fine_to_coarse_offd; HYPRE_Int *coarse_counter; HYPRE_Int coarse_shift; HYPRE_BigInt total_global_cpts; HYPRE_Int num_cols_P_offd; //HYPRE_BigInt my_first_cpt; HYPRE_Int i, i1, i2; HYPRE_Int j, jl, jj, jj1; HYPRE_Int kc; HYPRE_BigInt big_k; HYPRE_Int start; HYPRE_Int sgn; HYPRE_Int c_num; HYPRE_Real diagonal; HYPRE_Real sum; HYPRE_Real distribute; HYPRE_Real zero = 0.0; HYPRE_Real one = 1.0; HYPRE_Int my_id; HYPRE_Int num_procs; HYPRE_Int num_threads; HYPRE_Int num_sends; HYPRE_Int index; HYPRE_Int ns, ne, size, rest; HYPRE_Int print_level = 0; HYPRE_Int *int_buf_data; HYPRE_BigInt col_1 = hypre_ParCSRMatrixFirstRowIndex(A); HYPRE_Int local_numrows = hypre_CSRMatrixNumRows(A_diag); HYPRE_BigInt col_n = col_1 + local_numrows; HYPRE_Real wall_time = 0.0; /* for debugging instrumentation */ hypre_MPI_Comm_size(comm, &num_procs); hypre_MPI_Comm_rank(comm, &my_id); num_threads = hypre_NumThreads(); //my_first_cpt = num_cpts_global[0]; if (my_id == (num_procs - 1)) { total_global_cpts = num_cpts_global[1]; } hypre_MPI_Bcast(&total_global_cpts, 1, HYPRE_MPI_BIG_INT, num_procs - 1, comm); /*------------------------------------------------------------------- * Get the CF_marker data for the off-processor columns *-------------------------------------------------------------------*/ if (debug_flag < 0) { debug_flag = -debug_flag; print_level = 1; } if (debug_flag == 4) { wall_time = time_getWallclockSeconds(); } if (num_cols_A_offd) { CF_marker_offd = hypre_CTAlloc(HYPRE_Int, num_cols_A_offd, HYPRE_MEMORY_HOST); } if (num_functions > 1 && num_cols_A_offd) { dof_func_offd = hypre_CTAlloc(HYPRE_Int, num_cols_A_offd, HYPRE_MEMORY_HOST); } if (!comm_pkg) { hypre_MatvecCommPkgCreate(A); comm_pkg = hypre_ParCSRMatrixCommPkg(A); } num_sends = hypre_ParCSRCommPkgNumSends(comm_pkg); int_buf_data = hypre_CTAlloc(HYPRE_Int, hypre_ParCSRCommPkgSendMapStart(comm_pkg, num_sends), HYPRE_MEMORY_HOST); index = 0; for (i = 0; i < num_sends; i++) { start = hypre_ParCSRCommPkgSendMapStart(comm_pkg, i); for (j = start; j < hypre_ParCSRCommPkgSendMapStart(comm_pkg, i + 1); j++) int_buf_data[index++] = CF_marker[hypre_ParCSRCommPkgSendMapElmt(comm_pkg, j)]; } comm_handle = hypre_ParCSRCommHandleCreate( 11, comm_pkg, int_buf_data, CF_marker_offd); hypre_ParCSRCommHandleDestroy(comm_handle); if (num_functions > 1) { index = 0; for (i = 0; i < num_sends; i++) { start = hypre_ParCSRCommPkgSendMapStart(comm_pkg, i); for (j = start; j < hypre_ParCSRCommPkgSendMapStart(comm_pkg, i + 1); j++) int_buf_data[index++] = dof_func[hypre_ParCSRCommPkgSendMapElmt(comm_pkg, j)]; } comm_handle = hypre_ParCSRCommHandleCreate( 11, comm_pkg, int_buf_data, dof_func_offd); hypre_ParCSRCommHandleDestroy(comm_handle); } if (debug_flag == 4) { wall_time = time_getWallclockSeconds() - wall_time; hypre_printf("Proc = %d Interp: Comm 1 CF_marker = %f\n", my_id, wall_time); fflush(NULL); } /*---------------------------------------------------------------------- * Get the ghost rows of A *---------------------------------------------------------------------*/ if (debug_flag == 4) { wall_time = time_getWallclockSeconds(); } if (num_procs > 1) { A_ext = hypre_ParCSRMatrixExtractBExt(A, A, 1); A_ext_i = hypre_CSRMatrixI(A_ext); A_ext_j = hypre_CSRMatrixBigJ(A_ext); A_ext_data = hypre_CSRMatrixData(A_ext); } index = 0; for (i = 0; i < num_cols_A_offd; i++) { for (j = A_ext_i[i]; j < A_ext_i[i + 1]; j++) { big_k = A_ext_j[j]; if (big_k >= col_1 && big_k < col_n) { A_ext_j[index] = big_k - col_1; A_ext_data[index++] = A_ext_data[j]; } else { kc = hypre_BigBinarySearch(col_map_offd, big_k, num_cols_A_offd); if (kc > -1) { A_ext_j[index] = (HYPRE_BigInt)(-kc - 1); A_ext_data[index++] = A_ext_data[j]; } } } A_ext_i[i] = index; } for (i = num_cols_A_offd; i > 0; i--) { A_ext_i[i] = A_ext_i[i - 1]; } if (num_procs > 1) { A_ext_i[0] = 0; } if (debug_flag == 4) { wall_time = time_getWallclockSeconds() - wall_time; hypre_printf("Proc = %d Interp: Comm 2 Get A_ext = %f\n", my_id, wall_time); fflush(NULL); } /*----------------------------------------------------------------------- * First Pass: Determine size of P and fill in fine_to_coarse mapping. *-----------------------------------------------------------------------*/ /*----------------------------------------------------------------------- * Intialize counters and allocate mapping vector. *-----------------------------------------------------------------------*/ coarse_counter = hypre_CTAlloc(HYPRE_Int, num_threads, HYPRE_MEMORY_HOST); jj_count = hypre_CTAlloc(HYPRE_Int, num_threads, HYPRE_MEMORY_HOST); jj_count_offd = hypre_CTAlloc(HYPRE_Int, num_threads, HYPRE_MEMORY_HOST); fine_to_coarse = hypre_CTAlloc(HYPRE_Int, n_fine, HYPRE_MEMORY_HOST); #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i) HYPRE_SMP_SCHEDULE #endif for (i = 0; i < n_fine; i++) { fine_to_coarse[i] = -1; } jj_counter = start_indexing; jj_counter_offd = start_indexing; /*----------------------------------------------------------------------- * Loop over fine grid. *-----------------------------------------------------------------------*/ /* RDF: this looks a little tricky, but doable */ #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i,j,i1,jj,ns,ne,size,rest) HYPRE_SMP_SCHEDULE #endif for (j = 0; j < num_threads; j++) { size = n_fine / num_threads; rest = n_fine - size * num_threads; if (j < rest) { ns = j * size + j; ne = (j + 1) * size + j + 1; } else { ns = j * size + rest; ne = (j + 1) * size + rest; } for (i = ns; i < ne; i++) { /*-------------------------------------------------------------------- * If i is a C-point, interpolation is the identity. Also set up * mapping vector. *--------------------------------------------------------------------*/ if (CF_marker[i] >= 0) { jj_count[j]++; fine_to_coarse[i] = coarse_counter[j]; coarse_counter[j]++; } /*-------------------------------------------------------------------- * If i is an F-point, interpolation is from the C-points that * strongly influence i. *--------------------------------------------------------------------*/ else { for (jj = S_diag_i[i]; jj < S_diag_i[i + 1]; jj++) { i1 = S_diag_j[jj]; if (CF_marker[i1] >= 0) { jj_count[j]++; } } if (num_procs > 1) { for (jj = S_offd_i[i]; jj < S_offd_i[i + 1]; jj++) { i1 = S_offd_j[jj]; if (CF_marker_offd[i1] >= 0) { jj_count_offd[j]++; } } } } } } /*----------------------------------------------------------------------- * Allocate arrays. *-----------------------------------------------------------------------*/ for (i = 0; i < num_threads - 1; i++) { coarse_counter[i + 1] += coarse_counter[i]; jj_count[i + 1] += jj_count[i]; jj_count_offd[i + 1] += jj_count_offd[i]; } i = num_threads - 1; jj_counter = jj_count[i]; jj_counter_offd = jj_count_offd[i]; P_diag_size = jj_counter; P_diag_i = hypre_CTAlloc(HYPRE_Int, n_fine + 1, HYPRE_MEMORY_HOST); P_diag_j = hypre_CTAlloc(HYPRE_Int, P_diag_size, HYPRE_MEMORY_HOST); P_diag_data = hypre_CTAlloc(HYPRE_Real, P_diag_size, HYPRE_MEMORY_HOST); P_diag_i[n_fine] = jj_counter; P_offd_size = jj_counter_offd; P_offd_i = hypre_CTAlloc(HYPRE_Int, n_fine + 1, HYPRE_MEMORY_HOST); P_offd_j = hypre_CTAlloc(HYPRE_Int, P_offd_size, HYPRE_MEMORY_HOST); P_offd_data = hypre_CTAlloc(HYPRE_Real, P_offd_size, HYPRE_MEMORY_HOST); /*----------------------------------------------------------------------- * Intialize some stuff. *-----------------------------------------------------------------------*/ jj_counter = start_indexing; jj_counter_offd = start_indexing; if (debug_flag == 4) { wall_time = time_getWallclockSeconds() - wall_time; hypre_printf("Proc = %d Interp: Internal work 1 = %f\n", my_id, wall_time); fflush(NULL); } /*----------------------------------------------------------------------- * Send and receive fine_to_coarse info. *-----------------------------------------------------------------------*/ if (debug_flag == 4) { wall_time = time_getWallclockSeconds(); } //fine_to_coarse_offd = hypre_CTAlloc(HYPRE_Int, num_cols_A_offd, HYPRE_MEMORY_HOST); #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i,j,ns,ne,size,rest,coarse_shift) HYPRE_SMP_SCHEDULE #endif for (j = 0; j < num_threads; j++) { coarse_shift = 0; if (j > 0) { coarse_shift = coarse_counter[j - 1]; } size = n_fine / num_threads; rest = n_fine - size * num_threads; if (j < rest) { ns = j * size + j; ne = (j + 1) * size + j + 1; } else { ns = j * size + rest; ne = (j + 1) * size + rest; } for (i = ns; i < ne; i++) { fine_to_coarse[i] += coarse_shift; } } /*index = 0; for (i = 0; i < num_sends; i++) { start = hypre_ParCSRCommPkgSendMapStart(comm_pkg, i); for (j = start; j < hypre_ParCSRCommPkgSendMapStart(comm_pkg, i+1); j++) int_buf_data[index++] = fine_to_coarse[hypre_ParCSRCommPkgSendMapElmt(comm_pkg,j)]; } comm_handle = hypre_ParCSRCommHandleCreate( 11, comm_pkg, int_buf_data, fine_to_coarse_offd); hypre_ParCSRCommHandleDestroy(comm_handle); if (debug_flag==4) { wall_time = time_getWallclockSeconds() - wall_time; hypre_printf("Proc = %d Interp: Comm 4 FineToCoarse = %f\n", my_id, wall_time); fflush(NULL); }*/ if (debug_flag == 4) { wall_time = time_getWallclockSeconds(); } /*#ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i) HYPRE_SMP_SCHEDULE #endif for (i = 0; i < n_fine; i++) fine_to_coarse[i] -= my_first_cpt;*/ /*----------------------------------------------------------------------- * Loop over fine grid points. *-----------------------------------------------------------------------*/ #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i,j,jl,i1,i2,jj,jj1,ns,ne,size,rest,sum,diagonal,distribute,P_marker,P_marker_offd,strong_f_marker,jj_counter,jj_counter_offd,sgn,c_num,jj_begin_row,jj_end_row,jj_begin_row_offd,jj_end_row_offd) HYPRE_SMP_SCHEDULE #endif for (jl = 0; jl < num_threads; jl++) { size = n_fine / num_threads; rest = n_fine - size * num_threads; if (jl < rest) { ns = jl * size + jl; ne = (jl + 1) * size + jl + 1; } else { ns = jl * size + rest; ne = (jl + 1) * size + rest; } jj_counter = 0; if (jl > 0) { jj_counter = jj_count[jl - 1]; } jj_counter_offd = 0; if (jl > 0) { jj_counter_offd = jj_count_offd[jl - 1]; } P_marker = hypre_CTAlloc(HYPRE_Int, n_fine, HYPRE_MEMORY_HOST); if (num_cols_A_offd) { P_marker_offd = hypre_CTAlloc(HYPRE_Int, num_cols_A_offd, HYPRE_MEMORY_HOST); } else { P_marker_offd = NULL; } for (i = 0; i < n_fine; i++) { P_marker[i] = -1; } for (i = 0; i < num_cols_A_offd; i++) { P_marker_offd[i] = -1; } strong_f_marker = -2; for (i = ns; i < ne; i++) { /*-------------------------------------------------------------------- * If i is a c-point, interpolation is the identity. *--------------------------------------------------------------------*/ if (CF_marker[i] >= 0) { P_diag_i[i] = jj_counter; P_diag_j[jj_counter] = fine_to_coarse[i]; P_diag_data[jj_counter] = one; jj_counter++; } /*-------------------------------------------------------------------- * If i is an F-point, build interpolation. *--------------------------------------------------------------------*/ else { /* Diagonal part of P */ P_diag_i[i] = jj_counter; jj_begin_row = jj_counter; for (jj = S_diag_i[i]; jj < S_diag_i[i + 1]; jj++) { i1 = S_diag_j[jj]; /*-------------------------------------------------------------- * If neighbor i1 is a C-point, set column number in P_diag_j * and initialize interpolation weight to zero. *--------------------------------------------------------------*/ if (CF_marker[i1] >= 0) { P_marker[i1] = jj_counter; P_diag_j[jj_counter] = fine_to_coarse[i1]; P_diag_data[jj_counter] = zero; jj_counter++; } /*-------------------------------------------------------------- * If neighbor i1 is an F-point, mark it as a strong F-point * whose connection needs to be distributed. *--------------------------------------------------------------*/ else if (CF_marker[i1] != -3) { P_marker[i1] = strong_f_marker; } } jj_end_row = jj_counter; /* Off-Diagonal part of P */ P_offd_i[i] = jj_counter_offd; jj_begin_row_offd = jj_counter_offd; if (num_procs > 1) { for (jj = S_offd_i[i]; jj < S_offd_i[i + 1]; jj++) { i1 = S_offd_j[jj]; /*----------------------------------------------------------- * If neighbor i1 is a C-point, set column number in P_offd_j * and initialize interpolation weight to zero. *-----------------------------------------------------------*/ if (CF_marker_offd[i1] >= 0) { P_marker_offd[i1] = jj_counter_offd; /*P_offd_j[jj_counter_offd] = fine_to_coarse_offd[i1];*/ P_offd_j[jj_counter_offd] = i1; P_offd_data[jj_counter_offd] = zero; jj_counter_offd++; } /*----------------------------------------------------------- * If neighbor i1 is an F-point, mark it as a strong F-point * whose connection needs to be distributed. *-----------------------------------------------------------*/ else if (CF_marker_offd[i1] != -3) { P_marker_offd[i1] = strong_f_marker; } } } jj_end_row_offd = jj_counter_offd; diagonal = A_diag_data[A_diag_i[i]]; /* Loop over ith row of A. First, the diagonal part of A */ for (jj = A_diag_i[i] + 1; jj < A_diag_i[i + 1]; jj++) { i1 = A_diag_j[jj]; /*-------------------------------------------------------------- * Case 1: neighbor i1 is a C-point and strongly influences i, * accumulate a_{i,i1} into the interpolation weight. *--------------------------------------------------------------*/ if (P_marker[i1] >= jj_begin_row) { P_diag_data[P_marker[i1]] += A_diag_data[jj]; } /*-------------------------------------------------------------- * Case 2: neighbor i1 is an F-point and strongly influences i, * distribute a_{i,i1} to C-points that strongly infuence i. * Note: currently no distribution to the diagonal in this case. HERE, we only want to distribut to points of the SAME function type *--------------------------------------------------------------*/ else if (P_marker[i1] == strong_f_marker) { sum = zero; /*----------------------------------------------------------- * Loop over row of A for point i1 and calculate the sum * of the connections to c-points that strongly influence i. *-----------------------------------------------------------*/ sgn = 1; if (A_diag_data[A_diag_i[i1]] < 0) { sgn = -1; } /* Diagonal block part of row i1 */ for (jj1 = A_diag_i[i1]; jj1 < A_diag_i[i1 + 1]; jj1++) { i2 = A_diag_j[jj1]; if (num_functions == 1 || dof_func[i1] == dof_func[i2]) { if (P_marker[i2] >= jj_begin_row && (sgn * A_diag_data[jj1]) < 0 ) { sum += A_diag_data[jj1]; } } } /* Off-Diagonal block part of row i1 */ if (num_procs > 1) { for (jj1 = A_offd_i[i1]; jj1 < A_offd_i[i1 + 1]; jj1++) { i2 = A_offd_j[jj1]; if (num_functions == 1 || dof_func[i1] == dof_func[i2]) { if (P_marker_offd[i2] >= jj_begin_row_offd && (sgn * A_offd_data[jj1]) < 0) { sum += A_offd_data[jj1]; } } } } if (sum != 0) { distribute = A_diag_data[jj] / sum; /*----------------------------------------------------------- * Loop over row of A for point i1 and do the distribution. *-----------------------------------------------------------*/ /* Diagonal block part of row i1 */ for (jj1 = A_diag_i[i1]; jj1 < A_diag_i[i1 + 1]; jj1++) { i2 = A_diag_j[jj1]; if (num_functions == 1 || dof_func[i1] == dof_func[i2]) { if (P_marker[i2] >= jj_begin_row && (sgn * A_diag_data[jj1]) < 0) { P_diag_data[P_marker[i2]] += distribute * A_diag_data[jj1]; } } } /* Off-Diagonal block part of row i1 */ if (num_procs > 1) { for (jj1 = A_offd_i[i1]; jj1 < A_offd_i[i1 + 1]; jj1++) { i2 = A_offd_j[jj1]; if (num_functions == 1 || dof_func[i1] == dof_func[i2]) { if (P_marker_offd[i2] >= jj_begin_row_offd && (sgn * A_offd_data[jj1]) < 0) { P_offd_data[P_marker_offd[i2]] += distribute * A_offd_data[jj1]; } } } } } else /* sum = 0 - only add to diag if the same function type */ { if (num_functions == 1 || dof_func[i] == dof_func[i1]) { diagonal += A_diag_data[jj]; } } } /*-------------------------------------------------------------- * Case 3: neighbor i1 weakly influences i, accumulate a_{i,i1} * into the diagonal. (only if the same function type) *--------------------------------------------------------------*/ else if (CF_marker[i1] != -3) { if (num_functions == 1 || dof_func[i] == dof_func[i1]) { diagonal += A_diag_data[jj]; } } } /*---------------------------------------------------------------- * Still looping over ith row of A. Next, loop over the * off-diagonal part of A *---------------------------------------------------------------*/ if (num_procs > 1) { for (jj = A_offd_i[i]; jj < A_offd_i[i + 1]; jj++) { i1 = A_offd_j[jj]; /*-------------------------------------------------------------- * Case 1: neighbor i1 is a C-point and strongly influences i, * accumulate a_{i,i1} into the interpolation weight. *--------------------------------------------------------------*/ if (P_marker_offd[i1] >= jj_begin_row_offd) { P_offd_data[P_marker_offd[i1]] += A_offd_data[jj]; } /*------------------------------------------------------------ * Case 2: neighbor i1 is an F-point and strongly influences i, * distribute a_{i,i1} to C-points that strongly infuence i. * Note: currently no distribution to the diagonal in this case. AGAIN, we only want to distribut to points of the SAME function type *-----------------------------------------------------------*/ else if (P_marker_offd[i1] == strong_f_marker) { sum = zero; /*--------------------------------------------------------- * Loop over row of A_ext for point i1 and calculate the sum * of the connections to c-points that strongly influence i. *---------------------------------------------------------*/ /* find row number */ c_num = A_offd_j[jj]; sgn = 1; if (A_ext_data[A_ext_i[c_num]] < 0) { sgn = -1; } for (jj1 = A_ext_i[c_num]; jj1 < A_ext_i[c_num + 1]; jj1++) { i2 = (HYPRE_Int)A_ext_j[jj1]; if (num_functions == 1 || dof_func[i1] == dof_func[i2]) { if (i2 > -1) { /* in the diagonal block */ if (P_marker[i2] >= jj_begin_row && (sgn * A_ext_data[jj1]) < 0) { sum += A_ext_data[jj1]; } } else { /* in the off_diagonal block */ if (P_marker_offd[-i2 - 1] >= jj_begin_row_offd && (sgn * A_ext_data[jj1]) < 0) { sum += A_ext_data[jj1]; } } } } if (sum != 0) { distribute = A_offd_data[jj] / sum; /*--------------------------------------------------------- * Loop over row of A_ext for point i1 and do * the distribution. *--------------------------------------------------------*/ /* Diagonal block part of row i1 */ for (jj1 = A_ext_i[c_num]; jj1 < A_ext_i[c_num + 1]; jj1++) { i2 = (HYPRE_Int)A_ext_j[jj1]; if (num_functions == 1 || dof_func[i1] == dof_func[i2]) { if (i2 > -1) /* in the diagonal block */ { if (P_marker[i2] >= jj_begin_row && (sgn * A_ext_data[jj1]) < 0) { P_diag_data[P_marker[i2]] += distribute * A_ext_data[jj1]; } } else { /* in the off_diagonal block */ if (P_marker_offd[-i2 - 1] >= jj_begin_row_offd && (sgn * A_ext_data[jj1]) < 0) P_offd_data[P_marker_offd[-i2 - 1]] += distribute * A_ext_data[jj1]; } } } } else /* sum = 0 */ { if (num_functions == 1 || dof_func[i] == dof_func_offd[i1]) { diagonal += A_offd_data[jj]; } } } /*----------------------------------------------------------- * Case 3: neighbor i1 weakly influences i, accumulate a_{i,i1} * into the diagonal. *-----------------------------------------------------------*/ else if (CF_marker_offd[i1] != -3) { if (num_functions == 1 || dof_func[i] == dof_func_offd[i1]) { diagonal += A_offd_data[jj]; } } } } /*----------------------------------------------------------------- * Set interpolation weight by dividing by the diagonal. *-----------------------------------------------------------------*/ if (diagonal == 0.0) { if (print_level) { hypre_printf(" Warning! zero diagonal! Proc id %d row %d\n", my_id, i); } for (jj = jj_begin_row; jj < jj_end_row; jj++) { P_diag_data[jj] = 0.0; } for (jj = jj_begin_row_offd; jj < jj_end_row_offd; jj++) { P_offd_data[jj] = 0.0; } } else { for (jj = jj_begin_row; jj < jj_end_row; jj++) { P_diag_data[jj] /= -diagonal; } for (jj = jj_begin_row_offd; jj < jj_end_row_offd; jj++) { P_offd_data[jj] /= -diagonal; } } } strong_f_marker--; P_offd_i[i + 1] = jj_counter_offd; } hypre_TFree(P_marker, HYPRE_MEMORY_HOST); hypre_TFree(P_marker_offd, HYPRE_MEMORY_HOST); } P = hypre_ParCSRMatrixCreate(comm, hypre_ParCSRMatrixGlobalNumRows(A), total_global_cpts, hypre_ParCSRMatrixColStarts(A), num_cpts_global, 0, P_diag_i[n_fine], P_offd_i[n_fine]); P_diag = hypre_ParCSRMatrixDiag(P); hypre_CSRMatrixData(P_diag) = P_diag_data; hypre_CSRMatrixI(P_diag) = P_diag_i; hypre_CSRMatrixJ(P_diag) = P_diag_j; P_offd = hypre_ParCSRMatrixOffd(P); hypre_CSRMatrixData(P_offd) = P_offd_data; hypre_CSRMatrixI(P_offd) = P_offd_i; hypre_CSRMatrixJ(P_offd) = P_offd_j; /* Compress P, removing coefficients smaller than trunc_factor * Max */ if (trunc_factor != 0.0 || max_elmts > 0) { hypre_BoomerAMGInterpTruncation(P, trunc_factor, max_elmts); P_diag_data = hypre_CSRMatrixData(P_diag); P_diag_i = hypre_CSRMatrixI(P_diag); P_diag_j = hypre_CSRMatrixJ(P_diag); P_offd_data = hypre_CSRMatrixData(P_offd); P_offd_i = hypre_CSRMatrixI(P_offd); P_offd_j = hypre_CSRMatrixJ(P_offd); P_diag_size = P_diag_i[n_fine]; P_offd_size = P_offd_i[n_fine]; } num_cols_P_offd = 0; if (P_offd_size) { P_marker = hypre_CTAlloc(HYPRE_Int, num_cols_A_offd, HYPRE_MEMORY_HOST); #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i) HYPRE_SMP_SCHEDULE #endif for (i = 0; i < num_cols_A_offd; i++) { P_marker[i] = 0; } num_cols_P_offd = 0; for (i = 0; i < P_offd_size; i++) { index = P_offd_j[i]; if (!P_marker[index]) { num_cols_P_offd++; P_marker[index] = 1; } } col_map_offd_P = hypre_CTAlloc(HYPRE_BigInt, num_cols_P_offd, HYPRE_MEMORY_HOST); tmp_map_offd = hypre_CTAlloc(HYPRE_Int, num_cols_P_offd, HYPRE_MEMORY_HOST); index = 0; for (i = 0; i < num_cols_P_offd; i++) { while (P_marker[index] == 0) { index++; } tmp_map_offd[i] = index++; } #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i) HYPRE_SMP_SCHEDULE #endif for (i = 0; i < P_offd_size; i++) P_offd_j[i] = hypre_BinarySearch(tmp_map_offd, P_offd_j[i], num_cols_P_offd); hypre_TFree(P_marker, HYPRE_MEMORY_HOST); } for (i = 0; i < n_fine; i++) if (CF_marker[i] == -3) { CF_marker[i] = -1; } if (num_cols_P_offd) { hypre_ParCSRMatrixColMapOffd(P) = col_map_offd_P; hypre_CSRMatrixNumCols(P_offd) = num_cols_P_offd; } hypre_GetCommPkgRTFromCommPkgA(P, A, fine_to_coarse, tmp_map_offd); *P_ptr = P; hypre_TFree(CF_marker_offd, HYPRE_MEMORY_HOST); hypre_TFree(dof_func_offd, HYPRE_MEMORY_HOST); hypre_TFree(int_buf_data, HYPRE_MEMORY_HOST); hypre_TFree(fine_to_coarse, HYPRE_MEMORY_HOST); hypre_TFree(tmp_map_offd, HYPRE_MEMORY_HOST); hypre_TFree(coarse_counter, HYPRE_MEMORY_HOST); hypre_TFree(jj_count, HYPRE_MEMORY_HOST); hypre_TFree(jj_count_offd, HYPRE_MEMORY_HOST); hypre_CSRMatrixDestroy(A_ext); return hypre_error_flag; } /*--------------------------------------------------------------------------- * hypre_BoomerAMGTruncandBuild *--------------------------------------------------------------------------*/ HYPRE_Int hypre_BoomerAMGTruncandBuild( hypre_ParCSRMatrix *P, HYPRE_Real trunc_factor, HYPRE_Int max_elmts) { hypre_CSRMatrix *P_offd = hypre_ParCSRMatrixOffd(P); hypre_ParCSRCommPkg *commpkg_P = hypre_ParCSRMatrixCommPkg(P); HYPRE_BigInt *col_map_offd = hypre_ParCSRMatrixColMapOffd(P); HYPRE_Int *P_offd_i = hypre_CSRMatrixI(P_offd); HYPRE_Int *P_offd_j = hypre_CSRMatrixJ(P_offd); HYPRE_Int num_cols_offd = hypre_CSRMatrixNumCols(P_offd); HYPRE_Int n_fine = hypre_CSRMatrixNumRows(P_offd); HYPRE_BigInt *new_col_map_offd; HYPRE_Int *tmp_map_offd = NULL; HYPRE_Int P_offd_size = 0, new_num_cols_offd; HYPRE_Int *P_marker; HYPRE_Int i; HYPRE_Int index; /* Compress P, removing coefficients smaller than trunc_factor * Max */ if (trunc_factor != 0.0 || max_elmts > 0) { hypre_BoomerAMGInterpTruncation(P, trunc_factor, max_elmts); P_offd_j = hypre_CSRMatrixJ(P_offd); P_offd_i = hypre_CSRMatrixI(P_offd); P_offd_size = P_offd_i[n_fine]; } new_num_cols_offd = 0; if (P_offd_size) { P_marker = hypre_CTAlloc(HYPRE_Int, num_cols_offd, HYPRE_MEMORY_HOST); /*#define HYPRE_SMP_PRIVATE i #include "../utilities/hypre_smp_forloop.h"*/ for (i = 0; i < num_cols_offd; i++) { P_marker[i] = 0; } for (i = 0; i < P_offd_size; i++) { index = P_offd_j[i]; if (!P_marker[index]) { new_num_cols_offd++; P_marker[index] = 1; } } tmp_map_offd = hypre_CTAlloc(HYPRE_Int, new_num_cols_offd, HYPRE_MEMORY_HOST); new_col_map_offd = hypre_CTAlloc(HYPRE_BigInt, new_num_cols_offd, HYPRE_MEMORY_HOST); index = 0; for (i = 0; i < new_num_cols_offd; i++) { while (P_marker[index] == 0) { index++; } tmp_map_offd[i] = index++; } /*#define HYPRE_SMP_PRIVATE i #include "../utilities/hypre_smp_forloop.h"*/ for (i = 0; i < P_offd_size; i++) P_offd_j[i] = hypre_BinarySearch(tmp_map_offd, P_offd_j[i], new_num_cols_offd); } index = 0; for (i = 0; i < new_num_cols_offd; i++) { while (P_marker[index] == 0) { index++; } new_col_map_offd[i] = col_map_offd[index]; index++; } if (P_offd_size) { hypre_TFree(P_marker, HYPRE_MEMORY_HOST); } if (new_num_cols_offd) { hypre_TFree(tmp_map_offd, HYPRE_MEMORY_HOST); hypre_TFree(col_map_offd, HYPRE_MEMORY_HOST); hypre_ParCSRMatrixColMapOffd(P) = new_col_map_offd; hypre_CSRMatrixNumCols(P_offd) = new_num_cols_offd; } if (commpkg_P != NULL) { hypre_MatvecCommPkgDestroy(commpkg_P); } hypre_MatvecCommPkgCreate(P); return hypre_error_flag; } hypre_ParCSRMatrix *hypre_CreateC( hypre_ParCSRMatrix *A, HYPRE_Real w) { MPI_Comm comm = hypre_ParCSRMatrixComm(A); hypre_CSRMatrix *A_diag = hypre_ParCSRMatrixDiag(A); HYPRE_Real *A_diag_data = hypre_CSRMatrixData(A_diag); HYPRE_Int *A_diag_i = hypre_CSRMatrixI(A_diag); HYPRE_Int *A_diag_j = hypre_CSRMatrixJ(A_diag); hypre_CSRMatrix *A_offd = hypre_ParCSRMatrixOffd(A); HYPRE_Real *A_offd_data = hypre_CSRMatrixData(A_offd); HYPRE_Int *A_offd_i = hypre_CSRMatrixI(A_offd); HYPRE_Int *A_offd_j = hypre_CSRMatrixJ(A_offd); HYPRE_BigInt *row_starts = hypre_ParCSRMatrixRowStarts(A); HYPRE_BigInt *col_map_offd_A = hypre_ParCSRMatrixColMapOffd(A); HYPRE_Int num_rows = hypre_CSRMatrixNumRows(A_diag); HYPRE_Int num_cols_offd = hypre_CSRMatrixNumCols(A_offd); HYPRE_BigInt global_num_rows = hypre_ParCSRMatrixGlobalNumRows(A); hypre_ParCSRMatrix *C; hypre_CSRMatrix *C_diag; hypre_CSRMatrix *C_offd; HYPRE_Real *C_diag_data; HYPRE_Int *C_diag_i; HYPRE_Int *C_diag_j; HYPRE_Real *C_offd_data; HYPRE_Int *C_offd_i; HYPRE_Int *C_offd_j; HYPRE_BigInt *col_map_offd_C; HYPRE_Int i, j, index; HYPRE_Real invdiag; HYPRE_Real w_local = w; C = hypre_ParCSRMatrixCreate(comm, global_num_rows, global_num_rows, row_starts, row_starts, num_cols_offd, A_diag_i[num_rows], A_offd_i[num_rows]); hypre_ParCSRMatrixInitialize(C); C_diag = hypre_ParCSRMatrixDiag(C); C_offd = hypre_ParCSRMatrixOffd(C); C_diag_i = hypre_CSRMatrixI(C_diag); C_diag_j = hypre_CSRMatrixJ(C_diag); C_diag_data = hypre_CSRMatrixData(C_diag); C_offd_i = hypre_CSRMatrixI(C_offd); C_offd_j = hypre_CSRMatrixJ(C_offd); C_offd_data = hypre_CSRMatrixData(C_offd); col_map_offd_C = hypre_ParCSRMatrixColMapOffd(C); for (i = 0; i < num_cols_offd; i++) { col_map_offd_C[i] = col_map_offd_A[i]; } for (i = 0; i < num_rows; i++) { index = A_diag_i[i]; invdiag = -w / A_diag_data[index]; C_diag_data[index] = 1.0 - w; C_diag_j[index] = A_diag_j[index]; if (w == 0) { w_local = hypre_abs(A_diag_data[index]); for (j = index + 1; j < A_diag_i[i + 1]; j++) { w_local += hypre_abs(A_diag_data[j]); } for (j = A_offd_i[i]; j < A_offd_i[i + 1]; j++) { w_local += hypre_abs(A_offd_data[j]); } invdiag = -1 / w_local; C_diag_data[index] = 1.0 - A_diag_data[index] / w_local; } C_diag_i[i] = index; C_offd_i[i] = A_offd_i[i]; for (j = index + 1; j < A_diag_i[i + 1]; j++) { C_diag_data[j] = A_diag_data[j] * invdiag; C_diag_j[j] = A_diag_j[j]; } for (j = A_offd_i[i]; j < A_offd_i[i + 1]; j++) { C_offd_data[j] = A_offd_data[j] * invdiag; C_offd_j[j] = A_offd_j[j]; } } C_diag_i[num_rows] = A_diag_i[num_rows]; C_offd_i[num_rows] = A_offd_i[num_rows]; return C; } /* RL */ HYPRE_Int hypre_BoomerAMGBuildInterpOnePntHost( hypre_ParCSRMatrix *A, HYPRE_Int *CF_marker, hypre_ParCSRMatrix *S, HYPRE_BigInt *num_cpts_global, HYPRE_Int num_functions, HYPRE_Int *dof_func, HYPRE_Int debug_flag, hypre_ParCSRMatrix **P_ptr) { HYPRE_UNUSED_VAR(debug_flag); MPI_Comm comm = hypre_ParCSRMatrixComm(A); hypre_ParCSRCommPkg *comm_pkg = hypre_ParCSRMatrixCommPkg(A); hypre_ParCSRCommHandle *comm_handle; HYPRE_MemoryLocation memory_location_P = hypre_ParCSRMatrixMemoryLocation(A); hypre_CSRMatrix *A_diag = hypre_ParCSRMatrixDiag(A); HYPRE_Real *A_diag_data = hypre_CSRMatrixData(A_diag); HYPRE_Int *A_diag_i = hypre_CSRMatrixI(A_diag); HYPRE_Int *A_diag_j = hypre_CSRMatrixJ(A_diag); hypre_CSRMatrix *A_offd = hypre_ParCSRMatrixOffd(A); HYPRE_Real *A_offd_data = hypre_CSRMatrixData(A_offd); HYPRE_Int *A_offd_i = hypre_CSRMatrixI(A_offd); HYPRE_Int *A_offd_j = hypre_CSRMatrixJ(A_offd); HYPRE_Int num_cols_A_offd = hypre_CSRMatrixNumCols(A_offd); //HYPRE_Int *col_map_offd_A = hypre_ParCSRMatrixColMapOffd(A); hypre_CSRMatrix *S_diag = hypre_ParCSRMatrixDiag(S); HYPRE_Int *S_diag_i = hypre_CSRMatrixI(S_diag); HYPRE_Int *S_diag_j = hypre_CSRMatrixJ(S_diag); hypre_CSRMatrix *S_offd = hypre_ParCSRMatrixOffd(S); HYPRE_Int *S_offd_i = hypre_CSRMatrixI(S_offd); HYPRE_Int *S_offd_j = hypre_CSRMatrixJ(S_offd); /* Interpolation matrix P */ hypre_ParCSRMatrix *P; /* csr's */ hypre_CSRMatrix *P_diag; hypre_CSRMatrix *P_offd; /* arrays */ HYPRE_Real *P_diag_data; HYPRE_Int *P_diag_i; HYPRE_Int *P_diag_j; HYPRE_Real *P_offd_data; HYPRE_Int *P_offd_i; HYPRE_Int *P_offd_j; HYPRE_Int num_cols_offd_P; HYPRE_Int *tmp_map_offd = NULL; HYPRE_BigInt *col_map_offd_P = NULL; /* CF marker off-diag part */ HYPRE_Int *CF_marker_offd = NULL; /* func type off-diag part */ HYPRE_Int *dof_func_offd = NULL; /* nnz */ HYPRE_Int nnz_diag, nnz_offd, cnt_diag, cnt_offd; HYPRE_Int *marker_diag, *marker_offd = NULL; /* local size */ HYPRE_Int n_fine = hypre_CSRMatrixNumRows(A_diag); /* number of C-pts */ HYPRE_Int n_cpts = 0; /* fine to coarse mapping: diag part and offd part */ HYPRE_Int *fine_to_coarse; HYPRE_BigInt *fine_to_coarse_offd = NULL; HYPRE_BigInt total_global_cpts, my_first_cpt; HYPRE_Int my_id, num_procs; HYPRE_Int num_sends; HYPRE_Int *int_buf_data = NULL; HYPRE_BigInt *big_int_buf_data = NULL; //HYPRE_Int col_start = hypre_ParCSRMatrixFirstRowIndex(A); //HYPRE_Int col_end = col_start + n_fine; HYPRE_Int i, j, i1, j1, k1, index, start; HYPRE_Int *max_abs_cij; char *max_abs_diag_offd; HYPRE_Real max_abs_aij, vv; hypre_MPI_Comm_size(comm, &num_procs); hypre_MPI_Comm_rank(comm, &my_id); my_first_cpt = num_cpts_global[0]; if (my_id == (num_procs - 1)) { total_global_cpts = num_cpts_global[1]; } hypre_MPI_Bcast(&total_global_cpts, 1, HYPRE_MPI_BIG_INT, num_procs - 1, comm); /*------------------------------------------------------------------- * Get the CF_marker data for the off-processor columns *-------------------------------------------------------------------*/ /* CF marker for the off-diag columns */ if (num_cols_A_offd) { CF_marker_offd = hypre_CTAlloc(HYPRE_Int, num_cols_A_offd, HYPRE_MEMORY_HOST); } /* function type indicator for the off-diag columns */ if (num_functions > 1 && num_cols_A_offd) { dof_func_offd = hypre_CTAlloc(HYPRE_Int, num_cols_A_offd, HYPRE_MEMORY_HOST); } /* if CommPkg of A is not present, create it */ if (!comm_pkg) { hypre_MatvecCommPkgCreate(A); comm_pkg = hypre_ParCSRMatrixCommPkg(A); } /* number of sends to do (number of procs) */ num_sends = hypre_ParCSRCommPkgNumSends(comm_pkg); /* send buffer, of size send_map_starts[num_sends]), * i.e., number of entries to send */ int_buf_data = hypre_CTAlloc(HYPRE_Int, hypre_ParCSRCommPkgSendMapStart(comm_pkg, num_sends), HYPRE_MEMORY_HOST); /* copy CF markers of elements to send to buffer * RL: why copy them with two for loops? Why not just loop through all in one */ index = 0; for (i = 0; i < num_sends; i++) { /* start pos of elements sent to send_proc[i] */ start = hypre_ParCSRCommPkgSendMapStart(comm_pkg, i); /* loop through all elems to send_proc[i] */ for (j = start; j < hypre_ParCSRCommPkgSendMapStart(comm_pkg, i + 1); j++) { /* CF marker of send_map_elemts[j] */ int_buf_data[index++] = CF_marker[hypre_ParCSRCommPkgSendMapElmt(comm_pkg, j)]; } } /* create a handle to start communication. 11: for integer */ comm_handle = hypre_ParCSRCommHandleCreate(11, comm_pkg, int_buf_data, CF_marker_offd); /* destroy the handle to finish communication */ hypre_ParCSRCommHandleDestroy(comm_handle); /* do a similar communication for dof_func */ if (num_functions > 1) { index = 0; for (i = 0; i < num_sends; i++) { start = hypre_ParCSRCommPkgSendMapStart(comm_pkg, i); for (j = start; j < hypre_ParCSRCommPkgSendMapStart(comm_pkg, i + 1); j++) { int_buf_data[index++] = dof_func[hypre_ParCSRCommPkgSendMapElmt(comm_pkg, j)]; } } comm_handle = hypre_ParCSRCommHandleCreate(11, comm_pkg, int_buf_data, dof_func_offd); hypre_ParCSRCommHandleDestroy(comm_handle); } hypre_TFree(int_buf_data, HYPRE_MEMORY_HOST); /*----------------------------------------------------------------------- * First Pass: Determine size of P and fill in fine_to_coarse mapping, * and find the most strongly influencing C-pt for each F-pt *-----------------------------------------------------------------------*/ /* nnz in diag and offd parts */ cnt_diag = 0; cnt_offd = 0; max_abs_cij = hypre_CTAlloc(HYPRE_Int, n_fine, HYPRE_MEMORY_HOST); max_abs_diag_offd = hypre_CTAlloc(char, n_fine, HYPRE_MEMORY_HOST); fine_to_coarse = hypre_CTAlloc(HYPRE_Int, n_fine, HYPRE_MEMORY_HOST); /* markers initialized as zeros */ marker_diag = hypre_CTAlloc(HYPRE_Int, n_fine, HYPRE_MEMORY_HOST); marker_offd = hypre_CTAlloc(HYPRE_Int, num_cols_A_offd, HYPRE_MEMORY_HOST); for (i = 0; i < n_fine; i++) { /*-------------------------------------------------------------------- * If i is a C-point, interpolation is the identity. Also set up * mapping vector. *--------------------------------------------------------------------*/ if (CF_marker[i] >= 0) { //fine_to_coarse[i] = my_first_cpt + n_cpts; fine_to_coarse[i] = n_cpts; n_cpts++; continue; } /* mark all the strong connections: in S */ HYPRE_Int MARK = i + 1; /* loop through row i of S, diag part */ for (j = S_diag_i[i]; j < S_diag_i[i + 1]; j++) { marker_diag[S_diag_j[j]] = MARK; } /* loop through row i of S, offd part */ if (num_procs > 1) { for (j = S_offd_i[i]; j < S_offd_i[i + 1]; j++) { j1 = S_offd_j[j]; marker_offd[j1] = MARK; } } fine_to_coarse[i] = -1; /*--------------------------------------------------------------------------- * If i is an F-pt, interpolation is from the most strongly influencing C-pt * Find this C-pt and save it *--------------------------------------------------------------------------*/ /* if we failed to find any strong C-pt, mark this point as an 'n' */ char marker = 'n'; /* max abs val */ max_abs_aij = -1.0; /* loop through row i of A, diag part */ for (j = A_diag_i[i]; j < A_diag_i[i + 1]; j++) { i1 = A_diag_j[j]; vv = hypre_abs(A_diag_data[j]); #if 0 /* !!! this is a hack just for code verification purpose !!! it basically says: 1. if we see |a_ij| < 1e-14, force it to be 1e-14 2. if we see |a_ij| == the max(|a_ij|) so far exactly, replace it if the j idx is smaller Reasons: 1. numerical round-off for eps-level values 2. entries in CSR rows may be listed in different orders */ vv = vv < 1e-14 ? 1e-14 : vv; if (CF_marker[i1] >= 0 && marker_diag[i1] == MARK && vv == max_abs_aij && i1 < max_abs_cij[i]) { /* mark it as a 'd' */ marker = 'd'; max_abs_cij[i] = i1; max_abs_aij = vv; continue; } #endif /* it is a strong C-pt and has abs val larger than what have seen */ if (CF_marker[i1] >= 0 && marker_diag[i1] == MARK && vv > max_abs_aij) { /* mark it as a 'd' */ marker = 'd'; max_abs_cij[i] = i1; max_abs_aij = vv; } } /* offd part */ if (num_procs > 1) { for (j = A_offd_i[i]; j < A_offd_i[i + 1]; j++) { i1 = A_offd_j[j]; vv = hypre_abs(A_offd_data[j]); if (CF_marker_offd[i1] >= 0 && marker_offd[i1] == MARK && vv > max_abs_aij) { /* mark it as an 'o' */ marker = 'o'; max_abs_cij[i] = i1; max_abs_aij = vv; } } } max_abs_diag_offd[i] = marker; if (marker == 'd') { cnt_diag ++; } else if (marker == 'o') { cnt_offd ++; } } nnz_diag = cnt_diag + n_cpts; nnz_offd = cnt_offd; /*------------- allocate arrays */ P_diag_i = hypre_CTAlloc(HYPRE_Int, n_fine + 1, memory_location_P); P_diag_j = hypre_CTAlloc(HYPRE_Int, nnz_diag, memory_location_P); P_diag_data = hypre_CTAlloc(HYPRE_Real, nnz_diag, memory_location_P); /* not in ``if num_procs > 1'', * allocation needed even for empty CSR */ P_offd_i = hypre_CTAlloc(HYPRE_Int, n_fine + 1, memory_location_P); P_offd_j = hypre_CTAlloc(HYPRE_Int, nnz_offd, memory_location_P); P_offd_data = hypre_CTAlloc(HYPRE_Real, nnz_offd, memory_location_P); /* redundant */ P_diag_i[0] = 0; P_offd_i[0] = 0; /* reset counters */ cnt_diag = 0; cnt_offd = 0; /*----------------------------------------------------------------------- * Send and receive fine_to_coarse info. *-----------------------------------------------------------------------*/ fine_to_coarse_offd = hypre_CTAlloc(HYPRE_BigInt, num_cols_A_offd, HYPRE_MEMORY_HOST); big_int_buf_data = hypre_CTAlloc(HYPRE_BigInt, hypre_ParCSRCommPkgSendMapStart(comm_pkg, num_sends), HYPRE_MEMORY_HOST); index = 0; for (i = 0; i < num_sends; i++) { start = hypre_ParCSRCommPkgSendMapStart(comm_pkg, i); for (j = start; j < hypre_ParCSRCommPkgSendMapStart(comm_pkg, i + 1); j++) { big_int_buf_data[index++] = my_first_cpt + (HYPRE_BigInt)fine_to_coarse[hypre_ParCSRCommPkgSendMapElmt(comm_pkg, j)]; } } comm_handle = hypre_ParCSRCommHandleCreate(21, comm_pkg, big_int_buf_data, fine_to_coarse_offd); hypre_ParCSRCommHandleDestroy(comm_handle); /*----------------------------------------------------------------------- * Second Pass: Populate P *-----------------------------------------------------------------------*/ for (i = 0; i < n_fine; i++) { if (CF_marker[i] >= 0) { /*-------------------------------------------------------------------- * If i is a C-point, interpolation is the identity. *--------------------------------------------------------------------*/ //P_diag_j[cnt_diag] = fine_to_coarse[i] - my_first_cpt; P_diag_j[cnt_diag] = fine_to_coarse[i]; P_diag_data[cnt_diag++] = 1.0; } else { /*--------------------------------------------------------------------------- * If i is an F-pt, interpolation is from the most strongly influencing C-pt *--------------------------------------------------------------------------*/ if (max_abs_diag_offd[i] == 'd') { /* on diag part of P */ j = max_abs_cij[i]; //P_diag_j[cnt_diag] = fine_to_coarse[j] - my_first_cpt; P_diag_j[cnt_diag] = fine_to_coarse[j]; P_diag_data[cnt_diag++] = 1.0; } else if (max_abs_diag_offd[i] == 'o') { /* on offd part of P */ j = max_abs_cij[i]; P_offd_j[cnt_offd] = j; P_offd_data[cnt_offd++] = 1.0; } } P_diag_i[i + 1] = cnt_diag; P_offd_i[i + 1] = cnt_offd; } hypre_assert(cnt_diag == nnz_diag); hypre_assert(cnt_offd == nnz_offd); /* num of cols in the offd part of P */ num_cols_offd_P = 0; /* marker_offd: all -1 */ for (i = 0; i < num_cols_A_offd; i++) { marker_offd[i] = -1; } for (i = 0; i < nnz_offd; i++) { i1 = P_offd_j[i]; if (marker_offd[i1] == -1) { num_cols_offd_P++; marker_offd[i1] = 1; } } /* col_map_offd_P: the col indices of the offd of P * we first keep them be the offd-idx of A */ col_map_offd_P = hypre_CTAlloc(HYPRE_BigInt, num_cols_offd_P, HYPRE_MEMORY_HOST); tmp_map_offd = hypre_CTAlloc(HYPRE_Int, num_cols_offd_P, HYPRE_MEMORY_HOST); for (i = 0, i1 = 0; i < num_cols_A_offd; i++) { if (marker_offd[i] == 1) { tmp_map_offd[i1++] = i; } } hypre_assert(i1 == num_cols_offd_P); /* now, adjust P_offd_j to local idx w.r.t col_map_offd_R * by searching */ for (i = 0; i < nnz_offd; i++) { i1 = P_offd_j[i]; k1 = hypre_BinarySearch(tmp_map_offd, i1, num_cols_offd_P); /* search must succeed */ hypre_assert(k1 >= 0 && k1 < num_cols_offd_P); P_offd_j[i] = k1; } /* change col_map_offd_P to global coarse ids */ for (i = 0; i < num_cols_offd_P; i++) { col_map_offd_P[i] = fine_to_coarse_offd[tmp_map_offd[i]]; } /* Now, we should have everything of Parcsr matrix P */ P = hypre_ParCSRMatrixCreate(comm, hypre_ParCSRMatrixGlobalNumCols(A), /* global num of rows */ total_global_cpts, /* global num of cols */ hypre_ParCSRMatrixColStarts(A), /* row_starts */ num_cpts_global, /* col_starts */ num_cols_offd_P, /* num cols offd */ nnz_diag, nnz_offd); P_diag = hypre_ParCSRMatrixDiag(P); hypre_CSRMatrixData(P_diag) = P_diag_data; hypre_CSRMatrixI(P_diag) = P_diag_i; hypre_CSRMatrixJ(P_diag) = P_diag_j; P_offd = hypre_ParCSRMatrixOffd(P); hypre_CSRMatrixData(P_offd) = P_offd_data; hypre_CSRMatrixI(P_offd) = P_offd_i; hypre_CSRMatrixJ(P_offd) = P_offd_j; hypre_ParCSRMatrixColMapOffd(P) = col_map_offd_P; /* create CommPkg of P */ hypre_MatvecCommPkgCreate(P); *P_ptr = P; /* free workspace */ hypre_TFree(CF_marker_offd, HYPRE_MEMORY_HOST); hypre_TFree(dof_func_offd, HYPRE_MEMORY_HOST); hypre_TFree(tmp_map_offd, HYPRE_MEMORY_HOST); hypre_TFree(big_int_buf_data, HYPRE_MEMORY_HOST); hypre_TFree(fine_to_coarse, HYPRE_MEMORY_HOST); hypre_TFree(fine_to_coarse_offd, HYPRE_MEMORY_HOST); hypre_TFree(marker_diag, HYPRE_MEMORY_HOST); hypre_TFree(marker_offd, HYPRE_MEMORY_HOST); hypre_TFree(max_abs_cij, HYPRE_MEMORY_HOST); hypre_TFree(max_abs_diag_offd, HYPRE_MEMORY_HOST); return hypre_error_flag; } HYPRE_Int hypre_BoomerAMGBuildInterpOnePnt( hypre_ParCSRMatrix *A, HYPRE_Int *CF_marker, hypre_ParCSRMatrix *S, HYPRE_BigInt *num_cpts_global, HYPRE_Int num_functions, HYPRE_Int *dof_func, HYPRE_Int debug_flag, hypre_ParCSRMatrix **P_ptr) { hypre_GpuProfilingPushRange("OnePntInterp"); HYPRE_Int ierr = 0; #if defined(HYPRE_USING_GPU) HYPRE_ExecutionPolicy exec = hypre_GetExecPolicy1( hypre_ParCSRMatrixMemoryLocation(A) ); if (exec == HYPRE_EXEC_DEVICE) { ierr = hypre_BoomerAMGBuildInterpOnePntDevice(A, CF_marker, S, num_cpts_global, num_functions, dof_func, debug_flag, P_ptr); } else #endif { ierr = hypre_BoomerAMGBuildInterpOnePntHost(A, CF_marker, S, num_cpts_global, num_functions, dof_func, debug_flag, P_ptr); } hypre_GpuProfilingPopRange(); return ierr; } hypre-2.33.0/src/parcsr_ls/par_interp_device.c000066400000000000000000002004661477326011500213510ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "_hypre_onedpl.hpp" #include "_hypre_parcsr_ls.h" #include "_hypre_utilities.hpp" #if defined(HYPRE_USING_GPU) /* TODO (VPM): Rename to hypreGPUKernel_. Also, do we need these prototypes? */ __global__ void hypre_BoomerAMGBuildDirInterp_getnnz( hypre_DeviceItem &item, HYPRE_Int nr_of_rows, HYPRE_Int *S_diag_i, HYPRE_Int *S_diag_j, HYPRE_Int *S_offd_i, HYPRE_Int *S_offd_j, HYPRE_Int *CF_marker, HYPRE_Int *CF_marker_offd, HYPRE_Int num_functions, HYPRE_Int *dof_func, HYPRE_Int *dof_func_offd, HYPRE_Int *P_diag_i, HYPRE_Int *P_offd_i); __global__ void hypre_BoomerAMGBuildDirInterp_getcoef( hypre_DeviceItem &item, HYPRE_Int nr_of_rows, HYPRE_Int *A_diag_i, HYPRE_Int *A_diag_j, HYPRE_Real *A_diag_data, HYPRE_Int *A_offd_i, HYPRE_Int *A_offd_j, HYPRE_Real *A_offd_data, HYPRE_Int *Soc_diag_j, HYPRE_Int *Soc_offd_j, HYPRE_Int *CF_marker, HYPRE_Int *CF_marker_offd, HYPRE_Int num_functions, HYPRE_Int *dof_func, HYPRE_Int *dof_func_offd, HYPRE_Int *P_diag_i, HYPRE_Int *P_diag_j, HYPRE_Real *P_diag_data, HYPRE_Int *P_offd_i, HYPRE_Int *P_offd_j, HYPRE_Real *P_offd_data, HYPRE_Int *fine_to_coarse ); __global__ void hypre_BoomerAMGBuildDirInterp_getcoef_v2( hypre_DeviceItem &item, HYPRE_Int nr_of_rows, HYPRE_Int *A_diag_i, HYPRE_Int *A_diag_j, HYPRE_Real *A_diag_data, HYPRE_Int *A_offd_i, HYPRE_Int *A_offd_j, HYPRE_Real *A_offd_data, HYPRE_Int *Soc_diag_j, HYPRE_Int *Soc_offd_j, HYPRE_Int *CF_marker, HYPRE_Int *CF_marker_offd, HYPRE_Int num_functions, HYPRE_Int *dof_func, HYPRE_Int *dof_func_offd, HYPRE_Int *P_diag_i, HYPRE_Int *P_diag_j, HYPRE_Real *P_diag_data, HYPRE_Int *P_offd_i, HYPRE_Int *P_offd_j, HYPRE_Real *P_offd_data, HYPRE_Int *fine_to_coarse ); __global__ void hypre_BoomerAMGBuildInterpOnePnt_getnnz( hypre_DeviceItem &item, HYPRE_Int nr_of_rows, HYPRE_Int *A_diag_i, HYPRE_Int *A_strong_diag_j, HYPRE_Complex *A_diag_a, HYPRE_Int *A_offd_i, HYPRE_Int *A_strong_offd_j, HYPRE_Complex *A_offd_a, HYPRE_Int *CF_marker, HYPRE_Int *CF_marker_offd, HYPRE_Int *diag_compress_marker, HYPRE_Int *offd_compress_marker, HYPRE_Int *P_diag_i, HYPRE_Int *P_diag_j, HYPRE_Int *P_offd_i, HYPRE_Int *P_offd_j); /*--------------------------------------------------------------------------- * hypre_BoomerAMGBuildDirInterp *--------------------------------------------------------------------------*/ HYPRE_Int hypre_BoomerAMGBuildDirInterpDevice( hypre_ParCSRMatrix *A, HYPRE_Int *CF_marker, hypre_ParCSRMatrix *S, HYPRE_BigInt *num_cpts_global, HYPRE_Int num_functions, HYPRE_Int *dof_func, HYPRE_Int debug_flag, HYPRE_Real trunc_factor, HYPRE_Int max_elmts, HYPRE_Int interp_type, hypre_ParCSRMatrix **P_ptr) { MPI_Comm comm = hypre_ParCSRMatrixComm(A); hypre_ParCSRCommPkg *comm_pkg = hypre_ParCSRMatrixCommPkg(A); hypre_ParCSRCommHandle *comm_handle; hypre_CSRMatrix *A_diag = hypre_ParCSRMatrixDiag(A); HYPRE_Real *A_diag_data = hypre_CSRMatrixData(A_diag); HYPRE_Int *A_diag_i = hypre_CSRMatrixI(A_diag); HYPRE_Int *A_diag_j = hypre_CSRMatrixJ(A_diag); hypre_CSRMatrix *A_offd = hypre_ParCSRMatrixOffd(A); HYPRE_Real *A_offd_data = hypre_CSRMatrixData(A_offd); HYPRE_Int *A_offd_i = hypre_CSRMatrixI(A_offd); HYPRE_Int *A_offd_j = hypre_CSRMatrixJ(A_offd); HYPRE_Int num_cols_A_offd = hypre_CSRMatrixNumCols(A_offd); HYPRE_Int n_fine = hypre_CSRMatrixNumRows(A_diag); hypre_BoomerAMGMakeSocFromSDevice(A, S); hypre_CSRMatrix *S_diag = hypre_ParCSRMatrixDiag(S); HYPRE_Int *S_diag_i = hypre_CSRMatrixI(S_diag); HYPRE_Int *S_diag_j = hypre_CSRMatrixJ(S_diag); hypre_CSRMatrix *S_offd = hypre_ParCSRMatrixOffd(S); HYPRE_Int *S_offd_i = hypre_CSRMatrixI(S_offd); HYPRE_Int *S_offd_j = hypre_CSRMatrixJ(S_offd); HYPRE_Int *Soc_diag_j = hypre_ParCSRMatrixSocDiagJ(S); HYPRE_Int *Soc_offd_j = hypre_ParCSRMatrixSocOffdJ(S); HYPRE_Int *CF_marker_offd = NULL; HYPRE_Int *dof_func_offd = NULL; hypre_ParCSRMatrix *P; hypre_CSRMatrix *P_diag; hypre_CSRMatrix *P_offd; HYPRE_Real *P_diag_data; HYPRE_Int *P_diag_i; HYPRE_Int *P_diag_j; HYPRE_Real *P_offd_data; HYPRE_Int *P_offd_i; HYPRE_Int *P_offd_j; HYPRE_Int P_diag_size, P_offd_size; HYPRE_Int *fine_to_coarse_d; HYPRE_Int *fine_to_coarse_h; HYPRE_BigInt total_global_cpts; HYPRE_Int my_id; HYPRE_Int num_procs; HYPRE_Int num_sends; HYPRE_Int *int_buf_data; HYPRE_Real wall_time; /* for debugging instrumentation */ HYPRE_MemoryLocation memory_location = hypre_ParCSRMatrixMemoryLocation(A); hypre_MPI_Comm_size(comm, &num_procs); hypre_MPI_Comm_rank(comm, &my_id); if (my_id == (num_procs - 1)) { total_global_cpts = num_cpts_global[1]; } hypre_MPI_Bcast( &total_global_cpts, 1, HYPRE_MPI_BIG_INT, num_procs - 1, comm); if (!comm_pkg) { hypre_MatvecCommPkgCreate(A); comm_pkg = hypre_ParCSRMatrixCommPkg(A); } if (debug_flag == 4) { wall_time = time_getWallclockSeconds(); } /* 1. Communicate CF_marker to/from other processors */ if (num_cols_A_offd) { CF_marker_offd = hypre_TAlloc(HYPRE_Int, num_cols_A_offd, HYPRE_MEMORY_DEVICE); } num_sends = hypre_ParCSRCommPkgNumSends(comm_pkg); int_buf_data = hypre_TAlloc(HYPRE_Int, hypre_ParCSRCommPkgSendMapStart(comm_pkg, num_sends), HYPRE_MEMORY_DEVICE); hypre_ParCSRCommPkgCopySendMapElmtsToDevice(comm_pkg); #if defined(HYPRE_USING_SYCL) hypreSycl_gather( hypre_ParCSRCommPkgDeviceSendMapElmts(comm_pkg), hypre_ParCSRCommPkgDeviceSendMapElmts(comm_pkg) + hypre_ParCSRCommPkgSendMapStart(comm_pkg, num_sends), CF_marker, int_buf_data ); #else HYPRE_THRUST_CALL( gather, hypre_ParCSRCommPkgDeviceSendMapElmts(comm_pkg), hypre_ParCSRCommPkgDeviceSendMapElmts(comm_pkg) + hypre_ParCSRCommPkgSendMapStart(comm_pkg, num_sends), CF_marker, int_buf_data ); #endif #if defined(HYPRE_USING_THRUST_NOSYNC) /* RL: make sure int_buf_data is ready before issuing GPU-GPU MPI */ if (hypre_GetGpuAwareMPI()) { hypre_ForceSyncComputeStream(); } #endif comm_handle = hypre_ParCSRCommHandleCreate_v2(11, comm_pkg, HYPRE_MEMORY_DEVICE, int_buf_data, HYPRE_MEMORY_DEVICE, CF_marker_offd); hypre_ParCSRCommHandleDestroy(comm_handle); if (num_functions > 1) { /* 2. Communicate dof_func to/from other processors */ if (num_cols_A_offd > 0) { dof_func_offd = hypre_TAlloc(HYPRE_Int, num_cols_A_offd, HYPRE_MEMORY_DEVICE); } #if defined(HYPRE_USING_SYCL) hypreSycl_gather( hypre_ParCSRCommPkgDeviceSendMapElmts(comm_pkg), hypre_ParCSRCommPkgDeviceSendMapElmts(comm_pkg) + hypre_ParCSRCommPkgSendMapStart(comm_pkg, num_sends), dof_func, int_buf_data ); #else HYPRE_THRUST_CALL( gather, hypre_ParCSRCommPkgDeviceSendMapElmts(comm_pkg), hypre_ParCSRCommPkgDeviceSendMapElmts(comm_pkg) + hypre_ParCSRCommPkgSendMapStart(comm_pkg, num_sends), dof_func, int_buf_data ); #endif #if defined(HYPRE_USING_THRUST_NOSYNC) /* RL: make sure int_buf_data is ready before issuing GPU-GPU MPI */ if (hypre_GetGpuAwareMPI()) { hypre_ForceSyncComputeStream(); } #endif comm_handle = hypre_ParCSRCommHandleCreate_v2(11, comm_pkg, HYPRE_MEMORY_DEVICE, int_buf_data, HYPRE_MEMORY_DEVICE, dof_func_offd); hypre_ParCSRCommHandleDestroy(comm_handle); } if (debug_flag == 4) { wall_time = time_getWallclockSeconds() - wall_time; hypre_printf("Proc = %d Interp: Comm 1 CF_marker = %f\n", my_id, wall_time); fflush(NULL); } /* 3. Figure out the size of the interpolation matrix, P, i.e., compute P_diag_i and P_offd_i */ /* Also, compute fine_to_coarse array: When i is a coarse point, fine_to_coarse[i] will hold a */ /* corresponding coarse point index in the range 0..n_coarse-1 */ P_diag_i = hypre_TAlloc(HYPRE_Int, n_fine + 1, memory_location); P_offd_i = hypre_TAlloc(HYPRE_Int, n_fine + 1, memory_location); dim3 bDim = hypre_GetDefaultDeviceBlockDimension(); dim3 gDim = hypre_GetDefaultDeviceGridDimension(n_fine, "warp", bDim); HYPRE_GPU_LAUNCH( hypre_BoomerAMGBuildDirInterp_getnnz, gDim, bDim, n_fine, S_diag_i, S_diag_j, S_offd_i, S_offd_j, CF_marker, CF_marker_offd, num_functions, dof_func, dof_func_offd, P_diag_i, P_offd_i); /* The scans will transform P_diag_i and P_offd_i to the CSR I-vectors */ hypre_Memset(P_diag_i + n_fine, 0, sizeof(HYPRE_Int), HYPRE_MEMORY_DEVICE); hypre_Memset(P_offd_i + n_fine, 0, sizeof(HYPRE_Int), HYPRE_MEMORY_DEVICE); hypreDevice_IntegerExclusiveScan(n_fine + 1, P_diag_i); hypreDevice_IntegerExclusiveScan(n_fine + 1, P_offd_i); fine_to_coarse_d = hypre_TAlloc(HYPRE_Int, n_fine, HYPRE_MEMORY_DEVICE); /* The scan will make fine_to_coarse[i] for i a coarse point hold a * coarse point index in the range from 0 to n_coarse-1 */ #if defined(HYPRE_USING_SYCL) HYPRE_ONEDPL_CALL( std::exclusive_scan, oneapi::dpl::make_transform_iterator(CF_marker, is_nonnegative()), oneapi::dpl::make_transform_iterator(CF_marker + n_fine, is_nonnegative()), fine_to_coarse_d, HYPRE_Int(0) ); /* *MUST* pass init value since input and output types diff. */ #else HYPRE_THRUST_CALL( exclusive_scan, thrust::make_transform_iterator(CF_marker, is_nonnegative()), thrust::make_transform_iterator(CF_marker + n_fine, is_nonnegative()), fine_to_coarse_d, HYPRE_Int(0) ); /* *MUST* pass init value since input and output types diff. */ #endif /* 4. Compute the CSR arrays P_diag_j, P_diag_data, P_offd_j, and P_offd_data */ /* P_diag_i and P_offd_i are now known, first allocate the remaining CSR arrays of P */ hypre_TMemcpy(&P_diag_size, &P_diag_i[n_fine], HYPRE_Int, 1, HYPRE_MEMORY_HOST, memory_location); hypre_TMemcpy(&P_offd_size, &P_offd_i[n_fine], HYPRE_Int, 1, HYPRE_MEMORY_HOST, memory_location); P_diag_j = hypre_TAlloc(HYPRE_Int, P_diag_size, memory_location); P_diag_data = hypre_TAlloc(HYPRE_Real, P_diag_size, memory_location); P_offd_j = hypre_TAlloc(HYPRE_Int, P_offd_size, memory_location); P_offd_data = hypre_TAlloc(HYPRE_Real, P_offd_size, memory_location); if (interp_type == 3) { HYPRE_GPU_LAUNCH( hypre_BoomerAMGBuildDirInterp_getcoef, gDim, bDim, n_fine, A_diag_i, A_diag_j, A_diag_data, A_offd_i, A_offd_j, A_offd_data, Soc_diag_j, Soc_offd_j, CF_marker, CF_marker_offd, num_functions, dof_func, dof_func_offd, P_diag_i, P_diag_j, P_diag_data, P_offd_i, P_offd_j, P_offd_data, fine_to_coarse_d ); } else { HYPRE_GPU_LAUNCH( hypre_BoomerAMGBuildDirInterp_getcoef_v2, gDim, bDim, n_fine, A_diag_i, A_diag_j, A_diag_data, A_offd_i, A_offd_j, A_offd_data, Soc_diag_j, Soc_offd_j, CF_marker, CF_marker_offd, num_functions, dof_func, dof_func_offd, P_diag_i, P_diag_j, P_diag_data, P_offd_i, P_offd_j, P_offd_data, fine_to_coarse_d ); } /* !!!! Free them here */ /* hypre_TFree(hypre_ParCSRMatrixSocDiagJ(S), HYPRE_MEMORY_DEVICE); hypre_TFree(hypre_ParCSRMatrixSocOffdJ(S), HYPRE_MEMORY_DEVICE); */ #if defined(HYPRE_USING_SYCL) HYPRE_ONEDPL_CALL(std::replace, CF_marker, CF_marker + n_fine, -3, -1); #else HYPRE_THRUST_CALL(replace, CF_marker, CF_marker + n_fine, -3, -1); #endif /* 5. Construct the result as a ParCSRMatrix. At this point, P's column indices */ /* are defined with A's enumeration of columns */ P = hypre_ParCSRMatrixCreate(comm, hypre_ParCSRMatrixGlobalNumRows(A), total_global_cpts, hypre_ParCSRMatrixColStarts(A), num_cpts_global, num_cols_A_offd, P_diag_size, P_offd_size); P_diag = hypre_ParCSRMatrixDiag(P); hypre_CSRMatrixData(P_diag) = P_diag_data; hypre_CSRMatrixI(P_diag) = P_diag_i; hypre_CSRMatrixJ(P_diag) = P_diag_j; P_offd = hypre_ParCSRMatrixOffd(P); hypre_CSRMatrixData(P_offd) = P_offd_data; hypre_CSRMatrixI(P_offd) = P_offd_i; hypre_CSRMatrixJ(P_offd) = P_offd_j; hypre_CSRMatrixMemoryLocation(P_diag) = memory_location; hypre_CSRMatrixMemoryLocation(P_offd) = memory_location; /* 6. Compress P, removing coefficients smaller than trunc_factor * Max, and */ /* make sure no row has more than max_elmts elements */ if (trunc_factor != 0.0 || max_elmts > 0) { hypre_BoomerAMGInterpTruncationDevice(P, trunc_factor, max_elmts); } /* 7. Translate P_offd's column indices from the values inherited from A_offd to a 0,1,2,3,... enumeration, */ /* and construct the col_map array that translates these into the global 0..c-1 enumeration */ /* Array P_marker has length equal to the number of A's offd columns+1, and will */ /* store a translation code from A_offd's local column numbers to P_offd's local column numbers */ HYPRE_Int *P_colids; HYPRE_Int *P_colids_h = NULL; hypre_CSRMatrixCompressColumnsDevice(P_offd, NULL, &P_colids, NULL); P_colids_h = hypre_TAlloc(HYPRE_Int, hypre_CSRMatrixNumCols(P_offd), HYPRE_MEMORY_HOST); hypre_TMemcpy(P_colids_h, P_colids, HYPRE_Int, hypre_CSRMatrixNumCols(P_offd), HYPRE_MEMORY_HOST, HYPRE_MEMORY_DEVICE); hypre_TFree(P_colids, HYPRE_MEMORY_DEVICE); /* 8. P_offd_j now has a 0,1,2,3... local column index enumeration. */ /* tmp_map_offd contains the index mapping from P's offd local columns to A's offd local columns.*/ /* Below routine is in parcsr_ls/par_rap_communication.c. It sets col_map_offd in P, */ /* comm_pkg in P, and perhaps more members of P ??? */ fine_to_coarse_h = hypre_TAlloc(HYPRE_Int, n_fine, HYPRE_MEMORY_HOST); hypre_TMemcpy(fine_to_coarse_h, fine_to_coarse_d, HYPRE_Int, n_fine, HYPRE_MEMORY_HOST, HYPRE_MEMORY_DEVICE); hypre_ParCSRMatrixColMapOffd(P) = hypre_CTAlloc(HYPRE_BigInt, hypre_CSRMatrixNumCols(P_offd), HYPRE_MEMORY_HOST); hypre_GetCommPkgRTFromCommPkgA(P, A, fine_to_coarse_h, P_colids_h); *P_ptr = P; hypre_TFree(CF_marker_offd, HYPRE_MEMORY_DEVICE); hypre_TFree(dof_func_offd, HYPRE_MEMORY_DEVICE); hypre_TFree(int_buf_data, HYPRE_MEMORY_DEVICE); hypre_TFree(fine_to_coarse_d, HYPRE_MEMORY_DEVICE); hypre_TFree(fine_to_coarse_h, HYPRE_MEMORY_HOST); hypre_TFree(P_colids_h, HYPRE_MEMORY_HOST); return hypre_error_flag; } /*-----------------------------------------------------------------------*/ __global__ void hypre_BoomerAMGBuildDirInterp_getnnz( hypre_DeviceItem &item, HYPRE_Int nr_of_rows, HYPRE_Int *S_diag_i, HYPRE_Int *S_diag_j, HYPRE_Int *S_offd_i, HYPRE_Int *S_offd_j, HYPRE_Int *CF_marker, HYPRE_Int *CF_marker_offd, HYPRE_Int num_functions, HYPRE_Int *dof_func, HYPRE_Int *dof_func_offd, HYPRE_Int *P_diag_i, HYPRE_Int *P_offd_i) { /*-----------------------------------------------------------------------*/ /* Determine size of interpolation matrix, P If A is of size m x m, then P will be of size m x c where c is the number of coarse points. It is assumed that S have the same global column enumeration as A Input: nr_of_rows - Number of rows in matrix (local in processor) S_diag_i, S_diag_j - CSR representation of S_diag S_offd_i, S_offd_j - CSR representation of S_offd num_function - Number of degrees of freedom per grid point dof_func - vector of length nr_of_rows, indicating the degree of freedom of vector element. dof_func_offd - vector over ncols of A_offd, indicating the degree of freedom. Output: P_diag_i - Vector where P_diag_i[i] holds the number of non-zero elements of P_diag on row i. P_offd_i - Vector where P_offd_i[i] holds the number of non-zero elements of P_offd on row i. fine_to_coarse - Vector of length nr_of_rows. fine_to_coarse[i] is set to 1 if i is a coarse pt. Eventually, fine_to_coarse[j] will map A's column j to a re-enumerated column index in matrix P. */ /*-----------------------------------------------------------------------*/ HYPRE_Int i = hypre_gpu_get_grid_warp_id<1, 1>(item); if (i >= nr_of_rows) { return; } HYPRE_Int p = 0, q = 0, dof_func_i = 0; HYPRE_Int jPd = 0, jPo = 0; HYPRE_Int lane = hypre_gpu_get_lane_id<1>(item); if (lane == 0) { p = read_only_load(CF_marker + i); } p = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, p, 0); /*-------------------------------------------------------------------- * If i is a C-point, interpolation is the identity. *--------------------------------------------------------------------*/ if (p >= 0) { if (lane == 0) { P_diag_i[i] = 1; P_offd_i[i] = 0; } return; } /*-------------------------------------------------------------------- * If i is an F-point, interpolation is from the C-points that * strongly influence i. *--------------------------------------------------------------------*/ if (num_functions > 1 && dof_func != NULL) { if (lane == 0) { dof_func_i = read_only_load(&dof_func[i]); } dof_func_i = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, dof_func_i, 0); } /* diag part */ if (lane < 2) { p = read_only_load(S_diag_i + i + lane); } q = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, p, 1); p = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, p, 0); for (HYPRE_Int j = p + lane; warp_any_sync(item, HYPRE_WARP_FULL_MASK, j < q); j += HYPRE_WARP_SIZE) { if (j < q) { const HYPRE_Int col = read_only_load(&S_diag_j[j]); if ( read_only_load(&CF_marker[col]) > 0 && (num_functions == 1 || read_only_load(&dof_func[col]) == dof_func_i) ) { jPd++; } } } jPd = warp_reduce_sum(item, jPd); /* offd part */ if (lane < 2) { p = read_only_load(S_offd_i + i + lane); } q = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, p, 1); p = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, p, 0); for (HYPRE_Int j = p + lane; warp_any_sync(item, HYPRE_WARP_FULL_MASK, j < q); j += HYPRE_WARP_SIZE) { if (j < q) { const HYPRE_Int tmp = read_only_load(&S_offd_j[j]); const HYPRE_Int col = tmp; if ( read_only_load(&CF_marker_offd[col]) > 0 && (num_functions == 1 || read_only_load(&dof_func_offd[col]) == dof_func_i) ) { jPo++; } } } jPo = warp_reduce_sum(item, jPo); if (lane == 0) { P_diag_i[i] = jPd; P_offd_i[i] = jPo; } } /*-----------------------------------------------------------------------* *-----------------------------------------------------------------------*/ __global__ void hypre_BoomerAMGBuildDirInterp_getcoef( hypre_DeviceItem &item, HYPRE_Int nr_of_rows, HYPRE_Int *A_diag_i, HYPRE_Int *A_diag_j, HYPRE_Real *A_diag_data, HYPRE_Int *A_offd_i, HYPRE_Int *A_offd_j, HYPRE_Real *A_offd_data, HYPRE_Int *Soc_diag_j, HYPRE_Int *Soc_offd_j, HYPRE_Int *CF_marker, HYPRE_Int *CF_marker_offd, HYPRE_Int num_functions, HYPRE_Int *dof_func, HYPRE_Int *dof_func_offd, HYPRE_Int *P_diag_i, HYPRE_Int *P_diag_j, HYPRE_Real *P_diag_data, HYPRE_Int *P_offd_i, HYPRE_Int *P_offd_j, HYPRE_Real *P_offd_data, HYPRE_Int *fine_to_coarse ) { /*-----------------------------------------------------------------------*/ /* Compute interpolation matrix, P Input: nr_of_rows - Number of rows in matrix (local in processor) A_diag_i, A_diag_j, A_diag_data - CSR representation of A_diag A_offd_i, A_offd_j, A_offd_data - CSR representation of A_offd S_diag_i, S_diag_j - CSR representation of S_diag S_offd_i, S_offd_j - CSR representation of S_offd CF_marker - Coarse/Fine flags for indices (rows) in this processor CF_marker_offd - Coarse/Fine flags for indices (rows) not in this processor num_function - Number of degrees of freedom per grid point dof_func - vector over nonzero elements of A_diag, indicating the degree of freedom dof_func_offd - vector over nonzero elements of A_offd, indicating the degree of freedom fine_to_coarse - Vector of length nr_of_rows-1. Output: P_diag_j - Column indices in CSR representation of P_diag P_diag_data - Matrix elements in CSR representation of P_diag P_offd_j - Column indices in CSR representation of P_offd P_offd_data - Matrix elements in CSR representation of P_diag */ /*-----------------------------------------------------------------------*/ HYPRE_Int i = hypre_gpu_get_grid_warp_id<1, 1>(item); if (i >= nr_of_rows) { return; } HYPRE_Int lane = hypre_gpu_get_lane_id<1>(item); HYPRE_Int k = 0, dof_func_i = 0; if (lane == 0) { k = read_only_load(CF_marker + i); } k = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, k, 0); /*-------------------------------------------------------------------- * If i is a C-point, interpolation is the identity. *--------------------------------------------------------------------*/ if (k > 0) { if (lane == 0) { const HYPRE_Int ind = read_only_load(&P_diag_i[i]); P_diag_j[ind] = read_only_load(&fine_to_coarse[i]); P_diag_data[ind] = 1.0; } return; } /*-------------------------------------------------------------------- * Point is f-point, use direct interpolation *--------------------------------------------------------------------*/ if (num_functions > 1 && dof_func != NULL) { if (lane == 0) { dof_func_i = read_only_load(&dof_func[i]); } dof_func_i = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, dof_func_i, 0); } HYPRE_Real diagonal = 0.0, sum_N_pos = 0.0, sum_N_neg = 0.0, sum_P_pos = 0.0, sum_P_neg = 0.0; /* diag part */ HYPRE_Int p_diag_A = 0, q_diag_A, p_diag_P = 0, q_diag_P; if (lane < 2) { p_diag_A = read_only_load(A_diag_i + i + lane); p_diag_P = read_only_load(P_diag_i + i + lane); } q_diag_A = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, p_diag_A, 1); p_diag_A = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, p_diag_A, 0); q_diag_P = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, p_diag_P, 1); p_diag_P = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, p_diag_P, 0); k = p_diag_P; for (HYPRE_Int j = p_diag_A + lane; warp_any_sync(item, HYPRE_WARP_FULL_MASK, j < q_diag_A); j += HYPRE_WARP_SIZE) { HYPRE_Int col, sum, pos; HYPRE_Int is_SC = 0; /* if is a Strong-C */ HYPRE_Complex val; if (j < q_diag_A) { col = read_only_load(&A_diag_j[j]); if (i == col) { diagonal = read_only_load(&A_diag_data[j]); } else if ( num_functions == 1 || read_only_load(&dof_func[col]) == dof_func_i ) { val = read_only_load(&A_diag_data[j]); if (val > 0.0) { sum_N_pos += val; } else { sum_N_neg += val; } is_SC = read_only_load(&Soc_diag_j[j]) > -1 && read_only_load(&CF_marker[col]) > 0; if (is_SC) { if (val > 0.0) { sum_P_pos += val; } else { sum_P_neg += val; } } } } pos = warp_prefix_sum(item, lane, is_SC, sum); if (is_SC) { P_diag_data[k + pos] = val; P_diag_j[k + pos] = read_only_load(&fine_to_coarse[col]); } k += sum; } hypre_device_assert(k == q_diag_P); /* offd part */ HYPRE_Int p_offd_A = 0, q_offd_A, p_offd_P = 0, q_offd_P; if (lane < 2) { p_offd_A = read_only_load(A_offd_i + i + lane); p_offd_P = read_only_load(P_offd_i + i + lane); } q_offd_A = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, p_offd_A, 1); p_offd_A = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, p_offd_A, 0); q_offd_P = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, p_offd_P, 1); p_offd_P = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, p_offd_P, 0); k = p_offd_P; for (HYPRE_Int j = p_offd_A + lane; warp_any_sync(item, HYPRE_WARP_FULL_MASK, j < q_offd_A); j += HYPRE_WARP_SIZE) { HYPRE_Int col, sum, pos; HYPRE_Int is_SC = 0; /* if is a Strong-C */ HYPRE_Complex val; if (j < q_offd_A) { col = read_only_load(&A_offd_j[j]); if ( num_functions == 1 || read_only_load(&dof_func_offd[col]) == dof_func_i ) { val = read_only_load(&A_offd_data[j]); if (val > 0.0) { sum_N_pos += val; } else { sum_N_neg += val; } is_SC = read_only_load(&Soc_offd_j[j]) > -1 && read_only_load(&CF_marker_offd[col]) > 0; if (is_SC) { if (val > 0.0) { sum_P_pos += val; } else { sum_P_neg += val; } } } } pos = warp_prefix_sum(item, lane, is_SC, sum); if (is_SC) { P_offd_data[k + pos] = val; P_offd_j[k + pos] = col; } k += sum; } hypre_device_assert(k == q_offd_P); diagonal = warp_allreduce_sum(item, diagonal); sum_N_pos = warp_allreduce_sum(item, sum_N_pos); sum_N_neg = warp_allreduce_sum(item, sum_N_neg); sum_P_pos = warp_allreduce_sum(item, sum_P_pos); sum_P_neg = warp_allreduce_sum(item, sum_P_neg); HYPRE_Complex alfa = 1.0, beta = 1.0; if (sum_P_neg) { alfa = sum_N_neg / (sum_P_neg * diagonal); } if (sum_P_pos) { beta = sum_N_pos / (sum_P_pos * diagonal); } for (HYPRE_Int j = p_diag_P + lane; warp_any_sync(item, HYPRE_WARP_FULL_MASK, j < q_diag_P); j += HYPRE_WARP_SIZE) { /* if (P_diag_data[j] > 0.0) P_diag_data[j] *= -beta; else P_diag_data[j] *= -alfa; */ if (j < q_diag_P) { P_diag_data[j] *= (P_diag_data[j] > 0.0) * (alfa - beta) - alfa; } } for (HYPRE_Int j = p_offd_P + lane; warp_any_sync(item, HYPRE_WARP_FULL_MASK, j < q_offd_P); j += HYPRE_WARP_SIZE) { /* if (P_offd_data[indp]> 0) P_offd_data[indp] *= -beta; else P_offd_data[indp] *= -alfa; */ if (j < q_offd_P) { P_offd_data[j] *= (P_offd_data[j] > 0.0) * (alfa - beta) - alfa; } } } /*-----------------------------------------------------------------------* *-----------------------------------------------------------------------*/ __global__ void hypre_BoomerAMGBuildDirInterp_getcoef_v2( hypre_DeviceItem &item, HYPRE_Int nr_of_rows, HYPRE_Int *A_diag_i, HYPRE_Int *A_diag_j, HYPRE_Real *A_diag_data, HYPRE_Int *A_offd_i, HYPRE_Int *A_offd_j, HYPRE_Real *A_offd_data, HYPRE_Int *Soc_diag_j, HYPRE_Int *Soc_offd_j, HYPRE_Int *CF_marker, HYPRE_Int *CF_marker_offd, HYPRE_Int num_functions, HYPRE_Int *dof_func, HYPRE_Int *dof_func_offd, HYPRE_Int *P_diag_i, HYPRE_Int *P_diag_j, HYPRE_Real *P_diag_data, HYPRE_Int *P_offd_i, HYPRE_Int *P_offd_j, HYPRE_Real *P_offd_data, HYPRE_Int *fine_to_coarse ) { /*-----------------------------------------------------------------------*/ /* Compute interpolation matrix, P Input: nr_of_rows - Number of rows in matrix (local in processor) A_diag_i, A_diag_j, A_diag_data - CSR representation of A_diag A_offd_i, A_offd_j, A_offd_data - CSR representation of A_offd S_diag_i, S_diag_j - CSR representation of S_diag S_offd_i, S_offd_j - CSR representation of S_offd CF_marker - Coarse/Fine flags for indices (rows) in this processor CF_marker_offd - Coarse/Fine flags for indices (rows) not in this processor num_function - Number of degrees of freedom per grid point dof_func - vector over nonzero elements of A_diag, indicating the degree of freedom dof_func_offd - vector over nonzero elements of A_offd, indicating the degree of freedom fine_to_coarse - Vector of length nr_of_rows-1. Output: P_diag_j - Column indices in CSR representation of P_diag P_diag_data - Matrix elements in CSR representation of P_diag P_offd_j - Column indices in CSR representation of P_offd P_offd_data - Matrix elements in CSR representation of P_diag */ /*-----------------------------------------------------------------------*/ HYPRE_Int i = hypre_gpu_get_grid_warp_id<1, 1>(item); if (i >= nr_of_rows) { return; } HYPRE_Int lane = hypre_gpu_get_lane_id<1>(item); HYPRE_Int k = 0, dof_func_i = 0; if (lane == 0) { k = read_only_load(CF_marker + i); } k = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, k, 0); /*-------------------------------------------------------------------- * If i is a C-point, interpolation is the identity. *--------------------------------------------------------------------*/ if (k > 0) { if (lane == 0) { const HYPRE_Int ind = read_only_load(&P_diag_i[i]); P_diag_j[ind] = read_only_load(&fine_to_coarse[i]); P_diag_data[ind] = 1.0; } return; } /*-------------------------------------------------------------------- * Point is f-point, use direct interpolation *--------------------------------------------------------------------*/ if (num_functions > 1 && dof_func != NULL) { if (lane == 0) { dof_func_i = read_only_load(&dof_func[i]); } dof_func_i = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, dof_func_i, 0); } HYPRE_Real diagonal = 0.0, sum_F = 0.0; /* diag part */ HYPRE_Int p_diag_A = 0, q_diag_A, p_diag_P = 0, q_diag_P; if (lane < 2) { p_diag_A = read_only_load(A_diag_i + i + lane); p_diag_P = read_only_load(P_diag_i + i + lane); } q_diag_A = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, p_diag_A, 1); p_diag_A = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, p_diag_A, 0); q_diag_P = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, p_diag_P, 1); p_diag_P = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, p_diag_P, 0); k = p_diag_P; for (HYPRE_Int j = p_diag_A + lane; warp_any_sync(item, HYPRE_WARP_FULL_MASK, j < q_diag_A); j += HYPRE_WARP_SIZE) { HYPRE_Int col, sum, pos; HYPRE_Int is_SC = 0; /* if is a Strong-C */ HYPRE_Complex val; if (j < q_diag_A) { col = read_only_load(&A_diag_j[j]); if (i == col) { diagonal = read_only_load(&A_diag_data[j]); } else if ( num_functions == 1 || read_only_load(&dof_func[col]) == dof_func_i ) { val = read_only_load(&A_diag_data[j]); if (read_only_load(&Soc_diag_j[j]) > -1) { if (read_only_load(&CF_marker[col]) > 0) { is_SC = 1; } else { sum_F += val; } } else { diagonal += val; } } } pos = warp_prefix_sum(item, lane, is_SC, sum); if (is_SC) { P_diag_data[k + pos] = val; P_diag_j[k + pos] = read_only_load(&fine_to_coarse[col]); } k += sum; } hypre_device_assert(k == q_diag_P); /* offd part */ HYPRE_Int p_offd_A = 0, q_offd_A, p_offd_P = 0, q_offd_P; if (lane < 2) { p_offd_A = read_only_load(A_offd_i + i + lane); p_offd_P = read_only_load(P_offd_i + i + lane); } q_offd_A = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, p_offd_A, 1); p_offd_A = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, p_offd_A, 0); q_offd_P = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, p_offd_P, 1); p_offd_P = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, p_offd_P, 0); k = p_offd_P; for (HYPRE_Int j = p_offd_A + lane; warp_any_sync(item, HYPRE_WARP_FULL_MASK, j < q_offd_A); j += HYPRE_WARP_SIZE) { HYPRE_Int col, sum, pos; HYPRE_Int is_SC = 0; /* if is a Strong-C */ HYPRE_Complex val; if (j < q_offd_A) { col = read_only_load(&A_offd_j[j]); if ( num_functions == 1 || read_only_load(&dof_func_offd[col]) == dof_func_i ) { val = read_only_load(&A_offd_data[j]); if (read_only_load(&Soc_offd_j[j]) > -1) { if (read_only_load(&CF_marker_offd[col]) > 0) { is_SC = 1; } else { sum_F += val; } } else { diagonal += val; } } } pos = warp_prefix_sum(item, lane, is_SC, sum); if (is_SC) { P_offd_data[k + pos] = val; P_offd_j[k + pos] = col; } k += sum; } hypre_device_assert(k == q_offd_P); diagonal = warp_allreduce_sum(item, diagonal); sum_F = warp_allreduce_sum(item, sum_F); HYPRE_Complex beta = sum_F / (q_diag_P - p_diag_P + q_offd_P - p_offd_P); for (HYPRE_Int j = p_diag_P + lane; warp_any_sync(item, HYPRE_WARP_FULL_MASK, j < q_diag_P); j += HYPRE_WARP_SIZE) { /* if (P_diag_data[j] > 0.0) P_diag_data[j] *= -beta; else P_diag_data[j] *= -alfa; */ if (j < q_diag_P) { P_diag_data[j] = -(P_diag_data[j] + beta) / diagonal; } } for (HYPRE_Int j = p_offd_P + lane; warp_any_sync(item, HYPRE_WARP_FULL_MASK, j < q_offd_P); j += HYPRE_WARP_SIZE) { /* if (P_offd_data[indp]> 0) P_offd_data[indp] *= -beta; else P_offd_data[indp] *= -alfa; */ if (j < q_offd_P) { P_offd_data[j] = -(P_offd_data[j] + beta) / diagonal; } } } HYPRE_Int hypre_BoomerAMGBuildInterpOnePntDevice( hypre_ParCSRMatrix *A, HYPRE_Int *CF_marker, hypre_ParCSRMatrix *S, HYPRE_BigInt *num_cpts_global, HYPRE_Int num_functions, HYPRE_Int *dof_func, HYPRE_Int debug_flag, hypre_ParCSRMatrix **P_ptr) { HYPRE_UNUSED_VAR(num_cpts_global); HYPRE_UNUSED_VAR(num_functions); HYPRE_UNUSED_VAR(dof_func); HYPRE_UNUSED_VAR(debug_flag); MPI_Comm comm = hypre_ParCSRMatrixComm(A); hypre_ParCSRCommPkg *comm_pkg = hypre_ParCSRMatrixCommPkg(A); hypre_ParCSRCommHandle *comm_handle; hypre_CSRMatrix *A_diag = hypre_ParCSRMatrixDiag(A); HYPRE_Int *A_diag_i = hypre_CSRMatrixI(A_diag); HYPRE_Int *A_strong_diag_j = hypre_ParCSRMatrixSocDiagJ(S); HYPRE_Complex *A_diag_a = hypre_CSRMatrixData(A_diag); hypre_CSRMatrix *A_offd = hypre_ParCSRMatrixOffd(A); HYPRE_Int *A_offd_i = hypre_CSRMatrixI(A_offd); HYPRE_Int *A_strong_offd_j = hypre_ParCSRMatrixSocOffdJ(S); HYPRE_Complex *A_offd_a = hypre_CSRMatrixData(A_offd); HYPRE_Int num_cols_A_offd = hypre_CSRMatrixNumCols(A_offd); /* Interpolation matrix P */ hypre_ParCSRMatrix *P; /* csr's */ hypre_CSRMatrix *P_diag; hypre_CSRMatrix *P_offd; /* arrays */ HYPRE_Real *P_diag_data; HYPRE_Int *P_diag_i; HYPRE_Int *P_diag_j; HYPRE_Int *P_diag_j_temp; HYPRE_Int *P_diag_j_temp_compressed; HYPRE_Real *P_offd_data; HYPRE_Int *P_offd_i; HYPRE_Int *P_offd_j; HYPRE_Int *P_offd_j_temp; HYPRE_Int *P_offd_j_temp_compressed; HYPRE_Int num_cols_P_offd; HYPRE_BigInt *col_map_offd_P = NULL; HYPRE_BigInt *col_map_offd_P_device = NULL; /* CF marker off-diag part */ HYPRE_Int *CF_marker_offd = NULL; /* nnz */ HYPRE_Int nnz_diag, nnz_offd; /* local size */ HYPRE_Int n_fine = hypre_CSRMatrixNumRows(A_diag); /* fine to coarse mapping: diag part and offd part */ HYPRE_Int *fine_to_coarse; HYPRE_BigInt *fine_to_coarse_offd = NULL; HYPRE_BigInt total_global_cpts, my_first_cpt; HYPRE_Int my_id, num_procs; HYPRE_Int num_sends; HYPRE_Int *int_buf_data = NULL; HYPRE_BigInt *big_int_buf_data = NULL; //HYPRE_Int col_start = hypre_ParCSRMatrixFirstRowIndex(A); //HYPRE_Int col_end = col_start + n_fine; /* arrays for compressing P_diag and P_offd col indices and data */ HYPRE_Int *diag_compress_marker; HYPRE_Int *offd_compress_marker; hypre_MPI_Comm_size(comm, &num_procs); hypre_MPI_Comm_rank(comm, &my_id); my_first_cpt = num_cpts_global[0]; if (my_id == (num_procs - 1)) { total_global_cpts = num_cpts_global[1]; } hypre_MPI_Bcast(&total_global_cpts, 1, HYPRE_MPI_BIG_INT, num_procs - 1, comm); /* fine to coarse mapping */ fine_to_coarse = hypre_TAlloc(HYPRE_Int, n_fine, HYPRE_MEMORY_DEVICE); #if defined(HYPRE_USING_SYCL) HYPRE_ONEDPL_CALL( std::exclusive_scan, oneapi::dpl::make_transform_iterator(CF_marker, is_nonnegative()), oneapi::dpl::make_transform_iterator(CF_marker + n_fine, is_nonnegative()), fine_to_coarse, HYPRE_Int(0) ); /* *MUST* pass init value since input and output types diff. */ #else HYPRE_THRUST_CALL( exclusive_scan, thrust::make_transform_iterator(CF_marker, is_nonnegative()), thrust::make_transform_iterator(CF_marker + n_fine, is_nonnegative()), fine_to_coarse, HYPRE_Int(0) ); /* *MUST* pass init value since input and output types diff. */ #endif /*------------------------------------------------------------------- * Get the CF_marker data for the off-processor columns *-------------------------------------------------------------------*/ if (num_cols_A_offd) { CF_marker_offd = hypre_CTAlloc(HYPRE_Int, num_cols_A_offd, HYPRE_MEMORY_DEVICE); } /* if CommPkg of A is not present, create it */ if (!comm_pkg) { hypre_MatvecCommPkgCreate(A); comm_pkg = hypre_ParCSRMatrixCommPkg(A); } /* number of sends to do (number of procs) */ num_sends = hypre_ParCSRCommPkgNumSends(comm_pkg); /* send buffer, of size send_map_starts[num_sends]), * i.e., number of entries to send */ int_buf_data = hypre_CTAlloc(HYPRE_Int, hypre_ParCSRCommPkgSendMapStart(comm_pkg, num_sends), HYPRE_MEMORY_DEVICE); /* copy CF markers of elements to send to buffer */ #if defined(HYPRE_USING_SYCL) hypreSycl_gather( hypre_ParCSRCommPkgDeviceSendMapElmts(comm_pkg), hypre_ParCSRCommPkgDeviceSendMapElmts(comm_pkg) + hypre_ParCSRCommPkgSendMapStart(comm_pkg, num_sends), CF_marker, int_buf_data ); #else HYPRE_THRUST_CALL( gather, hypre_ParCSRCommPkgDeviceSendMapElmts(comm_pkg), hypre_ParCSRCommPkgDeviceSendMapElmts(comm_pkg) + hypre_ParCSRCommPkgSendMapStart(comm_pkg, num_sends), CF_marker, int_buf_data ); #endif #if defined(HYPRE_USING_THRUST_NOSYNC) /* RL: make sure int_buf_data is ready before issuing GPU-GPU MPI */ if (hypre_GetGpuAwareMPI()) { hypre_ForceSyncComputeStream(); } #endif /* create a handle to start communication. 11: for integer */ comm_handle = hypre_ParCSRCommHandleCreate_v2(11, comm_pkg, HYPRE_MEMORY_DEVICE, int_buf_data, HYPRE_MEMORY_DEVICE, CF_marker_offd); /* destroy the handle to finish communication */ hypre_ParCSRCommHandleDestroy(comm_handle); hypre_TFree(int_buf_data, HYPRE_MEMORY_DEVICE); /*----------------------------------------------------------------------- * First Pass: Determine size of P and fill in fine_to_coarse mapping, * and find the most strongly influencing C-pt for each F-pt *-----------------------------------------------------------------------*/ P_diag_i = hypre_CTAlloc(HYPRE_Int, n_fine + 1, HYPRE_MEMORY_DEVICE); P_offd_i = hypre_CTAlloc(HYPRE_Int, n_fine + 1, HYPRE_MEMORY_DEVICE); diag_compress_marker = hypre_CTAlloc(HYPRE_Int, n_fine, HYPRE_MEMORY_DEVICE); offd_compress_marker = hypre_CTAlloc(HYPRE_Int, n_fine, HYPRE_MEMORY_DEVICE); /* Overallocate here and compress later */ P_diag_j_temp = hypre_CTAlloc(HYPRE_Int, n_fine, HYPRE_MEMORY_DEVICE); P_offd_j_temp = hypre_CTAlloc(HYPRE_Int, n_fine, HYPRE_MEMORY_DEVICE); dim3 bDim = hypre_GetDefaultDeviceBlockDimension(); dim3 gDim = hypre_GetDefaultDeviceGridDimension(n_fine, "warp", bDim); HYPRE_GPU_LAUNCH( hypre_BoomerAMGBuildInterpOnePnt_getnnz, gDim, bDim, n_fine, A_diag_i, A_strong_diag_j, A_diag_a, A_offd_i, A_strong_offd_j, A_offd_a, CF_marker, CF_marker_offd, diag_compress_marker, offd_compress_marker, P_diag_i, P_diag_j_temp, P_offd_i, P_offd_j_temp); /*----------------------------------------------------------------------- * Send and receive fine_to_coarse info. *-----------------------------------------------------------------------*/ fine_to_coarse_offd = hypre_CTAlloc(HYPRE_BigInt, num_cols_A_offd, HYPRE_MEMORY_DEVICE); big_int_buf_data = hypre_CTAlloc(HYPRE_BigInt, hypre_ParCSRCommPkgSendMapStart(comm_pkg, num_sends), HYPRE_MEMORY_DEVICE); #if defined(HYPRE_USING_SYCL) hypreSycl_gather( hypre_ParCSRCommPkgDeviceSendMapElmts(comm_pkg), hypre_ParCSRCommPkgDeviceSendMapElmts(comm_pkg) + hypre_ParCSRCommPkgSendMapStart(comm_pkg, num_sends), fine_to_coarse, big_int_buf_data ); HYPRE_ONEDPL_CALL( std::transform, big_int_buf_data, big_int_buf_data + hypre_ParCSRCommPkgSendMapStart(comm_pkg, num_sends), big_int_buf_data, [my_first_cpt = my_first_cpt] (const auto & x) { return x + my_first_cpt; } ); #else HYPRE_THRUST_CALL( gather, hypre_ParCSRCommPkgDeviceSendMapElmts(comm_pkg), hypre_ParCSRCommPkgDeviceSendMapElmts(comm_pkg) + hypre_ParCSRCommPkgSendMapStart(comm_pkg, num_sends), fine_to_coarse, big_int_buf_data ); HYPRE_THRUST_CALL( transform, big_int_buf_data, big_int_buf_data + hypre_ParCSRCommPkgSendMapStart(comm_pkg, num_sends), thrust::make_constant_iterator(my_first_cpt), big_int_buf_data, thrust::plus() ); #endif #if defined(HYPRE_USING_THRUST_NOSYNC) /* RL: make sure big_int_buf_data is ready before issuing GPU-GPU MPI */ if (hypre_GetGpuAwareMPI()) { hypre_ForceSyncComputeStream(); } #endif comm_handle = hypre_ParCSRCommHandleCreate_v2(21, comm_pkg, HYPRE_MEMORY_DEVICE, big_int_buf_data, HYPRE_MEMORY_DEVICE, fine_to_coarse_offd); hypre_ParCSRCommHandleDestroy(comm_handle); hypre_TFree(big_int_buf_data, HYPRE_MEMORY_DEVICE); /*----------------------------------------------------------------------- * Fill values and finish setting up P. *-----------------------------------------------------------------------*/ /* scan P_diag_i (which has number of nonzeros in each row) to get row indices */ hypreDevice_IntegerExclusiveScan(n_fine + 1, P_diag_i); hypreDevice_IntegerExclusiveScan(n_fine + 1, P_offd_i); /* get the number of nonzeros and allocate column index and data arrays */ hypre_TMemcpy(&nnz_diag, &P_diag_i[n_fine], HYPRE_Int, 1, HYPRE_MEMORY_HOST, HYPRE_MEMORY_DEVICE); hypre_TMemcpy(&nnz_offd, &P_offd_i[n_fine], HYPRE_Int, 1, HYPRE_MEMORY_HOST, HYPRE_MEMORY_DEVICE); P_diag_j = hypre_TAlloc(HYPRE_Int, nnz_diag, HYPRE_MEMORY_DEVICE); P_diag_data = hypre_TAlloc(HYPRE_Real, nnz_diag, HYPRE_MEMORY_DEVICE); P_offd_j = hypre_TAlloc(HYPRE_Int, nnz_offd, HYPRE_MEMORY_DEVICE); P_offd_data = hypre_TAlloc(HYPRE_Real, nnz_offd, HYPRE_MEMORY_DEVICE); /* set data values to 1.0 */ hypreDevice_ComplexFilln( P_diag_data, nnz_diag, 1.0 ); hypreDevice_ComplexFilln( P_offd_data, nnz_offd, 1.0 ); /* compress temporary column indices */ P_diag_j_temp_compressed = hypre_TAlloc(HYPRE_Int, nnz_diag, HYPRE_MEMORY_DEVICE); P_offd_j_temp_compressed = hypre_TAlloc(HYPRE_Int, nnz_offd, HYPRE_MEMORY_DEVICE); #if defined(HYPRE_USING_SYCL) hypreSycl_copy_if( P_diag_j_temp, P_diag_j_temp + n_fine, diag_compress_marker, P_diag_j_temp_compressed, equal(1) ); hypreSycl_copy_if( P_offd_j_temp, P_offd_j_temp + n_fine, offd_compress_marker, P_offd_j_temp_compressed, equal(1) ); /* map the diag column indices */ hypreSycl_gather( P_diag_j_temp_compressed, P_diag_j_temp_compressed + nnz_diag, fine_to_coarse, P_diag_j ); #else HYPRE_THRUST_CALL( copy_if, P_diag_j_temp, P_diag_j_temp + n_fine, diag_compress_marker, P_diag_j_temp_compressed, equal(1) ); HYPRE_THRUST_CALL( copy_if, P_offd_j_temp, P_offd_j_temp + n_fine, offd_compress_marker, P_offd_j_temp_compressed, equal(1) ); /* map the diag column indices */ HYPRE_THRUST_CALL( gather, P_diag_j_temp_compressed, P_diag_j_temp_compressed + nnz_diag, fine_to_coarse, P_diag_j ); #endif hypre_TFree(P_diag_j_temp_compressed, HYPRE_MEMORY_DEVICE); /* mark the offd indices for P as a subset of offd indices of A */ HYPRE_Int *mark_P_offd_idx = hypre_CTAlloc(HYPRE_Int, num_cols_A_offd, HYPRE_MEMORY_DEVICE); // note that scatter is usually not safe if the same index appears more than once in the map, // but here we are just scattering constant values, so this is safe #if defined(HYPRE_USING_SYCL) auto perm_iter = oneapi::dpl::make_permutation_iterator(mark_P_offd_idx, P_offd_j_temp_compressed); HYPRE_ONEDPL_CALL( std::transform, perm_iter, perm_iter + nnz_offd, perm_iter, [] (const auto & x) { return 1; } ); num_cols_P_offd = HYPRE_ONEDPL_CALL(std::reduce, mark_P_offd_idx, mark_P_offd_idx + num_cols_A_offd); #else HYPRE_THRUST_CALL( scatter, thrust::make_constant_iterator(1), thrust::make_constant_iterator(1) + nnz_offd, P_offd_j_temp_compressed, mark_P_offd_idx ); num_cols_P_offd = HYPRE_THRUST_CALL(reduce, mark_P_offd_idx, mark_P_offd_idx + num_cols_A_offd); #endif /* get a mapping from P offd indices to A offd indices */ /* offd_map_P_to_A[ P offd idx ] = A offd idx */ HYPRE_Int *offd_map_P_to_A = hypre_CTAlloc(HYPRE_Int, num_cols_P_offd, HYPRE_MEMORY_DEVICE); #if defined(HYPRE_USING_SYCL) oneapi::dpl::counting_iterator count(0); hypreSycl_copy_if( count, count + num_cols_A_offd, mark_P_offd_idx, offd_map_P_to_A, equal(1) ); #else HYPRE_THRUST_CALL( copy_if, thrust::make_counting_iterator(0), thrust::make_counting_iterator(num_cols_A_offd), mark_P_offd_idx, offd_map_P_to_A, equal(1) ); #endif hypre_TFree(mark_P_offd_idx, HYPRE_MEMORY_DEVICE); /* also get an inverse mapping from A offd indices to P offd indices */ /* offd_map_A_to_P[ A offd idx ] = -1 if not a P idx, else P offd idx */ HYPRE_Int *offd_map_A_to_P = hypre_TAlloc(HYPRE_Int, num_cols_A_offd, HYPRE_MEMORY_DEVICE); hypreDevice_IntFilln( offd_map_A_to_P, num_cols_A_offd, -1 ); #if defined(HYPRE_USING_SYCL) hypreSycl_scatter( count, count + num_cols_P_offd, offd_map_P_to_A, offd_map_A_to_P ); /* use inverse mapping above to map P_offd_j */ hypreSycl_gather( P_offd_j_temp_compressed, P_offd_j_temp_compressed + nnz_offd, offd_map_A_to_P, P_offd_j ); #else HYPRE_THRUST_CALL( scatter, thrust::make_counting_iterator(0), thrust::make_counting_iterator(num_cols_P_offd), offd_map_P_to_A, offd_map_A_to_P ); /* use inverse mapping above to map P_offd_j */ HYPRE_THRUST_CALL( gather, P_offd_j_temp_compressed, P_offd_j_temp_compressed + nnz_offd, offd_map_A_to_P, P_offd_j ); #endif hypre_TFree(P_offd_j_temp_compressed, HYPRE_MEMORY_DEVICE); hypre_TFree(offd_map_A_to_P, HYPRE_MEMORY_DEVICE); /* setup col_map_offd for P */ col_map_offd_P_device = hypre_CTAlloc(HYPRE_BigInt, num_cols_P_offd, HYPRE_MEMORY_DEVICE); col_map_offd_P = hypre_CTAlloc(HYPRE_BigInt, num_cols_P_offd, HYPRE_MEMORY_HOST); #if defined(HYPRE_USING_SYCL) hypreSycl_gather( offd_map_P_to_A, offd_map_P_to_A + num_cols_P_offd, fine_to_coarse_offd, col_map_offd_P_device); #else HYPRE_THRUST_CALL( gather, offd_map_P_to_A, offd_map_P_to_A + num_cols_P_offd, fine_to_coarse_offd, col_map_offd_P_device); #endif hypre_TMemcpy(col_map_offd_P, col_map_offd_P_device, HYPRE_BigInt, num_cols_P_offd, HYPRE_MEMORY_HOST, HYPRE_MEMORY_DEVICE); hypre_TFree(offd_map_P_to_A, HYPRE_MEMORY_DEVICE); hypre_TFree(col_map_offd_P_device, HYPRE_MEMORY_DEVICE); /* Now, we should have everything of Parcsr matrix P */ P = hypre_ParCSRMatrixCreate(comm, hypre_ParCSRMatrixGlobalNumCols(A), /* global num of rows */ total_global_cpts, /* global num of cols */ hypre_ParCSRMatrixColStarts(A), /* row_starts */ num_cpts_global, /* col_starts */ num_cols_P_offd, /* num cols offd */ nnz_diag, nnz_offd); P_diag = hypre_ParCSRMatrixDiag(P); hypre_CSRMatrixData(P_diag) = P_diag_data; hypre_CSRMatrixI(P_diag) = P_diag_i; hypre_CSRMatrixJ(P_diag) = P_diag_j; P_offd = hypre_ParCSRMatrixOffd(P); hypre_CSRMatrixData(P_offd) = P_offd_data; hypre_CSRMatrixI(P_offd) = P_offd_i; hypre_CSRMatrixJ(P_offd) = P_offd_j; hypre_ParCSRMatrixColMapOffd(P) = col_map_offd_P; /* create CommPkg of P */ hypre_MatvecCommPkgCreate(P); *P_ptr = P; /* free workspace */ hypre_TFree(CF_marker_offd, HYPRE_MEMORY_DEVICE); hypre_TFree(fine_to_coarse, HYPRE_MEMORY_DEVICE); hypre_TFree(fine_to_coarse_offd, HYPRE_MEMORY_DEVICE); hypre_TFree(diag_compress_marker, HYPRE_MEMORY_DEVICE); hypre_TFree(offd_compress_marker, HYPRE_MEMORY_DEVICE); hypre_TFree(P_diag_j_temp, HYPRE_MEMORY_DEVICE); hypre_TFree(P_offd_j_temp, HYPRE_MEMORY_DEVICE); return hypre_error_flag; } /*-----------------------------------------------------------------------*/ __global__ void hypre_BoomerAMGBuildInterpOnePnt_getnnz( hypre_DeviceItem &item, HYPRE_Int nr_of_rows, HYPRE_Int *A_diag_i, HYPRE_Int *A_strong_diag_j, HYPRE_Complex *A_diag_a, HYPRE_Int *A_offd_i, HYPRE_Int *A_strong_offd_j, HYPRE_Complex *A_offd_a, HYPRE_Int *CF_marker, HYPRE_Int *CF_marker_offd, HYPRE_Int *diag_compress_marker, HYPRE_Int *offd_compress_marker, HYPRE_Int *P_diag_i, HYPRE_Int *P_diag_j, HYPRE_Int *P_offd_i, HYPRE_Int *P_offd_j) { /*-----------------------------------------------------------------------*/ /* Determine size of interpolation matrix, P If A is of size m x m, then P will be of size m x c where c is the number of coarse points. It is assumed that S have the same global column enumeration as A Input: nr_of_rows - Number of rows in matrix (local in processor) A_diag_i, A_strong_diag_j, - Arrays associated with ParCSRMatrix A A_diag_a, A_offd_i, where the column indices are taken from S A_strong_offd_j, A_offd_a and mark weak connections with negative indices CF_maker - coarse/fine marker for on-processor points CF_maker_offd - coarse/fine marker for off-processor connections Output: P_diag_i - Vector where P_diag_i[i] holds the number of non-zero elements of P_diag on row i (will be 1). P_diag_i - Vector where P_diag_j[i] holds a temporary, uncompressed column indices for P_diag. P_offd_i - Vector where P_offd_i[i] holds the number of non-zero elements of P_offd on row i (will be 1). P_offd_i - Vector where P_offd_j[i] holds a temporary, uncompressed column indices for P_offd. diag_compress_marker - Array of 0s and 1s used to compress P_diag col indices and data. offd_compress_marker - Array of 0s and 1s used to compress P_offd col indices and data. */ /*-----------------------------------------------------------------------*/ HYPRE_Int i = hypre_gpu_get_grid_warp_id<1, 1>(item); if (i >= nr_of_rows) { return; } HYPRE_Int p = 0, q; HYPRE_Int max_j_diag = -1, max_j_offd = -1; HYPRE_Int lane = hypre_gpu_get_lane_id<1>(item); HYPRE_Real max_diag = -1.0, max_offd = -1.0; HYPRE_Real warp_max_diag = -1.0, warp_max_offd = -1.0; if (lane == 0) { p = read_only_load(CF_marker + i); } p = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, p, 0); /*-------------------------------------------------------------------- * If i is a C-point, interpolation is the identity. *--------------------------------------------------------------------*/ if (p >= 0) { if (lane == 0) { P_diag_i[i] = 1; P_diag_j[i] = i; diag_compress_marker[i] = 1; } return; } /*-------------------------------------------------------------------- * If i is an F-point, find strongest connected C-point, * which could be in diag or offd. *--------------------------------------------------------------------*/ /* diag part */ if (lane < 2) { p = read_only_load(A_diag_i + i + lane); } q = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, p, 1); p = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, p, 0); for (HYPRE_Int j = p + lane; j < q; j += HYPRE_WARP_SIZE) { /* column indices are negative for weak connections */ const HYPRE_Int col = read_only_load(&A_strong_diag_j[j]); if (col >= 0) { const HYPRE_Complex val = hypre_abs( read_only_load(&A_diag_a[j]) ); if ( read_only_load(&CF_marker[col]) > 0 && val > max_diag ) { max_diag = val; max_j_diag = col; } } } warp_max_diag = warp_allreduce_max(item, max_diag); /* offd part */ if (lane < 2) { p = read_only_load(A_offd_i + i + lane); } q = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, p, 1); p = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, p, 0); for (HYPRE_Int j = p + lane; j < q; j += HYPRE_WARP_SIZE) { const HYPRE_Int col = read_only_load(&A_strong_offd_j[j]); /* column indices are negative for weak connections */ if (col >= 0) { const HYPRE_Complex val = hypre_abs( read_only_load(&A_offd_a[j]) ); if ( read_only_load(&CF_marker_offd[col]) > 0 && val > max_offd ) { max_offd = val; max_j_offd = col; } } } warp_max_offd = warp_allreduce_max(item, max_offd); /*-------------------------------------------------------------------- * If no max found, then there is no strongly connected C-point, * and this will be a zero row *--------------------------------------------------------------------*/ if (warp_max_offd < 0 && warp_max_diag < 0) { return; } /*-------------------------------------------------------------------- * Otherwise, find the column index in either diag or offd *--------------------------------------------------------------------*/ if (warp_max_offd > warp_max_diag) { if (warp_max_offd != max_offd) { max_j_offd = -1; } max_j_offd = warp_reduce_max(item, max_j_offd); if (lane == 0) { P_offd_i[i] = 1; P_offd_j[i] = max_j_offd; offd_compress_marker[i] = 1; } } else { if (warp_max_diag != max_diag) { max_j_diag = -1; } max_j_diag = warp_reduce_max(item, max_j_diag); if (lane == 0) { P_diag_i[i] = 1; P_diag_j[i] = max_j_diag; diag_compress_marker[i] = 1; } } } #endif // defined(HYPRE_USING_GPU) hypre-2.33.0/src/parcsr_ls/par_interp_trunc_device.c000066400000000000000000000622401477326011500225600ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "_hypre_onedpl.hpp" #include "_hypre_parcsr_ls.h" #include "_hypre_utilities.hpp" #if defined(HYPRE_USING_GPU) #define HYPRE_INTERPTRUNC_ALGORITHM_SWITCH 8 /* special case for max_elmts = 0, i.e. no max_elmts limit */ __global__ void hypreGPUKernel_InterpTruncationPass0_v1( hypre_DeviceItem &item, HYPRE_Int nrows, HYPRE_Real trunc_factor, HYPRE_Int *P_diag_i, HYPRE_Int *P_diag_j, HYPRE_Real *P_diag_a, HYPRE_Int *P_offd_i, HYPRE_Int *P_offd_j, HYPRE_Real *P_offd_a, HYPRE_Int *P_diag_i_new, HYPRE_Int *P_offd_i_new ) { HYPRE_Real row_max = 0.0, row_sum = 0.0, row_scal = 0.0; HYPRE_Int row = hypre_gpu_get_grid_warp_id<1, 1>(item); if (row >= nrows) { return; } HYPRE_Int lane = hypre_gpu_get_lane_id<1>(item); HYPRE_Int p_diag = 0, q_diag = 0, p_offd = 0, q_offd = 0; if (lane < 2) { p_diag = read_only_load(P_diag_i + row + lane); p_offd = read_only_load(P_offd_i + row + lane); } q_diag = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, p_diag, 1); p_diag = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, p_diag, 0); q_offd = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, p_offd, 1); p_offd = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, p_offd, 0); /* 1. compute row rowsum, rowmax */ for (HYPRE_Int i = p_diag + lane; i < q_diag; i += HYPRE_WARP_SIZE) { HYPRE_Real v = P_diag_a[i]; row_sum += v; row_max = hypre_max(row_max, hypre_abs(v)); } for (HYPRE_Int i = p_offd + lane; i < q_offd; i += HYPRE_WARP_SIZE) { HYPRE_Real v = P_offd_a[i]; row_sum += v; row_max = hypre_max(row_max, hypre_abs(v)); } row_max = warp_allreduce_max(item, row_max) * trunc_factor; row_sum = warp_allreduce_sum(item, row_sum); HYPRE_Int cnt_diag = 0, cnt_offd = 0; /* 2. move wanted entries to the front and row scal */ for (HYPRE_Int i = p_diag + lane; warp_any_sync(item, HYPRE_WARP_FULL_MASK, i < q_diag); i += HYPRE_WARP_SIZE) { HYPRE_Real v = 0.0; HYPRE_Int j = -1; if (i < q_diag) { v = P_diag_a[i]; if (hypre_abs(v) >= row_max) { j = P_diag_j[i]; row_scal += v; } } HYPRE_Int sum, pos; pos = warp_prefix_sum(item, lane, (HYPRE_Int) (j != -1), sum); if (j != -1) { P_diag_a[p_diag + cnt_diag + pos] = v; P_diag_j[p_diag + cnt_diag + pos] = j; } cnt_diag += sum; } for (HYPRE_Int i = p_offd + lane; warp_any_sync(item, HYPRE_WARP_FULL_MASK, i < q_offd); i += HYPRE_WARP_SIZE) { HYPRE_Real v = 0.0; HYPRE_Int j = -1; if (i < q_offd) { v = P_offd_a[i]; if (hypre_abs(v) >= row_max) { j = P_offd_j[i]; row_scal += v; } } HYPRE_Int sum, pos; pos = warp_prefix_sum(item, lane, (HYPRE_Int) (j != -1), sum); if (j != -1) { P_offd_a[p_offd + cnt_offd + pos] = v; P_offd_j[p_offd + cnt_offd + pos] = j; } cnt_offd += sum; } row_scal = warp_allreduce_sum(item, row_scal); if (row_scal) { row_scal = row_sum / row_scal; } else { row_scal = 1.0; } /* 3. scale the row */ for (HYPRE_Int i = p_diag + lane; i < p_diag + cnt_diag; i += HYPRE_WARP_SIZE) { P_diag_a[i] *= row_scal; } for (HYPRE_Int i = p_offd + lane; i < p_offd + cnt_offd; i += HYPRE_WARP_SIZE) { P_offd_a[i] *= row_scal; } if (!lane) { P_diag_i_new[row] = cnt_diag; P_offd_i_new[row] = cnt_offd; } } static __device__ __forceinline__ void hypre_smallest_abs_val( HYPRE_Int n, HYPRE_Real *v, HYPRE_Real &min_v, HYPRE_Int &min_j ) { min_v = hypre_abs(v[0]); min_j = 0; for (HYPRE_Int j = 1; j < n; j++) { const HYPRE_Real vj = hypre_abs(v[j]); if (vj < min_v) { min_v = vj; min_j = j; } } } /* TODO: using 1 thread per row, which can be suboptimal */ __global__ void hypreGPUKernel_InterpTruncationPass1_v1( hypre_DeviceItem &item, #if defined(HYPRE_USING_SYCL) char *shmem_ptr, #endif HYPRE_Int nrows, HYPRE_Real trunc_factor, HYPRE_Int max_elmts, HYPRE_Int *P_diag_i, HYPRE_Int *P_diag_j, HYPRE_Real *P_diag_a, HYPRE_Int *P_offd_i, HYPRE_Int *P_offd_j, HYPRE_Real *P_offd_a, HYPRE_Int *P_diag_i_new, HYPRE_Int *P_offd_i_new ) { const HYPRE_Int row = hypre_gpu_get_grid_thread_id<1, 1>(item); if (row >= nrows) { return; } const HYPRE_Int p_diag = read_only_load(P_diag_i + row); const HYPRE_Int q_diag = read_only_load(P_diag_i + row + 1); const HYPRE_Int p_offd = read_only_load(P_offd_i + row); const HYPRE_Int q_offd = read_only_load(P_offd_i + row + 1); /* 1. get row max and compute truncation threshold, and compute row_sum */ HYPRE_Real row_max = 0.0, row_sum = 0.0; for (HYPRE_Int i = p_diag; i < q_diag; i++) { HYPRE_Real v = P_diag_a[i]; row_sum += v; row_max = hypre_max(row_max, hypre_abs(v)); } for (HYPRE_Int i = p_offd; i < q_offd; i++) { HYPRE_Real v = P_offd_a[i]; row_sum += v; row_max = hypre_max(row_max, hypre_abs(v)); } row_max *= trunc_factor; /* 2. save the largest max_elmts entries in sh_val/pos */ const HYPRE_Int nt = hypre_gpu_get_num_threads<1>(item); const HYPRE_Int tid = hypre_gpu_get_thread_id<1>(item); #if defined(HYPRE_USING_SYCL) HYPRE_Int *shared_mem = (HYPRE_Int*) shmem_ptr; #else extern __shared__ HYPRE_Int shared_mem[]; #endif HYPRE_Int *sh_pos = &shared_mem[tid * max_elmts]; HYPRE_Real *sh_val = &((HYPRE_Real *) &shared_mem[nt * max_elmts])[tid * max_elmts]; HYPRE_Int cnt = 0; for (HYPRE_Int i = p_diag; i < q_diag; i++) { const HYPRE_Real v = P_diag_a[i]; if (hypre_abs(v) < row_max) { continue; } if (cnt < max_elmts) { sh_val[cnt] = v; sh_pos[cnt ++] = i; } else { HYPRE_Real min_v; HYPRE_Int min_j; hypre_smallest_abs_val(max_elmts, sh_val, min_v, min_j); if (hypre_abs(v) > min_v) { sh_val[min_j] = v; sh_pos[min_j] = i; } } } for (HYPRE_Int i = p_offd; i < q_offd; i++) { const HYPRE_Real v = P_offd_a[i]; if (hypre_abs(v) < row_max) { continue; } if (cnt < max_elmts) { sh_val[cnt] = v; sh_pos[cnt ++] = i + q_diag; } else { HYPRE_Real min_v; HYPRE_Int min_j; hypre_smallest_abs_val(max_elmts, sh_val, min_v, min_j); if (hypre_abs(v) > min_v) { sh_val[min_j] = v; sh_pos[min_j] = i + q_diag; } } } /* 3. load actual j and compute row_scal */ HYPRE_Real row_scal = 0.0; for (HYPRE_Int i = 0; i < cnt; i++) { const HYPRE_Int j = sh_pos[i]; if (j < q_diag) { sh_pos[i] = P_diag_j[j]; } else { sh_pos[i] = -1 - P_offd_j[j - q_diag]; } row_scal += sh_val[i]; } if (row_scal) { row_scal = row_sum / row_scal; } else { row_scal = 1.0; } /* 4. write to P_diag_j and P_offd_j */ HYPRE_Int cnt_diag = 0; for (HYPRE_Int i = 0; i < cnt; i++) { const HYPRE_Int j = sh_pos[i]; if (j >= 0) { P_diag_j[p_diag + cnt_diag] = j; P_diag_a[p_diag + cnt_diag] = sh_val[i] * row_scal; cnt_diag ++; } else { P_offd_j[p_offd + i - cnt_diag] = -1 - j; P_offd_a[p_offd + i - cnt_diag] = sh_val[i] * row_scal; } } P_diag_i_new[row] = cnt_diag; P_offd_i_new[row] = cnt - cnt_diag; } /* using 1 warp per row */ __global__ void hypreGPUKernel_InterpTruncationPass2_v1( hypre_DeviceItem &item, HYPRE_Int nrows, HYPRE_Int *P_diag_i, HYPRE_Int *P_diag_j, HYPRE_Real *P_diag_a, HYPRE_Int *P_offd_i, HYPRE_Int *P_offd_j, HYPRE_Real *P_offd_a, HYPRE_Int *P_diag_i_new, HYPRE_Int *P_diag_j_new, HYPRE_Real *P_diag_a_new, HYPRE_Int *P_offd_i_new, HYPRE_Int *P_offd_j_new, HYPRE_Real *P_offd_a_new ) { HYPRE_Int i = hypre_gpu_get_grid_warp_id<1, 1>(item); if (i >= nrows) { return; } HYPRE_Int lane = hypre_gpu_get_lane_id<1>(item); HYPRE_Int p = 0, pnew = 0, qnew = 0, shift; if (lane < 2) { p = read_only_load(P_diag_i + i + lane); pnew = read_only_load(P_diag_i_new + i + lane); } p = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, p, 0); qnew = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, pnew, 1); pnew = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, pnew, 0); shift = p - pnew; for (HYPRE_Int k = pnew + lane; k < qnew; k += HYPRE_WARP_SIZE) { P_diag_j_new[k] = P_diag_j[k + shift]; P_diag_a_new[k] = P_diag_a[k + shift]; } if (lane < 2) { p = read_only_load(P_offd_i + i + lane); pnew = read_only_load(P_offd_i_new + i + lane); } p = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, p, 0); qnew = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, pnew, 1); pnew = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, pnew, 0); shift = p - pnew; for (HYPRE_Int k = pnew + lane; k < qnew; k += HYPRE_WARP_SIZE) { P_offd_j_new[k] = P_offd_j[k + shift]; P_offd_a_new[k] = P_offd_a[k + shift]; } } /* This is a "fast" version that works for small max_elmts values */ HYPRE_Int hypre_BoomerAMGInterpTruncationDevice_v1( hypre_ParCSRMatrix *P, HYPRE_Real trunc_factor, HYPRE_Int max_elmts ) { HYPRE_Int nrows = hypre_ParCSRMatrixNumRows(P); hypre_CSRMatrix *P_diag = hypre_ParCSRMatrixDiag(P); HYPRE_Int *P_diag_i = hypre_CSRMatrixI(P_diag); HYPRE_Int *P_diag_j = hypre_CSRMatrixJ(P_diag); HYPRE_Real *P_diag_a = hypre_CSRMatrixData(P_diag); hypre_CSRMatrix *P_offd = hypre_ParCSRMatrixOffd(P); HYPRE_Int *P_offd_i = hypre_CSRMatrixI(P_offd); HYPRE_Int *P_offd_j = hypre_CSRMatrixJ(P_offd); HYPRE_Real *P_offd_a = hypre_CSRMatrixData(P_offd); HYPRE_MemoryLocation memory_location = hypre_ParCSRMatrixMemoryLocation(P); HYPRE_Int *P_diag_i_new = hypre_TAlloc(HYPRE_Int, nrows + 1, memory_location); HYPRE_Int *P_offd_i_new = hypre_TAlloc(HYPRE_Int, nrows + 1, memory_location); /* truncate P, wanted entries are marked negative in P_diag/offd_j */ if (max_elmts == 0) { dim3 bDim = hypre_GetDefaultDeviceBlockDimension(); dim3 gDim = hypre_GetDefaultDeviceGridDimension(nrows, "warp", bDim); HYPRE_GPU_LAUNCH( hypreGPUKernel_InterpTruncationPass0_v1, gDim, bDim, nrows, trunc_factor, P_diag_i, P_diag_j, P_diag_a, P_offd_i, P_offd_j, P_offd_a, P_diag_i_new, P_offd_i_new); } else { dim3 bDim = hypre_dim3(256); dim3 gDim = hypre_GetDefaultDeviceGridDimension(nrows, "thread", bDim); #if defined(HYPRE_USING_SYCL) size_t shmem_bytes = bDim.get(2) * max_elmts * (sizeof(HYPRE_Int) + sizeof(HYPRE_Real)); #else size_t shmem_bytes = bDim.x * max_elmts * (sizeof(HYPRE_Int) + sizeof(HYPRE_Real)); #endif HYPRE_GPU_LAUNCH2( hypreGPUKernel_InterpTruncationPass1_v1, gDim, bDim, shmem_bytes, nrows, trunc_factor, max_elmts, P_diag_i, P_diag_j, P_diag_a, P_offd_i, P_offd_j, P_offd_a, P_diag_i_new, P_offd_i_new); } hypre_Memset(&P_diag_i_new[nrows], 0, sizeof(HYPRE_Int), memory_location); hypre_Memset(&P_offd_i_new[nrows], 0, sizeof(HYPRE_Int), memory_location); hypreDevice_IntegerExclusiveScan(nrows + 1, P_diag_i_new); hypreDevice_IntegerExclusiveScan(nrows + 1, P_offd_i_new); HYPRE_Int nnz_diag, nnz_offd; hypre_TMemcpy(&nnz_diag, &P_diag_i_new[nrows], HYPRE_Int, 1, HYPRE_MEMORY_HOST, memory_location); hypre_TMemcpy(&nnz_offd, &P_offd_i_new[nrows], HYPRE_Int, 1, HYPRE_MEMORY_HOST, memory_location); hypre_CSRMatrixNumNonzeros(P_diag) = nnz_diag; hypre_CSRMatrixNumNonzeros(P_offd) = nnz_offd; HYPRE_Int *P_diag_j_new = hypre_TAlloc(HYPRE_Int, nnz_diag, memory_location); HYPRE_Real *P_diag_a_new = hypre_TAlloc(HYPRE_Real, nnz_diag, memory_location); HYPRE_Int *P_offd_j_new = hypre_TAlloc(HYPRE_Int, nnz_offd, memory_location); HYPRE_Real *P_offd_a_new = hypre_TAlloc(HYPRE_Real, nnz_offd, memory_location); dim3 bDim = hypre_GetDefaultDeviceBlockDimension(); dim3 gDim = hypre_GetDefaultDeviceGridDimension(nrows, "warp", bDim); HYPRE_GPU_LAUNCH( hypreGPUKernel_InterpTruncationPass2_v1, gDim, bDim, nrows, P_diag_i, P_diag_j, P_diag_a, P_offd_i, P_offd_j, P_offd_a, P_diag_i_new, P_diag_j_new, P_diag_a_new, P_offd_i_new, P_offd_j_new, P_offd_a_new ); hypre_CSRMatrixI (P_diag) = P_diag_i_new; hypre_CSRMatrixJ (P_diag) = P_diag_j_new; hypre_CSRMatrixData(P_diag) = P_diag_a_new; hypre_CSRMatrixI (P_offd) = P_offd_i_new; hypre_CSRMatrixJ (P_offd) = P_offd_j_new; hypre_CSRMatrixData(P_offd) = P_offd_a_new; hypre_TFree(P_diag_i, memory_location); hypre_TFree(P_diag_j, memory_location); hypre_TFree(P_diag_a, memory_location); hypre_TFree(P_offd_i, memory_location); hypre_TFree(P_offd_j, memory_location); hypre_TFree(P_offd_a, memory_location); return hypre_error_flag; } __global__ void hypreGPUKernel_InterpTruncation_v2( hypre_DeviceItem &item, HYPRE_Int nrows, HYPRE_Real trunc_factor, HYPRE_Int max_elmts, HYPRE_Int *P_i, HYPRE_Int *P_j, HYPRE_Real *P_a) { HYPRE_Real row_max = 0.0, row_sum = 0.0, row_scal = 0.0; HYPRE_Int row = hypre_gpu_get_grid_warp_id<1, 1>(item); if (row >= nrows) { return; } HYPRE_Int lane = hypre_gpu_get_lane_id<1>(item), p = 0, q; /* 1. compute row max, rowsum */ if (lane < 2) { p = read_only_load(P_i + row + lane); } q = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, p, 1); p = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, p, 0); for (HYPRE_Int i = p + lane; i < q; i += HYPRE_WARP_SIZE) { HYPRE_Real v = read_only_load(&P_a[i]); row_max = hypre_max(row_max, hypre_abs(v)); row_sum += v; } row_max = warp_allreduce_max(item, row_max) * trunc_factor; row_sum = warp_allreduce_sum(item, row_sum); /* 2. mark dropped entries by -1 in P_j, and compute row_scal */ HYPRE_Int last_pos = -1; for (HYPRE_Int i = p + lane; warp_any_sync(item, HYPRE_WARP_FULL_MASK, i < q); i += HYPRE_WARP_SIZE) { HYPRE_Int cond = 0, cond_prev; cond_prev = i == p + lane || warp_allreduce_min(item, cond); if (i < q) { HYPRE_Real v; cond = cond_prev && (max_elmts == 0 || i < p + max_elmts); if (cond) { v = read_only_load(&P_a[i]); } cond = cond && hypre_abs(v) >= row_max; if (cond) { last_pos = i; row_scal += v; } else { P_j[i] = -1; } } } row_scal = warp_allreduce_sum(item, row_scal); if (row_scal) { row_scal = row_sum / row_scal; } else { row_scal = 1.0; } /* 3. scale the row */ for (HYPRE_Int i = p + lane; i <= last_pos; i += HYPRE_WARP_SIZE) { P_a[i] *= row_scal; } } /*------------------------------------------------------------------------------------ * RL: To be consistent with the CPU version, max_elmts == 0 means no limit on rownnz * This is a generic version that works for all max_elmts values */ HYPRE_Int hypre_BoomerAMGInterpTruncationDevice_v2( hypre_ParCSRMatrix *P, HYPRE_Real trunc_factor, HYPRE_Int max_elmts ) { hypre_CSRMatrix *P_diag = hypre_ParCSRMatrixDiag(P); HYPRE_Int *P_diag_i = hypre_CSRMatrixI(P_diag); HYPRE_Int *P_diag_j = hypre_CSRMatrixJ(P_diag); HYPRE_Real *P_diag_a = hypre_CSRMatrixData(P_diag); hypre_CSRMatrix *P_offd = hypre_ParCSRMatrixOffd(P); HYPRE_Int *P_offd_i = hypre_CSRMatrixI(P_offd); HYPRE_Int *P_offd_j = hypre_CSRMatrixJ(P_offd); HYPRE_Real *P_offd_a = hypre_CSRMatrixData(P_offd); //HYPRE_Int ncols = hypre_CSRMatrixNumCols(P_diag); HYPRE_Int nrows = hypre_CSRMatrixNumRows(P_diag); HYPRE_Int nnz_diag = hypre_CSRMatrixNumNonzeros(P_diag); HYPRE_Int nnz_offd = hypre_CSRMatrixNumNonzeros(P_offd); HYPRE_Int nnz_P = nnz_diag + nnz_offd; HYPRE_Int *P_i = hypre_TAlloc(HYPRE_Int, nnz_P, HYPRE_MEMORY_DEVICE); HYPRE_Int *P_j = hypre_TAlloc(HYPRE_Int, nnz_P, HYPRE_MEMORY_DEVICE); HYPRE_Real *P_a = hypre_TAlloc(HYPRE_Real, nnz_P, HYPRE_MEMORY_DEVICE); HYPRE_Int *P_rowptr = hypre_TAlloc(HYPRE_Int, nrows + 1, HYPRE_MEMORY_DEVICE); HYPRE_Int *tmp_rowid = hypre_TAlloc(HYPRE_Int, nnz_P, HYPRE_MEMORY_DEVICE); HYPRE_Int new_nnz_diag = 0, new_nnz_offd = 0; HYPRE_MemoryLocation memory_location = hypre_ParCSRMatrixMemoryLocation(P); hypreDevice_CsrRowPtrsToIndices_v2(nrows, nnz_diag, P_diag_i, P_i); hypreDevice_CsrRowPtrsToIndices_v2(nrows, nnz_offd, P_offd_i, P_i + nnz_diag); hypre_TMemcpy(P_j, P_diag_j, HYPRE_Int, nnz_diag, HYPRE_MEMORY_DEVICE, HYPRE_MEMORY_DEVICE); /* offd col id := -2 - offd col id */ #if defined(HYPRE_USING_SYCL) HYPRE_ONEDPL_CALL(std::transform, P_offd_j, P_offd_j + nnz_offd, P_j + nnz_diag, [] (const auto & x) {return -x - 2;} ); #else HYPRE_THRUST_CALL(transform, P_offd_j, P_offd_j + nnz_offd, P_j + nnz_diag, -_1 - 2); #endif hypre_TMemcpy(P_a, P_diag_a, HYPRE_Real, nnz_diag, HYPRE_MEMORY_DEVICE, HYPRE_MEMORY_DEVICE); hypre_TMemcpy(P_a + nnz_diag, P_offd_a, HYPRE_Real, nnz_offd, HYPRE_MEMORY_DEVICE, HYPRE_MEMORY_DEVICE); /* sort rows based on (rowind, abs(P_a)) */ hypreDevice_StableSortByTupleKey(nnz_P, P_i, P_a, P_j, 1); hypreDevice_CsrRowIndicesToPtrs_v2(nrows, nnz_P, P_i, P_rowptr); /* truncate P, unwanted entries are marked -1 in P_j */ dim3 bDim = hypre_GetDefaultDeviceBlockDimension(); dim3 gDim = hypre_GetDefaultDeviceGridDimension(nrows, "warp", bDim); HYPRE_GPU_LAUNCH( hypreGPUKernel_InterpTruncation_v2, gDim, bDim, nrows, trunc_factor, max_elmts, P_rowptr, P_j, P_a ); /* build new P_diag and P_offd */ if (nnz_diag) { #if defined(HYPRE_USING_SYCL) auto new_end = hypreSycl_copy_if( oneapi::dpl::make_zip_iterator(P_i, P_j, P_a), oneapi::dpl::make_zip_iterator(P_i + nnz_P, P_j + nnz_P, P_a + nnz_P), P_j, oneapi::dpl::make_zip_iterator(tmp_rowid, P_diag_j, P_diag_a), is_nonnegative() ); new_nnz_diag = std::get<0>(new_end.base()) - tmp_rowid; #else auto new_end = HYPRE_THRUST_CALL( copy_if, thrust::make_zip_iterator(thrust::make_tuple(P_i, P_j, P_a)), thrust::make_zip_iterator(thrust::make_tuple(P_i + nnz_P, P_j + nnz_P, P_a + nnz_P)), P_j, thrust::make_zip_iterator(thrust::make_tuple(tmp_rowid, P_diag_j, P_diag_a)), is_nonnegative() ); new_nnz_diag = thrust::get<0>(new_end.get_iterator_tuple()) - tmp_rowid; #endif hypre_assert(new_nnz_diag <= nnz_diag); hypreDevice_CsrRowIndicesToPtrs_v2(nrows, new_nnz_diag, tmp_rowid, P_diag_i); } if (nnz_offd) { less_than pred(-1); #if defined(HYPRE_USING_SYCL) auto new_end = hypreSycl_copy_if( oneapi::dpl::make_zip_iterator(P_i, P_j, P_a), oneapi::dpl::make_zip_iterator(P_i + nnz_P, P_j + nnz_P, P_a + nnz_P), P_j, oneapi::dpl::make_zip_iterator(tmp_rowid, P_offd_j, P_offd_a), pred ); new_nnz_offd = std::get<0>(new_end.base()) - tmp_rowid; #else auto new_end = HYPRE_THRUST_CALL( copy_if, thrust::make_zip_iterator(thrust::make_tuple(P_i, P_j, P_a)), thrust::make_zip_iterator(thrust::make_tuple(P_i + nnz_P, P_j + nnz_P, P_a + nnz_P)), P_j, thrust::make_zip_iterator(thrust::make_tuple(tmp_rowid, P_offd_j, P_offd_a)), pred ); new_nnz_offd = thrust::get<0>(new_end.get_iterator_tuple()) - tmp_rowid; #endif hypre_assert(new_nnz_offd <= nnz_offd); #if defined(HYPRE_USING_SYCL) HYPRE_ONEDPL_CALL(std::transform, P_offd_j, P_offd_j + new_nnz_offd, P_offd_j, [] (const auto & x) {return -x - 2;} ); #else HYPRE_THRUST_CALL(transform, P_offd_j, P_offd_j + new_nnz_offd, P_offd_j, -_1 - 2); #endif hypreDevice_CsrRowIndicesToPtrs_v2(nrows, new_nnz_offd, tmp_rowid, P_offd_i); } hypre_CSRMatrixJ (P_diag) = hypre_TReAlloc_v2(P_diag_j, HYPRE_Int, nnz_diag, HYPRE_Int, new_nnz_diag, memory_location); hypre_CSRMatrixData(P_diag) = hypre_TReAlloc_v2(P_diag_a, HYPRE_Real, nnz_diag, HYPRE_Real, new_nnz_diag, memory_location); hypre_CSRMatrixJ (P_offd) = hypre_TReAlloc_v2(P_offd_j, HYPRE_Int, nnz_offd, HYPRE_Int, new_nnz_offd, memory_location); hypre_CSRMatrixData(P_offd) = hypre_TReAlloc_v2(P_offd_a, HYPRE_Real, nnz_offd, HYPRE_Real, new_nnz_offd, memory_location); hypre_CSRMatrixNumNonzeros(P_diag) = new_nnz_diag; hypre_CSRMatrixNumNonzeros(P_offd) = new_nnz_offd; hypre_TFree(P_i, HYPRE_MEMORY_DEVICE); hypre_TFree(P_j, HYPRE_MEMORY_DEVICE); hypre_TFree(P_a, HYPRE_MEMORY_DEVICE); hypre_TFree(P_rowptr, HYPRE_MEMORY_DEVICE); hypre_TFree(tmp_rowid, HYPRE_MEMORY_DEVICE); return hypre_error_flag; } HYPRE_Int hypre_BoomerAMGInterpTruncationDevice( hypre_ParCSRMatrix *P, HYPRE_Real trunc_factor, HYPRE_Int max_elmts ) { #ifdef HYPRE_PROFILE hypre_profile_times[HYPRE_TIMER_ID_INTERP_TRUNC] -= hypre_MPI_Wtime(); #endif hypre_GpuProfilingPushRange("Interp-Truncation"); if (max_elmts <= HYPRE_INTERPTRUNC_ALGORITHM_SWITCH) { hypre_BoomerAMGInterpTruncationDevice_v1(P, trunc_factor, max_elmts); } else { hypre_BoomerAMGInterpTruncationDevice_v2(P, trunc_factor, max_elmts); } hypre_GpuProfilingPopRange(); #ifdef HYPRE_PROFILE hypre_profile_times[HYPRE_TIMER_ID_INTERP_TRUNC] += hypre_MPI_Wtime(); #endif return hypre_error_flag; } #endif /* #if defined(HYPRE_USING_GPU) */ hypre-2.33.0/src/parcsr_ls/par_jacobi_interp.c000066400000000000000000000560751477326011500213460ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "_hypre_parcsr_ls.h" #include "par_amg.h" /* #define HYPRE_JACINT_PRINT_ROW_SUMS*/ /* #define HYPRE_JACINT_PRINT_SOME_ROWS */ /* #define HYPRE_JACINT_PRINT_MATRICES*/ #define HYPRE_MAX_PRINTABLE_MATRIX 125 /*#define HYPRE_JACINT_PRINT_DIAGNOSTICS*/ void hypre_BoomerAMGJacobiInterp( hypre_ParCSRMatrix * A, hypre_ParCSRMatrix ** P, hypre_ParCSRMatrix * S, HYPRE_Int num_functions, HYPRE_Int * dof_func, HYPRE_Int * CF_marker, HYPRE_Int level, HYPRE_Real truncation_threshold, HYPRE_Real truncation_threshold_minus ) /* nji steps of Jacobi interpolation, with nji presently just set in the code.*/ { HYPRE_Real weight_AF = 1.0; /* weight multiplied by A's fine row elements */ HYPRE_Int * dof_func_offd = NULL; HYPRE_Int nji = 1; HYPRE_Int iji; hypre_ParCSRMatrix_dof_func_offd( A, num_functions, dof_func, &dof_func_offd ); for ( iji = 0; iji < nji; ++iji ) { hypre_BoomerAMGJacobiInterp_1( A, P, S, CF_marker, level, truncation_threshold, truncation_threshold_minus, dof_func, dof_func_offd, weight_AF ); } if ( dof_func_offd != NULL ) { hypre_TFree( dof_func_offd, HYPRE_MEMORY_HOST); } } void hypre_BoomerAMGJacobiInterp_1( hypre_ParCSRMatrix * A, hypre_ParCSRMatrix ** P, hypre_ParCSRMatrix * S, HYPRE_Int * CF_marker, HYPRE_Int level, HYPRE_Real truncation_threshold, HYPRE_Real truncation_threshold_minus, HYPRE_Int * dof_func, HYPRE_Int * dof_func_offd, HYPRE_Real weight_AF) /* One step of Jacobi interpolation: A is the linear system. P is an interpolation matrix, input and output CF_marker identifies coarse and fine points If we imagine P and A as split into coarse and fine submatrices, [ AFF AFC ] [ AF ] [ IFC ] A = [ ] = [ ] , P = [ ] [ ACF ACC ] [ AC ] [ ICC ] (note that ICC is an identity matrix, applied to coarse points only) then this function computes IFCnew = IFCold - DFF(-1) * ( AFF*IFCold + AFC ) = IFCold - DFF(-1) * AF * Pold) where DFF is the diagonal of AFF, (-1) represents the inverse, and where "old" denotes a value on entry to this function, "new" a returned value. */ { HYPRE_UNUSED_VAR(S); HYPRE_UNUSED_VAR(level); hypre_ParCSRMatrix * Pnew; hypre_ParCSRMatrix * C; hypre_CSRMatrix *P_diag = hypre_ParCSRMatrixDiag(*P); /*hypre_CSRMatrix *P_offd = hypre_ParCSRMatrixOffd(*P); HYPRE_Real *P_diag_data = hypre_CSRMatrixData(P_diag);*/ HYPRE_Int *P_diag_i = hypre_CSRMatrixI(P_diag); /*HYPRE_Int *P_diag_j = hypre_CSRMatrixJ(P_diag); HYPRE_Real *P_offd_data = hypre_CSRMatrixData(P_offd); HYPRE_Int *P_offd_i = hypre_CSRMatrixI(P_offd); hypre_CSRMatrix *C_diag; hypre_CSRMatrix *C_offd; hypre_CSRMatrix *Pnew_diag; hypre_CSRMatrix *Pnew_offd;*/ HYPRE_Int num_rows_diag_P = hypre_CSRMatrixNumRows(P_diag); HYPRE_Int i; /*HYPRE_Int Jnochanges=0, Jchanges, Pnew_num_nonzeros*/; #ifdef HYPRE_JACINT_PRINT_DIAGNOSTICS HYPRE_Int CF_coarse = 0; HYPRE_Int nc1; #endif HYPRE_Int * J_marker = hypre_CTAlloc( HYPRE_Int, num_rows_diag_P, HYPRE_MEMORY_HOST); HYPRE_Int nc, ncmax, ncmin; HYPRE_Int num_procs, my_id; MPI_Comm comm = hypre_ParCSRMatrixComm( A ); #ifdef HYPRE_JACINT_PRINT_ROW_SUMS HYPRE_Int m, nmav, npav; HYPRE_Real PIi, PIimax, PIimin, PIimav, PIipav, randthresh; HYPRE_Real eps = 1.0e-17; #endif #ifdef HYPRE_JACINT_PRINT_MATRICES char filename[80]; HYPRE_Int i_dummy, j_dummy; HYPRE_Int *base_i_ptr = &i_dummy; HYPRE_Int *base_j_ptr = &j_dummy; #endif #ifdef HYPRE_JACINT_PRINT_SOME_ROWS HYPRE_Int sample_rows[50], n_sample_rows = 0, isamp; #endif hypre_MPI_Comm_size(comm, &num_procs); hypre_MPI_Comm_rank(comm, &my_id); for ( i = 0; i < num_rows_diag_P; ++i ) { J_marker[i] = CF_marker[i]; #ifdef HYPRE_JACINT_PRINT_DIAGNOSTICS if (CF_marker[i] >= 0) { ++CF_coarse; } #endif } #ifdef HYPRE_JACINT_PRINT_DIAGNOSTICS hypre_printf("%i %i Jacobi_Interp_1, P has %i+%i=%i nonzeros, local sum %e\n", my_id, level, hypre_CSRMatrixNumNonzeros(P_diag), hypre_CSRMatrixNumNonzeros(P_offd), hypre_CSRMatrixNumNonzeros(P_diag) + hypre_CSRMatrixNumNonzeros(P_offd), hypre_ParCSRMatrixLocalSumElts(*P) ); #endif /* row sum computations, for output */ #ifdef HYPRE_JACINT_PRINT_ROW_SUMS PIimax = -1.0e12, PIimin = 1.0e12, PIimav = 0, PIipav = 0; nmav = 0, npav = 0; for ( i = 0; i < num_rows_diag_P; ++i ) { PIi = 0; /* i-th value of P*1, i.e. sum of row i of P */ for ( m = P_diag_i[i]; m < P_diag_i[i + 1]; ++m ) { PIi += P_diag_data[m]; } for ( m = P_offd_i[i]; m < P_offd_i[i + 1]; ++m ) { PIi += P_offd_data[m]; } if (CF_marker[i] < 0) { PIimax = hypre_max( PIimax, PIi ); PIimin = hypre_min( PIimin, PIi ); if (PIi <= 1 - eps) { PIimav += PIi; ++nmav; }; if (PIi >= 1 + eps) { PIipav += PIi; ++npav; }; } } if ( nmav > 0 ) { PIimav = PIimav / nmav; } if ( npav > 0 ) { PIipav = PIipav / npav; } hypre_printf("%i %i P in max,min row sums %e %e\n", my_id, level, PIimax, PIimin ); #endif ncmax = 0; ncmin = num_rows_diag_P; #ifdef HYPRE_JACINT_PRINT_DIAGNOSTICS nc1 = 0; #endif for ( i = 0; i < num_rows_diag_P; ++i ) if (CF_marker[i] < 0) { nc = P_diag_i[i + 1] - P_diag_i[i]; #ifdef HYPRE_JACINT_PRINT_DIAGNOSTICS if (nc <= 1) { ++nc1; } #endif ncmax = hypre_max( nc, ncmax ); ncmin = hypre_min( nc, ncmin ); } #if 0 /* a very agressive reduction in how much the Jacobi step does: */ for ( i = 0; i < num_rows_diag_P; ++i ) if (CF_marker[i] < 0) { nc = P_diag_i[i + 1] - P_diag_i[i]; if (nc > ncmin + 1) /*if ( nc > ncmin + 0.5*(ncmax-ncmin) )*/ { J_marker[i] = 1; ++Jnochanges; } } #endif #ifdef HYPRE_JACINT_PRINT_SOME_ROWS Jchanges = num_rows_diag_P - Jnochanges - CF_coarse; hypre_printf("some rows to be changed: "); randthresh = 15 / (HYPRE_Real)Jchanges; for ( i = 0; i < num_rows_diag_P; ++i ) { if ( J_marker[i] < 0 ) { if ( ((HYPRE_Real)hypre_Rand()) < randthresh ) { hypre_printf( "%i: ", i ); for ( m = P_diag_i[i]; m < P_diag_i[i + 1]; ++m ) { hypre_printf( " %i %f, ", P_diag_j[m], P_diag_data[m] ); } hypre_printf("; "); sample_rows[n_sample_rows] = i; ++n_sample_rows; } } } hypre_printf("\n"); #endif #ifdef HYPRE_JACINT_PRINT_DIAGNOSTICS hypre_printf("%i %i P has %i rows, %i changeable, %i don't change-good, %i coarse\n", my_id, level, num_rows_diag_P, Jchanges, Jnochanges, CF_coarse ); hypre_printf("%i %i min,max diag cols per row: %i, %i; no.rows w.<=1 col: %i\n", my_id, level, ncmin, ncmax, nc1 ); #endif #ifdef HYPRE_JACINT_PRINT_MATRICES if ( num_rows_diag_P <= HYPRE_MAX_PRINTABLE_MATRIX ) { hypre_sprintf( filename, "Ain%i", level ); hypre_ParCSRMatrixPrintIJ( A, 0, 0, filename); hypre_sprintf( filename, "Sin%i", level ); hypre_ParCSRMatrixPrintIJ( S, 0, 0, filename); hypre_sprintf( filename, "Pin%i", level ); hypre_ParCSRMatrixPrintIJ( *P, 0, 0, filename); } #endif C = hypre_ParMatmul_FC( A, *P, J_marker, dof_func, dof_func_offd ); /* hypre_parMatmul_FC creates and returns C, a variation of the matrix product A*P in which only the "Fine"-designated rows have been computed. (all columns are Coarse because all columns of P are). "Fine" is defined solely by the marker array, and for example could be a proper subset of the fine points of a multigrid hierarchy. As a matrix, C is the size of A*P. But only the marked rows have been computed. */ #ifdef HYPRE_JACINT_PRINT_MATRICES hypre_sprintf( filename, "C%i", level ); if ( num_rows_diag_P <= HYPRE_MAX_PRINTABLE_MATRIX ) { hypre_ParCSRMatrixPrintIJ( C, 0, 0, filename); } #endif #ifdef HYPRE_JACINT_PRINT_DIAGNOSTICS C_diag = hypre_ParCSRMatrixDiag(C); C_offd = hypre_ParCSRMatrixOffd(C); hypre_printf("%i %i Jacobi_Interp_1 after matmul, C has %i+%i=%i nonzeros, local sum %e\n", my_id, level, hypre_CSRMatrixNumNonzeros(C_diag), hypre_CSRMatrixNumNonzeros(C_offd), hypre_CSRMatrixNumNonzeros(C_diag) + hypre_CSRMatrixNumNonzeros(C_offd), hypre_ParCSRMatrixLocalSumElts(C) ); #endif hypre_ParMatScaleDiagInv_F( C, A, weight_AF, J_marker ); /* hypre_ParMatScaleDiagInv scales of its first argument by premultiplying with a submatrix of the inverse of the diagonal of its second argument. The marker array determines which diagonal elements are used. The marker array should select exactly the right number of diagonal elements (the number of rows of AP_FC). */ #ifdef HYPRE_JACINT_PRINT_MATRICES hypre_sprintf( filename, "Cout%i", level ); if ( num_rows_diag_P <= HYPRE_MAX_PRINTABLE_MATRIX ) { hypre_ParCSRMatrixPrintIJ( C, 0, 0, filename); } #endif Pnew = hypre_ParMatMinus_F( *P, C, J_marker ); /* hypre_ParMatMinus_F subtracts rows of its second argument from selected rows of its first argument. The marker array determines which rows of the first argument are affected, and they should exactly correspond to all the rows of the second argument. */ #ifdef HYPRE_JACINT_PRINT_DIAGNOSTICS Pnew_diag = hypre_ParCSRMatrixDiag(Pnew); Pnew_offd = hypre_ParCSRMatrixOffd(Pnew); Pnew_num_nonzeros = hypre_CSRMatrixNumNonzeros(Pnew_diag) + hypre_CSRMatrixNumNonzeros(Pnew_offd); hypre_printf("%i %i Jacobi_Interp_1 after MatMinus, Pnew has %i+%i=%i nonzeros, local sum %e\n", my_id, level, hypre_CSRMatrixNumNonzeros(Pnew_diag), hypre_CSRMatrixNumNonzeros(Pnew_offd), Pnew_num_nonzeros, hypre_ParCSRMatrixLocalSumElts(Pnew) ); #endif hypre_ParCSRMatrixDestroy( C ); hypre_ParCSRMatrixDestroy( *P ); /* Note that I'm truncating all the fine rows, not just the J-marked ones. */ #if 0 if ( Pnew_num_nonzeros < 10000 ) /* a fixed number like this makes it no.procs.-depdendent */ { /* ad-hoc attempt to reduce zero-matrix problems seen in testing..*/ truncation_threshold = 1.0e-6 * truncation_threshold; truncation_threshold_minus = 1.0e-6 * truncation_threshold_minus; } #endif hypre_BoomerAMGTruncateInterp( Pnew, truncation_threshold, truncation_threshold_minus, CF_marker ); hypre_MatvecCommPkgCreate ( Pnew ); *P = Pnew; P_diag = hypre_ParCSRMatrixDiag(*P); P_diag_i = hypre_CSRMatrixI(P_diag); /* row sum computations, for output */ #ifdef HYPRE_JACINT_PRINT_ROW_SUMS P_offd = hypre_ParCSRMatrixOffd(*P); P_diag_data = hypre_CSRMatrixData(P_diag); P_diag_j = hypre_CSRMatrixJ(P_diag); P_offd_data = hypre_CSRMatrixData(P_offd); P_offd_i = hypre_CSRMatrixI(P_offd); PIimax = -1.0e12, PIimin = 1.0e12, PIimav = 0, PIipav = 0; nmav = 0, npav = 0; for ( i = 0; i < num_rows_diag_P; ++i ) { PIi = 0; /* i-th value of P*1, i.e. sum of row i of P */ for ( m = P_diag_i[i]; m < P_diag_i[i + 1]; ++m ) { PIi += P_diag_data[m]; } for ( m = P_offd_i[i]; m < P_offd_i[i + 1]; ++m ) { PIi += P_offd_data[m]; } if (CF_marker[i] < 0) { PIimax = hypre_max( PIimax, PIi ); PIimin = hypre_min( PIimin, PIi ); if (PIi <= 1 - eps) { PIimav += PIi; ++nmav; }; if (PIi >= 1 + eps) { PIipav += PIi; ++npav; }; } } if ( nmav > 0 ) { PIimav = PIimav / nmav; } if ( npav > 0 ) { PIipav = PIipav / npav; } hypre_printf("%i %i P out max,min row sums %e %e\n", my_id, level, PIimax, PIimin ); #endif #ifdef HYPRE_JACINT_PRINT_SOME_ROWS hypre_printf("some changed rows: "); for ( isamp = 0; isamp < n_sample_rows; ++isamp ) { i = sample_rows[isamp]; hypre_printf( "%i: ", i ); for ( m = P_diag_i[i]; m < P_diag_i[i + 1]; ++m ) { hypre_printf( " %i %f, ", P_diag_j[m], P_diag_data[m] ); } hypre_printf("; "); } hypre_printf("\n"); #endif ncmax = 0; ncmin = num_rows_diag_P; #ifdef HYPRE_JACINT_PRINT_DIAGNOSTICS nc1 = 0; #endif for ( i = 0; i < num_rows_diag_P; ++i ) if (CF_marker[i] < 0) { nc = P_diag_i[i + 1] - P_diag_i[i]; #ifdef HYPRE_JACINT_PRINT_DIAGNOSTICS if (nc <= 1) { ++nc1; } #endif ncmax = hypre_max( nc, ncmax ); ncmin = hypre_min( nc, ncmin ); } #ifdef HYPRE_JACINT_PRINT_DIAGNOSTICS hypre_printf("%i %i P has %i rows, %i changeable, %i too good, %i coarse\n", my_id, level, num_rows_diag_P, num_rows_diag_P - Jnochanges - CF_coarse, Jnochanges, CF_coarse ); hypre_printf("%i %i min,max diag cols per row: %i, %i; no.rows w.<=1 col: %i\n", my_id, level, ncmin, ncmax, nc1 ); hypre_printf("%i %i Jacobi_Interp_1 after truncation (%e), Pnew has %i+%i=%i nonzeros, local sum %e\n", my_id, level, truncation_threshold, hypre_CSRMatrixNumNonzeros(Pnew_diag), hypre_CSRMatrixNumNonzeros(Pnew_offd), hypre_CSRMatrixNumNonzeros(Pnew_diag) + hypre_CSRMatrixNumNonzeros(Pnew_offd), hypre_ParCSRMatrixLocalSumElts(Pnew) ); #endif /* Programming Notes: 1. Judging by around line 299 of par_interp.c, they typical use of CF_marker is that CF_marker>=0 means Coarse, CF_marker<0 means Fine. */ #ifdef HYPRE_JACINT_PRINT_MATRICES hypre_sprintf( filename, "Pout%i", level ); if ( num_rows_diag_P <= HYPRE_MAX_PRINTABLE_MATRIX ) { hypre_ParCSRMatrixPrintIJ( *P, 0, 0, filename); } #endif hypre_TFree( J_marker, HYPRE_MEMORY_HOST); } void hypre_BoomerAMGTruncateInterp( hypre_ParCSRMatrix *P, HYPRE_Real eps, HYPRE_Real dlt, HYPRE_Int * CF_marker ) /* Truncate the interpolation matrix P, but only in rows for which the marker is <0. Truncation means that an element P(i,j) is set to 0 if P(i,j)>0 and P(i,j)0 and P(i,j)dlt*min( -P(i,j) ) or if P(i,j)<0 and P(i,j)>eps*min( P(i,j) ) ( 00 as recommended by Klaus Stuben, thus as this function does. In this function, only "marked" rows are affected. Lastly, in hypre_BoomerAMGInterpTruncation, if any element gets discarded, it reallocates arrays to the new size. */ { hypre_CSRMatrix *P_diag = hypre_ParCSRMatrixDiag(P); hypre_CSRMatrix *P_offd = hypre_ParCSRMatrixOffd(P); HYPRE_Real *P_diag_data = hypre_CSRMatrixData(P_diag); HYPRE_Int *P_diag_i = hypre_CSRMatrixI(P_diag); HYPRE_Int *P_diag_j = hypre_CSRMatrixJ(P_diag); HYPRE_Real *P_offd_data = hypre_CSRMatrixData(P_offd); HYPRE_Int *P_offd_i = hypre_CSRMatrixI(P_offd); HYPRE_Int *P_offd_j = hypre_CSRMatrixJ(P_offd); HYPRE_Int *new_P_diag_i; HYPRE_Int *new_P_offd_i; HYPRE_Int num_rows_diag_P = hypre_CSRMatrixNumRows(P_diag); HYPRE_Int num_rows_offd_P = hypre_CSRMatrixNumRows(P_offd); HYPRE_Int num_nonzeros_diag = hypre_CSRMatrixNumNonzeros(P_diag); HYPRE_Int num_nonzeros_offd = hypre_CSRMatrixNumNonzeros(P_offd); #if 0 MPI_Comm comm = hypre_ParCSRMatrixComm( P ); HYPRE_Real vmax1, vmin1; #endif HYPRE_Real vmax = 0.0; HYPRE_Real vmin = 0.0; HYPRE_Real v, old_sum, new_sum, scale, wmax, wmin; HYPRE_Int i1, m, m1d, m1o; /* compute vmax = eps*max(P(i,j)), vmin = eps*min(P(i,j)) */ for ( i1 = 0; i1 < num_rows_diag_P; i1++ ) { for ( m = P_diag_i[i1]; m < P_diag_i[i1 + 1]; ++m ) { v = P_diag_data[m]; vmax = hypre_max( v, vmax ); vmin = hypre_min( v, vmin ); } for ( m = P_offd_i[i1]; m < P_offd_i[i1 + 1]; ++m ) { v = P_offd_data[m]; vmax = hypre_max( v, vmax ); vmin = hypre_min( v, vmin ); } } #if 0 /* This can make max,min global so results don't depend on no. processors We don't want this except for testing, or maybe this could be put someplace better. I don't like adding communication here, for a minor reason. */ vmax1 = vmax; vmin1 = vmin; hypre_MPI_Allreduce( &vmax1, &vmax, 1, HYPRE_MPI_REAL, hypre_MPI_MAX, comm ); hypre_MPI_Allreduce( &vmin1, &vmin, 1, HYPRE_MPI_REAL, hypre_MPI_MIN, comm ); #endif if ( vmax <= 0.0 ) { vmax = 1.0; } /* make sure no v is v>vmax if no v is v>0 */ if ( vmin >= 0.0 ) { vmin = -1.0; } /* make sure no v is v=0) are always kept. The arrays are not re-allocated, so there will generally be unused space at the ends of the arrays. */ new_P_diag_i = hypre_CTAlloc( HYPRE_Int, num_rows_diag_P + 1, HYPRE_MEMORY_HOST); new_P_offd_i = hypre_CTAlloc( HYPRE_Int, num_rows_offd_P + 1, HYPRE_MEMORY_HOST); m1d = P_diag_i[0]; m1o = P_offd_i[0]; for ( i1 = 0; i1 < num_rows_diag_P; i1++ ) { old_sum = 0; new_sum = 0; for ( m = P_diag_i[i1]; m < P_diag_i[i1 + 1]; ++m ) { v = P_diag_data[m]; old_sum += v; if ( CF_marker[i1] >= 0 || ( v >= vmax && v >= wmax ) || ( v <= vmin && v <= wmin ) ) { /* keep v */ new_sum += v; P_diag_j[m1d] = P_diag_j[m]; P_diag_data[m1d] = P_diag_data[m]; ++m1d; } else { /* discard v */ --num_nonzeros_diag; } } for ( m = P_offd_i[i1]; m < P_offd_i[i1 + 1]; ++m ) { v = P_offd_data[m]; old_sum += v; if ( CF_marker[i1] >= 0 || ( v >= vmax && v >= wmax ) || ( v <= vmin && v <= wmin ) ) { /* keep v */ new_sum += v; P_offd_j[m1o] = P_offd_j[m]; P_offd_data[m1o] = P_offd_data[m]; ++m1o; } else { /* discard v */ --num_nonzeros_offd; } } new_P_diag_i[i1 + 1] = m1d; if ( i1 < num_rows_offd_P ) { new_P_offd_i[i1 + 1] = m1o; } /* rescale to keep row sum the same */ if (new_sum != 0) { scale = old_sum / new_sum; } else { scale = 1.0; } for ( m = new_P_diag_i[i1]; m < new_P_diag_i[i1 + 1]; ++m ) { P_diag_data[m] *= scale; } if ( i1 < num_rows_offd_P ) /* this test fails when there is no offd block */ for ( m = new_P_offd_i[i1]; m < new_P_offd_i[i1 + 1]; ++m ) { P_offd_data[m] *= scale; } } for ( i1 = 1; i1 <= num_rows_diag_P; i1++ ) { P_diag_i[i1] = new_P_diag_i[i1]; if ( i1 <= num_rows_offd_P && num_nonzeros_offd > 0 ) { P_offd_i[i1] = new_P_offd_i[i1]; } } hypre_TFree( new_P_diag_i, HYPRE_MEMORY_HOST); if ( num_rows_offd_P > 0 ) { hypre_TFree( new_P_offd_i, HYPRE_MEMORY_HOST); } hypre_CSRMatrixNumNonzeros(P_diag) = num_nonzeros_diag; hypre_CSRMatrixNumNonzeros(P_offd) = num_nonzeros_offd; hypre_ParCSRMatrixSetDNumNonzeros( P ); hypre_ParCSRMatrixSetNumNonzeros( P ); } /* hypre_ParCSRMatrix_dof_func_offd allocates, computes and returns dof_func_offd. The caller is responsible for freeing dof_func_offd. This function has code copied from hypre_BoomerAMGCreateS and hypre_BoomerAMGCreateSabs They should be retrofitted to call this function. Or, better, call this function separately and pass the result into them through an argument (less communication, less computation). */ HYPRE_Int hypre_ParCSRMatrix_dof_func_offd( hypre_ParCSRMatrix *A, HYPRE_Int num_functions, HYPRE_Int *dof_func, HYPRE_Int **dof_func_offd ) { hypre_ParCSRCommPkg *comm_pkg = hypre_ParCSRMatrixCommPkg(A); hypre_ParCSRCommHandle *comm_handle; hypre_CSRMatrix *A_offd = hypre_ParCSRMatrixOffd(A); HYPRE_Int num_cols_offd = 0; HYPRE_Int Solve_err_flag = 0; HYPRE_Int num_sends; HYPRE_Int *int_buf_data; HYPRE_Int index, start, i, j; num_cols_offd = hypre_CSRMatrixNumCols(A_offd); *dof_func_offd = NULL; if (num_cols_offd) { if (num_functions > 1) { *dof_func_offd = hypre_CTAlloc(HYPRE_Int, num_cols_offd, HYPRE_MEMORY_HOST); } } /*------------------------------------------------------------------- * Get the dof_func data for the off-processor columns *-------------------------------------------------------------------*/ if (!comm_pkg) { hypre_MatvecCommPkgCreate(A); comm_pkg = hypre_ParCSRMatrixCommPkg(A); } num_sends = hypre_ParCSRCommPkgNumSends(comm_pkg); if (num_functions > 1) { int_buf_data = hypre_CTAlloc(HYPRE_Int, hypre_ParCSRCommPkgSendMapStart(comm_pkg, num_sends), HYPRE_MEMORY_HOST); index = 0; for (i = 0; i < num_sends; i++) { start = hypre_ParCSRCommPkgSendMapStart(comm_pkg, i); for (j = start; j < hypre_ParCSRCommPkgSendMapStart(comm_pkg, i + 1); j++) int_buf_data[index++] = dof_func[hypre_ParCSRCommPkgSendMapElmt(comm_pkg, j)]; } comm_handle = hypre_ParCSRCommHandleCreate( 11, comm_pkg, int_buf_data, *dof_func_offd); hypre_ParCSRCommHandleDestroy(comm_handle); hypre_TFree(int_buf_data, HYPRE_MEMORY_HOST); } return (Solve_err_flag); } hypre-2.33.0/src/parcsr_ls/par_krylov_func.c000066400000000000000000000255611477326011500210730ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "_hypre_parcsr_ls.h" /*-------------------------------------------------------------------------- * hypre_ParKrylovCAlloc *--------------------------------------------------------------------------*/ void * hypre_ParKrylovCAlloc( size_t count, size_t elt_size, HYPRE_MemoryLocation location ) { return ( (void*) hypre_CTAlloc(char, count * elt_size, location) ); } /*-------------------------------------------------------------------------- * hypre_ParKrylovFree *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ParKrylovFree( void *ptr ) { HYPRE_Int ierr = 0; hypre_TFree( ptr, HYPRE_MEMORY_HOST); return ierr; } /*-------------------------------------------------------------------------- * hypre_ParKrylovCreateVector *--------------------------------------------------------------------------*/ void * hypre_ParKrylovCreateVector( void *vvector ) { hypre_ParVector *vector = (hypre_ParVector *) vvector; hypre_ParVector *new_vector; new_vector = hypre_ParMultiVectorCreate( hypre_ParVectorComm(vector), hypre_ParVectorGlobalSize(vector), hypre_ParVectorPartitioning(vector), hypre_ParVectorNumVectors(vector) ); hypre_ParVectorInitialize_v2(new_vector, hypre_ParVectorMemoryLocation(vector)); return ( (void *) new_vector ); } /*-------------------------------------------------------------------------- * hypre_ParKrylovCreateVectorArray * Note: one array will be allocated for all vectors, with vector 0 owning * the data, vector i will have data[i*size] assigned, not owning data *--------------------------------------------------------------------------*/ void * hypre_ParKrylovCreateVectorArray(HYPRE_Int n, void *vvector ) { hypre_ParVector *vector = (hypre_ParVector *) vvector; hypre_ParVector **new_vector; HYPRE_Int i, size, num_vectors; HYPRE_Complex *array_data; HYPRE_MemoryLocation memory_location = hypre_ParVectorMemoryLocation(vector); size = hypre_VectorSize(hypre_ParVectorLocalVector(vector)); num_vectors = hypre_VectorNumVectors(hypre_ParVectorLocalVector(vector)); array_data = hypre_CTAlloc(HYPRE_Complex, (n * size * num_vectors), memory_location); new_vector = hypre_CTAlloc(hypre_ParVector*, n, HYPRE_MEMORY_HOST); for (i = 0; i < n; i++) { new_vector[i] = hypre_ParMultiVectorCreate( hypre_ParVectorComm(vector), hypre_ParVectorGlobalSize(vector), hypre_ParVectorPartitioning(vector), hypre_ParVectorNumVectors(vector) ); hypre_VectorData(hypre_ParVectorLocalVector(new_vector[i])) = &array_data[i * size * num_vectors]; hypre_ParVectorInitialize_v2(new_vector[i], memory_location); if (i) { hypre_VectorOwnsData(hypre_ParVectorLocalVector(new_vector[i])) = 0; } hypre_ParVectorActualLocalSize(new_vector[i]) = size; } return ( (void *) new_vector ); } /*-------------------------------------------------------------------------- * hypre_ParKrylovDestroyVector *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ParKrylovDestroyVector( void *vvector ) { hypre_ParVector *vector = (hypre_ParVector *) vvector; return ( hypre_ParVectorDestroy( vector ) ); } /*-------------------------------------------------------------------------- * hypre_ParKrylovMatvecCreate *--------------------------------------------------------------------------*/ void * hypre_ParKrylovMatvecCreate( void *A, void *x ) { HYPRE_UNUSED_VAR(A); HYPRE_UNUSED_VAR(x); void *matvec_data; matvec_data = NULL; return ( matvec_data ); } /*-------------------------------------------------------------------------- * hypre_ParKrylovMatvec *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ParKrylovMatvec( void *matvec_data, HYPRE_Complex alpha, void *A, void *x, HYPRE_Complex beta, void *y ) { HYPRE_UNUSED_VAR(matvec_data); return ( hypre_ParCSRMatrixMatvec ( alpha, (hypre_ParCSRMatrix *) A, (hypre_ParVector *) x, beta, (hypre_ParVector *) y ) ); } /*-------------------------------------------------------------------------- * hypre_ParKrylovMatvecT *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ParKrylovMatvecT(void *matvec_data, HYPRE_Complex alpha, void *A, void *x, HYPRE_Complex beta, void *y) { HYPRE_UNUSED_VAR(matvec_data); return ( hypre_ParCSRMatrixMatvecT( alpha, (hypre_ParCSRMatrix *) A, (hypre_ParVector *) x, beta, (hypre_ParVector *) y ) ); } /*-------------------------------------------------------------------------- * hypre_ParKrylovMatvecDestroy *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ParKrylovMatvecDestroy( void *matvec_data ) { HYPRE_UNUSED_VAR(matvec_data); return 0; } /*-------------------------------------------------------------------------- * hypre_ParKrylovInnerProd *--------------------------------------------------------------------------*/ HYPRE_Real hypre_ParKrylovInnerProd( void *x, void *y ) { return ( hypre_ParVectorInnerProd( (hypre_ParVector *) x, (hypre_ParVector *) y ) ); } /*-------------------------------------------------------------------------- * hypre_ParKrylovMassInnerProd *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ParKrylovMassInnerProd( void *x, void **y, HYPRE_Int k, HYPRE_Int unroll, void * result ) { return ( hypre_ParVectorMassInnerProd( (hypre_ParVector *) x, (hypre_ParVector **) y, k, unroll, (HYPRE_Real*)result ) ); } /*-------------------------------------------------------------------------- * hypre_ParKrylovMassDotpTwo *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ParKrylovMassDotpTwo( void *x, void *y, void **z, HYPRE_Int k, HYPRE_Int unroll, void *result_x, void *result_y ) { return ( hypre_ParVectorMassDotpTwo( (hypre_ParVector *) x, (hypre_ParVector *) y, (hypre_ParVector **) z, k, unroll, (HYPRE_Real *)result_x, (HYPRE_Real *)result_y ) ); } /*-------------------------------------------------------------------------- * hypre_ParKrylovCopyVector *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ParKrylovCopyVector( void *x, void *y ) { return ( hypre_ParVectorCopy( (hypre_ParVector *) x, (hypre_ParVector *) y ) ); } /*-------------------------------------------------------------------------- * hypre_ParKrylovClearVector *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ParKrylovClearVector( void *x ) { return ( hypre_ParVectorSetZeros( (hypre_ParVector *) x ) ); } /*-------------------------------------------------------------------------- * hypre_ParKrylovScaleVector *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ParKrylovScaleVector( HYPRE_Complex alpha, void *x ) { return ( hypre_ParVectorScale( alpha, (hypre_ParVector *) x ) ); } /*-------------------------------------------------------------------------- * hypre_ParKrylovAxpy *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ParKrylovAxpy( HYPRE_Complex alpha, void *x, void *y ) { return ( hypre_ParVectorAxpy( alpha, (hypre_ParVector *) x, (hypre_ParVector *) y ) ); } /*-------------------------------------------------------------------------- * hypre_ParKrylovMassAxpy *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ParKrylovMassAxpy( HYPRE_Complex *alpha, void **x, void *y, HYPRE_Int k, HYPRE_Int unroll ) { return ( hypre_ParVectorMassAxpy( alpha, (hypre_ParVector **) x, (hypre_ParVector *) y, k, unroll)); } /*-------------------------------------------------------------------------- * hypre_ParKrylovCommInfo *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ParKrylovCommInfo( void *A, HYPRE_Int *my_id, HYPRE_Int *num_procs) { MPI_Comm comm = hypre_ParCSRMatrixComm ( (hypre_ParCSRMatrix *) A); hypre_MPI_Comm_size(comm, num_procs); hypre_MPI_Comm_rank(comm, my_id); return 0; } /*-------------------------------------------------------------------------- * hypre_ParKrylovIdentitySetup *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ParKrylovIdentitySetup( void *vdata, void *A, void *b, void *x ) { HYPRE_UNUSED_VAR(vdata); HYPRE_UNUSED_VAR(A); HYPRE_UNUSED_VAR(b); HYPRE_UNUSED_VAR(x); return 0; } /*-------------------------------------------------------------------------- * hypre_ParKrylovIdentity *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ParKrylovIdentity( void *vdata, void *A, void *b, void *x ) { HYPRE_UNUSED_VAR(vdata); HYPRE_UNUSED_VAR(A); return ( hypre_ParKrylovCopyVector( b, x ) ); } hypre-2.33.0/src/parcsr_ls/par_laplace.c000066400000000000000000001267561477326011500201430ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "_hypre_parcsr_ls.h" /*-------------------------------------------------------------------------- * hypre_GenerateLaplacian *--------------------------------------------------------------------------*/ HYPRE_ParCSRMatrix GenerateLaplacian( MPI_Comm comm, HYPRE_BigInt nx, HYPRE_BigInt ny, HYPRE_BigInt nz, HYPRE_Int P, HYPRE_Int Q, HYPRE_Int R, HYPRE_Int ip, HYPRE_Int iq, HYPRE_Int ir, HYPRE_Real *value ) { hypre_ParCSRMatrix *A; hypre_CSRMatrix *diag; hypre_CSRMatrix *offd; HYPRE_Int *diag_i; HYPRE_Int *diag_j; HYPRE_Real *diag_data; HYPRE_Int *offd_i; HYPRE_Int *offd_j = NULL; HYPRE_BigInt *big_offd_j = NULL; HYPRE_Real *offd_data = NULL; HYPRE_BigInt global_part[2]; HYPRE_BigInt ix, iy, iz; HYPRE_Int cnt, o_cnt; HYPRE_Int local_num_rows; HYPRE_BigInt *col_map_offd; HYPRE_Int row_index; HYPRE_Int i, j; HYPRE_Int nx_local, ny_local, nz_local; HYPRE_Int num_cols_offd; HYPRE_BigInt grid_size; HYPRE_BigInt *nx_part; HYPRE_BigInt *ny_part; HYPRE_BigInt *nz_part; HYPRE_Int num_procs; HYPRE_Int P_busy, Q_busy, R_busy; hypre_MPI_Comm_size(comm, &num_procs); grid_size = nx * ny * nz; hypre_GeneratePartitioning(nx, P, &nx_part); hypre_GeneratePartitioning(ny, Q, &ny_part); hypre_GeneratePartitioning(nz, R, &nz_part); nx_local = (HYPRE_Int)(nx_part[ip + 1] - nx_part[ip]); ny_local = (HYPRE_Int)(ny_part[iq + 1] - ny_part[iq]); nz_local = (HYPRE_Int)(nz_part[ir + 1] - nz_part[ir]); local_num_rows = nx_local * ny_local * nz_local; global_part[0] = nz_part[ir] * nx * ny + (ny_part[iq] * nx + nx_part[ip] * ny_local) * nz_local; global_part[1] = global_part[0] + (HYPRE_BigInt)local_num_rows; diag_i = hypre_CTAlloc(HYPRE_Int, local_num_rows + 1, HYPRE_MEMORY_HOST); offd_i = hypre_CTAlloc(HYPRE_Int, local_num_rows + 1, HYPRE_MEMORY_HOST); P_busy = hypre_min(nx, P); Q_busy = hypre_min(ny, Q); R_busy = hypre_min(nz, R); num_cols_offd = 0; if (ip) { num_cols_offd += ny_local * nz_local; } if (ip < P_busy - 1) { num_cols_offd += ny_local * nz_local; } if (iq) { num_cols_offd += nx_local * nz_local; } if (iq < Q_busy - 1) { num_cols_offd += nx_local * nz_local; } if (ir) { num_cols_offd += nx_local * ny_local; } if (ir < R_busy - 1) { num_cols_offd += nx_local * ny_local; } if (!local_num_rows) { num_cols_offd = 0; } col_map_offd = hypre_CTAlloc(HYPRE_BigInt, num_cols_offd, HYPRE_MEMORY_HOST); cnt = 1; o_cnt = 1; diag_i[0] = 0; offd_i[0] = 0; for (iz = nz_part[ir]; iz < nz_part[ir + 1]; iz++) { for (iy = ny_part[iq]; iy < ny_part[iq + 1]; iy++) { for (ix = nx_part[ip]; ix < nx_part[ip + 1]; ix++) { diag_i[cnt] = diag_i[cnt - 1]; offd_i[o_cnt] = offd_i[o_cnt - 1]; diag_i[cnt]++; if (iz > nz_part[ir]) { diag_i[cnt]++; } else { if (iz) { offd_i[o_cnt]++; } } if (iy > ny_part[iq] ) { diag_i[cnt]++; } else { if (iy) { offd_i[o_cnt]++; } } if (ix > nx_part[ip] ) { diag_i[cnt]++; } else { if (ix) { offd_i[o_cnt]++; } } if (ix + 1 < nx_part[ip + 1]) { diag_i[cnt]++; } else { if (ix + 1 < nx) { offd_i[o_cnt]++; } } if (iy + 1 < ny_part[iq + 1]) { diag_i[cnt]++; } else { if (iy + 1 < ny) { offd_i[o_cnt]++; } } if (iz + 1 < nz_part[ir + 1]) { diag_i[cnt]++; } else { if (iz + 1 < nz) { offd_i[o_cnt]++; } } cnt++; o_cnt++; } } } diag_j = hypre_CTAlloc(HYPRE_Int, diag_i[local_num_rows], HYPRE_MEMORY_HOST); diag_data = hypre_CTAlloc(HYPRE_Real, diag_i[local_num_rows], HYPRE_MEMORY_HOST); if (num_procs > 1) { big_offd_j = hypre_CTAlloc(HYPRE_BigInt, offd_i[local_num_rows], HYPRE_MEMORY_HOST); offd_j = hypre_CTAlloc(HYPRE_Int, offd_i[local_num_rows], HYPRE_MEMORY_HOST); offd_data = hypre_CTAlloc(HYPRE_Real, offd_i[local_num_rows], HYPRE_MEMORY_HOST); } row_index = 0; cnt = 0; o_cnt = 0; for (iz = nz_part[ir]; iz < nz_part[ir + 1]; iz++) { for (iy = ny_part[iq]; iy < ny_part[iq + 1]; iy++) { for (ix = nx_part[ip]; ix < nx_part[ip + 1]; ix++) { diag_j[cnt] = row_index; diag_data[cnt++] = value[0]; if (iz > nz_part[ir]) { diag_j[cnt] = row_index - nx_local * ny_local; diag_data[cnt++] = value[3]; } else { if (iz) { big_offd_j[o_cnt] = hypre_map(ix, iy, iz - 1, ip, iq, ir - 1, nx, ny, nx_part, ny_part, nz_part); offd_data[o_cnt++] = value[3]; } } if (iy > ny_part[iq]) { diag_j[cnt] = row_index - nx_local; diag_data[cnt++] = value[2]; } else { if (iy) { big_offd_j[o_cnt] = hypre_map(ix, iy - 1, iz, ip, iq - 1, ir, nx, ny, nx_part, ny_part, nz_part); offd_data[o_cnt++] = value[2]; } } if (ix > nx_part[ip]) { diag_j[cnt] = row_index - 1; diag_data[cnt++] = value[1]; } else { if (ix) { big_offd_j[o_cnt] = hypre_map(ix - 1, iy, iz, ip - 1, iq, ir, nx, ny, nx_part, ny_part, nz_part); offd_data[o_cnt++] = value[1]; } } if (ix + 1 < nx_part[ip + 1]) { diag_j[cnt] = row_index + 1; diag_data[cnt++] = value[1]; } else { if (ix + 1 < nx) { big_offd_j[o_cnt] = hypre_map(ix + 1, iy, iz, ip + 1, iq, ir, nx, ny, nx_part, ny_part, nz_part); offd_data[o_cnt++] = value[1]; } } if (iy + 1 < ny_part[iq + 1]) { diag_j[cnt] = row_index + nx_local; diag_data[cnt++] = value[2]; } else { if (iy + 1 < ny) { big_offd_j[o_cnt] = hypre_map(ix, iy + 1, iz, ip, iq + 1, ir, nx, ny, nx_part, ny_part, nz_part); offd_data[o_cnt++] = value[2]; } } if (iz + 1 < nz_part[ir + 1]) { diag_j[cnt] = row_index + nx_local * ny_local; diag_data[cnt++] = value[3]; } else { if (iz + 1 < nz) { big_offd_j[o_cnt] = hypre_map(ix, iy, iz + 1, ip, iq, ir + 1, nx, ny, nx_part, ny_part, nz_part); offd_data[o_cnt++] = value[3]; } } row_index++; } } } if (num_procs > 1) { for (i = 0; i < num_cols_offd; i++) { col_map_offd[i] = big_offd_j[i]; } hypre_BigQsort0(col_map_offd, 0, num_cols_offd - 1); for (i = 0; i < num_cols_offd; i++) for (j = 0; j < num_cols_offd; j++) if (big_offd_j[i] == col_map_offd[j]) { offd_j[i] = j; break; } /*for (i=0; i < offd_i[local_num_rows]; i++) { offd_j[i] = hypre_BigBinarySearch(col_map_offd,big_offd_j[i],num_cols_offd); }*/ } A = hypre_ParCSRMatrixCreate(comm, grid_size, grid_size, global_part, global_part, num_cols_offd, diag_i[local_num_rows], offd_i[local_num_rows]); hypre_ParCSRMatrixColMapOffd(A) = col_map_offd; diag = hypre_ParCSRMatrixDiag(A); hypre_CSRMatrixI(diag) = diag_i; hypre_CSRMatrixJ(diag) = diag_j; hypre_CSRMatrixData(diag) = diag_data; offd = hypre_ParCSRMatrixOffd(A); hypre_CSRMatrixI(offd) = offd_i; if (num_cols_offd) { hypre_CSRMatrixJ(offd) = offd_j; hypre_CSRMatrixData(offd) = offd_data; } hypre_CSRMatrixMemoryLocation(diag) = HYPRE_MEMORY_HOST; hypre_CSRMatrixMemoryLocation(offd) = HYPRE_MEMORY_HOST; hypre_ParCSRMatrixMigrate(A, hypre_HandleMemoryLocation(hypre_handle())); hypre_TFree(nx_part, HYPRE_MEMORY_HOST); hypre_TFree(ny_part, HYPRE_MEMORY_HOST); hypre_TFree(nz_part, HYPRE_MEMORY_HOST); hypre_TFree(big_offd_j, HYPRE_MEMORY_HOST); return (HYPRE_ParCSRMatrix) A; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_BigInt hypre_map(HYPRE_BigInt ix, HYPRE_BigInt iy, HYPRE_BigInt iz, HYPRE_Int p, HYPRE_Int q, HYPRE_Int r, HYPRE_BigInt nx, HYPRE_BigInt ny, HYPRE_BigInt *nx_part, HYPRE_BigInt *ny_part, HYPRE_BigInt *nz_part) { HYPRE_Int nx_local = (HYPRE_Int)(nx_part[p + 1] - nx_part[p]); HYPRE_Int ny_local = (HYPRE_Int)(ny_part[q + 1] - ny_part[q]); HYPRE_Int nz_local = (HYPRE_Int)(nz_part[r + 1] - nz_part[r]); HYPRE_Int ix_local = (HYPRE_Int)(ix - nx_part[p]); HYPRE_Int iy_local = (HYPRE_Int)(iy - ny_part[q]); HYPRE_Int iz_local = (HYPRE_Int)(iz - nz_part[r]); HYPRE_BigInt global_index; global_index = nz_part[r] * nx * ny + ny_part[q] * nx * (HYPRE_BigInt)nz_local + nx_part[p] * (HYPRE_BigInt)(ny_local * nz_local); global_index += (HYPRE_BigInt)((iz_local * ny_local + iy_local) * nx_local + ix_local); return global_index; } /*-------------------------------------------------------------------------- * hypre_GenerateVectorLaplacian - this is the systems version *--------------------------------------------------------------------------*/ HYPRE_ParCSRMatrix GenerateSysLaplacian( MPI_Comm comm, HYPRE_BigInt nx, HYPRE_BigInt ny, HYPRE_BigInt nz, HYPRE_Int P, HYPRE_Int Q, HYPRE_Int R, HYPRE_Int p, HYPRE_Int q, HYPRE_Int r, HYPRE_Int num_fun, HYPRE_Real *mtrx, HYPRE_Real *value ) { hypre_ParCSRMatrix *A; hypre_CSRMatrix *diag; hypre_CSRMatrix *offd; HYPRE_Int *diag_i; HYPRE_Int *diag_j; HYPRE_Real *diag_data; HYPRE_Int *offd_i; HYPRE_Int *offd_j = NULL; HYPRE_BigInt *big_offd_j = NULL; HYPRE_Real *offd_data = NULL; HYPRE_BigInt global_part[2]; HYPRE_Int ix, iy, iz; HYPRE_Int cnt, o_cnt; HYPRE_Int local_num_rows; HYPRE_BigInt *col_map_offd; HYPRE_Int row_index, row, col; HYPRE_Int index, diag_index; HYPRE_Int i, j; HYPRE_Int nx_local, ny_local, nz_local; HYPRE_Int num_cols_offd; HYPRE_BigInt grid_size; HYPRE_Int local_grid_size; HYPRE_Int first_j, j_ind; HYPRE_BigInt big_first_j, big_num_fun = (HYPRE_BigInt)num_fun; HYPRE_Int num_coeffs, num_offd_coeffs; HYPRE_BigInt *nx_part; HYPRE_BigInt *ny_part; HYPRE_BigInt *nz_part; HYPRE_Int num_procs; HYPRE_Int P_busy, Q_busy, R_busy; HYPRE_Real val; HYPRE_Int gp_size; hypre_MPI_Comm_size(comm, &num_procs); grid_size = nx * ny * nz; hypre_GeneratePartitioning(nx, P, &nx_part); hypre_GeneratePartitioning(ny, Q, &ny_part); hypre_GeneratePartitioning(nz, R, &nz_part); nx_local = (HYPRE_Int)(nx_part[p + 1] - nx_part[p]); ny_local = (HYPRE_Int)(ny_part[q + 1] - ny_part[q]); nz_local = (HYPRE_Int)(nz_part[r + 1] - nz_part[r]); local_grid_size = nx_local * ny_local * nz_local; local_num_rows = num_fun * local_grid_size; global_part[0] = nz_part[r] * nx * ny + (ny_part[q] * nx + nx_part[p] * ny_local) * nz_local; global_part[1] = global_part[0] + (HYPRE_BigInt)local_grid_size; gp_size = 2; diag_i = hypre_CTAlloc(HYPRE_Int, local_num_rows + 1, HYPRE_MEMORY_HOST); offd_i = hypre_CTAlloc(HYPRE_Int, local_num_rows + 1, HYPRE_MEMORY_HOST); P_busy = hypre_min(nx, P); Q_busy = hypre_min(ny, Q); R_busy = hypre_min(nz, R); num_cols_offd = 0; if (p) { num_cols_offd += ny_local * nz_local; } if (p < P_busy - 1) { num_cols_offd += ny_local * nz_local; } if (q) { num_cols_offd += nx_local * nz_local; } if (q < Q_busy - 1) { num_cols_offd += nx_local * nz_local; } if (r) { num_cols_offd += nx_local * ny_local; } if (r < R_busy - 1) { num_cols_offd += nx_local * ny_local; } num_cols_offd *= num_fun; if (!local_num_rows) { num_cols_offd = 0; } col_map_offd = hypre_CTAlloc(HYPRE_BigInt, num_cols_offd, HYPRE_MEMORY_HOST); cnt = 1; diag_i[0] = 0; offd_i[0] = 0; for (iz = nz_part[r]; iz < nz_part[r + 1]; iz++) { for (iy = ny_part[q]; iy < ny_part[q + 1]; iy++) { for (ix = nx_part[p]; ix < nx_part[p + 1]; ix++) { diag_i[cnt] = diag_i[cnt - 1]; offd_i[cnt] = offd_i[cnt - 1]; diag_i[cnt] += num_fun; if (iz > nz_part[r]) { diag_i[cnt] += num_fun; } else { if (iz) { offd_i[cnt] += num_fun; } } if (iy > ny_part[q]) { diag_i[cnt] += num_fun; } else { if (iy) { offd_i[cnt] += num_fun; } } if (ix > nx_part[p]) { diag_i[cnt] += num_fun; } else { if (ix) { offd_i[cnt] += num_fun; } } if (ix + 1 < nx_part[p + 1]) { diag_i[cnt] += num_fun; } else { if (ix + 1 < nx) { offd_i[cnt] += num_fun; } } if (iy + 1 < ny_part[q + 1]) { diag_i[cnt] += num_fun; } else { if (iy + 1 < ny) { offd_i[cnt] += num_fun; } } if (iz + 1 < nz_part[r + 1]) { diag_i[cnt] += num_fun; } else { if (iz + 1 < nz) { offd_i[cnt] += num_fun; } } num_coeffs = diag_i[cnt] - diag_i[cnt - 1]; num_offd_coeffs = offd_i[cnt] - offd_i[cnt - 1]; cnt++; for (i = 1; i < num_fun; i++) { diag_i[cnt] = diag_i[cnt - 1] + num_coeffs; offd_i[cnt] = offd_i[cnt - 1] + num_offd_coeffs; cnt++; } } } } diag_j = hypre_CTAlloc(HYPRE_Int, diag_i[local_num_rows], HYPRE_MEMORY_HOST); diag_data = hypre_CTAlloc(HYPRE_Real, diag_i[local_num_rows], HYPRE_MEMORY_HOST); if (num_procs > 1) { offd_j = hypre_CTAlloc(HYPRE_Int, offd_i[local_num_rows], HYPRE_MEMORY_HOST); big_offd_j = hypre_CTAlloc(HYPRE_BigInt, offd_i[local_num_rows], HYPRE_MEMORY_HOST); offd_data = hypre_CTAlloc(HYPRE_Real, offd_i[local_num_rows], HYPRE_MEMORY_HOST); } row_index = 0; for (iz = nz_part[r]; iz < nz_part[r + 1]; iz++) { for (iy = ny_part[q]; iy < ny_part[q + 1]; iy++) { for (ix = nx_part[p]; ix < nx_part[p + 1]; ix++) { cnt = diag_i[row_index];; o_cnt = offd_i[row_index];; num_coeffs = diag_i[row_index + 1] - diag_i[row_index]; num_offd_coeffs = offd_i[row_index + 1] - offd_i[row_index]; first_j = row_index; for (i = 0; i < num_fun; i++) { for (j = 0; j < num_fun; j++) { j_ind = cnt + i * num_coeffs + j; diag_j[j_ind] = first_j + j; diag_data[j_ind] = value[0] * mtrx[i * num_fun + j]; } } cnt += num_fun; if (iz > nz_part[r]) { first_j = row_index - nx_local * ny_local * num_fun; for (i = 0; i < num_fun; i++) { for (j = 0; j < num_fun; j++) { j_ind = cnt + i * num_coeffs + j; diag_j[j_ind] = first_j + j; diag_data[j_ind] = value[3] * mtrx[i * num_fun + j]; } } cnt += num_fun; } else { if (iz) { big_first_j = big_num_fun * hypre_map(ix, iy, iz - 1, p, q, r - 1, nx, ny, nx_part, ny_part, nz_part); for (i = 0; i < num_fun; i++) { for (j = 0; j < num_fun; j++) { j_ind = o_cnt + i * num_offd_coeffs + j; big_offd_j[j_ind] = big_first_j + (HYPRE_BigInt)j; offd_data[j_ind] = value[3] * mtrx[i * num_fun + j]; } } o_cnt += num_fun; } } if (iy > ny_part[q]) { first_j = row_index - nx_local * num_fun; for (i = 0; i < num_fun; i++) { for (j = 0; j < num_fun; j++) { j_ind = cnt + i * num_coeffs + j; diag_j[j_ind] = first_j + j; diag_data[j_ind] = value[2] * mtrx[i * num_fun + j]; } } cnt += num_fun; } else { if (iy) { big_first_j = big_num_fun * hypre_map(ix, iy - 1, iz, p, q - 1, r, nx, ny, nx_part, ny_part, nz_part); for (i = 0; i < num_fun; i++) { for (j = 0; j < num_fun; j++) { j_ind = o_cnt + i * num_offd_coeffs + j; big_offd_j[j_ind] = big_first_j + (HYPRE_BigInt)j; offd_data[j_ind] = value[2] * mtrx[i * num_fun + j]; } } o_cnt += num_fun; } } if (ix > nx_part[p]) { first_j = row_index - num_fun; for (i = 0; i < num_fun; i++) { for (j = 0; j < num_fun; j++) { j_ind = cnt + i * num_coeffs + j; diag_j[j_ind] = first_j + j; diag_data[j_ind] = value[1] * mtrx[i * num_fun + j]; } } cnt += num_fun; } else { if (ix) { big_first_j = big_num_fun * hypre_map(ix - 1, iy, iz, p - 1, q, r, nx, ny, nx_part, ny_part, nz_part); for (i = 0; i < num_fun; i++) { for (j = 0; j < num_fun; j++) { j_ind = o_cnt + i * num_offd_coeffs + j; big_offd_j[j_ind] = big_first_j + (HYPRE_BigInt)j; offd_data[j_ind] = value[1] * mtrx[i * num_fun + j]; } } o_cnt += num_fun; } } if (ix + 1 < nx_part[p + 1]) { first_j = row_index + num_fun; for (i = 0; i < num_fun; i++) { for (j = 0; j < num_fun; j++) { j_ind = cnt + i * num_coeffs + j; diag_j[j_ind] = first_j + j; diag_data[j_ind] = value[1] * mtrx[i * num_fun + j]; } } cnt += num_fun; } else { if (ix + 1 < nx) { big_first_j = big_num_fun * hypre_map(ix + 1, iy, iz, p + 1, q, r, nx, ny, nx_part, ny_part, nz_part); for (i = 0; i < num_fun; i++) { for (j = 0; j < num_fun; j++) { j_ind = o_cnt + i * num_offd_coeffs + j; big_offd_j[j_ind] = big_first_j + (HYPRE_BigInt)j; offd_data[j_ind] = value[1] * mtrx[i * num_fun + j]; } } o_cnt += num_fun; } } if (iy + 1 < ny_part[q + 1]) { first_j = row_index + nx_local * num_fun; for (i = 0; i < num_fun; i++) { for (j = 0; j < num_fun; j++) { j_ind = cnt + i * num_coeffs + j; diag_j[j_ind] = first_j + j; diag_data[j_ind] = value[2] * mtrx[i * num_fun + j]; } } cnt += num_fun; } else { if (iy + 1 < ny) { big_first_j = big_num_fun * hypre_map(ix, iy + 1, iz, p, q + 1, r, nx, ny, nx_part, ny_part, nz_part); for (i = 0; i < num_fun; i++) { for (j = 0; j < num_fun; j++) { j_ind = o_cnt + i * num_offd_coeffs + j; big_offd_j[j_ind] = big_first_j + (HYPRE_BigInt)j; offd_data[j_ind] = value[2] * mtrx[i * num_fun + j]; } } o_cnt += num_fun; } } if (iz + 1 < nz_part[r + 1]) { first_j = row_index + nx_local * ny_local * num_fun; for (i = 0; i < num_fun; i++) { for (j = 0; j < num_fun; j++) { j_ind = cnt + i * num_coeffs + j; diag_j[j_ind] = first_j + j; diag_data[j_ind] = value[3] * mtrx[i * num_fun + j]; } } cnt += num_fun; } else { if (iz + 1 < nz) { big_first_j = big_num_fun * hypre_map(ix, iy, iz + 1, p, q, r + 1, nx, ny, nx_part, ny_part, nz_part); for (i = 0; i < num_fun; i++) { for (j = 0; j < num_fun; j++) { j_ind = o_cnt + i * num_offd_coeffs + j; big_offd_j[j_ind] = big_first_j + (HYPRE_BigInt)j; offd_data[j_ind] = value[3] * mtrx[i * num_fun + j]; } } o_cnt += num_fun; } } row_index += num_fun; } } } if (num_procs > 1) { cnt = 0; for (i = 0; i < local_num_rows; i += num_fun) { for (j = offd_i[i]; j < offd_i[i + 1]; j++) { col_map_offd[cnt++] = big_offd_j[j]; } } hypre_BigQsort0(col_map_offd, 0, num_cols_offd - 1); for (i = 0; i < num_fun * num_cols_offd; i++) for (j = hypre_min(0, hypre_abs(i - num_fun)); j < num_cols_offd; j++) if (big_offd_j[i] == col_map_offd[j]) { offd_j[i] = j; break; } } for (i = 0; i < gp_size; i++) { global_part[i] *= big_num_fun; } for (j = 1; j < num_fun; j++) { for (i = 0; i < local_grid_size; i++) { row = i * num_fun + j; diag_index = diag_i[row]; index = diag_index + j; val = diag_data[diag_index]; col = diag_j[diag_index]; diag_data[diag_index] = diag_data[index]; diag_j[diag_index] = diag_j[index]; diag_data[index] = val; diag_j[index] = col; } } A = hypre_ParCSRMatrixCreate(comm, big_num_fun * grid_size, big_num_fun * grid_size, global_part, global_part, num_cols_offd, diag_i[local_num_rows], offd_i[local_num_rows]); hypre_ParCSRMatrixColMapOffd(A) = col_map_offd; diag = hypre_ParCSRMatrixDiag(A); hypre_CSRMatrixI(diag) = diag_i; hypre_CSRMatrixJ(diag) = diag_j; hypre_CSRMatrixData(diag) = diag_data; offd = hypre_ParCSRMatrixOffd(A); hypre_CSRMatrixI(offd) = offd_i; if (num_cols_offd) { hypre_CSRMatrixJ(offd) = offd_j; hypre_CSRMatrixData(offd) = offd_data; } hypre_CSRMatrixMemoryLocation(diag) = HYPRE_MEMORY_HOST; hypre_CSRMatrixMemoryLocation(offd) = HYPRE_MEMORY_HOST; hypre_ParCSRMatrixMigrate(A, hypre_HandleMemoryLocation(hypre_handle())); hypre_TFree(nx_part, HYPRE_MEMORY_HOST); hypre_TFree(ny_part, HYPRE_MEMORY_HOST); hypre_TFree(nz_part, HYPRE_MEMORY_HOST); hypre_TFree(big_offd_j, HYPRE_MEMORY_HOST); return (HYPRE_ParCSRMatrix) A; } /*-------------------------------------------------------------------------- * hypre_GenerateVectorLaplacian - this is also a systems version and we can * vary the diffusion coefficients in each block *--------------------------------------------------------------------------*/ HYPRE_ParCSRMatrix GenerateSysLaplacianVCoef( MPI_Comm comm, HYPRE_BigInt nx, HYPRE_BigInt ny, HYPRE_BigInt nz, HYPRE_Int P, HYPRE_Int Q, HYPRE_Int R, HYPRE_Int p, HYPRE_Int q, HYPRE_Int r, HYPRE_Int num_fun, HYPRE_Real *mtrx, HYPRE_Real *value ) { hypre_ParCSRMatrix *A; hypre_CSRMatrix *diag; hypre_CSRMatrix *offd; HYPRE_Int *diag_i; HYPRE_Int *diag_j; HYPRE_Real *diag_data; HYPRE_Int *offd_i; HYPRE_Int *offd_j = NULL; HYPRE_BigInt *big_offd_j = NULL; HYPRE_Real *offd_data = NULL; HYPRE_BigInt global_part[2]; HYPRE_BigInt ix, iy, iz; HYPRE_Int cnt, o_cnt; HYPRE_Int local_num_rows; HYPRE_BigInt *col_map_offd; HYPRE_Int row_index, row, col; HYPRE_Int index, diag_index; HYPRE_Int i, j; HYPRE_Int gp_size; HYPRE_Int nx_local, ny_local, nz_local; HYPRE_Int num_cols_offd; HYPRE_BigInt grid_size; HYPRE_Int local_grid_size; HYPRE_Int first_j, j_ind; HYPRE_BigInt big_first_j, big_num_fun = (HYPRE_BigInt) num_fun; HYPRE_Int num_coeffs, num_offd_coeffs; HYPRE_BigInt *nx_part; HYPRE_BigInt *ny_part; HYPRE_BigInt *nz_part; HYPRE_Int num_procs, P_busy, Q_busy, R_busy; HYPRE_Real val; /* for indexing in values */ HYPRE_Int sz = num_fun * num_fun; hypre_MPI_Comm_size(comm, &num_procs); grid_size = nx * ny * nz; hypre_GeneratePartitioning(nx, P, &nx_part); hypre_GeneratePartitioning(ny, Q, &ny_part); hypre_GeneratePartitioning(nz, R, &nz_part); nx_local = (HYPRE_Int)(nx_part[p + 1] - nx_part[p]); ny_local = (HYPRE_Int)(ny_part[q + 1] - ny_part[q]); nz_local = (HYPRE_Int)(nz_part[r + 1] - nz_part[r]); local_grid_size = nx_local * ny_local * nz_local; global_part[0] = nz_part[r] * nx * ny + (ny_part[q] * nx + nx_part[p] * ny_local) * nz_local; global_part[1] = global_part[0] + (HYPRE_BigInt)local_grid_size; gp_size = 2; local_num_rows = num_fun * local_grid_size; diag_i = hypre_CTAlloc(HYPRE_Int, local_num_rows + 1, HYPRE_MEMORY_HOST); offd_i = hypre_CTAlloc(HYPRE_Int, local_num_rows + 1, HYPRE_MEMORY_HOST); P_busy = hypre_min(nx, P); Q_busy = hypre_min(ny, Q); R_busy = hypre_min(nz, R); num_cols_offd = 0; if (p) { num_cols_offd += ny_local * nz_local; } if (p < P_busy - 1) { num_cols_offd += ny_local * nz_local; } if (q) { num_cols_offd += nx_local * nz_local; } if (q < Q_busy - 1) { num_cols_offd += nx_local * nz_local; } if (r) { num_cols_offd += nx_local * ny_local; } if (r < R_busy - 1) { num_cols_offd += nx_local * ny_local; } num_cols_offd *= num_fun; if (!local_num_rows) { num_cols_offd = 0; } col_map_offd = hypre_CTAlloc(HYPRE_BigInt, num_cols_offd, HYPRE_MEMORY_HOST); cnt = 1; diag_i[0] = 0; offd_i[0] = 0; for (iz = nz_part[r]; iz < nz_part[r + 1]; iz++) { for (iy = ny_part[q]; iy < ny_part[q + 1]; iy++) { for (ix = nx_part[p]; ix < nx_part[p + 1]; ix++) { diag_i[cnt] = diag_i[cnt - 1]; offd_i[cnt] = offd_i[cnt - 1]; diag_i[cnt] += num_fun; if (iz > nz_part[r]) { diag_i[cnt] += num_fun; } else { if (iz) { offd_i[cnt] += num_fun; } } if (iy > ny_part[q]) { diag_i[cnt] += num_fun; } else { if (iy) { offd_i[cnt] += num_fun; } } if (ix > nx_part[p]) { diag_i[cnt] += num_fun; } else { if (ix) { offd_i[cnt] += num_fun; } } if (ix + 1 < nx_part[p + 1]) { diag_i[cnt] += num_fun; } else { if (ix + 1 < nx) { offd_i[cnt] += num_fun; } } if (iy + 1 < ny_part[q + 1]) { diag_i[cnt] += num_fun; } else { if (iy + 1 < ny) { offd_i[cnt] += num_fun; } } if (iz + 1 < nz_part[r + 1]) { diag_i[cnt] += num_fun; } else { if (iz + 1 < nz) { offd_i[cnt] += num_fun; } } num_coeffs = diag_i[cnt] - diag_i[cnt - 1]; num_offd_coeffs = offd_i[cnt] - offd_i[cnt - 1]; cnt++; for (i = 1; i < num_fun; i++) { diag_i[cnt] = diag_i[cnt - 1] + num_coeffs; offd_i[cnt] = offd_i[cnt - 1] + num_offd_coeffs; cnt++; } } } } diag_j = hypre_CTAlloc(HYPRE_Int, diag_i[local_num_rows], HYPRE_MEMORY_HOST); diag_data = hypre_CTAlloc(HYPRE_Real, diag_i[local_num_rows], HYPRE_MEMORY_HOST); if (num_procs > 1) { offd_j = hypre_CTAlloc(HYPRE_Int, offd_i[local_num_rows], HYPRE_MEMORY_HOST); big_offd_j = hypre_CTAlloc(HYPRE_BigInt, offd_i[local_num_rows], HYPRE_MEMORY_HOST); offd_data = hypre_CTAlloc(HYPRE_Real, offd_i[local_num_rows], HYPRE_MEMORY_HOST); } row_index = 0; for (iz = nz_part[r]; iz < nz_part[r + 1]; iz++) { for (iy = ny_part[q]; iy < ny_part[q + 1]; iy++) { for (ix = nx_part[p]; ix < nx_part[p + 1]; ix++) { cnt = diag_i[row_index];; o_cnt = offd_i[row_index];; num_coeffs = diag_i[row_index + 1] - diag_i[row_index]; num_offd_coeffs = offd_i[row_index + 1] - offd_i[row_index]; first_j = row_index; for (i = 0; i < num_fun; i++) { for (j = 0; j < num_fun; j++) { j_ind = cnt + i * num_coeffs + j; diag_j[j_ind] = first_j + j; diag_data[j_ind] = value[0 * sz + i * num_fun + j] * mtrx[i * num_fun + j]; } } cnt += num_fun; if (iz > nz_part[r]) { first_j = row_index - nx_local * ny_local * num_fun; for (i = 0; i < num_fun; i++) { for (j = 0; j < num_fun; j++) { j_ind = cnt + i * num_coeffs + j; diag_j[j_ind] = first_j + j; diag_data[j_ind] = value[3 * sz + i * num_fun + j] * mtrx[i * num_fun + j]; } } cnt += num_fun; } else { if (iz) { big_first_j = big_num_fun * hypre_map(ix, iy, iz - 1, p, q, r - 1, nx, ny, nx_part, ny_part, nz_part); for (i = 0; i < num_fun; i++) { for (j = 0; j < num_fun; j++) { j_ind = o_cnt + i * num_offd_coeffs + j; big_offd_j[j_ind] = big_first_j + (HYPRE_BigInt)j; offd_data[j_ind] = value[3 * sz + i * num_fun + j] * mtrx[i * num_fun + j]; } } o_cnt += num_fun; } } if (iy > ny_part[q]) { first_j = row_index - nx_local * num_fun; for (i = 0; i < num_fun; i++) { for (j = 0; j < num_fun; j++) { j_ind = cnt + i * num_coeffs + j; diag_j[j_ind] = first_j + j; diag_data[j_ind] = value[2 * sz + i * num_fun + j] * mtrx[i * num_fun + j]; } } cnt += num_fun; } else { if (iy) { big_first_j = big_num_fun * hypre_map(ix, iy - 1, iz, p, q - 1, r, nx, ny, nx_part, ny_part, nz_part); for (i = 0; i < num_fun; i++) { for (j = 0; j < num_fun; j++) { j_ind = o_cnt + i * num_offd_coeffs + j; big_offd_j[j_ind] = big_first_j + (HYPRE_BigInt)j; offd_data[j_ind] = value[2 * sz + i * num_fun + j] * mtrx[i * num_fun + j]; } } o_cnt += num_fun; } } if (ix > nx_part[p]) { first_j = row_index - num_fun; for (i = 0; i < num_fun; i++) { for (j = 0; j < num_fun; j++) { j_ind = cnt + i * num_coeffs + j; diag_j[j_ind] = first_j + j; diag_data[j_ind] = value[1 * sz + i * num_fun + j] * mtrx[i * num_fun + j]; } } cnt += num_fun; } else { if (ix) { big_first_j = big_num_fun * hypre_map(ix - 1, iy, iz, p - 1, q, r, nx, ny, nx_part, ny_part, nz_part); for (i = 0; i < num_fun; i++) { for (j = 0; j < num_fun; j++) { j_ind = o_cnt + i * num_offd_coeffs + j; big_offd_j[j_ind] = big_first_j + (HYPRE_BigInt)j; offd_data[j_ind] = value[1 * sz + i * num_fun + j] * mtrx[i * num_fun + j]; } } o_cnt += num_fun; } } if (ix + 1 < nx_part[p + 1]) { first_j = row_index + num_fun; for (i = 0; i < num_fun; i++) { for (j = 0; j < num_fun; j++) { j_ind = cnt + i * num_coeffs + j; diag_j[j_ind] = first_j + j; diag_data[j_ind] = value[1 * sz + i * num_fun + j] * mtrx[i * num_fun + j]; } } cnt += num_fun; } else { if (ix + 1 < nx) { big_first_j = big_num_fun * hypre_map(ix + 1, iy, iz, p + 1, q, r, nx, ny, nx_part, ny_part, nz_part); for (i = 0; i < num_fun; i++) { for (j = 0; j < num_fun; j++) { j_ind = o_cnt + i * num_offd_coeffs + j; big_offd_j[j_ind] = big_first_j + (HYPRE_BigInt)j; offd_data[j_ind] = value[1 * sz + i * num_fun + j] * mtrx[i * num_fun + j]; } } o_cnt += num_fun; } } if (iy + 1 < ny_part[q + 1]) { first_j = row_index + nx_local * num_fun; for (i = 0; i < num_fun; i++) { for (j = 0; j < num_fun; j++) { j_ind = cnt + i * num_coeffs + j; diag_j[j_ind] = first_j + j; diag_data[j_ind] = value[2 * sz + i * num_fun + j] * mtrx[i * num_fun + j]; } } cnt += num_fun; } else { if (iy + 1 < ny) { big_first_j = big_num_fun * hypre_map(ix, iy + 1, iz, p, q + 1, r, nx, ny, nx_part, ny_part, nz_part); for (i = 0; i < num_fun; i++) { for (j = 0; j < num_fun; j++) { j_ind = o_cnt + i * num_offd_coeffs + j; big_offd_j[j_ind] = big_first_j + (HYPRE_BigInt)j; offd_data[j_ind] = value[2 * sz + i * num_fun + j] * mtrx[i * num_fun + j]; } } o_cnt += num_fun; } } if (iz + 1 < nz_part[r + 1]) { first_j = row_index + nx_local * ny_local * num_fun; for (i = 0; i < num_fun; i++) { for (j = 0; j < num_fun; j++) { j_ind = cnt + i * num_coeffs + j; diag_j[j_ind] = first_j + j; diag_data[j_ind] = value[3 * sz + i * num_fun + j] * mtrx[i * num_fun + j]; } } cnt += num_fun; } else { if (iz + 1 < nz) { big_first_j = big_num_fun * hypre_map(ix, iy, iz + 1, p, q, r + 1, nx, ny, nx_part, ny_part, nz_part); for (i = 0; i < num_fun; i++) { for (j = 0; j < num_fun; j++) { j_ind = o_cnt + i * num_offd_coeffs + j; big_offd_j[j_ind] = big_first_j + (HYPRE_BigInt)j; offd_data[j_ind] = value[3 * sz + i * num_fun + j] * mtrx[i * num_fun + j]; } } o_cnt += num_fun; } } row_index += num_fun; } } } if (num_procs > 1) { cnt = 0; for (i = 0; i < local_num_rows; i += num_fun) { for (j = offd_i[i]; j < offd_i[i + 1]; j++) { col_map_offd[cnt++] = big_offd_j[j]; } } hypre_BigQsort0(col_map_offd, 0, num_cols_offd - 1); for (i = 0; i < num_fun * num_cols_offd; i++) for (j = hypre_min(0, hypre_abs(i - num_fun)); j < num_cols_offd; j++) if (big_offd_j[i] == col_map_offd[j]) { offd_j[i] = j; break; } } for (i = 0; i < gp_size; i++) { global_part[i] *= num_fun; } for (j = 1; j < num_fun; j++) { for (i = 0; i < local_grid_size; i++) { row = i * num_fun + j; diag_index = diag_i[row]; index = diag_index + j; val = diag_data[diag_index]; col = diag_j[diag_index]; diag_data[diag_index] = diag_data[index]; diag_j[diag_index] = diag_j[index]; diag_data[index] = val; diag_j[index] = col; } } A = hypre_ParCSRMatrixCreate(comm, num_fun * grid_size, num_fun * grid_size, global_part, global_part, num_cols_offd, diag_i[local_num_rows], offd_i[local_num_rows]); hypre_ParCSRMatrixColMapOffd(A) = col_map_offd; diag = hypre_ParCSRMatrixDiag(A); hypre_CSRMatrixI(diag) = diag_i; hypre_CSRMatrixJ(diag) = diag_j; hypre_CSRMatrixData(diag) = diag_data; offd = hypre_ParCSRMatrixOffd(A); hypre_CSRMatrixI(offd) = offd_i; if (num_cols_offd) { hypre_CSRMatrixJ(offd) = offd_j; hypre_CSRMatrixData(offd) = offd_data; } hypre_CSRMatrixMemoryLocation(diag) = HYPRE_MEMORY_HOST; hypre_CSRMatrixMemoryLocation(offd) = HYPRE_MEMORY_HOST; hypre_ParCSRMatrixMigrate(A, hypre_HandleMemoryLocation(hypre_handle())); hypre_TFree(nx_part, HYPRE_MEMORY_HOST); hypre_TFree(ny_part, HYPRE_MEMORY_HOST); hypre_TFree(nz_part, HYPRE_MEMORY_HOST); hypre_TFree(big_offd_j, HYPRE_MEMORY_HOST); return (HYPRE_ParCSRMatrix) A; } hypre-2.33.0/src/parcsr_ls/par_laplace_27pt.c000066400000000000000000001733421477326011500210100ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "_hypre_parcsr_ls.h" /*-------------------------------------------------------------------------- * hypre_GenerateLaplacian27pt *--------------------------------------------------------------------------*/ HYPRE_ParCSRMatrix GenerateLaplacian27pt(MPI_Comm comm, HYPRE_BigInt nx, HYPRE_BigInt ny, HYPRE_BigInt nz, HYPRE_Int P, HYPRE_Int Q, HYPRE_Int R, HYPRE_Int p, HYPRE_Int q, HYPRE_Int r, HYPRE_Real *value ) { hypre_ParCSRMatrix *A; hypre_CSRMatrix *diag; hypre_CSRMatrix *offd; HYPRE_Int *diag_i; HYPRE_Int *diag_j; HYPRE_Real *diag_data; HYPRE_Int *offd_i; HYPRE_Int *offd_j = NULL; HYPRE_BigInt *big_offd_j = NULL; HYPRE_Real *offd_data = NULL; HYPRE_BigInt global_part[2]; HYPRE_BigInt ix, iy, iz; HYPRE_Int cnt, o_cnt; HYPRE_Int local_num_rows; HYPRE_BigInt *col_map_offd; HYPRE_BigInt *work; HYPRE_Int row_index; HYPRE_Int i; HYPRE_Int nx_local, ny_local, nz_local; HYPRE_Int num_cols_offd; HYPRE_Int nxy; HYPRE_BigInt grid_size; HYPRE_BigInt *nx_part; HYPRE_BigInt *ny_part; HYPRE_BigInt *nz_part; HYPRE_Int num_procs; HYPRE_Int P_busy, Q_busy, R_busy; hypre_MPI_Comm_size(comm, &num_procs); grid_size = nx * ny * nz; hypre_GeneratePartitioning(nx, P, &nx_part); hypre_GeneratePartitioning(ny, Q, &ny_part); hypre_GeneratePartitioning(nz, R, &nz_part); nx_local = (HYPRE_Int)(nx_part[p + 1] - nx_part[p]); ny_local = (HYPRE_Int)(ny_part[q + 1] - ny_part[q]); nz_local = (HYPRE_Int)(nz_part[r + 1] - nz_part[r]); local_num_rows = nx_local * ny_local * nz_local; global_part[0] = nz_part[r] * nx * ny + (ny_part[q] * nx + nx_part[p] * ny_local) * nz_local; global_part[1] = global_part[0] + (HYPRE_BigInt)local_num_rows; diag_i = hypre_CTAlloc(HYPRE_Int, local_num_rows + 1, HYPRE_MEMORY_HOST); offd_i = hypre_CTAlloc(HYPRE_Int, local_num_rows + 1, HYPRE_MEMORY_HOST); P_busy = hypre_min(nx, P); Q_busy = hypre_min(ny, Q); R_busy = hypre_min(nz, R); num_cols_offd = 0; if (p) { num_cols_offd += ny_local * nz_local; } if (p < P_busy - 1) { num_cols_offd += ny_local * nz_local; } if (q) { num_cols_offd += nx_local * nz_local; } if (q < Q_busy - 1) { num_cols_offd += nx_local * nz_local; } if (r) { num_cols_offd += nx_local * ny_local; } if (r < R_busy - 1) { num_cols_offd += nx_local * ny_local; } if (p && q) { num_cols_offd += nz_local; } if (p && q < Q_busy - 1 ) { num_cols_offd += nz_local; } if (p < P_busy - 1 && q ) { num_cols_offd += nz_local; } if (p < P_busy - 1 && q < Q_busy - 1 ) { num_cols_offd += nz_local; } if (p && r) { num_cols_offd += ny_local; } if (p && r < R_busy - 1 ) { num_cols_offd += ny_local; } if (p < P_busy - 1 && r ) { num_cols_offd += ny_local; } if (p < P_busy - 1 && r < R_busy - 1 ) { num_cols_offd += ny_local; } if (q && r) { num_cols_offd += nx_local; } if (q && r < R_busy - 1 ) { num_cols_offd += nx_local; } if (q < Q_busy - 1 && r ) { num_cols_offd += nx_local; } if (q < Q_busy - 1 && r < R_busy - 1 ) { num_cols_offd += nx_local; } if (p && q && r) { num_cols_offd++; } if (p && q && r < R_busy - 1) { num_cols_offd++; } if (p && q < Q_busy - 1 && r) { num_cols_offd++; } if (p && q < Q_busy - 1 && r < R_busy - 1) { num_cols_offd++; } if (p < P_busy - 1 && q && r) { num_cols_offd++; } if (p < P_busy - 1 && q && r < R_busy - 1 ) { num_cols_offd++; } if (p < P_busy - 1 && q < Q_busy - 1 && r ) { num_cols_offd++; } if (p < P_busy - 1 && q < Q_busy - 1 && r < R_busy - 1) { num_cols_offd++; } if (!local_num_rows) { num_cols_offd = 0; } col_map_offd = hypre_CTAlloc(HYPRE_BigInt, num_cols_offd, HYPRE_MEMORY_HOST); cnt = 0; o_cnt = 0; diag_i[0] = 0; offd_i[0] = 0; for (iz = nz_part[r]; iz < nz_part[r + 1]; iz++) { for (iy = ny_part[q]; iy < ny_part[q + 1]; iy++) { for (ix = nx_part[p]; ix < nx_part[p + 1]; ix++) { cnt++; o_cnt++; diag_i[cnt] = diag_i[cnt - 1]; offd_i[o_cnt] = offd_i[o_cnt - 1]; diag_i[cnt]++; if (iz > nz_part[r]) { diag_i[cnt]++; if (iy > ny_part[q]) { diag_i[cnt]++; if (ix > nx_part[p]) { diag_i[cnt]++; } else { if (ix) { offd_i[o_cnt]++; } } if (ix < nx_part[p + 1] - 1) { diag_i[cnt]++; } else { if (ix + 1 < nx) { offd_i[o_cnt]++; } } } else { if (iy) { offd_i[o_cnt]++; if (ix > nx_part[p]) { offd_i[o_cnt]++; } else if (ix) { offd_i[o_cnt]++; } if (ix < nx_part[p + 1] - 1) { offd_i[o_cnt]++; } else if (ix < nx - 1) { offd_i[o_cnt]++; } } } if (ix > nx_part[p]) { diag_i[cnt]++; } else { if (ix) { offd_i[o_cnt]++; } } if (ix + 1 < nx_part[p + 1]) { diag_i[cnt]++; } else { if (ix + 1 < nx) { offd_i[o_cnt]++; } } if (iy + 1 < ny_part[q + 1]) { diag_i[cnt]++; if (ix > nx_part[p]) { diag_i[cnt]++; } else { if (ix) { offd_i[o_cnt]++; } } if (ix < nx_part[p + 1] - 1) { diag_i[cnt]++; } else { if (ix + 1 < nx) { offd_i[o_cnt]++; } } } else { if (iy + 1 < ny) { offd_i[o_cnt]++; if (ix > nx_part[p]) { offd_i[o_cnt]++; } else if (ix) { offd_i[o_cnt]++; } if (ix < nx_part[p + 1] - 1) { offd_i[o_cnt]++; } else if (ix < nx - 1) { offd_i[o_cnt]++; } } } } else { if (iz) { offd_i[o_cnt]++; if (iy > ny_part[q]) { offd_i[o_cnt]++; if (ix > nx_part[p]) { offd_i[o_cnt]++; } else { if (ix) { offd_i[o_cnt]++; } } if (ix < nx_part[p + 1] - 1) { offd_i[o_cnt]++; } else { if (ix + 1 < nx) { offd_i[o_cnt]++; } } } else { if (iy) { offd_i[o_cnt]++; if (ix > nx_part[p]) { offd_i[o_cnt]++; } else if (ix) { offd_i[o_cnt]++; } if (ix < nx_part[p + 1] - 1) { offd_i[o_cnt]++; } else if (ix < nx - 1) { offd_i[o_cnt]++; } } } if (ix > nx_part[p]) { offd_i[o_cnt]++; } else { if (ix) { offd_i[o_cnt]++; } } if (ix + 1 < nx_part[p + 1]) { offd_i[o_cnt]++; } else { if (ix + 1 < nx) { offd_i[o_cnt]++; } } if (iy + 1 < ny_part[q + 1]) { offd_i[o_cnt]++; if (ix > nx_part[p]) { offd_i[o_cnt]++; } else { if (ix) { offd_i[o_cnt]++; } } if (ix < nx_part[p + 1] - 1) { offd_i[o_cnt]++; } else { if (ix + 1 < nx) { offd_i[o_cnt]++; } } } else { if (iy + 1 < ny) { offd_i[o_cnt]++; if (ix > nx_part[p]) { offd_i[o_cnt]++; } else if (ix) { offd_i[o_cnt]++; } if (ix < nx_part[p + 1] - 1) { offd_i[o_cnt]++; } else if (ix < nx - 1) { offd_i[o_cnt]++; } } } } } if (iy > ny_part[q]) { diag_i[cnt]++; if (ix > nx_part[p]) { diag_i[cnt]++; } else { if (ix) { offd_i[o_cnt]++; } } if (ix < nx_part[p + 1] - 1) { diag_i[cnt]++; } else { if (ix + 1 < nx) { offd_i[o_cnt]++; } } } else { if (iy) { offd_i[o_cnt]++; if (ix > nx_part[p]) { offd_i[o_cnt]++; } else if (ix) { offd_i[o_cnt]++; } if (ix < nx_part[p + 1] - 1) { offd_i[o_cnt]++; } else if (ix < nx - 1) { offd_i[o_cnt]++; } } } if (ix > nx_part[p]) { diag_i[cnt]++; } else { if (ix) { offd_i[o_cnt]++; } } if (ix + 1 < nx_part[p + 1]) { diag_i[cnt]++; } else { if (ix + 1 < nx) { offd_i[o_cnt]++; } } if (iy + 1 < ny_part[q + 1]) { diag_i[cnt]++; if (ix > nx_part[p]) { diag_i[cnt]++; } else { if (ix) { offd_i[o_cnt]++; } } if (ix < nx_part[p + 1] - 1) { diag_i[cnt]++; } else { if (ix + 1 < nx) { offd_i[o_cnt]++; } } } else { if (iy + 1 < ny) { offd_i[o_cnt]++; if (ix > nx_part[p]) { offd_i[o_cnt]++; } else if (ix) { offd_i[o_cnt]++; } if (ix < nx_part[p + 1] - 1) { offd_i[o_cnt]++; } else if (ix < nx - 1) { offd_i[o_cnt]++; } } } if (iz + 1 < nz_part[r + 1]) { diag_i[cnt]++; if (iy > ny_part[q]) { diag_i[cnt]++; if (ix > nx_part[p]) { diag_i[cnt]++; } else { if (ix) { offd_i[o_cnt]++; } } if (ix < nx_part[p + 1] - 1) { diag_i[cnt]++; } else { if (ix + 1 < nx) { offd_i[o_cnt]++; } } } else { if (iy) { offd_i[o_cnt]++; if (ix > nx_part[p]) { offd_i[o_cnt]++; } else if (ix) { offd_i[o_cnt]++; } if (ix < nx_part[p + 1] - 1) { offd_i[o_cnt]++; } else if (ix < nx - 1) { offd_i[o_cnt]++; } } } if (ix > nx_part[p]) { diag_i[cnt]++; } else { if (ix) { offd_i[o_cnt]++; } } if (ix + 1 < nx_part[p + 1]) { diag_i[cnt]++; } else { if (ix + 1 < nx) { offd_i[o_cnt]++; } } if (iy + 1 < ny_part[q + 1]) { diag_i[cnt]++; if (ix > nx_part[p]) { diag_i[cnt]++; } else { if (ix) { offd_i[o_cnt]++; } } if (ix < nx_part[p + 1] - 1) { diag_i[cnt]++; } else { if (ix + 1 < nx) { offd_i[o_cnt]++; } } } else { if (iy + 1 < ny) { offd_i[o_cnt]++; if (ix > nx_part[p]) { offd_i[o_cnt]++; } else if (ix) { offd_i[o_cnt]++; } if (ix < nx_part[p + 1] - 1) { offd_i[o_cnt]++; } else if (ix < nx - 1) { offd_i[o_cnt]++; } } } } else { if (iz + 1 < nz) { offd_i[o_cnt]++; if (iy > ny_part[q]) { offd_i[o_cnt]++; if (ix > nx_part[p]) { offd_i[o_cnt]++; } else { if (ix) { offd_i[o_cnt]++; } } if (ix < nx_part[p + 1] - 1) { offd_i[o_cnt]++; } else { if (ix + 1 < nx) { offd_i[o_cnt]++; } } } else { if (iy) { offd_i[o_cnt]++; if (ix > nx_part[p]) { offd_i[o_cnt]++; } else if (ix) { offd_i[o_cnt]++; } if (ix < nx_part[p + 1] - 1) { offd_i[o_cnt]++; } else if (ix < nx - 1) { offd_i[o_cnt]++; } } } if (ix > nx_part[p]) { offd_i[o_cnt]++; } else { if (ix) { offd_i[o_cnt]++; } } if (ix + 1 < nx_part[p + 1]) { offd_i[o_cnt]++; } else { if (ix + 1 < nx) { offd_i[o_cnt]++; } } if (iy + 1 < ny_part[q + 1]) { offd_i[o_cnt]++; if (ix > nx_part[p]) { offd_i[o_cnt]++; } else { if (ix) { offd_i[o_cnt]++; } } if (ix < nx_part[p + 1] - 1) { offd_i[o_cnt]++; } else { if (ix + 1 < nx) { offd_i[o_cnt]++; } } } else { if (iy + 1 < ny) { offd_i[o_cnt]++; if (ix > nx_part[p]) { offd_i[o_cnt]++; } else if (ix) { offd_i[o_cnt]++; } if (ix < nx_part[p + 1] - 1) { offd_i[o_cnt]++; } else if (ix < nx - 1) { offd_i[o_cnt]++; } } } } } } } } diag_j = hypre_CTAlloc(HYPRE_Int, diag_i[local_num_rows], HYPRE_MEMORY_HOST); diag_data = hypre_CTAlloc(HYPRE_Real, diag_i[local_num_rows], HYPRE_MEMORY_HOST); if (num_procs > 1) { big_offd_j = hypre_CTAlloc(HYPRE_BigInt, offd_i[local_num_rows], HYPRE_MEMORY_HOST); offd_j = hypre_CTAlloc(HYPRE_Int, offd_i[local_num_rows], HYPRE_MEMORY_HOST); offd_data = hypre_CTAlloc(HYPRE_Real, offd_i[local_num_rows], HYPRE_MEMORY_HOST); } nxy = nx_local * ny_local; row_index = 0; cnt = 0; o_cnt = 0; for (iz = nz_part[r]; iz < nz_part[r + 1]; iz++) { for (iy = ny_part[q]; iy < ny_part[q + 1]; iy++) { for (ix = nx_part[p]; ix < nx_part[p + 1]; ix++) { diag_j[cnt] = row_index; diag_data[cnt++] = value[0]; if (iz > nz_part[r]) { if (iy > ny_part[q]) { if (ix > nx_part[p]) { diag_j[cnt] = row_index - nxy - nx_local - 1; diag_data[cnt++] = value[1]; } else { if (ix) { big_offd_j[o_cnt] = hypre_map(ix - 1, iy - 1, iz - 1, p - 1, q, r, nx, ny, nx_part, ny_part, nz_part); offd_data[o_cnt++] = value[1]; } } diag_j[cnt] = row_index - nxy - nx_local; diag_data[cnt++] = value[1]; if (ix < nx_part[p + 1] - 1) { diag_j[cnt] = row_index - nxy - nx_local + 1; diag_data[cnt++] = value[1]; } else { if (ix + 1 < nx) { big_offd_j[o_cnt] = hypre_map(ix + 1, iy - 1, iz - 1, p + 1, q, r, nx, ny, nx_part, ny_part, nz_part); offd_data[o_cnt++] = value[1]; } } } else { if (iy) { if (ix > nx_part[p]) { big_offd_j[o_cnt] = hypre_map(ix - 1, iy - 1, iz - 1, p, q - 1, r, nx, ny, nx_part, ny_part, nz_part); offd_data[o_cnt++] = value[1]; } else if (ix) { big_offd_j[o_cnt] = hypre_map(ix - 1, iy - 1, iz - 1, p - 1, q - 1, r, nx, ny, nx_part, ny_part, nz_part); offd_data[o_cnt++] = value[1]; } big_offd_j[o_cnt] = hypre_map(ix, iy - 1, iz - 1, p, q - 1, r, nx, ny, nx_part, ny_part, nz_part); offd_data[o_cnt++] = value[1]; if (ix < nx_part[p + 1] - 1) { big_offd_j[o_cnt] = hypre_map(ix + 1, iy - 1, iz - 1, p, q - 1, r, nx, ny, nx_part, ny_part, nz_part); offd_data[o_cnt++] = value[1]; } else if (ix < nx - 1) { big_offd_j[o_cnt] = hypre_map(ix + 1, iy - 1, iz - 1, p + 1, q - 1, r, nx, ny, nx_part, ny_part, nz_part); offd_data[o_cnt++] = value[1]; } } } if (ix > nx_part[p]) { diag_j[cnt] = row_index - nxy - 1; diag_data[cnt++] = value[1]; } else { if (ix) { big_offd_j[o_cnt] = hypre_map(ix - 1, iy, iz - 1, p - 1, q, r, nx, ny, nx_part, ny_part, nz_part); offd_data[o_cnt++] = value[1]; } } diag_j[cnt] = row_index - nxy; diag_data[cnt++] = value[1]; if (ix + 1 < nx_part[p + 1]) { diag_j[cnt] = row_index - nxy + 1; diag_data[cnt++] = value[1]; } else { if (ix + 1 < nx) { big_offd_j[o_cnt] = hypre_map(ix + 1, iy, iz - 1, p + 1, q, r, nx, ny, nx_part, ny_part, nz_part); offd_data[o_cnt++] = value[1]; } } if (iy + 1 < ny_part[q + 1]) { if (ix > nx_part[p]) { diag_j[cnt] = row_index - nxy + nx_local - 1; diag_data[cnt++] = value[1]; } else { if (ix) { big_offd_j[o_cnt] = hypre_map(ix - 1, iy + 1, iz - 1, p - 1, q, r, nx, ny, nx_part, ny_part, nz_part); offd_data[o_cnt++] = value[1]; } } diag_j[cnt] = row_index - nxy + nx_local; diag_data[cnt++] = value[1]; if (ix < nx_part[p + 1] - 1) { diag_j[cnt] = row_index - nxy + nx_local + 1; diag_data[cnt++] = value[1]; } else { if (ix + 1 < nx) { big_offd_j[o_cnt] = hypre_map(ix + 1, iy + 1, iz - 1, p + 1, q, r, nx, ny, nx_part, ny_part, nz_part); offd_data[o_cnt++] = value[1]; } } } else { if (iy + 1 < ny) { if (ix > nx_part[p]) { big_offd_j[o_cnt] = hypre_map(ix - 1, iy + 1, iz - 1, p, q + 1, r, nx, ny, nx_part, ny_part, nz_part); offd_data[o_cnt++] = value[1]; } else if (ix) { big_offd_j[o_cnt] = hypre_map(ix - 1, iy + 1, iz - 1, p - 1, q + 1, r, nx, ny, nx_part, ny_part, nz_part); offd_data[o_cnt++] = value[1]; } big_offd_j[o_cnt] = hypre_map(ix, iy + 1, iz - 1, p, q + 1, r, nx, ny, nx_part, ny_part, nz_part); offd_data[o_cnt++] = value[1]; if (ix < nx_part[p + 1] - 1) { big_offd_j[o_cnt] = hypre_map(ix + 1, iy + 1, iz - 1, p, q + 1, r, nx, ny, nx_part, ny_part, nz_part); offd_data[o_cnt++] = value[1]; } else if (ix < nx - 1) { big_offd_j[o_cnt] = hypre_map(ix + 1, iy + 1, iz - 1, p + 1, q + 1, r, nx, ny, nx_part, ny_part, nz_part); offd_data[o_cnt++] = value[1]; } } } } else { if (iz) { if (iy > ny_part[q]) { if (ix > nx_part[p]) { big_offd_j[o_cnt] = hypre_map(ix - 1, iy - 1, iz - 1, p, q, r - 1, nx, ny, nx_part, ny_part, nz_part); offd_data[o_cnt++] = value[1]; } else { if (ix) { big_offd_j[o_cnt] = hypre_map(ix - 1, iy - 1, iz - 1, p - 1, q, r - 1, nx, ny, nx_part, ny_part, nz_part); offd_data[o_cnt++] = value[1]; } } big_offd_j[o_cnt] = hypre_map(ix, iy - 1, iz - 1, p, q, r - 1, nx, ny, nx_part, ny_part, nz_part); offd_data[o_cnt++] = value[1]; if (ix < nx_part[p + 1] - 1) { big_offd_j[o_cnt] = hypre_map(ix + 1, iy - 1, iz - 1, p, q, r - 1, nx, ny, nx_part, ny_part, nz_part); offd_data[o_cnt++] = value[1]; } else { if (ix + 1 < nx) { big_offd_j[o_cnt] = hypre_map(ix + 1, iy - 1, iz - 1, p + 1, q, r - 1, nx, ny, nx_part, ny_part, nz_part); offd_data[o_cnt++] = value[1]; } } } else { if (iy) { if (ix > nx_part[p]) { big_offd_j[o_cnt] = hypre_map(ix - 1, iy - 1, iz - 1, p, q - 1, r - 1, nx, ny, nx_part, ny_part, nz_part); offd_data[o_cnt++] = value[1]; } else if (ix) { big_offd_j[o_cnt] = hypre_map(ix - 1, iy - 1, iz - 1, p - 1, q - 1, r - 1, nx, ny, nx_part, ny_part, nz_part); offd_data[o_cnt++] = value[1]; } big_offd_j[o_cnt] = hypre_map(ix, iy - 1, iz - 1, p, q - 1, r - 1, nx, ny, nx_part, ny_part, nz_part); offd_data[o_cnt++] = value[1]; if (ix < nx_part[p + 1] - 1) { big_offd_j[o_cnt] = hypre_map(ix + 1, iy - 1, iz - 1, p, q - 1, r - 1, nx, ny, nx_part, ny_part, nz_part); offd_data[o_cnt++] = value[1]; } else if (ix < nx - 1) { big_offd_j[o_cnt] = hypre_map(ix + 1, iy - 1, iz - 1, p + 1, q - 1, r - 1, nx, ny, nx_part, ny_part, nz_part); offd_data[o_cnt++] = value[1]; } } } if (ix > nx_part[p]) { big_offd_j[o_cnt] = hypre_map(ix - 1, iy, iz - 1, p, q, r - 1, nx, ny, nx_part, ny_part, nz_part); offd_data[o_cnt++] = value[1]; } else { if (ix) { big_offd_j[o_cnt] = hypre_map(ix - 1, iy, iz - 1, p - 1, q, r - 1, nx, ny, nx_part, ny_part, nz_part); offd_data[o_cnt++] = value[1]; } } big_offd_j[o_cnt] = hypre_map(ix, iy, iz - 1, p, q, r - 1, nx, ny, nx_part, ny_part, nz_part); offd_data[o_cnt++] = value[1]; if (ix + 1 < nx_part[p + 1]) { big_offd_j[o_cnt] = hypre_map(ix + 1, iy, iz - 1, p, q, r - 1, nx, ny, nx_part, ny_part, nz_part); offd_data[o_cnt++] = value[1]; } else { if (ix + 1 < nx) { big_offd_j[o_cnt] = hypre_map(ix + 1, iy, iz - 1, p + 1, q, r - 1, nx, ny, nx_part, ny_part, nz_part); offd_data[o_cnt++] = value[1]; } } if (iy + 1 < ny_part[q + 1]) { if (ix > nx_part[p]) { big_offd_j[o_cnt] = hypre_map(ix - 1, iy + 1, iz - 1, p, q, r - 1, nx, ny, nx_part, ny_part, nz_part); offd_data[o_cnt++] = value[1]; } else { if (ix) { big_offd_j[o_cnt] = hypre_map(ix - 1, iy + 1, iz - 1, p - 1, q, r - 1, nx, ny, nx_part, ny_part, nz_part); offd_data[o_cnt++] = value[1]; } } big_offd_j[o_cnt] = hypre_map(ix, iy + 1, iz - 1, p, q, r - 1, nx, ny, nx_part, ny_part, nz_part); offd_data[o_cnt++] = value[1]; if (ix < nx_part[p + 1] - 1) { big_offd_j[o_cnt] = hypre_map(ix + 1, iy + 1, iz - 1, p, q, r - 1, nx, ny, nx_part, ny_part, nz_part); offd_data[o_cnt++] = value[1]; } else { if (ix + 1 < nx) { big_offd_j[o_cnt] = hypre_map(ix + 1, iy + 1, iz - 1, p + 1, q, r - 1, nx, ny, nx_part, ny_part, nz_part); offd_data[o_cnt++] = value[1]; } } } else { if (iy + 1 < ny) { if (ix > nx_part[p]) { big_offd_j[o_cnt] = hypre_map(ix - 1, iy + 1, iz - 1, p, q + 1, r - 1, nx, ny, nx_part, ny_part, nz_part); offd_data[o_cnt++] = value[1]; } else if (ix) { big_offd_j[o_cnt] = hypre_map(ix - 1, iy + 1, iz - 1, p - 1, q + 1, r - 1, nx, ny, nx_part, ny_part, nz_part); offd_data[o_cnt++] = value[1]; } big_offd_j[o_cnt] = hypre_map(ix, iy + 1, iz - 1, p, q + 1, r - 1, nx, ny, nx_part, ny_part, nz_part); offd_data[o_cnt++] = value[1]; if (ix < nx_part[p + 1] - 1) { big_offd_j[o_cnt] = hypre_map(ix + 1, iy + 1, iz - 1, p, q + 1, r - 1, nx, ny, nx_part, ny_part, nz_part); offd_data[o_cnt++] = value[1]; } else if (ix < nx - 1) { big_offd_j[o_cnt] = hypre_map(ix + 1, iy + 1, iz - 1, p + 1, q + 1, r - 1, nx, ny, nx_part, ny_part, nz_part); offd_data[o_cnt++] = value[1]; } } } } } if (iy > ny_part[q]) { if (ix > nx_part[p]) { diag_j[cnt] = row_index - nx_local - 1; diag_data[cnt++] = value[1]; } else { if (ix) { big_offd_j[o_cnt] = hypre_map(ix - 1, iy - 1, iz, p - 1, q, r, nx, ny, nx_part, ny_part, nz_part); offd_data[o_cnt++] = value[1]; } } diag_j[cnt] = row_index - nx_local; diag_data[cnt++] = value[1]; if (ix < nx_part[p + 1] - 1) { diag_j[cnt] = row_index - nx_local + 1; diag_data[cnt++] = value[1]; } else { if (ix + 1 < nx) { big_offd_j[o_cnt] = hypre_map(ix + 1, iy - 1, iz, p + 1, q, r, nx, ny, nx_part, ny_part, nz_part); offd_data[o_cnt++] = value[1]; } } } else { if (iy) { if (ix > nx_part[p]) { big_offd_j[o_cnt] = hypre_map(ix - 1, iy - 1, iz, p, q - 1, r, nx, ny, nx_part, ny_part, nz_part); offd_data[o_cnt++] = value[1]; } else if (ix) { big_offd_j[o_cnt] = hypre_map(ix - 1, iy - 1, iz, p - 1, q - 1, r, nx, ny, nx_part, ny_part, nz_part); offd_data[o_cnt++] = value[1]; } big_offd_j[o_cnt] = hypre_map(ix, iy - 1, iz, p, q - 1, r, nx, ny, nx_part, ny_part, nz_part); offd_data[o_cnt++] = value[1]; if (ix < nx_part[p + 1] - 1) { big_offd_j[o_cnt] = hypre_map(ix + 1, iy - 1, iz, p, q - 1, r, nx, ny, nx_part, ny_part, nz_part); offd_data[o_cnt++] = value[1]; } else if (ix < nx - 1) { big_offd_j[o_cnt] = hypre_map(ix + 1, iy - 1, iz, p + 1, q - 1, r, nx, ny, nx_part, ny_part, nz_part); offd_data[o_cnt++] = value[1]; } } } if (ix > nx_part[p]) { diag_j[cnt] = row_index - 1; diag_data[cnt++] = value[1]; } else { if (ix) { big_offd_j[o_cnt] = hypre_map(ix - 1, iy, iz, p - 1, q, r, nx, ny, nx_part, ny_part, nz_part); offd_data[o_cnt++] = value[1]; } } if (ix + 1 < nx_part[p + 1]) { diag_j[cnt] = row_index + 1; diag_data[cnt++] = value[1]; } else { if (ix + 1 < nx) { big_offd_j[o_cnt] = hypre_map(ix + 1, iy, iz, p + 1, q, r, nx, ny, nx_part, ny_part, nz_part); offd_data[o_cnt++] = value[1]; } } if (iy + 1 < ny_part[q + 1]) { if (ix > nx_part[p]) { diag_j[cnt] = row_index + nx_local - 1; diag_data[cnt++] = value[1]; } else { if (ix) { big_offd_j[o_cnt] = hypre_map(ix - 1, iy + 1, iz, p - 1, q, r, nx, ny, nx_part, ny_part, nz_part); offd_data[o_cnt++] = value[1]; } } diag_j[cnt] = row_index + nx_local; diag_data[cnt++] = value[1]; if (ix < nx_part[p + 1] - 1) { diag_j[cnt] = row_index + nx_local + 1; diag_data[cnt++] = value[1]; } else { if (ix + 1 < nx) { big_offd_j[o_cnt] = hypre_map(ix + 1, iy + 1, iz, p + 1, q, r, nx, ny, nx_part, ny_part, nz_part); offd_data[o_cnt++] = value[1]; } } } else { if (iy + 1 < ny) { if (ix > nx_part[p]) { big_offd_j[o_cnt] = hypre_map(ix - 1, iy + 1, iz, p, q + 1, r, nx, ny, nx_part, ny_part, nz_part); offd_data[o_cnt++] = value[1]; } else if (ix) { big_offd_j[o_cnt] = hypre_map(ix - 1, iy + 1, iz, p - 1, q + 1, r, nx, ny, nx_part, ny_part, nz_part); offd_data[o_cnt++] = value[1]; } big_offd_j[o_cnt] = hypre_map(ix, iy + 1, iz, p, q + 1, r, nx, ny, nx_part, ny_part, nz_part); offd_data[o_cnt++] = value[1]; if (ix < nx_part[p + 1] - 1) { big_offd_j[o_cnt] = hypre_map(ix + 1, iy + 1, iz, p, q + 1, r, nx, ny, nx_part, ny_part, nz_part); offd_data[o_cnt++] = value[1]; } else if (ix < nx - 1) { big_offd_j[o_cnt] = hypre_map(ix + 1, iy + 1, iz, p + 1, q + 1, r, nx, ny, nx_part, ny_part, nz_part); offd_data[o_cnt++] = value[1]; } } } if (iz + 1 < nz_part[r + 1]) { if (iy > ny_part[q]) { if (ix > nx_part[p]) { diag_j[cnt] = row_index + nxy - nx_local - 1; diag_data[cnt++] = value[1]; } else { if (ix) { big_offd_j[o_cnt] = hypre_map(ix - 1, iy - 1, iz + 1, p - 1, q, r, nx, ny, nx_part, ny_part, nz_part); offd_data[o_cnt++] = value[1]; } } diag_j[cnt] = row_index + nxy - nx_local; diag_data[cnt++] = value[1]; if (ix < nx_part[p + 1] - 1) { diag_j[cnt] = row_index + nxy - nx_local + 1; diag_data[cnt++] = value[1]; } else { if (ix + 1 < nx) { big_offd_j[o_cnt] = hypre_map(ix + 1, iy - 1, iz + 1, p + 1, q, r, nx, ny, nx_part, ny_part, nz_part); offd_data[o_cnt++] = value[1]; } } } else { if (iy) { if (ix > nx_part[p]) { big_offd_j[o_cnt] = hypre_map(ix - 1, iy - 1, iz + 1, p, q - 1, r, nx, ny, nx_part, ny_part, nz_part); offd_data[o_cnt++] = value[1]; } else if (ix) { big_offd_j[o_cnt] = hypre_map(ix - 1, iy - 1, iz + 1, p - 1, q - 1, r, nx, ny, nx_part, ny_part, nz_part); offd_data[o_cnt++] = value[1]; } big_offd_j[o_cnt] = hypre_map(ix, iy - 1, iz + 1, p, q - 1, r, nx, ny, nx_part, ny_part, nz_part); offd_data[o_cnt++] = value[1]; if (ix < nx_part[p + 1] - 1) { big_offd_j[o_cnt] = hypre_map(ix + 1, iy - 1, iz + 1, p, q - 1, r, nx, ny, nx_part, ny_part, nz_part); offd_data[o_cnt++] = value[1]; } else if (ix < nx - 1) { big_offd_j[o_cnt] = hypre_map(ix + 1, iy - 1, iz + 1, p + 1, q - 1, r, nx, ny, nx_part, ny_part, nz_part); offd_data[o_cnt++] = value[1]; } } } if (ix > nx_part[p]) { diag_j[cnt] = row_index + nxy - 1; diag_data[cnt++] = value[1]; } else { if (ix) { big_offd_j[o_cnt] = hypre_map(ix - 1, iy, iz + 1, p - 1, q, r, nx, ny, nx_part, ny_part, nz_part); offd_data[o_cnt++] = value[1]; } } diag_j[cnt] = row_index + nxy; diag_data[cnt++] = value[1]; if (ix + 1 < nx_part[p + 1]) { diag_j[cnt] = row_index + nxy + 1; diag_data[cnt++] = value[1]; } else { if (ix + 1 < nx) { big_offd_j[o_cnt] = hypre_map(ix + 1, iy, iz + 1, p + 1, q, r, nx, ny, nx_part, ny_part, nz_part); offd_data[o_cnt++] = value[1]; } } if (iy + 1 < ny_part[q + 1]) { if (ix > nx_part[p]) { diag_j[cnt] = row_index + nxy + nx_local - 1; diag_data[cnt++] = value[1]; } else { if (ix) { big_offd_j[o_cnt] = hypre_map(ix - 1, iy + 1, iz + 1, p - 1, q, r, nx, ny, nx_part, ny_part, nz_part); offd_data[o_cnt++] = value[1]; } } diag_j[cnt] = row_index + nxy + nx_local; diag_data[cnt++] = value[1]; if (ix < nx_part[p + 1] - 1) { diag_j[cnt] = row_index + nxy + nx_local + 1; diag_data[cnt++] = value[1]; } else { if (ix + 1 < nx) { big_offd_j[o_cnt] = hypre_map(ix + 1, iy + 1, iz + 1, p + 1, q, r, nx, ny, nx_part, ny_part, nz_part); offd_data[o_cnt++] = value[1]; } } } else { if (iy + 1 < ny) { if (ix > nx_part[p]) { big_offd_j[o_cnt] = hypre_map(ix - 1, iy + 1, iz + 1, p, q + 1, r, nx, ny, nx_part, ny_part, nz_part); offd_data[o_cnt++] = value[1]; } else if (ix) { big_offd_j[o_cnt] = hypre_map(ix - 1, iy + 1, iz + 1, p - 1, q + 1, r, nx, ny, nx_part, ny_part, nz_part); offd_data[o_cnt++] = value[1]; } big_offd_j[o_cnt] = hypre_map(ix, iy + 1, iz + 1, p, q + 1, r, nx, ny, nx_part, ny_part, nz_part); offd_data[o_cnt++] = value[1]; if (ix < nx_part[p + 1] - 1) { big_offd_j[o_cnt] = hypre_map(ix + 1, iy + 1, iz + 1, p, q + 1, r, nx, ny, nx_part, ny_part, nz_part); offd_data[o_cnt++] = value[1]; } else if (ix < nx - 1) { big_offd_j[o_cnt] = hypre_map(ix + 1, iy + 1, iz + 1, p + 1, q + 1, r, nx, ny, nx_part, ny_part, nz_part); offd_data[o_cnt++] = value[1]; } } } } else { if (iz + 1 < nz) { if (iy > ny_part[q]) { if (ix > nx_part[p]) { big_offd_j[o_cnt] = hypre_map(ix - 1, iy - 1, iz + 1, p, q, r + 1, nx, ny, nx_part, ny_part, nz_part); offd_data[o_cnt++] = value[1]; } else { if (ix) { big_offd_j[o_cnt] = hypre_map(ix - 1, iy - 1, iz + 1, p - 1, q, r + 1, nx, ny, nx_part, ny_part, nz_part); offd_data[o_cnt++] = value[1]; } } big_offd_j[o_cnt] = hypre_map(ix, iy - 1, iz + 1, p, q, r + 1, nx, ny, nx_part, ny_part, nz_part); offd_data[o_cnt++] = value[1]; if (ix < nx_part[p + 1] - 1) { big_offd_j[o_cnt] = hypre_map(ix + 1, iy - 1, iz + 1, p, q, r + 1, nx, ny, nx_part, ny_part, nz_part); offd_data[o_cnt++] = value[1]; } else { if (ix + 1 < nx) { big_offd_j[o_cnt] = hypre_map(ix + 1, iy - 1, iz + 1, p + 1, q, r + 1, nx, ny, nx_part, ny_part, nz_part); offd_data[o_cnt++] = value[1]; } } } else { if (iy) { if (ix > nx_part[p]) { big_offd_j[o_cnt] = hypre_map(ix - 1, iy - 1, iz + 1, p, q - 1, r + 1, nx, ny, nx_part, ny_part, nz_part); offd_data[o_cnt++] = value[1]; } else if (ix) { big_offd_j[o_cnt] = hypre_map(ix - 1, iy - 1, iz + 1, p - 1, q - 1, r + 1, nx, ny, nx_part, ny_part, nz_part); offd_data[o_cnt++] = value[1]; } big_offd_j[o_cnt] = hypre_map(ix, iy - 1, iz + 1, p, q - 1, r + 1, nx, ny, nx_part, ny_part, nz_part); offd_data[o_cnt++] = value[1]; if (ix < nx_part[p + 1] - 1) { big_offd_j[o_cnt] = hypre_map(ix + 1, iy - 1, iz + 1, p, q - 1, r + 1, nx, ny, nx_part, ny_part, nz_part); offd_data[o_cnt++] = value[1]; } else if (ix < nx - 1) { big_offd_j[o_cnt] = hypre_map(ix + 1, iy - 1, iz + 1, p + 1, q - 1, r + 1, nx, ny, nx_part, ny_part, nz_part); offd_data[o_cnt++] = value[1]; } } } if (ix > nx_part[p]) { big_offd_j[o_cnt] = hypre_map(ix - 1, iy, iz + 1, p, q, r + 1, nx, ny, nx_part, ny_part, nz_part); offd_data[o_cnt++] = value[1]; } else { if (ix) { big_offd_j[o_cnt] = hypre_map(ix - 1, iy, iz + 1, p - 1, q, r + 1, nx, ny, nx_part, ny_part, nz_part); offd_data[o_cnt++] = value[1]; } } big_offd_j[o_cnt] = hypre_map(ix, iy, iz + 1, p, q, r + 1, nx, ny, nx_part, ny_part, nz_part); offd_data[o_cnt++] = value[1]; if (ix + 1 < nx_part[p + 1]) { big_offd_j[o_cnt] = hypre_map(ix + 1, iy, iz + 1, p, q, r + 1, nx, ny, nx_part, ny_part, nz_part); offd_data[o_cnt++] = value[1]; } else { if (ix + 1 < nx) { big_offd_j[o_cnt] = hypre_map(ix + 1, iy, iz + 1, p + 1, q, r + 1, nx, ny, nx_part, ny_part, nz_part); offd_data[o_cnt++] = value[1]; } } if (iy + 1 < ny_part[q + 1]) { if (ix > nx_part[p]) { big_offd_j[o_cnt] = hypre_map(ix - 1, iy + 1, iz + 1, p, q, r + 1, nx, ny, nx_part, ny_part, nz_part); offd_data[o_cnt++] = value[1]; } else { if (ix) { big_offd_j[o_cnt] = hypre_map(ix - 1, iy + 1, iz + 1, p - 1, q, r + 1, nx, ny, nx_part, ny_part, nz_part); offd_data[o_cnt++] = value[1]; } } big_offd_j[o_cnt] = hypre_map(ix, iy + 1, iz + 1, p, q, r + 1, nx, ny, nx_part, ny_part, nz_part); offd_data[o_cnt++] = value[1]; if (ix < nx_part[p + 1] - 1) { big_offd_j[o_cnt] = hypre_map(ix + 1, iy + 1, iz + 1, p, q, r + 1, nx, ny, nx_part, ny_part, nz_part); offd_data[o_cnt++] = value[1]; } else { if (ix + 1 < nx) { big_offd_j[o_cnt] = hypre_map(ix + 1, iy + 1, iz + 1, p + 1, q, r + 1, nx, ny, nx_part, ny_part, nz_part); offd_data[o_cnt++] = value[1]; } } } else { if (iy + 1 < ny) { if (ix > nx_part[p]) { big_offd_j[o_cnt] = hypre_map(ix - 1, iy + 1, iz + 1, p, q + 1, r + 1, nx, ny, nx_part, ny_part, nz_part); offd_data[o_cnt++] = value[1]; } else if (ix) { big_offd_j[o_cnt] = hypre_map(ix - 1, iy + 1, iz + 1, p - 1, q + 1, r + 1, nx, ny, nx_part, ny_part, nz_part); offd_data[o_cnt++] = value[1]; } big_offd_j[o_cnt] = hypre_map(ix, iy + 1, iz + 1, p, q + 1, r + 1, nx, ny, nx_part, ny_part, nz_part); offd_data[o_cnt++] = value[1]; if (ix < nx_part[p + 1] - 1) { big_offd_j[o_cnt] = hypre_map(ix + 1, iy + 1, iz + 1, p, q + 1, r + 1, nx, ny, nx_part, ny_part, nz_part); offd_data[o_cnt++] = value[1]; } else if (ix < nx - 1) { big_offd_j[o_cnt] = hypre_map(ix + 1, iy + 1, iz + 1, p + 1, q + 1, r + 1, nx, ny, nx_part, ny_part, nz_part); offd_data[o_cnt++] = value[1]; } } } } } row_index++; } } } if (num_procs > 1) { work = hypre_CTAlloc(HYPRE_BigInt, o_cnt, HYPRE_MEMORY_HOST); for (i = 0; i < o_cnt; i++) { work[i] = big_offd_j[i]; } hypre_BigQsort0(work, 0, o_cnt - 1); col_map_offd[0] = work[0]; cnt = 0; for (i = 0; i < o_cnt; i++) { if (work[i] > col_map_offd[cnt]) { cnt++; col_map_offd[cnt] = work[i]; } } for (i = 0; i < o_cnt; i++) { offd_j[i] = hypre_BigBinarySearch(col_map_offd, big_offd_j[i], num_cols_offd); } hypre_TFree(work, HYPRE_MEMORY_HOST); } A = hypre_ParCSRMatrixCreate(comm, grid_size, grid_size, global_part, global_part, num_cols_offd, diag_i[local_num_rows], offd_i[local_num_rows]); hypre_ParCSRMatrixColMapOffd(A) = col_map_offd; diag = hypre_ParCSRMatrixDiag(A); hypre_CSRMatrixI(diag) = diag_i; hypre_CSRMatrixJ(diag) = diag_j; hypre_CSRMatrixData(diag) = diag_data; offd = hypre_ParCSRMatrixOffd(A); hypre_CSRMatrixI(offd) = offd_i; if (num_cols_offd) { hypre_CSRMatrixJ(offd) = offd_j; hypre_CSRMatrixData(offd) = offd_data; } hypre_CSRMatrixMemoryLocation(diag) = HYPRE_MEMORY_HOST; hypre_CSRMatrixMemoryLocation(offd) = HYPRE_MEMORY_HOST; hypre_ParCSRMatrixMigrate(A, hypre_HandleMemoryLocation(hypre_handle())); hypre_TFree(nx_part, HYPRE_MEMORY_HOST); hypre_TFree(ny_part, HYPRE_MEMORY_HOST); hypre_TFree(nz_part, HYPRE_MEMORY_HOST); hypre_TFree(big_offd_j, HYPRE_MEMORY_HOST); return (HYPRE_ParCSRMatrix) A; } hypre-2.33.0/src/parcsr_ls/par_laplace_9pt.c000066400000000000000000000345231477326011500207250ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "_hypre_parcsr_ls.h" /*-------------------------------------------------------------------------- * hypre_GenerateLaplacian9pt *--------------------------------------------------------------------------*/ HYPRE_ParCSRMatrix GenerateLaplacian9pt( MPI_Comm comm, HYPRE_BigInt nx, HYPRE_BigInt ny, HYPRE_Int P, HYPRE_Int Q, HYPRE_Int p, HYPRE_Int q, HYPRE_Real *value ) { hypre_ParCSRMatrix *A; hypre_CSRMatrix *diag; hypre_CSRMatrix *offd; HYPRE_Int *diag_i; HYPRE_Int *diag_j; HYPRE_Real *diag_data; HYPRE_Int *offd_i; HYPRE_Int *offd_j = NULL; HYPRE_Real *offd_data = NULL; HYPRE_BigInt global_part[2]; HYPRE_BigInt ix, iy; HYPRE_Int cnt, o_cnt; HYPRE_Int local_num_rows; HYPRE_BigInt *col_map_offd; HYPRE_BigInt *big_offd_j = NULL; HYPRE_Int row_index; HYPRE_Int i; HYPRE_Int nx_local, ny_local; HYPRE_Int num_cols_offd; HYPRE_BigInt grid_size; HYPRE_BigInt *nx_part; HYPRE_BigInt *ny_part; HYPRE_Int num_procs; HYPRE_Int P_busy, Q_busy; hypre_MPI_Comm_size(comm, &num_procs); grid_size = nx * ny; hypre_GeneratePartitioning(nx, P, &nx_part); hypre_GeneratePartitioning(ny, Q, &ny_part); nx_local = (HYPRE_Int)(nx_part[p + 1] - nx_part[p]); ny_local = (HYPRE_Int)(ny_part[q + 1] - ny_part[q]); local_num_rows = nx_local * ny_local; global_part[0] = ny_part[q] * nx + nx_part[p] * ny_local; global_part[1] = global_part[0] + (HYPRE_BigInt)local_num_rows; diag_i = hypre_CTAlloc(HYPRE_Int, local_num_rows + 1, HYPRE_MEMORY_HOST); offd_i = hypre_CTAlloc(HYPRE_Int, local_num_rows + 1, HYPRE_MEMORY_HOST); P_busy = hypre_min(nx, P); Q_busy = hypre_min(ny, Q); num_cols_offd = 0; if (p) { num_cols_offd += ny_local; } if (p < P_busy - 1) { num_cols_offd += ny_local; } if (q) { num_cols_offd += nx_local; } if (q < Q_busy - 1) { num_cols_offd += nx_local; } if (p && q) { num_cols_offd++; } if (p && q < Q_busy - 1 ) { num_cols_offd++; } if (p < P_busy - 1 && q ) { num_cols_offd++; } if (p < P_busy - 1 && q < Q_busy - 1 ) { num_cols_offd++; } if (!local_num_rows) { num_cols_offd = 0; } col_map_offd = hypre_CTAlloc(HYPRE_BigInt, num_cols_offd, HYPRE_MEMORY_HOST); cnt = 0; o_cnt = 0; diag_i[0] = 0; offd_i[0] = 0; for (iy = ny_part[q]; iy < ny_part[q + 1]; iy++) { for (ix = nx_part[p]; ix < nx_part[p + 1]; ix++) { cnt++; o_cnt++; diag_i[cnt] = diag_i[cnt - 1]; offd_i[o_cnt] = offd_i[o_cnt - 1]; diag_i[cnt]++; if (iy > ny_part[q]) { diag_i[cnt]++; if (ix > nx_part[p]) { diag_i[cnt]++; } else { if (ix) { offd_i[o_cnt]++; } } if (ix < nx_part[p + 1] - 1) { diag_i[cnt]++; } else { if (ix + 1 < nx) { offd_i[o_cnt]++; } } } else { if (iy) { offd_i[o_cnt]++; if (ix > nx_part[p]) { offd_i[o_cnt]++; } else if (ix) { offd_i[o_cnt]++; } if (ix < nx_part[p + 1] - 1) { offd_i[o_cnt]++; } else if (ix < nx - 1) { offd_i[o_cnt]++; } } } if (ix > nx_part[p]) { diag_i[cnt]++; } else { if (ix) { offd_i[o_cnt]++; } } if (ix + 1 < nx_part[p + 1]) { diag_i[cnt]++; } else { if (ix + 1 < nx) { offd_i[o_cnt]++; } } if (iy + 1 < ny_part[q + 1]) { diag_i[cnt]++; if (ix > nx_part[p]) { diag_i[cnt]++; } else { if (ix) { offd_i[o_cnt]++; } } if (ix < nx_part[p + 1] - 1) { diag_i[cnt]++; } else { if (ix + 1 < nx) { offd_i[o_cnt]++; } } } else { if (iy + 1 < ny) { offd_i[o_cnt]++; if (ix > nx_part[p]) { offd_i[o_cnt]++; } else if (ix) { offd_i[o_cnt]++; } if (ix < nx_part[p + 1] - 1) { offd_i[o_cnt]++; } else if (ix < nx - 1) { offd_i[o_cnt]++; } } } } } diag_j = hypre_CTAlloc(HYPRE_Int, diag_i[local_num_rows], HYPRE_MEMORY_HOST); diag_data = hypre_CTAlloc(HYPRE_Real, diag_i[local_num_rows], HYPRE_MEMORY_HOST); if (num_procs > 1) { offd_j = hypre_CTAlloc(HYPRE_Int, offd_i[local_num_rows], HYPRE_MEMORY_HOST); offd_data = hypre_CTAlloc(HYPRE_Real, offd_i[local_num_rows], HYPRE_MEMORY_HOST); big_offd_j = hypre_CTAlloc(HYPRE_BigInt, offd_i[local_num_rows], HYPRE_MEMORY_HOST); } row_index = 0; cnt = 0; o_cnt = 0; for (iy = ny_part[q]; iy < ny_part[q + 1]; iy++) { for (ix = nx_part[p]; ix < nx_part[p + 1]; ix++) { diag_j[cnt] = row_index; diag_data[cnt++] = value[0]; if (iy > ny_part[q]) { if (ix > nx_part[p]) { diag_j[cnt] = row_index - nx_local - 1 ; diag_data[cnt++] = value[1]; } else { if (ix) { big_offd_j[o_cnt] = hypre_map2(ix - 1, iy - 1, p - 1, q, nx, nx_part, ny_part); offd_data[o_cnt++] = value[1]; } } diag_j[cnt] = row_index - nx_local; diag_data[cnt++] = value[1]; if (ix < nx_part[p + 1] - 1) { diag_j[cnt] = row_index - nx_local + 1 ; diag_data[cnt++] = value[1]; } else { if (ix + 1 < nx) { big_offd_j[o_cnt] = hypre_map2(ix + 1, iy - 1, p + 1, q, nx, nx_part, ny_part); offd_data[o_cnt++] = value[1]; } } } else { if (iy) { if (ix > nx_part[p]) { big_offd_j[o_cnt] = hypre_map2(ix - 1, iy - 1, p, q - 1, nx, nx_part, ny_part); offd_data[o_cnt++] = value[1]; } else if (ix) { big_offd_j[o_cnt] = hypre_map2(ix - 1, iy - 1, p - 1, q - 1, nx, nx_part, ny_part); offd_data[o_cnt++] = value[1]; } big_offd_j[o_cnt] = hypre_map2(ix, iy - 1, p, q - 1, nx, nx_part, ny_part); offd_data[o_cnt++] = value[1]; if (ix < nx_part[p + 1] - 1) { big_offd_j[o_cnt] = hypre_map2(ix + 1, iy - 1, p, q - 1, nx, nx_part, ny_part); offd_data[o_cnt++] = value[1]; } else if (ix + 1 < nx) { big_offd_j[o_cnt] = hypre_map2(ix + 1, iy - 1, p + 1, q - 1, nx, nx_part, ny_part); offd_data[o_cnt++] = value[1]; } } } if (ix > nx_part[p]) { diag_j[cnt] = row_index - 1; diag_data[cnt++] = value[1]; } else { if (ix) { big_offd_j[o_cnt] = hypre_map2(ix - 1, iy, p - 1, q, nx, nx_part, ny_part); offd_data[o_cnt++] = value[1]; } } if (ix + 1 < nx_part[p + 1]) { diag_j[cnt] = row_index + 1; diag_data[cnt++] = value[1]; } else { if (ix + 1 < nx) { big_offd_j[o_cnt] = hypre_map2(ix + 1, iy, p + 1, q, nx, nx_part, ny_part); offd_data[o_cnt++] = value[1]; } } if (iy + 1 < ny_part[q + 1]) { if (ix > nx_part[p]) { diag_j[cnt] = row_index + nx_local - 1 ; diag_data[cnt++] = value[1]; } else { if (ix) { big_offd_j[o_cnt] = hypre_map2(ix - 1, iy + 1, p - 1, q, nx, nx_part, ny_part); offd_data[o_cnt++] = value[1]; } } diag_j[cnt] = row_index + nx_local; diag_data[cnt++] = value[1]; if (ix < nx_part[p + 1] - 1) { diag_j[cnt] = row_index + nx_local + 1 ; diag_data[cnt++] = value[1]; } else { if (ix + 1 < nx) { big_offd_j[o_cnt] = hypre_map2(ix + 1, iy + 1, p + 1, q, nx, nx_part, ny_part); offd_data[o_cnt++] = value[1]; } } } else { if (iy + 1 < ny) { if (ix > nx_part[p]) { big_offd_j[o_cnt] = hypre_map2(ix - 1, iy + 1, p, q + 1, nx, nx_part, ny_part); offd_data[o_cnt++] = value[1]; } else if (ix) { big_offd_j[o_cnt] = hypre_map2(ix - 1, iy + 1, p - 1, q + 1, nx, nx_part, ny_part); offd_data[o_cnt++] = value[1]; } big_offd_j[o_cnt] = hypre_map2(ix, iy + 1, p, q + 1, nx, nx_part, ny_part); offd_data[o_cnt++] = value[1]; if (ix < nx_part[p + 1] - 1) { big_offd_j[o_cnt] = hypre_map2(ix + 1, iy + 1, p, q + 1, nx, nx_part, ny_part); offd_data[o_cnt++] = value[1]; } else if (ix < nx - 1) { big_offd_j[o_cnt] = hypre_map2(ix + 1, iy + 1, p + 1, q + 1, nx, nx_part, ny_part); offd_data[o_cnt++] = value[1]; } } } row_index++; } } if (num_procs > 1) { HYPRE_BigInt *tmp = hypre_CTAlloc(HYPRE_BigInt, o_cnt, HYPRE_MEMORY_HOST); for (i = 0; i < o_cnt; i++) { tmp[i] = big_offd_j[i]; } hypre_BigQsort0(tmp, 0, o_cnt - 1); col_map_offd[0] = tmp[0]; cnt = 0; for (i = 0; i < o_cnt; i++) { if (tmp[i] > col_map_offd[cnt]) { cnt++; col_map_offd[cnt] = tmp[i]; } } for (i = 0; i < o_cnt; i++) { offd_j[i] = hypre_BigBinarySearch(col_map_offd, big_offd_j[i], num_cols_offd); } hypre_TFree(big_offd_j, HYPRE_MEMORY_HOST); hypre_TFree(tmp, HYPRE_MEMORY_HOST); } A = hypre_ParCSRMatrixCreate(comm, grid_size, grid_size, global_part, global_part, num_cols_offd, diag_i[local_num_rows], offd_i[local_num_rows]); hypre_ParCSRMatrixColMapOffd(A) = col_map_offd; diag = hypre_ParCSRMatrixDiag(A); hypre_CSRMatrixI(diag) = diag_i; hypre_CSRMatrixJ(diag) = diag_j; hypre_CSRMatrixData(diag) = diag_data; offd = hypre_ParCSRMatrixOffd(A); hypre_CSRMatrixI(offd) = offd_i; if (num_cols_offd) { hypre_CSRMatrixJ(offd) = offd_j; hypre_CSRMatrixData(offd) = offd_data; } hypre_CSRMatrixMemoryLocation(diag) = HYPRE_MEMORY_HOST; hypre_CSRMatrixMemoryLocation(offd) = HYPRE_MEMORY_HOST; hypre_ParCSRMatrixMigrate(A, hypre_HandleMemoryLocation(hypre_handle())); hypre_TFree(nx_part, HYPRE_MEMORY_HOST); hypre_TFree(ny_part, HYPRE_MEMORY_HOST); return (HYPRE_ParCSRMatrix) A; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_BigInt hypre_map2( HYPRE_BigInt ix, HYPRE_BigInt iy, HYPRE_Int p, HYPRE_Int q, HYPRE_BigInt nx, HYPRE_BigInt *nx_part, HYPRE_BigInt *ny_part) { HYPRE_Int nx_local; HYPRE_Int ny_local; HYPRE_Int ix_local; HYPRE_Int iy_local; HYPRE_BigInt global_index; nx_local = (HYPRE_Int)(nx_part[p + 1] - nx_part[p]); ny_local = (HYPRE_Int)(ny_part[q + 1] - ny_part[q]); ix_local = (HYPRE_Int)(ix - nx_part[p]); iy_local = (HYPRE_Int)(iy - ny_part[q]); global_index = ny_part[q] * nx + nx_part[p] * (HYPRE_BigInt)ny_local; global_index += (HYPRE_BigInt)(iy_local * nx_local + ix_local); return global_index; } hypre-2.33.0/src/parcsr_ls/par_lr_interp.c000066400000000000000000006144451477326011500205350ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "_hypre_parcsr_ls.h" #include "aux_interp.h" #define MAX_C_CONNECTIONS 100 #define HAVE_COMMON_C 1 /*--------------------------------------------------------------------------- * hypre_BoomerAMGBuildStdInterp * Comment: The interpolatory weighting can be changed with the sep_weight * variable. This can enable not separating negative and positive * off diagonals in the weight formula. *--------------------------------------------------------------------------*/ HYPRE_Int hypre_BoomerAMGBuildStdInterp(hypre_ParCSRMatrix *A, HYPRE_Int *CF_marker, hypre_ParCSRMatrix *S, HYPRE_BigInt *num_cpts_global, HYPRE_Int num_functions, HYPRE_Int *dof_func, HYPRE_Int debug_flag, HYPRE_Real trunc_factor, HYPRE_Int max_elmts, HYPRE_Int sep_weight, hypre_ParCSRMatrix **P_ptr) { /* Communication Variables */ MPI_Comm comm = hypre_ParCSRMatrixComm(A); hypre_ParCSRCommPkg *comm_pkg = hypre_ParCSRMatrixCommPkg(A); HYPRE_Int my_id, num_procs; HYPRE_MemoryLocation memory_location_P = hypre_ParCSRMatrixMemoryLocation(A); /* Variables to store input variables */ hypre_CSRMatrix *A_diag = hypre_ParCSRMatrixDiag(A); HYPRE_Real *A_diag_data = hypre_CSRMatrixData(A_diag); HYPRE_Int *A_diag_i = hypre_CSRMatrixI(A_diag); HYPRE_Int *A_diag_j = hypre_CSRMatrixJ(A_diag); hypre_CSRMatrix *A_offd = hypre_ParCSRMatrixOffd(A); HYPRE_Real *A_offd_data = hypre_CSRMatrixData(A_offd); HYPRE_Int *A_offd_i = hypre_CSRMatrixI(A_offd); HYPRE_Int *A_offd_j = hypre_CSRMatrixJ(A_offd); /*HYPRE_Int num_cols_A_offd = hypre_CSRMatrixNumCols(A_offd); HYPRE_Int *col_map_offd = hypre_ParCSRMatrixColMapOffd(A);*/ HYPRE_Int n_fine = hypre_CSRMatrixNumRows(A_diag); HYPRE_BigInt col_1 = hypre_ParCSRMatrixFirstRowIndex(A); HYPRE_Int local_numrows = hypre_CSRMatrixNumRows(A_diag); HYPRE_BigInt col_n = col_1 + (HYPRE_BigInt)local_numrows; HYPRE_BigInt total_global_cpts, my_first_cpt; /* Variables to store strong connection matrix info */ hypre_CSRMatrix *S_diag = hypre_ParCSRMatrixDiag(S); HYPRE_Int *S_diag_i = hypre_CSRMatrixI(S_diag); HYPRE_Int *S_diag_j = hypre_CSRMatrixJ(S_diag); hypre_CSRMatrix *S_offd = hypre_ParCSRMatrixOffd(S); HYPRE_Int *S_offd_i = hypre_CSRMatrixI(S_offd); HYPRE_Int *S_offd_j = hypre_CSRMatrixJ(S_offd); /* Interpolation matrix P */ hypre_ParCSRMatrix *P; hypre_CSRMatrix *P_diag; hypre_CSRMatrix *P_offd; HYPRE_Real *P_diag_data = NULL; HYPRE_Int *P_diag_i, *P_diag_j = NULL; HYPRE_Real *P_offd_data = NULL; HYPRE_Int *P_offd_i, *P_offd_j = NULL; /* HYPRE_Int *col_map_offd_P = NULL;*/ HYPRE_Int P_diag_size; HYPRE_Int P_offd_size; HYPRE_Int *P_marker = NULL; HYPRE_Int *P_marker_offd = NULL; HYPRE_Int *CF_marker_offd = NULL; HYPRE_Int *tmp_CF_marker_offd = NULL; HYPRE_Int *dof_func_offd = NULL; /* Full row information for columns of A that are off diag*/ hypre_CSRMatrix *A_ext = NULL; HYPRE_Real *A_ext_data = NULL; HYPRE_Int *A_ext_i = NULL; HYPRE_BigInt *A_ext_j = NULL; HYPRE_Int *fine_to_coarse = NULL; HYPRE_BigInt *fine_to_coarse_offd = NULL; //HYPRE_BigInt *found; HYPRE_Int loc_col; HYPRE_Int full_off_procNodes; hypre_CSRMatrix *Sop = NULL; HYPRE_Int *Sop_i = NULL; HYPRE_BigInt *Sop_j = NULL; /* Variables to keep count of interpolatory points */ HYPRE_Int jj_counter, jj_counter_offd; HYPRE_Int jj_begin_row, jj_end_row; HYPRE_Int jj_begin_row_offd = 0; HYPRE_Int jj_end_row_offd = 0; HYPRE_Int coarse_counter; HYPRE_Int *ihat = NULL; HYPRE_Int *ihat_offd = NULL; HYPRE_Int *ipnt = NULL; HYPRE_Int *ipnt_offd = NULL; HYPRE_Int strong_f_marker = -2; /* Interpolation weight variables */ HYPRE_Real *ahat = NULL; HYPRE_Real *ahat_offd = NULL; HYPRE_Real sum_pos, sum_pos_C, sum_neg, sum_neg_C, sum, sum_C; HYPRE_Real diagonal, distribute; HYPRE_Real alfa = 1.; HYPRE_Real beta = 1.; /* Loop variables */ // HYPRE_Int index; HYPRE_Int start_indexing = 0; HYPRE_Int i, i1, j1, jj, kk, k1; HYPRE_Int cnt_c, cnt_f, cnt_c_offd, cnt_f_offd, indx; HYPRE_BigInt big_k1; /* Definitions */ HYPRE_Real zero = 0.0; HYPRE_Real one = 1.0; HYPRE_Real wall_time = 0.0; HYPRE_Real wall_1 = 0.0; HYPRE_Real wall_2 = 0.0; HYPRE_Real wall_3 = 0.0; hypre_ParCSRCommPkg *extend_comm_pkg = NULL; if (debug_flag == 4) { wall_time = time_getWallclockSeconds(); } /* BEGIN */ hypre_MPI_Comm_size(comm, &num_procs); hypre_MPI_Comm_rank(comm, &my_id); my_first_cpt = num_cpts_global[0]; if (my_id == (num_procs - 1)) { total_global_cpts = num_cpts_global[1]; } hypre_MPI_Bcast(&total_global_cpts, 1, HYPRE_MPI_BIG_INT, num_procs - 1, comm); if (!comm_pkg) { hypre_MatvecCommPkgCreate(A); comm_pkg = hypre_ParCSRMatrixCommPkg(A); } /* Set up off processor information (specifically for neighbors of * neighbors */ full_off_procNodes = 0; if (num_procs > 1) { hypre_exchange_interp_data( &CF_marker_offd, &dof_func_offd, &A_ext, &full_off_procNodes, &Sop, &extend_comm_pkg, A, CF_marker, S, num_functions, dof_func, 0); { #ifdef HYPRE_PROFILE hypre_profile_times[HYPRE_TIMER_ID_EXTENDED_I_INTERP] += hypre_MPI_Wtime(); #endif } A_ext_i = hypre_CSRMatrixI(A_ext); A_ext_j = hypre_CSRMatrixBigJ(A_ext); A_ext_data = hypre_CSRMatrixData(A_ext); Sop_i = hypre_CSRMatrixI(Sop); Sop_j = hypre_CSRMatrixBigJ(Sop); } /*----------------------------------------------------------------------- * First Pass: Determine size of P and fill in fine_to_coarse mapping. *-----------------------------------------------------------------------*/ /*----------------------------------------------------------------------- * Intialize counters and allocate mapping vector. *-----------------------------------------------------------------------*/ P_diag_i = hypre_CTAlloc(HYPRE_Int, n_fine + 1, memory_location_P); P_offd_i = hypre_CTAlloc(HYPRE_Int, n_fine + 1, memory_location_P); if (n_fine) { fine_to_coarse = hypre_CTAlloc(HYPRE_Int, n_fine, HYPRE_MEMORY_HOST); P_marker = hypre_CTAlloc(HYPRE_Int, n_fine, HYPRE_MEMORY_HOST); } if (full_off_procNodes) { P_marker_offd = hypre_CTAlloc(HYPRE_Int, full_off_procNodes, HYPRE_MEMORY_HOST); fine_to_coarse_offd = hypre_CTAlloc(HYPRE_BigInt, full_off_procNodes, HYPRE_MEMORY_HOST); tmp_CF_marker_offd = hypre_CTAlloc(HYPRE_Int, full_off_procNodes, HYPRE_MEMORY_HOST); } hypre_initialize_vecs(n_fine, full_off_procNodes, fine_to_coarse, fine_to_coarse_offd, P_marker, P_marker_offd, tmp_CF_marker_offd); jj_counter = start_indexing; jj_counter_offd = start_indexing; coarse_counter = 0; /*----------------------------------------------------------------------- * Loop over fine grid. *-----------------------------------------------------------------------*/ for (i = 0; i < n_fine; i++) { P_diag_i[i] = jj_counter; if (num_procs > 1) { P_offd_i[i] = jj_counter_offd; } if (CF_marker[i] >= 0) { jj_counter++; fine_to_coarse[i] = coarse_counter; coarse_counter++; } /*-------------------------------------------------------------------- * If i is an F-point, interpolation is from the C-points that * strongly influence i, or C-points that stronly influence F-points * that strongly influence i. *--------------------------------------------------------------------*/ else if (CF_marker[i] != -3) { for (jj = S_diag_i[i]; jj < S_diag_i[i + 1]; jj++) { i1 = S_diag_j[jj]; if (CF_marker[i1] >= 0) { /* i1 is a C point */ if (P_marker[i1] < P_diag_i[i]) { P_marker[i1] = jj_counter; jj_counter++; } } else if (CF_marker[i1] != -3) { /* i1 is a F point, loop through it's strong neighbors */ for (kk = S_diag_i[i1]; kk < S_diag_i[i1 + 1]; kk++) { k1 = S_diag_j[kk]; if (CF_marker[k1] >= 0) { if (P_marker[k1] < P_diag_i[i]) { P_marker[k1] = jj_counter; jj_counter++; } } } if (num_procs > 1) { for (kk = S_offd_i[i1]; kk < S_offd_i[i1 + 1]; kk++) { k1 = S_offd_j[kk]; if (CF_marker_offd[k1] >= 0) { if (P_marker_offd[k1] < P_offd_i[i]) { tmp_CF_marker_offd[k1] = 1; P_marker_offd[k1] = jj_counter_offd; jj_counter_offd++; } } } } } } /* Look at off diag strong connections of i */ if (num_procs > 1) { for (jj = S_offd_i[i]; jj < S_offd_i[i + 1]; jj++) { i1 = S_offd_j[jj]; if (CF_marker_offd[i1] >= 0) { if (P_marker_offd[i1] < P_offd_i[i]) { tmp_CF_marker_offd[i1] = 1; P_marker_offd[i1] = jj_counter_offd; jj_counter_offd++; } } else if (CF_marker_offd[i1] != -3) { /* F point; look at neighbors of i1. Sop contains global col * numbers and entries that could be in S_diag or S_offd or * neither. */ for (kk = Sop_i[i1]; kk < Sop_i[i1 + 1]; kk++) { big_k1 = Sop_j[kk]; if (big_k1 >= col_1 && big_k1 < col_n) { /* In S_diag */ loc_col = (HYPRE_Int)(big_k1 - col_1); if (CF_marker[loc_col] >= 0) { if (P_marker[loc_col] < P_diag_i[i]) { P_marker[loc_col] = jj_counter; jj_counter++; } } } else { loc_col = (HYPRE_Int)(-big_k1 - 1); if (CF_marker_offd[loc_col] >= 0) { if (P_marker_offd[loc_col] < P_offd_i[i]) { P_marker_offd[loc_col] = jj_counter_offd; tmp_CF_marker_offd[loc_col] = 1; jj_counter_offd++; } } } } } } } } } if (debug_flag == 4) { wall_time = time_getWallclockSeconds() - wall_time; hypre_printf("Proc = %d determine structure %f\n", my_id, wall_time); fflush(NULL); } /*----------------------------------------------------------------------- * Allocate arrays. *-----------------------------------------------------------------------*/ P_diag_size = jj_counter; P_offd_size = jj_counter_offd; if (P_diag_size) { P_diag_j = hypre_CTAlloc(HYPRE_Int, P_diag_size, memory_location_P); P_diag_data = hypre_CTAlloc(HYPRE_Real, P_diag_size, memory_location_P); } if (P_offd_size) { P_offd_j = hypre_CTAlloc(HYPRE_Int, P_offd_size, memory_location_P); P_offd_data = hypre_CTAlloc(HYPRE_Real, P_offd_size, memory_location_P); } P_diag_i[n_fine] = jj_counter; P_offd_i[n_fine] = jj_counter_offd; jj_counter = start_indexing; jj_counter_offd = start_indexing; /* Fine to coarse mapping */ if (num_procs > 1) { hypre_big_insert_new_nodes(comm_pkg, extend_comm_pkg, fine_to_coarse, full_off_procNodes, my_first_cpt, fine_to_coarse_offd); } /* Initialize ahat, which is a modification to a, used in the standard * interpolation routine. */ if (n_fine) { ahat = hypre_CTAlloc(HYPRE_Real, n_fine, HYPRE_MEMORY_HOST); ihat = hypre_CTAlloc(HYPRE_Int, n_fine, HYPRE_MEMORY_HOST); ipnt = hypre_CTAlloc(HYPRE_Int, n_fine, HYPRE_MEMORY_HOST); } if (full_off_procNodes) { ahat_offd = hypre_CTAlloc(HYPRE_Real, full_off_procNodes, HYPRE_MEMORY_HOST); ihat_offd = hypre_CTAlloc(HYPRE_Int, full_off_procNodes, HYPRE_MEMORY_HOST); ipnt_offd = hypre_CTAlloc(HYPRE_Int, full_off_procNodes, HYPRE_MEMORY_HOST); } for (i = 0; i < n_fine; i++) { P_marker[i] = -1; ahat[i] = 0; ihat[i] = -1; } for (i = 0; i < full_off_procNodes; i++) { P_marker_offd[i] = -1; ahat_offd[i] = 0; ihat_offd[i] = -1; } /*----------------------------------------------------------------------- * Loop over fine grid points. *-----------------------------------------------------------------------*/ for (i = 0; i < n_fine; i++) { jj_begin_row = jj_counter; if (num_procs > 1) { jj_begin_row_offd = jj_counter_offd; } /*-------------------------------------------------------------------- * If i is a c-point, interpolation is the identity. *--------------------------------------------------------------------*/ if (CF_marker[i] >= 0) { P_diag_j[jj_counter] = fine_to_coarse[i]; P_diag_data[jj_counter] = one; jj_counter++; } /*-------------------------------------------------------------------- * If i is an F-point, build interpolation. *--------------------------------------------------------------------*/ else if (CF_marker[i] != -3) { if (debug_flag == 4) { wall_time = time_getWallclockSeconds(); } strong_f_marker--; for (jj = S_diag_i[i]; jj < S_diag_i[i + 1]; jj++) { i1 = S_diag_j[jj]; /*-------------------------------------------------------------- * If neighbor i1 is a C-point, set column number in P_diag_j * and initialize interpolation weight to zero. *--------------------------------------------------------------*/ if (CF_marker[i1] >= 0) { if (P_marker[i1] < jj_begin_row) { P_marker[i1] = jj_counter; P_diag_j[jj_counter] = i1; P_diag_data[jj_counter] = zero; jj_counter++; } } else if (CF_marker[i1] != -3) { P_marker[i1] = strong_f_marker; for (kk = S_diag_i[i1]; kk < S_diag_i[i1 + 1]; kk++) { k1 = S_diag_j[kk]; if (CF_marker[k1] >= 0) { if (P_marker[k1] < jj_begin_row) { P_marker[k1] = jj_counter; P_diag_j[jj_counter] = k1; P_diag_data[jj_counter] = zero; jj_counter++; } } } if (num_procs > 1) { for (kk = S_offd_i[i1]; kk < S_offd_i[i1 + 1]; kk++) { k1 = S_offd_j[kk]; if (CF_marker_offd[k1] >= 0) { if (P_marker_offd[k1] < jj_begin_row_offd) { P_marker_offd[k1] = jj_counter_offd; P_offd_j[jj_counter_offd] = k1; P_offd_data[jj_counter_offd] = zero; jj_counter_offd++; } } } } } } if ( num_procs > 1) { for (jj = S_offd_i[i]; jj < S_offd_i[i + 1]; jj++) { i1 = S_offd_j[jj]; if ( CF_marker_offd[i1] >= 0) { if (P_marker_offd[i1] < jj_begin_row_offd) { P_marker_offd[i1] = jj_counter_offd; P_offd_j[jj_counter_offd] = i1; P_offd_data[jj_counter_offd] = zero; jj_counter_offd++; } } else if (CF_marker_offd[i1] != -3) { P_marker_offd[i1] = strong_f_marker; for (kk = Sop_i[i1]; kk < Sop_i[i1 + 1]; kk++) { big_k1 = Sop_j[kk]; if (big_k1 >= col_1 && big_k1 < col_n) { loc_col = (HYPRE_Int)(big_k1 - col_1); if (CF_marker[loc_col] >= 0) { if (P_marker[loc_col] < jj_begin_row) { P_marker[loc_col] = jj_counter; P_diag_j[jj_counter] = loc_col; P_diag_data[jj_counter] = zero; jj_counter++; } } } else { loc_col = (HYPRE_Int)(-big_k1 - 1); if (CF_marker_offd[loc_col] >= 0) { if (P_marker_offd[loc_col] < jj_begin_row_offd) { P_marker_offd[loc_col] = jj_counter_offd; P_offd_j[jj_counter_offd] = loc_col; P_offd_data[jj_counter_offd] = zero; jj_counter_offd++; } } } } } } } jj_end_row = jj_counter; jj_end_row_offd = jj_counter_offd; if (debug_flag == 4) { wall_time = time_getWallclockSeconds() - wall_time; wall_1 += wall_time; fflush(NULL); } if (debug_flag == 4) { wall_time = time_getWallclockSeconds(); } cnt_c = 0; cnt_f = jj_end_row - jj_begin_row; cnt_c_offd = 0; cnt_f_offd = jj_end_row_offd - jj_begin_row_offd; ihat[i] = cnt_f; ipnt[cnt_f] = i; ahat[cnt_f++] = A_diag_data[A_diag_i[i]]; for (jj = A_diag_i[i] + 1; jj < A_diag_i[i + 1]; jj++) { /* i1 is direct neighbor */ i1 = A_diag_j[jj]; if (P_marker[i1] != strong_f_marker) { indx = ihat[i1]; if (indx > -1) { ahat[indx] += A_diag_data[jj]; } else if (P_marker[i1] >= jj_begin_row) { ihat[i1] = cnt_c; ipnt[cnt_c] = i1; ahat[cnt_c++] += A_diag_data[jj]; } else if (CF_marker[i1] != -3) { ihat[i1] = cnt_f; ipnt[cnt_f] = i1; ahat[cnt_f++] += A_diag_data[jj]; } } else { if (num_functions == 1 || dof_func[i] == dof_func[i1]) { distribute = A_diag_data[jj] / A_diag_data[A_diag_i[i1]]; for (kk = A_diag_i[i1] + 1; kk < A_diag_i[i1 + 1]; kk++) { k1 = A_diag_j[kk]; indx = ihat[k1]; if (indx > -1) { ahat[indx] -= A_diag_data[kk] * distribute; } else if (P_marker[k1] >= jj_begin_row) { ihat[k1] = cnt_c; ipnt[cnt_c] = k1; ahat[cnt_c++] -= A_diag_data[kk] * distribute; } else { ihat[k1] = cnt_f; ipnt[cnt_f] = k1; ahat[cnt_f++] -= A_diag_data[kk] * distribute; } } if (num_procs > 1) { for (kk = A_offd_i[i1]; kk < A_offd_i[i1 + 1]; kk++) { k1 = A_offd_j[kk]; indx = ihat_offd[k1]; if (num_functions == 1 || dof_func[i1] == dof_func_offd[k1]) { if (indx > -1) { ahat_offd[indx] -= A_offd_data[kk] * distribute; } else if (P_marker_offd[k1] >= jj_begin_row_offd) { ihat_offd[k1] = cnt_c_offd; ipnt_offd[cnt_c_offd] = k1; ahat_offd[cnt_c_offd++] -= A_offd_data[kk] * distribute; } else { ihat_offd[k1] = cnt_f_offd; ipnt_offd[cnt_f_offd] = k1; ahat_offd[cnt_f_offd++] -= A_offd_data[kk] * distribute; } } } } } } } if (num_procs > 1) { for (jj = A_offd_i[i]; jj < A_offd_i[i + 1]; jj++) { i1 = A_offd_j[jj]; if (P_marker_offd[i1] != strong_f_marker) { indx = ihat_offd[i1]; if (indx > -1) { ahat_offd[indx] += A_offd_data[jj]; } else if (P_marker_offd[i1] >= jj_begin_row_offd) { ihat_offd[i1] = cnt_c_offd; ipnt_offd[cnt_c_offd] = i1; ahat_offd[cnt_c_offd++] += A_offd_data[jj]; } else if (CF_marker_offd[i1] != -3) { ihat_offd[i1] = cnt_f_offd; ipnt_offd[cnt_f_offd] = i1; ahat_offd[cnt_f_offd++] += A_offd_data[jj]; } } else { if (num_functions == 1 || dof_func[i] == dof_func_offd[i1]) { distribute = A_offd_data[jj] / A_ext_data[A_ext_i[i1]]; for (kk = A_ext_i[i1] + 1; kk < A_ext_i[i1 + 1]; kk++) { big_k1 = A_ext_j[kk]; if (big_k1 >= col_1 && big_k1 < col_n) { /*diag*/ loc_col = (HYPRE_Int)(big_k1 - col_1); indx = ihat[loc_col]; if (indx > -1) { ahat[indx] -= A_ext_data[kk] * distribute; } else if (P_marker[loc_col] >= jj_begin_row) { ihat[loc_col] = cnt_c; ipnt[cnt_c] = loc_col; ahat[cnt_c++] -= A_ext_data[kk] * distribute; } else { ihat[loc_col] = cnt_f; ipnt[cnt_f] = loc_col; ahat[cnt_f++] -= A_ext_data[kk] * distribute; } } else { loc_col = (HYPRE_Int)(-big_k1 - 1); if (num_functions == 1 || dof_func_offd[loc_col] == dof_func_offd[i1]) { indx = ihat_offd[loc_col]; if (indx > -1) { ahat_offd[indx] -= A_ext_data[kk] * distribute; } else if (P_marker_offd[loc_col] >= jj_begin_row_offd) { ihat_offd[loc_col] = cnt_c_offd; ipnt_offd[cnt_c_offd] = loc_col; ahat_offd[cnt_c_offd++] -= A_ext_data[kk] * distribute; } else { ihat_offd[loc_col] = cnt_f_offd; ipnt_offd[cnt_f_offd] = loc_col; ahat_offd[cnt_f_offd++] -= A_ext_data[kk] * distribute; } } } } } } } } if (debug_flag == 4) { wall_time = time_getWallclockSeconds() - wall_time; wall_2 += wall_time; fflush(NULL); } if (debug_flag == 4) { wall_time = time_getWallclockSeconds(); } diagonal = ahat[cnt_c]; ahat[cnt_c] = 0; sum_pos = 0; sum_pos_C = 0; sum_neg = 0; sum_neg_C = 0; sum = 0; sum_C = 0; if (sep_weight == 1) { for (jj = 0; jj < cnt_c; jj++) { if (ahat[jj] > 0) { sum_pos_C += ahat[jj]; } else { sum_neg_C += ahat[jj]; } } if (num_procs > 1) { for (jj = 0; jj < cnt_c_offd; jj++) { if (ahat_offd[jj] > 0) { sum_pos_C += ahat_offd[jj]; } else { sum_neg_C += ahat_offd[jj]; } } } sum_pos = sum_pos_C; sum_neg = sum_neg_C; for (jj = cnt_c + 1; jj < cnt_f; jj++) { if (ahat[jj] > 0) { sum_pos += ahat[jj]; } else { sum_neg += ahat[jj]; } ahat[jj] = 0; } if (num_procs > 1) { for (jj = cnt_c_offd; jj < cnt_f_offd; jj++) { if (ahat_offd[jj] > 0) { sum_pos += ahat_offd[jj]; } else { sum_neg += ahat_offd[jj]; } ahat_offd[jj] = 0; } } if (sum_neg_C * diagonal != 0) { alfa = sum_neg / sum_neg_C / diagonal; } if (sum_pos_C * diagonal != 0) { beta = sum_pos / sum_pos_C / diagonal; } /*----------------------------------------------------------------- * Set interpolation weight by dividing by the diagonal. *-----------------------------------------------------------------*/ for (jj = jj_begin_row; jj < jj_end_row; jj++) { j1 = ihat[P_diag_j[jj]]; if (ahat[j1] > 0) { P_diag_data[jj] = -beta * ahat[j1]; } else { P_diag_data[jj] = -alfa * ahat[j1]; } P_diag_j[jj] = fine_to_coarse[P_diag_j[jj]]; ahat[j1] = 0; } for (jj = 0; jj < cnt_f; jj++) { ihat[ipnt[jj]] = -1; } if (num_procs > 1) { for (jj = jj_begin_row_offd; jj < jj_end_row_offd; jj++) { j1 = ihat_offd[P_offd_j[jj]]; if (ahat_offd[j1] > 0) { P_offd_data[jj] = -beta * ahat_offd[j1]; } else { P_offd_data[jj] = -alfa * ahat_offd[j1]; } ahat_offd[j1] = 0; } for (jj = 0; jj < cnt_f_offd; jj++) { ihat_offd[ipnt_offd[jj]] = -1; } } } else { for (jj = 0; jj < cnt_c; jj++) { sum_C += ahat[jj]; } if (num_procs > 1) { for (jj = 0; jj < cnt_c_offd; jj++) { sum_C += ahat_offd[jj]; } } sum = sum_C; for (jj = cnt_c + 1; jj < cnt_f; jj++) { sum += ahat[jj]; ahat[jj] = 0; } if (num_procs > 1) { for (jj = cnt_c_offd; jj < cnt_f_offd; jj++) { sum += ahat_offd[jj]; ahat_offd[jj] = 0; } } if (sum_C * diagonal != 0) { alfa = sum / sum_C / diagonal; } /*----------------------------------------------------------------- * Set interpolation weight by dividing by the diagonal. *-----------------------------------------------------------------*/ for (jj = jj_begin_row; jj < jj_end_row; jj++) { j1 = ihat[P_diag_j[jj]]; P_diag_data[jj] = -alfa * ahat[j1]; P_diag_j[jj] = fine_to_coarse[P_diag_j[jj]]; ahat[j1] = 0; } for (jj = 0; jj < cnt_f; jj++) { ihat[ipnt[jj]] = -1; } if (num_procs > 1) { for (jj = jj_begin_row_offd; jj < jj_end_row_offd; jj++) { j1 = ihat_offd[P_offd_j[jj]]; P_offd_data[jj] = -alfa * ahat_offd[j1]; ahat_offd[j1] = 0; } for (jj = 0; jj < cnt_f_offd; jj++) { ihat_offd[ipnt_offd[jj]] = -1; } } } if (debug_flag == 4) { wall_time = time_getWallclockSeconds() - wall_time; wall_3 += wall_time; fflush(NULL); } } } if (debug_flag == 4) { hypre_printf("Proc = %d fill part 1 %f part 2 %f part 3 %f\n", my_id, wall_1, wall_2, wall_3); fflush(NULL); } P = hypre_ParCSRMatrixCreate(comm, hypre_ParCSRMatrixGlobalNumRows(A), total_global_cpts, hypre_ParCSRMatrixColStarts(A), num_cpts_global, 0, P_diag_i[n_fine], P_offd_i[n_fine]); P_diag = hypre_ParCSRMatrixDiag(P); hypre_CSRMatrixData(P_diag) = P_diag_data; hypre_CSRMatrixI(P_diag) = P_diag_i; hypre_CSRMatrixJ(P_diag) = P_diag_j; P_offd = hypre_ParCSRMatrixOffd(P); hypre_CSRMatrixData(P_offd) = P_offd_data; hypre_CSRMatrixI(P_offd) = P_offd_i; hypre_CSRMatrixJ(P_offd) = P_offd_j; hypre_CSRMatrixMemoryLocation(P_diag) = memory_location_P; hypre_CSRMatrixMemoryLocation(P_offd) = memory_location_P; /* Compress P, removing coefficients smaller than trunc_factor * Max */ if (trunc_factor != 0.0 || max_elmts > 0) { hypre_BoomerAMGInterpTruncation(P, trunc_factor, max_elmts); P_diag_data = hypre_CSRMatrixData(P_diag); P_diag_i = hypre_CSRMatrixI(P_diag); P_diag_j = hypre_CSRMatrixJ(P_diag); P_offd_data = hypre_CSRMatrixData(P_offd); P_offd_i = hypre_CSRMatrixI(P_offd); P_offd_j = hypre_CSRMatrixJ(P_offd); P_diag_size = P_diag_i[n_fine]; P_offd_size = P_offd_i[n_fine]; } /* This builds col_map, col_map should be monotone increasing and contain * global numbers. */ if (P_offd_size) { hypre_build_interp_colmap(P, full_off_procNodes, tmp_CF_marker_offd, fine_to_coarse_offd); } hypre_MatvecCommPkgCreate(P); for (i = 0; i < n_fine; i++) { if (CF_marker[i] == -3) { CF_marker[i] = -1; } } *P_ptr = P; /* Deallocate memory */ hypre_TFree(fine_to_coarse, HYPRE_MEMORY_HOST); hypre_TFree(P_marker, HYPRE_MEMORY_HOST); hypre_TFree(ahat, HYPRE_MEMORY_HOST); hypre_TFree(ihat, HYPRE_MEMORY_HOST); hypre_TFree(ipnt, HYPRE_MEMORY_HOST); if (full_off_procNodes) { hypre_TFree(ahat_offd, HYPRE_MEMORY_HOST); hypre_TFree(ihat_offd, HYPRE_MEMORY_HOST); hypre_TFree(ipnt_offd, HYPRE_MEMORY_HOST); } if (num_procs > 1) { hypre_CSRMatrixDestroy(Sop); hypre_CSRMatrixDestroy(A_ext); hypre_TFree(fine_to_coarse_offd, HYPRE_MEMORY_HOST); hypre_TFree(P_marker_offd, HYPRE_MEMORY_HOST); hypre_TFree(CF_marker_offd, HYPRE_MEMORY_HOST); hypre_TFree(tmp_CF_marker_offd, HYPRE_MEMORY_HOST); if (num_functions > 1) { hypre_TFree(dof_func_offd, HYPRE_MEMORY_HOST); } hypre_MatvecCommPkgDestroy(extend_comm_pkg); } return hypre_error_flag; } /*--------------------------------------------------------------------------- * hypre_BoomerAMGBuildExtPIInterp * Comment: *--------------------------------------------------------------------------*/ HYPRE_Int hypre_BoomerAMGBuildExtPIInterpHost(hypre_ParCSRMatrix *A, HYPRE_Int *CF_marker, hypre_ParCSRMatrix *S, HYPRE_BigInt *num_cpts_global, HYPRE_Int num_functions, HYPRE_Int *dof_func, HYPRE_Int debug_flag, HYPRE_Real trunc_factor, HYPRE_Int max_elmts, hypre_ParCSRMatrix **P_ptr) { #ifdef HYPRE_PROFILE hypre_profile_times[HYPRE_TIMER_ID_EXTENDED_I_INTERP] -= hypre_MPI_Wtime(); #endif /* Communication Variables */ MPI_Comm comm = hypre_ParCSRMatrixComm(A); hypre_ParCSRCommPkg *comm_pkg = hypre_ParCSRMatrixCommPkg(A); HYPRE_Int my_id, num_procs; HYPRE_MemoryLocation memory_location_P = hypre_ParCSRMatrixMemoryLocation(A); /* Variables to store input variables */ hypre_CSRMatrix *A_diag = hypre_ParCSRMatrixDiag(A); HYPRE_Real *A_diag_data = hypre_CSRMatrixData(A_diag); HYPRE_Int *A_diag_i = hypre_CSRMatrixI(A_diag); HYPRE_Int *A_diag_j = hypre_CSRMatrixJ(A_diag); hypre_CSRMatrix *A_offd = hypre_ParCSRMatrixOffd(A); HYPRE_Real *A_offd_data = hypre_CSRMatrixData(A_offd); HYPRE_Int *A_offd_i = hypre_CSRMatrixI(A_offd); HYPRE_Int *A_offd_j = hypre_CSRMatrixJ(A_offd); /*HYPRE_Int num_cols_A_offd = hypre_CSRMatrixNumCols(A_offd); HYPRE_Int *col_map_offd = hypre_ParCSRMatrixColMapOffd(A);*/ HYPRE_Int n_fine = hypre_CSRMatrixNumRows(A_diag); HYPRE_BigInt col_1 = hypre_ParCSRMatrixFirstRowIndex(A); HYPRE_Int local_numrows = hypre_CSRMatrixNumRows(A_diag); HYPRE_BigInt col_n = col_1 + local_numrows; HYPRE_BigInt total_global_cpts, my_first_cpt; /* Variables to store strong connection matrix info */ hypre_CSRMatrix *S_diag = hypre_ParCSRMatrixDiag(S); HYPRE_Int *S_diag_i = hypre_CSRMatrixI(S_diag); HYPRE_Int *S_diag_j = hypre_CSRMatrixJ(S_diag); hypre_CSRMatrix *S_offd = hypre_ParCSRMatrixOffd(S); HYPRE_Int *S_offd_i = hypre_CSRMatrixI(S_offd); HYPRE_Int *S_offd_j = hypre_CSRMatrixJ(S_offd); /* Interpolation matrix P */ hypre_ParCSRMatrix *P; hypre_CSRMatrix *P_diag; hypre_CSRMatrix *P_offd; HYPRE_Real *P_diag_data = NULL; HYPRE_Int *P_diag_i, *P_diag_j = NULL; HYPRE_Real *P_offd_data = NULL; HYPRE_Int *P_offd_i, *P_offd_j = NULL; /*HYPRE_Int *col_map_offd_P = NULL;*/ HYPRE_Int P_diag_size; HYPRE_Int P_offd_size; HYPRE_Int *P_marker = NULL; HYPRE_Int *P_marker_offd = NULL; HYPRE_Int *CF_marker_offd = NULL; HYPRE_Int *tmp_CF_marker_offd = NULL; HYPRE_Int *dof_func_offd = NULL; /* Full row information for columns of A that are off diag*/ hypre_CSRMatrix *A_ext = NULL; HYPRE_Real *A_ext_data = NULL; HYPRE_Int *A_ext_i = NULL; HYPRE_BigInt *A_ext_j = NULL; HYPRE_Int *fine_to_coarse = NULL; HYPRE_BigInt *fine_to_coarse_offd = NULL; HYPRE_Int loc_col; HYPRE_Int full_off_procNodes; hypre_CSRMatrix *Sop = NULL; HYPRE_Int *Sop_i = NULL; HYPRE_BigInt *Sop_j = NULL; HYPRE_Int sgn = 1; /* Variables to keep count of interpolatory points */ HYPRE_Int jj_counter, jj_counter_offd; HYPRE_Int jj_begin_row, jj_end_row; HYPRE_Int jj_begin_row_offd = 0; HYPRE_Int jj_end_row_offd = 0; HYPRE_Int coarse_counter; /* Interpolation weight variables */ HYPRE_Real sum, diagonal, distribute; HYPRE_Int strong_f_marker; /* Loop variables */ /*HYPRE_Int index;*/ HYPRE_Int start_indexing = 0; HYPRE_Int i, i1, i2, jj, kk, k1, jj1; HYPRE_BigInt big_k1; /* Threading variables */ HYPRE_Int my_thread_num, num_threads, start, stop; HYPRE_Int * max_num_threads = hypre_CTAlloc(HYPRE_Int, 1, HYPRE_MEMORY_HOST); HYPRE_Int * diag_offset; HYPRE_Int * fine_to_coarse_offset; HYPRE_Int * offd_offset; /* Definitions */ HYPRE_Real zero = 0.0; HYPRE_Real one = 1.0; HYPRE_Real wall_time; hypre_ParCSRCommPkg *extend_comm_pkg = NULL; if (debug_flag == 4) { wall_time = time_getWallclockSeconds(); } /* BEGIN */ hypre_MPI_Comm_size(comm, &num_procs); hypre_MPI_Comm_rank(comm, &my_id); my_first_cpt = num_cpts_global[0]; if (my_id == (num_procs - 1)) { total_global_cpts = num_cpts_global[1]; } hypre_MPI_Bcast(&total_global_cpts, 1, HYPRE_MPI_BIG_INT, num_procs - 1, comm); if (!comm_pkg) { hypre_MatvecCommPkgCreate(A); comm_pkg = hypre_ParCSRMatrixCommPkg(A); } /* Set up off processor information (specifically for neighbors of * neighbors */ full_off_procNodes = 0; if (num_procs > 1) { hypre_exchange_interp_data( &CF_marker_offd, &dof_func_offd, &A_ext, &full_off_procNodes, &Sop, &extend_comm_pkg, A, CF_marker, S, num_functions, dof_func, 1); { #ifdef HYPRE_PROFILE hypre_profile_times[HYPRE_TIMER_ID_EXTENDED_I_INTERP] += hypre_MPI_Wtime(); #endif } A_ext_i = hypre_CSRMatrixI(A_ext); A_ext_j = hypre_CSRMatrixBigJ(A_ext); A_ext_data = hypre_CSRMatrixData(A_ext); Sop_i = hypre_CSRMatrixI(Sop); Sop_j = hypre_CSRMatrixBigJ(Sop); } /*----------------------------------------------------------------------- * First Pass: Determine size of P and fill in fine_to_coarse mapping. *-----------------------------------------------------------------------*/ /*----------------------------------------------------------------------- * Intialize counters and allocate mapping vector. *-----------------------------------------------------------------------*/ P_diag_i = hypre_CTAlloc(HYPRE_Int, n_fine + 1, memory_location_P); P_offd_i = hypre_CTAlloc(HYPRE_Int, n_fine + 1, memory_location_P); if (n_fine) { fine_to_coarse = hypre_CTAlloc(HYPRE_Int, n_fine, HYPRE_MEMORY_HOST); } if (full_off_procNodes) { fine_to_coarse_offd = hypre_CTAlloc(HYPRE_BigInt, full_off_procNodes, HYPRE_MEMORY_HOST); tmp_CF_marker_offd = hypre_CTAlloc(HYPRE_Int, full_off_procNodes, HYPRE_MEMORY_HOST); } /* This function is smart enough to check P_marker and P_marker_offd only, * and set them if they are not NULL. The other vectors are set regardless.*/ hypre_initialize_vecs(n_fine, full_off_procNodes, fine_to_coarse, fine_to_coarse_offd, P_marker, P_marker_offd, tmp_CF_marker_offd); /*----------------------------------------------------------------------- * Initialize threading variables *-----------------------------------------------------------------------*/ max_num_threads[0] = hypre_NumThreads(); diag_offset = hypre_CTAlloc(HYPRE_Int, max_num_threads[0], HYPRE_MEMORY_HOST); fine_to_coarse_offset = hypre_CTAlloc(HYPRE_Int, max_num_threads[0], HYPRE_MEMORY_HOST); offd_offset = hypre_CTAlloc(HYPRE_Int, max_num_threads[0], HYPRE_MEMORY_HOST); for (i = 0; i < max_num_threads[0]; i++) { diag_offset[i] = 0; fine_to_coarse_offset[i] = 0; offd_offset[i] = 0; } /*----------------------------------------------------------------------- * Loop over fine grid. *-----------------------------------------------------------------------*/ #ifdef HYPRE_USING_OPENMP #pragma omp parallel private(i,my_thread_num,num_threads,start,stop,coarse_counter,jj_counter,jj_counter_offd, P_marker, P_marker_offd,jj,kk,i1,k1,loc_col,jj_begin_row,jj_begin_row_offd,jj_end_row,jj_end_row_offd,diagonal,sum,sgn,jj1,i2,distribute,strong_f_marker, big_k1) #endif { /* Parallelize by computing only over each thread's range of rows. * * The first large for loop computes ~locally~ for each thread P_diag_i, * P_offd_i and fine_to_coarse. Then, the arrays are stitched together * For eaxample the first phase would compute * P_diag_i = [0, 2, 4, 7, 2, 5, 6] * for two threads. P_diag_i[stop] points to the end of that * thread's data, but P_diag_i[start] points to the end of the * previous thread's row range. This is then stitched together at the * end to yield, * P_diag_i = [0, 2, 4, 7, 9, 14, 15]. * * The second large for loop computes interpolation weights and is * relatively straight-forward to thread. */ /* initialize thread-wise variables */ P_marker = NULL; P_marker_offd = NULL; strong_f_marker = -2; coarse_counter = 0; jj_counter = start_indexing; jj_counter_offd = start_indexing; if (n_fine) { P_marker = hypre_CTAlloc(HYPRE_Int, n_fine, HYPRE_MEMORY_HOST); for (i = 0; i < n_fine; i++) { P_marker[i] = -1; } } if (full_off_procNodes) { P_marker_offd = hypre_CTAlloc(HYPRE_Int, full_off_procNodes, HYPRE_MEMORY_HOST); for (i = 0; i < full_off_procNodes; i++) { P_marker_offd[i] = -1;} } /* this thread's row range */ my_thread_num = hypre_GetThreadNum(); num_threads = hypre_NumActiveThreads(); start = (n_fine / num_threads) * my_thread_num; if (my_thread_num == num_threads - 1) { stop = n_fine; } else { stop = (n_fine / num_threads) * (my_thread_num + 1); } /* loop over rows */ /* This loop counts the number of elements in P */ /* is done by counting the elmements in the index set C-hat */ for (i = start; i < stop; i++) { P_diag_i[i] = jj_counter; if (num_procs > 1) { P_offd_i[i] = jj_counter_offd; } if (CF_marker[i] >= 0) { /* row in P corresponding to a coarse pt., will only require one element (1 on the diagonal). */ jj_counter++; fine_to_coarse[i] = coarse_counter; coarse_counter++; } /*-------------------------------------------------------------------- * If i is an F-point, interpolation is from the C-points that * strongly influence i, or C-points that stronly influence F-points * that strongly influence i. *--------------------------------------------------------------------*/ else if (CF_marker[i] != -3) { for (jj = S_diag_i[i]; jj < S_diag_i[i + 1]; jj++) { i1 = S_diag_j[jj]; if (CF_marker[i1] >= 0) { /* i1 is a C point */ if (P_marker[i1] < P_diag_i[i]) { P_marker[i1] = jj_counter; jj_counter++; } } else if (CF_marker[i1] != -3) { /* i1 is a F point, loop through it's strong neighbors */ for (kk = S_diag_i[i1]; kk < S_diag_i[i1 + 1]; kk++) { k1 = S_diag_j[kk]; if (CF_marker[k1] >= 0) { if (P_marker[k1] < P_diag_i[i]) { P_marker[k1] = jj_counter; jj_counter++; } } } if (num_procs > 1) { for (kk = S_offd_i[i1]; kk < S_offd_i[i1 + 1]; kk++) { k1 = S_offd_j[kk]; if (CF_marker_offd[k1] >= 0) { if (P_marker_offd[k1] < P_offd_i[i]) { tmp_CF_marker_offd[k1] = 1; P_marker_offd[k1] = jj_counter_offd; jj_counter_offd++; } } } } } } /* Look at off diag strong connections of i */ if (num_procs > 1) { for (jj = S_offd_i[i]; jj < S_offd_i[i + 1]; jj++) { i1 = S_offd_j[jj]; if (CF_marker_offd[i1] >= 0) { if (P_marker_offd[i1] < P_offd_i[i]) { tmp_CF_marker_offd[i1] = 1; P_marker_offd[i1] = jj_counter_offd; jj_counter_offd++; } } else if (CF_marker_offd[i1] != -3) { /* F point; look at neighbors of i1. Sop contains global col * numbers and entries that could be in S_diag or S_offd or * neither. */ for (kk = Sop_i[i1]; kk < Sop_i[i1 + 1]; kk++) { big_k1 = Sop_j[kk]; if (big_k1 >= col_1 && big_k1 < col_n) { /* In S_diag */ loc_col = (HYPRE_Int)(big_k1 - col_1); if (P_marker[loc_col] < P_diag_i[i]) { P_marker[loc_col] = jj_counter; jj_counter++; } } else { loc_col = (HYPRE_Int)(-big_k1 - 1); if (P_marker_offd[loc_col] < P_offd_i[i]) { P_marker_offd[loc_col] = jj_counter_offd; tmp_CF_marker_offd[loc_col] = 1; jj_counter_offd++; } } } } } } } } /*----------------------------------------------------------------------- * End loop over fine grid. *-----------------------------------------------------------------------*/ #ifdef HYPRE_USING_OPENMP #pragma omp barrier #endif P_diag_i[stop] = jj_counter; P_offd_i[stop] = jj_counter_offd; fine_to_coarse_offset[my_thread_num] = coarse_counter; diag_offset[my_thread_num] = jj_counter; offd_offset[my_thread_num] = jj_counter_offd; /* Stitch P_diag_i, P_offd_i and fine_to_coarse together */ #ifdef HYPRE_USING_OPENMP #pragma omp barrier #endif if (my_thread_num == 0) { /* Calculate the offset for P_diag_i and P_offd_i for each thread */ for (i = 1; i < num_threads; i++) { diag_offset[i] = diag_offset[i - 1] + diag_offset[i]; fine_to_coarse_offset[i] = fine_to_coarse_offset[i - 1] + fine_to_coarse_offset[i]; offd_offset[i] = offd_offset[i - 1] + offd_offset[i]; } } #ifdef HYPRE_USING_OPENMP #pragma omp barrier #endif if (my_thread_num > 0) { /* update row pointer array with offset, * making sure to update the row stop index */ for (i = start + 1; i <= stop; i++) { P_diag_i[i] += diag_offset[my_thread_num - 1]; P_offd_i[i] += offd_offset[my_thread_num - 1]; } /* update fine_to_coarse by offsetting with the offset * from the preceding thread */ for (i = start; i < stop; i++) { if (fine_to_coarse[i] >= 0) { fine_to_coarse[i] += fine_to_coarse_offset[my_thread_num - 1]; } } } #ifdef HYPRE_USING_OPENMP #pragma omp barrier #endif if (my_thread_num == 0) { if (debug_flag == 4) { wall_time = time_getWallclockSeconds() - wall_time; hypre_printf("Proc = %d determine structure %f\n", my_id, wall_time); fflush(NULL); } /*----------------------------------------------------------------------- * Allocate arrays. *-----------------------------------------------------------------------*/ if (debug_flag == 4) { wall_time = time_getWallclockSeconds(); } P_diag_size = P_diag_i[n_fine]; P_offd_size = P_offd_i[n_fine]; if (P_diag_size) { P_diag_j = hypre_CTAlloc(HYPRE_Int, P_diag_size, memory_location_P); P_diag_data = hypre_CTAlloc(HYPRE_Real, P_diag_size, memory_location_P); } if (P_offd_size) { P_offd_j = hypre_CTAlloc(HYPRE_Int, P_offd_size, memory_location_P); P_offd_data = hypre_CTAlloc(HYPRE_Real, P_offd_size, memory_location_P); } } /* Fine to coarse mapping */ if (num_procs > 1 && my_thread_num == 0) { hypre_big_insert_new_nodes(comm_pkg, extend_comm_pkg, fine_to_coarse, full_off_procNodes, my_first_cpt, fine_to_coarse_offd); } for (i = 0; i < n_fine; i++) { P_marker[i] = -1; } for (i = 0; i < full_off_procNodes; i++) { P_marker_offd[i] = -1; } /*----------------------------------------------------------------------- * Loop over fine grid points. *-----------------------------------------------------------------------*/ #ifdef HYPRE_USING_OPENMP #pragma omp barrier #endif for (i = start; i < stop; i++) { jj_begin_row = P_diag_i[i]; jj_begin_row_offd = P_offd_i[i]; jj_counter = jj_begin_row; jj_counter_offd = jj_begin_row_offd; /*-------------------------------------------------------------------- * If i is a c-point, interpolation is the identity. *--------------------------------------------------------------------*/ if (CF_marker[i] >= 0) { P_diag_j[jj_counter] = fine_to_coarse[i]; P_diag_data[jj_counter] = one; jj_counter++; } /*-------------------------------------------------------------------- * If i is an F-point, build interpolation. *--------------------------------------------------------------------*/ else if (CF_marker[i] != -3) { strong_f_marker--; for (jj = S_diag_i[i]; jj < S_diag_i[i + 1]; jj++) { i1 = S_diag_j[jj]; /*-------------------------------------------------------------- * If neighbor i1 is a C-point, set column number in P_diag_j * and initialize interpolation weight to zero. *--------------------------------------------------------------*/ if (CF_marker[i1] >= 0) { if (P_marker[i1] < jj_begin_row) { P_marker[i1] = jj_counter; P_diag_j[jj_counter] = fine_to_coarse[i1]; P_diag_data[jj_counter] = zero; jj_counter++; } } else if (CF_marker[i1] != -3) { P_marker[i1] = strong_f_marker; for (kk = S_diag_i[i1]; kk < S_diag_i[i1 + 1]; kk++) { k1 = S_diag_j[kk]; if (CF_marker[k1] >= 0) { if (P_marker[k1] < jj_begin_row) { P_marker[k1] = jj_counter; P_diag_j[jj_counter] = fine_to_coarse[k1]; P_diag_data[jj_counter] = zero; jj_counter++; } } } if (num_procs > 1) { for (kk = S_offd_i[i1]; kk < S_offd_i[i1 + 1]; kk++) { k1 = S_offd_j[kk]; if (CF_marker_offd[k1] >= 0) { if (P_marker_offd[k1] < jj_begin_row_offd) { P_marker_offd[k1] = jj_counter_offd; P_offd_j[jj_counter_offd] = k1; P_offd_data[jj_counter_offd] = zero; jj_counter_offd++; } } } } } } if ( num_procs > 1) { for (jj = S_offd_i[i]; jj < S_offd_i[i + 1]; jj++) { i1 = S_offd_j[jj]; if ( CF_marker_offd[i1] >= 0) { if (P_marker_offd[i1] < jj_begin_row_offd) { P_marker_offd[i1] = jj_counter_offd; P_offd_j[jj_counter_offd] = i1; P_offd_data[jj_counter_offd] = zero; jj_counter_offd++; } } else if (CF_marker_offd[i1] != -3) { P_marker_offd[i1] = strong_f_marker; for (kk = Sop_i[i1]; kk < Sop_i[i1 + 1]; kk++) { big_k1 = Sop_j[kk]; /* Find local col number */ if (big_k1 >= col_1 && big_k1 < col_n) { loc_col = (HYPRE_Int)(big_k1 - col_1); if (P_marker[loc_col] < jj_begin_row) { P_marker[loc_col] = jj_counter; P_diag_j[jj_counter] = fine_to_coarse[loc_col]; P_diag_data[jj_counter] = zero; jj_counter++; } } else { loc_col = (HYPRE_Int)(-big_k1 - 1); if (P_marker_offd[loc_col] < jj_begin_row_offd) { P_marker_offd[loc_col] = jj_counter_offd; P_offd_j[jj_counter_offd] = loc_col; P_offd_data[jj_counter_offd] = zero; jj_counter_offd++; } } } } } } jj_end_row = jj_counter; jj_end_row_offd = jj_counter_offd; diagonal = A_diag_data[A_diag_i[i]]; for (jj = A_diag_i[i] + 1; jj < A_diag_i[i + 1]; jj++) { /* i1 is a c-point and strongly influences i, accumulate * a_(i,i1) into interpolation weight */ i1 = A_diag_j[jj]; if (P_marker[i1] >= jj_begin_row) { P_diag_data[P_marker[i1]] += A_diag_data[jj]; } else if (P_marker[i1] == strong_f_marker) { sum = zero; sgn = 1; if (A_diag_data[A_diag_i[i1]] < 0) { sgn = -1; } /* Loop over row of A for point i1 and calculate the sum * of the connections to c-points that strongly influence i. */ for (jj1 = A_diag_i[i1] + 1; jj1 < A_diag_i[i1 + 1]; jj1++) { i2 = A_diag_j[jj1]; if ((P_marker[i2] >= jj_begin_row || i2 == i) && (sgn * A_diag_data[jj1]) < 0) { sum += A_diag_data[jj1]; } } if (num_procs > 1) { for (jj1 = A_offd_i[i1]; jj1 < A_offd_i[i1 + 1]; jj1++) { i2 = A_offd_j[jj1]; if (P_marker_offd[i2] >= jj_begin_row_offd && (sgn * A_offd_data[jj1]) < 0) { sum += A_offd_data[jj1]; } } } if (sum != 0) { distribute = A_diag_data[jj] / sum; /* Loop over row of A for point i1 and do the distribution */ for (jj1 = A_diag_i[i1] + 1; jj1 < A_diag_i[i1 + 1]; jj1++) { i2 = A_diag_j[jj1]; if (P_marker[i2] >= jj_begin_row && (sgn * A_diag_data[jj1]) < 0) P_diag_data[P_marker[i2]] += distribute * A_diag_data[jj1]; if (i2 == i && (sgn * A_diag_data[jj1]) < 0) { diagonal += distribute * A_diag_data[jj1]; } } if (num_procs > 1) { for (jj1 = A_offd_i[i1]; jj1 < A_offd_i[i1 + 1]; jj1++) { i2 = A_offd_j[jj1]; if (P_marker_offd[i2] >= jj_begin_row_offd && (sgn * A_offd_data[jj1]) < 0) P_offd_data[P_marker_offd[i2]] += distribute * A_offd_data[jj1]; } } } else { diagonal += A_diag_data[jj]; } } /* neighbor i1 weakly influences i, accumulate a_(i,i1) into * diagonal */ else if (CF_marker[i1] != -3) { if (num_functions == 1 || dof_func[i] == dof_func[i1]) { diagonal += A_diag_data[jj]; } } } if (num_procs > 1) { for (jj = A_offd_i[i]; jj < A_offd_i[i + 1]; jj++) { i1 = A_offd_j[jj]; if (P_marker_offd[i1] >= jj_begin_row_offd) { P_offd_data[P_marker_offd[i1]] += A_offd_data[jj]; } else if (P_marker_offd[i1] == strong_f_marker) { sum = zero; for (jj1 = A_ext_i[i1]; jj1 < A_ext_i[i1 + 1]; jj1++) { big_k1 = A_ext_j[jj1]; if (big_k1 >= col_1 && big_k1 < col_n) { /* diag */ loc_col = (HYPRE_Int)(big_k1 - col_1); if (P_marker[loc_col] >= jj_begin_row || loc_col == i) { sum += A_ext_data[jj1]; } } else { loc_col = (HYPRE_Int)(-big_k1 - 1); if (P_marker_offd[loc_col] >= jj_begin_row_offd) { sum += A_ext_data[jj1]; } } } if (sum != 0) { distribute = A_offd_data[jj] / sum; for (jj1 = A_ext_i[i1]; jj1 < A_ext_i[i1 + 1]; jj1++) { big_k1 = A_ext_j[jj1]; if (big_k1 >= col_1 && big_k1 < col_n) { /* diag */ loc_col = (HYPRE_Int)(big_k1 - col_1); if (P_marker[loc_col] >= jj_begin_row) P_diag_data[P_marker[loc_col]] += distribute * A_ext_data[jj1]; if (loc_col == i) { diagonal += distribute * A_ext_data[jj1]; } } else { loc_col = (HYPRE_Int)(-big_k1 - 1); if (P_marker_offd[loc_col] >= jj_begin_row_offd) P_offd_data[P_marker_offd[loc_col]] += distribute * A_ext_data[jj1]; } } } else { diagonal += A_offd_data[jj]; } } else if (CF_marker_offd[i1] != -3) { if (num_functions == 1 || dof_func[i] == dof_func_offd[i1]) { diagonal += A_offd_data[jj]; } } } } if (diagonal) { for (jj = jj_begin_row; jj < jj_end_row; jj++) { P_diag_data[jj] /= -diagonal; } for (jj = jj_begin_row_offd; jj < jj_end_row_offd; jj++) { P_offd_data[jj] /= -diagonal; } } } strong_f_marker--; } /*----------------------------------------------------------------------- * End large for loop over nfine *-----------------------------------------------------------------------*/ if (n_fine) { hypre_TFree(P_marker, HYPRE_MEMORY_HOST); } if (full_off_procNodes) { hypre_TFree(P_marker_offd, HYPRE_MEMORY_HOST); } } /*----------------------------------------------------------------------- * End PAR_REGION *-----------------------------------------------------------------------*/ if (debug_flag == 4) { wall_time = time_getWallclockSeconds() - wall_time; hypre_printf("Proc = %d fill structure %f\n", my_id, wall_time); fflush(NULL); } /*----------------------------------------------------------------------- * Allocate arrays. *-----------------------------------------------------------------------*/ P = hypre_ParCSRMatrixCreate(comm, hypre_ParCSRMatrixGlobalNumRows(A), total_global_cpts, hypre_ParCSRMatrixColStarts(A), num_cpts_global, 0, P_diag_i[n_fine], P_offd_i[n_fine]); P_diag = hypre_ParCSRMatrixDiag(P); hypre_CSRMatrixData(P_diag) = P_diag_data; hypre_CSRMatrixI(P_diag) = P_diag_i; hypre_CSRMatrixJ(P_diag) = P_diag_j; P_offd = hypre_ParCSRMatrixOffd(P); hypre_CSRMatrixData(P_offd) = P_offd_data; hypre_CSRMatrixI(P_offd) = P_offd_i; hypre_CSRMatrixJ(P_offd) = P_offd_j; hypre_CSRMatrixMemoryLocation(P_diag) = memory_location_P; hypre_CSRMatrixMemoryLocation(P_offd) = memory_location_P; /* Compress P, removing coefficients smaller than trunc_factor * Max */ if (trunc_factor != 0.0 || max_elmts > 0) { #ifdef HYPRE_PROFILE hypre_profile_times[HYPRE_TIMER_ID_EXTENDED_I_INTERP] += hypre_MPI_Wtime(); #endif hypre_BoomerAMGInterpTruncation(P, trunc_factor, max_elmts); #ifdef HYPRE_PROFILE hypre_profile_times[HYPRE_TIMER_ID_EXTENDED_I_INTERP] -= hypre_MPI_Wtime(); #endif P_diag_data = hypre_CSRMatrixData(P_diag); P_diag_i = hypre_CSRMatrixI(P_diag); P_diag_j = hypre_CSRMatrixJ(P_diag); P_offd_data = hypre_CSRMatrixData(P_offd); P_offd_i = hypre_CSRMatrixI(P_offd); P_offd_j = hypre_CSRMatrixJ(P_offd); P_diag_size = P_diag_i[n_fine]; P_offd_size = P_offd_i[n_fine]; } /* This builds col_map, col_map should be monotone increasing and contain * global numbers. */ if (P_offd_size) { hypre_build_interp_colmap(P, full_off_procNodes, tmp_CF_marker_offd, fine_to_coarse_offd); } hypre_MatvecCommPkgCreate(P); #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i) HYPRE_SMP_SCHEDULE #endif for (i = 0; i < n_fine; i++) { if (CF_marker[i] == -3) { CF_marker[i] = -1; } } *P_ptr = P; /* Deallocate memory */ hypre_TFree(max_num_threads, HYPRE_MEMORY_HOST); hypre_TFree(fine_to_coarse, HYPRE_MEMORY_HOST); hypre_TFree(diag_offset, HYPRE_MEMORY_HOST); hypre_TFree(offd_offset, HYPRE_MEMORY_HOST); hypre_TFree(fine_to_coarse_offset, HYPRE_MEMORY_HOST); if (num_procs > 1) { hypre_CSRMatrixDestroy(Sop); hypre_CSRMatrixDestroy(A_ext); hypre_TFree(fine_to_coarse_offd, HYPRE_MEMORY_HOST); hypre_TFree(CF_marker_offd, HYPRE_MEMORY_HOST); hypre_TFree(tmp_CF_marker_offd, HYPRE_MEMORY_HOST); if (num_functions > 1) { hypre_TFree(dof_func_offd, HYPRE_MEMORY_HOST); } hypre_MatvecCommPkgDestroy(extend_comm_pkg); } #ifdef HYPRE_PROFILE hypre_profile_times[HYPRE_TIMER_ID_EXTENDED_I_INTERP] += hypre_MPI_Wtime(); #endif return hypre_error_flag; } /*--------------------------------------------------------------------------- * hypre_BoomerAMGBuildExtPICCInterp * Comment: Only use FF when there is no common c point. *--------------------------------------------------------------------------*/ HYPRE_Int hypre_BoomerAMGBuildExtPICCInterp(hypre_ParCSRMatrix *A, HYPRE_Int *CF_marker, hypre_ParCSRMatrix *S, HYPRE_BigInt *num_cpts_global, HYPRE_Int num_functions, HYPRE_Int *dof_func, HYPRE_Int debug_flag, HYPRE_Real trunc_factor, HYPRE_Int max_elmts, hypre_ParCSRMatrix **P_ptr) { HYPRE_UNUSED_VAR(debug_flag); /* Communication Variables */ MPI_Comm comm = hypre_ParCSRMatrixComm(A); hypre_ParCSRCommPkg *comm_pkg = hypre_ParCSRMatrixCommPkg(A); HYPRE_Int my_id, num_procs; HYPRE_MemoryLocation memory_location_P = hypre_ParCSRMatrixMemoryLocation(A); /* Variables to store input variables */ hypre_CSRMatrix *A_diag = hypre_ParCSRMatrixDiag(A); HYPRE_Real *A_diag_data = hypre_CSRMatrixData(A_diag); HYPRE_Int *A_diag_i = hypre_CSRMatrixI(A_diag); HYPRE_Int *A_diag_j = hypre_CSRMatrixJ(A_diag); hypre_CSRMatrix *A_offd = hypre_ParCSRMatrixOffd(A); HYPRE_Real *A_offd_data = hypre_CSRMatrixData(A_offd); HYPRE_Int *A_offd_i = hypre_CSRMatrixI(A_offd); HYPRE_Int *A_offd_j = hypre_CSRMatrixJ(A_offd); /*HYPRE_Int num_cols_A_offd = hypre_CSRMatrixNumCols(A_offd); HYPRE_Int *col_map_offd = hypre_ParCSRMatrixColMapOffd(A);*/ HYPRE_Int n_fine = hypre_CSRMatrixNumRows(A_diag); HYPRE_BigInt col_1 = hypre_ParCSRMatrixFirstRowIndex(A); HYPRE_Int local_numrows = hypre_CSRMatrixNumRows(A_diag); HYPRE_BigInt col_n = col_1 + (HYPRE_BigInt)local_numrows; HYPRE_BigInt total_global_cpts, my_first_cpt; /* Variables to store strong connection matrix info */ hypre_CSRMatrix *S_diag = hypre_ParCSRMatrixDiag(S); HYPRE_Int *S_diag_i = hypre_CSRMatrixI(S_diag); HYPRE_Int *S_diag_j = hypre_CSRMatrixJ(S_diag); hypre_CSRMatrix *S_offd = hypre_ParCSRMatrixOffd(S); HYPRE_Int *S_offd_i = hypre_CSRMatrixI(S_offd); HYPRE_Int *S_offd_j = hypre_CSRMatrixJ(S_offd); /* Interpolation matrix P */ hypre_ParCSRMatrix *P; hypre_CSRMatrix *P_diag; hypre_CSRMatrix *P_offd; HYPRE_Real *P_diag_data = NULL; HYPRE_Int *P_diag_i, *P_diag_j = NULL; HYPRE_Real *P_offd_data = NULL; HYPRE_Int *P_offd_i, *P_offd_j = NULL; /*HYPRE_Int *col_map_offd_P = NULL;*/ HYPRE_Int P_diag_size; HYPRE_Int P_offd_size; HYPRE_Int *P_marker = NULL; HYPRE_Int *P_marker_offd = NULL; HYPRE_Int *CF_marker_offd = NULL; HYPRE_Int *tmp_CF_marker_offd = NULL; HYPRE_Int *dof_func_offd = NULL; /*HYPRE_Int **ext_p, **ext_p_offd;*/ /*HYPRE_Int ccounter_offd; HYPRE_Int *clist_offd;*/ HYPRE_Int common_c; /* Full row information for columns of A that are off diag*/ hypre_CSRMatrix *A_ext = NULL; HYPRE_Real *A_ext_data = NULL; HYPRE_Int *A_ext_i = NULL; HYPRE_BigInt *A_ext_j = NULL; HYPRE_Int *fine_to_coarse = NULL; HYPRE_BigInt *fine_to_coarse_offd = NULL; HYPRE_Int loc_col; HYPRE_Int full_off_procNodes; hypre_CSRMatrix *Sop = NULL; HYPRE_Int *Sop_i = NULL; HYPRE_BigInt *Sop_j = NULL; HYPRE_Int sgn = 1; /* Variables to keep count of interpolatory points */ HYPRE_Int jj_counter, jj_counter_offd; HYPRE_Int jj_begin_row, jj_end_row; HYPRE_Int jj_begin_row_offd = 0; HYPRE_Int jj_end_row_offd = 0; HYPRE_Int coarse_counter; /* Interpolation weight variables */ HYPRE_Real sum, diagonal, distribute; HYPRE_Int strong_f_marker = -2; /* Loop variables */ /*HYPRE_Int index;*/ HYPRE_Int start_indexing = 0; HYPRE_Int i, i1, i2, jj, kk, k1, jj1; HYPRE_BigInt big_k1; /*HYPRE_Int ccounter; HYPRE_Int *clist, ccounter;*/ /* Definitions */ HYPRE_Real zero = 0.0; HYPRE_Real one = 1.0; hypre_ParCSRCommPkg *extend_comm_pkg = NULL; /* BEGIN */ hypre_MPI_Comm_size(comm, &num_procs); hypre_MPI_Comm_rank(comm, &my_id); my_first_cpt = num_cpts_global[0]; if (my_id == (num_procs - 1)) { total_global_cpts = num_cpts_global[1]; } hypre_MPI_Bcast(&total_global_cpts, 1, HYPRE_MPI_BIG_INT, num_procs - 1, comm); if (!comm_pkg) { hypre_MatvecCommPkgCreate(A); comm_pkg = hypre_ParCSRMatrixCommPkg(A); } /* Set up off processor information (specifically for neighbors of * neighbors */ full_off_procNodes = 0; if (num_procs > 1) { hypre_exchange_interp_data( &CF_marker_offd, &dof_func_offd, &A_ext, &full_off_procNodes, &Sop, &extend_comm_pkg, A, CF_marker, S, num_functions, dof_func, 1); { #ifdef HYPRE_PROFILE hypre_profile_times[HYPRE_TIMER_ID_EXTENDED_I_INTERP] += hypre_MPI_Wtime(); #endif } A_ext_i = hypre_CSRMatrixI(A_ext); A_ext_j = hypre_CSRMatrixBigJ(A_ext); A_ext_data = hypre_CSRMatrixData(A_ext); Sop_i = hypre_CSRMatrixI(Sop); Sop_j = hypre_CSRMatrixBigJ(Sop); } /*----------------------------------------------------------------------- * First Pass: Determine size of P and fill in fine_to_coarse mapping. *-----------------------------------------------------------------------*/ /*----------------------------------------------------------------------- * Intialize counters and allocate mapping vector. *-----------------------------------------------------------------------*/ P_diag_i = hypre_CTAlloc(HYPRE_Int, n_fine + 1, memory_location_P); P_offd_i = hypre_CTAlloc(HYPRE_Int, n_fine + 1, memory_location_P); if (n_fine) { fine_to_coarse = hypre_CTAlloc(HYPRE_Int, n_fine, HYPRE_MEMORY_HOST); P_marker = hypre_CTAlloc(HYPRE_Int, n_fine, HYPRE_MEMORY_HOST); } if (full_off_procNodes) { P_marker_offd = hypre_CTAlloc(HYPRE_Int, full_off_procNodes, HYPRE_MEMORY_HOST); fine_to_coarse_offd = hypre_CTAlloc(HYPRE_BigInt, full_off_procNodes, HYPRE_MEMORY_HOST); tmp_CF_marker_offd = hypre_CTAlloc(HYPRE_Int, full_off_procNodes, HYPRE_MEMORY_HOST); } /*clist = hypre_CTAlloc(HYPRE_Int, MAX_C_CONNECTIONS); for (i = 0; i < MAX_C_CONNECTIONS; i++) clist[i] = 0; if (num_procs > 1) { clist_offd = hypre_CTAlloc(HYPRE_Int, MAX_C_CONNECTIONS, HYPRE_MEMORY_HOST); for (i = 0; i < MAX_C_CONNECTIONS; i++) clist_offd[i] = 0; }*/ hypre_initialize_vecs(n_fine, full_off_procNodes, fine_to_coarse, fine_to_coarse_offd, P_marker, P_marker_offd, tmp_CF_marker_offd); jj_counter = start_indexing; jj_counter_offd = start_indexing; coarse_counter = 0; /*----------------------------------------------------------------------- * Loop over fine grid. *-----------------------------------------------------------------------*/ for (i = 0; i < n_fine; i++) { P_diag_i[i] = jj_counter; if (num_procs > 1) { P_offd_i[i] = jj_counter_offd; } if (CF_marker[i] >= 0) { jj_counter++; fine_to_coarse[i] = coarse_counter; coarse_counter++; } /*-------------------------------------------------------------------- * If i is an F-point, interpolation is from the C-points that * strongly influence i, or C-points that stronly influence F-points * that strongly influence i. *--------------------------------------------------------------------*/ else if (CF_marker[i] != -3) { /* Initialize ccounter for each f point */ /*ccounter = 0; ccounter_offd = 0;*/ for (jj = S_diag_i[i]; jj < S_diag_i[i + 1]; jj++) { /* search through diag to find all c neighbors */ i1 = S_diag_j[jj]; if (CF_marker[i1] > 0) { /* i1 is a C point */ CF_marker[i1] = 2; if (P_marker[i1] < P_diag_i[i]) { /*clist[ccounter++] = i1;*/ P_marker[i1] = jj_counter; jj_counter++; } } } /*qsort0(clist,0,ccounter-1);*/ if (num_procs > 1) { for (jj = S_offd_i[i]; jj < S_offd_i[i + 1]; jj++) { /* search through offd to find all c neighbors */ i1 = S_offd_j[jj]; if (CF_marker_offd[i1] > 0) { /* i1 is a C point direct neighbor */ CF_marker_offd[i1] = 2; if (P_marker_offd[i1] < P_offd_i[i]) { /*clist_offd[ccounter_offd++] = i1;*/ tmp_CF_marker_offd[i1] = 1; P_marker_offd[i1] = jj_counter_offd; jj_counter_offd++; } } } /*qsort0(clist_offd,0,ccounter_offd-1);*/ } for (jj = S_diag_i[i]; jj < S_diag_i[i + 1]; jj++) { /* Search diag to find f neighbors and determine if common c point */ i1 = S_diag_j[jj]; if (CF_marker[i1] == -1) { /* i1 is a F point, loop through it's strong neighbors */ common_c = 0; for (kk = S_diag_i[i1]; kk < S_diag_i[i1 + 1]; kk++) { k1 = S_diag_j[kk]; if (CF_marker[k1] == 2) { /*if (hypre_BinarySearch(clist,k1,ccounter) >= 0) {*/ common_c = 1; break; /*kk = S_diag_i[i1+1]; }*/ } } if (num_procs > 1 && common_c == 0) { /* no common c point yet, check offd */ for (kk = S_offd_i[i1]; kk < S_offd_i[i1 + 1]; kk++) { k1 = S_offd_j[kk]; if (CF_marker_offd[k1] == 2) { /* k1 is a c point check if it is common */ /*if (hypre_BinarySearch(clist_offd,k1,ccounter_offd) >= 0) {*/ common_c = 1; break; /*kk = S_offd_i[i1+1]; }*/ } } } if (!common_c) { /* No common c point, extend the interp set */ for (kk = S_diag_i[i1]; kk < S_diag_i[i1 + 1]; kk++) { k1 = S_diag_j[kk]; if (CF_marker[k1] > 0) { if (P_marker[k1] < P_diag_i[i]) { P_marker[k1] = jj_counter; jj_counter++; /*break;*/ } } } if (num_procs > 1) { for (kk = S_offd_i[i1]; kk < S_offd_i[i1 + 1]; kk++) { k1 = S_offd_j[kk]; if (CF_marker_offd[k1] > 0) { if (P_marker_offd[k1] < P_offd_i[i]) { tmp_CF_marker_offd[k1] = 1; P_marker_offd[k1] = jj_counter_offd; jj_counter_offd++; /*break;*/ } } } } } } } /* Look at off diag strong connections of i */ if (num_procs > 1) { for (jj = S_offd_i[i]; jj < S_offd_i[i + 1]; jj++) { i1 = S_offd_j[jj]; if (CF_marker_offd[i1] == -1) { /* F point; look at neighbors of i1. Sop contains global col * numbers and entries that could be in S_diag or S_offd or * neither. */ common_c = 0; for (kk = Sop_i[i1]; kk < Sop_i[i1 + 1]; kk++) { /* Check if common c */ big_k1 = Sop_j[kk]; if (big_k1 >= col_1 && big_k1 < col_n) { /* In S_diag */ loc_col = (HYPRE_Int)(big_k1 - col_1); if (CF_marker[loc_col] == 2) { /*if (hypre_BinarySearch(clist,loc_col,ccounter) >= 0) {*/ common_c = 1; break; /*kk = Sop_i[i1+1]; }*/ } } else { loc_col = (HYPRE_BigInt)(-big_k1 - 1); if (CF_marker_offd[loc_col] == 2) { /*if (hypre_BinarySearch(clist_offd,loc_col,ccounter_offd) >= 0) {*/ common_c = 1; break; /*kk = Sop_i[i1+1]; }*/ } } } if (!common_c) { for (kk = Sop_i[i1]; kk < Sop_i[i1 + 1]; kk++) { /* Check if common c */ big_k1 = Sop_j[kk]; if (big_k1 >= col_1 && big_k1 < col_n) { /* In S_diag */ loc_col = (HYPRE_Int)(big_k1 - col_1); if (P_marker[loc_col] < P_diag_i[i]) { P_marker[loc_col] = jj_counter; jj_counter++; /*break;*/ } } else { loc_col = (HYPRE_Int)(-big_k1 - 1); if (P_marker_offd[loc_col] < P_offd_i[i]) { P_marker_offd[loc_col] = jj_counter_offd; tmp_CF_marker_offd[loc_col] = 1; jj_counter_offd++; /*break;*/ } } } } } } } for (jj = S_diag_i[i]; jj < S_diag_i[i + 1]; jj++) { /* search through diag to find all c neighbors */ i1 = S_diag_j[jj]; if (CF_marker[i1] == 2) { CF_marker[i1] = 1; } } if (num_procs > 1) { for (jj = S_offd_i[i]; jj < S_offd_i[i + 1]; jj++) { /* search through offd to find all c neighbors */ i1 = S_offd_j[jj]; if (CF_marker_offd[i1] == 2) { /* i1 is a C point direct neighbor */ CF_marker_offd[i1] = 1; } } } } } /*----------------------------------------------------------------------- * Allocate arrays. *-----------------------------------------------------------------------*/ P_diag_size = jj_counter; P_offd_size = jj_counter_offd; if (P_diag_size) { P_diag_j = hypre_CTAlloc(HYPRE_Int, P_diag_size, memory_location_P); P_diag_data = hypre_CTAlloc(HYPRE_Real, P_diag_size, memory_location_P); } if (P_offd_size) { P_offd_j = hypre_CTAlloc(HYPRE_Int, P_offd_size, memory_location_P); P_offd_data = hypre_CTAlloc(HYPRE_Real, P_offd_size, memory_location_P); } P_diag_i[n_fine] = jj_counter; P_offd_i[n_fine] = jj_counter_offd; jj_counter = start_indexing; jj_counter_offd = start_indexing; /*ccounter = start_indexing; ccounter_offd = start_indexing;*/ /* Fine to coarse mapping */ if (num_procs > 1) { hypre_big_insert_new_nodes(comm_pkg, extend_comm_pkg, fine_to_coarse, full_off_procNodes, my_first_cpt, fine_to_coarse_offd); } for (i = 0; i < n_fine; i++) { P_marker[i] = -1; } for (i = 0; i < full_off_procNodes; i++) { P_marker_offd[i] = -1; } /*----------------------------------------------------------------------- * Loop over fine grid points. *-----------------------------------------------------------------------*/ for (i = 0; i < n_fine; i++) { jj_begin_row = jj_counter; if (num_procs > 1) { jj_begin_row_offd = jj_counter_offd; } /*-------------------------------------------------------------------- * If i is a c-point, interpolation is the identity. *--------------------------------------------------------------------*/ if (CF_marker[i] >= 0) { P_diag_j[jj_counter] = fine_to_coarse[i]; P_diag_data[jj_counter] = one; jj_counter++; } /*-------------------------------------------------------------------- * If i is an F-point, build interpolation. *--------------------------------------------------------------------*/ else if (CF_marker[i] != -3) { /*ccounter = 0; ccounter_offd = 0;*/ strong_f_marker--; for (jj = S_diag_i[i]; jj < S_diag_i[i + 1]; jj++) { /* Search C points only */ i1 = S_diag_j[jj]; /*-------------------------------------------------------------- * If neighbor i1 is a C-point, set column number in P_diag_j * and initialize interpolation weight to zero. *--------------------------------------------------------------*/ if (CF_marker[i1] > 0) { CF_marker[i1] = 2; if (P_marker[i1] < jj_begin_row) { P_marker[i1] = jj_counter; P_diag_j[jj_counter] = fine_to_coarse[i1]; P_diag_data[jj_counter] = zero; jj_counter++; /*clist[ccounter++] = i1;*/ } } } /*qsort0(clist,0,ccounter-1);*/ if ( num_procs > 1) { for (jj = S_offd_i[i]; jj < S_offd_i[i + 1]; jj++) { i1 = S_offd_j[jj]; if ( CF_marker_offd[i1] > 0) { CF_marker_offd[i1] = 2; if (P_marker_offd[i1] < jj_begin_row_offd) { P_marker_offd[i1] = jj_counter_offd; P_offd_j[jj_counter_offd] = i1; P_offd_data[jj_counter_offd] = zero; jj_counter_offd++; /*clist_offd[ccounter_offd++] = i1;*/ } } } /*qsort0(clist_offd,0,ccounter_offd-1);*/ } for (jj = S_diag_i[i]; jj < S_diag_i[i + 1]; jj++) { /* Search through F points */ i1 = S_diag_j[jj]; if (CF_marker[i1] == -1) { P_marker[i1] = strong_f_marker; common_c = 0; for (kk = S_diag_i[i1]; kk < S_diag_i[i1 + 1]; kk++) { k1 = S_diag_j[kk]; if (CF_marker[k1] == 2) { /*if (hypre_BinarySearch(clist,k1,ccounter) >= 0) {*/ common_c = 1; break; /*kk = S_diag_i[i1+1]; }*/ } } if (num_procs > 1 && common_c == 0) { /* no common c point yet, check offd */ for (kk = S_offd_i[i1]; kk < S_offd_i[i1 + 1]; kk++) { k1 = S_offd_j[kk]; if (CF_marker_offd[k1] == 2) { /* k1 is a c point check if it is common */ /*if (hypre_BinarySearch(clist_offd,k1,ccounter_offd) >= 0) {*/ common_c = 1; break; /*kk = S_offd_i[i1+1]; }*/ } } } if (!common_c) { /* No common c point, extend the interp set */ for (kk = S_diag_i[i1]; kk < S_diag_i[i1 + 1]; kk++) { k1 = S_diag_j[kk]; if (CF_marker[k1] >= 0) { if (P_marker[k1] < jj_begin_row) { P_marker[k1] = jj_counter; P_diag_j[jj_counter] = fine_to_coarse[k1]; P_diag_data[jj_counter] = zero; jj_counter++; /*break;*/ } } } if (num_procs > 1) { for (kk = S_offd_i[i1]; kk < S_offd_i[i1 + 1]; kk++) { k1 = S_offd_j[kk]; if (CF_marker_offd[k1] >= 0) { if (P_marker_offd[k1] < jj_begin_row_offd) { P_marker_offd[k1] = jj_counter_offd; P_offd_j[jj_counter_offd] = k1; P_offd_data[jj_counter_offd] = zero; jj_counter_offd++; /*break;*/ } } } } } } } if ( num_procs > 1) { for (jj = S_offd_i[i]; jj < S_offd_i[i + 1]; jj++) { i1 = S_offd_j[jj]; if (CF_marker_offd[i1] == -1) { /* F points that are off proc */ P_marker_offd[i1] = strong_f_marker; common_c = 0; for (kk = Sop_i[i1]; kk < Sop_i[i1 + 1]; kk++) { /* Check if common c */ big_k1 = Sop_j[kk]; if (big_k1 >= col_1 && big_k1 < col_n) { /* In S_diag */ loc_col = (HYPRE_Int)(big_k1 - col_1); if (CF_marker[loc_col] == 2) { /*if (hypre_BinarySearch(clist,loc_col,ccounter) >= 0) {*/ common_c = 1; break; /*kk = Sop_i[i1+1]; }*/ } } else { loc_col = (HYPRE_Int)(-big_k1 - 1); if (CF_marker_offd[loc_col] == 2) { /*if (hypre_BinarySearch(clist_offd,loc_col,ccounter_offd) >= 0) {*/ common_c = 1; break; /*kk = Sop_i[i1+1]; }*/ } } } if (!common_c) { for (kk = Sop_i[i1]; kk < Sop_i[i1 + 1]; kk++) { big_k1 = Sop_j[kk]; /* Find local col number */ if (big_k1 >= col_1 && big_k1 < col_n) { loc_col = (HYPRE_Int)(big_k1 - col_1); if (P_marker[loc_col] < jj_begin_row) { P_marker[loc_col] = jj_counter; P_diag_j[jj_counter] = fine_to_coarse[loc_col]; P_diag_data[jj_counter] = zero; jj_counter++; /*break;*/ } } else { loc_col = (-big_k1 - 1); if (P_marker_offd[loc_col] < jj_begin_row_offd) { P_marker_offd[loc_col] = jj_counter_offd; P_offd_j[jj_counter_offd] = loc_col; P_offd_data[jj_counter_offd] = zero; jj_counter_offd++; /*break;*/ } } } } } } } for (jj = S_diag_i[i]; jj < S_diag_i[i + 1]; jj++) { /* Search C points only */ i1 = S_diag_j[jj]; /*-------------------------------------------------------------- * If neighbor i1 is a C-point, set column number in P_diag_j * and initialize interpolation weight to zero. *--------------------------------------------------------------*/ if (CF_marker[i1] == 2) { CF_marker[i1] = 1; } } if ( num_procs > 1) { for (jj = S_offd_i[i]; jj < S_offd_i[i + 1]; jj++) { i1 = S_offd_j[jj]; if ( CF_marker_offd[i1] == 2) { CF_marker_offd[i1] = 1; } } } jj_end_row = jj_counter; jj_end_row_offd = jj_counter_offd; diagonal = A_diag_data[A_diag_i[i]]; for (jj = A_diag_i[i] + 1; jj < A_diag_i[i + 1]; jj++) { /* i1 is a c-point and strongly influences i, accumulate * a_(i,i1) into interpolation weight */ i1 = A_diag_j[jj]; if (P_marker[i1] >= jj_begin_row) { P_diag_data[P_marker[i1]] += A_diag_data[jj]; } else if (P_marker[i1] == strong_f_marker) { sum = zero; sgn = 1; if (A_diag_data[A_diag_i[i1]] < 0) { sgn = -1; } for (jj1 = A_diag_i[i1] + 1; jj1 < A_diag_i[i1 + 1]; jj1++) { i2 = A_diag_j[jj1]; if ((P_marker[i2] >= jj_begin_row || i2 == i) && (sgn * A_diag_data[jj1]) < 0) { sum += A_diag_data[jj1]; } } if (num_procs > 1) { for (jj1 = A_offd_i[i1]; jj1 < A_offd_i[i1 + 1]; jj1++) { i2 = A_offd_j[jj1]; if (P_marker_offd[i2] >= jj_begin_row_offd && (sgn * A_offd_data[jj1]) < 0) { sum += A_offd_data[jj1]; } } } if (sum != 0) { distribute = A_diag_data[jj] / sum; /* Loop over row of A for point i1 and do the distribution */ for (jj1 = A_diag_i[i1]; jj1 < A_diag_i[i1 + 1]; jj1++) { i2 = A_diag_j[jj1]; if (P_marker[i2] >= jj_begin_row && (sgn * A_diag_data[jj1]) < 0) P_diag_data[P_marker[i2]] += distribute * A_diag_data[jj1]; if (i2 == i && (sgn * A_diag_data[jj1]) < 0) { diagonal += distribute * A_diag_data[jj1]; } } if (num_procs > 1) { for (jj1 = A_offd_i[i1]; jj1 < A_offd_i[i1 + 1]; jj1++) { i2 = A_offd_j[jj1]; if (P_marker_offd[i2] >= jj_begin_row_offd && (sgn * A_offd_data[jj1]) < 0) P_offd_data[P_marker_offd[i2]] += distribute * A_offd_data[jj1]; } } } else { diagonal += A_diag_data[jj]; } } /* neighbor i1 weakly influences i, accumulate a_(i,i1) into * diagonal */ else if (CF_marker[i1] != -3) { if (num_functions == 1 || dof_func[i] == dof_func[i1]) { diagonal += A_diag_data[jj]; } } } if (num_procs > 1) { for (jj = A_offd_i[i]; jj < A_offd_i[i + 1]; jj++) { i1 = A_offd_j[jj]; if (P_marker_offd[i1] >= jj_begin_row_offd) { P_offd_data[P_marker_offd[i1]] += A_offd_data[jj]; } else if (P_marker_offd[i1] == strong_f_marker) { sum = zero; sgn = 1; for (jj1 = A_ext_i[i1]; jj1 < A_ext_i[i1 + 1]; jj1++) { big_k1 = A_ext_j[jj1]; if (big_k1 >= col_1 && big_k1 < col_n) { /* diag */ loc_col = (HYPRE_Int)(big_k1 - col_1); if (P_marker[loc_col] >= jj_begin_row || loc_col == i) { sum += A_ext_data[jj1]; } } else { loc_col = (HYPRE_Int)(-big_k1 - 1); if (P_marker_offd[loc_col] >= jj_begin_row_offd) { sum += A_ext_data[jj1]; } } } if (sum != 0) { distribute = A_offd_data[jj] / sum; for (jj1 = A_ext_i[i1]; jj1 < A_ext_i[i1 + 1]; jj1++) { big_k1 = A_ext_j[jj1]; if (big_k1 >= col_1 && big_k1 < col_n) { /* diag */ loc_col = (HYPRE_Int)(big_k1 - col_1); if (P_marker[loc_col] >= jj_begin_row) P_diag_data[P_marker[loc_col]] += distribute * A_ext_data[jj1]; if (loc_col == i) { diagonal += distribute * A_ext_data[jj1]; } } else { loc_col = (HYPRE_Int)(-big_k1 - 1); if (P_marker_offd[loc_col] >= jj_begin_row_offd) P_offd_data[P_marker_offd[loc_col]] += distribute * A_ext_data[jj1]; } } } else { diagonal += A_offd_data[jj]; } } else if (CF_marker_offd[i1] != -3) { if (num_functions == 1 || dof_func[i] == dof_func_offd[i1]) { diagonal += A_offd_data[jj]; } } } } if (diagonal) { for (jj = jj_begin_row; jj < jj_end_row; jj++) { P_diag_data[jj] /= -diagonal; } for (jj = jj_begin_row_offd; jj < jj_end_row_offd; jj++) { P_offd_data[jj] /= -diagonal; } } } strong_f_marker--; } P = hypre_ParCSRMatrixCreate(comm, hypre_ParCSRMatrixGlobalNumRows(A), total_global_cpts, hypre_ParCSRMatrixColStarts(A), num_cpts_global, 0, P_diag_i[n_fine], P_offd_i[n_fine]); P_diag = hypre_ParCSRMatrixDiag(P); hypre_CSRMatrixData(P_diag) = P_diag_data; hypre_CSRMatrixI(P_diag) = P_diag_i; hypre_CSRMatrixJ(P_diag) = P_diag_j; P_offd = hypre_ParCSRMatrixOffd(P); hypre_CSRMatrixData(P_offd) = P_offd_data; hypre_CSRMatrixI(P_offd) = P_offd_i; hypre_CSRMatrixJ(P_offd) = P_offd_j; hypre_CSRMatrixMemoryLocation(P_diag) = memory_location_P; hypre_CSRMatrixMemoryLocation(P_offd) = memory_location_P; /* Compress P, removing coefficients smaller than trunc_factor * Max */ if (trunc_factor != 0.0 || max_elmts > 0) { hypre_BoomerAMGInterpTruncation(P, trunc_factor, max_elmts); P_diag_data = hypre_CSRMatrixData(P_diag); P_diag_i = hypre_CSRMatrixI(P_diag); P_diag_j = hypre_CSRMatrixJ(P_diag); P_offd_data = hypre_CSRMatrixData(P_offd); P_offd_i = hypre_CSRMatrixI(P_offd); P_offd_j = hypre_CSRMatrixJ(P_offd); P_diag_size = P_diag_i[n_fine]; P_offd_size = P_offd_i[n_fine]; } /* This builds col_map, col_map should be monotone increasing and contain * global numbers. */ if (P_offd_size) { hypre_build_interp_colmap(P, full_off_procNodes, tmp_CF_marker_offd, fine_to_coarse_offd); } hypre_MatvecCommPkgCreate(P); for (i = 0; i < n_fine; i++) if (CF_marker[i] == -3) { CF_marker[i] = -1; } *P_ptr = P; /* Deallocate memory */ hypre_TFree(fine_to_coarse, HYPRE_MEMORY_HOST); hypre_TFree(P_marker, HYPRE_MEMORY_HOST); /*hypre_TFree(clist);*/ if (num_procs > 1) { /*hypre_TFree(clist_offd);*/ hypre_CSRMatrixDestroy(Sop); hypre_CSRMatrixDestroy(A_ext); hypre_TFree(fine_to_coarse_offd, HYPRE_MEMORY_HOST); hypre_TFree(P_marker_offd, HYPRE_MEMORY_HOST); hypre_TFree(CF_marker_offd, HYPRE_MEMORY_HOST); hypre_TFree(tmp_CF_marker_offd, HYPRE_MEMORY_HOST); if (num_functions > 1) { hypre_TFree(dof_func_offd, HYPRE_MEMORY_HOST); } hypre_MatvecCommPkgDestroy(extend_comm_pkg); } return hypre_error_flag; } /*--------------------------------------------------------------------------- * hypre_BoomerAMGBuildFFInterp * Comment: Only use FF when there is no common c point. *--------------------------------------------------------------------------*/ HYPRE_Int hypre_BoomerAMGBuildFFInterp(hypre_ParCSRMatrix *A, HYPRE_Int *CF_marker, hypre_ParCSRMatrix *S, HYPRE_BigInt *num_cpts_global, HYPRE_Int num_functions, HYPRE_Int *dof_func, HYPRE_Int debug_flag, HYPRE_Real trunc_factor, HYPRE_Int max_elmts, hypre_ParCSRMatrix **P_ptr) { HYPRE_UNUSED_VAR(debug_flag); /* Communication Variables */ MPI_Comm comm = hypre_ParCSRMatrixComm(A); hypre_ParCSRCommPkg *comm_pkg = hypre_ParCSRMatrixCommPkg(A); HYPRE_Int my_id, num_procs; HYPRE_MemoryLocation memory_location_P = hypre_ParCSRMatrixMemoryLocation(A); /* Variables to store input variables */ hypre_CSRMatrix *A_diag = hypre_ParCSRMatrixDiag(A); HYPRE_Real *A_diag_data = hypre_CSRMatrixData(A_diag); HYPRE_Int *A_diag_i = hypre_CSRMatrixI(A_diag); HYPRE_Int *A_diag_j = hypre_CSRMatrixJ(A_diag); hypre_CSRMatrix *A_offd = hypre_ParCSRMatrixOffd(A); HYPRE_Real *A_offd_data = hypre_CSRMatrixData(A_offd); HYPRE_Int *A_offd_i = hypre_CSRMatrixI(A_offd); HYPRE_Int *A_offd_j = hypre_CSRMatrixJ(A_offd); /*HYPRE_Int num_cols_A_offd = hypre_CSRMatrixNumCols(A_offd); HYPRE_Int *col_map_offd = hypre_ParCSRMatrixColMapOffd(A);*/ HYPRE_Int n_fine = hypre_CSRMatrixNumRows(A_diag); HYPRE_BigInt col_1 = hypre_ParCSRMatrixFirstRowIndex(A); HYPRE_Int local_numrows = hypre_CSRMatrixNumRows(A_diag); HYPRE_BigInt col_n = col_1 + (HYPRE_BigInt)local_numrows; HYPRE_BigInt total_global_cpts, my_first_cpt; /* Variables to store strong connection matrix info */ hypre_CSRMatrix *S_diag = hypre_ParCSRMatrixDiag(S); HYPRE_Int *S_diag_i = hypre_CSRMatrixI(S_diag); HYPRE_Int *S_diag_j = hypre_CSRMatrixJ(S_diag); hypre_CSRMatrix *S_offd = hypre_ParCSRMatrixOffd(S); HYPRE_Int *S_offd_i = hypre_CSRMatrixI(S_offd); HYPRE_Int *S_offd_j = hypre_CSRMatrixJ(S_offd); /* Interpolation matrix P */ hypre_ParCSRMatrix *P; hypre_CSRMatrix *P_diag; hypre_CSRMatrix *P_offd; HYPRE_Real *P_diag_data = NULL; HYPRE_Int *P_diag_i, *P_diag_j = NULL; HYPRE_Real *P_offd_data = NULL; HYPRE_Int *P_offd_i, *P_offd_j = NULL; /*HYPRE_Int *col_map_offd_P = NULL;*/ HYPRE_Int P_diag_size; HYPRE_Int P_offd_size; HYPRE_Int *P_marker = NULL; HYPRE_Int *P_marker_offd = NULL; HYPRE_Int *CF_marker_offd = NULL; HYPRE_Int *tmp_CF_marker_offd = NULL; HYPRE_Int *dof_func_offd = NULL; /*HYPRE_Int ccounter_offd;*/ HYPRE_Int common_c; /* Full row information for columns of A that are off diag*/ hypre_CSRMatrix *A_ext = NULL; HYPRE_Real *A_ext_data = NULL; HYPRE_Int *A_ext_i = NULL; HYPRE_BigInt *A_ext_j = NULL; HYPRE_Int *fine_to_coarse = NULL; HYPRE_BigInt *fine_to_coarse_offd = NULL; HYPRE_Int loc_col; HYPRE_Int full_off_procNodes; hypre_CSRMatrix *Sop = NULL; HYPRE_Int *Sop_i = NULL; HYPRE_BigInt *Sop_j = NULL; /* Variables to keep count of interpolatory points */ HYPRE_Int jj_counter, jj_counter_offd; HYPRE_Int jj_begin_row, jj_end_row; HYPRE_Int jj_begin_row_offd = 0; HYPRE_Int jj_end_row_offd = 0; HYPRE_Int coarse_counter; /* Interpolation weight variables */ HYPRE_Real sum, diagonal, distribute; HYPRE_Int strong_f_marker = -2; HYPRE_Int sgn = 1; /* Loop variables */ /*HYPRE_Int index;*/ HYPRE_Int start_indexing = 0; HYPRE_Int i, i1, i2, jj, kk, k1, jj1; HYPRE_BigInt big_k1; /*HYPRE_Int ccounter; HYPRE_Int *clist, ccounter;*/ /* Definitions */ HYPRE_Real zero = 0.0; HYPRE_Real one = 1.0; hypre_ParCSRCommPkg *extend_comm_pkg = NULL; /* BEGIN */ hypre_MPI_Comm_size(comm, &num_procs); hypre_MPI_Comm_rank(comm, &my_id); my_first_cpt = num_cpts_global[0]; if (my_id == (num_procs - 1)) { total_global_cpts = num_cpts_global[1]; } hypre_MPI_Bcast(&total_global_cpts, 1, HYPRE_MPI_BIG_INT, num_procs - 1, comm); if (!comm_pkg) { hypre_MatvecCommPkgCreate(A); comm_pkg = hypre_ParCSRMatrixCommPkg(A); } /* Set up off processor information (specifically for neighbors of * neighbors */ full_off_procNodes = 0; if (num_procs > 1) { hypre_exchange_interp_data( &CF_marker_offd, &dof_func_offd, &A_ext, &full_off_procNodes, &Sop, &extend_comm_pkg, A, CF_marker, S, num_functions, dof_func, 1); { #ifdef HYPRE_PROFILE hypre_profile_times[HYPRE_TIMER_ID_EXTENDED_I_INTERP] += hypre_MPI_Wtime(); #endif } A_ext_i = hypre_CSRMatrixI(A_ext); A_ext_j = hypre_CSRMatrixBigJ(A_ext); A_ext_data = hypre_CSRMatrixData(A_ext); Sop_i = hypre_CSRMatrixI(Sop); Sop_j = hypre_CSRMatrixBigJ(Sop); } /*----------------------------------------------------------------------- * First Pass: Determine size of P and fill in fine_to_coarse mapping. *-----------------------------------------------------------------------*/ /*----------------------------------------------------------------------- * Intialize counters and allocate mapping vector. *-----------------------------------------------------------------------*/ P_diag_i = hypre_CTAlloc(HYPRE_Int, n_fine + 1, memory_location_P); P_offd_i = hypre_CTAlloc(HYPRE_Int, n_fine + 1, memory_location_P); if (n_fine) { fine_to_coarse = hypre_CTAlloc(HYPRE_Int, n_fine, HYPRE_MEMORY_HOST); P_marker = hypre_CTAlloc(HYPRE_Int, n_fine, HYPRE_MEMORY_HOST); } if (full_off_procNodes) { P_marker_offd = hypre_CTAlloc(HYPRE_Int, full_off_procNodes, HYPRE_MEMORY_HOST); fine_to_coarse_offd = hypre_CTAlloc(HYPRE_BigInt, full_off_procNodes, HYPRE_MEMORY_HOST); tmp_CF_marker_offd = hypre_CTAlloc(HYPRE_Int, full_off_procNodes, HYPRE_MEMORY_HOST); } hypre_initialize_vecs(n_fine, full_off_procNodes, fine_to_coarse, fine_to_coarse_offd, P_marker, P_marker_offd, tmp_CF_marker_offd); jj_counter = start_indexing; jj_counter_offd = start_indexing; coarse_counter = 0; /*----------------------------------------------------------------------- * Loop over fine grid. *-----------------------------------------------------------------------*/ for (i = 0; i < n_fine; i++) { P_diag_i[i] = jj_counter; if (num_procs > 1) { P_offd_i[i] = jj_counter_offd; } if (CF_marker[i] >= 0) { jj_counter++; fine_to_coarse[i] = coarse_counter; coarse_counter++; } /*-------------------------------------------------------------------- * If i is an F-point, interpolation is from the C-points that * strongly influence i, or C-points that stronly influence F-points * that strongly influence i. *--------------------------------------------------------------------*/ else { /* Initialize ccounter for each f point */ /*ccounter = 0; ccounter_offd = 0;*/ for (jj = S_diag_i[i]; jj < S_diag_i[i + 1]; jj++) { /* search through diag to find all c neighbors */ i1 = S_diag_j[jj]; if (CF_marker[i1] > 0) { /* i1 is a C point */ CF_marker[i1] = 2; if (P_marker[i1] < P_diag_i[i]) { P_marker[i1] = jj_counter; jj_counter++; } } } if (num_procs > 1) { for (jj = S_offd_i[i]; jj < S_offd_i[i + 1]; jj++) { /* search through offd to find all c neighbors */ i1 = S_offd_j[jj]; if (CF_marker_offd[i1] > 0) { /* i1 is a C point direct neighbor */ CF_marker_offd[i1] = 2; if (P_marker_offd[i1] < P_offd_i[i]) { tmp_CF_marker_offd[i1] = 1; P_marker_offd[i1] = jj_counter_offd; jj_counter_offd++; } } } } for (jj = S_diag_i[i]; jj < S_diag_i[i + 1]; jj++) { /* Search diag to find f neighbors and determine if common c point */ i1 = S_diag_j[jj]; if (CF_marker[i1] < 0) { /* i1 is a F point, loop through it's strong neighbors */ common_c = 0; for (kk = S_diag_i[i1]; kk < S_diag_i[i1 + 1]; kk++) { k1 = S_diag_j[kk]; if (CF_marker[k1] == 2) { common_c = 1; break; } } if (num_procs > 1 && common_c == 0) { /* no common c point yet, check offd */ for (kk = S_offd_i[i1]; kk < S_offd_i[i1 + 1]; kk++) { k1 = S_offd_j[kk]; if (CF_marker_offd[k1] == 2) { common_c = 1; break; } } } if (!common_c) { /* No common c point, extend the interp set */ for (kk = S_diag_i[i1]; kk < S_diag_i[i1 + 1]; kk++) { k1 = S_diag_j[kk]; if (CF_marker[k1] > 0) { if (P_marker[k1] < P_diag_i[i]) { P_marker[k1] = jj_counter; jj_counter++; } } } if (num_procs > 1) { for (kk = S_offd_i[i1]; kk < S_offd_i[i1 + 1]; kk++) { k1 = S_offd_j[kk]; if (CF_marker_offd[k1] > 0) { if (P_marker_offd[k1] < P_offd_i[i]) { tmp_CF_marker_offd[k1] = 1; P_marker_offd[k1] = jj_counter_offd; jj_counter_offd++; } } } } } } } /* Look at off diag strong connections of i */ if (num_procs > 1) { for (jj = S_offd_i[i]; jj < S_offd_i[i + 1]; jj++) { i1 = S_offd_j[jj]; if (CF_marker_offd[i1] < 0) { /* F point; look at neighbors of i1. Sop contains global col * numbers and entries that could be in S_diag or S_offd or * neither. */ common_c = 0; for (kk = Sop_i[i1]; kk < Sop_i[i1 + 1]; kk++) { /* Check if common c */ big_k1 = Sop_j[kk]; if (big_k1 >= col_1 && big_k1 < col_n) { /* In S_diag */ loc_col = (HYPRE_Int)(big_k1 - col_1); if (CF_marker[loc_col] == 2) { common_c = 1; break; } } else { loc_col = -(HYPRE_Int)big_k1 - 1; if (CF_marker_offd[loc_col] == 2) { common_c = 1; break; } } } if (!common_c) { for (kk = Sop_i[i1]; kk < Sop_i[i1 + 1]; kk++) { /* Check if common c */ big_k1 = Sop_j[kk]; if (big_k1 >= col_1 && big_k1 < col_n) { /* In S_diag */ loc_col = (HYPRE_Int)(big_k1 - col_1); if (P_marker[loc_col] < P_diag_i[i]) { P_marker[loc_col] = jj_counter; jj_counter++; } } else { loc_col = -(HYPRE_Int)big_k1 - 1; if (P_marker_offd[loc_col] < P_offd_i[i]) { P_marker_offd[loc_col] = jj_counter_offd; tmp_CF_marker_offd[loc_col] = 1; jj_counter_offd++; } } } } } } } for (jj = S_diag_i[i]; jj < S_diag_i[i + 1]; jj++) { /* search through diag to find all c neighbors */ i1 = S_diag_j[jj]; if (CF_marker[i1] == 2) { CF_marker[i1] = 1; } } if (num_procs > 1) { for (jj = S_offd_i[i]; jj < S_offd_i[i + 1]; jj++) { /* search through offd to find all c neighbors */ i1 = S_offd_j[jj]; if (CF_marker_offd[i1] == 2) { /* i1 is a C point direct neighbor */ CF_marker_offd[i1] = 1; } } } } } /*----------------------------------------------------------------------- * Allocate arrays. *-----------------------------------------------------------------------*/ P_diag_size = jj_counter; P_offd_size = jj_counter_offd; if (P_diag_size) { P_diag_j = hypre_CTAlloc(HYPRE_Int, P_diag_size, memory_location_P); P_diag_data = hypre_CTAlloc(HYPRE_Real, P_diag_size, memory_location_P); } if (P_offd_size) { P_offd_j = hypre_CTAlloc(HYPRE_Int, P_offd_size, memory_location_P); P_offd_data = hypre_CTAlloc(HYPRE_Real, P_offd_size, memory_location_P); } P_diag_i[n_fine] = jj_counter; P_offd_i[n_fine] = jj_counter_offd; jj_counter = start_indexing; jj_counter_offd = start_indexing; /*ccounter = start_indexing; ccounter_offd = start_indexing;*/ /* Fine to coarse mapping */ if (num_procs > 1) { hypre_big_insert_new_nodes(comm_pkg, extend_comm_pkg, fine_to_coarse, full_off_procNodes, my_first_cpt, fine_to_coarse_offd); } for (i = 0; i < n_fine; i++) { P_marker[i] = -1; } for (i = 0; i < full_off_procNodes; i++) { P_marker_offd[i] = -1; } /*----------------------------------------------------------------------- * Loop over fine grid points. *-----------------------------------------------------------------------*/ jj_begin_row_offd = 0; for (i = 0; i < n_fine; i++) { jj_begin_row = jj_counter; if (num_procs > 1) { jj_begin_row_offd = jj_counter_offd; } /*-------------------------------------------------------------------- * If i is a c-point, interpolation is the identity. *--------------------------------------------------------------------*/ if (CF_marker[i] >= 0) { P_diag_j[jj_counter] = fine_to_coarse[i]; P_diag_data[jj_counter] = one; jj_counter++; } /*-------------------------------------------------------------------- * If i is an F-point, build interpolation. *--------------------------------------------------------------------*/ else if (CF_marker[i] != -3) { /*ccounter = 0; ccounter_offd = 0;*/ strong_f_marker--; for (jj = S_diag_i[i]; jj < S_diag_i[i + 1]; jj++) { /* Search C points only */ i1 = S_diag_j[jj]; /*-------------------------------------------------------------- * If neighbor i1 is a C-point, set column number in P_diag_j * and initialize interpolation weight to zero. *--------------------------------------------------------------*/ if (CF_marker[i1] > 0) { CF_marker[i1] = 2; if (P_marker[i1] < jj_begin_row) { P_marker[i1] = jj_counter; P_diag_j[jj_counter] = fine_to_coarse[i1]; P_diag_data[jj_counter] = zero; jj_counter++; } } } if ( num_procs > 1) { for (jj = S_offd_i[i]; jj < S_offd_i[i + 1]; jj++) { i1 = S_offd_j[jj]; if ( CF_marker_offd[i1] > 0) { CF_marker_offd[i1] = 2; if (P_marker_offd[i1] < jj_begin_row_offd) { P_marker_offd[i1] = jj_counter_offd; P_offd_j[jj_counter_offd] = i1; P_offd_data[jj_counter_offd] = zero; jj_counter_offd++; } } } } for (jj = S_diag_i[i]; jj < S_diag_i[i + 1]; jj++) { /* Search through F points */ i1 = S_diag_j[jj]; if (CF_marker[i1] == -1) { P_marker[i1] = strong_f_marker; common_c = 0; for (kk = S_diag_i[i1]; kk < S_diag_i[i1 + 1]; kk++) { k1 = S_diag_j[kk]; if (CF_marker[k1] == 2) { common_c = 1; break; } } if (num_procs > 1 && common_c == 0) { /* no common c point yet, check offd */ for (kk = S_offd_i[i1]; kk < S_offd_i[i1 + 1]; kk++) { k1 = S_offd_j[kk]; if (CF_marker_offd[k1] == 2) { common_c = 1; break; } } } if (!common_c) { /* No common c point, extend the interp set */ for (kk = S_diag_i[i1]; kk < S_diag_i[i1 + 1]; kk++) { k1 = S_diag_j[kk]; if (CF_marker[k1] >= 0) { if (P_marker[k1] < jj_begin_row) { P_marker[k1] = jj_counter; P_diag_j[jj_counter] = fine_to_coarse[k1]; P_diag_data[jj_counter] = zero; jj_counter++; } } } if (num_procs > 1) { for (kk = S_offd_i[i1]; kk < S_offd_i[i1 + 1]; kk++) { k1 = S_offd_j[kk]; if (CF_marker_offd[k1] >= 0) { if (P_marker_offd[k1] < jj_begin_row_offd) { P_marker_offd[k1] = jj_counter_offd; P_offd_j[jj_counter_offd] = k1; P_offd_data[jj_counter_offd] = zero; jj_counter_offd++; } } } } } } } if ( num_procs > 1) { for (jj = S_offd_i[i]; jj < S_offd_i[i + 1]; jj++) { i1 = S_offd_j[jj]; if (CF_marker_offd[i1] == -1) { /* F points that are off proc */ P_marker_offd[i1] = strong_f_marker; common_c = 0; for (kk = Sop_i[i1]; kk < Sop_i[i1 + 1]; kk++) { /* Check if common c */ big_k1 = Sop_j[kk]; if (big_k1 >= col_1 && big_k1 < col_n) { /* In S_diag */ loc_col = (HYPRE_Int)(big_k1 - col_1); if (CF_marker[loc_col] == 2) { common_c = 1; break; } } else { loc_col = -(HYPRE_Int)big_k1 - 1; if (CF_marker_offd[loc_col] == 2) { common_c = 1; break; } } } if (!common_c) { for (kk = Sop_i[i1]; kk < Sop_i[i1 + 1]; kk++) { big_k1 = Sop_j[kk]; /* Find local col number */ if (big_k1 >= col_1 && big_k1 < col_n) { loc_col = (HYPRE_Int)(big_k1 - col_1); if (P_marker[loc_col] < jj_begin_row) { P_marker[loc_col] = jj_counter; P_diag_j[jj_counter] = fine_to_coarse[loc_col]; P_diag_data[jj_counter] = zero; jj_counter++; } } else { loc_col = -(HYPRE_Int)big_k1 - 1; if (P_marker_offd[loc_col] < jj_begin_row_offd) { P_marker_offd[loc_col] = jj_counter_offd; P_offd_j[jj_counter_offd] = loc_col; P_offd_data[jj_counter_offd] = zero; jj_counter_offd++; } } } } } } } for (jj = S_diag_i[i]; jj < S_diag_i[i + 1]; jj++) { /* Search C points only */ i1 = S_diag_j[jj]; /*-------------------------------------------------------------- * If neighbor i1 is a C-point, set column number in P_diag_j * and initialize interpolation weight to zero. *--------------------------------------------------------------*/ if (CF_marker[i1] == 2) { CF_marker[i1] = 1; } } if ( num_procs > 1) { for (jj = S_offd_i[i]; jj < S_offd_i[i + 1]; jj++) { i1 = S_offd_j[jj]; if ( CF_marker_offd[i1] == 2) { CF_marker_offd[i1] = 1; } } } jj_end_row = jj_counter; jj_end_row_offd = jj_counter_offd; diagonal = A_diag_data[A_diag_i[i]]; for (jj = A_diag_i[i] + 1; jj < A_diag_i[i + 1]; jj++) { /* i1 is a c-point and strongly influences i, accumulate * a_(i,i1) into interpolation weight */ i1 = A_diag_j[jj]; if (P_marker[i1] >= jj_begin_row) { P_diag_data[P_marker[i1]] += A_diag_data[jj]; } else if (P_marker[i1] == strong_f_marker) { sum = zero; if (A_diag_data[A_diag_i[i1]] < 0) { sgn = -1; } /* Loop over row of A for point i1 and calculate the sum * of the connections to c-points that strongly incluence i. */ for (jj1 = A_diag_i[i1]; jj1 < A_diag_i[i1 + 1]; jj1++) { i2 = A_diag_j[jj1]; if (P_marker[i2] >= jj_begin_row && (sgn * A_diag_data[jj1]) < 0) { sum += A_diag_data[jj1]; } } if (num_procs > 1) { for (jj1 = A_offd_i[i1]; jj1 < A_offd_i[i1 + 1]; jj1++) { i2 = A_offd_j[jj1]; if (P_marker_offd[i2] >= jj_begin_row_offd && (sgn * A_offd_data[jj1]) < 0) { sum += A_offd_data[jj1]; } } } if (sum != 0) { distribute = A_diag_data[jj] / sum; /* Loop over row of A for point i1 and do the distribution */ for (jj1 = A_diag_i[i1]; jj1 < A_diag_i[i1 + 1]; jj1++) { i2 = A_diag_j[jj1]; if (P_marker[i2] >= jj_begin_row && (sgn * A_diag_data[jj1]) < 0) P_diag_data[P_marker[i2]] += distribute * A_diag_data[jj1]; } if (num_procs > 1) { for (jj1 = A_offd_i[i1]; jj1 < A_offd_i[i1 + 1]; jj1++) { i2 = A_offd_j[jj1]; if (P_marker_offd[i2] >= jj_begin_row_offd && (sgn * A_offd_data[jj1]) < 0) P_offd_data[P_marker_offd[i2]] += distribute * A_offd_data[jj1]; } } } else { diagonal += A_diag_data[jj]; } } /* neighbor i1 weakly influences i, accumulate a_(i,i1) into * diagonal */ else if (CF_marker[i1] != -3) { if (num_functions == 1 || dof_func[i] == dof_func[i1]) { diagonal += A_diag_data[jj]; } } } if (num_procs > 1) { for (jj = A_offd_i[i]; jj < A_offd_i[i + 1]; jj++) { i1 = A_offd_j[jj]; if (P_marker_offd[i1] >= jj_begin_row_offd) { P_offd_data[P_marker_offd[i1]] += A_offd_data[jj]; } else if (P_marker_offd[i1] == strong_f_marker) { sum = zero; for (jj1 = A_ext_i[i1]; jj1 < A_ext_i[i1 + 1]; jj1++) { big_k1 = A_ext_j[jj1]; if (big_k1 >= col_1 && big_k1 < col_n) { /* diag */ loc_col = (HYPRE_Int)(big_k1 - col_1); if (P_marker[loc_col] >= jj_begin_row) { sum += A_ext_data[jj1]; } } else { loc_col = -(HYPRE_Int)big_k1 - 1; if (P_marker_offd[loc_col] >= jj_begin_row_offd) { sum += A_ext_data[jj1]; } } } if (sum != 0) { distribute = A_offd_data[jj] / sum; for (jj1 = A_ext_i[i1]; jj1 < A_ext_i[i1 + 1]; jj1++) { big_k1 = A_ext_j[jj1]; if (big_k1 >= col_1 && big_k1 < col_n) { /* diag */ loc_col = (HYPRE_Int)(big_k1 - col_1); if (P_marker[loc_col] >= jj_begin_row) P_diag_data[P_marker[loc_col]] += distribute * A_ext_data[jj1]; } else { loc_col = -(HYPRE_Int)big_k1 - 1; if (P_marker_offd[loc_col] >= jj_begin_row_offd) P_offd_data[P_marker_offd[loc_col]] += distribute * A_ext_data[jj1]; } } } else { diagonal += A_offd_data[jj]; } } else if (CF_marker_offd[i1] != -3) { if (num_functions == 1 || dof_func[i] == dof_func_offd[i1]) { diagonal += A_offd_data[jj]; } } } } if (diagonal) { for (jj = jj_begin_row; jj < jj_end_row; jj++) { P_diag_data[jj] /= -diagonal; } for (jj = jj_begin_row_offd; jj < jj_end_row_offd; jj++) { P_offd_data[jj] /= -diagonal; } } } strong_f_marker--; } P = hypre_ParCSRMatrixCreate(comm, hypre_ParCSRMatrixGlobalNumRows(A), total_global_cpts, hypre_ParCSRMatrixColStarts(A), num_cpts_global, 0, P_diag_i[n_fine], P_offd_i[n_fine]); P_diag = hypre_ParCSRMatrixDiag(P); hypre_CSRMatrixData(P_diag) = P_diag_data; hypre_CSRMatrixI(P_diag) = P_diag_i; hypre_CSRMatrixJ(P_diag) = P_diag_j; P_offd = hypre_ParCSRMatrixOffd(P); hypre_CSRMatrixData(P_offd) = P_offd_data; hypre_CSRMatrixI(P_offd) = P_offd_i; hypre_CSRMatrixJ(P_offd) = P_offd_j; hypre_CSRMatrixMemoryLocation(P_diag) = memory_location_P; hypre_CSRMatrixMemoryLocation(P_offd) = memory_location_P; /* Compress P, removing coefficients smaller than trunc_factor * Max */ if (trunc_factor != 0.0 || max_elmts > 0) { hypre_BoomerAMGInterpTruncation(P, trunc_factor, max_elmts); P_diag_data = hypre_CSRMatrixData(P_diag); P_diag_i = hypre_CSRMatrixI(P_diag); P_diag_j = hypre_CSRMatrixJ(P_diag); P_offd_data = hypre_CSRMatrixData(P_offd); P_offd_i = hypre_CSRMatrixI(P_offd); P_offd_j = hypre_CSRMatrixJ(P_offd); P_diag_size = P_diag_i[n_fine]; P_offd_size = P_offd_i[n_fine]; } /* This builds col_map, col_map should be monotone increasing and contain * global numbers. */ if (P_offd_size) { hypre_build_interp_colmap(P, full_off_procNodes, tmp_CF_marker_offd, fine_to_coarse_offd); } hypre_MatvecCommPkgCreate(P); for (i = 0; i < n_fine; i++) if (CF_marker[i] == -3) { CF_marker[i] = -1; } *P_ptr = P; /* Deallocate memory */ hypre_TFree(fine_to_coarse, HYPRE_MEMORY_HOST); hypre_TFree(P_marker, HYPRE_MEMORY_HOST); if (num_procs > 1) { hypre_CSRMatrixDestroy(Sop); hypre_CSRMatrixDestroy(A_ext); hypre_TFree(fine_to_coarse_offd, HYPRE_MEMORY_HOST); hypre_TFree(P_marker_offd, HYPRE_MEMORY_HOST); hypre_TFree(CF_marker_offd, HYPRE_MEMORY_HOST); hypre_TFree(tmp_CF_marker_offd, HYPRE_MEMORY_HOST); if (num_functions > 1) { hypre_TFree(dof_func_offd, HYPRE_MEMORY_HOST); } hypre_MatvecCommPkgDestroy(extend_comm_pkg); } return hypre_error_flag; } /*--------------------------------------------------------------------------- * hypre_BoomerAMGBuildFF1Interp * Comment: Only use FF when there is no common c point. *--------------------------------------------------------------------------*/ HYPRE_Int hypre_BoomerAMGBuildFF1Interp(hypre_ParCSRMatrix *A, HYPRE_Int *CF_marker, hypre_ParCSRMatrix *S, HYPRE_BigInt *num_cpts_global, HYPRE_Int num_functions, HYPRE_Int *dof_func, HYPRE_Int debug_flag, HYPRE_Real trunc_factor, HYPRE_Int max_elmts, hypre_ParCSRMatrix **P_ptr) { HYPRE_UNUSED_VAR(debug_flag); /* Communication Variables */ MPI_Comm comm = hypre_ParCSRMatrixComm(A); hypre_ParCSRCommPkg *comm_pkg = hypre_ParCSRMatrixCommPkg(A); HYPRE_Int my_id, num_procs; HYPRE_MemoryLocation memory_location_P = hypre_ParCSRMatrixMemoryLocation(A); /* Variables to store input variables */ hypre_CSRMatrix *A_diag = hypre_ParCSRMatrixDiag(A); HYPRE_Real *A_diag_data = hypre_CSRMatrixData(A_diag); HYPRE_Int *A_diag_i = hypre_CSRMatrixI(A_diag); HYPRE_Int *A_diag_j = hypre_CSRMatrixJ(A_diag); hypre_CSRMatrix *A_offd = hypre_ParCSRMatrixOffd(A); HYPRE_Real *A_offd_data = hypre_CSRMatrixData(A_offd); HYPRE_Int *A_offd_i = hypre_CSRMatrixI(A_offd); HYPRE_Int *A_offd_j = hypre_CSRMatrixJ(A_offd); /*HYPRE_Int num_cols_A_offd = hypre_CSRMatrixNumCols(A_offd); HYPRE_Int *col_map_offd = hypre_ParCSRMatrixColMapOffd(A);*/ HYPRE_Int n_fine = hypre_CSRMatrixNumRows(A_diag); HYPRE_BigInt col_1 = hypre_ParCSRMatrixFirstRowIndex(A); HYPRE_Int local_numrows = hypre_CSRMatrixNumRows(A_diag); HYPRE_BigInt col_n = col_1 + (HYPRE_BigInt)local_numrows; HYPRE_BigInt total_global_cpts, my_first_cpt; /* Variables to store strong connection matrix info */ hypre_CSRMatrix *S_diag = hypre_ParCSRMatrixDiag(S); HYPRE_Int *S_diag_i = hypre_CSRMatrixI(S_diag); HYPRE_Int *S_diag_j = hypre_CSRMatrixJ(S_diag); hypre_CSRMatrix *S_offd = hypre_ParCSRMatrixOffd(S); HYPRE_Int *S_offd_i = hypre_CSRMatrixI(S_offd); HYPRE_Int *S_offd_j = hypre_CSRMatrixJ(S_offd); /* Interpolation matrix P */ hypre_ParCSRMatrix *P; hypre_CSRMatrix *P_diag; hypre_CSRMatrix *P_offd; HYPRE_Real *P_diag_data = NULL; HYPRE_Int *P_diag_i, *P_diag_j = NULL; HYPRE_Real *P_offd_data = NULL; HYPRE_Int *P_offd_i, *P_offd_j = NULL; /*HYPRE_Int *col_map_offd_P = NULL;*/ HYPRE_Int P_diag_size; HYPRE_Int P_offd_size; HYPRE_Int *P_marker = NULL; HYPRE_Int *P_marker_offd = NULL; HYPRE_Int *CF_marker_offd = NULL; HYPRE_Int *tmp_CF_marker_offd = NULL; HYPRE_Int *dof_func_offd = NULL; /*HYPRE_Int ccounter_offd;*/ HYPRE_Int common_c; /* Full row information for columns of A that are off diag*/ hypre_CSRMatrix *A_ext = NULL; HYPRE_Real *A_ext_data = NULL; HYPRE_Int *A_ext_i = NULL; HYPRE_BigInt *A_ext_j = NULL; HYPRE_Int *fine_to_coarse = NULL; HYPRE_BigInt *fine_to_coarse_offd = NULL; HYPRE_Int loc_col; HYPRE_Int full_off_procNodes; hypre_CSRMatrix *Sop = NULL; HYPRE_Int *Sop_i = NULL; HYPRE_BigInt *Sop_j = NULL; /* Variables to keep count of interpolatory points */ HYPRE_Int jj_counter, jj_counter_offd; HYPRE_Int jj_begin_row, jj_end_row; HYPRE_Int jj_begin_row_offd = 0; HYPRE_Int jj_end_row_offd = 0; HYPRE_Int coarse_counter; /* Interpolation weight variables */ HYPRE_Real sum, diagonal, distribute; HYPRE_Int strong_f_marker = -2; HYPRE_Int sgn = 1; /* Loop variables */ /*HYPRE_Int index;*/ HYPRE_Int start_indexing = 0; HYPRE_Int i, i1, i2, jj, kk, k1, jj1; HYPRE_BigInt big_k1; /*HYPRE_Int ccounter;*/ HYPRE_Int found_c = 0; /* Definitions */ HYPRE_Real zero = 0.0; HYPRE_Real one = 1.0; hypre_ParCSRCommPkg *extend_comm_pkg = NULL; /* BEGIN */ hypre_MPI_Comm_size(comm, &num_procs); hypre_MPI_Comm_rank(comm, &my_id); my_first_cpt = num_cpts_global[0]; if (my_id == (num_procs - 1)) { total_global_cpts = num_cpts_global[1]; } hypre_MPI_Bcast(&total_global_cpts, 1, HYPRE_MPI_BIG_INT, num_procs - 1, comm); if (!comm_pkg) { hypre_MatvecCommPkgCreate(A); comm_pkg = hypre_ParCSRMatrixCommPkg(A); } /* Set up off processor information (specifically for neighbors of * neighbors */ full_off_procNodes = 0; if (num_procs > 1) { hypre_exchange_interp_data( &CF_marker_offd, &dof_func_offd, &A_ext, &full_off_procNodes, &Sop, &extend_comm_pkg, A, CF_marker, S, num_functions, dof_func, 1); { #ifdef HYPRE_PROFILE hypre_profile_times[HYPRE_TIMER_ID_EXTENDED_I_INTERP] += hypre_MPI_Wtime(); #endif } A_ext_i = hypre_CSRMatrixI(A_ext); A_ext_j = hypre_CSRMatrixBigJ(A_ext); A_ext_data = hypre_CSRMatrixData(A_ext); Sop_i = hypre_CSRMatrixI(Sop); Sop_j = hypre_CSRMatrixBigJ(Sop); } /*----------------------------------------------------------------------- * First Pass: Determine size of P and fill in fine_to_coarse mapping. *-----------------------------------------------------------------------*/ /*----------------------------------------------------------------------- * Intialize counters and allocate mapping vector. *-----------------------------------------------------------------------*/ P_diag_i = hypre_CTAlloc(HYPRE_Int, n_fine + 1, memory_location_P); P_offd_i = hypre_CTAlloc(HYPRE_Int, n_fine + 1, memory_location_P); if (n_fine) { fine_to_coarse = hypre_CTAlloc(HYPRE_Int, n_fine, HYPRE_MEMORY_HOST); P_marker = hypre_CTAlloc(HYPRE_Int, n_fine, HYPRE_MEMORY_HOST); } if (full_off_procNodes) { P_marker_offd = hypre_CTAlloc(HYPRE_Int, full_off_procNodes, HYPRE_MEMORY_HOST); fine_to_coarse_offd = hypre_CTAlloc(HYPRE_BigInt, full_off_procNodes, HYPRE_MEMORY_HOST); tmp_CF_marker_offd = hypre_CTAlloc(HYPRE_Int, full_off_procNodes, HYPRE_MEMORY_HOST); } hypre_initialize_vecs(n_fine, full_off_procNodes, fine_to_coarse, fine_to_coarse_offd, P_marker, P_marker_offd, tmp_CF_marker_offd); jj_counter = start_indexing; jj_counter_offd = start_indexing; coarse_counter = 0; /*----------------------------------------------------------------------- * Loop over fine grid. *-----------------------------------------------------------------------*/ for (i = 0; i < n_fine; i++) { P_diag_i[i] = jj_counter; if (num_procs > 1) { P_offd_i[i] = jj_counter_offd; } if (CF_marker[i] >= 0) { jj_counter++; fine_to_coarse[i] = coarse_counter; coarse_counter++; } /*-------------------------------------------------------------------- * If i is an F-point, interpolation is from the C-points that * strongly influence i, or C-points that stronly influence F-points * that strongly influence i. *--------------------------------------------------------------------*/ else { /* Initialize ccounter for each f point */ /*ccounter = 0; ccounter_offd = 0;*/ for (jj = S_diag_i[i]; jj < S_diag_i[i + 1]; jj++) { /* search through diag to find all c neighbors */ i1 = S_diag_j[jj]; if (CF_marker[i1] > 0) { /* i1 is a C point */ CF_marker[i1] = 2; if (P_marker[i1] < P_diag_i[i]) { P_marker[i1] = jj_counter; jj_counter++; } } } if (num_procs > 1) { for (jj = S_offd_i[i]; jj < S_offd_i[i + 1]; jj++) { /* search through offd to find all c neighbors */ i1 = S_offd_j[jj]; if (CF_marker_offd[i1] > 0) { /* i1 is a C point direct neighbor */ CF_marker_offd[i1] = 2; if (P_marker_offd[i1] < P_offd_i[i]) { tmp_CF_marker_offd[i1] = 1; P_marker_offd[i1] = jj_counter_offd; jj_counter_offd++; } } } } for (jj = S_diag_i[i]; jj < S_diag_i[i + 1]; jj++) { /* Search diag to find f neighbors and determine if common c point */ i1 = S_diag_j[jj]; if (CF_marker[i1] < 0) { /* i1 is a F point, loop through it's strong neighbors */ common_c = 0; for (kk = S_diag_i[i1]; kk < S_diag_i[i1 + 1]; kk++) { k1 = S_diag_j[kk]; if (CF_marker[k1] == 2) { common_c = 1; break; } } if (num_procs > 1 && common_c == 0) { /* no common c point yet, check offd */ for (kk = S_offd_i[i1]; kk < S_offd_i[i1 + 1]; kk++) { k1 = S_offd_j[kk]; if (CF_marker_offd[k1] == 2) { /* k1 is a c point check if it is common */ common_c = 1; break; } } } if (!common_c) { /* No common c point, extend the interp set */ found_c = 0; for (kk = S_diag_i[i1]; kk < S_diag_i[i1 + 1]; kk++) { k1 = S_diag_j[kk]; if (CF_marker[k1] > 0) { if (P_marker[k1] < P_diag_i[i]) { P_marker[k1] = jj_counter; jj_counter++; found_c = 1; break; } } } if (num_procs > 1 && !found_c) { for (kk = S_offd_i[i1]; kk < S_offd_i[i1 + 1]; kk++) { k1 = S_offd_j[kk]; if (CF_marker_offd[k1] > 0) { if (P_marker_offd[k1] < P_offd_i[i]) { tmp_CF_marker_offd[k1] = 1; P_marker_offd[k1] = jj_counter_offd; jj_counter_offd++; break; } } } } } } } /* Look at off diag strong connections of i */ if (num_procs > 1) { for (jj = S_offd_i[i]; jj < S_offd_i[i + 1]; jj++) { i1 = S_offd_j[jj]; if (CF_marker_offd[i1] < 0) { /* F point; look at neighbors of i1. Sop contains global col * numbers and entries that could be in S_diag or S_offd or * neither. */ common_c = 0; for (kk = Sop_i[i1]; kk < Sop_i[i1 + 1]; kk++) { /* Check if common c */ big_k1 = Sop_j[kk]; if (big_k1 >= col_1 && big_k1 < col_n) { /* In S_diag */ loc_col = (HYPRE_Int)(big_k1 - col_1); if (CF_marker[loc_col] == 2) { common_c = 1; break; } } else { loc_col = -(HYPRE_Int)big_k1 - 1; if (CF_marker_offd[loc_col] == 2) { common_c = 1; break; } } } if (!common_c) { for (kk = Sop_i[i1]; kk < Sop_i[i1 + 1]; kk++) { /* Check if common c */ big_k1 = Sop_j[kk]; if (big_k1 >= col_1 && big_k1 < col_n) { /* In S_diag */ loc_col = (HYPRE_Int)(big_k1 - col_1); if (P_marker[loc_col] < P_diag_i[i]) { P_marker[loc_col] = jj_counter; jj_counter++; break; } } else { loc_col = -(HYPRE_Int)big_k1 - 1; if (P_marker_offd[loc_col] < P_offd_i[i]) { P_marker_offd[loc_col] = jj_counter_offd; tmp_CF_marker_offd[loc_col] = 1; jj_counter_offd++; break; } } } } } } } for (jj = S_diag_i[i]; jj < S_diag_i[i + 1]; jj++) { /* search through diag to find all c neighbors */ i1 = S_diag_j[jj]; if (CF_marker[i1] == 2) { CF_marker[i1] = 1; } } if (num_procs > 1) { for (jj = S_offd_i[i]; jj < S_offd_i[i + 1]; jj++) { /* search through offd to find all c neighbors */ i1 = S_offd_j[jj]; if (CF_marker_offd[i1] == 2) { /* i1 is a C point direct neighbor */ CF_marker_offd[i1] = 1; } } } } } /*----------------------------------------------------------------------- * Allocate arrays. *-----------------------------------------------------------------------*/ P_diag_size = jj_counter; P_offd_size = jj_counter_offd; if (P_diag_size) { P_diag_j = hypre_CTAlloc(HYPRE_Int, P_diag_size, memory_location_P); P_diag_data = hypre_CTAlloc(HYPRE_Real, P_diag_size, memory_location_P); } if (P_offd_size) { P_offd_j = hypre_CTAlloc(HYPRE_Int, P_offd_size, memory_location_P); P_offd_data = hypre_CTAlloc(HYPRE_Real, P_offd_size, memory_location_P); } P_diag_i[n_fine] = jj_counter; P_offd_i[n_fine] = jj_counter_offd; jj_counter = start_indexing; jj_counter_offd = start_indexing; /*ccounter = start_indexing; ccounter_offd = start_indexing;*/ /* Fine to coarse mapping */ if (num_procs > 1) { hypre_big_insert_new_nodes(comm_pkg, extend_comm_pkg, fine_to_coarse, full_off_procNodes, my_first_cpt, fine_to_coarse_offd); } for (i = 0; i < n_fine; i++) { P_marker[i] = -1; } for (i = 0; i < full_off_procNodes; i++) { P_marker_offd[i] = -1; } /*----------------------------------------------------------------------- * Loop over fine grid points. *-----------------------------------------------------------------------*/ jj_begin_row_offd = 0; for (i = 0; i < n_fine; i++) { jj_begin_row = jj_counter; if (num_procs > 1) { jj_begin_row_offd = jj_counter_offd; } /*-------------------------------------------------------------------- * If i is a c-point, interpolation is the identity. *--------------------------------------------------------------------*/ if (CF_marker[i] >= 0) { P_diag_j[jj_counter] = fine_to_coarse[i]; P_diag_data[jj_counter] = one; jj_counter++; } /*-------------------------------------------------------------------- * If i is an F-point, build interpolation. *--------------------------------------------------------------------*/ else if (CF_marker[i] != -3) { /*ccounter = 0; ccounter_offd = 0;*/ strong_f_marker--; for (jj = S_diag_i[i]; jj < S_diag_i[i + 1]; jj++) { /* Search C points only */ i1 = S_diag_j[jj]; /*-------------------------------------------------------------- * If neighbor i1 is a C-point, set column number in P_diag_j * and initialize interpolation weight to zero. *--------------------------------------------------------------*/ if (CF_marker[i1] > 0) { CF_marker[i1] = 2; if (P_marker[i1] < jj_begin_row) { P_marker[i1] = jj_counter; P_diag_j[jj_counter] = fine_to_coarse[i1]; P_diag_data[jj_counter] = zero; jj_counter++; } } } if ( num_procs > 1) { for (jj = S_offd_i[i]; jj < S_offd_i[i + 1]; jj++) { i1 = S_offd_j[jj]; if ( CF_marker_offd[i1] > 0) { CF_marker_offd[i1] = 2; if (P_marker_offd[i1] < jj_begin_row_offd) { P_marker_offd[i1] = jj_counter_offd; P_offd_j[jj_counter_offd] = i1; P_offd_data[jj_counter_offd] = zero; jj_counter_offd++; } } } } for (jj = S_diag_i[i]; jj < S_diag_i[i + 1]; jj++) { /* Search through F points */ i1 = S_diag_j[jj]; if (CF_marker[i1] == -1) { P_marker[i1] = strong_f_marker; common_c = 0; for (kk = S_diag_i[i1]; kk < S_diag_i[i1 + 1]; kk++) { k1 = S_diag_j[kk]; if (CF_marker[k1] == 2) { common_c = 1; break; } } if (num_procs > 1 && common_c == 0) { /* no common c point yet, check offd */ for (kk = S_offd_i[i1]; kk < S_offd_i[i1 + 1]; kk++) { k1 = S_offd_j[kk]; if (CF_marker_offd[k1] == 2) { /* k1 is a c point check if it is common */ common_c = 1; break; } } } if (!common_c) { /* No common c point, extend the interp set */ found_c = 0; for (kk = S_diag_i[i1]; kk < S_diag_i[i1 + 1]; kk++) { k1 = S_diag_j[kk]; if (CF_marker[k1] >= 0) { if (P_marker[k1] < jj_begin_row) { P_marker[k1] = jj_counter; P_diag_j[jj_counter] = fine_to_coarse[k1]; P_diag_data[jj_counter] = zero; jj_counter++; found_c = 1; break; } } } if (num_procs > 1 && !found_c) { for (kk = S_offd_i[i1]; kk < S_offd_i[i1 + 1]; kk++) { k1 = S_offd_j[kk]; if (CF_marker_offd[k1] >= 0) { if (P_marker_offd[k1] < jj_begin_row_offd) { P_marker_offd[k1] = jj_counter_offd; P_offd_j[jj_counter_offd] = k1; P_offd_data[jj_counter_offd] = zero; jj_counter_offd++; break; } } } } } } } if ( num_procs > 1) { for (jj = S_offd_i[i]; jj < S_offd_i[i + 1]; jj++) { i1 = S_offd_j[jj]; if (CF_marker_offd[i1] == -1) { /* F points that are off proc */ P_marker_offd[i1] = strong_f_marker; common_c = 0; for (kk = Sop_i[i1]; kk < Sop_i[i1 + 1]; kk++) { /* Check if common c */ big_k1 = Sop_j[kk]; if (big_k1 >= col_1 && big_k1 < col_n) { /* In S_diag */ loc_col = (HYPRE_Int)(big_k1 - col_1); if (CF_marker[loc_col] == 2) { common_c = 1; break; } } else { loc_col = -(HYPRE_Int)big_k1 - 1; if (CF_marker_offd[loc_col] == 2) { common_c = 1; break; } } } if (!common_c) { for (kk = Sop_i[i1]; kk < Sop_i[i1 + 1]; kk++) { big_k1 = Sop_j[kk]; /* Find local col number */ if (big_k1 >= col_1 && big_k1 < col_n) { loc_col = (HYPRE_Int)(big_k1 - col_1); if (P_marker[loc_col] < jj_begin_row) { P_marker[loc_col] = jj_counter; P_diag_j[jj_counter] = fine_to_coarse[loc_col]; P_diag_data[jj_counter] = zero; jj_counter++; break; } } else { loc_col = -(HYPRE_Int)big_k1 - 1; if (P_marker_offd[loc_col] < jj_begin_row_offd) { P_marker_offd[loc_col] = jj_counter_offd; P_offd_j[jj_counter_offd] = loc_col; P_offd_data[jj_counter_offd] = zero; jj_counter_offd++; break; } } } } } } } for (jj = S_diag_i[i]; jj < S_diag_i[i + 1]; jj++) { /* Search C points only */ i1 = S_diag_j[jj]; /*-------------------------------------------------------------- * If neighbor i1 is a C-point, set column number in P_diag_j * and initialize interpolation weight to zero. *--------------------------------------------------------------*/ if (CF_marker[i1] == 2) { CF_marker[i1] = 1; } } if ( num_procs > 1) { for (jj = S_offd_i[i]; jj < S_offd_i[i + 1]; jj++) { i1 = S_offd_j[jj]; if ( CF_marker_offd[i1] == 2) { CF_marker_offd[i1] = 1; } } } jj_end_row = jj_counter; jj_end_row_offd = jj_counter_offd; diagonal = A_diag_data[A_diag_i[i]]; for (jj = A_diag_i[i] + 1; jj < A_diag_i[i + 1]; jj++) { /* i1 is a c-point and strongly influences i, accumulate * a_(i,i1) into interpolation weight */ i1 = A_diag_j[jj]; if (P_marker[i1] >= jj_begin_row) { P_diag_data[P_marker[i1]] += A_diag_data[jj]; } else if (P_marker[i1] == strong_f_marker) { sum = zero; if (A_diag_data[A_diag_i[i1]] < 0) { sgn = -1; } /* Loop over row of A for point i1 and calculate the sum * of the connections to c-points that strongly incluence i. */ for (jj1 = A_diag_i[i1]; jj1 < A_diag_i[i1 + 1]; jj1++) { i2 = A_diag_j[jj1]; if (P_marker[i2] >= jj_begin_row && (sgn * A_diag_data[jj1]) < 0) { sum += A_diag_data[jj1]; } } if (num_procs > 1) { for (jj1 = A_offd_i[i1]; jj1 < A_offd_i[i1 + 1]; jj1++) { i2 = A_offd_j[jj1]; if (P_marker_offd[i2] >= jj_begin_row_offd && (sgn * A_offd_data[jj1]) < 0) { sum += A_offd_data[jj1]; } } } if (sum != 0) { distribute = A_diag_data[jj] / sum; /* Loop over row of A for point i1 and do the distribution */ for (jj1 = A_diag_i[i1]; jj1 < A_diag_i[i1 + 1]; jj1++) { i2 = A_diag_j[jj1]; if (P_marker[i2] >= jj_begin_row && (sgn * A_diag_data[jj1]) < 0) P_diag_data[P_marker[i2]] += distribute * A_diag_data[jj1]; } if (num_procs > 1) { for (jj1 = A_offd_i[i1]; jj1 < A_offd_i[i1 + 1]; jj1++) { i2 = A_offd_j[jj1]; if (P_marker_offd[i2] >= jj_begin_row_offd && (sgn * A_offd_data[jj1]) < 0) P_offd_data[P_marker_offd[i2]] += distribute * A_offd_data[jj1]; } } } else { diagonal += A_diag_data[jj]; } } /* neighbor i1 weakly influences i, accumulate a_(i,i1) into * diagonal */ else if (CF_marker[i1] != -3) { if (num_functions == 1 || dof_func[i] == dof_func[i1]) { diagonal += A_diag_data[jj]; } } } if (num_procs > 1) { for (jj = A_offd_i[i]; jj < A_offd_i[i + 1]; jj++) { i1 = A_offd_j[jj]; if (P_marker_offd[i1] >= jj_begin_row_offd) { P_offd_data[P_marker_offd[i1]] += A_offd_data[jj]; } else if (P_marker_offd[i1] == strong_f_marker) { sum = zero; for (jj1 = A_ext_i[i1]; jj1 < A_ext_i[i1 + 1]; jj1++) { big_k1 = A_ext_j[jj1]; if (big_k1 >= col_1 && big_k1 < col_n) { /* diag */ loc_col = (HYPRE_Int)(big_k1 - col_1); if (P_marker[loc_col] >= jj_begin_row) { sum += A_ext_data[jj1]; } } else { loc_col = -(HYPRE_Int)big_k1 - 1; if (P_marker_offd[loc_col] >= jj_begin_row_offd) { sum += A_ext_data[jj1]; } } } if (sum != 0) { distribute = A_offd_data[jj] / sum; for (jj1 = A_ext_i[i1]; jj1 < A_ext_i[i1 + 1]; jj1++) { big_k1 = A_ext_j[jj1]; if (big_k1 >= col_1 && big_k1 < col_n) { /* diag */ loc_col = (HYPRE_Int)(big_k1 - col_1); if (P_marker[loc_col] >= jj_begin_row) P_diag_data[P_marker[loc_col]] += distribute * A_ext_data[jj1]; } else { loc_col = - (HYPRE_Int)big_k1 - 1; if (P_marker_offd[loc_col] >= jj_begin_row_offd) P_offd_data[P_marker_offd[loc_col]] += distribute * A_ext_data[jj1]; } } } else { diagonal += A_offd_data[jj]; } } else if (CF_marker_offd[i1] != -3) { if (num_functions == 1 || dof_func[i] == dof_func_offd[i1]) { diagonal += A_offd_data[jj]; } } } } if (diagonal) { for (jj = jj_begin_row; jj < jj_end_row; jj++) { P_diag_data[jj] /= -diagonal; } for (jj = jj_begin_row_offd; jj < jj_end_row_offd; jj++) { P_offd_data[jj] /= -diagonal; } } } strong_f_marker--; } P = hypre_ParCSRMatrixCreate(comm, hypre_ParCSRMatrixGlobalNumRows(A), total_global_cpts, hypre_ParCSRMatrixColStarts(A), num_cpts_global, 0, P_diag_i[n_fine], P_offd_i[n_fine]); P_diag = hypre_ParCSRMatrixDiag(P); hypre_CSRMatrixData(P_diag) = P_diag_data; hypre_CSRMatrixI(P_diag) = P_diag_i; hypre_CSRMatrixJ(P_diag) = P_diag_j; P_offd = hypre_ParCSRMatrixOffd(P); hypre_CSRMatrixData(P_offd) = P_offd_data; hypre_CSRMatrixI(P_offd) = P_offd_i; hypre_CSRMatrixJ(P_offd) = P_offd_j; hypre_CSRMatrixMemoryLocation(P_diag) = memory_location_P; hypre_CSRMatrixMemoryLocation(P_offd) = memory_location_P; /* Compress P, removing coefficients smaller than trunc_factor * Max */ if (trunc_factor != 0.0 || max_elmts > 0) { hypre_BoomerAMGInterpTruncation(P, trunc_factor, max_elmts); P_diag_data = hypre_CSRMatrixData(P_diag); P_diag_i = hypre_CSRMatrixI(P_diag); P_diag_j = hypre_CSRMatrixJ(P_diag); P_offd_data = hypre_CSRMatrixData(P_offd); P_offd_i = hypre_CSRMatrixI(P_offd); P_offd_j = hypre_CSRMatrixJ(P_offd); P_diag_size = P_diag_i[n_fine]; P_offd_size = P_offd_i[n_fine]; } /* This builds col_map, col_map should be monotone increasing and contain * global numbers. */ if (P_offd_size) { hypre_build_interp_colmap(P, full_off_procNodes, tmp_CF_marker_offd, fine_to_coarse_offd); } hypre_MatvecCommPkgCreate(P); for (i = 0; i < n_fine; i++) if (CF_marker[i] == -3) { CF_marker[i] = -1; } *P_ptr = P; /* Deallocate memory */ hypre_TFree(fine_to_coarse, HYPRE_MEMORY_HOST); hypre_TFree(P_marker, HYPRE_MEMORY_HOST); /*hynre_TFree(clist);*/ if (num_procs > 1) { /*hypre_TFree(clist_offd);*/ hypre_CSRMatrixDestroy(Sop); hypre_CSRMatrixDestroy(A_ext); hypre_TFree(fine_to_coarse_offd, HYPRE_MEMORY_HOST); hypre_TFree(P_marker_offd, HYPRE_MEMORY_HOST); hypre_TFree(CF_marker_offd, HYPRE_MEMORY_HOST); hypre_TFree(tmp_CF_marker_offd, HYPRE_MEMORY_HOST); if (num_functions > 1) { hypre_TFree(dof_func_offd, HYPRE_MEMORY_HOST); } hypre_MatvecCommPkgDestroy(extend_comm_pkg); } return hypre_error_flag; } /*--------------------------------------------------------------------------- * hypre_BoomerAMGBuildExtInterp * Comment: *--------------------------------------------------------------------------*/ HYPRE_Int hypre_BoomerAMGBuildExtInterpHost(hypre_ParCSRMatrix *A, HYPRE_Int *CF_marker, hypre_ParCSRMatrix *S, HYPRE_BigInt *num_cpts_global, HYPRE_Int num_functions, HYPRE_Int *dof_func, HYPRE_Int debug_flag, HYPRE_Real trunc_factor, HYPRE_Int max_elmts, hypre_ParCSRMatrix **P_ptr) { /* Communication Variables */ MPI_Comm comm = hypre_ParCSRMatrixComm(A); hypre_ParCSRCommPkg *comm_pkg = hypre_ParCSRMatrixCommPkg(A); HYPRE_Int my_id, num_procs; HYPRE_MemoryLocation memory_location_P = hypre_ParCSRMatrixMemoryLocation(A); /* Variables to store input variables */ hypre_CSRMatrix *A_diag = hypre_ParCSRMatrixDiag(A); HYPRE_Real *A_diag_data = hypre_CSRMatrixData(A_diag); HYPRE_Int *A_diag_i = hypre_CSRMatrixI(A_diag); HYPRE_Int *A_diag_j = hypre_CSRMatrixJ(A_diag); hypre_CSRMatrix *A_offd = hypre_ParCSRMatrixOffd(A); HYPRE_Real *A_offd_data = hypre_CSRMatrixData(A_offd); HYPRE_Int *A_offd_i = hypre_CSRMatrixI(A_offd); HYPRE_Int *A_offd_j = hypre_CSRMatrixJ(A_offd); /*HYPRE_Int num_cols_A_offd = hypre_CSRMatrixNumCols(A_offd); HYPRE_Int *col_map_offd = hypre_ParCSRMatrixColMapOffd(A);*/ HYPRE_Int n_fine = hypre_CSRMatrixNumRows(A_diag); HYPRE_BigInt col_1 = hypre_ParCSRMatrixFirstRowIndex(A); HYPRE_Int local_numrows = hypre_CSRMatrixNumRows(A_diag); HYPRE_BigInt col_n = col_1 + (HYPRE_BigInt)local_numrows; HYPRE_BigInt total_global_cpts, my_first_cpt; /* Variables to store strong connection matrix info */ hypre_CSRMatrix *S_diag = hypre_ParCSRMatrixDiag(S); HYPRE_Int *S_diag_i = hypre_CSRMatrixI(S_diag); HYPRE_Int *S_diag_j = hypre_CSRMatrixJ(S_diag); hypre_CSRMatrix *S_offd = hypre_ParCSRMatrixOffd(S); HYPRE_Int *S_offd_i = hypre_CSRMatrixI(S_offd); HYPRE_Int *S_offd_j = hypre_CSRMatrixJ(S_offd); /* Interpolation matrix P */ hypre_ParCSRMatrix *P; hypre_CSRMatrix *P_diag; hypre_CSRMatrix *P_offd; HYPRE_Real *P_diag_data = NULL; HYPRE_Int *P_diag_i, *P_diag_j = NULL; HYPRE_Real *P_offd_data = NULL; HYPRE_Int *P_offd_i, *P_offd_j = NULL; /*HYPRE_Int *col_map_offd_P = NULL;*/ HYPRE_Int P_diag_size; HYPRE_Int P_offd_size; HYPRE_Int *P_marker = NULL; HYPRE_Int *P_marker_offd = NULL; HYPRE_Int *CF_marker_offd = NULL; HYPRE_Int *tmp_CF_marker_offd = NULL; HYPRE_Int *dof_func_offd = NULL; /* Full row information for columns of A that are off diag*/ hypre_CSRMatrix *A_ext = NULL; HYPRE_Real *A_ext_data = NULL; HYPRE_Int *A_ext_i = NULL; HYPRE_BigInt *A_ext_j = NULL; HYPRE_Int *fine_to_coarse = NULL; HYPRE_BigInt *fine_to_coarse_offd = NULL; HYPRE_Int loc_col; HYPRE_Int full_off_procNodes; hypre_CSRMatrix *Sop = NULL; HYPRE_Int *Sop_i = NULL; HYPRE_BigInt *Sop_j = NULL; HYPRE_Int sgn = 1; /* Variables to keep count of interpolatory points */ HYPRE_Int jj_counter, jj_counter_offd; HYPRE_Int jj_begin_row, jj_end_row; HYPRE_Int jj_begin_row_offd = 0; HYPRE_Int jj_end_row_offd = 0; HYPRE_Int coarse_counter; /* Interpolation weight variables */ HYPRE_Real sum, diagonal, distribute; HYPRE_Int strong_f_marker = -2; /* Loop variables */ /*HYPRE_Int index;*/ HYPRE_Int start_indexing = 0; HYPRE_Int i, i1, i2, jj, kk, k1, jj1; HYPRE_BigInt big_k1; /* Definitions */ HYPRE_Real zero = 0.0; HYPRE_Real one = 1.0; HYPRE_Real wall_time = 0.0; hypre_ParCSRCommPkg *extend_comm_pkg = NULL; if (debug_flag == 4) { wall_time = time_getWallclockSeconds(); } /* BEGIN */ hypre_MPI_Comm_size(comm, &num_procs); hypre_MPI_Comm_rank(comm, &my_id); my_first_cpt = num_cpts_global[0]; if (my_id == (num_procs - 1)) { total_global_cpts = num_cpts_global[1]; } hypre_MPI_Bcast(&total_global_cpts, 1, HYPRE_MPI_BIG_INT, num_procs - 1, comm); if (!comm_pkg) { hypre_MatvecCommPkgCreate(A); comm_pkg = hypre_ParCSRMatrixCommPkg(A); } /* Set up off processor information (specifically for neighbors of * neighbors */ full_off_procNodes = 0; if (num_procs > 1) { hypre_exchange_interp_data( &CF_marker_offd, &dof_func_offd, &A_ext, &full_off_procNodes, &Sop, &extend_comm_pkg, A, CF_marker, S, num_functions, dof_func, 1); { #ifdef HYPRE_PROFILE hypre_profile_times[HYPRE_TIMER_ID_EXTENDED_I_INTERP] += hypre_MPI_Wtime(); #endif } A_ext_i = hypre_CSRMatrixI(A_ext); A_ext_j = hypre_CSRMatrixBigJ(A_ext); A_ext_data = hypre_CSRMatrixData(A_ext); Sop_i = hypre_CSRMatrixI(Sop); Sop_j = hypre_CSRMatrixBigJ(Sop); } /*----------------------------------------------------------------------- * First Pass: Determine size of P and fill in fine_to_coarse mapping. *-----------------------------------------------------------------------*/ /*----------------------------------------------------------------------- * Intialize counters and allocate mapping vector. *-----------------------------------------------------------------------*/ P_diag_i = hypre_CTAlloc(HYPRE_Int, n_fine + 1, memory_location_P); P_offd_i = hypre_CTAlloc(HYPRE_Int, n_fine + 1, memory_location_P); if (n_fine) { fine_to_coarse = hypre_CTAlloc(HYPRE_Int, n_fine, HYPRE_MEMORY_HOST); P_marker = hypre_CTAlloc(HYPRE_Int, n_fine, HYPRE_MEMORY_HOST); } if (full_off_procNodes) { P_marker_offd = hypre_CTAlloc(HYPRE_Int, full_off_procNodes, HYPRE_MEMORY_HOST); fine_to_coarse_offd = hypre_CTAlloc(HYPRE_BigInt, full_off_procNodes, HYPRE_MEMORY_HOST); tmp_CF_marker_offd = hypre_CTAlloc(HYPRE_Int, full_off_procNodes, HYPRE_MEMORY_HOST); } hypre_initialize_vecs(n_fine, full_off_procNodes, fine_to_coarse, fine_to_coarse_offd, P_marker, P_marker_offd, tmp_CF_marker_offd); jj_counter = start_indexing; jj_counter_offd = start_indexing; coarse_counter = 0; /*----------------------------------------------------------------------- * Loop over fine grid. *-----------------------------------------------------------------------*/ for (i = 0; i < n_fine; i++) { P_diag_i[i] = jj_counter; if (num_procs > 1) { P_offd_i[i] = jj_counter_offd; } if (CF_marker[i] >= 0) { jj_counter++; fine_to_coarse[i] = coarse_counter; coarse_counter++; } /*-------------------------------------------------------------------- * If i is an F-point, interpolation is from the C-points that * strongly influence i, or C-points that stronly influence F-points * that strongly influence i. *--------------------------------------------------------------------*/ else if (CF_marker[i] != -3) { for (jj = S_diag_i[i]; jj < S_diag_i[i + 1]; jj++) { i1 = S_diag_j[jj]; if (CF_marker[i1] >= 0) { /* i1 is a C point */ if (P_marker[i1] < P_diag_i[i]) { P_marker[i1] = jj_counter; jj_counter++; } } else if (CF_marker[i1] != -3) { /* i1 is a F point, loop through it's strong neighbors */ for (kk = S_diag_i[i1]; kk < S_diag_i[i1 + 1]; kk++) { k1 = S_diag_j[kk]; if (CF_marker[k1] >= 0) { if (P_marker[k1] < P_diag_i[i]) { P_marker[k1] = jj_counter; jj_counter++; } } } if (num_procs > 1) { for (kk = S_offd_i[i1]; kk < S_offd_i[i1 + 1]; kk++) { k1 = S_offd_j[kk]; if (CF_marker_offd[k1] >= 0) { if (P_marker_offd[k1] < P_offd_i[i]) { tmp_CF_marker_offd[k1] = 1; P_marker_offd[k1] = jj_counter_offd; jj_counter_offd++; } } } } } } /* Look at off diag strong connections of i */ if (num_procs > 1) { for (jj = S_offd_i[i]; jj < S_offd_i[i + 1]; jj++) { i1 = S_offd_j[jj]; if (CF_marker_offd[i1] >= 0) { if (P_marker_offd[i1] < P_offd_i[i]) { tmp_CF_marker_offd[i1] = 1; P_marker_offd[i1] = jj_counter_offd; jj_counter_offd++; } } else if (CF_marker_offd[i1] != -3) { /* F point; look at neighbors of i1. Sop contains global col * numbers and entries that could be in S_diag or S_offd or * neither. */ for (kk = Sop_i[i1]; kk < Sop_i[i1 + 1]; kk++) { big_k1 = Sop_j[kk]; if (big_k1 >= col_1 && big_k1 < col_n) { /* In S_diag */ loc_col = (HYPRE_Int)(big_k1 - col_1); if (P_marker[loc_col] < P_diag_i[i]) { P_marker[loc_col] = jj_counter; jj_counter++; } } else { loc_col = -(HYPRE_Int)big_k1 - 1; if (P_marker_offd[loc_col] < P_offd_i[i]) { P_marker_offd[loc_col] = jj_counter_offd; tmp_CF_marker_offd[loc_col] = 1; jj_counter_offd++; } } } } } } } } if (debug_flag == 4) { wall_time = time_getWallclockSeconds() - wall_time; hypre_printf("Proc = %d determine structure %f\n", my_id, wall_time); fflush(NULL); } /*----------------------------------------------------------------------- * Allocate arrays. *-----------------------------------------------------------------------*/ if (debug_flag == 4) { wall_time = time_getWallclockSeconds(); } P_diag_size = jj_counter; P_offd_size = jj_counter_offd; if (P_diag_size) { P_diag_j = hypre_CTAlloc(HYPRE_Int, P_diag_size, memory_location_P); P_diag_data = hypre_CTAlloc(HYPRE_Real, P_diag_size, memory_location_P); } if (P_offd_size) { P_offd_j = hypre_CTAlloc(HYPRE_Int, P_offd_size, memory_location_P); P_offd_data = hypre_CTAlloc(HYPRE_Real, P_offd_size, memory_location_P); } P_diag_i[n_fine] = jj_counter; P_offd_i[n_fine] = jj_counter_offd; jj_counter = start_indexing; jj_counter_offd = start_indexing; /* Fine to coarse mapping */ if (num_procs > 1) { hypre_big_insert_new_nodes(comm_pkg, extend_comm_pkg, fine_to_coarse, full_off_procNodes, my_first_cpt, fine_to_coarse_offd); } for (i = 0; i < n_fine; i++) { P_marker[i] = -1; } for (i = 0; i < full_off_procNodes; i++) { P_marker_offd[i] = -1; } /*----------------------------------------------------------------------- * Loop over fine grid points. *-----------------------------------------------------------------------*/ for (i = 0; i < n_fine; i++) { jj_begin_row = jj_counter; jj_begin_row_offd = jj_counter_offd; /*-------------------------------------------------------------------- * If i is a c-point, interpolation is the identity. *--------------------------------------------------------------------*/ if (CF_marker[i] >= 0) { P_diag_j[jj_counter] = fine_to_coarse[i]; P_diag_data[jj_counter] = one; jj_counter++; } /*-------------------------------------------------------------------- * If i is an F-point, build interpolation. *--------------------------------------------------------------------*/ else if (CF_marker[i] != -3) { strong_f_marker--; for (jj = S_diag_i[i]; jj < S_diag_i[i + 1]; jj++) { i1 = S_diag_j[jj]; /*-------------------------------------------------------------- * If neighbor i1 is a C-point, set column number in P_diag_j * and initialize interpolation weight to zero. *--------------------------------------------------------------*/ if (CF_marker[i1] >= 0) { if (P_marker[i1] < jj_begin_row) { P_marker[i1] = jj_counter; P_diag_j[jj_counter] = fine_to_coarse[i1]; P_diag_data[jj_counter] = zero; jj_counter++; } } else if (CF_marker[i1] != -3) { P_marker[i1] = strong_f_marker; for (kk = S_diag_i[i1]; kk < S_diag_i[i1 + 1]; kk++) { k1 = S_diag_j[kk]; if (CF_marker[k1] >= 0) { if (P_marker[k1] < jj_begin_row) { P_marker[k1] = jj_counter; P_diag_j[jj_counter] = fine_to_coarse[k1]; P_diag_data[jj_counter] = zero; jj_counter++; } } } if (num_procs > 1) { for (kk = S_offd_i[i1]; kk < S_offd_i[i1 + 1]; kk++) { k1 = S_offd_j[kk]; if (CF_marker_offd[k1] >= 0) { if (P_marker_offd[k1] < jj_begin_row_offd) { P_marker_offd[k1] = jj_counter_offd; P_offd_j[jj_counter_offd] = k1; P_offd_data[jj_counter_offd] = zero; jj_counter_offd++; } } } } } } if ( num_procs > 1) { for (jj = S_offd_i[i]; jj < S_offd_i[i + 1]; jj++) { i1 = S_offd_j[jj]; if ( CF_marker_offd[i1] >= 0) { if (P_marker_offd[i1] < jj_begin_row_offd) { P_marker_offd[i1] = jj_counter_offd; P_offd_j[jj_counter_offd] = i1; P_offd_data[jj_counter_offd] = zero; jj_counter_offd++; } } else if (CF_marker_offd[i1] != -3) { P_marker_offd[i1] = strong_f_marker; for (kk = Sop_i[i1]; kk < Sop_i[i1 + 1]; kk++) { big_k1 = Sop_j[kk]; /* Find local col number */ if (big_k1 >= col_1 && big_k1 < col_n) { loc_col = (HYPRE_Int)(big_k1 - col_1); if (P_marker[loc_col] < jj_begin_row) { P_marker[loc_col] = jj_counter; P_diag_j[jj_counter] = fine_to_coarse[loc_col]; P_diag_data[jj_counter] = zero; jj_counter++; } } else { loc_col = -(HYPRE_Int)big_k1 - 1; if (P_marker_offd[loc_col] < jj_begin_row_offd) { P_marker_offd[loc_col] = jj_counter_offd; P_offd_j[jj_counter_offd] = loc_col; P_offd_data[jj_counter_offd] = zero; jj_counter_offd++; } } } } } } jj_end_row = jj_counter; jj_end_row_offd = jj_counter_offd; diagonal = A_diag_data[A_diag_i[i]]; for (jj = A_diag_i[i] + 1; jj < A_diag_i[i + 1]; jj++) { /* i1 is a c-point and strongly influences i, accumulate * a_(i,i1) into interpolation weight */ i1 = A_diag_j[jj]; if (P_marker[i1] >= jj_begin_row) { P_diag_data[P_marker[i1]] += A_diag_data[jj]; } else if (P_marker[i1] == strong_f_marker) { sum = zero; sgn = 1; if (A_diag_data[A_diag_i[i1]] < 0) { sgn = -1; } /* Loop over row of A for point i1 and calculate the sum * of the connections to c-points that strongly incluence i. */ for (jj1 = A_diag_i[i1] + 1; jj1 < A_diag_i[i1 + 1]; jj1++) { i2 = A_diag_j[jj1]; if ((P_marker[i2] >= jj_begin_row ) && (sgn * A_diag_data[jj1]) < 0) { sum += A_diag_data[jj1]; } } if (num_procs > 1) { for (jj1 = A_offd_i[i1]; jj1 < A_offd_i[i1 + 1]; jj1++) { i2 = A_offd_j[jj1]; if (P_marker_offd[i2] >= jj_begin_row_offd && (sgn * A_offd_data[jj1]) < 0) { sum += A_offd_data[jj1]; } } } if (sum != 0) { distribute = A_diag_data[jj] / sum; /* Loop over row of A for point i1 and do the distribution */ for (jj1 = A_diag_i[i1] + 1; jj1 < A_diag_i[i1 + 1]; jj1++) { i2 = A_diag_j[jj1]; if (P_marker[i2] >= jj_begin_row && (sgn * A_diag_data[jj1]) < 0) { P_diag_data[P_marker[i2]] += distribute * A_diag_data[jj1]; } } if (num_procs > 1) { for (jj1 = A_offd_i[i1]; jj1 < A_offd_i[i1 + 1]; jj1++) { i2 = A_offd_j[jj1]; if (P_marker_offd[i2] >= jj_begin_row_offd && (sgn * A_offd_data[jj1]) < 0) { P_offd_data[P_marker_offd[i2]] += distribute * A_offd_data[jj1]; } } } } else { diagonal += A_diag_data[jj]; } } /* neighbor i1 weakly influences i, accumulate a_(i,i1) into * diagonal */ else if (CF_marker[i1] != -3) { if (num_functions == 1 || dof_func[i] == dof_func[i1]) { diagonal += A_diag_data[jj]; } } } if (num_procs > 1) { for (jj = A_offd_i[i]; jj < A_offd_i[i + 1]; jj++) { i1 = A_offd_j[jj]; if (P_marker_offd[i1] >= jj_begin_row_offd) { P_offd_data[P_marker_offd[i1]] += A_offd_data[jj]; } else if (P_marker_offd[i1] == strong_f_marker) { sum = zero; for (jj1 = A_ext_i[i1]; jj1 < A_ext_i[i1 + 1]; jj1++) { big_k1 = A_ext_j[jj1]; if (big_k1 >= col_1 && big_k1 < col_n) { /* diag */ loc_col = (HYPRE_Int)(big_k1 - col_1); if (P_marker[loc_col] >= jj_begin_row ) { sum += A_ext_data[jj1]; } } else { loc_col = -(HYPRE_Int)big_k1 - 1; if (P_marker_offd[loc_col] >= jj_begin_row_offd) { sum += A_ext_data[jj1]; } } } if (sum != 0) { distribute = A_offd_data[jj] / sum; for (jj1 = A_ext_i[i1]; jj1 < A_ext_i[i1 + 1]; jj1++) { big_k1 = A_ext_j[jj1]; if (big_k1 >= col_1 && big_k1 < col_n) { /* diag */ loc_col = (HYPRE_Int)(big_k1 - col_1); if (P_marker[loc_col] >= jj_begin_row) { P_diag_data[P_marker[loc_col]] += distribute * A_ext_data[jj1]; } } else { loc_col = -(HYPRE_Int)big_k1 - 1; if (P_marker_offd[loc_col] >= jj_begin_row_offd) { P_offd_data[P_marker_offd[loc_col]] += distribute * A_ext_data[jj1]; } } } } else { diagonal += A_offd_data[jj]; } } else if (CF_marker_offd[i1] != -3) { if (num_functions == 1 || dof_func[i] == dof_func_offd[i1]) { diagonal += A_offd_data[jj]; } } } } if (diagonal) { for (jj = jj_begin_row; jj < jj_end_row; jj++) { P_diag_data[jj] /= -diagonal; } for (jj = jj_begin_row_offd; jj < jj_end_row_offd; jj++) { P_offd_data[jj] /= -diagonal; } } } strong_f_marker--; } if (debug_flag == 4) { wall_time = time_getWallclockSeconds() - wall_time; hypre_printf("Proc = %d fill structure %f\n", my_id, wall_time); fflush(NULL); } /*----------------------------------------------------------------------- * Allocate arrays. *-----------------------------------------------------------------------*/ P = hypre_ParCSRMatrixCreate(comm, hypre_ParCSRMatrixGlobalNumRows(A), total_global_cpts, hypre_ParCSRMatrixColStarts(A), num_cpts_global, 0, P_diag_i[n_fine], P_offd_i[n_fine]); P_diag = hypre_ParCSRMatrixDiag(P); hypre_CSRMatrixData(P_diag) = P_diag_data; hypre_CSRMatrixI(P_diag) = P_diag_i; hypre_CSRMatrixJ(P_diag) = P_diag_j; P_offd = hypre_ParCSRMatrixOffd(P); hypre_CSRMatrixData(P_offd) = P_offd_data; hypre_CSRMatrixI(P_offd) = P_offd_i; hypre_CSRMatrixJ(P_offd) = P_offd_j; hypre_CSRMatrixMemoryLocation(P_diag) = memory_location_P; hypre_CSRMatrixMemoryLocation(P_offd) = memory_location_P; /* Compress P, removing coefficients smaller than trunc_factor * Max */ if (trunc_factor != 0.0 || max_elmts > 0) { hypre_BoomerAMGInterpTruncation(P, trunc_factor, max_elmts); P_diag_data = hypre_CSRMatrixData(P_diag); P_diag_i = hypre_CSRMatrixI(P_diag); P_diag_j = hypre_CSRMatrixJ(P_diag); P_offd_data = hypre_CSRMatrixData(P_offd); P_offd_i = hypre_CSRMatrixI(P_offd); P_offd_j = hypre_CSRMatrixJ(P_offd); P_diag_size = P_diag_i[n_fine]; P_offd_size = P_offd_i[n_fine]; } /* This builds col_map, col_map should be monotone increasing and contain * global numbers. */ if (P_offd_size) { hypre_build_interp_colmap(P, full_off_procNodes, tmp_CF_marker_offd, fine_to_coarse_offd); } hypre_MatvecCommPkgCreate(P); for (i = 0; i < n_fine; i++) { if (CF_marker[i] == -3) { CF_marker[i] = -1; } } *P_ptr = P; /* Deallocate memory */ hypre_TFree(fine_to_coarse, HYPRE_MEMORY_HOST); hypre_TFree(P_marker, HYPRE_MEMORY_HOST); if (num_procs > 1) { hypre_CSRMatrixDestroy(Sop); hypre_CSRMatrixDestroy(A_ext); hypre_TFree(fine_to_coarse_offd, HYPRE_MEMORY_HOST); hypre_TFree(P_marker_offd, HYPRE_MEMORY_HOST); hypre_TFree(CF_marker_offd, HYPRE_MEMORY_HOST); hypre_TFree(tmp_CF_marker_offd, HYPRE_MEMORY_HOST); if (num_functions > 1) { hypre_TFree(dof_func_offd, HYPRE_MEMORY_HOST); } hypre_MatvecCommPkgDestroy(extend_comm_pkg); } return hypre_error_flag; } HYPRE_Int hypre_BoomerAMGBuildExtInterp(hypre_ParCSRMatrix *A, HYPRE_Int *CF_marker, hypre_ParCSRMatrix *S, HYPRE_BigInt *num_cpts_global, HYPRE_Int num_functions, HYPRE_Int *dof_func, HYPRE_Int debug_flag, HYPRE_Real trunc_factor, HYPRE_Int max_elmts, hypre_ParCSRMatrix **P_ptr) { hypre_GpuProfilingPushRange("ExtInterp"); HYPRE_Int ierr = 0; #if defined(HYPRE_USING_GPU) HYPRE_ExecutionPolicy exec = hypre_GetExecPolicy1( hypre_ParCSRMatrixMemoryLocation(A) ); if (exec == HYPRE_EXEC_DEVICE) { ierr = hypre_BoomerAMGBuildExtInterpDevice(A, CF_marker, S, num_cpts_global, num_functions, dof_func, debug_flag, trunc_factor, max_elmts, P_ptr); } else #endif { ierr = hypre_BoomerAMGBuildExtInterpHost(A, CF_marker, S, num_cpts_global, num_functions, dof_func, debug_flag, trunc_factor, max_elmts, P_ptr); } hypre_GpuProfilingPopRange(); return ierr; } /*-----------------------------------------------------------------------*/ HYPRE_Int hypre_BoomerAMGBuildExtPIInterp(hypre_ParCSRMatrix *A, HYPRE_Int *CF_marker, hypre_ParCSRMatrix *S, HYPRE_BigInt *num_cpts_global, HYPRE_Int num_functions, HYPRE_Int *dof_func, HYPRE_Int debug_flag, HYPRE_Real trunc_factor, HYPRE_Int max_elmts, hypre_ParCSRMatrix **P_ptr) { hypre_GpuProfilingPushRange("ExtPIInterp"); HYPRE_Int ierr = 0; #if defined(HYPRE_USING_GPU) HYPRE_ExecutionPolicy exec = hypre_GetExecPolicy1( hypre_ParCSRMatrixMemoryLocation(A) ); if (exec == HYPRE_EXEC_DEVICE) { ierr = hypre_BoomerAMGBuildExtPIInterpDevice(A, CF_marker, S, num_cpts_global, num_functions, dof_func, debug_flag, trunc_factor, max_elmts, P_ptr); } else #endif { ierr = hypre_BoomerAMGBuildExtPIInterpHost(A, CF_marker, S, num_cpts_global, num_functions, dof_func, debug_flag, trunc_factor, max_elmts, P_ptr); } hypre_GpuProfilingPopRange(); return ierr; } hypre-2.33.0/src/parcsr_ls/par_lr_interp_device.c000066400000000000000000001652201477326011500220440ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "_hypre_onedpl.hpp" #include "_hypre_parcsr_ls.h" #include "aux_interp.h" #include "_hypre_utilities.hpp" #if defined(HYPRE_USING_GPU) #define MAX_C_CONNECTIONS 100 #define HAVE_COMMON_C 1 //----------------------------------------------------------------------- // S_*_j is the special j-array from device SoC // -1: weak, -2: diag, >=0 (== A_diag_j) : strong // add weak and the diagonal entries of F-rows #if defined(HYPRE_USING_SYCL) SYCL_EXTERNAL #endif __global__ void hypreGPUKernel_compute_weak_rowsums( hypre_DeviceItem &item, HYPRE_Int nr_of_rows, bool has_offd, HYPRE_Int *CF_marker, HYPRE_Int *A_diag_i, HYPRE_Complex *A_diag_a, HYPRE_Int *Soc_diag_j, HYPRE_Int *A_offd_i, HYPRE_Complex *A_offd_a, HYPRE_Int *Soc_offd_j, HYPRE_Real *rs, HYPRE_Int flag) { HYPRE_Int row = hypre_gpu_get_grid_warp_id<1, 1>(item); if (row >= nr_of_rows) { return; } HYPRE_Int lane = hypre_gpu_get_lane_id<1>(item); HYPRE_Int ib = 0, ie; if (lane == 0) { ib = read_only_load(CF_marker + row); } ib = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, ib, 0); if (ib >= flag) { return; } if (lane < 2) { ib = read_only_load(A_diag_i + row + lane); } ie = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, ib, 1); ib = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, ib, 0); HYPRE_Complex rl = 0.0; for (HYPRE_Int i = ib + lane; i < ie; i += HYPRE_WARP_SIZE) { rl += read_only_load(&A_diag_a[i]) * (read_only_load(&Soc_diag_j[i]) < 0); } if (has_offd) { if (lane < 2) { ib = read_only_load(A_offd_i + row + lane); } ie = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, ib, 1); ib = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, ib, 0); for (HYPRE_Int i = ib + lane; i < ie; i += HYPRE_WARP_SIZE) { rl += read_only_load(&A_offd_a[i]) * (read_only_load(&Soc_offd_j[i]) < 0); } } rl = warp_reduce_sum(item, rl); if (lane == 0) { rs[row] = rl; } } //----------------------------------------------------------------------- __global__ void hypreGPUKernel_compute_aff_afc( hypre_DeviceItem &item, HYPRE_Int nr_of_rows, HYPRE_Int *AFF_diag_i, HYPRE_Int *AFF_diag_j, HYPRE_Complex *AFF_diag_data, HYPRE_Int *AFF_offd_i, HYPRE_Complex *AFF_offd_data, HYPRE_Int *AFC_diag_i, HYPRE_Complex *AFC_diag_data, HYPRE_Int *AFC_offd_i, HYPRE_Complex *AFC_offd_data, HYPRE_Complex *rsW, HYPRE_Complex *rsFC ) { HYPRE_Int row = hypre_gpu_get_grid_warp_id<1, 1>(item); if (row >= nr_of_rows) { return; } HYPRE_Int lane = hypre_gpu_get_lane_id<1>(item); HYPRE_Int p = 0, q; HYPRE_Complex iscale = 0.0, beta = 0.0; if (lane == 0) { iscale = -1.0 / read_only_load(&rsW[row]); beta = read_only_load(&rsFC[row]); } iscale = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, iscale, 0); beta = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, beta, 0); // AFF /* Diag part */ if (lane < 2) { p = read_only_load(AFF_diag_i + row + lane); } q = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, p, 1); p = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, p, 0); // do not assume diag is the first element of row for (HYPRE_Int j = p + lane; j < q; j += HYPRE_WARP_SIZE) { if (read_only_load(&AFF_diag_j[j]) == row) { AFF_diag_data[j] = beta * iscale; } else { AFF_diag_data[j] *= iscale; } } /* offd part */ if (lane < 2) { p = read_only_load(AFF_offd_i + row + lane); } q = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, p, 1); p = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, p, 0); for (HYPRE_Int j = p + lane; j < q; j += HYPRE_WARP_SIZE) { AFF_offd_data[j] *= iscale; } if (beta != 0.0) { beta = 1.0 / beta; } // AFC if (lane < 2) { p = read_only_load(AFC_diag_i + row + lane); } q = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, p, 1); p = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, p, 0); /* Diag part */ for (HYPRE_Int j = p + lane; j < q; j += HYPRE_WARP_SIZE) { AFC_diag_data[j] *= beta; } /* offd part */ if (lane < 2) { p = read_only_load(AFC_offd_i + row + lane); } q = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, p, 1); p = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, p, 0); for (HYPRE_Int j = p + lane; j < q; j += HYPRE_WARP_SIZE) { AFC_offd_data[j] *= beta; } } //----------------------------------------------------------------------- HYPRE_Int hypreDevice_extendWtoP( HYPRE_Int P_nr_of_rows, HYPRE_Int W_nr_of_rows, HYPRE_Int W_nr_of_cols, HYPRE_Int *CF_marker, HYPRE_Int W_diag_nnz, HYPRE_Int *W_diag_i, HYPRE_Int *W_diag_j, HYPRE_Complex *W_diag_data, HYPRE_Int *P_diag_i, HYPRE_Int *P_diag_j, HYPRE_Complex *P_diag_data, HYPRE_Int *W_offd_i, HYPRE_Int *P_offd_i ) { hypre_GpuProfilingPushRange("extendWtoP"); // row index shift P --> W HYPRE_Int *PWoffset = hypre_TAlloc(HYPRE_Int, P_nr_of_rows + 1, HYPRE_MEMORY_DEVICE); #if defined(HYPRE_USING_SYCL) HYPRE_ONEDPL_CALL( std::transform, CF_marker, &CF_marker[P_nr_of_rows], PWoffset, is_nonnegative() ); #else HYPRE_THRUST_CALL( transform, CF_marker, &CF_marker[P_nr_of_rows], PWoffset, is_nonnegative() ); #endif hypre_Memset(PWoffset + P_nr_of_rows, 0, sizeof(HYPRE_Int), HYPRE_MEMORY_DEVICE); hypreDevice_IntegerExclusiveScan(P_nr_of_rows + 1, PWoffset); // map F+C to (next) F HYPRE_Int *map2F = hypre_TAlloc(HYPRE_Int, P_nr_of_rows + 1, HYPRE_MEMORY_DEVICE); #if defined(HYPRE_USING_SYCL) HYPRE_ONEDPL_CALL( std::transform, oneapi::dpl::counting_iterator(0), oneapi::dpl::counting_iterator(P_nr_of_rows + 1), PWoffset, map2F, std::minus() ); #else HYPRE_THRUST_CALL( transform, thrust::counting_iterator(0), thrust::counting_iterator(P_nr_of_rows + 1), PWoffset, map2F, thrust::minus() ); #endif // P_diag_i #if defined(HYPRE_USING_SYCL) hypreSycl_gather( map2F, map2F + P_nr_of_rows + 1, W_diag_i, P_diag_i ); hypreDevice_IntAxpyn( P_diag_i, P_nr_of_rows + 1, PWoffset, P_diag_i, 1 ); // P_offd_i if (W_offd_i && P_offd_i) { hypreSycl_gather( map2F, map2F + P_nr_of_rows + 1, W_offd_i, P_offd_i ); } #else HYPRE_THRUST_CALL( gather, map2F, map2F + P_nr_of_rows + 1, W_diag_i, P_diag_i ); hypreDevice_IntAxpyn( P_diag_i, P_nr_of_rows + 1, PWoffset, P_diag_i, 1 ); // P_offd_i if (W_offd_i && P_offd_i) { HYPRE_THRUST_CALL( gather, map2F, map2F + P_nr_of_rows + 1, W_offd_i, P_offd_i ); } #endif hypre_TFree(map2F, HYPRE_MEMORY_DEVICE); // row index shift W --> P HYPRE_Int *WPoffset = hypre_TAlloc(HYPRE_Int, W_nr_of_rows, HYPRE_MEMORY_DEVICE); #if defined(HYPRE_USING_SYCL) HYPRE_Int *new_end = hypreSycl_copy_if( PWoffset, PWoffset + P_nr_of_rows, CF_marker, WPoffset, is_negative() ); #else HYPRE_Int *new_end = HYPRE_THRUST_CALL( copy_if, PWoffset, PWoffset + P_nr_of_rows, CF_marker, WPoffset, is_negative() ); #endif hypre_assert(new_end - WPoffset == W_nr_of_rows); hypre_TFree(PWoffset, HYPRE_MEMORY_DEVICE); // elements shift HYPRE_Int *shift = hypreDevice_CsrRowPtrsToIndices(W_nr_of_rows, W_diag_nnz, W_diag_i); #if defined(HYPRE_USING_SYCL) hypreSycl_gather( shift, shift + W_diag_nnz, WPoffset, shift); #else HYPRE_THRUST_CALL( gather, shift, shift + W_diag_nnz, WPoffset, shift); #endif hypre_TFree(WPoffset, HYPRE_MEMORY_DEVICE); #if defined(HYPRE_USING_SYCL) HYPRE_ONEDPL_CALL( std::transform, shift, shift + W_diag_nnz, oneapi::dpl::counting_iterator(0), shift, std::plus() ); // P_diag_j and P_diag_data if (W_diag_j && W_diag_data) { hypreSycl_scatter( oneapi::dpl::make_zip_iterator(W_diag_j, W_diag_data), oneapi::dpl::make_zip_iterator(W_diag_j, W_diag_data) + W_diag_nnz, shift, oneapi::dpl::make_zip_iterator(P_diag_j, P_diag_data) ); } #else HYPRE_THRUST_CALL( transform, shift, shift + W_diag_nnz, thrust::counting_iterator(0), shift, thrust::plus() ); // P_diag_j and P_diag_data if (W_diag_j && W_diag_data) { HYPRE_THRUST_CALL( scatter, thrust::make_zip_iterator(thrust::make_tuple(W_diag_j, W_diag_data)), thrust::make_zip_iterator(thrust::make_tuple(W_diag_j, W_diag_data)) + W_diag_nnz, shift, thrust::make_zip_iterator(thrust::make_tuple(P_diag_j, P_diag_data)) ); } #endif hypre_TFree(shift, HYPRE_MEMORY_DEVICE); // fill the gap HYPRE_Int *PC_i = hypre_TAlloc(HYPRE_Int, W_nr_of_cols, HYPRE_MEMORY_DEVICE); #if defined(HYPRE_USING_SYCL) new_end = hypreSycl_copy_if( P_diag_i, P_diag_i + P_nr_of_rows, CF_marker, PC_i, is_nonnegative() ); #else new_end = HYPRE_THRUST_CALL( copy_if, P_diag_i, P_diag_i + P_nr_of_rows, CF_marker, PC_i, is_nonnegative() ); #endif hypre_assert(new_end - PC_i == W_nr_of_cols); #if defined(HYPRE_USING_SYCL) HYPRE_ONEDPL_CALL( copy, oneapi::dpl::counting_iterator(0), oneapi::dpl::counting_iterator(W_nr_of_cols), oneapi::dpl::make_permutation_iterator(P_diag_j, PC_i) ); #else HYPRE_THRUST_CALL( scatter, thrust::counting_iterator(0), thrust::counting_iterator(W_nr_of_cols), PC_i, P_diag_j ); #endif hypreDevice_ScatterConstant(P_diag_data, W_nr_of_cols, PC_i, (HYPRE_Complex) 1.0); hypre_TFree(PC_i, HYPRE_MEMORY_DEVICE); hypre_GpuProfilingPopRange(); return hypre_error_flag; } //----------------------------------------------------------------------- // For Ext+i Interp, scale AFF from the left and the right __global__ void hypreGPUKernel_compute_twiaff_w( hypre_DeviceItem &item, HYPRE_Int nr_of_rows, HYPRE_BigInt first_index, HYPRE_Int *AFF_diag_i, HYPRE_Int *AFF_diag_j, HYPRE_Complex *AFF_diag_data, HYPRE_Complex *AFF_diag_data_old, HYPRE_Int *AFF_offd_i, HYPRE_Int *AFF_offd_j, HYPRE_Complex *AFF_offd_data, HYPRE_Int *AFF_ext_i, HYPRE_BigInt *AFF_ext_j, HYPRE_Complex *AFF_ext_data, HYPRE_Complex *rsW, HYPRE_Complex *rsFC, HYPRE_Complex *rsFC_offd ) { HYPRE_Int row = hypre_gpu_get_grid_warp_id<1, 1>(item); if (row >= nr_of_rows) { return; } HYPRE_Int lane = hypre_gpu_get_lane_id<1>(item); HYPRE_Int ib_diag = 0, ie_diag, ib_offd = 0, ie_offd; // diag if (lane < 2) { ib_diag = read_only_load(AFF_diag_i + row + lane); } ie_diag = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, ib_diag, 1); ib_diag = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, ib_diag, 0); HYPRE_Complex theta_i = 0.0; // do not assume diag is the first element of row // entire warp works on each j for (HYPRE_Int indj = ib_diag; indj < ie_diag; indj++) { HYPRE_Int j = 0; if (lane == 0) { j = read_only_load(&AFF_diag_j[indj]); } j = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, j, 0); if (j == row) { if (lane == 0) { AFF_diag_data[indj] = 1.0; } continue; } HYPRE_Int kb = 0, ke; // find if there exists entry (j, row) in row j of diag if (lane < 2) { kb = read_only_load(AFF_diag_i + j + lane); } ke = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, kb, 1); kb = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, kb, 0); HYPRE_Int kmatch = -1; for (HYPRE_Int indk = kb + lane; warp_any_sync(item, HYPRE_WARP_FULL_MASK, indk < ke); indk += HYPRE_WARP_SIZE) { if (indk < ke && row == read_only_load(&AFF_diag_j[indk])) { kmatch = indk; } if (warp_any_sync(item, HYPRE_WARP_FULL_MASK, kmatch >= 0)) { break; } } kmatch = warp_reduce_max(item, kmatch); if (lane == 0) { HYPRE_Complex vji = kmatch >= 0 ? read_only_load(&AFF_diag_data_old[kmatch]) : 0.0; HYPRE_Complex rsj = read_only_load(&rsFC[j]) + vji; if (rsj) { HYPRE_Complex vij = read_only_load(&AFF_diag_data_old[indj]) / rsj; AFF_diag_data[indj] = vij; theta_i += vji * vij; } else { AFF_diag_data[indj] = 0.0; theta_i += read_only_load(&AFF_diag_data_old[indj]); } } } // offd if (lane < 2) { ib_offd = read_only_load(AFF_offd_i + row + lane); } ie_offd = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, ib_offd, 1); ib_offd = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, ib_offd, 0); for (HYPRE_Int indj = ib_offd; indj < ie_offd; indj++) { HYPRE_Int j = 0; if (lane == 0) { j = read_only_load(&AFF_offd_j[indj]); } j = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, j, 0); HYPRE_Int kb = 0, ke; if (lane < 2) { kb = read_only_load(AFF_ext_i + j + lane); } ke = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, kb, 1); kb = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, kb, 0); HYPRE_Int kmatch = -1; for (HYPRE_Int indk = kb + lane; warp_any_sync(item, HYPRE_WARP_FULL_MASK, indk < ke); indk += HYPRE_WARP_SIZE) { if (indk < ke && row + first_index == read_only_load(&AFF_ext_j[indk])) { kmatch = indk; } if (warp_any_sync(item, HYPRE_WARP_FULL_MASK, kmatch >= 0)) { break; } } kmatch = warp_reduce_max(item, kmatch); if (lane == 0) { HYPRE_Complex vji = kmatch >= 0 ? read_only_load(&AFF_ext_data[kmatch]) : 0.0; HYPRE_Complex rsj = read_only_load(&rsFC_offd[j]) + vji; if (rsj) { HYPRE_Complex vij = read_only_load(&AFF_offd_data[indj]) / rsj; AFF_offd_data[indj] = vij; theta_i += vji * vij; } else { AFF_offd_data[indj] = 0.0; theta_i += read_only_load(&AFF_offd_data[indj]); } } } // scale row if (lane == 0) { theta_i += read_only_load(rsW + row); theta_i = theta_i ? -1.0 / theta_i : -1.0; } theta_i = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, theta_i, 0); for (HYPRE_Int j = ib_diag + lane; j < ie_diag; j += HYPRE_WARP_SIZE) { AFF_diag_data[j] *= theta_i; } for (HYPRE_Int j = ib_offd + lane; j < ie_offd; j += HYPRE_WARP_SIZE) { AFF_offd_data[j] *= theta_i; } } //----------------------------------------------------------------------- __global__ void hypreGPUKernel_compute_aff_afc_epe( hypre_DeviceItem &item, HYPRE_Int nr_of_rows, HYPRE_Int *AFF_diag_i, HYPRE_Int *AFF_diag_j, HYPRE_Complex *AFF_diag_data, HYPRE_Int *AFF_offd_i, HYPRE_Int *AFF_offd_j, HYPRE_Complex *AFF_offd_data, HYPRE_Int *AFC_diag_i, HYPRE_Complex *AFC_diag_data, HYPRE_Int *AFC_offd_i, HYPRE_Complex *AFC_offd_data, HYPRE_Complex *rsW, HYPRE_Complex *dlam, HYPRE_Complex *dtmp, HYPRE_Complex *dtmp_offd ) { HYPRE_Int row = hypre_gpu_get_grid_warp_id<1, 1>(item); if (row >= nr_of_rows) { return; } HYPRE_Int lane = hypre_gpu_get_lane_id<1>(item); HYPRE_Int pd = 0, qd, po = 0, qo, xd = 0, yd, xo = 0, yo; HYPRE_Complex theta = 0.0, value = 0.0; HYPRE_Complex dtau_i = 0.0; if (lane < 2) { pd = read_only_load(AFF_diag_i + row + lane); po = read_only_load(AFF_offd_i + row + lane); xd = read_only_load(AFC_diag_i + row + lane); xo = read_only_load(AFC_offd_i + row + lane); } qd = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, pd, 1); pd = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, pd, 0); qo = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, po, 1); po = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, po, 0); yd = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, xd, 1); xd = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, xd, 0); yo = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, xo, 1); xo = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, xo, 0); /* D_\tau */ /* do not assume the first element is the diagonal */ for (HYPRE_Int j = pd + lane; j < qd; j += HYPRE_WARP_SIZE) { const HYPRE_Int index = read_only_load(&AFF_diag_j[j]); if (index != row) { dtau_i += AFF_diag_data[j] * read_only_load(&dtmp[index]); } } for (HYPRE_Int j = po + lane; j < qo; j += HYPRE_WARP_SIZE) { const HYPRE_Int index = read_only_load(&AFF_offd_j[j]); dtau_i += AFF_offd_data[j] * read_only_load(&dtmp_offd[index]); } dtau_i = warp_reduce_sum(item, dtau_i); if (lane == 0) { value = read_only_load(&rsW[row]) + dtau_i; value = value != 0.0 ? -1.0 / value : 0.0; theta = read_only_load(&dlam[row]); } value = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, value, 0); theta = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, theta, 0); /* AFF Diag part */ // do not assume diag is the first element of row for (HYPRE_Int j = pd + lane; j < qd; j += HYPRE_WARP_SIZE) { if (read_only_load(&AFF_diag_j[j]) == row) { AFF_diag_data[j] = theta * value; } else { AFF_diag_data[j] *= value; } } /* AFF offd part */ for (HYPRE_Int j = po + lane; j < qo; j += HYPRE_WARP_SIZE) { AFF_offd_data[j] *= value; } theta = theta != 0.0 ? 1.0 / theta : 0.0; /* AFC Diag part */ for (HYPRE_Int j = xd + lane; j < yd; j += HYPRE_WARP_SIZE) { AFC_diag_data[j] *= theta; } /* AFC offd part */ for (HYPRE_Int j = xo + lane; j < yo; j += HYPRE_WARP_SIZE) { AFC_offd_data[j] *= theta; } } //----------------------------------------------------------------------- // For Ext+e Interp, compute D_lambda and D_tmp = D_mu / D_lambda #if defined(HYPRE_USING_SYCL) SYCL_EXTERNAL #endif __global__ void hypreGPUKernel_compute_dlam_dtmp( hypre_DeviceItem &item, HYPRE_Int nr_of_rows, HYPRE_Int *AFF_diag_i, HYPRE_Int *AFF_diag_j, HYPRE_Complex *AFF_diag_data, HYPRE_Int *AFF_offd_i, HYPRE_Complex *AFF_offd_data, HYPRE_Complex *rsFC, HYPRE_Complex *dlam, HYPRE_Complex *dtmp ) { HYPRE_Int row = hypre_gpu_get_grid_warp_id<1, 1>(item); if (row >= nr_of_rows) { return; } HYPRE_Int lane = hypre_gpu_get_lane_id<1>(item); HYPRE_Int p_diag = 0, p_offd = 0, q_diag, q_offd; if (lane < 2) { p_diag = read_only_load(AFF_diag_i + row + lane); } q_diag = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, p_diag, 1); p_diag = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, p_diag, 0); HYPRE_Complex row_sum = 0.0; HYPRE_Int find_diag = 0; /* do not assume the first element is the diagonal */ for (HYPRE_Int j = p_diag + lane; j < q_diag; j += HYPRE_WARP_SIZE) { if (read_only_load(&AFF_diag_j[j]) == row) { find_diag ++; } else { row_sum += read_only_load(&AFF_diag_data[j]); } } if (lane < 2) { p_offd = read_only_load(AFF_offd_i + row + lane); } q_offd = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, p_offd, 1); p_offd = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, p_offd, 0); for (HYPRE_Int j = p_offd + lane; j < q_offd; j += HYPRE_WARP_SIZE) { row_sum += read_only_load(&AFF_offd_data[j]); } row_sum = warp_reduce_sum(item, row_sum); find_diag = warp_reduce_sum(item, find_diag); if (lane == 0) { HYPRE_Int num = q_diag - p_diag + q_offd - p_offd - find_diag; HYPRE_Complex mu = num > 0 ? row_sum / ((HYPRE_Complex) num) : 0.0; /* lambda = beta + mu */ HYPRE_Complex lam = read_only_load(&rsFC[row]) + mu; dlam[row] = lam; dtmp[row] = lam != 0.0 ? mu / lam : 0.0; } } /*--------------------------------------------------------------------- * Extended Interpolation in the form of Mat-Mat *---------------------------------------------------------------------*/ HYPRE_Int hypre_BoomerAMGBuildExtInterpDevice(hypre_ParCSRMatrix *A, HYPRE_Int *CF_marker, hypre_ParCSRMatrix *S, HYPRE_BigInt *num_cpts_global, HYPRE_Int num_functions, HYPRE_Int *dof_func, HYPRE_Int debug_flag, HYPRE_Real trunc_factor, HYPRE_Int max_elmts, hypre_ParCSRMatrix **P_ptr) { HYPRE_UNUSED_VAR(num_functions); HYPRE_UNUSED_VAR(debug_flag); HYPRE_UNUSED_VAR(dof_func); HYPRE_Int A_nr_of_rows = hypre_ParCSRMatrixNumRows(A); hypre_CSRMatrix *A_diag = hypre_ParCSRMatrixDiag(A); HYPRE_Complex *A_diag_data = hypre_CSRMatrixData(A_diag); HYPRE_Int *A_diag_i = hypre_CSRMatrixI(A_diag); hypre_CSRMatrix *A_offd = hypre_ParCSRMatrixOffd(A); HYPRE_Complex *A_offd_data = hypre_CSRMatrixData(A_offd); HYPRE_Int *A_offd_i = hypre_CSRMatrixI(A_offd); HYPRE_Int A_offd_nnz = hypre_CSRMatrixNumNonzeros(A_offd); hypre_ParCSRMatrix *AFF, *AFC; hypre_ParCSRMatrix *W, *P; HYPRE_Int W_nr_of_rows, P_diag_nnz; HYPRE_Complex *rsFC, *rsWA, *rsW; HYPRE_Int *P_diag_i, *P_diag_j, *P_offd_i; HYPRE_Complex *P_diag_data; hypre_BoomerAMGMakeSocFromSDevice(A, S); HYPRE_Int *Soc_diag_j = hypre_ParCSRMatrixSocDiagJ(S); HYPRE_Int *Soc_offd_j = hypre_ParCSRMatrixSocOffdJ(S); /* 0. Find row sums of weak elements */ /* row sum of A-weak + Diag(A), i.e., (D_gamma + D_alpha) in the notes, only for F-pts */ rsWA = hypre_TAlloc(HYPRE_Complex, A_nr_of_rows, HYPRE_MEMORY_DEVICE); dim3 bDim = hypre_GetDefaultDeviceBlockDimension(); dim3 gDim = hypre_GetDefaultDeviceGridDimension(A_nr_of_rows, "warp", bDim); HYPRE_GPU_LAUNCH( hypreGPUKernel_compute_weak_rowsums, gDim, bDim, A_nr_of_rows, A_offd_nnz > 0, CF_marker, A_diag_i, A_diag_data, Soc_diag_j, A_offd_i, A_offd_data, Soc_offd_j, rsWA, 0 ); // AFF AFC hypre_GpuProfilingPushRange("Extract Submatrix"); hypre_ParCSRMatrixGenerateFFFCDevice(A, CF_marker, num_cpts_global, S, &AFC, &AFF); hypre_GpuProfilingPopRange(); W_nr_of_rows = hypre_ParCSRMatrixNumRows(AFF); hypre_assert(A_nr_of_rows == W_nr_of_rows + hypre_ParCSRMatrixNumCols(AFC)); rsW = hypre_TAlloc(HYPRE_Complex, W_nr_of_rows, HYPRE_MEMORY_DEVICE); #if defined(HYPRE_USING_SYCL) HYPRE_Complex *new_end = hypreSycl_copy_if( rsWA, rsWA + A_nr_of_rows, CF_marker, rsW, is_negative() ); #else HYPRE_Complex *new_end = HYPRE_THRUST_CALL( copy_if, rsWA, rsWA + A_nr_of_rows, CF_marker, rsW, is_negative() ); #endif hypre_assert(new_end - rsW == W_nr_of_rows); hypre_TFree(rsWA, HYPRE_MEMORY_DEVICE); /* row sum of AFC, i.e., D_beta */ rsFC = hypre_TAlloc(HYPRE_Complex, W_nr_of_rows, HYPRE_MEMORY_DEVICE); hypre_CSRMatrixComputeRowSumDevice(hypre_ParCSRMatrixDiag(AFC), NULL, NULL, rsFC, 0, 1.0, "set"); hypre_CSRMatrixComputeRowSumDevice(hypre_ParCSRMatrixOffd(AFC), NULL, NULL, rsFC, 0, 1.0, "add"); /* 5. Form matrix ~{A_FF}, (return twAFF in AFF data structure ) */ /* 6. Form matrix ~{A_FC}, (return twAFC in AFC data structure) */ hypre_GpuProfilingPushRange("Compute interp matrix"); gDim = hypre_GetDefaultDeviceGridDimension(W_nr_of_rows, "warp", bDim); HYPRE_Int *AFF_diag_i = hypre_CSRMatrixI(hypre_ParCSRMatrixDiag(AFF)); HYPRE_Int *AFF_diag_j = hypre_CSRMatrixJ(hypre_ParCSRMatrixDiag(AFF)); HYPRE_Complex *AFF_diag_a = hypre_CSRMatrixData(hypre_ParCSRMatrixDiag(AFF)); HYPRE_Int *AFF_offd_i = hypre_CSRMatrixI(hypre_ParCSRMatrixOffd(AFF)); HYPRE_Complex *AFF_offd_a = hypre_CSRMatrixData(hypre_ParCSRMatrixOffd(AFF)); HYPRE_Int *AFC_diag_i = hypre_CSRMatrixI(hypre_ParCSRMatrixDiag(AFC)); HYPRE_Complex *AFC_diag_a = hypre_CSRMatrixData(hypre_ParCSRMatrixDiag(AFC)); HYPRE_Int *AFC_offd_i = hypre_CSRMatrixI(hypre_ParCSRMatrixOffd(AFC)); HYPRE_Complex *AFC_offd_a = hypre_CSRMatrixData(hypre_ParCSRMatrixOffd(AFC)); HYPRE_GPU_LAUNCH( hypreGPUKernel_compute_aff_afc, gDim, bDim, W_nr_of_rows, AFF_diag_i, AFF_diag_j, AFF_diag_a, AFF_offd_i, AFF_offd_a, AFC_diag_i, AFC_diag_a, AFC_offd_i, AFC_offd_a, rsW, rsFC ); hypre_TFree(rsW, HYPRE_MEMORY_DEVICE); hypre_TFree(rsFC, HYPRE_MEMORY_DEVICE); hypre_GpuProfilingPopRange(); /* 7. Perform matrix-matrix multiplication */ hypre_GpuProfilingPushRange("Matrix-matrix mult"); W = hypre_ParCSRMatMatDevice(AFF, AFC); hypre_GpuProfilingPopRange(); hypre_ParCSRMatrixDestroy(AFF); hypre_ParCSRMatrixDestroy(AFC); /* 8. Construct P from matrix product W */ P_diag_nnz = hypre_CSRMatrixNumNonzeros(hypre_ParCSRMatrixDiag(W)) + hypre_ParCSRMatrixNumCols(W); P_diag_i = hypre_TAlloc(HYPRE_Int, A_nr_of_rows + 1, HYPRE_MEMORY_DEVICE); P_diag_j = hypre_TAlloc(HYPRE_Int, P_diag_nnz, HYPRE_MEMORY_DEVICE); P_diag_data = hypre_TAlloc(HYPRE_Complex, P_diag_nnz, HYPRE_MEMORY_DEVICE); P_offd_i = hypre_TAlloc(HYPRE_Int, A_nr_of_rows + 1, HYPRE_MEMORY_DEVICE); hypreDevice_extendWtoP( A_nr_of_rows, W_nr_of_rows, hypre_ParCSRMatrixNumCols(W), CF_marker, hypre_CSRMatrixNumNonzeros(hypre_ParCSRMatrixDiag(W)), hypre_CSRMatrixI(hypre_ParCSRMatrixDiag(W)), hypre_CSRMatrixJ(hypre_ParCSRMatrixDiag(W)), hypre_CSRMatrixData(hypre_ParCSRMatrixDiag(W)), P_diag_i, P_diag_j, P_diag_data, hypre_CSRMatrixI(hypre_ParCSRMatrixOffd(W)), P_offd_i ); // final P P = hypre_ParCSRMatrixCreate(hypre_ParCSRMatrixComm(A), hypre_ParCSRMatrixGlobalNumRows(A), hypre_ParCSRMatrixGlobalNumCols(W), hypre_ParCSRMatrixColStarts(A), hypre_ParCSRMatrixColStarts(W), hypre_CSRMatrixNumCols(hypre_ParCSRMatrixOffd(W)), P_diag_nnz, hypre_CSRMatrixNumNonzeros(hypre_ParCSRMatrixOffd(W))); hypre_CSRMatrixI(hypre_ParCSRMatrixDiag(P)) = P_diag_i; hypre_CSRMatrixJ(hypre_ParCSRMatrixDiag(P)) = P_diag_j; hypre_CSRMatrixData(hypre_ParCSRMatrixDiag(P)) = P_diag_data; hypre_CSRMatrixI(hypre_ParCSRMatrixOffd(P)) = P_offd_i; hypre_CSRMatrixJ(hypre_ParCSRMatrixOffd(P)) = hypre_CSRMatrixJ(hypre_ParCSRMatrixOffd(W)); hypre_CSRMatrixData(hypre_ParCSRMatrixOffd(P)) = hypre_CSRMatrixData(hypre_ParCSRMatrixOffd(W)); hypre_CSRMatrixJ(hypre_ParCSRMatrixOffd(W)) = NULL; hypre_CSRMatrixData(hypre_ParCSRMatrixOffd(W)) = NULL; hypre_CSRMatrixMemoryLocation(hypre_ParCSRMatrixDiag(P)) = HYPRE_MEMORY_DEVICE; hypre_CSRMatrixMemoryLocation(hypre_ParCSRMatrixOffd(P)) = HYPRE_MEMORY_DEVICE; hypre_ParCSRMatrixDeviceColMapOffd(P) = hypre_ParCSRMatrixDeviceColMapOffd(W); hypre_ParCSRMatrixColMapOffd(P) = hypre_ParCSRMatrixColMapOffd(W); hypre_ParCSRMatrixDeviceColMapOffd(W) = NULL; hypre_ParCSRMatrixColMapOffd(W) = NULL; hypre_ParCSRMatrixNumNonzeros(P) = hypre_ParCSRMatrixNumNonzeros(W) + hypre_ParCSRMatrixGlobalNumCols(W); hypre_ParCSRMatrixDNumNonzeros(P) = (HYPRE_Real) hypre_ParCSRMatrixNumNonzeros(P); hypre_GpuProfilingPushRange("Truncation"); if (trunc_factor != 0.0 || max_elmts > 0) { hypre_BoomerAMGInterpTruncationDevice(P, trunc_factor, max_elmts); hypre_ParCSRMatrixCompressOffdMapDevice(P); } hypre_GpuProfilingPopRange(); hypre_MatvecCommPkgCreate(P); #if defined(HYPRE_USING_SYCL) HYPRE_ONEDPL_CALL( std::replace_if, CF_marker, CF_marker + A_nr_of_rows, equal(-3), -1); #else HYPRE_THRUST_CALL( replace_if, CF_marker, CF_marker + A_nr_of_rows, equal(-3), -1); #endif *P_ptr = P; /* 9. Free memory */ hypre_ParCSRMatrixDestroy(W); return hypre_error_flag; } /*-----------------------------------------------------------------------*/ HYPRE_Int hypre_BoomerAMGBuildExtPIInterpDevice( hypre_ParCSRMatrix *A, HYPRE_Int *CF_marker, hypre_ParCSRMatrix *S, HYPRE_BigInt *num_cpts_global, HYPRE_Int num_functions, HYPRE_Int *dof_func, HYPRE_Int debug_flag, HYPRE_Real trunc_factor, HYPRE_Int max_elmts, hypre_ParCSRMatrix **P_ptr) { HYPRE_UNUSED_VAR(num_cpts_global); HYPRE_UNUSED_VAR(num_functions); HYPRE_UNUSED_VAR(dof_func); HYPRE_UNUSED_VAR(debug_flag); HYPRE_Int A_nr_of_rows = hypre_ParCSRMatrixNumRows(A); hypre_CSRMatrix *A_diag = hypre_ParCSRMatrixDiag(A); HYPRE_Complex *A_diag_data = hypre_CSRMatrixData(A_diag); HYPRE_Int *A_diag_i = hypre_CSRMatrixI(A_diag); hypre_CSRMatrix *A_offd = hypre_ParCSRMatrixOffd(A); HYPRE_Complex *A_offd_data = hypre_CSRMatrixData(A_offd); HYPRE_Int *A_offd_i = hypre_CSRMatrixI(A_offd); HYPRE_Int A_offd_nnz = hypre_CSRMatrixNumNonzeros(A_offd); hypre_CSRMatrix *AFF_ext = NULL; hypre_ParCSRMatrix *AFF, *AFC; hypre_ParCSRMatrix *W, *P; HYPRE_Int W_nr_of_rows, P_diag_nnz; HYPRE_Complex *rsFC, *rsFC_offd, *rsWA, *rsW; HYPRE_Int *P_diag_i, *P_diag_j, *P_offd_i, num_procs; HYPRE_Complex *P_diag_data; hypre_BoomerAMGMakeSocFromSDevice(A, S); HYPRE_Int *Soc_diag_j = hypre_ParCSRMatrixSocDiagJ(S); HYPRE_Int *Soc_offd_j = hypre_ParCSRMatrixSocOffdJ(S); hypre_MPI_Comm_size(hypre_ParCSRMatrixComm(A), &num_procs); /* 0.Find row sums of weak elements */ /* row sum of A-weak + Diag(A), i.e., (D_gamma + D_alpha) in the notes, only for F-pts */ rsWA = hypre_TAlloc(HYPRE_Complex, A_nr_of_rows, HYPRE_MEMORY_DEVICE); dim3 bDim = hypre_GetDefaultDeviceBlockDimension(); dim3 gDim = hypre_GetDefaultDeviceGridDimension(A_nr_of_rows, "warp", bDim); HYPRE_GPU_LAUNCH( hypreGPUKernel_compute_weak_rowsums, gDim, bDim, A_nr_of_rows, A_offd_nnz > 0, CF_marker, A_diag_i, A_diag_data, Soc_diag_j, A_offd_i, A_offd_data, Soc_offd_j, rsWA, 0 ); // AFF AFC hypre_GpuProfilingPushRange("Extract Submatrix"); hypre_ParCSRMatrixGenerateFFFCDevice(A, CF_marker, num_cpts_global, S, &AFC, &AFF); hypre_GpuProfilingPopRange(); W_nr_of_rows = hypre_CSRMatrixNumRows(hypre_ParCSRMatrixDiag(AFF)); hypre_assert(A_nr_of_rows == W_nr_of_rows + hypre_ParCSRMatrixNumCols(AFC)); rsW = hypre_TAlloc(HYPRE_Complex, W_nr_of_rows, HYPRE_MEMORY_DEVICE); #if defined(HYPRE_USING_SYCL) HYPRE_Complex *new_end = hypreSycl_copy_if( rsWA, rsWA + A_nr_of_rows, CF_marker, rsW, is_negative() ); #else HYPRE_Complex *new_end = HYPRE_THRUST_CALL( copy_if, rsWA, rsWA + A_nr_of_rows, CF_marker, rsW, is_negative() ); #endif hypre_assert(new_end - rsW == W_nr_of_rows); hypre_TFree(rsWA, HYPRE_MEMORY_DEVICE); /* row sum of AFC, i.e., D_beta */ rsFC = hypre_TAlloc(HYPRE_Complex, W_nr_of_rows, HYPRE_MEMORY_DEVICE); hypre_CSRMatrixComputeRowSumDevice(hypre_ParCSRMatrixDiag(AFC), NULL, NULL, rsFC, 0, 1.0, "set"); hypre_CSRMatrixComputeRowSumDevice(hypre_ParCSRMatrixOffd(AFC), NULL, NULL, rsFC, 0, 1.0, "add"); /* collect off-processor rsFC */ hypre_ParCSRCommPkg *comm_pkg = hypre_ParCSRMatrixCommPkg(AFF); hypre_ParCSRCommHandle *comm_handle; if (!comm_pkg) { hypre_MatvecCommPkgCreate(AFF); comm_pkg = hypre_ParCSRMatrixCommPkg(AFF); } rsFC_offd = hypre_TAlloc(HYPRE_Complex, hypre_CSRMatrixNumCols(hypre_ParCSRMatrixOffd(AFF)), HYPRE_MEMORY_DEVICE); HYPRE_Int num_sends = hypre_ParCSRCommPkgNumSends(comm_pkg); HYPRE_Int num_elmts_send = hypre_ParCSRCommPkgSendMapStart(comm_pkg, num_sends); HYPRE_Complex *send_buf = hypre_TAlloc(HYPRE_Complex, num_elmts_send, HYPRE_MEMORY_DEVICE); hypre_ParCSRCommPkgCopySendMapElmtsToDevice(comm_pkg); #if defined(HYPRE_USING_SYCL) hypreSycl_gather( hypre_ParCSRCommPkgDeviceSendMapElmts(comm_pkg), hypre_ParCSRCommPkgDeviceSendMapElmts(comm_pkg) + num_elmts_send, rsFC, send_buf ); #else HYPRE_THRUST_CALL( gather, hypre_ParCSRCommPkgDeviceSendMapElmts(comm_pkg), hypre_ParCSRCommPkgDeviceSendMapElmts(comm_pkg) + num_elmts_send, rsFC, send_buf ); #endif #if defined(HYPRE_USING_THRUST_NOSYNC) /* RL: make sure send_buf is ready before issuing GPU-GPU MPI */ if (hypre_GetGpuAwareMPI()) { hypre_ForceSyncComputeStream(); } #endif comm_handle = hypre_ParCSRCommHandleCreate_v2(1, comm_pkg, HYPRE_MEMORY_DEVICE, send_buf, HYPRE_MEMORY_DEVICE, rsFC_offd); hypre_ParCSRCommHandleDestroy(comm_handle); hypre_TFree(send_buf, HYPRE_MEMORY_DEVICE); /* offd rows of AFF */ if (num_procs > 1) { AFF_ext = hypre_ParCSRMatrixExtractBExtDevice(AFF, AFF, 1); } /* 5. Form matrix ~{A_FF}, (return twAFF in AFF data structure ) */ HYPRE_Complex *AFF_diag_data_old = hypre_TAlloc(HYPRE_Complex, hypre_CSRMatrixNumNonzeros(hypre_ParCSRMatrixDiag(AFF)), HYPRE_MEMORY_DEVICE); hypre_TMemcpy( AFF_diag_data_old, hypre_CSRMatrixData(hypre_ParCSRMatrixDiag(AFF)), HYPRE_Complex, hypre_CSRMatrixNumNonzeros(hypre_ParCSRMatrixDiag(AFF)), HYPRE_MEMORY_DEVICE, HYPRE_MEMORY_DEVICE); hypre_GpuProfilingPushRange("Compute interp matrix"); gDim = hypre_GetDefaultDeviceGridDimension(W_nr_of_rows, "warp", bDim); HYPRE_BigInt AFF_first_row_idx = hypre_ParCSRMatrixFirstRowIndex(AFF); HYPRE_Int *AFF_diag_i = hypre_CSRMatrixI(hypre_ParCSRMatrixDiag(AFF)); HYPRE_Int *AFF_diag_j = hypre_CSRMatrixJ(hypre_ParCSRMatrixDiag(AFF)); HYPRE_Complex *AFF_diag_a = hypre_CSRMatrixData(hypre_ParCSRMatrixDiag(AFF)); HYPRE_Int *AFF_offd_i = hypre_CSRMatrixI(hypre_ParCSRMatrixOffd(AFF)); HYPRE_Int *AFF_offd_j = hypre_CSRMatrixJ(hypre_ParCSRMatrixOffd(AFF)); HYPRE_Complex *AFF_offd_a = hypre_CSRMatrixData(hypre_ParCSRMatrixOffd(AFF)); HYPRE_Int *AFF_ext_i = NULL; HYPRE_BigInt *AFF_ext_bigj = NULL; HYPRE_Complex *AFF_ext_a = NULL; if (AFF_ext) { AFF_ext_i = hypre_CSRMatrixI(AFF_ext); AFF_ext_bigj = hypre_CSRMatrixBigJ(AFF_ext); AFF_ext_a = hypre_CSRMatrixData(AFF_ext); } HYPRE_GPU_LAUNCH( hypreGPUKernel_compute_twiaff_w, gDim, bDim, W_nr_of_rows, AFF_first_row_idx, AFF_diag_i, AFF_diag_j, AFF_diag_a, AFF_diag_data_old, AFF_offd_i, AFF_offd_j, AFF_offd_a, AFF_ext_i, AFF_ext_bigj, AFF_ext_a, rsW, rsFC, rsFC_offd ); hypre_TFree(rsW, HYPRE_MEMORY_DEVICE); hypre_TFree(rsFC, HYPRE_MEMORY_DEVICE); hypre_TFree(rsFC_offd, HYPRE_MEMORY_DEVICE); hypre_TFree(AFF_diag_data_old, HYPRE_MEMORY_DEVICE); hypre_CSRMatrixDestroy(AFF_ext); hypre_GpuProfilingPopRange(); /* 7. Perform matrix-matrix multiplication */ hypre_GpuProfilingPushRange("Matrix-matrix mult"); W = hypre_ParCSRMatMatDevice(AFF, AFC); hypre_GpuProfilingPopRange(); hypre_ParCSRMatrixDestroy(AFF); hypre_ParCSRMatrixDestroy(AFC); /* 8. Construct P from matrix product W */ P_diag_nnz = hypre_CSRMatrixNumNonzeros(hypre_ParCSRMatrixDiag(W)) + hypre_ParCSRMatrixNumCols(W); P_diag_i = hypre_TAlloc(HYPRE_Int, A_nr_of_rows + 1, HYPRE_MEMORY_DEVICE); P_diag_j = hypre_TAlloc(HYPRE_Int, P_diag_nnz, HYPRE_MEMORY_DEVICE); P_diag_data = hypre_TAlloc(HYPRE_Complex, P_diag_nnz, HYPRE_MEMORY_DEVICE); P_offd_i = hypre_TAlloc(HYPRE_Int, A_nr_of_rows + 1, HYPRE_MEMORY_DEVICE); hypreDevice_extendWtoP( A_nr_of_rows, W_nr_of_rows, hypre_ParCSRMatrixNumCols(W), CF_marker, hypre_CSRMatrixNumNonzeros(hypre_ParCSRMatrixDiag(W)), hypre_CSRMatrixI(hypre_ParCSRMatrixDiag(W)), hypre_CSRMatrixJ(hypre_ParCSRMatrixDiag(W)), hypre_CSRMatrixData(hypre_ParCSRMatrixDiag(W)), P_diag_i, P_diag_j, P_diag_data, hypre_CSRMatrixI(hypre_ParCSRMatrixOffd(W)), P_offd_i ); // final P P = hypre_ParCSRMatrixCreate(hypre_ParCSRMatrixComm(A), hypre_ParCSRMatrixGlobalNumRows(A), hypre_ParCSRMatrixGlobalNumCols(W), hypre_ParCSRMatrixColStarts(A), hypre_ParCSRMatrixColStarts(W), hypre_CSRMatrixNumCols(hypre_ParCSRMatrixOffd(W)), P_diag_nnz, hypre_CSRMatrixNumNonzeros(hypre_ParCSRMatrixOffd(W))); hypre_CSRMatrixI(hypre_ParCSRMatrixDiag(P)) = P_diag_i; hypre_CSRMatrixJ(hypre_ParCSRMatrixDiag(P)) = P_diag_j; hypre_CSRMatrixData(hypre_ParCSRMatrixDiag(P)) = P_diag_data; hypre_CSRMatrixI(hypre_ParCSRMatrixOffd(P)) = P_offd_i; hypre_CSRMatrixJ(hypre_ParCSRMatrixOffd(P)) = hypre_CSRMatrixJ(hypre_ParCSRMatrixOffd(W)); hypre_CSRMatrixData(hypre_ParCSRMatrixOffd(P)) = hypre_CSRMatrixData(hypre_ParCSRMatrixOffd(W)); hypre_CSRMatrixJ(hypre_ParCSRMatrixOffd(W)) = NULL; hypre_CSRMatrixData(hypre_ParCSRMatrixOffd(W)) = NULL; hypre_CSRMatrixMemoryLocation(hypre_ParCSRMatrixDiag(P)) = HYPRE_MEMORY_DEVICE; hypre_CSRMatrixMemoryLocation(hypre_ParCSRMatrixOffd(P)) = HYPRE_MEMORY_DEVICE; hypre_ParCSRMatrixDeviceColMapOffd(P) = hypre_ParCSRMatrixDeviceColMapOffd(W); hypre_ParCSRMatrixColMapOffd(P) = hypre_ParCSRMatrixColMapOffd(W); hypre_ParCSRMatrixDeviceColMapOffd(W) = NULL; hypre_ParCSRMatrixColMapOffd(W) = NULL; hypre_ParCSRMatrixNumNonzeros(P) = hypre_ParCSRMatrixNumNonzeros(W) + hypre_ParCSRMatrixGlobalNumCols(W); hypre_ParCSRMatrixDNumNonzeros(P) = (HYPRE_Real) hypre_ParCSRMatrixNumNonzeros(P); hypre_GpuProfilingPushRange("Truncation"); if (trunc_factor != 0.0 || max_elmts > 0) { hypre_BoomerAMGInterpTruncationDevice(P, trunc_factor, max_elmts); hypre_ParCSRMatrixCompressOffdMapDevice(P); } hypre_GpuProfilingPopRange(); hypre_MatvecCommPkgCreate(P); #if defined(HYPRE_USING_SYCL) HYPRE_ONEDPL_CALL( std::replace_if, CF_marker, CF_marker + A_nr_of_rows, equal(-3), -1); #else HYPRE_THRUST_CALL( replace_if, CF_marker, CF_marker + A_nr_of_rows, equal(-3), -1); #endif *P_ptr = P; /* 9. Free memory */ hypre_ParCSRMatrixDestroy(W); return hypre_error_flag; } /*--------------------------------------------------------------------- * Extended+e Interpolation in the form of Mat-Mat *---------------------------------------------------------------------*/ HYPRE_Int hypre_BoomerAMGBuildExtPEInterpDevice(hypre_ParCSRMatrix *A, HYPRE_Int *CF_marker, hypre_ParCSRMatrix *S, HYPRE_BigInt *num_cpts_global, HYPRE_Int num_functions, HYPRE_Int *dof_func, HYPRE_Int debug_flag, HYPRE_Real trunc_factor, HYPRE_Int max_elmts, hypre_ParCSRMatrix **P_ptr) { HYPRE_UNUSED_VAR(num_cpts_global); HYPRE_UNUSED_VAR(num_functions); HYPRE_UNUSED_VAR(dof_func); HYPRE_UNUSED_VAR(debug_flag); HYPRE_Int A_nr_of_rows = hypre_ParCSRMatrixNumRows(A); hypre_CSRMatrix *A_diag = hypre_ParCSRMatrixDiag(A); HYPRE_Complex *A_diag_data = hypre_CSRMatrixData(A_diag); HYPRE_Int *A_diag_i = hypre_CSRMatrixI(A_diag); hypre_CSRMatrix *A_offd = hypre_ParCSRMatrixOffd(A); HYPRE_Complex *A_offd_data = hypre_CSRMatrixData(A_offd); HYPRE_Int *A_offd_i = hypre_CSRMatrixI(A_offd); HYPRE_Int A_offd_nnz = hypre_CSRMatrixNumNonzeros(A_offd); hypre_BoomerAMGMakeSocFromSDevice(A, S); HYPRE_Int *Soc_diag_j = hypre_ParCSRMatrixSocDiagJ(S); HYPRE_Int *Soc_offd_j = hypre_ParCSRMatrixSocOffdJ(S); hypre_ParCSRMatrix *AFF, *AFC; hypre_ParCSRMatrix *W, *P; HYPRE_Int W_nr_of_rows, P_diag_nnz; HYPRE_Complex *dlam, *dtmp, *dtmp_offd, *rsFC, *rsWA, *rsW; HYPRE_Int *P_diag_i, *P_diag_j, *P_offd_i; HYPRE_Complex *P_diag_data; /* 0. Find row sums of weak elements */ /* row sum of A-weak + Diag(A), i.e., (D_gamma + D_FF) in the notes, only for F-pts */ rsWA = hypre_TAlloc(HYPRE_Complex, A_nr_of_rows, HYPRE_MEMORY_DEVICE); dim3 bDim = hypre_GetDefaultDeviceBlockDimension(); dim3 gDim = hypre_GetDefaultDeviceGridDimension(A_nr_of_rows, "warp", bDim); HYPRE_GPU_LAUNCH( hypreGPUKernel_compute_weak_rowsums, gDim, bDim, A_nr_of_rows, A_offd_nnz > 0, CF_marker, A_diag_i, A_diag_data, Soc_diag_j, A_offd_i, A_offd_data, Soc_offd_j, rsWA, 0 ); // AFF AFC hypre_GpuProfilingPushRange("Extract Submatrix"); hypre_ParCSRMatrixGenerateFFFCDevice(A, CF_marker, num_cpts_global, S, &AFC, &AFF); hypre_GpuProfilingPopRange(); W_nr_of_rows = hypre_ParCSRMatrixNumRows(AFF); hypre_assert(A_nr_of_rows == W_nr_of_rows + hypre_ParCSRMatrixNumCols(AFC)); rsW = hypre_TAlloc(HYPRE_Complex, W_nr_of_rows, HYPRE_MEMORY_DEVICE); #if defined(HYPRE_USING_SYCL) HYPRE_Complex *new_end = hypreSycl_copy_if( rsWA, rsWA + A_nr_of_rows, CF_marker, rsW, is_negative() ); #else HYPRE_Complex *new_end = HYPRE_THRUST_CALL( copy_if, rsWA, rsWA + A_nr_of_rows, CF_marker, rsW, is_negative() ); #endif hypre_assert(new_end - rsW == W_nr_of_rows); hypre_TFree(rsWA, HYPRE_MEMORY_DEVICE); /* row sum of AFC, i.e., D_beta */ rsFC = hypre_TAlloc(HYPRE_Complex, W_nr_of_rows, HYPRE_MEMORY_DEVICE); hypre_CSRMatrixComputeRowSumDevice(hypre_ParCSRMatrixDiag(AFC), NULL, NULL, rsFC, 0, 1.0, "set"); hypre_CSRMatrixComputeRowSumDevice(hypre_ParCSRMatrixOffd(AFC), NULL, NULL, rsFC, 0, 1.0, "add"); /* Generate D_lambda in the paper: D_beta + (row sum of AFF without diagonal elements / row_nnz) */ /* Generate D_tmp, i.e., D_mu / D_lambda */ dlam = hypre_TAlloc(HYPRE_Complex, W_nr_of_rows, HYPRE_MEMORY_DEVICE); dtmp = hypre_TAlloc(HYPRE_Complex, W_nr_of_rows, HYPRE_MEMORY_DEVICE); hypre_GpuProfilingPushRange("Compute D_tmp"); gDim = hypre_GetDefaultDeviceGridDimension(W_nr_of_rows, "warp", bDim); HYPRE_Int *AFF_diag_i = hypre_CSRMatrixI(hypre_ParCSRMatrixDiag(AFF)); HYPRE_Int *AFF_diag_j = hypre_CSRMatrixJ(hypre_ParCSRMatrixDiag(AFF)); HYPRE_Complex *AFF_diag_a = hypre_CSRMatrixData(hypre_ParCSRMatrixDiag(AFF)); HYPRE_Int *AFF_offd_i = hypre_CSRMatrixI(hypre_ParCSRMatrixOffd(AFF)); HYPRE_Int *AFF_offd_j = hypre_CSRMatrixJ(hypre_ParCSRMatrixOffd(AFF)); HYPRE_Complex *AFF_offd_a = hypre_CSRMatrixData(hypre_ParCSRMatrixOffd(AFF)); HYPRE_Int *AFC_diag_i = hypre_CSRMatrixI(hypre_ParCSRMatrixDiag(AFC)); HYPRE_Complex *AFC_diag_a = hypre_CSRMatrixData(hypre_ParCSRMatrixDiag(AFC)); HYPRE_Int *AFC_offd_i = hypre_CSRMatrixI(hypre_ParCSRMatrixOffd(AFC)); HYPRE_Complex *AFC_offd_a = hypre_CSRMatrixData(hypre_ParCSRMatrixOffd(AFC)); HYPRE_GPU_LAUNCH( hypreGPUKernel_compute_dlam_dtmp, gDim, bDim, W_nr_of_rows, AFF_diag_i, AFF_diag_j, AFF_diag_a, AFF_offd_i, AFF_offd_a, rsFC, dlam, dtmp ); /* collect off-processor dtmp */ hypre_ParCSRCommPkg *comm_pkg = hypre_ParCSRMatrixCommPkg(AFF); hypre_ParCSRCommHandle *comm_handle; if (!comm_pkg) { hypre_MatvecCommPkgCreate(AFF); comm_pkg = hypre_ParCSRMatrixCommPkg(AFF); } dtmp_offd = hypre_TAlloc(HYPRE_Complex, hypre_CSRMatrixNumCols(hypre_ParCSRMatrixOffd(AFF)), HYPRE_MEMORY_DEVICE); HYPRE_Int num_sends = hypre_ParCSRCommPkgNumSends(comm_pkg); HYPRE_Int num_elmts_send = hypre_ParCSRCommPkgSendMapStart(comm_pkg, num_sends); HYPRE_Complex *send_buf = hypre_TAlloc(HYPRE_Complex, num_elmts_send, HYPRE_MEMORY_DEVICE); hypre_ParCSRCommPkgCopySendMapElmtsToDevice(comm_pkg); #if defined(HYPRE_USING_SYCL) hypreSycl_gather( hypre_ParCSRCommPkgDeviceSendMapElmts(comm_pkg), hypre_ParCSRCommPkgDeviceSendMapElmts(comm_pkg) + num_elmts_send, dtmp, send_buf ); #else HYPRE_THRUST_CALL( gather, hypre_ParCSRCommPkgDeviceSendMapElmts(comm_pkg), hypre_ParCSRCommPkgDeviceSendMapElmts(comm_pkg) + num_elmts_send, dtmp, send_buf ); #endif #if defined(HYPRE_USING_THRUST_NOSYNC) /* RL: make sure send_buf is ready before issuing GPU-GPU MPI */ if (hypre_GetGpuAwareMPI()) { hypre_ForceSyncComputeStream(); } #endif comm_handle = hypre_ParCSRCommHandleCreate_v2(1, comm_pkg, HYPRE_MEMORY_DEVICE, send_buf, HYPRE_MEMORY_DEVICE, dtmp_offd); hypre_ParCSRCommHandleDestroy(comm_handle); hypre_TFree(send_buf, HYPRE_MEMORY_DEVICE); hypre_GpuProfilingPopRange(); /* 4. Form D_tau */ /* 5. Form matrix ~{A_FF}, (return twAFF in AFF data structure ) */ /* 6. Form matrix ~{A_FC}, (return twAFC in AFC data structure) */ hypre_GpuProfilingPushRange("Compute interp matrix"); gDim = hypre_GetDefaultDeviceGridDimension(W_nr_of_rows, "warp", bDim); HYPRE_GPU_LAUNCH( hypreGPUKernel_compute_aff_afc_epe, gDim, bDim, W_nr_of_rows, AFF_diag_i, AFF_diag_j, AFF_diag_a, AFF_offd_i, AFF_offd_j, AFF_offd_a, AFC_diag_i, AFC_diag_a, AFC_offd_i, AFC_offd_a, rsW, dlam, dtmp, dtmp_offd ); hypre_TFree(rsW, HYPRE_MEMORY_DEVICE); hypre_TFree(rsFC, HYPRE_MEMORY_DEVICE); hypre_TFree(dlam, HYPRE_MEMORY_DEVICE); hypre_TFree(dtmp, HYPRE_MEMORY_DEVICE); hypre_TFree(dtmp_offd, HYPRE_MEMORY_DEVICE); hypre_GpuProfilingPopRange(); /* 7. Perform matrix-matrix multiplication */ hypre_GpuProfilingPushRange("Matrix-matrix mult"); W = hypre_ParCSRMatMatDevice(AFF, AFC); hypre_GpuProfilingPopRange(); hypre_ParCSRMatrixDestroy(AFF); hypre_ParCSRMatrixDestroy(AFC); /* 8. Construct P from matrix product W */ P_diag_nnz = hypre_CSRMatrixNumNonzeros(hypre_ParCSRMatrixDiag(W)) + hypre_ParCSRMatrixNumCols(W); P_diag_i = hypre_TAlloc(HYPRE_Int, A_nr_of_rows + 1, HYPRE_MEMORY_DEVICE); P_diag_j = hypre_TAlloc(HYPRE_Int, P_diag_nnz, HYPRE_MEMORY_DEVICE); P_diag_data = hypre_TAlloc(HYPRE_Complex, P_diag_nnz, HYPRE_MEMORY_DEVICE); P_offd_i = hypre_TAlloc(HYPRE_Int, A_nr_of_rows + 1, HYPRE_MEMORY_DEVICE); hypreDevice_extendWtoP( A_nr_of_rows, W_nr_of_rows, hypre_ParCSRMatrixNumCols(W), CF_marker, hypre_CSRMatrixNumNonzeros(hypre_ParCSRMatrixDiag(W)), hypre_CSRMatrixI(hypre_ParCSRMatrixDiag(W)), hypre_CSRMatrixJ(hypre_ParCSRMatrixDiag(W)), hypre_CSRMatrixData(hypre_ParCSRMatrixDiag(W)), P_diag_i, P_diag_j, P_diag_data, hypre_CSRMatrixI(hypre_ParCSRMatrixOffd(W)), P_offd_i ); // final P P = hypre_ParCSRMatrixCreate(hypre_ParCSRMatrixComm(A), hypre_ParCSRMatrixGlobalNumRows(A), hypre_ParCSRMatrixGlobalNumCols(W), hypre_ParCSRMatrixColStarts(A), hypre_ParCSRMatrixColStarts(W), hypre_CSRMatrixNumCols(hypre_ParCSRMatrixOffd(W)), P_diag_nnz, hypre_CSRMatrixNumNonzeros(hypre_ParCSRMatrixOffd(W))); hypre_CSRMatrixI(hypre_ParCSRMatrixDiag(P)) = P_diag_i; hypre_CSRMatrixJ(hypre_ParCSRMatrixDiag(P)) = P_diag_j; hypre_CSRMatrixData(hypre_ParCSRMatrixDiag(P)) = P_diag_data; hypre_CSRMatrixI(hypre_ParCSRMatrixOffd(P)) = P_offd_i; hypre_CSRMatrixJ(hypre_ParCSRMatrixOffd(P)) = hypre_CSRMatrixJ(hypre_ParCSRMatrixOffd(W)); hypre_CSRMatrixData(hypre_ParCSRMatrixOffd(P)) = hypre_CSRMatrixData(hypre_ParCSRMatrixOffd(W)); hypre_CSRMatrixJ(hypre_ParCSRMatrixOffd(W)) = NULL; hypre_CSRMatrixData(hypre_ParCSRMatrixOffd(W)) = NULL; hypre_CSRMatrixMemoryLocation(hypre_ParCSRMatrixDiag(P)) = HYPRE_MEMORY_DEVICE; hypre_CSRMatrixMemoryLocation(hypre_ParCSRMatrixOffd(P)) = HYPRE_MEMORY_DEVICE; hypre_ParCSRMatrixDeviceColMapOffd(P) = hypre_ParCSRMatrixDeviceColMapOffd(W); hypre_ParCSRMatrixColMapOffd(P) = hypre_ParCSRMatrixColMapOffd(W); hypre_ParCSRMatrixDeviceColMapOffd(W) = NULL; hypre_ParCSRMatrixColMapOffd(W) = NULL; hypre_ParCSRMatrixNumNonzeros(P) = hypre_ParCSRMatrixNumNonzeros(W) + hypre_ParCSRMatrixGlobalNumCols(W); hypre_ParCSRMatrixDNumNonzeros(P) = (HYPRE_Real) hypre_ParCSRMatrixNumNonzeros(P); hypre_GpuProfilingPushRange("Truncation"); if (trunc_factor != 0.0 || max_elmts > 0) { hypre_BoomerAMGInterpTruncationDevice(P, trunc_factor, max_elmts); hypre_ParCSRMatrixCompressOffdMapDevice(P); } hypre_GpuProfilingPopRange(); hypre_MatvecCommPkgCreate(P); #if defined(HYPRE_USING_SYCL) HYPRE_ONEDPL_CALL( std::replace_if, CF_marker, CF_marker + A_nr_of_rows, equal(-3), -1); #else HYPRE_THRUST_CALL( replace_if, CF_marker, CF_marker + A_nr_of_rows, equal(-3), -1); #endif *P_ptr = P; /* 9. Free memory */ hypre_ParCSRMatrixDestroy(W); return hypre_error_flag; } #endif // defined(HYPRE_USING_GPU) hypre-2.33.0/src/parcsr_ls/par_lr_restr.c000066400000000000000000002116021477326011500203570ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "_hypre_parcsr_ls.h" #include "_hypre_lapack.h" #include "_hypre_blas.h" // TODO : delete csrAi, csrAi_i, csrAi_j, // csrAi_a, csrAiT_i, csrAiT_j, csrAiT_a // Use // hypre_dense_topo_sort(HYPRE_Real *L, HYPRE_Int *ordering, HYPRE_Int n) // to get ordering for triangular solve. Can provide HYPRE_Int AIR_TOT_SOL_SIZE = 0; HYPRE_Int AIR_MAX_SOL_SIZE = 0; #define AIR_DEBUG 0 #define EPSILON 1e-18 #define EPSIMAC 1e-16 void hypre_fgmresT(HYPRE_Int n, HYPRE_Complex *A, HYPRE_Complex *b, HYPRE_Real tol, HYPRE_Int kdim, HYPRE_Complex *x, HYPRE_Real *relres, HYPRE_Int *iter, HYPRE_Int job); void hypre_ordered_GS(const HYPRE_Complex L[], const HYPRE_Complex rhs[], HYPRE_Complex x[], const HYPRE_Int n); /* HYPRE_Real air_time0 = 0.0; HYPRE_Real air_time_comm = 0.0; HYPRE_Real air_time1 = 0.0; HYPRE_Real air_time2 = 0.0; HYPRE_Real air_time3 = 0.0; HYPRE_Real air_time4 = 0.0; */ HYPRE_Int hypre_BoomerAMGBuildRestrDist2AIR( hypre_ParCSRMatrix *A, HYPRE_Int *CF_marker, hypre_ParCSRMatrix *S, HYPRE_BigInt *num_cpts_global, HYPRE_Int num_functions, HYPRE_Int *dof_func, HYPRE_Real filter_thresholdR, HYPRE_Int debug_flag, hypre_ParCSRMatrix **R_ptr, HYPRE_Int AIR1_5, HYPRE_Int is_triangular, HYPRE_Int gmres_switch) { HYPRE_UNUSED_VAR(debug_flag); /* HYPRE_Real t0 = hypre_MPI_Wtime(); */ MPI_Comm comm = hypre_ParCSRMatrixComm(A); hypre_ParCSRCommPkg *comm_pkg = hypre_ParCSRMatrixCommPkg(A); hypre_ParCSRCommHandle *comm_handle; hypre_ParCSRCommPkg *comm_pkg_SF = NULL; /* diag part of A */ hypre_CSRMatrix *A_diag = hypre_ParCSRMatrixDiag(A); HYPRE_Complex *A_diag_a = hypre_CSRMatrixData(A_diag); HYPRE_Int *A_diag_i = hypre_CSRMatrixI(A_diag); HYPRE_Int *A_diag_j = hypre_CSRMatrixJ(A_diag); /* off-diag part of A */ hypre_CSRMatrix *A_offd = hypre_ParCSRMatrixOffd(A); HYPRE_Complex *A_offd_a = hypre_CSRMatrixData(A_offd); HYPRE_Int *A_offd_i = hypre_CSRMatrixI(A_offd); HYPRE_Int *A_offd_j = hypre_CSRMatrixJ(A_offd); HYPRE_Int num_cols_A_offd = hypre_CSRMatrixNumCols(A_offd); HYPRE_BigInt *col_map_offd_A = hypre_ParCSRMatrixColMapOffd(A); /* Strength matrix S */ /* diag part of S */ hypre_CSRMatrix *S_diag = hypre_ParCSRMatrixDiag(S); HYPRE_Int *S_diag_i = hypre_CSRMatrixI(S_diag); HYPRE_Int *S_diag_j = hypre_CSRMatrixJ(S_diag); /* off-diag part of S */ hypre_CSRMatrix *S_offd = hypre_ParCSRMatrixOffd(S); HYPRE_Int *S_offd_i = hypre_CSRMatrixI(S_offd); HYPRE_Int *S_offd_j = hypre_CSRMatrixJ(S_offd); /* Restriction matrix R */ hypre_ParCSRMatrix *R; /* csr's */ hypre_CSRMatrix *R_diag; hypre_CSRMatrix *R_offd; /* arrays */ HYPRE_Complex *R_diag_data; HYPRE_Int *R_diag_i; HYPRE_Int *R_diag_j; HYPRE_Complex *R_offd_data; HYPRE_Int *R_offd_i; HYPRE_Int *R_offd_j; HYPRE_BigInt *col_map_offd_R; HYPRE_Int *tmp_map_offd = NULL; /* CF marker off-diag part */ HYPRE_Int *CF_marker_offd = NULL; /* func type off-diag part */ HYPRE_Int *dof_func_offd = NULL; HYPRE_BigInt big_i1, big_j1, big_k1; HYPRE_Int i, j, j1, j2, k, i1, i2, k1, k2, k3, rr, cc, ic, index, start, end, local_max_size, local_size, num_cols_offd_R; /*HYPRE_Int i6;*/ HYPRE_BigInt *FF2_offd; HYPRE_Int FF2_offd_len; /* LAPACK */ HYPRE_Complex *DAi, *Dbi, *Dxi; #if AIR_DEBUG HYPRE_Complex *TMPA, *TMPb, *TMPd; hypre_Vector *tmpv; #endif HYPRE_Int *Ipi, lapack_info, ione = 1, *RRi, *KKi; char charT = 'T'; /* if the size of local system is larger than gmres_switch, use GMRES */ char Aisol_method; HYPRE_Int gmresAi_maxit = 50; HYPRE_Real gmresAi_tol = 1e-3; HYPRE_Int my_id, num_procs; HYPRE_BigInt total_global_cpts/*, my_first_cpt*/; HYPRE_Int nnz_diag, nnz_offd, cnt_diag, cnt_offd; HYPRE_Int *Marker_diag, *Marker_offd; HYPRE_Int *Marker_diag_j, Marker_diag_count; HYPRE_Int num_sends, num_recvs, num_elems_send; /* local size, local num of C points */ HYPRE_Int n_fine = hypre_CSRMatrixNumRows(A_diag); HYPRE_Int n_cpts = 0; /* my column range */ HYPRE_BigInt col_start = hypre_ParCSRMatrixFirstRowIndex(A); HYPRE_BigInt col_end = col_start + (HYPRE_BigInt)n_fine; HYPRE_Int *send_buf_i; /* recv_SF means the Strong F-neighbors of offd elements in col_map_offd */ HYPRE_Int *send_SF_i, send_SF_jlen; HYPRE_BigInt *send_SF_j; HYPRE_BigInt *recv_SF_j; HYPRE_Int *recv_SF_i, *recv_SF_j2, recv_SF_jlen; HYPRE_Int *send_SF_jstarts, *recv_SF_jstarts; HYPRE_BigInt *recv_SF_offd_list; HYPRE_Int recv_SF_offd_list_len; HYPRE_Int *Mapper_recv_SF_offd_list, *Mapper_offd_A, *Marker_recv_SF_offd_list; HYPRE_Int *Marker_FF2_offd; HYPRE_Int *Marker_FF2_offd_j, Marker_FF2_offd_count; /* for communication of offd F and F^2 rows of A */ hypre_ParCSRCommPkg *comm_pkg_FF2_i, *comm_pkg_FF2_j = NULL; HYPRE_BigInt *send_FF2_j, *recv_FF2_j; HYPRE_Int num_sends_FF2, *send_FF2_i, send_FF2_ilen, send_FF2_jlen, num_recvs_FF2, *recv_FF2_i, recv_FF2_ilen, recv_FF2_jlen, *send_FF2_jstarts, *recv_FF2_jstarts; HYPRE_Complex *send_FF2_a, *recv_FF2_a; /* ghost rows: offd F and F2-pts */ hypre_CSRMatrix *A_offd_FF2 = NULL; /* HYPRE_Real tcomm = hypre_MPI_Wtime(); */ /* MPI size and rank*/ hypre_MPI_Comm_size(comm, &num_procs); hypre_MPI_Comm_rank(comm, &my_id); /*-------------- global number of C points and my start position */ /*my_first_cpt = num_cpts_global[0];*/ if (my_id == (num_procs - 1)) { total_global_cpts = num_cpts_global[1]; } hypre_MPI_Bcast(&total_global_cpts, 1, HYPRE_MPI_BIG_INT, num_procs - 1, comm); /*------------------------------------------------------------------- * Get the CF_marker data for the off-processor columns *-------------------------------------------------------------------*/ /* CF marker for the off-diag columns */ if (num_cols_A_offd) { CF_marker_offd = hypre_CTAlloc(HYPRE_Int, num_cols_A_offd, HYPRE_MEMORY_HOST); } /* function type indicator for the off-diag columns */ if (num_functions > 1 && num_cols_A_offd) { dof_func_offd = hypre_CTAlloc(HYPRE_Int, num_cols_A_offd, HYPRE_MEMORY_HOST); } /* if CommPkg of A is not present, create it */ if (!comm_pkg) { hypre_MatvecCommPkgCreate(A); comm_pkg = hypre_ParCSRMatrixCommPkg(A); } /* init markers to zeros */ Marker_diag = hypre_CTAlloc(HYPRE_Int, n_fine, HYPRE_MEMORY_HOST); Marker_offd = hypre_CTAlloc(HYPRE_Int, num_cols_A_offd, HYPRE_MEMORY_HOST); /* number of sends (number of procs) */ num_sends = hypre_ParCSRCommPkgNumSends(comm_pkg); /* number of recvs (number of procs) */ num_recvs = hypre_ParCSRCommPkgNumRecvs(comm_pkg); /* number of elements to send */ num_elems_send = hypre_ParCSRCommPkgSendMapStart(comm_pkg, num_sends); /* send buffer, of size send_map_starts[num_sends]), * i.e., number of entries to send */ send_buf_i = hypre_CTAlloc(HYPRE_Int, num_elems_send, HYPRE_MEMORY_HOST); /* copy CF markers of elements to send to buffer * RL: why copy them with two for loops? Why not just loop through all in one */ for (i = 0, index = 0; i < num_sends; i++) { /* start pos of elements sent to send_proc[i] */ start = hypre_ParCSRCommPkgSendMapStart(comm_pkg, i); /* loop through all elems to send_proc[i] */ for (j = start; j < hypre_ParCSRCommPkgSendMapStart(comm_pkg, i + 1); j++) { /* CF marker of send_map_elemts[j] */ send_buf_i[index++] = CF_marker[hypre_ParCSRCommPkgSendMapElmt(comm_pkg, j)]; } } /* create a handle to start communication. 11: for integer */ comm_handle = hypre_ParCSRCommHandleCreate(11, comm_pkg, send_buf_i, CF_marker_offd); /* destroy the handle to finish communication */ hypre_ParCSRCommHandleDestroy(comm_handle); /* do a similar communication for dof_func */ if (num_functions > 1) { for (i = 0, index = 0; i < num_sends; i++) { start = hypre_ParCSRCommPkgSendMapStart(comm_pkg, i); for (j = start; j < hypre_ParCSRCommPkgSendMapStart(comm_pkg, i + 1); j++) { send_buf_i[index++] = dof_func[hypre_ParCSRCommPkgSendMapElmt(comm_pkg, j)]; } } comm_handle = hypre_ParCSRCommHandleCreate(11, comm_pkg, send_buf_i, dof_func_offd); hypre_ParCSRCommHandleDestroy(comm_handle); } /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - * Send/Recv Offd F-neighbors' strong F-neighbors * F^2: OffdF - F *- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/ send_SF_i = hypre_CTAlloc(HYPRE_Int, num_elems_send, HYPRE_MEMORY_HOST); recv_SF_i = hypre_CTAlloc(HYPRE_Int, num_cols_A_offd + 1, HYPRE_MEMORY_HOST); /* for each F-elem to send, find the number of strong F-neighbors */ for (i = 0, send_SF_jlen = 0; i < num_elems_send; i++) { /* number of strong F-pts */ send_SF_i[i] = 0; /* elem i1 */ i1 = hypre_ParCSRCommPkgSendMapElmt(comm_pkg, i); /* ignore C-pts */ if (CF_marker[i1] >= 0) { continue; } /* diag part of row i1 */ for (j = S_diag_i[i1]; j < S_diag_i[i1 + 1]; j++) { if (CF_marker[S_diag_j[j]] < 0) { send_SF_i[i] ++; } } /* offd part of row i1 */ for (j = S_offd_i[i1]; j < S_offd_i[i1 + 1]; j++) { j1 = S_offd_j[j]; if (CF_marker_offd[j1] < 0) { send_SF_i[i] ++; } } /* add to the num of elems going to be sent */ send_SF_jlen += send_SF_i[i]; } /* do communication */ comm_handle = hypre_ParCSRCommHandleCreate(11, comm_pkg, send_SF_i, recv_SF_i + 1); /* ... */ hypre_ParCSRCommHandleDestroy(comm_handle); send_SF_j = hypre_CTAlloc(HYPRE_BigInt, send_SF_jlen, HYPRE_MEMORY_HOST); send_SF_jstarts = hypre_CTAlloc(HYPRE_Int, num_sends + 1, HYPRE_MEMORY_HOST); for (i = 0, i1 = 0; i < num_sends; i++) { /* start pos of elements sent to send_proc[i] */ start = hypre_ParCSRCommPkgSendMapStart(comm_pkg, i); /* 1-past-the-end pos */ end = hypre_ParCSRCommPkgSendMapStart(comm_pkg, i + 1); for (j = start; j < end; j++) { /* strong F-pt, j1 */ j1 = hypre_ParCSRCommPkgSendMapElmt(comm_pkg, j); /* ignore C-pts */ if (CF_marker[j1] >= 0) { continue; } /* diag part of row j1 */ for (k = S_diag_i[j1]; k < S_diag_i[j1 + 1]; k++) { k1 = S_diag_j[k]; if (CF_marker[k1] < 0) { send_SF_j[i1++] = col_start + (HYPRE_BigInt)k1; } } /* offd part of row j1 */ for (k = S_offd_i[j1]; k < S_offd_i[j1 + 1]; k++) { k1 = S_offd_j[k]; if (CF_marker_offd[k1] < 0) { send_SF_j[i1++] = col_map_offd_A[k1]; } } } send_SF_jstarts[i + 1] = i1; } hypre_assert(i1 == send_SF_jlen); /* adjust recv_SF_i to ptrs */ for (i = 1; i <= num_cols_A_offd; i++) { recv_SF_i[i] += recv_SF_i[i - 1]; } recv_SF_jlen = recv_SF_i[num_cols_A_offd]; recv_SF_j = hypre_CTAlloc(HYPRE_BigInt, recv_SF_jlen, HYPRE_MEMORY_HOST); recv_SF_jstarts = hypre_CTAlloc(HYPRE_Int, num_recvs + 1, HYPRE_MEMORY_HOST); for (i = 1; i <= num_recvs; i++) { start = hypre_ParCSRCommPkgRecvVecStart(comm_pkg, i); recv_SF_jstarts[i] = recv_SF_i[start]; } /* create a communication package for SF_j */ hypre_ParCSRCommPkgCreateAndFill(comm, num_recvs, hypre_ParCSRCommPkgRecvProcs(comm_pkg), recv_SF_jstarts, num_sends, hypre_ParCSRCommPkgSendProcs(comm_pkg), send_SF_jstarts, NULL, &comm_pkg_SF); /* do communication */ comm_handle = hypre_ParCSRCommHandleCreate(21, comm_pkg_SF, send_SF_j, recv_SF_j); /* ... */ hypre_ParCSRCommHandleDestroy(comm_handle); /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - * recv_SF_offd_list: a sorted list of offd elems in recv_SF_j *- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ recv_SF_offd_list = hypre_CTAlloc(HYPRE_BigInt, recv_SF_jlen, HYPRE_MEMORY_HOST); for (i = 0, j = 0; i < recv_SF_jlen; i++) { HYPRE_Int flag = 1; big_i1 = recv_SF_j[i]; /* offd */ if (big_i1 < col_start || big_i1 >= col_end) { if (AIR1_5) { flag = hypre_BigBinarySearch(col_map_offd_A, big_i1, num_cols_A_offd) != -1; } if (flag) { recv_SF_offd_list[j++] = big_i1; } } } /* remove redundancy after sorting */ hypre_BigQsort0(recv_SF_offd_list, 0, j - 1); for (i = 0, recv_SF_offd_list_len = 0; i < j; i++) { if (i == 0 || recv_SF_offd_list[i] != recv_SF_offd_list[i - 1]) { recv_SF_offd_list[recv_SF_offd_list_len++] = recv_SF_offd_list[i]; } } /* make a copy of recv_SF_j in which * adjust the offd indices corresponding to recv_SF_offd_list */ recv_SF_j2 = hypre_CTAlloc(HYPRE_Int, recv_SF_jlen, HYPRE_MEMORY_HOST); for (i = 0; i < recv_SF_jlen; i++) { big_i1 = recv_SF_j[i]; if (big_i1 < col_start || big_i1 >= col_end) { j = hypre_BigBinarySearch(recv_SF_offd_list, big_i1, recv_SF_offd_list_len); if (!AIR1_5) { hypre_assert(j >= 0 && j < recv_SF_offd_list_len); } recv_SF_j2[i] = j; } else { recv_SF_j2[i] = -1; } } /* mapping to col_map_offd_A */ Mapper_recv_SF_offd_list = hypre_CTAlloc(HYPRE_Int, recv_SF_offd_list_len, HYPRE_MEMORY_HOST); Marker_recv_SF_offd_list = hypre_CTAlloc(HYPRE_Int, recv_SF_offd_list_len, HYPRE_MEMORY_HOST); /* create a mapping from recv_SF_offd_list to col_map_offd_A for their intersections */ for (i = 0; i < recv_SF_offd_list_len; i++) { big_i1 = recv_SF_offd_list[i]; hypre_assert(big_i1 < col_start || big_i1 >= col_end); j = hypre_BigBinarySearch(col_map_offd_A, big_i1, num_cols_A_offd); /* mapping to col_map_offd_A, if not found equal to -1 */ Mapper_recv_SF_offd_list[i] = j; } /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - * Find offd F and F-F (F^2) neighboring points for C-pts *- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/ for (i = 0, FF2_offd_len = 0; i < n_fine; i++) { /* ignore F-points */ if (CF_marker[i] < 0) { continue; } /* diag(F)-offd(F) */ for (j = S_diag_i[i]; j < S_diag_i[i + 1]; j++) { j1 = S_diag_j[j]; /* if it is F */ if (CF_marker[j1] < 0) { /* go through its offd part */ for (k = S_offd_i[j1]; k < S_offd_i[j1 + 1]; k++) { k1 = S_offd_j[k]; if (CF_marker_offd[k1] < 0) { /* mark F pts */ if (!Marker_offd[k1]) { FF2_offd_len ++; Marker_offd[k1] = 1; } } } } } /* offd(F) and offd(F)-offd(F) * NOTE: we are working with two marker arrays here: Marker_offd and Marker_recv_SF_offd_list * which may have overlap. * So, we always check the first marker array */ for (j = S_offd_i[i]; j < S_offd_i[i + 1]; j++) { j1 = S_offd_j[j]; /* offd F pts */ if (CF_marker_offd[j1] < 0) { if (!Marker_offd[j1]) { FF2_offd_len ++; Marker_offd[j1] = 1; } /* offd(F)-offd(F), need to open recv_SF */ for (k = recv_SF_i[j1]; k < recv_SF_i[j1 + 1]; k++) { /* k1: global index */ big_k1 = recv_SF_j[k]; /* if k1 is not in my range */ if (big_k1 < col_start || big_k1 >= col_end) { /* index in recv_SF_offd_list */ k2 = recv_SF_j2[k]; if (AIR1_5 && k2 == -1) { continue; } hypre_assert(recv_SF_offd_list[k2] == big_k1); /* map to offd_A */ k3 = Mapper_recv_SF_offd_list[k2]; if (k3 >= 0) { if (!Marker_offd[k3]) { FF2_offd_len ++; Marker_offd[k3] = 1; } } else { if (!Marker_recv_SF_offd_list[k2]) { FF2_offd_len ++; Marker_recv_SF_offd_list[k2] = 1; } } } } } } } /* create a list of offd F, F2 points * and RESET the markers to ZEROs*/ FF2_offd = hypre_CTAlloc(HYPRE_BigInt, FF2_offd_len, HYPRE_MEMORY_HOST); for (i = 0, k = 0; i < num_cols_A_offd; i++) { if (Marker_offd[i]) { FF2_offd[k++] = col_map_offd_A[i]; Marker_offd[i] = 0; } } for (i = 0; i < recv_SF_offd_list_len; i++) { /* debug: if mapping exists, this marker should not be set */ if (Mapper_recv_SF_offd_list[i] >= 0) { hypre_assert(Marker_recv_SF_offd_list[i] == 0); } if (Marker_recv_SF_offd_list[i]) { big_i1 = recv_SF_offd_list[i]; hypre_assert(big_i1 < col_start || big_i1 >= col_end); FF2_offd[k++] = big_i1; Marker_recv_SF_offd_list[i] = 0; } } hypre_assert(k == FF2_offd_len); /* sort the list */ hypre_BigQsort0(FF2_offd, 0, FF2_offd_len - 1); /* there must be no repetition in FF2_offd */ for (i = 1; i < FF2_offd_len; i++) { hypre_assert(FF2_offd[i] != FF2_offd[i - 1]); } /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - * Create CommPkgs for exchanging offd F and F2 rows of A *- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ /* we will create TWO commPkg: one for row lengths and one for row data, * similar to what we have done above for SF_i, SF_j */ hypre_ParCSRFindExtendCommPkg(comm, hypre_ParCSRMatrixGlobalNumCols(A), hypre_ParCSRMatrixFirstColDiag(A), hypre_CSRMatrixNumCols(A_diag), hypre_ParCSRMatrixColStarts(A), hypre_ParCSRMatrixAssumedPartition(A), FF2_offd_len, FF2_offd, &comm_pkg_FF2_i); /* number of sends (#procs) */ num_sends_FF2 = hypre_ParCSRCommPkgNumSends(comm_pkg_FF2_i); /* number of rows to send */ send_FF2_ilen = hypre_ParCSRCommPkgSendMapStart(comm_pkg_FF2_i, num_sends_FF2); /* number of recvs (#procs) */ num_recvs_FF2 = hypre_ParCSRCommPkgNumRecvs(comm_pkg_FF2_i); /* number of rows to recv */ recv_FF2_ilen = hypre_ParCSRCommPkgRecvVecStart(comm_pkg_FF2_i, num_recvs_FF2); hypre_assert(FF2_offd_len == recv_FF2_ilen); send_FF2_i = hypre_CTAlloc(HYPRE_Int, send_FF2_ilen, HYPRE_MEMORY_HOST); recv_FF2_i = hypre_CTAlloc(HYPRE_Int, recv_FF2_ilen + 1, HYPRE_MEMORY_HOST); for (i = 0, send_FF2_jlen = 0; i < send_FF2_ilen; i++) { j = hypre_ParCSRCommPkgSendMapElmt(comm_pkg_FF2_i, i); for (k = A_diag_i[j]; k < A_diag_i[j + 1]; k++) { if (CF_marker[A_diag_j[k]] < 0) { send_FF2_i[i]++; } } if (num_procs > 1) { for (k = A_offd_i[j]; k < A_offd_i[j + 1]; k++) { if (CF_marker_offd[A_offd_j[k]] < 0) { send_FF2_i[i]++; } } } //send_FF2_i[i] = A_diag_i[j+1] - A_diag_i[j] + A_offd_i[j+1] - A_offd_i[j]; send_FF2_jlen += send_FF2_i[i]; } /* do communication */ comm_handle = hypre_ParCSRCommHandleCreate(11, comm_pkg_FF2_i, send_FF2_i, recv_FF2_i + 1); /* ... */ hypre_ParCSRCommHandleDestroy(comm_handle); send_FF2_j = hypre_CTAlloc(HYPRE_BigInt, send_FF2_jlen, HYPRE_MEMORY_HOST); send_FF2_a = hypre_CTAlloc(HYPRE_Complex, send_FF2_jlen, HYPRE_MEMORY_HOST); send_FF2_jstarts = hypre_CTAlloc(HYPRE_Int, num_sends_FF2 + 1, HYPRE_MEMORY_HOST); for (i = 0, i1 = 0; i < num_sends_FF2; i++) { start = hypre_ParCSRCommPkgSendMapStart(comm_pkg_FF2_i, i); end = hypre_ParCSRCommPkgSendMapStart(comm_pkg_FF2_i, i + 1); for (j = start; j < end; j++) { /* will send row j1 to send_proc[i] */ j1 = hypre_ParCSRCommPkgSendMapElmt(comm_pkg_FF2_i, j); /* open row j1 and fill ja and a */ for (k = A_diag_i[j1]; k < A_diag_i[j1 + 1]; k++) { HYPRE_Int k1 = A_diag_j[k]; if (CF_marker[k1] < 0) { send_FF2_j[i1] = col_start + k1; send_FF2_a[i1] = A_diag_a[k]; i1++; } } if (num_procs > 1) { for (k = A_offd_i[j1]; k < A_offd_i[j1 + 1]; k++) { HYPRE_Int k1 = A_offd_j[k]; if (CF_marker_offd[k1] < 0) { send_FF2_j[i1] = col_map_offd_A[k1]; send_FF2_a[i1] = A_offd_a[k]; i1++; } } } } send_FF2_jstarts[i + 1] = i1; } hypre_assert(i1 == send_FF2_jlen); /* adjust recv_FF2_i to ptrs */ for (i = 1; i <= recv_FF2_ilen; i++) { recv_FF2_i[i] += recv_FF2_i[i - 1]; } recv_FF2_jlen = recv_FF2_i[recv_FF2_ilen]; recv_FF2_j = hypre_CTAlloc(HYPRE_BigInt, recv_FF2_jlen, HYPRE_MEMORY_HOST); recv_FF2_a = hypre_CTAlloc(HYPRE_Complex, recv_FF2_jlen, HYPRE_MEMORY_HOST); recv_FF2_jstarts = hypre_CTAlloc(HYPRE_Int, num_recvs_FF2 + 1, HYPRE_MEMORY_HOST); for (i = 1; i <= num_recvs_FF2; i++) { start = hypre_ParCSRCommPkgRecvVecStart(comm_pkg_FF2_i, i); recv_FF2_jstarts[i] = recv_FF2_i[start]; } /* create a communication package for FF2_j */ hypre_ParCSRCommPkgCreateAndFill(comm, num_recvs_FF2, hypre_ParCSRCommPkgRecvProcs(comm_pkg_FF2_i), recv_FF2_jstarts, num_sends_FF2, hypre_ParCSRCommPkgSendProcs(comm_pkg_FF2_i), send_FF2_jstarts, NULL, &comm_pkg_FF2_j); /* do communication */ /* ja */ comm_handle = hypre_ParCSRCommHandleCreate(21, comm_pkg_FF2_j, send_FF2_j, recv_FF2_j); /* ... */ hypre_ParCSRCommHandleDestroy(comm_handle); /* a */ comm_handle = hypre_ParCSRCommHandleCreate( 1, comm_pkg_FF2_j, send_FF2_a, recv_FF2_a); /* ... */ hypre_ParCSRCommHandleDestroy(comm_handle); /* A_offd_FF2 is ready ! */ /* Careful! Wrong data type for number of columns ! */ //A_offd_FF2 = hypre_CSRMatrixCreate(recv_FF2_ilen, hypre_ParCSRMatrixGlobalNumCols(A), /* Careful! Wrong column size! Hopefully won't matter! */ A_offd_FF2 = hypre_CSRMatrixCreate(recv_FF2_ilen, recv_FF2_ilen, recv_FF2_jlen); hypre_CSRMatrixI (A_offd_FF2) = recv_FF2_i; hypre_CSRMatrixBigJ (A_offd_FF2) = recv_FF2_j; hypre_CSRMatrixData(A_offd_FF2) = recv_FF2_a; /* for (i6 = 0; i6 < num_procs; i6 ++) { if (i6 == my_id) { hypre_assert(hypre_CSRMatrixNumNonzeros(A_offd_FF2) == \ hypre_CSRMatrixI(A_offd_FF2)[hypre_CSRMatrixNumRows(A_offd_FF2)]); for (i = 0; i < hypre_CSRMatrixNumRows(A_offd_FF2); i++) { for (j = hypre_CSRMatrixI(A_offd_FF2)[i]; j < hypre_CSRMatrixI(A_offd_FF2)[i+1]; j++) { HYPRE_Int r = FF2_offd[i]; HYPRE_Int c = hypre_CSRMatrixJ(A_offd_FF2)[j]; hypre_assert(c >= 0 && c < hypre_CSRMatrixNumCols(A_offd_FF2)); HYPRE_Complex v = hypre_CSRMatrixData(A_offd_FF2)[j]; hypre_printf("%8d %8d % e\n", r, c, v); } } hypre_printf("\n\n"); } hypre_MPI_Barrier(hypre_MPI_COMM_WORLD); } */ /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - * FF2_offd contains all the offd indices and corresponds to matrix A_offd_FF2 * So, we are able to use indices in terms of FF2_offd to bookkeeping all offd * information. * [ FF2_offd is a subset of col_map_offd_A UNION recv_SF_offd_list ] * Mappings from col_map_offd_A and recv_SF_offd_list will be created * markers for FF2_offd will also be created * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ /* Mapping from col_map_offd_A */ Mapper_offd_A = hypre_CTAlloc(HYPRE_Int, num_cols_A_offd, HYPRE_MEMORY_HOST); for (i = 0; i < num_cols_A_offd; i++) { Mapper_offd_A[i] = hypre_BigBinarySearch(FF2_offd, col_map_offd_A[i], FF2_offd_len); } /* Mapping from recv_SF_offd_list, overwrite the old one*/ for (i = 0; i < recv_SF_offd_list_len; i++) { Mapper_recv_SF_offd_list[i] = hypre_BigBinarySearch(FF2_offd, recv_SF_offd_list[i], FF2_offd_len); } /* marker */ Marker_FF2_offd = hypre_CTAlloc(HYPRE_Int, FF2_offd_len, HYPRE_MEMORY_HOST); /* tcomm = hypre_MPI_Wtime() - tcomm; air_time_comm += tcomm; HYPRE_Real t1 = hypre_MPI_Wtime(); */ /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - * First Pass: Determine the nnz of R and the max local size *- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ /* nnz in diag and offd parts */ cnt_diag = 0; cnt_offd = 0; /* maximum size of local system: will allocate space of this size */ local_max_size = 0; for (i = 0; i < n_fine; i++) { HYPRE_Int MARK = i + 1; /* ignore F-points */ if (CF_marker[i] < 0) { continue; } /* size of the local dense problem */ local_size = 0; /* i is a C-pt, increase the number of C-pts */ n_cpts ++; /* diag part of row i */ for (j = S_diag_i[i]; j < S_diag_i[i + 1]; j++) { j1 = S_diag_j[j]; if (CF_marker[j1] >= 0) { continue; } /* j1, F: D1 */ if (Marker_diag[j1] != MARK) { Marker_diag[j1] = MARK; local_size ++; cnt_diag ++; } /* F^2: D1-D2. Open row j1 */ for (k = S_diag_i[j1]; k < S_diag_i[j1 + 1]; k++) { k1 = S_diag_j[k]; /* F-pt and never seen before */ if (CF_marker[k1] < 0 && Marker_diag[k1] != MARK) { Marker_diag[k1] = MARK; local_size ++; cnt_diag ++; } } /* F^2: D1-O2. Open row j1 */ for (k = S_offd_i[j1]; k < S_offd_i[j1 + 1]; k++) { k1 = S_offd_j[k]; if (CF_marker_offd[k1] < 0) { /* map to FF2_offd */ k2 = Mapper_offd_A[k1]; /* this mapping must be successful */ hypre_assert(k2 >= 0 && k2 < FF2_offd_len); /* an F-pt and never seen before */ if (Marker_FF2_offd[k2] != MARK) { Marker_FF2_offd[k2] = MARK; local_size ++; cnt_offd ++; } } } } /* offd part of row i */ for (j = S_offd_i[i]; j < S_offd_i[i + 1]; j++) { j1 = S_offd_j[j]; if (CF_marker_offd[j1] >= 0) { continue; } /* map to FF2_offd */ j2 = Mapper_offd_A[j1]; /* this mapping must be successful */ hypre_assert(j2 >= 0 && j2 < FF2_offd_len); /* j1, F: O1 */ if (Marker_FF2_offd[j2] != MARK) { Marker_FF2_offd[j2] = MARK; local_size ++; cnt_offd ++; } /* F^2: O1-D2, O1-O2 */ /* row j1 is an external row. check recv_SF for strong F-neighbors */ for (k = recv_SF_i[j1]; k < recv_SF_i[j1 + 1]; k++) { /* k1: global index */ big_k1 = recv_SF_j[k]; /* if big_k1 is in the diag part */ if (big_k1 >= col_start && big_k1 < col_end) { k3 = (HYPRE_Int)(big_k1 - col_start); hypre_assert(CF_marker[k3] < 0); if (Marker_diag[k3] != MARK) { Marker_diag[k3] = MARK; local_size ++; cnt_diag ++; } } else /* k1 is in the offd part */ { /* index in recv_SF_offd_list */ k2 = recv_SF_j2[k]; if (AIR1_5 && k2 == -1) { continue; } hypre_assert(recv_SF_offd_list[k2] == big_k1); /* map to FF2_offd */ k3 = Mapper_recv_SF_offd_list[k2]; /* this mapping must be successful */ hypre_assert(k3 >= 0 && k3 < FF2_offd_len); if (Marker_FF2_offd[k3] != MARK) { Marker_FF2_offd[k3] = MARK; local_size ++; cnt_offd ++; } } } } /* keep ths max size */ local_max_size = hypre_max(local_max_size, local_size); } /* for (i=0,...) */ /* t1 = hypre_MPI_Wtime() - t1; air_time1 += t1; */ /* this is because of the indentity matrix in C part * each C-pt has an entry 1.0 */ cnt_diag += n_cpts; nnz_diag = cnt_diag; nnz_offd = cnt_offd; /*------------- allocate arrays */ R_diag_i = hypre_CTAlloc(HYPRE_Int, n_cpts + 1, HYPRE_MEMORY_HOST); R_diag_j = hypre_CTAlloc(HYPRE_Int, nnz_diag, HYPRE_MEMORY_HOST); R_diag_data = hypre_CTAlloc(HYPRE_Complex, nnz_diag, HYPRE_MEMORY_HOST); /* not in ``if num_procs > 1'', * allocation needed even for empty CSR */ R_offd_i = hypre_CTAlloc(HYPRE_Int, n_cpts + 1, HYPRE_MEMORY_HOST); R_offd_j = hypre_CTAlloc(HYPRE_Int, nnz_offd, HYPRE_MEMORY_HOST); R_offd_data = hypre_CTAlloc(HYPRE_Complex, nnz_offd, HYPRE_MEMORY_HOST); /* redundant */ R_diag_i[0] = 0; R_offd_i[0] = 0; /* reset counters */ cnt_diag = 0; cnt_offd = 0; /* RESET marker arrays */ for (i = 0; i < n_fine; i++) { Marker_diag[i] = -1; } Marker_diag_j = hypre_CTAlloc(HYPRE_Int, n_fine, HYPRE_MEMORY_HOST); for (i = 0; i < FF2_offd_len; i++) { Marker_FF2_offd[i] = -1; } Marker_FF2_offd_j = hypre_CTAlloc(HYPRE_Int, FF2_offd_len, HYPRE_MEMORY_HOST); // TODO bs : what is this for? Should we remove? //for (i = 0; i < num_cols_A_offd; i++) //{ // Marker_offd[i] = -1; //} //for (i = 0; i < recv_SF_offd_list_len; i++) //{ // Marker_recv_SF_list[i] = -1; //} //printf("AIR: max local dense solve size %d\n", local_max_size); // Allocate the rhs and dense local matrix in column-major form (for LAPACK) DAi = hypre_CTAlloc(HYPRE_Complex, local_max_size * local_max_size, HYPRE_MEMORY_HOST); Dbi = hypre_CTAlloc(HYPRE_Complex, local_max_size, HYPRE_MEMORY_HOST); Dxi = hypre_CTAlloc(HYPRE_Complex, local_max_size, HYPRE_MEMORY_HOST); Ipi = hypre_CTAlloc(HYPRE_Int, local_max_size, HYPRE_MEMORY_HOST); // pivot matrix // Allocate memory for GMRES if it will be used HYPRE_Int kdim_max = hypre_min(gmresAi_maxit, local_max_size); if (gmres_switch < local_max_size) { hypre_fgmresT(local_max_size, NULL, NULL, 0.0, kdim_max, NULL, NULL, NULL, -1); } #if AIR_DEBUG /* FOR DEBUG */ TMPA = hypre_CTAlloc(HYPRE_Complex, local_max_size * local_max_size, HYPRE_MEMORY_HOST); TMPb = hypre_CTAlloc(HYPRE_Complex, local_max_size, HYPRE_MEMORY_HOST); TMPd = hypre_CTAlloc(HYPRE_Complex, local_max_size, HYPRE_MEMORY_HOST); #endif /*- - - - - - - - - - - - - - - - - - - - - - - - - * space to save row indices of the local problem, * if diag, save the local indices, * if offd, save the indices in FF2_offd, * since we will use it to access A_offd_FF2 *- - - - - - - - - - - - - - - - - - - - - - - - - */ RRi = hypre_CTAlloc(HYPRE_Int, local_max_size, HYPRE_MEMORY_HOST); /* indicators for RRi of being local (0) or offd (1) */ KKi = hypre_CTAlloc(HYPRE_Int, local_max_size, HYPRE_MEMORY_HOST); /* HYPRE_Real t2 = hypre_MPI_Wtime(); */ /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - * Second Pass: Populate R *- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ for (i = 0, ic = 0; i < n_fine; i++) { /* ignore F-points */ if (CF_marker[i] < 0) { continue; } Marker_diag_count = 0; Marker_FF2_offd_count = 0; /* size of Ai, bi */ local_size = 0; /* Access matrices for the First time, mark the points we want */ /* diag part of row i */ for (j = S_diag_i[i]; j < S_diag_i[i + 1]; j++) { j1 = S_diag_j[j]; if (CF_marker[j1] >= 0) { continue; } /* j1, F: D1 */ if (Marker_diag[j1] == -1) { RRi[local_size] = j1; KKi[local_size] = 0; Marker_diag_j[Marker_diag_count++] = j1; Marker_diag[j1] = local_size ++; } /* F^2: D1-D2. Open row j1 */ for (k = S_diag_i[j1]; k < S_diag_i[j1 + 1]; k++) { k1 = S_diag_j[k]; /* F-pt and never seen before */ if (CF_marker[k1] < 0 && Marker_diag[k1] == -1) { RRi[local_size] = k1; KKi[local_size] = 0; Marker_diag_j[Marker_diag_count++] = k1; Marker_diag[k1] = local_size ++; } } /* F^2: D1-O2. Open row j1 */ for (k = S_offd_i[j1]; k < S_offd_i[j1 + 1]; k++) { k1 = S_offd_j[k]; if (CF_marker_offd[k1] < 0) { /* map to FF2_offd */ k2 = Mapper_offd_A[k1]; /* this mapping must be successful */ hypre_assert(k2 >= 0 && k2 < FF2_offd_len); /* an F-pt and never seen before */ if (Marker_FF2_offd[k2] == -1) { /* NOTE: we save this mapped index */ RRi[local_size] = k2; KKi[local_size] = 1; Marker_FF2_offd_j[Marker_FF2_offd_count++] = k2; Marker_FF2_offd[k2] = local_size ++; } } } } /* offd part of row i */ if (num_procs > 1) { for (j = S_offd_i[i]; j < S_offd_i[i + 1]; j++) { j1 = S_offd_j[j]; if (CF_marker_offd[j1] >= 0) { continue; } /* map to FF2_offd */ j2 = Mapper_offd_A[j1]; /* this mapping must be successful */ hypre_assert(j2 >= 0 && j2 < FF2_offd_len); /* j1, F: O1 */ if (Marker_FF2_offd[j2] == -1) { /* NOTE: we save this mapped index */ RRi[local_size] = j2; KKi[local_size] = 1; Marker_FF2_offd_j[Marker_FF2_offd_count++] = j2; Marker_FF2_offd[j2] = local_size ++; } /* F^2: O1-D2, O1-O2 */ /* row j1 is an external row. check recv_SF for strong F-neighbors */ for (k = recv_SF_i[j1]; k < recv_SF_i[j1 + 1]; k++) { /* k1: global index */ big_k1 = recv_SF_j[k]; /* if big_k1 is in the diag part */ if (big_k1 >= col_start && big_k1 < col_end) { k3 = (HYPRE_Int)(big_k1 - col_start); hypre_assert(CF_marker[k3] < 0); if (Marker_diag[k3] == -1) { RRi[local_size] = k3; KKi[local_size] = 0; Marker_diag_j[Marker_diag_count++] = k3; Marker_diag[k3] = local_size ++; } } else /* k1 is in the offd part */ { /* index in recv_SF_offd_list */ k2 = recv_SF_j2[k]; if (AIR1_5 && k2 == -1) { continue; } hypre_assert(recv_SF_offd_list[k2] == big_k1); /* map to FF2_offd */ k3 = Mapper_recv_SF_offd_list[k2]; /* this mapping must be successful */ hypre_assert(k3 >= 0 && k3 < FF2_offd_len); if (Marker_FF2_offd[k3] == -1) { /* NOTE: we save this mapped index */ RRi[local_size] = k3; KKi[local_size] = 1; Marker_FF2_offd_j[Marker_FF2_offd_count++] = k3; Marker_FF2_offd[k3] = local_size ++; } } } } } hypre_assert(local_size <= local_max_size); /* Second, copy values to local system: Ai and bi from A */ /* now we have marked all rows/cols we want. next we extract the entries * we need from these rows and put them in Ai and bi*/ /* clear DAi and bi */ memset(DAi, 0, local_size * local_size * sizeof(HYPRE_Complex)); memset(Dxi, 0, local_size * sizeof(HYPRE_Complex)); memset(Dbi, 0, local_size * sizeof(HYPRE_Complex)); /* we will populate Ai row-by-row */ for (rr = 0; rr < local_size; rr++) { /* row index */ i1 = RRi[rr]; /* diag-offd indicator */ i2 = KKi[rr]; if (i2) /* i2 == 1, i1 is an offd row */ { /* open row i1, a remote row */ for (j = hypre_CSRMatrixI(A_offd_FF2)[i1]; j < hypre_CSRMatrixI(A_offd_FF2)[i1 + 1]; j++) { /* big_j1 is a global index */ big_j1 = hypre_CSRMatrixBigJ(A_offd_FF2)[j]; /* if big_j1 is in the diag part */ if (big_j1 >= col_start && big_j1 < col_end) { j2 = (HYPRE_Int)(big_j1 - col_start); /* if this col is marked with its local dense id */ if ((cc = Marker_diag[j2]) >= 0) { hypre_assert(CF_marker[j2] < 0); /* copy the value */ /* rr and cc: local dense ids */ HYPRE_Complex vv = hypre_CSRMatrixData(A_offd_FF2)[j]; DAi[rr + cc * local_size] = vv; } } else { /* big_j1 is in offd part, search it in FF2_offd */ j2 = hypre_BigBinarySearch(FF2_offd, big_j1, FF2_offd_len); /* if found */ if (j2 > -1) { /* if this col is marked with its local dense id */ if ((cc = Marker_FF2_offd[j2]) >= 0) { /* copy the value */ /* rr and cc: local dense ids */ HYPRE_Complex vv = hypre_CSRMatrixData(A_offd_FF2)[j]; DAi[rr + cc * local_size] = vv; } } } } } else /* i2 == 0, i1 is a local row */ { /* open row i1, a local row */ for (j = A_diag_i[i1]; j < A_diag_i[i1 + 1]; j++) { /* j1 is a local index */ j1 = A_diag_j[j]; /* if this col is marked with its local dense id */ if ((cc = Marker_diag[j1]) >= 0) { hypre_assert(CF_marker[j1] < 0); /* copy the value */ /* rr and cc: local dense ids */ HYPRE_Complex vv = A_diag_a[j]; DAi[rr + cc * local_size] = vv; } } if (num_procs > 1) { for (j = A_offd_i[i1]; j < A_offd_i[i1 + 1]; j++) { j1 = A_offd_j[j]; /* map to FF2_offd */ j2 = Mapper_offd_A[j1]; /* if found */ if (j2 > -1) { /* if this col is marked with its local dense id */ if ((cc = Marker_FF2_offd[j2]) >= 0) { hypre_assert(CF_marker_offd[j1] < 0); /* copy the value */ /* rr and cc: local dense ids */ HYPRE_Complex vv = A_offd_a[j]; DAi[rr + cc * local_size] = vv; } } } } } /* done with row rr */ } /* TODO bs: remove? { char Buf[4096]; char Buf2[4096]; hypre_MPI_Status stat; hypre_sprintf(Buf, "size %d\n", local_size); HYPRE_Int ii, jj; for (ii = 0; ii < local_size; ii++) { for (jj = 0; jj < local_size; jj++) { hypre_sprintf(Buf+strlen(Buf), "% .1f ", DAi[ii + jj * local_size]); } hypre_sprintf(Buf+strlen(Buf), "\n"); } hypre_sprintf(Buf+strlen(Buf), "\n"); if (my_id) { hypre_MPI_Send(Buf, 4096, hypre_MPI_CHAR, 0, 0, hypre_MPI_COMM_WORLD); } if (my_id == 0) { hypre_fprintf(stdout, "%s\n", Buf); for (i6 = 1; i6 < num_procs; i6++) { hypre_MPI_Recv(Buf2, 4096, hypre_MPI_CHAR, i6, 0, hypre_MPI_COMM_WORLD, &stat); hypre_fprintf(stdout, "%s\n", Buf2); } } } */ /* rhs bi: entries from row i of A */ rr = 0; /* diag part */ for (j = A_diag_i[i]; j < A_diag_i[i + 1]; j++) { i1 = A_diag_j[j]; if ((cc = Marker_diag[i1]) >= 0) { hypre_assert(i1 == RRi[cc] && KKi[cc] == 0); /* Note the sign change */ Dbi[cc] = -A_diag_a[j]; rr++; } } /* if parallel, offd part */ if (num_procs > 1) { for (j = A_offd_i[i]; j < A_offd_i[i + 1]; j++) { i1 = A_offd_j[j]; i2 = Mapper_offd_A[i1]; if (i2 > -1) { if ((cc = Marker_FF2_offd[i2]) >= 0) { hypre_assert(i2 == RRi[cc] && KKi[cc] == 1); /* Note the sign change */ Dbi[cc] = -A_offd_a[j]; rr++; } } } } hypre_assert(rr <= local_size); /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - * We have Ai and bi built. Solve the linear system by: * - forward solve for triangular matrix * - LU factorization (LAPACK) for local_size <= gmres_switch * - Dense GMRES for local_size > gmres_switch *- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/ Aisol_method = local_size <= gmres_switch ? 'L' : 'G'; if (local_size > 0) { if (is_triangular) { hypre_ordered_GS(DAi, Dbi, Dxi, local_size); #if AIR_DEBUG HYPRE_Real alp = -1.0, err; colmaj_mvT(DAi, Dxi, TMPd, local_size); hypre_daxpy(&local_size, &alp, Dbi, &ione, TMPd, &ione); err = hypre_dnrm2(&local_size, TMPd, &ione); if (err > 1e-8) { hypre_printf("triangular solve res: %e\n", err); exit(0); } #endif } // Solve using LAPACK and LU factorization else if (Aisol_method == 'L') { #if AIR_DEBUG memcpy(TMPA, DAi, local_size * local_size * sizeof(HYPRE_Complex)); memcpy(TMPb, Dbi, local_size * sizeof(HYPRE_Complex)); #endif hypre_dgetrf(&local_size, &local_size, DAi, &local_size, Ipi, &lapack_info); hypre_assert(lapack_info == 0); if (lapack_info == 0) { /* solve A_i^T x_i = b_i, * solution is saved in b_i on return */ hypre_dgetrs(&charT, &local_size, &ione, DAi, &local_size, Ipi, Dbi, &local_size, &lapack_info); hypre_assert(lapack_info == 0); } #if AIR_DEBUG HYPRE_Real alp = 1.0, bet = 0.0, err; hypre_dgemv(&charT, &local_size, &local_size, &alp, TMPA, &local_size, Dbi, &ione, &bet, TMPd, &ione); alp = -1.0; hypre_daxpy(&local_size, &alp, TMPb, &ione, TMPd, &ione); err = hypre_dnrm2(&local_size, TMPd, &ione); if (err > 1e-8) { hypre_printf("dense: local res norm %e\n", err); exit(0); } #endif } // Solve by GMRES else { HYPRE_Real gmresAi_res; HYPRE_Int gmresAi_niter; HYPRE_Int kdim = hypre_min(gmresAi_maxit, local_size); hypre_fgmresT(local_size, DAi, Dbi, gmresAi_tol, kdim, Dxi, &gmresAi_res, &gmresAi_niter, 0); if (gmresAi_res > gmresAi_tol) { hypre_printf("gmres/jacobi not converge to %e: final_res %e\n", gmresAi_tol, gmresAi_res); } #if AIR_DEBUG HYPRE_Real err, nrmb; colmaj_mvT(DAi, Dxi, TMPd, local_size); HYPRE_Real alp = -1.0; nrmb = hypre_dnrm2(&local_size, Dbi, &ione); hypre_daxpy(&local_size, &alp, Dbi, &ione, TMPd, &ione); err = hypre_dnrm2(&local_size, TMPd, &ione); if (err / nrmb > gmresAi_tol) { hypre_printf("GMRES/Jacobi: res norm %e, nrmb %e, relative %e\n", err, nrmb, err / nrmb); hypre_printf("GMRES/Jacobi: relative %e\n", gmresAi_res); exit(0); } #endif } } HYPRE_Complex *Soli = (is_triangular || (Aisol_method == 'G')) ? Dxi : Dbi; /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - * Now we are ready to fill this row of R *- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/ for (rr = 0; rr < local_size; rr++) { /* row index */ i1 = RRi[rr]; /* diag-offd indicator */ i2 = KKi[rr]; if (i2) /* offd */ { hypre_assert(Marker_FF2_offd[i1] == rr); /* col idx: use the index in FF2_offd, * and you will see why later (very soon!) */ R_offd_j[cnt_offd] = i1; /* copy the value */ R_offd_data[cnt_offd++] = Soli[rr]; } else /* diag */ { hypre_assert(Marker_diag[i1] == rr); /* col idx: use local index i1 */ R_diag_j[cnt_diag] = i1; /* copy the value */ R_diag_data[cnt_diag++] = Soli[rr]; } } /* don't forget the identity to this row */ /* global col idx of this entry is ``col_start + i'' */ R_diag_j[cnt_diag] = i; R_diag_data[cnt_diag++] = 1.0; /* row ptr of the next row */ R_diag_i[ic + 1] = cnt_diag; R_offd_i[ic + 1] = cnt_offd; /* RESET marker arrays */ for (j = 0; j < Marker_diag_count; j++) { Marker_diag[Marker_diag_j[j]] = -1; } for (j = 0; j < Marker_FF2_offd_count; j++) { Marker_FF2_offd[Marker_FF2_offd_j[j]] = -1; } /* next C-pt */ ic++; } /* outermost loop, for (i=0,...), for each C-pt find restriction */ /* hypre_MPI_Barrier(comm); t2 = hypre_MPI_Wtime() - t2; air_time2 += t2; */ hypre_assert(ic == n_cpts); hypre_assert(cnt_diag == nnz_diag); hypre_assert(cnt_offd == nnz_offd); /* HYPRE_Real t3 = hypre_MPI_Wtime(); */ /* num of cols in the offd part of R */ num_cols_offd_R = 0; /* to this point, Marker_FF2_offd should be all -1 */ /* for (i = 0; i < FF2_offd_len; i++) { hypre_assert(Marker_FF2_offd[i] == - 1); } */ for (i = 0; i < nnz_offd; i++) { i1 = R_offd_j[i]; if (Marker_FF2_offd[i1] == -1) { num_cols_offd_R++; Marker_FF2_offd[i1] = 1; } } tmp_map_offd = hypre_CTAlloc(HYPRE_Int, num_cols_offd_R, HYPRE_MEMORY_HOST); col_map_offd_R = hypre_CTAlloc(HYPRE_BigInt, num_cols_offd_R, HYPRE_MEMORY_HOST); /* col_map_offd_R: the col indices of the offd of R * we first keep them be the local indices in FF2_offd [will be changed] */ for (i = 0, i1 = 0; i < FF2_offd_len; i++) { if (Marker_FF2_offd[i] == 1) { tmp_map_offd[i1++] = i; } } hypre_assert(i1 == num_cols_offd_R); //printf("FF2_offd_len %d, num_cols_offd_R %d\n", FF2_offd_len, num_cols_offd_R); /* now, adjust R_offd_j to local idx w.r.t FF2_offd * by searching */ for (i = 0; i < nnz_offd; i++) { i1 = R_offd_j[i]; k1 = hypre_BinarySearch(tmp_map_offd, i1, num_cols_offd_R); /* searching must succeed */ hypre_assert(k1 >= 0 && k1 < num_cols_offd_R); /* change index */ R_offd_j[i] = k1; } /* change col_map_offd_R to global ids [guaranteed to be sorted] */ for (i = 0; i < num_cols_offd_R; i++) { col_map_offd_R[i] = FF2_offd[tmp_map_offd[i]]; } /* Now, we should have everything of Parcsr matrix R */ R = hypre_ParCSRMatrixCreate(comm, total_global_cpts, /* global num of rows */ hypre_ParCSRMatrixGlobalNumRows(A), /* global num of cols */ num_cpts_global, /* row_starts */ hypre_ParCSRMatrixRowStarts(A), /* col_starts */ num_cols_offd_R, /* num cols offd */ nnz_diag, nnz_offd); R_diag = hypre_ParCSRMatrixDiag(R); hypre_CSRMatrixData(R_diag) = R_diag_data; hypre_CSRMatrixI(R_diag) = R_diag_i; hypre_CSRMatrixJ(R_diag) = R_diag_j; R_offd = hypre_ParCSRMatrixOffd(R); hypre_CSRMatrixData(R_offd) = R_offd_data; hypre_CSRMatrixI(R_offd) = R_offd_i; hypre_CSRMatrixJ(R_offd) = R_offd_j; hypre_ParCSRMatrixColMapOffd(R) = col_map_offd_R; /* t3 = hypre_MPI_Wtime() - t3; air_time3 += t3; HYPRE_Real t4 = hypre_MPI_Wtime(); */ /* create CommPkg of R */ hypre_ParCSRMatrixAssumedPartition(R) = hypre_ParCSRMatrixAssumedPartition(A); hypre_ParCSRMatrixOwnsAssumedPartition(R) = 0; hypre_MatvecCommPkgCreate(R); /* t4 = hypre_MPI_Wtime() - t4; air_time4 += t4; */ /* Filter small entries from R */ if (filter_thresholdR > 0) { hypre_ParCSRMatrixDropSmallEntries(R, filter_thresholdR, -1); } *R_ptr = R; hypre_TFree(tmp_map_offd, HYPRE_MEMORY_HOST); hypre_TFree(CF_marker_offd, HYPRE_MEMORY_HOST); hypre_TFree(dof_func_offd, HYPRE_MEMORY_HOST); hypre_TFree(Marker_diag, HYPRE_MEMORY_HOST); hypre_TFree(Marker_offd, HYPRE_MEMORY_HOST); hypre_TFree(send_buf_i, HYPRE_MEMORY_HOST); hypre_TFree(send_SF_i, HYPRE_MEMORY_HOST); hypre_TFree(recv_SF_i, HYPRE_MEMORY_HOST); hypre_TFree(send_SF_j, HYPRE_MEMORY_HOST); hypre_TFree(send_SF_jstarts, HYPRE_MEMORY_HOST); hypre_TFree(recv_SF_j, HYPRE_MEMORY_HOST); hypre_TFree(recv_SF_jstarts, HYPRE_MEMORY_HOST); hypre_TFree(comm_pkg_SF, HYPRE_MEMORY_HOST); hypre_TFree(recv_SF_offd_list, HYPRE_MEMORY_HOST); hypre_TFree(recv_SF_j2, HYPRE_MEMORY_HOST); hypre_TFree(Mapper_recv_SF_offd_list, HYPRE_MEMORY_HOST); hypre_TFree(Marker_recv_SF_offd_list, HYPRE_MEMORY_HOST); hypre_TFree(FF2_offd, HYPRE_MEMORY_HOST); hypre_TFree(send_FF2_i, HYPRE_MEMORY_HOST); /* hypre_TFree(recv_FF2_i); */ hypre_TFree(send_FF2_j, HYPRE_MEMORY_HOST); hypre_TFree(send_FF2_a, HYPRE_MEMORY_HOST); hypre_TFree(send_FF2_jstarts, HYPRE_MEMORY_HOST); /* hypre_TFree(recv_FF2_j); */ /* hypre_TFree(recv_FF2_a); */ hypre_CSRMatrixDestroy(A_offd_FF2); hypre_TFree(recv_FF2_jstarts, HYPRE_MEMORY_HOST); hypre_MatvecCommPkgDestroy(comm_pkg_FF2_i); hypre_TFree(comm_pkg_FF2_j, HYPRE_MEMORY_HOST); hypre_TFree(Mapper_offd_A, HYPRE_MEMORY_HOST); hypre_TFree(Marker_FF2_offd, HYPRE_MEMORY_HOST); hypre_TFree(Marker_diag_j, HYPRE_MEMORY_HOST); hypre_TFree(Marker_FF2_offd_j, HYPRE_MEMORY_HOST); hypre_TFree(DAi, HYPRE_MEMORY_HOST); hypre_TFree(Dbi, HYPRE_MEMORY_HOST); hypre_TFree(Dxi, HYPRE_MEMORY_HOST); hypre_TFree(Ipi, HYPRE_MEMORY_HOST); #if AIR_DEBUG hypre_TFree(TMPA, HYPRE_MEMORY_HOST); hypre_TFree(TMPb, HYPRE_MEMORY_HOST); hypre_TFree(TMPd, HYPRE_MEMORY_HOST); hypre_SeqVectorDestroy(tmpv); #endif hypre_TFree(RRi, HYPRE_MEMORY_HOST); hypre_TFree(KKi, HYPRE_MEMORY_HOST); if (gmres_switch < local_max_size) { hypre_fgmresT(0, NULL, NULL, 0.0, 0, NULL, NULL, NULL, -2); } /* t0 = hypre_MPI_Wtime() - t0; air_time0 += t0; */ return 0; } HYPRE_Int hypre_BoomerAMGBuildRestrNeumannAIRHost( hypre_ParCSRMatrix *A, HYPRE_Int *CF_marker, HYPRE_BigInt *num_cpts_global, HYPRE_Int num_functions, HYPRE_Int *dof_func, HYPRE_Int NeumannDeg, HYPRE_Real strong_thresholdR, HYPRE_Real filter_thresholdR, HYPRE_Int debug_flag, hypre_ParCSRMatrix **R_ptr) { HYPRE_UNUSED_VAR(num_functions); HYPRE_UNUSED_VAR(dof_func); HYPRE_UNUSED_VAR(debug_flag); /* HYPRE_Real t0 = hypre_MPI_Wtime(); */ MPI_Comm comm = hypre_ParCSRMatrixComm(A); hypre_ParCSRCommHandle *comm_handle; /* diag part of A */ hypre_CSRMatrix *A_diag = hypre_ParCSRMatrixDiag(A); /* Restriction matrix R and CSR's */ hypre_ParCSRMatrix *R; hypre_CSRMatrix *R_diag; hypre_CSRMatrix *R_offd; /* arrays */ HYPRE_Complex *R_diag_a; HYPRE_Int *R_diag_i; HYPRE_Int *R_diag_j; HYPRE_Complex *R_offd_a; HYPRE_Int *R_offd_i; HYPRE_Int *R_offd_j; HYPRE_BigInt *col_map_offd_R; HYPRE_Int i, j, j1, ic, num_cols_offd_R; HYPRE_Int my_id, num_procs; HYPRE_BigInt total_global_cpts/*, my_first_cpt*/; HYPRE_Int nnz_diag, nnz_offd, cnt_diag, cnt_offd; HYPRE_BigInt *send_buf_i; /* local size */ HYPRE_Int n_fine = hypre_CSRMatrixNumRows(A_diag); HYPRE_BigInt col_start = hypre_ParCSRMatrixFirstRowIndex(A); /* MPI size and rank*/ hypre_MPI_Comm_size(comm, &num_procs); hypre_MPI_Comm_rank(comm, &my_id); HYPRE_MemoryLocation memory_location_R = hypre_ParCSRMatrixMemoryLocation(A); /*-------------- global number of C points and my start position */ /*my_first_cpt = num_cpts_global[0];*/ if (my_id == (num_procs - 1)) { total_global_cpts = num_cpts_global[1]; } hypre_MPI_Bcast(&total_global_cpts, 1, HYPRE_MPI_BIG_INT, num_procs - 1, comm); /*------------------------------------------------------------------- * Get the CF_marker data for the off-processor columns *-------------------------------------------------------------------*/ /* CF marker for the off-diag columns */ #if 0 if (num_cols_A_offd) { CF_marker_offd = hypre_CTAlloc(HYPRE_Int, num_cols_A_offd, HYPRE_MEMORY_HOST); } /* function type indicator for the off-diag columns */ if (num_functions > 1 && num_cols_A_offd) { dof_func_offd = hypre_CTAlloc(HYPRE_Int, num_cols_A_offd, HYPRE_MEMORY_HOST); } /* if CommPkg of A is not present, create it */ if (!comm_pkg) { hypre_MatvecCommPkgCreate(A); comm_pkg = hypre_ParCSRMatrixCommPkg(A); } /* number of sends (number of procs) */ num_sends = hypre_ParCSRCommPkgNumSends(comm_pkg); /* number of recvs (number of procs) */ num_recvs = hypre_ParCSRCommPkgNumRecvs(comm_pkg); /* number of elements to send */ num_elems_send = hypre_ParCSRCommPkgSendMapStart(comm_pkg, num_sends); /* send buffer, of size send_map_starts[num_sends]), * i.e., number of entries to send */ send_buf_i = hypre_CTAlloc(HYPRE_Int, num_elems_send, HYPRE_MEMORY_HOST); /* copy CF markers of elements to send to buffer */ for (i = 0; i < num_elems_send; i++) { send_buf_i[i] = CF_marker[hypre_ParCSRCommPkgSendMapElmt(comm_pkg, i)]; } /* create a handle to start communication. 11: for integer */ comm_handle = hypre_ParCSRCommHandleCreate(11, comm_pkg, send_buf_i, CF_marker_offd); /* destroy the handle to finish communication */ hypre_ParCSRCommHandleDestroy(comm_handle); /* do a similar communication for dof_func */ if (num_functions > 1) { for (i = 0; i < num_elems_send; i++) { send_buf_i[i] = dof_func[hypre_ParCSRCommPkgSendMapElmt(comm_pkg, i)]; } comm_handle = hypre_ParCSRCommHandleCreate(11, comm_pkg, send_buf_i, dof_func_offd); hypre_ParCSRCommHandleDestroy(comm_handle); } /* init markers to zeros */ Marker_diag = hypre_CTAlloc(HYPRE_Int, n_fine, HYPRE_MEMORY_HOST); Marker_offd = hypre_CTAlloc(HYPRE_Int, num_cols_A_offd, HYPRE_MEMORY_HOST); #endif hypre_ParCSRMatrix *AFF, *ACF, *X, *X2, *Z, *Z2; hypre_ParCSRMatrixExtractSubmatrixFC(A, CF_marker, num_cpts_global, "FF", &AFF, strong_thresholdR); hypre_ParCSRMatrixExtractSubmatrixFC(A, CF_marker, num_cpts_global, "CF", &ACF, strong_thresholdR); /* A_FF := I - D^{-1}*A_FF */ hypre_CSRMatrix *AFF_diag = hypre_ParCSRMatrixDiag(AFF); hypre_CSRMatrix *AFF_offd = hypre_ParCSRMatrixOffd(AFF); HYPRE_Complex *AFF_diag_a = hypre_CSRMatrixData(AFF_diag); HYPRE_Int *AFF_diag_i = hypre_CSRMatrixI(AFF_diag); HYPRE_Int *AFF_diag_j = hypre_CSRMatrixJ(AFF_diag); HYPRE_Complex *AFF_offd_a = hypre_CSRMatrixData(AFF_offd); HYPRE_Int *AFF_offd_i = hypre_CSRMatrixI(AFF_offd); HYPRE_Int *AFF_offd_j = hypre_CSRMatrixJ(AFF_offd); HYPRE_Int n_fpts = hypre_CSRMatrixNumRows(AFF_diag); HYPRE_Int n_cpts = n_fine - n_fpts; hypre_assert(n_cpts == hypre_CSRMatrixNumRows(hypre_ParCSRMatrixDiag(ACF))); HYPRE_Int *Fmap = hypre_TAlloc(HYPRE_Int, n_fpts, HYPRE_MEMORY_HOST); /* map from F-pts to all points */ for (i = 0, j = 0; i < n_fine; i++) { if (CF_marker[i] < 0) { Fmap[j++] = i; } } hypre_assert(j == n_fpts); HYPRE_Complex *diag_entries = hypre_TAlloc(HYPRE_Complex, n_fpts, HYPRE_MEMORY_HOST); for (i = 0; i < n_fpts; i++) { /* find the diagonal element and store inverse */ for (j = AFF_diag_i[i]; j < AFF_diag_i[i + 1]; j++) { if (AFF_diag_j[j] == i) { diag_entries[i] = 1.0 / AFF_diag_a[j]; AFF_diag_a[j] = 0.0; break; } } for (j = AFF_diag_i[i]; j < AFF_diag_i[i + 1]; j++) { AFF_diag_a[j] *= -diag_entries[i]; } if (num_procs > 1) { for (j = AFF_offd_i[i]; j < AFF_offd_i[i + 1]; j++) { hypre_assert( hypre_ParCSRMatrixColMapOffd(AFF)[AFF_offd_j[j]] != \ i + hypre_ParCSRMatrixFirstRowIndex(AFF) ); AFF_offd_a[j] *= -diag_entries[i]; } } } /* Z = Acf * (I + N + N^2 + ... + N^k] * D^{-1} * N = I - D^{-1} * A_FF (computed above) * the last D^{-1} will not be done here (but later) */ if (NeumannDeg < 1) { Z = ACF; } else if (NeumannDeg == 1) { X = hypre_ParMatmul(ACF, AFF); hypre_ParCSRMatrixAdd(1.0, ACF, 1.0, X, &Z); hypre_ParCSRMatrixDestroy(X); } else { X = hypre_ParMatmul(AFF, AFF); hypre_ParCSRMatrixAdd(1.0, AFF, 1.0, X, &Z); for (i = 2; i < NeumannDeg; i++) { X2 = hypre_ParMatmul(X, AFF); hypre_ParCSRMatrixAdd(1.0, Z, 1.0, X2, &Z2); hypre_ParCSRMatrixDestroy(X); hypre_ParCSRMatrixDestroy(Z); Z = Z2; X = X2; } hypre_ParCSRMatrixDestroy(X); X = hypre_ParMatmul(ACF, Z); hypre_ParCSRMatrixDestroy(Z); hypre_ParCSRMatrixAdd(1.0, ACF, 1.0, X, &Z); hypre_ParCSRMatrixDestroy(X); } hypre_ParCSRMatrixDestroy(AFF); if (NeumannDeg >= 1) { hypre_ParCSRMatrixDestroy(ACF); } hypre_CSRMatrix *Z_diag = hypre_ParCSRMatrixDiag(Z); hypre_CSRMatrix *Z_offd = hypre_ParCSRMatrixOffd(Z); HYPRE_Complex *Z_diag_a = hypre_CSRMatrixData(Z_diag); HYPRE_Int *Z_diag_i = hypre_CSRMatrixI(Z_diag); HYPRE_Int *Z_diag_j = hypre_CSRMatrixJ(Z_diag); HYPRE_Complex *Z_offd_a = hypre_CSRMatrixData(Z_offd); HYPRE_Int *Z_offd_i = hypre_CSRMatrixI(Z_offd); HYPRE_Int *Z_offd_j = hypre_CSRMatrixJ(Z_offd); HYPRE_Int num_cols_offd_Z = hypre_CSRMatrixNumCols(Z_offd); /* HYPRE_BigInt *col_map_offd_Z = hypre_ParCSRMatrixColMapOffd(Z); */ /* send and recv diagonal entries (wrt Z) */ HYPRE_Complex *diag_entries_offd = hypre_TAlloc(HYPRE_Complex, num_cols_offd_Z, HYPRE_MEMORY_HOST); hypre_ParCSRCommPkg *comm_pkg_Z = hypre_ParCSRMatrixCommPkg(Z); HYPRE_Int num_sends_Z = hypre_ParCSRCommPkgNumSends(comm_pkg_Z); HYPRE_Int num_elems_send_Z = hypre_ParCSRCommPkgSendMapStart(comm_pkg_Z, num_sends_Z); HYPRE_Complex *send_buf_Z = hypre_TAlloc(HYPRE_Complex, num_elems_send_Z, HYPRE_MEMORY_HOST); for (i = 0; i < num_elems_send_Z; i++) { send_buf_Z[i] = diag_entries[hypre_ParCSRCommPkgSendMapElmt(comm_pkg_Z, i)]; } comm_handle = hypre_ParCSRCommHandleCreate(1, comm_pkg_Z, send_buf_Z, diag_entries_offd); hypre_ParCSRCommHandleDestroy(comm_handle); /* send and recv Fmap (wrt Z): global */ HYPRE_BigInt *Fmap_offd_global = hypre_TAlloc(HYPRE_BigInt, num_cols_offd_Z, HYPRE_MEMORY_HOST); send_buf_i = hypre_TAlloc(HYPRE_BigInt, num_elems_send_Z, HYPRE_MEMORY_HOST); for (i = 0; i < num_elems_send_Z; i++) { send_buf_i[i] = Fmap[hypre_ParCSRCommPkgSendMapElmt(comm_pkg_Z, i)] + col_start; } comm_handle = hypre_ParCSRCommHandleCreate(21, comm_pkg_Z, send_buf_i, Fmap_offd_global); hypre_ParCSRCommHandleDestroy(comm_handle); nnz_diag = hypre_CSRMatrixNumNonzeros(Z_diag) + n_cpts; nnz_offd = hypre_CSRMatrixNumNonzeros(Z_offd); /*------------- allocate arrays */ R_diag_i = hypre_CTAlloc(HYPRE_Int, n_cpts + 1, memory_location_R); R_diag_j = hypre_CTAlloc(HYPRE_Int, nnz_diag, memory_location_R); R_diag_a = hypre_CTAlloc(HYPRE_Complex, nnz_diag, memory_location_R); /* not in ``if num_procs > 1'', * allocation needed even for empty CSR */ R_offd_i = hypre_CTAlloc(HYPRE_Int, n_cpts + 1, memory_location_R); R_offd_j = hypre_CTAlloc(HYPRE_Int, nnz_offd, memory_location_R); R_offd_a = hypre_CTAlloc(HYPRE_Complex, nnz_offd, memory_location_R); /* redundant */ R_diag_i[0] = 0; R_offd_i[0] = 0; /* reset counters */ cnt_diag = 0; cnt_offd = 0; for (i = 0, ic = 0; i < n_fine; i++) { /* ignore F-points */ if (CF_marker[i] < 0) { continue; } for (j = Z_diag_i[ic]; j < Z_diag_i[ic + 1]; j++) { j1 = Z_diag_j[j]; R_diag_j[cnt_diag] = Fmap[j1]; R_diag_a[cnt_diag++] = -Z_diag_a[j] * diag_entries[j1]; } /* identity */ R_diag_j[cnt_diag] = i; R_diag_a[cnt_diag++] = 1.0; for (j = Z_offd_i[ic]; j < Z_offd_i[ic + 1]; j++) { j1 = Z_offd_j[j]; R_offd_j[cnt_offd] = j1; R_offd_a[cnt_offd++] = -Z_offd_a[j] * diag_entries_offd[j1]; } R_diag_i[ic + 1] = cnt_diag; R_offd_i[ic + 1] = cnt_offd; ic++; } hypre_assert(ic == n_cpts); hypre_assert(cnt_diag == nnz_diag); hypre_assert(cnt_offd == nnz_offd); num_cols_offd_R = num_cols_offd_Z; col_map_offd_R = Fmap_offd_global; /* Now, we should have everything of Parcsr matrix R */ R = hypre_ParCSRMatrixCreate(comm, total_global_cpts, /* global num of rows */ hypre_ParCSRMatrixGlobalNumRows(A), /* global num of cols */ num_cpts_global, /* row_starts */ hypre_ParCSRMatrixRowStarts(A), /* col_starts */ num_cols_offd_R, /* num cols offd */ nnz_diag, nnz_offd); R_diag = hypre_ParCSRMatrixDiag(R); hypre_CSRMatrixData(R_diag) = R_diag_a; hypre_CSRMatrixI(R_diag) = R_diag_i; hypre_CSRMatrixJ(R_diag) = R_diag_j; R_offd = hypre_ParCSRMatrixOffd(R); hypre_CSRMatrixData(R_offd) = R_offd_a; hypre_CSRMatrixI(R_offd) = R_offd_i; hypre_CSRMatrixJ(R_offd) = R_offd_j; hypre_ParCSRMatrixColMapOffd(R) = col_map_offd_R; /* create CommPkg of R */ hypre_ParCSRMatrixAssumedPartition(R) = hypre_ParCSRMatrixAssumedPartition(A); hypre_ParCSRMatrixOwnsAssumedPartition(R) = 0; hypre_MatvecCommPkgCreate(R); /* Filter small entries from R */ if (filter_thresholdR > 0) { hypre_ParCSRMatrixDropSmallEntries(R, filter_thresholdR, -1); } *R_ptr = R; hypre_ParCSRMatrixDestroy(Z); hypre_TFree(Fmap, HYPRE_MEMORY_HOST); hypre_TFree(diag_entries, HYPRE_MEMORY_HOST); hypre_TFree(diag_entries_offd, HYPRE_MEMORY_HOST); hypre_TFree(send_buf_i, HYPRE_MEMORY_HOST); hypre_TFree(send_buf_Z, HYPRE_MEMORY_HOST); return 0; } HYPRE_Int hypre_BoomerAMGBuildRestrNeumannAIR( hypre_ParCSRMatrix *A, HYPRE_Int *CF_marker, HYPRE_BigInt *num_cpts_global, HYPRE_Int num_functions, HYPRE_Int *dof_func, HYPRE_Int NeumannDeg, HYPRE_Real strong_thresholdR, HYPRE_Real filter_thresholdR, HYPRE_Int debug_flag, hypre_ParCSRMatrix **R_ptr) { hypre_GpuProfilingPushRange("RestrNeumannAIR"); HYPRE_Int ierr = 0; #if defined(HYPRE_USING_GPU) HYPRE_ExecutionPolicy exec = hypre_GetExecPolicy1( hypre_ParCSRMatrixMemoryLocation(A) ); if (exec == HYPRE_EXEC_DEVICE) { ierr = hypre_BoomerAMGBuildRestrNeumannAIRDevice(A, CF_marker, num_cpts_global, num_functions, dof_func, NeumannDeg, strong_thresholdR, filter_thresholdR, debug_flag, R_ptr); } else #endif { ierr = hypre_BoomerAMGBuildRestrNeumannAIRHost(A, CF_marker, num_cpts_global, num_functions, dof_func, NeumannDeg, strong_thresholdR, filter_thresholdR, debug_flag, R_ptr); } hypre_GpuProfilingPopRange(); return ierr; } hypre-2.33.0/src/parcsr_ls/par_lr_restr_device.c000066400000000000000000000471601477326011500217040ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "_hypre_onedpl.hpp" #include "_hypre_parcsr_ls.h" #include "_hypre_utilities.hpp" #if defined(HYPRE_USING_GPU) __global__ void hypre_BoomerAMGBuildRestrNeumannAIR_assembleRdiag( hypre_DeviceItem &item, HYPRE_Int nr_of_rows, HYPRE_Int *Fmap, HYPRE_Int *Cmap, HYPRE_Int *Z_diag_i, HYPRE_Int *Z_diag_j, HYPRE_Complex *Z_diag_a, HYPRE_Int *R_diag_i, HYPRE_Int *R_diag_j, HYPRE_Complex *R_diag_a); /*--------------------------------------------------------------------------- * hypre_BoomerAMGBuildRestrNeumannAIR *--------------------------------------------------------------------------*/ HYPRE_Int hypre_BoomerAMGBuildRestrNeumannAIRDevice( hypre_ParCSRMatrix *A, HYPRE_Int *CF_marker, HYPRE_BigInt *num_cpts_global, HYPRE_Int num_functions, HYPRE_Int *dof_func, HYPRE_Int NeumannDeg, HYPRE_Real strong_thresholdR, HYPRE_Real filter_thresholdR, HYPRE_Int debug_flag, hypre_ParCSRMatrix **R_ptr) { HYPRE_UNUSED_VAR(debug_flag); MPI_Comm comm = hypre_ParCSRMatrixComm(A); hypre_ParCSRCommHandle *comm_handle; /* diag part of A */ hypre_CSRMatrix *A_diag = hypre_ParCSRMatrixDiag(A); /* Restriction matrix R and CSR's */ hypre_ParCSRMatrix *R; hypre_CSRMatrix *R_diag; /* arrays */ HYPRE_Complex *R_diag_a; HYPRE_Int *R_diag_i; HYPRE_Int *R_diag_j; HYPRE_BigInt *col_map_offd_R; HYPRE_Int num_cols_offd_R; HYPRE_Int my_id, num_procs; HYPRE_BigInt total_global_cpts; HYPRE_Int nnz_diag, nnz_offd; HYPRE_BigInt *send_buf_i; HYPRE_Int i; /* local size */ HYPRE_Int n_fine = hypre_CSRMatrixNumRows(A_diag); HYPRE_BigInt col_start = hypre_ParCSRMatrixFirstRowIndex(A); /* MPI size and rank*/ hypre_MPI_Comm_size(comm, &num_procs); hypre_MPI_Comm_rank(comm, &my_id); /* global number of C points and my start position */ if (my_id == (num_procs - 1)) { total_global_cpts = num_cpts_global[1]; } hypre_MPI_Bcast(&total_global_cpts, 1, HYPRE_MPI_BIG_INT, num_procs - 1, comm); /* get AFF and ACF */ hypre_ParCSRMatrix *AFF, *ACF, *Dinv, *N, *X, *X2, *Z, *Z2; if (strong_thresholdR > 0) { hypre_ParCSRMatrix *S; hypre_BoomerAMGCreateSabs(A, strong_thresholdR, 0.9, num_functions, dof_func, &S); hypre_ParCSRMatrixGenerateFFCFDevice(A, CF_marker, num_cpts_global, S, &ACF, &AFF); hypre_ParCSRMatrixDestroy(S); } else { hypre_ParCSRMatrixGenerateFFCFDevice(A, CF_marker, num_cpts_global, NULL, &ACF, &AFF); } HYPRE_Int n_fpts = hypre_CSRMatrixNumRows(hypre_ParCSRMatrixDiag(AFF)); HYPRE_Int n_cpts = n_fine - n_fpts; hypre_assert(n_cpts == hypre_CSRMatrixNumRows(hypre_ParCSRMatrixDiag(ACF))); /* maps from F-pts and C-pts to all points */ HYPRE_Int *Fmap = hypre_TAlloc(HYPRE_Int, n_fpts, HYPRE_MEMORY_DEVICE); HYPRE_Int *Cmap = hypre_TAlloc(HYPRE_Int, n_cpts, HYPRE_MEMORY_DEVICE); #if defined(HYPRE_USING_SYCL) oneapi::dpl::counting_iterator count(0); hypreSycl_copy_if( count, count + n_fine, CF_marker, Fmap, is_negative()); hypreSycl_copy_if( count, count + n_fine, CF_marker, Cmap, is_positive()); #else HYPRE_THRUST_CALL( copy_if, thrust::make_counting_iterator(0), thrust::make_counting_iterator(n_fine), CF_marker, Fmap, is_negative()); HYPRE_THRUST_CALL( copy_if, thrust::make_counting_iterator(0), thrust::make_counting_iterator(n_fine), CF_marker, Cmap, is_positive()); #endif /* setup Dinv = 1/(diagonal of AFF) */ Dinv = hypre_ParCSRMatrixCreate(comm, hypre_ParCSRMatrixGlobalNumRows(AFF), hypre_ParCSRMatrixGlobalNumCols(AFF), hypre_ParCSRMatrixRowStarts(AFF), hypre_ParCSRMatrixColStarts(AFF), 0, hypre_ParCSRMatrixNumRows(AFF), 0); hypre_ParCSRMatrixAssumedPartition(Dinv) = hypre_ParCSRMatrixAssumedPartition(AFF); hypre_ParCSRMatrixOwnsAssumedPartition(Dinv) = 0; hypre_ParCSRMatrixInitialize(Dinv); hypre_CSRMatrix *Dinv_diag = hypre_ParCSRMatrixDiag(Dinv); #if defined(HYPRE_USING_SYCL) HYPRE_ONEDPL_CALL( std::copy, count, count + hypre_CSRMatrixNumRows(Dinv_diag) + 1, hypre_CSRMatrixI(Dinv_diag) ); HYPRE_ONEDPL_CALL( std::copy, count, count + hypre_CSRMatrixNumRows(Dinv_diag), hypre_CSRMatrixJ(Dinv_diag) ); #else HYPRE_THRUST_CALL( copy, thrust::make_counting_iterator(0), thrust::make_counting_iterator(hypre_CSRMatrixNumRows(Dinv_diag) + 1), hypre_CSRMatrixI(Dinv_diag) ); HYPRE_THRUST_CALL( copy, thrust::make_counting_iterator(0), thrust::make_counting_iterator(hypre_CSRMatrixNumRows(Dinv_diag)), hypre_CSRMatrixJ(Dinv_diag) ); #endif hypre_CSRMatrixExtractDiagonalDevice(hypre_ParCSRMatrixDiag(AFF), hypre_CSRMatrixData(Dinv_diag), 2); /* N = I - D^{-1}*A_FF */ if (NeumannDeg >= 1) { N = hypre_ParCSRMatMat(Dinv, AFF); hypre_CSRMatrixRemoveDiagonalDevice(hypre_ParCSRMatrixDiag(N)); #if defined(HYPRE_USING_SYCL) HYPRE_ONEDPL_CALL( std::transform, hypre_CSRMatrixData(hypre_ParCSRMatrixDiag(N)), hypre_CSRMatrixData(hypre_ParCSRMatrixDiag(N)) + hypre_CSRMatrixNumNonzeros(hypre_ParCSRMatrixDiag( N)), hypre_CSRMatrixData(hypre_ParCSRMatrixDiag(N)), std::negate() ); HYPRE_ONEDPL_CALL( std::transform, hypre_CSRMatrixData(hypre_ParCSRMatrixOffd(N)), hypre_CSRMatrixData(hypre_ParCSRMatrixOffd(N)) + hypre_CSRMatrixNumNonzeros(hypre_ParCSRMatrixOffd( N)), hypre_CSRMatrixData(hypre_ParCSRMatrixOffd(N)), std::negate() ); #else HYPRE_THRUST_CALL( transform, hypre_CSRMatrixData(hypre_ParCSRMatrixDiag(N)), hypre_CSRMatrixData(hypre_ParCSRMatrixDiag(N)) + hypre_CSRMatrixNumNonzeros(hypre_ParCSRMatrixDiag( N)), hypre_CSRMatrixData(hypre_ParCSRMatrixDiag(N)), thrust::negate() ); HYPRE_THRUST_CALL( transform, hypre_CSRMatrixData(hypre_ParCSRMatrixOffd(N)), hypre_CSRMatrixData(hypre_ParCSRMatrixOffd(N)) + hypre_CSRMatrixNumNonzeros(hypre_ParCSRMatrixOffd( N)), hypre_CSRMatrixData(hypre_ParCSRMatrixOffd(N)), thrust::negate() ); #endif } /* Z = Acf * (I + N + N^2 + ... + N^k) * D^{-1} */ if (NeumannDeg < 1) { Z = ACF; } else if (NeumannDeg == 1) { X = hypre_ParCSRMatMat(ACF, N); hypre_ParCSRMatrixAdd(1.0, ACF, 1.0, X, &Z); hypre_ParCSRMatrixDestroy(X); } else { X = hypre_ParCSRMatMat(N, N); hypre_ParCSRMatrixAdd(1.0, N, 1.0, X, &Z); for (i = 2; i < NeumannDeg; i++) { X2 = hypre_ParCSRMatMat(X, N); hypre_ParCSRMatrixAdd(1.0, Z, 1.0, X2, &Z2); hypre_ParCSRMatrixDestroy(X); hypre_ParCSRMatrixDestroy(Z); Z = Z2; X = X2; } hypre_ParCSRMatrixDestroy(X); X = hypre_ParCSRMatMat(ACF, Z); hypre_ParCSRMatrixDestroy(Z); hypre_ParCSRMatrixAdd(1.0, ACF, 1.0, X, &Z); hypre_ParCSRMatrixDestroy(X); } X = Z; Z = hypre_ParCSRMatMat(X, Dinv); hypre_ParCSRMatrixDestroy(X); hypre_ParCSRMatrixDestroy(Dinv); hypre_ParCSRMatrixDestroy(AFF); if (NeumannDeg >= 1) { hypre_ParCSRMatrixDestroy(ACF); hypre_ParCSRMatrixDestroy(N); } hypre_CSRMatrix *Z_diag = hypre_ParCSRMatrixDiag(Z); hypre_CSRMatrix *Z_offd = hypre_ParCSRMatrixOffd(Z); HYPRE_Complex *Z_diag_a = hypre_CSRMatrixData(Z_diag); HYPRE_Int *Z_diag_i = hypre_CSRMatrixI(Z_diag); HYPRE_Int *Z_diag_j = hypre_CSRMatrixJ(Z_diag); HYPRE_Int num_cols_offd_Z = hypre_CSRMatrixNumCols(Z_offd); HYPRE_Int nnz_diag_Z = hypre_CSRMatrixNumNonzeros(Z_diag); HYPRE_BigInt *Fmap_offd_global = hypre_TAlloc(HYPRE_BigInt, num_cols_offd_Z, HYPRE_MEMORY_DEVICE); /* send and recv Fmap (wrt Z): global */ if (num_procs > 1) { hypre_MatvecCommPkgCreate(Z); hypre_ParCSRCommPkg *comm_pkg_Z = hypre_ParCSRMatrixCommPkg(Z); HYPRE_Int num_sends_Z = hypre_ParCSRCommPkgNumSends(comm_pkg_Z); HYPRE_Int num_elems_send_Z = hypre_ParCSRCommPkgSendMapStart(comm_pkg_Z, num_sends_Z); send_buf_i = hypre_TAlloc(HYPRE_BigInt, num_elems_send_Z, HYPRE_MEMORY_DEVICE); hypre_ParCSRCommPkgCopySendMapElmtsToDevice(comm_pkg_Z); #if defined(HYPRE_USING_SYCL) hypreSycl_gather( hypre_ParCSRCommPkgDeviceSendMapElmts(comm_pkg_Z), hypre_ParCSRCommPkgDeviceSendMapElmts(comm_pkg_Z) + hypre_ParCSRCommPkgSendMapStart(comm_pkg_Z, num_sends_Z), Fmap, send_buf_i ); HYPRE_ONEDPL_CALL( std::transform, send_buf_i, send_buf_i + num_elems_send_Z, send_buf_i, [y = col_start](auto & x) {return x + y;} ); #else HYPRE_THRUST_CALL( gather, hypre_ParCSRCommPkgDeviceSendMapElmts(comm_pkg_Z), hypre_ParCSRCommPkgDeviceSendMapElmts(comm_pkg_Z) + hypre_ParCSRCommPkgSendMapStart(comm_pkg_Z, num_sends_Z), Fmap, send_buf_i ); HYPRE_THRUST_CALL( transform, send_buf_i, send_buf_i + num_elems_send_Z, thrust::make_constant_iterator(col_start), send_buf_i, thrust::plus() ); #endif #if defined(HYPRE_USING_THRUST_NOSYNC) /* RL: make sure send_buf_i is ready before issuing GPU-GPU MPI */ if (hypre_GetGpuAwareMPI()) { hypre_ForceSyncComputeStream(); } #endif comm_handle = hypre_ParCSRCommHandleCreate_v2(21, comm_pkg_Z, HYPRE_MEMORY_DEVICE, send_buf_i, HYPRE_MEMORY_DEVICE, Fmap_offd_global); hypre_ParCSRCommHandleDestroy(comm_handle); hypre_TFree(send_buf_i, HYPRE_MEMORY_DEVICE); } /* Assemble R = [-Z I] */ nnz_diag = nnz_diag_Z + n_cpts; nnz_offd = hypre_CSRMatrixNumNonzeros(Z_offd); /* allocate arrays for R diag */ R_diag_i = hypre_CTAlloc(HYPRE_Int, n_cpts + 1, HYPRE_MEMORY_DEVICE); R_diag_j = hypre_CTAlloc(HYPRE_Int, nnz_diag, HYPRE_MEMORY_DEVICE); R_diag_a = hypre_CTAlloc(HYPRE_Complex, nnz_diag, HYPRE_MEMORY_DEVICE); /* setup R row indices (just Z row indices plus one extra entry for each C-pt)*/ #if defined(HYPRE_USING_SYCL) HYPRE_ONEDPL_CALL( std::transform, Z_diag_i, Z_diag_i + n_cpts + 1, count, R_diag_i, std::plus() ); #else HYPRE_THRUST_CALL( transform, Z_diag_i, Z_diag_i + n_cpts + 1, thrust::make_counting_iterator(0), R_diag_i, thrust::plus() ); #endif /* assemble the diagonal part of R from Z */ dim3 bDim = hypre_GetDefaultDeviceBlockDimension(); dim3 gDim = hypre_GetDefaultDeviceGridDimension(n_fine, "warp", bDim); HYPRE_GPU_LAUNCH( hypre_BoomerAMGBuildRestrNeumannAIR_assembleRdiag, gDim, bDim, n_cpts, Fmap, Cmap, Z_diag_i, Z_diag_j, Z_diag_a, R_diag_i, R_diag_j, R_diag_a); num_cols_offd_R = num_cols_offd_Z; col_map_offd_R = hypre_TAlloc(HYPRE_BigInt, num_cols_offd_Z, HYPRE_MEMORY_HOST); hypre_TMemcpy(col_map_offd_R, Fmap_offd_global, HYPRE_BigInt, num_cols_offd_Z, HYPRE_MEMORY_HOST, HYPRE_MEMORY_DEVICE); /* Now, we should have everything of Parcsr matrix R */ R = hypre_ParCSRMatrixCreate(comm, total_global_cpts, /* global num of rows */ hypre_ParCSRMatrixGlobalNumRows(A), /* global num of cols */ num_cpts_global, /* row_starts */ hypre_ParCSRMatrixRowStarts(A), /* col_starts */ num_cols_offd_R, /* num cols offd */ nnz_diag, nnz_offd); R_diag = hypre_ParCSRMatrixDiag(R); hypre_CSRMatrixData(R_diag) = R_diag_a; hypre_CSRMatrixI(R_diag) = R_diag_i; hypre_CSRMatrixJ(R_diag) = R_diag_j; /* R_offd is simply a clone of -Z_offd */ hypre_CSRMatrixDestroy(hypre_ParCSRMatrixOffd(R)); hypre_ParCSRMatrixOffd(R) = hypre_CSRMatrixClone(Z_offd, 1); #if defined(HYPRE_USING_SYCL) HYPRE_ONEDPL_CALL( std::transform, hypre_CSRMatrixData(hypre_ParCSRMatrixOffd(R)), hypre_CSRMatrixData(hypre_ParCSRMatrixOffd(R)) + hypre_CSRMatrixNumNonzeros(hypre_ParCSRMatrixOffd( R)), hypre_CSRMatrixData(hypre_ParCSRMatrixOffd(R)), std::negate() ); #else HYPRE_THRUST_CALL( transform, hypre_CSRMatrixData(hypre_ParCSRMatrixOffd(R)), hypre_CSRMatrixData(hypre_ParCSRMatrixOffd(R)) + hypre_CSRMatrixNumNonzeros(hypre_ParCSRMatrixOffd( R)), hypre_CSRMatrixData(hypre_ParCSRMatrixOffd(R)), thrust::negate() ); #endif hypre_ParCSRMatrixColMapOffd(R) = col_map_offd_R; /* create CommPkg of R */ hypre_ParCSRMatrixAssumedPartition(R) = hypre_ParCSRMatrixAssumedPartition(A); hypre_ParCSRMatrixOwnsAssumedPartition(R) = 0; hypre_MatvecCommPkgCreate(R); /* Filter small entries from R */ if (filter_thresholdR > 0) { hypre_ParCSRMatrixDropSmallEntries(R, filter_thresholdR, -1); } *R_ptr = R; hypre_ParCSRMatrixDestroy(Z); hypre_TFree(Fmap, HYPRE_MEMORY_DEVICE); hypre_TFree(Cmap, HYPRE_MEMORY_DEVICE); hypre_TFree(Fmap_offd_global, HYPRE_MEMORY_DEVICE); return 0; } /*-----------------------------------------------------------------------*/ __global__ void hypre_BoomerAMGBuildRestrNeumannAIR_assembleRdiag( hypre_DeviceItem &item, HYPRE_Int nr_of_rows, HYPRE_Int *Fmap, HYPRE_Int *Cmap, HYPRE_Int *Z_diag_i, HYPRE_Int *Z_diag_j, HYPRE_Complex *Z_diag_a, HYPRE_Int *R_diag_i, HYPRE_Int *R_diag_j, HYPRE_Complex *R_diag_a) { /*-----------------------------------------------------------------------*/ /* Assemble diag part of R = [-Z I] Input: nr_of_rows - Number of rows in matrix (local in processor) CSR represetnation of Z diag, assuming column indices of Z are already mapped appropriately Output: CSR representation of R diag */ /*-----------------------------------------------------------------------*/ HYPRE_Int i = hypre_gpu_get_grid_warp_id<1, 1>(item); if (i >= nr_of_rows) { return; } HYPRE_Int p = 0, q, pZ = 0; HYPRE_Int lane = hypre_gpu_get_lane_id<1>(item); /* diag part */ if (lane < 2) { p = read_only_load(R_diag_i + i + lane); } q = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, p, 1); p = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, p, 0); if (lane < 1) { pZ = read_only_load(Z_diag_i + i + lane); } pZ = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, pZ, 0); for (HYPRE_Int j = p + lane; j < q; j += HYPRE_WARP_SIZE) { if (j == q - 1) { R_diag_j[j] = Cmap[i]; R_diag_a[j] = 1.0; } else { HYPRE_Int jZ = pZ + (j - p); R_diag_j[j] = Fmap[ Z_diag_j[jZ] ]; R_diag_a[j] = -Z_diag_a[jZ]; } } } #if !defined(HYPRE_USING_SYCL) #if (defined(THRUST_VERSION) && THRUST_VERSION < 101000) struct setTo1minus1 : public thrust::unary_function #else struct setTo1minus1 #endif { __host__ __device__ HYPRE_Int operator()(const HYPRE_Int &x) const { return x > 0 ? 1 : -1; } }; #endif HYPRE_Int hypre_BoomerAMGCFMarkerTo1minus1Device( HYPRE_Int *CF_marker, HYPRE_Int size ) { #if defined(HYPRE_USING_SYCL) HYPRE_ONEDPL_CALL( std::transform, CF_marker, CF_marker + size, CF_marker, [] (const auto & x) {return x > 0 ? 1 : -1;} ); #else HYPRE_THRUST_CALL( transform, CF_marker, CF_marker + size, CF_marker, setTo1minus1() ); #endif return hypre_error_flag; } #endif // defined(HYPRE_USING_GPU) hypre-2.33.0/src/parcsr_ls/par_mgr.c000066400000000000000000004453251477326011500173230ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * Two-grid system solver * *****************************************************************************/ #include "_hypre_parcsr_ls.h" #include "par_amg.h" #include "par_mgr.h" #include "_hypre_blas.h" #include "_hypre_lapack.h" //#ifdef HYPRE_USING_DSUPERLU //#include "dsuperlu.h" //#endif /* Need to define these hypre_lapack protos here instead of including _hypre_lapack.h to avoid conflicts with * dsuperlu.h on some lapack functions. Alternative is to move superLU related functions to a separate file. */ /* dgetrf.c */ //HYPRE_Int hypre_dgetrf ( HYPRE_Int *m, HYPRE_Int *n, HYPRE_Real *a, HYPRE_Int *lda, HYPRE_Int *ipiv, // HYPRE_Int *info ); /* dgetri.c */ //HYPRE_Int hypre_dgetri ( HYPRE_Int *n, HYPRE_Real *a, HYPRE_Int *lda, HYPRE_Int *ipiv, // HYPRE_Real *work, HYPRE_Int *lwork, HYPRE_Int *info); /* Create */ void * hypre_MGRCreate(void) { hypre_ParMGRData *mgr_data; mgr_data = hypre_CTAlloc(hypre_ParMGRData, 1, HYPRE_MEMORY_HOST); /* block data */ (mgr_data -> block_size) = 1; (mgr_data -> block_num_coarse_indexes) = NULL; (mgr_data -> point_marker_array) = NULL; (mgr_data -> block_cf_marker) = NULL; /* general data */ (mgr_data -> max_num_coarse_levels) = 10; (mgr_data -> A_array) = NULL; (mgr_data -> B_array) = NULL; (mgr_data -> B_FF_array) = NULL; #if defined(HYPRE_USING_GPU) (mgr_data -> P_FF_array) = NULL; #endif (mgr_data -> P_array) = NULL; (mgr_data -> R_array) = NULL; (mgr_data -> RT_array) = NULL; (mgr_data -> RAP) = NULL; (mgr_data -> CF_marker_array) = NULL; (mgr_data -> coarse_indices_lvls) = NULL; (mgr_data -> A_ff_array) = NULL; (mgr_data -> F_fine_array) = NULL; (mgr_data -> U_fine_array) = NULL; (mgr_data -> aff_solver) = NULL; (mgr_data -> fine_grid_solver_setup) = NULL; (mgr_data -> fine_grid_solver_solve) = NULL; (mgr_data -> F_array) = NULL; (mgr_data -> U_array) = NULL; (mgr_data -> residual) = NULL; (mgr_data -> rel_res_norms) = NULL; (mgr_data -> Vtemp) = NULL; (mgr_data -> Ztemp) = NULL; (mgr_data -> Utemp) = NULL; (mgr_data -> Ftemp) = NULL; (mgr_data -> num_iterations) = 0; (mgr_data -> num_interp_sweeps) = 1; (mgr_data -> num_restrict_sweeps) = 1; (mgr_data -> trunc_factor) = 0.0; (mgr_data -> max_row_sum) = 0.9; (mgr_data -> strong_threshold) = 0.25; (mgr_data -> P_max_elmts) = NULL; (mgr_data -> coarse_grid_solver) = NULL; (mgr_data -> coarse_grid_solver_setup) = NULL; (mgr_data -> coarse_grid_solver_solve) = NULL; //(mgr_data -> global_smoother) = NULL; (mgr_data -> use_default_cgrid_solver) = 1; (mgr_data -> fsolver_mode) = -1; // user or hypre -prescribed F-solver (mgr_data -> omega) = 1.; (mgr_data -> max_iter) = 20; (mgr_data -> tol) = 1.0e-6; (mgr_data -> relax_type) = 0; (mgr_data -> Frelax_type) = NULL; (mgr_data -> relax_order) = 1; // not fully utilized. Only used to compute L1-norms. (mgr_data -> num_relax_sweeps) = NULL; (mgr_data -> relax_weight) = 1.0; (mgr_data -> interp_type) = NULL; (mgr_data -> restrict_type) = NULL; (mgr_data -> level_smooth_iters) = NULL; (mgr_data -> level_smooth_type) = NULL; (mgr_data -> level_smoother) = NULL; (mgr_data -> global_smooth_cycle) = 1; // Pre = 1 or Post = 2 global smoothing (mgr_data -> logging) = 0; (mgr_data -> print_level) = 0; (mgr_data -> frelax_print_level) = 0; (mgr_data -> cg_print_level) = 0; (mgr_data -> data_path) = NULL; (mgr_data -> l1_norms) = NULL; (mgr_data -> reserved_coarse_size) = 0; (mgr_data -> reserved_coarse_indexes) = NULL; (mgr_data -> reserved_Cpoint_local_indexes) = NULL; (mgr_data -> level_diaginv) = NULL; (mgr_data -> frelax_diaginv) = NULL; //(mgr_data -> global_smooth_iters) = 1; //(mgr_data -> global_smooth_type) = 0; (mgr_data -> set_non_Cpoints_to_F) = 0; (mgr_data -> idx_array) = NULL; (mgr_data -> Frelax_method) = NULL; (mgr_data -> VcycleRelaxVtemp) = NULL; (mgr_data -> VcycleRelaxZtemp) = NULL; (mgr_data -> FrelaxVcycleData) = NULL; (mgr_data -> Frelax_num_functions) = NULL; (mgr_data -> max_local_lvls) = 10; (mgr_data -> coarse_grid_method) = NULL; (mgr_data -> nonglk_max_elmts) = NULL; (mgr_data -> print_coarse_system) = 0; (mgr_data -> set_c_points_method) = 0; (mgr_data -> lvl_to_keep_cpoints) = 0; (mgr_data -> cg_convergence_factor) = 0.0; (mgr_data -> block_jacobi_bsize) = 0; (mgr_data -> blk_size) = NULL; (mgr_data -> truncate_coarse_grid_threshold) = 0.0; (mgr_data -> GSElimData) = NULL; return (void *) mgr_data; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ /* Destroy */ HYPRE_Int hypre_MGRDestroy( void *data ) { hypre_ParMGRData *mgr_data = (hypre_ParMGRData*) data; hypre_Solver *aff_base; HYPRE_Int i; HYPRE_Int num_coarse_levels = (mgr_data -> num_coarse_levels); /* block info data */ if ((mgr_data -> block_cf_marker)) { for (i = 0; i < (mgr_data -> max_num_coarse_levels); i++) { hypre_TFree((mgr_data -> block_cf_marker)[i], HYPRE_MEMORY_HOST); } hypre_TFree((mgr_data -> block_cf_marker), HYPRE_MEMORY_HOST); } hypre_TFree(mgr_data -> block_num_coarse_indexes, HYPRE_MEMORY_HOST); /* final residual vector */ if ((mgr_data -> residual)) { hypre_ParVectorDestroy( (mgr_data -> residual) ); (mgr_data -> residual) = NULL; } hypre_TFree( (mgr_data -> rel_res_norms), HYPRE_MEMORY_HOST); /* temp vectors for solve phase */ if ((mgr_data -> Vtemp)) { hypre_ParVectorDestroy( (mgr_data -> Vtemp) ); (mgr_data -> Vtemp) = NULL; } if ((mgr_data -> Ztemp)) { hypre_ParVectorDestroy( (mgr_data -> Ztemp) ); (mgr_data -> Ztemp) = NULL; } if ((mgr_data -> Utemp)) { hypre_ParVectorDestroy( (mgr_data -> Utemp) ); (mgr_data -> Utemp) = NULL; } if ((mgr_data -> Ftemp)) { hypre_ParVectorDestroy( (mgr_data -> Ftemp) ); (mgr_data -> Ftemp) = NULL; } /* coarse grid solver */ if ((mgr_data -> use_default_cgrid_solver)) { if ((mgr_data -> coarse_grid_solver)) { hypre_BoomerAMGDestroy( (mgr_data -> coarse_grid_solver) ); } (mgr_data -> coarse_grid_solver) = NULL; } /* l1_norms */ if ((mgr_data -> l1_norms)) { for (i = 0; i < (num_coarse_levels); i++) { hypre_SeqVectorDestroy((mgr_data -> l1_norms)[i]); } hypre_TFree((mgr_data -> l1_norms), HYPRE_MEMORY_HOST); } /* coarse_indices_lvls */ if ((mgr_data -> coarse_indices_lvls)) { for (i = 0; i < (num_coarse_levels); i++) { hypre_TFree((mgr_data -> coarse_indices_lvls)[i], HYPRE_MEMORY_HOST); } hypre_TFree((mgr_data -> coarse_indices_lvls), HYPRE_MEMORY_HOST); } /* linear system and cf marker array */ if (mgr_data -> A_array || mgr_data -> P_array || mgr_data -> RT_array || mgr_data -> R_array || mgr_data -> CF_marker_array) { for (i = 1; i < num_coarse_levels + 1; i++) { hypre_ParVectorDestroy((mgr_data -> F_array)[i]); hypre_ParVectorDestroy((mgr_data -> U_array)[i]); if ((mgr_data -> P_array)[i - 1]) { hypre_ParCSRMatrixDestroy((mgr_data -> P_array)[i - 1]); } if ((mgr_data -> R_array)[i - 1]) { hypre_ParCSRMatrixDestroy((mgr_data -> R_array)[i - 1]); } if ((mgr_data -> RT_array)[i - 1]) { hypre_ParCSRMatrixDestroy((mgr_data -> RT_array)[i - 1]); } hypre_IntArrayDestroy(mgr_data -> CF_marker_array[i - 1]); } for (i = 1; i < (num_coarse_levels); i++) { if ((mgr_data -> A_array)[i]) { hypre_ParCSRMatrixDestroy((mgr_data -> A_array)[i]); } } } /* Block relaxation/interpolation matrices */ if (hypre_ParMGRDataBArray(mgr_data)) { for (i = 0; i < num_coarse_levels; i++) { hypre_ParCSRMatrixDestroy(hypre_ParMGRDataB(mgr_data, i)); } } if (hypre_ParMGRDataBFFArray(mgr_data)) { for (i = 0; i < num_coarse_levels; i++) { hypre_ParCSRMatrixDestroy(hypre_ParMGRDataBFF(mgr_data, i)); } } #if defined(HYPRE_USING_GPU) if (mgr_data -> P_FF_array) { for (i = 0; i < num_coarse_levels; i++) { if ((mgr_data -> P_array)[i]) { hypre_ParCSRMatrixDestroy((mgr_data -> P_FF_array)[i]); } } //hypre_TFree(P_FF_array, hypre_HandleMemoryLocation(hypre_handle())); hypre_TFree((mgr_data -> P_FF_array), HYPRE_MEMORY_HOST); (mgr_data -> P_FF_array) = NULL; } #endif /* AMG for Frelax */ if (mgr_data -> A_ff_array || mgr_data -> F_fine_array || mgr_data -> U_fine_array) { for (i = 1; i < num_coarse_levels + 1; i++) { if (mgr_data -> F_fine_array[i]) { hypre_ParVectorDestroy((mgr_data -> F_fine_array)[i]); } if (mgr_data -> U_fine_array[i]) { hypre_ParVectorDestroy((mgr_data -> U_fine_array)[i]); } } for (i = 1; i < (num_coarse_levels); i++) { if ((mgr_data -> A_ff_array)[i]) { hypre_ParCSRMatrixDestroy((mgr_data -> A_ff_array)[i]); } } if (mgr_data -> fsolver_mode != 0) { if ((mgr_data -> A_ff_array)[0]) { hypre_ParCSRMatrixDestroy((mgr_data -> A_ff_array)[0]); } } hypre_TFree(mgr_data -> F_fine_array, HYPRE_MEMORY_HOST); (mgr_data -> F_fine_array) = NULL; hypre_TFree(mgr_data -> U_fine_array, HYPRE_MEMORY_HOST); (mgr_data -> U_fine_array) = NULL; hypre_TFree(mgr_data -> A_ff_array, HYPRE_MEMORY_HOST); (mgr_data -> A_ff_array) = NULL; } if (mgr_data -> aff_solver) { for (i = 1; i < (num_coarse_levels); i++) { if ((mgr_data -> aff_solver)[i]) { aff_base = (hypre_Solver*) (mgr_data -> aff_solver)[i]; hypre_SolverDestroy(aff_base)((HYPRE_Solver) (aff_base)); } } if (mgr_data -> fsolver_mode == 2) { hypre_BoomerAMGDestroy((mgr_data -> aff_solver)[0]); } hypre_TFree(mgr_data -> aff_solver, HYPRE_MEMORY_HOST); (mgr_data -> aff_solver) = NULL; } if (mgr_data -> level_diaginv) { for (i = 0; i < (num_coarse_levels); i++) { hypre_TFree((mgr_data -> level_diaginv)[i], HYPRE_MEMORY_HOST); } hypre_TFree(mgr_data -> level_diaginv, HYPRE_MEMORY_HOST); } if (mgr_data -> frelax_diaginv) { for (i = 0; i < (num_coarse_levels); i++) { hypre_TFree((mgr_data -> frelax_diaginv)[i], HYPRE_MEMORY_HOST); } hypre_TFree(mgr_data -> frelax_diaginv, HYPRE_MEMORY_HOST); } hypre_TFree((mgr_data -> F_array), HYPRE_MEMORY_HOST); hypre_TFree((mgr_data -> U_array), HYPRE_MEMORY_HOST); hypre_TFree((mgr_data -> A_array), HYPRE_MEMORY_HOST); hypre_TFree((mgr_data -> B_array), HYPRE_MEMORY_HOST); hypre_TFree((mgr_data -> B_FF_array), HYPRE_MEMORY_HOST); hypre_TFree((mgr_data -> P_array), HYPRE_MEMORY_HOST); hypre_TFree((mgr_data -> R_array), HYPRE_MEMORY_HOST); hypre_TFree((mgr_data -> RT_array), HYPRE_MEMORY_HOST); hypre_TFree((mgr_data -> CF_marker_array), HYPRE_MEMORY_HOST); hypre_TFree((mgr_data -> reserved_Cpoint_local_indexes), HYPRE_MEMORY_HOST); hypre_TFree((mgr_data -> restrict_type), HYPRE_MEMORY_HOST); hypre_TFree((mgr_data -> interp_type), HYPRE_MEMORY_HOST); hypre_TFree((mgr_data -> P_max_elmts), HYPRE_MEMORY_HOST); /* Frelax_type */ hypre_TFree(mgr_data -> Frelax_type, HYPRE_MEMORY_HOST); /* Frelax_method */ hypre_TFree(mgr_data -> Frelax_method, HYPRE_MEMORY_HOST); /* Frelax_num_functions */ hypre_TFree(mgr_data -> Frelax_num_functions, HYPRE_MEMORY_HOST); /* data for V-cycle F-relaxation */ if ((mgr_data -> VcycleRelaxVtemp)) { hypre_ParVectorDestroy( (mgr_data -> VcycleRelaxVtemp) ); (mgr_data -> VcycleRelaxVtemp) = NULL; } if ((mgr_data -> VcycleRelaxZtemp)) { hypre_ParVectorDestroy( (mgr_data -> VcycleRelaxZtemp) ); (mgr_data -> VcycleRelaxZtemp) = NULL; } if (mgr_data -> FrelaxVcycleData) { for (i = 0; i < num_coarse_levels; i++) { hypre_MGRDestroyFrelaxVcycleData((mgr_data -> FrelaxVcycleData)[i]); } hypre_TFree(mgr_data -> FrelaxVcycleData, HYPRE_MEMORY_HOST); } /* data for reserved coarse nodes */ hypre_TFree(mgr_data -> reserved_coarse_indexes, HYPRE_MEMORY_HOST); /* index array for setting Cpoints by global block */ if ((mgr_data -> set_c_points_method) == 1) { hypre_TFree(mgr_data -> idx_array, HYPRE_MEMORY_HOST); } /* Coarse grid options */ hypre_TFree(mgr_data -> coarse_grid_method, HYPRE_MEMORY_HOST); hypre_TFree(mgr_data -> nonglk_max_elmts, HYPRE_MEMORY_HOST); /* coarsest level matrix - RAP */ if ((mgr_data -> RAP)) { hypre_ParCSRMatrixDestroy((mgr_data -> RAP)); } if ((mgr_data -> level_smoother) != NULL) { for (i = 0; i < num_coarse_levels; i++) { if ((mgr_data -> level_smooth_iters)[i] > 0) { if ((mgr_data -> level_smooth_type)[i] == 8) { HYPRE_EuclidDestroy((mgr_data -> level_smoother)[i]); } else if ((mgr_data -> level_smooth_type)[i] == 16) { HYPRE_ILUDestroy((mgr_data -> level_smoother)[i]); } else if ((mgr_data -> level_smoother)[i]) { hypre_Solver *smoother_base = (hypre_Solver*) (mgr_data -> level_smoother)[i]; hypre_SolverDestroy(smoother_base)((mgr_data -> level_smoother)[i]); } } } hypre_TFree(mgr_data -> level_smoother, HYPRE_MEMORY_HOST); } /* free level data */ hypre_TFree(mgr_data -> blk_size, HYPRE_MEMORY_HOST); hypre_TFree(mgr_data -> level_smooth_type, HYPRE_MEMORY_HOST); hypre_TFree(mgr_data -> level_smooth_iters, HYPRE_MEMORY_HOST); hypre_TFree(mgr_data -> num_relax_sweeps, HYPRE_MEMORY_HOST); if (mgr_data -> GSElimData) { for (i = 0; i < num_coarse_levels; i++) { if ((mgr_data -> GSElimData)[i]) { hypre_MGRDestroyGSElimData((mgr_data -> GSElimData)[i]); (mgr_data -> GSElimData)[i] = NULL; } } hypre_TFree(mgr_data -> GSElimData, HYPRE_MEMORY_HOST); } /* Free the data path filename */ hypre_TFree(mgr_data -> data_path, HYPRE_MEMORY_HOST); /* mgr data */ hypre_TFree(mgr_data, HYPRE_MEMORY_HOST); return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_MGRCreateGSElimData * * Create data for Gaussian Elimination for F-relaxation. *--------------------------------------------------------------------------*/ void * hypre_MGRCreateGSElimData( void ) { hypre_ParAMGData *gsdata = hypre_CTAlloc(hypre_ParAMGData, 1, HYPRE_MEMORY_HOST); hypre_ParAMGDataGSSetup(gsdata) = 0; hypre_ParAMGDataGEMemoryLocation(gsdata) = HYPRE_MEMORY_UNDEFINED; hypre_ParAMGDataNewComm(gsdata) = hypre_MPI_COMM_NULL; hypre_ParAMGDataCommInfo(gsdata) = NULL; hypre_ParAMGDataAMat(gsdata) = NULL; hypre_ParAMGDataAWork(gsdata) = NULL; hypre_ParAMGDataAPiv(gsdata) = NULL; hypre_ParAMGDataBVec(gsdata) = NULL; hypre_ParAMGDataUVec(gsdata) = NULL; return (void *) gsdata; } /*-------------------------------------------------------------------------- * hypre_MGRDestroyGSElimData * * Destroy data for Gaussian Elimination for F-relaxation. *--------------------------------------------------------------------------*/ HYPRE_Int hypre_MGRDestroyGSElimData( void *data ) { hypre_ParAMGData *gsdata = (hypre_ParAMGData*) data; MPI_Comm new_comm = hypre_ParAMGDataNewComm(gsdata); #if defined(HYPRE_USING_MAGMA) hypre_TFree(hypre_ParAMGDataAPiv(gsdata), HYPRE_MEMORY_HOST); #else hypre_TFree(hypre_ParAMGDataAPiv(gsdata), hypre_ParAMGDataGEMemoryLocation(gsdata)); #endif hypre_TFree(hypre_ParAMGDataAMat(gsdata), hypre_ParAMGDataGEMemoryLocation(gsdata)); hypre_TFree(hypre_ParAMGDataAWork(gsdata), hypre_ParAMGDataGEMemoryLocation(gsdata)); hypre_TFree(hypre_ParAMGDataBVec(gsdata), hypre_ParAMGDataGEMemoryLocation(gsdata)); hypre_TFree(hypre_ParAMGDataUVec(gsdata), hypre_ParAMGDataGEMemoryLocation(gsdata)); hypre_TFree(hypre_ParAMGDataCommInfo(gsdata), HYPRE_MEMORY_HOST); if (new_comm != hypre_MPI_COMM_NULL) { hypre_MPI_Comm_free(&new_comm); } hypre_TFree(gsdata, HYPRE_MEMORY_HOST); return hypre_error_flag; } /* Create data for V-cycle F-relaxtion */ void * hypre_MGRCreateFrelaxVcycleData( void ) { hypre_ParAMGData *vdata = hypre_CTAlloc(hypre_ParAMGData, 1, HYPRE_MEMORY_HOST); hypre_ParAMGDataAArray(vdata) = NULL; hypre_ParAMGDataPArray(vdata) = NULL; hypre_ParAMGDataFArray(vdata) = NULL; hypre_ParAMGDataCFMarkerArray(vdata) = NULL; hypre_ParAMGDataVtemp(vdata) = NULL; // hypre_ParAMGDataAMat(vdata) = NULL; // hypre_ParAMGDataBVec(vdata) = NULL; hypre_ParAMGDataZtemp(vdata) = NULL; // hypre_ParAMGDataCommInfo(vdata) = NULL; hypre_ParAMGDataUArray(vdata) = NULL; hypre_ParAMGDataNewComm(vdata) = hypre_MPI_COMM_NULL; hypre_ParAMGDataNumLevels(vdata) = 0; hypre_ParAMGDataMaxLevels(vdata) = 10; hypre_ParAMGDataNumFunctions(vdata) = 1; hypre_ParAMGDataSCommPkgSwitch(vdata) = 1.0; hypre_ParAMGDataRelaxOrder(vdata) = 1; hypre_ParAMGDataMaxCoarseSize(vdata) = 9; hypre_ParAMGDataMinCoarseSize(vdata) = 0; hypre_ParAMGDataUserCoarseRelaxType(vdata) = 9; /* Gaussian Elim data */ hypre_ParAMGDataGSSetup(vdata) = 0; hypre_ParAMGDataAMat(vdata) = NULL; hypre_ParAMGDataAWork(vdata) = NULL; hypre_ParAMGDataBVec(vdata) = NULL; hypre_ParAMGDataCommInfo(vdata) = NULL; return (void *) vdata; } /* Destroy data for V-cycle F-relaxation */ HYPRE_Int hypre_MGRDestroyFrelaxVcycleData( void *data ) { hypre_ParAMGData * vdata = (hypre_ParAMGData*) data; HYPRE_Int i; HYPRE_Int num_levels = hypre_ParAMGDataNumLevels(vdata); MPI_Comm new_comm = hypre_ParAMGDataNewComm(vdata); hypre_TFree(hypre_ParAMGDataDofFuncArray(vdata)[0], HYPRE_MEMORY_HOST); for (i = 1; i < num_levels + 1; i++) { if (hypre_ParAMGDataAArray(vdata)[i]) { hypre_ParCSRMatrixDestroy(hypre_ParAMGDataAArray(vdata)[i]); } if (hypre_ParAMGDataPArray(vdata)[i - 1]) { hypre_ParCSRMatrixDestroy(hypre_ParAMGDataPArray(vdata)[i - 1]); } hypre_IntArrayDestroy(hypre_ParAMGDataCFMarkerArray(vdata)[i - 1]); hypre_ParVectorDestroy(hypre_ParAMGDataFArray(vdata)[i]); hypre_ParVectorDestroy(hypre_ParAMGDataUArray(vdata)[i]); hypre_TFree(hypre_ParAMGDataDofFuncArray(vdata)[i], HYPRE_MEMORY_HOST); } if (num_levels < 1) { hypre_IntArrayDestroy(hypre_ParAMGDataCFMarkerArray(vdata)[0]); } /* Points to VcycleRelaxVtemp of mgr_data, which is already destroyed */ //hypre_ParVectorDestroy(hypre_ParAMGDataVtemp(vdata)); hypre_TFree(hypre_ParAMGDataFArray(vdata), HYPRE_MEMORY_HOST); hypre_TFree(hypre_ParAMGDataUArray(vdata), HYPRE_MEMORY_HOST); hypre_TFree(hypre_ParAMGDataAArray(vdata), HYPRE_MEMORY_HOST); hypre_TFree(hypre_ParAMGDataPArray(vdata), HYPRE_MEMORY_HOST); hypre_TFree(hypre_ParAMGDataCFMarkerArray(vdata), HYPRE_MEMORY_HOST); //hypre_TFree(hypre_ParAMGDataGridRelaxType(vdata), HYPRE_MEMORY_HOST); hypre_TFree(hypre_ParAMGDataDofFuncArray(vdata), HYPRE_MEMORY_HOST); /* Points to VcycleRelaxZtemp of mgr_data, which is already destroyed */ /* if (hypre_ParAMGDataZtemp(vdata)) hypre_ParVectorDestroy(hypre_ParAMGDataZtemp(vdata)); */ #if defined(HYPRE_USING_MAGMA) hypre_TFree(hypre_ParAMGDataAPiv(vdata), HYPRE_MEMORY_HOST); #else hypre_TFree(hypre_ParAMGDataAPiv(vdata), hypre_ParAMGDataGEMemoryLocation(vdata)); #endif hypre_TFree(hypre_ParAMGDataAMat(vdata), hypre_ParAMGDataGEMemoryLocation(vdata)); hypre_TFree(hypre_ParAMGDataAWork(vdata), hypre_ParAMGDataGEMemoryLocation(vdata)); hypre_TFree(hypre_ParAMGDataBVec(vdata), hypre_ParAMGDataGEMemoryLocation(vdata)); hypre_TFree(hypre_ParAMGDataUVec(vdata), hypre_ParAMGDataGEMemoryLocation(vdata)); hypre_TFree(hypre_ParAMGDataCommInfo(vdata), HYPRE_MEMORY_HOST); if (new_comm != hypre_MPI_COMM_NULL) { hypre_MPI_Comm_free (&new_comm); } hypre_TFree(vdata, HYPRE_MEMORY_HOST); return hypre_error_flag; } /* Set C-point variables for each reduction level */ /* Currently not implemented */ HYPRE_Int hypre_MGRSetReductionLevelCpoints( void *mgr_vdata, HYPRE_Int nlevels, HYPRE_Int *num_coarse_points, HYPRE_Int **level_coarse_indexes) { hypre_ParMGRData *mgr_data = (hypre_ParMGRData*) mgr_vdata; (mgr_data -> num_coarse_levels) = nlevels; (mgr_data -> num_coarse_per_level) = num_coarse_points; (mgr_data -> level_coarse_indexes) = level_coarse_indexes; return hypre_error_flag; } /* Initialize some data */ /* Set whether non-coarse points on each level should be explicitly tagged as F-points */ HYPRE_Int hypre_MGRSetNonCpointsToFpoints( void *mgr_vdata, HYPRE_Int nonCptToFptFlag) { hypre_ParMGRData *mgr_data = (hypre_ParMGRData*) mgr_vdata; (mgr_data -> set_non_Cpoints_to_F) = nonCptToFptFlag; return hypre_error_flag; } /* Set whether the reserved C points are reduced before the coarse grid solve */ HYPRE_Int hypre_MGRSetReservedCpointsLevelToKeep(void *mgr_vdata, HYPRE_Int level) { hypre_ParMGRData *mgr_data = (hypre_ParMGRData*) mgr_vdata; (mgr_data -> lvl_to_keep_cpoints) = level; return hypre_error_flag; } /* Set Cpoints by contiguous blocks, i.e. p1, p2, ..., pn, s1, s2, ..., sn, ... */ HYPRE_Int hypre_MGRSetCpointsByContiguousBlock( void *mgr_vdata, HYPRE_Int block_size, HYPRE_Int max_num_levels, HYPRE_BigInt *begin_idx_array, HYPRE_Int *block_num_coarse_points, HYPRE_Int **block_coarse_indexes) { hypre_ParMGRData *mgr_data = (hypre_ParMGRData*) mgr_vdata; HYPRE_Int i; if ((mgr_data -> idx_array) != NULL) { hypre_TFree(mgr_data -> idx_array, HYPRE_MEMORY_HOST); (mgr_data -> idx_array) = NULL; } HYPRE_BigInt *index_array = hypre_CTAlloc(HYPRE_BigInt, block_size, HYPRE_MEMORY_HOST); if (begin_idx_array != NULL) { for (i = 0; i < block_size; i++) { index_array[i] = *(begin_idx_array + i); } } hypre_MGRSetCpointsByBlock(mgr_data, block_size, max_num_levels, block_num_coarse_points, block_coarse_indexes); (mgr_data -> idx_array) = index_array; (mgr_data -> set_c_points_method) = 1; return hypre_error_flag; } /* Initialize/ set local block data information */ HYPRE_Int hypre_MGRSetCpointsByBlock( void *mgr_vdata, HYPRE_Int block_size, HYPRE_Int max_num_levels, HYPRE_Int *block_num_coarse_points, HYPRE_Int **block_coarse_indexes) { HYPRE_Int i, j; HYPRE_Int **block_cf_marker = NULL; HYPRE_Int *block_num_coarse_indexes = NULL; hypre_ParMGRData *mgr_data = (hypre_ParMGRData*) mgr_vdata; /* free block cf_marker data if not previously destroyed */ if ((mgr_data -> block_cf_marker) != NULL) { for (i = 0; i < (mgr_data -> max_num_coarse_levels); i++) { if ((mgr_data -> block_cf_marker)[i]) { hypre_TFree((mgr_data -> block_cf_marker)[i], HYPRE_MEMORY_HOST); (mgr_data -> block_cf_marker)[i] = NULL; } } hypre_TFree(mgr_data -> block_cf_marker, HYPRE_MEMORY_HOST); (mgr_data -> block_cf_marker) = NULL; } if ((mgr_data -> block_num_coarse_indexes)) { hypre_TFree((mgr_data -> block_num_coarse_indexes), HYPRE_MEMORY_HOST); (mgr_data -> block_num_coarse_indexes) = NULL; } /* store block cf_marker */ block_cf_marker = hypre_CTAlloc(HYPRE_Int *, max_num_levels, HYPRE_MEMORY_HOST); for (i = 0; i < max_num_levels; i++) { block_cf_marker[i] = hypre_CTAlloc(HYPRE_Int, block_size, HYPRE_MEMORY_HOST); memset(block_cf_marker[i], FMRK, block_size * sizeof(HYPRE_Int)); } for (i = 0; i < max_num_levels; i++) { for (j = 0; j < block_num_coarse_points[i]; j++) { (block_cf_marker[i])[block_coarse_indexes[i][j]] = CMRK; } } /* store block_num_coarse_points */ if (max_num_levels > 0) { block_num_coarse_indexes = hypre_CTAlloc(HYPRE_Int, max_num_levels, HYPRE_MEMORY_HOST); for (i = 0; i < max_num_levels; i++) { block_num_coarse_indexes[i] = block_num_coarse_points[i]; } } /* set block data */ (mgr_data -> max_num_coarse_levels) = max_num_levels; (mgr_data -> block_size) = block_size; (mgr_data -> block_num_coarse_indexes) = block_num_coarse_indexes; (mgr_data -> block_cf_marker) = block_cf_marker; (mgr_data -> set_c_points_method) = 0; return hypre_error_flag; } HYPRE_Int hypre_MGRSetCpointsByPointMarkerArray( void *mgr_vdata, HYPRE_Int block_size, HYPRE_Int max_num_levels, HYPRE_Int *lvl_num_coarse_points, HYPRE_Int **lvl_coarse_indexes, HYPRE_Int *point_marker_array) { hypre_ParMGRData *mgr_data = (hypre_ParMGRData*) mgr_vdata; HYPRE_Int i, j; HYPRE_Int **block_cf_marker = NULL; HYPRE_Int *block_num_coarse_indexes = NULL; /* free block cf_marker data if not previously destroyed */ if ((mgr_data -> block_cf_marker) != NULL) { for (i = 0; i < (mgr_data -> max_num_coarse_levels); i++) { if ((mgr_data -> block_cf_marker)[i]) { hypre_TFree((mgr_data -> block_cf_marker)[i], HYPRE_MEMORY_HOST); (mgr_data -> block_cf_marker)[i] = NULL; } } hypre_TFree(mgr_data -> block_cf_marker, HYPRE_MEMORY_HOST); (mgr_data -> block_cf_marker) = NULL; } if ((mgr_data -> block_num_coarse_indexes)) { hypre_TFree((mgr_data -> block_num_coarse_indexes), HYPRE_MEMORY_HOST); (mgr_data -> block_num_coarse_indexes) = NULL; } /* store block cf_marker */ block_cf_marker = hypre_CTAlloc(HYPRE_Int *, max_num_levels, HYPRE_MEMORY_HOST); for (i = 0; i < max_num_levels; i++) { block_cf_marker[i] = hypre_CTAlloc(HYPRE_Int, block_size, HYPRE_MEMORY_HOST); memset(block_cf_marker[i], FMRK, block_size * sizeof(HYPRE_Int)); } for (i = 0; i < max_num_levels; i++) { for (j = 0; j < lvl_num_coarse_points[i]; j++) { block_cf_marker[i][j] = lvl_coarse_indexes[i][j]; } } /* store block_num_coarse_points */ if (max_num_levels > 0) { block_num_coarse_indexes = hypre_CTAlloc(HYPRE_Int, max_num_levels, HYPRE_MEMORY_HOST); for (i = 0; i < max_num_levels; i++) { block_num_coarse_indexes[i] = lvl_num_coarse_points[i]; } } /* set block data */ (mgr_data -> max_num_coarse_levels) = max_num_levels; (mgr_data -> block_size) = block_size; (mgr_data -> block_num_coarse_indexes) = block_num_coarse_indexes; (mgr_data -> block_cf_marker) = block_cf_marker; (mgr_data -> point_marker_array) = point_marker_array; (mgr_data -> set_c_points_method) = 2; return hypre_error_flag; } /*Set number of points that remain part of the coarse grid throughout the hierarchy */ HYPRE_Int hypre_MGRSetReservedCoarseNodes(void *mgr_vdata, HYPRE_Int reserved_coarse_size, HYPRE_BigInt *reserved_cpt_index) { hypre_ParMGRData *mgr_data = (hypre_ParMGRData*) mgr_vdata; HYPRE_BigInt *reserved_coarse_indexes = NULL; HYPRE_Int i; /* free data not previously destroyed */ if ((mgr_data -> reserved_coarse_indexes)) { hypre_TFree((mgr_data -> reserved_coarse_indexes), HYPRE_MEMORY_HOST); (mgr_data -> reserved_coarse_indexes) = NULL; } /* set reserved coarse nodes */ if (reserved_coarse_size > 0) { reserved_coarse_indexes = hypre_CTAlloc(HYPRE_BigInt, reserved_coarse_size, HYPRE_MEMORY_HOST); for (i = 0; i < reserved_coarse_size; i++) { reserved_coarse_indexes[i] = reserved_cpt_index[i]; } } (mgr_data -> reserved_coarse_size) = reserved_coarse_size; (mgr_data -> reserved_coarse_indexes) = reserved_coarse_indexes; return hypre_error_flag; } /* Set CF marker array */ HYPRE_Int hypre_MGRCoarsen(hypre_ParCSRMatrix *S, hypre_ParCSRMatrix *A, HYPRE_Int fixed_coarse_size, HYPRE_Int *fixed_coarse_indexes, HYPRE_Int debug_flag, hypre_IntArray **CF_marker_ptr, HYPRE_Int cflag) { HYPRE_Int *CF_marker = NULL; HYPRE_Int *cindexes = fixed_coarse_indexes; HYPRE_Int i, row, nc; HYPRE_Int nloc = hypre_ParCSRMatrixNumRows(A); HYPRE_MemoryLocation memory_location; /* If this is the last level, coarsen onto fixed coarse set */ if (cflag) { if (*CF_marker_ptr != NULL) { hypre_IntArrayDestroy(*CF_marker_ptr); } *CF_marker_ptr = hypre_IntArrayCreate(nloc); hypre_IntArrayInitialize(*CF_marker_ptr); hypre_IntArraySetConstantValues(*CF_marker_ptr, FMRK); memory_location = hypre_IntArrayMemoryLocation(*CF_marker_ptr); if (hypre_GetActualMemLocation(memory_location) == hypre_MEMORY_DEVICE) { hypre_IntArrayMigrate(*CF_marker_ptr, HYPRE_MEMORY_HOST); } CF_marker = hypre_IntArrayData(*CF_marker_ptr); /* first mark fixed coarse set */ nc = fixed_coarse_size; for (i = 0; i < nc; i++) { CF_marker[cindexes[i]] = CMRK; } if (hypre_GetActualMemLocation(memory_location) == hypre_MEMORY_DEVICE) { hypre_IntArrayMigrate(*CF_marker_ptr, HYPRE_MEMORY_DEVICE); } } else { /* First coarsen to get initial CF splitting. * This is then followed by updating the CF marker to pass * coarse information to the next levels. NOTE: It may be * convenient to implement this way (allows the use of multiple * coarsening strategies without changing too much code), * but not necessarily the best option, compared to initializing * CF_marker first and then coarsening on subgraph which excludes * the initialized coarse nodes. */ hypre_BoomerAMGCoarsen(S, A, 0, debug_flag, CF_marker_ptr); CF_marker = hypre_IntArrayData(*CF_marker_ptr); /* Update CF_marker to correct Cpoints marked as Fpoints. */ nc = fixed_coarse_size; for (i = 0; i < nc; i++) { CF_marker[cindexes[i]] = CMRK; } /* set F-points to FMRK. This is necessary since the different coarsening schemes differentiate * between type of F-points (example Ruge coarsening). We do not need that distinction here. */ for (row = 0; row < nloc; row++) { if (CF_marker[row] == CMRK) { continue; } CF_marker[row] = FMRK; } #if 0 /* IMPORTANT: Update coarse_indexes array to define the positions of the fixed coarse points * in the next level. */ nc = 0; index_i = 0; for (row = 0; row < nloc; row++) { /* loop through new c-points */ if (CF_marker[row] == CMRK) { nc++; } else if (CF_marker[row] == S_CMRK) { /* previously marked c-point is part of fixed coarse set. Track its current local index */ cindexes[index_i++] = nc; /* reset c-point from S_CMRK to CMRK */ cf_marker[row] = CMRK; nc++; } /* set F-points to FMRK. This is necessary since the different coarsening schemes differentiate * between type of F-points (example Ruge coarsening). We do not need that distinction here. */ else { CF_marker[row] = FMRK; } } /* check if this should be last level */ if ( nc == fixed_coarse_size) { last_level = 1; } //printf(" nc = %d and fixed coarse size = %d \n", nc, fixed_coarse_size); #endif } return hypre_error_flag; } /* Scale ParCSR matrix A = scalar * A * A: the target CSR matrix * vector: array of real numbers */ HYPRE_Int hypre_ParCSRMatrixLeftScale(HYPRE_Real *vector, hypre_ParCSRMatrix *A) { HYPRE_Int i, j, n_local; hypre_CSRMatrix *A_diag = hypre_ParCSRMatrixDiag(A); HYPRE_Real *A_diag_data = hypre_CSRMatrixData(A_diag); HYPRE_Int *A_diag_i = hypre_CSRMatrixI(A_diag); hypre_CSRMatrix *A_offd = hypre_ParCSRMatrixOffd(A); HYPRE_Real *A_offd_data = hypre_CSRMatrixData(A_offd); HYPRE_Int *A_offd_i = hypre_CSRMatrixI(A_offd); n_local = hypre_CSRMatrixNumRows(A_diag); for (i = 0; i < n_local; i++) { HYPRE_Real factor = vector[i]; for (j = A_diag_i[i]; j < A_diag_i[i + 1]; j++) { A_diag_data[j] *= factor; } for (j = A_offd_i[i]; j < A_offd_i[i + 1]; j++) { A_offd_data[j] *= factor; } } return hypre_error_flag; } HYPRE_Int hypre_MGRComputeAlgebraicFixedStress(hypre_ParCSRMatrix *A, HYPRE_BigInt *mgr_idx_array, HYPRE_Solver A_ff_solver) { HYPRE_Int *U_marker, *S_marker, *P_marker; HYPRE_Int n_fine, i; HYPRE_BigInt ibegin; hypre_ParCSRMatrix *A_up; hypre_ParCSRMatrix *A_uu; hypre_ParCSRMatrix *A_su; hypre_ParCSRMatrix *A_pu; hypre_ParVector *e1_vector; hypre_ParVector *e2_vector; hypre_ParVector *e3_vector; hypre_ParVector *e4_vector; hypre_ParVector *e5_vector; n_fine = hypre_CSRMatrixNumRows(hypre_ParCSRMatrixDiag(A)); ibegin = hypre_ParCSRMatrixFirstRowIndex(A); hypre_assert(ibegin == mgr_idx_array[0]); U_marker = hypre_CTAlloc(HYPRE_Int, n_fine, HYPRE_MEMORY_HOST); S_marker = hypre_CTAlloc(HYPRE_Int, n_fine, HYPRE_MEMORY_HOST); P_marker = hypre_CTAlloc(HYPRE_Int, n_fine, HYPRE_MEMORY_HOST); for (i = 0; i < n_fine; i++) { U_marker[i] = -1; S_marker[i] = -1; P_marker[i] = -1; } // create C and F markers for (i = 0; i < n_fine; i++) { if (i < mgr_idx_array[1] - ibegin) { U_marker[i] = 1; } else if (i >= (mgr_idx_array[1] - ibegin) && i < (mgr_idx_array[2] - ibegin)) { S_marker[i] = 1; } else { P_marker[i] = 1; } } // Get A_up hypre_MGRGetSubBlock(A, U_marker, P_marker, 0, &A_up); // GetA_uu hypre_MGRGetSubBlock(A, U_marker, U_marker, 0, &A_uu); // Get A_su hypre_MGRGetSubBlock(A, S_marker, U_marker, 0, &A_su); // Get A_pu hypre_MGRGetSubBlock(A, P_marker, U_marker, 0, &A_pu); e1_vector = hypre_ParVectorCreate(hypre_ParCSRMatrixComm(A_up), hypre_ParCSRMatrixGlobalNumCols(A_up), hypre_ParCSRMatrixColStarts(A_up)); hypre_ParVectorInitialize(e1_vector); hypre_ParVectorSetConstantValues(e1_vector, 1.0); e2_vector = hypre_ParVectorCreate(hypre_ParCSRMatrixComm(A_uu), hypre_ParCSRMatrixGlobalNumRows(A_uu), hypre_ParCSRMatrixRowStarts(A_uu)); hypre_ParVectorInitialize(e2_vector); hypre_ParVectorSetConstantValues(e2_vector, 0.0); e3_vector = hypre_ParVectorCreate(hypre_ParCSRMatrixComm(A_uu), hypre_ParCSRMatrixGlobalNumRows(A_uu), hypre_ParCSRMatrixRowStarts(A_uu)); hypre_ParVectorInitialize(e3_vector); hypre_ParVectorSetConstantValues(e3_vector, 0.0); e4_vector = hypre_ParVectorCreate(hypre_ParCSRMatrixComm(A_su), hypre_ParCSRMatrixGlobalNumRows(A_su), hypre_ParCSRMatrixRowStarts(A_su)); hypre_ParVectorInitialize(e4_vector); hypre_ParVectorSetConstantValues(e4_vector, 0.0); e5_vector = hypre_ParVectorCreate(hypre_ParCSRMatrixComm(A_pu), hypre_ParCSRMatrixGlobalNumRows(A_pu), hypre_ParCSRMatrixRowStarts(A_pu)); hypre_ParVectorInitialize(e5_vector); hypre_ParVectorSetConstantValues(e5_vector, 0.0); // compute e2 = A_up * e1 hypre_ParCSRMatrixMatvecOutOfPlace(1.0, A_up, e1_vector, 0.0, e2_vector, e2_vector); // solve e3 = A_uu^-1 * e2 hypre_BoomerAMGSolve(A_ff_solver, A_uu, e2_vector, e3_vector); // compute e4 = A_su * e3 hypre_ParCSRMatrixMatvecOutOfPlace(1.0, A_su, e3_vector, 0.0, e4_vector, e4_vector); // compute e4 = A_su * e3 hypre_ParCSRMatrixMatvecOutOfPlace(1.0, A_su, e3_vector, 0.0, e4_vector, e4_vector); // print e4 hypre_ParVectorPrintIJ(e4_vector, 1, "Dsp"); // compute e5 = A_pu * e3 hypre_ParCSRMatrixMatvecOutOfPlace(1.0, A_pu, e3_vector, 0.0, e5_vector, e5_vector); hypre_ParVectorPrintIJ(e5_vector, 1, "Dpp"); hypre_ParVectorDestroy(e1_vector); hypre_ParVectorDestroy(e2_vector); hypre_ParVectorDestroy(e3_vector); hypre_ParCSRMatrixDestroy(A_uu); hypre_ParCSRMatrixDestroy(A_up); hypre_ParCSRMatrixDestroy(A_pu); hypre_ParCSRMatrixDestroy(A_su); hypre_TFree(U_marker, HYPRE_MEMORY_HOST); hypre_TFree(S_marker, HYPRE_MEMORY_HOST); hypre_TFree(P_marker, HYPRE_MEMORY_HOST); return hypre_error_flag; } HYPRE_Int hypre_MGRApproximateInverse(hypre_ParCSRMatrix *A, hypre_ParCSRMatrix **A_inv) { HYPRE_Int print_level, mr_max_row_nnz, mr_max_iter, nsh_max_row_nnz, nsh_max_iter, mr_col_version; HYPRE_Real mr_tol, nsh_tol; HYPRE_Real *droptol = hypre_CTAlloc(HYPRE_Real, 2, HYPRE_MEMORY_HOST); hypre_ParCSRMatrix *approx_A_inv = NULL; print_level = 0; nsh_max_iter = 2; nsh_max_row_nnz = 2; // default 1000 mr_max_iter = 1; mr_tol = 1.0e-3; mr_max_row_nnz = 2; // default 800 mr_col_version = 0; nsh_tol = 1.0e-3; droptol[0] = 1.0e-2; droptol[1] = 1.0e-2; hypre_ILUParCSRInverseNSH(A, &approx_A_inv, droptol, mr_tol, nsh_tol, HYPRE_REAL_MIN, mr_max_row_nnz, nsh_max_row_nnz, mr_max_iter, nsh_max_iter, mr_col_version, print_level); *A_inv = approx_A_inv; if (droptol) { hypre_TFree(droptol, HYPRE_MEMORY_HOST); } return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_blas_smat_inv_n2 * * TODO (VPM): move this function to seq_ls *--------------------------------------------------------------------------*/ void hypre_blas_smat_inv_n2 (HYPRE_Real *a) { const HYPRE_Real a11 = a[0], a12 = a[1]; const HYPRE_Real a21 = a[2], a22 = a[3]; const HYPRE_Real det_inv = 1.0 / (a11 * a22 - a12 * a21); a[0] = a22 * det_inv; a[1] = -a12 * det_inv; a[2] = -a21 * det_inv; a[3] = a11 * det_inv; } /*-------------------------------------------------------------------------- * hypre_blas_smat_inv_n3 * * TODO (VPM): move this function to seq_ls *--------------------------------------------------------------------------*/ void hypre_blas_smat_inv_n3 (HYPRE_Real *a) { const HYPRE_Real a11 = a[0], a12 = a[1], a13 = a[2]; const HYPRE_Real a21 = a[3], a22 = a[4], a23 = a[5]; const HYPRE_Real a31 = a[6], a32 = a[7], a33 = a[8]; const HYPRE_Real det = a11 * a22 * a33 - a11 * a23 * a32 - a12 * a21 * a33 + a12 * a23 * a31 + a13 * a21 * a32 - a13 * a22 * a31; const HYPRE_Real det_inv = 1.0 / det; a[0] = (a22 * a33 - a23 * a32) * det_inv; a[1] = (a13 * a32 - a12 * a33) * det_inv; a[2] = (a12 * a23 - a13 * a22) * det_inv; a[3] = (a23 * a31 - a21 * a33) * det_inv; a[4] = (a11 * a33 - a13 * a31) * det_inv; a[5] = (a13 * a21 - a11 * a23) * det_inv; a[6] = (a21 * a32 - a22 * a31) * det_inv; a[7] = (a12 * a31 - a11 * a32) * det_inv; a[8] = (a11 * a22 - a12 * a21) * det_inv; } /*-------------------------------------------------------------------------- * hypre_blas_smat_inv_n4 * * TODO (VPM): move this function to seq_ls *--------------------------------------------------------------------------*/ void hypre_blas_smat_inv_n4 (HYPRE_Real *a) { const HYPRE_Real a11 = a[0], a12 = a[1], a13 = a[2], a14 = a[3]; const HYPRE_Real a21 = a[4], a22 = a[5], a23 = a[6], a24 = a[7]; const HYPRE_Real a31 = a[8], a32 = a[9], a33 = a[10], a34 = a[11]; const HYPRE_Real a41 = a[12], a42 = a[13], a43 = a[14], a44 = a[15]; const HYPRE_Real M11 = a22 * a33 * a44 + a23 * a34 * a42 + a24 * a32 * a43 - a22 * a34 * a43 - a23 * a32 * a44 - a24 * a33 * a42; const HYPRE_Real M12 = a12 * a34 * a43 + a13 * a32 * a44 + a14 * a33 * a42 - a12 * a33 * a44 - a13 * a34 * a42 - a14 * a32 * a43; const HYPRE_Real M13 = a12 * a23 * a44 + a13 * a24 * a42 + a14 * a22 * a43 - a12 * a24 * a43 - a13 * a22 * a44 - a14 * a23 * a42; const HYPRE_Real M14 = a12 * a24 * a33 + a13 * a22 * a34 + a14 * a23 * a32 - a12 * a23 * a34 - a13 * a24 * a32 - a14 * a22 * a33; const HYPRE_Real M21 = a21 * a34 * a43 + a23 * a31 * a44 + a24 * a33 * a41 - a21 * a33 * a44 - a23 * a34 * a41 - a24 * a31 * a43; const HYPRE_Real M22 = a11 * a33 * a44 + a13 * a34 * a41 + a14 * a31 * a43 - a11 * a34 * a43 - a13 * a31 * a44 - a14 * a33 * a41; const HYPRE_Real M23 = a11 * a24 * a43 + a13 * a21 * a44 + a14 * a23 * a41 - a11 * a23 * a44 - a13 * a24 * a41 - a14 * a21 * a43; const HYPRE_Real M24 = a11 * a23 * a34 + a13 * a24 * a31 + a14 * a21 * a33 - a11 * a24 * a33 - a13 * a21 * a34 - a14 * a23 * a31; const HYPRE_Real M31 = a21 * a32 * a44 + a22 * a34 * a41 + a24 * a31 * a42 - a21 * a34 * a42 - a22 * a31 * a44 - a24 * a32 * a41; const HYPRE_Real M32 = a11 * a34 * a42 + a12 * a31 * a44 + a14 * a32 * a41 - a11 * a32 * a44 - a12 * a34 * a41 - a14 * a31 * a42; const HYPRE_Real M33 = a11 * a22 * a44 + a12 * a24 * a41 + a14 * a21 * a42 - a11 * a24 * a42 - a12 * a21 * a44 - a14 * a22 * a41; const HYPRE_Real M34 = a11 * a24 * a32 + a12 * a21 * a34 + a14 * a22 * a31 - a11 * a22 * a34 - a12 * a24 * a31 - a14 * a21 * a32; const HYPRE_Real M41 = a21 * a33 * a42 + a22 * a31 * a43 + a23 * a32 * a41 - a21 * a32 * a43 - a22 * a33 * a41 - a23 * a31 * a42; const HYPRE_Real M42 = a11 * a32 * a43 + a12 * a33 * a41 + a13 * a31 * a42 - a11 * a33 * a42 - a12 * a31 * a43 - a13 * a32 * a41; const HYPRE_Real M43 = a11 * a23 * a42 + a12 * a21 * a43 + a13 * a22 * a41 - a11 * a22 * a43 - a12 * a23 * a41 - a13 * a21 * a42; const HYPRE_Real M44 = a11 * a22 * a33 + a12 * a23 * a31 + a13 * a21 * a32 - a11 * a23 * a32 - a12 * a21 * a33 - a13 * a22 * a31; const HYPRE_Real det = a11 * M11 + a12 * M21 + a13 * M31 + a14 * M41; HYPRE_Real det_inv = 1.0 / det; //if ( hypre_abs(det) < 1e-22 ) { //hypre_printf("### WARNING: Matrix is nearly singular! det = %e\n", det); /* printf("##----------------------------------------------\n"); printf("## %12.5e %12.5e %12.5e \n", a0, a1, a2); printf("## %12.5e %12.5e %12.5e \n", a3, a4, a5); printf("## %12.5e %12.5e %12.5e \n", a5, a6, a7); printf("##----------------------------------------------\n"); getchar(); */ //} a[0] = M11 * det_inv; a[1] = M12 * det_inv; a[2] = M13 * det_inv; a[3] = M14 * det_inv; a[4] = M21 * det_inv; a[5] = M22 * det_inv; a[6] = M23 * det_inv; a[7] = M24 * det_inv; a[8] = M31 * det_inv; a[9] = M32 * det_inv; a[10] = M33 * det_inv; a[11] = M34 * det_inv; a[12] = M41 * det_inv; a[13] = M42 * det_inv; a[14] = M43 * det_inv; a[15] = M44 * det_inv; } /*-------------------------------------------------------------------------- * hypre_MGRSmallBlkInverse * * TODO (VPM): move this function to seq_ls *--------------------------------------------------------------------------*/ void hypre_MGRSmallBlkInverse(HYPRE_Real *mat, HYPRE_Int blk_size) { if (blk_size == 2) { hypre_blas_smat_inv_n2(mat); } else if (blk_size == 3) { hypre_blas_smat_inv_n3(mat); } else if (blk_size == 4) { hypre_blas_smat_inv_n4(mat); } } /*-------------------------------------------------------------------------- * hypre_MGRSmallBlkInverse * * TODO (VPM): move this function to seq_ls *--------------------------------------------------------------------------*/ void hypre_blas_mat_inv(HYPRE_Real *a, HYPRE_Int n) { HYPRE_Int i, j, k, l, u, kn, in; HYPRE_Real alinv; if (n == 4) { hypre_blas_smat_inv_n4(a); } else { for (k = 0; k < n; ++k) { kn = k * n; l = kn + k; //if (hypre_abs(a[l]) < HYPRE_REAL_MIN) { // printf("### WARNING: Diagonal entry is close to zero!"); // printf("### WARNING: diag_%d=%e\n", k, a[l]); // a[l] = HYPRE_REAL_MIN; //} alinv = 1.0 / a[l]; a[l] = alinv; for (j = 0; j < k; ++j) { u = kn + j; a[u] *= alinv; } for (j = k + 1; j < n; ++j) { u = kn + j; a[u] *= alinv; } for (i = 0; i < k; ++i) { in = i * n; for (j = 0; j < n; ++j) if (j != k) { u = in + j; a[u] -= a[in + k] * a[kn + j]; } // end if (j!=k) } for (i = k + 1; i < n; ++i) { in = i * n; for (j = 0; j < n; ++j) if (j != k) { u = in + j; a[u] -= a[in + k] * a[kn + j]; } // end if (j!=k) } for (i = 0; i < k; ++i) { u = i * n + k; a[u] *= -alinv; } for (i = k + 1; i < n; ++i) { u = i * n + k; a[u] *= -alinv; } } // end for (k=0; k 1) { num_sends = hypre_ParCSRCommPkgNumSends(comm_pkg); v_buf_data = hypre_CTAlloc(HYPRE_Real, hypre_ParCSRCommPkgSendMapStart(comm_pkg, num_sends), HYPRE_MEMORY_HOST); Vext_data = hypre_CTAlloc(HYPRE_Real, num_cols_offd, HYPRE_MEMORY_HOST); if (num_cols_offd) { A_offd_j = hypre_CSRMatrixJ(A_offd); A_offd_data = hypre_CSRMatrixData(A_offd); } index = 0; for (i = 0; i < num_sends; i++) { start = hypre_ParCSRCommPkgSendMapStart(comm_pkg, i); for (j = start; j < hypre_ParCSRCommPkgSendMapStart(comm_pkg, i + 1); j++) { v_buf_data[index++] = u_data[hypre_ParCSRCommPkgSendMapElmt(comm_pkg, j)]; } } comm_handle = hypre_ParCSRCommHandleCreate(1, comm_pkg, v_buf_data, Vext_data); } /*----------------------------------------------------------------- * Copy current approximation into temporary vector. *-----------------------------------------------------------------*/ #if 0 #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i) HYPRE_SMP_SCHEDULE #endif #endif for (i = 0; i < n; i++) { Vtemp_data[i] = u_data[i]; //printf("u_old[%d] = %e\n",i,Vtemp_data[i]); } if (num_procs > 1) { hypre_ParCSRCommHandleDestroy(comm_handle); comm_handle = NULL; } /*----------------------------------------------------------------- * Relax points block by block *-----------------------------------------------------------------*/ for (i = 0; i < n_block; i++) { for (j = 0; j < blk_size; j++) { bidx = i * blk_size + j; res[j] = f_data[bidx]; for (jj = A_diag_i[bidx]; jj < A_diag_i[bidx + 1]; jj++) { ii = A_diag_j[jj]; if (method == 0) { // Jacobi for diagonal part res[j] -= A_diag_data[jj] * Vtemp_data[ii]; } else if (method == 1) { // Gauss-Seidel for diagonal part res[j] -= A_diag_data[jj] * u_data[ii]; } else { // Default do Jacobi for diagonal part res[j] -= A_diag_data[jj] * Vtemp_data[ii]; } //printf("%d: Au= %e * %e =%e\n",ii,A_diag_data[jj],Vtemp_data[ii], res[j]); } for (jj = A_offd_i[bidx]; jj < A_offd_i[bidx + 1]; jj++) { // always do Jacobi for off-diagonal part ii = A_offd_j[jj]; res[j] -= A_offd_data[jj] * Vext_data[ii]; } //printf("%d: res = %e\n",bidx,res[j]); } for (j = 0; j < blk_size; j++) { bidx1 = i * blk_size + j; for (k = 0; k < blk_size; k++) { bidx = i * nb2 + j * blk_size + k; u_data[bidx1] += res[k] * diaginv[bidx]; //printf("u[%d] = %e, diaginv[%d] = %e\n",bidx1,u_data[bidx1],bidx,diaginv[bidx]); } //printf("u[%d] = %e\n",bidx1,u_data[bidx1]); } } if (num_procs > 1) { hypre_TFree(Vext_data, HYPRE_MEMORY_HOST); hypre_TFree(v_buf_data, HYPRE_MEMORY_HOST); } hypre_TFree(res, HYPRE_MEMORY_HOST); return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_MGRBlockRelaxSolveDevice *--------------------------------------------------------------------------*/ HYPRE_Int hypre_MGRBlockRelaxSolveDevice( hypre_ParCSRMatrix *B, hypre_ParCSRMatrix *A, hypre_ParVector *f, hypre_ParVector *u, hypre_ParVector *Vtemp, HYPRE_Real relax_weight ) { hypre_GpuProfilingPushRange("BlockRelaxSolve"); /* Copy f into temporary vector */ hypre_ParVectorCopy(f, Vtemp); /* Perform Matvec: Vtemp = w * (f - Au) */ if (hypre_ParVectorAllZeros(u)) { #if defined(HYPRE_DEBUG) hypre_assert(hypre_ParVectorInnerProd(u, u) == 0.0); #endif hypre_ParVectorScale(relax_weight, Vtemp); } else { hypre_ParCSRMatrixMatvec(-relax_weight, A, u, relax_weight, Vtemp); } /* Update solution: u += B * Vtemp */ hypre_ParCSRMatrixMatvec(1.0, B, Vtemp, 1.0, u); hypre_ParVectorAllZeros(u) = 0; hypre_GpuProfilingPopRange(); return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_MGRBlockRelaxSolve * * Computes a block Jacobi relaxation of matrix A, given the inverse of the * diagonal blocks (of A) obtained by calling hypre_MGRBlockRelaxSetup. * * TODO: Adapt to relax on specific points based on CF_marker information *--------------------------------------------------------------------------*/ HYPRE_Int hypre_MGRBlockRelaxSolve( hypre_ParCSRMatrix *A, hypre_ParVector *f, hypre_ParVector *u, HYPRE_Int blk_size, HYPRE_Int n_block, HYPRE_Int left_size, HYPRE_Int method, HYPRE_Real *diaginv, hypre_ParVector *Vtemp ) { HYPRE_UNUSED_VAR(left_size); MPI_Comm comm = hypre_ParCSRMatrixComm(A); hypre_CSRMatrix *A_diag = hypre_ParCSRMatrixDiag(A); HYPRE_Real *A_diag_data = hypre_CSRMatrixData(A_diag); HYPRE_Int *A_diag_i = hypre_CSRMatrixI(A_diag); HYPRE_Int *A_diag_j = hypre_CSRMatrixJ(A_diag); hypre_CSRMatrix *A_offd = hypre_ParCSRMatrixOffd(A); HYPRE_Int *A_offd_i = hypre_CSRMatrixI(A_offd); HYPRE_Real *A_offd_data = hypre_CSRMatrixData(A_offd); HYPRE_Int *A_offd_j = hypre_CSRMatrixJ(A_offd); hypre_ParCSRCommPkg *comm_pkg = hypre_ParCSRMatrixCommPkg(A); hypre_ParCSRCommHandle *comm_handle = NULL; HYPRE_Int n = hypre_CSRMatrixNumRows(A_diag); HYPRE_Int num_cols_offd = hypre_CSRMatrixNumCols(A_offd); hypre_Vector *u_local = hypre_ParVectorLocalVector(u); HYPRE_Real *u_data = hypre_VectorData(u_local); hypre_Vector *f_local = hypre_ParVectorLocalVector(f); HYPRE_Real *f_data = hypre_VectorData(f_local); hypre_Vector *Vtemp_local = hypre_ParVectorLocalVector(Vtemp); HYPRE_Real *Vtemp_data = hypre_VectorData(Vtemp_local); HYPRE_Real *Vext_data = NULL; HYPRE_Real *v_buf_data = NULL; HYPRE_Int i, j, k; HYPRE_Int ii, jj; HYPRE_Int bidx, bidx1, bidxm1; HYPRE_Int num_sends; HYPRE_Int index, start; HYPRE_Int num_procs, my_id; HYPRE_Real *res; const HYPRE_Int nb2 = blk_size * blk_size; hypre_MPI_Comm_size(comm, &num_procs); hypre_MPI_Comm_rank(comm, &my_id); // HYPRE_Int num_threads = hypre_NumThreads(); res = hypre_CTAlloc(HYPRE_Real, blk_size, HYPRE_MEMORY_HOST); if (!comm_pkg) { hypre_MatvecCommPkgCreate(A); comm_pkg = hypre_ParCSRMatrixCommPkg(A); } if (num_procs > 1) { num_sends = hypre_ParCSRCommPkgNumSends(comm_pkg); v_buf_data = hypre_CTAlloc(HYPRE_Real, hypre_ParCSRCommPkgSendMapStart(comm_pkg, num_sends), HYPRE_MEMORY_HOST); Vext_data = hypre_CTAlloc(HYPRE_Real, num_cols_offd, HYPRE_MEMORY_HOST); if (num_cols_offd) { A_offd_j = hypre_CSRMatrixJ(A_offd); A_offd_data = hypre_CSRMatrixData(A_offd); } index = 0; for (i = 0; i < num_sends; i++) { start = hypre_ParCSRCommPkgSendMapStart(comm_pkg, i); for (j = start; j < hypre_ParCSRCommPkgSendMapStart(comm_pkg, i + 1); j++) v_buf_data[index++] = u_data[hypre_ParCSRCommPkgSendMapElmt(comm_pkg, j)]; } comm_handle = hypre_ParCSRCommHandleCreate( 1, comm_pkg, v_buf_data, Vext_data); } /*----------------------------------------------------------------- * Copy current approximation into temporary vector. *-----------------------------------------------------------------*/ #if 0 #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i) HYPRE_SMP_SCHEDULE #endif #endif for (i = 0; i < n; i++) { Vtemp_data[i] = u_data[i]; //printf("u_old[%d] = %e\n",i,Vtemp_data[i]); } if (num_procs > 1) { hypre_ParCSRCommHandleDestroy(comm_handle); comm_handle = NULL; } /*----------------------------------------------------------------- * Relax points block by block *-----------------------------------------------------------------*/ for (i = 0; i < n_block; i++) { bidxm1 = i * blk_size; for (j = 0; j < blk_size; j++) { bidx = bidxm1 + j; res[j] = f_data[bidx]; for (jj = A_diag_i[bidx]; jj < A_diag_i[bidx + 1]; jj++) { ii = A_diag_j[jj]; if (method == 0) { // Jacobi for diagonal part res[j] -= A_diag_data[jj] * Vtemp_data[ii]; } else if (method == 1) { // Gauss-Seidel for diagonal part res[j] -= A_diag_data[jj] * u_data[ii]; } else { // Default do Jacobi for diagonal part res[j] -= A_diag_data[jj] * Vtemp_data[ii]; } //printf("%d: Au= %e * %e =%e\n",ii,A_diag_data[jj],Vtemp_data[ii], res[j]); } for (jj = A_offd_i[bidx]; jj < A_offd_i[bidx + 1]; jj++) { // always do Jacobi for off-diagonal part ii = A_offd_j[jj]; res[j] -= A_offd_data[jj] * Vext_data[ii]; } //printf("%d: res = %e\n",bidx,res[j]); } for (j = 0; j < blk_size; j++) { bidx1 = bidxm1 + j; for (k = 0; k < blk_size; k++) { bidx = i * nb2 + j * blk_size + k; u_data[bidx1] += res[k] * diaginv[bidx]; //printf("u[%d] = %e, diaginv[%d] = %e\n",bidx1,u_data[bidx1],bidx,diaginv[bidx]); } //printf("u[%d] = %e\n",bidx1,u_data[bidx1]); } } if (num_procs > 1) { hypre_TFree(Vext_data, HYPRE_MEMORY_HOST); hypre_TFree(v_buf_data, HYPRE_MEMORY_HOST); } hypre_TFree(res, HYPRE_MEMORY_HOST); return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_BlockDiagInvLapack * * TODO (VPM): move this function to seq_ls *--------------------------------------------------------------------------*/ HYPRE_Int hypre_BlockDiagInvLapack(HYPRE_Real *diag, HYPRE_Int N, HYPRE_Int blk_size) { HYPRE_Int nblock, left_size, i; //HYPRE_Int *IPIV = hypre_CTAlloc(HYPRE_Int, blk_size, HYPRE_MEMORY_HOST); HYPRE_Int LWORK = blk_size * blk_size; HYPRE_Real *WORK = hypre_CTAlloc(HYPRE_Real, LWORK, HYPRE_MEMORY_HOST); HYPRE_Int INFO; HYPRE_Real wall_time; HYPRE_Int my_id; MPI_Comm comm = hypre_MPI_COMM_WORLD; hypre_MPI_Comm_rank(comm, &my_id); nblock = N / blk_size; left_size = N - blk_size * nblock; i = nblock; HYPRE_Int *IPIV = hypre_CTAlloc(HYPRE_Int, blk_size, HYPRE_MEMORY_HOST); wall_time = time_getWallclockSeconds(); if (blk_size >= 2 && blk_size <= 4) { for (i = 0; i < nblock; i++) { hypre_MGRSmallBlkInverse(diag + i * LWORK, blk_size); //hypre_blas_smat_inv_n2(diag+i*LWORK); } } else if (blk_size > 4) { for (i = 0; i < nblock; i++) { hypre_dgetrf(&blk_size, &blk_size, diag + i * LWORK, &blk_size, IPIV, &INFO); hypre_dgetri(&blk_size, diag + i * LWORK, &blk_size, IPIV, WORK, &LWORK, &INFO); } } // Left size if (left_size > 0) { hypre_dgetrf(&left_size, &left_size, diag + i * LWORK, &left_size, IPIV, &INFO); hypre_dgetri(&left_size, diag + i * LWORK, &left_size, IPIV, WORK, &LWORK, &INFO); } wall_time = time_getWallclockSeconds() - wall_time; //if (my_id == 0) hypre_printf("Proc = %d, Compute inverse time: %1.5f\n", my_id, wall_time); hypre_TFree(IPIV, HYPRE_MEMORY_HOST); hypre_TFree(WORK, HYPRE_MEMORY_HOST); return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_ParCSRMatrixExtractBlockDiagHost * * Extract the block diagonal part of a A or a principal submatrix of A * defined by a marker (point_type) in an associated CF_marker array. * The result is an array of (flattened) block diagonals. * * If CF marker array is NULL, it returns an array of the (flattened) * block diagonal of the entire matrix A. * * Options for diag_type are: * diag_type = 1: return the inverse of the block diagonals * otherwise : return the block diagonals * * On return, blk_diag_size contains the size of the returned * (flattened) array. (i.e. nnz of extracted block diagonal) * * Input parameters are: * A - original ParCSR matrix * blk_size - Size of diagonal blocks to extract * CF_marker - Array prescribing submatrix from which to extract * block diagonals. Ignored if NULL. * point_type - marker tag in CF_marker array to extract diagonal * diag_type - Type of block diagonal entries to return. * Currently supports block diagonal or inverse block * diagonal entries (diag_type = 1). * * Output parameters are: * diag_ptr - Array of block diagonal entries * blk_diag_size - number of entries in extracted block diagonal * (size of diag_ptr). *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ParCSRMatrixExtractBlockDiagHost( hypre_ParCSRMatrix *par_A, HYPRE_Int blk_size, HYPRE_Int num_points, HYPRE_Int point_type, HYPRE_Int *CF_marker, HYPRE_Int diag_size, HYPRE_Int diag_type, HYPRE_Real *diag_data ) { HYPRE_UNUSED_VAR(diag_size); hypre_CSRMatrix *A_diag = hypre_ParCSRMatrixDiag(par_A); HYPRE_Int nrows = hypre_CSRMatrixNumRows(A_diag); HYPRE_Complex *A_diag_data = hypre_CSRMatrixData(A_diag); HYPRE_Int *A_diag_i = hypre_CSRMatrixI(A_diag); HYPRE_Int *A_diag_j = hypre_CSRMatrixJ(A_diag); HYPRE_Int i, j; HYPRE_Int ii, jj; HYPRE_Int bidx, bidxm1, bidxp1, ridx, didx; HYPRE_Int row_offset; HYPRE_Int whole_num_points, cnt, bstart; HYPRE_Int bs2 = blk_size * blk_size; HYPRE_Int num_blocks; HYPRE_Int left_size = 0; // First count the number of points matching point_type in CF_marker num_blocks = num_points / blk_size; whole_num_points = blk_size * num_blocks; left_size = num_points - whole_num_points; bstart = bs2 * num_blocks; /*----------------------------------------------------------------- * Get all the diagonal sub-blocks *-----------------------------------------------------------------*/ HYPRE_ANNOTATE_REGION_BEGIN("%s", "ExtractDiagSubBlocks"); if (CF_marker == NULL) { // CF Marker is NULL. Consider all rows of matrix. for (i = 0; i < num_blocks; i++) { bidxm1 = i * blk_size; bidxp1 = (i + 1) * blk_size; for (j = 0; j < blk_size; j++) { for (ii = A_diag_i[bidxm1 + j]; ii < A_diag_i[bidxm1 + j + 1]; ii++) { jj = A_diag_j[ii]; if ((jj >= bidxm1) && (jj < bidxp1) && hypre_cabs(A_diag_data[ii]) > HYPRE_REAL_MIN) { bidx = j * blk_size + jj - bidxm1; diag_data[i * bs2 + bidx] = A_diag_data[ii]; } } } } // deal with remaining points if any if (left_size) { bidxm1 = whole_num_points; bidxp1 = num_points; for (j = 0; j < left_size; j++) { for (ii = A_diag_i[bidxm1 + j]; ii < A_diag_i[bidxm1 + j + 1]; ii++) { jj = A_diag_j[ii]; if ((jj >= bidxm1) && (jj < bidxp1) && hypre_cabs(A_diag_data[ii]) > HYPRE_REAL_MIN) { bidx = j * left_size + jj - bidxm1; diag_data[bstart + bidx] = A_diag_data[ii]; } } } } } else { // extract only block diagonal of submatrix defined by CF marker cnt = 0; row_offset = 0; for (i = 0; i < nrows; i++) { if (CF_marker[i] == point_type) { bidx = cnt / blk_size; ridx = cnt % blk_size; bidxm1 = bidx * blk_size; bidxp1 = (bidx + 1) * blk_size; for (ii = A_diag_i[i]; ii < A_diag_i[i + 1]; ii++) { jj = A_diag_j[ii]; if (CF_marker[jj] == point_type) { if ((jj - row_offset >= bidxm1) && (jj - row_offset < bidxp1) && (hypre_cabs(A_diag_data[ii]) > HYPRE_REAL_MIN)) { didx = bidx * bs2 + ridx * blk_size + jj - bidxm1 - row_offset; diag_data[didx] = A_diag_data[ii]; } } } if (++cnt == whole_num_points) { break; } } else { row_offset++; } } // remaining points for (i = whole_num_points; i < num_points; i++) { if (CF_marker[i] == point_type) { bidx = num_blocks; ridx = cnt - whole_num_points; bidxm1 = whole_num_points; bidxp1 = num_points; for (ii = A_diag_i[i]; ii < A_diag_i[i + 1]; ii++) { jj = A_diag_j[ii]; if (CF_marker[jj] == point_type) { if ((jj - row_offset >= bidxm1) && (jj - row_offset < bidxp1) && (hypre_cabs(A_diag_data[ii]) > HYPRE_REAL_MIN)) { didx = bstart + ridx * left_size + jj - bidxm1 - row_offset; diag_data[didx] = A_diag_data[ii]; } } } cnt++; } else { row_offset++; } } } HYPRE_ANNOTATE_REGION_END("%s", "ExtractDiagSubBlocks"); /*----------------------------------------------------------------- * Compute the inverses of all the diagonal sub-blocks *-----------------------------------------------------------------*/ if (diag_type == 1) { HYPRE_ANNOTATE_REGION_BEGIN("%s", "InvertDiagSubBlocks"); if (blk_size > 1) { hypre_BlockDiagInvLapack(diag_data, num_points, blk_size); } else { for (i = 0; i < num_points; i++) { if (hypre_cabs(diag_data[i]) < HYPRE_REAL_MIN) { diag_data[i] = 0.0; } else { diag_data[i] = 1.0 / diag_data[i]; } } } HYPRE_ANNOTATE_REGION_END("%s", "InvertDiagSubBlocks"); } return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_ParCSRMatrixBlockDiagMatrix * * Extract the block diagonal part of a A or a principal submatrix of A defined * by a marker (point_type) in an associated CF_marker array. The result is * a new block diagonal parCSR matrix. * * If CF marker array is NULL, it returns the block diagonal of the matrix A. * * Options for diag_type are: * diag_type = 1: return the inverse of the block diagonals * otherwise : return the block diagonals * * Input parameters are: * par_A - original ParCSR matrix * blk_size - Size of diagonal blocks to extract * CF_marker - Array prescribing submatrix from which to extract block * diagonals. Ignored if NULL. * point_type - marker tag in CF_marker array to extract diagonal * diag_type - Type of block diagonal entries to return. Currently supports * block diagonal or inverse block diagonal entries. * * Output parameters are: * B_ptr - New block diagonal matrix *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ParCSRMatrixBlockDiagMatrix( hypre_ParCSRMatrix *A, HYPRE_Int blk_size, HYPRE_Int point_type, HYPRE_Int *CF_marker, HYPRE_Int diag_type, hypre_ParCSRMatrix **B_ptr ) { #if defined (HYPRE_USING_GPU) HYPRE_ExecutionPolicy exec = hypre_GetExecPolicy1( hypre_ParCSRMatrixMemoryLocation(A) ); if (exec == HYPRE_EXEC_DEVICE) { hypre_ParCSRMatrixBlockDiagMatrixDevice(A, blk_size, point_type, CF_marker, diag_type, B_ptr); } else #endif { hypre_ParCSRMatrixBlockDiagMatrixHost(A, blk_size, point_type, CF_marker, diag_type, B_ptr); } return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_ParCSRMatrixBlockDiagMatrixHost *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ParCSRMatrixBlockDiagMatrixHost( hypre_ParCSRMatrix *A, HYPRE_Int blk_size, HYPRE_Int point_type, HYPRE_Int *CF_marker, HYPRE_Int diag_type, hypre_ParCSRMatrix **B_ptr ) { /* Input matrix info */ MPI_Comm comm = hypre_ParCSRMatrixComm(A); HYPRE_BigInt *row_starts_A = hypre_ParCSRMatrixRowStarts(A); HYPRE_BigInt num_rows_A = hypre_ParCSRMatrixGlobalNumRows(A); hypre_CSRMatrix *A_diag = hypre_ParCSRMatrixDiag(A); HYPRE_Int A_diag_num_rows = hypre_CSRMatrixNumRows(A_diag); /* Global block matrix info */ hypre_ParCSRMatrix *par_B; HYPRE_BigInt num_rows_B; HYPRE_BigInt row_starts_B[2]; /* Diagonal block matrix info */ hypre_CSRMatrix *B_diag; HYPRE_Int B_diag_num_rows = 0; HYPRE_Int B_diag_size; HYPRE_Int *B_diag_i; HYPRE_Int *B_diag_j; HYPRE_Complex *B_diag_data; /* Local variables */ HYPRE_BigInt num_rows_big; HYPRE_BigInt scan_recv; HYPRE_Int num_procs, my_id; HYPRE_Int nb2 = blk_size * blk_size; HYPRE_Int num_blocks, num_left; HYPRE_Int bidx, i, j, k; hypre_MPI_Comm_rank(comm, &my_id); hypre_MPI_Comm_size(comm, &num_procs); /* Sanity check */ if ((num_rows_A > 0) && (num_rows_A < blk_size)) { hypre_error_w_msg(HYPRE_ERROR_GENERIC, "Error!!! Input matrix is smaller than block size."); return hypre_error_flag; } /*----------------------------------------------------------------- * Count the number of points matching point_type in CF_marker *-----------------------------------------------------------------*/ if (CF_marker == NULL) { B_diag_num_rows = A_diag_num_rows; } else { #if !defined(_MSC_VER) && defined(HYPRE_USING_OPENMP) #pragma omp parallel for private(i) reduction(+:B_diag_num_rows) HYPRE_SMP_SCHEDULE #endif for (i = 0; i < A_diag_num_rows; i++) { B_diag_num_rows += (CF_marker[i] == point_type) ? 1 : 0; } } num_blocks = B_diag_num_rows / blk_size; num_left = B_diag_num_rows - num_blocks * blk_size; B_diag_size = blk_size * (blk_size * num_blocks) + num_left * num_left; /*----------------------------------------------------------------- * Compute global number of rows and partitionings *-----------------------------------------------------------------*/ if (CF_marker) { num_rows_big = (HYPRE_BigInt) B_diag_num_rows; hypre_MPI_Scan(&num_rows_big, &scan_recv, 1, HYPRE_MPI_BIG_INT, hypre_MPI_SUM, comm); /* first point in my range */ row_starts_B[0] = scan_recv - num_rows_big; /* first point in next proc's range */ row_starts_B[1] = scan_recv; if (my_id == (num_procs - 1)) { num_rows_B = row_starts_B[1]; } hypre_MPI_Bcast(&num_rows_B, 1, HYPRE_MPI_BIG_INT, num_procs - 1, comm); } else { row_starts_B[0] = row_starts_A[0]; row_starts_B[1] = row_starts_A[1]; num_rows_B = num_rows_A; } /* Create matrix B */ par_B = hypre_ParCSRMatrixCreate(comm, num_rows_B, num_rows_B, row_starts_B, row_starts_B, 0, B_diag_size, 0); hypre_ParCSRMatrixInitialize_v2(par_B, HYPRE_MEMORY_HOST); B_diag = hypre_ParCSRMatrixDiag(par_B); B_diag_i = hypre_CSRMatrixI(B_diag); B_diag_j = hypre_CSRMatrixJ(B_diag); B_diag_data = hypre_CSRMatrixData(B_diag); /*----------------------------------------------------------------------- * Extract coefficients *-----------------------------------------------------------------------*/ hypre_ParCSRMatrixExtractBlockDiagHost(A, blk_size, B_diag_num_rows, point_type, CF_marker, B_diag_size, diag_type, B_diag_data); /*----------------------------------------------------------------- * Set row/col indices of diagonal blocks *-----------------------------------------------------------------*/ B_diag_i[B_diag_num_rows] = B_diag_size; for (i = 0; i < num_blocks; i++) { //diag_local = &diag[i * nb2]; for (k = 0; k < blk_size; k++) { B_diag_i[i * blk_size + k] = i * nb2 + k * blk_size; for (j = 0; j < blk_size; j++) { bidx = i * nb2 + k * blk_size + j; B_diag_j[bidx] = i * blk_size + j; //B_diag_data[bidx] = diag_local[k * blk_size + j]; } } } /*----------------------------------------------------------------- * Treat the remaining points *-----------------------------------------------------------------*/ //diag_local = &diag[num_blocks * nb2]; for (k = 0; k < num_left; k++) { B_diag_i[num_blocks * blk_size + k] = num_blocks * nb2 + k * num_left; for (j = 0; j < num_left; j++) { bidx = num_blocks * nb2 + k * num_left + j; B_diag_j[bidx] = num_blocks * blk_size + j; //B_diag_data[bidx] = diag_local[k * num_left + j]; } } /* Set output pointer */ *B_ptr = par_B; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_MGRBlockRelaxSetup * * Setup block smoother. Computes the entries of the inverse of the block * diagonal matrix with blk_size diagonal blocks. * * Current implementation ignores reserved C-pts and acts on whole matrix. *--------------------------------------------------------------------------*/ HYPRE_Int hypre_MGRBlockRelaxSetup( hypre_ParCSRMatrix *A, HYPRE_Int blk_size, HYPRE_Real **diaginvptr ) { hypre_CSRMatrix *A_diag = hypre_ParCSRMatrixDiag(A); HYPRE_Int num_rows = hypre_CSRMatrixNumRows(A_diag); HYPRE_Int num_blocks; HYPRE_Int diag_size; HYPRE_Complex *diaginv = *diaginvptr; num_blocks = 1 + (num_rows - 1) / blk_size; diag_size = blk_size * (blk_size * num_blocks); hypre_TFree(diaginv, HYPRE_MEMORY_HOST); diaginv = hypre_CTAlloc(HYPRE_Complex, diag_size, HYPRE_MEMORY_HOST); hypre_ParCSRMatrixExtractBlockDiagHost(A, blk_size, num_rows, 0, NULL, diag_size, 1, diaginv); *diaginvptr = diaginv; #if 0 MPI_Comm comm = hypre_ParCSRMatrixComm(A); hypre_CSRMatrix *A_diag = hypre_ParCSRMatrixDiag(A); HYPRE_Real *A_diag_data = hypre_CSRMatrixData(A_diag); HYPRE_Int *A_diag_i = hypre_CSRMatrixI(A_diag); HYPRE_Int *A_diag_j = hypre_CSRMatrixJ(A_diag); HYPRE_Int n = hypre_CSRMatrixNumRows(A_diag); HYPRE_Int i, j, k; HYPRE_Int ii, jj; HYPRE_Int bidx, bidxm1, bidxp1; HYPRE_Int num_procs, my_id; const HYPRE_Int nb2 = blk_size * blk_size; HYPRE_Int n_block; HYPRE_Int left_size, inv_size; HYPRE_Real *diaginv = *diaginvptr; hypre_MPI_Comm_size(comm, &num_procs); hypre_MPI_Comm_rank(comm, &my_id); //HYPRE_Int num_threads = hypre_NumThreads(); if (my_id == num_procs) { n_block = (n - reserved_coarse_size) / blk_size; left_size = n - blk_size * n_block; } else { n_block = n / blk_size; left_size = n - blk_size * n_block; } n_block = n / blk_size; left_size = n - blk_size * n_block; inv_size = nb2 * n_block + left_size * left_size; if (diaginv != NULL) { hypre_TFree(diaginv, HYPRE_MEMORY_HOST); diaginv = hypre_CTAlloc(HYPRE_Real, inv_size, HYPRE_MEMORY_HOST); } else { diaginv = hypre_CTAlloc(HYPRE_Real, inv_size, HYPRE_MEMORY_HOST); } /*----------------------------------------------------------------- * Get all the diagonal sub-blocks *-----------------------------------------------------------------*/ for (i = 0; i < n_block; i++) { bidxm1 = i * blk_size; bidxp1 = (i + 1) * blk_size; //printf("bidxm1 = %d,bidxp1 = %d\n",bidxm1,bidxp1); for (k = 0; k < blk_size; k++) { for (j = 0; j < blk_size; j++) { bidx = i * nb2 + k * blk_size + j; diaginv[bidx] = 0.0; } for (ii = A_diag_i[bidxm1 + k]; ii < A_diag_i[bidxm1 + k + 1]; ii++) { jj = A_diag_j[ii]; if (jj >= bidxm1 && jj < bidxp1 && hypre_cabs(A_diag_data[ii]) > HYPRE_REAL_MIN) { bidx = i * nb2 + k * blk_size + jj - bidxm1; //printf("jj = %d,val = %e, bidx = %d\n",jj,A_diag_data[ii],bidx); diaginv[bidx] = A_diag_data[ii]; } } } } for (i = 0; i < left_size; i++) { bidxm1 = n_block * nb2 + i * blk_size; bidxp1 = n_block * nb2 + (i + 1) * blk_size; for (j = 0; j < left_size; j++) { bidx = n_block * nb2 + i * blk_size + j; diaginv[bidx] = 0.0; } for (ii = A_diag_i[n_block * blk_size + i]; ii < A_diag_i[n_block * blk_size + i + 1]; ii++) { jj = A_diag_j[ii]; if (jj > n_block * blk_size) { bidx = n_block * nb2 + i * blk_size + jj - n_block * blk_size; diaginv[bidx] = A_diag_data[ii]; } } } /*----------------------------------------------------------------- * compute the inverses of all the diagonal sub-blocks *-----------------------------------------------------------------*/ if (blk_size > 1) { for (i = 0; i < n_block; i++) { hypre_blas_mat_inv(diaginv + i * nb2, blk_size); } hypre_blas_mat_inv(diaginv + (HYPRE_Int)(blk_size * nb2), left_size); } else { for (i = 0; i < n; i++) { /* TODO: zero-diagonal should be tested previously */ if (hypre_cabs(diaginv[i]) < HYPRE_REAL_MIN) { diaginv[i] = 0.0; } else { diaginv[i] = 1.0 / diaginv[i]; } } } *diaginvptr = diaginv; #endif return hypre_error_flag; } #if 0 HYPRE_Int hypre_blockRelax(hypre_ParCSRMatrix *A, hypre_ParVector *f, hypre_ParVector *u, HYPRE_Int blk_size, HYPRE_Int reserved_coarse_size, HYPRE_Int method, hypre_ParVector *Vtemp, hypre_ParVector *Ztemp) { MPI_Comm comm = hypre_ParCSRMatrixComm(A); hypre_CSRMatrix *A_diag = hypre_ParCSRMatrixDiag(A); HYPRE_Real *A_diag_data = hypre_CSRMatrixData(A_diag); HYPRE_Int *A_diag_i = hypre_CSRMatrixI(A_diag); HYPRE_Int *A_diag_j = hypre_CSRMatrixJ(A_diag); HYPRE_Int n = hypre_CSRMatrixNumRows(A_diag); HYPRE_Int i, j, k; HYPRE_Int ii, jj; HYPRE_Int bidx, bidxm1, bidxp1; HYPRE_Int num_procs, my_id; const HYPRE_Int nb2 = blk_size * blk_size; HYPRE_Int n_block; HYPRE_Int left_size, inv_size; HYPRE_Real *diaginv; hypre_MPI_Comm_size(comm, &num_procs); hypre_MPI_Comm_rank(comm, &my_id); //HYPRE_Int num_threads = hypre_NumThreads(); if (my_id == num_procs) { n_block = (n - reserved_coarse_size) / blk_size; left_size = n - blk_size * n_block; } else { n_block = n / blk_size; left_size = n - blk_size * n_block; } inv_size = nb2 * n_block + left_size * left_size; diaginv = hypre_CTAlloc(HYPRE_Real, inv_size, HYPRE_MEMORY_HOST); /*----------------------------------------------------------------- * Get all the diagonal sub-blocks *-----------------------------------------------------------------*/ for (i = 0; i < n_block; i++) { bidxm1 = i * blk_size; bidxp1 = (i + 1) * blk_size; //printf("bidxm1 = %d,bidxp1 = %d\n",bidxm1,bidxp1); for (k = 0; k < blk_size; k++) { for (j = 0; j < blk_size; j++) { bidx = i * nb2 + k * blk_size + j; diaginv[bidx] = 0.0; } for (ii = A_diag_i[bidxm1 + k]; ii < A_diag_i[bidxm1 + k + 1]; ii++) { jj = A_diag_j[ii]; if (jj >= bidxm1 && jj < bidxp1 && hypre_abs(A_diag_data[ii]) > HYPRE_REAL_MIN) { bidx = i * nb2 + k * blk_size + jj - bidxm1; //printf("jj = %d,val = %e, bidx = %d\n",jj,A_diag_data[ii],bidx); diaginv[bidx] = A_diag_data[ii]; } } } } for (i = 0; i < left_size; i++) { bidxm1 = n_block * nb2 + i * blk_size; bidxp1 = n_block * nb2 + (i + 1) * blk_size; for (j = 0; j < left_size; j++) { bidx = n_block * nb2 + i * blk_size + j; diaginv[bidx] = 0.0; } for (ii = A_diag_i[n_block * blk_size + i]; ii < A_diag_i[n_block * blk_size + i + 1]; ii++) { jj = A_diag_j[ii]; if (jj > n_block * blk_size) { bidx = n_block * nb2 + i * blk_size + jj - n_block * blk_size; diaginv[bidx] = A_diag_data[ii]; } } } /* for (i = 0;i < n_block; i++) { for (j = 0;j < blk_size; j++) { for (k = 0;k < blk_size; k ++) { bidx = i*nb2 + j*blk_size + k; printf("%e\t",diaginv[bidx]); } printf("\n"); } printf("\n"); } */ /*----------------------------------------------------------------- * compute the inverses of all the diagonal sub-blocks *-----------------------------------------------------------------*/ if (blk_size > 1) { for (i = 0; i < n_block; i++) { hypre_blas_mat_inv(diaginv + i * nb2, blk_size); } hypre_blas_mat_inv(diaginv + (HYPRE_Int)(blk_size * nb2), left_size); /* for (i = 0;i < n_block; i++) { for (j = 0;j < blk_size; j++) { for (k = 0;k < blk_size; k ++) { bidx = i*nb2 + j*blk_size + k; printf("%e\t",diaginv[bidx]); } printf("\n"); } printf("\n"); } */ } else { for (i = 0; i < n; i++) { // FIX-ME: zero-diagonal should be tested previously if (hypre_abs(diaginv[i]) < HYPRE_REAL_MIN) { diaginv[i] = 0.0; } else { diaginv[i] = 1.0 / diaginv[i]; } } } hypre_MGRBlockRelaxSolve(A, f, u, blk_size, n_block, left_size, method, diaginv, Vtemp); /*----------------------------------------------------------------- * Free temporary memory *-----------------------------------------------------------------*/ hypre_TFree(diaginv, HYPRE_MEMORY_HOST); return (hypre_error_flag); } #endif /*-------------------------------------------------------------------------- * hypre_MGRSetFSolver * * set F-relaxation solver *--------------------------------------------------------------------------*/ HYPRE_Int hypre_MGRSetFSolver( void *mgr_vdata, HYPRE_Int (*fine_grid_solver_solve)(void*, void*, void*, void*), HYPRE_Int (*fine_grid_solver_setup)(void*, void*, void*, void*), void *fsolver ) { hypre_ParMGRData *mgr_data = (hypre_ParMGRData*) mgr_vdata; HYPRE_Int max_num_coarse_levels = (mgr_data -> max_num_coarse_levels); HYPRE_Solver **aff_solver = (mgr_data -> aff_solver); if (aff_solver == NULL) { aff_solver = hypre_CTAlloc(HYPRE_Solver*, max_num_coarse_levels, HYPRE_MEMORY_HOST); } /* only allow to set F-solver for the first level */ aff_solver[0] = (HYPRE_Solver *) fsolver; (mgr_data -> fine_grid_solver_solve) = fine_grid_solver_solve; (mgr_data -> fine_grid_solver_setup) = fine_grid_solver_setup; (mgr_data -> aff_solver) = aff_solver; (mgr_data -> fsolver_mode) = 0; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_MGRSetFSolverAtLevel * * set F-relaxation solver for a given MGR level. * * Note this function asks for a level identifier and doesn't expect an array * of function pointers for each level (as done by SetLevel functions). *--------------------------------------------------------------------------*/ HYPRE_Int hypre_MGRSetFSolverAtLevel( void *mgr_vdata, void *fsolver, HYPRE_Int level ) { hypre_ParMGRData *mgr_data = (hypre_ParMGRData*) mgr_vdata; HYPRE_Int max_num_coarse_levels = (mgr_data -> max_num_coarse_levels); HYPRE_Solver **aff_solver = (mgr_data -> aff_solver); /* Check if the requested level makes sense */ if (level < 0 || level >= max_num_coarse_levels) { hypre_error_in_arg(1); return hypre_error_flag; } /* Allocate aff_solver if needed */ if (!aff_solver) { (mgr_data -> aff_solver) = aff_solver = hypre_CTAlloc(HYPRE_Solver*, max_num_coarse_levels, HYPRE_MEMORY_HOST); } aff_solver[level] = (HYPRE_Solver *) fsolver; (mgr_data -> fsolver_mode) = 1; return hypre_error_flag; } /* set coarse grid solver */ HYPRE_Int hypre_MGRSetCoarseSolver( void *mgr_vdata, HYPRE_Int (*coarse_grid_solver_solve)(void*, void*, void*, void*), HYPRE_Int (*coarse_grid_solver_setup)(void*, void*, void*, void*), void *coarse_grid_solver ) { hypre_ParMGRData *mgr_data = (hypre_ParMGRData*) mgr_vdata; (mgr_data -> coarse_grid_solver_solve) = coarse_grid_solver_solve; (mgr_data -> coarse_grid_solver_setup) = coarse_grid_solver_setup; (mgr_data -> coarse_grid_solver) = (HYPRE_Solver) coarse_grid_solver; (mgr_data -> use_default_cgrid_solver) = 0; return hypre_error_flag; } /* Set the maximum number of coarse levels. * maxcoarselevs = 1 yields the default 2-grid scheme. */ HYPRE_Int hypre_MGRSetMaxCoarseLevels( void *mgr_vdata, HYPRE_Int maxcoarselevs ) { hypre_ParMGRData *mgr_data = (hypre_ParMGRData*) mgr_vdata; (mgr_data -> max_num_coarse_levels) = maxcoarselevs; return hypre_error_flag; } /* Set the system block size */ HYPRE_Int hypre_MGRSetBlockSize( void *mgr_vdata, HYPRE_Int bsize ) { hypre_ParMGRData *mgr_data = (hypre_ParMGRData*) mgr_vdata; (mgr_data -> block_size) = bsize; return hypre_error_flag; } /* Set the relaxation type for the fine levels of the reduction. * Currently supports the following flavors of relaxation types * as described in the documentation: * relax_types 0 - 8, 13, 14, 18, 19, 98. * See par_relax.c and par_relax_more.c for more details. * */ HYPRE_Int hypre_MGRSetRelaxType( void *mgr_vdata, HYPRE_Int relax_type ) { hypre_ParMGRData *mgr_data = (hypre_ParMGRData*) mgr_vdata; (mgr_data -> relax_type) = relax_type; return hypre_error_flag; } /* Set the number of relaxation sweeps */ HYPRE_Int hypre_MGRSetNumRelaxSweeps( void *mgr_vdata, HYPRE_Int nsweeps ) { hypre_ParMGRData *mgr_data = (hypre_ParMGRData*) mgr_vdata; HYPRE_Int i; HYPRE_Int max_num_coarse_levels = (mgr_data -> max_num_coarse_levels); hypre_TFree(mgr_data -> num_relax_sweeps, HYPRE_MEMORY_HOST); HYPRE_Int *num_relax_sweeps = hypre_CTAlloc(HYPRE_Int, max_num_coarse_levels, HYPRE_MEMORY_HOST); for (i = 0; i < max_num_coarse_levels; i++) { num_relax_sweeps[i] = nsweeps; } (mgr_data -> num_relax_sweeps) = num_relax_sweeps; return hypre_error_flag; } HYPRE_Int hypre_MGRSetLevelNumRelaxSweeps( void *mgr_vdata, HYPRE_Int *level_nsweeps ) { hypre_ParMGRData *mgr_data = (hypre_ParMGRData*) mgr_vdata; HYPRE_Int i; HYPRE_Int max_num_coarse_levels = (mgr_data -> max_num_coarse_levels); hypre_TFree(mgr_data -> num_relax_sweeps, HYPRE_MEMORY_HOST); HYPRE_Int *num_relax_sweeps = hypre_CTAlloc(HYPRE_Int, max_num_coarse_levels, HYPRE_MEMORY_HOST); if (level_nsweeps != NULL) { for (i = 0; i < max_num_coarse_levels; i++) { num_relax_sweeps[i] = level_nsweeps[i]; } } else { for (i = 0; i < max_num_coarse_levels; i++) { num_relax_sweeps[i] = 0; } } (mgr_data -> num_relax_sweeps) = num_relax_sweeps; return hypre_error_flag; } /* Set the order of the global smoothing step at each level * 1=Down cycle/ Pre-smoothing (default) * 2=Up cycle/ Post-smoothing */ HYPRE_Int hypre_MGRSetGlobalSmoothCycle( void *mgr_vdata, HYPRE_Int smooth_cycle ) { hypre_ParMGRData *mgr_data = (hypre_ParMGRData*) mgr_vdata; (mgr_data -> global_smooth_cycle) = smooth_cycle; return hypre_error_flag; } /* Set the F-relaxation strategy: 0=single level, 1=multi level */ HYPRE_Int hypre_MGRSetFRelaxMethod( void *mgr_vdata, HYPRE_Int relax_method ) { hypre_ParMGRData *mgr_data = (hypre_ParMGRData*) mgr_vdata; HYPRE_Int i; HYPRE_Int max_num_coarse_levels = (mgr_data -> max_num_coarse_levels); hypre_TFree(mgr_data -> Frelax_method, HYPRE_MEMORY_HOST); HYPRE_Int *Frelax_method = hypre_CTAlloc(HYPRE_Int, max_num_coarse_levels, HYPRE_MEMORY_HOST); for (i = 0; i < max_num_coarse_levels; i++) { Frelax_method[i] = relax_method; } (mgr_data -> Frelax_method) = Frelax_method; return hypre_error_flag; } /* Set the F-relaxation strategy: 0=single level, 1=multi level */ /* This will be removed later. Use SetLevelFrelaxType */ HYPRE_Int hypre_MGRSetLevelFRelaxMethod( void *mgr_vdata, HYPRE_Int *relax_method ) { hypre_ParMGRData *mgr_data = (hypre_ParMGRData*) mgr_vdata; HYPRE_Int i; HYPRE_Int max_num_coarse_levels = (mgr_data -> max_num_coarse_levels); hypre_TFree(mgr_data -> Frelax_method, HYPRE_MEMORY_HOST); HYPRE_Int *Frelax_method = hypre_CTAlloc(HYPRE_Int, max_num_coarse_levels, HYPRE_MEMORY_HOST); if (relax_method != NULL) { for (i = 0; i < max_num_coarse_levels; i++) { Frelax_method[i] = relax_method[i]; } } else { for (i = 0; i < max_num_coarse_levels; i++) { Frelax_method[i] = 0; } } (mgr_data -> Frelax_method) = Frelax_method; return hypre_error_flag; } /* Set the F-relaxation type: * 0: Jacobi * 1: Vcycle smoother * 2: AMG * Otherwise: use standard BoomerAMGRelax options */ HYPRE_Int hypre_MGRSetLevelFRelaxType( void *mgr_vdata, HYPRE_Int *relax_type ) { hypre_ParMGRData *mgr_data = (hypre_ParMGRData*) mgr_vdata; HYPRE_Int i; HYPRE_Int max_num_coarse_levels = (mgr_data -> max_num_coarse_levels); hypre_TFree(mgr_data -> Frelax_type, HYPRE_MEMORY_HOST); HYPRE_Int *Frelax_type = hypre_CTAlloc(HYPRE_Int, max_num_coarse_levels, HYPRE_MEMORY_HOST); if (relax_type != NULL) { for (i = 0; i < max_num_coarse_levels; i++) { Frelax_type[i] = relax_type[i]; } } else { for (i = 0; i < max_num_coarse_levels; i++) { Frelax_type[i] = 0; } } (mgr_data -> Frelax_type) = Frelax_type; return hypre_error_flag; } /* Coarse grid method: 0=Galerkin RAP, 1=non-Galerkin with dropping */ HYPRE_Int hypre_MGRSetCoarseGridMethod( void *mgr_vdata, HYPRE_Int *cg_method ) { hypre_ParMGRData *mgr_data = (hypre_ParMGRData*) mgr_vdata; HYPRE_Int i; HYPRE_Int max_num_coarse_levels = (mgr_data -> max_num_coarse_levels); hypre_TFree(mgr_data -> coarse_grid_method, HYPRE_MEMORY_HOST); HYPRE_Int *coarse_grid_method = hypre_CTAlloc(HYPRE_Int, max_num_coarse_levels, HYPRE_MEMORY_HOST); if (cg_method != NULL) { for (i = 0; i < max_num_coarse_levels; i++) { coarse_grid_method[i] = cg_method[i]; } } else { for (i = 0; i < max_num_coarse_levels; i++) { coarse_grid_method[i] = 0; } } (mgr_data -> coarse_grid_method) = coarse_grid_method; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_MGRSetNonGalerkinMaxElmts *--------------------------------------------------------------------------*/ HYPRE_Int hypre_MGRSetNonGalerkinMaxElmts( void *mgr_vdata, HYPRE_Int max_elmts ) { hypre_ParMGRData *mgr_data = (hypre_ParMGRData*) mgr_vdata; HYPRE_Int max_num_coarse_levels = (mgr_data -> max_num_coarse_levels); HYPRE_Int *nonglk_max_elmts = (mgr_data -> nonglk_max_elmts); HYPRE_Int i; if (!nonglk_max_elmts) { nonglk_max_elmts = hypre_CTAlloc(HYPRE_Int, max_num_coarse_levels, HYPRE_MEMORY_HOST); } hypre_TFree(mgr_data -> nonglk_max_elmts, HYPRE_MEMORY_HOST); for (i = 0; i < max_num_coarse_levels; i++) { nonglk_max_elmts[i] = max_elmts; } (mgr_data -> nonglk_max_elmts) = nonglk_max_elmts; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_MGRSetLevelNonGalerkinMaxElmts *--------------------------------------------------------------------------*/ HYPRE_Int hypre_MGRSetLevelNonGalerkinMaxElmts( void *mgr_vdata, HYPRE_Int *max_elmts ) { hypre_ParMGRData *mgr_data = (hypre_ParMGRData*) mgr_vdata; HYPRE_Int max_num_coarse_levels = (mgr_data -> max_num_coarse_levels); HYPRE_Int *nonglk_max_elmts = (mgr_data -> nonglk_max_elmts); HYPRE_Int i; if (!nonglk_max_elmts) { nonglk_max_elmts = hypre_CTAlloc(HYPRE_Int, max_num_coarse_levels, HYPRE_MEMORY_HOST); } hypre_TFree(mgr_data -> nonglk_max_elmts, HYPRE_MEMORY_HOST); for (i = 0; i < max_num_coarse_levels; i++) { nonglk_max_elmts[i] = max_elmts[i]; } (mgr_data -> nonglk_max_elmts) = nonglk_max_elmts; return hypre_error_flag; } /* Set the F-relaxation number of functions for each level */ HYPRE_Int hypre_MGRSetLevelFRelaxNumFunctions( void *mgr_vdata, HYPRE_Int *num_functions ) { hypre_ParMGRData *mgr_data = (hypre_ParMGRData*) mgr_vdata; HYPRE_Int i; HYPRE_Int max_num_coarse_levels = (mgr_data -> max_num_coarse_levels); hypre_TFree(mgr_data -> Frelax_num_functions, HYPRE_MEMORY_HOST); HYPRE_Int *Frelax_num_functions = hypre_CTAlloc(HYPRE_Int, max_num_coarse_levels, HYPRE_MEMORY_HOST); if (num_functions != NULL) { for (i = 0; i < max_num_coarse_levels; i++) { Frelax_num_functions[i] = num_functions[i]; } } else { for (i = 0; i < max_num_coarse_levels; i++) { Frelax_num_functions[i] = 1; } } (mgr_data -> Frelax_num_functions) = Frelax_num_functions; return hypre_error_flag; } /* Set the type of the restriction type * for computing restriction operator */ HYPRE_Int hypre_MGRSetLevelRestrictType( void *mgr_vdata, HYPRE_Int *restrict_type) { hypre_ParMGRData *mgr_data = (hypre_ParMGRData*) mgr_vdata; HYPRE_Int i; HYPRE_Int max_num_coarse_levels = (mgr_data -> max_num_coarse_levels); hypre_TFree((mgr_data -> restrict_type), HYPRE_MEMORY_HOST); HYPRE_Int *level_restrict_type = hypre_CTAlloc(HYPRE_Int, max_num_coarse_levels, HYPRE_MEMORY_HOST); if (restrict_type != NULL) { for (i = 0; i < max_num_coarse_levels; i++) { level_restrict_type[i] = *(restrict_type + i); } } else { for (i = 0; i < max_num_coarse_levels; i++) { level_restrict_type[i] = 0; } } (mgr_data -> restrict_type) = level_restrict_type; return hypre_error_flag; } /* Set the type of the restriction type * for computing restriction operator */ HYPRE_Int hypre_MGRSetRestrictType( void *mgr_vdata, HYPRE_Int restrict_type) { hypre_ParMGRData *mgr_data = (hypre_ParMGRData*) mgr_vdata; HYPRE_Int i; HYPRE_Int max_num_coarse_levels = (mgr_data -> max_num_coarse_levels); if ((mgr_data -> restrict_type) != NULL) { hypre_TFree((mgr_data -> restrict_type), HYPRE_MEMORY_HOST); (mgr_data -> restrict_type) = NULL; } HYPRE_Int *level_restrict_type = hypre_CTAlloc(HYPRE_Int, max_num_coarse_levels, HYPRE_MEMORY_HOST); for (i = 0; i < max_num_coarse_levels; i++) { level_restrict_type[i] = restrict_type; } (mgr_data -> restrict_type) = level_restrict_type; return hypre_error_flag; } /* Set the number of Jacobi interpolation iterations * for computing interpolation operator */ HYPRE_Int hypre_MGRSetNumRestrictSweeps( void *mgr_vdata, HYPRE_Int nsweeps ) { hypre_ParMGRData *mgr_data = (hypre_ParMGRData*) mgr_vdata; (mgr_data -> num_restrict_sweeps) = nsweeps; return hypre_error_flag; } /* Set the type of the interpolation * for computing interpolation operator */ HYPRE_Int hypre_MGRSetInterpType( void *mgr_vdata, HYPRE_Int interpType) { hypre_ParMGRData *mgr_data = (hypre_ParMGRData*) mgr_vdata; HYPRE_Int i; HYPRE_Int max_num_coarse_levels = (mgr_data -> max_num_coarse_levels); if ((mgr_data -> interp_type) != NULL) { hypre_TFree((mgr_data -> interp_type), HYPRE_MEMORY_HOST); (mgr_data -> interp_type) = NULL; } HYPRE_Int *level_interp_type = hypre_CTAlloc(HYPRE_Int, max_num_coarse_levels, HYPRE_MEMORY_HOST); for (i = 0; i < max_num_coarse_levels; i++) { level_interp_type[i] = interpType; } (mgr_data -> interp_type) = level_interp_type; return hypre_error_flag; } /* Set the type of the interpolation * for computing interpolation operator */ HYPRE_Int hypre_MGRSetLevelInterpType( void *mgr_vdata, HYPRE_Int *interpType) { hypre_ParMGRData *mgr_data = (hypre_ParMGRData*) mgr_vdata; HYPRE_Int i; HYPRE_Int max_num_coarse_levels = (mgr_data -> max_num_coarse_levels); hypre_TFree((mgr_data -> interp_type), HYPRE_MEMORY_HOST); HYPRE_Int *level_interp_type = hypre_CTAlloc(HYPRE_Int, max_num_coarse_levels, HYPRE_MEMORY_HOST); if (interpType != NULL) { for (i = 0; i < max_num_coarse_levels; i++) { level_interp_type[i] = *(interpType + i); } } else { for (i = 0; i < max_num_coarse_levels; i++) { level_interp_type[i] = 2; } } (mgr_data -> interp_type) = level_interp_type; return hypre_error_flag; } /* Set the number of Jacobi interpolation iterations * for computing interpolation operator */ HYPRE_Int hypre_MGRSetNumInterpSweeps( void *mgr_vdata, HYPRE_Int nsweeps ) { hypre_ParMGRData *mgr_data = (hypre_ParMGRData*) mgr_vdata; (mgr_data -> num_interp_sweeps) = nsweeps; return hypre_error_flag; } /* Set the threshold to truncate the coarse grid at each * level of reduction */ HYPRE_Int hypre_MGRSetTruncateCoarseGridThreshold( void *mgr_vdata, HYPRE_Real threshold) { hypre_ParMGRData *mgr_data = (hypre_ParMGRData*) mgr_vdata; (mgr_data -> truncate_coarse_grid_threshold) = threshold; return hypre_error_flag; } /* Set block size for block Jacobi Interp/Relax */ HYPRE_Int hypre_MGRSetBlockJacobiBlockSize( void *mgr_vdata, HYPRE_Int blk_size) { hypre_ParMGRData *mgr_data = (hypre_ParMGRData*) mgr_vdata; (mgr_data -> block_jacobi_bsize) = blk_size; return hypre_error_flag; } /* Set print level for F-relaxation solver */ HYPRE_Int hypre_MGRSetFrelaxPrintLevel( void *mgr_vdata, HYPRE_Int print_level ) { hypre_ParMGRData *mgr_data = (hypre_ParMGRData*) mgr_vdata; (mgr_data -> frelax_print_level) = print_level; return hypre_error_flag; } /* Set print level for coarse grid solver */ HYPRE_Int hypre_MGRSetCoarseGridPrintLevel( void *mgr_vdata, HYPRE_Int print_level ) { hypre_ParMGRData *mgr_data = (hypre_ParMGRData*) mgr_vdata; (mgr_data -> cg_print_level) = print_level; return hypre_error_flag; } /* Set print level for mgr solver */ HYPRE_Int hypre_MGRSetPrintLevel( void *mgr_vdata, HYPRE_Int print_level ) { hypre_ParMGRData *mgr_data = (hypre_ParMGRData*) mgr_vdata; /* Unset reserved bits if any are active */ (mgr_data -> print_level) = print_level & ~(HYPRE_MGR_PRINT_RESERVED_A | HYPRE_MGR_PRINT_RESERVED_B | HYPRE_MGR_PRINT_RESERVED_C); return hypre_error_flag; } /* Set logging level for mgr solver */ HYPRE_Int hypre_MGRSetLogging( void *mgr_vdata, HYPRE_Int logging ) { hypre_ParMGRData *mgr_data = (hypre_ParMGRData*) mgr_vdata; (mgr_data -> logging) = logging; return hypre_error_flag; } /* Set max number of iterations for mgr solver */ HYPRE_Int hypre_MGRSetMaxIter( void *mgr_vdata, HYPRE_Int max_iter ) { hypre_ParMGRData *mgr_data = (hypre_ParMGRData*) mgr_vdata; (mgr_data -> max_iter) = max_iter; return hypre_error_flag; } /* Set convergence tolerance for mgr solver */ HYPRE_Int hypre_MGRSetTol( void *mgr_vdata, HYPRE_Real tol ) { hypre_ParMGRData *mgr_data = (hypre_ParMGRData*) mgr_vdata; (mgr_data -> tol) = tol; return hypre_error_flag; } /* Set max number of iterations for mgr global smoother */ HYPRE_Int hypre_MGRSetMaxGlobalSmoothIters( void *mgr_vdata, HYPRE_Int max_iter ) { hypre_ParMGRData *mgr_data = (hypre_ParMGRData*) mgr_vdata; HYPRE_Int max_num_coarse_levels = (mgr_data -> max_num_coarse_levels); if ((mgr_data -> level_smooth_iters) != NULL) { hypre_TFree((mgr_data -> level_smooth_iters), HYPRE_MEMORY_HOST); (mgr_data -> level_smooth_iters) = NULL; } HYPRE_Int *level_smooth_iters = hypre_CTAlloc(HYPRE_Int, max_num_coarse_levels, HYPRE_MEMORY_HOST); if (max_num_coarse_levels > 0) { level_smooth_iters[0] = max_iter; } (mgr_data -> level_smooth_iters) = level_smooth_iters; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_MGRSetGlobalSmoothType * * Set global smoothing type at the first (finest) MGR level *--------------------------------------------------------------------------*/ HYPRE_Int hypre_MGRSetGlobalSmoothType( void *mgr_vdata, HYPRE_Int gsmooth_type ) { hypre_ParMGRData *mgr_data = (hypre_ParMGRData*) mgr_vdata; HYPRE_Int max_num_coarse_levels = (mgr_data -> max_num_coarse_levels); if ((mgr_data -> level_smooth_type) != NULL) { hypre_TFree((mgr_data -> level_smooth_type), HYPRE_MEMORY_HOST); (mgr_data -> level_smooth_type) = NULL; } HYPRE_Int *level_smooth_type = hypre_CTAlloc(HYPRE_Int, max_num_coarse_levels, HYPRE_MEMORY_HOST); if (max_num_coarse_levels > 0) { level_smooth_type[0] = gsmooth_type; } (mgr_data -> level_smooth_type) = level_smooth_type; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_MGRSetLevelSmoothType * * Set global smoothing type at each MGR level. *--------------------------------------------------------------------------*/ HYPRE_Int hypre_MGRSetLevelSmoothType( void *mgr_vdata, HYPRE_Int *gsmooth_type ) { hypre_ParMGRData *mgr_data = (hypre_ParMGRData*) mgr_vdata; HYPRE_Int max_num_coarse_levels = (mgr_data -> max_num_coarse_levels); HYPRE_Int *level_smooth_type, i; char msg[1024]; /* Set level_smooth_type array */ level_smooth_type = hypre_CTAlloc(HYPRE_Int, max_num_coarse_levels, HYPRE_MEMORY_HOST); hypre_TFree((mgr_data -> level_smooth_type), HYPRE_MEMORY_HOST); if (gsmooth_type != NULL) { for (i = 0; i < max_num_coarse_levels; i++) { /* For meaningful values of global smoothing type, the option set via hypre_MGRSetGlobalSmootherAtLevel has precedence over the option set via this function. */ if ((mgr_data -> level_smoother) && (mgr_data -> level_smoother)[i] && (gsmooth_type[i] >= 0)) { hypre_sprintf(msg, "hypre_MGRSetLevelSmoothType does not take effect at level %d since\n\ hypre_MGRSetGlobalSmootherAtLevel has been called at the same level", i); hypre_error_w_msg(HYPRE_ERROR_GENERIC, msg); } else { level_smooth_type[i] = gsmooth_type[i]; } } } else { for (i = 0; i < max_num_coarse_levels; i++) { level_smooth_type[i] = 0; // Jacobi } } (mgr_data -> level_smooth_type) = level_smooth_type; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_MGRSetLevelSmoothIters * * Set the number of global smoothing iterations at each MGR level. *--------------------------------------------------------------------------*/ HYPRE_Int hypre_MGRSetLevelSmoothIters( void *mgr_vdata, HYPRE_Int *gsmooth_iters ) { hypre_ParMGRData *mgr_data = (hypre_ParMGRData*) mgr_vdata; HYPRE_Int max_num_coarse_levels = (mgr_data -> max_num_coarse_levels); HYPRE_Int *level_smooth_iters; HYPRE_Int i; level_smooth_iters = hypre_CTAlloc(HYPRE_Int, max_num_coarse_levels, HYPRE_MEMORY_HOST); hypre_TFree((mgr_data -> level_smooth_iters), HYPRE_MEMORY_HOST); if (gsmooth_iters != NULL) { for (i = 0; i < max_num_coarse_levels; i++) { level_smooth_iters[i] = gsmooth_iters[i]; } } else { for (i = 0; i < max_num_coarse_levels; i++) { level_smooth_iters[i] = 0; } } (mgr_data -> level_smooth_iters) = level_smooth_iters; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_MGRSetGlobalSmootherAtLevel * * Set global relaxation method for a given MGR level via a HYPRE solver object. * * Note this function asks for a level identifier and doesn't expect an array * of function pointers for each level (as done by SetLevel functions). *--------------------------------------------------------------------------*/ HYPRE_Int hypre_MGRSetGlobalSmootherAtLevel( void *mgr_vdata, HYPRE_Solver smoother, HYPRE_Int level ) { hypre_Solver *base = (hypre_Solver*) smoother; HYPRE_PtrToSolverFcn setup = hypre_SolverSetup(base); hypre_ParMGRData *mgr_data = (hypre_ParMGRData*) mgr_vdata; HYPRE_Int max_num_coarse_levels = (mgr_data -> max_num_coarse_levels); HYPRE_Int smoother_type; char msg[1024]; /* Check if the requested level makes sense */ if (level < 0 || level >= max_num_coarse_levels) { hypre_error_in_arg(1); return hypre_error_flag; } /* Allocate level_smoother if needed */ if (!(mgr_data -> level_smoother)) { (mgr_data -> level_smoother) = hypre_CTAlloc(HYPRE_Solver, max_num_coarse_levels, HYPRE_MEMORY_HOST); } /* Allocate level_smooth_type if needed */ if (!(mgr_data -> level_smooth_type)) { (mgr_data -> level_smooth_type) = hypre_CTAlloc(HYPRE_Int, max_num_coarse_levels, HYPRE_MEMORY_HOST); } (mgr_data -> level_smoother)[level] = smoother; /* Obtain corresponding smoother type */ if (setup == (HYPRE_PtrToSolverFcn) HYPRE_ILUSetup) { smoother_type = 16; } else { smoother_type = -1; /* Unknown smoother */ } /* Check if level_smooth_type[level] corresponds to the right smoother type */ if ((mgr_data -> level_smooth_type)[level] > 0 && (mgr_data -> level_smooth_type)[level] != smoother_type) { hypre_sprintf(msg, "Reseting global relaxation type at level %d to user's smoother", level); hypre_error_w_msg(HYPRE_ERROR_GENERIC, msg); } (mgr_data -> level_smooth_type)[level] = smoother_type; return hypre_error_flag; } /* Set the maximum number of non-zero entries for interpolation operators */ HYPRE_Int hypre_MGRSetPMaxElmts(void *mgr_vdata, HYPRE_Int P_max_elmts) { hypre_ParMGRData *mgr_data = (hypre_ParMGRData*) mgr_vdata; HYPRE_Int max_num_coarse_levels = (mgr_data -> max_num_coarse_levels); HYPRE_Int i; /* Allocate internal P_max_elmts if needed */ if (!(mgr_data -> P_max_elmts)) { (mgr_data -> P_max_elmts) = hypre_CTAlloc(HYPRE_Int, max_num_coarse_levels, HYPRE_MEMORY_HOST); } /* Set all P_max_elmts entries to the value passed as input */ for (i = 0; i < max_num_coarse_levels; i++) { (mgr_data -> P_max_elmts)[i] = P_max_elmts; } return hypre_error_flag; } /* Set the maximum number of non-zero entries for interpolation operators per level */ HYPRE_Int hypre_MGRSetLevelPMaxElmts(void *mgr_vdata, HYPRE_Int *P_max_elmts) { hypre_ParMGRData *mgr_data = (hypre_ParMGRData*) mgr_vdata; HYPRE_Int max_num_coarse_levels = (mgr_data -> max_num_coarse_levels); HYPRE_Int i; /* Allocate internal P_max_elmts if needed */ if (!(mgr_data -> P_max_elmts)) { (mgr_data -> P_max_elmts) = hypre_CTAlloc(HYPRE_Int, max_num_coarse_levels, HYPRE_MEMORY_HOST); } /* Set all P_max_elmts entries to the value passed as input */ for (i = 0; i < max_num_coarse_levels; i++) { (mgr_data -> P_max_elmts)[i] = (P_max_elmts) ? P_max_elmts[i] : 0; } return hypre_error_flag; } /* Get number of iterations for MGR solver */ HYPRE_Int hypre_MGRGetNumIterations( void *mgr_vdata, HYPRE_Int *num_iterations ) { hypre_ParMGRData *mgr_data = (hypre_ParMGRData*) mgr_vdata; *num_iterations = mgr_data->num_iterations; return hypre_error_flag; } /* Get residual norms for MGR solver */ HYPRE_Int hypre_MGRGetFinalRelativeResidualNorm( void *mgr_vdata, HYPRE_Real *res_norm ) { hypre_ParMGRData *mgr_data = (hypre_ParMGRData*) mgr_vdata; *res_norm = mgr_data->final_rel_residual_norm; return hypre_error_flag; } HYPRE_Int hypre_MGRGetCoarseGridConvergenceFactor( void *mgr_vdata, HYPRE_Real *conv_factor ) { hypre_ParMGRData *mgr_data = (hypre_ParMGRData*) mgr_vdata; *conv_factor = (mgr_data -> cg_convergence_factor); return hypre_error_flag; } /* Build A_FF matrix from A given a CF_marker array */ HYPRE_Int hypre_MGRGetSubBlock( hypre_ParCSRMatrix *A, HYPRE_Int *row_cf_marker, HYPRE_Int *col_cf_marker, HYPRE_Int debug_flag, hypre_ParCSRMatrix **A_block_ptr ) { MPI_Comm comm = hypre_ParCSRMatrixComm(A); hypre_ParCSRCommPkg *comm_pkg = hypre_ParCSRMatrixCommPkg(A); hypre_ParCSRCommHandle *comm_handle; HYPRE_MemoryLocation memory_location = hypre_ParCSRMatrixMemoryLocation(A); hypre_CSRMatrix *A_diag = hypre_ParCSRMatrixDiag(A); HYPRE_Real *A_diag_data = hypre_CSRMatrixData(A_diag); HYPRE_Int *A_diag_i = hypre_CSRMatrixI(A_diag); HYPRE_Int *A_diag_j = hypre_CSRMatrixJ(A_diag); hypre_CSRMatrix *A_offd = hypre_ParCSRMatrixOffd(A); HYPRE_Real *A_offd_data = hypre_CSRMatrixData(A_offd); HYPRE_Int *A_offd_i = hypre_CSRMatrixI(A_offd); HYPRE_Int *A_offd_j = hypre_CSRMatrixJ(A_offd); HYPRE_Int num_cols_A_offd = hypre_CSRMatrixNumCols(A_offd); //HYPRE_Int *col_map_offd = hypre_ParCSRMatrixColMapOffd(A); hypre_IntArray *coarse_dof_func_ptr = NULL; HYPRE_BigInt num_row_cpts_global[2]; HYPRE_BigInt num_col_cpts_global[2]; hypre_ParCSRMatrix *Ablock; HYPRE_BigInt *col_map_offd_Ablock; HYPRE_Int *tmp_map_offd = NULL; HYPRE_Int *CF_marker_offd = NULL; hypre_CSRMatrix *Ablock_diag; hypre_CSRMatrix *Ablock_offd; HYPRE_Real *Ablock_diag_data; HYPRE_Int *Ablock_diag_i; HYPRE_Int *Ablock_diag_j; HYPRE_Real *Ablock_offd_data; HYPRE_Int *Ablock_offd_i; HYPRE_Int *Ablock_offd_j; HYPRE_Int Ablock_diag_size, Ablock_offd_size; HYPRE_Int *Ablock_marker; HYPRE_Int ii_counter; HYPRE_Int jj_counter, jj_counter_offd; HYPRE_Int *jj_count, *jj_count_offd; HYPRE_Int start_indexing = 0; /* start indexing for Aff_data at 0 */ HYPRE_Int n_fine = hypre_CSRMatrixNumRows(A_diag); HYPRE_Int *fine_to_coarse; HYPRE_Int *coarse_counter; HYPRE_Int *col_coarse_counter; HYPRE_Int coarse_shift; HYPRE_BigInt total_global_row_cpts; HYPRE_BigInt total_global_col_cpts; HYPRE_Int num_cols_Ablock_offd; // HYPRE_BigInt my_first_row_cpt, my_first_col_cpt; HYPRE_Int i, i1; HYPRE_Int j, jl, jj; HYPRE_Int start; HYPRE_Int my_id; HYPRE_Int num_procs; HYPRE_Int num_threads; HYPRE_Int num_sends; HYPRE_Int index; HYPRE_Int ns, ne, size, rest; HYPRE_Int *int_buf_data; HYPRE_Int local_numrows = hypre_CSRMatrixNumRows(A_diag); hypre_IntArray *wrap_cf; // HYPRE_Real wall_time; /* for debugging instrumentation */ hypre_MPI_Comm_size(comm, &num_procs); hypre_MPI_Comm_rank(comm, &my_id); //num_threads = hypre_NumThreads(); // Temporary fix, disable threading // TODO: enable threading num_threads = 1; /* get the number of coarse rows */ wrap_cf = hypre_IntArrayCreate(local_numrows); hypre_IntArrayMemoryLocation(wrap_cf) = HYPRE_MEMORY_HOST; hypre_IntArrayData(wrap_cf) = row_cf_marker; hypre_BoomerAMGCoarseParms(comm, local_numrows, 1, NULL, wrap_cf, &coarse_dof_func_ptr, num_row_cpts_global); hypre_IntArrayDestroy(coarse_dof_func_ptr); coarse_dof_func_ptr = NULL; //hypre_printf("my_id = %d, cpts_this = %d, cpts_next = %d\n", my_id, num_row_cpts_global[0], num_row_cpts_global[1]); // my_first_row_cpt = num_row_cpts_global[0]; if (my_id == (num_procs - 1)) { total_global_row_cpts = num_row_cpts_global[1]; } hypre_MPI_Bcast(&total_global_row_cpts, 1, HYPRE_MPI_BIG_INT, num_procs - 1, comm); /* get the number of coarse rows */ hypre_IntArrayData(wrap_cf) = col_cf_marker; hypre_BoomerAMGCoarseParms(comm, local_numrows, 1, NULL, wrap_cf, &coarse_dof_func_ptr, num_col_cpts_global); hypre_IntArrayDestroy(coarse_dof_func_ptr); coarse_dof_func_ptr = NULL; //hypre_printf("my_id = %d, cpts_this = %d, cpts_next = %d\n", my_id, num_col_cpts_global[0], num_col_cpts_global[1]); // my_first_col_cpt = num_col_cpts_global[0]; if (my_id == (num_procs - 1)) { total_global_col_cpts = num_col_cpts_global[1]; } hypre_MPI_Bcast(&total_global_col_cpts, 1, HYPRE_MPI_BIG_INT, num_procs - 1, comm); /*------------------------------------------------------------------- * Get the CF_marker data for the off-processor columns *-------------------------------------------------------------------*/ if (debug_flag < 0) { debug_flag = -debug_flag; } // if (debug_flag==4) wall_time = time_getWallclockSeconds(); if (num_cols_A_offd) { CF_marker_offd = hypre_CTAlloc(HYPRE_Int, num_cols_A_offd, HYPRE_MEMORY_HOST); } if (!comm_pkg) { hypre_MatvecCommPkgCreate(A); comm_pkg = hypre_ParCSRMatrixCommPkg(A); } num_sends = hypre_ParCSRCommPkgNumSends(comm_pkg); int_buf_data = hypre_CTAlloc(HYPRE_Int, hypre_ParCSRCommPkgSendMapStart(comm_pkg, num_sends), HYPRE_MEMORY_HOST); index = 0; for (i = 0; i < num_sends; i++) { start = hypre_ParCSRCommPkgSendMapStart(comm_pkg, i); for (j = start; j < hypre_ParCSRCommPkgSendMapStart(comm_pkg, i + 1); j++) int_buf_data[index++] = col_cf_marker[hypre_ParCSRCommPkgSendMapElmt(comm_pkg, j)]; } comm_handle = hypre_ParCSRCommHandleCreate( 11, comm_pkg, int_buf_data, CF_marker_offd); hypre_ParCSRCommHandleDestroy(comm_handle); /*----------------------------------------------------------------------- * First Pass: Determine size of Ablock and fill in fine_to_coarse mapping. *-----------------------------------------------------------------------*/ /*----------------------------------------------------------------------- * Intialize counters and allocate mapping vector. *-----------------------------------------------------------------------*/ coarse_counter = hypre_CTAlloc(HYPRE_Int, num_threads, HYPRE_MEMORY_HOST); col_coarse_counter = hypre_CTAlloc(HYPRE_Int, num_threads, HYPRE_MEMORY_HOST); jj_count = hypre_CTAlloc(HYPRE_Int, num_threads, HYPRE_MEMORY_HOST); jj_count_offd = hypre_CTAlloc(HYPRE_Int, num_threads, HYPRE_MEMORY_HOST); fine_to_coarse = hypre_CTAlloc(HYPRE_Int, n_fine, HYPRE_MEMORY_HOST); #if 0 #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i) HYPRE_SMP_SCHEDULE #endif #endif for (i = 0; i < n_fine; i++) { fine_to_coarse[i] = -1; } jj_counter = start_indexing; jj_counter_offd = start_indexing; /*----------------------------------------------------------------------- * Loop over fine grid. *-----------------------------------------------------------------------*/ /* RDF: this looks a little tricky, but doable */ #if 0 #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i,j,i1,jj,ns,ne,size,rest) HYPRE_SMP_SCHEDULE #endif #endif for (j = 0; j < num_threads; j++) { size = n_fine / num_threads; rest = n_fine - size * num_threads; if (j < rest) { ns = j * size + j; ne = (j + 1) * size + j + 1; } else { ns = j * size + rest; ne = (j + 1) * size + rest; } for (i = ns; i < ne; i++) { /*-------------------------------------------------------------------- * If i is a F-point, we loop through the columns and select * the F-columns. Also set up mapping vector. *--------------------------------------------------------------------*/ if (col_cf_marker[i] > 0) { fine_to_coarse[i] = col_coarse_counter[j]; col_coarse_counter[j]++; } if (row_cf_marker[i] > 0) { //fine_to_coarse[i] = coarse_counter[j]; coarse_counter[j]++; for (jj = A_diag_i[i]; jj < A_diag_i[i + 1]; jj++) { i1 = A_diag_j[jj]; if (col_cf_marker[i1] > 0) { jj_count[j]++; } } if (num_procs > 1) { for (jj = A_offd_i[i]; jj < A_offd_i[i + 1]; jj++) { i1 = A_offd_j[jj]; if (CF_marker_offd[i1] > 0) { jj_count_offd[j]++; } } } } } } /*----------------------------------------------------------------------- * Allocate arrays. *-----------------------------------------------------------------------*/ for (i = 0; i < num_threads - 1; i++) { jj_count[i + 1] += jj_count[i]; jj_count_offd[i + 1] += jj_count_offd[i]; coarse_counter[i + 1] += coarse_counter[i]; col_coarse_counter[i + 1] += col_coarse_counter[i]; } i = num_threads - 1; jj_counter = jj_count[i]; jj_counter_offd = jj_count_offd[i]; ii_counter = coarse_counter[i]; Ablock_diag_size = jj_counter; Ablock_diag_i = hypre_CTAlloc(HYPRE_Int, ii_counter + 1, memory_location); Ablock_diag_j = hypre_CTAlloc(HYPRE_Int, Ablock_diag_size, memory_location); Ablock_diag_data = hypre_CTAlloc(HYPRE_Real, Ablock_diag_size, memory_location); Ablock_diag_i[ii_counter] = jj_counter; Ablock_offd_size = jj_counter_offd; Ablock_offd_i = hypre_CTAlloc(HYPRE_Int, ii_counter + 1, memory_location); Ablock_offd_j = hypre_CTAlloc(HYPRE_Int, Ablock_offd_size, memory_location); Ablock_offd_data = hypre_CTAlloc(HYPRE_Real, Ablock_offd_size, memory_location); /*----------------------------------------------------------------------- * Intialize some stuff. *-----------------------------------------------------------------------*/ jj_counter = start_indexing; jj_counter_offd = start_indexing; //----------------------------------------------------------------------- // Send and receive fine_to_coarse info. //----------------------------------------------------------------------- // if (debug_flag==4) wall_time = time_getWallclockSeconds(); #if 0 #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i,j,ns,ne,size,rest,coarse_shift) HYPRE_SMP_SCHEDULE #endif #endif for (j = 0; j < num_threads; j++) { coarse_shift = 0; if (j > 0) { coarse_shift = col_coarse_counter[j - 1]; } size = n_fine / num_threads; rest = n_fine - size * num_threads; if (j < rest) { ns = j * size + j; ne = (j + 1) * size + j + 1; } else { ns = j * size + rest; ne = (j + 1) * size + rest; } for (i = ns; i < ne; i++) { fine_to_coarse[i] += coarse_shift; } } // if (debug_flag==4) wall_time = time_getWallclockSeconds(); #if 0 #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i) HYPRE_SMP_SCHEDULE #endif #endif // for (i = 0; i < n_fine; i++) fine_to_coarse[i] -= my_first_col_cpt; #if 0 #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i,jl,i1,jj,ns,ne,size,rest,jj_counter,jj_counter_offd,ii_counter) HYPRE_SMP_SCHEDULE #endif #endif for (jl = 0; jl < num_threads; jl++) { size = n_fine / num_threads; rest = n_fine - size * num_threads; if (jl < rest) { ns = jl * size + jl; ne = (jl + 1) * size + jl + 1; } else { ns = jl * size + rest; ne = (jl + 1) * size + rest; } jj_counter = 0; if (jl > 0) { jj_counter = jj_count[jl - 1]; } jj_counter_offd = 0; if (jl > 0) { jj_counter_offd = jj_count_offd[jl - 1]; } ii_counter = 0; for (i = ns; i < ne; i++) { /*-------------------------------------------------------------------- * If i is a F-point, we loop through the columns and select * the F-columns. Also set up mapping vector. *--------------------------------------------------------------------*/ if (row_cf_marker[i] > 0) { // Diagonal part of Ablock // Ablock_diag_i[ii_counter] = jj_counter; for (jj = A_diag_i[i]; jj < A_diag_i[i + 1]; jj++) { i1 = A_diag_j[jj]; if (col_cf_marker[i1] > 0) { Ablock_diag_j[jj_counter] = fine_to_coarse[i1]; Ablock_diag_data[jj_counter] = A_diag_data[jj]; jj_counter++; } } // Off-Diagonal part of Ablock // Ablock_offd_i[ii_counter] = jj_counter_offd; if (num_procs > 1) { for (jj = A_offd_i[i]; jj < A_offd_i[i + 1]; jj++) { i1 = A_offd_j[jj]; if (CF_marker_offd[i1] > 0) { Ablock_offd_j[jj_counter_offd] = i1; Ablock_offd_data[jj_counter_offd] = A_offd_data[jj]; jj_counter_offd++; } } } ii_counter++; } } Ablock_offd_i[ii_counter] = jj_counter_offd; Ablock_diag_i[ii_counter] = jj_counter; } Ablock = hypre_ParCSRMatrixCreate(comm, total_global_row_cpts, total_global_col_cpts, num_row_cpts_global, num_col_cpts_global, 0, Ablock_diag_i[ii_counter], Ablock_offd_i[ii_counter]); Ablock_diag = hypre_ParCSRMatrixDiag(Ablock); hypre_CSRMatrixData(Ablock_diag) = Ablock_diag_data; hypre_CSRMatrixI(Ablock_diag) = Ablock_diag_i; hypre_CSRMatrixJ(Ablock_diag) = Ablock_diag_j; Ablock_offd = hypre_ParCSRMatrixOffd(Ablock); hypre_CSRMatrixData(Ablock_offd) = Ablock_offd_data; hypre_CSRMatrixI(Ablock_offd) = Ablock_offd_i; hypre_CSRMatrixJ(Ablock_offd) = Ablock_offd_j; num_cols_Ablock_offd = 0; if (Ablock_offd_size) { Ablock_marker = hypre_CTAlloc(HYPRE_Int, num_cols_A_offd, HYPRE_MEMORY_HOST); #if 0 #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i) HYPRE_SMP_SCHEDULE #endif #endif for (i = 0; i < num_cols_A_offd; i++) { Ablock_marker[i] = 0; } num_cols_Ablock_offd = 0; for (i = 0; i < Ablock_offd_size; i++) { index = Ablock_offd_j[i]; if (!Ablock_marker[index]) { num_cols_Ablock_offd++; Ablock_marker[index] = 1; } } col_map_offd_Ablock = hypre_CTAlloc(HYPRE_BigInt, num_cols_Ablock_offd, memory_location); tmp_map_offd = hypre_CTAlloc(HYPRE_Int, num_cols_Ablock_offd, HYPRE_MEMORY_HOST); index = 0; for (i = 0; i < num_cols_Ablock_offd; i++) { while (Ablock_marker[index] == 0) { index++; } tmp_map_offd[i] = index++; } #if 0 #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i) HYPRE_SMP_SCHEDULE #endif #endif for (i = 0; i < Ablock_offd_size; i++) Ablock_offd_j[i] = hypre_BinarySearch(tmp_map_offd, Ablock_offd_j[i], num_cols_Ablock_offd); hypre_TFree(Ablock_marker, HYPRE_MEMORY_HOST); } if (num_cols_Ablock_offd) { hypre_ParCSRMatrixColMapOffd(Ablock) = col_map_offd_Ablock; hypre_CSRMatrixNumCols(Ablock_offd) = num_cols_Ablock_offd; } hypre_GetCommPkgRTFromCommPkgA(Ablock, A, fine_to_coarse, tmp_map_offd); /* Create the assumed partition */ if (hypre_ParCSRMatrixAssumedPartition(Ablock) == NULL) { hypre_ParCSRMatrixCreateAssumedPartition(Ablock); } *A_block_ptr = Ablock; hypre_TFree(tmp_map_offd, HYPRE_MEMORY_HOST); hypre_TFree(CF_marker_offd, HYPRE_MEMORY_HOST); hypre_TFree(int_buf_data, HYPRE_MEMORY_HOST); hypre_TFree(fine_to_coarse, HYPRE_MEMORY_HOST); hypre_TFree(coarse_counter, HYPRE_MEMORY_HOST); hypre_TFree(col_coarse_counter, HYPRE_MEMORY_HOST); hypre_TFree(jj_count, HYPRE_MEMORY_HOST); hypre_TFree(jj_count_offd, HYPRE_MEMORY_HOST); hypre_IntArrayData(wrap_cf) = NULL; hypre_IntArrayDestroy(wrap_cf); return hypre_error_flag; } /* Build A_FF matrix from A given a CF_marker array */ HYPRE_Int hypre_MGRBuildAff( hypre_ParCSRMatrix *A, HYPRE_Int *CF_marker, HYPRE_Int debug_flag, hypre_ParCSRMatrix **A_ff_ptr ) { HYPRE_Int i; HYPRE_Int local_numrows = hypre_CSRMatrixNumRows(hypre_ParCSRMatrixDiag(A)); /* create a copy of the CF_marker array and switch C-points to F-points */ HYPRE_Int *CF_marker_copy = hypre_CTAlloc(HYPRE_Int, local_numrows, HYPRE_MEMORY_HOST); #if 0 #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i) HYPRE_SMP_SCHEDULE #endif #endif for (i = 0; i < local_numrows; i++) { CF_marker_copy[i] = -CF_marker[i]; } hypre_MGRGetSubBlock(A, CF_marker_copy, CF_marker_copy, debug_flag, A_ff_ptr); /* Free copy of CF marker */ hypre_TFree(CF_marker_copy, HYPRE_MEMORY_HOST); return (0); } /********************************************************************************* * This routine assumes that the 'toVector' is larger than the 'fromVector' and * the CF_marker is of the same length as the toVector. There must be n 'point_type' * values in the CF_marker, where n is the length of the 'fromVector'. * It adds the values of the 'fromVector' to the 'toVector' where the marker is the * same as the 'point_type' *********************************************************************************/ HYPRE_Int hypre_MGRAddVectorP ( hypre_IntArray *CF_marker, HYPRE_Int point_type, HYPRE_Real a, hypre_ParVector *fromVector, HYPRE_Real b, hypre_ParVector **toVector ) { hypre_Vector *fromVectorLocal = hypre_ParVectorLocalVector(fromVector); HYPRE_Real *fromVectorData = hypre_VectorData(fromVectorLocal); hypre_Vector *toVectorLocal = hypre_ParVectorLocalVector(*toVector); HYPRE_Real *toVectorData = hypre_VectorData(toVectorLocal); HYPRE_Int *CF_marker_data = hypre_IntArrayData(CF_marker); //HYPRE_Int n = hypre_ParVectorActualLocalSize(*toVector); HYPRE_Int n = hypre_IntArraySize(CF_marker); HYPRE_Int i, j; j = 0; for (i = 0; i < n; i++) { if (CF_marker_data[i] == point_type) { toVectorData[i] = b * toVectorData[i] + a * fromVectorData[j]; j++; } } return 0; } /************************************************************************************* * This routine assumes that the 'fromVector' is larger than the 'toVector' and * the CF_marker is of the same length as the fromVector. There must be n 'point_type' * values in the CF_marker, where n is the length of the 'toVector'. * It adds the values of the 'fromVector' where the marker is the * same as the 'point_type' to the 'toVector' *************************************************************************************/ HYPRE_Int hypre_MGRAddVectorR ( hypre_IntArray *CF_marker, HYPRE_Int point_type, HYPRE_Real a, hypre_ParVector *fromVector, HYPRE_Real b, hypre_ParVector **toVector ) { hypre_Vector *fromVectorLocal = hypre_ParVectorLocalVector(fromVector); HYPRE_Real *fromVectorData = hypre_VectorData(fromVectorLocal); hypre_Vector *toVectorLocal = hypre_ParVectorLocalVector(*toVector); HYPRE_Real *toVectorData = hypre_VectorData(toVectorLocal); HYPRE_Int *CF_marker_data = hypre_IntArrayData(CF_marker); //HYPRE_Int n = hypre_ParVectorActualLocalSize(*toVector); HYPRE_Int n = hypre_IntArraySize(CF_marker); HYPRE_Int i, j; j = 0; for (i = 0; i < n; i++) { if (CF_marker_data[i] == point_type) { toVectorData[j] = b * toVectorData[j] + a * fromVectorData[i]; j++; } } return 0; } /* HYPRE_Int hypre_MGRBuildAffRAP( MPI_Comm comm, HYPRE_Int local_num_variables, HYPRE_Int num_functions, HYPRE_Int *dof_func, HYPRE_Int *CF_marker, HYPRE_Int **coarse_dof_func_ptr, HYPRE_BigInt **coarse_pnts_global_ptr, hypre_ParCSRMatrix *A, HYPRE_Int debug_flag, hypre_ParCSRMatrix **P_f_ptr, hypre_ParCSRMatrix **A_ff_ptr ) { HYPRE_Int *CF_marker_copy = hypre_CTAlloc(HYPRE_Int, local_num_variables, HYPRE_MEMORY_HOST); HYPRE_Int i; for (i = 0; i < local_num_variables; i++) { CF_marker_copy[i] = -CF_marker[i]; } hypre_BoomerAMGCoarseParms(comm, local_num_variables, 1, NULL, CF_marker_copy, coarse_dof_func_ptr, coarse_pnts_global_ptr); hypre_MGRBuildP(A, CF_marker_copy, (*coarse_pnts_global_ptr), 0, debug_flag, P_f_ptr); hypre_BoomerAMGBuildCoarseOperator(*P_f_ptr, A, *P_f_ptr, A_ff_ptr); hypre_TFree(CF_marker_copy, HYPRE_MEMORY_HOST); return 0; } */ /* Get pointer to coarse grid matrix for MGR solver */ HYPRE_Int hypre_MGRGetCoarseGridMatrix( void *mgr_vdata, hypre_ParCSRMatrix **RAP ) { hypre_ParMGRData *mgr_data = (hypre_ParMGRData*) mgr_vdata; if (mgr_data -> RAP == NULL) { hypre_error_w_msg(HYPRE_ERROR_GENERIC, " Coarse grid matrix is NULL. Please make sure MGRSetup() is called \n"); return hypre_error_flag; } *RAP = mgr_data->RAP; return hypre_error_flag; } /* Get pointer to coarse grid solution for MGR solver */ HYPRE_Int hypre_MGRGetCoarseGridSolution( void *mgr_vdata, hypre_ParVector **sol ) { hypre_ParMGRData *mgr_data = (hypre_ParMGRData*) mgr_vdata; if (mgr_data -> U_array == NULL) { hypre_error_w_msg(HYPRE_ERROR_GENERIC, " MGR solution array is NULL. Please make sure MGRSetup() and MGRSolve() are called \n"); return hypre_error_flag; } *sol = mgr_data->U_array[mgr_data->num_coarse_levels]; return hypre_error_flag; } /* Get pointer to coarse grid solution for MGR solver */ HYPRE_Int hypre_MGRGetCoarseGridRHS( void *mgr_vdata, hypre_ParVector **rhs ) { hypre_ParMGRData *mgr_data = (hypre_ParMGRData*) mgr_vdata; if (mgr_data -> F_array == NULL) { hypre_error_w_msg(HYPRE_ERROR_GENERIC, " MGR RHS array is NULL. Please make sure MGRSetup() and MGRSolve() are called \n"); return hypre_error_flag; } *rhs = mgr_data->F_array[mgr_data->num_coarse_levels]; return hypre_error_flag; } /* Print coarse grid linear system (for debugging)*/ HYPRE_Int hypre_MGRPrintCoarseSystem( void *mgr_vdata, HYPRE_Int print_flag) { hypre_ParMGRData *mgr_data = (hypre_ParMGRData*) mgr_vdata; mgr_data->print_coarse_system = print_flag; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_MGRDataPrint *--------------------------------------------------------------------------*/ HYPRE_Int hypre_MGRDataPrint(void *mgr_vdata) { hypre_ParMGRData *mgr_data = (hypre_ParMGRData*) mgr_vdata; HYPRE_Int print_level = (mgr_data -> print_level); HYPRE_Int num_coarse_levels = (mgr_data -> num_coarse_levels); hypre_ParCSRMatrix **A_array = (mgr_data -> A_array); hypre_ParCSRMatrix **P_array = (mgr_data -> P_array); hypre_ParCSRMatrix **RT_array = (mgr_data -> RT_array); hypre_ParCSRMatrix *A_coarsest = (mgr_data -> RAP); hypre_ParVector **f_array = (mgr_data -> F_array); HYPRE_Int *point_marker_array = (mgr_data -> point_marker_array); HYPRE_Int block_size = (mgr_data -> block_size); char *data_path = (mgr_data -> data_path); char topdir[] = "./hypre-data"; char *filename = NULL; hypre_IntArray *dofmap = NULL; MPI_Comm comm; HYPRE_Int myid, lvl; HYPRE_Int data_path_length = 0; /* Sanity check */ if (!A_array[0]) { return hypre_error_flag; } /* Get rank ID */ comm = hypre_ParCSRMatrixComm(A_array[0]); hypre_MPI_Comm_rank(comm, &myid); /* Create new "ls_" folder (data_path) */ if (((print_level & HYPRE_MGR_PRINT_INFO_PARAMS) || (print_level & HYPRE_MGR_PRINT_FINE_MATRIX) || (print_level & HYPRE_MGR_PRINT_FINE_RHS) || (print_level & HYPRE_MGR_PRINT_CRSE_MATRIX) || (print_level & HYPRE_MGR_PRINT_LVLS_MATRIX) ) && (data_path == NULL)) { if (!myid) { if (!hypre_CheckDirExists(topdir)) { hypre_CreateDir(topdir); } hypre_CreateNextDirOfSequence(topdir, "ls_", &data_path); data_path_length = strlen(data_path) + 1; } hypre_MPI_Bcast(&data_path_length, 1, HYPRE_MPI_INT, 0, comm); if (data_path_length > 0) { if (myid) { data_path = hypre_TAlloc(char, data_path_length, HYPRE_MEMORY_HOST); } } else { hypre_error_w_msg(HYPRE_ERROR_GENERIC, "Unable to create data path!"); return hypre_error_flag; } hypre_MPI_Bcast(data_path, data_path_length, hypre_MPI_CHAR, 0, comm); /* Save data_path */ (mgr_data -> data_path) = data_path; } else { if (data_path) { data_path_length = strlen(data_path); } } /* Allocate memory for filename */ filename = hypre_TAlloc(char, data_path_length + 16, HYPRE_MEMORY_HOST); /* Print MGR parameters to file */ if (print_level & HYPRE_MGR_PRINT_INFO_PARAMS) { /* TODO (VPM): print internal MGR parameters to file */ /* Signal that the MGR parameters have already been printed */ (mgr_data -> print_level) &= ~HYPRE_MGR_PRINT_INFO_PARAMS; (mgr_data -> print_level) |= HYPRE_MGR_PRINT_RESERVED_A; } /* Print linear system matrix at the finest level and dofmap */ if ((print_level & (HYPRE_MGR_PRINT_FINE_MATRIX + HYPRE_MGR_PRINT_LVLS_MATRIX)) && A_array[0]) { /* Build dofmap array */ dofmap = hypre_IntArrayCreate(hypre_ParCSRMatrixNumRows(A_array[0])); hypre_IntArrayInitialize_v2(dofmap, HYPRE_MEMORY_HOST); if (point_marker_array) { hypre_TMemcpy(hypre_IntArrayData(dofmap), point_marker_array, HYPRE_Int, hypre_ParCSRMatrixNumRows(A_array[0]), HYPRE_MEMORY_HOST, HYPRE_MEMORY_HOST); } else { hypre_IntArraySetInterleavedValues(dofmap, block_size); } /* Print dofmap */ hypre_ParPrintf(comm, "Writing dofmap to path: %s\n", data_path); hypre_sprintf(filename, "%s/dofmap.out", data_path); hypre_IntArrayPrint(comm, dofmap, filename); /* Free memory */ hypre_IntArrayDestroy(dofmap); /* Print Matrix */ hypre_ParPrintf(comm, "Writing fine level matrix to path: %s\n", data_path); hypre_sprintf(filename, "%s/IJ.out.A", data_path); if (print_level & HYPRE_MGR_PRINT_MODE_ASCII) { hypre_ParCSRMatrixPrintIJ(A_array[0], 0, 0, filename); } else { hypre_ParCSRMatrixPrintBinaryIJ(A_array[0], 0, 0, filename); } /* Signal that the matrix has already been printed */ (mgr_data -> print_level) &= ~HYPRE_MGR_PRINT_FINE_MATRIX; (mgr_data -> print_level) |= HYPRE_MGR_PRINT_RESERVED_B; } /* Print linear system RHS at the finest level */ if ((print_level & HYPRE_MGR_PRINT_FINE_RHS) && f_array[0]) { /* Print RHS */ hypre_ParPrintf(comm, "Writing RHS to path: %s\n", data_path); hypre_sprintf(filename, "%s/IJ.out.b", data_path); if (print_level & HYPRE_MGR_PRINT_MODE_ASCII) { hypre_ParVectorPrintIJ(f_array[0], 0, filename); } else { hypre_ParVectorPrintBinaryIJ(f_array[0], filename); } /* Free memory */ hypre_TFree(filename, HYPRE_MEMORY_HOST); /* Signal that the vector has already been printed */ (mgr_data -> print_level) &= ~HYPRE_MGR_PRINT_FINE_RHS; (mgr_data -> print_level) |= HYPRE_MGR_PRINT_RESERVED_C; } /* Print linear system matrix at the coarsest level */ if ((print_level & (HYPRE_MGR_PRINT_CRSE_MATRIX + HYPRE_MGR_PRINT_LVLS_MATRIX)) && A_coarsest) { hypre_ParPrintf(comm, "Writing coarsest level matrix to path: %s\n", data_path); hypre_sprintf(filename, "%s/IJ.out.A.%02d", data_path, num_coarse_levels); if (print_level & HYPRE_MGR_PRINT_MODE_ASCII) { hypre_ParCSRMatrixPrintIJ(A_coarsest, 0, 0, filename); } else { hypre_ParCSRMatrixPrintBinaryIJ(A_coarsest, 0, 0, filename); } /* Signal that the matrix has already been printed */ (mgr_data -> print_level) &= ~HYPRE_MGR_PRINT_CRSE_MATRIX; } /* Print MGR hierarchy */ if ((print_level & HYPRE_MGR_PRINT_LVLS_MATRIX)) { for (lvl = 0; lvl < num_coarse_levels - 1; lvl++) { /* Print operator matrix */ hypre_ParPrintf(comm, "Writing level %d matrix to path: %s\n", lvl + 1, data_path); hypre_sprintf(filename, "%s/IJ.out.A.%02d", data_path, lvl + 1); if (print_level & HYPRE_MGR_PRINT_MODE_ASCII) { hypre_ParCSRMatrixPrintIJ(A_array[lvl + 1], 0, 0, filename); } else { hypre_ParCSRMatrixPrintBinaryIJ(A_array[lvl + 1], 0, 0, filename); } /* Print interpolation matrix */ if (P_array[lvl]) { hypre_ParPrintf(comm, "Writing level %d interpolation to path: %s\n", lvl, data_path); hypre_sprintf(filename, "%s/IJ.out.P.%02d", data_path, lvl); if (print_level & HYPRE_MGR_PRINT_MODE_ASCII) { hypre_ParCSRMatrixPrintIJ(P_array[lvl], 0, 0, filename); } else { hypre_ParCSRMatrixPrintBinaryIJ(P_array[lvl], 0, 0, filename); } } /* Print restriction matrix */ if (RT_array[lvl]) { hypre_ParPrintf(comm, "Writing level %d restriction to path: %s\n", lvl, data_path); hypre_sprintf(filename, "%s/IJ.out.RT.%02d", data_path, lvl); if (print_level & HYPRE_MGR_PRINT_MODE_ASCII) { hypre_ParCSRMatrixPrintIJ(RT_array[lvl], 0, 0, filename); } else { hypre_ParCSRMatrixPrintBinaryIJ(RT_array[lvl], 0, 0, filename); } } } /* Signal that the data has already been printed */ (mgr_data -> print_level) &= ~HYPRE_MGR_PRINT_LVLS_MATRIX; } /* Free memory */ hypre_TFree(filename, HYPRE_MEMORY_HOST); return hypre_error_flag; } /*************************************************************************** ***************************************************************************/ #ifdef HYPRE_USING_DSUPERLU /*-------------------------------------------------------------------------- * hypre_MGRDirectSolverCreate *--------------------------------------------------------------------------*/ void * hypre_MGRDirectSolverCreate() { // hypre_DSLUData *dslu_data = hypre_CTAlloc(hypre_DSLUData, 1, HYPRE_MEMORY_HOST); // return (void *) dslu_data; return NULL; } /*-------------------------------------------------------------------------- * hypre_MGRDirectSolverSetup *--------------------------------------------------------------------------*/ HYPRE_Int hypre_MGRDirectSolverSetup( void *solver, hypre_ParCSRMatrix *A, hypre_ParVector *f, hypre_ParVector *u ) { HYPRE_UNUSED_VAR(f); HYPRE_UNUSED_VAR(u); return hypre_SLUDistSetup(solver, A, 0); } /*-------------------------------------------------------------------------- * hypre_MGRDirectSolverSolve *--------------------------------------------------------------------------*/ HYPRE_Int hypre_MGRDirectSolverSolve( void *solver, hypre_ParCSRMatrix *A, hypre_ParVector *f, hypre_ParVector *u ) { HYPRE_UNUSED_VAR(A); return hypre_SLUDistSolve(solver, f, u); } /*-------------------------------------------------------------------------- * hypre_MGRDirectSolverDestroy *--------------------------------------------------------------------------*/ HYPRE_Int hypre_MGRDirectSolverDestroy( void *solver ) { return hypre_SLUDistDestroy(solver); } #endif hypre-2.33.0/src/parcsr_ls/par_mgr.h000066400000000000000000000244131477326011500173170ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #ifndef hypre_ParMGR_DATA_HEADER #define hypre_ParMGR_DATA_HEADER /*-------------------------------------------------------------------------- * hypre_ParMGRData *--------------------------------------------------------------------------*/ typedef struct { /* block data */ HYPRE_Int block_size; HYPRE_Int *block_num_coarse_indexes; HYPRE_Int *point_marker_array; HYPRE_Int **block_cf_marker; /* initial setup data (user provided) */ HYPRE_Int num_coarse_levels; HYPRE_Int *num_coarse_per_level; HYPRE_Int **level_coarse_indexes; /* general data */ HYPRE_Int max_num_coarse_levels; hypre_ParCSRMatrix **A_array; hypre_ParCSRMatrix **B_array; /* block diagonal inverse matrices */ hypre_ParCSRMatrix **B_FF_array; /* block-FF diagonal inverse matrices */ hypre_ParCSRMatrix **A_ff_array; #if defined(HYPRE_USING_GPU) hypre_ParCSRMatrix **P_FF_array; #endif hypre_ParCSRMatrix **P_array; hypre_ParCSRMatrix **R_array; hypre_ParCSRMatrix **RT_array; hypre_ParCSRMatrix *RAP; hypre_IntArray **CF_marker_array; HYPRE_Int **coarse_indices_lvls; hypre_ParVector **F_array; hypre_ParVector **U_array; hypre_ParVector *residual; HYPRE_Real *rel_res_norms; hypre_ParVector **F_fine_array; hypre_ParVector **U_fine_array; HYPRE_Solver **aff_solver; HYPRE_Int (*fine_grid_solver_setup)(void*, void*, void*, void*); HYPRE_Int (*fine_grid_solver_solve)(void*, void*, void*, void*); HYPRE_Real max_row_sum; HYPRE_Int num_interp_sweeps; HYPRE_Int num_restrict_sweeps; HYPRE_Int *interp_type; HYPRE_Int *restrict_type; HYPRE_Real strong_threshold; HYPRE_Real trunc_factor; HYPRE_Real S_commpkg_switch; HYPRE_Int *P_max_elmts; HYPRE_Int num_iterations; hypre_Vector **l1_norms; HYPRE_Real final_rel_residual_norm; HYPRE_Real tol; HYPRE_Real relax_weight; HYPRE_Int relax_type; HYPRE_Int logging; HYPRE_Int print_level; HYPRE_Int frelax_print_level; HYPRE_Int cg_print_level; HYPRE_Int max_iter; HYPRE_Int relax_order; HYPRE_Int *num_relax_sweeps; char *data_path; HYPRE_Solver coarse_grid_solver; HYPRE_Int (*coarse_grid_solver_setup)(void*, void*, void*, void*); HYPRE_Int (*coarse_grid_solver_solve)(void*, void*, void*, void*); HYPRE_Int use_default_cgrid_solver; // Mode to use an external AMG solver for F-relaxation // 0: use an external AMG solver that is already setup // 1: use an external AMG solver but do setup inside MGR // 2: use default internal AMG solver HYPRE_Int fsolver_mode; // HYPRE_Int fsolver_type; HYPRE_Real omega; /* temp vectors for solve phase */ hypre_ParVector *Vtemp; hypre_ParVector *Ztemp; hypre_ParVector *Utemp; hypre_ParVector *Ftemp; HYPRE_Real **level_diaginv; HYPRE_Real **frelax_diaginv; HYPRE_Int n_block; HYPRE_Int left_size; HYPRE_Int *blk_size; HYPRE_Int *level_smooth_iters; HYPRE_Int *level_smooth_type; HYPRE_Solver *level_smoother; HYPRE_Int global_smooth_cycle; /* Number of points that remain part of the coarse grid throughout the hierarchy. For example, number of well equations */ HYPRE_Int reserved_coarse_size; HYPRE_BigInt *reserved_coarse_indexes; HYPRE_Int *reserved_Cpoint_local_indexes; HYPRE_Int set_non_Cpoints_to_F; HYPRE_BigInt *idx_array; /* F-relaxation type */ HYPRE_Int *Frelax_method; HYPRE_Int *Frelax_type; HYPRE_Int *Frelax_num_functions; /* Non-Galerkin coarse grid */ HYPRE_Int *coarse_grid_method; HYPRE_Int *nonglk_max_elmts; /* V-cycle F relaxation method */ hypre_ParAMGData **FrelaxVcycleData; hypre_ParVector *VcycleRelaxVtemp; hypre_ParVector *VcycleRelaxZtemp; HYPRE_Int max_local_lvls; HYPRE_Int print_coarse_system; HYPRE_Real truncate_coarse_grid_threshold; /* how to set C points */ HYPRE_Int set_c_points_method; /* reduce reserved C-points before coarse grid solve? */ /* this might be necessary for some applications, e.g. phase transitions */ HYPRE_Int lvl_to_keep_cpoints; /* block size for block Jacobi interpolation and relaxation */ HYPRE_Int block_jacobi_bsize; HYPRE_Real cg_convergence_factor; /* Data for Gaussian elimination F-relaxation */ hypre_ParAMGData **GSElimData; } hypre_ParMGRData; /*-------------------------------------------------------------------------- * hypre_MGRRelaxData *--------------------------------------------------------------------------*/ /* F-relaxation struct for future refactoring of F-relaxation in MGR */ typedef struct { HYPRE_Int relax_type; HYPRE_Int relax_nsweeps; hypre_ParCSRMatrix *A; hypre_ParVector *b; /* for hypre's smoother options */ HYPRE_Int *CF_marker; /* for block Jacobi/GS option */ HYPRE_Complex *diaginv; /* for ILU option */ HYPRE_Solver frelax_solver; } hypre_MGRRelaxData; #define FMRK -1 #define CMRK 1 #define UMRK 0 #define S_CMRK 2 #define FPT(i, bsize) (((i) % (bsize)) == FMRK) #define CPT(i, bsize) (((i) % (bsize)) == CMRK) /*-------------------------------------------------------------------------- * MGR print level codes *--------------------------------------------------------------------------*/ #define HYPRE_MGR_PRINT_INFO_SETUP 0x01 /* 1 (1st bit) */ #define HYPRE_MGR_PRINT_INFO_SOLVE 0x02 /* 2 (2nd bit) */ #define HYPRE_MGR_PRINT_INFO_PARAMS 0x04 /* 4 (3rd bit) */ #define HYPRE_MGR_PRINT_MODE_ASCII 0x08 /* 8 (4th bit) */ #define HYPRE_MGR_PRINT_FINE_MATRIX 0x10 /* 16 (5th bit) */ #define HYPRE_MGR_PRINT_FINE_RHS 0x20 /* 32 (6th bit) */ #define HYPRE_MGR_PRINT_CRSE_MATRIX 0x40 /* 64 (7th bit) */ #define HYPRE_MGR_PRINT_LVLS_MATRIX 0x80 /* 128 (8th bit) */ /* ... */ /* Reserved codes */ #define HYPRE_MGR_PRINT_RESERVED_C 0x10000000 /* 268435456 (29th bit) */ #define HYPRE_MGR_PRINT_RESERVED_B 0x20000000 /* 536870912 (30th bit) */ #define HYPRE_MGR_PRINT_RESERVED_A 0x40000000 /* 1073741824 (31th bit) */ /*-------------------------------------------------------------------------- * Acessor macros *--------------------------------------------------------------------------*/ /* TODO (VPM): add remaining acessor macros */ #define hypre_ParMGRDataBlockSize(data) ((data) -> block_size) /* TODO (VPM): block_dim? 3x3=9 is the block_size */ #define hypre_ParMGRDataBlockNumCoarseIndexes(data) ((data) -> block_num_coarse_indexes) #define hypre_ParMGRDataBlockCFMarker(data) ((data) -> block_cf_marker) #define hypre_ParMGRDataPointMarker(data) ((data) -> point_marker_array) #define hypre_ParMGRDataNumCoarseLevels(data) ((data) -> num_coarse_levels) /* TODO (VPM): change to num_levels ? */ #define hypre_ParMGRDataMaxCoarseLevels(data) ((data) -> max_num_coarse_levels) /* TODO (VPM): change to max_levels ? */ #define hypre_ParMGRDataAArray(data) ((data) -> A_array) #define hypre_ParMGRDataA(data, i) ((data) -> A_array[i]) #define hypre_ParMGRDataBArray(data) ((data) -> B_array) #define hypre_ParMGRDataB(data, i) ((data) -> B_array[i]) #define hypre_ParMGRDataPArray(data) ((data) -> P_array) #define hypre_ParMGRDataP(data, i) ((data) -> P_array[i]) #define hypre_ParMGRDataRArray(data) ((data) -> R_array) #define hypre_ParMGRDataR(data, i) ((data) -> R_array[i]) #define hypre_ParMGRDataRTArray(data) ((data) -> RT_array) #define hypre_ParMGRDataRT(data, i) ((data) -> RT_array[i]) #define hypre_ParMGRDataBFFArray(data) ((data) -> B_FF_array) #define hypre_ParMGRDataBFF(data, i) ((data) -> B_FF_array[i]) #define hypre_ParMGRDataRAP(data) ((data) -> RAP) #define hypre_ParMGRDataInterpType(data) ((data) -> interp_type) #define hypre_ParMGRDataInterpTypeI(data, i) ((data) -> interp_type[i]) #define hypre_ParMGRDataRestrictType(data) ((data) -> restrict_type) #define hypre_ParMGRDataRestrictTypeI(data, i) ((data) -> restrict_type[i]) #define hypre_ParMGRDataLevelSmoothType(data) ((data) -> level_smooth_type) #define hypre_ParMGRDataLevelSmoothTypeI(data, i) ((data) -> level_smooth_type[i]) #define hypre_ParMGRDataLevelSmoother(data) ((data) -> level_smoother) #define hypre_ParMGRDataLevelSmootherI(data, i) ((data) -> level_smoother[i]) #define hypre_ParMGRDataRelaxType(data) ((data) -> relax_type) #define hypre_ParMGRDataFRelaxType(data) ((data) -> Frelax_type) #define hypre_ParMGRDataFRelaxTypeI(data, i) ((data) -> Frelax_type[i]) #define hypre_ParMGRDataAFFsolver(data) ((data) -> aff_solver) #define hypre_ParMGRDataAFFsolverI(data) ((data) -> aff_solver[i]) #define hypre_ParMGRDataCoarseGridMethod(data) ((data) -> coarse_grid_method) #define hypre_ParMGRDataCoarseGridMethodI(data, i) ((data) -> coarse_grid_method[i]) #define hypre_ParMGRDataCoarseGridSolver(data) ((data) -> coarse_grid_solver) #define hypre_ParMGRDataCoarseGridSolverSetup(data) ((data) -> coarse_grid_solver_setup) #endif hypre-2.33.0/src/parcsr_ls/par_mgr_coarsen.c000066400000000000000000000035331477326011500210240ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "_hypre_parcsr_ls.h" #include "par_mgr.h" /*-------------------------------------------------------------------------- * hypre_MGRCoarseParms * * Computes the fine and coarse partitioning arrays at once. * * TODO: Generate the dof_func array as in hypre_BoomerAMGCoarseParms *--------------------------------------------------------------------------*/ HYPRE_Int hypre_MGRCoarseParms(MPI_Comm comm, HYPRE_Int num_rows, hypre_IntArray *CF_marker, HYPRE_BigInt *row_starts_cpts, HYPRE_BigInt *row_starts_fpts) { HYPRE_UNUSED_VAR(num_rows); HYPRE_Int num_cpts; HYPRE_Int num_fpts; HYPRE_BigInt sbuffer_recv[2]; HYPRE_BigInt sbuffer_send[2]; /* Count number of Coarse points */ hypre_IntArrayCount(CF_marker, 1, &num_cpts); /* Count number of Fine points */ hypre_IntArrayCount(CF_marker, -1, &num_fpts); /* Scan global starts */ sbuffer_send[0] = (HYPRE_BigInt) num_cpts; sbuffer_send[1] = (HYPRE_BigInt) num_fpts; hypre_MPI_Scan(&sbuffer_send, &sbuffer_recv, 2, HYPRE_MPI_BIG_INT, hypre_MPI_SUM, comm); /* First points in next processor's range */ row_starts_cpts[1] = sbuffer_recv[0]; row_starts_fpts[1] = sbuffer_recv[1]; /* First points in current processor's range */ row_starts_cpts[0] = row_starts_cpts[1] - sbuffer_send[0]; row_starts_fpts[0] = row_starts_fpts[1] - sbuffer_send[1]; return hypre_error_flag; } hypre-2.33.0/src/parcsr_ls/par_mgr_device.c000066400000000000000000001205561477326011500206360ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * Two-grid system solver * *****************************************************************************/ #include "_hypre_onedpl.hpp" #include "seq_mv/seq_mv.h" #include "_hypre_parcsr_ls.h" #include "_hypre_utilities.hpp" #if defined (HYPRE_USING_GPU) template #if defined(HYPRE_USING_SYCL) struct functor #else struct functor : public thrust::binary_function #endif { T scale; functor(T scale_) { scale = scale_; } __host__ __device__ T operator()(const T &x, const T &y) const { return x + scale * (y - hypre_abs(x)); } }; /*-------------------------------------------------------------------------- * hypre_MGRBuildPFromWpDevice *--------------------------------------------------------------------------*/ HYPRE_Int hypre_MGRBuildPFromWpDevice( hypre_ParCSRMatrix *A, hypre_ParCSRMatrix *Wp, HYPRE_Int *CF_marker, hypre_ParCSRMatrix **P_ptr) { /* Wp info */ hypre_CSRMatrix *Wp_diag = hypre_ParCSRMatrixDiag(Wp); hypre_CSRMatrix *Wp_offd = hypre_ParCSRMatrixOffd(Wp); /* Local variables */ hypre_ParCSRMatrix *P; hypre_CSRMatrix *P_diag; hypre_CSRMatrix *P_offd; HYPRE_Int P_diag_nnz; hypre_GpuProfilingPushRange("MGRBuildPFromWp"); /* Set local variables */ P_diag_nnz = hypre_CSRMatrixNumNonzeros(Wp_diag) + hypre_CSRMatrixNumCols(Wp_diag); /* Create interpolation matrix */ P = hypre_ParCSRMatrixCreate(hypre_ParCSRMatrixComm(A), hypre_ParCSRMatrixGlobalNumRows(A), hypre_ParCSRMatrixGlobalNumCols(Wp), hypre_ParCSRMatrixRowStarts(A), hypre_ParCSRMatrixColStarts(Wp), hypre_CSRMatrixNumCols(Wp_offd), P_diag_nnz, hypre_CSRMatrixNumNonzeros(Wp_offd)); /* Initialize interpolation matrix */ hypre_ParCSRMatrixInitialize_v2(P, HYPRE_MEMORY_DEVICE); hypre_ParCSRMatrixDNumNonzeros(P) = (HYPRE_Real) hypre_ParCSRMatrixNumNonzeros(P); P_diag = hypre_ParCSRMatrixDiag(P); P_offd = hypre_ParCSRMatrixOffd(P); /* Copy contents from W to P and set identity matrix for the mapping between coarse points */ hypreDevice_extendWtoP(hypre_ParCSRMatrixNumRows(A), hypre_ParCSRMatrixNumRows(Wp), hypre_CSRMatrixNumCols(Wp_diag), CF_marker, hypre_CSRMatrixNumNonzeros(Wp_diag), hypre_CSRMatrixI(Wp_diag), hypre_CSRMatrixJ(Wp_diag), hypre_CSRMatrixData(Wp_diag), hypre_CSRMatrixI(P_diag), hypre_CSRMatrixJ(P_diag), hypre_CSRMatrixData(P_diag), hypre_CSRMatrixI(Wp_offd), hypre_CSRMatrixI(P_offd)); /* Swap some pointers to avoid data copies */ hypre_CSRMatrixJ(hypre_ParCSRMatrixOffd(P)) = hypre_CSRMatrixJ(Wp_offd); hypre_CSRMatrixData(hypre_ParCSRMatrixOffd(P)) = hypre_CSRMatrixData(Wp_offd); hypre_CSRMatrixJ(Wp_offd) = NULL; hypre_CSRMatrixData(Wp_offd) = NULL; /* hypre_ParCSRMatrixDeviceColMapOffd(P) = hypre_ParCSRMatrixDeviceColMapOffd(Wp); */ /* hypre_ParCSRMatrixColMapOffd(P) = hypre_ParCSRMatrixColMapOffd(Wp); */ /* hypre_ParCSRMatrixDeviceColMapOffd(Wp) = NULL; */ /* hypre_ParCSRMatrixColMapOffd(Wp) = NULL; */ /* Create communication package */ hypre_MatvecCommPkgCreate(P); /* Set output pointer to the interpolation matrix */ *P_ptr = P; hypre_GpuProfilingPopRange(); return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_MGRBuildPDevice * * TODO: make use of hypre_MGRBuildPFromWpDevice *--------------------------------------------------------------------------*/ HYPRE_Int hypre_MGRBuildPDevice(hypre_ParCSRMatrix *A, HYPRE_Int *CF_marker, HYPRE_BigInt *num_cpts_global, HYPRE_Int method, hypre_ParCSRMatrix **P_ptr) { MPI_Comm comm = hypre_ParCSRMatrixComm(A); HYPRE_Int num_procs, my_id; HYPRE_Int A_nr_of_rows = hypre_ParCSRMatrixNumRows(A); hypre_ParCSRMatrix *A_FF = NULL, *A_FC = NULL, *P = NULL; hypre_CSRMatrix *W_diag = NULL, *W_offd = NULL; HYPRE_Int W_nr_of_rows, P_diag_nnz, nfpoints; HYPRE_Int *P_diag_i = NULL, *P_diag_j = NULL, *P_offd_i = NULL; HYPRE_Complex *P_diag_data = NULL, *diag = NULL, *diag1 = NULL; HYPRE_BigInt nC_global; hypre_MPI_Comm_size(comm, &num_procs); hypre_MPI_Comm_rank(comm, &my_id); hypre_GpuProfilingPushRange("MGRBuildP"); #if defined(HYPRE_USING_SYCL) nfpoints = HYPRE_ONEDPL_CALL(std::count, CF_marker, CF_marker + A_nr_of_rows, -1); #else nfpoints = HYPRE_THRUST_CALL(count, CF_marker, CF_marker + A_nr_of_rows, -1); #endif if (method > 0) { hypre_ParCSRMatrixGenerateFFFCDevice(A, CF_marker, num_cpts_global, NULL, &A_FC, &A_FF); diag = hypre_CTAlloc(HYPRE_Complex, nfpoints, HYPRE_MEMORY_DEVICE); if (method == 1) { // extract diag inverse sqrt // hypre_CSRMatrixExtractDiagonalDevice(hypre_ParCSRMatrixDiag(A_FF), diag, 3); // L1-Jacobi-type interpolation HYPRE_Complex scal = 1.0; diag1 = hypre_CTAlloc(HYPRE_Complex, nfpoints, HYPRE_MEMORY_DEVICE); hypre_CSRMatrixExtractDiagonalDevice(hypre_ParCSRMatrixDiag(A_FF), diag, 0); hypre_CSRMatrixComputeRowSumDevice(hypre_ParCSRMatrixDiag(A_FF), NULL, NULL, diag1, 1, 1.0, "set"); hypre_CSRMatrixComputeRowSumDevice(hypre_ParCSRMatrixDiag(A_FC), NULL, NULL, diag1, 1, 1.0, "add"); hypre_CSRMatrixComputeRowSumDevice(hypre_ParCSRMatrixOffd(A_FF), NULL, NULL, diag1, 1, 1.0, "add"); hypre_CSRMatrixComputeRowSumDevice(hypre_ParCSRMatrixOffd(A_FC), NULL, NULL, diag1, 1, 1.0, "add"); #if defined(HYPRE_USING_SYCL) HYPRE_ONEDPL_CALL(std::transform, diag, diag + nfpoints, diag1, diag, functor(scal)); HYPRE_ONEDPL_CALL(std::transform, diag, diag + nfpoints, diag, [] (auto x) { return 1.0 / x; }); #else HYPRE_THRUST_CALL(transform, diag, diag + nfpoints, diag1, diag, functor(scal)); HYPRE_THRUST_CALL(transform, diag, diag + nfpoints, diag, 1.0 / _1); #endif hypre_TFree(diag1, HYPRE_MEMORY_DEVICE); } else if (method == 2) { // extract diag inverse hypre_CSRMatrixExtractDiagonalDevice(hypre_ParCSRMatrixDiag(A_FF), diag, 2); } #if defined(HYPRE_USING_SYCL) HYPRE_ONEDPL_CALL( transform, diag, diag + nfpoints, diag, std::negate() ); #else HYPRE_THRUST_CALL( transform, diag, diag + nfpoints, diag, thrust::negate() ); #endif hypre_Vector *D_FF_inv = hypre_SeqVectorCreate(nfpoints); hypre_VectorData(D_FF_inv) = diag; hypre_SeqVectorInitialize_v2(D_FF_inv, HYPRE_MEMORY_DEVICE); hypre_CSRMatrixDiagScaleDevice(hypre_ParCSRMatrixDiag(A_FC), D_FF_inv, NULL); hypre_CSRMatrixDiagScaleDevice(hypre_ParCSRMatrixOffd(A_FC), D_FF_inv, NULL); hypre_SeqVectorDestroy(D_FF_inv); W_diag = hypre_ParCSRMatrixDiag(A_FC); W_offd = hypre_ParCSRMatrixOffd(A_FC); nC_global = hypre_ParCSRMatrixGlobalNumCols(A_FC); } else { W_diag = hypre_CSRMatrixCreate(nfpoints, A_nr_of_rows - nfpoints, 0); W_offd = hypre_CSRMatrixCreate(nfpoints, 0, 0); hypre_CSRMatrixInitialize_v2(W_diag, 0, HYPRE_MEMORY_DEVICE); hypre_CSRMatrixInitialize_v2(W_offd, 0, HYPRE_MEMORY_DEVICE); if (my_id == (num_procs - 1)) { nC_global = num_cpts_global[1]; } hypre_MPI_Bcast(&nC_global, 1, HYPRE_MPI_BIG_INT, num_procs - 1, comm); } W_nr_of_rows = hypre_CSRMatrixNumRows(W_diag); /* Construct P from matrix product W_diag */ P_diag_nnz = hypre_CSRMatrixNumNonzeros(W_diag) + hypre_CSRMatrixNumCols(W_diag); P_diag_i = hypre_TAlloc(HYPRE_Int, A_nr_of_rows + 1, HYPRE_MEMORY_DEVICE); P_diag_j = hypre_TAlloc(HYPRE_Int, P_diag_nnz, HYPRE_MEMORY_DEVICE); P_diag_data = hypre_TAlloc(HYPRE_Complex, P_diag_nnz, HYPRE_MEMORY_DEVICE); P_offd_i = hypre_TAlloc(HYPRE_Int, A_nr_of_rows + 1, HYPRE_MEMORY_DEVICE); hypreDevice_extendWtoP( A_nr_of_rows, W_nr_of_rows, hypre_CSRMatrixNumCols(W_diag), CF_marker, hypre_CSRMatrixNumNonzeros(W_diag), hypre_CSRMatrixI(W_diag), hypre_CSRMatrixJ(W_diag), hypre_CSRMatrixData(W_diag), P_diag_i, P_diag_j, P_diag_data, hypre_CSRMatrixI(W_offd), P_offd_i ); // final P P = hypre_ParCSRMatrixCreate(hypre_ParCSRMatrixComm(A), hypre_ParCSRMatrixGlobalNumRows(A), nC_global, hypre_ParCSRMatrixColStarts(A), num_cpts_global, hypre_CSRMatrixNumCols(W_offd), P_diag_nnz, hypre_CSRMatrixNumNonzeros(W_offd) ); hypre_CSRMatrixMemoryLocation(hypre_ParCSRMatrixDiag(P)) = HYPRE_MEMORY_DEVICE; hypre_CSRMatrixMemoryLocation(hypre_ParCSRMatrixOffd(P)) = HYPRE_MEMORY_DEVICE; hypre_CSRMatrixI(hypre_ParCSRMatrixDiag(P)) = P_diag_i; hypre_CSRMatrixJ(hypre_ParCSRMatrixDiag(P)) = P_diag_j; hypre_CSRMatrixData(hypre_ParCSRMatrixDiag(P)) = P_diag_data; hypre_CSRMatrixI(hypre_ParCSRMatrixOffd(P)) = P_offd_i; hypre_CSRMatrixJ(hypre_ParCSRMatrixOffd(P)) = hypre_CSRMatrixJ(W_offd); hypre_CSRMatrixData(hypre_ParCSRMatrixOffd(P)) = hypre_CSRMatrixData(W_offd); hypre_CSRMatrixJ(W_offd) = NULL; hypre_CSRMatrixData(W_offd) = NULL; if (method > 0) { hypre_ParCSRMatrixDeviceColMapOffd(P) = hypre_ParCSRMatrixDeviceColMapOffd(A_FC); hypre_ParCSRMatrixColMapOffd(P) = hypre_ParCSRMatrixColMapOffd(A_FC); hypre_ParCSRMatrixDeviceColMapOffd(A_FC) = NULL; hypre_ParCSRMatrixColMapOffd(A_FC) = NULL; hypre_ParCSRMatrixNumNonzeros(P) = hypre_ParCSRMatrixNumNonzeros(A_FC) + hypre_ParCSRMatrixGlobalNumCols(A_FC); } else { hypre_ParCSRMatrixNumNonzeros(P) = nC_global; } hypre_ParCSRMatrixDNumNonzeros(P) = (HYPRE_Real) hypre_ParCSRMatrixNumNonzeros(P); hypre_MatvecCommPkgCreate(P); *P_ptr = P; if (A_FF) { hypre_ParCSRMatrixDestroy(A_FF); } if (A_FC) { hypre_ParCSRMatrixDestroy(A_FC); } if (method <= 0) { hypre_CSRMatrixDestroy(W_diag); hypre_CSRMatrixDestroy(W_offd); } hypre_GpuProfilingPopRange(); return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_MGRRelaxL1JacobiDevice *--------------------------------------------------------------------------*/ HYPRE_Int hypre_MGRRelaxL1JacobiDevice( hypre_ParCSRMatrix *A, hypre_ParVector *f, HYPRE_Int *CF_marker, HYPRE_Int relax_points, HYPRE_Real relax_weight, HYPRE_Real *l1_norms, hypre_ParVector *u, hypre_ParVector *Vtemp ) { hypre_BoomerAMGRelax(A, f, CF_marker, 18, relax_points, relax_weight, 1.0, l1_norms, u, Vtemp, NULL); return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypreGPUKernel_CSRMatrixExtractBlockDiag * * Fills vector diag with the block diagonals from the input matrix. * This function uses column-major storage for diag. * * TODOs: * 1) Move this to csr_matop_device.c * 2) Use sub-warps? * 3) blk_size as template arg. * 4) Choose diag storage between row and column-major? * 5) Should we build flat arrays, arrays of pointers, or allow both? *--------------------------------------------------------------------------*/ __global__ void hypreGPUKernel_CSRMatrixExtractBlockDiag( hypre_DeviceItem &item, HYPRE_Int blk_size, HYPRE_Int num_rows, HYPRE_Int *A_i, HYPRE_Int *A_j, HYPRE_Complex *A_a, HYPRE_Int *B_i, HYPRE_Int *B_j, HYPRE_Complex *B_a ) { HYPRE_Int lane = hypre_gpu_get_lane_id<1>(item); HYPRE_Int bs2 = blk_size * blk_size; HYPRE_Int bidx; HYPRE_Int lidx; HYPRE_Int i, ii, j, pj, qj; HYPRE_Int col; /* Grid-stride loop over block matrix rows */ for (bidx = hypre_gpu_get_grid_warp_id<1, 1>(item); bidx < num_rows / blk_size; bidx += hypre_gpu_get_grid_num_warps<1, 1>(item)) { ii = bidx * blk_size; /* Set output row pointer and column indices */ for (i = lane; i < blk_size; i += HYPRE_WARP_SIZE) { B_i[ii + i + 1] = (ii + i + 1) * blk_size; } /* Set output column indices (row major) */ for (j = lane; j < bs2; j += HYPRE_WARP_SIZE) { B_j[ii * blk_size + j] = ii + j % blk_size; } /* TODO: unroll this loop */ for (lidx = 0; lidx < blk_size; lidx++) { i = ii + lidx; if (lane < 2) { pj = read_only_load(A_i + i + lane); } qj = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, pj, 1); pj = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, pj, 0); /* Loop over columns */ for (j = pj + lane; j < qj; j += HYPRE_WARP_SIZE) { col = read_only_load(A_j + j); if ((col >= ii) && (col < ii + blk_size) && (fabs(A_a[j]) > HYPRE_REAL_MIN)) { /* batch offset + column offset + row offset */ B_a[ii * blk_size + (col - ii) * blk_size + lidx] = A_a[j]; } } } /* Local block loop */ } /* Grid-stride loop */ } /*-------------------------------------------------------------------------- * hypreGPUKernel_CSRMatrixExtractBlockDiagMarked * * Fills vector diag with the block diagonals from the input matrix. * This function uses column-major storage for diag. * * TODOs: * 1) Move this to csr_matop_device.c * 2) Use sub-warps? * 3) blk_size as template arg. * 4) Choose diag storage between row and column-major? * 5) Should we build flat arrays, arrays of pointers, or allow both? *--------------------------------------------------------------------------*/ __global__ void hypreGPUKernel_CSRMatrixExtractBlockDiagMarked( hypre_DeviceItem &item, HYPRE_Int blk_size, HYPRE_Int num_rows, HYPRE_Int marker_val, HYPRE_Int *marker, HYPRE_Int *marker_indices, HYPRE_Int *A_i, HYPRE_Int *A_j, HYPRE_Complex *A_a, HYPRE_Int *B_i, HYPRE_Int *B_j, HYPRE_Complex *B_a ) { HYPRE_Int lane = hypre_gpu_get_lane_id<1>(item); HYPRE_Int bidx; HYPRE_Int lidx; HYPRE_Int i, ii, j, pj, qj, k; HYPRE_Int col; /* Grid-stride loop over block matrix rows */ for (bidx = hypre_gpu_get_grid_warp_id<1, 1>(item); bidx < num_rows / blk_size; bidx += hypre_gpu_get_grid_num_warps<1, 1>(item)) { /* TODO: unroll this loop */ for (lidx = 0; lidx < blk_size; lidx++) { ii = bidx * blk_size; i = ii + lidx; if (marker[i] == marker_val) { if (lane < 2) { pj = read_only_load(A_i + i + lane); } qj = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, pj, 1); pj = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, pj, 0); /* Loop over columns */ for (j = pj + lane; j < qj; j += HYPRE_WARP_SIZE) { k = read_only_load(A_j + j); col = A_j[k]; if (marker[col] == marker_val) { if ((col >= ii) && (col < ii + blk_size) && (fabs(A_a[k]) > HYPRE_REAL_MIN)) { /* batch offset + column offset + row offset */ B_a[marker_indices[ii] * blk_size + (col - ii) * blk_size + lidx] = A_a[k]; } } } } /* row check */ } /* Local block loop */ } /* Grid-stride loop */ } /*-------------------------------------------------------------------------- * hypreGPUKernel_ComplexMatrixBatchedTranspose * * Transposes a group of dense matrices. Assigns one warp per block (batch). * Naive implementation. * * TODOs (VPM): * 1) Move to proper file. * 2) Use template argument for other data types * 3) Implement in-place transpose. *--------------------------------------------------------------------------*/ __global__ void hypreGPUKernel_ComplexMatrixBatchedTranspose( hypre_DeviceItem &item, HYPRE_Int num_blocks, HYPRE_Int block_size, HYPRE_Complex *A_data, HYPRE_Complex *B_data ) { HYPRE_Int lane = hypre_gpu_get_lane_id<1>(item); HYPRE_Int bs2 = block_size * block_size; HYPRE_Int bidx, lidx; /* Grid-stride loop over block matrix rows */ for (bidx = hypre_gpu_get_grid_warp_id<1, 1>(item); bidx < num_blocks; bidx += hypre_gpu_get_grid_num_warps<1, 1>(item)) { for (lidx = lane; lidx < bs2; lidx += HYPRE_WARP_SIZE) { B_data[bidx * bs2 + lidx] = A_data[bidx * bs2 + (lidx / block_size + (lidx % block_size) * block_size)]; } } /* Grid-stride loop */ } /*-------------------------------------------------------------------------- * hypre_ParCSRMatrixExtractBlockDiagDevice * * TODOs (VPM): * 1) Allow other local solver choices. Design an interface for that. * 2) Move this to par_csr_matop_device.c *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ParCSRMatrixExtractBlockDiagDevice( hypre_ParCSRMatrix *A, HYPRE_Int blk_size, HYPRE_Int num_points, HYPRE_Int point_type, HYPRE_Int *CF_marker, HYPRE_Int diag_size, HYPRE_Int diag_type, HYPRE_Int *B_diag_i, HYPRE_Int *B_diag_j, HYPRE_Complex *B_diag_data ) { HYPRE_UNUSED_VAR(CF_marker); HYPRE_UNUSED_VAR(diag_size); /* Matrix variables */ HYPRE_BigInt num_rows_A = hypre_ParCSRMatrixGlobalNumRows(A); hypre_CSRMatrix *A_diag = hypre_ParCSRMatrixDiag(A); HYPRE_Int num_rows = hypre_CSRMatrixNumRows(A_diag); HYPRE_Int *A_diag_i = hypre_CSRMatrixI(A_diag); HYPRE_Int *A_diag_j = hypre_CSRMatrixJ(A_diag); HYPRE_Complex *A_diag_data = hypre_CSRMatrixData(A_diag); /* Local LS variables */ #if defined(HYPRE_USING_ONEMKLBLAS) std::int64_t *pivots; std::int64_t work_sizes[2]; std::int64_t work_size; HYPRE_Complex *scratchpad; #else HYPRE_Int *pivots; HYPRE_Complex **tmpdiag_aop; HYPRE_Int *info; #endif HYPRE_Int *blk_row_indices; HYPRE_Complex *tmpdiag; HYPRE_Complex **diag_aop; /* Local variables */ HYPRE_Int bs2 = blk_size * blk_size; HYPRE_Int num_blocks; HYPRE_Int bdiag_size; /* Additional variables for debugging */ #if HYPRE_DEBUG HYPRE_Int *h_info; HYPRE_Int k, myid; hypre_MPI_Comm_rank(hypre_ParCSRMatrixComm(A), &myid); #endif /*----------------------------------------------------------------- * Sanity checks *-----------------------------------------------------------------*/ if (blk_size < 1) { hypre_error_w_msg(HYPRE_ERROR_GENERIC, "Invalid block size!"); return hypre_error_flag; } if ((num_rows_A > 0) && (num_rows_A < blk_size)) { hypre_error_w_msg(HYPRE_ERROR_GENERIC, "Input matrix is smaller than block size!"); return hypre_error_flag; } /* Return if the local matrix is empty */ if (!num_rows) { return hypre_error_flag; } /*----------------------------------------------------------------- * Initial *-----------------------------------------------------------------*/ hypre_GpuProfilingPushRange("ParCSRMatrixExtractBlockDiag"); /* Count the number of points matching point_type in CF_marker */ if (CF_marker) { /* Compute block row indices */ blk_row_indices = hypre_TAlloc(HYPRE_Int, num_rows, HYPRE_MEMORY_DEVICE); hypreDevice_IntFilln(blk_row_indices, (size_t) num_rows, 1); #if defined(HYPRE_USING_SYCL) HYPRE_ONEDPL_CALL(oneapi::dpl::exclusive_scan_by_segment, CF_marker, CF_marker + num_rows, blk_row_indices, blk_row_indices); #else HYPRE_THRUST_CALL(exclusive_scan_by_key, CF_marker, CF_marker + num_rows, blk_row_indices, blk_row_indices); #endif } else { blk_row_indices = NULL; } /* Compute block info */ num_blocks = hypre_ceildiv(num_points, blk_size); bdiag_size = num_blocks * bs2; if (num_points % blk_size) { hypre_error_w_msg(HYPRE_ERROR_GENERIC, "TODO! num_points % blk_size != 0"); hypre_GpuProfilingPopRange(); return hypre_error_flag; } /*----------------------------------------------------------------- * Extract diagonal sub-blocks (pattern and coefficients) *-----------------------------------------------------------------*/ { dim3 bDim = hypre_GetDefaultDeviceBlockDimension(); dim3 gDim = hypre_GetDefaultDeviceGridDimension(num_blocks, "warp", bDim); if (CF_marker) { HYPRE_GPU_LAUNCH( hypreGPUKernel_CSRMatrixExtractBlockDiagMarked, gDim, bDim, blk_size, num_rows, point_type, CF_marker, blk_row_indices, A_diag_i, A_diag_j, A_diag_data, B_diag_i, B_diag_j, B_diag_data ); } else { HYPRE_GPU_LAUNCH( hypreGPUKernel_CSRMatrixExtractBlockDiag, gDim, bDim, blk_size, num_rows, A_diag_i, A_diag_j, A_diag_data, B_diag_i, B_diag_j, B_diag_data ); } } /*----------------------------------------------------------------- * Invert diagonal sub-blocks *-----------------------------------------------------------------*/ if (diag_type == 1) { HYPRE_ANNOTATE_REGION_BEGIN("%s", "InvertDiagSubBlocks"); /* Memory allocation */ tmpdiag = hypre_TAlloc(HYPRE_Complex, bdiag_size, HYPRE_MEMORY_DEVICE); diag_aop = hypre_TAlloc(HYPRE_Complex *, num_blocks, HYPRE_MEMORY_DEVICE); #if defined(HYPRE_USING_ONEMKLBLAS) pivots = hypre_CTAlloc(std::int64_t, num_rows * blk_size, HYPRE_MEMORY_DEVICE); #else pivots = hypre_CTAlloc(HYPRE_Int, num_rows * blk_size, HYPRE_MEMORY_DEVICE); tmpdiag_aop = hypre_TAlloc(HYPRE_Complex *, num_blocks, HYPRE_MEMORY_DEVICE); info = hypre_CTAlloc(HYPRE_Int, num_blocks, HYPRE_MEMORY_DEVICE); #if defined (HYPRE_DEBUG) h_info = hypre_TAlloc(HYPRE_Int, num_blocks, HYPRE_MEMORY_HOST); #endif /* Memory copy */ hypre_TMemcpy(tmpdiag, B_diag_data, HYPRE_Complex, bdiag_size, HYPRE_MEMORY_DEVICE, HYPRE_MEMORY_DEVICE); /* Set work array of pointers */ hypreDevice_ComplexArrayToArrayOfPtrs(num_blocks, bs2, tmpdiag, tmpdiag_aop); #endif /* Set array of pointers */ hypreDevice_ComplexArrayToArrayOfPtrs(num_blocks, bs2, B_diag_data, diag_aop); /* Compute LU factorization */ #if defined(HYPRE_USING_CUBLAS) HYPRE_CUBLAS_CALL(hypre_cublas_getrfBatched(hypre_HandleCublasHandle(hypre_handle()), blk_size, tmpdiag_aop, blk_size, pivots, info, num_blocks)); #elif defined(HYPRE_USING_ROCSOLVER) HYPRE_ROCSOLVER_CALL(rocsolver_dgetrf_batched(hypre_HandleVendorSolverHandle(hypre_handle()), blk_size, blk_size, tmpdiag_aop, blk_size, pivots, blk_size, info, num_blocks)); #elif defined(HYPRE_USING_ONEMKLBLAS) HYPRE_ONEMKL_CALL( work_sizes[0] = oneapi::mkl::lapack::getrf_batch_scratchpad_size( *hypre_HandleComputeStream( hypre_handle()), blk_size, // std::int64_t m, blk_size, // std::int64_t n, blk_size, // std::int64_t lda, bs2, // std::int64_t stride_a, blk_size, // std::int64_t stride_ipiv, num_blocks ) ); // std::int64_t batch_size HYPRE_ONEMKL_CALL( work_sizes[1] = oneapi::mkl::lapack::getri_batch_scratchpad_size( *hypre_HandleComputeStream( hypre_handle()), (std::int64_t) blk_size, // std::int64_t n, (std::int64_t) blk_size, // std::int64_t lda, (std::int64_t) bs2, // std::int64_t stride_a, (std::int64_t) blk_size, // std::int64_t stride_ipiv, (std::int64_t) num_blocks // std::int64_t batch_size ) ); work_size = hypre_max(work_sizes[0], work_sizes[1]); scratchpad = hypre_TAlloc(HYPRE_Complex, work_size, HYPRE_MEMORY_DEVICE); HYPRE_ONEMKL_CALL( oneapi::mkl::lapack::getrf_batch( *hypre_HandleComputeStream(hypre_handle()), (std::int64_t) blk_size, // std::int64_t m, (std::int64_t) blk_size, // std::int64_t n, *diag_aop, // T *a, (std::int64_t) blk_size, // std::int64_t lda, (std::int64_t) bs2, // std::int64_t stride_a, pivots, // std::int64_t *ipiv, (std::int64_t) blk_size, // std::int64_t stride_ipiv, (std::int64_t) num_blocks, // std::int64_t batch_size, scratchpad, // T *scratchpad, (std::int64_t) work_size // std::int64_t scratchpad_size, ).wait() ); // const std::vector &events = {} ) ); #else hypre_error_w_msg(HYPRE_ERROR_GENERIC, "Block inversion not available!"); return hypre_error_flag; #endif #if defined (HYPRE_DEBUG) && !defined(HYPRE_USING_ONEMKLBLAS) hypre_TMemcpy(h_info, info, HYPRE_Int, num_blocks, HYPRE_MEMORY_HOST, HYPRE_MEMORY_DEVICE); for (k = 0; k < num_blocks; k++) { if (h_info[k] != 0) { if (h_info[k] < 0) { hypre_printf("[%d]: LU fact. failed at system %d, parameter %d ", myid, k, h_info[k]); } else { hypre_printf("[%d]: Singular U(%d, %d) at system %d", myid, h_info[k], h_info[k], k); } } } #endif /* Compute sub-blocks inverses */ #if defined(HYPRE_USING_CUBLAS) HYPRE_CUBLAS_CALL(hypre_cublas_getriBatched(hypre_HandleCublasHandle(hypre_handle()), blk_size, (const HYPRE_Real **) tmpdiag_aop, blk_size, pivots, diag_aop, blk_size, info, num_blocks)); #elif defined(HYPRE_USING_ROCSOLVER) HYPRE_ROCSOLVER_CALL(rocsolver_dgetri_batched(hypre_HandleVendorSolverHandle(hypre_handle()), blk_size, tmpdiag_aop, blk_size, pivots, blk_size, info, num_blocks)); #elif defined(HYPRE_USING_ONEMKLBLAS) HYPRE_ONEMKL_CALL( oneapi::mkl::lapack::getri_batch( *hypre_HandleComputeStream(hypre_handle()), (std::int64_t) blk_size, // std::int64_t n, *diag_aop, // T *a, (std::int64_t) blk_size, // std::int64_t lda, (std::int64_t) bs2, // std::int64_t stride_a, pivots, // std::int64_t *ipiv, (std::int64_t) blk_size, // std::int64_t stride_ipiv, (std::int64_t) num_blocks, // std::int64_t batch_size, scratchpad, // T *scratchpad, work_size // std::int64_t scratchpad_size ).wait() ); #else hypre_error_w_msg(HYPRE_ERROR_GENERIC, "Block inversion not available!"); return hypre_error_flag; #endif /* Free memory */ hypre_TFree(diag_aop, HYPRE_MEMORY_DEVICE); hypre_TFree(pivots, HYPRE_MEMORY_DEVICE); #if defined(HYPRE_USING_ONEMKLBLAS) hypre_TFree(scratchpad, HYPRE_MEMORY_DEVICE); #else hypre_TFree(tmpdiag_aop, HYPRE_MEMORY_DEVICE); hypre_TFree(info, HYPRE_MEMORY_DEVICE); #if defined (HYPRE_DEBUG) hypre_TFree(h_info, HYPRE_MEMORY_HOST); #endif #endif /* Transpose data to row-major format */ { dim3 bDim = hypre_GetDefaultDeviceBlockDimension(); dim3 gDim = hypre_GetDefaultDeviceGridDimension(num_blocks, "warp", bDim); /* Memory copy */ hypre_TMemcpy(tmpdiag, B_diag_data, HYPRE_Complex, bdiag_size, HYPRE_MEMORY_DEVICE, HYPRE_MEMORY_DEVICE); HYPRE_GPU_LAUNCH( hypreGPUKernel_ComplexMatrixBatchedTranspose, gDim, bDim, num_blocks, blk_size, tmpdiag, B_diag_data ); } /* Free memory */ hypre_TFree(tmpdiag, HYPRE_MEMORY_DEVICE); HYPRE_ANNOTATE_REGION_END("%s", "InvertDiagSubBlocks"); } /* Free memory */ hypre_TFree(blk_row_indices, HYPRE_MEMORY_DEVICE); hypre_GpuProfilingPopRange(); return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_ParCSRMatrixBlockDiagMatrixDevice * * TODO: Move this to par_csr_matop_device.c (VPM) *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ParCSRMatrixBlockDiagMatrixDevice( hypre_ParCSRMatrix *A, HYPRE_Int blk_size, HYPRE_Int point_type, HYPRE_Int *CF_marker, HYPRE_Int diag_type, hypre_ParCSRMatrix **B_ptr ) { /* Input matrix info */ MPI_Comm comm = hypre_ParCSRMatrixComm(A); HYPRE_BigInt *row_starts_A = hypre_ParCSRMatrixRowStarts(A); HYPRE_BigInt num_rows_A = hypre_ParCSRMatrixGlobalNumRows(A); hypre_CSRMatrix *A_diag = hypre_ParCSRMatrixDiag(A); HYPRE_Int A_diag_num_rows = hypre_CSRMatrixNumRows(A_diag); /* Global block matrix info */ hypre_ParCSRMatrix *par_B; HYPRE_BigInt num_rows_B; HYPRE_BigInt row_starts_B[2]; /* Diagonal block matrix info */ hypre_CSRMatrix *B_diag; HYPRE_Int B_diag_num_rows; HYPRE_Int B_diag_size; HYPRE_Int *B_diag_i; HYPRE_Int *B_diag_j; HYPRE_Complex *B_diag_data; /* Local variables */ HYPRE_BigInt num_rows_big; HYPRE_BigInt scan_recv; HYPRE_Int num_procs, my_id; HYPRE_Int num_blocks; hypre_MPI_Comm_rank(comm, &my_id); hypre_MPI_Comm_size(comm, &num_procs); /*----------------------------------------------------------------- * Count the number of points matching point_type in CF_marker *-----------------------------------------------------------------*/ if (!CF_marker) { B_diag_num_rows = A_diag_num_rows; } else { #if defined(HYPRE_USING_SYCL) B_diag_num_rows = HYPRE_ONEDPL_CALL( std::count, CF_marker, CF_marker + A_diag_num_rows, point_type ); #else B_diag_num_rows = HYPRE_THRUST_CALL( count, CF_marker, CF_marker + A_diag_num_rows, point_type ); #endif } num_blocks = hypre_ceildiv(B_diag_num_rows, blk_size); B_diag_size = blk_size * (blk_size * num_blocks); /*----------------------------------------------------------------- * Compute global number of rows and partitionings *-----------------------------------------------------------------*/ if (CF_marker) { num_rows_big = (HYPRE_BigInt) B_diag_num_rows; hypre_MPI_Scan(&num_rows_big, &scan_recv, 1, HYPRE_MPI_BIG_INT, hypre_MPI_SUM, comm); /* first point in my range */ row_starts_B[0] = scan_recv - num_rows_big; /* first point in next proc's range */ row_starts_B[1] = scan_recv; if (my_id == (num_procs - 1)) { num_rows_B = row_starts_B[1]; } hypre_MPI_Bcast(&num_rows_B, 1, HYPRE_MPI_BIG_INT, num_procs - 1, comm); } else { row_starts_B[0] = row_starts_A[0]; row_starts_B[1] = row_starts_A[1]; num_rows_B = num_rows_A; } /* Create matrix B */ par_B = hypre_ParCSRMatrixCreate(comm, num_rows_B, num_rows_B, row_starts_B, row_starts_B, 0, B_diag_size, 0); hypre_ParCSRMatrixInitialize_v2(par_B, HYPRE_MEMORY_DEVICE); B_diag = hypre_ParCSRMatrixDiag(par_B); B_diag_i = hypre_CSRMatrixI(B_diag); B_diag_j = hypre_CSRMatrixJ(B_diag); B_diag_data = hypre_CSRMatrixData(B_diag); /*----------------------------------------------------------------------- * Extract coefficients *-----------------------------------------------------------------------*/ hypre_ParCSRMatrixExtractBlockDiagDevice(A, blk_size, B_diag_num_rows, point_type, CF_marker, B_diag_size, diag_type, B_diag_i, B_diag_j, B_diag_data); /* Set output pointer */ *B_ptr = par_B; return hypre_error_flag; } #endif hypre-2.33.0/src/parcsr_ls/par_mgr_interp.c000066400000000000000000002666751477326011500207150ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "_hypre_parcsr_ls.h" #include "par_mgr.h" /*-------------------------------------------------------------------------- * hypre_MGRBuildInterp * * Build MGR's prolongation matrix P = [Wp I]^T where Wp might be computed * explicitly and returned as an output of this function. * Wp approximates [- inv(A_FF) * A_FC]. Note the negative sign. *--------------------------------------------------------------------------*/ HYPRE_Int hypre_MGRBuildInterp(hypre_ParCSRMatrix *A, hypre_ParCSRMatrix *A_FF, hypre_ParCSRMatrix *A_FC, hypre_ParCSRMatrix *S, hypre_IntArray *CF_marker, HYPRE_BigInt *num_cpts_global, HYPRE_Real trunc_factor, HYPRE_Int max_elmts, HYPRE_Int blk_size, HYPRE_Int interp_type, HYPRE_Int num_sweeps_post, hypre_ParCSRMatrix **Wp_ptr, hypre_ParCSRMatrix **P_ptr) { HYPRE_Int *CF_marker_data = hypre_IntArrayData(CF_marker); hypre_ParCSRMatrix *P = NULL; hypre_ParCSRMatrix *Wp = NULL; #if defined (HYPRE_USING_GPU) HYPRE_MemoryLocation memory_location = hypre_ParCSRMatrixMemoryLocation(A); HYPRE_ExecutionPolicy exec = hypre_GetExecPolicy1(memory_location); #endif /* Sanity checks */ if (!Wp_ptr) { hypre_error_w_msg(HYPRE_ERROR_GENERIC, "Wp_ptr is not NULL!"); return hypre_error_flag; } if (!P_ptr) { hypre_error_w_msg(HYPRE_ERROR_GENERIC, "P_ptr is not NULL!"); return hypre_error_flag; } HYPRE_ANNOTATE_FUNC_BEGIN; hypre_GpuProfilingPushRange("Interp"); /* Interpolation for each level */ if (interp_type < 3) { #if defined (HYPRE_USING_GPU) if (exec == HYPRE_EXEC_DEVICE) { hypre_MGRBuildPDevice(A, CF_marker_data, num_cpts_global, interp_type, &P); } else #endif { hypre_MGRBuildPHost(A, A_FF, A_FC, CF_marker_data, num_cpts_global, interp_type, &Wp, &P); /* TODO (VPM): Revisit Prolongation post-smoothing */ #if 0 if (interp_type == 2) { HYPRE_Real jac_trunc_threshold = trunc_factor; HYPRE_Real jac_trunc_threshold_minus = 0.5 * jac_trunc_threshold; HYPRE_Int i; for (i = 0; i < num_sweeps_post; i++) { hypre_BoomerAMGJacobiInterp(A, &P, S, 1, NULL, CF_marker_data, 0, jac_trunc_threshold, jac_trunc_threshold_minus); } hypre_BoomerAMGInterpTruncation(P, trunc_factor, max_elmts); } #else HYPRE_UNUSED_VAR(num_sweeps_post); #endif } } else if (interp_type == 4) { #if defined (HYPRE_USING_GPU) if (exec == HYPRE_EXEC_DEVICE) { hypre_IntArrayMigrate(CF_marker, HYPRE_MEMORY_HOST); hypre_ParCSRMatrixMigrate(A, HYPRE_MEMORY_HOST); hypre_MGRBuildInterpApproximateInverse(A, CF_marker_data, num_cpts_global, &P); hypre_ParCSRMatrixMigrate(A, memory_location); hypre_IntArrayMigrate(CF_marker, memory_location); } else #endif { hypre_MGRBuildInterpApproximateInverse(A, CF_marker_data, num_cpts_global, &P); } /* Perform truncation */ hypre_BoomerAMGInterpTruncation(P, trunc_factor, max_elmts); } else if (interp_type == 5) { hypre_BoomerAMGBuildModExtInterp(A, CF_marker_data, S, num_cpts_global, 1, NULL, 0, trunc_factor, max_elmts, &P); } else if (interp_type == 6) { hypre_BoomerAMGBuildModExtPIInterp(A, CF_marker_data, S, num_cpts_global, 1, NULL, 0, trunc_factor, max_elmts, &P); } else if (interp_type == 7) { hypre_BoomerAMGBuildModExtPEInterp(A, CF_marker_data, S, num_cpts_global, 1, NULL, 0, trunc_factor, max_elmts, &P); } else if (interp_type == 12) { /* Block diagonal interpolation */ hypre_MGRBuildBlockJacobiWp(A_FF, A_FC, blk_size, &Wp); hypre_MGRBuildBlockJacobiP(A, A_FF, A_FC, Wp, blk_size, CF_marker_data, &P); } else { /* Classical modified interpolation */ hypre_BoomerAMGBuildInterp(A, CF_marker_data, S, num_cpts_global, 1, NULL, 0, trunc_factor, max_elmts, &P); } /* set pointer to Wp and P */ *Wp_ptr = Wp; *P_ptr = P; hypre_GpuProfilingPopRange(); HYPRE_ANNOTATE_FUNC_END; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_MGRBuildRestrict * * Build MGR's restriction matrix R = [Wr I] where Wr might be computed * explicitly and returned as an output of this function. * Wr approximates [- A_CF * inv(A_FF)]. Note the negative sign. * * TODOs (VPM): * 1) Add post-smoothing *--------------------------------------------------------------------------*/ HYPRE_Int hypre_MGRBuildRestrict( hypre_ParCSRMatrix *A, hypre_ParCSRMatrix *A_FF, hypre_ParCSRMatrix *A_FC, hypre_ParCSRMatrix *A_CF, hypre_IntArray *CF_marker, HYPRE_BigInt *num_cpts_global, HYPRE_Real trunc_factor, HYPRE_Int max_elmts, HYPRE_Real strong_threshold, HYPRE_Real max_row_sum, HYPRE_Int blk_size, HYPRE_Int restrict_type, hypre_ParCSRMatrix **Wr_ptr, hypre_ParCSRMatrix **R_ptr, hypre_ParCSRMatrix **RT_ptr) { /* Input variables */ HYPRE_Int *CF_marker_data = hypre_IntArrayData(CF_marker); /* Output variables */ hypre_ParCSRMatrix *Wr = NULL; hypre_ParCSRMatrix *R = NULL; hypre_ParCSRMatrix *RT = NULL; /* Local variables */ hypre_ParCSRMatrix *AT = NULL; hypre_ParCSRMatrix *A_FFT = NULL; hypre_ParCSRMatrix *A_FCT = NULL; hypre_ParCSRMatrix *ST = NULL; #if defined (HYPRE_USING_GPU) HYPRE_ExecutionPolicy exec = hypre_GetExecPolicy1( hypre_ParCSRMatrixMemoryLocation(A) ); #endif HYPRE_ANNOTATE_FUNC_BEGIN; hypre_GpuProfilingPushRange("Restrict"); /* Build AT (transpose A) */ if (restrict_type > 0 && restrict_type != 14) { hypre_ParCSRMatrixTranspose(A, &AT, 1); if (A_FF) { hypre_ParCSRMatrixTranspose(A_FF, &A_FFT, 1); } if (A_FC) { hypre_ParCSRMatrixTranspose(A_FC, &A_FCT, 1); } } /* Restriction for each level */ if (restrict_type == 0) { #if defined (HYPRE_USING_GPU) if (exec == HYPRE_EXEC_DEVICE) { hypre_MGRBuildPDevice(A, CF_marker_data, num_cpts_global, restrict_type, &RT); } else #endif { hypre_MGRBuildP(A, CF_marker_data, num_cpts_global, restrict_type, 0, &RT); } } else if (restrict_type == 1 || restrict_type == 2) { #if defined (HYPRE_USING_GPU) if (exec == HYPRE_EXEC_DEVICE) { hypre_MGRBuildPDevice(AT, CF_marker_data, num_cpts_global, restrict_type, &RT); } else #endif { hypre_MGRBuildP(AT, CF_marker_data, num_cpts_global, restrict_type, 0, &RT); } } else if (restrict_type == 3) { /* move diagonal to first entry */ hypre_CSRMatrixReorder(hypre_ParCSRMatrixDiag(AT)); hypre_MGRBuildInterpApproximateInverse(AT, CF_marker_data, num_cpts_global, &RT); hypre_BoomerAMGInterpTruncation(RT, trunc_factor, max_elmts); } else if (restrict_type == 4 || restrict_type == 5) { /* Approximate Ideal Restriction (AIR) */ HYPRE_Real filter_thresholdR = 0.0; HYPRE_Int gmres_switch = 64; HYPRE_Int is_triangular = 0; HYPRE_Int *dofunc_buff_data = NULL; HYPRE_Int air15_flag = 1; HYPRE_Int debug = 0; hypre_BoomerAMGCreateSabs(A, strong_threshold, 1.0, 1, NULL, &ST); if (restrict_type == 4) { /* distance-1 AIR */ hypre_BoomerAMGBuildRestrAIR(A, CF_marker_data, ST, num_cpts_global, 1, dofunc_buff_data, filter_thresholdR, debug, &R, is_triangular, gmres_switch); } else { /* distance-1.5 AIR - distance 2 locally and distance 1 across procs. */ hypre_BoomerAMGBuildRestrDist2AIR(A, CF_marker_data, ST, num_cpts_global, 1, dofunc_buff_data, filter_thresholdR, debug, &R, air15_flag, is_triangular, gmres_switch); } } else if (restrict_type == 12) { hypre_MGRBuildBlockJacobiP(AT, A_FFT, A_FCT, NULL, blk_size, CF_marker_data, &RT); } else if (restrict_type == 13) // CPR-like restriction operator { /* TODO: create a function with this block (VPM) */ hypre_ParCSRMatrix *A_CF_blk = NULL; hypre_ParCSRMatrix *A_CFT_blk = NULL; hypre_ParCSRMatrix *WrT = NULL; hypre_ParCSRMatrix *A_FF_blkinv = NULL; #if defined (HYPRE_USING_GPU) if (exec == HYPRE_EXEC_DEVICE) { hypre_error_w_msg(HYPRE_ERROR_GENERIC, "No GPU support!"); hypre_GpuProfilingPopRange(); HYPRE_ANNOTATE_FUNC_END; return hypre_error_flag; } else #endif { /* Get block A_CF */ hypre_MGRTruncateAcfCPR(A_CF, &A_CF_blk); /* Transpose block A_CF */ hypre_ParCSRMatrixTranspose(A_CF_blk, &A_CFT_blk, 1); /* Compute block diagonal A_FF */ hypre_ParCSRMatrixBlockDiagMatrix(AT, blk_size, -1, CF_marker_data, 1, &A_FF_blkinv); /* Compute WrT = -A_FF_blk^{-T} * A_CF^{T} */ WrT = hypre_ParCSRMatMat(A_FF_blkinv, A_CFT_blk); hypre_ParCSRMatrixScale(WrT, -1.0); /* compute restriction operator RT = [WrT I] (transposed for use with RAP) */ hypre_MGRBuildPFromWp(AT, WrT, CF_marker_data, &RT); } /* Free memory */ hypre_ParCSRMatrixDestroy(A_CF_blk); hypre_ParCSRMatrixDestroy(A_CFT_blk); hypre_ParCSRMatrixDestroy(WrT); hypre_ParCSRMatrixDestroy(A_FF_blkinv); } else if (restrict_type == 14) { if (blk_size > 1) { /* Block column-lumped restriction */ hypre_MGRBlockColLumpedRestrict(A, A_FF, A_CF, CF_marker, blk_size, &Wr, &R); } else { /* Column-lumped restriction */ hypre_MGRColLumpedRestrict(A, A_FF, A_CF, CF_marker, &Wr, &R); } } else { /* Build new strength matrix */ hypre_BoomerAMGCreateS(AT, strong_threshold, max_row_sum, 1, NULL, &ST); /* Classical modified interpolation */ hypre_BoomerAMGBuildInterp(AT, CF_marker_data, ST, num_cpts_global, 1, NULL, 0, trunc_factor, max_elmts, &RT); } /* Compute R^T so it can be used in the solve phase */ if (RT) { hypre_ParCSRMatrixLocalTranspose(RT); } /* Set output pointers */ *RT_ptr = RT; *R_ptr = R; *Wr_ptr = Wr; /* Free memory */ hypre_ParCSRMatrixDestroy(AT); hypre_ParCSRMatrixDestroy(A_FFT); hypre_ParCSRMatrixDestroy(A_FCT); hypre_ParCSRMatrixDestroy(ST); hypre_GpuProfilingPopRange(); HYPRE_ANNOTATE_FUNC_END; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_MGRBuildPFromWp * * Build prolongation matrix from the Nf x Nc matrix * * TODO (VPM): Move this function to par_interp.c ? *--------------------------------------------------------------------------*/ HYPRE_Int hypre_MGRBuildPFromWp( hypre_ParCSRMatrix *A, hypre_ParCSRMatrix *Wp, HYPRE_Int *CF_marker, hypre_ParCSRMatrix **P_ptr) { HYPRE_ANNOTATE_FUNC_BEGIN; #if defined(HYPRE_USING_GPU) HYPRE_ExecutionPolicy exec = hypre_GetExecPolicy1( hypre_ParCSRMatrixMemoryLocation(A) ); if (exec == HYPRE_EXEC_DEVICE) { hypre_MGRBuildPFromWpDevice(A, Wp, CF_marker, P_ptr); } else #endif { hypre_MGRBuildPFromWpHost(A, Wp, CF_marker, P_ptr); } HYPRE_ANNOTATE_FUNC_END; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_MGRBuildPFromWpHost *--------------------------------------------------------------------------*/ HYPRE_Int hypre_MGRBuildPFromWpHost( hypre_ParCSRMatrix *A, hypre_ParCSRMatrix *Wp, HYPRE_Int *CF_marker, hypre_ParCSRMatrix **P_ptr) { MPI_Comm comm = hypre_ParCSRMatrixComm(A); HYPRE_MemoryLocation memory_location_P = hypre_ParCSRMatrixMemoryLocation(A); hypre_ParCSRMatrix *P; hypre_CSRMatrix *P_diag = NULL; hypre_CSRMatrix *P_offd = NULL; hypre_CSRMatrix *Wp_diag, *Wp_offd; HYPRE_Real *P_diag_data, *Wp_diag_data; HYPRE_Int *P_diag_i, *Wp_diag_i; HYPRE_Int *P_diag_j, *Wp_diag_j; HYPRE_Real *P_offd_data, *Wp_offd_data; HYPRE_Int *P_offd_i, *Wp_offd_i; HYPRE_Int *P_offd_j, *Wp_offd_j; HYPRE_Int P_num_rows, P_diag_size, P_offd_size; HYPRE_Int jj_counter, jj_counter_offd; HYPRE_Int start_indexing = 0; /* start indexing for P_data at 0 */ HYPRE_Int i, jj; HYPRE_Int row_Wp, coarse_counter; HYPRE_Real one = 1.0; HYPRE_Int my_id; HYPRE_Int num_procs; hypre_MPI_Comm_size(comm, &num_procs); hypre_MPI_Comm_rank(comm, &my_id); //num_threads = hypre_NumThreads(); // Temporary fix, disable threading // TODO: enable threading P_num_rows = hypre_CSRMatrixNumRows(hypre_ParCSRMatrixDiag(A)); Wp_diag = hypre_ParCSRMatrixDiag(Wp); Wp_offd = hypre_ParCSRMatrixOffd(Wp); Wp_diag_i = hypre_CSRMatrixI(Wp_diag); Wp_diag_j = hypre_CSRMatrixJ(Wp_diag); Wp_diag_data = hypre_CSRMatrixData(Wp_diag); Wp_offd_i = hypre_CSRMatrixI(Wp_offd); Wp_offd_j = hypre_CSRMatrixJ(Wp_offd); Wp_offd_data = hypre_CSRMatrixData(Wp_offd); /*----------------------------------------------------------------------- * Intialize counters and allocate mapping vector. *-----------------------------------------------------------------------*/ P_diag_size = hypre_CSRMatrixNumNonzeros(Wp_diag) + hypre_CSRMatrixNumCols(Wp_diag); P_diag_i = hypre_CTAlloc(HYPRE_Int, P_num_rows + 1, memory_location_P); P_diag_j = hypre_CTAlloc(HYPRE_Int, P_diag_size, memory_location_P); P_diag_data = hypre_CTAlloc(HYPRE_Real, P_diag_size, memory_location_P); P_diag_i[P_num_rows] = P_diag_size; P_offd_size = hypre_CSRMatrixNumNonzeros(Wp_offd); P_offd_i = hypre_CTAlloc(HYPRE_Int, P_num_rows + 1, memory_location_P); P_offd_j = hypre_CTAlloc(HYPRE_Int, P_offd_size, memory_location_P); P_offd_data = hypre_CTAlloc(HYPRE_Real, P_offd_size, memory_location_P); P_offd_i[P_num_rows] = P_offd_size; /*----------------------------------------------------------------------- * Intialize some stuff. *-----------------------------------------------------------------------*/ jj_counter = start_indexing; jj_counter_offd = start_indexing; row_Wp = 0; coarse_counter = 0; for (i = 0; i < P_num_rows; i++) { /*-------------------------------------------------------------------- * If i is a c-point, interpolation is the identity. *--------------------------------------------------------------------*/ if (CF_marker[i] >= 0) { P_diag_i[i] = jj_counter; P_diag_j[jj_counter] = coarse_counter; P_diag_data[jj_counter] = one; coarse_counter++; jj_counter++; } /*-------------------------------------------------------------------- * If i is an F-point, build interpolation. *--------------------------------------------------------------------*/ else { /* Diagonal part of P */ P_diag_i[i] = jj_counter; for (jj = Wp_diag_i[row_Wp]; jj < Wp_diag_i[row_Wp + 1]; jj++) { P_diag_j[jj_counter] = Wp_diag_j[jj]; P_diag_data[jj_counter] = Wp_diag_data[jj]; jj_counter++; } /* Off-Diagonal part of P */ P_offd_i[i] = jj_counter_offd; if (num_procs > 1) { for (jj = Wp_offd_i[row_Wp]; jj < Wp_offd_i[row_Wp + 1]; jj++) { P_offd_j[jj_counter_offd] = Wp_offd_j[jj]; P_offd_data[jj_counter_offd] = Wp_offd_data[jj]; jj_counter_offd++; } } row_Wp++; } P_offd_i[i + 1] = jj_counter_offd; } P = hypre_ParCSRMatrixCreate(comm, hypre_ParCSRMatrixGlobalNumRows(A), hypre_ParCSRMatrixGlobalNumCols(Wp), hypre_ParCSRMatrixColStarts(A), hypre_ParCSRMatrixColStarts(Wp), hypre_CSRMatrixNumCols(hypre_ParCSRMatrixOffd(Wp)), P_diag_size, P_offd_size); P_diag = hypre_ParCSRMatrixDiag(P); hypre_CSRMatrixData(P_diag) = P_diag_data; hypre_CSRMatrixI(P_diag) = P_diag_i; hypre_CSRMatrixJ(P_diag) = P_diag_j; P_offd = hypre_ParCSRMatrixOffd(P); hypre_CSRMatrixData(P_offd) = P_offd_data; hypre_CSRMatrixI(P_offd) = P_offd_i; hypre_CSRMatrixJ(P_offd) = P_offd_j; hypre_ParCSRMatrixColMapOffd(P) = hypre_TAlloc(HYPRE_BigInt, hypre_CSRMatrixNumCols(hypre_ParCSRMatrixOffd(Wp)), memory_location_P); hypre_TMemcpy(hypre_ParCSRMatrixColMapOffd(P), hypre_ParCSRMatrixColMapOffd(Wp), HYPRE_BigInt, hypre_CSRMatrixNumCols(hypre_ParCSRMatrixOffd(Wp)), memory_location_P, memory_location_P); hypre_ParCSRMatrixNumNonzeros(P) = hypre_CSRMatrixNumNonzeros(hypre_ParCSRMatrixDiag(P)) + hypre_CSRMatrixNumNonzeros(hypre_ParCSRMatrixOffd(P)); hypre_ParCSRMatrixDNumNonzeros(P) = (HYPRE_Real) hypre_ParCSRMatrixNumNonzeros(P); hypre_MatvecCommPkgCreate(P); *P_ptr = P; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_MGRBuildBlockJacobiWp * * TODO: Move this to hypre_MGRBuildBlockJacobiP? (VPM) *--------------------------------------------------------------------------*/ HYPRE_Int hypre_MGRBuildBlockJacobiWp( hypre_ParCSRMatrix *A_FF, hypre_ParCSRMatrix *A_FC, HYPRE_Int blk_size, hypre_ParCSRMatrix **Wp_ptr ) { hypre_ParCSRMatrix *A_FF_inv; hypre_ParCSRMatrix *Wp; HYPRE_ANNOTATE_FUNC_BEGIN; /* Build A_FF_inv */ hypre_ParCSRMatrixBlockDiagMatrix(A_FF, blk_size, -1, NULL, 1, &A_FF_inv); /* Compute Wp = -A_FF_inv * A_FC */ Wp = hypre_ParCSRMatMat(A_FF_inv, A_FC); hypre_ParCSRMatrixScale(Wp, -1.0); /* Free memory */ hypre_ParCSRMatrixDestroy(A_FF_inv); /* Set output pointer */ *Wp_ptr = Wp; HYPRE_ANNOTATE_FUNC_END; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_MGRBuildBlockJacobiP *--------------------------------------------------------------------------*/ HYPRE_Int hypre_MGRBuildBlockJacobiP( hypre_ParCSRMatrix *A, hypre_ParCSRMatrix *A_FF, hypre_ParCSRMatrix *A_FC, hypre_ParCSRMatrix *Wp, HYPRE_Int blk_size, HYPRE_Int *CF_marker, hypre_ParCSRMatrix **P_ptr) { hypre_ParCSRMatrix *Wp_tmp; HYPRE_ANNOTATE_FUNC_BEGIN; if (Wp == NULL) { hypre_MGRBuildBlockJacobiWp(A_FF, A_FC, blk_size, &Wp_tmp); hypre_MGRBuildPFromWp(A, Wp_tmp, CF_marker, P_ptr); hypre_ParCSRMatrixDeviceColMapOffd(Wp_tmp) = NULL; hypre_ParCSRMatrixColMapOffd(Wp_tmp) = NULL; hypre_ParCSRMatrixDestroy(Wp_tmp); } else { hypre_MGRBuildPFromWp(A, Wp, CF_marker, P_ptr); } HYPRE_ANNOTATE_FUNC_END; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_ExtendWtoPHost * * TODO (VPM): merge with hypre_MGRBuildPFromWpHost *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ExtendWtoPHost(HYPRE_Int P_nr_of_rows, HYPRE_Int *CF_marker, HYPRE_Int *W_diag_i, HYPRE_Int *W_diag_j, HYPRE_Complex *W_diag_data, HYPRE_Int *P_diag_i, HYPRE_Int *P_diag_j, HYPRE_Complex *P_diag_data, HYPRE_Int *W_offd_i, HYPRE_Int *P_offd_i) { HYPRE_Int jj_counter, jj_counter_offd; HYPRE_Int start_indexing = 0; /* start indexing for P_data at 0 */ HYPRE_Int *fine_to_coarse = NULL; HYPRE_Int coarse_counter; HYPRE_Int i, jj; HYPRE_Real one = 1.0; /*----------------------------------------------------------------------- * Intialize counters and allocate mapping vector. *-----------------------------------------------------------------------*/ fine_to_coarse = hypre_CTAlloc(HYPRE_Int, P_nr_of_rows, HYPRE_MEMORY_HOST); for (i = 0; i < P_nr_of_rows; i++) { fine_to_coarse[i] = -1; } /*----------------------------------------------------------------------- * Loop over fine grid. *-----------------------------------------------------------------------*/ HYPRE_Int row_counter = 0; coarse_counter = 0; for (i = 0; i < P_nr_of_rows; i++) { /*-------------------------------------------------------------------- * If i is a C-point, interpolation is the identity. Also set up * mapping vector. *--------------------------------------------------------------------*/ if (CF_marker[i] > 0) { fine_to_coarse[i] = coarse_counter; coarse_counter++; } } /*----------------------------------------------------------------------- * Intialize counters *-----------------------------------------------------------------------*/ jj_counter = start_indexing; jj_counter_offd = start_indexing; row_counter = 0; for (i = 0; i < P_nr_of_rows; i++) { /*-------------------------------------------------------------------- * If i is a c-point, interpolation is the identity. *--------------------------------------------------------------------*/ if (CF_marker[i] >= 0) { P_diag_i[i] = jj_counter; P_diag_j[jj_counter] = fine_to_coarse[i]; P_diag_data[jj_counter] = one; jj_counter++; } /*-------------------------------------------------------------------- * If i is an F-point, build interpolation. *--------------------------------------------------------------------*/ else { /* Diagonal part of P */ P_diag_i[i] = jj_counter; for (jj = W_diag_i[row_counter]; jj < W_diag_i[row_counter + 1]; jj++) { //P_marker[row_counter] = jj_counter; P_diag_j[jj_counter] = W_diag_j[jj]; P_diag_data[jj_counter] = W_diag_data[jj]; jj_counter++; } /* Off-Diagonal part of P */ P_offd_i[i] = jj_counter_offd; jj_counter_offd += W_offd_i[row_counter + 1] - W_offd_i[row_counter]; row_counter++; } /* update off-diagonal row pointer */ P_offd_i[i + 1] = jj_counter_offd; } P_diag_i[P_nr_of_rows] = jj_counter; hypre_TFree(fine_to_coarse, HYPRE_MEMORY_HOST); return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_MGRBuildPHost * * Interpolation for MGR - Adapted from BoomerAMGBuildInterp *--------------------------------------------------------------------------*/ HYPRE_Int hypre_MGRBuildPHost( hypre_ParCSRMatrix *A, hypre_ParCSRMatrix *A_FF, hypre_ParCSRMatrix *A_FC, HYPRE_Int *CF_marker, HYPRE_BigInt *num_cpts_global, HYPRE_Int method, hypre_ParCSRMatrix **Wp_ptr, hypre_ParCSRMatrix **P_ptr) { MPI_Comm comm = hypre_ParCSRMatrixComm(A); HYPRE_Int num_rows_A = hypre_ParCSRMatrixNumRows(A); HYPRE_Int num_rows_AFF = hypre_ParCSRMatrixNumRows(A_FF); HYPRE_Int num_procs, my_id; HYPRE_Real zero = 0.0; HYPRE_Real one = 1.0; HYPRE_Complex scal = 1.0; hypre_CSRMatrix *A_FF_diag = hypre_ParCSRMatrixDiag(A_FF); hypre_CSRMatrix *A_FC_diag = hypre_ParCSRMatrixDiag(A_FC); hypre_CSRMatrix *A_FF_offd = hypre_ParCSRMatrixOffd(A_FF); hypre_CSRMatrix *A_FC_offd = hypre_ParCSRMatrixOffd(A_FC); hypre_ParVector *D_FF_inv; hypre_ParCSRMatrix *P, *Wp; hypre_CSRMatrix *W_diag = NULL, *W_offd = NULL; hypre_CSRMatrix *P_diag = NULL, *P_offd = NULL; HYPRE_Int P_diag_nnz; HYPRE_Int *P_diag_i = NULL, *P_diag_j = NULL, *P_offd_i = NULL; HYPRE_Complex *P_diag_a = NULL, *diag = NULL, *diag_FF = NULL; HYPRE_Int i; HYPRE_Complex dsum; HYPRE_MemoryLocation memory_location_P = hypre_ParCSRMatrixMemoryLocation(A); hypre_MPI_Comm_size(comm, &num_procs); hypre_MPI_Comm_rank(comm, &my_id); if (method > 0) { diag = hypre_CTAlloc(HYPRE_Complex, num_rows_AFF, memory_location_P); if (method == 1) { // L1-Jacobi-type interpolation diag_FF = hypre_CTAlloc(HYPRE_Complex, num_rows_AFF, memory_location_P); hypre_CSRMatrixExtractDiagonalHost(hypre_ParCSRMatrixDiag(A_FF), diag, 0); hypre_CSRMatrixComputeRowSumHost(A_FF_diag, NULL, NULL, diag_FF, 1, 1.0, "set"); hypre_CSRMatrixComputeRowSumHost(A_FC_diag, NULL, NULL, diag_FF, 1, 1.0, "add"); hypre_CSRMatrixComputeRowSumHost(A_FF_offd, NULL, NULL, diag_FF, 1, 1.0, "add"); hypre_CSRMatrixComputeRowSumHost(A_FC_offd, NULL, NULL, diag_FF, 1, 1.0, "add"); for (i = 0; i < num_rows_AFF; i++) { dsum = diag[i] + scal * (diag_FF[i] - hypre_cabs(diag[i])); diag[i] = (hypre_cabs(dsum) > zero || hypre_cabs(dsum) < zero) ? (one / dsum) : one; } hypre_TFree(diag_FF, memory_location_P); } else if (method == 2) { // extract diag inverse hypre_CSRMatrixExtractDiagonalHost(hypre_ParCSRMatrixDiag(A_FF), diag, 2); } Wp = hypre_ParCSRMatrixClone_v2(A_FC, 1, memory_location_P); D_FF_inv = hypre_ParVectorCreate(hypre_ParCSRMatrixComm(A_FF), hypre_ParCSRMatrixGlobalNumRows(A_FF), hypre_ParCSRMatrixRowStarts(A_FC)); hypre_ParVectorLocalData(D_FF_inv) = diag; hypre_ParVectorInitialize_v2(D_FF_inv, memory_location_P); hypre_ParVectorScale(-1.0, D_FF_inv); hypre_ParCSRMatrixDiagScale(Wp, D_FF_inv, NULL); hypre_ParVectorDestroy(D_FF_inv); } else { Wp = hypre_ParCSRMatrixCreate(hypre_ParCSRMatrixComm(A_FF), hypre_ParCSRMatrixGlobalNumRows(A_FF), hypre_ParCSRMatrixGlobalNumCols(A_FC), hypre_ParCSRMatrixRowStarts(A_FC), hypre_ParCSRMatrixColStarts(A_FC), 0, 0, 0); hypre_ParCSRMatrixInitialize_v2(Wp, memory_location_P); } /* Construct P from matrix product W_diag */ W_diag = hypre_ParCSRMatrixDiag(Wp); W_offd = hypre_ParCSRMatrixOffd(Wp); P_diag_nnz = hypre_CSRMatrixNumNonzeros(W_diag) + hypre_CSRMatrixNumCols(W_diag); P_diag_i = hypre_CTAlloc(HYPRE_Int, num_rows_A + 1, memory_location_P); P_diag_j = hypre_CTAlloc(HYPRE_Int, P_diag_nnz, memory_location_P); P_diag_a = hypre_CTAlloc(HYPRE_Complex, P_diag_nnz, memory_location_P); P_offd_i = hypre_CTAlloc(HYPRE_Int, num_rows_A + 1, memory_location_P); /* Extend W data to P data */ hypre_ExtendWtoPHost(num_rows_A, CF_marker, hypre_CSRMatrixI(W_diag), hypre_CSRMatrixJ(W_diag), hypre_CSRMatrixData(W_diag), P_diag_i, P_diag_j, P_diag_a, hypre_CSRMatrixI(W_offd), P_offd_i); /* finalize P */ P = hypre_ParCSRMatrixCreate(hypre_ParCSRMatrixComm(A), hypre_ParCSRMatrixGlobalNumRows(A), hypre_ParCSRMatrixGlobalNumCols(A_FC), hypre_ParCSRMatrixColStarts(A), num_cpts_global, hypre_CSRMatrixNumCols(W_offd), P_diag_nnz, hypre_CSRMatrixNumNonzeros(W_offd)); P_diag = hypre_ParCSRMatrixDiag(P); P_offd = hypre_ParCSRMatrixOffd(P); hypre_CSRMatrixMemoryLocation(P_diag) = memory_location_P; hypre_CSRMatrixMemoryLocation(P_offd) = memory_location_P; hypre_CSRMatrixI(P_diag) = P_diag_i; hypre_CSRMatrixJ(P_diag) = P_diag_j; hypre_CSRMatrixData(P_diag) = P_diag_a; hypre_CSRMatrixI(P_offd) = P_offd_i; hypre_CSRMatrixJ(P_offd) = hypre_TAlloc(HYPRE_Int, hypre_CSRMatrixNumNonzeros(W_offd), memory_location_P); hypre_CSRMatrixData(P_offd) = hypre_TAlloc(HYPRE_Complex, hypre_CSRMatrixNumNonzeros(W_offd), memory_location_P); hypre_ParCSRMatrixColMapOffd(P) = hypre_TAlloc(HYPRE_BigInt, hypre_CSRMatrixNumCols(W_offd), memory_location_P); hypre_TMemcpy(hypre_CSRMatrixJ(P_offd), hypre_CSRMatrixJ(W_offd), HYPRE_Int, hypre_CSRMatrixNumNonzeros(W_offd), memory_location_P, memory_location_P); hypre_TMemcpy(hypre_CSRMatrixData(P_offd), hypre_CSRMatrixData(W_offd), HYPRE_Complex, hypre_CSRMatrixNumNonzeros(W_offd), memory_location_P, memory_location_P); hypre_TMemcpy(hypre_ParCSRMatrixColMapOffd(P), hypre_ParCSRMatrixColMapOffd(Wp), HYPRE_BigInt, hypre_CSRMatrixNumCols(W_offd), memory_location_P, memory_location_P); hypre_ParCSRMatrixSetNumNonzeros(P); hypre_ParCSRMatrixDNumNonzeros(P) = (HYPRE_Real) hypre_ParCSRMatrixNumNonzeros(P); hypre_MatvecCommPkgCreate(P); /* Set output pointer */ *P_ptr = P; *Wp_ptr = Wp; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_MGRBuildP * * Interpolation for MGR - Adapted from BoomerAMGBuildInterp *--------------------------------------------------------------------------*/ HYPRE_Int hypre_MGRBuildP( hypre_ParCSRMatrix *A, HYPRE_Int *CF_marker, HYPRE_BigInt *num_cpts_global, HYPRE_Int method, HYPRE_Int debug_flag, hypre_ParCSRMatrix **P_ptr) { MPI_Comm comm = hypre_ParCSRMatrixComm(A); hypre_ParCSRCommPkg *comm_pkg = hypre_ParCSRMatrixCommPkg(A); hypre_ParCSRCommHandle *comm_handle; HYPRE_MemoryLocation memory_location_P = hypre_ParCSRMatrixMemoryLocation(A); hypre_CSRMatrix *A_diag = hypre_ParCSRMatrixDiag(A); HYPRE_Real *A_diag_data = hypre_CSRMatrixData(A_diag); HYPRE_Int *A_diag_i = hypre_CSRMatrixI(A_diag); HYPRE_Int *A_diag_j = hypre_CSRMatrixJ(A_diag); hypre_CSRMatrix *A_offd = hypre_ParCSRMatrixOffd(A); HYPRE_Real *A_offd_data = hypre_CSRMatrixData(A_offd); HYPRE_Int *A_offd_i = hypre_CSRMatrixI(A_offd); HYPRE_Int *A_offd_j = hypre_CSRMatrixJ(A_offd); HYPRE_Int num_cols_A_offd = hypre_CSRMatrixNumCols(A_offd); HYPRE_Real *a_diag; hypre_ParCSRMatrix *P; HYPRE_BigInt *col_map_offd_P; HYPRE_Int *tmp_map_offd = NULL; HYPRE_Int *CF_marker_offd = NULL; hypre_CSRMatrix *P_diag; hypre_CSRMatrix *P_offd; HYPRE_Real *P_diag_data; HYPRE_Int *P_diag_i; HYPRE_Int *P_diag_j; HYPRE_Real *P_offd_data; HYPRE_Int *P_offd_i; HYPRE_Int *P_offd_j; HYPRE_Int P_diag_size, P_offd_size; HYPRE_Int *P_marker, *P_marker_offd; HYPRE_Int jj_counter, jj_counter_offd; HYPRE_Int *jj_count, *jj_count_offd; // HYPRE_Int jj_begin_row,jj_begin_row_offd; // HYPRE_Int jj_end_row,jj_end_row_offd; HYPRE_Int start_indexing = 0; /* start indexing for P_data at 0 */ HYPRE_Int n_fine = hypre_CSRMatrixNumRows(A_diag); HYPRE_Int *fine_to_coarse; //HYPRE_BigInt *fine_to_coarse_offd; HYPRE_Int *coarse_counter; HYPRE_Int coarse_shift; HYPRE_BigInt total_global_cpts; //HYPRE_BigInt my_first_cpt; HYPRE_Int num_cols_P_offd; HYPRE_Int i, i1; HYPRE_Int j, jl, jj; HYPRE_Int start; HYPRE_Real one = 1.0; HYPRE_Int my_id; HYPRE_Int num_procs; HYPRE_Int num_threads; HYPRE_Int num_sends; HYPRE_Int index; HYPRE_Int ns, ne, size, rest; HYPRE_Int *int_buf_data; HYPRE_Real wall_time; /* for debugging instrumentation */ hypre_MPI_Comm_size(comm, &num_procs); hypre_MPI_Comm_rank(comm, &my_id); //num_threads = hypre_NumThreads(); // Temporary fix, disable threading // TODO: enable threading num_threads = 1; //my_first_cpt = num_cpts_global[0]; if (my_id == (num_procs - 1)) { total_global_cpts = num_cpts_global[1]; } hypre_MPI_Bcast(&total_global_cpts, 1, HYPRE_MPI_BIG_INT, num_procs - 1, comm); /*------------------------------------------------------------------- * Get the CF_marker data for the off-processor columns *-------------------------------------------------------------------*/ if (debug_flag < 0) { debug_flag = -debug_flag; } if (debug_flag == 4) { wall_time = time_getWallclockSeconds(); } CF_marker_offd = hypre_CTAlloc(HYPRE_Int, num_cols_A_offd, HYPRE_MEMORY_HOST); if (!comm_pkg) { hypre_MatvecCommPkgCreate(A); comm_pkg = hypre_ParCSRMatrixCommPkg(A); } num_sends = hypre_ParCSRCommPkgNumSends(comm_pkg); int_buf_data = hypre_CTAlloc(HYPRE_Int, hypre_ParCSRCommPkgSendMapStart(comm_pkg, num_sends), HYPRE_MEMORY_HOST); index = 0; for (i = 0; i < num_sends; i++) { start = hypre_ParCSRCommPkgSendMapStart(comm_pkg, i); for (j = start; j < hypre_ParCSRCommPkgSendMapStart(comm_pkg, i + 1); j++) { int_buf_data[index++] = CF_marker[hypre_ParCSRCommPkgSendMapElmt(comm_pkg, j)]; } } comm_handle = hypre_ParCSRCommHandleCreate( 11, comm_pkg, int_buf_data, CF_marker_offd); hypre_ParCSRCommHandleDestroy(comm_handle); if (debug_flag == 4) { wall_time = time_getWallclockSeconds() - wall_time; hypre_printf("Proc = %d Interp: Comm 1 CF_marker = %f\n", my_id, wall_time); fflush(NULL); } /*----------------------------------------------------------------------- * First Pass: Determine size of P and fill in fine_to_coarse mapping. *-----------------------------------------------------------------------*/ /*----------------------------------------------------------------------- * Intialize counters and allocate mapping vector. *-----------------------------------------------------------------------*/ coarse_counter = hypre_CTAlloc(HYPRE_Int, num_threads, HYPRE_MEMORY_HOST); jj_count = hypre_CTAlloc(HYPRE_Int, num_threads, HYPRE_MEMORY_HOST); jj_count_offd = hypre_CTAlloc(HYPRE_Int, num_threads, HYPRE_MEMORY_HOST); fine_to_coarse = hypre_CTAlloc(HYPRE_Int, n_fine, HYPRE_MEMORY_HOST); #if 0 #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i) HYPRE_SMP_SCHEDULE #endif #endif for (i = 0; i < n_fine; i++) { fine_to_coarse[i] = -1; } jj_counter = start_indexing; jj_counter_offd = start_indexing; /*----------------------------------------------------------------------- * Loop over fine grid. *-----------------------------------------------------------------------*/ /* RDF: this looks a little tricky, but doable */ #if 0 #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i,j,i1,jj,ns,ne,size,rest) HYPRE_SMP_SCHEDULE #endif #endif for (j = 0; j < num_threads; j++) { size = n_fine / num_threads; rest = n_fine - size * num_threads; if (j < rest) { ns = j * size + j; ne = (j + 1) * size + j + 1; } else { ns = j * size + rest; ne = (j + 1) * size + rest; } for (i = ns; i < ne; i++) { /*-------------------------------------------------------------------- * If i is a C-point, interpolation is the identity. Also set up * mapping vector. *--------------------------------------------------------------------*/ if (CF_marker[i] >= 0) { jj_count[j]++; fine_to_coarse[i] = coarse_counter[j]; coarse_counter[j]++; } /*-------------------------------------------------------------------- * If i is an F-point, interpolation is the approximation of A_{ff}^{-1}A_{fc} *--------------------------------------------------------------------*/ else { for (jj = A_diag_i[i]; jj < A_diag_i[i + 1]; jj++) { i1 = A_diag_j[jj]; if ((CF_marker[i1] >= 0) && (method > 0)) { jj_count[j]++; } } if (num_procs > 1) { for (jj = A_offd_i[i]; jj < A_offd_i[i + 1]; jj++) { i1 = A_offd_j[jj]; if ((CF_marker_offd[i1] >= 0) && (method > 0)) { jj_count_offd[j]++; } } } } } } /*----------------------------------------------------------------------- * Allocate arrays. *-----------------------------------------------------------------------*/ for (i = 0; i < num_threads - 1; i++) { coarse_counter[i + 1] += coarse_counter[i]; jj_count[i + 1] += jj_count[i]; jj_count_offd[i + 1] += jj_count_offd[i]; } i = num_threads - 1; jj_counter = jj_count[i]; jj_counter_offd = jj_count_offd[i]; P_diag_size = jj_counter; P_diag_i = hypre_CTAlloc(HYPRE_Int, n_fine + 1, memory_location_P); P_diag_j = hypre_CTAlloc(HYPRE_Int, P_diag_size, memory_location_P); P_diag_data = hypre_CTAlloc(HYPRE_Real, P_diag_size, memory_location_P); P_diag_i[n_fine] = jj_counter; P_offd_size = jj_counter_offd; P_offd_i = hypre_CTAlloc(HYPRE_Int, n_fine + 1, memory_location_P); P_offd_j = hypre_CTAlloc(HYPRE_Int, P_offd_size, memory_location_P); P_offd_data = hypre_CTAlloc(HYPRE_Real, P_offd_size, memory_location_P); /*----------------------------------------------------------------------- * Intialize some stuff. *-----------------------------------------------------------------------*/ jj_counter = start_indexing; jj_counter_offd = start_indexing; if (debug_flag == 4) { wall_time = time_getWallclockSeconds() - wall_time; hypre_printf("Proc = %d Interp: Internal work 1 = %f\n", my_id, wall_time); fflush(NULL); } /*----------------------------------------------------------------------- * Send and receive fine_to_coarse info. *-----------------------------------------------------------------------*/ if (debug_flag == 4) { wall_time = time_getWallclockSeconds(); } //fine_to_coarse_offd = hypre_CTAlloc(HYPRE_BigInt, num_cols_A_offd, HYPRE_MEMORY_HOST); #if 0 #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i,j,ns,ne,size,rest,coarse_shift) HYPRE_SMP_SCHEDULE #endif #endif for (j = 0; j < num_threads; j++) { coarse_shift = 0; if (j > 0) { coarse_shift = coarse_counter[j - 1]; } size = n_fine / num_threads; rest = n_fine - size * num_threads; if (j < rest) { ns = j * size + j; ne = (j + 1) * size + j + 1; } else { ns = j * size + rest; ne = (j + 1) * size + rest; } for (i = ns; i < ne; i++) { fine_to_coarse[i] += coarse_shift; } } /* index = 0; for (i = 0; i < num_sends; i++) { start = hypre_ParCSRCommPkgSendMapStart(comm_pkg, i); for (j = start; j < hypre_ParCSRCommPkgSendMapStart(comm_pkg, i+1); j++) big_buf_data[index++] = fine_to_coarse[hypre_ParCSRCommPkgSendMapElmt(comm_pkg,j)]+ my_first_cpt; } comm_handle = hypre_ParCSRCommHandleCreate( 21, comm_pkg, big_buf_data, fine_to_coarse_offd); hypre_ParCSRCommHandleDestroy(comm_handle); */ if (debug_flag == 4) { wall_time = time_getWallclockSeconds() - wall_time; hypre_printf("Proc = %d Interp: Comm 4 FineToCoarse = %f\n", my_id, wall_time); fflush(NULL); } if (debug_flag == 4) { wall_time = time_getWallclockSeconds(); } #if 0 #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i) HYPRE_SMP_SCHEDULE #endif #endif //for (i = 0; i < n_fine; i++) fine_to_coarse[i] -= my_first_cpt; /*----------------------------------------------------------------------- * Loop over fine grid points. *-----------------------------------------------------------------------*/ a_diag = hypre_CTAlloc(HYPRE_Real, n_fine, HYPRE_MEMORY_HOST); for (i = 0; i < n_fine; i++) { if (CF_marker[i] < 0) { for (jj = A_diag_i[i]; jj < A_diag_i[i + 1]; jj++) { i1 = A_diag_j[jj]; if ( i == i1 ) /* diagonal of A only */ { a_diag[i] = 1.0 / A_diag_data[jj]; } } } } #if 0 #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i,j,jl,i1,jj,ns,ne,size,rest,P_marker,P_marker_offd,jj_counter,jj_counter_offd,jj_begin_row,jj_end_row,jj_begin_row_offd,jj_end_row_offd) HYPRE_SMP_SCHEDULE #endif #endif for (jl = 0; jl < num_threads; jl++) { size = n_fine / num_threads; rest = n_fine - size * num_threads; if (jl < rest) { ns = jl * size + jl; ne = (jl + 1) * size + jl + 1; } else { ns = jl * size + rest; ne = (jl + 1) * size + rest; } jj_counter = 0; if (jl > 0) { jj_counter = jj_count[jl - 1]; } jj_counter_offd = 0; if (jl > 0) { jj_counter_offd = jj_count_offd[jl - 1]; } P_marker = hypre_CTAlloc(HYPRE_Int, n_fine, HYPRE_MEMORY_HOST); if (num_cols_A_offd) { P_marker_offd = hypre_CTAlloc(HYPRE_Int, num_cols_A_offd, HYPRE_MEMORY_HOST); } else { P_marker_offd = NULL; } for (i = 0; i < n_fine; i++) { P_marker[i] = -1; } for (i = 0; i < num_cols_A_offd; i++) { P_marker_offd[i] = -1; } for (i = ns; i < ne; i++) { /*-------------------------------------------------------------------- * If i is a c-point, interpolation is the identity. *--------------------------------------------------------------------*/ if (CF_marker[i] >= 0) { P_diag_i[i] = jj_counter; P_diag_j[jj_counter] = fine_to_coarse[i]; P_diag_data[jj_counter] = one; jj_counter++; } /*-------------------------------------------------------------------- * If i is an F-point, build interpolation. *--------------------------------------------------------------------*/ else { /* Diagonal part of P */ P_diag_i[i] = jj_counter; for (jj = A_diag_i[i]; jj < A_diag_i[i + 1]; jj++) { i1 = A_diag_j[jj]; /*-------------------------------------------------------------- * If neighbor i1 is a C-point, set column number in P_diag_j * and initialize interpolation weight to zero. *--------------------------------------------------------------*/ if ((CF_marker[i1] >= 0) && (method > 0)) { P_marker[i1] = jj_counter; P_diag_j[jj_counter] = fine_to_coarse[i1]; /* if(method == 0) { P_diag_data[jj_counter] = 0.0; } */ if (method == 1) { P_diag_data[jj_counter] = - A_diag_data[jj]; } else if (method == 2) { P_diag_data[jj_counter] = - A_diag_data[jj] * a_diag[i]; } jj_counter++; } } /* Off-Diagonal part of P */ P_offd_i[i] = jj_counter_offd; if (num_procs > 1) { for (jj = A_offd_i[i]; jj < A_offd_i[i + 1]; jj++) { i1 = A_offd_j[jj]; /*----------------------------------------------------------- * If neighbor i1 is a C-point, set column number in P_offd_j * and initialize interpolation weight to zero. *-----------------------------------------------------------*/ if ((CF_marker_offd[i1] >= 0) && (method > 0)) { P_marker_offd[i1] = jj_counter_offd; /*P_offd_j[jj_counter_offd] = fine_to_coarse_offd[i1];*/ P_offd_j[jj_counter_offd] = i1; /* if(method == 0) { P_offd_data[jj_counter_offd] = 0.0; } */ if (method == 1) { P_offd_data[jj_counter_offd] = - A_offd_data[jj]; } else if (method == 2) { P_offd_data[jj_counter_offd] = - A_offd_data[jj] * a_diag[i]; } jj_counter_offd++; } } } } P_offd_i[i + 1] = jj_counter_offd; } hypre_TFree(P_marker, HYPRE_MEMORY_HOST); hypre_TFree(P_marker_offd, HYPRE_MEMORY_HOST); } hypre_TFree(a_diag, HYPRE_MEMORY_HOST); P = hypre_ParCSRMatrixCreate(comm, hypre_ParCSRMatrixGlobalNumRows(A), total_global_cpts, hypre_ParCSRMatrixColStarts(A), num_cpts_global, 0, P_diag_i[n_fine], P_offd_i[n_fine]); P_diag = hypre_ParCSRMatrixDiag(P); hypre_CSRMatrixData(P_diag) = P_diag_data; hypre_CSRMatrixI(P_diag) = P_diag_i; hypre_CSRMatrixJ(P_diag) = P_diag_j; P_offd = hypre_ParCSRMatrixOffd(P); hypre_CSRMatrixData(P_offd) = P_offd_data; hypre_CSRMatrixI(P_offd) = P_offd_i; hypre_CSRMatrixJ(P_offd) = P_offd_j; num_cols_P_offd = 0; if (P_offd_size) { P_marker = hypre_CTAlloc(HYPRE_Int, num_cols_A_offd, HYPRE_MEMORY_HOST); #if 0 #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i) HYPRE_SMP_SCHEDULE #endif #endif for (i = 0; i < num_cols_A_offd; i++) { P_marker[i] = 0; } num_cols_P_offd = 0; for (i = 0; i < P_offd_size; i++) { index = P_offd_j[i]; if (!P_marker[index]) { num_cols_P_offd++; P_marker[index] = 1; } } col_map_offd_P = hypre_CTAlloc(HYPRE_BigInt, num_cols_P_offd, HYPRE_MEMORY_HOST); tmp_map_offd = hypre_CTAlloc(HYPRE_Int, num_cols_P_offd, HYPRE_MEMORY_HOST); index = 0; for (i = 0; i < num_cols_P_offd; i++) { while (P_marker[index] == 0) { index++; } tmp_map_offd[i] = index++; } #if 0 #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i) HYPRE_SMP_SCHEDULE #endif #endif for (i = 0; i < P_offd_size; i++) P_offd_j[i] = hypre_BinarySearch(tmp_map_offd, P_offd_j[i], num_cols_P_offd); hypre_TFree(P_marker, HYPRE_MEMORY_HOST); } for (i = 0; i < n_fine; i++) if (CF_marker[i] == -3) { CF_marker[i] = -1; } if (num_cols_P_offd) { hypre_ParCSRMatrixColMapOffd(P) = col_map_offd_P; hypre_CSRMatrixNumCols(P_offd) = num_cols_P_offd; } hypre_GetCommPkgRTFromCommPkgA(P, A, fine_to_coarse, tmp_map_offd); *P_ptr = P; hypre_TFree(tmp_map_offd, HYPRE_MEMORY_HOST); hypre_TFree(CF_marker_offd, HYPRE_MEMORY_HOST); hypre_TFree(int_buf_data, HYPRE_MEMORY_HOST); hypre_TFree(fine_to_coarse, HYPRE_MEMORY_HOST); // hypre_TFree(fine_to_coarse_offd, HYPRE_MEMORY_HOST); hypre_TFree(coarse_counter, HYPRE_MEMORY_HOST); hypre_TFree(jj_count, HYPRE_MEMORY_HOST); hypre_TFree(jj_count_offd, HYPRE_MEMORY_HOST); return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_MGRBuildPDRS * * Interpolation for MGR - Dynamic Row Sum method *--------------------------------------------------------------------------*/ HYPRE_Int hypre_MGRBuildPDRS( hypre_ParCSRMatrix *A, HYPRE_Int *CF_marker, HYPRE_BigInt *num_cpts_global, HYPRE_Int debug_flag, hypre_ParCSRMatrix **P_ptr) { MPI_Comm comm = hypre_ParCSRMatrixComm(A); hypre_ParCSRCommPkg *comm_pkg = hypre_ParCSRMatrixCommPkg(A); hypre_ParCSRCommHandle *comm_handle; hypre_CSRMatrix *A_diag = hypre_ParCSRMatrixDiag(A); HYPRE_Real *A_diag_data = hypre_CSRMatrixData(A_diag); HYPRE_Int *A_diag_i = hypre_CSRMatrixI(A_diag); HYPRE_Int *A_diag_j = hypre_CSRMatrixJ(A_diag); hypre_CSRMatrix *A_offd = hypre_ParCSRMatrixOffd(A); HYPRE_Real *A_offd_data = hypre_CSRMatrixData(A_offd); HYPRE_Int *A_offd_i = hypre_CSRMatrixI(A_offd); HYPRE_Int *A_offd_j = hypre_CSRMatrixJ(A_offd); HYPRE_Int num_cols_A_offd = hypre_CSRMatrixNumCols(A_offd); HYPRE_Real *a_diag; hypre_ParCSRMatrix *P; HYPRE_BigInt *col_map_offd_P; HYPRE_Int *tmp_map_offd = NULL; HYPRE_Int *CF_marker_offd = NULL; hypre_CSRMatrix *P_diag; hypre_CSRMatrix *P_offd; HYPRE_Real *P_diag_data; HYPRE_Int *P_diag_i, *P_diag_j; HYPRE_Real *P_offd_data; HYPRE_Int *P_offd_i, *P_offd_j; HYPRE_Int P_diag_size, P_offd_size; HYPRE_Int *P_marker, *P_marker_offd; HYPRE_Int jj_counter, jj_counter_offd; HYPRE_Int *jj_count, *jj_count_offd; HYPRE_Int start_indexing = 0; /* start indexing for P_data at 0 */ HYPRE_Int n_fine = hypre_CSRMatrixNumRows(A_diag); HYPRE_Int *fine_to_coarse; HYPRE_Int *coarse_counter; HYPRE_Int coarse_shift; HYPRE_BigInt total_global_cpts; HYPRE_Int num_cols_P_offd; HYPRE_Int i, i1; HYPRE_Int j, jl, jj; HYPRE_Int start; HYPRE_Real one = 1.0; HYPRE_Int my_id, num_procs; HYPRE_Int num_threads; HYPRE_Int num_sends; HYPRE_Int index; HYPRE_Int ns, ne, size, rest; HYPRE_Int *int_buf_data; HYPRE_Real wall_time; /* for debugging instrumentation */ hypre_MPI_Comm_size(comm, &num_procs); hypre_MPI_Comm_rank(comm, &my_id); //num_threads = hypre_NumThreads(); // Temporary fix, disable threading // TODO: enable threading num_threads = 1; //my_first_cpt = num_cpts_global[0]; if (my_id == (num_procs - 1)) { total_global_cpts = num_cpts_global[1]; } hypre_MPI_Bcast(&total_global_cpts, 1, HYPRE_MPI_BIG_INT, num_procs - 1, comm); /*------------------------------------------------------------------- * Get the CF_marker data for the off-processor columns *-------------------------------------------------------------------*/ if (debug_flag < 0) { debug_flag = -debug_flag; } if (debug_flag == 4) { wall_time = time_getWallclockSeconds(); } CF_marker_offd = hypre_CTAlloc(HYPRE_Int, num_cols_A_offd, HYPRE_MEMORY_HOST); if (!comm_pkg) { hypre_MatvecCommPkgCreate(A); comm_pkg = hypre_ParCSRMatrixCommPkg(A); } num_sends = hypre_ParCSRCommPkgNumSends(comm_pkg); int_buf_data = hypre_CTAlloc(HYPRE_Int, hypre_ParCSRCommPkgSendMapStart(comm_pkg, num_sends), HYPRE_MEMORY_HOST); index = 0; for (i = 0; i < num_sends; i++) { start = hypre_ParCSRCommPkgSendMapStart(comm_pkg, i); for (j = start; j < hypre_ParCSRCommPkgSendMapStart(comm_pkg, i + 1); j++) { int_buf_data[index++] = CF_marker[hypre_ParCSRCommPkgSendMapElmt(comm_pkg, j)]; } } comm_handle = hypre_ParCSRCommHandleCreate(11, comm_pkg, int_buf_data, CF_marker_offd); hypre_ParCSRCommHandleDestroy(comm_handle); if (debug_flag == 4) { wall_time = time_getWallclockSeconds() - wall_time; hypre_printf("Proc = %d Interp: Comm 1 CF_marker = %f\n", my_id, wall_time); fflush(NULL); } /*----------------------------------------------------------------------- * First Pass: Determine size of P and fill in fine_to_coarse mapping. *-----------------------------------------------------------------------*/ /*----------------------------------------------------------------------- * Intialize counters and allocate mapping vector. *-----------------------------------------------------------------------*/ coarse_counter = hypre_CTAlloc(HYPRE_Int, num_threads, HYPRE_MEMORY_HOST); jj_count = hypre_CTAlloc(HYPRE_Int, num_threads, HYPRE_MEMORY_HOST); jj_count_offd = hypre_CTAlloc(HYPRE_Int, num_threads, HYPRE_MEMORY_HOST); fine_to_coarse = hypre_CTAlloc(HYPRE_Int, n_fine, HYPRE_MEMORY_HOST); #if 0 #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i) HYPRE_SMP_SCHEDULE #endif #endif for (i = 0; i < n_fine; i++) { fine_to_coarse[i] = -1; } jj_counter = start_indexing; jj_counter_offd = start_indexing; /*----------------------------------------------------------------------- * Loop over fine grid. *-----------------------------------------------------------------------*/ /* RDF: this looks a little tricky, but doable */ #if 0 #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i,j,i1,jj,ns,ne,size,rest) HYPRE_SMP_SCHEDULE #endif #endif for (j = 0; j < num_threads; j++) { size = n_fine / num_threads; rest = n_fine - size * num_threads; if (j < rest) { ns = j * size + j; ne = (j + 1) * size + j + 1; } else { ns = j * size + rest; ne = (j + 1) * size + rest; } for (i = ns; i < ne; i++) { /*-------------------------------------------------------------------- * If i is a C-point, interpolation is the identity. Also set up * mapping vector. *--------------------------------------------------------------------*/ if (CF_marker[i] >= 0) { jj_count[j]++; fine_to_coarse[i] = coarse_counter[j]; coarse_counter[j]++; } /*-------------------------------------------------------------------- * If i is an F-point, interpolation is the approximation of A_{ff}^{-1}A_{fc} *--------------------------------------------------------------------*/ else { for (jj = A_diag_i[i]; jj < A_diag_i[i + 1]; jj++) { i1 = A_diag_j[jj]; if (CF_marker[i1] >= 0) { jj_count[j]++; } } if (num_procs > 1) { for (jj = A_offd_i[i]; jj < A_offd_i[i + 1]; jj++) { i1 = A_offd_j[jj]; if (CF_marker_offd[i1] >= 0) { jj_count_offd[j]++; } } } } /*-------------------------------------------------------------------- * Set up the indexes for the DRS method *--------------------------------------------------------------------*/ } } /*----------------------------------------------------------------------- * Allocate arrays. *-----------------------------------------------------------------------*/ for (i = 0; i < num_threads - 1; i++) { coarse_counter[i + 1] += coarse_counter[i]; jj_count[i + 1] += jj_count[i]; jj_count_offd[i + 1] += jj_count_offd[i]; } i = num_threads - 1; jj_counter = jj_count[i]; jj_counter_offd = jj_count_offd[i]; P_diag_size = jj_counter; P_diag_i = hypre_CTAlloc(HYPRE_Int, n_fine + 1, HYPRE_MEMORY_HOST); P_diag_j = hypre_CTAlloc(HYPRE_Int, P_diag_size, HYPRE_MEMORY_HOST); P_diag_data = hypre_CTAlloc(HYPRE_Real, P_diag_size, HYPRE_MEMORY_HOST); P_diag_i[n_fine] = jj_counter; P_offd_size = jj_counter_offd; P_offd_i = hypre_CTAlloc(HYPRE_Int, n_fine + 1, HYPRE_MEMORY_HOST); P_offd_j = hypre_CTAlloc(HYPRE_Int, P_offd_size, HYPRE_MEMORY_HOST); P_offd_data = hypre_CTAlloc(HYPRE_Real, P_offd_size, HYPRE_MEMORY_HOST); /*----------------------------------------------------------------------- * Intialize some stuff. *-----------------------------------------------------------------------*/ jj_counter = start_indexing; jj_counter_offd = start_indexing; if (debug_flag == 4) { wall_time = time_getWallclockSeconds() - wall_time; hypre_printf("Proc = %d Interp: Internal work 1 = %f\n", my_id, wall_time); fflush(NULL); } /*----------------------------------------------------------------------- * Send and receive fine_to_coarse info. *-----------------------------------------------------------------------*/ if (debug_flag == 4) { wall_time = time_getWallclockSeconds(); } #if 0 #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i,j,ns,ne,size,rest,coarse_shift) HYPRE_SMP_SCHEDULE #endif #endif for (j = 0; j < num_threads; j++) { coarse_shift = 0; if (j > 0) { coarse_shift = coarse_counter[j - 1]; } size = n_fine / num_threads; rest = n_fine - size * num_threads; if (j < rest) { ns = j * size + j; ne = (j + 1) * size + j + 1; } else { ns = j * size + rest; ne = (j + 1) * size + rest; } for (i = ns; i < ne; i++) { fine_to_coarse[i] += coarse_shift; } } /*index = 0; for (i = 0; i < num_sends; i++) { start = hypre_ParCSRCommPkgSendMapStart(comm_pkg, i); for (j = start; j < hypre_ParCSRCommPkgSendMapStart(comm_pkg, i+1); j++) int_buf_data[index++] = fine_to_coarse[hypre_ParCSRCommPkgSendMapElmt(comm_pkg,j)]; } comm_handle = hypre_ParCSRCommHandleCreate( 11, comm_pkg, int_buf_data, fine_to_coarse_offd); hypre_ParCSRCommHandleDestroy(comm_handle); */ if (debug_flag == 4) { wall_time = time_getWallclockSeconds() - wall_time; hypre_printf("Proc = %d Interp: Comm 4 FineToCoarse = %f\n", my_id, wall_time); fflush(NULL); } if (debug_flag == 4) { wall_time = time_getWallclockSeconds(); } #if 0 #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i) HYPRE_SMP_SCHEDULE #endif #endif //for (i = 0; i < n_fine; i++) fine_to_coarse[i] -= my_first_cpt; /*----------------------------------------------------------------------- * Loop over fine grid points. *-----------------------------------------------------------------------*/ a_diag = hypre_CTAlloc(HYPRE_Real, n_fine, HYPRE_MEMORY_HOST); for (i = 0; i < n_fine; i++) { for (jj = A_diag_i[i]; jj < A_diag_i[i + 1]; jj++) { i1 = A_diag_j[jj]; if ( i == i1 ) /* diagonal of A only */ { a_diag[i] = 1.0 / A_diag_data[jj]; } } } #if 0 #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i,j,jl,i1,jj,ns,ne,size,rest,P_marker,P_marker_offd,jj_counter,jj_counter_offd,jj_begin_row,jj_end_row,jj_begin_row_offd,jj_end_row_offd) HYPRE_SMP_SCHEDULE #endif #endif for (jl = 0; jl < num_threads; jl++) { size = n_fine / num_threads; rest = n_fine - size * num_threads; if (jl < rest) { ns = jl * size + jl; ne = (jl + 1) * size + jl + 1; } else { ns = jl * size + rest; ne = (jl + 1) * size + rest; } jj_counter = 0; if (jl > 0) { jj_counter = jj_count[jl - 1]; } jj_counter_offd = 0; if (jl > 0) { jj_counter_offd = jj_count_offd[jl - 1]; } P_marker = hypre_CTAlloc(HYPRE_Int, n_fine, HYPRE_MEMORY_HOST); if (num_cols_A_offd) { P_marker_offd = hypre_CTAlloc(HYPRE_Int, num_cols_A_offd, HYPRE_MEMORY_HOST); } else { P_marker_offd = NULL; } for (i = 0; i < n_fine; i++) { P_marker[i] = -1; } for (i = 0; i < num_cols_A_offd; i++) { P_marker_offd[i] = -1; } for (i = ns; i < ne; i++) { /*-------------------------------------------------------------------- * If i is a c-point, interpolation is the identity. *--------------------------------------------------------------------*/ if (CF_marker[i] >= 0) { P_diag_i[i] = jj_counter; P_diag_j[jj_counter] = fine_to_coarse[i]; P_diag_data[jj_counter] = one; jj_counter++; } /*-------------------------------------------------------------------- * If i is an F-point, build interpolation. *--------------------------------------------------------------------*/ else { /* Diagonal part of P */ P_diag_i[i] = jj_counter; for (jj = A_diag_i[i]; jj < A_diag_i[i + 1]; jj++) { i1 = A_diag_j[jj]; /*-------------------------------------------------------------- * If neighbor i1 is a C-point, set column number in P_diag_j * and initialize interpolation weight to zero. *--------------------------------------------------------------*/ if (CF_marker[i1] >= 0) { P_marker[i1] = jj_counter; P_diag_j[jj_counter] = fine_to_coarse[i1]; P_diag_data[jj_counter] = - A_diag_data[jj] * a_diag[i]; jj_counter++; } } /* Off-Diagonal part of P */ P_offd_i[i] = jj_counter_offd; if (num_procs > 1) { for (jj = A_offd_i[i]; jj < A_offd_i[i + 1]; jj++) { i1 = A_offd_j[jj]; /*----------------------------------------------------------- * If neighbor i1 is a C-point, set column number in P_offd_j * and initialize interpolation weight to zero. *-----------------------------------------------------------*/ if (CF_marker_offd[i1] >= 0) { P_marker_offd[i1] = jj_counter_offd; P_offd_j[jj_counter_offd] = i1; P_offd_data[jj_counter_offd] = - A_offd_data[jj] * a_diag[i]; jj_counter_offd++; } } } } P_offd_i[i + 1] = jj_counter_offd; } hypre_TFree(P_marker, HYPRE_MEMORY_HOST); hypre_TFree(P_marker_offd, HYPRE_MEMORY_HOST); } hypre_TFree(a_diag, HYPRE_MEMORY_HOST); P = hypre_ParCSRMatrixCreate(comm, hypre_ParCSRMatrixGlobalNumRows(A), total_global_cpts, hypre_ParCSRMatrixColStarts(A), num_cpts_global, 0, P_diag_i[n_fine], P_offd_i[n_fine]); P_diag = hypre_ParCSRMatrixDiag(P); hypre_CSRMatrixData(P_diag) = P_diag_data; hypre_CSRMatrixI(P_diag) = P_diag_i; hypre_CSRMatrixJ(P_diag) = P_diag_j; P_offd = hypre_ParCSRMatrixOffd(P); hypre_CSRMatrixData(P_offd) = P_offd_data; hypre_CSRMatrixI(P_offd) = P_offd_i; hypre_CSRMatrixJ(P_offd) = P_offd_j; num_cols_P_offd = 0; if (P_offd_size) { P_marker = hypre_CTAlloc(HYPRE_Int, num_cols_A_offd, HYPRE_MEMORY_HOST); #if 0 #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i) HYPRE_SMP_SCHEDULE #endif #endif for (i = 0; i < num_cols_A_offd; i++) { P_marker[i] = 0; } num_cols_P_offd = 0; for (i = 0; i < P_offd_size; i++) { index = P_offd_j[i]; if (!P_marker[index]) { num_cols_P_offd++; P_marker[index] = 1; } } tmp_map_offd = hypre_CTAlloc(HYPRE_Int, num_cols_P_offd, HYPRE_MEMORY_HOST); col_map_offd_P = hypre_CTAlloc(HYPRE_BigInt, num_cols_P_offd, HYPRE_MEMORY_HOST); index = 0; for (i = 0; i < num_cols_P_offd; i++) { while (P_marker[index] == 0) { index++; } tmp_map_offd[i] = index++; } #if 0 #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i) HYPRE_SMP_SCHEDULE #endif #endif for (i = 0; i < P_offd_size; i++) { P_offd_j[i] = hypre_BinarySearch(tmp_map_offd, P_offd_j[i], num_cols_P_offd); } hypre_TFree(P_marker, HYPRE_MEMORY_HOST); } for (i = 0; i < n_fine; i++) { if (CF_marker[i] == -3) { CF_marker[i] = -1; } } if (num_cols_P_offd) { hypre_ParCSRMatrixColMapOffd(P) = col_map_offd_P; hypre_CSRMatrixNumCols(P_offd) = num_cols_P_offd; } hypre_GetCommPkgRTFromCommPkgA(P, A, fine_to_coarse, tmp_map_offd); *P_ptr = P; hypre_TFree(tmp_map_offd, HYPRE_MEMORY_HOST); hypre_TFree(CF_marker_offd, HYPRE_MEMORY_HOST); hypre_TFree(int_buf_data, HYPRE_MEMORY_HOST); hypre_TFree(fine_to_coarse, HYPRE_MEMORY_HOST); hypre_TFree(coarse_counter, HYPRE_MEMORY_HOST); hypre_TFree(jj_count, HYPRE_MEMORY_HOST); hypre_TFree(jj_count_offd, HYPRE_MEMORY_HOST); return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_MGRBuildInterpApproximateInverse *--------------------------------------------------------------------------*/ HYPRE_Int hypre_MGRBuildInterpApproximateInverse(hypre_ParCSRMatrix *A, HYPRE_Int *CF_marker, HYPRE_BigInt *num_cpts_global, hypre_ParCSRMatrix **P_ptr) { HYPRE_Int *C_marker; HYPRE_Int *F_marker; hypre_ParCSRMatrix *A_ff; hypre_ParCSRMatrix *A_fc; hypre_ParCSRMatrix *A_ff_inv; hypre_ParCSRMatrix *W; MPI_Comm comm = hypre_ParCSRMatrixComm(A); hypre_ParCSRMatrix *P; HYPRE_BigInt *col_map_offd_P = NULL; HYPRE_Real *P_diag_data; HYPRE_Int *P_diag_i; HYPRE_Int *P_diag_j; HYPRE_Int *P_offd_i; HYPRE_Int P_diag_nnz; HYPRE_Int n_fine = hypre_CSRMatrixNumRows(hypre_ParCSRMatrixDiag(A)); HYPRE_BigInt total_global_cpts; HYPRE_Int num_cols_P_offd; HYPRE_Int i; HYPRE_Real m_one = -1.0; HYPRE_Int my_id; HYPRE_Int num_procs; HYPRE_MemoryLocation memory_location_P = hypre_ParCSRMatrixMemoryLocation(A); C_marker = hypre_CTAlloc(HYPRE_Int, n_fine, HYPRE_MEMORY_HOST); F_marker = hypre_CTAlloc(HYPRE_Int, n_fine, HYPRE_MEMORY_HOST); // create C and F markers for (i = 0; i < n_fine; i++) { C_marker[i] = (CF_marker[i] == 1) ? 1 : -1; F_marker[i] = (CF_marker[i] == 1) ? -1 : 1; } // Get A_FF hypre_MGRGetSubBlock(A, F_marker, F_marker, 0, &A_ff); // hypre_ParCSRMatrixPrintIJ(A_ff, 1, 1, "A_ff"); // Get A_FC hypre_MGRGetSubBlock(A, F_marker, C_marker, 0, &A_fc); hypre_MGRApproximateInverse(A_ff, &A_ff_inv); // hypre_ParCSRMatrixPrintIJ(A_ff_inv, 1, 1, "A_ff_inv"); // hypre_ParCSRMatrixPrintIJ(A_fc, 1, 1, "A_fc"); W = hypre_ParMatmul(A_ff_inv, A_fc); hypre_ParCSRMatrixScale(W, m_one); // hypre_ParCSRMatrixPrintIJ(W, 1, 1, "Wp"); hypre_CSRMatrix *W_diag = hypre_ParCSRMatrixDiag(W); hypre_CSRMatrix *W_offd = hypre_ParCSRMatrixOffd(W); hypre_MPI_Comm_size(comm, &num_procs); hypre_MPI_Comm_rank(comm, &my_id); if (my_id == (num_procs - 1)) { total_global_cpts = num_cpts_global[1]; } hypre_MPI_Bcast(&total_global_cpts, 1, HYPRE_MPI_BIG_INT, num_procs - 1, comm); /*----------------------------------------------------------------------- * Allocate arrays. *-----------------------------------------------------------------------*/ P_diag_nnz = hypre_CSRMatrixNumNonzeros(W_diag) + hypre_CSRMatrixNumCols(W_diag); P_diag_i = hypre_CTAlloc(HYPRE_Int, n_fine + 1, memory_location_P); P_diag_j = hypre_CTAlloc(HYPRE_Int, P_diag_nnz, memory_location_P); P_diag_data = hypre_CTAlloc(HYPRE_Real, P_diag_nnz, memory_location_P); P_offd_i = hypre_CTAlloc(HYPRE_Int, n_fine + 1, memory_location_P); /* Extend W data to P data */ hypre_ExtendWtoPHost( n_fine, CF_marker, hypre_CSRMatrixI(W_diag), hypre_CSRMatrixJ(W_diag), hypre_CSRMatrixData(W_diag), P_diag_i, P_diag_j, P_diag_data, hypre_CSRMatrixI(W_offd), P_offd_i ); // final P P = hypre_ParCSRMatrixCreate(comm, hypre_ParCSRMatrixGlobalNumRows(A), total_global_cpts, hypre_ParCSRMatrixColStarts(A), num_cpts_global, hypre_CSRMatrixNumCols(W_offd), P_diag_nnz, hypre_CSRMatrixNumNonzeros(W_offd) ); hypre_CSRMatrixMemoryLocation(hypre_ParCSRMatrixDiag(P)) = memory_location_P; hypre_CSRMatrixMemoryLocation(hypre_ParCSRMatrixOffd(P)) = memory_location_P; hypre_CSRMatrixI(hypre_ParCSRMatrixDiag(P)) = P_diag_i; hypre_CSRMatrixJ(hypre_ParCSRMatrixDiag(P)) = P_diag_j; hypre_CSRMatrixData(hypre_ParCSRMatrixDiag(P)) = P_diag_data; hypre_CSRMatrixI(hypre_ParCSRMatrixOffd(P)) = P_offd_i; hypre_CSRMatrixJ(hypre_ParCSRMatrixOffd(P)) = hypre_CSRMatrixJ(W_offd); hypre_CSRMatrixData(hypre_ParCSRMatrixOffd(P)) = hypre_CSRMatrixData(W_offd); hypre_CSRMatrixJ(W_offd) = NULL; hypre_CSRMatrixData(W_offd) = NULL; num_cols_P_offd = hypre_CSRMatrixNumCols(W_offd); HYPRE_BigInt *col_map_offd_tmp = hypre_ParCSRMatrixColMapOffd(W); if (hypre_CSRMatrixNumNonzeros(hypre_ParCSRMatrixOffd(P))) { col_map_offd_P = hypre_CTAlloc(HYPRE_BigInt, num_cols_P_offd, HYPRE_MEMORY_HOST); for (i = 0; i < num_cols_P_offd; i++) { col_map_offd_P[i] = col_map_offd_tmp[i]; } } if (num_cols_P_offd) { hypre_ParCSRMatrixColMapOffd(P) = col_map_offd_P; hypre_CSRMatrixNumCols(hypre_ParCSRMatrixOffd(P)) = num_cols_P_offd; } hypre_MatvecCommPkgCreate(P); *P_ptr = P; hypre_TFree(C_marker, HYPRE_MEMORY_HOST); hypre_TFree(F_marker, HYPRE_MEMORY_HOST); hypre_ParCSRMatrixDestroy(A_ff); hypre_ParCSRMatrixDestroy(A_fc); hypre_ParCSRMatrixDestroy(A_ff_inv); hypre_ParCSRMatrixDestroy(W); return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_MGRTruncateAcfCPRDevice * * TODO (VPM): Port truncation to GPUs *--------------------------------------------------------------------------*/ HYPRE_Int hypre_MGRTruncateAcfCPRDevice(hypre_ParCSRMatrix *A_CF, hypre_ParCSRMatrix **A_CF_new_ptr) { hypre_ParCSRMatrix *hA_CF; hypre_ParCSRMatrix *A_CF_new; hypre_GpuProfilingPushRange("MGRTruncateAcfCPR"); /* Clone matrix to host, truncate, and migrate result to device */ hA_CF = hypre_ParCSRMatrixClone_v2(A_CF, 1, HYPRE_MEMORY_HOST); hypre_MGRTruncateAcfCPR(hA_CF, &A_CF_new); hypre_ParCSRMatrixMigrate(A_CF_new, HYPRE_MEMORY_DEVICE); hypre_ParCSRMatrixDestroy(hA_CF); /* Set output pointer */ *A_CF_new_ptr = A_CF_new; hypre_GpuProfilingPopRange(); return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_MGRTruncateAcfCPR *--------------------------------------------------------------------------*/ HYPRE_Int hypre_MGRTruncateAcfCPR(hypre_ParCSRMatrix *A_CF, hypre_ParCSRMatrix **A_CF_new_ptr) { /* Input matrix info */ MPI_Comm comm = hypre_ParCSRMatrixComm(A_CF); HYPRE_BigInt num_rows = hypre_ParCSRMatrixGlobalNumRows(A_CF); HYPRE_BigInt num_cols = hypre_ParCSRMatrixGlobalNumCols(A_CF); hypre_CSRMatrix *A_CF_diag = hypre_ParCSRMatrixDiag(A_CF); HYPRE_Int *A_CF_diag_i = hypre_CSRMatrixI(A_CF_diag); HYPRE_Int *A_CF_diag_j = hypre_CSRMatrixJ(A_CF_diag); HYPRE_Complex *A_CF_diag_data = hypre_CSRMatrixData(A_CF_diag); HYPRE_Int num_rows_local = hypre_CSRMatrixNumRows(A_CF_diag); /* Output matrix info */ hypre_ParCSRMatrix *A_CF_new; hypre_CSRMatrix *A_CF_diag_new; HYPRE_Int *A_CF_diag_i_new; HYPRE_Int *A_CF_diag_j_new; HYPRE_Complex *A_CF_diag_data_new; HYPRE_Int nnz_diag_new; /* Local variables */ HYPRE_Int i, j, jj; HYPRE_Int jj_counter; HYPRE_Int blk_size = num_cols / num_rows; HYPRE_ANNOTATE_FUNC_BEGIN; /* First pass: count the nnz of truncated (new) A_CF */ jj_counter = 0; for (i = 0; i < num_rows_local; i++) { for (j = A_CF_diag_i[i]; j < A_CF_diag_i[i + 1]; j++) { jj = A_CF_diag_j[j]; if (jj >= i * blk_size && jj < (i + 1) * blk_size) { jj_counter++; } } } nnz_diag_new = jj_counter; /* Create truncated matrix */ A_CF_new = hypre_ParCSRMatrixCreate(comm, num_rows, num_cols, hypre_ParCSRMatrixRowStarts(A_CF), hypre_ParCSRMatrixColStarts(A_CF), 0, nnz_diag_new, 0); hypre_ParCSRMatrixInitialize_v2(A_CF_new, HYPRE_MEMORY_HOST); A_CF_diag_new = hypre_ParCSRMatrixDiag(A_CF_new); A_CF_diag_i_new = hypre_CSRMatrixI(A_CF_diag_new); A_CF_diag_j_new = hypre_CSRMatrixJ(A_CF_diag_new); A_CF_diag_data_new = hypre_CSRMatrixData(A_CF_diag_new); /* Second pass: fill entries of the truncated (new) A_CF */ jj_counter = 0; for (i = 0; i < num_rows_local; i++) { A_CF_diag_i_new[i] = jj_counter; for (j = A_CF_diag_i[i]; j < A_CF_diag_i[i + 1]; j++) { jj = A_CF_diag_j[j]; if (jj >= i * blk_size && jj < (i + 1) * blk_size) { A_CF_diag_j_new[jj_counter] = jj; A_CF_diag_data_new[jj_counter] = A_CF_diag_data[j]; jj_counter++; } } } A_CF_diag_i_new[num_rows_local] = nnz_diag_new; /* Set output pointer */ *A_CF_new_ptr = A_CF_new; HYPRE_ANNOTATE_FUNC_END; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_MGRBuildRFromWrHost * * Constructs a classical restriction operator as R = [Wr I]. *--------------------------------------------------------------------------*/ HYPRE_Int hypre_MGRBuildRFromWrHost(hypre_IntArray *C_map, hypre_IntArray *F_map, hypre_ParCSRMatrix *Wr, hypre_ParCSRMatrix *R) { /* Input matrix variables */ hypre_CSRMatrix *Wr_diag = hypre_ParCSRMatrixDiag(Wr); HYPRE_Int *Wr_diag_i = hypre_CSRMatrixI(Wr_diag); HYPRE_Int *Wr_diag_j = hypre_CSRMatrixJ(Wr_diag); HYPRE_Complex *Wr_diag_a = hypre_CSRMatrixData(Wr_diag); HYPRE_Int Wr_diag_num_rows = hypre_CSRMatrixNumRows(Wr_diag); HYPRE_Int *C_map_data = hypre_IntArrayData(C_map); HYPRE_Int *F_map_data = hypre_IntArrayData(F_map); /* Output matrix */ hypre_CSRMatrix *R_diag = hypre_ParCSRMatrixDiag(R); HYPRE_Int *R_diag_i = hypre_CSRMatrixI(R_diag); HYPRE_Int *R_diag_j = hypre_CSRMatrixJ(R_diag); HYPRE_Complex *R_diag_a = hypre_CSRMatrixData(R_diag); /* Local variables */ HYPRE_Int i, j, nnz_diag; HYPRE_Real one = 1.0; R_diag_i[0] = nnz_diag = 0; for (i = 0; i < Wr_diag_num_rows; i++) { /* Set CC connection */ R_diag_j[nnz_diag] = C_map_data[i]; R_diag_a[nnz_diag] = one; nnz_diag++; /* Set CF connections */ for (j = Wr_diag_i[i]; j < Wr_diag_i[i + 1]; j++) { R_diag_j[nnz_diag] = F_map_data[Wr_diag_j[j]]; R_diag_a[nnz_diag] = Wr_diag_a[j]; nnz_diag++; } /* Update row pointer */ R_diag_i[i + 1] = nnz_diag; } return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_MGRBuildRFromWr * * Constructs a classical restriction operator as R = [Wr I]. *--------------------------------------------------------------------------*/ HYPRE_Int hypre_MGRBuildRFromWr(hypre_IntArray *C_map, hypre_IntArray *F_map, HYPRE_BigInt global_num_rows_R, HYPRE_BigInt global_num_cols_R, HYPRE_BigInt *row_starts_R, HYPRE_BigInt *col_starts_R, hypre_ParCSRMatrix *Wr, hypre_ParCSRMatrix **R_ptr) { /* Input matrix variables */ MPI_Comm comm = hypre_ParCSRMatrixComm(Wr); HYPRE_MemoryLocation memory_location_Wr = hypre_ParCSRMatrixMemoryLocation(Wr); hypre_CSRMatrix *Wr_diag = hypre_ParCSRMatrixDiag(Wr); HYPRE_Int Wr_diag_num_rows = hypre_CSRMatrixNumRows(Wr_diag); HYPRE_Int Wr_diag_nnz = hypre_CSRMatrixNumNonzeros(Wr_diag); hypre_CSRMatrix *Wr_offd = hypre_ParCSRMatrixOffd(Wr); HYPRE_Int Wr_offd_num_cols = hypre_CSRMatrixNumCols(Wr_offd); HYPRE_Int Wr_offd_nnz = hypre_CSRMatrixNumNonzeros(Wr_offd); /* Output matrix */ hypre_ParCSRMatrix *R; HYPRE_Int num_nonzeros_diag = Wr_diag_nnz + Wr_diag_num_rows; HYPRE_Int num_nonzeros_offd = Wr_offd_nnz; /* Sanity checks */ if (Wr_offd_nnz > 0 || Wr_offd_num_cols > 0) { *R_ptr = NULL; hypre_error_w_msg(HYPRE_ERROR_GENERIC, "Not implemented for matrices with nonzero offd"); return hypre_error_flag; } HYPRE_ANNOTATE_FUNC_BEGIN; /*----------------------------------------------------------------------- * Create and initialize output matrix *-----------------------------------------------------------------------*/ R = hypre_ParCSRMatrixCreate(comm, global_num_rows_R, global_num_cols_R, row_starts_R, col_starts_R, Wr_offd_num_cols, num_nonzeros_diag, num_nonzeros_offd); hypre_ParCSRMatrixInitialize_v2(R, memory_location_Wr); /*----------------------------------------------------------------------- * Fill matrix entries *-----------------------------------------------------------------------*/ #if defined (HYPRE_USING_GPU) HYPRE_ExecutionPolicy exec = hypre_GetExecPolicy1(memory_location_Wr); if (exec == HYPRE_EXEC_DEVICE) { /* TODO (VPM): Implement hypre_MGRBuildRFromWrDevice */ hypre_ParCSRMatrixMigrate(Wr, HYPRE_MEMORY_HOST); hypre_ParCSRMatrixMigrate(R, HYPRE_MEMORY_HOST); hypre_IntArrayMigrate(C_map, HYPRE_MEMORY_HOST); hypre_IntArrayMigrate(F_map, HYPRE_MEMORY_HOST); hypre_MGRBuildRFromWrHost(C_map, F_map, Wr, R); hypre_ParCSRMatrixMigrate(Wr, HYPRE_MEMORY_DEVICE); hypre_ParCSRMatrixMigrate(R, HYPRE_MEMORY_DEVICE); } else #endif { hypre_MGRBuildRFromWrHost(C_map, F_map, Wr, R); } /* Setup communication package */ hypre_MatvecCommPkgCreate(R); /* Set output pointer */ *R_ptr = R; HYPRE_ANNOTATE_FUNC_END; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_MGRColLumpedRestrict *--------------------------------------------------------------------------*/ HYPRE_Int hypre_MGRColLumpedRestrict(hypre_ParCSRMatrix *A, hypre_ParCSRMatrix *A_FF, hypre_ParCSRMatrix *A_CF, hypre_IntArray *CF_marker, hypre_ParCSRMatrix **Wr_ptr, hypre_ParCSRMatrix **R_ptr) { hypre_ParVector *b_FF = NULL; hypre_ParVector *b_CF = NULL; hypre_ParVector *r_CF = NULL; hypre_ParCSRMatrix *Wr = NULL; hypre_ParCSRMatrix *R = NULL; HYPRE_Int num_points = 2; HYPRE_Int points[2] = {1, -1}; // {C, F} HYPRE_Int sizes[2] = {hypre_ParCSRMatrixNumRows(A_CF), hypre_ParCSRMatrixNumCols(A_CF) }; hypre_IntArrayArray *CF_maps; HYPRE_ANNOTATE_FUNC_BEGIN; /*------------------------------------------------------- * 1) b_FF = approx(A_FF) *-------------------------------------------------------*/ hypre_ParCSRMatrixColSum(A_FF, &b_FF); /*------------------------------------------------------- * 2) b_CF = approx(A_CF) *-------------------------------------------------------*/ hypre_ParCSRMatrixColSum(A_CF, &b_CF); /*------------------------------------------------------- * 3) Wr = - approx(A_CF) * inv(approx(A_FF)) *-------------------------------------------------------*/ r_CF = hypre_ParVectorCreate(hypre_ParCSRMatrixComm(A_CF), hypre_ParCSRMatrixGlobalNumRows(A_CF), hypre_ParCSRMatrixRowStarts(A_CF)); hypre_ParVectorInitialize_v2(r_CF, hypre_ParCSRMatrixMemoryLocation(A_CF)); hypre_ParVectorElmdivpy(b_CF, b_FF, r_CF); hypre_ParVectorScale(-1.0, r_CF); Wr = hypre_ParCSRMatrixCreateFromParVector(r_CF, hypre_ParCSRMatrixGlobalNumRows(A_CF), hypre_ParCSRMatrixGlobalNumCols(A_CF), hypre_ParCSRMatrixRowStarts(A_CF), hypre_ParCSRMatrixColStarts(A_CF)); /* Free memory */ hypre_ParVectorDestroy(b_FF); hypre_ParVectorDestroy(b_CF); hypre_ParVectorDestroy(r_CF); /*------------------------------------------------------- * 4) Build Restriction *-------------------------------------------------------*/ /* Compute C/F local mappings */ hypre_IntArraySeparateByValue(num_points, points, sizes, CF_marker, &CF_maps); /* Build restriction from Wr (R = [Wr I]) */ hypre_MGRBuildRFromWr(hypre_IntArrayArrayEntryI(CF_maps, 0), hypre_IntArrayArrayEntryI(CF_maps, 1), hypre_ParCSRMatrixGlobalNumRows(A_CF), hypre_ParCSRMatrixGlobalNumCols(A), hypre_ParCSRMatrixRowStarts(A_CF), hypre_ParCSRMatrixColStarts(A), Wr, &R); /* Set output pointers */ *Wr_ptr = Wr; *R_ptr = R; /* Free memory */ hypre_IntArrayArrayDestroy(CF_maps); HYPRE_ANNOTATE_FUNC_END; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_MGRBlockColLumpedRestrict *--------------------------------------------------------------------------*/ HYPRE_Int hypre_MGRBlockColLumpedRestrict(hypre_ParCSRMatrix *A, hypre_ParCSRMatrix *A_FF, hypre_ParCSRMatrix *A_CF, hypre_IntArray *CF_marker, HYPRE_Int block_dim, hypre_ParCSRMatrix **Wr_ptr, hypre_ParCSRMatrix **R_ptr) { hypre_DenseBlockMatrix *b_FF = NULL; hypre_DenseBlockMatrix *b_CF = NULL; hypre_DenseBlockMatrix *r_CF = NULL; hypre_ParCSRMatrix *Wr = NULL; hypre_ParCSRMatrix *R = NULL; HYPRE_Int row_major = 0; HYPRE_Int num_points = 2; HYPRE_Int points[2] = {1, -1}; // {C, F} HYPRE_Int sizes[2] = {hypre_ParCSRMatrixNumRows(A_CF), hypre_ParCSRMatrixNumCols(A_CF) }; hypre_IntArrayArray *CF_maps; HYPRE_ANNOTATE_FUNC_BEGIN; /* Sanity check */ if (block_dim <= 1) { hypre_error_w_msg(HYPRE_ERROR_GENERIC, "Invalid block dimension!"); return hypre_error_flag; } /*------------------------------------------------------- * 1) b_FF = approx(A_FF) *-------------------------------------------------------*/ hypre_ParCSRMatrixBlockColSum(A_FF, row_major, block_dim, block_dim, &b_FF); /*------------------------------------------------------- * 2) b_CF = approx(A_CF) *-------------------------------------------------------*/ hypre_ParCSRMatrixBlockColSum(A_CF, row_major, 1, block_dim, &b_CF); /*------------------------------------------------------- * 3) b_FF = inv(approx(A_FF)) (invert in-place) *-------------------------------------------------------*/ #if defined (HYPRE_USING_GPU) if (hypre_GetExecPolicy1(hypre_DenseBlockMatrixMemoryLocation(b_FF)) == HYPRE_EXEC_DEVICE) { /* TODO (VPM): GPU version */ hypre_DenseBlockMatrixMigrate(b_FF, HYPRE_MEMORY_HOST); hypre_BlockDiagInvLapack(hypre_DenseBlockMatrixData(b_FF), hypre_DenseBlockMatrixNumRows(b_FF), hypre_DenseBlockMatrixNumRowsBlock(b_FF)); hypre_DenseBlockMatrixMigrate(b_FF, HYPRE_MEMORY_DEVICE); } else #endif { hypre_BlockDiagInvLapack(hypre_DenseBlockMatrixData(b_FF), hypre_DenseBlockMatrixNumRows(b_FF), hypre_DenseBlockMatrixNumRowsBlock(b_FF)); } /*------------------------------------------------------- * 4) Wr = - approx(A_CF) * inv(approx(A_FF)) *-------------------------------------------------------*/ hypre_DenseBlockMatrixMultiply(b_CF, b_FF, &r_CF); hypre_DenseBlockMatrixPrint(hypre_ParCSRMatrixComm(A), r_CF, "r_CF"); Wr = hypre_ParCSRMatrixCreateFromDenseBlockMatrix(hypre_ParCSRMatrixComm(A_CF), hypre_ParCSRMatrixGlobalNumRows(A_CF), hypre_ParCSRMatrixGlobalNumCols(A_CF), hypre_ParCSRMatrixRowStarts(A_CF), hypre_ParCSRMatrixColStarts(A_CF), r_CF); hypre_ParCSRMatrixScale(Wr, -1.0); /* Free memory */ hypre_DenseBlockMatrixDestroy(b_FF); hypre_DenseBlockMatrixDestroy(b_CF); hypre_DenseBlockMatrixDestroy(r_CF); /*------------------------------------------------------- * 5) Build Restriction *-------------------------------------------------------*/ /* Compute C/F local mappings */ hypre_IntArraySeparateByValue(num_points, points, sizes, CF_marker, &CF_maps); /* Build restriction from W (R = [Wr I]) */ hypre_MGRBuildRFromWr(hypre_IntArrayArrayEntryI(CF_maps, 0), hypre_IntArrayArrayEntryI(CF_maps, 1), hypre_ParCSRMatrixGlobalNumRows(A_CF), hypre_ParCSRMatrixGlobalNumCols(A), hypre_ParCSRMatrixRowStarts(A_CF), hypre_ParCSRMatrixColStarts(A), Wr, &R); /* Set output pointers */ *Wr_ptr = Wr; *R_ptr = R; /* Free memory */ hypre_IntArrayArrayDestroy(CF_maps); HYPRE_ANNOTATE_FUNC_END; return hypre_error_flag; } hypre-2.33.0/src/parcsr_ls/par_mgr_rap.c000066400000000000000000000613431477326011500201570ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "_hypre_parcsr_ls.h" #include "par_mgr.h" /*-------------------------------------------------------------------------- * hypre_MGRNonGalerkinTruncate * * Applies filtering in-place to the input matrix "A" based on the maximum * number of nonzero entries per row. This algorithm is tailored to the needs * of the Non-Galerkin approach in MGR. * * - max_elmts == 0: no filtering * - max_elmts == 1 and blk_dim == 1: keep diagonal entries * - max_elmts == 1 and blk_dim > 1: keep block diagonal entries * - max_elmts > 1 and blk_dim == 1: keep diagonal entries and * (max_elmts - 1) largest ones per row * - max_elmts > blk_dim and blk_dim > 1: keep block diagonal entries and * (max_elmts - blk_dim) largest ones *--------------------------------------------------------------------------*/ HYPRE_Int hypre_MGRNonGalerkinTruncate(hypre_ParCSRMatrix *A, HYPRE_Int ordering, HYPRE_Int blk_dim, HYPRE_Int max_elmts) { HYPRE_MemoryLocation memory_location = hypre_ParCSRMatrixMemoryLocation(A); HYPRE_Int nrows = hypre_CSRMatrixNumRows(hypre_ParCSRMatrixDiag(A)); hypre_CSRMatrix *A_diag = hypre_ParCSRMatrixDiag(A); HYPRE_Complex *A_diag_a = hypre_CSRMatrixData(A_diag); HYPRE_Int *A_diag_i = hypre_CSRMatrixI(A_diag); HYPRE_Int *A_diag_j = hypre_CSRMatrixJ(A_diag); HYPRE_Int ncol_diag = hypre_CSRMatrixNumCols(A_diag); hypre_CSRMatrix *A_offd = hypre_ParCSRMatrixOffd(A); HYPRE_Complex *A_offd_a = hypre_CSRMatrixData(A_offd); HYPRE_Int *A_offd_i = hypre_CSRMatrixI(A_offd); HYPRE_Int *A_offd_j = hypre_CSRMatrixJ(A_offd); HYPRE_Int i, i1, jj; HYPRE_Int *A_diag_i_new, *A_diag_j_new; HYPRE_Complex *A_diag_a_new; HYPRE_Int num_nonzeros_diag_new = 0; HYPRE_Int *A_offd_i_new, *A_offd_j_new; HYPRE_Complex *A_offd_a_new; HYPRE_Int num_nonzeros_offd_new = 0; HYPRE_Int num_nonzeros_max = (blk_dim + max_elmts) * nrows; HYPRE_Int num_nonzeros_offd_max = max_elmts * nrows; HYPRE_Int max_num_nonzeros; HYPRE_Int *aux_j = NULL; HYPRE_Real *aux_data = NULL; HYPRE_Int row_start, row_stop, cnt; HYPRE_Int col_idx; HYPRE_Real col_value; /* Return if max_elmts is zero, i.e., no truncation */ if (max_elmts == 0) { return hypre_error_flag; } /* Allocate new memory */ if (ordering == 0) { #if defined (HYPRE_USING_GPU) if (hypre_GetExecPolicy1(memory_location) == HYPRE_EXEC_DEVICE) { hypre_ParCSRMatrixMigrate(A, HYPRE_MEMORY_HOST); } #endif A_diag_i_new = hypre_CTAlloc(HYPRE_Int, nrows + 1, HYPRE_MEMORY_HOST); A_diag_j_new = hypre_CTAlloc(HYPRE_Int, num_nonzeros_max, HYPRE_MEMORY_HOST); A_diag_a_new = hypre_CTAlloc(HYPRE_Complex, num_nonzeros_max, HYPRE_MEMORY_HOST); A_offd_i_new = hypre_CTAlloc(HYPRE_Int, nrows + 1, HYPRE_MEMORY_HOST); A_offd_j_new = hypre_CTAlloc(HYPRE_Int, num_nonzeros_offd_max, HYPRE_MEMORY_HOST); A_offd_a_new = hypre_CTAlloc(HYPRE_Complex, num_nonzeros_offd_max, HYPRE_MEMORY_HOST); if (max_elmts > 0) { max_num_nonzeros = 0; for (i = 0; i < nrows; i++) { max_num_nonzeros = hypre_max(max_num_nonzeros, (A_diag_i[i + 1] - A_diag_i[i]) + (A_offd_i[i + 1] - A_offd_i[i])); } aux_j = hypre_CTAlloc(HYPRE_Int, max_num_nonzeros, HYPRE_MEMORY_HOST); aux_data = hypre_CTAlloc(HYPRE_Real, max_num_nonzeros, HYPRE_MEMORY_HOST); } for (i = 0; i < nrows; i++) { row_start = i - (i % blk_dim); row_stop = row_start + blk_dim - 1; /* Copy (block) diagonal data to new arrays */ for (jj = A_diag_i[i]; jj < A_diag_i[i + 1]; jj++) { i1 = A_diag_j[jj]; if (i1 >= row_start && i1 <= row_stop) { A_diag_j_new[num_nonzeros_diag_new] = i1; A_diag_a_new[num_nonzeros_diag_new] = A_diag_a[jj]; ++num_nonzeros_diag_new; } } /* Add other connections? */ if (max_elmts > 0) { cnt = 0; for (jj = A_offd_i[i]; jj < A_offd_i[i + 1]; jj++) { aux_j[cnt] = A_offd_j[jj] + ncol_diag; aux_data[cnt] = A_offd_a[jj]; cnt++; } for (jj = A_diag_i[i]; jj < A_diag_i[i + 1]; jj++) { aux_j[cnt] = A_diag_j[jj]; aux_data[cnt] = A_diag_a[jj]; cnt++; } hypre_qsort2_abs(aux_j, aux_data, 0, cnt - 1); for (jj = 0; jj < hypre_min(max_elmts, cnt); jj++) { col_idx = aux_j[jj]; col_value = aux_data[jj]; if (col_idx < ncol_diag && (col_idx < row_start || col_idx > row_stop)) { A_diag_j_new[num_nonzeros_diag_new] = col_idx; A_diag_a_new[num_nonzeros_diag_new] = col_value; ++num_nonzeros_diag_new; } else if (col_idx >= ncol_diag) { A_offd_j_new[num_nonzeros_offd_new] = col_idx - ncol_diag; A_offd_a_new[num_nonzeros_offd_new] = col_value; ++num_nonzeros_offd_new; } } } A_diag_i_new[i + 1] = num_nonzeros_diag_new; A_offd_i_new[i + 1] = num_nonzeros_offd_new; } hypre_TFree(aux_j, HYPRE_MEMORY_HOST); hypre_TFree(aux_data, HYPRE_MEMORY_HOST); /* Update input matrix */ hypre_TFree(A_diag_i, HYPRE_MEMORY_HOST); hypre_TFree(A_diag_j, HYPRE_MEMORY_HOST); hypre_TFree(A_diag_a, HYPRE_MEMORY_HOST); hypre_CSRMatrixI(A_diag) = A_diag_i_new; hypre_CSRMatrixJ(A_diag) = A_diag_j_new; hypre_CSRMatrixData(A_diag) = A_diag_a_new; hypre_CSRMatrixNumNonzeros(A_diag) = num_nonzeros_diag_new; hypre_TFree(A_offd_i, HYPRE_MEMORY_HOST); hypre_TFree(A_offd_j, HYPRE_MEMORY_HOST); hypre_TFree(A_offd_a, HYPRE_MEMORY_HOST); hypre_CSRMatrixI(A_offd) = A_offd_i_new; hypre_CSRMatrixJ(A_offd) = A_offd_j_new; hypre_CSRMatrixData(A_offd) = A_offd_a_new; hypre_CSRMatrixNumNonzeros(A_offd) = num_nonzeros_offd_new; #if defined (HYPRE_USING_GPU) if (hypre_GetExecPolicy1(memory_location) == HYPRE_EXEC_DEVICE) { hypre_ParCSRMatrixMigrate(A, memory_location); } #endif } else { /* Keep only the diagonal portion of A TODO (VPM): consider other combinations of max_elmts and blk_dim */ hypre_CSRMatrixNumCols(A_offd) = 0; hypre_CSRMatrixNumNonzeros(A_offd) = 0; hypre_CSRMatrixNumRownnz(A_offd) = 0; hypre_TFree(hypre_CSRMatrixRownnz(A_offd), memory_location); hypre_TFree(hypre_CSRMatrixI(A_offd), memory_location); hypre_TFree(hypre_CSRMatrixJ(A_offd), memory_location); hypre_TFree(hypre_CSRMatrixData(A_offd), memory_location); hypre_TFree(hypre_ParCSRMatrixColMapOffd(A), HYPRE_MEMORY_HOST); hypre_TFree(hypre_ParCSRMatrixDeviceColMapOffd(A), memory_location); hypre_CSRMatrixI(A_offd) = hypre_CTAlloc(HYPRE_Int, nrows + 1, memory_location); hypre_CSRMatrixTruncateDiag(A_diag); } return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_MGRBuildNonGalerkinCoarseOperatorHost *--------------------------------------------------------------------------*/ HYPRE_Int hypre_MGRBuildNonGalerkinCoarseOperatorHost(hypre_ParCSRMatrix *A_FF, hypre_ParCSRMatrix *A_FC, hypre_ParCSRMatrix *A_CF, hypre_ParCSRMatrix *A_CC, hypre_ParCSRMatrix *Wp, hypre_ParCSRMatrix *Wr, HYPRE_Int fine_blk_dim, HYPRE_Int coarse_blk_dim, HYPRE_Int ordering, HYPRE_Int method, HYPRE_Int max_elmts, hypre_ParCSRMatrix **A_H_ptr) { hypre_ParCSRMatrix *A_H = NULL; hypre_ParCSRMatrix *A_Hc = NULL; hypre_ParCSRMatrix *Wp_tmp = NULL; hypre_ParCSRMatrix *Wr_tmp = NULL; hypre_ParCSRMatrix *A_CF_truncated = NULL; hypre_ParCSRMatrix *A_FF_inv = NULL; hypre_ParCSRMatrix *minus_Wp = NULL; HYPRE_Int blk_inv_size; HYPRE_Complex neg_one = -1.0; HYPRE_Complex one = 1.0; HYPRE_Complex beta = 0.0; if (Wp != NULL && max_elmts > 0) { /* A_Hc = diag(A_CF * Wp) */ hypre_ParCSRMatMatDiag(A_CF, Wp, &A_Hc); /* Coarse grid / Schur complement Note that beta is one since A_Hc has positive sign */ hypre_ParCSRMatrixAdd(one, A_CC, one, A_Hc, &A_H); /* Free memory */ hypre_ParCSRMatrixDestroy(A_Hc); /* Set output pointer */ *A_H_ptr = A_H; return hypre_error_flag; } if (method == 1) { if (Wp != NULL) { A_Hc = hypre_ParCSRMatMat(A_CF, Wp); /* Set multiplication factor to A_Hc */ beta = one; } else { // Build block diagonal inverse for A_FF hypre_ParCSRMatrixBlockDiagMatrix(A_FF, fine_blk_dim, -1, NULL, 1, &A_FF_inv); // compute Wp = A_FF_inv * A_FC // NOTE: Use hypre_ParMatmul here instead of hypre_ParCSRMatMat to avoid padding // zero entries at diagonals for the latter routine. Use MatMat once this padding // issue is resolved since it is more efficient. // hypre_ParCSRMatrix *Wp_tmp = hypre_ParCSRMatMat(A_FF_inv, A_FC); Wp_tmp = hypre_ParMatmul(A_FF_inv, A_FC); /* Compute correction A_Hc = A_CF * (A_FF_inv * A_FC); */ A_Hc = hypre_ParCSRMatMat(A_CF, Wp_tmp); hypre_ParCSRMatrixDestroy(Wp_tmp); hypre_ParCSRMatrixDestroy(A_FF_inv); /* Set multiplication factor to A_Hc */ beta = neg_one; } } else if (method == 2 || method == 3) { /* Extract the diagonal of A_CF */ hypre_MGRTruncateAcfCPR(A_CF, &A_CF_truncated); if (Wp != NULL) { A_Hc = hypre_ParCSRMatMat(A_CF_truncated, Wp); /* Set multiplication factor to A_Hc */ beta = one; } else { blk_inv_size = method == 2 ? 1 : fine_blk_dim; hypre_ParCSRMatrixBlockDiagMatrix(A_FF, blk_inv_size, -1, NULL, 1, &A_FF_inv); /* TODO (VPM): We shouldn't need to compute Wr_tmp since we are passing in Wr already */ HYPRE_UNUSED_VAR(Wr); Wr_tmp = hypre_ParCSRMatMat(A_CF_truncated, A_FF_inv); A_Hc = hypre_ParCSRMatMat(Wr_tmp, A_FC); hypre_ParCSRMatrixDestroy(Wr_tmp); hypre_ParCSRMatrixDestroy(A_FF_inv); /* Set multiplication factor to A_Hc */ beta = neg_one; } hypre_ParCSRMatrixDestroy(A_CF_truncated); } else if (method == 4) { /* Approximate inverse for ideal interploation */ hypre_MGRApproximateInverse(A_FF, &A_FF_inv); minus_Wp = hypre_ParCSRMatMat(A_FF_inv, A_FC); A_Hc = hypre_ParCSRMatMat(A_CF, minus_Wp); hypre_ParCSRMatrixDestroy(minus_Wp); /* Set multiplication factor to A_Hc */ beta = neg_one; } /* Drop small entries in the correction term A_Hc */ hypre_MGRNonGalerkinTruncate(A_Hc, ordering, coarse_blk_dim, max_elmts); /* Coarse grid / Schur complement */ hypre_ParCSRMatrixAdd(one, A_CC, beta, A_Hc, &A_H); /* Free memory */ hypre_ParCSRMatrixDestroy(A_Hc); /* Set output pointer */ *A_H_ptr = A_H; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_MGRBuildNonGalerkinCoarseOperatorDevice *--------------------------------------------------------------------------*/ HYPRE_Int hypre_MGRBuildNonGalerkinCoarseOperatorDevice(hypre_ParCSRMatrix *A_FF, hypre_ParCSRMatrix *A_FC, hypre_ParCSRMatrix *A_CF, hypre_ParCSRMatrix *A_CC, hypre_ParCSRMatrix *Wp, hypre_ParCSRMatrix *Wr, HYPRE_Int fine_blk_dim, HYPRE_Int coarse_blk_dim, HYPRE_Int ordering, HYPRE_Int method, HYPRE_Int max_elmts, hypre_ParCSRMatrix **A_H_ptr) { /* Local variables */ hypre_ParCSRMatrix *A_H; hypre_ParCSRMatrix *A_Hc; hypre_ParCSRMatrix *A_CF_trunc; hypre_ParCSRMatrix *Wp_tmp = Wp; HYPRE_Complex neg_one = -1.0; HYPRE_Complex one = 1.0; hypre_GpuProfilingPushRange("MGRComputeNonGalerkinCG"); /* Truncate A_CF according to the method */ if (method == 2 || method == 3) { hypre_MGRTruncateAcfCPRDevice(A_CF, &A_CF_trunc); } else { A_CF_trunc = A_CF; } /* Compute Wp/Wr if not passed in */ if (!Wp && (method == 1 || method == 2)) { hypre_ParVector *D_FF_inv; HYPRE_Complex *data; /* Create vector to store A_FF's diagonal inverse */ D_FF_inv = hypre_ParVectorCreate(hypre_ParCSRMatrixComm(A_FF), hypre_ParCSRMatrixGlobalNumRows(A_FF), hypre_ParCSRMatrixRowStarts(A_FF)); hypre_ParVectorInitialize_v2(D_FF_inv, HYPRE_MEMORY_DEVICE); data = hypre_ParVectorLocalData(D_FF_inv); /* Compute the inverse of A_FF and compute its inverse */ hypre_CSRMatrixExtractDiagonal(hypre_ParCSRMatrixDiag(A_FF), data, 2); hypre_ParVectorScale(neg_one, D_FF_inv); /* Compute D_FF_inv*A_FC */ Wp_tmp = hypre_ParCSRMatrixClone(A_FC, 1); hypre_ParCSRMatrixDiagScale(Wp_tmp, D_FF_inv, NULL); /* Free memory */ hypre_ParVectorDestroy(D_FF_inv); } else if (!Wp && (method == 3)) { hypre_ParCSRMatrix *B_FF_inv; /* Compute the block diagonal inverse of A_FF */ hypre_ParCSRMatrixBlockDiagMatrix(A_FF, fine_blk_dim, -1, NULL, 1, &B_FF_inv); /* Compute Wp = A_FF_inv * A_FC */ Wp_tmp = hypre_ParCSRMatMat(B_FF_inv, A_FC); hypre_ParCSRMatrixScale(Wp_tmp, neg_one); /* Free memory */ hypre_ParCSRMatrixDestroy(B_FF_inv); } /* Compute A_Hc (the correction for A_H) */ if (Wp_tmp) { if (max_elmts > 0) { /* A_Hc = diag(A_CF * Wp) */ hypre_ParCSRMatMatDiag(A_CF_trunc, Wp_tmp, &A_Hc); /* Coarse grid / Schur complement */ hypre_ParCSRMatrixAdd(one, A_CC, one, A_Hc, &A_H); /* Free memory */ hypre_ParCSRMatrixDestroy(A_Hc); if (method == 2 || method == 3) { hypre_ParCSRMatrixDestroy(A_CF_trunc); } if (Wp_tmp != Wp) { hypre_ParCSRMatrixDestroy(Wp_tmp); } /* Set output pointer */ *A_H_ptr = A_H; hypre_GpuProfilingPopRange(); return hypre_error_flag; } A_Hc = hypre_ParCSRMatMat(A_CF_trunc, Wp_tmp); } else if (Wr) { A_Hc = hypre_ParCSRMatMat(Wr, A_FC); } else { hypre_error_w_msg(HYPRE_ERROR_GENERIC, "Wp/Wr matrices were not provided!"); hypre_GpuProfilingPopRange(); return hypre_error_flag; } /* Filter A_Hc */ hypre_MGRNonGalerkinTruncate(A_Hc, ordering, coarse_blk_dim, max_elmts); /* Coarse grid (Schur complement) computation */ hypre_ParCSRMatrixAdd(one, A_CC, one, A_Hc, &A_H); /* Free memory */ hypre_ParCSRMatrixDestroy(A_Hc); if (Wp_tmp != Wp) { hypre_ParCSRMatrixDestroy(Wp_tmp); } if (method == 2 || method == 3) { hypre_ParCSRMatrixDestroy(A_CF_trunc); } /* Set output pointer to coarse grid matrix */ *A_H_ptr = A_H; hypre_GpuProfilingPopRange(); return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_MGRBuildNonGalerkinCoarseOperator * * Computes the coarse level operator A_H = RAP via a Non-Galerkin approach. * * Available methods: * 1: inv(A_FF) approximated by its (block) diagonal inverse * 2: CPR-like approx. with inv(A_FF) approx. by its diagonal inverse * 3: CPR-like approx. with inv(A_FF) approx. by its block diagonal inverse * 4: inv(A_FF) approximated by sparse approximate inverse * * Methods 1-4 assume that restriction is the injection operator. * * TODO (VPM): inv(A_FF)*A_FC might have been computed before. Reuse it! *--------------------------------------------------------------------------*/ HYPRE_Int hypre_MGRBuildNonGalerkinCoarseOperator(hypre_ParCSRMatrix *A_FF, hypre_ParCSRMatrix *A_FC, hypre_ParCSRMatrix *A_CF, hypre_ParCSRMatrix *A_CC, hypre_ParCSRMatrix *Wp, hypre_ParCSRMatrix *Wr, HYPRE_Int fine_blk_dim, HYPRE_Int coarse_blk_dim, HYPRE_Int ordering, HYPRE_Int method, HYPRE_Int max_elmts, hypre_ParCSRMatrix **A_H_ptr) { hypre_ParCSRMatrix *matrices[6] = {A_FF, A_FC, A_CF, A_CC, Wp, Wr}; HYPRE_Int i; /* Check that the memory locations of the input matrices match */ for (i = 0; i < 5; i++) { if (matrices[i] && matrices[i + 1] && hypre_ParCSRMatrixMemoryLocation(matrices[i]) != hypre_ParCSRMatrixMemoryLocation(matrices[i + 1])) { hypre_error_w_msg(HYPRE_ERROR_GENERIC, "Memory locations do not match!"); return hypre_error_flag; } } #if defined (HYPRE_USING_GPU) HYPRE_MemoryLocation memory_location = hypre_ParCSRMatrixMemoryLocation(A_FF); if (hypre_GetExecPolicy1(memory_location) == HYPRE_EXEC_DEVICE) { hypre_MGRBuildNonGalerkinCoarseOperatorDevice(A_FF, A_FC, A_CF, A_CC, Wp, Wr, fine_blk_dim, coarse_blk_dim, ordering, method, max_elmts, A_H_ptr); } else #endif { hypre_MGRBuildNonGalerkinCoarseOperatorHost(A_FF, A_FC, A_CF, A_CC, Wp, Wr, fine_blk_dim, coarse_blk_dim, ordering, method, max_elmts, A_H_ptr); } return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_MGRBuildCoarseOperator *--------------------------------------------------------------------------*/ HYPRE_Int hypre_MGRBuildCoarseOperator(void *mgr_vdata, hypre_ParCSRMatrix *A_FF, hypre_ParCSRMatrix *A_FC, hypre_ParCSRMatrix *A_CF, hypre_ParCSRMatrix **A_CC_ptr, hypre_ParCSRMatrix *Wp, hypre_ParCSRMatrix *Wr, HYPRE_Int level) { hypre_ParMGRData *mgr_data = (hypre_ParMGRData*) mgr_vdata; hypre_ParCSRMatrix *A = (mgr_data -> A_array)[level]; hypre_ParCSRMatrix *P = (mgr_data -> P_array)[level]; hypre_ParCSRMatrix *R = (mgr_data -> R_array)[level]; hypre_ParCSRMatrix *RT = (mgr_data -> RT_array)[level]; hypre_ParCSRMatrix *A_CC = *A_CC_ptr; HYPRE_Int *blk_dims = (mgr_data -> block_num_coarse_indexes); HYPRE_Int block_size = (mgr_data -> block_size); HYPRE_Int method = (mgr_data -> coarse_grid_method)[level]; HYPRE_Int num_coarse_levels = (mgr_data -> max_num_coarse_levels); HYPRE_Int ordering = (mgr_data -> set_c_points_method); HYPRE_Int max_elmts = (mgr_data -> nonglk_max_elmts)[level]; HYPRE_Int interp_type = (mgr_data -> interp_type)[level]; HYPRE_Int restrict_type = (mgr_data -> restrict_type)[level]; HYPRE_Real threshold = (mgr_data -> truncate_coarse_grid_threshold); hypre_ParCSRMatrix *AP, *RAP, *RAP_c; HYPRE_Int fine_blk_dim = (level) ? blk_dims[level - 1] - blk_dims[level] : block_size - blk_dims[level]; HYPRE_Int coarse_blk_dim = blk_dims[level]; HYPRE_Int rebuild_commpkg = 0; HYPRE_Complex one = 1.0; HYPRE_MemoryLocation memory_location = hypre_ParCSRMatrixMemoryLocation(A); HYPRE_ExecutionPolicy exec_policy = hypre_GetExecPolicy1(memory_location); HYPRE_ANNOTATE_FUNC_BEGIN; hypre_GpuProfilingPushRange("RAP"); if (!method) { /* Galerkin path */ if ((interp_type == 0) && Wr && (exec_policy == HYPRE_EXEC_HOST)) { /* Prolongation is the injection operator and Restriction is not the injection operator (Wr != NULL) */ RAP_c = hypre_ParCSRMatMat(Wr, A_FC); hypre_ParCSRMatrixAdd(one, A_CC, one, RAP_c, &RAP); hypre_ParCSRMatrixDestroy(RAP_c); } else if ((restrict_type == 0) && Wp && (exec_policy == HYPRE_EXEC_HOST)) { /* Prolongation is not the injection operator (Wp != NULL) and Restriction is the injection operator */ RAP_c = hypre_ParCSRMatMat(A_CF, Wp); hypre_ParCSRMatrixAdd(one, A_CC, one, RAP_c, &RAP); hypre_ParCSRMatrixDestroy(RAP_c); } else if (RT) { RAP = hypre_ParCSRMatrixRAPKT(RT, A, P, 1); } else if (R) { AP = hypre_ParCSRMatMat(A, P); RAP = hypre_ParCSRMatMat(R, AP); hypre_CSRMatrixReorder(hypre_ParCSRMatrixDiag(RAP)); hypre_ParCSRMatrixDestroy(AP); } else { hypre_GpuProfilingPopRange(); hypre_error_w_msg(HYPRE_ERROR_GENERIC, "Expected either Wp, Wr, R or RT!"); return hypre_error_flag; } } else if (method == 5) { /* Approximate the coarse level matrix as A_CC */ RAP = *A_CC_ptr; *A_CC_ptr = NULL; } else { /* Non-Galerkin path */ hypre_MGRBuildNonGalerkinCoarseOperator(A_FF, A_FC, A_CF, A_CC, Wp, Wr, fine_blk_dim, coarse_blk_dim, ordering, method, max_elmts, &RAP); } /* Truncate coarse level matrix based on input threshold */ if (threshold > 0.0) { #if defined (HYPRE_USING_GPU) HYPRE_MemoryLocation memory_location = hypre_ParCSRMatrixMemoryLocation(RAP); if (hypre_GetExecPolicy1(memory_location) == HYPRE_EXEC_DEVICE) { hypre_ParCSRMatrixDropSmallEntriesDevice(RAP, threshold, -1); rebuild_commpkg = 1; } else #endif { hypre_ParCSRMatrixTruncate(RAP, threshold, 0, 0, 0); } } /* Compute/rebuild communication package */ if (rebuild_commpkg) { if (hypre_ParCSRMatrixCommPkg(RAP)) { hypre_MatvecCommPkgDestroy(hypre_ParCSRMatrixCommPkg(RAP)); } hypre_MatvecCommPkgCreate(RAP); } if (!hypre_ParCSRMatrixCommPkg(RAP)) { hypre_MatvecCommPkgCreate(RAP); } /* Set coarse grid matrix */ (mgr_data -> A_array)[level + 1] = RAP; if ((level + 1) == num_coarse_levels) { (mgr_data -> RAP) = RAP; } hypre_GpuProfilingPopRange(); HYPRE_ANNOTATE_FUNC_END; return hypre_error_flag; } hypre-2.33.0/src/parcsr_ls/par_mgr_setup.c000066400000000000000000002252641477326011500205410ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "_hypre_parcsr_ls.h" #include "par_mgr.h" #include "par_amg.h" /* Setup MGR data */ HYPRE_Int hypre_MGRSetup( void *mgr_vdata, hypre_ParCSRMatrix *A, hypre_ParVector *f, hypre_ParVector *u ) { MPI_Comm comm = hypre_ParCSRMatrixComm(A); hypre_ParMGRData *mgr_data = (hypre_ParMGRData*) mgr_vdata; HYPRE_Int i, j, final_coarse_size = 0, block_size, idx, **block_cf_marker; HYPRE_Int *block_num_coarse_indexes, *point_marker_array; HYPRE_BigInt row, end_idx; HYPRE_Int lev, num_coarsening_levs, last_level; HYPRE_Int num_c_levels = 0, nc, index_i, cflag; HYPRE_Int set_c_points_method; HYPRE_Int debug_flag = 0; HYPRE_Int block_jacobi_bsize; HYPRE_Int *blk_size = mgr_data -> blk_size; HYPRE_Int level_blk_size; hypre_ParCSRMatrix *RT = NULL; hypre_ParCSRMatrix *R = NULL; hypre_ParCSRMatrix *P = NULL; hypre_ParCSRMatrix *S = NULL; hypre_ParCSRMatrix *Wp = NULL; hypre_ParCSRMatrix *Wr = NULL; HYPRE_BigInt coarse_pnts_global[2]; // TODO: Change to row_starts_cpts HYPRE_BigInt row_starts_fpts[2]; hypre_Vector **l1_norms = NULL; HYPRE_Real *l1_norms_data; hypre_ParVector *Ztemp; hypre_ParVector *Vtemp; hypre_ParVector *Utemp; hypre_ParVector *Ftemp; /* pointers to mgr data */ HYPRE_Int use_default_cgrid_solver = (mgr_data -> use_default_cgrid_solver); HYPRE_Int logging = (mgr_data -> logging); HYPRE_Int print_level = (mgr_data -> print_level); HYPRE_Int relax_type = (mgr_data -> relax_type); HYPRE_Int relax_order = (mgr_data -> relax_order); HYPRE_Int *interp_type = (mgr_data -> interp_type); HYPRE_Int *restrict_type = (mgr_data -> restrict_type); HYPRE_Int *num_relax_sweeps = (mgr_data -> num_relax_sweeps); HYPRE_Int num_interp_sweeps = (mgr_data -> num_interp_sweeps); //HYPRE_Int num_restrict_sweeps = (mgr_data -> num_interp_sweeps); HYPRE_Int *P_max_elmts = (mgr_data -> P_max_elmts); HYPRE_Real max_row_sum = (mgr_data -> max_row_sum); HYPRE_Real strong_threshold = (mgr_data -> strong_threshold); HYPRE_Real trunc_factor = (mgr_data -> trunc_factor); HYPRE_Int old_num_coarse_levels = (mgr_data -> num_coarse_levels); HYPRE_Int max_num_coarse_levels = (mgr_data -> max_num_coarse_levels); HYPRE_Int * reserved_Cpoint_local_indexes = (mgr_data -> reserved_Cpoint_local_indexes); hypre_IntArray **CF_marker_array = (mgr_data -> CF_marker_array); HYPRE_Int *CF_marker; hypre_IntArray *FC_marker; hypre_ParCSRMatrix **A_array = (mgr_data -> A_array); hypre_ParCSRMatrix **B_array = (mgr_data -> B_array); hypre_ParCSRMatrix **B_FF_array = (mgr_data -> B_FF_array); #if defined(HYPRE_USING_GPU) hypre_ParCSRMatrix **P_FF_array = (mgr_data -> P_FF_array); #endif hypre_ParCSRMatrix **P_array = (mgr_data -> P_array); hypre_ParCSRMatrix **R_array = (mgr_data -> RT_array); hypre_ParCSRMatrix **RT_array = (mgr_data -> RT_array); hypre_ParCSRMatrix *A_FF = NULL; hypre_ParCSRMatrix *A_FC = NULL; hypre_ParCSRMatrix *A_CF = NULL; hypre_ParCSRMatrix *A_CC = NULL; hypre_Solver *aff_base; HYPRE_Solver **aff_solver = (mgr_data -> aff_solver); hypre_ParCSRMatrix **A_ff_array = (mgr_data -> A_ff_array); hypre_ParVector **F_fine_array = (mgr_data -> F_fine_array); hypre_ParVector **U_fine_array = (mgr_data -> U_fine_array); HYPRE_Int (*fgrid_solver_setup)(void*, void*, void*, void*); HYPRE_Int (*fgrid_solver_solve)(void*, void*, void*, void*); hypre_ParVector **F_array = (mgr_data -> F_array); hypre_ParVector **U_array = (mgr_data -> U_array); hypre_ParVector *residual = (mgr_data -> residual); HYPRE_Real *rel_res_norms = (mgr_data -> rel_res_norms); HYPRE_Real **frelax_diaginv = (mgr_data -> frelax_diaginv); HYPRE_Real **level_diaginv = (mgr_data -> level_diaginv); // VPM: Do we need both frelax_diaginv and level_diaginv? HYPRE_Solver default_cg_solver; HYPRE_Int (*cgrid_solver_setup)(void*, void*, void*, void*) = (HYPRE_Int (*)(void*, void*, void*, void*)) (mgr_data -> coarse_grid_solver_setup); HYPRE_Int (*cgrid_solver_solve)(void*, void*, void*, void*) = (HYPRE_Int (*)(void*, void*, void*, void*)) (mgr_data -> coarse_grid_solver_solve); HYPRE_Int *level_smooth_type = (mgr_data -> level_smooth_type); HYPRE_Int *level_smooth_iters = (mgr_data -> level_smooth_iters); HYPRE_Solver *level_smoother = (mgr_data -> level_smoother); HYPRE_Int reserved_coarse_size = (mgr_data -> reserved_coarse_size); HYPRE_Int num_procs, my_id; hypre_CSRMatrix *A_diag = hypre_ParCSRMatrixDiag(A); HYPRE_Int n = hypre_CSRMatrixNumRows(A_diag); HYPRE_Int use_VcycleSmoother = 0; HYPRE_Int use_GSElimSmoother = 0; // HYPRE_Int use_ComplexSmoother = 0; hypre_ParVector *VcycleRelaxZtemp; hypre_ParVector *VcycleRelaxVtemp; hypre_ParAMGData **FrelaxVcycleData; hypre_ParAMGData **GSElimData; HYPRE_Int *Frelax_method = (mgr_data -> Frelax_method); HYPRE_Int *Frelax_num_functions = (mgr_data -> Frelax_num_functions); HYPRE_Int *Frelax_type = (mgr_data -> Frelax_type); HYPRE_Int *coarse_grid_method = (mgr_data -> coarse_grid_method); HYPRE_MemoryLocation memory_location = hypre_ParCSRMatrixMemoryLocation(A); #if defined(HYPRE_USING_GPU) HYPRE_ExecutionPolicy exec = hypre_GetExecPolicy1(memory_location); #endif char region_name[1024]; char msg[2048]; /* ----- begin -----*/ HYPRE_ANNOTATE_FUNC_BEGIN; hypre_GpuProfilingPushRange("MGRSetup"); hypre_GpuProfilingPushRange("MGRSetup-Init"); hypre_MemoryPrintUsage(comm, hypre_HandleLogLevel(hypre_handle()), "MGR setup begin", 0); block_size = (mgr_data -> block_size); block_jacobi_bsize = (mgr_data -> block_jacobi_bsize); block_cf_marker = (mgr_data -> block_cf_marker); block_num_coarse_indexes = (mgr_data -> block_num_coarse_indexes); point_marker_array = (mgr_data -> point_marker_array); set_c_points_method = (mgr_data -> set_c_points_method); HYPRE_Int **level_coarse_indexes = NULL; HYPRE_Int *level_coarse_size = NULL; HYPRE_Int setNonCpointToF = (mgr_data -> set_non_Cpoints_to_F); HYPRE_BigInt *reserved_coarse_indexes = (mgr_data -> reserved_coarse_indexes); HYPRE_BigInt *idx_array = (mgr_data -> idx_array); HYPRE_Int lvl_to_keep_cpoints = ((mgr_data -> lvl_to_keep_cpoints) > (mgr_data -> max_num_coarse_levels)) ? (mgr_data -> max_num_coarse_levels) : (mgr_data -> lvl_to_keep_cpoints); HYPRE_Int nloc = hypre_ParCSRMatrixNumRows(A); HYPRE_BigInt ilower = hypre_ParCSRMatrixFirstRowIndex(A); HYPRE_BigInt iupper = hypre_ParCSRMatrixLastRowIndex(A); hypre_MPI_Comm_size(comm, &num_procs); hypre_MPI_Comm_rank(comm, &my_id); /* Reset print_level codes. This is useful for printing information when solving a sequence of linear systems */ print_level |= ((print_level & HYPRE_MGR_PRINT_RESERVED_A) == HYPRE_MGR_PRINT_RESERVED_A) ? HYPRE_MGR_PRINT_INFO_PARAMS : 0; print_level |= ((print_level & HYPRE_MGR_PRINT_RESERVED_B) == HYPRE_MGR_PRINT_RESERVED_B) ? HYPRE_MGR_PRINT_FINE_MATRIX : 0; print_level |= ((print_level & HYPRE_MGR_PRINT_RESERVED_C) == HYPRE_MGR_PRINT_RESERVED_C) ? HYPRE_MGR_PRINT_FINE_RHS : 0; (mgr_data -> print_level) = print_level; /* Trivial case: simply solve the coarse level problem */ if (block_size < 2 || (mgr_data -> max_num_coarse_levels) < 1) { if (my_id == 0 && print_level > 0) { hypre_printf("Warning: Block size is < 2 or number of coarse levels is < 1. \n"); hypre_printf("Solving scalar problem on fine grid using coarse level solver \n"); } if (use_default_cgrid_solver) { if (my_id == 0 && print_level > 0) { hypre_printf("No coarse grid solver provided. Using default AMG solver ... \n"); } /* create and set default solver parameters here */ /* create and initialize default_cg_solver */ default_cg_solver = (HYPRE_Solver) hypre_BoomerAMGCreate(); hypre_BoomerAMGSetMaxIter(default_cg_solver, (mgr_data -> max_iter)); hypre_BoomerAMGSetRelaxOrder(default_cg_solver, 1); hypre_BoomerAMGSetPrintLevel(default_cg_solver, 3); /* set setup and solve functions */ cgrid_solver_setup = (HYPRE_Int (*)(void*, void*, void*, void*)) hypre_BoomerAMGSetup; cgrid_solver_solve = (HYPRE_Int (*)(void*, void*, void*, void*)) hypre_BoomerAMGSolve; (mgr_data -> coarse_grid_solver_setup) = cgrid_solver_setup; (mgr_data -> coarse_grid_solver_solve) = cgrid_solver_solve; (mgr_data -> coarse_grid_solver) = default_cg_solver; } /* keep reserved coarse indexes to coarsest grid */ if (reserved_coarse_size > 0) { HYPRE_BoomerAMGSetCPoints((mgr_data ->coarse_grid_solver), 25, reserved_coarse_size, reserved_coarse_indexes); } /* setup coarse grid solver */ cgrid_solver_setup((mgr_data -> coarse_grid_solver), A, f, u); (mgr_data -> num_coarse_levels) = 0; HYPRE_ANNOTATE_FUNC_END; hypre_GpuProfilingPopRange(); hypre_GpuProfilingPopRange(); return hypre_error_flag; } /* If we reduce the reserved C-points, increase one level */ if (lvl_to_keep_cpoints > 0) { max_num_coarse_levels++; } /* Initialize local indexes of coarse sets at different levels */ level_coarse_indexes = hypre_CTAlloc(HYPRE_Int*, max_num_coarse_levels, HYPRE_MEMORY_HOST); for (i = 0; i < max_num_coarse_levels; i++) { level_coarse_indexes[i] = hypre_CTAlloc(HYPRE_Int, nloc, HYPRE_MEMORY_HOST); } level_coarse_size = hypre_CTAlloc(HYPRE_Int, max_num_coarse_levels, HYPRE_MEMORY_HOST); HYPRE_Int reserved_cpoints_eliminated = 0; /* TODO: move this to par_mgr_coarsen.c and port to GPUs (VPM) */ for (i = 0; i < max_num_coarse_levels; i++) { // if we want to reduce the reserved Cpoints, set the current level // coarse indices the same as the previous level if (i == lvl_to_keep_cpoints && i > 0) { reserved_cpoints_eliminated++; for (j = 0; j < final_coarse_size; j++) { level_coarse_indexes[i][j] = level_coarse_indexes[i - 1][j]; } level_coarse_size[i] = final_coarse_size; continue; } final_coarse_size = 0; if (set_c_points_method == 0) // interleaved ordering, i.e. s1,p1,s2,p2,... { // loop over rows for (row = ilower; row <= iupper; row++) { idx = row % block_size; if (block_cf_marker[i - reserved_cpoints_eliminated][idx] == CMRK) { level_coarse_indexes[i][final_coarse_size++] = (HYPRE_Int)(row - ilower); } } } else if (set_c_points_method == 1) // block ordering s1,s2,...,p1,p2,... { for (j = 0; j < block_size; j++) { if (block_cf_marker[i - reserved_cpoints_eliminated][j] == CMRK) { if (j == block_size - 1) { end_idx = iupper + 1; } else { end_idx = idx_array[j + 1]; } for (row = idx_array[j]; row < end_idx; row++) { level_coarse_indexes[i][final_coarse_size++] = (HYPRE_Int)(row - ilower); } } } //hypre_printf("Level %d, # of coarse points %d\n", i, final_coarse_size); } else if (set_c_points_method == 2) { HYPRE_Int isCpoint; // row start from 0 since point_marker_array is local for (row = 0; row < nloc; row++) { isCpoint = 0; for (j = 0; j < block_num_coarse_indexes[i]; j++) { if (point_marker_array[row] == block_cf_marker[i][j]) { isCpoint = 1; break; } } if (isCpoint) { level_coarse_indexes[i][final_coarse_size++] = row; //printf("%d\n",row); } } } else { if (my_id == 0) { hypre_printf("ERROR! Unknown method for setting C points."); } exit(-1); // TODO: Fix error handling (VPM) } level_coarse_size[i] = final_coarse_size; } /* Set reserved coarse indexes to be kept to the coarsest level of the MGR solver */ hypre_TFree((mgr_data -> reserved_Cpoint_local_indexes), HYPRE_MEMORY_HOST); if (reserved_coarse_size > 0) { (mgr_data -> reserved_Cpoint_local_indexes) = hypre_CTAlloc(HYPRE_Int, reserved_coarse_size, HYPRE_MEMORY_HOST); reserved_Cpoint_local_indexes = (mgr_data -> reserved_Cpoint_local_indexes); for (i = 0; i < reserved_coarse_size; i++) { row = reserved_coarse_indexes[i]; HYPRE_Int local_row = (HYPRE_Int)(row - ilower); reserved_Cpoint_local_indexes[i] = local_row; HYPRE_Int lvl = lvl_to_keep_cpoints == 0 ? max_num_coarse_levels : lvl_to_keep_cpoints; if (set_c_points_method < 2) { idx = row % block_size; for (j = 0; j < lvl; j++) { if (block_cf_marker[j][idx] != CMRK) { level_coarse_indexes[j][level_coarse_size[j]++] = local_row; } } } else { HYPRE_Int isCpoint = 0; for (j = 0; j < lvl; j++) { HYPRE_Int k; for (k = 0; k < block_num_coarse_indexes[j]; k++) { if (point_marker_array[local_row] == block_cf_marker[j][k]) { isCpoint = 1; break; } } if (!isCpoint) { level_coarse_indexes[j][level_coarse_size[j]++] = local_row; } } } } } (mgr_data -> level_coarse_indexes) = level_coarse_indexes; (mgr_data -> num_coarse_per_level) = level_coarse_size; /* Free Previously allocated data, if any not destroyed */ if (A_array || B_array || B_FF_array || P_array || R_array || RT_array || CF_marker_array) { for (j = 1; j < (old_num_coarse_levels); j++) { if (A_array[j]) { hypre_ParCSRMatrixDestroy(A_array[j]); A_array[j] = NULL; } } for (j = 0; j < old_num_coarse_levels; j++) { if (B_array[j]) { hypre_ParCSRMatrixDestroy(B_array[j]); B_array[j] = NULL; } if (B_FF_array[j]) { hypre_ParCSRMatrixDestroy(B_FF_array[j]); B_FF_array[j] = NULL; } if (P_array[j]) { hypre_ParCSRMatrixDestroy(P_array[j]); P_array[j] = NULL; } if (R_array[j]) { hypre_ParCSRMatrixDestroy(R_array[j]); R_array[j] = NULL; } if (RT_array[j]) { hypre_ParCSRMatrixDestroy(RT_array[j]); RT_array[j] = NULL; } if (CF_marker_array[j]) { hypre_IntArrayDestroy(CF_marker_array[j]); CF_marker_array[j] = NULL; } } hypre_TFree(B_array, HYPRE_MEMORY_HOST); hypre_TFree(B_FF_array, HYPRE_MEMORY_HOST); hypre_TFree(P_array, HYPRE_MEMORY_HOST); hypre_TFree(R_array, HYPRE_MEMORY_HOST); hypre_TFree(RT_array, HYPRE_MEMORY_HOST); hypre_TFree(CF_marker_array, HYPRE_MEMORY_HOST); } #if defined(HYPRE_USING_GPU) if (P_FF_array) { for (j = 0; j < old_num_coarse_levels; j++) { if (P_FF_array[j]) { hypre_ParCSRMatrixDestroy(P_FF_array[j]); P_FF_array[j] = NULL; } } hypre_TFree(P_FF_array, HYPRE_MEMORY_HOST); } #endif /* Free previously allocated FrelaxVcycleData if not destroyed */ if ((mgr_data -> VcycleRelaxZtemp)) { hypre_ParVectorDestroy((mgr_data -> VcycleRelaxZtemp)); (mgr_data -> VcycleRelaxZtemp) = NULL; } if ((mgr_data -> VcycleRelaxVtemp)) { hypre_ParVectorDestroy((mgr_data -> VcycleRelaxVtemp)); (mgr_data -> VcycleRelaxVtemp) = NULL; } if ((mgr_data -> FrelaxVcycleData)) { for (j = 0; j < old_num_coarse_levels; j++) { if ((mgr_data -> FrelaxVcycleData)[j]) { hypre_MGRDestroyFrelaxVcycleData((mgr_data -> FrelaxVcycleData)[j]); (mgr_data -> FrelaxVcycleData)[j] = NULL; } } hypre_TFree((mgr_data -> FrelaxVcycleData), HYPRE_MEMORY_HOST); (mgr_data -> FrelaxVcycleData) = NULL; } /* destroy previously allocated Gaussian Elim. data */ if ((mgr_data -> GSElimData)) { for (j = 0; j < old_num_coarse_levels; j++) { if ((mgr_data -> GSElimData)[j]) { hypre_MGRDestroyGSElimData((mgr_data -> GSElimData)[j]); (mgr_data -> GSElimData)[j] = NULL; } } hypre_TFree((mgr_data -> GSElimData), HYPRE_MEMORY_HOST); (mgr_data -> GSElimData) = NULL; } /* destroy final coarse grid matrix, if not previously destroyed */ if ((mgr_data -> RAP)) { hypre_ParCSRMatrixDestroy((mgr_data -> RAP)); (mgr_data -> RAP) = NULL; } /* Setup for global block smoothers*/ if (set_c_points_method == 0) { if (my_id == num_procs) { mgr_data -> n_block = (n - reserved_coarse_size) / block_size; mgr_data -> left_size = n - block_size * (mgr_data -> n_block); } else { mgr_data -> n_block = n / block_size; mgr_data -> left_size = n - block_size * (mgr_data -> n_block); } } else { mgr_data -> n_block = n; mgr_data -> left_size = 0; } /* clear old l1_norm data, if created */ if ((mgr_data -> l1_norms)) { for (j = 0; j < (old_num_coarse_levels); j++) { if ((mgr_data -> l1_norms)[j]) { hypre_SeqVectorDestroy((mgr_data -> l1_norms)[i]); (mgr_data -> l1_norms)[j] = NULL; } } hypre_TFree((mgr_data -> l1_norms), HYPRE_MEMORY_HOST); } if ((mgr_data -> frelax_diaginv)) { for (j = 0; j < (old_num_coarse_levels); j++) { if ((mgr_data -> frelax_diaginv)[j]) { hypre_TFree((mgr_data -> frelax_diaginv)[j], HYPRE_MEMORY_HOST); (mgr_data -> frelax_diaginv)[j] = NULL; } } hypre_TFree((mgr_data -> frelax_diaginv), HYPRE_MEMORY_HOST); } if ((mgr_data -> level_diaginv)) { for (j = 0; j < (old_num_coarse_levels); j++) { if ((mgr_data -> level_diaginv)[j]) { hypre_TFree((mgr_data -> level_diaginv)[j], HYPRE_MEMORY_HOST); (mgr_data -> level_diaginv)[j] = NULL; } } hypre_TFree((mgr_data -> level_diaginv), HYPRE_MEMORY_HOST); } /* setup temporary storage */ if ((mgr_data -> Ztemp)) { hypre_ParVectorDestroy((mgr_data -> Ztemp)); (mgr_data -> Ztemp) = NULL; } if ((mgr_data -> Vtemp)) { hypre_ParVectorDestroy((mgr_data -> Vtemp)); (mgr_data -> Vtemp) = NULL; } if ((mgr_data -> Utemp)) { hypre_ParVectorDestroy((mgr_data -> Utemp)); (mgr_data -> Utemp) = NULL; } if ((mgr_data -> Ftemp)) { hypre_ParVectorDestroy((mgr_data -> Ftemp)); (mgr_data -> Ftemp) = NULL; } if ((mgr_data -> residual)) { hypre_ParVectorDestroy((mgr_data -> residual)); (mgr_data -> residual) = NULL; } hypre_TFree((mgr_data -> rel_res_norms), HYPRE_MEMORY_HOST); hypre_TFree((mgr_data -> blk_size), HYPRE_MEMORY_HOST); Vtemp = hypre_ParVectorCreate(hypre_ParCSRMatrixComm(A), hypre_ParCSRMatrixGlobalNumRows(A), hypre_ParCSRMatrixRowStarts(A)); hypre_ParVectorInitialize(Vtemp); (mgr_data ->Vtemp) = Vtemp; Ztemp = hypre_ParVectorCreate(hypre_ParCSRMatrixComm(A), hypre_ParCSRMatrixGlobalNumRows(A), hypre_ParCSRMatrixRowStarts(A)); hypre_ParVectorInitialize(Ztemp); (mgr_data -> Ztemp) = Ztemp; Utemp = hypre_ParVectorCreate(hypre_ParCSRMatrixComm(A), hypre_ParCSRMatrixGlobalNumRows(A), hypre_ParCSRMatrixRowStarts(A)); hypre_ParVectorInitialize(Utemp); (mgr_data ->Utemp) = Utemp; Ftemp = hypre_ParVectorCreate(hypre_ParCSRMatrixComm(A), hypre_ParCSRMatrixGlobalNumRows(A), hypre_ParCSRMatrixRowStarts(A)); hypre_ParVectorInitialize(Ftemp); (mgr_data ->Ftemp) = Ftemp; /* Allocate memory for level structure */ if (A_array == NULL) { A_array = hypre_CTAlloc(hypre_ParCSRMatrix*, max_num_coarse_levels + 1, HYPRE_MEMORY_HOST); } if (B_array == NULL) { B_array = hypre_CTAlloc(hypre_ParCSRMatrix*, max_num_coarse_levels, HYPRE_MEMORY_HOST); } if (P_array == NULL && max_num_coarse_levels > 0) { P_array = hypre_CTAlloc(hypre_ParCSRMatrix*, max_num_coarse_levels, HYPRE_MEMORY_HOST); } if (R_array == NULL && max_num_coarse_levels > 0) { R_array = hypre_CTAlloc(hypre_ParCSRMatrix*, max_num_coarse_levels, HYPRE_MEMORY_HOST); } #if defined(HYPRE_USING_GPU) if (P_FF_array == NULL && max_num_coarse_levels > 0) { P_FF_array = hypre_CTAlloc(hypre_ParCSRMatrix*, max_num_coarse_levels, HYPRE_MEMORY_HOST); } #endif if (RT_array == NULL && max_num_coarse_levels > 0) { RT_array = hypre_CTAlloc(hypre_ParCSRMatrix*, max_num_coarse_levels, HYPRE_MEMORY_HOST); } if (CF_marker_array == NULL) { CF_marker_array = hypre_CTAlloc(hypre_IntArray*, max_num_coarse_levels, HYPRE_MEMORY_HOST); } if (l1_norms == NULL) { l1_norms = hypre_CTAlloc(hypre_Vector*, max_num_coarse_levels, HYPRE_MEMORY_HOST); } if (P_max_elmts == NULL) { P_max_elmts = hypre_CTAlloc(HYPRE_Int, max_num_coarse_levels, HYPRE_MEMORY_HOST); } /* Set default for Frelax_method if not set already -- Supports deprecated function */ /* if (Frelax_method == NULL) { Frelax_method = hypre_CTAlloc(HYPRE_Int, max_num_coarse_levels, HYPRE_MEMORY_HOST); for (i = 0; i < max_num_coarse_levels; i++) { Frelax_method[i] = 0; } (mgr_data -> Frelax_method) = Frelax_method; } */ /* Set default for Frelax_type if not set already. * We also consolidate inputs from relax_type and Frelax_method here. * This should be simplified once the other options are removed. */ if (Frelax_type == NULL) { Frelax_type = hypre_CTAlloc(HYPRE_Int, max_num_coarse_levels, HYPRE_MEMORY_HOST); /* Use relax type/ frelax_method data or set default type to use */ if (Frelax_method) { for (i = 0; i < max_num_coarse_levels; i++) { Frelax_type[i] = Frelax_method[i] > 0 ? Frelax_method[i] : relax_type; } } else if (relax_type) { for (i = 0; i < max_num_coarse_levels; i++) { Frelax_type[i] = relax_type; } } else /* set default here */ { for (i = 0; i < max_num_coarse_levels; i++) { Frelax_type[i] = 0; } } (mgr_data -> Frelax_type) = Frelax_type; } /* When running on the device and using Jacobi relaxation, switch to GPU-supported Jacobi */ #if defined(HYPRE_USING_GPU) for (i = 0; i < max_num_coarse_levels; i++) { if (Frelax_type[i] == 0 && interp_type && interp_type[i] != 12) { Frelax_type[i] = 7; if (print_level) { hypre_ParPrintf(comm, "Changing F-relaxation type to 7 at MGR level %d\n", i); } } } #endif /* Set default for using Non-Galerkin coarse grid */ if (coarse_grid_method == NULL) { coarse_grid_method = hypre_CTAlloc(HYPRE_Int, max_num_coarse_levels, HYPRE_MEMORY_HOST); (mgr_data -> coarse_grid_method) = coarse_grid_method; } /* Set default for Non-Galerkin correction truncation */ if ((mgr_data -> nonglk_max_elmts) == NULL) { (mgr_data -> nonglk_max_elmts) = hypre_CTAlloc(HYPRE_Int, max_num_coarse_levels, HYPRE_MEMORY_HOST); for (i = 0; i < max_num_coarse_levels; i++) { (mgr_data -> nonglk_max_elmts)[i] = 1; } } /* Set default options for the interpolation type at each level if not already set */ if (interp_type == NULL) { interp_type = hypre_CTAlloc(HYPRE_Int, max_num_coarse_levels, HYPRE_MEMORY_HOST); for (i = 0; i < max_num_coarse_levels; i++) { interp_type[i] = 2; } (mgr_data -> interp_type) = interp_type; } /* Set default options for restriction type at each level if not already set */ if (restrict_type == NULL) { restrict_type = hypre_CTAlloc(HYPRE_Int, max_num_coarse_levels, HYPRE_MEMORY_HOST); for (i = 0; i < max_num_coarse_levels; i++) { restrict_type[i] = 0; } (mgr_data -> restrict_type) = restrict_type; } /* Set default number of sweeps at each level if not already set */ if (num_relax_sweeps == NULL) { num_relax_sweeps = hypre_CTAlloc(HYPRE_Int, max_num_coarse_levels, HYPRE_MEMORY_HOST); for (i = 0; i < max_num_coarse_levels; i++) { num_relax_sweeps[i] = 1; } (mgr_data -> num_relax_sweeps) = num_relax_sweeps; } /* set interp_type, restrict_type, and Frelax_type if we reduce the reserved C-points */ reserved_cpoints_eliminated = 0; if (lvl_to_keep_cpoints > 0 && reserved_coarse_size > 0) { HYPRE_Int *level_interp_type = hypre_CTAlloc(HYPRE_Int, max_num_coarse_levels, HYPRE_MEMORY_HOST); HYPRE_Int *level_restrict_type = hypre_CTAlloc(HYPRE_Int, max_num_coarse_levels, HYPRE_MEMORY_HOST); HYPRE_Int *level_frelax_type = hypre_CTAlloc(HYPRE_Int, max_num_coarse_levels, HYPRE_MEMORY_HOST); for (i = 0; i < max_num_coarse_levels; i++) { if (i == lvl_to_keep_cpoints) { level_interp_type[i] = 2; level_restrict_type[i] = 0; level_frelax_type[i] = 2; //99; reserved_cpoints_eliminated++; } else { level_interp_type[i] = interp_type[i - reserved_cpoints_eliminated]; level_restrict_type[i] = restrict_type[i - reserved_cpoints_eliminated]; level_frelax_type[i] = Frelax_type[i - reserved_cpoints_eliminated]; } } hypre_TFree(interp_type, HYPRE_MEMORY_HOST); hypre_TFree(restrict_type, HYPRE_MEMORY_HOST); hypre_TFree(Frelax_type, HYPRE_MEMORY_HOST); interp_type = level_interp_type; restrict_type = level_restrict_type; Frelax_type = level_frelax_type; (mgr_data -> interp_type) = level_interp_type; (mgr_data -> restrict_type) = level_restrict_type; (mgr_data -> Frelax_type) = level_frelax_type; } /* set pointers to mgr data */ (mgr_data -> A_array) = A_array; (mgr_data -> B_array) = B_array; (mgr_data -> P_array) = P_array; (mgr_data -> R_array) = R_array; (mgr_data -> RT_array) = RT_array; (mgr_data -> CF_marker_array) = CF_marker_array; (mgr_data -> l1_norms) = l1_norms; (mgr_data -> P_max_elmts) = P_max_elmts; #if defined(HYPRE_USING_GPU) (mgr_data -> P_FF_array) = P_FF_array; #endif /* Set up solution and rhs arrays */ if (F_array != NULL || U_array != NULL) { for (j = 1; j < old_num_coarse_levels + 1; j++) { if (F_array[j] != NULL) { hypre_ParVectorDestroy(F_array[j]); F_array[j] = NULL; } if (U_array[j] != NULL) { hypre_ParVectorDestroy(U_array[j]); U_array[j] = NULL; } } } if (F_array == NULL) { F_array = hypre_CTAlloc(hypre_ParVector*, max_num_coarse_levels + 1, HYPRE_MEMORY_HOST); } if (U_array == NULL) { U_array = hypre_CTAlloc(hypre_ParVector*, max_num_coarse_levels + 1, HYPRE_MEMORY_HOST); } /* TODO: Change to A_FF_array (VPM) */ if (A_ff_array) { for (j = 1; j < old_num_coarse_levels; j++) { if (A_ff_array[j]) { hypre_ParCSRMatrixDestroy(A_ff_array[j]); A_ff_array[j] = NULL; } } if (mgr_data -> fsolver_mode != 0) { if (A_ff_array[0]) { hypre_ParCSRMatrixDestroy(A_ff_array[0]); A_ff_array[0] = NULL; } } hypre_TFree(A_ff_array, HYPRE_MEMORY_HOST); A_ff_array = NULL; } if (aff_solver) { for (j = 1; j < (old_num_coarse_levels); j++) { if (aff_solver[j]) { aff_base = (hypre_Solver*) aff_solver[j]; hypre_SolverDestroy(aff_base)((HYPRE_Solver) (aff_base)); aff_solver[j] = NULL; } } if (mgr_data -> fsolver_mode == 2) { hypre_BoomerAMGDestroy(aff_solver[0]); } } if ((mgr_data -> fine_grid_solver_setup) != NULL) { fgrid_solver_setup = (mgr_data -> fine_grid_solver_setup); } else { fgrid_solver_setup = (HYPRE_Int (*)(void*, void*, void*, void*)) hypre_BoomerAMGSetup; (mgr_data -> fine_grid_solver_setup) = fgrid_solver_setup; } if ((mgr_data -> fine_grid_solver_solve) != NULL) { fgrid_solver_solve = (mgr_data -> fine_grid_solver_solve); } else { fgrid_solver_solve = (HYPRE_Int (*)(void*, void*, void*, void*)) hypre_BoomerAMGSolve; (mgr_data -> fine_grid_solver_solve) = fgrid_solver_solve; } /* Set up solution and rhs arrays for Frelax */ if (F_fine_array != NULL || U_fine_array != NULL) { for (j = 1; j < old_num_coarse_levels + 1; j++) { if (F_fine_array[j] != NULL) { hypre_ParVectorDestroy(F_fine_array[j]); F_fine_array[j] = NULL; } if (U_fine_array[j] != NULL) { hypre_ParVectorDestroy(U_fine_array[j]); U_fine_array[j] = NULL; } } } if (F_fine_array == NULL) { F_fine_array = hypre_CTAlloc(hypre_ParVector*, max_num_coarse_levels + 1, HYPRE_MEMORY_HOST); } if (U_fine_array == NULL) { U_fine_array = hypre_CTAlloc(hypre_ParVector*, max_num_coarse_levels + 1, HYPRE_MEMORY_HOST); } if (aff_solver == NULL) { aff_solver = hypre_CTAlloc(HYPRE_Solver*, max_num_coarse_levels, HYPRE_MEMORY_HOST); } if (A_ff_array == NULL) { A_ff_array = hypre_CTAlloc(hypre_ParCSRMatrix*, max_num_coarse_levels, HYPRE_MEMORY_HOST); } if (B_FF_array == NULL) { B_FF_array = hypre_CTAlloc(hypre_ParCSRMatrix*, max_num_coarse_levels, HYPRE_MEMORY_HOST); } if (frelax_diaginv == NULL) { frelax_diaginv = hypre_CTAlloc(HYPRE_Real*, max_num_coarse_levels, HYPRE_MEMORY_HOST); } if (level_diaginv == NULL) { level_diaginv = hypre_CTAlloc(HYPRE_Real*, max_num_coarse_levels, HYPRE_MEMORY_HOST); } if (blk_size == NULL) { blk_size = hypre_CTAlloc(HYPRE_Int, max_num_coarse_levels, HYPRE_MEMORY_HOST); } if (level_smooth_type == NULL) { level_smooth_type = hypre_CTAlloc(HYPRE_Int, max_num_coarse_levels, HYPRE_MEMORY_HOST); } if (level_smooth_iters == NULL) { level_smooth_iters = hypre_CTAlloc(HYPRE_Int, max_num_coarse_levels, HYPRE_MEMORY_HOST); } if (level_smoother == NULL) { level_smoother = hypre_CTAlloc(HYPRE_Solver, max_num_coarse_levels, HYPRE_MEMORY_HOST); } /* set solution and rhs pointers */ F_array[0] = f; U_array[0] = u; (mgr_data -> F_array) = F_array; (mgr_data -> U_array) = U_array; (mgr_data -> F_fine_array) = F_fine_array; (mgr_data -> U_fine_array) = U_fine_array; (mgr_data -> aff_solver) = aff_solver; (mgr_data -> A_ff_array) = A_ff_array; (mgr_data -> B_FF_array) = B_FF_array; (mgr_data -> frelax_diaginv) = frelax_diaginv; (mgr_data -> level_diaginv) = level_diaginv; (mgr_data -> blk_size) = blk_size; (mgr_data -> level_smooth_type) = level_smooth_type; (mgr_data -> level_smooth_iters) = level_smooth_iters; (mgr_data -> level_smoother) = level_smoother; /* begin coarsening loop */ num_coarsening_levs = max_num_coarse_levels; /* Close MGRSetup-Init region */ hypre_GpuProfilingPopRange(); /* Initialize first entry in A_array to the input matrix */ A_array[0] = A; /* loop over levels of coarsening */ for (lev = 0; lev < num_coarsening_levs; lev++) { hypre_sprintf(region_name, "%s-%d", "MGR_Level", lev); hypre_GpuProfilingPushRange(region_name); HYPRE_ANNOTATE_REGION_BEGIN("%s", region_name); /* Check if this is the last level */ last_level = (lev == (num_coarsening_levs - 1)); /* Set level's block size */ level_blk_size = (lev == 0) ? block_size : block_num_coarse_indexes[lev - 1]; /* Get number of local unknowns */ nloc = hypre_ParCSRMatrixNumRows(A_array[lev]); /* Reset pointers */ l1_norms_data = NULL; /* Setup global smoother */ hypre_sprintf(region_name, "Global-Relax"); hypre_GpuProfilingPushRange(region_name); HYPRE_ANNOTATE_REGION_BEGIN("%s", region_name); /* TODO (VPM): Change option types for block-Jacobi and block-GS to 30 and 31 and make them accessible through hypre_BoomerAMGRelax? */ if (level_smooth_iters[lev] > 0) { if (level_smoother[lev]) { hypre_Solver *smoother_base = (hypre_Solver*) level_smoother[lev]; /* Call setup function */ hypre_SolverSetup(smoother_base)((HYPRE_Solver) level_smoother[lev], (HYPRE_Matrix) A_array[lev], NULL, NULL); } else if (level_smooth_type[lev] == 0 || level_smooth_type[lev] == 1) { /* TODO (VPM): move this to hypre_MGRBlockRelaxSetup and change its declaration */ #if defined (HYPRE_USING_GPU) if (exec == HYPRE_EXEC_DEVICE) { if (!B_array[lev]) { hypre_ParCSRMatrixBlockDiagMatrixDevice(A_array[lev], level_blk_size, 0, NULL, 1, &B_array[lev]); } } else #endif { hypre_MGRBlockRelaxSetup(A_array[lev], level_blk_size, &(mgr_data -> level_diaginv)[lev]); } } else if (level_smooth_type[lev] == 8) { /* TODO (VPM): Option 8 should be for hybrid L1 Symm. Gauss-Seidel */ HYPRE_EuclidCreate(comm, &(level_smoother[lev])); HYPRE_EuclidSetLevel(level_smoother[lev], 0); HYPRE_EuclidSetBJ(level_smoother[lev], 1); HYPRE_EuclidSetup(level_smoother[lev], A_array[lev], NULL, NULL); } else if (level_smooth_type[lev] == 16) { /* TODO (VPM): Option 16 should be for Chebyshev */ HYPRE_ILUCreate(&(level_smoother[lev])); HYPRE_ILUSetType(level_smoother[lev], 0); HYPRE_ILUSetLevelOfFill(level_smoother[lev], 0); HYPRE_ILUSetMaxIter(level_smoother[lev], level_smooth_iters[lev]); HYPRE_ILUSetTol(level_smoother[lev], 0.0); HYPRE_ILUSetLocalReordering(level_smoother[lev], 0); HYPRE_ILUSetup(level_smoother[lev], A_array[lev], NULL, NULL); } else { /* Compute l1_norms according to relaxation type */ hypre_BoomerAMGRelaxComputeL1Norms(A_array[lev], level_smooth_type[lev], 0, 0, NULL, &l1_norms_data); if (l1_norms_data) { l1_norms[lev] = hypre_SeqVectorCreate(nloc); hypre_VectorData(l1_norms[lev]) = l1_norms_data; hypre_VectorMemoryLocation(l1_norms[lev]) = memory_location; if (print_level) { hypre_ParPrintf(comm, "Setting l1_norms for global relax at MGR level %d\n", i); } } } } hypre_GpuProfilingPopRange(); HYPRE_ANNOTATE_REGION_END("%s", region_name); /* Compute strength matrix for interpolation operator use default parameters, to be modified later */ hypre_sprintf(region_name, "Coarsen"); hypre_GpuProfilingPushRange(region_name); HYPRE_ANNOTATE_REGION_BEGIN("%s", region_name); cflag = last_level || setNonCpointToF; if (interp_type[lev] == 3 || interp_type[lev] == 5 || interp_type[lev] == 6 || interp_type[lev] == 7 || !cflag) { hypre_BoomerAMGCreateS(A_array[lev], strong_threshold, max_row_sum, 1, NULL, &S); } /* Coarsen: Build CF_marker array based on rows of A */ hypre_MGRCoarsen(S, A_array[lev], level_coarse_size[lev], level_coarse_indexes[lev], debug_flag, &CF_marker_array[lev], cflag); CF_marker = hypre_IntArrayData(CF_marker_array[lev]); /* Get global fine/coarse partitionings. TODO: generate dof_func */ hypre_MGRCoarseParms(comm, nloc, CF_marker_array[lev], coarse_pnts_global, row_starts_fpts); hypre_GpuProfilingPopRange(); HYPRE_ANNOTATE_REGION_END("%s", region_name); /* Compute Petrov-Galerkin operators */ num_interp_sweeps = (mgr_data -> num_interp_sweeps); if (mgr_data -> block_jacobi_bsize == 0) { block_jacobi_bsize = level_blk_size - block_num_coarse_indexes[lev]; } if (block_jacobi_bsize == 1 && interp_type[lev] == 12) { interp_type[lev] = 2; } /* Compute C/F splitting (needed by RAP computation and other operations) */ FC_marker = hypre_IntArrayCloneDeep(CF_marker_array[lev]); hypre_IntArrayNegate(FC_marker); hypre_ParCSRMatrixGenerateFFFC(A_array[lev], CF_marker, coarse_pnts_global, NULL, &A_FC, &A_FF); hypre_ParCSRMatrixGenerateFFFC(A_array[lev], hypre_IntArrayData(FC_marker), row_starts_fpts, NULL, &A_CF, &A_CC); /* Build interpolation operator */ hypre_MGRBuildInterp(A_array[lev], A_FF, A_FC, S, CF_marker_array[lev], coarse_pnts_global, trunc_factor, P_max_elmts[lev], block_jacobi_bsize, interp_type[lev], num_interp_sweeps, &Wp, &P); P_array[lev] = P; /* Build Restriction operator */ if (block_jacobi_bsize == 1 && restrict_type[lev] == 12) { restrict_type[lev] = 2; } hypre_MGRBuildRestrict(A_array[lev], A_FF, A_FC, A_CF, CF_marker_array[lev], coarse_pnts_global, trunc_factor, P_max_elmts[lev], strong_threshold, max_row_sum, block_jacobi_bsize, restrict_type[lev], &Wr, &R, &RT); R_array[lev] = R; RT_array[lev] = RT; /* Use block Jacobi F-relaxation with block Jacobi interpolation */ hypre_sprintf(region_name, "F-Relax"); hypre_GpuProfilingPushRange(region_name); HYPRE_ANNOTATE_REGION_BEGIN("%s", region_name); if (interp_type[lev] == 12 && (mgr_data -> num_relax_sweeps)[lev] > 0) { /* TODO: refactor the following block (VPM) */ #if defined (HYPRE_USING_GPU) if (exec == HYPRE_EXEC_DEVICE) { hypre_ParCSRMatrixBlockDiagMatrixDevice(A_FF, block_jacobi_bsize, 0, NULL, 1, &B_FF_array[lev]); } else #endif { HYPRE_Real *diag_inv = NULL; HYPRE_Int inv_num_rows; HYPRE_Int inv_size; /* TODO: replace this with hypre_IntArrayCount (VPM) */ inv_num_rows = 0; for (i = 0; i < nloc; i++) { inv_num_rows += (CF_marker[i] == -1) ? 1 : 0; } /* Extract block diagonal inverses */ inv_size = inv_num_rows * block_jacobi_bsize; diag_inv = hypre_CTAlloc(HYPRE_Complex, inv_size, HYPRE_MEMORY_HOST); /* TODO: Extend this to device (VPM) */ hypre_ParCSRMatrixExtractBlockDiagHost(A_array[lev], block_jacobi_bsize, inv_num_rows, -1, CF_marker, inv_size, 1, diag_inv); frelax_diaginv[lev] = diag_inv; blk_size[lev] = block_jacobi_bsize; if (!A_FF) { hypre_MGRBuildAff(A_array[lev], CF_marker, debug_flag, &A_FF); } } /* Set A_ff pointer */ A_ff_array[lev] = A_FF; F_fine_array[lev + 1] = hypre_ParVectorCreate(hypre_ParCSRMatrixComm(A_FF), hypre_ParCSRMatrixGlobalNumRows(A_FF), hypre_ParCSRMatrixRowStarts(A_FF)); hypre_ParVectorInitialize(F_fine_array[lev + 1]); U_fine_array[lev + 1] = hypre_ParVectorCreate(hypre_ParCSRMatrixComm(A_FF), hypre_ParCSRMatrixGlobalNumRows(A_FF), hypre_ParCSRMatrixRowStarts(A_FF)); hypre_ParVectorInitialize(U_fine_array[lev + 1]); } hypre_GpuProfilingPopRange(); HYPRE_ANNOTATE_REGION_END("%s", region_name); /* Compute coarse level matrix */ hypre_MGRBuildCoarseOperator(mgr_vdata, A_FF, A_FC, A_CF, &A_CC, Wp, Wr, lev); /* Destroy temporary variables */ hypre_ParCSRMatrixDestroy(A_FC), A_FC = NULL; hypre_ParCSRMatrixDestroy(A_CF), A_CF = NULL; hypre_ParCSRMatrixDestroy(A_CC), A_CC = NULL; hypre_ParCSRMatrixDestroy(Wr); Wr = NULL; if (Wp) { hypre_ParCSRMatrixDestroy(Wp); Wp = NULL; } /* User-prescribed F-solver */ if (Frelax_type[lev] == 2 || Frelax_type[lev] == 9 || Frelax_type[lev] == 99 || Frelax_type[lev] == 199) { if (lev == 0 && (mgr_data -> fsolver_mode) == 0) { if (Frelax_type[lev] == 2) { if (((hypre_ParAMGData*)aff_solver[lev])->A_array != NULL) { if (((hypre_ParAMGData*)aff_solver[lev])->A_array[0] != NULL) { /* F-solver is already set up, only need to store A_ff_ptr */ A_ff_array[lev] = ((hypre_ParAMGData*) aff_solver[lev]) -> A_array[0]; } else { hypre_error_w_msg(HYPRE_ERROR_GENERIC, "F-relaxation solver has not been setup\n"); HYPRE_ANNOTATE_FUNC_END; hypre_GpuProfilingPopRange(); hypre_GpuProfilingPopRange(); return hypre_error_flag; } } else /* F-relaxation solver prescribed but not set up */ { /* Save A_FF splitting */ A_ff_array[lev] = A_FF; /* Setup F-solver */ fgrid_solver_setup(aff_solver[lev], A_ff_array[lev], F_fine_array[lev + 1], U_fine_array[lev + 1]); (mgr_data -> fsolver_mode) = 1; } } else if (aff_solver[lev]) { hypre_sprintf(msg, "Warning!! User-prescribed F-solver for the first level\n\ reduction (set in HYPRE_MGRSetFSolver()) only supports AMG\n\ Ignoring this call and using user prescribed Frelax_type %d", Frelax_type[lev]); hypre_error_w_msg(0, msg); } } else if (aff_solver[lev]) { aff_base = (hypre_Solver*) aff_solver[lev]; /* Save A_FF splitting */ A_ff_array[lev] = A_FF; /* Call setup function */ hypre_SolverSetup(aff_base)((HYPRE_Solver) aff_solver[lev], (HYPRE_Matrix) A_ff_array[lev], (HYPRE_Vector) F_fine_array[lev + 1], (HYPRE_Vector) U_fine_array[lev + 1]); } else if (Frelax_type[lev] == 2) /* Construct default AMG solver */ { /* Save A_FF splitting */ A_ff_array[lev] = A_FF; /* Create BoomerAMG solver for A_FF */ aff_solver[lev] = (HYPRE_Solver*) hypre_BoomerAMGCreate(); hypre_BoomerAMGSetMaxIter(aff_solver[lev], (mgr_data -> num_relax_sweeps)[lev]); hypre_BoomerAMGSetTol(aff_solver[lev], 0.0); //hypre_BoomerAMGSetStrongThreshold(aff_solver[lev], 0.6); #if defined(HYPRE_USING_GPU) hypre_BoomerAMGSetRelaxType(aff_solver[lev], 18); hypre_BoomerAMGSetCoarsenType(aff_solver[lev], 8); hypre_BoomerAMGSetNumSweeps(aff_solver[lev], 3); #else hypre_BoomerAMGSetRelaxOrder(aff_solver[lev], 1); #endif hypre_BoomerAMGSetPrintLevel(aff_solver[lev], mgr_data -> frelax_print_level); fgrid_solver_setup(aff_solver[lev], A_ff_array[lev], F_fine_array[lev + 1], U_fine_array[lev + 1]); (mgr_data -> fsolver_mode) = 2; } else { /* Save A_FF splitting */ A_ff_array[lev] = A_FF; } /* TODO: Check use of A_ff_array[lev], vectors at (lev + 1) are correct? (VPM) */ if (!F_fine_array[lev + 1]) { F_fine_array[lev + 1] = hypre_ParVectorCreate(hypre_ParCSRMatrixComm(A_ff_array[lev]), hypre_ParCSRMatrixGlobalNumRows(A_ff_array[lev]), hypre_ParCSRMatrixRowStarts(A_ff_array[lev])); hypre_ParVectorInitialize(F_fine_array[lev + 1]); } if (!U_fine_array[lev + 1]) { U_fine_array[lev + 1] = hypre_ParVectorCreate(hypre_ParCSRMatrixComm(A_ff_array[lev]), hypre_ParCSRMatrixGlobalNumRows(A_ff_array[lev]), hypre_ParCSRMatrixRowStarts(A_ff_array[lev])); hypre_ParVectorInitialize(U_fine_array[lev + 1]); } } /* TODO: refactor this block (VPM) */ #if defined (HYPRE_USING_GPU) if (exec == HYPRE_EXEC_DEVICE) { hypre_MGRBuildPDevice(A_array[lev], hypre_IntArrayData(FC_marker), row_starts_fpts, 0, &P_FF_array[lev]); } #endif /* Destroy A_FF if it has not been saved on A_ff_array[lev] */ if (!A_ff_array[lev]) { hypre_ParCSRMatrixDestroy(A_FF); } A_FF = NULL; hypre_IntArrayDestroy(FC_marker); /* TODO: move this to par_mgr_coarsen.c and port to GPUs (VPM) */ /* Update coarse level indexes for next levels */ if (lev < num_coarsening_levs - 1) { for (i = lev + 1; i < max_num_coarse_levels; i++) { memory_location = hypre_IntArrayMemoryLocation(CF_marker_array[lev]); if (hypre_GetActualMemLocation(memory_location) == hypre_MEMORY_DEVICE) { hypre_IntArrayMigrate(CF_marker_array[lev], HYPRE_MEMORY_HOST); } CF_marker = hypre_IntArrayData(CF_marker_array[lev]); /* First mark indexes to be updated */ for (j = 0; j < level_coarse_size[i]; j++) { CF_marker[level_coarse_indexes[i][j]] = S_CMRK; } /* Next: loop over levels to update indexes */ nc = 0; index_i = 0; for (j = 0; j < nloc; j++) { if (CF_marker[j] == CMRK) { nc++; } if (CF_marker[j] == S_CMRK) { level_coarse_indexes[i][index_i++] = nc++; } //if(index_i == level_coarse_size[i]) break; } hypre_assert(index_i == level_coarse_size[i]); // then: reset previously marked indexes for (j = 0; j < level_coarse_size[lev]; j++) { CF_marker[level_coarse_indexes[lev][j]] = CMRK; } if (hypre_GetActualMemLocation(memory_location) == hypre_MEMORY_DEVICE) { hypre_IntArrayMigrate(CF_marker_array[lev], HYPRE_MEMORY_DEVICE); } } } /* Update reserved coarse indexes to be kept to coarsest level * first mark indexes to be updated * skip if we reduce the reserved C-points before the coarse grid solve */ if (mgr_data -> lvl_to_keep_cpoints == 0) { memory_location = hypre_IntArrayMemoryLocation(CF_marker_array[lev]); if (hypre_GetActualMemLocation(memory_location) == hypre_MEMORY_DEVICE) { hypre_IntArrayMigrate(CF_marker_array[lev], HYPRE_MEMORY_HOST); } CF_marker = hypre_IntArrayData(CF_marker_array[lev]); for (i = 0; i < reserved_coarse_size; i++) { CF_marker[reserved_Cpoint_local_indexes[i]] = S_CMRK; } /* loop to update reserved Cpoints */ nc = 0; index_i = 0; for (i = 0; i < nloc; i++) { if (CF_marker[i] == CMRK) { nc++; } if (CF_marker[i] == S_CMRK) { reserved_Cpoint_local_indexes[index_i++] = nc++; /* reset modified CF marker array indexes */ CF_marker[i] = CMRK; } } if (hypre_GetActualMemLocation(memory_location) == hypre_MEMORY_DEVICE) { hypre_IntArrayMigrate(CF_marker_array[lev], HYPRE_MEMORY_DEVICE); } } /* allocate space for solution and rhs arrays */ F_array[lev + 1] = hypre_ParVectorCreate(hypre_ParCSRMatrixComm(A_array[lev + 1]), hypre_ParCSRMatrixGlobalNumRows(A_array[lev + 1]), hypre_ParCSRMatrixRowStarts(A_array[lev + 1])); hypre_ParVectorInitialize(F_array[lev + 1]); U_array[lev + 1] = hypre_ParVectorCreate(hypre_ParCSRMatrixComm(A_array[lev + 1]), hypre_ParCSRMatrixGlobalNumRows(A_array[lev + 1]), hypre_ParCSRMatrixRowStarts(A_array[lev + 1])); hypre_ParVectorInitialize(U_array[lev + 1]); /* free memory before starting next level */ hypre_ParCSRMatrixDestroy(S); S = NULL; /* check if Vcycle smoother setup required */ if ((mgr_data -> max_local_lvls) > 1) { if (Frelax_type[lev] == 1) { use_VcycleSmoother = 1; // use_ComplexSmoother = 1; } } else { /* Only check for vcycle smoother option. * Currently leaves Frelax_type[lev] = 2 (full amg) option as is */ if (Frelax_type[lev] == 1) { Frelax_type[lev] = 0; } } if (Frelax_type[lev] == 9 || Frelax_type[lev] == 99 || Frelax_type[lev] == 199 ) { use_GSElimSmoother = 1; } hypre_sprintf(region_name, "%s-%d", "MGR_Level", lev); hypre_GpuProfilingPopRange(); HYPRE_ANNOTATE_REGION_END("%s", region_name); /* check if last level */ if (last_level) { num_c_levels = lev + 1; lev = num_coarsening_levs; } } /* set pointer to last level matrix */ (mgr_data -> num_coarse_levels) = num_c_levels; /* setup default coarsest grid solver (BoomerAMG) */ if (use_default_cgrid_solver) { if (my_id == 0 && print_level > 0) { hypre_printf("No coarse grid solver provided. Using default AMG solver ... \n"); } /* create and set default solver parameters here */ default_cg_solver = (HYPRE_Solver) hypre_BoomerAMGCreate(); hypre_BoomerAMGSetMaxIter(default_cg_solver, 1); hypre_BoomerAMGSetTol(default_cg_solver, 0.0); hypre_BoomerAMGSetRelaxOrder(default_cg_solver, 1); hypre_BoomerAMGSetPrintLevel(default_cg_solver, mgr_data -> cg_print_level); /* set setup and solve functions */ cgrid_solver_setup = (HYPRE_Int (*)(void*, void*, void*, void*)) hypre_BoomerAMGSetup; cgrid_solver_solve = (HYPRE_Int (*)(void*, void*, void*, void*)) hypre_BoomerAMGSolve; (mgr_data -> coarse_grid_solver_setup) = cgrid_solver_setup; (mgr_data -> coarse_grid_solver_solve) = cgrid_solver_solve; (mgr_data -> coarse_grid_solver) = default_cg_solver; } /* keep reserved coarse indexes to coarsest grid */ if (reserved_coarse_size > 0 && lvl_to_keep_cpoints == 0) { ilower = hypre_ParCSRMatrixFirstRowIndex(A_array[num_c_levels]); for (i = 0; i < reserved_coarse_size; i++) { reserved_coarse_indexes[i] = (HYPRE_BigInt) (reserved_Cpoint_local_indexes[i] + ilower); } HYPRE_BoomerAMGSetCPoints((mgr_data ->coarse_grid_solver), 25, reserved_coarse_size, reserved_coarse_indexes); } /* Setup coarse grid solver */ hypre_sprintf(region_name, "%s-%d", "MGR_Level", num_c_levels); hypre_GpuProfilingPushRange(region_name); HYPRE_ANNOTATE_REGION_BEGIN("%s", region_name); cgrid_solver_setup((mgr_data -> coarse_grid_solver), A_array[num_c_levels], F_array[num_c_levels], U_array[num_c_levels]); hypre_GpuProfilingPopRange(); HYPRE_ANNOTATE_REGION_END("%s", region_name); /* Allocate l1_norms when necessary TODO (VPM): move this block closer to global smoother setup */ for (j = 0; j < num_c_levels; j++) { if (!l1_norms[j]) { /* Compute l1_norms according to relaxation type */ hypre_BoomerAMGRelaxComputeL1Norms(A_array[j], Frelax_type[j], relax_order, 0, CF_marker_array[j], &l1_norms_data); if (l1_norms_data) { l1_norms[j] = hypre_SeqVectorCreate(hypre_ParCSRMatrixNumRows(A_array[j])); hypre_VectorData(l1_norms[j]) = l1_norms_data; hypre_VectorMemoryLocation(l1_norms[j]) = memory_location; } } } /* Setup Vcycle data for Frelax_type == 1 */ if (use_VcycleSmoother) { /* allocate memory and set pointer to (mgr_data -> FrelaxVcycleData) */ FrelaxVcycleData = hypre_TAlloc(hypre_ParAMGData*, max_num_coarse_levels, HYPRE_MEMORY_HOST); (mgr_data -> FrelaxVcycleData) = FrelaxVcycleData; /* Setup temporary storage - TODO (VPM): Use hypre_ParVectorInitialize_v2 */ VcycleRelaxVtemp = hypre_ParVectorCreate(hypre_ParCSRMatrixComm(A), hypre_ParCSRMatrixGlobalNumRows(A), hypre_ParCSRMatrixRowStarts(A)); hypre_ParVectorInitialize(VcycleRelaxVtemp); (mgr_data ->VcycleRelaxVtemp) = VcycleRelaxVtemp; VcycleRelaxZtemp = hypre_ParVectorCreate(hypre_ParCSRMatrixComm(A), hypre_ParCSRMatrixGlobalNumRows(A), hypre_ParCSRMatrixRowStarts(A)); hypre_ParVectorInitialize(VcycleRelaxZtemp); (mgr_data -> VcycleRelaxZtemp) = VcycleRelaxZtemp; /* loop over levels */ for (i = 0; i < (mgr_data->num_coarse_levels); i++) { if (Frelax_type[i] == 1) { FrelaxVcycleData[i] = (hypre_ParAMGData*) hypre_MGRCreateFrelaxVcycleData(); if (Frelax_num_functions != NULL) { hypre_ParAMGDataNumFunctions(FrelaxVcycleData[i]) = Frelax_num_functions[i]; } (FrelaxVcycleData[i] -> Vtemp) = VcycleRelaxVtemp; (FrelaxVcycleData[i] -> Ztemp) = VcycleRelaxZtemp; /* Setup variables for the V-cycle in the F-relaxation step */ hypre_MGRSetupFrelaxVcycleData(mgr_data, A_array[i], F_array[i], U_array[i], i); } } } else if (use_GSElimSmoother) { /* Allocate memory and set pointer to (mgr_data -> GSElimData) */ GSElimData = hypre_CTAlloc(hypre_ParAMGData*, max_num_coarse_levels, HYPRE_MEMORY_HOST); (mgr_data -> GSElimData) = GSElimData; /* loop over levels */ for (i = 0; i < (mgr_data->num_coarse_levels); i++) { if (Frelax_type[i] == 9 || Frelax_type[i] == 99 || Frelax_type[i] == 199) { GSElimData[i] = (hypre_ParAMGData*) hypre_MGRCreateGSElimData(); // Set pointers to GSElimData. Here, all solvers point to the same array for // A_ff_array, F_fine_array, and U_fine_array and will act on the appropriate // components during setup and solve. We adjust {F/U}_fine_array to start at index 1 // by definition of {F/U}_fine_array. (GSElimData[i] -> A_array) = A_ff_array; (GSElimData[i] -> F_array) = &F_fine_array[1]; (GSElimData[i] -> U_array) = &U_fine_array[1]; /* Save current error code to a temporary variable */ hypre_error_code_save(); // setup Gaussian Elim. in the F-relaxation step. Here, we apply GSElim at level 0 // since we have a single matrix (and not an array of matrices). // hypre_printf("Setting GSElim Solver %d \n", Frelax_type[i]); hypre_GaussElimSetup(GSElimData[i], i, Frelax_type[i]); /* Fallback to Jacobi when Gaussian Elim. is not successful */ if (HYPRE_GetGlobalError(hypre_ParCSRMatrixComm(A_array[i]))) { hypre_MGRDestroyGSElimData((mgr_data -> GSElimData)[i]); (mgr_data -> GSElimData)[i] = NULL; Frelax_type[i] = 7; /* Jacobi */ if (print_level) { hypre_ParPrintf(comm, "Switching F-relaxation at level %d to Jacobi", i); } /* Compute l1_norms if needed */ if (!l1_norms[i]) { hypre_BoomerAMGRelaxComputeL1Norms(A_array[i], Frelax_type[i], 0, 0, NULL, &l1_norms_data); if (l1_norms_data) { l1_norms[i] = hypre_SeqVectorCreate(hypre_ParCSRMatrixNumRows(A_array[i])); hypre_VectorData(l1_norms[i]) = l1_norms_data; hypre_VectorMemoryLocation(l1_norms[i]) = memory_location; } } } /* Restore error code prior to GaussElimSetup call */ hypre_error_code_restore(); } } } if (logging > 1) { residual = hypre_ParVectorCreate(hypre_ParCSRMatrixComm(A_array[0]), hypre_ParCSRMatrixGlobalNumRows(A_array[0]), hypre_ParCSRMatrixRowStarts(A_array[0]) ); hypre_ParVectorInitialize(residual); (mgr_data -> residual) = residual; } else { (mgr_data -> residual) = NULL; } rel_res_norms = hypre_CTAlloc(HYPRE_Real, (mgr_data -> max_iter), HYPRE_MEMORY_HOST); (mgr_data -> rel_res_norms) = rel_res_norms; /* Free level_coarse_indexes data */ if (level_coarse_indexes != NULL) { for (i = 0; i < max_num_coarse_levels; i++) { hypre_TFree(level_coarse_indexes[i], HYPRE_MEMORY_HOST); } hypre_TFree(level_coarse_indexes, HYPRE_MEMORY_HOST); (mgr_data -> level_coarse_indexes) = NULL; hypre_TFree(level_coarse_size, HYPRE_MEMORY_HOST); (mgr_data -> num_coarse_per_level) = NULL; } /* Print statistics */ hypre_MGRSetupStats(mgr_vdata); /* Print MGR and linear system info according to print level */ hypre_MGRDataPrint(mgr_vdata); hypre_MemoryPrintUsage(comm, hypre_HandleLogLevel(hypre_handle()), "MGR setup end", 0); hypre_GpuProfilingPopRange(); HYPRE_ANNOTATE_FUNC_END; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_MGRSetupFrelaxVcycleData * * Setup data for Frelax V-cycle *--------------------------------------------------------------------------*/ HYPRE_Int hypre_MGRSetupFrelaxVcycleData( void *mgr_vdata, hypre_ParCSRMatrix *A, hypre_ParVector *f, hypre_ParVector *u, HYPRE_Int lev ) { MPI_Comm comm = hypre_ParCSRMatrixComm(A); hypre_ParMGRData *mgr_data = (hypre_ParMGRData*) mgr_vdata; hypre_ParAMGData **FrelaxVcycleData = mgr_data -> FrelaxVcycleData; HYPRE_MemoryLocation memory_location = hypre_ParCSRMatrixMemoryLocation(A); HYPRE_Int i, j, num_procs, my_id; HYPRE_Int max_local_lvls = (mgr_data -> max_local_lvls); HYPRE_Int lev_local; HYPRE_Int not_finished; HYPRE_Int max_local_coarse_size = hypre_ParAMGDataMaxCoarseSize(FrelaxVcycleData[lev]); hypre_IntArray **CF_marker_array = (mgr_data -> CF_marker_array); HYPRE_Int local_size; HYPRE_BigInt coarse_size; HYPRE_BigInt coarse_pnts_global_lvl[2]; hypre_IntArray *coarse_dof_func_lvl = NULL; hypre_IntArray *dof_func = NULL; HYPRE_Int *dof_func_data = NULL; hypre_ParCSRMatrix *RAP_local = NULL; hypre_ParCSRMatrix *P_local = NULL; hypre_ParCSRMatrix *S_local = NULL; HYPRE_Int smrk_local = -1; HYPRE_Int P_max_elmts = 4; HYPRE_Real trunc_factor = 0.0; HYPRE_Int debug_flag = 0; HYPRE_Int measure_type = 0; HYPRE_Real strong_threshold = 0.25; HYPRE_Real max_row_sum = 0.9; HYPRE_Int coarsen_cut_factor = 0; HYPRE_Int old_num_levels = hypre_ParAMGDataNumLevels(FrelaxVcycleData[lev]); hypre_IntArray **CF_marker_array_local = (FrelaxVcycleData[lev] -> CF_marker_array); HYPRE_Int *CF_marker_local = NULL; hypre_ParCSRMatrix **A_array_local = (FrelaxVcycleData[lev] -> A_array); hypre_ParCSRMatrix **P_array_local = (FrelaxVcycleData[lev] -> P_array); hypre_ParVector **F_array_local = (FrelaxVcycleData[lev] -> F_array); hypre_ParVector **U_array_local = (FrelaxVcycleData[lev] -> U_array); hypre_IntArray **dof_func_array = (FrelaxVcycleData[lev] -> dof_func_array); HYPRE_Int relax_type = 3; HYPRE_Int indx, k, tms; HYPRE_Int num_fine_points = 0; HYPRE_Int num_functions = hypre_ParAMGDataNumFunctions(FrelaxVcycleData[lev]); HYPRE_Int relax_order = hypre_ParAMGDataRelaxOrder(FrelaxVcycleData[lev]); hypre_MPI_Comm_size(comm, &num_procs); hypre_MPI_Comm_rank(comm, &my_id); local_size = hypre_ParCSRMatrixNumRows(A); /* Free any local data not previously destroyed */ if (A_array_local || P_array_local || CF_marker_array_local) { for (j = 1; j < old_num_levels; j++) { if (A_array_local[j]) { hypre_ParCSRMatrixDestroy(A_array_local[j]); A_array_local[j] = NULL; } } for (j = 0; j < old_num_levels - 1; j++) { if (P_array_local[j]) { hypre_ParCSRMatrixDestroy(P_array_local[j]); P_array_local[j] = NULL; } } for (j = 0; j < old_num_levels - 1; j++) { if (CF_marker_array_local[j]) { hypre_IntArrayDestroy(CF_marker_array_local[j]); CF_marker_array_local[j] = NULL; } } hypre_TFree(A_array_local, HYPRE_MEMORY_HOST); A_array_local = NULL; hypre_TFree(P_array_local, HYPRE_MEMORY_HOST); P_array_local = NULL; hypre_TFree(CF_marker_array_local, HYPRE_MEMORY_HOST); CF_marker_array_local = NULL; } /* free solution arrays not previously destroyed */ if (F_array_local != NULL || U_array_local != NULL) { for (j = 1; j < old_num_levels; j++) { if (F_array_local[j] != NULL) { hypre_ParVectorDestroy(F_array_local[j]); F_array_local[j] = NULL; } if (U_array_local[j] != NULL) { hypre_ParVectorDestroy(U_array_local[j]); U_array_local[j] = NULL; } } hypre_TFree(F_array_local, HYPRE_MEMORY_HOST); F_array_local = NULL; hypre_TFree(U_array_local, HYPRE_MEMORY_HOST); U_array_local = NULL; } /* Initialize some variables and allocate memory */ not_finished = 1; lev_local = 0; if (A_array_local == NULL) { A_array_local = hypre_CTAlloc(hypre_ParCSRMatrix*, max_local_lvls, HYPRE_MEMORY_HOST); } if (P_array_local == NULL && max_local_lvls > 1) { P_array_local = hypre_CTAlloc(hypre_ParCSRMatrix*, max_local_lvls - 1, HYPRE_MEMORY_HOST); } if (F_array_local == NULL) { F_array_local = hypre_CTAlloc(hypre_ParVector*, max_local_lvls, HYPRE_MEMORY_HOST); } if (U_array_local == NULL) { U_array_local = hypre_CTAlloc(hypre_ParVector*, max_local_lvls, HYPRE_MEMORY_HOST); } if (CF_marker_array_local == NULL) { CF_marker_array_local = hypre_CTAlloc(hypre_IntArray*, max_local_lvls, HYPRE_MEMORY_HOST); } if (dof_func_array == NULL) { dof_func_array = hypre_CTAlloc(hypre_IntArray*, max_local_lvls, HYPRE_MEMORY_HOST); } A_array_local[0] = A; F_array_local[0] = f; U_array_local[0] = u; for (i = 0; i < local_size; i++) { if (hypre_IntArrayData(CF_marker_array[lev])[i] == smrk_local) { num_fine_points++; } } //hypre_printf("My_ID = %d, Size of A_FF matrix: %d \n", my_id, num_fine_points); if (num_functions > 1 && dof_func == NULL) { dof_func = hypre_IntArrayCreate(num_fine_points); hypre_IntArrayInitialize(dof_func); indx = 0; tms = num_fine_points / num_functions; if (tms * num_functions + indx > num_fine_points) { tms--; } for (j = 0; j < tms; j++) { for (k = 0; k < num_functions; k++) { hypre_IntArrayData(dof_func)[indx++] = k; } } k = 0; while (indx < num_fine_points) { hypre_IntArrayData(dof_func)[indx++] = k++; } FrelaxVcycleData[lev] -> dof_func = dof_func; } dof_func_array[0] = dof_func; hypre_ParAMGDataDofFuncArray(FrelaxVcycleData[lev]) = dof_func_array; while (not_finished) { local_size = hypre_ParCSRMatrixNumRows(A_array_local[lev_local]); dof_func_data = NULL; if (dof_func_array[lev_local]) { dof_func_data = hypre_IntArrayData(dof_func_array[lev_local]); } if (lev_local == 0) { /* use the CF_marker from the outer MGR cycle to create the strength connection matrix */ hypre_BoomerAMGCreateSFromCFMarker(A_array_local[lev_local], strong_threshold, max_row_sum, hypre_IntArrayData(CF_marker_array[lev]), num_functions, dof_func_data, smrk_local, &S_local); } else if (lev_local > 0) { hypre_BoomerAMGCreateS(A_array_local[lev_local], strong_threshold, max_row_sum, num_functions, dof_func_data, &S_local); } CF_marker_array_local[lev_local] = hypre_IntArrayCreate(local_size); hypre_IntArrayInitialize_v2(CF_marker_array_local[lev_local], memory_location); CF_marker_local = hypre_IntArrayData(CF_marker_array_local[lev_local]); hypre_BoomerAMGCoarsenHMIS(S_local, A_array_local[lev_local], measure_type, coarsen_cut_factor, debug_flag, &(CF_marker_array_local[lev_local])); hypre_BoomerAMGCoarseParms(comm, local_size, num_functions, dof_func_array[lev_local], CF_marker_array_local[lev_local], &coarse_dof_func_lvl, coarse_pnts_global_lvl); if (my_id == (num_procs - 1)) { coarse_size = coarse_pnts_global_lvl[1]; } hypre_MPI_Bcast(&coarse_size, 1, HYPRE_MPI_BIG_INT, num_procs - 1, comm); if (coarse_size == 0) // stop coarsening { if (S_local) { hypre_ParCSRMatrixDestroy(S_local); } hypre_IntArrayDestroy(coarse_dof_func_lvl); if (lev_local == 0) { // Save the cf_marker from outer MGR level (lev). if (relax_order == 1) { /* We need to mask out C-points from outer CF-marker for C/F relaxation at solve phase --DOK*/ for (i = 0; i < local_size; i++) { if (hypre_IntArrayData(CF_marker_array[lev])[i] == 1) { CF_marker_local[i] = 0; } } } else { /* Do lexicographic relaxation on F-points from outer CF-marker --DOK*/ for (i = 0; i < local_size; i++) { CF_marker_local[i] = hypre_IntArrayData(CF_marker_array[lev])[i]; } } } else { hypre_IntArrayDestroy(CF_marker_array_local[lev_local]); CF_marker_array_local[lev_local] = NULL; } break; } hypre_BoomerAMGBuildExtPIInterpHost(A_array_local[lev_local], CF_marker_local, S_local, coarse_pnts_global_lvl, num_functions, dof_func_data, debug_flag, trunc_factor, P_max_elmts, &P_local); // hypre_BoomerAMGBuildInterp(A_array_local[lev_local], CF_marker_local, // S_local, coarse_pnts_global_lvl, 1, NULL, // 0, 0.0, 0, NULL, &P_local); /* Save the CF_marker pointer. For lev_local = 0, save the cf_marker from outer MGR level (lev). * This is necessary to enable relaxations over the A_FF matrix during the solve phase. -- DOK */ if (lev_local == 0) { if (relax_order == 1) { /* We need to mask out C-points from outer CF-marker for C/F relaxation at solve phase --DOK*/ for (i = 0; i < local_size; i++) { if (hypre_IntArrayData(CF_marker_array[lev])[i] == 1) { CF_marker_local[i] = 0; } } } else { /* Do lexicographic relaxation on F-points from outer CF-marker --DOK */ for (i = 0; i < local_size; i++) { CF_marker_local[i] = hypre_IntArrayData(CF_marker_array[lev])[i]; } } } /* Save interpolation matrix pointer */ P_array_local[lev_local] = P_local; if (num_functions > 1) { dof_func_array[lev_local + 1] = coarse_dof_func_lvl; } /* build the coarse grid */ hypre_BoomerAMGBuildCoarseOperatorKT(P_local, A_array_local[lev_local], P_local, 0, &RAP_local); /* if (my_id == (num_procs -1)) coarse_size = coarse_pnts_global_lvl[1]; hypre_MPI_Bcast(&coarse_size, 1, HYPRE_MPI_BIG_INT, num_procs-1, comm); */ lev_local++; if (S_local) { hypre_ParCSRMatrixDestroy(S_local); } S_local = NULL; if ( (lev_local == max_local_lvls - 1) || (coarse_size <= max_local_coarse_size) ) { not_finished = 0; } A_array_local[lev_local] = RAP_local; F_array_local[lev_local] = hypre_ParVectorCreate(hypre_ParCSRMatrixComm(RAP_local), hypre_ParCSRMatrixGlobalNumRows(RAP_local), hypre_ParCSRMatrixRowStarts(RAP_local)); hypre_ParVectorInitialize(F_array_local[lev_local]); U_array_local[lev_local] = hypre_ParVectorCreate(hypre_ParCSRMatrixComm(RAP_local), hypre_ParCSRMatrixGlobalNumRows(RAP_local), hypre_ParCSRMatrixRowStarts(RAP_local)); hypre_ParVectorInitialize(U_array_local[lev_local]); } // end while loop // setup Vcycle data (FrelaxVcycleData[lev] -> A_array) = A_array_local; (FrelaxVcycleData[lev] -> P_array) = P_array_local; (FrelaxVcycleData[lev] -> F_array) = F_array_local; (FrelaxVcycleData[lev] -> U_array) = U_array_local; (FrelaxVcycleData[lev] -> CF_marker_array) = CF_marker_array_local; (FrelaxVcycleData[lev] -> num_levels) = lev_local; //if(lev == 1) //{ // for (i = 0; i < local_size; i++) // { // if(CF_marker_array_local[0][i] == 1) // hypre_printf("cfmarker[%d] = %d\n",i, CF_marker_array_local[0][i]); // } //} /* setup GE for coarsest level (if small enough) */ if ((lev_local > 0) && (hypre_ParAMGDataUserCoarseRelaxType(FrelaxVcycleData[lev]) == 9)) { if ((coarse_size <= max_local_coarse_size) && coarse_size > 0) { hypre_GaussElimSetup(FrelaxVcycleData[lev], lev_local, 9); } else { /* use relaxation */ hypre_ParAMGDataUserCoarseRelaxType(FrelaxVcycleData[lev]) = relax_type; } } return hypre_error_flag; } hypre-2.33.0/src/parcsr_ls/par_mgr_solve.c000066400000000000000000001465651477326011500205370ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * MGR solve routine * *****************************************************************************/ #include "_hypre_parcsr_ls.h" #include "par_mgr.h" #include "par_amg.h" /*-------------------------------------------------------------------- * hypre_MGRSolve *--------------------------------------------------------------------*/ HYPRE_Int hypre_MGRSolve( void *mgr_vdata, hypre_ParCSRMatrix *A, hypre_ParVector *f, hypre_ParVector *u ) { MPI_Comm comm = hypre_ParCSRMatrixComm(A); hypre_ParMGRData *mgr_data = (hypre_ParMGRData*) mgr_vdata; hypre_ParCSRMatrix **A_array = (mgr_data -> A_array); hypre_ParVector **F_array = (mgr_data -> F_array); hypre_ParVector **U_array = (mgr_data -> U_array); HYPRE_Real tol = (mgr_data -> tol); HYPRE_Int logging = (mgr_data -> logging); HYPRE_Int print_level = (mgr_data -> print_level); HYPRE_Int max_iter = (mgr_data -> max_iter); HYPRE_Real *norms = (mgr_data -> rel_res_norms); hypre_ParVector *Vtemp = (mgr_data -> Vtemp); // hypre_ParVector *Utemp = (mgr_data -> Utemp); hypre_ParVector *residual = NULL; HYPRE_Complex fp_zero = 0.0; HYPRE_Complex fp_one = 1.0; HYPRE_Complex fp_neg_one = - fp_one; HYPRE_Real conv_factor = 0.0; HYPRE_Real resnorm = 1.0; HYPRE_Real init_resnorm = 0.0; HYPRE_Real rel_resnorm; HYPRE_Real rhs_norm = 0.0; HYPRE_Real old_resnorm; HYPRE_Real ieee_check = 0.; HYPRE_Int iter, num_procs, my_id; HYPRE_Solver cg_solver = (mgr_data -> coarse_grid_solver); HYPRE_Int (*coarse_grid_solver_solve)(void*, void*, void*, void*) = (mgr_data -> coarse_grid_solver_solve); HYPRE_ANNOTATE_FUNC_BEGIN; if (logging > 1) { residual = (mgr_data -> residual); } (mgr_data -> num_iterations) = 0; if ((mgr_data -> num_coarse_levels) == 0) { /* Do scalar AMG solve when only one level */ coarse_grid_solver_solve(cg_solver, A, f, u); HYPRE_BoomerAMGGetNumIterations(cg_solver, &iter); HYPRE_BoomerAMGGetFinalRelativeResidualNorm(cg_solver, &rel_resnorm); (mgr_data -> num_iterations) = iter; (mgr_data -> final_rel_residual_norm) = rel_resnorm; HYPRE_ANNOTATE_FUNC_END; return hypre_error_flag; } A_array[0] = A; U_array[0] = u; F_array[0] = f; hypre_MPI_Comm_size(comm, &num_procs); hypre_MPI_Comm_rank(comm, &my_id); /*----------------------------------------------------------------------- * Write the solver parameters *-----------------------------------------------------------------------*/ /* Print MGR and linear system info according to print level */ hypre_MGRDataPrint(mgr_vdata); /*----------------------------------------------------------------------- * write some initial info *-----------------------------------------------------------------------*/ if (my_id == 0 && (print_level & HYPRE_MGR_PRINT_INFO_SOLVE) && tol > 0.) { hypre_printf("\n\nMGR SOLVER SOLUTION INFO:\n"); } /*----------------------------------------------------------------------- * Compute initial fine-grid residual and print *-----------------------------------------------------------------------*/ if ((print_level & HYPRE_MGR_PRINT_INFO_SOLVE) || logging > 1 || tol > 0.) { if (logging > 1) { hypre_ParVectorCopy(F_array[0], residual); if (tol > hypre_cabs(fp_zero)) { hypre_ParCSRMatrixMatvec(fp_neg_one, A_array[0], U_array[0], fp_one, residual); } resnorm = hypre_sqrt(hypre_ParVectorInnerProd(residual, residual)); } else { hypre_ParVectorCopy(F_array[0], Vtemp); if (tol > hypre_cabs(fp_zero)) { hypre_ParCSRMatrixMatvec(fp_neg_one, A_array[0], U_array[0], fp_one, Vtemp); } resnorm = hypre_sqrt(hypre_ParVectorInnerProd(Vtemp, Vtemp)); } /* Since it does not diminish performance, attempt to return an error flag * and notify users when they supply bad input. */ if (resnorm != 0.) { ieee_check = resnorm / resnorm; /* INF -> NaN conversion */ } if (ieee_check != ieee_check) { /* ...INFs or NaNs in input can make ieee_check a NaN. This test * for ieee_check self-equality works on all IEEE-compliant compilers/ * machines, c.f. page 8 of "Lecture Notes on the Status of IEEE 754" * by W. Kahan, May 31, 1996. Currently (July 2002) this paper may be * found at http://HTTP.CS.Berkeley.EDU/~wkahan/ieee754status/IEEE754.PDF */ if (print_level > 0) { hypre_printf("\n\nERROR detected by Hypre ... BEGIN\n"); hypre_printf("ERROR -- hypre_MGRSolve: INFs and/or NaNs detected in input.\n"); hypre_printf("User probably placed non-numerics in supplied A, x_0, or b.\n"); hypre_printf("ERROR detected by Hypre ... END\n\n\n"); } hypre_error(HYPRE_ERROR_GENERIC); HYPRE_ANNOTATE_FUNC_END; return hypre_error_flag; } init_resnorm = resnorm; rhs_norm = hypre_sqrt(hypre_ParVectorInnerProd(f, f)); if (rhs_norm > HYPRE_REAL_EPSILON) { rel_resnorm = init_resnorm / rhs_norm; } else { /* rhs is zero, return a zero solution */ hypre_ParVectorSetZeros(U_array[0]); if (logging > 0) { rel_resnorm = fp_zero; (mgr_data -> final_rel_residual_norm) = rel_resnorm; } HYPRE_ANNOTATE_FUNC_END; return hypre_error_flag; } } else { rel_resnorm = 1.; } if (my_id == 0 && (print_level & HYPRE_MGR_PRINT_INFO_SOLVE)) { hypre_printf(" relative\n"); hypre_printf(" residual factor residual\n"); hypre_printf(" -------- ------ --------\n"); hypre_printf(" Initial %e %e\n", init_resnorm, rel_resnorm); } /************** Main Solver Loop - always do 1 iteration ************/ iter = 0; while ((rel_resnorm >= tol || iter < 1) && iter < max_iter) { /* Do one cycle of reduction solve on A*e = r */ hypre_MGRCycle(mgr_data, F_array, U_array); /*--------------------------------------------------------------- * Compute fine-grid residual and residual norm *----------------------------------------------------------------*/ if ((print_level & HYPRE_MGR_PRINT_INFO_SOLVE) || logging > 1 || tol > 0.) { old_resnorm = resnorm; if (logging > 1) { hypre_ParVectorCopy(F_array[0], residual); hypre_ParCSRMatrixMatvec(fp_neg_one, A_array[0], U_array[0], fp_one, residual); resnorm = hypre_sqrt(hypre_ParVectorInnerProd(residual, residual)); } else { hypre_ParVectorCopy(F_array[0], Vtemp); hypre_ParCSRMatrixMatvec(fp_neg_one, A_array[0], U_array[0], fp_one, Vtemp); resnorm = hypre_sqrt(hypre_ParVectorInnerProd(Vtemp, Vtemp)); } conv_factor = (old_resnorm > HYPRE_REAL_EPSILON) ? (resnorm / old_resnorm) : resnorm; rel_resnorm = (rhs_norm > HYPRE_REAL_EPSILON) ? (resnorm / rhs_norm) : resnorm; norms[iter] = rel_resnorm; } ++iter; (mgr_data -> num_iterations) = iter; (mgr_data -> final_rel_residual_norm) = rel_resnorm; if (my_id == 0 && (print_level & HYPRE_MGR_PRINT_INFO_SOLVE)) { hypre_printf(" MGRCycle %2d %e %f %e \n", iter, resnorm, conv_factor, rel_resnorm); } } /* check convergence within max_iter */ if (iter == max_iter && tol > 0.) { hypre_error(HYPRE_ERROR_CONV); if (!my_id && (print_level & HYPRE_MGR_PRINT_INFO_SOLVE)) { hypre_printf("\n\n=============================================="); hypre_printf("\n NOTE: Convergence tolerance was not achieved\n"); hypre_printf(" within the allowed %d iterations\n", max_iter); hypre_printf("=============================================="); } } if ((my_id == 0) && (print_level & HYPRE_MGR_PRINT_INFO_SOLVE)) { if (iter > 0 && init_resnorm) { conv_factor = hypre_pow((resnorm / init_resnorm), (fp_one / (HYPRE_Real) iter)); } else { conv_factor = fp_one; } hypre_printf("\n\n Average Convergence Factor = %f \n", conv_factor); } HYPRE_ANNOTATE_FUNC_END; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_MGRFrelaxVcycle *--------------------------------------------------------------------------*/ HYPRE_Int hypre_MGRFrelaxVcycle ( void *Frelax_vdata, hypre_ParVector *f, hypre_ParVector *u ) { hypre_ParAMGData *Frelax_data = (hypre_ParAMGData*) Frelax_vdata; HYPRE_Int Not_Finished = 0; HYPRE_Int level = 0; HYPRE_Int cycle_param = 1; HYPRE_Int j, Solve_err_flag, coarse_grid, fine_grid; HYPRE_Int local_size; HYPRE_Int num_sweeps = 1; HYPRE_Int relax_order = hypre_ParAMGDataRelaxOrder(Frelax_data); HYPRE_Int relax_type = 3; HYPRE_Real relax_weight = 1.0; HYPRE_Real omega = 1.0; hypre_ParVector **F_array = (Frelax_data) -> F_array; hypre_ParVector **U_array = (Frelax_data) -> U_array; hypre_ParCSRMatrix **A_array = ((Frelax_data) -> A_array); hypre_ParCSRMatrix **R_array = ((Frelax_data) -> P_array); hypre_ParCSRMatrix **P_array = ((Frelax_data) -> P_array); hypre_IntArray **CF_marker_array = ((Frelax_data) -> CF_marker_array); HYPRE_Int *CF_marker; hypre_ParVector *Vtemp = (Frelax_data) -> Vtemp; hypre_ParVector *Ztemp = (Frelax_data) -> Ztemp; HYPRE_Int num_c_levels = (Frelax_data) -> num_levels; hypre_ParVector *Aux_F = NULL; hypre_ParVector *Aux_U = NULL; HYPRE_Complex fp_zero = 0.0; HYPRE_Complex fp_one = 1.0; HYPRE_Complex fp_neg_one = - fp_one; HYPRE_ANNOTATE_FUNC_BEGIN; F_array[0] = f; U_array[0] = u; CF_marker = NULL; if (CF_marker_array[0]) { CF_marker = hypre_IntArrayData(CF_marker_array[0]); } /* (Re)set local_size for Vtemp */ local_size = hypre_VectorSize(hypre_ParVectorLocalVector(F_array[0])); hypre_ParVectorSetLocalSize(Vtemp, local_size); /* smoother on finest level: * This is separated from subsequent levels since the finest level matrix * may be larger than what is needed for the vcycle solve */ if (relax_order == 1) // C/F ordering for smoother { for (j = 0; j < num_sweeps; j++) { Solve_err_flag = hypre_BoomerAMGRelaxIF(A_array[0], F_array[0], CF_marker, relax_type, relax_order, 1, relax_weight, omega, NULL, U_array[0], Vtemp, Ztemp); } } else // lexicographic ordering for smoother (on F points in CF marker) { for (j = 0; j < num_sweeps; j++) { Solve_err_flag = hypre_BoomerAMGRelax(A_array[0], F_array[0], CF_marker, relax_type, -1, relax_weight, omega, NULL, U_array[0], Vtemp, Ztemp); } } /* coarse grids exist */ if (num_c_levels > 0) { Not_Finished = 1; } while (Not_Finished) { if (cycle_param == 1) { //hypre_printf("Vcycle smoother (down cycle): vtemp size = %d, level = %d \n", hypre_VectorSize(hypre_ParVectorLocalVector(Vtemp)), level); /* compute coarse grid vectors */ fine_grid = level; coarse_grid = level + 1; hypre_ParVectorSetZeros(U_array[coarse_grid]); /* Avoid unnecessary copy using out-of-place version of SpMV */ hypre_ParCSRMatrixMatvecOutOfPlace(fp_neg_one, A_array[fine_grid], U_array[fine_grid], fp_one, F_array[fine_grid], Vtemp); hypre_ParCSRMatrixMatvecT(fp_one, R_array[fine_grid], Vtemp, fp_zero, F_array[coarse_grid]); /* update level */ ++level; /* Update scratch vector sizes */ local_size = hypre_VectorSize(hypre_ParVectorLocalVector(F_array[level])); hypre_ParVectorSetLocalSize(Vtemp, local_size); hypre_ParVectorSetLocalSize(Ztemp, local_size); CF_marker = NULL; if (CF_marker_array[level]) { CF_marker = hypre_IntArrayData(CF_marker_array[level]); } /* next level is coarsest level */ if (level == num_c_levels) { /* switch to coarsest level */ cycle_param = 3; } else { Aux_F = F_array[level]; Aux_U = U_array[level]; /* relax and visit next coarse grid */ for (j = 0; j < num_sweeps; j++) { Solve_err_flag = hypre_BoomerAMGRelaxIF(A_array[level], Aux_F, CF_marker, relax_type, relax_order, cycle_param, relax_weight, omega, NULL, Aux_U, Vtemp, Ztemp); } cycle_param = 1; } } else if (cycle_param == 3) { if (hypre_ParAMGDataUserCoarseRelaxType(Frelax_data) == 9) { /* solve the coarsest grid with Gaussian elimination */ hypre_GaussElimSolve(Frelax_data, level, 9); } else { /* solve with relaxation */ Aux_F = F_array[level]; Aux_U = U_array[level]; for (j = 0; j < num_sweeps; j++) { Solve_err_flag = hypre_BoomerAMGRelaxIF(A_array[level], Aux_F, CF_marker, relax_type, relax_order, cycle_param, relax_weight, omega, NULL, Aux_U, Vtemp, Ztemp); } } //hypre_printf("Vcycle smoother (coarse level): vtemp size = %d, level = %d \n", hypre_VectorSize(hypre_ParVectorLocalVector(Vtemp)), level); cycle_param = 2; } else if (cycle_param == 2) { /*--------------------------------------------------------------- * Visit finer level next. * Interpolate and add correction using hypre_ParCSRMatrixMatvec. * Reset counters and cycling parameters for finer level. *--------------------------------------------------------------*/ fine_grid = level - 1; coarse_grid = level; /* Update solution at the fine level */ hypre_ParCSRMatrixMatvec(fp_one, P_array[fine_grid], U_array[coarse_grid], fp_one, U_array[fine_grid]); --level; cycle_param = 2; if (level == 0) { cycle_param = 99; } /* Update scratch vector sizes */ local_size = hypre_VectorSize(hypre_ParVectorLocalVector(F_array[level])); hypre_ParVectorSetLocalSize(Vtemp, local_size); hypre_ParVectorSetLocalSize(Ztemp, local_size); //hypre_printf("Vcycle smoother (up cycle): vtemp size = %d, level = %d \n", hypre_VectorSize(hypre_ParVectorLocalVector(Vtemp)), level); } else { Not_Finished = 0; } } HYPRE_ANNOTATE_FUNC_END; return Solve_err_flag; } /*-------------------------------------------------------------------------- * hypre_MGRCycle *--------------------------------------------------------------------------*/ HYPRE_Int hypre_MGRCycle( void *mgr_vdata, hypre_ParVector **F_array, hypre_ParVector **U_array ) { MPI_Comm comm; hypre_ParMGRData *mgr_data = (hypre_ParMGRData*) mgr_vdata; hypre_Solver *aff_base; HYPRE_Int local_size; HYPRE_Int level; HYPRE_Int coarse_grid; HYPRE_Int fine_grid; HYPRE_Int Not_Finished; HYPRE_Int cycle_type; HYPRE_Int print_level = (mgr_data -> print_level); HYPRE_Int frelax_print_level = (mgr_data -> frelax_print_level); HYPRE_Complex *l1_norms; HYPRE_Int *CF_marker_data; hypre_ParCSRMatrix **A_array = (mgr_data -> A_array); hypre_ParCSRMatrix **RT_array = (mgr_data -> RT_array); hypre_ParCSRMatrix **P_array = (mgr_data -> P_array); hypre_ParCSRMatrix **R_array = (mgr_data -> R_array); #if defined(HYPRE_USING_GPU) hypre_ParCSRMatrix **B_array = (mgr_data -> B_array); hypre_ParCSRMatrix **B_FF_array = (mgr_data -> B_FF_array); hypre_ParCSRMatrix **P_FF_array = (mgr_data -> P_FF_array); #endif hypre_ParCSRMatrix *RAP = (mgr_data -> RAP); HYPRE_Int use_default_cgrid_solver = (mgr_data -> use_default_cgrid_solver); HYPRE_Solver cg_solver = (mgr_data -> coarse_grid_solver); HYPRE_Int (*coarse_grid_solver_solve)(void*, void*, void*, void*) = (mgr_data -> coarse_grid_solver_solve); hypre_IntArray **CF_marker = (mgr_data -> CF_marker_array); HYPRE_Int *nsweeps = (mgr_data -> num_relax_sweeps); HYPRE_Int relax_type = (mgr_data -> relax_type); HYPRE_Real relax_weight = (mgr_data -> relax_weight); HYPRE_Real omega = (mgr_data -> omega); hypre_Vector **l1_norms_array = (mgr_data -> l1_norms); hypre_ParVector *Vtemp = (mgr_data -> Vtemp); hypre_ParVector *Ztemp = (mgr_data -> Ztemp); hypre_ParVector *Utemp = (mgr_data -> Utemp); hypre_ParVector **U_fine_array = (mgr_data -> U_fine_array); hypre_ParVector **F_fine_array = (mgr_data -> F_fine_array); HYPRE_Int (*fine_grid_solver_solve)(void*, void*, void*, void*) = (mgr_data -> fine_grid_solver_solve); hypre_ParCSRMatrix **A_ff_array = (mgr_data -> A_ff_array); HYPRE_Int i, relax_points; HYPRE_Int num_coarse_levels = (mgr_data -> num_coarse_levels); HYPRE_Complex fp_zero = 0.0; HYPRE_Complex fp_one = 1.0; HYPRE_Complex fp_neg_one = - fp_one; HYPRE_Int *Frelax_type = (mgr_data -> Frelax_type); HYPRE_Int *interp_type = (mgr_data -> interp_type); hypre_ParAMGData **FrelaxVcycleData = (mgr_data -> FrelaxVcycleData); HYPRE_Real **frelax_diaginv = (mgr_data -> frelax_diaginv); HYPRE_Int *blk_size = (mgr_data -> blk_size); HYPRE_Int block_size = (mgr_data -> block_size); HYPRE_Int *block_num_coarse_indexes = (mgr_data -> block_num_coarse_indexes); /* TODO (VPM): refactor names blk_size and block_size */ HYPRE_Int *level_smooth_type = (mgr_data -> level_smooth_type); HYPRE_Int *level_smooth_iters = (mgr_data -> level_smooth_iters); HYPRE_Int *restrict_type = (mgr_data -> restrict_type); HYPRE_Int pre_smoothing = (mgr_data -> global_smooth_cycle) == 1 ? 1 : 0; HYPRE_Int post_smoothing = (mgr_data -> global_smooth_cycle) == 2 ? 1 : 0; HYPRE_Int my_id; char region_name[1024]; char msg[1024]; #if defined(HYPRE_USING_GPU) HYPRE_MemoryLocation memory_location; HYPRE_ExecutionPolicy exec; #endif /* Initialize */ HYPRE_ANNOTATE_FUNC_BEGIN; hypre_GpuProfilingPushRange("MGRCycle"); comm = hypre_ParCSRMatrixComm(A_array[0]); hypre_MPI_Comm_rank(comm, &my_id); Not_Finished = 1; cycle_type = 1; level = 0; /***** Main loop ******/ while (Not_Finished) { /* Update scratch vector sizes */ local_size = hypre_VectorSize(hypre_ParVectorLocalVector(F_array[level])); hypre_ParVectorSetLocalSize(Vtemp, local_size); hypre_ParVectorSetLocalSize(Ztemp, local_size); hypre_ParVectorSetLocalSize(Utemp, local_size); /* Do coarse grid correction solve */ if (cycle_type == 3) { /* call coarse grid solver here (default is BoomerAMG) */ hypre_sprintf(region_name, "%s-%d", "MGR_Level", level); hypre_GpuProfilingPushRange(region_name); HYPRE_ANNOTATE_REGION_BEGIN("%s", region_name); coarse_grid_solver_solve(cg_solver, RAP, F_array[level], U_array[level]); if (use_default_cgrid_solver) { HYPRE_Real convergence_factor_cg; hypre_BoomerAMGGetRelResidualNorm(cg_solver, &convergence_factor_cg); (mgr_data -> cg_convergence_factor) = convergence_factor_cg; if ((print_level) > 1 && my_id == 0 && convergence_factor_cg > hypre_cabs(fp_one)) { hypre_printf("Warning!!! Coarse grid solve diverges. Factor = %1.2e\n", convergence_factor_cg); } } /* Error checking */ if (HYPRE_GetError()) { hypre_sprintf(msg, "[%d]: Error from MGR's coarsest level solver (level %d)\n", my_id, level); hypre_error_w_msg(HYPRE_ERROR_GENERIC, msg); HYPRE_ClearAllErrors(); } /* DEBUG: print the coarse system indicated by mgr_data->print_coarse_system */ if (mgr_data -> print_coarse_system) { hypre_ParCSRMatrixPrintIJ(RAP, 1, 1, "RAP_mat"); hypre_ParVectorPrintIJ(F_array[level], 1, "RAP_rhs"); hypre_ParVectorPrintIJ(U_array[level], 1, "RAP_sol"); mgr_data -> print_coarse_system--; } /**** cycle up ***/ cycle_type = 2; hypre_GpuProfilingPopRange(); HYPRE_ANNOTATE_REGION_END("%s", region_name); } /* Down cycle */ else if (cycle_type == 1) { /* Set fine/coarse grid level indices */ fine_grid = level; coarse_grid = level + 1; l1_norms = l1_norms_array[fine_grid] ? hypre_VectorData(l1_norms_array[fine_grid]) : NULL; CF_marker_data = hypre_IntArrayData(CF_marker[fine_grid]); #if defined(HYPRE_USING_GPU) memory_location = hypre_ParCSRMatrixMemoryLocation(A_array[fine_grid]); exec = hypre_GetExecPolicy1(memory_location); #endif hypre_sprintf(region_name, "%s-%d", "MGR_Level", fine_grid); hypre_GpuProfilingPushRange(region_name); HYPRE_ANNOTATE_REGION_BEGIN("%s", region_name); /* Global pre smoothing sweeps */ if (pre_smoothing && (level_smooth_iters[fine_grid] > 0)) { hypre_sprintf(region_name, "Global-Relax"); hypre_GpuProfilingPushRange(region_name); HYPRE_ANNOTATE_REGION_BEGIN("%s", region_name); if ((level_smooth_type[fine_grid]) == 0 || (level_smooth_type[fine_grid]) == 1) { /* Block Jacobi/Gauss-Seidel smoother */ #if defined(HYPRE_USING_GPU) if (exec == HYPRE_EXEC_DEVICE) { for (i = 0; i < level_smooth_iters[fine_grid]; i++) { hypre_MGRBlockRelaxSolveDevice(B_array[fine_grid], A_array[fine_grid], F_array[fine_grid], U_array[fine_grid], Vtemp, fp_one); } } else #endif { HYPRE_Real *level_diaginv = (mgr_data -> level_diaginv)[fine_grid]; HYPRE_Int level_blk_size = (level == 0) ? block_size : block_num_coarse_indexes[level - 1]; HYPRE_Int nrows = hypre_ParCSRMatrixNumRows(A_array[fine_grid]); HYPRE_Int n_block = nrows / level_blk_size; HYPRE_Int left_size = nrows - n_block * level_blk_size; for (i = 0; i < level_smooth_iters[fine_grid]; i++) { hypre_MGRBlockRelaxSolve(A_array[fine_grid], F_array[fine_grid], U_array[fine_grid], level_blk_size, n_block, left_size, level_smooth_type[fine_grid], level_diaginv, Vtemp); } } } else if ((level_smooth_type[fine_grid] > 1) && (level_smooth_type[fine_grid] < 7)) { for (i = 0; i < level_smooth_iters[fine_grid]; i ++) { hypre_BoomerAMGRelax(A_array[fine_grid], F_array[fine_grid], NULL, level_smooth_type[fine_grid] - 1, 0, fp_one, fp_zero, NULL, U_array[fine_grid], Vtemp, NULL); } } else if (level_smooth_type[fine_grid] == 8) { /* Euclid ILU smoother */ for (i = 0; i < level_smooth_iters[fine_grid]; i++) { /* Compute residual */ hypre_ParCSRMatrixMatvecOutOfPlace(fp_neg_one, A_array[fine_grid], U_array[fine_grid], fp_one, F_array[fine_grid], Vtemp); /* Solve */ HYPRE_EuclidSolve((mgr_data -> level_smoother)[fine_grid], A_array[fine_grid], Vtemp, Utemp); /* Update solution */ hypre_ParVectorAxpy(fp_one, Utemp, U_array[fine_grid]); } } else if ((mgr_data -> level_smoother)[fine_grid]) { /* Generic smoother object */ hypre_Solver *base = (hypre_Solver*) (mgr_data -> level_smoother)[fine_grid]; hypre_SolverSolve(base)((mgr_data -> level_smoother)[fine_grid], (HYPRE_Matrix) A_array[fine_grid], (HYPRE_Vector) F_array[fine_grid], (HYPRE_Vector) U_array[fine_grid]); } else { /* Generic relaxation interface */ for (i = 0; i < level_smooth_iters[fine_grid]; i++) { hypre_BoomerAMGRelax(A_array[fine_grid], F_array[fine_grid], NULL, level_smooth_type[fine_grid], 0, fp_one, fp_one, l1_norms, U_array[fine_grid], Vtemp, Ztemp); } } hypre_ParVectorAllZeros(U_array[fine_grid]) = 0; /* Error checking */ if (HYPRE_GetError()) { hypre_sprintf(msg, "[%d]: Error from global pre-relaxation %d at level %d \n", my_id, level_smooth_type[fine_grid], fine_grid); hypre_error_w_msg(HYPRE_ERROR_GENERIC, msg); HYPRE_ClearAllErrors(); } hypre_GpuProfilingPopRange(); HYPRE_ANNOTATE_REGION_END("%s", region_name); } /* End global pre-smoothing */ /* F-relaxation */ relax_points = -1; hypre_sprintf(region_name, "F-Relax"); hypre_GpuProfilingPushRange(region_name); HYPRE_ANNOTATE_REGION_BEGIN("%s", region_name); if (Frelax_type[fine_grid] == 0) { /* (single level) Block-relaxation for A_ff */ if (interp_type[fine_grid] == 12) { HYPRE_Int nrows = hypre_ParCSRMatrixNumRows(A_ff_array[fine_grid]); HYPRE_Int n_block = nrows / blk_size[fine_grid]; HYPRE_Int left_size = nrows - n_block * blk_size[fine_grid]; for (i = 0; i < nsweeps[fine_grid]; i++) { /* F-relaxation is reducing the global residual, thus recompute it */ hypre_ParCSRMatrixMatvecOutOfPlace(fp_neg_one, A_array[fine_grid], U_array[fine_grid], fp_one, F_array[fine_grid], Vtemp); /* Restrict to F points */ #if defined(HYPRE_USING_GPU) if (exec == HYPRE_EXEC_DEVICE) { hypre_ParCSRMatrixMatvecT(fp_one, P_FF_array[fine_grid], Vtemp, fp_zero, F_fine_array[coarse_grid]); } else #endif { hypre_MGRAddVectorR(CF_marker[fine_grid], FMRK, fp_one, Vtemp, fp_zero, &(F_fine_array[coarse_grid])); } /* Set initial guess to zero */ hypre_ParVectorSetZeros(U_fine_array[coarse_grid]); #if defined(HYPRE_USING_GPU) if (exec == HYPRE_EXEC_DEVICE) { hypre_MGRBlockRelaxSolveDevice(B_FF_array[fine_grid], A_ff_array[fine_grid], F_fine_array[coarse_grid], U_fine_array[coarse_grid], Vtemp, fp_one); } else #endif { hypre_MGRBlockRelaxSolve(A_ff_array[fine_grid], F_fine_array[coarse_grid], U_fine_array[coarse_grid], blk_size[fine_grid], n_block, left_size, 0, frelax_diaginv[fine_grid], Vtemp); } /* Interpolate the solution back to the fine grid level */ #if defined(HYPRE_USING_GPU) if (exec == HYPRE_EXEC_DEVICE) { hypre_ParCSRMatrixMatvec(fp_one, P_FF_array[fine_grid], U_fine_array[coarse_grid], fp_one, U_fine_array[fine_grid]); } else #endif { hypre_MGRAddVectorP(CF_marker[fine_grid], FMRK, fp_one, U_fine_array[coarse_grid], fp_one, &(U_array[fine_grid])); } } } else { if (relax_type == 18) { #if defined(HYPRE_USING_GPU) if (exec == HYPRE_EXEC_DEVICE) { for (i = 0; i < nsweeps[fine_grid]; i++) { hypre_MGRRelaxL1JacobiDevice(A_array[fine_grid], F_array[fine_grid], CF_marker_data, relax_points, relax_weight, l1_norms, U_array[fine_grid], Vtemp); } } else #endif { for (i = 0; i < nsweeps[fine_grid]; i++) { hypre_ParCSRRelax_L1_Jacobi(A_array[fine_grid], F_array[fine_grid], CF_marker_data, relax_points, relax_weight, l1_norms, U_array[fine_grid], Vtemp); } } } else { for (i = 0; i < nsweeps[fine_grid]; i++) { hypre_BoomerAMGRelax(A_array[fine_grid], F_array[fine_grid], CF_marker_data, relax_type, relax_points, relax_weight, omega, l1_norms, U_array[fine_grid], Vtemp, Ztemp); } } } } else if (Frelax_type[fine_grid] == 1) { /* V-cycle smoother for A_ff */ //HYPRE_Real convergence_factor_frelax; // compute residual before solve // hypre_ParCSRMatrixMatvecOutOfPlace(-fp_one, A_array[fine_grid], // U_array[fine_grid], fp_one, // F_array[fine_grid], Vtemp); // convergence_factor_frelax = hypre_ParVectorInnerProd(Vtemp, Vtemp); HYPRE_Real resnorm = 0.0, init_resnorm; HYPRE_Real rhs_norm = 0.0, old_resnorm; HYPRE_Real rel_resnorm = fp_one; HYPRE_Real conv_factor = fp_one; if (frelax_print_level > 1) { hypre_ParCSRMatrixMatvecOutOfPlace(fp_neg_one, A_array[fine_grid], U_array[fine_grid], fp_one, F_array[fine_grid], Vtemp); resnorm = hypre_sqrt(hypre_ParVectorInnerProd(Vtemp, Vtemp)); init_resnorm = resnorm; rhs_norm = hypre_sqrt(hypre_ParVectorInnerProd(F_array[fine_grid], F_array[fine_grid])); if (rhs_norm > HYPRE_REAL_EPSILON) { rel_resnorm = init_resnorm / rhs_norm; } else { /* rhs is zero, return a zero solution */ hypre_ParVectorSetZeros(U_array[0]); HYPRE_ANNOTATE_FUNC_END; hypre_GpuProfilingPopRange(); return hypre_error_flag; } if (my_id == 0 && frelax_print_level > 1) { hypre_printf("\nBegin F-relaxation: V-Cycle Smoother \n"); hypre_printf(" relative\n"); hypre_printf(" residual factor residual\n"); hypre_printf(" -------- ------ --------\n"); hypre_printf(" Initial %e %e\n", init_resnorm, rel_resnorm); } } for (i = 0; i < nsweeps[fine_grid]; i++) { hypre_MGRFrelaxVcycle(FrelaxVcycleData[fine_grid], F_array[fine_grid], U_array[fine_grid]); if (frelax_print_level > 1) { old_resnorm = resnorm; hypre_ParCSRMatrixMatvecOutOfPlace(fp_neg_one, A_array[fine_grid], U_array[fine_grid], fp_one, F_array[fine_grid], Vtemp); resnorm = hypre_sqrt(hypre_ParVectorInnerProd(Vtemp, Vtemp)); conv_factor = (old_resnorm > HYPRE_REAL_EPSILON) ? (resnorm / old_resnorm) : resnorm; rel_resnorm = (rhs_norm > HYPRE_REAL_EPSILON) ? (resnorm / rhs_norm) : resnorm; if (my_id == 0) { hypre_printf("\n V-Cycle %2d %e %f %e \n", i, resnorm, conv_factor, rel_resnorm); } } } if (my_id == 0 && frelax_print_level > 1) { hypre_printf("End F-relaxation: V-Cycle Smoother \n\n"); } // compute residual after solve //hypre_ParCSRMatrixMatvecOutOfPlace(fp_neg_one, A_array[fine_grid], // U_array[fine_grid], fp_one, // F_array[fine_grid], Vtemp); //convergence_factor_frelax = hypre_ParVectorInnerProd(Vtemp, Vtemp)/convergence_factor_frelax; //hypre_printf("F-relaxation V-cycle convergence factor: %5f\n", convergence_factor_frelax); } else if (Frelax_type[level] == 2 || Frelax_type[level] == 9 || Frelax_type[level] == 99 || Frelax_type[level] == 199) { /* We need to compute the residual first to ensure that F-relaxation is reducing the global residual */ hypre_ParCSRMatrixMatvecOutOfPlace(fp_neg_one, A_array[fine_grid], U_array[fine_grid], fp_one, F_array[fine_grid], Vtemp); /* Restrict to F points */ #if defined(HYPRE_USING_GPU) if (exec == HYPRE_EXEC_DEVICE) { hypre_ParCSRMatrixMatvecT(fp_one, P_FF_array[fine_grid], Vtemp, fp_zero, F_fine_array[coarse_grid]); } else #endif { hypre_MGRAddVectorR(CF_marker[fine_grid], FMRK, fp_one, Vtemp, fp_zero, &(F_fine_array[coarse_grid])); } /* Set initial guess to zeros */ hypre_ParVectorSetZeros(U_fine_array[coarse_grid]); if (Frelax_type[level] == 2) { /* Do F-relaxation using AMG */ if (level == 0) { /* TODO (VPM): unify with the next block */ fine_grid_solver_solve((mgr_data -> aff_solver)[fine_grid], A_ff_array[fine_grid], F_fine_array[coarse_grid], U_fine_array[coarse_grid]); } else { aff_base = (hypre_Solver*) (mgr_data -> aff_solver)[level]; hypre_SolverSolve(aff_base)((HYPRE_Solver) (mgr_data -> aff_solver)[level], (HYPRE_Matrix) A_ff_array[level], (HYPRE_Vector) F_fine_array[level + 1], (HYPRE_Vector) U_fine_array[level + 1]); } } else { /* Do F-relaxation using Gaussian Elimination */ hypre_GaussElimSolve((mgr_data -> GSElimData)[fine_grid], level, Frelax_type[level]); } /* Interpolate the solution back to the fine grid level */ #if defined(HYPRE_USING_GPU) if (exec == HYPRE_EXEC_DEVICE) { hypre_ParCSRMatrixMatvec(fp_one, P_FF_array[fine_grid], U_fine_array[coarse_grid], fp_one, U_array[fine_grid]); } else #endif { hypre_MGRAddVectorP(CF_marker[fine_grid], FMRK, fp_one, U_fine_array[coarse_grid], fp_one, &(U_array[fine_grid])); } } else { for (i = 0; i < nsweeps[fine_grid]; i++) { hypre_BoomerAMGRelax(A_array[fine_grid], F_array[fine_grid], CF_marker_data, Frelax_type[fine_grid], relax_points, relax_weight, omega, l1_norms, U_array[fine_grid], Vtemp, Ztemp); } } /* Error checking */ if (HYPRE_GetError()) { hypre_sprintf(msg, "[%d]: Error from F-relaxation %d at MGR level %d\n", my_id, Frelax_type[fine_grid], fine_grid); hypre_error_w_msg(HYPRE_ERROR_GENERIC, msg); HYPRE_ClearAllErrors(); } hypre_GpuProfilingPopRange(); HYPRE_ANNOTATE_REGION_END("%s", region_name); /* Update residual and compute coarse-grid rhs */ hypre_sprintf(region_name, "Residual"); hypre_GpuProfilingPushRange(region_name); HYPRE_ANNOTATE_REGION_BEGIN("%s", region_name); hypre_ParCSRMatrixMatvecOutOfPlace(fp_neg_one, A_array[fine_grid], U_array[fine_grid], fp_one, F_array[fine_grid], Vtemp); hypre_GpuProfilingPopRange(); HYPRE_ANNOTATE_REGION_END("%s", region_name); hypre_sprintf(region_name, "Restrict"); hypre_GpuProfilingPushRange(region_name); HYPRE_ANNOTATE_REGION_BEGIN("%s", region_name); if (R_array[fine_grid]) { /* no transpose necessary for R */ hypre_ParCSRMatrixMatvec(fp_one, R_array[fine_grid], Vtemp, fp_zero, F_array[coarse_grid]); } else { #if defined(HYPRE_USING_GPU) if (restrict_type[fine_grid] > 0 || (exec == HYPRE_EXEC_DEVICE)) #else if (restrict_type[fine_grid] > 0) #endif { hypre_ParCSRMatrixMatvecT(fp_one, RT_array[fine_grid], Vtemp, fp_zero, F_array[coarse_grid]); } else { hypre_MGRAddVectorR(CF_marker[fine_grid], CMRK, fp_one, Vtemp, fp_zero, &(F_array[coarse_grid])); } } hypre_GpuProfilingPopRange(); HYPRE_ANNOTATE_REGION_END("%s", region_name); hypre_sprintf(region_name, "%s-%d", "MGR_Level", fine_grid); hypre_GpuProfilingPopRange(); HYPRE_ANNOTATE_REGION_END("%s", region_name); /* Initialize coarse grid solution array (VPM: double-check this for multiple cycles)*/ hypre_ParVectorSetZeros(U_array[coarse_grid]); ++level; if (level == num_coarse_levels) { cycle_type = 3; } } /* Up cycle */ else if (level != 0) { /* Set fine/coarse grid level indices */ fine_grid = level - 1; coarse_grid = level; l1_norms = l1_norms_array[fine_grid] ? hypre_VectorData(l1_norms_array[fine_grid]) : NULL; CF_marker_data = hypre_IntArrayData(CF_marker[fine_grid]); #if defined(HYPRE_USING_GPU) memory_location = hypre_ParCSRMatrixMemoryLocation(A_array[fine_grid]); exec = hypre_GetExecPolicy1(memory_location); #endif hypre_sprintf(region_name, "%s-%d", "MGR_Level", fine_grid); hypre_GpuProfilingPushRange(region_name); HYPRE_ANNOTATE_REGION_BEGIN("%s", region_name); /* Interpolate */ hypre_sprintf(region_name, "Prolongate"); hypre_GpuProfilingPushRange(region_name); HYPRE_ANNOTATE_REGION_BEGIN("%s", region_name); #if defined(HYPRE_USING_GPU) if (interp_type[fine_grid] > 0 || (exec == HYPRE_EXEC_DEVICE)) #else if (interp_type[fine_grid] > 0) #endif { hypre_ParCSRMatrixMatvec(fp_one, P_array[fine_grid], U_array[coarse_grid], fp_one, U_array[fine_grid]); } else { hypre_MGRAddVectorP(CF_marker[fine_grid], CMRK, fp_one, U_array[coarse_grid], fp_one, &(U_array[fine_grid])); } hypre_GpuProfilingPopRange(); HYPRE_ANNOTATE_REGION_END("%s", region_name); /* Global post smoothing sweeps */ if (post_smoothing & (level_smooth_iters[fine_grid] > 0)) { hypre_sprintf(region_name, "Global-Relax"); hypre_GpuProfilingPushRange(region_name); HYPRE_ANNOTATE_REGION_BEGIN("%s", region_name); /* Block Jacobi smoother */ if ((level_smooth_type[fine_grid] == 0) || (level_smooth_type[fine_grid] == 1)) { #if defined(HYPRE_USING_GPU) if (exec == HYPRE_EXEC_DEVICE) { for (i = 0; i < level_smooth_iters[fine_grid]; i++) { hypre_MGRBlockRelaxSolveDevice(B_array[fine_grid], A_array[fine_grid], F_array[fine_grid], U_array[fine_grid], Vtemp, fp_one); } } else #endif { HYPRE_Real *level_diaginv = (mgr_data -> level_diaginv)[fine_grid]; HYPRE_Int level_blk_size = (fine_grid == 0) ? block_size : block_num_coarse_indexes[fine_grid - 1]; HYPRE_Int nrows = hypre_ParCSRMatrixNumRows(A_array[fine_grid]); HYPRE_Int n_block = nrows / level_blk_size; HYPRE_Int left_size = nrows - n_block * level_blk_size; for (i = 0; i < level_smooth_iters[fine_grid]; i++) { hypre_MGRBlockRelaxSolve(A_array[fine_grid], F_array[fine_grid], U_array[fine_grid], level_blk_size, n_block, left_size, level_smooth_type[fine_grid], level_diaginv, Vtemp); } } } else if ((level_smooth_type[fine_grid] > 1) && (level_smooth_type[fine_grid] < 7)) { for (i = 0; i < level_smooth_iters[fine_grid]; i++) { hypre_BoomerAMGRelax(A_array[fine_grid], F_array[fine_grid], NULL, level_smooth_type[fine_grid] - 1, 0, fp_one, fp_zero, l1_norms, U_array[fine_grid], Vtemp, NULL); } } else if (level_smooth_type[fine_grid] == 8) { /* Euclid ILU */ for (i = 0; i < level_smooth_iters[fine_grid]; i++) { /* Compute residual */ hypre_ParCSRMatrixMatvecOutOfPlace(fp_neg_one, A_array[fine_grid], U_array[fine_grid], fp_one, F_array[fine_grid], Vtemp); /* Solve */ HYPRE_EuclidSolve((mgr_data -> level_smoother)[fine_grid], A_array[fine_grid], Vtemp, Utemp); /* Update solution */ hypre_ParVectorAxpy(fp_one, Utemp, U_array[fine_grid]); } } else if (level_smooth_type[fine_grid] == 16) { /* HYPRE ILU */ HYPRE_ILUSolve((mgr_data -> level_smoother)[fine_grid], A_array[fine_grid], F_array[fine_grid], U_array[fine_grid]); } else if ((mgr_data -> level_smoother)[fine_grid]) { /* User smoother */ hypre_Solver *base = (hypre_Solver*) (mgr_data -> level_smoother)[fine_grid]; hypre_SolverSolve(base)((mgr_data -> level_smoother)[fine_grid], (HYPRE_Matrix) A_array[fine_grid], (HYPRE_Vector) F_array[fine_grid], (HYPRE_Vector) U_array[fine_grid]); } else { /* Generic relaxation interface */ for (i = 0; i < level_smooth_iters[level]; i++) { hypre_BoomerAMGRelax(A_array[fine_grid], F_array[fine_grid], NULL, level_smooth_type[fine_grid], 0, fp_one, fp_one, l1_norms, U_array[fine_grid], Vtemp, Ztemp); } } /* Error checking */ if (HYPRE_GetError()) { hypre_sprintf(msg, "[%d]: Error from global post-relaxation %d at MGR level %d\n", my_id, level_smooth_type[fine_grid], fine_grid); hypre_error_w_msg(HYPRE_ERROR_GENERIC, msg); HYPRE_ClearAllErrors(); } hypre_GpuProfilingPopRange(); HYPRE_ANNOTATE_REGION_END("%s", region_name); } /* End post-smoothing */ hypre_sprintf(region_name, "%s-%d", "MGR_Level", fine_grid); hypre_GpuProfilingPopRange(); HYPRE_ANNOTATE_REGION_END("%s", region_name); --level; } /* End interpolate */ else { Not_Finished = 0; } } HYPRE_ANNOTATE_FUNC_END; hypre_GpuProfilingPopRange(); return hypre_error_flag; } hypre-2.33.0/src/parcsr_ls/par_mgr_stats.c000066400000000000000000000554711477326011500205400ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "_hypre_parcsr_ls.h" #include "par_mgr.h" /* TODO (VPM): include this into _hypre_parcsr_ls.h */ #include "par_ilu.h" /* TODO (VPM): include this into _hypre_parcsr_ls.h */ /*-------------------------------------------------------------------- * hypre_MGRGetGlobalRelaxName *--------------------------------------------------------------------*/ const char* hypre_MGRGetGlobalRelaxName(hypre_ParMGRData *mgr_data, HYPRE_Int level ) { HYPRE_Int smoother_type = hypre_ParMGRDataLevelSmoothTypeI(mgr_data, level); if ((mgr_data -> level_smooth_iters)[level] < 1) { return "--"; } switch (smoother_type) { case 0: return "Blk-Jacobi"; case 1: return "Blk-GS"; case 2: return "GS"; case 3: return "Forward hGS"; case 4: return "Backward hGS"; case 5: return "Chaotic hGS"; case 6: return "hSGS"; case 7: return "Jacobi"; case 8: return "Euclid ILU"; case 13: return "Forward L1-hGS"; case 14: return "Backward L1-hGS"; case 16: /* TODO (VPM): Move this to hypre_ILUGetName */ { hypre_ParILUData *ilu_smoother = (hypre_ParILUData*) hypre_ParMGRDataLevelSmootherI(mgr_data, level); HYPRE_Int ilu_type = hypre_ParILUDataIluType(ilu_smoother); HYPRE_Int ilu_fill = hypre_ParILUDataLfil(ilu_smoother); switch (ilu_type) { case 0: return (ilu_fill == 0) ? "BJ-ILU0" : "BJ-ILUK"; case 1: return "BJ-ILUT"; case 10: return (ilu_fill == 0) ? "GMRES-ILU0" : "GMRES-ILUK"; case 11: return "GMRES-ILUT"; case 20: return (ilu_fill == 0) ? "NSH-ILU0" : "NSH-ILUK"; case 21: return "NSH-ILUT"; case 30: return (ilu_fill == 0) ? "RAS-ILU0" : "RAS-ILUK"; case 31: return "RAS-ILUT"; case 40: return (ilu_fill == 0) ? "ddPQ-GMRES-ILU0" : "ddPQ-GMRES-ILUK"; case 41: return "ddPQ-GMRES-ILUT"; case 50: return "RAP-modILU0"; default: return "Unknown"; } } default: return "Unknown"; } } /*-------------------------------------------------------------------- * hypre_MGRGetFRelaxName *--------------------------------------------------------------------*/ const char* hypre_MGRGetFRelaxName(hypre_ParMGRData *mgr_data, HYPRE_Int level ) { HYPRE_Int F_relax_type = hypre_ParMGRDataFRelaxTypeI(mgr_data, level); if ((mgr_data -> num_relax_sweeps)[level] < 1) { return "--"; } switch (F_relax_type) { case 0: case 7: if (hypre_ParMGRDataInterpTypeI(mgr_data, level) == 12) { return "Blk-Jacobi"; } else { return "Jacobi"; } case 1: return "Default AMG"; case 2: return "User AMG"; case 3: return "Forward hGS"; case 4: return "Backward hGS"; case 5: return "Chaotic hGS"; case 6: return "hSGS"; case 8: return "L1-hSGS"; case 9: return "GaussElim"; case 13: return "Forward L1-hGS"; case 14: return "Backward L1-hGS"; case 16: return "Chebyshev"; case 19: return "LU"; case 99: return "LU piv"; case 199: return "Dense Inv"; default: return "Unknown"; } } /*-------------------------------------------------------------------- * hypre_MGRGetProlongationName *--------------------------------------------------------------------*/ const char* hypre_MGRGetProlongationName(hypre_ParMGRData *mgr_data, HYPRE_Int level ) { switch (hypre_ParMGRDataInterpTypeI(mgr_data, level)) { case 0: return "Injection"; case 1: return "L1-Jac Inv"; case 2: return "Diag Inv"; case 4: return "Approx Inv"; case 5: return "MM-ext"; case 6: return "MM-ext+i"; case 7: return "MM-ext+e"; case 12: return "Blk-Diag Inv"; default: return "Classical"; } } /*-------------------------------------------------------------------- * hypre_MGRGetRestrictionName *--------------------------------------------------------------------*/ const char* hypre_MGRGetRestrictionName(hypre_ParMGRData *mgr_data, HYPRE_Int level ) { switch (hypre_ParMGRDataRestrictTypeI(mgr_data, level)) { case 0: return "Injection"; case 1: return "L1-Jac Inv"; case 2: return "Diag Inv"; case 3: return "Approx Inv"; case 12: return "Blk-Diag Inv"; case 13: return "CPR-like"; case 14: return "Blk-ColLumped"; default: return "Classical"; } } /*-------------------------------------------------------------------- * hypre_MGRGetCoarseGridName *--------------------------------------------------------------------*/ const char* hypre_MGRGetCoarseGridName(hypre_ParMGRData *mgr_data, HYPRE_Int level ) { switch (hypre_ParMGRDataCoarseGridMethodI(mgr_data, level)) { case 0: return "Glk-RAP"; case 1: return "NG-BlkDiag"; case 2: return "NG-CPR-Diag"; case 3: return "NG-CPR-BlkDiag"; case 4: return "NG-ApproxInv"; case 5: return "NG-A_CC"; default: return "Unknown"; } } /*-------------------------------------------------------------------- * hypre_MGRSetupStats * * TODO (VPM): * 1) Add total number of GPUs or number of ranks using 1 GPU? *--------------------------------------------------------------------*/ HYPRE_Int hypre_MGRSetupStats(void *mgr_vdata) { hypre_ParMGRData *mgr_data = (hypre_ParMGRData*) mgr_vdata; /* MGR data */ HYPRE_Int print_level = (mgr_data -> print_level); hypre_ParCSRMatrix *A_finest = hypre_ParMGRDataA(mgr_data, 0); hypre_ParCSRMatrix *A_coarsest = hypre_ParMGRDataRAP(mgr_data); HYPRE_Int num_levels_mgr = hypre_ParMGRDataNumCoarseLevels(mgr_data); HYPRE_Solver coarse_solver = hypre_ParMGRDataCoarseGridSolver(mgr_data); HYPRE_Solver **A_FF_solver = hypre_ParMGRDataAFFsolver(mgr_data); HYPRE_Int *Frelax_type = hypre_ParMGRDataFRelaxType(mgr_data); HYPRE_Int block_size = hypre_ParMGRDataBlockSize(mgr_data); HYPRE_Int *block_num_Cpts = hypre_ParMGRDataBlockNumCoarseIndexes(mgr_data); HYPRE_Int **block_CF_marker = hypre_ParMGRDataBlockCFMarker(mgr_data); /* Finest matrix variables */ MPI_Comm comm = hypre_ParCSRMatrixComm(A_finest); HYPRE_MemoryLocation memory_location = hypre_ParCSRMatrixMemoryLocation(A_finest); HYPRE_ExecutionPolicy exec = hypre_GetExecPolicy1(memory_location); /* Local variables */ hypre_ParAMGData *amg_solver = NULL; hypre_ParAMGData *coarse_amg_solver = NULL; hypre_ParCSRMatrix **A_array; hypre_ParCSRMatrix **P_array; hypre_ParCSRMatrix **R_array; hypre_ParCSRMatrix **RT_array; hypre_MatrixStatsArray *stats_array; HYPRE_Real *gridcomp; HYPRE_Real *opcomp; HYPRE_Real *memcomp; HYPRE_Int max_length; char *coarse_dofs_str = NULL; HYPRE_Int coarsest_mgr_level; HYPRE_Int num_levels_total; HYPRE_Int num_levels[2]; HYPRE_Int max_levels; HYPRE_Int *num_sublevels_amg; HYPRE_Int num_procs, num_threads; HYPRE_Int i, k, myid; HYPRE_Int divisors[1]; /* Print statistics only if first print_level bit is set */ if (!(print_level & HYPRE_MGR_PRINT_INFO_SETUP)) { return hypre_error_flag; } /*------------------------------------------------- * Initialize and allocate data *-------------------------------------------------*/ hypre_MPI_Comm_size(comm, &num_procs); hypre_MPI_Comm_rank(comm, &myid); num_threads = hypre_NumThreads(); coarsest_mgr_level = num_levels_mgr; num_sublevels_amg = hypre_CTAlloc(HYPRE_Int, num_levels_mgr + 1, HYPRE_MEMORY_HOST); /* Check MGR's coarse level solver */ if ((HYPRE_PtrToParSolverFcn) hypre_ParMGRDataCoarseGridSolverSetup(mgr_data) == HYPRE_BoomerAMGSetup) { coarse_amg_solver = (hypre_ParAMGData *) coarse_solver; num_sublevels_amg[coarsest_mgr_level] = hypre_ParAMGDataNumLevels(coarse_amg_solver); } #ifdef HYPRE_USING_DSUPERLU else if ((HYPRE_PtrToParSolverFcn) hypre_ParMGRDataCoarseGridSolverSetup(mgr_data) == (HYPRE_PtrToParSolverFcn) hypre_MGRDirectSolverSetup) { /* TODO (VPM): Set SuperLU solver specifics */ num_sublevels_amg[coarsest_mgr_level] = 0; } #endif else { hypre_TFree(num_sublevels_amg, HYPRE_MEMORY_HOST); hypre_error_w_msg(HYPRE_ERROR_GENERIC, "Unknown coarsest level solver for MGR!\n"); return hypre_error_flag; } num_levels_total = num_levels_mgr + num_sublevels_amg[coarsest_mgr_level]; /* Compute number of AMG sublevels at each MGR level */ max_levels = num_levels_total; for (i = 0; i < num_levels_mgr; i++) { if (Frelax_type[i] == 2) { amg_solver = (hypre_ParAMGData *) A_FF_solver[i]; num_sublevels_amg[i] = hypre_ParAMGDataNumLevels(amg_solver); max_levels = hypre_max(max_levels, num_sublevels_amg[i]); } } /* Create array of statistics */ stats_array = hypre_MatrixStatsArrayCreate(max_levels + 1); /*------------------------------------------------- * Print general info *-------------------------------------------------*/ if (!myid) { /* Determine max_length for printing coarse DOFs */ if (block_num_Cpts) { coarse_dofs_str = hypre_ConvertIndicesToString(block_num_Cpts[0], block_CF_marker[0]); max_length = hypre_min(strlen(coarse_dofs_str) + 2, 50); hypre_TFree(coarse_dofs_str, HYPRE_MEMORY_HOST); } else { max_length = 10; } hypre_printf("\n\n"); hypre_printf(" Num MPI tasks = %d\n", num_procs); hypre_printf(" Num OpenMP threads = %d\n", num_threads); hypre_printf(" Execution policy = %s\n\n", HYPRE_GetExecutionPolicyName(exec)); hypre_printf("\n"); hypre_printf("MGR SETUP PARAMETERS:\n\n"); hypre_printf(" MGR num levels = %d\n", num_levels_mgr); hypre_printf(" coarse AMG num levels = %d\n", num_sublevels_amg[coarsest_mgr_level]); hypre_printf(" Total num levels = %d\n\n", num_levels_total); divisors[0] = 83 + max_length; //hypre_printf("\nMGR level options:\n\n"); hypre_printf("%10s %*s %11s %14s %14s\n", "Total", max_length, "Coarse", "Global", "Fine", "Coarse"); hypre_printf("%3s %6s %*s %11s %14s %14s %14s %14s\n", "lev", "DOFs", max_length, "DOFs", "relaxation", "relaxation", "grid method", "Prolongation", "Restriction"); HYPRE_PRINT_TOP_DIVISOR(1, divisors); for (i = 0; i < num_levels_mgr; i++) { if (block_num_Cpts) { coarse_dofs_str = hypre_ConvertIndicesToString(block_num_Cpts[i], block_CF_marker[i]); } hypre_printf("%3d %6d %*s %11s %14s %14s %14s %14s\n", i, (i > 0 && block_num_Cpts) ? block_num_Cpts[i - 1] : block_size, max_length, (block_num_Cpts) ? coarse_dofs_str : "--", hypre_MGRGetGlobalRelaxName(mgr_data, i), hypre_MGRGetFRelaxName(mgr_data, i), hypre_MGRGetCoarseGridName(mgr_data, i), hypre_MGRGetProlongationName(mgr_data, i), hypre_MGRGetRestrictionName(mgr_data, i)); hypre_TFree(coarse_dofs_str, HYPRE_MEMORY_HOST); } hypre_printf("\n\n"); } /*------------------------------------------------- * Print MGR hierarchy info *-------------------------------------------------*/ /* Set pointers to level matrices */ A_array = hypre_TAlloc(hypre_ParCSRMatrix *, max_levels, HYPRE_MEMORY_HOST); for (i = 0; i < num_levels_mgr; i++) { A_array[i] = hypre_ParMGRDataA(mgr_data, i); } A_array[num_levels_mgr] = A_coarsest; for (i = 1; i < num_sublevels_amg[coarsest_mgr_level]; i++) { A_array[num_levels_mgr + i] = hypre_ParAMGDataAArray(coarse_amg_solver)[i]; } /* Compute statistics data structure */ hypre_ParCSRMatrixStatsArrayCompute(num_levels_total, A_array, stats_array); if (!myid) { const char *msg[] = { "Full Operator Matrix Hierarchy Information:\n\n", "MGR's coarsest level", "\t( MGR )", "\t( AMG )" }; num_levels[0] = num_levels_mgr - 1; num_levels[1] = num_sublevels_amg[coarsest_mgr_level] + 1; hypre_MatrixStatsArrayPrint(2, num_levels, 1, 0, msg, stats_array); } /*------------------------------------------------- * Print MGR level input data *-------------------------------------------------*/ /* Set pointer to level matrices */ P_array = hypre_TAlloc(hypre_ParCSRMatrix *, max_levels, HYPRE_MEMORY_HOST); R_array = hypre_TAlloc(hypre_ParCSRMatrix *, max_levels, HYPRE_MEMORY_HOST); RT_array = hypre_TAlloc(hypre_ParCSRMatrix *, max_levels, HYPRE_MEMORY_HOST); for (i = 0; i < num_levels_mgr; i++) { P_array[i] = hypre_ParMGRDataP(mgr_data, i); if (hypre_ParMGRDataR(mgr_data, i)) { R_array[i] = hypre_ParMGRDataR(mgr_data, i); } else if (hypre_ParMGRDataRT(mgr_data, i)) { hypre_ParCSRMatrixTranspose(hypre_ParMGRDataRT(mgr_data, i), &R_array[i], 1); } else { R_array[i] = NULL; } } for (i = 0; i < num_sublevels_amg[coarsest_mgr_level]; i++) { P_array[num_levels_mgr + i] = hypre_ParAMGDataPArray(coarse_amg_solver)[i]; R_array[num_levels_mgr + i] = NULL; } /* Compute statistics data structure for Prolongation operator */ hypre_ParCSRMatrixStatsArrayCompute(num_levels_total - 1, P_array, stats_array); if (!myid) { const char *msg[] = { "Full Prolongation Matrix Hierarchy Information:\n\n", "MGR's coarsest level", "\t( MGR )", "\t( AMG )" }; num_levels[0] = num_levels_mgr; num_levels[1] = num_sublevels_amg[coarsest_mgr_level] - 1; hypre_MatrixStatsArrayPrint(2, num_levels, 1, 0, msg, stats_array); } /* Compute statistics data structure for Restriction operator (only for MGR) */ hypre_ParCSRMatrixStatsArrayCompute(num_levels_mgr, R_array, stats_array); if (!myid) { const char *msg[] = { "MGR Restriction Matrix Hierarchy Information:\n\n" }; num_levels[0] = num_levels_mgr; hypre_MatrixStatsArrayPrint(1, num_levels, 1, 0, msg, stats_array); } /*------------------------------------------------- * Print MGR F-relaxation info *-------------------------------------------------*/ for (i = 0; i < num_levels_mgr; i++) { if (num_sublevels_amg[i] > 0) { if (!myid) { hypre_printf("At MGR level %d --> F-relaxation solver parameters\n\n", i); } amg_solver = (hypre_ParAMGData *) A_FF_solver[i]; /* General AMG info */ if (!myid) { hypre_BoomerAMGPrintGeneralInfo(amg_solver, 3); } /* Gather A matrices */ for (k = 0; k < num_sublevels_amg[i]; k++) { A_array[k] = hypre_ParAMGDataAArray(amg_solver)[k]; } /* Compute statistics */ hypre_ParCSRMatrixStatsArrayCompute(num_sublevels_amg[i], A_array, stats_array); /* Print A matrices info */ if (!myid) { const char *msg[] = {"Operator Matrix Hierarchy Information:\n\n"}; num_levels[0] = num_sublevels_amg[i]; hypre_MatrixStatsArrayPrint(1, num_levels, 1, 3, msg, stats_array); } /* Gather P matrices */ for (k = 0; k < num_sublevels_amg[i] - 1; k++) { P_array[k] = hypre_ParAMGDataPArray(amg_solver)[k]; } /* Compute statistics */ hypre_ParCSRMatrixStatsArrayCompute(num_sublevels_amg[i] - 1, P_array, stats_array); /* Print P matrices info */ if (!myid) { const char *msg[] = {"Prolongation Matrix Hierarchy Information:\n\n"}; num_levels[0] = num_sublevels_amg[i] - 1; hypre_MatrixStatsArrayPrint(1, num_levels, 1, 3, msg, stats_array); } } } /*------------------------------------------------- * Print MGR coarsest level solver info *-------------------------------------------------*/ if (!myid && coarse_amg_solver && num_sublevels_amg[coarsest_mgr_level] > 1) { hypre_printf("At coarsest MGR level --> Solver parameters:\n\n"); hypre_BoomerAMGPrintGeneralInfo(coarse_amg_solver, 3); } /*------------------------------------------------- * Print MGR complexities *-------------------------------------------------*/ /* Allocate memory for complexities arrays */ gridcomp = hypre_CTAlloc(HYPRE_Real, num_levels_mgr + 2, HYPRE_MEMORY_HOST); opcomp = hypre_CTAlloc(HYPRE_Real, num_levels_mgr + 2, HYPRE_MEMORY_HOST); memcomp = hypre_CTAlloc(HYPRE_Real, num_levels_mgr + 2, HYPRE_MEMORY_HOST); /* Compute complexities at each MGR level */ for (i = 0; i < num_levels_mgr + 1; i++) { if (num_sublevels_amg[i] > 0) { if (i < num_levels_mgr) { amg_solver = (hypre_ParAMGData *) A_FF_solver[i]; } else { amg_solver = coarse_amg_solver; } for (k = 0; k < num_sublevels_amg[i]; k++) { A_array[k] = hypre_ParAMGDataAArray(amg_solver)[k]; P_array[k] = (k < (num_sublevels_amg[i] - 1)) ? hypre_ParAMGDataPArray(amg_solver)[k] : NULL; RT_array[k] = (k < (num_sublevels_amg[i] - 1)) ? hypre_ParAMGDataRArray(amg_solver)[k] : NULL; gridcomp[i] += (HYPRE_Real) hypre_ParCSRMatrixGlobalNumRows(A_array[k]); opcomp[i] += (HYPRE_Real) hypre_ParCSRMatrixNumNonzeros(A_array[k]); if (k < (num_sublevels_amg[i] - 1)) { memcomp[i] += (HYPRE_Real) hypre_ParCSRMatrixNumNonzeros(A_array[k]) + (HYPRE_Real) hypre_ParCSRMatrixNumNonzeros(P_array[k]) + (HYPRE_Real) hypre_ParCSRMatrixNumNonzeros(RT_array[k]); } } gridcomp[num_levels_mgr + 1] += gridcomp[i]; opcomp[num_levels_mgr + 1] += opcomp[i] / hypre_ParCSRMatrixNumNonzeros(A_finest); memcomp[num_levels_mgr + 1] += memcomp[i] / hypre_ParCSRMatrixNumNonzeros(A_finest); gridcomp[i] /= (HYPRE_Real) hypre_ParCSRMatrixGlobalNumRows(A_array[0]); opcomp[i] /= hypre_ParCSRMatrixDNumNonzeros(A_array[0]); memcomp[i] /= hypre_ParCSRMatrixDNumNonzeros(A_array[0]); } else { /* TODO (VPM): Assume single-level for now, extend to ILU later */ gridcomp[i] = 1.0; opcomp[i] = 1.0; /* TODO (VPM): adjust according to F/G-relaxation choices */ memcomp[i] = 1.0; A_array[i] = hypre_ParMGRDataA(mgr_data, i); gridcomp[num_levels_mgr + 1] += hypre_ParCSRMatrixGlobalNumRows(A_array[i]); opcomp[num_levels_mgr + 1] += hypre_ParCSRMatrixDNumNonzeros(A_array[i]) / hypre_ParCSRMatrixNumNonzeros(A_finest); memcomp[num_levels_mgr + 1] += hypre_ParCSRMatrixDNumNonzeros(A_array[i]) / hypre_ParCSRMatrixNumNonzeros(A_finest); } } gridcomp[num_levels_mgr + 1] /= (HYPRE_Real) hypre_ParCSRMatrixGlobalNumRows(A_finest); /* Print complexities */ if (!myid) { divisors[0] = 37; hypre_printf("MGR complexities:\n\n"); hypre_printf("%4s ", "lev"); hypre_printf("%10s ", "grid"); hypre_printf("%10s ", "operator"); hypre_printf("%10s ", "memory"); hypre_printf("\n"); HYPRE_PRINT_TOP_DIVISOR(1, divisors); for (i = 0; i < num_levels_mgr + 1; i++) { hypre_printf("%4d ", i); hypre_printf("%10.3f ", gridcomp[i]); hypre_printf("%10.3f ", opcomp[i]); hypre_printf("%10.3f ", memcomp[i]); hypre_printf("\n"); } HYPRE_PRINT_MID_DIVISOR(1, divisors, "") hypre_printf("%4s ", "All"); hypre_printf("%10.3f ", gridcomp[i]); hypre_printf("%10.3f ", opcomp[i]); hypre_printf("%10.3f ", memcomp[i]); hypre_printf("\n"); HYPRE_PRINT_MID_DIVISOR(1, divisors, "") hypre_printf("\n\n"); } /*------------------------------------------------- * Free memory *-------------------------------------------------*/ for (i = 0; i < num_levels_mgr; i++) { if (hypre_ParMGRDataRT(mgr_data, i)) { hypre_ParCSRMatrixDestroy(R_array[i]); } } hypre_MatrixStatsArrayDestroy(stats_array); hypre_TFree(A_array, HYPRE_MEMORY_HOST); hypre_TFree(P_array, HYPRE_MEMORY_HOST); hypre_TFree(R_array, HYPRE_MEMORY_HOST); hypre_TFree(RT_array, HYPRE_MEMORY_HOST); hypre_TFree(num_sublevels_amg, HYPRE_MEMORY_HOST); hypre_TFree(gridcomp, HYPRE_MEMORY_HOST); hypre_TFree(opcomp, HYPRE_MEMORY_HOST); hypre_TFree(memcomp, HYPRE_MEMORY_HOST); return hypre_error_flag; } hypre-2.33.0/src/parcsr_ls/par_mod_lr_interp.c000066400000000000000000001775211477326011500213730ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "_hypre_parcsr_ls.h" #include "aux_interp.h" /*--------------------------------------------------------------------------- * hypre_BoomerAMGBuildModExtInterp * Comment: *--------------------------------------------------------------------------*/ HYPRE_Int hypre_BoomerAMGBuildModExtInterpHost(hypre_ParCSRMatrix *A, HYPRE_Int *CF_marker, hypre_ParCSRMatrix *S, HYPRE_BigInt *num_cpts_global, HYPRE_Int num_functions, HYPRE_Int *dof_func, HYPRE_Int debug_flag, HYPRE_Real trunc_factor, HYPRE_Int max_elmts, hypre_ParCSRMatrix **P_ptr) { HYPRE_UNUSED_VAR(debug_flag); /* Communication Variables */ MPI_Comm comm = hypre_ParCSRMatrixComm(A); HYPRE_MemoryLocation memory_location_P = hypre_ParCSRMatrixMemoryLocation(A); hypre_ParCSRCommPkg *comm_pkg = hypre_ParCSRMatrixCommPkg(A); hypre_ParCSRCommHandle *comm_handle = NULL; HYPRE_Int my_id, num_procs; /* Variables to store input variables */ hypre_CSRMatrix *A_diag = hypre_ParCSRMatrixDiag(A); HYPRE_Real *A_diag_data = hypre_CSRMatrixData(A_diag); HYPRE_Int *A_diag_j = hypre_CSRMatrixJ(A_diag); HYPRE_Int *A_diag_i = hypre_CSRMatrixI(A_diag); hypre_CSRMatrix *A_offd = hypre_ParCSRMatrixOffd(A); HYPRE_Real *A_offd_data = hypre_CSRMatrixData(A_offd); HYPRE_Int *A_offd_j = hypre_CSRMatrixJ(A_offd); HYPRE_Int *A_offd_i = hypre_CSRMatrixI(A_offd); hypre_CSRMatrix *S_diag = hypre_ParCSRMatrixDiag(S); HYPRE_Int *S_diag_j = hypre_CSRMatrixJ(S_diag); HYPRE_Int *S_diag_i = hypre_CSRMatrixI(S_diag); hypre_CSRMatrix *S_offd = hypre_ParCSRMatrixOffd(S); HYPRE_Int *S_offd_j = hypre_CSRMatrixJ(S_offd); HYPRE_Int *S_offd_i = hypre_CSRMatrixI(S_offd); HYPRE_Int n_fine = hypre_CSRMatrixNumRows(A_diag); HYPRE_BigInt total_global_cpts; /* Interpolation matrix P */ hypre_ParCSRMatrix *P; hypre_CSRMatrix *P_diag; hypre_CSRMatrix *P_offd; HYPRE_Real *P_diag_data = NULL; HYPRE_Int *P_diag_i, *P_diag_j = NULL; HYPRE_Real *P_offd_data = NULL; HYPRE_Int *P_offd_i, *P_offd_j = NULL; /* Intermediate matrices */ hypre_ParCSRMatrix *As_FF, *As_FC, *W; HYPRE_Real *D_q, *D_w; hypre_CSRMatrix *As_FF_diag; hypre_CSRMatrix *As_FF_offd; hypre_CSRMatrix *As_FC_diag; hypre_CSRMatrix *As_FC_offd; hypre_CSRMatrix *W_diag; hypre_CSRMatrix *W_offd; HYPRE_Int *As_FF_diag_i; HYPRE_Int *As_FF_offd_i; HYPRE_Int *As_FC_diag_i; HYPRE_Int *As_FC_offd_i; HYPRE_Int *W_diag_i; HYPRE_Int *W_offd_i; HYPRE_Int *W_diag_j; HYPRE_Int *W_offd_j; HYPRE_Real *As_FF_diag_data; HYPRE_Real *As_FF_offd_data; HYPRE_Real *As_FC_diag_data; HYPRE_Real *As_FC_offd_data; HYPRE_Real *W_diag_data; HYPRE_Real *W_offd_data; HYPRE_BigInt *col_map_offd_P = NULL; HYPRE_BigInt *new_col_map_offd = NULL; HYPRE_Int P_diag_size; HYPRE_Int P_offd_size; HYPRE_Int new_ncols_P_offd; HYPRE_Int num_cols_P_offd; HYPRE_Int *P_marker = NULL; HYPRE_Int *dof_func_offd = NULL; /* Loop variables */ HYPRE_Int index; HYPRE_Int i, j; HYPRE_Int *cpt_array; HYPRE_Int *start_array; HYPRE_Int *startf_array; HYPRE_Int start, stop, startf, stopf; HYPRE_Int cnt_diag, cnt_offd, row, c_pt; /* Definitions */ //HYPRE_Real wall_time; HYPRE_Int n_Cpts, n_Fpts; HYPRE_Int num_threads = hypre_NumThreads(); //if (debug_flag==4) wall_time = time_getWallclockSeconds(); /* BEGIN */ hypre_MPI_Comm_size(comm, &num_procs); hypre_MPI_Comm_rank(comm, &my_id); if (my_id == (num_procs - 1)) { total_global_cpts = num_cpts_global[1]; } hypre_MPI_Bcast(&total_global_cpts, 1, HYPRE_MPI_BIG_INT, num_procs - 1, comm); n_Cpts = num_cpts_global[1] - num_cpts_global[0]; hypre_ParCSRMatrixGenerateFFFCHost(A, CF_marker, num_cpts_global, S, &As_FC, &As_FF); As_FC_diag = hypre_ParCSRMatrixDiag(As_FC); As_FC_diag_i = hypre_CSRMatrixI(As_FC_diag); As_FC_diag_data = hypre_CSRMatrixData(As_FC_diag); As_FC_offd = hypre_ParCSRMatrixOffd(As_FC); As_FC_offd_i = hypre_CSRMatrixI(As_FC_offd); As_FC_offd_data = hypre_CSRMatrixData(As_FC_offd); As_FF_diag = hypre_ParCSRMatrixDiag(As_FF); As_FF_diag_i = hypre_CSRMatrixI(As_FF_diag); As_FF_diag_data = hypre_CSRMatrixData(As_FF_diag); As_FF_offd = hypre_ParCSRMatrixOffd(As_FF); As_FF_offd_i = hypre_CSRMatrixI(As_FF_offd); As_FF_offd_data = hypre_CSRMatrixData(As_FF_offd); n_Fpts = hypre_CSRMatrixNumRows(As_FF_diag); D_q = hypre_CTAlloc(HYPRE_Real, n_Fpts, HYPRE_MEMORY_HOST); D_w = hypre_CTAlloc(HYPRE_Real, n_Fpts, HYPRE_MEMORY_HOST); cpt_array = hypre_CTAlloc(HYPRE_Int, num_threads, HYPRE_MEMORY_HOST); start_array = hypre_CTAlloc(HYPRE_Int, num_threads + 1, HYPRE_MEMORY_HOST); startf_array = hypre_CTAlloc(HYPRE_Int, num_threads + 1, HYPRE_MEMORY_HOST); #ifdef HYPRE_USING_OPENMP #pragma omp parallel private(i,j,start,stop,startf,stopf,row) #endif { HYPRE_Int my_thread_num = hypre_GetThreadNum(); HYPRE_Real beta, gamma; start = (n_fine / num_threads) * my_thread_num; if (my_thread_num == num_threads - 1) { stop = n_fine; } else { stop = (n_fine / num_threads) * (my_thread_num + 1); } start_array[my_thread_num + 1] = stop; for (i = start; i < stop; i++) { if (CF_marker[i] > 0) { cpt_array[my_thread_num]++; } } #ifdef HYPRE_USING_OPENMP #pragma omp barrier #endif if (my_thread_num == 0) { for (i = 1; i < num_threads; i++) { cpt_array[i] += cpt_array[i - 1]; } if (num_functions > 1) { HYPRE_Int *int_buf_data = NULL; HYPRE_Int num_sends, startc; HYPRE_Int num_cols_A_offd = hypre_CSRMatrixNumCols(A_offd); dof_func_offd = hypre_CTAlloc(HYPRE_Int, num_cols_A_offd, HYPRE_MEMORY_HOST); index = 0; num_sends = hypre_ParCSRCommPkgNumSends(comm_pkg); int_buf_data = hypre_CTAlloc(HYPRE_Int, hypre_ParCSRCommPkgSendMapStart(comm_pkg, num_sends), HYPRE_MEMORY_HOST); for (i = 0; i < num_sends; i++) { startc = hypre_ParCSRCommPkgSendMapStart(comm_pkg, i); for (j = startc; j < hypre_ParCSRCommPkgSendMapStart(comm_pkg, i + 1); j++) { int_buf_data[index++] = dof_func[hypre_ParCSRCommPkgSendMapElmt(comm_pkg, j)]; } } comm_handle = hypre_ParCSRCommHandleCreate( 11, comm_pkg, int_buf_data, dof_func_offd); hypre_ParCSRCommHandleDestroy(comm_handle); hypre_TFree(int_buf_data, HYPRE_MEMORY_HOST); } } #ifdef HYPRE_USING_OPENMP #pragma omp barrier #endif if (my_thread_num > 0) { startf = start - cpt_array[my_thread_num - 1]; } else { startf = 0; } if (my_thread_num < num_threads - 1) { stopf = stop - cpt_array[my_thread_num]; } else { stopf = n_Fpts; } startf_array[my_thread_num + 1] = stopf; /* Create D_q = D_beta */ for (i = startf; i < stopf; i++) { for (j = As_FC_diag_i[i]; j < As_FC_diag_i[i + 1]; j++) { D_q[i] += As_FC_diag_data[j]; } for (j = As_FC_offd_i[i]; j < As_FC_offd_i[i + 1]; j++) { D_q[i] += As_FC_offd_data[j]; } } /* Create D_w = D_alpha + D_gamma */ row = startf; for (i = start; i < stop; i++) { if (CF_marker[i] < 0) { if (num_functions > 1) { HYPRE_Int jA, jS, jC; jC = A_diag_i[i]; for (j = S_diag_i[i]; j < S_diag_i[i + 1]; j++) { jS = S_diag_j[j]; jA = A_diag_j[jC]; while (jA != jS) { if (dof_func[i] == dof_func[jA]) { D_w[row] += A_diag_data[jC++]; } else { jC++; } jA = A_diag_j[jC]; } jC++; } for (j = jC; j < A_diag_i[i + 1]; j++) { if (dof_func[i] == dof_func[A_diag_j[j]]) { D_w[row] += A_diag_data[j]; } } jC = A_offd_i[i]; for (j = S_offd_i[i]; j < S_offd_i[i + 1]; j++) { jS = S_offd_j[j]; jA = A_offd_j[jC]; while (jA != jS) { if (dof_func[i] == dof_func_offd[jA]) { D_w[row] += A_offd_data[jC++]; } else { jC++; } jA = A_offd_j[jC]; } jC++; } for (j = jC; j < A_offd_i[i + 1]; j++) { if (dof_func[i] == dof_func_offd[A_offd_j[j]]) { D_w[row] += A_offd_data[j]; } } row++; } else { for (j = A_diag_i[i]; j < A_diag_i[i + 1]; j++) { D_w[row] += A_diag_data[j]; } for (j = A_offd_i[i]; j < A_offd_i[i + 1]; j++) { D_w[row] += A_offd_data[j]; } for (j = As_FF_diag_i[row] + 1; j < As_FF_diag_i[row + 1]; j++) { D_w[row] -= As_FF_diag_data[j]; } for (j = As_FF_offd_i[row]; j < As_FF_offd_i[row + 1]; j++) { D_w[row] -= As_FF_offd_data[j]; } D_w[row] -= D_q[row]; row++; } } } for (i = startf; i < stopf; i++) { j = As_FF_diag_i[i]; if (D_w[i]) { beta = 1.0 / D_w[i]; } else { beta = 1.0; } As_FF_diag_data[j] = beta * D_q[i]; if (D_q[i]) { gamma = -1.0 / D_q[i]; } else { gamma = 1.0; } for (j = As_FF_diag_i[i] + 1; j < As_FF_diag_i[i + 1]; j++) { As_FF_diag_data[j] *= beta; } for (j = As_FF_offd_i[i]; j < As_FF_offd_i[i + 1]; j++) { As_FF_offd_data[j] *= beta; } for (j = As_FC_diag_i[i]; j < As_FC_diag_i[i + 1]; j++) { As_FC_diag_data[j] *= gamma; } for (j = As_FC_offd_i[i]; j < As_FC_offd_i[i + 1]; j++) { As_FC_offd_data[j] *= gamma; } } } /* end parallel region */ W = hypre_ParMatmul(As_FF, As_FC); W_diag = hypre_ParCSRMatrixDiag(W); W_offd = hypre_ParCSRMatrixOffd(W); W_diag_i = hypre_CSRMatrixI(W_diag); W_diag_j = hypre_CSRMatrixJ(W_diag); W_diag_data = hypre_CSRMatrixData(W_diag); W_offd_i = hypre_CSRMatrixI(W_offd); W_offd_j = hypre_CSRMatrixJ(W_offd); W_offd_data = hypre_CSRMatrixData(W_offd); num_cols_P_offd = hypre_CSRMatrixNumCols(W_offd); /*----------------------------------------------------------------------- * Intialize data for P *-----------------------------------------------------------------------*/ P_diag_i = hypre_CTAlloc(HYPRE_Int, n_fine + 1, memory_location_P); P_offd_i = hypre_CTAlloc(HYPRE_Int, n_fine + 1, memory_location_P); P_diag_size = n_Cpts + hypre_CSRMatrixI(W_diag)[n_Fpts]; P_offd_size = hypre_CSRMatrixI(W_offd)[n_Fpts]; if (P_diag_size) { P_diag_j = hypre_CTAlloc(HYPRE_Int, P_diag_size, memory_location_P); P_diag_data = hypre_CTAlloc(HYPRE_Real, P_diag_size, memory_location_P); } if (P_offd_size) { P_offd_j = hypre_CTAlloc(HYPRE_Int, P_offd_size, memory_location_P); P_offd_data = hypre_CTAlloc(HYPRE_Real, P_offd_size, memory_location_P); } #ifdef HYPRE_USING_OPENMP #pragma omp parallel private(i,j,start,stop,startf,stopf,c_pt,row,cnt_diag,cnt_offd) #endif { HYPRE_Int my_thread_num = hypre_GetThreadNum(); startf = startf_array[my_thread_num]; stopf = startf_array[my_thread_num + 1]; start = start_array[my_thread_num]; stop = start_array[my_thread_num + 1]; if (my_thread_num > 0) { c_pt = cpt_array[my_thread_num - 1]; } else { c_pt = 0; } cnt_diag = W_diag_i[startf] + c_pt; cnt_offd = W_offd_i[startf]; row = startf; for (i = start; i < stop; i++) { if (CF_marker[i] > 0) { P_diag_j[cnt_diag] = c_pt++; P_diag_data[cnt_diag++] = 1.0; } else { for (j = W_diag_i[row]; j < W_diag_i[row + 1]; j++) { P_diag_j[cnt_diag] = W_diag_j[j]; P_diag_data[cnt_diag++] = W_diag_data[j]; } for (j = W_offd_i[row]; j < W_offd_i[row + 1]; j++) { P_offd_j[cnt_offd] = W_offd_j[j]; P_offd_data[cnt_offd++] = W_offd_data[j]; } row++; } P_diag_i[i + 1] = cnt_diag; P_offd_i[i + 1] = cnt_offd; } } /* end parallel region */ /*----------------------------------------------------------------------- * Create matrix *-----------------------------------------------------------------------*/ P = hypre_ParCSRMatrixCreate(comm, hypre_ParCSRMatrixGlobalNumRows(A), total_global_cpts, hypre_ParCSRMatrixColStarts(A), num_cpts_global, num_cols_P_offd, P_diag_i[n_fine], P_offd_i[n_fine]); P_diag = hypre_ParCSRMatrixDiag(P); hypre_CSRMatrixData(P_diag) = P_diag_data; hypre_CSRMatrixI(P_diag) = P_diag_i; hypre_CSRMatrixJ(P_diag) = P_diag_j; P_offd = hypre_ParCSRMatrixOffd(P); hypre_CSRMatrixData(P_offd) = P_offd_data; hypre_CSRMatrixI(P_offd) = P_offd_i; hypre_CSRMatrixJ(P_offd) = P_offd_j; hypre_ParCSRMatrixColMapOffd(P) = hypre_ParCSRMatrixColMapOffd(W); hypre_ParCSRMatrixColMapOffd(W) = NULL; hypre_CSRMatrixMemoryLocation(P_diag) = memory_location_P; hypre_CSRMatrixMemoryLocation(P_offd) = memory_location_P; /* Compress P, removing coefficients smaller than trunc_factor * Max */ if (trunc_factor != 0.0 || max_elmts > 0) { HYPRE_Int *map; hypre_BoomerAMGInterpTruncation(P, trunc_factor, max_elmts); P_diag_data = hypre_CSRMatrixData(P_diag); P_diag_i = hypre_CSRMatrixI(P_diag); P_diag_j = hypre_CSRMatrixJ(P_diag); P_offd_data = hypre_CSRMatrixData(P_offd); P_offd_i = hypre_CSRMatrixI(P_offd); P_offd_j = hypre_CSRMatrixJ(P_offd); P_diag_size = P_diag_i[n_fine]; P_offd_size = P_offd_i[n_fine]; col_map_offd_P = hypre_ParCSRMatrixColMapOffd(P); if (num_cols_P_offd) { P_marker = hypre_CTAlloc(HYPRE_Int, num_cols_P_offd, HYPRE_MEMORY_HOST); for (i = 0; i < P_offd_size; i++) { P_marker[P_offd_j[i]] = 1; } new_ncols_P_offd = 0; for (i = 0; i < num_cols_P_offd; i++) { if (P_marker[i]) { new_ncols_P_offd++; } } new_col_map_offd = hypre_CTAlloc(HYPRE_BigInt, new_ncols_P_offd, HYPRE_MEMORY_HOST); map = hypre_CTAlloc(HYPRE_Int, new_ncols_P_offd, HYPRE_MEMORY_HOST); index = 0; for (i = 0; i < num_cols_P_offd; i++) if (P_marker[i]) { new_col_map_offd[index] = col_map_offd_P[i]; map[index++] = i; } hypre_TFree(P_marker, HYPRE_MEMORY_HOST); #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i) HYPRE_SMP_SCHEDULE #endif for (i = 0; i < P_offd_size; i++) { P_offd_j[i] = hypre_BinarySearch(map, P_offd_j[i], new_ncols_P_offd); } hypre_TFree(col_map_offd_P, HYPRE_MEMORY_HOST); hypre_ParCSRMatrixColMapOffd(P) = new_col_map_offd; hypre_CSRMatrixNumCols(P_offd) = new_ncols_P_offd; hypre_TFree(map, HYPRE_MEMORY_HOST); } } hypre_MatvecCommPkgCreate(P); *P_ptr = P; /* Deallocate memory */ hypre_TFree(D_q, HYPRE_MEMORY_HOST); hypre_TFree(D_w, HYPRE_MEMORY_HOST); hypre_TFree(cpt_array, HYPRE_MEMORY_HOST); hypre_TFree(start_array, HYPRE_MEMORY_HOST); hypre_TFree(startf_array, HYPRE_MEMORY_HOST); hypre_TFree(dof_func_offd, HYPRE_MEMORY_HOST); hypre_ParCSRMatrixDestroy(As_FF); hypre_ParCSRMatrixDestroy(As_FC); hypre_ParCSRMatrixDestroy(W); return hypre_error_flag; } /*-----------------------------------------------------------------------* * Modularized Extended Interpolation *-----------------------------------------------------------------------*/ HYPRE_Int hypre_BoomerAMGBuildModExtInterp(hypre_ParCSRMatrix *A, HYPRE_Int *CF_marker, hypre_ParCSRMatrix *S, HYPRE_BigInt *num_cpts_global, HYPRE_Int num_functions, HYPRE_Int *dof_func, HYPRE_Int debug_flag, HYPRE_Real trunc_factor, HYPRE_Int max_elmts, hypre_ParCSRMatrix **P_ptr) { hypre_GpuProfilingPushRange("ModExtInterp"); HYPRE_Int ierr = 0; #if defined(HYPRE_USING_GPU) HYPRE_ExecutionPolicy exec = hypre_GetExecPolicy1( hypre_ParCSRMatrixMemoryLocation(A) ); if (exec == HYPRE_EXEC_DEVICE) { ierr = hypre_BoomerAMGBuildExtInterpDevice(A, CF_marker, S, num_cpts_global, 1, NULL, debug_flag, trunc_factor, max_elmts, P_ptr); } else #endif { ierr = hypre_BoomerAMGBuildModExtInterpHost(A, CF_marker, S, num_cpts_global, num_functions, dof_func, debug_flag, trunc_factor, max_elmts, P_ptr); } hypre_GpuProfilingPopRange(); return ierr; } /*--------------------------------------------------------------------------- * hypre_BoomerAMGBuildModExtPIInterp * Comment: *--------------------------------------------------------------------------*/ HYPRE_Int hypre_BoomerAMGBuildModExtPIInterpHost(hypre_ParCSRMatrix *A, HYPRE_Int *CF_marker, hypre_ParCSRMatrix *S, HYPRE_BigInt *num_cpts_global, HYPRE_Int debug_flag, HYPRE_Int num_functions, HYPRE_Int *dof_func, HYPRE_Real trunc_factor, HYPRE_Int max_elmts, hypre_ParCSRMatrix **P_ptr) { HYPRE_UNUSED_VAR(debug_flag); /* Communication Variables */ MPI_Comm comm = hypre_ParCSRMatrixComm(A); hypre_ParCSRCommPkg *comm_pkg = hypre_ParCSRMatrixCommPkg(A); hypre_ParCSRCommHandle *comm_handle = NULL; HYPRE_MemoryLocation memory_location_P = hypre_ParCSRMatrixMemoryLocation(A); HYPRE_Int my_id, num_procs; /* Variables to store input variables */ hypre_CSRMatrix *A_diag = hypre_ParCSRMatrixDiag(A); HYPRE_Real *A_diag_data = hypre_CSRMatrixData(A_diag); HYPRE_Int *A_diag_i = hypre_CSRMatrixI(A_diag); HYPRE_Int *A_diag_j = hypre_CSRMatrixJ(A_diag); hypre_CSRMatrix *A_offd = hypre_ParCSRMatrixOffd(A); HYPRE_Real *A_offd_data = hypre_CSRMatrixData(A_offd); HYPRE_Int *A_offd_i = hypre_CSRMatrixI(A_offd); HYPRE_Int *A_offd_j = hypre_CSRMatrixJ(A_offd); hypre_CSRMatrix *S_diag = hypre_ParCSRMatrixDiag(S); HYPRE_Int *S_diag_j = hypre_CSRMatrixJ(S_diag); HYPRE_Int *S_diag_i = hypre_CSRMatrixI(S_diag); hypre_CSRMatrix *S_offd = hypre_ParCSRMatrixOffd(S); HYPRE_Int *S_offd_j = hypre_CSRMatrixJ(S_offd); HYPRE_Int *S_offd_i = hypre_CSRMatrixI(S_offd); HYPRE_Int n_fine = hypre_CSRMatrixNumRows(A_diag); HYPRE_BigInt total_global_cpts; hypre_CSRMatrix *As_FF_ext = NULL; HYPRE_Real *As_FF_ext_data = NULL; HYPRE_Int *As_FF_ext_i = NULL; HYPRE_BigInt *As_FF_ext_j = NULL; /* Interpolation matrix P */ hypre_ParCSRMatrix *P; hypre_CSRMatrix *P_diag; hypre_CSRMatrix *P_offd; HYPRE_Real *P_diag_data = NULL; HYPRE_Int *P_diag_i, *P_diag_j = NULL; HYPRE_Real *P_offd_data = NULL; HYPRE_Int *P_offd_i, *P_offd_j = NULL; /* Intermediate matrices */ hypre_ParCSRMatrix *As_FF, *As_FC, *W; HYPRE_Real *D_q, *D_w, *D_theta, *D_q_offd = NULL; hypre_CSRMatrix *As_FF_diag; hypre_CSRMatrix *As_FF_offd; hypre_CSRMatrix *As_FC_diag; hypre_CSRMatrix *As_FC_offd; hypre_CSRMatrix *W_diag; hypre_CSRMatrix *W_offd; HYPRE_Int *As_FF_diag_i; HYPRE_Int *As_FF_diag_j; HYPRE_Int *As_FF_offd_i; HYPRE_Int *As_FF_offd_j = NULL; HYPRE_Int *As_FC_diag_i; HYPRE_Int *As_FC_offd_i; HYPRE_Int *W_diag_i; HYPRE_Int *W_offd_i; HYPRE_Int *W_diag_j; HYPRE_Int *W_offd_j = NULL; HYPRE_Real *As_FF_diag_data; HYPRE_Real *As_FF_offd_data = NULL; HYPRE_Real *As_FC_diag_data; HYPRE_Real *As_FC_offd_data = NULL; HYPRE_Real *W_diag_data; HYPRE_Real *W_offd_data = NULL; HYPRE_Real *buf_data = NULL; HYPRE_Real *tmp_FF_diag_data = NULL; HYPRE_BigInt *col_map_offd_P = NULL; HYPRE_BigInt *new_col_map_offd = NULL; HYPRE_BigInt first_index; HYPRE_Int P_diag_size; HYPRE_Int P_offd_size; HYPRE_Int new_ncols_P_offd; HYPRE_Int num_cols_P_offd; HYPRE_Int *P_marker = NULL; HYPRE_Int *dof_func_offd = NULL; /* Loop variables */ HYPRE_Int index, startc, num_sends; HYPRE_Int i, j, jj, k, kk; HYPRE_Int *cpt_array; HYPRE_Int *start_array; HYPRE_Int *startf_array; HYPRE_Int start, stop, startf, stopf; HYPRE_Int cnt_diag, cnt_offd, row, c_pt; HYPRE_Int num_cols_A_FF_offd; HYPRE_Real value, value1, theta; /* Definitions */ //HYPRE_Real wall_time; HYPRE_Int n_Cpts, n_Fpts; HYPRE_Int num_threads = hypre_NumThreads(); //if (debug_flag==4) wall_time = time_getWallclockSeconds(); /* BEGIN */ hypre_MPI_Comm_size(comm, &num_procs); hypre_MPI_Comm_rank(comm, &my_id); if (my_id == (num_procs - 1)) { total_global_cpts = num_cpts_global[1]; } hypre_MPI_Bcast(&total_global_cpts, 1, HYPRE_MPI_BIG_INT, num_procs - 1, comm); n_Cpts = num_cpts_global[1] - num_cpts_global[0]; hypre_ParCSRMatrixGenerateFFFCHost(A, CF_marker, num_cpts_global, S, &As_FC, &As_FF); if (num_procs > 1) { As_FF_ext = hypre_ParCSRMatrixExtractBExt(As_FF, As_FF, 1); As_FF_ext_i = hypre_CSRMatrixI(As_FF_ext); As_FF_ext_j = hypre_CSRMatrixBigJ(As_FF_ext); As_FF_ext_data = hypre_CSRMatrixData(As_FF_ext); } As_FC_diag = hypre_ParCSRMatrixDiag(As_FC); As_FC_diag_i = hypre_CSRMatrixI(As_FC_diag); As_FC_diag_data = hypre_CSRMatrixData(As_FC_diag); As_FC_offd = hypre_ParCSRMatrixOffd(As_FC); As_FC_offd_i = hypre_CSRMatrixI(As_FC_offd); As_FC_offd_data = hypre_CSRMatrixData(As_FC_offd); As_FF_diag = hypre_ParCSRMatrixDiag(As_FF); As_FF_diag_i = hypre_CSRMatrixI(As_FF_diag); As_FF_diag_j = hypre_CSRMatrixJ(As_FF_diag); As_FF_diag_data = hypre_CSRMatrixData(As_FF_diag); As_FF_offd = hypre_ParCSRMatrixOffd(As_FF); As_FF_offd_i = hypre_CSRMatrixI(As_FF_offd); As_FF_offd_j = hypre_CSRMatrixJ(As_FF_offd); As_FF_offd_data = hypre_CSRMatrixData(As_FF_offd); n_Fpts = hypre_CSRMatrixNumRows(As_FF_diag); num_cols_A_FF_offd = hypre_CSRMatrixNumCols(As_FF_offd); first_index = hypre_ParCSRMatrixRowStarts(As_FF)[0]; tmp_FF_diag_data = hypre_CTAlloc(HYPRE_Real, As_FF_diag_i[n_Fpts], HYPRE_MEMORY_HOST); D_q = hypre_CTAlloc(HYPRE_Real, n_Fpts, HYPRE_MEMORY_HOST); D_theta = hypre_CTAlloc(HYPRE_Real, n_Fpts, HYPRE_MEMORY_HOST); D_w = hypre_CTAlloc(HYPRE_Real, n_Fpts, HYPRE_MEMORY_HOST); cpt_array = hypre_CTAlloc(HYPRE_Int, num_threads, HYPRE_MEMORY_HOST); start_array = hypre_CTAlloc(HYPRE_Int, num_threads + 1, HYPRE_MEMORY_HOST); startf_array = hypre_CTAlloc(HYPRE_Int, num_threads + 1, HYPRE_MEMORY_HOST); #ifdef HYPRE_USING_OPENMP #pragma omp parallel private(i,j,jj,k,kk,start,stop,startf,stopf,row,theta,value,value1) #endif { HYPRE_Int my_thread_num = hypre_GetThreadNum(); start = (n_fine / num_threads) * my_thread_num; if (my_thread_num == num_threads - 1) { stop = n_fine; } else { stop = (n_fine / num_threads) * (my_thread_num + 1); } start_array[my_thread_num + 1] = stop; for (i = start; i < stop; i++) { if (CF_marker[i] > 0) { cpt_array[my_thread_num]++; } } #ifdef HYPRE_USING_OPENMP #pragma omp barrier #endif if (my_thread_num == 0) { for (i = 1; i < num_threads; i++) { cpt_array[i] += cpt_array[i - 1]; } } #ifdef HYPRE_USING_OPENMP #pragma omp barrier #endif if (my_thread_num > 0) { startf = start - cpt_array[my_thread_num - 1]; } else { startf = 0; } if (my_thread_num < num_threads - 1) { stopf = stop - cpt_array[my_thread_num]; } else { stopf = n_Fpts; } startf_array[my_thread_num + 1] = stopf; for (i = startf; i < stopf; i++) { for (j = As_FC_diag_i[i]; j < As_FC_diag_i[i + 1]; j++) { D_q[i] += As_FC_diag_data[j]; } for (j = As_FC_offd_i[i]; j < As_FC_offd_i[i + 1]; j++) { D_q[i] += As_FC_offd_data[j]; } } for (j = As_FF_diag_i[startf]; j < As_FF_diag_i[stopf]; j++) { tmp_FF_diag_data[j] = As_FF_diag_data[j]; } #ifdef HYPRE_USING_OPENMP #pragma omp barrier #endif if (my_thread_num == 0) { if (num_cols_A_FF_offd) { D_q_offd = hypre_CTAlloc(HYPRE_Real, num_cols_A_FF_offd, HYPRE_MEMORY_HOST); } index = 0; comm_pkg = hypre_ParCSRMatrixCommPkg(As_FF); if (!comm_pkg) { hypre_MatvecCommPkgCreate(As_FF); comm_pkg = hypre_ParCSRMatrixCommPkg(As_FF); } num_sends = hypre_ParCSRCommPkgNumSends(comm_pkg); buf_data = hypre_CTAlloc(HYPRE_Real, hypre_ParCSRCommPkgSendMapStart(comm_pkg, num_sends), HYPRE_MEMORY_HOST); for (i = 0; i < num_sends; i++) { startc = hypre_ParCSRCommPkgSendMapStart(comm_pkg, i); for (j = startc; j < hypre_ParCSRCommPkgSendMapStart(comm_pkg, i + 1); j++) { buf_data[index++] = D_q[hypre_ParCSRCommPkgSendMapElmt(comm_pkg, j)]; } } comm_handle = hypre_ParCSRCommHandleCreate( 1, comm_pkg, buf_data, D_q_offd); hypre_ParCSRCommHandleDestroy(comm_handle); if (num_functions > 1) { HYPRE_Int *int_buf_data = NULL; HYPRE_Int num_sends, startc; HYPRE_Int num_cols_A_offd = hypre_CSRMatrixNumCols(A_offd); dof_func_offd = hypre_CTAlloc(HYPRE_Int, num_cols_A_offd, HYPRE_MEMORY_HOST); index = 0; num_sends = hypre_ParCSRCommPkgNumSends(comm_pkg); int_buf_data = hypre_CTAlloc(HYPRE_Int, hypre_ParCSRCommPkgSendMapStart(comm_pkg, num_sends), HYPRE_MEMORY_HOST); for (i = 0; i < num_sends; i++) { startc = hypre_ParCSRCommPkgSendMapStart(comm_pkg, i); for (j = startc; j < hypre_ParCSRCommPkgSendMapStart(comm_pkg, i + 1); j++) { int_buf_data[index++] = dof_func[hypre_ParCSRCommPkgSendMapElmt(comm_pkg, j)]; } } comm_handle = hypre_ParCSRCommHandleCreate( 11, comm_pkg, int_buf_data, dof_func_offd); hypre_ParCSRCommHandleDestroy(comm_handle); hypre_TFree(int_buf_data, HYPRE_MEMORY_HOST); } } #ifdef HYPRE_USING_OPENMP #pragma omp barrier #endif row = startf; for (i = start; i < stop; i++) { HYPRE_Int jA, jC, jS; if (CF_marker[i] < 0) { if (num_functions > 1) { jC = A_diag_i[i]; for (j = S_diag_i[i]; j < S_diag_i[i + 1]; j++) { jS = S_diag_j[j]; jA = A_diag_j[jC]; while (jA != jS) { if (dof_func[i] == dof_func[jA]) { D_w[row] += A_diag_data[jC++]; } else { jC++; } jA = A_diag_j[jC]; } jC++; } for (j = jC; j < A_diag_i[i + 1]; j++) { if (dof_func[i] == dof_func[A_diag_j[j]]) { D_w[row] += A_diag_data[j]; } } jC = A_offd_i[i]; for (j = S_offd_i[i]; j < S_offd_i[i + 1]; j++) { jS = S_offd_j[j]; jA = A_offd_j[jC]; while (jA != jS) { if (dof_func[i] == dof_func_offd[jA]) { D_w[row] += A_offd_data[jC++]; } else { jC++; } jA = A_offd_j[jC]; } jC++; } for (j = jC; j < A_offd_i[i + 1]; j++) { if (dof_func[i] == dof_func_offd[A_offd_j[j]]) { D_w[row] += A_offd_data[j]; } } row++; } else { for (j = A_diag_i[i]; j < A_diag_i[i + 1]; j++) { D_w[row] += A_diag_data[j]; } for (j = A_offd_i[i]; j < A_offd_i[i + 1]; j++) { D_w[row] += A_offd_data[j]; } for (j = As_FF_diag_i[row] + 1; j < As_FF_diag_i[row + 1]; j++) { D_w[row] -= As_FF_diag_data[j]; } for (j = As_FF_offd_i[row]; j < As_FF_offd_i[row + 1]; j++) { D_w[row] -= As_FF_offd_data[j]; } D_w[row] -= D_q[row]; row++; } } } for (i = startf; i < stopf; i++) { for (j = As_FF_diag_i[i] + 1; j < As_FF_diag_i[i + 1]; j++) { jj = As_FF_diag_j[j]; value = D_q[jj]; for (k = As_FF_diag_i[jj] + 1; k < As_FF_diag_i[jj + 1]; k++) { kk = As_FF_diag_j[k]; if (kk == i) { value1 = tmp_FF_diag_data[k]; value += value1; D_theta[i] += As_FF_diag_data[j] * value1 / value; break; } } As_FF_diag_data[j] /= value; } for (j = As_FF_offd_i[i]; j < As_FF_offd_i[i + 1]; j++) { jj = As_FF_offd_j[j]; value = D_q_offd[jj]; for (k = As_FF_ext_i[jj]; k < As_FF_ext_i[jj + 1]; k++) { kk = (HYPRE_Int)(As_FF_ext_j[k] - first_index); if (kk == i) { value1 = As_FF_ext_data[k]; value += value1; D_theta[i] += As_FF_offd_data[j] * value1 / value; break; } } As_FF_offd_data[j] /= value; } As_FF_diag_data[As_FF_diag_i[i]] = 1.0; } #ifdef HYPRE_USING_OPENMP #pragma omp barrier #endif for (i = startf; i < stopf; i++) { theta = (D_theta[i] + D_w[i]); if (theta) { theta = -1.0 / theta; for (j = As_FF_diag_i[i]; j < As_FF_diag_i[i + 1]; j++) { As_FF_diag_data[j] *= theta; } for (j = As_FF_offd_i[i]; j < As_FF_offd_i[i + 1]; j++) { As_FF_offd_data[j] *= theta; } } } } /* end parallel region */ W = hypre_ParMatmul(As_FF, As_FC); W_diag = hypre_ParCSRMatrixDiag(W); W_offd = hypre_ParCSRMatrixOffd(W); W_diag_i = hypre_CSRMatrixI(W_diag); W_diag_j = hypre_CSRMatrixJ(W_diag); W_diag_data = hypre_CSRMatrixData(W_diag); W_offd_i = hypre_CSRMatrixI(W_offd); W_offd_j = hypre_CSRMatrixJ(W_offd); W_offd_data = hypre_CSRMatrixData(W_offd); num_cols_P_offd = hypre_CSRMatrixNumCols(W_offd); /*----------------------------------------------------------------------- * Intialize data for P *-----------------------------------------------------------------------*/ P_diag_i = hypre_CTAlloc(HYPRE_Int, n_fine + 1, memory_location_P); P_offd_i = hypre_CTAlloc(HYPRE_Int, n_fine + 1, memory_location_P); P_diag_size = n_Cpts + hypre_CSRMatrixI(W_diag)[n_Fpts]; P_offd_size = hypre_CSRMatrixI(W_offd)[n_Fpts]; if (P_diag_size) { P_diag_j = hypre_CTAlloc(HYPRE_Int, P_diag_size, memory_location_P); P_diag_data = hypre_CTAlloc(HYPRE_Real, P_diag_size, memory_location_P); } if (P_offd_size) { P_offd_j = hypre_CTAlloc(HYPRE_Int, P_offd_size, memory_location_P); P_offd_data = hypre_CTAlloc(HYPRE_Real, P_offd_size, memory_location_P); } #ifdef HYPRE_USING_OPENMP #pragma omp parallel private(i,j,start,stop,startf,stopf,c_pt,row,cnt_diag,cnt_offd) #endif { HYPRE_Int my_thread_num = hypre_GetThreadNum(); startf = startf_array[my_thread_num]; stopf = startf_array[my_thread_num + 1]; start = start_array[my_thread_num]; stop = start_array[my_thread_num + 1]; if (my_thread_num > 0) { c_pt = cpt_array[my_thread_num - 1]; } else { c_pt = 0; } cnt_diag = W_diag_i[startf] + c_pt; cnt_offd = W_offd_i[startf]; row = startf; for (i = start; i < stop; i++) { if (CF_marker[i] > 0) { P_diag_j[cnt_diag] = c_pt++; P_diag_data[cnt_diag++] = 1.0; } else { for (j = W_diag_i[row]; j < W_diag_i[row + 1]; j++) { P_diag_j[cnt_diag] = W_diag_j[j]; P_diag_data[cnt_diag++] = W_diag_data[j]; } for (j = W_offd_i[row]; j < W_offd_i[row + 1]; j++) { P_offd_j[cnt_offd] = W_offd_j[j]; P_offd_data[cnt_offd++] = W_offd_data[j]; } row++; } P_diag_i[i + 1] = cnt_diag; P_offd_i[i + 1] = cnt_offd; } } /* end parallel region */ /*----------------------------------------------------------------------- * Create matrix *-----------------------------------------------------------------------*/ P = hypre_ParCSRMatrixCreate(comm, hypre_ParCSRMatrixGlobalNumRows(A), total_global_cpts, hypre_ParCSRMatrixColStarts(A), num_cpts_global, num_cols_P_offd, P_diag_i[n_fine], P_offd_i[n_fine]); P_diag = hypre_ParCSRMatrixDiag(P); hypre_CSRMatrixData(P_diag) = P_diag_data; hypre_CSRMatrixI(P_diag) = P_diag_i; hypre_CSRMatrixJ(P_diag) = P_diag_j; P_offd = hypre_ParCSRMatrixOffd(P); hypre_CSRMatrixData(P_offd) = P_offd_data; hypre_CSRMatrixI(P_offd) = P_offd_i; hypre_CSRMatrixJ(P_offd) = P_offd_j; hypre_ParCSRMatrixColMapOffd(P) = hypre_ParCSRMatrixColMapOffd(W); hypre_ParCSRMatrixColMapOffd(W) = NULL; hypre_CSRMatrixMemoryLocation(P_diag) = memory_location_P; hypre_CSRMatrixMemoryLocation(P_offd) = memory_location_P; /* Compress P, removing coefficients smaller than trunc_factor * Max */ if (trunc_factor != 0.0 || max_elmts > 0) { HYPRE_Int *map; hypre_BoomerAMGInterpTruncation(P, trunc_factor, max_elmts); P_diag_data = hypre_CSRMatrixData(P_diag); P_diag_i = hypre_CSRMatrixI(P_diag); P_diag_j = hypre_CSRMatrixJ(P_diag); P_offd_data = hypre_CSRMatrixData(P_offd); P_offd_i = hypre_CSRMatrixI(P_offd); P_offd_j = hypre_CSRMatrixJ(P_offd); P_diag_size = P_diag_i[n_fine]; P_offd_size = P_offd_i[n_fine]; col_map_offd_P = hypre_ParCSRMatrixColMapOffd(P); if (num_cols_P_offd) { P_marker = hypre_CTAlloc(HYPRE_Int, num_cols_P_offd, HYPRE_MEMORY_HOST); for (i = 0; i < P_offd_size; i++) { P_marker[P_offd_j[i]] = 1; } new_ncols_P_offd = 0; for (i = 0; i < num_cols_P_offd; i++) if (P_marker[i]) { new_ncols_P_offd++; } new_col_map_offd = hypre_CTAlloc(HYPRE_BigInt, new_ncols_P_offd, HYPRE_MEMORY_HOST); map = hypre_CTAlloc(HYPRE_Int, new_ncols_P_offd, HYPRE_MEMORY_HOST); index = 0; for (i = 0; i < num_cols_P_offd; i++) if (P_marker[i]) { new_col_map_offd[index] = col_map_offd_P[i]; map[index++] = i; } hypre_TFree(P_marker, HYPRE_MEMORY_HOST); #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i) HYPRE_SMP_SCHEDULE #endif for (i = 0; i < P_offd_size; i++) { P_offd_j[i] = hypre_BinarySearch(map, P_offd_j[i], new_ncols_P_offd); } hypre_TFree(col_map_offd_P, HYPRE_MEMORY_HOST); hypre_ParCSRMatrixColMapOffd(P) = new_col_map_offd; hypre_CSRMatrixNumCols(P_offd) = new_ncols_P_offd; hypre_TFree(map, HYPRE_MEMORY_HOST); } } hypre_MatvecCommPkgCreate(P); *P_ptr = P; /* Deallocate memory */ hypre_TFree(D_q, HYPRE_MEMORY_HOST); hypre_TFree(D_q_offd, HYPRE_MEMORY_HOST); hypre_TFree(D_w, HYPRE_MEMORY_HOST); hypre_TFree(D_theta, HYPRE_MEMORY_HOST); hypre_TFree(dof_func_offd, HYPRE_MEMORY_HOST); hypre_TFree(cpt_array, HYPRE_MEMORY_HOST); hypre_TFree(start_array, HYPRE_MEMORY_HOST); hypre_TFree(startf_array, HYPRE_MEMORY_HOST); hypre_TFree(buf_data, HYPRE_MEMORY_HOST); hypre_TFree(tmp_FF_diag_data, HYPRE_MEMORY_HOST); hypre_ParCSRMatrixDestroy(As_FF); hypre_ParCSRMatrixDestroy(As_FC); hypre_ParCSRMatrixDestroy(W); hypre_CSRMatrixDestroy(As_FF_ext); return hypre_error_flag; } /*-----------------------------------------------------------------------* * Modularized Extended+i Interpolation *-----------------------------------------------------------------------*/ HYPRE_Int hypre_BoomerAMGBuildModExtPIInterp(hypre_ParCSRMatrix *A, HYPRE_Int *CF_marker, hypre_ParCSRMatrix *S, HYPRE_BigInt *num_cpts_global, HYPRE_Int num_functions, HYPRE_Int *dof_func, HYPRE_Int debug_flag, HYPRE_Real trunc_factor, HYPRE_Int max_elmts, hypre_ParCSRMatrix **P_ptr) { hypre_GpuProfilingPushRange("ModExtPIInterp"); HYPRE_Int ierr = 0; #if defined(HYPRE_USING_GPU) HYPRE_ExecutionPolicy exec = hypre_GetExecPolicy1( hypre_ParCSRMatrixMemoryLocation(A) ); if (exec == HYPRE_EXEC_DEVICE) { ierr = hypre_BoomerAMGBuildExtPIInterpDevice(A, CF_marker, S, num_cpts_global, 1, NULL, debug_flag, trunc_factor, max_elmts, P_ptr); } else #endif { ierr = hypre_BoomerAMGBuildModExtPIInterpHost(A, CF_marker, S, num_cpts_global, debug_flag, num_functions, dof_func, trunc_factor, max_elmts, P_ptr); } hypre_GpuProfilingPopRange(); return ierr; } /*--------------------------------------------------------------------------- * hypre_BoomerAMGBuildModExtPEInterp * Comment: *--------------------------------------------------------------------------*/ HYPRE_Int hypre_BoomerAMGBuildModExtPEInterpHost(hypre_ParCSRMatrix *A, HYPRE_Int *CF_marker, hypre_ParCSRMatrix *S, HYPRE_BigInt *num_cpts_global, HYPRE_Int num_functions, HYPRE_Int *dof_func, HYPRE_Int debug_flag, HYPRE_Real trunc_factor, HYPRE_Int max_elmts, hypre_ParCSRMatrix **P_ptr) { HYPRE_UNUSED_VAR(debug_flag); /* Communication Variables */ MPI_Comm comm = hypre_ParCSRMatrixComm(A); HYPRE_MemoryLocation memory_location_P = hypre_ParCSRMatrixMemoryLocation(A); hypre_ParCSRCommPkg *comm_pkg = hypre_ParCSRMatrixCommPkg(A); hypre_ParCSRCommHandle *comm_handle = NULL; HYPRE_Int my_id, num_procs; /* Variables to store input variables */ hypre_CSRMatrix *A_diag = hypre_ParCSRMatrixDiag(A); HYPRE_Real *A_diag_data = hypre_CSRMatrixData(A_diag); HYPRE_Int *A_diag_i = hypre_CSRMatrixI(A_diag); HYPRE_Int *A_diag_j = hypre_CSRMatrixJ(A_diag); hypre_CSRMatrix *A_offd = hypre_ParCSRMatrixOffd(A); HYPRE_Real *A_offd_data = hypre_CSRMatrixData(A_offd); HYPRE_Int *A_offd_i = hypre_CSRMatrixI(A_offd); HYPRE_Int *A_offd_j = hypre_CSRMatrixJ(A_offd); hypre_CSRMatrix *S_diag = hypre_ParCSRMatrixDiag(S); HYPRE_Int *S_diag_j = hypre_CSRMatrixJ(S_diag); HYPRE_Int *S_diag_i = hypre_CSRMatrixI(S_diag); hypre_CSRMatrix *S_offd = hypre_ParCSRMatrixOffd(S); HYPRE_Int *S_offd_j = hypre_CSRMatrixJ(S_offd); HYPRE_Int *S_offd_i = hypre_CSRMatrixI(S_offd); HYPRE_Int n_fine = hypre_CSRMatrixNumRows(A_diag); HYPRE_BigInt total_global_cpts; /* Interpolation matrix P */ hypre_ParCSRMatrix *P; hypre_CSRMatrix *P_diag; hypre_CSRMatrix *P_offd; HYPRE_Real *P_diag_data = NULL; HYPRE_Int *P_diag_i, *P_diag_j = NULL; HYPRE_Real *P_offd_data = NULL; HYPRE_Int *P_offd_i, *P_offd_j = NULL; /* Intermediate matrices */ hypre_ParCSRMatrix *As_FF, *As_FC, *W; HYPRE_Real *D_beta, *D_w, *D_lambda, *D_tmp, *D_tau, *D_tmp_offd = NULL; hypre_CSRMatrix *As_FF_diag; hypre_CSRMatrix *As_FF_offd; hypre_CSRMatrix *As_FC_diag; hypre_CSRMatrix *As_FC_offd; hypre_CSRMatrix *W_diag; hypre_CSRMatrix *W_offd; HYPRE_Int *As_FF_diag_i; HYPRE_Int *As_FF_diag_j; HYPRE_Int *As_FF_offd_i; HYPRE_Int *As_FF_offd_j; HYPRE_Int *As_FC_diag_i; HYPRE_Int *As_FC_offd_i; HYPRE_Int *W_diag_i; HYPRE_Int *W_offd_i; HYPRE_Int *W_diag_j; HYPRE_Int *W_offd_j = NULL; HYPRE_Real *As_FF_diag_data; HYPRE_Real *As_FF_offd_data = NULL; HYPRE_Real *As_FC_diag_data; HYPRE_Real *As_FC_offd_data = NULL; HYPRE_Real *W_diag_data; HYPRE_Real *W_offd_data = NULL; HYPRE_Real *buf_data = NULL; HYPRE_BigInt *col_map_offd_P = NULL; HYPRE_BigInt *new_col_map_offd = NULL; HYPRE_Int P_diag_size; HYPRE_Int P_offd_size; HYPRE_Int new_ncols_P_offd; HYPRE_Int num_cols_P_offd; HYPRE_Int *P_marker = NULL; HYPRE_Int *dof_func_offd = NULL; /* Loop variables */ HYPRE_Int index, startc, num_sends; HYPRE_Int i, j; HYPRE_Int *cpt_array; HYPRE_Int *start_array; HYPRE_Int *startf_array; HYPRE_Int start, stop, startf, stopf; HYPRE_Int cnt_diag, cnt_offd, row, c_pt; HYPRE_Int num_cols_A_FF_offd; HYPRE_Real value, theta; /* Definitions */ //HYPRE_Real wall_time; HYPRE_Int n_Cpts, n_Fpts; HYPRE_Int num_threads = hypre_NumThreads(); //if (debug_flag==4) wall_time = time_getWallclockSeconds(); /* BEGIN */ hypre_MPI_Comm_size(comm, &num_procs); hypre_MPI_Comm_rank(comm, &my_id); if (my_id == (num_procs - 1)) { total_global_cpts = num_cpts_global[1]; } hypre_MPI_Bcast(&total_global_cpts, 1, HYPRE_MPI_BIG_INT, num_procs - 1, comm); n_Cpts = num_cpts_global[1] - num_cpts_global[0]; hypre_ParCSRMatrixGenerateFFFCHost(A, CF_marker, num_cpts_global, S, &As_FC, &As_FF); As_FC_diag = hypre_ParCSRMatrixDiag(As_FC); As_FC_diag_i = hypre_CSRMatrixI(As_FC_diag); As_FC_diag_data = hypre_CSRMatrixData(As_FC_diag); As_FC_offd = hypre_ParCSRMatrixOffd(As_FC); As_FC_offd_i = hypre_CSRMatrixI(As_FC_offd); As_FC_offd_data = hypre_CSRMatrixData(As_FC_offd); As_FF_diag = hypre_ParCSRMatrixDiag(As_FF); As_FF_diag_i = hypre_CSRMatrixI(As_FF_diag); As_FF_diag_j = hypre_CSRMatrixJ(As_FF_diag); As_FF_diag_data = hypre_CSRMatrixData(As_FF_diag); As_FF_offd = hypre_ParCSRMatrixOffd(As_FF); As_FF_offd_i = hypre_CSRMatrixI(As_FF_offd); As_FF_offd_j = hypre_CSRMatrixJ(As_FF_offd); As_FF_offd_data = hypre_CSRMatrixData(As_FF_offd); n_Fpts = hypre_CSRMatrixNumRows(As_FF_diag); num_cols_A_FF_offd = hypre_CSRMatrixNumCols(As_FF_offd); D_beta = hypre_CTAlloc(HYPRE_Real, n_Fpts, HYPRE_MEMORY_HOST); D_lambda = hypre_CTAlloc(HYPRE_Real, n_Fpts, HYPRE_MEMORY_HOST); D_tmp = hypre_CTAlloc(HYPRE_Real, n_Fpts, HYPRE_MEMORY_HOST); D_tau = hypre_CTAlloc(HYPRE_Real, n_Fpts, HYPRE_MEMORY_HOST); D_w = hypre_CTAlloc(HYPRE_Real, n_Fpts, HYPRE_MEMORY_HOST); cpt_array = hypre_CTAlloc(HYPRE_Int, num_threads, HYPRE_MEMORY_HOST); start_array = hypre_CTAlloc(HYPRE_Int, num_threads + 1, HYPRE_MEMORY_HOST); startf_array = hypre_CTAlloc(HYPRE_Int, num_threads + 1, HYPRE_MEMORY_HOST); #ifdef HYPRE_USING_OPENMP #pragma omp parallel private(i,j,start,stop,startf,stopf,row,theta,value) #endif { HYPRE_Int my_thread_num = hypre_GetThreadNum(); start = (n_fine / num_threads) * my_thread_num; if (my_thread_num == num_threads - 1) { stop = n_fine; } else { stop = (n_fine / num_threads) * (my_thread_num + 1); } start_array[my_thread_num + 1] = stop; for (i = start; i < stop; i++) { if (CF_marker[i] > 0) { cpt_array[my_thread_num]++; } } #ifdef HYPRE_USING_OPENMP #pragma omp barrier #endif if (my_thread_num == 0) { for (i = 1; i < num_threads; i++) { cpt_array[i] += cpt_array[i - 1]; } if (num_functions > 1) { HYPRE_Int *int_buf_data = NULL; HYPRE_Int num_sends, startc; HYPRE_Int num_cols_A_offd = hypre_CSRMatrixNumCols(A_offd); dof_func_offd = hypre_CTAlloc(HYPRE_Int, num_cols_A_offd, HYPRE_MEMORY_HOST); index = 0; num_sends = hypre_ParCSRCommPkgNumSends(comm_pkg); int_buf_data = hypre_CTAlloc(HYPRE_Int, hypre_ParCSRCommPkgSendMapStart(comm_pkg, num_sends), HYPRE_MEMORY_HOST); for (i = 0; i < num_sends; i++) { startc = hypre_ParCSRCommPkgSendMapStart(comm_pkg, i); for (j = startc; j < hypre_ParCSRCommPkgSendMapStart(comm_pkg, i + 1); j++) { int_buf_data[index++] = dof_func[hypre_ParCSRCommPkgSendMapElmt(comm_pkg, j)]; } } comm_handle = hypre_ParCSRCommHandleCreate( 11, comm_pkg, int_buf_data, dof_func_offd); hypre_ParCSRCommHandleDestroy(comm_handle); hypre_TFree(int_buf_data, HYPRE_MEMORY_HOST); } } #ifdef HYPRE_USING_OPENMP #pragma omp barrier #endif if (my_thread_num > 0) { startf = start - cpt_array[my_thread_num - 1]; } else { startf = 0; } if (my_thread_num < num_threads - 1) { stopf = stop - cpt_array[my_thread_num]; } else { stopf = n_Fpts; } startf_array[my_thread_num + 1] = stopf; for (i = startf; i < stopf; i++) { HYPRE_Real number; for (j = As_FF_diag_i[i] + 1; j < As_FF_diag_i[i + 1]; j++) { D_lambda[i] += As_FF_diag_data[j]; } for (j = As_FF_offd_i[i]; j < As_FF_offd_i[i + 1]; j++) { D_lambda[i] += As_FF_offd_data[j]; } number = (HYPRE_Real)(As_FF_diag_i[i + 1] - As_FF_diag_i[i] - 1 + As_FF_offd_i[i + 1] - As_FF_offd_i[i]); if (number) { D_lambda[i] /= number; } for (j = As_FC_diag_i[i]; j < As_FC_diag_i[i + 1]; j++) { D_beta[i] += As_FC_diag_data[j]; } for (j = As_FC_offd_i[i]; j < As_FC_offd_i[i + 1]; j++) { D_beta[i] += As_FC_offd_data[j]; } if (D_lambda[i] + D_beta[i]) { D_tmp[i] = D_lambda[i] / (D_beta[i] + D_lambda[i]); } } #ifdef HYPRE_USING_OPENMP #pragma omp barrier #endif if (my_thread_num == 0) { if (num_cols_A_FF_offd) { D_tmp_offd = hypre_CTAlloc(HYPRE_Real, num_cols_A_FF_offd, HYPRE_MEMORY_HOST); } index = 0; comm_pkg = hypre_ParCSRMatrixCommPkg(As_FF); if (!comm_pkg) { hypre_MatvecCommPkgCreate(As_FF); comm_pkg = hypre_ParCSRMatrixCommPkg(As_FF); } num_sends = hypre_ParCSRCommPkgNumSends(comm_pkg); buf_data = hypre_CTAlloc(HYPRE_Real, hypre_ParCSRCommPkgSendMapStart(comm_pkg, num_sends), HYPRE_MEMORY_HOST); for (i = 0; i < num_sends; i++) { startc = hypre_ParCSRCommPkgSendMapStart(comm_pkg, i); for (j = startc; j < hypre_ParCSRCommPkgSendMapStart(comm_pkg, i + 1); j++) { buf_data[index++] = D_tmp[hypre_ParCSRCommPkgSendMapElmt(comm_pkg, j)]; } } comm_handle = hypre_ParCSRCommHandleCreate( 1, comm_pkg, buf_data, D_tmp_offd); hypre_ParCSRCommHandleDestroy(comm_handle); } #ifdef HYPRE_USING_OPENMP #pragma omp barrier #endif row = startf; for (i = start; i < stop; i++) { if (CF_marker[i] < 0) { if (num_functions > 1) { HYPRE_Int jA, jC, jS; jC = A_diag_i[i]; for (j = S_diag_i[i]; j < S_diag_i[i + 1]; j++) { jS = S_diag_j[j]; jA = A_diag_j[jC]; while (jA != jS) { if (dof_func[i] == dof_func[jA]) { D_w[row] += A_diag_data[jC++]; } else { jC++; } jA = A_diag_j[jC]; } jC++; } for (j = jC; j < A_diag_i[i + 1]; j++) { if (dof_func[i] == dof_func[A_diag_j[j]]) { D_w[row] += A_diag_data[j]; } } jC = A_offd_i[i]; for (j = S_offd_i[i]; j < S_offd_i[i + 1]; j++) { jS = S_offd_j[j]; jA = A_offd_j[jC]; while (jA != jS) { if (dof_func[i] == dof_func_offd[jA]) { D_w[row] += A_offd_data[jC++]; } else { jC++; } jA = A_offd_j[jC]; } jC++; } for (j = jC; j < A_offd_i[i + 1]; j++) { if (dof_func[i] == dof_func_offd[A_offd_j[j]]) { D_w[row] += A_offd_data[j]; } } row++; } else { for (j = A_diag_i[i]; j < A_diag_i[i + 1]; j++) { D_w[row] += A_diag_data[j]; } for (j = A_offd_i[i]; j < A_offd_i[i + 1]; j++) { D_w[row] += A_offd_data[j]; } for (j = As_FF_diag_i[row] + 1; j < As_FF_diag_i[row + 1]; j++) { D_w[row] -= As_FF_diag_data[j]; } for (j = As_FF_offd_i[row]; j < As_FF_offd_i[row + 1]; j++) { D_w[row] -= As_FF_offd_data[j]; } D_w[row] -= D_beta[row]; row++; } } } for (i = startf; i < stopf; i++) { for (j = As_FF_diag_i[i] + 1; j < As_FF_diag_i[i + 1]; j++) { index = As_FF_diag_j[j]; D_tau[i] += As_FF_diag_data[j] * D_tmp[index]; } for (j = As_FF_offd_i[i]; j < As_FF_offd_i[i + 1]; j++) { index = As_FF_offd_j[j]; D_tau[i] += As_FF_offd_data[j] * D_tmp_offd[index]; } } for (i = startf; i < stopf; i++) { value = D_w[i] + D_tau[i]; if (value) { value = -1.0 / value; } theta = D_beta[i] + D_lambda[i]; As_FF_diag_data[As_FF_diag_i[i]] = value * theta; if (theta) { theta = 1.0 / theta; } for (j = As_FF_diag_i[i] + 1; j < As_FF_diag_i[i + 1]; j++) { As_FF_diag_data[j] *= value; } for (j = As_FF_offd_i[i]; j < As_FF_offd_i[i + 1]; j++) { As_FF_offd_data[j] *= value; } for (j = As_FC_diag_i[i]; j < As_FC_diag_i[i + 1]; j++) { As_FC_diag_data[j] *= theta; } for (j = As_FC_offd_i[i]; j < As_FC_offd_i[i + 1]; j++) { As_FC_offd_data[j] *= theta; } } } /* end parallel region */ W = hypre_ParMatmul(As_FF, As_FC); W_diag = hypre_ParCSRMatrixDiag(W); W_offd = hypre_ParCSRMatrixOffd(W); W_diag_i = hypre_CSRMatrixI(W_diag); W_diag_j = hypre_CSRMatrixJ(W_diag); W_diag_data = hypre_CSRMatrixData(W_diag); W_offd_i = hypre_CSRMatrixI(W_offd); W_offd_j = hypre_CSRMatrixJ(W_offd); W_offd_data = hypre_CSRMatrixData(W_offd); num_cols_P_offd = hypre_CSRMatrixNumCols(W_offd); /*----------------------------------------------------------------------- * Intialize data for P *-----------------------------------------------------------------------*/ P_diag_i = hypre_CTAlloc(HYPRE_Int, n_fine + 1, memory_location_P); P_offd_i = hypre_CTAlloc(HYPRE_Int, n_fine + 1, memory_location_P); P_diag_size = n_Cpts + hypre_CSRMatrixI(W_diag)[n_Fpts]; P_offd_size = hypre_CSRMatrixI(W_offd)[n_Fpts]; if (P_diag_size) { P_diag_j = hypre_CTAlloc(HYPRE_Int, P_diag_size, memory_location_P); P_diag_data = hypre_CTAlloc(HYPRE_Real, P_diag_size, memory_location_P); } if (P_offd_size) { P_offd_j = hypre_CTAlloc(HYPRE_Int, P_offd_size, memory_location_P); P_offd_data = hypre_CTAlloc(HYPRE_Real, P_offd_size, memory_location_P); } #ifdef HYPRE_USING_OPENMP #pragma omp parallel private(i,j,start,stop,startf,stopf,c_pt,row,cnt_diag,cnt_offd) #endif { HYPRE_Int my_thread_num = hypre_GetThreadNum(); startf = startf_array[my_thread_num]; stopf = startf_array[my_thread_num + 1]; start = start_array[my_thread_num]; stop = start_array[my_thread_num + 1]; if (my_thread_num > 0) { c_pt = cpt_array[my_thread_num - 1]; } else { c_pt = 0; } cnt_diag = W_diag_i[startf] + c_pt; cnt_offd = W_offd_i[startf]; row = startf; for (i = start; i < stop; i++) { if (CF_marker[i] > 0) { P_diag_j[cnt_diag] = c_pt++; P_diag_data[cnt_diag++] = 1.0; } else { for (j = W_diag_i[row]; j < W_diag_i[row + 1]; j++) { P_diag_j[cnt_diag] = W_diag_j[j]; P_diag_data[cnt_diag++] = W_diag_data[j]; } for (j = W_offd_i[row]; j < W_offd_i[row + 1]; j++) { P_offd_j[cnt_offd] = W_offd_j[j]; P_offd_data[cnt_offd++] = W_offd_data[j]; } row++; } P_diag_i[i + 1] = cnt_diag; P_offd_i[i + 1] = cnt_offd; } } /* end parallel region */ /*----------------------------------------------------------------------- * Create matrix *-----------------------------------------------------------------------*/ P = hypre_ParCSRMatrixCreate(comm, hypre_ParCSRMatrixGlobalNumRows(A), total_global_cpts, hypre_ParCSRMatrixColStarts(A), num_cpts_global, num_cols_P_offd, P_diag_i[n_fine], P_offd_i[n_fine]); P_diag = hypre_ParCSRMatrixDiag(P); hypre_CSRMatrixData(P_diag) = P_diag_data; hypre_CSRMatrixI(P_diag) = P_diag_i; hypre_CSRMatrixJ(P_diag) = P_diag_j; P_offd = hypre_ParCSRMatrixOffd(P); hypre_CSRMatrixData(P_offd) = P_offd_data; hypre_CSRMatrixI(P_offd) = P_offd_i; hypre_CSRMatrixJ(P_offd) = P_offd_j; hypre_ParCSRMatrixColMapOffd(P) = hypre_ParCSRMatrixColMapOffd(W); hypre_ParCSRMatrixColMapOffd(W) = NULL; hypre_CSRMatrixMemoryLocation(P_diag) = memory_location_P; hypre_CSRMatrixMemoryLocation(P_offd) = memory_location_P; /* Compress P, removing coefficients smaller than trunc_factor * Max */ if (trunc_factor != 0.0 || max_elmts > 0) { HYPRE_Int *map; hypre_BoomerAMGInterpTruncation(P, trunc_factor, max_elmts); P_diag_data = hypre_CSRMatrixData(P_diag); P_diag_i = hypre_CSRMatrixI(P_diag); P_diag_j = hypre_CSRMatrixJ(P_diag); P_offd_data = hypre_CSRMatrixData(P_offd); P_offd_i = hypre_CSRMatrixI(P_offd); P_offd_j = hypre_CSRMatrixJ(P_offd); P_diag_size = P_diag_i[n_fine]; P_offd_size = P_offd_i[n_fine]; col_map_offd_P = hypre_ParCSRMatrixColMapOffd(P); if (num_cols_P_offd) { P_marker = hypre_CTAlloc(HYPRE_Int, num_cols_P_offd, HYPRE_MEMORY_HOST); for (i = 0; i < P_offd_size; i++) { P_marker[P_offd_j[i]] = 1; } new_ncols_P_offd = 0; for (i = 0; i < num_cols_P_offd; i++) if (P_marker[i]) { new_ncols_P_offd++; } new_col_map_offd = hypre_CTAlloc(HYPRE_BigInt, new_ncols_P_offd, HYPRE_MEMORY_HOST); map = hypre_CTAlloc(HYPRE_Int, new_ncols_P_offd, HYPRE_MEMORY_HOST); index = 0; for (i = 0; i < num_cols_P_offd; i++) if (P_marker[i]) { new_col_map_offd[index] = col_map_offd_P[i]; map[index++] = i; } hypre_TFree(P_marker, HYPRE_MEMORY_HOST); #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i) HYPRE_SMP_SCHEDULE #endif for (i = 0; i < P_offd_size; i++) { P_offd_j[i] = hypre_BinarySearch(map, P_offd_j[i], new_ncols_P_offd); } hypre_TFree(col_map_offd_P, HYPRE_MEMORY_HOST); hypre_ParCSRMatrixColMapOffd(P) = new_col_map_offd; hypre_CSRMatrixNumCols(P_offd) = new_ncols_P_offd; hypre_TFree(map, HYPRE_MEMORY_HOST); } } hypre_MatvecCommPkgCreate(P); *P_ptr = P; /* Deallocate memory */ hypre_TFree(D_tmp, HYPRE_MEMORY_HOST); hypre_TFree(D_tmp_offd, HYPRE_MEMORY_HOST); hypre_TFree(D_w, HYPRE_MEMORY_HOST); hypre_TFree(D_tau, HYPRE_MEMORY_HOST); hypre_TFree(D_beta, HYPRE_MEMORY_HOST); hypre_TFree(D_lambda, HYPRE_MEMORY_HOST); hypre_TFree(cpt_array, HYPRE_MEMORY_HOST); hypre_TFree(start_array, HYPRE_MEMORY_HOST); hypre_TFree(startf_array, HYPRE_MEMORY_HOST); hypre_TFree(buf_data, HYPRE_MEMORY_HOST); hypre_TFree(dof_func_offd, HYPRE_MEMORY_HOST); hypre_ParCSRMatrixDestroy(As_FF); hypre_ParCSRMatrixDestroy(As_FC); hypre_ParCSRMatrixDestroy(W); return hypre_error_flag; } /*-----------------------------------------------------------------------* * Modularized Extended+e Interpolation *-----------------------------------------------------------------------*/ HYPRE_Int hypre_BoomerAMGBuildModExtPEInterp(hypre_ParCSRMatrix *A, HYPRE_Int *CF_marker, hypre_ParCSRMatrix *S, HYPRE_BigInt *num_cpts_global, HYPRE_Int num_functions, HYPRE_Int *dof_func, HYPRE_Int debug_flag, HYPRE_Real trunc_factor, HYPRE_Int max_elmts, hypre_ParCSRMatrix **P_ptr) { hypre_GpuProfilingPushRange("ModExtPEInterp"); HYPRE_Int ierr = 0; #if defined(HYPRE_USING_GPU) HYPRE_ExecutionPolicy exec = hypre_GetExecPolicy1( hypre_ParCSRMatrixMemoryLocation(A) ); if (exec == HYPRE_EXEC_DEVICE) { ierr = hypre_BoomerAMGBuildExtPEInterpDevice(A, CF_marker, S, num_cpts_global, 1, NULL, debug_flag, trunc_factor, max_elmts, P_ptr); } else #endif { ierr = hypre_BoomerAMGBuildModExtPEInterpHost(A, CF_marker, S, num_cpts_global, num_functions, dof_func, debug_flag, trunc_factor, max_elmts, P_ptr); } hypre_GpuProfilingPopRange(); return ierr; } hypre-2.33.0/src/parcsr_ls/par_mod_multi_interp.c000066400000000000000000001276541477326011500221120ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "_hypre_parcsr_ls.h" /*-------------------------------------------------------------------------- * hypre_ParAMGBuildModMultipass * This routine implements Stuben's direct interpolation with multiple passes. * expressed with matrix matrix multiplications *--------------------------------------------------------------------------*/ HYPRE_Int hypre_BoomerAMGBuildModMultipassHost( hypre_ParCSRMatrix *A, HYPRE_Int *CF_marker, hypre_ParCSRMatrix *S, HYPRE_BigInt *num_cpts_global, HYPRE_Real trunc_factor, HYPRE_Int P_max_elmts, HYPRE_Int interp_type, HYPRE_Int num_functions, HYPRE_Int *dof_func, hypre_ParCSRMatrix **P_ptr ) { #ifdef HYPRE_PROFILE hypre_profile_times[HYPRE_TIMER_ID_MULTIPASS_INTERP] -= hypre_MPI_Wtime(); #endif MPI_Comm comm = hypre_ParCSRMatrixComm(A); hypre_ParCSRCommPkg *comm_pkg = hypre_ParCSRMatrixCommPkg(A); hypre_ParCSRCommHandle *comm_handle; HYPRE_MemoryLocation memory_location_P = hypre_ParCSRMatrixMemoryLocation(A); hypre_CSRMatrix *A_diag = hypre_ParCSRMatrixDiag(A); HYPRE_Int *A_diag_i = hypre_CSRMatrixI(A_diag); HYPRE_Int *A_diag_j = hypre_CSRMatrixJ(A_diag); HYPRE_Real *A_diag_data = hypre_CSRMatrixData(A_diag); HYPRE_Int n_fine = hypre_CSRMatrixNumRows(A_diag); hypre_CSRMatrix *A_offd = hypre_ParCSRMatrixOffd(A); HYPRE_Int *A_offd_i = hypre_CSRMatrixI(A_offd); HYPRE_Int *A_offd_j = hypre_CSRMatrixJ(A_offd); HYPRE_Real *A_offd_data = hypre_CSRMatrixData(A_offd); HYPRE_Int num_cols_offd_A = hypre_CSRMatrixNumCols(A_offd); hypre_CSRMatrix *S_diag = hypre_ParCSRMatrixDiag(S); HYPRE_Int *S_diag_i = hypre_CSRMatrixI(S_diag); HYPRE_Int *S_diag_j = hypre_CSRMatrixJ(S_diag); hypre_CSRMatrix *S_offd = hypre_ParCSRMatrixOffd(S); HYPRE_Int *S_offd_i = hypre_CSRMatrixI(S_offd); HYPRE_Int *S_offd_j = hypre_CSRMatrixJ(S_offd); hypre_ParCSRMatrix **Pi; hypre_ParCSRMatrix *P; hypre_CSRMatrix *P_diag; HYPRE_Real *P_diag_data; HYPRE_Int *P_diag_i; /*at first counter of nonzero cols for each row, finally will be pointer to start of row */ HYPRE_Int *P_diag_j; hypre_CSRMatrix *P_offd; HYPRE_Real *P_offd_data = NULL; HYPRE_Int *P_offd_i; /*at first counter of nonzero cols for each row, finally will be pointer to start of row */ HYPRE_Int *P_offd_j = NULL; HYPRE_BigInt *col_map_offd_P = NULL; HYPRE_Int num_cols_offd_P = 0; HYPRE_Int num_sends = 0; HYPRE_Int *int_buf_data = NULL; HYPRE_Int *fine_to_coarse; HYPRE_Int *points_left; HYPRE_Int *pass_marker; HYPRE_Int *pass_marker_offd = NULL; HYPRE_Int *pass_order; HYPRE_Int *pass_starts; HYPRE_Int i, j, i1, i2, j1; HYPRE_Int num_passes, p; HYPRE_BigInt global_remaining, remaining; HYPRE_Int cnt, cnt_old, cnt_rem, current_pass; HYPRE_Int startc, index; HYPRE_BigInt total_global_cpts; HYPRE_Int my_id, num_procs; HYPRE_Int P_offd_size = 0; HYPRE_Int *dof_func_offd = NULL; HYPRE_Real *row_sums = NULL; /* MPI size and rank*/ hypre_MPI_Comm_size(comm, &num_procs); hypre_MPI_Comm_rank(comm, &my_id); if (num_procs > 1) { if (my_id == num_procs - 1) { total_global_cpts = num_cpts_global[1]; } hypre_MPI_Bcast(&total_global_cpts, 1, HYPRE_MPI_BIG_INT, num_procs - 1, comm); } else { total_global_cpts = num_cpts_global[1]; } if (total_global_cpts == 0) { *P_ptr = NULL; return hypre_error_flag; } /* Generate pass marker array */ pass_marker = hypre_CTAlloc(HYPRE_Int, n_fine, HYPRE_MEMORY_HOST); /* contains pass numbers for each variable according to original order */ pass_order = hypre_CTAlloc(HYPRE_Int, n_fine, HYPRE_MEMORY_HOST); /* contains row numbers according to new order, pass 1 followed by pass 2 etc */ fine_to_coarse = hypre_CTAlloc(HYPRE_Int, n_fine, HYPRE_MEMORY_HOST); /* reverse of pass_order, keeps track where original numbers go */ points_left = hypre_CTAlloc(HYPRE_Int, n_fine, HYPRE_MEMORY_HOST); /* contains row numbers of remaining points, auxiliary */ pass_starts = hypre_CTAlloc(HYPRE_Int, 11, HYPRE_MEMORY_HOST); /* contains beginning for each pass in pass_order field, assume no more than 10 passes */ P_diag_i = hypre_CTAlloc(HYPRE_Int, n_fine + 1, memory_location_P); P_offd_i = hypre_CTAlloc(HYPRE_Int, n_fine + 1, memory_location_P); cnt = 0; remaining = 0; for (i = 0; i < n_fine; i++) { if (CF_marker[i] == 1) { pass_marker[i] = 1; P_diag_i[i + 1] = 1; P_offd_i[i + 1] = 0; fine_to_coarse[i] = cnt; pass_order[cnt++] = i; } else { points_left[remaining++] = i; } } pass_starts[0] = 0; pass_starts[1] = cnt; if (num_functions > 1) { dof_func_offd = hypre_CTAlloc(HYPRE_Int, num_cols_offd_A, HYPRE_MEMORY_HOST); index = 0; num_sends = hypre_ParCSRCommPkgNumSends(comm_pkg); int_buf_data = hypre_CTAlloc(HYPRE_Int, hypre_ParCSRCommPkgSendMapStart(comm_pkg, num_sends), HYPRE_MEMORY_HOST); for (i = 0; i < num_sends; i++) { startc = hypre_ParCSRCommPkgSendMapStart(comm_pkg, i); for (j = startc; j < hypre_ParCSRCommPkgSendMapStart(comm_pkg, i + 1); j++) { int_buf_data[index++] = dof_func[hypre_ParCSRCommPkgSendMapElmt(comm_pkg, j)]; } } comm_handle = hypre_ParCSRCommHandleCreate( 11, comm_pkg, int_buf_data, dof_func_offd); hypre_ParCSRCommHandleDestroy(comm_handle); hypre_TFree(int_buf_data, HYPRE_MEMORY_HOST); } if (num_procs > 1) { pass_marker_offd = hypre_CTAlloc(HYPRE_Int, num_cols_offd_A, HYPRE_MEMORY_HOST); index = 0; num_sends = hypre_ParCSRCommPkgNumSends(comm_pkg); int_buf_data = hypre_CTAlloc(HYPRE_Int, hypre_ParCSRCommPkgSendMapStart(comm_pkg, num_sends), HYPRE_MEMORY_HOST); for (i = 0; i < num_sends; i++) { startc = hypre_ParCSRCommPkgSendMapStart(comm_pkg, i); for (j = startc; j < hypre_ParCSRCommPkgSendMapStart(comm_pkg, i + 1); j++) { int_buf_data[index++] = pass_marker[hypre_ParCSRCommPkgSendMapElmt(comm_pkg, j)]; } } comm_handle = hypre_ParCSRCommHandleCreate(11, comm_pkg, int_buf_data, pass_marker_offd); hypre_ParCSRCommHandleDestroy(comm_handle); } current_pass = 1; num_passes = 1; /* color points according to pass number */ hypre_MPI_Allreduce(&remaining, &global_remaining, 1, HYPRE_MPI_BIG_INT, hypre_MPI_SUM, comm); while (global_remaining > 0) { HYPRE_Int remaining_pts = (HYPRE_Int) remaining; HYPRE_BigInt old_global_remaining = global_remaining; cnt_rem = 0; for (i = 0; i < remaining_pts; i++) { i1 = points_left[i]; cnt_old = cnt; for (j = S_diag_i[i1]; j < S_diag_i[i1 + 1]; j++) { j1 = S_diag_j[j]; if (pass_marker[j1] == current_pass) { pass_marker[i1] = current_pass + 1; pass_order[cnt++] = i1; remaining--; break; } } if (cnt == cnt_old) { for (j = S_offd_i[i1]; j < S_offd_i[i1 + 1]; j++) { j1 = S_offd_j[j]; if (pass_marker_offd[j1] == current_pass) { pass_marker[i1] = current_pass + 1; pass_order[cnt++] = i1; remaining--; break; } } } if (cnt == cnt_old) { points_left[cnt_rem++] = i1; } } remaining = (HYPRE_BigInt) cnt_rem; current_pass++; num_passes++; if (num_passes > 9) { hypre_error_w_msg(HYPRE_ERROR_GENERIC, " Warning!!! too many passes! out of range!\n"); break; } pass_starts[num_passes] = cnt; /* update pass_marker_offd */ index = 0; if (num_procs > 1) { for (i = 0; i < num_sends; i++) { startc = hypre_ParCSRCommPkgSendMapStart(comm_pkg, i); for (j = startc; j < hypre_ParCSRCommPkgSendMapStart(comm_pkg, i + 1); j++) { int_buf_data[index++] = pass_marker[hypre_ParCSRCommPkgSendMapElmt(comm_pkg, j)]; } } comm_handle = hypre_ParCSRCommHandleCreate(11, comm_pkg, int_buf_data, pass_marker_offd); hypre_ParCSRCommHandleDestroy(comm_handle); } old_global_remaining = global_remaining; hypre_MPI_Allreduce(&remaining, &global_remaining, 1, HYPRE_MPI_BIG_INT, hypre_MPI_SUM, comm); /* if the number of remaining points does not change, we have a situation of isolated areas of * fine points that are not connected to any C-points, and the pass generation process breaks * down. Those points can be ignored, i.e. the corresponding rows in P will just be 0 * and can be ignored for the algorithm. */ if (old_global_remaining == global_remaining) { break; } } hypre_TFree(int_buf_data, HYPRE_MEMORY_HOST); hypre_TFree(points_left, HYPRE_MEMORY_HOST); /* generate row sum of weak points and C-points to be ignored */ row_sums = hypre_CTAlloc(HYPRE_Real, n_fine, HYPRE_MEMORY_HOST); if (num_functions > 1) { for (i = 0; i < n_fine; i++) { if (CF_marker[i] < 0) { for (j = A_diag_i[i] + 1; j < A_diag_i[i + 1]; j++) { if (dof_func[i] == dof_func[A_diag_j[j]]) { row_sums[i] += A_diag_data[j]; } } for (j = A_offd_i[i]; j < A_offd_i[i + 1]; j++) { if (dof_func[i] == dof_func_offd[A_offd_j[j]]) { row_sums[i] += A_offd_data[j]; } } } } } else { for (i = 0; i < n_fine; i++) { if (CF_marker[i] < 0) { for (j = A_diag_i[i] + 1; j < A_diag_i[i + 1]; j++) { row_sums[i] += A_diag_data[j]; } for (j = A_offd_i[i]; j < A_offd_i[i + 1]; j++) { row_sums[i] += A_offd_data[j]; } } } } Pi = hypre_CTAlloc(hypre_ParCSRMatrix*, num_passes, HYPRE_MEMORY_HOST); hypre_GenerateMultipassPi(A, S, num_cpts_global, &pass_order[pass_starts[1]], pass_marker, pass_marker_offd, pass_starts[2] - pass_starts[1], 1, row_sums, &Pi[0]); if (interp_type == 8) { for (i = 1; i < num_passes - 1; i++) { hypre_ParCSRMatrix *Q; HYPRE_BigInt *c_pts_starts = hypre_ParCSRMatrixRowStarts(Pi[i - 1]); hypre_GenerateMultipassPi(A, S, c_pts_starts, &pass_order[pass_starts[i + 1]], pass_marker, pass_marker_offd, pass_starts[i + 2] - pass_starts[i + 1], i + 1, row_sums, &Q); Pi[i] = hypre_ParMatmul(Q, Pi[i - 1]); hypre_ParCSRMatrixDestroy(Q); } } else if (interp_type == 9) { for (i = 1; i < num_passes - 1; i++) { HYPRE_BigInt *c_pts_starts = hypre_ParCSRMatrixRowStarts(Pi[i - 1]); hypre_GenerateMultiPi(A, S, Pi[i - 1], c_pts_starts, &pass_order[pass_starts[i + 1]], pass_marker, pass_marker_offd, pass_starts[i + 2] - pass_starts[i + 1], i + 1, num_functions, dof_func, dof_func_offd, &Pi[i]); } } /* p pulate P_diag_i[i+1] with nnz of i-th row */ for (i = 0; i < num_passes - 1; i++) { HYPRE_Int *Pi_diag_i = hypre_CSRMatrixI(hypre_ParCSRMatrixDiag(Pi[i])); HYPRE_Int *Pi_offd_i = hypre_CSRMatrixI(hypre_ParCSRMatrixOffd(Pi[i])); j1 = 0; for (j = pass_starts[i + 1]; j < pass_starts[i + 2]; j++) { i1 = pass_order[j]; P_diag_i[i1 + 1] = Pi_diag_i[j1 + 1] - Pi_diag_i[j1]; P_offd_i[i1 + 1] = Pi_offd_i[j1 + 1] - Pi_offd_i[j1]; j1++; } } for (i = 0; i < n_fine; i++) { P_diag_i[i + 1] += P_diag_i[i]; P_offd_i[i + 1] += P_offd_i[i]; } P_diag_j = hypre_CTAlloc(HYPRE_Int, P_diag_i[n_fine], memory_location_P); P_diag_data = hypre_CTAlloc(HYPRE_Real, P_diag_i[n_fine], memory_location_P); P_offd_j = hypre_CTAlloc(HYPRE_Int, P_offd_i[n_fine], memory_location_P); P_offd_data = hypre_CTAlloc(HYPRE_Real, P_offd_i[n_fine], memory_location_P); /* insert weights for coarse points */ for (i = 0; i < pass_starts[1]; i++) { i1 = pass_order[i]; j = P_diag_i[i1]; P_diag_j[j] = fine_to_coarse[i1]; P_diag_data[j] = 1.0; } /* generate col_map_offd_P by combining all col_map_offd_Pi * and reompute indices if needed */ /* insert remaining weights */ for (p = 0; p < num_passes - 1; p++) { HYPRE_Int *Pi_diag_i = hypre_CSRMatrixI(hypre_ParCSRMatrixDiag(Pi[p])); HYPRE_Int *Pi_offd_i = hypre_CSRMatrixI(hypre_ParCSRMatrixOffd(Pi[p])); HYPRE_Int *Pi_diag_j = hypre_CSRMatrixJ(hypre_ParCSRMatrixDiag(Pi[p])); HYPRE_Int *Pi_offd_j = hypre_CSRMatrixJ(hypre_ParCSRMatrixOffd(Pi[p])); HYPRE_Real *Pi_diag_data = hypre_CSRMatrixData(hypre_ParCSRMatrixDiag(Pi[p])); HYPRE_Real *Pi_offd_data = hypre_CSRMatrixData(hypre_ParCSRMatrixOffd(Pi[p])); j1 = 0; for (i = pass_starts[p + 1]; i < pass_starts[p + 2]; i++) { i1 = pass_order[i]; i2 = Pi_diag_i[j1]; for (j = P_diag_i[i1]; j < P_diag_i[i1 + 1]; j++) { P_diag_j[j] = Pi_diag_j[i2]; P_diag_data[j] = Pi_diag_data[i2++]; } i2 = Pi_offd_i[j1]; for (j = P_offd_i[i1]; j < P_offd_i[i1 + 1]; j++) { P_offd_j[j] = Pi_offd_j[i2]; P_offd_data[j] = Pi_offd_data[i2++]; } j1++; } } /* Note that col indices in P_offd_j probably not consistent, this gets fixed after truncation */ P = hypre_ParCSRMatrixCreate(comm, hypre_ParCSRMatrixGlobalNumRows(A), total_global_cpts, hypre_ParCSRMatrixRowStarts(A), num_cpts_global, num_cols_offd_P, P_diag_i[n_fine], P_offd_i[n_fine]); P_diag = hypre_ParCSRMatrixDiag(P); hypre_CSRMatrixData(P_diag) = P_diag_data; hypre_CSRMatrixI(P_diag) = P_diag_i; hypre_CSRMatrixJ(P_diag) = P_diag_j; P_offd = hypre_ParCSRMatrixOffd(P); hypre_CSRMatrixData(P_offd) = P_offd_data; hypre_CSRMatrixI(P_offd) = P_offd_i; hypre_CSRMatrixJ(P_offd) = P_offd_j; /* Compress P, removing coefficients smaller than trunc_factor * Max */ if (trunc_factor != 0.0 || P_max_elmts > 0) { hypre_BoomerAMGInterpTruncation(P, trunc_factor, P_max_elmts); P_diag_data = hypre_CSRMatrixData(P_diag); P_diag_i = hypre_CSRMatrixI(P_diag); P_diag_j = hypre_CSRMatrixJ(P_diag); P_offd_data = hypre_CSRMatrixData(P_offd); P_offd_i = hypre_CSRMatrixI(P_offd); P_offd_j = hypre_CSRMatrixJ(P_offd); } num_cols_offd_P = 0; P_offd_size = P_offd_i[n_fine]; if (P_offd_size) { HYPRE_BigInt *tmp_P_offd_j = hypre_CTAlloc(HYPRE_BigInt, P_offd_size, HYPRE_MEMORY_HOST); HYPRE_BigInt *big_P_offd_j = hypre_CTAlloc(HYPRE_BigInt, P_offd_size, HYPRE_MEMORY_HOST); for (p = 0; p < num_passes - 1; p++) { HYPRE_BigInt *col_map_offd_Pi = hypre_ParCSRMatrixColMapOffd(Pi[p]); for (i = pass_starts[p + 1]; i < pass_starts[p + 2]; i++) { i1 = pass_order[i]; for (j = P_offd_i[i1]; j < P_offd_i[i1 + 1]; j++) { big_P_offd_j[j] = col_map_offd_Pi[P_offd_j[j]]; } } } for (i = 0; i < P_offd_size; i++) { tmp_P_offd_j[i] = big_P_offd_j[i]; } hypre_BigQsort0(tmp_P_offd_j, 0, P_offd_size - 1); num_cols_offd_P = 1; for (i = 0; i < P_offd_size - 1; i++) { if (tmp_P_offd_j[i + 1] > tmp_P_offd_j[i]) { tmp_P_offd_j[num_cols_offd_P++] = tmp_P_offd_j[i + 1]; } } col_map_offd_P = hypre_CTAlloc(HYPRE_BigInt, num_cols_offd_P, HYPRE_MEMORY_HOST); for (i = 0; i < num_cols_offd_P; i++) { col_map_offd_P[i] = tmp_P_offd_j[i]; } for (i = 0; i < P_offd_size; i++) { P_offd_j[i] = hypre_BigBinarySearch(col_map_offd_P, big_P_offd_j[i], num_cols_offd_P); } hypre_TFree(tmp_P_offd_j, HYPRE_MEMORY_HOST); hypre_TFree(big_P_offd_j, HYPRE_MEMORY_HOST); } for (i = 0; i < num_passes - 1; i++) { hypre_ParCSRMatrixDestroy(Pi[i]); } hypre_TFree (Pi, HYPRE_MEMORY_HOST); hypre_TFree (pass_marker, HYPRE_MEMORY_HOST); hypre_TFree (pass_marker_offd, HYPRE_MEMORY_HOST); hypre_TFree (pass_order, HYPRE_MEMORY_HOST); hypre_TFree (pass_starts, HYPRE_MEMORY_HOST); hypre_TFree (fine_to_coarse, HYPRE_MEMORY_HOST); hypre_TFree (dof_func_offd, HYPRE_MEMORY_HOST); hypre_TFree (row_sums, HYPRE_MEMORY_HOST); for (i = 0; i < n_fine; i++) { if (CF_marker[i] == -3) { CF_marker[i] = -1; } } hypre_ParCSRMatrixColMapOffd(P) = col_map_offd_P; hypre_CSRMatrixNumCols(P_offd) = num_cols_offd_P; hypre_MatvecCommPkgCreate(P); *P_ptr = P; return hypre_error_flag; } HYPRE_Int hypre_GenerateMultipassPi( hypre_ParCSRMatrix *A, hypre_ParCSRMatrix *S, HYPRE_BigInt *c_pts_starts, HYPRE_Int *pass_order, /* array containing row numbers of rows in A and S to be considered */ HYPRE_Int *pass_marker, HYPRE_Int *pass_marker_offd, HYPRE_Int num_points, HYPRE_Int color, HYPRE_Real *row_sums, hypre_ParCSRMatrix **P_ptr ) { MPI_Comm comm = hypre_ParCSRMatrixComm(A); hypre_ParCSRCommPkg *comm_pkg = hypre_ParCSRMatrixCommPkg(A); hypre_ParCSRCommHandle *comm_handle; hypre_CSRMatrix *A_diag = hypre_ParCSRMatrixDiag(A); HYPRE_Real *A_diag_data = hypre_CSRMatrixData(A_diag); HYPRE_Int *A_diag_i = hypre_CSRMatrixI(A_diag); HYPRE_Int *A_diag_j = hypre_CSRMatrixJ(A_diag); HYPRE_Int n_fine = hypre_CSRMatrixNumRows(A_diag); hypre_CSRMatrix *A_offd = hypre_ParCSRMatrixOffd(A); HYPRE_Real *A_offd_data = hypre_CSRMatrixData(A_offd); HYPRE_Int *A_offd_i = hypre_CSRMatrixI(A_offd); HYPRE_Int *A_offd_j = hypre_CSRMatrixJ(A_offd); HYPRE_Int num_cols_offd_A = hypre_CSRMatrixNumCols(A_offd); hypre_CSRMatrix *S_diag = hypre_ParCSRMatrixDiag(S); HYPRE_Int *S_diag_i = hypre_CSRMatrixI(S_diag); HYPRE_Int *S_diag_j = hypre_CSRMatrixJ(S_diag); hypre_CSRMatrix *S_offd = hypre_ParCSRMatrixOffd(S); HYPRE_Int *S_offd_i = hypre_CSRMatrixI(S_offd); HYPRE_Int *S_offd_j = hypre_CSRMatrixJ(S_offd); HYPRE_BigInt *col_map_offd_P = NULL; HYPRE_Int num_cols_offd_P; HYPRE_Int nnz_diag, nnz_offd; HYPRE_Int n_cpts, i, j, i1, j1, j2; HYPRE_Int startc, index; HYPRE_Int cpt, cnt_diag, cnt_offd; hypre_ParCSRMatrix *P; hypre_CSRMatrix *P_diag; HYPRE_Real *P_diag_data; HYPRE_Int *P_diag_i; /*at first counter of nonzero cols for each row, finally will be pointer to start of row */ HYPRE_Int *P_diag_j; hypre_CSRMatrix *P_offd; HYPRE_Real *P_offd_data = NULL; HYPRE_Int *P_offd_i; /*at first counter of nonzero cols for each row, finally will be pointer to start of row */ HYPRE_Int *P_offd_j = NULL; HYPRE_Int *fine_to_coarse; HYPRE_Int *fine_to_coarse_offd = NULL; HYPRE_BigInt f_pts_starts[2]; HYPRE_Int my_id, num_procs; HYPRE_BigInt total_global_fpts; HYPRE_BigInt total_global_cpts; HYPRE_BigInt *big_convert; HYPRE_BigInt *big_convert_offd = NULL; HYPRE_BigInt *big_buf_data = NULL; HYPRE_Int num_sends; HYPRE_Real *row_sum_C; /* MPI size and rank*/ hypre_MPI_Comm_size(comm, &num_procs); hypre_MPI_Comm_rank(comm, &my_id); /* define P matrices */ P_diag_i = hypre_CTAlloc(HYPRE_Int, num_points + 1, HYPRE_MEMORY_HOST); P_offd_i = hypre_CTAlloc(HYPRE_Int, num_points + 1, HYPRE_MEMORY_HOST); fine_to_coarse = hypre_CTAlloc(HYPRE_Int, n_fine, HYPRE_MEMORY_HOST); /* fill P */ n_cpts = 0; for (i = 0; i < n_fine; i++) { if (pass_marker[i] == color) { fine_to_coarse[i] = n_cpts++; } else { fine_to_coarse[i] = -1; } } if (num_procs > 1) { HYPRE_BigInt big_Fpts; big_Fpts = num_points; hypre_MPI_Scan(&big_Fpts, f_pts_starts + 1, 1, HYPRE_MPI_BIG_INT, hypre_MPI_SUM, comm); f_pts_starts[0] = f_pts_starts[1] - big_Fpts; if (my_id == num_procs - 1) { total_global_fpts = f_pts_starts[1]; total_global_cpts = c_pts_starts[1]; } hypre_MPI_Bcast(&total_global_fpts, 1, HYPRE_MPI_BIG_INT, num_procs - 1, comm); hypre_MPI_Bcast(&total_global_cpts, 1, HYPRE_MPI_BIG_INT, num_procs - 1, comm); } else { f_pts_starts[0] = 0; f_pts_starts[1] = num_points; total_global_fpts = f_pts_starts[1]; total_global_cpts = c_pts_starts[1]; } { big_convert = hypre_CTAlloc(HYPRE_BigInt, n_fine, HYPRE_MEMORY_HOST); for (i = 0; i < n_fine; i++) { if (pass_marker[i] == color) { big_convert[i] = (HYPRE_BigInt)fine_to_coarse[i] + c_pts_starts[0]; } } num_cols_offd_P = 0; if (num_procs > 1) { big_convert_offd = hypre_CTAlloc(HYPRE_BigInt, num_cols_offd_A, HYPRE_MEMORY_HOST); fine_to_coarse_offd = hypre_CTAlloc(HYPRE_Int, num_cols_offd_A, HYPRE_MEMORY_HOST); index = 0; num_sends = hypre_ParCSRCommPkgNumSends(comm_pkg); big_buf_data = hypre_CTAlloc(HYPRE_BigInt, hypre_ParCSRCommPkgSendMapStart(comm_pkg, num_sends), HYPRE_MEMORY_HOST); for (i = 0; i < num_sends; i++) { startc = hypre_ParCSRCommPkgSendMapStart(comm_pkg, i); for (j = startc; j < hypre_ParCSRCommPkgSendMapStart(comm_pkg, i + 1); j++) { big_buf_data[index++] = big_convert[hypre_ParCSRCommPkgSendMapElmt(comm_pkg, j)]; } } comm_handle = hypre_ParCSRCommHandleCreate( 21, comm_pkg, big_buf_data, big_convert_offd); hypre_ParCSRCommHandleDestroy(comm_handle); num_cols_offd_P = 0; for (i = 0; i < num_cols_offd_A; i++) { if (pass_marker_offd[i] == color) { fine_to_coarse_offd[i] = num_cols_offd_P++; } } col_map_offd_P = hypre_CTAlloc(HYPRE_BigInt, num_cols_offd_P, HYPRE_MEMORY_HOST); cpt = 0; for (i = 0; i < num_cols_offd_A; i++) { if (pass_marker_offd[i] == color) { col_map_offd_P[cpt++] = big_convert_offd[i]; } } } } /* generate P_diag_i and P_offd_i */ nnz_diag = 0; nnz_offd = 0; for (i = 0; i < num_points; i++) { i1 = pass_order[i]; for (j = S_diag_i[i1]; j < S_diag_i[i1 + 1]; j++) { j1 = S_diag_j[j]; if (pass_marker[j1] == color) { P_diag_i[i + 1]++; nnz_diag++; } } for (j = S_offd_i[i1]; j < S_offd_i[i1 + 1]; j++) { j1 = S_offd_j[j]; if (pass_marker_offd[j1] == color) { P_offd_i[i + 1]++; nnz_offd++; } } } for (i = 1; i < num_points + 1; i++) { P_diag_i[i] += P_diag_i[i - 1]; P_offd_i[i] += P_offd_i[i - 1]; } P_diag_j = hypre_CTAlloc(HYPRE_Int, nnz_diag, HYPRE_MEMORY_HOST); P_diag_data = hypre_CTAlloc(HYPRE_Real, nnz_diag, HYPRE_MEMORY_HOST); P_offd_j = hypre_CTAlloc(HYPRE_Int, nnz_offd, HYPRE_MEMORY_HOST); P_offd_data = hypre_CTAlloc(HYPRE_Real, nnz_offd, HYPRE_MEMORY_HOST); cnt_diag = 0; cnt_offd = 0; for (i = 0; i < num_points; i++) { i1 = pass_order[i]; j2 = A_diag_i[i1]; for (j = S_diag_i[i1]; j < S_diag_i[i1 + 1]; j++) { j1 = S_diag_j[j]; while (A_diag_j[j2] != j1) { j2++; } if (pass_marker[j1] == color && A_diag_j[j2] == j1) { P_diag_j[cnt_diag] = fine_to_coarse[j1]; P_diag_data[cnt_diag++] = A_diag_data[j2]; } } j2 = A_offd_i[i1]; for (j = S_offd_i[i1]; j < S_offd_i[i1 + 1]; j++) { j1 = S_offd_j[j]; while (A_offd_j[j2] != j1) { j2++; } if (pass_marker_offd[j1] == color && A_offd_j[j2] == j1) { P_offd_j[cnt_offd] = fine_to_coarse_offd[j1]; P_offd_data[cnt_offd++] = A_offd_data[j2]; } } } //row_sums = hypre_CTAlloc(HYPRE_Real, num_points, HYPRE_MEMORY_HOST); row_sum_C = hypre_CTAlloc(HYPRE_Real, num_points, HYPRE_MEMORY_HOST); for (i = 0; i < num_points; i++) { HYPRE_Real diagonal, value; i1 = pass_order[i]; diagonal = A_diag_data[A_diag_i[i1]]; /*for (j=A_diag_i[i1]+1; j < A_diag_i[i1+1]; j++) { row_sums[i] += A_diag_data[j]; } for (j=A_offd_i[i1]; j < A_offd_i[i1+1]; j++) { row_sums[i] += A_offd_data[j]; }*/ for (j = P_diag_i[i]; j < P_diag_i[i + 1]; j++) { row_sum_C[i] += P_diag_data[j]; } for (j = P_offd_i[i]; j < P_offd_i[i + 1]; j++) { row_sum_C[i] += P_offd_data[j]; } value = row_sum_C[i] * diagonal; if (value != 0) { row_sums[i1] /= value; } for (j = P_diag_i[i]; j < P_diag_i[i + 1]; j++) { P_diag_data[j] = -P_diag_data[j] * row_sums[i1]; } for (j = P_offd_i[i]; j < P_offd_i[i + 1]; j++) { P_offd_data[j] = -P_offd_data[j] * row_sums[i1]; } } P = hypre_ParCSRMatrixCreate(comm, total_global_fpts, total_global_cpts, f_pts_starts, c_pts_starts, num_cols_offd_P, P_diag_i[num_points], P_offd_i[num_points]); P_diag = hypre_ParCSRMatrixDiag(P); hypre_CSRMatrixData(P_diag) = P_diag_data; hypre_CSRMatrixI(P_diag) = P_diag_i; hypre_CSRMatrixJ(P_diag) = P_diag_j; P_offd = hypre_ParCSRMatrixOffd(P); hypre_CSRMatrixData(P_offd) = P_offd_data; hypre_CSRMatrixI(P_offd) = P_offd_i; hypre_CSRMatrixJ(P_offd) = P_offd_j; hypre_ParCSRMatrixColMapOffd(P) = col_map_offd_P; hypre_CSRMatrixMemoryLocation(P_diag) = HYPRE_MEMORY_HOST; hypre_CSRMatrixMemoryLocation(P_offd) = HYPRE_MEMORY_HOST; /* free stuff */ hypre_TFree(fine_to_coarse, HYPRE_MEMORY_HOST); hypre_TFree(fine_to_coarse_offd, HYPRE_MEMORY_HOST); //hypre_TFree(row_sums, HYPRE_MEMORY_HOST); hypre_TFree(row_sum_C, HYPRE_MEMORY_HOST); hypre_TFree(big_convert, HYPRE_MEMORY_HOST); hypre_TFree(big_convert_offd, HYPRE_MEMORY_HOST); hypre_TFree(big_buf_data, HYPRE_MEMORY_HOST); hypre_MatvecCommPkgCreate(P); *P_ptr = P; return hypre_error_flag; } HYPRE_Int hypre_GenerateMultiPi( hypre_ParCSRMatrix *A, hypre_ParCSRMatrix *S, hypre_ParCSRMatrix *P, HYPRE_BigInt *c_pts_starts, HYPRE_Int *pass_order, /* array containing row numbers of rows in A and S to be considered */ HYPRE_Int *pass_marker, HYPRE_Int *pass_marker_offd, HYPRE_Int num_points, HYPRE_Int color, HYPRE_Int num_functions, HYPRE_Int *dof_func, HYPRE_Int *dof_func_offd, hypre_ParCSRMatrix **Pi_ptr ) { MPI_Comm comm = hypre_ParCSRMatrixComm(A); hypre_ParCSRCommPkg *comm_pkg = hypre_ParCSRMatrixCommPkg(A); hypre_ParCSRCommHandle *comm_handle; hypre_CSRMatrix *A_diag = hypre_ParCSRMatrixDiag(A); HYPRE_Real *A_diag_data = hypre_CSRMatrixData(A_diag); HYPRE_Int *A_diag_i = hypre_CSRMatrixI(A_diag); HYPRE_Int *A_diag_j = hypre_CSRMatrixJ(A_diag); HYPRE_Int n_fine = hypre_CSRMatrixNumRows(A_diag); hypre_CSRMatrix *A_offd = hypre_ParCSRMatrixOffd(A); HYPRE_Real *A_offd_data = hypre_CSRMatrixData(A_offd); HYPRE_Int *A_offd_i = hypre_CSRMatrixI(A_offd); HYPRE_Int *A_offd_j = hypre_CSRMatrixJ(A_offd); HYPRE_Int num_cols_offd_A = hypre_CSRMatrixNumCols(A_offd); hypre_CSRMatrix *S_diag = hypre_ParCSRMatrixDiag(S); HYPRE_Int *S_diag_i = hypre_CSRMatrixI(S_diag); HYPRE_Int *S_diag_j = hypre_CSRMatrixJ(S_diag); hypre_CSRMatrix *S_offd = hypre_ParCSRMatrixOffd(S); HYPRE_Int *S_offd_i = hypre_CSRMatrixI(S_offd); HYPRE_Int *S_offd_j = hypre_CSRMatrixJ(S_offd); HYPRE_BigInt *col_map_offd_Q = NULL; HYPRE_Int num_cols_offd_Q; hypre_ParCSRMatrix *Pi; hypre_CSRMatrix *Pi_diag; HYPRE_Int *Pi_diag_i; HYPRE_Real *Pi_diag_data; hypre_CSRMatrix *Pi_offd; HYPRE_Int *Pi_offd_i; HYPRE_Real *Pi_offd_data; HYPRE_Int nnz_diag, nnz_offd; HYPRE_Int n_cpts, i, j, i1, j1, j2; HYPRE_Int startc, index; HYPRE_Int cpt, cnt_diag, cnt_offd; hypre_ParCSRMatrix *Q; hypre_CSRMatrix *Q_diag; HYPRE_Real *Q_diag_data; HYPRE_Int *Q_diag_i; /*at first counter of nonzero cols for each row, finally will be pointer to start of row */ HYPRE_Int *Q_diag_j; hypre_CSRMatrix *Q_offd; HYPRE_Real *Q_offd_data = NULL; HYPRE_Int *Q_offd_i; /*at first counter of nonzero cols for each row, finally will be pointer to start of row */ HYPRE_Int *Q_offd_j = NULL; HYPRE_Int *fine_to_coarse; HYPRE_Int *fine_to_coarse_offd = NULL; HYPRE_BigInt f_pts_starts[2]; HYPRE_Int my_id, num_procs; HYPRE_BigInt total_global_fpts; HYPRE_BigInt total_global_cpts; HYPRE_BigInt *big_convert; HYPRE_BigInt *big_convert_offd = NULL; HYPRE_BigInt *big_buf_data = NULL; HYPRE_Int num_sends; //HYPRE_Real *row_sums; HYPRE_Real *row_sums_C; HYPRE_Real *w_row_sum; /* MPI size and rank*/ hypre_MPI_Comm_size(comm, &num_procs); hypre_MPI_Comm_rank(comm, &my_id); /* define P matrices */ Q_diag_i = hypre_CTAlloc(HYPRE_Int, num_points + 1, HYPRE_MEMORY_HOST); Q_offd_i = hypre_CTAlloc(HYPRE_Int, num_points + 1, HYPRE_MEMORY_HOST); fine_to_coarse = hypre_CTAlloc(HYPRE_Int, n_fine, HYPRE_MEMORY_HOST); /* fill P */ n_cpts = 0; for (i = 0; i < n_fine; i++) { if (pass_marker[i] == color) { fine_to_coarse[i] = n_cpts++; } else { fine_to_coarse[i] = -1; } } if (num_procs > 1) { HYPRE_BigInt big_Fpts; big_Fpts = num_points; hypre_MPI_Scan(&big_Fpts, f_pts_starts + 1, 1, HYPRE_MPI_BIG_INT, hypre_MPI_SUM, comm); f_pts_starts[0] = f_pts_starts[1] - big_Fpts; if (my_id == num_procs - 1) { total_global_fpts = f_pts_starts[1]; total_global_cpts = c_pts_starts[1]; } hypre_MPI_Bcast(&total_global_fpts, 1, HYPRE_MPI_BIG_INT, num_procs - 1, comm); hypre_MPI_Bcast(&total_global_cpts, 1, HYPRE_MPI_BIG_INT, num_procs - 1, comm); } else { f_pts_starts[0] = 0; f_pts_starts[1] = num_points; total_global_fpts = f_pts_starts[1]; total_global_cpts = c_pts_starts[1]; } { big_convert = hypre_CTAlloc(HYPRE_BigInt, n_fine, HYPRE_MEMORY_HOST); for (i = 0; i < n_fine; i++) { if (pass_marker[i] == color) { big_convert[i] = (HYPRE_BigInt)fine_to_coarse[i] + c_pts_starts[0]; } } num_cols_offd_Q = 0; if (num_procs > 1) { big_convert_offd = hypre_CTAlloc(HYPRE_BigInt, num_cols_offd_A, HYPRE_MEMORY_HOST); fine_to_coarse_offd = hypre_CTAlloc(HYPRE_Int, num_cols_offd_A, HYPRE_MEMORY_HOST); index = 0; num_sends = hypre_ParCSRCommPkgNumSends(comm_pkg); big_buf_data = hypre_CTAlloc(HYPRE_BigInt, hypre_ParCSRCommPkgSendMapStart(comm_pkg, num_sends), HYPRE_MEMORY_HOST); for (i = 0; i < num_sends; i++) { startc = hypre_ParCSRCommPkgSendMapStart(comm_pkg, i); for (j = startc; j < hypre_ParCSRCommPkgSendMapStart(comm_pkg, i + 1); j++) { big_buf_data[index++] = big_convert[hypre_ParCSRCommPkgSendMapElmt(comm_pkg, j)]; } } comm_handle = hypre_ParCSRCommHandleCreate( 21, comm_pkg, big_buf_data, big_convert_offd); hypre_ParCSRCommHandleDestroy(comm_handle); num_cols_offd_Q = 0; for (i = 0; i < num_cols_offd_A; i++) { if (pass_marker_offd[i] == color) { fine_to_coarse_offd[i] = num_cols_offd_Q++; } } col_map_offd_Q = hypre_CTAlloc(HYPRE_BigInt, num_cols_offd_Q, HYPRE_MEMORY_HOST); cpt = 0; for (i = 0; i < num_cols_offd_A; i++) { if (pass_marker_offd[i] == color) { col_map_offd_Q[cpt++] = big_convert_offd[i]; } } } } /* generate Q_diag_i and Q_offd_i */ nnz_diag = 0; nnz_offd = 0; for (i = 0; i < num_points; i++) { i1 = pass_order[i]; for (j = S_diag_i[i1]; j < S_diag_i[i1 + 1]; j++) { j1 = S_diag_j[j]; if (pass_marker[j1] == color) { Q_diag_i[i + 1]++; nnz_diag++; } } for (j = S_offd_i[i1]; j < S_offd_i[i1 + 1]; j++) { j1 = S_offd_j[j]; if (pass_marker_offd[j1] == color) { Q_offd_i[i + 1]++; nnz_offd++; } } } for (i = 1; i < num_points + 1; i++) { Q_diag_i[i] += Q_diag_i[i - 1]; Q_offd_i[i] += Q_offd_i[i - 1]; } Q_diag_j = hypre_CTAlloc(HYPRE_Int, nnz_diag, HYPRE_MEMORY_HOST); Q_diag_data = hypre_CTAlloc(HYPRE_Real, nnz_diag, HYPRE_MEMORY_HOST); Q_offd_j = hypre_CTAlloc(HYPRE_Int, nnz_offd, HYPRE_MEMORY_HOST); Q_offd_data = hypre_CTAlloc(HYPRE_Real, nnz_offd, HYPRE_MEMORY_HOST); w_row_sum = hypre_CTAlloc(HYPRE_Real, num_points, HYPRE_MEMORY_HOST); cnt_diag = 0; cnt_offd = 0; if (num_functions > 1) { for (i = 0; i < num_points; i++) { i1 = pass_order[i]; j2 = A_diag_i[i1] + 1; //if (w_row_minus) w_row_sum[i] = -w_row_minus[i1]; for (j = S_diag_i[i1]; j < S_diag_i[i1 + 1]; j++) { j1 = S_diag_j[j]; while (A_diag_j[j2] != j1) { if (dof_func[i1] == dof_func[A_diag_j[j2]]) { w_row_sum[i] += A_diag_data[j2]; } j2++; } if (pass_marker[j1] == color && A_diag_j[j2] == j1) { Q_diag_j[cnt_diag] = fine_to_coarse[j1]; Q_diag_data[cnt_diag++] = A_diag_data[j2++]; } else { if (dof_func[i1] == dof_func[A_diag_j[j2]]) { w_row_sum[i] += A_diag_data[j2]; } j2++; } } while (j2 < A_diag_i[i1 + 1]) { if (dof_func[i1] == dof_func[A_diag_j[j2]]) { w_row_sum[i] += A_diag_data[j2]; } j2++; } j2 = A_offd_i[i1]; for (j = S_offd_i[i1]; j < S_offd_i[i1 + 1]; j++) { j1 = S_offd_j[j]; while (A_offd_j[j2] != j1) { if (dof_func[i1] == dof_func_offd[A_offd_j[j2]]) { w_row_sum[i] += A_offd_data[j2]; } j2++; } if (pass_marker_offd[j1] == color && A_offd_j[j2] == j1) { Q_offd_j[cnt_offd] = fine_to_coarse_offd[j1]; Q_offd_data[cnt_offd++] = A_offd_data[j2++]; } else { if (dof_func[i1] == dof_func_offd[A_offd_j[j2]]) { w_row_sum[i] += A_offd_data[j2]; } j2++; } } while (j2 < A_offd_i[i1 + 1]) { if (dof_func[i1] == dof_func_offd[A_offd_j[j2]]) { w_row_sum[i] += A_offd_data[j2]; } j2++; } } } else { for (i = 0; i < num_points; i++) { i1 = pass_order[i]; j2 = A_diag_i[i1] + 1; for (j = S_diag_i[i1]; j < S_diag_i[i1 + 1]; j++) { j1 = S_diag_j[j]; while (A_diag_j[j2] != j1) { w_row_sum[i] += A_diag_data[j2]; j2++; } if (pass_marker[j1] == color && A_diag_j[j2] == j1) { Q_diag_j[cnt_diag] = fine_to_coarse[j1]; Q_diag_data[cnt_diag++] = A_diag_data[j2++]; } else { w_row_sum[i] += A_diag_data[j2]; j2++; } } while (j2 < A_diag_i[i1 + 1]) { w_row_sum[i] += A_diag_data[j2]; j2++; } j2 = A_offd_i[i1]; for (j = S_offd_i[i1]; j < S_offd_i[i1 + 1]; j++) { j1 = S_offd_j[j]; while (A_offd_j[j2] != j1) { w_row_sum[i] += A_offd_data[j2]; j2++; } if (pass_marker_offd[j1] == color && A_offd_j[j2] == j1) { Q_offd_j[cnt_offd] = fine_to_coarse_offd[j1]; Q_offd_data[cnt_offd++] = A_offd_data[j2++]; } else { w_row_sum[i] += A_offd_data[j2]; j2++; } } while (j2 < A_offd_i[i1 + 1]) { w_row_sum[i] += A_offd_data[j2]; j2++; } } } Q = hypre_ParCSRMatrixCreate(comm, total_global_fpts, total_global_cpts, f_pts_starts, c_pts_starts, num_cols_offd_Q, Q_diag_i[num_points], Q_offd_i[num_points]); Q_diag = hypre_ParCSRMatrixDiag(Q); hypre_CSRMatrixData(Q_diag) = Q_diag_data; hypre_CSRMatrixI(Q_diag) = Q_diag_i; hypre_CSRMatrixJ(Q_diag) = Q_diag_j; Q_offd = hypre_ParCSRMatrixOffd(Q); hypre_CSRMatrixData(Q_offd) = Q_offd_data; hypre_CSRMatrixI(Q_offd) = Q_offd_i; hypre_CSRMatrixJ(Q_offd) = Q_offd_j; hypre_ParCSRMatrixColMapOffd(Q) = col_map_offd_Q; hypre_CSRMatrixMemoryLocation(Q_diag) = HYPRE_MEMORY_HOST; hypre_CSRMatrixMemoryLocation(Q_offd) = HYPRE_MEMORY_HOST; /* free stuff */ hypre_TFree(fine_to_coarse, HYPRE_MEMORY_HOST); hypre_TFree(fine_to_coarse_offd, HYPRE_MEMORY_HOST); hypre_TFree(big_convert, HYPRE_MEMORY_HOST); hypre_TFree(big_convert_offd, HYPRE_MEMORY_HOST); hypre_TFree(big_buf_data, HYPRE_MEMORY_HOST); hypre_MatvecCommPkgCreate(Q); Pi = hypre_ParMatmul(Q, P); Pi_diag = hypre_ParCSRMatrixDiag(Pi); Pi_diag_data = hypre_CSRMatrixData(Pi_diag); Pi_diag_i = hypre_CSRMatrixI(Pi_diag); Pi_offd = hypre_ParCSRMatrixOffd(Pi); Pi_offd_data = hypre_CSRMatrixData(Pi_offd); Pi_offd_i = hypre_CSRMatrixI(Pi_offd); row_sums_C = hypre_CTAlloc(HYPRE_Real, num_points, HYPRE_MEMORY_HOST); for (i = 0; i < num_points; i++) { HYPRE_Real diagonal, value; i1 = pass_order[i]; diagonal = A_diag_data[A_diag_i[i1]]; for (j = Pi_diag_i[i]; j < Pi_diag_i[i + 1]; j++) { row_sums_C[i] += Pi_diag_data[j]; } for (j = Pi_offd_i[i]; j < Pi_offd_i[i + 1]; j++) { row_sums_C[i] += Pi_offd_data[j]; } value = row_sums_C[i] * diagonal; row_sums_C[i] += w_row_sum[i]; if (value != 0) { row_sums_C[i] /= value; } for (j = Pi_diag_i[i]; j < Pi_diag_i[i + 1]; j++) { Pi_diag_data[j] = -Pi_diag_data[j] * row_sums_C[i]; } for (j = Pi_offd_i[i]; j < Pi_offd_i[i + 1]; j++) { Pi_offd_data[j] = -Pi_offd_data[j] * row_sums_C[i]; } } hypre_ParCSRMatrixDestroy(Q); //hypre_TFree(row_sums, HYPRE_MEMORY_HOST); hypre_TFree(row_sums_C, HYPRE_MEMORY_HOST); hypre_TFree(w_row_sum, HYPRE_MEMORY_HOST); *Pi_ptr = Pi; return hypre_error_flag; } HYPRE_Int hypre_BoomerAMGBuildModMultipass( hypre_ParCSRMatrix *A, HYPRE_Int *CF_marker, hypre_ParCSRMatrix *S, HYPRE_BigInt *num_cpts_global, HYPRE_Real trunc_factor, HYPRE_Int P_max_elmts, HYPRE_Int interp_type, HYPRE_Int num_functions, HYPRE_Int *dof_func, hypre_ParCSRMatrix **P_ptr ) { hypre_GpuProfilingPushRange("ModMultipass"); HYPRE_Int ierr = 0; #if defined(HYPRE_USING_GPU) HYPRE_ExecutionPolicy exec = hypre_GetExecPolicy2( hypre_ParCSRMatrixMemoryLocation(A), hypre_ParCSRMatrixMemoryLocation(S) ); if (exec == HYPRE_EXEC_DEVICE) { ierr = hypre_BoomerAMGBuildModMultipassDevice( A, CF_marker, S, num_cpts_global, trunc_factor, P_max_elmts, interp_type, num_functions, dof_func, P_ptr); } else #endif { ierr = hypre_BoomerAMGBuildModMultipassHost( A, CF_marker, S, num_cpts_global, trunc_factor, P_max_elmts, interp_type, num_functions, dof_func, P_ptr); } hypre_GpuProfilingPopRange(); return ierr; } hypre-2.33.0/src/parcsr_ls/par_mod_multi_interp_device.c000066400000000000000000002765211477326011500234270ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "_hypre_onedpl.hpp" #include "_hypre_parcsr_ls.h" #include "_hypre_utilities.hpp" #if defined(HYPRE_USING_GPU) #if defined(HYPRE_USING_SYCL) template struct tuple_plus { __host__ __device__ std::tuple operator()( const std::tuple & x1, const std::tuple & x2) const { return std::make_tuple( std::get<0>(x1) + std::get<0>(x2), std::get<1>(x1) + std::get<1>(x2) ); } }; struct local_equal_plus_constant { HYPRE_BigInt _value; local_equal_plus_constant(HYPRE_BigInt value) : _value(value) {} __host__ __device__ HYPRE_BigInt operator()(HYPRE_BigInt /*x*/, HYPRE_BigInt y) const { return y + _value; } }; /* transform from local C index to global C index */ struct globalC_functor { HYPRE_BigInt C_first; globalC_functor(HYPRE_BigInt C_first_) { C_first = C_first_; } __host__ __device__ HYPRE_BigInt operator()(const HYPRE_Int x) const { return ( (HYPRE_BigInt) x + C_first ); } }; #else template struct tuple_plus : public thrust::binary_function, thrust::tuple, thrust::tuple > { __host__ __device__ thrust::tuple operator()( const thrust::tuple & x1, const thrust::tuple & x2) { return thrust::make_tuple( thrust::get<0>(x1) + thrust::get<0>(x2), thrust::get<1>(x1) + thrust::get<1>(x2) ); } }; template struct tuple_minus : public thrust::binary_function, thrust::tuple, thrust::tuple > { __host__ __device__ thrust::tuple operator()( const thrust::tuple & x1, const thrust::tuple & x2) { return thrust::make_tuple( thrust::get<0>(x1) - thrust::get<0>(x2), thrust::get<1>(x1) - thrust::get<1>(x2) ); } }; struct local_equal_plus_constant : public thrust::binary_function { HYPRE_BigInt _value; local_equal_plus_constant(HYPRE_BigInt value) : _value(value) {} __host__ __device__ HYPRE_BigInt operator()(HYPRE_BigInt /*x*/, HYPRE_BigInt y) { return y + _value; } }; /* transform from local C index to global C index */ #if (defined(THRUST_VERSION) && THRUST_VERSION < 101000) struct globalC_functor : public thrust::unary_function #else struct globalC_functor #endif { HYPRE_BigInt C_first; globalC_functor(HYPRE_BigInt C_first_) { C_first = C_first_; } __host__ __device__ HYPRE_BigInt operator()(const HYPRE_Int x) const { return ( (HYPRE_BigInt) x + C_first ); } }; #endif void hypre_modmp_init_fine_to_coarse( HYPRE_Int n_fine, HYPRE_Int *pass_marker, HYPRE_Int color, HYPRE_Int *fine_to_coarse ); void hypre_modmp_compute_num_cols_offd_fine_to_coarse( HYPRE_Int * pass_marker_offd, HYPRE_Int color, HYPRE_Int num_cols_offd_A, HYPRE_Int & num_cols_offd, HYPRE_Int ** fine_to_coarse_offd ); __global__ void hypreGPUKernel_cfmarker_masked_rowsum( hypre_DeviceItem &item, HYPRE_Int nrows, HYPRE_Int *A_diag_i, HYPRE_Int *A_diag_j, HYPRE_Complex *A_diag_data, HYPRE_Int *A_offd_i, HYPRE_Int *A_offd_j, HYPRE_Complex *A_offd_data, HYPRE_Int *CF_marker, HYPRE_Int *dof_func, HYPRE_Int *dof_func_offd, HYPRE_Complex *row_sums ); __global__ void hypreGPUKernel_generate_Pdiag_i_Poffd_i( hypre_DeviceItem &item, HYPRE_Int num_points, HYPRE_Int color, HYPRE_Int *pass_order, HYPRE_Int *pass_marker, HYPRE_Int *pass_marker_offd, HYPRE_Int *S_diag_i, HYPRE_Int *S_diag_j, HYPRE_Int *S_offd_i, HYPRE_Int *S_offd_j, HYPRE_Int *P_diag_i, HYPRE_Int *P_offd_i ); __global__ void hypreGPUKernel_generate_Pdiag_j_Poffd_j( hypre_DeviceItem &item, HYPRE_Int num_points, HYPRE_Int color, HYPRE_Int *pass_order, HYPRE_Int *pass_marker, HYPRE_Int *pass_marker_offd, HYPRE_Int *fine_to_coarse, HYPRE_Int *fine_to_coarse_offd, HYPRE_Int *A_diag_i, HYPRE_Int *A_diag_j, HYPRE_Complex *A_diag_data, HYPRE_Int *A_offd_i, HYPRE_Int *A_offd_j, HYPRE_Complex *A_offd_data, HYPRE_Int *Soc_diag_j, HYPRE_Int *Soc_offd_j, HYPRE_Int *P_diag_i, HYPRE_Int *P_offd_i, HYPRE_Int *P_diag_j, HYPRE_Complex *P_diag_data, HYPRE_Int *P_offd_j, HYPRE_Complex *P_offd_data, HYPRE_Complex *row_sums ); __global__ void hypreGPUKernel_insert_remaining_weights( hypre_DeviceItem &item, HYPRE_Int start, HYPRE_Int stop, HYPRE_Int *pass_order, HYPRE_Int *Pi_diag_i, HYPRE_Int *Pi_diag_j, HYPRE_Real *Pi_diag_data, HYPRE_Int *P_diag_i, HYPRE_Int *P_diag_j, HYPRE_Real *P_diag_data, HYPRE_Int *Pi_offd_i, HYPRE_Int *Pi_offd_j, HYPRE_Real *Pi_offd_data, HYPRE_Int *P_offd_i, HYPRE_Int *P_offd_j, HYPRE_Real *P_offd_data ); __global__ void hypreGPUKernel_generate_Qdiag_j_Qoffd_j( hypre_DeviceItem &item, HYPRE_Int num_points, HYPRE_Int color, HYPRE_Int *pass_order, HYPRE_Int *pass_marker, HYPRE_Int *pass_marker_offd, HYPRE_Int *fine_to_coarse, HYPRE_Int *fine_to_coarse_offd, HYPRE_Int *A_diag_i, HYPRE_Int *A_diag_j, HYPRE_Complex *A_diag_data, HYPRE_Int *A_offd_i, HYPRE_Int *A_offd_j, HYPRE_Complex *A_offd_data, HYPRE_Int *Soc_diag_j, HYPRE_Int *Soc_offd_j, HYPRE_Int *Q_diag_i, HYPRE_Int *Q_offd_i, HYPRE_Int *Q_diag_j, HYPRE_Complex *Q_diag_data, HYPRE_Int *Q_offd_j, HYPRE_Complex *Q_offd_data, HYPRE_Complex *w_row_sum, HYPRE_Int num_functions, HYPRE_Int *dof_func, HYPRE_Int *dof_func_offd ); __global__ void hypreGPUKernel_mutli_pi_rowsum( hypre_DeviceItem &item, HYPRE_Int num_points, HYPRE_Int *pass_order, HYPRE_Int *A_diag_i, HYPRE_Complex *A_diag_data, HYPRE_Int *Pi_diag_i, HYPRE_Complex *Pi_diag_data, HYPRE_Int *Pi_offd_i, HYPRE_Complex *Pi_offd_data, HYPRE_Complex *w_row_sum ); __global__ void hypreGPUKernel_pass_order_count( hypre_DeviceItem &item, HYPRE_Int num_points, HYPRE_Int color, HYPRE_Int *points_left, HYPRE_Int *pass_marker, HYPRE_Int *pass_marker_offd, HYPRE_Int *S_diag_i, HYPRE_Int *S_diag_j, HYPRE_Int *S_offd_i, HYPRE_Int *S_offd_j, HYPRE_Int *diag_shifts ); __global__ void hypreGPUKernel_populate_big_P_offd_j( hypre_DeviceItem &item, HYPRE_Int start, HYPRE_Int stop, HYPRE_Int *pass_order, HYPRE_Int *P_offd_i, HYPRE_Int *P_offd_j, HYPRE_BigInt *col_map_offd_Pi, HYPRE_BigInt *big_P_offd_j ); /*-------------------------------------------------------------------------- * hypre_ParAMGBuildModMultipass * This routine implements Stuben's direct interpolation with multiple passes. * expressed with matrix matrix multiplications *--------------------------------------------------------------------------*/ HYPRE_Int hypre_BoomerAMGBuildModMultipassDevice( hypre_ParCSRMatrix *A, HYPRE_Int *CF_marker, hypre_ParCSRMatrix *S, HYPRE_BigInt *num_cpts_global, HYPRE_Real trunc_factor, HYPRE_Int P_max_elmts, HYPRE_Int interp_type, HYPRE_Int num_functions, HYPRE_Int *dof_func, hypre_ParCSRMatrix **P_ptr ) { #ifdef HYPRE_PROFILE hypre_profile_times[HYPRE_TIMER_ID_MULTIPASS_INTERP] -= hypre_MPI_Wtime(); #endif hypre_assert( hypre_ParCSRMatrixMemoryLocation(A) == HYPRE_MEMORY_DEVICE ); hypre_assert( hypre_ParCSRMatrixMemoryLocation(S) == HYPRE_MEMORY_DEVICE ); MPI_Comm comm = hypre_ParCSRMatrixComm(A); hypre_ParCSRCommPkg *comm_pkg = hypre_ParCSRMatrixCommPkg(A); hypre_ParCSRCommHandle *comm_handle; HYPRE_Int n_fine = hypre_ParCSRMatrixNumRows(A); hypre_CSRMatrix *A_diag = hypre_ParCSRMatrixDiag(A); HYPRE_Real *A_diag_data = hypre_CSRMatrixData(A_diag); HYPRE_Int *A_diag_i = hypre_CSRMatrixI(A_diag); HYPRE_Int *A_diag_j = hypre_CSRMatrixJ(A_diag); hypre_CSRMatrix *A_offd = hypre_ParCSRMatrixOffd(A); HYPRE_Int *A_offd_i = hypre_CSRMatrixI(A_offd); HYPRE_Int *A_offd_j = hypre_CSRMatrixJ(A_offd); HYPRE_Real *A_offd_data = hypre_CSRMatrixData(A_offd); HYPRE_Int num_cols_offd_A = hypre_CSRMatrixNumCols(A_offd); hypre_CSRMatrix *S_diag = hypre_ParCSRMatrixDiag(S); HYPRE_Int *S_diag_i = hypre_CSRMatrixI(S_diag); HYPRE_Int *S_diag_j = hypre_CSRMatrixJ(S_diag); hypre_CSRMatrix *S_offd = hypre_ParCSRMatrixOffd(S); HYPRE_Int *S_offd_i = hypre_CSRMatrixI(S_offd); HYPRE_Int *S_offd_j = hypre_CSRMatrixJ(S_offd); hypre_ParCSRMatrix **Pi; hypre_ParCSRMatrix *P; hypre_CSRMatrix *P_diag; HYPRE_Real *P_diag_data; HYPRE_Int *P_diag_i; HYPRE_Int *P_diag_j; hypre_CSRMatrix *P_offd; HYPRE_Real *P_offd_data = NULL; HYPRE_Int *P_offd_i; HYPRE_Int *P_offd_j = NULL; HYPRE_BigInt *col_map_offd_P = NULL; HYPRE_BigInt *col_map_offd_P_host = NULL; HYPRE_Int num_cols_offd_P = 0; HYPRE_Int num_sends = hypre_ParCSRCommPkgNumSends(comm_pkg); HYPRE_Int num_elem_send = hypre_ParCSRCommPkgSendMapStart(comm_pkg, num_sends); HYPRE_Int *int_buf_data = NULL; HYPRE_Int P_diag_size = 0, P_offd_size = 0; HYPRE_Int *pass_starts; HYPRE_Int *fine_to_coarse; HYPRE_Int *points_left; HYPRE_Int *pass_marker; HYPRE_Int *pass_marker_offd = NULL; HYPRE_Int *pass_order; HYPRE_Int i; HYPRE_Int num_passes, p, remaining; HYPRE_Int pass_starts_p1, pass_starts_p2; HYPRE_BigInt remaining_big; /* tmp variable for reducing global_remaining */ HYPRE_BigInt global_remaining; HYPRE_Int cnt, cnt_old, cnt_rem, current_pass; HYPRE_BigInt total_global_cpts; HYPRE_Int my_id, num_procs; HYPRE_Int *dof_func_offd = NULL; HYPRE_Real *row_sums = NULL; hypre_GpuProfilingPushRange("Section1"); /* MPI size and rank*/ hypre_MPI_Comm_size(comm, &num_procs); hypre_MPI_Comm_rank(comm, &my_id); if (num_procs > 1) { if (my_id == num_procs - 1) { total_global_cpts = num_cpts_global[1]; } hypre_MPI_Bcast(&total_global_cpts, 1, HYPRE_MPI_BIG_INT, num_procs - 1, comm); } else { total_global_cpts = num_cpts_global[1]; } if (!total_global_cpts) { *P_ptr = NULL; return hypre_error_flag; } hypre_BoomerAMGMakeSocFromSDevice(A, S); /* Generate pass marker array */ /* contains pass numbers for each variable according to original order */ pass_marker = hypre_CTAlloc(HYPRE_Int, n_fine, HYPRE_MEMORY_DEVICE); /* contains row numbers according to new order, pass 1 followed by pass 2 etc */ pass_order = hypre_CTAlloc(HYPRE_Int, n_fine, HYPRE_MEMORY_DEVICE); /* F2C mapping */ /* reverse of pass_order, keeps track where original numbers go */ fine_to_coarse = hypre_TAlloc(HYPRE_Int, n_fine, HYPRE_MEMORY_DEVICE); /* contains row numbers of remaining points, auxiliary */ points_left = hypre_CTAlloc(HYPRE_Int, n_fine, HYPRE_MEMORY_DEVICE); P_diag_i = hypre_CTAlloc(HYPRE_Int, n_fine + 1, HYPRE_MEMORY_DEVICE); P_offd_i = hypre_CTAlloc(HYPRE_Int, n_fine + 1, HYPRE_MEMORY_DEVICE); #if defined(HYPRE_USING_SYCL) /* Fpts; number of F pts */ oneapi::dpl::counting_iterator count(0); HYPRE_Int *points_end = hypreSycl_copy_if( count, count + n_fine, CF_marker, points_left, [] (const auto & x) {return x != 1;} ); remaining = points_end - points_left; /* Cpts; number of C pts */ HYPRE_Int *pass_end = hypreSycl_copy_if( count, count + n_fine, CF_marker, pass_order, equal(1) ); P_diag_size = cnt = pass_end - pass_order; /* mark C points pass-1; row nnz of C-diag = 1, C-offd = 0 */ auto zip0 = oneapi::dpl::make_zip_iterator( pass_marker, P_diag_i, P_offd_i ); hypreSycl_transform_if( zip0, zip0 + n_fine, CF_marker, zip0, [] (const auto & x) {return std::make_tuple(HYPRE_Int(1), HYPRE_Int(1), HYPRE_Int(0));}, equal(1) ); HYPRE_ONEDPL_CALL( std::exclusive_scan, oneapi::dpl::make_transform_iterator(CF_marker, equal(1)), oneapi::dpl::make_transform_iterator(CF_marker + n_fine, equal(1)), fine_to_coarse, HYPRE_Int(0) ); #else /* Fpts; number of F pts */ HYPRE_Int *points_end = HYPRE_THRUST_CALL( copy_if, thrust::make_counting_iterator(0), thrust::make_counting_iterator(n_fine), CF_marker, points_left, HYPRE_THRUST_NOT(equal(1)) ); remaining = points_end - points_left; /* Cpts; number of C pts */ HYPRE_Int *pass_end = HYPRE_THRUST_CALL( copy_if, thrust::make_counting_iterator(0), thrust::make_counting_iterator(n_fine), CF_marker, pass_order, equal(1) ); P_diag_size = cnt = pass_end - pass_order; /* mark C points pass-1; row nnz of C-diag = 1, C-offd = 0 */ HYPRE_THRUST_CALL( replace_if, thrust::make_zip_iterator( thrust::make_tuple(pass_marker, P_diag_i, P_offd_i) ), thrust::make_zip_iterator( thrust::make_tuple(pass_marker, P_diag_i, P_offd_i) ) + n_fine, CF_marker, equal(1), thrust::make_tuple(HYPRE_Int(1), HYPRE_Int(1), HYPRE_Int(0)) ); HYPRE_THRUST_CALL( exclusive_scan, thrust::make_transform_iterator(CF_marker, equal(1)), thrust::make_transform_iterator(CF_marker + n_fine, equal(1)), fine_to_coarse, HYPRE_Int(0) ); #endif /* contains beginning for each pass in pass_order field, assume no more than 10 passes */ pass_starts = hypre_CTAlloc(HYPRE_Int, 11, HYPRE_MEMORY_HOST); /* first pass is C */ pass_starts[0] = 0; pass_starts[1] = cnt; /* communicate dof_func */ if (num_procs > 1 && num_functions > 1) { int_buf_data = hypre_TAlloc(HYPRE_Int, num_elem_send, HYPRE_MEMORY_DEVICE); hypre_ParCSRCommPkgCopySendMapElmtsToDevice(comm_pkg); #if defined(HYPRE_USING_SYCL) hypreSycl_gather( hypre_ParCSRCommPkgDeviceSendMapElmts(comm_pkg), hypre_ParCSRCommPkgDeviceSendMapElmts(comm_pkg) + num_elem_send, dof_func, int_buf_data ); #else HYPRE_THRUST_CALL( gather, hypre_ParCSRCommPkgDeviceSendMapElmts(comm_pkg), hypre_ParCSRCommPkgDeviceSendMapElmts(comm_pkg) + num_elem_send, dof_func, int_buf_data ); #endif #if defined(HYPRE_USING_THRUST_NOSYNC) /* RL: make sure int_buf_data is ready before issuing GPU-GPU MPI */ if (hypre_GetGpuAwareMPI()) { hypre_ForceSyncComputeStream(); } #endif dof_func_offd = hypre_TAlloc(HYPRE_Int, num_cols_offd_A, HYPRE_MEMORY_DEVICE); comm_handle = hypre_ParCSRCommHandleCreate_v2(11, comm_pkg, HYPRE_MEMORY_DEVICE, int_buf_data, HYPRE_MEMORY_DEVICE, dof_func_offd); hypre_ParCSRCommHandleDestroy(comm_handle); } /* communicate pass_marker */ if (num_procs > 1) { if (!int_buf_data) { int_buf_data = hypre_CTAlloc(HYPRE_Int, num_elem_send, HYPRE_MEMORY_DEVICE); } hypre_ParCSRCommPkgCopySendMapElmtsToDevice(comm_pkg); #if defined(HYPRE_USING_SYCL) hypreSycl_gather( hypre_ParCSRCommPkgDeviceSendMapElmts(comm_pkg), hypre_ParCSRCommPkgDeviceSendMapElmts(comm_pkg) + num_elem_send, pass_marker, int_buf_data ); #else HYPRE_THRUST_CALL( gather, hypre_ParCSRCommPkgDeviceSendMapElmts(comm_pkg), hypre_ParCSRCommPkgDeviceSendMapElmts(comm_pkg) + num_elem_send, pass_marker, int_buf_data ); #endif #if defined(HYPRE_USING_THRUST_NOSYNC) /* RL: make sure int_buf_data is ready before issuing GPU-GPU MPI */ if (hypre_GetGpuAwareMPI()) { hypre_ForceSyncComputeStream(); } #endif /* allocate one more see comments in hypre_modmp_compute_num_cols_offd_fine_to_coarse */ pass_marker_offd = hypre_CTAlloc(HYPRE_Int, num_cols_offd_A + 1, HYPRE_MEMORY_DEVICE); /* create a handle to start communication. 11: for integer */ comm_handle = hypre_ParCSRCommHandleCreate_v2(11, comm_pkg, HYPRE_MEMORY_DEVICE, int_buf_data, HYPRE_MEMORY_DEVICE, pass_marker_offd); /* destroy the handle to finish communication */ hypre_ParCSRCommHandleDestroy(comm_handle); } current_pass = 1; num_passes = 1; /* color points according to pass number */ remaining_big = remaining; hypre_MPI_Allreduce(&remaining_big, &global_remaining, 1, HYPRE_MPI_BIG_INT, hypre_MPI_SUM, comm); hypre_GpuProfilingPopRange(); hypre_GpuProfilingPushRange("Section2"); HYPRE_Int *points_left_old = hypre_TAlloc(HYPRE_Int, remaining, HYPRE_MEMORY_DEVICE); HYPRE_Int *diag_shifts = hypre_TAlloc(HYPRE_Int, remaining, HYPRE_MEMORY_DEVICE); while (global_remaining > 0) { cnt_rem = 0; cnt_old = cnt; { dim3 bDim = hypre_GetDefaultDeviceBlockDimension(); dim3 gDim = hypre_GetDefaultDeviceGridDimension(remaining, "warp", bDim); /* output diag_shifts is 0/1 indicating if points_left_dev[i] is picked in this pass */ HYPRE_GPU_LAUNCH( hypreGPUKernel_pass_order_count, gDim, bDim, remaining, current_pass, points_left, pass_marker, pass_marker_offd, S_diag_i, S_diag_j, S_offd_i, S_offd_j, diag_shifts ); #if defined(HYPRE_USING_SYCL) cnt = HYPRE_ONEDPL_CALL( std::reduce, diag_shifts, diag_shifts + remaining, cnt_old, std::plus() ); cnt_rem = remaining - (cnt - cnt_old); auto perm0 = oneapi::dpl::make_permutation_iterator(pass_marker, points_left); hypreSycl_transform_if( perm0, perm0 + remaining, diag_shifts, perm0, [current_pass = current_pass] (const auto & x) {return current_pass + 1;}, [] (const auto & x) {return x;} ); hypre_TMemcpy(points_left_old, points_left, HYPRE_Int, remaining, HYPRE_MEMORY_DEVICE, HYPRE_MEMORY_DEVICE); HYPRE_Int *new_end; new_end = hypreSycl_copy_if( points_left_old, points_left_old + remaining, diag_shifts, pass_order + cnt_old, [] (const auto & x) {return x;} ); hypre_assert(new_end - pass_order == cnt); new_end = hypreSycl_copy_if( points_left_old, points_left_old + remaining, diag_shifts, points_left, [] (const auto & x) {return !x;} ); #else cnt = HYPRE_THRUST_CALL( reduce, diag_shifts, diag_shifts + remaining, cnt_old, thrust::plus() ); cnt_rem = remaining - (cnt - cnt_old); HYPRE_THRUST_CALL( replace_if, thrust::make_permutation_iterator(pass_marker, points_left), thrust::make_permutation_iterator(pass_marker, points_left + remaining), diag_shifts, thrust::identity(), current_pass + 1 ); hypre_TMemcpy(points_left_old, points_left, HYPRE_Int, remaining, HYPRE_MEMORY_DEVICE, HYPRE_MEMORY_DEVICE); HYPRE_Int *new_end; new_end = HYPRE_THRUST_CALL( copy_if, points_left_old, points_left_old + remaining, diag_shifts, pass_order + cnt_old, thrust::identity() ); hypre_assert(new_end - pass_order == cnt); new_end = HYPRE_THRUST_CALL( copy_if, points_left_old, points_left_old + remaining, diag_shifts, points_left, HYPRE_THRUST_NOT(thrust::identity()) ); #endif hypre_assert(new_end - points_left == cnt_rem); } remaining = cnt_rem; current_pass++; num_passes++; if (num_passes > 9) { hypre_error_w_msg(HYPRE_ERROR_GENERIC, " Warning!!! too many passes! out of range!\n"); break; } pass_starts[num_passes] = cnt; /* update pass_marker_offd */ if (num_procs > 1) { #if defined(HYPRE_USING_SYCL) hypreSycl_gather( hypre_ParCSRCommPkgDeviceSendMapElmts(comm_pkg), hypre_ParCSRCommPkgDeviceSendMapElmts(comm_pkg) + num_elem_send, pass_marker, int_buf_data ); #else HYPRE_THRUST_CALL( gather, hypre_ParCSRCommPkgDeviceSendMapElmts(comm_pkg), hypre_ParCSRCommPkgDeviceSendMapElmts(comm_pkg) + num_elem_send, pass_marker, int_buf_data ); #endif #if defined(HYPRE_USING_THRUST_NOSYNC) /* RL: make sure int_buf_data is ready before issuing GPU-GPU MPI */ if (hypre_GetGpuAwareMPI()) { hypre_ForceSyncComputeStream(); } #endif /* create a handle to start communication. 11: for integer */ comm_handle = hypre_ParCSRCommHandleCreate_v2(11, comm_pkg, HYPRE_MEMORY_DEVICE, int_buf_data, HYPRE_MEMORY_DEVICE, pass_marker_offd); /* destroy the handle to finish communication */ hypre_ParCSRCommHandleDestroy(comm_handle); } HYPRE_BigInt old_global_remaining = global_remaining; remaining_big = remaining; hypre_MPI_Allreduce(&remaining_big, &global_remaining, 1, HYPRE_MPI_BIG_INT, hypre_MPI_SUM, comm); /* if the number of remaining points does not change, we have a situation of isolated areas of * fine points that are not connected to any C-points, and the pass generation process breaks * down. Those points can be ignored, i.e. the corresponding rows in P will just be 0 * and can be ignored for the algorithm. */ if (old_global_remaining == global_remaining) { break; } } // while (global_remaining > 0) hypre_TFree(diag_shifts, HYPRE_MEMORY_DEVICE); hypre_TFree(points_left_old, HYPRE_MEMORY_DEVICE); hypre_TFree(int_buf_data, HYPRE_MEMORY_DEVICE); hypre_TFree(points_left, HYPRE_MEMORY_DEVICE); /* generate row sum of weak points and C-points to be ignored */ row_sums = hypre_CTAlloc(HYPRE_Real, n_fine, HYPRE_MEMORY_DEVICE); { dim3 bDim = hypre_GetDefaultDeviceBlockDimension(); dim3 gDim = hypre_GetDefaultDeviceGridDimension(n_fine, "warp", bDim); HYPRE_GPU_LAUNCH( hypreGPUKernel_cfmarker_masked_rowsum, gDim, bDim, n_fine, A_diag_i, A_diag_j, A_diag_data, A_offd_i, A_offd_j, A_offd_data, CF_marker, num_functions > 1 ? dof_func : NULL, num_functions > 1 ? dof_func_offd : NULL, row_sums ); } hypre_GpuProfilingPopRange(); hypre_GpuProfilingPushRange("MultipassPiDevice"); Pi = hypre_CTAlloc(hypre_ParCSRMatrix*, num_passes, HYPRE_MEMORY_HOST); hypre_GenerateMultipassPiDevice(A, S, num_cpts_global, &pass_order[pass_starts[1]], pass_marker, pass_marker_offd, pass_starts[2] - pass_starts[1], 1, row_sums, &Pi[0]); hypre_GpuProfilingPopRange(); if (interp_type == 8) { for (i = 1; i < num_passes - 1; i++) { hypre_GpuProfilingPushRange(std::string("MultipassPiDevice Loop" + std::to_string(i)).c_str()); hypre_ParCSRMatrix *Q; HYPRE_BigInt *c_pts_starts = hypre_ParCSRMatrixRowStarts(Pi[i - 1]); hypre_GenerateMultipassPiDevice(A, S, c_pts_starts, &pass_order[pass_starts[i + 1]], pass_marker, pass_marker_offd, pass_starts[i + 2] - pass_starts[i + 1], i + 1, row_sums, &Q); hypre_GpuProfilingPopRange(); Pi[i] = hypre_ParCSRMatMat(Q, Pi[i - 1]); hypre_ParCSRMatrixDestroy(Q); } } else if (interp_type == 9) { for (i = 1; i < num_passes - 1; i++) { hypre_GpuProfilingPushRange(std::string("MultiPiDevice Loop" + std::to_string(i)).c_str()); HYPRE_BigInt *c_pts_starts = hypre_ParCSRMatrixRowStarts(Pi[i - 1]); hypre_GenerateMultiPiDevice(A, S, Pi[i - 1], c_pts_starts, &pass_order[pass_starts[i + 1]], pass_marker, pass_marker_offd, pass_starts[i + 2] - pass_starts[i + 1], i + 1, num_functions, dof_func, dof_func_offd, &Pi[i] ); hypre_GpuProfilingPopRange(); } } hypre_GpuProfilingPushRange("Section3"); // We don't need the row sums anymore hypre_TFree(row_sums, HYPRE_MEMORY_DEVICE); /* populate P_diag_i/P_offd_i[i] with nnz of i-th row */ for (i = 0; i < num_passes - 1; i++) { HYPRE_Int *Pi_diag_i = hypre_CSRMatrixI(hypre_ParCSRMatrixDiag(Pi[i])); HYPRE_Int *Pi_offd_i = hypre_CSRMatrixI(hypre_ParCSRMatrixOffd(Pi[i])); HYPRE_Int start = pass_starts[i + 1]; HYPRE_Int stop = pass_starts[i + 2]; #if defined(HYPRE_USING_SYCL) HYPRE_ONEDPL_CALL( std::transform, Pi_diag_i + 1, Pi_diag_i + stop - start + 1, Pi_diag_i, oneapi::dpl::make_permutation_iterator( P_diag_i, pass_order + start ), std::minus() ); HYPRE_ONEDPL_CALL( std::transform, Pi_offd_i + 1, Pi_offd_i + stop - start + 1, Pi_offd_i, oneapi::dpl::make_permutation_iterator( P_offd_i, pass_order + start ), std::minus() ); #else HYPRE_THRUST_CALL( transform, thrust::make_zip_iterator(thrust::make_tuple(Pi_diag_i, Pi_offd_i)) + 1, thrust::make_zip_iterator(thrust::make_tuple(Pi_diag_i, Pi_offd_i)) + stop - start + 1, thrust::make_zip_iterator(thrust::make_tuple(Pi_diag_i, Pi_offd_i)), thrust::make_permutation_iterator( thrust::make_zip_iterator(thrust::make_tuple(P_diag_i, P_offd_i)), pass_order + start ), tuple_minus() ); #endif P_diag_size += hypre_CSRMatrixNumNonzeros(hypre_ParCSRMatrixDiag(Pi[i])); P_offd_size += hypre_CSRMatrixNumNonzeros(hypre_ParCSRMatrixOffd(Pi[i])); } #if defined(HYPRE_USING_SYCL) auto zip2 = oneapi::dpl::make_zip_iterator( P_diag_i, P_offd_i ); HYPRE_ONEDPL_CALL( std::exclusive_scan, zip2, zip2 + n_fine + 1, oneapi::dpl::make_zip_iterator(P_diag_i, P_offd_i), std::make_tuple(HYPRE_Int(0), HYPRE_Int(0)), tuple_plus() ); #else HYPRE_THRUST_CALL( exclusive_scan, thrust::make_zip_iterator( thrust::make_tuple(P_diag_i, P_offd_i) ), thrust::make_zip_iterator( thrust::make_tuple(P_diag_i, P_offd_i) ) + n_fine + 1, thrust::make_zip_iterator( thrust::make_tuple(P_diag_i, P_offd_i) ), thrust::make_tuple(HYPRE_Int(0), HYPRE_Int(0)), tuple_plus() ); #endif #ifdef HYPRE_DEBUG { HYPRE_Int tmp; hypre_TMemcpy(&tmp, &P_diag_i[n_fine], HYPRE_Int, 1, HYPRE_MEMORY_HOST, HYPRE_MEMORY_DEVICE); hypre_assert(tmp == P_diag_size); hypre_TMemcpy(&tmp, &P_offd_i[n_fine], HYPRE_Int, 1, HYPRE_MEMORY_HOST, HYPRE_MEMORY_DEVICE); hypre_assert(tmp == P_offd_size); } #endif P_diag_j = hypre_TAlloc(HYPRE_Int, P_diag_size, HYPRE_MEMORY_DEVICE); P_diag_data = hypre_TAlloc(HYPRE_Real, P_diag_size, HYPRE_MEMORY_DEVICE); P_offd_j = hypre_TAlloc(HYPRE_Int, P_offd_size, HYPRE_MEMORY_DEVICE); P_offd_data = hypre_TAlloc(HYPRE_Real, P_offd_size, HYPRE_MEMORY_DEVICE); /* insert weights for coarse points */ { #if defined(HYPRE_USING_SYCL) auto perm1 = oneapi::dpl::make_permutation_iterator( fine_to_coarse, pass_order ); hypreSycl_scatter( perm1, perm1 + pass_starts[1], oneapi::dpl::make_permutation_iterator( P_diag_i, pass_order ), P_diag_j ); auto perm2 = oneapi::dpl::make_permutation_iterator( P_diag_i, pass_order ); auto perm3 = oneapi::dpl::make_permutation_iterator( P_diag_data, perm2 ); HYPRE_ONEDPL_CALL( std::transform, perm3, perm3 + pass_starts[1], perm3, [] (const auto & x) {return 1.0;} ); #else HYPRE_THRUST_CALL( scatter, thrust::make_permutation_iterator( fine_to_coarse, pass_order ), thrust::make_permutation_iterator( fine_to_coarse, pass_order ) + pass_starts[1], thrust::make_permutation_iterator( P_diag_i, pass_order ), P_diag_j ); HYPRE_THRUST_CALL( scatter, thrust::make_constant_iterator(1.0), thrust::make_constant_iterator(1.0) + pass_starts[1], thrust::make_permutation_iterator( P_diag_i, pass_order ), P_diag_data ); #endif } /* generate col_map_offd_P by combining all col_map_offd_Pi * and reompute indices if needed */ /* insert remaining weights */ for (p = 0; p < num_passes - 1; p++) { HYPRE_Int *Pi_diag_i = hypre_CSRMatrixI(hypre_ParCSRMatrixDiag(Pi[p])); HYPRE_Int *Pi_offd_i = hypre_CSRMatrixI(hypre_ParCSRMatrixOffd(Pi[p])); HYPRE_Int *Pi_diag_j = hypre_CSRMatrixJ(hypre_ParCSRMatrixDiag(Pi[p])); HYPRE_Int *Pi_offd_j = hypre_CSRMatrixJ(hypre_ParCSRMatrixOffd(Pi[p])); HYPRE_Real *Pi_diag_data = hypre_CSRMatrixData(hypre_ParCSRMatrixDiag(Pi[p])); HYPRE_Real *Pi_offd_data = hypre_CSRMatrixData(hypre_ParCSRMatrixOffd(Pi[p])); HYPRE_Int num_points = pass_starts[p + 2] - pass_starts[p + 1]; dim3 bDim = hypre_GetDefaultDeviceBlockDimension(); dim3 gDim = hypre_GetDefaultDeviceGridDimension(num_points, "warp", bDim); pass_starts_p1 = pass_starts[p + 1]; pass_starts_p2 = pass_starts[p + 2]; HYPRE_GPU_LAUNCH( hypreGPUKernel_insert_remaining_weights, gDim, bDim, pass_starts_p1, pass_starts_p2, pass_order, Pi_diag_i, Pi_diag_j, Pi_diag_data, P_diag_i, P_diag_j, P_diag_data, Pi_offd_i, Pi_offd_j, Pi_offd_data, P_offd_i, P_offd_j, P_offd_data ); } /* Note that col indices in P_offd_j probably not consistent, this gets fixed after truncation */ P = hypre_ParCSRMatrixCreate(comm, hypre_ParCSRMatrixGlobalNumRows(A), total_global_cpts, hypre_ParCSRMatrixRowStarts(A), num_cpts_global, num_cols_offd_P, P_diag_size, P_offd_size); P_diag = hypre_ParCSRMatrixDiag(P); hypre_CSRMatrixData(P_diag) = P_diag_data; hypre_CSRMatrixI(P_diag) = P_diag_i; hypre_CSRMatrixJ(P_diag) = P_diag_j; P_offd = hypre_ParCSRMatrixOffd(P); hypre_CSRMatrixData(P_offd) = P_offd_data; hypre_CSRMatrixI(P_offd) = P_offd_i; hypre_CSRMatrixJ(P_offd) = P_offd_j; /* Compress P, removing coefficients smaller than trunc_factor * Max */ if (trunc_factor != 0.0 || P_max_elmts > 0) { hypre_BoomerAMGInterpTruncationDevice(P, trunc_factor, P_max_elmts); P_diag_data = hypre_CSRMatrixData(P_diag); P_diag_i = hypre_CSRMatrixI(P_diag); P_diag_j = hypre_CSRMatrixJ(P_diag); P_offd_data = hypre_CSRMatrixData(P_offd); P_offd_i = hypre_CSRMatrixI(P_offd); P_offd_j = hypre_CSRMatrixJ(P_offd); P_offd_size = hypre_CSRMatrixNumNonzeros(P_offd); } hypre_GpuProfilingPopRange(); num_cols_offd_P = 0; if (P_offd_size) { hypre_GpuProfilingPushRange("Section4"); HYPRE_BigInt *big_P_offd_j = hypre_TAlloc(HYPRE_BigInt, P_offd_size, HYPRE_MEMORY_DEVICE); for (p = 0; p < num_passes - 1; p++) { HYPRE_BigInt *col_map_offd_Pi = hypre_ParCSRMatrixDeviceColMapOffd(Pi[p]); HYPRE_Int npoints = pass_starts[p + 2] - pass_starts[p + 1]; dim3 bDim = hypre_GetDefaultDeviceBlockDimension(); dim3 gDim = hypre_GetDefaultDeviceGridDimension(npoints, "warp", bDim); pass_starts_p1 = pass_starts[p + 1]; pass_starts_p2 = pass_starts[p + 2]; HYPRE_GPU_LAUNCH( hypreGPUKernel_populate_big_P_offd_j, gDim, bDim, pass_starts_p1, pass_starts_p2, pass_order, P_offd_i, P_offd_j, col_map_offd_Pi, big_P_offd_j ); } // end num_passes for loop HYPRE_BigInt *tmp_P_offd_j = hypre_TAlloc(HYPRE_BigInt, P_offd_size, HYPRE_MEMORY_DEVICE); hypre_TMemcpy(tmp_P_offd_j, big_P_offd_j, HYPRE_BigInt, P_offd_size, HYPRE_MEMORY_DEVICE, HYPRE_MEMORY_DEVICE); #if defined(HYPRE_USING_SYCL) HYPRE_ONEDPL_CALL( std::sort, tmp_P_offd_j, tmp_P_offd_j + P_offd_size ); HYPRE_BigInt *new_end = HYPRE_ONEDPL_CALL( std::unique, tmp_P_offd_j, tmp_P_offd_j + P_offd_size ); #else HYPRE_THRUST_CALL( sort, tmp_P_offd_j, tmp_P_offd_j + P_offd_size ); HYPRE_BigInt *new_end = HYPRE_THRUST_CALL( unique, tmp_P_offd_j, tmp_P_offd_j + P_offd_size ); #endif num_cols_offd_P = new_end - tmp_P_offd_j; col_map_offd_P = hypre_TAlloc(HYPRE_BigInt, num_cols_offd_P, HYPRE_MEMORY_DEVICE); hypre_TMemcpy(col_map_offd_P, tmp_P_offd_j, HYPRE_BigInt, num_cols_offd_P, HYPRE_MEMORY_DEVICE, HYPRE_MEMORY_DEVICE); hypre_TFree(tmp_P_offd_j, HYPRE_MEMORY_DEVICE); // PB: It seems we still need this on the host?? col_map_offd_P_host = hypre_TAlloc(HYPRE_BigInt, num_cols_offd_P, HYPRE_MEMORY_HOST); hypre_TMemcpy(col_map_offd_P_host, col_map_offd_P, HYPRE_BigInt, num_cols_offd_P, HYPRE_MEMORY_HOST, HYPRE_MEMORY_DEVICE); #if defined(HYPRE_USING_SYCL) HYPRE_ONEDPL_CALL( oneapi::dpl::lower_bound, col_map_offd_P, col_map_offd_P + num_cols_offd_P, big_P_offd_j, big_P_offd_j + P_offd_size, P_offd_j ); #else HYPRE_THRUST_CALL( lower_bound, col_map_offd_P, col_map_offd_P + num_cols_offd_P, big_P_offd_j, big_P_offd_j + P_offd_size, P_offd_j ); #endif hypre_TFree(big_P_offd_j, HYPRE_MEMORY_DEVICE); hypre_GpuProfilingPopRange(); } // if (P_offd_size) hypre_GpuProfilingPushRange("Section5"); hypre_ParCSRMatrixColMapOffd(P) = col_map_offd_P_host; hypre_ParCSRMatrixDeviceColMapOffd(P) = col_map_offd_P; hypre_CSRMatrixNumCols(P_offd) = num_cols_offd_P; hypre_CSRMatrixMemoryLocation(P_diag) = HYPRE_MEMORY_DEVICE; hypre_CSRMatrixMemoryLocation(P_offd) = HYPRE_MEMORY_DEVICE; hypre_MatvecCommPkgCreate(P); for (i = 0; i < num_passes - 1; i++) { hypre_ParCSRMatrixDestroy(Pi[i]); } hypre_TFree(Pi, HYPRE_MEMORY_HOST); hypre_TFree(dof_func_offd, HYPRE_MEMORY_DEVICE); hypre_TFree(pass_starts, HYPRE_MEMORY_HOST); hypre_TFree(pass_marker, HYPRE_MEMORY_DEVICE); hypre_TFree(pass_marker_offd, HYPRE_MEMORY_DEVICE); hypre_TFree(pass_order, HYPRE_MEMORY_DEVICE); hypre_TFree(fine_to_coarse, HYPRE_MEMORY_DEVICE); #if defined(HYPRE_USING_SYCL) HYPRE_ONEDPL_CALL( std::replace_if, CF_marker, CF_marker + n_fine, equal(-3), static_cast(-1) ); #else HYPRE_THRUST_CALL( replace_if, CF_marker, CF_marker + n_fine, equal(-3), static_cast(-1) ); #endif *P_ptr = P; hypre_GpuProfilingPopRange(); return hypre_error_flag; } HYPRE_Int hypre_GenerateMultipassPiDevice( hypre_ParCSRMatrix *A, hypre_ParCSRMatrix *S, HYPRE_BigInt *c_pts_starts, HYPRE_Int *pass_order, HYPRE_Int *pass_marker, HYPRE_Int *pass_marker_offd, HYPRE_Int num_points, /* |F| */ HYPRE_Int color, /* C-color */ HYPRE_Real *row_sums, hypre_ParCSRMatrix **P_ptr) { MPI_Comm comm = hypre_ParCSRMatrixComm(A); hypre_ParCSRCommPkg *comm_pkg = hypre_ParCSRMatrixCommPkg(A); hypre_ParCSRCommHandle *comm_handle; hypre_CSRMatrix *A_diag = hypre_ParCSRMatrixDiag(A); HYPRE_Real *A_diag_data = hypre_CSRMatrixData(A_diag); HYPRE_Int *A_diag_i = hypre_CSRMatrixI(A_diag); HYPRE_Int *A_diag_j = hypre_CSRMatrixJ(A_diag); HYPRE_Int n_fine = hypre_CSRMatrixNumRows(A_diag); hypre_CSRMatrix *A_offd = hypre_ParCSRMatrixOffd(A); HYPRE_Int *A_offd_i = hypre_CSRMatrixI(A_offd); HYPRE_Int *A_offd_j = hypre_CSRMatrixJ(A_offd); HYPRE_Real *A_offd_data = hypre_CSRMatrixData(A_offd); HYPRE_Int num_cols_offd_A = hypre_CSRMatrixNumCols(A_offd); hypre_CSRMatrix *S_diag = hypre_ParCSRMatrixDiag(S); HYPRE_Int *S_diag_i = hypre_CSRMatrixI(S_diag); HYPRE_Int *S_diag_j = hypre_CSRMatrixJ(S_diag); hypre_CSRMatrix *S_offd = hypre_ParCSRMatrixOffd(S); HYPRE_Int *S_offd_i = hypre_CSRMatrixI(S_offd); HYPRE_Int *S_offd_j = hypre_CSRMatrixJ(S_offd); HYPRE_Int *Soc_diag_j = hypre_ParCSRMatrixSocDiagJ(S); HYPRE_Int *Soc_offd_j = hypre_ParCSRMatrixSocOffdJ(S); HYPRE_BigInt *col_map_offd_P = NULL; HYPRE_BigInt *col_map_offd_P_dev = NULL; HYPRE_Int num_cols_offd_P; HYPRE_Int nnz_diag, nnz_offd; hypre_ParCSRMatrix *P; hypre_CSRMatrix *P_diag; HYPRE_Real *P_diag_data; HYPRE_Int *P_diag_i; /*at first counter of nonzero cols for each row, finally will be pointer to start of row */ HYPRE_Int *P_diag_j; hypre_CSRMatrix *P_offd; HYPRE_Real *P_offd_data = NULL; HYPRE_Int *P_offd_i; /*at first counter of nonzero cols for each row, finally will be pointer to start of row */ HYPRE_Int *P_offd_j = NULL; HYPRE_Int *fine_to_coarse; HYPRE_Int *fine_to_coarse_offd = NULL; HYPRE_BigInt f_pts_starts[2]; HYPRE_Int my_id, num_procs; HYPRE_BigInt total_global_fpts; HYPRE_BigInt total_global_cpts; HYPRE_BigInt *big_convert_offd = NULL; HYPRE_BigInt *big_buf_data = NULL; /* MPI size and rank*/ hypre_MPI_Comm_size(comm, &num_procs); hypre_MPI_Comm_rank(comm, &my_id); fine_to_coarse = hypre_TAlloc(HYPRE_Int, n_fine, HYPRE_MEMORY_DEVICE); hypre_modmp_init_fine_to_coarse(n_fine, pass_marker, color, fine_to_coarse); if (num_procs > 1) { HYPRE_BigInt big_Fpts = num_points; hypre_MPI_Scan(&big_Fpts, f_pts_starts + 1, 1, HYPRE_MPI_BIG_INT, hypre_MPI_SUM, comm); f_pts_starts[0] = f_pts_starts[1] - big_Fpts; if (my_id == num_procs - 1) { total_global_fpts = f_pts_starts[1]; total_global_cpts = c_pts_starts[1]; } hypre_MPI_Bcast(&total_global_fpts, 1, HYPRE_MPI_BIG_INT, num_procs - 1, comm); hypre_MPI_Bcast(&total_global_cpts, 1, HYPRE_MPI_BIG_INT, num_procs - 1, comm); } else { f_pts_starts[0] = 0; f_pts_starts[1] = num_points; total_global_fpts = f_pts_starts[1]; total_global_cpts = c_pts_starts[1]; } num_cols_offd_P = 0; if (num_procs > 1) { HYPRE_Int num_sends = hypre_ParCSRCommPkgNumSends(comm_pkg); HYPRE_Int num_elem_send = hypre_ParCSRCommPkgSendMapStart(comm_pkg, num_sends); big_convert_offd = hypre_TAlloc(HYPRE_BigInt, num_cols_offd_A, HYPRE_MEMORY_DEVICE); big_buf_data = hypre_TAlloc(HYPRE_BigInt, num_elem_send, HYPRE_MEMORY_DEVICE); globalC_functor functor(c_pts_starts[0]); #if defined(HYPRE_USING_SYCL) hypreSycl_gather( hypre_ParCSRCommPkgDeviceSendMapElmts(comm_pkg), hypre_ParCSRCommPkgDeviceSendMapElmts(comm_pkg) + num_elem_send, oneapi::dpl::make_transform_iterator(fine_to_coarse, functor), big_buf_data ); #else HYPRE_THRUST_CALL( gather, hypre_ParCSRCommPkgDeviceSendMapElmts(comm_pkg), hypre_ParCSRCommPkgDeviceSendMapElmts(comm_pkg) + num_elem_send, thrust::make_transform_iterator(fine_to_coarse, functor), big_buf_data ); #endif #if defined(HYPRE_USING_THRUST_NOSYNC) /* RL: make sure big_buf_data is ready before issuing GPU-GPU MPI */ if (hypre_GetGpuAwareMPI()) { hypre_ForceSyncComputeStream(); } #endif comm_handle = hypre_ParCSRCommHandleCreate_v2(21, comm_pkg, HYPRE_MEMORY_DEVICE, big_buf_data, HYPRE_MEMORY_DEVICE, big_convert_offd); hypre_ParCSRCommHandleDestroy(comm_handle); // This will allocate fine_to_coarse_offd hypre_modmp_compute_num_cols_offd_fine_to_coarse( pass_marker_offd, color, num_cols_offd_A, num_cols_offd_P, &fine_to_coarse_offd ); //FIXME: Clean this up when we don't need the host pointer anymore col_map_offd_P = hypre_TAlloc(HYPRE_BigInt, num_cols_offd_P, HYPRE_MEMORY_HOST); col_map_offd_P_dev = hypre_TAlloc(HYPRE_BigInt, num_cols_offd_P, HYPRE_MEMORY_DEVICE); #if defined(HYPRE_USING_SYCL) HYPRE_BigInt *col_map_end = hypreSycl_copy_if( big_convert_offd, big_convert_offd + num_cols_offd_A, pass_marker_offd, col_map_offd_P_dev, equal(color) ); #else HYPRE_BigInt *col_map_end = HYPRE_THRUST_CALL( copy_if, big_convert_offd, big_convert_offd + num_cols_offd_A, pass_marker_offd, col_map_offd_P_dev, equal(color) ); #endif hypre_assert(num_cols_offd_P == col_map_end - col_map_offd_P_dev); //FIXME: Clean this up when we don't need the host pointer anymore hypre_TMemcpy(col_map_offd_P, col_map_offd_P_dev, HYPRE_BigInt, num_cols_offd_P, HYPRE_MEMORY_HOST, HYPRE_MEMORY_DEVICE); hypre_TFree(big_convert_offd, HYPRE_MEMORY_DEVICE); hypre_TFree(big_buf_data, HYPRE_MEMORY_DEVICE); } P_diag_i = hypre_TAlloc(HYPRE_Int, num_points + 1, HYPRE_MEMORY_DEVICE); P_offd_i = hypre_TAlloc(HYPRE_Int, num_points + 1, HYPRE_MEMORY_DEVICE); /* generate P_diag_i and P_offd_i */ { dim3 bDim = hypre_GetDefaultDeviceBlockDimension(); dim3 gDim = hypre_GetDefaultDeviceGridDimension(num_points, "warp", bDim); HYPRE_GPU_LAUNCH( hypreGPUKernel_generate_Pdiag_i_Poffd_i, gDim, bDim, num_points, color, pass_order, pass_marker, pass_marker_offd, S_diag_i, S_diag_j, S_offd_i, S_offd_j, P_diag_i, P_offd_i ); hypre_Memset(P_diag_i + num_points, 0, sizeof(HYPRE_Int), HYPRE_MEMORY_DEVICE); hypre_Memset(P_offd_i + num_points, 0, sizeof(HYPRE_Int), HYPRE_MEMORY_DEVICE); #if defined(HYPRE_USING_SYCL) auto zip3 = oneapi::dpl::make_zip_iterator( P_diag_i, P_offd_i ); HYPRE_ONEDPL_CALL( std::exclusive_scan, zip3, zip3 + num_points + 1, oneapi::dpl::make_zip_iterator( P_diag_i, P_offd_i ), std::make_tuple(HYPRE_Int(0), HYPRE_Int(0)), tuple_plus() ); #else HYPRE_THRUST_CALL( exclusive_scan, thrust::make_zip_iterator( thrust::make_tuple(P_diag_i, P_offd_i) ), thrust::make_zip_iterator( thrust::make_tuple(P_diag_i, P_offd_i) ) + num_points + 1, thrust::make_zip_iterator( thrust::make_tuple(P_diag_i, P_offd_i) ), thrust::make_tuple(HYPRE_Int(0), HYPRE_Int(0)), tuple_plus() ); #endif hypre_TMemcpy(&nnz_diag, &P_diag_i[num_points], HYPRE_Int, 1, HYPRE_MEMORY_HOST, HYPRE_MEMORY_DEVICE); hypre_TMemcpy(&nnz_offd, &P_offd_i[num_points], HYPRE_Int, 1, HYPRE_MEMORY_HOST, HYPRE_MEMORY_DEVICE); } /* generate P_diag_j/data and P_offd_j/data */ P_diag_j = hypre_TAlloc(HYPRE_Int, nnz_diag, HYPRE_MEMORY_DEVICE); P_diag_data = hypre_TAlloc(HYPRE_Real, nnz_diag, HYPRE_MEMORY_DEVICE); P_offd_j = hypre_TAlloc(HYPRE_Int, nnz_offd, HYPRE_MEMORY_DEVICE); P_offd_data = hypre_TAlloc(HYPRE_Real, nnz_offd, HYPRE_MEMORY_DEVICE); { dim3 bDim = hypre_GetDefaultDeviceBlockDimension(); dim3 gDim = hypre_GetDefaultDeviceGridDimension(num_points, "warp", bDim); HYPRE_GPU_LAUNCH( hypreGPUKernel_generate_Pdiag_j_Poffd_j, gDim, bDim, num_points, color, pass_order, pass_marker, pass_marker_offd, fine_to_coarse, fine_to_coarse_offd, A_diag_i, A_diag_j, A_diag_data, A_offd_i, A_offd_j, A_offd_data, Soc_diag_j, Soc_offd_j, P_diag_i, P_offd_i, P_diag_j, P_diag_data, P_offd_j, P_offd_data, row_sums ); } hypre_TFree(fine_to_coarse, HYPRE_MEMORY_DEVICE); hypre_TFree(fine_to_coarse_offd, HYPRE_MEMORY_DEVICE); P = hypre_ParCSRMatrixCreate(comm, total_global_fpts, total_global_cpts, f_pts_starts, c_pts_starts, num_cols_offd_P, nnz_diag, nnz_offd); P_diag = hypre_ParCSRMatrixDiag(P); hypre_CSRMatrixData(P_diag) = P_diag_data; hypre_CSRMatrixI(P_diag) = P_diag_i; hypre_CSRMatrixJ(P_diag) = P_diag_j; P_offd = hypre_ParCSRMatrixOffd(P); hypre_CSRMatrixData(P_offd) = P_offd_data; hypre_CSRMatrixI(P_offd) = P_offd_i; hypre_CSRMatrixJ(P_offd) = P_offd_j; hypre_ParCSRMatrixColMapOffd(P) = col_map_offd_P; hypre_ParCSRMatrixDeviceColMapOffd(P) = col_map_offd_P_dev; hypre_CSRMatrixMemoryLocation(P_diag) = HYPRE_MEMORY_DEVICE; hypre_CSRMatrixMemoryLocation(P_offd) = HYPRE_MEMORY_DEVICE; hypre_MatvecCommPkgCreate(P); *P_ptr = P; return hypre_error_flag; } HYPRE_Int hypre_GenerateMultiPiDevice( hypre_ParCSRMatrix *A, hypre_ParCSRMatrix *S, hypre_ParCSRMatrix *P, HYPRE_BigInt *c_pts_starts, HYPRE_Int *pass_order, HYPRE_Int *pass_marker, HYPRE_Int *pass_marker_offd, HYPRE_Int num_points, HYPRE_Int color, HYPRE_Int num_functions, HYPRE_Int *dof_func, HYPRE_Int *dof_func_offd, hypre_ParCSRMatrix **Pi_ptr ) { MPI_Comm comm = hypre_ParCSRMatrixComm(A); hypre_ParCSRCommPkg *comm_pkg = hypre_ParCSRMatrixCommPkg(A); hypre_ParCSRCommHandle *comm_handle; hypre_CSRMatrix *A_diag = hypre_ParCSRMatrixDiag(A); HYPRE_Real *A_diag_data = hypre_CSRMatrixData(A_diag); HYPRE_Int *A_diag_i = hypre_CSRMatrixI(A_diag); HYPRE_Int *A_diag_j = hypre_CSRMatrixJ(A_diag); HYPRE_Int n_fine = hypre_CSRMatrixNumRows(A_diag); hypre_CSRMatrix *A_offd = hypre_ParCSRMatrixOffd(A); HYPRE_Int *A_offd_i = hypre_CSRMatrixI(A_offd); HYPRE_Int *A_offd_j = hypre_CSRMatrixJ(A_offd); HYPRE_Real *A_offd_data = hypre_CSRMatrixData(A_offd); HYPRE_Int num_cols_offd_A = hypre_CSRMatrixNumCols(A_offd); hypre_CSRMatrix *S_diag = hypre_ParCSRMatrixDiag(S); HYPRE_Int *S_diag_i = hypre_CSRMatrixI(S_diag); HYPRE_Int *S_diag_j = hypre_CSRMatrixJ(S_diag); hypre_CSRMatrix *S_offd = hypre_ParCSRMatrixOffd(S); HYPRE_Int *S_offd_i = hypre_CSRMatrixI(S_offd); HYPRE_Int *S_offd_j = hypre_CSRMatrixJ(S_offd); HYPRE_Int *Soc_diag_j = hypre_ParCSRMatrixSocDiagJ(S); HYPRE_Int *Soc_offd_j = hypre_ParCSRMatrixSocOffdJ(S); HYPRE_BigInt *col_map_offd_Q = NULL; HYPRE_BigInt *col_map_offd_Q_dev = NULL; HYPRE_Int num_cols_offd_Q; hypre_ParCSRMatrix *Pi; hypre_CSRMatrix *Pi_diag; HYPRE_Int *Pi_diag_i; HYPRE_Real *Pi_diag_data; hypre_CSRMatrix *Pi_offd; HYPRE_Int *Pi_offd_i; HYPRE_Real *Pi_offd_data; HYPRE_Int nnz_diag, nnz_offd; hypre_ParCSRMatrix *Q; hypre_CSRMatrix *Q_diag; HYPRE_Real *Q_diag_data; HYPRE_Int *Q_diag_i; /*at first counter of nonzero cols for each row, finally will be pointer to start of row */ HYPRE_Int *Q_diag_j; hypre_CSRMatrix *Q_offd; HYPRE_Real *Q_offd_data = NULL; HYPRE_Int *Q_offd_i; /*at first counter of nonzero cols for each row, finally will be pointer to start of row */ HYPRE_Int *Q_offd_j = NULL; HYPRE_Int *fine_to_coarse; HYPRE_Int *fine_to_coarse_offd = NULL; HYPRE_BigInt f_pts_starts[2]; HYPRE_Int my_id, num_procs; HYPRE_BigInt total_global_fpts; HYPRE_BigInt total_global_cpts; HYPRE_BigInt *big_convert_offd = NULL; HYPRE_BigInt *big_buf_data = NULL; HYPRE_Real *w_row_sum; /* MPI size and rank*/ hypre_MPI_Comm_size(comm, &num_procs); hypre_MPI_Comm_rank(comm, &my_id); fine_to_coarse = hypre_TAlloc(HYPRE_Int, n_fine, HYPRE_MEMORY_DEVICE); hypre_modmp_init_fine_to_coarse(n_fine, pass_marker, color, fine_to_coarse); if (num_procs > 1) { HYPRE_BigInt big_Fpts = num_points; hypre_MPI_Scan(&big_Fpts, f_pts_starts + 1, 1, HYPRE_MPI_BIG_INT, hypre_MPI_SUM, comm); f_pts_starts[0] = f_pts_starts[1] - big_Fpts; if (my_id == num_procs - 1) { total_global_fpts = f_pts_starts[1]; total_global_cpts = c_pts_starts[1]; } hypre_MPI_Bcast(&total_global_fpts, 1, HYPRE_MPI_BIG_INT, num_procs - 1, comm); hypre_MPI_Bcast(&total_global_cpts, 1, HYPRE_MPI_BIG_INT, num_procs - 1, comm); } else { f_pts_starts[0] = 0; f_pts_starts[1] = num_points; total_global_fpts = f_pts_starts[1]; total_global_cpts = c_pts_starts[1]; } num_cols_offd_Q = 0; if (num_procs > 1) { HYPRE_Int num_sends = hypre_ParCSRCommPkgNumSends(comm_pkg); HYPRE_Int num_elem_send = hypre_ParCSRCommPkgSendMapStart(comm_pkg, num_sends); big_convert_offd = hypre_TAlloc(HYPRE_BigInt, num_cols_offd_A, HYPRE_MEMORY_DEVICE); big_buf_data = hypre_TAlloc(HYPRE_BigInt, num_elem_send, HYPRE_MEMORY_DEVICE); globalC_functor functor(c_pts_starts[0]); #if defined(HYPRE_USING_SYCL) hypreSycl_gather( hypre_ParCSRCommPkgDeviceSendMapElmts(comm_pkg), hypre_ParCSRCommPkgDeviceSendMapElmts(comm_pkg) + num_elem_send, oneapi::dpl::make_transform_iterator(fine_to_coarse, functor), big_buf_data ); #else HYPRE_THRUST_CALL( gather, hypre_ParCSRCommPkgDeviceSendMapElmts(comm_pkg), hypre_ParCSRCommPkgDeviceSendMapElmts(comm_pkg) + num_elem_send, thrust::make_transform_iterator(fine_to_coarse, functor), big_buf_data ); #endif #if defined(HYPRE_USING_THRUST_NOSYNC) /* RL: make sure big_buf_data is ready before issuing GPU-GPU MPI */ if (hypre_GetGpuAwareMPI()) { hypre_ForceSyncComputeStream(); } #endif comm_handle = hypre_ParCSRCommHandleCreate_v2(21, comm_pkg, HYPRE_MEMORY_DEVICE, big_buf_data, HYPRE_MEMORY_DEVICE, big_convert_offd); hypre_ParCSRCommHandleDestroy(comm_handle); // This will allocate fine_to_coarse_offd_dev hypre_modmp_compute_num_cols_offd_fine_to_coarse( pass_marker_offd, color, num_cols_offd_A, num_cols_offd_Q, &fine_to_coarse_offd ); //FIXME: PB: It seems we need the host value too?!?! col_map_offd_Q = hypre_TAlloc(HYPRE_BigInt, num_cols_offd_Q, HYPRE_MEMORY_HOST); col_map_offd_Q_dev = hypre_TAlloc(HYPRE_BigInt, num_cols_offd_Q, HYPRE_MEMORY_DEVICE); #if defined(HYPRE_USING_SYCL) HYPRE_BigInt *col_map_end = hypreSycl_copy_if( big_convert_offd, big_convert_offd + num_cols_offd_A, pass_marker_offd, col_map_offd_Q_dev, equal(color) ); #else HYPRE_BigInt *col_map_end = HYPRE_THRUST_CALL( copy_if, big_convert_offd, big_convert_offd + num_cols_offd_A, pass_marker_offd, col_map_offd_Q_dev, equal(color) ); #endif hypre_assert(num_cols_offd_Q == col_map_end - col_map_offd_Q_dev); //FIXME: PB: It seems like we're required to have a host version of this?? hypre_TMemcpy(col_map_offd_Q, col_map_offd_Q_dev, HYPRE_BigInt, num_cols_offd_Q, HYPRE_MEMORY_HOST, HYPRE_MEMORY_DEVICE); hypre_TFree(big_convert_offd, HYPRE_MEMORY_DEVICE ); hypre_TFree(big_buf_data, HYPRE_MEMORY_DEVICE); } Q_diag_i = hypre_TAlloc(HYPRE_Int, num_points + 1, HYPRE_MEMORY_DEVICE); Q_offd_i = hypre_TAlloc(HYPRE_Int, num_points + 1, HYPRE_MEMORY_DEVICE); /* generate Q_diag_i and Q_offd_i */ { dim3 bDim = hypre_GetDefaultDeviceBlockDimension(); dim3 gDim = hypre_GetDefaultDeviceGridDimension(num_points, "warp", bDim); HYPRE_GPU_LAUNCH( hypreGPUKernel_generate_Pdiag_i_Poffd_i, gDim, bDim, num_points, color, pass_order, pass_marker, pass_marker_offd, S_diag_i, S_diag_j, S_offd_i, S_offd_j, Q_diag_i, Q_offd_i ); hypre_Memset(Q_diag_i + num_points, 0, sizeof(HYPRE_Int), HYPRE_MEMORY_DEVICE); hypre_Memset(Q_offd_i + num_points, 0, sizeof(HYPRE_Int), HYPRE_MEMORY_DEVICE); #if defined(HYPRE_USING_SYCL) auto zip4 = oneapi::dpl::make_zip_iterator( Q_diag_i, Q_offd_i ); HYPRE_ONEDPL_CALL( std::exclusive_scan, zip4, zip4 + num_points + 1, oneapi::dpl::make_zip_iterator( Q_diag_i, Q_offd_i ), std::make_tuple(HYPRE_Int(0), HYPRE_Int(0)), tuple_plus() ); #else HYPRE_THRUST_CALL( exclusive_scan, thrust::make_zip_iterator( thrust::make_tuple(Q_diag_i, Q_offd_i) ), thrust::make_zip_iterator( thrust::make_tuple(Q_diag_i, Q_offd_i) ) + num_points + 1, thrust::make_zip_iterator( thrust::make_tuple(Q_diag_i, Q_offd_i) ), thrust::make_tuple(HYPRE_Int(0), HYPRE_Int(0)), tuple_plus() ); #endif hypre_TMemcpy(&nnz_diag, &Q_diag_i[num_points], HYPRE_Int, 1, HYPRE_MEMORY_HOST, HYPRE_MEMORY_DEVICE); hypre_TMemcpy(&nnz_offd, &Q_offd_i[num_points], HYPRE_Int, 1, HYPRE_MEMORY_HOST, HYPRE_MEMORY_DEVICE); } /* generate P_diag_j/data and P_offd_j/data */ Q_diag_j = hypre_TAlloc(HYPRE_Int, nnz_diag, HYPRE_MEMORY_DEVICE); Q_diag_data = hypre_TAlloc(HYPRE_Real, nnz_diag, HYPRE_MEMORY_DEVICE); Q_offd_j = hypre_TAlloc(HYPRE_Int, nnz_offd, HYPRE_MEMORY_DEVICE); Q_offd_data = hypre_TAlloc(HYPRE_Real, nnz_offd, HYPRE_MEMORY_DEVICE); w_row_sum = hypre_TAlloc(HYPRE_Real, num_points, HYPRE_MEMORY_DEVICE); { dim3 bDim = hypre_GetDefaultDeviceBlockDimension(); dim3 gDim = hypre_GetDefaultDeviceGridDimension(num_points, "warp", bDim); HYPRE_GPU_LAUNCH( hypreGPUKernel_generate_Qdiag_j_Qoffd_j, gDim, bDim, num_points, color, pass_order, pass_marker, pass_marker_offd, fine_to_coarse, fine_to_coarse_offd, A_diag_i, A_diag_j, A_diag_data, A_offd_i, A_offd_j, A_offd_data, Soc_diag_j, Soc_offd_j, Q_diag_i, Q_offd_i, Q_diag_j, Q_diag_data, Q_offd_j, Q_offd_data, w_row_sum, num_functions, dof_func, dof_func_offd ); } hypre_TFree(fine_to_coarse, HYPRE_MEMORY_DEVICE); hypre_TFree(fine_to_coarse_offd, HYPRE_MEMORY_DEVICE); Q = hypre_ParCSRMatrixCreate(comm, total_global_fpts, total_global_cpts, f_pts_starts, c_pts_starts, num_cols_offd_Q, nnz_diag, nnz_offd); Q_diag = hypre_ParCSRMatrixDiag(Q); hypre_CSRMatrixData(Q_diag) = Q_diag_data; hypre_CSRMatrixI(Q_diag) = Q_diag_i; hypre_CSRMatrixJ(Q_diag) = Q_diag_j; Q_offd = hypre_ParCSRMatrixOffd(Q); hypre_CSRMatrixData(Q_offd) = Q_offd_data; hypre_CSRMatrixI(Q_offd) = Q_offd_i; hypre_CSRMatrixJ(Q_offd) = Q_offd_j; hypre_ParCSRMatrixColMapOffd(Q) = col_map_offd_Q; hypre_ParCSRMatrixDeviceColMapOffd(Q) = col_map_offd_Q_dev; hypre_CSRMatrixMemoryLocation(Q_diag) = HYPRE_MEMORY_DEVICE; hypre_CSRMatrixMemoryLocation(Q_offd) = HYPRE_MEMORY_DEVICE; hypre_MatvecCommPkgCreate(Q); Pi = hypre_ParCSRMatMat(Q, P); Pi_diag = hypre_ParCSRMatrixDiag(Pi); Pi_diag_data = hypre_CSRMatrixData(Pi_diag); Pi_diag_i = hypre_CSRMatrixI(Pi_diag); Pi_offd = hypre_ParCSRMatrixOffd(Pi); Pi_offd_data = hypre_CSRMatrixData(Pi_offd); Pi_offd_i = hypre_CSRMatrixI(Pi_offd); { dim3 bDim = hypre_GetDefaultDeviceBlockDimension(); dim3 gDim = hypre_GetDefaultDeviceGridDimension(num_points, "warp", bDim); HYPRE_GPU_LAUNCH( hypreGPUKernel_mutli_pi_rowsum, gDim, bDim, num_points, pass_order, A_diag_i, A_diag_data, Pi_diag_i, Pi_diag_data, Pi_offd_i, Pi_offd_data, w_row_sum ); } hypre_TFree(w_row_sum, HYPRE_MEMORY_DEVICE); hypre_ParCSRMatrixDestroy(Q); *Pi_ptr = Pi; return hypre_error_flag; } void hypre_modmp_init_fine_to_coarse( HYPRE_Int n_fine, HYPRE_Int *pass_marker, HYPRE_Int color, HYPRE_Int *fine_to_coarse ) { // n_fine == pass_marker.size() // Host code this is replacing: // n_cpts = 0; // for (HYPRE_Int i=0; i < n_fine; i++) // { // if (pass_marker[i] == color) // fine_to_coarse[i] = n_cpts++; // else // fine_to_coarse[i] = -1; // } if (n_fine == 0) { return; } #if defined(HYPRE_USING_SYCL) HYPRE_ONEDPL_CALL( std::exclusive_scan, oneapi::dpl::make_transform_iterator(pass_marker, equal(color)), oneapi::dpl::make_transform_iterator(pass_marker + n_fine, equal(color)), fine_to_coarse, HYPRE_Int(0) ); hypreSycl_transform_if( fine_to_coarse, fine_to_coarse + n_fine, pass_marker, fine_to_coarse, [] (const auto & x) {return -1;}, [color = color] (const auto & x) {return x != color;} ); #else HYPRE_THRUST_CALL( exclusive_scan, thrust::make_transform_iterator(pass_marker, equal(color)), thrust::make_transform_iterator(pass_marker + n_fine, equal(color)), fine_to_coarse, HYPRE_Int(0) ); HYPRE_THRUST_CALL( replace_if, fine_to_coarse, fine_to_coarse + n_fine, pass_marker, HYPRE_THRUST_NOT(equal(color)), -1 ); #endif } void hypre_modmp_compute_num_cols_offd_fine_to_coarse( HYPRE_Int *pass_marker_offd, HYPRE_Int color, HYPRE_Int num_cols_offd_A, HYPRE_Int &num_cols_offd, HYPRE_Int **fine_to_coarse_offd_ptr ) { // We allocate with a "+1" because the host version of this code incremented the counter // even on the last match, so we create an extra entry the exclusive_scan will reflect this // and we can read off the last entry and only do 1 kernel call and 1 memcpy // RL: this trick requires pass_marker_offd has 1 more space allocated too HYPRE_Int *fine_to_coarse_offd = hypre_TAlloc(HYPRE_Int, num_cols_offd_A + 1, HYPRE_MEMORY_DEVICE); #if defined(HYPRE_USING_SYCL) HYPRE_ONEDPL_CALL( std::exclusive_scan, oneapi::dpl::make_transform_iterator(pass_marker_offd, equal(color)), oneapi::dpl::make_transform_iterator(pass_marker_offd + num_cols_offd_A + 1, equal(color)), fine_to_coarse_offd, HYPRE_Int(0) ); #else HYPRE_THRUST_CALL( exclusive_scan, thrust::make_transform_iterator(pass_marker_offd, equal(color)), thrust::make_transform_iterator(pass_marker_offd + num_cols_offd_A + 1, equal(color)), fine_to_coarse_offd, HYPRE_Int(0) ); #endif hypre_TMemcpy( &num_cols_offd, fine_to_coarse_offd + num_cols_offd_A, HYPRE_Int, 1, HYPRE_MEMORY_HOST, HYPRE_MEMORY_DEVICE); *fine_to_coarse_offd_ptr = fine_to_coarse_offd; } __global__ void hypreGPUKernel_cfmarker_masked_rowsum( hypre_DeviceItem &item, HYPRE_Int nrows, HYPRE_Int *A_diag_i, HYPRE_Int *A_diag_j, HYPRE_Complex *A_diag_data, HYPRE_Int *A_offd_i, HYPRE_Int *A_offd_j, HYPRE_Complex *A_offd_data, HYPRE_Int *CF_marker, HYPRE_Int *dof_func, HYPRE_Int *dof_func_offd, HYPRE_Complex *row_sums ) { HYPRE_Int row_i = hypre_gpu_get_grid_warp_id<1, 1>(item); if (row_i >= nrows || read_only_load(&CF_marker[row_i]) >= 0) { return; } HYPRE_Int lane = hypre_gpu_get_lane_id<1>(item); HYPRE_Int p = 0; HYPRE_Int q = 0; HYPRE_Int func_i = dof_func ? read_only_load(&dof_func[row_i]) : 0; // A_diag part if (lane < 2) { p = read_only_load(A_diag_i + row_i + lane); } q = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, p, 1); p = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, p, 0); HYPRE_Complex row_sum_i = 0.0; // exclude diagonal: do not assume it is the first entry for (HYPRE_Int j = p + lane; j < q; j += HYPRE_WARP_SIZE) { HYPRE_Int col = read_only_load(&A_diag_j[j]); if (row_i != col) { HYPRE_Int func_j = dof_func ? read_only_load(&dof_func[col]) : 0; if (func_i == func_j) { HYPRE_Complex value = read_only_load(&A_diag_data[j]); row_sum_i += value; } } } // A_offd part if (lane < 2) { p = read_only_load(A_offd_i + row_i + lane); } q = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, p, 1); p = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, p, 0); for (HYPRE_Int j = p + lane; j < q; j += HYPRE_WARP_SIZE) { HYPRE_Int func_j = 0; if (dof_func_offd) { HYPRE_Int col = read_only_load(&A_offd_j[j]); func_j = read_only_load(&dof_func_offd[col]); } if (func_i == func_j) { HYPRE_Complex value = read_only_load(&A_offd_data[j]); row_sum_i += value; } } row_sum_i = warp_reduce_sum(item, row_sum_i); if (lane == 0) { row_sums[row_i] = row_sum_i; } } __global__ void hypreGPUKernel_mutli_pi_rowsum( hypre_DeviceItem &item, HYPRE_Int num_points, HYPRE_Int *pass_order, HYPRE_Int *A_diag_i, HYPRE_Complex *A_diag_data, HYPRE_Int *Pi_diag_i, HYPRE_Complex *Pi_diag_data, HYPRE_Int *Pi_offd_i, HYPRE_Complex *Pi_offd_data, HYPRE_Complex *w_row_sum ) { HYPRE_Int row_i = hypre_gpu_get_grid_warp_id<1, 1>(item); if (row_i >= num_points) { return; } HYPRE_Int lane = hypre_gpu_get_lane_id<1>(item); HYPRE_Int p_diag = 0, q_diag = 0, p_offd = 0, q_offd = 0; HYPRE_Real row_sum_C = 0.0; // Pi_diag if (lane < 2) { p_diag = read_only_load(Pi_diag_i + row_i + lane); } q_diag = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, p_diag, 1); p_diag = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, p_diag, 0); for (HYPRE_Int j = p_diag + lane; j < q_diag; j += HYPRE_WARP_SIZE) { row_sum_C += read_only_load(&Pi_diag_data[j]); } // Pi_offd if (lane < 2) { p_offd = read_only_load(Pi_offd_i + row_i + lane); } q_offd = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, p_offd, 1); p_offd = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, p_offd, 0); for (HYPRE_Int j = p_offd + lane; j < q_offd; j += HYPRE_WARP_SIZE) { row_sum_C += read_only_load(&Pi_offd_data[j]); } row_sum_C = warp_reduce_sum(item, row_sum_C); if ( lane == 0 ) { const HYPRE_Int i1 = read_only_load(&pass_order[row_i]); const HYPRE_Int j1 = read_only_load(&A_diag_i[i1]); //XXX RL: rely on diagonal is the first of row [FIX?] const HYPRE_Real diagonal = read_only_load(&A_diag_data[j1]); const HYPRE_Real value = row_sum_C * diagonal; row_sum_C += read_only_load(&w_row_sum[row_i]); if ( value != 0.0 ) { row_sum_C /= value; } } row_sum_C = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, row_sum_C, 0); // Pi_diag for (HYPRE_Int j = p_diag + lane; j < q_diag; j += HYPRE_WARP_SIZE) { Pi_diag_data[j] *= -row_sum_C; } // Pi_offd for (HYPRE_Int j = p_offd + lane; j < q_offd; j += HYPRE_WARP_SIZE) { Pi_offd_data[j] *= -row_sum_C; } } __global__ void hypreGPUKernel_generate_Pdiag_i_Poffd_i( hypre_DeviceItem &item, HYPRE_Int num_points, HYPRE_Int color, HYPRE_Int *pass_order, HYPRE_Int *pass_marker, HYPRE_Int *pass_marker_offd, HYPRE_Int *S_diag_i, HYPRE_Int *S_diag_j, HYPRE_Int *S_offd_i, HYPRE_Int *S_offd_j, HYPRE_Int *P_diag_i, HYPRE_Int *P_offd_i ) { /* nnz_diag = 0; nnz_offd = 0; for (i=0; i < num_points; i++) { i1 = pass_order[i]; for (j=S_diag_i[i1]; j < S_diag_i[i1+1]; j++) { j1 = S_diag_j[j]; if (pass_marker[j1] == color) { P_diag_i[i]++; nnz_diag++; } } for (j=S_offd_i[i1]; j < S_offd_i[i1+1]; j++) { j1 = S_offd_j[j]; if (pass_marker_offd[j1] == color) { P_offd_i[i]++; nnz_offd++; } } } */ HYPRE_Int row_i = hypre_gpu_get_grid_warp_id<1, 1>(item); if (row_i >= num_points) { return; } HYPRE_Int i1 = read_only_load(&pass_order[row_i]); HYPRE_Int lane = hypre_gpu_get_lane_id<1>(item); HYPRE_Int p = 0; HYPRE_Int q = 0; HYPRE_Int diag_increment = 0; HYPRE_Int offd_increment = 0; // S_diag if (lane < 2) { p = read_only_load(S_diag_i + i1 + lane); } q = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, p, 1); p = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, p, 0); for (HYPRE_Int j = p + lane; j < q; j += HYPRE_WARP_SIZE) { const HYPRE_Int j1 = read_only_load(&S_diag_j[j]); const HYPRE_Int marker = read_only_load(&pass_marker[j1]); diag_increment += marker == color; } diag_increment = warp_reduce_sum(item, diag_increment); // Increment P_diag_i, but then we need to also do a block reduction // on diag_increment to log the total nnz_diag for the block // Then after the kernel, we'll accumulate nnz_diag for each block if (lane == 0) { P_diag_i[row_i] = diag_increment; } // S_offd if (lane < 2) { p = read_only_load(S_offd_i + i1 + lane); } q = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, p, 1); p = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, p, 0); for (HYPRE_Int j = p + lane; j < q; j += HYPRE_WARP_SIZE) { const HYPRE_Int j1 = read_only_load(&S_offd_j[j]); const HYPRE_Int marker = read_only_load(&pass_marker_offd[j1]); offd_increment += marker == color; } offd_increment = warp_reduce_sum(item, offd_increment); // Increment P_offd_i, but then we need to also do a block reduction // on offd_increment to log the total nnz_offd for the block // Then after the kernel, we'll accumulate nnz_offd for each block if (lane == 0) { P_offd_i[row_i] = offd_increment; } } __global__ void hypreGPUKernel_generate_Pdiag_j_Poffd_j( hypre_DeviceItem &item, HYPRE_Int num_points, HYPRE_Int color, HYPRE_Int *pass_order, HYPRE_Int *pass_marker, HYPRE_Int *pass_marker_offd, HYPRE_Int *fine_to_coarse, HYPRE_Int *fine_to_coarse_offd, HYPRE_Int *A_diag_i, HYPRE_Int *A_diag_j, HYPRE_Complex *A_diag_data, HYPRE_Int *A_offd_i, HYPRE_Int *A_offd_j, HYPRE_Complex *A_offd_data, HYPRE_Int *Soc_diag_j, HYPRE_Int *Soc_offd_j, HYPRE_Int *P_diag_i, HYPRE_Int *P_offd_i, HYPRE_Int *P_diag_j, HYPRE_Complex *P_diag_data, HYPRE_Int *P_offd_j, HYPRE_Complex *P_offd_data, HYPRE_Complex *row_sums ) { HYPRE_Int row_i = hypre_gpu_get_grid_warp_id<1, 1>(item); if (row_i >= num_points) { return; } HYPRE_Int i1 = read_only_load(&pass_order[row_i]); HYPRE_Int lane = hypre_gpu_get_lane_id<1>(item); HYPRE_Int p_diag_A = 0, q_diag_A, p_diag_P = 0, q_diag_P; HYPRE_Int k; HYPRE_Complex row_sum_C = 0.0, diagonal = 0.0; // S_diag if (lane < 2) { p_diag_A = read_only_load(A_diag_i + i1 + lane); p_diag_P = read_only_load(P_diag_i + row_i + lane); } q_diag_A = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, p_diag_A, 1); p_diag_A = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, p_diag_A, 0); q_diag_P = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, p_diag_P, 1); p_diag_P = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, p_diag_P, 0); k = p_diag_P; for (HYPRE_Int j = p_diag_A + lane; warp_any_sync(item, HYPRE_WARP_FULL_MASK, j < q_diag_A); j += HYPRE_WARP_SIZE) { HYPRE_Int equal = 0; HYPRE_Int sum = 0; HYPRE_Int j1 = -1; if ( j < q_diag_A ) { j1 = read_only_load(&Soc_diag_j[j]); equal = j1 > -1 && read_only_load(&pass_marker[j1]) == color; } HYPRE_Int pos = warp_prefix_sum(item, lane, equal, sum); if (equal) { P_diag_j[k + pos] = read_only_load(&fine_to_coarse[j1]); HYPRE_Complex val = read_only_load(&A_diag_data[j]); P_diag_data[k + pos] = val; row_sum_C += val; } if (j1 == -2) { diagonal = read_only_load(&A_diag_data[j]); } k += sum; } hypre_device_assert(k == q_diag_P); // S_offd HYPRE_Int p_offd_A = 0, q_offd_A, p_offd_P = 0, q_offd_P; if (lane < 2) { p_offd_A = read_only_load(A_offd_i + i1 + lane); p_offd_P = read_only_load(P_offd_i + row_i + lane); } q_offd_A = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, p_offd_A, 1); p_offd_A = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, p_offd_A, 0); q_offd_P = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, p_offd_P, 1); p_offd_P = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, p_offd_P, 0); k = p_offd_P; for (HYPRE_Int j = p_offd_A + lane; warp_any_sync(item, HYPRE_WARP_FULL_MASK, j < q_offd_A); j += HYPRE_WARP_SIZE) { HYPRE_Int equal = 0; HYPRE_Int sum = 0; HYPRE_Int j1 = -1; if ( j < q_offd_A ) { j1 = read_only_load(&Soc_offd_j[j]); equal = j1 > -1 && read_only_load(&pass_marker_offd[j1]) == color; } HYPRE_Int pos = warp_prefix_sum(item, lane, equal, sum); if (equal) { P_offd_j[k + pos] = read_only_load(&fine_to_coarse_offd[j1]); HYPRE_Complex val = read_only_load(&A_offd_data[j]); P_offd_data[k + pos] = val; row_sum_C += val; } k += sum; } hypre_device_assert(k == q_offd_P); row_sum_C = warp_reduce_sum(item, row_sum_C); diagonal = warp_reduce_sum(item, diagonal); HYPRE_Complex value = row_sum_C * diagonal; HYPRE_Complex row_sum_i = 0.0; if (lane == 0) { row_sum_i = read_only_load(&row_sums[i1]); if (value) { row_sum_i /= value; row_sums[i1] = row_sum_i; } } row_sum_i = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, row_sum_i, 0); for (HYPRE_Int j = p_diag_P + lane; j < q_diag_P; j += HYPRE_WARP_SIZE) { P_diag_data[j] = -P_diag_data[j] * row_sum_i; } for (HYPRE_Int j = p_offd_P + lane; j < q_offd_P; j += HYPRE_WARP_SIZE) { P_offd_data[j] = -P_offd_data[j] * row_sum_i; } } __global__ void hypreGPUKernel_insert_remaining_weights( hypre_DeviceItem &item, HYPRE_Int start, HYPRE_Int stop, HYPRE_Int *pass_order, HYPRE_Int *Pi_diag_i, HYPRE_Int *Pi_diag_j, HYPRE_Real *Pi_diag_data, HYPRE_Int *P_diag_i, HYPRE_Int *P_diag_j, HYPRE_Real *P_diag_data, HYPRE_Int *Pi_offd_i, HYPRE_Int *Pi_offd_j, HYPRE_Real *Pi_offd_data, HYPRE_Int *P_offd_i, HYPRE_Int *P_offd_j, HYPRE_Real *P_offd_data ) { HYPRE_Int row_i = hypre_gpu_get_grid_warp_id<1, 1>(item); if (row_i >= stop - start) { return; } HYPRE_Int i1 = read_only_load(&pass_order[row_i + start]); HYPRE_Int lane = hypre_gpu_get_lane_id<1>(item); HYPRE_Int p = 0; HYPRE_Int q = 0; HYPRE_Int i2; // P_diag if (lane < 2) { p = read_only_load(P_diag_i + i1 + lane); } q = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, p, 1); p = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, p, 0); i2 = read_only_load(&Pi_diag_i[row_i]) - p; for (HYPRE_Int j = p + lane; j < q; j += HYPRE_WARP_SIZE) { P_diag_j[j] = Pi_diag_j[j + i2]; P_diag_data[j] = Pi_diag_data[j + i2]; } // P_offd if (lane < 2) { p = read_only_load(P_offd_i + i1 + lane); } q = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, p, 1); p = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, p, 0); i2 = read_only_load(&Pi_offd_i[row_i]) - p; for (HYPRE_Int j = p + lane; j < q; j += HYPRE_WARP_SIZE) { P_offd_j[j] = Pi_offd_j[j + i2]; P_offd_data[j] = Pi_offd_data[j + i2]; } } __global__ void hypreGPUKernel_generate_Qdiag_j_Qoffd_j( hypre_DeviceItem &item, HYPRE_Int num_points, HYPRE_Int color, HYPRE_Int *pass_order, HYPRE_Int *pass_marker, HYPRE_Int *pass_marker_offd, HYPRE_Int *fine_to_coarse, HYPRE_Int *fine_to_coarse_offd, HYPRE_Int *A_diag_i, HYPRE_Int *A_diag_j, HYPRE_Complex *A_diag_data, HYPRE_Int *A_offd_i, HYPRE_Int *A_offd_j, HYPRE_Complex *A_offd_data, HYPRE_Int *Soc_diag_j, HYPRE_Int *Soc_offd_j, HYPRE_Int *Q_diag_i, HYPRE_Int *Q_offd_i, HYPRE_Int *Q_diag_j, HYPRE_Complex *Q_diag_data, HYPRE_Int *Q_offd_j, HYPRE_Complex *Q_offd_data, HYPRE_Complex *w_row_sum, HYPRE_Int num_functions, HYPRE_Int *dof_func, HYPRE_Int *dof_func_offd ) { HYPRE_Int row_i = hypre_gpu_get_grid_warp_id<1, 1>(item); if (row_i >= num_points) { return; } HYPRE_Int i1 = read_only_load(&pass_order[row_i]); HYPRE_Int lane = hypre_gpu_get_lane_id<1>(item); HYPRE_Int p_diag_A = 0, q_diag_A, p_diag_P = 0; #ifdef HYPRE_DEBUG HYPRE_Int q_diag_P; #endif HYPRE_Int k; HYPRE_Complex w_row_sum_i = 0.0; HYPRE_Int dof_func_i1 = -1; if (num_functions > 1) { if (lane == 0) { dof_func_i1 = read_only_load(&dof_func[i1]); } dof_func_i1 = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, dof_func_i1, 0); } // S_diag #ifdef HYPRE_DEBUG if (lane < 2) { p_diag_A = read_only_load(A_diag_i + i1 + lane); p_diag_P = read_only_load(Q_diag_i + row_i + lane); } q_diag_A = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, p_diag_A, 1); p_diag_A = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, p_diag_A, 0); q_diag_P = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, p_diag_P, 1); p_diag_P = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, p_diag_P, 0); #else if (lane < 2) { p_diag_A = read_only_load(A_diag_i + i1 + lane); } q_diag_A = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, p_diag_A, 1); p_diag_A = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, p_diag_A, 0); if (lane == 0) { p_diag_P = read_only_load(Q_diag_i + row_i); } p_diag_P = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, p_diag_P, 0); #endif k = p_diag_P; for (HYPRE_Int j = p_diag_A + lane; warp_any_sync(item, HYPRE_WARP_FULL_MASK, j < q_diag_A); j += HYPRE_WARP_SIZE) { HYPRE_Int equal = 0; HYPRE_Int sum = 0; HYPRE_Int j1 = -1; if ( j < q_diag_A ) { j1 = read_only_load(&Soc_diag_j[j]); equal = j1 > -1 && read_only_load(&pass_marker[j1]) == color; } HYPRE_Int pos = warp_prefix_sum(item, lane, equal, sum); if (equal) { Q_diag_j[k + pos] = read_only_load(&fine_to_coarse[j1]); Q_diag_data[k + pos] = read_only_load(&A_diag_data[j]); } else if (j < q_diag_A && j1 != -2) { if (num_functions > 1) { const HYPRE_Int col = read_only_load(&A_diag_j[j]); if ( dof_func_i1 == read_only_load(&dof_func[col]) ) { w_row_sum_i += read_only_load(&A_diag_data[j]); } } else { w_row_sum_i += read_only_load(&A_diag_data[j]); } } k += sum; } #ifdef HYPRE_DEBUG hypre_device_assert(k == q_diag_P); #endif // S_offd HYPRE_Int p_offd_A = 0, q_offd_A, p_offd_P = 0; #ifdef HYPRE_DEBUG HYPRE_Int q_offd_P; #endif #ifdef HYPRE_DEBUG if (lane < 2) { p_offd_A = read_only_load(A_offd_i + i1 + lane); p_offd_P = read_only_load(Q_offd_i + row_i + lane); } q_offd_A = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, p_offd_A, 1); p_offd_A = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, p_offd_A, 0); q_offd_P = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, p_offd_P, 1); p_offd_P = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, p_offd_P, 0); #else if (lane < 2) { p_offd_A = read_only_load(A_offd_i + i1 + lane); } q_offd_A = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, p_offd_A, 1); p_offd_A = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, p_offd_A, 0); if (lane == 0) { p_offd_P = read_only_load(Q_offd_i + row_i); } p_offd_P = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, p_offd_P, 0); #endif k = p_offd_P; for (HYPRE_Int j = p_offd_A + lane; warp_any_sync(item, HYPRE_WARP_FULL_MASK, j < q_offd_A); j += HYPRE_WARP_SIZE) { HYPRE_Int equal = 0; HYPRE_Int sum = 0; HYPRE_Int j1 = -1; if ( j < q_offd_A ) { j1 = read_only_load(&Soc_offd_j[j]); equal = j1 > -1 && read_only_load(&pass_marker_offd[j1]) == color; } HYPRE_Int pos = warp_prefix_sum(item, lane, equal, sum); if (equal) { Q_offd_j[k + pos] = read_only_load(&fine_to_coarse_offd[j1]); Q_offd_data[k + pos] = read_only_load(&A_offd_data[j]); } else if (j < q_offd_A) { if (num_functions > 1) { const HYPRE_Int col = read_only_load(&A_offd_j[j]); if ( dof_func_i1 == read_only_load(&dof_func_offd[col]) ) { w_row_sum_i += read_only_load(&A_offd_data[j]); } } else { w_row_sum_i += read_only_load(&A_offd_data[j]); } } k += sum; } #ifdef HYPRE_DEBUG hypre_device_assert(k == q_offd_P); #endif w_row_sum_i = warp_reduce_sum(item, w_row_sum_i); if (lane == 0) { w_row_sum[row_i] = w_row_sum_i; } } __global__ void hypreGPUKernel_pass_order_count( hypre_DeviceItem &item, HYPRE_Int num_points, HYPRE_Int color, HYPRE_Int *points_left, HYPRE_Int *pass_marker, HYPRE_Int *pass_marker_offd, HYPRE_Int *S_diag_i, HYPRE_Int *S_diag_j, HYPRE_Int *S_offd_i, HYPRE_Int *S_offd_j, HYPRE_Int *diag_shifts ) { HYPRE_Int row_i = hypre_gpu_get_grid_warp_id<1, 1>(item); if (row_i >= num_points) { return; } HYPRE_Int i1 = read_only_load(&points_left[row_i]); HYPRE_Int lane = hypre_gpu_get_lane_id<1>(item); HYPRE_Int p = 0; HYPRE_Int q = 0; hypre_int brk = 0; // S_diag if (lane < 2) { p = read_only_load(S_diag_i + i1 + lane); } q = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, p, 1); p = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, p, 0); for (HYPRE_Int j = p + lane; warp_any_sync(item, HYPRE_WARP_FULL_MASK, j < q); j += HYPRE_WARP_SIZE) { if (j < q) { HYPRE_Int j1 = read_only_load(&S_diag_j[j]); if ( read_only_load(&pass_marker[j1]) == color ) { brk = 1; } } brk = warp_any_sync(item, HYPRE_WARP_FULL_MASK, brk); if (brk) { break; } } if (brk) { // Only one thread can increment because of the break // so we just need to increment by 1 if (lane == 0) { diag_shifts[row_i] = 1; } return; } // S_offd if (lane < 2) { p = read_only_load(S_offd_i + i1 + lane); } q = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, p, 1); p = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, p, 0); for (HYPRE_Int j = p + lane; warp_any_sync(item, HYPRE_WARP_FULL_MASK, j < q); j += HYPRE_WARP_SIZE) { if (j < q) { HYPRE_Int j1 = read_only_load(&S_offd_j[j]); if ( read_only_load(&pass_marker_offd[j1]) == color ) { brk = 1; } } brk = warp_any_sync(item, HYPRE_WARP_FULL_MASK, brk); if (brk) { break; } } // Only one thread can increment because of the break // so we just need to increment by 1 if (lane == 0) { diag_shifts[row_i] = (brk != 0); } } __global__ void hypreGPUKernel_populate_big_P_offd_j( hypre_DeviceItem &item, HYPRE_Int start, HYPRE_Int stop, HYPRE_Int *pass_order, HYPRE_Int *P_offd_i, HYPRE_Int *P_offd_j, HYPRE_BigInt *col_map_offd_Pi, HYPRE_BigInt *big_P_offd_j ) { HYPRE_Int i = hypre_gpu_get_grid_warp_id<1, 1>(item) + start; if (i >= stop) { return; } HYPRE_Int lane = hypre_gpu_get_lane_id<1>(item); HYPRE_Int i1 = read_only_load(&pass_order[i]); HYPRE_Int p = 0; HYPRE_Int q = 0; if (lane < 2) { p = read_only_load(P_offd_i + i1 + lane); } q = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, p, 1); p = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, p, 0); for (HYPRE_Int j = p + lane; j < q; j += HYPRE_WARP_SIZE) { HYPRE_Int col = read_only_load(&P_offd_j[j]); big_P_offd_j[j] = read_only_load(&col_map_offd_Pi[col]); } } #endif // defined(HYPRE_USING_GPU) hypre-2.33.0/src/parcsr_ls/par_multi_interp.c000066400000000000000000002353171477326011500212470ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "_hypre_parcsr_ls.h" /*-------------------------------------------------------------------------- * hypre_ParAMGBuildMultipass * This routine implements Stuben's direct interpolation with multiple passes. *--------------------------------------------------------------------------*/ HYPRE_Int hypre_BoomerAMGBuildMultipassHost( hypre_ParCSRMatrix *A, HYPRE_Int *CF_marker, hypre_ParCSRMatrix *S, HYPRE_BigInt *num_cpts_global, HYPRE_Int num_functions, HYPRE_Int *dof_func, HYPRE_Int debug_flag, HYPRE_Real trunc_factor, HYPRE_Int P_max_elmts, HYPRE_Int weight_option, hypre_ParCSRMatrix **P_ptr ) { HYPRE_UNUSED_VAR(debug_flag); #ifdef HYPRE_PROFILE hypre_profile_times[HYPRE_TIMER_ID_MULTIPASS_INTERP] -= hypre_MPI_Wtime(); #endif MPI_Comm comm = hypre_ParCSRMatrixComm(A); hypre_ParCSRCommPkg *comm_pkg = hypre_ParCSRMatrixCommPkg(S); hypre_ParCSRCommHandle *comm_handle; hypre_ParCSRCommPkg *tmp_comm_pkg = NULL; HYPRE_MemoryLocation memory_location_P = hypre_ParCSRMatrixMemoryLocation(A); hypre_CSRMatrix *A_diag = hypre_ParCSRMatrixDiag(A); HYPRE_Real *A_diag_data = hypre_CSRMatrixData(A_diag); HYPRE_Int *A_diag_i = hypre_CSRMatrixI(A_diag); HYPRE_Int *A_diag_j = hypre_CSRMatrixJ(A_diag); hypre_CSRMatrix *A_offd = hypre_ParCSRMatrixOffd(A); HYPRE_Real *A_offd_data = NULL; HYPRE_Int *A_offd_i = hypre_CSRMatrixI(A_offd); HYPRE_Int *A_offd_j = NULL; //HYPRE_BigInt *col_map_offd_A = hypre_ParCSRMatrixColMapOffd(A); HYPRE_Int num_cols_offd_A = hypre_CSRMatrixNumCols(A_offd); hypre_CSRMatrix *S_diag = hypre_ParCSRMatrixDiag(S); HYPRE_Int *S_diag_i = hypre_CSRMatrixI(S_diag); HYPRE_Int *S_diag_j = hypre_CSRMatrixJ(S_diag); hypre_CSRMatrix *S_offd = hypre_ParCSRMatrixOffd(S); HYPRE_Int *S_offd_i = hypre_CSRMatrixI(S_offd); HYPRE_Int *S_offd_j = NULL; /*HYPRE_BigInt *col_map_offd_S = hypre_ParCSRMatrixColMapOffd(S); HYPRE_Int num_cols_offd_S = hypre_CSRMatrixNumCols(S_offd); HYPRE_BigInt *col_map_offd = NULL;*/ HYPRE_Int num_cols_offd; hypre_ParCSRMatrix *P; hypre_CSRMatrix *P_diag; HYPRE_Real *P_diag_data; HYPRE_Int *P_diag_i; /*at first counter of nonzero cols for each row, finally will be pointer to start of row */ HYPRE_Int *P_diag_j; hypre_CSRMatrix *P_offd; HYPRE_Real *P_offd_data = NULL; HYPRE_Int *P_offd_i; /*at first counter of nonzero cols for each row, finally will be pointer to start of row */ HYPRE_Int *P_offd_j = NULL; HYPRE_Int num_sends = 0; HYPRE_Int *int_buf_data = NULL; HYPRE_BigInt *big_buf_data = NULL; HYPRE_Int *send_map_start = NULL; HYPRE_Int *send_map_elmt = NULL; HYPRE_Int *send_procs = NULL; HYPRE_Int num_recvs = 0; HYPRE_Int *recv_vec_start = NULL; HYPRE_Int *recv_procs = NULL; HYPRE_Int *new_recv_vec_start = NULL; HYPRE_Int **Pext_send_map_start = NULL; HYPRE_Int **Pext_recv_vec_start = NULL; HYPRE_Int *Pext_start = NULL; HYPRE_Int *P_ncols = NULL; HYPRE_Int *CF_marker_offd = NULL; HYPRE_Int *dof_func_offd = NULL; HYPRE_Int *P_marker; HYPRE_Int *P_marker_offd = NULL; HYPRE_Int *C_array; HYPRE_Int *C_array_offd = NULL; HYPRE_Int *pass_array = NULL; /* contains points ordered according to pass */ HYPRE_Int *pass_pointer = NULL; /* pass_pointer[j] contains pointer to first point of pass j contained in pass_array */ HYPRE_Int *P_diag_start; HYPRE_Int *P_offd_start = NULL; HYPRE_Int **P_diag_pass; HYPRE_Int **P_offd_pass = NULL; HYPRE_Int **Pext_pass = NULL; HYPRE_BigInt *big_temp_pass = NULL; HYPRE_BigInt **new_elmts = NULL; /* new neighbors generated in each pass */ HYPRE_Int *new_counter = NULL; /* contains no. of new neighbors for each pass */ HYPRE_Int *loc = NULL; /* contains locations for new neighbor connections in int_o_buffer to avoid searching */ HYPRE_Int *Pext_i = NULL; /*contains P_diag_i and P_offd_i info for nonzero cols of off proc neighbors */ HYPRE_BigInt *Pext_send_buffer = NULL; /* used to collect global nonzero col ids in P_diag for send_map_elmts */ HYPRE_Int *map_S_to_new = NULL; HYPRE_BigInt *new_col_map_offd = NULL; HYPRE_BigInt *col_map_offd_P = NULL; HYPRE_Int *permute = NULL; HYPRE_BigInt *big_permute = NULL; HYPRE_Int cnt; HYPRE_Int cnt_nz; HYPRE_Int total_nz; HYPRE_Int pass; HYPRE_Int num_passes; HYPRE_Int max_num_passes = 10; HYPRE_Int n_fine; HYPRE_Int n_coarse = 0; HYPRE_Int n_coarse_offd = 0; HYPRE_Int n_SF = 0; HYPRE_Int *fine_to_coarse = NULL; HYPRE_BigInt *fine_to_coarse_offd = NULL; HYPRE_Int *assigned = NULL; HYPRE_Int *assigned_offd = NULL; HYPRE_Real *Pext_send_data = NULL; HYPRE_Real *Pext_data = NULL; HYPRE_Real sum_C, sum_N; HYPRE_Real sum_C_pos, sum_C_neg; HYPRE_Real sum_N_pos, sum_N_neg; HYPRE_Real diagonal; HYPRE_Real alfa = 1.0; HYPRE_Real beta = 1.0; HYPRE_Int j_start; HYPRE_Int j_end; HYPRE_Int i, i1; HYPRE_Int j, j1; HYPRE_Int k, k1, k2, k3; HYPRE_BigInt big_k1; HYPRE_Int pass_array_size; HYPRE_BigInt global_pass_array_size; HYPRE_BigInt local_pass_array_size; HYPRE_Int my_id, num_procs; HYPRE_Int index, start; HYPRE_BigInt my_first_cpt; HYPRE_BigInt total_global_cpts; HYPRE_Int p_cnt; HYPRE_Int total_nz_offd; HYPRE_Int cnt_nz_offd; HYPRE_Int cnt_offd, cnt_new; HYPRE_Int no_break; HYPRE_Int not_found; HYPRE_Int Pext_send_size; HYPRE_Int Pext_recv_size; HYPRE_Int old_Pext_send_size; HYPRE_Int old_Pext_recv_size; HYPRE_Int P_offd_size = 0; HYPRE_Int local_index = -1; HYPRE_Int new_num_cols_offd = 0; HYPRE_Int num_cols_offd_P; /* Threading variables */ HYPRE_Int my_thread_num, num_threads, thread_start, thread_stop; HYPRE_Int pass_length; HYPRE_Int *tmp_marker, *tmp_marker_offd; HYPRE_Int *tmp_array, *tmp_array_offd; HYPRE_Int * max_num_threads = hypre_CTAlloc(HYPRE_Int, 1, HYPRE_MEMORY_HOST); HYPRE_Int * cnt_nz_per_thread; HYPRE_Int * cnt_nz_offd_per_thread; /* HYPRE_Real wall_time; wall_time = hypre_MPI_Wtime(); */ /* Initialize threading variables */ max_num_threads[0] = hypre_NumThreads(); cnt_nz_per_thread = hypre_CTAlloc(HYPRE_Int, max_num_threads[0], HYPRE_MEMORY_HOST); cnt_nz_offd_per_thread = hypre_CTAlloc(HYPRE_Int, max_num_threads[0], HYPRE_MEMORY_HOST); for (i = 0; i < max_num_threads[0]; i++) { cnt_nz_offd_per_thread[i] = 0; cnt_nz_per_thread[i] = 0; } /*----------------------------------------------------------------------- * Access the CSR vectors for A and S. Also get size of fine grid. *-----------------------------------------------------------------------*/ hypre_MPI_Comm_size(comm, &num_procs); hypre_MPI_Comm_rank(comm, &my_id); my_first_cpt = num_cpts_global[0]; /* total_global_cpts = 0; */ if (my_id == (num_procs - 1)) { total_global_cpts = num_cpts_global[1]; } hypre_MPI_Bcast(&total_global_cpts, 1, HYPRE_MPI_BIG_INT, num_procs - 1, comm); if (!comm_pkg) { comm_pkg = hypre_ParCSRMatrixCommPkg(A); if (!comm_pkg) { hypre_MatvecCommPkgCreate(A); comm_pkg = hypre_ParCSRMatrixCommPkg(A); } } //col_map_offd = col_map_offd_A; num_cols_offd = num_cols_offd_A; if (num_cols_offd_A) { A_offd_data = hypre_CSRMatrixData(A_offd); A_offd_j = hypre_CSRMatrixJ(A_offd); } if (num_cols_offd) { S_offd_j = hypre_CSRMatrixJ(S_offd); } n_fine = hypre_CSRMatrixNumRows(A_diag); /*----------------------------------------------------------------------- * Intialize counters and allocate mapping vector. *-----------------------------------------------------------------------*/ fine_to_coarse = hypre_CTAlloc(HYPRE_Int, n_fine, HYPRE_MEMORY_HOST); n_coarse = 0; n_SF = 0; #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i) reduction(+:n_coarse,n_SF) HYPRE_SMP_SCHEDULE #endif for (i = 0; i < n_fine; i++) { if (CF_marker[i] == 1) { n_coarse++; } else if (CF_marker[i] == -3) { n_SF++; } } pass_array_size = n_fine - n_coarse - n_SF; pass_array = hypre_CTAlloc(HYPRE_Int, pass_array_size, HYPRE_MEMORY_HOST); pass_pointer = hypre_CTAlloc(HYPRE_Int, max_num_passes + 1, HYPRE_MEMORY_HOST); assigned = hypre_CTAlloc(HYPRE_Int, n_fine, HYPRE_MEMORY_HOST); P_diag_i = hypre_CTAlloc(HYPRE_Int, n_fine + 1, memory_location_P); P_offd_i = hypre_CTAlloc(HYPRE_Int, n_fine + 1, memory_location_P); C_array = hypre_CTAlloc(HYPRE_Int, n_coarse, HYPRE_MEMORY_HOST); if (num_cols_offd) { CF_marker_offd = hypre_CTAlloc(HYPRE_Int, num_cols_offd, HYPRE_MEMORY_HOST); if (num_functions > 1) { dof_func_offd = hypre_CTAlloc(HYPRE_Int, num_cols_offd, HYPRE_MEMORY_HOST); } } if (num_procs > 1) { num_sends = hypre_ParCSRCommPkgNumSends(comm_pkg); send_procs = hypre_ParCSRCommPkgSendProcs(comm_pkg); send_map_start = hypre_ParCSRCommPkgSendMapStarts(comm_pkg); send_map_elmt = hypre_ParCSRCommPkgSendMapElmts(comm_pkg); num_recvs = hypre_ParCSRCommPkgNumRecvs(comm_pkg); recv_procs = hypre_ParCSRCommPkgRecvProcs(comm_pkg); recv_vec_start = hypre_ParCSRCommPkgRecvVecStarts(comm_pkg); if (send_map_start[num_sends]) { int_buf_data = hypre_CTAlloc(HYPRE_Int, send_map_start[num_sends], HYPRE_MEMORY_HOST); big_buf_data = hypre_CTAlloc(HYPRE_BigInt, send_map_start[num_sends], HYPRE_MEMORY_HOST); } } index = 0; for (i = 0; i < num_sends; i++) { start = send_map_start[i]; for (j = start; j < send_map_start[i + 1]; j++) { int_buf_data[index++] = CF_marker[send_map_elmt[j]]; } } if (num_procs > 1) { comm_handle = hypre_ParCSRCommHandleCreate(11, comm_pkg, int_buf_data, CF_marker_offd); hypre_ParCSRCommHandleDestroy(comm_handle); } if (num_functions > 1) { index = 0; for (i = 0; i < num_sends; i++) { start = send_map_start[i]; for (j = start; j < send_map_start[i + 1]; j++) { int_buf_data[index++] = dof_func[send_map_elmt[j]]; } } if (num_procs > 1) { comm_handle = hypre_ParCSRCommHandleCreate(11, comm_pkg, int_buf_data, dof_func_offd); hypre_ParCSRCommHandleDestroy(comm_handle); } } n_coarse_offd = 0; #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i) reduction(+:n_coarse_offd) HYPRE_SMP_SCHEDULE #endif for (i = 0; i < num_cols_offd; i++) if (CF_marker_offd[i] == 1) { n_coarse_offd++; } if (num_cols_offd) { assigned_offd = hypre_CTAlloc(HYPRE_Int, num_cols_offd, HYPRE_MEMORY_HOST); map_S_to_new = hypre_CTAlloc(HYPRE_Int, num_cols_offd, HYPRE_MEMORY_HOST); fine_to_coarse_offd = hypre_CTAlloc(HYPRE_BigInt, num_cols_offd, HYPRE_MEMORY_HOST); new_col_map_offd = hypre_CTAlloc(HYPRE_BigInt, n_coarse_offd, HYPRE_MEMORY_HOST); } /*----------------------------------------------------------------------- * First Pass: determine the maximal size of P, and elementsPerRow[i]. *-----------------------------------------------------------------------*/ /*----------------------------------------------------------------------- * Assigned points are points for which we know an interpolation * formula already, and which are thus available to interpolate from. * assigned[i]=0 for C points, and 1, 2, 3, ... for F points, depending * in which pass their interpolation formula is determined. * * pass_array contains the points ordered according to its pass, i.e. * | C-points | points of pass 1 | points of pass 2 | .... * C_points are points 0 through pass_pointer[1]-1, * points of pass k (0 < k < num_passes) are contained in points * pass_pointer[k] through pass_pointer[k+1]-1 of pass_array . * * pass_array is also used to avoid going through all points for each pass, * i,e. at the bginning it contains all points in descending order starting * with n_fine-1. Then starting from the last point, we evaluate whether * it is a C_point (pass 0). If it is the point is brought to the front * and the length of the points to be searched is shortened. This is * done until the parameter cnt (which determines the first point of * pass_array to be searched) becomes n_fine. Then all points have been * assigned a pass number. *-----------------------------------------------------------------------*/ cnt = 0; p_cnt = pass_array_size - 1; P_diag_i[0] = 0; P_offd_i[0] = 0; for (i = 0; i < n_fine; i++) { if (CF_marker[i] == 1) { fine_to_coarse[i] = cnt; /* this C point is assigned index coarse_counter on coarse grid, and in column of P */ C_array[cnt++] = i; assigned[i] = 0; P_diag_i[i + 1] = 1; /* one element in row i1 of P */ P_offd_i[i + 1] = 0; } else if (CF_marker[i] == -1) { pass_array[p_cnt--] = i; P_diag_i[i + 1] = 0; P_offd_i[i + 1] = 0; assigned[i] = -1; fine_to_coarse[i] = -1; } else { P_diag_i[i + 1] = 0; P_offd_i[i + 1] = 0; assigned[i] = -1; fine_to_coarse[i] = -1; } } index = 0; for (i = 0; i < num_sends; i++) { start = send_map_start[i]; for (j = start; j < send_map_start[i + 1]; j++) { big_buf_data[index] = (HYPRE_BigInt)fine_to_coarse[send_map_elmt[j]]; if (big_buf_data[index] > -1) { big_buf_data[index] += my_first_cpt; } index++; } } if (num_procs > 1) { comm_handle = hypre_ParCSRCommHandleCreate(21, comm_pkg, big_buf_data, fine_to_coarse_offd); hypre_ParCSRCommHandleDestroy(comm_handle); } new_recv_vec_start = hypre_CTAlloc(HYPRE_Int, num_recvs + 1, HYPRE_MEMORY_HOST); if (n_coarse_offd) { C_array_offd = hypre_CTAlloc(HYPRE_Int, n_coarse_offd, HYPRE_MEMORY_HOST); } cnt = 0; new_recv_vec_start[0] = 0; for (j = 0; j < num_recvs; j++) { for (i = recv_vec_start[j]; i < recv_vec_start[j + 1]; i++) { if (CF_marker_offd[i] == 1) { map_S_to_new[i] = cnt; C_array_offd[cnt] = i; new_col_map_offd[cnt++] = fine_to_coarse_offd[i]; assigned_offd[i] = 0; } else { assigned_offd[i] = -1; map_S_to_new[i] = -1; } } new_recv_vec_start[j + 1] = cnt; } cnt = 0; hypre_TFree(fine_to_coarse_offd, HYPRE_MEMORY_HOST); /*----------------------------------------------------------------------- * Mark all local neighbors of C points as 'assigned'. *-----------------------------------------------------------------------*/ pass_pointer[0] = 0; pass_pointer[1] = 0; total_nz = n_coarse; /* accumulates total number of nonzeros in P_diag */ total_nz_offd = 0; /* accumulates total number of nonzeros in P_offd */ cnt = 0; cnt_offd = 0; cnt_nz = 0; cnt_nz_offd = 0; for (i = pass_array_size - 1; i > cnt - 1; i--) { i1 = pass_array[i]; for (j = S_diag_i[i1]; j < S_diag_i[i1 + 1]; j++) { j1 = S_diag_j[j]; if (CF_marker[j1] == 1) { P_diag_i[i1 + 1]++; cnt_nz++; assigned[i1] = 1; } } for (j = S_offd_i[i1]; j < S_offd_i[i1 + 1]; j++) { j1 = S_offd_j[j]; if (CF_marker_offd[j1] == 1) { P_offd_i[i1 + 1]++; cnt_nz_offd++; assigned[i1] = 1; } } if (assigned[i1] == 1) { pass_array[i++] = pass_array[cnt]; pass_array[cnt++] = i1; } } pass_pointer[2] = cnt; /*----------------------------------------------------------------------- * All local neighbors are assigned, now need to exchange the boundary * info for assigned strong neighbors. *-----------------------------------------------------------------------*/ index = 0; for (i = 0; i < num_sends; i++) { start = send_map_start[i]; for (j = start; j < send_map_start[i + 1]; j++) { int_buf_data[index++] = assigned[send_map_elmt[j]]; } } if (num_procs > 1) { comm_handle = hypre_ParCSRCommHandleCreate(11, comm_pkg, int_buf_data, assigned_offd); hypre_ParCSRCommHandleDestroy(comm_handle); } /*----------------------------------------------------------------------- * Now we need to determine strong neighbors of points of pass 1, etc. * we need to update assigned_offd after each pass *-----------------------------------------------------------------------*/ pass = 2; local_pass_array_size = (HYPRE_BigInt)(pass_array_size - cnt); hypre_MPI_Allreduce(&local_pass_array_size, &global_pass_array_size, 1, HYPRE_MPI_BIG_INT, hypre_MPI_SUM, comm); while (global_pass_array_size && pass < max_num_passes) { for (i = pass_array_size - 1; i > cnt - 1; i--) { i1 = pass_array[i]; no_break = 1; for (j = S_diag_i[i1]; j < S_diag_i[i1 + 1]; j++) { j1 = S_diag_j[j]; if (assigned[j1] == pass - 1) { pass_array[i++] = pass_array[cnt]; pass_array[cnt++] = i1; assigned[i1] = pass; no_break = 0; break; } } if (no_break) { for (j = S_offd_i[i1]; j < S_offd_i[i1 + 1]; j++) { j1 = S_offd_j[j]; if (assigned_offd[j1] == pass - 1) { pass_array[i++] = pass_array[cnt]; pass_array[cnt++] = i1; assigned[i1] = pass; break; } } } } /*hypre_printf("pass %d remaining points %d \n", pass, local_pass_array_size);*/ pass++; pass_pointer[pass] = cnt; local_pass_array_size = (HYPRE_BigInt)(pass_array_size - cnt); hypre_MPI_Allreduce(&local_pass_array_size, &global_pass_array_size, 1, HYPRE_MPI_BIG_INT, hypre_MPI_SUM, comm); index = 0; for (i = 0; i < num_sends; i++) { start = send_map_start[i]; for (j = start; j < send_map_start[i + 1]; j++) { int_buf_data[index++] = assigned[send_map_elmt[j]]; } } if (num_procs > 1) { comm_handle = hypre_ParCSRCommHandleCreate(11, comm_pkg, int_buf_data, assigned_offd); hypre_ParCSRCommHandleDestroy(comm_handle); } } hypre_TFree(int_buf_data, HYPRE_MEMORY_HOST); hypre_TFree(big_buf_data, HYPRE_MEMORY_HOST); num_passes = pass; P_diag_pass = hypre_CTAlloc(HYPRE_Int*, num_passes, HYPRE_MEMORY_HOST); /* P_diag_pass[i] will contain all column numbers for points of pass i */ P_diag_pass[1] = hypre_CTAlloc(HYPRE_Int, cnt_nz, HYPRE_MEMORY_HOST); P_diag_start = hypre_CTAlloc(HYPRE_Int, n_fine, HYPRE_MEMORY_HOST); /* P_diag_start[i] contains pointer to begin of column numbers in P_pass for point i, P_diag_i[i+1] contains number of columns for point i */ P_offd_start = hypre_CTAlloc(HYPRE_Int, n_fine, HYPRE_MEMORY_HOST); if (num_procs > 1) { P_offd_pass = hypre_CTAlloc(HYPRE_Int*, num_passes, HYPRE_MEMORY_HOST); if (cnt_nz_offd) { P_offd_pass[1] = hypre_CTAlloc(HYPRE_Int, cnt_nz_offd, HYPRE_MEMORY_HOST); } else { P_offd_pass[1] = NULL; } new_elmts = hypre_CTAlloc(HYPRE_BigInt*, num_passes, HYPRE_MEMORY_HOST); new_counter = hypre_CTAlloc(HYPRE_Int, num_passes + 1, HYPRE_MEMORY_HOST); new_counter[0] = 0; new_counter[1] = n_coarse_offd; new_num_cols_offd = n_coarse_offd; new_elmts[0] = new_col_map_offd; } /*----------------------------------------------------------------------- * Pass 1: now we consider points of pass 1, with strong C_neighbors, *-----------------------------------------------------------------------*/ cnt_nz = 0; cnt_nz_offd = 0; /* JBS: Possible candidate for threading */ for (i = pass_pointer[1]; i < pass_pointer[2]; i++) { i1 = pass_array[i]; P_diag_start[i1] = cnt_nz; P_offd_start[i1] = cnt_nz_offd; for (j = S_diag_i[i1]; j < S_diag_i[i1 + 1]; j++) { j1 = S_diag_j[j]; if (CF_marker[j1] == 1) { P_diag_pass[1][cnt_nz++] = fine_to_coarse[j1]; } } for (j = S_offd_i[i1]; j < S_offd_i[i1 + 1]; j++) { j1 = S_offd_j[j]; if (CF_marker_offd[j1] == 1) { P_offd_pass[1][cnt_nz_offd++] = map_S_to_new[j1]; } } } total_nz += cnt_nz; total_nz_offd += cnt_nz_offd; if (num_procs > 1) { Pext_send_map_start = hypre_CTAlloc(HYPRE_Int*, num_passes, HYPRE_MEMORY_HOST); Pext_recv_vec_start = hypre_CTAlloc(HYPRE_Int*, num_passes, HYPRE_MEMORY_HOST); Pext_pass = hypre_CTAlloc(HYPRE_Int*, num_passes, HYPRE_MEMORY_HOST); Pext_i = hypre_CTAlloc(HYPRE_Int, num_cols_offd + 1, HYPRE_MEMORY_HOST); if (num_cols_offd) { Pext_start = hypre_CTAlloc(HYPRE_Int, num_cols_offd, HYPRE_MEMORY_HOST); } if (send_map_start[num_sends]) { P_ncols = hypre_CTAlloc(HYPRE_Int, send_map_start[num_sends], HYPRE_MEMORY_HOST); } #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i) HYPRE_SMP_SCHEDULE #endif for (i = 0; i < num_cols_offd + 1; i++) { Pext_i[i] = 0; } #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i) HYPRE_SMP_SCHEDULE #endif for (i = 0; i < send_map_start[num_sends]; i++) { P_ncols[i] = 0; } } old_Pext_send_size = 0; old_Pext_recv_size = 0; for (pass = 2; pass < num_passes; pass++) { if (num_procs > 1) { Pext_send_map_start[pass] = hypre_CTAlloc(HYPRE_Int, num_sends + 1, HYPRE_MEMORY_HOST); Pext_recv_vec_start[pass] = hypre_CTAlloc(HYPRE_Int, num_recvs + 1, HYPRE_MEMORY_HOST); Pext_send_size = 0; Pext_send_map_start[pass][0] = 0; for (i = 0; i < num_sends; i++) { #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(j,j1) reduction(+:Pext_send_size) HYPRE_SMP_SCHEDULE #endif for (j = send_map_start[i]; j < send_map_start[i + 1]; j++) { j1 = send_map_elmt[j]; if (assigned[j1] == pass - 1) { P_ncols[j] = P_diag_i[j1 + 1] + P_offd_i[j1 + 1]; Pext_send_size += P_ncols[j]; } } Pext_send_map_start[pass][i + 1] = Pext_send_size; } comm_handle = hypre_ParCSRCommHandleCreate (11, comm_pkg, P_ncols, &Pext_i[1]); hypre_ParCSRCommHandleDestroy(comm_handle); if (Pext_send_size > old_Pext_send_size) { hypre_TFree(Pext_send_buffer, HYPRE_MEMORY_HOST); Pext_send_buffer = hypre_CTAlloc(HYPRE_BigInt, Pext_send_size, HYPRE_MEMORY_HOST); } old_Pext_send_size = Pext_send_size; } cnt_offd = 0; for (i = 0; i < num_sends; i++) { for (j = send_map_start[i]; j < send_map_start[i + 1]; j++) { j1 = send_map_elmt[j]; if (assigned[j1] == pass - 1) { j_start = P_diag_start[j1]; j_end = j_start + P_diag_i[j1 + 1]; for (k = j_start; k < j_end; k++) { Pext_send_buffer[cnt_offd++] = my_first_cpt + (HYPRE_BigInt) P_diag_pass[pass - 1][k]; } j_start = P_offd_start[j1]; j_end = j_start + P_offd_i[j1 + 1]; for (k = j_start; k < j_end; k++) { k1 = P_offd_pass[pass - 1][k]; k3 = 0; while (k3 < pass - 1) { if (k1 < new_counter[k3 + 1]) { k2 = k1 - new_counter[k3]; Pext_send_buffer[cnt_offd++] = new_elmts[k3][k2]; break; } k3++; } } } } } if (num_procs > 1) { Pext_recv_size = 0; Pext_recv_vec_start[pass][0] = 0; cnt_offd = 0; for (i = 0; i < num_recvs; i++) { for (j = recv_vec_start[i]; j < recv_vec_start[i + 1]; j++) { if (assigned_offd[j] == pass - 1) { Pext_start[j] = cnt_offd; cnt_offd += Pext_i[j + 1]; } } Pext_recv_size = cnt_offd; Pext_recv_vec_start[pass][i + 1] = Pext_recv_size; } /* Create temporary communication package */ hypre_ParCSRCommPkgCreateAndFill(comm, num_recvs, recv_procs, Pext_recv_vec_start[pass], num_sends, send_procs, Pext_send_map_start[pass], NULL, &tmp_comm_pkg); if (Pext_recv_size) { Pext_pass[pass] = hypre_CTAlloc(HYPRE_Int, Pext_recv_size, HYPRE_MEMORY_HOST); new_elmts[pass - 1] = hypre_CTAlloc(HYPRE_BigInt, Pext_recv_size, HYPRE_MEMORY_HOST); } else { Pext_pass[pass] = NULL; new_elmts[pass - 1] = NULL; } if (Pext_recv_size > old_Pext_recv_size) { hypre_TFree(loc, HYPRE_MEMORY_HOST); loc = hypre_CTAlloc(HYPRE_Int, Pext_recv_size, HYPRE_MEMORY_HOST); hypre_TFree(big_temp_pass, HYPRE_MEMORY_HOST); big_temp_pass = hypre_CTAlloc(HYPRE_BigInt, Pext_recv_size, HYPRE_MEMORY_HOST); } old_Pext_recv_size = Pext_recv_size; comm_handle = hypre_ParCSRCommHandleCreate (21, tmp_comm_pkg, Pext_send_buffer, big_temp_pass); hypre_ParCSRCommHandleDestroy(comm_handle); } cnt_new = 0; cnt_offd = 0; /* JBS: Possible candidate for threading */ for (i = 0; i < num_recvs; i++) { for (j = recv_vec_start[i]; j < recv_vec_start[i + 1]; j++) { if (assigned_offd[j] == pass - 1) { for (j1 = cnt_offd; j1 < cnt_offd + Pext_i[j + 1]; j1++) { big_k1 = big_temp_pass[j1]; k2 = (HYPRE_Int)(big_k1 - my_first_cpt); if (k2 > -1 && k2 < n_coarse) { Pext_pass[pass][j1] = -k2 - 1; } else { not_found = 1; k3 = 0; while (k3 < pass - 1 && not_found) { k2 = hypre_BigBinarySearch(new_elmts[k3], big_k1, (new_counter[k3 + 1] - new_counter[k3])); if (k2 > -1) { Pext_pass[pass][j1] = k2 + new_counter[k3]; not_found = 0; } else { k3++; } } if (not_found) { new_elmts[pass - 1][cnt_new] = big_k1; loc[cnt_new++] = j1; } } } cnt_offd += Pext_i[j + 1]; } } } if (cnt_new) { hypre_BigQsortbi(new_elmts[pass - 1], loc, 0, cnt_new - 1); cnt = 0; local_index = new_counter[pass - 1]; Pext_pass[pass][loc[0]] = local_index; for (i = 1; i < cnt_new; i++) { if (new_elmts[pass - 1][i] > new_elmts[pass - 1][cnt]) { new_elmts[pass - 1][++cnt] = new_elmts[pass - 1][i]; local_index++; } Pext_pass[pass][loc[i]] = local_index; } new_counter[pass] = local_index + 1; } else if (num_procs > 1) { new_counter[pass] = new_counter[pass - 1]; } if (new_num_cols_offd < local_index + 1) { new_num_cols_offd = local_index + 1; } pass_length = pass_pointer[pass + 1] - pass_pointer[pass]; #ifdef HYPRE_USING_OPENMP #pragma omp parallel private(i,my_thread_num,num_threads,thread_start,thread_stop,cnt_nz,cnt_nz_offd,i1,j,j1,j_start,j_end,k1,k,P_marker,P_marker_offd) #endif { /* Thread by computing the sparsity structure for this pass only over * each thread's range of rows. Rows are divided up evenly amongst * the threads. The necessary thread-wise temporary arrays, like * P_marker, are initialized and de-allocated internally to the * parallel region. */ P_marker_offd = NULL; my_thread_num = hypre_GetThreadNum(); num_threads = hypre_NumActiveThreads(); thread_start = (pass_length / num_threads) * my_thread_num; if (my_thread_num == num_threads - 1) { thread_stop = pass_length; } else { thread_stop = (pass_length / num_threads) * (my_thread_num + 1); } thread_start += pass_pointer[pass]; thread_stop += pass_pointer[pass]; /* Local initializations */ cnt_nz = 0; cnt_nz_offd = 0; /* This block of code is to go to the top of the parallel region starting before * the loop over num_passes. */ P_marker = hypre_CTAlloc(HYPRE_Int, n_coarse, HYPRE_MEMORY_HOST); /* marks points to see if they're counted */ for (i = 0; i < n_coarse; i++) { P_marker[i] = -1; } if (new_num_cols_offd == local_index + 1) { P_marker_offd = hypre_CTAlloc(HYPRE_Int, new_num_cols_offd, HYPRE_MEMORY_HOST); for (i = 0; i < new_num_cols_offd; i++) { P_marker_offd[i] = -1; } } else if (n_coarse_offd) { P_marker_offd = hypre_CTAlloc(HYPRE_Int, n_coarse_offd, HYPRE_MEMORY_HOST); for (i = 0; i < n_coarse_offd; i++) { P_marker_offd[i] = -1; } } /* Need some variables to store each threads cnt_nz and cnt_nz_offd, and * then stitch things together as in par_interp.c * This loop writes * P_diag_i, P_offd_i: data parallel here, and require no special treatment * P_diag_start, P_offd_start: are not data parallel, require special treatment */ for (i = thread_start; i < thread_stop; i++) { i1 = pass_array[i]; P_diag_start[i1] = cnt_nz; P_offd_start[i1] = cnt_nz_offd; for (j = S_diag_i[i1]; j < S_diag_i[i1 + 1]; j++) { j1 = S_diag_j[j]; if (assigned[j1] == pass - 1) { j_start = P_diag_start[j1]; j_end = j_start + P_diag_i[j1 + 1]; for (k = j_start; k < j_end; k++) { k1 = P_diag_pass[pass - 1][k]; if (P_marker[k1] != i1) { cnt_nz++; P_diag_i[i1 + 1]++; P_marker[k1] = i1; } } j_start = P_offd_start[j1]; j_end = j_start + P_offd_i[j1 + 1]; for (k = j_start; k < j_end; k++) { k1 = P_offd_pass[pass - 1][k]; if (P_marker_offd[k1] != i1) { cnt_nz_offd++; P_offd_i[i1 + 1]++; P_marker_offd[k1] = i1; } } } } j_start = 0; for (j = S_offd_i[i1]; j < S_offd_i[i1 + 1]; j++) { j1 = S_offd_j[j]; if (assigned_offd[j1] == pass - 1) { j_start = Pext_start[j1]; j_end = j_start + Pext_i[j1 + 1]; for (k = j_start; k < j_end; k++) { k1 = Pext_pass[pass][k]; if (k1 < 0) { if (P_marker[-k1 - 1] != i1) { cnt_nz++; P_diag_i[i1 + 1]++; P_marker[-k1 - 1] = i1; } } else if (P_marker_offd[k1] != i1) { cnt_nz_offd++; P_offd_i[i1 + 1]++; P_marker_offd[k1] = i1; } } } } } /* Update P_diag_start, P_offd_start with cumulative * nonzero counts over all threads */ if (my_thread_num == 0) { max_num_threads[0] = num_threads; } cnt_nz_offd_per_thread[my_thread_num] = cnt_nz_offd; cnt_nz_per_thread[my_thread_num] = cnt_nz; #ifdef HYPRE_USING_OPENMP #pragma omp barrier #endif if (my_thread_num == 0) { for (i = 1; i < max_num_threads[0]; i++) { cnt_nz_offd_per_thread[i] += cnt_nz_offd_per_thread[i - 1]; cnt_nz_per_thread[i] += cnt_nz_per_thread[i - 1]; } } #ifdef HYPRE_USING_OPENMP #pragma omp barrier #endif if (my_thread_num > 0) { /* update this thread's section of P_diag_start and P_offd_start * with the num of nz's counted by previous threads */ for (i = thread_start; i < thread_stop; i++) { i1 = pass_array[i]; P_diag_start[i1] += cnt_nz_per_thread[my_thread_num - 1]; P_offd_start[i1] += cnt_nz_offd_per_thread[my_thread_num - 1]; } } else /* if my_thread_num == 0 */ { /* Grab the nz count for all threads */ cnt_nz = cnt_nz_per_thread[max_num_threads[0] - 1]; cnt_nz_offd = cnt_nz_offd_per_thread[max_num_threads[0] - 1]; /* Updated total nz count */ total_nz += cnt_nz; total_nz_offd += cnt_nz_offd; /* Allocate P_diag_pass and P_offd_pass for all threads */ P_diag_pass[pass] = hypre_CTAlloc(HYPRE_Int, cnt_nz, HYPRE_MEMORY_HOST); if (cnt_nz_offd) { P_offd_pass[pass] = hypre_CTAlloc(HYPRE_Int, cnt_nz_offd, HYPRE_MEMORY_HOST); } else if (num_procs > 1) { P_offd_pass[pass] = NULL; } } #ifdef HYPRE_USING_OPENMP #pragma omp barrier #endif /* offset cnt_nz and cnt_nz_offd to point to the starting * point in P_diag_pass and P_offd_pass for each thread */ if (my_thread_num > 0) { cnt_nz = cnt_nz_per_thread[my_thread_num - 1]; cnt_nz_offd = cnt_nz_offd_per_thread[my_thread_num - 1]; } else { cnt_nz = 0; cnt_nz_offd = 0; } /* Set P_diag_pass and P_offd_pass */ for (i = thread_start; i < thread_stop; i++) { i1 = pass_array[i]; for (j = S_diag_i[i1]; j < S_diag_i[i1 + 1]; j++) { j1 = S_diag_j[j]; if (assigned[j1] == pass - 1) { j_start = P_diag_start[j1]; j_end = j_start + P_diag_i[j1 + 1]; for (k = j_start; k < j_end; k++) { k1 = P_diag_pass[pass - 1][k]; if (P_marker[k1] != -i1 - 1) { P_diag_pass[pass][cnt_nz++] = k1; P_marker[k1] = -i1 - 1; } } j_start = P_offd_start[j1]; j_end = j_start + P_offd_i[j1 + 1]; for (k = j_start; k < j_end; k++) { k1 = P_offd_pass[pass - 1][k]; if (P_marker_offd[k1] != -i1 - 1) { P_offd_pass[pass][cnt_nz_offd++] = k1; P_marker_offd[k1] = -i1 - 1; } } } } for (j = S_offd_i[i1]; j < S_offd_i[i1 + 1]; j++) { j1 = S_offd_j[j]; if (assigned_offd[j1] == pass - 1) { j_start = Pext_start[j1]; j_end = j_start + Pext_i[j1 + 1]; for (k = j_start; k < j_end; k++) { k1 = Pext_pass[pass][k]; if (k1 < 0) { if (P_marker[-k1 - 1] != -i1 - 1) { P_diag_pass[pass][cnt_nz++] = -k1 - 1; P_marker[-k1 - 1] = -i1 - 1; } } else if (P_marker_offd[k1] != -i1 - 1) { P_offd_pass[pass][cnt_nz_offd++] = k1; P_marker_offd[k1] = -i1 - 1; } } } } } hypre_TFree(P_marker, HYPRE_MEMORY_HOST); if ( (n_coarse_offd) || (new_num_cols_offd == local_index + 1) ) { hypre_TFree(P_marker_offd, HYPRE_MEMORY_HOST); } } /* End parallel region */ } hypre_TFree(loc, HYPRE_MEMORY_HOST); hypre_TFree(P_ncols, HYPRE_MEMORY_HOST); hypre_TFree(Pext_send_buffer, HYPRE_MEMORY_HOST); hypre_TFree(big_temp_pass, HYPRE_MEMORY_HOST); hypre_TFree(new_recv_vec_start, HYPRE_MEMORY_HOST); hypre_TFree(cnt_nz_per_thread, HYPRE_MEMORY_HOST); hypre_TFree(cnt_nz_offd_per_thread, HYPRE_MEMORY_HOST); hypre_TFree(max_num_threads, HYPRE_MEMORY_HOST); P_diag_j = hypre_CTAlloc(HYPRE_Int, total_nz, memory_location_P); P_diag_data = hypre_CTAlloc(HYPRE_Real, total_nz, memory_location_P); if (total_nz_offd) { P_offd_j = hypre_CTAlloc(HYPRE_Int, total_nz_offd, memory_location_P); P_offd_data = hypre_CTAlloc(HYPRE_Real, total_nz_offd, memory_location_P); } for (i = 0; i < n_fine; i++) { P_diag_i[i + 1] += P_diag_i[i]; P_offd_i[i + 1] += P_offd_i[i]; } /* determine P for coarse points */ #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i,i1) HYPRE_SMP_SCHEDULE #endif for (i = 0; i < n_coarse; i++) { i1 = C_array[i]; P_diag_j[P_diag_i[i1]] = fine_to_coarse[i1]; P_diag_data[P_diag_i[i1]] = 1.0; } if (weight_option) /*if this is set, weights are separated into negative and positive offdiagonals and accumulated accordingly */ { pass_length = pass_pointer[2] - pass_pointer[1]; #ifdef HYPRE_USING_OPENMP #pragma omp parallel private(thread_start,thread_stop,my_thread_num,num_threads,P_marker,P_marker_offd,i,i1,sum_C_pos,sum_C_neg,sum_N_pos,sum_N_neg,j_start,j_end,j,k1,cnt,j1,cnt_offd,diagonal,alfa,beta) #endif { /* Sparsity structure is now finished. Next, calculate interpolation * weights for pass one. Thread by computing the interpolation * weights only over each thread's range of rows. Rows are divided * up evenly amongst the threads. */ alfa = beta = 1.0; P_marker_offd = C_array_offd = NULL; P_marker = hypre_CTAlloc(HYPRE_Int, n_fine, HYPRE_MEMORY_HOST); for (i = 0; i < n_fine; i++) { P_marker[i] = -1; } if (num_cols_offd) { P_marker_offd = hypre_CTAlloc(HYPRE_Int, num_cols_offd, HYPRE_MEMORY_HOST); for (i = 0; i < num_cols_offd; i++) { P_marker_offd[i] = -1; } } /* Compute this thread's range of pass_length */ my_thread_num = hypre_GetThreadNum(); num_threads = hypre_NumActiveThreads(); thread_start = pass_pointer[1] + (pass_length / num_threads) * my_thread_num; if (my_thread_num == num_threads - 1) { thread_stop = pass_pointer[1] + pass_length; } else { thread_stop = pass_pointer[1] + (pass_length / num_threads) * (my_thread_num + 1); } /* determine P for points of pass 1, i.e. neighbors of coarse points */ for (i = thread_start; i < thread_stop; i++) { i1 = pass_array[i]; sum_C_pos = 0; sum_C_neg = 0; sum_N_pos = 0; sum_N_neg = 0; j_start = P_diag_start[i1]; j_end = j_start + P_diag_i[i1 + 1] - P_diag_i[i1]; for (j = j_start; j < j_end; j++) { k1 = P_diag_pass[1][j]; P_marker[C_array[k1]] = i1; } cnt = P_diag_i[i1]; for (j = A_diag_i[i1] + 1; j < A_diag_i[i1 + 1]; j++) { j1 = A_diag_j[j]; if (CF_marker[j1] != -3 && (num_functions == 1 || dof_func[i1] == dof_func[j1])) { if (A_diag_data[j] < 0) { sum_N_neg += A_diag_data[j]; } else { sum_N_pos += A_diag_data[j]; } } if (j1 != -1 && P_marker[j1] == i1) { P_diag_data[cnt] = A_diag_data[j]; P_diag_j[cnt++] = fine_to_coarse[j1]; if (A_diag_data[j] < 0) { sum_C_neg += A_diag_data[j]; } else { sum_C_pos += A_diag_data[j]; } } } j_start = P_offd_start[i1]; j_end = j_start + P_offd_i[i1 + 1] - P_offd_i[i1]; for (j = j_start; j < j_end; j++) { k1 = P_offd_pass[1][j]; P_marker_offd[C_array_offd[k1]] = i1; } cnt_offd = P_offd_i[i1]; for (j = A_offd_i[i1]; j < A_offd_i[i1 + 1]; j++) { j1 = A_offd_j[j]; if (CF_marker_offd[j1] != -3 && (num_functions == 1 || dof_func[i1] == dof_func_offd[j1])) { if (A_offd_data[j] < 0) { sum_N_neg += A_offd_data[j]; } else { sum_N_pos += A_offd_data[j]; } } if (j1 != -1 && P_marker_offd[j1] == i1) { P_offd_data[cnt_offd] = A_offd_data[j]; P_offd_j[cnt_offd++] = map_S_to_new[j1]; if (A_offd_data[j] < 0) { sum_C_neg += A_offd_data[j]; } else { sum_C_pos += A_offd_data[j]; } } } diagonal = A_diag_data[A_diag_i[i1]]; if (sum_C_neg * diagonal != 0) { alfa = -sum_N_neg / (sum_C_neg * diagonal); } if (sum_C_pos * diagonal != 0) { beta = -sum_N_pos / (sum_C_pos * diagonal); } for (j = P_diag_i[i1]; j < cnt; j++) if (P_diag_data[j] < 0) { P_diag_data[j] *= alfa; } else { P_diag_data[j] *= beta; } for (j = P_offd_i[i1]; j < cnt_offd; j++) if (P_offd_data[j] < 0) { P_offd_data[j] *= alfa; } else { P_offd_data[j] *= beta; } } hypre_TFree(P_marker, HYPRE_MEMORY_HOST); if (num_cols_offd) { hypre_TFree(P_marker_offd, HYPRE_MEMORY_HOST); } } /* End Parallel Region */ old_Pext_send_size = 0; old_Pext_recv_size = 0; if (n_coarse) { hypre_TFree(C_array, HYPRE_MEMORY_HOST); } hypre_TFree(C_array_offd, HYPRE_MEMORY_HOST); hypre_TFree(P_diag_pass[1], HYPRE_MEMORY_HOST); if (num_procs > 1) { hypre_TFree(P_offd_pass[1], HYPRE_MEMORY_HOST); } for (pass = 2; pass < num_passes; pass++) { if (num_procs > 1) { Pext_send_size = Pext_send_map_start[pass][num_sends]; if (Pext_send_size > old_Pext_send_size) { hypre_TFree(Pext_send_data, HYPRE_MEMORY_HOST); Pext_send_data = hypre_CTAlloc(HYPRE_Real, Pext_send_size, HYPRE_MEMORY_HOST); } old_Pext_send_size = Pext_send_size; cnt_offd = 0; for (i = 0; i < num_sends; i++) { for (j = send_map_start[i]; j < send_map_start[i + 1]; j++) { j1 = send_map_elmt[j]; if (assigned[j1] == pass - 1) { j_start = P_diag_i[j1]; j_end = P_diag_i[j1 + 1]; for (k = j_start; k < j_end; k++) { Pext_send_data[cnt_offd++] = P_diag_data[k]; } j_start = P_offd_i[j1]; j_end = P_offd_i[j1 + 1]; for (k = j_start; k < j_end; k++) { Pext_send_data[cnt_offd++] = P_offd_data[k]; } } } } hypre_ParCSRCommPkgNumSends(tmp_comm_pkg) = num_sends; hypre_ParCSRCommPkgSendMapStarts(tmp_comm_pkg) = Pext_send_map_start[pass]; hypre_ParCSRCommPkgNumRecvs(tmp_comm_pkg) = num_recvs; hypre_ParCSRCommPkgRecvVecStarts(tmp_comm_pkg) = Pext_recv_vec_start[pass]; Pext_recv_size = Pext_recv_vec_start[pass][num_recvs]; if (Pext_recv_size > old_Pext_recv_size) { hypre_TFree(Pext_data, HYPRE_MEMORY_HOST); Pext_data = hypre_CTAlloc(HYPRE_Real, Pext_recv_size, HYPRE_MEMORY_HOST); } old_Pext_recv_size = Pext_recv_size; comm_handle = hypre_ParCSRCommHandleCreate (1, tmp_comm_pkg, Pext_send_data, Pext_data); hypre_ParCSRCommHandleDestroy(comm_handle); hypre_TFree(Pext_send_map_start[pass], HYPRE_MEMORY_HOST); hypre_TFree(Pext_recv_vec_start[pass], HYPRE_MEMORY_HOST); } pass_length = pass_pointer[pass + 1] - pass_pointer[pass]; #ifdef HYPRE_USING_OPENMP #pragma omp parallel private(thread_start,thread_stop,my_thread_num,num_threads,P_marker,P_marker_offd,i,i1,sum_C_neg,sum_C_pos,sum_N_neg,sum_N_pos,j_start,j_end,cnt,j,k1,cnt_offd,j1,k,alfa,beta,diagonal,C_array,C_array_offd) #endif { /* Sparsity structure is now finished. Next, calculate interpolation * weights for passes >= 2. Thread by computing the interpolation * weights only over each thread's range of rows. Rows are divided * up evenly amongst the threads. */ alfa = beta = 1.0; P_marker_offd = NULL; P_marker = hypre_CTAlloc(HYPRE_Int, n_fine, HYPRE_MEMORY_HOST); for (i = 0; i < n_fine; i++) { P_marker[i] = -1; } if (num_cols_offd) { P_marker_offd = hypre_CTAlloc(HYPRE_Int, num_cols_offd, HYPRE_MEMORY_HOST); for (i = 0; i < num_cols_offd; i++) { P_marker_offd[i] = -1; } } C_array = NULL; C_array_offd = NULL; if (n_coarse) { C_array = hypre_CTAlloc(HYPRE_Int, n_coarse, HYPRE_MEMORY_HOST); } if (new_num_cols_offd > n_coarse_offd) { C_array_offd = hypre_CTAlloc(HYPRE_Int, new_num_cols_offd, HYPRE_MEMORY_HOST); } else if (n_coarse_offd) { C_array_offd = hypre_CTAlloc(HYPRE_Int, n_coarse_offd, HYPRE_MEMORY_HOST); } /* Compute this thread's range of pass_length */ my_thread_num = hypre_GetThreadNum(); num_threads = hypre_NumActiveThreads(); thread_start = pass_pointer[pass] + (pass_length / num_threads) * my_thread_num; if (my_thread_num == num_threads - 1) { thread_stop = pass_pointer[pass] + pass_length; } else { thread_stop = pass_pointer[pass] + (pass_length / num_threads) * (my_thread_num + 1); } /* Loop over each thread's row-range */ for (i = thread_start; i < thread_stop; i++) { i1 = pass_array[i]; sum_C_neg = 0; sum_C_pos = 0; sum_N_neg = 0; sum_N_pos = 0; j_start = P_diag_start[i1]; j_end = j_start + P_diag_i[i1 + 1] - P_diag_i[i1]; cnt = P_diag_i[i1]; for (j = j_start; j < j_end; j++) { k1 = P_diag_pass[pass][j]; C_array[k1] = cnt; P_diag_data[cnt] = 0; P_diag_j[cnt++] = k1; } j_start = P_offd_start[i1]; j_end = j_start + P_offd_i[i1 + 1] - P_offd_i[i1]; cnt_offd = P_offd_i[i1]; for (j = j_start; j < j_end; j++) { k1 = P_offd_pass[pass][j]; C_array_offd[k1] = cnt_offd; P_offd_data[cnt_offd] = 0; P_offd_j[cnt_offd++] = k1; } for (j = S_diag_i[i1]; j < S_diag_i[i1 + 1]; j++) { j1 = S_diag_j[j]; if (assigned[j1] == pass - 1) { P_marker[j1] = i1; } } for (j = S_offd_i[i1]; j < S_offd_i[i1 + 1]; j++) { j1 = S_offd_j[j]; if (assigned_offd[j1] == pass - 1) { P_marker_offd[j1] = i1; } } for (j = A_diag_i[i1] + 1; j < A_diag_i[i1 + 1]; j++) { j1 = A_diag_j[j]; if (P_marker[j1] == i1) { for (k = P_diag_i[j1]; k < P_diag_i[j1 + 1]; k++) { k1 = P_diag_j[k]; alfa = A_diag_data[j] * P_diag_data[k]; P_diag_data[C_array[k1]] += alfa; if (alfa < 0) { sum_C_neg += alfa; sum_N_neg += alfa; } else { sum_C_pos += alfa; sum_N_pos += alfa; } } for (k = P_offd_i[j1]; k < P_offd_i[j1 + 1]; k++) { k1 = P_offd_j[k]; alfa = A_diag_data[j] * P_offd_data[k]; P_offd_data[C_array_offd[k1]] += alfa; if (alfa < 0) { sum_C_neg += alfa; sum_N_neg += alfa; } else { sum_C_pos += alfa; sum_N_pos += alfa; } } } else { if (CF_marker[j1] != -3 && (num_functions == 1 || dof_func[i1] == dof_func[j1])) { if (A_diag_data[j] < 0) { sum_N_neg += A_diag_data[j]; } else { sum_N_pos += A_diag_data[j]; } } } } for (j = A_offd_i[i1]; j < A_offd_i[i1 + 1]; j++) { j1 = A_offd_j[j]; if (j1 > -1 && P_marker_offd[j1] == i1) { j_start = Pext_start[j1]; j_end = j_start + Pext_i[j1 + 1]; for (k = j_start; k < j_end; k++) { k1 = Pext_pass[pass][k]; alfa = A_offd_data[j] * Pext_data[k]; if (k1 < 0) { P_diag_data[C_array[-k1 - 1]] += alfa; } else { P_offd_data[C_array_offd[k1]] += alfa; } if (alfa < 0) { sum_C_neg += alfa; sum_N_neg += alfa; } else { sum_C_pos += alfa; sum_N_pos += alfa; } } } else { if (CF_marker_offd[j1] != -3 && (num_functions == 1 || dof_func_offd[j1] == dof_func[i1])) { if ( A_offd_data[j] < 0) { sum_N_neg += A_offd_data[j]; } else { sum_N_pos += A_offd_data[j]; } } } } diagonal = A_diag_data[A_diag_i[i1]]; if (sum_C_neg * diagonal != 0) { alfa = -sum_N_neg / (sum_C_neg * diagonal); } if (sum_C_pos * diagonal != 0) { beta = -sum_N_pos / (sum_C_pos * diagonal); } for (j = P_diag_i[i1]; j < P_diag_i[i1 + 1]; j++) if (P_diag_data[j] < 0) { P_diag_data[j] *= alfa; } else { P_diag_data[j] *= beta; } for (j = P_offd_i[i1]; j < P_offd_i[i1 + 1]; j++) if (P_offd_data[j] < 0) { P_offd_data[j] *= alfa; } else { P_offd_data[j] *= beta; } } hypre_TFree(C_array, HYPRE_MEMORY_HOST); hypre_TFree(C_array_offd, HYPRE_MEMORY_HOST); hypre_TFree(P_marker, HYPRE_MEMORY_HOST); if (num_cols_offd) { hypre_TFree(P_marker_offd, HYPRE_MEMORY_HOST); } } /* End OMP Parallel Section */ hypre_TFree(P_diag_pass[pass], HYPRE_MEMORY_HOST); if (num_procs > 1) { hypre_TFree(P_offd_pass[pass], HYPRE_MEMORY_HOST); hypre_TFree(Pext_pass[pass], HYPRE_MEMORY_HOST); } } /* End num_passes for-loop */ } else /* no distinction between positive and negative offdiagonal element */ { pass_length = pass_pointer[2] - pass_pointer[1]; #ifdef HYPRE_USING_OPENMP #pragma omp parallel private(thread_start,thread_stop,my_thread_num,num_threads,k,k1,i,i1,j,j1,sum_C,sum_N,j_start,j_end,cnt,tmp_marker,tmp_marker_offd,cnt_offd,diagonal,alfa) #endif { /* Sparsity structure is now finished. Next, calculate interpolation * weights for pass one. Thread by computing the interpolation * weights only over each thread's range of rows. Rows are divided * up evenly amongst the threads. */ /* Initialize thread-wise variables */ alfa = 1.0; tmp_marker = NULL; if (n_fine) { tmp_marker = hypre_CTAlloc(HYPRE_Int, n_fine, HYPRE_MEMORY_HOST); } tmp_marker_offd = NULL; if (num_cols_offd) { tmp_marker_offd = hypre_CTAlloc(HYPRE_Int, num_cols_offd, HYPRE_MEMORY_HOST); } for (i = 0; i < n_fine; i++) { tmp_marker[i] = -1; } for (i = 0; i < num_cols_offd; i++) { tmp_marker_offd[i] = -1; } /* Compute this thread's range of pass_length */ my_thread_num = hypre_GetThreadNum(); num_threads = hypre_NumActiveThreads(); thread_start = pass_pointer[1] + (pass_length / num_threads) * my_thread_num; if (my_thread_num == num_threads - 1) { thread_stop = pass_pointer[1] + pass_length; } else { thread_stop = pass_pointer[1] + (pass_length / num_threads) * (my_thread_num + 1); } /* determine P for points of pass 1, i.e. neighbors of coarse points */ for (i = thread_start; i < thread_stop; i++) { i1 = pass_array[i]; sum_C = 0; sum_N = 0; j_start = P_diag_start[i1]; j_end = j_start + P_diag_i[i1 + 1] - P_diag_i[i1]; for (j = j_start; j < j_end; j++) { k1 = P_diag_pass[1][j]; tmp_marker[C_array[k1]] = i1; } cnt = P_diag_i[i1]; for (j = A_diag_i[i1] + 1; j < A_diag_i[i1 + 1]; j++) { j1 = A_diag_j[j]; if (CF_marker[j1] != -3 && (num_functions == 1 || dof_func[i1] == dof_func[j1])) { sum_N += A_diag_data[j]; } if (j1 != -1 && tmp_marker[j1] == i1) { P_diag_data[cnt] = A_diag_data[j]; P_diag_j[cnt++] = fine_to_coarse[j1]; sum_C += A_diag_data[j]; } } j_start = P_offd_start[i1]; j_end = j_start + P_offd_i[i1 + 1] - P_offd_i[i1]; for (j = j_start; j < j_end; j++) { k1 = P_offd_pass[1][j]; tmp_marker_offd[C_array_offd[k1]] = i1; } cnt_offd = P_offd_i[i1]; for (j = A_offd_i[i1]; j < A_offd_i[i1 + 1]; j++) { j1 = A_offd_j[j]; if (CF_marker_offd[j1] != -3 && (num_functions == 1 || dof_func[i1] == dof_func_offd[j1])) { sum_N += A_offd_data[j]; } if (j1 != -1 && tmp_marker_offd[j1] == i1) { P_offd_data[cnt_offd] = A_offd_data[j]; P_offd_j[cnt_offd++] = map_S_to_new[j1]; sum_C += A_offd_data[j]; } } diagonal = A_diag_data[A_diag_i[i1]]; if (sum_C * diagonal != 0) { alfa = -sum_N / (sum_C * diagonal); } for (j = P_diag_i[i1]; j < cnt; j++) { P_diag_data[j] *= alfa; } for (j = P_offd_i[i1]; j < cnt_offd; j++) { P_offd_data[j] *= alfa; } } hypre_TFree(tmp_marker, HYPRE_MEMORY_HOST); hypre_TFree(tmp_marker_offd, HYPRE_MEMORY_HOST); } /* end OMP parallel region */ old_Pext_send_size = 0; old_Pext_recv_size = 0; if (n_coarse) { hypre_TFree(C_array, HYPRE_MEMORY_HOST); } hypre_TFree(C_array_offd, HYPRE_MEMORY_HOST); hypre_TFree(P_diag_pass[1], HYPRE_MEMORY_HOST); if (num_procs > 1) { hypre_TFree(P_offd_pass[1], HYPRE_MEMORY_HOST); } for (pass = 2; pass < num_passes; pass++) { if (num_procs > 1) { Pext_send_size = Pext_send_map_start[pass][num_sends]; if (Pext_send_size > old_Pext_send_size) { hypre_TFree(Pext_send_data, HYPRE_MEMORY_HOST); Pext_send_data = hypre_CTAlloc(HYPRE_Real, Pext_send_size, HYPRE_MEMORY_HOST); } old_Pext_send_size = Pext_send_size; cnt_offd = 0; for (i = 0; i < num_sends; i++) { for (j = send_map_start[i]; j < send_map_start[i + 1]; j++) { j1 = send_map_elmt[j]; if (assigned[j1] == pass - 1) { j_start = P_diag_i[j1]; j_end = P_diag_i[j1 + 1]; for (k = j_start; k < j_end; k++) { Pext_send_data[cnt_offd++] = P_diag_data[k]; } j_start = P_offd_i[j1]; j_end = P_offd_i[j1 + 1]; for (k = j_start; k < j_end; k++) { Pext_send_data[cnt_offd++] = P_offd_data[k]; } } } } hypre_ParCSRCommPkgNumSends(tmp_comm_pkg) = num_sends; hypre_ParCSRCommPkgSendMapStarts(tmp_comm_pkg) = Pext_send_map_start[pass]; hypre_ParCSRCommPkgNumRecvs(tmp_comm_pkg) = num_recvs; hypre_ParCSRCommPkgRecvVecStarts(tmp_comm_pkg) = Pext_recv_vec_start[pass]; Pext_recv_size = Pext_recv_vec_start[pass][num_recvs]; if (Pext_recv_size > old_Pext_recv_size) { hypre_TFree(Pext_data, HYPRE_MEMORY_HOST); Pext_data = hypre_CTAlloc(HYPRE_Real, Pext_recv_size, HYPRE_MEMORY_HOST); } old_Pext_recv_size = Pext_recv_size; comm_handle = hypre_ParCSRCommHandleCreate (1, tmp_comm_pkg, Pext_send_data, Pext_data); hypre_ParCSRCommHandleDestroy(comm_handle); hypre_TFree(Pext_send_map_start[pass], HYPRE_MEMORY_HOST); hypre_TFree(Pext_recv_vec_start[pass], HYPRE_MEMORY_HOST); } pass_length = pass_pointer[pass + 1] - pass_pointer[pass]; #ifdef HYPRE_USING_OPENMP #pragma omp parallel private(thread_start,thread_stop,my_thread_num,num_threads,k,k1,i,i1,j,j1,sum_C,sum_N,j_start,j_end,cnt,tmp_marker,tmp_marker_offd,cnt_offd,diagonal,alfa,tmp_array,tmp_array_offd) #endif { /* Sparsity structure is now finished. Next, calculate interpolation * weights for passes >= 2. Thread by computing the interpolation * weights only over each thread's range of rows. Rows are divided * up evenly amongst the threads. */ /* Initialize thread-wise variables */ alfa = beta = 1.0; tmp_marker = NULL; if (n_fine) { tmp_marker = hypre_CTAlloc(HYPRE_Int, n_fine, HYPRE_MEMORY_HOST); } tmp_marker_offd = NULL; if (num_cols_offd) { tmp_marker_offd = hypre_CTAlloc(HYPRE_Int, num_cols_offd, HYPRE_MEMORY_HOST); } tmp_array = NULL; if (n_coarse) { tmp_array = hypre_CTAlloc(HYPRE_Int, n_coarse, HYPRE_MEMORY_HOST); } tmp_array_offd = NULL; if (new_num_cols_offd > n_coarse_offd) { tmp_array_offd = hypre_CTAlloc(HYPRE_Int, new_num_cols_offd, HYPRE_MEMORY_HOST); } else { tmp_array_offd = hypre_CTAlloc(HYPRE_Int, n_coarse_offd, HYPRE_MEMORY_HOST);} for (i = 0; i < n_fine; i++) { tmp_marker[i] = -1; } for (i = 0; i < num_cols_offd; i++) { tmp_marker_offd[i] = -1; } /* Compute this thread's range of pass_length */ my_thread_num = hypre_GetThreadNum(); num_threads = hypre_NumActiveThreads(); thread_start = pass_pointer[pass] + (pass_length / num_threads) * my_thread_num; if (my_thread_num == num_threads - 1) { thread_stop = pass_pointer[pass] + pass_length; } else { thread_stop = pass_pointer[pass] + (pass_length / num_threads) * (my_thread_num + 1); } for (i = thread_start; i < thread_stop; i++) { i1 = pass_array[i]; sum_C = 0; sum_N = 0; j_start = P_diag_start[i1]; j_end = j_start + P_diag_i[i1 + 1] - P_diag_i[i1]; cnt = P_diag_i[i1]; for (j = j_start; j < j_end; j++) { k1 = P_diag_pass[pass][j]; tmp_array[k1] = cnt; P_diag_data[cnt] = 0; P_diag_j[cnt++] = k1; } j_start = P_offd_start[i1]; j_end = j_start + P_offd_i[i1 + 1] - P_offd_i[i1]; cnt_offd = P_offd_i[i1]; for (j = j_start; j < j_end; j++) { k1 = P_offd_pass[pass][j]; tmp_array_offd[k1] = cnt_offd; P_offd_data[cnt_offd] = 0; P_offd_j[cnt_offd++] = k1; } for (j = S_diag_i[i1]; j < S_diag_i[i1 + 1]; j++) { j1 = S_diag_j[j]; if (assigned[j1] == pass - 1) { tmp_marker[j1] = i1; } } for (j = S_offd_i[i1]; j < S_offd_i[i1 + 1]; j++) { j1 = S_offd_j[j]; if (assigned_offd[j1] == pass - 1) { tmp_marker_offd[j1] = i1; } } for (j = A_diag_i[i1] + 1; j < A_diag_i[i1 + 1]; j++) { j1 = A_diag_j[j]; if (tmp_marker[j1] == i1) { for (k = P_diag_i[j1]; k < P_diag_i[j1 + 1]; k++) { k1 = P_diag_j[k]; alfa = A_diag_data[j] * P_diag_data[k]; P_diag_data[tmp_array[k1]] += alfa; sum_C += alfa; sum_N += alfa; } for (k = P_offd_i[j1]; k < P_offd_i[j1 + 1]; k++) { k1 = P_offd_j[k]; alfa = A_diag_data[j] * P_offd_data[k]; P_offd_data[tmp_array_offd[k1]] += alfa; sum_C += alfa; sum_N += alfa; } } else { if (CF_marker[j1] != -3 && (num_functions == 1 || dof_func[i1] == dof_func[j1])) { sum_N += A_diag_data[j]; } } } for (j = A_offd_i[i1]; j < A_offd_i[i1 + 1]; j++) { j1 = A_offd_j[j]; if (j1 > -1 && tmp_marker_offd[j1] == i1) { j_start = Pext_start[j1]; j_end = j_start + Pext_i[j1 + 1]; for (k = j_start; k < j_end; k++) { k1 = Pext_pass[pass][k]; alfa = A_offd_data[j] * Pext_data[k]; if (k1 < 0) { P_diag_data[tmp_array[-k1 - 1]] += alfa; } else { P_offd_data[tmp_array_offd[k1]] += alfa; } sum_C += alfa; sum_N += alfa; } } else { if (CF_marker_offd[j1] != -3 && (num_functions == 1 || dof_func_offd[j1] == dof_func[i1])) { sum_N += A_offd_data[j]; } } } diagonal = A_diag_data[A_diag_i[i1]]; if (sum_C * diagonal != 0.0) { alfa = -sum_N / (sum_C * diagonal); } for (j = P_diag_i[i1]; j < P_diag_i[i1 + 1]; j++) { P_diag_data[j] *= alfa; } for (j = P_offd_i[i1]; j < P_offd_i[i1 + 1]; j++) { P_offd_data[j] *= alfa; } } hypre_TFree(tmp_marker, HYPRE_MEMORY_HOST); hypre_TFree(tmp_marker_offd, HYPRE_MEMORY_HOST); hypre_TFree(tmp_array, HYPRE_MEMORY_HOST); hypre_TFree(tmp_array_offd, HYPRE_MEMORY_HOST); } /* End OMP Parallel Section */ hypre_TFree(P_diag_pass[pass], HYPRE_MEMORY_HOST); if (num_procs > 1) { hypre_TFree(P_offd_pass[pass], HYPRE_MEMORY_HOST); hypre_TFree(Pext_pass[pass], HYPRE_MEMORY_HOST); } } } hypre_TFree(CF_marker_offd, HYPRE_MEMORY_HOST); hypre_TFree(Pext_send_map_start, HYPRE_MEMORY_HOST); hypre_TFree(Pext_recv_vec_start, HYPRE_MEMORY_HOST); hypre_TFree(dof_func_offd, HYPRE_MEMORY_HOST); hypre_TFree(Pext_send_data, HYPRE_MEMORY_HOST); hypre_TFree(Pext_data, HYPRE_MEMORY_HOST); hypre_TFree(P_diag_pass, HYPRE_MEMORY_HOST); hypre_TFree(P_offd_pass, HYPRE_MEMORY_HOST); hypre_TFree(Pext_pass, HYPRE_MEMORY_HOST); hypre_TFree(P_diag_start, HYPRE_MEMORY_HOST); hypre_TFree(P_offd_start, HYPRE_MEMORY_HOST); hypre_TFree(Pext_start, HYPRE_MEMORY_HOST); hypre_TFree(Pext_i, HYPRE_MEMORY_HOST); hypre_TFree(fine_to_coarse, HYPRE_MEMORY_HOST); hypre_TFree(assigned, HYPRE_MEMORY_HOST); hypre_TFree(assigned_offd, HYPRE_MEMORY_HOST); hypre_TFree(pass_pointer, HYPRE_MEMORY_HOST); hypre_TFree(pass_array, HYPRE_MEMORY_HOST); hypre_TFree(map_S_to_new, HYPRE_MEMORY_HOST); if (num_procs > 1) { hypre_TFree(tmp_comm_pkg, HYPRE_MEMORY_HOST); } P = hypre_ParCSRMatrixCreate(comm, hypre_ParCSRMatrixGlobalNumRows(A), total_global_cpts, hypre_ParCSRMatrixColStarts(A), num_cpts_global, 0, P_diag_i[n_fine], P_offd_i[n_fine]); P_diag = hypre_ParCSRMatrixDiag(P); hypre_CSRMatrixData(P_diag) = P_diag_data; hypre_CSRMatrixI(P_diag) = P_diag_i; hypre_CSRMatrixJ(P_diag) = P_diag_j; P_offd = hypre_ParCSRMatrixOffd(P); hypre_CSRMatrixData(P_offd) = P_offd_data; hypre_CSRMatrixI(P_offd) = P_offd_i; hypre_CSRMatrixJ(P_offd) = P_offd_j; /* Compress P, removing coefficients smaller than trunc_factor * Max and/or keep yat most per row absolutely maximal coefficients */ if (trunc_factor != 0.0 || P_max_elmts != 0) { hypre_BoomerAMGInterpTruncation(P, trunc_factor, P_max_elmts); P_diag_data = hypre_CSRMatrixData(P_diag); P_diag_i = hypre_CSRMatrixI(P_diag); P_diag_j = hypre_CSRMatrixJ(P_diag); P_offd_data = hypre_CSRMatrixData(P_offd); P_offd_i = hypre_CSRMatrixI(P_offd); P_offd_j = hypre_CSRMatrixJ(P_offd); } P_offd_size = P_offd_i[n_fine]; num_cols_offd_P = 0; if (P_offd_size) { if (new_num_cols_offd > num_cols_offd) { P_marker_offd = hypre_CTAlloc(HYPRE_Int, new_num_cols_offd, HYPRE_MEMORY_HOST); } else { P_marker_offd = hypre_CTAlloc(HYPRE_Int, num_cols_offd, HYPRE_MEMORY_HOST); } #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i) HYPRE_SMP_SCHEDULE #endif for (i = 0; i < new_num_cols_offd; i++) { P_marker_offd[i] = 0; } num_cols_offd_P = 0; for (i = 0; i < P_offd_size; i++) { index = P_offd_j[i]; if (!P_marker_offd[index]) { num_cols_offd_P++; P_marker_offd[index] = 1; } } col_map_offd_P = hypre_CTAlloc(HYPRE_BigInt, num_cols_offd_P, HYPRE_MEMORY_HOST); permute = hypre_CTAlloc(HYPRE_Int, new_counter[num_passes - 1], HYPRE_MEMORY_HOST); big_permute = hypre_CTAlloc(HYPRE_BigInt, new_counter[num_passes - 1], HYPRE_MEMORY_HOST); #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i) HYPRE_SMP_SCHEDULE #endif for (i = 0; i < new_counter[num_passes - 1]; i++) { big_permute[i] = -1; } cnt = 0; for (i = 0; i < num_passes - 1; i++) { for (j = new_counter[i]; j < new_counter[i + 1]; j++) { if (P_marker_offd[j]) { col_map_offd_P[cnt] = new_elmts[i][j - (HYPRE_BigInt)new_counter[i]]; big_permute[j] = col_map_offd_P[cnt++]; } } } hypre_BigQsort0(col_map_offd_P, 0, num_cols_offd_P - 1); #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i,big_k1) HYPRE_SMP_SCHEDULE #endif for (i = 0; i < new_counter[num_passes - 1]; i++) { big_k1 = big_permute[i]; if (big_k1 != -1) { permute[i] = hypre_BigBinarySearch(col_map_offd_P, big_k1, num_cols_offd_P); } } #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i) HYPRE_SMP_SCHEDULE #endif for (i = 0; i < P_offd_size; i++) { P_offd_j[i] = permute[P_offd_j[i]]; } hypre_TFree(P_marker_offd, HYPRE_MEMORY_HOST); } if (num_procs > 1) { for (i = 0; i < num_passes - 1; i++) { hypre_TFree(new_elmts[i], HYPRE_MEMORY_HOST); } } hypre_TFree(permute, HYPRE_MEMORY_HOST); hypre_TFree(big_permute, HYPRE_MEMORY_HOST); hypre_TFree(new_elmts, HYPRE_MEMORY_HOST); hypre_TFree(new_counter, HYPRE_MEMORY_HOST); if (num_cols_offd_P) { hypre_ParCSRMatrixColMapOffd(P) = col_map_offd_P; hypre_CSRMatrixNumCols(P_offd) = num_cols_offd_P; } if (n_SF) { #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i) HYPRE_SMP_SCHEDULE #endif for (i = 0; i < n_fine; i++) if (CF_marker[i] == -3) { CF_marker[i] = -1; } } if (num_procs > 1) { hypre_MatvecCommPkgCreate(P); } *P_ptr = P; /* wall_time = hypre_MPI_Wtime() - wall_time; hypre_printf("TOTAL TIME %1.2e \n",wall_time); */ /*----------------------------------------------------------------------- * Build and return dof_func array for coarse grid. *-----------------------------------------------------------------------*/ /*----------------------------------------------------------------------- * Free mapping vector and marker array. *-----------------------------------------------------------------------*/ #ifdef HYPRE_PROFILE hypre_profile_times[HYPRE_TIMER_ID_MULTIPASS_INTERP] += hypre_MPI_Wtime(); #endif return (0); } HYPRE_Int hypre_BoomerAMGBuildMultipass( hypre_ParCSRMatrix *A, HYPRE_Int *CF_marker, hypre_ParCSRMatrix *S, HYPRE_BigInt *num_cpts_global, HYPRE_Int num_functions, HYPRE_Int *dof_func, HYPRE_Int debug_flag, HYPRE_Real trunc_factor, HYPRE_Int P_max_elmts, HYPRE_Int weight_option, hypre_ParCSRMatrix **P_ptr ) { hypre_GpuProfilingPushRange("MultipassInterp"); HYPRE_Int ierr = 0; #if defined(HYPRE_USING_GPU) HYPRE_ExecutionPolicy exec = hypre_GetExecPolicy2( hypre_ParCSRMatrixMemoryLocation(A), hypre_ParCSRMatrixMemoryLocation(S) ); if (exec == HYPRE_EXEC_DEVICE) { /* Notice: call the mod version on GPUs */ ierr = hypre_BoomerAMGBuildModMultipassDevice( A, CF_marker, S, num_cpts_global, trunc_factor, P_max_elmts, 9, num_functions, dof_func, P_ptr ); } else #endif { ierr = hypre_BoomerAMGBuildMultipassHost( A, CF_marker, S, num_cpts_global, num_functions, dof_func, debug_flag, trunc_factor, P_max_elmts, weight_option, P_ptr ); } hypre_GpuProfilingPopRange(); return ierr; } hypre-2.33.0/src/parcsr_ls/par_nodal_systems.c000066400000000000000000001133021477326011500214050ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * *****************************************************************************/ /* following should be in a header file */ #include "_hypre_parcsr_ls.h" /*==========================================================================*/ /*==========================================================================*/ /** Generates nodal norm matrix for use with nodal systems version {\bf Input files:} _hypre_parcsr_ls.h @return Error code. @param A [IN] coefficient matrix @param AN_ptr [OUT] nodal norm matrix TODO: RL GPU version @see */ /*--------------------------------------------------------------------------*/ HYPRE_Int hypre_BoomerAMGCreateNodalA(hypre_ParCSRMatrix *A, HYPRE_Int num_functions, HYPRE_Int *dof_func, HYPRE_Int option, HYPRE_Int diag_option, hypre_ParCSRMatrix **AN_ptr) { HYPRE_UNUSED_VAR(dof_func); MPI_Comm comm = hypre_ParCSRMatrixComm(A); hypre_CSRMatrix *A_diag = hypre_ParCSRMatrixDiag(A); HYPRE_Int *A_diag_i = hypre_CSRMatrixI(A_diag); HYPRE_Real *A_diag_data = hypre_CSRMatrixData(A_diag); hypre_CSRMatrix *A_offd = hypre_ParCSRMatrixOffd(A); HYPRE_Int *A_offd_i = hypre_CSRMatrixI(A_offd); HYPRE_Real *A_offd_data = hypre_CSRMatrixData(A_offd); HYPRE_Int *A_diag_j = hypre_CSRMatrixJ(A_diag); HYPRE_Int *A_offd_j = hypre_CSRMatrixJ(A_offd); HYPRE_BigInt *row_starts = hypre_ParCSRMatrixRowStarts(A); HYPRE_BigInt *col_map_offd = hypre_ParCSRMatrixColMapOffd(A); HYPRE_Int num_variables = hypre_CSRMatrixNumRows(A_diag); HYPRE_Int num_nonzeros_offd = 0; HYPRE_Int num_cols_offd = 0; hypre_ParCSRMatrix *AN; hypre_CSRMatrix *AN_diag; HYPRE_Int *AN_diag_i; HYPRE_Int *AN_diag_j; HYPRE_Real *AN_diag_data; hypre_CSRMatrix *AN_offd; HYPRE_Int *AN_offd_i; HYPRE_Int *AN_offd_j; HYPRE_Real *AN_offd_data = NULL; HYPRE_BigInt *col_map_offd_AN; HYPRE_BigInt *new_col_map_offd; HYPRE_BigInt row_starts_AN[2]; HYPRE_Int AN_num_nonzeros_diag = 0; HYPRE_Int AN_num_nonzeros_offd = 0; HYPRE_Int num_cols_offd_AN; HYPRE_Int new_num_cols_offd; hypre_ParCSRCommPkg *comm_pkg = hypre_ParCSRMatrixCommPkg(A); HYPRE_Int num_sends = 0; HYPRE_Int num_recvs = 0; HYPRE_Int *send_procs; HYPRE_Int *send_map_starts = NULL; HYPRE_Int *send_map_elmts = NULL; HYPRE_Int *new_send_map_elmts; HYPRE_Int *recv_procs; HYPRE_Int *recv_vec_starts = NULL; hypre_ParCSRCommPkg *comm_pkg_AN; HYPRE_Int *send_procs_AN; HYPRE_Int *send_map_starts_AN = NULL; HYPRE_Int *send_map_elmts_AN = NULL; HYPRE_Int *recv_procs_AN; HYPRE_Int *recv_vec_starts_AN = NULL; HYPRE_Int i, j, k, k_map; HYPRE_Int index, row; HYPRE_Int start_index; HYPRE_Int num_procs; HYPRE_Int node, cnt; HYPRE_Int mode; HYPRE_BigInt big_node; HYPRE_Int new_send_elmts_size; HYPRE_BigInt global_num_nodes; HYPRE_Int num_nodes; HYPRE_Int num_fun2; HYPRE_BigInt *big_map_to_node = NULL; HYPRE_Int *map_to_node; HYPRE_Int *map_to_map = NULL; HYPRE_Int *counter; HYPRE_Real sum; HYPRE_Real *data; HYPRE_MemoryLocation memory_location = hypre_ParCSRMatrixMemoryLocation(A); hypre_MPI_Comm_size(comm, &num_procs); if (!comm_pkg) { hypre_MatvecCommPkgCreate(A); comm_pkg = hypre_ParCSRMatrixCommPkg(A); } mode = hypre_abs(option); comm_pkg_AN = NULL; col_map_offd_AN = NULL; for (i = 0; i < 2; i++) { row_starts_AN[i] = row_starts[i] / (HYPRE_BigInt)num_functions; if (row_starts_AN[i] * (HYPRE_BigInt)num_functions < row_starts[i]) { hypre_error_w_msg(HYPRE_ERROR_GENERIC, "nodes not properly aligned or incomplete info!\n"); return hypre_error_flag; } } global_num_nodes = hypre_ParCSRMatrixGlobalNumRows(A) / (HYPRE_BigInt)num_functions; num_nodes = num_variables / num_functions; num_fun2 = num_functions * num_functions; map_to_node = hypre_CTAlloc(HYPRE_Int, num_variables, HYPRE_MEMORY_HOST); AN_diag_i = hypre_CTAlloc(HYPRE_Int, num_nodes + 1, memory_location); counter = hypre_CTAlloc(HYPRE_Int, num_nodes, HYPRE_MEMORY_HOST); for (i = 0; i < num_variables; i++) { map_to_node[i] = i / num_functions; } for (i = 0; i < num_nodes; i++) { counter[i] = -1; } AN_num_nonzeros_diag = 0; row = 0; for (i = 0; i < num_nodes; i++) { AN_diag_i[i] = AN_num_nonzeros_diag; for (j = 0; j < num_functions; j++) { for (k = A_diag_i[row]; k < A_diag_i[row + 1]; k++) { k_map = map_to_node[A_diag_j[k]]; if (counter[k_map] < i) { counter[k_map] = i; AN_num_nonzeros_diag++; } } row++; } } AN_diag_i[num_nodes] = AN_num_nonzeros_diag; AN_diag_j = hypre_CTAlloc(HYPRE_Int, AN_num_nonzeros_diag, memory_location); AN_diag_data = hypre_CTAlloc(HYPRE_Real, AN_num_nonzeros_diag, memory_location); AN_diag = hypre_CSRMatrixCreate(num_nodes, num_nodes, AN_num_nonzeros_diag); hypre_CSRMatrixI(AN_diag) = AN_diag_i; hypre_CSRMatrixJ(AN_diag) = AN_diag_j; hypre_CSRMatrixData(AN_diag) = AN_diag_data; for (i = 0; i < num_nodes; i++) { counter[i] = -1; } index = 0; start_index = 0; row = 0; switch (mode) { case 1: /* frobenius norm */ { for (i = 0; i < num_nodes; i++) { for (j = 0; j < num_functions; j++) { for (k = A_diag_i[row]; k < A_diag_i[row + 1]; k++) { k_map = map_to_node[A_diag_j[k]]; if (counter[k_map] < start_index) { counter[k_map] = index; AN_diag_j[index] = k_map; AN_diag_data[index] = A_diag_data[k] * A_diag_data[k]; index++; } else { AN_diag_data[counter[k_map]] += A_diag_data[k] * A_diag_data[k]; } } row++; } start_index = index; } for (i = 0; i < AN_num_nonzeros_diag; i++) { AN_diag_data[i] = hypre_sqrt(AN_diag_data[i]); } } break; case 2: /* sum of abs. value of all elements in each block */ { for (i = 0; i < num_nodes; i++) { for (j = 0; j < num_functions; j++) { for (k = A_diag_i[row]; k < A_diag_i[row + 1]; k++) { k_map = map_to_node[A_diag_j[k]]; if (counter[k_map] < start_index) { counter[k_map] = index; AN_diag_j[index] = k_map; AN_diag_data[index] = hypre_abs(A_diag_data[k]); index++; } else { AN_diag_data[counter[k_map]] += hypre_abs(A_diag_data[k]); } } row++; } start_index = index; } for (i = 0; i < AN_num_nonzeros_diag; i++) { AN_diag_data[i] /= num_fun2; } } break; case 3: /* largest element of each block (sets true value - not abs. value) */ { for (i = 0; i < num_nodes; i++) { for (j = 0; j < num_functions; j++) { for (k = A_diag_i[row]; k < A_diag_i[row + 1]; k++) { k_map = map_to_node[A_diag_j[k]]; if (counter[k_map] < start_index) { counter[k_map] = index; AN_diag_j[index] = k_map; AN_diag_data[index] = A_diag_data[k]; index++; } else { if (hypre_abs(A_diag_data[k]) > hypre_abs(AN_diag_data[counter[k_map]])) { AN_diag_data[counter[k_map]] = A_diag_data[k]; } } } row++; } start_index = index; } } break; case 4: /* inf. norm (row-sum) */ { data = hypre_CTAlloc(HYPRE_Real, AN_num_nonzeros_diag * num_functions, HYPRE_MEMORY_HOST); for (i = 0; i < num_nodes; i++) { for (j = 0; j < num_functions; j++) { for (k = A_diag_i[row]; k < A_diag_i[row + 1]; k++) { k_map = map_to_node[A_diag_j[k]]; if (counter[k_map] < start_index) { counter[k_map] = index; AN_diag_j[index] = k_map; data[index * num_functions + j] = hypre_abs(A_diag_data[k]); index++; } else { data[(counter[k_map])*num_functions + j] += hypre_abs(A_diag_data[k]); } } row++; } start_index = index; } for (i = 0; i < AN_num_nonzeros_diag; i++) { AN_diag_data[i] = data[i * num_functions]; for (j = 1; j < num_functions; j++) { AN_diag_data[i] = hypre_max( AN_diag_data[i], data[i * num_functions + j]); } } hypre_TFree(data, HYPRE_MEMORY_HOST); } break; case 6: /* sum of all elements in each block */ { for (i = 0; i < num_nodes; i++) { for (j = 0; j < num_functions; j++) { for (k = A_diag_i[row]; k < A_diag_i[row + 1]; k++) { k_map = map_to_node[A_diag_j[k]]; if (counter[k_map] < start_index) { counter[k_map] = index; AN_diag_j[index] = k_map; AN_diag_data[index] = (A_diag_data[k]); index++; } else { AN_diag_data[counter[k_map]] += (A_diag_data[k]); } } row++; } start_index = index; } } break; } if (diag_option == 1 ) { /* make the diag entry the negative of the sum of off-diag entries (DO MORE BELOW) */ for (i = 0; i < num_nodes; i++) { index = AN_diag_i[i]; sum = 0.0; for (k = AN_diag_i[i] + 1; k < AN_diag_i[i + 1]; k++) { sum += AN_diag_data[k]; } AN_diag_data[index] = -sum; } } else if (diag_option == 2) { /* make all diagonal entries negative */ /* the diagonal is the first element listed in each row - */ for (i = 0; i < num_nodes; i++) { index = AN_diag_i[i]; AN_diag_data[index] = - AN_diag_data[index]; } } num_nonzeros_offd = A_offd_i[num_variables]; AN_offd_i = hypre_CTAlloc(HYPRE_Int, num_nodes + 1, memory_location); num_cols_offd_AN = 0; if (comm_pkg) { num_sends = hypre_ParCSRCommPkgNumSends(comm_pkg); num_recvs = hypre_ParCSRCommPkgNumRecvs(comm_pkg); send_procs = hypre_ParCSRCommPkgSendProcs(comm_pkg); send_map_starts = hypre_ParCSRCommPkgSendMapStarts(comm_pkg); send_map_elmts = hypre_ParCSRCommPkgSendMapElmts(comm_pkg); recv_procs = hypre_ParCSRCommPkgRecvProcs(comm_pkg); recv_vec_starts = hypre_ParCSRCommPkgRecvVecStarts(comm_pkg); send_procs_AN = NULL; send_map_elmts_AN = NULL; if (num_sends) { send_procs_AN = hypre_CTAlloc(HYPRE_Int, num_sends, HYPRE_MEMORY_HOST); send_map_elmts_AN = hypre_CTAlloc(HYPRE_Int, send_map_starts[num_sends], HYPRE_MEMORY_HOST); } send_map_starts_AN = hypre_CTAlloc(HYPRE_Int, num_sends + 1, HYPRE_MEMORY_HOST); recv_vec_starts_AN = hypre_CTAlloc(HYPRE_Int, num_recvs + 1, HYPRE_MEMORY_HOST); recv_procs_AN = NULL; if (num_recvs) { recv_procs_AN = hypre_CTAlloc(HYPRE_Int, num_recvs, HYPRE_MEMORY_HOST); } for (i = 0; i < num_sends; i++) { send_procs_AN[i] = send_procs[i]; } for (i = 0; i < num_recvs; i++) { recv_procs_AN[i] = recv_procs[i]; } send_map_starts_AN[0] = 0; cnt = 0; for (i = 0; i < num_sends; i++) { k_map = send_map_starts[i]; if (send_map_starts[i + 1] - k_map) { send_map_elmts_AN[cnt++] = send_map_elmts[k_map] / num_functions; } for (j = send_map_starts[i] + 1; j < send_map_starts[i + 1]; j++) { node = send_map_elmts[j] / num_functions; if (node > send_map_elmts_AN[cnt - 1]) { send_map_elmts_AN[cnt++] = node; } } send_map_starts_AN[i + 1] = cnt; } /* Create communication package */ hypre_ParCSRCommPkgCreateAndFill(comm, num_recvs, recv_procs_AN, recv_vec_starts_AN, num_sends, send_procs_AN, send_map_starts_AN, send_map_elmts_AN, &comm_pkg_AN); } hypre_TFree(map_to_node, HYPRE_MEMORY_HOST); num_cols_offd = hypre_CSRMatrixNumCols(A_offd); if (num_cols_offd) { big_map_to_node = hypre_CTAlloc(HYPRE_BigInt, num_cols_offd, HYPRE_MEMORY_HOST); num_cols_offd_AN = 1; big_map_to_node[0] = col_map_offd[0] / (HYPRE_BigInt)num_functions; for (i = 1; i < num_cols_offd; i++) { big_map_to_node[i] = col_map_offd[i] / (HYPRE_BigInt)num_functions; if (big_map_to_node[i] > big_map_to_node[i - 1]) { num_cols_offd_AN++; } } if (num_cols_offd_AN > num_nodes) { hypre_TFree(counter, HYPRE_MEMORY_HOST); counter = hypre_CTAlloc(HYPRE_Int, num_cols_offd_AN, HYPRE_MEMORY_HOST); } map_to_map = hypre_CTAlloc(HYPRE_Int, num_cols_offd, HYPRE_MEMORY_HOST); col_map_offd_AN = hypre_CTAlloc(HYPRE_BigInt, num_cols_offd_AN, HYPRE_MEMORY_HOST); col_map_offd_AN[0] = big_map_to_node[0]; recv_vec_starts_AN[0] = 0; cnt = 1; for (i = 0; i < num_recvs; i++) { for (j = recv_vec_starts[i]; j < recv_vec_starts[i + 1]; j++) { big_node = big_map_to_node[j]; if (big_node > col_map_offd_AN[cnt - 1]) { col_map_offd_AN[cnt++] = big_node; } map_to_map[j] = cnt - 1; } recv_vec_starts_AN[i + 1] = cnt; } for (i = 0; i < num_cols_offd_AN; i++) { counter[i] = -1; } AN_num_nonzeros_offd = 0; row = 0; for (i = 0; i < num_nodes; i++) { AN_offd_i[i] = AN_num_nonzeros_offd; for (j = 0; j < num_functions; j++) { for (k = A_offd_i[row]; k < A_offd_i[row + 1]; k++) { k_map = map_to_map[A_offd_j[k]]; if (counter[k_map] < i) { counter[k_map] = i; AN_num_nonzeros_offd++; } } row++; } } AN_offd_i[num_nodes] = AN_num_nonzeros_offd; } AN_offd = hypre_CSRMatrixCreate(num_nodes, num_cols_offd_AN, AN_num_nonzeros_offd); hypre_CSRMatrixI(AN_offd) = AN_offd_i; if (AN_num_nonzeros_offd) { AN_offd_j = hypre_CTAlloc(HYPRE_Int, AN_num_nonzeros_offd, memory_location); AN_offd_data = hypre_CTAlloc(HYPRE_Real, AN_num_nonzeros_offd, memory_location); hypre_CSRMatrixJ(AN_offd) = AN_offd_j; hypre_CSRMatrixData(AN_offd) = AN_offd_data; for (i = 0; i < num_cols_offd_AN; i++) { counter[i] = -1; } index = 0; row = 0; AN_offd_i[0] = 0; start_index = 0; switch (mode) { case 1: /* frobenius norm */ { for (i = 0; i < num_nodes; i++) { for (j = 0; j < num_functions; j++) { for (k = A_offd_i[row]; k < A_offd_i[row + 1]; k++) { k_map = map_to_map[A_offd_j[k]]; if (counter[k_map] < start_index) { counter[k_map] = index; AN_offd_j[index] = k_map; AN_offd_data[index] = A_offd_data[k] * A_offd_data[k]; index++; } else { AN_offd_data[counter[k_map]] += A_offd_data[k] * A_offd_data[k]; } } row++; } start_index = index; } for (i = 0; i < AN_num_nonzeros_offd; i++) { AN_offd_data[i] = hypre_sqrt(AN_offd_data[i]); } } break; case 2: /* sum of abs. value of all elements in block */ { for (i = 0; i < num_nodes; i++) { for (j = 0; j < num_functions; j++) { for (k = A_offd_i[row]; k < A_offd_i[row + 1]; k++) { k_map = map_to_map[A_offd_j[k]]; if (counter[k_map] < start_index) { counter[k_map] = index; AN_offd_j[index] = k_map; AN_offd_data[index] = hypre_abs(A_offd_data[k]); index++; } else { AN_offd_data[counter[k_map]] += hypre_abs(A_offd_data[k]); } } row++; } start_index = index; } for (i = 0; i < AN_num_nonzeros_offd; i++) { AN_offd_data[i] /= num_fun2; } } break; case 3: /* largest element in each block (not abs. value ) */ { for (i = 0; i < num_nodes; i++) { for (j = 0; j < num_functions; j++) { for (k = A_offd_i[row]; k < A_offd_i[row + 1]; k++) { k_map = map_to_map[A_offd_j[k]]; if (counter[k_map] < start_index) { counter[k_map] = index; AN_offd_j[index] = k_map; AN_offd_data[index] = A_offd_data[k]; index++; } else { if (hypre_abs(A_offd_data[k]) > hypre_abs(AN_offd_data[counter[k_map]])) { AN_offd_data[counter[k_map]] = A_offd_data[k]; } } } row++; } start_index = index; } } break; case 4: /* inf. norm (row-sum) */ { data = hypre_CTAlloc(HYPRE_Real, AN_num_nonzeros_offd * num_functions, HYPRE_MEMORY_HOST); for (i = 0; i < num_nodes; i++) { for (j = 0; j < num_functions; j++) { for (k = A_offd_i[row]; k < A_offd_i[row + 1]; k++) { k_map = map_to_map[A_offd_j[k]]; if (counter[k_map] < start_index) { counter[k_map] = index; AN_offd_j[index] = k_map; data[index * num_functions + j] = hypre_abs(A_offd_data[k]); index++; } else { data[(counter[k_map])*num_functions + j] += hypre_abs(A_offd_data[k]); } } row++; } start_index = index; } for (i = 0; i < AN_num_nonzeros_offd; i++) { AN_offd_data[i] = data[i * num_functions]; for (j = 1; j < num_functions; j++) { AN_offd_data[i] = hypre_max( AN_offd_data[i], data[i * num_functions + j]); } } hypre_TFree(data, HYPRE_MEMORY_HOST); } break; case 6: /* sum of value of all elements in block */ { for (i = 0; i < num_nodes; i++) { for (j = 0; j < num_functions; j++) { for (k = A_offd_i[row]; k < A_offd_i[row + 1]; k++) { k_map = map_to_map[A_offd_j[k]]; if (counter[k_map] < start_index) { counter[k_map] = index; AN_offd_j[index] = k_map; AN_offd_data[index] = (A_offd_data[k]); index++; } else { AN_offd_data[counter[k_map]] += (A_offd_data[k]); } } row++; } start_index = index; } } break; } } if (diag_option == 1 ) { /* make the diag entry the negative of the sum of off-diag entries (here we are adding the off_diag contribution)*/ /* the diagonal is the first element listed in each row of AN_diag_data - */ for (i = 0; i < num_nodes; i++) { sum = 0.0; for (k = AN_offd_i[i]; k < AN_offd_i[i + 1]; k++) { sum += AN_offd_data[k]; } index = AN_diag_i[i];/* location of diag entry in data */ AN_diag_data[index] -= sum; /* subtract from current value */ } } AN = hypre_ParCSRMatrixCreate(comm, global_num_nodes, global_num_nodes, row_starts_AN, row_starts_AN, num_cols_offd_AN, AN_num_nonzeros_diag, AN_num_nonzeros_offd); /* we already created the diag and offd matrices - so we don't need the ones created above */ hypre_CSRMatrixDestroy(hypre_ParCSRMatrixDiag(AN)); hypre_CSRMatrixDestroy(hypre_ParCSRMatrixOffd(AN)); hypre_ParCSRMatrixDiag(AN) = AN_diag; hypre_ParCSRMatrixOffd(AN) = AN_offd; hypre_CSRMatrixMemoryLocation(AN_diag) = memory_location; hypre_CSRMatrixMemoryLocation(AN_offd) = memory_location; hypre_ParCSRMatrixColMapOffd(AN) = col_map_offd_AN; hypre_ParCSRMatrixCommPkg(AN) = comm_pkg_AN; new_num_cols_offd = num_functions * num_cols_offd_AN; if (new_num_cols_offd > num_cols_offd) { new_col_map_offd = hypre_CTAlloc(HYPRE_BigInt, new_num_cols_offd, HYPRE_MEMORY_HOST); cnt = 0; for (i = 0; i < num_cols_offd_AN; i++) { for (j = 0; j < num_functions; j++) { new_col_map_offd[cnt++] = (HYPRE_BigInt)num_functions * col_map_offd_AN[i] + (HYPRE_BigInt)j; } } cnt = 0; for (i = 0; i < num_cols_offd; i++) { while (col_map_offd[i] > new_col_map_offd[cnt]) { cnt++; } col_map_offd[i] = (HYPRE_BigInt)cnt++; } for (i = 0; i < num_recvs + 1; i++) { recv_vec_starts[i] = num_functions * recv_vec_starts_AN[i]; } for (i = 0; i < num_nonzeros_offd; i++) { j = A_offd_j[i]; A_offd_j[i] = (HYPRE_Int)col_map_offd[j]; } hypre_ParCSRMatrixColMapOffd(A) = new_col_map_offd; hypre_CSRMatrixNumCols(A_offd) = new_num_cols_offd; hypre_TFree(col_map_offd, HYPRE_MEMORY_HOST); } hypre_TFree(big_map_to_node, HYPRE_MEMORY_HOST); new_send_elmts_size = send_map_starts_AN[num_sends] * num_functions; if (new_send_elmts_size > send_map_starts[num_sends]) { new_send_map_elmts = hypre_CTAlloc(HYPRE_Int, new_send_elmts_size, HYPRE_MEMORY_HOST); cnt = 0; send_map_starts[0] = 0; for (i = 0; i < num_sends; i++) { send_map_starts[i + 1] = send_map_starts_AN[i + 1] * num_functions; for (j = send_map_starts_AN[i]; j < send_map_starts_AN[i + 1]; j++) { for (k = 0; k < num_functions; k++) { new_send_map_elmts[cnt++] = send_map_elmts_AN[j] * num_functions + k; } } } hypre_TFree(send_map_elmts, HYPRE_MEMORY_HOST); hypre_ParCSRCommPkgSendMapElmts(comm_pkg) = new_send_map_elmts; } *AN_ptr = AN; hypre_TFree(counter, HYPRE_MEMORY_HOST); hypre_TFree(map_to_map, HYPRE_MEMORY_HOST); return hypre_error_flag; } /* This creates a scalar version of the CF_marker, dof_array and strength matrix (SN) * RL: TODO GPU version */ HYPRE_Int hypre_BoomerAMGCreateScalarCFS(hypre_ParCSRMatrix *SN, hypre_ParCSRMatrix *A, HYPRE_Int *CFN_marker, HYPRE_Int num_functions, HYPRE_Int nodal, HYPRE_Int keep_same_sign, hypre_IntArray **dof_func_ptr, hypre_IntArray **CF_marker_ptr, hypre_ParCSRMatrix **S_ptr) { MPI_Comm comm = hypre_ParCSRMatrixComm(SN); hypre_ParCSRMatrix *S; hypre_CSRMatrix *S_diag; HYPRE_Int *S_diag_i; HYPRE_Int *S_diag_j; hypre_CSRMatrix *S_offd; HYPRE_Int *S_offd_i; HYPRE_Int *S_offd_j; HYPRE_BigInt row_starts_S[2]; HYPRE_BigInt col_starts_S[2]; HYPRE_BigInt *row_starts_A = hypre_ParCSRMatrixRowStarts(A); HYPRE_BigInt *col_starts_A = hypre_ParCSRMatrixColStarts(A); hypre_CSRMatrix *A_diag = hypre_ParCSRMatrixDiag(A); HYPRE_Int *A_diag_i = hypre_CSRMatrixI(A_diag); HYPRE_Int *A_diag_j = hypre_CSRMatrixJ(A_diag); HYPRE_Real *A_diag_data = hypre_CSRMatrixData(A_diag); hypre_CSRMatrix *A_offd = hypre_ParCSRMatrixOffd(A); HYPRE_Int *A_offd_i = hypre_CSRMatrixI(A_offd); HYPRE_Int *A_offd_j = hypre_CSRMatrixJ(A_offd); HYPRE_Real *A_offd_data = hypre_CSRMatrixData(A_offd); hypre_CSRMatrix *SN_diag = hypre_ParCSRMatrixDiag(SN); HYPRE_Int *SN_diag_i = hypre_CSRMatrixI(SN_diag); HYPRE_Int *SN_diag_j = hypre_CSRMatrixJ(SN_diag); hypre_CSRMatrix *SN_offd = hypre_ParCSRMatrixOffd(SN); HYPRE_Int *SN_offd_i = hypre_CSRMatrixI(SN_offd); HYPRE_Int *SN_offd_j = hypre_CSRMatrixJ(SN_offd); HYPRE_Int *CF_marker; HYPRE_BigInt *col_map_offd_SN = hypre_ParCSRMatrixColMapOffd(SN); HYPRE_BigInt *col_map_offd_A = hypre_ParCSRMatrixColMapOffd(A); HYPRE_BigInt *col_map_offd_S = NULL; HYPRE_Int *dof_func; HYPRE_Int num_nodes = hypre_CSRMatrixNumRows(SN_diag); HYPRE_Int num_variables; HYPRE_Int *S_marker; HYPRE_Int *S_marker_offd = NULL; HYPRE_Int *S_tmp_j; HYPRE_Int num_coarse_nodes; HYPRE_Int i, j, k, cnt; HYPRE_Int num_procs; HYPRE_Int num_cols_offd_A = hypre_CSRMatrixNumCols(A_offd); HYPRE_Int A_num_nonzeros_diag; HYPRE_Int A_num_nonzeros_offd; HYPRE_Int S_num_nonzeros_diag; HYPRE_Int S_num_nonzeros_offd; HYPRE_BigInt global_num_vars; HYPRE_BigInt global_num_cols; HYPRE_BigInt global_num_nodes; HYPRE_Int nnz, S_cnt, in; HYPRE_MemoryLocation memory_locationS = hypre_ParCSRMatrixMemoryLocation(SN); hypre_MPI_Comm_size(comm, &num_procs); num_variables = num_functions * num_nodes; /* Allocate CF_marker if not done before */ if (*CF_marker_ptr == NULL) { *CF_marker_ptr = hypre_IntArrayCreate(num_variables); hypre_IntArrayInitialize(*CF_marker_ptr); } CF_marker = hypre_IntArrayData(*CF_marker_ptr); if (nodal < 0) { cnt = 0; num_coarse_nodes = 0; for (i = 0; i < num_nodes; i++) { if (CFN_marker[i] == 1) { num_coarse_nodes++; } for (j = 0; j < num_functions; j++) { CF_marker[cnt++] = CFN_marker[i]; } } *dof_func_ptr = hypre_IntArrayCreate(num_coarse_nodes * num_functions); hypre_IntArrayInitialize(*dof_func_ptr); dof_func = hypre_IntArrayData(*dof_func_ptr); cnt = 0; for (i = 0; i < num_nodes; i++) { if (CFN_marker[i] == 1) { for (k = 0; k < num_functions; k++) { dof_func[cnt++] = k; } } } } else { cnt = 0; for (i = 0; i < num_nodes; i++) { for (j = 0; j < num_functions; j++) { CF_marker[cnt++] = CFN_marker[i]; } } } for (i = 0; i < 2; i++) { row_starts_S[i] = row_starts_A[i]; col_starts_S[i] = col_starts_A[i]; } /*SN_num_nonzeros_diag = SN_diag_i[num_nodes]; SN_num_nonzeros_offd = SN_offd_i[num_nodes];*/ A_num_nonzeros_diag = A_diag_i[num_variables]; A_num_nonzeros_offd = A_offd_i[num_variables]; global_num_nodes = hypre_ParCSRMatrixGlobalNumRows(SN); global_num_cols = hypre_ParCSRMatrixGlobalNumCols(SN) * num_functions; global_num_vars = global_num_nodes * (HYPRE_BigInt)num_functions; S_marker = hypre_TAlloc(HYPRE_Int, num_variables, HYPRE_MEMORY_HOST); nnz = A_num_nonzeros_diag; if (nnz < A_num_nonzeros_offd) { nnz = A_num_nonzeros_offd; } S_tmp_j = hypre_TAlloc(HYPRE_Int, nnz, HYPRE_MEMORY_HOST); S_diag_i = hypre_CTAlloc(HYPRE_Int, num_variables + 1, memory_locationS); S_offd_i = hypre_CTAlloc(HYPRE_Int, num_variables + 1, memory_locationS); //Generate S_diag_i and S_diag_j for (i = 0; i < A_num_nonzeros_diag; i++) { S_tmp_j[i] = -1; } for (i = 0; i < num_variables; i++) { S_marker[i] = -1; } S_diag_i[0] = 0; S_cnt = 0; for (in = 0; in < num_nodes; in++) { HYPRE_Int index, index_A, kn, position; for (kn = 0; kn < num_functions; kn++) { i = in * num_functions + kn; position = A_diag_i[i] - 1; if (!keep_same_sign) { if (A_diag_data[A_diag_i[i]] > 0.0) { for (j = A_diag_i[i] + 1; j < A_diag_i[i + 1]; j++) { if (A_diag_data[j] < 0.0) { S_marker[A_diag_j[j]] = j; } } } else { for (j = A_diag_i[i] + 1; j < A_diag_i[i + 1]; j++) { if (A_diag_data[j] > 0.0) { S_marker[A_diag_j[j]] = j; } } } } else { for (j = A_diag_i[i]; j < A_diag_i[i + 1]; j++) { S_marker[A_diag_j[j]] = j; } } for (j = SN_diag_i[in]; j < SN_diag_i[in + 1]; j++) { // only include diagonal elements of block, assuming unknown-based // approach for interpolation, i.e. ignore connections between different variables index = SN_diag_j[j] * num_functions + kn; index_A = S_marker[index]; if (index_A > position) { S_tmp_j[index_A] = A_diag_j[index_A]; S_cnt++; } } S_diag_i[i + 1] = S_cnt; } } S_diag_j = hypre_CTAlloc(HYPRE_Int, S_cnt, memory_locationS); S_cnt = 0; for (i = 0; i < A_num_nonzeros_diag; i++) { if (S_tmp_j[i] > -1) { S_diag_j[S_cnt++] = S_tmp_j[i]; } } S_num_nonzeros_diag = S_cnt; for (i = 0; i < A_num_nonzeros_offd; i++) { S_tmp_j[i] = -1; } S_marker_offd = hypre_TAlloc(HYPRE_Int, num_cols_offd_A, HYPRE_MEMORY_HOST); col_map_offd_S = hypre_TAlloc(HYPRE_BigInt, num_cols_offd_A, HYPRE_MEMORY_HOST); for (i = 0; i < num_cols_offd_A; i++) { S_marker_offd[i] = -1; col_map_offd_S[i] = col_map_offd_A[i]; } S_offd_i[0] = 0; S_cnt = 0; for (in = 0; in < num_nodes; in++) { HYPRE_Int index, index_A, kn, position; HYPRE_BigInt big_index; for (kn = 0; kn < num_functions; kn++) { i = in * num_functions + kn; position = A_offd_i[i] - 1; if (!keep_same_sign) { if (A_diag_data[A_diag_i[i]] > 0.0) { for (j = A_offd_i[i]; j < A_offd_i[i + 1]; j++) { if (A_offd_data[j] < 0.0) { S_marker_offd[A_offd_j[j]] = j; } } } else { for (j = A_offd_i[i]; j < A_offd_i[i + 1]; j++) { if (A_offd_data[j] > 0.0) { S_marker_offd[A_offd_j[j]] = j; } } } } else { for (j = A_offd_i[i]; j < A_offd_i[i + 1]; j++) { S_marker_offd[A_offd_j[j]] = j; } } for (j = SN_offd_i[in]; j < SN_offd_i[in + 1]; j++) { big_index = col_map_offd_SN[SN_offd_j[j]] * num_functions + kn; index = hypre_BigBinarySearch(col_map_offd_A, big_index, num_cols_offd_A); if (index > -1) { index_A = S_marker_offd[index]; if (index_A > position) { S_tmp_j[index_A] = A_offd_j[index_A]; S_cnt++; } } } S_offd_i[i + 1] = S_cnt; } } S_num_nonzeros_offd = S_cnt; S_offd_j = hypre_CTAlloc(HYPRE_Int, S_cnt, memory_locationS); S_cnt = 0; for (i = 0; i < A_num_nonzeros_offd; i++) { if (S_tmp_j[i] > -1) { S_offd_j[S_cnt++] = S_tmp_j[i]; } } S = hypre_ParCSRMatrixCreate(comm, global_num_vars, global_num_cols, row_starts_S, col_starts_S, num_cols_offd_A, S_num_nonzeros_diag, S_num_nonzeros_offd); S_diag = hypre_ParCSRMatrixDiag(S); S_offd = hypre_ParCSRMatrixOffd(S); hypre_CSRMatrixMemoryLocation(S_diag) = memory_locationS; hypre_CSRMatrixMemoryLocation(S_offd) = memory_locationS; hypre_CSRMatrixI(S_diag) = S_diag_i; hypre_CSRMatrixJ(S_diag) = S_diag_j; hypre_CSRMatrixI(S_offd) = S_offd_i; hypre_CSRMatrixJ(S_offd) = S_offd_j; hypre_ParCSRMatrixColMapOffd(S) = col_map_offd_S; hypre_TFree(S_tmp_j, HYPRE_MEMORY_HOST); hypre_TFree(S_marker, HYPRE_MEMORY_HOST); hypre_TFree(S_marker_offd, HYPRE_MEMORY_HOST); *S_ptr = S; return hypre_error_flag; } /* This function just finds the scalar CF_marker and dof_func */ HYPRE_Int hypre_BoomerAMGCreateScalarCF(HYPRE_Int *CFN_marker, HYPRE_Int num_functions, HYPRE_Int num_nodes, hypre_IntArray **dof_func_ptr, hypre_IntArray **CF_marker_ptr) { HYPRE_Int *CF_marker; HYPRE_Int *dof_func; HYPRE_Int num_variables; HYPRE_Int num_coarse_nodes; HYPRE_Int i, j, k, cnt; num_variables = num_functions * num_nodes; /* Allocate CF_marker if not done before */ if (*CF_marker_ptr == NULL) { *CF_marker_ptr = hypre_IntArrayCreate(num_variables); hypre_IntArrayInitialize(*CF_marker_ptr); } CF_marker = hypre_IntArrayData(*CF_marker_ptr); cnt = 0; num_coarse_nodes = 0; for (i = 0; i < num_nodes; i++) { if (CFN_marker[i] == 1) { num_coarse_nodes++; } for (j = 0; j < num_functions; j++) { CF_marker[cnt++] = CFN_marker[i]; } } *dof_func_ptr = hypre_IntArrayCreate(num_coarse_nodes * num_functions); hypre_IntArrayInitialize(*dof_func_ptr); dof_func = hypre_IntArrayData(*dof_func_ptr); cnt = 0; for (i = 0; i < num_nodes; i++) { if (CFN_marker[i] == 1) { for (k = 0; k < num_functions; k++) { dof_func[cnt++] = k; } } } return hypre_error_flag; } hypre-2.33.0/src/parcsr_ls/par_nongalerkin.c000066400000000000000000003077001477326011500210370ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "_hypre_parcsr_ls.h" #include "../HYPRE.h" #include "_hypre_IJ_mv.h" /* This file contains the routines for constructing non-Galerkin coarse grid * operators, based on the original Galerkin coarse grid */ /* Take all of the indices from indices[start, start+1, start+2, ..., end] * and take the corresponding entries in array and place them in-order in output. * Assumptions: * output is of length end-start+1 * indices never contains an index that goes out of bounds in array * */ HYPRE_Int hypre_GrabSubArray(HYPRE_Int * indices, HYPRE_Int start, HYPRE_Int end, HYPRE_BigInt * array, HYPRE_BigInt * output) { HYPRE_Int i, length; length = end - start + 1; for (i = 0; i < length; i++) { output[i] = array[indices[start + i]]; } return hypre_error_flag; } /* Compute the intersection of x and y, placing * the intersection in z. Additionally, the array * x_data is associated with x, i.e., the entries * that we grab from x, we also grab from x_data. * If x[k] is placed in z[m], then x_data[k] goes to * output_x_data[m]. * * Assumptions: * z is of length min(x_length, y_length) * x and y are sorted * x_length and y_length are similar in size, otherwise, * looping over the smaller array and doing binary search * in the longer array is faster. * */ HYPRE_Int hypre_IntersectTwoArrays(HYPRE_Int *x, HYPRE_Real *x_data, HYPRE_Int x_length, HYPRE_Int *y, HYPRE_Int y_length, HYPRE_Int *z, HYPRE_Real *output_x_data, HYPRE_Int *intersect_length) { HYPRE_Int x_index = 0; HYPRE_Int y_index = 0; *intersect_length = 0; /* Compute Intersection, looping over each array */ while ( (x_index < x_length) && (y_index < y_length) ) { if (x[x_index] > y[y_index]) { y_index = y_index + 1; } else if (x[x_index] < y[y_index]) { x_index = x_index + 1; } else { z[*intersect_length] = x[x_index]; output_x_data[*intersect_length] = x_data[x_index]; x_index = x_index + 1; y_index = y_index + 1; *intersect_length = *intersect_length + 1; } } return 1; } HYPRE_Int hypre_IntersectTwoBigArrays(HYPRE_BigInt *x, HYPRE_Real *x_data, HYPRE_Int x_length, HYPRE_BigInt *y, HYPRE_Int y_length, HYPRE_BigInt *z, HYPRE_Real *output_x_data, HYPRE_Int *intersect_length) { HYPRE_Int x_index = 0; HYPRE_Int y_index = 0; *intersect_length = 0; /* Compute Intersection, looping over each array */ while ( (x_index < x_length) && (y_index < y_length) ) { if (x[x_index] > y[y_index]) { y_index = y_index + 1; } else if (x[x_index] < y[y_index]) { x_index = x_index + 1; } else { z[*intersect_length] = x[x_index]; output_x_data[*intersect_length] = x_data[x_index]; x_index = x_index + 1; y_index = y_index + 1; *intersect_length = *intersect_length + 1; } } return 1; } /* Copy CSR matrix A to CSR matrix B. The column indices are * assumed to be sorted, and the sparsity pattern of B is a subset * of the sparsity pattern of A. * * Assumptions: * Column indices of A and B are sorted * Sparsity pattern of B is a subset of A's * A and B are the same size and have same data layout **/ HYPRE_Int hypre_SortedCopyParCSRData(hypre_ParCSRMatrix *A, hypre_ParCSRMatrix *B) { /* Grab off A and B's data structures */ hypre_CSRMatrix *A_diag = hypre_ParCSRMatrixDiag(A); HYPRE_Int *A_diag_i = hypre_CSRMatrixI(A_diag); HYPRE_Int *A_diag_j = hypre_CSRMatrixJ(A_diag); HYPRE_Real *A_diag_data = hypre_CSRMatrixData(A_diag); hypre_CSRMatrix *A_offd = hypre_ParCSRMatrixOffd(A); HYPRE_Int *A_offd_i = hypre_CSRMatrixI(A_offd); HYPRE_Int *A_offd_j = hypre_CSRMatrixJ(A_offd); HYPRE_Real *A_offd_data = hypre_CSRMatrixData(A_offd); hypre_CSRMatrix *B_diag = hypre_ParCSRMatrixDiag(B); HYPRE_Int *B_diag_i = hypre_CSRMatrixI(B_diag); HYPRE_Int *B_diag_j = hypre_CSRMatrixJ(B_diag); HYPRE_Real *B_diag_data = hypre_CSRMatrixData(B_diag); hypre_CSRMatrix *B_offd = hypre_ParCSRMatrixOffd(B); HYPRE_Int *B_offd_i = hypre_CSRMatrixI(B_offd); HYPRE_Int *B_offd_j = hypre_CSRMatrixJ(B_offd); HYPRE_Real *B_offd_data = hypre_CSRMatrixData(B_offd); HYPRE_Int num_variables = hypre_CSRMatrixNumRows(A_diag); HYPRE_Int *temp_int_array = NULL; HYPRE_Int temp_int_array_length = 0; HYPRE_Int i, length, offset_A, offset_B; for (i = 0; i < num_variables; i++) { /* Deal with the first row entries, which may be diagonal elements */ if ( A_diag_j[A_diag_i[i]] == i) { offset_A = 1; } else { offset_A = 0; } if ( B_diag_j[B_diag_i[i]] == i) { offset_B = 1; } else { offset_B = 0; } if ( (offset_B == 1) && (offset_A == 1) ) { B_diag_data[B_diag_i[i]] = A_diag_data[A_diag_i[i]]; } /* This finds the intersection of the column indices, and * also copies the matching data in A to the data array in B **/ if ( (A_diag_i[i + 1] - A_diag_i[i] - offset_A) > temp_int_array_length ) { hypre_TFree(temp_int_array, HYPRE_MEMORY_HOST); temp_int_array_length = (A_diag_i[i + 1] - A_diag_i[i] - offset_A); temp_int_array = hypre_CTAlloc(HYPRE_Int, temp_int_array_length, HYPRE_MEMORY_HOST); } hypre_IntersectTwoArrays(&(A_diag_j[A_diag_i[i] + offset_A]), &(A_diag_data[A_diag_i[i] + offset_A]), A_diag_i[i + 1] - A_diag_i[i] - offset_A, &(B_diag_j[B_diag_i[i] + offset_B]), B_diag_i[i + 1] - B_diag_i[i] - offset_B, temp_int_array, &(B_diag_data[B_diag_i[i] + offset_B]), &length); if ( (A_offd_i[i + 1] - A_offd_i[i]) > temp_int_array_length ) { hypre_TFree(temp_int_array, HYPRE_MEMORY_HOST); temp_int_array_length = (A_offd_i[i + 1] - A_offd_i[i]); temp_int_array = hypre_CTAlloc(HYPRE_Int, temp_int_array_length, HYPRE_MEMORY_HOST); } hypre_IntersectTwoArrays(&(A_offd_j[A_offd_i[i]]), &(A_offd_data[A_offd_i[i]]), A_offd_i[i + 1] - A_offd_i[i], &(B_offd_j[B_offd_i[i]]), B_offd_i[i + 1] - B_offd_i[i], temp_int_array, &(B_offd_data[B_offd_i[i]]), &length); } if (temp_int_array) { hypre_TFree(temp_int_array, HYPRE_MEMORY_HOST); } return 1; } /* * Equivalent to hypre_BoomerAMGCreateS, except, the data array of S * is not Null and contains the data entries from A. */ HYPRE_Int hypre_BoomerAMG_MyCreateS(hypre_ParCSRMatrix *A, HYPRE_Real strength_threshold, HYPRE_Real max_row_sum, HYPRE_Int num_functions, HYPRE_Int *dof_func, hypre_ParCSRMatrix **S_ptr) { MPI_Comm comm = hypre_ParCSRMatrixComm(A); hypre_ParCSRCommPkg *comm_pkg = hypre_ParCSRMatrixCommPkg(A); hypre_ParCSRCommHandle *comm_handle; hypre_CSRMatrix *A_diag = hypre_ParCSRMatrixDiag(A); HYPRE_Int *A_diag_i = hypre_CSRMatrixI(A_diag); HYPRE_Real *A_diag_data = hypre_CSRMatrixData(A_diag); hypre_CSRMatrix *A_offd = hypre_ParCSRMatrixOffd(A); HYPRE_Int *A_offd_i = hypre_CSRMatrixI(A_offd); HYPRE_Real *A_offd_data = NULL; HYPRE_Int *A_diag_j = hypre_CSRMatrixJ(A_diag); HYPRE_Int *A_offd_j = hypre_CSRMatrixJ(A_offd); HYPRE_BigInt *row_starts = hypre_ParCSRMatrixRowStarts(A); HYPRE_Int num_variables = hypre_CSRMatrixNumRows(A_diag); HYPRE_BigInt global_num_vars = hypre_ParCSRMatrixGlobalNumRows(A); HYPRE_Int num_nonzeros_diag; HYPRE_Int num_nonzeros_offd = 0; HYPRE_Int num_cols_offd = 0; hypre_ParCSRMatrix *S; hypre_CSRMatrix *S_diag; HYPRE_Int *S_diag_i; HYPRE_Int *S_diag_j; HYPRE_Real *S_diag_data; hypre_CSRMatrix *S_offd; HYPRE_Int *S_offd_i = NULL; HYPRE_Int *S_offd_j = NULL; HYPRE_Real *S_offd_data = NULL; HYPRE_Real diag, row_scale, row_sum; HYPRE_Int i, jA, jS; HYPRE_Int ierr = 0; HYPRE_Int *dof_func_offd; HYPRE_Int num_sends; HYPRE_Int *int_buf_data; HYPRE_Int index, start, j; /*-------------------------------------------------------------- * Compute a ParCSR strength matrix, S. * * For now, the "strength" of dependence/influence is defined in * the following way: i depends on j if * aij > hypre_max (k != i) aik, aii < 0 * or * aij < hypre_min (k != i) aik, aii >= 0 * Then S_ij = aij, else S_ij = 0. * * NOTE: the entries are negative initially, corresponding * to "unaccounted-for" dependence. *----------------------------------------------------------------*/ num_nonzeros_diag = A_diag_i[num_variables]; num_cols_offd = hypre_CSRMatrixNumCols(A_offd); A_offd_i = hypre_CSRMatrixI(A_offd); num_nonzeros_offd = A_offd_i[num_variables]; /* Initialize S */ S = hypre_ParCSRMatrixCreate(comm, global_num_vars, global_num_vars, row_starts, row_starts, num_cols_offd, num_nonzeros_diag, num_nonzeros_offd); S_diag = hypre_ParCSRMatrixDiag(S); hypre_CSRMatrixI(S_diag) = hypre_CTAlloc(HYPRE_Int, num_variables + 1, HYPRE_MEMORY_HOST); hypre_CSRMatrixJ(S_diag) = hypre_CTAlloc(HYPRE_Int, num_nonzeros_diag, HYPRE_MEMORY_HOST); hypre_CSRMatrixData(S_diag) = hypre_CTAlloc(HYPRE_Real, num_nonzeros_diag, HYPRE_MEMORY_HOST); S_offd = hypre_ParCSRMatrixOffd(S); hypre_CSRMatrixI(S_offd) = hypre_CTAlloc(HYPRE_Int, num_variables + 1, HYPRE_MEMORY_HOST); S_diag_i = hypre_CSRMatrixI(S_diag); S_diag_j = hypre_CSRMatrixJ(S_diag); S_diag_data = hypre_CSRMatrixData(S_diag); S_offd_i = hypre_CSRMatrixI(S_offd); hypre_CSRMatrixMemoryLocation(S_diag) = HYPRE_MEMORY_HOST; hypre_CSRMatrixMemoryLocation(S_offd) = HYPRE_MEMORY_HOST; dof_func_offd = NULL; if (num_cols_offd) { A_offd_data = hypre_CSRMatrixData(A_offd); hypre_CSRMatrixJ(S_offd) = hypre_CTAlloc(HYPRE_Int, num_nonzeros_offd, HYPRE_MEMORY_HOST); hypre_CSRMatrixData(S_offd) = hypre_CTAlloc(HYPRE_Real, num_nonzeros_offd, HYPRE_MEMORY_HOST); S_offd_j = hypre_CSRMatrixJ(S_offd); S_offd_data = hypre_CSRMatrixData(S_offd); hypre_ParCSRMatrixColMapOffd(S) = hypre_CTAlloc(HYPRE_BigInt, num_cols_offd, HYPRE_MEMORY_HOST); if (num_functions > 1) { dof_func_offd = hypre_CTAlloc(HYPRE_Int, num_cols_offd, HYPRE_MEMORY_HOST); } } /*------------------------------------------------------------------- * Get the dof_func data for the off-processor columns *-------------------------------------------------------------------*/ if (!comm_pkg) { hypre_MatvecCommPkgCreate(A); comm_pkg = hypre_ParCSRMatrixCommPkg(A); } num_sends = hypre_ParCSRCommPkgNumSends(comm_pkg); if (num_functions > 1) { int_buf_data = hypre_CTAlloc(HYPRE_Int, hypre_ParCSRCommPkgSendMapStart(comm_pkg, num_sends), HYPRE_MEMORY_HOST); index = 0; for (i = 0; i < num_sends; i++) { start = hypre_ParCSRCommPkgSendMapStart(comm_pkg, i); for (j = start; j < hypre_ParCSRCommPkgSendMapStart(comm_pkg, i + 1); j++) { int_buf_data[index++] = dof_func[hypre_ParCSRCommPkgSendMapElmt(comm_pkg, j)]; } } comm_handle = hypre_ParCSRCommHandleCreate( 11, comm_pkg, int_buf_data, dof_func_offd); hypre_ParCSRCommHandleDestroy(comm_handle); hypre_TFree(int_buf_data, HYPRE_MEMORY_HOST); } /* give S same nonzero structure as A */ hypre_ParCSRMatrixCopy(A, S, 1); #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i,diag,row_scale,row_sum,jA) HYPRE_SMP_SCHEDULE #endif for (i = 0; i < num_variables; i++) { diag = A_diag_data[A_diag_i[i]]; /* compute scaling factor and row sum */ row_scale = 0.0; row_sum = diag; if (num_functions > 1) { if (diag < 0) { for (jA = A_diag_i[i] + 1; jA < A_diag_i[i + 1]; jA++) { if (dof_func[i] == dof_func[A_diag_j[jA]]) { row_scale = hypre_max(row_scale, A_diag_data[jA]); row_sum += A_diag_data[jA]; } } for (jA = A_offd_i[i]; jA < A_offd_i[i + 1]; jA++) { if (dof_func[i] == dof_func_offd[A_offd_j[jA]]) { row_scale = hypre_max(row_scale, A_offd_data[jA]); row_sum += A_offd_data[jA]; } } } else { for (jA = A_diag_i[i] + 1; jA < A_diag_i[i + 1]; jA++) { if (dof_func[i] == dof_func[A_diag_j[jA]]) { row_scale = hypre_min(row_scale, A_diag_data[jA]); row_sum += A_diag_data[jA]; } } for (jA = A_offd_i[i]; jA < A_offd_i[i + 1]; jA++) { if (dof_func[i] == dof_func_offd[A_offd_j[jA]]) { row_scale = hypre_min(row_scale, A_offd_data[jA]); row_sum += A_offd_data[jA]; } } } } else { if (diag < 0) { for (jA = A_diag_i[i] + 1; jA < A_diag_i[i + 1]; jA++) { row_scale = hypre_max(row_scale, A_diag_data[jA]); row_sum += A_diag_data[jA]; } for (jA = A_offd_i[i]; jA < A_offd_i[i + 1]; jA++) { row_scale = hypre_max(row_scale, A_offd_data[jA]); row_sum += A_offd_data[jA]; } } else { for (jA = A_diag_i[i] + 1; jA < A_diag_i[i + 1]; jA++) { row_scale = hypre_min(row_scale, A_diag_data[jA]); row_sum += A_diag_data[jA]; } for (jA = A_offd_i[i]; jA < A_offd_i[i + 1]; jA++) { row_scale = hypre_min(row_scale, A_offd_data[jA]); row_sum += A_offd_data[jA]; } } } /* compute row entries of S */ S_diag_j[A_diag_i[i]] = -1; if ((hypre_abs(row_sum) > hypre_abs(diag)*max_row_sum) && (max_row_sum < 1.0)) { /* make all dependencies weak */ for (jA = A_diag_i[i] + 1; jA < A_diag_i[i + 1]; jA++) { S_diag_j[jA] = -1; } for (jA = A_offd_i[i]; jA < A_offd_i[i + 1]; jA++) { S_offd_j[jA] = -1; } } else { if (num_functions > 1) { if (diag < 0) { for (jA = A_diag_i[i] + 1; jA < A_diag_i[i + 1]; jA++) { if (A_diag_data[jA] <= strength_threshold * row_scale || dof_func[i] != dof_func[A_diag_j[jA]]) { S_diag_j[jA] = -1; } } for (jA = A_offd_i[i]; jA < A_offd_i[i + 1]; jA++) { if (A_offd_data[jA] <= strength_threshold * row_scale || dof_func[i] != dof_func_offd[A_offd_j[jA]]) { S_offd_j[jA] = -1; } } } else { for (jA = A_diag_i[i] + 1; jA < A_diag_i[i + 1]; jA++) { if (A_diag_data[jA] >= strength_threshold * row_scale || dof_func[i] != dof_func[A_diag_j[jA]]) { S_diag_j[jA] = -1; } } for (jA = A_offd_i[i]; jA < A_offd_i[i + 1]; jA++) { if (A_offd_data[jA] >= strength_threshold * row_scale || dof_func[i] != dof_func_offd[A_offd_j[jA]]) { S_offd_j[jA] = -1; } } } } else { if (diag < 0) { for (jA = A_diag_i[i] + 1; jA < A_diag_i[i + 1]; jA++) { if (A_diag_data[jA] <= strength_threshold * row_scale) { S_diag_j[jA] = -1; } } for (jA = A_offd_i[i]; jA < A_offd_i[i + 1]; jA++) { if (A_offd_data[jA] <= strength_threshold * row_scale) { S_offd_j[jA] = -1; } } } else { for (jA = A_diag_i[i] + 1; jA < A_diag_i[i + 1]; jA++) { if (A_diag_data[jA] >= strength_threshold * row_scale) { S_diag_j[jA] = -1; } } for (jA = A_offd_i[i]; jA < A_offd_i[i + 1]; jA++) { if (A_offd_data[jA] >= strength_threshold * row_scale) { S_offd_j[jA] = -1; } } } } } } /*-------------------------------------------------------------- * "Compress" the strength matrix. * * NOTE: S has *NO DIAGONAL ELEMENT* on any row. Caveat Emptor! * * NOTE: This "compression" section of code may not be removed, the * non-Galerkin routine depends on it. *----------------------------------------------------------------*/ /* RDF: not sure if able to thread this loop */ jS = 0; for (i = 0; i < num_variables; i++) { S_diag_i[i] = jS; for (jA = A_diag_i[i]; jA < A_diag_i[i + 1]; jA++) { if (S_diag_j[jA] > -1) { S_diag_j[jS] = S_diag_j[jA]; S_diag_data[jS] = S_diag_data[jA]; jS++; } } } S_diag_i[num_variables] = jS; hypre_CSRMatrixNumNonzeros(S_diag) = jS; /* RDF: not sure if able to thread this loop */ jS = 0; for (i = 0; i < num_variables; i++) { S_offd_i[i] = jS; for (jA = A_offd_i[i]; jA < A_offd_i[i + 1]; jA++) { if (S_offd_j[jA] > -1) { S_offd_j[jS] = S_offd_j[jA]; S_offd_data[jS] = S_offd_data[jA]; jS++; } } } S_offd_i[num_variables] = jS; hypre_CSRMatrixNumNonzeros(S_offd) = jS; hypre_ParCSRMatrixCommPkg(S) = NULL; *S_ptr = S; hypre_TFree(dof_func_offd, HYPRE_MEMORY_HOST); return (ierr); } /** * Initialize the IJBuffer counters **/ HYPRE_Int hypre_NonGalerkinIJBufferInit( HYPRE_Int *ijbuf_cnt, /* See NonGalerkinIJBufferWrite for parameter descriptions */ HYPRE_Int *ijbuf_rowcounter, HYPRE_Int *ijbuf_numcols ) { HYPRE_Int ierr = 0; (*ijbuf_cnt) = 0; (*ijbuf_rowcounter) = 1; /*Always points to the next row*/ ijbuf_numcols[0] = 0; return ierr; } /** * Initialize the IJBuffer counters **/ HYPRE_Int hypre_NonGalerkinIJBigBufferInit( HYPRE_Int *ijbuf_cnt, /* See NonGalerkinIJBufferWrite for parameter descriptions */ HYPRE_Int *ijbuf_rowcounter, HYPRE_BigInt *ijbuf_numcols ) { HYPRE_Int ierr = 0; (*ijbuf_cnt) = 0; (*ijbuf_rowcounter) = 1; /*Always points to the next row*/ ijbuf_numcols[0] = 0; return ierr; } /** * Update the buffer counters **/ HYPRE_Int hypre_NonGalerkinIJBufferNewRow(HYPRE_BigInt *ijbuf_rownums, /* See NonGalerkinIJBufferWrite for parameter descriptions */ HYPRE_Int *ijbuf_numcols, HYPRE_Int *ijbuf_rowcounter, HYPRE_BigInt new_row) { HYPRE_Int ierr = 0; /* First check to see if the previous row was empty, and if so, overwrite that row */ if ( ijbuf_numcols[(*ijbuf_rowcounter) - 1] == 0 ) { ijbuf_rownums[(*ijbuf_rowcounter) - 1] = new_row; } else { /* Move to the next row */ ijbuf_rownums[(*ijbuf_rowcounter)] = new_row; ijbuf_numcols[(*ijbuf_rowcounter)] = 0; (*ijbuf_rowcounter)++; } return ierr; } /** * Compress the current row in an IJ Buffer by removing duplicate entries **/ HYPRE_Int hypre_NonGalerkinIJBufferCompressRow( HYPRE_Int *ijbuf_cnt, /* See NonGalerkinIJBufferWrite for parameter descriptions */ HYPRE_Int ijbuf_rowcounter, HYPRE_Real *ijbuf_data, HYPRE_BigInt *ijbuf_cols, HYPRE_BigInt *ijbuf_rownums, HYPRE_Int *ijbuf_numcols) { HYPRE_UNUSED_VAR(ijbuf_rownums); HYPRE_Int ierr = 0; HYPRE_Int nentries, i, nduplicate; /* Compress the current row by removing any repeat entries, * making sure to decrement ijbuf_cnt by nduplicate */ nentries = ijbuf_numcols[ ijbuf_rowcounter - 1 ]; nduplicate = 0; hypre_BigQsort1(ijbuf_cols, ijbuf_data, (*ijbuf_cnt) - nentries, (*ijbuf_cnt) - 1 ); for (i = (*ijbuf_cnt) - nentries + 1; i <= (*ijbuf_cnt) - 1; i++) { if ( ijbuf_cols[i] == ijbuf_cols[i - 1] ) { /* Shift duplicate entry down */ nduplicate++; ijbuf_data[i - nduplicate] += ijbuf_data[i]; } else if (nduplicate > 0) { ijbuf_data[i - nduplicate] = ijbuf_data[i]; ijbuf_cols[i - nduplicate] = ijbuf_cols[i]; } } (*ijbuf_cnt) -= nduplicate; ijbuf_numcols[ ijbuf_rowcounter - 1 ] -= nduplicate; return ierr; } /** * Compress the entire buffer, removing duplicate rows **/ HYPRE_Int hypre_NonGalerkinIJBufferCompress( HYPRE_MemoryLocation memory_location, HYPRE_Int ijbuf_size, HYPRE_Int *ijbuf_cnt, /* See NonGalerkinIJBufferWrite for parameter descriptions */ HYPRE_Int *ijbuf_rowcounter, HYPRE_Real **ijbuf_data, HYPRE_BigInt **ijbuf_cols, HYPRE_BigInt **ijbuf_rownums, HYPRE_Int **ijbuf_numcols) { HYPRE_Int ierr = 0; HYPRE_Int *indys = hypre_CTAlloc(HYPRE_Int, (*ijbuf_rowcounter), HYPRE_MEMORY_HOST); HYPRE_Int i, duplicate, cnt_new, rowcounter_new; HYPRE_Int row_loc; HYPRE_BigInt row_start, row_stop, row, prev_row, j; HYPRE_Real *data_new; HYPRE_BigInt *cols_new; HYPRE_BigInt *rownums_new; HYPRE_Int *numcols_new; /* Do a sort on rownums, but store the original order in indys. * Then see if there are any duplicate rows */ for (i = 0; i < (*ijbuf_rowcounter); i++) { indys[i] = i; } hypre_BigQsortbi((*ijbuf_rownums), indys, 0, (*ijbuf_rowcounter) - 1); duplicate = 0; for (i = 1; i < (*ijbuf_rowcounter); i++) { if (indys[i] != (indys[i - 1] + 1)) { duplicate = 1; break; } } /* Compress duplicate rows */ if (duplicate) { /* Accumulate numcols, so that it functions like a CSR row-pointer */ for (i = 1; i < (*ijbuf_rowcounter); i++) { (*ijbuf_numcols)[i] += (*ijbuf_numcols)[i - 1]; } /* Initialize new buffer */ prev_row = -1; rowcounter_new = 0; cnt_new = 0; data_new = hypre_CTAlloc(HYPRE_Real, ijbuf_size, memory_location); cols_new = hypre_CTAlloc(HYPRE_BigInt, ijbuf_size, memory_location); rownums_new = hypre_CTAlloc(HYPRE_BigInt, ijbuf_size, memory_location); numcols_new = hypre_CTAlloc(HYPRE_Int, ijbuf_size, memory_location); numcols_new[0] = 0; /* Cycle through each row */ for (i = 0; i < (*ijbuf_rowcounter); i++) { /* Find which row this is in local and global numberings, and where * this row's data starts and stops in the buffer*/ row_loc = indys[i]; row = (*ijbuf_rownums)[i]; if (row_loc > 0) { row_start = (HYPRE_BigInt) (*ijbuf_numcols)[row_loc - 1]; row_stop = (HYPRE_BigInt) (*ijbuf_numcols)[row_loc]; } else { row_start = 0; row_stop = (HYPRE_BigInt) (*ijbuf_numcols)[row_loc]; } /* Is this a new row? If so, compress previous row, and add a new * one. Noting that prev_row = -1 is a special value */ if (row != prev_row) { if (prev_row != -1) { /* Compress previous row */ hypre_NonGalerkinIJBufferCompressRow(&cnt_new, rowcounter_new, data_new, cols_new, rownums_new, numcols_new); } prev_row = row; numcols_new[rowcounter_new] = 0; rownums_new[rowcounter_new] = row; rowcounter_new++; } /* Copy row into new buffer */ for (j = row_start; j < row_stop; j++) { data_new[cnt_new] = (*ijbuf_data)[j]; cols_new[cnt_new] = (*ijbuf_cols)[j]; numcols_new[rowcounter_new - 1]++; cnt_new++; } } /* Compress the final row */ if (i > 1) { hypre_NonGalerkinIJBufferCompressRow(&cnt_new, rowcounter_new, data_new, cols_new, rownums_new, numcols_new); } *ijbuf_cnt = cnt_new; *ijbuf_rowcounter = rowcounter_new; /* Point to the new buffer */ hypre_TFree(*ijbuf_data, memory_location); hypre_TFree(*ijbuf_cols, memory_location); hypre_TFree(*ijbuf_rownums, memory_location); hypre_TFree(*ijbuf_numcols, memory_location); (*ijbuf_data) = data_new; (*ijbuf_cols) = cols_new; (*ijbuf_rownums) = rownums_new; (*ijbuf_numcols) = numcols_new; } hypre_TFree(indys, HYPRE_MEMORY_HOST); return ierr; } /** * Do a buffered write to an IJ matrix. * That is, write to the buffer, until the buffer is full. Then when the * buffer is full, write to the IJ matrix and reset the buffer counters * In effect, this buffers this operation * A[row_to_write, col_to_write] += val_to_write **/ HYPRE_Int hypre_NonGalerkinIJBufferWrite( HYPRE_IJMatrix B, /* Unassembled matrix to add an entry to */ HYPRE_Int *ijbuf_cnt, /* current buffer size */ HYPRE_Int ijbuf_size, /* max buffer size */ HYPRE_Int *ijbuf_rowcounter, /* num of rows in rownums, (i.e., size of rownums) */ /* This counter will increase as you call this function for multiple rows */ HYPRE_Real **ijbuf_data, /* Array of values, of size ijbuf_size */ HYPRE_BigInt **ijbuf_cols, /* Array of col indices, of size ijbuf_size */ HYPRE_BigInt **ijbuf_rownums, /* Holds row-indices that with numcols makes for a CSR-like data structure*/ HYPRE_Int **ijbuf_numcols, /* rownums[i] is the row num, and numcols holds the number of entries being added */ /* for that row. Note numcols is not cumulative like an actual CSR data structure*/ HYPRE_BigInt row_to_write, /* Entry to add to the buffer */ HYPRE_BigInt col_to_write, /* Ditto */ HYPRE_Real val_to_write ) /* Ditto */ { HYPRE_Int ierr = 0; HYPRE_MemoryLocation memory_location = hypre_IJMatrixMemoryLocation(B); if ( (*ijbuf_cnt) == 0 ) { /* brand new buffer: increment buffer structures for the new row */ hypre_NonGalerkinIJBufferNewRow((*ijbuf_rownums), (*ijbuf_numcols), ijbuf_rowcounter, row_to_write); } else if ((*ijbuf_rownums)[ (*ijbuf_rowcounter) - 1 ] != row_to_write) { /* If this is a new row, compress the previous row */ hypre_NonGalerkinIJBufferCompressRow(ijbuf_cnt, (*ijbuf_rowcounter), (*ijbuf_data), (*ijbuf_cols), (*ijbuf_rownums), (*ijbuf_numcols)); /* increment buffer structures for the new row */ hypre_NonGalerkinIJBufferNewRow( (*ijbuf_rownums), (*ijbuf_numcols), ijbuf_rowcounter, row_to_write); } /* Add new entry to buffer */ (*ijbuf_cols)[(*ijbuf_cnt)] = col_to_write; (*ijbuf_data)[(*ijbuf_cnt)] = val_to_write; (*ijbuf_numcols)[ (*ijbuf_rowcounter) - 1 ]++; (*ijbuf_cnt)++; /* Buffer is full, write to the matrix object */ if ( (*ijbuf_cnt) == (ijbuf_size - 1) ) { /* If the last row is empty, decrement rowcounter */ if ( (*ijbuf_numcols)[ (*ijbuf_rowcounter) - 1 ] == 0) { (*ijbuf_rowcounter)--; } /* Compress and Add Entries */ hypre_NonGalerkinIJBufferCompressRow(ijbuf_cnt, (*ijbuf_rowcounter), (*ijbuf_data), (*ijbuf_cols), (*ijbuf_rownums), (*ijbuf_numcols)); hypre_NonGalerkinIJBufferCompress(memory_location, ijbuf_size, ijbuf_cnt, ijbuf_rowcounter, ijbuf_data, ijbuf_cols, ijbuf_rownums, ijbuf_numcols); ierr += HYPRE_IJMatrixAddToValues(B, *ijbuf_rowcounter, (*ijbuf_numcols), (*ijbuf_rownums), (*ijbuf_cols), (*ijbuf_data)); /* Reinitialize the buffer */ hypre_NonGalerkinIJBufferInit( ijbuf_cnt, ijbuf_rowcounter, (*ijbuf_numcols)); hypre_NonGalerkinIJBufferNewRow((*ijbuf_rownums), (*ijbuf_numcols), ijbuf_rowcounter, row_to_write); } return ierr; } /** * Empty the IJ Buffer with a final AddToValues. **/ HYPRE_Int hypre_NonGalerkinIJBufferEmpty(HYPRE_IJMatrix B, /* See NonGalerkinIJBufferWrite for parameter descriptions */ HYPRE_Int ijbuf_size, HYPRE_Int *ijbuf_cnt, HYPRE_Int ijbuf_rowcounter, HYPRE_Real **ijbuf_data, HYPRE_BigInt **ijbuf_cols, HYPRE_BigInt **ijbuf_rownums, HYPRE_Int **ijbuf_numcols) { HYPRE_Int ierr = 0; HYPRE_MemoryLocation memory_location = hypre_IJMatrixMemoryLocation(B); if ( (*ijbuf_cnt) > 0) { /* Compress the last row and then write */ hypre_NonGalerkinIJBufferCompressRow(ijbuf_cnt, ijbuf_rowcounter, (*ijbuf_data), (*ijbuf_cols), (*ijbuf_rownums), (*ijbuf_numcols)); hypre_NonGalerkinIJBufferCompress(memory_location, ijbuf_size, ijbuf_cnt, &ijbuf_rowcounter, ijbuf_data, ijbuf_cols, ijbuf_rownums, ijbuf_numcols); ierr += HYPRE_IJMatrixAddToValues(B, ijbuf_rowcounter, (*ijbuf_numcols), (*ijbuf_rownums), (*ijbuf_cols), (*ijbuf_data)); } (*ijbuf_cnt = 0); return ierr; } /* * Construct sparsity pattern based on R_I A P, plus entries required by drop tolerance */ hypre_ParCSRMatrix * hypre_NonGalerkinSparsityPattern(hypre_ParCSRMatrix *R_IAP, hypre_ParCSRMatrix *RAP, HYPRE_Int * CF_marker, HYPRE_Real droptol, HYPRE_Int sym_collapse, HYPRE_Int collapse_beta ) { /* MPI Communicator */ MPI_Comm comm = hypre_ParCSRMatrixComm(RAP); HYPRE_MemoryLocation memory_location_RAP = hypre_ParCSRMatrixMemoryLocation(RAP); /* Declare R_IAP */ hypre_CSRMatrix *R_IAP_diag = hypre_ParCSRMatrixDiag(R_IAP); HYPRE_Int *R_IAP_diag_i = hypre_CSRMatrixI(R_IAP_diag); HYPRE_Int *R_IAP_diag_j = hypre_CSRMatrixJ(R_IAP_diag); hypre_CSRMatrix *R_IAP_offd = hypre_ParCSRMatrixOffd(R_IAP); HYPRE_Int *R_IAP_offd_i = hypre_CSRMatrixI(R_IAP_offd); HYPRE_Int *R_IAP_offd_j = hypre_CSRMatrixJ(R_IAP_offd); HYPRE_BigInt *col_map_offd_R_IAP = hypre_ParCSRMatrixColMapOffd(R_IAP); /* Declare RAP */ hypre_CSRMatrix *RAP_diag = hypre_ParCSRMatrixDiag(RAP); HYPRE_Int *RAP_diag_i = hypre_CSRMatrixI(RAP_diag); HYPRE_Real *RAP_diag_data = hypre_CSRMatrixData(RAP_diag); HYPRE_Int *RAP_diag_j = hypre_CSRMatrixJ(RAP_diag); HYPRE_BigInt first_col_diag_RAP = hypre_ParCSRMatrixFirstColDiag(RAP); HYPRE_Int num_cols_diag_RAP = hypre_CSRMatrixNumCols(RAP_diag); HYPRE_BigInt last_col_diag_RAP = first_col_diag_RAP + (HYPRE_BigInt)num_cols_diag_RAP - 1; hypre_CSRMatrix *RAP_offd = hypre_ParCSRMatrixOffd(RAP); HYPRE_Int *RAP_offd_i = hypre_CSRMatrixI(RAP_offd); HYPRE_Real *RAP_offd_data = NULL; HYPRE_Int *RAP_offd_j = hypre_CSRMatrixJ(RAP_offd); HYPRE_BigInt *col_map_offd_RAP = hypre_ParCSRMatrixColMapOffd(RAP); HYPRE_Int num_cols_RAP_offd = hypre_CSRMatrixNumCols(RAP_offd); HYPRE_Int num_variables = hypre_CSRMatrixNumRows(RAP_diag); /* Declare A */ HYPRE_Int num_fine_variables = hypre_CSRMatrixNumRows(R_IAP_diag); /* Declare IJ matrices */ HYPRE_IJMatrix Pattern; hypre_ParCSRMatrix *Pattern_CSR = NULL; /* Buffered IJAddToValues */ HYPRE_Int ijbuf_cnt, ijbuf_size, ijbuf_rowcounter; HYPRE_Real *ijbuf_data; HYPRE_BigInt *ijbuf_cols, *ijbuf_rownums; HYPRE_Int *ijbuf_numcols; /* Buffered IJAddToValues for Symmetric Entries */ HYPRE_Int ijbuf_sym_cnt, ijbuf_sym_rowcounter; HYPRE_Real *ijbuf_sym_data; HYPRE_BigInt *ijbuf_sym_cols, *ijbuf_sym_rownums; HYPRE_Int *ijbuf_sym_numcols; /* Other Declarations */ HYPRE_Real max_entry = 0.0; HYPRE_Real max_entry_offd = 0.0; HYPRE_Int *rownz = NULL; HYPRE_Int i, j, Cpt, row_start, row_end; HYPRE_BigInt global_row, global_col; HYPRE_ANNOTATE_FUNC_BEGIN; /* Other Setup */ if (num_cols_RAP_offd) { RAP_offd_data = hypre_CSRMatrixData(RAP_offd); } /* * Initialize the IJ matrix, leveraging our rough knowledge of the * nonzero structure of Pattern based on RAP * * ilower, iupper, jlower, jupper */ HYPRE_IJMatrixCreate(comm, first_col_diag_RAP, last_col_diag_RAP, first_col_diag_RAP, last_col_diag_RAP, &Pattern); HYPRE_IJMatrixSetObjectType(Pattern, HYPRE_PARCSR); rownz = hypre_CTAlloc(HYPRE_Int, num_variables, HYPRE_MEMORY_HOST); for (i = 0; i < num_variables; i++) { rownz[i] = (HYPRE_Int)(1.2 * (RAP_diag_i[i + 1] - RAP_diag_i[i]) + 1.2 * (RAP_offd_i[i + 1] - RAP_offd_i[i])); } HYPRE_IJMatrixSetRowSizes(Pattern, rownz); HYPRE_IJMatrixInitialize(Pattern); hypre_TFree(rownz, HYPRE_MEMORY_HOST); /* * For efficiency, we do a buffered IJAddToValues. * Here, we initialize the buffer and then initialize the buffer counters */ ijbuf_size = 1000; ijbuf_data = hypre_CTAlloc(HYPRE_Real, ijbuf_size, memory_location_RAP); ijbuf_cols = hypre_CTAlloc(HYPRE_BigInt, ijbuf_size, memory_location_RAP); ijbuf_rownums = hypre_CTAlloc(HYPRE_BigInt, ijbuf_size, memory_location_RAP); ijbuf_numcols = hypre_CTAlloc(HYPRE_Int, ijbuf_size, memory_location_RAP); hypre_NonGalerkinIJBigBufferInit(&ijbuf_cnt, &ijbuf_rowcounter, ijbuf_cols); if (sym_collapse) { ijbuf_sym_data = hypre_CTAlloc(HYPRE_Real, ijbuf_size, memory_location_RAP); ijbuf_sym_cols = hypre_CTAlloc(HYPRE_BigInt, ijbuf_size, memory_location_RAP); ijbuf_sym_rownums = hypre_CTAlloc(HYPRE_BigInt, ijbuf_size, memory_location_RAP); ijbuf_sym_numcols = hypre_CTAlloc(HYPRE_Int, ijbuf_size, memory_location_RAP); hypre_NonGalerkinIJBigBufferInit(&ijbuf_sym_cnt, &ijbuf_sym_rowcounter, ijbuf_sym_cols); } /* * Place entries in R_IAP into Pattern */ Cpt = -1; /* Cpt contains the fine grid index of the i-th Cpt */ for (i = 0; i < num_variables; i++) { global_row = i + first_col_diag_RAP; /* Find the next Coarse Point in CF_marker */ for (j = Cpt + 1; j < num_fine_variables; j++) { if (CF_marker[j] == 1) /* Found Next C-point */ { Cpt = j; break; } } /* Diag Portion */ row_start = R_IAP_diag_i[Cpt]; row_end = R_IAP_diag_i[Cpt + 1]; for (j = row_start; j < row_end; j++) { global_col = R_IAP_diag_j[j] + first_col_diag_RAP; /* This call adds a 1 x 1 to i j data */ hypre_NonGalerkinIJBufferWrite(Pattern, &ijbuf_cnt, ijbuf_size, &ijbuf_rowcounter, &ijbuf_data, &ijbuf_cols, &ijbuf_rownums, &ijbuf_numcols, global_row, global_col, 1.0); if (sym_collapse) { hypre_NonGalerkinIJBufferWrite(Pattern, &ijbuf_sym_cnt, ijbuf_size, &ijbuf_sym_rowcounter, &ijbuf_sym_data, &ijbuf_sym_cols, &ijbuf_sym_rownums, &ijbuf_sym_numcols, global_col, global_row, 1.0); } } /* Offdiag Portion */ row_start = R_IAP_offd_i[Cpt]; row_end = R_IAP_offd_i[Cpt + 1]; for (j = row_start; j < row_end; j++) { global_col = col_map_offd_R_IAP[R_IAP_offd_j[j]]; /* This call adds a 1 x 1 to i j data */ hypre_NonGalerkinIJBufferWrite(Pattern, &ijbuf_cnt, ijbuf_size, &ijbuf_rowcounter, &ijbuf_data, &ijbuf_cols, &ijbuf_rownums, &ijbuf_numcols, global_row, global_col, 1.0); if (sym_collapse) { hypre_NonGalerkinIJBufferWrite(Pattern, &ijbuf_sym_cnt, ijbuf_size, &ijbuf_sym_rowcounter, &ijbuf_sym_data, &ijbuf_sym_cols, &ijbuf_sym_rownums, &ijbuf_sym_numcols, global_col, global_row, 1.0); } } } /* * Use drop-tolerance to compute new entries for sparsity pattern */ /*#ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i,j,max_entry,max_entry_offd,global_col,global_row) HYPRE_SMP_SCHEDULE #endif */ for (i = 0; i < num_variables; i++) { global_row = i + first_col_diag_RAP; /* Compute the drop tolerance for this row, which is just * abs(max of row i)*droptol */ max_entry = -1.0; for (j = RAP_diag_i[i]; j < RAP_diag_i[i + 1]; j++) { if ( (RAP_diag_j[j] != i) && (max_entry < hypre_abs(RAP_diag_data[j]) ) ) { max_entry = hypre_abs(RAP_diag_data[j]); } } for (j = RAP_offd_i[i]; j < RAP_offd_i[i + 1]; j++) { { if ( max_entry < hypre_abs(RAP_offd_data[j]) ) { max_entry = hypre_abs(RAP_offd_data[j]); } } } max_entry *= droptol; max_entry_offd = max_entry * collapse_beta; /* Loop over diag portion, adding all entries that are "strong" */ for (j = RAP_diag_i[i]; j < RAP_diag_i[i + 1]; j++) { if ( hypre_abs(RAP_diag_data[j]) > max_entry ) { global_col = RAP_diag_j[j] + first_col_diag_RAP; /*#ifdef HYPRE_USING_OPENMP #pragma omp critical (IJAdd) #endif {*/ /* For efficiency, we do a buffered IJAddToValues * A[global_row, global_col] += 1.0 */ hypre_NonGalerkinIJBufferWrite(Pattern, &ijbuf_cnt, ijbuf_size, &ijbuf_rowcounter, &ijbuf_data, &ijbuf_cols, &ijbuf_rownums, &ijbuf_numcols, global_row, global_col, 1.0); if (sym_collapse) { hypre_NonGalerkinIJBufferWrite(Pattern, &ijbuf_sym_cnt, ijbuf_size, &ijbuf_sym_rowcounter, &ijbuf_sym_data, &ijbuf_sym_cols, &ijbuf_sym_rownums, &ijbuf_sym_numcols, global_col, global_row, 1.0); } /*}*/ } } /* Loop over offd portion, adding all entries that are "strong" */ for (j = RAP_offd_i[i]; j < RAP_offd_i[i + 1]; j++) { if ( hypre_abs(RAP_offd_data[j]) > max_entry_offd ) { global_col = col_map_offd_RAP[ RAP_offd_j[j] ]; /*#ifdef HYPRE_USING_OPENMP #pragma omp critical (IJAdd) #endif {*/ /* For efficiency, we do a buffered IJAddToValues * A[global_row, global_col] += 1.0 */ hypre_NonGalerkinIJBufferWrite(Pattern, &ijbuf_cnt, ijbuf_size, &ijbuf_rowcounter, &ijbuf_data, &ijbuf_cols, &ijbuf_rownums, &ijbuf_numcols, global_row, global_col, 1.0); if (sym_collapse) { hypre_NonGalerkinIJBufferWrite(Pattern, &ijbuf_sym_cnt, ijbuf_size, &ijbuf_sym_rowcounter, &ijbuf_sym_data, &ijbuf_sym_cols, &ijbuf_sym_rownums, &ijbuf_sym_numcols, global_col, global_row, 1.0); } /*}*/ } } } /* For efficiency, we do a buffered IJAddToValues. * This empties the buffer of any remaining values */ hypre_NonGalerkinIJBufferEmpty(Pattern, ijbuf_size, &ijbuf_cnt, ijbuf_rowcounter, &ijbuf_data, &ijbuf_cols, &ijbuf_rownums, &ijbuf_numcols); if (sym_collapse) { hypre_NonGalerkinIJBufferEmpty(Pattern, ijbuf_size, &ijbuf_sym_cnt, ijbuf_sym_rowcounter, &ijbuf_sym_data, &ijbuf_sym_cols, &ijbuf_sym_rownums, &ijbuf_sym_numcols); } /* Finalize Construction of Pattern */ HYPRE_IJMatrixAssemble(Pattern); HYPRE_IJMatrixGetObject(Pattern, (void**) &Pattern_CSR); /* Deallocate */ HYPRE_IJMatrixSetObjectType(Pattern, -1); HYPRE_IJMatrixDestroy(Pattern); hypre_TFree(ijbuf_data, memory_location_RAP); hypre_TFree(ijbuf_cols, memory_location_RAP); hypre_TFree(ijbuf_rownums, memory_location_RAP); hypre_TFree(ijbuf_numcols, memory_location_RAP); if (sym_collapse) { hypre_TFree(ijbuf_sym_data, memory_location_RAP); hypre_TFree(ijbuf_sym_cols, memory_location_RAP); hypre_TFree(ijbuf_sym_rownums, memory_location_RAP); hypre_TFree(ijbuf_sym_numcols, memory_location_RAP); } HYPRE_ANNOTATE_FUNC_END; return Pattern_CSR; } HYPRE_Int hypre_BoomerAMGBuildNonGalerkinCoarseOperator( hypre_ParCSRMatrix **RAP_ptr, hypre_ParCSRMatrix *AP, HYPRE_Real strong_threshold, HYPRE_Real max_row_sum, HYPRE_Int num_functions, HYPRE_Int * dof_func_value, HYPRE_Int * CF_marker, HYPRE_Real droptol, HYPRE_Int sym_collapse, HYPRE_Real lump_percent, HYPRE_Int collapse_beta ) { /* Initializations */ MPI_Comm comm = hypre_ParCSRMatrixComm(*RAP_ptr); hypre_ParCSRMatrix *S = NULL; hypre_ParCSRMatrix *RAP = *RAP_ptr; HYPRE_Int i, j, k, row_start, row_end, num_cols_offd_Sext, num_procs; HYPRE_Int S_ext_diag_size, S_ext_offd_size; HYPRE_BigInt last_col_diag_RAP; HYPRE_Int cnt_offd, cnt_diag, cnt; HYPRE_Int col_indx_Pattern, current_Pattern_j, col_indx_RAP; HYPRE_BigInt value; HYPRE_BigInt *temp = NULL; HYPRE_MemoryLocation memory_location_RAP = hypre_ParCSRMatrixMemoryLocation(RAP); /* Lumping related variables */ HYPRE_IJMatrix ijmatrix; HYPRE_BigInt * Pattern_offd_indices = NULL; HYPRE_BigInt * S_offd_indices = NULL; HYPRE_BigInt * offd_intersection = NULL; HYPRE_Real * offd_intersection_data = NULL; HYPRE_Int * diag_intersection = NULL; HYPRE_Real * diag_intersection_data = NULL; HYPRE_Int Pattern_offd_indices_len = 0; HYPRE_Int Pattern_offd_indices_allocated_len = 0; HYPRE_Int S_offd_indices_len = 0; HYPRE_Int S_offd_indices_allocated_len = 0; HYPRE_Int offd_intersection_len = 0; HYPRE_Int offd_intersection_allocated_len = 0; HYPRE_Int diag_intersection_len = 0; HYPRE_Int diag_intersection_allocated_len = 0; HYPRE_Real intersection_len = 0; HYPRE_Int * Pattern_indices_ptr = NULL; HYPRE_Int Pattern_diag_indices_len = 0; HYPRE_Int global_row = 0; HYPRE_Int has_row_ended = 0; HYPRE_Real lump_value = 0.; HYPRE_Real diagonal_lump_value = 0.; HYPRE_Real neg_lump_value = 0.; HYPRE_Real sum_strong_neigh = 0.; HYPRE_Int * rownz = NULL; /* offd and diag portions of RAP */ hypre_CSRMatrix *RAP_diag = hypre_ParCSRMatrixDiag(RAP); HYPRE_Int *RAP_diag_i = hypre_CSRMatrixI(RAP_diag); HYPRE_Real *RAP_diag_data = hypre_CSRMatrixData(RAP_diag); HYPRE_Int *RAP_diag_j = hypre_CSRMatrixJ(RAP_diag); HYPRE_BigInt first_col_diag_RAP = hypre_ParCSRMatrixFirstColDiag(RAP); HYPRE_Int num_cols_diag_RAP = hypre_CSRMatrixNumCols(RAP_diag); hypre_CSRMatrix *RAP_offd = hypre_ParCSRMatrixOffd(RAP); HYPRE_Int *RAP_offd_i = hypre_CSRMatrixI(RAP_offd); HYPRE_Real *RAP_offd_data = NULL; HYPRE_Int *RAP_offd_j = hypre_CSRMatrixJ(RAP_offd); HYPRE_BigInt *col_map_offd_RAP = hypre_ParCSRMatrixColMapOffd(RAP); HYPRE_Int num_cols_RAP_offd = hypre_CSRMatrixNumCols(RAP_offd); HYPRE_Int num_variables = hypre_CSRMatrixNumRows(RAP_diag); /* offd and diag portions of S */ hypre_CSRMatrix *S_diag = NULL; HYPRE_Int *S_diag_i = NULL; HYPRE_Real *S_diag_data = NULL; HYPRE_Int *S_diag_j = NULL; hypre_CSRMatrix *S_offd = NULL; HYPRE_Int *S_offd_i = NULL; HYPRE_Real *S_offd_data = NULL; HYPRE_Int *S_offd_j = NULL; HYPRE_BigInt *col_map_offd_S = NULL; HYPRE_Int num_cols_offd_S; /* HYPRE_Int num_nonzeros_S_diag; */ /* off processor portions of S */ hypre_CSRMatrix *S_ext = NULL; HYPRE_Int *S_ext_i = NULL; HYPRE_Real *S_ext_data = NULL; HYPRE_BigInt *S_ext_j = NULL; HYPRE_Int *S_ext_diag_i = NULL; HYPRE_Real *S_ext_diag_data = NULL; HYPRE_Int *S_ext_diag_j = NULL; HYPRE_Int *S_ext_offd_i = NULL; HYPRE_Real *S_ext_offd_data = NULL; HYPRE_Int *S_ext_offd_j = NULL; HYPRE_BigInt *col_map_offd_Sext = NULL; /* HYPRE_Int num_nonzeros_S_ext_diag; HYPRE_Int num_nonzeros_S_ext_offd; HYPRE_Int num_rows_Sext = 0; */ HYPRE_Int row_indx_Sext = 0; /* offd and diag portions of Pattern */ hypre_ParCSRMatrix *Pattern = NULL; hypre_CSRMatrix *Pattern_diag = NULL; HYPRE_Int *Pattern_diag_i = NULL; HYPRE_Real *Pattern_diag_data = NULL; HYPRE_Int *Pattern_diag_j = NULL; hypre_CSRMatrix *Pattern_offd = NULL; HYPRE_Int *Pattern_offd_i = NULL; HYPRE_Real *Pattern_offd_data = NULL; HYPRE_Int *Pattern_offd_j = NULL; HYPRE_BigInt *col_map_offd_Pattern = NULL; HYPRE_Int num_cols_Pattern_offd; HYPRE_Int my_id; /* Buffered IJAddToValues */ HYPRE_Int ijbuf_cnt, ijbuf_size, ijbuf_rowcounter; HYPRE_Real *ijbuf_data; HYPRE_BigInt *ijbuf_cols, *ijbuf_rownums; HYPRE_Int *ijbuf_numcols; /* Buffered IJAddToValues for Symmetric Entries */ HYPRE_Int ijbuf_sym_cnt, ijbuf_sym_rowcounter; HYPRE_Real *ijbuf_sym_data; HYPRE_BigInt *ijbuf_sym_cols, *ijbuf_sym_rownums; HYPRE_Int *ijbuf_sym_numcols; HYPRE_ANNOTATE_FUNC_BEGIN; /* Further Initializations */ if (num_cols_RAP_offd) { RAP_offd_data = hypre_CSRMatrixData(RAP_offd); } hypre_MPI_Comm_size(comm, &num_procs); hypre_MPI_Comm_rank(comm, &my_id); /* Compute Sparsity Pattern */ Pattern = hypre_NonGalerkinSparsityPattern(AP, RAP, CF_marker, droptol, sym_collapse, collapse_beta); Pattern_diag = hypre_ParCSRMatrixDiag(Pattern); Pattern_diag_i = hypre_CSRMatrixI(Pattern_diag); Pattern_diag_data = hypre_CSRMatrixData(Pattern_diag); Pattern_diag_j = hypre_CSRMatrixJ(Pattern_diag); Pattern_offd = hypre_ParCSRMatrixOffd(Pattern); Pattern_offd_i = hypre_CSRMatrixI(Pattern_offd); Pattern_offd_j = hypre_CSRMatrixJ(Pattern_offd); col_map_offd_Pattern = hypre_ParCSRMatrixColMapOffd(Pattern); num_cols_Pattern_offd = hypre_CSRMatrixNumCols(Pattern_offd); if (num_cols_Pattern_offd) { Pattern_offd_data = hypre_CSRMatrixData(Pattern_offd); } /** * Fill in the entries of Pattern with entries from RAP **/ /* First, sort column indices in RAP and Pattern */ for (i = 0; i < num_variables; i++) { /* The diag matrices store the diagonal as first element in each row. * We maintain that for the case of Pattern and RAP, because the * strength of connection routine relies on it and we need to ignore * diagonal entries in Pattern later during set intersections. * */ /* Sort diag portion of RAP */ row_start = RAP_diag_i[i]; if ( RAP_diag_j[row_start] == i) { row_start = row_start + 1; } row_end = RAP_diag_i[i + 1]; hypre_qsort1(RAP_diag_j, RAP_diag_data, row_start, row_end - 1 ); /* Sort diag portion of Pattern */ row_start = Pattern_diag_i[i]; if ( Pattern_diag_j[row_start] == i) { row_start = row_start + 1; } row_end = Pattern_diag_i[i + 1]; hypre_qsort1(Pattern_diag_j, Pattern_diag_data, row_start, row_end - 1 ); /* Sort offd portion of RAP */ row_start = RAP_offd_i[i]; row_end = RAP_offd_i[i + 1]; hypre_qsort1(RAP_offd_j, RAP_offd_data, row_start, row_end - 1 ); /* Sort offd portion of Pattern */ /* Be careful to map coarse dof i with CF_marker into Pattern */ row_start = Pattern_offd_i[i]; row_end = Pattern_offd_i[i + 1]; hypre_qsort1(Pattern_offd_j, Pattern_offd_data, row_start, row_end - 1 ); } /* Create Strength matrix based on RAP or Pattern. If Pattern is used, * then the SortedCopyParCSRData(...) function call must also be commented * back in */ /* hypre_SortedCopyParCSRData(RAP, Pattern); */ if (0) { /* hypre_BoomerAMG_MyCreateS(Pattern, strong_threshold, max_row_sum, */ hypre_BoomerAMG_MyCreateS(RAP, strong_threshold, max_row_sum, num_functions, dof_func_value, &S); } else { /* Passing in "1, NULL" because dof_array is not needed * because we assume that the number of functions is 1 */ /* hypre_BoomerAMG_MyCreateS(Pattern, strong_threshold, max_row_sum,*/ hypre_BoomerAMG_MyCreateS(RAP, strong_threshold, max_row_sum, 1, NULL, &S); } /* Grab diag and offd parts of S */ S_diag = hypre_ParCSRMatrixDiag(S); S_diag_i = hypre_CSRMatrixI(S_diag); S_diag_j = hypre_CSRMatrixJ(S_diag); S_diag_data = hypre_CSRMatrixData(S_diag); S_offd = hypre_ParCSRMatrixOffd(S); S_offd_i = hypre_CSRMatrixI(S_offd); S_offd_j = hypre_CSRMatrixJ(S_offd); S_offd_data = hypre_CSRMatrixData(S_offd); col_map_offd_S = hypre_ParCSRMatrixColMapOffd(S); num_cols_offd_S = hypre_CSRMatrixNumCols(S_offd); /* num_nonzeros_S_diag = S_diag_i[num_variables]; */ /* Grab part of S that is distance one away from the local rows * This is needed later for the stencil collapsing. This section * of the code mimics par_rap.c when it extracts Ps_ext. * When moving from par_rap.c, the variable name changes were: * A --> RAP * P --> S * Ps_ext --> S_ext * P_ext_diag --> S_ext_diag * P_ext_offd --> S_ext_offd * * The data layout of S_ext as returned by ExtractBExt gives you only global * column indices, and must be converted to the local numbering. This code * section constructs S_ext_diag and S_ext_offd, which are the distance 1 * couplings in S based on the sparsity structure in RAP. * --> S_ext_diag corresponds to the same column slice that RAP_diag * corresponds to. Thus, the column indexing is the same as in * RAP_diag such that S_ext_diag_j[k] just needs to be offset by * the RAP_diag first global dof offset. * --> S_ext_offd column indexing is a little more complicated, and * requires the computation below of col_map_S_ext_offd, which * maps the local 0,1,2,... column indexing in S_ext_offd to global * dof numbers. Note, that the num_cols_RAP_offd is NOT equal to * num_cols_offd_S_ext * --> The row indexing of S_ext_diag|offd is as follows. Use * col_map_offd_RAP, where the first index corresponds to the * first global row index in S_ext_diag|offd. Remember that ExtractBExt * grabs the information from S required for locally computing * (RAP*S)[proc_k row slice, :] */ if (num_procs > 1) { S_ext = hypre_ParCSRMatrixExtractBExt(S, RAP, 1); S_ext_data = hypre_CSRMatrixData(S_ext); S_ext_i = hypre_CSRMatrixI(S_ext); S_ext_j = hypre_CSRMatrixBigJ(S_ext); } /* This uses the num_cols_RAP_offd to set S_ext_diag|offd_i, because S_ext * is the off-processor information needed to compute RAP*S. That is, * num_cols_RAP_offd represents the number of rows needed from S_ext for * the multiplication */ S_ext_diag_i = hypre_CTAlloc(HYPRE_Int, num_cols_RAP_offd + 1, HYPRE_MEMORY_HOST); S_ext_offd_i = hypre_CTAlloc(HYPRE_Int, num_cols_RAP_offd + 1, HYPRE_MEMORY_HOST); S_ext_diag_size = 0; S_ext_offd_size = 0; /* num_rows_Sext = num_cols_RAP_offd; */ last_col_diag_RAP = first_col_diag_RAP + ((HYPRE_BigInt) (num_cols_diag_RAP - 1)); /* construct the S_ext_diag and _offd row-pointer arrays by counting elements * This looks to create offd and diag blocks related to the local rows belonging * to this processor...we may not need to split up S_ext this way...or we could. * It would make for faster binary searching and set intersecting later...this will * be the bottle neck so LETS SPLIT THIS UP Between offd and diag*/ for (i = 0; i < num_cols_RAP_offd; i++) { for (j = S_ext_i[i]; j < S_ext_i[i + 1]; j++) { if (S_ext_j[j] < first_col_diag_RAP || S_ext_j[j] > last_col_diag_RAP) { S_ext_offd_size++; } else { S_ext_diag_size++; } } S_ext_diag_i[i + 1] = S_ext_diag_size; S_ext_offd_i[i + 1] = S_ext_offd_size; } if (S_ext_diag_size) { S_ext_diag_j = hypre_CTAlloc(HYPRE_Int, S_ext_diag_size, HYPRE_MEMORY_HOST); S_ext_diag_data = hypre_CTAlloc(HYPRE_Real, S_ext_diag_size, HYPRE_MEMORY_HOST); } if (S_ext_offd_size) { S_ext_offd_j = hypre_CTAlloc(HYPRE_Int, S_ext_offd_size, HYPRE_MEMORY_HOST); S_ext_offd_data = hypre_CTAlloc(HYPRE_Real, S_ext_offd_size, HYPRE_MEMORY_HOST); } /* This copies over the column indices into the offd and diag parts. * The diag portion has it's local column indices shifted to start at 0. * The offd portion requires more work to construct the col_map_offd array * and a local column ordering. */ cnt_offd = 0; cnt_diag = 0; cnt = 0; for (i = 0; i < num_cols_RAP_offd; i++) { for (j = S_ext_i[i]; j < S_ext_i[i + 1]; j++) { if (S_ext_j[j] < first_col_diag_RAP || S_ext_j[j] > last_col_diag_RAP) { S_ext_offd_data[cnt_offd] = S_ext_data[j]; //S_ext_offd_j[cnt_offd++] = S_ext_j[j]; S_ext_j[cnt_offd++] = S_ext_j[j]; } else { S_ext_diag_data[cnt_diag] = S_ext_data[j]; S_ext_diag_j[cnt_diag++] = (HYPRE_Int)(S_ext_j[j] - first_col_diag_RAP); } } } /* This creates col_map_offd_Sext */ if (S_ext_offd_size || num_cols_offd_S) { temp = hypre_CTAlloc(HYPRE_BigInt, S_ext_offd_size + num_cols_offd_S, HYPRE_MEMORY_HOST); for (i = 0; i < S_ext_offd_size; i++) { temp[i] = S_ext_j[i]; } cnt = S_ext_offd_size; for (i = 0; i < num_cols_offd_S; i++) { temp[cnt++] = col_map_offd_S[i]; } } if (cnt) { /* after this, the first so many entries of temp will hold the * unique column indices in S_ext_offd_j unioned with the indices * in col_map_offd_S */ hypre_BigQsort0(temp, 0, cnt - 1); num_cols_offd_Sext = 1; value = temp[0]; for (i = 1; i < cnt; i++) { if (temp[i] > value) { value = temp[i]; temp[num_cols_offd_Sext++] = value; } } } else { num_cols_offd_Sext = 0; } /* num_nonzeros_S_ext_diag = cnt_diag; num_nonzeros_S_ext_offd = S_ext_offd_size; */ col_map_offd_Sext = hypre_CTAlloc(HYPRE_BigInt, num_cols_offd_Sext, HYPRE_MEMORY_HOST); for (i = 0; i < num_cols_offd_Sext; i++) { col_map_offd_Sext[i] = temp[i]; } if (S_ext_offd_size || num_cols_offd_S) { hypre_TFree(temp, HYPRE_MEMORY_HOST); } /* look for S_ext_offd_j[i] in col_map_offd_Sext, and set S_ext_offd_j[i] * to the index of that column value in col_map_offd_Sext */ for (i = 0 ; i < S_ext_offd_size; i++) { S_ext_offd_j[i] = hypre_BigBinarySearch(col_map_offd_Sext, S_ext_j[i], num_cols_offd_Sext); } if (num_procs > 1) { hypre_CSRMatrixDestroy(S_ext); S_ext = NULL; } /* Need to sort column indices in S and S_ext */ for (i = 0; i < num_variables; i++) { /* Re-Sort diag portion of Pattern, placing the diagonal entry in a * sorted position */ row_start = Pattern_diag_i[i]; row_end = Pattern_diag_i[i + 1]; hypre_qsort1(Pattern_diag_j, Pattern_diag_data, row_start, row_end - 1 ); /* Sort diag portion of S, noting that no diagonal entry */ /* S has not "data" array...it's just NULL */ row_start = S_diag_i[i]; row_end = S_diag_i[i + 1]; hypre_qsort1(S_diag_j, S_diag_data, row_start, row_end - 1 ); /* Sort offd portion of S */ /* S has no "data" array...it's just NULL */ row_start = S_offd_i[i]; row_end = S_offd_i[i + 1]; hypre_qsort1(S_offd_j, S_offd_data, row_start, row_end - 1 ); } /* Sort S_ext * num_cols_RAP_offd equals num_rows for S_ext*/ for (i = 0; i < num_cols_RAP_offd; i++) { /* Sort diag portion of S_ext */ row_start = S_ext_diag_i[i]; row_end = S_ext_diag_i[i + 1]; hypre_qsort1(S_ext_diag_j, S_ext_diag_data, row_start, row_end - 1 ); /* Sort offd portion of S_ext */ row_start = S_ext_offd_i[i]; row_end = S_ext_offd_i[i + 1]; hypre_qsort1(S_ext_offd_j, S_ext_offd_data, row_start, row_end - 1 ); } /* * Now, for the fun stuff -- Computing the Non-Galerkin Operator */ /* Initialize the ijmatrix, leveraging our knowledge of the nonzero * structure in Pattern */ HYPRE_IJMatrixCreate(comm, first_col_diag_RAP, last_col_diag_RAP, first_col_diag_RAP, last_col_diag_RAP, &ijmatrix); HYPRE_IJMatrixSetObjectType(ijmatrix, HYPRE_PARCSR); rownz = hypre_CTAlloc(HYPRE_Int, num_variables, HYPRE_MEMORY_HOST); for (i = 0; i < num_variables; i++) { rownz[i] = (HYPRE_Int)(1.2 * (Pattern_diag_i[i + 1] - Pattern_diag_i[i]) + 1.2 * (Pattern_offd_i[i + 1] - Pattern_offd_i[i])); } HYPRE_IJMatrixSetRowSizes(ijmatrix, rownz); HYPRE_IJMatrixInitialize(ijmatrix); hypre_TFree(rownz, HYPRE_MEMORY_HOST); /* *For efficiency, we do a buffered IJAddToValues. * Here, we initialize the buffer and then initialize the buffer counters */ ijbuf_size = 1000; ijbuf_data = hypre_CTAlloc(HYPRE_Real, ijbuf_size, memory_location_RAP); ijbuf_cols = hypre_CTAlloc(HYPRE_BigInt, ijbuf_size, memory_location_RAP); ijbuf_rownums = hypre_CTAlloc(HYPRE_BigInt, ijbuf_size, memory_location_RAP); ijbuf_numcols = hypre_CTAlloc(HYPRE_Int, ijbuf_size, memory_location_RAP); hypre_NonGalerkinIJBigBufferInit( &ijbuf_cnt, &ijbuf_rowcounter, ijbuf_cols ); if (sym_collapse) { ijbuf_sym_data = hypre_CTAlloc(HYPRE_Real, ijbuf_size, memory_location_RAP); ijbuf_sym_cols = hypre_CTAlloc(HYPRE_BigInt, ijbuf_size, memory_location_RAP); ijbuf_sym_rownums = hypre_CTAlloc(HYPRE_BigInt, ijbuf_size, memory_location_RAP); ijbuf_sym_numcols = hypre_CTAlloc(HYPRE_Int, ijbuf_size, memory_location_RAP); hypre_NonGalerkinIJBigBufferInit( &ijbuf_sym_cnt, &ijbuf_sym_rowcounter, ijbuf_sym_cols ); } /* * Eliminate Entries In RAP_diag * */ for (i = 0; i < num_variables; i++) { global_row = (HYPRE_BigInt) i + first_col_diag_RAP; row_start = RAP_diag_i[i]; row_end = RAP_diag_i[i + 1]; has_row_ended = 0; /* Only do work if row has nonzeros */ if ( row_start < row_end) { /* Grab pointer to current entry in Pattern_diag */ current_Pattern_j = Pattern_diag_i[i]; col_indx_Pattern = Pattern_diag_j[current_Pattern_j]; /* Grab this row's indices out of Pattern offd and diag. This will * be for computing index set intersections for lumping */ /* Ensure adequate length */ Pattern_offd_indices_len = Pattern_offd_i[i + 1] - Pattern_offd_i[i]; if (Pattern_offd_indices_allocated_len < Pattern_offd_indices_len) { hypre_TFree(Pattern_offd_indices, HYPRE_MEMORY_HOST); Pattern_offd_indices = hypre_CTAlloc(HYPRE_BigInt, Pattern_offd_indices_len, HYPRE_MEMORY_HOST); Pattern_offd_indices_allocated_len = Pattern_offd_indices_len; } /* Grab sub array from col_map, corresponding to the slice of Pattern_offd_j */ hypre_GrabSubArray(Pattern_offd_j, Pattern_offd_i[i], Pattern_offd_i[i + 1] - 1, col_map_offd_Pattern, Pattern_offd_indices); /* No need to grab info out of Pattern_diag_j[...], here we just start from * Pattern_diag_i[i] and end at index Pattern_diag_i[i+1] - 1. We do need to * ignore the diagonal entry in Pattern, because we don't lump entries there */ if ( Pattern_diag_j[Pattern_diag_i[i]] == i ) { Pattern_indices_ptr = &( Pattern_diag_j[Pattern_diag_i[i] + 1]); Pattern_diag_indices_len = Pattern_diag_i[i + 1] - Pattern_diag_i[i] - 1; } else { Pattern_indices_ptr = &( Pattern_diag_j[Pattern_diag_i[i]]); Pattern_diag_indices_len = Pattern_diag_i[i + 1] - Pattern_diag_i[i]; } } for (j = row_start; j < row_end; j++) { col_indx_RAP = RAP_diag_j[j]; /* Ignore zero entries in RAP */ if ( RAP_diag_data[j] != 0.0) { /* Don't change the diagonal, just write it */ if (col_indx_RAP == i) { /*#ifdef HY PRE_USING_OPENMP #pragma omp critical (IJAdd) #endif {*/ /* For efficiency, we do a buffered IJAddToValues. * A[global_row, global_row] += RAP_diag_data[j] */ hypre_NonGalerkinIJBufferWrite( ijmatrix, &ijbuf_cnt, ijbuf_size, &ijbuf_rowcounter, &ijbuf_data, &ijbuf_cols, &ijbuf_rownums, &ijbuf_numcols, global_row, global_row, RAP_diag_data[j] ); /*}*/ } /* The entry in RAP does not appear in Pattern, so LUMP it */ else if ( (col_indx_RAP < col_indx_Pattern) || has_row_ended) { /* Lump entry (i, col_indx_RAP) in RAP */ /* Grab the indices for row col_indx_RAP of S_offd and diag. This will * be for computing lumping locations */ S_offd_indices_len = S_offd_i[col_indx_RAP + 1] - S_offd_i[col_indx_RAP]; if (S_offd_indices_allocated_len < S_offd_indices_len) { hypre_TFree(S_offd_indices, HYPRE_MEMORY_HOST); S_offd_indices = hypre_CTAlloc(HYPRE_BigInt, S_offd_indices_len, HYPRE_MEMORY_HOST); S_offd_indices_allocated_len = S_offd_indices_len; } /* Grab sub array from col_map, corresponding to the slice of S_offd_j */ hypre_GrabSubArray(S_offd_j, S_offd_i[col_indx_RAP], S_offd_i[col_indx_RAP + 1] - 1, col_map_offd_S, S_offd_indices); /* No need to grab info out of S_diag_j[...], here we just start from * S_diag_i[col_indx_RAP] and end at index S_diag_i[col_indx_RAP+1] - 1 */ /* Intersect the diag and offd pieces, remembering that the * diag array will need to have the offset +first_col_diag_RAP */ cnt = hypre_max(S_offd_indices_len, Pattern_offd_indices_len); if (offd_intersection_allocated_len < cnt) { hypre_TFree(offd_intersection, HYPRE_MEMORY_HOST); hypre_TFree(offd_intersection_data, HYPRE_MEMORY_HOST); offd_intersection = hypre_CTAlloc(HYPRE_BigInt, cnt, HYPRE_MEMORY_HOST); offd_intersection_data = hypre_CTAlloc(HYPRE_Real, cnt, HYPRE_MEMORY_HOST); offd_intersection_allocated_len = cnt; } /* This intersection also tracks S_offd_data and assumes that * S_offd_indices is the first argument here */ hypre_IntersectTwoBigArrays(S_offd_indices, &(S_offd_data[ S_offd_i[col_indx_RAP] ]), S_offd_indices_len, Pattern_offd_indices, Pattern_offd_indices_len, offd_intersection, offd_intersection_data, &offd_intersection_len); /* Now, intersect the indices for the diag block. Note that S_diag_j does * not have a diagonal entry, so no lumping occurs to the diagonal. */ cnt = hypre_max(Pattern_diag_indices_len, S_diag_i[col_indx_RAP + 1] - S_diag_i[col_indx_RAP] ); if (diag_intersection_allocated_len < cnt) { hypre_TFree(diag_intersection, HYPRE_MEMORY_HOST); hypre_TFree(diag_intersection_data, HYPRE_MEMORY_HOST); diag_intersection = hypre_CTAlloc(HYPRE_Int, cnt, HYPRE_MEMORY_HOST); diag_intersection_data = hypre_CTAlloc(HYPRE_Real, cnt, HYPRE_MEMORY_HOST); diag_intersection_allocated_len = cnt; } /* There is no diagonal entry in first position of S */ hypre_IntersectTwoArrays( &(S_diag_j[S_diag_i[col_indx_RAP]]), &(S_diag_data[ S_diag_i[col_indx_RAP] ]), S_diag_i[col_indx_RAP + 1] - S_diag_i[col_indx_RAP], Pattern_indices_ptr, Pattern_diag_indices_len, diag_intersection, diag_intersection_data, &diag_intersection_len); /* Loop over these intersections, and lump a constant fraction of * RAP_diag_data[j] to each entry */ intersection_len = diag_intersection_len + offd_intersection_len; if (intersection_len > 0) { /* Sum the strength-of-connection values from row * col_indx_RAP in S, corresponding to the indices we are * collapsing to in row i This will give us our collapsing * weights. */ sum_strong_neigh = 0.0; for (k = 0; k < diag_intersection_len; k++) { sum_strong_neigh += hypre_abs(diag_intersection_data[k]); } for (k = 0; k < offd_intersection_len; k++) { sum_strong_neigh += hypre_abs(offd_intersection_data[k]); } sum_strong_neigh = RAP_diag_data[j] / sum_strong_neigh; /* When lumping with the diag_intersection, must offset column index */ for (k = 0; k < diag_intersection_len; k++) { lump_value = lump_percent * hypre_abs(diag_intersection_data[k]) * sum_strong_neigh; diagonal_lump_value = (1.0 - lump_percent) * hypre_abs(diag_intersection_data[k]) * sum_strong_neigh; neg_lump_value = -1.0 * lump_value; cnt = diag_intersection[k] + first_col_diag_RAP; /*#ifdef HY PRE_USING_OPENMP #pragma omp critical (IJAdd) #endif {*/ /* For efficiency, we do a buffered IJAddToValues. * A[global_row, cnt] += RAP_diag_data[j] */ hypre_NonGalerkinIJBufferWrite( ijmatrix, &ijbuf_cnt, ijbuf_size, &ijbuf_rowcounter, &ijbuf_data, &ijbuf_cols, &ijbuf_rownums, &ijbuf_numcols, global_row, cnt, lump_value ); if (lump_percent < 1.0) { /* Preserve row sum by updating diagonal */ hypre_NonGalerkinIJBufferWrite( ijmatrix, &ijbuf_cnt, ijbuf_size, &ijbuf_rowcounter, &ijbuf_data, &ijbuf_cols, &ijbuf_rownums, &ijbuf_numcols, global_row, global_row, diagonal_lump_value ); } /* Update mirror entries, if symmetric collapsing */ if (sym_collapse) { /* Update mirror entry */ hypre_NonGalerkinIJBufferWrite( ijmatrix, &ijbuf_sym_cnt, ijbuf_size, &ijbuf_sym_rowcounter, &ijbuf_sym_data, &ijbuf_sym_cols, &ijbuf_sym_rownums, &ijbuf_sym_numcols, cnt, global_row, lump_value ); /* Update mirror entry diagonal */ hypre_NonGalerkinIJBufferWrite( ijmatrix, &ijbuf_sym_cnt, ijbuf_size, &ijbuf_sym_rowcounter, &ijbuf_sym_data, &ijbuf_sym_cols, &ijbuf_sym_rownums, &ijbuf_sym_numcols, cnt, cnt, neg_lump_value ); } /*}*/ } /* The offd_intersection has global column indices, i.e., the * col_map arrays contain global indices */ for (k = 0; k < offd_intersection_len; k++) { lump_value = lump_percent * hypre_abs(offd_intersection_data[k]) * sum_strong_neigh; diagonal_lump_value = (1.0 - lump_percent) * hypre_abs(offd_intersection_data[k]) * sum_strong_neigh; neg_lump_value = -1.0 * lump_value; hypre_NonGalerkinIJBufferWrite( ijmatrix, &ijbuf_cnt, ijbuf_size, &ijbuf_rowcounter, &ijbuf_data, &ijbuf_cols, &ijbuf_rownums, &ijbuf_numcols, global_row, offd_intersection[k], lump_value ); if (lump_percent < 1.0) { hypre_NonGalerkinIJBufferWrite( ijmatrix, &ijbuf_cnt, ijbuf_size, &ijbuf_rowcounter, &ijbuf_data, &ijbuf_cols, &ijbuf_rownums, &ijbuf_numcols, global_row, global_row, diagonal_lump_value ); } /* Update mirror entries, if symmetric collapsing */ if (sym_collapse) { hypre_NonGalerkinIJBufferWrite( ijmatrix, &ijbuf_sym_cnt, ijbuf_size, &ijbuf_sym_rowcounter, &ijbuf_sym_data, &ijbuf_sym_cols, &ijbuf_sym_rownums, &ijbuf_sym_numcols, offd_intersection[k], global_row, lump_value ); hypre_NonGalerkinIJBufferWrite( ijmatrix, &ijbuf_sym_cnt, ijbuf_size, &ijbuf_sym_rowcounter, &ijbuf_sym_data, &ijbuf_sym_cols, &ijbuf_sym_rownums, &ijbuf_sym_numcols, offd_intersection[k], offd_intersection[k], neg_lump_value ); } } } /* If intersection is empty, do not eliminate entry */ else { /* Don't forget to update mirror entry if collapsing symmetrically */ if (sym_collapse) { lump_value = 0.5 * RAP_diag_data[j]; } else { lump_value = RAP_diag_data[j]; } cnt = col_indx_RAP + first_col_diag_RAP; hypre_NonGalerkinIJBufferWrite( ijmatrix, &ijbuf_cnt, ijbuf_size, &ijbuf_rowcounter, &ijbuf_data, &ijbuf_cols, &ijbuf_rownums, &ijbuf_numcols, global_row, cnt, lump_value ); if (sym_collapse) { hypre_NonGalerkinIJBufferWrite( ijmatrix, &ijbuf_sym_cnt, ijbuf_size, &ijbuf_sym_rowcounter, &ijbuf_sym_data, &ijbuf_sym_cols, &ijbuf_sym_rownums, &ijbuf_sym_numcols, cnt, global_row, lump_value ); } } } /* The entry in RAP appears in Pattern, so keep it */ else if (col_indx_RAP == col_indx_Pattern) { cnt = col_indx_RAP + first_col_diag_RAP; hypre_NonGalerkinIJBufferWrite( ijmatrix, &ijbuf_cnt, ijbuf_size, &ijbuf_rowcounter, &ijbuf_data, &ijbuf_cols, &ijbuf_rownums, &ijbuf_numcols, global_row, cnt, RAP_diag_data[j] ); /* Only go to the next entry in Pattern, if this is not the end of a row */ if ( current_Pattern_j < Pattern_diag_i[i + 1] - 1 ) { current_Pattern_j += 1; col_indx_Pattern = Pattern_diag_j[current_Pattern_j]; } else { has_row_ended = 1;} } /* Increment col_indx_Pattern, and repeat this loop iter for current * col_ind_RAP value */ else if (col_indx_RAP > col_indx_Pattern) { for (; current_Pattern_j < Pattern_diag_i[i + 1]; current_Pattern_j++) { col_indx_Pattern = Pattern_diag_j[current_Pattern_j]; if (col_indx_RAP <= col_indx_Pattern) { break;} } /* If col_indx_RAP is still greater (i.e., we've reached a row end), then * we need to lump everything else in this row */ if (col_indx_RAP > col_indx_Pattern) { has_row_ended = 1; } /* Decrement j, in order to repeat this loop iteration for the current * col_indx_RAP value */ j--; } } } } /* * Eliminate Entries In RAP_offd * Structure of this for-loop is very similar to the RAP_diag for-loop * But, not so similar that these loops should be combined into a single fuction. * */ if (num_cols_RAP_offd) { for (i = 0; i < num_variables; i++) { global_row = i + first_col_diag_RAP; row_start = RAP_offd_i[i]; row_end = RAP_offd_i[i + 1]; has_row_ended = 0; /* Only do work if row has nonzeros */ if ( row_start < row_end) { current_Pattern_j = Pattern_offd_i[i]; Pattern_offd_indices_len = Pattern_offd_i[i + 1] - Pattern_offd_i[i]; if ( (Pattern_offd_j != NULL) && (Pattern_offd_indices_len > 0) ) { col_indx_Pattern = col_map_offd_Pattern[ Pattern_offd_j[current_Pattern_j] ]; } else { /* if Pattern_offd_j is not allocated or this is a zero length row, then all entries need to be lumped. This is an analagous situation to has_row_ended=1. */ col_indx_Pattern = -1; has_row_ended = 1; } /* Grab this row's indices out of Pattern offd and diag. This will * be for computing index set intersections for lumping. The above * loop over RAP_diag ensures adequate length of Pattern_offd_indices */ /* Ensure adequate length */ hypre_GrabSubArray(Pattern_offd_j, Pattern_offd_i[i], Pattern_offd_i[i + 1] - 1, col_map_offd_Pattern, Pattern_offd_indices); /* No need to grab info out of Pattern_diag_j[...], here we just start from * Pattern_diag_i[i] and end at index Pattern_diag_i[i+1] - 1. We do need to * ignore the diagonal entry in Pattern, because we don't lump entries there */ if ( Pattern_diag_j[Pattern_diag_i[i]] == i ) { Pattern_indices_ptr = &( Pattern_diag_j[Pattern_diag_i[i] + 1]); Pattern_diag_indices_len = Pattern_diag_i[i + 1] - Pattern_diag_i[i] - 1; } else { Pattern_indices_ptr = &( Pattern_diag_j[Pattern_diag_i[i]]); Pattern_diag_indices_len = Pattern_diag_i[i + 1] - Pattern_diag_i[i]; } } for (j = row_start; j < row_end; j++) { /* Ignore zero entries in RAP */ if ( RAP_offd_data[j] != 0.0) { /* In general for all the offd_j arrays, we have to indirectly * index with the col_map_offd array to get a global index */ col_indx_RAP = col_map_offd_RAP[ RAP_offd_j[j] ]; /* The entry in RAP does not appear in Pattern, so LUMP it */ if ( (col_indx_RAP < col_indx_Pattern) || has_row_ended) { /* The row_indx_Sext would be found with: row_indx_Sext = hypre_BinarySearch(col_map_offd_RAP, col_indx_RAP, num_cols_RAP_offd); But, we already know the answer to this with, */ row_indx_Sext = RAP_offd_j[j]; /* Grab the indices for row row_indx_Sext from the offd and diag parts. This will * be for computing lumping locations */ S_offd_indices_len = S_ext_offd_i[row_indx_Sext + 1] - S_ext_offd_i[row_indx_Sext]; if (S_offd_indices_allocated_len < S_offd_indices_len) { hypre_TFree(S_offd_indices, HYPRE_MEMORY_HOST); S_offd_indices = hypre_CTAlloc(HYPRE_BigInt, S_offd_indices_len, HYPRE_MEMORY_HOST); S_offd_indices_allocated_len = S_offd_indices_len; } /* Grab sub array from col_map, corresponding to the slice of S_ext_offd_j */ hypre_GrabSubArray(S_ext_offd_j, S_ext_offd_i[row_indx_Sext], S_ext_offd_i[row_indx_Sext + 1] - 1, col_map_offd_Sext, S_offd_indices); /* No need to grab info out of S_ext_diag_j[...], here we just start from * S_ext_diag_i[row_indx_Sext] and end at index S_ext_diag_i[row_indx_Sext+1] - 1 */ /* Intersect the diag and offd pieces, remembering that the * diag array will need to have the offset +first_col_diag_RAP */ cnt = hypre_max(S_offd_indices_len, Pattern_offd_indices_len); if (offd_intersection_allocated_len < cnt) { hypre_TFree(offd_intersection, HYPRE_MEMORY_HOST); hypre_TFree(offd_intersection_data, HYPRE_MEMORY_HOST); offd_intersection = hypre_CTAlloc(HYPRE_BigInt, cnt, HYPRE_MEMORY_HOST); offd_intersection_data = hypre_CTAlloc(HYPRE_Real, cnt, HYPRE_MEMORY_HOST); offd_intersection_allocated_len = cnt; } hypre_IntersectTwoBigArrays(S_offd_indices, &(S_ext_offd_data[ S_ext_offd_i[row_indx_Sext] ]), S_offd_indices_len, Pattern_offd_indices, Pattern_offd_indices_len, offd_intersection, offd_intersection_data, &offd_intersection_len); /* Now, intersect the indices for the diag block. */ cnt = hypre_max(Pattern_diag_indices_len, S_ext_diag_i[row_indx_Sext + 1] - S_ext_diag_i[row_indx_Sext] ); if (diag_intersection_allocated_len < cnt) { hypre_TFree(diag_intersection, HYPRE_MEMORY_HOST); hypre_TFree(diag_intersection_data, HYPRE_MEMORY_HOST); diag_intersection = hypre_CTAlloc(HYPRE_Int, cnt, HYPRE_MEMORY_HOST); diag_intersection_data = hypre_CTAlloc(HYPRE_Real, cnt, HYPRE_MEMORY_HOST); diag_intersection_allocated_len = cnt; } hypre_IntersectTwoArrays( &(S_ext_diag_j[S_ext_diag_i[row_indx_Sext]]), &(S_ext_diag_data[ S_ext_diag_i[row_indx_Sext] ]), S_ext_diag_i[row_indx_Sext + 1] - S_ext_diag_i[row_indx_Sext], Pattern_indices_ptr, Pattern_diag_indices_len, diag_intersection, diag_intersection_data, &diag_intersection_len); /* Loop over these intersections, and lump a constant fraction of * RAP_offd_data[j] to each entry */ intersection_len = diag_intersection_len + offd_intersection_len; if (intersection_len > 0) { /* Sum the strength-of-connection values from row * row_indx_Sext in S, corresponding to the indices we are * collapsing to in row i. This will give us our collapsing * weights. */ sum_strong_neigh = 0.0; for (k = 0; k < diag_intersection_len; k++) { sum_strong_neigh += hypre_abs(diag_intersection_data[k]); } for (k = 0; k < offd_intersection_len; k++) { sum_strong_neigh += hypre_abs(offd_intersection_data[k]); } sum_strong_neigh = RAP_offd_data[j] / sum_strong_neigh; /* When lumping with the diag_intersection, must offset column index */ for (k = 0; k < diag_intersection_len; k++) { lump_value = lump_percent * hypre_abs(diag_intersection_data[k]) * sum_strong_neigh; diagonal_lump_value = (1.0 - lump_percent) * hypre_abs(diag_intersection_data[k]) * sum_strong_neigh; neg_lump_value = -1.0 * lump_value; cnt = diag_intersection[k] + first_col_diag_RAP; hypre_NonGalerkinIJBufferWrite( ijmatrix, &ijbuf_cnt, ijbuf_size, &ijbuf_rowcounter, &ijbuf_data, &ijbuf_cols, &ijbuf_rownums, &ijbuf_numcols, global_row, cnt, lump_value ); if (lump_percent < 1.0) { hypre_NonGalerkinIJBufferWrite( ijmatrix, &ijbuf_cnt, ijbuf_size, &ijbuf_rowcounter, &ijbuf_data, &ijbuf_cols, &ijbuf_rownums, &ijbuf_numcols, global_row, global_row, diagonal_lump_value ); } /* Update mirror entries, if symmetric collapsing */ if (sym_collapse) { hypre_NonGalerkinIJBufferWrite( ijmatrix, &ijbuf_sym_cnt, ijbuf_size, &ijbuf_sym_rowcounter, &ijbuf_sym_data, &ijbuf_sym_cols, &ijbuf_sym_rownums, &ijbuf_sym_numcols, cnt, global_row, lump_value); hypre_NonGalerkinIJBufferWrite( ijmatrix, &ijbuf_sym_cnt, ijbuf_size, &ijbuf_sym_rowcounter, &ijbuf_sym_data, &ijbuf_sym_cols, &ijbuf_sym_rownums, &ijbuf_sym_numcols, cnt, cnt, neg_lump_value ); } } /* The offd_intersection has global column indices, i.e., the * col_map arrays contain global indices */ for (k = 0; k < offd_intersection_len; k++) { lump_value = lump_percent * hypre_abs(offd_intersection_data[k]) * sum_strong_neigh; diagonal_lump_value = (1.0 - lump_percent) * hypre_abs(offd_intersection_data[k]) * sum_strong_neigh; neg_lump_value = -1.0 * lump_value; hypre_NonGalerkinIJBufferWrite( ijmatrix, &ijbuf_cnt, ijbuf_size, &ijbuf_rowcounter, &ijbuf_data, &ijbuf_cols, &ijbuf_rownums, &ijbuf_numcols, global_row, offd_intersection[k], lump_value ); if (lump_percent < 1.0) { hypre_NonGalerkinIJBufferWrite( ijmatrix, &ijbuf_cnt, ijbuf_size, &ijbuf_rowcounter, &ijbuf_data, &ijbuf_cols, &ijbuf_rownums, &ijbuf_numcols, global_row, global_row, diagonal_lump_value ); } /* Update mirror entries, if symmetric collapsing */ if (sym_collapse) { hypre_NonGalerkinIJBufferWrite( ijmatrix, &ijbuf_sym_cnt, ijbuf_size, &ijbuf_sym_rowcounter, &ijbuf_sym_data, &ijbuf_sym_cols, &ijbuf_sym_rownums, &ijbuf_sym_numcols, offd_intersection[k], global_row, lump_value ); hypre_NonGalerkinIJBufferWrite( ijmatrix, &ijbuf_sym_cnt, ijbuf_size, &ijbuf_sym_rowcounter, &ijbuf_sym_data, &ijbuf_sym_cols, &ijbuf_sym_rownums, &ijbuf_sym_numcols, offd_intersection[k], offd_intersection[k], neg_lump_value ); } } } /* If intersection is empty, do not eliminate entry */ else { /* Don't forget to update mirror entry if collapsing symmetrically */ if (sym_collapse) { lump_value = 0.5 * RAP_offd_data[j]; } else { lump_value = RAP_offd_data[j]; } hypre_NonGalerkinIJBufferWrite( ijmatrix, &ijbuf_cnt, ijbuf_size, &ijbuf_rowcounter, &ijbuf_data, &ijbuf_cols, &ijbuf_rownums, &ijbuf_numcols, global_row, col_indx_RAP, lump_value ); if (sym_collapse) { hypre_NonGalerkinIJBufferWrite( ijmatrix, &ijbuf_sym_cnt, ijbuf_size, &ijbuf_sym_rowcounter, &ijbuf_sym_data, &ijbuf_sym_cols, &ijbuf_sym_rownums, &ijbuf_sym_numcols, col_indx_RAP, global_row, lump_value ); } } } /* The entry in RAP appears in Pattern, so keep it */ else if (col_indx_RAP == col_indx_Pattern) { /* For the offd structure, col_indx_RAP is a global dof number */ hypre_NonGalerkinIJBufferWrite( ijmatrix, &ijbuf_cnt, ijbuf_size, &ijbuf_rowcounter, &ijbuf_data, &ijbuf_cols, &ijbuf_rownums, &ijbuf_numcols, global_row, col_indx_RAP, RAP_offd_data[j]); /* Only go to the next entry in Pattern, if this is not the end of a row */ if ( current_Pattern_j < Pattern_offd_i[i + 1] - 1 ) { current_Pattern_j += 1; col_indx_Pattern = col_map_offd_Pattern[ Pattern_offd_j[current_Pattern_j] ]; } else { has_row_ended = 1;} } /* Increment col_indx_Pattern, and repeat this loop iter for current * col_ind_RAP value */ else if (col_indx_RAP > col_indx_Pattern) { for (; current_Pattern_j < Pattern_offd_i[i + 1]; current_Pattern_j++) { col_indx_Pattern = col_map_offd_Pattern[ Pattern_offd_j[current_Pattern_j] ]; if (col_indx_RAP <= col_indx_Pattern) { break;} } /* If col_indx_RAP is still greater (i.e., we've reached a row end), then * we need to lump everything else in this row */ if (col_indx_RAP > col_indx_Pattern) { has_row_ended = 1; } /* Decrement j, in order to repeat this loop iteration for the current * col_indx_RAP value */ j--; } } } } } /* For efficiency, we do a buffered IJAddToValues. * This empties the buffer of any remaining values */ hypre_NonGalerkinIJBufferEmpty(ijmatrix, ijbuf_size, &ijbuf_cnt, ijbuf_rowcounter, &ijbuf_data, &ijbuf_cols, &ijbuf_rownums, &ijbuf_numcols); if (sym_collapse) { hypre_NonGalerkinIJBufferEmpty(ijmatrix, ijbuf_size, &ijbuf_sym_cnt, ijbuf_sym_rowcounter, &ijbuf_sym_data, &ijbuf_sym_cols, &ijbuf_sym_rownums, &ijbuf_sym_numcols); } /* Assemble non-Galerkin Matrix, and overwrite current RAP*/ HYPRE_IJMatrixAssemble(ijmatrix); HYPRE_IJMatrixGetObject(ijmatrix, (void**) RAP_ptr); /* Optional diagnostic matrix printing */ #if 0 char filename[256]; hypre_sprintf(filename, "Pattern_%d.ij", global_num_vars); hypre_ParCSRMatrixPrintIJ(Pattern, 0, 0, filename); hypre_sprintf(filename, "Strength_%d.ij", global_num_vars); hypre_ParCSRMatrixPrintIJ(S, 0, 0, filename); hypre_sprintf(filename, "RAP_%d.ij", global_num_vars); hypre_ParCSRMatrixPrintIJ(RAP, 0, 0, filename); hypre_sprintf(filename, "RAPc_%d.ij", global_num_vars); hypre_ParCSRMatrixPrintIJ(*RAP_ptr, 0, 0, filename); hypre_sprintf(filename, "AP_%d.ij", global_num_vars); hypre_ParCSRMatrixPrintIJ(AP, 0, 0, filename); #endif /* Free matrices and variables and arrays */ hypre_TFree(ijbuf_data, memory_location_RAP); hypre_TFree(ijbuf_cols, memory_location_RAP); hypre_TFree(ijbuf_rownums, memory_location_RAP); hypre_TFree(ijbuf_numcols, memory_location_RAP); if (sym_collapse) { hypre_TFree(ijbuf_sym_data, memory_location_RAP); hypre_TFree(ijbuf_sym_cols, memory_location_RAP); hypre_TFree(ijbuf_sym_rownums, memory_location_RAP); hypre_TFree(ijbuf_sym_numcols, memory_location_RAP); } hypre_TFree(Pattern_offd_indices, HYPRE_MEMORY_HOST); hypre_TFree(S_ext_diag_i, HYPRE_MEMORY_HOST); hypre_TFree(S_ext_offd_i, HYPRE_MEMORY_HOST); hypre_TFree(S_offd_indices, HYPRE_MEMORY_HOST); hypre_TFree(offd_intersection, HYPRE_MEMORY_HOST); hypre_TFree(offd_intersection_data, HYPRE_MEMORY_HOST); hypre_TFree(diag_intersection, HYPRE_MEMORY_HOST); hypre_TFree(diag_intersection_data, HYPRE_MEMORY_HOST); hypre_TFree(S_ext_diag_j, HYPRE_MEMORY_HOST); hypre_TFree(S_ext_diag_data, HYPRE_MEMORY_HOST); hypre_TFree(S_ext_offd_j, HYPRE_MEMORY_HOST); hypre_TFree(S_ext_offd_data, HYPRE_MEMORY_HOST); hypre_TFree(col_map_offd_Sext, HYPRE_MEMORY_HOST); hypre_ParCSRMatrixDestroy(Pattern); hypre_ParCSRMatrixDestroy(RAP); hypre_ParCSRMatrixDestroy(S); HYPRE_IJMatrixSetObjectType(ijmatrix, -1); HYPRE_IJMatrixDestroy(ijmatrix); HYPRE_ANNOTATE_FUNC_END; return hypre_error_flag; } hypre-2.33.0/src/parcsr_ls/par_rap.c000066400000000000000000002417031477326011500173120ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "_hypre_parcsr_ls.h" #include "_hypre_utilities.h" /*-------------------------------------------------------------------------- * hypre_BoomerAMGBuildCoarseOperator *--------------------------------------------------------------------------*/ HYPRE_Int hypre_BoomerAMGBuildCoarseOperator( hypre_ParCSRMatrix *RT, hypre_ParCSRMatrix *A, hypre_ParCSRMatrix *P, hypre_ParCSRMatrix **RAP_ptr ) { hypre_BoomerAMGBuildCoarseOperatorKT( RT, A, P, 0, RAP_ptr); return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_BoomerAMGBuildCoarseOperatorKT *--------------------------------------------------------------------------*/ HYPRE_Int hypre_BoomerAMGBuildCoarseOperatorKT( hypre_ParCSRMatrix *RT, hypre_ParCSRMatrix *A, hypre_ParCSRMatrix *P, HYPRE_Int keepTranspose, hypre_ParCSRMatrix **RAP_ptr ) { #ifdef HYPRE_PROFILE hypre_profile_times[HYPRE_TIMER_ID_RAP] -= hypre_MPI_Wtime(); #endif MPI_Comm comm = hypre_ParCSRMatrixComm(A); HYPRE_MemoryLocation memory_location_RAP = hypre_ParCSRMatrixMemoryLocation(A); hypre_CSRMatrix *RT_diag = hypre_ParCSRMatrixDiag(RT); hypre_CSRMatrix *RT_offd = hypre_ParCSRMatrixOffd(RT); HYPRE_Int num_cols_diag_RT = hypre_CSRMatrixNumCols(RT_diag); HYPRE_Int num_cols_offd_RT = hypre_CSRMatrixNumCols(RT_offd); HYPRE_Int num_rows_offd_RT = hypre_CSRMatrixNumRows(RT_offd); hypre_ParCSRCommPkg *comm_pkg_RT = hypre_ParCSRMatrixCommPkg(RT); HYPRE_Int num_recvs_RT = 0; HYPRE_Int num_sends_RT = 0; HYPRE_Int *send_map_starts_RT = NULL; HYPRE_Int *send_map_elmts_RT = NULL; hypre_CSRMatrix *A_diag = hypre_ParCSRMatrixDiag(A); HYPRE_Complex *A_diag_data = hypre_CSRMatrixData(A_diag); HYPRE_Int *A_diag_i = hypre_CSRMatrixI(A_diag); HYPRE_Int *A_diag_j = hypre_CSRMatrixJ(A_diag); hypre_CSRMatrix *A_offd = hypre_ParCSRMatrixOffd(A); HYPRE_Complex *A_offd_data = hypre_CSRMatrixData(A_offd); HYPRE_Int *A_offd_i = hypre_CSRMatrixI(A_offd); HYPRE_Int *A_offd_j = hypre_CSRMatrixJ(A_offd); HYPRE_Int num_cols_diag_A = hypre_CSRMatrixNumCols(A_diag); HYPRE_Int num_cols_offd_A = hypre_CSRMatrixNumCols(A_offd); hypre_CSRMatrix *P_diag = hypre_ParCSRMatrixDiag(P); HYPRE_Complex *P_diag_data = hypre_CSRMatrixData(P_diag); HYPRE_Int *P_diag_i = hypre_CSRMatrixI(P_diag); HYPRE_Int *P_diag_j = hypre_CSRMatrixJ(P_diag); hypre_CSRMatrix *P_offd = hypre_ParCSRMatrixOffd(P); HYPRE_BigInt *col_map_offd_P = hypre_ParCSRMatrixColMapOffd(P); HYPRE_Complex *P_offd_data = hypre_CSRMatrixData(P_offd); HYPRE_Int *P_offd_i = hypre_CSRMatrixI(P_offd); HYPRE_Int *P_offd_j = hypre_CSRMatrixJ(P_offd); HYPRE_BigInt first_col_diag_P = hypre_ParCSRMatrixFirstColDiag(P); HYPRE_BigInt last_col_diag_P; HYPRE_Int num_cols_diag_P = hypre_CSRMatrixNumCols(P_diag); HYPRE_Int num_cols_offd_P = hypre_CSRMatrixNumCols(P_offd); HYPRE_BigInt *coarse_partitioning = hypre_ParCSRMatrixColStarts(P); HYPRE_BigInt *RT_partitioning = hypre_ParCSRMatrixColStarts(RT); hypre_ParCSRMatrix *RAP; HYPRE_BigInt *col_map_offd_RAP = NULL; HYPRE_BigInt *new_col_map_offd_RAP = NULL; hypre_CSRMatrix *RAP_int = NULL; HYPRE_Complex *RAP_int_data; HYPRE_Int *RAP_int_i; HYPRE_BigInt *RAP_int_j; hypre_CSRMatrix *RAP_ext = NULL; HYPRE_Complex *RAP_ext_data = NULL; HYPRE_Int *RAP_ext_i = NULL; HYPRE_BigInt *RAP_ext_j = NULL; hypre_CSRMatrix *RAP_diag; HYPRE_Complex *RAP_diag_data = NULL; HYPRE_Int *RAP_diag_i; HYPRE_Int *RAP_diag_j = NULL; hypre_CSRMatrix *RAP_offd; HYPRE_Complex *RAP_offd_data = NULL; HYPRE_Int *RAP_offd_i = NULL; HYPRE_Int *RAP_offd_j = NULL; HYPRE_Int RAP_size; HYPRE_Int RAP_ext_size; HYPRE_Int RAP_diag_size; HYPRE_Int RAP_offd_size; HYPRE_Int P_ext_diag_size; HYPRE_Int P_ext_offd_size; HYPRE_BigInt first_col_diag_RAP; HYPRE_BigInt last_col_diag_RAP; HYPRE_Int num_cols_offd_RAP = 0; hypre_CSRMatrix *R_diag; HYPRE_Complex *R_diag_data; HYPRE_Int *R_diag_i; HYPRE_Int *R_diag_j; hypre_CSRMatrix *R_offd = NULL; HYPRE_Complex *R_offd_data = NULL; HYPRE_Int *R_offd_i = NULL; HYPRE_Int *R_offd_j = NULL; HYPRE_Real *RA_diag_data_array = NULL; HYPRE_Int *RA_diag_j_array = NULL; HYPRE_Real *RA_offd_data_array = NULL; HYPRE_Int *RA_offd_j_array = NULL; hypre_CSRMatrix *Ps_ext = NULL; HYPRE_Complex *Ps_ext_data = NULL; HYPRE_Int *Ps_ext_i = NULL; HYPRE_BigInt *Ps_ext_j = NULL; HYPRE_Complex *P_ext_diag_data = NULL; HYPRE_Int *P_ext_diag_i = NULL; HYPRE_Int *P_ext_diag_j = NULL; HYPRE_Complex *P_ext_offd_data = NULL; HYPRE_Int *P_ext_offd_i = NULL; HYPRE_Int *P_ext_offd_j = NULL; HYPRE_BigInt *P_big_offd_j = NULL; HYPRE_BigInt *col_map_offd_Pext = NULL; HYPRE_Int *map_P_to_Pext = NULL; HYPRE_Int *map_P_to_RAP = NULL; HYPRE_Int *map_Pext_to_RAP = NULL; HYPRE_Int *P_marker = NULL; HYPRE_Int **P_mark_array; HYPRE_Int **A_mark_array; HYPRE_Int *A_marker; HYPRE_BigInt *temp; HYPRE_BigInt n_coarse, n_coarse_RT; HYPRE_Int square = 1; HYPRE_Int num_cols_offd_Pext = 0; HYPRE_Int ic, i, j, k; HYPRE_Int i1, i2, i3, ii, ns, ne, size, rest; HYPRE_Int cnt = 0; /*value; */ HYPRE_Int jj1, jj2, jj3, jcol; HYPRE_Int *jj_count, *jj_cnt_diag, *jj_cnt_offd; HYPRE_Int jj_counter, jj_count_diag, jj_count_offd; HYPRE_Int jj_row_begining, jj_row_begin_diag, jj_row_begin_offd; HYPRE_Int start_indexing = 0; /* start indexing for RAP_data at 0 */ HYPRE_Int num_nz_cols_A; HYPRE_Int num_procs; HYPRE_Int num_threads; HYPRE_Real r_entry; HYPRE_Real r_a_product; HYPRE_Real r_a_p_product; HYPRE_Real zero = 0.0; HYPRE_Int *prefix_sum_workspace; /*----------------------------------------------------------------------- * Copy ParCSRMatrix RT into CSRMatrix R so that we have row-wise access * to restriction . *-----------------------------------------------------------------------*/ hypre_MPI_Comm_size(comm, &num_procs); num_threads = hypre_NumThreads(); if (comm_pkg_RT) { num_recvs_RT = hypre_ParCSRCommPkgNumRecvs(comm_pkg_RT); num_sends_RT = hypre_ParCSRCommPkgNumSends(comm_pkg_RT); send_map_starts_RT = hypre_ParCSRCommPkgSendMapStarts(comm_pkg_RT); send_map_elmts_RT = hypre_ParCSRCommPkgSendMapElmts(comm_pkg_RT); } else if (num_procs > 1) { hypre_MatvecCommPkgCreate(RT); comm_pkg_RT = hypre_ParCSRMatrixCommPkg(RT); num_recvs_RT = hypre_ParCSRCommPkgNumRecvs(comm_pkg_RT); num_sends_RT = hypre_ParCSRCommPkgNumSends(comm_pkg_RT); send_map_starts_RT = hypre_ParCSRCommPkgSendMapStarts(comm_pkg_RT); send_map_elmts_RT = hypre_ParCSRCommPkgSendMapElmts(comm_pkg_RT); } hypre_CSRMatrixTranspose(RT_diag, &R_diag, 1); if (num_cols_offd_RT) { hypre_CSRMatrixTranspose(RT_offd, &R_offd, 1); R_offd_data = hypre_CSRMatrixData(R_offd); R_offd_i = hypre_CSRMatrixI(R_offd); R_offd_j = hypre_CSRMatrixJ(R_offd); } /*----------------------------------------------------------------------- * Access the CSR vectors for R. Also get sizes of fine and * coarse grids. *-----------------------------------------------------------------------*/ R_diag_data = hypre_CSRMatrixData(R_diag); R_diag_i = hypre_CSRMatrixI(R_diag); R_diag_j = hypre_CSRMatrixJ(R_diag); n_coarse = hypre_ParCSRMatrixGlobalNumCols(P); num_nz_cols_A = num_cols_diag_A + num_cols_offd_A; n_coarse_RT = hypre_ParCSRMatrixGlobalNumCols(RT); if (n_coarse != n_coarse_RT || num_cols_diag_RT != num_cols_diag_P) { square = 0; } /*----------------------------------------------------------------------- * Generate Ps_ext, i.e. portion of P that is stored on neighbor procs * and needed locally for triple matrix product *-----------------------------------------------------------------------*/ #ifdef HYPRE_CONCURRENT_HOPSCOTCH hypre_UnorderedIntMap send_map_elmts_RT_inverse_map; HYPRE_Int *send_map_elmts_starts_RT_aggregated = NULL; HYPRE_Int *send_map_elmts_RT_aggregated = NULL; HYPRE_Int send_map_elmts_RT_inverse_map_initialized = num_sends_RT > 0 && send_map_starts_RT[num_sends_RT] - send_map_starts_RT[0] > 0; if (send_map_elmts_RT_inverse_map_initialized) { hypre_UnorderedIntSet send_map_elmts_set; hypre_UnorderedIntSetCreate(&send_map_elmts_set, 2 * (send_map_starts_RT[num_sends_RT] - send_map_starts_RT[0]), 16 * hypre_NumThreads()); #pragma omp parallel for HYPRE_SMP_SCHEDULE for (i = send_map_starts_RT[0]; i < send_map_starts_RT[num_sends_RT]; i++) { HYPRE_Int key = send_map_elmts_RT[i]; hypre_UnorderedIntSetPut(&send_map_elmts_set, key); } HYPRE_Int send_map_elmts_unique_size; HYPRE_Int *send_map_elmts_unique = hypre_UnorderedIntSetCopyToArray(&send_map_elmts_set, &send_map_elmts_unique_size); hypre_UnorderedIntSetDestroy(&send_map_elmts_set); hypre_UnorderedIntMapCreate(&send_map_elmts_RT_inverse_map, 2 * send_map_elmts_unique_size, 16 * hypre_NumThreads()); #pragma omp parallel for HYPRE_SMP_SCHEDULE for (i = 0; i < send_map_elmts_unique_size; i++) { hypre_UnorderedIntMapPutIfAbsent(&send_map_elmts_RT_inverse_map, send_map_elmts_unique[i], i); } hypre_TFree(send_map_elmts_unique, HYPRE_MEMORY_HOST); send_map_elmts_starts_RT_aggregated = hypre_TAlloc(HYPRE_Int, send_map_elmts_unique_size + 1, HYPRE_MEMORY_HOST); send_map_elmts_RT_aggregated = hypre_TAlloc(HYPRE_Int, send_map_starts_RT[num_sends_RT], HYPRE_MEMORY_HOST); #pragma omp parallel for HYPRE_SMP_SCHEDULE for (i = 0; i < send_map_elmts_unique_size; i++) { send_map_elmts_starts_RT_aggregated[i] = 0; } #pragma omp parallel for HYPRE_SMP_SCHEDULE for (i = send_map_starts_RT[0]; i < send_map_starts_RT[num_sends_RT]; i++) { HYPRE_Int idx = hypre_UnorderedIntMapGet(&send_map_elmts_RT_inverse_map, send_map_elmts_RT[i]); #pragma omp atomic send_map_elmts_starts_RT_aggregated[idx]++; } for (i = 0; i < send_map_elmts_unique_size - 1; i++) { send_map_elmts_starts_RT_aggregated[i + 1] += send_map_elmts_starts_RT_aggregated[i]; } send_map_elmts_starts_RT_aggregated[send_map_elmts_unique_size] = send_map_starts_RT[num_sends_RT]; #pragma omp parallel for HYPRE_SMP_SCHEDULE for (i = send_map_starts_RT[num_sends_RT] - 1; i >= send_map_starts_RT[0]; i--) { HYPRE_Int idx = hypre_UnorderedIntMapGet(&send_map_elmts_RT_inverse_map, send_map_elmts_RT[i]); HYPRE_Int offset = hypre_fetch_and_add(send_map_elmts_starts_RT_aggregated + idx, -1) - 1; send_map_elmts_RT_aggregated[offset] = i; } } #endif /* HYPRE_CONCURRENT_HOPSCOTCH */ #ifdef HYPRE_PROFILE hypre_profile_times[HYPRE_TIMER_ID_RENUMBER_COLIDX] -= hypre_MPI_Wtime(); hypre_profile_times[HYPRE_TIMER_ID_RENUMBER_COLIDX_RAP] -= hypre_MPI_Wtime(); #endif if (num_procs > 1) { Ps_ext = hypre_ParCSRMatrixExtractBExt(P, A, 1); Ps_ext_data = hypre_CSRMatrixData(Ps_ext); Ps_ext_i = hypre_CSRMatrixI(Ps_ext); Ps_ext_j = hypre_CSRMatrixBigJ(Ps_ext); } P_ext_diag_i = hypre_TAlloc(HYPRE_Int, num_cols_offd_A + 1, HYPRE_MEMORY_HOST); P_ext_offd_i = hypre_TAlloc(HYPRE_Int, num_cols_offd_A + 1, HYPRE_MEMORY_HOST); P_ext_diag_i[0] = 0; P_ext_offd_i[0] = 0; P_ext_diag_size = 0; P_ext_offd_size = 0; last_col_diag_P = first_col_diag_P + (HYPRE_BigInt) num_cols_diag_P - 1; /*HYPRE_Int prefix_sum_workspace[2*(num_threads + 1)];*/ prefix_sum_workspace = hypre_TAlloc(HYPRE_Int, 2 * (num_threads + 1), HYPRE_MEMORY_HOST); #ifdef HYPRE_USING_OPENMP #pragma omp parallel private(i,j) #endif /* This threading causes problem, maybe the prefix_sum in combination with BigInt? */ { HYPRE_Int i_begin, i_end; hypre_GetSimpleThreadPartition(&i_begin, &i_end, num_cols_offd_A); HYPRE_Int P_ext_diag_size_private = 0; HYPRE_Int P_ext_offd_size_private = 0; for (i = i_begin; i < i_end; i++) { for (j = Ps_ext_i[i]; j < Ps_ext_i[i + 1]; j++) if (Ps_ext_j[j] < first_col_diag_P || Ps_ext_j[j] > last_col_diag_P) { P_ext_offd_size_private++; } else { P_ext_diag_size_private++; } } hypre_prefix_sum_pair(&P_ext_diag_size_private, &P_ext_diag_size, &P_ext_offd_size_private, &P_ext_offd_size, prefix_sum_workspace); #ifdef HYPRE_USING_OPENMP #pragma omp master #endif { if (P_ext_diag_size) { P_ext_diag_j = hypre_CTAlloc(HYPRE_Int, P_ext_diag_size, HYPRE_MEMORY_HOST); P_ext_diag_data = hypre_CTAlloc(HYPRE_Real, P_ext_diag_size, HYPRE_MEMORY_HOST); } if (P_ext_offd_size) { P_ext_offd_j = hypre_CTAlloc(HYPRE_Int, P_ext_offd_size, HYPRE_MEMORY_HOST); P_big_offd_j = hypre_CTAlloc(HYPRE_BigInt, P_ext_offd_size, HYPRE_MEMORY_HOST); P_ext_offd_data = hypre_CTAlloc(HYPRE_Real, P_ext_offd_size, HYPRE_MEMORY_HOST); //temp = hypre_CTAlloc(HYPRE_BigInt, P_ext_offd_size+num_cols_offd_P, HYPRE_MEMORY_HOST); } } #ifdef HYPRE_USING_OPENMP #pragma omp barrier #endif for (i = i_begin; i < i_end; i++) { for (j = Ps_ext_i[i]; j < Ps_ext_i[i + 1]; j++) { HYPRE_BigInt value = Ps_ext_j[j]; if (value < first_col_diag_P || value > last_col_diag_P) { //Ps_ext_j[P_ext_offd_size_private] = value; //temp[P_ext_offd_size_private] = value; P_big_offd_j[P_ext_offd_size_private] = value; P_ext_offd_data[P_ext_offd_size_private++] = Ps_ext_data[j]; } else { P_ext_diag_j[P_ext_diag_size_private] = (HYPRE_Int)(Ps_ext_j[j] - first_col_diag_P); P_ext_diag_data[P_ext_diag_size_private++] = Ps_ext_data[j]; } } P_ext_diag_i[i + 1] = P_ext_diag_size_private; P_ext_offd_i[i + 1] = P_ext_offd_size_private; } } /* omp parallel */ hypre_TFree(prefix_sum_workspace, HYPRE_MEMORY_HOST); if (num_procs > 1) { hypre_CSRMatrixDestroy(Ps_ext); Ps_ext = NULL; } #ifdef HYPRE_CONCURRENT_HOPSCOTCH if (P_ext_offd_size || num_cols_offd_P) { hypre_UnorderedBigIntSet found_set; hypre_UnorderedBigIntSetCreate(&found_set, P_ext_offd_size + num_cols_offd_P, 16 * hypre_NumThreads()); #pragma omp parallel private(i) { #pragma omp for HYPRE_SMP_SCHEDULE for (i = 0; i < P_ext_offd_size; i++) { //hypre_UnorderedBigIntSetPut(&found_set, Ps_ext_j[i]); hypre_UnorderedBigIntSetPut(&found_set, P_big_offd_j[i]); } #pragma omp for HYPRE_SMP_SCHEDULE for (i = 0; i < num_cols_offd_P; i++) { hypre_UnorderedBigIntSetPut(&found_set, col_map_offd_P[i]); } } /* omp parallel */ /* Warning on getting temp right !!!!! */ temp = hypre_UnorderedBigIntSetCopyToArray(&found_set, &num_cols_offd_Pext); hypre_UnorderedBigIntSetDestroy(&found_set); hypre_UnorderedBigIntMap col_map_offd_Pext_inverse; hypre_big_sort_and_create_inverse_map(temp, num_cols_offd_Pext, &col_map_offd_Pext, &col_map_offd_Pext_inverse); #pragma omp parallel for HYPRE_SMP_SCHEDULE for (i = 0 ; i < P_ext_offd_size; i++) //Ps_ext_j[i] = hypre_UnorderedBigIntMapGet(&col_map_offd_Pext_inverse, Ps_ext_j[i]); { P_ext_offd_j[i] = hypre_UnorderedBigIntMapGet(&col_map_offd_Pext_inverse, P_big_offd_j[i]); } if (num_cols_offd_Pext) { hypre_UnorderedBigIntMapDestroy(&col_map_offd_Pext_inverse); } } #else /* !HYPRE_CONCURRENT_HOPSCOTCH */ if (P_ext_offd_size || num_cols_offd_P) { temp = hypre_CTAlloc(HYPRE_BigInt, P_ext_offd_size + num_cols_offd_P, HYPRE_MEMORY_HOST); for (i = 0; i < P_ext_offd_size; i++) //Ps_ext_j[i] = temp[i]; //temp[i] = Ps_ext_j[i]; { temp[i] = P_big_offd_j[i]; } cnt = P_ext_offd_size; for (i = 0; i < num_cols_offd_P; i++) { temp[cnt++] = col_map_offd_P[i]; } } if (cnt) { hypre_BigQsort0(temp, 0, cnt - 1); num_cols_offd_Pext = 1; HYPRE_BigInt value = temp[0]; for (i = 1; i < cnt; i++) { if (temp[i] > value) { value = temp[i]; temp[num_cols_offd_Pext++] = value; } } } if (num_cols_offd_Pext) { col_map_offd_Pext = hypre_CTAlloc(HYPRE_BigInt, num_cols_offd_Pext, HYPRE_MEMORY_HOST); } for (i = 0; i < num_cols_offd_Pext; i++) { col_map_offd_Pext[i] = temp[i]; } if (P_ext_offd_size || num_cols_offd_P) { hypre_TFree(temp, HYPRE_MEMORY_HOST); } /*if (P_ext_offd_size) P_ext_offd_j = hypre_CTAlloc(HYPRE_Int, P_ext_offd_size, HYPRE_MEMORY_HOST);*/ for (i = 0 ; i < P_ext_offd_size; i++) P_ext_offd_j[i] = hypre_BigBinarySearch(col_map_offd_Pext, //Ps_ext_j[i], P_big_offd_j[i], num_cols_offd_Pext); #endif /* !HYPRE_CONCURRENT_HOPSCOTCH */ if (P_ext_offd_size) { hypre_TFree(P_big_offd_j, HYPRE_MEMORY_HOST); } /*if (num_procs > 1) { hypre_CSRMatrixDestroy(Ps_ext); Ps_ext = NULL; }*/ if (num_cols_offd_P) { map_P_to_Pext = hypre_CTAlloc(HYPRE_Int, num_cols_offd_P, HYPRE_MEMORY_HOST); cnt = 0; for (i = 0; i < num_cols_offd_Pext; i++) if (col_map_offd_Pext[i] == col_map_offd_P[cnt]) { map_P_to_Pext[cnt++] = i; if (cnt == num_cols_offd_P) { break; } } } #ifdef HYPRE_PROFILE hypre_profile_times[HYPRE_TIMER_ID_RENUMBER_COLIDX] += hypre_MPI_Wtime(); hypre_profile_times[HYPRE_TIMER_ID_RENUMBER_COLIDX_RAP] += hypre_MPI_Wtime(); #endif /*----------------------------------------------------------------------- * First Pass: Determine size of RAP_int and set up RAP_int_i if there * are more than one processor and nonzero elements in R_offd *-----------------------------------------------------------------------*/ P_mark_array = hypre_CTAlloc(HYPRE_Int *, num_threads, HYPRE_MEMORY_HOST); A_mark_array = hypre_CTAlloc(HYPRE_Int *, num_threads, HYPRE_MEMORY_HOST); if (num_cols_offd_RT) { jj_count = hypre_CTAlloc(HYPRE_Int, num_threads, HYPRE_MEMORY_HOST); #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i,ii,ic,i1,i2,i3,jj1,jj2,jj3,ns,ne,size,rest,jj_counter,jj_row_begining,A_marker,P_marker) HYPRE_SMP_SCHEDULE #endif for (ii = 0; ii < num_threads; ii++) { size = num_cols_offd_RT / num_threads; rest = num_cols_offd_RT - size * num_threads; if (ii < rest) { ns = ii * size + ii; ne = (ii + 1) * size + ii + 1; } else { ns = ii * size + rest; ne = (ii + 1) * size + rest; } /*----------------------------------------------------------------------- * Allocate marker arrays. *-----------------------------------------------------------------------*/ if (num_cols_offd_Pext || num_cols_diag_P) { P_mark_array[ii] = hypre_CTAlloc(HYPRE_Int, num_cols_diag_P + num_cols_offd_Pext, HYPRE_MEMORY_HOST); P_marker = P_mark_array[ii]; } else { P_marker = NULL; } A_mark_array[ii] = hypre_CTAlloc(HYPRE_Int, num_nz_cols_A, HYPRE_MEMORY_HOST); A_marker = A_mark_array[ii]; /*----------------------------------------------------------------------- * Initialize some stuff. *-----------------------------------------------------------------------*/ jj_counter = start_indexing; for (ic = 0; ic < num_cols_diag_P + num_cols_offd_Pext; ic++) { P_marker[ic] = -1; } for (i = 0; i < num_nz_cols_A; i++) { A_marker[i] = -1; } /*----------------------------------------------------------------------- * Loop over exterior c-points *-----------------------------------------------------------------------*/ for (ic = ns; ic < ne; ic++) { jj_row_begining = jj_counter; /*-------------------------------------------------------------------- * Loop over entries in row ic of R_offd. *--------------------------------------------------------------------*/ for (jj1 = R_offd_i[ic]; jj1 < R_offd_i[ic + 1]; jj1++) { i1 = R_offd_j[jj1]; /*----------------------------------------------------------------- * Loop over entries in row i1 of A_offd. *-----------------------------------------------------------------*/ for (jj2 = A_offd_i[i1]; jj2 < A_offd_i[i1 + 1]; jj2++) { i2 = A_offd_j[jj2]; /*-------------------------------------------------------------- * Check A_marker to see if point i2 has been previously * visited. New entries in RAP only occur from unmarked points. *--------------------------------------------------------------*/ if (A_marker[i2] != ic) { /*----------------------------------------------------------- * Mark i2 as visited. *-----------------------------------------------------------*/ A_marker[i2] = ic; /*----------------------------------------------------------- * Loop over entries in row i2 of P_ext. *-----------------------------------------------------------*/ for (jj3 = P_ext_diag_i[i2]; jj3 < P_ext_diag_i[i2 + 1]; jj3++) { i3 = P_ext_diag_j[jj3]; /*-------------------------------------------------------- * Check P_marker to see that RAP_{ic,i3} has not already * been accounted for. If it has not, mark it and increment * counter. *--------------------------------------------------------*/ if (P_marker[i3] < jj_row_begining) { P_marker[i3] = jj_counter; jj_counter++; } } for (jj3 = P_ext_offd_i[i2]; jj3 < P_ext_offd_i[i2 + 1]; jj3++) { i3 = P_ext_offd_j[jj3] + num_cols_diag_P; /*-------------------------------------------------------- * Check P_marker to see that RAP_{ic,i3} has not already * been accounted for. If it has not, mark it and increment * counter. *--------------------------------------------------------*/ if (P_marker[i3] < jj_row_begining) { P_marker[i3] = jj_counter; jj_counter++; } } } } /*----------------------------------------------------------------- * Loop over entries in row i1 of A_diag. *-----------------------------------------------------------------*/ for (jj2 = A_diag_i[i1]; jj2 < A_diag_i[i1 + 1]; jj2++) { i2 = A_diag_j[jj2]; /*-------------------------------------------------------------- * Check A_marker to see if point i2 has been previously * visited. New entries in RAP only occur from unmarked points. *--------------------------------------------------------------*/ if (A_marker[i2 + num_cols_offd_A] != ic) { /*----------------------------------------------------------- * Mark i2 as visited. *-----------------------------------------------------------*/ A_marker[i2 + num_cols_offd_A] = ic; /*----------------------------------------------------------- * Loop over entries in row i2 of P_diag. *-----------------------------------------------------------*/ for (jj3 = P_diag_i[i2]; jj3 < P_diag_i[i2 + 1]; jj3++) { i3 = P_diag_j[jj3]; /*-------------------------------------------------------- * Check P_marker to see that RAP_{ic,i3} has not already * been accounted for. If it has not, mark it and increment * counter. *--------------------------------------------------------*/ if (P_marker[i3] < jj_row_begining) { P_marker[i3] = jj_counter; jj_counter++; } } /*----------------------------------------------------------- * Loop over entries in row i2 of P_offd. *-----------------------------------------------------------*/ for (jj3 = P_offd_i[i2]; jj3 < P_offd_i[i2 + 1]; jj3++) { i3 = map_P_to_Pext[P_offd_j[jj3]] + num_cols_diag_P; /*-------------------------------------------------------- * Check P_marker to see that RAP_{ic,i3} has not already * been accounted for. If it has not, mark it and increment * counter. *--------------------------------------------------------*/ if (P_marker[i3] < jj_row_begining) { P_marker[i3] = jj_counter; jj_counter++; } } } } } } jj_count[ii] = jj_counter; } /*----------------------------------------------------------------------- * Allocate RAP_int_data and RAP_int_j arrays. *-----------------------------------------------------------------------*/ for (i = 0; i < num_threads - 1; i++) { jj_count[i + 1] += jj_count[i]; } RAP_size = jj_count[num_threads - 1]; RAP_int_i = hypre_CTAlloc(HYPRE_Int, num_cols_offd_RT + 1, HYPRE_MEMORY_HOST); RAP_int_data = hypre_CTAlloc(HYPRE_Real, RAP_size, HYPRE_MEMORY_HOST); RAP_int_j = hypre_CTAlloc(HYPRE_BigInt, RAP_size, HYPRE_MEMORY_HOST); RAP_int_i[num_cols_offd_RT] = RAP_size; /*----------------------------------------------------------------------- * Second Pass: Fill in RAP_int_data and RAP_int_j. *-----------------------------------------------------------------------*/ #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i,ii,ic,i1,i2,i3,jj1,jj2,jj3,ns,ne,size,rest,jj_counter,jj_row_begining,A_marker,P_marker,r_entry,r_a_product,r_a_p_product) HYPRE_SMP_SCHEDULE #endif for (ii = 0; ii < num_threads; ii++) { P_marker = NULL; size = num_cols_offd_RT / num_threads; rest = num_cols_offd_RT - size * num_threads; if (ii < rest) { ns = ii * size + ii; ne = (ii + 1) * size + ii + 1; } else { ns = ii * size + rest; ne = (ii + 1) * size + rest; } /*----------------------------------------------------------------------- * Initialize some stuff. *-----------------------------------------------------------------------*/ if (num_cols_offd_Pext || num_cols_diag_P) { P_marker = P_mark_array[ii]; } A_marker = A_mark_array[ii]; jj_counter = start_indexing; if (ii > 0) { jj_counter = jj_count[ii - 1]; } for (ic = 0; ic < num_cols_diag_P + num_cols_offd_Pext; ic++) { P_marker[ic] = -1; } for (i = 0; i < num_nz_cols_A; i++) { A_marker[i] = -1; } /*----------------------------------------------------------------------- * Loop over exterior c-points. *-----------------------------------------------------------------------*/ for (ic = ns; ic < ne; ic++) { jj_row_begining = jj_counter; RAP_int_i[ic] = jj_counter; /*-------------------------------------------------------------------- * Loop over entries in row ic of R_offd. *--------------------------------------------------------------------*/ for (jj1 = R_offd_i[ic]; jj1 < R_offd_i[ic + 1]; jj1++) { i1 = R_offd_j[jj1]; r_entry = R_offd_data[jj1]; /*----------------------------------------------------------------- * Loop over entries in row i1 of A_offd. *-----------------------------------------------------------------*/ for (jj2 = A_offd_i[i1]; jj2 < A_offd_i[i1 + 1]; jj2++) { i2 = A_offd_j[jj2]; r_a_product = r_entry * A_offd_data[jj2]; /*-------------------------------------------------------------- * Check A_marker to see if point i2 has been previously * visited. New entries in RAP only occur from unmarked points. *--------------------------------------------------------------*/ if (A_marker[i2] != ic) { /*----------------------------------------------------------- * Mark i2 as visited. *-----------------------------------------------------------*/ A_marker[i2] = ic; /*----------------------------------------------------------- * Loop over entries in row i2 of P_ext. *-----------------------------------------------------------*/ for (jj3 = P_ext_diag_i[i2]; jj3 < P_ext_diag_i[i2 + 1]; jj3++) { i3 = P_ext_diag_j[jj3]; r_a_p_product = r_a_product * P_ext_diag_data[jj3]; /*-------------------------------------------------------- * Check P_marker to see that RAP_{ic,i3} has not already * been accounted for. If it has not, create a new entry. * If it has, add new contribution. *--------------------------------------------------------*/ if (P_marker[i3] < jj_row_begining) { P_marker[i3] = jj_counter; RAP_int_data[jj_counter] = r_a_p_product; RAP_int_j[jj_counter] = (HYPRE_BigInt)i3 + first_col_diag_P; jj_counter++; } else { RAP_int_data[P_marker[i3]] += r_a_p_product; } } for (jj3 = P_ext_offd_i[i2]; jj3 < P_ext_offd_i[i2 + 1]; jj3++) { i3 = P_ext_offd_j[jj3] + num_cols_diag_P; r_a_p_product = r_a_product * P_ext_offd_data[jj3]; /*-------------------------------------------------------- * Check P_marker to see that RAP_{ic,i3} has not already * been accounted for. If it has not, create a new entry. * If it has, add new contribution. *--------------------------------------------------------*/ if (P_marker[i3] < jj_row_begining) { P_marker[i3] = jj_counter; RAP_int_data[jj_counter] = r_a_p_product; RAP_int_j[jj_counter] = col_map_offd_Pext[i3 - num_cols_diag_P]; jj_counter++; } else { RAP_int_data[P_marker[i3]] += r_a_p_product; } } } /*-------------------------------------------------------------- * If i2 is previously visited ( A_marker[12]=ic ) it yields * no new entries in RAP and can just add new contributions. *--------------------------------------------------------------*/ else { for (jj3 = P_ext_diag_i[i2]; jj3 < P_ext_diag_i[i2 + 1]; jj3++) { i3 = P_ext_diag_j[jj3]; r_a_p_product = r_a_product * P_ext_diag_data[jj3]; RAP_int_data[P_marker[i3]] += r_a_p_product; } for (jj3 = P_ext_offd_i[i2]; jj3 < P_ext_offd_i[i2 + 1]; jj3++) { i3 = P_ext_offd_j[jj3] + num_cols_diag_P; r_a_p_product = r_a_product * P_ext_offd_data[jj3]; RAP_int_data[P_marker[i3]] += r_a_p_product; } } } /*----------------------------------------------------------------- * Loop over entries in row i1 of A_diag. *-----------------------------------------------------------------*/ for (jj2 = A_diag_i[i1]; jj2 < A_diag_i[i1 + 1]; jj2++) { i2 = A_diag_j[jj2]; r_a_product = r_entry * A_diag_data[jj2]; /*-------------------------------------------------------------- * Check A_marker to see if point i2 has been previously * visited. New entries in RAP only occur from unmarked points. *--------------------------------------------------------------*/ if (A_marker[i2 + num_cols_offd_A] != ic) { /*----------------------------------------------------------- * Mark i2 as visited. *-----------------------------------------------------------*/ A_marker[i2 + num_cols_offd_A] = ic; /*----------------------------------------------------------- * Loop over entries in row i2 of P_diag. *-----------------------------------------------------------*/ for (jj3 = P_diag_i[i2]; jj3 < P_diag_i[i2 + 1]; jj3++) { i3 = P_diag_j[jj3]; r_a_p_product = r_a_product * P_diag_data[jj3]; /*-------------------------------------------------------- * Check P_marker to see that RAP_{ic,i3} has not already * been accounted for. If it has not, create a new entry. * If it has, add new contribution. *--------------------------------------------------------*/ if (P_marker[i3] < jj_row_begining) { P_marker[i3] = jj_counter; RAP_int_data[jj_counter] = r_a_p_product; RAP_int_j[jj_counter] = (HYPRE_BigInt)i3 + first_col_diag_P; jj_counter++; } else { RAP_int_data[P_marker[i3]] += r_a_p_product; } } for (jj3 = P_offd_i[i2]; jj3 < P_offd_i[i2 + 1]; jj3++) { i3 = map_P_to_Pext[P_offd_j[jj3]] + num_cols_diag_P; r_a_p_product = r_a_product * P_offd_data[jj3]; /*-------------------------------------------------------- * Check P_marker to see that RAP_{ic,i3} has not already * been accounted for. If it has not, create a new entry. * If it has, add new contribution. *--------------------------------------------------------*/ if (P_marker[i3] < jj_row_begining) { P_marker[i3] = jj_counter; RAP_int_data[jj_counter] = r_a_p_product; RAP_int_j[jj_counter] = col_map_offd_Pext[i3 - num_cols_diag_P]; jj_counter++; } else { RAP_int_data[P_marker[i3]] += r_a_p_product; } } } /*-------------------------------------------------------------- * If i2 is previously visited ( A_marker[12]=ic ) it yields * no new entries in RAP and can just add new contributions. *--------------------------------------------------------------*/ else { for (jj3 = P_diag_i[i2]; jj3 < P_diag_i[i2 + 1]; jj3++) { i3 = P_diag_j[jj3]; r_a_p_product = r_a_product * P_diag_data[jj3]; RAP_int_data[P_marker[i3]] += r_a_p_product; } for (jj3 = P_offd_i[i2]; jj3 < P_offd_i[i2 + 1]; jj3++) { i3 = map_P_to_Pext[P_offd_j[jj3]] + num_cols_diag_P; r_a_p_product = r_a_product * P_offd_data[jj3]; RAP_int_data[P_marker[i3]] += r_a_p_product; } } } } } if (num_cols_offd_Pext || num_cols_diag_P) { hypre_TFree(P_mark_array[ii], HYPRE_MEMORY_HOST); } hypre_TFree(A_mark_array[ii], HYPRE_MEMORY_HOST); } RAP_int = hypre_CSRMatrixCreate(num_cols_offd_RT, num_rows_offd_RT, RAP_size); hypre_CSRMatrixMemoryLocation(RAP_int) = HYPRE_MEMORY_HOST; hypre_CSRMatrixI(RAP_int) = RAP_int_i; hypre_CSRMatrixBigJ(RAP_int) = RAP_int_j; hypre_CSRMatrixData(RAP_int) = RAP_int_data; hypre_TFree(jj_count, HYPRE_MEMORY_HOST); } #ifdef HYPRE_PROFILE hypre_profile_times[HYPRE_TIMER_ID_RENUMBER_COLIDX] -= hypre_MPI_Wtime(); hypre_profile_times[HYPRE_TIMER_ID_RENUMBER_COLIDX_RAP] -= hypre_MPI_Wtime(); #endif RAP_ext_size = 0; if (num_sends_RT || num_recvs_RT) { void *request; hypre_ExchangeExternalRowsInit(RAP_int, comm_pkg_RT, &request); RAP_ext = hypre_ExchangeExternalRowsWait(request); RAP_ext_i = hypre_CSRMatrixI(RAP_ext); RAP_ext_j = hypre_CSRMatrixBigJ(RAP_ext); RAP_ext_data = hypre_CSRMatrixData(RAP_ext); RAP_ext_size = RAP_ext_i[hypre_CSRMatrixNumRows(RAP_ext)]; } if (num_cols_offd_RT) { hypre_CSRMatrixDestroy(RAP_int); RAP_int = NULL; } RAP_diag_i = hypre_TAlloc(HYPRE_Int, num_cols_diag_RT + 1, memory_location_RAP); RAP_offd_i = hypre_TAlloc(HYPRE_Int, num_cols_diag_RT + 1, memory_location_RAP); first_col_diag_RAP = first_col_diag_P; last_col_diag_RAP = first_col_diag_P + num_cols_diag_P - 1; /*----------------------------------------------------------------------- * check for new nonzero columns in RAP_offd generated through RAP_ext *-----------------------------------------------------------------------*/ #ifdef HYPRE_CONCURRENT_HOPSCOTCH hypre_UnorderedBigIntMap col_map_offd_RAP_inverse; if (RAP_ext_size || num_cols_offd_Pext) { hypre_UnorderedBigIntSet found_set; hypre_UnorderedBigIntSetCreate(&found_set, 2 * (RAP_ext_size + num_cols_offd_Pext), 16 * hypre_NumThreads()); cnt = 0; #pragma omp parallel private(i) { #pragma omp for HYPRE_SMP_SCHEDULE for (i = 0; i < RAP_ext_size; i++) { if (RAP_ext_j[i] < first_col_diag_RAP || RAP_ext_j[i] > last_col_diag_RAP) { hypre_UnorderedBigIntSetPut(&found_set, RAP_ext_j[i]); } } #pragma omp for HYPRE_SMP_SCHEDULE for (i = 0; i < num_cols_offd_Pext; i++) { hypre_UnorderedBigIntSetPut(&found_set, col_map_offd_Pext[i]); } } /* omp parallel */ temp = hypre_UnorderedBigIntSetCopyToArray(&found_set, &num_cols_offd_RAP); hypre_UnorderedBigIntSetDestroy(&found_set); hypre_big_sort_and_create_inverse_map(temp, num_cols_offd_RAP, &col_map_offd_RAP, &col_map_offd_RAP_inverse); } #else /* !HYPRE_CONCURRENT_HOPSCOTCH */ if (RAP_ext_size || num_cols_offd_Pext) { temp = hypre_CTAlloc(HYPRE_BigInt, RAP_ext_size + num_cols_offd_Pext, HYPRE_MEMORY_HOST); cnt = 0; for (i = 0; i < RAP_ext_size; i++) if (RAP_ext_j[i] < first_col_diag_RAP || RAP_ext_j[i] > last_col_diag_RAP) { temp[cnt++] = RAP_ext_j[i]; } for (i = 0; i < num_cols_offd_Pext; i++) { temp[cnt++] = col_map_offd_Pext[i]; } if (cnt) { hypre_BigQsort0(temp, 0, cnt - 1); HYPRE_BigInt value = temp[0]; num_cols_offd_RAP = 1; for (i = 1; i < cnt; i++) { if (temp[i] > value) { value = temp[i]; temp[num_cols_offd_RAP++] = value; } } } /* now evaluate col_map_offd_RAP */ if (num_cols_offd_RAP) { col_map_offd_RAP = hypre_CTAlloc(HYPRE_BigInt, num_cols_offd_RAP, HYPRE_MEMORY_HOST); } for (i = 0 ; i < num_cols_offd_RAP; i++) { col_map_offd_RAP[i] = temp[i]; } hypre_TFree(temp, HYPRE_MEMORY_HOST); } #endif /* !HYPRE_CONCURRENT_HOPSCOTCH */ if (num_cols_offd_P) { map_P_to_RAP = hypre_TAlloc(HYPRE_Int, num_cols_offd_P, HYPRE_MEMORY_HOST); cnt = 0; for (i = 0; i < num_cols_offd_RAP; i++) if (col_map_offd_RAP[i] == col_map_offd_P[cnt]) { map_P_to_RAP[cnt++] = i; if (cnt == num_cols_offd_P) { break; } } } if (num_cols_offd_Pext) { map_Pext_to_RAP = hypre_TAlloc(HYPRE_Int, num_cols_offd_Pext, HYPRE_MEMORY_HOST); cnt = 0; for (i = 0; i < num_cols_offd_RAP; i++) if (col_map_offd_RAP[i] == col_map_offd_Pext[cnt]) { map_Pext_to_RAP[cnt++] = i; if (cnt == num_cols_offd_Pext) { break; } } } /*----------------------------------------------------------------------- * Convert RAP_ext column indices *-----------------------------------------------------------------------*/ #ifdef HYPRE_USING_OPENMP #pragma omp parallel for HYPRE_SMP_SCHEDULE #endif for (i = 0; i < RAP_ext_size; i++) if (RAP_ext_j[i] < first_col_diag_RAP || RAP_ext_j[i] > last_col_diag_RAP) RAP_ext_j[i] = (HYPRE_BigInt)num_cols_diag_P #ifdef HYPRE_CONCURRENT_HOPSCOTCH + (HYPRE_BigInt)hypre_UnorderedBigIntMapGet(&col_map_offd_RAP_inverse, RAP_ext_j[i]); #else +(HYPRE_BigInt)hypre_BigBinarySearch(col_map_offd_RAP, RAP_ext_j[i], num_cols_offd_RAP); #endif else { RAP_ext_j[i] -= first_col_diag_RAP; } #ifdef HYPRE_CONCURRENT_HOPSCOTCH if (num_cols_offd_RAP) { hypre_UnorderedBigIntMapDestroy(&col_map_offd_RAP_inverse); } #endif #ifdef HYPRE_PROFILE hypre_profile_times[HYPRE_TIMER_ID_RENUMBER_COLIDX] += hypre_MPI_Wtime(); hypre_profile_times[HYPRE_TIMER_ID_RENUMBER_COLIDX_RAP] += hypre_MPI_Wtime(); #endif /* need to allocate new P_marker etc. and make further changes */ /*----------------------------------------------------------------------- * Initialize some stuff. *-----------------------------------------------------------------------*/ jj_cnt_diag = hypre_CTAlloc(HYPRE_Int, num_threads, HYPRE_MEMORY_HOST); jj_cnt_offd = hypre_CTAlloc(HYPRE_Int, num_threads, HYPRE_MEMORY_HOST); #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i,j,k,jcol,ii,ic,i1,i2,i3,jj1,jj2,jj3,ns,ne,size,rest,jj_count_diag,jj_count_offd,jj_row_begin_diag,jj_row_begin_offd,A_marker,P_marker) HYPRE_SMP_SCHEDULE #endif for (ii = 0; ii < num_threads; ii++) { size = num_cols_diag_RT / num_threads; rest = num_cols_diag_RT - size * num_threads; if (ii < rest) { ns = ii * size + ii; ne = (ii + 1) * size + ii + 1; } else { ns = ii * size + rest; ne = (ii + 1) * size + rest; } P_mark_array[ii] = hypre_CTAlloc(HYPRE_Int, num_cols_diag_P + num_cols_offd_RAP, HYPRE_MEMORY_HOST); A_mark_array[ii] = hypre_CTAlloc(HYPRE_Int, num_nz_cols_A, HYPRE_MEMORY_HOST); P_marker = P_mark_array[ii]; A_marker = A_mark_array[ii]; jj_count_diag = start_indexing; jj_count_offd = start_indexing; for (ic = 0; ic < num_cols_diag_P + num_cols_offd_RAP; ic++) { P_marker[ic] = -1; } for (i = 0; i < num_nz_cols_A; i++) { A_marker[i] = -1; } /*----------------------------------------------------------------------- * Loop over interior c-points. *-----------------------------------------------------------------------*/ for (ic = ns; ic < ne; ic++) { /*-------------------------------------------------------------------- * Set marker for diagonal entry, RAP_{ic,ic}. and for all points * being added to row ic of RAP_diag and RAP_offd through RAP_ext *--------------------------------------------------------------------*/ jj_row_begin_diag = jj_count_diag; jj_row_begin_offd = jj_count_offd; if (square) { P_marker[ic] = jj_count_diag++; } #ifdef HYPRE_CONCURRENT_HOPSCOTCH if (send_map_elmts_RT_inverse_map_initialized) { HYPRE_Int i = hypre_UnorderedIntMapGet(&send_map_elmts_RT_inverse_map, ic); if (i != -1) { for (j = send_map_elmts_starts_RT_aggregated[i]; j < send_map_elmts_starts_RT_aggregated[i + 1]; j++) { HYPRE_Int jj = send_map_elmts_RT_aggregated[j]; for (k = RAP_ext_i[jj]; k < RAP_ext_i[jj + 1]; k++) { jcol = (HYPRE_Int)RAP_ext_j[k]; if (jcol < num_cols_diag_P) { if (P_marker[jcol] < jj_row_begin_diag) { P_marker[jcol] = jj_count_diag; jj_count_diag++; } } else { if (P_marker[jcol] < jj_row_begin_offd) { P_marker[jcol] = jj_count_offd; jj_count_offd++; } } } } } // if (set) } #else /* !HYPRE_CONCURRENT_HOPSCOTCH */ for (i = 0; i < num_sends_RT; i++) for (j = send_map_starts_RT[i]; j < send_map_starts_RT[i + 1]; j++) if (send_map_elmts_RT[j] == ic) { for (k = RAP_ext_i[j]; k < RAP_ext_i[j + 1]; k++) { jcol = (HYPRE_Int) RAP_ext_j[k]; if (jcol < num_cols_diag_P) { if (P_marker[jcol] < jj_row_begin_diag) { P_marker[jcol] = jj_count_diag; jj_count_diag++; } } else { if (P_marker[jcol] < jj_row_begin_offd) { P_marker[jcol] = jj_count_offd; jj_count_offd++; } } } break; } #endif /* !HYPRE_CONCURRENT_HOPSCOTCH */ /*-------------------------------------------------------------------- * Loop over entries in row ic of R_diag. *--------------------------------------------------------------------*/ for (jj1 = R_diag_i[ic]; jj1 < R_diag_i[ic + 1]; jj1++) { i1 = R_diag_j[jj1]; /*----------------------------------------------------------------- * Loop over entries in row i1 of A_offd. *-----------------------------------------------------------------*/ if (num_cols_offd_A) { for (jj2 = A_offd_i[i1]; jj2 < A_offd_i[i1 + 1]; jj2++) { i2 = A_offd_j[jj2]; /*-------------------------------------------------------------- * Check A_marker to see if point i2 has been previously * visited. New entries in RAP only occur from unmarked points. *--------------------------------------------------------------*/ if (A_marker[i2] != ic) { /*----------------------------------------------------------- * Mark i2 as visited. *-----------------------------------------------------------*/ A_marker[i2] = ic; /*----------------------------------------------------------- * Loop over entries in row i2 of P_ext. *-----------------------------------------------------------*/ for (jj3 = P_ext_diag_i[i2]; jj3 < P_ext_diag_i[i2 + 1]; jj3++) { i3 = P_ext_diag_j[jj3]; /*-------------------------------------------------------- * Check P_marker to see that RAP_{ic,i3} has not already * been accounted for. If it has not, mark it and increment * counter. *--------------------------------------------------------*/ if (P_marker[i3] < jj_row_begin_diag) { P_marker[i3] = jj_count_diag; jj_count_diag++; } } for (jj3 = P_ext_offd_i[i2]; jj3 < P_ext_offd_i[i2 + 1]; jj3++) { i3 = map_Pext_to_RAP[P_ext_offd_j[jj3]] + num_cols_diag_P; /*-------------------------------------------------------- * Check P_marker to see that RAP_{ic,i3} has not already * been accounted for. If it has not, mark it and increment * counter. *--------------------------------------------------------*/ if (P_marker[i3] < jj_row_begin_offd) { P_marker[i3] = jj_count_offd; jj_count_offd++; } } } } } /*----------------------------------------------------------------- * Loop over entries in row i1 of A_diag. *-----------------------------------------------------------------*/ for (jj2 = A_diag_i[i1]; jj2 < A_diag_i[i1 + 1]; jj2++) { i2 = A_diag_j[jj2]; /*-------------------------------------------------------------- * Check A_marker to see if point i2 has been previously * visited. New entries in RAP only occur from unmarked points. *--------------------------------------------------------------*/ if (A_marker[i2 + num_cols_offd_A] != ic) { /*----------------------------------------------------------- * Mark i2 as visited. *-----------------------------------------------------------*/ A_marker[i2 + num_cols_offd_A] = ic; /*----------------------------------------------------------- * Loop over entries in row i2 of P_diag. *-----------------------------------------------------------*/ for (jj3 = P_diag_i[i2]; jj3 < P_diag_i[i2 + 1]; jj3++) { i3 = P_diag_j[jj3]; /*-------------------------------------------------------- * Check P_marker to see that RAP_{ic,i3} has not already * been accounted for. If it has not, mark it and increment * counter. *--------------------------------------------------------*/ if (P_marker[i3] < jj_row_begin_diag) { P_marker[i3] = jj_count_diag; jj_count_diag++; } } /*----------------------------------------------------------- * Loop over entries in row i2 of P_offd. *-----------------------------------------------------------*/ if (num_cols_offd_P) { for (jj3 = P_offd_i[i2]; jj3 < P_offd_i[i2 + 1]; jj3++) { i3 = map_P_to_RAP[P_offd_j[jj3]] + num_cols_diag_P; /*-------------------------------------------------------- * Check P_marker to see that RAP_{ic,i3} has not already * been accounted for. If it has not, mark it and increment * counter. *--------------------------------------------------------*/ if (P_marker[i3] < jj_row_begin_offd) { P_marker[i3] = jj_count_offd; jj_count_offd++; } } } } } } /*-------------------------------------------------------------------- * Set RAP_diag_i and RAP_offd_i for this row. *--------------------------------------------------------------------*/ /* RAP_diag_i[ic] = jj_row_begin_diag; RAP_offd_i[ic] = jj_row_begin_offd; */ } jj_cnt_diag[ii] = jj_count_diag; jj_cnt_offd[ii] = jj_count_offd; } for (i = 0; i < num_threads - 1; i++) { jj_cnt_diag[i + 1] += jj_cnt_diag[i]; jj_cnt_offd[i + 1] += jj_cnt_offd[i]; } jj_count_diag = jj_cnt_diag[num_threads - 1]; jj_count_offd = jj_cnt_offd[num_threads - 1]; RAP_diag_i[num_cols_diag_RT] = jj_count_diag; RAP_offd_i[num_cols_diag_RT] = jj_count_offd; /*----------------------------------------------------------------------- * Allocate RAP_diag_data and RAP_diag_j arrays. * Allocate RAP_offd_data and RAP_offd_j arrays. *-----------------------------------------------------------------------*/ RAP_diag_size = jj_count_diag; if (RAP_diag_size) { RAP_diag_data = hypre_CTAlloc(HYPRE_Real, RAP_diag_size, memory_location_RAP); RAP_diag_j = hypre_CTAlloc(HYPRE_Int, RAP_diag_size, memory_location_RAP); } RAP_offd_size = jj_count_offd; if (RAP_offd_size) { RAP_offd_data = hypre_CTAlloc(HYPRE_Real, RAP_offd_size, memory_location_RAP); RAP_offd_j = hypre_CTAlloc(HYPRE_Int, RAP_offd_size, memory_location_RAP); } if (RAP_offd_size == 0 && num_cols_offd_RAP != 0) { num_cols_offd_RAP = 0; hypre_TFree(col_map_offd_RAP, HYPRE_MEMORY_HOST); } RA_diag_data_array = hypre_TAlloc(HYPRE_Real, num_cols_diag_A * num_threads, HYPRE_MEMORY_HOST); RA_diag_j_array = hypre_TAlloc(HYPRE_Int, num_cols_diag_A * num_threads, HYPRE_MEMORY_HOST); if (num_cols_offd_A) { RA_offd_data_array = hypre_TAlloc(HYPRE_Real, num_cols_offd_A * num_threads, HYPRE_MEMORY_HOST); RA_offd_j_array = hypre_TAlloc(HYPRE_Int, num_cols_offd_A * num_threads, HYPRE_MEMORY_HOST); } /*----------------------------------------------------------------------- * Second Pass: Fill in RAP_diag_data and RAP_diag_j. * Second Pass: Fill in RAP_offd_data and RAP_offd_j. *-----------------------------------------------------------------------*/ #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i,j,k,jcol,ii,ic,i1,i2,i3,jj1,jj2,jj3,ns,ne,size,rest,jj_count_diag,jj_count_offd,jj_row_begin_diag,jj_row_begin_offd,A_marker,P_marker,r_entry,r_a_product,r_a_p_product) HYPRE_SMP_SCHEDULE #endif for (ii = 0; ii < num_threads; ii++) { size = num_cols_diag_RT / num_threads; rest = num_cols_diag_RT - size * num_threads; if (ii < rest) { ns = ii * size + ii; ne = (ii + 1) * size + ii + 1; } else { ns = ii * size + rest; ne = (ii + 1) * size + rest; } /*----------------------------------------------------------------------- * Initialize some stuff. *-----------------------------------------------------------------------*/ P_marker = P_mark_array[ii]; A_marker = A_mark_array[ii]; for (ic = 0; ic < num_cols_diag_P + num_cols_offd_RAP; ic++) { P_marker[ic] = -1; } for (i = 0; i < num_nz_cols_A ; i++) { A_marker[i] = -1; } jj_count_diag = start_indexing; jj_count_offd = start_indexing; if (ii > 0) { jj_count_diag = jj_cnt_diag[ii - 1]; jj_count_offd = jj_cnt_offd[ii - 1]; } // temporal matrix RA = R*A // only need to store one row per thread because R*A and (R*A)*P are fused // into one loop. hypre_CSRMatrix RA_diag, RA_offd; RA_diag.data = RA_diag_data_array + num_cols_diag_A * ii; RA_diag.j = RA_diag_j_array + num_cols_diag_A * ii; RA_diag.num_nonzeros = 0; RA_offd.num_nonzeros = 0; if (num_cols_offd_A) { RA_offd.data = RA_offd_data_array + num_cols_offd_A * ii; RA_offd.j = RA_offd_j_array + num_cols_offd_A * ii; } else { RA_offd.data = NULL; RA_offd.j = NULL; } /*----------------------------------------------------------------------- * Loop over interior c-points. *-----------------------------------------------------------------------*/ for (ic = ns; ic < ne; ic++) { /*-------------------------------------------------------------------- * Create diagonal entry, RAP_{ic,ic} and add entries of RAP_ext *--------------------------------------------------------------------*/ jj_row_begin_diag = jj_count_diag; jj_row_begin_offd = jj_count_offd; RAP_diag_i[ic] = jj_row_begin_diag; RAP_offd_i[ic] = jj_row_begin_offd; HYPRE_Int ra_row_begin_diag = RA_diag.num_nonzeros; HYPRE_Int ra_row_begin_offd = RA_offd.num_nonzeros; if (square) { P_marker[ic] = jj_count_diag; RAP_diag_data[jj_count_diag] = zero; RAP_diag_j[jj_count_diag] = ic; jj_count_diag++; } #ifdef HYPRE_CONCURRENT_HOPSCOTCH if (send_map_elmts_RT_inverse_map_initialized) { HYPRE_Int i = hypre_UnorderedIntMapGet(&send_map_elmts_RT_inverse_map, ic); if (i != -1) { for (j = send_map_elmts_starts_RT_aggregated[i]; j < send_map_elmts_starts_RT_aggregated[i + 1]; j++) { HYPRE_Int jj = send_map_elmts_RT_aggregated[j]; for (k = RAP_ext_i[jj]; k < RAP_ext_i[jj + 1]; k++) { jcol = (HYPRE_Int)RAP_ext_j[k]; if (jcol < num_cols_diag_P) { if (P_marker[jcol] < jj_row_begin_diag) { P_marker[jcol] = jj_count_diag; RAP_diag_data[jj_count_diag] = RAP_ext_data[k]; RAP_diag_j[jj_count_diag] = jcol; jj_count_diag++; } else RAP_diag_data[P_marker[jcol]] += RAP_ext_data[k]; } else { if (P_marker[jcol] < jj_row_begin_offd) { P_marker[jcol] = jj_count_offd; RAP_offd_data[jj_count_offd] = RAP_ext_data[k]; RAP_offd_j[jj_count_offd] = jcol - num_cols_diag_P; jj_count_offd++; } else RAP_offd_data[P_marker[jcol]] += RAP_ext_data[k]; } } } } // if (set) } #else /* !HYPRE_CONCURRENT_HOPSCOTCH */ for (i = 0; i < num_sends_RT; i++) for (j = send_map_starts_RT[i]; j < send_map_starts_RT[i + 1]; j++) if (send_map_elmts_RT[j] == ic) { for (k = RAP_ext_i[j]; k < RAP_ext_i[j + 1]; k++) { jcol = (HYPRE_Int)RAP_ext_j[k]; if (jcol < num_cols_diag_P) { if (P_marker[jcol] < jj_row_begin_diag) { P_marker[jcol] = jj_count_diag; RAP_diag_data[jj_count_diag] = RAP_ext_data[k]; RAP_diag_j[jj_count_diag] = jcol; jj_count_diag++; } else RAP_diag_data[P_marker[jcol]] += RAP_ext_data[k]; } else { if (P_marker[jcol] < jj_row_begin_offd) { P_marker[jcol] = jj_count_offd; RAP_offd_data[jj_count_offd] = RAP_ext_data[k]; RAP_offd_j[jj_count_offd] = jcol - num_cols_diag_P; jj_count_offd++; } else RAP_offd_data[P_marker[jcol]] += RAP_ext_data[k]; } } break; } #endif /* !HYPRE_CONCURRENT_HOPSCOTCH */ /*-------------------------------------------------------------------- * Loop over entries in row ic of R_diag and compute row ic of RA. *--------------------------------------------------------------------*/ for (jj1 = R_diag_i[ic]; jj1 < R_diag_i[ic + 1]; jj1++) { i1 = R_diag_j[jj1]; r_entry = R_diag_data[jj1]; /*----------------------------------------------------------------- * Loop over entries in row i1 of A_offd. *-----------------------------------------------------------------*/ if (num_cols_offd_A) { for (jj2 = A_offd_i[i1]; jj2 < A_offd_i[i1 + 1]; jj2++) { i2 = A_offd_j[jj2]; HYPRE_Real a_entry = A_offd_data[jj2]; HYPRE_Int marker = A_marker[i2]; /*-------------------------------------------------------------- * Check A_marker to see if point i2 has been previously * visited. New entries in RAP only occur from unmarked points. *--------------------------------------------------------------*/ if (marker < ra_row_begin_offd) { /*----------------------------------------------------------- * Mark i2 as visited. *-----------------------------------------------------------*/ A_marker[i2] = RA_offd.num_nonzeros; RA_offd.data[RA_offd.num_nonzeros - ra_row_begin_offd] = r_entry * a_entry; RA_offd.j[RA_offd.num_nonzeros - ra_row_begin_offd] = i2; RA_offd.num_nonzeros++; } /*-------------------------------------------------------------- * If i2 is previously visited ( A_marker[12]=ic ) it yields * no new entries in RA and can just add new contributions. *--------------------------------------------------------------*/ else { RA_offd.data[marker - ra_row_begin_offd] += r_entry * a_entry; // JSP: compiler will more likely to generate FMA instructions // when we don't eliminate common subexpressions of // r_entry * A_offd_data[jj2] manually. } } // loop over entries in row i1 of A_offd } // num_cols_offd_A /*----------------------------------------------------------------- * Loop over entries in row i1 of A_diag. *-----------------------------------------------------------------*/ for (jj2 = A_diag_i[i1]; jj2 < A_diag_i[i1 + 1]; jj2++) { i2 = A_diag_j[jj2]; HYPRE_Real a_entry = A_diag_data[jj2]; HYPRE_Int marker = A_marker[i2 + num_cols_offd_A]; /*-------------------------------------------------------------- * Check A_marker to see if point i2 has been previously * visited. New entries in RAP only occur from unmarked points. *--------------------------------------------------------------*/ if (marker < ra_row_begin_diag) { /*----------------------------------------------------------- * Mark i2 as visited. *-----------------------------------------------------------*/ A_marker[i2 + num_cols_offd_A] = RA_diag.num_nonzeros; RA_diag.data[RA_diag.num_nonzeros - ra_row_begin_diag] = r_entry * a_entry; RA_diag.j[RA_diag.num_nonzeros - ra_row_begin_diag] = i2; RA_diag.num_nonzeros++; } /*-------------------------------------------------------------- * If i2 is previously visited ( A_marker[12]=ic ) it yields * no new entries in RA and can just add new contributions. *--------------------------------------------------------------*/ else { RA_diag.data[marker - ra_row_begin_diag] += r_entry * a_entry; } } // loop over entries in row i1 of A_diag } // loop over entries in row ic of R_diag /*-------------------------------------------------------------------- * Loop over entries in row ic of RA_offd. *--------------------------------------------------------------------*/ for (jj1 = ra_row_begin_offd; jj1 < RA_offd.num_nonzeros; jj1++) { i1 = RA_offd.j[jj1 - ra_row_begin_offd]; r_a_product = RA_offd.data[jj1 - ra_row_begin_offd]; /*----------------------------------------------------------- * Loop over entries in row i1 of P_ext. *-----------------------------------------------------------*/ for (jj2 = P_ext_diag_i[i1]; jj2 < P_ext_diag_i[i1 + 1]; jj2++) { i2 = P_ext_diag_j[jj2]; HYPRE_Real p_entry = P_ext_diag_data[jj2]; HYPRE_Int marker = P_marker[i2]; /*-------------------------------------------------------- * Check P_marker to see that RAP_{ic,i2} has not already * been accounted for. If it has not, create a new entry. * If it has, add new contribution. *--------------------------------------------------------*/ if (marker < jj_row_begin_diag) { P_marker[i2] = jj_count_diag; RAP_diag_data[jj_count_diag] = r_a_product * p_entry; RAP_diag_j[jj_count_diag] = i2; jj_count_diag++; } else { RAP_diag_data[marker] += r_a_product * p_entry; } } for (jj2 = P_ext_offd_i[i1]; jj2 < P_ext_offd_i[i1 + 1]; jj2++) { i2 = map_Pext_to_RAP[P_ext_offd_j[jj2]] + num_cols_diag_P; HYPRE_Real p_entry = P_ext_offd_data[jj2]; HYPRE_Int marker = P_marker[i2]; /*-------------------------------------------------------- * Check P_marker to see that RAP_{ic,i2} has not already * been accounted for. If it has not, create a new entry. * If it has, add new contribution. *--------------------------------------------------------*/ if (marker < jj_row_begin_offd) { P_marker[i2] = jj_count_offd; RAP_offd_data[jj_count_offd] = r_a_product * p_entry; RAP_offd_j[jj_count_offd] = i2 - num_cols_diag_P; jj_count_offd++; } else { RAP_offd_data[marker] += r_a_product * p_entry; } } } // loop over entries in row ic of RA_offd /*-------------------------------------------------------------------- * Loop over entries in row ic of RA_diag. *--------------------------------------------------------------------*/ for (jj1 = ra_row_begin_diag; jj1 < RA_diag.num_nonzeros; jj1++) { HYPRE_Int i1 = RA_diag.j[jj1 - ra_row_begin_diag]; HYPRE_Real r_a_product = RA_diag.data[jj1 - ra_row_begin_diag]; /*----------------------------------------------------------------- * Loop over entries in row i1 of P_diag. *-----------------------------------------------------------------*/ for (jj2 = P_diag_i[i1]; jj2 < P_diag_i[i1 + 1]; jj2++) { i2 = P_diag_j[jj2]; HYPRE_Real p_entry = P_diag_data[jj2]; HYPRE_Int marker = P_marker[i2]; /*-------------------------------------------------------- * Check P_marker to see that RAP_{ic,i2} has not already * been accounted for. If it has not, create a new entry. * If it has, add new contribution. *--------------------------------------------------------*/ if (marker < jj_row_begin_diag) { P_marker[i2] = jj_count_diag; RAP_diag_data[jj_count_diag] = r_a_product * p_entry; RAP_diag_j[jj_count_diag] = i2; jj_count_diag++; } else { RAP_diag_data[marker] += r_a_product * p_entry; } } if (num_cols_offd_P) { for (jj2 = P_offd_i[i1]; jj2 < P_offd_i[i1 + 1]; jj2++) { i2 = map_P_to_RAP[P_offd_j[jj2]] + num_cols_diag_P; HYPRE_Real p_entry = P_offd_data[jj2]; HYPRE_Int marker = P_marker[i2]; /*-------------------------------------------------------- * Check P_marker to see that RAP_{ic,i2} has not already * been accounted for. If it has not, create a new entry. * If it has, add new contribution. *--------------------------------------------------------*/ if (marker < jj_row_begin_offd) { P_marker[i2] = jj_count_offd; RAP_offd_data[jj_count_offd] = r_a_product * p_entry; RAP_offd_j[jj_count_offd] = i2 - num_cols_diag_P; jj_count_offd++; } else { RAP_offd_data[marker] += r_a_product * p_entry; } } } // num_cols_offd_P } // loop over entries in row ic of RA_diag. } // Loop over interior c-points. hypre_TFree(P_mark_array[ii], HYPRE_MEMORY_HOST); hypre_TFree(A_mark_array[ii], HYPRE_MEMORY_HOST); } // omp parallel for /* check if really all off-diagonal entries occurring in col_map_offd_RAP are represented and eliminate if necessary */ P_marker = hypre_CTAlloc(HYPRE_Int, num_cols_offd_RAP, HYPRE_MEMORY_HOST); #ifdef HYPRE_USING_OPENMP #pragma omp parallel for HYPRE_SMP_SCHEDULE #endif for (i = 0; i < num_cols_offd_RAP; i++) { P_marker[i] = -1; } jj_count_offd = 0; #ifdef HYPRE_USING_ATOMIC #pragma omp parallel for private(i3) reduction(+:jj_count_offd) HYPRE_SMP_SCHEDULE #endif for (i = 0; i < RAP_offd_size; i++) { i3 = RAP_offd_j[i]; #ifdef HYPRE_USING_ATOMIC if (hypre_compare_and_swap(P_marker + i3, -1, 0) == -1) { jj_count_offd++; } #else if (P_marker[i3]) { P_marker[i3] = 0; jj_count_offd++; } #endif } if (jj_count_offd < num_cols_offd_RAP) { new_col_map_offd_RAP = hypre_CTAlloc(HYPRE_BigInt, jj_count_offd, HYPRE_MEMORY_HOST); jj_counter = 0; for (i = 0; i < num_cols_offd_RAP; i++) if (!P_marker[i]) { P_marker[i] = jj_counter; new_col_map_offd_RAP[jj_counter++] = col_map_offd_RAP[i]; } #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i3) HYPRE_SMP_SCHEDULE #endif for (i = 0; i < RAP_offd_size; i++) { i3 = RAP_offd_j[i]; RAP_offd_j[i] = P_marker[i3]; } num_cols_offd_RAP = jj_count_offd; hypre_TFree(col_map_offd_RAP, HYPRE_MEMORY_HOST); col_map_offd_RAP = new_col_map_offd_RAP; } hypre_TFree(P_marker, HYPRE_MEMORY_HOST); RAP = hypre_ParCSRMatrixCreate(comm, n_coarse_RT, n_coarse, RT_partitioning, coarse_partitioning, num_cols_offd_RAP, RAP_diag_size, RAP_offd_size); RAP_diag = hypre_ParCSRMatrixDiag(RAP); hypre_CSRMatrixI(RAP_diag) = RAP_diag_i; if (RAP_diag_size) { hypre_CSRMatrixData(RAP_diag) = RAP_diag_data; hypre_CSRMatrixJ(RAP_diag) = RAP_diag_j; } RAP_offd = hypre_ParCSRMatrixOffd(RAP); hypre_CSRMatrixI(RAP_offd) = RAP_offd_i; if (num_cols_offd_RAP) { hypre_CSRMatrixData(RAP_offd) = RAP_offd_data; hypre_CSRMatrixJ(RAP_offd) = RAP_offd_j; hypre_ParCSRMatrixColMapOffd(RAP) = col_map_offd_RAP; } if (num_procs > 1) { /* hypre_GenerateRAPCommPkg(RAP, A); */ hypre_MatvecCommPkgCreate(RAP); } *RAP_ptr = RAP; /*----------------------------------------------------------------------- * Free R, P_ext and marker arrays. *-----------------------------------------------------------------------*/ if (keepTranspose) { hypre_ParCSRMatrixDiagT(RT) = R_diag; } else { hypre_CSRMatrixDestroy(R_diag); } R_diag = NULL; if (num_cols_offd_RT) { if (keepTranspose) { hypre_ParCSRMatrixOffdT(RT) = R_offd; } else { hypre_CSRMatrixDestroy(R_offd); } R_offd = NULL; } if (num_sends_RT || num_recvs_RT) { hypre_CSRMatrixDestroy(RAP_ext); RAP_ext = NULL; } hypre_TFree(P_mark_array, HYPRE_MEMORY_HOST); hypre_TFree(A_mark_array, HYPRE_MEMORY_HOST); hypre_TFree(P_ext_diag_i, HYPRE_MEMORY_HOST); hypre_TFree(P_ext_offd_i, HYPRE_MEMORY_HOST); hypre_TFree(jj_cnt_diag, HYPRE_MEMORY_HOST); hypre_TFree(jj_cnt_offd, HYPRE_MEMORY_HOST); if (num_cols_offd_P) { hypre_TFree(map_P_to_Pext, HYPRE_MEMORY_HOST); hypre_TFree(map_P_to_RAP, HYPRE_MEMORY_HOST); } if (num_cols_offd_Pext) { hypre_TFree(col_map_offd_Pext, HYPRE_MEMORY_HOST); hypre_TFree(map_Pext_to_RAP, HYPRE_MEMORY_HOST); } if (P_ext_diag_size) { hypre_TFree(P_ext_diag_data, HYPRE_MEMORY_HOST); hypre_TFree(P_ext_diag_j, HYPRE_MEMORY_HOST); } if (P_ext_offd_size) { hypre_TFree(P_ext_offd_data, HYPRE_MEMORY_HOST); hypre_TFree(P_ext_offd_j, HYPRE_MEMORY_HOST); } hypre_TFree(RA_diag_data_array, HYPRE_MEMORY_HOST); hypre_TFree(RA_diag_j_array, HYPRE_MEMORY_HOST); if (num_cols_offd_A) { hypre_TFree(RA_offd_data_array, HYPRE_MEMORY_HOST); hypre_TFree(RA_offd_j_array, HYPRE_MEMORY_HOST); } #ifdef HYPRE_CONCURRENT_HOPSCOTCH if (send_map_elmts_RT_inverse_map_initialized) { hypre_UnorderedIntMapDestroy(&send_map_elmts_RT_inverse_map); } hypre_TFree(send_map_elmts_starts_RT_aggregated, HYPRE_MEMORY_HOST); hypre_TFree(send_map_elmts_RT_aggregated, HYPRE_MEMORY_HOST); #endif #ifdef HYPRE_PROFILE hypre_profile_times[HYPRE_TIMER_ID_RAP] += hypre_MPI_Wtime(); #endif return hypre_error_flag; } hypre-2.33.0/src/parcsr_ls/par_rap_communication.c000066400000000000000000000302711477326011500222330ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "_hypre_parcsr_ls.h" HYPRE_Int hypre_GetCommPkgRTFromCommPkgA( hypre_ParCSRMatrix *RT, hypre_ParCSRMatrix *A, HYPRE_Int *fine_to_coarse, HYPRE_Int *tmp_map_offd) { MPI_Comm comm = hypre_ParCSRMatrixComm(RT); hypre_ParCSRCommPkg *comm_pkg_A = hypre_ParCSRMatrixCommPkg(A); hypre_ParCSRCommHandle *comm_handle; HYPRE_Int num_recvs_A = hypre_ParCSRCommPkgNumRecvs(comm_pkg_A); HYPRE_Int *recv_procs_A = hypre_ParCSRCommPkgRecvProcs(comm_pkg_A); HYPRE_Int *recv_vec_starts_A = hypre_ParCSRCommPkgRecvVecStarts(comm_pkg_A); HYPRE_Int num_sends_A = hypre_ParCSRCommPkgNumSends(comm_pkg_A); HYPRE_Int *send_procs_A = hypre_ParCSRCommPkgSendProcs(comm_pkg_A); HYPRE_Int *send_map_starts_A = hypre_ParCSRCommPkgSendMapStarts(comm_pkg_A); hypre_ParCSRCommPkg *comm_pkg = NULL; HYPRE_Int num_recvs_RT; HYPRE_Int *recv_procs_RT; HYPRE_Int *recv_vec_starts_RT; HYPRE_Int num_sends_RT; HYPRE_Int *send_procs_RT; HYPRE_Int *send_map_starts_RT; HYPRE_Int *send_map_elmts_RT; HYPRE_BigInt *col_map_offd_RT = hypre_ParCSRMatrixColMapOffd(RT); HYPRE_Int num_cols_offd_RT = hypre_CSRMatrixNumCols( hypre_ParCSRMatrixOffd(RT)); HYPRE_BigInt first_col_diag = hypre_ParCSRMatrixFirstColDiag(RT); HYPRE_Int n_fine = hypre_CSRMatrixNumRows(hypre_ParCSRMatrixDiag(A)); HYPRE_Int num_cols_A_offd = hypre_CSRMatrixNumCols(hypre_ParCSRMatrixOffd(A)); HYPRE_BigInt *fine_to_coarse_offd = NULL; HYPRE_BigInt *big_buf_data = NULL; HYPRE_BigInt *send_big_elmts = NULL; HYPRE_BigInt my_first_cpt; HYPRE_Int i, j; HYPRE_Int vec_len, vec_start; HYPRE_Int num_procs, my_id; HYPRE_Int ierr = 0; HYPRE_Int num_requests; HYPRE_Int offd_col, proc_num; HYPRE_Int num_threads = hypre_NumThreads(); HYPRE_Int size, rest, ns, ne, start; HYPRE_Int index; HYPRE_Int *proc_mark; HYPRE_Int *change_array; HYPRE_Int *coarse_counter; HYPRE_Int coarse_shift; hypre_MPI_Request *requests; hypre_MPI_Status *status; hypre_MPI_Comm_size(comm, &num_procs); hypre_MPI_Comm_rank(comm, &my_id); /*-------------------------------------------------------------------------- * determine num_recvs, recv_procs and recv_vec_starts for RT *--------------------------------------------------------------------------*/ proc_mark = hypre_CTAlloc(HYPRE_Int, num_recvs_A, HYPRE_MEMORY_HOST); for (i = 0; i < num_recvs_A; i++) { proc_mark[i] = 0; } proc_num = 0; num_recvs_RT = 0; if (num_cols_offd_RT) { for (i = 0; i < num_recvs_A; i++) { for (j = recv_vec_starts_A[i]; j < recv_vec_starts_A[i + 1]; j++) { offd_col = tmp_map_offd[proc_num]; if (offd_col == j) { proc_mark[i]++; proc_num++; if (proc_num == num_cols_offd_RT) { break; } } } if (proc_mark[i]) { num_recvs_RT++; } if (proc_num == num_cols_offd_RT) { break; } } } fine_to_coarse_offd = hypre_CTAlloc(HYPRE_BigInt, num_cols_A_offd, HYPRE_MEMORY_HOST); big_buf_data = hypre_CTAlloc(HYPRE_BigInt, send_map_starts_A[num_sends_A], HYPRE_MEMORY_HOST); coarse_counter = hypre_CTAlloc(HYPRE_Int, num_threads, HYPRE_MEMORY_HOST); my_first_cpt = hypre_ParCSRMatrixColStarts(RT)[0]; #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i,j,ns,ne,size,rest,coarse_shift) HYPRE_SMP_SCHEDULE #endif for (j = 0; j < num_threads; j++) { coarse_shift = 0; if (j > 0) { coarse_shift = coarse_counter[j - 1]; } size = n_fine / num_threads; rest = n_fine - size * num_threads; if (j < rest) { ns = j * size + j; ne = (j + 1) * size + j + 1; } else { ns = j * size + rest; ne = (j + 1) * size + rest; } for (i = ns; i < ne; i++) { fine_to_coarse[i] += coarse_shift; } } index = 0; for (i = 0; i < num_sends_A; i++) { start = hypre_ParCSRCommPkgSendMapStart(comm_pkg_A, i); for (j = start; j < hypre_ParCSRCommPkgSendMapStart(comm_pkg_A, i + 1); j++) big_buf_data[index++] = my_first_cpt + (HYPRE_BigInt)fine_to_coarse[hypre_ParCSRCommPkgSendMapElmt(comm_pkg_A, j)]; } comm_handle = hypre_ParCSRCommHandleCreate( 21, comm_pkg_A, big_buf_data, fine_to_coarse_offd); hypre_ParCSRCommHandleDestroy(comm_handle); for (i = 0; i < num_cols_offd_RT; i++) { col_map_offd_RT[i] = fine_to_coarse_offd[tmp_map_offd[i]]; } hypre_TFree(big_buf_data, HYPRE_MEMORY_HOST); hypre_TFree(fine_to_coarse_offd, HYPRE_MEMORY_HOST); hypre_TFree(coarse_counter, HYPRE_MEMORY_HOST); //hypre_TFree(tmp_map_offd, HYPRE_MEMORY_HOST); recv_procs_RT = hypre_CTAlloc(HYPRE_Int, num_recvs_RT, HYPRE_MEMORY_HOST); recv_vec_starts_RT = hypre_CTAlloc(HYPRE_Int, num_recvs_RT + 1, HYPRE_MEMORY_HOST); j = 0; recv_vec_starts_RT[0] = 0; for (i = 0; i < num_recvs_A; i++) { if (proc_mark[i]) { recv_procs_RT[j] = recv_procs_A[i]; recv_vec_starts_RT[j + 1] = recv_vec_starts_RT[j] + proc_mark[i]; j++; } } /*-------------------------------------------------------------------------- * send num_changes to recv_procs_A and receive change_array from send_procs_A *--------------------------------------------------------------------------*/ num_requests = num_recvs_A + num_sends_A; requests = hypre_CTAlloc(hypre_MPI_Request, num_requests, HYPRE_MEMORY_HOST); status = hypre_CTAlloc(hypre_MPI_Status, num_requests, HYPRE_MEMORY_HOST); change_array = hypre_CTAlloc(HYPRE_Int, num_sends_A, HYPRE_MEMORY_HOST); j = 0; for (i = 0; i < num_sends_A; i++) hypre_MPI_Irecv(&change_array[i], 1, HYPRE_MPI_INT, send_procs_A[i], 0, comm, &requests[j++]); for (i = 0; i < num_recvs_A; i++) hypre_MPI_Isend(&proc_mark[i], 1, HYPRE_MPI_INT, recv_procs_A[i], 0, comm, &requests[j++]); hypre_MPI_Waitall(num_requests, requests, status); hypre_TFree(proc_mark, HYPRE_MEMORY_HOST); /*-------------------------------------------------------------------------- * if change_array[i] is 0 , omit send_procs_A[i] in send_procs_RT *--------------------------------------------------------------------------*/ num_sends_RT = 0; for (i = 0; i < num_sends_A; i++) if (change_array[i]) { num_sends_RT++; } send_procs_RT = hypre_CTAlloc(HYPRE_Int, num_sends_RT, HYPRE_MEMORY_HOST); send_map_starts_RT = hypre_CTAlloc(HYPRE_Int, num_sends_RT + 1, HYPRE_MEMORY_HOST); j = 0; send_map_starts_RT[0] = 0; for (i = 0; i < num_sends_A; i++) { if (change_array[i]) { send_procs_RT[j] = send_procs_A[i]; send_map_starts_RT[j + 1] = send_map_starts_RT[j] + change_array[i]; j++; } } /*-------------------------------------------------------------------------- * generate send_map_elmts *--------------------------------------------------------------------------*/ send_map_elmts_RT = hypre_CTAlloc(HYPRE_Int, send_map_starts_RT[num_sends_RT], HYPRE_MEMORY_HOST); send_big_elmts = hypre_CTAlloc(HYPRE_BigInt, send_map_starts_RT[num_sends_RT], HYPRE_MEMORY_HOST); j = 0; for (i = 0; i < num_sends_RT; i++) { vec_start = send_map_starts_RT[i]; vec_len = send_map_starts_RT[i + 1] - vec_start; hypre_MPI_Irecv(&send_big_elmts[vec_start], vec_len, HYPRE_MPI_BIG_INT, send_procs_RT[i], 0, comm, &requests[j++]); } for (i = 0; i < num_recvs_RT; i++) { vec_start = recv_vec_starts_RT[i]; vec_len = recv_vec_starts_RT[i + 1] - vec_start; hypre_MPI_Isend(&col_map_offd_RT[vec_start], vec_len, HYPRE_MPI_BIG_INT, recv_procs_RT[i], 0, comm, &requests[j++]); } hypre_MPI_Waitall(j, requests, status); for (i = 0; i < send_map_starts_RT[num_sends_RT]; i++) { send_map_elmts_RT[i] = (HYPRE_Int)(send_big_elmts[i] - first_col_diag); } /* Create and fill communication package */ hypre_ParCSRCommPkgCreateAndFill(comm, num_recvs_RT, recv_procs_RT, recv_vec_starts_RT, num_sends_RT, send_procs_RT, send_map_starts_RT, send_map_elmts_RT, &comm_pkg); hypre_TFree(status, HYPRE_MEMORY_HOST); hypre_TFree(requests, HYPRE_MEMORY_HOST); hypre_TFree(send_big_elmts, HYPRE_MEMORY_HOST); hypre_ParCSRMatrixCommPkg(RT) = comm_pkg; hypre_TFree(change_array, HYPRE_MEMORY_HOST); return ierr; } HYPRE_Int hypre_GenerateSendMapAndCommPkg(MPI_Comm comm, HYPRE_Int num_sends, HYPRE_Int num_recvs, HYPRE_Int *recv_procs, HYPRE_Int *send_procs, HYPRE_Int *recv_vec_starts, hypre_ParCSRMatrix *A) { HYPRE_Int *send_map_starts; HYPRE_Int *send_map_elmts; HYPRE_Int i, j; HYPRE_Int num_requests = num_sends + num_recvs; hypre_MPI_Request *requests; hypre_MPI_Status *status; HYPRE_Int vec_len, vec_start; hypre_ParCSRCommPkg *comm_pkg = NULL; HYPRE_BigInt *col_map_offd = hypre_ParCSRMatrixColMapOffd(A); HYPRE_BigInt first_col_diag = hypre_ParCSRMatrixFirstColDiag(A); HYPRE_BigInt *send_big_elmts = NULL; /*-------------------------------------------------------------------------- * generate send_map_starts and send_map_elmts *--------------------------------------------------------------------------*/ requests = hypre_CTAlloc(hypre_MPI_Request, num_requests, HYPRE_MEMORY_HOST); status = hypre_CTAlloc(hypre_MPI_Status, num_requests, HYPRE_MEMORY_HOST); send_map_starts = hypre_CTAlloc(HYPRE_Int, num_sends + 1, HYPRE_MEMORY_HOST); j = 0; for (i = 0; i < num_sends; i++) { hypre_MPI_Irecv(&send_map_starts[i + 1], 1, HYPRE_MPI_INT, send_procs[i], 0, comm, &requests[j++]); } for (i = 0; i < num_recvs; i++) { vec_len = recv_vec_starts[i + 1] - recv_vec_starts[i]; hypre_MPI_Isend(&vec_len, 1, HYPRE_MPI_INT, recv_procs[i], 0, comm, &requests[j++]); } hypre_MPI_Waitall(j, requests, status); send_map_starts[0] = 0; for (i = 0; i < num_sends; i++) { send_map_starts[i + 1] += send_map_starts[i]; } send_map_elmts = hypre_CTAlloc(HYPRE_Int, send_map_starts[num_sends], HYPRE_MEMORY_HOST); send_big_elmts = hypre_CTAlloc(HYPRE_BigInt, send_map_starts[num_sends], HYPRE_MEMORY_HOST); j = 0; for (i = 0; i < num_sends; i++) { vec_start = send_map_starts[i]; vec_len = send_map_starts[i + 1] - vec_start; hypre_MPI_Irecv(&send_big_elmts[vec_start], vec_len, HYPRE_MPI_BIG_INT, send_procs[i], 0, comm, &requests[j++]); } for (i = 0; i < num_recvs; i++) { vec_start = recv_vec_starts[i]; vec_len = recv_vec_starts[i + 1] - vec_start; hypre_MPI_Isend(&col_map_offd[vec_start], vec_len, HYPRE_MPI_BIG_INT, recv_procs[i], 0, comm, &requests[j++]); } hypre_MPI_Waitall(j, requests, status); for (i = 0; i < send_map_starts[num_sends]; i++) { send_map_elmts[i] = (HYPRE_Int)(send_big_elmts[i] - first_col_diag); } /* Create and fill communication package */ hypre_ParCSRCommPkgCreateAndFill(comm, num_recvs, recv_procs, recv_vec_starts, num_sends, send_procs, send_map_starts, send_map_elmts, &comm_pkg); hypre_TFree(status, HYPRE_MEMORY_HOST); hypre_TFree(requests, HYPRE_MEMORY_HOST); hypre_TFree(send_big_elmts, HYPRE_MEMORY_HOST); hypre_ParCSRMatrixCommPkg(A) = comm_pkg; return hypre_error_flag; } hypre-2.33.0/src/parcsr_ls/par_relax.c000066400000000000000000002112671477326011500176450ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * Relaxation scheme * *****************************************************************************/ #include "_hypre_parcsr_ls.h" #include "Common.h" #include "_hypre_lapack.h" #include "par_relax.h" /*-------------------------------------------------------------------------- * hypre_BoomerAMGRelax *--------------------------------------------------------------------------*/ HYPRE_Int hypre_BoomerAMGRelax( hypre_ParCSRMatrix *A, hypre_ParVector *f, HYPRE_Int *cf_marker, HYPRE_Int relax_type, HYPRE_Int relax_points, HYPRE_Real relax_weight, HYPRE_Real omega, HYPRE_Real *l1_norms, hypre_ParVector *u, hypre_ParVector *Vtemp, hypre_ParVector *Ztemp ) { HYPRE_Int relax_error = 0; /*--------------------------------------------------------------------------------------- * Switch statement to direct control based on relax_type: * relax_type = 0 -> Jacobi or CF-Jacobi * relax_type = 1 -> Gauss-Seidel <--- very slow, sequential * relax_type = 2 -> Gauss_Seidel: interior points in parallel, * boundary sequential * relax_type = 3 -> hybrid: SOR-J mix off-processor, SOR on-processor * with outer relaxation parameters (forward solve) * relax_type = 4 -> hybrid: SOR-J mix off-processor, SOR on-processor * with outer relaxation parameters (backward solve) * relax_type = 5 -> hybrid: GS-J mix off-processor, chaotic GS on-node * relax_type = 6 -> hybrid: SSOR-J mix off-processor, SSOR on-processor * with outer relaxation parameters * relax_type = 7 -> Jacobi (uses Matvec), only needed in CGNR * [GPU-supported, CF supported with redundant computation] * relax_type = 8 -> hybrid L1 Symm. Gauss-Seidel (SSOR) * relax_type = 10 -> On-processor direct forward solve for matrices with * triangular structure (indices need not be ordered * triangular) * relax_type = 11 -> Two Stage approximation to GS. Uses the strict lower * part of the diagonal matrix * relax_type = 12 -> Two Stage approximation to GS. Uses the strict lower * part of the diagonal matrix and a second iteration * for additional error approximation * relax_type = 13 -> hybrid L1 Gauss-Seidel forward solve * relax_type = 14 -> hybrid L1 Gauss-Seidel backward solve * relax_type = 15 -> CG * relax_type = 16 -> Scaled Chebyshev * relax_type = 17 -> FCF-Jacobi * relax_type = 18 -> L1-Jacobi [GPU-supported through call to relax7Jacobi] * relax_type = 21 -> the same as 8 except forcing serialization on CPU (#OMP-thread = 1) * relax_type = 30 -> Kaczmarz * relax_type = 88 -> convergent version of SSOR (option 8) * relax_type = 89 -> L1 Symm. hybrid Gauss-Seidel *-------------------------------------------------------------------------------------*/ switch (relax_type) { case 0: /* Weighted Jacobi */ hypre_BoomerAMGRelax0WeightedJacobi(A, f, cf_marker, relax_points, relax_weight, u, Vtemp); break; case 1: /* Gauss-Seidel VERY SLOW */ hypre_BoomerAMGRelax1GaussSeidel(A, f, cf_marker, relax_points, u); break; case 2: /* Gauss-Seidel: relax interior points in parallel, boundary sequentially */ hypre_BoomerAMGRelax2GaussSeidel(A, f, cf_marker, relax_points, u); break; case 3: /* Hybrid: Jacobi off-processor, Gauss-Seidel on-processor (forward loop) */ hypre_BoomerAMGRelax3HybridGaussSeidel(A, f, cf_marker, relax_points, relax_weight, omega, u, Vtemp, Ztemp); break; case 4: /* Hybrid: Jacobi off-processor, Gauss-Seidel/SOR on-processor (backward loop) */ hypre_BoomerAMGRelax4HybridGaussSeidel(A, f, cf_marker, relax_points, relax_weight, omega, u, Vtemp, Ztemp); break; case 5: /* Hybrid: Jacobi off-processor, chaotic Gauss-Seidel on-processor */ hypre_BoomerAMGRelax5ChaoticHybridGaussSeidel(A, f, cf_marker, relax_points, u); break; case 6: /* Hybrid: Jacobi off-processor, Symm. Gauss-Seidel/SSOR on-processor with outer relaxation parameter */ hypre_BoomerAMGRelax6HybridSSOR(A, f, cf_marker, relax_points, relax_weight, omega, u, Vtemp, Ztemp); break; case 7: /* Jacobi (uses ParMatvec) */ hypre_BoomerAMGRelax7Jacobi(A, f, cf_marker, relax_points, relax_weight, l1_norms, u, Vtemp); break; case 8: /* L1 hybrid Symm. Gauss-Seidel */ case 88: /* L1 hybrid Symm. Gauss-Seidel (with a convergent l1 term) */ hypre_BoomerAMGRelax8HybridL1SSOR(A, f, cf_marker, relax_points, relax_weight, omega, l1_norms, u, Vtemp, Ztemp); break; case 10: /* Hybrid: Jacobi off-processor, ordered Gauss-Seidel on-processor */ hypre_BoomerAMGRelax10TopoOrderedGaussSeidel(A, f, cf_marker, relax_points, relax_weight, omega, u, Vtemp, Ztemp); break; case 11: /* Two Stage Gauss Seidel. Forward sweep only */ hypre_BoomerAMGRelax11TwoStageGaussSeidel(A, f, cf_marker, relax_points, relax_weight, omega, l1_norms, u, Vtemp, Ztemp); break; case 12: /* Two Stage Gauss Seidel. Uses the diagonal matrix for the GS part */ hypre_BoomerAMGRelax12TwoStageGaussSeidel(A, f, cf_marker, relax_points, relax_weight, omega, l1_norms, u, Vtemp, Ztemp); break; case 13: /* hybrid L1 Gauss-Seidel forward solve */ hypre_BoomerAMGRelax13HybridL1GaussSeidel(A, f, cf_marker, relax_points, relax_weight, omega, l1_norms, u, Vtemp, Ztemp); break; case 14: /* hybrid L1 Gauss-Seidel backward solve */ hypre_BoomerAMGRelax14HybridL1GaussSeidel(A, f, cf_marker, relax_points, relax_weight, omega, l1_norms, u, Vtemp, Ztemp); break; case 18: /* weighted L1 Jacobi */ hypre_BoomerAMGRelax18WeightedL1Jacobi(A, f, cf_marker, relax_points, relax_weight, l1_norms, u, Vtemp); break; case 30: /* Kaczmarz */ hypre_BoomerAMGRelaxKaczmarz(A, f, omega, l1_norms, u); break; case 89: /* L1 Symm. hybrid Gauss-Seidel */ hypre_BoomerAMGRelax89HybridL1SSOR(A, f, cf_marker, relax_points, relax_weight, omega, l1_norms, u, Vtemp, Ztemp); break; } hypre_ParVectorAllZeros(u) = 0; return relax_error; } /*-------------------------------------------------------------------- * hypre_BoomerAMGRelaxWeightedJacobi_core *--------------------------------------------------------------------*/ HYPRE_Int hypre_BoomerAMGRelaxWeightedJacobi_core( hypre_ParCSRMatrix *A, hypre_ParVector *f, HYPRE_Int *cf_marker, HYPRE_Int relax_points, HYPRE_Real relax_weight, HYPRE_Real *l1_norms, hypre_ParVector *u, hypre_ParVector *Vtemp, HYPRE_Int Skip_diag ) { MPI_Comm comm = hypre_ParCSRMatrixComm(A); hypre_CSRMatrix *A_diag = hypre_ParCSRMatrixDiag(A); HYPRE_Real *A_diag_data = hypre_CSRMatrixData(A_diag); HYPRE_Int *A_diag_i = hypre_CSRMatrixI(A_diag); HYPRE_Int *A_diag_j = hypre_CSRMatrixJ(A_diag); hypre_CSRMatrix *A_offd = hypre_ParCSRMatrixOffd(A); HYPRE_Int *A_offd_i = hypre_CSRMatrixI(A_offd); HYPRE_Real *A_offd_data = hypre_CSRMatrixData(A_offd); HYPRE_Int *A_offd_j = hypre_CSRMatrixJ(A_offd); hypre_ParCSRCommPkg *comm_pkg = hypre_ParCSRMatrixCommPkg(A); HYPRE_Int num_rows = hypre_CSRMatrixNumRows(A_diag); HYPRE_Int num_cols_offd = hypre_CSRMatrixNumCols(A_offd); hypre_Vector *u_local = hypre_ParVectorLocalVector(u); HYPRE_Complex *u_data = hypre_VectorData(u_local); hypre_Vector *f_local = hypre_ParVectorLocalVector(f); HYPRE_Complex *f_data = hypre_VectorData(f_local); hypre_Vector *Vtemp_local = hypre_ParVectorLocalVector(Vtemp); HYPRE_Complex *Vtemp_data = hypre_VectorData(Vtemp_local); HYPRE_Complex *v_ext_data = NULL; HYPRE_Complex *v_buf_data = NULL; HYPRE_Complex zero = 0.0; HYPRE_Real one_minus_weight = 1.0 - relax_weight; HYPRE_Complex res; HYPRE_Int num_procs, my_id, i, j, ii, jj, index, num_sends, start; hypre_ParCSRCommHandle *comm_handle = NULL; /* Sanity check */ if (hypre_ParVectorNumVectors(f) > 1) { hypre_error_w_msg(HYPRE_ERROR_GENERIC, "Jacobi relaxation doesn't support multicomponent vectors"); return hypre_error_flag; } hypre_MPI_Comm_size(comm, &num_procs); hypre_MPI_Comm_rank(comm, &my_id); if (num_procs > 1) { num_sends = hypre_ParCSRCommPkgNumSends(comm_pkg); v_buf_data = hypre_CTAlloc(HYPRE_Real, hypre_ParCSRCommPkgSendMapStart(comm_pkg, num_sends), HYPRE_MEMORY_HOST); v_ext_data = hypre_CTAlloc(HYPRE_Real, num_cols_offd, HYPRE_MEMORY_HOST); index = 0; for (i = 0; i < num_sends; i++) { start = hypre_ParCSRCommPkgSendMapStart(comm_pkg, i); for (j = start; j < hypre_ParCSRCommPkgSendMapStart(comm_pkg, i + 1); j++) { v_buf_data[index++] = u_data[hypre_ParCSRCommPkgSendMapElmt(comm_pkg, j)]; } } comm_handle = hypre_ParCSRCommHandleCreate(1, comm_pkg, v_buf_data, v_ext_data); } /*----------------------------------------------------------------- * Copy current approximation into temporary vector. *-----------------------------------------------------------------*/ #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i) HYPRE_SMP_SCHEDULE #endif for (i = 0; i < num_rows; i++) { Vtemp_data[i] = u_data[i]; } if (num_procs > 1) { hypre_ParCSRCommHandleDestroy(comm_handle); comm_handle = NULL; } /*----------------------------------------------------------------- * Relax all points. *-----------------------------------------------------------------*/ #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i,ii,jj,res) HYPRE_SMP_SCHEDULE #endif for (i = 0; i < num_rows; i++) { const HYPRE_Complex di = l1_norms ? l1_norms[i] : A_diag_data[A_diag_i[i]]; /*----------------------------------------------------------- * If i is of the right type ( C or F or All ) and diagonal is * nonzero, relax point i; otherwise, skip it. * Relax only C or F points as determined by relax_points. *-----------------------------------------------------------*/ if ( (relax_points == 0 || cf_marker[i] == relax_points) && di != zero ) { res = f_data[i]; for (jj = A_diag_i[i] + Skip_diag; jj < A_diag_i[i + 1]; jj++) { ii = A_diag_j[jj]; res -= A_diag_data[jj] * Vtemp_data[ii]; } for (jj = A_offd_i[i]; jj < A_offd_i[i + 1]; jj++) { ii = A_offd_j[jj]; res -= A_offd_data[jj] * v_ext_data[ii]; } if (Skip_diag) { u_data[i] *= one_minus_weight; u_data[i] += relax_weight * res / di; } else { u_data[i] += relax_weight * res / di; } } } if (num_procs > 1) { hypre_TFree(v_ext_data, HYPRE_MEMORY_HOST); hypre_TFree(v_buf_data, HYPRE_MEMORY_HOST); } return hypre_error_flag; } /*-------------------------------------------------------------------- * hypre_BoomerAMGRelax0WeightedJacobi *--------------------------------------------------------------------*/ HYPRE_Int hypre_BoomerAMGRelax0WeightedJacobi( hypre_ParCSRMatrix *A, hypre_ParVector *f, HYPRE_Int *cf_marker, HYPRE_Int relax_points, HYPRE_Real relax_weight, hypre_ParVector *u, hypre_ParVector *Vtemp ) { return hypre_BoomerAMGRelaxWeightedJacobi_core(A, f, cf_marker, relax_points, relax_weight, NULL, u, Vtemp, 1); } /*-------------------------------------------------------------------- * hypre_BoomerAMGRelax18WeightedL1Jacobi *--------------------------------------------------------------------*/ HYPRE_Int hypre_BoomerAMGRelax18WeightedL1Jacobi( hypre_ParCSRMatrix *A, hypre_ParVector *f, HYPRE_Int *cf_marker, HYPRE_Int relax_points, HYPRE_Real relax_weight, HYPRE_Real *l1_norms, hypre_ParVector *u, hypre_ParVector *Vtemp ) { #if defined(HYPRE_USING_GPU) HYPRE_ExecutionPolicy exec = hypre_GetExecPolicy2( hypre_ParCSRMatrixMemoryLocation(A), hypre_ParVectorMemoryLocation(f) ); if (exec == HYPRE_EXEC_DEVICE) { // XXX GPU calls Relax7 XXX return hypre_BoomerAMGRelax7Jacobi(A, f, cf_marker, relax_points, relax_weight, l1_norms, u, Vtemp); } else #endif { /* in the case of non-CF, use relax-7 which is faster */ if (relax_points == 0) { return hypre_BoomerAMGRelax7Jacobi(A, f, cf_marker, relax_points, relax_weight, l1_norms, u, Vtemp); } else { return hypre_BoomerAMGRelaxWeightedJacobi_core(A, f, cf_marker, relax_points, relax_weight, l1_norms, u, Vtemp, 0); } } } /*-------------------------------------------------------------------- * hypre_BoomerAMGRelax1GaussSeidel *--------------------------------------------------------------------*/ HYPRE_Int hypre_BoomerAMGRelax1GaussSeidel( hypre_ParCSRMatrix *A, hypre_ParVector *f, HYPRE_Int *cf_marker, HYPRE_Int relax_points, hypre_ParVector *u ) { MPI_Comm comm = hypre_ParCSRMatrixComm(A); hypre_CSRMatrix *A_diag = hypre_ParCSRMatrixDiag(A); HYPRE_Real *A_diag_data = hypre_CSRMatrixData(A_diag); HYPRE_Int *A_diag_i = hypre_CSRMatrixI(A_diag); HYPRE_Int *A_diag_j = hypre_CSRMatrixJ(A_diag); hypre_CSRMatrix *A_offd = hypre_ParCSRMatrixOffd(A); HYPRE_Int *A_offd_i = hypre_CSRMatrixI(A_offd); HYPRE_Real *A_offd_data = hypre_CSRMatrixData(A_offd); HYPRE_Int *A_offd_j = hypre_CSRMatrixJ(A_offd); hypre_ParCSRCommPkg *comm_pkg = hypre_ParCSRMatrixCommPkg(A); HYPRE_Int num_rows = hypre_CSRMatrixNumRows(A_diag); HYPRE_Int num_cols_offd = hypre_CSRMatrixNumCols(A_offd); hypre_Vector *u_local = hypre_ParVectorLocalVector(u); HYPRE_Complex *u_data = hypre_VectorData(u_local); hypre_Vector *f_local = hypre_ParVectorLocalVector(f); HYPRE_Complex *f_data = hypre_VectorData(f_local); HYPRE_Complex *v_ext_data = NULL; HYPRE_Complex *v_buf_data = NULL; HYPRE_Complex zero = 0.0; HYPRE_Complex res; hypre_MPI_Status *status = NULL; hypre_MPI_Request *requests = NULL; HYPRE_Int num_procs, my_id, i, j, ii, jj, p, jr, ip; HYPRE_Int vec_start, vec_len; HYPRE_Int num_sends = 0; HYPRE_Int num_recvs = 0; /* Sanity check */ if (hypre_ParVectorNumVectors(f) > 1) { hypre_error_w_msg(HYPRE_ERROR_GENERIC, "GS (1) relaxation doesn't support multicomponent vectors"); return hypre_error_flag; } hypre_MPI_Comm_size(comm, &num_procs); hypre_MPI_Comm_rank(comm, &my_id); if (num_procs > 1) { num_sends = hypre_ParCSRCommPkgNumSends(comm_pkg); num_recvs = hypre_ParCSRCommPkgNumRecvs(comm_pkg); v_buf_data = hypre_CTAlloc(HYPRE_Complex, hypre_ParCSRCommPkgSendMapStart(comm_pkg, num_sends), HYPRE_MEMORY_HOST); v_ext_data = hypre_CTAlloc(HYPRE_Complex, num_cols_offd, HYPRE_MEMORY_HOST); status = hypre_CTAlloc(hypre_MPI_Status, num_recvs + num_sends, HYPRE_MEMORY_HOST); requests = hypre_CTAlloc(hypre_MPI_Request, num_recvs + num_sends, HYPRE_MEMORY_HOST); } /*----------------------------------------------------------------- * Relax all points. *-----------------------------------------------------------------*/ for (p = 0; p < num_procs; p++) { jr = 0; if (p != my_id) { for (i = 0; i < num_sends; i++) { ip = hypre_ParCSRCommPkgSendProc(comm_pkg, i); if (ip == p) { vec_start = hypre_ParCSRCommPkgSendMapStart(comm_pkg, i); vec_len = hypre_ParCSRCommPkgSendMapStart(comm_pkg, i + 1) - vec_start; for (j = vec_start; j < vec_start + vec_len; j++) { v_buf_data[j] = u_data[hypre_ParCSRCommPkgSendMapElmt(comm_pkg, j)]; } hypre_MPI_Isend(&v_buf_data[vec_start], vec_len, HYPRE_MPI_COMPLEX, ip, 0, comm, &requests[jr++]); } } hypre_MPI_Waitall(jr, requests, status); hypre_MPI_Barrier(comm); } else { if (num_procs > 1) { for (i = 0; i < num_recvs; i++) { ip = hypre_ParCSRCommPkgRecvProc(comm_pkg, i); vec_start = hypre_ParCSRCommPkgRecvVecStart(comm_pkg, i); vec_len = hypre_ParCSRCommPkgRecvVecStart(comm_pkg, i + 1) - vec_start; hypre_MPI_Irecv(&v_ext_data[vec_start], vec_len, HYPRE_MPI_COMPLEX, ip, 0, comm, &requests[jr++]); } hypre_MPI_Waitall(jr, requests, status); } for (i = 0; i < num_rows; i++) { /*----------------------------------------------------------- * If i is of the right type ( C or F ) and diagonal is * nonzero, relax point i; otherwise, skip it. * Relax only C or F points as determined by relax_points. *-----------------------------------------------------------*/ if ( (relax_points == 0 || cf_marker[i] == relax_points) && A_diag_data[A_diag_i[i]] != zero ) { res = f_data[i]; for (jj = A_diag_i[i] + 1; jj < A_diag_i[i + 1]; jj++) { ii = A_diag_j[jj]; res -= A_diag_data[jj] * u_data[ii]; } for (jj = A_offd_i[i]; jj < A_offd_i[i + 1]; jj++) { ii = A_offd_j[jj]; res -= A_offd_data[jj] * v_ext_data[ii]; } u_data[i] = res / A_diag_data[A_diag_i[i]]; } } if (num_procs > 1) { hypre_MPI_Barrier(comm); } } } if (num_procs > 1) { hypre_TFree(v_ext_data, HYPRE_MEMORY_HOST); hypre_TFree(v_buf_data, HYPRE_MEMORY_HOST); hypre_TFree(status, HYPRE_MEMORY_HOST); hypre_TFree(requests, HYPRE_MEMORY_HOST); } return hypre_error_flag; } /*-------------------------------------------------------------------- * hypre_BoomerAMGRelax2GaussSeidel *--------------------------------------------------------------------*/ HYPRE_Int hypre_BoomerAMGRelax2GaussSeidel( hypre_ParCSRMatrix *A, hypre_ParVector *f, HYPRE_Int *cf_marker, HYPRE_Int relax_points, hypre_ParVector *u ) { MPI_Comm comm = hypre_ParCSRMatrixComm(A); hypre_CSRMatrix *A_diag = hypre_ParCSRMatrixDiag(A); HYPRE_Real *A_diag_data = hypre_CSRMatrixData(A_diag); HYPRE_Int *A_diag_i = hypre_CSRMatrixI(A_diag); HYPRE_Int *A_diag_j = hypre_CSRMatrixJ(A_diag); hypre_CSRMatrix *A_offd = hypre_ParCSRMatrixOffd(A); HYPRE_Int *A_offd_i = hypre_CSRMatrixI(A_offd); HYPRE_Real *A_offd_data = hypre_CSRMatrixData(A_offd); HYPRE_Int *A_offd_j = hypre_CSRMatrixJ(A_offd); hypre_ParCSRCommPkg *comm_pkg = hypre_ParCSRMatrixCommPkg(A); HYPRE_Int num_rows = hypre_CSRMatrixNumRows(A_diag); HYPRE_Int num_cols_offd = hypre_CSRMatrixNumCols(A_offd); hypre_Vector *u_local = hypre_ParVectorLocalVector(u); HYPRE_Complex *u_data = hypre_VectorData(u_local); hypre_Vector *f_local = hypre_ParVectorLocalVector(f); HYPRE_Complex *f_data = hypre_VectorData(f_local); HYPRE_Complex *v_ext_data = NULL; HYPRE_Complex *v_buf_data = NULL; HYPRE_Complex zero = 0.0; HYPRE_Complex res; HYPRE_Int num_procs, my_id, i, j, ii, jj, p, jr, ip; HYPRE_Int num_sends = 0; HYPRE_Int num_recvs = 0; HYPRE_Int vec_start, vec_len; hypre_MPI_Status *status = NULL; hypre_MPI_Request *requests = NULL; /* Sanity check */ if (hypre_ParVectorNumVectors(f) > 1) { hypre_error_w_msg(HYPRE_ERROR_GENERIC, "GS (2) relaxation doesn't support multicomponent vectors"); return hypre_error_flag; } hypre_MPI_Comm_size(comm, &num_procs); hypre_MPI_Comm_rank(comm, &my_id); if (num_procs > 1) { num_sends = hypre_ParCSRCommPkgNumSends(comm_pkg); num_recvs = hypre_ParCSRCommPkgNumRecvs(comm_pkg); v_buf_data = hypre_CTAlloc(HYPRE_Complex, hypre_ParCSRCommPkgSendMapStart(comm_pkg, num_sends), HYPRE_MEMORY_HOST); v_ext_data = hypre_CTAlloc(HYPRE_Complex, num_cols_offd, HYPRE_MEMORY_HOST); status = hypre_CTAlloc(hypre_MPI_Status, num_recvs + num_sends, HYPRE_MEMORY_HOST); requests = hypre_CTAlloc(hypre_MPI_Request, num_recvs + num_sends, HYPRE_MEMORY_HOST); } /*----------------------------------------------------------------- * Relax interior points first *-----------------------------------------------------------------*/ for (i = 0; i < num_rows; i++) { /*----------------------------------------------------------- * If i is of the right type ( C or F or All ) and diagonal is * nonzero, relax point i; otherwise, skip it. *-----------------------------------------------------------*/ if ( (relax_points == 0 || cf_marker[i] == relax_points) && (A_offd_i[i + 1] - A_offd_i[i] == zero) && (A_diag_data[A_diag_i[i]] != zero) ) { res = f_data[i]; for (jj = A_diag_i[i] + 1; jj < A_diag_i[i + 1]; jj++) { ii = A_diag_j[jj]; res -= A_diag_data[jj] * u_data[ii]; } u_data[i] = res / A_diag_data[A_diag_i[i]]; } } for (p = 0; p < num_procs; p++) { jr = 0; if (p != my_id) { for (i = 0; i < num_sends; i++) { ip = hypre_ParCSRCommPkgSendProc(comm_pkg, i); if (ip == p) { vec_start = hypre_ParCSRCommPkgSendMapStart(comm_pkg, i); vec_len = hypre_ParCSRCommPkgSendMapStart(comm_pkg, i + 1) - vec_start; for (j = vec_start; j < vec_start + vec_len; j++) { v_buf_data[j] = u_data[hypre_ParCSRCommPkgSendMapElmt(comm_pkg, j)]; } hypre_MPI_Isend(&v_buf_data[vec_start], vec_len, HYPRE_MPI_COMPLEX, ip, 0, comm, &requests[jr++]); } } hypre_MPI_Waitall(jr, requests, status); hypre_MPI_Barrier(comm); } else { if (num_procs > 1) { for (i = 0; i < num_recvs; i++) { ip = hypre_ParCSRCommPkgRecvProc(comm_pkg, i); vec_start = hypre_ParCSRCommPkgRecvVecStart(comm_pkg, i); vec_len = hypre_ParCSRCommPkgRecvVecStart(comm_pkg, i + 1) - vec_start; hypre_MPI_Irecv(&v_ext_data[vec_start], vec_len, HYPRE_MPI_COMPLEX, ip, 0, comm, &requests[jr++]); } hypre_MPI_Waitall(jr, requests, status); } for (i = 0; i < num_rows; i++) { /*----------------------------------------------------------- * If i is of the right type ( C or F or All) and diagonal is * nonzero, relax point i; otherwise, skip it. * Relax only C or F points as determined by relax_points. *-----------------------------------------------------------*/ if ( (relax_points == 0 || cf_marker[i] == relax_points) && (A_offd_i[i + 1] - A_offd_i[i] != zero) && (A_diag_data[A_diag_i[i]] != zero) ) { res = f_data[i]; for (jj = A_diag_i[i] + 1; jj < A_diag_i[i + 1]; jj++) { ii = A_diag_j[jj]; res -= A_diag_data[jj] * u_data[ii]; } for (jj = A_offd_i[i]; jj < A_offd_i[i + 1]; jj++) { ii = A_offd_j[jj]; res -= A_offd_data[jj] * v_ext_data[ii]; } u_data[i] = res / A_diag_data[A_diag_i[i]]; } } if (num_procs > 1) { hypre_MPI_Barrier(comm); } } } if (num_procs > 1) { hypre_TFree(v_ext_data, HYPRE_MEMORY_HOST); hypre_TFree(v_buf_data, HYPRE_MEMORY_HOST); hypre_TFree(status, HYPRE_MEMORY_HOST); hypre_TFree(requests, HYPRE_MEMORY_HOST); } return hypre_error_flag; } /*-------------------------------------------------------------------- * hypre_BoomerAMGRelaxHybridGaussSeidel_core *--------------------------------------------------------------------*/ HYPRE_Int hypre_BoomerAMGRelaxHybridGaussSeidel_core( hypre_ParCSRMatrix *A, hypre_ParVector *f, HYPRE_Int *cf_marker, HYPRE_Int relax_points, HYPRE_Real relax_weight, HYPRE_Real omega, HYPRE_Real *l1_norms, hypre_ParVector *u, hypre_ParVector *Vtemp, hypre_ParVector *Ztemp, HYPRE_Int GS_order, HYPRE_Int Symm, HYPRE_Int Skip_diag, HYPRE_Int forced_seq, HYPRE_Int Topo_order ) { HYPRE_UNUSED_VAR(Ztemp); MPI_Comm comm = hypre_ParCSRMatrixComm(A); hypre_CSRMatrix *A_diag = hypre_ParCSRMatrixDiag(A); HYPRE_Real *A_diag_data = hypre_CSRMatrixData(A_diag); HYPRE_Int *A_diag_i = hypre_CSRMatrixI(A_diag); HYPRE_Int *A_diag_j = hypre_CSRMatrixJ(A_diag); hypre_CSRMatrix *A_offd = hypre_ParCSRMatrixOffd(A); HYPRE_Int *A_offd_i = hypre_CSRMatrixI(A_offd); HYPRE_Real *A_offd_data = hypre_CSRMatrixData(A_offd); HYPRE_Int *A_offd_j = hypre_CSRMatrixJ(A_offd); hypre_ParCSRCommPkg *comm_pkg = hypre_ParCSRMatrixCommPkg(A); HYPRE_Int num_rows = hypre_CSRMatrixNumRows(A_diag); hypre_Vector *u_local = hypre_ParVectorLocalVector(u); HYPRE_Complex *u_data = hypre_VectorData(u_local); hypre_Vector *f_local = hypre_ParVectorLocalVector(f); HYPRE_Complex *f_data = hypre_VectorData(f_local); hypre_Vector *Vtemp_local = Vtemp ? hypre_ParVectorLocalVector(Vtemp) : NULL; HYPRE_Complex *Vtemp_data = Vtemp_local ? hypre_VectorData(Vtemp_local) : NULL; /* hypre_Vector *Ztemp_local = NULL; HYPRE_Complex *Ztemp_data = NULL; */ HYPRE_Complex *v_ext_data = NULL; HYPRE_Complex *v_buf_data = NULL; HYPRE_Int *proc_ordering = NULL; const HYPRE_Real one_minus_omega = 1.0 - omega; HYPRE_Int num_procs, my_id, num_threads, j, num_sends; #if defined(HYPRE_USING_PERSISTENT_COMM) // JSP: persistent comm can be similarly used for other smoothers hypre_ParCSRPersistentCommHandle *persistent_comm_handle; #else hypre_ParCSRCommHandle *comm_handle; HYPRE_Int num_cols_offd = hypre_CSRMatrixNumCols(A_offd); #endif hypre_MPI_Comm_size(comm, &num_procs); hypre_MPI_Comm_rank(comm, &my_id); num_threads = forced_seq ? 1 : hypre_NumThreads(); /* Sanity check */ if (hypre_ParVectorNumVectors(f) > 1) { hypre_error_w_msg(HYPRE_ERROR_GENERIC, "Hybrid GS relaxation doesn't support multicomponent vectors"); return hypre_error_flag; } /* GS order: forward or backward */ const HYPRE_Int gs_order = GS_order > 0 ? 1 : -1; /* for symmetric GS, a forward followed by a backward */ const HYPRE_Int num_sweeps = Symm ? 2 : 1; /* if relax_weight and omega are both 1.0 */ const HYPRE_Int non_scale = relax_weight == 1.0 && omega == 1.0; /* */ const HYPRE_Real prod = 1.0 - relax_weight * omega; /* if (num_threads > 1) { Ztemp_local = hypre_ParVectorLocalVector(Ztemp); Ztemp_data = hypre_VectorData(Ztemp_local); } */ if (num_procs > 1) { #ifdef HYPRE_PROFILE hypre_profile_times[HYPRE_TIMER_ID_PACK_UNPACK] -= hypre_MPI_Wtime(); #endif if (!comm_pkg) { hypre_MatvecCommPkgCreate(A); comm_pkg = hypre_ParCSRMatrixCommPkg(A); } num_sends = hypre_ParCSRCommPkgNumSends(comm_pkg); #if defined(HYPRE_USING_PERSISTENT_COMM) persistent_comm_handle = hypre_ParCSRCommPkgGetPersistentCommHandle(1, comm_pkg); v_buf_data = (HYPRE_Real *) hypre_ParCSRCommHandleSendDataBuffer(persistent_comm_handle); v_ext_data = (HYPRE_Real *) hypre_ParCSRCommHandleRecvDataBuffer(persistent_comm_handle); #else v_buf_data = hypre_CTAlloc(HYPRE_Real, hypre_ParCSRCommPkgSendMapStart(comm_pkg, num_sends), HYPRE_MEMORY_HOST); v_ext_data = hypre_CTAlloc(HYPRE_Real, num_cols_offd, HYPRE_MEMORY_HOST); #endif HYPRE_Int begin = hypre_ParCSRCommPkgSendMapStart(comm_pkg, 0); HYPRE_Int end = hypre_ParCSRCommPkgSendMapStart(comm_pkg, num_sends); #ifdef HYPRE_USING_OPENMP #pragma omp parallel for HYPRE_SMP_SCHEDULE #endif for (j = begin; j < end; j++) { v_buf_data[j - begin] = u_data[hypre_ParCSRCommPkgSendMapElmt(comm_pkg, j)]; } #ifdef HYPRE_PROFILE hypre_profile_times[HYPRE_TIMER_ID_PACK_UNPACK] += hypre_MPI_Wtime(); hypre_profile_times[HYPRE_TIMER_ID_HALO_EXCHANGE] -= hypre_MPI_Wtime(); #endif #if defined(HYPRE_USING_PERSISTENT_COMM) hypre_ParCSRPersistentCommHandleStart(persistent_comm_handle, HYPRE_MEMORY_HOST, v_buf_data); #else comm_handle = hypre_ParCSRCommHandleCreate(1, comm_pkg, v_buf_data, v_ext_data); #endif #if defined(HYPRE_USING_PERSISTENT_COMM) hypre_ParCSRPersistentCommHandleWait(persistent_comm_handle, HYPRE_MEMORY_HOST, v_ext_data); #else hypre_ParCSRCommHandleDestroy(comm_handle); #endif #ifdef HYPRE_PROFILE hypre_profile_times[HYPRE_TIMER_ID_HALO_EXCHANGE] += hypre_MPI_Wtime(); #endif } if (Topo_order) { /* Check for ordering of matrix. If stored, get pointer, otherwise * compute ordering and point matrix variable to array. * Used in AIR */ if (!hypre_ParCSRMatrixProcOrdering(A)) { proc_ordering = hypre_CTAlloc(HYPRE_Int, num_rows, HYPRE_MEMORY_HOST); hypre_topo_sort(A_diag_i, A_diag_j, A_diag_data, proc_ordering, num_rows); hypre_ParCSRMatrixProcOrdering(A) = proc_ordering; } else { proc_ordering = hypre_ParCSRMatrixProcOrdering(A); } } /*----------------------------------------------------------------- * Relax all points. *-----------------------------------------------------------------*/ #ifdef HYPRE_PROFILE hypre_profile_times[HYPRE_TIMER_ID_RELAX] -= hypre_MPI_Wtime(); #endif if ( (num_threads > 1 || !non_scale) && Vtemp_data ) { #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(j) HYPRE_SMP_SCHEDULE #endif for (j = 0; j < num_rows; j++) { Vtemp_data[j] = u_data[j]; } } if (num_threads > 1) { #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(j) HYPRE_SMP_SCHEDULE #endif for (j = 0; j < num_threads; j++) { HYPRE_Int ns, ne, sweep; hypre_partition1D(num_rows, num_threads, j, &ns, &ne); for (sweep = 0; sweep < num_sweeps; sweep++) { const HYPRE_Int iorder = num_sweeps == 1 ? gs_order : sweep == 0 ? 1 : -1; const HYPRE_Int ibegin = iorder > 0 ? ns : ne - 1; const HYPRE_Int iend = iorder > 0 ? ne : ns - 1; if (non_scale) { hypre_HybridGaussSeidelNSThreads(A_diag_i, A_diag_j, A_diag_data, A_offd_i, A_offd_j, A_offd_data, f_data, cf_marker, relax_points, l1_norms, u_data, Vtemp_data, v_ext_data, ns, ne, ibegin, iend, iorder, Skip_diag); } else { hypre_HybridGaussSeidelThreads(A_diag_i, A_diag_j, A_diag_data, A_offd_i, A_offd_j, A_offd_data, f_data, cf_marker, relax_points, relax_weight, omega, one_minus_omega, prod, l1_norms, u_data, Vtemp_data, v_ext_data, ns, ne, ibegin, iend, iorder, Skip_diag); } } /* for (sweep = 0; sweep < num_sweeps; sweep++) */ } /* for (j = 0; j < num_threads; j++) */ } else /* if (num_threads > 1) */ { HYPRE_Int sweep; for (sweep = 0; sweep < num_sweeps; sweep++) { const HYPRE_Int iorder = num_sweeps == 1 ? gs_order : sweep == 0 ? 1 : -1; const HYPRE_Int ibegin = iorder > 0 ? 0 : num_rows - 1; const HYPRE_Int iend = iorder > 0 ? num_rows : -1; if (Topo_order) { hypre_HybridGaussSeidelOrderedNS(A_diag_i, A_diag_j, A_diag_data, A_offd_i, A_offd_j, A_offd_data, f_data, cf_marker, relax_points, u_data, NULL, v_ext_data, ibegin, iend, iorder, proc_ordering); } else { if (non_scale) { hypre_HybridGaussSeidelNS(A_diag_i, A_diag_j, A_diag_data, A_offd_i, A_offd_j, A_offd_data, f_data, cf_marker, relax_points, l1_norms, u_data, Vtemp_data, v_ext_data, ibegin, iend, iorder, Skip_diag); } else { hypre_HybridGaussSeidel(A_diag_i, A_diag_j, A_diag_data, A_offd_i, A_offd_j, A_offd_data, f_data, cf_marker, relax_points, relax_weight, omega, one_minus_omega, prod, l1_norms, u_data, Vtemp_data, v_ext_data, ibegin, iend, iorder, Skip_diag); } } } /* for (sweep = 0; sweep < num_sweeps; sweep++) */ } /* if (num_threads > 1) */ #ifndef HYPRE_USING_PERSISTENT_COMM if (num_procs > 1) { hypre_TFree(v_ext_data, HYPRE_MEMORY_HOST); hypre_TFree(v_buf_data, HYPRE_MEMORY_HOST); } #endif #ifdef HYPRE_PROFILE hypre_profile_times[HYPRE_TIMER_ID_RELAX] += hypre_MPI_Wtime(); #endif return hypre_error_flag; } /*-------------------------------------------------------------------- * hypre_BoomerAMGRelax3HybridGaussSeidel * * forward hybrid GS *--------------------------------------------------------------------*/ HYPRE_Int hypre_BoomerAMGRelax3HybridGaussSeidel( hypre_ParCSRMatrix *A, hypre_ParVector *f, HYPRE_Int *cf_marker, HYPRE_Int relax_points, HYPRE_Real relax_weight, HYPRE_Real omega, hypre_ParVector *u, hypre_ParVector *Vtemp, hypre_ParVector *Ztemp ) { return hypre_BoomerAMGRelaxHybridSOR(A, f, cf_marker, relax_points, relax_weight, omega, NULL, u, Vtemp, Ztemp, 1, 0, 1, 0); } /*-------------------------------------------------------------------- * hypre_BoomerAMGRelax4HybridGaussSeidel * * backward hybrid GS *--------------------------------------------------------------------*/ HYPRE_Int hypre_BoomerAMGRelax4HybridGaussSeidel( hypre_ParCSRMatrix *A, hypre_ParVector *f, HYPRE_Int *cf_marker, HYPRE_Int relax_points, HYPRE_Real relax_weight, HYPRE_Real omega, hypre_ParVector *u, hypre_ParVector *Vtemp, hypre_ParVector *Ztemp ) { return hypre_BoomerAMGRelaxHybridSOR(A, f, cf_marker, relax_points, relax_weight, omega, NULL, u, Vtemp, Ztemp, -1, 0, 1, 0); } /*-------------------------------------------------------------------- * hypre_BoomerAMGRelax5ChaoticHybridGaussSeidel * * chaotic forward GS *--------------------------------------------------------------------*/ HYPRE_Int hypre_BoomerAMGRelax5ChaoticHybridGaussSeidel( hypre_ParCSRMatrix *A, hypre_ParVector *f, HYPRE_Int *cf_marker, HYPRE_Int relax_points, hypre_ParVector *u ) { MPI_Comm comm = hypre_ParCSRMatrixComm(A); hypre_CSRMatrix *A_diag = hypre_ParCSRMatrixDiag(A); HYPRE_Real *A_diag_data = hypre_CSRMatrixData(A_diag); HYPRE_Int *A_diag_i = hypre_CSRMatrixI(A_diag); HYPRE_Int *A_diag_j = hypre_CSRMatrixJ(A_diag); hypre_CSRMatrix *A_offd = hypre_ParCSRMatrixOffd(A); HYPRE_Int *A_offd_i = hypre_CSRMatrixI(A_offd); HYPRE_Real *A_offd_data = hypre_CSRMatrixData(A_offd); HYPRE_Int *A_offd_j = hypre_CSRMatrixJ(A_offd); hypre_ParCSRCommPkg *comm_pkg = hypre_ParCSRMatrixCommPkg(A); HYPRE_Int num_rows = hypre_CSRMatrixNumRows(A_diag); HYPRE_Int num_cols_offd = hypre_CSRMatrixNumCols(A_offd); hypre_Vector *u_local = hypre_ParVectorLocalVector(u); HYPRE_Complex *u_data = hypre_VectorData(u_local); hypre_Vector *f_local = hypre_ParVectorLocalVector(f); HYPRE_Complex *f_data = hypre_VectorData(f_local); HYPRE_Complex *v_ext_data = NULL; HYPRE_Complex *v_buf_data = NULL; HYPRE_Complex zero = 0.0; HYPRE_Complex res; HYPRE_Int num_procs, my_id, i, j, ii, jj, index, num_sends, start; hypre_ParCSRCommHandle *comm_handle; /* Sanity check */ if (hypre_ParVectorNumVectors(f) > 1) { hypre_error_w_msg(HYPRE_ERROR_GENERIC, "Chaotic GS relaxation doesn't support multicomponent vectors"); return hypre_error_flag; } hypre_MPI_Comm_size(comm, &num_procs); hypre_MPI_Comm_rank(comm, &my_id); if (num_procs > 1) { num_sends = hypre_ParCSRCommPkgNumSends(comm_pkg); v_buf_data = hypre_CTAlloc(HYPRE_Real, hypre_ParCSRCommPkgSendMapStart(comm_pkg, num_sends), HYPRE_MEMORY_HOST); v_ext_data = hypre_CTAlloc(HYPRE_Real, num_cols_offd, HYPRE_MEMORY_HOST); index = 0; for (i = 0; i < num_sends; i++) { start = hypre_ParCSRCommPkgSendMapStart(comm_pkg, i); for (j = start; j < hypre_ParCSRCommPkgSendMapStart(comm_pkg, i + 1); j++) { v_buf_data[index++] = u_data[hypre_ParCSRCommPkgSendMapElmt(comm_pkg, j)]; } } comm_handle = hypre_ParCSRCommHandleCreate(1, comm_pkg, v_buf_data, v_ext_data); /*----------------------------------------------------------------- * Copy current approximation into temporary vector. *-----------------------------------------------------------------*/ hypre_ParCSRCommHandleDestroy(comm_handle); comm_handle = NULL; } #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i,ii,jj,res) HYPRE_SMP_SCHEDULE #endif for (i = 0; i < num_rows; i++) { /*----------------------------------------------------------- * If i is of the right type ( C or F or All) and diagonal is * nonzero, relax point i; otherwise, skip it. * Relax only C or F points as determined by relax_points. *-----------------------------------------------------------*/ if ( (relax_points == 0 || cf_marker[i] == relax_points) && A_diag_data[A_diag_i[i]] != zero ) { res = f_data[i]; for (jj = A_diag_i[i] + 1; jj < A_diag_i[i + 1]; jj++) { ii = A_diag_j[jj]; res -= A_diag_data[jj] * u_data[ii]; } for (jj = A_offd_i[i]; jj < A_offd_i[i + 1]; jj++) { ii = A_offd_j[jj]; res -= A_offd_data[jj] * v_ext_data[ii]; } u_data[i] = res / A_diag_data[A_diag_i[i]]; } } if (num_procs > 1) { hypre_TFree(v_ext_data, HYPRE_MEMORY_HOST); hypre_TFree(v_buf_data, HYPRE_MEMORY_HOST); } return hypre_error_flag; } /*-------------------------------------------------------------------- * hypre_BoomerAMGRelaxHybridSOR * * symmetric hybrid SOR *--------------------------------------------------------------------*/ HYPRE_Int hypre_BoomerAMGRelaxHybridSOR( hypre_ParCSRMatrix *A, hypre_ParVector *f, HYPRE_Int *cf_marker, HYPRE_Int relax_points, HYPRE_Real relax_weight, HYPRE_Real omega, HYPRE_Real *l1_norms, hypre_ParVector *u, hypre_ParVector *Vtemp, hypre_ParVector *Ztemp, HYPRE_Int direction, HYPRE_Int symm, HYPRE_Int skip_diag, HYPRE_Int force_seq ) { #if defined(HYPRE_USING_GPU) HYPRE_ExecutionPolicy exec = hypre_GetExecPolicy2( hypre_ParCSRMatrixMemoryLocation(A), hypre_ParVectorMemoryLocation(f) ); // TODO implement CF relax on GPUs if (relax_points != 0) { exec = HYPRE_EXEC_HOST; } if (hypre_HandleDeviceGSMethod(hypre_handle()) == 0) { exec = HYPRE_EXEC_HOST; } if (exec == HYPRE_EXEC_DEVICE) { return hypre_BoomerAMGRelaxHybridGaussSeidelDevice(A, f, cf_marker, relax_points, relax_weight, omega, l1_norms, u, Vtemp, Ztemp, direction, symm); } else #endif { return hypre_BoomerAMGRelaxHybridGaussSeidel_core(A, f, cf_marker, relax_points, relax_weight, omega, l1_norms, u, Vtemp, Ztemp, direction, symm, skip_diag, force_seq, 0); } } /*-------------------------------------------------------------------- * hypre_BoomerAMGRelax6HybridSSOR *--------------------------------------------------------------------*/ HYPRE_Int hypre_BoomerAMGRelax6HybridSSOR( hypre_ParCSRMatrix *A, hypre_ParVector *f, HYPRE_Int *cf_marker, HYPRE_Int relax_points, HYPRE_Real relax_weight, HYPRE_Real omega, hypre_ParVector *u, hypre_ParVector *Vtemp, hypre_ParVector *Ztemp ) { return hypre_BoomerAMGRelaxHybridSOR(A, f, cf_marker, relax_points, relax_weight, omega, NULL, u, Vtemp, Ztemp, 1, 1, 1, 0); } /*-------------------------------------------------------------------- * hypre_BoomerAMGRelax7Jacobi *--------------------------------------------------------------------*/ HYPRE_Int hypre_BoomerAMGRelax7Jacobi( hypre_ParCSRMatrix *A, hypre_ParVector *f, HYPRE_Int *cf_marker, HYPRE_Int relax_points, HYPRE_Real relax_weight, HYPRE_Real *l1_norms, hypre_ParVector *u, hypre_ParVector *Vtemp ) { HYPRE_Int num_rows = hypre_ParCSRMatrixNumRows(A); hypre_Vector l1_norms_vec; hypre_ParVector l1_norms_parvec; hypre_GpuProfilingPushRange("Relax7Jacobi"); hypre_VectorNumVectors(&l1_norms_vec) = 1; hypre_VectorMultiVecStorageMethod(&l1_norms_vec) = 0; hypre_VectorOwnsData(&l1_norms_vec) = 0; hypre_VectorData(&l1_norms_vec) = l1_norms; hypre_VectorSize(&l1_norms_vec) = num_rows; /* TODO XXX * The next line is NOT 100% correct, which should be the memory location of l1_norms instead of f * But how do I know it? As said, don't use raw pointers, don't use raw pointers! * It is fine normally since A, f, and l1_norms should live in the same memory space */ hypre_VectorMemoryLocation(&l1_norms_vec) = hypre_ParVectorMemoryLocation(f); hypre_ParVectorLocalVector(&l1_norms_parvec) = &l1_norms_vec; #if defined(HYPRE_USING_GPU) HYPRE_Int sync_stream; hypre_GetSyncCudaCompute(&sync_stream); hypre_SetSyncCudaCompute(0); #endif /*----------------------------------------------------------------- * Copy f into temporary vector. *-----------------------------------------------------------------*/ hypre_ParVectorCopy(f, Vtemp); /*----------------------------------------------------------------- * Perform Matvec Vtemp = w * (f - Au) *-----------------------------------------------------------------*/ if (hypre_ParVectorAllZeros(u)) { #if defined(HYPRE_DEBUG) hypre_assert(hypre_ParVectorInnerProd(u, u) == 0.0); /*hypre_ParPrintf(hypre_ParCSRMatrixComm(A), "A %d: skip a matvec\n", hypre_ParCSRMatrixGlobalNumRows(A));*/ #endif hypre_ParVectorScale(relax_weight, Vtemp); } else { hypre_ParCSRMatrixMatvec(-relax_weight, A, u, relax_weight, Vtemp); } /*----------------------------------------------------------------- * u += D^{-1} * Vtemp, where D_ii = ||A(i,:)||_1 *-----------------------------------------------------------------*/ if (relax_points) { hypre_ParVectorElmdivpyMarked(Vtemp, &l1_norms_parvec, u, cf_marker, relax_points); } else { hypre_ParVectorElmdivpy(Vtemp, &l1_norms_parvec, u); } #if defined(HYPRE_USING_GPU) hypre_SetSyncCudaCompute(sync_stream); hypre_SyncComputeStream(); #endif hypre_GpuProfilingPopRange(); return hypre_error_flag; } /*-------------------------------------------------------------------- * hypre_BoomerAMGRelax14HybridL1GaussSeidel * * l1 hybrid symmetric GS *--------------------------------------------------------------------*/ HYPRE_Int hypre_BoomerAMGRelax8HybridL1SSOR( hypre_ParCSRMatrix *A, hypre_ParVector *f, HYPRE_Int *cf_marker, HYPRE_Int relax_points, HYPRE_Real relax_weight, HYPRE_Real omega, HYPRE_Real *l1_norms, hypre_ParVector *u, hypre_ParVector *Vtemp, hypre_ParVector *Ztemp ) { const HYPRE_Int skip_diag = relax_weight == 1.0 && omega == 1.0 ? 0 : 1; return hypre_BoomerAMGRelaxHybridSOR(A, f, cf_marker, relax_points, relax_weight, omega, l1_norms, u, Vtemp, Ztemp, 1, 1, skip_diag, 0); } /*-------------------------------------------------------------------- * hypre_BoomerAMGRelax14HybridL1GaussSeidel * * l1 symmetric hybrid GS *--------------------------------------------------------------------*/ HYPRE_Int hypre_BoomerAMGRelax89HybridL1SSOR( hypre_ParCSRMatrix *A, hypre_ParVector *f, HYPRE_Int *cf_marker, HYPRE_Int relax_points, HYPRE_Real relax_weight, HYPRE_Real omega, HYPRE_Real *l1_norms, hypre_ParVector *u, hypre_ParVector *Vtemp, hypre_ParVector *Ztemp ) { hypre_BoomerAMGRelax13HybridL1GaussSeidel(A, f, cf_marker, relax_points, relax_weight, omega, l1_norms, u, Vtemp, Ztemp); hypre_BoomerAMGRelax14HybridL1GaussSeidel(A, f, cf_marker, relax_points, relax_weight, omega, l1_norms, u, Vtemp, Ztemp); return hypre_error_flag; } /*-------------------------------------------------------------------- * hypre_BoomerAMGRelax14HybridL1GaussSeidel * * Forward hybrid topology ordered GS *--------------------------------------------------------------------*/ HYPRE_Int hypre_BoomerAMGRelax10TopoOrderedGaussSeidel( hypre_ParCSRMatrix *A, hypre_ParVector *f, HYPRE_Int *cf_marker, HYPRE_Int relax_points, HYPRE_Real relax_weight, HYPRE_Real omega, hypre_ParVector *u, hypre_ParVector *Vtemp, hypre_ParVector *Ztemp ) { return hypre_BoomerAMGRelaxHybridGaussSeidel_core(A, f, cf_marker, relax_points, relax_weight, omega, NULL, u, Vtemp, Ztemp, 1 /* forward */, 0 /* nonsymm */, 1 /* skip_diag */, 1, 1); } /*-------------------------------------------------------------------- * hypre_BoomerAMGRelax14HybridL1GaussSeidel * * Forward l1 hybrid GS *--------------------------------------------------------------------*/ HYPRE_Int hypre_BoomerAMGRelax13HybridL1GaussSeidel( hypre_ParCSRMatrix *A, hypre_ParVector *f, HYPRE_Int *cf_marker, HYPRE_Int relax_points, HYPRE_Real relax_weight, HYPRE_Real omega, HYPRE_Real *l1_norms, hypre_ParVector *u, hypre_ParVector *Vtemp, hypre_ParVector *Ztemp ) { const HYPRE_Int skip_diag = relax_weight == 1.0 && omega == 1.0 ? 0 : 1; return hypre_BoomerAMGRelaxHybridSOR(A, f, cf_marker, relax_points, relax_weight, omega, l1_norms, u, Vtemp, Ztemp, 1, 0, skip_diag, 0); } /*-------------------------------------------------------------------- * hypre_BoomerAMGRelax14HybridL1GaussSeidel * * Backward l1 hybrid GS *--------------------------------------------------------------------*/ HYPRE_Int hypre_BoomerAMGRelax14HybridL1GaussSeidel( hypre_ParCSRMatrix *A, hypre_ParVector *f, HYPRE_Int *cf_marker, HYPRE_Int relax_points, HYPRE_Real relax_weight, HYPRE_Real omega, HYPRE_Real *l1_norms, hypre_ParVector *u, hypre_ParVector *Vtemp, hypre_ParVector *Ztemp ) { const HYPRE_Int skip_diag = relax_weight == 1.0 && omega == 1.0 ? 0 : 1; return hypre_BoomerAMGRelaxHybridSOR(A, f, cf_marker, relax_points, relax_weight, omega, l1_norms, u, Vtemp, Ztemp, -1, 0, skip_diag, 0); } /*-------------------------------------------------------------------- * hypre_BoomerAMGRelaxKaczmarz *--------------------------------------------------------------------*/ HYPRE_Int hypre_BoomerAMGRelaxKaczmarz( hypre_ParCSRMatrix *A, hypre_ParVector *f, HYPRE_Real omega, HYPRE_Real *l1_norms, hypre_ParVector *u ) { MPI_Comm comm = hypre_ParCSRMatrixComm(A); hypre_CSRMatrix *A_diag = hypre_ParCSRMatrixDiag(A); HYPRE_Real *A_diag_data = hypre_CSRMatrixData(A_diag); HYPRE_Int *A_diag_i = hypre_CSRMatrixI(A_diag); HYPRE_Int *A_diag_j = hypre_CSRMatrixJ(A_diag); hypre_CSRMatrix *A_offd = hypre_ParCSRMatrixOffd(A); HYPRE_Int *A_offd_i = hypre_CSRMatrixI(A_offd); HYPRE_Real *A_offd_data = hypre_CSRMatrixData(A_offd); HYPRE_Int *A_offd_j = hypre_CSRMatrixJ(A_offd); hypre_ParCSRCommPkg *comm_pkg = hypre_ParCSRMatrixCommPkg(A); HYPRE_Int num_rows = hypre_CSRMatrixNumRows(A_diag); HYPRE_Int num_cols_offd = hypre_CSRMatrixNumCols(A_offd); hypre_Vector *u_local = hypre_ParVectorLocalVector(u); HYPRE_Complex *u_data = hypre_VectorData(u_local); hypre_Vector *f_local = hypre_ParVectorLocalVector(f); HYPRE_Complex *f_data = hypre_VectorData(f_local); HYPRE_Complex *u_offd_data = NULL; HYPRE_Complex *u_buf_data = NULL; HYPRE_Complex res; HYPRE_Int num_procs, my_id, i, j, index, num_sends, start; hypre_ParCSRCommHandle *comm_handle; /* Sanity check */ if (hypre_ParVectorNumVectors(f) > 1) { hypre_error_w_msg(HYPRE_ERROR_GENERIC, "Kaczmarz relaxation doesn't support multicomponent vectors"); return hypre_error_flag; } hypre_MPI_Comm_size(comm, &num_procs); hypre_MPI_Comm_rank(comm, &my_id); if (num_procs > 1) { if (!comm_pkg) { hypre_MatvecCommPkgCreate(A); comm_pkg = hypre_ParCSRMatrixCommPkg(A); } num_sends = hypre_ParCSRCommPkgNumSends(comm_pkg); u_buf_data = hypre_TAlloc(HYPRE_Real, hypre_ParCSRCommPkgSendMapStart(comm_pkg, num_sends), HYPRE_MEMORY_HOST); u_offd_data = hypre_TAlloc(HYPRE_Real, num_cols_offd, HYPRE_MEMORY_HOST); index = 0; for (i = 0; i < num_sends; i++) { start = hypre_ParCSRCommPkgSendMapStart(comm_pkg, i); for (j = start; j < hypre_ParCSRCommPkgSendMapStart(comm_pkg, i + 1); j++) { u_buf_data[index++] = u_data[hypre_ParCSRCommPkgSendMapElmt(comm_pkg, j)]; } } comm_handle = hypre_ParCSRCommHandleCreate(1, comm_pkg, u_buf_data, u_offd_data); hypre_ParCSRCommHandleDestroy(comm_handle); hypre_TFree(u_buf_data, HYPRE_MEMORY_HOST); } /* Forward local pass */ for (i = 0; i < num_rows; i++) { res = f_data[i]; for (j = A_diag_i[i]; j < A_diag_i[i + 1]; j++) { res -= A_diag_data[j] * u_data[A_diag_j[j]]; } for (j = A_offd_i[i]; j < A_offd_i[i + 1]; j++) { res -= A_offd_data[j] * u_offd_data[A_offd_j[j]]; } res /= l1_norms[i]; for (j = A_diag_i[i]; j < A_diag_i[i + 1]; j++) { u_data[A_diag_j[j]] += omega * res * A_diag_data[j]; } } /* Backward local pass */ for (i = num_rows - 1; i > -1; i--) { res = f_data[i]; for (j = A_diag_i[i]; j < A_diag_i[i + 1]; j++) { res -= A_diag_data[j] * u_data[A_diag_j[j]]; } for (j = A_offd_i[i]; j < A_offd_i[i + 1]; j++) { res -= A_offd_data[j] * u_offd_data[A_offd_j[j]]; } res /= l1_norms[i]; for (j = A_diag_i[i]; j < A_diag_i[i + 1]; j++) { u_data[A_diag_j[j]] += omega * res * A_diag_data[j]; } } hypre_TFree(u_offd_data, HYPRE_MEMORY_HOST); return hypre_error_flag; } /*-------------------------------------------------------------------- * hypre_BoomerAMGRelaxTwoStageGaussSeidelHost *--------------------------------------------------------------------*/ HYPRE_Int hypre_BoomerAMGRelaxTwoStageGaussSeidelHost( hypre_ParCSRMatrix *A, hypre_ParVector *f, HYPRE_Real relax_weight, HYPRE_Real omega, hypre_ParVector *u, hypre_ParVector *Vtemp, HYPRE_Int num_inner_iters ) { HYPRE_UNUSED_VAR(omega); hypre_CSRMatrix *A_diag = hypre_ParCSRMatrixDiag(A); HYPRE_Int num_rows = hypre_CSRMatrixNumRows(A_diag); HYPRE_Real *A_diag_data = hypre_CSRMatrixData(A_diag); HYPRE_Int *A_diag_i = hypre_CSRMatrixI(A_diag); HYPRE_Int *A_diag_j = hypre_CSRMatrixJ(A_diag); hypre_Vector *Vtemp_local = hypre_ParVectorLocalVector(Vtemp); HYPRE_Complex *Vtemp_data = hypre_VectorData(Vtemp_local); hypre_Vector *u_local = hypre_ParVectorLocalVector(u); HYPRE_Complex *u_data = hypre_VectorData(u_local); HYPRE_Complex multiplier = 1.0; HYPRE_Int i, k, jj, ii; /* Sanity check */ if (hypre_ParVectorNumVectors(f) > 1) { hypre_error_w_msg(HYPRE_ERROR_GENERIC, "2-stage GS relaxation (Host) doesn't support multicomponent vectors"); return hypre_error_flag; } /* Need to check that EVERY diagonal is nonzero first. If any are, throw exception */ for (i = 0; i < num_rows; i++) { if (A_diag_data[A_diag_i[i]] == 0.0) { hypre_error_in_arg(1); } } hypre_ParCSRMatrixMatvecOutOfPlace(-relax_weight, A, u, relax_weight, f, Vtemp); /* Run the smoother */ for (i = 0; i < num_rows; i++) { // V = V/D Vtemp_data[i] /= A_diag_data[A_diag_i[i]]; // u = u + m*v u_data[i] += multiplier * Vtemp_data[i]; } // adjust for the alternating series multiplier *= -1.0; for (k = 0; k < num_inner_iters; ++k) { // By going from bottom to top, we can update Vtemp in place because // we're operating with the strict, lower triangular matrix for (i = num_rows - 1; i >= 0; i--) /* Run the smoother */ { // spmv for the row first HYPRE_Complex res = 0.0; for (jj = A_diag_i[i]; jj < A_diag_i[i + 1]; jj++) { ii = A_diag_j[jj]; if (ii < i) { res += A_diag_data[jj] * Vtemp_data[ii]; } } // diagonal scaling has to come after the spmv accumulation. It's a row scaling // not column Vtemp_data[i] = res / A_diag_data[A_diag_i[i]]; u_data[i] += multiplier * Vtemp_data[i]; } // adjust for the alternating series multiplier *= -1.0; } return hypre_error_flag; } /*-------------------------------------------------------------------- * hypre_BoomerAMGRelax11TwoStageGaussSeidel *--------------------------------------------------------------------*/ HYPRE_Int hypre_BoomerAMGRelax11TwoStageGaussSeidel( hypre_ParCSRMatrix *A, hypre_ParVector *f, HYPRE_Int *cf_marker, HYPRE_Int relax_points, HYPRE_Real relax_weight, HYPRE_Real omega, HYPRE_Real *A_diag_diag, hypre_ParVector *u, hypre_ParVector *Vtemp, hypre_ParVector *Ztemp ) { HYPRE_UNUSED_VAR(cf_marker); HYPRE_UNUSED_VAR(relax_points); #if defined(HYPRE_USING_GPU) HYPRE_ExecutionPolicy exec = hypre_GetExecPolicy2( hypre_ParCSRMatrixMemoryLocation(A), hypre_ParVectorMemoryLocation(f) ); if (exec == HYPRE_EXEC_DEVICE) { hypre_BoomerAMGRelaxTwoStageGaussSeidelDevice(A, f, relax_weight, omega, A_diag_diag, u, Vtemp, Ztemp, 1); } else #endif { HYPRE_UNUSED_VAR(A_diag_diag); HYPRE_UNUSED_VAR(Ztemp); hypre_BoomerAMGRelaxTwoStageGaussSeidelHost(A, f, relax_weight, omega, u, Vtemp, 1); } return hypre_error_flag; } /*-------------------------------------------------------------------- * hypre_BoomerAMGRelax12TwoStageGaussSeidel *--------------------------------------------------------------------*/ HYPRE_Int hypre_BoomerAMGRelax12TwoStageGaussSeidel( hypre_ParCSRMatrix *A, hypre_ParVector *f, HYPRE_Int *cf_marker, HYPRE_Int relax_points, HYPRE_Real relax_weight, HYPRE_Real omega, HYPRE_Real *A_diag_diag, hypre_ParVector *u, hypre_ParVector *Vtemp, hypre_ParVector *Ztemp ) { HYPRE_UNUSED_VAR(cf_marker); HYPRE_UNUSED_VAR(relax_points); #if defined(HYPRE_USING_GPU) HYPRE_ExecutionPolicy exec = hypre_GetExecPolicy2( hypre_ParCSRMatrixMemoryLocation(A), hypre_ParVectorMemoryLocation(f) ); if (exec == HYPRE_EXEC_DEVICE) { hypre_BoomerAMGRelaxTwoStageGaussSeidelDevice(A, f, relax_weight, omega, A_diag_diag, u, Vtemp, Ztemp, 2); } else #endif { HYPRE_UNUSED_VAR(A_diag_diag); HYPRE_UNUSED_VAR(Ztemp); hypre_BoomerAMGRelaxTwoStageGaussSeidelHost(A, f, relax_weight, omega, u, Vtemp, 2); } return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_BoomerAMGRelaxComputeL1Norms * * TODO (VPM): Use this function in BoomerAMGSetup *--------------------------------------------------------------------------*/ HYPRE_Int hypre_BoomerAMGRelaxComputeL1Norms( hypre_ParCSRMatrix *A, HYPRE_Int relax_type, HYPRE_Int relax_order, HYPRE_Int coarsest_lvl, hypre_IntArray *CF_marker, HYPRE_Real **l1_norms_data_ptr ) { HYPRE_Int *CF_marker_data; HYPRE_Real *l1_norms_data = NULL; /* Relax according to F/C points ordering? */ CF_marker_data = (relax_order && CF_marker) ? hypre_IntArrayData(CF_marker) : NULL; /* Are we in the coarsest level? */ CF_marker_data = (coarsest_lvl) ? NULL : CF_marker_data; if (relax_type == 18) { /* l1_norm = sum(|A_ij|)_j */ hypre_ParCSRComputeL1Norms(A, 1, CF_marker_data, &l1_norms_data); } else if (relax_type == 8 || relax_type == 13 || relax_type == 14) { /* l1_norm = sum(|D_ij| + 0.5*|A_offd_ij|)_j */ hypre_ParCSRComputeL1Norms(A, 4, CF_marker_data, &l1_norms_data); } else if (relax_type == 7 || relax_type == 11 || relax_type == 12) { /* l1_norm = |D_ii| */ hypre_ParCSRComputeL1Norms(A, 5, NULL, &l1_norms_data); } *l1_norms_data_ptr = l1_norms_data; return hypre_error_flag; } hypre-2.33.0/src/parcsr_ls/par_relax.h000066400000000000000000000435111477326011500176450ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #ifndef HYPRE_PAR_RELAX_HEADER #define HYPRE_PAR_RELAX_HEADER /* Non-Scale version */ static inline void hypre_HybridGaussSeidelNS( HYPRE_Int *A_diag_i, HYPRE_Int *A_diag_j, HYPRE_Complex *A_diag_data, HYPRE_Int *A_offd_i, HYPRE_Int *A_offd_j, HYPRE_Complex *A_offd_data, HYPRE_Complex *f_data, HYPRE_Int *cf_marker, HYPRE_Int relax_points, HYPRE_Complex *l1_norms, HYPRE_Complex *u_data, HYPRE_Complex *v_tmp_data, HYPRE_Complex *v_ext_data, HYPRE_Int ibegin, HYPRE_Int iend, HYPRE_Int iorder, HYPRE_Int Skip_diag ) { HYPRE_UNUSED_VAR(v_tmp_data); HYPRE_Int i; const HYPRE_Complex zero = 0.0; /*----------------------------------------------------------- * Relax only C or F points as determined by relax_points. * If i is of the right type ( C or F or All) and diagonal is * nonzero, relax point i; otherwise, skip it. *-----------------------------------------------------------*/ if (l1_norms) { for (i = ibegin; i != iend; i += iorder) { if ( (relax_points == 0 || cf_marker[i] == relax_points) && l1_norms[i] != zero ) { HYPRE_Int jj; HYPRE_Complex res = f_data[i]; for (jj = A_diag_i[i] + Skip_diag; jj < A_diag_i[i + 1]; jj++) { const HYPRE_Int ii = A_diag_j[jj]; res -= A_diag_data[jj] * u_data[ii]; } for (jj = A_offd_i[i]; jj < A_offd_i[i + 1]; jj++) { const HYPRE_Int ii = A_offd_j[jj]; res -= A_offd_data[jj] * v_ext_data[ii]; } if (Skip_diag) { u_data[i] = res / l1_norms[i]; } else { u_data[i] += res / l1_norms[i]; } } } /* for ( i = ...) */ } else { for (i = ibegin; i != iend; i += iorder) { if ( (relax_points == 0 || cf_marker[i] == relax_points) && A_diag_data[A_diag_i[i]] != zero ) { HYPRE_Int jj; HYPRE_Complex res = f_data[i]; for (jj = A_diag_i[i] + Skip_diag; jj < A_diag_i[i + 1]; jj++) { const HYPRE_Int ii = A_diag_j[jj]; res -= A_diag_data[jj] * u_data[ii]; } for (jj = A_offd_i[i]; jj < A_offd_i[i + 1]; jj++) { const HYPRE_Int ii = A_offd_j[jj]; res -= A_offd_data[jj] * v_ext_data[ii]; } if (Skip_diag) { u_data[i] = res / A_diag_data[A_diag_i[i]]; } else { u_data[i] += res / A_diag_data[A_diag_i[i]]; } } } /* for ( i = ...) */ } } /* Non-Scale Threaded version */ static inline void hypre_HybridGaussSeidelNSThreads( HYPRE_Int *A_diag_i, HYPRE_Int *A_diag_j, HYPRE_Complex *A_diag_data, HYPRE_Int *A_offd_i, HYPRE_Int *A_offd_j, HYPRE_Complex *A_offd_data, HYPRE_Complex *f_data, HYPRE_Int *cf_marker, HYPRE_Int relax_points, HYPRE_Complex *l1_norms, HYPRE_Complex *u_data, HYPRE_Complex *v_tmp_data, HYPRE_Complex *v_ext_data, HYPRE_Int ns, HYPRE_Int ne, HYPRE_Int ibegin, HYPRE_Int iend, HYPRE_Int iorder, HYPRE_Int Skip_diag ) { HYPRE_Int i; const HYPRE_Complex zero = 0.0; /*----------------------------------------------------------- * Relax only C or F points as determined by relax_points. * If i is of the right type ( C or F or All) and diagonal is * nonzero, relax point i; otherwise, skip it. *-----------------------------------------------------------*/ if (l1_norms) { for (i = ibegin; i != iend; i += iorder) { /*----------------------------------------------------------- * Relax only C or F points as determined by relax_points. * If i is of the right type ( C or F or All) and diagonal is * nonzero, relax point i; otherwise, skip it. *-----------------------------------------------------------*/ if ( (relax_points == 0 || cf_marker[i] == relax_points) && l1_norms[i] != zero ) { HYPRE_Int jj; HYPRE_Complex res = f_data[i]; for (jj = A_diag_i[i] + Skip_diag; jj < A_diag_i[i + 1]; jj++) { const HYPRE_Int ii = A_diag_j[jj]; if (ii >= ns && ii < ne) { res -= A_diag_data[jj] * u_data[ii]; } else { res -= A_diag_data[jj] * v_tmp_data[ii]; } } for (jj = A_offd_i[i]; jj < A_offd_i[i + 1]; jj++) { const HYPRE_Int ii = A_offd_j[jj]; res -= A_offd_data[jj] * v_ext_data[ii]; } if (Skip_diag) { u_data[i] = res / l1_norms[i]; } else { u_data[i] += res / l1_norms[i]; } } } /* for ( i = ...) */ } else { for (i = ibegin; i != iend; i += iorder) { if ( (relax_points == 0 || cf_marker[i] == relax_points) && A_diag_data[A_diag_i[i]] != zero ) { HYPRE_Int jj; HYPRE_Complex res = f_data[i]; for (jj = A_diag_i[i] + Skip_diag; jj < A_diag_i[i + 1]; jj++) { const HYPRE_Int ii = A_diag_j[jj]; if (ii >= ns && ii < ne) { res -= A_diag_data[jj] * u_data[ii]; } else { res -= A_diag_data[jj] * v_tmp_data[ii]; } } for (jj = A_offd_i[i]; jj < A_offd_i[i + 1]; jj++) { const HYPRE_Int ii = A_offd_j[jj]; res -= A_offd_data[jj] * v_ext_data[ii]; } if (Skip_diag) { u_data[i] = res / A_diag_data[A_diag_i[i]]; } else { u_data[i] += res / A_diag_data[A_diag_i[i]]; } } } /* for ( i = ...) */ } } /* Scaled version */ static inline void hypre_HybridGaussSeidel( HYPRE_Int *A_diag_i, HYPRE_Int *A_diag_j, HYPRE_Complex *A_diag_data, HYPRE_Int *A_offd_i, HYPRE_Int *A_offd_j, HYPRE_Complex *A_offd_data, HYPRE_Complex *f_data, HYPRE_Int *cf_marker, HYPRE_Int relax_points, HYPRE_Real relax_weight, HYPRE_Real omega, HYPRE_Real one_minus_omega, HYPRE_Real prod, HYPRE_Complex *l1_norms, HYPRE_Complex *u_data, HYPRE_Complex *v_tmp_data, HYPRE_Complex *v_ext_data, HYPRE_Int ibegin, HYPRE_Int iend, HYPRE_Int iorder, HYPRE_Int Skip_diag ) { HYPRE_Int i; const HYPRE_Complex zero = 0.0; /*----------------------------------------------------------- * Relax only C or F points as determined by relax_points. * If i is of the right type ( C or F or All) and diagonal is * nonzero, relax point i; otherwise, skip it. *-----------------------------------------------------------*/ if (l1_norms) { for (i = ibegin; i != iend; i += iorder) { if ( (relax_points == 0 || cf_marker[i] == relax_points) && l1_norms[i] != zero ) { HYPRE_Int jj; HYPRE_Complex res = f_data[i]; HYPRE_Complex res0 = 0.0; HYPRE_Complex res2 = 0.0; for (jj = A_diag_i[i] + Skip_diag; jj < A_diag_i[i + 1]; jj++) { const HYPRE_Int ii = A_diag_j[jj]; res0 -= A_diag_data[jj] * u_data[ii]; res2 += A_diag_data[jj] * v_tmp_data[ii]; } for (jj = A_offd_i[i]; jj < A_offd_i[i + 1]; jj++) { const HYPRE_Int ii = A_offd_j[jj]; res -= A_offd_data[jj] * v_ext_data[ii]; } if (Skip_diag) { u_data[i] *= prod; u_data[i] += relax_weight * (omega * res + res0 + one_minus_omega * res2) / l1_norms[i]; } else { u_data[i] += relax_weight * (omega * res + res0 + one_minus_omega * res2) / l1_norms[i]; } } } /* for ( i = ...) */ } else { for (i = ibegin; i != iend; i += iorder) { if ( (relax_points == 0 || cf_marker[i] == relax_points) && A_diag_data[A_diag_i[i]] != zero ) { HYPRE_Int jj; HYPRE_Complex res = f_data[i]; HYPRE_Complex res0 = 0.0; HYPRE_Complex res2 = 0.0; for (jj = A_diag_i[i] + Skip_diag; jj < A_diag_i[i + 1]; jj++) { const HYPRE_Int ii = A_diag_j[jj]; res0 -= A_diag_data[jj] * u_data[ii]; res2 += A_diag_data[jj] * v_tmp_data[ii]; } for (jj = A_offd_i[i]; jj < A_offd_i[i + 1]; jj++) { const HYPRE_Int ii = A_offd_j[jj]; res -= A_offd_data[jj] * v_ext_data[ii]; } if (Skip_diag) { u_data[i] *= prod; u_data[i] += relax_weight * (omega * res + res0 + one_minus_omega * res2) / A_diag_data[A_diag_i[i]]; } else { u_data[i] += relax_weight * (omega * res + res0 + one_minus_omega * res2) / A_diag_data[A_diag_i[i]]; } } } /* for ( i = ...) */ } } /* Scaled Threaded version */ static inline void hypre_HybridGaussSeidelThreads( HYPRE_Int *A_diag_i, HYPRE_Int *A_diag_j, HYPRE_Complex *A_diag_data, HYPRE_Int *A_offd_i, HYPRE_Int *A_offd_j, HYPRE_Complex *A_offd_data, HYPRE_Complex *f_data, HYPRE_Int *cf_marker, HYPRE_Int relax_points, HYPRE_Real relax_weight, HYPRE_Real omega, HYPRE_Real one_minus_omega, HYPRE_Real prod, HYPRE_Complex *l1_norms, HYPRE_Complex *u_data, HYPRE_Complex *v_tmp_data, HYPRE_Complex *v_ext_data, HYPRE_Int ns, HYPRE_Int ne, HYPRE_Int ibegin, HYPRE_Int iend, HYPRE_Int iorder, HYPRE_Int Skip_diag ) { HYPRE_Int i; const HYPRE_Complex zero = 0.0; /*----------------------------------------------------------- * Relax only C or F points as determined by relax_points. * If i is of the right type ( C or F or All) and diagonal is * nonzero, relax point i; otherwise, skip it. *-----------------------------------------------------------*/ if (l1_norms) { for (i = ibegin; i != iend; i += iorder) { if ( (relax_points == 0 || cf_marker[i] == relax_points) && l1_norms[i] != zero ) { HYPRE_Int jj; HYPRE_Complex res = f_data[i]; HYPRE_Complex res0 = 0.0; HYPRE_Complex res2 = 0.0; for (jj = A_diag_i[i] + Skip_diag; jj < A_diag_i[i + 1]; jj++) { const HYPRE_Int ii = A_diag_j[jj]; if (ii >= ns && ii < ne) { res0 -= A_diag_data[jj] * u_data[ii]; res2 += A_diag_data[jj] * v_tmp_data[ii]; } else { res -= A_diag_data[jj] * v_tmp_data[ii]; } } for (jj = A_offd_i[i]; jj < A_offd_i[i + 1]; jj++) { const HYPRE_Int ii = A_offd_j[jj]; res -= A_offd_data[jj] * v_ext_data[ii]; } if (Skip_diag) { u_data[i] *= prod; u_data[i] += relax_weight * (omega * res + res0 + one_minus_omega * res2) / l1_norms[i]; } else { u_data[i] += relax_weight * (omega * res + res0 + one_minus_omega * res2) / l1_norms[i]; } } } /* for ( i = ...) */ } else { for (i = ibegin; i != iend; i += iorder) { if ( (relax_points == 0 || cf_marker[i] == relax_points) && A_diag_data[A_diag_i[i]] != zero ) { HYPRE_Int jj; HYPRE_Complex res = f_data[i]; HYPRE_Complex res0 = 0.0; HYPRE_Complex res2 = 0.0; for (jj = A_diag_i[i] + Skip_diag; jj < A_diag_i[i + 1]; jj++) { const HYPRE_Int ii = A_diag_j[jj]; if (ii >= ns && ii < ne) { res0 -= A_diag_data[jj] * u_data[ii]; res2 += A_diag_data[jj] * v_tmp_data[ii]; } else { res -= A_diag_data[jj] * v_tmp_data[ii]; } } for (jj = A_offd_i[i]; jj < A_offd_i[i + 1]; jj++) { const HYPRE_Int ii = A_offd_j[jj]; res -= A_offd_data[jj] * v_ext_data[ii]; } if (Skip_diag) { u_data[i] *= prod; u_data[i] += relax_weight * (omega * res + res0 + one_minus_omega * res2) / A_diag_data[A_diag_i[i]]; } else { u_data[i] += relax_weight * (omega * res + res0 + one_minus_omega * res2) / A_diag_data[A_diag_i[i]]; } } } /* for ( i = ...) */ } } /* Ordered Version */ static inline void hypre_HybridGaussSeidelOrderedNS( HYPRE_Int *A_diag_i, HYPRE_Int *A_diag_j, HYPRE_Complex *A_diag_data, HYPRE_Int *A_offd_i, HYPRE_Int *A_offd_j, HYPRE_Complex *A_offd_data, HYPRE_Complex *f_data, HYPRE_Int *cf_marker, HYPRE_Int relax_points, HYPRE_Complex *u_data, HYPRE_Complex *v_tmp_data, HYPRE_Complex *v_ext_data, HYPRE_Int ibegin, HYPRE_Int iend, HYPRE_Int iorder, HYPRE_Int *proc_ordering ) { HYPRE_UNUSED_VAR(v_tmp_data); HYPRE_Int j; const HYPRE_Complex zero = 0.0; for (j = ibegin; j != iend; j += iorder) { const HYPRE_Int i = proc_ordering[j]; /*----------------------------------------------------------- * Relax only C or F points as determined by relax_points. * If i is of the right type ( C or F or All) and diagonal is * nonzero, relax point i; otherwise, skip it. *-----------------------------------------------------------*/ if ( (relax_points == 0 || cf_marker[i] == relax_points) && A_diag_data[A_diag_i[i]] != zero ) { HYPRE_Int jj; HYPRE_Complex res = f_data[i]; for (jj = A_diag_i[i] + 1; jj < A_diag_i[i + 1]; jj++) { const HYPRE_Int ii = A_diag_j[jj]; res -= A_diag_data[jj] * u_data[ii]; } for (jj = A_offd_i[i]; jj < A_offd_i[i + 1]; jj++) { const HYPRE_Int ii = A_offd_j[jj]; res -= A_offd_data[jj] * v_ext_data[ii]; } u_data[i] = res / A_diag_data[A_diag_i[i]]; } } /* for ( i = ...) */ } #endif /* #ifndef HYPRE_PAR_RELAX_HEADER */ hypre-2.33.0/src/parcsr_ls/par_relax_device.c000066400000000000000000000150151477326011500211550ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "seq_mv.h" #include "_hypre_parcsr_ls.h" #include "_hypre_utilities.hpp" #if defined(HYPRE_USING_GPU) /*-------------------------------------------------------------------------- * hypre_BoomerAMGRelaxHybridGaussSeidelDevice *--------------------------------------------------------------------------*/ HYPRE_Int hypre_BoomerAMGRelaxHybridGaussSeidelDevice( hypre_ParCSRMatrix *A, hypre_ParVector *f, HYPRE_Int *cf_marker, HYPRE_Int relax_points, HYPRE_Real relax_weight, HYPRE_Real omega, HYPRE_Real *l1_norms, hypre_ParVector *u, hypre_ParVector *Vtemp, hypre_ParVector *Ztemp, HYPRE_Int GS_order, HYPRE_Int Symm ) { HYPRE_UNUSED_VAR(cf_marker); HYPRE_UNUSED_VAR(relax_points); HYPRE_UNUSED_VAR(omega); /* Vtemp, Ztemp have the fine-grid size. Create two shell vectors that have the correct size */ hypre_ParVector *w1 = hypre_ParVectorCloneShallow(f); hypre_ParVector *w2 = hypre_ParVectorCloneShallow(u); hypre_VectorData(hypre_ParVectorLocalVector(w1)) = hypre_VectorData(hypre_ParVectorLocalVector( Vtemp)); hypre_VectorData(hypre_ParVectorLocalVector(w2)) = hypre_VectorData(hypre_ParVectorLocalVector( Ztemp)); if (Symm) { /* V = f - A*u */ hypre_ParCSRMatrixMatvecOutOfPlace(-1.0, A, u, 1.0, f, w1); /* Z = L^{-1}*V */ hypre_CSRMatrixTriLowerUpperSolveDevice('L', 0, hypre_ParCSRMatrixDiag(A), l1_norms, hypre_ParVectorLocalVector(w1), hypre_ParVectorLocalVector(w2)); /* u = u + w*Z */ hypre_ParVectorAxpy(relax_weight, w2, u); /* Note: only update V from local change of u, i.e., V = V - w*A_diag*Z_local */ hypre_CSRMatrixMatvec(-relax_weight, hypre_ParCSRMatrixDiag(A), hypre_ParVectorLocalVector(w2), 1.0, hypre_ParVectorLocalVector(w1)); /* Z = U^{-1}*V */ hypre_CSRMatrixTriLowerUpperSolveDevice('U', 0, hypre_ParCSRMatrixDiag(A), l1_norms, hypre_ParVectorLocalVector(w1), hypre_ParVectorLocalVector(w2)); /* u = u + w*Z */ hypre_ParVectorAxpy(relax_weight, w2, u); } else { const char uplo = GS_order > 0 ? 'L' : 'U'; /* V = f - A*u */ hypre_ParCSRMatrixMatvecOutOfPlace(-1.0, A, u, 1.0, f, w1); /* Z = L^{-1}*V or Z = U^{-1}*V */ hypre_CSRMatrixTriLowerUpperSolveDevice(uplo, 0, hypre_ParCSRMatrixDiag(A), l1_norms, hypre_ParVectorLocalVector(w1), hypre_ParVectorLocalVector(w2)); /* u = u + w*Z */ hypre_ParVectorAxpy(relax_weight, w2, u); } hypre_ParVectorDestroy(w1); hypre_ParVectorDestroy(w2); return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_BoomerAMGRelaxTwoStageGaussSeidelDevice *--------------------------------------------------------------------------*/ HYPRE_Int hypre_BoomerAMGRelaxTwoStageGaussSeidelDevice( hypre_ParCSRMatrix *A, hypre_ParVector *f, HYPRE_Real relax_weight, HYPRE_Real omega, HYPRE_Real *A_diag_diag, hypre_ParVector *u, hypre_ParVector *r, hypre_ParVector *z, HYPRE_Int num_inner_iters ) { HYPRE_UNUSED_VAR(omega); hypre_CSRMatrix *A_diag = hypre_ParCSRMatrixDiag(A); HYPRE_Int num_rows = hypre_CSRMatrixNumRows(A_diag); hypre_Vector *u_local = hypre_ParVectorLocalVector(u); hypre_Vector *r_local = hypre_ParVectorLocalVector(r); hypre_Vector *z_local = hypre_ParVectorLocalVector(z); HYPRE_Int u_vecstride = hypre_VectorVectorStride(u_local); HYPRE_Int r_vecstride = hypre_VectorVectorStride(r_local); HYPRE_Complex *u_data = hypre_VectorData(u_local); HYPRE_Complex *r_data = hypre_VectorData(r_local); HYPRE_Complex *z_data = hypre_VectorData(z_local); HYPRE_Int num_vectors = hypre_VectorNumVectors(r_local); HYPRE_Complex multiplier = 1.0; HYPRE_Int i; hypre_GpuProfilingPushRange("BoomerAMGRelaxTwoStageGaussSeidelDevice"); /* Sanity checks */ hypre_assert(u_vecstride == num_rows); hypre_assert(r_vecstride == num_rows); // 0) r = relax_weight * (f - A * u) hypre_ParCSRMatrixMatvecOutOfPlace(-relax_weight, A, u, relax_weight, f, r); // 1) z = r/D, u = u + z hypreDevice_DiagScaleVector2(num_vectors, num_rows, A_diag_diag, r_data, 1.0, z_data, u_data, 1); multiplier *= -1.0; for (i = 0; i < num_inner_iters; i++) { // 2) r = L * z hypre_CSRMatrixSpMVDevice(0, 1.0, A_diag, z_local, 0.0, r_local, -2); // 3) z = r/D, u = u + m * z hypreDevice_DiagScaleVector2(num_vectors, num_rows, A_diag_diag, r_data, multiplier, z_data, u_data, (num_inner_iters > i + 1)); multiplier *= -1.0; } hypre_GpuProfilingPopRange(); return hypre_error_flag; } #endif /* #if defined(HYPRE_USING_GPU) */ hypre-2.33.0/src/parcsr_ls/par_relax_interface.c000066400000000000000000000102061477326011500216530ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * Relaxation scheme * *****************************************************************************/ #include "_hypre_parcsr_ls.h" /*-------------------------------------------------------------------------- * hypre_BoomerAMGRelax *--------------------------------------------------------------------------*/ HYPRE_Int hypre_BoomerAMGRelaxIF( hypre_ParCSRMatrix *A, hypre_ParVector *f, HYPRE_Int *cf_marker, HYPRE_Int relax_type, HYPRE_Int relax_order, HYPRE_Int cycle_param, HYPRE_Real relax_weight, HYPRE_Real omega, HYPRE_Real *l1_norms, hypre_ParVector *u, hypre_ParVector *Vtemp, hypre_ParVector *Ztemp ) { HYPRE_Int i, Solve_err_flag = 0; HYPRE_Int relax_points[2]; if (relax_order == 1 && cycle_param < 3) { if (cycle_param < 2) { /* CF down cycle */ relax_points[0] = 1; relax_points[1] = -1; } else { /* FC up cycle */ relax_points[0] = -1; relax_points[1] = 1; } for (i = 0; i < 2; i++) { Solve_err_flag = hypre_BoomerAMGRelax(A, f, cf_marker, relax_type, relax_points[i], relax_weight, omega, l1_norms, u, Vtemp, Ztemp); } } else { Solve_err_flag = hypre_BoomerAMGRelax(A, f, cf_marker, relax_type, 0, relax_weight, omega, l1_norms, u, Vtemp, Ztemp); } return Solve_err_flag; } /*-------------------------------------------------------------------------- * hypre_ParCSRRelax_L1_Jacobi (same as the one in AMS, but this allows CF) * u_new = u_old + w D^{-1}(f - A u), where D_ii = ||A(i,:)||_1 *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ParCSRRelax_L1_Jacobi( hypre_ParCSRMatrix *A, hypre_ParVector *f, HYPRE_Int *cf_marker, HYPRE_Int relax_points, HYPRE_Real relax_weight, HYPRE_Real *l1_norms, hypre_ParVector *u, hypre_ParVector *Vtemp ) { return hypre_BoomerAMGRelax(A, f, cf_marker, 18, relax_points, relax_weight, 0.0, l1_norms, u, Vtemp, NULL); } /*-------------------------------------------------------------------------- * hypre_BoomerAMGRelax_FCFJacobi *--------------------------------------------------------------------------*/ HYPRE_Int hypre_BoomerAMGRelax_FCFJacobi( hypre_ParCSRMatrix *A, hypre_ParVector *f, HYPRE_Int *cf_marker, HYPRE_Real relax_weight, hypre_ParVector *u, hypre_ParVector *Vtemp) { HYPRE_Int i; HYPRE_Int relax_points[3]; HYPRE_Int relax_type = 0; relax_points[0] = -1; /*F */ relax_points[1] = 1; /*C */ relax_points[2] = -1; /*F */ /* cf == NULL --> size == 0 */ if (cf_marker == NULL) { hypre_assert(hypre_CSRMatrixNumRows(hypre_ParCSRMatrixDiag(A)) == 0); } for (i = 0; i < 3; i++) { hypre_BoomerAMGRelax(A, f, cf_marker, relax_type, relax_points[i], relax_weight, 0.0, NULL, u, Vtemp, NULL); } return hypre_error_flag; } hypre-2.33.0/src/parcsr_ls/par_relax_more.c000066400000000000000000000524141477326011500206640ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * a few more relaxation schemes: Chebychev, FCF-Jacobi, CG - * these do not go through the CF interface (hypre_BoomerAMGRelaxIF) * *****************************************************************************/ #include "_hypre_parcsr_ls.h" #include "float.h" /****************************************************************************** * * use Gershgorin discs to estimate smallest and largest eigenvalues * A is assumed to be symmetric * For SPD matrix, it returns [0, max_eig = max (aii + ri)], * ri is radius of disc centered at a_ii * For SND matrix, it returns [min_eig = min (aii - ri), 0] * * scale > 0: compute eigen estimate of D^{-1/2}*A*D^{-1/2}, where * D = diag(A) for SPD matrix, D = -diag(A) for SND * * scale = 1: The algorithm is performed on D^{-1}*A, since it * has the same eigenvalues as D^{-1/2}*A*D^{-1/2} * scale = 2: The algorithm is performed on D^{-1/2}*A*D^{-1/2} (TODO) * *****************************************************************************/ HYPRE_Int hypre_ParCSRMaxEigEstimateHost( hypre_ParCSRMatrix *A, /* matrix to relax with */ HYPRE_Int scale, /* scale by diagonal? */ HYPRE_Real *max_eig, HYPRE_Real *min_eig ) { HYPRE_Int A_num_rows = hypre_ParCSRMatrixNumRows(A); HYPRE_Int *A_diag_i = hypre_CSRMatrixI(hypre_ParCSRMatrixDiag(A)); HYPRE_Int *A_diag_j = hypre_CSRMatrixJ(hypre_ParCSRMatrixDiag(A)); HYPRE_Int *A_offd_i = hypre_CSRMatrixI(hypre_ParCSRMatrixOffd(A)); HYPRE_Real *A_diag_data = hypre_CSRMatrixData(hypre_ParCSRMatrixDiag(A)); HYPRE_Real *A_offd_data = hypre_CSRMatrixData(hypre_ParCSRMatrixOffd(A)); HYPRE_Real *diag = NULL; HYPRE_Int i, j; HYPRE_Real e_max = 0.0; HYPRE_Real e_min = 0.0; HYPRE_Real send_buf[2], recv_buf[2]; HYPRE_MemoryLocation memory_location = hypre_ParCSRMatrixMemoryLocation(A); if (scale > 1) { diag = hypre_TAlloc(HYPRE_Real, A_num_rows, memory_location); } for (i = 0; i < A_num_rows; i++) { HYPRE_Real a_ii = 0.0, r_i = 0.0, lower, upper; for (j = A_diag_i[i]; j < A_diag_i[i + 1]; j++) { if (A_diag_j[j] == i) { a_ii = A_diag_data[j]; } else { r_i += hypre_abs(A_diag_data[j]); } } for (j = A_offd_i[i]; j < A_offd_i[i + 1]; j++) { r_i += hypre_abs(A_offd_data[j]); } lower = a_ii - r_i; upper = a_ii + r_i; if (scale == 1) { lower /= hypre_abs(a_ii); upper /= hypre_abs(a_ii); } if (i) { e_max = hypre_max(e_max, upper); e_min = hypre_min(e_min, lower); } else { e_max = upper; e_min = lower; } } send_buf[0] = -e_min; send_buf[1] = e_max; /* get e_min e_max across procs */ hypre_MPI_Allreduce(send_buf, recv_buf, 2, HYPRE_MPI_REAL, hypre_MPI_MAX, hypre_ParCSRMatrixComm(A)); e_min = -recv_buf[0]; e_max = recv_buf[1]; /* return */ if ( hypre_abs(e_min) > hypre_abs(e_max) ) { *min_eig = e_min; *max_eig = hypre_min(0.0, e_max); } else { *min_eig = hypre_max(e_min, 0.0); *max_eig = e_max; } hypre_TFree(diag, memory_location); return hypre_error_flag; } /** * @brief Estimates the max eigenvalue using infinity norm. Will determine * whether or not to use host or device internally * * @param[in] A Matrix to relax with * @param[in] to scale by diagonal * @param[out] Maximum eigenvalue */ HYPRE_Int hypre_ParCSRMaxEigEstimate(hypre_ParCSRMatrix *A, /* matrix to relax with */ HYPRE_Int scale, /* scale by diagonal?*/ HYPRE_Real *max_eig, HYPRE_Real *min_eig) { hypre_GpuProfilingPushRange("ParCSRMaxEigEstimate"); HYPRE_Int ierr = 0; #if defined(HYPRE_USING_GPU) HYPRE_ExecutionPolicy exec = hypre_GetExecPolicy1( hypre_ParCSRMatrixMemoryLocation(A) ); if (exec == HYPRE_EXEC_DEVICE) { ierr = hypre_ParCSRMaxEigEstimateDevice(A, scale, max_eig, min_eig); } else #endif { ierr = hypre_ParCSRMaxEigEstimateHost(A, scale, max_eig, min_eig); } hypre_GpuProfilingPopRange(); return ierr; } /** * @brief Uses CG to get the eigenvalue estimate. Will determine whether to use * host or device internally * * @param[in] A Matrix to relax with * @param[in] scale Gets the eigenvalue est of D^{-1/2} A D^{-1/2} * @param[in] max_iter Maximum number of iterations for CG * @param[out] max_eig Estimated max eigenvalue * @param[out] min_eig Estimated min eigenvalue */ HYPRE_Int hypre_ParCSRMaxEigEstimateCG(hypre_ParCSRMatrix *A, /* matrix to relax with */ HYPRE_Int scale, /* scale by diagonal?*/ HYPRE_Int max_iter, HYPRE_Real *max_eig, HYPRE_Real *min_eig) { hypre_GpuProfilingPushRange("ParCSRMaxEigEstimateCG"); HYPRE_Int ierr = 0; #if defined(HYPRE_USING_GPU) HYPRE_ExecutionPolicy exec = hypre_GetExecPolicy1(hypre_ParCSRMatrixMemoryLocation(A)); if (exec == HYPRE_EXEC_DEVICE) { ierr = hypre_ParCSRMaxEigEstimateCGDevice(A, scale, max_iter, max_eig, min_eig); } else #endif { ierr = hypre_ParCSRMaxEigEstimateCGHost(A, scale, max_iter, max_eig, min_eig); } hypre_GpuProfilingPopRange(); return ierr; } /** * @brief Uses CG to get the eigenvalue estimate on the host * * @param[in] A Matrix to relax with * @param[in] scale Gets the eigenvalue est of D^{-1/2} A D^{-1/2} * @param[in] max_iter Maximum number of iterations for CG * @param[out] max_eig Estimated max eigenvalue * @param[out] min_eig Estimated min eigenvalue */ HYPRE_Int hypre_ParCSRMaxEigEstimateCGHost( hypre_ParCSRMatrix *A, /* matrix to relax with */ HYPRE_Int scale, /* scale by diagonal?*/ HYPRE_Int max_iter, HYPRE_Real *max_eig, HYPRE_Real *min_eig ) { HYPRE_Int i, j, err; hypre_ParVector *p; hypre_ParVector *s; hypre_ParVector *r; hypre_ParVector *ds; hypre_ParVector *u; HYPRE_Real *tridiag = NULL; HYPRE_Real *trioffd = NULL; HYPRE_Real lambda_max ; HYPRE_Real beta, gamma = 0.0, alpha, sdotp, gamma_old, alphainv; HYPRE_Real lambda_min; HYPRE_Real *s_data, *p_data, *ds_data, *u_data; HYPRE_Int local_size = hypre_CSRMatrixNumRows(hypre_ParCSRMatrixDiag(A)); /* check the size of A - don't iterate more than the size */ HYPRE_BigInt size = hypre_ParCSRMatrixGlobalNumRows(A); if (size < (HYPRE_BigInt) max_iter) { max_iter = (HYPRE_Int) size; } /* create some temp vectors: p, s, r , ds, u*/ r = hypre_ParVectorCreate(hypre_ParCSRMatrixComm(A), hypre_ParCSRMatrixGlobalNumRows(A), hypre_ParCSRMatrixRowStarts(A)); hypre_ParVectorInitialize(r); p = hypre_ParVectorCreate(hypre_ParCSRMatrixComm(A), hypre_ParCSRMatrixGlobalNumRows(A), hypre_ParCSRMatrixRowStarts(A)); hypre_ParVectorInitialize(p); s = hypre_ParVectorCreate(hypre_ParCSRMatrixComm(A), hypre_ParCSRMatrixGlobalNumRows(A), hypre_ParCSRMatrixRowStarts(A)); hypre_ParVectorInitialize(s); ds = hypre_ParVectorCreate(hypre_ParCSRMatrixComm(A), hypre_ParCSRMatrixGlobalNumRows(A), hypre_ParCSRMatrixRowStarts(A)); hypre_ParVectorInitialize(ds); u = hypre_ParVectorCreate(hypre_ParCSRMatrixComm(A), hypre_ParCSRMatrixGlobalNumRows(A), hypre_ParCSRMatrixRowStarts(A)); hypre_ParVectorInitialize(u); /* point to local data */ s_data = hypre_VectorData(hypre_ParVectorLocalVector(s)); p_data = hypre_VectorData(hypre_ParVectorLocalVector(p)); ds_data = hypre_VectorData(hypre_ParVectorLocalVector(ds)); u_data = hypre_VectorData(hypre_ParVectorLocalVector(u)); /* make room for tri-diag matrix */ tridiag = hypre_CTAlloc(HYPRE_Real, max_iter + 1, HYPRE_MEMORY_HOST); trioffd = hypre_CTAlloc(HYPRE_Real, max_iter + 1, HYPRE_MEMORY_HOST); for (i = 0; i < max_iter + 1; i++) { tridiag[i] = 0; trioffd[i] = 0; } /* set residual to random */ hypre_ParVectorSetRandomValues(r, 1); if (scale) { hypre_CSRMatrixExtractDiagonal(hypre_ParCSRMatrixDiag(A), ds_data, 4); } else { /* set ds to 1 */ hypre_ParVectorSetConstantValues(ds, 1.0); } /* gamma = */ gamma = hypre_ParVectorInnerProd(r, p); /* for the initial filling of the tridiag matrix */ beta = 1.0; i = 0; while (i < max_iter) { /* s = C*r */ /* TO DO: C = diag scale */ hypre_ParVectorCopy(r, s); /*gamma = */ gamma_old = gamma; gamma = hypre_ParVectorInnerProd(r, s); if (gamma < HYPRE_REAL_EPSILON) { break; } if (i == 0) { beta = 1.0; /* p_0 = C*r */ hypre_ParVectorCopy(s, p); } else { /* beta = gamma / gamma_old */ beta = gamma / gamma_old; /* p = s + beta p */ #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(j) HYPRE_SMP_SCHEDULE #endif for (j = 0; j < local_size; j++) { p_data[j] = s_data[j] + beta * p_data[j]; } } if (scale) { /* s = D^{-1/2}A*D^{-1/2}*p */ for (j = 0; j < local_size; j++) { u_data[j] = ds_data[j] * p_data[j]; } hypre_ParCSRMatrixMatvec(1.0, A, u, 0.0, s); for (j = 0; j < local_size; j++) { s_data[j] = ds_data[j] * s_data[j]; } } else { /* s = A*p */ hypre_ParCSRMatrixMatvec(1.0, A, p, 0.0, s); } /* */ sdotp = hypre_ParVectorInnerProd(s, p); /* alpha = gamma / */ alpha = gamma / sdotp; /* get tridiagonal matrix */ alphainv = 1.0 / alpha; tridiag[i + 1] = alphainv; tridiag[i] *= beta; tridiag[i] += alphainv; trioffd[i + 1] = alphainv; trioffd[i] *= hypre_sqrt(beta); /* x = x + alpha*p */ /* don't need */ /* r = r - alpha*s */ hypre_ParVectorAxpy(-alpha, s, r); i++; } /* eispack routine - eigenvalues return in tridiag and ordered*/ hypre_LINPACKcgtql1(&i, tridiag, trioffd, &err); lambda_max = tridiag[i - 1]; lambda_min = tridiag[0]; /* hypre_printf("linpack max eig est = %g\n", lambda_max);*/ /* hypre_printf("linpack min eig est = %g\n", lambda_min);*/ hypre_TFree(tridiag, HYPRE_MEMORY_HOST); hypre_TFree(trioffd, HYPRE_MEMORY_HOST); hypre_ParVectorDestroy(r); hypre_ParVectorDestroy(s); hypre_ParVectorDestroy(p); hypre_ParVectorDestroy(ds); hypre_ParVectorDestroy(u); /* return */ *max_eig = lambda_max; *min_eig = lambda_min; return hypre_error_flag; } /****************************************************************************** Chebyshev relaxation Can specify order 1-4 (this is the order of the resid polynomial)- here we explicitly code the coefficients (instead of iteratively determining) variant 0: standard chebyshev this is rlx 11 if scale = 0, and 16 if scale == 1 variant 1: modified cheby: T(t)* f(t) where f(t) = (1-b/t) this is rlx 15 if scale = 0, and 17 if scale == 1 ratio indicates the percentage of the whole spectrum to use (so .5 means half, and .1 means 10percent) *******************************************************************************/ HYPRE_Int hypre_ParCSRRelax_Cheby(hypre_ParCSRMatrix *A, /* matrix to relax with */ hypre_ParVector *f, /* right-hand side */ HYPRE_Real max_eig, HYPRE_Real min_eig, HYPRE_Real fraction, HYPRE_Int order, /* polynomial order */ HYPRE_Int scale, /* scale by diagonal?*/ HYPRE_Int variant, hypre_ParVector *u, /* initial/updated approximation */ hypre_ParVector *v, /* temporary vector */ hypre_ParVector *r /*another temp vector */) { HYPRE_Real *coefs = NULL; HYPRE_Real *ds_data = NULL; hypre_ParVector *tmp_vec = NULL; hypre_ParVector *orig_u_vec = NULL; hypre_ParCSRRelax_Cheby_Setup(A, max_eig, min_eig, fraction, order, scale, variant, &coefs, &ds_data); orig_u_vec = hypre_ParVectorCreate(hypre_ParCSRMatrixComm(A), hypre_ParCSRMatrixGlobalNumRows(A), hypre_ParCSRMatrixRowStarts(A)); hypre_ParVectorInitialize_v2(orig_u_vec, hypre_ParCSRMatrixMemoryLocation(A)); if (scale) { tmp_vec = hypre_ParVectorCreate(hypre_ParCSRMatrixComm(A), hypre_ParCSRMatrixGlobalNumRows(A), hypre_ParCSRMatrixRowStarts(A)); hypre_ParVectorInitialize_v2(tmp_vec, hypre_ParCSRMatrixMemoryLocation(A)); } hypre_ParCSRRelax_Cheby_Solve(A, f, ds_data, coefs, order, scale, variant, u, v, r, orig_u_vec, tmp_vec); hypre_TFree(ds_data, hypre_ParCSRMatrixMemoryLocation(A)); hypre_TFree(coefs, HYPRE_MEMORY_HOST); hypre_ParVectorDestroy(orig_u_vec); hypre_ParVectorDestroy(tmp_vec); return hypre_error_flag; } /*-------------------------------------------------------------------------- * CG Smoother *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ParCSRRelax_CG( HYPRE_Solver solver, hypre_ParCSRMatrix *A, hypre_ParVector *f, hypre_ParVector *u, HYPRE_Int num_its) { HYPRE_PCGSetMaxIter(solver, num_its); /* max iterations */ HYPRE_PCGSetTol(solver, 0.0); /* max iterations */ HYPRE_ParCSRPCGSolve(solver, (HYPRE_ParCSRMatrix)A, (HYPRE_ParVector)f, (HYPRE_ParVector)u); #if 0 { HYPRE_Int myid; HYPRE_Int num_iterations; HYPRE_Real final_res_norm; hypre_MPI_Comm_rank(hypre_MPI_COMM_WORLD, &myid); HYPRE_PCGGetNumIterations(solver, &num_iterations); HYPRE_PCGGetFinalRelativeResidualNorm(solver, &final_res_norm); if (myid == 0) { hypre_printf(" -----CG PCG Iterations = %d\n", num_iterations); hypre_printf(" -----CG PCG Final Relative Residual Norm = %e\n", final_res_norm); } } #endif return hypre_error_flag; } /* tql1.f -- this is the eispack translation - from Barry Smith in Petsc Note that this routine always uses real numbers (not complex) even if the underlying matrix is Hermitian. This is because the Lanczos process applied to Hermitian matrices always produces a real, symmetric tridiagonal matrix. */ HYPRE_Int hypre_LINPACKcgtql1(HYPRE_Int *n, HYPRE_Real *d, HYPRE_Real *e, HYPRE_Int *ierr) { /* System generated locals */ HYPRE_Int i__1, i__2; HYPRE_Real d__1, d__2, c_b10 = 1.0; /* Local variables */ HYPRE_Real c, f, g, h; HYPRE_Int i, j, l, m; HYPRE_Real p, r, s, c2, c3 = 0.0; HYPRE_Int l1, l2; HYPRE_Real s2 = 0.0; HYPRE_Int ii; HYPRE_Real dl1, el1; HYPRE_Int mml; HYPRE_Real tst1, tst2; /* THIS SUBROUTINE IS A TRANSLATION OF THE ALGOL PROCEDURE TQL1, */ /* NUM. MATH. 11, 293-306(1968) BY BOWDLER, MARTIN, REINSCH, AND */ /* WILKINSON. */ /* HANDBOOK FOR AUTO. COMP., VOL.II-LINEAR ALGEBRA, 227-240(1971). */ /* THIS SUBROUTINE FINDS THE EIGENVALUES OF A SYMMETRIC */ /* TRIDIAGONAL MATRIX BY THE QL METHOD. */ /* ON INPUT */ /* N IS THE ORDER OF THE MATRIX. */ /* D CONTAINS THE DIAGONAL ELEMENTS OF THE INPUT MATRIX. */ /* E CONTAINS THE SUBDIAGONAL ELEMENTS OF THE INPUT MATRIX */ /* IN ITS LAST N-1 POSITIONS. E(1) IS ARBITRARY. */ /* ON OUTPUT */ /* D CONTAINS THE EIGENVALUES IN ASCENDING ORDER. IF AN */ /* ERROR EXIT IS MADE, THE EIGENVALUES ARE CORRECT AND */ /* ORDERED FOR INDICES 1,2,...IERR-1, BUT MAY NOT BE */ /* THE SMALLEST EIGENVALUES. */ /* E HAS BEEN DESTROYED. */ /* IERR IS SET TO */ /* ZERO FOR NORMAL RETURN, */ /* J IF THE J-TH EIGENVALUE HAS NOT BEEN */ /* DETERMINED AFTER 30 ITERATIONS. */ /* CALLS CGPTHY FOR DSQRT(A*A + B*B) . */ /* QUESTIONS AND COMMENTS SHOULD BE DIRECTED TO BURTON S. GARBOW, */ /* MATHEMATICS AND COMPUTER SCIENCE DIV, ARGONNE NATIONAL LABORATORY */ /* THIS VERSION DATED AUGUST 1983. */ /* ------------------------------------------------------------------ */ HYPRE_Real ds; --e; --d; *ierr = 0; if (*n == 1) { goto L1001; } i__1 = *n; for (i = 2; i <= i__1; ++i) { e[i - 1] = e[i]; } f = 0.; tst1 = 0.; e[*n] = 0.; i__1 = *n; for (l = 1; l <= i__1; ++l) { j = 0; h = (d__1 = d[l], hypre_abs(d__1)) + (d__2 = e[l], hypre_abs(d__2)); if (tst1 < h) { tst1 = h; } /* .......... LOOK FOR SMALL SUB-DIAGONAL ELEMENT .......... */ i__2 = *n; for (m = l; m <= i__2; ++m) { tst2 = tst1 + (d__1 = e[m], hypre_abs(d__1)); if (tst2 == tst1) { goto L120; } /* .......... E(N) IS ALWAYS ZERO,SO THERE IS NO EXIT */ /* THROUGH THE BOTTOM OF THE LOOP .......... */ } L120: if (m == l) { goto L210; } L130: if (j == 30) { goto L1000; } ++j; /* .......... FORM SHIFT .......... */ l1 = l + 1; l2 = l1 + 1; g = d[l]; p = (d[l1] - g) / (e[l] * 2.); r = hypre_LINPACKcgpthy(&p, &c_b10); ds = 1.0; if (p < 0.0) { ds = -1.0; } d[l] = e[l] / (p + ds * r); d[l1] = e[l] * (p + ds * r); dl1 = d[l1]; h = g - d[l]; if (l2 > *n) { goto L145; } i__2 = *n; for (i = l2; i <= i__2; ++i) { d[i] -= h; } L145: f += h; /* .......... QL TRANSFORMATION .......... */ p = d[m]; c = 1.; c2 = c; el1 = e[l1]; s = 0.; mml = m - l; /* .......... FOR I=M-1 STEP -1 UNTIL L DO -- .......... */ i__2 = mml; for (ii = 1; ii <= i__2; ++ii) { c3 = c2; c2 = c; s2 = s; i = m - ii; g = c * e[i]; h = c * p; r = hypre_LINPACKcgpthy(&p, &e[i]); e[i + 1] = s * r; s = e[i] / r; c = p / r; p = c * d[i] - s * g; d[i + 1] = h + s * (c * g + s * d[i]); } p = -s * s2 * c3 * el1 * e[l] / dl1; e[l] = s * p; d[l] = c * p; tst2 = tst1 + (d__1 = e[l], hypre_abs(d__1)); if (tst2 > tst1) { goto L130; } L210: p = d[l] + f; /* .......... ORDER EIGENVALUES .......... */ if (l == 1) { goto L250; } /* .......... FOR I=L STEP -1 UNTIL 2 DO -- .......... */ i__2 = l; for (ii = 2; ii <= i__2; ++ii) { i = l + 2 - ii; if (p >= d[i - 1]) { goto L270; } d[i] = d[i - 1]; } L250: i = 1; L270: d[i] = p; } goto L1001; /* .......... SET ERROR -- NO CONVERGENCE TO AN */ /* EIGENVALUE AFTER 30 ITERATIONS .......... */ L1000: *ierr = l; L1001: return 0; } /* cgtql1_ */ HYPRE_Real hypre_LINPACKcgpthy(HYPRE_Real *a, HYPRE_Real *b) { /* System generated locals */ HYPRE_Real ret_val, d__1, d__2, d__3; /* Local variables */ HYPRE_Real p, r, s, t, u; /* FINDS DSQRT(A**2+B**2) WITHOUT OVERFLOW OR DESTRUCTIVE UNDERFLOW */ /* Computing MAX */ d__1 = hypre_abs(*a), d__2 = hypre_abs(*b); p = hypre_max(d__1, d__2); if (!p) { goto L20; } /* Computing MIN */ d__2 = hypre_abs(*a), d__3 = hypre_abs(*b); /* Computing 2nd power */ d__1 = hypre_min(d__2, d__3) / p; r = d__1 * d__1; L10: t = r + 4.; if (t == 4.) { goto L20; } s = r / t; u = s * 2. + 1.; p = u * p; /* Computing 2nd power */ d__1 = s / u; r = d__1 * d__1 * r; goto L10; L20: ret_val = p; return ret_val; } /* cgpthy_ */ hypre-2.33.0/src/parcsr_ls/par_relax_more_device.c000066400000000000000000000354541477326011500222100ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * a few more relaxation schemes: Chebychev, FCF-Jacobi, CG - * these do not go through the CF interface (hypre_BoomerAMGRelaxIF) * *****************************************************************************/ #include "_hypre_onedpl.hpp" #include "_hypre_parcsr_ls.h" #if defined(HYPRE_USING_GPU) #include "_hypre_utilities.hpp" /** * @brief Calculates row sums and other metrics of a matrix on the device * to be used for the MaxEigEstimate */ __global__ void hypreGPUKernel_CSRMaxEigEstimate(hypre_DeviceItem &item, HYPRE_Int nrows, HYPRE_Int *diag_ia, HYPRE_Int *diag_ja, HYPRE_Complex *diag_aa, HYPRE_Int *offd_ia, HYPRE_Int *offd_ja, HYPRE_Complex *offd_aa, HYPRE_Complex *row_sum_lower, HYPRE_Complex *row_sum_upper, HYPRE_Int scale) { HYPRE_Int row_i = hypre_gpu_get_grid_warp_id<1, 1>(item); if (row_i >= nrows) { return; } HYPRE_Int lane = hypre_gpu_get_lane_id<1>(item); HYPRE_Int p = 0, q; HYPRE_Complex diag_value = 0.0; HYPRE_Complex row_sum_i = 0.0; HYPRE_Complex lower, upper; if (lane < 2) { p = read_only_load(diag_ia + row_i + lane); } q = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, p, 1); p = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, p, 0); for (HYPRE_Int j = p + lane; j < q; j += HYPRE_WARP_SIZE) { HYPRE_Complex aij = read_only_load(&diag_aa[j]); if ( read_only_load(&diag_ja[j]) == row_i ) { diag_value = aij; } else { row_sum_i += hypre_abs(aij); } } if (lane < 2) { p = read_only_load(offd_ia + row_i + lane); } q = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, p, 1); p = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, p, 0); for (HYPRE_Int j = p + lane; j < q; j += HYPRE_WARP_SIZE) { HYPRE_Complex aij = read_only_load(&offd_aa[j]); row_sum_i += hypre_abs(aij); } // Get the row_sum and diagonal value on lane 0 row_sum_i = warp_reduce_sum(item, row_sum_i); diag_value = warp_reduce_sum(item, diag_value); if (lane == 0) { lower = diag_value - row_sum_i; upper = diag_value + row_sum_i; if (scale) { lower /= hypre_abs(diag_value); upper /= hypre_abs(diag_value); } row_sum_upper[row_i] = upper; row_sum_lower[row_i] = lower; } } /** * @brief Estimates the max eigenvalue using infinity norm on the device * * @param[in] A Matrix to relax with * @param[in] to scale by diagonal * @param[out] Maximum eigenvalue */ HYPRE_Int hypre_ParCSRMaxEigEstimateDevice( hypre_ParCSRMatrix *A, HYPRE_Int scale, HYPRE_Real *max_eig, HYPRE_Real *min_eig ) { HYPRE_Real e_max; HYPRE_Real e_min; HYPRE_Int A_num_rows; HYPRE_Real *A_diag_data; HYPRE_Real *A_offd_data; HYPRE_Int *A_diag_i; HYPRE_Int *A_offd_i; HYPRE_Int *A_diag_j; HYPRE_Int *A_offd_j; A_num_rows = hypre_CSRMatrixNumRows(hypre_ParCSRMatrixDiag(A)); HYPRE_Real *rowsums_lower = hypre_TAlloc(HYPRE_Real, A_num_rows, hypre_ParCSRMatrixMemoryLocation(A)); HYPRE_Real *rowsums_upper = hypre_TAlloc(HYPRE_Real, A_num_rows, hypre_ParCSRMatrixMemoryLocation(A)); A_diag_i = hypre_CSRMatrixI(hypre_ParCSRMatrixDiag(A)); A_diag_j = hypre_CSRMatrixJ(hypre_ParCSRMatrixDiag(A)); A_diag_data = hypre_CSRMatrixData(hypre_ParCSRMatrixDiag(A)); A_offd_i = hypre_CSRMatrixI(hypre_ParCSRMatrixOffd(A)); A_offd_j = hypre_CSRMatrixJ(hypre_ParCSRMatrixOffd(A)); A_offd_data = hypre_CSRMatrixData(hypre_ParCSRMatrixOffd(A)); dim3 bDim = hypre_GetDefaultDeviceBlockDimension(); dim3 gDim = hypre_GetDefaultDeviceGridDimension(A_num_rows, "warp", bDim); HYPRE_GPU_LAUNCH(hypreGPUKernel_CSRMaxEigEstimate, gDim, bDim, A_num_rows, A_diag_i, A_diag_j, A_diag_data, A_offd_i, A_offd_j, A_offd_data, rowsums_lower, rowsums_upper, scale); hypre_SyncComputeStream(); #if defined(HYPRE_USING_SYCL) e_min = HYPRE_ONEDPL_CALL(std::reduce, rowsums_lower, rowsums_lower + A_num_rows, (HYPRE_Real)0, oneapi::dpl::minimum()); e_max = HYPRE_ONEDPL_CALL(std::reduce, rowsums_upper, rowsums_upper + A_num_rows, (HYPRE_Real)0, oneapi::dpl::maximum()); #else e_min = HYPRE_THRUST_CALL(reduce, rowsums_lower, rowsums_lower + A_num_rows, (HYPRE_Real)0, thrust::minimum()); e_max = HYPRE_THRUST_CALL(reduce, rowsums_upper, rowsums_upper + A_num_rows, (HYPRE_Real)0, thrust::maximum()); #endif /* Same as hypre_ParCSRMaxEigEstimateHost */ HYPRE_Real send_buf[2]; HYPRE_Real recv_buf[2]; send_buf[0] = -e_min; send_buf[1] = e_max; hypre_MPI_Allreduce(send_buf, recv_buf, 2, HYPRE_MPI_REAL, hypre_MPI_MAX, hypre_ParCSRMatrixComm(A)); /* return */ if ( hypre_abs(e_min) > hypre_abs(e_max) ) { *min_eig = e_min; *max_eig = hypre_min(0.0, e_max); } else { *min_eig = hypre_max(e_min, 0.0); *max_eig = e_max; } hypre_TFree(rowsums_lower, hypre_ParCSRMatrixMemoryLocation(A)); hypre_TFree(rowsums_upper, hypre_ParCSRMatrixMemoryLocation(A)); return hypre_error_flag; } /** * @brief Uses CG to get the eigenvalue estimate on the device * * @param[in] A Matrix to relax with * @param[in] scale Gets the eigenvalue est of D^{-1/2} A D^{-1/2} * @param[in] max_iter Maximum number of CG iterations * @param[out] max_eig Estimated max eigenvalue * @param[out] min_eig Estimated min eigenvalue */ HYPRE_Int hypre_ParCSRMaxEigEstimateCGDevice(hypre_ParCSRMatrix *A, /* matrix to relax with */ HYPRE_Int scale, /* scale by diagonal?*/ HYPRE_Int max_iter, HYPRE_Real *max_eig, HYPRE_Real *min_eig) { hypre_GpuProfilingPushRange("ParCSRMaxEigEstimate_Setup"); HYPRE_Int i, err; hypre_ParVector *p; hypre_ParVector *s; hypre_ParVector *r; hypre_ParVector *ds; hypre_ParVector *u; HYPRE_Real *tridiag = NULL; HYPRE_Real *trioffd = NULL; HYPRE_Real lambda_max; HYPRE_Real beta, gamma = 0.0, alpha, sdotp, gamma_old, alphainv; HYPRE_Real lambda_min; HYPRE_Real *s_data, *p_data, *ds_data, *u_data, *r_data; HYPRE_Int local_size = hypre_CSRMatrixNumRows(hypre_ParCSRMatrixDiag(A)); /* check the size of A - don't iterate more than the size */ HYPRE_BigInt size = hypre_ParCSRMatrixGlobalNumRows(A); if (size < (HYPRE_BigInt)max_iter) { max_iter = (HYPRE_Int)size; } hypre_GpuProfilingPushRange("ParCSRMaxEigEstimate_Setup_DataAlloc"); /* create some temp vectors: p, s, r , ds, u*/ r = hypre_ParVectorCreate(hypre_ParCSRMatrixComm(A), hypre_ParCSRMatrixGlobalNumRows(A), hypre_ParCSRMatrixRowStarts(A)); hypre_ParVectorInitialize_v2(r, hypre_ParCSRMatrixMemoryLocation(A)); p = hypre_ParVectorCreate(hypre_ParCSRMatrixComm(A), hypre_ParCSRMatrixGlobalNumRows(A), hypre_ParCSRMatrixRowStarts(A)); hypre_ParVectorInitialize_v2(p, hypre_ParCSRMatrixMemoryLocation(A)); s = hypre_ParVectorCreate(hypre_ParCSRMatrixComm(A), hypre_ParCSRMatrixGlobalNumRows(A), hypre_ParCSRMatrixRowStarts(A)); hypre_ParVectorInitialize_v2(s, hypre_ParCSRMatrixMemoryLocation(A)); /* DS Starts on host to be populated, then transferred to device */ ds = hypre_ParVectorCreate(hypre_ParCSRMatrixComm(A), hypre_ParCSRMatrixGlobalNumRows(A), hypre_ParCSRMatrixRowStarts(A)); hypre_ParVectorInitialize_v2(ds, hypre_ParCSRMatrixMemoryLocation(A)); ds_data = hypre_VectorData(hypre_ParVectorLocalVector(ds)); u = hypre_ParVectorCreate(hypre_ParCSRMatrixComm(A), hypre_ParCSRMatrixGlobalNumRows(A), hypre_ParCSRMatrixRowStarts(A)); hypre_ParVectorInitialize_v2(u, hypre_ParCSRMatrixMemoryLocation(A)); /* point to local data */ s_data = hypre_VectorData(hypre_ParVectorLocalVector(s)); p_data = hypre_VectorData(hypre_ParVectorLocalVector(p)); u_data = hypre_VectorData(hypre_ParVectorLocalVector(u)); r_data = hypre_VectorData(hypre_ParVectorLocalVector(r)); hypre_GpuProfilingPopRange(); /*Setup Data Alloc*/ hypre_GpuProfilingPushRange("ParCSRMaxEigEstimate_Setup_CPUAlloc_Setup"); hypre_GpuProfilingPushRange("ParCSRMaxEigEstimate_Setup_CPUAlloc_Setup_Alloc"); /* make room for tri-diag matrix */ tridiag = hypre_CTAlloc(HYPRE_Real, max_iter + 1, HYPRE_MEMORY_HOST); trioffd = hypre_CTAlloc(HYPRE_Real, max_iter + 1, HYPRE_MEMORY_HOST); hypre_GpuProfilingPopRange(); /*SETUP_Alloc*/ hypre_GpuProfilingPushRange("ParCSRMaxEigEstimate_Setup_CPUAlloc_Zeroing"); for (i = 0; i < max_iter + 1; i++) { tridiag[i] = 0; trioffd[i] = 0; } hypre_GpuProfilingPopRange(); /*Zeroing */ hypre_GpuProfilingPushRange("ParCSRMaxEigEstimate_Setup_CPUAlloc_Random"); /* set residual to random */ hypre_CurandUniform(local_size, r_data, 0, 0, 0, 0); hypre_SyncComputeStream(); #if defined(HYPRE_USING_SYCL) HYPRE_ONEDPL_CALL(std::transform, r_data, r_data + local_size, r_data, [] (auto x) { return 2.0 * x - 1.0; } ); #else HYPRE_THRUST_CALL(transform, r_data, r_data + local_size, r_data, 2.0 * _1 - 1.0); #endif hypre_GpuProfilingPopRange(); /*CPUAlloc_Random*/ hypre_GpuProfilingPushRange("ParCSRMaxEigEstimate_Setup_CPUAlloc_Diag"); if (scale) { hypre_CSRMatrixExtractDiagonal(hypre_ParCSRMatrixDiag(A), ds_data, 4); } else { /* set ds to 1 */ hypre_ParVectorSetConstantValues(ds, 1.0); } hypre_GpuProfilingPopRange(); /*Setup_CPUAlloc__Diag */ hypre_GpuProfilingPopRange(); /*CPUAlloc_Setup */ hypre_GpuProfilingPopRange(); /* Setup */ hypre_GpuProfilingPushRange("ParCSRMaxEigEstimate_Iter"); /* gamma = */ gamma = hypre_ParVectorInnerProd(r, p); /* for the initial filling of the tridiag matrix */ beta = 1.0; i = 0; while (i < max_iter) { /* s = C*r */ /* TO DO: C = diag scale */ hypre_ParVectorCopy(r, s); /*gamma = */ gamma_old = gamma; gamma = hypre_ParVectorInnerProd(r, s); if (gamma < HYPRE_REAL_EPSILON) { break; } if (i == 0) { beta = 1.0; /* p_0 = C*r */ hypre_ParVectorCopy(s, p); } else { /* beta = gamma / gamma_old */ beta = gamma / gamma_old; /* p = s + beta p */ hypreDevice_ComplexAxpyn(p_data, local_size, s_data, p_data, beta); } if (scale) { /* s = D^{-1/2}A*D^{-1/2}*p */ /* u = ds .* p */ #if defined(HYPRE_USING_SYCL) HYPRE_ONEDPL_CALL( std::transform, ds_data, ds_data + local_size, p_data, u_data, [] (auto x, auto y) { return x * y; } ); #else HYPRE_THRUST_CALL( transform, ds_data, ds_data + local_size, p_data, u_data, _1 * _2 ); #endif hypre_ParCSRMatrixMatvec(1.0, A, u, 0.0, s); /* s = ds .* s */ #if defined(HYPRE_USING_SYCL) HYPRE_ONEDPL_CALL( std::transform, ds_data, ds_data + local_size, s_data, s_data, [] (auto x, auto y) { return x * y; } ); #else HYPRE_THRUST_CALL( transform, ds_data, ds_data + local_size, s_data, s_data, _1 * _2 ); #endif } else { /* s = A*p */ hypre_ParCSRMatrixMatvec(1.0, A, p, 0.0, s); } /* */ sdotp = hypre_ParVectorInnerProd(s, p); /* alpha = gamma / */ alpha = gamma / sdotp; /* get tridiagonal matrix */ alphainv = 1.0 / alpha; tridiag[i + 1] = alphainv; tridiag[i] *= beta; tridiag[i] += alphainv; trioffd[i + 1] = alphainv; trioffd[i] *= hypre_sqrt(beta); /* x = x + alpha*p */ /* don't need */ /* r = r - alpha*s */ hypre_ParVectorAxpy(-alpha, s, r); i++; } /* GPU NOTE: * There is a CUDA whitepaper on calculating the eigenvalues of a symmetric * tridiagonal matrix via bisection * https://docs.nvidia.com/cuda/samples/6_Advanced/eigenvalues/doc/eigenvalues.pdf * As well as code in their sample code * https://docs.nvidia.com/cuda/cuda-samples/index.html#eigenvalues * They claim that all code is available under a permissive license * https://developer.nvidia.com/cuda-code-samples * I believe the applicable license is available at * https://docs.nvidia.com/cuda/eula/index.html#license-driver * but I am not certain, nor do I have the legal knowledge to know if the * license is compatible with that which HYPRE is released under. */ hypre_GpuProfilingPopRange(); hypre_GpuProfilingPushRange("ParCSRMaxEigEstimate_TriDiagEigenSolve"); /* eispack routine - eigenvalues return in tridiag and ordered*/ hypre_LINPACKcgtql1(&i, tridiag, trioffd, &err); lambda_max = tridiag[i - 1]; lambda_min = tridiag[0]; hypre_GpuProfilingPopRange(); /* hypre_printf("linpack max eig est = %g\n", lambda_max);*/ /* hypre_printf("linpack min eig est = %g\n", lambda_min);*/ hypre_TFree(tridiag, HYPRE_MEMORY_HOST); hypre_TFree(trioffd, HYPRE_MEMORY_HOST); hypre_ParVectorDestroy(r); hypre_ParVectorDestroy(s); hypre_ParVectorDestroy(p); hypre_ParVectorDestroy(ds); hypre_ParVectorDestroy(u); /* return */ *max_eig = lambda_max; *min_eig = lambda_min; return hypre_error_flag; } #endif hypre-2.33.0/src/parcsr_ls/par_restr.c000066400000000000000000001022251477326011500176620ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "_hypre_parcsr_ls.h" #include "_hypre_blas.h" #include "_hypre_lapack.h" #define AIR_DEBUG 0 #define EPSILON 1e-18 #define EPSIMAC 1e-16 void hypre_fgmresT(HYPRE_Int n, HYPRE_Complex *A, HYPRE_Complex *b, HYPRE_Real tol, HYPRE_Int kdim, HYPRE_Complex *x, HYPRE_Real *relres, HYPRE_Int *iter, HYPRE_Int job); void hypre_ordered_GS(const HYPRE_Complex L[], const HYPRE_Complex rhs[], HYPRE_Complex x[], const HYPRE_Int n); HYPRE_Int hypre_BoomerAMGBuildRestrAIR( hypre_ParCSRMatrix *A, HYPRE_Int *CF_marker, hypre_ParCSRMatrix *S, HYPRE_BigInt *num_cpts_global, HYPRE_Int num_functions, HYPRE_Int *dof_func, HYPRE_Real filter_thresholdR, HYPRE_Int debug_flag, hypre_ParCSRMatrix **R_ptr, HYPRE_Int is_triangular, HYPRE_Int gmres_switch) { HYPRE_UNUSED_VAR(debug_flag); MPI_Comm comm = hypre_ParCSRMatrixComm(A); hypre_ParCSRCommPkg *comm_pkg = hypre_ParCSRMatrixCommPkg(A); hypre_ParCSRCommHandle *comm_handle; /* diag part of A */ hypre_CSRMatrix *A_diag = hypre_ParCSRMatrixDiag(A); HYPRE_Complex *A_diag_data = hypre_CSRMatrixData(A_diag); HYPRE_Int *A_diag_i = hypre_CSRMatrixI(A_diag); HYPRE_Int *A_diag_j = hypre_CSRMatrixJ(A_diag); /* off-diag part of A */ hypre_CSRMatrix *A_offd = hypre_ParCSRMatrixOffd(A); HYPRE_Complex *A_offd_data = hypre_CSRMatrixData(A_offd); HYPRE_Int *A_offd_i = hypre_CSRMatrixI(A_offd); HYPRE_Int *A_offd_j = hypre_CSRMatrixJ(A_offd); HYPRE_Int num_cols_A_offd = hypre_CSRMatrixNumCols(A_offd); HYPRE_BigInt *col_map_offd_A = hypre_ParCSRMatrixColMapOffd(A); /* Strength matrix S */ /* diag part of S */ hypre_CSRMatrix *S_diag = hypre_ParCSRMatrixDiag(S); HYPRE_Int *S_diag_i = hypre_CSRMatrixI(S_diag); HYPRE_Int *S_diag_j = hypre_CSRMatrixJ(S_diag); /* off-diag part of S */ hypre_CSRMatrix *S_offd = hypre_ParCSRMatrixOffd(S); HYPRE_Int *S_offd_i = hypre_CSRMatrixI(S_offd); HYPRE_Int *S_offd_j = hypre_CSRMatrixJ(S_offd); /* Restriction matrix R */ hypre_ParCSRMatrix *R; /* csr's */ hypre_CSRMatrix *R_diag; hypre_CSRMatrix *R_offd; /* arrays */ HYPRE_Complex *R_diag_data; HYPRE_Int *R_diag_i; HYPRE_Int *R_diag_j; HYPRE_Complex *R_offd_data; HYPRE_Int *R_offd_i; HYPRE_Int *R_offd_j; HYPRE_BigInt *col_map_offd_R = NULL; HYPRE_Int *tmp_map_offd = NULL; /* CF marker off-diag part */ HYPRE_Int *CF_marker_offd = NULL; /* func type off-diag part */ HYPRE_Int *dof_func_offd = NULL; /* ghost rows */ hypre_CSRMatrix *A_ext = NULL; HYPRE_Complex *A_ext_data = NULL; HYPRE_Int *A_ext_i = NULL; HYPRE_BigInt *A_ext_j = NULL; HYPRE_Int i, j, k, i1, k1, k2, rr, cc, ic, index, start, local_max_size, local_size, num_cols_offd_R; /* LAPACK */ HYPRE_Complex *DAi, *Dbi, *Dxi; #if AIR_DEBUG HYPRE_Complex *TMPA, *TMPb, *TMPd; #endif HYPRE_Int *Ipi, lapack_info, ione = 1; char charT = 'T'; char Aisol_method; /* if the size of local system is larger than gmres_switch, use GMRES */ HYPRE_Int gmresAi_maxit = 50; HYPRE_Real gmresAi_tol = 1e-3; HYPRE_Int my_id, num_procs; HYPRE_BigInt total_global_cpts/*, my_first_cpt*/; HYPRE_Int nnz_diag, nnz_offd, cnt_diag, cnt_offd; HYPRE_Int *marker_diag, *marker_offd; HYPRE_Int num_sends, *int_buf_data; /* local size, local num of C points */ HYPRE_Int n_fine = hypre_CSRMatrixNumRows(A_diag); HYPRE_Int n_cpts = 0; /* my first column range */ HYPRE_BigInt col_start = hypre_ParCSRMatrixFirstRowIndex(A); HYPRE_BigInt col_end = col_start + (HYPRE_BigInt)n_fine; /* MPI size and rank*/ hypre_MPI_Comm_size(comm, &num_procs); hypre_MPI_Comm_rank(comm, &my_id); /*-------------- global number of C points and my start position */ /*my_first_cpt = num_cpts_global[0];*/ if (my_id == (num_procs - 1)) { total_global_cpts = num_cpts_global[1]; } hypre_MPI_Bcast(&total_global_cpts, 1, HYPRE_MPI_BIG_INT, num_procs - 1, comm); /*------------------------------------------------------------------- * Get the CF_marker data for the off-processor columns *-------------------------------------------------------------------*/ /* CF marker for the off-diag columns */ if (num_cols_A_offd) { CF_marker_offd = hypre_CTAlloc(HYPRE_Int, num_cols_A_offd, HYPRE_MEMORY_HOST); } /* function type indicator for the off-diag columns */ if (num_functions > 1 && num_cols_A_offd) { dof_func_offd = hypre_CTAlloc(HYPRE_Int, num_cols_A_offd, HYPRE_MEMORY_HOST); } /* if CommPkg of A is not present, create it */ if (!comm_pkg) { hypre_MatvecCommPkgCreate(A); comm_pkg = hypre_ParCSRMatrixCommPkg(A); } /* number of sends to do (number of procs) */ num_sends = hypre_ParCSRCommPkgNumSends(comm_pkg); /* send buffer, of size send_map_starts[num_sends]), * i.e., number of entries to send */ int_buf_data = hypre_CTAlloc(HYPRE_Int, hypre_ParCSRCommPkgSendMapStart(comm_pkg, num_sends), HYPRE_MEMORY_HOST); /* copy CF markers of elements to send to buffer * RL: why copy them with two for loops? Why not just loop through all in one */ index = 0; for (i = 0; i < num_sends; i++) { /* start pos of elements sent to send_proc[i] */ start = hypre_ParCSRCommPkgSendMapStart(comm_pkg, i); /* loop through all elems to send_proc[i] */ for (j = start; j < hypre_ParCSRCommPkgSendMapStart(comm_pkg, i + 1); j++) { /* CF marker of send_map_elemts[j] */ int_buf_data[index++] = CF_marker[hypre_ParCSRCommPkgSendMapElmt(comm_pkg, j)]; } } /* create a handle to start communication. 11: for integer */ comm_handle = hypre_ParCSRCommHandleCreate(11, comm_pkg, int_buf_data, CF_marker_offd); /* destroy the handle to finish communication */ hypre_ParCSRCommHandleDestroy(comm_handle); /* do a similar communication for dof_func */ if (num_functions > 1) { index = 0; for (i = 0; i < num_sends; i++) { start = hypre_ParCSRCommPkgSendMapStart(comm_pkg, i); for (j = start; j < hypre_ParCSRCommPkgSendMapStart(comm_pkg, i + 1); j++) { int_buf_data[index++] = dof_func[hypre_ParCSRCommPkgSendMapElmt(comm_pkg, j)]; } } comm_handle = hypre_ParCSRCommHandleCreate(11, comm_pkg, int_buf_data, dof_func_offd); hypre_ParCSRCommHandleDestroy(comm_handle); } /*----------------------------------------------------------------------- * First Pass: Determine the nnz of R and the max local size *-----------------------------------------------------------------------*/ /* nnz in diag and offd parts */ cnt_diag = 0; cnt_offd = 0; /* maximum size of local system: will allocate space of this size */ local_max_size = 0; for (i = 0; i < n_fine; i++) { /* ignore F-points */ if (CF_marker[i] < 0) { continue; } /* local number of C-pts */ n_cpts ++; /* If i is a C-point, the restriction is from the F-points that * strongly influence i */ local_size = 0; /* loop through the diag part of S */ for (j = S_diag_i[i]; j < S_diag_i[i + 1]; j++) { i1 = S_diag_j[j]; /* F point */ if (CF_marker[i1] < 0) { cnt_diag ++; local_size ++; } } /* if parallel, loop through the offd part */ if (num_procs > 1) { /* use this mapping to have offd indices of A */ for (j = S_offd_i[i]; j < S_offd_i[i + 1]; j++) { i1 = S_offd_j[j]; if (CF_marker_offd[i1] < 0) { cnt_offd ++; local_size ++; } } } /* keep ths max size */ local_max_size = hypre_max(local_max_size, local_size); } /* this is because of the indentity matrix in C part * each C-pt has an entry 1.0 */ cnt_diag += n_cpts; nnz_diag = cnt_diag; nnz_offd = cnt_offd; /*------------- allocate arrays */ R_diag_i = hypre_CTAlloc(HYPRE_Int, n_cpts + 1, HYPRE_MEMORY_HOST); R_diag_j = hypre_CTAlloc(HYPRE_Int, nnz_diag, HYPRE_MEMORY_HOST); R_diag_data = hypre_CTAlloc(HYPRE_Complex, nnz_diag, HYPRE_MEMORY_HOST); /* not in ``if num_procs > 1'', * allocation needed even for empty CSR */ R_offd_i = hypre_CTAlloc(HYPRE_Int, n_cpts + 1, HYPRE_MEMORY_HOST); R_offd_j = hypre_CTAlloc(HYPRE_Int, nnz_offd, HYPRE_MEMORY_HOST); R_offd_data = hypre_CTAlloc(HYPRE_Complex, nnz_offd, HYPRE_MEMORY_HOST); /* redundant */ R_diag_i[0] = 0; R_offd_i[0] = 0; /* reset counters */ cnt_diag = 0; cnt_offd = 0; /*---------------------------------------- .-. * Get the GHOST rows of A, (o o) boo! * i.e., adjacent rows to this proc | O \ * whose row indices are in A->col_map_offd \ \ *----------------------------------------- `~~~' */ /* external rows of A that are needed for perform A multiplication, * the last arg means need data * the number of rows is num_cols_A_offd */ if (num_procs > 1) { A_ext = hypre_ParCSRMatrixExtractBExt(A, A, 1); A_ext_i = hypre_CSRMatrixI(A_ext); A_ext_j = hypre_CSRMatrixBigJ(A_ext); A_ext_data = hypre_CSRMatrixData(A_ext); } /* marker array: if this point is i's strong F neighbors * >= 0: yes, and is the local dense id * == -1: no */ marker_diag = hypre_CTAlloc(HYPRE_Int, n_fine, HYPRE_MEMORY_HOST); for (i = 0; i < n_fine; i++) { marker_diag[i] = -1; } marker_offd = hypre_CTAlloc(HYPRE_Int, num_cols_A_offd, HYPRE_MEMORY_HOST); for (i = 0; i < num_cols_A_offd; i++) { marker_offd[i] = -1; } // Allocate the rhs and dense local matrix in column-major form (for LAPACK) DAi = hypre_CTAlloc(HYPRE_Complex, local_max_size * local_max_size, HYPRE_MEMORY_HOST); Dbi = hypre_CTAlloc(HYPRE_Complex, local_max_size, HYPRE_MEMORY_HOST); Dxi = hypre_CTAlloc(HYPRE_Complex, local_max_size, HYPRE_MEMORY_HOST); Ipi = hypre_CTAlloc(HYPRE_Int, local_max_size, HYPRE_MEMORY_HOST); // pivot matrix // Allocate memory for GMRES if it will be used HYPRE_Int kdim_max = hypre_min(gmresAi_maxit, local_max_size); if (gmres_switch < local_max_size) { hypre_fgmresT(local_max_size, NULL, NULL, 0.0, kdim_max, NULL, NULL, NULL, -1); } #if AIR_DEBUG /* FOR DEBUG */ TMPA = hypre_CTAlloc(HYPRE_Complex, local_max_size * local_max_size, HYPRE_MEMORY_HOST); TMPb = hypre_CTAlloc(HYPRE_Complex, local_max_size, HYPRE_MEMORY_HOST); TMPd = hypre_CTAlloc(HYPRE_Complex, local_max_size, HYPRE_MEMORY_HOST); #endif /*----------------------------------------------------------------------- * Second Pass: Populate R *-----------------------------------------------------------------------*/ for (i = 0, ic = 0; i < n_fine; i++) { /* ignore F-points */ if (CF_marker[i] < 0) { continue; } /* size of Ai, bi */ local_size = 0; /* If i is a C-point, build the restriction, from the F-points that * strongly influence i * Access S for the first time, mark the points we want */ /* 1: loop through the diag part of S */ for (j = S_diag_i[i]; j < S_diag_i[i + 1]; j++) { i1 = S_diag_j[j]; /* F point */ if (CF_marker[i1] < 0) { hypre_assert(marker_diag[i1] == -1); /* mark this point */ marker_diag[i1] = local_size ++; } } /* 2: if parallel, loop through the offd part */ if (num_procs > 1) { for (j = S_offd_i[i]; j < S_offd_i[i + 1]; j++) { /* use this mapping to have offd indices of A */ i1 = S_offd_j[j]; /* F-point */ if (CF_marker_offd[i1] < 0) { hypre_assert(marker_offd[i1] == -1); /* mark this point */ marker_offd[i1] = local_size ++; } } } /* DEBUG FOR local_size == 0 */ /* if (local_size == 0) { printf("my_id %d: ", my_id); for (j = S_diag_i[i]; j < S_diag_i[i+1]; j++) { i1 = S_diag_j[j]; printf("%d[d, %d] ", i1, CF_marker[i1]); } printf("\n"); for (j = S_offd_i[i]; j < S_offd_i[i+1]; j++) { i1 = S_offd_j[j]; printf("%d[o, %d] ", i1, CF_marker_offd[i1]); } printf("\n"); exit(0); } */ /* Second, copy values to local system: Ai and bi from A */ /* now we have marked all rows/cols we want. next we extract the entries * we need from these rows and put them in Ai and bi*/ /* clear DAi and bi */ memset(DAi, 0, local_size * local_size * sizeof(HYPRE_Complex)); memset(Dxi, 0, local_size * sizeof(HYPRE_Complex)); memset(Dbi, 0, local_size * sizeof(HYPRE_Complex)); /* we will populate Ai, bi row-by-row * rr is the local dense matrix row counter */ rr = 0; /* 1. diag part of row i */ for (j = S_diag_i[i]; j < S_diag_i[i + 1]; j++) { /* row i1 */ i1 = S_diag_j[j]; /* i1 is an F point */ if (CF_marker[i1] < 0) { /* go through row i1 of A: a local row */ /* diag part of row i1 */ for (k = A_diag_i[i1]; k < A_diag_i[i1 + 1]; k++) { k1 = A_diag_j[k]; /* if this col is marked with its local dense id */ if ((cc = marker_diag[k1]) >= 0) { hypre_assert(CF_marker[k1] < 0); /* copy the value */ /* rr and cc: local dense ids */ DAi[rr + cc * local_size] = A_diag_data[k]; } } /* if parallel, offd part of row i1 */ if (num_procs > 1) { for (k = A_offd_i[i1]; k < A_offd_i[i1 + 1]; k++) { k1 = A_offd_j[k]; /* if this col is marked with its local dense id */ if ((cc = marker_offd[k1]) >= 0) { hypre_assert(CF_marker_offd[k1] < 0); /* copy the value */ /* rr and cc: local dense ids */ DAi[rr + cc * local_size] = A_offd_data[k]; } } } /* done with row i1 */ rr++; } } /* for (j=...), diag part of row i done */ /* 2. if parallel, offd part of row i. The corresponding rows are * in matrix A_ext */ if (num_procs > 1) { HYPRE_BigInt big_k1; for (j = S_offd_i[i]; j < S_offd_i[i + 1]; j++) { /* row i1: use this mapping to have offd indices of A */ i1 = S_offd_j[j]; /* if this is an F point */ if (CF_marker_offd[i1] < 0) { /* loop through row i1 of A_ext, a global CSR matrix */ for (k = A_ext_i[i1]; k < A_ext_i[i1 + 1]; k++) { /* k1 is a global index! */ big_k1 = A_ext_j[k]; if (big_k1 >= col_start && big_k1 < col_end) { /* big_k1 is in the diag part, adjust to local index */ k1 = (HYPRE_Int)(big_k1 - col_start); /* if this col is marked with its local dense id*/ if ((cc = marker_diag[k1]) >= 0) { hypre_assert(CF_marker[k1] < 0); /* copy the value */ /* rr and cc: local dense ids */ DAi[rr + cc * local_size] = A_ext_data[k]; } } else { /* k1 is in the offd part * search k1 in A->col_map_offd */ k2 = hypre_BigBinarySearch(col_map_offd_A, big_k1, num_cols_A_offd); /* if found, k2 is the position of column id k1 in col_map_offd */ if (k2 > -1) { /* if this col is marked with its local dense id */ if ((cc = marker_offd[k2]) >= 0) { hypre_assert(CF_marker_offd[k2] < 0); /* copy the value */ /* rr and cc: local dense ids */ DAi[rr + cc * local_size] = A_ext_data[k]; } } } } /* done with row i1 */ rr++; } } } hypre_assert(rr == local_size); /* assemble rhs bi: entries from row i of A */ rr = 0; /* diag part */ for (j = A_diag_i[i]; j < A_diag_i[i + 1]; j++) { i1 = A_diag_j[j]; if ((cc = marker_diag[i1]) >= 0) { /* this should be true but not very important * what does it say is that eqn order == unknown order * this is true, since order in A is preserved in S */ hypre_assert(rr == cc); /* Note the sign change */ Dbi[cc] = -A_diag_data[j]; rr++; } } /* if parallel, offd part */ if (num_procs > 1) { for (j = A_offd_i[i]; j < A_offd_i[i + 1]; j++) { i1 = A_offd_j[j]; if ((cc = marker_offd[i1]) >= 0) { /* this should be true but not very important * what does it say is that eqn order == unknown order * this is true, since order in A is preserved in S */ hypre_assert(rr == cc); /* Note the sign change */ Dbi[cc] = -A_offd_data[j]; rr++; } } } hypre_assert(rr == local_size); /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - * We have Ai and bi built. Solve the linear system by: * - forward solve for triangular matrix * - LU factorization (LAPACK) for local_size <= gmres_switch * - Dense GMRES for local_size > gmres_switch *- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/ Aisol_method = local_size <= gmres_switch ? 'L' : 'G'; if (local_size > 0) { if (is_triangular) { hypre_ordered_GS(DAi, Dbi, Dxi, local_size); #if AIR_DEBUG HYPRE_Real alp = -1.0, err; colmaj_mvT(DAi, Dxi, TMPd, local_size); hypre_daxpy(&local_size, &alp, Dbi, &ione, TMPd, &ione); err = hypre_dnrm2(&local_size, TMPd, &ione); if (err > 1e-8) { hypre_printf("triangular solve res: %e\n", err); exit(0); } #endif } // Solve using LAPACK and LU factorization else if (Aisol_method == 'L') { #if AIR_DEBUG memcpy(TMPA, DAi, local_size * local_size * sizeof(HYPRE_Complex)); memcpy(TMPb, Dbi, local_size * sizeof(HYPRE_Complex)); #endif lapack_info = 0; hypre_dgetrf(&local_size, &local_size, DAi, &local_size, Ipi, &lapack_info); hypre_assert(lapack_info == 0); if (lapack_info == 0) { /* solve A_i^T x_i = b_i, * solution is saved in b_i on return */ hypre_dgetrs(&charT, &local_size, &ione, DAi, &local_size, Ipi, Dbi, &local_size, &lapack_info); hypre_assert(lapack_info == 0); } #if AIR_DEBUG HYPRE_Real alp = 1.0, bet = 0.0, err; hypre_dgemv(&charT, &local_size, &local_size, &alp, TMPA, &local_size, Dbi, &ione, &bet, TMPd, &ione); alp = -1.0; hypre_daxpy(&local_size, &alp, TMPb, &ione, TMPd, &ione); err = hypre_dnrm2(&local_size, TMPd, &ione); if (err > 1e-8) { hypre_printf("dense: local res norm %e\n", err); exit(0); } #endif } // Solve by GMRES else { HYPRE_Real gmresAi_res; HYPRE_Int gmresAi_niter; HYPRE_Int kdim = hypre_min(gmresAi_maxit, local_size); hypre_fgmresT(local_size, DAi, Dbi, gmresAi_tol, kdim, Dxi, &gmresAi_res, &gmresAi_niter, 0); if (gmresAi_res > gmresAi_tol) { hypre_printf("gmres/jacobi not converge to %e: final_res %e\n", gmresAi_tol, gmresAi_res); } #if AIR_DEBUG HYPRE_Real err, nrmb; colmaj_mvT(DAi, Dxi, TMPd, local_size); HYPRE_Real alp = -1.0; nrmb = hypre_dnrm2(&local_size, Dbi, &ione); hypre_daxpy(&local_size, &alp, Dbi, &ione, TMPd, &ione); err = hypre_dnrm2(&local_size, TMPd, &ione); if (err / nrmb > gmresAi_tol) { hypre_printf("GMRES/Jacobi: res norm %e, nrmb %e, relative %e\n", err, nrmb, err / nrmb); hypre_printf("GMRES/Jacobi: relative %e\n", gmresAi_res); exit(0); } #endif } } HYPRE_Complex *Soli = (is_triangular || (Aisol_method == 'G')) ? Dxi : Dbi; /* now we are ready to fill this row of R */ /* diag part */ rr = 0; for (j = S_diag_i[i]; j < S_diag_i[i + 1]; j++) { i1 = S_diag_j[j]; /* F point */ if (CF_marker[i1] < 0) { hypre_assert(marker_diag[i1] == rr); /* col idx: use i1, local idx */ R_diag_j[cnt_diag] = i1; /* copy the value */ R_diag_data[cnt_diag++] = Soli[rr++]; } } /* don't forget the identity to this row */ /* global col idx of this entry is ``col_start + i''; */ R_diag_j[cnt_diag] = i; R_diag_data[cnt_diag++] = 1.0; /* row ptr of the next row */ R_diag_i[ic + 1] = cnt_diag; /* offd part */ if (num_procs > 1) { for (j = S_offd_i[i]; j < S_offd_i[i + 1]; j++) { /* use this mapping to have offd indices of A */ i1 = S_offd_j[j]; /* F-point */ if (CF_marker_offd[i1] < 0) { hypre_assert(marker_offd[i1] == rr); /* col idx: use the local col id of A_offd, * and you will see why later (very soon!) */ R_offd_j[cnt_offd] = i1; /* copy the value */ R_offd_data[cnt_offd++] = Soli[rr++]; } } } /* row ptr of the next row */ R_offd_i[ic + 1] = cnt_offd; /* we must have copied all entries */ hypre_assert(rr == local_size); /* reset markers */ for (j = S_diag_i[i]; j < S_diag_i[i + 1]; j++) { i1 = S_diag_j[j]; /* F point */ if (CF_marker[i1] < 0) { hypre_assert(marker_diag[i1] >= 0); marker_diag[i1] = -1; } } if (num_procs > 1) { for (j = S_offd_i[i]; j < S_offd_i[i + 1]; j++) { /* use this mapping to have offd indices of A */ i1 = S_offd_j[j]; /* F-point */ if (CF_marker_offd[i1] < 0) { hypre_assert(marker_offd[i1] >= 0); marker_offd[i1] = -1; } } } /* next C-pt */ ic++; } /* outermost loop, for (i=0,...), for each C-pt find restriction */ hypre_assert(ic == n_cpts); hypre_assert(cnt_diag == nnz_diag); hypre_assert(cnt_offd == nnz_offd); /* num of cols in the offd part of R */ num_cols_offd_R = 0; /* to this point, marker_offd should be all -1 */ for (i = 0; i < nnz_offd; i++) { i1 = R_offd_j[i]; if (marker_offd[i1] == -1) { num_cols_offd_R++; marker_offd[i1] = 1; } } /* col_map_offd_R: the col indices of the offd of R * we first keep them be the offd-idx of A */ if (num_cols_offd_R) { col_map_offd_R = hypre_CTAlloc(HYPRE_BigInt, num_cols_offd_R, HYPRE_MEMORY_HOST); tmp_map_offd = hypre_CTAlloc(HYPRE_Int, num_cols_offd_R, HYPRE_MEMORY_HOST); } for (i = 0, i1 = 0; i < num_cols_A_offd; i++) { if (marker_offd[i] == 1) { tmp_map_offd[i1++] = i; } } hypre_assert(i1 == num_cols_offd_R); /* now, adjust R_offd_j to local idx w.r.t col_map_offd_R * by searching */ for (i = 0; i < nnz_offd; i++) { i1 = R_offd_j[i]; k1 = hypre_BinarySearch(tmp_map_offd, i1, num_cols_offd_R); /* search must succeed */ hypre_assert(k1 >= 0 && k1 < num_cols_offd_R); R_offd_j[i] = k1; } /* change col_map_offd_R to global ids */ for (i = 0; i < num_cols_offd_R; i++) { col_map_offd_R[i] = col_map_offd_A[tmp_map_offd[i]]; } /* Now, we should have everything of Parcsr matrix R */ R = hypre_ParCSRMatrixCreate(comm, total_global_cpts, /* global num of rows */ hypre_ParCSRMatrixGlobalNumRows(A), /* global num of cols */ num_cpts_global, /* row_starts */ hypre_ParCSRMatrixRowStarts(A), /* col_starts */ num_cols_offd_R, /* num cols offd */ nnz_diag, nnz_offd); R_diag = hypre_ParCSRMatrixDiag(R); hypre_CSRMatrixData(R_diag) = R_diag_data; hypre_CSRMatrixI(R_diag) = R_diag_i; hypre_CSRMatrixJ(R_diag) = R_diag_j; R_offd = hypre_ParCSRMatrixOffd(R); hypre_CSRMatrixData(R_offd) = R_offd_data; hypre_CSRMatrixI(R_offd) = R_offd_i; hypre_CSRMatrixJ(R_offd) = R_offd_j; hypre_ParCSRMatrixColMapOffd(R) = col_map_offd_R; /* create CommPkg of R */ hypre_ParCSRMatrixAssumedPartition(R) = hypre_ParCSRMatrixAssumedPartition(A); hypre_ParCSRMatrixOwnsAssumedPartition(R) = 0; hypre_MatvecCommPkgCreate(R); /* Filter small entries from R */ if (filter_thresholdR > 0) { hypre_ParCSRMatrixDropSmallEntries(R, filter_thresholdR, -1); } *R_ptr = R; /* free workspace */ hypre_TFree(tmp_map_offd, HYPRE_MEMORY_HOST); hypre_TFree(CF_marker_offd, HYPRE_MEMORY_HOST); hypre_TFree(dof_func_offd, HYPRE_MEMORY_HOST); hypre_TFree(int_buf_data, HYPRE_MEMORY_HOST); hypre_TFree(marker_diag, HYPRE_MEMORY_HOST); hypre_TFree(marker_offd, HYPRE_MEMORY_HOST); hypre_TFree(DAi, HYPRE_MEMORY_HOST); hypre_TFree(Dbi, HYPRE_MEMORY_HOST); hypre_TFree(Dxi, HYPRE_MEMORY_HOST); #if AIR_DEBUG hypre_TFree(TMPA, HYPRE_MEMORY_HOST); hypre_TFree(TMPb, HYPRE_MEMORY_HOST); hypre_TFree(TMPd, HYPRE_MEMORY_HOST); #endif hypre_TFree(Ipi, HYPRE_MEMORY_HOST); if (num_procs > 1) { hypre_CSRMatrixDestroy(A_ext); } if (gmres_switch < local_max_size) { hypre_fgmresT(0, NULL, NULL, 0.0, 0, NULL, NULL, NULL, -2); } return 0; } /* Compute matvec A^Tx = y, where A is stored in column major form. */ // This can also probably be accomplished with BLAS static inline void colmaj_mvT(HYPRE_Complex *A, HYPRE_Complex *x, HYPRE_Complex *y, HYPRE_Int n) { memset(y, 0, n * sizeof(HYPRE_Complex)); HYPRE_Int i, j; for (i = 0; i < n; i++) { HYPRE_Int row0 = i * n; for (j = 0; j < n; j++) { y[i] += x[j] * A[row0 + j]; } } } // TODO : need to initialize and de-initialize GMRES void hypre_fgmresT(HYPRE_Int n, HYPRE_Complex *A, HYPRE_Complex *b, HYPRE_Real tol, HYPRE_Int kdim, HYPRE_Complex *x, HYPRE_Real *relres, HYPRE_Int *iter, HYPRE_Int job) { HYPRE_Int one = 1, i, j, k; static HYPRE_Complex *V = NULL, *Z = NULL, *H = NULL, *c = NULL, *s = NULL, *rs = NULL; HYPRE_Complex *v, *z, *w; HYPRE_Real t, normr, normr0, tolr; if (job == -1) { V = hypre_TAlloc(HYPRE_Complex, n * (kdim + 1), HYPRE_MEMORY_HOST); /* Z = hypre_TAlloc(HYPRE_Complex, n*kdim, HYPRE_MEMORY_HOST); */ /* XXX NO PRECOND */ Z = V; H = hypre_TAlloc(HYPRE_Complex, (kdim + 1) * kdim, HYPRE_MEMORY_HOST); c = hypre_TAlloc(HYPRE_Complex, kdim, HYPRE_MEMORY_HOST); s = hypre_TAlloc(HYPRE_Complex, kdim, HYPRE_MEMORY_HOST); rs = hypre_TAlloc(HYPRE_Complex, kdim + 1, HYPRE_MEMORY_HOST); return; } else if (job == -2) { hypre_TFree(V, HYPRE_MEMORY_HOST); /* hypre_TFree(Z, HYPRE_MEMORY_HOST); */ Z = NULL; hypre_TFree(H, HYPRE_MEMORY_HOST); hypre_TFree(c, HYPRE_MEMORY_HOST); hypre_TFree(s, HYPRE_MEMORY_HOST); hypre_TFree(rs, HYPRE_MEMORY_HOST); return; } /* XXX: x_0 is all ZERO !!! so r0 = b */ v = V; hypre_TMemcpy(v, b, HYPRE_Complex, n, HYPRE_MEMORY_HOST, HYPRE_MEMORY_HOST); normr = normr0 = hypre_sqrt(hypre_ddot(&n, v, &one, v, &one)); if (normr0 < EPSIMAC) { return; } tolr = tol * normr0; rs[0] = normr0; t = 1.0 / normr0; hypre_dscal(&n, &t, v, &one); i = 0; while (i < kdim) { i++; // zi = M^{-1} * vi; v = V + (i - 1) * n; z = Z + (i - 1) * n; /* XXX NO PRECOND */ /* memcpy(z, v, n*sizeof(HYPRE_Complex)); */ // w = v_{i+1} = A * zi w = V + i * n; colmaj_mvT(A, z, w, n); // modified Gram-schmidt for (j = 0; j < i; j++) { v = V + j * n; H[j + (i - 1)*kdim] = t = hypre_ddot(&n, v, &one, w, &one); t = -t; hypre_daxpy(&n, &t, v, &one, w, &one); } H[i + (i - 1)*kdim] = t = hypre_sqrt(hypre_ddot(&n, w, &one, w, &one)); if (hypre_abs(t) > EPSILON) { t = 1.0 / t; hypre_dscal(&n, &t, w, &one); } // Least square problem of H for (j = 1; j < i; j++) { t = H[j - 1 + (i - 1) * kdim]; H[j - 1 + (i - 1)*kdim] = c[j - 1] * t + s[j - 1] * H[j + (i - 1) * kdim]; H[j + (i - 1)*kdim] = -s[j - 1] * t + c[j - 1] * H[j + (i - 1) * kdim]; } HYPRE_Complex hii = H[i - 1 + (i - 1) * kdim]; HYPRE_Complex hii1 = H[i + (i - 1) * kdim]; HYPRE_Complex gam = hypre_sqrt(hii * hii + hii1 * hii1); if (hypre_cabs(gam) < EPSILON) { gam = EPSIMAC; } c[i - 1] = hii / gam; s[i - 1] = hii1 / gam; rs[i] = -s[i - 1] * rs[i - 1]; rs[i - 1] = c[i - 1] * rs[i - 1]; // residue norm H[i - 1 + (i - 1)*kdim] = c[i - 1] * hii + s[i - 1] * hii1; normr = hypre_cabs(rs[i]); if (normr <= tolr) { break; } } // solve the upper triangular system rs[i - 1] /= H[i - 1 + (i - 1) * kdim]; for (k = i - 2; k >= 0; k--) { for (j = k + 1; j < i; j++) { rs[k] -= H[k + j * kdim] * rs[j]; } rs[k] /= H[k + k * kdim]; } // get solution for (j = 0; j < i; j++) { z = Z + j * n; hypre_daxpy(&n, rs + j, z, &one, x, &one); } *relres = normr / normr0; *iter = i; } /* Ordered Gauss Seidel on A^T in column major format. Since we are * solving A^T, equivalent to solving A in row major format. */ void hypre_ordered_GS(const HYPRE_Complex L[], const HYPRE_Complex rhs[], HYPRE_Complex x[], const HYPRE_Int n) { // Get triangular ordering of L^T in col major as ordering of L in row major HYPRE_Int *ordering = hypre_TAlloc(HYPRE_Int, n, HYPRE_MEMORY_HOST); hypre_dense_topo_sort(L, ordering, n, 0); // Ordered Gauss-Seidel iteration HYPRE_Int i, col; for (i = 0; i < n; i++) { HYPRE_Int row = ordering[i]; HYPRE_Complex temp = rhs[row]; for (col = 0; col < n; col++) { if (col != row) { temp -= L[row * n + col] * x[col]; // row-major } } HYPRE_Complex diag = L[row * n + row]; if (hypre_cabs(diag) < 1e-12) { x[row] = 0.0; } else { x[row] = temp / diag; } } hypre_TFree(ordering, HYPRE_MEMORY_HOST); } hypre-2.33.0/src/parcsr_ls/par_rotate_7pt.c000066400000000000000000000262741477326011500206240ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "_hypre_parcsr_ls.h" /*-------------------------------------------------------------------------- * hypre_GenerateLaplacian9pt *--------------------------------------------------------------------------*/ HYPRE_ParCSRMatrix GenerateRotate7pt( MPI_Comm comm, HYPRE_BigInt nx, HYPRE_BigInt ny, HYPRE_Int P, HYPRE_Int Q, HYPRE_Int p, HYPRE_Int q, HYPRE_Real alpha, HYPRE_Real eps ) { hypre_ParCSRMatrix *A; hypre_CSRMatrix *diag; hypre_CSRMatrix *offd; HYPRE_Int *diag_i; HYPRE_Int *diag_j; HYPRE_Real *diag_data; HYPRE_Int *offd_i; HYPRE_Int *offd_j = NULL; HYPRE_Real *offd_data = NULL; HYPRE_Real *value; HYPRE_Real ac, bc, cc, s, c, pi, x; HYPRE_BigInt global_part[2]; HYPRE_BigInt ix, iy; HYPRE_Int cnt, o_cnt; HYPRE_Int local_num_rows; HYPRE_BigInt *col_map_offd; HYPRE_BigInt *big_offd_j = NULL; HYPRE_Int row_index; HYPRE_Int i; HYPRE_Int nx_local, ny_local; HYPRE_Int num_cols_offd; HYPRE_BigInt grid_size; HYPRE_BigInt *nx_part; HYPRE_BigInt *ny_part; HYPRE_Int num_procs; HYPRE_Int P_busy, Q_busy; hypre_MPI_Comm_size(comm, &num_procs); grid_size = nx * ny; value = hypre_CTAlloc(HYPRE_Real, 4, HYPRE_MEMORY_HOST); pi = 4.0 * hypre_atan(1.0); x = pi * alpha / 180.0; s = hypre_sin(x); c = hypre_cos(x); ac = -(c * c + eps * s * s); bc = 2.0 * (1.0 - eps) * s * c; cc = -(s * s + eps * c * c); value[0] = -2 * (2 * ac + bc + 2 * cc); value[1] = 2 * ac + bc; value[2] = bc + 2 * cc; value[3] = -bc; hypre_GeneratePartitioning(nx, P, &nx_part); hypre_GeneratePartitioning(ny, Q, &ny_part); nx_local = (HYPRE_Int)(nx_part[p + 1] - nx_part[p]); ny_local = (HYPRE_Int)(ny_part[q + 1] - ny_part[q]); local_num_rows = nx_local * ny_local; global_part[0] = ny_part[q] * nx + nx_part[p] * ny_local; global_part[1] = global_part[0] + (HYPRE_BigInt)local_num_rows; diag_i = hypre_CTAlloc(HYPRE_Int, local_num_rows + 1, HYPRE_MEMORY_HOST); offd_i = hypre_CTAlloc(HYPRE_Int, local_num_rows + 1, HYPRE_MEMORY_HOST); P_busy = hypre_min(nx, P); Q_busy = hypre_min(ny, Q); num_cols_offd = 0; if (p) { num_cols_offd += ny_local; } if (p < P_busy - 1) { num_cols_offd += ny_local; } if (q) { num_cols_offd += nx_local; } if (q < Q_busy - 1) { num_cols_offd += nx_local; } if (p && q) { num_cols_offd++; } if (p && q < Q_busy - 1 ) { num_cols_offd++; } if (p < P_busy - 1 && q ) { num_cols_offd++; } if (p < P_busy - 1 && q < Q_busy - 1 ) { num_cols_offd++; } if (!local_num_rows) { num_cols_offd = 0; } col_map_offd = hypre_CTAlloc(HYPRE_BigInt, num_cols_offd, HYPRE_MEMORY_HOST); cnt = 0; o_cnt = 0; diag_i[0] = 0; offd_i[0] = 0; for (iy = ny_part[q]; iy < ny_part[q + 1]; iy++) { for (ix = nx_part[p]; ix < nx_part[p + 1]; ix++) { cnt++; o_cnt++; diag_i[cnt] = diag_i[cnt - 1]; offd_i[o_cnt] = offd_i[o_cnt - 1]; diag_i[cnt]++; if (iy > ny_part[q]) { diag_i[cnt]++; if (ix > nx_part[p]) { diag_i[cnt]++; } else { if (ix) { offd_i[o_cnt]++; } } } else { if (iy) { offd_i[o_cnt]++; if (ix > nx_part[p]) { offd_i[o_cnt]++; } else if (ix) { offd_i[o_cnt]++; } } } if (ix > nx_part[p]) { diag_i[cnt]++; } else { if (ix) { offd_i[o_cnt]++; } } if (ix + 1 < nx_part[p + 1]) { diag_i[cnt]++; } else { if (ix + 1 < nx) { offd_i[o_cnt]++; } } if (iy + 1 < ny_part[q + 1]) { diag_i[cnt]++; if (ix < nx_part[p + 1] - 1) { diag_i[cnt]++; } else { if (ix + 1 < nx) { offd_i[o_cnt]++; } } } else { if (iy + 1 < ny) { offd_i[o_cnt]++; if (ix < nx_part[p + 1] - 1) { offd_i[o_cnt]++; } else if (ix < nx - 1) { offd_i[o_cnt]++; } } } } } diag_j = hypre_CTAlloc(HYPRE_Int, diag_i[local_num_rows], HYPRE_MEMORY_HOST); diag_data = hypre_CTAlloc(HYPRE_Real, diag_i[local_num_rows], HYPRE_MEMORY_HOST); if (num_procs > 1) { big_offd_j = hypre_CTAlloc(HYPRE_BigInt, offd_i[local_num_rows], HYPRE_MEMORY_HOST); offd_j = hypre_CTAlloc(HYPRE_Int, offd_i[local_num_rows], HYPRE_MEMORY_HOST); offd_data = hypre_CTAlloc(HYPRE_Real, offd_i[local_num_rows], HYPRE_MEMORY_HOST); } row_index = 0; cnt = 0; o_cnt = 0; for (iy = ny_part[q]; iy < ny_part[q + 1]; iy++) { for (ix = nx_part[p]; ix < nx_part[p + 1]; ix++) { diag_j[cnt] = row_index; diag_data[cnt++] = value[0]; if (iy > ny_part[q]) { if (ix > nx_part[p]) { diag_j[cnt] = row_index - nx_local - 1 ; diag_data[cnt++] = value[3]; } else { if (ix) { big_offd_j[o_cnt] = hypre_map2(ix - 1, iy - 1, p - 1, q, nx, nx_part, ny_part); offd_data[o_cnt++] = value[3]; } } diag_j[cnt] = row_index - nx_local; diag_data[cnt++] = value[2]; } else { if (iy) { if (ix > nx_part[p]) { big_offd_j[o_cnt] = hypre_map2(ix - 1, iy - 1, p, q - 1, nx, nx_part, ny_part); offd_data[o_cnt++] = value[3]; } else if (ix) { big_offd_j[o_cnt] = hypre_map2(ix - 1, iy - 1, p - 1, q - 1, nx, nx_part, ny_part); offd_data[o_cnt++] = value[3]; } big_offd_j[o_cnt] = hypre_map2(ix, iy - 1, p, q - 1, nx, nx_part, ny_part); offd_data[o_cnt++] = value[2]; } } if (ix > nx_part[p]) { diag_j[cnt] = row_index - 1; diag_data[cnt++] = value[1]; } else { if (ix) { big_offd_j[o_cnt] = hypre_map2(ix - 1, iy, p - 1, q, nx, nx_part, ny_part); offd_data[o_cnt++] = value[1]; } } if (ix + 1 < nx_part[p + 1]) { diag_j[cnt] = row_index + 1; diag_data[cnt++] = value[1]; } else { if (ix + 1 < nx) { big_offd_j[o_cnt] = hypre_map2(ix + 1, iy, p + 1, q, nx, nx_part, ny_part); offd_data[o_cnt++] = value[1]; } } if (iy + 1 < ny_part[q + 1]) { diag_j[cnt] = row_index + nx_local; diag_data[cnt++] = value[2]; if (ix < nx_part[p + 1] - 1) { diag_j[cnt] = row_index + nx_local + 1 ; diag_data[cnt++] = value[3]; } else { if (ix + 1 < nx) { big_offd_j[o_cnt] = hypre_map2(ix + 1, iy + 1, p + 1, q, nx, nx_part, ny_part); offd_data[o_cnt++] = value[3]; } } } else { if (iy + 1 < ny) { big_offd_j[o_cnt] = hypre_map2(ix, iy + 1, p, q + 1, nx, nx_part, ny_part); offd_data[o_cnt++] = value[2]; if (ix < nx_part[p + 1] - 1) { big_offd_j[o_cnt] = hypre_map2(ix + 1, iy + 1, p, q + 1, nx, nx_part, ny_part); offd_data[o_cnt++] = value[3]; } else if (ix < nx - 1) { big_offd_j[o_cnt] = hypre_map2(ix + 1, iy + 1, p + 1, q + 1, nx, nx_part, ny_part); offd_data[o_cnt++] = value[3]; } } } row_index++; } } if (num_procs > 1) { HYPRE_BigInt *work = hypre_CTAlloc(HYPRE_BigInt, o_cnt, HYPRE_MEMORY_HOST); for (i = 0; i < o_cnt; i++) { work[i] = big_offd_j[i]; } hypre_BigQsort0(work, 0, o_cnt - 1); col_map_offd[0] = work[0]; cnt = 0; for (i = 0; i < o_cnt; i++) { if (work[i] > col_map_offd[cnt]) { cnt++; col_map_offd[cnt] = work[i]; } } num_cols_offd = cnt + 1; for (i = 0; i < o_cnt; i++) { offd_j[i] = hypre_BigBinarySearch(col_map_offd, big_offd_j[i], num_cols_offd); } hypre_TFree(work, HYPRE_MEMORY_HOST); hypre_TFree(big_offd_j, HYPRE_MEMORY_HOST); } A = hypre_ParCSRMatrixCreate(comm, grid_size, grid_size, global_part, global_part, num_cols_offd, diag_i[local_num_rows], offd_i[local_num_rows]); hypre_ParCSRMatrixColMapOffd(A) = col_map_offd; diag = hypre_ParCSRMatrixDiag(A); hypre_CSRMatrixI(diag) = diag_i; hypre_CSRMatrixJ(diag) = diag_j; hypre_CSRMatrixData(diag) = diag_data; offd = hypre_ParCSRMatrixOffd(A); hypre_CSRMatrixI(offd) = offd_i; if (num_cols_offd) { hypre_CSRMatrixJ(offd) = offd_j; hypre_CSRMatrixData(offd) = offd_data; } hypre_CSRMatrixMemoryLocation(diag) = HYPRE_MEMORY_HOST; hypre_CSRMatrixMemoryLocation(offd) = HYPRE_MEMORY_HOST; hypre_ParCSRMatrixMigrate(A, hypre_HandleMemoryLocation(hypre_handle())); hypre_TFree(nx_part, HYPRE_MEMORY_HOST); hypre_TFree(ny_part, HYPRE_MEMORY_HOST); hypre_TFree(value, HYPRE_MEMORY_HOST); return (HYPRE_ParCSRMatrix) A; } hypre-2.33.0/src/parcsr_ls/par_scaled_matnorm.c000066400000000000000000000107561477326011500215220ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * computes |D^-1/2 A D^-1/2 |_sup where D diagonal matrix * *****************************************************************************/ #include "_hypre_parcsr_ls.h" /*-------------------------------------------------------------------------- * hypre_ParCSRMatrixScaledNorm *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ParCSRMatrixScaledNorm( hypre_ParCSRMatrix *A, HYPRE_Real *scnorm) { hypre_ParCSRCommHandle *comm_handle; hypre_ParCSRCommPkg *comm_pkg = hypre_ParCSRMatrixCommPkg(A); MPI_Comm comm = hypre_ParCSRMatrixComm(A); hypre_CSRMatrix *diag = hypre_ParCSRMatrixDiag(A); HYPRE_Int *diag_i = hypre_CSRMatrixI(diag); HYPRE_Int *diag_j = hypre_CSRMatrixJ(diag); HYPRE_Real *diag_data = hypre_CSRMatrixData(diag); hypre_CSRMatrix *offd = hypre_ParCSRMatrixOffd(A); HYPRE_Int *offd_i = hypre_CSRMatrixI(offd); HYPRE_Int *offd_j = hypre_CSRMatrixJ(offd); HYPRE_Real *offd_data = hypre_CSRMatrixData(offd); HYPRE_BigInt global_num_rows = hypre_ParCSRMatrixGlobalNumRows(A); HYPRE_BigInt *row_starts = hypre_ParCSRMatrixRowStarts(A); HYPRE_Int num_rows = hypre_CSRMatrixNumRows(diag); hypre_ParVector *dinvsqrt; HYPRE_Real *dis_data; hypre_Vector *dis_ext; HYPRE_Real *dis_ext_data; hypre_Vector *sum; HYPRE_Real *sum_data; HYPRE_Int num_cols_offd = hypre_CSRMatrixNumCols(offd); HYPRE_Int num_sends, i, j, index, start; HYPRE_Real *d_buf_data; HYPRE_Real mat_norm, max_row_sum; dinvsqrt = hypre_ParVectorCreate(comm, global_num_rows, row_starts); hypre_ParVectorInitialize(dinvsqrt); dis_data = hypre_VectorData(hypre_ParVectorLocalVector(dinvsqrt)); dis_ext = hypre_SeqVectorCreate(num_cols_offd); hypre_SeqVectorInitialize(dis_ext); dis_ext_data = hypre_VectorData(dis_ext); sum = hypre_SeqVectorCreate(num_rows); hypre_SeqVectorInitialize(sum); sum_data = hypre_VectorData(sum); /* generate dinvsqrt */ for (i = 0; i < num_rows; i++) { dis_data[i] = 1.0 / hypre_sqrt(hypre_abs(diag_data[diag_i[i]])); } /*--------------------------------------------------------------------- * If there exists no CommPkg for A, a CommPkg is generated using * equally load balanced partitionings *--------------------------------------------------------------------*/ if (!comm_pkg) { hypre_MatvecCommPkgCreate(A); comm_pkg = hypre_ParCSRMatrixCommPkg(A); } num_sends = hypre_ParCSRCommPkgNumSends(comm_pkg); d_buf_data = hypre_CTAlloc(HYPRE_Real, hypre_ParCSRCommPkgSendMapStart(comm_pkg, num_sends), HYPRE_MEMORY_HOST); index = 0; for (i = 0; i < num_sends; i++) { start = hypre_ParCSRCommPkgSendMapStart(comm_pkg, i); for (j = start; j < hypre_ParCSRCommPkgSendMapStart(comm_pkg, i + 1); j++) d_buf_data[index++] = dis_data[hypre_ParCSRCommPkgSendMapElmt(comm_pkg, j)]; } comm_handle = hypre_ParCSRCommHandleCreate( 1, comm_pkg, d_buf_data, dis_ext_data); for (i = 0; i < num_rows; i++) { for (j = diag_i[i]; j < diag_i[i + 1]; j++) { sum_data[i] += hypre_abs(diag_data[j]) * dis_data[i] * dis_data[diag_j[j]]; } } hypre_ParCSRCommHandleDestroy(comm_handle); for (i = 0; i < num_rows; i++) { for (j = offd_i[i]; j < offd_i[i + 1]; j++) { sum_data[i] += hypre_abs(offd_data[j]) * dis_data[i] * dis_ext_data[offd_j[j]]; } } max_row_sum = 0; for (i = 0; i < num_rows; i++) { if (max_row_sum < sum_data[i]) { max_row_sum = sum_data[i]; } } hypre_MPI_Allreduce(&max_row_sum, &mat_norm, 1, HYPRE_MPI_REAL, hypre_MPI_MAX, comm); hypre_ParVectorDestroy(dinvsqrt); hypre_SeqVectorDestroy(sum); hypre_SeqVectorDestroy(dis_ext); hypre_TFree(d_buf_data, HYPRE_MEMORY_HOST); *scnorm = mat_norm; return 0; } hypre-2.33.0/src/parcsr_ls/par_schwarz.c000066400000000000000000000305441477326011500202100ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * Schwarz functions * *****************************************************************************/ #include "_hypre_parcsr_ls.h" #include "schwarz.h" /*-------------------------------------------------------------------------- * hypre_SchwarzCreate *--------------------------------------------------------------------------*/ void * hypre_SchwarzCreate( void ) { hypre_SchwarzData *schwarz_data; HYPRE_Int variant; HYPRE_Int domain_type; HYPRE_Int overlap; HYPRE_Int num_functions; HYPRE_Int use_nonsymm; HYPRE_Real relax_weight; /*----------------------------------------------------------------------- * Setup default values for parameters *-----------------------------------------------------------------------*/ /* setup params */ variant = 0; /* multiplicative Schwarz */ overlap = 1; /* minimal overlap */ domain_type = 2; /* domains generated by agglomeration */ num_functions = 1; use_nonsymm = 0; relax_weight = 1.0; schwarz_data = hypre_CTAlloc(hypre_SchwarzData, 1, HYPRE_MEMORY_HOST); hypre_SchwarzSetVariant(schwarz_data, variant); hypre_SchwarzSetDomainType(schwarz_data, domain_type); hypre_SchwarzSetOverlap(schwarz_data, overlap); hypre_SchwarzSetNumFunctions(schwarz_data, num_functions); hypre_SchwarzSetNonSymm(schwarz_data, use_nonsymm); hypre_SchwarzSetRelaxWeight(schwarz_data, relax_weight); hypre_SchwarzDataDomainStructure(schwarz_data) = NULL; hypre_SchwarzDataABoundary(schwarz_data) = NULL; hypre_SchwarzDataScale(schwarz_data) = NULL; hypre_SchwarzDataVtemp(schwarz_data) = NULL; hypre_SchwarzDataDofFunc(schwarz_data) = NULL; return (void *) schwarz_data; } /*-------------------------------------------------------------------------- * hypre_SchwarzDestroy *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SchwarzDestroy( void *data ) { hypre_SchwarzData *schwarz_data = (hypre_SchwarzData*) data; if (hypre_SchwarzDataScale(schwarz_data)) { hypre_TFree(hypre_SchwarzDataScale(schwarz_data), HYPRE_MEMORY_HOST); } if (hypre_SchwarzDataDofFunc(schwarz_data)) { hypre_TFree(hypre_SchwarzDataDofFunc(schwarz_data), HYPRE_MEMORY_HOST); } hypre_CSRMatrixDestroy(hypre_SchwarzDataDomainStructure(schwarz_data)); if (hypre_SchwarzDataVariant(schwarz_data) == 3) { hypre_CSRMatrixDestroy(hypre_SchwarzDataABoundary(schwarz_data)); } hypre_ParVectorDestroy(hypre_SchwarzDataVtemp(schwarz_data)); if (hypre_SchwarzDataPivots(schwarz_data)) { hypre_TFree(hypre_SchwarzDataPivots(schwarz_data), HYPRE_MEMORY_HOST); } hypre_TFree(schwarz_data, HYPRE_MEMORY_HOST); return hypre_error_flag; } HYPRE_Int hypre_SchwarzSetup(void *schwarz_vdata, hypre_ParCSRMatrix *A, hypre_ParVector *f, hypre_ParVector *u) { HYPRE_UNUSED_VAR(f); HYPRE_UNUSED_VAR(u); hypre_SchwarzData *schwarz_data = (hypre_SchwarzData*) schwarz_vdata; HYPRE_Int *dof_func; HYPRE_Real *scale; hypre_CSRMatrix *domain_structure; hypre_CSRMatrix *A_boundary; hypre_ParVector *Vtemp; HYPRE_Int *pivots = NULL; HYPRE_Int variant = hypre_SchwarzDataVariant(schwarz_data); HYPRE_Int domain_type = hypre_SchwarzDataDomainType(schwarz_data); HYPRE_Int overlap = hypre_SchwarzDataOverlap(schwarz_data); HYPRE_Int num_functions = hypre_SchwarzDataNumFunctions(schwarz_data); HYPRE_Real relax_weight = hypre_SchwarzDataRelaxWeight(schwarz_data); HYPRE_Int use_nonsymm = hypre_SchwarzDataUseNonSymm(schwarz_data); dof_func = hypre_SchwarzDataDofFunc(schwarz_data); Vtemp = hypre_ParVectorCreate(hypre_ParCSRMatrixComm(A), hypre_ParCSRMatrixGlobalNumRows(A), hypre_ParCSRMatrixRowStarts(A)); hypre_ParVectorInitialize(Vtemp); hypre_SchwarzDataVtemp(schwarz_data) = Vtemp; if (variant > 1) { hypre_ParAMGCreateDomainDof(A, domain_type, overlap, num_functions, dof_func, &domain_structure, &pivots, use_nonsymm); if (domain_structure) { if (variant == 2) { hypre_ParGenerateScale(A, domain_structure, relax_weight, &scale); hypre_SchwarzDataScale(schwarz_data) = scale; } else { hypre_ParGenerateHybridScale(A, domain_structure, &A_boundary, &scale); hypre_SchwarzDataScale(schwarz_data) = scale; if (hypre_CSRMatrixNumCols(hypre_ParCSRMatrixOffd(A))) { hypre_SchwarzDataABoundary(schwarz_data) = A_boundary; } else { hypre_SchwarzDataABoundary(schwarz_data) = NULL; } } } } else { hypre_AMGCreateDomainDof (hypre_ParCSRMatrixDiag(A), domain_type, overlap, num_functions, dof_func, &domain_structure, &pivots, use_nonsymm); if (domain_structure) { if (variant == 1) { hypre_GenerateScale(domain_structure, hypre_CSRMatrixNumRows(hypre_ParCSRMatrixDiag(A)), relax_weight, &scale); hypre_SchwarzDataScale(schwarz_data) = scale; } } } hypre_SchwarzDataDomainStructure(schwarz_data) = domain_structure; hypre_SchwarzDataPivots(schwarz_data) = pivots; return hypre_error_flag; } /*-------------------------------------------------------------------- * hypre_SchwarzSolve *--------------------------------------------------------------------*/ HYPRE_Int hypre_SchwarzSolve(void *schwarz_vdata, hypre_ParCSRMatrix *A, hypre_ParVector *f, hypre_ParVector *u ) { hypre_SchwarzData *schwarz_data = (hypre_SchwarzData*) schwarz_vdata; hypre_CSRMatrix *domain_structure = hypre_SchwarzDataDomainStructure(schwarz_data); hypre_CSRMatrix *A_boundary = hypre_SchwarzDataABoundary(schwarz_data); HYPRE_Real *scale = hypre_SchwarzDataScale(schwarz_data); hypre_ParVector *Vtemp = hypre_SchwarzDataVtemp(schwarz_data); HYPRE_Int variant = hypre_SchwarzDataVariant(schwarz_data); HYPRE_Real relax_wt = hypre_SchwarzDataRelaxWeight(schwarz_data); HYPRE_Int use_nonsymm = hypre_SchwarzDataUseNonSymm(schwarz_data); HYPRE_Int *pivots = hypre_SchwarzDataPivots(schwarz_data); if (domain_structure) { if (variant == 2) { hypre_ParAdSchwarzSolve(A, f, domain_structure, scale, u, Vtemp, pivots, use_nonsymm); } else if (variant == 3) { hypre_ParMPSchwarzSolve(A, A_boundary, f, domain_structure, u, relax_wt, scale, Vtemp, pivots, use_nonsymm); } else if (variant == 1) { hypre_AdSchwarzSolve(A, f, domain_structure, scale, u, Vtemp, pivots, use_nonsymm); } else if (variant == 4) { hypre_MPSchwarzFWSolve(A, hypre_ParVectorLocalVector(f), domain_structure, u, relax_wt, hypre_ParVectorLocalVector(Vtemp), pivots, use_nonsymm); } else { hypre_MPSchwarzSolve(A, hypre_ParVectorLocalVector(f), domain_structure, u, relax_wt, hypre_ParVectorLocalVector(Vtemp), pivots, use_nonsymm); } } return hypre_error_flag; } /*-------------------------------------------------------------------- * hypre_SchwarzCFSolve *--------------------------------------------------------------------*/ HYPRE_Int hypre_SchwarzCFSolve(void *schwarz_vdata, hypre_ParCSRMatrix *A, hypre_ParVector *f, hypre_ParVector *u, HYPRE_Int *CF_marker, HYPRE_Int rlx_pt) { hypre_SchwarzData *schwarz_data = (hypre_SchwarzData*) schwarz_vdata; hypre_CSRMatrix *domain_structure = hypre_SchwarzDataDomainStructure(schwarz_data); HYPRE_Real *scale = hypre_SchwarzDataScale(schwarz_data); hypre_ParVector *Vtemp = hypre_SchwarzDataVtemp(schwarz_data); HYPRE_Int variant = hypre_SchwarzDataVariant(schwarz_data); HYPRE_Real relax_wt = hypre_SchwarzDataRelaxWeight(schwarz_data); HYPRE_Int use_nonsymm = hypre_SchwarzDataUseNonSymm(schwarz_data); HYPRE_Int *pivots = hypre_SchwarzDataPivots(schwarz_data); if (variant == 1) { hypre_AdSchwarzCFSolve(A, f, domain_structure, scale, u, Vtemp, CF_marker, rlx_pt, pivots, use_nonsymm); } else if (variant == 4) { hypre_MPSchwarzCFFWSolve(A, hypre_ParVectorLocalVector(f), domain_structure, u, relax_wt, hypre_ParVectorLocalVector(Vtemp), CF_marker, rlx_pt, pivots, use_nonsymm); } else { hypre_MPSchwarzCFSolve(A, hypre_ParVectorLocalVector(f), domain_structure, u, relax_wt, hypre_ParVectorLocalVector(Vtemp), CF_marker, rlx_pt, pivots, use_nonsymm); } return hypre_error_flag; } /*-------------------------------------------------------------------------- * Routines to set various parameters *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SchwarzSetVariant( void *data, HYPRE_Int variant ) { hypre_SchwarzData *schwarz_data = (hypre_SchwarzData*) data; hypre_SchwarzDataVariant(schwarz_data) = variant; return hypre_error_flag; } HYPRE_Int hypre_SchwarzSetDomainType( void *data, HYPRE_Int domain_type ) { hypre_SchwarzData *schwarz_data = (hypre_SchwarzData*) data; hypre_SchwarzDataDomainType(schwarz_data) = domain_type; return hypre_error_flag; } HYPRE_Int hypre_SchwarzSetOverlap( void *data, HYPRE_Int overlap ) { hypre_SchwarzData *schwarz_data = (hypre_SchwarzData*) data; hypre_SchwarzDataOverlap(schwarz_data) = overlap; return hypre_error_flag; } HYPRE_Int hypre_SchwarzSetNumFunctions( void *data, HYPRE_Int num_functions ) { hypre_SchwarzData *schwarz_data = (hypre_SchwarzData*) data; hypre_SchwarzDataNumFunctions(schwarz_data) = num_functions; return hypre_error_flag; } HYPRE_Int hypre_SchwarzSetNonSymm( void *data, HYPRE_Int value ) { hypre_SchwarzData *schwarz_data = (hypre_SchwarzData*) data; hypre_SchwarzDataUseNonSymm(schwarz_data) = value; return hypre_error_flag; } HYPRE_Int hypre_SchwarzSetRelaxWeight( void *data, HYPRE_Real relax_weight ) { hypre_SchwarzData *schwarz_data = (hypre_SchwarzData*) data; hypre_SchwarzDataRelaxWeight(schwarz_data) = relax_weight; return hypre_error_flag; } HYPRE_Int hypre_SchwarzSetDomainStructure( void *data, hypre_CSRMatrix *domain_structure ) { hypre_SchwarzData *schwarz_data = (hypre_SchwarzData*) data; hypre_SchwarzDataDomainStructure(schwarz_data) = domain_structure; return hypre_error_flag; } HYPRE_Int hypre_SchwarzSetScale( void *data, HYPRE_Real *scale) { hypre_SchwarzData *schwarz_data = (hypre_SchwarzData*) data; hypre_SchwarzDataScale(schwarz_data) = scale; return hypre_error_flag; } HYPRE_Int hypre_SchwarzReScale( void *data, HYPRE_Int size, HYPRE_Real value) { HYPRE_Int i; HYPRE_Real *scale; hypre_SchwarzData *schwarz_data = (hypre_SchwarzData*) data; scale = hypre_SchwarzDataScale(schwarz_data); for (i = 0; i < size; i++) { scale[i] *= value; } return hypre_error_flag; } HYPRE_Int hypre_SchwarzSetDofFunc( void *data, HYPRE_Int *dof_func) { hypre_SchwarzData *schwarz_data = (hypre_SchwarzData*) data; hypre_SchwarzDataDofFunc(schwarz_data) = dof_func; return hypre_error_flag; } hypre-2.33.0/src/parcsr_ls/par_stats.c000066400000000000000000001647421477326011500176750ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "_hypre_parcsr_ls.h" #include "par_amg.h" /*-------------------------------------------------------------------- * hypre_BoomerAMGSetupStats * * Routine for getting matrix statistics from setup * * AHB - using block norm 6 (sum of all elements) instead of 1 (frobenius) *--------------------------------------------------------------------*/ HYPRE_Int hypre_BoomerAMGSetupStats( void *amg_vdata, hypre_ParCSRMatrix *A ) { hypre_GpuProfilingPushRange("AMGSetupStats"); MPI_Comm comm = hypre_ParCSRMatrixComm(A); hypre_ParAMGData *amg_data = (hypre_ParAMGData*) amg_vdata; /* Data Structure variables */ hypre_ParCSRMatrix **A_array; hypre_ParCSRMatrix **P_array; hypre_ParCSRBlockMatrix **A_block_array; hypre_ParCSRBlockMatrix **P_block_array; hypre_CSRMatrix *A_diag, *A_diag_clone; HYPRE_Real *A_diag_data; HYPRE_Int *A_diag_i; hypre_CSRBlockMatrix *A_block_diag; hypre_CSRMatrix *A_offd, *A_offd_clone; HYPRE_Real *A_offd_data; HYPRE_Int *A_offd_i; hypre_CSRBlockMatrix *A_block_offd; hypre_CSRMatrix *P_diag, *P_diag_clone; HYPRE_Real *P_diag_data; HYPRE_Int *P_diag_i; hypre_CSRBlockMatrix *P_block_diag; hypre_CSRMatrix *P_offd, *P_offd_clone; HYPRE_Real *P_offd_data; HYPRE_Int *P_offd_i; hypre_CSRBlockMatrix *P_block_offd; HYPRE_Int numrows; HYPRE_BigInt *row_starts; HYPRE_Int num_levels; HYPRE_Int num_functions; HYPRE_Int filter_functions; HYPRE_Int coarsen_type; HYPRE_Int interp_type; HYPRE_Int restri_type; HYPRE_Int agg_interp_type; HYPRE_Int measure_type; HYPRE_Int agg_num_levels; HYPRE_Real global_nonzeros; HYPRE_Real *send_buff; HYPRE_Real *gather_buff; /* Local variables */ HYPRE_Int level; HYPRE_Int j; HYPRE_BigInt fine_size; HYPRE_Int min_entries; HYPRE_Int max_entries; HYPRE_Int num_procs, my_id; HYPRE_Int num_threads; HYPRE_Real min_rowsum; HYPRE_Real max_rowsum; HYPRE_Real sparse; HYPRE_Int i; HYPRE_Int ndigits[4]; HYPRE_BigInt coarse_size; HYPRE_Int entries; HYPRE_Real avg_entries; HYPRE_Real rowsum; HYPRE_Real min_weight; HYPRE_Real max_weight; HYPRE_Int global_min_e; HYPRE_Int global_max_e; HYPRE_Real global_min_rsum; HYPRE_Real global_max_rsum; HYPRE_Real global_min_wt; HYPRE_Real global_max_wt; HYPRE_Real *num_mem; HYPRE_Real *num_coeffs; HYPRE_Real *num_variables; HYPRE_Real total_variables; HYPRE_Real operat_cmplxty; HYPRE_Real grid_cmplxty = 0; HYPRE_Real memory_cmplxty = 0; /* amg solve params */ HYPRE_Int max_iter; HYPRE_Int cycle_type; HYPRE_Int fcycle; HYPRE_Int *num_grid_sweeps; HYPRE_Int *grid_relax_type; HYPRE_Int relax_order; HYPRE_Int **grid_relax_points; HYPRE_Real *relax_weight; HYPRE_Real *omega; HYPRE_Real tol; HYPRE_Int block_mode; HYPRE_Int block_size = 1; HYPRE_Int bnnz = 1; HYPRE_Real tmp_norm; HYPRE_Int one = 1; HYPRE_Int minus_one = -1; HYPRE_Int zero = 0; HYPRE_Int smooth_type; HYPRE_Int smooth_num_levels; HYPRE_Int additive; HYPRE_Int mult_additive; HYPRE_Int simple; HYPRE_Int add_end; HYPRE_Int add_rlx; HYPRE_Real add_rlx_wt; hypre_MPI_Comm_size(comm, &num_procs); hypre_MPI_Comm_rank(comm, &my_id); num_threads = hypre_NumThreads(); A_array = hypre_ParAMGDataAArray(amg_data); P_array = hypre_ParAMGDataPArray(amg_data); num_levels = hypre_ParAMGDataNumLevels(amg_data); num_functions = hypre_ParAMGDataNumFunctions(amg_data); filter_functions = hypre_ParAMGDataFilterFunctions(amg_data); coarsen_type = hypre_ParAMGDataCoarsenType(amg_data); interp_type = hypre_ParAMGDataInterpType(amg_data); restri_type = hypre_ParAMGDataRestriction(amg_data); /* RL */ agg_interp_type = hypre_ParAMGDataAggInterpType(amg_data); measure_type = hypre_ParAMGDataMeasureType(amg_data); smooth_type = hypre_ParAMGDataSmoothType(amg_data); smooth_num_levels = hypre_ParAMGDataSmoothNumLevels(amg_data); agg_num_levels = hypre_ParAMGDataAggNumLevels(amg_data); additive = hypre_ParAMGDataAdditive(amg_data); mult_additive = hypre_ParAMGDataMultAdditive(amg_data); simple = hypre_ParAMGDataSimple(amg_data); add_end = hypre_ParAMGDataAddLastLvl(amg_data); add_rlx = hypre_ParAMGDataAddRelaxType(amg_data); add_rlx_wt = hypre_ParAMGDataAddRelaxWt(amg_data); A_block_array = hypre_ParAMGDataABlockArray(amg_data); P_block_array = hypre_ParAMGDataPBlockArray(amg_data); /*---------------------------------------------------------- * Get the amg_data data *----------------------------------------------------------*/ num_levels = hypre_ParAMGDataNumLevels(amg_data); max_iter = hypre_ParAMGDataMaxIter(amg_data); cycle_type = hypre_ParAMGDataCycleType(amg_data); fcycle = hypre_ParAMGDataFCycle(amg_data); num_grid_sweeps = hypre_ParAMGDataNumGridSweeps(amg_data); grid_relax_type = hypre_ParAMGDataGridRelaxType(amg_data); grid_relax_points = hypre_ParAMGDataGridRelaxPoints(amg_data); relax_weight = hypre_ParAMGDataRelaxWeight(amg_data); relax_order = hypre_ParAMGDataRelaxOrder(amg_data); omega = hypre_ParAMGDataOmega(amg_data); tol = hypre_ParAMGDataTol(amg_data); block_mode = hypre_ParAMGDataBlockMode(amg_data); send_buff = hypre_CTAlloc(HYPRE_Real, 6, HYPRE_MEMORY_HOST); gather_buff = hypre_CTAlloc(HYPRE_Real, 6, HYPRE_MEMORY_HOST); if (my_id == 0) { hypre_printf("\n\n Num MPI tasks = %d\n\n", num_procs); hypre_printf(" Num OpenMP threads = %d\n\n", num_threads); hypre_printf("\nBoomerAMG SETUP PARAMETERS:\n\n"); hypre_printf(" Max levels = %d\n", hypre_ParAMGDataMaxLevels(amg_data)); hypre_printf(" Num levels = %d\n\n", num_levels); hypre_printf(" Strength Threshold = %f\n", hypre_ParAMGDataStrongThreshold(amg_data)); hypre_printf(" Interpolation Truncation Factor = %f\n", hypre_ParAMGDataTruncFactor(amg_data)); hypre_printf(" Maximum Row Sum Threshold for Dependency Weakening = %f\n\n", hypre_ParAMGDataMaxRowSum(amg_data)); if (coarsen_type == 0) { hypre_printf(" Coarsening Type = Cleary-Luby-Jones-Plassman\n"); } else if (hypre_abs(coarsen_type) == 1) { hypre_printf(" Coarsening Type = Ruge\n"); } else if (hypre_abs(coarsen_type) == 2) { hypre_printf(" Coarsening Type = Ruge2B\n"); } else if (hypre_abs(coarsen_type) == 3) { hypre_printf(" Coarsening Type = Ruge3\n"); } else if (hypre_abs(coarsen_type) == 4) { hypre_printf(" Coarsening Type = Ruge 3c \n"); } else if (hypre_abs(coarsen_type) == 5) { hypre_printf(" Coarsening Type = Ruge relax special points \n"); } else if (hypre_abs(coarsen_type) == 6) { hypre_printf(" Coarsening Type = Falgout-CLJP \n"); } else if (hypre_abs(coarsen_type) == 8) { hypre_printf(" Coarsening Type = PMIS \n"); } else if (hypre_abs(coarsen_type) == 10) { hypre_printf(" Coarsening Type = HMIS \n"); } else if (hypre_abs(coarsen_type) == 11) { hypre_printf(" Coarsening Type = Ruge 1st pass only \n"); } else if (hypre_abs(coarsen_type) == 9) { hypre_printf(" Coarsening Type = PMIS fixed random \n"); } else if (hypre_abs(coarsen_type) == 7) { hypre_printf(" Coarsening Type = CLJP, fixed random \n"); } else if (hypre_abs(coarsen_type) == 21) /* BM Aug 29, 2006 */ { hypre_printf(" Coarsening Type = CGC \n"); } else if (hypre_abs(coarsen_type) == 22) /* BM Aug 29, 2006 */ { hypre_printf(" Coarsening Type = CGC-E \n"); } /*if (coarsen_type > 0) { hypre_printf(" Hybrid Coarsening (switch to CLJP when coarsening slows)\n"); }*/ if (agg_num_levels > 0) { hypre_printf("\n No. of levels of aggressive coarsening: %d\n\n", agg_num_levels); if (agg_interp_type == 4) { hypre_printf(" Interpolation on agg. levels= multipass interpolation\n"); } else if (agg_interp_type == 1) { hypre_printf(" Interpolation on agg. levels = 2-stage extended+i interpolation \n"); } else if (agg_interp_type == 2) { hypre_printf(" Interpolation on agg. levels = 2-stage std interpolation \n"); } else if (agg_interp_type == 3) { hypre_printf(" Interpolation on agg. levels = 2-stage extended interpolation \n"); } } if (coarsen_type) hypre_printf(" measures are determined %s\n\n", (measure_type ? "globally" : "locally")); hypre_printf( "\n No global partition option chosen.\n\n"); if (interp_type == 0) { hypre_printf(" Interpolation = modified classical interpolation\n"); } else if (interp_type == 1) { hypre_printf(" Interpolation = LS interpolation \n"); } else if (interp_type == 2) { hypre_printf(" Interpolation = modified classical interpolation for hyperbolic PDEs\n"); } else if (interp_type == 3) { hypre_printf(" Interpolation = direct interpolation with separation of weights\n"); } else if (interp_type == 4) { hypre_printf(" Interpolation = multipass interpolation\n"); } else if (interp_type == 5) { hypre_printf(" Interpolation = multipass interpolation with separation of weights\n"); } else if (interp_type == 6) { hypre_printf(" Interpolation = extended+i interpolation\n"); } else if (interp_type == 7) { hypre_printf(" Interpolation = extended+i interpolation (if no common C point)\n"); } else if (interp_type == 12) { hypre_printf(" Interpolation = F-F interpolation\n"); } else if (interp_type == 13) { hypre_printf(" Interpolation = F-F1 interpolation\n"); } else if (interp_type == 14) { hypre_printf(" Interpolation = extended interpolation\n"); } else if (interp_type == 15) { hypre_printf(" Interpolation = direct interpolation with separation of weights\n"); } else if (interp_type == 16) { hypre_printf(" Interpolation = extended interpolation with MMs\n"); } else if (interp_type == 17) { hypre_printf(" Interpolation = extended+i interpolation with MMs\n"); } else if (interp_type == 8) { hypre_printf(" Interpolation = standard interpolation\n"); } else if (interp_type == 9) { hypre_printf(" Interpolation = standard interpolation with separation of weights\n"); } else if (interp_type == 10) { hypre_printf(" Interpolation = block classical interpolation for nodal systems AMG\n"); } else if (interp_type == 11) { hypre_printf(" Interpolation = block classical interpolation with diagonal blocks\n"); hypre_printf(" for nodal systems AMG\n"); } else if (interp_type == 24) { hypre_printf(" Interpolation = block direct interpolation \n"); hypre_printf(" for nodal systems AMG\n"); } else if (interp_type == 100) { hypre_printf(" Interpolation = one-point interpolation \n"); } if (restri_type == 1) { hypre_printf(" Restriction = local approximate ideal restriction (AIR-1)\n"); } else if (restri_type == 2) { hypre_printf(" Restriction = local approximate ideal restriction (AIR-2)\n"); } else if (restri_type == 15) { hypre_printf(" Restriction = local approximate ideal restriction (AIR-1.5)\n"); } else if (restri_type >= 3) { hypre_printf(" Restriction = local approximate ideal restriction (Neumann AIR-%d)\n", restri_type - 3); } if (num_functions > 1) { hypre_printf(" Number of functions = %d\n", num_functions); hypre_printf(" Functions filtering is %s\n", (filter_functions > 0) ? "on" : "off"); } if (block_mode) { hypre_printf( "\nBlock Operator Matrix Information:\n"); hypre_printf( "(Row sums and weights use sum of all elements in the block -keeping signs)\n\n"); } else { hypre_printf( "\nOperator Matrix Information:\n\n"); } } if (block_mode) { ndigits[0] = hypre_ndigits(hypre_ParCSRBlockMatrixGlobalNumRows(A_block_array[0])); ndigits[1] = hypre_ndigits(hypre_ParCSRBlockMatrixNumNonzeros(A_block_array[0])); } else { ndigits[0] = hypre_ndigits(hypre_ParCSRMatrixGlobalNumRows(A_array[0])); ndigits[1] = hypre_ndigits(hypre_ParCSRMatrixNumNonzeros(A_array[0])); } ndigits[0] = hypre_max(7, ndigits[0]); ndigits[1] = hypre_max(8, ndigits[1]); ndigits[2] = 4; for (level = 0; level < num_levels; level++) { if (block_mode) { fine_size = hypre_ParCSRBlockMatrixGlobalNumRows(A_block_array[level]); global_nonzeros = hypre_ParCSRBlockMatrixNumNonzeros(A_block_array[level]); ndigits[2] = hypre_max(hypre_ndigits((HYPRE_BigInt) global_nonzeros / fine_size ), ndigits[2]); } else { fine_size = hypre_ParCSRMatrixGlobalNumRows(A_array[level]); global_nonzeros = hypre_ParCSRMatrixNumNonzeros(A_array[level]); ndigits[2] = hypre_max(hypre_ndigits((HYPRE_BigInt) global_nonzeros / fine_size ), ndigits[2]); } } ndigits[2] = ndigits[2] + 2; ndigits[3] = ndigits[0] + ndigits[1] + ndigits[2]; if (my_id == 0) { hypre_printf("%*s", (ndigits[0] + 13), "nonzero"); hypre_printf("%*s", (ndigits[1] + 15), "entries/row"); hypre_printf("%18s\n", "row sums"); hypre_printf("%s %*s ", "lev", ndigits[0], "rows"); hypre_printf("%*s", ndigits[1], "entries"); hypre_printf("%7s %5s %4s", "sparse", "min", "max"); hypre_printf("%*s %8s %11s\n", (ndigits[2] + 2), "avg", "min", "max"); for (i = 0; i < (49 + ndigits[3]); i++) { hypre_printf("%s", "="); } hypre_printf("\n"); } /*----------------------------------------------------- * Enter Statistics Loop *-----------------------------------------------------*/ num_coeffs = hypre_CTAlloc(HYPRE_Real, num_levels, HYPRE_MEMORY_HOST); num_mem = hypre_CTAlloc(HYPRE_Real, num_levels, HYPRE_MEMORY_HOST); num_variables = hypre_CTAlloc(HYPRE_Real, num_levels, HYPRE_MEMORY_HOST); for (level = 0; level < num_levels; level++) { if (block_mode) { A_block_diag = hypre_ParCSRBlockMatrixDiag(A_block_array[level]); A_diag_data = hypre_CSRBlockMatrixData(A_block_diag); A_diag_i = hypre_CSRBlockMatrixI(A_block_diag); A_block_offd = hypre_ParCSRBlockMatrixOffd(A_block_array[level]); A_offd_data = hypre_CSRMatrixData(A_block_offd); A_offd_i = hypre_CSRMatrixI(A_block_offd); block_size = hypre_ParCSRBlockMatrixBlockSize(A_block_array[level]); bnnz = block_size * block_size; row_starts = hypre_ParCSRBlockMatrixRowStarts(A_block_array[level]); fine_size = hypre_ParCSRBlockMatrixGlobalNumRows(A_block_array[level]); global_nonzeros = hypre_ParCSRBlockMatrixDNumNonzeros(A_block_array[level]); num_coeffs[level] = global_nonzeros; num_mem[level] = global_nonzeros; num_variables[level] = (HYPRE_Real) fine_size; sparse = global_nonzeros / ((HYPRE_Real) fine_size * (HYPRE_Real) fine_size); min_entries = 0; max_entries = 0; min_rowsum = 0.0; max_rowsum = 0.0; if (hypre_CSRBlockMatrixNumRows(A_block_diag)) { min_entries = (A_diag_i[1] - A_diag_i[0]) + (A_offd_i[1] - A_offd_i[0]); for (j = A_diag_i[0]; j < A_diag_i[1]; j++) { hypre_CSRBlockMatrixBlockNorm(6, &A_diag_data[j * bnnz], &tmp_norm, block_size); min_rowsum += tmp_norm; } for (j = A_offd_i[0]; j < A_offd_i[1]; j++) { hypre_CSRBlockMatrixBlockNorm(6, &A_offd_data[j * bnnz], &tmp_norm, block_size); min_rowsum += tmp_norm; } max_rowsum = min_rowsum; for (j = 0; j < hypre_CSRBlockMatrixNumRows(A_block_diag); j++) { entries = (A_diag_i[j + 1] - A_diag_i[j]) + (A_offd_i[j + 1] - A_offd_i[j]); min_entries = hypre_min(entries, min_entries); max_entries = hypre_max(entries, max_entries); rowsum = 0.0; for (i = A_diag_i[j]; i < A_diag_i[j + 1]; i++) { hypre_CSRBlockMatrixBlockNorm(6, &A_diag_data[i * bnnz], &tmp_norm, block_size); rowsum += tmp_norm; } for (i = A_offd_i[j]; i < A_offd_i[j + 1]; i++) { hypre_CSRBlockMatrixBlockNorm(6, &A_offd_data[i * bnnz], &tmp_norm, block_size); rowsum += tmp_norm; } min_rowsum = hypre_min(rowsum, min_rowsum); max_rowsum = hypre_max(rowsum, max_rowsum); } } avg_entries = global_nonzeros / ((HYPRE_Real) fine_size); } else { A_diag = hypre_ParCSRMatrixDiag(A_array[level]); if ( hypre_GetActualMemLocation(hypre_CSRMatrixMemoryLocation(A_diag)) != hypre_MEMORY_HOST ) { A_diag_clone = hypre_CSRMatrixClone_v2(A_diag, 1, HYPRE_MEMORY_HOST); } else { A_diag_clone = A_diag; } A_diag_data = hypre_CSRMatrixData(A_diag_clone); A_diag_i = hypre_CSRMatrixI(A_diag_clone); A_offd = hypre_ParCSRMatrixOffd(A_array[level]); if ( hypre_GetActualMemLocation(hypre_CSRMatrixMemoryLocation(A_offd)) != hypre_MEMORY_HOST ) { A_offd_clone = hypre_CSRMatrixClone_v2(A_offd, 1, HYPRE_MEMORY_HOST); } else { A_offd_clone = A_offd; } A_offd_data = hypre_CSRMatrixData(A_offd_clone); A_offd_i = hypre_CSRMatrixI(A_offd_clone); row_starts = hypre_ParCSRMatrixRowStarts(A_array[level]); fine_size = hypre_ParCSRMatrixGlobalNumRows(A_array[level]); global_nonzeros = hypre_ParCSRMatrixDNumNonzeros(A_array[level]); num_coeffs[level] = global_nonzeros; if (level == 0) { num_mem[level] += global_nonzeros; } if (level == 0 && (additive == 0 || mult_additive == 0) ) { num_mem[level] += global_nonzeros; } if (level > 0) { if (simple > level || simple == -1) { num_mem[level] += global_nonzeros; } } num_variables[level] = (HYPRE_Real) fine_size; sparse = global_nonzeros / ((HYPRE_Real) fine_size * (HYPRE_Real) fine_size); min_entries = 0; max_entries = 0; min_rowsum = 0.0; max_rowsum = 0.0; if (hypre_CSRMatrixNumRows(A_diag)) { min_entries = (A_diag_i[1] - A_diag_i[0]) + (A_offd_i[1] - A_offd_i[0]); for (j = A_diag_i[0]; j < A_diag_i[1]; j++) { min_rowsum += A_diag_data[j]; } for (j = A_offd_i[0]; j < A_offd_i[1]; j++) { min_rowsum += A_offd_data[j]; } max_rowsum = min_rowsum; for (j = 0; j < hypre_CSRMatrixNumRows(A_diag); j++) { entries = (A_diag_i[j + 1] - A_diag_i[j]) + (A_offd_i[j + 1] - A_offd_i[j]); min_entries = hypre_min(entries, min_entries); max_entries = hypre_max(entries, max_entries); rowsum = 0.0; for (i = A_diag_i[j]; i < A_diag_i[j + 1]; i++) { rowsum += A_diag_data[i]; } for (i = A_offd_i[j]; i < A_offd_i[j + 1]; i++) { rowsum += A_offd_data[i]; } min_rowsum = hypre_min(rowsum, min_rowsum); max_rowsum = hypre_max(rowsum, max_rowsum); } } avg_entries = global_nonzeros / ((HYPRE_Real) fine_size); if (A_diag_clone != A_diag) { hypre_CSRMatrixDestroy(A_diag_clone); } if (A_offd_clone != A_offd) { hypre_CSRMatrixDestroy(A_offd_clone); } } numrows = (HYPRE_Int)(row_starts[1] - row_starts[0]); if (!numrows) /* if we don't have any rows, then don't have this count toward min row sum or min num entries */ { min_entries = 1000000; min_rowsum = 1.0e7; } send_buff[0] = - (HYPRE_Real) min_entries; send_buff[1] = (HYPRE_Real) max_entries; send_buff[2] = - min_rowsum; send_buff[3] = max_rowsum; hypre_MPI_Reduce(send_buff, gather_buff, 4, HYPRE_MPI_REAL, hypre_MPI_MAX, 0, comm); if (my_id == 0) { global_min_e = - (HYPRE_Int)gather_buff[0]; global_max_e = (HYPRE_Int)gather_buff[1]; global_min_rsum = - gather_buff[2]; global_max_rsum = gather_buff[3]; hypre_printf("%3d %*b %*.0f %0.3f %4d %4d", level, ndigits[0], fine_size, ndigits[1], global_nonzeros, sparse, global_min_e, global_max_e); hypre_printf(" %*.1f %10.3e %10.3e\n", ndigits[2], avg_entries, global_min_rsum, global_max_rsum); } } ndigits[0] = 5; if ((num_levels - 1)) { if (block_mode) { ndigits[0] = hypre_max(hypre_ndigits(hypre_ParCSRBlockMatrixGlobalNumRows(P_block_array[0])), ndigits[0]); } else { ndigits[0] = hypre_max(hypre_ndigits(hypre_ParCSRMatrixGlobalNumRows(P_array[0])), ndigits[0]); } } if (my_id == 0) { if (block_mode) { hypre_printf( "\n\nBlock Interpolation Matrix Information:\n\n"); hypre_printf( "(Row sums and weights use sum of all elements in the block - keeping signs)\n\n"); } else { hypre_printf( "\n\nInterpolation Matrix Information:\n"); } hypre_printf("%*s ", (2 * ndigits[0] + 21), "entries/row"); hypre_printf("%10s %10s %19s\n", "min", "max", "row sums"); hypre_printf("lev %*s x %-*s min max avgW", ndigits[0], "rows", ndigits[0], "cols"); hypre_printf("%11s %11s %9s %11s\n", "weight", "weight", "min", "max"); for (i = 0; i < (70 + 2 * ndigits[0]); i++) { hypre_printf("%s", "="); } hypre_printf("\n"); } /*----------------------------------------------------- * Enter Statistics Loop *-----------------------------------------------------*/ for (level = 0; level < num_levels - 1; level++) { if (block_mode) { P_block_diag = hypre_ParCSRBlockMatrixDiag(P_block_array[level]); P_diag_data = hypre_CSRBlockMatrixData(P_block_diag); P_diag_i = hypre_CSRBlockMatrixI(P_block_diag); P_block_offd = hypre_ParCSRBlockMatrixOffd(P_block_array[level]); P_offd_data = hypre_CSRBlockMatrixData(P_block_offd); P_offd_i = hypre_CSRBlockMatrixI(P_block_offd); row_starts = hypre_ParCSRBlockMatrixRowStarts(P_block_array[level]); fine_size = hypre_ParCSRBlockMatrixGlobalNumRows(P_block_array[level]); coarse_size = hypre_ParCSRBlockMatrixGlobalNumCols(P_block_array[level]); global_nonzeros = hypre_ParCSRBlockMatrixDNumNonzeros(P_block_array[level]); num_mem[level] += global_nonzeros; min_weight = 1.0; max_weight = 0.0; max_rowsum = 0.0; min_rowsum = 0.0; min_entries = 0; max_entries = 0; if (hypre_CSRBlockMatrixNumRows(P_block_diag)) { if (hypre_CSRBlockMatrixNumCols(P_block_diag)) { hypre_CSRBlockMatrixBlockNorm(6, &P_diag_data[0], &tmp_norm, block_size); min_weight = tmp_norm; } for (j = P_diag_i[0]; j < P_diag_i[1]; j++) { hypre_CSRBlockMatrixBlockNorm(6, &P_diag_data[j * bnnz], &tmp_norm, block_size); min_weight = hypre_min(min_weight, tmp_norm); if (tmp_norm != 1.0) { max_weight = hypre_max(max_weight, tmp_norm); } min_rowsum += tmp_norm; } for (j = P_offd_i[0]; j < P_offd_i[1]; j++) { hypre_CSRBlockMatrixBlockNorm(6, &P_offd_data[j * bnnz], &tmp_norm, block_size); min_weight = hypre_min(min_weight, tmp_norm); if (tmp_norm != 1.0) { max_weight = hypre_max(max_weight, tmp_norm); } min_rowsum += tmp_norm; } max_rowsum = min_rowsum; min_entries = (P_diag_i[1] - P_diag_i[0]) + (P_offd_i[1] - P_offd_i[0]); max_entries = 0; for (j = 0; j < hypre_CSRBlockMatrixNumRows(P_block_diag); j++) { entries = (P_diag_i[j + 1] - P_diag_i[j]) + (P_offd_i[j + 1] - P_offd_i[j]); min_entries = hypre_min(entries, min_entries); max_entries = hypre_max(entries, max_entries); rowsum = 0.0; for (i = P_diag_i[j]; i < P_diag_i[j + 1]; i++) { hypre_CSRBlockMatrixBlockNorm(6, &P_diag_data[i * bnnz], &tmp_norm, block_size); min_weight = hypre_min(min_weight, tmp_norm); if (tmp_norm != 1.0) { max_weight = hypre_max(max_weight, tmp_norm); } rowsum += tmp_norm; } for (i = P_offd_i[j]; i < P_offd_i[j + 1]; i++) { hypre_CSRBlockMatrixBlockNorm(6, &P_offd_data[i * bnnz], &tmp_norm, block_size); min_weight = hypre_min(min_weight, tmp_norm); if (tmp_norm != 1.0) { max_weight = hypre_max(max_weight, P_offd_data[i]); } rowsum += tmp_norm; } min_rowsum = hypre_min(rowsum, min_rowsum); max_rowsum = hypre_max(rowsum, max_rowsum); } } avg_entries = ((HYPRE_Real) (global_nonzeros - coarse_size)) / ((HYPRE_Real) ( fine_size - coarse_size)); } else { P_diag = hypre_ParCSRMatrixDiag(P_array[level]); if ( hypre_GetActualMemLocation(hypre_CSRMatrixMemoryLocation(P_diag)) != hypre_MEMORY_HOST ) { P_diag_clone = hypre_CSRMatrixClone_v2(P_diag, 1, HYPRE_MEMORY_HOST); } else { P_diag_clone = P_diag; } P_diag_data = hypre_CSRMatrixData(P_diag_clone); P_diag_i = hypre_CSRMatrixI(P_diag_clone); P_offd = hypre_ParCSRMatrixOffd(P_array[level]); if ( hypre_GetActualMemLocation(hypre_CSRMatrixMemoryLocation(P_offd)) != hypre_MEMORY_HOST ) { P_offd_clone = hypre_CSRMatrixClone_v2(P_offd, 1, HYPRE_MEMORY_HOST); } else { P_offd_clone = P_offd; } P_offd_data = hypre_CSRMatrixData(P_offd_clone); P_offd_i = hypre_CSRMatrixI(P_offd_clone); row_starts = hypre_ParCSRMatrixRowStarts(P_array[level]); fine_size = hypre_ParCSRMatrixGlobalNumRows(P_array[level]); coarse_size = hypre_ParCSRMatrixGlobalNumCols(P_array[level]); hypre_ParCSRMatrixSetDNumNonzeros(P_array[level]); global_nonzeros = hypre_ParCSRMatrixDNumNonzeros(P_array[level]); num_mem[level] += (HYPRE_Real) global_nonzeros; min_weight = 1.0; max_weight = 0.0; max_rowsum = 0.0; min_rowsum = 0.0; min_entries = 0; max_entries = 0; if (hypre_CSRMatrixNumRows(P_diag)) { if (P_diag_data) { min_weight = P_diag_data[0]; } for (j = P_diag_i[0]; j < P_diag_i[1]; j++) { min_weight = hypre_min(min_weight, P_diag_data[j]); if (P_diag_data[j] != 1.0) { max_weight = hypre_max(max_weight, P_diag_data[j]); } min_rowsum += P_diag_data[j]; } for (j = P_offd_i[0]; j < P_offd_i[1]; j++) { min_weight = hypre_min(min_weight, P_offd_data[j]); if (P_offd_data[j] != 1.0) { max_weight = hypre_max(max_weight, P_offd_data[j]); } min_rowsum += P_offd_data[j]; } max_rowsum = min_rowsum; min_entries = (P_diag_i[1] - P_diag_i[0]) + (P_offd_i[1] - P_offd_i[0]); max_entries = 0; for (j = 0; j < hypre_CSRMatrixNumRows(P_diag); j++) { entries = (P_diag_i[j + 1] - P_diag_i[j]) + (P_offd_i[j + 1] - P_offd_i[j]); min_entries = hypre_min(entries, min_entries); max_entries = hypre_max(entries, max_entries); rowsum = 0.0; for (i = P_diag_i[j]; i < P_diag_i[j + 1]; i++) { min_weight = hypre_min(min_weight, P_diag_data[i]); if (P_diag_data[i] != 1.0) { max_weight = hypre_max(max_weight, P_diag_data[i]); } rowsum += P_diag_data[i]; } for (i = P_offd_i[j]; i < P_offd_i[j + 1]; i++) { min_weight = hypre_min(min_weight, P_offd_data[i]); if (P_offd_data[i] != 1.0) { max_weight = hypre_max(max_weight, P_offd_data[i]); } rowsum += P_offd_data[i]; } min_rowsum = hypre_min(rowsum, min_rowsum); max_rowsum = hypre_max(rowsum, max_rowsum); } } avg_entries = ((HYPRE_Real) (global_nonzeros - coarse_size)) / ((HYPRE_Real) ( fine_size - coarse_size)); if (P_diag_clone != P_diag) { hypre_CSRMatrixDestroy(P_diag_clone); } if (P_offd_clone != P_offd) { hypre_CSRMatrixDestroy(P_offd_clone); } } numrows = row_starts[1] - row_starts[0]; if (!numrows) /* if we don't have any rows, then don't have this count toward min row sum or min num entries */ { min_entries = 1000000; min_rowsum = 1.0e7; min_weight = 1.0e7; } send_buff[0] = - (HYPRE_Real) min_entries; send_buff[1] = (HYPRE_Real) max_entries; send_buff[2] = - min_rowsum; send_buff[3] = max_rowsum; send_buff[4] = - min_weight; send_buff[5] = max_weight; hypre_MPI_Reduce(send_buff, gather_buff, 6, HYPRE_MPI_REAL, hypre_MPI_MAX, 0, comm); if (my_id == 0) { global_min_e = - (HYPRE_Int)gather_buff[0]; global_max_e = (HYPRE_Int)gather_buff[1]; global_min_rsum = -gather_buff[2]; global_max_rsum = gather_buff[3]; global_min_wt = -gather_buff[4]; global_max_wt = gather_buff[5]; hypre_printf("%3d %*b x %-*b %3d %3d", level, ndigits[0], fine_size, ndigits[0], coarse_size, global_min_e, global_max_e); hypre_printf(" %4.1f %10.3e %10.3e %10.3e %10.3e\n", avg_entries, global_min_wt, global_max_wt, global_min_rsum, global_max_rsum); } } total_variables = 0; operat_cmplxty = 0; for (j = 0; j < hypre_ParAMGDataNumLevels(amg_data); j++) { memory_cmplxty += num_mem[j] / num_coeffs[0]; operat_cmplxty += num_coeffs[j] / num_coeffs[0]; total_variables += num_variables[j]; } if (num_variables[0] != 0) { grid_cmplxty = total_variables / num_variables[0]; } if (my_id == 0 ) { hypre_printf("\n\n"); hypre_printf(" Complexity: grid = %f\n", grid_cmplxty); hypre_printf(" operator = %f\n", operat_cmplxty); hypre_printf(" memory = %f\n", memory_cmplxty); hypre_printf("\n\n"); } if (my_id == 0) { hypre_printf("\n\nBoomerAMG SOLVER PARAMETERS:\n\n"); hypre_printf( " Maximum number of cycles: %d \n", max_iter); hypre_printf( " Stopping Tolerance: %e \n", tol); if (fcycle) { hypre_printf( " Full Multigrid. Cycle type (1 = V, 2 = W, etc.): %d\n\n", cycle_type); } else { hypre_printf( " Cycle type (1 = V, 2 = W, etc.): %d\n\n", cycle_type); } if (additive == 0 || mult_additive == 0 || simple == 0) { HYPRE_Int add_lvl = (add_end == -1) ? num_levels - 1 : add_end; if (additive > -1) { hypre_printf( " Additive V-cycle 1st level %d last level %d: \n", additive, add_lvl); } if (mult_additive > -1) { hypre_printf( " Mult-Additive V-cycle 1st level %d last level %d: \n", mult_additive, add_lvl); } if (simple > -1) { hypre_printf( " Simplified Mult-Additive V-cycle 1st level %d: last level %d \n", simple, add_lvl); } hypre_printf( " Relaxation Parameters:\n"); if (add_lvl == num_levels - 1) { hypre_printf( " Visiting Grid: down up coarse\n"); hypre_printf( " Number of sweeps: %4d %2d %4d \n", num_grid_sweeps[1], num_grid_sweeps[1], (2 * num_grid_sweeps[1])); hypre_printf( " Type 0=Jac, 3=hGS, 6=hSGS, 9=GE: %2d %2d %2d \n", add_rlx, add_rlx, add_rlx); } else { hypre_printf( " Visiting Grid: down up\n"); hypre_printf( " Number of sweeps: %4d %2d\n", num_grid_sweeps[1], num_grid_sweeps[1]); hypre_printf( " Type 0=Jac, 3=hGS, 6=hSGS, 9=GE: %2d %2d\n", add_rlx, add_rlx); } if (add_lvl < num_levels - 1) { hypre_printf( " \n"); hypre_printf( "Multiplicative portion: \n"); hypre_printf( " Visiting Grid: down up coarse\n"); hypre_printf( " Number of sweeps: %4d %2d %4d\n", num_grid_sweeps[1], num_grid_sweeps[2], num_grid_sweeps[3]); hypre_printf( " Type 0=Jac, 3=hGS, 6=hSGS, 9=GE: %4d %2d %4d\n", grid_relax_type[1], grid_relax_type[2], grid_relax_type[3]); } if (add_rlx == 0) { hypre_printf( " Relaxation Weight: %e \n", add_rlx_wt); } { hypre_printf( " Point types, partial sweeps (1=C, -1=F):\n"); hypre_printf( " Pre-CG relaxation (down):"); } for (j = 0; j < num_grid_sweeps[1]; j++) { hypre_printf(" %2d", zero); } { hypre_printf( "\n"); hypre_printf( " Post-CG relaxation (up):"); } for (j = 0; j < num_grid_sweeps[2]; j++) { hypre_printf(" %2d", zero); } { hypre_printf( "\n"); hypre_printf( " Coarsest grid:"); } for (j = 0; j < num_grid_sweeps[3]; j++) { hypre_printf(" %2d", zero); } { hypre_printf( "\n"); } } else if (additive > 0 || mult_additive > 0 || simple > 0) { HYPRE_Int add_lvl = (add_end == -1) ? (num_levels - 1) : add_end; hypre_printf( " Relaxation Parameters:\n"); if (add_lvl < num_levels - 1) { hypre_printf( " Visiting Grid: down up coarse\n"); hypre_printf( " Number of sweeps: %4d %2d %4d\n", num_grid_sweeps[1], num_grid_sweeps[2], num_grid_sweeps[3]); hypre_printf( " Type 0=Jac, 3=hGS, 6=hSGS, 9=GE: %4d %2d %4d\n", grid_relax_type[1], grid_relax_type[2], grid_relax_type[3]); } else { hypre_printf( " Visiting Grid: down up \n"); hypre_printf( " Number of sweeps: %4d %2d \n", num_grid_sweeps[1], num_grid_sweeps[2]); hypre_printf( " Type 0=Jac, 3=hGS, 6=hSGS, 9=GE: %4d %2d \n", grid_relax_type[1], grid_relax_type[2]); } hypre_printf( " Point types, partial sweeps (1=C, -1=F):\n"); if (grid_relax_points && grid_relax_type[1] != 8) { hypre_printf( " Pre-CG relaxation (down):"); for (j = 0; j < num_grid_sweeps[1]; j++) { hypre_printf(" %2d", grid_relax_points[1][j]); } hypre_printf( "\n"); hypre_printf( " Post-CG relaxation (up):"); for (j = 0; j < num_grid_sweeps[2]; j++) { hypre_printf(" %2d", grid_relax_points[2][j]); } hypre_printf( "\n"); } else if (relax_order == 1 && grid_relax_type[1] != 8) { hypre_printf( " Pre-CG relaxation (down):"); for (j = 0; j < num_grid_sweeps[1]; j++) { hypre_printf(" %2d %2d", one, minus_one); } hypre_printf( "\n"); hypre_printf( " Post-CG relaxation (up):"); for (j = 0; j < num_grid_sweeps[2]; j++) { hypre_printf(" %2d %2d", minus_one, one); } hypre_printf( "\n"); } else { hypre_printf( " Pre-CG relaxation (down):"); for (j = 0; j < num_grid_sweeps[1]; j++) { hypre_printf(" %2d", zero); } hypre_printf( "\n"); hypre_printf( " Post-CG relaxation (up):"); for (j = 0; j < num_grid_sweeps[2]; j++) { hypre_printf(" %2d", zero); } hypre_printf( "\n"); } { hypre_printf( "\n\n"); } if (additive > -1) { hypre_printf( " Additive V-cycle 1st level %d last level %d: \n", additive, add_lvl); } if (mult_additive > -1) { hypre_printf( " Mult-Additive V-cycle 1st level %d last level %d: \n", mult_additive, add_lvl); } if (simple > -1) { hypre_printf( " Simplified Mult-Additive V-cycle 1st level %d: last level %d \n", simple, add_lvl); } { hypre_printf( " Relaxation Parameters:\n"); } if (add_lvl == num_levels - 1) { hypre_printf( " Visiting Grid: down up coarse\n"); hypre_printf( " Number of sweeps: %4d %2d %4d \n", num_grid_sweeps[1], num_grid_sweeps[1], (2 * num_grid_sweeps[1])); hypre_printf( " Type 0=Jac, 3=hGS, 6=hSGS, 9=GE: %2d %2d %2d \n", add_rlx, add_rlx, add_rlx); } else { hypre_printf( " Visiting Grid: down up\n"); hypre_printf( " Number of sweeps: %4d %2d\n", num_grid_sweeps[1], num_grid_sweeps[1]); hypre_printf( " Type 0=Jac, 3=hGS, 6=hSGS, 9=GE: %2d %2d\n", add_rlx, add_rlx); } if (add_rlx == 0) { hypre_printf( " Relaxation Weight: %e \n", add_rlx_wt); } { hypre_printf( " Point types, partial sweeps (1=C, -1=F):\n"); hypre_printf( " Pre-CG relaxation (down):"); } for (j = 0; j < num_grid_sweeps[1]; j++) { hypre_printf(" %2d", zero); } { hypre_printf( "\n"); hypre_printf( " Post-CG relaxation (up):"); } for (j = 0; j < num_grid_sweeps[2]; j++) { hypre_printf(" %2d", zero); } { hypre_printf( "\n"); hypre_printf( " Coarsest grid:"); } for (j = 0; j < num_grid_sweeps[3]; j++) { hypre_printf(" %2d", zero); } { hypre_printf( "\n"); } } else { hypre_printf( " Relaxation Parameters:\n"); hypre_printf( " Visiting Grid: down up coarse\n"); hypre_printf( " Number of sweeps: %4d %2d %4d \n", num_grid_sweeps[1], num_grid_sweeps[2], num_grid_sweeps[3]); hypre_printf( " Type 0=Jac, 3=hGS, 6=hSGS, 9=GE: %4d %2d %4d \n", grid_relax_type[1], grid_relax_type[2], grid_relax_type[3]); hypre_printf( " Point types, partial sweeps (1=C, -1=F):\n"); if (grid_relax_points && grid_relax_type[1] != 8) { hypre_printf( " Pre-CG relaxation (down):"); for (j = 0; j < num_grid_sweeps[1]; j++) { hypre_printf(" %2d", grid_relax_points[1][j]); } hypre_printf( "\n"); hypre_printf( " Post-CG relaxation (up):"); for (j = 0; j < num_grid_sweeps[2]; j++) { hypre_printf(" %2d", grid_relax_points[2][j]); } hypre_printf( "\n"); hypre_printf( " Coarsest grid:"); for (j = 0; j < num_grid_sweeps[3]; j++) { hypre_printf(" %2d", grid_relax_points[3][j]); } { hypre_printf( "\n"); } } else if (relax_order == 1 && grid_relax_type[1] != 8) { hypre_printf( " Pre-CG relaxation (down):"); for (j = 0; j < num_grid_sweeps[1]; j++) { hypre_printf(" %2d %2d", one, minus_one); } hypre_printf( "\n"); hypre_printf( " Post-CG relaxation (up):"); for (j = 0; j < num_grid_sweeps[2]; j++) { hypre_printf(" %2d %2d", minus_one, one); } hypre_printf( "\n"); hypre_printf( " Coarsest grid:"); for (j = 0; j < num_grid_sweeps[3]; j++) { hypre_printf(" %2d", zero); } { hypre_printf( "\n"); } } else { hypre_printf( " Pre-CG relaxation (down):"); for (j = 0; j < num_grid_sweeps[1]; j++) { hypre_printf(" %2d", zero); } hypre_printf( "\n"); hypre_printf( " Post-CG relaxation (up):"); for (j = 0; j < num_grid_sweeps[2]; j++) { hypre_printf(" %2d", zero); } hypre_printf( "\n"); hypre_printf( " Coarsest grid:"); for (j = 0; j < num_grid_sweeps[3]; j++) { hypre_printf(" %2d", zero); } { hypre_printf( "\n"); } } } #if defined(HYPRE_USING_MAGMA) if (grid_relax_type[3] == 98 || grid_relax_type[3] == 99 || grid_relax_type[3] == 198 || grid_relax_type[3] == 199) { hypre_printf( " Using MAGMA's LU factorization on coarse level\n"); } #endif { hypre_printf( "\n"); } if (smooth_type == 6) { for (j = 0; j < smooth_num_levels; j++) { hypre_printf( " Schwarz Relaxation Weight %f level %d\n", hypre_ParAMGDataSchwarzRlxWeight(amg_data), j); } } if (smooth_type == 7) { for (j = 0; j < smooth_num_levels; j++) { hypre_printf( " Pilut smoother level %d\n", j); } } if (smooth_type == 8) { for (j = 0; j < smooth_num_levels; j++) { hypre_printf( " ParaSails smoother level %d\n", j); } } if (smooth_type == 9) { for (j = 0; j < smooth_num_levels; j++) { hypre_printf( " Euclid smoother level %d\n", j); } } for (j = 0; j < num_levels; j++) { if (relax_weight[j] != 1) { hypre_printf( " Relaxation Weight %f level %d\n", relax_weight[j], j); } } for (j = 0; j < num_levels; j++) { if (omega[j] != 1) { hypre_printf( " Outer relaxation weight %f level %d\n", omega[j], j); } } } hypre_TFree(num_coeffs, HYPRE_MEMORY_HOST); hypre_TFree(num_mem, HYPRE_MEMORY_HOST); hypre_TFree(num_variables, HYPRE_MEMORY_HOST); hypre_TFree(send_buff, HYPRE_MEMORY_HOST); hypre_TFree(gather_buff, HYPRE_MEMORY_HOST); hypre_GpuProfilingPopRange(); return hypre_error_flag; } /*--------------------------------------------------------------- * hypre_BoomerAMGWriteSolverParams *---------------------------------------------------------------*/ HYPRE_Int hypre_BoomerAMGWriteSolverParams(void* data) { hypre_ParAMGData *amg_data = (hypre_ParAMGData*) data; /* amg solve params */ HYPRE_Int num_levels; HYPRE_Int max_iter; HYPRE_Int cycle_type; HYPRE_Int fcycle; HYPRE_Int *num_grid_sweeps; HYPRE_Int *grid_relax_type; HYPRE_Int **grid_relax_points; HYPRE_Int relax_order; HYPRE_Real *relax_weight; HYPRE_Real *omega; HYPRE_Real tol; HYPRE_Int smooth_type; HYPRE_Int smooth_num_levels; /* amg output params */ HYPRE_Int amg_print_level; HYPRE_Int j; HYPRE_Int one = 1; HYPRE_Int minus_one = -1; HYPRE_Int zero = 0; /*---------------------------------------------------------- * Get the amg_data data *----------------------------------------------------------*/ num_levels = hypre_ParAMGDataNumLevels(amg_data); max_iter = hypre_ParAMGDataMaxIter(amg_data); cycle_type = hypre_ParAMGDataCycleType(amg_data); fcycle = hypre_ParAMGDataFCycle(amg_data); num_grid_sweeps = hypre_ParAMGDataNumGridSweeps(amg_data); grid_relax_type = hypre_ParAMGDataGridRelaxType(amg_data); grid_relax_points = hypre_ParAMGDataGridRelaxPoints(amg_data); relax_order = hypre_ParAMGDataRelaxOrder(amg_data); relax_weight = hypre_ParAMGDataRelaxWeight(amg_data); omega = hypre_ParAMGDataOmega(amg_data); smooth_type = hypre_ParAMGDataSmoothType(amg_data); smooth_num_levels = hypre_ParAMGDataSmoothNumLevels(amg_data); tol = hypre_ParAMGDataTol(amg_data); amg_print_level = hypre_ParAMGDataPrintLevel(amg_data); /*---------------------------------------------------------- * AMG info *----------------------------------------------------------*/ if (amg_print_level == 1 || amg_print_level == 3) { hypre_printf("\n\nBoomerAMG SOLVER PARAMETERS:\n\n"); hypre_printf( " Maximum number of cycles: %d \n", max_iter); hypre_printf( " Stopping Tolerance: %e \n", tol); if (fcycle) { hypre_printf( " Full Multigrid. Cycle type (1 = V, 2 = W, etc.): %d\n\n", cycle_type); } else { hypre_printf( " Cycle type (1 = V, 2 = W, etc.): %d\n\n", cycle_type); } hypre_printf( " Relaxation Parameters:\n"); hypre_printf( " Visiting Grid: down up coarse\n"); hypre_printf( " Number of sweeps: %4d %2d %4d \n", num_grid_sweeps[1], num_grid_sweeps[2], num_grid_sweeps[3]); hypre_printf( " Type 0=Jac, 3=hGS, 6=hSGS, 9=GE: %4d %2d %4d \n", grid_relax_type[1], grid_relax_type[2], grid_relax_type[3]); hypre_printf( " Point types, partial sweeps (1=C, -1=F):\n"); if (grid_relax_points) { hypre_printf( " Pre-CG relaxation (down):"); for (j = 0; j < num_grid_sweeps[1]; j++) { hypre_printf(" %2d", grid_relax_points[1][j]); } hypre_printf( "\n"); hypre_printf( " Post-CG relaxation (up):"); for (j = 0; j < num_grid_sweeps[2]; j++) { hypre_printf(" %2d", grid_relax_points[2][j]); } hypre_printf( "\n"); hypre_printf( " Coarsest grid:"); for (j = 0; j < num_grid_sweeps[3]; j++) { hypre_printf(" %2d", grid_relax_points[3][j]); } hypre_printf( "\n\n"); } else if (relax_order == 1) { hypre_printf( " Pre-CG relaxation (down):"); for (j = 0; j < num_grid_sweeps[1]; j++) { hypre_printf(" %2d %2d", one, minus_one); } hypre_printf( "\n"); hypre_printf( " Post-CG relaxation (up):"); for (j = 0; j < num_grid_sweeps[2]; j++) { hypre_printf(" %2d %2d", minus_one, one); } hypre_printf( "\n"); hypre_printf( " Coarsest grid:"); for (j = 0; j < num_grid_sweeps[3]; j++) { hypre_printf(" %2d", zero); } hypre_printf( "\n\n"); } else { hypre_printf( " Pre-CG relaxation (down):"); for (j = 0; j < num_grid_sweeps[1]; j++) { hypre_printf(" %2d", zero); } hypre_printf( "\n"); hypre_printf( " Post-CG relaxation (up):"); for (j = 0; j < num_grid_sweeps[2]; j++) { hypre_printf(" %2d", zero); } hypre_printf( "\n"); hypre_printf( " Coarsest grid:"); for (j = 0; j < num_grid_sweeps[3]; j++) { hypre_printf(" %2d", zero); } hypre_printf( "\n\n"); } if (smooth_type == 6) { for (j = 0; j < smooth_num_levels; j++) { hypre_printf( " Schwarz Relaxation Weight %f level %d\n", hypre_ParAMGDataSchwarzRlxWeight(amg_data), j); } } for (j = 0; j < num_levels; j++) { if (relax_weight[j] != 1) { hypre_printf( " Relaxation Weight %f level %d\n", relax_weight[j], j); } } for (j = 0; j < num_levels; j++) { if (omega[j] != 1) { hypre_printf( " Outer relaxation weight %f level %d\n", omega[j], j); } } hypre_printf( " Output flag (print_level): %d \n", amg_print_level); } return hypre_error_flag; } /*-------------------------------------------------------------------- * hypre_BoomerAMGGetProlongationName *--------------------------------------------------------------------*/ const char* hypre_BoomerAMGGetProlongationName(hypre_ParAMGData *amg_data) { switch (hypre_ParAMGDataInterpType(amg_data)) { case 0: return "modified classical"; case 1: return "LS"; case 2: return "modified classical for hyperbolic PDEs"; case 3: return "direct with separation of weights"; case 4: return "multipass"; case 5: return "multipass with separation of weights"; case 6: return "extended+i"; case 7: return "extended+i (if no common C-point)"; case 8: return "standard"; case 9: return "standard with separation of weights"; case 10: return "block classical for nodal systems"; case 11: return "block classical with diagonal blocks for nodal systems"; case 12: return "F-F"; case 13: return "F-F1"; case 14: return "extended"; case 15: return "direct with separation of weights"; case 16: return "MM-extended"; case 17: return "MM-extended+i"; case 18: return "MM-extended+e"; case 24: return "block direct for nodal systems"; case 100: return "one-point"; default: return "Unknown"; } } /*-------------------------------------------------------------------- * hypre_BoomerAMGGetAggProlongationName *--------------------------------------------------------------------*/ const char* hypre_BoomerAMGGetAggProlongationName(hypre_ParAMGData *amg_data) { if (hypre_ParAMGDataAggNumLevels(amg_data)) { switch (hypre_ParAMGDataAggInterpType(amg_data)) { case 1: return "2-stage extended+i"; case 2: return "2-stage standard"; case 3: return "2-stage extended"; case 4: return "multipass"; default: return "Unknown"; } } else { return ""; } } /*-------------------------------------------------------------------- * hypre_BoomerAMGGetCoarseningName *--------------------------------------------------------------------*/ const char* hypre_BoomerAMGGetCoarseningName(hypre_ParAMGData *amg_data) { switch (hypre_ParAMGDataCoarsenType(amg_data)) { case 0: return "Cleary-Luby-Jones-Plassman"; case 1: return "Ruge"; case 2: return "Ruge-2B"; case 3: return "Ruge-3"; case 4: return "Ruge-3c"; case 5: return "Ruge relax special points"; case 6: return "Falgout-CLJP"; case 7: return "CLJP, fixed random"; case 8: return "PMIS"; case 9: return "PMIS, fixed random"; case 10: return "HMIS"; case 11: return "Ruge 1st pass only"; case 21: return "CGC"; case 22: return "CGC-E"; default: return "Unknown"; } } /*-------------------------------------------------------------------- * hypre_BoomerAMGGetCoarseningName *--------------------------------------------------------------------*/ const char* hypre_BoomerAMGGetCycleName(hypre_ParAMGData *amg_data) { static char name[10]; switch (hypre_ParAMGDataCycleType(amg_data)) { case 1: hypre_sprintf(name, "V(%d,%d)", hypre_ParAMGDataNumGridSweeps(amg_data)[0], hypre_ParAMGDataNumGridSweeps(amg_data)[1]); break; case 2: hypre_sprintf(name, "W(%d,%d)", hypre_ParAMGDataNumGridSweeps(amg_data)[0], hypre_ParAMGDataNumGridSweeps(amg_data)[1]); break; default: return "Unknown"; } return name; } /*-------------------------------------------------------------------- * hypre_BoomerAMGPrintGeneralInfo * * Prints to stdout info about BoomerAMG parameters. * The input parameter "shift" refers to the number of whitespaces * added to the beginning of each line. *--------------------------------------------------------------------*/ HYPRE_Int hypre_BoomerAMGPrintGeneralInfo(hypre_ParAMGData *amg_data, HYPRE_Int shift) { HYPRE_PRINT_SHIFTED_PARAM(shift, "Solver Type = BoomerAMG\n"); HYPRE_PRINT_SHIFTED_PARAM(shift, "Strength Threshold = %f\n", hypre_ParAMGDataStrongThreshold(amg_data)); HYPRE_PRINT_SHIFTED_PARAM(shift, "Interpolation Truncation Factor = %f\n", hypre_ParAMGDataTruncFactor(amg_data)); HYPRE_PRINT_SHIFTED_PARAM(shift, "Maximum Row Sum Threshold for Dependency Weakening = %f\n", hypre_ParAMGDataMaxRowSum(amg_data)); HYPRE_PRINT_SHIFTED_PARAM(shift, "Number of functions = %d\n", hypre_ParAMGDataNumFunctions(amg_data)); HYPRE_PRINT_SHIFTED_PARAM(shift, "Functions filtering is %s\n", (hypre_ParAMGDataFilterFunctions(amg_data) > 0) ? "on" : "off"); HYPRE_PRINT_SHIFTED_PARAM(shift, "Coarsening type = %s\n", hypre_BoomerAMGGetCoarseningName(amg_data)); HYPRE_PRINT_SHIFTED_PARAM(shift, "Prolongation type = %s\n", hypre_BoomerAMGGetProlongationName(amg_data)); HYPRE_PRINT_SHIFTED_PARAM(shift, "Cycle type = %s\n", hypre_BoomerAMGGetCycleName(amg_data)); hypre_printf("\n"); return hypre_error_flag; } hypre-2.33.0/src/parcsr_ls/par_strength.c000066400000000000000000003355561477326011500204000ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * *****************************************************************************/ #include "_hypre_parcsr_ls.h" /*==========================================================================*/ /*==========================================================================*/ /** Generates strength matrix Notes: \begin{itemize} \item The underlying matrix storage scheme is a hypre_ParCSR matrix. \item The routine returns the following: \begin{itemize} \item S - a ParCSR matrix representing the "strength matrix". This is used in the coarsening and interpolation routines. \end{itemize} \item The graph of the "strength matrix" for A is a subgraph of the graph of A, but requires nonsymmetric storage even if A is symmetric. This is because of the directional nature of the "strengh of dependence" notion (see below). Since we are using nonsymmetric storage for A right now, this is not a problem. If we ever add the ability to store A symmetrically, then we could store the strength graph as floats instead of doubles to save space. \item This routine currently "compresses" the strength matrix. We should consider the possibility of defining this matrix to have the same "nonzero structure" as A. To do this, we could use the same A\_i and A\_j arrays, and would need only define the S\_data array. There are several pros and cons to discuss. \end{itemize} Terminology: \begin{itemize} \item Ruge's terminology: A point is "strongly connected to" $j$, or "strongly depends on" $j$, if $-a_ij >= \theta max_{l != j} \{-a_il\}$. \item Here, we retain some of this terminology, but with a more generalized notion of "strength". We also retain the "natural" graph notation for representing the directed graph of a matrix. That is, the nonzero entry $a_ij$ is represented as: i --> j. In the strength matrix, S, the entry $s_ij$ is also graphically denoted as above, and means both of the following: \begin{itemize} \item $i$ "depends on" $j$ with "strength" $s_ij$ \item $j$ "influences" $i$ with "strength" $s_ij$ \end{itemize} \end{itemize} {\bf Input files:} _hypre_parcsr_ls.h @return Error code. @param A [IN] coefficient matrix @param strength_threshold [IN] threshold parameter used to define strength @param max_row_sum [IN] parameter used to modify definition of strength for diagonal dominant matrices @param S_ptr [OUT] strength matrix @see */ /*--------------------------------------------------------------------------*/ HYPRE_Int hypre_BoomerAMGCreateSHost(hypre_ParCSRMatrix *A, HYPRE_Real strength_threshold, HYPRE_Real max_row_sum, HYPRE_Int num_functions, HYPRE_Int *dof_func, hypre_ParCSRMatrix **S_ptr) { #ifdef HYPRE_PROFILE hypre_profile_times[HYPRE_TIMER_ID_CREATES] -= hypre_MPI_Wtime(); #endif MPI_Comm comm = hypre_ParCSRMatrixComm(A); hypre_ParCSRCommPkg *comm_pkg = hypre_ParCSRMatrixCommPkg(A); hypre_ParCSRCommHandle *comm_handle; hypre_CSRMatrix *A_diag = hypre_ParCSRMatrixDiag(A); HYPRE_Int *A_diag_i = hypre_CSRMatrixI(A_diag); HYPRE_Real *A_diag_data = hypre_CSRMatrixData(A_diag); hypre_CSRMatrix *A_offd = hypre_ParCSRMatrixOffd(A); HYPRE_Int *A_offd_i = hypre_CSRMatrixI(A_offd); HYPRE_Real *A_offd_data = NULL; HYPRE_Int *A_diag_j = hypre_CSRMatrixJ(A_diag); HYPRE_Int *A_offd_j = hypre_CSRMatrixJ(A_offd); HYPRE_BigInt *row_starts = hypre_ParCSRMatrixRowStarts(A); HYPRE_Int num_variables = hypre_CSRMatrixNumRows(A_diag); HYPRE_BigInt global_num_vars = hypre_ParCSRMatrixGlobalNumRows(A); HYPRE_Int num_nonzeros_diag; HYPRE_Int num_nonzeros_offd = 0; HYPRE_Int num_cols_offd = 0; hypre_ParCSRMatrix *S; hypre_CSRMatrix *S_diag; HYPRE_Int *S_diag_i; HYPRE_Int *S_diag_j; /* HYPRE_Real *S_diag_data; */ hypre_CSRMatrix *S_offd; HYPRE_Int *S_offd_i = NULL; HYPRE_Int *S_offd_j = NULL; /* HYPRE_Real *S_offd_data; */ HYPRE_Real diag, row_scale, row_sum; HYPRE_Int i, jA, jS; HYPRE_Int ierr = 0; HYPRE_Int *dof_func_offd; HYPRE_Int num_sends; HYPRE_Int *int_buf_data; HYPRE_Int index, start, j; HYPRE_Int *prefix_sum_workspace; HYPRE_MemoryLocation memory_location = hypre_ParCSRMatrixMemoryLocation(A); /*-------------------------------------------------------------- * Compute a ParCSR strength matrix, S. * * For now, the "strength" of dependence/influence is defined in * the following way: i depends on j if * aij > hypre_max (k != i) aik, aii < 0 * or * aij < hypre_min (k != i) aik, aii >= 0 * Then S_ij = 1, else S_ij = 0. * * NOTE: the entries are negative initially, corresponding * to "unaccounted-for" dependence. *----------------------------------------------------------------*/ num_nonzeros_diag = A_diag_i[num_variables]; num_cols_offd = hypre_CSRMatrixNumCols(A_offd); A_offd_i = hypre_CSRMatrixI(A_offd); num_nonzeros_offd = A_offd_i[num_variables]; S = hypre_ParCSRMatrixCreate(comm, global_num_vars, global_num_vars, row_starts, row_starts, num_cols_offd, num_nonzeros_diag, num_nonzeros_offd); S_diag = hypre_ParCSRMatrixDiag(S); hypre_CSRMatrixI(S_diag) = hypre_CTAlloc(HYPRE_Int, num_variables + 1, memory_location); hypre_CSRMatrixJ(S_diag) = hypre_CTAlloc(HYPRE_Int, num_nonzeros_diag, HYPRE_MEMORY_HOST); S_offd = hypre_ParCSRMatrixOffd(S); hypre_CSRMatrixI(S_offd) = hypre_CTAlloc(HYPRE_Int, num_variables + 1, memory_location); S_diag_i = hypre_CSRMatrixI(S_diag); HYPRE_Int *S_temp_diag_j = hypre_CSRMatrixJ(S_diag); S_offd_i = hypre_CSRMatrixI(S_offd); S_diag_j = hypre_TAlloc(HYPRE_Int, num_nonzeros_diag, memory_location); HYPRE_Int *S_temp_offd_j = NULL; dof_func_offd = NULL; if (num_cols_offd) { A_offd_data = hypre_CSRMatrixData(A_offd); hypre_CSRMatrixJ(S_offd) = hypre_CTAlloc(HYPRE_Int, num_nonzeros_offd, HYPRE_MEMORY_HOST); S_temp_offd_j = hypre_CSRMatrixJ(S_offd); HYPRE_BigInt *col_map_offd_S = hypre_TAlloc(HYPRE_BigInt, num_cols_offd, HYPRE_MEMORY_HOST); hypre_ParCSRMatrixColMapOffd(S) = col_map_offd_S; if (num_functions > 1) { dof_func_offd = hypre_CTAlloc(HYPRE_Int, num_cols_offd, HYPRE_MEMORY_HOST); } S_offd_j = hypre_TAlloc(HYPRE_Int, num_nonzeros_offd, memory_location); HYPRE_BigInt *col_map_offd_A = hypre_ParCSRMatrixColMapOffd(A); #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i) HYPRE_SMP_SCHEDULE #endif for (i = 0; i < num_cols_offd; i++) { col_map_offd_S[i] = col_map_offd_A[i]; } } /*------------------------------------------------------------------- * Get the dof_func data for the off-processor columns *-------------------------------------------------------------------*/ if (!comm_pkg) { hypre_MatvecCommPkgCreate(A); comm_pkg = hypre_ParCSRMatrixCommPkg(A); } num_sends = hypre_ParCSRCommPkgNumSends(comm_pkg); if (num_functions > 1) { int_buf_data = hypre_CTAlloc(HYPRE_Int, hypre_ParCSRCommPkgSendMapStart(comm_pkg, num_sends), HYPRE_MEMORY_HOST); index = 0; for (i = 0; i < num_sends; i++) { start = hypre_ParCSRCommPkgSendMapStart(comm_pkg, i); for (j = start; j < hypre_ParCSRCommPkgSendMapStart(comm_pkg, i + 1); j++) { int_buf_data[index++] = dof_func[hypre_ParCSRCommPkgSendMapElmt(comm_pkg, j)]; } } comm_handle = hypre_ParCSRCommHandleCreate( 11, comm_pkg, int_buf_data, dof_func_offd); hypre_ParCSRCommHandleDestroy(comm_handle); hypre_TFree(int_buf_data, HYPRE_MEMORY_HOST); } /*HYPRE_Int prefix_sum_workspace[2*(hypre_NumThreads() + 1)];*/ prefix_sum_workspace = hypre_TAlloc(HYPRE_Int, 2 * (hypre_NumThreads() + 1), HYPRE_MEMORY_HOST); /* give S same nonzero structure as A */ #ifdef HYPRE_USING_OPENMP #pragma omp parallel private(i,diag,row_scale,row_sum,jA,jS) #endif { HYPRE_Int start, stop; hypre_GetSimpleThreadPartition(&start, &stop, num_variables); HYPRE_Int jS_diag = 0, jS_offd = 0; for (i = start; i < stop; i++) { S_diag_i[i] = jS_diag; if (num_cols_offd) { S_offd_i[i] = jS_offd; } diag = A_diag_data[A_diag_i[i]]; /* compute scaling factor and row sum */ row_scale = 0.0; row_sum = diag; if (num_functions > 1) { if (diag < 0) { for (jA = A_diag_i[i] + 1; jA < A_diag_i[i + 1]; jA++) { if (dof_func[i] == dof_func[A_diag_j[jA]]) { row_scale = hypre_max(row_scale, A_diag_data[jA]); row_sum += A_diag_data[jA]; } } for (jA = A_offd_i[i]; jA < A_offd_i[i + 1]; jA++) { if (dof_func[i] == dof_func_offd[A_offd_j[jA]]) { row_scale = hypre_max(row_scale, A_offd_data[jA]); row_sum += A_offd_data[jA]; } } } else { for (jA = A_diag_i[i] + 1; jA < A_diag_i[i + 1]; jA++) { if (dof_func[i] == dof_func[A_diag_j[jA]]) { row_scale = hypre_min(row_scale, A_diag_data[jA]); row_sum += A_diag_data[jA]; } } for (jA = A_offd_i[i]; jA < A_offd_i[i + 1]; jA++) { if (dof_func[i] == dof_func_offd[A_offd_j[jA]]) { row_scale = hypre_min(row_scale, A_offd_data[jA]); row_sum += A_offd_data[jA]; } } } /* diag >= 0 */ } /* num_functions > 1 */ else { if (diag < 0) { for (jA = A_diag_i[i] + 1; jA < A_diag_i[i + 1]; jA++) { row_scale = hypre_max(row_scale, A_diag_data[jA]); row_sum += A_diag_data[jA]; } for (jA = A_offd_i[i]; jA < A_offd_i[i + 1]; jA++) { row_scale = hypre_max(row_scale, A_offd_data[jA]); row_sum += A_offd_data[jA]; } } else { for (jA = A_diag_i[i] + 1; jA < A_diag_i[i + 1]; jA++) { row_scale = hypre_min(row_scale, A_diag_data[jA]); row_sum += A_diag_data[jA]; } for (jA = A_offd_i[i]; jA < A_offd_i[i + 1]; jA++) { row_scale = hypre_min(row_scale, A_offd_data[jA]); row_sum += A_offd_data[jA]; } } /* diag >= 0*/ } /* num_functions <= 1 */ jS_diag += A_diag_i[i + 1] - A_diag_i[i] - 1; jS_offd += A_offd_i[i + 1] - A_offd_i[i]; /* compute row entries of S */ S_temp_diag_j[A_diag_i[i]] = -1; if ((hypre_abs(row_sum) > hypre_abs(diag)*max_row_sum) && (max_row_sum < 1.0)) { /* make all dependencies weak */ for (jA = A_diag_i[i] + 1; jA < A_diag_i[i + 1]; jA++) { S_temp_diag_j[jA] = -1; } jS_diag -= A_diag_i[i + 1] - (A_diag_i[i] + 1); for (jA = A_offd_i[i]; jA < A_offd_i[i + 1]; jA++) { S_temp_offd_j[jA] = -1; } jS_offd -= A_offd_i[i + 1] - A_offd_i[i]; } else { if (num_functions > 1) { if (diag < 0) { for (jA = A_diag_i[i] + 1; jA < A_diag_i[i + 1]; jA++) { if (A_diag_data[jA] <= strength_threshold * row_scale || dof_func[i] != dof_func[A_diag_j[jA]]) { S_temp_diag_j[jA] = -1; --jS_diag; } else { S_temp_diag_j[jA] = A_diag_j[jA]; } } for (jA = A_offd_i[i]; jA < A_offd_i[i + 1]; jA++) { if (A_offd_data[jA] <= strength_threshold * row_scale || dof_func[i] != dof_func_offd[A_offd_j[jA]]) { S_temp_offd_j[jA] = -1; --jS_offd; } else { S_temp_offd_j[jA] = A_offd_j[jA]; } } } else { for (jA = A_diag_i[i] + 1; jA < A_diag_i[i + 1]; jA++) { if (A_diag_data[jA] >= strength_threshold * row_scale || dof_func[i] != dof_func[A_diag_j[jA]]) { S_temp_diag_j[jA] = -1; --jS_diag; } else { S_temp_diag_j[jA] = A_diag_j[jA]; } } for (jA = A_offd_i[i]; jA < A_offd_i[i + 1]; jA++) { if (A_offd_data[jA] >= strength_threshold * row_scale || dof_func[i] != dof_func_offd[A_offd_j[jA]]) { S_temp_offd_j[jA] = -1; --jS_offd; } else { S_temp_offd_j[jA] = A_offd_j[jA]; } } } /* diag >= 0 */ } /* num_functions > 1 */ else { if (diag < 0) { for (jA = A_diag_i[i] + 1; jA < A_diag_i[i + 1]; jA++) { if (A_diag_data[jA] <= strength_threshold * row_scale) { S_temp_diag_j[jA] = -1; --jS_diag; } else { S_temp_diag_j[jA] = A_diag_j[jA]; } } for (jA = A_offd_i[i]; jA < A_offd_i[i + 1]; jA++) { if (A_offd_data[jA] <= strength_threshold * row_scale) { S_temp_offd_j[jA] = -1; --jS_offd; } else { S_temp_offd_j[jA] = A_offd_j[jA]; } } } else { for (jA = A_diag_i[i] + 1; jA < A_diag_i[i + 1]; jA++) { if (A_diag_data[jA] >= strength_threshold * row_scale) { S_temp_diag_j[jA] = -1; --jS_diag; } else { S_temp_diag_j[jA] = A_diag_j[jA]; } } for (jA = A_offd_i[i]; jA < A_offd_i[i + 1]; jA++) { if (A_offd_data[jA] >= strength_threshold * row_scale) { S_temp_offd_j[jA] = -1; --jS_offd; } else { S_temp_offd_j[jA] = A_offd_j[jA]; } } } /* diag >= 0 */ } /* num_functions <= 1 */ } /* !((row_sum > max_row_sum) && (max_row_sum < 1.0)) */ } /* for each variable */ hypre_prefix_sum_pair(&jS_diag, S_diag_i + num_variables, &jS_offd, S_offd_i + num_variables, prefix_sum_workspace); /*-------------------------------------------------------------- * "Compress" the strength matrix. * * NOTE: S has *NO DIAGONAL ELEMENT* on any row. Caveat Emptor! * * NOTE: This "compression" section of code may be removed, and * coarsening will still be done correctly. However, the routine * that builds interpolation would have to be modified first. *----------------------------------------------------------------*/ for (i = start; i < stop; i++) { S_diag_i[i] += jS_diag; S_offd_i[i] += jS_offd; jS = S_diag_i[i]; for (jA = A_diag_i[i]; jA < A_diag_i[i + 1]; jA++) { if (S_temp_diag_j[jA] > -1) { S_diag_j[jS] = S_temp_diag_j[jA]; jS++; } } jS = S_offd_i[i]; for (jA = A_offd_i[i]; jA < A_offd_i[i + 1]; jA++) { if (S_temp_offd_j[jA] > -1) { S_offd_j[jS] = S_temp_offd_j[jA]; jS++; } } } /* for each variable */ } /* omp parallel */ hypre_CSRMatrixNumNonzeros(S_diag) = S_diag_i[num_variables]; hypre_CSRMatrixNumNonzeros(S_offd) = S_offd_i[num_variables]; hypre_CSRMatrixJ(S_diag) = S_diag_j; hypre_CSRMatrixJ(S_offd) = S_offd_j; hypre_CSRMatrixMemoryLocation(S_diag) = memory_location; hypre_CSRMatrixMemoryLocation(S_offd) = memory_location; hypre_ParCSRMatrixCommPkg(S) = NULL; *S_ptr = S; hypre_TFree(prefix_sum_workspace, HYPRE_MEMORY_HOST); hypre_TFree(dof_func_offd, HYPRE_MEMORY_HOST); hypre_TFree(S_temp_diag_j, HYPRE_MEMORY_HOST); hypre_TFree(S_temp_offd_j, HYPRE_MEMORY_HOST); #ifdef HYPRE_PROFILE hypre_profile_times[HYPRE_TIMER_ID_CREATES] += hypre_MPI_Wtime(); #endif return (ierr); } /* ----------------------------------------------------------------------- */ HYPRE_Int hypre_BoomerAMGCreateS(hypre_ParCSRMatrix *A, HYPRE_Real strength_threshold, HYPRE_Real max_row_sum, HYPRE_Int num_functions, HYPRE_Int *dof_func, hypre_ParCSRMatrix **S_ptr) { hypre_GpuProfilingPushRange("CreateS"); HYPRE_Int ierr = 0; #if defined(HYPRE_USING_GPU) HYPRE_ExecutionPolicy exec = hypre_GetExecPolicy1( hypre_ParCSRMatrixMemoryLocation(A) ); if (exec == HYPRE_EXEC_DEVICE) { ierr = hypre_BoomerAMGCreateSDevice(A, 0, strength_threshold, max_row_sum, num_functions, dof_func, S_ptr); } else #endif { ierr = hypre_BoomerAMGCreateSHost(A, strength_threshold, max_row_sum, num_functions, dof_func, S_ptr); } hypre_GpuProfilingPopRange(); return ierr; } /* ----------------------------------------------------------------------- */ /* Create Strength matrix from CF marker array data. Provides a more general form to build S for specific nodes of the 'global' matrix (for example, F points or A_FF part), given the entire matrix. These nodes have the SMRK tag. Could possibly be merged with BoomerAMGCreateS() to yield a more general function. */ HYPRE_Int hypre_BoomerAMGCreateSFromCFMarker(hypre_ParCSRMatrix *A, HYPRE_Real strength_threshold, HYPRE_Real max_row_sum, HYPRE_Int *CF_marker, HYPRE_Int num_functions, HYPRE_Int *dof_func, HYPRE_Int SMRK, hypre_ParCSRMatrix **S_ptr) { #ifdef HYPRE_PROFILE hypre_profile_times[HYPRE_TIMER_ID_CREATES] -= hypre_MPI_Wtime(); #endif HYPRE_MemoryLocation memloc = hypre_ParCSRMatrixMemoryLocation(A); MPI_Comm comm = hypre_ParCSRMatrixComm(A); hypre_ParCSRCommPkg *comm_pkg = hypre_ParCSRMatrixCommPkg(A); hypre_CSRMatrix *A_diag = hypre_ParCSRMatrixDiag(A); HYPRE_Int *A_diag_i = hypre_CSRMatrixI(A_diag); HYPRE_Real *A_diag_data = hypre_CSRMatrixData(A_diag); hypre_CSRMatrix *A_offd = hypre_ParCSRMatrixOffd(A); HYPRE_Int *A_offd_i = hypre_CSRMatrixI(A_offd); HYPRE_Real *A_offd_data = NULL; HYPRE_Int *A_diag_j = hypre_CSRMatrixJ(A_diag); HYPRE_Int *A_offd_j = hypre_CSRMatrixJ(A_offd); HYPRE_BigInt *row_starts = hypre_ParCSRMatrixRowStarts(A); HYPRE_Int num_variables = hypre_CSRMatrixNumRows(A_diag); HYPRE_BigInt global_num_vars = hypre_ParCSRMatrixGlobalNumRows(A); HYPRE_Int num_nonzeros_diag; HYPRE_Int num_nonzeros_offd = 0; HYPRE_Int num_cols_offd = 0; hypre_ParCSRCommHandle *comm_handle; hypre_ParCSRMatrix *S; hypre_CSRMatrix *S_diag; HYPRE_Int *S_diag_i; HYPRE_Int *S_diag_j; /* HYPRE_Real *S_diag_data; */ hypre_CSRMatrix *S_offd; HYPRE_Int *S_offd_i = NULL; HYPRE_Int *S_offd_j = NULL; /* HYPRE_Real *S_offd_data; */ HYPRE_Int *dof_func_offd = NULL; HYPRE_Real diag, row_scale, row_sum; HYPRE_Int i, jj, jA, jS; HYPRE_Int num_sends, start, j, index; HYPRE_Int *int_buf_data; HYPRE_Int ierr = 0; HYPRE_Int *CF_marker_offd = NULL; HYPRE_Int *prefix_sum_workspace; HYPRE_Int my_id; /*-------------------------------------------------------------- * Compute a ParCSR strength matrix, S. * * For now, the "strength" of dependence/influence is defined in * the following way: i depends on j if * aij > hypre_max (k != i) aik, aii < 0 * or * aij < hypre_min (k != i) aik, aii >= 0 * Then S_ij = 1, else S_ij = 0. * * NOTE: the entries are negative initially, corresponding * to "unaccounted-for" dependence. *----------------------------------------------------------------*/ hypre_MPI_Comm_rank(comm, &my_id); num_nonzeros_diag = A_diag_i[num_variables]; num_cols_offd = hypre_CSRMatrixNumCols(A_offd); A_offd_i = hypre_CSRMatrixI(A_offd); num_nonzeros_offd = A_offd_i[num_variables]; S = hypre_ParCSRMatrixCreate(comm, global_num_vars, global_num_vars, row_starts, row_starts, num_cols_offd, num_nonzeros_diag, num_nonzeros_offd); S_diag = hypre_ParCSRMatrixDiag(S); hypre_CSRMatrixI(S_diag) = hypre_CTAlloc(HYPRE_Int, num_variables + 1, HYPRE_MEMORY_HOST); hypre_CSRMatrixJ(S_diag) = hypre_CTAlloc(HYPRE_Int, num_nonzeros_diag, HYPRE_MEMORY_HOST); S_offd = hypre_ParCSRMatrixOffd(S); hypre_CSRMatrixI(S_offd) = hypre_CTAlloc(HYPRE_Int, num_variables + 1, HYPRE_MEMORY_HOST); S_diag_i = hypre_CSRMatrixI(S_diag); HYPRE_Int *S_temp_diag_j = hypre_CSRMatrixJ(S_diag); S_offd_i = hypre_CSRMatrixI(S_offd); S_diag_j = hypre_CTAlloc(HYPRE_Int, num_nonzeros_diag, HYPRE_MEMORY_HOST); HYPRE_Int *S_temp_offd_j = NULL; if (num_cols_offd) { A_offd_data = hypre_CSRMatrixData(A_offd); hypre_CSRMatrixJ(S_offd) = hypre_CTAlloc(HYPRE_Int, num_nonzeros_offd, HYPRE_MEMORY_HOST); S_temp_offd_j = hypre_CSRMatrixJ(S_offd); HYPRE_BigInt *col_map_offd_S = hypre_TAlloc(HYPRE_BigInt, num_cols_offd, HYPRE_MEMORY_HOST); hypre_ParCSRMatrixColMapOffd(S) = col_map_offd_S; if (num_functions > 1) { dof_func_offd = hypre_CTAlloc(HYPRE_Int, num_cols_offd, HYPRE_MEMORY_HOST); } S_offd_j = hypre_CTAlloc(HYPRE_Int, num_nonzeros_offd, HYPRE_MEMORY_HOST); HYPRE_BigInt *col_map_offd_A = hypre_ParCSRMatrixColMapOffd(A); #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i) HYPRE_SMP_SCHEDULE #endif for (i = 0; i < num_cols_offd; i++) { col_map_offd_S[i] = col_map_offd_A[i]; } } /*------------------------------------------------------------------- * Get the dof_func data for the off-processor columns *-------------------------------------------------------------------*/ if (!comm_pkg) { hypre_MatvecCommPkgCreate(A); comm_pkg = hypre_ParCSRMatrixCommPkg(A); } num_sends = hypre_ParCSRCommPkgNumSends(comm_pkg); if (num_functions > 1) { int_buf_data = hypre_CTAlloc(HYPRE_Int, hypre_ParCSRCommPkgSendMapStart(comm_pkg, num_sends), HYPRE_MEMORY_HOST); index = 0; for (i = 0; i < num_sends; i++) { start = hypre_ParCSRCommPkgSendMapStart(comm_pkg, i); for (j = start; j < hypre_ParCSRCommPkgSendMapStart(comm_pkg, i + 1); j++) { int_buf_data[index++] = dof_func[hypre_ParCSRCommPkgSendMapElmt(comm_pkg, j)]; } } comm_handle = hypre_ParCSRCommHandleCreate(11, comm_pkg, int_buf_data, dof_func_offd); hypre_ParCSRCommHandleDestroy(comm_handle); hypre_TFree(int_buf_data, HYPRE_MEMORY_HOST); } /*------------------------------------------------------------------- * Get the CF_marker data for the off-processor columns *-------------------------------------------------------------------*/ CF_marker_offd = hypre_CTAlloc(HYPRE_Int, num_cols_offd, HYPRE_MEMORY_HOST); if (!comm_pkg) { hypre_MatvecCommPkgCreate(A); comm_pkg = hypre_ParCSRMatrixCommPkg(A); } num_sends = hypre_ParCSRCommPkgNumSends(comm_pkg); int_buf_data = hypre_CTAlloc(HYPRE_Int, hypre_ParCSRCommPkgSendMapStart(comm_pkg, num_sends), HYPRE_MEMORY_HOST); index = 0; for (i = 0; i < num_sends; i++) { start = hypre_ParCSRCommPkgSendMapStart(comm_pkg, i); for (j = start; j < hypre_ParCSRCommPkgSendMapStart(comm_pkg, i + 1); j++) int_buf_data[index++] = CF_marker[hypre_ParCSRCommPkgSendMapElmt(comm_pkg, j)]; } comm_handle = hypre_ParCSRCommHandleCreate(11, comm_pkg, int_buf_data, CF_marker_offd); hypre_ParCSRCommHandleDestroy(comm_handle); hypre_TFree(int_buf_data, HYPRE_MEMORY_HOST); /*HYPRE_Int prefix_sum_workspace[2*(hypre_NumThreads() + 1)];*/ prefix_sum_workspace = hypre_TAlloc(HYPRE_Int, 2 * (hypre_NumThreads() + 1), HYPRE_MEMORY_HOST); /* give S same nonzero structure as A */ #ifdef HYPRE_USING_OPENMP #pragma omp parallel private(i,diag,row_scale,row_sum,jA,jS) #endif { HYPRE_Int start, stop; hypre_GetSimpleThreadPartition(&start, &stop, num_variables); HYPRE_Int jS_diag = 0, jS_offd = 0; for (i = start; i < stop; i++) { if (CF_marker[i] == SMRK) { S_diag_i[i] = jS_diag; if (num_cols_offd) { S_offd_i[i] = jS_offd; } diag = A_diag_data[A_diag_i[i]]; /* compute scaling factor and row sum */ row_scale = 0.0; row_sum = diag; if (num_functions > 1) { if (diag < 0) { for (jA = A_diag_i[i] + 1; jA < A_diag_i[i + 1]; jA++) { jj = A_diag_j[jA]; if ((CF_marker[jj] == SMRK) && (dof_func[i] == dof_func[jj])) { row_scale = hypre_max(row_scale, A_diag_data[jA]); row_sum += A_diag_data[jA]; } } for (jA = A_offd_i[i]; jA < A_offd_i[i + 1]; jA++) { jj = A_offd_j[jA]; if ((CF_marker_offd[jj] == SMRK) && (dof_func[i] == dof_func_offd[jj])) { row_scale = hypre_max(row_scale, A_offd_data[jA]); row_sum += A_offd_data[jA]; } } } /* diag < 0 */ else { for (jA = A_diag_i[i] + 1; jA < A_diag_i[i + 1]; jA++) { jj = A_diag_j[jA]; if ((CF_marker[jj] == SMRK) && (dof_func[i] == dof_func[jj])) { row_scale = hypre_min(row_scale, A_diag_data[jA]); row_sum += A_diag_data[jA]; } } for (jA = A_offd_i[i]; jA < A_offd_i[i + 1]; jA++) { jj = A_offd_j[jA]; if ((CF_marker_offd[jj] == SMRK) && (dof_func[i] == dof_func_offd[A_offd_j[jA]])) { row_scale = hypre_min(row_scale, A_offd_data[jA]); row_sum += A_offd_data[jA]; } } } /* diag >= 0 */ } /* num_functions > 1 */ else { if (diag < 0) { for (jA = A_diag_i[i] + 1; jA < A_diag_i[i + 1]; jA++) { jj = A_diag_j[jA]; if (CF_marker[jj] == SMRK) { row_scale = hypre_max(row_scale, A_diag_data[jA]); row_sum += A_diag_data[jA]; } } for (jA = A_offd_i[i]; jA < A_offd_i[i + 1]; jA++) { jj = A_offd_j[jA]; if (CF_marker_offd[jj] == SMRK) { row_scale = hypre_max(row_scale, A_offd_data[jA]); row_sum += A_offd_data[jA]; } } } /* diag < 0 */ else { for (jA = A_diag_i[i] + 1; jA < A_diag_i[i + 1]; jA++) { jj = A_diag_j[jA]; if (CF_marker[jj] == SMRK) { row_scale = hypre_min(row_scale, A_diag_data[jA]); row_sum += A_diag_data[jA]; } } for (jA = A_offd_i[i]; jA < A_offd_i[i + 1]; jA++) { jj = A_offd_j[jA]; if (CF_marker_offd[jj] == SMRK) { row_scale = hypre_min(row_scale, A_offd_data[jA]); row_sum += A_offd_data[jA]; } } } /* diag >= 0*/ } /* num_functions <=1 */ /* compute row entries of S */ S_temp_diag_j[A_diag_i[i]] = -1; if ((hypre_abs(row_sum) > hypre_abs(diag)*max_row_sum) && (max_row_sum < 1.0)) { /* make all dependencies weak */ for (jA = A_diag_i[i] + 1; jA < A_diag_i[i + 1]; jA++) { S_temp_diag_j[jA] = -1; } for (jA = A_offd_i[i]; jA < A_offd_i[i + 1]; jA++) { S_temp_offd_j[jA] = -1; } } else { if (num_functions > 1) { if (diag < 0) { for (jA = A_diag_i[i] + 1; jA < A_diag_i[i + 1]; jA++) { jj = A_diag_j[jA]; if (CF_marker[jj] == SMRK) { if ((A_diag_data[jA] <= strength_threshold * row_scale) || (dof_func[i] != dof_func[jj])) { S_temp_diag_j[jA] = -1; } else { S_temp_diag_j[jA] = jj; ++jS_diag; } } else { S_temp_diag_j[jA] = -1; } } for (jA = A_offd_i[i]; jA < A_offd_i[i + 1]; jA++) { jj = A_offd_j[jA]; if (CF_marker_offd[jj] == SMRK) { if ((A_offd_data[jA] <= strength_threshold * row_scale) || (dof_func[i] != dof_func_offd[jj])) { S_temp_offd_j[jA] = -1; } else { S_temp_offd_j[jA] = jj; ++jS_offd; } } else { S_temp_offd_j[jA] = -1; } } } /* end diag < 0 */ else { for (jA = A_diag_i[i] + 1; jA < A_diag_i[i + 1]; jA++) { jj = A_diag_j[jA]; if (CF_marker[jj] == SMRK) { if ((A_diag_data[jA] >= strength_threshold * row_scale) || (dof_func[i] != dof_func[jj])) { S_temp_diag_j[jA] = -1; } else { S_temp_diag_j[jA] = jj; ++jS_diag; } } else { S_temp_diag_j[jA] = -1; } } for (jA = A_offd_i[i]; jA < A_offd_i[i + 1]; jA++) { jj = A_offd_j[jA]; if (CF_marker_offd[jj] == SMRK) { if ((A_offd_data[jA] >= strength_threshold * row_scale) || (dof_func[i] != dof_func_offd[jj])) { S_temp_offd_j[jA] = -1; } else { S_temp_offd_j[jA] = jj; ++jS_offd; } } else { S_temp_offd_j[jA] = -1; } } } /* diag >= 0 */ } /* num_functions > 1 */ else { if (diag < 0) { for (jA = A_diag_i[i] + 1; jA < A_diag_i[i + 1]; jA++) { jj = A_diag_j[jA]; if (CF_marker[jj] == SMRK) { if (A_diag_data[jA] <= strength_threshold * row_scale) { S_temp_diag_j[jA] = -1; } else { S_temp_diag_j[jA] = jj; ++jS_diag; } } else { S_temp_diag_j[jA] = -1; } } for (jA = A_offd_i[i]; jA < A_offd_i[i + 1]; jA++) { jj = A_offd_j[jA]; if (CF_marker_offd[jj] == SMRK) { if (A_offd_data[jA] <= strength_threshold * row_scale) { S_temp_offd_j[jA] = -1; } else { S_temp_offd_j[jA] = jj; ++jS_offd; } } else { S_temp_offd_j[jA] = -1; } } } /* diag < 0 */ else { for (jA = A_diag_i[i] + 1; jA < A_diag_i[i + 1]; jA++) { jj = A_diag_j[jA]; if (CF_marker[jj] == SMRK) { if (A_diag_data[jA] >= strength_threshold * row_scale) { S_temp_diag_j[jA] = -1; } else { S_temp_diag_j[jA] = jj; ++jS_diag; } } else { S_temp_diag_j[jA] = -1; } } for (jA = A_offd_i[i]; jA < A_offd_i[i + 1]; jA++) { jj = A_offd_j[jA]; if (CF_marker_offd[jj] == SMRK) { if (A_offd_data[jA] >= strength_threshold * row_scale) { S_temp_offd_j[jA] = -1; } else { S_temp_offd_j[jA] = jj; ++jS_offd; } } else { S_temp_offd_j[jA] = -1; } } } /* diag >= 0 */ } /* num_functions <=1 */ } /* !((row_sum > max_row_sum) && (max_row_sum < 1.0)) */ } /* CF_marker == SMRK */ else { S_diag_i[i] = jS_diag; if (num_cols_offd) { S_offd_i[i] = jS_offd; } for (jA = A_diag_i[i]; jA < A_diag_i[i + 1]; jA++) { S_temp_diag_j[jA] = -1; } for (jA = A_offd_i[i]; jA < A_offd_i[i + 1]; jA++) { S_temp_offd_j[jA] = -1; } } /* CF_marker != SMRK */ } /* for each variable */ hypre_prefix_sum_pair(&jS_diag, S_diag_i + num_variables, &jS_offd, S_offd_i + num_variables, prefix_sum_workspace); /*-------------------------------------------------------------- * "Compress" the strength matrix. * * NOTE: S has *NO DIAGONAL ELEMENT* on any row. Caveat Emptor! * * NOTE: This "compression" section of code may be removed, and * coarsening will still be done correctly. However, the routine * that builds interpolation would have to be modified first. *----------------------------------------------------------------*/ for (i = start; i < stop; i++) { S_diag_i[i] += jS_diag; S_offd_i[i] += jS_offd; jS = S_diag_i[i]; for (jA = A_diag_i[i]; jA < A_diag_i[i + 1]; jA++) { if (S_temp_diag_j[jA] > -1) { S_diag_j[jS] = S_temp_diag_j[jA]; jS++; } } jS = S_offd_i[i]; for (jA = A_offd_i[i]; jA < A_offd_i[i + 1]; jA++) { if (S_temp_offd_j[jA] > -1) { S_offd_j[jS] = S_temp_offd_j[jA]; jS++; } } } /* for each variable */ } /* omp parallel */ hypre_CSRMatrixNumNonzeros(S_diag) = S_diag_i[num_variables]; hypre_CSRMatrixNumNonzeros(S_offd) = S_offd_i[num_variables]; hypre_CSRMatrixJ(S_diag) = S_diag_j; hypre_CSRMatrixJ(S_offd) = S_offd_j; hypre_CSRMatrixMemoryLocation(S_diag) = HYPRE_MEMORY_HOST; hypre_CSRMatrixMemoryLocation(S_offd) = HYPRE_MEMORY_HOST; hypre_ParCSRMatrixCommPkg(S) = NULL; hypre_ParCSRMatrixMigrate(S, memloc); *S_ptr = S; hypre_TFree(prefix_sum_workspace, HYPRE_MEMORY_HOST); hypre_TFree(S_temp_diag_j, HYPRE_MEMORY_HOST); hypre_TFree(S_temp_offd_j, HYPRE_MEMORY_HOST); hypre_TFree(dof_func_offd, HYPRE_MEMORY_HOST); hypre_TFree(CF_marker_offd, HYPRE_MEMORY_HOST); #ifdef HYPRE_PROFILE hypre_profile_times[HYPRE_TIMER_ID_CREATES] += hypre_MPI_Wtime(); #endif return (ierr); } /*==========================================================================*/ /*==========================================================================*/ /** Generates strength matrix Notes: \begin{itemize} \item The underlying matrix storage scheme is a hypre_ParCSR matrix. \item The routine returns the following: \begin{itemize} \item S - a ParCSR matrix representing the "strength matrix". This is used in the coarsening and interpolation routines. \end{itemize} \item The graph of the "strength matrix" for A is a subgraph of the graph of A, but requires nonsymmetric storage even if A is symmetric. This is because of the directional nature of the "strengh of dependence" notion (see below). Since we are using nonsymmetric storage for A right now, this is not a problem. If we ever add the ability to store A symmetrically, then we could store the strength graph as floats instead of doubles to save space. \item This routine currently "compresses" the strength matrix. We should consider the possibility of defining this matrix to have the same "nonzero structure" as A. To do this, we could use the same A\_i and A\_j arrays, and would need only define the S\_data array. There are several pros and cons to discuss. \end{itemize} Terminology: \begin{itemize} \item Ruge's terminology: A point is "strongly connected to" $j$, or "strongly depends on" $j$, if $|a_ij| >= \theta max_{l != j} |a_il|}$. \item Here, we retain some of this terminology, but with a more generalized notion of "strength". We also retain the "natural" graph notation for representing the directed graph of a matrix. That is, the nonzero entry $a_ij$ is represented as: i --> j. In the strength matrix, S, the entry $s_ij$ is also graphically denoted as above, and means both of the following: \begin{itemize} \item $i$ "depends on" $j$ with "strength" $s_ij$ \item $j$ "influences" $i$ with "strength" $s_ij$ \end{itemize} \end{itemize} {\bf Input files:} _hypre_parcsr_ls.h @return Error code. @param A [IN] coefficient matrix @param strength_threshold [IN] threshold parameter used to define strength @param max_row_sum [IN] parameter used to modify definition of strength for diagonal dominant matrices @param S_ptr [OUT] strength matrix @see */ /*--------------------------------------------------------------------------*/ HYPRE_Int hypre_BoomerAMGCreateSabsHost(hypre_ParCSRMatrix *A, HYPRE_Real strength_threshold, HYPRE_Real max_row_sum, HYPRE_Int num_functions, HYPRE_Int *dof_func, hypre_ParCSRMatrix **S_ptr) { MPI_Comm comm = hypre_ParCSRMatrixComm(A); hypre_ParCSRCommPkg *comm_pkg = hypre_ParCSRMatrixCommPkg(A); hypre_ParCSRCommHandle *comm_handle; hypre_CSRMatrix *A_diag = hypre_ParCSRMatrixDiag(A); HYPRE_Int *A_diag_i = hypre_CSRMatrixI(A_diag); HYPRE_Real *A_diag_data = hypre_CSRMatrixData(A_diag); hypre_CSRMatrix *A_offd = hypre_ParCSRMatrixOffd(A); HYPRE_Int *A_offd_i = hypre_CSRMatrixI(A_offd); HYPRE_Real *A_offd_data = NULL; HYPRE_Int *A_diag_j = hypre_CSRMatrixJ(A_diag); HYPRE_Int *A_offd_j = hypre_CSRMatrixJ(A_offd); HYPRE_BigInt *row_starts = hypre_ParCSRMatrixRowStarts(A); HYPRE_Int num_variables = hypre_CSRMatrixNumRows(A_diag); HYPRE_BigInt global_num_vars = hypre_ParCSRMatrixGlobalNumRows(A); HYPRE_Int num_nonzeros_diag; HYPRE_Int num_nonzeros_offd = 0; HYPRE_Int num_cols_offd = 0; hypre_ParCSRMatrix *S; hypre_CSRMatrix *S_diag; HYPRE_Int *S_diag_i; HYPRE_Int *S_diag_j; /* HYPRE_Real *S_diag_data; */ hypre_CSRMatrix *S_offd; HYPRE_Int *S_offd_i = NULL; HYPRE_Int *S_offd_j = NULL; /* HYPRE_Real *S_offd_data; */ HYPRE_Real diag, row_scale, row_sum; HYPRE_Int i, jA, jS; HYPRE_Int ierr = 0; HYPRE_Int *dof_func_offd; HYPRE_Int num_sends; HYPRE_Int *int_buf_data; HYPRE_Int index, start, j; HYPRE_MemoryLocation memory_location = hypre_ParCSRMatrixMemoryLocation(A); /*-------------------------------------------------------------- * Compute a ParCSR strength matrix, S. * * Absolute "strength" of dependence/influence is defined in * the following way: i depends on j if * abs(aij) > hypre_max (k != i) abs(aik) * * NOTE: the entries are negative initially, corresponding * to "unaccounted-for" dependence. *----------------------------------------------------------------*/ num_nonzeros_diag = A_diag_i[num_variables]; num_cols_offd = hypre_CSRMatrixNumCols(A_offd); A_offd_i = hypre_CSRMatrixI(A_offd); num_nonzeros_offd = A_offd_i[num_variables]; S = hypre_ParCSRMatrixCreate(comm, global_num_vars, global_num_vars, row_starts, row_starts, num_cols_offd, num_nonzeros_diag, num_nonzeros_offd); S_diag = hypre_ParCSRMatrixDiag(S); hypre_CSRMatrixI(S_diag) = hypre_CTAlloc(HYPRE_Int, num_variables + 1, memory_location); hypre_CSRMatrixJ(S_diag) = hypre_CTAlloc(HYPRE_Int, num_nonzeros_diag, memory_location); S_offd = hypre_ParCSRMatrixOffd(S); hypre_CSRMatrixI(S_offd) = hypre_CTAlloc(HYPRE_Int, num_variables + 1, memory_location); S_diag_i = hypre_CSRMatrixI(S_diag); S_diag_j = hypre_CSRMatrixJ(S_diag); S_offd_i = hypre_CSRMatrixI(S_offd); hypre_CSRMatrixMemoryLocation(S_diag) = memory_location; hypre_CSRMatrixMemoryLocation(S_offd) = memory_location; dof_func_offd = NULL; if (num_cols_offd) { A_offd_data = hypre_CSRMatrixData(A_offd); hypre_CSRMatrixJ(S_offd) = hypre_CTAlloc(HYPRE_Int, num_nonzeros_offd, memory_location); S_offd_j = hypre_CSRMatrixJ(S_offd); hypre_ParCSRMatrixColMapOffd(S) = hypre_CTAlloc(HYPRE_BigInt, num_cols_offd, HYPRE_MEMORY_HOST); if (num_functions > 1) { dof_func_offd = hypre_CTAlloc(HYPRE_Int, num_cols_offd, HYPRE_MEMORY_HOST); } } /*------------------------------------------------------------------- * Get the dof_func data for the off-processor columns *-------------------------------------------------------------------*/ if (!comm_pkg) { hypre_MatvecCommPkgCreate(A); comm_pkg = hypre_ParCSRMatrixCommPkg(A); } num_sends = hypre_ParCSRCommPkgNumSends(comm_pkg); if (num_functions > 1) { int_buf_data = hypre_CTAlloc(HYPRE_Int, hypre_ParCSRCommPkgSendMapStart(comm_pkg, num_sends), HYPRE_MEMORY_HOST); index = 0; for (i = 0; i < num_sends; i++) { start = hypre_ParCSRCommPkgSendMapStart(comm_pkg, i); for (j = start; j < hypre_ParCSRCommPkgSendMapStart(comm_pkg, i + 1); j++) { int_buf_data[index++] = dof_func[hypre_ParCSRCommPkgSendMapElmt(comm_pkg, j)]; } } comm_handle = hypre_ParCSRCommHandleCreate( 11, comm_pkg, int_buf_data, dof_func_offd); hypre_ParCSRCommHandleDestroy(comm_handle); hypre_TFree(int_buf_data, HYPRE_MEMORY_HOST); } /* give S same nonzero structure as A */ hypre_ParCSRMatrixCopy(A, S, 0); #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i,diag,row_scale,row_sum,jA) HYPRE_SMP_SCHEDULE #endif for (i = 0; i < num_variables; i++) { diag = A_diag_data[A_diag_i[i]]; /* compute scaling factor and row sum */ row_scale = 0.0; row_sum = hypre_abs(diag); if (num_functions > 1) { for (jA = A_diag_i[i] + 1; jA < A_diag_i[i + 1]; jA++) { if (dof_func[i] == dof_func[A_diag_j[jA]]) { row_scale = hypre_max(row_scale, hypre_abs(A_diag_data[jA])); row_sum += hypre_abs(A_diag_data[jA]); } } for (jA = A_offd_i[i]; jA < A_offd_i[i + 1]; jA++) { if (dof_func[i] == dof_func_offd[A_offd_j[jA]]) { row_scale = hypre_max(row_scale, hypre_abs(A_offd_data[jA])); row_sum += hypre_abs(A_offd_data[jA]); } } } else { for (jA = A_diag_i[i] + 1; jA < A_diag_i[i + 1]; jA++) { row_scale = hypre_max(row_scale, hypre_abs(A_diag_data[jA])); row_sum += hypre_abs(A_diag_data[jA]); } for (jA = A_offd_i[i]; jA < A_offd_i[i + 1]; jA++) { row_scale = hypre_max(row_scale, hypre_abs(A_offd_data[jA])); row_sum += hypre_abs(A_offd_data[jA]); } } /* compute row entries of S */ S_diag_j[A_diag_i[i]] = -1; /* reject diag entry */ if ( hypre_abs(row_sum) < hypre_abs(diag) * (2.0 - max_row_sum) && max_row_sum < 1.0 ) { /* make all dependencies weak */ for (jA = A_diag_i[i] + 1; jA < A_diag_i[i + 1]; jA++) { S_diag_j[jA] = -1; } for (jA = A_offd_i[i]; jA < A_offd_i[i + 1]; jA++) { S_offd_j[jA] = -1; } } else { if (num_functions > 1) { for (jA = A_diag_i[i] + 1; jA < A_diag_i[i + 1]; jA++) { if (hypre_abs(A_diag_data[jA]) <= strength_threshold * row_scale || dof_func[i] != dof_func[A_diag_j[jA]]) { S_diag_j[jA] = -1; } } for (jA = A_offd_i[i]; jA < A_offd_i[i + 1]; jA++) { if (hypre_abs(A_offd_data[jA]) <= strength_threshold * row_scale || dof_func[i] != dof_func_offd[A_offd_j[jA]]) { S_offd_j[jA] = -1; } } } else { for (jA = A_diag_i[i] + 1; jA < A_diag_i[i + 1]; jA++) { if (hypre_abs(A_diag_data[jA]) <= strength_threshold * row_scale) { S_diag_j[jA] = -1; } } for (jA = A_offd_i[i]; jA < A_offd_i[i + 1]; jA++) { if (hypre_abs(A_offd_data[jA]) <= strength_threshold * row_scale) { S_offd_j[jA] = -1; } } } } } /*-------------------------------------------------------------- * "Compress" the strength matrix. * * NOTE: S has *NO DIAGONAL ELEMENT* on any row. Caveat Emptor! * * NOTE: This "compression" section of code may be removed, and * coarsening will still be done correctly. However, the routine * that builds interpolation would have to be modified first. *----------------------------------------------------------------*/ /* RDF: not sure if able to thread this loop */ jS = 0; for (i = 0; i < num_variables; i++) { S_diag_i[i] = jS; for (jA = A_diag_i[i]; jA < A_diag_i[i + 1]; jA++) { if (S_diag_j[jA] > -1) { S_diag_j[jS] = S_diag_j[jA]; jS++; } } } S_diag_i[num_variables] = jS; hypre_CSRMatrixNumNonzeros(S_diag) = jS; /* RDF: not sure if able to thread this loop */ jS = 0; for (i = 0; i < num_variables; i++) { S_offd_i[i] = jS; for (jA = A_offd_i[i]; jA < A_offd_i[i + 1]; jA++) { if (S_offd_j[jA] > -1) { S_offd_j[jS] = S_offd_j[jA]; jS++; } } } S_offd_i[num_variables] = jS; hypre_CSRMatrixNumNonzeros(S_offd) = jS; hypre_ParCSRMatrixCommPkg(S) = NULL; *S_ptr = S; hypre_TFree(dof_func_offd, HYPRE_MEMORY_HOST); return (ierr); } HYPRE_Int hypre_BoomerAMGCreateSabs(hypre_ParCSRMatrix *A, HYPRE_Real strength_threshold, HYPRE_Real max_row_sum, HYPRE_Int num_functions, HYPRE_Int *dof_func, hypre_ParCSRMatrix **S_ptr) { hypre_GpuProfilingPushRange("CreateSabs"); HYPRE_Int ierr = 0; #if defined(HYPRE_USING_GPU) HYPRE_ExecutionPolicy exec = hypre_GetExecPolicy1( hypre_ParCSRMatrixMemoryLocation(A) ); if (exec == HYPRE_EXEC_DEVICE) { ierr = hypre_BoomerAMGCreateSDevice(A, 1, strength_threshold, max_row_sum, num_functions, dof_func, S_ptr); } else #endif { ierr = hypre_BoomerAMGCreateSabsHost(A, strength_threshold, max_row_sum, num_functions, dof_func, S_ptr); } hypre_GpuProfilingPopRange(); return ierr; } /*--------------------------------------------------------------------------*/ HYPRE_Int hypre_BoomerAMGCreateSCommPkg(hypre_ParCSRMatrix *A, hypre_ParCSRMatrix *S, HYPRE_Int **col_offd_S_to_A_ptr) { MPI_Comm comm = hypre_ParCSRMatrixComm(A); hypre_MPI_Status *status; hypre_MPI_Request *requests; hypre_ParCSRCommPkg *comm_pkg_A = hypre_ParCSRMatrixCommPkg(A); hypre_ParCSRCommPkg *comm_pkg_S = NULL; hypre_ParCSRCommHandle *comm_handle; hypre_CSRMatrix *A_offd = hypre_ParCSRMatrixOffd(A); HYPRE_BigInt *col_map_offd_A = hypre_ParCSRMatrixColMapOffd(A); hypre_CSRMatrix *S_diag = hypre_ParCSRMatrixDiag(S); hypre_CSRMatrix *S_offd = hypre_ParCSRMatrixOffd(S); HYPRE_Int *S_offd_i = hypre_CSRMatrixI(S_offd); HYPRE_Int *S_offd_j = hypre_CSRMatrixJ(S_offd); HYPRE_BigInt *col_map_offd_S = hypre_ParCSRMatrixColMapOffd(S); HYPRE_Int *recv_procs_A = hypre_ParCSRCommPkgRecvProcs(comm_pkg_A); HYPRE_Int *recv_vec_starts_A = hypre_ParCSRCommPkgRecvVecStarts(comm_pkg_A); HYPRE_Int *send_procs_A = hypre_ParCSRCommPkgSendProcs(comm_pkg_A); HYPRE_Int *send_map_starts_A = hypre_ParCSRCommPkgSendMapStarts(comm_pkg_A); HYPRE_Int *recv_procs_S; HYPRE_Int *recv_vec_starts_S; HYPRE_Int *send_procs_S; HYPRE_Int *send_map_starts_S; HYPRE_Int *send_map_elmts_S = NULL; HYPRE_BigInt *big_send_map_elmts_S = NULL; HYPRE_Int *col_offd_S_to_A; HYPRE_Int *S_marker; HYPRE_Int *send_change; HYPRE_Int *recv_change; HYPRE_Int num_variables = hypre_CSRMatrixNumRows(S_diag); HYPRE_Int num_cols_offd_A = hypre_CSRMatrixNumCols(A_offd); HYPRE_Int num_cols_offd_S; HYPRE_Int i, j, jcol; HYPRE_Int proc, cnt, proc_cnt, total_nz; HYPRE_BigInt first_row; HYPRE_Int ierr = 0; HYPRE_Int num_sends_A = hypre_ParCSRCommPkgNumSends(comm_pkg_A); HYPRE_Int num_recvs_A = hypre_ParCSRCommPkgNumRecvs(comm_pkg_A); HYPRE_Int num_sends_S; HYPRE_Int num_recvs_S; HYPRE_Int num_nonzeros; num_nonzeros = S_offd_i[num_variables]; S_marker = NULL; if (num_cols_offd_A) { S_marker = hypre_CTAlloc(HYPRE_Int, num_cols_offd_A, HYPRE_MEMORY_HOST); } for (i = 0; i < num_cols_offd_A; i++) { S_marker[i] = -1; } for (i = 0; i < num_nonzeros; i++) { jcol = S_offd_j[i]; S_marker[jcol] = 0; } proc = 0; proc_cnt = 0; cnt = 0; num_recvs_S = 0; for (i = 0; i < num_recvs_A; i++) { for (j = recv_vec_starts_A[i]; j < recv_vec_starts_A[i + 1]; j++) { if (!S_marker[j]) { S_marker[j] = cnt; cnt++; proc = 1; } } if (proc) {num_recvs_S++; proc = 0;} } num_cols_offd_S = cnt; recv_change = NULL; recv_procs_S = NULL; send_change = NULL; if (col_map_offd_S) { hypre_TFree(col_map_offd_S, HYPRE_MEMORY_HOST); } col_map_offd_S = NULL; col_offd_S_to_A = NULL; if (num_recvs_A) { recv_change = hypre_CTAlloc(HYPRE_Int, num_recvs_A, HYPRE_MEMORY_HOST); } if (num_sends_A) { send_change = hypre_CTAlloc(HYPRE_Int, num_sends_A, HYPRE_MEMORY_HOST); } if (num_recvs_S) { recv_procs_S = hypre_CTAlloc(HYPRE_Int, num_recvs_S, HYPRE_MEMORY_HOST); } recv_vec_starts_S = hypre_CTAlloc(HYPRE_Int, num_recvs_S + 1, HYPRE_MEMORY_HOST); if (num_cols_offd_S) { col_map_offd_S = hypre_CTAlloc(HYPRE_BigInt, num_cols_offd_S, HYPRE_MEMORY_HOST); col_offd_S_to_A = hypre_CTAlloc(HYPRE_Int, num_cols_offd_S, HYPRE_MEMORY_HOST); } if (num_cols_offd_S < num_cols_offd_A) { for (i = 0; i < num_nonzeros; i++) { jcol = S_offd_j[i]; S_offd_j[i] = S_marker[jcol]; } proc = 0; proc_cnt = 0; cnt = 0; recv_vec_starts_S[0] = 0; for (i = 0; i < num_recvs_A; i++) { for (j = recv_vec_starts_A[i]; j < recv_vec_starts_A[i + 1]; j++) { if (S_marker[j] != -1) { col_map_offd_S[cnt] = col_map_offd_A[j]; col_offd_S_to_A[cnt++] = j; proc = 1; } } recv_change[i] = j - cnt - recv_vec_starts_A[i] + recv_vec_starts_S[proc_cnt]; if (proc) { recv_procs_S[proc_cnt++] = recv_procs_A[i]; recv_vec_starts_S[proc_cnt] = cnt; proc = 0; } } } else { for (i = 0; i < num_recvs_A; i++) { for (j = recv_vec_starts_A[i]; j < recv_vec_starts_A[i + 1]; j++) { col_map_offd_S[j] = col_map_offd_A[j]; col_offd_S_to_A[j] = j; } recv_procs_S[i] = recv_procs_A[i]; recv_vec_starts_S[i] = recv_vec_starts_A[i]; } recv_vec_starts_S[num_recvs_A] = recv_vec_starts_A[num_recvs_A]; } requests = hypre_CTAlloc(hypre_MPI_Request, num_sends_A + num_recvs_A, HYPRE_MEMORY_HOST); j = 0; for (i = 0; i < num_sends_A; i++) { hypre_MPI_Irecv(&send_change[i], 1, HYPRE_MPI_INT, send_procs_A[i], 0, comm, &requests[j++]); } for (i = 0; i < num_recvs_A; i++) { hypre_MPI_Isend(&recv_change[i], 1, HYPRE_MPI_INT, recv_procs_A[i], 0, comm, &requests[j++]); } status = hypre_CTAlloc(hypre_MPI_Status, j, HYPRE_MEMORY_HOST); hypre_MPI_Waitall(j, requests, status); hypre_TFree(status, HYPRE_MEMORY_HOST); hypre_TFree(requests, HYPRE_MEMORY_HOST); num_sends_S = 0; total_nz = send_map_starts_A[num_sends_A]; for (i = 0; i < num_sends_A; i++) { if (send_change[i]) { if ((send_map_starts_A[i + 1] - send_map_starts_A[i]) > send_change[i]) { num_sends_S++; } } else { num_sends_S++; } total_nz -= send_change[i]; } send_procs_S = NULL; if (num_sends_S) { send_procs_S = hypre_CTAlloc(HYPRE_Int, num_sends_S, HYPRE_MEMORY_HOST); } send_map_starts_S = hypre_CTAlloc(HYPRE_Int, num_sends_S + 1, HYPRE_MEMORY_HOST); send_map_elmts_S = NULL; if (total_nz) { send_map_elmts_S = hypre_CTAlloc(HYPRE_Int, total_nz, HYPRE_MEMORY_HOST); big_send_map_elmts_S = hypre_CTAlloc(HYPRE_BigInt, total_nz, HYPRE_MEMORY_HOST); } proc = 0; proc_cnt = 0; for (i = 0; i < num_sends_A; i++) { cnt = send_map_starts_A[i + 1] - send_map_starts_A[i] - send_change[i]; if (cnt) { send_procs_S[proc_cnt++] = send_procs_A[i]; send_map_starts_S[proc_cnt] = send_map_starts_S[proc_cnt - 1] + cnt; } } /* Create communication package for S */ hypre_ParCSRCommPkgCreateAndFill(comm, num_recvs_S, recv_procs_S, recv_vec_starts_S, num_sends_S, send_procs_S, send_map_starts_S, send_map_elmts_S, &comm_pkg_S); comm_handle = hypre_ParCSRCommHandleCreate(22, comm_pkg_S, col_map_offd_S, big_send_map_elmts_S); hypre_ParCSRCommHandleDestroy(comm_handle); first_row = hypre_ParCSRMatrixFirstRowIndex(A); if (first_row) { for (i = 0; i < send_map_starts_S[num_sends_S]; i++) { send_map_elmts_S[i] = (HYPRE_Int)(big_send_map_elmts_S[i] - first_row); } } hypre_ParCSRMatrixCommPkg(S) = comm_pkg_S; hypre_ParCSRMatrixColMapOffd(S) = col_map_offd_S; hypre_CSRMatrixNumCols(S_offd) = num_cols_offd_S; hypre_TFree(S_marker, HYPRE_MEMORY_HOST); hypre_TFree(send_change, HYPRE_MEMORY_HOST); hypre_TFree(recv_change, HYPRE_MEMORY_HOST); *col_offd_S_to_A_ptr = col_offd_S_to_A; return ierr; } /*-------------------------------------------------------------------------- * hypre_BoomerAMGCreate2ndS : creates strength matrix on coarse points * for second coarsening pass in aggressive coarsening (S*S+2S) *--------------------------------------------------------------------------*/ HYPRE_Int hypre_BoomerAMGCreate2ndSHost( hypre_ParCSRMatrix *S, HYPRE_Int *CF_marker, HYPRE_Int num_paths, HYPRE_BigInt *coarse_row_starts, hypre_ParCSRMatrix **C_ptr) { #ifdef HYPRE_PROFILE hypre_profile_times[HYPRE_TIMER_ID_CREATE_2NDS] -= hypre_MPI_Wtime(); #endif MPI_Comm comm = hypre_ParCSRMatrixComm(S); hypre_ParCSRCommPkg *comm_pkg = hypre_ParCSRMatrixCommPkg(S); hypre_ParCSRCommPkg *tmp_comm_pkg = NULL; hypre_ParCSRCommHandle *comm_handle; hypre_CSRMatrix *S_diag = hypre_ParCSRMatrixDiag(S); HYPRE_Int *S_diag_i = hypre_CSRMatrixI(S_diag); HYPRE_Int *S_diag_j = hypre_CSRMatrixJ(S_diag); hypre_CSRMatrix *S_offd = hypre_ParCSRMatrixOffd(S); HYPRE_Int *S_offd_i = hypre_CSRMatrixI(S_offd); HYPRE_Int *S_offd_j = hypre_CSRMatrixJ(S_offd); HYPRE_Int num_cols_diag_S = hypre_CSRMatrixNumCols(S_diag); HYPRE_Int num_cols_offd_S = hypre_CSRMatrixNumCols(S_offd); hypre_ParCSRMatrix *S2; HYPRE_BigInt *col_map_offd_C = NULL; hypre_CSRMatrix *C_diag; /*HYPRE_Int *C_diag_data = NULL;*/ HYPRE_Int *C_diag_i; HYPRE_Int *C_diag_j = NULL; hypre_CSRMatrix *C_offd; /*HYPRE_Int *C_offd_data=NULL;*/ HYPRE_Int *C_offd_i; HYPRE_Int *C_offd_j = NULL; HYPRE_Int num_cols_offd_C = 0; HYPRE_Int *S_ext_diag_i = NULL; HYPRE_Int *S_ext_diag_j = NULL; HYPRE_Int S_ext_diag_size = 0; HYPRE_Int *S_ext_offd_i = NULL; HYPRE_Int *S_ext_offd_j = NULL; HYPRE_Int S_ext_offd_size = 0; HYPRE_Int *CF_marker_offd = NULL; HYPRE_Int *S_marker = NULL; HYPRE_Int *S_marker_offd = NULL; //HYPRE_Int *temp = NULL; HYPRE_Int *fine_to_coarse = NULL; HYPRE_BigInt *fine_to_coarse_offd = NULL; HYPRE_Int *map_S_to_C = NULL; HYPRE_Int num_sends = 0; HYPRE_Int num_recvs = 0; HYPRE_Int *send_map_starts; HYPRE_Int *tmp_send_map_starts = NULL; HYPRE_Int *send_map_elmts; HYPRE_Int *recv_vec_starts; HYPRE_Int *tmp_recv_vec_starts = NULL; HYPRE_Int *int_buf_data = NULL; HYPRE_BigInt *big_int_buf_data = NULL; HYPRE_BigInt *temp = NULL; HYPRE_Int i, j, k; HYPRE_Int i1, i2, i3; HYPRE_BigInt big_i1; HYPRE_Int jj1, jj2, jrow, j_cnt; /*HYPRE_Int cnt, cnt_offd, cnt_diag;*/ HYPRE_Int num_procs, my_id; HYPRE_Int index; /*HYPRE_Int value;*/ HYPRE_Int num_coarse; HYPRE_Int num_nonzeros; HYPRE_BigInt global_num_coarse; HYPRE_BigInt my_first_cpt, my_last_cpt; HYPRE_Int *S_int_i = NULL; HYPRE_BigInt *S_int_j = NULL; HYPRE_Int *S_ext_i = NULL; HYPRE_BigInt *S_ext_j = NULL; /*HYPRE_Int prefix_sum_workspace[2*(hypre_NumThreads() + 1)];*/ HYPRE_Int *prefix_sum_workspace; HYPRE_Int *num_coarse_prefix_sum; prefix_sum_workspace = hypre_TAlloc(HYPRE_Int, 2 * (hypre_NumThreads() + 1), HYPRE_MEMORY_HOST); num_coarse_prefix_sum = hypre_TAlloc(HYPRE_Int, hypre_NumThreads() + 1, HYPRE_MEMORY_HOST); /*----------------------------------------------------------------------- * Extract S_ext, i.e. portion of B that is stored on neighbor procs * and needed locally for matrix matrix product *-----------------------------------------------------------------------*/ hypre_MPI_Comm_size(comm, &num_procs); hypre_MPI_Comm_rank(comm, &my_id); my_first_cpt = coarse_row_starts[0]; my_last_cpt = coarse_row_starts[1] - 1; if (my_id == (num_procs - 1)) { global_num_coarse = coarse_row_starts[1]; } hypre_MPI_Bcast(&global_num_coarse, 1, HYPRE_MPI_BIG_INT, num_procs - 1, comm); if (num_cols_offd_S) { CF_marker_offd = hypre_TAlloc(HYPRE_Int, num_cols_offd_S, HYPRE_MEMORY_HOST); fine_to_coarse_offd = hypre_TAlloc(HYPRE_BigInt, num_cols_offd_S, HYPRE_MEMORY_HOST); } HYPRE_Int *coarse_to_fine = NULL; if (num_cols_diag_S) { fine_to_coarse = hypre_TAlloc(HYPRE_Int, num_cols_diag_S, HYPRE_MEMORY_HOST); coarse_to_fine = hypre_TAlloc(HYPRE_Int, num_cols_diag_S, HYPRE_MEMORY_HOST); } /*HYPRE_Int num_coarse_prefix_sum[hypre_NumThreads() + 1];*/ #ifdef HYPRE_USING_OPENMP #pragma omp parallel private(i) #endif { HYPRE_Int num_coarse_private = 0; HYPRE_Int i_begin, i_end; hypre_GetSimpleThreadPartition(&i_begin, &i_end, num_cols_diag_S); for (i = i_begin; i < i_end; i++) { if (CF_marker[i] > 0) { num_coarse_private++; } } hypre_prefix_sum(&num_coarse_private, &num_coarse, num_coarse_prefix_sum); for (i = i_begin; i < i_end; i++) { if (CF_marker[i] > 0) { fine_to_coarse[i] = num_coarse_private; coarse_to_fine[num_coarse_private] = i; num_coarse_private++; } else { fine_to_coarse[i] = -1; } } } /* omp parallel */ if (num_procs > 1) { if (!comm_pkg) { hypre_MatvecCommPkgCreate(S); comm_pkg = hypre_ParCSRMatrixCommPkg(S); } num_sends = hypre_ParCSRCommPkgNumSends(comm_pkg); send_map_starts = hypre_ParCSRCommPkgSendMapStarts(comm_pkg); send_map_elmts = hypre_ParCSRCommPkgSendMapElmts(comm_pkg); num_recvs = hypre_ParCSRCommPkgNumRecvs(comm_pkg); recv_vec_starts = hypre_ParCSRCommPkgRecvVecStarts(comm_pkg); HYPRE_Int begin = send_map_starts[0]; HYPRE_Int end = send_map_starts[num_sends]; big_int_buf_data = hypre_TAlloc(HYPRE_BigInt, end, HYPRE_MEMORY_HOST); #ifdef HYPRE_USING_OPENMP #pragma omp parallel for HYPRE_SMP_SCHEDULE #endif for (index = begin; index < end; index++) { big_int_buf_data[index - begin] = (HYPRE_BigInt)fine_to_coarse[send_map_elmts[index]] + my_first_cpt; } comm_handle = hypre_ParCSRCommHandleCreate( 21, comm_pkg, big_int_buf_data, fine_to_coarse_offd); hypre_ParCSRCommHandleDestroy(comm_handle); int_buf_data = hypre_TAlloc(HYPRE_Int, end, HYPRE_MEMORY_HOST); #ifdef HYPRE_USING_OPENMP #pragma omp parallel for HYPRE_SMP_SCHEDULE #endif for (index = begin; index < end; index++) { int_buf_data[index - begin] = CF_marker[send_map_elmts[index]]; } comm_handle = hypre_ParCSRCommHandleCreate(11, comm_pkg, int_buf_data, CF_marker_offd); hypre_ParCSRCommHandleDestroy(comm_handle); hypre_TFree(int_buf_data, HYPRE_MEMORY_HOST); hypre_TFree(big_int_buf_data, HYPRE_MEMORY_HOST); S_int_i = hypre_TAlloc(HYPRE_Int, end + 1, HYPRE_MEMORY_HOST); S_ext_i = hypre_CTAlloc(HYPRE_Int, recv_vec_starts[num_recvs] + 1, HYPRE_MEMORY_HOST); /*-------------------------------------------------------------------------- * generate S_int_i through adding number of coarse row-elements of offd and diag * for corresponding rows. S_int_i[j+1] contains the number of coarse elements of * a row j (which is determined through send_map_elmts) *--------------------------------------------------------------------------*/ S_int_i[0] = 0; num_nonzeros = 0; #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(j,k) reduction(+:num_nonzeros) HYPRE_SMP_SCHEDULE #endif for (j = begin; j < end; j++) { HYPRE_Int jrow = send_map_elmts[j]; HYPRE_Int index = 0; for (k = S_diag_i[jrow]; k < S_diag_i[jrow + 1]; k++) { if (CF_marker[S_diag_j[k]] > 0) { index++; } } for (k = S_offd_i[jrow]; k < S_offd_i[jrow + 1]; k++) { if (CF_marker_offd[S_offd_j[k]] > 0) { index++; } } S_int_i[j - begin + 1] = index; num_nonzeros += S_int_i[j - begin + 1]; } /*-------------------------------------------------------------------------- * initialize communication *--------------------------------------------------------------------------*/ if (num_procs > 1) { comm_handle = hypre_ParCSRCommHandleCreate(11, comm_pkg, &S_int_i[1], &S_ext_i[1]); } if (num_nonzeros) { S_int_j = hypre_TAlloc(HYPRE_BigInt, num_nonzeros, HYPRE_MEMORY_HOST); } tmp_send_map_starts = hypre_CTAlloc(HYPRE_Int, num_sends + 1, HYPRE_MEMORY_HOST); tmp_recv_vec_starts = hypre_CTAlloc(HYPRE_Int, num_recvs + 1, HYPRE_MEMORY_HOST); tmp_send_map_starts[0] = 0; j_cnt = 0; for (i = 0; i < num_sends; i++) { for (j = send_map_starts[i]; j < send_map_starts[i + 1]; j++) { jrow = send_map_elmts[j]; for (k = S_diag_i[jrow]; k < S_diag_i[jrow + 1]; k++) { if (CF_marker[S_diag_j[k]] > 0) { S_int_j[j_cnt++] = (HYPRE_BigInt)fine_to_coarse[S_diag_j[k]] + my_first_cpt; } } for (k = S_offd_i[jrow]; k < S_offd_i[jrow + 1]; k++) { if (CF_marker_offd[S_offd_j[k]] > 0) { S_int_j[j_cnt++] = fine_to_coarse_offd[S_offd_j[k]]; } } } tmp_send_map_starts[i + 1] = j_cnt; } /* Create temporary communication package */ hypre_ParCSRCommPkgCreateAndFill(comm, num_recvs, hypre_ParCSRCommPkgRecvProcs(comm_pkg), tmp_recv_vec_starts, num_sends, hypre_ParCSRCommPkgSendProcs(comm_pkg), tmp_send_map_starts, NULL, &tmp_comm_pkg); hypre_ParCSRCommHandleDestroy(comm_handle); comm_handle = NULL; /*-------------------------------------------------------------------------- * after communication exchange S_ext_i[j+1] contains the number of coarse elements * of a row j ! * evaluate S_ext_i and compute num_nonzeros for S_ext *--------------------------------------------------------------------------*/ for (i = 0; i < recv_vec_starts[num_recvs]; i++) { S_ext_i[i + 1] += S_ext_i[i]; } num_nonzeros = S_ext_i[recv_vec_starts[num_recvs]]; if (num_nonzeros) { S_ext_j = hypre_TAlloc(HYPRE_BigInt, num_nonzeros, HYPRE_MEMORY_HOST); } for (i = 0; i < num_recvs; i++) { tmp_recv_vec_starts[i + 1] = S_ext_i[recv_vec_starts[i + 1]]; } comm_handle = hypre_ParCSRCommHandleCreate(21, tmp_comm_pkg, S_int_j, S_ext_j); hypre_ParCSRCommHandleDestroy(comm_handle); comm_handle = NULL; hypre_TFree(tmp_send_map_starts, HYPRE_MEMORY_HOST); hypre_TFree(tmp_recv_vec_starts, HYPRE_MEMORY_HOST); hypre_TFree(tmp_comm_pkg, HYPRE_MEMORY_HOST); hypre_TFree(S_int_i, HYPRE_MEMORY_HOST); hypre_TFree(S_int_j, HYPRE_MEMORY_HOST); #ifdef HYPRE_PROFILE hypre_profile_times[HYPRE_TIMER_ID_RENUMBER_COLIDX] -= hypre_MPI_Wtime(); #endif #ifdef HYPRE_CONCURRENT_HOPSCOTCH HYPRE_BigInt *S_big_offd_j = NULL; S_ext_diag_i = hypre_TAlloc(HYPRE_Int, num_cols_offd_S + 1, HYPRE_MEMORY_HOST); S_ext_diag_i[0] = 0; S_ext_offd_i = hypre_TAlloc(HYPRE_Int, num_cols_offd_S + 1, HYPRE_MEMORY_HOST); S_ext_offd_i[0] = 0; hypre_UnorderedBigIntSet found_set; hypre_UnorderedBigIntSetCreate(&found_set, S_ext_i[num_cols_offd_S] + num_cols_offd_S, 16 * hypre_NumThreads()); #pragma omp parallel private(i,j, big_i1) { HYPRE_Int S_ext_offd_size_private = 0; HYPRE_Int S_ext_diag_size_private = 0; HYPRE_Int i_begin, i_end; hypre_GetSimpleThreadPartition(&i_begin, &i_end, num_cols_offd_S); for (i = i_begin; i < i_end; i++) { if (CF_marker_offd[i] > 0) { hypre_UnorderedBigIntSetPut(&found_set, fine_to_coarse_offd[i]); } for (j = S_ext_i[i]; j < S_ext_i[i + 1]; j++) { big_i1 = S_ext_j[j]; if (big_i1 < my_first_cpt || big_i1 > my_last_cpt) { S_ext_offd_size_private++; hypre_UnorderedBigIntSetPut(&found_set, big_i1); } else { S_ext_diag_size_private++; } } } hypre_prefix_sum_pair( &S_ext_diag_size_private, &S_ext_diag_size, &S_ext_offd_size_private, &S_ext_offd_size, prefix_sum_workspace); #pragma omp master { if (S_ext_diag_size) { S_ext_diag_j = hypre_TAlloc(HYPRE_Int, S_ext_diag_size, HYPRE_MEMORY_HOST); } if (S_ext_offd_size) { S_ext_offd_j = hypre_TAlloc(HYPRE_Int, S_ext_offd_size, HYPRE_MEMORY_HOST); S_big_offd_j = hypre_TAlloc(HYPRE_BigInt, S_ext_offd_size, HYPRE_MEMORY_HOST); } } #pragma omp barrier for (i = i_begin; i < i_end; i++) { for (j = S_ext_i[i]; j < S_ext_i[i + 1]; j++) { big_i1 = S_ext_j[j]; if (big_i1 < my_first_cpt || big_i1 > my_last_cpt) { S_big_offd_j[S_ext_offd_size_private++] = big_i1; } //S_ext_offd_j[S_ext_offd_size_private++] = big_i1; else { S_ext_diag_j[S_ext_diag_size_private++] = (HYPRE_Int)(big_i1 - my_first_cpt); } } S_ext_diag_i[i + 1] = S_ext_diag_size_private; S_ext_offd_i[i + 1] = S_ext_offd_size_private; } } // omp parallel temp = hypre_UnorderedBigIntSetCopyToArray(&found_set, &num_cols_offd_C); hypre_UnorderedBigIntSetDestroy(&found_set); hypre_TFree(S_ext_i, HYPRE_MEMORY_HOST); hypre_UnorderedBigIntMap col_map_offd_C_inverse; hypre_big_sort_and_create_inverse_map(temp, num_cols_offd_C, &col_map_offd_C, &col_map_offd_C_inverse); #pragma omp parallel for HYPRE_SMP_SCHEDULE for (i = 0 ; i < S_ext_offd_size; i++) { S_ext_offd_j[i] = hypre_UnorderedBigIntMapGet(&col_map_offd_C_inverse, S_big_offd_j[i]); } //S_ext_offd_j[i] = hypre_UnorderedIntMapGet(&col_map_offd_C_inverse, S_ext_offd_j[i]); hypre_TFree(S_ext_j, HYPRE_MEMORY_HOST); hypre_TFree(S_big_offd_j, HYPRE_MEMORY_HOST); if (num_cols_offd_C) { hypre_UnorderedBigIntMapDestroy(&col_map_offd_C_inverse); } #else /* !HYPRE_CONCURRENT_HOPSCOTCH */ HYPRE_Int cnt_offd, cnt_diag, cnt, value; S_ext_diag_size = 0; S_ext_offd_size = 0; for (i = 0; i < num_cols_offd_S; i++) { for (j = S_ext_i[i]; j < S_ext_i[i + 1]; j++) { if (S_ext_j[j] < my_first_cpt || S_ext_j[j] > my_last_cpt) { S_ext_offd_size++; } else { S_ext_diag_size++; } } } S_ext_diag_i = hypre_CTAlloc(HYPRE_Int, num_cols_offd_S + 1, HYPRE_MEMORY_HOST); S_ext_offd_i = hypre_CTAlloc(HYPRE_Int, num_cols_offd_S + 1, HYPRE_MEMORY_HOST); if (S_ext_diag_size) { S_ext_diag_j = hypre_CTAlloc(HYPRE_Int, S_ext_diag_size, HYPRE_MEMORY_HOST); } if (S_ext_offd_size) { S_ext_offd_j = hypre_CTAlloc(HYPRE_Int, S_ext_offd_size, HYPRE_MEMORY_HOST); } cnt_offd = 0; cnt_diag = 0; cnt = 0; HYPRE_Int num_coarse_offd = 0; for (i = 0; i < num_cols_offd_S; i++) { if (CF_marker_offd[i] > 0) { num_coarse_offd++; } for (j = S_ext_i[i]; j < S_ext_i[i + 1]; j++) { big_i1 = S_ext_j[j]; if (big_i1 < my_first_cpt || big_i1 > my_last_cpt) { S_ext_j[cnt_offd++] = big_i1; } else { S_ext_diag_j[cnt_diag++] = (HYPRE_Int)(big_i1 - my_first_cpt); } } S_ext_diag_i[++cnt] = cnt_diag; S_ext_offd_i[cnt] = cnt_offd; } hypre_TFree(S_ext_i, HYPRE_MEMORY_HOST); cnt = 0; if (S_ext_offd_size || num_coarse_offd) { temp = hypre_CTAlloc(HYPRE_BigInt, S_ext_offd_size + num_coarse_offd, HYPRE_MEMORY_HOST); for (i = 0; i < S_ext_offd_size; i++) { temp[i] = S_ext_j[i]; } cnt = S_ext_offd_size; for (i = 0; i < num_cols_offd_S; i++) if (CF_marker_offd[i] > 0) { temp[cnt++] = fine_to_coarse_offd[i]; } } if (cnt) { hypre_BigQsort0(temp, 0, cnt - 1); num_cols_offd_C = 1; value = temp[0]; for (i = 1; i < cnt; i++) { if (temp[i] > value) { value = temp[i]; temp[num_cols_offd_C++] = value; } } } if (num_cols_offd_C) { col_map_offd_C = hypre_CTAlloc(HYPRE_BigInt, num_cols_offd_C, HYPRE_MEMORY_HOST); } for (i = 0; i < num_cols_offd_C; i++) { col_map_offd_C[i] = temp[i]; } if (S_ext_offd_size || num_coarse_offd) { hypre_TFree(temp, HYPRE_MEMORY_HOST); } for (i = 0 ; i < S_ext_offd_size; i++) S_ext_offd_j[i] = hypre_BigBinarySearch(col_map_offd_C, S_ext_j[i], num_cols_offd_C); hypre_TFree(S_ext_j, HYPRE_MEMORY_HOST); #endif /* !HYPRE_CONCURRENT_HOPSCOTCH */ if (num_cols_offd_S) { map_S_to_C = hypre_TAlloc(HYPRE_Int, num_cols_offd_S, HYPRE_MEMORY_HOST); #ifdef HYPRE_USING_OPENMP #pragma omp parallel private(i) #endif { HYPRE_Int i_begin, i_end; hypre_GetSimpleThreadPartition(&i_begin, &i_end, num_cols_offd_S); HYPRE_BigInt cnt = 0; for (i = i_begin; i < i_end; i++) { if (CF_marker_offd[i] > 0) { cnt = hypre_BigLowerBound(col_map_offd_C + cnt, col_map_offd_C + num_cols_offd_C, fine_to_coarse_offd[i]) - col_map_offd_C; map_S_to_C[i] = cnt++; } else { map_S_to_C[i] = -1; } } } /* omp parallel */ } #ifdef HYPRE_PROFILE hypre_profile_times[HYPRE_TIMER_ID_RENUMBER_COLIDX] += hypre_MPI_Wtime(); #endif } /* num_procs > 1 */ /*----------------------------------------------------------------------- * Allocate and initialize some stuff. *-----------------------------------------------------------------------*/ HYPRE_Int *S_marker_array = NULL, *S_marker_offd_array = NULL; if (num_coarse) { S_marker_array = hypre_TAlloc(HYPRE_Int, num_coarse * hypre_NumThreads(), HYPRE_MEMORY_HOST); } if (num_cols_offd_C) { S_marker_offd_array = hypre_TAlloc(HYPRE_Int, num_cols_offd_C * hypre_NumThreads(), HYPRE_MEMORY_HOST); } HYPRE_Int *C_temp_offd_j_array = NULL; HYPRE_Int *C_temp_diag_j_array = NULL; HYPRE_Int *C_temp_offd_data_array = NULL; HYPRE_Int *C_temp_diag_data_array = NULL; if (num_paths > 1) { C_temp_diag_j_array = hypre_TAlloc(HYPRE_Int, num_coarse * hypre_NumThreads(), HYPRE_MEMORY_HOST); C_temp_offd_j_array = hypre_TAlloc(HYPRE_Int, num_cols_offd_C * hypre_NumThreads(), HYPRE_MEMORY_HOST); C_temp_diag_data_array = hypre_TAlloc(HYPRE_Int, num_coarse * hypre_NumThreads(), HYPRE_MEMORY_HOST); C_temp_offd_data_array = hypre_TAlloc(HYPRE_Int, num_cols_offd_C * hypre_NumThreads(), HYPRE_MEMORY_HOST); } C_diag_i = hypre_CTAlloc(HYPRE_Int, num_coarse + 1, HYPRE_MEMORY_HOST); C_offd_i = hypre_CTAlloc(HYPRE_Int, num_coarse + 1, HYPRE_MEMORY_HOST); /*----------------------------------------------------------------------- * Loop over rows of S *-----------------------------------------------------------------------*/ #ifdef HYPRE_USING_OPENMP #pragma omp parallel private(i1,i2,i3,jj1,jj2,index) #endif { HYPRE_Int my_thread_num = hypre_GetThreadNum(); HYPRE_Int i1_begin, i1_end; hypre_GetSimpleThreadPartition(&i1_begin, &i1_end, num_cols_diag_S); HYPRE_Int *C_temp_diag_j = NULL, *C_temp_offd_j = NULL; HYPRE_Int *C_temp_diag_data = NULL, *C_temp_offd_data = NULL; if (num_paths > 1) { C_temp_diag_j = C_temp_diag_j_array + num_coarse * my_thread_num; C_temp_offd_j = C_temp_offd_j_array + num_cols_offd_C * my_thread_num; C_temp_diag_data = C_temp_diag_data_array + num_coarse * my_thread_num; C_temp_offd_data = C_temp_offd_data_array + num_cols_offd_C * my_thread_num; } HYPRE_Int *S_marker = NULL, *S_marker_offd = NULL; if (num_coarse) { S_marker = S_marker_array + num_coarse * my_thread_num; } if (num_cols_offd_C) { S_marker_offd = S_marker_offd_array + num_cols_offd_C * my_thread_num; } for (i1 = 0; i1 < num_coarse; i1++) { S_marker[i1] = -1; } for (i1 = 0; i1 < num_cols_offd_C; i1++) { S_marker_offd[i1] = -1; } // These two counters are for before filtering by num_paths HYPRE_Int jj_count_diag = 0; HYPRE_Int jj_count_offd = 0; // These two counters are for after filtering by num_paths HYPRE_Int num_nonzeros_diag = 0; HYPRE_Int num_nonzeros_offd = 0; HYPRE_Int ic_begin = num_coarse_prefix_sum[my_thread_num]; HYPRE_Int ic_end = num_coarse_prefix_sum[my_thread_num + 1]; HYPRE_Int ic; if (num_paths == 1) { for (ic = ic_begin; ic < ic_end; ic++) { /*-------------------------------------------------------------------- * Set marker for diagonal entry, C_{i1,i1} (for square matrices). *--------------------------------------------------------------------*/ i1 = coarse_to_fine[ic]; HYPRE_Int jj_row_begin_diag = num_nonzeros_diag; HYPRE_Int jj_row_begin_offd = num_nonzeros_offd; C_diag_i[ic] = num_nonzeros_diag; if (num_cols_offd_C) { C_offd_i[ic] = num_nonzeros_offd; } for (jj1 = S_diag_i[i1]; jj1 < S_diag_i[i1 + 1]; jj1++) { i2 = S_diag_j[jj1]; if (CF_marker[i2] > 0) { index = fine_to_coarse[i2]; if (S_marker[index] < jj_row_begin_diag) { S_marker[index] = num_nonzeros_diag; num_nonzeros_diag++; } } for (jj2 = S_diag_i[i2]; jj2 < S_diag_i[i2 + 1]; jj2++) { i3 = S_diag_j[jj2]; if (CF_marker[i3] > 0) { index = fine_to_coarse[i3]; if (index != ic && S_marker[index] < jj_row_begin_diag) { S_marker[index] = num_nonzeros_diag; num_nonzeros_diag++; } } } for (jj2 = S_offd_i[i2]; jj2 < S_offd_i[i2 + 1]; jj2++) { i3 = S_offd_j[jj2]; if (CF_marker_offd[i3] > 0) { index = map_S_to_C[i3]; if (S_marker_offd[index] < jj_row_begin_offd) { S_marker_offd[index] = num_nonzeros_offd; num_nonzeros_offd++; } } } } for (jj1 = S_offd_i[i1]; jj1 < S_offd_i[i1 + 1]; jj1++) { i2 = S_offd_j[jj1]; if (CF_marker_offd[i2] > 0) { index = map_S_to_C[i2]; if (S_marker_offd[index] < jj_row_begin_offd) { S_marker_offd[index] = num_nonzeros_offd; num_nonzeros_offd++; } } for (jj2 = S_ext_diag_i[i2]; jj2 < S_ext_diag_i[i2 + 1]; jj2++) { i3 = S_ext_diag_j[jj2]; if (i3 != ic && S_marker[i3] < jj_row_begin_diag) { S_marker[i3] = num_nonzeros_diag; num_nonzeros_diag++; } } for (jj2 = S_ext_offd_i[i2]; jj2 < S_ext_offd_i[i2 + 1]; jj2++) { i3 = S_ext_offd_j[jj2]; if (S_marker_offd[i3] < jj_row_begin_offd) { S_marker_offd[i3] = num_nonzeros_offd; num_nonzeros_offd++; } } } } /* for each row */ } /* num_paths == 1 */ else { for (ic = ic_begin; ic < ic_end; ic++) { /*-------------------------------------------------------------------- * Set marker for diagonal entry, C_{i1,i1} (for square matrices). *--------------------------------------------------------------------*/ i1 = coarse_to_fine[ic]; HYPRE_Int jj_row_begin_diag = jj_count_diag; HYPRE_Int jj_row_begin_offd = jj_count_offd; C_diag_i[ic] = num_nonzeros_diag; if (num_cols_offd_C) { C_offd_i[ic] = num_nonzeros_offd; } for (jj1 = S_diag_i[i1]; jj1 < S_diag_i[i1 + 1]; jj1++) { i2 = S_diag_j[jj1]; if (CF_marker[i2] > 0) { index = fine_to_coarse[i2]; if (S_marker[index] < jj_row_begin_diag) { S_marker[index] = jj_count_diag; C_temp_diag_data[jj_count_diag - jj_row_begin_diag] = 2; jj_count_diag++; } else { C_temp_diag_data[S_marker[index] - jj_row_begin_diag] += 2; } } for (jj2 = S_diag_i[i2]; jj2 < S_diag_i[i2 + 1]; jj2++) { i3 = S_diag_j[jj2]; if (CF_marker[i3] > 0 && fine_to_coarse[i3] != ic) { index = fine_to_coarse[i3]; if (S_marker[index] < jj_row_begin_diag) { S_marker[index] = jj_count_diag; C_temp_diag_data[jj_count_diag - jj_row_begin_diag] = 1; jj_count_diag++; } else { C_temp_diag_data[S_marker[index] - jj_row_begin_diag]++; } } } for (jj2 = S_offd_i[i2]; jj2 < S_offd_i[i2 + 1]; jj2++) { i3 = S_offd_j[jj2]; if (CF_marker_offd[i3] > 0) { index = map_S_to_C[i3]; if (S_marker_offd[index] < jj_row_begin_offd) { S_marker_offd[index] = jj_count_offd; C_temp_offd_data[jj_count_offd - jj_row_begin_offd] = 1; jj_count_offd++; } else { C_temp_offd_data[S_marker_offd[index] - jj_row_begin_offd]++; } } } } for (jj1 = S_offd_i[i1]; jj1 < S_offd_i[i1 + 1]; jj1++) { i2 = S_offd_j[jj1]; if (CF_marker_offd[i2] > 0) { index = map_S_to_C[i2]; if (S_marker_offd[index] < jj_row_begin_offd) { S_marker_offd[index] = jj_count_offd; C_temp_offd_data[jj_count_offd - jj_row_begin_offd] = 2; jj_count_offd++; } else { C_temp_offd_data[S_marker_offd[index] - jj_row_begin_offd] += 2; } } for (jj2 = S_ext_diag_i[i2]; jj2 < S_ext_diag_i[i2 + 1]; jj2++) { i3 = S_ext_diag_j[jj2]; if (i3 != ic) { if (S_marker[i3] < jj_row_begin_diag) { S_marker[i3] = jj_count_diag; C_temp_diag_data[jj_count_diag - jj_row_begin_diag] = 1; jj_count_diag++; } else { C_temp_diag_data[S_marker[i3] - jj_row_begin_diag]++; } } } for (jj2 = S_ext_offd_i[i2]; jj2 < S_ext_offd_i[i2 + 1]; jj2++) { i3 = S_ext_offd_j[jj2]; if (S_marker_offd[i3] < jj_row_begin_offd) { S_marker_offd[i3] = jj_count_offd; C_temp_offd_data[jj_count_offd - jj_row_begin_offd] = 1; jj_count_offd++; } else { C_temp_offd_data[S_marker_offd[i3] - jj_row_begin_offd]++; } } } for (jj1 = jj_row_begin_diag; jj1 < jj_count_diag; jj1++) { if (C_temp_diag_data[jj1 - jj_row_begin_diag] >= num_paths) { ++num_nonzeros_diag; } C_temp_diag_data[jj1 - jj_row_begin_diag] = 0; } for (jj1 = jj_row_begin_offd; jj1 < jj_count_offd; jj1++) { if (C_temp_offd_data[jj1 - jj_row_begin_offd] >= num_paths) { ++num_nonzeros_offd; } C_temp_offd_data[jj1 - jj_row_begin_offd] = 0; } } /* for each row */ } /* num_paths > 1 */ hypre_prefix_sum_pair( &num_nonzeros_diag, &C_diag_i[num_coarse], &num_nonzeros_offd, &C_offd_i[num_coarse], prefix_sum_workspace); for (i1 = 0; i1 < num_coarse; i1++) { S_marker[i1] = -1; } for (i1 = 0; i1 < num_cols_offd_C; i1++) { S_marker_offd[i1] = -1; } #ifdef HYPRE_USING_OPENMP #pragma omp barrier #pragma omp master #endif { if (C_diag_i[num_coarse]) { C_diag_j = hypre_TAlloc(HYPRE_Int, C_diag_i[num_coarse], HYPRE_MEMORY_HOST); } if (C_offd_i[num_coarse]) { C_offd_j = hypre_TAlloc(HYPRE_Int, C_offd_i[num_coarse], HYPRE_MEMORY_HOST); } } #ifdef HYPRE_USING_OPENMP #pragma omp barrier #endif for (ic = ic_begin; ic < ic_end - 1; ic++) { if (C_diag_i[ic + 1] == C_diag_i[ic] && C_offd_i[ic + 1] == C_offd_i[ic]) { CF_marker[coarse_to_fine[ic]] = 2; } C_diag_i[ic] += num_nonzeros_diag; C_offd_i[ic] += num_nonzeros_offd; } if (ic_begin < ic_end) { C_diag_i[ic] += num_nonzeros_diag; C_offd_i[ic] += num_nonzeros_offd; HYPRE_Int next_C_diag_i = prefix_sum_workspace[2 * (my_thread_num + 1)]; HYPRE_Int next_C_offd_i = prefix_sum_workspace[2 * (my_thread_num + 1) + 1]; if (next_C_diag_i == C_diag_i[ic] && next_C_offd_i == C_offd_i[ic]) { CF_marker[coarse_to_fine[ic]] = 2; } } if (num_paths == 1) { for (ic = ic_begin; ic < ic_end; ic++) { /*-------------------------------------------------------------------- * Set marker for diagonal entry, C_{i1,i1} (for square matrices). *--------------------------------------------------------------------*/ i1 = coarse_to_fine[ic]; HYPRE_Int jj_row_begin_diag = num_nonzeros_diag; HYPRE_Int jj_row_begin_offd = num_nonzeros_offd; for (jj1 = S_diag_i[i1]; jj1 < S_diag_i[i1 + 1]; jj1++) { i2 = S_diag_j[jj1]; if (CF_marker[i2] > 0) { index = fine_to_coarse[i2]; if (S_marker[index] < jj_row_begin_diag) { S_marker[index] = num_nonzeros_diag; C_diag_j[num_nonzeros_diag] = index; num_nonzeros_diag++; } } for (jj2 = S_diag_i[i2]; jj2 < S_diag_i[i2 + 1]; jj2++) { i3 = S_diag_j[jj2]; if (CF_marker[i3] > 0) { index = fine_to_coarse[i3]; if (index != ic && S_marker[index] < jj_row_begin_diag) { S_marker[index] = num_nonzeros_diag; C_diag_j[num_nonzeros_diag] = index; num_nonzeros_diag++; } } } for (jj2 = S_offd_i[i2]; jj2 < S_offd_i[i2 + 1]; jj2++) { i3 = S_offd_j[jj2]; if (CF_marker_offd[i3] > 0) { index = map_S_to_C[i3]; if (S_marker_offd[index] < jj_row_begin_offd) { S_marker_offd[index] = num_nonzeros_offd; C_offd_j[num_nonzeros_offd] = index; num_nonzeros_offd++; } } } } for (jj1 = S_offd_i[i1]; jj1 < S_offd_i[i1 + 1]; jj1++) { i2 = S_offd_j[jj1]; if (CF_marker_offd[i2] > 0) { index = map_S_to_C[i2]; if (S_marker_offd[index] < jj_row_begin_offd) { S_marker_offd[index] = num_nonzeros_offd; C_offd_j[num_nonzeros_offd] = index; num_nonzeros_offd++; } } for (jj2 = S_ext_diag_i[i2]; jj2 < S_ext_diag_i[i2 + 1]; jj2++) { i3 = S_ext_diag_j[jj2]; if (i3 != ic && S_marker[i3] < jj_row_begin_diag) { S_marker[i3] = num_nonzeros_diag; C_diag_j[num_nonzeros_diag] = i3; num_nonzeros_diag++; } } for (jj2 = S_ext_offd_i[i2]; jj2 < S_ext_offd_i[i2 + 1]; jj2++) { i3 = S_ext_offd_j[jj2]; if (S_marker_offd[i3] < jj_row_begin_offd) { S_marker_offd[i3] = num_nonzeros_offd; C_offd_j[num_nonzeros_offd] = i3; num_nonzeros_offd++; } } } } /* for each row */ } /* num_paths == 1 */ else { jj_count_diag = num_nonzeros_diag; jj_count_offd = num_nonzeros_offd; for (ic = ic_begin; ic < ic_end; ic++) { /*-------------------------------------------------------------------- * Set marker for diagonal entry, C_{i1,i1} (for square matrices). *--------------------------------------------------------------------*/ i1 = coarse_to_fine[ic]; HYPRE_Int jj_row_begin_diag = jj_count_diag; HYPRE_Int jj_row_begin_offd = jj_count_offd; for (jj1 = S_diag_i[i1]; jj1 < S_diag_i[i1 + 1]; jj1++) { i2 = S_diag_j[jj1]; if (CF_marker[i2] > 0) { index = fine_to_coarse[i2]; if (S_marker[index] < jj_row_begin_diag) { S_marker[index] = jj_count_diag; C_temp_diag_j[jj_count_diag - jj_row_begin_diag] = index; C_temp_diag_data[jj_count_diag - jj_row_begin_diag] = 2; jj_count_diag++; } else { C_temp_diag_data[S_marker[index] - jj_row_begin_diag] += 2; } } for (jj2 = S_diag_i[i2]; jj2 < S_diag_i[i2 + 1]; jj2++) { i3 = S_diag_j[jj2]; if (CF_marker[i3] > 0 && fine_to_coarse[i3] != ic) { index = fine_to_coarse[i3]; if (S_marker[index] < jj_row_begin_diag) { S_marker[index] = jj_count_diag; C_temp_diag_j[jj_count_diag - jj_row_begin_diag] = index; C_temp_diag_data[jj_count_diag - jj_row_begin_diag] = 1; jj_count_diag++; } else { C_temp_diag_data[S_marker[index] - jj_row_begin_diag]++; } } } for (jj2 = S_offd_i[i2]; jj2 < S_offd_i[i2 + 1]; jj2++) { i3 = S_offd_j[jj2]; if (CF_marker_offd[i3] > 0) { index = map_S_to_C[i3]; if (S_marker_offd[index] < jj_row_begin_offd) { S_marker_offd[index] = jj_count_offd; C_temp_offd_j[jj_count_offd - jj_row_begin_offd] = index; C_temp_offd_data[jj_count_offd - jj_row_begin_offd] = 1; jj_count_offd++; } else { C_temp_offd_data[S_marker_offd[index] - jj_row_begin_offd]++; } } } } for (jj1 = S_offd_i[i1]; jj1 < S_offd_i[i1 + 1]; jj1++) { i2 = S_offd_j[jj1]; if (CF_marker_offd[i2] > 0) { index = map_S_to_C[i2]; if (S_marker_offd[index] < jj_row_begin_offd) { S_marker_offd[index] = jj_count_offd; C_temp_offd_j[jj_count_offd - jj_row_begin_offd] = index; C_temp_offd_data[jj_count_offd - jj_row_begin_offd] = 2; jj_count_offd++; } else { C_temp_offd_data[S_marker_offd[index] - jj_row_begin_offd] += 2; } } for (jj2 = S_ext_diag_i[i2]; jj2 < S_ext_diag_i[i2 + 1]; jj2++) { i3 = S_ext_diag_j[jj2]; if (i3 != ic) { if (S_marker[i3] < jj_row_begin_diag) { S_marker[i3] = jj_count_diag; C_temp_diag_j[jj_count_diag - jj_row_begin_diag] = i3; C_temp_diag_data[jj_count_diag - jj_row_begin_diag] = 1; jj_count_diag++; } else { C_temp_diag_data[S_marker[i3] - jj_row_begin_diag]++; } } } for (jj2 = S_ext_offd_i[i2]; jj2 < S_ext_offd_i[i2 + 1]; jj2++) { i3 = S_ext_offd_j[jj2]; if (S_marker_offd[i3] < jj_row_begin_offd) { S_marker_offd[i3] = jj_count_offd; C_temp_offd_j[jj_count_offd - jj_row_begin_offd] = i3; C_temp_offd_data[jj_count_offd - jj_row_begin_offd] = 1; jj_count_offd++; } else { C_temp_offd_data[S_marker_offd[i3] - jj_row_begin_offd]++; } } } for (jj1 = jj_row_begin_diag; jj1 < jj_count_diag; jj1++) { if (C_temp_diag_data[jj1 - jj_row_begin_diag] >= num_paths) { C_diag_j[num_nonzeros_diag++] = C_temp_diag_j[jj1 - jj_row_begin_diag]; } C_temp_diag_data[jj1 - jj_row_begin_diag] = 0; } for (jj1 = jj_row_begin_offd; jj1 < jj_count_offd; jj1++) { if (C_temp_offd_data[jj1 - jj_row_begin_offd] >= num_paths) { C_offd_j[num_nonzeros_offd++] = C_temp_offd_j[jj1 - jj_row_begin_offd]; } C_temp_offd_data[jj1 - jj_row_begin_offd] = 0; } } /* for each row */ } /* num_paths > 1 */ } /* omp parallel */ S2 = hypre_ParCSRMatrixCreate(comm, global_num_coarse, global_num_coarse, coarse_row_starts, coarse_row_starts, num_cols_offd_C, C_diag_i[num_coarse], C_offd_i[num_coarse]); C_diag = hypre_ParCSRMatrixDiag(S2); hypre_CSRMatrixI(C_diag) = C_diag_i; if (C_diag_i[num_coarse]) { hypre_CSRMatrixJ(C_diag) = C_diag_j; } C_offd = hypre_ParCSRMatrixOffd(S2); hypre_CSRMatrixI(C_offd) = C_offd_i; hypre_ParCSRMatrixOffd(S2) = C_offd; if (num_cols_offd_C) { if (C_offd_i[num_coarse]) { hypre_CSRMatrixJ(C_offd) = C_offd_j; } hypre_ParCSRMatrixColMapOffd(S2) = col_map_offd_C; } /*----------------------------------------------------------------------- * Free various arrays *-----------------------------------------------------------------------*/ hypre_TFree(C_temp_diag_j_array, HYPRE_MEMORY_HOST); hypre_TFree(C_temp_diag_data_array, HYPRE_MEMORY_HOST); hypre_TFree(C_temp_offd_j_array, HYPRE_MEMORY_HOST); hypre_TFree(C_temp_offd_data_array, HYPRE_MEMORY_HOST); hypre_TFree(S_marker_array, HYPRE_MEMORY_HOST); hypre_TFree(S_marker_offd_array, HYPRE_MEMORY_HOST); hypre_TFree(S_marker, HYPRE_MEMORY_HOST); hypre_TFree(S_marker_offd, HYPRE_MEMORY_HOST); hypre_TFree(S_ext_diag_i, HYPRE_MEMORY_HOST); hypre_TFree(fine_to_coarse, HYPRE_MEMORY_HOST); hypre_TFree(coarse_to_fine, HYPRE_MEMORY_HOST); if (S_ext_diag_size) { hypre_TFree(S_ext_diag_j, HYPRE_MEMORY_HOST); } hypre_TFree(S_ext_offd_i, HYPRE_MEMORY_HOST); if (S_ext_offd_size) { hypre_TFree(S_ext_offd_j, HYPRE_MEMORY_HOST); } if (num_cols_offd_S) { hypre_TFree(map_S_to_C, HYPRE_MEMORY_HOST); hypre_TFree(CF_marker_offd, HYPRE_MEMORY_HOST); hypre_TFree(fine_to_coarse_offd, HYPRE_MEMORY_HOST); } hypre_CSRMatrixMemoryLocation(C_diag) = HYPRE_MEMORY_HOST; hypre_CSRMatrixMemoryLocation(C_offd) = HYPRE_MEMORY_HOST; *C_ptr = S2; #ifdef HYPRE_PROFILE hypre_profile_times[HYPRE_TIMER_ID_CREATE_2NDS] += hypre_MPI_Wtime(); #endif hypre_TFree(prefix_sum_workspace, HYPRE_MEMORY_HOST); hypre_TFree(num_coarse_prefix_sum, HYPRE_MEMORY_HOST); return 0; } //----------------------------------------------------------------------- HYPRE_Int hypre_BoomerAMGCreate2ndS( hypre_ParCSRMatrix *S, HYPRE_Int *CF_marker, HYPRE_Int num_paths, HYPRE_BigInt *coarse_row_starts, hypre_ParCSRMatrix **C_ptr) { hypre_GpuProfilingPushRange("Create2ndS"); HYPRE_Int ierr = 0; #if defined(HYPRE_USING_GPU) HYPRE_ExecutionPolicy exec = hypre_GetExecPolicy1( hypre_ParCSRMatrixMemoryLocation(S) ); if (exec == HYPRE_EXEC_DEVICE) { ierr = hypre_BoomerAMGCreate2ndSDevice( S, CF_marker, num_paths, coarse_row_starts, C_ptr ); } else #endif { ierr = hypre_BoomerAMGCreate2ndSHost( S, CF_marker, num_paths, coarse_row_starts, C_ptr ); } hypre_GpuProfilingPopRange(); return ierr; } /*-------------------------------------------------------------------------- * hypre_BoomerAMGCorrectCFMarker : corrects CF_marker after aggr. coarsening *--------------------------------------------------------------------------*/ HYPRE_Int hypre_BoomerAMGCorrectCFMarkerHost(hypre_IntArray *CF_marker, hypre_IntArray *new_CF_marker) { HYPRE_Int i, cnt; cnt = 0; for (i = 0; i < hypre_IntArraySize(CF_marker); i++) { if (hypre_IntArrayData(CF_marker)[i] > 0 ) { if (hypre_IntArrayData(CF_marker)[i] == 1) { hypre_IntArrayData(CF_marker)[i] = hypre_IntArrayData(new_CF_marker)[cnt++]; } else { hypre_IntArrayData(CF_marker)[i] = 1; cnt++; } } } return 0; } /*-------------------------------------------------------------------------- * hypre_BoomerAMGCorrectCFMarker2 : corrects CF_marker after aggr. coarsening, * but marks new F-points (previous C-points) as -2 *--------------------------------------------------------------------------*/ HYPRE_Int hypre_BoomerAMGCorrectCFMarker2Host(hypre_IntArray *CF_marker, hypre_IntArray *new_CF_marker) { HYPRE_Int i, cnt; cnt = 0; for (i = 0; i < hypre_IntArraySize(CF_marker); i++) { if (hypre_IntArrayData(CF_marker)[i] > 0 ) { if (hypre_IntArrayData(new_CF_marker)[cnt] == -1) { hypre_IntArrayData(CF_marker)[i] = -2; } else { hypre_IntArrayData(CF_marker)[i] = 1; } cnt++; } } return 0; } /*-------------------------------------------------------------------------- * hypre_BoomerAMGCorrectCFMarker : corrects CF_marker after aggr. coarsening *--------------------------------------------------------------------------*/ HYPRE_Int hypre_BoomerAMGCorrectCFMarker(hypre_IntArray *CF_marker, hypre_IntArray *new_CF_marker) { hypre_GpuProfilingPushRange("CorrectCFMarker"); #if defined(HYPRE_USING_GPU) HYPRE_ExecutionPolicy exec = hypre_GetExecPolicy2( hypre_IntArrayMemoryLocation(CF_marker), hypre_IntArrayMemoryLocation(new_CF_marker)); if (exec == HYPRE_EXEC_DEVICE) { hypre_BoomerAMGCorrectCFMarkerDevice(CF_marker, new_CF_marker); } else #endif { hypre_BoomerAMGCorrectCFMarkerHost(CF_marker, new_CF_marker); } hypre_GpuProfilingPopRange(); return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_BoomerAMGCorrectCFMarker2 : corrects CF_marker after aggr. coarsening, * but marks new F-points (previous C-points) as -2 *--------------------------------------------------------------------------*/ HYPRE_Int hypre_BoomerAMGCorrectCFMarker2(hypre_IntArray *CF_marker, hypre_IntArray *new_CF_marker) { hypre_GpuProfilingPushRange("CorrectCFMarker2"); #if defined(HYPRE_USING_GPU) HYPRE_ExecutionPolicy exec = hypre_GetExecPolicy2( hypre_IntArrayMemoryLocation(CF_marker), hypre_IntArrayMemoryLocation(new_CF_marker)); if (exec == HYPRE_EXEC_DEVICE) { hypre_BoomerAMGCorrectCFMarker2Device(CF_marker, new_CF_marker); } else #endif { hypre_BoomerAMGCorrectCFMarker2Host(CF_marker, new_CF_marker); } hypre_GpuProfilingPopRange(); return hypre_error_flag; } hypre-2.33.0/src/parcsr_ls/par_strength2nd_device.c000066400000000000000000000126061477326011500223070ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "_hypre_onedpl.hpp" #include "HYPRE.h" #include "HYPRE_parcsr_mv.h" #include "HYPRE_IJ_mv.h" #include "_hypre_utilities.h" #include "_hypre_utilities.hpp" #include "HYPRE_parcsr_ls.h" #include "_hypre_parcsr_ls.h" #include "_hypre_parcsr_mv.h" #include "HYPRE_utilities.h" #if defined(HYPRE_USING_GPU) //----------------------------------------------------------------------- HYPRE_Int hypre_BoomerAMGCreate2ndSDevice( hypre_ParCSRMatrix *S, HYPRE_Int *CF_marker, HYPRE_Int num_paths, HYPRE_BigInt *coarse_row_starts, hypre_ParCSRMatrix **S2_ptr) { HYPRE_Int S_nr_local = hypre_ParCSRMatrixNumRows(S); hypre_CSRMatrix *S_diag = hypre_ParCSRMatrixDiag(S); hypre_CSRMatrix *S_offd = hypre_ParCSRMatrixOffd(S); HYPRE_Int S_diag_nnz = hypre_CSRMatrixNumNonzeros(S_diag); HYPRE_Int S_offd_nnz = hypre_CSRMatrixNumNonzeros(S_offd); hypre_CSRMatrix *Id, *SI_diag; hypre_ParCSRMatrix *S_XC, *S_CX, *S2; HYPRE_Int *new_end; HYPRE_Complex coeff = 2.0; /* MPI_Comm comm = hypre_ParCSRMatrixComm(S); HYPRE_Int num_proc, myid; hypre_MPI_Comm_size(comm, &num_proc); hypre_MPI_Comm_rank(comm, &myid); */ /* 1. Create new matrix with added diagonal */ hypre_GpuProfilingPushRange("Setup"); /* give S data arrays */ hypre_CSRMatrixData(S_diag) = hypre_TAlloc(HYPRE_Complex, S_diag_nnz, HYPRE_MEMORY_DEVICE ); hypreDevice_ComplexFilln( hypre_CSRMatrixData(S_diag), S_diag_nnz, 1.0 ); hypre_CSRMatrixData(S_offd) = hypre_TAlloc(HYPRE_Complex, S_offd_nnz, HYPRE_MEMORY_DEVICE ); hypreDevice_ComplexFilln( hypre_CSRMatrixData(S_offd), S_offd_nnz, 1.0 ); if (!hypre_ParCSRMatrixCommPkg(S)) { hypre_MatvecCommPkgCreate(S); } /* S(C, :) and S(:, C) */ hypre_ParCSRMatrixGenerate1DCFDevice(S, CF_marker, coarse_row_starts, NULL, &S_CX, &S_XC); hypre_assert(S_nr_local == hypre_ParCSRMatrixNumCols(S_CX)); /* add coeff*I to S_CX */ Id = hypre_CSRMatrixCreate( hypre_ParCSRMatrixNumRows(S_CX), hypre_ParCSRMatrixNumCols(S_CX), hypre_ParCSRMatrixNumRows(S_CX) ); hypre_CSRMatrixInitialize_v2(Id, 0, HYPRE_MEMORY_DEVICE); #if defined(HYPRE_USING_SYCL) hypreSycl_sequence( hypre_CSRMatrixI(Id), hypre_CSRMatrixI(Id) + hypre_ParCSRMatrixNumRows(S_CX) + 1, 0 ); oneapi::dpl::counting_iterator count(0); new_end = hypreSycl_copy_if( count, count + hypre_ParCSRMatrixNumCols(S_CX), CF_marker, hypre_CSRMatrixJ(Id), is_nonnegative() ); #else HYPRE_THRUST_CALL( sequence, hypre_CSRMatrixI(Id), hypre_CSRMatrixI(Id) + hypre_ParCSRMatrixNumRows(S_CX) + 1, 0 ); new_end = HYPRE_THRUST_CALL( copy_if, thrust::make_counting_iterator(0), thrust::make_counting_iterator(hypre_ParCSRMatrixNumCols(S_CX)), CF_marker, hypre_CSRMatrixJ(Id), is_nonnegative() ); #endif hypre_assert(new_end - hypre_CSRMatrixJ(Id) == hypre_ParCSRMatrixNumRows(S_CX)); hypreDevice_ComplexFilln( hypre_CSRMatrixData(Id), hypre_ParCSRMatrixNumRows(S_CX), coeff ); SI_diag = hypre_CSRMatrixAddDevice(1.0, hypre_ParCSRMatrixDiag(S_CX), 1.0, Id); hypre_CSRMatrixDestroy(Id); /* global nnz has changed, but we do not care about it */ /* hypre_ParCSRMatrixSetNumNonzeros(S_CX); hypre_ParCSRMatrixDNumNonzeros(S_CX) = (HYPRE_Real) hypre_ParCSRMatrixNumNonzeros(S_CX); */ hypre_CSRMatrixDestroy(hypre_ParCSRMatrixDiag(S_CX)); hypre_ParCSRMatrixDiag(S_CX) = SI_diag; hypre_GpuProfilingPopRange(); /* 2. Perform matrix-matrix multiplication */ hypre_GpuProfilingPushRange("Matrix-matrix mult"); S2 = hypre_ParCSRMatMatDevice(S_CX, S_XC); hypre_ParCSRMatrixDestroy(S_CX); hypre_ParCSRMatrixDestroy(S_XC); hypre_GpuProfilingPopRange(); // Clean up matrix before returning it. if (num_paths == 2) { // If num_paths = 2, prune elements < 2. hypre_ParCSRMatrixDropSmallEntries(S2, 1.5, 0); } hypre_TFree(hypre_CSRMatrixData(hypre_ParCSRMatrixDiag(S2)), HYPRE_MEMORY_DEVICE); hypre_TFree(hypre_CSRMatrixData(hypre_ParCSRMatrixOffd(S2)), HYPRE_MEMORY_DEVICE); hypre_CSRMatrixRemoveDiagonalDevice(hypre_ParCSRMatrixDiag(S2)); /* global nnz has changed, but we do not care about it */ hypre_MatvecCommPkgCreate(S2); *S2_ptr = S2; return 0; } #endif /* #if defined(HYPRE_USING_GPU) */ hypre-2.33.0/src/parcsr_ls/par_strength_device.c000066400000000000000000000750631477326011500217110ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "_hypre_onedpl.hpp" #include "_hypre_parcsr_ls.h" #include "_hypre_utilities.hpp" #if defined(HYPRE_USING_GPU) __global__ void hypre_BoomerAMGCreateS_rowcount( hypre_DeviceItem &item, HYPRE_Int nr_of_rows, HYPRE_Real max_row_sum, HYPRE_Real strength_threshold, HYPRE_Real* A_diag_data, HYPRE_Int* A_diag_i, HYPRE_Int* A_diag_j, HYPRE_Real* A_offd_data, HYPRE_Int* A_offd_i, HYPRE_Int* A_offd_j, HYPRE_Int* S_temp_diag_j, HYPRE_Int* S_temp_offd_j, HYPRE_Int num_functions, HYPRE_Int* dof_func, HYPRE_Int* dof_func_offd, HYPRE_Int* jS_diag, HYPRE_Int* jS_offd ); __global__ void hypre_BoomerAMGCreateSabs_rowcount( hypre_DeviceItem &item, HYPRE_Int nr_of_rows, HYPRE_Real max_row_sum, HYPRE_Real strength_threshold, HYPRE_Real* A_diag_data, HYPRE_Int* A_diag_i, HYPRE_Int* A_diag_j, HYPRE_Real* A_offd_data, HYPRE_Int* A_offd_i, HYPRE_Int* A_offd_j, HYPRE_Int* S_temp_diag_j, HYPRE_Int* S_temp_offd_j, HYPRE_Int num_functions, HYPRE_Int* dof_func, HYPRE_Int* dof_func_offd, HYPRE_Int* jS_diag, HYPRE_Int* jS_offd ); /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/ HYPRE_Int hypre_BoomerAMGCreateSDevice(hypre_ParCSRMatrix *A, HYPRE_Int abs_soc, HYPRE_Real strength_threshold, HYPRE_Real max_row_sum, HYPRE_Int num_functions, HYPRE_Int *dof_func, hypre_ParCSRMatrix **S_ptr) { #ifdef HYPRE_PROFILE hypre_profile_times[HYPRE_TIMER_ID_CREATES] -= hypre_MPI_Wtime(); #endif MPI_Comm comm = hypre_ParCSRMatrixComm(A); hypre_ParCSRCommPkg *comm_pkg = hypre_ParCSRMatrixCommPkg(A); hypre_ParCSRCommHandle *comm_handle; hypre_CSRMatrix *A_diag = hypre_ParCSRMatrixDiag(A); HYPRE_Int *A_diag_i = hypre_CSRMatrixI(A_diag); HYPRE_Real *A_diag_data = hypre_CSRMatrixData(A_diag); hypre_CSRMatrix *A_offd = hypre_ParCSRMatrixOffd(A); HYPRE_Int *A_offd_i = hypre_CSRMatrixI(A_offd); HYPRE_Real *A_offd_data = hypre_CSRMatrixData(A_offd); HYPRE_Int *A_diag_j = hypre_CSRMatrixJ(A_diag); HYPRE_Int *A_offd_j = hypre_CSRMatrixJ(A_offd); HYPRE_BigInt *row_starts = hypre_ParCSRMatrixRowStarts(A); HYPRE_Int num_variables = hypre_CSRMatrixNumRows(A_diag); HYPRE_BigInt global_num_vars = hypre_ParCSRMatrixGlobalNumRows(A); HYPRE_Int num_nonzeros_diag; HYPRE_Int num_nonzeros_offd; HYPRE_Int num_cols_offd = hypre_CSRMatrixNumCols(A_offd); hypre_ParCSRMatrix *S; hypre_CSRMatrix *S_diag; HYPRE_Int *S_diag_i; HYPRE_Int *S_diag_j, *S_temp_diag_j; /* HYPRE_Real *S_diag_data; */ hypre_CSRMatrix *S_offd; HYPRE_Int *S_offd_i = NULL; HYPRE_Int *S_offd_j = NULL, *S_temp_offd_j = NULL; /* HYPRE_Real *S_offd_data; */ HYPRE_Int ierr = 0; HYPRE_Int *dof_func_offd_dev = NULL; HYPRE_Int num_sends; HYPRE_MemoryLocation memory_location = hypre_ParCSRMatrixMemoryLocation(A); /*-------------------------------------------------------------- * Compute a ParCSR strength matrix, S. * * Default "strength" of dependence/influence is defined in * the following way: i depends on j if * aij > hypre_max (k != i) aik, aii < 0 * or * aij < hypre_min (k != i) aik, aii >= 0 * Then S_ij = 1, else S_ij = 0. * * If abs_soc != 0, then use an absolute strength of connection: * i depends on j if * abs(aij) > hypre_max (k != i) abs(aik) * * NOTE: the entries are negative initially, corresponding * to "unaccounted-for" dependence. *----------------------------------------------------------------*/ num_nonzeros_diag = hypre_CSRMatrixNumNonzeros(A_diag); num_nonzeros_offd = hypre_CSRMatrixNumNonzeros(A_offd); S_diag_i = hypre_TAlloc(HYPRE_Int, num_variables + 1, memory_location); S_offd_i = hypre_TAlloc(HYPRE_Int, num_variables + 1, memory_location); S_temp_diag_j = hypre_TAlloc(HYPRE_Int, num_nonzeros_diag, HYPRE_MEMORY_DEVICE); S_temp_offd_j = hypre_TAlloc(HYPRE_Int, num_nonzeros_offd, HYPRE_MEMORY_DEVICE); if (num_functions > 1) { dof_func_offd_dev = hypre_TAlloc(HYPRE_Int, num_cols_offd, HYPRE_MEMORY_DEVICE); } /*------------------------------------------------------------------- * Get the dof_func data for the off-processor columns *-------------------------------------------------------------------*/ if (!comm_pkg) { hypre_MatvecCommPkgCreate(A); comm_pkg = hypre_ParCSRMatrixCommPkg(A); } num_sends = hypre_ParCSRCommPkgNumSends(comm_pkg); if (num_functions > 1) { HYPRE_Int *int_buf_data = hypre_TAlloc(HYPRE_Int, hypre_ParCSRCommPkgSendMapStart(comm_pkg, num_sends), HYPRE_MEMORY_DEVICE); hypre_ParCSRCommPkgCopySendMapElmtsToDevice(comm_pkg); #if defined(HYPRE_USING_SYCL) hypreSycl_gather( hypre_ParCSRCommPkgDeviceSendMapElmts(comm_pkg), hypre_ParCSRCommPkgDeviceSendMapElmts(comm_pkg) + hypre_ParCSRCommPkgSendMapStart(comm_pkg, num_sends), dof_func, int_buf_data ); #else HYPRE_THRUST_CALL( gather, hypre_ParCSRCommPkgDeviceSendMapElmts(comm_pkg), hypre_ParCSRCommPkgDeviceSendMapElmts(comm_pkg) + hypre_ParCSRCommPkgSendMapStart(comm_pkg, num_sends), dof_func, int_buf_data ); #endif #if defined(HYPRE_USING_THRUST_NOSYNC) /* RL: make sure int_buf_data is ready before issuing GPU-GPU MPI */ if (hypre_GetGpuAwareMPI()) { hypre_ForceSyncComputeStream(); } #endif comm_handle = hypre_ParCSRCommHandleCreate_v2(11, comm_pkg, HYPRE_MEMORY_DEVICE, int_buf_data, HYPRE_MEMORY_DEVICE, dof_func_offd_dev); hypre_ParCSRCommHandleDestroy(comm_handle); hypre_TFree(int_buf_data, HYPRE_MEMORY_DEVICE); } /* count the row nnz of S */ dim3 bDim = hypre_GetDefaultDeviceBlockDimension(); dim3 gDim = hypre_GetDefaultDeviceGridDimension(num_variables, "warp", bDim); if (abs_soc) { HYPRE_GPU_LAUNCH( hypre_BoomerAMGCreateSabs_rowcount, gDim, bDim, num_variables, max_row_sum, strength_threshold, A_diag_data, A_diag_i, A_diag_j, A_offd_data, A_offd_i, A_offd_j, S_temp_diag_j, S_temp_offd_j, num_functions, dof_func, dof_func_offd_dev, S_diag_i, S_offd_i ); } else { HYPRE_GPU_LAUNCH( hypre_BoomerAMGCreateS_rowcount, gDim, bDim, num_variables, max_row_sum, strength_threshold, A_diag_data, A_diag_i, A_diag_j, A_offd_data, A_offd_i, A_offd_j, S_temp_diag_j, S_temp_offd_j, num_functions, dof_func, dof_func_offd_dev, S_diag_i, S_offd_i ); } hypre_Memset(S_diag_i + num_variables, 0, sizeof(HYPRE_Int), HYPRE_MEMORY_DEVICE); hypre_Memset(S_offd_i + num_variables, 0, sizeof(HYPRE_Int), HYPRE_MEMORY_DEVICE); hypreDevice_IntegerExclusiveScan(num_variables + 1, S_diag_i); hypreDevice_IntegerExclusiveScan(num_variables + 1, S_offd_i); HYPRE_Int *tmp, S_num_nonzeros_diag, S_num_nonzeros_offd; hypre_TMemcpy(&S_num_nonzeros_diag, &S_diag_i[num_variables], HYPRE_Int, 1, HYPRE_MEMORY_HOST, memory_location); hypre_TMemcpy(&S_num_nonzeros_offd, &S_offd_i[num_variables], HYPRE_Int, 1, HYPRE_MEMORY_HOST, memory_location); S_diag_j = hypre_TAlloc(HYPRE_Int, S_num_nonzeros_diag, memory_location); S_offd_j = hypre_TAlloc(HYPRE_Int, S_num_nonzeros_offd, memory_location); #if defined(HYPRE_USING_SYCL) tmp = HYPRE_ONEDPL_CALL(std::copy_if, S_temp_diag_j, S_temp_diag_j + num_nonzeros_diag, S_diag_j, is_nonnegative()); #else tmp = HYPRE_THRUST_CALL(copy_if, S_temp_diag_j, S_temp_diag_j + num_nonzeros_diag, S_diag_j, is_nonnegative()); #endif hypre_assert(S_num_nonzeros_diag == tmp - S_diag_j); #if defined(HYPRE_USING_SYCL) tmp = HYPRE_ONEDPL_CALL(std::copy_if, S_temp_offd_j, S_temp_offd_j + num_nonzeros_offd, S_offd_j, is_nonnegative()); #else tmp = HYPRE_THRUST_CALL(copy_if, S_temp_offd_j, S_temp_offd_j + num_nonzeros_offd, S_offd_j, is_nonnegative()); #endif hypre_assert(S_num_nonzeros_offd == tmp - S_offd_j); S = hypre_ParCSRMatrixCreate(comm, global_num_vars, global_num_vars, row_starts, row_starts, num_cols_offd, num_nonzeros_diag, num_nonzeros_offd); S_diag = hypre_ParCSRMatrixDiag(S); S_offd = hypre_ParCSRMatrixOffd(S); hypre_CSRMatrixNumNonzeros(S_diag) = S_num_nonzeros_diag; hypre_CSRMatrixNumNonzeros(S_offd) = S_num_nonzeros_offd; hypre_CSRMatrixI(S_diag) = S_diag_i; hypre_CSRMatrixJ(S_diag) = S_diag_j; hypre_CSRMatrixI(S_offd) = S_offd_i; hypre_CSRMatrixJ(S_offd) = S_offd_j; hypre_CSRMatrixMemoryLocation(S_diag) = memory_location; hypre_CSRMatrixMemoryLocation(S_offd) = memory_location; hypre_ParCSRMatrixCommPkg(S) = NULL; hypre_ParCSRMatrixColMapOffd(S) = hypre_TAlloc(HYPRE_BigInt, num_cols_offd, HYPRE_MEMORY_HOST); hypre_TMemcpy(hypre_ParCSRMatrixColMapOffd(S), hypre_ParCSRMatrixColMapOffd(A), HYPRE_BigInt, num_cols_offd, HYPRE_MEMORY_HOST, HYPRE_MEMORY_HOST); hypre_ParCSRMatrixSocDiagJ(S) = S_temp_diag_j; hypre_ParCSRMatrixSocOffdJ(S) = S_temp_offd_j; *S_ptr = S; hypre_TFree(dof_func_offd_dev, HYPRE_MEMORY_DEVICE); /* hypre_TFree(S_temp_diag_j, HYPRE_MEMORY_DEVICE); hypre_TFree(S_temp_offd_j, HYPRE_MEMORY_DEVICE); */ #ifdef HYPRE_PROFILE hypre_profile_times[HYPRE_TIMER_ID_CREATES] += hypre_MPI_Wtime(); #endif return (ierr); } /*-----------------------------------------------------------------------*/ __global__ void hypre_BoomerAMGCreateS_rowcount( hypre_DeviceItem &item, HYPRE_Int nr_of_rows, HYPRE_Real max_row_sum, HYPRE_Real strength_threshold, HYPRE_Real *A_diag_data, HYPRE_Int *A_diag_i, HYPRE_Int *A_diag_j, HYPRE_Real *A_offd_data, HYPRE_Int *A_offd_i, HYPRE_Int *A_offd_j, HYPRE_Int *S_temp_diag_j, HYPRE_Int *S_temp_offd_j, HYPRE_Int num_functions, HYPRE_Int *dof_func, HYPRE_Int *dof_func_offd, HYPRE_Int *jS_diag, HYPRE_Int *jS_offd ) { /*-----------------------------------------------------------------------*/ /* Input: nr_of_rows - Number of rows in matrix (local in processor) A_diag_data, A_diag_i, A_diag_j - CSR representation of A_diag A_offd_data, A_offd_i, A_offd_j - CSR representation of A_offd num_function - Number of degrees of freedom per grid point dof_func - vector over nonzero elements of A_diag, indicating the degree of freedom dof_func_offd - vector over nonzero elements of A_offd, indicating the degree of freedom Output: S_temp_diag_j - S_diag_j vector before compression, i.e.,elements that are < 0 should be removed strong connections: same as A_diag_j; weak: -1; diagonal: -2 S_temp_offd_j - S_offd_j vector before compression, i.e.,elements that are < 0 should be removed strong connections: same as A_offd_j; weak: -1; jS_diag - row nnz vector for compressed S_diag jS_offd - row nnz vector for compressed S_offd */ /*-----------------------------------------------------------------------*/ HYPRE_Real row_scale = 0.0, row_sum = 0.0, row_max = 0.0, row_min = 0.0, diag = 0.0; HYPRE_Int row_nnz_diag = 0, row_nnz_offd = 0, diag_pos = -1; HYPRE_Int row = hypre_gpu_get_grid_warp_id<1, 1>(item); if (row >= nr_of_rows) { return; } HYPRE_Int lane = hypre_gpu_get_lane_id<1>(item); HYPRE_Int p_diag = 0, q_diag, p_offd = 0, q_offd; /* diag part */ if (lane < 2) { p_diag = read_only_load(A_diag_i + row + lane); } q_diag = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, p_diag, 1); p_diag = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, p_diag, 0); for (HYPRE_Int i = p_diag + lane; i < q_diag; i += HYPRE_WARP_SIZE) { const HYPRE_Int col = read_only_load(&A_diag_j[i]); if ( num_functions == 1 || row == col || read_only_load(&dof_func[row]) == read_only_load(&dof_func[col]) ) { const HYPRE_Real v = read_only_load(&A_diag_data[i]); row_sum += v; if (row == col) { diag = v; diag_pos = i; } else { row_max = hypre_max(row_max, v); row_min = hypre_min(row_min, v); } } } /* offd part */ if (lane < 2) { p_offd = read_only_load(A_offd_i + row + lane); } q_offd = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, p_offd, 1); p_offd = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, p_offd, 0); for (HYPRE_Int i = p_offd + lane; i < q_offd; i += HYPRE_WARP_SIZE) { if ( num_functions == 1 || read_only_load(&dof_func[row]) == read_only_load(&dof_func_offd[read_only_load(&A_offd_j[i])]) ) { const HYPRE_Real v = read_only_load(&A_offd_data[i]); row_sum += v; row_max = hypre_max(row_max, v); row_min = hypre_min(row_min, v); } } diag = warp_allreduce_sum(item, diag); /* sign of diag */ const HYPRE_Int sdiag = diag > 0.0 ? 1 : -1; /* compute scaling factor and row sum */ row_sum = warp_allreduce_sum(item, row_sum); if (diag > 0.0) { row_scale = warp_allreduce_min(item, row_min); } else { row_scale = warp_allreduce_max(item, row_max); } /* compute row of S */ HYPRE_Int all_weak = max_row_sum < 1.0 && hypre_abs(row_sum) > hypre_abs(diag) * max_row_sum; const HYPRE_Real thresh = sdiag * strength_threshold * row_scale; for (HYPRE_Int i = p_diag + lane; i < q_diag; i += HYPRE_WARP_SIZE) { const HYPRE_Int cond = all_weak == 0 && diag_pos != i && ( num_functions == 1 || read_only_load(&dof_func[row]) == read_only_load(&dof_func[read_only_load(&A_diag_j[i])]) ) && sdiag * read_only_load(&A_diag_data[i]) < thresh; S_temp_diag_j[i] = cond * (1 + read_only_load(&A_diag_j[i])) - 1; row_nnz_diag += cond; } /* !!! mark diagonal as -2 !!! */ if (diag_pos >= 0) { S_temp_diag_j[diag_pos] = -2; } for (HYPRE_Int i = p_offd + lane; i < q_offd; i += HYPRE_WARP_SIZE) { const HYPRE_Int cond = all_weak == 0 && ( num_functions == 1 || read_only_load(&dof_func[row]) == read_only_load(&dof_func_offd[read_only_load(&A_offd_j[i])]) ) && sdiag * read_only_load(&A_offd_data[i]) < thresh; S_temp_offd_j[i] = cond * (1 + read_only_load(&A_offd_j[i])) - 1; row_nnz_offd += cond; } row_nnz_diag = warp_reduce_sum(item, row_nnz_diag); row_nnz_offd = warp_reduce_sum(item, row_nnz_offd); if (0 == lane) { jS_diag[row] = row_nnz_diag; jS_offd[row] = row_nnz_offd; } } HYPRE_Int hypre_BoomerAMGMakeSocFromSDevice( hypre_ParCSRMatrix *A, hypre_ParCSRMatrix *S) { if (!hypre_ParCSRMatrixSocDiagJ(S)) { hypre_CSRMatrix *A_diag = hypre_ParCSRMatrixDiag(A); hypre_CSRMatrix *S_diag = hypre_ParCSRMatrixDiag(S); HYPRE_Int nnz_diag = hypre_CSRMatrixNumNonzeros(A_diag); HYPRE_Int *soc_diag = hypre_TAlloc(HYPRE_Int, nnz_diag, HYPRE_MEMORY_DEVICE); hypre_CSRMatrixIntersectPattern(A_diag, S_diag, soc_diag, 1); hypre_ParCSRMatrixSocDiagJ(S) = soc_diag; } if (!hypre_ParCSRMatrixSocOffdJ(S)) { hypre_CSRMatrix *A_offd = hypre_ParCSRMatrixOffd(A); hypre_CSRMatrix *S_offd = hypre_ParCSRMatrixOffd(S); HYPRE_Int nnz_offd = hypre_CSRMatrixNumNonzeros(A_offd); HYPRE_Int *soc_offd = hypre_TAlloc(HYPRE_Int, nnz_offd, HYPRE_MEMORY_DEVICE); hypre_CSRMatrixIntersectPattern(A_offd, S_offd, soc_offd, 0); hypre_ParCSRMatrixSocOffdJ(S) = soc_offd; } return hypre_error_flag; } /*-----------------------------------------------------------------------*/ __global__ void hypre_BoomerAMGCreateSabs_rowcount( hypre_DeviceItem &item, HYPRE_Int nr_of_rows, HYPRE_Real max_row_sum, HYPRE_Real strength_threshold, HYPRE_Real *A_diag_data, HYPRE_Int *A_diag_i, HYPRE_Int *A_diag_j, HYPRE_Real *A_offd_data, HYPRE_Int *A_offd_i, HYPRE_Int *A_offd_j, HYPRE_Int *S_temp_diag_j, HYPRE_Int *S_temp_offd_j, HYPRE_Int num_functions, HYPRE_Int *dof_func, HYPRE_Int *dof_func_offd, HYPRE_Int *jS_diag, HYPRE_Int *jS_offd ) { /*-----------------------------------------------------------------------*/ /* Input: nr_of_rows - Number of rows in matrix (local in processor) A_diag_data, A_diag_i, A_diag_j - CSR representation of A_diag A_offd_data, A_offd_i, A_offd_j - CSR representation of A_offd num_function - Number of degrees of freedom per grid point dof_func - vector over nonzero elements of A_diag, indicating the degree of freedom dof_func_offd - vector over nonzero elements of A_offd, indicating the degree of freedom Output: S_temp_diag_j - S_diag_j vector before compression, i.e.,elements that are < 0 should be removed strong connections: same as A_diag_j; weak: -1; diagonal: -2 S_temp_offd_j - S_offd_j vector before compression, i.e.,elements that are < 0 should be removed strong connections: same as A_offd_j; weak: -1; jS_diag - row nnz vector for compressed S_diag jS_offd - row nnz vector for compressed S_offd */ /*-----------------------------------------------------------------------*/ HYPRE_Real row_scale = 0.0, row_sum = 0.0, diag = 0.0; HYPRE_Int row_nnz_diag = 0, row_nnz_offd = 0, diag_pos = -1; HYPRE_Int row = hypre_gpu_get_grid_warp_id<1, 1>(item); if (row >= nr_of_rows) { return; } HYPRE_Int lane = hypre_gpu_get_lane_id<1>(item); HYPRE_Int p_diag = 0, q_diag, p_offd = 0, q_offd; /* diag part */ if (lane < 2) { p_diag = read_only_load(A_diag_i + row + lane); } q_diag = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, p_diag, 1); p_diag = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, p_diag, 0); for (HYPRE_Int i = p_diag + lane; i < q_diag; i += HYPRE_WARP_SIZE) { const HYPRE_Int col = read_only_load(&A_diag_j[i]); if ( num_functions == 1 || row == col || read_only_load(&dof_func[row]) == read_only_load(&dof_func[col]) ) { const HYPRE_Real v = hypre_cabs( read_only_load(&A_diag_data[i]) ); row_sum += v; if (row == col) { diag = v; diag_pos = i; } else { row_scale = hypre_max(row_scale, v); } } } /* offd part */ if (lane < 2) { p_offd = read_only_load(A_offd_i + row + lane); } q_offd = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, p_offd, 1); p_offd = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, p_offd, 0); for (HYPRE_Int i = p_offd + lane; i < q_offd; i += HYPRE_WARP_SIZE) { if ( num_functions == 1 || read_only_load(&dof_func[row]) == read_only_load(&dof_func_offd[read_only_load(&A_offd_j[i])]) ) { const HYPRE_Real v = hypre_cabs( read_only_load(&A_offd_data[i]) ); row_sum += v; row_scale = hypre_max(row_scale, v); } } diag = warp_allreduce_sum(item, diag); /* compute scaling factor and row sum */ row_sum = warp_allreduce_sum(item, row_sum); row_scale = warp_allreduce_max(item, row_scale); /* compute row of S */ HYPRE_Int all_weak = max_row_sum < 1.0 && hypre_abs(row_sum) < hypre_abs(diag) * (2.0 - max_row_sum); const HYPRE_Real thresh = strength_threshold * row_scale; for (HYPRE_Int i = p_diag + lane; i < q_diag; i += HYPRE_WARP_SIZE) { const HYPRE_Int cond = all_weak == 0 && diag_pos != i && ( num_functions == 1 || read_only_load(&dof_func[row]) == read_only_load(&dof_func[read_only_load(&A_diag_j[i])]) ) && hypre_cabs( read_only_load(&A_diag_data[i]) ) > thresh; S_temp_diag_j[i] = cond * (1 + read_only_load(&A_diag_j[i])) - 1; row_nnz_diag += cond; } /* !!! mark diagonal as -2 !!! */ if (diag_pos >= 0) { S_temp_diag_j[diag_pos] = -2; } for (HYPRE_Int i = p_offd + lane; i < q_offd; i += HYPRE_WARP_SIZE) { const HYPRE_Int cond = all_weak == 0 && ( num_functions == 1 || read_only_load(&dof_func[row]) == read_only_load(&dof_func_offd[read_only_load(&A_offd_j[i])]) ) && hypre_cabs( read_only_load(&A_offd_data[i]) ) > thresh; S_temp_offd_j[i] = cond * (1 + read_only_load(&A_offd_j[i])) - 1; row_nnz_offd += cond; } row_nnz_diag = warp_reduce_sum(item, row_nnz_diag); row_nnz_offd = warp_reduce_sum(item, row_nnz_offd); if (0 == lane) { jS_diag[row] = row_nnz_diag; jS_offd[row] = row_nnz_offd; } } /*-------------------------------------------------------------------------- * hypre_BoomerAMGCorrectCFMarker : corrects CF_marker after aggr. coarsening *--------------------------------------------------------------------------*/ HYPRE_Int hypre_BoomerAMGCorrectCFMarkerDevice(hypre_IntArray *CF_marker, hypre_IntArray *new_CF_marker) { HYPRE_Int n_fine = hypre_IntArraySize(CF_marker); HYPRE_Int n_coarse = hypre_IntArraySize(new_CF_marker); HYPRE_Int *indices = hypre_CTAlloc(HYPRE_Int, n_coarse, HYPRE_MEMORY_DEVICE); HYPRE_Int *CF_C = hypre_CTAlloc(HYPRE_Int, n_coarse, HYPRE_MEMORY_DEVICE); #if defined(HYPRE_USING_SYCL) /* save CF_marker values at C points in CF_C and C point indices */ HYPRE_ONEDPL_CALL( std::copy_if, hypre_IntArrayData(CF_marker), hypre_IntArrayData(CF_marker) + n_fine, CF_C, is_positive() ); hypreSycl_copy_if( oneapi::dpl::counting_iterator(0), oneapi::dpl::counting_iterator(n_fine), hypre_IntArrayData(CF_marker), indices, is_positive() ); /* replace CF_marker at C points with 1 */ HYPRE_ONEDPL_CALL( std::replace_if, hypre_IntArrayData(CF_marker), hypre_IntArrayData(CF_marker) + n_fine, is_positive(), 1 ); /* update with new_CF_marker wherever C point value was initially 1 */ hypreSycl_scatter_if( hypre_IntArrayData(new_CF_marker), hypre_IntArrayData(new_CF_marker) + n_coarse, indices, CF_C, hypre_IntArrayData(CF_marker), equal(1) ); #else /* save CF_marker values at C points in CF_C and C point indices */ HYPRE_THRUST_CALL( copy_if, hypre_IntArrayData(CF_marker), hypre_IntArrayData(CF_marker) + n_fine, CF_C, is_positive() ); HYPRE_THRUST_CALL( copy_if, thrust::counting_iterator(0), thrust::counting_iterator(n_fine), hypre_IntArrayData(CF_marker), indices, is_positive() ); /* replace CF_marker at C points with 1 */ HYPRE_THRUST_CALL( replace_if, hypre_IntArrayData(CF_marker), hypre_IntArrayData(CF_marker) + n_fine, is_positive(), 1 ); /* update with new_CF_marker wherever C point value was initially 1 */ HYPRE_THRUST_CALL( scatter_if, hypre_IntArrayData(new_CF_marker), hypre_IntArrayData(new_CF_marker) + n_coarse, indices, CF_C, hypre_IntArrayData(CF_marker), equal(1) ); #endif hypre_TFree(indices, HYPRE_MEMORY_DEVICE); hypre_TFree(CF_C, HYPRE_MEMORY_DEVICE); return 0; } /*-------------------------------------------------------------------------- * hypre_BoomerAMGCorrectCFMarker2 : corrects CF_marker after aggr. coarsening, * but marks new F-points (previous C-points) as -2 *--------------------------------------------------------------------------*/ HYPRE_Int hypre_BoomerAMGCorrectCFMarker2Device(hypre_IntArray *CF_marker, hypre_IntArray *new_CF_marker) { HYPRE_Int n_fine = hypre_IntArraySize(CF_marker); HYPRE_Int n_coarse = hypre_IntArraySize(new_CF_marker); HYPRE_Int *indices = hypre_CTAlloc(HYPRE_Int, n_coarse, HYPRE_MEMORY_DEVICE); #if defined(HYPRE_USING_SYCL) /* save C point indices */ hypreSycl_copy_if( oneapi::dpl::counting_iterator(0), oneapi::dpl::counting_iterator(n_fine), hypre_IntArrayData(CF_marker), indices, is_positive() ); /* replace CF_marker at C points with 1 */ HYPRE_ONEDPL_CALL( std::replace_if, hypre_IntArrayData(CF_marker), hypre_IntArrayData(CF_marker) + n_fine, is_positive(), 1 ); /* update values in CF_marker to -2 wherever new_CF_marker == -1 */ hypreSycl_transform_if( oneapi::dpl::make_permutation_iterator(hypre_IntArrayData(CF_marker), indices), oneapi::dpl::make_permutation_iterator(hypre_IntArrayData(CF_marker), indices) + n_coarse, hypre_IntArrayData(new_CF_marker), oneapi::dpl::make_permutation_iterator(hypre_IntArrayData(CF_marker), indices), [] (const auto & x) { return -2; }, equal(-1) ); #else /* save C point indices */ HYPRE_THRUST_CALL( copy_if, thrust::counting_iterator(0), thrust::counting_iterator(n_fine), hypre_IntArrayData(CF_marker), indices, is_positive() ); /* replace CF_marker at C points with 1 */ HYPRE_THRUST_CALL( replace_if, hypre_IntArrayData(CF_marker), hypre_IntArrayData(CF_marker) + n_fine, is_positive(), 1 ); /* update values in CF_marker to -2 wherever new_CF_marker == -1 */ HYPRE_THRUST_CALL( scatter_if, thrust::make_constant_iterator(-2), thrust::make_constant_iterator(-2) + n_coarse, indices, hypre_IntArrayData(new_CF_marker), hypre_IntArrayData(CF_marker), equal(-1) ); #endif hypre_TFree(indices, HYPRE_MEMORY_DEVICE); return 0; } #endif /* #if defined(HYPRE_USING_GPU) */ hypre-2.33.0/src/parcsr_ls/par_sv_interp.c000066400000000000000000002355731477326011500205510ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "_hypre_parcsr_ls.h" #include "Common.h" #define SV_DEBUG 0 /****************************************************************************** hypre_BoomerAMGSmoothInterpVectors- *apply hybrid GS smoother to the interp vectors *******************************************************************************/ HYPRE_Int hypre_BoomerAMGSmoothInterpVectors(hypre_ParCSRMatrix *A, HYPRE_Int num_smooth_vecs, hypre_ParVector **smooth_vecs, HYPRE_Int smooth_steps) { HYPRE_Int i, j; hypre_ParVector *f, *v, *z; hypre_ParVector *new_vector; if (num_smooth_vecs == 0) { return hypre_error_flag; } if (smooth_steps) { v = hypre_ParVectorInRangeOf( A); f = hypre_ParVectorInRangeOf( A); z = hypre_ParVectorInRangeOf( A); hypre_ParVectorSetConstantValues(f, 0.0); for (i = 0; i < num_smooth_vecs; i++) { new_vector = smooth_vecs[i]; for (j = 0; j < smooth_steps; j++) { hypre_BoomerAMGRelax(A, f, NULL, 3, 0, 1.0, 1.0, NULL, new_vector, v, z); } } hypre_ParVectorDestroy(v); hypre_ParVectorDestroy(f); hypre_ParVectorDestroy(z); } return hypre_error_flag; } /****************************************************************************** hypre_BoomerAMGCoarsenInterpVectors: *this routine for "coarsening" the interp vectors *expand_level = 1, means that the new smooth vecs need to be expanded to fit the new num functions (this typically happends at interp_first_level) ******************************************************************************/ HYPRE_Int hypre_BoomerAMGCoarsenInterpVectors( hypre_ParCSRMatrix *P, HYPRE_Int num_smooth_vecs, hypre_ParVector **smooth_vecs, HYPRE_Int *CF_marker, hypre_ParVector ***new_smooth_vecs, HYPRE_Int expand_level, HYPRE_Int num_functions) { HYPRE_Int i, j, k; HYPRE_BigInt n_new = hypre_ParCSRMatrixGlobalNumCols(P); HYPRE_BigInt *starts = hypre_ParCSRMatrixColStarts(P); HYPRE_Int n_old_local; HYPRE_Int counter; HYPRE_Int orig_nf; HYPRE_Real *old_vector_data; HYPRE_Real *new_vector_data; MPI_Comm comm = hypre_ParCSRMatrixComm(P); hypre_ParVector *old_vector; hypre_ParVector *new_vector; hypre_ParVector **new_vector_array; if (num_smooth_vecs == 0) { return hypre_error_flag; } new_vector_array = hypre_CTAlloc(hypre_ParVector*, num_smooth_vecs, HYPRE_MEMORY_HOST); /* get the size of the vector we are coarsening */ old_vector = smooth_vecs[0]; n_old_local = hypre_VectorSize(hypre_ParVectorLocalVector(old_vector)); for (i = 0; i < num_smooth_vecs; i++) { new_vector = hypre_ParVectorCreate(comm, n_new, starts); hypre_ParVectorInitialize(new_vector); new_vector_data = hypre_VectorData(hypre_ParVectorLocalVector(new_vector)); old_vector = smooth_vecs[i]; old_vector_data = hypre_VectorData(hypre_ParVectorLocalVector(old_vector)); /* copy coarse data to new vector*/ counter = 0; /* need to do differently for the expansion level because the old vector is to small (doesn't have new dofs) */ if (expand_level) { orig_nf = num_functions - num_smooth_vecs; /* nodal coarsening, so just check the first dof in each node, i.e. loop through nodes */ for (j = 0; j < n_old_local; j += orig_nf) { if (CF_marker[j] >= 0) { for (k = 0; k < orig_nf; k++) /* orig dofs */ { new_vector_data[counter++] = old_vector_data[j + k]; } for (k = 0; k < num_smooth_vecs; k++ ) /* new dofs */ { if (k == i) { new_vector_data[counter++] = 1.0; } else { new_vector_data[counter++] = 0.0; } /* there is nothing to copy, so just put a 1.0 or 0.0 here - then the next level works correctly - this value not used anyhow - but now it is nice if printed for matlab */ } } } } else /* normal level */ { for (j = 0; j < n_old_local; j++) { if (CF_marker[j] >= 0) { new_vector_data[counter++] = old_vector_data[j]; } } } /*assign new_vector to vector array */ new_vector_array[i] = new_vector; } *new_smooth_vecs = new_vector_array; return hypre_error_flag; } /****************************************************************************** hypre_BoomerAMG_GMExpandInterp- routine for updating the interp operator to interpolate the supplied smooth vectors by expanding P in a SA-ish manner This is the GM approach as described in Baker,Kolev and Yang "Improving AMG interpolation operators for linear elasticity problems" *MUST USE NODAL COARSENING! (and so unknowns interlaced) *NOTE: we assume that we are adding 1 dof for 2D and 3 dof for 3D P = [P Q] variant = 1: (GM approach 1) Q_ij = P_ij*v_i/sum_j(P_ij), where v is the smooth vec variant = 2: GM approach 2).: Q_ij = P_ij(v_i/sum_j(P_ij) - vc_j) (vc is coarse version of v) this variant we must call on all levels here we modify P_s (P corresponding to new unknowns) *if level = first_level - add the new dofs ocrresponding to the number of interp vecs - otherwise, the unknowns are there and we are just augmenting the matrix *note: changes num_functions and updates dof_array if level = 0 *abs_trunc - don't add elements to Q less than abs_truc (we don't use the regular interp truncation function because it rescales the rows, which we don't want to do that) ******************************************************************************/ HYPRE_Int hypre_BoomerAMG_GMExpandInterp( hypre_ParCSRMatrix *A, hypre_ParCSRMatrix **P, HYPRE_Int num_smooth_vecs, hypre_ParVector **smooth_vecs, HYPRE_Int *nf, HYPRE_Int *dof_func, hypre_IntArray **coarse_dof_func, HYPRE_Int variant, HYPRE_Int level, HYPRE_Real abs_trunc, HYPRE_Real *weights, HYPRE_Int q_max, HYPRE_Int *CF_marker, HYPRE_Int interp_vec_first_level) { HYPRE_Int i, j, k; hypre_ParCSRMatrix *new_P; hypre_CSRMatrix *P_diag = hypre_ParCSRMatrixDiag(*P); HYPRE_Real *P_diag_data = hypre_CSRMatrixData(P_diag); HYPRE_Int *P_diag_i = hypre_CSRMatrixI(P_diag); HYPRE_Int *P_diag_j = hypre_CSRMatrixJ(P_diag); HYPRE_Int num_rows_P = hypre_CSRMatrixNumRows(P_diag); HYPRE_Int num_cols_P = hypre_CSRMatrixNumCols(P_diag); HYPRE_Int P_diag_size = P_diag_i[num_rows_P]; hypre_CSRMatrix *P_offd = hypre_ParCSRMatrixOffd(*P); HYPRE_Int *P_offd_i = hypre_CSRMatrixI(P_offd); HYPRE_Int P_offd_size = P_offd_i[num_rows_P]; HYPRE_Real *P_offd_data = hypre_CSRMatrixData(P_offd); HYPRE_Int *P_offd_j = hypre_CSRMatrixJ(P_offd); HYPRE_Int num_cols_P_offd = hypre_CSRMatrixNumCols(P_offd); HYPRE_BigInt *col_map_offd_P = hypre_ParCSRMatrixColMapOffd(*P); HYPRE_BigInt *col_starts = hypre_ParCSRMatrixColStarts(*P); HYPRE_BigInt *new_col_map_offd_P = NULL; hypre_ParCSRCommPkg *comm_pkg = hypre_ParCSRMatrixCommPkg(*P); MPI_Comm comm; HYPRE_Int num_sends; HYPRE_Int new_nnz_diag, new_nnz_offd, orig_diag_start, orig_offd_start; HYPRE_Int j_diag_pos, j_offd_pos; HYPRE_Int nnz_diag, nnz_offd, fcn_num, num_elements; HYPRE_Int num_diag_elements, num_offd_elements; HYPRE_Int *P_diag_j_new, *P_diag_i_new, *P_offd_i_new, *P_offd_j_new; HYPRE_BigInt *P_offd_j_big = NULL; HYPRE_Real *P_diag_data_new, *P_offd_data_new; HYPRE_Int nv, ncv, ncv_peru; HYPRE_Int new_ncv; HYPRE_Int new_nf = *nf; HYPRE_Int myid = 0, num_procs = 1, p_count_diag, p_count_offd; hypre_ParVector *vector; HYPRE_Real *vec_data; HYPRE_Real row_sum; HYPRE_Real *dbl_buf_data; HYPRE_Real *smooth_vec_offd = NULL; HYPRE_Real *offd_vec_data; HYPRE_Int orig_nf; HYPRE_BigInt new_col_starts[2]; HYPRE_Int num_functions = *nf; HYPRE_Int *c_dof_func = hypre_IntArrayData(*coarse_dof_func); HYPRE_Int modify = 0; HYPRE_Int add_q = 0; HYPRE_Real value; HYPRE_Real trunc_value = 0.0; HYPRE_Real theta_2D[] = {.5, .5}; HYPRE_Real theta_3D[] = {1.0 / 3.0, 1.0 / 3.0, 1.0 / 3.0}; HYPRE_Real *theta; HYPRE_Int q_count; HYPRE_Int use_trunc_data = 0; HYPRE_Real *q_data = NULL; HYPRE_Real *q_trunc_data = NULL; HYPRE_Int *is_q = NULL; HYPRE_Int q_alloc = 0; HYPRE_BigInt *aux_j = NULL; HYPRE_Real *aux_data = NULL; HYPRE_Int *is_diag = NULL; HYPRE_Int *col_map; HYPRE_Int *coarse_to_fine; HYPRE_Int coarse_counter; HYPRE_Int fine_index = 0; HYPRE_Int index; HYPRE_BigInt big_index, big_new_col, cur_col, g_nc; HYPRE_Int new_col; HYPRE_Int *num_lost_sv = NULL; HYPRE_Int *q_count_sv = NULL; HYPRE_Int *lost_counter_q_sv = NULL; HYPRE_Real *lost_value_sv = NULL; HYPRE_Real *q_dist_value_sv = NULL; HYPRE_MemoryLocation memory_location_P = hypre_ParCSRMatrixMemoryLocation(A); /* only doing 2 variants */ if (variant < 1 || variant > 2) { variant = 2; } /* variant 2 needs off proc sv data (Variant 1 needs it if we * use_truc_data = 1 )*/ if (!comm_pkg) { hypre_MatvecCommPkgCreate ( *P ); comm_pkg = hypre_ParCSRMatrixCommPkg(*P); } comm = hypre_ParCSRCommPkgComm(comm_pkg); hypre_MPI_Comm_size(comm, &num_procs); hypre_MPI_Comm_rank(comm, &myid); #if SV_DEBUG { char new_file[80]; hypre_CSRMatrix *P_CSR = NULL; hypre_Vector *sv = NULL; P_CSR = hypre_ParCSRMatrixToCSRMatrixAll(*P); if (!myid) { hypre_sprintf(new_file, "%s.level.%d", "P_new_orig", level ); if (P_CSR) { hypre_CSRMatrixPrint(P_CSR, new_file); } } hypre_CSRMatrixDestroy(P_CSR); if (level == interp_vec_first_level || variant == 2) { for (i = 0; i < num_smooth_vecs; i++) { sv = hypre_ParVectorToVectorAll(smooth_vecs[i]); if (!myid) { hypre_sprintf(new_file, "%s.%d.level.%d", "smoothvec", i, level ); if (sv) { hypre_SeqVectorPrint(sv, new_file); } } hypre_SeqVectorDestroy(sv); } } P_CSR = hypre_ParCSRMatrixToCSRMatrixAll(A); if (!myid) { hypre_sprintf(new_file, "%s.level.%d", "A", level ); if (P_CSR) { hypre_CSRMatrixPrint(P_CSR, new_file); } } hypre_CSRMatrixDestroy(P_CSR); } #endif /*initialize */ nv = num_rows_P; ncv = num_cols_P; nnz_diag = P_diag_size; nnz_offd = P_offd_size; /* add Q? */ /* only on first level for variants other than 2 */ if (variant == 2 || level == interp_vec_first_level) { add_q = 1; } /* modify P_s? */ if (variant == 2) { modify = 1; } /* use different values to truncate? */ if (variant == 1 ) { use_trunc_data = 1; } /* Note: we assume a NODAL coarsening */ /* First we need to make room for the new entries to P*/ /*number of coarse variables for each unknown */ ncv_peru = ncv / num_functions; if (level == interp_vec_first_level) { orig_nf = num_functions; /*orig_ncv = ncv;*/ } else /* on deeper levels, need to know orig sizes (without new * dofs) */ { orig_nf = num_functions - num_smooth_vecs; /*orig_ncv = ncv - ncv_peru*num_smooth_vecs;*/ } /*weights for P_s */ if (modify) { if (weights == NULL) { if (orig_nf == 2) { theta = theta_2D; } else { theta = theta_3D; } } else { theta = weights; } } /* if level = first_level, we need to fix the col numbering to leave * space for the new unknowns */ col_map = hypre_CTAlloc(HYPRE_Int, ncv, HYPRE_MEMORY_HOST); if (num_smooth_vecs && (level == interp_vec_first_level)) { for (i = 0; i < ncv; i++) { /* map from old col number to new col number (leave spaces * for new unknowns to be interleaved */ col_map[i] = i + (i / num_functions) * num_smooth_vecs; } } else { for (i = 0; i < ncv; i++) { /* map from old col number to new col number */ col_map[i] = i; } } /* new number of nonzeros - these are overestimates if level > first_level*/ /* we will have the same sparsity in Q as in P */ new_nnz_diag = nnz_diag + nnz_diag * num_smooth_vecs; new_nnz_offd = nnz_offd + nnz_offd * num_smooth_vecs; /* new number of coarse variables */ if (level == interp_vec_first_level ) { new_ncv = ncv + ncv_peru * num_smooth_vecs; } else { new_ncv = ncv; /* unchanged on level > 0 */ } P_diag_j_new = hypre_CTAlloc(HYPRE_Int, new_nnz_diag, memory_location_P); P_diag_data_new = hypre_CTAlloc(HYPRE_Real, new_nnz_diag, memory_location_P); P_diag_i_new = hypre_CTAlloc(HYPRE_Int, nv + 1, memory_location_P); P_offd_j_big = hypre_CTAlloc(HYPRE_BigInt, new_nnz_offd, HYPRE_MEMORY_HOST); P_offd_j_new = hypre_CTAlloc(HYPRE_Int, new_nnz_offd, memory_location_P); P_offd_data_new = hypre_CTAlloc(HYPRE_Real, new_nnz_offd, memory_location_P); P_offd_i_new = hypre_CTAlloc(HYPRE_Int, nv + 1, memory_location_P); P_diag_i_new[0] = P_diag_i[0]; P_offd_i_new[0] = P_offd_i[0]; /* if doing truncation of q, need to allocate q_data */ if (add_q) { if (q_max > 0 || abs_trunc > 0.0) { /* what is max elements per row? */ q_count = 0; for (i = 0; i < num_rows_P; i++) { num_elements = P_diag_i[i + 1] - P_diag_i[i]; num_elements += (P_offd_i[i + 1] - P_offd_i[i]); if (num_elements > q_count) { q_count = num_elements; } } q_alloc = q_count * (num_smooth_vecs + 1); q_data = hypre_CTAlloc(HYPRE_Real, q_alloc, HYPRE_MEMORY_HOST); q_trunc_data = hypre_CTAlloc(HYPRE_Real, q_alloc, HYPRE_MEMORY_HOST); is_q = hypre_CTAlloc(HYPRE_Int, q_alloc, HYPRE_MEMORY_HOST); aux_data = hypre_CTAlloc(HYPRE_Real, q_alloc, HYPRE_MEMORY_HOST); aux_j = hypre_CTAlloc(HYPRE_BigInt, q_alloc, HYPRE_MEMORY_HOST); is_diag = hypre_CTAlloc(HYPRE_Int, q_alloc, HYPRE_MEMORY_HOST); /* for truncation routines */ q_count_sv = hypre_CTAlloc(HYPRE_Int, num_smooth_vecs, HYPRE_MEMORY_HOST); /* number of new q entries for each smoothvec */ num_lost_sv = hypre_CTAlloc(HYPRE_Int, num_smooth_vecs, HYPRE_MEMORY_HOST); /* value dropped */ lost_counter_q_sv = hypre_CTAlloc(HYPRE_Int, num_smooth_vecs, HYPRE_MEMORY_HOST); lost_value_sv = hypre_CTAlloc(HYPRE_Real, num_smooth_vecs, HYPRE_MEMORY_HOST); /* how many to drop */ q_dist_value_sv = hypre_CTAlloc(HYPRE_Real, num_smooth_vecs, HYPRE_MEMORY_HOST); ; } } /* create the coarse to fine*/ coarse_to_fine = hypre_CTAlloc(HYPRE_Int, ncv, HYPRE_MEMORY_HOST); coarse_counter = 0; for (i = 0; i < num_rows_P; i++) { if (CF_marker[i] >= 0) { coarse_to_fine[coarse_counter] = i; coarse_counter++; } } /* Get smooth vec components for the off-processor columns of P - * in smoothvec_offd*/ if (num_procs > 1) { HYPRE_Int start, c_index; hypre_ParCSRCommHandle *comm_handle; smooth_vec_offd = hypre_CTAlloc(HYPRE_Real, num_cols_P_offd * num_smooth_vecs, HYPRE_MEMORY_HOST); /* for now, do a seperate comm for each smooth vector */ for (k = 0; k < num_smooth_vecs; k++) { vector = smooth_vecs[k]; vec_data = hypre_VectorData(hypre_ParVectorLocalVector(vector)); num_sends = hypre_ParCSRCommPkgNumSends(comm_pkg); dbl_buf_data = hypre_CTAlloc(HYPRE_Real, hypre_ParCSRCommPkgSendMapStart(comm_pkg, num_sends), HYPRE_MEMORY_HOST); /* point into smooth_vec_offd */ offd_vec_data = smooth_vec_offd + k * num_cols_P_offd; index = 0; for (i = 0; i < num_sends; i++) { start = hypre_ParCSRCommPkgSendMapStart(comm_pkg, i); for (j = start; j < hypre_ParCSRCommPkgSendMapStart(comm_pkg, i + 1); j++) { /* we need to do the coarse/fine conversion here */ c_index = hypre_ParCSRCommPkgSendMapElmt(comm_pkg, j); fine_index = coarse_to_fine[c_index]; dbl_buf_data[index++] = vec_data[fine_index]; } } comm_handle = hypre_ParCSRCommHandleCreate( 1, comm_pkg, dbl_buf_data, offd_vec_data); hypre_ParCSRCommHandleDestroy(comm_handle); hypre_TFree(dbl_buf_data, HYPRE_MEMORY_HOST); } }/*end num procs > 1 */ /******** loop through rows - add P only to the rows of original functions. rows corresponding to new functions are either left as is or modified with weighted average of interpolation of original variables******/ j_diag_pos = 0; j_offd_pos = 0; orig_diag_start = 0; orig_offd_start = 0; for (i = 0; i < num_rows_P; i++) { q_count = 0; /* number of entries of q added for this row */ /* zero entries */ for (j = 0; j < q_alloc; j++) { is_q[j] = 0; q_data[j] = 0.0; q_trunc_data[j] = 0.0; } /* get function num for this row */ fcn_num = (HYPRE_Int) fmod(i, num_functions); if (fcn_num != dof_func[i]) { hypre_error_w_msg(HYPRE_ERROR_GENERIC, "WARNING - ROWS incorrectly ordered in hypre_BoomerAMG_GMExpandInterp!\n"); } /* number of elements in row */ num_diag_elements = P_diag_i[i + 1] - orig_diag_start; num_offd_elements = P_offd_i[i + 1] - orig_offd_start; /* loop through elements - copy each to new_P and create Q corresp to each smooth vec for the orig functions */ p_count_diag = 0; p_count_offd = 0; /* original function dofs? */ if (fcn_num < orig_nf) { row_sum = 1.0; if ((variant == 1 || variant == 2) && add_q) { /* calc. row sum */ row_sum = 0.0; for (j = 0; j < num_diag_elements; j++) { row_sum += P_diag_data[orig_diag_start + j]; } for (j = 0; j < num_offd_elements; j++) { row_sum += P_offd_data[orig_offd_start + j]; } num_elements = num_diag_elements + num_offd_elements; if (num_elements && hypre_abs(row_sum) < 1e-15) { row_sum = 1.0; } } /**** first do diag elements *****/ for (j = 0; j < num_diag_elements; j++) { /* first copy original entry corresponding to P */ new_col = col_map[P_diag_j[orig_diag_start + j]]; P_diag_j_new[j_diag_pos] = new_col; P_diag_data_new[j_diag_pos] = P_diag_data[orig_diag_start + j]; j_diag_pos++; p_count_diag++; /* add Q ? (only add Q to original dofs )*/ if (add_q) { /* the current column number */ cur_col = new_col; /* loop through the smooth vectors */ for (k = 0; k < num_smooth_vecs; k++) { /* point to the smooth vector */ vector = smooth_vecs[k]; vec_data = hypre_VectorData(hypre_ParVectorLocalVector(vector)); /* add an entry */ /* create a single new entry for Q*/ new_col = cur_col + (HYPRE_BigInt)((orig_nf - fcn_num) + k); /* Determine the Q entry value*/ if (variant == 2) { /*HYPRE_Real dt;*/ /* Q: P_ij(v_i/row_sum - vc_j) - ** notice we use fine and coarse smooth vecs */ index = P_diag_j[orig_diag_start + j]; /* don't want to use col_map here because we will index into the smooth vector */ fine_index = coarse_to_fine[index]; /*dt = P_diag_data[orig_diag_start+j]; dt = (vec_data[i]/row_sum - vec_data[fine_index]);*/ value = P_diag_data[orig_diag_start + j] * (vec_data[i] / row_sum - vec_data[fine_index]); } else /* variant 1 */ { /* create new entry for Q: P_ij*v_i /sum(P_ij)*/ value = (P_diag_data[orig_diag_start + j] * vec_data[i]) / row_sum; if (abs_trunc > 0.0 && use_trunc_data ) { fine_index = P_diag_j[orig_diag_start + j]; fine_index = coarse_to_fine[fine_index]; /* this is Tzanio's suggestion */ if (vec_data[fine_index] != 0.0 ) { trunc_value = P_diag_data[orig_diag_start + j] * (vec_data[i]) / (vec_data[fine_index]); } else { trunc_value = P_diag_data[orig_diag_start + j] * (vec_data[i]); } } } /* end of var 2 */ /* add the new entry to to P */ if (hypre_abs(value) > 0.0) { if (q_max > 0 || abs_trunc > 0.0) { if (use_trunc_data) { q_trunc_data[p_count_diag] = trunc_value; } /* note that this goes in the p_count entry to line up with is_q */ is_q[p_count_diag] = k + 1; /* so we know which k*/ q_data[q_count++] = value; } P_diag_j_new[j_diag_pos] = new_col; p_count_diag++; P_diag_data_new[j_diag_pos++] = value; } } /* end loop through smooth vecs */ } /* end if add q */ } /* end of loop through diag elements */ /**** now do offd elements *****/ p_count_offd = p_count_diag; for (j = 0; j < num_offd_elements; j++) { /* first copy original entry corresponding to P (but j needs to go back to regular numbering - will be compressed later when col_map_offd is generated*/ index = P_offd_j[orig_offd_start + j]; /* convert to the global col number using col_map_offd */ big_index = col_map_offd_P[index]; /*now adjust for the new dofs - since we are offd, can't * use col_map[index]*/ if (num_smooth_vecs && (level == interp_vec_first_level)) { big_new_col = big_index + (big_index / (HYPRE_BigInt)num_functions) * (HYPRE_BigInt)num_smooth_vecs; } else /* no adjustment */ { big_new_col = big_index; } P_offd_j_big[j_offd_pos] = big_new_col; P_offd_data_new[j_offd_pos] = P_offd_data[orig_offd_start + j]; j_offd_pos++; p_count_offd++; /* add Q ? (only add Q to original dofs )*/ if (add_q) { /* the current column number */ cur_col = big_new_col; /* loop through the smooth vectors */ for (k = 0; k < num_smooth_vecs; k++) { /* point to the smooth vector */ vector = smooth_vecs[k]; vec_data = hypre_VectorData(hypre_ParVectorLocalVector(vector)); /* point to the offd smooth vector */ offd_vec_data = smooth_vec_offd + k * num_cols_P_offd; /* add an entry */ /* create a single new entry for Q*/ big_new_col = cur_col + (HYPRE_BigInt)((orig_nf - fcn_num) + k); /* Determine the Q entry value*/ if (variant == 2 ) { /*HYPRE_Real dt;*/ /* Q: P_ij(v_i/row_sum - vc_j) - * notice we use fine and coarse smooth vecs */ index = P_offd_j[orig_offd_start + j]; /* don't want to use col_map here because we will index into the smooth vector */ /* did thecoasrse/fine conversion when gathering from procs above */ /*dt = P_offd_data[orig_offd_start+j]; dt = (vec_data[i]/row_sum - offd_vec_data[index]);*/ value = P_offd_data[orig_offd_start + j] * (vec_data[i] / row_sum - offd_vec_data[index]); /* dt = (vec_data[i]/row_sum - c_vec_data[cur_col]); value = P_offd_data[orig_offd_start+j]*(vec_data[i]/row_sum - c_vec_data[cur_col]);*/ } else /* variant 1 */ { /* create new entry for Q: P_ij*v_i /sum(P_ij)*/ value = (P_offd_data[orig_offd_start + j] * vec_data[i]) / row_sum; if (abs_trunc > 0.0 && use_trunc_data ) { index = P_offd_j[orig_offd_start + j]; /* this is Tzanio's suggestion */ if (offd_vec_data[fine_index] != 0.0 ) { trunc_value = P_offd_data[orig_offd_start + j] * (vec_data[i]) / (offd_vec_data[index]); } else { trunc_value = P_offd_data[orig_offd_start + j] * (vec_data[i]); } } } /* end of var 2 */ /* add the new entry to to P */ if (hypre_abs(value) > 0.0) { if (q_max > 0 || abs_trunc > 0.0) { if (use_trunc_data) { q_trunc_data[p_count_offd] = trunc_value; } /* note that this goes in the p_count entry to line up with is_q */ is_q[p_count_offd] = k + 1; /* so we know which k*/ q_data[q_count++] = value; } P_offd_j_big[j_offd_pos] = big_new_col; p_count_offd++; P_offd_data_new[j_offd_pos++] = value; } } /* end loop through smooth vecs */ } /* end if add q */ } /* end of loop through offd elements */ } /* end if original function dofs */ else /* the new dofs */ { if (modify) /* instead of copying, let's modify the P corresponding to the new dof - * for 2D make it (P_u + P_v)/2....*/ { HYPRE_Int m, m_pos; HYPRE_Real m_val; /*HYPRE_Real tmp;*/ /**** first do diag elements *****/ for (j = 0; j < num_diag_elements; j++) { m_val = 0.0; for (m = 0; m < orig_nf; m++) { m_pos = P_diag_i[i - (fcn_num - m)] + j; /* recall - nodal coarsening */ /*tmp = P_diag_data[m_pos];*/ m_val += theta[m] * P_diag_data[m_pos]; } /*m_val = m_val/orig_nf;*/ P_diag_j_new[j_diag_pos] = P_diag_j[orig_diag_start + j]; P_diag_data_new[j_diag_pos++] = m_val; p_count_diag++; } /**** now offd elements *****/ /* recall that j needs to go back to regular numbering - will be compressed later when col_map_offd is generated*/ p_count_offd = p_count_diag; for (j = 0; j < num_offd_elements; j++) { m_val = 0.0; for (m = 0; m < orig_nf; m++) { m_pos = P_offd_i[i - (fcn_num - m)] + j; /* recall - nodal coarsening */ /*tmp = P_offd_data[m_pos];*/ m_val += theta[m] * P_offd_data[m_pos]; } /*m_val = m_val/orig_nf;*/ index = P_offd_j[orig_offd_start + j]; big_index = col_map_offd_P[index]; P_offd_j_big[j_offd_pos] = big_index; P_offd_data_new[j_offd_pos++] = m_val; p_count_offd++; } } else /* just copy original entry corresponding to P (so original result from unk-based interp on new dof */ { /**** first do diag elements *****/ for (j = 0; j < num_diag_elements; j++) { P_diag_j_new[j_diag_pos] = P_diag_j[orig_diag_start + j]; P_diag_data_new[j_diag_pos++] = P_diag_data[orig_diag_start + j]; p_count_diag++; } /**** now offd elements *****/ /* recall that j needs to go back to regular numbering - will be compressed later when col_map_offd is generated*/ p_count_offd = p_count_diag; for (j = 0; j < num_offd_elements; j++) { index = P_offd_j[orig_offd_start + j]; big_index = col_map_offd_P[index]; P_offd_j_big[j_offd_pos] = big_index; P_offd_data_new[j_offd_pos++] = P_offd_data[orig_offd_start + j]; p_count_offd++; } } }/* end of new dof stuff */ /* adjust p_count_offd to not include diag*/ p_count_offd = p_count_offd - p_count_diag; /* ANY TRUCATION ?*/ if (add_q && q_count > 0 && (q_max > 0 || abs_trunc > 0.0)) { HYPRE_Int tot_num_lost; HYPRE_Int new_diag_pos, new_offd_pos; HYPRE_Int j_counter, new_j_counter; HYPRE_Int cnt_new_q_data; HYPRE_Int lost_counter_diag, lost_counter_offd; HYPRE_Int which_q; /* initialize to zero*/ for (j = 0; j < num_smooth_vecs; j++) { q_count_sv[j] = 0; num_lost_sv[j] = 0; lost_counter_q_sv[j] = 0; lost_value_sv[j] = 0.0; q_dist_value_sv[j] = 0.0; } /* absolute truncation ? */ if (abs_trunc > 0.0) { cnt_new_q_data = 0; j_counter = 0; /* diag loop */ for (j = P_diag_i_new[i]; j < P_diag_i_new[i] + p_count_diag; j++) { if (is_q[j_counter]) /* if > 0 then belongs to q */ { which_q = is_q[j_counter] - 1; /* adjust to index into sv arrays */ q_count_sv[which_q]++; if (!use_trunc_data) { value = hypre_abs(P_diag_data_new[j]); } else { value = hypre_abs(q_trunc_data[j_counter]); } if (value < abs_trunc ) { num_lost_sv[which_q]++; lost_value_sv[which_q] += P_diag_data_new[j]; } } j_counter++; } /* offd loop - don't reset j_counter*/ for (j = P_offd_i_new[i]; j < P_offd_i_new[i] + p_count_offd; j++) { if (is_q[j_counter]) /* if > 0 then belongs to q */ { which_q = is_q[j_counter] - 1; /* adjust to index into sv arrays */ q_count_sv[which_q]++; if (!use_trunc_data) { value = hypre_abs(P_offd_data_new[j]); } else { value = hypre_abs(q_trunc_data[j_counter]); } if (value < abs_trunc ) { num_lost_sv[which_q] ++; lost_value_sv[which_q] += P_offd_data_new[j]; } } j_counter++; } tot_num_lost = 0; for (j = 0; j < num_smooth_vecs; j++) { q_dist_value_sv[j] = 0.0; tot_num_lost += num_lost_sv[j]; } /* now drop values and adjust remaining ones to keep rowsum const. */ lost_counter_diag = 0; lost_counter_offd = 0; if (tot_num_lost) { /* figure out distribution value */ for (j = 0; j < num_smooth_vecs; j++) { if ((q_count_sv[j] - num_lost_sv[j]) > 0) { q_dist_value_sv[j] = lost_value_sv[j] / (q_count_sv[j] - num_lost_sv[j]); } } j_counter = 0; new_j_counter = 0; /* diag entries */ new_diag_pos = P_diag_i_new[i]; for (j = P_diag_i_new[i]; j < P_diag_i_new[i] + p_count_diag; j++) { if (!use_trunc_data) { value = hypre_abs(P_diag_data_new[j]); } else { value = hypre_abs(q_trunc_data[j_counter]); } if ( is_q[j_counter] && (value < abs_trunc) ) { /* drop */ which_q = is_q[j_counter] - 1; /* adjust to index into sv arrays */ lost_counter_diag++; } else { /* keep - and if it is a q value then add the distribution */ value = P_diag_data_new[j]; if (is_q[j_counter]) { which_q = is_q[j_counter] - 1; /* adjust to index into sv arrays */ value += q_dist_value_sv[which_q]; q_data[cnt_new_q_data++] = value; } P_diag_data_new[new_diag_pos] = value; P_diag_j_new[new_diag_pos] = P_diag_j_new[j]; new_diag_pos++; is_q[new_j_counter] = is_q[j_counter]; new_j_counter++; } j_counter++; } /* offd entries */ new_offd_pos = P_offd_i_new[i]; for (j = P_offd_i_new[i]; j < P_offd_i_new[i] + p_count_offd; j++) { if (!use_trunc_data) { value = hypre_abs(P_offd_data_new[j]); } else { value = hypre_abs(q_trunc_data[j_counter]); } if ( is_q[j_counter] && (value < abs_trunc) ) { /* drop */ which_q = is_q[j_counter] - 1; /* adjust to index into sv arrays */ lost_counter_offd++; } else { /* keep - and if it is a q value then add the distribution */ value = P_offd_data_new[j]; if (is_q[j_counter]) { which_q = is_q[j_counter] - 1; /* adjust to index into sv arrays */ value += q_dist_value_sv[which_q]; q_data[cnt_new_q_data++] = value; } P_offd_data_new[new_offd_pos] = value; P_offd_j_big[new_offd_pos] = P_offd_j_big[j]; new_offd_pos++; is_q[new_j_counter] = is_q[j_counter]; new_j_counter++; } j_counter++; } /* adjust p_count and j_pos */ p_count_diag -= lost_counter_diag; p_count_offd -= lost_counter_offd; j_diag_pos -= lost_counter_diag; j_offd_pos -= lost_counter_offd; if (tot_num_lost != (lost_counter_diag + lost_counter_offd)) { hypre_error_w_msg(HYPRE_ERROR_GENERIC, "hypre_BoomerAMG_GMExpandInterp: 1st Truncation error \n"); } }/* end of num_lost */ }/* abs_trunc > 0 */ /* max number of element truncation */ if (q_max > 0) { HYPRE_Int p_count_tot; for (j = 0; j < num_smooth_vecs; j++) { q_count_sv[j] = 0; num_lost_sv[j] = 0; lost_value_sv[j] = 0.0; } /* copy all elements for the row into aux vectors and * count the q's for each smoothvec*/ j_counter = 0; for (j = P_diag_i_new[i]; j < P_diag_i_new[i] + p_count_diag; j++) { if (is_q[j_counter]) /* if > 0 then belongs to q */ { which_q = is_q[j_counter] - 1; /* adjust to index into sv arrays */ q_count_sv[which_q]++; } aux_j[j_counter] = (HYPRE_BigInt)P_diag_j_new[j]; aux_data[j_counter] = P_diag_data_new[j]; is_diag[j_counter] = 1; j_counter++; } /* offd loop - don't reset j_counter*/ for (j = P_offd_i_new[i]; j < P_offd_i_new[i] + p_count_offd; j++) { if (is_q[j_counter]) /* if > 0 then belongs to q */ { which_q = is_q[j_counter] - 1; /* adjust to index into sv arrays */ q_count_sv[which_q]++; } aux_j[j_counter] = P_offd_j_big[j]; aux_data[j_counter] = P_offd_data_new[j]; is_diag[j_counter] = 0; j_counter++; } /* intitialize */ tot_num_lost = 0; for (j = 0; j < num_smooth_vecs; j++) { /* new_num_q_sv[j] = q_count_sv[j]; */ q_dist_value_sv[j] = 0.0; lost_value_sv[j] = 0.0; lost_counter_q_sv[j] = 0; num_lost_sv[j] = q_count_sv[j] - q_max;; /* don't want num_lost to be negative */ if (num_lost_sv[j] < 0) { num_lost_sv[j] = 0; } tot_num_lost += num_lost_sv[j]; } if (tot_num_lost > 0) { p_count_tot = p_count_diag + p_count_offd; /* only keep q_max elements - get rid of smallest */ hypre_BigQsort4_abs(aux_data, aux_j, is_q, is_diag, 0, p_count_tot - 1); lost_counter_diag = 0; lost_counter_offd = 0; new_diag_pos = P_diag_i_new[i]; new_offd_pos = P_offd_i_new[i]; new_j_counter = 0; /* have to do diag and offd together because of sorting*/ for (j = 0; j < p_count_tot; j++) { which_q = 0; if ( is_q[j] ) { which_q = is_q[j] - 1; /* adjust to index into sv arrays */ } if ( is_q[j] && (lost_counter_q_sv[which_q] < num_lost_sv[which_q])) { /*drop*/ lost_value_sv[which_q] += aux_data[j]; /* new_num_q_sv[which_q]--; */ lost_counter_q_sv[which_q]++; /* check whether this is diag or offd element */ if (is_diag[j]) { lost_counter_diag++; } else { lost_counter_offd++; } /* technically only need to do this the last time */ q_dist_value_sv[which_q] = lost_value_sv[which_q] / q_max; } else { /* keep and add the dist if necessart*/ value = aux_data[j]; if (is_q[j]) { which_q = is_q[j] - 1; /* adjust to index into sv arrays */ value += q_dist_value_sv[which_q];; } if (is_diag[j]) { P_diag_data_new[new_diag_pos] = value; P_diag_j_new[new_diag_pos] = (HYPRE_Int)aux_j[j]; new_diag_pos++; is_q[new_j_counter] = is_q[j]; new_j_counter++; } else { P_offd_data_new[new_offd_pos] = value; P_offd_j_big[new_offd_pos] = aux_j[j]; new_offd_pos++; is_q[new_j_counter] = is_q[j]; new_j_counter++; } } }/* end element loop */ /* adjust p_count and j_pos */ p_count_diag -= lost_counter_diag; p_count_offd -= lost_counter_offd; j_diag_pos -= lost_counter_diag; j_offd_pos -= lost_counter_offd; } /* end of num lost > 0 */ }/* end of q_max > 0 */ }/* end of TRUNCATION */ /* modify i */ orig_diag_start = P_diag_i[i + 1]; orig_offd_start = P_offd_i[i + 1]; P_diag_i_new[i + 1] = P_diag_i_new[i] + p_count_diag; P_offd_i_new[i + 1] = P_offd_i_new[i] + p_count_offd; if (j_diag_pos != P_diag_i_new[i + 1]) { hypre_error_w_msg(HYPRE_ERROR_GENERIC, "Warning - diag Row Problem in hypre_BoomerAMG_GMExpandInterp!\n"); } if (j_offd_pos != P_offd_i_new[i + 1]) { hypre_error_w_msg(HYPRE_ERROR_GENERIC, "Warning - off-diag Row Problem in hypre_BoomerAMG_GMExpandInterp!\n"); } } /* END loop through rows of P */ /* Done looping through rows - NOW FINISH THINGS UP! */ /* if level = first_level , we need to update the number of * funcs and the dof_func */ if (level == interp_vec_first_level ) { HYPRE_Int spot; c_dof_func = hypre_TReAlloc_v2(c_dof_func, HYPRE_Int, hypre_IntArraySize(*coarse_dof_func), HYPRE_Int, new_ncv, hypre_IntArrayMemoryLocation(*coarse_dof_func)); spot = 0; for (i = 0; i < ncv_peru; i++) { for (k = 0; k < num_functions + num_smooth_vecs; k++) { c_dof_func[spot++] = k; } } /*RETURN: update num functions and dof_func */ new_nf = num_functions + num_smooth_vecs; *nf = new_nf; hypre_IntArrayData(*coarse_dof_func) = c_dof_func; hypre_IntArraySize(*coarse_dof_func) = new_ncv; /* also we need to update the col starts and global num columns*/ /* assumes that unknowns are together on a procsessor with * nodal coarsening */ new_col_starts[0] = (col_starts[0] / (HYPRE_BigInt)num_functions) * (HYPRE_BigInt)new_nf ; new_col_starts[1] = (col_starts[1] / (HYPRE_BigInt)num_functions) * (HYPRE_BigInt)new_nf; if (myid == (num_procs - 1)) { g_nc = new_col_starts[1]; } hypre_MPI_Bcast(&g_nc, 1, HYPRE_MPI_BIG_INT, num_procs - 1, comm); } else /* not first level */ { /* grab global num cols */ g_nc = hypre_ParCSRMatrixGlobalNumCols(*P); /* copy col starts */ new_col_starts[0] = col_starts[0]; new_col_starts[1] = col_starts[1]; } /* modify P - now P has more entries and possibly more cols - * need to create a new P and destory old*/ new_P = hypre_ParCSRMatrixCreate(comm, hypre_ParCSRMatrixGlobalNumRows(A), g_nc, hypre_ParCSRMatrixColStarts(A), new_col_starts, 0, P_diag_i_new[nv], P_offd_i_new[nv]); P_diag = hypre_ParCSRMatrixDiag(new_P); hypre_CSRMatrixI(P_diag) = P_diag_i_new; hypre_CSRMatrixJ(P_diag) = P_diag_j_new; hypre_CSRMatrixData(P_diag) = P_diag_data_new; hypre_CSRMatrixNumNonzeros(P_diag) = P_diag_i_new[num_rows_P]; P_offd = hypre_ParCSRMatrixOffd(new_P); hypre_CSRMatrixData(P_offd) = P_offd_data_new; hypre_CSRMatrixI(P_offd) = P_offd_i_new; /* If parallel we need to do the col map offd! */ if (num_procs > 1) { HYPRE_Int count; HYPRE_Int num_cols_P_offd = 0; HYPRE_Int P_offd_new_size = P_offd_i_new[num_rows_P]; if (P_offd_new_size) { HYPRE_BigInt *j_copy; /* check this */ new_col_map_offd_P = hypre_CTAlloc(HYPRE_BigInt, P_offd_new_size, HYPRE_MEMORY_HOST); /*first copy the j entries (these are GLOBAL numbers) */ j_copy = hypre_CTAlloc(HYPRE_BigInt, P_offd_new_size, HYPRE_MEMORY_HOST); for (i = 0; i < P_offd_new_size; i++) { j_copy[i] = P_offd_j_big[i]; } /* now sort them */ hypre_BigQsort0(j_copy, 0, P_offd_new_size - 1); /* now copy to col_map offd - but only each col once */ new_col_map_offd_P[0] = j_copy[0]; count = 0; for (i = 0; i < P_offd_new_size; i++) { if (j_copy[i] > new_col_map_offd_P[count]) { count++; new_col_map_offd_P[count] = j_copy[i]; } } num_cols_P_offd = count + 1; /* reset the j entries to be local */ for (i = 0; i < P_offd_new_size; i++) P_offd_j_new[i] = hypre_BigBinarySearch(new_col_map_offd_P, P_offd_j_big[i], num_cols_P_offd); hypre_TFree(j_copy, HYPRE_MEMORY_HOST); } hypre_ParCSRMatrixColMapOffd(new_P) = new_col_map_offd_P; hypre_CSRMatrixNumCols(P_offd) = num_cols_P_offd; } /* end col map stuff */ hypre_CSRMatrixJ(P_offd) = P_offd_j_new; /* CREATE THE COMM PKG */ hypre_MatvecCommPkgCreate ( new_P ); #if SV_DEBUG { char new_file[80]; hypre_CSRMatrix *P_CSR; P_CSR = hypre_ParCSRMatrixToCSRMatrixAll(new_P); if (!myid) { hypre_sprintf(new_file, "%s.level.%d", "P_new_new", level ); if (P_CSR) { hypre_CSRMatrixPrint(P_CSR, new_file); } } hypre_CSRMatrixDestroy(P_CSR); } #endif /*destroy old */ hypre_ParCSRMatrixDestroy(*P); /* RETURN: update P */ *P = new_P; /* clean up */ hypre_TFree(is_q, HYPRE_MEMORY_HOST); hypre_TFree(q_data, HYPRE_MEMORY_HOST); hypre_TFree(q_trunc_data, HYPRE_MEMORY_HOST); hypre_TFree(aux_j, HYPRE_MEMORY_HOST); hypre_TFree(aux_data, HYPRE_MEMORY_HOST); hypre_TFree(is_diag, HYPRE_MEMORY_HOST); hypre_TFree(P_offd_j_big, HYPRE_MEMORY_HOST); hypre_TFree(q_count_sv, HYPRE_MEMORY_HOST); hypre_TFree(num_lost_sv, HYPRE_MEMORY_HOST); hypre_TFree(lost_value_sv, HYPRE_MEMORY_HOST); hypre_TFree(lost_counter_q_sv, HYPRE_MEMORY_HOST); hypre_TFree(q_dist_value_sv, HYPRE_MEMORY_HOST); hypre_TFree(col_map, HYPRE_MEMORY_HOST); hypre_TFree(coarse_to_fine, HYPRE_MEMORY_HOST); hypre_TFree(smooth_vec_offd, HYPRE_MEMORY_HOST); return hypre_error_flag; } /****************************************************************************** hypre_BoomerAMGRefineInterp- * this is an update to the current P - a.k.a. "iterative weight interpolation" ******************************************************************************/ HYPRE_Int hypre_BoomerAMGRefineInterp( hypre_ParCSRMatrix *A, hypre_ParCSRMatrix *P, HYPRE_BigInt *num_cpts_global, HYPRE_Int *nf, HYPRE_Int *dof_func, HYPRE_Int *CF_marker, HYPRE_Int level) { HYPRE_UNUSED_VAR(level); HYPRE_Int i, j, k, pp; hypre_CSRMatrix *A_diag = hypre_ParCSRMatrixDiag(A); HYPRE_Real *A_diag_data = hypre_CSRMatrixData(A_diag); HYPRE_Int *A_diag_i = hypre_CSRMatrixI(A_diag); HYPRE_Int *A_diag_j = hypre_CSRMatrixJ(A_diag); hypre_CSRMatrix *A_offd = hypre_ParCSRMatrixOffd(A); HYPRE_Real *A_offd_data = hypre_CSRMatrixData(A_offd); HYPRE_Int *A_offd_i = hypre_CSRMatrixI(A_offd); HYPRE_Int *A_offd_j = hypre_CSRMatrixJ(A_offd); HYPRE_Int num_cols_A_offd = hypre_CSRMatrixNumCols(A_offd); hypre_CSRMatrix *P_diag = hypre_ParCSRMatrixDiag(P); HYPRE_Real *P_diag_data = hypre_CSRMatrixData(P_diag); HYPRE_Int *P_diag_i = hypre_CSRMatrixI(P_diag); HYPRE_Int *P_diag_j = hypre_CSRMatrixJ(P_diag); HYPRE_Int num_rows_P = hypre_CSRMatrixNumRows(P_diag); HYPRE_Int P_diag_size = P_diag_i[num_rows_P]; hypre_CSRMatrix *P_offd = hypre_ParCSRMatrixOffd(P); HYPRE_Int *P_offd_i = hypre_CSRMatrixI(P_offd); HYPRE_Int P_offd_size = P_offd_i[num_rows_P]; HYPRE_Real *P_offd_data = hypre_CSRMatrixData(P_offd); HYPRE_Int *P_offd_j = hypre_CSRMatrixJ(P_offd); HYPRE_Int num_cols_P_offd = hypre_CSRMatrixNumCols(P_offd); HYPRE_BigInt *col_map_offd_P = hypre_ParCSRMatrixColMapOffd(P); HYPRE_MemoryLocation memory_location = hypre_ParCSRMatrixMemoryLocation(P); HYPRE_Int orig_diag_start, orig_offd_start; HYPRE_Int j_diag_pos, j_offd_pos; HYPRE_Int fcn_num, p_num_diag_elements, p_num_offd_elements; HYPRE_Real *P_diag_data_new; HYPRE_Real *P_offd_data_new; HYPRE_Int *CF_marker_offd = NULL; HYPRE_Int *dof_func_offd = NULL; HYPRE_BigInt *fine_to_coarse_offd; HYPRE_Int found; HYPRE_Int num_functions = *nf; hypre_ParCSRCommPkg *comm_pkg_P = hypre_ParCSRMatrixCommPkg(P); hypre_ParCSRCommPkg *comm_pkg_A = hypre_ParCSRMatrixCommPkg(A); MPI_Comm comm; HYPRE_Int coarse_counter; HYPRE_Int j_ext_index; HYPRE_Int *fine_to_coarse; HYPRE_Int k_point, j_point, j_point_c, p_point; HYPRE_BigInt big_k, big_index, big_j_point_c; HYPRE_Real diagonal, aw, a_ij; HYPRE_Int scale_row; HYPRE_Real sum; HYPRE_Real new_row_sum, orig_row_sum; HYPRE_Int use_alt_w, kk, kk_count, cur_spot; HYPRE_Int dist_coarse; hypre_CSRMatrix *P_ext = NULL; HYPRE_Real *P_ext_data = NULL; HYPRE_Int *P_ext_i = NULL; HYPRE_BigInt *P_ext_j = NULL; HYPRE_Int num_sends_A, index, start; HYPRE_Int myid = 0, num_procs = 1; hypre_ParCSRCommHandle *comm_handle; HYPRE_Int *int_buf_data = NULL; HYPRE_BigInt *big_buf_data = NULL; if (!comm_pkg_P) { hypre_MatvecCommPkgCreate (P); comm_pkg_P = hypre_ParCSRMatrixCommPkg(P); } comm = hypre_ParCSRCommPkgComm(comm_pkg_A); hypre_MPI_Comm_size(comm, &num_procs); hypre_MPI_Comm_rank(comm, &myid); #if SV_DEBUG { char new_file[80]; hypre_CSRMatrix *P_CSR = NULL; P_CSR = hypre_ParCSRMatrixToCSRMatrixAll(P); if (!myid) { hypre_sprintf(new_file, "%s.level.%d", "P_new_orig", level ); if (P_CSR) { hypre_CSRMatrixPrint(P_CSR, new_file); } } hypre_CSRMatrixDestroy(P_CSR); P_CSR = hypre_ParCSRMatrixToCSRMatrixAll(A); if (!myid) { hypre_sprintf(new_file, "%s.level.%d", "A", level ); if (P_CSR) { hypre_CSRMatrixPrint(P_CSR, new_file); } } hypre_CSRMatrixDestroy(P_CSR); } #endif num_sends_A = hypre_ParCSRCommPkgNumSends(comm_pkg_A); big_buf_data = hypre_CTAlloc(HYPRE_BigInt, hypre_ParCSRCommPkgSendMapStart(comm_pkg_A, num_sends_A), HYPRE_MEMORY_HOST); int_buf_data = hypre_CTAlloc(HYPRE_Int, hypre_ParCSRCommPkgSendMapStart(comm_pkg_A, num_sends_A), HYPRE_MEMORY_HOST); /*----------------------------------------------------------------------- * Send and receive fine_to_coarse info. *-----------------------------------------------------------------------*/ { HYPRE_BigInt my_first_cpt; HYPRE_Int tmp_i; my_first_cpt = num_cpts_global[0]; /* need a fine-to-coarse mapping (num row P = num rows A)*/ fine_to_coarse = hypre_CTAlloc(HYPRE_Int, num_rows_P, HYPRE_MEMORY_HOST); for (i = 0; i < num_rows_P; i++) { fine_to_coarse[i] = -1; } coarse_counter = 0; for (i = 0; i < num_rows_P; i++) { if (CF_marker[i] >= 0) { fine_to_coarse[i] = coarse_counter; coarse_counter++; } } /* now from other procs */ fine_to_coarse_offd = hypre_CTAlloc(HYPRE_BigInt, num_cols_A_offd, HYPRE_MEMORY_HOST); index = 0; for (i = 0; i < num_sends_A; i++) { start = hypre_ParCSRCommPkgSendMapStart(comm_pkg_A, i); for (j = start; j < hypre_ParCSRCommPkgSendMapStart(comm_pkg_A, i + 1); j++) { tmp_i = fine_to_coarse[hypre_ParCSRCommPkgSendMapElmt(comm_pkg_A, j)]; big_buf_data[index++] = (HYPRE_BigInt)tmp_i + my_first_cpt; /* makes it global */ } } comm_handle = hypre_ParCSRCommHandleCreate( 21, comm_pkg_A, big_buf_data, fine_to_coarse_offd); hypre_ParCSRCommHandleDestroy(comm_handle); } /*------------------------------------------------------------------- * Get the CF_marker data for the off-processor columns of A *-------------------------------------------------------------------*/ { if (num_cols_A_offd) { CF_marker_offd = hypre_CTAlloc(HYPRE_Int, num_cols_A_offd, HYPRE_MEMORY_HOST); } if (num_functions > 1 && num_cols_A_offd) { dof_func_offd = hypre_CTAlloc(HYPRE_Int, num_cols_A_offd, HYPRE_MEMORY_HOST); } index = 0; for (i = 0; i < num_sends_A; i++) { start = hypre_ParCSRCommPkgSendMapStart(comm_pkg_A, i); for (j = start; j < hypre_ParCSRCommPkgSendMapStart(comm_pkg_A, i + 1); j++) { int_buf_data[index++] = CF_marker[hypre_ParCSRCommPkgSendMapElmt(comm_pkg_A, j)]; } } comm_handle = hypre_ParCSRCommHandleCreate( 11, comm_pkg_A, int_buf_data, CF_marker_offd); hypre_ParCSRCommHandleDestroy(comm_handle); if (num_functions > 1) { index = 0; for (i = 0; i < num_sends_A; i++) { start = hypre_ParCSRCommPkgSendMapStart(comm_pkg_A, i); for (j = start; j < hypre_ParCSRCommPkgSendMapStart(comm_pkg_A, i + 1); j++) { int_buf_data[index++] = dof_func[hypre_ParCSRCommPkgSendMapElmt(comm_pkg_A, j)]; } } comm_handle = hypre_ParCSRCommHandleCreate( 11, comm_pkg_A, int_buf_data, dof_func_offd); hypre_ParCSRCommHandleDestroy(comm_handle); } } /*------------------------------------------------------------------- * Get the ghost rows of P *-------------------------------------------------------------------*/ { HYPRE_Int kc; HYPRE_BigInt col_1 = hypre_ParCSRMatrixFirstColDiag(P); HYPRE_BigInt col_n = col_1 + hypre_CSRMatrixNumCols(P_diag); if (num_procs > 1) { /* need the rows of P on other processors associated with the offd cols of A */ P_ext = hypre_ParCSRMatrixExtractBExt(P, A, 1); P_ext_i = hypre_CSRMatrixI(P_ext); P_ext_j = hypre_CSRMatrixBigJ(P_ext); P_ext_data = hypre_CSRMatrixData(P_ext); } index = 0; /* now check whether each col is in the diag of offd part of P)*/ for (i = 0; i < num_cols_A_offd; i++) { for (j = P_ext_i[i]; j < P_ext_i[i + 1]; j++) { big_k = P_ext_j[j]; /* is it in the diag ?*/ if (big_k >= col_1 && big_k < col_n) { P_ext_j[index] = big_k - col_1; /* make a local col number */ P_ext_data[index++] = P_ext_data[j]; } else { /* off diag entry */ kc = hypre_BigBinarySearch(col_map_offd_P, big_k, num_cols_P_offd); /* now this corresponds to the location in the col_map_offd ( so it is a local column number */ if (kc > -1) { P_ext_j[index] = (HYPRE_BigInt)(-kc - 1); /* make negative */ P_ext_data[index++] = P_ext_data[j]; } } } P_ext_i[i] = index; } for (i = num_cols_A_offd; i > 0; i--) { P_ext_i[i] = P_ext_i[i - 1]; } if (num_procs > 1) { P_ext_i[0] = 0; } } /* end of ghost rows */ /* initialized to zero */ P_diag_data_new = hypre_CTAlloc(HYPRE_Real, P_diag_size, memory_location); P_offd_data_new = hypre_CTAlloc(HYPRE_Real, P_offd_size, memory_location); j_diag_pos = 0; j_offd_pos = 0; /*------------------------------------------------------------------- *loop through rows *-------------------------------------------------------------------*/ for (i = 0; i < num_rows_P; i++) { new_row_sum = 0.0; use_alt_w = 0; scale_row = 0; orig_row_sum = 0.0; fcn_num = (HYPRE_Int) fmod(i, num_functions); if (fcn_num != dof_func[i]) { hypre_error_w_msg(HYPRE_ERROR_GENERIC, "WARNING - ROWS incorrectly ordered in hypre_BoomerAMGRefineInterp!\n"); } /* number of elements in row of p*/ orig_diag_start = P_diag_i[i]; orig_offd_start = P_offd_i[i]; /* number of elements in row */ p_num_diag_elements = P_diag_i[i + 1] - orig_diag_start; p_num_offd_elements = P_offd_i[i + 1] - orig_offd_start; if (CF_marker[i] >= 0) /* row corres. to coarse point - just copy orig */ { /* diag */ for (j = 0; j < p_num_diag_elements; j++) { P_diag_data_new[j_diag_pos++] = P_diag_data[orig_diag_start + j]; } /*offd */ for (j = 0; j < p_num_offd_elements; j++) { P_offd_data_new[j_offd_pos++] = P_offd_data[orig_offd_start + j]; } } else /* row is for fine point - make new interpolation*/ { /* make orig entries zero*/ for (j = 0; j < p_num_diag_elements; j++) { orig_row_sum += P_diag_data[orig_diag_start + j]; P_diag_data_new[j_diag_pos++] = 0.0; } for (j = 0; j < p_num_offd_elements; j++) { orig_row_sum += P_offd_data[orig_offd_start + j]; P_offd_data_new[j_offd_pos++] = 0.0; } /*get diagonal of A */ diagonal = A_diag_data[A_diag_i[i]]; /* loop over elements in row i of A (except diagonal element)*/ /* diag*/ for (j = A_diag_i[i] + 1; j < A_diag_i[i + 1]; j++) { j_point = A_diag_j[j]; /* only want like unknowns */ if (fcn_num != dof_func[j_point]) { continue; } dist_coarse = 0; a_ij = A_diag_data[j]; found = 0; if (CF_marker[j_point] >= 0) /*coarse*/ { j_point_c = fine_to_coarse[j_point]; /* find P(i,j_c) and put value there (there may not be an entry in P if this coarse connection was not a strong connection */ /* we are looping in the diag of this row, so we only * need to look in P_diag */ for (k = P_diag_i[i]; k < P_diag_i[i + 1]; k ++) { if (P_diag_j[k] == j_point_c) { P_diag_data_new[k] += a_ij; found = 1; break; } } if (!found) { /*this is a weakly connected c-point - does not contribute - so no error - but this messes up row sum*/ /* we need to distribute this */ dist_coarse = 1; } } else /*fine connection */ { sum = 0.0; /*loop over diag and offd of row of P for j_point and get the sum of the connections to c-points of i (diag and offd)*/ /*diag*/ for (pp = P_diag_i[j_point]; pp < P_diag_i[j_point + 1]; pp++) { p_point = P_diag_j[pp];/* this is a coarse index */ /* is p_point in row i also ? check the diag part*/ for (k = P_diag_i[i]; k < P_diag_i[i + 1]; k ++) { k_point = P_diag_j[k]; /* this is a coarse index */ if (p_point == k_point) { /* add p_jk to sum */ sum += P_diag_data[pp]; break; } }/* end loop k over row i */ } /* end loop pp over row j_point for diag */ /* now offd */ for (pp = P_offd_i[j_point]; pp < P_offd_i[j_point + 1]; pp++) { p_point = P_offd_j[pp];/* this is a coarse index */ /* is p_point in row i also ? check the offd part*/ for (k = P_offd_i[i]; k < P_offd_i[i + 1]; k ++) { k_point = P_offd_j[k]; /* this is a coarse index */ if (p_point == k_point) { /* add p_jk to sum */ sum += P_offd_data[pp]; break; } }/* end loop k over row i */ } /* end loop pp over row j_point */ if (hypre_abs(sum) < 1e-12) { sum = 1.0; use_alt_w = 1; } if (use_alt_w) { /* distribute a_ij equally among coarse points */ aw = a_ij / (p_num_diag_elements + p_num_offd_elements); kk_count = 0; /* loop through row i of orig p*/ /* diag */ for (kk = P_diag_i[i]; kk < P_diag_i[i + 1]; kk++) { cur_spot = P_diag_i[i] + kk_count; P_diag_data_new[cur_spot] += aw; kk_count++; } /* offd */ kk_count = 0; for (kk = P_offd_i[i]; kk < P_offd_i[i + 1]; kk++) { cur_spot = P_offd_i[i] + kk_count; P_offd_data_new[cur_spot] += aw; kk_count++; } /* did each element of p */ /* skip out to next jj of A */ continue; }/* end of alt w */ /* Now we need to do the distributing */ /* loop through row i (diag and offd )of p*/ /* first diag part */ for (k = P_diag_i[i]; k < P_diag_i[i + 1]; k ++) { k_point = P_diag_j[k]; /* this is a coarse index */ /* now is there an entry for P(j_point, k_point)? - need to look through row j_point (on -proc since j came from A_diag */ for (pp = P_diag_i[j_point]; pp < P_diag_i[j_point + 1]; pp++) { if (P_diag_j[pp] == k_point) { /* a_ij*w_jk */ aw = a_ij * P_diag_data[pp]; aw = aw / sum; P_diag_data_new[k] += aw; break; } } /* end loop pp over row j_point */ } /* end loop k over diag row i of P */ for (k = P_offd_i[i]; k < P_offd_i[i + 1]; k ++) { k_point = P_offd_j[k]; /* this is a coarse index */ /* now is there an entry for P(j_point, k_point)? - need to look through offd part of row j_point (this is on -proc since j came from A_diag */ for (pp = P_offd_i[j_point]; pp < P_offd_i[j_point + 1]; pp++) { if (P_offd_j[pp] == k_point) { /* a_ij*w_jk */ aw = a_ij * P_offd_data[pp]; aw = aw / sum; P_offd_data_new[k] += aw; break; } } /* end loop pp over row j_point */ } /* end loop k over row i of P */ } /* end of fine connection in row of A*/ if (dist_coarse) { /* coarse not in orig interp.(weakly connected) */ /* distribute a_ij equally among coarse points */ aw = a_ij / (p_num_diag_elements + p_num_offd_elements); kk_count = 0; /* loop through row i of orig p*/ for (kk = P_diag_i[i]; kk < P_diag_i[i + 1]; kk++) { cur_spot = P_diag_i[i] + kk_count; P_diag_data_new[cur_spot] += aw; kk_count++; } kk_count = 0; for (kk = P_offd_i[i]; kk < P_offd_i[i + 1]; kk++) { cur_spot = P_offd_i[i] + kk_count; P_offd_data_new[cur_spot] += aw; kk_count++; } } }/* end loop j over row i of A_diag */ /* loop over offd of A */ /* loop over elements in row i of A_offd )*/ for (j = A_offd_i[i]; j < A_offd_i[i + 1]; j++) { j_point = A_offd_j[j]; /* only want like unknowns - check the offd dof func*/ if (fcn_num != dof_func_offd[j_point]) { continue; } dist_coarse = 0; a_ij = A_offd_data[j]; found = 0; if (CF_marker_offd[j_point] >= 0) /*check the offd marker*/ { /* coarse */ big_j_point_c = fine_to_coarse_offd[j_point]; /* now its global!! */ /* find P(i,j_c) and put value there (there may not be an entry in P if this coarse connection was not a strong connection */ /* we are looping in the off diag of this row, so we only * need to look in P_offd */ for (k = P_offd_i[i]; k < P_offd_i[i + 1]; k ++) { index = P_offd_j[k]; /* local number */ big_index = col_map_offd_P[index]; /*global number * (becuz j_point_c * is global */ /* if (P_offd_j[k] == j_point_c)*/ if (big_index == big_j_point_c) { P_offd_data_new[k] += a_ij; found = 1; break; } } if (!found) { /*this is a weakly connected c-point - does not contribute - so no error - but this messes up row sum*/ /* we need to distribute this */ dist_coarse = 1; } } else /*fine connection */ { sum = 0.0; /*loop over row of P for j_point and get the sum of the connections to c-points of i (diag and offd) - now the row for j_point is on another processor - and j_point is an index of A - need to convert it to corresponding index of P */ /* j_point is an index of A_off d - so */ /* now this is the row in P, but these are stored in * P_ext according to offd of A */ j_ext_index = j_point; for (pp = P_ext_i[j_ext_index]; pp < P_ext_i[j_ext_index + 1]; pp++) { p_point = (HYPRE_Int)P_ext_j[pp];/* this is a coarse index */ /* is p_point in row i of P also ? check the diag and offd part or row i of P */ if (p_point > -1) /* in diag part */ { for (k = P_diag_i[i]; k < P_diag_i[i + 1]; k ++) { k_point = P_diag_j[k]; /* this is a coarse index */ if (p_point == k_point) { /* add p_jk to sum */ sum += P_ext_data[pp]; break; } }/* end loop k over row i */ } else /* in offd diag part */ { p_point = -p_point - 1; /* p_point is a local col number for P now */ for (k = P_offd_i[i]; k < P_offd_i[i + 1]; k ++) { k_point = P_offd_j[k]; /* this is a coarse index */ if (p_point == k_point) { /* add p_jk to sum */ sum += P_ext_data[pp]; break; } }/* end loop k over row i */ }/* end diag or offd */ }/* end loop over row P for j_point */ if (hypre_abs(sum) < 1e-12) { sum = 1.0; use_alt_w = 1; } if (use_alt_w) { /* distribute a_ij equally among coarse points */ aw = a_ij / (p_num_diag_elements + p_num_offd_elements); kk_count = 0; /* loop through row i of orig p*/ /* diag */ for (kk = P_diag_i[i]; kk < P_diag_i[i + 1]; kk++) { cur_spot = P_diag_i[i] + kk_count; P_diag_data_new[cur_spot] += aw; kk_count++; } /* offd */ kk_count = 0; for (kk = P_offd_i[i]; kk < P_offd_i[i + 1]; kk++) { cur_spot = P_offd_i[i] + kk_count; P_offd_data_new[cur_spot] += aw; kk_count++; } /* did each element of p */ /* skip out to next jj of A */ continue; }/* end of alt w */ /* Now we need to do the distributing */ /* loop through row i (diag and offd )of p*/ /* first diag part */ for (k = P_diag_i[i]; k < P_diag_i[i + 1]; k ++) { k_point = P_diag_j[k]; /* this is a coarse index */ /* now is there an entry for P(j_point, k_point)? - need to look through row j_point - this will be off-proc */ for (pp = P_ext_i[j_ext_index]; pp < P_ext_i[j_ext_index + 1]; pp++) { p_point = (HYPRE_Int) P_ext_j[pp]; if (p_point > -1) /* diag part */ { if (p_point == k_point) { /* a_ij*w_jk */ aw = a_ij * P_ext_data[pp]; aw = aw / sum; P_diag_data_new[k] += aw; break; } } } /* end loop pp over row j_point */ } /* end loop k over diag row i of P */ for (k = P_offd_i[i]; k < P_offd_i[i + 1]; k ++) { k_point = P_offd_j[k]; /* this is a coarse index */ /* now is there an entry for P(j_point, k_point)? - need to look through row j_point - this will be off-proc */ for (pp = P_ext_i[j_ext_index]; pp < P_ext_i[j_ext_index + 1]; pp++) { p_point = (HYPRE_Int) P_ext_j[pp]; if (p_point < 0) /* in offd part */ { p_point = - p_point - 1; if (p_point == k_point) { /* a_ij*w_jk */ aw = a_ij * P_ext_data[pp]; aw = aw / sum; P_offd_data_new[k] += aw; break; } } } /* end loop pp over row j_point */ } /* end loop k over row i of P */ } /* end of fine connection in row of A*/ if (dist_coarse) { /* coarse not in orig interp.(weakly connected) */ /* distribute a_ij equally among coarse points */ aw = a_ij / (p_num_diag_elements + p_num_offd_elements); kk_count = 0; /* loop through row i of orig p*/ for (kk = P_diag_i[i]; kk < P_diag_i[i + 1]; kk++) { cur_spot = P_diag_i[i] + kk_count; P_diag_data_new[cur_spot] += aw; kk_count++; } kk_count = 0; for (kk = P_offd_i[i]; kk < P_offd_i[i + 1]; kk++) { cur_spot = P_offd_i[i] + kk_count; P_offd_data_new[cur_spot] += aw; kk_count++; } } }/* end loop j over row i of A_offd */ /* now divide by the diagonal and we are finished with this row!*/ if (hypre_abs(diagonal) > 0.0) { for (k = P_diag_i[i] ; k < P_diag_i[i + 1]; k++) { P_diag_data_new[k] /= -(diagonal); new_row_sum += P_diag_data_new[k]; } for (k = P_offd_i[i] ; k < P_offd_i[i + 1]; k++) { P_offd_data_new[k] /= -(diagonal); new_row_sum += P_offd_data_new[k]; } /* now re-scale */ if (scale_row) { for (k = P_diag_i[i] ; k < P_diag_i[i + 1]; k++) { P_diag_data_new[k] *= (orig_row_sum / new_row_sum); } for (k = P_offd_i[i] ; k < P_offd_i[i + 1]; k++) { P_offd_data_new[k] *= (orig_row_sum / new_row_sum); } } } } /* end of row of P is fine point - build interp */ } /* end of i loop throw rows */ /* modify P - only need to replace the data (i and j are the same)*/ hypre_TFree(P_diag_data, memory_location); hypre_TFree(P_offd_data, memory_location); hypre_CSRMatrixData(P_diag) = P_diag_data_new; hypre_CSRMatrixData(P_offd) = P_offd_data_new; #if SV_DEBUG { char new_file[80]; hypre_CSRMatrix *P_CSR; P_CSR = hypre_ParCSRMatrixToCSRMatrixAll(P); if (!myid) { hypre_sprintf(new_file, "%s.level.%d", "P_new_new", level ); if (P_CSR) { hypre_CSRMatrixPrint(P_CSR, new_file); } } hypre_CSRMatrixDestroy(P_CSR); } #endif /* clean up */ hypre_TFree(CF_marker_offd, HYPRE_MEMORY_HOST); hypre_TFree(dof_func_offd, HYPRE_MEMORY_HOST); hypre_TFree(fine_to_coarse, HYPRE_MEMORY_HOST); hypre_TFree(fine_to_coarse_offd, HYPRE_MEMORY_HOST); hypre_TFree(int_buf_data, HYPRE_MEMORY_HOST); hypre_TFree(big_buf_data, HYPRE_MEMORY_HOST); hypre_CSRMatrixDestroy(P_ext); return hypre_error_flag; } hypre-2.33.0/src/parcsr_ls/par_sv_interp_ln.c000066400000000000000000002775421477326011500212440ustar00rootroot00000000000000/****************************************************************************** *dof_func_ptr = dof_func; * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "_hypre_parcsr_ls.h" #include "Common.h" #define SV_DEBUG 0 /****************************************************************************** hypre_BoomerAMG_LNExpandInterp * This is the LN approach as described in Baker, Kolev and Yang, "Improving AMG interpolation operators for linear elasticity problems" * so we first refine the current interpolation and then use it to add the local variant approach *NOTE: currently assumes that we have either 2 or 3 orig functions (we assume that we are adding 1 dof for 2D and 3 dof for 3D) *MUST USE NODAL COARSENING! (and so unknowns interlaced) *note: changes num_functions and updates dof_array if level = 0 ******************************************************************************/ HYPRE_Int hypre_BoomerAMG_LNExpandInterp( hypre_ParCSRMatrix *A, hypre_ParCSRMatrix **P, HYPRE_BigInt *num_cpts_global, HYPRE_Int *nf, HYPRE_Int *dof_func, hypre_IntArray **coarse_dof_func, HYPRE_Int *CF_marker, HYPRE_Int level, HYPRE_Real *weights, HYPRE_Int num_smooth_vecs, hypre_ParVector **smooth_vecs, HYPRE_Real abs_trunc, HYPRE_Int q_max, HYPRE_Int interp_vec_first_level ) { HYPRE_Int i, j, k, kk, pp, jj; hypre_ParCSRMatrix *new_P; hypre_CSRMatrix *A_diag = hypre_ParCSRMatrixDiag(A); HYPRE_Real *A_diag_data = hypre_CSRMatrixData(A_diag); HYPRE_Int *A_diag_i = hypre_CSRMatrixI(A_diag); HYPRE_Int *A_diag_j = hypre_CSRMatrixJ(A_diag); hypre_CSRMatrix *A_offd = hypre_ParCSRMatrixOffd(A); HYPRE_Real *A_offd_data = hypre_CSRMatrixData(A_offd); HYPRE_Int *A_offd_i = hypre_CSRMatrixI(A_offd); HYPRE_Int *A_offd_j = hypre_CSRMatrixJ(A_offd); HYPRE_Int num_cols_A_offd = hypre_CSRMatrixNumCols(A_offd); hypre_CSRMatrix *P_diag = hypre_ParCSRMatrixDiag(*P); HYPRE_Real *P_diag_data = hypre_CSRMatrixData(P_diag); HYPRE_Int *P_diag_i = hypre_CSRMatrixI(P_diag); HYPRE_Int *P_diag_j = hypre_CSRMatrixJ(P_diag); HYPRE_Int num_rows_P = hypre_CSRMatrixNumRows(P_diag); HYPRE_Int num_cols_P = hypre_CSRMatrixNumCols(P_diag); HYPRE_Int P_diag_size = P_diag_i[num_rows_P]; hypre_CSRMatrix *P_offd = hypre_ParCSRMatrixOffd(*P); HYPRE_Int *P_offd_i = hypre_CSRMatrixI(P_offd); HYPRE_Int P_offd_size = P_offd_i[num_rows_P]; HYPRE_Real *P_offd_data = hypre_CSRMatrixData(P_offd); HYPRE_Int *P_offd_j = hypre_CSRMatrixJ(P_offd); HYPRE_Int num_cols_P_offd = hypre_CSRMatrixNumCols(P_offd); HYPRE_BigInt *col_map_offd_P = hypre_ParCSRMatrixColMapOffd(*P); HYPRE_BigInt *col_starts = hypre_ParCSRMatrixColStarts(*P); HYPRE_BigInt *new_col_map_offd_P = NULL; /* HYPRE_Real orig_row_sum, new_row_sum; */ HYPRE_Real gm_row_sum = 1.0; HYPRE_Int orig_diag_start, orig_offd_start, j_offd_pos, j_diag_pos; HYPRE_Int new_nnz_diag, new_nnz_offd; HYPRE_Int fcn_num, p_num_elements, p_num_diag_elements; HYPRE_Int p_num_offd_elements; HYPRE_Real *P_diag_data_new, *P_offd_data_new; HYPRE_Int *P_diag_j_new, *P_diag_i_new, *P_offd_i_new, *P_offd_j_new; HYPRE_BigInt *P_offd_j_big = NULL; HYPRE_Int ncv, ncv_peru; HYPRE_Int orig_nf, /*orig_ncv,*/ new_ncv; HYPRE_Int found, new_col, cur_col; HYPRE_BigInt big_new_col, big_cur_col, big_index, big_k; HYPRE_BigInt big_jj_point_c; HYPRE_Int num_functions = *nf; HYPRE_Real *smooth_vec_offd = NULL; HYPRE_Real *smooth_vec_offd_P = NULL; HYPRE_Real *offd_vec_data; HYPRE_Real *offd_vec_data_P; HYPRE_Int nnz_diag, nnz_offd; hypre_ParVector *vector; HYPRE_Real *vec_data; hypre_ParCSRCommPkg *comm_pkg_P = hypre_ParCSRMatrixCommPkg(*P); hypre_ParCSRCommPkg *comm_pkg_A = hypre_ParCSRMatrixCommPkg(A); MPI_Comm comm; HYPRE_Int coarse_counter; HYPRE_Int j_ext_index; HYPRE_Int *fine_to_coarse; HYPRE_Int kk_point, jj_point, jj_point_c, fine_kk, p_point; HYPRE_Real diagonal, aw, a_ij; HYPRE_Int modify; HYPRE_Int add_q; HYPRE_Int num_new_p_diag, num_new_p_offd; HYPRE_Int kk_count; HYPRE_Int cur_spot; HYPRE_Int i1; HYPRE_Int *c_dof_func = hypre_IntArrayData(*coarse_dof_func); HYPRE_Real q_val, tmp_d1, tmp_d2; HYPRE_Real adj[3], r_extra[3]; HYPRE_Int *col_map; HYPRE_Int *coarse_to_fine; HYPRE_BigInt new_col_starts[2]; HYPRE_Real af_sum; HYPRE_Real theta_2D[] = {.5, .5}; HYPRE_Real theta_3D[] = {1.0 / 3.0, 1.0 / 3.0, 1.0 / 3.0}; HYPRE_Real *theta; HYPRE_Real sum; HYPRE_Int no_fc; hypre_ParCSRCommHandle *comm_handle; HYPRE_Int use_alt_w; HYPRE_Int dist_coarse; HYPRE_Int *CF_marker_offd = NULL; HYPRE_Int *dof_func_offd = NULL; HYPRE_BigInt *fine_to_coarse_offd; hypre_CSRMatrix *P_ext = NULL; HYPRE_Real *P_ext_data = NULL; HYPRE_Int *P_ext_i = NULL; HYPRE_BigInt *P_ext_j = NULL; HYPRE_Int num_sends_A, index, start; HYPRE_Int myid = 0, num_procs = 1; /* truncation */ HYPRE_Int *is_q = NULL; HYPRE_Int q_alloc = 0; HYPRE_BigInt *aux_j = NULL; HYPRE_Real *aux_data = NULL; HYPRE_Int *is_diag = NULL; HYPRE_Int q_count, p_count_diag, p_count_offd; HYPRE_Int no_fc_use_gm; HYPRE_Int num_sends; HYPRE_Int loop_q_max; HYPRE_Int *int_buf_data = NULL; HYPRE_BigInt *big_buf_data = NULL; HYPRE_Real *dbl_buf_data = NULL; HYPRE_BigInt g_nc; HYPRE_MemoryLocation memory_location_P = hypre_ParCSRMatrixMemoryLocation(A); #if SV_DEBUG { char new_file[80]; hypre_sprintf(new_file, "%s.level.%d", "P_orig", level); hypre_ParCSRMatrixPrint(*P, new_file); for (i = 0; i < num_smooth_vecs; i++) { hypre_sprintf(new_file, "%s.%d.level.%d", "smoothvec", i, level ); hypre_ParVectorPrint(smooth_vecs[i], new_file); } } #endif /* must have a comm pkg */ if (!comm_pkg_P) { hypre_MatvecCommPkgCreate ( *P ); comm_pkg_P = hypre_ParCSRMatrixCommPkg(*P); } comm = hypre_ParCSRCommPkgComm(comm_pkg_A); hypre_MPI_Comm_size(comm, &num_procs); hypre_MPI_Comm_rank(comm, &myid); #if SV_DEBUG { char new_file[80]; hypre_CSRMatrix *P_CSR = NULL; hypre_Vector *sv = NULL; P_CSR = hypre_ParCSRMatrixToCSRMatrixAll(*P); if (!myid) { hypre_sprintf(new_file, "%s.level.%d", "P_new_orig", level ); if (P_CSR) { hypre_CSRMatrixPrint(P_CSR, new_file); } } hypre_CSRMatrixDestroy(P_CSR); for (i = 0; i < num_smooth_vecs; i++) { sv = hypre_ParVectorToVectorAll(smooth_vecs[i]); if (!myid) { hypre_sprintf(new_file, "%s.%d.level.%d", "smoothvec", i, level ); if (sv) { hypre_SeqVectorPrint(sv, new_file); } } hypre_SeqVectorDestroy(sv); } P_CSR = hypre_ParCSRMatrixToCSRMatrixAll(A); if (!myid) { hypre_sprintf(new_file, "%s.level.%d", "A", level ); if (P_CSR) { hypre_CSRMatrixPrint(P_CSR, new_file); } } hypre_CSRMatrixDestroy(P_CSR); } #endif /*initialize */ no_fc_use_gm = 1; /* use GM approach when no fine connections */ modify = 1; /* this indicates to replace P_s based on P_u and P_v */ ncv = num_cols_P; /* num coarse variables */ nnz_diag = P_diag_size; nnz_offd = P_offd_size; /*number of coarse variables for each unknown */ ncv_peru = ncv / num_functions; if (level == interp_vec_first_level) { orig_nf = num_functions; /*orig_ncv = ncv;*/ } else /* on deeper levels, need to know orig sizes (without new * dofs) */ { orig_nf = num_functions - num_smooth_vecs; /*orig_ncv = ncv - ncv_peru*num_smooth_vecs;*/ } /*weights for P_s */ if (modify) { if (weights == NULL) { if (orig_nf == 2) { theta = theta_2D; } else { theta = theta_3D; } } else { theta = weights; } } /* for communication */ num_sends_A = hypre_ParCSRCommPkgNumSends(comm_pkg_A); int_buf_data = hypre_CTAlloc(HYPRE_Int, hypre_ParCSRCommPkgSendMapStart(comm_pkg_A, num_sends_A), HYPRE_MEMORY_HOST); big_buf_data = hypre_CTAlloc(HYPRE_BigInt, hypre_ParCSRCommPkgSendMapStart(comm_pkg_A, num_sends_A), HYPRE_MEMORY_HOST); /*----------------------------------------------------------------------- * create and send and receive fine_to_coarse info. *-----------------------------------------------------------------------*/ { HYPRE_BigInt my_first_cpt; HYPRE_Int tmp_i; my_first_cpt = num_cpts_global[0]; /* create the fine to coarse and coarse to fine */ fine_to_coarse = hypre_CTAlloc(HYPRE_Int, num_rows_P, HYPRE_MEMORY_HOST); for (i = 0; i < num_rows_P; i++) { fine_to_coarse[i] = -1; } coarse_to_fine = hypre_CTAlloc(HYPRE_Int, ncv, HYPRE_MEMORY_HOST); coarse_counter = 0; for (i = 0; i < num_rows_P; i++) { if (CF_marker[i] >= 0) { fine_to_coarse[i] = coarse_counter; coarse_to_fine[coarse_counter] = i; coarse_counter++; } } /* now from other procs */ fine_to_coarse_offd = hypre_CTAlloc(HYPRE_BigInt, num_cols_A_offd, HYPRE_MEMORY_HOST); index = 0; for (i = 0; i < num_sends_A; i++) { start = hypre_ParCSRCommPkgSendMapStart(comm_pkg_A, i); for (j = start; j < hypre_ParCSRCommPkgSendMapStart(comm_pkg_A, i + 1); j++) { tmp_i = fine_to_coarse[hypre_ParCSRCommPkgSendMapElmt(comm_pkg_A, j)]; big_buf_data[index++] = (HYPRE_BigInt)tmp_i + my_first_cpt; /* makes it global*/ } } comm_handle = hypre_ParCSRCommHandleCreate(21, comm_pkg_A, big_buf_data, fine_to_coarse_offd); hypre_ParCSRCommHandleDestroy(comm_handle); } /* end fine to coarse {} */ /*------------------------------------------------------------------- * Get the CF_marker data for the off-processor columns of A *-------------------------------------------------------------------*/ { if (num_cols_A_offd) { CF_marker_offd = hypre_CTAlloc(HYPRE_Int, num_cols_A_offd, HYPRE_MEMORY_HOST); } if (num_functions > 1 && num_cols_A_offd) { dof_func_offd = hypre_CTAlloc(HYPRE_Int, num_cols_A_offd, HYPRE_MEMORY_HOST); } index = 0; for (i = 0; i < num_sends_A; i++) { start = hypre_ParCSRCommPkgSendMapStart(comm_pkg_A, i); for (j = start; j < hypre_ParCSRCommPkgSendMapStart(comm_pkg_A, i + 1); j++) { int_buf_data[index++] = CF_marker[hypre_ParCSRCommPkgSendMapElmt(comm_pkg_A, j)]; } } comm_handle = hypre_ParCSRCommHandleCreate(11, comm_pkg_A, int_buf_data, CF_marker_offd); hypre_ParCSRCommHandleDestroy(comm_handle); if (num_functions > 1) { index = 0; for (i = 0; i < num_sends_A; i++) { start = hypre_ParCSRCommPkgSendMapStart(comm_pkg_A, i); for (j = start; j < hypre_ParCSRCommPkgSendMapStart(comm_pkg_A, i + 1); j++) { int_buf_data[index++] = dof_func[hypre_ParCSRCommPkgSendMapElmt(comm_pkg_A, j)]; } } comm_handle = hypre_ParCSRCommHandleCreate(11, comm_pkg_A, int_buf_data, dof_func_offd); hypre_ParCSRCommHandleDestroy(comm_handle); } } /* end cf marker {} */ /*------------------------------------------------------------------- * Get the ghost rows of P *-------------------------------------------------------------------*/ { HYPRE_Int kc; HYPRE_BigInt col_1 = hypre_ParCSRMatrixFirstColDiag(*P); HYPRE_BigInt col_n = col_1 + (HYPRE_BigInt) hypre_CSRMatrixNumCols(P_diag); if (num_procs > 1) { /* need the rows of P on other processors associated with the offd cols of A */ P_ext = hypre_ParCSRMatrixExtractBExt(*P, A, 1); P_ext_i = hypre_CSRMatrixI(P_ext); P_ext_j = hypre_CSRMatrixBigJ(P_ext); P_ext_data = hypre_CSRMatrixData(P_ext); } index = 0; /* now check whether each col is in the diag of offd part of P)*/ for (i = 0; i < num_cols_A_offd; i++) { for (j = P_ext_i[i]; j < P_ext_i[i + 1]; j++) { big_k = P_ext_j[j]; /* is it in the diag ?*/ if (big_k >= col_1 && big_k < col_n) { P_ext_j[index] = big_k - col_1; /* make a local col number */ P_ext_data[index++] = P_ext_data[j]; } else { /* off diag entry */ kc = hypre_BigBinarySearch(col_map_offd_P, big_k, num_cols_P_offd); /* now this corresponds to the location in the col_map_offd ( so it is a local column number */ if (kc > -1) { P_ext_j[index] = (HYPRE_BigInt)(-kc - 1); /* make negative */ P_ext_data[index++] = P_ext_data[j]; } } } P_ext_i[i] = index; } for (i = num_cols_A_offd; i > 0; i--) { P_ext_i[i] = P_ext_i[i - 1]; } if (num_procs > 1) { P_ext_i[0] = 0; } } /* end of ghost rows */ /*------------------------------------------------------------------- * Allocations *-------------------------------------------------------------------*/ /* if level = first_level, we need to fix the col numbering to leave * space for the new unknowns */ col_map = hypre_CTAlloc(HYPRE_Int, ncv, HYPRE_MEMORY_HOST); if (num_smooth_vecs && level == interp_vec_first_level) { for (i = 0; i < ncv; i++) { /* map from old col number to new col number (leave spaces * for new unknowns to be interleaved */ col_map[i] = i + (i / num_functions) * num_smooth_vecs; } } else { for (i = 0; i < ncv; i++) { /* map from old col number to new col number */ col_map[i] = i; } } /* we will have the same sparsity in Q as in P */ new_nnz_diag = nnz_diag + nnz_diag * num_smooth_vecs; new_nnz_offd = nnz_offd + nnz_offd * num_smooth_vecs; /* new number of coarse variables */ if (level == interp_vec_first_level ) { new_ncv = ncv + ncv_peru * num_smooth_vecs; } else { new_ncv = ncv; /* unchanged on level > first_level */ } /* allocations */ P_diag_j_new = hypre_CTAlloc(HYPRE_Int, new_nnz_diag, memory_location_P); P_diag_data_new = hypre_CTAlloc(HYPRE_Real, new_nnz_diag, memory_location_P); P_diag_i_new = hypre_CTAlloc(HYPRE_Int, num_rows_P + 1, memory_location_P); P_offd_j_big = hypre_CTAlloc(HYPRE_BigInt, new_nnz_offd, HYPRE_MEMORY_HOST); P_offd_j_new = hypre_CTAlloc(HYPRE_Int, new_nnz_offd, memory_location_P); P_offd_data_new = hypre_CTAlloc(HYPRE_Real, new_nnz_offd, memory_location_P); P_offd_i_new = hypre_CTAlloc(HYPRE_Int, num_rows_P + 1, memory_location_P); P_diag_i_new[0] = P_diag_i[0]; P_offd_i_new[0] = P_offd_i[0]; /* doing truncation? if so, need some more allocations*/ if (q_max > 0 || abs_trunc > 0.0) { q_count = 0; for (i = 0; i < num_rows_P; i++) { p_num_elements = P_diag_i[i + 1] - P_diag_i[i]; p_num_elements += (P_offd_i[i + 1] - P_offd_i[i]); if (p_num_elements > q_count) { q_count = p_num_elements; } } q_alloc = q_count * (num_smooth_vecs + 1); is_q = hypre_CTAlloc(HYPRE_Int, q_alloc, HYPRE_MEMORY_HOST); aux_data = hypre_CTAlloc(HYPRE_Real, q_alloc, HYPRE_MEMORY_HOST); aux_j = hypre_CTAlloc(HYPRE_BigInt, q_alloc, HYPRE_MEMORY_HOST); is_diag = hypre_CTAlloc(HYPRE_Int, q_alloc, HYPRE_MEMORY_HOST); } /*------------------------------------------------------------------- * Get smooth vec components for the off-processor columns of A *-------------------------------------------------------------------*/ if (num_procs > 1) { HYPRE_Int fine_index; smooth_vec_offd = hypre_CTAlloc(HYPRE_Real, num_cols_A_offd * num_smooth_vecs, HYPRE_MEMORY_HOST); /* for now, do a seperate comm for each smooth vector */ for (k = 0; k < num_smooth_vecs; k++) { vector = smooth_vecs[k]; vec_data = hypre_VectorData(hypre_ParVectorLocalVector(vector)); dbl_buf_data = hypre_CTAlloc(HYPRE_Real, hypre_ParCSRCommPkgSendMapStart(comm_pkg_A, num_sends_A), HYPRE_MEMORY_HOST); /* point into smooth_vec_offd */ offd_vec_data = smooth_vec_offd + k * num_cols_A_offd; index = 0; for (i = 0; i < num_sends_A; i++) { start = hypre_ParCSRCommPkgSendMapStart(comm_pkg_A, i); for (j = start; j < hypre_ParCSRCommPkgSendMapStart(comm_pkg_A, i + 1); j++) { fine_index = hypre_ParCSRCommPkgSendMapElmt(comm_pkg_A, j); dbl_buf_data[index++] = vec_data[fine_index]; } } comm_handle = hypre_ParCSRCommHandleCreate(1, comm_pkg_A, dbl_buf_data, offd_vec_data); hypre_ParCSRCommHandleDestroy(comm_handle); hypre_TFree(dbl_buf_data, HYPRE_MEMORY_HOST); } /* end of smooth vecs */ }/*end num procs > 1 */ /*------------------------------------------------------------------- * Get smooth vec components for the off-processor columns of P * TO Do: would be less storage to get the offd coarse to fine * instead of this... *-------------------------------------------------------------------*/ if (num_procs > 1) { HYPRE_Int c_index, fine_index; smooth_vec_offd_P = hypre_CTAlloc(HYPRE_Real, num_cols_P_offd * num_smooth_vecs, HYPRE_MEMORY_HOST); /* for now, do a seperate comm for each smooth vector */ for (k = 0; k < num_smooth_vecs; k++) { vector = smooth_vecs[k]; vec_data = hypre_VectorData(hypre_ParVectorLocalVector(vector)); num_sends = hypre_ParCSRCommPkgNumSends(comm_pkg_P); dbl_buf_data = hypre_CTAlloc(HYPRE_Real, hypre_ParCSRCommPkgSendMapStart(comm_pkg_P, num_sends), HYPRE_MEMORY_HOST); /* point into smooth_vec_offd_P */ offd_vec_data_P = smooth_vec_offd_P + k * num_cols_P_offd; index = 0; for (i = 0; i < num_sends; i++) { start = hypre_ParCSRCommPkgSendMapStart(comm_pkg_P, i); for (j = start; j < hypre_ParCSRCommPkgSendMapStart(comm_pkg_P, i + 1); j++) { /* we need to do the coarse/fine conversion here */ c_index = hypre_ParCSRCommPkgSendMapElmt(comm_pkg_P, j); fine_index = coarse_to_fine[c_index]; dbl_buf_data[index++] = vec_data[fine_index]; } } comm_handle = hypre_ParCSRCommHandleCreate(1, comm_pkg_P, dbl_buf_data, offd_vec_data_P); hypre_ParCSRCommHandleDestroy(comm_handle); hypre_TFree(dbl_buf_data, HYPRE_MEMORY_HOST); } } /*end num procs > 1 */ /*------------------------------------------------------------------- * Main loop! *-------------------------------------------------------------------*/ /******** loop through rows - only operate on rows of original functions******/ j_diag_pos = 0; j_offd_pos = 0; orig_diag_start = 0; orig_offd_start = 0; for (i = 0; i < num_rows_P; i++) { /* orig_row_sum = 0.0; */ /* new_row_sum = 0.0; */ num_new_p_diag = 0; num_new_p_offd = 0; no_fc = 0; p_count_diag = 0;/* number of entries of p added */ p_count_offd = 0; q_count = 0; /* number of entries of q added */ for (j = 0; j < q_alloc; j++) { is_q[j] = 0; } fcn_num = (HYPRE_Int) hypre_fmod(i, num_functions); if (fcn_num != dof_func[i]) { hypre_error_w_msg(HYPRE_ERROR_GENERIC, "WARNING - ROWS incorrectly ordered in hypre_BoomerAMG_LNExpandInterp!\n"); } /* number of elements in row of p*/ p_num_diag_elements = P_diag_i[i + 1] - P_diag_i[i]; p_num_offd_elements = P_offd_i[i + 1] - P_offd_i[i]; num_new_p_diag = p_num_diag_elements; num_new_p_offd = p_num_offd_elements; orig_diag_start = P_diag_i[i]; orig_offd_start = P_offd_i[i]; /* if original function dofs? or a new one that we don't want * to modify*/ if (fcn_num < orig_nf || modify == 0 ) { /* for this row, will we add q entries ? */ if (fcn_num < orig_nf && num_smooth_vecs) { add_q = 1; } else { add_q = 0; } if (CF_marker[i] >= 0) /* row corres. to coarse point - just copy orig */ { /* diag elements */ for (j = 0; j < p_num_diag_elements; j++) { P_diag_data_new[j_diag_pos] = P_diag_data[orig_diag_start + j]; new_col = col_map[ P_diag_j[orig_diag_start + j]]; P_diag_j_new[j_diag_pos] = new_col; j_diag_pos++; p_count_diag++; } /* offd elements */ p_count_offd = p_count_diag; for (j = 0; j < p_num_offd_elements; j++) { P_offd_data_new[j_diag_pos] = P_offd_data[orig_offd_start + j]; /* note that even though we are copying, j needs to go back to regular numbering - will be compressed later when col_map_offd is generated*/ index = P_offd_j[orig_offd_start + j]; /* convert to the global col number using col_map_offd */ big_index = col_map_offd_P[index]; /*now adjust for the new dofs - since we are offd, can't * use col_map[index]*/ if (num_smooth_vecs && (level == interp_vec_first_level)) { big_new_col = big_index + (big_index / (HYPRE_BigInt)num_functions) * (HYPRE_BigInt)num_smooth_vecs; } else /* no adjustment */ { big_new_col = big_index; } P_offd_j_big[j_diag_pos] = big_new_col; j_offd_pos++; p_count_offd++; } } else /* row is for fine point - make new interpolation*/ { /* make orig entries zero and make space for the entries of q */ /* diag entries */ for (j = 0; j < p_num_diag_elements; j++) { /* orig_row_sum += P_diag_data[orig_diag_start + j]; */ P_diag_data_new[j_diag_pos] = 0.0; new_col = col_map[P_diag_j[orig_diag_start + j]]; P_diag_j_new[j_diag_pos] = new_col; j_diag_pos++; if (q_alloc) { is_q[p_count_diag] = 0; /* this entry is for orig p*/ } p_count_diag++; if (add_q) { cur_col = new_col; for (k = 0; k < num_smooth_vecs; k++) { new_col = cur_col + (orig_nf - fcn_num) + k; P_diag_j_new[j_diag_pos] = new_col; P_diag_data_new[j_diag_pos] = 0.0; j_diag_pos++; if (q_alloc) { is_q[p_count_diag] = k + 1; /* this entry is for smoothvec k*/ } num_new_p_diag++; q_count++; p_count_diag++; } } } /* offd */ p_count_offd = p_count_diag; /* for indexing into is_q*/ for (j = 0; j < p_num_offd_elements; j++) { /* orig_row_sum += P_offd_data[orig_offd_start + j]; */ P_offd_data_new[j_offd_pos] = 0.0; /* j needs to go back to regular numbering - will be compressed later when col_map_offd is generated*/ index = P_offd_j[orig_offd_start + j]; /* convert to the global col number using col_map_offd */ big_index = col_map_offd_P[index]; /*now adjust for the new dofs - since we are offd, can't * use col_map[index]*/ if (num_smooth_vecs && (level == interp_vec_first_level)) { big_new_col = big_index + (big_index / (HYPRE_BigInt) num_functions) * (HYPRE_BigInt)num_smooth_vecs; } else /* no adjustment */ { big_new_col = big_index; } P_offd_j_big[j_offd_pos] = big_new_col; j_offd_pos++; if (q_alloc) { is_q[p_count_offd] = 0; /* this entry is for orig p*/ } p_count_offd++; if (add_q) { big_cur_col = big_new_col; for (k = 0; k < num_smooth_vecs; k++) { big_new_col = big_cur_col + (HYPRE_BigInt)((orig_nf - fcn_num) + k); P_offd_j_big[j_offd_pos] = big_new_col; P_offd_data_new[j_offd_pos] = 0.0; j_offd_pos++; if (q_alloc) { is_q[p_count_offd] = k + 1; /* this entry is for smoothvec k*/ } num_new_p_offd++; q_count++; p_count_offd++; } } } /* find r for adjustment (this is r/sum(Af) as in eqn * (31) of paper )*/ for (k = 0; k < num_smooth_vecs; k++) { r_extra[k] = 0.0; } if (p_num_diag_elements || p_num_offd_elements) { for (k = 0; k < num_smooth_vecs; k++) { vector = smooth_vecs[k]; vec_data = hypre_VectorData(hypre_ParVectorLocalVector(vector)); for (jj = A_diag_i[i]; jj < A_diag_i[i + 1]; jj++) { i1 = A_diag_j[jj]; if (dof_func[i1] == fcn_num) { r_extra[k] += A_diag_data[jj] * vec_data[i1]; } } offd_vec_data = smooth_vec_offd + k * num_cols_A_offd; for (jj = A_offd_i[i]; jj < A_offd_i[i + 1]; jj++) { i1 = A_offd_j[jj]; if (dof_func_offd[i1] == fcn_num) { r_extra[k] += A_offd_data[jj] * offd_vec_data[i1]; } } } /*find sum(a_if) */ af_sum = 0.0; for (jj = A_diag_i[i] + 1; jj < A_diag_i[i + 1]; jj++) { i1 = A_diag_j[jj]; if (dof_func[i1] == fcn_num && CF_marker[i1] < 0) { af_sum += A_diag_data[jj]; } } for (jj = A_offd_i[i]; jj < A_offd_i[i + 1]; jj++) { i1 = A_offd_j[jj]; if (dof_func_offd[i1] == fcn_num && CF_marker_offd[i1] < 0) { af_sum += A_offd_data[jj]; } } if (af_sum != 0.0) { for (k = 0; k < num_smooth_vecs; k++) { adj[k] = r_extra[k] / af_sum; } } else /* there are no fine connections */ { no_fc = 1; } /* now we will use the adjustment later */ /* now if we have any coarse connections with no corresponding point in orig p, then these we have to distibute and treat as fine, basically*/ /* diag first */ for (jj = A_diag_i[i] + 1; jj < A_diag_i[i + 1]; jj++) { found = 0; jj_point = A_diag_j[jj]; /* fine index */ /* only want like unknowns */ if (fcn_num != dof_func[jj_point]) { continue; } /*only look at coarse connections */ if (CF_marker[jj_point] < 0) /*fine*/ { continue; } a_ij = A_diag_data[jj]; jj_point_c = fine_to_coarse[jj_point]; new_col = col_map[jj_point_c]; /* is there a P(i,j_c)? */ for (kk = P_diag_i_new[i]; kk < P_diag_i_new[i] + num_new_p_diag; kk ++) { if (P_diag_j_new[kk] == new_col) { found = 1; break; } } if (!found) /* this will be distributed and treated as an F point - so add to the sum) */ { af_sum += a_ij; if (af_sum != 0.0) { for (k = 0; k < num_smooth_vecs; k++) { adj[k] = r_extra[k] / af_sum; } } } } /* end diag loop */ /* now offd loop */ for (jj = A_offd_i[i]; jj < A_offd_i[i + 1]; jj++) { found = 0; jj_point = A_offd_j[jj]; /* fine index */ /* only want like unknowns */ if (fcn_num != dof_func_offd[jj_point]) { continue; } /*only look at coarse connections */ if (CF_marker_offd[jj_point] < 0) /*fine*/ { continue; } a_ij = A_offd_data[jj]; big_jj_point_c = fine_to_coarse_offd[jj_point]; /* now global num */ /* now need to adjust for new cols */ /* TO DO: VERIFY THIS! */ big_jj_point_c = big_jj_point_c + (big_jj_point_c / (HYPRE_BigInt)num_functions) * (HYPRE_BigInt)num_smooth_vecs; /* is there a P(i,jj_c)? */ for (kk = P_offd_i_new[i]; kk < P_offd_i_new[i] + num_new_p_offd; kk ++) { big_index = P_offd_j_big[kk]; /* global number */ /* and this index has been adjusted to make room for * new cols */ if (big_index == big_jj_point_c) { found = 1; break; } } if (!found) /* this will be distributed and treated as an F point - so add to the sum) */ { af_sum += a_ij; if (af_sum != 0.0) { for (k = 0; k < num_smooth_vecs; k++) { adj[k] = r_extra[k] / af_sum; } } } } /* end offd loop */ /* end of checking for coarse connections to treat as fine*/ if (no_fc)/* recheck in case there were weak coarse connections that will be treated as fine */ { if (af_sum != 0.0) { no_fc = 0; } } /* Need to use GM for this row? */ if (no_fc && add_q && no_fc_use_gm) { #if 0 hypre_printf("Warning - no fine connections to distribute in level = %d, i = %d\n", level, i); #endif /* need to get the row-sum - we will to the GM approach for these rows! (var 6 )*/ gm_row_sum = 0.0; for (j = 0; j < p_num_diag_elements; j++) { gm_row_sum += P_diag_data[orig_diag_start + j]; } for (j = 0; j < p_num_offd_elements; j++) { gm_row_sum += P_offd_data[orig_offd_start + j]; } if ( (p_num_diag_elements + p_num_offd_elements) && (hypre_abs(gm_row_sum) < 1e-15)) { gm_row_sum = 1.0; } } } /* end of looking over elements in this row: if( p_num_diag_elements || p_num_offd_element)*/ /* get diagonal of A */ diagonal = A_diag_data[A_diag_i[i]]; /*d_sign = 1; if (diagonal < 0) d_sign = -1;*/ /* FIRST LOOP OVER DIAG ELEMENTS */ /* loop over elements in row i of A (except diagonal)*/ for (jj = A_diag_i[i] + 1; jj < A_diag_i[i + 1]; jj++) { jj_point = A_diag_j[jj]; /* fine index */ /* only want like unknowns */ if (fcn_num != dof_func[jj_point]) { continue; } dist_coarse = 0; a_ij = A_diag_data[jj]; /* don't get rid of these 3/13 */ /* if (a_ij*d_sign > 0) continue;*/ found = 0; if (CF_marker[jj_point] >= 0) /*coarse*/ { jj_point_c = fine_to_coarse[jj_point]; new_col = col_map[jj_point_c]; /* find P(i,j_c) and put value there (there may not be an entry in P if this coarse connection was not a strong connection */ /* we are looping in the diag of this row, so we only * need to look in P_diag */ for (kk = P_diag_i_new[i]; kk < P_diag_i_new[i] + num_new_p_diag; kk ++) { if (P_diag_j_new[kk] == new_col) { P_diag_data_new[kk] += a_ij; found = 1; break; } } if (!found) { /*this is a weakly connected c-point - does not contribute - so no error*/ /*( hypre_printf("Error find j_point_c\n");*/ /*hypre_printf("dist coarse in i = %d\n", i);*/ dist_coarse = 1; } } else /*fine connection */ { use_alt_w = 0; sum = 0.0; /*loop over row of orig P for jj_point and get the sum of the connections to c-points of i ( need to do diag and offd) */ /* diag */ for (pp = P_diag_i[jj_point]; pp < P_diag_i[jj_point + 1]; pp++) { p_point = P_diag_j[pp];/* this is a coarse index */ /* is p_point in row i also ? */ for (kk = P_diag_i[i]; kk < P_diag_i[i + 1]; kk ++) { kk_point = P_diag_j[kk]; /* this is a coarse index */ if (p_point == kk_point) { /* add p_jk to sum */ sum += P_diag_data[pp]; break; } }/* end loop kk over row i */ } /* end diag (end loop pp over row jj_point) */ /* offd */ for (pp = P_offd_i[jj_point]; pp < P_offd_i[jj_point + 1]; pp++) { p_point = P_offd_j[pp];/* this is a coarse index */ /* is p_point in row i also ? check the offd part*/ for (kk = P_offd_i[i]; kk < P_offd_i[i + 1]; kk ++) { kk_point = P_offd_j[kk]; /* this is a coarse index */ if (p_point == kk_point) { /* add p_jk to sum */ sum += P_offd_data[pp]; break; } }/* end loop kk over row i */ } /* end offd */ if (hypre_abs(sum) < 1e-12) { sum = 1.0; use_alt_w = 1; } if (use_alt_w) { /* distribute a_ij equally among coarse points */ aw = a_ij / ( p_num_diag_elements + p_num_offd_elements); kk_count = 0; /* loop through row i of orig p*/ /* diag first */ for (kk = P_diag_i[i]; kk < P_diag_i[i + 1]; kk++) { kk_point = P_diag_j[kk]; /* this is a coarse index */ if (add_q) { cur_spot = P_diag_i_new[i] + kk_count * (num_smooth_vecs + 1); } else { cur_spot = P_diag_i_new[i] + kk_count; } P_diag_data_new[cur_spot] += aw; /*add q? */ if (add_q) { for (k = 0; k < num_smooth_vecs; k++) { /* point to the smooth vector */ vector = smooth_vecs[k]; vec_data = hypre_VectorData(hypre_ParVectorLocalVector(vector)); /* q_val = a_ij* w_jk*[s(j) - s(k)] */ fine_kk = coarse_to_fine[kk_point]; tmp_d1 = vec_data[jj_point] - adj[k]; tmp_d2 = vec_data[fine_kk]; q_val = aw * (tmp_d1 - tmp_d2); P_diag_data_new[cur_spot + k + 1] += q_val; } } kk_count++; } /* did each element of p_diag */ /* now do offd */ kk_count = 0; for (kk = P_offd_i[i]; kk < P_offd_i[i + 1]; kk++) { kk_point = P_offd_j[kk]; /* this is a coarse index */ if (add_q) { cur_spot = P_offd_i_new[i] + kk_count * (num_smooth_vecs + 1); } else { cur_spot = P_offd_i_new[i] + kk_count; } P_offd_data_new[cur_spot] += aw; /*add q? */ if (add_q) { for (k = 0; k < num_smooth_vecs; k++) { /* point to the smooth vector */ vector = smooth_vecs[k]; vec_data = hypre_VectorData(hypre_ParVectorLocalVector(vector)); /* alias the offd smooth vector */ offd_vec_data_P = smooth_vec_offd_P + k * num_cols_P_offd; /* q_val = a_ij* w_jk*[s(j) - s(k)] */ /* jj point is a fine index from Adiag . but kk is a coarse index from P- needs the coarse offd data */ tmp_d1 = vec_data[jj_point] - adj[k]; tmp_d2 = offd_vec_data_P[kk_point]; q_val = aw * (tmp_d1 - tmp_d2); P_offd_data_new[cur_spot + k + 1] += q_val; } } kk_count++; } /* end of offd */ continue; /* to go to next jj of A */ }/* end of alt w */ /* Now we need to do the distributing (THIS COULD BE CODED MORE EFFICIENTLY (like classical interp )*/ /* loop through row i (diag and off d) of orig p*/ /* first the diag part */ kk_count = 0; for (kk = P_diag_i[i]; kk < P_diag_i[i + 1]; kk++) { kk_point = P_diag_j[kk]; /* this is a coarse index */ /* now is there an entry for P(jj_point, kk_point)? - need to look through row j_point (on -proc since j came from A_diag */ found = 0; for (pp = P_diag_i[jj_point]; pp < P_diag_i[jj_point + 1]; pp++) { if (P_diag_j[pp] == kk_point) { found = 1; /* a_ij*w_jk */ aw = a_ij * P_diag_data[pp]; aw = aw / sum; /* loc in new P */ if (add_q) { cur_spot = P_diag_i_new[i] + kk_count * (num_smooth_vecs + 1); } else { cur_spot = P_diag_i_new[i] + kk_count; } /* P_diag_data_new[k] += aw; */ P_diag_data_new[cur_spot] += aw; /*add q? */ if (add_q) { for (k = 0; k < num_smooth_vecs; k++) { /* point to the smooth vector */ vector = smooth_vecs[k]; vec_data = hypre_VectorData(hypre_ParVectorLocalVector(vector)); /* q_val = a_ij* w_jk*[s(j) - s(k)] */ fine_kk = coarse_to_fine[kk_point]; tmp_d1 = vec_data[jj_point] - adj[k]; tmp_d2 = vec_data[fine_kk]; q_val = aw * (tmp_d1 - tmp_d2); P_diag_data_new[cur_spot + k + 1] += q_val; } } break; } } /* end loop pp over row jj_point */ /* if found = 0, do somthing with weight? */ kk_count++; } /* end loop kk over row i of Pdiag */ /* now do the offd part */ kk_count = 0; for (kk = P_offd_i[i]; kk < P_offd_i[i + 1]; kk++) { kk_point = P_offd_j[kk]; /* this is a coarse index */ found = 0; for (pp = P_offd_i[jj_point]; pp < P_offd_i[jj_point + 1]; pp++) { if (P_offd_j[pp] == kk_point) { found = 1; /* a_ij*w_jk */ aw = a_ij * P_offd_data[pp]; aw = aw / sum; /* loc in new P */ if (add_q) { cur_spot = P_offd_i_new[i] + kk_count * (num_smooth_vecs + 1); } else { cur_spot = P_offd_i_new[i] + kk_count; } P_offd_data_new[cur_spot] += aw; if (add_q) { for (k = 0; k < num_smooth_vecs; k++) { /* point to the smooth vector */ vector = smooth_vecs[k]; vec_data = hypre_VectorData(hypre_ParVectorLocalVector(vector)); /* alias the offd smooth vector */ offd_vec_data_P = smooth_vec_offd_P + k * num_cols_P_offd; /* jj_point is a fine index and kk_point is a coarse index that is offd */ /* q_val = a_ij* w_jk*[s(j) - s(k)] */ tmp_d1 = vec_data[jj_point] - adj[k]; /* jj point is in diag */ tmp_d2 = offd_vec_data_P[kk_point]; q_val = aw * (tmp_d1 - tmp_d2); P_offd_data_new[cur_spot + k + 1] += q_val; } }/* end of add_q */ break; } }/* end of pp loop */ kk_count++; }/* end loop kk over offd part */ } /* end of if fine connection in row of A*/ if (dist_coarse) { /* coarse not in orig interp (weakly connected) */ /* distribute a_ij equally among coarse points */ aw = a_ij / (p_num_diag_elements + p_num_offd_elements); kk_count = 0; /* loop through row i of orig p (diag and offd)*/ /* diag */ for (kk = P_diag_i[i]; kk < P_diag_i[i + 1]; kk++) { kk_point = P_diag_j[kk]; /* this is a coarse index */ if (add_q) { cur_spot = P_diag_i_new[i] + kk_count * (num_smooth_vecs + 1); } else { cur_spot = P_diag_i_new[i] + kk_count; } P_diag_data_new[cur_spot] += aw; /*add q? */ if (add_q) { for (k = 0; k < num_smooth_vecs; k++) { /* point to the smooth vector */ vector = smooth_vecs[k]; vec_data = hypre_VectorData(hypre_ParVectorLocalVector(vector)); /* q_val = a_ij* w_jk*[s(j) - s(k)] */ fine_kk = coarse_to_fine[kk_point]; tmp_d1 = vec_data[jj_point] - adj[k]; tmp_d2 = vec_data[fine_kk]; q_val = aw * (tmp_d1 - tmp_d2); P_diag_data_new[cur_spot + k + 1] += q_val; } } kk_count++; } /* did each diag element of p */ /* now off diag */ kk_count = 0; for (kk = P_offd_i[i]; kk < P_offd_i[i + 1]; kk++) { kk_point = P_offd_j[kk]; /* this is a coarse index */ if (add_q) { cur_spot = P_offd_i_new[i] + kk_count * (num_smooth_vecs + 1); } else { cur_spot = P_offd_i_new[i] + kk_count; } P_offd_data_new[cur_spot] += aw; /*add q? */ if (add_q) { for (k = 0; k < num_smooth_vecs; k++) { /* point to the smooth vector */ vector = smooth_vecs[k]; vec_data = hypre_VectorData(hypre_ParVectorLocalVector(vector)); /* alias the offd smooth vector */ offd_vec_data_P = smooth_vec_offd_P + k * num_cols_P_offd; /* q_val = a_ij* w_jk*[s(j) - s(k)] */ /* jj point is a fine index of Adiag, but kk is a coarse index - needs the coarse offd data */ tmp_d1 = vec_data[jj_point] - adj[k]; tmp_d2 = offd_vec_data_P[kk_point]; q_val = aw * (tmp_d1 - tmp_d2); P_offd_data_new[cur_spot + k + 1] += q_val; } } kk_count++; }/* did each off diag element of p */ }/* end of dist_coarse */ }/* end loop jj over row i (diag part) of A */ /* Still looping over ith row of A - NOW LOOP OVER OFFD! */ for (jj = A_offd_i[i]; jj < A_offd_i[i + 1]; jj++) { jj_point = A_offd_j[jj]; /* fine index */ /* only want like unknowns */ if (fcn_num != dof_func_offd[jj_point]) { continue; } dist_coarse = 0; a_ij = A_offd_data[jj]; found = 0; if (CF_marker_offd[jj_point] >= 0) /*check the offd marker */ { /*coarse*/ big_jj_point_c = fine_to_coarse_offd[jj_point]; /* now its global!! */ /* CHECK THIS - changed on 11/24!! */ /* find P(i,j_c) and put value there (there may not be an entry in P if this coarse connection was not a strong connection */ /* we are looping in the off diag of this row, so we only * need to look in P_offd - look in orig P*/ for (kk = P_offd_i[i]; kk < P_offd_i[i + 1]; kk ++) { index = P_offd_j[kk]; /* local number */ big_index = col_map_offd_P[index]; /*make a global number becuz jj_point_c is global */ if (big_index == big_jj_point_c) { /* convert jj_point_c (global) to a new col that takes * into account the new unknowns*/ if (num_smooth_vecs && (level == interp_vec_first_level)) { big_new_col = big_jj_point_c + (big_jj_point_c / (HYPRE_BigInt)num_functions) * (HYPRE_BigInt)num_smooth_vecs; } else /* no adjustment */ { big_new_col = big_jj_point_c; } /* now figure out where to add in P_new */ for (pp = P_offd_i_new[i]; pp < P_offd_i_new[i] + num_new_p_offd; pp ++) { big_index = P_offd_j_big[pp]; /* these are global - haven't done col map yet */ if (big_index == big_new_col) { P_offd_data_new[pp] += a_ij; found = 1; break; /* from pp loop */ } } break; /* from kk loop */ } } if (!found) { /*this is a weakly connected c-point - does not contribute - so no error - but this messes up row sum*/ /* we need to distribute this */ dist_coarse = 1; } }/* end of coarse */ else /*fine connection */ { use_alt_w = 0; sum = 0.0; /*loop over row of P for j_point and get the sum of the connections to c-points of i (diag and offd) - now the row for jj_point is on another processor - and jj_point is an index of Aoffd - need to convert it to corresponding index of P */ /* j_point is an index of A_off d - so */ /* now this is the row in P, but these are stored in P_ext according to offd of A */ j_ext_index = jj_point; for (pp = P_ext_i[j_ext_index]; pp < P_ext_i[j_ext_index + 1]; pp++) { p_point = (HYPRE_Int)P_ext_j[pp];/* this is a coarse index */ /* is p_point in row i also ? check the diag of offd part*/ if (p_point > -1) /* in diag part */ { for (kk = P_diag_i[i]; kk < P_diag_i[i + 1]; kk++) { kk_point = P_diag_j[kk]; /* this is a coarse index */ if (p_point == kk_point) { /* add p_jk to sum */ sum += P_ext_data[pp]; break; } }/* end loop kk over row i */ } else /* in offd diag part */ { p_point = -p_point - 1; /* p_point is a local col number for P now */ for (kk = P_offd_i[i]; kk < P_offd_i[i + 1]; kk ++) { kk_point = P_offd_j[kk]; /* this is a coarse index */ if (p_point == kk_point) { /* add p_jk to sum */ sum += P_ext_data[pp]; break; } }/* end loop k over row i */ }/* end if diag or offd */ }/* end loop over pp for j_ext_index */ if (hypre_abs(sum) < 1e-12) { sum = 1.0; use_alt_w = 1; } if (use_alt_w) { /* distribute a_ij equally among coarse points */ aw = a_ij / ( p_num_diag_elements + p_num_offd_elements); kk_count = 0; /* loop through row i of orig p*/ /* diag first */ for (kk = P_diag_i[i]; kk < P_diag_i[i + 1]; kk++) { kk_point = P_diag_j[kk]; /* this is a coarse index */ if (add_q) { cur_spot = P_diag_i_new[i] + kk_count * (num_smooth_vecs + 1); } else { cur_spot = P_diag_i_new[i] + kk_count; } P_diag_data_new[cur_spot] += aw; /*add q? */ if (add_q) { for (k = 0; k < num_smooth_vecs; k++) { /* point to the smooth vector */ vector = smooth_vecs[k]; vec_data = hypre_VectorData(hypre_ParVectorLocalVector(vector)); offd_vec_data = smooth_vec_offd + k * num_cols_A_offd; /* q_val = a_ij* w_jk*[s(j) - s(k)] */ fine_kk = coarse_to_fine[kk_point]; /** kk point is a diag index */ tmp_d1 = offd_vec_data[jj_point] - adj[k]; /* jj_point is an offd index */ tmp_d2 = vec_data[fine_kk]; q_val = aw * (tmp_d1 - tmp_d2); P_diag_data_new[cur_spot + k + 1] += q_val; } } kk_count++; } /* did each element of p_diag */ /* now do offd */ kk_count = 0; for (kk = P_offd_i[i]; kk < P_offd_i[i + 1]; kk++) { kk_point = P_offd_j[kk]; /* this is a coarse index */ if (add_q) { cur_spot = P_offd_i_new[i] + kk_count * (num_smooth_vecs + 1); } else { cur_spot = P_offd_i_new[i] + kk_count; } P_offd_data_new[cur_spot] += aw; /*add q? */ if (add_q) { for (k = 0; k < num_smooth_vecs; k++) { /* alias the offd smooth vector */ offd_vec_data = smooth_vec_offd + k * num_cols_A_offd; offd_vec_data_P = smooth_vec_offd_P + k * num_cols_P_offd; /* q_val = a_ij* w_jk*[s(j) - s(k)] */ /* jj point is a fine index, so that can index into offd_vec_data. but kk is a coarse index - needs the coarse offd data */ tmp_d1 = offd_vec_data[jj_point] - adj[k]; tmp_d2 = offd_vec_data_P[kk_point]; q_val = aw * (tmp_d1 - tmp_d2); P_offd_data_new[cur_spot + k + 1] += q_val; } } kk_count++; } /* end of offd */ continue; /* to go to next jj of A */ }/* end of alt w */ /* Now we need to do the distributing */ /* loop through row i (diag and off d) of orig p*/ /* first the diag part */ kk_count = 0; for (kk = P_diag_i[i]; kk < P_diag_i[i + 1]; kk++) { kk_point = P_diag_j[kk]; /* this is a coarse index */ /* now is there an entry for P(jj_point, kk_point)? - need to look through row jj_point (now off-proc since jj came from A_offd */ found = 0; for (pp = P_ext_i[j_ext_index]; pp < P_ext_i[j_ext_index + 1]; pp++) { p_point = (HYPRE_Int) P_ext_j[pp]; if (p_point > -1) /* diag part */ { if (p_point == kk_point) { found = 1; /* a_ij*w_jk */ aw = a_ij * P_ext_data[pp]; aw = aw / sum; /* loc in new P */ if (add_q) { cur_spot = P_diag_i_new[i] + kk_count * (num_smooth_vecs + 1); } else { cur_spot = P_diag_i_new[i] + kk_count; } /* P_diag_data_new[k] += aw; */ P_diag_data_new[cur_spot] += aw; /*add q? */ if (add_q) { for (k = 0; k < num_smooth_vecs; k++) { /* point to the smooth vector */ vector = smooth_vecs[k]; vec_data = hypre_VectorData(hypre_ParVectorLocalVector(vector)); offd_vec_data = smooth_vec_offd + k * num_cols_A_offd; /* q_val = a_ij* w_jk*[s(j) - s(k)] */ fine_kk = coarse_to_fine[kk_point]; /** kk point is a diag index */ tmp_d1 = offd_vec_data[jj_point] - adj[k];/* jj_point is an offd index */ tmp_d2 = vec_data[fine_kk]; q_val = aw * (tmp_d1 - tmp_d2); P_diag_data_new[cur_spot + k + 1] += q_val; } }/* end addq */ break; } /* end point found */ } /* in diag part */ } /* end loop pp over P_ext_i[jj_point]*/ kk_count++; } /* end loop kk over row i of Pdiag */ /* now do the offd part */ kk_count = 0; for (kk = P_offd_i[i]; kk < P_offd_i[i + 1]; kk++) { kk_point = P_offd_j[kk]; /* this is a coarse index */ found = 0; /* now is there an entry for P(jj_point, kk_point)? - need to look through row j_point (on offproc since jj came from A_offd */ for (pp = P_ext_i[j_ext_index]; pp < P_ext_i[j_ext_index + 1]; pp++) { p_point = (HYPRE_Int)P_ext_j[pp]; if (p_point < 0) /* in offd part */ { p_point = - p_point - 1; /* fix index */ if (p_point == kk_point) { found = 1; /* a_ij*w_jk */ aw = a_ij * P_ext_data[pp]; aw = aw / sum; /* loc in new P */ if (add_q) { cur_spot = P_offd_i_new[i] + kk_count * (num_smooth_vecs + 1); } else { cur_spot = P_offd_i_new[i] + kk_count; } P_offd_data_new[cur_spot] += aw; if (add_q) { for (k = 0; k < num_smooth_vecs; k++) { /* alias the offd smooth vector */ offd_vec_data = smooth_vec_offd + k * num_cols_A_offd; offd_vec_data_P = smooth_vec_offd_P + k * num_cols_P_offd; /* jj_point is a fine index and kk_point is a coarse index */ /* q_val = a_ij* w_jk*[s(j) - s(k)] */ tmp_d1 = offd_vec_data[jj_point] - adj[k]; tmp_d2 = offd_vec_data_P[kk_point]; q_val = aw * (tmp_d1 - tmp_d2); P_offd_data_new[cur_spot + k + 1] += q_val; } }/* end of add_q */ break; } /* end of found */ } /* end of in offd */ }/* end of pp loop */ kk_count++; }/* end loop kk over offd part */ }/* end of of if fine connection in offd row of A */ if (dist_coarse) { /* coarse not in orig interp (weakly connected) */ /* distribute a_ij equally among coarse points */ aw = a_ij / (p_num_diag_elements + p_num_offd_elements); kk_count = 0; /* loop through row i of orig p (diag and offd)*/ /* diag */ for (kk = P_diag_i[i]; kk < P_diag_i[i + 1]; kk++) { kk_point = P_diag_j[kk]; /* this is a coarse index */ if (add_q) { cur_spot = P_diag_i_new[i] + kk_count * (num_smooth_vecs + 1); } else { cur_spot = P_diag_i_new[i] + kk_count; } P_diag_data_new[cur_spot] += aw; /*add q? */ if (add_q) { for (k = 0; k < num_smooth_vecs; k++) { /* point to the smooth vector */ vector = smooth_vecs[k]; vec_data = hypre_VectorData(hypre_ParVectorLocalVector(vector)); offd_vec_data = smooth_vec_offd + k * num_cols_A_offd; /* q_val = a_ij* w_jk*[s(j) - s(k)] */ fine_kk = coarse_to_fine[kk_point];/** kk point is a diag index */ tmp_d1 = offd_vec_data[jj_point] - adj[k];/* jj_point is an offd index */ tmp_d2 = vec_data[fine_kk]; q_val = aw * (tmp_d1 - tmp_d2); P_diag_data_new[cur_spot + k + 1] += q_val; } } kk_count++; } /* did each diag element of p */ /* now off-diag */ kk_count = 0; for (kk = P_offd_i[i]; kk < P_offd_i[i + 1]; kk++) { kk_point = P_offd_j[kk]; /* this is a coarse index */ if (add_q) { cur_spot = P_offd_i_new[i] + kk_count * (num_smooth_vecs + 1); } else { cur_spot = P_offd_i_new[i] + kk_count; } P_offd_data_new[cur_spot] += aw; /*add q? */ if (add_q) { for (k = 0; k < num_smooth_vecs; k++) { /* alias the offd smooth vector */ offd_vec_data = smooth_vec_offd + k * num_cols_A_offd; offd_vec_data_P = smooth_vec_offd_P + k * num_cols_P_offd; /* q_val = a_ij* w_jk*[s(j) - s(k)] */ /* jj point is a fine index, so that can index into offd_vec_data. but kk is a coarse index - needs the coarse offd data */ tmp_d1 = offd_vec_data[jj_point] - adj[k]; tmp_d2 = offd_vec_data_P[kk_point]; q_val = aw * (tmp_d1 - tmp_d2); P_offd_data_new[cur_spot + k + 1] += q_val; } } kk_count++; }/* did each off-diag element of p */ }/* end of dist_coarse */ } /* end of jj loop over offd of A */ /* now divide by the diagonal and we are finished with this row!*/ if (hypre_abs(diagonal) > 0.0) { for (kk = P_diag_i_new[i] ; kk < P_diag_i_new[i] + num_new_p_diag; kk++) { P_diag_data_new[kk] /= -(diagonal); /* want new_row_sum only to be orig p elements (not q) */ new_col = P_diag_j_new[kk]; if (level == interp_vec_first_level) { fcn_num = (HYPRE_Int) hypre_fmod(new_col, num_functions + num_smooth_vecs); } else { fcn_num = (HYPRE_Int) hypre_fmod(new_col, num_functions); } /* if (fcn_num < orig_nf) */ /* { */ /* new_row_sum += P_diag_data_new[kk]; */ /* } */ } for (kk = P_offd_i_new[i] ; kk < P_offd_i_new[i] + num_new_p_offd; kk++) { P_offd_data_new[kk] /= -(diagonal); /* want new_row_sum only to be orig p elements (not q) */ big_new_col = P_offd_j_big[kk]; if (level == interp_vec_first_level) { fcn_num = (HYPRE_Int) hypre_fmod((HYPRE_Real)big_new_col, num_functions + num_smooth_vecs); } else { fcn_num = (HYPRE_Int) hypre_fmod((HYPRE_Real)big_new_col, num_functions); } /* if (fcn_num < orig_nf) */ /* { */ /* new_row_sum += P_offd_data_new[kk]; */ /* } */ } } /* if we had no fc, then the Q entries are zero - let's do * the GM approach instead for this row*/ if (no_fc && add_q && no_fc_use_gm) { HYPRE_Int c_col, num_f; HYPRE_Real value; /* DIAG */ for (kk = P_diag_i_new[i] ; kk < P_diag_i_new[i] + num_new_p_diag; kk++) { new_col = P_diag_j_new[kk]; if (level == interp_vec_first_level) { num_f = num_functions + num_smooth_vecs; } else { num_f = num_functions; } fcn_num = (HYPRE_Int) hypre_fmod(new_col, num_f); if (fcn_num < orig_nf) { /* get the old col number back to index into vector */ if (level == interp_vec_first_level ) { c_col = new_col - (HYPRE_Int) hypre_floor((HYPRE_Real) new_col / (HYPRE_Real) num_f); } else { c_col = new_col; } c_col = coarse_to_fine[c_col]; for (k = 0; k < num_smooth_vecs; k++) { /* point to the smooth vector */ vector = smooth_vecs[k]; vec_data = hypre_VectorData(hypre_ParVectorLocalVector(vector)); /*dt = P_diag_data_new[kk]; dt = (vec_data[i]/gm_row_sum - vec_data[c_col]);*/ value = P_diag_data_new[kk] * (vec_data[i] / gm_row_sum - vec_data[c_col]); P_diag_data_new[kk + k + 1] = value; } } } /* OFFD */ for (kk = P_offd_i_new[i] ; kk < P_offd_i_new[i] + num_new_p_offd; kk++) { big_new_col = P_offd_j_big[kk]; if (level == interp_vec_first_level) { num_f = num_functions + num_smooth_vecs; } else { num_f = num_functions; } fcn_num = (HYPRE_Int) hypre_fmod((HYPRE_Real)big_new_col, num_f); if (fcn_num < orig_nf) { if (level == interp_vec_first_level ) /* get the old col number back to index into vector */ { c_col = (HYPRE_Int)((HYPRE_Int) big_new_col - hypre_floor((HYPRE_Real) big_new_col / (HYPRE_Real) num_f)); } else { c_col = (HYPRE_Int) big_new_col; } for (k = 0; k < num_smooth_vecs; k++) { vector = smooth_vecs[k]; vec_data = hypre_VectorData(hypre_ParVectorLocalVector(vector)); /* alias the offd smooth vector */ offd_vec_data_P = smooth_vec_offd_P + k * num_cols_P_offd; /*dt = P_offd_data_new[kk]; dt = (vec_data[i]/gm_row_sum - offd_vec_data_P[c_col]);*/ value = P_offd_data_new[kk] * (vec_data[i] / gm_row_sum - offd_vec_data_P[c_col]); P_offd_data_new[kk + k + 1] = value; } } } } /* end no_Fc - do GM interpolation*/ } /* end of row of P is fine point - build interp */ } else /* Modify new dofs */ { /* coarse points - just copy */ if (CF_marker[i] >= 0) /* row corres. to coarse point - just copy orig */ { /* diag */ for (j = 0; j < p_num_diag_elements; j++) { P_diag_data_new[j_diag_pos] = P_diag_data[orig_diag_start + j]; new_col = col_map[ P_diag_j[orig_diag_start + j]]; P_diag_j_new[j_diag_pos] = new_col; j_diag_pos++; p_count_diag++; } /* offd elements */ p_count_offd = p_count_diag; for (j = 0; j < p_num_offd_elements; j++) { P_offd_data_new[j_offd_pos] = P_offd_data[orig_offd_start + j]; /* note that even though we are copying, j needs to go back to regular numbering - will be compressed later when col_map_offd is generated*/ index = P_offd_j[orig_offd_start + j]; /* convert to the global col number using col_map_offd */ big_index = col_map_offd_P[index]; /*now adjust for the new dofs - since we are offd, can't * use col_map[index]*/ if (num_smooth_vecs && (level == interp_vec_first_level)) { big_new_col = big_index + (big_index / (HYPRE_BigInt)num_functions) * (HYPRE_BigInt)num_smooth_vecs; } else /* no adjustment */ { big_new_col = big_index; } P_offd_j_big[j_offd_pos] = big_new_col; j_offd_pos++; p_count_offd++; } } else /* row is for fine point - modify exisiting * interpolation corresponding to the new dof - * * for 2D make it (P_u + P_v)/2....I'll use the original P values*/ { HYPRE_Int m, m_pos; HYPRE_Real m_val; /* replace each element of P*/ /* DIAG */ for (j = 0; j < p_num_diag_elements; j++) { m_val = 0.0; for (m = 0; m < orig_nf; m++) { m_pos = P_diag_i[i - (fcn_num - m)] + j; /* recall - nodal coarsening */ m_val += theta[m] * P_diag_data[m_pos]; } P_diag_j_new[j_diag_pos] = P_diag_j[orig_diag_start + j]; P_diag_data_new[j_diag_pos] = m_val; j_diag_pos++; p_count_diag++; } /* OFF-DIAG */ p_count_offd = p_count_diag; for (j = 0; j < p_num_offd_elements; j++) { m_val = 0.0; for (m = 0; m < orig_nf; m++) { m_pos = P_offd_i[i - (fcn_num - m)] + j; /* recall - nodal coarsening */ m_val += theta[m] * P_offd_data[m_pos]; } index = P_offd_j[orig_offd_start + j]; /* convert to the global col number using col_map_offd */ big_index = col_map_offd_P[index]; P_offd_j_big[j_offd_pos] = big_index; P_offd_data_new[j_offd_pos++] = m_val; p_count_offd++; } } /* end fine */ }/*end of modify */ /* update i */ P_diag_i_new[i + 1] = P_diag_i_new[i] + num_new_p_diag; P_offd_i_new[i + 1] = P_offd_i_new[i] + num_new_p_offd; /* adjust p_count_offd to not include diag*/ p_count_offd = p_count_offd - p_count_diag; if (p_count_diag != num_new_p_diag) { hypre_error_w_msg(HYPRE_ERROR_GENERIC, "Error diag p_count in hypre_BoomerAMG_LNExpandInterp!\n"); } if (p_count_offd != num_new_p_offd) { hypre_error_w_msg(HYPRE_ERROR_GENERIC, "Error offd p_count in hypre_BoomerAMG_LNExpandInterp!\n"); } /* NOW TRUNCATE Q ?*/ if (add_q && q_count > 0 && (q_max > 0 || abs_trunc > 0.0)) { HYPRE_Real value, lost_value, q_dist_value = 0.0; HYPRE_Int q_count_k, num_lost, p_count_tot; HYPRE_Int lost_counter_diag, lost_counter_offd, j_counter; HYPRE_Int new_j_counter, new_diag_pos, new_offd_pos; //HYPRE_Int new_num_q; HYPRE_Int i_qmax, lost_counter_q; /* loop through the smooth vectors - we have to do the q with each smooth vec separately TO DO: re-write to not have this outter loop (like the GM interpolation.) I am not doing this now as we may change the LN truncation strategy entirely :) */ for (k = 0; k < num_smooth_vecs; k++) { q_count_k = 0; lost_value = 0.0; num_lost = 0; i_qmax = 0; /* first do absolute truncation */ if (abs_trunc > 0.0) { /* find out if any will be dropped */ j_counter = 0; /* diag loop */ for (j = P_diag_i_new[i]; j < P_diag_i_new[i] + p_count_diag; j++) { if (is_q[j_counter] == (k + 1)) { q_count_k++; value = hypre_abs(P_diag_data_new[j]); if (value < abs_trunc) { num_lost ++; lost_value += P_diag_data_new[j]; } } j_counter++; } /* offd loop - don't reset j_counter*/ for (j = P_offd_i_new[i]; j < P_offd_i_new[i] + p_count_offd; j++) { if (is_q[j_counter] == (k + 1)) { q_count_k++; value = hypre_abs(P_offd_data_new[j]); if (value < abs_trunc) { num_lost ++; lost_value += P_offd_data_new[j]; } } j_counter++; } /* now drop and adjust values of other entries in Q */ if (num_lost) { if ((q_count_k - num_lost) > 0) { q_dist_value = lost_value / (q_count_k - num_lost); } else { /* originall had this, but this makes it * imposssible to get low complexities */ /* i_qmax = 1; num_lost = 0; hypre_printf("Warning: dropping all of Q; level = %d, i = %d, num = %d\n", level, i, num_lost);*/ } } if (num_lost) { new_j_counter = 0; lost_counter_diag = 0; q_dist_value = 0.0; /* diag */ new_diag_pos = P_diag_i_new[i]; j_counter = 0; for (j = P_diag_i_new[i]; j < P_diag_i_new[i] + p_count_diag ; j++) { value = hypre_abs(P_diag_data_new[j]); if ( is_q[j_counter] == (k + 1) && (value < abs_trunc) ) { /* drop */ lost_counter_diag++; } else /* keep */ { /* for k, keep this q and add the q_dist (also copy the * orig. p and other q not corres to this * k) */ value = P_diag_data_new[j]; if (is_q[j_counter] == (k + 1)) { value += q_dist_value; } P_diag_data_new[new_diag_pos] = value; P_diag_j_new[new_diag_pos] = P_diag_j_new[j]; new_diag_pos++; is_q[new_j_counter] = is_q[j_counter]; new_j_counter++; } j_counter++; } /* end loop though j */ p_count_diag -= lost_counter_diag; j_diag_pos -= lost_counter_diag; /* offd */ lost_counter_offd = 0; new_offd_pos = P_offd_i_new[i]; for (j = P_offd_i_new[i]; j < P_offd_i_new[i] + p_count_offd ; j++) { value = hypre_abs(P_offd_data_new[j]); if ( is_q[j_counter] == (k + 1) && (value < abs_trunc) ) { /* drop */ lost_counter_offd++; } else /* keep */ { /* for k, keep this q and add the q_dist (also copy the * orig. p and other q not corres to this * k) */ value = P_offd_data_new[j]; if (is_q[j_counter] == (k + 1)) { value += q_dist_value; } P_offd_data_new[new_offd_pos] = value; P_offd_j_big[new_offd_pos] = P_offd_j_big[j]; new_offd_pos++; is_q[new_j_counter] = is_q[j_counter]; new_j_counter++; } j_counter++; } /* end loop though j */ p_count_offd -= lost_counter_offd; j_offd_pos -= lost_counter_offd; } /* end if num_lost */ } /* now max num elements truncation */ if (i_qmax) { loop_q_max = 1; /* not used currently */ } else { loop_q_max = q_max; } if (loop_q_max > 0) { /* copy all elements for the row and count the q's for * this smoothvec*/ q_count_k = 0; j_counter = 0; for (j = P_diag_i_new[i]; j < P_diag_i_new[i] + p_count_diag; j++) { if (is_q[j_counter] == (k + 1)) { q_count_k++; } aux_j[j_counter] = (HYPRE_BigInt)P_diag_j_new[j]; aux_data[j_counter] = P_diag_data_new[j]; is_diag[j_counter] = 1; j_counter++; } /* offd loop - don't reset j_counter*/ for (j = P_offd_i_new[i]; j < P_offd_i_new[i] + p_count_offd; j++) { if (is_q[j_counter] == (k + 1)) { q_count_k++; } aux_j[j_counter] = P_offd_j_big[j]; aux_data[j_counter] = P_offd_data_new[j]; is_diag[j_counter] = 0; j_counter++; } //new_num_q = q_count_k; num_lost = q_count_k - loop_q_max; if (num_lost > 0) { p_count_tot = p_count_diag + p_count_offd; /* only keep loop_q_max elements - get rid of smallest */ hypre_BigQsort4_abs(aux_data, aux_j, is_q, is_diag, 0, p_count_tot - 1); lost_value = 0.0; lost_counter_q = 0; lost_counter_diag = 0; lost_counter_offd = 0; j_counter = 0; new_diag_pos = P_diag_i_new[i]; new_offd_pos = P_offd_i_new[i]; new_j_counter = 0; /* have to do diag and offd together because of sorting*/ for (j = 0; j < p_count_tot; j++) { if ((is_q[j_counter] == (k + 1)) && (lost_counter_q < num_lost)) { /* drop */ lost_value += aux_data[j_counter]; lost_counter_q++; /* check whether this is diag or offd element */ if (is_diag[j]) { lost_counter_diag++; } else { lost_counter_offd++; } //new_num_q--; /* technically only need to do this the last time */ q_dist_value = lost_value / loop_q_max; } else { /* keep and add to the q values (copy q)*/ value = aux_data[j_counter]; if (is_q[j_counter] == (k + 1)) { value += q_dist_value; } if (is_diag[j]) { P_diag_data_new[new_diag_pos] = value; P_diag_j_new[new_diag_pos] = aux_j[j_counter]; new_diag_pos++; is_q[new_j_counter] = is_q[j_counter]; new_j_counter++; } else { P_offd_data_new[new_offd_pos] = value; P_offd_j_big[new_offd_pos] = aux_j[j]; new_offd_pos++; is_q[new_j_counter] = is_q[j]; new_j_counter++; } } j_counter++; }/* end element loop */ /* adjust p_count and j_pos */ p_count_diag -= lost_counter_diag; p_count_offd -= lost_counter_offd; j_diag_pos -= lost_counter_diag; j_offd_pos -= lost_counter_offd; } /* end num lost > 0 */ } /* end loop_q_max > 0 - element truncation */ } /* end of loop through smoothvecs */ P_diag_i_new[i + 1] = P_diag_i_new[i] + p_count_diag; P_offd_i_new[i + 1] = P_offd_i_new[i] + p_count_offd; } /* end of truncation*/ if (j_diag_pos != P_diag_i_new[i + 1]) { hypre_error_w_msg(HYPRE_ERROR_GENERIC, "Warning - diag Row Problem in hypre_BoomerAMG_LNExpandInterp!\n"); } if (j_offd_pos != P_offd_i_new[i + 1]) { hypre_error_w_msg(HYPRE_ERROR_GENERIC, "Warning - off-diag Row Problem in hypre_BoomerAMG_LNExpandInterp!\n"); } } /* end of MAIN LOOP i loop through rows of P*/ /* ***********************************************************/ /* Done looping through rows of P - NOW FINISH THINGS UP! */ /* if level = first_level , we need to update the number of funcs and the dof_func */ if (level == interp_vec_first_level) { HYPRE_Int new_nf; c_dof_func = hypre_TReAlloc_v2(c_dof_func, HYPRE_Int, hypre_IntArraySize(*coarse_dof_func), HYPRE_Int, new_ncv, hypre_IntArrayMemoryLocation(*coarse_dof_func)); cur_spot = 0; for (i = 0; i < ncv_peru; i++) { for (k = 0; k < num_functions + num_smooth_vecs; k++) { c_dof_func[cur_spot++] = k; } } /* return these values */ new_nf = num_functions + num_smooth_vecs; *nf = new_nf; hypre_IntArrayData(*coarse_dof_func) = c_dof_func; hypre_IntArraySize(*coarse_dof_func) = new_ncv; /* also we need to update the col starts and global num columns*/ /* assumes that unknowns are together on a procsessor with * nodal coarsening */ new_col_starts[0] = (col_starts[0] / (HYPRE_BigInt) num_functions) * (HYPRE_BigInt) new_nf; new_col_starts[1] = (col_starts[1] / (HYPRE_BigInt) num_functions) * (HYPRE_BigInt) new_nf; if (myid == (num_procs - 1)) { g_nc = new_col_starts[1]; } hypre_MPI_Bcast(&g_nc, 1, HYPRE_MPI_BIG_INT, num_procs - 1, comm); } else /* not first level */ { /* grab global num cols */ g_nc = hypre_ParCSRMatrixGlobalNumCols(*P); /* copy col starts */ new_col_starts[0] = col_starts[0]; new_col_starts[1] = col_starts[1]; } /* modify P - now P has more entries and possibly more cols */ new_P = hypre_ParCSRMatrixCreate(comm, hypre_ParCSRMatrixGlobalNumRows(A), g_nc, hypre_ParCSRMatrixColStarts(A), new_col_starts, 0, P_diag_i_new[num_rows_P], P_offd_i_new[num_rows_P]); P_diag = hypre_ParCSRMatrixDiag(new_P); hypre_CSRMatrixI(P_diag) = P_diag_i_new; hypre_CSRMatrixJ(P_diag) = P_diag_j_new; hypre_CSRMatrixData(P_diag) = P_diag_data_new; hypre_CSRMatrixNumNonzeros(P_diag) = P_diag_i_new[num_rows_P]; P_offd = hypre_ParCSRMatrixOffd(new_P); hypre_CSRMatrixData(P_offd) = P_offd_data_new; hypre_CSRMatrixI(P_offd) = P_offd_i_new; hypre_CSRMatrixJ(P_offd) = P_offd_j_new; /* If parallel we need to do the col map offd! */ if (num_procs > 1) { HYPRE_Int count; HYPRE_Int num_cols_P_offd = 0; HYPRE_Int P_offd_new_size = P_offd_i_new[num_rows_P]; if (P_offd_new_size) { HYPRE_BigInt *j_copy; /* check this */ new_col_map_offd_P = hypre_CTAlloc(HYPRE_BigInt, P_offd_new_size, HYPRE_MEMORY_HOST); /*first copy the j entries (these are GLOBAL numbers) */ j_copy = hypre_CTAlloc(HYPRE_BigInt, P_offd_new_size, HYPRE_MEMORY_HOST); for (i = 0; i < P_offd_new_size; i++) { j_copy[i] = P_offd_j_big[i]; } /* now sort them */ hypre_BigQsort0(j_copy, 0, P_offd_new_size - 1); /* now copy to col_map offd - but only each col once */ new_col_map_offd_P[0] = j_copy[0]; count = 0; for (i = 0; i < P_offd_new_size; i++) { if (j_copy[i] > new_col_map_offd_P[count]) { count++; new_col_map_offd_P[count] = j_copy[i]; } } num_cols_P_offd = count + 1; /* reset the j entries to be local */ for (i = 0; i < P_offd_new_size; i++) P_offd_j_new[i] = hypre_BigBinarySearch(new_col_map_offd_P, P_offd_j_big[i], num_cols_P_offd); hypre_TFree(j_copy, HYPRE_MEMORY_HOST); } hypre_ParCSRMatrixColMapOffd(new_P) = new_col_map_offd_P; hypre_CSRMatrixNumCols(P_offd) = num_cols_P_offd; } /* end col map stuff */ /* comm pkg */ hypre_MatvecCommPkgCreate ( new_P ); /*destroy old */ hypre_ParCSRMatrixDestroy(*P); /* RETURN: update P */ *P = new_P; #if SV_DEBUG { char new_file[80]; hypre_CSRMatrix *P_CSR; P_CSR = hypre_ParCSRMatrixToCSRMatrixAll(new_P); if (!myid) { hypre_sprintf(new_file, "%s.level.%d", "P_new_new", level ); if (P_CSR) { hypre_CSRMatrixPrint(P_CSR, new_file); } } hypre_CSRMatrixDestroy(P_CSR); } #endif /* clean */ hypre_TFree(coarse_to_fine, HYPRE_MEMORY_HOST); hypre_TFree(fine_to_coarse, HYPRE_MEMORY_HOST); hypre_TFree(fine_to_coarse_offd, HYPRE_MEMORY_HOST); hypre_TFree(smooth_vec_offd, HYPRE_MEMORY_HOST); hypre_TFree(CF_marker_offd, HYPRE_MEMORY_HOST); hypre_TFree(dof_func_offd, HYPRE_MEMORY_HOST); hypre_TFree(int_buf_data, HYPRE_MEMORY_HOST); hypre_TFree(big_buf_data, HYPRE_MEMORY_HOST); hypre_TFree(col_map, HYPRE_MEMORY_HOST); hypre_TFree(P_offd_j_big, HYPRE_MEMORY_HOST); hypre_TFree(smooth_vec_offd, HYPRE_MEMORY_HOST); hypre_TFree(smooth_vec_offd_P, HYPRE_MEMORY_HOST); hypre_CSRMatrixDestroy(P_ext); return hypre_error_flag; } hypre-2.33.0/src/parcsr_ls/par_sv_interp_lsfit.c000066400000000000000000000443611477326011500217430ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "_hypre_parcsr_ls.h" #include "Common.h" #include "_hypre_blas.h" #include "_hypre_lapack.h" #define ADJUST(a,b) (adjust_list[(a)*(num_functions-1)+(b)]) /****************************************************************************** * hypre_BoomerAMGFitInterpVectors * This routine for updating the interp operator to interpolate the supplied smooth vectors with a L.S. fitting. This code (varient 0) was used for the Baker, Kolev and Yang elasticity paper in section 3 to evaluate the least squares fitting methed proposed by Stuben in his talk (see paper for details). So this code is basically a post-processing step that performs the LS fit (the size and sparsity of P do not change). Note: truncation only works correctly for 1 processor - needs to just use the other truncation rouitne Variant = 0: do L.S. fit to existing interp weights (default) Variant = 1: extends the neighborhood to incl. other unknowns on the same node - ASSUMES A NODAL COARSENING, ASSUMES VARIABLES ORDERED GRID POINT, THEN UNKNOWN (e.g., u0, v0, u1, v1, etc. ), AND AT MOST 3 FCNS (NOTE: **only** works with 1 processor) This code is not compiled or accessible through hypre at this time (it was not particularly effective - compared to the LN and GM approaches), but is checked-in in case there is interest in the future. ******************************************************************************/ HYPRE_Int hypre_BoomerAMGFitInterpVectors( hypre_ParCSRMatrix *A, hypre_ParCSRMatrix **P, HYPRE_Int num_smooth_vecs, hypre_ParVector **smooth_vecs, hypre_ParVector **coarse_smooth_vecs, HYPRE_Real delta, HYPRE_Int num_functions, HYPRE_Int *dof_func, HYPRE_Int *CF_marker, HYPRE_Int max_elmts, HYPRE_Real trunc_factor, HYPRE_Int variant, HYPRE_Int level) { HYPRE_Int i, j, k; HYPRE_Int one_i = 1; HYPRE_Int info; HYPRE_Int coarse_index;; HYPRE_Int num_coarse_diag; HYPRE_Int num_coarse_offd; HYPRE_Int num_nonzeros = 0; HYPRE_Int coarse_point = 0; HYPRE_Int k_size; HYPRE_Int k_alloc; HYPRE_Int counter; HYPRE_Int *piv; HYPRE_Int tmp_int; HYPRE_Int num_sends; HYPRE_Real *alpha; HYPRE_Real *Beta; HYPRE_Real *w; HYPRE_Real *w_old; HYPRE_Real *B_s; HYPRE_Real tmp_double; HYPRE_Real one = 1.0; HYPRE_Real mone = -1.0;; HYPRE_Real *vec_data; hypre_CSRMatrix *P_diag = hypre_ParCSRMatrixDiag(*P); hypre_CSRMatrix *P_offd = hypre_ParCSRMatrixOffd(*P); HYPRE_Real *P_diag_data = hypre_CSRMatrixData(P_diag); HYPRE_Int *P_diag_i = hypre_CSRMatrixI(P_diag); HYPRE_Int *P_diag_j = hypre_CSRMatrixJ(P_diag); HYPRE_Real *P_offd_data = hypre_CSRMatrixData(P_offd); HYPRE_Int *P_offd_i = hypre_CSRMatrixI(P_offd); HYPRE_Int *P_offd_j = hypre_CSRMatrixJ(P_offd); HYPRE_Int num_rows_P = hypre_CSRMatrixNumRows(P_diag); HYPRE_Int P_diag_size = P_diag_i[num_rows_P]; HYPRE_Int P_offd_size = P_offd_i[num_rows_P]; HYPRE_Int num_cols_P_offd = hypre_CSRMatrixNumCols(P_offd); HYPRE_BigInt *col_map_offd_P = NULL; hypre_CSRMatrix *A_offd = hypre_ParCSRMatrixOffd(A); HYPRE_Int num_cols_A_offd = hypre_CSRMatrixNumCols(A_offd); hypre_ParCSRCommPkg *comm_pkg = hypre_ParCSRMatrixCommPkg(*P); hypre_ParCSRCommHandle *comm_handle; MPI_Comm comm; HYPRE_Real *dbl_buf_data; HYPRE_Real *smooth_vec_offd = NULL; HYPRE_Real *offd_vec_data; HYPRE_Int index, start; HYPRE_Int *P_marker; HYPRE_Int num_procs; hypre_ParVector *vector; HYPRE_Int new_nnz, orig_start, j_pos, fcn_num, num_elements; HYPRE_Int *P_diag_j_new; HYPRE_Real *P_diag_data_new; HYPRE_Int adjust_3D[] = {1, 2, -1, 1, -2, -1}; HYPRE_Int adjust_2D[] = {1, -1}; HYPRE_Int *adjust_list; if (variant == 1 && num_functions > 1) { /* First add new entries to P with value 0.0 corresponding to weights from other unknowns on the same grid point */ /* Loop through each row */ new_nnz = P_diag_size * num_functions; /* this is an over-estimate */ P_diag_j_new = hypre_CTAlloc(HYPRE_Int, new_nnz, HYPRE_MEMORY_HOST); P_diag_data_new = hypre_CTAlloc(HYPRE_Real, new_nnz, HYPRE_MEMORY_HOST); if (num_functions == 2) { adjust_list = adjust_2D; } else if (num_functions == 3) { adjust_list = adjust_3D; } j_pos = 0; orig_start = 0; /* loop through rows */ for (i = 0; i < num_rows_P; i++) { fcn_num = (HYPRE_Int) fmod(i, num_functions); if (fcn_num != dof_func[i]) { printf("WARNING - ROWS incorrectly ordered!\n"); } /* loop through elements */ num_elements = P_diag_i[i + 1] - orig_start; /* add zeros corrresponding to other unknowns */ if (num_elements > 1) { for (j = 0; j < num_elements; j++) { P_diag_j_new[j_pos] = P_diag_j[orig_start + j]; P_diag_data_new[j_pos++] = P_diag_data[orig_start + j]; for (k = 0; k < num_functions - 1; k++) { P_diag_j_new[j_pos] = P_diag_j[orig_start + j] + ADJUST(fcn_num, k); P_diag_data_new[j_pos++] = 0.0; } } } else if (num_elements == 1)/* only one element - just copy to new */ { P_diag_j_new[j_pos] = P_diag_j[orig_start]; P_diag_data_new[j_pos++] = P_diag_data[orig_start]; } orig_start = P_diag_i[i + 1]; if (num_elements > 1) { P_diag_i[i + 1] = P_diag_i[i] + num_elements * num_functions; } else { P_diag_i[i + 1] = P_diag_i[i] + num_elements; } if (j_pos != P_diag_i[i + 1]) { printf("Problem!\n"); } }/* end loop through rows */ /* modify P */ hypre_TFree(P_diag_j, HYPRE_MEMORY_HOST); hypre_TFree(P_diag_data, HYPRE_MEMORY_HOST); hypre_CSRMatrixJ(P_diag) = P_diag_j_new; hypre_CSRMatrixData(P_diag) = P_diag_data_new; hypre_CSRMatrixNumNonzeros(P_diag) = P_diag_i[num_rows_P]; P_diag_j = P_diag_j_new; P_diag_data = P_diag_data_new; /* check if there is already a comm pkg - if so, destroy*/ if (comm_pkg) { hypre_MatvecCommPkgDestroy(comm_pkg ); comm_pkg = NULL; } } /* end variant == 1 and num functions > 0 */ /* For each row, we are updating the weights by solving w = w_old + (delta)(Beta^T)Bs^(-1)(alpha - (Beta)w_old). let s = num_smooth_vectors let k = # of interp points for fine point i Then: w = new weights (k x 1) w_old = old weights (k x 1) delta is a scalar weight in [0,1] alpha = s x 1 vector of s smooth vector values at fine point i Beta = s x k matrix of s smooth vector values at k interp points of i Bs = delta*Beta*Beta^T+(1-delta)*I_s (I_s is sxs identity matrix) */ #if 0 /* print smoothvecs */ { char new_file[80]; for (i = 0; i < num_smooth_vecs; i++) { sprintf(new_file, "%s.%d.level.%d", "smoothvec", i, level ); hypre_ParVectorPrint(smooth_vecs[i], new_file); } } #endif /*initial*/ if (num_smooth_vecs == 0) { return hypre_error_flag; } if (!comm_pkg) { hypre_MatvecCommPkgCreate ( *P ); comm_pkg = hypre_ParCSRMatrixCommPkg(*P); } comm = hypre_ParCSRCommPkgComm(comm_pkg); hypre_MPI_Comm_size(comm, &num_procs); num_nonzeros = hypre_CSRMatrixNumNonzeros(P_diag) + hypre_CSRMatrixNumNonzeros(P_offd); /* number of coarse points = number of cols */ coarse_points = hypre_CSRMatrixNumCols(P_diag) + hypre_CSRMatrixNumCols(P_offd); /* allocate */ alpha = hypre_CTAlloc(HYPRE_Real, num_smooth_vecs, HYPRE_MEMORY_HOST); piv = hypre_CTAlloc(HYPRE_Int, num_smooth_vecs, HYPRE_MEMORY_HOST); B_s = hypre_CTAlloc(HYPRE_Real, num_smooth_vecs * num_smooth_vecs, HYPRE_MEMORY_HOST); /*estimate the max number of weights per row (coarse points only have one weight)*/ k_alloc = (num_nonzeros - coarse_points) / (num_rows_P - coarse_points); k_alloc += 5; Beta = hypre_CTAlloc(HYPRE_Real, k_alloc * num_smooth_vecs, HYPRE_MEMORY_HOST); w = hypre_CTAlloc(HYPRE_Real, k_alloc, HYPRE_MEMORY_HOST); w_old = hypre_CTAlloc(HYPRE_Real, k_alloc, HYPRE_MEMORY_HOST); /* Get smooth vec components for the off-processor columns */ if (num_procs > 1) { smooth_vec_offd = hypre_CTAlloc(HYPRE_Real, num_cols_P_offd * num_smooth_vecs, HYPRE_MEMORY_HOST); /* for now, do a seperate comm for each smooth vector */ for (k = 0; k < num_smooth_vecs; k++) { vector = smooth_vecs[k]; vec_data = hypre_VectorData(hypre_ParVectorLocalVector(vector)); num_sends = hypre_ParCSRCommPkgNumSends(comm_pkg); dbl_buf_data = hypre_CTAlloc(HYPRE_Real, hypre_ParCSRCommPkgSendMapStart(comm_pkg, num_sends), HYPRE_MEMORY_HOST); /* point into smooth_vec_offd */ offd_vec_data = smooth_vec_offd + k * num_cols_P_offd; index = 0; for (i = 0; i < num_sends; i++) { start = hypre_ParCSRCommPkgSendMapStart(comm_pkg, i); for (j = start; j < hypre_ParCSRCommPkgSendMapStart(comm_pkg, i + 1); j++) dbl_buf_data[index++] = vec_data[hypre_ParCSRCommPkgSendMapElmt(comm_pkg, j)]; } comm_handle = hypre_ParCSRCommHandleCreate( 1, comm_pkg, dbl_buf_data, offd_vec_data); hypre_ParCSRCommHandleDestroy(comm_handle); hypre_TFree(dbl_buf_data, HYPRE_MEMORY_HOST); } }/*end num procs > 1 */ /* now off-proc smooth vec data is in smoothvec_offd */ /* Loop through each row */ for (i = 0; i < num_rows_P; i++) { /* only need to modify rows belonging to fine points */ if (CF_marker[i] >= 0) /* coarse */ { continue; } num_coarse_diag = P_diag_i[i + 1] - P_diag_i[i]; num_coarse_offd = P_offd_i[i + 1] - P_offd_i[i]; k_size = num_coarse_diag + num_coarse_offd; /* only need to modify rows that interpolate from coarse points */ if (k_size == 0) { continue; } #if 0 /* only change the weights if we have at least as many coarse points as smooth vectors - do we want to do this? NO */ too_few = 0; if (k_size < num_smooth_vecs) { too_few++; continue; } #endif /*verify that we have enough space allocated */ if (k_size > k_alloc) { k_alloc = k_size + 2; Beta = hypre_TReAlloc(Beta, HYPRE_Real, k_alloc * num_smooth_vecs, HYPRE_MEMORY_HOST); w = hypre_TReAlloc(w, HYPRE_Real, k_alloc, HYPRE_MEMORY_HOST); w_old = hypre_TReAlloc(w_old, HYPRE_Real, k_alloc, HYPRE_MEMORY_HOST); } /* put current weights into w*/ counter = 0; for (j = P_diag_i[i]; j < P_diag_i[i + 1]; j++) { w[counter++] = P_diag_data[j]; } for (j = P_offd_i[i]; j < P_offd_i[i + 1]; j++) { w[counter++] = P_offd_data[j]; } /* copy w to w_old */ for (j = 0; j < k_size; j++) { w_old[j] = w[j]; } /* get alpha and Beta */ /* alpha is the smooth vector values at fine point i */ /* Beta is the smooth vector values at the points that i interpolates from */ /* Note - for using BLAS/LAPACK - need to store Beta in * column-major order */ for (j = 0; j < num_smooth_vecs; j++) { vector = smooth_vecs[j]; vec_data = hypre_VectorData(hypre_ParVectorLocalVector(vector)); /* point into smooth_vec_offd */ offd_vec_data = smooth_vec_offd + j * num_cols_P_offd; alpha[j] = vec_data[i]; vector = coarse_smooth_vecs[j]; vec_data = hypre_VectorData(hypre_ParVectorLocalVector(vector)); /* on processor */ counter = 0; for (k = P_diag_i[i]; k < P_diag_i[i + 1]; k++) { coarse_index = P_diag_j[k]; /*Beta(j, counter) */ Beta[counter * num_smooth_vecs + j] = vec_data[coarse_index]; counter++; } /* off-processor */ for (k = P_offd_i[i]; k < P_offd_i[i + 1]; k++) { coarse_index = P_offd_j[k]; Beta[counter * num_smooth_vecs + j] = offd_vec_data[coarse_index]; counter++; } } /* form B_s: delta*Beta*Beta^T + (1-delta)*I_s */ /* first B_s <- (1-delta)*I_s */ tmp_double = 1.0 - delta; for (j = 0; j < num_smooth_vecs * num_smooth_vecs; j++) { B_s[j] = 0.0; } for (j = 0; j < num_smooth_vecs; j++) { B_s[j * num_smooth_vecs + j] = tmp_double; } /* now B_s <-delta*Beta*Beta^T + B_s */ /* usage: DGEMM(TRANSA,TRANSB,M,N,K,ALPHA,A,LDA,B,LDB,BETA,C,LDC) C := alpha*op( A )*op( B ) + beta*C */ hypre_dgemm("N", "T", &num_smooth_vecs, &num_smooth_vecs, &k_size, &delta, Beta, &num_smooth_vecs, Beta, &num_smooth_vecs, &one, B_s, &num_smooth_vecs); /* now do alpha <- (alpha - beta*w)*/ /* usage: DGEMV(TRANS,M,N,ALPHA,A,LDA,X,INCX,BETA,Y,INCY) y := alpha*A*x + beta*y */ hypre_dgemv("N", &num_smooth_vecs, &k_size, &mone, Beta, &num_smooth_vecs, w_old, &one_i, &one, alpha, &one_i); /* now get alpha <- inv(B_s)*alpha */ /*write over B_s with LU */ hypre_dgetrf(&num_smooth_vecs, &num_smooth_vecs, B_s, &num_smooth_vecs, piv, &info); /*now get alpha */ hypre_dgetrs("N", &num_smooth_vecs, &one_i, B_s, &num_smooth_vecs, piv, alpha, &num_smooth_vecs, &info); /* now w <- w + (delta)*(Beta)^T*(alpha) */ hypre_dgemv("T", &num_smooth_vecs, &k_size, &delta, Beta, &num_smooth_vecs, alpha, &one_i, &one, w, &one_i); /* note:we have w_old still, but we don't need it unless we * want to use it in the future for something */ /* now update the weights in P*/ counter = 0; for (j = P_diag_i[i]; j < P_diag_i[i + 1]; j++) { P_diag_data[j] = w[counter++]; } for (j = P_offd_i[i]; j < P_offd_i[i + 1]; j++) { P_offd_data[j] = w[counter++]; } }/* end of loop through each row */ /* clean up from L.S. fitting*/ hypre_TFree(alpha, HYPRE_MEMORY_HOST); hypre_TFree(Beta, HYPRE_MEMORY_HOST); hypre_TFree(w, HYPRE_MEMORY_HOST); hypre_TFree(w_old, HYPRE_MEMORY_HOST); hypre_TFree(piv, HYPRE_MEMORY_HOST); hypre_TFree(B_s, HYPRE_MEMORY_HOST); hypre_TFree(smooth_vec_offd, HYPRE_MEMORY_HOST); /* Now we truncate here (instead of after forming the interp matrix) */ /* SAME code as in othr interp routines: Compress P, removing coefficients smaller than trunc_factor * Max , or when there are more than max_elements*/ if (trunc_factor != 0.0 || max_elmts > 0) { /* To DO: THIS HAS A BUG IN PARALLEL! */ tmp_int = P_offd_size; hypre_BoomerAMGInterpTruncation(*P, trunc_factor, max_elmts); P_diag_data = hypre_CSRMatrixData(P_diag); P_diag_i = hypre_CSRMatrixI(P_diag); P_diag_j = hypre_CSRMatrixJ(P_diag); P_offd_data = hypre_CSRMatrixData(P_offd); P_offd_i = hypre_CSRMatrixI(P_offd); P_offd_j = hypre_CSRMatrixJ(P_offd); P_diag_size = P_diag_i[num_rows_P]; P_offd_size = P_offd_i[num_rows_P]; /* if truncation occurred, we need to re-do the col_map_offd... */ if (tmp_int != P_offd_size) { HYPRE_Int *tmp_map_offd; num_cols_P_offd = 0; P_marker = hypre_CTAlloc(HYPRE_Int, num_cols_A_offd, HYPRE_MEMORY_HOST); for (i = 0; i < num_cols_A_offd; i++) { P_marker[i] = 0; } num_cols_P_offd = 0; for (i = 0; i < P_offd_size; i++) { index = P_offd_j[i]; if (!P_marker[index]) { num_cols_P_offd++; P_marker[index] = 1; } } col_map_offd_P = hypre_CTAlloc(HYPRE_BigInt, num_cols_P_offd, HYPRE_MEMORY_HOST); tmp_map_offd = hypre_CTAlloc(HYPRE_Int, num_cols_P_offd, HYPRE_MEMORY_HOST); index = 0; for (i = 0; i < num_cols_P_offd; i++) { while (P_marker[index] == 0) { index++; } tmp_map_offd[i] = index++; } for (i = 0; i < P_offd_size; i++) P_offd_j[i] = hypre_BinarySearch(tmp_map_offd, P_offd_j[i], num_cols_P_offd); hypre_TFree(P_marker, HYPRE_MEMORY_HOST); hypre_TFree( hypre_ParCSRMatrixColMapOffd(*P), HYPRE_MEMORY_HOST); /* assign new col map */ hypre_ParCSRMatrixColMapOffd(*P) = col_map_offd_P; hypre_CSRMatrixNumCols(P_offd) = num_cols_P_offd; /* destroy the old and get a new commpkg....*/ hypre_MatvecCommPkgDestroy(comm_pkg); hypre_MatvecCommPkgCreate ( *P ); hypre_TFree(tmp_map_offd); }/*end re-do col_map_offd */ }/*end trucation */ return hypre_error_flag; } hypre-2.33.0/src/parcsr_ls/par_vardifconv.c000066400000000000000000000407731477326011500206750ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "_hypre_parcsr_ls.h" /*-------------------------------------------------------------------------- * hypre_GenerateVarDifConv *--------------------------------------------------------------------------*/ HYPRE_ParCSRMatrix GenerateVarDifConv( MPI_Comm comm, HYPRE_BigInt nx, HYPRE_BigInt ny, HYPRE_BigInt nz, HYPRE_Int P, HYPRE_Int Q, HYPRE_Int R, HYPRE_Int p, HYPRE_Int q, HYPRE_Int r, HYPRE_Real eps, HYPRE_ParVector *rhs_ptr) { hypre_ParCSRMatrix *A; hypre_CSRMatrix *diag; hypre_CSRMatrix *offd; hypre_ParVector *par_rhs; hypre_Vector *rhs; HYPRE_Real *rhs_data; HYPRE_Int *diag_i; HYPRE_Int *diag_j; HYPRE_Real *diag_data; HYPRE_Int *offd_i = NULL; HYPRE_Int *offd_j = NULL; HYPRE_BigInt *big_offd_j = NULL; HYPRE_Real *offd_data = NULL; HYPRE_BigInt global_part[2]; HYPRE_BigInt ix, iy, iz; HYPRE_Int cnt, o_cnt; HYPRE_Int local_num_rows; HYPRE_BigInt *col_map_offd; HYPRE_Int row_index; HYPRE_Int i, j; HYPRE_Int nx_local, ny_local, nz_local; HYPRE_Int num_cols_offd; HYPRE_BigInt grid_size; HYPRE_BigInt *nx_part; HYPRE_BigInt *ny_part; HYPRE_BigInt *nz_part; HYPRE_Int num_procs; HYPRE_Int P_busy, Q_busy, R_busy; HYPRE_Real hhx, hhy, hhz; HYPRE_Real xx, yy, zz; HYPRE_Real afp, afm, bfp, bfm, cfp, cfm, df, ef, ff, gf; hypre_MPI_Comm_size(comm, &num_procs); grid_size = nx * ny * nz; hypre_GeneratePartitioning(nx, P, &nx_part); hypre_GeneratePartitioning(ny, Q, &ny_part); hypre_GeneratePartitioning(nz, R, &nz_part); nx_local = (HYPRE_Int)(nx_part[p + 1] - nx_part[p]); ny_local = (HYPRE_Int)(ny_part[q + 1] - ny_part[q]); nz_local = (HYPRE_Int)(nz_part[r + 1] - nz_part[r]); local_num_rows = nx_local * ny_local * nz_local; global_part[0] = nz_part[r] * nx * ny + (ny_part[q] * nx + nx_part[p] * ny_local) * nz_local; global_part[1] = global_part[0] + (HYPRE_BigInt)local_num_rows; diag_i = hypre_CTAlloc(HYPRE_Int, local_num_rows + 1, HYPRE_MEMORY_HOST); offd_i = hypre_CTAlloc(HYPRE_Int, local_num_rows + 1, HYPRE_MEMORY_HOST); rhs_data = hypre_CTAlloc(HYPRE_Real, local_num_rows, HYPRE_MEMORY_HOST); P_busy = hypre_min(nx, P); Q_busy = hypre_min(ny, Q); R_busy = hypre_min(nz, R); num_cols_offd = 0; if (p) { num_cols_offd += ny_local * nz_local; } if (p < P_busy - 1) { num_cols_offd += ny_local * nz_local; } if (q) { num_cols_offd += nx_local * nz_local; } if (q < Q_busy - 1) { num_cols_offd += nx_local * nz_local; } if (r) { num_cols_offd += nx_local * ny_local; } if (r < R_busy - 1) { num_cols_offd += nx_local * ny_local; } if (!local_num_rows) { num_cols_offd = 0; } col_map_offd = hypre_CTAlloc(HYPRE_BigInt, num_cols_offd, HYPRE_MEMORY_HOST); hhx = 1.0 / (HYPRE_Real)(nx + 1); hhy = 1.0 / (HYPRE_Real)(ny + 1); hhz = 1.0 / (HYPRE_Real)(nz + 1); cnt = 1; o_cnt = 1; diag_i[0] = 0; offd_i[0] = 0; for (iz = nz_part[r]; iz < nz_part[r + 1]; iz++) { for (iy = ny_part[q]; iy < ny_part[q + 1]; iy++) { for (ix = nx_part[p]; ix < nx_part[p + 1]; ix++) { diag_i[cnt] = diag_i[cnt - 1]; offd_i[o_cnt] = offd_i[o_cnt - 1]; diag_i[cnt]++; if (iz > nz_part[r]) { diag_i[cnt]++; } else { if (iz) { offd_i[o_cnt]++; } } if (iy > ny_part[q]) { diag_i[cnt]++; } else { if (iy) { offd_i[o_cnt]++; } } if (ix > nx_part[p]) { diag_i[cnt]++; } else { if (ix) { offd_i[o_cnt]++; } } if (ix + 1 < nx_part[p + 1]) { diag_i[cnt]++; } else { if (ix + 1 < nx) { offd_i[o_cnt]++; } } if (iy + 1 < ny_part[q + 1]) { diag_i[cnt]++; } else { if (iy + 1 < ny) { offd_i[o_cnt]++; } } if (iz + 1 < nz_part[r + 1]) { diag_i[cnt]++; } else { if (iz + 1 < nz) { offd_i[o_cnt]++; } } cnt++; o_cnt++; } } } diag_j = hypre_CTAlloc(HYPRE_Int, diag_i[local_num_rows], HYPRE_MEMORY_HOST); diag_data = hypre_CTAlloc(HYPRE_Real, diag_i[local_num_rows], HYPRE_MEMORY_HOST); if (num_procs > 1) { big_offd_j = hypre_CTAlloc(HYPRE_BigInt, offd_i[local_num_rows], HYPRE_MEMORY_HOST); offd_j = hypre_CTAlloc(HYPRE_Int, offd_i[local_num_rows], HYPRE_MEMORY_HOST); offd_data = hypre_CTAlloc(HYPRE_Real, offd_i[local_num_rows], HYPRE_MEMORY_HOST); } row_index = 0; cnt = 0; o_cnt = 0; for (iz = nz_part[r]; iz < nz_part[r + 1]; iz++) { zz = (HYPRE_Real)(iz + 1) * hhz; for (iy = ny_part[q]; iy < ny_part[q + 1]; iy++) { yy = (HYPRE_Real)(iy + 1) * hhy; for (ix = nx_part[p]; ix < nx_part[p + 1]; ix++) { xx = (HYPRE_Real)(ix + 1) * hhx; afp = eps * afun(xx + 0.5 * hhx, yy, zz) / hhx / hhx; afm = eps * afun(xx - 0.5 * hhx, yy, zz) / hhx / hhx; bfp = eps * bfun(xx, yy + 0.5 * hhy, zz) / hhy / hhy; bfm = eps * bfun(xx, yy - 0.5 * hhy, zz) / hhy / hhy; cfp = eps * cfun(xx, yy, zz + 0.5 * hhz) / hhz / hhz; cfm = eps * cfun(xx, yy, zz - 0.5 * hhz) / hhz / hhz; df = dfun(xx, yy, zz) / hhx; ef = efun(xx, yy, zz) / hhy; ff = ffun(xx, yy, zz) / hhz; gf = gfun(xx, yy, zz); diag_j[cnt] = row_index; diag_data[cnt++] = afp + afm + bfp + bfm + cfp + cfm + gf - df - ef - ff; rhs_data[row_index] = rfun(xx, yy, zz); if (ix == 0) { rhs_data[row_index] += afm * bndfun(0, yy, zz); } if (iy == 0) { rhs_data[row_index] += bfm * bndfun(xx, 0, zz); } if (iz == 0) { rhs_data[row_index] += cfm * bndfun(xx, yy, 0); } if (ix + 1 == nx) { rhs_data[row_index] += (afp - df) * bndfun(1.0, yy, zz); } if (iy + 1 == ny) { rhs_data[row_index] += (bfp - ef) * bndfun(xx, 1.0, zz); } if (iz + 1 == nz) { rhs_data[row_index] += (cfp - ff) * bndfun(xx, yy, 1.0); } if (iz > nz_part[r]) { diag_j[cnt] = row_index - nx_local * ny_local; diag_data[cnt++] = -cfm; } else { if (iz) { big_offd_j[o_cnt] = hypre_map(ix, iy, iz - 1, p, q, r - 1, nx, ny, nx_part, ny_part, nz_part); offd_data[o_cnt++] = -cfm; } } if (iy > ny_part[q]) { diag_j[cnt] = row_index - nx_local; diag_data[cnt++] = -bfm; } else { if (iy) { big_offd_j[o_cnt] = hypre_map(ix, iy - 1, iz, p, q - 1, r, nx, ny, nx_part, ny_part, nz_part); offd_data[o_cnt++] = -bfm; } } if (ix > nx_part[p]) { diag_j[cnt] = row_index - 1; diag_data[cnt++] = -afm; } else { if (ix) { big_offd_j[o_cnt] = hypre_map(ix - 1, iy, iz, p - 1, q, r, nx, ny, nx_part, ny_part, nz_part); offd_data[o_cnt++] = -afm; } } if (ix + 1 < nx_part[p + 1]) { diag_j[cnt] = row_index + 1; diag_data[cnt++] = -afp + df; } else { if (ix + 1 < nx) { big_offd_j[o_cnt] = hypre_map(ix + 1, iy, iz, p + 1, q, r, nx, ny, nx_part, ny_part, nz_part); offd_data[o_cnt++] = -afp + df; } } if (iy + 1 < ny_part[q + 1]) { diag_j[cnt] = row_index + nx_local; diag_data[cnt++] = -bfp + ef; } else { if (iy + 1 < ny) { big_offd_j[o_cnt] = hypre_map(ix, iy + 1, iz, p, q + 1, r, nx, ny, nx_part, ny_part, nz_part); offd_data[o_cnt++] = -bfp + ef; } } if (iz + 1 < nz_part[r + 1]) { diag_j[cnt] = row_index + nx_local * ny_local; diag_data[cnt++] = -cfp + ff; } else { if (iz + 1 < nz) { big_offd_j[o_cnt] = hypre_map(ix, iy, iz + 1, p, q, r + 1, nx, ny, nx_part, ny_part, nz_part); offd_data[o_cnt++] = -cfp + ff; } } row_index++; } } } if (num_procs > 1) { for (i = 0; i < num_cols_offd; i++) { col_map_offd[i] = big_offd_j[i]; } hypre_BigQsort0(col_map_offd, 0, num_cols_offd - 1); for (i = 0; i < num_cols_offd; i++) for (j = 0; j < num_cols_offd; j++) if (big_offd_j[i] == col_map_offd[j]) { offd_j[i] = j; break; } hypre_TFree(big_offd_j, HYPRE_MEMORY_HOST); } par_rhs = hypre_ParVectorCreate(comm, grid_size, global_part); rhs = hypre_ParVectorLocalVector(par_rhs); hypre_VectorData(rhs) = rhs_data; hypre_VectorMemoryLocation(rhs) = HYPRE_MEMORY_HOST; A = hypre_ParCSRMatrixCreate(comm, grid_size, grid_size, global_part, global_part, num_cols_offd, diag_i[local_num_rows], offd_i[local_num_rows]); hypre_ParCSRMatrixColMapOffd(A) = col_map_offd; diag = hypre_ParCSRMatrixDiag(A); hypre_CSRMatrixI(diag) = diag_i; hypre_CSRMatrixJ(diag) = diag_j; hypre_CSRMatrixData(diag) = diag_data; offd = hypre_ParCSRMatrixOffd(A); hypre_CSRMatrixI(offd) = offd_i; if (num_cols_offd) { hypre_CSRMatrixJ(offd) = offd_j; hypre_CSRMatrixData(offd) = offd_data; } hypre_CSRMatrixMemoryLocation(diag) = HYPRE_MEMORY_HOST; hypre_CSRMatrixMemoryLocation(offd) = HYPRE_MEMORY_HOST; hypre_ParCSRMatrixMigrate(A, hypre_HandleMemoryLocation(hypre_handle())); hypre_ParVectorMigrate(par_rhs, hypre_HandleMemoryLocation(hypre_handle())); hypre_TFree(nx_part, HYPRE_MEMORY_HOST); hypre_TFree(ny_part, HYPRE_MEMORY_HOST); hypre_TFree(nz_part, HYPRE_MEMORY_HOST); *rhs_ptr = (HYPRE_ParVector) par_rhs; return (HYPRE_ParCSRMatrix) A; } HYPRE_Real afun(HYPRE_Real xx, HYPRE_Real yy, HYPRE_Real zz) { HYPRE_Real value; /* value = 1.0 + 1000.0*hypre_abs(xx-yy); */ if ((xx < 0.1 && yy < 0.1 && zz < 0.1) || (xx < 0.1 && yy < 0.1 && zz > 0.9) || (xx < 0.1 && yy > 0.9 && zz < 0.1) || (xx > 0.9 && yy < 0.1 && zz < 0.1) || (xx > 0.9 && yy > 0.9 && zz < 0.1) || (xx > 0.9 && yy < 0.1 && zz > 0.9) || (xx < 0.1 && yy > 0.9 && zz > 0.9) || (xx > 0.9 && yy > 0.9 && zz > 0.9)) { value = 0.01; } else if (xx >= 0.1 && xx <= 0.9 && yy >= 0.1 && yy <= 0.9 && zz >= 0.1 && zz <= 0.9) { value = 1000.0; } else { value = 1.0 ; } /* HYPRE_Real value, pi; pi = 4.0 * hypre_atan(1.0); value = hypre_cos(pi*xx)*hypre_cos(pi*yy); */ return value; } HYPRE_Real bfun(HYPRE_Real xx, HYPRE_Real yy, HYPRE_Real zz) { HYPRE_Real value; /* value = 1.0 + 1000.0*hypre_abs(xx-yy); */ if ((xx < 0.1 && yy < 0.1 && zz < 0.1) || (xx < 0.1 && yy < 0.1 && zz > 0.9) || (xx < 0.1 && yy > 0.9 && zz < 0.1) || (xx > 0.9 && yy < 0.1 && zz < 0.1) || (xx > 0.9 && yy > 0.9 && zz < 0.1) || (xx > 0.9 && yy < 0.1 && zz > 0.9) || (xx < 0.1 && yy > 0.9 && zz > 0.9) || (xx > 0.9 && yy > 0.9 && zz > 0.9)) { value = 0.01; } else if (xx >= 0.1 && xx <= 0.9 && yy >= 0.1 && yy <= 0.9 && zz >= 0.1 && zz <= 0.9) { value = 1000.0; } else { value = 1.0 ; } /* HYPRE_Real value, pi; pi = 4.0 * hypre_atan(1.0); value = 1.0 - 2.0*xx; value = hypre_cos(pi*xx)*hypre_cos(pi*yy); */ /* HYPRE_Real value; value = 1.0 + 1000.0 * hypre_abs(xx-yy); HYPRE_Real value, x0, y0; x0 = hypre_abs(xx - 0.5); y0 = hypre_abs(yy - 0.5); if (y0 > x0) x0 = y0; if (x0 >= 0.125 && x0 <= 0.25) value = 1.0; else value = 1000.0;*/ return value; } HYPRE_Real cfun(HYPRE_Real xx, HYPRE_Real yy, HYPRE_Real zz) { HYPRE_Real value; if ((xx < 0.1 && yy < 0.1 && zz < 0.1) || (xx < 0.1 && yy < 0.1 && zz > 0.9) || (xx < 0.1 && yy > 0.9 && zz < 0.1) || (xx > 0.9 && yy < 0.1 && zz < 0.1) || (xx > 0.9 && yy > 0.9 && zz < 0.1) || (xx > 0.9 && yy < 0.1 && zz > 0.9) || (xx < 0.1 && yy > 0.9 && zz > 0.9) || (xx > 0.9 && yy > 0.9 && zz > 0.9)) { value = 0.01; } else if (xx >= 0.1 && xx <= 0.9 && yy >= 0.1 && yy <= 0.9 && zz >= 0.1 && zz <= 0.9) { value = 1000.0; } else { value = 1.0 ; } /*if (xx <= 0.75 && yy <= 0.75 && zz <= 0.75) value = 0.1; else if (xx > 0.75 && yy > 0.75 && zz > 0.75) value = 100000; else value = 1.0 ;*/ return value; } HYPRE_Real dfun(HYPRE_Real xx, HYPRE_Real yy, HYPRE_Real zz) { HYPRE_UNUSED_VAR(xx); HYPRE_UNUSED_VAR(yy); HYPRE_UNUSED_VAR(zz); HYPRE_Real value; /*HYPRE_Real pi; pi = 4.0 * hypre_atan(1.0); value = -hypre_sin(pi*xx)*hypre_cos(pi*yy);*/ value = 0; return value; } HYPRE_Real efun(HYPRE_Real xx, HYPRE_Real yy, HYPRE_Real zz) { HYPRE_UNUSED_VAR(xx); HYPRE_UNUSED_VAR(yy); HYPRE_UNUSED_VAR(zz); HYPRE_Real value; /*HYPRE_Real pi; pi = 4.0 * hypre_atan(1.0); value = hypre_sin(pi*yy)*hypre_cos(pi*xx);*/ value = 0; return value; } HYPRE_Real ffun(HYPRE_Real xx, HYPRE_Real yy, HYPRE_Real zz) { HYPRE_UNUSED_VAR(xx); HYPRE_UNUSED_VAR(yy); HYPRE_UNUSED_VAR(zz); HYPRE_Real value; value = 0.0; return value; } HYPRE_Real gfun(HYPRE_Real xx, HYPRE_Real yy, HYPRE_Real zz) { HYPRE_UNUSED_VAR(xx); HYPRE_UNUSED_VAR(yy); HYPRE_UNUSED_VAR(zz); HYPRE_Real value; value = 0.0; return value; } HYPRE_Real rfun(HYPRE_Real xx, HYPRE_Real yy, HYPRE_Real zz) { HYPRE_UNUSED_VAR(xx); HYPRE_UNUSED_VAR(yy); HYPRE_UNUSED_VAR(zz); /* HYPRE_Real value, pi; pi = 4.0 * hypre_atan(1.0); value = -4.0*pi*pi*hypre_sin(pi*xx)*hypre_sin(pi*yy)*hypre_cos(pi*xx)*hypre_cos(pi*yy); */ HYPRE_Real value; /* value = xx*(1.0-xx)*yy*(1.0-yy); */ value = 1.0; return value; } HYPRE_Real bndfun(HYPRE_Real xx, HYPRE_Real yy, HYPRE_Real zz) { HYPRE_UNUSED_VAR(xx); HYPRE_UNUSED_VAR(yy); HYPRE_UNUSED_VAR(zz); HYPRE_Real value; /*HYPRE_Real pi; pi = 4.0 * atan(1.0); value = hypre_sin(pi*xx)+hypre_sin(13*pi*xx)+hypre_sin(pi*yy)+hypre_sin(13*pi*yy);*/ value = 0.0; return value; } hypre-2.33.0/src/parcsr_ls/par_vardifconv_rs.c000066400000000000000000000376711477326011500214040ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "_hypre_parcsr_ls.h" #ifndef M_PI #define M_PI 3.14159265358979 #endif /* examples in Ruge & Stuben paper */ static HYPRE_Int rs_example = 1; static HYPRE_Real rs_l = 3.0; /*-------------------------------------------------------------------------- * hypre_GenerateVarDifConv: with the FD discretization and examples * in Ruge-Stuben's paper ``Algebraic Multigrid'' *--------------------------------------------------------------------------*/ HYPRE_ParCSRMatrix GenerateRSVarDifConv( MPI_Comm comm, HYPRE_BigInt nx, HYPRE_BigInt ny, HYPRE_BigInt nz, HYPRE_Int P, HYPRE_Int Q, HYPRE_Int R, HYPRE_Int p, HYPRE_Int q, HYPRE_Int r, HYPRE_Real eps, HYPRE_ParVector *rhs_ptr, HYPRE_Int type) { hypre_ParCSRMatrix *A; hypre_CSRMatrix *diag; hypre_CSRMatrix *offd; hypre_ParVector *par_rhs; hypre_Vector *rhs; HYPRE_Real *rhs_data; HYPRE_Int *diag_i; HYPRE_Int *diag_j; HYPRE_Real *diag_data; HYPRE_Int *offd_i = NULL; HYPRE_Int *offd_j = NULL; HYPRE_BigInt *big_offd_j = NULL; HYPRE_Real *offd_data = NULL; HYPRE_BigInt global_part[2]; HYPRE_BigInt ix, iy, iz; HYPRE_Int cnt, o_cnt; HYPRE_Int local_num_rows; HYPRE_BigInt *col_map_offd; HYPRE_Int row_index; HYPRE_Int i, j; HYPRE_Int nx_local, ny_local, nz_local; HYPRE_Int num_cols_offd; HYPRE_BigInt grid_size; HYPRE_BigInt *nx_part; HYPRE_BigInt *ny_part; HYPRE_BigInt *nz_part; HYPRE_Int num_procs, my_id; HYPRE_Int P_busy, Q_busy, R_busy; HYPRE_Real hhx, hhy, hhz; HYPRE_Real xx, yy, zz; HYPRE_Real afp, afm, bfp, bfm, cfp, cfm, di, ai, mux, ei, bi, muy, fi, ci, muz, dfm, dfp, efm, efp, ffm, ffp, gi; hypre_MPI_Comm_size(comm, &num_procs); hypre_MPI_Comm_rank(comm, &my_id); if (type >= 1 && type <= 3) { rs_example = type; } grid_size = nx * ny * nz; hypre_GeneratePartitioning(nx, P, &nx_part); hypre_GeneratePartitioning(ny, Q, &ny_part); hypre_GeneratePartitioning(nz, R, &nz_part); nx_local = (HYPRE_Int)(nx_part[p + 1] - nx_part[p]); ny_local = (HYPRE_Int)(ny_part[q + 1] - ny_part[q]); nz_local = (HYPRE_Int)(nz_part[r + 1] - nz_part[r]); local_num_rows = nx_local * ny_local * nz_local; global_part[0] = nz_part[r] * nx * ny + (ny_part[q] * nx + nx_part[p] * ny_local) * nz_local; global_part[1] = global_part[0] + (HYPRE_BigInt)local_num_rows; diag_i = hypre_CTAlloc(HYPRE_Int, local_num_rows + 1, HYPRE_MEMORY_HOST); offd_i = hypre_CTAlloc(HYPRE_Int, local_num_rows + 1, HYPRE_MEMORY_HOST); rhs_data = hypre_CTAlloc(HYPRE_Real, local_num_rows, HYPRE_MEMORY_HOST); P_busy = hypre_min(nx, P); Q_busy = hypre_min(ny, Q); R_busy = hypre_min(nz, R); num_cols_offd = 0; if (p) { num_cols_offd += ny_local * nz_local; } if (p < P_busy - 1) { num_cols_offd += ny_local * nz_local; } if (q) { num_cols_offd += nx_local * nz_local; } if (q < Q_busy - 1) { num_cols_offd += nx_local * nz_local; } if (r) { num_cols_offd += nx_local * ny_local; } if (r < R_busy - 1) { num_cols_offd += nx_local * ny_local; } if (!local_num_rows) { num_cols_offd = 0; } col_map_offd = hypre_CTAlloc(HYPRE_BigInt, num_cols_offd, HYPRE_MEMORY_HOST); hhx = 1.0 / (HYPRE_Real)(nx + 1); hhy = 1.0 / (HYPRE_Real)(ny + 1); hhz = 1.0 / (HYPRE_Real)(nz + 1); cnt = 1; o_cnt = 1; diag_i[0] = 0; offd_i[0] = 0; for (iz = nz_part[r]; iz < nz_part[r + 1]; iz++) { for (iy = ny_part[q]; iy < ny_part[q + 1]; iy++) { for (ix = nx_part[p]; ix < nx_part[p + 1]; ix++) { diag_i[cnt] = diag_i[cnt - 1]; offd_i[o_cnt] = offd_i[o_cnt - 1]; diag_i[cnt]++; if (iz > nz_part[r]) { diag_i[cnt]++; } else { if (iz) { offd_i[o_cnt]++; } } if (iy > ny_part[q]) { diag_i[cnt]++; } else { if (iy) { offd_i[o_cnt]++; } } if (ix > nx_part[p]) { diag_i[cnt]++; } else { if (ix) { offd_i[o_cnt]++; } } if (ix + 1 < nx_part[p + 1]) { diag_i[cnt]++; } else { if (ix + 1 < nx) { offd_i[o_cnt]++; } } if (iy + 1 < ny_part[q + 1]) { diag_i[cnt]++; } else { if (iy + 1 < ny) { offd_i[o_cnt]++; } } if (iz + 1 < nz_part[r + 1]) { diag_i[cnt]++; } else { if (iz + 1 < nz) { offd_i[o_cnt]++; } } cnt++; o_cnt++; } } } diag_j = hypre_CTAlloc(HYPRE_Int, diag_i[local_num_rows], HYPRE_MEMORY_HOST); diag_data = hypre_CTAlloc(HYPRE_Real, diag_i[local_num_rows], HYPRE_MEMORY_HOST); if (num_procs > 1) { big_offd_j = hypre_CTAlloc(HYPRE_BigInt, offd_i[local_num_rows], HYPRE_MEMORY_HOST); offd_j = hypre_CTAlloc(HYPRE_Int, offd_i[local_num_rows], HYPRE_MEMORY_HOST); offd_data = hypre_CTAlloc(HYPRE_Real, offd_i[local_num_rows], HYPRE_MEMORY_HOST); } row_index = 0; cnt = 0; o_cnt = 0; for (iz = nz_part[r]; iz < nz_part[r + 1]; iz++) { zz = (HYPRE_Real)(iz + 1) * hhz; for (iy = ny_part[q]; iy < ny_part[q + 1]; iy++) { yy = (HYPRE_Real)(iy + 1) * hhy; for (ix = nx_part[p]; ix < nx_part[p + 1]; ix++) { xx = (HYPRE_Real)(ix + 1) * hhx; afp = -eps * afun_rs(xx + 0.5 * hhx, yy, zz) / hhx / hhx; afm = -eps * afun_rs(xx - 0.5 * hhx, yy, zz) / hhx / hhx; bfp = -eps * bfun_rs(xx, yy + 0.5 * hhy, zz) / hhy / hhy; bfm = -eps * bfun_rs(xx, yy - 0.5 * hhy, zz) / hhy / hhy; cfp = -eps * cfun_rs(xx, yy, zz + 0.5 * hhz) / hhz / hhz; cfm = -eps * cfun_rs(xx, yy, zz - 0.5 * hhz) / hhz / hhz; /* first order terms */ /* x-direction */ di = dfun_rs(xx, yy, zz); ai = afun_rs(xx, yy, zz); if (di * hhx > eps * ai) { mux = eps * ai / (2.0 * di * hhx); } else if (di * hhx < -eps * ai) { mux = 1.0 + eps * ai / (2.0 * di * hhx); } else { mux = 0.5; } /* y-direction */ ei = efun_rs(xx, yy, zz); bi = bfun_rs(xx, yy, zz); if (ei * hhy > eps * bi) { muy = eps * bi / (2.0 * ei * hhy); } else if (ei * hhy < -eps * bi) { muy = 1.0 + eps * bi / (2.0 * ei * hhy); } else { muy = 0.5; } /* z-direction */ fi = ffun_rs(xx, yy, zz); ci = cfun_rs(xx, yy, zz); if (fi * hhz > eps * ci) { muz = eps * ci / (2.0 * fi * hhz); } else if (fi * hhz < -eps * ci) { muz = 1.0 + eps * ci / (2.0 * fi * hhz); } else { muz = 0.5; } dfm = di * (mux - 1.0) / hhx; dfp = di * mux / hhx; efm = ei * (muy - 1.0) / hhy; efp = ei * muy / hhy; ffm = fi * (muz - 1.0) / hhz; ffp = fi * muz / hhz; gi = gfun_rs(xx, yy, zz); /* stencil: center */ diag_j[cnt] = row_index; diag_data[cnt++] = -(afp + afm + bfp + bfm + cfp + cfm + dfp + dfm + efp + efm + ffp + ffm) + gi; /* rhs vector */ rhs_data[row_index] = rfun_rs(xx, yy, zz); /* apply boundary conditions */ if (ix == 0) { rhs_data[row_index] -= (afm + dfm) * bndfun_rs(0, yy, zz); } if (iy == 0) { rhs_data[row_index] -= (bfm + efm) * bndfun_rs(xx, 0, zz); } if (iz == 0) { rhs_data[row_index] -= (cfm + ffm) * bndfun_rs(xx, yy, 0); } if (ix + 1 == nx) { rhs_data[row_index] -= (afp + dfp) * bndfun_rs(1.0, yy, zz); } if (iy + 1 == ny) { rhs_data[row_index] -= (bfp + efp) * bndfun_rs(xx, 1.0, zz); } if (iz + 1 == nz) { rhs_data[row_index] -= (cfp + ffp) * bndfun_rs(xx, yy, 1.0); } /* stencil: z- */ if (iz > nz_part[r]) { diag_j[cnt] = row_index - nx_local * ny_local; diag_data[cnt++] = cfm + ffm; } else { if (iz) { big_offd_j[o_cnt] = hypre_map(ix, iy, iz - 1, p, q, r - 1, nx, ny, nx_part, ny_part, nz_part); offd_data[o_cnt++] = cfm + ffm; } } /* stencil: y- */ if (iy > ny_part[q]) { diag_j[cnt] = row_index - nx_local; diag_data[cnt++] = bfm + efm; } else { if (iy) { big_offd_j[o_cnt] = hypre_map(ix, iy - 1, iz, p, q - 1, r, nx, ny, nx_part, ny_part, nz_part); offd_data[o_cnt++] = bfm + efm; } } /* stencil: x- */ if (ix > nx_part[p]) { diag_j[cnt] = row_index - 1; diag_data[cnt++] = afm + dfm; } else { if (ix) { big_offd_j[o_cnt] = hypre_map(ix - 1, iy, iz, p - 1, q, r, nx, ny, nx_part, ny_part, nz_part); offd_data[o_cnt++] = afm + dfm; } } /* stencil: x+ */ if (ix + 1 < nx_part[p + 1]) { diag_j[cnt] = row_index + 1; diag_data[cnt++] = afp + dfp; } else { if (ix + 1 < nx) { big_offd_j[o_cnt] = hypre_map(ix + 1, iy, iz, p + 1, q, r, nx, ny, nx_part, ny_part, nz_part); offd_data[o_cnt++] = afp + dfp; } } /* stencil: y+ */ if (iy + 1 < ny_part[q + 1]) { diag_j[cnt] = row_index + nx_local; diag_data[cnt++] = bfp + efp; } else { if (iy + 1 < ny) { big_offd_j[o_cnt] = hypre_map(ix, iy + 1, iz, p, q + 1, r, nx, ny, nx_part, ny_part, nz_part); offd_data[o_cnt++] = bfp + efp; } } /* stencil: z+ */ if (iz + 1 < nz_part[r + 1]) { diag_j[cnt] = row_index + nx_local * ny_local; diag_data[cnt++] = cfp + ffp; } else { if (iz + 1 < nz) { big_offd_j[o_cnt] = hypre_map(ix, iy, iz + 1, p, q, r + 1, nx, ny, nx_part, ny_part, nz_part); offd_data[o_cnt++] = cfp + ffp; } } /* done with this row */ row_index++; } } } if (num_procs > 1) { for (i = 0; i < num_cols_offd; i++) { col_map_offd[i] = big_offd_j[i]; } hypre_BigQsort0(col_map_offd, 0, num_cols_offd - 1); for (i = 0; i < num_cols_offd; i++) for (j = 0; j < num_cols_offd; j++) if (big_offd_j[i] == col_map_offd[j]) { offd_j[i] = j; break; } hypre_TFree(big_offd_j, HYPRE_MEMORY_HOST); } par_rhs = hypre_ParVectorCreate(comm, grid_size, global_part); rhs = hypre_ParVectorLocalVector(par_rhs); hypre_VectorData(rhs) = rhs_data; A = hypre_ParCSRMatrixCreate(comm, grid_size, grid_size, global_part, global_part, num_cols_offd, diag_i[local_num_rows], offd_i[local_num_rows]); hypre_ParCSRMatrixColMapOffd(A) = col_map_offd; diag = hypre_ParCSRMatrixDiag(A); hypre_CSRMatrixI(diag) = diag_i; hypre_CSRMatrixJ(diag) = diag_j; hypre_CSRMatrixData(diag) = diag_data; offd = hypre_ParCSRMatrixOffd(A); hypre_CSRMatrixI(offd) = offd_i; if (num_cols_offd) { hypre_CSRMatrixJ(offd) = offd_j; hypre_CSRMatrixData(offd) = offd_data; } hypre_TFree(nx_part, HYPRE_MEMORY_HOST); hypre_TFree(ny_part, HYPRE_MEMORY_HOST); hypre_TFree(nz_part, HYPRE_MEMORY_HOST); *rhs_ptr = (HYPRE_ParVector) par_rhs; return (HYPRE_ParCSRMatrix) A; } HYPRE_Real afun_rs(HYPRE_Real xx, HYPRE_Real yy, HYPRE_Real zz) { HYPRE_UNUSED_VAR(xx); HYPRE_UNUSED_VAR(yy); HYPRE_UNUSED_VAR(zz); HYPRE_Real value; value = 1.0; return value; } HYPRE_Real bfun_rs(HYPRE_Real xx, HYPRE_Real yy, HYPRE_Real zz) { HYPRE_UNUSED_VAR(xx); HYPRE_UNUSED_VAR(yy); HYPRE_UNUSED_VAR(zz); HYPRE_Real value; value = 1.0; return value; } HYPRE_Real cfun_rs(HYPRE_Real xx, HYPRE_Real yy, HYPRE_Real zz) { HYPRE_UNUSED_VAR(xx); HYPRE_UNUSED_VAR(yy); HYPRE_UNUSED_VAR(zz); HYPRE_Real value; value = 1.0; return value; } HYPRE_Real dfun_rs(HYPRE_Real xx, HYPRE_Real yy, HYPRE_Real zz) { HYPRE_UNUSED_VAR(zz); HYPRE_Real value; if (rs_example == 1) { value = hypre_sin(rs_l * M_PI / 8.0); } else if (rs_example == 2) { value = (2.0 * yy - 1.0) * (1.0 - xx * xx); } else { value = 4.0 * xx * (xx - 1.0) * (1.0 - 2.0 * yy); } return value; } HYPRE_Real efun_rs(HYPRE_Real xx, HYPRE_Real yy, HYPRE_Real zz) { HYPRE_UNUSED_VAR(zz); HYPRE_Real value; if (rs_example == 1) { value = hypre_cos(rs_l * M_PI / 8.0); } else if (rs_example == 2) { value = 2.0 * xx * yy * (yy - 1.0); } else { value = -4.0 * yy * (yy - 1.0) * (1.0 - 2.0 * xx); } return value; } HYPRE_Real ffun_rs(HYPRE_Real xx, HYPRE_Real yy, HYPRE_Real zz) { HYPRE_Real value; value = efun_rs(xx, yy, zz); return value; } HYPRE_Real gfun_rs(HYPRE_Real xx, HYPRE_Real yy, HYPRE_Real zz) { HYPRE_UNUSED_VAR(xx); HYPRE_UNUSED_VAR(yy); HYPRE_UNUSED_VAR(zz); HYPRE_Real value; value = 0.0; return value; } HYPRE_Real rfun_rs(HYPRE_Real xx, HYPRE_Real yy, HYPRE_Real zz) { HYPRE_UNUSED_VAR(xx); HYPRE_UNUSED_VAR(yy); HYPRE_UNUSED_VAR(zz); HYPRE_Real value; value = 1.0; return value; } HYPRE_Real bndfun_rs(HYPRE_Real xx, HYPRE_Real yy, HYPRE_Real zz) { HYPRE_UNUSED_VAR(xx); HYPRE_UNUSED_VAR(yy); HYPRE_UNUSED_VAR(zz); HYPRE_Real value; value = 0.0; return value; } hypre-2.33.0/src/parcsr_ls/partial.c000066400000000000000000002751551477326011500173320ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "_hypre_parcsr_ls.h" #include "aux_interp.h" /*--------------------------------------------------------------------------- * hypre_BoomerAMGBuildPartialExtPIInterp * Comment: *--------------------------------------------------------------------------*/ HYPRE_Int hypre_BoomerAMGBuildPartialExtPIInterp(hypre_ParCSRMatrix *A, HYPRE_Int *CF_marker, hypre_ParCSRMatrix *S, HYPRE_BigInt *num_cpts_global, HYPRE_BigInt *num_old_cpts_global, HYPRE_Int num_functions, HYPRE_Int *dof_func, HYPRE_Int debug_flag, HYPRE_Real trunc_factor, HYPRE_Int max_elmts, hypre_ParCSRMatrix **P_ptr) { #ifdef HYPRE_PROFILE hypre_profile_times[HYPRE_TIMER_ID_PARTIAL_INTERP] -= hypre_MPI_Wtime(); #endif /* Communication Variables */ MPI_Comm comm = hypre_ParCSRMatrixComm(A); hypre_ParCSRCommPkg *comm_pkg = hypre_ParCSRMatrixCommPkg(A); HYPRE_Int my_id, num_procs; /* Variables to store input variables */ hypre_CSRMatrix *A_diag = hypre_ParCSRMatrixDiag(A); HYPRE_Real *A_diag_data = hypre_CSRMatrixData(A_diag); HYPRE_Int *A_diag_i = hypre_CSRMatrixI(A_diag); HYPRE_Int *A_diag_j = hypre_CSRMatrixJ(A_diag); hypre_CSRMatrix *A_offd = hypre_ParCSRMatrixOffd(A); HYPRE_Real *A_offd_data = hypre_CSRMatrixData(A_offd); HYPRE_Int *A_offd_i = hypre_CSRMatrixI(A_offd); HYPRE_Int *A_offd_j = hypre_CSRMatrixJ(A_offd); /*HYPRE_Int num_cols_A_offd = hypre_CSRMatrixNumCols(A_offd); HYPRE_Int *col_map_offd = hypre_ParCSRMatrixColMapOffd(A);*/ HYPRE_Int n_fine = hypre_CSRMatrixNumRows(A_diag); HYPRE_BigInt col_1 = hypre_ParCSRMatrixFirstRowIndex(A); HYPRE_Int local_numrows = hypre_CSRMatrixNumRows(A_diag); HYPRE_BigInt col_n = col_1 + (HYPRE_BigInt)local_numrows; HYPRE_BigInt total_global_cpts, my_first_cpt; /* Variables to store strong connection matrix info */ hypre_CSRMatrix *S_diag = hypre_ParCSRMatrixDiag(S); HYPRE_Int *S_diag_i = hypre_CSRMatrixI(S_diag); HYPRE_Int *S_diag_j = hypre_CSRMatrixJ(S_diag); hypre_CSRMatrix *S_offd = hypre_ParCSRMatrixOffd(S); HYPRE_Int *S_offd_i = hypre_CSRMatrixI(S_offd); HYPRE_Int *S_offd_j = hypre_CSRMatrixJ(S_offd); /* Interpolation matrix P */ hypre_ParCSRMatrix *P; hypre_CSRMatrix *P_diag; hypre_CSRMatrix *P_offd; HYPRE_Real *P_diag_data = NULL; HYPRE_Int *P_diag_i, *P_diag_j = NULL; HYPRE_Real *P_offd_data = NULL; HYPRE_Int *P_offd_i, *P_offd_j = NULL; /*HYPRE_Int *col_map_offd_P = NULL;*/ HYPRE_Int P_diag_size; HYPRE_Int P_offd_size; /*HYPRE_Int *P_marker = NULL; HYPRE_Int *P_marker_offd = NULL;*/ HYPRE_Int *CF_marker_offd = NULL; HYPRE_Int *tmp_CF_marker_offd = NULL; HYPRE_Int *dof_func_offd = NULL; /* Full row information for columns of A that are off diag*/ hypre_CSRMatrix *A_ext = NULL; HYPRE_Real *A_ext_data = NULL; HYPRE_Int *A_ext_i = NULL; HYPRE_BigInt *A_ext_j = NULL; HYPRE_Int *fine_to_coarse = NULL; HYPRE_BigInt *fine_to_coarse_offd = NULL; HYPRE_Int *old_coarse_to_fine = NULL; HYPRE_Int full_off_procNodes; hypre_CSRMatrix *Sop = NULL; HYPRE_Int *Sop_i = NULL; HYPRE_BigInt *Sop_j = NULL; HYPRE_Int sgn; /* Variables to keep count of interpolatory points */ /*HYPRE_Int jj_counter, jj_counter_offd; HYPRE_Int jj_begin_row, jj_end_row; HYPRE_Int jj_begin_row_offd = 0; HYPRE_Int jj_end_row_offd = 0; HYPRE_Int coarse_counter, coarse_counter_offd; */ HYPRE_Int n_coarse_old; HYPRE_BigInt total_old_global_cpts; /* Interpolation weight variables */ HYPRE_Real sum, diagonal, distribute; /*HYPRE_Int strong_f_marker = -2;*/ /* Loop variables */ /*HYPRE_Int index;*/ HYPRE_Int cnt, old_cnt; HYPRE_Int start_indexing = 0; HYPRE_Int i; /*HYPRE_Int i, ii, i1, i2, j, jj, kk, k1, jj1;*/ /* Definitions */ HYPRE_Real zero = 0.0; HYPRE_Real one = 1.0; HYPRE_Real wall_time; HYPRE_Int max_num_threads; HYPRE_Int *P_diag_array = NULL; HYPRE_Int *P_offd_array = NULL; hypre_ParCSRCommPkg *extend_comm_pkg = NULL; if (debug_flag == 4) { wall_time = time_getWallclockSeconds(); } /* BEGIN */ hypre_MPI_Comm_size(comm, &num_procs); hypre_MPI_Comm_rank(comm, &my_id); max_num_threads = hypre_NumThreads(); my_first_cpt = num_cpts_global[0]; /*my_first_old_cpt = num_old_cpts_global[0];*/ n_coarse_old = (HYPRE_Int)(num_old_cpts_global[1] - num_old_cpts_global[0]); /*n_coarse = num_cpts_global[1] - num_cpts_global[0];*/ if (my_id == (num_procs - 1)) { total_global_cpts = num_cpts_global[1]; total_old_global_cpts = num_old_cpts_global[1]; } hypre_MPI_Bcast(&total_global_cpts, 1, HYPRE_MPI_BIG_INT, num_procs - 1, comm); hypre_MPI_Bcast(&total_old_global_cpts, 1, HYPRE_MPI_BIG_INT, num_procs - 1, comm); if (!comm_pkg) { hypre_MatvecCommPkgCreate(A); comm_pkg = hypre_ParCSRMatrixCommPkg(A); } /* Set up off processor information (specifically for neighbors of * neighbors */ full_off_procNodes = 0; if (num_procs > 1) { if (hypre_exchange_interp_data( &CF_marker_offd, &dof_func_offd, &A_ext, &full_off_procNodes, &Sop, &extend_comm_pkg, A, CF_marker, S, num_functions, dof_func, 1)) { #ifdef HYPRE_PROFILE hypre_profile_times[HYPRE_TIMER_ID_EXTENDED_I_INTERP] += hypre_MPI_Wtime(); #endif return hypre_error_flag; } A_ext_i = hypre_CSRMatrixI(A_ext); A_ext_j = hypre_CSRMatrixBigJ(A_ext); A_ext_data = hypre_CSRMatrixData(A_ext); Sop_i = hypre_CSRMatrixI(Sop); Sop_j = hypre_CSRMatrixBigJ(Sop); } /*----------------------------------------------------------------------- * First Pass: Determine size of P and fill in fine_to_coarse mapping. *-----------------------------------------------------------------------*/ /*----------------------------------------------------------------------- * Intialize counters and allocate mapping vector. *-----------------------------------------------------------------------*/ P_diag_i = hypre_CTAlloc(HYPRE_Int, n_coarse_old + 1, HYPRE_MEMORY_HOST); P_offd_i = hypre_CTAlloc(HYPRE_Int, n_coarse_old + 1, HYPRE_MEMORY_HOST); if (n_fine) { old_coarse_to_fine = hypre_CTAlloc(HYPRE_Int, n_coarse_old, HYPRE_MEMORY_HOST); fine_to_coarse = hypre_CTAlloc(HYPRE_Int, n_fine, HYPRE_MEMORY_HOST); /*P_marker = hypre_CTAlloc(HYPRE_Int, n_fine); */ } if (full_off_procNodes) { /*P_marker_offd = hypre_CTAlloc(HYPRE_Int, full_off_procNodes);*/ fine_to_coarse_offd = hypre_CTAlloc(HYPRE_BigInt, full_off_procNodes, HYPRE_MEMORY_HOST); tmp_CF_marker_offd = hypre_CTAlloc(HYPRE_Int, full_off_procNodes, HYPRE_MEMORY_HOST); } /*hypre_initialize_vecs(n_fine, full_off_procNodes, fine_to_coarse, fine_to_coarse_offd, P_marker, P_marker_offd, tmp_CF_marker_offd);*/ for (i = 0; i < full_off_procNodes; i++) { fine_to_coarse_offd[i] = -1; tmp_CF_marker_offd[i] = -1; } cnt = 0; old_cnt = 0; for (i = 0; i < n_fine; i++) { fine_to_coarse[i] = -1; if (CF_marker[i] == 1) { fine_to_coarse[i] = cnt++; old_coarse_to_fine[old_cnt++] = i; } else if (CF_marker[i] == -2) { old_coarse_to_fine[old_cnt++] = i; } } P_diag_array = hypre_CTAlloc(HYPRE_Int, max_num_threads + 1, HYPRE_MEMORY_HOST); P_offd_array = hypre_CTAlloc(HYPRE_Int, max_num_threads + 1, HYPRE_MEMORY_HOST); /*----------------------------------------------------------------------- * Loop over fine grid. *-----------------------------------------------------------------------*/ #ifdef HYPRE_USING_OPENMP #pragma omp parallel private(i, diagonal, distribute, sgn, sum) #endif { HYPRE_Int ii, jj_counter, jj_counter_offd, jj, kk, i1, i2, k1, jj1; HYPRE_BigInt big_k1; HYPRE_Int loc_col, jj_begin_row, jj_begin_row_offd; HYPRE_Int jj_end_row, jj_end_row_offd, strong_f_marker; HYPRE_Int size, rest, ne, ns; HYPRE_Int num_threads, my_thread_num; HYPRE_Int *P_marker = NULL; HYPRE_Int *P_marker_offd = NULL; strong_f_marker = -2; num_threads = hypre_NumActiveThreads(); my_thread_num = hypre_GetThreadNum(); size = n_coarse_old / num_threads; rest = n_coarse_old - size * num_threads; if (my_thread_num < rest) { ns = my_thread_num * (size + 1); ne = (my_thread_num + 1) * (size + 1); } else { ns = my_thread_num * size + rest; ne = (my_thread_num + 1) * size + rest; } if (n_fine) { P_marker = hypre_CTAlloc(HYPRE_Int, n_fine, HYPRE_MEMORY_HOST); } for (ii = 0; ii < n_fine; ii++) { P_marker[ii] = -1; } if (full_off_procNodes) { P_marker_offd = hypre_CTAlloc(HYPRE_Int, full_off_procNodes, HYPRE_MEMORY_HOST); } for (ii = 0; ii < full_off_procNodes; ii++) { P_marker_offd[ii] = -1; } /*coarse_counter = 0; coarse_counter_offd = 0;*/ jj_counter = start_indexing; jj_counter_offd = start_indexing; for (ii = ns; ii < ne; ii++) { jj_begin_row = jj_counter; jj_begin_row_offd = jj_counter_offd; /*P_diag_i[ii] = jj_counter; if (num_procs > 1) P_offd_i[ii] = jj_counter_offd;*/ i = old_coarse_to_fine[ii]; if (CF_marker[i] > 0) { jj_counter++; /*coarse_counter++;*/ } /*-------------------------------------------------------------------- * If i is an F-point, interpolation is from the C-points that * strongly influence i, or C-points that stronly influence F-points * that strongly influence i. *--------------------------------------------------------------------*/ else if (CF_marker[i] == -2) { for (jj = S_diag_i[i]; jj < S_diag_i[i + 1]; jj++) { i1 = S_diag_j[jj]; if (CF_marker[i1] > 0) { /* i1 is a C point */ if (P_marker[i1] < jj_begin_row) { P_marker[i1] = jj_counter; jj_counter++; } } else if (CF_marker[i1] != -3) { /* i1 is a F point, loop through it's strong neighbors */ for (kk = S_diag_i[i1]; kk < S_diag_i[i1 + 1]; kk++) { k1 = S_diag_j[kk]; if (CF_marker[k1] > 0) { if (P_marker[k1] < jj_begin_row) { P_marker[k1] = jj_counter; jj_counter++; } } } if (num_procs > 1) { for (kk = S_offd_i[i1]; kk < S_offd_i[i1 + 1]; kk++) { k1 = S_offd_j[kk]; if (CF_marker_offd[k1] > 0) { if (P_marker_offd[k1] < jj_begin_row_offd) { tmp_CF_marker_offd[k1] = 1; P_marker_offd[k1] = jj_counter_offd; jj_counter_offd++; } } } } } } /* Look at off diag strong connections of i */ if (num_procs > 1) { for (jj = S_offd_i[i]; jj < S_offd_i[i + 1]; jj++) { i1 = S_offd_j[jj]; if (CF_marker_offd[i1] > 0) { if (P_marker_offd[i1] < jj_begin_row_offd) { tmp_CF_marker_offd[i1] = 1; P_marker_offd[i1] = jj_counter_offd; jj_counter_offd++; } } else if (CF_marker_offd[i1] != -3) { /* F point; look at neighbors of i1. Sop contains global col * numbers and entries that could be in S_diag or S_offd or * neither. */ for (kk = Sop_i[i1]; kk < Sop_i[i1 + 1]; kk++) { big_k1 = Sop_j[kk]; if (big_k1 >= col_1 && big_k1 < col_n) { /* In S_diag */ loc_col = (HYPRE_Int)(big_k1 - col_1); if (P_marker[loc_col] < jj_begin_row) { P_marker[loc_col] = jj_counter; jj_counter++; } } else { loc_col = -(HYPRE_Int)big_k1 - 1; if (P_marker_offd[loc_col] < jj_begin_row_offd) { P_marker_offd[loc_col] = jj_counter_offd; tmp_CF_marker_offd[loc_col] = 1; jj_counter_offd++; } } } } } } } P_diag_array[my_thread_num] = jj_counter; P_offd_array[my_thread_num] = jj_counter_offd; } #ifdef HYPRE_USING_OPENMP #pragma omp barrier #endif if (my_thread_num == 0) { if (debug_flag == 4) { wall_time = time_getWallclockSeconds() - wall_time; hypre_printf("Proc = %d determine structure %f\n", my_id, wall_time); fflush(NULL); } /*----------------------------------------------------------------------- * Allocate arrays. *-----------------------------------------------------------------------*/ if (debug_flag == 4) { wall_time = time_getWallclockSeconds(); } for (i = 0; i < max_num_threads; i++) { P_diag_array[i + 1] += P_diag_array[i]; P_offd_array[i + 1] += P_offd_array[i]; } P_diag_size = P_diag_array[max_num_threads]; P_offd_size = P_offd_array[max_num_threads]; if (P_diag_size) { P_diag_j = hypre_CTAlloc(HYPRE_Int, P_diag_size, HYPRE_MEMORY_HOST); P_diag_data = hypre_CTAlloc(HYPRE_Real, P_diag_size, HYPRE_MEMORY_HOST); } if (P_offd_size) { P_offd_j = hypre_CTAlloc(HYPRE_Int, P_offd_size, HYPRE_MEMORY_HOST); P_offd_data = hypre_CTAlloc(HYPRE_Real, P_offd_size, HYPRE_MEMORY_HOST); } P_diag_i[n_coarse_old] = P_diag_size; P_offd_i[n_coarse_old] = P_offd_size; /* Fine to coarse mapping */ if (num_procs > 1) { hypre_big_insert_new_nodes(comm_pkg, extend_comm_pkg, fine_to_coarse, full_off_procNodes, my_first_cpt, fine_to_coarse_offd); } } for (i = 0; i < n_fine; i++) { P_marker[i] = -1; } for (i = 0; i < full_off_procNodes; i++) { P_marker_offd[i] = -1; } #ifdef HYPRE_USING_OPENMP #pragma omp barrier #endif jj_counter = start_indexing; jj_counter_offd = start_indexing; if (my_thread_num) { jj_counter = P_diag_array[my_thread_num - 1]; jj_counter_offd = P_offd_array[my_thread_num - 1]; } /*----------------------------------------------------------------------- * Loop over fine grid points. *-----------------------------------------------------------------------*/ for (ii = ns; ii < ne; ii++) { jj_begin_row = jj_counter; jj_begin_row_offd = jj_counter_offd; P_diag_i[ii] = jj_counter; P_offd_i[ii] = jj_counter_offd; i = old_coarse_to_fine[ii]; /*-------------------------------------------------------------------- * If i is a c-point, interpolation is the identity. *--------------------------------------------------------------------*/ if (CF_marker[i] > 0) { P_diag_j[jj_counter] = fine_to_coarse[i]; P_diag_data[jj_counter] = one; jj_counter++; } /*-------------------------------------------------------------------- * If i is an F-point, build interpolation. *--------------------------------------------------------------------*/ else if (CF_marker[i] == -2) { strong_f_marker--; for (jj = S_diag_i[i]; jj < S_diag_i[i + 1]; jj++) { i1 = S_diag_j[jj]; /*-------------------------------------------------------------- * If neighbor i1 is a C-point, set column number in P_diag_j * and initialize interpolation weight to zero. *--------------------------------------------------------------*/ if (CF_marker[i1] >= 0) { if (P_marker[i1] < jj_begin_row) { P_marker[i1] = jj_counter; P_diag_j[jj_counter] = fine_to_coarse[i1]; P_diag_data[jj_counter] = zero; jj_counter++; } } else if (CF_marker[i1] != -3) { P_marker[i1] = strong_f_marker; for (kk = S_diag_i[i1]; kk < S_diag_i[i1 + 1]; kk++) { k1 = S_diag_j[kk]; if (CF_marker[k1] >= 0) { if (P_marker[k1] < jj_begin_row) { P_marker[k1] = jj_counter; P_diag_j[jj_counter] = fine_to_coarse[k1]; P_diag_data[jj_counter] = zero; jj_counter++; } } } if (num_procs > 1) { for (kk = S_offd_i[i1]; kk < S_offd_i[i1 + 1]; kk++) { k1 = S_offd_j[kk]; if (CF_marker_offd[k1] >= 0) { if (P_marker_offd[k1] < jj_begin_row_offd) { P_marker_offd[k1] = jj_counter_offd; P_offd_j[jj_counter_offd] = k1; P_offd_data[jj_counter_offd] = zero; jj_counter_offd++; } } } } } } if ( num_procs > 1) { for (jj = S_offd_i[i]; jj < S_offd_i[i + 1]; jj++) { i1 = S_offd_j[jj]; if ( CF_marker_offd[i1] >= 0) { if (P_marker_offd[i1] < jj_begin_row_offd) { P_marker_offd[i1] = jj_counter_offd; P_offd_j[jj_counter_offd] = i1; P_offd_data[jj_counter_offd] = zero; jj_counter_offd++; } } else if (CF_marker_offd[i1] != -3) { P_marker_offd[i1] = strong_f_marker; for (kk = Sop_i[i1]; kk < Sop_i[i1 + 1]; kk++) { big_k1 = Sop_j[kk]; /* Find local col number */ if (big_k1 >= col_1 && big_k1 < col_n) { loc_col = (HYPRE_Int)(big_k1 - col_1); if (P_marker[loc_col] < jj_begin_row) { P_marker[loc_col] = jj_counter; P_diag_j[jj_counter] = fine_to_coarse[loc_col]; P_diag_data[jj_counter] = zero; jj_counter++; } } else { loc_col = -(HYPRE_Int)big_k1 - 1; if (P_marker_offd[loc_col] < jj_begin_row_offd) { P_marker_offd[loc_col] = jj_counter_offd; P_offd_j[jj_counter_offd] = loc_col; P_offd_data[jj_counter_offd] = zero; jj_counter_offd++; } } } } } } jj_end_row = jj_counter; jj_end_row_offd = jj_counter_offd; diagonal = A_diag_data[A_diag_i[i]]; for (jj = A_diag_i[i] + 1; jj < A_diag_i[i + 1]; jj++) { /* i1 is a c-point and strongly influences i, accumulate * a_(i,i1) into interpolation weight */ i1 = A_diag_j[jj]; if (P_marker[i1] >= jj_begin_row) { P_diag_data[P_marker[i1]] += A_diag_data[jj]; } else if (P_marker[i1] == strong_f_marker) { sum = zero; sgn = 1; if (A_diag_data[A_diag_i[i1]] < 0) { sgn = -1; } /* Loop over row of A for point i1 and calculate the sum * of the connections to c-points that strongly incluence i. */ for (jj1 = A_diag_i[i1] + 1; jj1 < A_diag_i[i1 + 1]; jj1++) { i2 = A_diag_j[jj1]; if ((P_marker[i2] >= jj_begin_row || i2 == i) && (sgn * A_diag_data[jj1]) < 0) { sum += A_diag_data[jj1]; } } if (num_procs > 1) { for (jj1 = A_offd_i[i1]; jj1 < A_offd_i[i1 + 1]; jj1++) { i2 = A_offd_j[jj1]; if (P_marker_offd[i2] >= jj_begin_row_offd && (sgn * A_offd_data[jj1]) < 0) { sum += A_offd_data[jj1]; } } } if (sum != 0) { distribute = A_diag_data[jj] / sum; /* Loop over row of A for point i1 and do the distribution */ for (jj1 = A_diag_i[i1] + 1; jj1 < A_diag_i[i1 + 1]; jj1++) { i2 = A_diag_j[jj1]; if (P_marker[i2] >= jj_begin_row && (sgn * A_diag_data[jj1]) < 0) P_diag_data[P_marker[i2]] += distribute * A_diag_data[jj1]; if (i2 == i && (sgn * A_diag_data[jj1]) < 0) { diagonal += distribute * A_diag_data[jj1]; } } if (num_procs > 1) { for (jj1 = A_offd_i[i1]; jj1 < A_offd_i[i1 + 1]; jj1++) { i2 = A_offd_j[jj1]; if (P_marker_offd[i2] >= jj_begin_row_offd && (sgn * A_offd_data[jj1]) < 0) P_offd_data[P_marker_offd[i2]] += distribute * A_offd_data[jj1]; } } } else { diagonal += A_diag_data[jj]; } } /* neighbor i1 weakly influences i, accumulate a_(i,i1) into * diagonal */ else if (CF_marker[i1] != -3) { if (num_functions == 1 || dof_func[i] == dof_func[i1]) { diagonal += A_diag_data[jj]; } } } if (num_procs > 1) { for (jj = A_offd_i[i]; jj < A_offd_i[i + 1]; jj++) { i1 = A_offd_j[jj]; if (P_marker_offd[i1] >= jj_begin_row_offd) { P_offd_data[P_marker_offd[i1]] += A_offd_data[jj]; } else if (P_marker_offd[i1] == strong_f_marker) { sum = zero; for (jj1 = A_ext_i[i1]; jj1 < A_ext_i[i1 + 1]; jj1++) { big_k1 = A_ext_j[jj1]; if (big_k1 >= col_1 && big_k1 < col_n) { /* diag */ loc_col = (HYPRE_Int)(big_k1 - col_1); if (P_marker[loc_col] >= jj_begin_row || loc_col == i) { sum += A_ext_data[jj1]; } } else { loc_col = -(HYPRE_Int)big_k1 - 1; if (P_marker_offd[loc_col] >= jj_begin_row_offd) { sum += A_ext_data[jj1]; } } } if (sum != 0) { distribute = A_offd_data[jj] / sum; for (jj1 = A_ext_i[i1]; jj1 < A_ext_i[i1 + 1]; jj1++) { big_k1 = A_ext_j[jj1]; if (big_k1 >= col_1 && big_k1 < col_n) { /* diag */ loc_col = (HYPRE_Int)(big_k1 - col_1); if (P_marker[loc_col] >= jj_begin_row) P_diag_data[P_marker[loc_col]] += distribute * A_ext_data[jj1]; if (loc_col == i) { diagonal += distribute * A_ext_data[jj1]; } } else { loc_col = -(HYPRE_Int)big_k1 - 1; if (P_marker_offd[loc_col] >= jj_begin_row_offd) P_offd_data[P_marker_offd[loc_col]] += distribute * A_ext_data[jj1]; } } } else { diagonal += A_offd_data[jj]; } } else if (CF_marker_offd[i1] != -3) { if (num_functions == 1 || dof_func[i] == dof_func_offd[i1]) { diagonal += A_offd_data[jj]; } } } } if (diagonal) { for (jj = jj_begin_row; jj < jj_end_row; jj++) { P_diag_data[jj] /= -diagonal; } for (jj = jj_begin_row_offd; jj < jj_end_row_offd; jj++) { P_offd_data[jj] /= -diagonal; } } } strong_f_marker--; } hypre_TFree(P_marker, HYPRE_MEMORY_HOST); hypre_TFree(P_marker_offd, HYPRE_MEMORY_HOST); } /* end parallel region */ if (debug_flag == 4) { wall_time = time_getWallclockSeconds() - wall_time; hypre_printf("Proc = %d fill structure %f\n", my_id, wall_time); fflush(NULL); } /*----------------------------------------------------------------------- * Allocate arrays. *-----------------------------------------------------------------------*/ P = hypre_ParCSRMatrixCreate(comm, total_old_global_cpts, total_global_cpts, num_old_cpts_global, num_cpts_global, 0, P_diag_i[n_coarse_old], P_offd_i[n_coarse_old]); P_diag = hypre_ParCSRMatrixDiag(P); hypre_CSRMatrixData(P_diag) = P_diag_data; hypre_CSRMatrixI(P_diag) = P_diag_i; hypre_CSRMatrixJ(P_diag) = P_diag_j; P_offd = hypre_ParCSRMatrixOffd(P); hypre_CSRMatrixData(P_offd) = P_offd_data; hypre_CSRMatrixI(P_offd) = P_offd_i; hypre_CSRMatrixJ(P_offd) = P_offd_j; hypre_CSRMatrixMemoryLocation(P_diag) = HYPRE_MEMORY_HOST; hypre_CSRMatrixMemoryLocation(P_offd) = HYPRE_MEMORY_HOST; /* Compress P, removing coefficients smaller than trunc_factor * Max */ if (trunc_factor != 0.0 || max_elmts > 0) { hypre_BoomerAMGInterpTruncation(P, trunc_factor, max_elmts); P_diag_data = hypre_CSRMatrixData(P_diag); P_diag_i = hypre_CSRMatrixI(P_diag); P_diag_j = hypre_CSRMatrixJ(P_diag); P_offd_data = hypre_CSRMatrixData(P_offd); P_offd_i = hypre_CSRMatrixI(P_offd); P_offd_j = hypre_CSRMatrixJ(P_offd); P_diag_size = P_diag_i[n_coarse_old]; P_offd_size = P_offd_i[n_coarse_old]; } /* This builds col_map, col_map should be monotone increasing and contain * global numbers. */ if (P_offd_size) { hypre_build_interp_colmap(P, full_off_procNodes, tmp_CF_marker_offd, fine_to_coarse_offd); } hypre_MatvecCommPkgCreate(P); for (i = 0; i < n_fine; i++) if (CF_marker[i] < -1) { CF_marker[i] = -1; } *P_ptr = P; /* Deallocate memory */ hypre_TFree(fine_to_coarse, HYPRE_MEMORY_HOST); hypre_TFree(old_coarse_to_fine, HYPRE_MEMORY_HOST); hypre_TFree(P_diag_array, HYPRE_MEMORY_HOST); hypre_TFree(P_offd_array, HYPRE_MEMORY_HOST); if (num_procs > 1) { hypre_CSRMatrixDestroy(Sop); hypre_CSRMatrixDestroy(A_ext); hypre_TFree(fine_to_coarse_offd, HYPRE_MEMORY_HOST); hypre_TFree(CF_marker_offd, HYPRE_MEMORY_HOST); hypre_TFree(tmp_CF_marker_offd, HYPRE_MEMORY_HOST); if (num_functions > 1) { hypre_TFree(dof_func_offd, HYPRE_MEMORY_HOST); } hypre_MatvecCommPkgDestroy(extend_comm_pkg); } #ifdef HYPRE_PROFILE hypre_profile_times[HYPRE_TIMER_ID_PARTIAL_INTERP] += hypre_MPI_Wtime(); #endif return hypre_error_flag; } /*--------------------------------------------------------------------------- * hypre_BoomerAMGBuildPartialStdInterp * Comment: The interpolatory weighting can be changed with the sep_weight * variable. This can enable not separating negative and positive * off diagonals in the weight formula. *--------------------------------------------------------------------------*/ HYPRE_Int hypre_BoomerAMGBuildPartialStdInterp(hypre_ParCSRMatrix *A, HYPRE_Int *CF_marker, hypre_ParCSRMatrix *S, HYPRE_BigInt *num_cpts_global, HYPRE_BigInt *num_old_cpts_global, HYPRE_Int num_functions, HYPRE_Int *dof_func, HYPRE_Int debug_flag, HYPRE_Real trunc_factor, HYPRE_Int max_elmts, HYPRE_Int sep_weight, hypre_ParCSRMatrix **P_ptr) { /* Communication Variables */ MPI_Comm comm = hypre_ParCSRMatrixComm(A); hypre_ParCSRCommPkg *comm_pkg = hypre_ParCSRMatrixCommPkg(A); HYPRE_Int my_id, num_procs; /* Variables to store input variables */ hypre_CSRMatrix *A_diag = hypre_ParCSRMatrixDiag(A); HYPRE_Real *A_diag_data = hypre_CSRMatrixData(A_diag); HYPRE_Int *A_diag_i = hypre_CSRMatrixI(A_diag); HYPRE_Int *A_diag_j = hypre_CSRMatrixJ(A_diag); hypre_CSRMatrix *A_offd = hypre_ParCSRMatrixOffd(A); HYPRE_Real *A_offd_data = hypre_CSRMatrixData(A_offd); HYPRE_Int *A_offd_i = hypre_CSRMatrixI(A_offd); HYPRE_Int *A_offd_j = hypre_CSRMatrixJ(A_offd); /*HYPRE_Int num_cols_A_offd = hypre_CSRMatrixNumCols(A_offd); HYPRE_Int *col_map_offd = hypre_ParCSRMatrixColMapOffd(A);*/ HYPRE_Int n_fine = hypre_CSRMatrixNumRows(A_diag); HYPRE_BigInt col_1 = hypre_ParCSRMatrixFirstRowIndex(A); HYPRE_Int local_numrows = hypre_CSRMatrixNumRows(A_diag); HYPRE_BigInt col_n = col_1 + (HYPRE_BigInt)local_numrows; HYPRE_BigInt total_global_cpts, my_first_cpt; /* Variables to store strong connection matrix info */ hypre_CSRMatrix *S_diag = hypre_ParCSRMatrixDiag(S); HYPRE_Int *S_diag_i = hypre_CSRMatrixI(S_diag); HYPRE_Int *S_diag_j = hypre_CSRMatrixJ(S_diag); hypre_CSRMatrix *S_offd = hypre_ParCSRMatrixOffd(S); HYPRE_Int *S_offd_i = hypre_CSRMatrixI(S_offd); HYPRE_Int *S_offd_j = hypre_CSRMatrixJ(S_offd); /* Interpolation matrix P */ hypre_ParCSRMatrix *P; hypre_CSRMatrix *P_diag; hypre_CSRMatrix *P_offd; HYPRE_Real *P_diag_data = NULL; HYPRE_Int *P_diag_i, *P_diag_j = NULL; HYPRE_Real *P_offd_data = NULL; HYPRE_Int *P_offd_i, *P_offd_j = NULL; /*HYPRE_Int *col_map_offd_P = NULL;*/ HYPRE_Int P_diag_size; HYPRE_Int P_offd_size; HYPRE_Int *P_marker = NULL; HYPRE_Int *P_marker_offd = NULL; HYPRE_Int *CF_marker_offd = NULL; HYPRE_Int *tmp_CF_marker_offd = NULL; HYPRE_Int *dof_func_offd = NULL; /* Full row information for columns of A that are off diag*/ hypre_CSRMatrix *A_ext = NULL; HYPRE_Real *A_ext_data = NULL; HYPRE_Int *A_ext_i = NULL; HYPRE_BigInt *A_ext_j = NULL; HYPRE_Int *fine_to_coarse = NULL; HYPRE_BigInt *fine_to_coarse_offd = NULL; HYPRE_Int *old_coarse_to_fine = NULL; HYPRE_Int loc_col; HYPRE_Int full_off_procNodes; hypre_CSRMatrix *Sop = NULL; HYPRE_Int *Sop_i = NULL; HYPRE_BigInt *Sop_j = NULL; /* Variables to keep count of interpolatory points */ HYPRE_Int jj_counter, jj_counter_offd; HYPRE_Int jj_begin_row, jj_end_row; HYPRE_Int jj_begin_row_offd = 0; HYPRE_Int jj_end_row_offd = 0; //HYPRE_Int coarse_counter; HYPRE_Int n_coarse_old; HYPRE_BigInt total_old_global_cpts; HYPRE_Int *ihat = NULL; HYPRE_Int *ihat_offd = NULL; HYPRE_Int *ipnt = NULL; HYPRE_Int *ipnt_offd = NULL; HYPRE_Int strong_f_marker = -2; /* Interpolation weight variables */ HYPRE_Real *ahat = NULL; HYPRE_Real *ahat_offd = NULL; HYPRE_Real sum_pos, sum_pos_C, sum_neg, sum_neg_C, sum, sum_C; HYPRE_Real diagonal, distribute; HYPRE_Real alpha, beta; /* Loop variables */ /*HYPRE_Int index;*/ HYPRE_Int cnt, old_cnt; HYPRE_Int start_indexing = 0; HYPRE_Int i, ii, i1, j1, jj, kk, k1; HYPRE_BigInt big_k1; HYPRE_Int cnt_c, cnt_f, cnt_c_offd, cnt_f_offd, indx; /* Definitions */ HYPRE_Real zero = 0.0; HYPRE_Real one = 1.0; HYPRE_Real wall_time = 0.0; HYPRE_Real wall_1 = 0.0; HYPRE_Real wall_2 = 0.0; HYPRE_Real wall_3 = 0.0; hypre_ParCSRCommPkg *extend_comm_pkg = NULL; if (debug_flag == 4) { wall_time = time_getWallclockSeconds(); } /* BEGIN */ hypre_MPI_Comm_size(comm, &num_procs); hypre_MPI_Comm_rank(comm, &my_id); my_first_cpt = num_cpts_global[0]; /*my_first_old_cpt = num_old_cpts_global[0];*/ n_coarse_old = (HYPRE_Int)(num_old_cpts_global[1] - num_old_cpts_global[0]); /*n_coarse = num_cpts_global[1] - num_cpts_global[0];*/ if (my_id == (num_procs - 1)) { total_global_cpts = num_cpts_global[1]; total_old_global_cpts = num_old_cpts_global[1]; } hypre_MPI_Bcast(&total_global_cpts, 1, HYPRE_MPI_BIG_INT, num_procs - 1, comm); hypre_MPI_Bcast(&total_old_global_cpts, 1, HYPRE_MPI_BIG_INT, num_procs - 1, comm); if (!comm_pkg) { hypre_MatvecCommPkgCreate(A); comm_pkg = hypre_ParCSRMatrixCommPkg(A); } /* Set up off processor information (specifically for neighbors of * neighbors */ full_off_procNodes = 0; if (num_procs > 1) { if (hypre_exchange_interp_data( &CF_marker_offd, &dof_func_offd, &A_ext, &full_off_procNodes, &Sop, &extend_comm_pkg, A, CF_marker, S, num_functions, dof_func, 0)) { #ifdef HYPRE_PROFILE hypre_profile_times[HYPRE_TIMER_ID_EXTENDED_I_INTERP] += hypre_MPI_Wtime(); #endif return hypre_error_flag; } A_ext_i = hypre_CSRMatrixI(A_ext); A_ext_j = hypre_CSRMatrixBigJ(A_ext); A_ext_data = hypre_CSRMatrixData(A_ext); Sop_i = hypre_CSRMatrixI(Sop); Sop_j = hypre_CSRMatrixBigJ(Sop); } /*----------------------------------------------------------------------- * First Pass: Determine size of P and fill in fine_to_coarse mapping. *-----------------------------------------------------------------------*/ /*----------------------------------------------------------------------- * Intialize counters and allocate mapping vector. *-----------------------------------------------------------------------*/ P_diag_i = hypre_CTAlloc(HYPRE_Int, n_coarse_old + 1, HYPRE_MEMORY_HOST); P_offd_i = hypre_CTAlloc(HYPRE_Int, n_coarse_old + 1, HYPRE_MEMORY_HOST); if (n_fine) { old_coarse_to_fine = hypre_CTAlloc(HYPRE_Int, n_coarse_old, HYPRE_MEMORY_HOST); fine_to_coarse = hypre_CTAlloc(HYPRE_Int, n_fine, HYPRE_MEMORY_HOST); P_marker = hypre_CTAlloc(HYPRE_Int, n_fine, HYPRE_MEMORY_HOST); } if (full_off_procNodes) { P_marker_offd = hypre_CTAlloc(HYPRE_Int, full_off_procNodes, HYPRE_MEMORY_HOST); fine_to_coarse_offd = hypre_CTAlloc(HYPRE_BigInt, full_off_procNodes, HYPRE_MEMORY_HOST); tmp_CF_marker_offd = hypre_CTAlloc(HYPRE_Int, full_off_procNodes, HYPRE_MEMORY_HOST); } hypre_initialize_vecs(n_fine, full_off_procNodes, fine_to_coarse, fine_to_coarse_offd, P_marker, P_marker_offd, tmp_CF_marker_offd); jj_counter = start_indexing; jj_counter_offd = start_indexing; //coarse_counter = 0; cnt = 0; old_cnt = 0; for (i = 0; i < n_fine; i++) { fine_to_coarse[i] = -1; if (CF_marker[i] == 1) { fine_to_coarse[i] = cnt++; old_coarse_to_fine[old_cnt++] = i; } else if (CF_marker[i] == -2) { old_coarse_to_fine[old_cnt++] = i; } } /*----------------------------------------------------------------------- * Loop over fine grid. *-----------------------------------------------------------------------*/ for (ii = 0; ii < n_coarse_old; ii++) { P_diag_i[ii] = jj_counter; if (num_procs > 1) { P_offd_i[ii] = jj_counter_offd; } i = old_coarse_to_fine[ii]; if (CF_marker[i] > 0) { jj_counter++; //coarse_counter++; } /*-------------------------------------------------------------------- * If i is an F-point, interpolation is from the C-points that * strongly influence i, or C-points that stronly influence F-points * that strongly influence i. *--------------------------------------------------------------------*/ else if (CF_marker[i] == -2) { for (jj = S_diag_i[i]; jj < S_diag_i[i + 1]; jj++) { i1 = S_diag_j[jj]; if (CF_marker[i1] > 0) { /* i1 is a C point */ if (P_marker[i1] < P_diag_i[ii]) { P_marker[i1] = jj_counter; jj_counter++; } } else if (CF_marker[i1] != -3) { /* i1 is a F point, loop through it's strong neighbors */ for (kk = S_diag_i[i1]; kk < S_diag_i[i1 + 1]; kk++) { k1 = S_diag_j[kk]; if (CF_marker[k1] > 0) { if (P_marker[k1] < P_diag_i[ii]) { P_marker[k1] = jj_counter; jj_counter++; } } } if (num_procs > 1) { for (kk = S_offd_i[i1]; kk < S_offd_i[i1 + 1]; kk++) { k1 = S_offd_j[kk]; if (CF_marker_offd[k1] > 0) { if (P_marker_offd[k1] < P_offd_i[ii]) { tmp_CF_marker_offd[k1] = 1; P_marker_offd[k1] = jj_counter_offd; jj_counter_offd++; } } } } } } /* Look at off diag strong connections of i */ if (num_procs > 1) { for (jj = S_offd_i[i]; jj < S_offd_i[i + 1]; jj++) { i1 = S_offd_j[jj]; if (CF_marker_offd[i1] > 0) { if (P_marker_offd[i1] < P_offd_i[ii]) { tmp_CF_marker_offd[i1] = 1; P_marker_offd[i1] = jj_counter_offd; jj_counter_offd++; } } else if (CF_marker_offd[i1] != -3) { /* F point; look at neighbors of i1. Sop contains global col * numbers and entries that could be in S_diag or S_offd or * neither. */ for (kk = Sop_i[i1]; kk < Sop_i[i1 + 1]; kk++) { big_k1 = Sop_j[kk]; if (big_k1 >= col_1 && big_k1 < col_n) { /* In S_diag */ loc_col = (HYPRE_Int)(big_k1 - col_1); if (CF_marker[loc_col] >= 0) { if (P_marker[loc_col] < P_diag_i[ii]) { P_marker[loc_col] = jj_counter; jj_counter++; } } } else { loc_col = -(HYPRE_Int)big_k1 - 1; if (CF_marker_offd[loc_col] >= 0) { if (P_marker_offd[loc_col] < P_offd_i[ii]) { P_marker_offd[loc_col] = jj_counter_offd; tmp_CF_marker_offd[loc_col] = 1; jj_counter_offd++; } } } } } } } } } if (debug_flag == 4) { wall_time = time_getWallclockSeconds() - wall_time; hypre_printf("Proc = %d determine structure %f\n", my_id, wall_time); fflush(NULL); } /*----------------------------------------------------------------------- * Allocate arrays. *-----------------------------------------------------------------------*/ P_diag_size = jj_counter; P_offd_size = jj_counter_offd; if (P_diag_size) { P_diag_j = hypre_CTAlloc(HYPRE_Int, P_diag_size, HYPRE_MEMORY_HOST); P_diag_data = hypre_CTAlloc(HYPRE_Real, P_diag_size, HYPRE_MEMORY_HOST); } if (P_offd_size) { P_offd_j = hypre_CTAlloc(HYPRE_Int, P_offd_size, HYPRE_MEMORY_HOST); P_offd_data = hypre_CTAlloc(HYPRE_Real, P_offd_size, HYPRE_MEMORY_HOST); } P_diag_i[n_coarse_old] = jj_counter; P_offd_i[n_coarse_old] = jj_counter_offd; jj_counter = start_indexing; jj_counter_offd = start_indexing; /* Fine to coarse mapping */ if (num_procs > 1) { hypre_big_insert_new_nodes(comm_pkg, extend_comm_pkg, fine_to_coarse, full_off_procNodes, my_first_cpt, fine_to_coarse_offd); } /* Initialize ahat, which is a modification to a, used in the standard * interpolation routine. */ if (n_fine) { ahat = hypre_CTAlloc(HYPRE_Real, n_fine, HYPRE_MEMORY_HOST); ihat = hypre_CTAlloc(HYPRE_Int, n_fine, HYPRE_MEMORY_HOST); ipnt = hypre_CTAlloc(HYPRE_Int, n_fine, HYPRE_MEMORY_HOST); } if (full_off_procNodes) { ahat_offd = hypre_CTAlloc(HYPRE_Real, full_off_procNodes, HYPRE_MEMORY_HOST); ihat_offd = hypre_CTAlloc(HYPRE_Int, full_off_procNodes, HYPRE_MEMORY_HOST); ipnt_offd = hypre_CTAlloc(HYPRE_Int, full_off_procNodes, HYPRE_MEMORY_HOST); } for (i = 0; i < n_fine; i++) { P_marker[i] = -1; ahat[i] = 0; ihat[i] = -1; } for (i = 0; i < full_off_procNodes; i++) { P_marker_offd[i] = -1; ahat_offd[i] = 0; ihat_offd[i] = -1; } /*----------------------------------------------------------------------- * Loop over fine grid points. *-----------------------------------------------------------------------*/ for (ii = 0; ii < n_coarse_old; ii++) { jj_begin_row = jj_counter; jj_begin_row_offd = jj_counter_offd; i = old_coarse_to_fine[ii]; /*-------------------------------------------------------------------- * If i is a c-point, interpolation is the identity. *--------------------------------------------------------------------*/ if (CF_marker[i] > 0) { P_diag_j[jj_counter] = fine_to_coarse[i]; P_diag_data[jj_counter] = one; jj_counter++; } /*-------------------------------------------------------------------- * If i is an F-point, build interpolation. *--------------------------------------------------------------------*/ else if (CF_marker[i] == -2) { if (debug_flag == 4) { wall_time = time_getWallclockSeconds(); } strong_f_marker--; for (jj = S_diag_i[i]; jj < S_diag_i[i + 1]; jj++) { i1 = S_diag_j[jj]; /*-------------------------------------------------------------- * If neighbor i1 is a C-point, set column number in P_diag_j * and initialize interpolation weight to zero. *--------------------------------------------------------------*/ if (CF_marker[i1] > 0) { if (P_marker[i1] < jj_begin_row) { P_marker[i1] = jj_counter; P_diag_j[jj_counter] = i1; P_diag_data[jj_counter] = zero; jj_counter++; } } else if (CF_marker[i1] != -3) { P_marker[i1] = strong_f_marker; for (kk = S_diag_i[i1]; kk < S_diag_i[i1 + 1]; kk++) { k1 = S_diag_j[kk]; if (CF_marker[k1] > 0) { if (P_marker[k1] < jj_begin_row) { P_marker[k1] = jj_counter; P_diag_j[jj_counter] = k1; P_diag_data[jj_counter] = zero; jj_counter++; } } } if (num_procs > 1) { for (kk = S_offd_i[i1]; kk < S_offd_i[i1 + 1]; kk++) { k1 = S_offd_j[kk]; if (CF_marker_offd[k1] > 0) { if (P_marker_offd[k1] < jj_begin_row_offd) { P_marker_offd[k1] = jj_counter_offd; P_offd_j[jj_counter_offd] = k1; P_offd_data[jj_counter_offd] = zero; jj_counter_offd++; } } } } } } if ( num_procs > 1) { for (jj = S_offd_i[i]; jj < S_offd_i[i + 1]; jj++) { i1 = S_offd_j[jj]; if ( CF_marker_offd[i1] > 0) { if (P_marker_offd[i1] < jj_begin_row_offd) { P_marker_offd[i1] = jj_counter_offd; P_offd_j[jj_counter_offd] = i1; P_offd_data[jj_counter_offd] = zero; jj_counter_offd++; } } else if (CF_marker_offd[i1] != -3) { P_marker_offd[i1] = strong_f_marker; for (kk = Sop_i[i1]; kk < Sop_i[i1 + 1]; kk++) { big_k1 = Sop_j[kk]; if (big_k1 >= col_1 && big_k1 < col_n) { loc_col = (HYPRE_Int)(big_k1 - col_1); if (CF_marker[loc_col] > 0) { if (P_marker[loc_col] < jj_begin_row) { P_marker[loc_col] = jj_counter; P_diag_j[jj_counter] = loc_col; P_diag_data[jj_counter] = zero; jj_counter++; } } } else { loc_col = -(HYPRE_Int)big_k1 - 1; if (CF_marker_offd[loc_col] > 0) { if (P_marker_offd[loc_col] < jj_begin_row_offd) { P_marker_offd[loc_col] = jj_counter_offd; P_offd_j[jj_counter_offd] = loc_col; P_offd_data[jj_counter_offd] = zero; jj_counter_offd++; } } } } } } } jj_end_row = jj_counter; jj_end_row_offd = jj_counter_offd; if (debug_flag == 4) { wall_time = time_getWallclockSeconds() - wall_time; wall_1 += wall_time; fflush(NULL); } if (debug_flag == 4) { wall_time = time_getWallclockSeconds(); } cnt_c = 0; cnt_f = jj_end_row - jj_begin_row; cnt_c_offd = 0; cnt_f_offd = jj_end_row_offd - jj_begin_row_offd; ihat[i] = cnt_f; ipnt[cnt_f] = i; ahat[cnt_f++] = A_diag_data[A_diag_i[i]]; for (jj = A_diag_i[i] + 1; jj < A_diag_i[i + 1]; jj++) { /* i1 is direct neighbor */ i1 = A_diag_j[jj]; if (P_marker[i1] != strong_f_marker) { indx = ihat[i1]; if (indx > -1) { ahat[indx] += A_diag_data[jj]; } else if (P_marker[i1] >= jj_begin_row) { ihat[i1] = cnt_c; ipnt[cnt_c] = i1; ahat[cnt_c++] += A_diag_data[jj]; } else if (CF_marker[i1] != -3) { ihat[i1] = cnt_f; ipnt[cnt_f] = i1; ahat[cnt_f++] += A_diag_data[jj]; } } else { if (num_functions == 1 || dof_func[i] == dof_func[i1]) { distribute = A_diag_data[jj] / A_diag_data[A_diag_i[i1]]; for (kk = A_diag_i[i1] + 1; kk < A_diag_i[i1 + 1]; kk++) { k1 = A_diag_j[kk]; indx = ihat[k1]; if (indx > -1) { ahat[indx] -= A_diag_data[kk] * distribute; } else if (P_marker[k1] >= jj_begin_row) { ihat[k1] = cnt_c; ipnt[cnt_c] = k1; ahat[cnt_c++] -= A_diag_data[kk] * distribute; } else { ihat[k1] = cnt_f; ipnt[cnt_f] = k1; ahat[cnt_f++] -= A_diag_data[kk] * distribute; } } if (num_procs > 1) { for (kk = A_offd_i[i1]; kk < A_offd_i[i1 + 1]; kk++) { k1 = A_offd_j[kk]; indx = ihat_offd[k1]; if (num_functions == 1 || dof_func[i1] == dof_func_offd[k1]) { if (indx > -1) { ahat_offd[indx] -= A_offd_data[kk] * distribute; } else if (P_marker_offd[k1] >= jj_begin_row_offd) { ihat_offd[k1] = cnt_c_offd; ipnt_offd[cnt_c_offd] = k1; ahat_offd[cnt_c_offd++] -= A_offd_data[kk] * distribute; } else { ihat_offd[k1] = cnt_f_offd; ipnt_offd[cnt_f_offd] = k1; ahat_offd[cnt_f_offd++] -= A_offd_data[kk] * distribute; } } } } } } } if (num_procs > 1) { for (jj = A_offd_i[i]; jj < A_offd_i[i + 1]; jj++) { i1 = A_offd_j[jj]; if (P_marker_offd[i1] != strong_f_marker) { indx = ihat_offd[i1]; if (indx > -1) { ahat_offd[indx] += A_offd_data[jj]; } else if (P_marker_offd[i1] >= jj_begin_row_offd) { ihat_offd[i1] = cnt_c_offd; ipnt_offd[cnt_c_offd] = i1; ahat_offd[cnt_c_offd++] += A_offd_data[jj]; } else if (CF_marker_offd[i1] != -3) { ihat_offd[i1] = cnt_f_offd; ipnt_offd[cnt_f_offd] = i1; ahat_offd[cnt_f_offd++] += A_offd_data[jj]; } } else { if (num_functions == 1 || dof_func[i] == dof_func_offd[i1]) { distribute = A_offd_data[jj] / A_ext_data[A_ext_i[i1]]; for (kk = A_ext_i[i1] + 1; kk < A_ext_i[i1 + 1]; kk++) { big_k1 = A_ext_j[kk]; if (big_k1 >= col_1 && big_k1 < col_n) { /*diag*/ loc_col = (HYPRE_Int)(big_k1 - col_1); indx = ihat[loc_col]; if (indx > -1) { ahat[indx] -= A_ext_data[kk] * distribute; } else if (P_marker[loc_col] >= jj_begin_row) { ihat[loc_col] = cnt_c; ipnt[cnt_c] = loc_col; ahat[cnt_c++] -= A_ext_data[kk] * distribute; } else { ihat[loc_col] = cnt_f; ipnt[cnt_f] = loc_col; ahat[cnt_f++] -= A_ext_data[kk] * distribute; } } else { loc_col = -(HYPRE_Int)big_k1 - 1; if (num_functions == 1 || dof_func_offd[loc_col] == dof_func_offd[i1]) { indx = ihat_offd[loc_col]; if (indx > -1) { ahat_offd[indx] -= A_ext_data[kk] * distribute; } else if (P_marker_offd[loc_col] >= jj_begin_row_offd) { ihat_offd[loc_col] = cnt_c_offd; ipnt_offd[cnt_c_offd] = loc_col; ahat_offd[cnt_c_offd++] -= A_ext_data[kk] * distribute; } else { ihat_offd[loc_col] = cnt_f_offd; ipnt_offd[cnt_f_offd] = loc_col; ahat_offd[cnt_f_offd++] -= A_ext_data[kk] * distribute; } } } } } } } } if (debug_flag == 4) { wall_time = time_getWallclockSeconds() - wall_time; wall_2 += wall_time; fflush(NULL); } if (debug_flag == 4) { wall_time = time_getWallclockSeconds(); } diagonal = ahat[cnt_c]; ahat[cnt_c] = 0; sum_pos = 0; sum_pos_C = 0; sum_neg = 0; sum_neg_C = 0; sum = 0; sum_C = 0; if (sep_weight == 1) { for (jj = 0; jj < cnt_c; jj++) { if (ahat[jj] > 0) { sum_pos_C += ahat[jj]; } else { sum_neg_C += ahat[jj]; } } if (num_procs > 1) { for (jj = 0; jj < cnt_c_offd; jj++) { if (ahat_offd[jj] > 0) { sum_pos_C += ahat_offd[jj]; } else { sum_neg_C += ahat_offd[jj]; } } } sum_pos = sum_pos_C; sum_neg = sum_neg_C; for (jj = cnt_c + 1; jj < cnt_f; jj++) { if (ahat[jj] > 0) { sum_pos += ahat[jj]; } else { sum_neg += ahat[jj]; } ahat[jj] = 0; } if (num_procs > 1) { for (jj = cnt_c_offd; jj < cnt_f_offd; jj++) { if (ahat_offd[jj] > 0) { sum_pos += ahat_offd[jj]; } else { sum_neg += ahat_offd[jj]; } ahat_offd[jj] = 0; } } alpha = (sum_neg_C * diagonal != 0.0) ? (sum_neg / sum_neg_C / diagonal) : 1.0; beta = (sum_pos_C * diagonal != 0.0) ? (sum_pos / sum_pos_C / diagonal) : 1.0; /*----------------------------------------------------------------- * Set interpolation weight by dividing by the diagonal. *-----------------------------------------------------------------*/ for (jj = jj_begin_row; jj < jj_end_row; jj++) { j1 = ihat[P_diag_j[jj]]; if (ahat[j1] > 0) { P_diag_data[jj] = -beta * ahat[j1]; } else { P_diag_data[jj] = -alpha * ahat[j1]; } P_diag_j[jj] = fine_to_coarse[P_diag_j[jj]]; ahat[j1] = 0; } for (jj = 0; jj < cnt_f; jj++) { ihat[ipnt[jj]] = -1; } if (num_procs > 1) { for (jj = jj_begin_row_offd; jj < jj_end_row_offd; jj++) { j1 = ihat_offd[P_offd_j[jj]]; if (ahat_offd[j1] > 0) { P_offd_data[jj] = - beta * ahat_offd[j1]; } else { P_offd_data[jj] = - alpha * ahat_offd[j1]; } ahat_offd[j1] = 0; } for (jj = 0; jj < cnt_f_offd; jj++) { ihat_offd[ipnt_offd[jj]] = -1; } } } else { for (jj = 0; jj < cnt_c; jj++) { sum_C += ahat[jj]; } if (num_procs > 1) { for (jj = 0; jj < cnt_c_offd; jj++) { sum_C += ahat_offd[jj]; } } sum = sum_C; for (jj = cnt_c + 1; jj < cnt_f; jj++) { sum += ahat[jj]; ahat[jj] = 0; } if (num_procs > 1) { for (jj = cnt_c_offd; jj < cnt_f_offd; jj++) { sum += ahat_offd[jj]; ahat_offd[jj] = 0; } } alpha = (sum_C * diagonal != 0.0) ? (sum / sum_C / diagonal) : 1.0; /*----------------------------------------------------------------- * Set interpolation weight by dividing by the diagonal. *-----------------------------------------------------------------*/ for (jj = jj_begin_row; jj < jj_end_row; jj++) { j1 = ihat[P_diag_j[jj]]; P_diag_data[jj] = - alpha * ahat[j1]; P_diag_j[jj] = fine_to_coarse[P_diag_j[jj]]; ahat[j1] = 0; } for (jj = 0; jj < cnt_f; jj++) { ihat[ipnt[jj]] = -1; } if (num_procs > 1) { for (jj = jj_begin_row_offd; jj < jj_end_row_offd; jj++) { j1 = ihat_offd[P_offd_j[jj]]; P_offd_data[jj] = - alpha * ahat_offd[j1]; ahat_offd[j1] = 0; } for (jj = 0; jj < cnt_f_offd; jj++) { ihat_offd[ipnt_offd[jj]] = -1; } } } if (debug_flag == 4) { wall_time = time_getWallclockSeconds() - wall_time; wall_3 += wall_time; fflush(NULL); } } } if (debug_flag == 4) { hypre_printf("Proc = %d fill part 1 %f part 2 %f part 3 %f\n", my_id, wall_1, wall_2, wall_3); fflush(NULL); } P = hypre_ParCSRMatrixCreate(comm, total_old_global_cpts, total_global_cpts, num_old_cpts_global, num_cpts_global, 0, P_diag_i[n_coarse_old], P_offd_i[n_coarse_old]); P_diag = hypre_ParCSRMatrixDiag(P); hypre_CSRMatrixData(P_diag) = P_diag_data; hypre_CSRMatrixI(P_diag) = P_diag_i; hypre_CSRMatrixJ(P_diag) = P_diag_j; P_offd = hypre_ParCSRMatrixOffd(P); hypre_CSRMatrixData(P_offd) = P_offd_data; hypre_CSRMatrixI(P_offd) = P_offd_i; hypre_CSRMatrixJ(P_offd) = P_offd_j; hypre_CSRMatrixMemoryLocation(P_diag) = HYPRE_MEMORY_HOST; hypre_CSRMatrixMemoryLocation(P_offd) = HYPRE_MEMORY_HOST; /* Compress P, removing coefficients smaller than trunc_factor * Max */ if (trunc_factor != 0.0 || max_elmts > 0) { hypre_BoomerAMGInterpTruncation(P, trunc_factor, max_elmts); P_diag_data = hypre_CSRMatrixData(P_diag); P_diag_i = hypre_CSRMatrixI(P_diag); P_diag_j = hypre_CSRMatrixJ(P_diag); P_offd_data = hypre_CSRMatrixData(P_offd); P_offd_i = hypre_CSRMatrixI(P_offd); P_offd_j = hypre_CSRMatrixJ(P_offd); P_diag_size = P_diag_i[n_coarse_old]; P_offd_size = P_offd_i[n_coarse_old]; } /* This builds col_map, col_map should be monotone increasing and contain * global numbers. */ if (P_offd_size) { hypre_build_interp_colmap(P, full_off_procNodes, tmp_CF_marker_offd, fine_to_coarse_offd); } hypre_MatvecCommPkgCreate(P); for (i = 0; i < n_fine; i++) if (CF_marker[i] < -1) { CF_marker[i] = -1; } *P_ptr = P; /* Deallocate memory */ hypre_TFree(fine_to_coarse, HYPRE_MEMORY_HOST); hypre_TFree(old_coarse_to_fine, HYPRE_MEMORY_HOST); hypre_TFree(P_marker, HYPRE_MEMORY_HOST); hypre_TFree(ahat, HYPRE_MEMORY_HOST); hypre_TFree(ihat, HYPRE_MEMORY_HOST); hypre_TFree(ipnt, HYPRE_MEMORY_HOST); if (full_off_procNodes) { hypre_TFree(ahat_offd, HYPRE_MEMORY_HOST); hypre_TFree(ihat_offd, HYPRE_MEMORY_HOST); hypre_TFree(ipnt_offd, HYPRE_MEMORY_HOST); } if (num_procs > 1) { hypre_CSRMatrixDestroy(Sop); hypre_CSRMatrixDestroy(A_ext); hypre_TFree(fine_to_coarse_offd, HYPRE_MEMORY_HOST); hypre_TFree(P_marker_offd, HYPRE_MEMORY_HOST); hypre_TFree(CF_marker_offd, HYPRE_MEMORY_HOST); hypre_TFree(tmp_CF_marker_offd, HYPRE_MEMORY_HOST); if (num_functions > 1) { hypre_TFree(dof_func_offd, HYPRE_MEMORY_HOST); } hypre_MatvecCommPkgDestroy(extend_comm_pkg); } return hypre_error_flag; } /*--------------------------------------------------------------------------- * hypre_BoomerAMGBuildPartialExtInterp * Comment: *--------------------------------------------------------------------------*/ HYPRE_Int hypre_BoomerAMGBuildPartialExtInterp(hypre_ParCSRMatrix *A, HYPRE_Int *CF_marker, hypre_ParCSRMatrix *S, HYPRE_BigInt *num_cpts_global, HYPRE_BigInt *num_old_cpts_global, HYPRE_Int num_functions, HYPRE_Int *dof_func, HYPRE_Int debug_flag, HYPRE_Real trunc_factor, HYPRE_Int max_elmts, hypre_ParCSRMatrix **P_ptr) { /* Communication Variables */ MPI_Comm comm = hypre_ParCSRMatrixComm(A); hypre_ParCSRCommPkg *comm_pkg = hypre_ParCSRMatrixCommPkg(A); HYPRE_Int my_id, num_procs; /* Variables to store input variables */ hypre_CSRMatrix *A_diag = hypre_ParCSRMatrixDiag(A); HYPRE_Real *A_diag_data = hypre_CSRMatrixData(A_diag); HYPRE_Int *A_diag_i = hypre_CSRMatrixI(A_diag); HYPRE_Int *A_diag_j = hypre_CSRMatrixJ(A_diag); hypre_CSRMatrix *A_offd = hypre_ParCSRMatrixOffd(A); HYPRE_Real *A_offd_data = hypre_CSRMatrixData(A_offd); HYPRE_Int *A_offd_i = hypre_CSRMatrixI(A_offd); HYPRE_Int *A_offd_j = hypre_CSRMatrixJ(A_offd); /*HYPRE_Int num_cols_A_offd = hypre_CSRMatrixNumCols(A_offd); HYPRE_Int *col_map_offd = hypre_ParCSRMatrixColMapOffd(A);*/ HYPRE_Int n_fine = hypre_CSRMatrixNumRows(A_diag); HYPRE_BigInt col_1 = hypre_ParCSRMatrixFirstRowIndex(A); HYPRE_Int local_numrows = hypre_CSRMatrixNumRows(A_diag); HYPRE_BigInt col_n = col_1 + (HYPRE_BigInt)local_numrows; HYPRE_BigInt total_global_cpts, my_first_cpt; /* Variables to store strong connection matrix info */ hypre_CSRMatrix *S_diag = hypre_ParCSRMatrixDiag(S); HYPRE_Int *S_diag_i = hypre_CSRMatrixI(S_diag); HYPRE_Int *S_diag_j = hypre_CSRMatrixJ(S_diag); hypre_CSRMatrix *S_offd = hypre_ParCSRMatrixOffd(S); HYPRE_Int *S_offd_i = hypre_CSRMatrixI(S_offd); HYPRE_Int *S_offd_j = hypre_CSRMatrixJ(S_offd); /* Interpolation matrix P */ hypre_ParCSRMatrix *P; hypre_CSRMatrix *P_diag; hypre_CSRMatrix *P_offd; HYPRE_Real *P_diag_data = NULL; HYPRE_Int *P_diag_i, *P_diag_j = NULL; HYPRE_Real *P_offd_data = NULL; HYPRE_Int *P_offd_i, *P_offd_j = NULL; /*HYPRE_Int *col_map_offd_P = NULL;*/ HYPRE_Int P_diag_size; HYPRE_Int P_offd_size; HYPRE_Int *P_marker = NULL; HYPRE_Int *P_marker_offd = NULL; HYPRE_Int *CF_marker_offd = NULL; HYPRE_Int *tmp_CF_marker_offd = NULL; HYPRE_Int *dof_func_offd = NULL; /* Full row information for columns of A that are off diag*/ hypre_CSRMatrix *A_ext = NULL; HYPRE_Real *A_ext_data = NULL; HYPRE_Int *A_ext_i = NULL; HYPRE_BigInt *A_ext_j = NULL; HYPRE_Int *fine_to_coarse = NULL; HYPRE_BigInt *fine_to_coarse_offd = NULL; HYPRE_Int *old_coarse_to_fine = NULL; HYPRE_Int loc_col; HYPRE_Int full_off_procNodes; hypre_CSRMatrix *Sop = NULL; HYPRE_Int *Sop_i = NULL; HYPRE_BigInt *Sop_j = NULL; HYPRE_Int sgn; /* Variables to keep count of interpolatory points */ HYPRE_Int jj_counter, jj_counter_offd; HYPRE_Int jj_begin_row, jj_end_row; HYPRE_Int jj_begin_row_offd = 0; HYPRE_Int jj_end_row_offd = 0; //HYPRE_Int coarse_counter; HYPRE_Int n_coarse_old; HYPRE_BigInt total_old_global_cpts; /* Interpolation weight variables */ HYPRE_Real sum, diagonal, distribute; HYPRE_Int strong_f_marker = -2; /* Loop variables */ /*HYPRE_Int index;*/ HYPRE_Int cnt, old_cnt; HYPRE_Int start_indexing = 0; HYPRE_Int i, ii, i1, i2, jj, kk, k1, jj1; HYPRE_BigInt big_k1; /* Definitions */ HYPRE_Real zero = 0.0; HYPRE_Real one = 1.0; HYPRE_Real wall_time = 0.0; hypre_ParCSRCommPkg *extend_comm_pkg = NULL; if (debug_flag == 4) { wall_time = time_getWallclockSeconds(); } /* BEGIN */ hypre_MPI_Comm_size(comm, &num_procs); hypre_MPI_Comm_rank(comm, &my_id); my_first_cpt = num_cpts_global[0]; /*my_first_old_cpt = num_old_cpts_global[0];*/ n_coarse_old = (HYPRE_Int)(num_old_cpts_global[1] - num_old_cpts_global[0]); /*n_coarse = num_cpts_global[1] - num_cpts_global[0];*/ if (my_id == (num_procs - 1)) { total_global_cpts = num_cpts_global[1]; total_old_global_cpts = num_old_cpts_global[1]; } hypre_MPI_Bcast(&total_global_cpts, 1, HYPRE_MPI_BIG_INT, num_procs - 1, comm); hypre_MPI_Bcast(&total_old_global_cpts, 1, HYPRE_MPI_BIG_INT, num_procs - 1, comm); if (!comm_pkg) { hypre_MatvecCommPkgCreate(A); comm_pkg = hypre_ParCSRMatrixCommPkg(A); } /* Set up off processor information (specifically for neighbors of * neighbors */ full_off_procNodes = 0; if (num_procs > 1) { if (hypre_exchange_interp_data( &CF_marker_offd, &dof_func_offd, &A_ext, &full_off_procNodes, &Sop, &extend_comm_pkg, A, CF_marker, S, num_functions, dof_func, 1)) { #ifdef HYPRE_PROFILE hypre_profile_times[HYPRE_TIMER_ID_EXTENDED_I_INTERP] += hypre_MPI_Wtime(); #endif return hypre_error_flag; } A_ext_i = hypre_CSRMatrixI(A_ext); A_ext_j = hypre_CSRMatrixBigJ(A_ext); A_ext_data = hypre_CSRMatrixData(A_ext); Sop_i = hypre_CSRMatrixI(Sop); Sop_j = hypre_CSRMatrixBigJ(Sop); } /*----------------------------------------------------------------------- * First Pass: Determine size of P and fill in fine_to_coarse mapping. *-----------------------------------------------------------------------*/ /*----------------------------------------------------------------------- * Intialize counters and allocate mapping vector. *-----------------------------------------------------------------------*/ P_diag_i = hypre_CTAlloc(HYPRE_Int, n_coarse_old + 1, HYPRE_MEMORY_HOST); P_offd_i = hypre_CTAlloc(HYPRE_Int, n_coarse_old + 1, HYPRE_MEMORY_HOST); if (n_fine) { old_coarse_to_fine = hypre_CTAlloc(HYPRE_Int, n_coarse_old, HYPRE_MEMORY_HOST); fine_to_coarse = hypre_CTAlloc(HYPRE_Int, n_fine, HYPRE_MEMORY_HOST); P_marker = hypre_CTAlloc(HYPRE_Int, n_fine, HYPRE_MEMORY_HOST); } if (full_off_procNodes) { P_marker_offd = hypre_CTAlloc(HYPRE_Int, full_off_procNodes, HYPRE_MEMORY_HOST); fine_to_coarse_offd = hypre_CTAlloc(HYPRE_BigInt, full_off_procNodes, HYPRE_MEMORY_HOST); tmp_CF_marker_offd = hypre_CTAlloc(HYPRE_Int, full_off_procNodes, HYPRE_MEMORY_HOST); } hypre_initialize_vecs(n_fine, full_off_procNodes, fine_to_coarse, fine_to_coarse_offd, P_marker, P_marker_offd, tmp_CF_marker_offd); jj_counter = start_indexing; jj_counter_offd = start_indexing; //coarse_counter = 0; cnt = 0; old_cnt = 0; for (i = 0; i < n_fine; i++) { fine_to_coarse[i] = -1; if (CF_marker[i] == 1) { fine_to_coarse[i] = cnt++; old_coarse_to_fine[old_cnt++] = i; } else if (CF_marker[i] == -2) { old_coarse_to_fine[old_cnt++] = i; } } /*----------------------------------------------------------------------- * Loop over fine grid. *-----------------------------------------------------------------------*/ for (ii = 0; ii < n_coarse_old; ii++) { P_diag_i[ii] = jj_counter; if (num_procs > 1) { P_offd_i[ii] = jj_counter_offd; } i = old_coarse_to_fine[ii]; if (CF_marker[i] > 0) { jj_counter++; //coarse_counter++; } /*-------------------------------------------------------------------- * If i is an F-point, interpolation is from the C-points that * strongly influence i, or C-points that stronly influence F-points * that strongly influence i. *--------------------------------------------------------------------*/ else if (CF_marker[i] == -2) { for (jj = S_diag_i[i]; jj < S_diag_i[i + 1]; jj++) { i1 = S_diag_j[jj]; if (CF_marker[i1] > 0) { /* i1 is a C point */ if (P_marker[i1] < P_diag_i[ii]) { P_marker[i1] = jj_counter; jj_counter++; } } else if (CF_marker[i1] != -3) { /* i1 is a F point, loop through it's strong neighbors */ for (kk = S_diag_i[i1]; kk < S_diag_i[i1 + 1]; kk++) { k1 = S_diag_j[kk]; if (CF_marker[k1] > 0) { if (P_marker[k1] < P_diag_i[ii]) { P_marker[k1] = jj_counter; jj_counter++; } } } if (num_procs > 1) { for (kk = S_offd_i[i1]; kk < S_offd_i[i1 + 1]; kk++) { k1 = S_offd_j[kk]; if (CF_marker_offd[k1] > 0) { if (P_marker_offd[k1] < P_offd_i[ii]) { tmp_CF_marker_offd[k1] = 1; P_marker_offd[k1] = jj_counter_offd; jj_counter_offd++; } } } } } } /* Look at off diag strong connections of i */ if (num_procs > 1) { for (jj = S_offd_i[i]; jj < S_offd_i[i + 1]; jj++) { i1 = S_offd_j[jj]; if (CF_marker_offd[i1] > 0) { if (P_marker_offd[i1] < P_offd_i[ii]) { tmp_CF_marker_offd[i1] = 1; P_marker_offd[i1] = jj_counter_offd; jj_counter_offd++; } } else if (CF_marker_offd[i1] != -3) { /* F point; look at neighbors of i1. Sop contains global col * numbers and entries that could be in S_diag or S_offd or * neither. */ for (kk = Sop_i[i1]; kk < Sop_i[i1 + 1]; kk++) { big_k1 = Sop_j[kk]; if (big_k1 >= col_1 && big_k1 < col_n) { /* In S_diag */ loc_col = (HYPRE_Int)(big_k1 - col_1); if (P_marker[loc_col] < P_diag_i[ii]) { P_marker[loc_col] = jj_counter; jj_counter++; } } else { loc_col = -(HYPRE_Int)big_k1 - 1; if (P_marker_offd[loc_col] < P_offd_i[ii]) { P_marker_offd[loc_col] = jj_counter_offd; tmp_CF_marker_offd[loc_col] = 1; jj_counter_offd++; } } } } } } } } if (debug_flag == 4) { wall_time = time_getWallclockSeconds() - wall_time; hypre_printf("Proc = %d determine structure %f\n", my_id, wall_time); fflush(NULL); } /*----------------------------------------------------------------------- * Allocate arrays. *-----------------------------------------------------------------------*/ if (debug_flag == 4) { wall_time = time_getWallclockSeconds(); } P_diag_size = jj_counter; P_offd_size = jj_counter_offd; if (P_diag_size) { P_diag_j = hypre_CTAlloc(HYPRE_Int, P_diag_size, HYPRE_MEMORY_HOST); P_diag_data = hypre_CTAlloc(HYPRE_Real, P_diag_size, HYPRE_MEMORY_HOST); } if (P_offd_size) { P_offd_j = hypre_CTAlloc(HYPRE_Int, P_offd_size, HYPRE_MEMORY_HOST); P_offd_data = hypre_CTAlloc(HYPRE_Real, P_offd_size, HYPRE_MEMORY_HOST); } P_diag_i[n_coarse_old] = jj_counter; P_offd_i[n_coarse_old] = jj_counter_offd; jj_counter = start_indexing; jj_counter_offd = start_indexing; /* Fine to coarse mapping */ if (num_procs > 1) { hypre_big_insert_new_nodes(comm_pkg, extend_comm_pkg, fine_to_coarse, full_off_procNodes, my_first_cpt, fine_to_coarse_offd); } for (i = 0; i < n_fine; i++) { P_marker[i] = -1; } for (i = 0; i < full_off_procNodes; i++) { P_marker_offd[i] = -1; } /*----------------------------------------------------------------------- * Loop over fine grid points. *-----------------------------------------------------------------------*/ for (ii = 0; ii < n_coarse_old; ii++) { jj_begin_row = jj_counter; jj_begin_row_offd = jj_counter_offd; i = old_coarse_to_fine[ii]; /*-------------------------------------------------------------------- * If i is a c-point, interpolation is the identity. *--------------------------------------------------------------------*/ if (CF_marker[i] > 0) { P_diag_j[jj_counter] = fine_to_coarse[i]; P_diag_data[jj_counter] = one; jj_counter++; } /*-------------------------------------------------------------------- * If i is an F-point, build interpolation. *--------------------------------------------------------------------*/ else if (CF_marker[i] == -2) { strong_f_marker--; for (jj = S_diag_i[i]; jj < S_diag_i[i + 1]; jj++) { i1 = S_diag_j[jj]; /*-------------------------------------------------------------- * If neighbor i1 is a C-point, set column number in P_diag_j * and initialize interpolation weight to zero. *--------------------------------------------------------------*/ if (CF_marker[i1] >= 0) { if (P_marker[i1] < jj_begin_row) { P_marker[i1] = jj_counter; P_diag_j[jj_counter] = fine_to_coarse[i1]; P_diag_data[jj_counter] = zero; jj_counter++; } } else if (CF_marker[i1] != -3) { P_marker[i1] = strong_f_marker; for (kk = S_diag_i[i1]; kk < S_diag_i[i1 + 1]; kk++) { k1 = S_diag_j[kk]; if (CF_marker[k1] >= 0) { if (P_marker[k1] < jj_begin_row) { P_marker[k1] = jj_counter; P_diag_j[jj_counter] = fine_to_coarse[k1]; P_diag_data[jj_counter] = zero; jj_counter++; } } } if (num_procs > 1) { for (kk = S_offd_i[i1]; kk < S_offd_i[i1 + 1]; kk++) { k1 = S_offd_j[kk]; if (CF_marker_offd[k1] >= 0) { if (P_marker_offd[k1] < jj_begin_row_offd) { P_marker_offd[k1] = jj_counter_offd; P_offd_j[jj_counter_offd] = k1; P_offd_data[jj_counter_offd] = zero; jj_counter_offd++; } } } } } } if ( num_procs > 1) { for (jj = S_offd_i[i]; jj < S_offd_i[i + 1]; jj++) { i1 = S_offd_j[jj]; if ( CF_marker_offd[i1] >= 0) { if (P_marker_offd[i1] < jj_begin_row_offd) { P_marker_offd[i1] = jj_counter_offd; P_offd_j[jj_counter_offd] = i1; P_offd_data[jj_counter_offd] = zero; jj_counter_offd++; } } else if (CF_marker_offd[i1] != -3) { P_marker_offd[i1] = strong_f_marker; for (kk = Sop_i[i1]; kk < Sop_i[i1 + 1]; kk++) { big_k1 = Sop_j[kk]; /* Find local col number */ if (big_k1 >= col_1 && big_k1 < col_n) { loc_col = (HYPRE_Int)(big_k1 - col_1); if (P_marker[loc_col] < jj_begin_row) { P_marker[loc_col] = jj_counter; P_diag_j[jj_counter] = fine_to_coarse[loc_col]; P_diag_data[jj_counter] = zero; jj_counter++; } } else { loc_col = -(HYPRE_Int)big_k1 - 1; if (P_marker_offd[loc_col] < jj_begin_row_offd) { P_marker_offd[loc_col] = jj_counter_offd; P_offd_j[jj_counter_offd] = loc_col; P_offd_data[jj_counter_offd] = zero; jj_counter_offd++; } } } } } } jj_end_row = jj_counter; jj_end_row_offd = jj_counter_offd; diagonal = A_diag_data[A_diag_i[i]]; for (jj = A_diag_i[i] + 1; jj < A_diag_i[i + 1]; jj++) { /* i1 is a c-point and strongly influences i, accumulate * a_(i,i1) into interpolation weight */ i1 = A_diag_j[jj]; if (P_marker[i1] >= jj_begin_row) { P_diag_data[P_marker[i1]] += A_diag_data[jj]; } else if (P_marker[i1] == strong_f_marker) { sum = zero; sgn = 1; if (A_diag_data[A_diag_i[i1]] < 0) { sgn = -1; } /* Loop over row of A for point i1 and calculate the sum * of the connections to c-points that strongly incluence i. */ for (jj1 = A_diag_i[i1] + 1; jj1 < A_diag_i[i1 + 1]; jj1++) { i2 = A_diag_j[jj1]; if ((P_marker[i2] >= jj_begin_row) && (sgn * A_diag_data[jj1]) < 0) { sum += A_diag_data[jj1]; } } if (num_procs > 1) { for (jj1 = A_offd_i[i1]; jj1 < A_offd_i[i1 + 1]; jj1++) { i2 = A_offd_j[jj1]; if (P_marker_offd[i2] >= jj_begin_row_offd && (sgn * A_offd_data[jj1]) < 0) { sum += A_offd_data[jj1]; } } } if (sum != 0) { distribute = A_diag_data[jj] / sum; /* Loop over row of A for point i1 and do the distribution */ for (jj1 = A_diag_i[i1] + 1; jj1 < A_diag_i[i1 + 1]; jj1++) { i2 = A_diag_j[jj1]; if (P_marker[i2] >= jj_begin_row && (sgn * A_diag_data[jj1]) < 0) P_diag_data[P_marker[i2]] += distribute * A_diag_data[jj1]; } if (num_procs > 1) { for (jj1 = A_offd_i[i1]; jj1 < A_offd_i[i1 + 1]; jj1++) { i2 = A_offd_j[jj1]; if (P_marker_offd[i2] >= jj_begin_row_offd && (sgn * A_offd_data[jj1]) < 0) P_offd_data[P_marker_offd[i2]] += distribute * A_offd_data[jj1]; } } } else { diagonal += A_diag_data[jj]; } } /* neighbor i1 weakly influences i, accumulate a_(i,i1) into * diagonal */ else if (CF_marker[i1] != -3) { if (num_functions == 1 || dof_func[i] == dof_func[i1]) { diagonal += A_diag_data[jj]; } } } if (num_procs > 1) { for (jj = A_offd_i[i]; jj < A_offd_i[i + 1]; jj++) { i1 = A_offd_j[jj]; if (P_marker_offd[i1] >= jj_begin_row_offd) { P_offd_data[P_marker_offd[i1]] += A_offd_data[jj]; } else if (P_marker_offd[i1] == strong_f_marker) { sum = zero; sgn = 1; for (jj1 = A_ext_i[i1]; jj1 < A_ext_i[i1 + 1]; jj1++) { big_k1 = A_ext_j[jj1]; if (big_k1 >= col_1 && big_k1 < col_n) { /* diag */ loc_col = (HYPRE_Int)(big_k1 - col_1); if (P_marker[loc_col] >= jj_begin_row ) { sum += A_ext_data[jj1]; } } else { loc_col = -(HYPRE_Int)big_k1 - 1; if (P_marker_offd[loc_col] >= jj_begin_row_offd && (sgn * A_ext_data[jj1]) < 0) { sum += A_ext_data[jj1]; } } } if (sum != 0) { distribute = A_offd_data[jj] / sum; for (jj1 = A_ext_i[i1]; jj1 < A_ext_i[i1 + 1]; jj1++) { big_k1 = A_ext_j[jj1]; if (big_k1 >= col_1 && big_k1 < col_n) { /* diag */ loc_col = (HYPRE_Int)(big_k1 - col_1); if (P_marker[loc_col] >= jj_begin_row) P_diag_data[P_marker[loc_col]] += distribute * A_ext_data[jj1]; } else { loc_col = -(HYPRE_Int)big_k1 - 1; if (P_marker_offd[loc_col] >= jj_begin_row_offd) P_offd_data[P_marker_offd[loc_col]] += distribute * A_ext_data[jj1]; } } } else { diagonal += A_offd_data[jj]; } } else if (CF_marker_offd[i1] != -3) { if (num_functions == 1 || dof_func[i] == dof_func_offd[i1]) { diagonal += A_offd_data[jj]; } } } } if (diagonal) { for (jj = jj_begin_row; jj < jj_end_row; jj++) { P_diag_data[jj] /= -diagonal; } for (jj = jj_begin_row_offd; jj < jj_end_row_offd; jj++) { P_offd_data[jj] /= -diagonal; } } } strong_f_marker--; } if (debug_flag == 4) { wall_time = time_getWallclockSeconds() - wall_time; hypre_printf("Proc = %d fill structure %f\n", my_id, wall_time); fflush(NULL); } /*----------------------------------------------------------------------- * Allocate arrays. *-----------------------------------------------------------------------*/ P = hypre_ParCSRMatrixCreate(comm, total_old_global_cpts, total_global_cpts, num_old_cpts_global, num_cpts_global, 0, P_diag_i[n_coarse_old], P_offd_i[n_coarse_old]); P_diag = hypre_ParCSRMatrixDiag(P); hypre_CSRMatrixData(P_diag) = P_diag_data; hypre_CSRMatrixI(P_diag) = P_diag_i; hypre_CSRMatrixJ(P_diag) = P_diag_j; P_offd = hypre_ParCSRMatrixOffd(P); hypre_CSRMatrixData(P_offd) = P_offd_data; hypre_CSRMatrixI(P_offd) = P_offd_i; hypre_CSRMatrixJ(P_offd) = P_offd_j; hypre_CSRMatrixMemoryLocation(P_diag) = HYPRE_MEMORY_HOST; hypre_CSRMatrixMemoryLocation(P_offd) = HYPRE_MEMORY_HOST; /* Compress P, removing coefficients smaller than trunc_factor * Max */ if (trunc_factor != 0.0 || max_elmts > 0) { hypre_BoomerAMGInterpTruncation(P, trunc_factor, max_elmts); P_diag_data = hypre_CSRMatrixData(P_diag); P_diag_i = hypre_CSRMatrixI(P_diag); P_diag_j = hypre_CSRMatrixJ(P_diag); P_offd_data = hypre_CSRMatrixData(P_offd); P_offd_i = hypre_CSRMatrixI(P_offd); P_offd_j = hypre_CSRMatrixJ(P_offd); P_diag_size = P_diag_i[n_coarse_old]; P_offd_size = P_offd_i[n_coarse_old]; } /* This builds col_map, col_map should be monotone increasing and contain * global numbers. */ if (P_offd_size) { hypre_build_interp_colmap(P, full_off_procNodes, tmp_CF_marker_offd, fine_to_coarse_offd); } hypre_MatvecCommPkgCreate(P); for (i = 0; i < n_fine; i++) if (CF_marker[i] < -1) { CF_marker[i] = -1; } *P_ptr = P; /* Deallocate memory */ hypre_TFree(fine_to_coarse, HYPRE_MEMORY_HOST); hypre_TFree(old_coarse_to_fine, HYPRE_MEMORY_HOST); hypre_TFree(P_marker, HYPRE_MEMORY_HOST); if (num_procs > 1) { hypre_CSRMatrixDestroy(Sop); hypre_CSRMatrixDestroy(A_ext); hypre_TFree(fine_to_coarse_offd, HYPRE_MEMORY_HOST); hypre_TFree(P_marker_offd, HYPRE_MEMORY_HOST); hypre_TFree(CF_marker_offd, HYPRE_MEMORY_HOST); hypre_TFree(tmp_CF_marker_offd, HYPRE_MEMORY_HOST); if (num_functions > 1) { hypre_TFree(dof_func_offd, HYPRE_MEMORY_HOST); } hypre_MatvecCommPkgDestroy(extend_comm_pkg); } return hypre_error_flag; } hypre-2.33.0/src/parcsr_ls/protos.h000066400000000000000000007050451477326011500172250ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /* ads.c */ void *hypre_ADSCreate ( void ); HYPRE_Int hypre_ADSDestroy ( void *solver ); HYPRE_Int hypre_ADSSetDiscreteCurl ( void *solver, hypre_ParCSRMatrix *C ); HYPRE_Int hypre_ADSSetDiscreteGradient ( void *solver, hypre_ParCSRMatrix *G ); HYPRE_Int hypre_ADSSetCoordinateVectors ( void *solver, hypre_ParVector *x, hypre_ParVector *y, hypre_ParVector *z ); HYPRE_Int hypre_ADSSetInterpolations ( void *solver, hypre_ParCSRMatrix *RT_Pi, hypre_ParCSRMatrix *RT_Pix, hypre_ParCSRMatrix *RT_Piy, hypre_ParCSRMatrix *RT_Piz, hypre_ParCSRMatrix *ND_Pi, hypre_ParCSRMatrix *ND_Pix, hypre_ParCSRMatrix *ND_Piy, hypre_ParCSRMatrix *ND_Piz ); HYPRE_Int hypre_ADSSetMaxIter ( void *solver, HYPRE_Int maxit ); HYPRE_Int hypre_ADSSetTol ( void *solver, HYPRE_Real tol ); HYPRE_Int hypre_ADSSetCycleType ( void *solver, HYPRE_Int cycle_type ); HYPRE_Int hypre_ADSSetPrintLevel ( void *solver, HYPRE_Int print_level ); HYPRE_Int hypre_ADSSetSmoothingOptions ( void *solver, HYPRE_Int A_relax_type, HYPRE_Int A_relax_times, HYPRE_Real A_relax_weight, HYPRE_Real A_omega ); HYPRE_Int hypre_ADSSetChebySmoothingOptions ( void *solver, HYPRE_Int A_cheby_order, HYPRE_Real A_cheby_fraction ); HYPRE_Int hypre_ADSSetAMSOptions ( void *solver, HYPRE_Int B_C_cycle_type, HYPRE_Int B_C_coarsen_type, HYPRE_Int B_C_agg_levels, HYPRE_Int B_C_relax_type, HYPRE_Real B_C_theta, HYPRE_Int B_C_interp_type, HYPRE_Int B_C_Pmax ); HYPRE_Int hypre_ADSSetAMGOptions ( void *solver, HYPRE_Int B_Pi_coarsen_type, HYPRE_Int B_Pi_agg_levels, HYPRE_Int B_Pi_relax_type, HYPRE_Real B_Pi_theta, HYPRE_Int B_Pi_interp_type, HYPRE_Int B_Pi_Pmax ); HYPRE_Int hypre_ADSComputePi ( hypre_ParCSRMatrix *A, hypre_ParCSRMatrix *C, hypre_ParCSRMatrix *G, hypre_ParVector *x, hypre_ParVector *y, hypre_ParVector *z, hypre_ParCSRMatrix *PiNDx, hypre_ParCSRMatrix *PiNDy, hypre_ParCSRMatrix *PiNDz, hypre_ParCSRMatrix **Pi_ptr ); HYPRE_Int hypre_ADSComputePixyz ( hypre_ParCSRMatrix *A, hypre_ParCSRMatrix *C, hypre_ParCSRMatrix *G, hypre_ParVector *x, hypre_ParVector *y, hypre_ParVector *z, hypre_ParCSRMatrix *PiNDx, hypre_ParCSRMatrix *PiNDy, hypre_ParCSRMatrix *PiNDz, hypre_ParCSRMatrix **Pix_ptr, hypre_ParCSRMatrix **Piy_ptr, hypre_ParCSRMatrix **Piz_ptr ); HYPRE_Int hypre_ADSSetup ( void *solver, hypre_ParCSRMatrix *A, hypre_ParVector *b, hypre_ParVector *x ); HYPRE_Int hypre_ADSSolve ( void *solver, hypre_ParCSRMatrix *A, hypre_ParVector *b, hypre_ParVector *x ); HYPRE_Int hypre_ADSGetNumIterations ( void *solver, HYPRE_Int *num_iterations ); HYPRE_Int hypre_ADSGetFinalRelativeResidualNorm ( void *solver, HYPRE_Real *rel_resid_norm ); /* ame.c */ void *hypre_AMECreate ( void ); HYPRE_Int hypre_AMEDestroy ( void *esolver ); HYPRE_Int hypre_AMESetAMSSolver ( void *esolver, void *ams_solver ); HYPRE_Int hypre_AMESetMassMatrix ( void *esolver, hypre_ParCSRMatrix *M ); HYPRE_Int hypre_AMESetBlockSize ( void *esolver, HYPRE_Int block_size ); HYPRE_Int hypre_AMESetMaxIter ( void *esolver, HYPRE_Int maxit ); HYPRE_Int hypre_AMESetMaxPCGIter ( void *esolver, HYPRE_Int maxit ); HYPRE_Int hypre_AMESetTol ( void *esolver, HYPRE_Real tol ); HYPRE_Int hypre_AMESetRTol ( void *esolver, HYPRE_Real tol ); HYPRE_Int hypre_AMESetPrintLevel ( void *esolver, HYPRE_Int print_level ); HYPRE_Int hypre_AMESetup ( void *esolver ); HYPRE_Int hypre_AMEDiscrDivFreeComponent ( void *esolver, hypre_ParVector *b ); void hypre_AMEOperatorA ( void *data, void *x, void *y ); void hypre_AMEMultiOperatorA ( void *data, void *x, void *y ); void hypre_AMEOperatorM ( void *data, void *x, void *y ); void hypre_AMEMultiOperatorM ( void *data, void *x, void *y ); void hypre_AMEOperatorB ( void *data, void *x, void *y ); void hypre_AMEMultiOperatorB ( void *data, void *x, void *y ); HYPRE_Int hypre_AMESolve ( void *esolver ); HYPRE_Int hypre_AMEGetEigenvectors ( void *esolver, HYPRE_ParVector **eigenvectors_ptr ); HYPRE_Int hypre_AMEGetEigenvalues ( void *esolver, HYPRE_Real **eigenvalues_ptr ); /* amg_hybrid.c */ void *hypre_AMGHybridCreate ( void ); HYPRE_Int hypre_AMGHybridDestroy ( void *AMGhybrid_vdata ); HYPRE_Int hypre_AMGHybridSetTol ( void *AMGhybrid_vdata, HYPRE_Real tol ); HYPRE_Int hypre_AMGHybridSetAbsoluteTol ( void *AMGhybrid_vdata, HYPRE_Real a_tol ); HYPRE_Int hypre_AMGHybridSetConvergenceTol ( void *AMGhybrid_vdata, HYPRE_Real cf_tol ); HYPRE_Int hypre_AMGHybridSetNonGalerkinTol ( void *AMGhybrid_vdata, HYPRE_Int nongalerk_num_tol, HYPRE_Real *nongalerkin_tol ); HYPRE_Int hypre_AMGHybridSetDSCGMaxIter ( void *AMGhybrid_vdata, HYPRE_Int dscg_max_its ); HYPRE_Int hypre_AMGHybridSetPCGMaxIter ( void *AMGhybrid_vdata, HYPRE_Int pcg_max_its ); HYPRE_Int hypre_AMGHybridSetSetupType ( void *AMGhybrid_vdata, HYPRE_Int setup_type ); HYPRE_Int hypre_AMGHybridSetSolverType ( void *AMGhybrid_vdata, HYPRE_Int solver_type ); HYPRE_Int hypre_AMGHybridSetRecomputeResidual ( void *AMGhybrid_vdata, HYPRE_Int recompute_residual ); HYPRE_Int hypre_AMGHybridGetRecomputeResidual ( void *AMGhybrid_vdata, HYPRE_Int *recompute_residual ); HYPRE_Int hypre_AMGHybridSetRecomputeResidualP ( void *AMGhybrid_vdata, HYPRE_Int recompute_residual_p ); HYPRE_Int hypre_AMGHybridGetRecomputeResidualP ( void *AMGhybrid_vdata, HYPRE_Int *recompute_residual_p ); HYPRE_Int hypre_AMGHybridSetKDim ( void *AMGhybrid_vdata, HYPRE_Int k_dim ); HYPRE_Int hypre_AMGHybridSetStopCrit ( void *AMGhybrid_vdata, HYPRE_Int stop_crit ); HYPRE_Int hypre_AMGHybridSetTwoNorm ( void *AMGhybrid_vdata, HYPRE_Int two_norm ); HYPRE_Int hypre_AMGHybridSetRelChange ( void *AMGhybrid_vdata, HYPRE_Int rel_change ); HYPRE_Int hypre_AMGHybridSetPrecond ( void *pcg_vdata, HYPRE_Int (*pcg_precond_solve )(void*, void*, void*, void*), HYPRE_Int (*pcg_precond_setup )(void*, void*, void*, void*), void *pcg_precond ); HYPRE_Int hypre_AMGHybridSetLogging ( void *AMGhybrid_vdata, HYPRE_Int logging ); HYPRE_Int hypre_AMGHybridSetPrintLevel ( void *AMGhybrid_vdata, HYPRE_Int print_level ); HYPRE_Int hypre_AMGHybridSetStrongThreshold ( void *AMGhybrid_vdata, HYPRE_Real strong_threshold ); HYPRE_Int hypre_AMGHybridSetMaxRowSum ( void *AMGhybrid_vdata, HYPRE_Real max_row_sum ); HYPRE_Int hypre_AMGHybridSetTruncFactor ( void *AMGhybrid_vdata, HYPRE_Real trunc_factor ); HYPRE_Int hypre_AMGHybridSetPMaxElmts ( void *AMGhybrid_vdata, HYPRE_Int P_max_elmts ); HYPRE_Int hypre_AMGHybridSetMaxLevels ( void *AMGhybrid_vdata, HYPRE_Int max_levels ); HYPRE_Int hypre_AMGHybridSetMeasureType ( void *AMGhybrid_vdata, HYPRE_Int measure_type ); HYPRE_Int hypre_AMGHybridSetCoarsenType ( void *AMGhybrid_vdata, HYPRE_Int coarsen_type ); HYPRE_Int hypre_AMGHybridSetInterpType ( void *AMGhybrid_vdata, HYPRE_Int interp_type ); HYPRE_Int hypre_AMGHybridSetCycleType ( void *AMGhybrid_vdata, HYPRE_Int cycle_type ); HYPRE_Int hypre_AMGHybridSetNumSweeps ( void *AMGhybrid_vdata, HYPRE_Int num_sweeps ); HYPRE_Int hypre_AMGHybridSetCycleNumSweeps ( void *AMGhybrid_vdata, HYPRE_Int num_sweeps, HYPRE_Int k ); HYPRE_Int hypre_AMGHybridSetRelaxType ( void *AMGhybrid_vdata, HYPRE_Int relax_type ); HYPRE_Int hypre_AMGHybridSetKeepTranspose ( void *AMGhybrid_vdata, HYPRE_Int keepT ); HYPRE_Int hypre_AMGHybridSetSplittingStrategy( void *AMGhybrid_vdata, HYPRE_Int splitting_strategy ); HYPRE_Int hypre_AMGHybridSetCycleRelaxType ( void *AMGhybrid_vdata, HYPRE_Int relax_type, HYPRE_Int k ); HYPRE_Int hypre_AMGHybridSetRelaxOrder ( void *AMGhybrid_vdata, HYPRE_Int relax_order ); HYPRE_Int hypre_AMGHybridSetMaxCoarseSize ( void *AMGhybrid_vdata, HYPRE_Int max_coarse_size ); HYPRE_Int hypre_AMGHybridSetMinCoarseSize ( void *AMGhybrid_vdata, HYPRE_Int min_coarse_size ); HYPRE_Int hypre_AMGHybridSetSeqThreshold ( void *AMGhybrid_vdata, HYPRE_Int seq_threshold ); HYPRE_Int hypre_AMGHybridSetNumGridSweeps ( void *AMGhybrid_vdata, HYPRE_Int *num_grid_sweeps ); HYPRE_Int hypre_AMGHybridSetGridRelaxType ( void *AMGhybrid_vdata, HYPRE_Int *grid_relax_type ); HYPRE_Int hypre_AMGHybridSetGridRelaxPoints ( void *AMGhybrid_vdata, HYPRE_Int **grid_relax_points ); HYPRE_Int hypre_AMGHybridSetRelaxWeight ( void *AMGhybrid_vdata, HYPRE_Real *relax_weight ); HYPRE_Int hypre_AMGHybridSetOmega ( void *AMGhybrid_vdata, HYPRE_Real *omega ); HYPRE_Int hypre_AMGHybridSetRelaxWt ( void *AMGhybrid_vdata, HYPRE_Real relax_wt ); HYPRE_Int hypre_AMGHybridSetLevelRelaxWt ( void *AMGhybrid_vdata, HYPRE_Real relax_wt, HYPRE_Int level ); HYPRE_Int hypre_AMGHybridSetOuterWt ( void *AMGhybrid_vdata, HYPRE_Real outer_wt ); HYPRE_Int hypre_AMGHybridSetLevelOuterWt ( void *AMGhybrid_vdata, HYPRE_Real outer_wt, HYPRE_Int level ); HYPRE_Int hypre_AMGHybridSetNumPaths ( void *AMGhybrid_vdata, HYPRE_Int num_paths ); HYPRE_Int hypre_AMGHybridSetDofFunc ( void *AMGhybrid_vdata, HYPRE_Int *dof_func ); HYPRE_Int hypre_AMGHybridSetAggNumLevels ( void *AMGhybrid_vdata, HYPRE_Int agg_num_levels ); HYPRE_Int hypre_AMGHybridSetAggInterpType ( void *AMGhybrid_vdata, HYPRE_Int agg_interp_type ); HYPRE_Int hypre_AMGHybridSetNumFunctions ( void *AMGhybrid_vdata, HYPRE_Int num_functions ); HYPRE_Int hypre_AMGHybridSetNodal ( void *AMGhybrid_vdata, HYPRE_Int nodal ); HYPRE_Int hypre_AMGHybridGetSetupSolveTime( void *AMGhybrid_vdata, HYPRE_Real *time ); HYPRE_Int hypre_AMGHybridGetNumIterations ( void *AMGhybrid_vdata, HYPRE_Int *num_its ); HYPRE_Int hypre_AMGHybridGetDSCGNumIterations ( void *AMGhybrid_vdata, HYPRE_Int *dscg_num_its ); HYPRE_Int hypre_AMGHybridGetPCGNumIterations ( void *AMGhybrid_vdata, HYPRE_Int *pcg_num_its ); HYPRE_Int hypre_AMGHybridGetFinalRelativeResidualNorm ( void *AMGhybrid_vdata, HYPRE_Real *final_rel_res_norm ); HYPRE_Int hypre_AMGHybridSetup ( void *AMGhybrid_vdata, hypre_ParCSRMatrix *A, hypre_ParVector *b, hypre_ParVector *x ); HYPRE_Int hypre_AMGHybridSolve ( void *AMGhybrid_vdata, hypre_ParCSRMatrix *A, hypre_ParVector *b, hypre_ParVector *x ); /* ams.c */ HYPRE_Int hypre_ParCSRRelax ( hypre_ParCSRMatrix *A, hypre_ParVector *f, HYPRE_Int relax_type, HYPRE_Int relax_times, HYPRE_Real *l1_norms, HYPRE_Real relax_weight, HYPRE_Real omega, HYPRE_Real max_eig_est, HYPRE_Real min_eig_est, HYPRE_Int cheby_order, HYPRE_Real cheby_fraction, hypre_ParVector *u, hypre_ParVector *v, hypre_ParVector *z ); hypre_ParVector *hypre_ParVectorInRangeOf ( hypre_ParCSRMatrix *A ); hypre_ParVector *hypre_ParVectorInDomainOf ( hypre_ParCSRMatrix *A ); HYPRE_Int hypre_ParVectorBlockSplit ( hypre_ParVector *x, hypre_ParVector *x_ [3 ], HYPRE_Int dim ); HYPRE_Int hypre_ParVectorBlockGather ( hypre_ParVector *x, hypre_ParVector *x_ [3 ], HYPRE_Int dim ); HYPRE_Int hypre_BoomerAMGBlockSolve ( void *B, hypre_ParCSRMatrix *A, hypre_ParVector *b, hypre_ParVector *x ); HYPRE_Int hypre_ParCSRMatrixFixZeroRows ( hypre_ParCSRMatrix *A ); HYPRE_Int hypre_ParCSRComputeL1Norms ( hypre_ParCSRMatrix *A, HYPRE_Int option, HYPRE_Int *cf_marker, HYPRE_Real **l1_norm_ptr ); HYPRE_Int hypre_ParCSRMatrixSetDiagRows ( hypre_ParCSRMatrix *A, HYPRE_Real d ); void *hypre_AMSCreate ( void ); HYPRE_Int hypre_AMSDestroy ( void *solver ); HYPRE_Int hypre_AMSSetDimension ( void *solver, HYPRE_Int dim ); HYPRE_Int hypre_AMSSetDiscreteGradient ( void *solver, hypre_ParCSRMatrix *G ); HYPRE_Int hypre_AMSSetCoordinateVectors ( void *solver, hypre_ParVector *x, hypre_ParVector *y, hypre_ParVector *z ); HYPRE_Int hypre_AMSSetEdgeConstantVectors ( void *solver, hypre_ParVector *Gx, hypre_ParVector *Gy, hypre_ParVector *Gz ); HYPRE_Int hypre_AMSSetInterpolations ( void *solver, hypre_ParCSRMatrix *Pi, hypre_ParCSRMatrix *Pix, hypre_ParCSRMatrix *Piy, hypre_ParCSRMatrix *Piz ); HYPRE_Int hypre_AMSSetAlphaPoissonMatrix ( void *solver, hypre_ParCSRMatrix *A_Pi ); HYPRE_Int hypre_AMSSetBetaPoissonMatrix ( void *solver, hypre_ParCSRMatrix *A_G ); HYPRE_Int hypre_AMSSetInteriorNodes ( void *solver, hypre_ParVector *interior_nodes ); HYPRE_Int hypre_AMSSetProjectionFrequency ( void *solver, HYPRE_Int projection_frequency ); HYPRE_Int hypre_AMSSetMaxIter ( void *solver, HYPRE_Int maxit ); HYPRE_Int hypre_AMSSetTol ( void *solver, HYPRE_Real tol ); HYPRE_Int hypre_AMSSetCycleType ( void *solver, HYPRE_Int cycle_type ); HYPRE_Int hypre_AMSSetPrintLevel ( void *solver, HYPRE_Int print_level ); HYPRE_Int hypre_AMSSetSmoothingOptions ( void *solver, HYPRE_Int A_relax_type, HYPRE_Int A_relax_times, HYPRE_Real A_relax_weight, HYPRE_Real A_omega ); HYPRE_Int hypre_AMSSetChebySmoothingOptions ( void *solver, HYPRE_Int A_cheby_order, HYPRE_Real A_cheby_fraction ); HYPRE_Int hypre_AMSSetAlphaAMGOptions ( void *solver, HYPRE_Int B_Pi_coarsen_type, HYPRE_Int B_Pi_agg_levels, HYPRE_Int B_Pi_relax_type, HYPRE_Real B_Pi_theta, HYPRE_Int B_Pi_interp_type, HYPRE_Int B_Pi_Pmax ); HYPRE_Int hypre_AMSSetAlphaAMGCoarseRelaxType ( void *solver, HYPRE_Int B_Pi_coarse_relax_type ); HYPRE_Int hypre_AMSSetBetaAMGOptions ( void *solver, HYPRE_Int B_G_coarsen_type, HYPRE_Int B_G_agg_levels, HYPRE_Int B_G_relax_type, HYPRE_Real B_G_theta, HYPRE_Int B_G_interp_type, HYPRE_Int B_G_Pmax ); HYPRE_Int hypre_AMSSetBetaAMGCoarseRelaxType ( void *solver, HYPRE_Int B_G_coarse_relax_type ); HYPRE_Int hypre_AMSComputePi ( hypre_ParCSRMatrix *A, hypre_ParCSRMatrix *G, hypre_ParVector *Gx, hypre_ParVector *Gy, hypre_ParVector *Gz, HYPRE_Int dim, hypre_ParCSRMatrix **Pi_ptr ); HYPRE_Int hypre_AMSComputePixyz ( hypre_ParCSRMatrix *A, hypre_ParCSRMatrix *G, hypre_ParVector *Gx, hypre_ParVector *Gy, hypre_ParVector *Gz, HYPRE_Int dim, hypre_ParCSRMatrix **Pix_ptr, hypre_ParCSRMatrix **Piy_ptr, hypre_ParCSRMatrix **Piz_ptr ); HYPRE_Int hypre_AMSComputeGPi ( hypre_ParCSRMatrix *A, hypre_ParCSRMatrix *G, hypre_ParVector *Gx, hypre_ParVector *Gy, hypre_ParVector *Gz, HYPRE_Int dim, hypre_ParCSRMatrix **GPi_ptr ); HYPRE_Int hypre_AMSSetup ( void *solver, hypre_ParCSRMatrix *A, hypre_ParVector *b, hypre_ParVector *x ); HYPRE_Int hypre_AMSSolve ( void *solver, hypre_ParCSRMatrix *A, hypre_ParVector *b, hypre_ParVector *x ); HYPRE_Int hypre_ParCSRSubspacePrec ( hypre_ParCSRMatrix *A0, HYPRE_Int A0_relax_type, HYPRE_Int A0_relax_times, HYPRE_Real *A0_l1_norms, HYPRE_Real A0_relax_weight, HYPRE_Real A0_omega, HYPRE_Real A0_max_eig_est, HYPRE_Real A0_min_eig_est, HYPRE_Int A0_cheby_order, HYPRE_Real A0_cheby_fraction, hypre_ParCSRMatrix **A, HYPRE_Solver *B, HYPRE_PtrToSolverFcn *HB, hypre_ParCSRMatrix **P, hypre_ParVector **r, hypre_ParVector **g, hypre_ParVector *x, hypre_ParVector *y, hypre_ParVector *r0, hypre_ParVector *g0, char *cycle, hypre_ParVector *z ); HYPRE_Int hypre_AMSGetNumIterations ( void *solver, HYPRE_Int *num_iterations ); HYPRE_Int hypre_AMSGetFinalRelativeResidualNorm ( void *solver, HYPRE_Real *rel_resid_norm ); HYPRE_Int hypre_AMSProjectOutGradients ( void *solver, hypre_ParVector *x ); HYPRE_Int hypre_AMSConstructDiscreteGradient ( hypre_ParCSRMatrix *A, hypre_ParVector *x_coord, HYPRE_BigInt *edge_vertex, HYPRE_Int edge_orientation, hypre_ParCSRMatrix **G_ptr ); HYPRE_Int hypre_AMSFEISetup ( void *solver, hypre_ParCSRMatrix *A, hypre_ParVector *b, hypre_ParVector *x, HYPRE_Int num_vert, HYPRE_Int num_local_vert, HYPRE_BigInt *vert_number, HYPRE_Real *vert_coord, HYPRE_Int num_edges, HYPRE_BigInt *edge_vertex ); HYPRE_Int hypre_AMSFEIDestroy ( void *solver ); HYPRE_Int hypre_ParCSRComputeL1NormsThreads ( hypre_ParCSRMatrix *A, HYPRE_Int option, HYPRE_Int num_threads, HYPRE_Int *cf_marker, HYPRE_Real **l1_norm_ptr ); /* aux_interp.c */ HYPRE_Int hypre_alt_insert_new_nodes ( hypre_ParCSRCommPkg *comm_pkg, hypre_ParCSRCommPkg *extend_comm_pkg, HYPRE_Int *IN_marker, HYPRE_Int full_off_procNodes, HYPRE_Int *OUT_marker ); HYPRE_Int hypre_big_insert_new_nodes ( hypre_ParCSRCommPkg *comm_pkg, hypre_ParCSRCommPkg *extend_comm_pkg, HYPRE_Int *IN_marker, HYPRE_Int full_off_procNodes, HYPRE_BigInt offset, HYPRE_BigInt *OUT_marker ); HYPRE_Int hypre_ssort ( HYPRE_BigInt *data, HYPRE_Int n ); HYPRE_Int hypre_index_of_minimum ( HYPRE_BigInt *data, HYPRE_Int n ); void hypre_swap_int ( HYPRE_BigInt *data, HYPRE_Int a, HYPRE_Int b ); void hypre_initialize_vecs ( HYPRE_Int diag_n, HYPRE_Int offd_n, HYPRE_Int *diag_ftc, HYPRE_BigInt *offd_ftc, HYPRE_Int *diag_pm, HYPRE_Int *offd_pm, HYPRE_Int *tmp_CF ); /*HYPRE_Int hypre_new_offd_nodes(HYPRE_Int **found , HYPRE_Int num_cols_A_offd , HYPRE_Int *A_ext_i , HYPRE_Int *A_ext_j, HYPRE_Int num_cols_S_offd, HYPRE_Int *col_map_offd, HYPRE_Int col_1, HYPRE_Int col_n, HYPRE_Int *Sop_i, HYPRE_Int *Sop_j, HYPRE_Int *CF_marker_offd );*/ HYPRE_Int hypre_exchange_marker(hypre_ParCSRCommPkg *comm_pkg, HYPRE_Int *IN_marker, HYPRE_Int *OUT_marker); HYPRE_Int hypre_exchange_interp_data( HYPRE_Int **CF_marker_offd, HYPRE_Int **dof_func_offd, hypre_CSRMatrix **A_ext, HYPRE_Int *full_off_procNodes, hypre_CSRMatrix **Sop, hypre_ParCSRCommPkg **extend_comm_pkg, hypre_ParCSRMatrix *A, HYPRE_Int *CF_marker, hypre_ParCSRMatrix *S, HYPRE_Int num_functions, HYPRE_Int *dof_func, HYPRE_Int skip_fine_or_same_sign); void hypre_build_interp_colmap(hypre_ParCSRMatrix *P, HYPRE_Int full_off_procNodes, HYPRE_Int *tmp_CF_marker_offd, HYPRE_BigInt *fine_to_coarse_offd); /* block_tridiag.c */ void *hypre_BlockTridiagCreate ( void ); HYPRE_Int hypre_BlockTridiagDestroy ( void *data ); HYPRE_Int hypre_BlockTridiagSetup ( void *data, hypre_ParCSRMatrix *A, hypre_ParVector *b, hypre_ParVector *x ); HYPRE_Int hypre_BlockTridiagSolve ( void *data, hypre_ParCSRMatrix *A, hypre_ParVector *b, hypre_ParVector *x ); HYPRE_Int hypre_BlockTridiagSetIndexSet ( void *data, HYPRE_Int n, HYPRE_Int *inds ); HYPRE_Int hypre_BlockTridiagSetAMGStrengthThreshold ( void *data, HYPRE_Real thresh ); HYPRE_Int hypre_BlockTridiagSetAMGNumSweeps ( void *data, HYPRE_Int nsweeps ); HYPRE_Int hypre_BlockTridiagSetAMGRelaxType ( void *data, HYPRE_Int relax_type ); HYPRE_Int hypre_BlockTridiagSetPrintLevel ( void *data, HYPRE_Int print_level ); /* driver.c */ HYPRE_Int BuildParFromFile ( HYPRE_Int argc, char *argv [], HYPRE_Int arg_index, HYPRE_ParCSRMatrix *A_ptr ); HYPRE_Int BuildParLaplacian ( HYPRE_Int argc, char *argv [], HYPRE_Int arg_index, HYPRE_ParCSRMatrix *A_ptr ); HYPRE_Int BuildParDifConv ( HYPRE_Int argc, char *argv [], HYPRE_Int arg_index, HYPRE_ParCSRMatrix *A_ptr ); HYPRE_Int BuildParFromOneFile ( HYPRE_Int argc, char *argv [], HYPRE_Int arg_index, HYPRE_ParCSRMatrix *A_ptr ); HYPRE_Int BuildRhsParFromOneFile ( HYPRE_Int argc, char *argv [], HYPRE_Int arg_index, HYPRE_ParCSRMatrix A, HYPRE_ParVector *b_ptr ); HYPRE_Int BuildParLaplacian9pt ( HYPRE_Int argc, char *argv [], HYPRE_Int arg_index, HYPRE_ParCSRMatrix *A_ptr ); HYPRE_Int BuildParLaplacian27pt ( HYPRE_Int argc, char *argv [], HYPRE_Int arg_index, HYPRE_ParCSRMatrix *A_ptr ); /* gen_redcs_mat.c */ HYPRE_Int hypre_seqAMGSetup ( hypre_ParAMGData *amg_data, HYPRE_Int p_level, HYPRE_Int coarse_threshold ); HYPRE_Int hypre_seqAMGCycle ( hypre_ParAMGData *amg_data, HYPRE_Int p_level, hypre_ParVector **Par_F_array, hypre_ParVector **Par_U_array ); HYPRE_Int hypre_GenerateSubComm ( MPI_Comm comm, HYPRE_Int participate, MPI_Comm *new_comm_ptr ); void hypre_merge_lists ( HYPRE_Int *list1, HYPRE_Int *list2, hypre_int *np1, hypre_MPI_Datatype *dptr ); /* HYPRE_ads.c */ HYPRE_Int HYPRE_ADSCreate ( HYPRE_Solver *solver ); HYPRE_Int HYPRE_ADSDestroy ( HYPRE_Solver solver ); HYPRE_Int HYPRE_ADSSetup ( HYPRE_Solver solver, HYPRE_ParCSRMatrix A, HYPRE_ParVector b, HYPRE_ParVector x ); HYPRE_Int HYPRE_ADSSolve ( HYPRE_Solver solver, HYPRE_ParCSRMatrix A, HYPRE_ParVector b, HYPRE_ParVector x ); HYPRE_Int HYPRE_ADSSetDiscreteCurl ( HYPRE_Solver solver, HYPRE_ParCSRMatrix C ); HYPRE_Int HYPRE_ADSSetDiscreteGradient ( HYPRE_Solver solver, HYPRE_ParCSRMatrix G ); HYPRE_Int HYPRE_ADSSetCoordinateVectors ( HYPRE_Solver solver, HYPRE_ParVector x, HYPRE_ParVector y, HYPRE_ParVector z ); HYPRE_Int HYPRE_ADSSetInterpolations ( HYPRE_Solver solver, HYPRE_ParCSRMatrix RT_Pi, HYPRE_ParCSRMatrix RT_Pix, HYPRE_ParCSRMatrix RT_Piy, HYPRE_ParCSRMatrix RT_Piz, HYPRE_ParCSRMatrix ND_Pi, HYPRE_ParCSRMatrix ND_Pix, HYPRE_ParCSRMatrix ND_Piy, HYPRE_ParCSRMatrix ND_Piz ); HYPRE_Int HYPRE_ADSSetMaxIter ( HYPRE_Solver solver, HYPRE_Int maxit ); HYPRE_Int HYPRE_ADSSetTol ( HYPRE_Solver solver, HYPRE_Real tol ); HYPRE_Int HYPRE_ADSSetCycleType ( HYPRE_Solver solver, HYPRE_Int cycle_type ); HYPRE_Int HYPRE_ADSSetPrintLevel ( HYPRE_Solver solver, HYPRE_Int print_level ); HYPRE_Int HYPRE_ADSSetSmoothingOptions ( HYPRE_Solver solver, HYPRE_Int relax_type, HYPRE_Int relax_times, HYPRE_Real relax_weight, HYPRE_Real omega ); HYPRE_Int HYPRE_ADSSetChebySmoothingOptions ( HYPRE_Solver solver, HYPRE_Int cheby_order, HYPRE_Real cheby_fraction ); HYPRE_Int HYPRE_ADSSetAMSOptions ( HYPRE_Solver solver, HYPRE_Int cycle_type, HYPRE_Int coarsen_type, HYPRE_Int agg_levels, HYPRE_Int relax_type, HYPRE_Real strength_threshold, HYPRE_Int interp_type, HYPRE_Int Pmax ); HYPRE_Int HYPRE_ADSSetAMGOptions ( HYPRE_Solver solver, HYPRE_Int coarsen_type, HYPRE_Int agg_levels, HYPRE_Int relax_type, HYPRE_Real strength_threshold, HYPRE_Int interp_type, HYPRE_Int Pmax ); HYPRE_Int HYPRE_ADSGetNumIterations ( HYPRE_Solver solver, HYPRE_Int *num_iterations ); HYPRE_Int HYPRE_ADSGetFinalRelativeResidualNorm ( HYPRE_Solver solver, HYPRE_Real *rel_resid_norm ); /* HYPRE_ame.c */ HYPRE_Int HYPRE_AMECreate ( HYPRE_Solver *esolver ); HYPRE_Int HYPRE_AMEDestroy ( HYPRE_Solver esolver ); HYPRE_Int HYPRE_AMESetup ( HYPRE_Solver esolver ); HYPRE_Int HYPRE_AMESolve ( HYPRE_Solver esolver ); HYPRE_Int HYPRE_AMESetAMSSolver ( HYPRE_Solver esolver, HYPRE_Solver ams_solver ); HYPRE_Int HYPRE_AMESetMassMatrix ( HYPRE_Solver esolver, HYPRE_ParCSRMatrix M ); HYPRE_Int HYPRE_AMESetBlockSize ( HYPRE_Solver esolver, HYPRE_Int block_size ); HYPRE_Int HYPRE_AMESetMaxIter ( HYPRE_Solver esolver, HYPRE_Int maxit ); HYPRE_Int HYPRE_AMESetMaxPCGIter ( HYPRE_Solver esolver, HYPRE_Int maxit ); HYPRE_Int HYPRE_AMESetTol ( HYPRE_Solver esolver, HYPRE_Real tol ); HYPRE_Int HYPRE_AMESetRTol ( HYPRE_Solver esolver, HYPRE_Real tol ); HYPRE_Int HYPRE_AMESetPrintLevel ( HYPRE_Solver esolver, HYPRE_Int print_level ); HYPRE_Int HYPRE_AMEGetEigenvalues ( HYPRE_Solver esolver, HYPRE_Real **eigenvalues ); HYPRE_Int HYPRE_AMEGetEigenvectors ( HYPRE_Solver esolver, HYPRE_ParVector **eigenvectors ); /* HYPRE_ams.c */ HYPRE_Int HYPRE_AMSCreate ( HYPRE_Solver *solver ); HYPRE_Int HYPRE_AMSDestroy ( HYPRE_Solver solver ); HYPRE_Int HYPRE_AMSSetup ( HYPRE_Solver solver, HYPRE_ParCSRMatrix A, HYPRE_ParVector b, HYPRE_ParVector x ); HYPRE_Int HYPRE_AMSSolve ( HYPRE_Solver solver, HYPRE_ParCSRMatrix A, HYPRE_ParVector b, HYPRE_ParVector x ); HYPRE_Int HYPRE_AMSSetDimension ( HYPRE_Solver solver, HYPRE_Int dim ); HYPRE_Int HYPRE_AMSSetDiscreteGradient ( HYPRE_Solver solver, HYPRE_ParCSRMatrix G ); HYPRE_Int HYPRE_AMSSetCoordinateVectors ( HYPRE_Solver solver, HYPRE_ParVector x, HYPRE_ParVector y, HYPRE_ParVector z ); HYPRE_Int HYPRE_AMSSetEdgeConstantVectors ( HYPRE_Solver solver, HYPRE_ParVector Gx, HYPRE_ParVector Gy, HYPRE_ParVector Gz ); HYPRE_Int HYPRE_AMSSetInterpolations ( HYPRE_Solver solver, HYPRE_ParCSRMatrix Pi, HYPRE_ParCSRMatrix Pix, HYPRE_ParCSRMatrix Piy, HYPRE_ParCSRMatrix Piz ); HYPRE_Int HYPRE_AMSSetAlphaPoissonMatrix ( HYPRE_Solver solver, HYPRE_ParCSRMatrix A_alpha ); HYPRE_Int HYPRE_AMSSetBetaPoissonMatrix ( HYPRE_Solver solver, HYPRE_ParCSRMatrix A_beta ); HYPRE_Int HYPRE_AMSSetInteriorNodes ( HYPRE_Solver solver, HYPRE_ParVector interior_nodes ); HYPRE_Int HYPRE_AMSSetProjectionFrequency ( HYPRE_Solver solver, HYPRE_Int projection_frequency ); HYPRE_Int HYPRE_AMSSetMaxIter ( HYPRE_Solver solver, HYPRE_Int maxit ); HYPRE_Int HYPRE_AMSSetTol ( HYPRE_Solver solver, HYPRE_Real tol ); HYPRE_Int HYPRE_AMSSetCycleType ( HYPRE_Solver solver, HYPRE_Int cycle_type ); HYPRE_Int HYPRE_AMSSetPrintLevel ( HYPRE_Solver solver, HYPRE_Int print_level ); HYPRE_Int HYPRE_AMSSetSmoothingOptions ( HYPRE_Solver solver, HYPRE_Int relax_type, HYPRE_Int relax_times, HYPRE_Real relax_weight, HYPRE_Real omega ); HYPRE_Int HYPRE_AMSSetChebySmoothingOptions ( HYPRE_Solver solver, HYPRE_Int cheby_order, HYPRE_Real cheby_fraction ); HYPRE_Int HYPRE_AMSSetAlphaAMGOptions ( HYPRE_Solver solver, HYPRE_Int alpha_coarsen_type, HYPRE_Int alpha_agg_levels, HYPRE_Int alpha_relax_type, HYPRE_Real alpha_strength_threshold, HYPRE_Int alpha_interp_type, HYPRE_Int alpha_Pmax ); HYPRE_Int HYPRE_AMSSetAlphaAMGCoarseRelaxType ( HYPRE_Solver solver, HYPRE_Int alpha_coarse_relax_type ); HYPRE_Int HYPRE_AMSSetBetaAMGOptions ( HYPRE_Solver solver, HYPRE_Int beta_coarsen_type, HYPRE_Int beta_agg_levels, HYPRE_Int beta_relax_type, HYPRE_Real beta_strength_threshold, HYPRE_Int beta_interp_type, HYPRE_Int beta_Pmax ); HYPRE_Int HYPRE_AMSSetBetaAMGCoarseRelaxType ( HYPRE_Solver solver, HYPRE_Int beta_coarse_relax_type ); HYPRE_Int HYPRE_AMSGetNumIterations ( HYPRE_Solver solver, HYPRE_Int *num_iterations ); HYPRE_Int HYPRE_AMSGetFinalRelativeResidualNorm ( HYPRE_Solver solver, HYPRE_Real *rel_resid_norm ); HYPRE_Int HYPRE_AMSProjectOutGradients ( HYPRE_Solver solver, HYPRE_ParVector x ); HYPRE_Int HYPRE_AMSConstructDiscreteGradient ( HYPRE_ParCSRMatrix A, HYPRE_ParVector x_coord, HYPRE_BigInt *edge_vertex, HYPRE_Int edge_orientation, HYPRE_ParCSRMatrix *G ); HYPRE_Int HYPRE_AMSFEISetup ( HYPRE_Solver solver, HYPRE_ParCSRMatrix A, HYPRE_ParVector b, HYPRE_ParVector x, HYPRE_BigInt *EdgeNodeList_, HYPRE_BigInt *NodeNumbers_, HYPRE_Int numEdges_, HYPRE_Int numLocalNodes_, HYPRE_Int numNodes_, HYPRE_Real *NodalCoord_ ); HYPRE_Int HYPRE_AMSFEIDestroy ( HYPRE_Solver solver ); /* HYPRE_parcsr_amg.c */ HYPRE_Int HYPRE_BoomerAMGCreate ( HYPRE_Solver *solver ); HYPRE_Int HYPRE_BoomerAMGDestroy ( HYPRE_Solver solver ); HYPRE_Int HYPRE_BoomerAMGSetup ( HYPRE_Solver solver, HYPRE_ParCSRMatrix A, HYPRE_ParVector b, HYPRE_ParVector x ); HYPRE_Int HYPRE_BoomerAMGSolve ( HYPRE_Solver solver, HYPRE_ParCSRMatrix A, HYPRE_ParVector b, HYPRE_ParVector x ); HYPRE_Int HYPRE_BoomerAMGSolveT ( HYPRE_Solver solver, HYPRE_ParCSRMatrix A, HYPRE_ParVector b, HYPRE_ParVector x ); HYPRE_Int HYPRE_BoomerAMGSetRestriction ( HYPRE_Solver solver, HYPRE_Int restr_par ); HYPRE_Int HYPRE_BoomerAMGSetIsTriangular ( HYPRE_Solver solver, HYPRE_Int is_triangular ); HYPRE_Int HYPRE_BoomerAMGSetGMRESSwitchR ( HYPRE_Solver solver, HYPRE_Int gmres_switch ); HYPRE_Int HYPRE_BoomerAMGSetMaxLevels ( HYPRE_Solver solver, HYPRE_Int max_levels ); HYPRE_Int HYPRE_BoomerAMGGetMaxLevels ( HYPRE_Solver solver, HYPRE_Int *max_levels ); HYPRE_Int HYPRE_BoomerAMGSetMaxCoarseSize ( HYPRE_Solver solver, HYPRE_Int max_coarse_size ); HYPRE_Int HYPRE_BoomerAMGGetMaxCoarseSize ( HYPRE_Solver solver, HYPRE_Int *max_coarse_size ); HYPRE_Int HYPRE_BoomerAMGSetMinCoarseSize ( HYPRE_Solver solver, HYPRE_Int min_coarse_size ); HYPRE_Int HYPRE_BoomerAMGGetMinCoarseSize ( HYPRE_Solver solver, HYPRE_Int *min_coarse_size ); HYPRE_Int HYPRE_BoomerAMGSetSeqThreshold ( HYPRE_Solver solver, HYPRE_Int seq_threshold ); HYPRE_Int HYPRE_BoomerAMGGetSeqThreshold ( HYPRE_Solver solver, HYPRE_Int *seq_threshold ); HYPRE_Int HYPRE_BoomerAMGSetRedundant ( HYPRE_Solver solver, HYPRE_Int redundant ); HYPRE_Int HYPRE_BoomerAMGGetRedundant ( HYPRE_Solver solver, HYPRE_Int *redundant ); HYPRE_Int HYPRE_BoomerAMGSetCoarsenCutFactor( HYPRE_Solver solver, HYPRE_Int coarsen_cut_factor ); HYPRE_Int HYPRE_BoomerAMGGetCoarsenCutFactor( HYPRE_Solver solver, HYPRE_Int *coarsen_cut_factor ); HYPRE_Int HYPRE_BoomerAMGSetStrongThreshold ( HYPRE_Solver solver, HYPRE_Real strong_threshold ); HYPRE_Int HYPRE_BoomerAMGGetStrongThreshold ( HYPRE_Solver solver, HYPRE_Real *strong_threshold ); HYPRE_Int HYPRE_BoomerAMGSetStrongThresholdR ( HYPRE_Solver solver, HYPRE_Real strong_threshold ); HYPRE_Int HYPRE_BoomerAMGGetStrongThresholdR ( HYPRE_Solver solver, HYPRE_Real *strong_threshold ); HYPRE_Int HYPRE_BoomerAMGSetFilterThresholdR ( HYPRE_Solver solver, HYPRE_Real filter_threshold ); HYPRE_Int HYPRE_BoomerAMGGetFilterThresholdR ( HYPRE_Solver solver, HYPRE_Real *filter_threshold ); HYPRE_Int HYPRE_BoomerAMGSetGMRESSwitchR ( HYPRE_Solver solver, HYPRE_Int gmres_switch ); HYPRE_Int HYPRE_BoomerAMGSetSabs ( HYPRE_Solver solver, HYPRE_Int Sabs ); HYPRE_Int HYPRE_BoomerAMGSetMaxRowSum ( HYPRE_Solver solver, HYPRE_Real max_row_sum ); HYPRE_Int HYPRE_BoomerAMGGetMaxRowSum ( HYPRE_Solver solver, HYPRE_Real *max_row_sum ); HYPRE_Int HYPRE_BoomerAMGSetTruncFactor ( HYPRE_Solver solver, HYPRE_Real trunc_factor ); HYPRE_Int HYPRE_BoomerAMGGetTruncFactor ( HYPRE_Solver solver, HYPRE_Real *trunc_factor ); HYPRE_Int HYPRE_BoomerAMGSetPMaxElmts ( HYPRE_Solver solver, HYPRE_Int P_max_elmts ); HYPRE_Int HYPRE_BoomerAMGGetPMaxElmts ( HYPRE_Solver solver, HYPRE_Int *P_max_elmts ); HYPRE_Int HYPRE_BoomerAMGSetJacobiTruncThreshold ( HYPRE_Solver solver, HYPRE_Real jacobi_trunc_threshold ); HYPRE_Int HYPRE_BoomerAMGGetJacobiTruncThreshold ( HYPRE_Solver solver, HYPRE_Real *jacobi_trunc_threshold ); HYPRE_Int HYPRE_BoomerAMGSetPostInterpType ( HYPRE_Solver solver, HYPRE_Int post_interp_type ); HYPRE_Int HYPRE_BoomerAMGGetPostInterpType ( HYPRE_Solver solver, HYPRE_Int *post_interp_type ); HYPRE_Int HYPRE_BoomerAMGSetSCommPkgSwitch ( HYPRE_Solver solver, HYPRE_Real S_commpkg_switch ); HYPRE_Int HYPRE_BoomerAMGSetInterpType ( HYPRE_Solver solver, HYPRE_Int interp_type ); HYPRE_Int HYPRE_BoomerAMGSetSepWeight ( HYPRE_Solver solver, HYPRE_Int sep_weight ); HYPRE_Int HYPRE_BoomerAMGSetMinIter ( HYPRE_Solver solver, HYPRE_Int min_iter ); HYPRE_Int HYPRE_BoomerAMGSetMaxIter ( HYPRE_Solver solver, HYPRE_Int max_iter ); HYPRE_Int HYPRE_BoomerAMGGetMaxIter ( HYPRE_Solver solver, HYPRE_Int *max_iter ); HYPRE_Int HYPRE_BoomerAMGSetCoarsenType ( HYPRE_Solver solver, HYPRE_Int coarsen_type ); HYPRE_Int HYPRE_BoomerAMGGetCoarsenType ( HYPRE_Solver solver, HYPRE_Int *coarsen_type ); HYPRE_Int HYPRE_BoomerAMGSetMeasureType ( HYPRE_Solver solver, HYPRE_Int measure_type ); HYPRE_Int HYPRE_BoomerAMGGetMeasureType ( HYPRE_Solver solver, HYPRE_Int *measure_type ); HYPRE_Int HYPRE_BoomerAMGSetSetupType ( HYPRE_Solver solver, HYPRE_Int setup_type ); HYPRE_Int HYPRE_BoomerAMGSetOldDefault ( HYPRE_Solver solver ); HYPRE_Int HYPRE_BoomerAMGSetFCycle ( HYPRE_Solver solver, HYPRE_Int fcycle ); HYPRE_Int HYPRE_BoomerAMGGetFCycle ( HYPRE_Solver solver, HYPRE_Int *fcycle ); HYPRE_Int HYPRE_BoomerAMGSetCycleType ( HYPRE_Solver solver, HYPRE_Int cycle_type ); HYPRE_Int HYPRE_BoomerAMGGetCycleType ( HYPRE_Solver solver, HYPRE_Int *cycle_type ); HYPRE_Int HYPRE_BoomerAMGSetConvergeType ( HYPRE_Solver solver, HYPRE_Int type ); HYPRE_Int HYPRE_BoomerAMGGetConvergeType ( HYPRE_Solver solver, HYPRE_Int *type ); HYPRE_Int HYPRE_BoomerAMGSetTol ( HYPRE_Solver solver, HYPRE_Real tol ); HYPRE_Int HYPRE_BoomerAMGGetTol ( HYPRE_Solver solver, HYPRE_Real *tol ); HYPRE_Int HYPRE_BoomerAMGSetNumGridSweeps ( HYPRE_Solver solver, HYPRE_Int *num_grid_sweeps ); HYPRE_Int HYPRE_BoomerAMGSetNumSweeps ( HYPRE_Solver solver, HYPRE_Int num_sweeps ); HYPRE_Int HYPRE_BoomerAMGSetCycleNumSweeps ( HYPRE_Solver solver, HYPRE_Int num_sweeps, HYPRE_Int k ); HYPRE_Int HYPRE_BoomerAMGGetCycleNumSweeps ( HYPRE_Solver solver, HYPRE_Int *num_sweeps, HYPRE_Int k ); HYPRE_Int HYPRE_BoomerAMGInitGridRelaxation ( HYPRE_Int **num_grid_sweeps_ptr, HYPRE_Int **grid_relax_type_ptr, HYPRE_Int ***grid_relax_points_ptr, HYPRE_Int coarsen_type, HYPRE_Real **relax_weights_ptr, HYPRE_Int max_levels ); HYPRE_Int HYPRE_BoomerAMGSetGridRelaxType ( HYPRE_Solver solver, HYPRE_Int *grid_relax_type ); HYPRE_Int HYPRE_BoomerAMGSetRelaxType ( HYPRE_Solver solver, HYPRE_Int relax_type ); HYPRE_Int HYPRE_BoomerAMGSetCycleRelaxType ( HYPRE_Solver solver, HYPRE_Int relax_type, HYPRE_Int k ); HYPRE_Int HYPRE_BoomerAMGGetCycleRelaxType ( HYPRE_Solver solver, HYPRE_Int *relax_type, HYPRE_Int k ); HYPRE_Int HYPRE_BoomerAMGSetRelaxOrder ( HYPRE_Solver solver, HYPRE_Int relax_order ); HYPRE_Int HYPRE_BoomerAMGSetGridRelaxPoints ( HYPRE_Solver solver, HYPRE_Int **grid_relax_points ); HYPRE_Int HYPRE_BoomerAMGSetRelaxWeight ( HYPRE_Solver solver, HYPRE_Real *relax_weight ); HYPRE_Int HYPRE_BoomerAMGSetRelaxWt ( HYPRE_Solver solver, HYPRE_Real relax_wt ); HYPRE_Int HYPRE_BoomerAMGSetLevelRelaxWt ( HYPRE_Solver solver, HYPRE_Real relax_wt, HYPRE_Int level ); HYPRE_Int HYPRE_BoomerAMGSetOmega ( HYPRE_Solver solver, HYPRE_Real *omega ); HYPRE_Int HYPRE_BoomerAMGSetOuterWt ( HYPRE_Solver solver, HYPRE_Real outer_wt ); HYPRE_Int HYPRE_BoomerAMGSetLevelOuterWt ( HYPRE_Solver solver, HYPRE_Real outer_wt, HYPRE_Int level ); HYPRE_Int HYPRE_BoomerAMGSetSmoothType ( HYPRE_Solver solver, HYPRE_Int smooth_type ); HYPRE_Int HYPRE_BoomerAMGGetSmoothType ( HYPRE_Solver solver, HYPRE_Int *smooth_type ); HYPRE_Int HYPRE_BoomerAMGSetSmoothNumLevels ( HYPRE_Solver solver, HYPRE_Int smooth_num_levels ); HYPRE_Int HYPRE_BoomerAMGGetSmoothNumLevels ( HYPRE_Solver solver, HYPRE_Int *smooth_num_levels ); HYPRE_Int HYPRE_BoomerAMGSetSmoothNumSweeps ( HYPRE_Solver solver, HYPRE_Int smooth_num_sweeps ); HYPRE_Int HYPRE_BoomerAMGGetSmoothNumSweeps ( HYPRE_Solver solver, HYPRE_Int *smooth_num_sweeps ); HYPRE_Int HYPRE_BoomerAMGSetLogging ( HYPRE_Solver solver, HYPRE_Int logging ); HYPRE_Int HYPRE_BoomerAMGGetLogging ( HYPRE_Solver solver, HYPRE_Int *logging ); HYPRE_Int HYPRE_BoomerAMGSetPrintLevel ( HYPRE_Solver solver, HYPRE_Int print_level ); HYPRE_Int HYPRE_BoomerAMGGetPrintLevel ( HYPRE_Solver solver, HYPRE_Int *print_level ); HYPRE_Int HYPRE_BoomerAMGSetPrintFileName ( HYPRE_Solver solver, const char *print_file_name ); HYPRE_Int HYPRE_BoomerAMGSetDebugFlag ( HYPRE_Solver solver, HYPRE_Int debug_flag ); HYPRE_Int HYPRE_BoomerAMGGetDebugFlag ( HYPRE_Solver solver, HYPRE_Int *debug_flag ); HYPRE_Int HYPRE_BoomerAMGGetNumIterations ( HYPRE_Solver solver, HYPRE_Int *num_iterations ); HYPRE_Int HYPRE_BoomerAMGGetCumNumIterations ( HYPRE_Solver solver, HYPRE_Int *cum_num_iterations ); HYPRE_Int HYPRE_BoomerAMGGetResidual ( HYPRE_Solver solver, HYPRE_ParVector *residual ); HYPRE_Int HYPRE_BoomerAMGGetFinalRelativeResidualNorm ( HYPRE_Solver solver, HYPRE_Real *rel_resid_norm ); HYPRE_Int HYPRE_BoomerAMGSetVariant ( HYPRE_Solver solver, HYPRE_Int variant ); HYPRE_Int HYPRE_BoomerAMGGetVariant ( HYPRE_Solver solver, HYPRE_Int *variant ); HYPRE_Int HYPRE_BoomerAMGSetOverlap ( HYPRE_Solver solver, HYPRE_Int overlap ); HYPRE_Int HYPRE_BoomerAMGGetOverlap ( HYPRE_Solver solver, HYPRE_Int *overlap ); HYPRE_Int HYPRE_BoomerAMGSetDomainType ( HYPRE_Solver solver, HYPRE_Int domain_type ); HYPRE_Int HYPRE_BoomerAMGGetDomainType ( HYPRE_Solver solver, HYPRE_Int *domain_type ); HYPRE_Int HYPRE_BoomerAMGSetSchwarzRlxWeight ( HYPRE_Solver solver, HYPRE_Real schwarz_rlx_weight ); HYPRE_Int HYPRE_BoomerAMGGetSchwarzRlxWeight ( HYPRE_Solver solver, HYPRE_Real *schwarz_rlx_weight ); HYPRE_Int HYPRE_BoomerAMGSetSchwarzUseNonSymm ( HYPRE_Solver solver, HYPRE_Int use_nonsymm ); HYPRE_Int HYPRE_BoomerAMGSetSym ( HYPRE_Solver solver, HYPRE_Int sym ); HYPRE_Int HYPRE_BoomerAMGSetLevel ( HYPRE_Solver solver, HYPRE_Int level ); HYPRE_Int HYPRE_BoomerAMGSetThreshold ( HYPRE_Solver solver, HYPRE_Real threshold ); HYPRE_Int HYPRE_BoomerAMGSetFilter ( HYPRE_Solver solver, HYPRE_Real filter ); HYPRE_Int HYPRE_BoomerAMGSetDropTol ( HYPRE_Solver solver, HYPRE_Real drop_tol ); HYPRE_Int HYPRE_BoomerAMGSetMaxNzPerRow ( HYPRE_Solver solver, HYPRE_Int max_nz_per_row ); HYPRE_Int HYPRE_BoomerAMGSetEuclidFile ( HYPRE_Solver solver, char *euclidfile ); HYPRE_Int HYPRE_BoomerAMGSetEuLevel ( HYPRE_Solver solver, HYPRE_Int eu_level ); HYPRE_Int HYPRE_BoomerAMGSetEuSparseA ( HYPRE_Solver solver, HYPRE_Real eu_sparse_A ); HYPRE_Int HYPRE_BoomerAMGSetEuBJ ( HYPRE_Solver solver, HYPRE_Int eu_bj ); HYPRE_Int HYPRE_BoomerAMGSetILUType( HYPRE_Solver solver, HYPRE_Int ilu_type); HYPRE_Int HYPRE_BoomerAMGSetILULevel( HYPRE_Solver solver, HYPRE_Int ilu_lfil); HYPRE_Int HYPRE_BoomerAMGSetILUMaxRowNnz( HYPRE_Solver solver, HYPRE_Int ilu_max_row_nnz); HYPRE_Int HYPRE_BoomerAMGSetILUMaxIter( HYPRE_Solver solver, HYPRE_Int ilu_max_iter); HYPRE_Int HYPRE_BoomerAMGSetILUDroptol( HYPRE_Solver solver, HYPRE_Real ilu_droptol); HYPRE_Int HYPRE_BoomerAMGSetILUTriSolve( HYPRE_Solver solver, HYPRE_Int ilu_tri_solve); HYPRE_Int HYPRE_BoomerAMGSetILULowerJacobiIters( HYPRE_Solver solver, HYPRE_Int ilu_lower_jacobi_iters); HYPRE_Int HYPRE_BoomerAMGSetILUUpperJacobiIters( HYPRE_Solver solver, HYPRE_Int ilu_upper_jacobi_iters); HYPRE_Int HYPRE_BoomerAMGSetILULocalReordering( HYPRE_Solver solver, HYPRE_Int ilu_reordering_type); HYPRE_Int HYPRE_BoomerAMGSetFSAIAlgoType ( HYPRE_Solver solver, HYPRE_Int algo_type ); HYPRE_Int HYPRE_BoomerAMGSetFSAILocalSolveType ( HYPRE_Solver solver, HYPRE_Int local_solve_type ); HYPRE_Int HYPRE_BoomerAMGSetFSAIMaxSteps ( HYPRE_Solver solver, HYPRE_Int max_steps ); HYPRE_Int HYPRE_BoomerAMGSetFSAIMaxStepSize ( HYPRE_Solver solver, HYPRE_Int max_step_size ); HYPRE_Int HYPRE_BoomerAMGSetFSAIMaxNnzRow ( HYPRE_Solver solver, HYPRE_Int max_nnz_row ); HYPRE_Int HYPRE_BoomerAMGSetFSAINumLevels ( HYPRE_Solver solver, HYPRE_Int num_levels ); HYPRE_Int HYPRE_BoomerAMGSetFSAIEigMaxIters ( HYPRE_Solver solver, HYPRE_Int eig_max_iters ); HYPRE_Int HYPRE_BoomerAMGSetFSAIThreshold ( HYPRE_Solver solver, HYPRE_Real threshold ); HYPRE_Int HYPRE_BoomerAMGSetFSAIKapTolerance ( HYPRE_Solver solver, HYPRE_Real kap_tolerance ); HYPRE_Int HYPRE_BoomerAMGSetNumFunctions ( HYPRE_Solver solver, HYPRE_Int num_functions ); HYPRE_Int HYPRE_BoomerAMGGetNumFunctions ( HYPRE_Solver solver, HYPRE_Int *num_functions ); HYPRE_Int HYPRE_BoomerAMGSetFilterFunctions ( HYPRE_Solver solver, HYPRE_Int filter_functions ); HYPRE_Int HYPRE_BoomerAMGGetFilterFunctions ( HYPRE_Solver solver, HYPRE_Int *filter_functions ); HYPRE_Int HYPRE_BoomerAMGSetNodal ( HYPRE_Solver solver, HYPRE_Int nodal ); HYPRE_Int HYPRE_BoomerAMGSetNodalLevels ( HYPRE_Solver solver, HYPRE_Int nodal_levels ); HYPRE_Int HYPRE_BoomerAMGSetNodalDiag ( HYPRE_Solver solver, HYPRE_Int nodal ); HYPRE_Int HYPRE_BoomerAMGSetKeepSameSign ( HYPRE_Solver solver, HYPRE_Int keep_same_sign ); HYPRE_Int HYPRE_BoomerAMGSetDofFunc ( HYPRE_Solver solver, HYPRE_Int *dof_func ); HYPRE_Int HYPRE_BoomerAMGSetNumPaths ( HYPRE_Solver solver, HYPRE_Int num_paths ); HYPRE_Int HYPRE_BoomerAMGSetAggNumLevels ( HYPRE_Solver solver, HYPRE_Int agg_num_levels ); HYPRE_Int HYPRE_BoomerAMGSetAggInterpType ( HYPRE_Solver solver, HYPRE_Int agg_interp_type ); HYPRE_Int HYPRE_BoomerAMGSetAggTruncFactor ( HYPRE_Solver solver, HYPRE_Real agg_trunc_factor ); HYPRE_Int HYPRE_BoomerAMGSetAddTruncFactor ( HYPRE_Solver solver, HYPRE_Real add_trunc_factor ); HYPRE_Int HYPRE_BoomerAMGSetMultAddTruncFactor ( HYPRE_Solver solver, HYPRE_Real add_trunc_factor ); HYPRE_Int HYPRE_BoomerAMGSetAggP12TruncFactor ( HYPRE_Solver solver, HYPRE_Real agg_P12_trunc_factor ); HYPRE_Int HYPRE_BoomerAMGSetAggPMaxElmts ( HYPRE_Solver solver, HYPRE_Int agg_P_max_elmts ); HYPRE_Int HYPRE_BoomerAMGSetAddPMaxElmts ( HYPRE_Solver solver, HYPRE_Int add_P_max_elmts ); HYPRE_Int HYPRE_BoomerAMGSetMultAddPMaxElmts ( HYPRE_Solver solver, HYPRE_Int add_P_max_elmts ); HYPRE_Int HYPRE_BoomerAMGSetAddRelaxType ( HYPRE_Solver solver, HYPRE_Int add_rlx_type ); HYPRE_Int HYPRE_BoomerAMGSetAddRelaxWt ( HYPRE_Solver solver, HYPRE_Real add_rlx_wt ); HYPRE_Int HYPRE_BoomerAMGSetAggP12MaxElmts ( HYPRE_Solver solver, HYPRE_Int agg_P12_max_elmts ); HYPRE_Int HYPRE_BoomerAMGSetNumCRRelaxSteps ( HYPRE_Solver solver, HYPRE_Int num_CR_relax_steps ); HYPRE_Int HYPRE_BoomerAMGSetCRRate ( HYPRE_Solver solver, HYPRE_Real CR_rate ); HYPRE_Int HYPRE_BoomerAMGSetCRStrongTh ( HYPRE_Solver solver, HYPRE_Real CR_strong_th ); HYPRE_Int HYPRE_BoomerAMGSetADropTol( HYPRE_Solver solver, HYPRE_Real A_drop_tol ); HYPRE_Int HYPRE_BoomerAMGSetADropType( HYPRE_Solver solver, HYPRE_Int A_drop_type ); HYPRE_Int HYPRE_BoomerAMGSetISType ( HYPRE_Solver solver, HYPRE_Int IS_type ); HYPRE_Int HYPRE_BoomerAMGSetCRUseCG ( HYPRE_Solver solver, HYPRE_Int CR_use_CG ); HYPRE_Int HYPRE_BoomerAMGSetGSMG ( HYPRE_Solver solver, HYPRE_Int gsmg ); HYPRE_Int HYPRE_BoomerAMGSetNumSamples ( HYPRE_Solver solver, HYPRE_Int gsmg ); HYPRE_Int HYPRE_BoomerAMGSetCGCIts ( HYPRE_Solver solver, HYPRE_Int its ); HYPRE_Int HYPRE_BoomerAMGSetPlotGrids ( HYPRE_Solver solver, HYPRE_Int plotgrids ); HYPRE_Int HYPRE_BoomerAMGSetPlotFileName ( HYPRE_Solver solver, const char *plotfilename ); HYPRE_Int HYPRE_BoomerAMGSetCoordDim ( HYPRE_Solver solver, HYPRE_Int coorddim ); HYPRE_Int HYPRE_BoomerAMGSetCoordinates ( HYPRE_Solver solver, float *coordinates ); HYPRE_Int HYPRE_BoomerAMGGetGridHierarchy(HYPRE_Solver solver, HYPRE_Int *cgrid ); HYPRE_Int HYPRE_BoomerAMGSetChebyOrder ( HYPRE_Solver solver, HYPRE_Int order ); HYPRE_Int HYPRE_BoomerAMGSetChebyFraction ( HYPRE_Solver solver, HYPRE_Real ratio ); HYPRE_Int HYPRE_BoomerAMGSetChebyEigEst ( HYPRE_Solver solver, HYPRE_Int eig_est ); HYPRE_Int HYPRE_BoomerAMGSetChebyVariant ( HYPRE_Solver solver, HYPRE_Int variant ); HYPRE_Int HYPRE_BoomerAMGSetChebyScale ( HYPRE_Solver solver, HYPRE_Int scale ); HYPRE_Int HYPRE_BoomerAMGSetInterpVectors ( HYPRE_Solver solver, HYPRE_Int num_vectors, HYPRE_ParVector *vectors ); HYPRE_Int HYPRE_BoomerAMGSetInterpVecVariant ( HYPRE_Solver solver, HYPRE_Int num ); HYPRE_Int HYPRE_BoomerAMGSetInterpVecQMax ( HYPRE_Solver solver, HYPRE_Int q_max ); HYPRE_Int HYPRE_BoomerAMGSetInterpVecAbsQTrunc ( HYPRE_Solver solver, HYPRE_Real q_trunc ); HYPRE_Int HYPRE_BoomerAMGSetSmoothInterpVectors ( HYPRE_Solver solver, HYPRE_Int smooth_interp_vectors ); HYPRE_Int HYPRE_BoomerAMGSetInterpRefine ( HYPRE_Solver solver, HYPRE_Int num_refine ); HYPRE_Int HYPRE_BoomerAMGSetInterpVecFirstLevel ( HYPRE_Solver solver, HYPRE_Int level ); HYPRE_Int HYPRE_BoomerAMGSetAdditive ( HYPRE_Solver solver, HYPRE_Int additive ); HYPRE_Int HYPRE_BoomerAMGGetAdditive ( HYPRE_Solver solver, HYPRE_Int *additive ); HYPRE_Int HYPRE_BoomerAMGSetMultAdditive ( HYPRE_Solver solver, HYPRE_Int mult_additive ); HYPRE_Int HYPRE_BoomerAMGGetMultAdditive ( HYPRE_Solver solver, HYPRE_Int *mult_additive ); HYPRE_Int HYPRE_BoomerAMGSetSimple ( HYPRE_Solver solver, HYPRE_Int simple ); HYPRE_Int HYPRE_BoomerAMGGetSimple ( HYPRE_Solver solver, HYPRE_Int *simple ); HYPRE_Int HYPRE_BoomerAMGSetAddLastLvl ( HYPRE_Solver solver, HYPRE_Int add_last_lvl ); HYPRE_Int HYPRE_BoomerAMGSetNonGalerkinTol ( HYPRE_Solver solver, HYPRE_Real nongalerkin_tol ); HYPRE_Int HYPRE_BoomerAMGSetLevelNonGalerkinTol ( HYPRE_Solver solver, HYPRE_Real nongalerkin_tol, HYPRE_Int level ); HYPRE_Int HYPRE_BoomerAMGSetNonGalerkTol ( HYPRE_Solver solver, HYPRE_Int nongalerk_num_tol, HYPRE_Real *nongalerk_tol ); HYPRE_Int HYPRE_BoomerAMGSetRAP2 ( HYPRE_Solver solver, HYPRE_Int rap2 ); HYPRE_Int HYPRE_BoomerAMGSetModuleRAP2 ( HYPRE_Solver solver, HYPRE_Int mod_rap2 ); HYPRE_Int HYPRE_BoomerAMGSetKeepTranspose ( HYPRE_Solver solver, HYPRE_Int keepTranspose ); #ifdef HYPRE_USING_DSUPERLU HYPRE_Int HYPRE_BoomerAMGSetDSLUThreshold ( HYPRE_Solver solver, HYPRE_Int slu_threshold ); #endif HYPRE_Int HYPRE_BoomerAMGSetCpointsToKeep( HYPRE_Solver solver, HYPRE_Int cpt_coarse_level, HYPRE_Int num_cpt_coarse, HYPRE_BigInt *cpt_coarse_index); HYPRE_Int HYPRE_BoomerAMGSetCPoints( HYPRE_Solver solver, HYPRE_Int cpt_coarse_level, HYPRE_Int num_cpt_coarse, HYPRE_BigInt *cpt_coarse_index); HYPRE_Int HYPRE_BoomerAMGSetIsolatedFPoints( HYPRE_Solver solver, HYPRE_Int num_isolated_fpt, HYPRE_BigInt *isolated_fpt_index ); HYPRE_Int HYPRE_BoomerAMGSetFPoints( HYPRE_Solver solver, HYPRE_Int num_fpt, HYPRE_BigInt *fpt_index ); HYPRE_Int HYPRE_BoomerAMGSetCumNnzAP ( HYPRE_Solver solver, HYPRE_Real cum_nnz_AP ); HYPRE_Int HYPRE_BoomerAMGGetCumNnzAP ( HYPRE_Solver solver, HYPRE_Real *cum_nnz_AP ); /* HYPRE_parcsr_amgdd.c */ HYPRE_Int HYPRE_BoomerAMGDDSetup ( HYPRE_Solver solver, HYPRE_ParCSRMatrix A, HYPRE_ParVector b, HYPRE_ParVector x ); HYPRE_Int HYPRE_BoomerAMGDDSolve ( HYPRE_Solver solver, HYPRE_ParCSRMatrix A, HYPRE_ParVector b, HYPRE_ParVector x ); HYPRE_Int HYPRE_BoomerAMGDDSetStartLevel ( HYPRE_Solver solver, HYPRE_Int start_level ); HYPRE_Int HYPRE_BoomerAMGDDGetStartLevel ( HYPRE_Solver solver, HYPRE_Int *start_level ); HYPRE_Int HYPRE_BoomerAMGDDSetFACNumCycles ( HYPRE_Solver solver, HYPRE_Int fac_num_cycles ); HYPRE_Int HYPRE_BoomerAMGDDGetFACNumCycles ( HYPRE_Solver solver, HYPRE_Int *fac_num_cycles ); HYPRE_Int HYPRE_BoomerAMGDDSetFACCycleType ( HYPRE_Solver solver, HYPRE_Int fac_cycle_type ); HYPRE_Int HYPRE_BoomerAMGDDGetFACCycleType ( HYPRE_Solver solver, HYPRE_Int *fac_cycle_type ); HYPRE_Int HYPRE_BoomerAMGDDSetFACNumRelax ( HYPRE_Solver solver, HYPRE_Int fac_num_relax ); HYPRE_Int HYPRE_BoomerAMGDDGetFACNumRelax ( HYPRE_Solver solver, HYPRE_Int *fac_num_relax ); HYPRE_Int HYPRE_BoomerAMGDDSetFACRelaxType ( HYPRE_Solver solver, HYPRE_Int fac_relax_type ); HYPRE_Int HYPRE_BoomerAMGDDGetFACRelaxType ( HYPRE_Solver solver, HYPRE_Int *fac_relax_type ); HYPRE_Int HYPRE_BoomerAMGDDSetFACRelaxWeight ( HYPRE_Solver solver, HYPRE_Real fac_relax_weight ); HYPRE_Int HYPRE_BoomerAMGDDGetFACRelaxWeight ( HYPRE_Solver solver, HYPRE_Real *fac_relax_weight ); HYPRE_Int HYPRE_BoomerAMGDDSetPadding ( HYPRE_Solver solver, HYPRE_Int padding ); HYPRE_Int HYPRE_BoomerAMGDDGetPadding ( HYPRE_Solver solver, HYPRE_Int *padding ); HYPRE_Int HYPRE_BoomerAMGDDSetNumGhostLayers ( HYPRE_Solver solver, HYPRE_Int num_ghost_layers ); HYPRE_Int HYPRE_BoomerAMGDDGetNumGhostLayers ( HYPRE_Solver solver, HYPRE_Int *num_ghost_layers ); HYPRE_Int HYPRE_BoomerAMGDDSetUserFACRelaxation( HYPRE_Solver solver, HYPRE_Int (*userFACRelaxation)( void *amgdd_vdata, HYPRE_Int level, HYPRE_Int cycle_param ) ); HYPRE_Int HYPRE_BoomerAMGDDGetAMG ( HYPRE_Solver solver, HYPRE_Solver *amg_solver ); /* HYPRE_parcsr_bicgstab.c */ HYPRE_Int HYPRE_ParCSRBiCGSTABCreate ( MPI_Comm comm, HYPRE_Solver *solver ); HYPRE_Int HYPRE_ParCSRBiCGSTABDestroy ( HYPRE_Solver solver ); HYPRE_Int HYPRE_ParCSRBiCGSTABSetup ( HYPRE_Solver solver, HYPRE_ParCSRMatrix A, HYPRE_ParVector b, HYPRE_ParVector x ); HYPRE_Int HYPRE_ParCSRBiCGSTABSolve ( HYPRE_Solver solver, HYPRE_ParCSRMatrix A, HYPRE_ParVector b, HYPRE_ParVector x ); HYPRE_Int HYPRE_ParCSRBiCGSTABSetTol ( HYPRE_Solver solver, HYPRE_Real tol ); HYPRE_Int HYPRE_ParCSRBiCGSTABSetAbsoluteTol ( HYPRE_Solver solver, HYPRE_Real a_tol ); HYPRE_Int HYPRE_ParCSRBiCGSTABSetMinIter ( HYPRE_Solver solver, HYPRE_Int min_iter ); HYPRE_Int HYPRE_ParCSRBiCGSTABSetMaxIter ( HYPRE_Solver solver, HYPRE_Int max_iter ); HYPRE_Int HYPRE_ParCSRBiCGSTABSetStopCrit ( HYPRE_Solver solver, HYPRE_Int stop_crit ); HYPRE_Int HYPRE_ParCSRBiCGSTABSetPrecond ( HYPRE_Solver solver, HYPRE_PtrToParSolverFcn precond, HYPRE_PtrToParSolverFcn precond_setup, HYPRE_Solver precond_solver ); HYPRE_Int HYPRE_ParCSRBiCGSTABGetPrecond ( HYPRE_Solver solver, HYPRE_Solver *precond_data_ptr ); HYPRE_Int HYPRE_ParCSRBiCGSTABSetLogging ( HYPRE_Solver solver, HYPRE_Int logging ); HYPRE_Int HYPRE_ParCSRBiCGSTABSetPrintLevel ( HYPRE_Solver solver, HYPRE_Int print_level ); HYPRE_Int HYPRE_ParCSRBiCGSTABGetNumIterations ( HYPRE_Solver solver, HYPRE_Int *num_iterations ); HYPRE_Int HYPRE_ParCSRBiCGSTABGetFinalRelativeResidualNorm ( HYPRE_Solver solver, HYPRE_Real *norm ); HYPRE_Int HYPRE_ParCSRBiCGSTABGetResidual ( HYPRE_Solver solver, HYPRE_ParVector *residual ); /* HYPRE_parcsr_block.c */ HYPRE_Int HYPRE_BlockTridiagCreate ( HYPRE_Solver *solver ); HYPRE_Int HYPRE_BlockTridiagDestroy ( HYPRE_Solver solver ); HYPRE_Int HYPRE_BlockTridiagSetup ( HYPRE_Solver solver, HYPRE_ParCSRMatrix A, HYPRE_ParVector b, HYPRE_ParVector x ); HYPRE_Int HYPRE_BlockTridiagSolve ( HYPRE_Solver solver, HYPRE_ParCSRMatrix A, HYPRE_ParVector b, HYPRE_ParVector x ); HYPRE_Int HYPRE_BlockTridiagSetIndexSet ( HYPRE_Solver solver, HYPRE_Int n, HYPRE_Int *inds ); HYPRE_Int HYPRE_BlockTridiagSetAMGStrengthThreshold ( HYPRE_Solver solver, HYPRE_Real thresh ); HYPRE_Int HYPRE_BlockTridiagSetAMGNumSweeps ( HYPRE_Solver solver, HYPRE_Int num_sweeps ); HYPRE_Int HYPRE_BlockTridiagSetAMGRelaxType ( HYPRE_Solver solver, HYPRE_Int relax_type ); HYPRE_Int HYPRE_BlockTridiagSetPrintLevel ( HYPRE_Solver solver, HYPRE_Int print_level ); /* HYPRE_parcsr_cgnr.c */ HYPRE_Int HYPRE_ParCSRCGNRCreate ( MPI_Comm comm, HYPRE_Solver *solver ); HYPRE_Int HYPRE_ParCSRCGNRDestroy ( HYPRE_Solver solver ); HYPRE_Int HYPRE_ParCSRCGNRSetup ( HYPRE_Solver solver, HYPRE_ParCSRMatrix A, HYPRE_ParVector b, HYPRE_ParVector x ); HYPRE_Int HYPRE_ParCSRCGNRSolve ( HYPRE_Solver solver, HYPRE_ParCSRMatrix A, HYPRE_ParVector b, HYPRE_ParVector x ); HYPRE_Int HYPRE_ParCSRCGNRSetTol ( HYPRE_Solver solver, HYPRE_Real tol ); HYPRE_Int HYPRE_ParCSRCGNRSetMinIter ( HYPRE_Solver solver, HYPRE_Int min_iter ); HYPRE_Int HYPRE_ParCSRCGNRSetMaxIter ( HYPRE_Solver solver, HYPRE_Int max_iter ); HYPRE_Int HYPRE_ParCSRCGNRSetStopCrit ( HYPRE_Solver solver, HYPRE_Int stop_crit ); HYPRE_Int HYPRE_ParCSRCGNRSetPrecond ( HYPRE_Solver solver, HYPRE_PtrToParSolverFcn precond, HYPRE_PtrToParSolverFcn precondT, HYPRE_PtrToParSolverFcn precond_setup, HYPRE_Solver precond_solver ); HYPRE_Int HYPRE_ParCSRCGNRGetPrecond ( HYPRE_Solver solver, HYPRE_Solver *precond_data_ptr ); HYPRE_Int HYPRE_ParCSRCGNRSetLogging ( HYPRE_Solver solver, HYPRE_Int logging ); HYPRE_Int HYPRE_ParCSRCGNRGetNumIterations ( HYPRE_Solver solver, HYPRE_Int *num_iterations ); HYPRE_Int HYPRE_ParCSRCGNRGetFinalRelativeResidualNorm ( HYPRE_Solver solver, HYPRE_Real *norm ); /* HYPRE_parcsr_Euclid.c */ HYPRE_Int HYPRE_EuclidCreate ( MPI_Comm comm, HYPRE_Solver *solver ); HYPRE_Int HYPRE_EuclidDestroy ( HYPRE_Solver solver ); HYPRE_Int HYPRE_EuclidSetup ( HYPRE_Solver solver, HYPRE_ParCSRMatrix A, HYPRE_ParVector b, HYPRE_ParVector x ); HYPRE_Int HYPRE_EuclidSolve ( HYPRE_Solver solver, HYPRE_ParCSRMatrix A, HYPRE_ParVector bb, HYPRE_ParVector xx ); HYPRE_Int HYPRE_EuclidSetParams ( HYPRE_Solver solver, HYPRE_Int argc, char *argv []); HYPRE_Int HYPRE_EuclidSetParamsFromFile ( HYPRE_Solver solver, char *filename ); HYPRE_Int HYPRE_EuclidSetLevel ( HYPRE_Solver solver, HYPRE_Int level ); HYPRE_Int HYPRE_EuclidSetBJ ( HYPRE_Solver solver, HYPRE_Int bj ); HYPRE_Int HYPRE_EuclidSetStats ( HYPRE_Solver solver, HYPRE_Int eu_stats ); HYPRE_Int HYPRE_EuclidSetMem ( HYPRE_Solver solver, HYPRE_Int eu_mem ); HYPRE_Int HYPRE_EuclidSetSparseA ( HYPRE_Solver solver, HYPRE_Real sparse_A ); HYPRE_Int HYPRE_EuclidSetRowScale ( HYPRE_Solver solver, HYPRE_Int row_scale ); HYPRE_Int HYPRE_EuclidSetILUT ( HYPRE_Solver solver, HYPRE_Real ilut ); /* HYPRE_parcsr_flexgmres.c */ HYPRE_Int HYPRE_ParCSRFlexGMRESCreate ( MPI_Comm comm, HYPRE_Solver *solver ); HYPRE_Int HYPRE_ParCSRFlexGMRESDestroy ( HYPRE_Solver solver ); HYPRE_Int HYPRE_ParCSRFlexGMRESSetup ( HYPRE_Solver solver, HYPRE_ParCSRMatrix A, HYPRE_ParVector b, HYPRE_ParVector x ); HYPRE_Int HYPRE_ParCSRFlexGMRESSolve ( HYPRE_Solver solver, HYPRE_ParCSRMatrix A, HYPRE_ParVector b, HYPRE_ParVector x ); HYPRE_Int HYPRE_ParCSRFlexGMRESSetKDim ( HYPRE_Solver solver, HYPRE_Int k_dim ); HYPRE_Int HYPRE_ParCSRFlexGMRESSetTol ( HYPRE_Solver solver, HYPRE_Real tol ); HYPRE_Int HYPRE_ParCSRFlexGMRESSetAbsoluteTol ( HYPRE_Solver solver, HYPRE_Real a_tol ); HYPRE_Int HYPRE_ParCSRFlexGMRESSetMinIter ( HYPRE_Solver solver, HYPRE_Int min_iter ); HYPRE_Int HYPRE_ParCSRFlexGMRESSetMaxIter ( HYPRE_Solver solver, HYPRE_Int max_iter ); HYPRE_Int HYPRE_ParCSRFlexGMRESSetPrecond ( HYPRE_Solver solver, HYPRE_PtrToParSolverFcn precond, HYPRE_PtrToParSolverFcn precond_setup, HYPRE_Solver precond_solver ); HYPRE_Int HYPRE_ParCSRFlexGMRESGetPrecond ( HYPRE_Solver solver, HYPRE_Solver *precond_data_ptr ); HYPRE_Int HYPRE_ParCSRFlexGMRESSetLogging ( HYPRE_Solver solver, HYPRE_Int logging ); HYPRE_Int HYPRE_ParCSRFlexGMRESSetPrintLevel ( HYPRE_Solver solver, HYPRE_Int print_level ); HYPRE_Int HYPRE_ParCSRFlexGMRESGetNumIterations ( HYPRE_Solver solver, HYPRE_Int *num_iterations ); HYPRE_Int HYPRE_ParCSRFlexGMRESGetFinalRelativeResidualNorm ( HYPRE_Solver solver, HYPRE_Real *norm ); HYPRE_Int HYPRE_ParCSRFlexGMRESGetResidual ( HYPRE_Solver solver, HYPRE_ParVector *residual ); HYPRE_Int HYPRE_ParCSRFlexGMRESSetModifyPC ( HYPRE_Solver solver, HYPRE_PtrToModifyPCFcn modify_pc ); /* HYPRE_parcsr_gmres.c */ HYPRE_Int HYPRE_ParCSRGMRESCreate ( MPI_Comm comm, HYPRE_Solver *solver ); HYPRE_Int HYPRE_ParCSRGMRESDestroy ( HYPRE_Solver solver ); HYPRE_Int HYPRE_ParCSRGMRESSetup ( HYPRE_Solver solver, HYPRE_ParCSRMatrix A, HYPRE_ParVector b, HYPRE_ParVector x ); HYPRE_Int HYPRE_ParCSRGMRESSolve ( HYPRE_Solver solver, HYPRE_ParCSRMatrix A, HYPRE_ParVector b, HYPRE_ParVector x ); HYPRE_Int HYPRE_ParCSRGMRESSetKDim ( HYPRE_Solver solver, HYPRE_Int k_dim ); HYPRE_Int HYPRE_ParCSRGMRESSetTol ( HYPRE_Solver solver, HYPRE_Real tol ); HYPRE_Int HYPRE_ParCSRGMRESSetAbsoluteTol ( HYPRE_Solver solver, HYPRE_Real a_tol ); HYPRE_Int HYPRE_ParCSRGMRESSetMinIter ( HYPRE_Solver solver, HYPRE_Int min_iter ); HYPRE_Int HYPRE_ParCSRGMRESSetMaxIter ( HYPRE_Solver solver, HYPRE_Int max_iter ); HYPRE_Int HYPRE_ParCSRGMRESSetStopCrit ( HYPRE_Solver solver, HYPRE_Int stop_crit ); HYPRE_Int HYPRE_ParCSRGMRESSetPrecond ( HYPRE_Solver solver, HYPRE_PtrToParSolverFcn precond, HYPRE_PtrToParSolverFcn precond_setup, HYPRE_Solver precond_solver ); HYPRE_Int HYPRE_ParCSRGMRESGetPrecond ( HYPRE_Solver solver, HYPRE_Solver *precond_data_ptr ); HYPRE_Int HYPRE_ParCSRGMRESSetLogging ( HYPRE_Solver solver, HYPRE_Int logging ); HYPRE_Int HYPRE_ParCSRGMRESSetPrintLevel ( HYPRE_Solver solver, HYPRE_Int print_level ); HYPRE_Int HYPRE_ParCSRGMRESGetNumIterations ( HYPRE_Solver solver, HYPRE_Int *num_iterations ); HYPRE_Int HYPRE_ParCSRGMRESGetFinalRelativeResidualNorm ( HYPRE_Solver solver, HYPRE_Real *norm ); HYPRE_Int HYPRE_ParCSRGMRESGetResidual ( HYPRE_Solver solver, HYPRE_ParVector *residual ); /*HYPRE_parcsr_cogmres.c*/ HYPRE_Int HYPRE_ParCSRCOGMRESCreate ( MPI_Comm comm, HYPRE_Solver *solver ); HYPRE_Int HYPRE_ParCSRCOGMRESDestroy ( HYPRE_Solver solver ); HYPRE_Int HYPRE_ParCSRCOGMRESSetup ( HYPRE_Solver solver, HYPRE_ParCSRMatrix A, HYPRE_ParVector b, HYPRE_ParVector x ); HYPRE_Int HYPRE_ParCSRCOGMRESSolve ( HYPRE_Solver solver, HYPRE_ParCSRMatrix A, HYPRE_ParVector b, HYPRE_ParVector x ); HYPRE_Int HYPRE_ParCSRCOGMRESSetKDim ( HYPRE_Solver solver, HYPRE_Int k_dim ); HYPRE_Int HYPRE_ParCSRCOGMRESSetCGS2 ( HYPRE_Solver solver, HYPRE_Int cgs2 ); HYPRE_Int HYPRE_ParCSRCOGMRESSetTol ( HYPRE_Solver solver, HYPRE_Real tol ); HYPRE_Int HYPRE_ParCSRCOGMRESSetAbsoluteTol ( HYPRE_Solver solver, HYPRE_Real a_tol ); HYPRE_Int HYPRE_ParCSRCOGMRESSetMinIter ( HYPRE_Solver solver, HYPRE_Int min_iter ); HYPRE_Int HYPRE_ParCSRCOGMRESSetMaxIter ( HYPRE_Solver solver, HYPRE_Int max_iter ); HYPRE_Int HYPRE_ParCSRCOGMRESSetPrecond ( HYPRE_Solver solver, HYPRE_PtrToParSolverFcn precond, HYPRE_PtrToParSolverFcn precond_setup, HYPRE_Solver precond_solver ); HYPRE_Int HYPRE_ParCSRCOGMRESGetPrecond ( HYPRE_Solver solver, HYPRE_Solver *precond_data_ptr ); HYPRE_Int HYPRE_ParCSRCOGMRESSetLogging ( HYPRE_Solver solver, HYPRE_Int logging ); HYPRE_Int HYPRE_ParCSRCOGMRESSetPrintLevel ( HYPRE_Solver solver, HYPRE_Int print_level ); HYPRE_Int HYPRE_ParCSRCOGMRESGetNumIterations ( HYPRE_Solver solver, HYPRE_Int *num_iterations ); HYPRE_Int HYPRE_ParCSRCOGMRESGetFinalRelativeResidualNorm ( HYPRE_Solver solver, HYPRE_Real *norm ); HYPRE_Int HYPRE_ParCSRCOGMRESGetResidual ( HYPRE_Solver solver, HYPRE_ParVector *residual ); /* HYPRE_parcsr_hybrid.c */ HYPRE_Int HYPRE_ParCSRHybridCreate ( HYPRE_Solver *solver ); HYPRE_Int HYPRE_ParCSRHybridDestroy ( HYPRE_Solver solver ); HYPRE_Int HYPRE_ParCSRHybridSetup ( HYPRE_Solver solver, HYPRE_ParCSRMatrix A, HYPRE_ParVector b, HYPRE_ParVector x ); HYPRE_Int HYPRE_ParCSRHybridSolve ( HYPRE_Solver solver, HYPRE_ParCSRMatrix A, HYPRE_ParVector b, HYPRE_ParVector x ); HYPRE_Int HYPRE_ParCSRHybridSetTol ( HYPRE_Solver solver, HYPRE_Real tol ); HYPRE_Int HYPRE_ParCSRHybridSetAbsoluteTol ( HYPRE_Solver solver, HYPRE_Real tol ); HYPRE_Int HYPRE_ParCSRHybridSetConvergenceTol ( HYPRE_Solver solver, HYPRE_Real cf_tol ); HYPRE_Int HYPRE_ParCSRHybridSetDSCGMaxIter ( HYPRE_Solver solver, HYPRE_Int dscg_max_its ); HYPRE_Int HYPRE_ParCSRHybridSetPCGMaxIter ( HYPRE_Solver solver, HYPRE_Int pcg_max_its ); HYPRE_Int HYPRE_ParCSRHybridSetSetupType ( HYPRE_Solver solver, HYPRE_Int setup_type ); HYPRE_Int HYPRE_ParCSRHybridSetSolverType ( HYPRE_Solver solver, HYPRE_Int solver_type ); HYPRE_Int HYPRE_ParCSRHybridSetKDim ( HYPRE_Solver solver, HYPRE_Int k_dim ); HYPRE_Int HYPRE_ParCSRHybridSetTwoNorm ( HYPRE_Solver solver, HYPRE_Int two_norm ); HYPRE_Int HYPRE_ParCSRHybridSetStopCrit ( HYPRE_Solver solver, HYPRE_Int stop_crit ); HYPRE_Int HYPRE_ParCSRHybridSetRelChange ( HYPRE_Solver solver, HYPRE_Int rel_change ); HYPRE_Int HYPRE_ParCSRHybridSetPrecond ( HYPRE_Solver solver, HYPRE_PtrToParSolverFcn precond, HYPRE_PtrToParSolverFcn precond_setup, HYPRE_Solver precond_solver ); HYPRE_Int HYPRE_ParCSRHybridSetLogging ( HYPRE_Solver solver, HYPRE_Int logging ); HYPRE_Int HYPRE_ParCSRHybridSetPrintLevel ( HYPRE_Solver solver, HYPRE_Int print_level ); HYPRE_Int HYPRE_ParCSRHybridSetStrongThreshold ( HYPRE_Solver solver, HYPRE_Real strong_threshold ); HYPRE_Int HYPRE_ParCSRHybridSetMaxRowSum ( HYPRE_Solver solver, HYPRE_Real max_row_sum ); HYPRE_Int HYPRE_ParCSRHybridSetTruncFactor ( HYPRE_Solver solver, HYPRE_Real trunc_factor ); HYPRE_Int HYPRE_ParCSRHybridSetPMaxElmts ( HYPRE_Solver solver, HYPRE_Int p_max ); HYPRE_Int HYPRE_ParCSRHybridSetMaxLevels ( HYPRE_Solver solver, HYPRE_Int max_levels ); HYPRE_Int HYPRE_ParCSRHybridSetMeasureType ( HYPRE_Solver solver, HYPRE_Int measure_type ); HYPRE_Int HYPRE_ParCSRHybridSetCoarsenType ( HYPRE_Solver solver, HYPRE_Int coarsen_type ); HYPRE_Int HYPRE_ParCSRHybridSetInterpType ( HYPRE_Solver solver, HYPRE_Int interp_type ); HYPRE_Int HYPRE_ParCSRHybridSetCycleType ( HYPRE_Solver solver, HYPRE_Int cycle_type ); HYPRE_Int HYPRE_ParCSRHybridSetNumGridSweeps ( HYPRE_Solver solver, HYPRE_Int *num_grid_sweeps ); HYPRE_Int HYPRE_ParCSRHybridSetGridRelaxType ( HYPRE_Solver solver, HYPRE_Int *grid_relax_type ); HYPRE_Int HYPRE_ParCSRHybridSetGridRelaxPoints ( HYPRE_Solver solver, HYPRE_Int **grid_relax_points ); HYPRE_Int HYPRE_ParCSRHybridSetNumSweeps ( HYPRE_Solver solver, HYPRE_Int num_sweeps ); HYPRE_Int HYPRE_ParCSRHybridSetCycleNumSweeps ( HYPRE_Solver solver, HYPRE_Int num_sweeps, HYPRE_Int k ); HYPRE_Int HYPRE_ParCSRHybridSetRelaxType ( HYPRE_Solver solver, HYPRE_Int relax_type ); HYPRE_Int HYPRE_ParCSRHybridSetKeepTranspose ( HYPRE_Solver solver, HYPRE_Int keepT ); HYPRE_Int HYPRE_ParCSRHybridSetCycleRelaxType ( HYPRE_Solver solver, HYPRE_Int relax_type, HYPRE_Int k ); HYPRE_Int HYPRE_ParCSRHybridSetRelaxOrder ( HYPRE_Solver solver, HYPRE_Int relax_order ); HYPRE_Int HYPRE_ParCSRHybridSetMaxCoarseSize ( HYPRE_Solver solver, HYPRE_Int max_coarse_size ); HYPRE_Int HYPRE_ParCSRHybridSetMinCoarseSize ( HYPRE_Solver solver, HYPRE_Int min_coarse_size ); HYPRE_Int HYPRE_ParCSRHybridSetSeqThreshold ( HYPRE_Solver solver, HYPRE_Int seq_threshold ); HYPRE_Int HYPRE_ParCSRHybridSetRelaxWt ( HYPRE_Solver solver, HYPRE_Real relax_wt ); HYPRE_Int HYPRE_ParCSRHybridSetLevelRelaxWt ( HYPRE_Solver solver, HYPRE_Real relax_wt, HYPRE_Int level ); HYPRE_Int HYPRE_ParCSRHybridSetOuterWt ( HYPRE_Solver solver, HYPRE_Real outer_wt ); HYPRE_Int HYPRE_ParCSRHybridSetLevelOuterWt ( HYPRE_Solver solver, HYPRE_Real outer_wt, HYPRE_Int level ); HYPRE_Int HYPRE_ParCSRHybridSetRelaxWeight ( HYPRE_Solver solver, HYPRE_Real *relax_weight ); HYPRE_Int HYPRE_ParCSRHybridSetOmega ( HYPRE_Solver solver, HYPRE_Real *omega ); HYPRE_Int HYPRE_ParCSRHybridSetAggNumLevels ( HYPRE_Solver solver, HYPRE_Int agg_num_levels ); HYPRE_Int HYPRE_ParCSRHybridSetNumPaths ( HYPRE_Solver solver, HYPRE_Int num_paths ); HYPRE_Int HYPRE_ParCSRHybridSetNumFunctions ( HYPRE_Solver solver, HYPRE_Int num_functions ); HYPRE_Int HYPRE_ParCSRHybridSetNodal ( HYPRE_Solver solver, HYPRE_Int nodal ); HYPRE_Int HYPRE_ParCSRHybridSetDofFunc ( HYPRE_Solver solver, HYPRE_Int *dof_func ); HYPRE_Int HYPRE_ParCSRHybridSetNonGalerkinTol ( HYPRE_Solver solver, HYPRE_Int nongalerk_num_tol, HYPRE_Real *nongalerkin_tol ); HYPRE_Int HYPRE_ParCSRHybridGetNumIterations ( HYPRE_Solver solver, HYPRE_Int *num_its ); HYPRE_Int HYPRE_ParCSRHybridGetDSCGNumIterations ( HYPRE_Solver solver, HYPRE_Int *dscg_num_its ); HYPRE_Int HYPRE_ParCSRHybridGetPCGNumIterations ( HYPRE_Solver solver, HYPRE_Int *pcg_num_its ); HYPRE_Int HYPRE_ParCSRHybridGetFinalRelativeResidualNorm ( HYPRE_Solver solver, HYPRE_Real *norm ); HYPRE_Int HYPRE_ParCSRHybridGetSetupSolveTime( HYPRE_Solver solver, HYPRE_Real *time ); /* HYPRE_parcsr_int.c */ HYPRE_Int hypre_ParSetRandomValues ( void *v, HYPRE_Int seed ); HYPRE_Int hypre_ParPrintVector ( void *v, const char *file ); void *hypre_ParReadVector ( MPI_Comm comm, const char *file ); HYPRE_Int hypre_ParVectorSize ( void *x ); HYPRE_Int HYPRE_ParCSRMultiVectorPrint ( void *x_, const char *fileName ); void *HYPRE_ParCSRMultiVectorRead ( MPI_Comm comm, void *ii_, const char *fileName ); HYPRE_Int aux_maskCount ( HYPRE_Int n, HYPRE_Int *mask ); void aux_indexFromMask ( HYPRE_Int n, HYPRE_Int *mask, HYPRE_Int *index ); HYPRE_Int HYPRE_TempParCSRSetupInterpreter ( mv_InterfaceInterpreter *i ); HYPRE_Int HYPRE_ParCSRSetupInterpreter ( mv_InterfaceInterpreter *i ); HYPRE_Int HYPRE_ParCSRSetupMatvec ( HYPRE_MatvecFunctions *mv ); /* HYPRE_parcsr_lgmres.c */ HYPRE_Int HYPRE_ParCSRLGMRESCreate ( MPI_Comm comm, HYPRE_Solver *solver ); HYPRE_Int HYPRE_ParCSRLGMRESDestroy ( HYPRE_Solver solver ); HYPRE_Int HYPRE_ParCSRLGMRESSetup ( HYPRE_Solver solver, HYPRE_ParCSRMatrix A, HYPRE_ParVector b, HYPRE_ParVector x ); HYPRE_Int HYPRE_ParCSRLGMRESSolve ( HYPRE_Solver solver, HYPRE_ParCSRMatrix A, HYPRE_ParVector b, HYPRE_ParVector x ); HYPRE_Int HYPRE_ParCSRLGMRESSetKDim ( HYPRE_Solver solver, HYPRE_Int k_dim ); HYPRE_Int HYPRE_ParCSRLGMRESSetAugDim ( HYPRE_Solver solver, HYPRE_Int aug_dim ); HYPRE_Int HYPRE_ParCSRLGMRESSetTol ( HYPRE_Solver solver, HYPRE_Real tol ); HYPRE_Int HYPRE_ParCSRLGMRESSetAbsoluteTol ( HYPRE_Solver solver, HYPRE_Real a_tol ); HYPRE_Int HYPRE_ParCSRLGMRESSetMinIter ( HYPRE_Solver solver, HYPRE_Int min_iter ); HYPRE_Int HYPRE_ParCSRLGMRESSetMaxIter ( HYPRE_Solver solver, HYPRE_Int max_iter ); HYPRE_Int HYPRE_ParCSRLGMRESSetPrecond ( HYPRE_Solver solver, HYPRE_PtrToParSolverFcn precond, HYPRE_PtrToParSolverFcn precond_setup, HYPRE_Solver precond_solver ); HYPRE_Int HYPRE_ParCSRLGMRESGetPrecond ( HYPRE_Solver solver, HYPRE_Solver *precond_data_ptr ); HYPRE_Int HYPRE_ParCSRLGMRESSetLogging ( HYPRE_Solver solver, HYPRE_Int logging ); HYPRE_Int HYPRE_ParCSRLGMRESSetPrintLevel ( HYPRE_Solver solver, HYPRE_Int print_level ); HYPRE_Int HYPRE_ParCSRLGMRESGetNumIterations ( HYPRE_Solver solver, HYPRE_Int *num_iterations ); HYPRE_Int HYPRE_ParCSRLGMRESGetFinalRelativeResidualNorm ( HYPRE_Solver solver, HYPRE_Real *norm ); HYPRE_Int HYPRE_ParCSRLGMRESGetResidual ( HYPRE_Solver solver, HYPRE_ParVector *residual ); /* HYPRE_parcsr_ParaSails.c */ HYPRE_Int HYPRE_ParCSRParaSailsCreate ( MPI_Comm comm, HYPRE_Solver *solver ); HYPRE_Int HYPRE_ParCSRParaSailsDestroy ( HYPRE_Solver solver ); HYPRE_Int HYPRE_ParCSRParaSailsSetup ( HYPRE_Solver solver, HYPRE_ParCSRMatrix A, HYPRE_ParVector b, HYPRE_ParVector x ); HYPRE_Int HYPRE_ParCSRParaSailsSolve ( HYPRE_Solver solver, HYPRE_ParCSRMatrix A, HYPRE_ParVector b, HYPRE_ParVector x ); HYPRE_Int HYPRE_ParCSRParaSailsSetParams ( HYPRE_Solver solver, HYPRE_Real thresh, HYPRE_Int nlevels ); HYPRE_Int HYPRE_ParCSRParaSailsSetFilter ( HYPRE_Solver solver, HYPRE_Real filter ); HYPRE_Int HYPRE_ParCSRParaSailsGetFilter ( HYPRE_Solver solver, HYPRE_Real *filter ); HYPRE_Int HYPRE_ParCSRParaSailsSetSym ( HYPRE_Solver solver, HYPRE_Int sym ); HYPRE_Int HYPRE_ParCSRParaSailsSetLoadbal ( HYPRE_Solver solver, HYPRE_Real loadbal ); HYPRE_Int HYPRE_ParCSRParaSailsGetLoadbal ( HYPRE_Solver solver, HYPRE_Real *loadbal ); HYPRE_Int HYPRE_ParCSRParaSailsSetReuse ( HYPRE_Solver solver, HYPRE_Int reuse ); HYPRE_Int HYPRE_ParCSRParaSailsSetLogging ( HYPRE_Solver solver, HYPRE_Int logging ); HYPRE_Int HYPRE_ParaSailsCreate ( MPI_Comm comm, HYPRE_Solver *solver ); HYPRE_Int HYPRE_ParaSailsDestroy ( HYPRE_Solver solver ); HYPRE_Int HYPRE_ParaSailsSetup ( HYPRE_Solver solver, HYPRE_ParCSRMatrix A, HYPRE_ParVector b, HYPRE_ParVector x ); HYPRE_Int HYPRE_ParaSailsSolve ( HYPRE_Solver solver, HYPRE_ParCSRMatrix A, HYPRE_ParVector b, HYPRE_ParVector x ); HYPRE_Int HYPRE_ParaSailsSetParams ( HYPRE_Solver solver, HYPRE_Real thresh, HYPRE_Int nlevels ); HYPRE_Int HYPRE_ParaSailsSetThresh ( HYPRE_Solver solver, HYPRE_Real thresh ); HYPRE_Int HYPRE_ParaSailsGetThresh ( HYPRE_Solver solver, HYPRE_Real *thresh ); HYPRE_Int HYPRE_ParaSailsSetNlevels ( HYPRE_Solver solver, HYPRE_Int nlevels ); HYPRE_Int HYPRE_ParaSailsGetNlevels ( HYPRE_Solver solver, HYPRE_Int *nlevels ); HYPRE_Int HYPRE_ParaSailsSetFilter ( HYPRE_Solver solver, HYPRE_Real filter ); HYPRE_Int HYPRE_ParaSailsGetFilter ( HYPRE_Solver solver, HYPRE_Real *filter ); HYPRE_Int HYPRE_ParaSailsSetSym ( HYPRE_Solver solver, HYPRE_Int sym ); HYPRE_Int HYPRE_ParaSailsGetSym ( HYPRE_Solver solver, HYPRE_Int *sym ); HYPRE_Int HYPRE_ParaSailsSetLoadbal ( HYPRE_Solver solver, HYPRE_Real loadbal ); HYPRE_Int HYPRE_ParaSailsGetLoadbal ( HYPRE_Solver solver, HYPRE_Real *loadbal ); HYPRE_Int HYPRE_ParaSailsSetReuse ( HYPRE_Solver solver, HYPRE_Int reuse ); HYPRE_Int HYPRE_ParaSailsGetReuse ( HYPRE_Solver solver, HYPRE_Int *reuse ); HYPRE_Int HYPRE_ParaSailsSetLogging ( HYPRE_Solver solver, HYPRE_Int logging ); HYPRE_Int HYPRE_ParaSailsGetLogging ( HYPRE_Solver solver, HYPRE_Int *logging ); HYPRE_Int HYPRE_ParaSailsBuildIJMatrix ( HYPRE_Solver solver, HYPRE_IJMatrix *pij_A ); /* HYPRE_parcsr_fsai.c */ HYPRE_Int HYPRE_FSAICreate ( HYPRE_Solver *solver); HYPRE_Int HYPRE_FSAIDestroy ( HYPRE_Solver solver ); HYPRE_Int HYPRE_FSAISetup ( HYPRE_Solver solver, HYPRE_ParCSRMatrix A, HYPRE_ParVector b, HYPRE_ParVector x ); HYPRE_Int HYPRE_FSAISolve ( HYPRE_Solver solver, HYPRE_ParCSRMatrix A, HYPRE_ParVector b, HYPRE_ParVector x ); HYPRE_Int HYPRE_FSAISetAlgoType ( HYPRE_Solver solver, HYPRE_Int algo_type ); HYPRE_Int HYPRE_FSAIGetAlgoType ( HYPRE_Solver solver, HYPRE_Int *algo_type ); HYPRE_Int HYPRE_FSAISetLocalSolveType ( HYPRE_Solver solver, HYPRE_Int local_solve_type ); HYPRE_Int HYPRE_FSAIGetLocalSolveType ( HYPRE_Solver solver, HYPRE_Int *local_solve_type ); HYPRE_Int HYPRE_FSAISetMaxSteps ( HYPRE_Solver solver, HYPRE_Int max_steps ); HYPRE_Int HYPRE_FSAIGetMaxSteps ( HYPRE_Solver solver, HYPRE_Int *max_steps ); HYPRE_Int HYPRE_FSAISetMaxStepSize ( HYPRE_Solver solver, HYPRE_Int max_step_size ); HYPRE_Int HYPRE_FSAIGetMaxStepSize ( HYPRE_Solver solver, HYPRE_Int *max_step_size ); HYPRE_Int HYPRE_FSAISetMaxNnzRow ( HYPRE_Solver solver, HYPRE_Int max_nnz_row ); HYPRE_Int HYPRE_FSAIGetMaxNnzRow ( HYPRE_Solver solver, HYPRE_Int *max_nnz_row ); HYPRE_Int HYPRE_FSAISetNumLevels ( HYPRE_Solver solver, HYPRE_Int num_levels ); HYPRE_Int HYPRE_FSAIGetNumLevels ( HYPRE_Solver solver, HYPRE_Int *num_levels ); HYPRE_Int HYPRE_FSAISetThreshold ( HYPRE_Solver solver, HYPRE_Real threshold ); HYPRE_Int HYPRE_FSAIGetThreshold ( HYPRE_Solver solver, HYPRE_Real *threshold ); HYPRE_Int HYPRE_FSAISetKapTolerance ( HYPRE_Solver solver, HYPRE_Real kap_tolerance ); HYPRE_Int HYPRE_FSAIGetKapTolerance ( HYPRE_Solver solver, HYPRE_Real *kap_tolerance ); HYPRE_Int HYPRE_FSAISetTolerance ( HYPRE_Solver solver, HYPRE_Real tolerance ); HYPRE_Int HYPRE_FSAIGetTolerance ( HYPRE_Solver solver, HYPRE_Real *tolerance ); HYPRE_Int HYPRE_FSAISetOmega ( HYPRE_Solver solver, HYPRE_Real omega ); HYPRE_Int HYPRE_FSAIGetOmega ( HYPRE_Solver solver, HYPRE_Real *omega ); HYPRE_Int HYPRE_FSAISetMaxIterations ( HYPRE_Solver solver, HYPRE_Int max_iterations ); HYPRE_Int HYPRE_FSAIGetMaxIterations ( HYPRE_Solver solver, HYPRE_Int *max_iterations ); HYPRE_Int HYPRE_FSAISetEigMaxIters ( HYPRE_Solver solver, HYPRE_Int eig_max_iters ); HYPRE_Int HYPRE_FSAIGetEigMaxIters ( HYPRE_Solver solver, HYPRE_Int *eig_max_iters ); HYPRE_Int HYPRE_FSAISetZeroGuess ( HYPRE_Solver solver, HYPRE_Int zero_guess ); HYPRE_Int HYPRE_FSAIGetZeroGuess ( HYPRE_Solver solver, HYPRE_Int *zero_guess ); HYPRE_Int HYPRE_FSAISetPrintLevel ( HYPRE_Solver solver, HYPRE_Int print_level ); HYPRE_Int HYPRE_FSAIGetPrintLevel ( HYPRE_Solver solver, HYPRE_Int *print_level ); /* HYPRE_parcsr_pcg.c */ HYPRE_Int HYPRE_ParCSRPCGCreate ( MPI_Comm comm, HYPRE_Solver *solver ); HYPRE_Int HYPRE_ParCSRPCGDestroy ( HYPRE_Solver solver ); HYPRE_Int HYPRE_ParCSRPCGSetup ( HYPRE_Solver solver, HYPRE_ParCSRMatrix A, HYPRE_ParVector b, HYPRE_ParVector x ); HYPRE_Int HYPRE_ParCSRPCGSolve ( HYPRE_Solver solver, HYPRE_ParCSRMatrix A, HYPRE_ParVector b, HYPRE_ParVector x ); HYPRE_Int HYPRE_ParCSRPCGSetTol ( HYPRE_Solver solver, HYPRE_Real tol ); HYPRE_Int HYPRE_ParCSRPCGSetAbsoluteTol ( HYPRE_Solver solver, HYPRE_Real a_tol ); HYPRE_Int HYPRE_ParCSRPCGSetMaxIter ( HYPRE_Solver solver, HYPRE_Int max_iter ); HYPRE_Int HYPRE_ParCSRPCGSetStopCrit ( HYPRE_Solver solver, HYPRE_Int stop_crit ); HYPRE_Int HYPRE_ParCSRPCGSetTwoNorm ( HYPRE_Solver solver, HYPRE_Int two_norm ); HYPRE_Int HYPRE_ParCSRPCGSetRelChange ( HYPRE_Solver solver, HYPRE_Int rel_change ); HYPRE_Int HYPRE_ParCSRPCGSetPrecond ( HYPRE_Solver solver, HYPRE_PtrToParSolverFcn precond, HYPRE_PtrToParSolverFcn precond_setup, HYPRE_Solver precond_solver ); HYPRE_Int HYPRE_ParCSRPCGGetPrecond ( HYPRE_Solver solver, HYPRE_Solver *precond_data_ptr ); HYPRE_Int HYPRE_ParCSRPCGSetPrintLevel ( HYPRE_Solver solver, HYPRE_Int level ); HYPRE_Int HYPRE_ParCSRPCGSetLogging ( HYPRE_Solver solver, HYPRE_Int level ); HYPRE_Int HYPRE_ParCSRPCGGetNumIterations ( HYPRE_Solver solver, HYPRE_Int *num_iterations ); HYPRE_Int HYPRE_ParCSRPCGGetFinalRelativeResidualNorm ( HYPRE_Solver solver, HYPRE_Real *norm ); HYPRE_Int HYPRE_ParCSRPCGGetResidual ( HYPRE_Solver solver, HYPRE_ParVector *residual ); HYPRE_Int HYPRE_ParCSRDiagScaleSetup ( HYPRE_Solver solver, HYPRE_ParCSRMatrix A, HYPRE_ParVector y, HYPRE_ParVector x ); HYPRE_Int HYPRE_ParCSRDiagScale ( HYPRE_Solver solver, HYPRE_ParCSRMatrix HA, HYPRE_ParVector Hy, HYPRE_ParVector Hx ); HYPRE_Int HYPRE_ParCSROnProcTriSetup ( HYPRE_Solver solver, HYPRE_ParCSRMatrix HA, HYPRE_ParVector Hy, HYPRE_ParVector Hx ); HYPRE_Int HYPRE_ParCSROnProcTriSolve ( HYPRE_Solver solver, HYPRE_ParCSRMatrix HA, HYPRE_ParVector Hy, HYPRE_ParVector Hx ); /* HYPRE_parcsr_pilut.c */ HYPRE_Int HYPRE_ParCSRPilutCreate ( MPI_Comm comm, HYPRE_Solver *solver ); HYPRE_Int HYPRE_ParCSRPilutDestroy ( HYPRE_Solver solver ); HYPRE_Int HYPRE_ParCSRPilutSetup ( HYPRE_Solver solver, HYPRE_ParCSRMatrix A, HYPRE_ParVector b, HYPRE_ParVector x ); HYPRE_Int HYPRE_ParCSRPilutSolve ( HYPRE_Solver solver, HYPRE_ParCSRMatrix A, HYPRE_ParVector b, HYPRE_ParVector x ); HYPRE_Int HYPRE_ParCSRPilutSetMaxIter ( HYPRE_Solver solver, HYPRE_Int max_iter ); HYPRE_Int HYPRE_ParCSRPilutSetDropTolerance ( HYPRE_Solver solver, HYPRE_Real tol ); HYPRE_Int HYPRE_ParCSRPilutSetFactorRowSize ( HYPRE_Solver solver, HYPRE_Int size ); /* HYPRE_parcsr_schwarz.c */ HYPRE_Int HYPRE_SchwarzCreate ( HYPRE_Solver *solver ); HYPRE_Int HYPRE_SchwarzDestroy ( HYPRE_Solver solver ); HYPRE_Int HYPRE_SchwarzSetup ( HYPRE_Solver solver, HYPRE_ParCSRMatrix A, HYPRE_ParVector b, HYPRE_ParVector x ); HYPRE_Int HYPRE_SchwarzSolve ( HYPRE_Solver solver, HYPRE_ParCSRMatrix A, HYPRE_ParVector b, HYPRE_ParVector x ); HYPRE_Int HYPRE_SchwarzSetVariant ( HYPRE_Solver solver, HYPRE_Int variant ); HYPRE_Int HYPRE_SchwarzSetOverlap ( HYPRE_Solver solver, HYPRE_Int overlap ); HYPRE_Int HYPRE_SchwarzSetDomainType ( HYPRE_Solver solver, HYPRE_Int domain_type ); HYPRE_Int HYPRE_SchwarzSetDomainStructure ( HYPRE_Solver solver, HYPRE_CSRMatrix domain_structure ); HYPRE_Int HYPRE_SchwarzSetNumFunctions ( HYPRE_Solver solver, HYPRE_Int num_functions ); HYPRE_Int HYPRE_SchwarzSetNonSymm ( HYPRE_Solver solver, HYPRE_Int use_nonsymm ); HYPRE_Int HYPRE_SchwarzSetRelaxWeight ( HYPRE_Solver solver, HYPRE_Real relax_weight ); HYPRE_Int HYPRE_SchwarzSetDofFunc ( HYPRE_Solver solver, HYPRE_Int *dof_func ); /* par_add_cycle.c */ HYPRE_Int hypre_BoomerAMGAdditiveCycle ( void *amg_vdata ); HYPRE_Int hypre_CreateLambda ( void *amg_vdata ); HYPRE_Int hypre_CreateDinv ( void *amg_vdata ); /* par_amg.c */ void *hypre_BoomerAMGCreate ( void ); HYPRE_Int hypre_BoomerAMGDestroy ( void *data ); HYPRE_Int hypre_BoomerAMGSetRestriction ( void *data, HYPRE_Int restr_par ); HYPRE_Int hypre_BoomerAMGSetIsTriangular ( void *data, HYPRE_Int is_triangular ); HYPRE_Int hypre_BoomerAMGSetGMRESSwitchR ( void *data, HYPRE_Int gmres_switch ); HYPRE_Int hypre_BoomerAMGSetMaxLevels ( void *data, HYPRE_Int max_levels ); HYPRE_Int hypre_BoomerAMGGetMaxLevels ( void *data, HYPRE_Int *max_levels ); HYPRE_Int hypre_BoomerAMGSetMaxCoarseSize ( void *data, HYPRE_Int max_coarse_size ); HYPRE_Int hypre_BoomerAMGGetMaxCoarseSize ( void *data, HYPRE_Int *max_coarse_size ); HYPRE_Int hypre_BoomerAMGSetMinCoarseSize ( void *data, HYPRE_Int min_coarse_size ); HYPRE_Int hypre_BoomerAMGGetMinCoarseSize ( void *data, HYPRE_Int *min_coarse_size ); HYPRE_Int hypre_BoomerAMGSetSeqThreshold ( void *data, HYPRE_Int seq_threshold ); HYPRE_Int hypre_BoomerAMGGetSeqThreshold ( void *data, HYPRE_Int *seq_threshold ); HYPRE_Int hypre_BoomerAMGSetCoarsenCutFactor( void *data, HYPRE_Int coarsen_cut_factor ); HYPRE_Int hypre_BoomerAMGGetCoarsenCutFactor( void *data, HYPRE_Int *coarsen_cut_factor ); HYPRE_Int hypre_BoomerAMGSetRedundant ( void *data, HYPRE_Int redundant ); HYPRE_Int hypre_BoomerAMGGetRedundant ( void *data, HYPRE_Int *redundant ); HYPRE_Int hypre_BoomerAMGSetStrongThreshold ( void *data, HYPRE_Real strong_threshold ); HYPRE_Int hypre_BoomerAMGGetStrongThreshold ( void *data, HYPRE_Real *strong_threshold ); HYPRE_Int hypre_BoomerAMGSetStrongThresholdR ( void *data, HYPRE_Real strong_threshold ); HYPRE_Int hypre_BoomerAMGGetStrongThresholdR ( void *data, HYPRE_Real *strong_threshold ); HYPRE_Int hypre_BoomerAMGSetFilterThresholdR ( void *data, HYPRE_Real filter_threshold ); HYPRE_Int hypre_BoomerAMGGetFilterThresholdR ( void *data, HYPRE_Real *filter_threshold ); HYPRE_Int hypre_BoomerAMGSetSabs ( void *data, HYPRE_Int Sabs ); HYPRE_Int hypre_BoomerAMGSetMaxRowSum ( void *data, HYPRE_Real max_row_sum ); HYPRE_Int hypre_BoomerAMGGetMaxRowSum ( void *data, HYPRE_Real *max_row_sum ); HYPRE_Int hypre_BoomerAMGSetTruncFactor ( void *data, HYPRE_Real trunc_factor ); HYPRE_Int hypre_BoomerAMGGetTruncFactor ( void *data, HYPRE_Real *trunc_factor ); HYPRE_Int hypre_BoomerAMGSetPMaxElmts ( void *data, HYPRE_Int P_max_elmts ); HYPRE_Int hypre_BoomerAMGGetPMaxElmts ( void *data, HYPRE_Int *P_max_elmts ); HYPRE_Int hypre_BoomerAMGSetJacobiTruncThreshold ( void *data, HYPRE_Real jacobi_trunc_threshold ); HYPRE_Int hypre_BoomerAMGGetJacobiTruncThreshold ( void *data, HYPRE_Real *jacobi_trunc_threshold ); HYPRE_Int hypre_BoomerAMGSetPostInterpType ( void *data, HYPRE_Int post_interp_type ); HYPRE_Int hypre_BoomerAMGGetPostInterpType ( void *data, HYPRE_Int *post_interp_type ); HYPRE_Int hypre_BoomerAMGSetInterpType ( void *data, HYPRE_Int interp_type ); HYPRE_Int hypre_BoomerAMGGetInterpType ( void *data, HYPRE_Int *interp_type ); HYPRE_Int hypre_BoomerAMGSetSepWeight ( void *data, HYPRE_Int sep_weight ); HYPRE_Int hypre_BoomerAMGSetMinIter ( void *data, HYPRE_Int min_iter ); HYPRE_Int hypre_BoomerAMGGetMinIter ( void *data, HYPRE_Int *min_iter ); HYPRE_Int hypre_BoomerAMGSetMaxIter ( void *data, HYPRE_Int max_iter ); HYPRE_Int hypre_BoomerAMGGetMaxIter ( void *data, HYPRE_Int *max_iter ); HYPRE_Int hypre_BoomerAMGSetCoarsenType ( void *data, HYPRE_Int coarsen_type ); HYPRE_Int hypre_BoomerAMGGetCoarsenType ( void *data, HYPRE_Int *coarsen_type ); HYPRE_Int hypre_BoomerAMGSetMeasureType ( void *data, HYPRE_Int measure_type ); HYPRE_Int hypre_BoomerAMGGetMeasureType ( void *data, HYPRE_Int *measure_type ); HYPRE_Int hypre_BoomerAMGSetSetupType ( void *data, HYPRE_Int setup_type ); HYPRE_Int hypre_BoomerAMGGetSetupType ( void *data, HYPRE_Int *setup_type ); HYPRE_Int hypre_BoomerAMGSetFCycle ( void *data, HYPRE_Int fcycle ); HYPRE_Int hypre_BoomerAMGGetFCycle ( void *data, HYPRE_Int *fcycle ); HYPRE_Int hypre_BoomerAMGSetCycleType ( void *data, HYPRE_Int cycle_type ); HYPRE_Int hypre_BoomerAMGGetCycleType ( void *data, HYPRE_Int *cycle_type ); HYPRE_Int hypre_BoomerAMGSetConvergeType ( void *data, HYPRE_Int type ); HYPRE_Int hypre_BoomerAMGGetConvergeType ( void *data, HYPRE_Int *type ); HYPRE_Int hypre_BoomerAMGSetTol ( void *data, HYPRE_Real tol ); HYPRE_Int hypre_BoomerAMGGetTol ( void *data, HYPRE_Real *tol ); HYPRE_Int hypre_BoomerAMGSetNumSweeps ( void *data, HYPRE_Int num_sweeps ); HYPRE_Int hypre_BoomerAMGSetCycleNumSweeps ( void *data, HYPRE_Int num_sweeps, HYPRE_Int k ); HYPRE_Int hypre_BoomerAMGGetCycleNumSweeps ( void *data, HYPRE_Int *num_sweeps, HYPRE_Int k ); HYPRE_Int hypre_BoomerAMGSetNumGridSweeps ( void *data, HYPRE_Int *num_grid_sweeps ); HYPRE_Int hypre_BoomerAMGGetNumGridSweeps ( void *data, HYPRE_Int **num_grid_sweeps ); HYPRE_Int hypre_BoomerAMGSetRelaxType ( void *data, HYPRE_Int relax_type ); HYPRE_Int hypre_BoomerAMGSetCycleRelaxType ( void *data, HYPRE_Int relax_type, HYPRE_Int k ); HYPRE_Int hypre_BoomerAMGGetCycleRelaxType ( void *data, HYPRE_Int *relax_type, HYPRE_Int k ); HYPRE_Int hypre_BoomerAMGSetRelaxOrder ( void *data, HYPRE_Int relax_order ); HYPRE_Int hypre_BoomerAMGGetRelaxOrder ( void *data, HYPRE_Int *relax_order ); HYPRE_Int hypre_BoomerAMGSetGridRelaxType ( void *data, HYPRE_Int *grid_relax_type ); HYPRE_Int hypre_BoomerAMGGetGridRelaxType ( void *data, HYPRE_Int **grid_relax_type ); HYPRE_Int hypre_BoomerAMGSetGridRelaxPoints ( void *data, HYPRE_Int **grid_relax_points ); HYPRE_Int hypre_BoomerAMGGetGridRelaxPoints ( void *data, HYPRE_Int ***grid_relax_points ); HYPRE_Int hypre_BoomerAMGSetRelaxWeight ( void *data, HYPRE_Real *relax_weight ); HYPRE_Int hypre_BoomerAMGGetRelaxWeight ( void *data, HYPRE_Real **relax_weight ); HYPRE_Int hypre_BoomerAMGSetRelaxWt ( void *data, HYPRE_Real relax_weight ); HYPRE_Int hypre_BoomerAMGSetLevelRelaxWt ( void *data, HYPRE_Real relax_weight, HYPRE_Int level ); HYPRE_Int hypre_BoomerAMGGetLevelRelaxWt ( void *data, HYPRE_Real *relax_weight, HYPRE_Int level ); HYPRE_Int hypre_BoomerAMGSetOmega ( void *data, HYPRE_Real *omega ); HYPRE_Int hypre_BoomerAMGGetOmega ( void *data, HYPRE_Real **omega ); HYPRE_Int hypre_BoomerAMGSetOuterWt ( void *data, HYPRE_Real omega ); HYPRE_Int hypre_BoomerAMGSetLevelOuterWt ( void *data, HYPRE_Real omega, HYPRE_Int level ); HYPRE_Int hypre_BoomerAMGGetLevelOuterWt ( void *data, HYPRE_Real *omega, HYPRE_Int level ); HYPRE_Int hypre_BoomerAMGSetSmoothType ( void *data, HYPRE_Int smooth_type ); HYPRE_Int hypre_BoomerAMGGetSmoothType ( void *data, HYPRE_Int *smooth_type ); HYPRE_Int hypre_BoomerAMGSetSmoothNumLevels ( void *data, HYPRE_Int smooth_num_levels ); HYPRE_Int hypre_BoomerAMGGetSmoothNumLevels ( void *data, HYPRE_Int *smooth_num_levels ); HYPRE_Int hypre_BoomerAMGSetSmoothNumSweeps ( void *data, HYPRE_Int smooth_num_sweeps ); HYPRE_Int hypre_BoomerAMGGetSmoothNumSweeps ( void *data, HYPRE_Int *smooth_num_sweeps ); HYPRE_Int hypre_BoomerAMGSetLogging ( void *data, HYPRE_Int logging ); HYPRE_Int hypre_BoomerAMGGetLogging ( void *data, HYPRE_Int *logging ); HYPRE_Int hypre_BoomerAMGSetPrintLevel ( void *data, HYPRE_Int print_level ); HYPRE_Int hypre_BoomerAMGGetPrintLevel ( void *data, HYPRE_Int *print_level ); HYPRE_Int hypre_BoomerAMGSetPrintFileName ( void *data, const char *print_file_name ); HYPRE_Int hypre_BoomerAMGGetPrintFileName ( void *data, char **print_file_name ); HYPRE_Int hypre_BoomerAMGSetNumIterations ( void *data, HYPRE_Int num_iterations ); HYPRE_Int hypre_BoomerAMGSetDebugFlag ( void *data, HYPRE_Int debug_flag ); HYPRE_Int hypre_BoomerAMGGetDebugFlag ( void *data, HYPRE_Int *debug_flag ); HYPRE_Int hypre_BoomerAMGSetGSMG ( void *data, HYPRE_Int par ); HYPRE_Int hypre_BoomerAMGSetNumSamples ( void *data, HYPRE_Int par ); HYPRE_Int hypre_BoomerAMGSetCGCIts ( void *data, HYPRE_Int its ); HYPRE_Int hypre_BoomerAMGSetPlotGrids ( void *data, HYPRE_Int plotgrids ); HYPRE_Int hypre_BoomerAMGSetPlotFileName ( void *data, const char *plot_file_name ); HYPRE_Int hypre_BoomerAMGSetCoordDim ( void *data, HYPRE_Int coorddim ); HYPRE_Int hypre_BoomerAMGSetCoordinates ( void *data, float *coordinates ); HYPRE_Int hypre_BoomerAMGGetGridHierarchy(void *data, HYPRE_Int *cgrid ); HYPRE_Int hypre_BoomerAMGSetNumFunctions ( void *data, HYPRE_Int num_functions ); HYPRE_Int hypre_BoomerAMGGetNumFunctions ( void *data, HYPRE_Int *num_functions ); HYPRE_Int hypre_BoomerAMGSetFilterFunctions ( void *data, HYPRE_Int filter_functions ); HYPRE_Int hypre_BoomerAMGGetFilterFunctions ( void *data, HYPRE_Int *filter_functions ); HYPRE_Int hypre_BoomerAMGSetNodal ( void *data, HYPRE_Int nodal ); HYPRE_Int hypre_BoomerAMGSetNodalLevels ( void *data, HYPRE_Int nodal_levels ); HYPRE_Int hypre_BoomerAMGSetNodalDiag ( void *data, HYPRE_Int nodal ); HYPRE_Int hypre_BoomerAMGSetKeepSameSign ( void *data, HYPRE_Int keep_same_sign ); HYPRE_Int hypre_BoomerAMGSetNumPaths ( void *data, HYPRE_Int num_paths ); HYPRE_Int hypre_BoomerAMGSetAggNumLevels ( void *data, HYPRE_Int agg_num_levels ); HYPRE_Int hypre_BoomerAMGSetAggInterpType ( void *data, HYPRE_Int agg_interp_type ); HYPRE_Int hypre_BoomerAMGSetAggPMaxElmts ( void *data, HYPRE_Int agg_P_max_elmts ); HYPRE_Int hypre_BoomerAMGSetMultAddPMaxElmts ( void *data, HYPRE_Int add_P_max_elmts ); HYPRE_Int hypre_BoomerAMGSetAddRelaxType ( void *data, HYPRE_Int add_rlx_type ); HYPRE_Int hypre_BoomerAMGSetAddRelaxWt ( void *data, HYPRE_Real add_rlx_wt ); HYPRE_Int hypre_BoomerAMGSetAggP12MaxElmts ( void *data, HYPRE_Int agg_P12_max_elmts ); HYPRE_Int hypre_BoomerAMGSetAggTruncFactor ( void *data, HYPRE_Real agg_trunc_factor ); HYPRE_Int hypre_BoomerAMGSetMultAddTruncFactor ( void *data, HYPRE_Real add_trunc_factor ); HYPRE_Int hypre_BoomerAMGSetAggP12TruncFactor ( void *data, HYPRE_Real agg_P12_trunc_factor ); HYPRE_Int hypre_BoomerAMGSetNumCRRelaxSteps ( void *data, HYPRE_Int num_CR_relax_steps ); HYPRE_Int hypre_BoomerAMGSetCRRate ( void *data, HYPRE_Real CR_rate ); HYPRE_Int hypre_BoomerAMGSetCRStrongTh ( void *data, HYPRE_Real CR_strong_th ); HYPRE_Int hypre_BoomerAMGSetADropTol( void *data, HYPRE_Real A_drop_tol ); HYPRE_Int hypre_BoomerAMGSetADropType( void *data, HYPRE_Int A_drop_type ); HYPRE_Int hypre_BoomerAMGSetISType ( void *data, HYPRE_Int IS_type ); HYPRE_Int hypre_BoomerAMGSetCRUseCG ( void *data, HYPRE_Int CR_use_CG ); HYPRE_Int hypre_BoomerAMGSetNumPoints ( void *data, HYPRE_Int num_points ); HYPRE_Int hypre_BoomerAMGSetDofFunc ( void *data, HYPRE_Int *dof_func ); HYPRE_Int hypre_BoomerAMGSetPointDofMap ( void *data, HYPRE_Int *point_dof_map ); HYPRE_Int hypre_BoomerAMGSetDofPoint ( void *data, HYPRE_Int *dof_point ); HYPRE_Int hypre_BoomerAMGGetNumIterations ( void *data, HYPRE_Int *num_iterations ); HYPRE_Int hypre_BoomerAMGGetCumNumIterations ( void *data, HYPRE_Int *cum_num_iterations ); HYPRE_Int hypre_BoomerAMGGetResidual ( void *data, hypre_ParVector **resid ); HYPRE_Int hypre_BoomerAMGGetRelResidualNorm ( void *data, HYPRE_Real *rel_resid_norm ); HYPRE_Int hypre_BoomerAMGSetVariant ( void *data, HYPRE_Int variant ); HYPRE_Int hypre_BoomerAMGGetVariant ( void *data, HYPRE_Int *variant ); HYPRE_Int hypre_BoomerAMGSetOverlap ( void *data, HYPRE_Int overlap ); HYPRE_Int hypre_BoomerAMGGetOverlap ( void *data, HYPRE_Int *overlap ); HYPRE_Int hypre_BoomerAMGSetDomainType ( void *data, HYPRE_Int domain_type ); HYPRE_Int hypre_BoomerAMGGetDomainType ( void *data, HYPRE_Int *domain_type ); HYPRE_Int hypre_BoomerAMGSetSchwarzRlxWeight ( void *data, HYPRE_Real schwarz_rlx_weight ); HYPRE_Int hypre_BoomerAMGGetSchwarzRlxWeight ( void *data, HYPRE_Real *schwarz_rlx_weight ); HYPRE_Int hypre_BoomerAMGSetSchwarzUseNonSymm ( void *data, HYPRE_Int use_nonsymm ); HYPRE_Int hypre_BoomerAMGSetSym ( void *data, HYPRE_Int sym ); HYPRE_Int hypre_BoomerAMGSetLevel ( void *data, HYPRE_Int level ); HYPRE_Int hypre_BoomerAMGSetThreshold ( void *data, HYPRE_Real thresh ); HYPRE_Int hypre_BoomerAMGSetFilter ( void *data, HYPRE_Real filter ); HYPRE_Int hypre_BoomerAMGSetDropTol ( void *data, HYPRE_Real drop_tol ); HYPRE_Int hypre_BoomerAMGSetMaxNzPerRow ( void *data, HYPRE_Int max_nz_per_row ); HYPRE_Int hypre_BoomerAMGSetEuclidFile ( void *data, char *euclidfile ); HYPRE_Int hypre_BoomerAMGSetEuLevel ( void *data, HYPRE_Int eu_level ); HYPRE_Int hypre_BoomerAMGSetEuSparseA ( void *data, HYPRE_Real eu_sparse_A ); HYPRE_Int hypre_BoomerAMGSetEuBJ ( void *data, HYPRE_Int eu_bj ); HYPRE_Int hypre_BoomerAMGSetILUType( void *data, HYPRE_Int ilu_type ); HYPRE_Int hypre_BoomerAMGSetILULevel( void *data, HYPRE_Int ilu_lfil ); HYPRE_Int hypre_BoomerAMGSetILUDroptol( void *data, HYPRE_Real ilu_droptol ); HYPRE_Int hypre_BoomerAMGSetILUTriSolve( void *data, HYPRE_Int ilu_tri_solve ); HYPRE_Int hypre_BoomerAMGSetILULowerJacobiIters( void *data, HYPRE_Int ilu_lower_jacobi_iters ); HYPRE_Int hypre_BoomerAMGSetILUUpperJacobiIters( void *data, HYPRE_Int ilu_upper_jacobi_iters ); HYPRE_Int hypre_BoomerAMGSetILUMaxIter( void *data, HYPRE_Int ilu_max_iter ); HYPRE_Int hypre_BoomerAMGSetILUMaxRowNnz( void *data, HYPRE_Int ilu_max_row_nnz ); HYPRE_Int hypre_BoomerAMGSetILULocalReordering( void *data, HYPRE_Int ilu_reordering_type ); HYPRE_Int hypre_BoomerAMGSetILUIterSetupType( void *data, HYPRE_Int ilu_iter_setup_type ); HYPRE_Int hypre_BoomerAMGSetILUIterSetupOption( void *data, HYPRE_Int ilu_iter_setup_option ); HYPRE_Int hypre_BoomerAMGSetILUIterSetupMaxIter( void *data, HYPRE_Int ilu_iter_setup_max_iter ); HYPRE_Int hypre_BoomerAMGSetILUIterSetupTolerance( void *data, HYPRE_Real ilu_iter_setup_tolerance ); HYPRE_Int hypre_BoomerAMGSetFSAIAlgoType ( void *data, HYPRE_Int fsai_algo_type ); HYPRE_Int hypre_BoomerAMGSetFSAILocalSolveType ( void *data, HYPRE_Int local_solve_type ); HYPRE_Int hypre_BoomerAMGSetFSAIMaxSteps ( void *data, HYPRE_Int fsai_max_steps ); HYPRE_Int hypre_BoomerAMGSetFSAIMaxStepSize ( void *data, HYPRE_Int fsai_max_step_size ); HYPRE_Int hypre_BoomerAMGSetFSAIMaxNnzRow ( void *data, HYPRE_Int fsai_max_nnz_row ); HYPRE_Int hypre_BoomerAMGSetFSAINumLevels ( void *data, HYPRE_Int fsai_num_levels ); HYPRE_Int hypre_BoomerAMGSetFSAIEigMaxIters ( void *data, HYPRE_Int fsai_eig_max_iters ); HYPRE_Int hypre_BoomerAMGSetFSAIThreshold ( void *data, HYPRE_Real fsai_threshold ); HYPRE_Int hypre_BoomerAMGSetFSAIKapTolerance ( void *data, HYPRE_Real fsai_kap_tolerance ); HYPRE_Int hypre_BoomerAMGSetChebyOrder ( void *data, HYPRE_Int order ); HYPRE_Int hypre_BoomerAMGSetChebyFraction ( void *data, HYPRE_Real ratio ); HYPRE_Int hypre_BoomerAMGSetChebyEigEst ( void *data, HYPRE_Int eig_est ); HYPRE_Int hypre_BoomerAMGSetChebyVariant ( void *data, HYPRE_Int variant ); HYPRE_Int hypre_BoomerAMGSetChebyScale ( void *data, HYPRE_Int scale ); HYPRE_Int hypre_BoomerAMGSetInterpVectors ( void *solver, HYPRE_Int num_vectors, hypre_ParVector **interp_vectors ); HYPRE_Int hypre_BoomerAMGSetInterpVecVariant ( void *solver, HYPRE_Int var ); HYPRE_Int hypre_BoomerAMGSetInterpVecQMax ( void *data, HYPRE_Int q_max ); HYPRE_Int hypre_BoomerAMGSetInterpVecAbsQTrunc ( void *data, HYPRE_Real q_trunc ); HYPRE_Int hypre_BoomerAMGSetSmoothInterpVectors ( void *solver, HYPRE_Int smooth_interp_vectors ); HYPRE_Int hypre_BoomerAMGSetInterpRefine ( void *data, HYPRE_Int num_refine ); HYPRE_Int hypre_BoomerAMGSetInterpVecFirstLevel ( void *data, HYPRE_Int level ); HYPRE_Int hypre_BoomerAMGSetAdditive ( void *data, HYPRE_Int additive ); HYPRE_Int hypre_BoomerAMGGetAdditive ( void *data, HYPRE_Int *additive ); HYPRE_Int hypre_BoomerAMGSetMultAdditive ( void *data, HYPRE_Int mult_additive ); HYPRE_Int hypre_BoomerAMGGetMultAdditive ( void *data, HYPRE_Int *mult_additive ); HYPRE_Int hypre_BoomerAMGSetSimple ( void *data, HYPRE_Int simple ); HYPRE_Int hypre_BoomerAMGGetSimple ( void *data, HYPRE_Int *simple ); HYPRE_Int hypre_BoomerAMGSetAddLastLvl ( void *data, HYPRE_Int add_last_lvl ); HYPRE_Int hypre_BoomerAMGSetNonGalerkinTol ( void *data, HYPRE_Real nongalerkin_tol ); HYPRE_Int hypre_BoomerAMGSetLevelNonGalerkinTol ( void *data, HYPRE_Real nongalerkin_tol, HYPRE_Int level ); HYPRE_Int hypre_BoomerAMGSetNonGalerkTol ( void *data, HYPRE_Int nongalerk_num_tol, HYPRE_Real *nongalerk_tol ); HYPRE_Int hypre_BoomerAMGSetRAP2 ( void *data, HYPRE_Int rap2 ); HYPRE_Int hypre_BoomerAMGSetModuleRAP2 ( void *data, HYPRE_Int mod_rap2 ); HYPRE_Int hypre_BoomerAMGSetKeepTranspose ( void *data, HYPRE_Int keepTranspose ); #ifdef HYPRE_USING_DSUPERLU HYPRE_Int hypre_BoomerAMGSetDSLUThreshold ( void *data, HYPRE_Int slu_threshold ); #endif HYPRE_Int hypre_BoomerAMGSetCPoints( void *data, HYPRE_Int cpt_coarse_level, HYPRE_Int num_cpt_coarse, HYPRE_BigInt *cpt_coarse_index ); HYPRE_Int hypre_BoomerAMGSetFPoints( void *data, HYPRE_Int isolated, HYPRE_Int num_points, HYPRE_BigInt *indices ); HYPRE_Int hypre_BoomerAMGSetCumNnzAP ( void *data, HYPRE_Real cum_nnz_AP ); HYPRE_Int hypre_BoomerAMGGetCumNnzAP ( void *data, HYPRE_Real *cum_nnz_AP ); /* par_amg_setup.c */ HYPRE_Int hypre_BoomerAMGSetup ( void *amg_vdata, hypre_ParCSRMatrix *A, hypre_ParVector *f, hypre_ParVector *u ); /* par_amg_solve.c */ HYPRE_Int hypre_BoomerAMGSolve ( void *amg_vdata, hypre_ParCSRMatrix *A, hypre_ParVector *f, hypre_ParVector *u ); /* par_amg_solveT.c */ HYPRE_Int hypre_BoomerAMGSolveT ( void *amg_vdata, hypre_ParCSRMatrix *A, hypre_ParVector *f, hypre_ParVector *u ); HYPRE_Int hypre_BoomerAMGCycleT ( void *amg_vdata, hypre_ParVector **F_array, hypre_ParVector **U_array ); HYPRE_Int hypre_BoomerAMGRelaxT ( hypre_ParCSRMatrix *A, hypre_ParVector *f, HYPRE_Int *cf_marker, HYPRE_Int relax_type, HYPRE_Int relax_points, HYPRE_Real relax_weight, hypre_ParVector *u, hypre_ParVector *Vtemp ); /* par_cgc_coarsen.c */ HYPRE_Int hypre_BoomerAMGCoarsenCGCb ( hypre_ParCSRMatrix *S, hypre_ParCSRMatrix *A, HYPRE_Int measure_type, HYPRE_Int coarsen_type, HYPRE_Int cgc_its, HYPRE_Int debug_flag, hypre_IntArray **CF_marker_ptr ); HYPRE_Int hypre_BoomerAMGCoarsenCGC ( hypre_ParCSRMatrix *S, HYPRE_Int numberofgrids, HYPRE_Int coarsen_type, HYPRE_Int *CF_marker ); HYPRE_Int hypre_AmgCGCPrepare ( hypre_ParCSRMatrix *S, HYPRE_Int nlocal, HYPRE_Int *CF_marker, HYPRE_Int **CF_marker_offd, HYPRE_Int coarsen_type, HYPRE_Int **vrange ); //HYPRE_Int hypre_AmgCGCPrepare ( hypre_ParCSRMatrix *S , HYPRE_Int nlocal , HYPRE_Int *CF_marker , HYPRE_BigInt **CF_marker_offd , HYPRE_Int coarsen_type , HYPRE_BigInt **vrange ); HYPRE_Int hypre_AmgCGCGraphAssemble ( hypre_ParCSRMatrix *S, HYPRE_Int *vertexrange, HYPRE_Int *CF_marker, HYPRE_Int *CF_marker_offd, HYPRE_Int coarsen_type, HYPRE_IJMatrix *ijG ); HYPRE_Int hypre_AmgCGCChoose ( hypre_CSRMatrix *G, HYPRE_Int *vertexrange, HYPRE_Int mpisize, HYPRE_Int **coarse ); HYPRE_Int hypre_AmgCGCBoundaryFix ( hypre_ParCSRMatrix *S, HYPRE_Int *CF_marker, HYPRE_Int *CF_marker_offd ); /* par_cg_relax_wt.c */ HYPRE_Int hypre_BoomerAMGCGRelaxWt ( void *amg_vdata, HYPRE_Int level, HYPRE_Int num_cg_sweeps, HYPRE_Real *rlx_wt_ptr ); HYPRE_Int hypre_Bisection ( HYPRE_Int n, HYPRE_Real *diag, HYPRE_Real *offd, HYPRE_Real y, HYPRE_Real z, HYPRE_Real tol, HYPRE_Int k, HYPRE_Real *ev_ptr ); /* par_cheby.c */ HYPRE_Int hypre_ParCSRRelax_Cheby_Setup ( hypre_ParCSRMatrix *A, HYPRE_Real max_eig, HYPRE_Real min_eig, HYPRE_Real fraction, HYPRE_Int order, HYPRE_Int scale, HYPRE_Int variant, HYPRE_Real **coefs_ptr, HYPRE_Real **ds_ptr ); HYPRE_Int hypre_ParCSRRelax_Cheby_Solve ( hypre_ParCSRMatrix *A, hypre_ParVector *f, HYPRE_Real *ds_data, HYPRE_Real *coefs, HYPRE_Int order, HYPRE_Int scale, HYPRE_Int variant, hypre_ParVector *u, hypre_ParVector *v, hypre_ParVector *r, hypre_ParVector *orig_u_vec, hypre_ParVector *tmp_vec); HYPRE_Int hypre_ParCSRRelax_Cheby_SolveHost ( hypre_ParCSRMatrix *A, hypre_ParVector *f, HYPRE_Real *ds_data, HYPRE_Real *coefs, HYPRE_Int order, HYPRE_Int scale, HYPRE_Int variant, hypre_ParVector *u, hypre_ParVector *v, hypre_ParVector *r, hypre_ParVector *orig_u_vec, hypre_ParVector *tmp_vec); /* par_cheby_device.c */ HYPRE_Int hypre_ParCSRRelax_Cheby_SolveDevice ( hypre_ParCSRMatrix *A, hypre_ParVector *f, HYPRE_Real *ds_data, HYPRE_Real *coefs, HYPRE_Int order, HYPRE_Int scale, HYPRE_Int variant, hypre_ParVector *u, hypre_ParVector *v, hypre_ParVector *r, hypre_ParVector *orig_u_vec, hypre_ParVector *tmp_vec); /* par_coarsen.c */ HYPRE_Int hypre_BoomerAMGCoarsen ( hypre_ParCSRMatrix *S, hypre_ParCSRMatrix *A, HYPRE_Int CF_init, HYPRE_Int debug_flag, hypre_IntArray **CF_marker_ptr ); HYPRE_Int hypre_BoomerAMGCoarsenRuge ( hypre_ParCSRMatrix *S, hypre_ParCSRMatrix *A, HYPRE_Int measure_type, HYPRE_Int coarsen_type, HYPRE_Int cut_factor, HYPRE_Int debug_flag, hypre_IntArray **CF_marker_ptr ); HYPRE_Int hypre_BoomerAMGCoarsenFalgout ( hypre_ParCSRMatrix *S, hypre_ParCSRMatrix *A, HYPRE_Int measure_type, HYPRE_Int cut_factor, HYPRE_Int debug_flag, hypre_IntArray **CF_marker_ptr ); HYPRE_Int hypre_BoomerAMGCoarsenHMIS ( hypre_ParCSRMatrix *S, hypre_ParCSRMatrix *A, HYPRE_Int measure_type, HYPRE_Int cut_factor, HYPRE_Int debug_flag, hypre_IntArray **CF_marker_ptr ); HYPRE_Int hypre_BoomerAMGCoarsenPMIS ( hypre_ParCSRMatrix *S, hypre_ParCSRMatrix *A, HYPRE_Int CF_init, HYPRE_Int debug_flag, hypre_IntArray **CF_marker_ptr ); HYPRE_Int hypre_BoomerAMGCoarsenPMISHost ( hypre_ParCSRMatrix *S, hypre_ParCSRMatrix *A, HYPRE_Int CF_init, HYPRE_Int debug_flag, hypre_IntArray **CF_marker_ptr ); HYPRE_Int hypre_BoomerAMGCoarsenPMISDevice( hypre_ParCSRMatrix *S, hypre_ParCSRMatrix *A, HYPRE_Int CF_init, HYPRE_Int debug_flag, hypre_IntArray **CF_marker_ptr ); /* par_coarsen_device.c */ HYPRE_Int hypre_GetGlobalMeasureDevice( hypre_ParCSRMatrix *S, hypre_ParCSRCommPkg *comm_pkg, HYPRE_Int CF_init, HYPRE_Int aug_rand, HYPRE_Real *measure_diag, HYPRE_Real *measure_offd, HYPRE_Real *real_send_buf ); /* par_coarse_parms.c */ HYPRE_Int hypre_BoomerAMGCoarseParms ( MPI_Comm comm, HYPRE_Int local_num_variables, HYPRE_Int num_functions, hypre_IntArray *dof_func, hypre_IntArray *CF_marker, hypre_IntArray **coarse_dof_func_ptr, HYPRE_BigInt *coarse_pnts_global ); HYPRE_Int hypre_BoomerAMGCoarseParmsHost ( MPI_Comm comm, HYPRE_Int local_num_variables, HYPRE_Int num_functions, hypre_IntArray *dof_func, hypre_IntArray *CF_marker, hypre_IntArray **coarse_dof_func_ptr, HYPRE_BigInt *coarse_pnts_global ); HYPRE_Int hypre_BoomerAMGCoarseParmsDevice ( MPI_Comm comm, HYPRE_Int local_num_variables, HYPRE_Int num_functions, hypre_IntArray *dof_func, hypre_IntArray *CF_marker, hypre_IntArray **coarse_dof_func_ptr, HYPRE_BigInt *coarse_pnts_global ); HYPRE_Int hypre_BoomerAMGInitDofFuncDevice( HYPRE_Int *dof_func, HYPRE_Int local_size, HYPRE_Int offset, HYPRE_Int num_functions ); /* par_coordinates.c */ float *hypre_GenerateCoordinates ( MPI_Comm comm, HYPRE_BigInt nx, HYPRE_BigInt ny, HYPRE_BigInt nz, HYPRE_Int P, HYPRE_Int Q, HYPRE_Int R, HYPRE_Int p, HYPRE_Int q, HYPRE_Int r, HYPRE_Int coorddim ); /* par_cr.c */ HYPRE_Int hypre_BoomerAMGCoarsenCR1 ( hypre_ParCSRMatrix *A, hypre_IntArray **CF_marker_ptr, HYPRE_BigInt *coarse_size_ptr, HYPRE_Int num_CR_relax_steps, HYPRE_Int IS_type, HYPRE_Int CRaddCpoints ); HYPRE_Int hypre_cr ( HYPRE_Int *A_i, HYPRE_Int *A_j, HYPRE_Real *A_data, HYPRE_Int n, HYPRE_Int *cf, HYPRE_Int rlx, HYPRE_Real omega, HYPRE_Real tg, HYPRE_Int mu ); HYPRE_Int hypre_GraphAdd ( Link *list, HYPRE_Int *head, HYPRE_Int *tail, HYPRE_Int index, HYPRE_Int istack ); HYPRE_Int hypre_GraphRemove ( Link *list, HYPRE_Int *head, HYPRE_Int *tail, HYPRE_Int index ); HYPRE_Int hypre_IndepSetGreedy ( HYPRE_Int *A_i, HYPRE_Int *A_j, HYPRE_Int n, HYPRE_Int *cf ); HYPRE_Int hypre_IndepSetGreedyS ( HYPRE_Int *A_i, HYPRE_Int *A_j, HYPRE_Int n, HYPRE_Int *cf ); HYPRE_Int hypre_fptjaccr ( HYPRE_Int *cf, HYPRE_Int *A_i, HYPRE_Int *A_j, HYPRE_Real *A_data, HYPRE_Int n, HYPRE_Real *e0, HYPRE_Real omega, HYPRE_Real *e1 ); HYPRE_Int hypre_fptgscr ( HYPRE_Int *cf, HYPRE_Int *A_i, HYPRE_Int *A_j, HYPRE_Real *A_data, HYPRE_Int n, HYPRE_Real *e0, HYPRE_Real *e1 ); HYPRE_Int hypre_formu ( HYPRE_Int *cf, HYPRE_Int n, HYPRE_Real *e1, HYPRE_Int *A_i, HYPRE_Real rho ); HYPRE_Int hypre_BoomerAMGIndepRS ( hypre_ParCSRMatrix *S, HYPRE_Int measure_type, HYPRE_Int debug_flag, HYPRE_Int *CF_marker ); HYPRE_Int hypre_BoomerAMGIndepRSa ( hypre_ParCSRMatrix *S, HYPRE_Int measure_type, HYPRE_Int debug_flag, HYPRE_Int *CF_marker ); HYPRE_Int hypre_BoomerAMGIndepHMIS ( hypre_ParCSRMatrix *S, HYPRE_Int measure_type, HYPRE_Int debug_flag, HYPRE_Int *CF_marker ); HYPRE_Int hypre_BoomerAMGIndepHMISa ( hypre_ParCSRMatrix *S, HYPRE_Int measure_type, HYPRE_Int debug_flag, HYPRE_Int *CF_marker ); HYPRE_Int hypre_BoomerAMGIndepPMIS ( hypre_ParCSRMatrix *S, HYPRE_Int CF_init, HYPRE_Int debug_flag, HYPRE_Int *CF_marker ); HYPRE_Int hypre_BoomerAMGIndepPMISa ( hypre_ParCSRMatrix *S, HYPRE_Int CF_init, HYPRE_Int debug_flag, HYPRE_Int *CF_marker ); HYPRE_Int hypre_BoomerAMGCoarsenCR ( hypre_ParCSRMatrix *A, hypre_IntArray **CF_marker_ptr, HYPRE_BigInt *coarse_size_ptr, HYPRE_Int num_CR_relax_steps, HYPRE_Int IS_type, HYPRE_Int num_functions, HYPRE_Int rlx_type, HYPRE_Real relax_weight, HYPRE_Real omega, HYPRE_Real theta, HYPRE_Solver smoother, hypre_ParCSRMatrix *AN, HYPRE_Int useCG, hypre_ParCSRMatrix *S ); /* par_cycle.c */ HYPRE_Int hypre_BoomerAMGCycle ( void *amg_vdata, hypre_ParVector **F_array, hypre_ParVector **U_array ); /* par_difconv.c */ HYPRE_ParCSRMatrix GenerateDifConv ( MPI_Comm comm, HYPRE_BigInt nx, HYPRE_BigInt ny, HYPRE_BigInt nz, HYPRE_Int P, HYPRE_Int Q, HYPRE_Int R, HYPRE_Int p, HYPRE_Int q, HYPRE_Int r, HYPRE_Real *value ); /* par_gsmg.c */ HYPRE_Int hypre_ParCSRMatrixFillSmooth ( HYPRE_Int nsamples, HYPRE_Real *samples, hypre_ParCSRMatrix *S, hypre_ParCSRMatrix *A, HYPRE_Int num_functions, HYPRE_Int *dof_func ); HYPRE_Real hypre_ParCSRMatrixChooseThresh ( hypre_ParCSRMatrix *S ); HYPRE_Int hypre_ParCSRMatrixThreshold ( hypre_ParCSRMatrix *A, HYPRE_Real thresh ); HYPRE_Int hypre_BoomerAMGCreateSmoothVecs ( void *data, hypre_ParCSRMatrix *A, HYPRE_Int num_sweeps, HYPRE_Int level, HYPRE_Real **SmoothVecs_p ); HYPRE_Int hypre_BoomerAMGCreateSmoothDirs ( void *data, hypre_ParCSRMatrix *A, HYPRE_Real *SmoothVecs, HYPRE_Real thresh, HYPRE_Int num_functions, HYPRE_Int *dof_func, hypre_ParCSRMatrix **S_ptr ); HYPRE_Int hypre_BoomerAMGNormalizeVecs ( HYPRE_Int n, HYPRE_Int num, HYPRE_Real *V ); HYPRE_Int hypre_BoomerAMGFitVectors ( HYPRE_Int ip, HYPRE_Int n, HYPRE_Int num, const HYPRE_Real *V, HYPRE_Int nc, const HYPRE_Int *ind, HYPRE_Real *val ); HYPRE_Int hypre_BoomerAMGBuildInterpLS ( hypre_ParCSRMatrix *A, HYPRE_Int *CF_marker, hypre_ParCSRMatrix *S, HYPRE_BigInt *num_cpts_global, HYPRE_Int num_functions, HYPRE_Int *dof_func, HYPRE_Int debug_flag, HYPRE_Real trunc_factor, HYPRE_Int num_smooth, HYPRE_Real *SmoothVecs, hypre_ParCSRMatrix **P_ptr ); HYPRE_Int hypre_BoomerAMGBuildInterpGSMG ( hypre_ParCSRMatrix *A, HYPRE_Int *CF_marker, hypre_ParCSRMatrix *S, HYPRE_BigInt *num_cpts_global, HYPRE_Int num_functions, HYPRE_Int *dof_func, HYPRE_Int debug_flag, HYPRE_Real trunc_factor, hypre_ParCSRMatrix **P_ptr ); /* par_indepset.c */ HYPRE_Int hypre_BoomerAMGIndepSetInit ( hypre_ParCSRMatrix *S, HYPRE_Real *measure_array, HYPRE_Int seq_rand ); HYPRE_Int hypre_BoomerAMGIndepSet ( hypre_ParCSRMatrix *S, HYPRE_Real *measure_array, HYPRE_Int *graph_array, HYPRE_Int graph_array_size, HYPRE_Int *graph_array_offd, HYPRE_Int graph_array_offd_size, HYPRE_Int *IS_marker, HYPRE_Int *IS_marker_offd ); HYPRE_Int hypre_BoomerAMGIndepSetInitDevice( hypre_ParCSRMatrix *S, HYPRE_Real *measure_array, HYPRE_Int aug_rand); HYPRE_Int hypre_BoomerAMGIndepSetDevice( hypre_ParCSRMatrix *S, HYPRE_Real *measure_diag, HYPRE_Real *measure_offd, HYPRE_Int graph_diag_size, HYPRE_Int *graph_diag, HYPRE_Int *IS_marker_diag, HYPRE_Int *IS_marker_offd, hypre_ParCSRCommPkg *comm_pkg, HYPRE_Int *int_send_buf ); /* par_interp.c */ HYPRE_Int hypre_BoomerAMGBuildInterp ( hypre_ParCSRMatrix *A, HYPRE_Int *CF_marker, hypre_ParCSRMatrix *S, HYPRE_BigInt *num_cpts_global, HYPRE_Int num_functions, HYPRE_Int *dof_func, HYPRE_Int debug_flag, HYPRE_Real trunc_factor, HYPRE_Int max_elmts, hypre_ParCSRMatrix **P_ptr ); HYPRE_Int hypre_BoomerAMGBuildInterpHE ( hypre_ParCSRMatrix *A, HYPRE_Int *CF_marker, hypre_ParCSRMatrix *S, HYPRE_BigInt *num_cpts_global, HYPRE_Int num_functions, HYPRE_Int *dof_func, HYPRE_Int debug_flag, HYPRE_Real trunc_factor, HYPRE_Int max_elmts, hypre_ParCSRMatrix **P_ptr ); HYPRE_Int hypre_BoomerAMGBuildDirInterp ( hypre_ParCSRMatrix *A, HYPRE_Int *CF_marker, hypre_ParCSRMatrix *S, HYPRE_BigInt *num_cpts_global, HYPRE_Int num_functions, HYPRE_Int *dof_func, HYPRE_Int debug_flag, HYPRE_Real trunc_factor, HYPRE_Int max_elmts, HYPRE_Int interp_type, hypre_ParCSRMatrix **P_ptr ); HYPRE_Int hypre_BoomerAMGBuildDirInterpDevice( hypre_ParCSRMatrix *A, HYPRE_Int *CF_marker, hypre_ParCSRMatrix *S, HYPRE_BigInt *num_cpts_global, HYPRE_Int num_functions, HYPRE_Int *dof_func, HYPRE_Int debug_flag, HYPRE_Real trunc_factor, HYPRE_Int max_elmts, HYPRE_Int interp_type, hypre_ParCSRMatrix **P_ptr ); HYPRE_Int hypre_BoomerAMGInterpTruncation ( hypre_ParCSRMatrix *P, HYPRE_Real trunc_factor, HYPRE_Int max_elmts ); HYPRE_Int hypre_BoomerAMGInterpTruncationDevice( hypre_ParCSRMatrix *P, HYPRE_Real trunc_factor, HYPRE_Int max_elmts ); HYPRE_Int hypre_BoomerAMGBuildInterpModUnk ( hypre_ParCSRMatrix *A, HYPRE_Int *CF_marker, hypre_ParCSRMatrix *S, HYPRE_BigInt *num_cpts_global, HYPRE_Int num_functions, HYPRE_Int *dof_func, HYPRE_Int debug_flag, HYPRE_Real trunc_factor, HYPRE_Int max_elmts, hypre_ParCSRMatrix **P_ptr ); HYPRE_Int hypre_BoomerAMGTruncandBuild ( hypre_ParCSRMatrix *P, HYPRE_Real trunc_factor, HYPRE_Int max_elmts ); hypre_ParCSRMatrix *hypre_CreateC ( hypre_ParCSRMatrix *A, HYPRE_Real w ); HYPRE_Int hypre_BoomerAMGBuildInterpOnePntHost( hypre_ParCSRMatrix *A, HYPRE_Int *CF_marker, hypre_ParCSRMatrix *S, HYPRE_BigInt *num_cpts_global, HYPRE_Int num_functions, HYPRE_Int *dof_func, HYPRE_Int debug_flag, hypre_ParCSRMatrix **P_ptr); HYPRE_Int hypre_BoomerAMGBuildInterpOnePntDevice( hypre_ParCSRMatrix *A, HYPRE_Int *CF_marker, hypre_ParCSRMatrix *S, HYPRE_BigInt *num_cpts_global, HYPRE_Int num_functions, HYPRE_Int *dof_func, HYPRE_Int debug_flag, hypre_ParCSRMatrix **P_ptr); HYPRE_Int hypre_BoomerAMGBuildInterpOnePnt( hypre_ParCSRMatrix *A, HYPRE_Int *CF_marker, hypre_ParCSRMatrix *S, HYPRE_BigInt *num_cpts_global, HYPRE_Int num_functions, HYPRE_Int *dof_func, HYPRE_Int debug_flag, hypre_ParCSRMatrix **P_ptr); /* par_jacobi_interp.c */ void hypre_BoomerAMGJacobiInterp ( hypre_ParCSRMatrix *A, hypre_ParCSRMatrix **P, hypre_ParCSRMatrix *S, HYPRE_Int num_functions, HYPRE_Int *dof_func, HYPRE_Int *CF_marker, HYPRE_Int level, HYPRE_Real truncation_threshold, HYPRE_Real truncation_threshold_minus ); void hypre_BoomerAMGJacobiInterp_1 ( hypre_ParCSRMatrix *A, hypre_ParCSRMatrix **P, hypre_ParCSRMatrix *S, HYPRE_Int *CF_marker, HYPRE_Int level, HYPRE_Real truncation_threshold, HYPRE_Real truncation_threshold_minus, HYPRE_Int *dof_func, HYPRE_Int *dof_func_offd, HYPRE_Real weight_AF ); void hypre_BoomerAMGTruncateInterp ( hypre_ParCSRMatrix *P, HYPRE_Real eps, HYPRE_Real dlt, HYPRE_Int *CF_marker ); HYPRE_Int hypre_ParCSRMatrix_dof_func_offd ( hypre_ParCSRMatrix *A, HYPRE_Int num_functions, HYPRE_Int *dof_func, HYPRE_Int **dof_func_offd ); /* par_laplace_27pt.c */ HYPRE_ParCSRMatrix GenerateLaplacian27pt ( MPI_Comm comm, HYPRE_BigInt nx, HYPRE_BigInt ny, HYPRE_BigInt nz, HYPRE_Int P, HYPRE_Int Q, HYPRE_Int R, HYPRE_Int p, HYPRE_Int q, HYPRE_Int r, HYPRE_Real *value ); HYPRE_Int hypre_map3 ( HYPRE_BigInt ix, HYPRE_BigInt iy, HYPRE_BigInt iz, HYPRE_Int p, HYPRE_Int q, HYPRE_Int r, HYPRE_Int P, HYPRE_Int Q, HYPRE_Int R, HYPRE_BigInt *nx_part, HYPRE_BigInt *ny_part, HYPRE_BigInt *nz_part ); /* par_laplace_9pt.c */ HYPRE_ParCSRMatrix GenerateLaplacian9pt ( MPI_Comm comm, HYPRE_BigInt nx, HYPRE_BigInt ny, HYPRE_Int P, HYPRE_Int Q, HYPRE_Int p, HYPRE_Int q, HYPRE_Real *value ); HYPRE_BigInt hypre_map2 ( HYPRE_BigInt ix, HYPRE_BigInt iy, HYPRE_Int p, HYPRE_Int q, HYPRE_BigInt nx, HYPRE_BigInt *nx_part, HYPRE_BigInt *ny_part ); /* par_laplace.c */ HYPRE_ParCSRMatrix GenerateLaplacian ( MPI_Comm comm, HYPRE_BigInt ix, HYPRE_BigInt ny, HYPRE_BigInt nz, HYPRE_Int P, HYPRE_Int Q, HYPRE_Int R, HYPRE_Int p, HYPRE_Int q, HYPRE_Int r, HYPRE_Real *value ); HYPRE_BigInt hypre_map ( HYPRE_BigInt ix, HYPRE_BigInt iy, HYPRE_BigInt iz, HYPRE_Int p, HYPRE_Int q, HYPRE_Int r, HYPRE_BigInt nx, HYPRE_BigInt ny, HYPRE_BigInt *nx_part, HYPRE_BigInt *ny_part, HYPRE_BigInt *nz_part ); HYPRE_ParCSRMatrix GenerateSysLaplacian ( MPI_Comm comm, HYPRE_BigInt nx, HYPRE_BigInt ny, HYPRE_BigInt nz, HYPRE_Int P, HYPRE_Int Q, HYPRE_Int R, HYPRE_Int p, HYPRE_Int q, HYPRE_Int r, HYPRE_Int num_fun, HYPRE_Real *mtrx, HYPRE_Real *value ); HYPRE_ParCSRMatrix GenerateSysLaplacianVCoef ( MPI_Comm comm, HYPRE_BigInt nx, HYPRE_BigInt ny, HYPRE_BigInt nz, HYPRE_Int P, HYPRE_Int Q, HYPRE_Int R, HYPRE_Int p, HYPRE_Int q, HYPRE_Int r, HYPRE_Int num_fun, HYPRE_Real *mtrx, HYPRE_Real *value ); /* par_lr_interp.c */ HYPRE_Int hypreDevice_extendWtoP ( HYPRE_Int P_nr_of_rows, HYPRE_Int W_nr_of_rows, HYPRE_Int W_nr_of_cols, HYPRE_Int *CF_marker, HYPRE_Int W_diag_nnz, HYPRE_Int *W_diag_i, HYPRE_Int *W_diag_j, HYPRE_Complex *W_diag_data, HYPRE_Int *P_diag_i, HYPRE_Int *P_diag_j, HYPRE_Complex *P_diag_data, HYPRE_Int *W_offd_i, HYPRE_Int *P_offd_i ); HYPRE_Int hypre_BoomerAMGBuildStdInterp ( hypre_ParCSRMatrix *A, HYPRE_Int *CF_marker, hypre_ParCSRMatrix *S, HYPRE_BigInt *num_cpts_global, HYPRE_Int num_functions, HYPRE_Int *dof_func, HYPRE_Int debug_flag, HYPRE_Real trunc_factor, HYPRE_Int max_elmts, HYPRE_Int sep_weight, hypre_ParCSRMatrix **P_ptr ); HYPRE_Int hypre_BoomerAMGBuildExtPIInterp ( hypre_ParCSRMatrix *A, HYPRE_Int *CF_marker, hypre_ParCSRMatrix *S, HYPRE_BigInt *num_cpts_global, HYPRE_Int num_functions, HYPRE_Int *dof_func, HYPRE_Int debug_flag, HYPRE_Real trunc_factor, HYPRE_Int max_elmts, hypre_ParCSRMatrix **P_ptr ); HYPRE_Int hypre_BoomerAMGBuildExtPIInterpHost ( hypre_ParCSRMatrix *A, HYPRE_Int *CF_marker, hypre_ParCSRMatrix *S, HYPRE_BigInt *num_cpts_global, HYPRE_Int num_functions, HYPRE_Int *dof_func, HYPRE_Int debug_flag, HYPRE_Real trunc_factor, HYPRE_Int max_elmts, hypre_ParCSRMatrix **P_ptr ); HYPRE_Int hypre_BoomerAMGBuildExtPICCInterp ( hypre_ParCSRMatrix *A, HYPRE_Int *CF_marker, hypre_ParCSRMatrix *S, HYPRE_BigInt *num_cpts_global, HYPRE_Int num_functions, HYPRE_Int *dof_func, HYPRE_Int debug_flag, HYPRE_Real trunc_factor, HYPRE_Int max_elmts, hypre_ParCSRMatrix **P_ptr ); HYPRE_Int hypre_BoomerAMGBuildFFInterp ( hypre_ParCSRMatrix *A, HYPRE_Int *CF_marker, hypre_ParCSRMatrix *S, HYPRE_BigInt *num_cpts_global, HYPRE_Int num_functions, HYPRE_Int *dof_func, HYPRE_Int debug_flag, HYPRE_Real trunc_factor, HYPRE_Int max_elmts, hypre_ParCSRMatrix **P_ptr ); HYPRE_Int hypre_BoomerAMGBuildFF1Interp ( hypre_ParCSRMatrix *A, HYPRE_Int *CF_marker, hypre_ParCSRMatrix *S, HYPRE_BigInt *num_cpts_global, HYPRE_Int num_functions, HYPRE_Int *dof_func, HYPRE_Int debug_flag, HYPRE_Real trunc_factor, HYPRE_Int max_elmts, hypre_ParCSRMatrix **P_ptr ); HYPRE_Int hypre_BoomerAMGBuildExtInterp ( hypre_ParCSRMatrix *A, HYPRE_Int *CF_marker, hypre_ParCSRMatrix *S, HYPRE_BigInt *num_cpts_global, HYPRE_Int num_functions, HYPRE_Int *dof_func, HYPRE_Int debug_flag, HYPRE_Real trunc_factor, HYPRE_Int max_elmts, hypre_ParCSRMatrix **P_ptr ); /* par_lr_interp_device.c */ HYPRE_Int hypre_BoomerAMGBuildExtInterpDevice(hypre_ParCSRMatrix *A, HYPRE_Int *CF_marker, hypre_ParCSRMatrix *S, HYPRE_BigInt *num_cpts_global, HYPRE_Int num_functions, HYPRE_Int *dof_func, HYPRE_Int debug_flag, HYPRE_Real trunc_factor, HYPRE_Int max_elmts, hypre_ParCSRMatrix **P_ptr); HYPRE_Int hypre_BoomerAMGBuildExtPIInterpDevice( hypre_ParCSRMatrix *A, HYPRE_Int *CF_marker, hypre_ParCSRMatrix *S, HYPRE_BigInt *num_cpts_global, HYPRE_Int num_functions, HYPRE_Int *dof_func, HYPRE_Int debug_flag, HYPRE_Real trunc_factor, HYPRE_Int max_elmts, hypre_ParCSRMatrix **P_ptr); HYPRE_Int hypre_BoomerAMGBuildExtPEInterpDevice(hypre_ParCSRMatrix *A, HYPRE_Int *CF_marker, hypre_ParCSRMatrix *S, HYPRE_BigInt *num_cpts_global, HYPRE_Int num_functions, HYPRE_Int *dof_func, HYPRE_Int debug_flag, HYPRE_Real trunc_factor, HYPRE_Int max_elmts, hypre_ParCSRMatrix **P_ptr); /* par_mod_lr_interp.c */ HYPRE_Int hypre_BoomerAMGBuildModExtInterp(hypre_ParCSRMatrix *A, HYPRE_Int *CF_marker, hypre_ParCSRMatrix *S, HYPRE_BigInt *num_cpts_global, HYPRE_Int num_functions, HYPRE_Int *dof_func, HYPRE_Int debug_flag, HYPRE_Real trunc_factor, HYPRE_Int max_elmts, hypre_ParCSRMatrix **P_ptr); HYPRE_Int hypre_BoomerAMGBuildModExtPIInterp(hypre_ParCSRMatrix *A, HYPRE_Int *CF_marker, hypre_ParCSRMatrix *S, HYPRE_BigInt *num_cpts_global, HYPRE_Int num_functions, HYPRE_Int *dof_func, HYPRE_Int debug_flag, HYPRE_Real trunc_factor, HYPRE_Int max_elmts, hypre_ParCSRMatrix **P_ptr); HYPRE_Int hypre_BoomerAMGBuildModExtPEInterp(hypre_ParCSRMatrix *A, HYPRE_Int *CF_marker, hypre_ParCSRMatrix *S, HYPRE_BigInt *num_cpts_global, HYPRE_Int num_functions, HYPRE_Int *dof_func, HYPRE_Int debug_flag, HYPRE_Real trunc_factor, HYPRE_Int max_elmts, hypre_ParCSRMatrix **P_ptr); /* par_2s_interp.c */ HYPRE_Int hypre_BoomerAMGBuildModPartialExtInterpHost ( hypre_ParCSRMatrix *A, HYPRE_Int *CF_marker, hypre_ParCSRMatrix *S, HYPRE_BigInt *num_cpts_global, HYPRE_BigInt *num_old_cpts_global, HYPRE_Int num_functions, HYPRE_Int *dof_func, HYPRE_Int debug_flag, HYPRE_Real trunc_factor, HYPRE_Int max_elmts, hypre_ParCSRMatrix **P_ptr ); HYPRE_Int hypre_BoomerAMGBuildModPartialExtInterpDevice ( hypre_ParCSRMatrix *A, HYPRE_Int *CF_marker, hypre_ParCSRMatrix *S, HYPRE_BigInt *num_cpts_global, HYPRE_BigInt *num_old_cpts_global, HYPRE_Int debug_flag, HYPRE_Real trunc_factor, HYPRE_Int max_elmts, hypre_ParCSRMatrix **P_ptr ); HYPRE_Int hypre_BoomerAMGBuildModPartialExtInterp ( hypre_ParCSRMatrix *A, HYPRE_Int *CF_marker, hypre_ParCSRMatrix *S, HYPRE_BigInt *num_cpts_global, HYPRE_BigInt *num_old_cpts_global, HYPRE_Int num_functions, HYPRE_Int *dof_func, HYPRE_Int debug_flag, HYPRE_Real trunc_factor, HYPRE_Int max_elmts, hypre_ParCSRMatrix **P_ptr ); HYPRE_Int hypre_BoomerAMGBuildModPartialExtPEInterpHost ( hypre_ParCSRMatrix *A, HYPRE_Int *CF_marker, hypre_ParCSRMatrix *S, HYPRE_BigInt *num_cpts_global, HYPRE_BigInt *num_old_cpts_global, HYPRE_Int num_functions, HYPRE_Int *dof_func, HYPRE_Int debug_flag, HYPRE_Real trunc_factor, HYPRE_Int max_elmts, hypre_ParCSRMatrix **P_ptr ); HYPRE_Int hypre_BoomerAMGBuildModPartialExtPEInterpDevice ( hypre_ParCSRMatrix *A, HYPRE_Int *CF_marker, hypre_ParCSRMatrix *S, HYPRE_BigInt *num_cpts_global, HYPRE_BigInt *num_old_cpts_global, HYPRE_Int debug_flag, HYPRE_Real trunc_factor, HYPRE_Int max_elmts, hypre_ParCSRMatrix **P_ptr ); HYPRE_Int hypre_BoomerAMGBuildModPartialExtPEInterp ( hypre_ParCSRMatrix *A, HYPRE_Int *CF_marker, hypre_ParCSRMatrix *S, HYPRE_BigInt *num_cpts_global, HYPRE_BigInt *num_old_cpts_global, HYPRE_Int num_functions, HYPRE_Int *dof_func, HYPRE_Int debug_flag, HYPRE_Real trunc_factor, HYPRE_Int max_elmts, hypre_ParCSRMatrix **P_ptr ); /* par_mod_multi_interp.c */ HYPRE_Int hypre_BoomerAMGBuildModMultipass ( hypre_ParCSRMatrix *A, HYPRE_Int *CF_marker, hypre_ParCSRMatrix *S, HYPRE_BigInt *num_cpts_global, HYPRE_Real trunc_factor, HYPRE_Int P_max_elmts, HYPRE_Int interp_type, HYPRE_Int num_functions, HYPRE_Int *dof_func, hypre_ParCSRMatrix **P_ptr ); HYPRE_Int hypre_BoomerAMGBuildModMultipassHost ( hypre_ParCSRMatrix *A, HYPRE_Int *CF_marker, hypre_ParCSRMatrix *S, HYPRE_BigInt *num_cpts_global, HYPRE_Real trunc_factor, HYPRE_Int P_max_elmts, HYPRE_Int interp_type, HYPRE_Int num_functions, HYPRE_Int *dof_func, hypre_ParCSRMatrix **P_ptr ); HYPRE_Int hypre_GenerateMultipassPi ( hypre_ParCSRMatrix *A, hypre_ParCSRMatrix *S, HYPRE_BigInt *c_pts_starts, HYPRE_Int *pass_order, HYPRE_Int *pass_marker, HYPRE_Int *pass_marker_offd, HYPRE_Int num_points, HYPRE_Int color, HYPRE_Real *row_sums, hypre_ParCSRMatrix **P_ptr ); HYPRE_Int hypre_GenerateMultiPi ( hypre_ParCSRMatrix *A, hypre_ParCSRMatrix *S, hypre_ParCSRMatrix *P, HYPRE_BigInt *c_pts_starts, HYPRE_Int *pass_order, HYPRE_Int *pass_marker, HYPRE_Int *pass_marker_offd, HYPRE_Int num_points, HYPRE_Int color, HYPRE_Int num_functions, HYPRE_Int *dof_func, HYPRE_Int *dof_func_offd, hypre_ParCSRMatrix **Pi_ptr ); HYPRE_Int hypre_BoomerAMGBuildModMultipassDevice ( hypre_ParCSRMatrix *A, HYPRE_Int *CF_marker, hypre_ParCSRMatrix *S, HYPRE_BigInt *num_cpts_global, HYPRE_Real trunc_factor, HYPRE_Int P_max_elmts, HYPRE_Int interp_type, HYPRE_Int num_functions, HYPRE_Int *dof_func, hypre_ParCSRMatrix **P_ptr ); HYPRE_Int hypre_GenerateMultipassPiDevice ( hypre_ParCSRMatrix *A, hypre_ParCSRMatrix *S, HYPRE_BigInt *c_pts_starts, HYPRE_Int *pass_order, HYPRE_Int *pass_marker, HYPRE_Int *pass_marker_offd, HYPRE_Int num_points, HYPRE_Int color, HYPRE_Real *row_sums, hypre_ParCSRMatrix **P_ptr ); HYPRE_Int hypre_GenerateMultiPiDevice ( hypre_ParCSRMatrix *A, hypre_ParCSRMatrix *S, hypre_ParCSRMatrix *P, HYPRE_BigInt *c_pts_starts, HYPRE_Int *pass_order, HYPRE_Int *pass_marker, HYPRE_Int *pass_marker_offd, HYPRE_Int num_points, HYPRE_Int color, HYPRE_Int num_functions, HYPRE_Int *dof_func, HYPRE_Int *dof_func_offd, hypre_ParCSRMatrix **Pi_ptr ); /* par_multi_interp.c */ HYPRE_Int hypre_BoomerAMGBuildMultipass ( hypre_ParCSRMatrix *A, HYPRE_Int *CF_marker, hypre_ParCSRMatrix *S, HYPRE_BigInt *num_cpts_global, HYPRE_Int num_functions, HYPRE_Int *dof_func, HYPRE_Int debug_flag, HYPRE_Real trunc_factor, HYPRE_Int P_max_elmts, HYPRE_Int weight_option, hypre_ParCSRMatrix **P_ptr ); HYPRE_Int hypre_BoomerAMGBuildMultipassHost ( hypre_ParCSRMatrix *A, HYPRE_Int *CF_marker, hypre_ParCSRMatrix *S, HYPRE_BigInt *num_cpts_global, HYPRE_Int num_functions, HYPRE_Int *dof_func, HYPRE_Int debug_flag, HYPRE_Real trunc_factor, HYPRE_Int P_max_elmts, HYPRE_Int weight_option, hypre_ParCSRMatrix **P_ptr ); /* par_nodal_systems.c */ HYPRE_Int hypre_BoomerAMGCreateNodalA ( hypre_ParCSRMatrix *A, HYPRE_Int num_functions, HYPRE_Int *dof_func, HYPRE_Int option, HYPRE_Int diag_option, hypre_ParCSRMatrix **AN_ptr ); HYPRE_Int hypre_BoomerAMGCreateScalarCFS ( hypre_ParCSRMatrix *SN, hypre_ParCSRMatrix *A, HYPRE_Int *CFN_marker, HYPRE_Int num_functions, HYPRE_Int nodal, HYPRE_Int keep_same_sign, hypre_IntArray **dof_func_ptr, hypre_IntArray **CF_marker_ptr, hypre_ParCSRMatrix **S_ptr ); HYPRE_Int hypre_BoomerAMGCreateScalarCF ( HYPRE_Int *CFN_marker, HYPRE_Int num_functions, HYPRE_Int num_nodes, hypre_IntArray **dof_func_ptr, hypre_IntArray **CF_marker_ptr ); /* par_nongalerkin.c */ HYPRE_Int hypre_GrabSubArray ( HYPRE_Int *indices, HYPRE_Int start, HYPRE_Int end, HYPRE_BigInt *array, HYPRE_BigInt *output ); HYPRE_Int hypre_IntersectTwoArrays ( HYPRE_Int *x, HYPRE_Real *x_data, HYPRE_Int x_length, HYPRE_Int *y, HYPRE_Int y_length, HYPRE_Int *z, HYPRE_Real *output_x_data, HYPRE_Int *intersect_length ); HYPRE_Int hypre_IntersectTwoBigArrays ( HYPRE_BigInt *x, HYPRE_Real *x_data, HYPRE_Int x_length, HYPRE_BigInt *y, HYPRE_Int y_length, HYPRE_BigInt *z, HYPRE_Real *output_x_data, HYPRE_Int *intersect_length ); HYPRE_Int hypre_SortedCopyParCSRData ( hypre_ParCSRMatrix *A, hypre_ParCSRMatrix *B ); HYPRE_Int hypre_BoomerAMG_MyCreateS ( hypre_ParCSRMatrix *A, HYPRE_Real strength_threshold, HYPRE_Real max_row_sum, HYPRE_Int num_functions, HYPRE_Int *dof_func, hypre_ParCSRMatrix **S_ptr ); HYPRE_Int hypre_BoomerAMGCreateSFromCFMarker(hypre_ParCSRMatrix *A, HYPRE_Real strength_threshold, HYPRE_Real max_row_sum, HYPRE_Int *CF_marker, HYPRE_Int num_functions, HYPRE_Int *dof_func, HYPRE_Int SMRK, hypre_ParCSRMatrix **S_ptr); HYPRE_Int hypre_NonGalerkinIJBufferInit ( HYPRE_Int *ijbuf_cnt, HYPRE_Int *ijbuf_rowcounter, HYPRE_Int *ijbuf_numcols ); HYPRE_Int hypre_NonGalerkinIJBigBufferInit ( HYPRE_Int *ijbuf_cnt, HYPRE_Int *ijbuf_rowcounter, HYPRE_BigInt *ijbuf_numcols ); HYPRE_Int hypre_NonGalerkinIJBufferNewRow ( HYPRE_BigInt *ijbuf_rownums, HYPRE_Int *ijbuf_numcols, HYPRE_Int *ijbuf_rowcounter, HYPRE_BigInt new_row ); HYPRE_Int hypre_NonGalerkinIJBufferCompressRow ( HYPRE_Int *ijbuf_cnt, HYPRE_Int ijbuf_rowcounter, HYPRE_Real *ijbuf_data, HYPRE_BigInt *ijbuf_cols, HYPRE_BigInt *ijbuf_rownums, HYPRE_Int *ijbuf_numcols ); HYPRE_Int hypre_NonGalerkinIJBufferCompress ( HYPRE_MemoryLocation memory_location, HYPRE_Int ijbuf_size, HYPRE_Int *ijbuf_cnt, HYPRE_Int *ijbuf_rowcounter, HYPRE_Real **ijbuf_data, HYPRE_BigInt **ijbuf_cols, HYPRE_BigInt **ijbuf_rownums, HYPRE_Int **ijbuf_numcols ); HYPRE_Int hypre_NonGalerkinIJBufferWrite ( HYPRE_IJMatrix B, HYPRE_Int *ijbuf_cnt, HYPRE_Int ijbuf_size, HYPRE_Int *ijbuf_rowcounter, HYPRE_Real **ijbuf_data, HYPRE_BigInt **ijbuf_cols, HYPRE_BigInt **ijbuf_rownums, HYPRE_Int **ijbuf_numcols, HYPRE_BigInt row_to_write, HYPRE_BigInt col_to_write, HYPRE_Real val_to_write ); HYPRE_Int hypre_NonGalerkinIJBufferEmpty ( HYPRE_IJMatrix B, HYPRE_Int ijbuf_size, HYPRE_Int *ijbuf_cnt, HYPRE_Int ijbuf_rowcounter, HYPRE_Real **ijbuf_data, HYPRE_BigInt **ijbuf_cols, HYPRE_BigInt **ijbuf_rownums, HYPRE_Int **ijbuf_numcols ); hypre_ParCSRMatrix * hypre_NonGalerkinSparsityPattern(hypre_ParCSRMatrix *R_IAP, hypre_ParCSRMatrix *RAP, HYPRE_Int * CF_marker, HYPRE_Real droptol, HYPRE_Int sym_collapse, HYPRE_Int collapse_beta ); HYPRE_Int hypre_BoomerAMGBuildNonGalerkinCoarseOperator( hypre_ParCSRMatrix **RAP_ptr, hypre_ParCSRMatrix *AP, HYPRE_Real strong_threshold, HYPRE_Real max_row_sum, HYPRE_Int num_functions, HYPRE_Int * dof_func_value, HYPRE_Int * CF_marker, HYPRE_Real droptol, HYPRE_Int sym_collapse, HYPRE_Real lump_percent, HYPRE_Int collapse_beta ); /* par_rap.c */ HYPRE_Int hypre_BoomerAMGBuildCoarseOperator ( hypre_ParCSRMatrix *RT, hypre_ParCSRMatrix *A, hypre_ParCSRMatrix *P, hypre_ParCSRMatrix **RAP_ptr ); HYPRE_Int hypre_BoomerAMGBuildCoarseOperatorKT ( hypre_ParCSRMatrix *RT, hypre_ParCSRMatrix *A, hypre_ParCSRMatrix *P, HYPRE_Int keepTranspose, hypre_ParCSRMatrix **RAP_ptr ); /* par_rap_communication.c */ HYPRE_Int hypre_GetCommPkgRTFromCommPkgA ( hypre_ParCSRMatrix *RT, hypre_ParCSRMatrix *A, HYPRE_Int *fine_to_coarse, HYPRE_Int *tmp_map_offd ); HYPRE_Int hypre_GenerateSendMapAndCommPkg ( MPI_Comm comm, HYPRE_Int num_sends, HYPRE_Int num_recvs, HYPRE_Int *recv_procs, HYPRE_Int *send_procs, HYPRE_Int *recv_vec_starts, hypre_ParCSRMatrix *A ); /* par_ge_device.c */ HYPRE_Int hypre_GaussElimSetupDevice ( hypre_ParAMGData *amg_data, HYPRE_Int level, HYPRE_Int solver_type ); HYPRE_Int hypre_GaussElimSolveDevice ( hypre_ParAMGData *amg_data, HYPRE_Int level, HYPRE_Int solver_type ); /* par_gauss_elim.c */ HYPRE_Int hypre_GaussElimSetup ( hypre_ParAMGData *amg_data, HYPRE_Int level, HYPRE_Int solver_type ); HYPRE_Int hypre_GaussElimSolve ( hypre_ParAMGData *amg_data, HYPRE_Int level, HYPRE_Int solver_type ); /* par_relax.c */ HYPRE_Int hypre_BoomerAMGRelax ( hypre_ParCSRMatrix *A, hypre_ParVector *f, HYPRE_Int *cf_marker, HYPRE_Int relax_type, HYPRE_Int relax_points, HYPRE_Real relax_weight, HYPRE_Real omega, HYPRE_Real *l1_norms, hypre_ParVector *u, hypre_ParVector *Vtemp, hypre_ParVector *Ztemp ); HYPRE_Int hypre_BoomerAMGRelaxHybridGaussSeidel_core( hypre_ParCSRMatrix *A, hypre_ParVector *f, HYPRE_Int *cf_marker, HYPRE_Int relax_points, HYPRE_Real relax_weight, HYPRE_Real omega, HYPRE_Real *l1_norms, hypre_ParVector *u, hypre_ParVector *Vtemp, hypre_ParVector *Ztemp, HYPRE_Int GS_order, HYPRE_Int Symm, HYPRE_Int Skip_diag, HYPRE_Int forced_seq, HYPRE_Int Topo_order ); HYPRE_Int hypre_BoomerAMGRelax0WeightedJacobi( hypre_ParCSRMatrix *A, hypre_ParVector *f, HYPRE_Int *cf_marker, HYPRE_Int relax_points, HYPRE_Real relax_weight, hypre_ParVector *u, hypre_ParVector *Vtemp ); HYPRE_Int hypre_BoomerAMGRelaxHybridSOR( hypre_ParCSRMatrix *A, hypre_ParVector *f, HYPRE_Int *cf_marker, HYPRE_Int relax_points, HYPRE_Real relax_weight, HYPRE_Real omega, HYPRE_Real *l1_norms, hypre_ParVector *u, hypre_ParVector *Vtemp, hypre_ParVector *Ztemp, HYPRE_Int direction, HYPRE_Int symm, HYPRE_Int skip_diag, HYPRE_Int force_seq ); HYPRE_Int hypre_BoomerAMGRelax1GaussSeidel( hypre_ParCSRMatrix *A, hypre_ParVector *f, HYPRE_Int *cf_marker, HYPRE_Int relax_points, hypre_ParVector *u ); HYPRE_Int hypre_BoomerAMGRelax2GaussSeidel( hypre_ParCSRMatrix *A, hypre_ParVector *f, HYPRE_Int *cf_marker, HYPRE_Int relax_points, hypre_ParVector *u ); HYPRE_Int hypre_BoomerAMGRelax5ChaoticHybridGaussSeidel( hypre_ParCSRMatrix *A, hypre_ParVector *f, HYPRE_Int *cf_marker, HYPRE_Int relax_points, hypre_ParVector *u ); HYPRE_Int hypre_BoomerAMGRelax3HybridGaussSeidel( hypre_ParCSRMatrix *A, hypre_ParVector *f, HYPRE_Int *cf_marker, HYPRE_Int relax_points, HYPRE_Real relax_weight, HYPRE_Real omega, hypre_ParVector *u, hypre_ParVector *Vtemp, hypre_ParVector *Ztemp ); HYPRE_Int hypre_BoomerAMGRelax4HybridGaussSeidel( hypre_ParCSRMatrix *A, hypre_ParVector *f, HYPRE_Int *cf_marker, HYPRE_Int relax_points, HYPRE_Real relax_weight, HYPRE_Real omega, hypre_ParVector *u, hypre_ParVector *Vtemp, hypre_ParVector *Ztemp ); HYPRE_Int hypre_BoomerAMGRelax6HybridSSOR( hypre_ParCSRMatrix *A, hypre_ParVector *f, HYPRE_Int *cf_marker, HYPRE_Int relax_points, HYPRE_Real relax_weight, HYPRE_Real omega, hypre_ParVector *u, hypre_ParVector *Vtemp, hypre_ParVector *Ztemp ); HYPRE_Int hypre_BoomerAMGRelax7Jacobi( hypre_ParCSRMatrix *A, hypre_ParVector *f, HYPRE_Int *cf_marker, HYPRE_Int relax_points, HYPRE_Real relax_weight, HYPRE_Real *l1_norms, hypre_ParVector *u, hypre_ParVector *Vtemp ); HYPRE_Int hypre_BoomerAMGRelax8HybridL1SSOR( hypre_ParCSRMatrix *A, hypre_ParVector *f, HYPRE_Int *cf_marker, HYPRE_Int relax_points, HYPRE_Real relax_weight, HYPRE_Real omega, HYPRE_Real *l1_norms, hypre_ParVector *u, hypre_ParVector *Vtemp, hypre_ParVector *Ztemp ); HYPRE_Int hypre_BoomerAMGRelax10TopoOrderedGaussSeidel( hypre_ParCSRMatrix *A, hypre_ParVector *f, HYPRE_Int *cf_marker, HYPRE_Int relax_points, HYPRE_Real relax_weight, HYPRE_Real omega, hypre_ParVector *u, hypre_ParVector *Vtemp, hypre_ParVector *Ztemp ); HYPRE_Int hypre_BoomerAMGRelax13HybridL1GaussSeidel( hypre_ParCSRMatrix *A, hypre_ParVector *f, HYPRE_Int *cf_marker, HYPRE_Int relax_points, HYPRE_Real relax_weight, HYPRE_Real omega, HYPRE_Real *l1_norms, hypre_ParVector *u, hypre_ParVector *Vtemp, hypre_ParVector *Ztemp ); HYPRE_Int hypre_BoomerAMGRelax14HybridL1GaussSeidel( hypre_ParCSRMatrix *A, hypre_ParVector *f, HYPRE_Int *cf_marker, HYPRE_Int relax_points, HYPRE_Real relax_weight, HYPRE_Real omega, HYPRE_Real *l1_norms, hypre_ParVector *u, hypre_ParVector *Vtemp, hypre_ParVector *Ztemp ); HYPRE_Int hypre_BoomerAMGRelax88HybridL1SSOR( hypre_ParCSRMatrix *A, hypre_ParVector *f, HYPRE_Int *cf_marker, HYPRE_Int relax_points, HYPRE_Real relax_weight, HYPRE_Real omega, HYPRE_Real *l1_norms, hypre_ParVector *u, hypre_ParVector *Vtemp, hypre_ParVector *Ztemp ); HYPRE_Int hypre_BoomerAMGRelax89HybridL1SSOR( hypre_ParCSRMatrix *A, hypre_ParVector *f, HYPRE_Int *cf_marker, HYPRE_Int relax_points, HYPRE_Real relax_weight, HYPRE_Real omega, HYPRE_Real *l1_norms, hypre_ParVector *u, hypre_ParVector *Vtemp, hypre_ParVector *Ztemp ); HYPRE_Int hypre_BoomerAMGRelax18WeightedL1Jacobi( hypre_ParCSRMatrix *A, hypre_ParVector *f, HYPRE_Int *cf_marker, HYPRE_Int relax_points, HYPRE_Real relax_weight, HYPRE_Real *l1_norms, hypre_ParVector *u, hypre_ParVector *Vtemp ); HYPRE_Int hypre_BoomerAMGRelaxKaczmarz( hypre_ParCSRMatrix *A, hypre_ParVector *f, HYPRE_Real omega, HYPRE_Real *l1_norms, hypre_ParVector *u ); HYPRE_Int hypre_BoomerAMGRelaxTwoStageGaussSeidelDevice ( hypre_ParCSRMatrix *A, hypre_ParVector *f, HYPRE_Real relax_weight, HYPRE_Real omega, HYPRE_Real *A_diag_diag, hypre_ParVector *u, hypre_ParVector *r, hypre_ParVector *z, HYPRE_Int choice ); HYPRE_Int hypre_BoomerAMGRelax11TwoStageGaussSeidel( hypre_ParCSRMatrix *A, hypre_ParVector *f, HYPRE_Int *cf_marker, HYPRE_Int relax_points, HYPRE_Real relax_weight, HYPRE_Real omega, HYPRE_Real *A_diag_diag, hypre_ParVector *u, hypre_ParVector *Vtemp, hypre_ParVector *Ztemp ); HYPRE_Int hypre_BoomerAMGRelax12TwoStageGaussSeidel( hypre_ParCSRMatrix *A, hypre_ParVector *f, HYPRE_Int *cf_marker, HYPRE_Int relax_points, HYPRE_Real relax_weight, HYPRE_Real omega, HYPRE_Real *A_diag_diag, hypre_ParVector *u, hypre_ParVector *Vtemp, hypre_ParVector *Ztemp ); HYPRE_Int hypre_BoomerAMGRelaxComputeL1Norms( hypre_ParCSRMatrix *A, HYPRE_Int relax_type, HYPRE_Int relax_order, HYPRE_Int coarsest_lvl, hypre_IntArray *CF_marker, HYPRE_Real **l1_norms_data_ptr ); /* par_relax_device.c */ HYPRE_Int hypre_BoomerAMGRelaxHybridGaussSeidelDevice( hypre_ParCSRMatrix *A, hypre_ParVector *f, HYPRE_Int *cf_marker, HYPRE_Int relax_points, HYPRE_Real relax_weight, HYPRE_Real omega, HYPRE_Real *l1_norms, hypre_ParVector *u, hypre_ParVector *Vtemp, hypre_ParVector *Ztemp, HYPRE_Int GS_order, HYPRE_Int Symm ); /* par_relax_interface.c */ HYPRE_Int hypre_BoomerAMGRelaxIF ( hypre_ParCSRMatrix *A, hypre_ParVector *f, HYPRE_Int *cf_marker, HYPRE_Int relax_type, HYPRE_Int relax_order, HYPRE_Int cycle_type, HYPRE_Real relax_weight, HYPRE_Real omega, HYPRE_Real *l1_norms, hypre_ParVector *u, hypre_ParVector *Vtemp, hypre_ParVector *Ztemp ); /* par_relax_more.c */ HYPRE_Int hypre_ParCSRMaxEigEstimate ( hypre_ParCSRMatrix *A, HYPRE_Int scale, HYPRE_Real *max_eig, HYPRE_Real *min_eig ); HYPRE_Int hypre_ParCSRMaxEigEstimateHost ( hypre_ParCSRMatrix *A, HYPRE_Int scale, HYPRE_Real *max_eig, HYPRE_Real *min_eig ); HYPRE_Int hypre_ParCSRMaxEigEstimateCG ( hypre_ParCSRMatrix *A, HYPRE_Int scale, HYPRE_Int max_iter, HYPRE_Real *max_eig, HYPRE_Real *min_eig ); HYPRE_Int hypre_ParCSRMaxEigEstimateCGHost ( hypre_ParCSRMatrix *A, HYPRE_Int scale, HYPRE_Int max_iter, HYPRE_Real *max_eig, HYPRE_Real *min_eig ); HYPRE_Int hypre_ParCSRRelax_Cheby ( hypre_ParCSRMatrix *A, hypre_ParVector *f, HYPRE_Real max_eig, HYPRE_Real min_eig, HYPRE_Real fraction, HYPRE_Int order, HYPRE_Int scale, HYPRE_Int variant, hypre_ParVector *u, hypre_ParVector *v, hypre_ParVector *r ); HYPRE_Int hypre_BoomerAMGRelax_FCFJacobi ( hypre_ParCSRMatrix *A, hypre_ParVector *f, HYPRE_Int *cf_marker, HYPRE_Real relax_weight, hypre_ParVector *u, hypre_ParVector *Vtemp ); HYPRE_Int hypre_ParCSRRelax_CG ( HYPRE_Solver solver, hypre_ParCSRMatrix *A, hypre_ParVector *f, hypre_ParVector *u, HYPRE_Int num_its ); HYPRE_Int hypre_LINPACKcgtql1 ( HYPRE_Int *n, HYPRE_Real *d, HYPRE_Real *e, HYPRE_Int *ierr ); HYPRE_Real hypre_LINPACKcgpthy ( HYPRE_Real *a, HYPRE_Real *b ); HYPRE_Int hypre_ParCSRRelax_L1_Jacobi ( hypre_ParCSRMatrix *A, hypre_ParVector *f, HYPRE_Int *cf_marker, HYPRE_Int relax_points, HYPRE_Real relax_weight, HYPRE_Real *l1_norms, hypre_ParVector *u, hypre_ParVector *Vtemp ); HYPRE_Int hypre_LINPACKcgtql1(HYPRE_Int*, HYPRE_Real *, HYPRE_Real *, HYPRE_Int *); HYPRE_Real hypre_LINPACKcgpthy(HYPRE_Real*, HYPRE_Real*); /* par_relax_more_device.c */ HYPRE_Int hypre_ParCSRMaxEigEstimateDevice ( hypre_ParCSRMatrix *A, HYPRE_Int scale, HYPRE_Real *max_eig, HYPRE_Real *min_eig ); HYPRE_Int hypre_ParCSRMaxEigEstimateCGDevice ( hypre_ParCSRMatrix *A, HYPRE_Int scale, HYPRE_Int max_iter, HYPRE_Real *max_eig, HYPRE_Real *min_eig ); /* par_rotate_7pt.c */ HYPRE_ParCSRMatrix GenerateRotate7pt ( MPI_Comm comm, HYPRE_BigInt nx, HYPRE_BigInt ny, HYPRE_Int P, HYPRE_Int Q, HYPRE_Int p, HYPRE_Int q, HYPRE_Real alpha, HYPRE_Real eps ); /* par_scaled_matnorm.c */ HYPRE_Int hypre_ParCSRMatrixScaledNorm ( hypre_ParCSRMatrix *A, HYPRE_Real *scnorm ); /* par_schwarz.c */ void *hypre_SchwarzCreate ( void ); HYPRE_Int hypre_SchwarzDestroy ( void *data ); HYPRE_Int hypre_SchwarzSetup ( void *schwarz_vdata, hypre_ParCSRMatrix *A, hypre_ParVector *f, hypre_ParVector *u ); HYPRE_Int hypre_SchwarzSolve ( void *schwarz_vdata, hypre_ParCSRMatrix *A, hypre_ParVector *f, hypre_ParVector *u ); HYPRE_Int hypre_SchwarzCFSolve ( void *schwarz_vdata, hypre_ParCSRMatrix *A, hypre_ParVector *f, hypre_ParVector *u, HYPRE_Int *CF_marker, HYPRE_Int rlx_pt ); HYPRE_Int hypre_SchwarzSetVariant ( void *data, HYPRE_Int variant ); HYPRE_Int hypre_SchwarzSetDomainType ( void *data, HYPRE_Int domain_type ); HYPRE_Int hypre_SchwarzSetOverlap ( void *data, HYPRE_Int overlap ); HYPRE_Int hypre_SchwarzSetNumFunctions ( void *data, HYPRE_Int num_functions ); HYPRE_Int hypre_SchwarzSetNonSymm ( void *data, HYPRE_Int value ); HYPRE_Int hypre_SchwarzSetRelaxWeight ( void *data, HYPRE_Real relax_weight ); HYPRE_Int hypre_SchwarzSetDomainStructure ( void *data, hypre_CSRMatrix *domain_structure ); HYPRE_Int hypre_SchwarzSetScale ( void *data, HYPRE_Real *scale ); HYPRE_Int hypre_SchwarzReScale ( void *data, HYPRE_Int size, HYPRE_Real value ); HYPRE_Int hypre_SchwarzSetDofFunc ( void *data, HYPRE_Int *dof_func ); /* par_stats.c */ HYPRE_Int hypre_BoomerAMGSetupStats ( void *amg_vdata, hypre_ParCSRMatrix *A ); HYPRE_Int hypre_BoomerAMGWriteSolverParams ( void *data ); const char* hypre_BoomerAMGGetProlongationName( hypre_ParAMGData *amg_data ); const char* hypre_BoomerAMGGetAggProlongationName( hypre_ParAMGData *amg_data ); const char* hypre_BoomerAMGGetCoarseningName( hypre_ParAMGData *amg_data ); const char* hypre_BoomerAMGGetCycleName( hypre_ParAMGData *amg_data ); HYPRE_Int hypre_BoomerAMGPrintGeneralInfo( hypre_ParAMGData *amg_data, HYPRE_Int shift ); /* par_strength.c */ HYPRE_Int hypre_BoomerAMGCreateS ( hypre_ParCSRMatrix *A, HYPRE_Real strength_threshold, HYPRE_Real max_row_sum, HYPRE_Int num_functions, HYPRE_Int *dof_func, hypre_ParCSRMatrix **S_ptr ); HYPRE_Int hypre_BoomerAMGCreateSabs ( hypre_ParCSRMatrix *A, HYPRE_Real strength_threshold, HYPRE_Real max_row_sum, HYPRE_Int num_functions, HYPRE_Int *dof_func, hypre_ParCSRMatrix **S_ptr ); HYPRE_Int hypre_BoomerAMGCreateSCommPkg ( hypre_ParCSRMatrix *A, hypre_ParCSRMatrix *S, HYPRE_Int **col_offd_S_to_A_ptr ); HYPRE_Int hypre_BoomerAMGCreate2ndS ( hypre_ParCSRMatrix *S, HYPRE_Int *CF_marker, HYPRE_Int num_paths, HYPRE_BigInt *coarse_row_starts, hypre_ParCSRMatrix **C_ptr ); HYPRE_Int hypre_BoomerAMGCorrectCFMarker ( hypre_IntArray *CF_marker, hypre_IntArray *new_CF_marker ); HYPRE_Int hypre_BoomerAMGCorrectCFMarkerHost ( hypre_IntArray *CF_marker, hypre_IntArray *new_CF_marker ); HYPRE_Int hypre_BoomerAMGCorrectCFMarkerDevice ( hypre_IntArray *CF_marker, hypre_IntArray *new_CF_marker ); HYPRE_Int hypre_BoomerAMGCorrectCFMarker2 ( hypre_IntArray *CF_marker, hypre_IntArray *new_CF_marker ); HYPRE_Int hypre_BoomerAMGCorrectCFMarker2Host ( hypre_IntArray *CF_marker, hypre_IntArray *new_CF_marker ); HYPRE_Int hypre_BoomerAMGCorrectCFMarker2Device ( hypre_IntArray *CF_marker, hypre_IntArray *new_CF_marker ); HYPRE_Int hypre_BoomerAMGCreateSHost(hypre_ParCSRMatrix *A, HYPRE_Real strength_threshold, HYPRE_Real max_row_sum, HYPRE_Int num_functions, HYPRE_Int *dof_func, hypre_ParCSRMatrix **S_ptr); HYPRE_Int hypre_BoomerAMGCreateSDevice(hypre_ParCSRMatrix *A, HYPRE_Int abs_soc, HYPRE_Real strength_threshold, HYPRE_Real max_row_sum, HYPRE_Int num_functions, HYPRE_Int *dof_func, hypre_ParCSRMatrix **S_ptr); HYPRE_Int hypre_BoomerAMGCreateSabsHost ( hypre_ParCSRMatrix *A, HYPRE_Real strength_threshold, HYPRE_Real max_row_sum, HYPRE_Int num_functions, HYPRE_Int *dof_func, hypre_ParCSRMatrix **S_ptr ); HYPRE_Int hypre_BoomerAMGCreate2ndSDevice( hypre_ParCSRMatrix *S, HYPRE_Int *CF_marker, HYPRE_Int num_paths, HYPRE_BigInt *coarse_row_starts, hypre_ParCSRMatrix **C_ptr); HYPRE_Int hypre_BoomerAMGMakeSocFromSDevice( hypre_ParCSRMatrix *A, hypre_ParCSRMatrix *S); /* par_sv_interp.c */ HYPRE_Int hypre_BoomerAMGSmoothInterpVectors ( hypre_ParCSRMatrix *A, HYPRE_Int num_smooth_vecs, hypre_ParVector **smooth_vecs, HYPRE_Int smooth_steps ); HYPRE_Int hypre_BoomerAMGCoarsenInterpVectors ( hypre_ParCSRMatrix *P, HYPRE_Int num_smooth_vecs, hypre_ParVector **smooth_vecs, HYPRE_Int *CF_marker, hypre_ParVector ***new_smooth_vecs, HYPRE_Int expand_level, HYPRE_Int num_functions ); HYPRE_Int hypre_BoomerAMG_GMExpandInterp ( hypre_ParCSRMatrix *A, hypre_ParCSRMatrix **P, HYPRE_Int num_smooth_vecs, hypre_ParVector **smooth_vecs, HYPRE_Int *nf, HYPRE_Int *dof_func, hypre_IntArray **coarse_dof_func, HYPRE_Int variant, HYPRE_Int level, HYPRE_Real abs_trunc, HYPRE_Real *weights, HYPRE_Int q_max, HYPRE_Int *CF_marker, HYPRE_Int interp_vec_first_level ); HYPRE_Int hypre_BoomerAMGRefineInterp ( hypre_ParCSRMatrix *A, hypre_ParCSRMatrix *P, HYPRE_BigInt *num_cpts_global, HYPRE_Int *nf, HYPRE_Int *dof_func, HYPRE_Int *CF_marker, HYPRE_Int level ); /* par_sv_interp_ln.c */ HYPRE_Int hypre_BoomerAMG_LNExpandInterp ( hypre_ParCSRMatrix *A, hypre_ParCSRMatrix **P, HYPRE_BigInt *num_cpts_global, HYPRE_Int *nf, HYPRE_Int *dof_func, hypre_IntArray **coarse_dof_func, HYPRE_Int *CF_marker, HYPRE_Int level, HYPRE_Real *weights, HYPRE_Int num_smooth_vecs, hypre_ParVector **smooth_vecs, HYPRE_Real abs_trunc, HYPRE_Int q_max, HYPRE_Int interp_vec_first_level ); /* par_sv_interp_lsfit.c */ HYPRE_Int hypre_BoomerAMGFitInterpVectors ( hypre_ParCSRMatrix *A, hypre_ParCSRMatrix **P, HYPRE_Int num_smooth_vecs, hypre_ParVector **smooth_vecs, hypre_ParVector **coarse_smooth_vecs, HYPRE_Real delta, HYPRE_Int num_functions, HYPRE_Int *dof_func, HYPRE_Int *CF_marker, HYPRE_Int max_elmts, HYPRE_Real trunc_factor, HYPRE_Int variant, HYPRE_Int level ); /* partial.c */ HYPRE_Int hypre_BoomerAMGBuildPartialExtPIInterp ( hypre_ParCSRMatrix *A, HYPRE_Int *CF_marker, hypre_ParCSRMatrix *S, HYPRE_BigInt *num_cpts_global, HYPRE_BigInt *num_old_cpts_global, HYPRE_Int num_functions, HYPRE_Int *dof_func, HYPRE_Int debug_flag, HYPRE_Real trunc_factor, HYPRE_Int max_elmts, hypre_ParCSRMatrix **P_ptr ); HYPRE_Int hypre_BoomerAMGBuildPartialStdInterp ( hypre_ParCSRMatrix *A, HYPRE_Int *CF_marker, hypre_ParCSRMatrix *S, HYPRE_BigInt *num_cpts_global, HYPRE_BigInt *num_old_cpts_global, HYPRE_Int num_functions, HYPRE_Int *dof_func, HYPRE_Int debug_flag, HYPRE_Real trunc_factor, HYPRE_Int max_elmts, HYPRE_Int sep_weight, hypre_ParCSRMatrix **P_ptr ); HYPRE_Int hypre_BoomerAMGBuildPartialExtInterp ( hypre_ParCSRMatrix *A, HYPRE_Int *CF_marker, hypre_ParCSRMatrix *S, HYPRE_BigInt *num_cpts_global, HYPRE_BigInt *num_old_cpts_global, HYPRE_Int num_functions, HYPRE_Int *dof_func, HYPRE_Int debug_flag, HYPRE_Real trunc_factor, HYPRE_Int max_elmts, hypre_ParCSRMatrix **P_ptr ); /* par_vardifconv.c */ HYPRE_ParCSRMatrix GenerateVarDifConv ( MPI_Comm comm, HYPRE_BigInt nx, HYPRE_BigInt ny, HYPRE_BigInt nz, HYPRE_Int P, HYPRE_Int Q, HYPRE_Int R, HYPRE_Int p, HYPRE_Int q, HYPRE_Int r, HYPRE_Real eps, HYPRE_ParVector *rhs_ptr ); HYPRE_Real afun ( HYPRE_Real xx, HYPRE_Real yy, HYPRE_Real zz ); HYPRE_Real bfun ( HYPRE_Real xx, HYPRE_Real yy, HYPRE_Real zz ); HYPRE_Real cfun ( HYPRE_Real xx, HYPRE_Real yy, HYPRE_Real zz ); HYPRE_Real dfun ( HYPRE_Real xx, HYPRE_Real yy, HYPRE_Real zz ); HYPRE_Real efun ( HYPRE_Real xx, HYPRE_Real yy, HYPRE_Real zz ); HYPRE_Real ffun ( HYPRE_Real xx, HYPRE_Real yy, HYPRE_Real zz ); HYPRE_Real gfun ( HYPRE_Real xx, HYPRE_Real yy, HYPRE_Real zz ); HYPRE_Real rfun ( HYPRE_Real xx, HYPRE_Real yy, HYPRE_Real zz ); HYPRE_Real bndfun ( HYPRE_Real xx, HYPRE_Real yy, HYPRE_Real zz ); /* par_vardifconv_rs.c */ HYPRE_ParCSRMatrix GenerateRSVarDifConv ( MPI_Comm comm, HYPRE_BigInt nx, HYPRE_BigInt ny, HYPRE_BigInt nz, HYPRE_Int P, HYPRE_Int Q, HYPRE_Int R, HYPRE_Int p, HYPRE_Int q, HYPRE_Int r, HYPRE_Real eps, HYPRE_ParVector *rhs_ptr, HYPRE_Int type ); HYPRE_Real afun_rs ( HYPRE_Real xx, HYPRE_Real yy, HYPRE_Real zz ); HYPRE_Real bfun_rs ( HYPRE_Real xx, HYPRE_Real yy, HYPRE_Real zz ); HYPRE_Real cfun_rs ( HYPRE_Real xx, HYPRE_Real yy, HYPRE_Real zz ); HYPRE_Real dfun_rs ( HYPRE_Real xx, HYPRE_Real yy, HYPRE_Real zz ); HYPRE_Real efun_rs ( HYPRE_Real xx, HYPRE_Real yy, HYPRE_Real zz ); HYPRE_Real ffun_rs ( HYPRE_Real xx, HYPRE_Real yy, HYPRE_Real zz ); HYPRE_Real gfun_rs ( HYPRE_Real xx, HYPRE_Real yy, HYPRE_Real zz ); HYPRE_Real rfun_rs ( HYPRE_Real xx, HYPRE_Real yy, HYPRE_Real zz ); HYPRE_Real bndfun_rs ( HYPRE_Real xx, HYPRE_Real yy, HYPRE_Real zz ); /* pcg_par.c */ void *hypre_ParKrylovCAlloc ( size_t count, size_t elt_size, HYPRE_MemoryLocation location ); HYPRE_Int hypre_ParKrylovFree ( void *ptr ); void *hypre_ParKrylovCreateVector ( void *vvector ); void *hypre_ParKrylovCreateVectorArray ( HYPRE_Int n, void *vvector ); HYPRE_Int hypre_ParKrylovDestroyVector ( void *vvector ); void *hypre_ParKrylovMatvecCreate ( void *A, void *x ); HYPRE_Int hypre_ParKrylovMatvec ( void *matvec_data, HYPRE_Complex alpha, void *A, void *x, HYPRE_Complex beta, void *y ); HYPRE_Int hypre_ParKrylovMatvecT ( void *matvec_data, HYPRE_Complex alpha, void *A, void *x, HYPRE_Complex beta, void *y ); HYPRE_Int hypre_ParKrylovMatvecDestroy ( void *matvec_data ); HYPRE_Real hypre_ParKrylovInnerProd ( void *x, void *y ); HYPRE_Int hypre_ParKrylovMassInnerProd ( void *x, void **y, HYPRE_Int k, HYPRE_Int unroll, void *result ); HYPRE_Int hypre_ParKrylovMassDotpTwo ( void *x, void *y, void **z, HYPRE_Int k, HYPRE_Int unroll, void *result_x, void *result_y ); HYPRE_Int hypre_ParKrylovMassAxpy( HYPRE_Complex *alpha, void **x, void *y, HYPRE_Int k, HYPRE_Int unroll); HYPRE_Int hypre_ParKrylovCopyVector ( void *x, void *y ); HYPRE_Int hypre_ParKrylovClearVector ( void *x ); HYPRE_Int hypre_ParKrylovScaleVector ( HYPRE_Complex alpha, void *x ); HYPRE_Int hypre_ParKrylovAxpy ( HYPRE_Complex alpha, void *x, void *y ); HYPRE_Int hypre_ParKrylovCommInfo ( void *A, HYPRE_Int *my_id, HYPRE_Int *num_procs ); HYPRE_Int hypre_ParKrylovIdentitySetup ( void *vdata, void *A, void *b, void *x ); HYPRE_Int hypre_ParKrylovIdentity ( void *vdata, void *A, void *b, void *x ); /* schwarz.c */ HYPRE_Int hypre_AMGNodalSchwarzSmoother ( hypre_CSRMatrix *A, HYPRE_Int num_functions, HYPRE_Int option, hypre_CSRMatrix **domain_structure_pointer ); HYPRE_Int hypre_ParMPSchwarzSolve ( hypre_ParCSRMatrix *par_A, hypre_CSRMatrix *A_boundary, hypre_ParVector *rhs_vector, hypre_CSRMatrix *domain_structure, hypre_ParVector *par_x, HYPRE_Real relax_wt, HYPRE_Real *scale, hypre_ParVector *Vtemp, HYPRE_Int *pivots, HYPRE_Int use_nonsymm ); HYPRE_Int hypre_MPSchwarzSolve ( hypre_ParCSRMatrix *par_A, hypre_Vector *rhs_vector, hypre_CSRMatrix *domain_structure, hypre_ParVector *par_x, HYPRE_Real relax_wt, hypre_Vector *aux_vector, HYPRE_Int *pivots, HYPRE_Int use_nonsymm ); HYPRE_Int hypre_MPSchwarzCFSolve ( hypre_ParCSRMatrix *par_A, hypre_Vector *rhs_vector, hypre_CSRMatrix *domain_structure, hypre_ParVector *par_x, HYPRE_Real relax_wt, hypre_Vector *aux_vector, HYPRE_Int *CF_marker, HYPRE_Int rlx_pt, HYPRE_Int *pivots, HYPRE_Int use_nonsymm ); HYPRE_Int hypre_MPSchwarzFWSolve ( hypre_ParCSRMatrix *par_A, hypre_Vector *rhs_vector, hypre_CSRMatrix *domain_structure, hypre_ParVector *par_x, HYPRE_Real relax_wt, hypre_Vector *aux_vector, HYPRE_Int *pivots, HYPRE_Int use_nonsymm ); HYPRE_Int hypre_MPSchwarzCFFWSolve ( hypre_ParCSRMatrix *par_A, hypre_Vector *rhs_vector, hypre_CSRMatrix *domain_structure, hypre_ParVector *par_x, HYPRE_Real relax_wt, hypre_Vector *aux_vector, HYPRE_Int *CF_marker, HYPRE_Int rlx_pt, HYPRE_Int *pivots, HYPRE_Int use_nonsymm ); HYPRE_Int transpose_matrix_create ( HYPRE_Int **i_face_element_pointer, HYPRE_Int **j_face_element_pointer, HYPRE_Int *i_element_face, HYPRE_Int *j_element_face, HYPRE_Int num_elements, HYPRE_Int num_faces ); HYPRE_Int matrix_matrix_product ( HYPRE_Int **i_element_edge_pointer, HYPRE_Int **j_element_edge_pointer, HYPRE_Int *i_element_face, HYPRE_Int *j_element_face, HYPRE_Int *i_face_edge, HYPRE_Int *j_face_edge, HYPRE_Int num_elements, HYPRE_Int num_faces, HYPRE_Int num_edges ); HYPRE_Int hypre_AMGCreateDomainDof ( hypre_CSRMatrix *A, HYPRE_Int domain_type, HYPRE_Int overlap, HYPRE_Int num_functions, HYPRE_Int *dof_func, hypre_CSRMatrix **domain_structure_pointer, HYPRE_Int **piv_pointer, HYPRE_Int use_nonsymm ); HYPRE_Int hypre_AMGeAgglomerate ( HYPRE_Int *i_AE_element, HYPRE_Int *j_AE_element, HYPRE_Int *i_face_face, HYPRE_Int *j_face_face, HYPRE_Int *w_face_face, HYPRE_Int *i_face_element, HYPRE_Int *j_face_element, HYPRE_Int *i_element_face, HYPRE_Int *j_element_face, HYPRE_Int *i_face_to_prefer_weight, HYPRE_Int *i_face_weight, HYPRE_Int num_faces, HYPRE_Int num_elements, HYPRE_Int *num_AEs_pointer ); HYPRE_Int hypre_update_entry ( HYPRE_Int weight, HYPRE_Int *weight_max, HYPRE_Int *previous, HYPRE_Int *next, HYPRE_Int *first, HYPRE_Int *last, HYPRE_Int head, HYPRE_Int tail, HYPRE_Int i ); HYPRE_Int hypre_remove_entry ( HYPRE_Int weight, HYPRE_Int *weight_max, HYPRE_Int *previous, HYPRE_Int *next, HYPRE_Int *first, HYPRE_Int *last, HYPRE_Int head, HYPRE_Int tail, HYPRE_Int i ); HYPRE_Int hypre_move_entry ( HYPRE_Int weight, HYPRE_Int *weight_max, HYPRE_Int *previous, HYPRE_Int *next, HYPRE_Int *first, HYPRE_Int *last, HYPRE_Int head, HYPRE_Int tail, HYPRE_Int i ); HYPRE_Int hypre_matinv ( HYPRE_Real *x, HYPRE_Real *a, HYPRE_Int k ); HYPRE_Int hypre_parCorrRes ( hypre_ParCSRMatrix *A, hypre_ParVector *x, hypre_Vector *rhs, hypre_Vector **tmp_ptr ); HYPRE_Int hypre_AdSchwarzSolve ( hypre_ParCSRMatrix *par_A, hypre_ParVector *par_rhs, hypre_CSRMatrix *domain_structure, HYPRE_Real *scale, hypre_ParVector *par_x, hypre_ParVector *par_aux, HYPRE_Int *pivots, HYPRE_Int use_nonsymm ); HYPRE_Int hypre_AdSchwarzCFSolve ( hypre_ParCSRMatrix *par_A, hypre_ParVector *par_rhs, hypre_CSRMatrix *domain_structure, HYPRE_Real *scale, hypre_ParVector *par_x, hypre_ParVector *par_aux, HYPRE_Int *CF_marker, HYPRE_Int rlx_pt, HYPRE_Int *pivots, HYPRE_Int use_nonsymm ); HYPRE_Int hypre_GenerateScale ( hypre_CSRMatrix *domain_structure, HYPRE_Int num_variables, HYPRE_Real relaxation_weight, HYPRE_Real **scale_pointer ); HYPRE_Int hypre_ParAdSchwarzSolve ( hypre_ParCSRMatrix *A, hypre_ParVector *F, hypre_CSRMatrix *domain_structure, HYPRE_Real *scale, hypre_ParVector *X, hypre_ParVector *Vtemp, HYPRE_Int *pivots, HYPRE_Int use_nonsymm ); HYPRE_Int hypre_ParAMGCreateDomainDof ( hypre_ParCSRMatrix *A, HYPRE_Int domain_type, HYPRE_Int overlap, HYPRE_Int num_functions, HYPRE_Int *dof_func, hypre_CSRMatrix **domain_structure_pointer, HYPRE_Int **piv_pointer, HYPRE_Int use_nonsymm ); HYPRE_Int hypre_ParGenerateScale ( hypre_ParCSRMatrix *A, hypre_CSRMatrix *domain_structure, HYPRE_Real relaxation_weight, HYPRE_Real **scale_pointer ); HYPRE_Int hypre_ParGenerateHybridScale ( hypre_ParCSRMatrix *A, hypre_CSRMatrix *domain_structure, hypre_CSRMatrix **A_boundary_pointer, HYPRE_Real **scale_pointer ); /* par_restr.c, par_lr_restr.c */ HYPRE_Int hypre_BoomerAMGBuildRestrAIR( hypre_ParCSRMatrix *A, HYPRE_Int *CF_marker, hypre_ParCSRMatrix *S, HYPRE_BigInt *num_cpts_global, HYPRE_Int num_functions, HYPRE_Int *dof_func, HYPRE_Real filter_thresholdR, HYPRE_Int debug_flag, hypre_ParCSRMatrix **R_ptr, HYPRE_Int is_triangular, HYPRE_Int gmres_switch); HYPRE_Int hypre_BoomerAMGBuildRestrDist2AIR( hypre_ParCSRMatrix *A, HYPRE_Int *CF_marker, hypre_ParCSRMatrix *S, HYPRE_BigInt *num_cpts_global, HYPRE_Int num_functions, HYPRE_Int *dof_func, HYPRE_Real filter_thresholdR, HYPRE_Int debug_flag, hypre_ParCSRMatrix **R_ptr, HYPRE_Int AIR1_5, HYPRE_Int is_triangular, HYPRE_Int gmres_switch); HYPRE_Int hypre_BoomerAMGBuildRestrNeumannAIR( hypre_ParCSRMatrix *A, HYPRE_Int *CF_marker, HYPRE_BigInt *num_cpts_global, HYPRE_Int num_functions, HYPRE_Int *dof_func, HYPRE_Int NeumannDeg, HYPRE_Real strong_thresholdR, HYPRE_Real filter_thresholdR, HYPRE_Int debug_flag, hypre_ParCSRMatrix **R_ptr); HYPRE_Int hypre_BoomerAMGBuildRestrNeumannAIRDevice( hypre_ParCSRMatrix *A, HYPRE_Int *CF_marker, HYPRE_BigInt *num_cpts_global, HYPRE_Int num_functions, HYPRE_Int *dof_func, HYPRE_Int NeumannDeg, HYPRE_Real strong_thresholdR, HYPRE_Real filter_thresholdR, HYPRE_Int debug_flag, hypre_ParCSRMatrix **R_ptr); HYPRE_Int hypre_BoomerAMGCFMarkerTo1minus1Device( HYPRE_Int *CF_marker, HYPRE_Int size ); #ifdef HYPRE_USING_DSUPERLU /* superlu.c */ HYPRE_Int hypre_SLUDistSetup( HYPRE_Solver *solver, hypre_ParCSRMatrix *A, HYPRE_Int print_level); HYPRE_Int hypre_SLUDistSolve( void* solver, hypre_ParVector *b, hypre_ParVector *x); HYPRE_Int hypre_SLUDistDestroy( void* solver); #endif /* par_mgr.c */ void *hypre_MGRCreate ( void ); HYPRE_Int hypre_MGRDestroy ( void *mgr_vdata ); HYPRE_Int hypre_MGRCycle( void *mgr_vdata, hypre_ParVector **F_array, hypre_ParVector **U_array ); void *hypre_MGRCreateFrelaxVcycleData( void ); HYPRE_Int hypre_MGRDestroyFrelaxVcycleData( void *mgr_vdata ); void *hypre_MGRCreateGSElimData( void ); HYPRE_Int hypre_MGRDestroyGSElimData( void *mgr_vdata ); HYPRE_Int hypre_MGRSetupFrelaxVcycleData( void *mgr_vdata, hypre_ParCSRMatrix *A, hypre_ParVector *f, hypre_ParVector *u, HYPRE_Int level ); HYPRE_Int hypre_MGRFrelaxVcycle ( void *mgr_vdata, hypre_ParVector *f, hypre_ParVector *u ); HYPRE_Int hypre_MGRSetCpointsByBlock( void *mgr_vdata, HYPRE_Int block_size, HYPRE_Int max_num_levels, HYPRE_Int *block_num_coarse_points, HYPRE_Int **block_coarse_indexes ); HYPRE_Int hypre_MGRSetCpointsByContiguousBlock( void *mgr_vdata, HYPRE_Int block_size, HYPRE_Int max_num_levels, HYPRE_BigInt *begin_idx_array, HYPRE_Int *block_num_coarse_points, HYPRE_Int **block_coarse_indexes ); HYPRE_Int hypre_MGRSetCpointsByPointMarkerArray( void *mgr_vdata, HYPRE_Int block_size, HYPRE_Int max_num_levels, HYPRE_Int *block_num_coarse_points, HYPRE_Int **block_coarse_indexes, HYPRE_Int *point_marker_array ); HYPRE_Int hypre_MGRCoarsen( hypre_ParCSRMatrix *S, hypre_ParCSRMatrix *A, HYPRE_Int final_coarse_size, HYPRE_Int *final_coarse_indexes, HYPRE_Int debug_flag, hypre_IntArray **CF_marker, HYPRE_Int last_level ); HYPRE_Int hypre_MGRSetReservedCoarseNodes( void *mgr_vdata, HYPRE_Int reserved_coarse_size, HYPRE_BigInt *reserved_coarse_nodes ); HYPRE_Int hypre_MGRSetReservedCpointsLevelToKeep( void *mgr_vdata, HYPRE_Int level ); HYPRE_Int hypre_MGRSetMaxGlobalSmoothIters( void *mgr_vdata, HYPRE_Int max_iter ); HYPRE_Int hypre_MGRSetGlobalSmoothType( void *mgr_vdata, HYPRE_Int iter_type ); HYPRE_Int hypre_MGRSetNonCpointsToFpoints( void *mgr_vdata, HYPRE_Int nonCptToFptFlag ); //HYPRE_Int hypre_MGRInitCFMarker(HYPRE_Int num_variables, HYPRE_Int *CF_marker, HYPRE_Int initial_coarse_size,HYPRE_Int *initial_coarse_indexes); //HYPRE_Int hypre_MGRUpdateCoarseIndexes(HYPRE_Int num_variables, HYPRE_Int *CF_marker, HYPRE_Int initial_coarse_size,HYPRE_Int *initial_coarse_indexes); HYPRE_Int hypre_ParCSRMatrixExtractBlockDiagHost( hypre_ParCSRMatrix *par_A, HYPRE_Int blk_size, HYPRE_Int num_points, HYPRE_Int point_type, HYPRE_Int *CF_marker, HYPRE_Int diag_size, HYPRE_Int diag_type, HYPRE_Real *diag_data ); HYPRE_Int hypre_ParCSRMatrixBlockDiagMatrix( hypre_ParCSRMatrix *A, HYPRE_Int blk_size, HYPRE_Int point_type, HYPRE_Int *CF_marker, HYPRE_Int diag_type, hypre_ParCSRMatrix **B_ptr ); HYPRE_Int hypre_ParCSRMatrixBlockDiagMatrixHost( hypre_ParCSRMatrix *A, HYPRE_Int blk_size, HYPRE_Int point_type, HYPRE_Int *CF_marker, HYPRE_Int diag_type, hypre_ParCSRMatrix **B_ptr ); HYPRE_Int hypre_MGRSetCoarseSolver( void *mgr_vdata, HYPRE_Int (*cgrid_solver_solve)(void*, void*, void*, void*), HYPRE_Int (*cgrid_solver_setup)(void*, void*, void*, void*), void *coarse_grid_solver ); HYPRE_Int hypre_MGRSetFSolver( void *mgr_vdata, HYPRE_Int (*fine_grid_solver_solve)(void*, void*, void*, void*), HYPRE_Int (*fine_grid_solver_setup)(void*, void*, void*, void*), void *fsolver ); HYPRE_Int hypre_MGRSetFSolverAtLevel( void *mgr_vdata, void *fsolver, HYPRE_Int level ); HYPRE_Int hypre_MGRSetup( void *mgr_vdata, hypre_ParCSRMatrix *A, hypre_ParVector *f, hypre_ParVector *u ); HYPRE_Int hypre_MGRSolve( void *mgr_vdata, hypre_ParCSRMatrix *A, hypre_ParVector *f, hypre_ParVector *u ); HYPRE_Int hypre_block_jacobi_scaling( hypre_ParCSRMatrix *A, hypre_ParCSRMatrix **B_ptr, void *mgr_vdata, HYPRE_Int debug_flag ); HYPRE_Int hypre_MGRBlockRelaxSolveDevice( hypre_ParCSRMatrix *B, hypre_ParCSRMatrix *A, hypre_ParVector *f, hypre_ParVector *u, hypre_ParVector *Vtemp, HYPRE_Real relax_weight ); HYPRE_Int hypre_MGRBlockRelaxSolve( hypre_ParCSRMatrix *A, hypre_ParVector *f, hypre_ParVector *u, HYPRE_Int blk_size, HYPRE_Int n_block, HYPRE_Int left_size, HYPRE_Int method, HYPRE_Real *diaginv, hypre_ParVector *Vtemp ); HYPRE_Int hypre_BlockDiagInvLapack( HYPRE_Real *diag, HYPRE_Int N, HYPRE_Int blk_size ); HYPRE_Int hypre_MGRBlockRelaxSetup( hypre_ParCSRMatrix *A, HYPRE_Int blk_size, HYPRE_Real **diaginvptr ); //HYPRE_Int hypre_blockRelax(hypre_ParCSRMatrix *A, hypre_ParVector *f, hypre_ParVector *u, // HYPRE_Int blk_size, HYPRE_Int reserved_coarse_size, HYPRE_Int method, hypre_ParVector *Vtemp, // hypre_ParVector *Ztemp); HYPRE_Int hypre_block_jacobi_solve( hypre_ParCSRMatrix *A, hypre_ParVector *f, hypre_ParVector *u, HYPRE_Int blk_size, HYPRE_Int method, HYPRE_Real *diaginv, hypre_ParVector *Vtemp ); //HYPRE_Int hypre_MGRBuildAffRAP( MPI_Comm comm, HYPRE_Int local_num_variables, HYPRE_Int num_functions, //HYPRE_Int *dof_func, HYPRE_Int *CF_marker, HYPRE_Int **coarse_dof_func_ptr, HYPRE_BigInt **coarse_pnts_global_ptr, //hypre_ParCSRMatrix *A, HYPRE_Int debug_flag, hypre_ParCSRMatrix **P_f_ptr, hypre_ParCSRMatrix **A_ff_ptr ); HYPRE_Int hypre_MGRGetSubBlock( hypre_ParCSRMatrix *A, HYPRE_Int *row_cf_marker, HYPRE_Int *col_cf_marker, HYPRE_Int debug_flag, hypre_ParCSRMatrix **A_ff_ptr ); HYPRE_Int hypre_MGRBuildAff( hypre_ParCSRMatrix *A, HYPRE_Int *CF_marker, HYPRE_Int debug_flag, hypre_ParCSRMatrix **A_ff_ptr ); HYPRE_Int hypre_MGRApproximateInverse( hypre_ParCSRMatrix *A, hypre_ParCSRMatrix **A_inv ); HYPRE_Int hypre_MGRAddVectorP( hypre_IntArray *CF_marker, HYPRE_Int point_type, HYPRE_Real a, hypre_ParVector *fromVector, HYPRE_Real b, hypre_ParVector **toVector ); HYPRE_Int hypre_MGRAddVectorR( hypre_IntArray *CF_marker, HYPRE_Int point_type, HYPRE_Real a, hypre_ParVector *fromVector, HYPRE_Real b, hypre_ParVector **toVector ); HYPRE_Int hypre_MGRTruncateAcfCPRDevice( hypre_ParCSRMatrix *A_CF, hypre_ParCSRMatrix **A_CF_new_ptr ); HYPRE_Int hypre_MGRSetAffSolverType( void *systg_vdata, HYPRE_Int *aff_solver_type ); HYPRE_Int hypre_MGRSetCoarseSolverType( void *systg_vdata, HYPRE_Int coarse_solver_type ); HYPRE_Int hypre_MGRSetCoarseSolverIter( void *systg_vdata, HYPRE_Int coarse_solver_iter ); HYPRE_Int hypre_MGRSetFineSolverIter( void *systg_vdata, HYPRE_Int fine_solver_iter ); HYPRE_Int hypre_MGRSetFineSolverMaxLevels( void *systg_vdata, HYPRE_Int fine_solver_max_levels ); HYPRE_Int hypre_MGRSetMaxCoarseLevels( void *mgr_vdata, HYPRE_Int maxlev ); HYPRE_Int hypre_MGRSetBlockSize( void *mgr_vdata, HYPRE_Int bsize ); HYPRE_Int hypre_MGRSetRelaxType( void *mgr_vdata, HYPRE_Int relax_type ); HYPRE_Int hypre_MGRSetFRelaxMethod( void *mgr_vdata, HYPRE_Int relax_method ); HYPRE_Int hypre_MGRSetLevelFRelaxMethod( void *mgr_vdata, HYPRE_Int *relax_method ); HYPRE_Int hypre_MGRSetLevelFRelaxType( void *mgr_vdata, HYPRE_Int *relax_type ); HYPRE_Int hypre_MGRSetLevelFRelaxNumFunctions( void *mgr_vdata, HYPRE_Int *num_functions ); HYPRE_Int hypre_MGRSetCoarseGridMethod( void *mgr_vdata, HYPRE_Int *cg_method ); HYPRE_Int hypre_MGRSetNonGalerkinMaxElmts( void *mgr_vdata, HYPRE_Int max_elmts ); HYPRE_Int hypre_MGRSetLevelNonGalerkinMaxElmts( void *mgr_vdata, HYPRE_Int *max_elmts ); HYPRE_Int hypre_MGRSetRestrictType( void *mgr_vdata, HYPRE_Int restrictType ); HYPRE_Int hypre_MGRSetLevelRestrictType( void *mgr_vdata, HYPRE_Int *restrictType ); HYPRE_Int hypre_MGRSetInterpType( void *mgr_vdata, HYPRE_Int interpType ); HYPRE_Int hypre_MGRSetLevelInterpType( void *mgr_vdata, HYPRE_Int *interpType ); HYPRE_Int hypre_MGRSetNumRelaxSweeps( void *mgr_vdata, HYPRE_Int nsweeps ); HYPRE_Int hypre_MGRSetLevelNumRelaxSweeps( void *mgr_vdata, HYPRE_Int *nsweeps ); HYPRE_Int hypre_MGRSetNumInterpSweeps( void *mgr_vdata, HYPRE_Int nsweeps ); HYPRE_Int hypre_MGRSetNumRestrictSweeps( void *mgr_vdata, HYPRE_Int nsweeps ); HYPRE_Int hypre_MGRSetLevelSmoothType( void *mgr_vdata, HYPRE_Int *level_smooth_type ); HYPRE_Int hypre_MGRSetLevelSmoothIters( void *mgr_vdata, HYPRE_Int *level_smooth_iters ); HYPRE_Int hypre_MGRSetGlobalSmoothCycle( void *mgr_vdata, HYPRE_Int global_smooth_cycle ); HYPRE_Int hypre_MGRSetGlobalSmootherAtLevel( void *mgr_vdata, HYPRE_Solver smoother, HYPRE_Int level ); HYPRE_Int hypre_MGRSetPrintLevel( void *mgr_vdata, HYPRE_Int print_level ); HYPRE_Int hypre_MGRSetFrelaxPrintLevel( void *mgr_vdata, HYPRE_Int print_level ); HYPRE_Int hypre_MGRSetCoarseGridPrintLevel( void *mgr_vdata, HYPRE_Int print_level ); HYPRE_Int hypre_MGRSetTruncateCoarseGridThreshold( void *mgr_vdata, HYPRE_Real threshold ); HYPRE_Int hypre_MGRSetBlockJacobiBlockSize( void *mgr_vdata, HYPRE_Int blk_size ); HYPRE_Int hypre_MGRSetLogging( void *mgr_vdata, HYPRE_Int logging ); HYPRE_Int hypre_MGRSetMaxIter( void *mgr_vdata, HYPRE_Int max_iter ); HYPRE_Int hypre_MGRSetPMaxElmts( void *mgr_vdata, HYPRE_Int P_max_elmts ); HYPRE_Int hypre_MGRSetLevelPMaxElmts( void *mgr_vdata, HYPRE_Int *P_max_elmts ); HYPRE_Int hypre_MGRSetTol( void *mgr_vdata, HYPRE_Real tol ); HYPRE_Int hypre_MGRDataPrint(void *mgr_vdata); #ifdef HYPRE_USING_DSUPERLU void *hypre_MGRDirectSolverCreate( void ); HYPRE_Int hypre_MGRDirectSolverSetup( void *solver, hypre_ParCSRMatrix *A, hypre_ParVector *f, hypre_ParVector *u ); HYPRE_Int hypre_MGRDirectSolverSolve( void *solver, hypre_ParCSRMatrix *A, hypre_ParVector *f, hypre_ParVector *u ); HYPRE_Int hypre_MGRDirectSolverDestroy( void *solver ); #endif // Accessor functions HYPRE_Int hypre_MGRGetNumIterations( void *mgr_vdata, HYPRE_Int *num_iterations ); HYPRE_Int hypre_MGRGetFinalRelativeResidualNorm( void *mgr_vdata, HYPRE_Real *res_norm ); HYPRE_Int hypre_MGRGetCoarseGridConvergenceFactor( void *mgr_data, HYPRE_Real *conv_factor ); /* par_mgr_interp.c */ HYPRE_Int hypre_MGRBuildInterp( hypre_ParCSRMatrix *A, hypre_ParCSRMatrix *A_FF, hypre_ParCSRMatrix *A_FC, hypre_ParCSRMatrix *S, hypre_IntArray *CF_marker, HYPRE_BigInt *num_cpts_global, HYPRE_Real trunc_factor, HYPRE_Int max_elmts, HYPRE_Int block_jacobi_bsize, HYPRE_Int method, HYPRE_Int num_sweeps_post, hypre_ParCSRMatrix **Wp_ptr, hypre_ParCSRMatrix **P_ptr ); HYPRE_Int hypre_MGRBuildRestrict( hypre_ParCSRMatrix *A, hypre_ParCSRMatrix *A_FF, hypre_ParCSRMatrix *A_FC, hypre_ParCSRMatrix *A_CF, hypre_IntArray *CF_marker, HYPRE_BigInt *num_cpts_global, HYPRE_Real trunc_factor, HYPRE_Int max_elmts, HYPRE_Real strong_threshold, HYPRE_Real max_row_sum, HYPRE_Int blk_size, HYPRE_Int method, hypre_ParCSRMatrix **W_ptr, hypre_ParCSRMatrix **R_ptr, hypre_ParCSRMatrix **RT_ptr ); HYPRE_Int hypre_MGRBuildPFromWp( hypre_ParCSRMatrix *A, hypre_ParCSRMatrix *Wp, HYPRE_Int *CF_marker, hypre_ParCSRMatrix **P_ptr ); HYPRE_Int hypre_MGRBuildPFromWpHost( hypre_ParCSRMatrix *A, hypre_ParCSRMatrix *Wp, HYPRE_Int *CF_marker, hypre_ParCSRMatrix **P_ptr ); HYPRE_Int hypre_MGRBuildBlockJacobiWp( hypre_ParCSRMatrix *A_FF, hypre_ParCSRMatrix *A_FC, HYPRE_Int blk_size, hypre_ParCSRMatrix **Wp_ptr ); HYPRE_Int hypre_MGRBuildBlockJacobiP( hypre_ParCSRMatrix *A, hypre_ParCSRMatrix *A_FF, hypre_ParCSRMatrix *A_FC, hypre_ParCSRMatrix *Wp, HYPRE_Int blk_size, HYPRE_Int *CF_marker, hypre_ParCSRMatrix **P_ptr ); HYPRE_Int hypre_MGRBuildP( hypre_ParCSRMatrix *A, HYPRE_Int *CF_marker, HYPRE_BigInt *num_cpts_global, HYPRE_Int method, HYPRE_Int debug_flag, hypre_ParCSRMatrix **P_ptr ); HYPRE_Int hypre_MGRBuildPHost( hypre_ParCSRMatrix *A, hypre_ParCSRMatrix *A_FF, hypre_ParCSRMatrix *A_FC, HYPRE_Int *CF_marker, HYPRE_BigInt *num_cpts_global, HYPRE_Int method, hypre_ParCSRMatrix **Wp_ptr, hypre_ParCSRMatrix **P_ptr ); HYPRE_Int hypre_MGRBuildInterpApproximateInverse( hypre_ParCSRMatrix *A, HYPRE_Int *CF_marker, HYPRE_BigInt *num_cpts_global, hypre_ParCSRMatrix **P_ptr ); HYPRE_Int hypre_MGRTruncateAcfCPR( hypre_ParCSRMatrix *A_CF, hypre_ParCSRMatrix **A_CF_new_ptr ); HYPRE_Int hypre_MGRBuildRFromWr( hypre_IntArray *C_map, hypre_IntArray *F_map, HYPRE_BigInt global_num_rows_R, HYPRE_BigInt global_num_cols_R, HYPRE_BigInt *row_starts_R, HYPRE_BigInt *col_starts_R, hypre_ParCSRMatrix *Wr, hypre_ParCSRMatrix **R_ptr ); HYPRE_Int hypre_MGRBlockColLumpedRestrict( hypre_ParCSRMatrix *A, hypre_ParCSRMatrix *A_FF, hypre_ParCSRMatrix *A_CF, hypre_IntArray *CF_marker, HYPRE_Int blk_dim, hypre_ParCSRMatrix **Wr_ptr, hypre_ParCSRMatrix **R_ptr); HYPRE_Int hypre_MGRColLumpedRestrict(hypre_ParCSRMatrix *A, hypre_ParCSRMatrix *A_FF, hypre_ParCSRMatrix *A_CF, hypre_IntArray *CF_marker, hypre_ParCSRMatrix **Wr_ptr, hypre_ParCSRMatrix **R_ptr); /* par_mgr_rap.c */ HYPRE_Int hypre_MGRBuildCoarseOperator(void *mgr_data, hypre_ParCSRMatrix *A_FF, hypre_ParCSRMatrix *A_FC, hypre_ParCSRMatrix *A_CF, hypre_ParCSRMatrix **A_CC_ptr, hypre_ParCSRMatrix *Wp, hypre_ParCSRMatrix *Wr, HYPRE_Int level); /* par_mgr_coarsen.c */ HYPRE_Int hypre_MGRCoarseParms( MPI_Comm comm, HYPRE_Int num_rows, hypre_IntArray *CF_marker, HYPRE_BigInt *row_starts_cpts, HYPRE_BigInt *row_starts_fpts ); /* par_mgr_device.c */ HYPRE_Int hypre_MGRRelaxL1JacobiDevice( hypre_ParCSRMatrix *A, hypre_ParVector *f, HYPRE_Int *CF_marker_host, HYPRE_Int relax_points, HYPRE_Real relax_weight, HYPRE_Real *l1_norms, hypre_ParVector *u, hypre_ParVector *Vtemp ); HYPRE_Int hypre_MGRBuildPFromWpDevice( hypre_ParCSRMatrix *A, hypre_ParCSRMatrix *Wp, HYPRE_Int *CF_marker, hypre_ParCSRMatrix **P_ptr); HYPRE_Int hypre_MGRBuildPDevice( hypre_ParCSRMatrix *A, HYPRE_Int *CF_marker, HYPRE_BigInt *num_cpts_global, HYPRE_Int method, hypre_ParCSRMatrix **P_ptr ); HYPRE_Int hypre_ParCSRMatrixExtractBlockDiagDevice( hypre_ParCSRMatrix *A, HYPRE_Int blk_size, HYPRE_Int num_points, HYPRE_Int point_type, HYPRE_Int *CF_marker, HYPRE_Int diag_size, HYPRE_Int diag_type, HYPRE_Int *B_diag_i, HYPRE_Int *B_diag_j, HYPRE_Complex *B_diag_data ); HYPRE_Int hypre_ParCSRMatrixBlockDiagMatrixDevice( hypre_ParCSRMatrix *A, HYPRE_Int blk_size, HYPRE_Int point_type, HYPRE_Int *CF_marker, HYPRE_Int diag_type, hypre_ParCSRMatrix **B_ptr ); /* par_mgr_stats.c */ HYPRE_Int hypre_MGRSetupStats( void *mgr_vdata ); /* par_ilu.c */ void *hypre_ILUCreate ( void ); HYPRE_Int hypre_ILUDestroy ( void *ilu_vdata ); HYPRE_Int hypre_ILUSetLevelOfFill( void *ilu_vdata, HYPRE_Int lfil ); HYPRE_Int hypre_ILUSetMaxNnzPerRow( void *ilu_vdata, HYPRE_Int nzmax ); HYPRE_Int hypre_ILUSetDropThreshold( void *ilu_vdata, HYPRE_Real threshold ); HYPRE_Int hypre_ILUSetDropThresholdArray( void *ilu_vdata, HYPRE_Real *threshold ); HYPRE_Int hypre_ILUSetType( void *ilu_vdata, HYPRE_Int ilu_type ); HYPRE_Int hypre_ILUSetMaxIter( void *ilu_vdata, HYPRE_Int max_iter ); HYPRE_Int hypre_ILUSetTol( void *ilu_vdata, HYPRE_Real tol ); HYPRE_Int hypre_ILUSetIterativeSetupType( void *ilu_vdata, HYPRE_Int iter_setup_type ); HYPRE_Int hypre_ILUSetIterativeSetupOption( void *ilu_vdata, HYPRE_Int iter_setup_option ); HYPRE_Int hypre_ILUSetIterativeSetupMaxIter( void *ilu_vdata, HYPRE_Int iter_setup_max_iter ); HYPRE_Int hypre_ILUSetIterativeSetupTolerance( void *ilu_vdata, HYPRE_Real iter_setup_tolerance ); HYPRE_Int hypre_ILUGetIterativeSetupHistory( void *ilu_vdata, HYPRE_Complex **iter_setup_history ); HYPRE_Int hypre_ILUSetTriSolve( void *ilu_vdata, HYPRE_Int tri_solve ); HYPRE_Int hypre_ILUSetLowerJacobiIters( void *ilu_vdata, HYPRE_Int lower_jacobi_iters ); HYPRE_Int hypre_ILUSetUpperJacobiIters( void *ilu_vdata, HYPRE_Int upper_jacobi_iters ); HYPRE_Int hypre_ILUSetPrintLevel( void *ilu_vdata, HYPRE_Int print_level ); HYPRE_Int hypre_ILUSetLogging( void *ilu_vdata, HYPRE_Int logging ); HYPRE_Int hypre_ILUSetLocalReordering( void *ilu_vdata, HYPRE_Int ordering_type ); HYPRE_Int hypre_ILUSetSchurSolverMaxIter( void *ilu_vdata, HYPRE_Int ss_max_iter ); HYPRE_Int hypre_ILUSetSchurSolverTol( void *ilu_vdata, HYPRE_Real ss_tol ); HYPRE_Int hypre_ILUSetSchurSolverAbsoluteTol( void *ilu_vdata, HYPRE_Real ss_absolute_tol ); HYPRE_Int hypre_ILUSetSchurSolverLogging( void *ilu_vdata, HYPRE_Int ss_logging ); HYPRE_Int hypre_ILUSetSchurSolverPrintLevel( void *ilu_vdata, HYPRE_Int ss_print_level ); HYPRE_Int hypre_ILUSetSchurSolverRelChange( void *ilu_vdata, HYPRE_Int ss_rel_change ); HYPRE_Int hypre_ILUSetSchurPrecondILUType( void *ilu_vdata, HYPRE_Int sp_ilu_type ); HYPRE_Int hypre_ILUSetSchurPrecondILULevelOfFill( void *ilu_vdata, HYPRE_Int sp_ilu_lfil ); HYPRE_Int hypre_ILUSetSchurPrecondILUMaxNnzPerRow( void *ilu_vdata, HYPRE_Int sp_ilu_max_row_nnz ); HYPRE_Int hypre_ILUSetSchurPrecondILUDropThreshold( void *ilu_vdata, HYPRE_Real sp_ilu_droptol ); HYPRE_Int hypre_ILUSetSchurPrecondILUDropThresholdArray( void *ilu_vdata, HYPRE_Real *sp_ilu_droptol ); HYPRE_Int hypre_ILUSetSchurPrecondPrintLevel( void *ilu_vdata, HYPRE_Int sp_print_level ); HYPRE_Int hypre_ILUSetSchurPrecondMaxIter( void *ilu_vdata, HYPRE_Int sp_max_iter ); HYPRE_Int hypre_ILUSetSchurPrecondTriSolve( void *ilu_vdata, HYPRE_Int sp_tri_solve ); HYPRE_Int hypre_ILUSetSchurPrecondLowerJacobiIters( void *ilu_vdata, HYPRE_Int sp_lower_jacobi_iters ); HYPRE_Int hypre_ILUSetSchurPrecondUpperJacobiIters( void *ilu_vdata, HYPRE_Int sp_upper_jacobi_iters ); HYPRE_Int hypre_ILUSetSchurPrecondTol( void *ilu_vdata, HYPRE_Int sp_tol ); HYPRE_Int hypre_ILUSetSchurNSHDropThreshold( void *ilu_vdata, HYPRE_Real threshold ); HYPRE_Int hypre_ILUSetSchurNSHDropThresholdArray( void *ilu_vdata, HYPRE_Real *threshold ); HYPRE_Int hypre_ILUGetNumIterations( void *ilu_vdata, HYPRE_Int *num_iterations ); HYPRE_Int hypre_ILUGetFinalRelativeResidualNorm( void *ilu_vdata, HYPRE_Real *res_norm ); HYPRE_Int hypre_ILUWriteSolverParams( void *ilu_vdata ); HYPRE_Int hypre_ILUMinHeapAddI( HYPRE_Int *heap, HYPRE_Int len ); HYPRE_Int hypre_ILUMinHeapAddIIIi( HYPRE_Int *heap, HYPRE_Int *I1, HYPRE_Int *Ii1, HYPRE_Int len ); HYPRE_Int hypre_ILUMinHeapAddIRIi( HYPRE_Int *heap, HYPRE_Real *I1, HYPRE_Int *Ii1, HYPRE_Int len ); HYPRE_Int hypre_ILUMaxrHeapAddRabsI( HYPRE_Real *heap, HYPRE_Int *I1, HYPRE_Int len ); HYPRE_Int hypre_ILUMinHeapRemoveI( HYPRE_Int *heap, HYPRE_Int len ); HYPRE_Int hypre_ILUMinHeapRemoveIIIi( HYPRE_Int *heap, HYPRE_Int *I1, HYPRE_Int *Ii1, HYPRE_Int len ); HYPRE_Int hypre_ILUMinHeapRemoveIRIi( HYPRE_Int *heap, HYPRE_Real *I1, HYPRE_Int *Ii1, HYPRE_Int len ); HYPRE_Int hypre_ILUMaxrHeapRemoveRabsI( HYPRE_Real *heap, HYPRE_Int *I1, HYPRE_Int len ); HYPRE_Int hypre_ILUMaxQSplitRabsI( HYPRE_Real *arrayR, HYPRE_Int *arrayI, HYPRE_Int left, HYPRE_Int bound, HYPRE_Int right ); HYPRE_Int hypre_ILUMaxRabs( HYPRE_Real *array_data, HYPRE_Int *array_j, HYPRE_Int start, HYPRE_Int end, HYPRE_Int nLU, HYPRE_Int *rperm, HYPRE_Real *value, HYPRE_Int *index, HYPRE_Real *l1_norm, HYPRE_Int *nnz ); HYPRE_Int hypre_ILUGetPermddPQPre( HYPRE_Int n, HYPRE_Int nLU, HYPRE_Int *A_diag_i, HYPRE_Int *A_diag_j, HYPRE_Real *A_diag_data, HYPRE_Real tol, HYPRE_Int *perm, HYPRE_Int *rperm, HYPRE_Int *pperm_pre, HYPRE_Int *qperm_pre, HYPRE_Int *nB ); HYPRE_Int hypre_ILUGetPermddPQ( hypre_ParCSRMatrix *A, HYPRE_Int **io_pperm, HYPRE_Int **io_qperm, HYPRE_Real tol, HYPRE_Int *nB, HYPRE_Int *nI, HYPRE_Int reordering_type ); HYPRE_Int hypre_ILUGetInteriorExteriorPerm( hypre_ParCSRMatrix *A, HYPRE_MemoryLocation memory_location, HYPRE_Int **perm, HYPRE_Int *nLU, HYPRE_Int reordering_type ); HYPRE_Int hypre_ILUGetLocalPerm( hypre_ParCSRMatrix *A, HYPRE_Int **perm_ptr, HYPRE_Int *nLU, HYPRE_Int reordering_type ); HYPRE_Int hypre_ILUBuildRASExternalMatrix( hypre_ParCSRMatrix *A, HYPRE_Int *rperm, HYPRE_Int **E_i, HYPRE_Int **E_j, HYPRE_Real **E_data ); HYPRE_Int hypre_ILUSortOffdColmap( hypre_ParCSRMatrix *A ); HYPRE_Int hypre_ILULocalRCMBuildFinalPerm( HYPRE_Int start, HYPRE_Int end, HYPRE_Int * G_perm, HYPRE_Int *perm, HYPRE_Int *qperm, HYPRE_Int **permp, HYPRE_Int **qpermp ); HYPRE_Int hypre_ILULocalRCM( hypre_CSRMatrix *A, HYPRE_Int start, HYPRE_Int end, HYPRE_Int **permp, HYPRE_Int **qpermp, HYPRE_Int sym ); HYPRE_Int hypre_ILULocalRCMMindegree( HYPRE_Int n, HYPRE_Int *degree, HYPRE_Int *marker, HYPRE_Int *rootp ); HYPRE_Int hypre_ILULocalRCMOrder( hypre_CSRMatrix *A, HYPRE_Int *perm ); HYPRE_Int hypre_ILULocalRCMFindPPNode( hypre_CSRMatrix *A, HYPRE_Int *rootp, HYPRE_Int *marker ); HYPRE_Int hypre_ILULocalRCMBuildLevel( hypre_CSRMatrix *A, HYPRE_Int root, HYPRE_Int *marker, HYPRE_Int *level_i, HYPRE_Int *level_j, HYPRE_Int *nlevp ); HYPRE_Int hypre_ILULocalRCMNumbering( hypre_CSRMatrix *A, HYPRE_Int root, HYPRE_Int *marker, HYPRE_Int *perm, HYPRE_Int *current_nump ); HYPRE_Int hypre_ILULocalRCMQsort( HYPRE_Int *perm, HYPRE_Int start, HYPRE_Int end, HYPRE_Int *degree ); HYPRE_Int hypre_ILULocalRCMReverse( HYPRE_Int *perm, HYPRE_Int start, HYPRE_Int end ); #if defined(HYPRE_USING_GPU) HYPRE_Int hypre_ParILUSchurGMRESDummySolveDevice( void *ilu_vdata, void *ilu_vdata2, hypre_ParVector *f, hypre_ParVector *u ); HYPRE_Int hypre_ParILUSchurGMRESCommInfoDevice( void *ilu_vdata, HYPRE_Int *my_id, HYPRE_Int *num_procs ); HYPRE_Int hypre_ParILURAPSchurGMRESSolveDevice( void *ilu_vdata, void *ilu_vdata2, hypre_ParVector *par_f, hypre_ParVector *par_u ); HYPRE_Int hypre_ParILURAPSchurGMRESMatvecDevice( void *matvec_data, HYPRE_Complex alpha, void *ilu_vdata, void *x, HYPRE_Complex beta, void *y ); #endif HYPRE_Int hypre_ParILURAPSchurGMRESCommInfoHost( void *ilu_vdata, HYPRE_Int *my_id, HYPRE_Int *num_procs ); HYPRE_Int hypre_ParILURAPSchurGMRESSolveHost( void *ilu_vdata, void *ilu_vdata2, hypre_ParVector *f, hypre_ParVector *u ); HYPRE_Int hypre_ParILURAPSchurGMRESMatvecHost( void *matvec_data, HYPRE_Complex alpha, void *ilu_vdata, void *x, HYPRE_Complex beta, void *y ); void * hypre_NSHCreate( void ); HYPRE_Int hypre_NSHDestroy( void *data ); HYPRE_Int hypre_NSHWriteSolverParams( void *nsh_vdata ); HYPRE_Int hypre_NSHSetPrintLevel( void *nsh_vdata, HYPRE_Int print_level ); HYPRE_Int hypre_NSHSetLogging( void *nsh_vdata, HYPRE_Int logging ); HYPRE_Int hypre_NSHSetMaxIter( void *nsh_vdata, HYPRE_Int max_iter ); HYPRE_Int hypre_NSHSetTol( void *nsh_vdata, HYPRE_Real tol ); HYPRE_Int hypre_NSHSetGlobalSolver( void *nsh_vdata, HYPRE_Int global_solver ); HYPRE_Int hypre_NSHSetDropThreshold( void *nsh_vdata, HYPRE_Real droptol ); HYPRE_Int hypre_NSHSetDropThresholdArray( void *nsh_vdata, HYPRE_Real *droptol ); HYPRE_Int hypre_NSHSetMRMaxIter( void *nsh_vdata, HYPRE_Int mr_max_iter ); HYPRE_Int hypre_NSHSetMRTol( void *nsh_vdata, HYPRE_Real mr_tol ); HYPRE_Int hypre_NSHSetMRMaxRowNnz( void *nsh_vdata, HYPRE_Int mr_max_row_nnz ); HYPRE_Int hypre_NSHSetColVersion( void *nsh_vdata, HYPRE_Int mr_col_version ); HYPRE_Int hypre_NSHSetNSHMaxIter( void *nsh_vdata, HYPRE_Int nsh_max_iter ); HYPRE_Int hypre_NSHSetNSHTol( void *nsh_vdata, HYPRE_Real nsh_tol ); HYPRE_Int hypre_NSHSetNSHMaxRowNnz( void *nsh_vdata, HYPRE_Int nsh_max_row_nnz ); HYPRE_Int hypre_CSRMatrixNormFro( hypre_CSRMatrix *A, HYPRE_Real *norm_io); HYPRE_Int hypre_CSRMatrixResNormFro( hypre_CSRMatrix *A, HYPRE_Real *norm_io); HYPRE_Int hypre_ParCSRMatrixNormFro( hypre_ParCSRMatrix *A, HYPRE_Real *norm_io); HYPRE_Int hypre_ParCSRMatrixResNormFro( hypre_ParCSRMatrix *A, HYPRE_Real *norm_io); HYPRE_Int hypre_CSRMatrixTrace( hypre_CSRMatrix *A, HYPRE_Real *trace_io); HYPRE_Int hypre_CSRMatrixDropInplace( hypre_CSRMatrix *A, HYPRE_Real droptol, HYPRE_Int max_row_nnz ); HYPRE_Int hypre_ILUCSRMatrixInverseSelfPrecondMRGlobal( hypre_CSRMatrix *matA, hypre_CSRMatrix **M, HYPRE_Real droptol, HYPRE_Real tol, HYPRE_Real eps_tol, HYPRE_Int max_row_nnz, HYPRE_Int max_iter, HYPRE_Int print_level ); HYPRE_Int hypre_ILUParCSRInverseNSH( hypre_ParCSRMatrix *A, hypre_ParCSRMatrix **M, HYPRE_Real *droptol, HYPRE_Real mr_tol, HYPRE_Real nsh_tol, HYPRE_Real eps_tol, HYPRE_Int mr_max_row_nnz, HYPRE_Int nsh_max_row_nnz, HYPRE_Int mr_max_iter, HYPRE_Int nsh_max_iter, HYPRE_Int mr_col_version, HYPRE_Int print_level ); /* par_ilu_setup.c */ HYPRE_Int hypre_ILUSetup( void *ilu_vdata, hypre_ParCSRMatrix *A, hypre_ParVector *f, hypre_ParVector *u ); HYPRE_Int hypre_ParILUExtractEBFC( hypre_CSRMatrix *A_diag, HYPRE_Int nLU, hypre_CSRMatrix **Bp, hypre_CSRMatrix **Cp, hypre_CSRMatrix **Ep, hypre_CSRMatrix **Fp ); HYPRE_Int hypre_ParILURAPReorder( hypre_ParCSRMatrix *A, HYPRE_Int *perm, HYPRE_Int *rqperm, hypre_ParCSRMatrix **A_pq ); HYPRE_Int hypre_ILUSetupLDUtoCusparse( hypre_ParCSRMatrix *L, HYPRE_Real *D, hypre_ParCSRMatrix *U, hypre_ParCSRMatrix **LDUp ); HYPRE_Int hypre_ILUSetupRAPMILU0( hypre_ParCSRMatrix *A, hypre_ParCSRMatrix **ALUp, HYPRE_Int modified ); HYPRE_Int hypre_ILUSetupRAPILU0Device( hypre_ParCSRMatrix *A, HYPRE_Int *perm, HYPRE_Int n, HYPRE_Int nLU, hypre_ParCSRMatrix **Apermptr, hypre_ParCSRMatrix **matSptr, hypre_CSRMatrix **ALUptr, hypre_CSRMatrix **BLUptr, hypre_CSRMatrix **CLUptr, hypre_CSRMatrix **Eptr, hypre_CSRMatrix **Fptr, HYPRE_Int test_opt ); HYPRE_Int hypre_ILUSetupRAPILU0( hypre_ParCSRMatrix *A, HYPRE_Int *perm, HYPRE_Int n, HYPRE_Int nLU, hypre_ParCSRMatrix **Lptr, HYPRE_Real **Dptr, hypre_ParCSRMatrix **Uptr, hypre_ParCSRMatrix **mLptr, HYPRE_Real **mDptr, hypre_ParCSRMatrix **mUptr, HYPRE_Int **u_end ); HYPRE_Int hypre_ILUSetupILU0( hypre_ParCSRMatrix *A, HYPRE_Int *perm, HYPRE_Int *qperm, HYPRE_Int nLU, HYPRE_Int nI, hypre_ParCSRMatrix **Lptr, HYPRE_Real **Dptr, hypre_ParCSRMatrix **Uptr, hypre_ParCSRMatrix **Sptr, HYPRE_Int **u_end ); HYPRE_Int hypre_ILUSetupMILU0( hypre_ParCSRMatrix *A, HYPRE_Int *permp, HYPRE_Int *qpermp, HYPRE_Int nLU, HYPRE_Int nI, hypre_ParCSRMatrix **Lptr, HYPRE_Real **Dptr, hypre_ParCSRMatrix **Uptr, hypre_ParCSRMatrix **Sptr, HYPRE_Int **u_end, HYPRE_Int modified ); HYPRE_Int hypre_ILUSetupILUKSymbolic( HYPRE_Int n, HYPRE_Int *A_diag_i, HYPRE_Int *A_diag_j, HYPRE_Int lfil, HYPRE_Int *perm, HYPRE_Int *rperm, HYPRE_Int *iw, HYPRE_Int nLU, HYPRE_Int *L_diag_i, HYPRE_Int *U_diag_i, HYPRE_Int *S_diag_i, HYPRE_Int **L_diag_j, HYPRE_Int **U_diag_j, HYPRE_Int **S_diag_j, HYPRE_Int **u_end ); HYPRE_Int hypre_ILUSetupILUK( hypre_ParCSRMatrix *A, HYPRE_Int lfil, HYPRE_Int *permp, HYPRE_Int *qpermp, HYPRE_Int nLU, HYPRE_Int nI, hypre_ParCSRMatrix **Lptr, HYPRE_Real **Dptr, hypre_ParCSRMatrix **Uptr, hypre_ParCSRMatrix **Sptr, HYPRE_Int **u_end ); HYPRE_Int hypre_ILUSetupILUT( hypre_ParCSRMatrix *A, HYPRE_Int lfil, HYPRE_Real *tol, HYPRE_Int *permp, HYPRE_Int *qpermp, HYPRE_Int nLU, HYPRE_Int nI, hypre_ParCSRMatrix **Lptr, HYPRE_Real **Dptr, hypre_ParCSRMatrix **Uptr, hypre_ParCSRMatrix **Sptr, HYPRE_Int **u_end ); HYPRE_Int hypre_NSHSetup( void *nsh_vdata, hypre_ParCSRMatrix *A, hypre_ParVector *f, hypre_ParVector *u ); HYPRE_Int hypre_ILUSetupILU0RAS( hypre_ParCSRMatrix *A, HYPRE_Int *perm, HYPRE_Int nLU, hypre_ParCSRMatrix **Lptr, HYPRE_Real **Dptr, hypre_ParCSRMatrix **Uptr ); HYPRE_Int hypre_ILUSetupILUKRASSymbolic( HYPRE_Int n, HYPRE_Int *A_diag_i, HYPRE_Int *A_diag_j, HYPRE_Int *A_offd_i, HYPRE_Int *A_offd_j, HYPRE_Int *E_i, HYPRE_Int *E_j, HYPRE_Int ext, HYPRE_Int lfil, HYPRE_Int *perm, HYPRE_Int *rperm, HYPRE_Int *iw, HYPRE_Int nLU, HYPRE_Int *L_diag_i, HYPRE_Int *U_diag_i, HYPRE_Int **L_diag_j, HYPRE_Int **U_diag_j ); HYPRE_Int hypre_ILUSetupILUKRAS( hypre_ParCSRMatrix *A, HYPRE_Int lfil, HYPRE_Int *perm, HYPRE_Int nLU, hypre_ParCSRMatrix **Lptr, HYPRE_Real **Dptr, hypre_ParCSRMatrix **Uptr ); HYPRE_Int hypre_ILUSetupILUTRAS( hypre_ParCSRMatrix *A, HYPRE_Int lfil, HYPRE_Real *tol, HYPRE_Int *perm, HYPRE_Int nLU, hypre_ParCSRMatrix **Lptr, HYPRE_Real **Dptr, hypre_ParCSRMatrix **Uptr ); /* par_ilu_setup_device.c */ #if defined(HYPRE_USING_GPU) HYPRE_Int hypre_ILUSetupDevice(hypre_ParILUData *ilu_data, hypre_ParCSRMatrix *A, HYPRE_Int *perm_data, HYPRE_Int *qperm_data, HYPRE_Int n, HYPRE_Int nLU, hypre_CSRMatrix **BLUptr, hypre_ParCSRMatrix **matSptr, hypre_CSRMatrix **Eptr, hypre_CSRMatrix **Fptr); HYPRE_Int hypre_ILUSetupIterativeILU0Device( hypre_CSRMatrix *A, HYPRE_Int type, HYPRE_Int option, HYPRE_Int max_iter, HYPRE_Real tolerance, HYPRE_Int *num_iter_ptr, HYPRE_Real **history_ptr ); #endif /* par_ilu_solve.c */ HYPRE_Int hypre_ILUSolve( void *ilu_vdata, hypre_ParCSRMatrix *A, hypre_ParVector *f, hypre_ParVector *u ); HYPRE_Int hypre_ILUSolveSchurGMRES( hypre_ParCSRMatrix *A, hypre_ParVector *f, hypre_ParVector *u, HYPRE_Int *perm, HYPRE_Int *qperm, HYPRE_Int nLU, hypre_ParCSRMatrix *L, HYPRE_Real *D, hypre_ParCSRMatrix *U, hypre_ParCSRMatrix *S, hypre_ParVector *ftemp, hypre_ParVector *utemp, HYPRE_Solver schur_solver, HYPRE_Solver schur_precond, hypre_ParVector *rhs, hypre_ParVector *x, HYPRE_Int *u_end ); HYPRE_Int hypre_ILUSolveSchurNSH( hypre_ParCSRMatrix *A, hypre_ParVector *f, hypre_ParVector *u, HYPRE_Int *perm, HYPRE_Int nLU, hypre_ParCSRMatrix *L, HYPRE_Real *D, hypre_ParCSRMatrix *U, hypre_ParCSRMatrix *S, hypre_ParVector *ftemp, hypre_ParVector *utemp, HYPRE_Solver schur_solver, hypre_ParVector *rhs, hypre_ParVector *x, HYPRE_Int *u_end ); HYPRE_Int hypre_ILUSolveLU( hypre_ParCSRMatrix *A, hypre_ParVector *f, hypre_ParVector *u, HYPRE_Int *perm, HYPRE_Int nLU, hypre_ParCSRMatrix *L, HYPRE_Real *D, hypre_ParCSRMatrix *U, hypre_ParVector *ftemp, hypre_ParVector *utemp ); HYPRE_Int hypre_ILUSolveLUIter( hypre_ParCSRMatrix *A, hypre_ParVector *f, hypre_ParVector *u, HYPRE_Int *perm, HYPRE_Int nLU, hypre_ParCSRMatrix *L, HYPRE_Real *D, hypre_ParCSRMatrix *U, hypre_ParVector *ftemp, hypre_ParVector *utemp, HYPRE_Int lower_jacobi_iters, HYPRE_Int upper_jacobi_iters ); HYPRE_Int hypre_ILUSolveLURAS( hypre_ParCSRMatrix *A, hypre_ParVector *f, hypre_ParVector *u, HYPRE_Int *perm, hypre_ParCSRMatrix *L, HYPRE_Real *D, hypre_ParCSRMatrix *U, hypre_ParVector *ftemp, hypre_ParVector *utemp, HYPRE_Real *fext, HYPRE_Real *uext ); HYPRE_Int hypre_ILUSolveRAPGMRESHost( hypre_ParCSRMatrix *A, hypre_ParVector *f, hypre_ParVector *u, HYPRE_Int *perm, HYPRE_Int nLU, hypre_ParCSRMatrix *L, HYPRE_Real *D, hypre_ParCSRMatrix *U, hypre_ParCSRMatrix *mL, HYPRE_Real *mD, hypre_ParCSRMatrix *mU, hypre_ParVector *ftemp, hypre_ParVector *utemp, hypre_ParVector *xtemp, hypre_ParVector *ytemp, HYPRE_Solver schur_solver, HYPRE_Solver schur_precond, hypre_ParVector *rhs, hypre_ParVector *x, HYPRE_Int *u_end ); HYPRE_Int hypre_NSHSolve( void *nsh_vdata, hypre_ParCSRMatrix *A, hypre_ParVector *f, hypre_ParVector *u ); HYPRE_Int hypre_NSHSolveInverse( hypre_ParCSRMatrix *A, hypre_ParVector *f, hypre_ParVector *u, hypre_ParCSRMatrix *M, hypre_ParVector *ftemp, hypre_ParVector *utemp ); /* par_ilu_solve_device.c */ #if defined(HYPRE_USING_GPU) HYPRE_Int hypre_ILUSolveLUDevice( hypre_ParCSRMatrix *A, hypre_CSRMatrix *matLU_d, hypre_ParVector *f, hypre_ParVector *u, HYPRE_Int *perm, hypre_ParVector *ftemp, hypre_ParVector *utemp ); HYPRE_Int hypre_ILUApplyLowerJacIterDevice( hypre_CSRMatrix *A, hypre_Vector *input, hypre_Vector *work, hypre_Vector *output, HYPRE_Int lower_jacobi_iters ); HYPRE_Int hypre_ILUApplyUpperJacIterDevice( hypre_CSRMatrix *A, hypre_Vector *input, hypre_Vector *work, hypre_Vector *output, hypre_Vector *diag, HYPRE_Int upper_jacobi_iters ); HYPRE_Int hypre_ILUApplyLowerUpperJacIterDevice( hypre_CSRMatrix *A, hypre_Vector *work1, hypre_Vector *work2, hypre_Vector *inout, hypre_Vector *diag, HYPRE_Int lower_jacobi_iters, HYPRE_Int upper_jacobi_iters ); HYPRE_Int hypre_ILUSolveLUIterDevice( hypre_ParCSRMatrix *A, hypre_CSRMatrix *matLU, hypre_ParVector *f, hypre_ParVector *u, HYPRE_Int *perm, hypre_ParVector *ftemp, hypre_ParVector *utemp, hypre_ParVector *xtemp, hypre_Vector **diag_ptr, HYPRE_Int lower_jacobi_iters, HYPRE_Int upper_jacobi_iters ); HYPRE_Int hypre_ParILUSchurGMRESMatvecDevice( void *matvec_data, HYPRE_Complex alpha, void *ilu_vdata, void *x, HYPRE_Complex beta, void *y ); HYPRE_Int hypre_ILUSolveSchurGMRESDevice( hypre_ParCSRMatrix *A, hypre_ParVector *f, hypre_ParVector *u, HYPRE_Int *perm, HYPRE_Int nLU, hypre_ParCSRMatrix *S, hypre_ParVector *ftemp, hypre_ParVector *utemp, HYPRE_Solver schur_solver, HYPRE_Solver schur_precond, hypre_ParVector *rhs, hypre_ParVector *x, HYPRE_Int *u_end, hypre_CSRMatrix *matBLU_d, hypre_CSRMatrix *matE_d, hypre_CSRMatrix *matF_d ); HYPRE_Int hypre_ILUSolveSchurGMRESJacIterDevice( hypre_ParCSRMatrix *A, hypre_ParVector *f, hypre_ParVector *u, HYPRE_Int *perm, HYPRE_Int nLU, hypre_ParCSRMatrix *S, hypre_ParVector *ftemp, hypre_ParVector *utemp, HYPRE_Solver schur_solver, HYPRE_Solver schur_precond, hypre_ParVector *rhs, hypre_ParVector *x, HYPRE_Int *u_end, hypre_CSRMatrix *matBLU_d, hypre_CSRMatrix *matE_d, hypre_CSRMatrix *matF_d, hypre_ParVector *ztemp, hypre_Vector **Adiag_diag, hypre_Vector **Sdiag_diag, HYPRE_Int lower_jacobi_iters, HYPRE_Int upper_jacobi_iters ); HYPRE_Int hypre_ParILUSchurGMRESMatvecJacIterDevice( void *matvec_data, HYPRE_Complex alpha, void *ilu_vdata, void *x, HYPRE_Complex beta, void *y ); HYPRE_Int hypre_ILUSolveRAPGMRESDevice( hypre_ParCSRMatrix *A, hypre_ParVector *f, hypre_ParVector *u, HYPRE_Int *perm, HYPRE_Int nLU, hypre_ParCSRMatrix *S, hypre_ParVector *ftemp, hypre_ParVector *utemp, hypre_ParVector *xtemp, hypre_ParVector *ytemp, HYPRE_Solver schur_solver, HYPRE_Solver schur_precond, hypre_ParVector *rhs, hypre_ParVector *x, HYPRE_Int *u_end, hypre_ParCSRMatrix *Aperm, hypre_CSRMatrix *matALU_d, hypre_CSRMatrix *matBLU_d, hypre_CSRMatrix *matE_d, hypre_CSRMatrix *matF_d, HYPRE_Int test_opt ); #endif /* par_amgdd.c */ void *hypre_BoomerAMGDDCreate ( void ); HYPRE_Int hypre_BoomerAMGDDDestroy ( void *data ); HYPRE_Int hypre_BoomerAMGDDSetStartLevel ( void *data, HYPRE_Int start_level ); HYPRE_Int hypre_BoomerAMGDDGetStartLevel ( void *data, HYPRE_Int *start_level ); HYPRE_Int hypre_BoomerAMGDDSetFACNumCycles ( void *data, HYPRE_Int fac_num_cycles ); HYPRE_Int hypre_BoomerAMGDDGetFACNumCycles ( void *data, HYPRE_Int *fac_num_cycles ); HYPRE_Int hypre_BoomerAMGDDSetFACCycleType ( void *data, HYPRE_Int fac_cycle_type ); HYPRE_Int hypre_BoomerAMGDDGetFACCycleType ( void *data, HYPRE_Int *fac_cycle_type ); HYPRE_Int hypre_BoomerAMGDDSetFACNumRelax ( void *data, HYPRE_Int fac_num_relax ); HYPRE_Int hypre_BoomerAMGDDGetFACNumRelax ( void *data, HYPRE_Int *fac_num_relax ); HYPRE_Int hypre_BoomerAMGDDSetFACRelaxType ( void *data, HYPRE_Int fac_relax_type ); HYPRE_Int hypre_BoomerAMGDDGetFACRelaxType ( void *data, HYPRE_Int *fac_relax_type ); HYPRE_Int hypre_BoomerAMGDDSetFACRelaxWeight ( void *data, HYPRE_Real fac_relax_weight ); HYPRE_Int hypre_BoomerAMGDDGetFACRelaxWeight ( void *data, HYPRE_Real *fac_relax_weight ); HYPRE_Int hypre_BoomerAMGDDSetPadding ( void *data, HYPRE_Int padding ); HYPRE_Int hypre_BoomerAMGDDGetPadding ( void *data, HYPRE_Int *padding ); HYPRE_Int hypre_BoomerAMGDDSetNumGhostLayers ( void *data, HYPRE_Int num_ghost_layers ); HYPRE_Int hypre_BoomerAMGDDGetNumGhostLayers ( void *data, HYPRE_Int *num_ghost_layers ); HYPRE_Int hypre_BoomerAMGDDSetUserFACRelaxation( void *data, HYPRE_Int (*userFACRelaxation)( void *amgdd_vdata, HYPRE_Int level, HYPRE_Int cycle_param ) ); HYPRE_Int hypre_BoomerAMGDDGetAMG ( void *data, void **amg_solver ); /* par_amgdd_solve.c */ HYPRE_Int hypre_BoomerAMGDDSolve ( void *solver, hypre_ParCSRMatrix *A, hypre_ParVector *b, hypre_ParVector *x ); HYPRE_Int hypre_BoomerAMGDD_Cycle ( hypre_ParAMGDDData *amgdd_data ); HYPRE_Int hypre_BoomerAMGDD_ResidualCommunication ( hypre_ParAMGDDData *amgdd_data ); HYPRE_Complex* hypre_BoomerAMGDD_PackResidualBuffer ( hypre_AMGDDCompGrid **compGrid, hypre_AMGDDCommPkg *compGridCommPkg, HYPRE_Int current_level, HYPRE_Int proc ); HYPRE_Int hypre_BoomerAMGDD_UnpackResidualBuffer ( HYPRE_Complex *buffer, hypre_AMGDDCompGrid **compGrid, hypre_AMGDDCommPkg *compGridCommPkg, HYPRE_Int current_level, HYPRE_Int proc ); /* par_amgdd_setup.c */ HYPRE_Int hypre_BoomerAMGDDSetup ( void *amgdd_vdata, hypre_ParCSRMatrix *A, hypre_ParVector *b, hypre_ParVector *x ); /* par_amgdd_fac_cycle.c */ HYPRE_Int hypre_BoomerAMGDD_FAC ( void *amgdd_vdata, HYPRE_Int first_iteration ); HYPRE_Int hypre_BoomerAMGDD_FAC_Cycle ( void *amgdd_vdata, HYPRE_Int level, HYPRE_Int cycle_type, HYPRE_Int first_iteration ); HYPRE_Int hypre_BoomerAMGDD_FAC_FCycle ( void *amgdd_vdata, HYPRE_Int first_iteration ); HYPRE_Int hypre_BoomerAMGDD_FAC_Interpolate ( hypre_AMGDDCompGrid *compGrid_f, hypre_AMGDDCompGrid *compGrid_c ); HYPRE_Int hypre_BoomerAMGDD_FAC_Restrict ( hypre_AMGDDCompGrid *compGrid_f, hypre_AMGDDCompGrid *compGrid_c, HYPRE_Int first_iteration ); HYPRE_Int hypre_BoomerAMGDD_FAC_Relax ( void *amgdd_vdata, HYPRE_Int level, HYPRE_Int cycle_param ); HYPRE_Int hypre_BoomerAMGDD_FAC_CFL1JacobiHost ( void *amgdd_vdata, HYPRE_Int level, HYPRE_Int relax_set ); HYPRE_Int hypre_BoomerAMGDD_FAC_Jacobi ( void *amgdd_vdata, HYPRE_Int level, HYPRE_Int cycle_param ); HYPRE_Int hypre_BoomerAMGDD_FAC_JacobiHost ( void *amgdd_vdata, HYPRE_Int level ); HYPRE_Int hypre_BoomerAMGDD_FAC_GaussSeidel ( void *amgdd_vdata, HYPRE_Int level, HYPRE_Int cycle_param ); HYPRE_Int hypre_BoomerAMGDD_FAC_CFL1Jacobi ( void *amgdd_vdata, HYPRE_Int level, HYPRE_Int cycle_param ); HYPRE_Int hypre_BoomerAMGDD_FAC_OrderedGaussSeidel ( void *amgdd_vdata, HYPRE_Int level, HYPRE_Int cycle_param ); /* par_amgdd_fac_cycles_device.c */ HYPRE_Int hypre_BoomerAMGDD_FAC_JacobiDevice ( void *amgdd_vdata, HYPRE_Int level ); HYPRE_Int hypre_BoomerAMGDD_FAC_CFL1JacobiDevice ( void *amgdd_vdata, HYPRE_Int level, HYPRE_Int relax_set ); /* par_amgdd_comp_grid.c */ hypre_AMGDDCompGridMatrix* hypre_AMGDDCompGridMatrixCreate( void ); HYPRE_Int hypre_AMGDDCompGridMatrixDestroy ( hypre_AMGDDCompGridMatrix *matrix ); HYPRE_Int hypre_AMGDDCompGridMatvec ( HYPRE_Complex alpha, hypre_AMGDDCompGridMatrix *A, hypre_AMGDDCompGridVector *x, HYPRE_Complex beta, hypre_AMGDDCompGridVector *y ); HYPRE_Int hypre_AMGDDCompGridRealMatvec ( HYPRE_Complex alpha, hypre_AMGDDCompGridMatrix *A, hypre_AMGDDCompGridVector *x, HYPRE_Complex beta, hypre_AMGDDCompGridVector *y ); hypre_AMGDDCompGridVector* hypre_AMGDDCompGridVectorCreate( void ); HYPRE_Int hypre_AMGDDCompGridVectorInitialize ( hypre_AMGDDCompGridVector *vector, HYPRE_Int num_owned, HYPRE_Int num_nonowned, HYPRE_Int num_real ); HYPRE_Int hypre_AMGDDCompGridVectorDestroy ( hypre_AMGDDCompGridVector *vector ); HYPRE_Real hypre_AMGDDCompGridVectorInnerProd ( hypre_AMGDDCompGridVector *x, hypre_AMGDDCompGridVector *y ); HYPRE_Real hypre_AMGDDCompGridVectorRealInnerProd ( hypre_AMGDDCompGridVector *x, hypre_AMGDDCompGridVector *y ); HYPRE_Int hypre_AMGDDCompGridVectorScale ( HYPRE_Complex alpha, hypre_AMGDDCompGridVector *x ); HYPRE_Int hypre_AMGDDCompGridVectorRealScale ( HYPRE_Complex alpha, hypre_AMGDDCompGridVector *x ); HYPRE_Int hypre_AMGDDCompGridVectorAxpy ( HYPRE_Complex alpha, hypre_AMGDDCompGridVector *x, hypre_AMGDDCompGridVector *y ); HYPRE_Int hypre_AMGDDCompGridVectorRealAxpy ( HYPRE_Complex alpha, hypre_AMGDDCompGridVector *x, hypre_AMGDDCompGridVector *y ); HYPRE_Int hypre_AMGDDCompGridVectorSetConstantValues ( hypre_AMGDDCompGridVector *vector, HYPRE_Complex value ); HYPRE_Int hypre_AMGDDCompGridVectorRealSetConstantValues ( hypre_AMGDDCompGridVector *vector, HYPRE_Complex value ); HYPRE_Int hypre_AMGDDCompGridVectorCopy ( hypre_AMGDDCompGridVector *x, hypre_AMGDDCompGridVector *y ); HYPRE_Int hypre_AMGDDCompGridVectorRealCopy ( hypre_AMGDDCompGridVector *x, hypre_AMGDDCompGridVector *y ); hypre_AMGDDCompGrid *hypre_AMGDDCompGridCreate( void ); HYPRE_Int hypre_AMGDDCompGridDestroy ( hypre_AMGDDCompGrid *compGrid ); HYPRE_Int hypre_AMGDDCompGridInitialize ( hypre_ParAMGDDData *amgdd_data, HYPRE_Int padding, HYPRE_Int level ); HYPRE_Int hypre_AMGDDCompGridSetupRelax ( hypre_ParAMGDDData *amgdd_data ); HYPRE_Int hypre_AMGDDCompGridFinalize ( hypre_ParAMGDDData *amgdd_data ); HYPRE_Int hypre_AMGDDCompGridSetupRealDofMarker ( hypre_AMGDDCompGrid **compGrid, HYPRE_Int num_levels, HYPRE_Int num_ghost_layers ); HYPRE_Int hypre_AMGDDCompGridResize ( hypre_AMGDDCompGrid *compGrid, HYPRE_Int new_size, HYPRE_Int need_coarse_info ); HYPRE_Int hypre_AMGDDCompGridSetupLocalIndices ( hypre_AMGDDCompGrid **compGrid, HYPRE_Int *num_added_nodes, HYPRE_Int ****recv_map, HYPRE_Int num_recv_procs, HYPRE_Int **A_tmp_info, HYPRE_Int start_level, HYPRE_Int num_levels ); HYPRE_Int hypre_AMGDDCompGridSetupLocalIndicesP ( hypre_ParAMGDDData *amgdd_data ); hypre_AMGDDCommPkg *hypre_AMGDDCommPkgCreate ( HYPRE_Int num_levels ); HYPRE_Int hypre_AMGDDCommPkgSendLevelDestroy ( hypre_AMGDDCommPkg *amgddCommPkg, HYPRE_Int level, HYPRE_Int proc ); HYPRE_Int hypre_AMGDDCommPkgRecvLevelDestroy ( hypre_AMGDDCommPkg *amgddCommPkg, HYPRE_Int level, HYPRE_Int proc ); HYPRE_Int hypre_AMGDDCommPkgDestroy ( hypre_AMGDDCommPkg *compGridCommPkg ); HYPRE_Int hypre_AMGDDCommPkgFinalize ( hypre_ParAMGData* amg_data, hypre_AMGDDCommPkg *compGridCommPkg, hypre_AMGDDCompGrid **compGrid ); /* par_amgdd_helpers.c */ HYPRE_Int hypre_BoomerAMGDD_SetupNearestProcessorNeighbors ( hypre_ParCSRMatrix *A, hypre_AMGDDCommPkg *compGridCommPkg, HYPRE_Int level, HYPRE_Int *padding, HYPRE_Int num_ghost_layers ); HYPRE_Int hypre_BoomerAMGDD_RecursivelyBuildPsiComposite ( HYPRE_Int node, HYPRE_Int m, hypre_AMGDDCompGrid *compGrid, HYPRE_Int *add_flag, HYPRE_Int use_sort ); HYPRE_Int hypre_BoomerAMGDD_MarkCoarse ( HYPRE_Int *list, HYPRE_Int *marker, HYPRE_Int *owned_coarse_indices, HYPRE_Int *nonowned_coarse_indices, HYPRE_Int *sort_map, HYPRE_Int num_owned, HYPRE_Int total_num_nodes, HYPRE_Int num_owned_coarse, HYPRE_Int list_size, HYPRE_Int dist, HYPRE_Int use_sort, HYPRE_Int *nodes_to_add ); HYPRE_Int hypre_BoomerAMGDD_UnpackRecvBuffer ( hypre_ParAMGDDData *amgdd_data, HYPRE_Int *recv_buffer, HYPRE_Int **A_tmp_info, HYPRE_Int *recv_map_send_buffer_size, HYPRE_Int *nodes_added_on_level, HYPRE_Int current_level, HYPRE_Int buffer_number ); HYPRE_Int* hypre_BoomerAMGDD_PackSendBuffer ( hypre_ParAMGDDData *amgdd_data, HYPRE_Int proc, HYPRE_Int current_level, HYPRE_Int *padding, HYPRE_Int *send_flag_buffer_size ); HYPRE_Int hypre_BoomerAMGDD_PackRecvMapSendBuffer ( HYPRE_Int *recv_map_send_buffer, HYPRE_Int **recv_red_marker, HYPRE_Int *num_recv_nodes, HYPRE_Int *recv_buffer_size, HYPRE_Int current_level, HYPRE_Int num_levels ); HYPRE_Int hypre_BoomerAMGDD_UnpackSendFlagBuffer ( hypre_AMGDDCompGrid **compGrid, HYPRE_Int *send_flag_buffer, HYPRE_Int **send_flag, HYPRE_Int *num_send_nodes, HYPRE_Int *send_buffer_size, HYPRE_Int current_level, HYPRE_Int num_levels ); HYPRE_Int hypre_BoomerAMGDD_CommunicateRemainingMatrixInfo ( hypre_ParAMGDDData* amgdd_data ); HYPRE_Int hypre_BoomerAMGDD_FixUpRecvMaps ( hypre_AMGDDCompGrid **compGrid, hypre_AMGDDCommPkg *compGridCommPkg, HYPRE_Int start_level, HYPRE_Int num_levels ); /* par_fsai.c */ void* hypre_FSAICreate( void ); HYPRE_Int hypre_FSAIDestroy ( void *data ); HYPRE_Int hypre_FSAISetAlgoType ( void *data, HYPRE_Int algo_type ); HYPRE_Int hypre_FSAISetLocalSolveType ( void *data, HYPRE_Int local_solve_type ); HYPRE_Int hypre_FSAISetMaxSteps ( void *data, HYPRE_Int max_steps ); HYPRE_Int hypre_FSAISetMaxStepSize ( void *data, HYPRE_Int max_step_size ); HYPRE_Int hypre_FSAISetMaxNnzRow ( void *data, HYPRE_Int max_nnz_row ); HYPRE_Int hypre_FSAISetNumLevels ( void *data, HYPRE_Int num_levels ); HYPRE_Int hypre_FSAISetThreshold ( void *data, HYPRE_Real threshold ); HYPRE_Int hypre_FSAISetKapTolerance ( void *data, HYPRE_Real kap_tolerance ); HYPRE_Int hypre_FSAISetMaxIterations ( void *data, HYPRE_Int max_iterations ); HYPRE_Int hypre_FSAISetEigMaxIters ( void *data, HYPRE_Int eig_max_iters ); HYPRE_Int hypre_FSAISetZeroGuess ( void *data, HYPRE_Int zero_guess ); HYPRE_Int hypre_FSAISetTolerance ( void *data, HYPRE_Real tolerance ); HYPRE_Int hypre_FSAISetOmega ( void *data, HYPRE_Real omega ); HYPRE_Int hypre_FSAISetLogging ( void *data, HYPRE_Int logging ); HYPRE_Int hypre_FSAISetNumIterations ( void *data, HYPRE_Int num_iterations ); HYPRE_Int hypre_FSAISetPrintLevel ( void *data, HYPRE_Int print_level ); HYPRE_Int hypre_FSAIGetAlgoType ( void *data, HYPRE_Int *algo_type ); HYPRE_Int hypre_FSAIGetLocalSolveType ( void *data, HYPRE_Int *local_solve_type ); HYPRE_Int hypre_FSAIGetMaxSteps ( void *data, HYPRE_Int *max_steps ); HYPRE_Int hypre_FSAIGetMaxStepSize ( void *data, HYPRE_Int *max_step_size ); HYPRE_Int hypre_FSAIGetMaxNnzRow ( void *data, HYPRE_Int *max_nnz_row ); HYPRE_Int hypre_FSAIGetNumLevels ( void *data, HYPRE_Int *num_levels ); HYPRE_Int hypre_FSAIGetThreshold ( void *data, HYPRE_Real *threshold ); HYPRE_Int hypre_FSAIGetKapTolerance ( void *data, HYPRE_Real *kap_tolerance ); HYPRE_Int hypre_FSAIGetMaxIterations ( void *data, HYPRE_Int *max_iterations ); HYPRE_Int hypre_FSAIGetEigMaxIters ( void *data, HYPRE_Int *eig_max_iters ); HYPRE_Int hypre_FSAIGetZeroGuess ( void *data, HYPRE_Int *zero_guess ); HYPRE_Int hypre_FSAIGetTolerance ( void *data, HYPRE_Real *tolerance ); HYPRE_Int hypre_FSAIGetOmega ( void *data, HYPRE_Real *omega ); HYPRE_Int hypre_FSAIGetLogging ( void *data, HYPRE_Int *logging ); HYPRE_Int hypre_FSAIGetNumIterations ( void *data, HYPRE_Int *num_iterations ); HYPRE_Int hypre_FSAIGetPrintLevel ( void *data, HYPRE_Int *print_level ); /* par_fsai_setup.c */ HYPRE_Int hypre_CSRMatrixExtractDenseMat ( hypre_CSRMatrix *A, hypre_Vector *A_sub, HYPRE_Int *S_Pattern, HYPRE_Int S_nnz, HYPRE_Int *marker ); HYPRE_Int hypre_CSRMatrixExtractDenseRow ( hypre_CSRMatrix *A, hypre_Vector *A_subrow, HYPRE_Int *marker, HYPRE_Int row_num ); HYPRE_Int hypre_FindKapGrad ( hypre_CSRMatrix *A_diag, hypre_Vector *kaporin_gradient, HYPRE_Int *kap_grad_nonzeros, hypre_Vector *G_temp, HYPRE_Int *S_Pattern, HYPRE_Int S_nnz, HYPRE_Int max_row_size, HYPRE_Int row_num, HYPRE_Int *kg_marker ); HYPRE_Int hypre_AddToPattern ( hypre_Vector *kaporin_gradient, HYPRE_Int *kap_grad_nonzeros, HYPRE_Int *S_Pattern, HYPRE_Int *S_nnz, HYPRE_Int *kg_marker, HYPRE_Int max_step_size ); HYPRE_Int hypre_FSAISetup ( void *fsai_vdata, hypre_ParCSRMatrix *A, hypre_ParVector *f, hypre_ParVector *u ); HYPRE_Int hypre_FSAISetupNative ( void *fsai_vdata, hypre_ParCSRMatrix *A, hypre_ParVector *f, hypre_ParVector *u ); HYPRE_Int hypre_FSAISetupOMPDyn ( void *fsai_vdata, hypre_ParCSRMatrix *A, hypre_ParVector *f, hypre_ParVector *u ); HYPRE_Int hypre_FSAIPrintStats ( void *fsai_vdata, hypre_ParCSRMatrix *A ); HYPRE_Int hypre_FSAIComputeOmega ( void *fsai_vdata, hypre_ParCSRMatrix *A ); void hypre_swap2_ci ( HYPRE_Complex *v, HYPRE_Int *w, HYPRE_Int i, HYPRE_Int j ); void hypre_qsort2_ci ( HYPRE_Complex *v, HYPRE_Int *w, HYPRE_Int left, HYPRE_Int right ); HYPRE_Int hypre_FSAIDumpLocalLSDense ( void *fsai_vdata, const char *filename, hypre_ParCSRMatrix *A ); /* par_fsai_solve.c */ HYPRE_Int hypre_FSAISolve ( void *fsai_vdata, hypre_ParCSRMatrix *A, hypre_ParVector *b, hypre_ParVector *x ); HYPRE_Int hypre_FSAIApply ( void *fsai_vdata, HYPRE_Complex alpha, hypre_ParVector *b, hypre_ParVector *x ); /* par_fsai_device.c */ HYPRE_Int hypre_FSAISetupDevice( void *fsai_vdata, hypre_ParCSRMatrix *A, hypre_ParVector *f, hypre_ParVector *u ); hypre-2.33.0/src/parcsr_ls/schwarz.c000066400000000000000000003602271477326011500173520ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "_hypre_parcsr_ls.h" #include "Common.h" #include "_hypre_lapack.h" /* ------------------------------------------------------------------------- dof_domain: for each dof defines neighborhood to build interpolation, using domain_diagmat (for cut--off scaling) and i_domain_dof, j_dof_domain (for extracting the block of A); domain_matrixinverse: contains the inverse of subdomain matrix; B can be used to define strength matrix; ----------------------------------------------------------------------- */ /*-------------------------------------------------------------------------- * hypre_AMGNodalSchwarzSmoother: (Not used currently) *--------------------------------------------------------------------------*/ HYPRE_Int hypre_AMGNodalSchwarzSmoother( hypre_CSRMatrix *A, HYPRE_Int num_functions, HYPRE_Int option, hypre_CSRMatrix **domain_structure_pointer) { /* option = 0: nodal symGS; 1: next to nodal symGS (overlapping Schwarz) */ HYPRE_Int *i_domain_dof, *j_domain_dof; HYPRE_Real *domain_matrixinverse; HYPRE_Int num_domains; hypre_CSRMatrix *domain_structure; HYPRE_Int *i_dof_node, *j_dof_node; HYPRE_Int *i_node_dof, *j_node_dof; HYPRE_Int *i_node_dof_dof, *j_node_dof_dof; HYPRE_Int *i_node_node, *j_node_node; HYPRE_Int num_nodes; HYPRE_Int *i_dof_dof = hypre_CSRMatrixI(A); HYPRE_Int *j_dof_dof = hypre_CSRMatrixJ(A); HYPRE_Real *a_dof_dof = hypre_CSRMatrixData(A); HYPRE_Int num_dofs = hypre_CSRMatrixNumRows(A); HYPRE_Int ierr = 0; HYPRE_Int i, j, k, l_loc, i_loc, j_loc; HYPRE_Int i_dof, j_dof; HYPRE_Int *i_local_to_global; HYPRE_Int *i_global_to_local; HYPRE_Int *i_int; HYPRE_Int *i_int_to_local; HYPRE_Int int_dof_counter, local_dof_counter, max_local_dof_counter = 0; HYPRE_Int domain_dof_counter = 0, domain_matrixinverse_counter = 0; HYPRE_Real *AE; char uplo = 'L'; HYPRE_Int cnt; /* build dof_node graph: ----------------------------------------- */ num_nodes = num_dofs / num_functions; /*hypre_printf("\nnum_nodes: %d, num_dofs: %d = %d x %d\n", num_nodes, num_dofs, num_nodes, num_functions);*/ i_dof_node = hypre_CTAlloc(HYPRE_Int, num_dofs + 1, HYPRE_MEMORY_HOST); j_dof_node = hypre_CTAlloc(HYPRE_Int, num_dofs, HYPRE_MEMORY_HOST); for (i = 0; i < num_dofs + 1; i++) { i_dof_node[i] = i; } for (j = 0; j < num_nodes; j++) { for (k = 0; k < num_functions; k++) { j_dof_node[j * num_functions + k] = j; } } /* build node_dof graph: ----------------------------------------- */ ierr = transpose_matrix_create(&i_node_dof, &j_node_dof, i_dof_node, j_dof_node, num_dofs, num_nodes); /* build node_node graph: ----------------------------------------- */ ierr = matrix_matrix_product(&i_node_dof_dof, &j_node_dof_dof, i_node_dof, j_node_dof, i_dof_dof, j_dof_dof, num_nodes, num_dofs, num_dofs); ierr = matrix_matrix_product(&i_node_node, &j_node_node, i_node_dof_dof, j_node_dof_dof, i_dof_node, j_dof_node, num_nodes, num_dofs, num_nodes); hypre_TFree(i_node_dof_dof, HYPRE_MEMORY_HOST); hypre_TFree(j_node_dof_dof, HYPRE_MEMORY_HOST); /* compute for each node the local information: -------------------- */ i_global_to_local = i_dof_node; for (i_dof = 0; i_dof < num_dofs; i_dof++) { i_global_to_local[i_dof] = -1; } domain_matrixinverse_counter = 0; domain_dof_counter = 0; for (i = 0; i < num_nodes; i++) { local_dof_counter = 0; for (j = i_node_node[i]; j < i_node_node[i + 1]; j++) { for (k = i_node_dof[j_node_node[j]]; k < i_node_dof[j_node_node[j] + 1]; k++) { j_dof = j_node_dof[k]; if (i_global_to_local[j_dof] < 0) { i_global_to_local[j_dof] = local_dof_counter; local_dof_counter++; } } } domain_matrixinverse_counter += local_dof_counter * local_dof_counter; domain_dof_counter += local_dof_counter; if (local_dof_counter > max_local_dof_counter) { max_local_dof_counter = local_dof_counter; } for (j = i_node_node[i]; j < i_node_node[i + 1]; j++) { for (k = i_node_dof[j_node_node[j]]; k < i_node_dof[j_node_node[j] + 1]; k++) { j_dof = j_node_dof[k]; i_global_to_local[j_dof] = -1; } } } num_domains = num_nodes; i_domain_dof = hypre_CTAlloc(HYPRE_Int, num_domains + 1, HYPRE_MEMORY_HOST); if (option == 1) { j_domain_dof = hypre_CTAlloc(HYPRE_Int, domain_dof_counter, HYPRE_MEMORY_HOST); domain_matrixinverse = hypre_CTAlloc(HYPRE_Real, domain_matrixinverse_counter, HYPRE_MEMORY_HOST); } else { j_domain_dof = hypre_CTAlloc(HYPRE_Int, num_dofs, HYPRE_MEMORY_HOST); domain_matrixinverse = hypre_CTAlloc(HYPRE_Real, num_dofs * num_functions, HYPRE_MEMORY_HOST); } i_local_to_global = hypre_CTAlloc(HYPRE_Int, max_local_dof_counter, HYPRE_MEMORY_HOST); i_int_to_local = hypre_CTAlloc(HYPRE_Int, max_local_dof_counter, HYPRE_MEMORY_HOST); i_int = hypre_CTAlloc(HYPRE_Int, max_local_dof_counter, HYPRE_MEMORY_HOST); for (l_loc = 0; l_loc < max_local_dof_counter; l_loc++) { i_int[l_loc] = -1; } domain_dof_counter = 0; domain_matrixinverse_counter = 0; for (i = 0; i < num_nodes; i++) { i_domain_dof[i] = domain_dof_counter; local_dof_counter = 0; for (j = i_node_node[i]; j < i_node_node[i + 1]; j++) { for (k = i_node_dof[j_node_node[j]]; k < i_node_dof[j_node_node[j] + 1]; k++) { j_dof = j_node_dof[k]; if (i_global_to_local[j_dof] < 0) { i_global_to_local[j_dof] = local_dof_counter; i_local_to_global[local_dof_counter] = j_dof; local_dof_counter++; } } } for (j = i_node_dof[i]; j < i_node_dof[i + 1]; j++) { for (k = i_dof_dof[j_node_dof[j]]; k < i_dof_dof[j_node_dof[j] + 1]; k++) { if (i_global_to_local[j_dof_dof[k]] < 0) { hypre_error_w_msg(HYPRE_ERROR_GENERIC, "WRONG local indexing: ===============\n"); } } } int_dof_counter = 0; for (k = i_node_dof[i]; k < i_node_dof[i + 1]; k++) { i_dof = j_node_dof[k]; i_loc = i_global_to_local[i_dof]; i_int[i_loc] = int_dof_counter; i_int_to_local[int_dof_counter] = i_loc; int_dof_counter++; } /* get local matrix AE: ======================================== */ if (option == 1) { AE = &domain_matrixinverse[domain_matrixinverse_counter]; cnt = 0; for (i_loc = 0; i_loc < local_dof_counter; i_loc++) { for (j_loc = 0; j_loc < local_dof_counter; j_loc++) { AE[cnt++] = 0.e0; } } for (i_loc = 0; i_loc < local_dof_counter; i_loc++) { i_dof = i_local_to_global[i_loc]; for (j = i_dof_dof[i_dof]; j < i_dof_dof[i_dof + 1]; j++) { j_loc = i_global_to_local[j_dof_dof[j]]; if (j_loc >= 0) { AE[i_loc + j_loc * local_dof_counter] = a_dof_dof[j]; } } } /* get block for Schwarz smoother: ============================= */ /* ierr = hypre_matinv(XE, AE, local_dof_counter); */ /* hypre_printf("ierr_AE_inv: %d\n", ierr); */ hypre_dpotrf(&uplo, &local_dof_counter, AE, &local_dof_counter, &ierr); if (ierr == 1) { hypre_error_w_msg(HYPRE_ERROR_GENERIC, "Error! Matrix not SPD\n"); } for (i_loc = 0; i_loc < local_dof_counter; i_loc++) { j_domain_dof[domain_dof_counter + i_loc] = i_local_to_global[i_loc]; } } if (option == 0) { AE = &domain_matrixinverse[domain_matrixinverse_counter]; for (i_loc = 0; i_loc < int_dof_counter; i_loc++) { for (j_loc = 0; j_loc < int_dof_counter; j_loc++) { AE[i_loc + j_loc * int_dof_counter] = 0.e0; } } for (l_loc = 0; l_loc < int_dof_counter; l_loc++) { i_loc = i_int_to_local[l_loc]; i_dof = i_local_to_global[i_loc]; for (j = i_dof_dof[i_dof]; j < i_dof_dof[i_dof + 1]; j++) { j_loc = i_global_to_local[j_dof_dof[j]]; if (j_loc >= 0) { if (i_int[j_loc] >= 0) { AE[i_loc + i_int[j_loc] * int_dof_counter] = a_dof_dof[j]; } } } } /* ierr = hypre_matinv(XE, AE, int_dof_counter); */ hypre_dpotrf(&uplo, &local_dof_counter, AE, &local_dof_counter, &ierr); if (ierr) { hypre_error_w_msg(HYPRE_ERROR_GENERIC, " error in dpotrf !!!\n"); } for (i_loc = 0; i_loc < int_dof_counter; i_loc++) { j_domain_dof[domain_dof_counter + i_loc] = i_local_to_global[i_int_to_local[i_loc]]; for (j_loc = 0; j_loc < int_dof_counter; j_loc++) { domain_matrixinverse[domain_matrixinverse_counter + i_loc + j_loc * int_dof_counter] = AE[i_loc + j_loc * int_dof_counter]; } } domain_dof_counter += int_dof_counter; domain_matrixinverse_counter += int_dof_counter * int_dof_counter; } else { domain_dof_counter += local_dof_counter; domain_matrixinverse_counter += local_dof_counter * local_dof_counter; } for (l_loc = 0; l_loc < local_dof_counter; l_loc++) { i_int[l_loc] = -1; i_global_to_local[i_local_to_global[l_loc]] = -1; } } i_domain_dof[num_nodes] = domain_dof_counter; hypre_TFree(i_dof_node, HYPRE_MEMORY_HOST); hypre_TFree(j_dof_node, HYPRE_MEMORY_HOST); hypre_TFree(i_node_dof, HYPRE_MEMORY_HOST); hypre_TFree(j_node_dof, HYPRE_MEMORY_HOST); hypre_TFree(i_node_node, HYPRE_MEMORY_HOST); hypre_TFree(j_node_node, HYPRE_MEMORY_HOST); hypre_TFree(i_int, HYPRE_MEMORY_HOST); hypre_TFree(i_int_to_local, HYPRE_MEMORY_HOST); hypre_TFree(i_local_to_global, HYPRE_MEMORY_HOST); domain_structure = hypre_CSRMatrixCreate(num_domains, max_local_dof_counter, i_domain_dof[num_domains]); hypre_CSRMatrixI(domain_structure) = i_domain_dof; hypre_CSRMatrixJ(domain_structure) = j_domain_dof; hypre_CSRMatrixData(domain_structure) = domain_matrixinverse; *domain_structure_pointer = domain_structure; return hypre_error_flag; } HYPRE_Int hypre_ParMPSchwarzSolve(hypre_ParCSRMatrix *par_A, hypre_CSRMatrix *A_boundary, hypre_ParVector *rhs_vector, hypre_CSRMatrix *domain_structure, hypre_ParVector *par_x, HYPRE_Real relax_wt, HYPRE_Real *scale, hypre_ParVector *Vtemp, HYPRE_Int *pivots, HYPRE_Int use_nonsymm) { hypre_ParCSRCommPkg *comm_pkg = hypre_ParCSRMatrixCommPkg(par_A); HYPRE_Int num_sends = 0; HYPRE_Int *send_map_starts; HYPRE_Int *send_map_elmts; hypre_ParCSRCommHandle *comm_handle; HYPRE_Int ierr = 0; /* HYPRE_Int num_dofs; */ hypre_CSRMatrix *A_diag; HYPRE_Int *A_diag_i; HYPRE_Int *A_diag_j; HYPRE_Real *A_diag_data; hypre_CSRMatrix *A_offd; HYPRE_Int *A_offd_i = NULL; HYPRE_Int *A_offd_j = NULL; HYPRE_Real *A_offd_data = NULL; HYPRE_Real *x; HYPRE_Real *x_ext = NULL; HYPRE_Real *x_ext_old = NULL; HYPRE_Real *rhs; HYPRE_Real *rhs_ext = NULL; HYPRE_Real *vtemp_data; HYPRE_Real *aux; HYPRE_Real *buf_data = NULL; /*hypre_Vector *x_vector;*/ MPI_Comm comm = hypre_ParCSRMatrixComm(par_A); HYPRE_Int num_domains = hypre_CSRMatrixNumRows(domain_structure); HYPRE_Int max_domain_size = hypre_CSRMatrixNumCols(domain_structure); HYPRE_Int *i_domain_dof = hypre_CSRMatrixI(domain_structure); HYPRE_Int *j_domain_dof = hypre_CSRMatrixJ(domain_structure); HYPRE_Real *domain_matrixinverse = hypre_CSRMatrixData(domain_structure); HYPRE_Int *A_boundary_i = NULL; HYPRE_Int *A_boundary_j = NULL; HYPRE_Real *A_boundary_data = NULL; HYPRE_Int num_variables; HYPRE_Int num_cols_offd; HYPRE_Int piv_counter = 0; HYPRE_Int one = 1; char uplo = 'L'; HYPRE_Int jj, i, j, k, j_loc, k_loc; HYPRE_Int index; HYPRE_Int matrix_size, matrix_size_counter = 0; HYPRE_Int num_procs; hypre_MPI_Comm_size(comm, &num_procs); /* initiate: ----------------------------------------------- */ /* num_dofs = hypre_CSRMatrixNumRows(A); */ A_diag = hypre_ParCSRMatrixDiag(par_A); A_offd = hypre_ParCSRMatrixOffd(par_A); num_variables = hypre_CSRMatrixNumRows(A_diag); num_cols_offd = hypre_CSRMatrixNumCols(A_offd); x = hypre_VectorData(hypre_ParVectorLocalVector(par_x)); vtemp_data = hypre_VectorData(hypre_ParVectorLocalVector(Vtemp)); rhs = hypre_VectorData(hypre_ParVectorLocalVector(rhs_vector)); if (use_nonsymm) { uplo = 'N'; } /*x_vector = hypre_ParVectorLocalVector(par_x);*/ A_diag_i = hypre_CSRMatrixI(A_diag); A_diag_j = hypre_CSRMatrixJ(A_diag); A_diag_data = hypre_CSRMatrixData(A_diag); A_offd_i = hypre_CSRMatrixI(A_offd); if (num_cols_offd) { A_offd_j = hypre_CSRMatrixJ(A_offd); A_offd_data = hypre_CSRMatrixData(A_offd); A_boundary_i = hypre_CSRMatrixI(A_boundary); A_boundary_j = hypre_CSRMatrixJ(A_boundary); A_boundary_data = hypre_CSRMatrixData(A_boundary); } aux = hypre_CTAlloc(HYPRE_Real, max_domain_size, HYPRE_MEMORY_HOST); hypre_ParVectorCopy(rhs_vector, Vtemp); hypre_ParCSRMatrixMatvec(-1.0, par_A, par_x, 1.0, Vtemp); if (comm_pkg) { num_sends = hypre_ParCSRCommPkgNumSends(comm_pkg); send_map_starts = hypre_ParCSRCommPkgSendMapStarts(comm_pkg); send_map_elmts = hypre_ParCSRCommPkgSendMapElmts(comm_pkg); buf_data = hypre_CTAlloc(HYPRE_Real, send_map_starts[num_sends], HYPRE_MEMORY_HOST); x_ext = hypre_CTAlloc(HYPRE_Real, num_cols_offd, HYPRE_MEMORY_HOST); x_ext_old = hypre_CTAlloc(HYPRE_Real, num_cols_offd, HYPRE_MEMORY_HOST); rhs_ext = hypre_CTAlloc(HYPRE_Real, num_cols_offd, HYPRE_MEMORY_HOST); index = 0; for (i = 0; i < num_sends; i++) { for (j = send_map_starts[i]; j < send_map_starts[i + 1]; j++) { buf_data[index++] = vtemp_data[send_map_elmts[j]]; } } comm_handle = hypre_ParCSRCommHandleCreate(1, comm_pkg, buf_data, rhs_ext); hypre_ParCSRCommHandleDestroy(comm_handle); comm_handle = NULL; index = 0; for (i = 0; i < num_sends; i++) { for (j = send_map_starts[i]; j < send_map_starts[i + 1]; j++) { buf_data[index++] = x[send_map_elmts[j]]; } } comm_handle = hypre_ParCSRCommHandleCreate(1, comm_pkg, buf_data, x_ext); hypre_ParCSRCommHandleDestroy(comm_handle); comm_handle = NULL; } /* correction of residual for exterior points to be updated locally */ for (i = 0; i < num_cols_offd; i++) { x_ext_old[i] = x_ext[i]; for (j = A_boundary_i[i]; j < A_boundary_i[i + 1]; j++) { k_loc = A_boundary_j[j]; if (k_loc < num_variables) { rhs_ext[i] += A_boundary_data[j] * x[k_loc]; } else { rhs_ext[i] += A_boundary_data[j] * x_ext[k_loc - num_variables]; } } } /* forward solve: ----------------------------------------------- */ matrix_size_counter = 0; for (i = 0; i < num_domains; i++) { matrix_size = i_domain_dof[i + 1] - i_domain_dof[i]; /* compute residual: ---------------------------------------- */ jj = 0; for (j = i_domain_dof[i]; j < i_domain_dof[i + 1]; j++) { j_loc = j_domain_dof[j]; if (j_loc < num_variables) { aux[jj] = rhs[j_loc]; for (k = A_diag_i[j_loc]; k < A_diag_i[j_loc + 1]; k++) { aux[jj] -= A_diag_data[k] * x[A_diag_j[k]]; } for (k = A_offd_i[j_loc]; k < A_offd_i[j_loc + 1]; k++) { aux[jj] -= A_offd_data[k] * x_ext[A_offd_j[k]]; } } else { j_loc -= num_variables; aux[jj] = rhs_ext[j_loc]; for (k = A_boundary_i[j_loc]; k < A_boundary_i[j_loc + 1]; k++) { k_loc = A_boundary_j[k]; if (k_loc < num_variables) { aux[jj] -= A_boundary_data[k] * x[k_loc]; } else { aux[jj] -= A_boundary_data[k] * x_ext[k_loc - num_variables]; } } } jj++; } /* solve for correction: ------------------------------------- */ if (use_nonsymm) { hypre_dgetrs(&uplo, &matrix_size, &one, &domain_matrixinverse[matrix_size_counter], &matrix_size, &pivots[piv_counter], aux, &matrix_size, &ierr); } else { hypre_dpotrs(&uplo, &matrix_size, &one, &domain_matrixinverse[matrix_size_counter], &matrix_size, aux, &matrix_size, &ierr); } if (ierr) { hypre_error(HYPRE_ERROR_GENERIC); } jj = 0; for (j = i_domain_dof[i]; j < i_domain_dof[i + 1]; j++) { j_loc = j_domain_dof[j]; if (j_loc < num_variables) { x[j_loc] += relax_wt * aux[jj++]; } else { x_ext[j_loc - num_variables] += relax_wt * aux[jj++]; } } matrix_size_counter += matrix_size * matrix_size; piv_counter += matrix_size; } /* for (i=0; i < num_cols_offd; i++) x_ext[i] -= x_ext_old[i]; if (comm_pkg) { comm_handle=hypre_ParCSRCommHandleCreate (2,comm_pkg,x_ext,buf_data); hypre_ParCSRCommHandleDestroy(comm_handle); comm_handle = NULL; index = 0; for (i=0; i < num_sends; i++) { for (j = send_map_starts[i]; j < send_map_starts[i+1]; j++) x[send_map_elmts[j]] += buf_data[index++]; } } for (i=0; i < num_variables; i++) x[i] *= scale[i]; hypre_ParVectorCopy(rhs_vector,Vtemp); hypre_ParCSRMatrixMatvec(-1.0,par_A,par_x,1.0,Vtemp); if (comm_pkg) { index = 0; for (i=0; i < num_sends; i++) { for (j = send_map_starts[i]; j < send_map_starts[i+1]; j++) buf_data[index++] = vtemp_data[send_map_elmts[j]]; } comm_handle = hypre_ParCSRCommHandleCreate(1,comm_pkg,buf_data, rhs_ext); hypre_ParCSRCommHandleDestroy(comm_handle); comm_handle = NULL; index = 0; for (i=0; i < num_sends; i++) { for (j = send_map_starts[i]; j < send_map_starts[i+1]; j++) buf_data[index++] = x[send_map_elmts[j]]; } comm_handle = hypre_ParCSRCommHandleCreate(1,comm_pkg,buf_data,x_ext); hypre_ParCSRCommHandleDestroy(comm_handle); comm_handle = NULL; } */ /* correction of residual for exterior points to be updated locally */ /* for (i=0; i < num_cols_offd; i++) { x_ext_old[i] = x_ext[i]; for (j = A_boundary_i[i]; j < A_boundary_i[i+1]; j++) { k_loc = A_boundary_j[j]; if (k_loc < num_variables) rhs_ext[i] += A_boundary_i[k]*x[k_loc]; else rhs_ext[i] += A_boundary_i[k]*x_ext[k_loc-num_variables]; } } */ /* backward solve: ------------------------------------------------ */ for (i = num_domains - 1; i > -1; i--) { matrix_size = i_domain_dof[i + 1] - i_domain_dof[i]; matrix_size_counter -= matrix_size * matrix_size; piv_counter -= matrix_size; /* compute residual: ---------------------------------------- */ jj = 0; for (j = i_domain_dof[i]; j < i_domain_dof[i + 1]; j++) { j_loc = j_domain_dof[j]; if (j_loc < num_variables) { aux[jj] = rhs[j_loc]; for (k = A_diag_i[j_loc]; k < A_diag_i[j_loc + 1]; k++) { aux[jj] -= A_diag_data[k] * x[A_diag_j[k]]; } for (k = A_offd_i[j_loc]; k < A_offd_i[j_loc + 1]; k++) { aux[jj] -= A_offd_data[k] * x_ext[A_offd_j[k]]; } } else { j_loc -= num_variables; aux[jj] = rhs_ext[j_loc]; for (k = A_boundary_i[j_loc]; k < A_boundary_i[j_loc + 1]; k++) { k_loc = A_boundary_j[k]; if (k_loc < num_variables) { aux[jj] -= A_boundary_data[k] * x[k_loc]; } else { aux[jj] -= A_boundary_data[k] * x_ext[k_loc - num_variables]; } } } jj++; } /* solve for correction: ------------------------------------- */ if (use_nonsymm) { hypre_dgetrs(&uplo, &matrix_size, &one, &domain_matrixinverse[matrix_size_counter], &matrix_size, &pivots[piv_counter], aux, &matrix_size, &ierr); } else { hypre_dpotrs(&uplo, &matrix_size, &one, &domain_matrixinverse[matrix_size_counter], &matrix_size, aux, &matrix_size, &ierr); } if (ierr) { hypre_error(HYPRE_ERROR_GENERIC); } jj = 0; for (j = i_domain_dof[i]; j < i_domain_dof[i + 1]; j++) { j_loc = j_domain_dof[j]; if (j_loc < num_variables) { x[j_loc] += relax_wt * aux[jj++]; } else { x_ext[j_loc - num_variables] += relax_wt * aux[jj++]; } } } for (i = 0; i < num_cols_offd; i++) { x_ext[i] -= x_ext_old[i]; } if (comm_pkg) { comm_handle = hypre_ParCSRCommHandleCreate(2, comm_pkg, x_ext, buf_data); hypre_ParCSRCommHandleDestroy(comm_handle); comm_handle = NULL; index = 0; for (i = 0; i < num_sends; i++) { for (j = send_map_starts[i]; j < send_map_starts[i + 1]; j++) { x[send_map_elmts[j]] += buf_data[index++]; } } hypre_TFree(buf_data, HYPRE_MEMORY_HOST); hypre_TFree(x_ext, HYPRE_MEMORY_HOST); hypre_TFree(x_ext_old, HYPRE_MEMORY_HOST); hypre_TFree(rhs_ext, HYPRE_MEMORY_HOST); } for (i = 0; i < num_variables; i++) { x[i] *= scale[i]; } hypre_TFree(aux, HYPRE_MEMORY_HOST); return hypre_error_flag; } HYPRE_Int hypre_MPSchwarzSolve(hypre_ParCSRMatrix *par_A, hypre_Vector *rhs_vector, hypre_CSRMatrix *domain_structure, hypre_ParVector *par_x, HYPRE_Real relax_wt, hypre_Vector *aux_vector, HYPRE_Int *pivots, HYPRE_Int use_nonsymm) { HYPRE_Int ierr = 0; /* HYPRE_Int num_dofs; */ HYPRE_Int *i_dof_dof; HYPRE_Int *j_dof_dof; HYPRE_Real *a_dof_dof; HYPRE_Real *x; hypre_Vector *rhs; HYPRE_Real *aux; hypre_CSRMatrix *A; hypre_Vector *x_vector; MPI_Comm comm = hypre_ParCSRMatrixComm(par_A); HYPRE_Int num_domains = hypre_CSRMatrixNumRows(domain_structure); HYPRE_Int *i_domain_dof = hypre_CSRMatrixI(domain_structure); HYPRE_Int *j_domain_dof = hypre_CSRMatrixJ(domain_structure); HYPRE_Real *domain_matrixinverse = hypre_CSRMatrixData(domain_structure); HYPRE_Int piv_counter = 0; HYPRE_Int one = 1; char uplo = 'L'; HYPRE_Int jj, i, j, k; /*, j_loc, k_loc;*/ HYPRE_Int matrix_size, matrix_size_counter = 0; HYPRE_Int num_procs; hypre_MPI_Comm_size(comm, &num_procs); /* initiate: ----------------------------------------------- */ /* num_dofs = hypre_CSRMatrixNumRows(A); */ x_vector = hypre_ParVectorLocalVector(par_x); A = hypre_ParCSRMatrixDiag(par_A); i_dof_dof = hypre_CSRMatrixI(A); j_dof_dof = hypre_CSRMatrixJ(A); a_dof_dof = hypre_CSRMatrixData(A); x = hypre_VectorData(x_vector); aux = hypre_VectorData(aux_vector); /* for (i=0; i < num_dofs; i++) x[i] = 0.e0; */ if (use_nonsymm) { uplo = 'N'; } if (num_procs > 1) { hypre_parCorrRes(par_A, par_x, rhs_vector, &rhs); } else { rhs = rhs_vector; } /* forward solve: ----------------------------------------------- */ matrix_size_counter = 0; for (i = 0; i < num_domains; i++) { matrix_size = i_domain_dof[i + 1] - i_domain_dof[i]; /* compute residual: ---------------------------------------- */ jj = 0; for (j = i_domain_dof[i]; j < i_domain_dof[i + 1]; j++) { aux[jj] = hypre_VectorData(rhs)[j_domain_dof[j]]; for (k = i_dof_dof[j_domain_dof[j]]; k < i_dof_dof[j_domain_dof[j] + 1]; k++) { aux[jj] -= a_dof_dof[k] * x[j_dof_dof[k]]; } jj++; } /* solve for correction: ------------------------------------- */ if (use_nonsymm) { hypre_dgetrs(&uplo, &matrix_size, &one, &domain_matrixinverse[matrix_size_counter], &matrix_size, &pivots[piv_counter], aux, &matrix_size, &ierr); } else { hypre_dpotrs(&uplo, &matrix_size, &one, &domain_matrixinverse[matrix_size_counter], &matrix_size, aux, &matrix_size, &ierr); } if (ierr) { hypre_error(HYPRE_ERROR_GENERIC); } jj = 0; for (j = i_domain_dof[i]; j < i_domain_dof[i + 1]; j++) { x[j_domain_dof[j]] += relax_wt * aux[jj++]; } matrix_size_counter += matrix_size * matrix_size; piv_counter += matrix_size; } /* backward solve: ------------------------------------------------ */ for (i = num_domains - 1; i > -1; i--) { matrix_size = i_domain_dof[i + 1] - i_domain_dof[i]; matrix_size_counter -= matrix_size * matrix_size; piv_counter -= matrix_size; /* compute residual: ---------------------------------------- */ jj = 0; for (j = i_domain_dof[i]; j < i_domain_dof[i + 1]; j++) { aux[jj] = hypre_VectorData(rhs)[j_domain_dof[j]]; for (k = i_dof_dof[j_domain_dof[j]]; k < i_dof_dof[j_domain_dof[j] + 1]; k++) { aux[jj] -= a_dof_dof[k] * x[j_dof_dof[k]]; } jj++; } /* solve for correction: ------------------------------------- */ if (use_nonsymm) { hypre_dgetrs(&uplo, &matrix_size, &one, &domain_matrixinverse[matrix_size_counter], &matrix_size, &pivots[piv_counter], aux, &matrix_size, &ierr); } else { hypre_dpotrs(&uplo, &matrix_size, &one, &domain_matrixinverse[matrix_size_counter], &matrix_size, aux, &matrix_size, &ierr); } if (ierr) { hypre_error(HYPRE_ERROR_GENERIC); } jj = 0; for (j = i_domain_dof[i]; j < i_domain_dof[i + 1]; j++) { x[j_domain_dof[j]] += relax_wt * aux[jj++]; } } if (num_procs > 1) { hypre_SeqVectorDestroy(rhs); } return hypre_error_flag; } HYPRE_Int hypre_MPSchwarzCFSolve(hypre_ParCSRMatrix *par_A, hypre_Vector *rhs_vector, hypre_CSRMatrix *domain_structure, hypre_ParVector *par_x, HYPRE_Real relax_wt, hypre_Vector *aux_vector, HYPRE_Int *CF_marker, HYPRE_Int rlx_pt, HYPRE_Int *pivots, HYPRE_Int use_nonsymm) { HYPRE_Int ierr = 0; /* HYPRE_Int num_dofs; */ HYPRE_Int *i_dof_dof; HYPRE_Int *j_dof_dof; HYPRE_Real *a_dof_dof; HYPRE_Real *x; hypre_Vector *rhs; HYPRE_Real *aux; hypre_CSRMatrix *A; hypre_Vector *x_vector; MPI_Comm comm = hypre_ParCSRMatrixComm(par_A); HYPRE_Int num_domains = hypre_CSRMatrixNumRows(domain_structure); HYPRE_Int *i_domain_dof = hypre_CSRMatrixI(domain_structure); HYPRE_Int *j_domain_dof = hypre_CSRMatrixJ(domain_structure); HYPRE_Real *domain_matrixinverse = hypre_CSRMatrixData(domain_structure); HYPRE_Int piv_counter = 0; HYPRE_Int one = 1; char uplo = 'L'; HYPRE_Int jj, i, j, k; /*, j_loc, k_loc;*/ HYPRE_Int matrix_size, matrix_size_counter = 0; HYPRE_Int num_procs; hypre_MPI_Comm_size(comm, &num_procs); /* initiate: ----------------------------------------------- */ /* num_dofs = hypre_CSRMatrixNumRows(A); */ x_vector = hypre_ParVectorLocalVector(par_x); A = hypre_ParCSRMatrixDiag(par_A); i_dof_dof = hypre_CSRMatrixI(A); j_dof_dof = hypre_CSRMatrixJ(A); a_dof_dof = hypre_CSRMatrixData(A); x = hypre_VectorData(x_vector); aux = hypre_VectorData(aux_vector); /* for (i=0; i < num_dofs; i++) x[i] = 0.e0; */ if (use_nonsymm) { uplo = 'N'; } if (num_procs > 1) { hypre_parCorrRes(par_A, par_x, rhs_vector, &rhs); } else { rhs = rhs_vector; } /* forward solve: ----------------------------------------------- */ matrix_size_counter = 0; for (i = 0; i < num_domains; i++) { if (CF_marker[i] == rlx_pt) { matrix_size = i_domain_dof[i + 1] - i_domain_dof[i]; /* compute residual: ---------------------------------------- */ jj = 0; for (j = i_domain_dof[i]; j < i_domain_dof[i + 1]; j++) { aux[jj] = hypre_VectorData(rhs)[j_domain_dof[j]]; if (CF_marker[j_domain_dof[j]] == rlx_pt) { for (k = i_dof_dof[j_domain_dof[j]]; k < i_dof_dof[j_domain_dof[j] + 1]; k++) { aux[jj] -= a_dof_dof[k] * x[j_dof_dof[k]]; } } jj++; } /* solve for correction: ------------------------------------- */ if (use_nonsymm) { hypre_dgetrs(&uplo, &matrix_size, &one, &domain_matrixinverse[matrix_size_counter], &matrix_size, &pivots[piv_counter], aux, &matrix_size, &ierr); } else { hypre_dpotrs(&uplo, &matrix_size, &one, &domain_matrixinverse[matrix_size_counter], &matrix_size, aux, &matrix_size, &ierr); } if (ierr) { hypre_error(HYPRE_ERROR_GENERIC); } jj = 0; for (j = i_domain_dof[i]; j < i_domain_dof[i + 1]; j++) { x[j_domain_dof[j]] += relax_wt * aux[jj++]; } matrix_size_counter += matrix_size * matrix_size; piv_counter += matrix_size; } } /* backward solve: ------------------------------------------------ */ for (i = num_domains - 1; i > -1; i--) { if (CF_marker[i] == rlx_pt) { matrix_size = i_domain_dof[i + 1] - i_domain_dof[i]; matrix_size_counter -= matrix_size * matrix_size; piv_counter -= matrix_size; /* compute residual: ---------------------------------------- */ jj = 0; for (j = i_domain_dof[i]; j < i_domain_dof[i + 1]; j++) { aux[jj] = hypre_VectorData(rhs)[j_domain_dof[j]]; if (CF_marker[j_domain_dof[j]] == rlx_pt) { for (k = i_dof_dof[j_domain_dof[j]]; k < i_dof_dof[j_domain_dof[j] + 1]; k++) { aux[jj] -= a_dof_dof[k] * x[j_dof_dof[k]]; } } jj++; } /* solve for correction: ------------------------------------- */ if (use_nonsymm) { hypre_dgetrs(&uplo, &matrix_size, &one, &domain_matrixinverse[matrix_size_counter], &matrix_size, &pivots[piv_counter], aux, &matrix_size, &ierr); } else { hypre_dpotrs(&uplo, &matrix_size, &one, &domain_matrixinverse[matrix_size_counter], &matrix_size, aux, &matrix_size, &ierr); } if (ierr) { hypre_error(HYPRE_ERROR_GENERIC); } jj = 0; for (j = i_domain_dof[i]; j < i_domain_dof[i + 1]; j++) { x[j_domain_dof[j]] += relax_wt * aux[jj++]; } } } if (num_procs > 1) { hypre_SeqVectorDestroy(rhs); } return hypre_error_flag; } HYPRE_Int hypre_MPSchwarzFWSolve(hypre_ParCSRMatrix *par_A, hypre_Vector *rhs_vector, hypre_CSRMatrix *domain_structure, hypre_ParVector *par_x, HYPRE_Real relax_wt, hypre_Vector *aux_vector, HYPRE_Int *pivots, HYPRE_Int use_nonsymm) { HYPRE_Int ierr = 0; /* HYPRE_Int num_dofs; */ HYPRE_Int *i_dof_dof; HYPRE_Int *j_dof_dof; HYPRE_Real *a_dof_dof; HYPRE_Real *x; hypre_Vector *rhs; HYPRE_Real *aux; hypre_CSRMatrix *A; hypre_Vector *x_vector; MPI_Comm comm = hypre_ParCSRMatrixComm(par_A); HYPRE_Int num_domains = hypre_CSRMatrixNumRows(domain_structure); HYPRE_Int *i_domain_dof = hypre_CSRMatrixI(domain_structure); HYPRE_Int *j_domain_dof = hypre_CSRMatrixJ(domain_structure); HYPRE_Real *domain_matrixinverse = hypre_CSRMatrixData(domain_structure); HYPRE_Int piv_counter = 0; HYPRE_Int one = 1; char uplo = 'L'; HYPRE_Int jj, i, j, k; /*, j_loc, k_loc;*/ HYPRE_Int matrix_size, matrix_size_counter = 0; HYPRE_Int num_procs; hypre_MPI_Comm_size(comm, &num_procs); /* initiate: ----------------------------------------------- */ /* num_dofs = hypre_CSRMatrixNumRows(A); */ x_vector = hypre_ParVectorLocalVector(par_x); A = hypre_ParCSRMatrixDiag(par_A); i_dof_dof = hypre_CSRMatrixI(A); j_dof_dof = hypre_CSRMatrixJ(A); a_dof_dof = hypre_CSRMatrixData(A); x = hypre_VectorData(x_vector); aux = hypre_VectorData(aux_vector); /* for (i=0; i < num_dofs; i++) x[i] = 0.e0; */ if (num_procs > 1) { hypre_parCorrRes(par_A, par_x, rhs_vector, &rhs); } else { rhs = rhs_vector; } /* forward solve: ----------------------------------------------- */ matrix_size_counter = 0; for (i = 0; i < num_domains; i++) { matrix_size = i_domain_dof[i + 1] - i_domain_dof[i]; /* compute residual: ---------------------------------------- */ jj = 0; for (j = i_domain_dof[i]; j < i_domain_dof[i + 1]; j++) { aux[jj] = hypre_VectorData(rhs)[j_domain_dof[j]]; for (k = i_dof_dof[j_domain_dof[j]]; k < i_dof_dof[j_domain_dof[j] + 1]; k++) { aux[jj] -= a_dof_dof[k] * x[j_dof_dof[k]]; } jj++; } /* solve for correction: ------------------------------------- */ if (use_nonsymm) { hypre_dgetrs(&uplo, &matrix_size, &one, &domain_matrixinverse[matrix_size_counter], &matrix_size, &pivots[piv_counter], aux, &matrix_size, &ierr); } else { hypre_dpotrs(&uplo, &matrix_size, &one, &domain_matrixinverse[matrix_size_counter], &matrix_size, aux, &matrix_size, &ierr); } if (ierr) { hypre_error(HYPRE_ERROR_GENERIC); } jj = 0; for (j = i_domain_dof[i]; j < i_domain_dof[i + 1]; j++) { x[j_domain_dof[j]] += relax_wt * aux[jj++]; } matrix_size_counter += matrix_size * matrix_size; piv_counter += matrix_size; } if (num_procs > 1) { hypre_SeqVectorDestroy(rhs); } return hypre_error_flag; } HYPRE_Int hypre_MPSchwarzCFFWSolve(hypre_ParCSRMatrix *par_A, hypre_Vector *rhs_vector, hypre_CSRMatrix *domain_structure, hypre_ParVector *par_x, HYPRE_Real relax_wt, hypre_Vector *aux_vector, HYPRE_Int *CF_marker, HYPRE_Int rlx_pt, HYPRE_Int *pivots, HYPRE_Int use_nonsymm) { HYPRE_Int ierr = 0; /* HYPRE_Int num_dofs; */ HYPRE_Int *i_dof_dof; HYPRE_Int *j_dof_dof; HYPRE_Real *a_dof_dof; HYPRE_Real *x; hypre_Vector *rhs; HYPRE_Real *aux; hypre_CSRMatrix *A; hypre_Vector *x_vector; MPI_Comm comm = hypre_ParCSRMatrixComm(par_A); HYPRE_Int num_domains = hypre_CSRMatrixNumRows(domain_structure); HYPRE_Int *i_domain_dof = hypre_CSRMatrixI(domain_structure); HYPRE_Int *j_domain_dof = hypre_CSRMatrixJ(domain_structure); HYPRE_Real *domain_matrixinverse = hypre_CSRMatrixData(domain_structure); HYPRE_Int piv_counter = 0; HYPRE_Int one = 1; char uplo = 'L'; HYPRE_Int jj, i, j, k; /*, j_loc, k_loc;*/ HYPRE_Int matrix_size, matrix_size_counter = 0; HYPRE_Int num_procs; hypre_MPI_Comm_size(comm, &num_procs); /* initiate: ----------------------------------------------- */ /* num_dofs = hypre_CSRMatrixNumRows(A); */ x_vector = hypre_ParVectorLocalVector(par_x); A = hypre_ParCSRMatrixDiag(par_A); i_dof_dof = hypre_CSRMatrixI(A); j_dof_dof = hypre_CSRMatrixJ(A); a_dof_dof = hypre_CSRMatrixData(A); x = hypre_VectorData(x_vector); aux = hypre_VectorData(aux_vector); /* for (i=0; i < num_dofs; i++) x[i] = 0.e0; */ if (use_nonsymm) { uplo = 'N'; } if (num_procs > 1) { hypre_parCorrRes(par_A, par_x, rhs_vector, &rhs); } else { rhs = rhs_vector; } /* forward solve: ----------------------------------------------- */ matrix_size_counter = 0; for (i = 0; i < num_domains; i++) { if (CF_marker[i] == rlx_pt) { matrix_size = i_domain_dof[i + 1] - i_domain_dof[i]; /* compute residual: ---------------------------------------- */ jj = 0; for (j = i_domain_dof[i]; j < i_domain_dof[i + 1]; j++) { aux[jj] = hypre_VectorData(rhs)[j_domain_dof[j]]; if (CF_marker[j_domain_dof[j]] == rlx_pt) { for (k = i_dof_dof[j_domain_dof[j]]; k < i_dof_dof[j_domain_dof[j] + 1]; k++) { aux[jj] -= a_dof_dof[k] * x[j_dof_dof[k]]; } } jj++; } /* solve for correction: ------------------------------------- */ if (use_nonsymm) { hypre_dgetrs(&uplo, &matrix_size, &one, &domain_matrixinverse[matrix_size_counter], &matrix_size, &pivots[piv_counter], aux, &matrix_size, &ierr); } else { hypre_dpotrs(&uplo, &matrix_size, &one, &domain_matrixinverse[matrix_size_counter], &matrix_size, aux, &matrix_size, &ierr); } if (ierr) { hypre_error(HYPRE_ERROR_GENERIC); } jj = 0; for (j = i_domain_dof[i]; j < i_domain_dof[i + 1]; j++) { x[j_domain_dof[j]] += relax_wt * aux[jj++]; } matrix_size_counter += matrix_size * matrix_size; piv_counter += matrix_size; } } if (num_procs > 1) { hypre_SeqVectorDestroy(rhs); } return hypre_error_flag; } HYPRE_Int transpose_matrix_create(HYPRE_Int **i_face_element_pointer, HYPRE_Int **j_face_element_pointer, HYPRE_Int *i_element_face, HYPRE_Int *j_element_face, HYPRE_Int num_elements, HYPRE_Int num_faces) { /* FILE *f; */ HYPRE_Int i, j; HYPRE_Int *i_face_element, *j_face_element; /* ====================================================================== first create face_element graph: ------------------------------------- ====================================================================== */ i_face_element = hypre_CTAlloc(HYPRE_Int, (num_faces + 1), HYPRE_MEMORY_HOST); j_face_element = hypre_TAlloc(HYPRE_Int, i_element_face[num_elements], HYPRE_MEMORY_HOST); for (i = 0; i < num_elements; i++) { for (j = i_element_face[i]; j < i_element_face[i + 1]; j++) { i_face_element[j_element_face[j]]++; } } i_face_element[num_faces] = i_element_face[num_elements]; for (i = num_faces - 1; i > -1; i--) { i_face_element[i] = i_face_element[i + 1] - i_face_element[i]; } for (i = 0; i < num_elements; i++) { for (j = i_element_face[i]; j < i_element_face[i + 1]; j++) { j_face_element[i_face_element[j_element_face[j]]] = i; i_face_element[j_element_face[j]]++; } } for (i = num_faces - 1; i > -1; i--) { i_face_element[i + 1] = i_face_element[i]; } i_face_element[0] = 0; /* hypre_printf("end building face--element graph: ++++++++++++++++++\n"); */ /* END building face_element graph; ================================ */ *i_face_element_pointer = i_face_element; *j_face_element_pointer = j_face_element; return 0; } HYPRE_Int matrix_matrix_product(HYPRE_Int **i_element_edge_pointer, HYPRE_Int **j_element_edge_pointer, HYPRE_Int *i_element_face, HYPRE_Int *j_element_face, HYPRE_Int *i_face_edge, HYPRE_Int *j_face_edge, HYPRE_Int num_elements, HYPRE_Int num_faces, HYPRE_Int num_edges) { HYPRE_UNUSED_VAR(num_faces); /* FILE *f; */ HYPRE_Int i, j, k, l, m; HYPRE_Int i_edge_on_local_list, i_edge_on_list; HYPRE_Int local_element_edge_counter = 0, element_edge_counter = 0; HYPRE_Int *j_local_element_edge; HYPRE_Int *i_element_edge, *j_element_edge; j_local_element_edge = hypre_TAlloc(HYPRE_Int, (num_edges + 1), HYPRE_MEMORY_HOST); i_element_edge = hypre_TAlloc(HYPRE_Int, (num_elements + 1), HYPRE_MEMORY_HOST); for (i = 0; i < num_elements + 1; i++) { i_element_edge[i] = 0; } for (i = 0; i < num_elements; i++) { local_element_edge_counter = 0; for (j = i_element_face[i]; j < i_element_face[i + 1]; j++) { k = j_element_face[j]; for (l = i_face_edge[k]; l < i_face_edge[k + 1]; l++) { /* element i and edge j_face_edge[l] are connected */ /* hypre_printf("element %d contains edge %d;\n", i, j_face_edge[l]); */ i_edge_on_local_list = -1; for (m = 0; m < local_element_edge_counter; m++) { if (j_local_element_edge[m] == j_face_edge[l]) { i_edge_on_local_list++; break; } } if (i_edge_on_local_list == -1) { i_element_edge[i]++; j_local_element_edge[local_element_edge_counter] = j_face_edge[l]; local_element_edge_counter++; } } } } hypre_TFree(j_local_element_edge, HYPRE_MEMORY_HOST); for (i = 0; i < num_elements; i++) { i_element_edge[i + 1] += i_element_edge[i]; } for (i = num_elements; i > 0; i--) { i_element_edge[i] = i_element_edge[i - 1]; } i_element_edge[0] = 0; j_element_edge = hypre_TAlloc(HYPRE_Int, i_element_edge[num_elements], HYPRE_MEMORY_HOST); /* fill--in the actual j_element_edge array: --------------------- */ element_edge_counter = 0; for (i = 0; i < num_elements; i++) { i_element_edge[i] = element_edge_counter; for (j = i_element_face[i]; j < i_element_face[i + 1]; j++) { for (k = i_face_edge[j_element_face[j]]; k < i_face_edge[j_element_face[j] + 1]; k++) { /* check if edge j_face_edge[k] is already on list ***/ i_edge_on_list = -1; for (l = i_element_edge[i]; l < element_edge_counter; l++) { if (j_element_edge[l] == j_face_edge[k]) { i_edge_on_list++; break; } } if (i_edge_on_list == -1) { if (element_edge_counter >= i_element_edge[num_elements]) { hypre_error_w_msg(HYPRE_ERROR_GENERIC, "error in j_element_edge size: \n"); break; } j_element_edge[element_edge_counter] = j_face_edge[k]; element_edge_counter++; } } } } i_element_edge[num_elements] = element_edge_counter; /*------------------------------------------------------------------ f = fopen("element_edge", "w"); for (i=0; i < num_elements; i++) { hypre_printf("\nelement: %d has edges:\n", i); for (j=i_element_edge[i]; j < i_element_edge[i+1]; j++) { hypre_printf("%d ", j_element_edge[j]); hypre_fprintf(f, "%d %d\n", i, j_element_edge[j]); } hypre_printf("\n"); } fclose(f); */ /* hypre_printf("end element_edge computation: ++++++++++++++++++++++++ \n");*/ *i_element_edge_pointer = i_element_edge; *j_element_edge_pointer = j_element_edge; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_AMGCreateDomainDof: *--------------------------------------------------------------------------*/ /***************************************************************************** * * Routine for constructing graph domain_dof with minimal overlap * and computing the respective matrix inverses to be * used in an overlapping Schwarz procedure (like smoother * in AMG); * *****************************************************************************/ HYPRE_Int hypre_AMGCreateDomainDof(hypre_CSRMatrix *A, HYPRE_Int domain_type, HYPRE_Int overlap, HYPRE_Int num_functions, HYPRE_Int *dof_func, hypre_CSRMatrix **domain_structure_pointer, HYPRE_Int **piv_pointer, HYPRE_Int use_nonsymm) { HYPRE_UNUSED_VAR(dof_func); HYPRE_Int *i_domain_dof, *j_domain_dof; HYPRE_Real *domain_matrixinverse; HYPRE_Int num_domains; hypre_CSRMatrix *domain_structure = NULL; HYPRE_Int *i_dof_dof = hypre_CSRMatrixI(A); HYPRE_Int *j_dof_dof = hypre_CSRMatrixJ(A); HYPRE_Real *a_dof_dof = hypre_CSRMatrixData(A); HYPRE_Int num_dofs = hypre_CSRMatrixNumRows(A); /* HYPRE_Int *i_dof_to_accept_weight; */ HYPRE_Int *i_dof_to_prefer_weight, *w_dof_dof, *i_dof_weight; HYPRE_Int *i_dof_to_aggregate, *i_aggregate_dof, *j_aggregate_dof; HYPRE_Int *i_dof_index; HYPRE_Int ierr = 0; HYPRE_Int i, j, k, l_loc, i_loc, j_loc; HYPRE_Int i_dof; HYPRE_Int *i_local_to_global; HYPRE_Int *i_global_to_local; HYPRE_Int local_dof_counter, max_local_dof_counter = 0; HYPRE_Int domain_dof_counter = 0, domain_matrixinverse_counter = 0; HYPRE_Int nf; HYPRE_Real *AE; HYPRE_Int piv_counter = 0; HYPRE_Int *ipiv; HYPRE_Int *piv = NULL; char uplo = 'L'; HYPRE_Int cnt; /* --------------------------------------------------------------------- */ /*=======================================================================*/ /* create artificial domains by agglomeration; */ /*=======================================================================*/ /*hypre_printf("----------- create artificials domain by agglomeration; ======\n"); */ if (num_dofs == 0) { *domain_structure_pointer = domain_structure; *piv_pointer = piv; return hypre_error_flag; } i_aggregate_dof = hypre_CTAlloc(HYPRE_Int, num_dofs + 1, HYPRE_MEMORY_HOST); j_aggregate_dof = hypre_CTAlloc(HYPRE_Int, num_dofs, HYPRE_MEMORY_HOST); if (domain_type == 2) { i_dof_to_prefer_weight = hypre_CTAlloc(HYPRE_Int, num_dofs, HYPRE_MEMORY_HOST); w_dof_dof = hypre_CTAlloc(HYPRE_Int, i_dof_dof[num_dofs], HYPRE_MEMORY_HOST); i_dof_weight = hypre_CTAlloc(HYPRE_Int, num_dofs, HYPRE_MEMORY_HOST); for (i = 0; i < num_dofs; i++) { for (j = i_dof_dof[i]; j < i_dof_dof[i + 1]; j++) { if (j_dof_dof[j] == i) { w_dof_dof[j] = 0; } else { w_dof_dof[j] = 1; } } } /*hypre_printf("end computing weights for agglomeration procedure: --------\n"); */ hypre_AMGeAgglomerate(i_aggregate_dof, j_aggregate_dof, i_dof_dof, j_dof_dof, w_dof_dof, i_dof_dof, j_dof_dof, i_dof_dof, j_dof_dof, i_dof_to_prefer_weight, i_dof_weight, num_dofs, num_dofs, &num_domains); hypre_TFree(i_dof_to_prefer_weight, HYPRE_MEMORY_HOST); hypre_TFree(i_dof_weight, HYPRE_MEMORY_HOST); hypre_TFree(w_dof_dof, HYPRE_MEMORY_HOST); } else { nf = (domain_type == 1) ? num_functions : 1; num_domains = num_dofs / nf; for (i = 0; i < num_domains + 1; i++) { i_aggregate_dof[i] = nf * i; } for (i = 0; i < num_dofs; i++) { j_aggregate_dof[i] = i; } } /*hypre_printf("num_dofs: %d, num_domains: %d\n", num_dofs, num_domains);*/ /* hypre_printf("========================================================\n"); hypre_printf("== artificial non--overlapping domains (aggregates): ===\n"); hypre_printf("========================================================\n"); for (i=0; i < num_domains; i++) { hypre_printf("\n aggregate %d:\n", i); for (j=i_aggregate_dof[i]; j < i_aggregate_dof[i+1]; j++) hypre_printf("%d, ", j_aggregate_dof[j]); hypre_printf("\n"); } */ /* make domains from aggregates: *********************************/ if (overlap == 1) { i_domain_dof = hypre_CTAlloc(HYPRE_Int, num_domains + 1, HYPRE_MEMORY_HOST); i_dof_index = hypre_CTAlloc(HYPRE_Int, num_dofs, HYPRE_MEMORY_HOST); for (i = 0; i < num_dofs; i++) { i_dof_index[i] = -1; } i_dof_to_aggregate = hypre_CTAlloc(HYPRE_Int, num_dofs, HYPRE_MEMORY_HOST); for (i = 0; i < num_domains; i++) { for (j = i_aggregate_dof[i]; j < i_aggregate_dof[i + 1]; j++) { i_dof_to_aggregate[j_aggregate_dof[j]] = i; } } domain_dof_counter = 0; for (i = 0; i < num_domains; i++) { i_domain_dof[i] = domain_dof_counter; for (j = i_aggregate_dof[i]; j < i_aggregate_dof[i + 1]; j++) { i_dof_index[j_aggregate_dof[j]] = -1; } for (j = i_aggregate_dof[i]; j < i_aggregate_dof[i + 1]; j++) { for (k = i_dof_dof[j_aggregate_dof[j]]; k < i_dof_dof[j_aggregate_dof[j] + 1]; k++) { if (i_dof_to_aggregate[j_dof_dof[k]] >= i && i_dof_index[j_dof_dof[k]] == -1) { i_dof_index[j_dof_dof[k]]++; domain_dof_counter++; } } } } i_domain_dof[num_domains] = domain_dof_counter; j_domain_dof = hypre_CTAlloc(HYPRE_Int, domain_dof_counter, HYPRE_MEMORY_HOST); for (i = 0; i < num_dofs; i++) { i_dof_index[i] = -1; } domain_dof_counter = 0; for (i = 0; i < num_domains; i++) { for (j = i_aggregate_dof[i]; j < i_aggregate_dof[i + 1]; j++) { i_dof_index[j_aggregate_dof[j]] = -1; } for (j = i_aggregate_dof[i]; j < i_aggregate_dof[i + 1]; j++) { for (k = i_dof_dof[j_aggregate_dof[j]]; k < i_dof_dof[j_aggregate_dof[j] + 1]; k++) { if (i_dof_to_aggregate[j_dof_dof[k]] >= i && i_dof_index[j_dof_dof[k]] == -1) { i_dof_index[j_dof_dof[k]]++; j_domain_dof[domain_dof_counter] = j_dof_dof[k]; domain_dof_counter++; } } } } hypre_TFree(i_aggregate_dof, HYPRE_MEMORY_HOST); hypre_TFree(j_aggregate_dof, HYPRE_MEMORY_HOST); hypre_TFree(i_dof_to_aggregate, HYPRE_MEMORY_HOST); hypre_TFree(i_dof_index, HYPRE_MEMORY_HOST); } else if (overlap == 2) { i_domain_dof = hypre_CTAlloc(HYPRE_Int, num_domains + 1, HYPRE_MEMORY_HOST); i_dof_index = hypre_CTAlloc(HYPRE_Int, num_dofs, HYPRE_MEMORY_HOST); for (i = 0; i < num_dofs; i++) { i_dof_index[i] = -1; } domain_dof_counter = 0; for (i = 0; i < num_domains; i++) { i_domain_dof[i] = domain_dof_counter; for (j = i_aggregate_dof[i]; j < i_aggregate_dof[i + 1]; j++) { for (k = i_dof_dof[j_aggregate_dof[j]]; k < i_dof_dof[j_aggregate_dof[j] + 1]; k++) { if (i_dof_index[j_dof_dof[k]] == -1) { i_dof_index[j_dof_dof[k]]++; domain_dof_counter++; } } } for (j = i_aggregate_dof[i]; j < i_aggregate_dof[i + 1]; j++) { for (k = i_dof_dof[j_aggregate_dof[j]]; k < i_dof_dof[j_aggregate_dof[j] + 1]; k++) { i_dof_index[j_dof_dof[k]] = -1; } } } for (i = 0; i < num_dofs; i++) { i_dof_index[i] = -1; } i_domain_dof[num_domains] = domain_dof_counter; j_domain_dof = hypre_CTAlloc(HYPRE_Int, domain_dof_counter, HYPRE_MEMORY_HOST); domain_dof_counter = 0; for (i = 0; i < num_domains; i++) { for (j = i_aggregate_dof[i]; j < i_aggregate_dof[i + 1]; j++) { for (k = i_dof_dof[j_aggregate_dof[j]]; k < i_dof_dof[j_aggregate_dof[j] + 1]; k++) { if ( i_dof_index[j_dof_dof[k]] == -1) { i_dof_index[j_dof_dof[k]]++; j_domain_dof[domain_dof_counter] = j_dof_dof[k]; domain_dof_counter++; } } } for (j = i_aggregate_dof[i]; j < i_aggregate_dof[i + 1]; j++) { for (k = i_dof_dof[j_aggregate_dof[j]]; k < i_dof_dof[j_aggregate_dof[j] + 1]; k++) { i_dof_index[j_dof_dof[k]] = -1; } } } hypre_TFree(i_aggregate_dof, HYPRE_MEMORY_HOST); hypre_TFree(j_aggregate_dof, HYPRE_MEMORY_HOST); hypre_TFree(i_dof_index, HYPRE_MEMORY_HOST); } else { i_domain_dof = i_aggregate_dof; j_domain_dof = j_aggregate_dof; } /*hypre_printf("END domain_dof computations: =================================\n"); */ domain_matrixinverse_counter = 0; local_dof_counter = 0; piv_counter = 0; for (i = 0; i < num_domains; i++) { local_dof_counter = i_domain_dof[i + 1] - i_domain_dof[i]; domain_matrixinverse_counter += local_dof_counter * local_dof_counter; piv_counter += local_dof_counter; if (local_dof_counter > max_local_dof_counter) { max_local_dof_counter = local_dof_counter; } } domain_matrixinverse = hypre_CTAlloc(HYPRE_Real, domain_matrixinverse_counter, HYPRE_MEMORY_HOST); if (use_nonsymm) { piv = hypre_CTAlloc(HYPRE_Int, piv_counter, HYPRE_MEMORY_HOST); } i_local_to_global = hypre_CTAlloc(HYPRE_Int, max_local_dof_counter, HYPRE_MEMORY_HOST); i_global_to_local = hypre_CTAlloc(HYPRE_Int, num_dofs, HYPRE_MEMORY_HOST); for (i = 0; i < num_dofs; i++) { i_global_to_local[i] = -1; } piv_counter = 0; domain_matrixinverse_counter = 0; for (i = 0; i < num_domains; i++) { local_dof_counter = 0; for (j = i_domain_dof[i]; j < i_domain_dof[i + 1]; j++) { i_global_to_local[j_domain_dof[j]] = local_dof_counter; i_local_to_global[local_dof_counter] = j_domain_dof[j]; local_dof_counter++; } /* get local matrix in AE: ======================================== */ cnt = 0; AE = &domain_matrixinverse[domain_matrixinverse_counter]; ipiv = &piv[piv_counter]; for (i_loc = 0; i_loc < local_dof_counter; i_loc++) { for (j_loc = 0; j_loc < local_dof_counter; j_loc++) { AE[cnt++] = 0.e0; } } for (i_loc = 0; i_loc < local_dof_counter; i_loc++) { i_dof = i_local_to_global[i_loc]; for (j = i_dof_dof[i_dof]; j < i_dof_dof[i_dof + 1]; j++) { j_loc = i_global_to_local[j_dof_dof[j]]; if (j_loc >= 0) { AE[i_loc + j_loc * local_dof_counter] = a_dof_dof[j]; } } } if (use_nonsymm) { hypre_dgetrf(&local_dof_counter, &local_dof_counter, AE, &local_dof_counter, ipiv, &ierr); piv_counter += local_dof_counter; } else { hypre_dpotrf(&uplo, &local_dof_counter, AE, &local_dof_counter, &ierr); } domain_matrixinverse_counter += local_dof_counter * local_dof_counter; for (l_loc = 0; l_loc < local_dof_counter; l_loc++) { i_global_to_local[i_local_to_global[l_loc]] = -1; } } hypre_TFree(i_local_to_global, HYPRE_MEMORY_HOST); hypre_TFree(i_global_to_local, HYPRE_MEMORY_HOST); domain_structure = hypre_CSRMatrixCreate(num_domains, max_local_dof_counter, i_domain_dof[num_domains]); hypre_CSRMatrixMemoryLocation(domain_structure) = HYPRE_MEMORY_HOST; hypre_CSRMatrixI(domain_structure) = i_domain_dof; hypre_CSRMatrixJ(domain_structure) = j_domain_dof; hypre_CSRMatrixData(domain_structure) = domain_matrixinverse; *domain_structure_pointer = domain_structure; *piv_pointer = piv; return hypre_error_flag; } /* unacceptable faces: i_face_to_prefer_weight[] = -1; ------------------*/ HYPRE_Int hypre_AMGeAgglomerate(HYPRE_Int *i_AE_element, HYPRE_Int *j_AE_element, HYPRE_Int *i_face_face, HYPRE_Int *j_face_face, HYPRE_Int *w_face_face, HYPRE_Int *i_face_element, HYPRE_Int *j_face_element, HYPRE_Int *i_element_face, HYPRE_Int *j_element_face, HYPRE_Int *i_face_to_prefer_weight, HYPRE_Int *i_face_weight, HYPRE_Int num_faces, HYPRE_Int num_elements, HYPRE_Int *num_AEs_pointer) { HYPRE_Int ierr = 0; HYPRE_Int i, j, k, l; HYPRE_Int face_to_eliminate; HYPRE_Int max_weight_old, max_weight; HYPRE_Int AE_counter = 0, AE_element_counter = 0; /* HYPRE_Int i_element_face_counter; */ HYPRE_Int *i_element_to_AE; HYPRE_Int *previous, *next, *first; HYPRE_Int head, tail, last; HYPRE_Int face_max_weight, face_local_max_weight, preferred_weight; HYPRE_Int weight, weight_max; max_weight = 1; for (i = 0; i < num_faces; i++) { weight = 1; for (j = i_face_face[i]; j < i_face_face[i + 1]; j++) { weight += w_face_face[j]; } if (max_weight < weight) { max_weight = weight; } } first = hypre_CTAlloc(HYPRE_Int, max_weight + 1, HYPRE_MEMORY_HOST); next = hypre_CTAlloc(HYPRE_Int, num_faces, HYPRE_MEMORY_HOST); previous = hypre_CTAlloc(HYPRE_Int, num_faces + 1, HYPRE_MEMORY_HOST); tail = num_faces; head = -1; for (i = 0; i < num_faces; i++) { next[i] = i + 1; previous[i] = i - 1; } last = num_faces - 1; previous[tail] = last; for (weight = 1; weight <= max_weight; weight++) { first[weight] = tail; } i_element_to_AE = hypre_CTAlloc(HYPRE_Int, num_elements, HYPRE_MEMORY_HOST); /*======================================================================= AGGLOMERATION PROCEDURE: ======================================================================= */ for (k = 0; k < num_elements; k++) { i_element_to_AE[k] = -1; } for (k = 0; k < num_faces; k++) { i_face_weight[k] = 1; } first[0] = 0; first[1] = 0; last = previous[tail]; weight_max = i_face_weight[last]; k = last; face_max_weight = -1; while (k != head) { if (i_face_to_prefer_weight[k] > -1) { face_max_weight = k; } if (face_max_weight > -1) { break; } k = previous[k]; } /* this will be used if the faces have been sorted: ***************** k = last; face_max_weight = -1; while (k != head) { if (i_face_to_prefer_weight[k] > -1) face_max_weight = k; if (face_max_weight > -1) { max_weight = i_face_weight[face_max_weight]; l = face_max_weight; while (previous[l] != head) { if (i_face_weight[previous[l]] < max_weight) break; else if (i_face_to_prefer_weight[previous[l]] > i_face_to_prefer_weight[face_max_weight]) { l = previous[l]; face_max_weight = l; } else l = previous[l]; } break; } l =previous[k]; weight = i_face_weight[k]; last = previous[tail]; if (last == head) weight_max = 0; else weight_max = i_face_weight[last]; ierr = hypre_remove_entry(weight, &weight_max, previous, next, first, &last, head, tail, k); k=l; } */ if (face_max_weight == -1) { hypre_error_w_msg(HYPRE_ERROR_GENERIC, "all faces are unacceptable, i.e., no faces to eliminate !\n"); *num_AEs_pointer = 1; i_AE_element[0] = 0; for (i = 0; i < num_elements; i++) { i_element_to_AE[i] = 0; j_AE_element[i] = i; } i_AE_element[1] = num_elements; return hypre_error_flag; } for (k = 0; k < num_faces; k++) { if (i_face_to_prefer_weight[k] > i_face_to_prefer_weight[face_max_weight]) { face_max_weight = k; } } max_weight = i_face_weight[face_max_weight]; AE_counter = 0; AE_element_counter = 0; i_AE_element[AE_counter] = AE_element_counter; max_weight_old = -1; face_local_max_weight = face_max_weight; eliminate_face: face_to_eliminate = face_local_max_weight; max_weight = i_face_weight[face_to_eliminate]; last = previous[tail]; weight_max = (last == head) ? 0 : i_face_weight[last]; ierr = hypre_remove_entry(max_weight, &weight_max, previous, next, first, &last, head, tail, face_to_eliminate); i_face_weight[face_to_eliminate] = 0; /*---------------------------------------------------------- * agglomeration step: * * put on AE_element -- list all elements * that share face "face_to_eliminate"; *----------------------------------------------------------*/ for (k = i_face_element[face_to_eliminate]; k < i_face_element[face_to_eliminate + 1]; k++) { /* check if element j_face_element[k] is already on the list: */ if (j_face_element[k] < num_elements) { if (i_element_to_AE[j_face_element[k]] == -1) { j_AE_element[AE_element_counter] = j_face_element[k]; i_element_to_AE[j_face_element[k]] = AE_counter; AE_element_counter++; } } } /* local update & search:==================================== */ for (j = i_face_face[face_to_eliminate]; j < i_face_face[face_to_eliminate + 1]; j++) { if (i_face_weight[j_face_face[j]] > 0) { weight = i_face_weight[j_face_face[j]]; last = previous[tail]; weight_max = (last == head) ? 0 : i_face_weight[last]; ierr = hypre_move_entry(weight, &weight_max, previous, next, first, &last, head, tail, j_face_face[j]); i_face_weight[j_face_face[j]] += w_face_face[j]; weight = i_face_weight[j_face_face[j]]; /* hypre_printf("update entry: %d\n", j_face_face[j]); */ last = previous[tail]; weight_max = (last == head) ? 0 : i_face_weight[last]; ierr = hypre_update_entry(weight, &weight_max, previous, next, first, &last, head, tail, j_face_face[j]); last = previous[tail]; if (last == head) { weight_max = 0; } else { weight_max = i_face_weight[last]; } } } /* find a face of the elements that have already been agglomerated with a maximal weight: ====================================== */ max_weight_old = max_weight; face_local_max_weight = -1; preferred_weight = -1; for (l = i_AE_element[AE_counter]; l < AE_element_counter; l++) { for (j = i_element_face[j_AE_element[l]]; j < i_element_face[j_AE_element[l] + 1]; j++) { i = j_element_face[j]; if (max_weight_old > 1 && i_face_weight[i] > 0 && i_face_to_prefer_weight[i] > -1) { if ( max_weight < i_face_weight[i]) { face_local_max_weight = i; max_weight = i_face_weight[i]; preferred_weight = i_face_to_prefer_weight[i]; } if ( max_weight == i_face_weight[i] && i_face_to_prefer_weight[i] > preferred_weight) { face_local_max_weight = i; preferred_weight = i_face_to_prefer_weight[i]; } } } } if (face_local_max_weight > -1) { goto eliminate_face; } /* ---------------------------------------------------------------- * eliminate and label with i_face_weight[ ] = -1 * "boundary faces of agglomerated elements"; * those faces will be preferred for the next coarse spaces * in case multiple coarse spaces are to be built; * ---------------------------------------------------------------*/ for (k = i_AE_element[AE_counter]; k < AE_element_counter; k++) { for (j = i_element_face[j_AE_element[k]]; j < i_element_face[j_AE_element[k] + 1]; j++) { if (i_face_weight[j_element_face[j]] > 0) { weight = i_face_weight[j_element_face[j]]; last = previous[tail]; if (last == head) { weight_max = 0; } else { weight_max = i_face_weight[last]; } ierr = hypre_remove_entry(weight, &weight_max, previous, next, first, &last, head, tail, j_element_face[j]); i_face_weight[j_element_face[j]] = -1; } } } if (AE_element_counter > i_AE_element[AE_counter]) { /* hypre_printf("completing agglomerated element: %d\n", AE_counter); */ AE_counter++; } i_AE_element[AE_counter] = AE_element_counter; /* find a face with maximal weight: ---------------------------*/ last = previous[tail]; if (last == head) { goto end_agglomerate; } weight_max = i_face_weight[last]; /* hypre_printf("global search: ======================================\n"); */ face_max_weight = -1; k = last; while (k != head) { if (i_face_to_prefer_weight[k] > -1) { face_max_weight = k; } if (face_max_weight > -1) { max_weight = i_face_weight[face_max_weight]; l = face_max_weight; while (previous[l] != head) { if (i_face_weight[previous[l]] < max_weight) { break; } else if (i_face_to_prefer_weight[previous[l]] > i_face_to_prefer_weight[face_max_weight]) { l = previous[l]; face_max_weight = l; } else { l = previous[l]; } } break; } l = previous[k]; /* remove face k: ---------------------------------------*/ weight = i_face_weight[k]; last = previous[tail]; weight_max = (last == head) ? 0 : i_face_weight[last]; ierr = hypre_remove_entry(weight, &weight_max, previous, next, first, &last, head, tail, k); /* i_face_weight[k] = -1; */ k = l; } if (face_max_weight == -1) { goto end_agglomerate; } max_weight = i_face_weight[face_max_weight]; face_local_max_weight = face_max_weight; goto eliminate_face; end_agglomerate: /* eliminate isolated elements: ----------------------------------*/ for (i = 0; i < num_elements; i++) { if (i_element_to_AE[i] == -1) { for (j = i_element_face[i]; j < i_element_face[i + 1] && i_element_to_AE[i] == -1; j++) { if (i_face_to_prefer_weight[j_element_face[j]] > -1) { for (k = i_face_element[j_element_face[j]]; k < i_face_element[j_element_face[j] + 1] && i_element_to_AE[i] == -1; k++) { if (i_element_to_AE[j_face_element[k]] != -1) { i_element_to_AE[i] = i_element_to_AE[j_face_element[k]]; } } } } } /* if (i_element_to_AE[i] == -1) { i_element_face_counter = 0; for (j=i_element_face[i]; j < i_element_face[i+1]; j++) if (i_face_to_prefer_weight[j_element_face[j]] > -1) i_element_face_counter++; if (i_element_face_counter == 1) { for (j=i_element_face[i]; j < i_element_face[i+1]; j++) if (i_face_to_prefer_weight[j_element_face[j]] > -1) for (k=i_face_element[j_element_face[j]]; k -1; i--) { i_AE_element[i] = i_AE_element[i + 1] - i_AE_element[i]; } for (i = 0; i < num_elements; i++) { j_AE_element[i_AE_element[i_element_to_AE[i]]] = i; i_AE_element[i_element_to_AE[i]]++; } for (i = AE_counter - 1; i > -1; i--) { i_AE_element[i + 1] = i_AE_element[i]; } i_AE_element[0] = 0; /*--------------------------------------------------------------------*/ for (i = 0; i < num_faces; i++) { if (i_face_to_prefer_weight[i] == -1) { i_face_weight[i] = -1; } } hypre_TFree(i_element_to_AE, HYPRE_MEMORY_HOST); hypre_TFree(previous, HYPRE_MEMORY_HOST); hypre_TFree(next, HYPRE_MEMORY_HOST); hypre_TFree(first, HYPRE_MEMORY_HOST); return ierr; } HYPRE_Int hypre_update_entry(HYPRE_Int weight, HYPRE_Int *weight_max, HYPRE_Int *previous, HYPRE_Int *next, HYPRE_Int *first, HYPRE_Int *last, HYPRE_Int head, HYPRE_Int tail, HYPRE_Int i) { HYPRE_UNUSED_VAR(last); HYPRE_Int weight0; if (previous[i] != head) { next[previous[i]] = next[i]; } previous[next[i]] = previous[i]; if (first[weight] == tail) { if (weight <= weight_max[0]) { hypre_printf("ERROR IN UPDATE_ENTRY: ===================\n"); hypre_printf("weight: %d, weight_max: %d\n", weight, weight_max[0]); return -1; } for (weight0 = weight_max[0] + 1; weight0 <= weight; weight0++) { first[weight0] = i; /* hypre_printf("create first[%d] = %d\n", weight0, i); */ } previous[i] = previous[tail]; next[i] = tail; if (previous[tail] > head) { next[previous[tail]] = i; } previous[tail] = i; } else /* first[weight] already exists: =====================*/ { previous[i] = previous[first[weight]]; next[i] = first[weight]; if (previous[first[weight]] != head) { next[previous[first[weight]]] = i; } previous[first[weight]] = i; for (weight0 = 1; weight0 <= weight; weight0++) { if (first[weight0] == first[weight]) { first[weight0] = i; } } } return 0; } HYPRE_Int hypre_remove_entry(HYPRE_Int weight, HYPRE_Int *weight_max, HYPRE_Int *previous, HYPRE_Int *next, HYPRE_Int *first, HYPRE_Int *last, HYPRE_Int head, HYPRE_Int tail, HYPRE_Int i) { HYPRE_UNUSED_VAR(weight); HYPRE_UNUSED_VAR(last); HYPRE_UNUSED_VAR(tail); HYPRE_Int weight0; if (previous[i] != head) { next[previous[i]] = next[i]; } previous[next[i]] = previous[i]; for (weight0 = 1; weight0 <= weight_max[0]; weight0++) { /* hypre_printf("first[%d}: %d\n", weight0, first[weight0]); */ if (first[weight0] == i) { first[weight0] = next[i]; /* hypre_printf("shift: first[%d]= %d to %d\n", weight0, i, next[i]); if (i == last[0]) hypre_printf("i= last[0]: %d\n", i); */ } } next[i] = i; previous[i] = i; return 0; } HYPRE_Int hypre_move_entry(HYPRE_Int weight, HYPRE_Int *weight_max, HYPRE_Int *previous, HYPRE_Int *next, HYPRE_Int *first, HYPRE_Int *last, HYPRE_Int head, HYPRE_Int tail, HYPRE_Int i) { HYPRE_UNUSED_VAR(weight); HYPRE_UNUSED_VAR(last); HYPRE_UNUSED_VAR(tail); HYPRE_Int weight0; if (previous[i] != head) { next[previous[i]] = next[i]; } previous[next[i]] = previous[i]; for (weight0 = 1; weight0 <= weight_max[0]; weight0++) { if (first[weight0] == i) { first[weight0] = next[i]; } } return 0; } /*--------------------------------------------------------------------- hypre_matinv: X <-- A**(-1) ; A IS POSITIVE DEFINITE (non--symmetric); ---------------------------------------------------------------------*/ HYPRE_Int hypre_matinv(HYPRE_Real *x, HYPRE_Real *a, HYPRE_Int k) { HYPRE_Int i, j, l, ierr = 0; for (i = 0; i < k; i++) { if (a[i + i * k] <= 0.e0) { if (i < k - 1) { /********* hypre_printf("indefinite singular matrix in *** matinv ***:\n"); hypre_printf("i:%d; diagonal entry: %e\n", i, a[i+k*i]); */ ierr = -1; } a[i + i * k] = 0.e0; } else { a[i + k * i] = 1.0 / a[i + i * k]; } for (j = 1; j < k - i; j++) { for (l = 1; l < k - i; l++) { a[i + l + k * (i + j)] -= a[i + l + k * i] * a[i + k * i] * a[i + k * (i + j)]; } } for (j = 1; j < k - i; j++) { a[i + j + k * i] = a[i + j + k * i] * a[i + k * i]; a[i + k * (i + j)] = a[i + k * (i + j)] * a[i + k * i]; } } /* FULL INVERSION: --------------------------------------------*/ x[k * k - 1] = a[k * k - 1]; for (i = k - 1; i > -1; i--) { for (j = 1; j < k - i; j++) { x[i + j + k * i] = 0; x[i + k * (i + j)] = 0; for (l = 1; l < k - i; l++) { x[i + j + k * i] -= x[i + j + k * (i + l)] * a[i + l + k * i]; x[i + k * (i + j)] -= a[i + k * (i + l)] * x[i + l + k * (i + j)]; } } x[i + k * i] = a[i + k * i]; for (j = 1; j < k - i; j++) { x[i + k * i] -= x[i + k * (i + j)] * a[i + j + k * i]; } } return ierr; } HYPRE_Int hypre_parCorrRes( hypre_ParCSRMatrix *A, hypre_ParVector *x, hypre_Vector *rhs, hypre_Vector **tmp_ptr ) { HYPRE_Int i, j, index, start; HYPRE_Int num_sends, num_cols_offd; HYPRE_Int local_size; HYPRE_Real *x_buf_data, *x_tmp_data, *x_local_data; HYPRE_MemoryLocation memory_location = hypre_ParCSRMatrixMemoryLocation(A); hypre_ParCSRCommPkg *comm_pkg; hypre_CSRMatrix *offd; hypre_Vector *x_local, *x_tmp, *tmp_vector; hypre_ParCSRCommHandle *comm_handle; comm_pkg = hypre_ParCSRMatrixCommPkg(A); offd = hypre_ParCSRMatrixOffd(A); num_cols_offd = hypre_CSRMatrixNumCols(offd); x_local = hypre_ParVectorLocalVector(x); x_local_data = hypre_VectorData(x_local); local_size = hypre_VectorSize(x_local); if (num_cols_offd) { num_sends = hypre_ParCSRCommPkgNumSends(comm_pkg); x_buf_data = hypre_CTAlloc(HYPRE_Real, hypre_ParCSRCommPkgSendMapStart(comm_pkg, num_sends), HYPRE_MEMORY_HOST); index = 0; for (i = 0; i < num_sends; i++) { start = hypre_ParCSRCommPkgSendMapStart(comm_pkg, i); for (j = start; j < hypre_ParCSRCommPkgSendMapStart(comm_pkg, i + 1); j++) { x_buf_data[index++] = x_local_data[hypre_ParCSRCommPkgSendMapElmt(comm_pkg, j)]; } } x_tmp = hypre_SeqVectorCreate(num_cols_offd); hypre_SeqVectorInitialize_v2(x_tmp, memory_location); x_tmp_data = hypre_VectorData(x_tmp); comm_handle = hypre_ParCSRCommHandleCreate( 1, comm_pkg, x_buf_data, x_tmp_data); tmp_vector = hypre_SeqVectorCreate(local_size); hypre_SeqVectorInitialize_v2(tmp_vector, memory_location); hypre_SeqVectorCopy(rhs, tmp_vector); hypre_ParCSRCommHandleDestroy(comm_handle); comm_handle = NULL; hypre_CSRMatrixMatvec(-1.0, offd, x_tmp, 1.0, tmp_vector); hypre_SeqVectorDestroy(x_tmp); hypre_TFree(x_buf_data, HYPRE_MEMORY_HOST); } else { tmp_vector = hypre_SeqVectorCreate(local_size); hypre_SeqVectorInitialize_v2(tmp_vector, memory_location); hypre_SeqVectorCopy(rhs, tmp_vector); } *tmp_ptr = tmp_vector; return hypre_error_flag; } HYPRE_Int hypre_AdSchwarzSolve(hypre_ParCSRMatrix *par_A, hypre_ParVector *par_rhs, hypre_CSRMatrix *domain_structure, HYPRE_Real *scale, hypre_ParVector *par_x, hypre_ParVector *par_aux, HYPRE_Int *pivots, HYPRE_Int use_nonsymm) { HYPRE_Int ierr = 0; HYPRE_Real *x; HYPRE_Real *aux; HYPRE_Real *tmp; hypre_Vector *x_vector; hypre_Vector *aux_vector; MPI_Comm comm = hypre_ParCSRMatrixComm(par_A); HYPRE_Int num_domains; HYPRE_Int max_domain_size; HYPRE_Int *i_domain_dof; HYPRE_Int *j_domain_dof; HYPRE_Real *domain_matrixinverse; HYPRE_Int piv_counter = 0; HYPRE_Int one = 1; char uplo = 'L'; HYPRE_Int jj, i, j; /*, j_loc, k_loc;*/ HYPRE_Int matrix_size, matrix_size_counter = 0; HYPRE_Int num_procs; hypre_MPI_Comm_size(comm, &num_procs); /* initiate: ----------------------------------------------- */ x_vector = hypre_ParVectorLocalVector(par_x); aux_vector = hypre_ParVectorLocalVector(par_aux); x = hypre_VectorData(x_vector); aux = hypre_VectorData(aux_vector); num_domains = hypre_CSRMatrixNumRows(domain_structure); max_domain_size = hypre_CSRMatrixNumCols(domain_structure); i_domain_dof = hypre_CSRMatrixI(domain_structure); j_domain_dof = hypre_CSRMatrixJ(domain_structure); domain_matrixinverse = hypre_CSRMatrixData(domain_structure); if (use_nonsymm) { uplo = 'N'; } hypre_ParVectorCopy(par_rhs, par_aux); hypre_ParCSRMatrixMatvec(-1.0, par_A, par_x, 1.0, par_aux); tmp = hypre_CTAlloc(HYPRE_Real, max_domain_size, HYPRE_MEMORY_HOST); /* forward solve: ----------------------------------------------- */ matrix_size_counter = 0; for (i = 0; i < num_domains; i++) { matrix_size = i_domain_dof[i + 1] - i_domain_dof[i]; /* compute residual: ---------------------------------------- */ jj = 0; for (j = i_domain_dof[i]; j < i_domain_dof[i + 1]; j++) { tmp[jj] = aux[j_domain_dof[j]]; jj++; } /* solve for correction: ------------------------------------- */ if (use_nonsymm) { hypre_dgetrs(&uplo, &matrix_size, &one, &domain_matrixinverse[matrix_size_counter], &matrix_size, &pivots[piv_counter], tmp, &matrix_size, &ierr); } else { hypre_dpotrs(&uplo, &matrix_size, &one, &domain_matrixinverse[matrix_size_counter], &matrix_size, tmp, &matrix_size, &ierr); } if (ierr) { hypre_error(HYPRE_ERROR_GENERIC); } jj = 0; for (j = i_domain_dof[i]; j < i_domain_dof[i + 1]; j++) { x[j_domain_dof[j]] += scale[j_domain_dof[j]] * tmp[jj++]; } matrix_size_counter += matrix_size * matrix_size; piv_counter += matrix_size; } hypre_TFree(tmp, HYPRE_MEMORY_HOST); return hypre_error_flag; } HYPRE_Int hypre_AdSchwarzCFSolve(hypre_ParCSRMatrix *par_A, hypre_ParVector *par_rhs, hypre_CSRMatrix *domain_structure, HYPRE_Real *scale, hypre_ParVector *par_x, hypre_ParVector *par_aux, HYPRE_Int *CF_marker, HYPRE_Int rlx_pt, HYPRE_Int *pivots, HYPRE_Int use_nonsymm) { HYPRE_Int ierr = 0; HYPRE_Real *x; HYPRE_Real *aux; HYPRE_Real *tmp; hypre_Vector *x_vector; hypre_Vector *aux_vector; MPI_Comm comm = hypre_ParCSRMatrixComm(par_A); HYPRE_Int num_domains; HYPRE_Int max_domain_size; HYPRE_Int *i_domain_dof; HYPRE_Int *j_domain_dof; HYPRE_Real *domain_matrixinverse; HYPRE_Int piv_counter = 0; HYPRE_Int one = 1; char uplo = 'L'; HYPRE_Int jj, i, j; /*, j_loc, k_loc;*/ HYPRE_Int matrix_size, matrix_size_counter = 0; HYPRE_Int num_procs; hypre_MPI_Comm_size(comm, &num_procs); /* initiate: ----------------------------------------------- */ x_vector = hypre_ParVectorLocalVector(par_x); aux_vector = hypre_ParVectorLocalVector(par_aux); x = hypre_VectorData(x_vector); aux = hypre_VectorData(aux_vector); num_domains = hypre_CSRMatrixNumRows(domain_structure); max_domain_size = hypre_CSRMatrixNumCols(domain_structure); i_domain_dof = hypre_CSRMatrixI(domain_structure); j_domain_dof = hypre_CSRMatrixJ(domain_structure); domain_matrixinverse = hypre_CSRMatrixData(domain_structure); if (use_nonsymm) { uplo = 'N'; } hypre_ParVectorCopy(par_rhs, par_aux); hypre_ParCSRMatrixMatvec(-1.0, par_A, par_x, 1.0, par_aux); tmp = hypre_CTAlloc(HYPRE_Real, max_domain_size, HYPRE_MEMORY_HOST); /* forward solve: ----------------------------------------------- */ matrix_size_counter = 0; for (i = 0; i < num_domains; i++) { if (CF_marker[i] == rlx_pt) { matrix_size = i_domain_dof[i + 1] - i_domain_dof[i]; /* compute residual: ---------------------------------------- */ jj = 0; for (j = i_domain_dof[i]; j < i_domain_dof[i + 1]; j++) { tmp[jj] = aux[j_domain_dof[j]]; jj++; } /* solve for correction: ------------------------------------- */ if (use_nonsymm) { hypre_dgetrs(&uplo, &matrix_size, &one, &domain_matrixinverse[matrix_size_counter], &matrix_size, &pivots[piv_counter], tmp, &matrix_size, &ierr); } else { hypre_dpotrs(&uplo, &matrix_size, &one, &domain_matrixinverse[matrix_size_counter], &matrix_size, tmp, &matrix_size, &ierr); } if (ierr) { hypre_error(HYPRE_ERROR_GENERIC); } jj = 0; for (j = i_domain_dof[i]; j < i_domain_dof[i + 1]; j++) { x[j_domain_dof[j]] += scale[j_domain_dof[j]] * tmp[jj++]; } matrix_size_counter += matrix_size * matrix_size; piv_counter += matrix_size; } } hypre_TFree(tmp, HYPRE_MEMORY_HOST); return hypre_error_flag; } HYPRE_Int hypre_GenerateScale(hypre_CSRMatrix *domain_structure, HYPRE_Int num_variables, HYPRE_Real relaxation_weight, HYPRE_Real **scale_pointer) { HYPRE_Int num_domains = hypre_CSRMatrixNumRows(domain_structure); HYPRE_Int *i_domain_dof = hypre_CSRMatrixI(domain_structure); HYPRE_Int *j_domain_dof = hypre_CSRMatrixJ(domain_structure); HYPRE_Int i, j; HYPRE_Real *scale; scale = hypre_CTAlloc(HYPRE_Real, num_variables, HYPRE_MEMORY_HOST); for (i = 0; i < num_domains; i++) { for (j = i_domain_dof[i]; j < i_domain_dof[i + 1]; j++) { scale[j_domain_dof[j]] += 1.0; } } for (i = 0; i < num_variables; i++) { scale[i] = relaxation_weight / scale[i]; } *scale_pointer = scale; return hypre_error_flag; } HYPRE_Int hypre_ParAdSchwarzSolve(hypre_ParCSRMatrix *A, hypre_ParVector *F, hypre_CSRMatrix *domain_structure, HYPRE_Real *scale, hypre_ParVector *X, hypre_ParVector *Vtemp, HYPRE_Int *pivots, HYPRE_Int use_nonsymm) { hypre_ParCSRCommPkg *comm_pkg = hypre_ParCSRMatrixCommPkg(A); HYPRE_Int num_sends = 0; HYPRE_Int *send_map_starts; HYPRE_Int *send_map_elmts; hypre_ParCSRCommHandle *comm_handle; HYPRE_Int ierr = 0; HYPRE_Real *x_data; HYPRE_Real *x_ext_data = NULL; HYPRE_Real *aux; HYPRE_Real *vtemp_data; HYPRE_Real *vtemp_ext_data = NULL; HYPRE_Int num_domains, max_domain_size; HYPRE_Int *i_domain_dof; HYPRE_Int *j_domain_dof; HYPRE_Real *domain_matrixinverse; hypre_CSRMatrix *A_diag = hypre_ParCSRMatrixDiag(A); HYPRE_Int num_variables; HYPRE_Int num_cols_offd; HYPRE_Real *scale_ext = NULL; HYPRE_Real *buf_data = NULL; HYPRE_Int index; HYPRE_Int piv_counter = 0; HYPRE_Int one = 1; char uplo = 'L'; HYPRE_Int jj, i, j, j_loc; /*, j_loc, k_loc;*/ HYPRE_Int matrix_size, matrix_size_counter = 0; /* initiate: ----------------------------------------------- */ num_variables = hypre_CSRMatrixNumRows(A_diag); num_cols_offd = hypre_CSRMatrixNumCols(hypre_ParCSRMatrixOffd(A)); x_data = hypre_VectorData(hypre_ParVectorLocalVector(X)); vtemp_data = hypre_VectorData(hypre_ParVectorLocalVector(Vtemp)); if (use_nonsymm) { uplo = 'N'; } hypre_ParVectorCopy(F, Vtemp); hypre_ParCSRMatrixMatvec(-1.0, A, X, 1.0, Vtemp); /* forward solve: ----------------------------------------------- */ num_domains = hypre_CSRMatrixNumRows(domain_structure); max_domain_size = hypre_CSRMatrixNumCols(domain_structure); i_domain_dof = hypre_CSRMatrixI(domain_structure); j_domain_dof = hypre_CSRMatrixJ(domain_structure); domain_matrixinverse = hypre_CSRMatrixData(domain_structure); aux = hypre_CTAlloc(HYPRE_Real, max_domain_size, HYPRE_MEMORY_HOST); if (comm_pkg) { num_sends = hypre_ParCSRCommPkgNumSends(comm_pkg); send_map_starts = hypre_ParCSRCommPkgSendMapStarts(comm_pkg); send_map_elmts = hypre_ParCSRCommPkgSendMapElmts(comm_pkg); buf_data = hypre_CTAlloc(HYPRE_Real, send_map_starts[num_sends], HYPRE_MEMORY_HOST); x_ext_data = hypre_CTAlloc(HYPRE_Real, num_cols_offd, HYPRE_MEMORY_HOST); vtemp_ext_data = hypre_CTAlloc(HYPRE_Real, num_cols_offd, HYPRE_MEMORY_HOST); scale_ext = hypre_CTAlloc(HYPRE_Real, num_cols_offd, HYPRE_MEMORY_HOST); index = 0; for (i = 0; i < num_sends; i++) { for (j = send_map_starts[i]; j < send_map_starts[i + 1]; j++) { buf_data[index++] = vtemp_data[send_map_elmts[j]]; } } comm_handle = hypre_ParCSRCommHandleCreate(1, comm_pkg, buf_data, vtemp_ext_data); hypre_ParCSRCommHandleDestroy(comm_handle); comm_handle = NULL; index = 0; for (i = 0; i < num_sends; i++) { for (j = send_map_starts[i]; j < send_map_starts[i + 1]; j++) { buf_data[index++] = scale[send_map_elmts[j]]; } } comm_handle = hypre_ParCSRCommHandleCreate(1, comm_pkg, buf_data, scale_ext); hypre_ParCSRCommHandleDestroy(comm_handle); comm_handle = NULL; } matrix_size_counter = 0; for (i = 0; i < num_domains; i++) { matrix_size = i_domain_dof[i + 1] - i_domain_dof[i]; /* copy data contiguously into aux --------------------------- */ jj = 0; for (j = i_domain_dof[i]; j < i_domain_dof[i + 1]; j++) { j_loc = j_domain_dof[j]; if (j_loc < num_variables) { aux[jj] = vtemp_data[j_loc]; } else { aux[jj] = vtemp_ext_data[j_loc - num_variables]; } jj++; } /* solve for correction: ------------------------------------- */ if (use_nonsymm) { hypre_dgetrs(&uplo, &matrix_size, &one, &domain_matrixinverse[matrix_size_counter], &matrix_size, &pivots[piv_counter], aux, &matrix_size, &ierr); } else { hypre_dpotrs(&uplo, &matrix_size, &one, &domain_matrixinverse[matrix_size_counter], &matrix_size, aux, &matrix_size, &ierr); } if (ierr) { hypre_error(HYPRE_ERROR_GENERIC); } jj = 0; for (j = i_domain_dof[i]; j < i_domain_dof[i + 1]; j++) { j_loc = j_domain_dof[j]; if (j_loc < num_variables) { x_data[j_loc] += scale[j_loc] * aux[jj++]; } else { j_loc -= num_variables; x_ext_data[j_loc] += scale_ext[j_loc] * aux[jj++]; } } matrix_size_counter += matrix_size * matrix_size; piv_counter += matrix_size; } if (comm_pkg) { comm_handle = hypre_ParCSRCommHandleCreate(2, comm_pkg, x_ext_data, buf_data); hypre_ParCSRCommHandleDestroy(comm_handle); comm_handle = NULL; index = 0; for (i = 0; i < num_sends; i++) { for (j = send_map_starts[i]; j < send_map_starts[i + 1]; j++) { x_data[send_map_elmts[j]] += buf_data[index++]; } } hypre_TFree(buf_data, HYPRE_MEMORY_HOST); hypre_TFree(x_ext_data, HYPRE_MEMORY_HOST); hypre_TFree(vtemp_ext_data, HYPRE_MEMORY_HOST); hypre_TFree(scale_ext, HYPRE_MEMORY_HOST); } hypre_TFree(aux, HYPRE_MEMORY_HOST); return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_ParAMGCreateDomainDof: *--------------------------------------------------------------------------*/ /***************************************************************************** * * Routine for constructing graph domain_dof with minimal overlap * and computing the respective matrix inverses to be * used in an overlapping additive Schwarz procedure (smoother * in AMG); * *****************************************************************************/ HYPRE_Int hypre_ParAMGCreateDomainDof(hypre_ParCSRMatrix *A, HYPRE_Int domain_type, HYPRE_Int overlap, HYPRE_Int num_functions, HYPRE_Int *dof_func, hypre_CSRMatrix **domain_structure_pointer, HYPRE_Int **piv_pointer, HYPRE_Int use_nonsymm) { HYPRE_UNUSED_VAR(dof_func); hypre_CSRMatrix *domain_structure = NULL; HYPRE_Int *i_domain_dof, *j_domain_dof; HYPRE_Real *domain_matrixinverse; HYPRE_Int num_domains; hypre_CSRMatrix *A_diag = hypre_ParCSRMatrixDiag(A); HYPRE_Int *a_diag_i = hypre_CSRMatrixI(A_diag); HYPRE_Int *a_diag_j = hypre_CSRMatrixJ(A_diag); HYPRE_Real *a_diag_data = hypre_CSRMatrixData(A_diag); HYPRE_Int num_variables = hypre_CSRMatrixNumRows(A_diag); HYPRE_BigInt first_col_diag = hypre_ParCSRMatrixFirstColDiag(A); HYPRE_BigInt col_0 = first_col_diag - 1 ; HYPRE_BigInt col_n = first_col_diag + (HYPRE_BigInt)num_variables; hypre_CSRMatrix *A_offd = hypre_ParCSRMatrixOffd(A); HYPRE_Int *a_offd_i = hypre_CSRMatrixI(A_offd); HYPRE_Int *a_offd_j = hypre_CSRMatrixJ(A_offd); HYPRE_Real *a_offd_data = hypre_CSRMatrixData(A_offd); HYPRE_Int num_cols_offd = hypre_CSRMatrixNumCols(A_offd); HYPRE_BigInt *col_map_offd = hypre_ParCSRMatrixColMapOffd(A); hypre_CSRMatrix *A_ext = NULL; HYPRE_Int *a_ext_i = NULL; HYPRE_BigInt *a_ext_j = NULL; HYPRE_Real *a_ext_data = NULL; /* HYPRE_Int *i_dof_to_accept_weight; */ HYPRE_Int *i_dof_to_prefer_weight, *w_dof_dof, *i_dof_weight; HYPRE_Int *i_dof_to_aggregate, *i_aggregate_dof, *j_aggregate_dof; HYPRE_Int *i_dof_index; HYPRE_Int *i_dof_index_offd; HYPRE_Int *i_proc; /* HYPRE_Int *row_starts = hypre_ParCSRMatrixRowStarts(A);*/ hypre_ParCSRCommPkg *comm_pkg = hypre_ParCSRMatrixCommPkg(A); HYPRE_Int num_recvs = 0; HYPRE_Int *recv_vec_starts = NULL; HYPRE_Int ierr = 0; HYPRE_Int i, j, k, l_loc, i_loc, j_loc; HYPRE_Int i_dof; HYPRE_Int nf; HYPRE_Int *i_local_to_global; HYPRE_Int *i_global_to_local; HYPRE_Int local_dof_counter, max_local_dof_counter = 0; HYPRE_Int domain_dof_counter = 0, domain_matrixinverse_counter = 0; HYPRE_Real *AE; HYPRE_Int *ipiv; char uplo = 'L'; HYPRE_Int piv_counter; HYPRE_Int *piv = NULL; HYPRE_Int cnt, indx; HYPRE_Int num_procs, my_id; if (num_variables == 0) { *domain_structure_pointer = domain_structure; *piv_pointer = piv; return hypre_error_flag; } hypre_MPI_Comm_size(hypre_ParCSRMatrixComm(A), &num_procs); hypre_MPI_Comm_size(hypre_ParCSRMatrixComm(A), &my_id); /* --------------------------------------------------------------------- */ /*=======================================================================*/ /* create artificial domains by agglomeration; */ /*=======================================================================*/ /*hypre_printf("----------- create artificials domain by agglomeration; ======\n"); */ i_aggregate_dof = hypre_CTAlloc(HYPRE_Int, num_variables + 1, HYPRE_MEMORY_HOST); j_aggregate_dof = hypre_CTAlloc(HYPRE_Int, num_variables, HYPRE_MEMORY_HOST); if (domain_type == 2) { i_dof_to_prefer_weight = hypre_CTAlloc(HYPRE_Int, num_variables, HYPRE_MEMORY_HOST); w_dof_dof = hypre_CTAlloc(HYPRE_Int, a_diag_i[num_variables], HYPRE_MEMORY_HOST); for (i = 0; i < num_variables; i++) { for (j = a_diag_i[i]; j < a_diag_i[i + 1]; j++) { w_dof_dof[j] = (a_diag_j[j] == i) ? 0 : 1; } } /*hypre_printf("end computing weights for agglomeration procedure: --------\n"); */ i_dof_weight = hypre_CTAlloc(HYPRE_Int, num_variables, HYPRE_MEMORY_HOST); hypre_AMGeAgglomerate(i_aggregate_dof, j_aggregate_dof, a_diag_i, a_diag_j, w_dof_dof, a_diag_i, a_diag_j, a_diag_i, a_diag_j, i_dof_to_prefer_weight, i_dof_weight, num_variables, num_variables, &num_domains); hypre_TFree(i_dof_to_prefer_weight, HYPRE_MEMORY_HOST); hypre_TFree(i_dof_weight, HYPRE_MEMORY_HOST); hypre_TFree(w_dof_dof, HYPRE_MEMORY_HOST); } else { nf = (domain_type == 1) ? num_functions : 1; num_domains = num_variables / nf; for (i = 0; i < num_domains + 1; i++) { i_aggregate_dof[i] = nf * i; } for (i = 0; i < num_variables; i++) { j_aggregate_dof[i] = i; } } /*hypre_printf("num_variables: %d, num_domains: %d\n", num_variables, num_domains); */ if (overlap == 1) { i_domain_dof = hypre_CTAlloc(HYPRE_Int, num_domains + 1, HYPRE_MEMORY_HOST); i_dof_to_aggregate = hypre_CTAlloc(HYPRE_Int, num_variables, HYPRE_MEMORY_HOST); i_proc = hypre_CTAlloc(HYPRE_Int, num_cols_offd, HYPRE_MEMORY_HOST); for (i = 0; i < num_domains; i++) { for (j = i_aggregate_dof[i]; j < i_aggregate_dof[i + 1]; j++) { i_dof_to_aggregate[j_aggregate_dof[j]] = i; } } if (comm_pkg) { num_recvs = hypre_ParCSRCommPkgNumRecvs(comm_pkg); recv_vec_starts = hypre_ParCSRCommPkgRecvVecStarts(comm_pkg); } else if (num_procs > 1) { hypre_MatvecCommPkgCreate(A); comm_pkg = hypre_ParCSRMatrixCommPkg(A); num_recvs = hypre_ParCSRCommPkgNumRecvs(comm_pkg); recv_vec_starts = hypre_ParCSRCommPkgRecvVecStarts(comm_pkg); } for (i = 0; i < num_recvs; i++) { for (indx = recv_vec_starts[i]; indx < recv_vec_starts[i + 1]; indx++) { i_proc[indx] = i; } } /* make domains from aggregates: *********************************/ i_dof_index = hypre_CTAlloc(HYPRE_Int, num_variables, HYPRE_MEMORY_HOST); i_dof_index_offd = hypre_CTAlloc(HYPRE_Int, num_cols_offd, HYPRE_MEMORY_HOST); for (i = 0; i < num_variables; i++) { i_dof_index[i] = -1; } for (i = 0; i < num_cols_offd; i++) { i_dof_index_offd[i] = -1; } domain_dof_counter = 0; for (i = 0; i < num_domains; i++) { i_domain_dof[i] = domain_dof_counter; for (j = i_aggregate_dof[i]; j < i_aggregate_dof[i + 1]; j++) { i_dof_index[j_aggregate_dof[j]] = -1; } for (j = i_aggregate_dof[i]; j < i_aggregate_dof[i + 1]; j++) { for (k = a_diag_i[j_aggregate_dof[j]]; k < a_diag_i[j_aggregate_dof[j] + 1]; k++) { if (i_dof_to_aggregate[a_diag_j[k]] >= i && i_dof_index[a_diag_j[k]] == -1) { i_dof_index[a_diag_j[k]]++; domain_dof_counter++; } } for (k = a_offd_i[j_aggregate_dof[j]]; k < a_offd_i[j_aggregate_dof[j] + 1]; k++) { if (i_proc[a_offd_j[k]] > my_id && i_dof_index_offd[a_offd_j[k]] == -1) { i_dof_index_offd[a_offd_j[k]]++; domain_dof_counter++; } } } } for (i = 0; i < num_variables; i++) { i_dof_index[i] = -1; } for (i = 0; i < num_cols_offd; i++) { i_dof_index_offd[i] = -1; } i_domain_dof[num_domains] = domain_dof_counter; j_domain_dof = hypre_CTAlloc(HYPRE_Int, domain_dof_counter, HYPRE_MEMORY_HOST); domain_dof_counter = 0; for (i = 0; i < num_domains; i++) { for (j = i_aggregate_dof[i]; j < i_aggregate_dof[i + 1]; j++) { i_dof_index[j_aggregate_dof[j]] = -1; } for (j = i_aggregate_dof[i]; j < i_aggregate_dof[i + 1]; j++) { for (k = a_diag_i[j_aggregate_dof[j]]; k < a_diag_i[j_aggregate_dof[j] + 1]; k++) { if ( (i_dof_to_aggregate[a_diag_j[k]] >= i) && (i_dof_index[a_diag_j[k]] == -1) ) { i_dof_index[a_diag_j[k]]++; j_domain_dof[domain_dof_counter] = a_diag_j[k]; domain_dof_counter++; } } for (k = a_offd_i[j_aggregate_dof[j]]; k < a_offd_i[j_aggregate_dof[j] + 1]; k++) { if ( (i_proc[a_offd_j[k]] > my_id) && (i_dof_index_offd[a_offd_j[k]] == -1) ) { i_dof_index_offd[a_offd_j[k]]++; j_domain_dof[domain_dof_counter] = a_offd_j[k] + num_variables; domain_dof_counter++; } } } } hypre_TFree(i_aggregate_dof, HYPRE_MEMORY_HOST); hypre_TFree(j_aggregate_dof, HYPRE_MEMORY_HOST); hypre_TFree(i_dof_to_aggregate, HYPRE_MEMORY_HOST); hypre_TFree(i_dof_index, HYPRE_MEMORY_HOST); hypre_TFree(i_dof_index_offd, HYPRE_MEMORY_HOST); hypre_TFree(i_proc, HYPRE_MEMORY_HOST); } else if (overlap == 2) { i_domain_dof = hypre_CTAlloc(HYPRE_Int, num_domains + 1, HYPRE_MEMORY_HOST); i_dof_to_aggregate = hypre_CTAlloc(HYPRE_Int, num_variables, HYPRE_MEMORY_HOST); for (i = 0; i < num_domains; i++) { for (j = i_aggregate_dof[i]; j < i_aggregate_dof[i + 1]; j++) { i_dof_to_aggregate[j_aggregate_dof[j]] = i; } } /* make domains from aggregates: *********************************/ i_dof_index = hypre_CTAlloc(HYPRE_Int, num_variables, HYPRE_MEMORY_HOST); i_dof_index_offd = hypre_CTAlloc(HYPRE_Int, num_cols_offd, HYPRE_MEMORY_HOST); for (i = 0; i < num_variables; i++) { i_dof_index[i] = -1; } for (i = 0; i < num_cols_offd; i++) { i_dof_index_offd[i] = -1; } domain_dof_counter = 0; for (i = 0; i < num_domains; i++) { i_domain_dof[i] = domain_dof_counter; for (j = i_aggregate_dof[i]; j < i_aggregate_dof[i + 1]; j++) { for (k = a_diag_i[j_aggregate_dof[j]]; k < a_diag_i[j_aggregate_dof[j] + 1]; k++) { if ( i_dof_index[a_diag_j[k]] == -1) { i_dof_index[a_diag_j[k]]++; domain_dof_counter++; } } for (k = a_offd_i[j_aggregate_dof[j]]; k < a_offd_i[j_aggregate_dof[j] + 1]; k++) { if ( i_dof_index_offd[a_offd_j[k]] == -1) { i_dof_index_offd[a_offd_j[k]]++; domain_dof_counter++; } } } for (j = i_aggregate_dof[i]; j < i_aggregate_dof[i + 1]; j++) { for (k = a_diag_i[j_aggregate_dof[j]]; k < a_diag_i[j_aggregate_dof[j] + 1]; k++) { i_dof_index[a_diag_j[k]] = -1; } for (k = a_offd_i[j_aggregate_dof[j]]; k < a_offd_i[j_aggregate_dof[j] + 1]; k++) { i_dof_index_offd[a_offd_j[k]] = -1; } } } for (i = 0; i < num_variables; i++) { i_dof_index[i] = -1; } for (i = 0; i < num_cols_offd; i++) { i_dof_index_offd[i] = -1; } i_domain_dof[num_domains] = domain_dof_counter; j_domain_dof = hypre_CTAlloc(HYPRE_Int, domain_dof_counter, HYPRE_MEMORY_HOST); domain_dof_counter = 0; for (i = 0; i < num_domains; i++) { for (j = i_aggregate_dof[i]; j < i_aggregate_dof[i + 1]; j++) { for (k = a_diag_i[j_aggregate_dof[j]]; k < a_diag_i[j_aggregate_dof[j] + 1]; k++) { if ( i_dof_index[a_diag_j[k]] == -1) { i_dof_index[a_diag_j[k]]++; j_domain_dof[domain_dof_counter] = a_diag_j[k]; domain_dof_counter++; } } for (k = a_offd_i[j_aggregate_dof[j]]; k < a_offd_i[j_aggregate_dof[j] + 1]; k++) { if ( i_dof_index_offd[a_offd_j[k]] == -1) { i_dof_index_offd[a_offd_j[k]]++; j_domain_dof[domain_dof_counter] = a_offd_j[k] + num_variables; domain_dof_counter++; } } } for (j = i_aggregate_dof[i]; j < i_aggregate_dof[i + 1]; j++) { for (k = a_diag_i[j_aggregate_dof[j]]; k < a_diag_i[j_aggregate_dof[j] + 1]; k++) { i_dof_index[a_diag_j[k]] = -1; } for (k = a_offd_i[j_aggregate_dof[j]]; k < a_offd_i[j_aggregate_dof[j] + 1]; k++) { i_dof_index_offd[a_offd_j[k]] = -1; } } } hypre_TFree(i_aggregate_dof, HYPRE_MEMORY_HOST); hypre_TFree(j_aggregate_dof, HYPRE_MEMORY_HOST); hypre_TFree(i_dof_to_aggregate, HYPRE_MEMORY_HOST); hypre_TFree(i_dof_index, HYPRE_MEMORY_HOST); hypre_TFree(i_dof_index_offd, HYPRE_MEMORY_HOST); } else { i_domain_dof = i_aggregate_dof; j_domain_dof = j_aggregate_dof; } /*hypre_printf("END domain_dof computations: =================================\n"); */ domain_matrixinverse_counter = 0; local_dof_counter = 0; piv_counter = 0; for (i = 0; i < num_domains; i++) { local_dof_counter = i_domain_dof[i + 1] - i_domain_dof[i]; domain_matrixinverse_counter += local_dof_counter * local_dof_counter; piv_counter += local_dof_counter; if (local_dof_counter > max_local_dof_counter) { max_local_dof_counter = local_dof_counter; } } domain_matrixinverse = hypre_CTAlloc(HYPRE_Real, domain_matrixinverse_counter, HYPRE_MEMORY_HOST); if (use_nonsymm) { piv = hypre_CTAlloc(HYPRE_Int, piv_counter, HYPRE_MEMORY_HOST); } if (num_procs > 1) { A_ext = hypre_ParCSRMatrixExtractBExt(A, A, 1); a_ext_i = hypre_CSRMatrixI(A_ext); a_ext_j = hypre_CSRMatrixBigJ(A_ext); a_ext_data = hypre_CSRMatrixData(A_ext); } else { A_ext = NULL; } i_local_to_global = hypre_CTAlloc(HYPRE_Int, max_local_dof_counter, HYPRE_MEMORY_HOST); i_global_to_local = hypre_CTAlloc(HYPRE_Int, num_variables + num_cols_offd, HYPRE_MEMORY_HOST); for (i = 0; i < num_variables + num_cols_offd; i++) { i_global_to_local[i] = -1; } piv_counter = 0; domain_matrixinverse_counter = 0; for (i = 0; i < num_domains; i++) { local_dof_counter = 0; for (j = i_domain_dof[i]; j < i_domain_dof[i + 1]; j++) { i_global_to_local[j_domain_dof[j]] = local_dof_counter; i_local_to_global[local_dof_counter] = j_domain_dof[j]; local_dof_counter++; } /* get local matrix in AE: ======================================== */ AE = &domain_matrixinverse[domain_matrixinverse_counter]; ipiv = &piv[piv_counter]; cnt = 0; for (i_loc = 0; i_loc < local_dof_counter; i_loc++) { for (j_loc = 0; j_loc < local_dof_counter; j_loc++) { AE[cnt++] = 0.e0; } } for (i_loc = 0; i_loc < local_dof_counter; i_loc++) { i_dof = i_local_to_global[i_loc]; if (i_dof < num_variables) { for (j = a_diag_i[i_dof]; j < a_diag_i[i_dof + 1]; j++) { j_loc = i_global_to_local[a_diag_j[j]]; if (j_loc >= 0) { AE[i_loc + j_loc * local_dof_counter] = a_diag_data[j]; } } for (j = a_offd_i[i_dof]; j < a_offd_i[i_dof + 1]; j++) { j_loc = i_global_to_local[a_offd_j[j] + num_variables]; if (j_loc >= 0) { AE[i_loc + j_loc * local_dof_counter] = a_offd_data[j]; } } } else { HYPRE_BigInt jj; HYPRE_Int j2; i_dof -= num_variables; for (j = a_ext_i[i_dof]; j < a_ext_i[i_dof + 1]; j++) { jj = a_ext_j[j]; if (jj > col_0 && jj < col_n) { j2 = (HYPRE_Int)(jj - first_col_diag); } else { j2 = hypre_BigBinarySearch(col_map_offd, jj, num_cols_offd); if (j2 > -1) { j2 += num_variables; } } if (j2 > -1) { j_loc = i_global_to_local[j2]; if (j_loc >= 0) { AE[i_loc + j_loc * local_dof_counter] = a_ext_data[j]; } } } } } if (use_nonsymm) { hypre_dgetrf(&local_dof_counter, &local_dof_counter, AE, &local_dof_counter, ipiv, &ierr); piv_counter += local_dof_counter; } else { hypre_dpotrf(&uplo, &local_dof_counter, AE, &local_dof_counter, &ierr); } domain_matrixinverse_counter += local_dof_counter * local_dof_counter; for (l_loc = 0; l_loc < local_dof_counter; l_loc++) { i_global_to_local[i_local_to_global[l_loc]] = -1; } } hypre_TFree(i_local_to_global, HYPRE_MEMORY_HOST); hypre_TFree(i_global_to_local, HYPRE_MEMORY_HOST); hypre_CSRMatrixDestroy(A_ext); domain_structure = hypre_CSRMatrixCreate(num_domains, max_local_dof_counter, i_domain_dof[num_domains]); hypre_CSRMatrixI(domain_structure) = i_domain_dof; hypre_CSRMatrixJ(domain_structure) = j_domain_dof; hypre_CSRMatrixData(domain_structure) = domain_matrixinverse; *domain_structure_pointer = domain_structure; *piv_pointer = piv; return hypre_error_flag; } HYPRE_Int hypre_ParGenerateScale(hypre_ParCSRMatrix *A, hypre_CSRMatrix *domain_structure, HYPRE_Real relaxation_weight, HYPRE_Real **scale_pointer) { HYPRE_Int num_domains = hypre_CSRMatrixNumRows(domain_structure); HYPRE_Int *i_domain_dof = hypre_CSRMatrixI(domain_structure); HYPRE_Int *j_domain_dof = hypre_CSRMatrixJ(domain_structure); HYPRE_Real *scale = NULL; HYPRE_Real *scale_ext = NULL; HYPRE_Real *scale_int = NULL; hypre_ParCSRCommPkg *comm_pkg = hypre_ParCSRMatrixCommPkg(A); HYPRE_Int num_sends = 0; HYPRE_Int *send_map_starts = NULL; HYPRE_Int *send_map_elmts = NULL; HYPRE_Int num_variables = hypre_ParCSRMatrixNumRows(A); HYPRE_Int num_cols_offd = hypre_CSRMatrixNumCols(hypre_ParCSRMatrixOffd(A)); HYPRE_Int i, j, j_loc, index, start; hypre_ParCSRCommHandle *comm_handle; if (comm_pkg) { num_sends = hypre_ParCSRCommPkgNumSends(comm_pkg); send_map_starts = hypre_ParCSRCommPkgSendMapStarts(comm_pkg); send_map_elmts = hypre_ParCSRCommPkgSendMapElmts(comm_pkg); } scale = hypre_CTAlloc(HYPRE_Real, num_variables, HYPRE_MEMORY_HOST); scale_ext = hypre_CTAlloc(HYPRE_Real, num_cols_offd, HYPRE_MEMORY_HOST); for (i = 0; i < num_domains; i++) { for (j = i_domain_dof[i]; j < i_domain_dof[i + 1]; j++) { j_loc = j_domain_dof[j]; if (j_loc < num_variables) { scale[j_loc] += 1.0; } else { scale_ext[j_loc - num_variables] += 1.0; } } } if (comm_pkg) { scale_int = hypre_CTAlloc(HYPRE_Real, send_map_starts[num_sends], HYPRE_MEMORY_HOST); comm_handle = hypre_ParCSRCommHandleCreate (2, comm_pkg, scale_ext, scale_int); hypre_ParCSRCommHandleDestroy(comm_handle); comm_handle = NULL; } index = 0; for (i = 0; i < num_sends; i++) { start = send_map_starts[i]; for (j = start; j < send_map_starts[i + 1]; j++) { scale[send_map_elmts[j]] += scale_int[index++]; } } hypre_TFree(scale_int, HYPRE_MEMORY_HOST); hypre_TFree(scale_ext, HYPRE_MEMORY_HOST); for (i = 0; i < num_variables; i++) { scale[i] = relaxation_weight / scale[i]; } *scale_pointer = scale; return hypre_error_flag; } HYPRE_Int hypre_ParGenerateHybridScale(hypre_ParCSRMatrix *A, hypre_CSRMatrix *domain_structure, hypre_CSRMatrix **A_boundary_pointer, HYPRE_Real **scale_pointer) { hypre_CSRMatrix *A_ext; HYPRE_Int *A_ext_i; HYPRE_BigInt *A_ext_j; HYPRE_Real *A_ext_data; hypre_CSRMatrix *A_boundary; HYPRE_Int *A_boundary_i; HYPRE_Int *A_boundary_j; HYPRE_Real *A_boundary_data; HYPRE_Int num_domains = hypre_CSRMatrixNumRows(domain_structure); HYPRE_Int *i_domain_dof = hypre_CSRMatrixI(domain_structure); HYPRE_Int *j_domain_dof = hypre_CSRMatrixJ(domain_structure); HYPRE_Int i, j, jj; HYPRE_Real *scale; HYPRE_Real *scale_ext = NULL; HYPRE_Real *scale_int = NULL; hypre_ParCSRCommPkg *comm_pkg = hypre_ParCSRMatrixCommPkg(A); HYPRE_Int num_sends = 0; HYPRE_Int *send_map_starts; HYPRE_Int *send_map_elmts; HYPRE_Int *index_ext = NULL; HYPRE_Int num_variables = hypre_ParCSRMatrixNumRows(A); HYPRE_Int num_cols_offd = hypre_CSRMatrixNumCols(hypre_ParCSRMatrixOffd(A)); HYPRE_Int j_loc, index, start; HYPRE_BigInt col_0, col_n; HYPRE_BigInt *col_map_offd = hypre_ParCSRMatrixColMapOffd(A); hypre_ParCSRCommHandle *comm_handle; col_0 = hypre_ParCSRMatrixFirstColDiag(A) - 1; col_n = col_0 + (HYPRE_Int)num_variables; A_boundary = NULL; if (comm_pkg) { num_sends = hypre_ParCSRCommPkgNumSends(comm_pkg); send_map_starts = hypre_ParCSRCommPkgSendMapStarts(comm_pkg); send_map_elmts = hypre_ParCSRCommPkgSendMapElmts(comm_pkg); } scale = hypre_CTAlloc(HYPRE_Real, num_variables, HYPRE_MEMORY_HOST); if (num_cols_offd) { scale_ext = hypre_CTAlloc(HYPRE_Real, num_cols_offd, HYPRE_MEMORY_HOST); index_ext = hypre_CTAlloc(HYPRE_Int, num_cols_offd, HYPRE_MEMORY_HOST); } for (i = 0; i < num_variables; i++) { scale[i] = 1; } for (i = 0; i < num_cols_offd; i++) { index_ext[i] = -1; } for (i = 0; i < num_domains; i++) { for (j = i_domain_dof[i]; j < i_domain_dof[i + 1]; j++) { j_loc = j_domain_dof[j]; if (j_loc >= num_variables) { j_loc -= num_variables; if (index_ext[j_loc] == -1) { scale_ext[j_loc] += 1.0; index_ext[j_loc] ++; } } } } if (comm_pkg) { scale_int = hypre_CTAlloc(HYPRE_Real, send_map_starts[num_sends], HYPRE_MEMORY_HOST); comm_handle = hypre_ParCSRCommHandleCreate(2, comm_pkg, scale_ext, scale_int); hypre_ParCSRCommHandleDestroy(comm_handle); comm_handle = NULL; A_ext = hypre_ParCSRMatrixExtractBExt(A, A, 1); A_ext_i = hypre_CSRMatrixI(A_ext); A_boundary_i = hypre_CTAlloc(HYPRE_Int, num_cols_offd + 1, HYPRE_MEMORY_HOST); A_ext_j = hypre_CSRMatrixBigJ(A_ext); A_ext_data = hypre_CSRMatrixData(A_ext); /* compress A_ext to contain only local data and necessary boundary points*/ index = 0; for (i = 0; i < num_cols_offd; i++) { A_boundary_i[i] = index; for (j = A_ext_i[i]; j < A_ext_i[i + 1]; j++) { HYPRE_BigInt j_col; j_col = A_ext_j[j]; if (j_col > col_0 && j_col < col_n) { A_ext_j[j] = j_col - col_0; index++; } else { jj = hypre_BigBinarySearch(col_map_offd, j_col, num_cols_offd); if (jj > -1 && (scale_ext[jj] > 0)) { A_ext_j[j] = num_variables + jj; index++; } else { A_ext_j[j] = -1; } } } } A_boundary_i[num_cols_offd] = index; A_boundary_j = NULL; A_boundary_data = NULL; if (index) { A_boundary_j = hypre_CTAlloc(HYPRE_Int, index, HYPRE_MEMORY_HOST); A_boundary_data = hypre_CTAlloc(HYPRE_Real, index, HYPRE_MEMORY_HOST); } index = 0; for (i = 0; i < A_ext_i[num_cols_offd]; i++) { if (A_ext_j[i] > -1) { A_boundary_j[index] = (HYPRE_Int) A_ext_j[i]; A_boundary_data[index] = A_ext_data[i]; index++; } } A_boundary = hypre_CSRMatrixCreate(num_cols_offd, num_variables, index); hypre_CSRMatrixI(A_boundary) = A_boundary_i; hypre_CSRMatrixJ(A_boundary) = A_boundary_j; hypre_CSRMatrixData(A_boundary) = A_boundary_data; hypre_CSRMatrixDestroy(A_ext); } index = 0; for (i = 0; i < num_sends; i++) { start = send_map_starts[i]; for (j = start; j < send_map_starts[i + 1]; j++) { scale[send_map_elmts[j]] += scale_int[index++]; } } hypre_TFree(scale_int, HYPRE_MEMORY_HOST); hypre_TFree(scale_ext, HYPRE_MEMORY_HOST); hypre_TFree(index_ext, HYPRE_MEMORY_HOST); for (i = 0; i < num_variables; i++) { scale[i] = 1.0 / scale[i]; } *scale_pointer = scale; *A_boundary_pointer = A_boundary; return hypre_error_flag; } hypre-2.33.0/src/parcsr_ls/schwarz.h000066400000000000000000000041621477326011500173500ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #ifndef hypre_Schwarz_DATA_HEADER #define hypre_Schwarz_DATA_HEADER /*-------------------------------------------------------------------------- * hypre_SchwarzData *--------------------------------------------------------------------------*/ typedef struct { HYPRE_Int variant; HYPRE_Int domain_type; HYPRE_Int overlap; HYPRE_Int num_functions; HYPRE_Int use_nonsymm; HYPRE_Real relax_weight; hypre_CSRMatrix *domain_structure; hypre_CSRMatrix *A_boundary; hypre_ParVector *Vtemp; HYPRE_Real *scale; HYPRE_Int *dof_func; HYPRE_Int *pivots; } hypre_SchwarzData; /*-------------------------------------------------------------------------- * Accessor functions for the hypre_SchwarzData structure *--------------------------------------------------------------------------*/ #define hypre_SchwarzDataVariant(schwarz_data) ((schwarz_data)->variant) #define hypre_SchwarzDataDomainType(schwarz_data) ((schwarz_data)->domain_type) #define hypre_SchwarzDataOverlap(schwarz_data) ((schwarz_data)->overlap) #define hypre_SchwarzDataNumFunctions(schwarz_data) \ ((schwarz_data)->num_functions) #define hypre_SchwarzDataUseNonSymm(schwarz_data) \ ((schwarz_data)->use_nonsymm) #define hypre_SchwarzDataRelaxWeight(schwarz_data) \ ((schwarz_data)->relax_weight) #define hypre_SchwarzDataDomainStructure(schwarz_data) \ ((schwarz_data)->domain_structure) #define hypre_SchwarzDataABoundary(schwarz_data) ((schwarz_data)->A_boundary) #define hypre_SchwarzDataVtemp(schwarz_data) ((schwarz_data)->Vtemp) #define hypre_SchwarzDataScale(schwarz_data) ((schwarz_data)->scale) #define hypre_SchwarzDataDofFunc(schwarz_data) ((schwarz_data)->dof_func) #define hypre_SchwarzDataPivots(schwarz_data) ((schwarz_data)->pivots) #endif hypre-2.33.0/src/parcsr_mv/000077500000000000000000000000001477326011500155175ustar00rootroot00000000000000hypre-2.33.0/src/parcsr_mv/CMakeLists.txt000066400000000000000000000027411477326011500202630ustar00rootroot00000000000000# Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) set(HDRS HYPRE_parcsr_mv.h _hypre_parcsr_mv.h ) set(SRCS communicationT.c F90_HYPRE_parcsr_matrix.c F90_HYPRE_parcsr_vector.c F90_parcsr_matrix.c F90_par_vector.c gen_fffc.c HYPRE_parcsr_matrix.c HYPRE_parcsr_vector.c new_commpkg.c numbers.c par_csr_aat.c par_csr_assumed_part.c par_csr_bool_matop.c par_csr_bool_matrix.c par_csr_communication.c par_csr_filter.c par_csr_filter_device.c par_csr_matop.c par_csr_matrix.c par_csr_matrix_stats.c par_csr_matmat.c par_csr_matmat_device.c par_csr_matop_marked.c par_csr_matvec.c par_csr_matvec_device.c par_vector.c par_vector_batched.c par_make_system.c par_csr_triplemat.c par_csr_fffc_device.c par_csr_matop_device.c par_csr_triplemat_device.c par_vector_device.c ) target_sources(${PROJECT_NAME} PRIVATE ${SRCS} ${HDRS} ) if (HYPRE_USING_GPU) set(GPU_SRCS par_csr_matmat_device.c par_csr_matvec_device.c par_csr_fffc_device.c par_csr_filter_device.c par_csr_matop_device.c par_csr_triplemat_device.c par_vector_device.c ) convert_filenames_to_full_paths(GPU_SRCS) set(HYPRE_GPU_SOURCES ${HYPRE_GPU_SOURCES} ${GPU_SRCS} PARENT_SCOPE) endif () convert_filenames_to_full_paths(HDRS) set(HYPRE_HEADERS ${HYPRE_HEADERS} ${HDRS} PARENT_SCOPE) hypre-2.33.0/src/parcsr_mv/F90_HYPRE_parcsr_matrix.c000066400000000000000000000276721477326011500221440ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * HYPRE_ParCSRMatrix Fortran interface * *****************************************************************************/ #include "_hypre_parcsr_mv.h" #include "fortran.h" #ifdef __cplusplus extern "C" { #endif /*-------------------------------------------------------------------------- * HYPRE_ParCSRMatrixCreate *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_parcsrmatrixcreate, HYPRE_PARCSRMATRIXCREATE) ( hypre_F90_Comm *comm, hypre_F90_BigInt *global_num_rows, hypre_F90_BigInt *global_num_cols, hypre_F90_BigIntArray *row_starts, hypre_F90_BigIntArray *col_starts, hypre_F90_Int *num_cols_offd, hypre_F90_Int *num_nonzeros_diag, hypre_F90_Int *num_nonzeros_offd, hypre_F90_Obj *matrix, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_ParCSRMatrixCreate( hypre_F90_PassComm (comm), hypre_F90_PassBigInt (global_num_rows), hypre_F90_PassBigInt (global_num_cols), hypre_F90_PassBigIntArray (row_starts), hypre_F90_PassBigIntArray (col_starts), hypre_F90_PassInt (num_cols_offd), hypre_F90_PassInt (num_nonzeros_diag), hypre_F90_PassInt (num_nonzeros_offd), hypre_F90_PassObjRef (HYPRE_ParCSRMatrix, matrix) ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRMatrixDestroy *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_parcsrmatrixdestroy, HYPRE_PARCSRMATRIXDESTROY) ( hypre_F90_Obj *matrix, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_ParCSRMatrixDestroy( hypre_F90_PassObj (HYPRE_ParCSRMatrix, matrix) ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRMatrixInitialize *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_parcsrmatrixinitialize, HYPRE_PARCSRMATRIXINITIALIZE) ( hypre_F90_Obj *matrix, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_ParCSRMatrixInitialize( hypre_F90_PassObj (HYPRE_ParCSRMatrix, matrix) ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRMatrixRead *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_parcsrmatrixread, HYPRE_PARCSRMATRIXREAD) ( hypre_F90_Comm *comm, char *file_name, hypre_F90_Obj *matrix, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_ParCSRMatrixRead( hypre_F90_PassComm (comm), (char *) file_name, hypre_F90_PassObjRef (HYPRE_ParCSRMatrix, matrix) ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRMatrixPrint *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_parcsrmatrixprint, HYPRE_PARCSRMATRIXPRINT) ( hypre_F90_Obj *matrix, char *fort_file_name, hypre_F90_Int *fort_file_name_size, hypre_F90_Int *ierr ) { HYPRE_Int i; char *c_file_name; c_file_name = hypre_CTAlloc(char, *fort_file_name_size, HYPRE_MEMORY_HOST); for (i = 0; i < *fort_file_name_size; i++) { c_file_name[i] = fort_file_name[i]; } *ierr = (hypre_F90_Int) ( HYPRE_ParCSRMatrixPrint( hypre_F90_PassObj (HYPRE_ParCSRMatrix, matrix), (char *) c_file_name ) ); hypre_TFree(c_file_name, HYPRE_MEMORY_HOST); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRMatrixGetComm *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_parcsrmatrixgetcomm, HYPRE_PARCSRMATRIXGETCOMM) ( hypre_F90_Obj *matrix, hypre_F90_Comm *comm, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_ParCSRMatrixGetComm( hypre_F90_PassObj (HYPRE_ParCSRMatrix, matrix), (MPI_Comm *) comm ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRMatrixGetDims *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_parcsrmatrixgetdims, HYPRE_PARCSRMATRIXGETDIMS) ( hypre_F90_Obj *matrix, hypre_F90_BigInt *M, hypre_F90_BigInt *N, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_ParCSRMatrixGetDims( hypre_F90_PassObj (HYPRE_ParCSRMatrix, matrix), hypre_F90_PassBigIntRef (M), hypre_F90_PassBigIntRef (N) ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRMatrixGetRowPartitioning *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_parcsrmatrixgetrowpartiti, HYPRE_PARCSRMATRIXGETROWPARTITI) ( hypre_F90_Obj *matrix, hypre_F90_Obj *row_partitioning_ptr, hypre_F90_Int *ierr ) { HYPRE_Int *row_partitioning; *ierr = (hypre_F90_Int) HYPRE_ParCSRMatrixGetRowPartitioning( hypre_F90_PassObj (HYPRE_ParCSRMatrix, matrix), (HYPRE_BigInt **) &row_partitioning ); *row_partitioning_ptr = (hypre_F90_Obj) row_partitioning; } /*-------------------------------------------------------------------------- * HYPRE_ParCSRMatrixGetColPartitioning *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_parcsrmatrixgetcolpartiti, HYPRE_PARCSRMATRIXGETCOLPARTITI) ( hypre_F90_Obj *matrix, hypre_F90_Obj *col_partitioning_ptr, hypre_F90_Int *ierr ) { HYPRE_Int *col_partitioning; *ierr = (hypre_F90_Int) HYPRE_ParCSRMatrixGetColPartitioning( hypre_F90_PassObj (HYPRE_ParCSRMatrix, matrix), (HYPRE_BigInt **) &col_partitioning ); *col_partitioning_ptr = (hypre_F90_Obj) col_partitioning; } /*-------------------------------------------------------------------------- * HYPRE_ParCSRMatrixGetLocalRange *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_parcsrmatrixgetlocalrange, HYPRE_PARCSRMATRIXGETLOCALRANGE) ( hypre_F90_Obj *matrix, hypre_F90_BigInt *row_start, hypre_F90_BigInt *row_end, hypre_F90_BigInt *col_start, hypre_F90_BigInt *col_end, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_ParCSRMatrixGetLocalRange( hypre_F90_PassObj (HYPRE_ParCSRMatrix, matrix), hypre_F90_PassBigIntRef (row_start), hypre_F90_PassBigIntRef (row_end), hypre_F90_PassBigIntRef (col_start), hypre_F90_PassBigIntRef (col_end)) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRMatrixGetRow *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_parcsrmatrixgetrow, HYPRE_PARCSRMATRIXGETROW) ( hypre_F90_Obj *matrix, hypre_F90_BigInt *row, hypre_F90_Int *size, hypre_F90_Obj *col_ind_ptr, hypre_F90_Obj *values_ptr, hypre_F90_Int *ierr ) { HYPRE_Int *col_ind; HYPRE_Complex *values; *ierr = (hypre_F90_Int) HYPRE_ParCSRMatrixGetRow( hypre_F90_PassObj (HYPRE_ParCSRMatrix, matrix), hypre_F90_PassBigInt (row), hypre_F90_PassIntRef (size), (HYPRE_BigInt **) &col_ind, (HYPRE_Complex **) &values ); *col_ind_ptr = (hypre_F90_Obj) col_ind; *values_ptr = (hypre_F90_Obj) values; } /*-------------------------------------------------------------------------- * HYPRE_ParCSRMatrixRestoreRow *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_parcsrmatrixrestorerow, HYPRE_PARCSRMATRIXRESTOREROW) ( hypre_F90_Obj *matrix, hypre_F90_BigInt *row, hypre_F90_Int *size, hypre_F90_Obj *col_ind_ptr, hypre_F90_Obj *values_ptr, hypre_F90_Int *ierr ) { HYPRE_Int *col_ind; HYPRE_Complex *values; *ierr = (hypre_F90_Int) HYPRE_ParCSRMatrixRestoreRow( hypre_F90_PassObj (HYPRE_ParCSRMatrix, matrix), hypre_F90_PassBigInt (row), hypre_F90_PassIntRef (size), (HYPRE_BigInt **) &col_ind, (HYPRE_Complex **) &values ); *col_ind_ptr = (hypre_F90_Obj) col_ind; *values_ptr = (hypre_F90_Obj) values; } /*-------------------------------------------------------------------------- * HYPRE_CSRMatrixToParCSRMatrix *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_csrmatrixtoparcsrmatrix, HYPRE_CSRMATRIXTOPARCSRMATRIX) (hypre_F90_Comm *comm, hypre_F90_Obj *A_CSR, hypre_F90_BigIntArray *row_partitioning, hypre_F90_BigIntArray *col_partitioning, hypre_F90_Obj *matrix, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_CSRMatrixToParCSRMatrix( hypre_F90_PassComm (comm), hypre_F90_PassObj (HYPRE_CSRMatrix, A_CSR), hypre_F90_PassBigIntArray (row_partitioning), hypre_F90_PassBigIntArray (col_partitioning), hypre_F90_PassObjRef (HYPRE_ParCSRMatrix, matrix) ) ); } /*-------------------------------------------------------------------------- * HYPRE_CSRMatrixToParCSRMatrix_WithNewPartitioning *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_csrmatrixtoparcsrmatrix_withnewpartitioning, HYPRE_CSRMATRIXTOPARCSRMATRIX_WITHNEWPARTITIONING) (hypre_F90_Comm *comm, hypre_F90_Obj *A_CSR, hypre_F90_Obj *matrix, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_CSRMatrixToParCSRMatrix_WithNewPartitioning( hypre_F90_PassComm (comm), hypre_F90_PassObj (HYPRE_CSRMatrix, A_CSR), hypre_F90_PassObjRef (HYPRE_ParCSRMatrix, matrix) ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRMatrixMatvec *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_parcsrmatrixmatvec, HYPRE_PARCSRMATRIXMATVEC) ( hypre_F90_Complex *alpha, hypre_F90_Obj *A, hypre_F90_Obj *x, hypre_F90_Complex *beta, hypre_F90_Obj *y, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_ParCSRMatrixMatvec( hypre_F90_PassComplex (alpha), hypre_F90_PassObj (HYPRE_ParCSRMatrix, A), hypre_F90_PassObj (HYPRE_ParVector, x), hypre_F90_PassComplex (beta), hypre_F90_PassObj (HYPRE_ParVector, y) ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRMatrixMatvecT *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_parcsrmatrixmatvect, HYPRE_PARCSRMATRIXMATVECT) ( hypre_F90_Complex *alpha, hypre_F90_Obj *A, hypre_F90_Obj *x, hypre_F90_Complex *beta, hypre_F90_Obj *y, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_ParCSRMatrixMatvecT( hypre_F90_PassComplex (alpha), hypre_F90_PassObj (HYPRE_ParCSRMatrix, A), hypre_F90_PassObj (HYPRE_ParVector, x), hypre_F90_PassComplex (beta), hypre_F90_PassObj (HYPRE_ParVector, y) ) ); } #ifdef __cplusplus } #endif hypre-2.33.0/src/parcsr_mv/F90_HYPRE_parcsr_vector.c000066400000000000000000000176411477326011500221350ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * HYPRE_ParVector Fortran interface * *****************************************************************************/ #include "_hypre_parcsr_mv.h" #include "fortran.h" #ifdef __cplusplus extern "C" { #endif /*-------------------------------------------------------------------------- * HYPRE_ParVectorCreate *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_parvectorcreate, HYPRE_PARVECTORCREATE) ( hypre_F90_Comm *comm, hypre_F90_BigInt *global_size, hypre_F90_BigIntArray *partitioning, hypre_F90_Obj *vector, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) HYPRE_ParVectorCreate( hypre_F90_PassComm (comm), hypre_F90_PassBigInt (global_size), hypre_F90_PassBigIntArray (partitioning), hypre_F90_PassObjRef (HYPRE_ParVector, vector) ); } /*-------------------------------------------------------------------------- * HYPRE_ParMultiVectorCreate *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_parmultivectorcreate, HYPRE_PARMULTIVECTORCREATE) ( hypre_F90_Comm *comm, hypre_F90_BigInt *global_size, hypre_F90_BigIntArray *partitioning, hypre_F90_Int *number_vectors, hypre_F90_Obj *vector, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) HYPRE_ParMultiVectorCreate( hypre_F90_PassComm (comm), hypre_F90_PassBigInt (global_size), hypre_F90_PassBigIntArray (partitioning), hypre_F90_PassInt (number_vectors), hypre_F90_PassObjRef (HYPRE_ParVector, vector) ); } /*-------------------------------------------------------------------------- * HYPRE_ParVectorDestroy *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_parvectordestroy, HYPRE_PARVECTORDESTROY) ( hypre_F90_Obj *vector, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_ParVectorDestroy( hypre_F90_PassObj (HYPRE_ParVector, vector) ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParVectorInitialize *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_parvectorinitialize, HYPRE_PARVECTORINITIALIZE) ( hypre_F90_Obj *vector, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_ParVectorInitialize( hypre_F90_PassObj (HYPRE_ParVector, vector) ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParVectorRead *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_parvectorread, HYPRE_PARVECTORREAD) ( hypre_F90_Comm *comm, hypre_F90_Obj *vector, char *file_name, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_ParVectorRead( hypre_F90_PassComm (comm), (char *) file_name, hypre_F90_PassObjRef (HYPRE_ParVector, vector) ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParVectorPrint *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_parvectorprint, HYPRE_PARVECTORPRINT) ( hypre_F90_Obj *vector, char *fort_file_name, hypre_F90_Int *fort_file_name_size, hypre_F90_Int *ierr ) { HYPRE_Int i; char *c_file_name; c_file_name = hypre_CTAlloc(char, *fort_file_name_size, HYPRE_MEMORY_HOST); for (i = 0; i < *fort_file_name_size; i++) { c_file_name[i] = fort_file_name[i]; } *ierr = (hypre_F90_Int) ( HYPRE_ParVectorPrint( hypre_F90_PassObj (HYPRE_ParVector, vector), (char *) c_file_name ) ); hypre_TFree(c_file_name, HYPRE_MEMORY_HOST); } /*-------------------------------------------------------------------------- * HYPRE_ParVectorSetConstantValues *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_parvectorsetconstantvalue, HYPRE_PARVECTORSETCONSTANTVALUE) ( hypre_F90_Obj *vector, hypre_F90_Complex *value, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_ParVectorSetConstantValues( hypre_F90_PassObj (HYPRE_ParVector, vector), hypre_F90_PassComplex (value)) ); } /*-------------------------------------------------------------------------- * HYPRE_ParVectorSetRandomValues *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_parvectorsetrandomvalues, HYPRE_PARVECTORSETRANDOMVALUES) ( hypre_F90_Obj *vector, hypre_F90_Int *seed, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_ParVectorSetRandomValues( hypre_F90_PassObj (HYPRE_ParVector, vector), hypre_F90_PassInt (seed)) ); } /*-------------------------------------------------------------------------- * HYPRE_ParVectorCopy *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_parvectorcopy, HYPRE_PARVECTORCOPY) ( hypre_F90_Obj *x, hypre_F90_Obj *y, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_ParVectorCopy( hypre_F90_PassObj (HYPRE_ParVector, x), hypre_F90_PassObj (HYPRE_ParVector, y)) ); } /*-------------------------------------------------------------------------- * HYPRE_ParVectorCloneShallow *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_parvectorcloneshallow, HYPRE_PARVECTORCLONESHALLOW) ( hypre_F90_Obj *x, hypre_F90_Obj *xclone, hypre_F90_Int *ierr ) { *xclone = (hypre_F90_Obj) ( HYPRE_ParVectorCloneShallow( hypre_F90_PassObj (HYPRE_ParVector, x) ) ); *ierr = 0; } /*-------------------------------------------------------------------------- * HYPRE_ParVectorScale *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_parvectorscale, HYPRE_PARVECTORSCALE) ( hypre_F90_Complex *value, hypre_F90_Obj *x, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_ParVectorScale( hypre_F90_PassComplex (value), hypre_F90_PassObj (HYPRE_ParVector, x) ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParVectorAxpy *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_parvectoraxpy, HYPRE_PARVECTORAXPY) ( hypre_F90_Complex *value, hypre_F90_Obj *x, hypre_F90_Obj *y, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_ParVectorAxpy( hypre_F90_PassComplex (value), hypre_F90_PassObj (HYPRE_ParVector, x), hypre_F90_PassObj (HYPRE_ParVector, y) ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParVectorInnerProd *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_parvectorinnerprod, HYPRE_PARVECTORINNERPROD) (hypre_F90_Obj *x, hypre_F90_Obj *y, hypre_F90_Complex *prod, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_ParVectorInnerProd( hypre_F90_PassObj (HYPRE_ParVector, x), hypre_F90_PassObj (HYPRE_ParVector, y), hypre_F90_PassRealRef (prod) ) ); } #ifdef __cplusplus } #endif hypre-2.33.0/src/parcsr_mv/F90_par_vector.c000066400000000000000000000124641477326011500204540ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * par_vector Fortran interface * *****************************************************************************/ #include "_hypre_parcsr_mv.h" #include "fortran.h" #ifdef __cplusplus extern "C" { #endif /*-------------------------------------------------------------------------- * hypre_ParVectorSetDataOwner *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_setparvectordataowner, HYPRE_SETPARVECTORDATAOWNER) ( hypre_F90_Obj *vector, hypre_F90_Int *owns_data, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( hypre_ParVectorSetDataOwner( (hypre_ParVector *) *vector, hypre_F90_PassInt (owns_data) ) ); } /*-------------------------------------------------------------------------- * hypre_SetParVectorConstantValue *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_setparvectorconstantvalue, HYPRE_SETPARVECTORCONSTANTVALUE) ( hypre_F90_Obj *vector, hypre_F90_Complex *value, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( hypre_ParVectorSetConstantValues( (hypre_ParVector *) *vector, hypre_F90_PassComplex (value) ) ); } /*-------------------------------------------------------------------------- * hypre_ParVectorSetRandomValues *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_setparvectorrandomvalues, HYPRE_SETPARVECTORRANDOMVALUES) ( hypre_F90_Obj *vector, hypre_F90_Int *seed, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( hypre_ParVectorSetRandomValues( (hypre_ParVector *) *vector, hypre_F90_PassInt (seed) ) ); } /*-------------------------------------------------------------------------- * hypre_ParVectorCopy *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_copyparvector, HYPRE_COPYPARVECTOR) ( hypre_F90_Obj *x, hypre_F90_Obj *y, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( hypre_ParVectorCopy( (hypre_ParVector *) *x, (hypre_ParVector *) *y ) ); } /*-------------------------------------------------------------------------- * hypre_ParVectorScale *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_scaleparvector, HYPRE_SCALEPARVECTOR) ( hypre_F90_Obj *vector, hypre_F90_Complex *scale, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( hypre_ParVectorScale( hypre_F90_PassComplex (scale), (hypre_ParVector *) *vector ) ); } /*-------------------------------------------------------------------------- * hypre_ParVectorAxpy *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_paraxpy, HYPRE_PARAXPY) ( hypre_F90_Complex *a, hypre_F90_Obj *x, hypre_F90_Obj *y, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( hypre_ParVectorAxpy( hypre_F90_PassComplex (a), (hypre_ParVector *) *x, (hypre_ParVector *) *y ) ); } /*-------------------------------------------------------------------------- * hypre_ParVectorInnerProd *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_parinnerprod, HYPRE_PARINNERPROD) ( hypre_F90_Obj *x, hypre_F90_Obj *y, hypre_F90_Complex *inner_prod, hypre_F90_Int *ierr ) { *inner_prod = (hypre_F90_Complex) ( hypre_ParVectorInnerProd( (hypre_ParVector *) *x, (hypre_ParVector *) *y ) ); *ierr = 0; } /*-------------------------------------------------------------------------- * hypre_VectorToParVector *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_vectortoparvector, HYPRE_VECTORTOPARVECTOR) ( hypre_F90_Comm *comm, hypre_F90_Obj *vector, hypre_F90_BigIntArray *vec_starts, hypre_F90_Obj *par_vector, hypre_F90_Int *ierr ) { *par_vector = (hypre_F90_Obj) ( hypre_VectorToParVector( hypre_F90_PassComm (comm), (hypre_Vector *) *vector, hypre_F90_PassBigIntArray (vec_starts) ) ); *ierr = 0; } /*-------------------------------------------------------------------------- * hypre_ParVectorToVectorAll *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_parvectortovectorall, HYPRE_PARVECTORTOVECTORALL) ( hypre_F90_Obj *par_vector, hypre_F90_Obj *vector, hypre_F90_Int *ierr ) { *vector = (hypre_F90_Obj)( hypre_ParVectorToVectorAll ( (hypre_ParVector *) *par_vector )); *ierr = 0; } #ifdef __cplusplus } #endif hypre-2.33.0/src/parcsr_mv/F90_parcsr_matrix.c000066400000000000000000000032751477326011500211660ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * ParCSRMatrix Fortran interface to macros * *****************************************************************************/ #include "_hypre_parcsr_mv.h" #include "fortran.h" #ifdef __cplusplus extern "C" { #endif /*-------------------------------------------------------------------------- * hypre_ParCSRMatrixGlobalNumRows *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_parcsrmatrixglobalnumrows, HYPRE_PARCSRMATRIXGLOBALNUMROWS) ( hypre_F90_Obj *matrix, hypre_F90_BigInt *num_rows, hypre_F90_Int *ierr ) { *num_rows = (hypre_F90_BigInt) ( hypre_ParCSRMatrixGlobalNumRows( (hypre_ParCSRMatrix *) *matrix ) ); *ierr = 0; } /*-------------------------------------------------------------------------- * hypre_ParCSRMatrixRowStarts *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_parcsrmatrixrowstarts, HYPRE_PARCSRMATRIXROWSTARTS) ( hypre_F90_Obj *matrix, hypre_F90_Obj *row_starts, hypre_F90_Int *ierr ) { *row_starts = (hypre_F90_Obj) ( hypre_ParCSRMatrixRowStarts( (hypre_ParCSRMatrix *) *matrix ) ); *ierr = 0; } #ifdef __cplusplus } #endif hypre-2.33.0/src/parcsr_mv/HYPRE_parcsr_matrix.c000066400000000000000000000334171477326011500215200ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * HYPRE_ParCSRMatrix interface * *****************************************************************************/ #include "_hypre_parcsr_mv.h" /*-------------------------------------------------------------------------- * HYPRE_ParCSRMatrixCreate *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ParCSRMatrixCreate( MPI_Comm comm, HYPRE_BigInt global_num_rows, HYPRE_BigInt global_num_cols, HYPRE_BigInt *row_starts, HYPRE_BigInt *col_starts, HYPRE_Int num_cols_offd, HYPRE_Int num_nonzeros_diag, HYPRE_Int num_nonzeros_offd, HYPRE_ParCSRMatrix *matrix ) { if (!matrix) { hypre_error_in_arg(9); return hypre_error_flag; } *matrix = (HYPRE_ParCSRMatrix) hypre_ParCSRMatrixCreate(comm, global_num_rows, global_num_cols, row_starts, col_starts, num_cols_offd, num_nonzeros_diag, num_nonzeros_offd); return hypre_error_flag; } /*-------------------------------------------------------------------------- * HYPRE_ParCSRMatrixDestroy *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ParCSRMatrixDestroy( HYPRE_ParCSRMatrix matrix ) { return ( hypre_ParCSRMatrixDestroy( (hypre_ParCSRMatrix *) matrix ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRMatrixInitialize *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ParCSRMatrixInitialize( HYPRE_ParCSRMatrix matrix ) { return ( hypre_ParCSRMatrixInitialize( (hypre_ParCSRMatrix *) matrix ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRMatrixRead *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ParCSRMatrixRead( MPI_Comm comm, const char *file_name, HYPRE_ParCSRMatrix *matrix) { if (!matrix) { hypre_error_in_arg(3); return hypre_error_flag; } *matrix = (HYPRE_ParCSRMatrix) hypre_ParCSRMatrixRead( comm, file_name ); return hypre_error_flag; } /*-------------------------------------------------------------------------- * HYPRE_ParCSRMatrixPrint *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ParCSRMatrixPrint( HYPRE_ParCSRMatrix matrix, const char *file_name ) { hypre_ParCSRMatrixPrint( (hypre_ParCSRMatrix *) matrix, file_name ); return hypre_error_flag; } /*-------------------------------------------------------------------------- * HYPRE_ParCSRMatrixGetComm *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ParCSRMatrixGetComm( HYPRE_ParCSRMatrix matrix, MPI_Comm *comm ) { if (!matrix) { hypre_error_in_arg(1); return hypre_error_flag; } *comm = hypre_ParCSRMatrixComm((hypre_ParCSRMatrix *) matrix); return hypre_error_flag; } /*-------------------------------------------------------------------------- * HYPRE_ParCSRMatrixGetDims *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ParCSRMatrixGetDims( HYPRE_ParCSRMatrix matrix, HYPRE_BigInt *M, HYPRE_BigInt *N ) { if (!matrix) { hypre_error_in_arg(1); return hypre_error_flag; } *M = hypre_ParCSRMatrixGlobalNumRows((hypre_ParCSRMatrix *) matrix); *N = hypre_ParCSRMatrixGlobalNumCols((hypre_ParCSRMatrix *) matrix); return hypre_error_flag; } /*-------------------------------------------------------------------------- * HYPRE_ParCSRMatrixGetRowPartitioning *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ParCSRMatrixGetRowPartitioning( HYPRE_ParCSRMatrix matrix, HYPRE_BigInt **row_partitioning_ptr ) { HYPRE_BigInt *row_partitioning, *row_starts; HYPRE_Int num_procs, i; if (!matrix) { hypre_error_in_arg(1); return hypre_error_flag; } hypre_MPI_Comm_size(hypre_ParCSRMatrixComm((hypre_ParCSRMatrix *) matrix), &num_procs); row_starts = hypre_ParCSRMatrixRowStarts((hypre_ParCSRMatrix *) matrix); if (!row_starts) { return -1; } row_partitioning = hypre_CTAlloc(HYPRE_BigInt, num_procs + 1, HYPRE_MEMORY_HOST); for (i = 0; i < num_procs + 1; i++) { row_partitioning[i] = row_starts[i]; } *row_partitioning_ptr = row_partitioning; return hypre_error_flag; } /*-------------------------------------------------------------------------- * HYPRE_ParCSRMatrixGetGlobalRowPartitioning *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ParCSRMatrixGetGlobalRowPartitioning( HYPRE_ParCSRMatrix matrix, HYPRE_Int all_procs, HYPRE_BigInt **row_partitioning_ptr ) { MPI_Comm comm; HYPRE_Int my_id; HYPRE_BigInt *row_partitioning = NULL; if (!matrix) { hypre_error_in_arg(1); return hypre_error_flag; } comm = hypre_ParCSRMatrixComm((hypre_ParCSRMatrix *) matrix); hypre_MPI_Comm_rank(comm, &my_id); HYPRE_Int num_procs; HYPRE_BigInt row_start; hypre_MPI_Comm_size(comm, &num_procs); if (my_id == 0 || all_procs) { row_partitioning = hypre_CTAlloc(HYPRE_BigInt, num_procs + 1, HYPRE_MEMORY_HOST); } row_start = hypre_ParCSRMatrixFirstRowIndex((hypre_ParCSRMatrix *) matrix); if (all_procs) { hypre_MPI_Allgather(&row_start, 1, HYPRE_MPI_BIG_INT, row_partitioning, 1, HYPRE_MPI_BIG_INT, comm); } else { hypre_MPI_Gather(&row_start, 1, HYPRE_MPI_BIG_INT, row_partitioning, 1, HYPRE_MPI_BIG_INT, 0, comm); } if (my_id == 0 || all_procs) { row_partitioning[num_procs] = hypre_ParCSRMatrixGlobalNumRows((hypre_ParCSRMatrix *) matrix); } *row_partitioning_ptr = row_partitioning; return hypre_error_flag; } /*-------------------------------------------------------------------------- * HYPRE_ParCSRMatrixGetColPartitioning *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ParCSRMatrixGetColPartitioning( HYPRE_ParCSRMatrix matrix, HYPRE_BigInt **col_partitioning_ptr ) { HYPRE_BigInt *col_partitioning, *col_starts; HYPRE_Int num_procs, i; if (!matrix) { hypre_error_in_arg(1); return hypre_error_flag; } hypre_MPI_Comm_size(hypre_ParCSRMatrixComm((hypre_ParCSRMatrix *) matrix), &num_procs); col_starts = hypre_ParCSRMatrixColStarts((hypre_ParCSRMatrix *) matrix); if (!col_starts) { return -1; } col_partitioning = hypre_CTAlloc(HYPRE_BigInt, num_procs + 1, HYPRE_MEMORY_HOST); for (i = 0; i < num_procs + 1; i++) { col_partitioning[i] = col_starts[i]; } *col_partitioning_ptr = col_partitioning; return hypre_error_flag; } /*-------------------------------------------------------------------------- * HYPRE_ParCSRMatrixGetLocalRange *--------------------------------------------------------------------------*/ /** Returns range of rows and columns owned by this processor. Not collective. @return integer error code @param HYPRE_ParCSRMatrix matrix [IN] the matrix to be operated on. @param HYPRE_Int *row_start [OUT] the global number of the first row stored on this processor @param HYPRE_Int *row_end [OUT] the global number of the first row stored on this processor @param HYPRE_Int *col_start [OUT] the global number of the first column stored on this processor @param HYPRE_Int *col_end [OUT] the global number of the first column stored on this processor */ HYPRE_Int HYPRE_ParCSRMatrixGetLocalRange( HYPRE_ParCSRMatrix matrix, HYPRE_BigInt *row_start, HYPRE_BigInt *row_end, HYPRE_BigInt *col_start, HYPRE_BigInt *col_end ) { if (!matrix) { hypre_error_in_arg(1); return hypre_error_flag; } hypre_ParCSRMatrixGetLocalRange( (hypre_ParCSRMatrix *) matrix, row_start, row_end, col_start, col_end ); return hypre_error_flag; } /*-------------------------------------------------------------------------- * HYPRE_ParCSRMatrixGetRow *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ParCSRMatrixGetRow( HYPRE_ParCSRMatrix matrix, HYPRE_BigInt row, HYPRE_Int *size, HYPRE_BigInt **col_ind, HYPRE_Complex **values ) { if (!matrix) { hypre_error_in_arg(1); return hypre_error_flag; } hypre_ParCSRMatrixGetRow( (hypre_ParCSRMatrix *) matrix, row, size, col_ind, values ); return hypre_error_flag; } /*-------------------------------------------------------------------------- * HYPRE_ParCSRMatrixRestoreRow *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ParCSRMatrixRestoreRow( HYPRE_ParCSRMatrix matrix, HYPRE_BigInt row, HYPRE_Int *size, HYPRE_BigInt **col_ind, HYPRE_Complex **values ) { if (!matrix) { hypre_error_in_arg(1); return hypre_error_flag; } hypre_ParCSRMatrixRestoreRow( (hypre_ParCSRMatrix *) matrix, row, size, col_ind, values ); return hypre_error_flag; } /*-------------------------------------------------------------------------- * HYPRE_CSRMatrixToParCSRMatrix * Output argument (fifth argument): a new ParCSRmatrix. * Input arguments: MPI communicator, CSR matrix, and optional partitionings. * If you don't have partitionings, just pass a null pointer for the third * and fourth arguments and they will be computed. * Note that it is not possible to provide a null pointer if this is called * from Fortran code; so you must provide the paritionings from Fortran. *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_CSRMatrixToParCSRMatrix( MPI_Comm comm, HYPRE_CSRMatrix A_CSR, HYPRE_BigInt *row_partitioning, HYPRE_BigInt *col_partitioning, HYPRE_ParCSRMatrix *matrix) { if (!matrix) { hypre_error_in_arg(5); return hypre_error_flag; } *matrix = (HYPRE_ParCSRMatrix) hypre_CSRMatrixToParCSRMatrix( comm, (hypre_CSRMatrix *) A_CSR, row_partitioning, col_partitioning) ; return hypre_error_flag; } /*-------------------------------------------------------------------------- * HYPRE_CSRMatrixToParCSRMatrix_WithNewPartitioning * Output argument (third argument): a new ParCSRmatrix. * Input arguments: MPI communicator, CSR matrix. * Row and column partitionings are computed for the output matrix. *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_CSRMatrixToParCSRMatrix_WithNewPartitioning( MPI_Comm comm, HYPRE_CSRMatrix A_CSR, HYPRE_ParCSRMatrix *matrix ) { if (!matrix) { hypre_error_in_arg(3); return hypre_error_flag; } *matrix = (HYPRE_ParCSRMatrix) hypre_CSRMatrixToParCSRMatrix( comm, (hypre_CSRMatrix *) A_CSR, NULL, NULL ) ; return hypre_error_flag; } /*-------------------------------------------------------------------------- * HYPRE_ParCSRMatrixMatvec *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ParCSRMatrixMatvec( HYPRE_Complex alpha, HYPRE_ParCSRMatrix A, HYPRE_ParVector x, HYPRE_Complex beta, HYPRE_ParVector y ) { return ( hypre_ParCSRMatrixMatvec( alpha, (hypre_ParCSRMatrix *) A, (hypre_ParVector *) x, beta, (hypre_ParVector *) y) ); } /*-------------------------------------------------------------------------- * HYPRE_ParCSRMatrixMatvecT *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ParCSRMatrixMatvecT( HYPRE_Complex alpha, HYPRE_ParCSRMatrix A, HYPRE_ParVector x, HYPRE_Complex beta, HYPRE_ParVector y ) { return ( hypre_ParCSRMatrixMatvecT( alpha, (hypre_ParCSRMatrix *) A, (hypre_ParVector *) x, beta, (hypre_ParVector *) y) ); } hypre-2.33.0/src/parcsr_mv/HYPRE_parcsr_mv.h000066400000000000000000000116571477326011500206450ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * Header file for HYPRE_parcsr_mv library * *****************************************************************************/ #ifndef HYPRE_PARCSR_MV_HEADER #define HYPRE_PARCSR_MV_HEADER #include "HYPRE_utilities.h" #include "HYPRE_seq_mv.h" #ifdef __cplusplus extern "C" { #endif /*-------------------------------------------------------------------------- * Structures *--------------------------------------------------------------------------*/ struct hypre_ParCSRMatrix_struct; typedef struct hypre_ParCSRMatrix_struct *HYPRE_ParCSRMatrix; struct hypre_ParVector_struct; typedef struct hypre_ParVector_struct *HYPRE_ParVector; /*-------------------------------------------------------------------------- * Prototypes *--------------------------------------------------------------------------*/ /* HYPRE_parcsr_matrix.c */ HYPRE_Int HYPRE_ParCSRMatrixCreate( MPI_Comm comm, HYPRE_BigInt global_num_rows, HYPRE_BigInt global_num_cols, HYPRE_BigInt *row_starts, HYPRE_BigInt *col_starts, HYPRE_Int num_cols_offd, HYPRE_Int num_nonzeros_diag, HYPRE_Int num_nonzeros_offd, HYPRE_ParCSRMatrix *matrix ); HYPRE_Int HYPRE_ParCSRMatrixDestroy( HYPRE_ParCSRMatrix matrix ); HYPRE_Int HYPRE_ParCSRMatrixInitialize( HYPRE_ParCSRMatrix matrix ); HYPRE_Int HYPRE_ParCSRMatrixRead( MPI_Comm comm, const char *file_name, HYPRE_ParCSRMatrix *matrix ); HYPRE_Int HYPRE_ParCSRMatrixPrint( HYPRE_ParCSRMatrix matrix, const char *file_name ); HYPRE_Int HYPRE_ParCSRMatrixGetComm( HYPRE_ParCSRMatrix matrix, MPI_Comm *comm ); HYPRE_Int HYPRE_ParCSRMatrixGetDims( HYPRE_ParCSRMatrix matrix, HYPRE_BigInt *M, HYPRE_BigInt *N ); HYPRE_Int HYPRE_ParCSRMatrixGetRowPartitioning( HYPRE_ParCSRMatrix matrix, HYPRE_BigInt **row_partitioning_ptr ); HYPRE_Int HYPRE_ParCSRMatrixGetColPartitioning( HYPRE_ParCSRMatrix matrix, HYPRE_BigInt **col_partitioning_ptr ); HYPRE_Int HYPRE_ParCSRMatrixGetLocalRange( HYPRE_ParCSRMatrix matrix, HYPRE_BigInt *row_start, HYPRE_BigInt *row_end, HYPRE_BigInt *col_start, HYPRE_BigInt *col_end ); HYPRE_Int HYPRE_ParCSRMatrixGetRow( HYPRE_ParCSRMatrix matrix, HYPRE_BigInt row, HYPRE_Int *size, HYPRE_BigInt **col_ind, HYPRE_Complex **values ); HYPRE_Int HYPRE_ParCSRMatrixRestoreRow( HYPRE_ParCSRMatrix matrix, HYPRE_BigInt row, HYPRE_Int *size, HYPRE_BigInt **col_ind, HYPRE_Complex **values ); HYPRE_Int HYPRE_CSRMatrixToParCSRMatrix( MPI_Comm comm, HYPRE_CSRMatrix A_CSR, HYPRE_BigInt *row_partitioning, HYPRE_BigInt *col_partitioning, HYPRE_ParCSRMatrix *matrix ); HYPRE_Int HYPRE_ParCSRMatrixMatvec( HYPRE_Complex alpha, HYPRE_ParCSRMatrix A, HYPRE_ParVector x, HYPRE_Complex beta, HYPRE_ParVector y ); HYPRE_Int HYPRE_ParCSRMatrixMatvecT( HYPRE_Complex alpha, HYPRE_ParCSRMatrix A, HYPRE_ParVector x, HYPRE_Complex beta, HYPRE_ParVector y ); /* HYPRE_parcsr_vector.c */ HYPRE_Int HYPRE_ParVectorCreate( MPI_Comm comm, HYPRE_BigInt global_size, HYPRE_BigInt *partitioning, HYPRE_ParVector *vector ); HYPRE_Int HYPRE_ParVectorDestroy( HYPRE_ParVector vector ); HYPRE_Int HYPRE_ParVectorInitialize( HYPRE_ParVector vector ); HYPRE_Int HYPRE_ParVectorRead( MPI_Comm comm, const char *file_name, HYPRE_ParVector *vector ); HYPRE_Int HYPRE_ParVectorPrint( HYPRE_ParVector vector, const char *file_name ); HYPRE_Int HYPRE_ParVectorPrintBinaryIJ( HYPRE_ParVector vector, const char *file_name ); HYPRE_Int HYPRE_ParVectorSetConstantValues( HYPRE_ParVector vector, HYPRE_Complex value ); HYPRE_Int HYPRE_ParVectorSetRandomValues( HYPRE_ParVector vector, HYPRE_Int seed ); HYPRE_Int HYPRE_ParVectorCopy( HYPRE_ParVector x, HYPRE_ParVector y ); HYPRE_Int HYPRE_ParVectorScale( HYPRE_Complex value, HYPRE_ParVector x ); HYPRE_Int HYPRE_ParVectorInnerProd( HYPRE_ParVector x, HYPRE_ParVector y, HYPRE_Real *prod ); HYPRE_Int HYPRE_VectorToParVector( MPI_Comm comm, HYPRE_Vector b, HYPRE_BigInt *partitioning, HYPRE_ParVector *vector ); HYPRE_Int HYPRE_ParVectorGetValues( HYPRE_ParVector vector, HYPRE_Int num_values, HYPRE_BigInt *indices, HYPRE_Complex *values ); #ifdef __cplusplus } #endif #endif hypre-2.33.0/src/parcsr_mv/HYPRE_parcsr_vector.c000066400000000000000000000203761477326011500215160ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * HYPRE_ParVector interface * *****************************************************************************/ #include "_hypre_parcsr_mv.h" /*-------------------------------------------------------------------------- * HYPRE_ParVectorCreate *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ParVectorCreate( MPI_Comm comm, HYPRE_BigInt global_size, HYPRE_BigInt *partitioning, HYPRE_ParVector *vector ) { if (!vector) { hypre_error_in_arg(4); return hypre_error_flag; } *vector = (HYPRE_ParVector) hypre_ParVectorCreate(comm, global_size, partitioning) ; return hypre_error_flag; } /*-------------------------------------------------------------------------- * HYPRE_ParMultiVectorCreate *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ParMultiVectorCreate( MPI_Comm comm, HYPRE_BigInt global_size, HYPRE_BigInt *partitioning, HYPRE_Int number_vectors, HYPRE_ParVector *vector ) { if (!vector) { hypre_error_in_arg(5); return hypre_error_flag; } *vector = (HYPRE_ParVector) hypre_ParMultiVectorCreate( comm, global_size, partitioning, number_vectors ); return hypre_error_flag; } /*-------------------------------------------------------------------------- * HYPRE_ParVectorDestroy *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ParVectorDestroy( HYPRE_ParVector vector ) { return ( hypre_ParVectorDestroy( (hypre_ParVector *) vector ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParVectorInitialize *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ParVectorInitialize( HYPRE_ParVector vector ) { return ( hypre_ParVectorInitialize( (hypre_ParVector *) vector ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParVectorRead *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ParVectorRead( MPI_Comm comm, const char *file_name, HYPRE_ParVector *vector) { if (!vector) { hypre_error_in_arg(3); return hypre_error_flag; } *vector = (HYPRE_ParVector) hypre_ParVectorRead( comm, file_name ) ; return hypre_error_flag; } /*-------------------------------------------------------------------------- * HYPRE_ParVectorPrint *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ParVectorPrint( HYPRE_ParVector vector, const char *file_name ) { return ( hypre_ParVectorPrint( (hypre_ParVector *) vector, file_name ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParVectorPrintBinaryIJ *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ParVectorPrintBinaryIJ( HYPRE_ParVector vector, const char *file_name ) { return ( hypre_ParVectorPrintBinaryIJ( (hypre_ParVector *) vector, file_name ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParVectorSetConstantValues *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ParVectorSetConstantValues( HYPRE_ParVector vector, HYPRE_Complex value ) { return ( hypre_ParVectorSetConstantValues( (hypre_ParVector *) vector, value ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParVectorSetRandomValues *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ParVectorSetRandomValues( HYPRE_ParVector vector, HYPRE_Int seed ) { return ( hypre_ParVectorSetRandomValues( (hypre_ParVector *) vector, seed ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParVectorCopy *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ParVectorCopy( HYPRE_ParVector x, HYPRE_ParVector y ) { return ( hypre_ParVectorCopy( (hypre_ParVector *) x, (hypre_ParVector *) y ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParVectorCloneShallow *--------------------------------------------------------------------------*/ HYPRE_ParVector HYPRE_ParVectorCloneShallow( HYPRE_ParVector x ) { return ( (HYPRE_ParVector) hypre_ParVectorCloneShallow( (hypre_ParVector *) x ) ); } /*-------------------------------------------------------------------------- * HYPRE_ParVectorScale *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ParVectorScale( HYPRE_Complex value, HYPRE_ParVector x) { return ( hypre_ParVectorScale( value, (hypre_ParVector *) x) ); } /*-------------------------------------------------------------------------- * HYPRE_ParVectorAxpy *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ParVectorAxpy( HYPRE_Complex alpha, HYPRE_ParVector x, HYPRE_ParVector y ) { return hypre_ParVectorAxpy( alpha, (hypre_ParVector *)x, (hypre_ParVector *)y ); } /*-------------------------------------------------------------------------- * HYPRE_ParVectorInnerProd *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ParVectorInnerProd( HYPRE_ParVector x, HYPRE_ParVector y, HYPRE_Real *prod) { if (!x) { hypre_error_in_arg(1); return hypre_error_flag; } if (!y) { hypre_error_in_arg(2); return hypre_error_flag; } *prod = hypre_ParVectorInnerProd( (hypre_ParVector *) x, (hypre_ParVector *) y) ; return hypre_error_flag; } /*-------------------------------------------------------------------------- * HYPRE_VectorToParVector *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_VectorToParVector( MPI_Comm comm, HYPRE_Vector b, HYPRE_BigInt *partitioning, HYPRE_ParVector *vector) { if (!vector) { hypre_error_in_arg(4); return hypre_error_flag; } *vector = (HYPRE_ParVector) hypre_VectorToParVector (comm, (hypre_Vector *) b, partitioning); return hypre_error_flag; } /*-------------------------------------------------------------------------- * HYPRE_ParVectorGetValues *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ParVectorGetValues( HYPRE_ParVector vector, HYPRE_Int num_values, HYPRE_BigInt *indices, HYPRE_Complex *values) { hypre_ParVector *par_vector = (hypre_ParVector *) vector; if (!par_vector) { hypre_error_in_arg(1); return hypre_error_flag; } if (num_values < 0) { hypre_error_in_arg(2); return hypre_error_flag; } if (!values) { hypre_error_in_arg(4); return hypre_error_flag; } hypre_ParVectorGetValues(par_vector, num_values, indices, values); return hypre_error_flag; } hypre-2.33.0/src/parcsr_mv/Makefile000066400000000000000000000072611477326011500171650ustar00rootroot00000000000000# Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) include ../config/Makefile.config CINCLUDES = ${INCLUDES} ${MPIINCLUDE} C_COMPILE_FLAGS = \ -I..\ -I$(srcdir)\ -I$(srcdir)/..\ -I$(srcdir)/../blas\ -I$(srcdir)/../lapack\ -I$(srcdir)/../utilities\ -I$(srcdir)/../seq_mv\ -I$(srcdir)/../seq_block_mv\ ${CINCLUDES} HEADERS =\ HYPRE_parcsr_mv.h\ _hypre_parcsr_mv.h\ new_commpkg.h\ numbers.h\ par_chord_matrix.h\ par_csr_communication.h\ par_csr_matrix.h\ par_vector.h FILES =\ communicationT.c\ F90_HYPRE_parcsr_matrix.c\ F90_HYPRE_parcsr_vector.c\ F90_parcsr_matrix.c\ F90_par_vector.c\ HYPRE_parcsr_matrix.c\ HYPRE_parcsr_vector.c\ gen_fffc.c\ new_commpkg.c\ numbers.c\ par_csr_aat.c\ par_csr_assumed_part.c\ par_csr_bool_matop.c\ par_csr_bool_matrix.c\ par_csr_communication.c\ par_csr_filter.c\ par_csr_matop.c\ par_csr_matrix.c\ par_csr_matrix_stats.c\ par_csr_matmat.c\ par_csr_matvec.c\ par_csr_matop_marked.c\ par_csr_triplemat.c\ par_make_system.c\ par_vector.c\ par_vector_batched.c CUFILES =\ par_csr_fffc_device.c\ par_csr_filter_device.c\ par_csr_matop_device.c\ par_csr_matmat_device.c\ par_csr_matvec_device.c\ par_csr_triplemat_device.c\ par_vector_device.c EXTRA_FILES =\ parchord_to_parcsr.c DRIVER_FILES =\ driver_aat.c\ driver_boolaat.c\ driver_boolmatmul.c\ driver.c\ driver_matmul.c\ driver_mat_multivec.c\ driver_matvec.c\ driver_multivec.c COBJS = ${FILES:.c=.o} CUOBJS = ${CUFILES:.c=.obj} OBJS = ${COBJS} ${CUOBJS} DRIVER_OBJS = ${DRIVER_FILES:.c=.o} SONAME = libHYPRE_parcsr_mv-${HYPRE_RELEASE_VERSION}${HYPRE_LIB_SUFFIX} ################################################################## # Targets ################################################################## all: libHYPRE_parcsr_mv${HYPRE_LIB_SUFFIX} cp -fR $(srcdir)/HYPRE_*.h $(HYPRE_BUILD_DIR)/include cp -fR $(srcdir)/_hypre_parcsr_mv.h $(HYPRE_BUILD_DIR)/include # cp -fR libHYPRE* $(HYPRE_BUILD_DIR)/lib driver: driver.o libHYPRE_parcsr_mv${HYPRE_LIB_SUFFIX} @echo "Linking" $@ "... " ${CC} -o driver driver.o ${LFLAGS} driver_matvec: driver_matvec.o libHYPRE_parcsr_mv${HYPRE_LIB_SUFFIX} @echo "Linking" $@ "... " ${CC} -o driver_matvec driver_matvec.o ${LFLAGS} driver_matmul: driver_matmul.o libHYPRE_parcsr_mv${HYPRE_LIB_SUFFIX} @echo "Linking" $@ "... " ${CC} -o driver_matmul driver_matmul.o ${LFLAGS} driver_boolmatmul: driver_boolmatmul.o libHYPRE_parcsr_mv${HYPRE_LIB_SUFFIX} @echo "Linking" $@ "... " ${CC} -o driver_boolmatmul driver_boolmatmul.o ${LFLAGS} driver_aat: driver_aat.o libHYPRE_parcsr_mv${HYPRE_LIB_SUFFIX} @echo "Linking" $@ "... " ${CC} -o driver_aat driver_aat.o ${LFLAGS} driver_boolaat: driver_boolaat.o libHYPRE_parcsr_mv${HYPRE_LIB_SUFFIX} @echo "Linking" $@ "... " ${CC} -o driver_boolaat driver_boolaat.o ${LFLAGS} install: libHYPRE_parcsr_mv${HYPRE_LIB_SUFFIX} cp -fR $(srcdir)/HYPRE_*.h $(HYPRE_INC_INSTALL) cp -fR $(srcdir)/_hypre_parcsr_mv.h $(HYPRE_INC_INSTALL) # cp -fR libHYPRE* $(HYPRE_LIB_INSTALL) clean: rm -f *.o *.obj libHYPRE* rm -f driver driver_matvec driver_matmul rm -rf pchdir tca.map *inslog* distclean: clean ################################################################## # Rules ################################################################## libHYPRE_parcsr_mv.a: ${OBJS} @echo "Building $@ ... " ${AR} $@ ${OBJS} ${RANLIB} $@ libHYPRE_parcsr_mv.so libHYPRE_parcsr_mv.dylib: ${OBJS} @echo "Building $@ ... " ${BUILD_CC_SHARED} -o ${SONAME} ${OBJS} ${SHARED_SET_SONAME}${SONAME} ln -s -f ${SONAME} $@ ${OBJS}: ${HEADERS} ${DRIVER_OBJS}: ${HEADERS} hypre-2.33.0/src/parcsr_mv/_hypre_parcsr_mv.h000066400000000000000000002410731477326011500212410ustar00rootroot00000000000000 /*** DO NOT EDIT THIS FILE DIRECTLY (use 'headers' to generate) ***/ #ifndef hypre_PARCSR_MV_HEADER #define hypre_PARCSR_MV_HEADER #include #include "HYPRE_parcsr_mv.h" #include "_hypre_utilities.h" #include "_hypre_seq_block_mv.h" #include "seq_mv.h" #ifdef __cplusplus extern "C" { #endif /****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #ifndef HYPRE_PAR_CSR_COMMUNICATION_HEADER #define HYPRE_PAR_CSR_COMMUNICATION_HEADER /*-------------------------------------------------------------------------- * hypre_ParCSRCommPkg: * Structure containing information for doing communications *--------------------------------------------------------------------------*/ #ifdef HYPRE_USING_PERSISTENT_COMM typedef enum CommPkgJobType { HYPRE_COMM_PKG_JOB_COMPLEX = 0, HYPRE_COMM_PKG_JOB_COMPLEX_TRANSPOSE, HYPRE_COMM_PKG_JOB_INT, HYPRE_COMM_PKG_JOB_INT_TRANSPOSE, HYPRE_COMM_PKG_JOB_BIGINT, HYPRE_COMM_PKG_JOB_BIGINT_TRANSPOSE, NUM_OF_COMM_PKG_JOB_TYPE, } CommPkgJobType; #endif /*-------------------------------------------------------------------------- * hypre_ParCSRCommHandle, hypre_ParCSRPersistentCommHandle *--------------------------------------------------------------------------*/ struct _hypre_ParCSRCommPkg; typedef struct { struct _hypre_ParCSRCommPkg *comm_pkg; HYPRE_MemoryLocation send_memory_location; HYPRE_MemoryLocation recv_memory_location; HYPRE_Int num_send_bytes; HYPRE_Int num_recv_bytes; void *send_data; void *recv_data; void *send_data_buffer; void *recv_data_buffer; HYPRE_Int num_requests; hypre_MPI_Request *requests; } hypre_ParCSRCommHandle; typedef hypre_ParCSRCommHandle hypre_ParCSRPersistentCommHandle; typedef struct _hypre_ParCSRCommPkg { MPI_Comm comm; HYPRE_Int num_components; HYPRE_Int num_sends; HYPRE_Int *send_procs; HYPRE_Int *send_map_starts; HYPRE_Int *send_map_elmts; HYPRE_Int *device_send_map_elmts; HYPRE_Int num_recvs; HYPRE_Int *recv_procs; HYPRE_Int *recv_vec_starts; /* remote communication information */ hypre_MPI_Datatype *send_mpi_types; hypre_MPI_Datatype *recv_mpi_types; #ifdef HYPRE_USING_PERSISTENT_COMM hypre_ParCSRPersistentCommHandle *persistent_comm_handles[NUM_OF_COMM_PKG_JOB_TYPE]; #endif #if defined(HYPRE_USING_GPU) || defined(HYPRE_USING_DEVICE_OPENMP) /* temporary memory for matvec. cudaMalloc is expensive. alloc once and reuse */ HYPRE_Complex *tmp_data; HYPRE_Complex *buf_data; hypre_CSRMatrix *matrix_E; /* for matvecT */ #endif } hypre_ParCSRCommPkg; /*-------------------------------------------------------------------------- * Accessor macros: hypre_ParCSRCommPkg *--------------------------------------------------------------------------*/ #define hypre_ParCSRCommPkgComm(comm_pkg) (comm_pkg -> comm) #define hypre_ParCSRCommPkgNumComponents(comm_pkg) (comm_pkg -> num_components) #define hypre_ParCSRCommPkgNumSends(comm_pkg) (comm_pkg -> num_sends) #define hypre_ParCSRCommPkgSendProcs(comm_pkg) (comm_pkg -> send_procs) #define hypre_ParCSRCommPkgSendProc(comm_pkg, i) (comm_pkg -> send_procs[i]) #define hypre_ParCSRCommPkgSendMapStarts(comm_pkg) (comm_pkg -> send_map_starts) #define hypre_ParCSRCommPkgSendMapStart(comm_pkg,i) (comm_pkg -> send_map_starts[i]) #define hypre_ParCSRCommPkgSendMapElmts(comm_pkg) (comm_pkg -> send_map_elmts) #define hypre_ParCSRCommPkgDeviceSendMapElmts(comm_pkg) (comm_pkg -> device_send_map_elmts) #define hypre_ParCSRCommPkgSendMapElmt(comm_pkg,i) (comm_pkg -> send_map_elmts[i]) #define hypre_ParCSRCommPkgDeviceSendMapElmt(comm_pkg,i) (comm_pkg -> device_send_map_elmts[i]) #define hypre_ParCSRCommPkgNumRecvs(comm_pkg) (comm_pkg -> num_recvs) #define hypre_ParCSRCommPkgRecvProcs(comm_pkg) (comm_pkg -> recv_procs) #define hypre_ParCSRCommPkgRecvProc(comm_pkg, i) (comm_pkg -> recv_procs[i]) #define hypre_ParCSRCommPkgRecvVecStarts(comm_pkg) (comm_pkg -> recv_vec_starts) #define hypre_ParCSRCommPkgRecvVecStart(comm_pkg,i) (comm_pkg -> recv_vec_starts[i]) #define hypre_ParCSRCommPkgSendMPITypes(comm_pkg) (comm_pkg -> send_mpi_types) #define hypre_ParCSRCommPkgSendMPIType(comm_pkg,i) (comm_pkg -> send_mpi_types[i]) #define hypre_ParCSRCommPkgRecvMPITypes(comm_pkg) (comm_pkg -> recv_mpi_types) #define hypre_ParCSRCommPkgRecvMPIType(comm_pkg,i) (comm_pkg -> recv_mpi_types[i]) #if defined(HYPRE_USING_GPU) || defined(HYPRE_USING_DEVICE_OPENMP) #define hypre_ParCSRCommPkgTmpData(comm_pkg) ((comm_pkg) -> tmp_data) #define hypre_ParCSRCommPkgBufData(comm_pkg) ((comm_pkg) -> buf_data) #define hypre_ParCSRCommPkgMatrixE(comm_pkg) ((comm_pkg) -> matrix_E) #endif static inline HYPRE_MAYBE_UNUSED_FUNC void hypre_ParCSRCommPkgCopySendMapElmtsToDevice(hypre_ParCSRCommPkg *comm_pkg) { #if defined(HYPRE_USING_GPU) || defined(HYPRE_USING_DEVICE_OPENMP) HYPRE_Int num_sends = hypre_ParCSRCommPkgNumSends(comm_pkg); if (hypre_ParCSRCommPkgDeviceSendMapElmts(comm_pkg) == NULL) { hypre_ParCSRCommPkgDeviceSendMapElmts(comm_pkg) = hypre_TAlloc(HYPRE_Int, hypre_ParCSRCommPkgSendMapStart(comm_pkg, num_sends), HYPRE_MEMORY_DEVICE); hypre_TMemcpy(hypre_ParCSRCommPkgDeviceSendMapElmts(comm_pkg), hypre_ParCSRCommPkgSendMapElmts(comm_pkg), HYPRE_Int, hypre_ParCSRCommPkgSendMapStart(comm_pkg, num_sends), HYPRE_MEMORY_DEVICE, HYPRE_MEMORY_HOST); } #else HYPRE_UNUSED_VAR(comm_pkg); #endif } /*-------------------------------------------------------------------------- * Accessor macros: hypre_ParCSRCommHandle *--------------------------------------------------------------------------*/ #define hypre_ParCSRCommHandleCommPkg(comm_handle) (comm_handle -> comm_pkg) #define hypre_ParCSRCommHandleSendMemoryLocation(comm_handle) (comm_handle -> send_memory_location) #define hypre_ParCSRCommHandleRecvMemoryLocation(comm_handle) (comm_handle -> recv_memory_location) #define hypre_ParCSRCommHandleNumSendBytes(comm_handle) (comm_handle -> num_send_bytes) #define hypre_ParCSRCommHandleNumRecvBytes(comm_handle) (comm_handle -> num_recv_bytes) #define hypre_ParCSRCommHandleSendData(comm_handle) (comm_handle -> send_data) #define hypre_ParCSRCommHandleRecvData(comm_handle) (comm_handle -> recv_data) #define hypre_ParCSRCommHandleSendDataBuffer(comm_handle) (comm_handle -> send_data_buffer) #define hypre_ParCSRCommHandleRecvDataBuffer(comm_handle) (comm_handle -> recv_data_buffer) #define hypre_ParCSRCommHandleNumRequests(comm_handle) (comm_handle -> num_requests) #define hypre_ParCSRCommHandleRequests(comm_handle) (comm_handle -> requests) #define hypre_ParCSRCommHandleRequest(comm_handle, i) (comm_handle -> requests[i]) #endif /* HYPRE_PAR_CSR_COMMUNICATION_HEADER */ /****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #ifndef hypre_PARCSR_ASSUMED_PART #define hypre_PARCSR_ASSUMED_PART typedef struct { HYPRE_Int length; HYPRE_BigInt row_start; HYPRE_BigInt row_end; HYPRE_Int storage_length; HYPRE_Int *proc_list; HYPRE_BigInt *row_start_list; HYPRE_BigInt *row_end_list; HYPRE_Int *sort_index; } hypre_IJAssumedPart; #endif /* hypre_PARCSR_ASSUMED_PART */ /****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #ifndef hypre_NEW_COMMPKG #define hypre_NEW_COMMPKG typedef struct { HYPRE_Int length; HYPRE_Int storage_length; HYPRE_Int *id; HYPRE_Int *vec_starts; HYPRE_Int element_storage_length; HYPRE_BigInt *elements; HYPRE_Real *d_elements; /* Is this used anywhere? */ void *v_elements; } hypre_ProcListElements; #endif /* hypre_NEW_COMMPKG */ /****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * Header info for Parallel Vector data structure * *****************************************************************************/ #ifndef hypre_PAR_VECTOR_HEADER #define hypre_PAR_VECTOR_HEADER /*-------------------------------------------------------------------------- * hypre_ParVector *--------------------------------------------------------------------------*/ #ifndef HYPRE_PAR_VECTOR_STRUCT #define HYPRE_PAR_VECTOR_STRUCT #endif typedef struct hypre_ParVector_struct { MPI_Comm comm; HYPRE_BigInt global_size; HYPRE_BigInt first_index; HYPRE_BigInt last_index; HYPRE_BigInt partitioning[2]; /* stores actual length of data in local vector to allow memory * manipulations for temporary vectors*/ HYPRE_Int actual_local_size; hypre_Vector *local_vector; /* Does the Vector create/destroy `data'? */ HYPRE_Int owns_data; /* If the vector is all zeros */ HYPRE_Int all_zeros; hypre_IJAssumedPart *assumed_partition; /* only populated if this partition needed (for setting off-proc elements, for example)*/ } hypre_ParVector; /*-------------------------------------------------------------------------- * Accessor functions for the Vector structure *--------------------------------------------------------------------------*/ #define hypre_ParVectorComm(vector) ((vector) -> comm) #define hypre_ParVectorGlobalSize(vector) ((vector) -> global_size) #define hypre_ParVectorFirstIndex(vector) ((vector) -> first_index) #define hypre_ParVectorLastIndex(vector) ((vector) -> last_index) #define hypre_ParVectorPartitioning(vector) ((vector) -> partitioning) #define hypre_ParVectorActualLocalSize(vector) ((vector) -> actual_local_size) #define hypre_ParVectorOwnsData(vector) ((vector) -> owns_data) #define hypre_ParVectorAllZeros(vector) ((vector) -> all_zeros) #define hypre_ParVectorLocalVector(vector) ((vector) -> local_vector) #define hypre_ParVectorLocalSize(vector) ((vector) -> local_vector -> size) #define hypre_ParVectorLocalData(vector) ((vector) -> local_vector -> data) #define hypre_ParVectorLocalStorage(vector) ((vector) -> local_vector -> multivec_storage_method) #define hypre_ParVectorNumVectors(vector) ((vector) -> local_vector -> num_vectors) #define hypre_ParVectorEntryI(vector, i) (hypre_VectorEntryI((vector) -> local_vector, i)) #define hypre_ParVectorEntryIJ(vector, i, j) (hypre_VectorEntryIJ((vector) -> local_vector, i, j)) #define hypre_ParVectorAssumedPartition(vector) ((vector) -> assumed_partition) static inline HYPRE_MAYBE_UNUSED_FUNC HYPRE_MemoryLocation hypre_ParVectorMemoryLocation(hypre_ParVector *vector) { return hypre_VectorMemoryLocation(hypre_ParVectorLocalVector(vector)); } #endif /****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * Header info for Parallel CSR Matrix data structures * * Note: this matrix currently uses 0-based indexing. * *****************************************************************************/ #ifndef hypre_PAR_CSR_MATRIX_HEADER #define hypre_PAR_CSR_MATRIX_HEADER /*-------------------------------------------------------------------------- * Parallel CSR Matrix *--------------------------------------------------------------------------*/ #ifndef HYPRE_PAR_CSR_MATRIX_STRUCT #define HYPRE_PAR_CSR_MATRIX_STRUCT #endif typedef struct hypre_ParCSRMatrix_struct { MPI_Comm comm; HYPRE_BigInt global_num_rows; HYPRE_BigInt global_num_cols; HYPRE_BigInt global_num_rownnz; HYPRE_BigInt num_nonzeros; HYPRE_Real d_num_nonzeros; HYPRE_BigInt first_row_index; HYPRE_BigInt first_col_diag; /* need to know entire local range in case row_starts and col_starts are null (i.e., bgl) AHB 6/05*/ HYPRE_BigInt last_row_index; HYPRE_BigInt last_col_diag; hypre_CSRMatrix *diag; hypre_CSRMatrix *offd; hypre_CSRMatrix *diagT, *offdT; /* JSP: transposed matrices are created lazily and optional */ HYPRE_BigInt *col_map_offd; HYPRE_BigInt *device_col_map_offd; /* maps columns of offd to global columns */ HYPRE_BigInt row_starts[2]; /* row_starts[0] is start of local rows row_starts[1] is start of next processor's rows */ HYPRE_BigInt col_starts[2]; /* col_starts[0] is start of local columns col_starts[1] is start of next processor's columns */ hypre_ParCSRCommPkg *comm_pkg; hypre_ParCSRCommPkg *comm_pkgT; /* Does the ParCSRMatrix create/destroy `diag', `offd', `col_map_offd'? */ HYPRE_Int owns_data; /* Buffers used by GetRow to hold row currently being accessed. AJC, 4/99 */ HYPRE_BigInt *rowindices; HYPRE_Complex *rowvalues; HYPRE_Int getrowactive; hypre_IJAssumedPart *assumed_partition; HYPRE_Int owns_assumed_partition; /* Array to store ordering of local diagonal block to relax. In particular, used for triangulr matrices that are not ordered to be triangular. */ HYPRE_Int *proc_ordering; /* Save block diagonal inverse */ HYPRE_Int bdiag_size; HYPRE_Complex *bdiaginv; hypre_ParCSRCommPkg *bdiaginv_comm_pkg; #if defined(HYPRE_USING_GPU) /* these two arrays are reserveed for SoC matrices on GPUs to help build interpolation */ HYPRE_Int *soc_diag_j; HYPRE_Int *soc_offd_j; #endif } hypre_ParCSRMatrix; /*-------------------------------------------------------------------------- * Accessor functions for the Parallel CSR Matrix structure *--------------------------------------------------------------------------*/ #define hypre_ParCSRMatrixComm(matrix) ((matrix) -> comm) #define hypre_ParCSRMatrixGlobalNumRows(matrix) ((matrix) -> global_num_rows) #define hypre_ParCSRMatrixGlobalNumCols(matrix) ((matrix) -> global_num_cols) #define hypre_ParCSRMatrixGlobalNumRownnz(matrix) ((matrix) -> global_num_rownnz) #define hypre_ParCSRMatrixNumNonzeros(matrix) ((matrix) -> num_nonzeros) #define hypre_ParCSRMatrixDNumNonzeros(matrix) ((matrix) -> d_num_nonzeros) #define hypre_ParCSRMatrixFirstRowIndex(matrix) ((matrix) -> first_row_index) #define hypre_ParCSRMatrixFirstColDiag(matrix) ((matrix) -> first_col_diag) #define hypre_ParCSRMatrixLastRowIndex(matrix) ((matrix) -> last_row_index) #define hypre_ParCSRMatrixLastColDiag(matrix) ((matrix) -> last_col_diag) #define hypre_ParCSRMatrixDiag(matrix) ((matrix) -> diag) #define hypre_ParCSRMatrixOffd(matrix) ((matrix) -> offd) #define hypre_ParCSRMatrixDiagT(matrix) ((matrix) -> diagT) #define hypre_ParCSRMatrixOffdT(matrix) ((matrix) -> offdT) #define hypre_ParCSRMatrixColMapOffd(matrix) ((matrix) -> col_map_offd) #define hypre_ParCSRMatrixDeviceColMapOffd(matrix) ((matrix) -> device_col_map_offd) #define hypre_ParCSRMatrixRowStarts(matrix) ((matrix) -> row_starts) #define hypre_ParCSRMatrixColStarts(matrix) ((matrix) -> col_starts) #define hypre_ParCSRMatrixCommPkg(matrix) ((matrix) -> comm_pkg) #define hypre_ParCSRMatrixCommPkgT(matrix) ((matrix) -> comm_pkgT) #define hypre_ParCSRMatrixOwnsData(matrix) ((matrix) -> owns_data) #define hypre_ParCSRMatrixRowindices(matrix) ((matrix) -> rowindices) #define hypre_ParCSRMatrixRowvalues(matrix) ((matrix) -> rowvalues) #define hypre_ParCSRMatrixGetrowactive(matrix) ((matrix) -> getrowactive) #define hypre_ParCSRMatrixAssumedPartition(matrix) ((matrix) -> assumed_partition) #define hypre_ParCSRMatrixOwnsAssumedPartition(matrix) ((matrix) -> owns_assumed_partition) #define hypre_ParCSRMatrixProcOrdering(matrix) ((matrix) -> proc_ordering) #if defined(HYPRE_USING_GPU) #define hypre_ParCSRMatrixSocDiagJ(matrix) ((matrix) -> soc_diag_j) #define hypre_ParCSRMatrixSocOffdJ(matrix) ((matrix) -> soc_offd_j) #endif #define hypre_ParCSRMatrixNumRows(matrix) hypre_CSRMatrixNumRows(hypre_ParCSRMatrixDiag(matrix)) #define hypre_ParCSRMatrixNumCols(matrix) hypre_CSRMatrixNumCols(hypre_ParCSRMatrixDiag(matrix)) static inline HYPRE_MAYBE_UNUSED_FUNC HYPRE_MemoryLocation hypre_ParCSRMatrixMemoryLocation(hypre_ParCSRMatrix *matrix) { if (!matrix) { return HYPRE_MEMORY_UNDEFINED; } hypre_CSRMatrix *diag = hypre_ParCSRMatrixDiag(matrix); hypre_CSRMatrix *offd = hypre_ParCSRMatrixOffd(matrix); HYPRE_MemoryLocation memory_diag = diag ? hypre_CSRMatrixMemoryLocation( diag) : HYPRE_MEMORY_UNDEFINED; HYPRE_MemoryLocation memory_offd = offd ? hypre_CSRMatrixMemoryLocation( offd) : HYPRE_MEMORY_UNDEFINED; if (diag && offd) { if (memory_diag != memory_offd) { char err_msg[1024]; hypre_sprintf(err_msg, "Error: ParCSRMatrix Memory Location Diag (%d) != Offd (%d)\n", memory_diag, memory_offd); hypre_error_w_msg(HYPRE_ERROR_MEMORY, err_msg); hypre_assert(0); return HYPRE_MEMORY_UNDEFINED; } return memory_diag; } if (diag) { return memory_diag; } if (offd) { return memory_offd; } return HYPRE_MEMORY_UNDEFINED; } /*-------------------------------------------------------------------------- * Parallel CSR Boolean Matrix *--------------------------------------------------------------------------*/ typedef struct { MPI_Comm comm; HYPRE_BigInt global_num_rows; HYPRE_BigInt global_num_cols; HYPRE_BigInt first_row_index; HYPRE_BigInt first_col_diag; HYPRE_BigInt last_row_index; HYPRE_BigInt last_col_diag; hypre_CSRBooleanMatrix *diag; hypre_CSRBooleanMatrix *offd; HYPRE_BigInt *col_map_offd; HYPRE_BigInt *row_starts; HYPRE_BigInt *col_starts; hypre_ParCSRCommPkg *comm_pkg; hypre_ParCSRCommPkg *comm_pkgT; HYPRE_Int owns_data; HYPRE_Int owns_row_starts; HYPRE_Int owns_col_starts; HYPRE_BigInt num_nonzeros; HYPRE_BigInt *rowindices; HYPRE_Int getrowactive; } hypre_ParCSRBooleanMatrix; /*-------------------------------------------------------------------------- * Accessor functions for the Parallel CSR Boolean Matrix structure *--------------------------------------------------------------------------*/ #define hypre_ParCSRBooleanMatrix_Get_Comm(matrix) ((matrix)->comm) #define hypre_ParCSRBooleanMatrix_Get_GlobalNRows(matrix) ((matrix)->global_num_rows) #define hypre_ParCSRBooleanMatrix_Get_GlobalNCols(matrix) ((matrix)->global_num_cols) #define hypre_ParCSRBooleanMatrix_Get_StartRow(matrix) ((matrix)->first_row_index) #define hypre_ParCSRBooleanMatrix_Get_FirstRowIndex(matrix) ((matrix)->first_row_index) #define hypre_ParCSRBooleanMatrix_Get_FirstColDiag(matrix) ((matrix)->first_col_diag) #define hypre_ParCSRBooleanMatrix_Get_LastRowIndex(matrix) ((matrix)->last_row_index) #define hypre_ParCSRBooleanMatrix_Get_LastColDiag(matrix) ((matrix)->last_col_diag) #define hypre_ParCSRBooleanMatrix_Get_Diag(matrix) ((matrix)->diag) #define hypre_ParCSRBooleanMatrix_Get_Offd(matrix) ((matrix)->offd) #define hypre_ParCSRBooleanMatrix_Get_ColMapOffd(matrix) ((matrix)->col_map_offd) #define hypre_ParCSRBooleanMatrix_Get_RowStarts(matrix) ((matrix)->row_starts) #define hypre_ParCSRBooleanMatrix_Get_ColStarts(matrix) ((matrix)->col_starts) #define hypre_ParCSRBooleanMatrix_Get_CommPkg(matrix) ((matrix)->comm_pkg) #define hypre_ParCSRBooleanMatrix_Get_CommPkgT(matrix) ((matrix)->comm_pkgT) #define hypre_ParCSRBooleanMatrix_Get_OwnsData(matrix) ((matrix)->owns_data) #define hypre_ParCSRBooleanMatrix_Get_OwnsRowStarts(matrix) ((matrix)->owns_row_starts) #define hypre_ParCSRBooleanMatrix_Get_OwnsColStarts(matrix) ((matrix)->owns_col_starts) #define hypre_ParCSRBooleanMatrix_Get_NRows(matrix) ((matrix->diag->num_rows)) #define hypre_ParCSRBooleanMatrix_Get_NCols(matrix) ((matrix->diag->num_cols)) #define hypre_ParCSRBooleanMatrix_Get_NNZ(matrix) ((matrix)->num_nonzeros) #define hypre_ParCSRBooleanMatrix_Get_Rowindices(matrix) ((matrix)->rowindices) #define hypre_ParCSRBooleanMatrix_Get_Getrowactive(matrix) ((matrix)->getrowactive) #endif /****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * Tree structure for keeping track of numbers (e.g. column numbers) - * when you get them one at a time, in no particular order, possibly very * sparse. In a scalable manner you want to be able to store them and find * out whether a number has been stored. * All decimal numbers will fit in a tree with 10 branches (digits) * off each node. We also have a terminal "digit" to indicate that the entire * number has been seen. E.g., 1234 would be entered in a tree as: * (numbering the digits off a node as 0 1 2 3 4 5 6 7 8 9 TERM ) * root * | * - - - - 4 - - - - - - * | * - - - 3 - - - - - - - * | * - - 2 - - - - - - - - * | * - 1 - - - - - - - - - * | * - - - - - - - - - - T * * * This tree represents a number through its decimal expansion, but if needed * base depends on how the numbers encountered are distributed. Totally * The more clustered, the larger the base should be in my judgement. * *****************************************************************************/ #ifndef hypre_NUMBERS_HEADER #define hypre_NUMBERS_HEADER typedef struct hypre_NumbersNode { struct hypre_NumbersNode * digit[11]; } hypre_NumbersNode; #endif /****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * Header info for Parallel Chord Matrix data structures * *****************************************************************************/ #ifndef hypre_PAR_CHORD_MATRIX_HEADER #define hypre_PAR_CHORD_MATRIX_HEADER /*-------------------------------------------------------------------------- * Parallel Chord Matrix *--------------------------------------------------------------------------*/ typedef struct { MPI_Comm comm; /* A structure: -------------------------------------------------------- */ HYPRE_Int num_inprocessors; HYPRE_Int *inprocessor; /* receiving in idof from different (in)processors; ---------------------- */ HYPRE_Int *num_idofs_inprocessor; HYPRE_Int **idof_inprocessor; /* symmetric information: ----------------------------------------------- */ /* this can be replaces by CSR format: ---------------------------------- */ HYPRE_Int *num_inchords; HYPRE_Int **inchord_idof; HYPRE_Int **inchord_rdof; HYPRE_Complex **inchord_data; HYPRE_Int num_idofs; HYPRE_Int num_rdofs; HYPRE_Int *firstindex_idof; /* not owned by my_id; ---------------------- */ HYPRE_Int *firstindex_rdof; /* not owned by my_id; ---------------------- */ /* --------------------------- mirror information: ---------------------- */ /* participation of rdof in different processors; ----------------------- */ HYPRE_Int num_toprocessors; HYPRE_Int *toprocessor; /* rdofs to be sentto toprocessors; ------------------------------------- ---------------------------------------------------------------------- */ HYPRE_Int *num_rdofs_toprocessor; HYPRE_Int **rdof_toprocessor; } hypre_ParChordMatrix; /*-------------------------------------------------------------------------- * Accessor functions for the Parallel CSR Matrix structure *--------------------------------------------------------------------------*/ #define hypre_ParChordMatrixComm(matrix) ((matrix) -> comm) /* matrix structure: ----------------------------------------------------- */ #define hypre_ParChordMatrixNumInprocessors(matrix) ((matrix) -> num_inprocessors) #define hypre_ParChordMatrixInprocessor(matrix) ((matrix) -> inprocessor) #define hypre_ParChordMatrixNumIdofsInprocessor(matrix) ((matrix) -> num_idofs_inprocessor) #define hypre_ParChordMatrixIdofInprocessor(matrix) ((matrix) -> idof_inprocessor) #define hypre_ParChordMatrixNumInchords(matrix) ((matrix) -> num_inchords) #define hypre_ParChordMatrixInchordIdof(matrix) ((matrix) -> inchord_idof) #define hypre_ParChordMatrixInchordRdof(matrix) ((matrix) -> inchord_rdof) #define hypre_ParChordMatrixInchordData(matrix) ((matrix) -> inchord_data) #define hypre_ParChordMatrixNumIdofs(matrix) ((matrix) -> num_idofs) #define hypre_ParChordMatrixNumRdofs(matrix) ((matrix) -> num_rdofs) #define hypre_ParChordMatrixFirstindexIdof(matrix) ((matrix) -> firstindex_idof) #define hypre_ParChordMatrixFirstindexRdof(matrix) ((matrix) -> firstindex_rdof) /* participation of rdof in different processors; ---------- */ #define hypre_ParChordMatrixNumToprocessors(matrix) ((matrix) -> num_toprocessors) #define hypre_ParChordMatrixToprocessor(matrix) ((matrix) -> toprocessor) #define hypre_ParChordMatrixNumRdofsToprocessor(matrix) ((matrix) -> num_rdofs_toprocessor) #define hypre_ParChordMatrixRdofToprocessor(matrix) ((matrix) -> rdof_toprocessor) #endif /****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #ifndef hypre_PAR_MAKE_SYSTEM #define hypre_PAR_MAKE_SYSTEM typedef struct { hypre_ParCSRMatrix *A; hypre_ParVector *x; hypre_ParVector *b; } HYPRE_ParCSR_System_Problem; #endif /* hypre_PAR_MAKE_SYSTEM */ /****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /* communicationT.c */ void hypre_RowsWithColumn_original ( HYPRE_Int *rowmin, HYPRE_Int *rowmax, HYPRE_BigInt column, hypre_ParCSRMatrix *A ); void hypre_RowsWithColumn ( HYPRE_Int *rowmin, HYPRE_Int *rowmax, HYPRE_BigInt column, HYPRE_Int num_rows_diag, HYPRE_BigInt firstColDiag, HYPRE_BigInt *colMapOffd, HYPRE_Int *mat_i_diag, HYPRE_Int *mat_j_diag, HYPRE_Int *mat_i_offd, HYPRE_Int *mat_j_offd ); void hypre_MatTCommPkgCreate_core ( MPI_Comm comm, HYPRE_BigInt *col_map_offd, HYPRE_BigInt first_col_diag, HYPRE_BigInt *col_starts, HYPRE_Int num_rows_diag, HYPRE_Int num_cols_diag, HYPRE_Int num_cols_offd, HYPRE_BigInt *row_starts, HYPRE_BigInt firstColDiag, HYPRE_BigInt *colMapOffd, HYPRE_Int *mat_i_diag, HYPRE_Int *mat_j_diag, HYPRE_Int *mat_i_offd, HYPRE_Int *mat_j_offd, HYPRE_Int data, HYPRE_Int *p_num_recvs, HYPRE_Int **p_recv_procs, HYPRE_Int **p_recv_vec_starts, HYPRE_Int *p_num_sends, HYPRE_Int **p_send_procs, HYPRE_Int **p_send_map_starts, HYPRE_Int **p_send_map_elmts ); HYPRE_Int hypre_MatTCommPkgCreate ( hypre_ParCSRMatrix *A ); /* driver_aat.c */ /* driver_boolaat.c */ /* driver_boolmatmul.c */ /* driver.c */ /* driver_matmul.c */ /* driver_mat_multivec.c */ /* driver_matvec.c */ /* driver_multivec.c */ /* HYPRE_parcsr_matrix.c */ HYPRE_Int HYPRE_ParCSRMatrixCreate ( MPI_Comm comm, HYPRE_BigInt global_num_rows, HYPRE_BigInt global_num_cols, HYPRE_BigInt *row_starts, HYPRE_BigInt *col_starts, HYPRE_Int num_cols_offd, HYPRE_Int num_nonzeros_diag, HYPRE_Int num_nonzeros_offd, HYPRE_ParCSRMatrix *matrix ); HYPRE_Int HYPRE_ParCSRMatrixDestroy ( HYPRE_ParCSRMatrix matrix ); HYPRE_Int HYPRE_ParCSRMatrixInitialize ( HYPRE_ParCSRMatrix matrix ); HYPRE_Int HYPRE_ParCSRMatrixBigInitialize ( HYPRE_ParCSRMatrix matrix ); HYPRE_Int HYPRE_ParCSRMatrixRead ( MPI_Comm comm, const char *file_name, HYPRE_ParCSRMatrix *matrix ); HYPRE_Int HYPRE_ParCSRMatrixPrint ( HYPRE_ParCSRMatrix matrix, const char *file_name ); HYPRE_Int HYPRE_ParCSRMatrixGetComm ( HYPRE_ParCSRMatrix matrix, MPI_Comm *comm ); HYPRE_Int HYPRE_ParCSRMatrixGetDims ( HYPRE_ParCSRMatrix matrix, HYPRE_BigInt *M, HYPRE_BigInt *N ); HYPRE_Int HYPRE_ParCSRMatrixGetRowPartitioning ( HYPRE_ParCSRMatrix matrix, HYPRE_BigInt **row_partitioning_ptr ); HYPRE_Int HYPRE_ParCSRMatrixGetGlobalRowPartitioning ( HYPRE_ParCSRMatrix matrix, HYPRE_Int all_procs, HYPRE_BigInt **row_partitioning_ptr ); HYPRE_Int HYPRE_ParCSRMatrixGetColPartitioning ( HYPRE_ParCSRMatrix matrix, HYPRE_BigInt **col_partitioning_ptr ); HYPRE_Int HYPRE_ParCSRMatrixGetLocalRange ( HYPRE_ParCSRMatrix matrix, HYPRE_BigInt *row_start, HYPRE_BigInt *row_end, HYPRE_BigInt *col_start, HYPRE_BigInt *col_end ); HYPRE_Int HYPRE_ParCSRMatrixGetRow ( HYPRE_ParCSRMatrix matrix, HYPRE_BigInt row, HYPRE_Int *size, HYPRE_BigInt **col_ind, HYPRE_Complex **values ); HYPRE_Int HYPRE_ParCSRMatrixRestoreRow ( HYPRE_ParCSRMatrix matrix, HYPRE_BigInt row, HYPRE_Int *size, HYPRE_BigInt **col_ind, HYPRE_Complex **values ); HYPRE_Int HYPRE_CSRMatrixToParCSRMatrix ( MPI_Comm comm, HYPRE_CSRMatrix A_CSR, HYPRE_BigInt *row_partitioning, HYPRE_BigInt *col_partitioning, HYPRE_ParCSRMatrix *matrix ); HYPRE_Int HYPRE_CSRMatrixToParCSRMatrix_WithNewPartitioning ( MPI_Comm comm, HYPRE_CSRMatrix A_CSR, HYPRE_ParCSRMatrix *matrix ); HYPRE_Int HYPRE_ParCSRMatrixMatvec ( HYPRE_Complex alpha, HYPRE_ParCSRMatrix A, HYPRE_ParVector x, HYPRE_Complex beta, HYPRE_ParVector y ); HYPRE_Int HYPRE_ParCSRMatrixMatvecT ( HYPRE_Complex alpha, HYPRE_ParCSRMatrix A, HYPRE_ParVector x, HYPRE_Complex beta, HYPRE_ParVector y ); /* HYPRE_parcsr_vector.c */ HYPRE_Int HYPRE_ParVectorCreate ( MPI_Comm comm, HYPRE_BigInt global_size, HYPRE_BigInt *partitioning, HYPRE_ParVector *vector ); HYPRE_Int HYPRE_ParMultiVectorCreate ( MPI_Comm comm, HYPRE_BigInt global_size, HYPRE_BigInt *partitioning, HYPRE_Int number_vectors, HYPRE_ParVector *vector ); HYPRE_Int HYPRE_ParVectorDestroy ( HYPRE_ParVector vector ); HYPRE_Int HYPRE_ParVectorInitialize ( HYPRE_ParVector vector ); HYPRE_Int HYPRE_ParVectorRead ( MPI_Comm comm, const char *file_name, HYPRE_ParVector *vector ); HYPRE_Int HYPRE_ParVectorPrint ( HYPRE_ParVector vector, const char *file_name ); HYPRE_Int HYPRE_ParVectorPrintBinaryIJ ( HYPRE_ParVector vector, const char *file_name ); HYPRE_Int HYPRE_ParVectorSetConstantValues ( HYPRE_ParVector vector, HYPRE_Complex value ); HYPRE_Int HYPRE_ParVectorSetRandomValues ( HYPRE_ParVector vector, HYPRE_Int seed ); HYPRE_Int HYPRE_ParVectorCopy ( HYPRE_ParVector x, HYPRE_ParVector y ); HYPRE_Int hypre_ParVectorStridedCopy( hypre_ParVector *x, HYPRE_Int istride, HYPRE_Int ostride, HYPRE_Int size, HYPRE_Complex *data ); HYPRE_ParVector HYPRE_ParVectorCloneShallow ( HYPRE_ParVector x ); HYPRE_Int HYPRE_ParVectorScale ( HYPRE_Complex value, HYPRE_ParVector x ); HYPRE_Int HYPRE_ParVectorAxpy ( HYPRE_Complex alpha, HYPRE_ParVector x, HYPRE_ParVector y ); HYPRE_Int HYPRE_ParVectorInnerProd ( HYPRE_ParVector x, HYPRE_ParVector y, HYPRE_Real *prod ); HYPRE_Int HYPRE_VectorToParVector ( MPI_Comm comm, HYPRE_Vector b, HYPRE_BigInt *partitioning, HYPRE_ParVector *vector ); HYPRE_Int HYPRE_ParVectorGetValues ( HYPRE_ParVector vector, HYPRE_Int num_values, HYPRE_BigInt *indices, HYPRE_Complex *values); /* gen_fffc.c */ HYPRE_Int hypre_ParCSRMatrixGenerateFFFCHost( hypre_ParCSRMatrix *A, HYPRE_Int *CF_marker, HYPRE_BigInt *cpts_starts, hypre_ParCSRMatrix *S, hypre_ParCSRMatrix **A_FC_ptr, hypre_ParCSRMatrix **A_FF_ptr ) ; HYPRE_Int hypre_ParCSRMatrixGenerateFFFC( hypre_ParCSRMatrix *A, HYPRE_Int *CF_marker, HYPRE_BigInt *cpts_starts, hypre_ParCSRMatrix *S, hypre_ParCSRMatrix **A_FC_ptr, hypre_ParCSRMatrix **A_FF_ptr ) ; HYPRE_Int hypre_ParCSRMatrixGenerateFFFC3(hypre_ParCSRMatrix *A, HYPRE_Int *CF_marker, HYPRE_BigInt *cpts_starts, hypre_ParCSRMatrix *S, hypre_ParCSRMatrix **A_FC_ptr, hypre_ParCSRMatrix **A_FF_ptr ) ; HYPRE_Int hypre_ParCSRMatrixGenerateFFFCD3(hypre_ParCSRMatrix *A, HYPRE_Int *CF_marker, HYPRE_BigInt *cpts_starts, hypre_ParCSRMatrix *S, hypre_ParCSRMatrix **A_FC_ptr, hypre_ParCSRMatrix **A_FF_ptr, HYPRE_Real **D_lambda_ptr ) ; HYPRE_Int hypre_ParCSRMatrixGenerateFFFC3Device(hypre_ParCSRMatrix *A, HYPRE_Int *CF_marker, HYPRE_BigInt *cpts_starts, hypre_ParCSRMatrix *S, hypre_ParCSRMatrix **A_FC_ptr, hypre_ParCSRMatrix **A_FF_ptr ) ; HYPRE_Int hypre_ParCSRMatrixGenerateCFDevice( hypre_ParCSRMatrix *A, HYPRE_Int *CF_marker, HYPRE_BigInt *cpts_starts, hypre_ParCSRMatrix *S, hypre_ParCSRMatrix **ACF_ptr) ; HYPRE_Int hypre_ParCSRMatrixGenerateCCDevice( hypre_ParCSRMatrix *A, HYPRE_Int *CF_marker, HYPRE_BigInt *cpts_starts, hypre_ParCSRMatrix *S, hypre_ParCSRMatrix **ACC_ptr) ; HYPRE_Int hypre_ParCSRMatrixGenerate1DCFDevice( hypre_ParCSRMatrix *A, HYPRE_Int *CF_marker, HYPRE_BigInt *cpts_starts, hypre_ParCSRMatrix *S, hypre_ParCSRMatrix **ACX_ptr, hypre_ParCSRMatrix **AXC_ptr ) ; /* new_commpkg.c */ HYPRE_Int hypre_PrintCommpkg ( hypre_ParCSRMatrix *A, const char *file_name ); HYPRE_Int hypre_ParCSRCommPkgCreateApart_core ( MPI_Comm comm, HYPRE_BigInt *col_map_off_d, HYPRE_BigInt first_col_diag, HYPRE_Int num_cols_off_d, HYPRE_BigInt global_num_cols, HYPRE_Int *p_num_recvs, HYPRE_Int **p_recv_procs, HYPRE_Int **p_recv_vec_starts, HYPRE_Int *p_num_sends, HYPRE_Int **p_send_procs, HYPRE_Int **p_send_map_starts, HYPRE_Int **p_send_map_elements, hypre_IJAssumedPart *apart ); HYPRE_Int hypre_ParCSRCommPkgCreateApart ( MPI_Comm comm, HYPRE_BigInt *col_map_off_d, HYPRE_BigInt first_col_diag, HYPRE_Int num_cols_off_d, HYPRE_BigInt global_num_cols, hypre_IJAssumedPart *apart, hypre_ParCSRCommPkg *comm_pkg ); HYPRE_Int hypre_NewCommPkgDestroy ( hypre_ParCSRMatrix *parcsr_A ); HYPRE_Int hypre_RangeFillResponseIJDetermineRecvProcs ( void *p_recv_contact_buf, HYPRE_Int contact_size, HYPRE_Int contact_proc, void *ro, MPI_Comm comm, void **p_send_response_buf, HYPRE_Int *response_message_size ); HYPRE_Int hypre_FillResponseIJDetermineSendProcs ( void *p_recv_contact_buf, HYPRE_Int contact_size, HYPRE_Int contact_proc, void *ro, MPI_Comm comm, void **p_send_response_buf, HYPRE_Int *response_message_size ); /* numbers.c */ hypre_NumbersNode *hypre_NumbersNewNode ( void ); void hypre_NumbersDeleteNode ( hypre_NumbersNode *node ); HYPRE_Int hypre_NumbersEnter ( hypre_NumbersNode *node, const HYPRE_Int n ); HYPRE_Int hypre_NumbersNEntered ( hypre_NumbersNode *node ); HYPRE_Int hypre_NumbersQuery ( hypre_NumbersNode *node, const HYPRE_Int n ); HYPRE_Int *hypre_NumbersArray ( hypre_NumbersNode *node ); /* parchord_to_parcsr.c */ void hypre_ParChordMatrix_RowStarts ( hypre_ParChordMatrix *Ac, MPI_Comm comm, HYPRE_BigInt **row_starts, HYPRE_BigInt *global_num_cols ); HYPRE_Int hypre_ParChordMatrixToParCSRMatrix ( hypre_ParChordMatrix *Ac, MPI_Comm comm, hypre_ParCSRMatrix **pAp ); HYPRE_Int hypre_ParCSRMatrixToParChordMatrix ( hypre_ParCSRMatrix *Ap, MPI_Comm comm, hypre_ParChordMatrix **pAc ); /* par_csr_aat.c */ void hypre_ParAat_RowSizes ( HYPRE_Int **C_diag_i, HYPRE_Int **C_offd_i, HYPRE_Int *B_marker, HYPRE_Int *A_diag_i, HYPRE_Int *A_diag_j, HYPRE_Int *A_offd_i, HYPRE_Int *A_offd_j, HYPRE_BigInt *A_col_map_offd, HYPRE_Int *A_ext_i, HYPRE_BigInt *A_ext_j, HYPRE_BigInt *A_ext_row_map, HYPRE_Int *C_diag_size, HYPRE_Int *C_offd_size, HYPRE_Int num_rows_diag_A, HYPRE_Int num_cols_offd_A, HYPRE_Int num_rows_A_ext, HYPRE_BigInt first_col_diag_A, HYPRE_BigInt first_row_index_A ); hypre_ParCSRMatrix *hypre_ParCSRAAt ( hypre_ParCSRMatrix *A ); hypre_CSRMatrix *hypre_ParCSRMatrixExtractAExt ( hypre_ParCSRMatrix *A, HYPRE_Int data, HYPRE_BigInt **pA_ext_row_map ); /* par_csr_assumed_part.c */ HYPRE_Int hypre_LocateAssumedPartition ( MPI_Comm comm, HYPRE_BigInt row_start, HYPRE_BigInt row_end, HYPRE_BigInt global_first_row, HYPRE_BigInt global_num_rows, hypre_IJAssumedPart *part, HYPRE_Int myid ); hypre_IJAssumedPart *hypre_AssumedPartitionCreate ( MPI_Comm comm, HYPRE_BigInt global_num, HYPRE_BigInt start, HYPRE_BigInt end ); HYPRE_Int hypre_ParCSRMatrixCreateAssumedPartition ( hypre_ParCSRMatrix *matrix ); HYPRE_Int hypre_AssumedPartitionDestroy ( hypre_IJAssumedPart *apart ); HYPRE_Int hypre_GetAssumedPartitionProcFromRow ( MPI_Comm comm, HYPRE_BigInt row, HYPRE_BigInt global_first_row, HYPRE_BigInt global_num_rows, HYPRE_Int *proc_id ); HYPRE_Int hypre_GetAssumedPartitionRowRange ( MPI_Comm comm, HYPRE_Int proc_id, HYPRE_BigInt global_first_row, HYPRE_BigInt global_num_rows, HYPRE_BigInt *row_start, HYPRE_BigInt *row_end ); HYPRE_Int hypre_ParVectorCreateAssumedPartition ( hypre_ParVector *vector ); /* par_csr_bool_matop.c */ hypre_ParCSRBooleanMatrix *hypre_ParBooleanMatmul ( hypre_ParCSRBooleanMatrix *A, hypre_ParCSRBooleanMatrix *B ); hypre_CSRBooleanMatrix *hypre_ParCSRBooleanMatrixExtractBExt ( hypre_ParCSRBooleanMatrix *B, hypre_ParCSRBooleanMatrix *A ); hypre_CSRBooleanMatrix *hypre_ParCSRBooleanMatrixExtractAExt ( hypre_ParCSRBooleanMatrix *A, HYPRE_BigInt **pA_ext_row_map ); hypre_ParCSRBooleanMatrix *hypre_ParBooleanAAt ( hypre_ParCSRBooleanMatrix *A ); HYPRE_Int hypre_BooleanMatTCommPkgCreate ( hypre_ParCSRBooleanMatrix *A ); HYPRE_Int hypre_BooleanMatvecCommPkgCreate ( hypre_ParCSRBooleanMatrix *A ); /* par_csr_bool_matrix.c */ hypre_CSRBooleanMatrix *hypre_CSRBooleanMatrixCreate ( HYPRE_Int num_rows, HYPRE_Int num_cols, HYPRE_Int num_nonzeros ); HYPRE_Int hypre_CSRBooleanMatrixDestroy ( hypre_CSRBooleanMatrix *matrix ); HYPRE_Int hypre_CSRBooleanMatrixInitialize ( hypre_CSRBooleanMatrix *matrix ); HYPRE_Int hypre_CSRBooleanMatrixBigInitialize ( hypre_CSRBooleanMatrix *matrix ); HYPRE_Int hypre_CSRBooleanMatrixSetDataOwner ( hypre_CSRBooleanMatrix *matrix, HYPRE_Int owns_data ); HYPRE_Int hypre_CSRBooleanMatrixSetBigDataOwner ( hypre_CSRBooleanMatrix *matrix, HYPRE_Int owns_data ); hypre_CSRBooleanMatrix *hypre_CSRBooleanMatrixRead ( const char *file_name ); HYPRE_Int hypre_CSRBooleanMatrixPrint ( hypre_CSRBooleanMatrix *matrix, const char *file_name ); hypre_ParCSRBooleanMatrix *hypre_ParCSRBooleanMatrixCreate ( MPI_Comm comm, HYPRE_BigInt global_num_rows, HYPRE_BigInt global_num_cols, HYPRE_BigInt *row_starts, HYPRE_BigInt *col_starts, HYPRE_Int num_cols_offd, HYPRE_Int num_nonzeros_diag, HYPRE_Int num_nonzeros_offd ); HYPRE_Int hypre_ParCSRBooleanMatrixDestroy ( hypre_ParCSRBooleanMatrix *matrix ); HYPRE_Int hypre_ParCSRBooleanMatrixInitialize ( hypre_ParCSRBooleanMatrix *matrix ); HYPRE_Int hypre_ParCSRBooleanMatrixSetNNZ ( hypre_ParCSRBooleanMatrix *matrix ); HYPRE_Int hypre_ParCSRBooleanMatrixSetDataOwner ( hypre_ParCSRBooleanMatrix *matrix, HYPRE_Int owns_data ); HYPRE_Int hypre_ParCSRBooleanMatrixSetRowStartsOwner ( hypre_ParCSRBooleanMatrix *matrix, HYPRE_Int owns_row_starts ); HYPRE_Int hypre_ParCSRBooleanMatrixSetColStartsOwner ( hypre_ParCSRBooleanMatrix *matrix, HYPRE_Int owns_col_starts ); hypre_ParCSRBooleanMatrix *hypre_ParCSRBooleanMatrixRead ( MPI_Comm comm, const char *file_name ); HYPRE_Int hypre_ParCSRBooleanMatrixPrint ( hypre_ParCSRBooleanMatrix *matrix, const char *file_name ); HYPRE_Int hypre_ParCSRBooleanMatrixPrintIJ ( hypre_ParCSRBooleanMatrix *matrix, const char *filename ); HYPRE_Int hypre_ParCSRBooleanMatrixGetLocalRange ( hypre_ParCSRBooleanMatrix *matrix, HYPRE_BigInt *row_start, HYPRE_BigInt *row_end, HYPRE_BigInt *col_start, HYPRE_BigInt *col_end ); HYPRE_Int hypre_ParCSRBooleanMatrixGetRow ( hypre_ParCSRBooleanMatrix *mat, HYPRE_BigInt row, HYPRE_Int *size, HYPRE_BigInt **col_ind ); HYPRE_Int hypre_ParCSRBooleanMatrixRestoreRow ( hypre_ParCSRBooleanMatrix *matrix, HYPRE_BigInt row, HYPRE_Int *size, HYPRE_BigInt **col_ind ); HYPRE_Int hypre_BuildCSRBooleanMatrixMPIDataType ( HYPRE_Int num_nonzeros, HYPRE_Int num_rows, HYPRE_Int *a_i, HYPRE_Int *a_j, hypre_MPI_Datatype *csr_matrix_datatype ); hypre_ParCSRBooleanMatrix *hypre_CSRBooleanMatrixToParCSRBooleanMatrix ( MPI_Comm comm, hypre_CSRBooleanMatrix *A, HYPRE_BigInt *row_starts, HYPRE_BigInt *col_starts ); HYPRE_Int hypre_BooleanGenerateDiagAndOffd ( hypre_CSRBooleanMatrix *A, hypre_ParCSRBooleanMatrix *matrix, HYPRE_BigInt first_col_diag, HYPRE_BigInt last_col_diag ); /* par_csr_communication.c */ hypre_ParCSRCommHandle *hypre_ParCSRCommHandleCreate ( HYPRE_Int job, hypre_ParCSRCommPkg *comm_pkg, void *send_data, void *recv_data ); hypre_ParCSRCommHandle *hypre_ParCSRCommHandleCreate_v2 ( HYPRE_Int job, hypre_ParCSRCommPkg *comm_pkg, HYPRE_MemoryLocation send_memory_location, void *send_data_in, HYPRE_MemoryLocation recv_memory_location, void *recv_data_in ); HYPRE_Int hypre_ParCSRCommHandleDestroy ( hypre_ParCSRCommHandle *comm_handle ); void hypre_ParCSRCommPkgCreate_core ( MPI_Comm comm, HYPRE_BigInt *col_map_offd, HYPRE_BigInt first_col_diag, HYPRE_BigInt *col_starts, HYPRE_Int num_cols_diag, HYPRE_Int num_cols_offd, HYPRE_Int *p_num_recvs, HYPRE_Int **p_recv_procs, HYPRE_Int **p_recv_vec_starts, HYPRE_Int *p_num_sends, HYPRE_Int **p_send_procs, HYPRE_Int **p_send_map_starts, HYPRE_Int **p_send_map_elmts ); HYPRE_Int hypre_ParCSRCommPkgCreate(MPI_Comm comm, HYPRE_BigInt *col_map_offd, HYPRE_BigInt first_col_diag, HYPRE_BigInt *col_starts, HYPRE_Int num_cols_diag, HYPRE_Int num_cols_offd, hypre_ParCSRCommPkg *comm_pkg); HYPRE_Int hypre_ParCSRCommPkgCreateAndFill ( MPI_Comm comm, HYPRE_Int num_recvs, HYPRE_Int *recv_procs, HYPRE_Int *recv_vec_starts, HYPRE_Int num_sends, HYPRE_Int *send_procs, HYPRE_Int *send_map_starts, HYPRE_Int *send_map_elmts, hypre_ParCSRCommPkg **comm_pkg_ptr ); HYPRE_Int hypre_ParCSRCommPkgUpdateVecStarts ( hypre_ParCSRCommPkg *comm_pkg, HYPRE_Int num_components_in, HYPRE_Int vecstride, HYPRE_Int idxstride ); HYPRE_Int hypre_MatvecCommPkgCreate ( hypre_ParCSRMatrix *A ); HYPRE_Int hypre_MatvecCommPkgDestroy ( hypre_ParCSRCommPkg *comm_pkg ); HYPRE_Int hypre_BuildCSRMatrixMPIDataType ( HYPRE_Int num_nonzeros, HYPRE_Int num_rows, HYPRE_Complex *a_data, HYPRE_Int *a_i, HYPRE_Int *a_j, hypre_MPI_Datatype *csr_matrix_datatype ); HYPRE_Int hypre_BuildCSRJDataType ( HYPRE_Int num_nonzeros, HYPRE_Complex *a_data, HYPRE_Int *a_j, hypre_MPI_Datatype *csr_jdata_datatype ); HYPRE_Int hypre_ParCSRFindExtendCommPkg(MPI_Comm comm, HYPRE_BigInt global_num_cols, HYPRE_BigInt first_col_diag, HYPRE_Int num_cols_diag, HYPRE_BigInt *col_starts, hypre_IJAssumedPart *apart, HYPRE_Int indices_len, HYPRE_BigInt *indices, hypre_ParCSRCommPkg **extend_comm_pkg); /* par_csr_filter.c */ HYPRE_Int hypre_ParCSRMatrixBlkFilter(hypre_ParCSRMatrix *A, HYPRE_Int block_size, hypre_ParCSRMatrix **B_ptr); /* par_csr_matop.c */ HYPRE_Int hypre_ParCSRMatrixScale(hypre_ParCSRMatrix *A, HYPRE_Complex scalar); void hypre_ParMatmul_RowSizes ( HYPRE_MemoryLocation memory_location, HYPRE_Int **C_diag_i, HYPRE_Int **C_offd_i, HYPRE_Int *rownnz_A, HYPRE_Int *A_diag_i, HYPRE_Int *A_diag_j, HYPRE_Int *A_offd_i, HYPRE_Int *A_offd_j, HYPRE_Int *B_diag_i, HYPRE_Int *B_diag_j, HYPRE_Int *B_offd_i, HYPRE_Int *B_offd_j, HYPRE_Int *B_ext_diag_i, HYPRE_Int *B_ext_diag_j, HYPRE_Int *B_ext_offd_i, HYPRE_Int *B_ext_offd_j, HYPRE_Int *map_B_to_C, HYPRE_Int *C_diag_size, HYPRE_Int *C_offd_size, HYPRE_Int num_rownnz_A, HYPRE_Int num_rows_diag_A, HYPRE_Int num_cols_offd_A, HYPRE_Int allsquare, HYPRE_Int num_cols_diag_B, HYPRE_Int num_cols_offd_B, HYPRE_Int num_cols_offd_C ); hypre_ParCSRMatrix *hypre_ParMatmul ( hypre_ParCSRMatrix *A, hypre_ParCSRMatrix *B ); void hypre_ParCSRMatrixExtractBExt_Arrays ( HYPRE_Int **pB_ext_i, HYPRE_BigInt **pB_ext_j, HYPRE_Complex **pB_ext_data, HYPRE_BigInt **pB_ext_row_map, HYPRE_Int *num_nonzeros, HYPRE_Int data, HYPRE_Int find_row_map, MPI_Comm comm, hypre_ParCSRCommPkg *comm_pkg, HYPRE_Int num_cols_B, HYPRE_Int num_recvs, HYPRE_Int num_sends, HYPRE_BigInt first_col_diag, HYPRE_BigInt *row_starts, HYPRE_Int *recv_vec_starts, HYPRE_Int *send_map_starts, HYPRE_Int *send_map_elmts, HYPRE_Int *diag_i, HYPRE_Int *diag_j, HYPRE_Int *offd_i, HYPRE_Int *offd_j, HYPRE_BigInt *col_map_offd, HYPRE_Real *diag_data, HYPRE_Real *offd_data ); void hypre_ParCSRMatrixExtractBExt_Arrays_Overlap ( HYPRE_Int **pB_ext_i, HYPRE_BigInt **pB_ext_j, HYPRE_Complex **pB_ext_data, HYPRE_BigInt **pB_ext_row_map, HYPRE_Int *num_nonzeros, HYPRE_Int data, HYPRE_Int find_row_map, MPI_Comm comm, hypre_ParCSRCommPkg *comm_pkg, HYPRE_Int num_cols_B, HYPRE_Int num_recvs, HYPRE_Int num_sends, HYPRE_BigInt first_col_diag, HYPRE_BigInt *row_starts, HYPRE_Int *recv_vec_starts, HYPRE_Int *send_map_starts, HYPRE_Int *send_map_elmts, HYPRE_Int *diag_i, HYPRE_Int *diag_j, HYPRE_Int *offd_i, HYPRE_Int *offd_j, HYPRE_BigInt *col_map_offd, HYPRE_Real *diag_data, HYPRE_Real *offd_data, hypre_ParCSRCommHandle **comm_handle_idx, hypre_ParCSRCommHandle **comm_handle_data, HYPRE_Int *CF_marker, HYPRE_Int *CF_marker_offd, HYPRE_Int skip_fine, HYPRE_Int skip_same_sign ); hypre_CSRMatrix *hypre_ParCSRMatrixExtractBExt ( hypre_ParCSRMatrix *B, hypre_ParCSRMatrix *A, HYPRE_Int data ); hypre_CSRMatrix *hypre_ParCSRMatrixExtractBExt_Overlap ( hypre_ParCSRMatrix *B, hypre_ParCSRMatrix *A, HYPRE_Int data, hypre_ParCSRCommHandle **comm_handle_idx, hypre_ParCSRCommHandle **comm_handle_data, HYPRE_Int *CF_marker, HYPRE_Int *CF_marker_offd, HYPRE_Int skip_fine, HYPRE_Int skip_same_sign ); HYPRE_Int hypre_ParCSRMatrixExtractBExtDeviceInit( hypre_ParCSRMatrix *B, hypre_ParCSRMatrix *A, HYPRE_Int want_data, void **request_ptr); hypre_CSRMatrix* hypre_ParCSRMatrixExtractBExtDeviceWait(void *request); hypre_CSRMatrix* hypre_ParCSRMatrixExtractBExtDevice( hypre_ParCSRMatrix *B, hypre_ParCSRMatrix *A, HYPRE_Int want_data ); HYPRE_Int hypre_ParCSRMatrixLocalTranspose( hypre_ParCSRMatrix *A ); HYPRE_Int hypre_ParCSRMatrixTranspose ( hypre_ParCSRMatrix *A, hypre_ParCSRMatrix **AT_ptr, HYPRE_Int data ); HYPRE_Int hypre_ParCSRMatrixTransposeHost ( hypre_ParCSRMatrix *A, hypre_ParCSRMatrix **AT_ptr, HYPRE_Int data ); HYPRE_Int hypre_ParCSRMatrixTransposeDevice ( hypre_ParCSRMatrix *A, hypre_ParCSRMatrix **AT_ptr, HYPRE_Int data ); void hypre_ParCSRMatrixGenSpanningTree ( hypre_ParCSRMatrix *G_csr, HYPRE_Int **indices, HYPRE_Int G_type ); void hypre_ParCSRMatrixExtractSubmatrices ( hypre_ParCSRMatrix *A_csr, HYPRE_Int *indices2, hypre_ParCSRMatrix ***submatrices ); void hypre_ParCSRMatrixExtractRowSubmatrices ( hypre_ParCSRMatrix *A_csr, HYPRE_Int *indices2, hypre_ParCSRMatrix ***submatrices ); HYPRE_Complex hypre_ParCSRMatrixLocalSumElts ( hypre_ParCSRMatrix *A ); HYPRE_Int hypre_ParCSRMatrixAminvDB ( hypre_ParCSRMatrix *A, hypre_ParCSRMatrix *B, HYPRE_Complex *d, hypre_ParCSRMatrix **C_ptr ); hypre_ParCSRMatrix *hypre_ParTMatmul ( hypre_ParCSRMatrix *A, hypre_ParCSRMatrix *B ); HYPRE_Real hypre_ParCSRMatrixFnorm( hypre_ParCSRMatrix *A ); HYPRE_Int hypre_ParCSRMatrixInfNorm ( hypre_ParCSRMatrix *A, HYPRE_Real *norm ); HYPRE_Int hypre_ExchangeExternalRowsInit( hypre_CSRMatrix *B_ext, hypre_ParCSRCommPkg *comm_pkg_A, void **request_ptr); hypre_CSRMatrix* hypre_ExchangeExternalRowsWait(void *vequest); HYPRE_Int hypre_ExchangeExternalRowsDeviceInit( hypre_CSRMatrix *B_ext, hypre_ParCSRCommPkg *comm_pkg_A, HYPRE_Int want_data, void **request_ptr); hypre_CSRMatrix* hypre_ExchangeExternalRowsDeviceWait(void *vrequest); HYPRE_Int hypre_ParCSRMatrixGenerateFFFCDevice( hypre_ParCSRMatrix *A, HYPRE_Int *CF_marker, HYPRE_BigInt *cpts_starts, hypre_ParCSRMatrix *S, hypre_ParCSRMatrix **A_FC_ptr, hypre_ParCSRMatrix **A_FF_ptr ); HYPRE_Int hypre_ParCSRMatrixGenerateFFCFDevice( hypre_ParCSRMatrix *A, HYPRE_Int *CF_marker, HYPRE_BigInt *cpts_starts, hypre_ParCSRMatrix *S, hypre_ParCSRMatrix **A_CF_ptr, hypre_ParCSRMatrix **A_FF_ptr ); HYPRE_Int hypre_ParCSRMatrixGenerateCCCFDevice( hypre_ParCSRMatrix *A, HYPRE_Int *CF_marker, HYPRE_BigInt *cpts_starts, hypre_ParCSRMatrix *S, hypre_ParCSRMatrix **A_CF_ptr, hypre_ParCSRMatrix **A_CC_ptr ); hypre_CSRMatrix* hypre_ConcatDiagAndOffdDevice(hypre_ParCSRMatrix *A); HYPRE_Int hypre_ConcatDiagOffdAndExtDevice(hypre_ParCSRMatrix *A, hypre_CSRMatrix *E, hypre_CSRMatrix **B_ptr, HYPRE_Int *num_cols_offd_ptr, HYPRE_BigInt **cols_map_offd_ptr); HYPRE_Int hypre_ParCSRMatrixGetRowDevice( hypre_ParCSRMatrix *mat, HYPRE_BigInt row, HYPRE_Int *size, HYPRE_BigInt **col_ind, HYPRE_Complex **values ); HYPRE_Int hypre_ParCSRDiagScaleVector( hypre_ParCSRMatrix *par_A, hypre_ParVector *par_y, hypre_ParVector *par_x ); HYPRE_Int hypre_ParCSRDiagScaleVectorHost( hypre_ParCSRMatrix *par_A, hypre_ParVector *par_y, hypre_ParVector *par_x ); HYPRE_Int hypre_ParCSRDiagScaleVectorDevice( hypre_ParCSRMatrix *par_A, hypre_ParVector *par_y, hypre_ParVector *par_x ); HYPRE_Int hypre_ParCSRMatrixDropSmallEntries( hypre_ParCSRMatrix *A, HYPRE_Real tol, HYPRE_Int type); HYPRE_Int hypre_ParCSRMatrixDropSmallEntriesHost( hypre_ParCSRMatrix *A, HYPRE_Real tol, HYPRE_Int type); HYPRE_Int hypre_ParCSRMatrixDropSmallEntriesDevice( hypre_ParCSRMatrix *A, HYPRE_Complex tol, HYPRE_Int type); HYPRE_Int hypre_ParCSRCommPkgCreateMatrixE( hypre_ParCSRCommPkg *comm_pkg, HYPRE_Int local_ncols ); #ifdef HYPRE_USING_PERSISTENT_COMM hypre_ParCSRPersistentCommHandle* hypre_ParCSRPersistentCommHandleCreate(HYPRE_Int job, hypre_ParCSRCommPkg *comm_pkg); hypre_ParCSRPersistentCommHandle* hypre_ParCSRCommPkgGetPersistentCommHandle(HYPRE_Int job, hypre_ParCSRCommPkg *comm_pkg); void hypre_ParCSRPersistentCommHandleDestroy(hypre_ParCSRPersistentCommHandle *comm_handle); void hypre_ParCSRPersistentCommHandleStart(hypre_ParCSRPersistentCommHandle *comm_handle, HYPRE_MemoryLocation send_memory_location, void *send_data); void hypre_ParCSRPersistentCommHandleWait(hypre_ParCSRPersistentCommHandle *comm_handle, HYPRE_MemoryLocation recv_memory_location, void *recv_data); #endif HYPRE_Int hypre_ParcsrGetExternalRowsInit( hypre_ParCSRMatrix *A, HYPRE_Int indices_len, HYPRE_BigInt *indices, hypre_ParCSRCommPkg *comm_pkg, HYPRE_Int want_data, void **request_ptr); hypre_CSRMatrix* hypre_ParcsrGetExternalRowsWait(void *vrequest); HYPRE_Int hypre_ParcsrGetExternalRowsDeviceInit( hypre_ParCSRMatrix *A, HYPRE_Int indices_len, HYPRE_BigInt *indices, hypre_ParCSRCommPkg *comm_pkg, HYPRE_Int want_data, void **request_ptr); hypre_CSRMatrix* hypre_ParcsrGetExternalRowsDeviceWait(void *vrequest); HYPRE_Int hypre_ParvecBdiagInvScal( hypre_ParVector *b, HYPRE_Int blockSize, hypre_ParVector **bs, hypre_ParCSRMatrix *A); HYPRE_Int hypre_ParcsrBdiagInvScal( hypre_ParCSRMatrix *A, HYPRE_Int blockSize, hypre_ParCSRMatrix **As); HYPRE_Int hypre_ParCSRMatrixExtractSubmatrixFC( hypre_ParCSRMatrix *A, HYPRE_Int *CF_marker, HYPRE_BigInt *cpts_starts, const char *job, hypre_ParCSRMatrix **B_ptr, HYPRE_Real strength_thresh); HYPRE_Int hypre_ParCSRMatrixDiagScale( hypre_ParCSRMatrix *par_A, hypre_ParVector *par_ld, hypre_ParVector *par_rd ); HYPRE_Int hypre_ParCSRMatrixReorder ( hypre_ParCSRMatrix *A ); HYPRE_Int hypre_ParCSRMatrixAdd( HYPRE_Complex alpha, hypre_ParCSRMatrix *A, HYPRE_Complex beta, hypre_ParCSRMatrix *B, hypre_ParCSRMatrix **Cout); HYPRE_Int hypre_ParCSRMatrixAddHost( HYPRE_Complex alpha, hypre_ParCSRMatrix *A, HYPRE_Complex beta, hypre_ParCSRMatrix *B, hypre_ParCSRMatrix **Cout); HYPRE_Int hypre_ParCSRMatrixAddDevice( HYPRE_Complex alpha, hypre_ParCSRMatrix *A, HYPRE_Complex beta, hypre_ParCSRMatrix *B, hypre_ParCSRMatrix **Cout); HYPRE_Int hypre_ParCSRMatrixBlockColSum( hypre_ParCSRMatrix *A, HYPRE_Int row_major, HYPRE_Int num_rows_block, HYPRE_Int num_cols_block, hypre_DenseBlockMatrix **B_ptr ); HYPRE_Int hypre_ParCSRMatrixColSum( hypre_ParCSRMatrix *A, hypre_ParVector **B_ptr ); /* par_csr_filter_device.c */ HYPRE_Int hypre_ParCSRMatrixBlkFilterDevice(hypre_ParCSRMatrix *A, HYPRE_Int block_size, hypre_ParCSRMatrix **B_ptr); /* par_csr_matop_device.c */ HYPRE_Int hypre_ParCSRMatrixDiagScaleDevice ( hypre_ParCSRMatrix *par_A, hypre_ParVector *par_ld, hypre_ParVector *par_rd ); HYPRE_Int hypre_ParCSRMatrixCompressOffdMapDevice(hypre_ParCSRMatrix *A); HYPRE_Int hypre_ParCSRMatrixCompressOffdMap(hypre_ParCSRMatrix *A); /* par_csr_matop_marked.c */ void hypre_ParMatmul_RowSizes_Marked ( HYPRE_Int **C_diag_i, HYPRE_Int **C_offd_i, HYPRE_Int **B_marker, HYPRE_Int *A_diag_i, HYPRE_Int *A_diag_j, HYPRE_Int *A_offd_i, HYPRE_Int *A_offd_j, HYPRE_Int *B_diag_i, HYPRE_Int *B_diag_j, HYPRE_Int *B_offd_i, HYPRE_Int *B_offd_j, HYPRE_Int *B_ext_diag_i, HYPRE_Int *B_ext_diag_j, HYPRE_Int *B_ext_offd_i, HYPRE_Int *B_ext_offd_j, HYPRE_Int *map_B_to_C, HYPRE_Int *C_diag_size, HYPRE_Int *C_offd_size, HYPRE_Int num_rows_diag_A, HYPRE_Int num_cols_offd_A, HYPRE_Int allsquare, HYPRE_Int num_cols_diag_B, HYPRE_Int num_cols_offd_B, HYPRE_Int num_cols_offd_C, HYPRE_Int *CF_marker, HYPRE_Int *dof_func, HYPRE_Int *dof_func_offd ); hypre_ParCSRMatrix *hypre_ParMatmul_FC ( hypre_ParCSRMatrix *A, hypre_ParCSRMatrix *P, HYPRE_Int *CF_marker, HYPRE_Int *dof_func, HYPRE_Int *dof_func_offd ); void hypre_ParMatScaleDiagInv_F ( hypre_ParCSRMatrix *C, hypre_ParCSRMatrix *A, HYPRE_Complex weight, HYPRE_Int *CF_marker ); hypre_ParCSRMatrix *hypre_ParMatMinus_F ( hypre_ParCSRMatrix *P, hypre_ParCSRMatrix *C, HYPRE_Int *CF_marker ); void hypre_ParCSRMatrixZero_F ( hypre_ParCSRMatrix *P, HYPRE_Int *CF_marker ); void hypre_ParCSRMatrixCopy_C ( hypre_ParCSRMatrix *P, hypre_ParCSRMatrix *C, HYPRE_Int *CF_marker ); void hypre_ParCSRMatrixDropEntries ( hypre_ParCSRMatrix *C, hypre_ParCSRMatrix *P, HYPRE_Int *CF_marker ); /* par_csr_matrix.c */ hypre_ParCSRMatrix *hypre_ParCSRMatrixCreate ( MPI_Comm comm, HYPRE_BigInt global_num_rows, HYPRE_BigInt global_num_cols, HYPRE_BigInt *row_starts_in, HYPRE_BigInt *col_starts_in, HYPRE_Int num_cols_offd, HYPRE_Int num_nonzeros_diag, HYPRE_Int num_nonzeros_offd ); HYPRE_Int hypre_ParCSRMatrixDestroy ( hypre_ParCSRMatrix *matrix ); HYPRE_Int hypre_ParCSRMatrixInitialize_v2( hypre_ParCSRMatrix *matrix, HYPRE_MemoryLocation memory_location ); HYPRE_Int hypre_ParCSRMatrixInitialize ( hypre_ParCSRMatrix *matrix ); HYPRE_Int hypre_ParCSRMatrixSetNumNonzeros ( hypre_ParCSRMatrix *matrix ); HYPRE_Int hypre_ParCSRMatrixSetDNumNonzeros ( hypre_ParCSRMatrix *matrix ); HYPRE_Int hypre_ParCSRMatrixSetNumRownnz ( hypre_ParCSRMatrix *matrix ); HYPRE_Int hypre_ParCSRMatrixSetDataOwner ( hypre_ParCSRMatrix *matrix, HYPRE_Int owns_data ); HYPRE_Int hypre_ParCSRMatrixSetPatternOnly( hypre_ParCSRMatrix *matrix, HYPRE_Int pattern_only); hypre_ParCSRMatrix* hypre_ParCSRMatrixCreateFromDenseBlockMatrix(MPI_Comm comm, HYPRE_BigInt global_num_rows, HYPRE_BigInt global_num_cols, HYPRE_BigInt *row_starts, HYPRE_BigInt *col_starts, hypre_DenseBlockMatrix *B); hypre_ParCSRMatrix* hypre_ParCSRMatrixCreateFromParVector(hypre_ParVector *b, HYPRE_BigInt global_num_rows, HYPRE_BigInt global_num_cols, HYPRE_BigInt *row_starts, HYPRE_BigInt *col_starts); hypre_ParCSRMatrix *hypre_ParCSRMatrixRead ( MPI_Comm comm, const char *file_name ); HYPRE_Int hypre_ParCSRMatrixPrint ( hypre_ParCSRMatrix *matrix, const char *file_name ); HYPRE_Int hypre_ParCSRMatrixPrintIJ ( const hypre_ParCSRMatrix *matrix, const HYPRE_Int base_i, const HYPRE_Int base_j, const char *filename ); HYPRE_Int hypre_ParCSRMatrixPrintBinaryIJ ( hypre_ParCSRMatrix *matrix, HYPRE_Int base_i, HYPRE_Int base_j, const char *filename ); HYPRE_Int hypre_ParCSRMatrixReadIJ ( MPI_Comm comm, const char *filename, HYPRE_Int *base_i_ptr, HYPRE_Int *base_j_ptr, hypre_ParCSRMatrix **matrix_ptr ); HYPRE_Int hypre_ParCSRMatrixGetLocalRange ( hypre_ParCSRMatrix *matrix, HYPRE_BigInt *row_start, HYPRE_BigInt *row_end, HYPRE_BigInt *col_start, HYPRE_BigInt *col_end ); HYPRE_Int hypre_ParCSRMatrixGetRow ( hypre_ParCSRMatrix *mat, HYPRE_BigInt row, HYPRE_Int *size, HYPRE_BigInt **col_ind, HYPRE_Complex **values ); HYPRE_Int hypre_ParCSRMatrixRestoreRow ( hypre_ParCSRMatrix *matrix, HYPRE_BigInt row, HYPRE_Int *size, HYPRE_BigInt **col_ind, HYPRE_Complex **values ); hypre_ParCSRMatrix *hypre_CSRMatrixToParCSRMatrix ( MPI_Comm comm, hypre_CSRMatrix *A, HYPRE_BigInt *row_starts, HYPRE_BigInt *col_starts ); HYPRE_Int GenerateDiagAndOffd ( hypre_CSRMatrix *A, hypre_ParCSRMatrix *matrix, HYPRE_BigInt first_col_diag, HYPRE_BigInt last_col_diag ); hypre_CSRMatrix *hypre_MergeDiagAndOffd ( hypre_ParCSRMatrix *par_matrix ); hypre_CSRMatrix *hypre_MergeDiagAndOffdDevice ( hypre_ParCSRMatrix *par_matrix ); hypre_CSRMatrix *hypre_ParCSRMatrixToCSRMatrixAll ( hypre_ParCSRMatrix *par_matrix ); hypre_CSRMatrix *hypre_ParCSRMatrixToCSRMatrixAll_v2 ( hypre_ParCSRMatrix *par_matrix, HYPRE_MemoryLocation memory_location ); HYPRE_Int hypre_ParCSRMatrixCopy ( hypre_ParCSRMatrix *A, hypre_ParCSRMatrix *B, HYPRE_Int copy_data ); HYPRE_Int hypre_FillResponseParToCSRMatrix ( void *p_recv_contact_buf, HYPRE_Int contact_size, HYPRE_Int contact_proc, void *ro, MPI_Comm comm, void **p_send_response_buf, HYPRE_Int *response_message_size ); hypre_ParCSRMatrix *hypre_ParCSRMatrixUnion ( hypre_ParCSRMatrix *A, hypre_ParCSRMatrix *B ); hypre_ParCSRMatrix* hypre_ParCSRMatrixClone ( hypre_ParCSRMatrix *A, HYPRE_Int copy_data ); #define hypre_ParCSRMatrixCompleteClone(A) hypre_ParCSRMatrixClone(A,0) hypre_ParCSRMatrix* hypre_ParCSRMatrixClone_v2 ( hypre_ParCSRMatrix *A, HYPRE_Int copy_data, HYPRE_MemoryLocation memory_location ); HYPRE_Int hypre_ParCSRMatrixTruncate(hypre_ParCSRMatrix *A, HYPRE_Real tol, HYPRE_Int max_row_elmts, HYPRE_Int rescale, HYPRE_Int nrm_type); HYPRE_Int hypre_ParCSRMatrixMigrate(hypre_ParCSRMatrix *A, HYPRE_MemoryLocation memory_location); HYPRE_Int hypre_ParCSRMatrixSetConstantValues( hypre_ParCSRMatrix *A, HYPRE_Complex value ); void hypre_ParCSRMatrixCopyColMapOffdToDevice(hypre_ParCSRMatrix *A); void hypre_ParCSRMatrixCopyColMapOffdToHost(hypre_ParCSRMatrix *A); /* par_csr_matrix_stats.c */ HYPRE_Int hypre_ParCSRMatrixStatsArrayCompute( HYPRE_Int num_matrices, hypre_ParCSRMatrix **matrices, hypre_MatrixStatsArray *stats_array ); /* par_csr_matmat_device.c */ HYPRE_Int hypre_ParCSRMatMatDiagDevice( hypre_ParCSRMatrix *A, hypre_ParCSRMatrix *BT, hypre_ParCSRMatrix *C ); /* par_csr_matmat.c */ HYPRE_Int hypre_ParCSRMatMatDiag( hypre_ParCSRMatrix *A, hypre_ParCSRMatrix *B, hypre_ParCSRMatrix **C_ptr ); /* par_csr_matvec.c */ // y = alpha*A*x + beta*b HYPRE_Int hypre_ParCSRMatrixMatvecOutOfPlace ( HYPRE_Complex alpha, hypre_ParCSRMatrix *A, hypre_ParVector *x, HYPRE_Complex beta, hypre_ParVector *b, hypre_ParVector *y ); HYPRE_Int hypre_ParCSRMatrixMatvecOutOfPlaceDevice ( HYPRE_Complex alpha, hypre_ParCSRMatrix *A, hypre_ParVector *x, HYPRE_Complex beta, hypre_ParVector *b, hypre_ParVector *y ); // y = alpha*A*x + beta*y HYPRE_Int hypre_ParCSRMatrixMatvec ( HYPRE_Complex alpha, hypre_ParCSRMatrix *A, hypre_ParVector *x, HYPRE_Complex beta, hypre_ParVector *y ); HYPRE_Int hypre_ParCSRMatrixMatvecT ( HYPRE_Complex alpha, hypre_ParCSRMatrix *A, hypre_ParVector *x, HYPRE_Complex beta, hypre_ParVector *y ); HYPRE_Int hypre_ParCSRMatrixMatvecTDevice ( HYPRE_Complex alpha, hypre_ParCSRMatrix *A, hypre_ParVector *x, HYPRE_Complex beta, hypre_ParVector *y ); HYPRE_Int hypre_ParCSRMatrixMatvecT_unpack( hypre_ParCSRCommPkg *comm_pkg, HYPRE_Int num_cols, HYPRE_Complex *recv_data, HYPRE_Complex *local_data ); HYPRE_Int hypre_ParCSRMatrixMatvec_FF ( HYPRE_Complex alpha, hypre_ParCSRMatrix *A, hypre_ParVector *x, HYPRE_Complex beta, hypre_ParVector *y, HYPRE_Int *CF_marker, HYPRE_Int fpt ); /* par_csr_triplemat.c */ HYPRE_Int hypre_ParCSRTMatMatPartialAddDevice( hypre_ParCSRCommPkg *comm_pkg_A, HYPRE_Int num_cols_A, HYPRE_Int num_cols_B, HYPRE_BigInt first_col_diag_B, HYPRE_BigInt last_col_diag_B, HYPRE_Int num_cols_offd_B, HYPRE_BigInt *col_map_offd_B, HYPRE_Int local_nnz_Cbar, hypre_CSRMatrix *Cbar, hypre_CSRMatrix *Cext, hypre_CSRMatrix **C_diag_ptr, hypre_CSRMatrix **C_offd_ptr, HYPRE_Int *num_cols_offd_C_ptr, HYPRE_BigInt **col_map_offd_C_ptr ); hypre_ParCSRMatrix *hypre_ParCSRMatMat( hypre_ParCSRMatrix *A, hypre_ParCSRMatrix *B ); hypre_ParCSRMatrix *hypre_ParCSRMatMatHost( hypre_ParCSRMatrix *A, hypre_ParCSRMatrix *B ); hypre_ParCSRMatrix *hypre_ParCSRMatMatDevice( hypre_ParCSRMatrix *A, hypre_ParCSRMatrix *B ); hypre_ParCSRMatrix *hypre_ParCSRTMatMatKTHost( hypre_ParCSRMatrix *A, hypre_ParCSRMatrix *B, HYPRE_Int keep_transpose); hypre_ParCSRMatrix *hypre_ParCSRTMatMatKTDevice( hypre_ParCSRMatrix *A, hypre_ParCSRMatrix *B, HYPRE_Int keep_transpose); hypre_ParCSRMatrix *hypre_ParCSRTMatMatKT( hypre_ParCSRMatrix *A, hypre_ParCSRMatrix *B, HYPRE_Int keep_transpose); hypre_ParCSRMatrix *hypre_ParCSRTMatMat( hypre_ParCSRMatrix *A, hypre_ParCSRMatrix *B); hypre_ParCSRMatrix *hypre_ParCSRMatrixRAPKT( hypre_ParCSRMatrix *R, hypre_ParCSRMatrix *A, hypre_ParCSRMatrix *P, HYPRE_Int keepTranspose ); hypre_ParCSRMatrix *hypre_ParCSRMatrixRAP( hypre_ParCSRMatrix *R, hypre_ParCSRMatrix *A, hypre_ParCSRMatrix *P ); hypre_ParCSRMatrix* hypre_ParCSRMatrixRAPKTDevice( hypre_ParCSRMatrix *R, hypre_ParCSRMatrix *A, hypre_ParCSRMatrix *P, HYPRE_Int keep_transpose ); hypre_ParCSRMatrix* hypre_ParCSRMatrixRAPKTHost( hypre_ParCSRMatrix *R, hypre_ParCSRMatrix *A, hypre_ParCSRMatrix *P, HYPRE_Int keep_transpose ); /* par_make_system.c */ HYPRE_ParCSR_System_Problem *HYPRE_Generate2DSystem ( HYPRE_ParCSRMatrix H_L1, HYPRE_ParCSRMatrix H_L2, HYPRE_ParVector H_b1, HYPRE_ParVector H_b2, HYPRE_ParVector H_x1, HYPRE_ParVector H_x2, HYPRE_Complex *M_vals ); HYPRE_Int HYPRE_Destroy2DSystem ( HYPRE_ParCSR_System_Problem *sys_prob ); /* par_vector.c */ hypre_ParVector *hypre_ParVectorCreate ( MPI_Comm comm, HYPRE_BigInt global_size, HYPRE_BigInt *partitioning_in ); hypre_ParVector *hypre_ParMultiVectorCreate ( MPI_Comm comm, HYPRE_BigInt global_size, HYPRE_BigInt *partitioning, HYPRE_Int num_vectors ); HYPRE_Int hypre_ParVectorDestroy ( hypre_ParVector *vector ); HYPRE_Int hypre_ParVectorInitializeShell( hypre_ParVector *vector ); HYPRE_Int hypre_ParVectorSetData( hypre_ParVector *vector, HYPRE_Complex *data ); HYPRE_Int hypre_ParVectorInitialize ( hypre_ParVector *vector ); HYPRE_Int hypre_ParVectorInitialize_v2( hypre_ParVector *vector, HYPRE_MemoryLocation memory_location ); HYPRE_Int hypre_ParVectorSetDataOwner ( hypre_ParVector *vector, HYPRE_Int owns_data ); HYPRE_Int hypre_ParVectorSetLocalSize ( hypre_ParVector *vector, HYPRE_Int local_size ); HYPRE_Int hypre_ParVectorSetNumVectors ( hypre_ParVector *vector, HYPRE_Int num_vectors ); HYPRE_Int hypre_ParVectorSetComponent ( hypre_ParVector *vector, HYPRE_Int component ); HYPRE_Int hypre_ParVectorResize ( hypre_ParVector *vector, HYPRE_Int num_vectors ); hypre_ParVector *hypre_ParVectorRead ( MPI_Comm comm, const char *file_name ); HYPRE_Int hypre_ParVectorSetConstantValues ( hypre_ParVector *v, HYPRE_Complex value ); HYPRE_Int hypre_ParVectorSetZeros( hypre_ParVector *v ); HYPRE_Int hypre_ParVectorSetRandomValues ( hypre_ParVector *v, HYPRE_Int seed ); HYPRE_Int hypre_ParVectorCopy ( hypre_ParVector *x, hypre_ParVector *y ); hypre_ParVector *hypre_ParVectorCloneShallow ( hypre_ParVector *x ); hypre_ParVector *hypre_ParVectorCloneDeep_v2( hypre_ParVector *x, HYPRE_MemoryLocation memory_location ); HYPRE_Int hypre_ParVectorMigrate(hypre_ParVector *x, HYPRE_MemoryLocation memory_location); HYPRE_Int hypre_ParVectorScale ( HYPRE_Complex alpha, hypre_ParVector *y ); HYPRE_Int hypre_ParVectorAxpy ( HYPRE_Complex alpha, hypre_ParVector *x, hypre_ParVector *y ); HYPRE_Int hypre_ParVectorAxpyz ( HYPRE_Complex alpha, hypre_ParVector *x, HYPRE_Complex beta, hypre_ParVector *y, hypre_ParVector *z ); HYPRE_Int hypre_ParVectorMassAxpy ( HYPRE_Complex *alpha, hypre_ParVector **x, hypre_ParVector *y, HYPRE_Int k, HYPRE_Int unroll); HYPRE_Real hypre_ParVectorInnerProd ( hypre_ParVector *x, hypre_ParVector *y ); HYPRE_Int hypre_ParVectorMassInnerProd ( hypre_ParVector *x, hypre_ParVector **y, HYPRE_Int k, HYPRE_Int unroll, HYPRE_Real *prod ); HYPRE_Int hypre_ParVectorMassDotpTwo ( hypre_ParVector *x, hypre_ParVector *y, hypre_ParVector **z, HYPRE_Int k, HYPRE_Int unroll, HYPRE_Real *prod_x, HYPRE_Real *prod_y ); hypre_ParVector *hypre_VectorToParVector ( MPI_Comm comm, hypre_Vector *v, HYPRE_BigInt *vec_starts ); hypre_Vector *hypre_ParVectorToVectorAll ( hypre_ParVector *par_v ); hypre_Vector *hypre_ParVectorToVectorAll_v2 ( hypre_ParVector *par_v, HYPRE_MemoryLocation memory_location ); HYPRE_Int hypre_ParVectorPrint ( hypre_ParVector *vector, const char *file_name ); HYPRE_Int hypre_ParVectorPrintIJ ( hypre_ParVector *vector, HYPRE_Int base_j, const char *filename ); HYPRE_Int hypre_ParVectorPrintBinaryIJ ( hypre_ParVector *par_vector, const char *filename ); HYPRE_Int hypre_ParVectorReadIJ ( MPI_Comm comm, const char *filename, HYPRE_Int *base_j_ptr, hypre_ParVector **vector_ptr ); HYPRE_Int hypre_FillResponseParToVectorAll ( void *p_recv_contact_buf, HYPRE_Int contact_size, HYPRE_Int contact_proc, void *ro, MPI_Comm comm, void **p_send_response_buf, HYPRE_Int *response_message_size ); HYPRE_Complex hypre_ParVectorLocalSumElts ( hypre_ParVector *vector ); HYPRE_Int hypre_ParVectorGetValues ( hypre_ParVector *vector, HYPRE_Int num_values, HYPRE_BigInt *indices, HYPRE_Complex *values); HYPRE_Int hypre_ParVectorGetValues2( hypre_ParVector *vector, HYPRE_Int num_values, HYPRE_BigInt *indices, HYPRE_BigInt base, HYPRE_Complex *values ); HYPRE_Int hypre_ParVectorGetValuesHost(hypre_ParVector *vector, HYPRE_Int num_values, HYPRE_BigInt *indices, HYPRE_BigInt base, HYPRE_Complex *values); HYPRE_Int hypre_ParVectorElmdivpy( hypre_ParVector *x, hypre_ParVector *b, hypre_ParVector *y ); HYPRE_Int hypre_ParVectorElmdivpyMarked( hypre_ParVector *x, hypre_ParVector *b, hypre_ParVector *y, HYPRE_Int *marker, HYPRE_Int marker_val ); /* par_vector_device.c */ HYPRE_Int hypre_ParVectorGetValuesDevice(hypre_ParVector *vector, HYPRE_Int num_values, HYPRE_BigInt *indices, HYPRE_BigInt base, HYPRE_Complex *values); #ifdef __cplusplus } #endif #endif hypre-2.33.0/src/parcsr_mv/communicationT.c000066400000000000000000000600231477326011500206550ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "_hypre_parcsr_mv.h" void hypre_RowsWithColumn_original ( HYPRE_Int * rowmin, HYPRE_Int * rowmax, HYPRE_BigInt column, hypre_ParCSRMatrix * A ) /* Finds rows of A which have a nonzero at the given (global) column number. Sets rowmin to the minimum (local) row number of such rows, and rowmax to the max. If there are no such rows, will return rowmax<0<=rowmin */ { hypre_CSRMatrix * diag = hypre_ParCSRMatrixDiag(A); hypre_CSRMatrix * offd = hypre_ParCSRMatrixOffd(A); HYPRE_Int * mat_i, * mat_j; HYPRE_Int i, j, num_rows; HYPRE_BigInt firstColDiag; HYPRE_BigInt * colMapOffd; mat_i = hypre_CSRMatrixI(diag); mat_j = hypre_CSRMatrixJ(diag); num_rows = hypre_CSRMatrixNumRows(diag); firstColDiag = hypre_ParCSRMatrixFirstColDiag(A); *rowmin = num_rows; *rowmax = -1; for ( i = 0; i < num_rows; ++i ) { /* global number: row = i + firstRowIndex;*/ for ( j = mat_i[i]; j < mat_i[i + 1]; ++j ) { if ( (HYPRE_BigInt)mat_j[j] + firstColDiag == column ) { /* row i (local row number) has column mat_j[j] (local column number) */ *rowmin = i < *rowmin ? i : *rowmin; *rowmax = i > *rowmax ? i : *rowmax; break; } } } mat_i = hypre_CSRMatrixI(offd); mat_j = hypre_CSRMatrixJ(offd); num_rows = hypre_CSRMatrixNumRows(offd); colMapOffd = hypre_ParCSRMatrixColMapOffd(A); for ( i = 0; i < num_rows; ++i ) { /* global number: row = i + firstRowIndex;*/ for ( j = mat_i[i]; j < mat_i[i + 1]; ++j ) { if ( colMapOffd[ mat_j[j] ] == column ) { /* row i (local row number) has column mat_j[j] (local column number) */ *rowmin = i < *rowmin ? i : *rowmin; *rowmax = i > *rowmax ? i : *rowmax; break; } } } /* global col no.: mat_j[j]+hypre_ParCSRMatrixFirstColDiag(A) or hypre_ParCSRMatrixColMapOffd(A)[ mat_j[j] ] global row no.: i + hypre_ParCSRMatrixFirstRowIndex(A) */ } void hypre_RowsWithColumn ( HYPRE_Int * rowmin, HYPRE_Int * rowmax, HYPRE_BigInt column, HYPRE_Int num_rows_diag, HYPRE_BigInt firstColDiag, HYPRE_BigInt * colMapOffd, HYPRE_Int * mat_i_diag, HYPRE_Int * mat_j_diag, HYPRE_Int * mat_i_offd, HYPRE_Int * mat_j_offd ) /* Finds rows of A which have a nonzero at the given (global) column number. Sets rowmin to the minimum (local) row number of such rows, and rowmax to the max. If there are no such rows, will return rowmax<0<=rowmin The matrix A, normally a hypre_ParCSRMatrix or hypre_ParCSRBooleanMatrix, is specified by: num_rows_diag, (number of rows in diag, assumed to be same in offd) firstColDiag, colMapOffd (to map CSR-type matrix columns to ParCSR-type columns mat_i_diag, mat_j_diag: indices in the hypre_CSRMatrix or hypre_CSRBooleanMatrix for diag block of A mat_i_offd, mat_j_offd: indices in the hypre_CSRMatrix or hypre_CSRBooleanMatrix for offd block of A */ { HYPRE_Int i, j; *rowmin = num_rows_diag; *rowmax = -1; for ( i = 0; i < num_rows_diag; ++i ) { /* global number: row = i + firstRowIndex;*/ for ( j = mat_i_diag[i]; j < mat_i_diag[i + 1]; ++j ) { if ( (HYPRE_BigInt)mat_j_diag[j] + firstColDiag == column ) { /* row i (local row number) has column mat_j[j] (local column number) */ *rowmin = i < *rowmin ? i : *rowmin; *rowmax = i > *rowmax ? i : *rowmax; break; } } } for ( i = 0; i < num_rows_diag; ++i ) { /* global number: row = i + firstRowIndex;*/ for ( j = mat_i_offd[i]; j < mat_i_offd[i + 1]; ++j ) { if ( colMapOffd[ mat_j_offd[j] ] == column ) { /* row i (local row number) has column mat_j[j] (local column number) */ *rowmin = i < *rowmin ? i : *rowmin; *rowmax = i > *rowmax ? i : *rowmax; break; } } } /* global col no.: mat_j[j]+hypre_ParCSRMatrixFirstColDiag(A) or hypre_ParCSRMatrixColMapOffd(A)[ mat_j[j] ] global row no.: i + hypre_ParCSRMatrixFirstRowIndex(A) */ } /* hypre_MatTCommPkgCreate_core does all the communications and computations for hypre_MatTCommPkgCreate ( hypre_ParCSRMatrix *A) and hypre_BoolMatTCommPkgCreate ( hypre_ParCSRBooleanMatrix *A) To support both data types, it has hardly any data structures other than HYPRE_Int*. */ void hypre_MatTCommPkgCreate_core ( /* input args: */ MPI_Comm comm, HYPRE_BigInt * col_map_offd, HYPRE_BigInt first_col_diag, HYPRE_BigInt *col_starts, HYPRE_Int num_rows_diag, HYPRE_Int num_cols_diag, HYPRE_Int num_cols_offd, HYPRE_BigInt *row_starts, HYPRE_BigInt firstColDiag, HYPRE_BigInt *colMapOffd, HYPRE_Int * mat_i_diag, HYPRE_Int * mat_j_diag, HYPRE_Int * mat_i_offd, HYPRE_Int * mat_j_offd, HYPRE_Int data, /* = 1 for a matrix with floating-point data, =0 for Boolean matrix */ /* pointers to output args: */ HYPRE_Int * p_num_recvs, HYPRE_Int ** p_recv_procs, HYPRE_Int ** p_recv_vec_starts, HYPRE_Int * p_num_sends, HYPRE_Int ** p_send_procs, HYPRE_Int ** p_send_map_starts, HYPRE_Int ** p_send_map_elmts ) { HYPRE_UNUSED_VAR(data); HYPRE_Int num_sends; HYPRE_Int *send_procs; HYPRE_Int *send_map_starts; HYPRE_Int *send_map_elmts; HYPRE_Int num_recvs; HYPRE_Int *recv_procs; HYPRE_Int *recv_vec_starts; HYPRE_Int i, j, j2, k, ir, rowmin, rowmax; HYPRE_BigInt *tmp, *recv_buf; HYPRE_Int *displs, *info, *send_buf, *all_num_sends3; HYPRE_Int num_procs, my_id, num_elmts; HYPRE_Int local_info, index, index2; HYPRE_Int pmatch, p; HYPRE_BigInt col, kc; HYPRE_Int * recv_sz_buf; HYPRE_Int * row_marker; hypre_MPI_Comm_size(comm, &num_procs); hypre_MPI_Comm_rank(comm, &my_id); info = hypre_CTAlloc(HYPRE_Int, num_procs, HYPRE_MEMORY_HOST); /* ---------------------------------------------------------------------- * determine which processors to receive from (set proc_mark) and num_recvs, * at the end of the loop proc_mark[i] contains the number of elements to be * received from Proc. i * * - For A*b or A*B: for each off-diagonal column i of A, you want to identify * the processor which has the corresponding element i of b (row i of B) * (columns in the local diagonal block, just multiply local rows of B). * You do it by finding the processor which has that column of A in its * _diagonal_ block - assuming b or B is distributed the same, which I believe * is evenly among processors, by row. There is a unique solution because * the diag/offd blocking is defined by which processor owns which rows of A. * * - For A*A^T: A^T is not distributed by rows as B or any 'normal' matrix is. * For each off-diagonal row,column k,i element of A, you want to identify * the processors which have the corresponding row,column i,j elements of A^T * i.e., row,column j,i elements of A (all i,j,k for which these entries are * nonzero, row k of A lives on this processor, and row j of A lives on * a different processor). So, given a column i in the local A-offd or A-diag, * we want to find all the processors which have column i, in diag or offd * blocks. Unlike the A*B case, I don't think you can eliminate looking at * any class of blocks. * ---------------------------------------------------------------------*/ /* The algorithm for A*B was: For each of my columns i (in offd block), use known information on data distribution of columns in _diagonal_ blocks to find the processor p which owns row i. (Note that for i in diag block, I own the row, nothing to do.) Count up such i's for each processor in proc_mark. Construct a data structure, recv_buf, made by appending a structure tmp from each processor. The data structure tmp looks like (p, no. of i's, i1, i2,...) (p=0,...) . There are two communication steps: gather size information (local_info) from all processors (into info), then gather the data (tmp) from all processors (into recv_buf). Then you go through recv_buf. For each (sink) processor p you search for for the appearance of my (source) processor number (most of recv_buf pertains to other processors and is ignored). When you find the appropriate section, pull out the i's, count them and save them, in send_map_elmts, and save p in send_procs and index information in send_map_starts. */ /* The algorithm for A*A^T: [ Originally I had planned to figure out approximately which processors had the information (for A*B it could be done exactly) to save on communication. But even for A*B where the data owner is known, all data is sent to all processors, so that's not worth worrying about on the first cut. One consequence is that proc_mark is not needed.] Construct a data structure, recv_buf, made by appending a structure tmp for each processor. It simply consists of (no. of i's, i1, i2,...) where i is the global number of a column in the offd block. There are still two communication steps: gather size information (local_info) from all processors (into info), then gather the data (tmp) from all processors (into recv_buf). Then you go through recv_buf. For each (sink) processor p you go through all its column numbers in recv_buf. Check each one for whether you have data in that column. If so, put in in send_map_elmts, p in send_procs, and update the index information in send_map_starts. Note that these arrays don't mean quite the same thing as for A*B. */ num_recvs = num_procs - 1; local_info = num_procs + num_cols_offd + num_cols_diag; hypre_MPI_Allgather(&local_info, 1, HYPRE_MPI_INT, info, 1, HYPRE_MPI_INT, comm); /* ---------------------------------------------------------------------- * generate information to be send: tmp contains for each recv_proc: * {deleted: id of recv_procs}, number of elements to be received for this processor, * indices of elements (in this order) * ---------------------------------------------------------------------*/ displs = hypre_CTAlloc(HYPRE_Int, num_procs + 1, HYPRE_MEMORY_HOST); displs[0] = 0; for (i = 1; i < num_procs + 1; i++) { displs[i] = displs[i - 1] + info[i - 1]; } recv_buf = hypre_CTAlloc(HYPRE_BigInt, displs[num_procs], HYPRE_MEMORY_HOST); tmp = hypre_CTAlloc(HYPRE_BigInt, local_info, HYPRE_MEMORY_HOST); j = 0; for (i = 0; i < num_procs; i++) { j2 = j++; tmp[j2] = 0; for (k = 0; k < num_cols_offd; k++) if (col_map_offd[k] >= col_starts[i] && col_map_offd[k] < col_starts[i + 1]) { tmp[j++] = col_map_offd[k]; ++(tmp[j2]); }; for (k = 0; k < num_cols_diag; k++) if ( (HYPRE_BigInt)k + first_col_diag >= col_starts[i] && (HYPRE_BigInt)k + first_col_diag < col_starts[i + 1] ) { tmp[j++] = (HYPRE_BigInt)k + first_col_diag; ++(tmp[j2]); } } hypre_MPI_Allgatherv(tmp, local_info, HYPRE_MPI_BIG_INT, recv_buf, info, displs, HYPRE_MPI_BIG_INT, comm); /* ---------------------------------------------------------------------- * determine send_procs and actual elements to be send (in send_map_elmts) * and send_map_starts whose i-th entry points to the beginning of the * elements to be send to proc. i * ---------------------------------------------------------------------*/ /* Meanings of arrays being set here, more verbosely stated: send_procs: processors p to send to send_map_starts: for each p, gives range of indices in send_map_elmts; send_map_elmts: Each element is a send_map_elmts[i], with i in a range given by send_map_starts[p..p+1], for some p. This element is is the global column number for a column in the offd block of p which is to be multiplied by data from this processor. For A*B, send_map_elmts[i] is therefore a row of B belonging to this processor, to be sent to p. For A*A^T, send_map_elmts[i] is a row of A belonging to this processor, to be sent to p; this row was selected because it has a nonzero on a _column_ needed by p. */ num_sends = num_procs; /* may turn out to be less, but we can't know yet */ num_elmts = (num_procs - 1) * num_rows_diag; /* ... a crude upper bound; should try to do better even if more comm required */ send_procs = hypre_CTAlloc(HYPRE_Int, num_sends, HYPRE_MEMORY_HOST); send_map_starts = hypre_CTAlloc(HYPRE_Int, num_sends + 1, HYPRE_MEMORY_HOST); send_map_elmts = hypre_CTAlloc(HYPRE_Int, num_elmts, HYPRE_MEMORY_HOST); row_marker = hypre_CTAlloc(HYPRE_Int, num_rows_diag, HYPRE_MEMORY_HOST); index = 0; index2 = 0; send_map_starts[0] = 0; for (i = 0; i < num_procs; i++) { send_map_starts[index + 1] = send_map_starts[index]; j = displs[i]; pmatch = 0; for ( ir = 0; ir < num_rows_diag; ++ir ) { row_marker[ir] = 0; } while ( j < displs[i + 1]) { num_elmts = recv_buf[j++]; /* no. of columns proc. i wants */ for ( k = 0; k < num_elmts; k++ ) { col = recv_buf[j++]; /* a global column no. at proc. i */ for ( kc = 0; kc < num_cols_offd; kc++ ) { if ( col_map_offd[kc] == col && i != my_id ) { /* this processor has the same column as proc. i (but is different) */ pmatch = 1; send_procs[index] = i; /* this would be right if we could send columns, but we can't ... offset = first_col_diag; ++send_map_starts[index+1]; send_map_elmts[index2++] = col - offset; */ /* Plan to send all of my rows which use this column... */ hypre_RowsWithColumn( &rowmin, &rowmax, col, num_rows_diag, firstColDiag, colMapOffd, mat_i_diag, mat_j_diag, mat_i_offd, mat_j_offd ); for ( ir = rowmin; ir <= rowmax; ++ir ) { if ( row_marker[ir] == 0 ) { row_marker[ir] = 1; ++send_map_starts[index + 1]; send_map_elmts[index2++] = ir; } } } } /* alternative way of doing the following for-loop: for ( kc=0; kc 0) { cpt_array[my_thread_num + 1]++; } else { fpt_array[my_thread_num + 1]++; } } #ifdef HYPRE_USING_OPENMP #pragma omp barrier #endif if (my_thread_num == 0) { for (i = 1; i < num_threads; i++) { cpt_array[i + 1] += cpt_array[i]; fpt_array[i + 1] += fpt_array[i]; } } #ifdef HYPRE_USING_OPENMP #pragma omp barrier #endif cpt = cpt_array[my_thread_num]; fpt = fpt_array[my_thread_num]; for (i = start; i < stop; i++) { if (CF_marker[i] > 0) { fine_to_coarse[i] = cpt++; fine_to_fine[i] = -1; } else { fine_to_fine[i] = fpt++; fine_to_coarse[i] = -1; } } #ifdef HYPRE_USING_OPENMP #pragma omp barrier #endif if (my_thread_num == 0) { HYPRE_BigInt big_Fpts; n_Fpts = fpt_array[num_threads]; big_Fpts = n_Fpts; hypre_MPI_Scan(&big_Fpts, fpts_starts + 1, 1, HYPRE_MPI_BIG_INT, hypre_MPI_SUM, comm); fpts_starts[0] = fpts_starts[1] - big_Fpts; if (my_id == num_procs - 1) { total_global_fpts = fpts_starts[1]; total_global_cpts = cpts_starts[1]; } hypre_MPI_Bcast(&total_global_fpts, 1, HYPRE_MPI_BIG_INT, num_procs - 1, comm); hypre_MPI_Bcast(&total_global_cpts, 1, HYPRE_MPI_BIG_INT, num_procs - 1, comm); } #ifdef HYPRE_USING_OPENMP #pragma omp barrier #endif for (i = start; i < stop; i++) { if (CF_marker[i] > 0) { big_convert[i] = (HYPRE_BigInt)fine_to_coarse[i] + cpts_starts[0]; } else { big_convert[i] = (HYPRE_BigInt)fine_to_fine[i] + fpts_starts[0]; } } #ifdef HYPRE_USING_OPENMP #pragma omp barrier #endif if (my_thread_num == 0) { if (num_cols_A_offd) { CF_marker_offd = hypre_CTAlloc(HYPRE_Int, num_cols_A_offd, HYPRE_MEMORY_HOST); big_convert_offd = hypre_CTAlloc(HYPRE_BigInt, num_cols_A_offd, HYPRE_MEMORY_HOST); fine_to_coarse_offd = hypre_CTAlloc(HYPRE_Int, num_cols_A_offd, HYPRE_MEMORY_HOST); fine_to_fine_offd = hypre_CTAlloc(HYPRE_Int, num_cols_A_offd, HYPRE_MEMORY_HOST); } index = 0; num_sends = hypre_ParCSRCommPkgNumSends(comm_pkg); int_buf_data = hypre_CTAlloc(HYPRE_Int, hypre_ParCSRCommPkgSendMapStart(comm_pkg, num_sends), HYPRE_MEMORY_HOST); big_buf_data = hypre_CTAlloc(HYPRE_BigInt, hypre_ParCSRCommPkgSendMapStart(comm_pkg, num_sends), HYPRE_MEMORY_HOST); for (i = 0; i < num_sends; i++) { startc = hypre_ParCSRCommPkgSendMapStart(comm_pkg, i); for (j = startc; j < hypre_ParCSRCommPkgSendMapStart(comm_pkg, i + 1); j++) { int_buf_data[index] = CF_marker[hypre_ParCSRCommPkgSendMapElmt(comm_pkg, j)]; big_buf_data[index++] = big_convert[hypre_ParCSRCommPkgSendMapElmt(comm_pkg, j)]; } } comm_handle = hypre_ParCSRCommHandleCreate( 11, comm_pkg, int_buf_data, CF_marker_offd); hypre_ParCSRCommHandleDestroy(comm_handle); comm_handle = hypre_ParCSRCommHandleCreate( 21, comm_pkg, big_buf_data, big_convert_offd); hypre_ParCSRCommHandleDestroy(comm_handle); marker_offd = hypre_CTAlloc(HYPRE_Int, num_cols_A_offd, HYPRE_MEMORY_HOST); for (i = 0; i < n_fine; i++) { if (CF_marker[i] < 0) { for (j = S_offd_i[i]; j < S_offd_i[i + 1]; j++) { marker_offd[S_offd_j[j]] = 1; } } } num_cols_offd_A_FC = 0; num_cols_offd_A_FF = 0; if (num_cols_A_offd) { for (i = 0; i < num_cols_A_offd; i++) { if (CF_marker_offd[i] > 0 && marker_offd[i] > 0) { fine_to_coarse_offd[i] = num_cols_offd_A_FC++; fine_to_fine_offd[i] = -1; } else if (CF_marker_offd[i] < 0 && marker_offd[i] > 0) { fine_to_fine_offd[i] = num_cols_offd_A_FF++; fine_to_coarse_offd[i] = -1; } } col_map_offd_A_FF = hypre_TAlloc(HYPRE_BigInt, num_cols_offd_A_FF, HYPRE_MEMORY_HOST); col_map_offd_A_FC = hypre_TAlloc(HYPRE_BigInt, num_cols_offd_A_FC, HYPRE_MEMORY_HOST); cpt = 0; fpt = 0; for (i = 0; i < num_cols_A_offd; i++) { if (CF_marker_offd[i] > 0 && marker_offd[i] > 0) { col_map_offd_A_FC[cpt++] = big_convert_offd[i]; } else if (CF_marker_offd[i] < 0 && marker_offd[i] > 0) { col_map_offd_A_FF[fpt++] = big_convert_offd[i]; } } } A_FF_diag_i = hypre_CTAlloc(HYPRE_Int, n_Fpts + 1, memory_location_P); A_FC_diag_i = hypre_CTAlloc(HYPRE_Int, n_Fpts + 1, memory_location_P); A_FF_offd_i = hypre_CTAlloc(HYPRE_Int, n_Fpts + 1, memory_location_P); A_FC_offd_i = hypre_CTAlloc(HYPRE_Int, n_Fpts + 1, memory_location_P); } #ifdef HYPRE_USING_OPENMP #pragma omp barrier #endif d_count_FC = 0; d_count_FF = 0; o_count_FC = 0; o_count_FF = 0; row = fpt_array[my_thread_num]; for (i = start; i < stop; i++) { if (CF_marker[i] < 0) { row++; d_count_FF++; /* account for diagonal element */ for (j = S_diag_i[i] + skip_diag; j < S_diag_i[i + 1]; j++) { jj = S_diag_j[j]; if (CF_marker[jj] > 0) { d_count_FC++; } else { d_count_FF++; } } A_FF_diag_i[row] = d_count_FF; A_FC_diag_i[row] = d_count_FC; for (j = S_offd_i[i]; j < S_offd_i[i + 1]; j++) { jj = S_offd_j[j]; if (CF_marker_offd[jj] > 0) { o_count_FC++; } else { o_count_FF++; } } A_FF_offd_i[row] = o_count_FF; A_FC_offd_i[row] = o_count_FC; } } #ifdef HYPRE_USING_OPENMP #pragma omp barrier #endif if (my_thread_num == 0) { HYPRE_Int fpt2; for (i = 1; i < num_threads + 1; i++) { fpt = fpt_array[i]; fpt2 = fpt_array[i - 1]; if (fpt == fpt2) { continue; } A_FC_diag_i[fpt] += A_FC_diag_i[fpt2]; A_FF_diag_i[fpt] += A_FF_diag_i[fpt2]; A_FC_offd_i[fpt] += A_FC_offd_i[fpt2]; A_FF_offd_i[fpt] += A_FF_offd_i[fpt2]; } row = fpt_array[num_threads]; d_count_FC = A_FC_diag_i[row]; d_count_FF = A_FF_diag_i[row]; o_count_FC = A_FC_offd_i[row]; o_count_FF = A_FF_offd_i[row]; A_FF_diag_j = hypre_CTAlloc(HYPRE_Int, d_count_FF, memory_location_P); A_FC_diag_j = hypre_CTAlloc(HYPRE_Int, d_count_FC, memory_location_P); A_FF_offd_j = hypre_CTAlloc(HYPRE_Int, o_count_FF, memory_location_P); A_FC_offd_j = hypre_CTAlloc(HYPRE_Int, o_count_FC, memory_location_P); A_FF_diag_data = hypre_CTAlloc(HYPRE_Real, d_count_FF, memory_location_P); A_FC_diag_data = hypre_CTAlloc(HYPRE_Real, d_count_FC, memory_location_P); A_FF_offd_data = hypre_CTAlloc(HYPRE_Real, o_count_FF, memory_location_P); A_FC_offd_data = hypre_CTAlloc(HYPRE_Real, o_count_FC, memory_location_P); } #ifdef HYPRE_USING_OPENMP #pragma omp barrier #endif row = fpt_array[my_thread_num]; d_count_FC = A_FC_diag_i[row]; d_count_FF = A_FF_diag_i[row]; o_count_FC = A_FC_offd_i[row]; o_count_FF = A_FF_offd_i[row]; for (i = start; i < stop; i++) { if (CF_marker[i] < 0) { HYPRE_Int jS, jA; row++; jA = A_diag_i[i]; A_FF_diag_j[d_count_FF] = fine_to_fine[A_diag_j[jA]]; A_FF_diag_data[d_count_FF++] = A_diag_data[jA++]; for (j = S_diag_i[i] + skip_diag; j < S_diag_i[i + 1]; j++) { jA = A_diag_i[i] + 1; jS = S_diag_j[j]; while (A_diag_j[jA] != jS) { jA++; } if (CF_marker[S_diag_j[j]] > 0) { A_FC_diag_j[d_count_FC] = fine_to_coarse[A_diag_j[jA]]; A_FC_diag_data[d_count_FC++] = A_diag_data[jA++]; } else { A_FF_diag_j[d_count_FF] = fine_to_fine[A_diag_j[jA]]; A_FF_diag_data[d_count_FF++] = A_diag_data[jA++]; } } A_FF_diag_i[row] = d_count_FF; A_FC_diag_i[row] = d_count_FC; for (j = S_offd_i[i]; j < S_offd_i[i + 1]; j++) { jA = A_offd_i[i]; jS = S_offd_j[j]; while (jS != A_offd_j[jA]) { jA++; } if (CF_marker_offd[S_offd_j[j]] > 0) { A_FC_offd_j[o_count_FC] = fine_to_coarse_offd[A_offd_j[jA]]; A_FC_offd_data[o_count_FC++] = A_offd_data[jA++]; } else { A_FF_offd_j[o_count_FF] = fine_to_fine_offd[A_offd_j[jA]]; A_FF_offd_data[o_count_FF++] = A_offd_data[jA++]; } } A_FF_offd_i[row] = o_count_FF; A_FC_offd_i[row] = o_count_FC; } } } /*end parallel region */ A_FC = hypre_ParCSRMatrixCreate(comm, total_global_fpts, total_global_cpts, fpts_starts, cpts_starts, num_cols_offd_A_FC, A_FC_diag_i[n_Fpts], A_FC_offd_i[n_Fpts]); A_FF = hypre_ParCSRMatrixCreate(comm, total_global_fpts, total_global_fpts, fpts_starts, fpts_starts, num_cols_offd_A_FF, A_FF_diag_i[n_Fpts], A_FF_offd_i[n_Fpts]); A_FC_diag = hypre_ParCSRMatrixDiag(A_FC); hypre_CSRMatrixData(A_FC_diag) = A_FC_diag_data; hypre_CSRMatrixI(A_FC_diag) = A_FC_diag_i; hypre_CSRMatrixJ(A_FC_diag) = A_FC_diag_j; A_FC_offd = hypre_ParCSRMatrixOffd(A_FC); hypre_CSRMatrixData(A_FC_offd) = A_FC_offd_data; hypre_CSRMatrixI(A_FC_offd) = A_FC_offd_i; hypre_CSRMatrixJ(A_FC_offd) = A_FC_offd_j; hypre_ParCSRMatrixColMapOffd(A_FC) = col_map_offd_A_FC; hypre_CSRMatrixMemoryLocation(A_FC_diag) = memory_location_P; hypre_CSRMatrixMemoryLocation(A_FC_offd) = memory_location_P; A_FF_diag = hypre_ParCSRMatrixDiag(A_FF); hypre_CSRMatrixData(A_FF_diag) = A_FF_diag_data; hypre_CSRMatrixI(A_FF_diag) = A_FF_diag_i; hypre_CSRMatrixJ(A_FF_diag) = A_FF_diag_j; A_FF_offd = hypre_ParCSRMatrixOffd(A_FF); hypre_CSRMatrixData(A_FF_offd) = A_FF_offd_data; hypre_CSRMatrixI(A_FF_offd) = A_FF_offd_i; hypre_CSRMatrixJ(A_FF_offd) = A_FF_offd_j; hypre_ParCSRMatrixColMapOffd(A_FF) = col_map_offd_A_FF; hypre_CSRMatrixMemoryLocation(A_FF_diag) = memory_location_P; hypre_CSRMatrixMemoryLocation(A_FF_offd) = memory_location_P; hypre_TFree(fine_to_coarse, HYPRE_MEMORY_HOST); hypre_TFree(fine_to_fine, HYPRE_MEMORY_HOST); hypre_TFree(big_convert, HYPRE_MEMORY_HOST); hypre_TFree(fine_to_coarse_offd, HYPRE_MEMORY_HOST); hypre_TFree(fine_to_fine_offd, HYPRE_MEMORY_HOST); hypre_TFree(big_convert_offd, HYPRE_MEMORY_HOST); hypre_TFree(CF_marker_offd, HYPRE_MEMORY_HOST); hypre_TFree(int_buf_data, HYPRE_MEMORY_HOST); hypre_TFree(big_buf_data, HYPRE_MEMORY_HOST); hypre_TFree(marker_offd, HYPRE_MEMORY_HOST); hypre_TFree(cpt_array, HYPRE_MEMORY_HOST); hypre_TFree(fpt_array, HYPRE_MEMORY_HOST); *A_FC_ptr = A_FC; *A_FF_ptr = A_FF; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_ParCSRMatrixGenerateFFFC * * Generate AFF or AFC * * TODO (VPM): build the communication package of the resulting matrices * (A_FF and A_FC) from the communication package of the original matrix * without doing MPI calls. *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ParCSRMatrixGenerateFFFC( hypre_ParCSRMatrix *A, HYPRE_Int *CF_marker, HYPRE_BigInt *cpts_starts, hypre_ParCSRMatrix *S, hypre_ParCSRMatrix **A_FC_ptr, hypre_ParCSRMatrix **A_FF_ptr) { #if defined(HYPRE_USING_GPU) HYPRE_ExecutionPolicy exec = hypre_GetExecPolicy1( hypre_ParCSRMatrixMemoryLocation(A) ); if (exec == HYPRE_EXEC_DEVICE) { hypre_ParCSRMatrixGenerateFFFCDevice(A, CF_marker, cpts_starts, S, A_FC_ptr, A_FF_ptr); } else #endif { hypre_ParCSRMatrixGenerateFFFCHost(A, CF_marker, cpts_starts, S, A_FC_ptr, A_FF_ptr); } return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_ParCSRMatrixGenerateFFFC3 * * generate AFF, AFC, for 2 stage extended interpolation *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ParCSRMatrixGenerateFFFC3( hypre_ParCSRMatrix *A, HYPRE_Int *CF_marker, HYPRE_BigInt *cpts_starts, hypre_ParCSRMatrix *S, hypre_ParCSRMatrix **A_FC_ptr, hypre_ParCSRMatrix **A_FF_ptr) { MPI_Comm comm = hypre_ParCSRMatrixComm(A); HYPRE_MemoryLocation memory_location_P = hypre_ParCSRMatrixMemoryLocation(A); hypre_ParCSRCommPkg *comm_pkg = hypre_ParCSRMatrixCommPkg(A); hypre_ParCSRCommHandle *comm_handle; /* diag part of A */ hypre_CSRMatrix *A_diag = hypre_ParCSRMatrixDiag(A); HYPRE_Complex *A_diag_data = hypre_CSRMatrixData(A_diag); HYPRE_Int *A_diag_i = hypre_CSRMatrixI(A_diag); HYPRE_Int *A_diag_j = hypre_CSRMatrixJ(A_diag); /* off-diag part of A */ hypre_CSRMatrix *A_offd = hypre_ParCSRMatrixOffd(A); HYPRE_Complex *A_offd_data = hypre_CSRMatrixData(A_offd); HYPRE_Int *A_offd_i = hypre_CSRMatrixI(A_offd); HYPRE_Int *A_offd_j = hypre_CSRMatrixJ(A_offd); HYPRE_Int n_fine = hypre_CSRMatrixNumRows(A_diag); HYPRE_Int num_cols_A_offd = hypre_CSRMatrixNumCols(A_offd); /* diag part of S */ hypre_CSRMatrix *S_diag = hypre_ParCSRMatrixDiag(S); HYPRE_Int *S_diag_i = hypre_CSRMatrixI(S_diag); HYPRE_Int *S_diag_j = hypre_CSRMatrixJ(S_diag); /* off-diag part of S */ hypre_CSRMatrix *S_offd = hypre_ParCSRMatrixOffd(S); HYPRE_Int *S_offd_i = hypre_CSRMatrixI(S_offd); HYPRE_Int *S_offd_j = hypre_CSRMatrixJ(S_offd); hypre_ParCSRMatrix *A_FC; hypre_CSRMatrix *A_FC_diag, *A_FC_offd; HYPRE_Int *A_FC_diag_i, *A_FC_diag_j, *A_FC_offd_i, *A_FC_offd_j = NULL; HYPRE_Complex *A_FC_diag_data, *A_FC_offd_data = NULL; HYPRE_Int num_cols_offd_A_FC; HYPRE_BigInt *col_map_offd_A_FC = NULL; hypre_ParCSRMatrix *A_FF; hypre_CSRMatrix *A_FF_diag, *A_FF_offd; HYPRE_Int *A_FF_diag_i, *A_FF_diag_j, *A_FF_offd_i, *A_FF_offd_j; HYPRE_Complex *A_FF_diag_data, *A_FF_offd_data; HYPRE_Int num_cols_offd_A_FF; HYPRE_BigInt *col_map_offd_A_FF = NULL; HYPRE_Int *fine_to_coarse; HYPRE_Int *fine_to_fine; HYPRE_Int *fine_to_coarse_offd = NULL; HYPRE_Int *fine_to_fine_offd = NULL; HYPRE_Int i, j, jj; HYPRE_Int startc, index; HYPRE_Int cpt, fpt, new_fpt, row, rowc; HYPRE_Int *CF_marker_offd = NULL; HYPRE_Int *int_buf_data = NULL; HYPRE_BigInt *big_convert; HYPRE_BigInt *big_convert_offd = NULL; HYPRE_BigInt *big_buf_data = NULL; HYPRE_BigInt total_global_fpts, total_global_cpts, total_global_new_fpts; HYPRE_BigInt fpts_starts[2], new_fpts_starts[2]; HYPRE_Int my_id, num_procs, num_sends; HYPRE_Int d_count_FF, d_count_FC, o_count_FF, o_count_FC; HYPRE_Int n_Fpts; HYPRE_Int n_new_Fpts; HYPRE_Int *cpt_array, *fpt_array, *new_fpt_array; HYPRE_Int start, stop; HYPRE_Int num_threads; num_threads = hypre_NumThreads(); /* MPI size and rank*/ hypre_MPI_Comm_size(comm, &num_procs); hypre_MPI_Comm_rank(comm, &my_id); fine_to_coarse = hypre_CTAlloc(HYPRE_Int, n_fine, HYPRE_MEMORY_HOST); fine_to_fine = hypre_CTAlloc(HYPRE_Int, n_fine, HYPRE_MEMORY_HOST); big_convert = hypre_CTAlloc(HYPRE_BigInt, n_fine, HYPRE_MEMORY_HOST); cpt_array = hypre_CTAlloc(HYPRE_Int, num_threads + 1, HYPRE_MEMORY_HOST); fpt_array = hypre_CTAlloc(HYPRE_Int, num_threads + 1, HYPRE_MEMORY_HOST); new_fpt_array = hypre_CTAlloc(HYPRE_Int, num_threads + 1, HYPRE_MEMORY_HOST); #ifdef HYPRE_USING_OPENMP #pragma omp parallel private(i,j,jj,start,stop,row,rowc,cpt,new_fpt,fpt,d_count_FC,d_count_FF,o_count_FC,o_count_FF) #endif { HYPRE_Int my_thread_num = hypre_GetThreadNum(); start = (n_fine / num_threads) * my_thread_num; if (my_thread_num == num_threads - 1) { stop = n_fine; } else { stop = (n_fine / num_threads) * (my_thread_num + 1); } for (i = start; i < stop; i++) { if (CF_marker[i] > 0) { cpt_array[my_thread_num + 1]++; } else if (CF_marker[i] == -2) { new_fpt_array[my_thread_num + 1]++; fpt_array[my_thread_num + 1]++; } else { fpt_array[my_thread_num + 1]++; } } #ifdef HYPRE_USING_OPENMP #pragma omp barrier #endif if (my_thread_num == 0) { for (i = 1; i < num_threads; i++) { cpt_array[i + 1] += cpt_array[i]; fpt_array[i + 1] += fpt_array[i]; new_fpt_array[i + 1] += new_fpt_array[i]; } } #ifdef HYPRE_USING_OPENMP #pragma omp barrier #endif cpt = cpt_array[my_thread_num]; fpt = fpt_array[my_thread_num]; for (i = start; i < stop; i++) { if (CF_marker[i] > 0) { fine_to_coarse[i] = cpt++; fine_to_fine[i] = -1; } else { fine_to_fine[i] = fpt++; fine_to_coarse[i] = -1; } } #ifdef HYPRE_USING_OPENMP #pragma omp barrier #endif if (my_thread_num == 0) { HYPRE_BigInt big_Fpts, big_new_Fpts; n_Fpts = fpt_array[num_threads]; n_new_Fpts = new_fpt_array[num_threads]; big_Fpts = n_Fpts; big_new_Fpts = n_new_Fpts; hypre_MPI_Scan(&big_Fpts, fpts_starts + 1, 1, HYPRE_MPI_BIG_INT, hypre_MPI_SUM, comm); hypre_MPI_Scan(&big_new_Fpts, new_fpts_starts + 1, 1, HYPRE_MPI_BIG_INT, hypre_MPI_SUM, comm); fpts_starts[0] = fpts_starts[1] - big_Fpts; new_fpts_starts[0] = new_fpts_starts[1] - big_new_Fpts; if (my_id == num_procs - 1) { total_global_new_fpts = new_fpts_starts[1]; total_global_fpts = fpts_starts[1]; total_global_cpts = cpts_starts[1]; } hypre_MPI_Bcast(&total_global_new_fpts, 1, HYPRE_MPI_BIG_INT, num_procs - 1, comm); hypre_MPI_Bcast(&total_global_fpts, 1, HYPRE_MPI_BIG_INT, num_procs - 1, comm); hypre_MPI_Bcast(&total_global_cpts, 1, HYPRE_MPI_BIG_INT, num_procs - 1, comm); } #ifdef HYPRE_USING_OPENMP #pragma omp barrier #endif for (i = start; i < stop; i++) { if (CF_marker[i] > 0) { big_convert[i] = (HYPRE_BigInt)fine_to_coarse[i] + cpts_starts[0]; } else { big_convert[i] = (HYPRE_BigInt)fine_to_fine[i] + fpts_starts[0]; } } #ifdef HYPRE_USING_OPENMP #pragma omp barrier #endif if (my_thread_num == 0) { if (num_cols_A_offd) { CF_marker_offd = hypre_CTAlloc(HYPRE_Int, num_cols_A_offd, HYPRE_MEMORY_HOST); big_convert_offd = hypre_CTAlloc(HYPRE_BigInt, num_cols_A_offd, HYPRE_MEMORY_HOST); fine_to_coarse_offd = hypre_CTAlloc(HYPRE_Int, num_cols_A_offd, HYPRE_MEMORY_HOST); fine_to_fine_offd = hypre_CTAlloc(HYPRE_Int, num_cols_A_offd, HYPRE_MEMORY_HOST); } index = 0; num_sends = hypre_ParCSRCommPkgNumSends(comm_pkg); int_buf_data = hypre_CTAlloc(HYPRE_Int, hypre_ParCSRCommPkgSendMapStart(comm_pkg, num_sends), HYPRE_MEMORY_HOST); big_buf_data = hypre_CTAlloc(HYPRE_BigInt, hypre_ParCSRCommPkgSendMapStart(comm_pkg, num_sends), HYPRE_MEMORY_HOST); for (i = 0; i < num_sends; i++) { startc = hypre_ParCSRCommPkgSendMapStart(comm_pkg, i); for (j = startc; j < hypre_ParCSRCommPkgSendMapStart(comm_pkg, i + 1); j++) { int_buf_data[index] = CF_marker[hypre_ParCSRCommPkgSendMapElmt(comm_pkg, j)]; big_buf_data[index++] = big_convert[hypre_ParCSRCommPkgSendMapElmt(comm_pkg, j)]; } } comm_handle = hypre_ParCSRCommHandleCreate( 11, comm_pkg, int_buf_data, CF_marker_offd); hypre_ParCSRCommHandleDestroy(comm_handle); comm_handle = hypre_ParCSRCommHandleCreate(21, comm_pkg, big_buf_data, big_convert_offd); hypre_ParCSRCommHandleDestroy(comm_handle); num_cols_offd_A_FC = 0; num_cols_offd_A_FF = 0; if (num_cols_A_offd) { for (i = 0; i < num_cols_A_offd; i++) { if (CF_marker_offd[i] > 0) { fine_to_coarse_offd[i] = num_cols_offd_A_FC++; fine_to_fine_offd[i] = -1; } else { fine_to_fine_offd[i] = num_cols_offd_A_FF++; fine_to_coarse_offd[i] = -1; } } col_map_offd_A_FF = hypre_TAlloc(HYPRE_BigInt, num_cols_offd_A_FF, HYPRE_MEMORY_HOST); col_map_offd_A_FC = hypre_TAlloc(HYPRE_BigInt, num_cols_offd_A_FC, HYPRE_MEMORY_HOST); cpt = 0; fpt = 0; for (i = 0; i < num_cols_A_offd; i++) { if (CF_marker_offd[i] > 0) { col_map_offd_A_FC[cpt++] = big_convert_offd[i]; } else { col_map_offd_A_FF[fpt++] = big_convert_offd[i]; } } } A_FF_diag_i = hypre_CTAlloc(HYPRE_Int, n_new_Fpts + 1, memory_location_P); A_FC_diag_i = hypre_CTAlloc(HYPRE_Int, n_Fpts + 1, memory_location_P); A_FF_offd_i = hypre_CTAlloc(HYPRE_Int, n_new_Fpts + 1, memory_location_P); A_FC_offd_i = hypre_CTAlloc(HYPRE_Int, n_Fpts + 1, memory_location_P); } #ifdef HYPRE_USING_OPENMP #pragma omp barrier #endif d_count_FC = 0; d_count_FF = 0; o_count_FC = 0; o_count_FF = 0; row = new_fpt_array[my_thread_num]; rowc = fpt_array[my_thread_num]; for (i = start; i < stop; i++) { if (CF_marker[i] == -2) { row++; rowc++; d_count_FF++; /* account for diagonal element */ for (j = S_diag_i[i]; j < S_diag_i[i + 1]; j++) { jj = S_diag_j[j]; if (CF_marker[jj] > 0) { d_count_FC++; } else { d_count_FF++; } } A_FF_diag_i[row] = d_count_FF; A_FC_diag_i[rowc] = d_count_FC; for (j = S_offd_i[i]; j < S_offd_i[i + 1]; j++) { jj = S_offd_j[j]; if (CF_marker_offd[jj] > 0) { o_count_FC++; } else { o_count_FF++; } } A_FF_offd_i[row] = o_count_FF; A_FC_offd_i[rowc] = o_count_FC; } else if (CF_marker[i] < 0) { rowc++; for (j = S_diag_i[i]; j < S_diag_i[i + 1]; j++) { jj = S_diag_j[j]; if (CF_marker[jj] > 0) { d_count_FC++; } } A_FC_diag_i[rowc] = d_count_FC; for (j = S_offd_i[i]; j < S_offd_i[i + 1]; j++) { jj = S_offd_j[j]; if (CF_marker_offd[jj] > 0) { o_count_FC++; } } A_FC_offd_i[rowc] = o_count_FC; } } #ifdef HYPRE_USING_OPENMP #pragma omp barrier #endif if (my_thread_num == 0) { HYPRE_Int fpt2, new_fpt2; for (i = 1; i < num_threads + 1; i++) { fpt = fpt_array[i]; new_fpt = new_fpt_array[i]; fpt2 = fpt_array[i - 1]; new_fpt2 = new_fpt_array[i - 1]; if (new_fpt != new_fpt2) { A_FF_diag_i[new_fpt] += A_FF_diag_i[new_fpt2]; A_FF_offd_i[new_fpt] += A_FF_offd_i[new_fpt2]; } if (fpt != fpt2) { A_FC_diag_i[fpt] += A_FC_diag_i[fpt2]; A_FC_offd_i[fpt] += A_FC_offd_i[fpt2]; } } row = new_fpt_array[num_threads]; rowc = fpt_array[num_threads]; d_count_FC = A_FC_diag_i[rowc]; d_count_FF = A_FF_diag_i[row]; o_count_FC = A_FC_offd_i[rowc]; o_count_FF = A_FF_offd_i[row]; A_FF_diag_j = hypre_CTAlloc(HYPRE_Int, d_count_FF, memory_location_P); A_FC_diag_j = hypre_CTAlloc(HYPRE_Int, d_count_FC, memory_location_P); A_FF_offd_j = hypre_CTAlloc(HYPRE_Int, o_count_FF, memory_location_P); A_FC_offd_j = hypre_CTAlloc(HYPRE_Int, o_count_FC, memory_location_P); A_FF_diag_data = hypre_CTAlloc(HYPRE_Real, d_count_FF, memory_location_P); A_FC_diag_data = hypre_CTAlloc(HYPRE_Real, d_count_FC, memory_location_P); A_FF_offd_data = hypre_CTAlloc(HYPRE_Real, o_count_FF, memory_location_P); A_FC_offd_data = hypre_CTAlloc(HYPRE_Real, o_count_FC, memory_location_P); } #ifdef HYPRE_USING_OPENMP #pragma omp barrier #endif row = new_fpt_array[my_thread_num]; rowc = fpt_array[my_thread_num]; d_count_FC = A_FC_diag_i[rowc]; d_count_FF = A_FF_diag_i[row]; o_count_FC = A_FC_offd_i[rowc]; o_count_FF = A_FF_offd_i[row]; for (i = start; i < stop; i++) { if (CF_marker[i] == -2) { HYPRE_Int jS, jA; row++; rowc++; jA = A_diag_i[i]; A_FF_diag_j[d_count_FF] = fine_to_fine[A_diag_j[jA]]; A_FF_diag_data[d_count_FF++] = A_diag_data[jA++]; for (j = S_diag_i[i]; j < S_diag_i[i + 1]; j++) { jA = A_diag_i[i] + 1; jS = S_diag_j[j]; while (A_diag_j[jA] != jS) { jA++; } if (CF_marker[S_diag_j[j]] > 0) { A_FC_diag_j[d_count_FC] = fine_to_coarse[A_diag_j[jA]]; A_FC_diag_data[d_count_FC++] = A_diag_data[jA++]; } else { A_FF_diag_j[d_count_FF] = fine_to_fine[A_diag_j[jA]]; A_FF_diag_data[d_count_FF++] = A_diag_data[jA++]; } } A_FF_diag_i[row] = d_count_FF; A_FC_diag_i[rowc] = d_count_FC; for (j = S_offd_i[i]; j < S_offd_i[i + 1]; j++) { jA = A_offd_i[i]; jS = S_offd_j[j]; while (jS != A_offd_j[jA]) { jA++; } if (CF_marker_offd[S_offd_j[j]] > 0) { A_FC_offd_j[o_count_FC] = fine_to_coarse_offd[A_offd_j[jA]]; A_FC_offd_data[o_count_FC++] = A_offd_data[jA++]; } else { A_FF_offd_j[o_count_FF] = fine_to_fine_offd[A_offd_j[jA]]; A_FF_offd_data[o_count_FF++] = A_offd_data[jA++]; } } A_FF_offd_i[row] = o_count_FF; A_FC_offd_i[rowc] = o_count_FC; } else if (CF_marker[i] < 0) { HYPRE_Int jS, jA; rowc++; for (j = S_diag_i[i]; j < S_diag_i[i + 1]; j++) { jA = A_diag_i[i] + 1; jS = S_diag_j[j]; while (A_diag_j[jA] != jS) { jA++; } if (CF_marker[S_diag_j[j]] > 0) { A_FC_diag_j[d_count_FC] = fine_to_coarse[A_diag_j[jA]]; A_FC_diag_data[d_count_FC++] = A_diag_data[jA++]; } } A_FC_diag_i[rowc] = d_count_FC; for (j = S_offd_i[i]; j < S_offd_i[i + 1]; j++) { jA = A_offd_i[i]; jS = S_offd_j[j]; while (jS != A_offd_j[jA]) { jA++; } if (CF_marker_offd[S_offd_j[j]] > 0) { A_FC_offd_j[o_count_FC] = fine_to_coarse_offd[A_offd_j[jA]]; A_FC_offd_data[o_count_FC++] = A_offd_data[jA++]; } } A_FC_offd_i[rowc] = o_count_FC; } } } /*end parallel region */ A_FC = hypre_ParCSRMatrixCreate(comm, total_global_fpts, total_global_cpts, fpts_starts, cpts_starts, num_cols_offd_A_FC, A_FC_diag_i[n_Fpts], A_FC_offd_i[n_Fpts]); A_FF = hypre_ParCSRMatrixCreate(comm, total_global_new_fpts, total_global_fpts, new_fpts_starts, fpts_starts, num_cols_offd_A_FF, A_FF_diag_i[n_new_Fpts], A_FF_offd_i[n_new_Fpts]); A_FC_diag = hypre_ParCSRMatrixDiag(A_FC); hypre_CSRMatrixData(A_FC_diag) = A_FC_diag_data; hypre_CSRMatrixI(A_FC_diag) = A_FC_diag_i; hypre_CSRMatrixJ(A_FC_diag) = A_FC_diag_j; A_FC_offd = hypre_ParCSRMatrixOffd(A_FC); hypre_CSRMatrixData(A_FC_offd) = A_FC_offd_data; hypre_CSRMatrixI(A_FC_offd) = A_FC_offd_i; hypre_CSRMatrixJ(A_FC_offd) = A_FC_offd_j; hypre_ParCSRMatrixColMapOffd(A_FC) = col_map_offd_A_FC; hypre_CSRMatrixMemoryLocation(A_FC_diag) = memory_location_P; hypre_CSRMatrixMemoryLocation(A_FC_offd) = memory_location_P; A_FF_diag = hypre_ParCSRMatrixDiag(A_FF); hypre_CSRMatrixData(A_FF_diag) = A_FF_diag_data; hypre_CSRMatrixI(A_FF_diag) = A_FF_diag_i; hypre_CSRMatrixJ(A_FF_diag) = A_FF_diag_j; A_FF_offd = hypre_ParCSRMatrixOffd(A_FF); hypre_CSRMatrixData(A_FF_offd) = A_FF_offd_data; hypre_CSRMatrixI(A_FF_offd) = A_FF_offd_i; hypre_CSRMatrixJ(A_FF_offd) = A_FF_offd_j; hypre_ParCSRMatrixColMapOffd(A_FF) = col_map_offd_A_FF; hypre_CSRMatrixMemoryLocation(A_FF_diag) = memory_location_P; hypre_CSRMatrixMemoryLocation(A_FF_offd) = memory_location_P; hypre_TFree(fine_to_coarse, HYPRE_MEMORY_HOST); hypre_TFree(fine_to_fine, HYPRE_MEMORY_HOST); hypre_TFree(big_convert, HYPRE_MEMORY_HOST); hypre_TFree(fine_to_coarse_offd, HYPRE_MEMORY_HOST); hypre_TFree(fine_to_fine_offd, HYPRE_MEMORY_HOST); hypre_TFree(big_convert_offd, HYPRE_MEMORY_HOST); hypre_TFree(CF_marker_offd, HYPRE_MEMORY_HOST); hypre_TFree(int_buf_data, HYPRE_MEMORY_HOST); hypre_TFree(big_buf_data, HYPRE_MEMORY_HOST); hypre_TFree(cpt_array, HYPRE_MEMORY_HOST); hypre_TFree(fpt_array, HYPRE_MEMORY_HOST); hypre_TFree(new_fpt_array, HYPRE_MEMORY_HOST); *A_FC_ptr = A_FC; *A_FF_ptr = A_FF; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_ParCSRMatrixGenerateFFFCD3 * * Generate AFF, AFC, AFFC for 2 stage extended+i(e)interpolation *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ParCSRMatrixGenerateFFFCD3( hypre_ParCSRMatrix *A, HYPRE_Int *CF_marker, HYPRE_BigInt *cpts_starts, hypre_ParCSRMatrix *S, hypre_ParCSRMatrix **A_FC_ptr, hypre_ParCSRMatrix **A_FF_ptr, HYPRE_Real **D_lambda_ptr) { MPI_Comm comm = hypre_ParCSRMatrixComm(A); HYPRE_MemoryLocation memory_location_P = hypre_ParCSRMatrixMemoryLocation(A); hypre_ParCSRCommPkg *comm_pkg = hypre_ParCSRMatrixCommPkg(A); hypre_ParCSRCommHandle *comm_handle; /* diag part of A */ hypre_CSRMatrix *A_diag = hypre_ParCSRMatrixDiag(A); HYPRE_Complex *A_diag_data = hypre_CSRMatrixData(A_diag); HYPRE_Int *A_diag_i = hypre_CSRMatrixI(A_diag); HYPRE_Int *A_diag_j = hypre_CSRMatrixJ(A_diag); /* off-diag part of A */ hypre_CSRMatrix *A_offd = hypre_ParCSRMatrixOffd(A); HYPRE_Complex *A_offd_data = hypre_CSRMatrixData(A_offd); HYPRE_Int *A_offd_i = hypre_CSRMatrixI(A_offd); HYPRE_Int *A_offd_j = hypre_CSRMatrixJ(A_offd); HYPRE_Int n_fine = hypre_CSRMatrixNumRows(A_diag); HYPRE_Int num_cols_A_offd = hypre_CSRMatrixNumCols(A_offd); /* diag part of S */ hypre_CSRMatrix *S_diag = hypre_ParCSRMatrixDiag(S); HYPRE_Int *S_diag_i = hypre_CSRMatrixI(S_diag); HYPRE_Int *S_diag_j = hypre_CSRMatrixJ(S_diag); /* off-diag part of S */ hypre_CSRMatrix *S_offd = hypre_ParCSRMatrixOffd(S); HYPRE_Int *S_offd_i = hypre_CSRMatrixI(S_offd); HYPRE_Int *S_offd_j = hypre_CSRMatrixJ(S_offd); HYPRE_Real *D_lambda; hypre_ParCSRMatrix *A_FC; hypre_CSRMatrix *A_FC_diag, *A_FC_offd; HYPRE_Int *A_FC_diag_i, *A_FC_diag_j, *A_FC_offd_i, *A_FC_offd_j = NULL; HYPRE_Complex *A_FC_diag_data, *A_FC_offd_data = NULL; HYPRE_Int num_cols_offd_A_FC; HYPRE_BigInt *col_map_offd_A_FC = NULL; hypre_ParCSRMatrix *A_FF; hypre_CSRMatrix *A_FF_diag, *A_FF_offd; HYPRE_Int *A_FF_diag_i, *A_FF_diag_j, *A_FF_offd_i, *A_FF_offd_j; HYPRE_Complex *A_FF_diag_data, *A_FF_offd_data; HYPRE_Int num_cols_offd_A_FF; HYPRE_BigInt *col_map_offd_A_FF = NULL; HYPRE_Int *fine_to_coarse; HYPRE_Int *fine_to_fine; HYPRE_Int *fine_to_coarse_offd = NULL; HYPRE_Int *fine_to_fine_offd = NULL; HYPRE_Int i, j, jj; HYPRE_Int startc, index; HYPRE_Int cpt, fpt, new_fpt, row, rowc; HYPRE_Int *CF_marker_offd = NULL; HYPRE_Int *int_buf_data = NULL; HYPRE_BigInt *big_convert; HYPRE_BigInt *big_convert_offd = NULL; HYPRE_BigInt *big_buf_data = NULL; HYPRE_BigInt total_global_fpts, total_global_cpts, total_global_new_fpts; HYPRE_BigInt fpts_starts[2], new_fpts_starts[2]; HYPRE_Int my_id, num_procs, num_sends; HYPRE_Int d_count_FF, d_count_FC, o_count_FF, o_count_FC; HYPRE_Int n_Fpts; HYPRE_Int n_new_Fpts; HYPRE_Int *cpt_array, *fpt_array, *new_fpt_array; HYPRE_Int start, stop; HYPRE_Int num_threads; num_threads = hypre_NumThreads(); /* MPI size and rank*/ hypre_MPI_Comm_size(comm, &num_procs); hypre_MPI_Comm_rank(comm, &my_id); fine_to_coarse = hypre_CTAlloc(HYPRE_Int, n_fine, HYPRE_MEMORY_HOST); fine_to_fine = hypre_CTAlloc(HYPRE_Int, n_fine, HYPRE_MEMORY_HOST); big_convert = hypre_CTAlloc(HYPRE_BigInt, n_fine, HYPRE_MEMORY_HOST); cpt_array = hypre_CTAlloc(HYPRE_Int, num_threads + 1, HYPRE_MEMORY_HOST); fpt_array = hypre_CTAlloc(HYPRE_Int, num_threads + 1, HYPRE_MEMORY_HOST); new_fpt_array = hypre_CTAlloc(HYPRE_Int, num_threads + 1, HYPRE_MEMORY_HOST); #ifdef HYPRE_USING_OPENMP #pragma omp parallel private(i,j,jj,start,stop,row,rowc,cpt,new_fpt,fpt,d_count_FC,d_count_FF,o_count_FC,o_count_FF) #endif { HYPRE_Int my_thread_num = hypre_GetThreadNum(); start = (n_fine / num_threads) * my_thread_num; if (my_thread_num == num_threads - 1) { stop = n_fine; } else { stop = (n_fine / num_threads) * (my_thread_num + 1); } for (i = start; i < stop; i++) { if (CF_marker[i] > 0) { cpt_array[my_thread_num + 1]++; } else if (CF_marker[i] == -2) { new_fpt_array[my_thread_num + 1]++; fpt_array[my_thread_num + 1]++; } else { fpt_array[my_thread_num + 1]++; } } #ifdef HYPRE_USING_OPENMP #pragma omp barrier #endif if (my_thread_num == 0) { for (i = 1; i < num_threads; i++) { cpt_array[i + 1] += cpt_array[i]; fpt_array[i + 1] += fpt_array[i]; new_fpt_array[i + 1] += new_fpt_array[i]; } } #ifdef HYPRE_USING_OPENMP #pragma omp barrier #endif cpt = cpt_array[my_thread_num]; fpt = fpt_array[my_thread_num]; for (i = start; i < stop; i++) { if (CF_marker[i] > 0) { fine_to_coarse[i] = cpt++; fine_to_fine[i] = -1; } else { fine_to_fine[i] = fpt++; fine_to_coarse[i] = -1; } } #ifdef HYPRE_USING_OPENMP #pragma omp barrier #endif if (my_thread_num == 0) { HYPRE_BigInt big_Fpts, big_new_Fpts; n_Fpts = fpt_array[num_threads]; n_new_Fpts = new_fpt_array[num_threads]; big_Fpts = n_Fpts; big_new_Fpts = n_new_Fpts; hypre_MPI_Scan(&big_Fpts, fpts_starts + 1, 1, HYPRE_MPI_BIG_INT, hypre_MPI_SUM, comm); hypre_MPI_Scan(&big_new_Fpts, new_fpts_starts + 1, 1, HYPRE_MPI_BIG_INT, hypre_MPI_SUM, comm); fpts_starts[0] = fpts_starts[1] - big_Fpts; new_fpts_starts[0] = new_fpts_starts[1] - big_new_Fpts; if (my_id == num_procs - 1) { total_global_new_fpts = new_fpts_starts[1]; total_global_fpts = fpts_starts[1]; total_global_cpts = cpts_starts[1]; } hypre_MPI_Bcast(&total_global_new_fpts, 1, HYPRE_MPI_BIG_INT, num_procs - 1, comm); hypre_MPI_Bcast(&total_global_fpts, 1, HYPRE_MPI_BIG_INT, num_procs - 1, comm); hypre_MPI_Bcast(&total_global_cpts, 1, HYPRE_MPI_BIG_INT, num_procs - 1, comm); } #ifdef HYPRE_USING_OPENMP #pragma omp barrier #endif for (i = start; i < stop; i++) { if (CF_marker[i] > 0) { big_convert[i] = (HYPRE_BigInt)fine_to_coarse[i] + cpts_starts[0]; } else { big_convert[i] = (HYPRE_BigInt)fine_to_fine[i] + fpts_starts[0]; } } #ifdef HYPRE_USING_OPENMP #pragma omp barrier #endif if (my_thread_num == 0) { if (num_cols_A_offd) { CF_marker_offd = hypre_CTAlloc(HYPRE_Int, num_cols_A_offd, HYPRE_MEMORY_HOST); big_convert_offd = hypre_CTAlloc(HYPRE_BigInt, num_cols_A_offd, HYPRE_MEMORY_HOST); fine_to_coarse_offd = hypre_CTAlloc(HYPRE_Int, num_cols_A_offd, HYPRE_MEMORY_HOST); fine_to_fine_offd = hypre_CTAlloc(HYPRE_Int, num_cols_A_offd, HYPRE_MEMORY_HOST); } index = 0; num_sends = hypre_ParCSRCommPkgNumSends(comm_pkg); int_buf_data = hypre_CTAlloc(HYPRE_Int, hypre_ParCSRCommPkgSendMapStart(comm_pkg, num_sends), HYPRE_MEMORY_HOST); big_buf_data = hypre_CTAlloc(HYPRE_BigInt, hypre_ParCSRCommPkgSendMapStart(comm_pkg, num_sends), HYPRE_MEMORY_HOST); for (i = 0; i < num_sends; i++) { startc = hypre_ParCSRCommPkgSendMapStart(comm_pkg, i); for (j = startc; j < hypre_ParCSRCommPkgSendMapStart(comm_pkg, i + 1); j++) { int_buf_data[index] = CF_marker[hypre_ParCSRCommPkgSendMapElmt(comm_pkg, j)]; big_buf_data[index++] = big_convert[hypre_ParCSRCommPkgSendMapElmt(comm_pkg, j)]; } } comm_handle = hypre_ParCSRCommHandleCreate(11, comm_pkg, int_buf_data, CF_marker_offd); hypre_ParCSRCommHandleDestroy(comm_handle); comm_handle = hypre_ParCSRCommHandleCreate(21, comm_pkg, big_buf_data, big_convert_offd); hypre_ParCSRCommHandleDestroy(comm_handle); num_cols_offd_A_FC = 0; num_cols_offd_A_FF = 0; if (num_cols_A_offd) { for (i = 0; i < num_cols_A_offd; i++) { if (CF_marker_offd[i] > 0) { fine_to_coarse_offd[i] = num_cols_offd_A_FC++; fine_to_fine_offd[i] = -1; } else { fine_to_fine_offd[i] = num_cols_offd_A_FF++; fine_to_coarse_offd[i] = -1; } } col_map_offd_A_FF = hypre_TAlloc(HYPRE_BigInt, num_cols_offd_A_FF, HYPRE_MEMORY_HOST); col_map_offd_A_FC = hypre_TAlloc(HYPRE_BigInt, num_cols_offd_A_FC, HYPRE_MEMORY_HOST); cpt = 0; fpt = 0; for (i = 0; i < num_cols_A_offd; i++) { if (CF_marker_offd[i] > 0) { col_map_offd_A_FC[cpt++] = big_convert_offd[i]; } else { col_map_offd_A_FF[fpt++] = big_convert_offd[i]; } } } A_FF_diag_i = hypre_CTAlloc(HYPRE_Int, n_new_Fpts + 1, memory_location_P); A_FC_diag_i = hypre_CTAlloc(HYPRE_Int, n_Fpts + 1, memory_location_P); A_FF_offd_i = hypre_CTAlloc(HYPRE_Int, n_new_Fpts + 1, memory_location_P); A_FC_offd_i = hypre_CTAlloc(HYPRE_Int, n_Fpts + 1, memory_location_P); D_lambda = hypre_CTAlloc(HYPRE_Real, n_Fpts, memory_location_P); } #ifdef HYPRE_USING_OPENMP #pragma omp barrier #endif d_count_FC = 0; d_count_FF = 0; o_count_FC = 0; o_count_FF = 0; row = new_fpt_array[my_thread_num]; rowc = fpt_array[my_thread_num]; for (i = start; i < stop; i++) { if (CF_marker[i] == -2) { row++; rowc++; d_count_FF++; /* account for diagonal element */ for (j = S_diag_i[i]; j < S_diag_i[i + 1]; j++) { jj = S_diag_j[j]; if (CF_marker[jj] > 0) { d_count_FC++; } else { d_count_FF++; } } A_FF_diag_i[row] = d_count_FF; A_FC_diag_i[rowc] = d_count_FC; for (j = S_offd_i[i]; j < S_offd_i[i + 1]; j++) { jj = S_offd_j[j]; if (CF_marker_offd[jj] > 0) { o_count_FC++; } else { o_count_FF++; } } A_FF_offd_i[row] = o_count_FF; A_FC_offd_i[rowc] = o_count_FC; } else if (CF_marker[i] < 0) { rowc++; for (j = S_diag_i[i]; j < S_diag_i[i + 1]; j++) { jj = S_diag_j[j]; if (CF_marker[jj] > 0) { d_count_FC++; } } A_FC_diag_i[rowc] = d_count_FC; for (j = S_offd_i[i]; j < S_offd_i[i + 1]; j++) { jj = S_offd_j[j]; if (CF_marker_offd[jj] > 0) { o_count_FC++; } } A_FC_offd_i[rowc] = o_count_FC; } } #ifdef HYPRE_USING_OPENMP #pragma omp barrier #endif if (my_thread_num == 0) { HYPRE_Int fpt2, new_fpt2; for (i = 1; i < num_threads + 1; i++) { fpt = fpt_array[i]; new_fpt = new_fpt_array[i]; fpt2 = fpt_array[i - 1]; new_fpt2 = new_fpt_array[i - 1]; if (fpt != fpt2) { A_FC_diag_i[fpt] += A_FC_diag_i[fpt2]; A_FC_offd_i[fpt] += A_FC_offd_i[fpt2]; } if (new_fpt != new_fpt2) { A_FF_diag_i[new_fpt] += A_FF_diag_i[new_fpt2]; A_FF_offd_i[new_fpt] += A_FF_offd_i[new_fpt2]; } } row = new_fpt_array[num_threads]; rowc = fpt_array[num_threads]; d_count_FC = A_FC_diag_i[rowc]; d_count_FF = A_FF_diag_i[row]; o_count_FC = A_FC_offd_i[rowc]; o_count_FF = A_FF_offd_i[row]; A_FF_diag_j = hypre_CTAlloc(HYPRE_Int, d_count_FF, memory_location_P); A_FC_diag_j = hypre_CTAlloc(HYPRE_Int, d_count_FC, memory_location_P); A_FF_offd_j = hypre_CTAlloc(HYPRE_Int, o_count_FF, memory_location_P); A_FC_offd_j = hypre_CTAlloc(HYPRE_Int, o_count_FC, memory_location_P); A_FF_diag_data = hypre_CTAlloc(HYPRE_Real, d_count_FF, memory_location_P); A_FC_diag_data = hypre_CTAlloc(HYPRE_Real, d_count_FC, memory_location_P); A_FF_offd_data = hypre_CTAlloc(HYPRE_Real, o_count_FF, memory_location_P); A_FC_offd_data = hypre_CTAlloc(HYPRE_Real, o_count_FC, memory_location_P); } #ifdef HYPRE_USING_OPENMP #pragma omp barrier #endif row = new_fpt_array[my_thread_num]; rowc = fpt_array[my_thread_num]; d_count_FC = A_FC_diag_i[rowc]; d_count_FF = A_FF_diag_i[row]; o_count_FC = A_FC_offd_i[rowc]; o_count_FF = A_FF_offd_i[row]; for (i = start; i < stop; i++) { if (CF_marker[i] == -2) { HYPRE_Int jS, jA; HYPRE_Real sum = 0; row++; jA = A_diag_i[i]; A_FF_diag_j[d_count_FF] = fine_to_fine[A_diag_j[jA]]; A_FF_diag_data[d_count_FF++] = A_diag_data[jA++]; for (j = S_diag_i[i]; j < S_diag_i[i + 1]; j++) { jA = A_diag_i[i] + 1; jS = S_diag_j[j]; while (A_diag_j[jA] != jS) { jA++; } if (CF_marker[S_diag_j[j]] > 0) { A_FC_diag_j[d_count_FC] = fine_to_coarse[A_diag_j[jA]]; A_FC_diag_data[d_count_FC++] = A_diag_data[jA++]; } else { sum += 1; D_lambda[rowc] += A_diag_data[jA]; A_FF_diag_j[d_count_FF] = fine_to_fine[A_diag_j[jA]]; A_FF_diag_data[d_count_FF++] = A_diag_data[jA++]; } } for (j = S_offd_i[i]; j < S_offd_i[i + 1]; j++) { jA = A_offd_i[i]; jS = S_offd_j[j]; while (jS != A_offd_j[jA]) { jA++; } if (CF_marker_offd[S_offd_j[j]] > 0) { A_FC_offd_j[o_count_FC] = fine_to_coarse_offd[A_offd_j[jA]]; A_FC_offd_data[o_count_FC++] = A_offd_data[jA++]; } else { sum += 1; D_lambda[rowc] += A_offd_data[jA]; A_FF_offd_j[o_count_FF] = fine_to_fine_offd[A_offd_j[jA]]; A_FF_offd_data[o_count_FF++] = A_offd_data[jA++]; } } if (sum) { D_lambda[rowc] = D_lambda[rowc] / sum; } rowc++; A_FF_diag_i[row] = d_count_FF; A_FC_diag_i[rowc] = d_count_FC; A_FF_offd_i[row] = o_count_FF; A_FC_offd_i[rowc] = o_count_FC; } else if (CF_marker[i] < 0) { HYPRE_Int jS, jA; HYPRE_Real sum = 0; for (j = S_diag_i[i]; j < S_diag_i[i + 1]; j++) { jA = A_diag_i[i] + 1; jS = S_diag_j[j]; while (A_diag_j[jA] != jS) { jA++; } if (CF_marker[S_diag_j[j]] > 0) { A_FC_diag_j[d_count_FC] = fine_to_coarse[A_diag_j[jA]]; A_FC_diag_data[d_count_FC++] = A_diag_data[jA++]; } else { sum += 1; D_lambda[rowc] += A_diag_data[jA]; } } for (j = S_offd_i[i]; j < S_offd_i[i + 1]; j++) { jA = A_offd_i[i]; jS = S_offd_j[j]; while (jS != A_offd_j[jA]) { jA++; } if (CF_marker_offd[S_offd_j[j]] > 0) { A_FC_offd_j[o_count_FC] = fine_to_coarse_offd[A_offd_j[jA]]; A_FC_offd_data[o_count_FC++] = A_offd_data[jA++]; } else { sum += 1; D_lambda[rowc] += A_offd_data[jA]; } } if (sum) { D_lambda[rowc] = D_lambda[rowc] / sum; } rowc++; A_FC_diag_i[rowc] = d_count_FC; A_FC_offd_i[rowc] = o_count_FC; } } } /*end parallel region */ A_FC = hypre_ParCSRMatrixCreate(comm, total_global_fpts, total_global_cpts, fpts_starts, cpts_starts, num_cols_offd_A_FC, A_FC_diag_i[n_Fpts], A_FC_offd_i[n_Fpts]); A_FF = hypre_ParCSRMatrixCreate(comm, total_global_new_fpts, total_global_fpts, new_fpts_starts, fpts_starts, num_cols_offd_A_FF, A_FF_diag_i[n_new_Fpts], A_FF_offd_i[n_new_Fpts]); A_FC_diag = hypre_ParCSRMatrixDiag(A_FC); hypre_CSRMatrixData(A_FC_diag) = A_FC_diag_data; hypre_CSRMatrixI(A_FC_diag) = A_FC_diag_i; hypre_CSRMatrixJ(A_FC_diag) = A_FC_diag_j; A_FC_offd = hypre_ParCSRMatrixOffd(A_FC); hypre_CSRMatrixData(A_FC_offd) = A_FC_offd_data; hypre_CSRMatrixI(A_FC_offd) = A_FC_offd_i; hypre_CSRMatrixJ(A_FC_offd) = A_FC_offd_j; hypre_ParCSRMatrixColMapOffd(A_FC) = col_map_offd_A_FC; hypre_CSRMatrixMemoryLocation(A_FC_diag) = memory_location_P; hypre_CSRMatrixMemoryLocation(A_FC_offd) = memory_location_P; A_FF_diag = hypre_ParCSRMatrixDiag(A_FF); hypre_CSRMatrixData(A_FF_diag) = A_FF_diag_data; hypre_CSRMatrixI(A_FF_diag) = A_FF_diag_i; hypre_CSRMatrixJ(A_FF_diag) = A_FF_diag_j; A_FF_offd = hypre_ParCSRMatrixOffd(A_FF); hypre_CSRMatrixData(A_FF_offd) = A_FF_offd_data; hypre_CSRMatrixI(A_FF_offd) = A_FF_offd_i; hypre_CSRMatrixJ(A_FF_offd) = A_FF_offd_j; hypre_ParCSRMatrixColMapOffd(A_FF) = col_map_offd_A_FF; hypre_CSRMatrixMemoryLocation(A_FF_diag) = memory_location_P; hypre_CSRMatrixMemoryLocation(A_FF_offd) = memory_location_P; hypre_TFree(fine_to_coarse, HYPRE_MEMORY_HOST); hypre_TFree(fine_to_fine, HYPRE_MEMORY_HOST); hypre_TFree(big_convert, HYPRE_MEMORY_HOST); hypre_TFree(fine_to_coarse_offd, HYPRE_MEMORY_HOST); hypre_TFree(fine_to_fine_offd, HYPRE_MEMORY_HOST); hypre_TFree(big_convert_offd, HYPRE_MEMORY_HOST); hypre_TFree(CF_marker_offd, HYPRE_MEMORY_HOST); hypre_TFree(int_buf_data, HYPRE_MEMORY_HOST); hypre_TFree(big_buf_data, HYPRE_MEMORY_HOST); hypre_TFree(cpt_array, HYPRE_MEMORY_HOST); hypre_TFree(fpt_array, HYPRE_MEMORY_HOST); hypre_TFree(new_fpt_array, HYPRE_MEMORY_HOST); *A_FC_ptr = A_FC; *A_FF_ptr = A_FF; *D_lambda_ptr = D_lambda; return hypre_error_flag; } hypre-2.33.0/src/parcsr_mv/headers000077500000000000000000000032711477326011500170630ustar00rootroot00000000000000#!/bin/bash # Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) INTERNAL_HEADER=_hypre_parcsr_mv.h #=========================================================================== # Include guards and other includes #=========================================================================== cat > $INTERNAL_HEADER <<@ /*** DO NOT EDIT THIS FILE DIRECTLY (use 'headers' to generate) ***/ #ifndef hypre_PARCSR_MV_HEADER #define hypre_PARCSR_MV_HEADER #include #include "HYPRE_parcsr_mv.h" #include "_hypre_utilities.h" #include "_hypre_seq_block_mv.h" #include "seq_mv.h" #ifdef __cplusplus extern "C" { #endif @ #=========================================================================== # Structures and prototypes #=========================================================================== cat par_csr_communication.h >> $INTERNAL_HEADER cat par_csr_assumed_part.h >> $INTERNAL_HEADER cat new_commpkg.h >> $INTERNAL_HEADER cat par_vector.h >> $INTERNAL_HEADER cat par_csr_matrix.h >> $INTERNAL_HEADER cat numbers.h >> $INTERNAL_HEADER cat par_chord_matrix.h >> $INTERNAL_HEADER cat par_make_system.h >> $INTERNAL_HEADER cat protos.h >> $INTERNAL_HEADER #../utilities/protos [!F]*.c >> $INTERNAL_HEADER #=========================================================================== # Include guards #=========================================================================== cat >> $INTERNAL_HEADER <<@ #ifdef __cplusplus } #endif #endif @ hypre-2.33.0/src/parcsr_mv/new_commpkg.c000066400000000000000000000645761477326011500202130ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /*---------------------------------------------------- * Communication package that uses an assumed partition * AHB 6/04 *-----------------------------------------------------*/ #include "_hypre_parcsr_mv.h" /* some debugging tools*/ #define mydebug 0 /*==========================================================================*/ HYPRE_Int hypre_PrintCommpkg(hypre_ParCSRMatrix *A, const char *file_name) { HYPRE_Int num_components, num_sends, num_recvs; HYPRE_Int *recv_vec_starts, *recv_procs; HYPRE_Int *send_map_starts, *send_map_elements, *send_procs; HYPRE_Int i; HYPRE_Int my_id; MPI_Comm comm; hypre_ParCSRCommPkg *comm_pkg; char new_file[80]; FILE *fp; comm_pkg = hypre_ParCSRMatrixCommPkg(A); comm = hypre_ParCSRCommPkgComm(comm_pkg); num_components = hypre_ParCSRCommPkgNumComponents(comm_pkg); num_recvs = hypre_ParCSRCommPkgNumRecvs(comm_pkg); recv_procs = hypre_ParCSRCommPkgRecvProcs(comm_pkg); recv_vec_starts = hypre_ParCSRCommPkgRecvVecStarts(comm_pkg); num_sends = hypre_ParCSRCommPkgNumSends(comm_pkg); send_procs = hypre_ParCSRCommPkgSendProcs(comm_pkg); send_map_starts = hypre_ParCSRCommPkgSendMapStarts(comm_pkg); send_map_elements = hypre_ParCSRCommPkgSendMapElmts(comm_pkg); hypre_MPI_Comm_rank(comm, &my_id); hypre_sprintf(new_file, "%s.%d", file_name, my_id); fp = fopen(new_file, "w"); hypre_fprintf(fp, "num_components = %d\n", num_components); hypre_fprintf(fp, "num_recvs = %d\n", num_recvs); for (i = 0; i < num_recvs; i++) { hypre_fprintf(fp, "recv_proc [start, end] = %d [%d, %d] \n", recv_procs[i], recv_vec_starts[i], recv_vec_starts[i + 1] - 1); } hypre_fprintf(fp, "num_sends = %d\n", num_sends); for (i = 0; i < num_sends; i++) { hypre_fprintf(fp, "send_proc [start, end] = %d [%d, %d] \n", send_procs[i], send_map_starts[i], send_map_starts[i + 1] - 1); } for (i = 0; i < send_map_starts[num_sends]; i++) { hypre_fprintf(fp, "send_map_elements (%d) = %d\n", i, send_map_elements[i]); } fclose(fp); return hypre_error_flag; } /*------------------------------------------------------------------------------ * hypre_ParCSRCommPkgCreateApart_core * * This does the work for hypre_ParCSRCommPkgCreateApart - we have to split it * off so that it can also be used for block matrices. *------------------------------------------------------------------------------*/ HYPRE_Int hypre_ParCSRCommPkgCreateApart_core( /* input args: */ MPI_Comm comm, HYPRE_BigInt *col_map_off_d, HYPRE_BigInt first_col_diag, HYPRE_Int num_cols_off_d, HYPRE_BigInt global_num_cols, /* pointers to output args: */ HYPRE_Int *p_num_recvs, HYPRE_Int **p_recv_procs, HYPRE_Int **p_recv_vec_starts, HYPRE_Int *p_num_sends, HYPRE_Int **p_send_procs, HYPRE_Int **p_send_map_starts, HYPRE_Int **p_send_map_elements, /* additional input assumed part */ hypre_IJAssumedPart *apart) { HYPRE_Int num_procs, myid; HYPRE_Int j, i; HYPRE_BigInt range_start, range_end; HYPRE_BigInt big_size; HYPRE_Int size; HYPRE_Int count; HYPRE_Int num_recvs, *recv_procs = NULL, *recv_vec_starts = NULL; HYPRE_Int tmp_id, prev_id; HYPRE_Int num_sends; HYPRE_Int ex_num_contacts, *ex_contact_procs = NULL, *ex_contact_vec_starts = NULL; HYPRE_BigInt *ex_contact_buf = NULL; HYPRE_Int num_ranges; HYPRE_BigInt upper_bound; HYPRE_BigInt *response_buf = NULL; HYPRE_Int *response_buf_starts = NULL; HYPRE_Int max_response_size; hypre_DataExchangeResponse response_obj1, response_obj2; hypre_ProcListElements send_proc_obj; #if mydebug HYPRE_Int tmp_int, index; #endif hypre_MPI_Comm_size(comm, &num_procs ); hypre_MPI_Comm_rank(comm, &myid ); #if mydebug hypre_printf("myid = %i, my assumed local range: [%i, %i]\n", myid, apart->row_start, apart->row_end); for (i = 0; i < apart.length; i++) { hypre_printf("myid = %d, proc %d owns assumed partition range = [%d, %d]\n", myid, apart->proc_list[i], apart->row_start_list[i], apart->row_end_list[i]); } hypre_printf("myid = %d, length of apart = %d\n", myid, apart->length); #endif /*----------------------------------------------------------- * Everyone knows where their assumed range is located * (because of the assumed partition object (apart). * For the comm. package, each proc must know it's receive * procs (who it will receive data from and how much data) * and its send procs * (who it will send data to) and the indices of the elements * to be sent. This is based on the non-zero * entries in its rows. Each proc should know this from the user. *-----------------------------------------------------------*/ /*------------------------------------------------------------ * First, get the receive processors * each par_csr matrix will have a certain number of columns * (num_cols_off_d) given in col_map_offd[] for which it needs * data from another processor. *------------------------------------------------------------*/ /*calculate the assumed receive processors*/ /* need to populate num_recvs, *recv_procs, and *recv_vec_starts (correlates to starts in col_map_off_d for recv_procs) for the comm. package*/ /*create contact information*/ ex_num_contacts = 0; /*estimate the storage needed*/ if (num_cols_off_d > 0 && (apart->row_end - apart->row_start) > 0 ) { big_size = col_map_off_d[num_cols_off_d - 1] - col_map_off_d[0]; size = (HYPRE_Int)(big_size / (apart->row_end - apart->row_start)) + 2; } else { size = 0; } /*we will contact each with a range of cols that we need*/ /* it is ok to contact yourself - because then there doesn't need to be separate code */ ex_contact_procs = hypre_CTAlloc(HYPRE_Int, size, HYPRE_MEMORY_HOST); ex_contact_vec_starts = hypre_CTAlloc(HYPRE_Int, size + 1, HYPRE_MEMORY_HOST); ex_contact_buf = hypre_CTAlloc(HYPRE_BigInt, size * 2, HYPRE_MEMORY_HOST); range_end = -1; for (i = 0; i < num_cols_off_d; i++) { if (col_map_off_d[i] > range_end) { hypre_GetAssumedPartitionProcFromRow(comm, col_map_off_d[i], 0, global_num_cols, &tmp_id); if (ex_num_contacts == size) /*need more space? */ { size += 20; ex_contact_procs = hypre_TReAlloc(ex_contact_procs, HYPRE_Int, size, HYPRE_MEMORY_HOST); ex_contact_vec_starts = hypre_TReAlloc(ex_contact_vec_starts, HYPRE_Int, size + 1, HYPRE_MEMORY_HOST); ex_contact_buf = hypre_TReAlloc(ex_contact_buf, HYPRE_BigInt, size * 2, HYPRE_MEMORY_HOST); } /* end of prev. range */ if (ex_num_contacts > 0) { ex_contact_buf[ex_num_contacts * 2 - 1] = col_map_off_d[i - 1]; } /*start new range*/ ex_contact_procs[ex_num_contacts] = tmp_id; ex_contact_vec_starts[ex_num_contacts] = ex_num_contacts * 2; ex_contact_buf[ex_num_contacts * 2] = col_map_off_d[i]; ex_num_contacts++; hypre_GetAssumedPartitionRowRange(comm, tmp_id, 0, global_num_cols, &range_start, &range_end); } } /*finish the starts*/ ex_contact_vec_starts[ex_num_contacts] = ex_num_contacts * 2; /*finish the last range*/ if (ex_num_contacts > 0) { ex_contact_buf[ex_num_contacts * 2 - 1] = col_map_off_d[num_cols_off_d - 1]; } /*don't allocate space for responses */ /*create response object*/ response_obj1.fill_response = hypre_RangeFillResponseIJDetermineRecvProcs; response_obj1.data1 = apart; /* this is necessary so we can fill responses*/ response_obj1.data2 = NULL; max_response_size = 6; /* 6 means we can fit 3 ranges*/ hypre_DataExchangeList(ex_num_contacts, ex_contact_procs, ex_contact_buf, ex_contact_vec_starts, sizeof(HYPRE_BigInt), sizeof(HYPRE_BigInt), &response_obj1, max_response_size, 1, comm, (void**) &response_buf, &response_buf_starts); /*now create recv_procs[] and recv_vec_starts[] and num_recvs from the complete data in response_buf - this array contains a proc_id followed by an upper bound for the range. */ /*initialize */ num_recvs = 0; size = ex_num_contacts + 20; /* num of recv procs should be roughly similar size to number of contacts - add a buffer of 20*/ recv_procs = hypre_CTAlloc(HYPRE_Int, size, HYPRE_MEMORY_HOST); recv_vec_starts = hypre_CTAlloc(HYPRE_Int, size + 1, HYPRE_MEMORY_HOST); recv_vec_starts[0] = 0; /*how many ranges were returned?*/ num_ranges = response_buf_starts[ex_num_contacts]; num_ranges = num_ranges / 2; prev_id = -1; j = 0; count = 0; /* loop through ranges */ for (i = 0; i < num_ranges; i++) { upper_bound = response_buf[i * 2 + 1]; count = 0; /* loop through off_d entries - counting how many are in the range */ while (j < num_cols_off_d && col_map_off_d[j] <= upper_bound) { j++; count++; } if (count > 0) { /*add the range if the proc id != myid*/ tmp_id = response_buf[i * 2]; if (tmp_id != myid) { if (tmp_id != prev_id) /*increment the number of recvs */ { /*check size of recv buffers*/ if (num_recvs == size) { size += 20; recv_procs = hypre_TReAlloc(recv_procs, HYPRE_Int, size, HYPRE_MEMORY_HOST); recv_vec_starts = hypre_TReAlloc(recv_vec_starts, HYPRE_Int, size + 1, HYPRE_MEMORY_HOST); } recv_vec_starts[num_recvs + 1] = j; /*the new start is at this element*/ recv_procs[num_recvs] = tmp_id; /*add the new processor*/ num_recvs++; } else { /*same processor - just change the vec starts*/ recv_vec_starts[num_recvs] = j; /*the new start is at this element*/ } } prev_id = tmp_id; } } #if mydebug for (i = 0; i < num_recvs; i++) { hypre_printf("myid = %d, recv proc = %d, vec_starts = [%d : %d]\n", myid, recv_procs[i], recv_vec_starts[i], recv_vec_starts[i + 1] - 1); } #endif /*------------------------------------------------------------ * determine the send processors * each processor contacts its recv procs to let them * know they are a send processor *-------------------------------------------------------------*/ /* the contact information is the recv_processor infomation - so nothing more to do to generate contact info*/ /* the response we expect is just a confirmation*/ hypre_TFree(response_buf, HYPRE_MEMORY_HOST); hypre_TFree(response_buf_starts, HYPRE_MEMORY_HOST); response_buf = NULL; response_buf_starts = NULL; /*build the response object*/ /*estimate for inital storage allocation that we send to as many procs as we recv from + pad by 5*/ send_proc_obj.length = 0; send_proc_obj.storage_length = num_recvs + 5; send_proc_obj.id = hypre_CTAlloc(HYPRE_Int, send_proc_obj.storage_length, HYPRE_MEMORY_HOST); send_proc_obj.vec_starts = hypre_CTAlloc(HYPRE_Int, send_proc_obj.storage_length + 1, HYPRE_MEMORY_HOST); send_proc_obj.vec_starts[0] = 0; send_proc_obj.element_storage_length = num_cols_off_d; send_proc_obj.elements = hypre_CTAlloc(HYPRE_BigInt, send_proc_obj.element_storage_length, HYPRE_MEMORY_HOST); response_obj2.fill_response = hypre_FillResponseIJDetermineSendProcs; response_obj2.data1 = NULL; response_obj2.data2 = &send_proc_obj; /*this is where we keep info from contacts*/ max_response_size = 0; hypre_DataExchangeList(num_recvs, recv_procs, col_map_off_d, recv_vec_starts, sizeof(HYPRE_BigInt), sizeof(HYPRE_BigInt), &response_obj2, max_response_size, 2, comm, (void **) &response_buf, &response_buf_starts); num_sends = send_proc_obj.length; /*send procs are in send_proc_object.id */ /*send proc starts are in send_proc_obj.vec_starts */ #if mydebug hypre_printf("myid = %d, num_sends = %d\n", myid, num_sends); for (i = 0; i < num_sends; i++) { tmp_int = send_proc_obj.vec_starts[i + 1] - send_proc_obj.vec_starts[i]; index = send_proc_obj.vec_starts[i]; for (j = 0; j < tmp_int; j++) { hypre_printf("myid = %d, send proc = %d, send element = %d\n", myid, send_proc_obj.id[i], send_proc_obj.elements[index + j]); } } #endif /*----------------------------------------------------------- * We need to sort the send procs and send elements (to produce * the same result as with the standard comm package) * 11/07/05 *-----------------------------------------------------------*/ { HYPRE_Int *orig_order; HYPRE_Int *orig_send_map_starts; HYPRE_BigInt *orig_send_elements; HYPRE_Int ct, sz, pos; orig_order = hypre_CTAlloc(HYPRE_Int, num_sends, HYPRE_MEMORY_HOST); orig_send_map_starts = hypre_CTAlloc(HYPRE_Int, num_sends + 1, HYPRE_MEMORY_HOST); orig_send_elements = hypre_CTAlloc(HYPRE_BigInt, send_proc_obj.vec_starts[num_sends], HYPRE_MEMORY_HOST); orig_send_map_starts[0] = 0; /* copy send map starts and elements */ for (i = 0; i < num_sends; i++) { orig_order[i] = i; orig_send_map_starts[i + 1] = send_proc_obj.vec_starts[i + 1]; } for (i = 0; i < send_proc_obj.vec_starts[num_sends]; i++) { orig_send_elements[i] = send_proc_obj.elements[i]; } /* sort processor ids - keep track of original order */ hypre_qsort2i( send_proc_obj.id, orig_order, 0, num_sends - 1 ); /* now rearrange vec starts and send elements to correspond to proc ids */ ct = 0; for (i = 0; i < num_sends; i++) { pos = orig_order[i]; sz = orig_send_map_starts[pos + 1] - orig_send_map_starts[pos]; send_proc_obj.vec_starts[i + 1] = ct + sz; for (j = 0; j < sz; j++) { send_proc_obj.elements[ct + j] = orig_send_elements[orig_send_map_starts[pos] + j]; } ct += sz; } /* clean up */ hypre_TFree(orig_order, HYPRE_MEMORY_HOST); hypre_TFree(orig_send_elements, HYPRE_MEMORY_HOST); hypre_TFree(orig_send_map_starts, HYPRE_MEMORY_HOST); } /*----------------------------------------------------------- * Return output info for setting up the comm package *-----------------------------------------------------------*/ if (!num_recvs) { hypre_TFree(recv_procs, HYPRE_MEMORY_HOST); recv_procs = NULL; } if (!num_sends) { hypre_TFree(send_proc_obj.id, HYPRE_MEMORY_HOST); send_proc_obj.id = NULL; } *p_num_recvs = num_recvs; *p_recv_procs = recv_procs; *p_recv_vec_starts = recv_vec_starts; *p_num_sends = num_sends; *p_send_procs = send_proc_obj.id; *p_send_map_starts = send_proc_obj.vec_starts; /*send map elements have global index - need local instead*/ /*need to fix this !!! */ if (num_sends) { HYPRE_Int *tmp_elements = hypre_CTAlloc(HYPRE_Int, send_proc_obj.vec_starts[num_sends], HYPRE_MEMORY_HOST); for (i = 0; i < send_proc_obj.vec_starts[num_sends]; i++) { //send_proc_obj.elements[i] -= first_col_diag; tmp_elements[i] = (HYPRE_Int)(send_proc_obj.elements[i] - first_col_diag); } *p_send_map_elements = tmp_elements; hypre_TFree(send_proc_obj.elements, HYPRE_MEMORY_HOST); send_proc_obj.elements = NULL; } else { hypre_TFree(send_proc_obj.elements, HYPRE_MEMORY_HOST); send_proc_obj.elements = NULL; *p_send_map_elements = NULL; } //*p_send_map_elements = send_proc_obj.elements; /*----------------------------------------------------------- * Clean up *-----------------------------------------------------------*/ hypre_TFree(ex_contact_procs, HYPRE_MEMORY_HOST); hypre_TFree(ex_contact_vec_starts, HYPRE_MEMORY_HOST); hypre_TFree(ex_contact_buf, HYPRE_MEMORY_HOST); hypre_TFree(response_buf, HYPRE_MEMORY_HOST); hypre_TFree(response_buf_starts, HYPRE_MEMORY_HOST); /* don't free send_proc_obj.id,send_proc_obj.vec_starts,send_proc_obj.elements; recv_procs, recv_vec_starts. These are aliased to the comm package and will be destroyed there */ return hypre_error_flag; } /*------------------------------------------------------------------ * hypre_ParCSRCommPkgCreateApart * this is an alternate way of constructing the comm package * compare with hypre_ParCSRCommPkgCreate() in par_csr_communication.c * which should be more scalable *-------------------------------------------------------------------*/ HYPRE_Int hypre_ParCSRCommPkgCreateApart ( /* input args: */ MPI_Comm comm, HYPRE_BigInt *col_map_off_d, HYPRE_BigInt first_col_diag, HYPRE_Int num_cols_off_d, HYPRE_BigInt global_num_cols, hypre_IJAssumedPart *apart, /* output */ hypre_ParCSRCommPkg *comm_pkg ) { HYPRE_Int num_sends, *send_procs, *send_map_starts; HYPRE_Int num_recvs, *recv_procs, *recv_vec_starts; HYPRE_Int *send_map_elmts; /*----------------------------------------------------------- * get commpkg info information *----------------------------------------------------------*/ hypre_ParCSRCommPkgCreateApart_core( comm, col_map_off_d, first_col_diag, num_cols_off_d, global_num_cols, &num_recvs, &recv_procs, &recv_vec_starts, &num_sends, &send_procs, &send_map_starts, &send_map_elmts, apart); /* Fill the communication package */ hypre_ParCSRCommPkgCreateAndFill(comm, num_recvs, recv_procs, recv_vec_starts, num_sends, send_procs, send_map_starts, send_map_elmts, &comm_pkg); return hypre_error_flag; } /*------------------------------------------------------------------ * hypre_NewCommPkgDestroy * * Destroy the comm package *------------------------------------------------------------------*/ HYPRE_Int hypre_NewCommPkgDestroy( hypre_ParCSRMatrix *parcsr_A ) { hypre_ParCSRCommPkg *comm_pkg = hypre_ParCSRMatrixCommPkg(parcsr_A); /*even if num_sends and num_recvs = 0, storage may have been allocated */ if (hypre_ParCSRCommPkgSendProcs(comm_pkg)) { hypre_TFree(hypre_ParCSRCommPkgSendProcs(comm_pkg), HYPRE_MEMORY_HOST); } if (hypre_ParCSRCommPkgSendMapElmts(comm_pkg)) { hypre_TFree(hypre_ParCSRCommPkgSendMapElmts(comm_pkg), HYPRE_MEMORY_HOST); } if (hypre_ParCSRCommPkgSendMapStarts(comm_pkg)) { hypre_TFree(hypre_ParCSRCommPkgSendMapStarts(comm_pkg), HYPRE_MEMORY_HOST); } if (hypre_ParCSRCommPkgRecvProcs(comm_pkg)) { hypre_TFree(hypre_ParCSRCommPkgRecvProcs(comm_pkg), HYPRE_MEMORY_HOST); } if (hypre_ParCSRCommPkgRecvVecStarts(comm_pkg)) { hypre_TFree(hypre_ParCSRCommPkgRecvVecStarts(comm_pkg), HYPRE_MEMORY_HOST); } hypre_TFree(comm_pkg, HYPRE_MEMORY_HOST); hypre_ParCSRMatrixCommPkg(parcsr_A) = NULL; return hypre_error_flag; } /*-------------------------------------------------------------------- * hypre_RangeFillResponseIJDetermineRecvProcs * * Fill response function for determining the recv. processors * data exchange *--------------------------------------------------------------------*/ HYPRE_Int hypre_RangeFillResponseIJDetermineRecvProcs( void *p_recv_contact_buf, HYPRE_Int contact_size, HYPRE_Int contact_proc, void *ro, MPI_Comm comm, void **p_send_response_buf, HYPRE_Int *response_message_size ) { HYPRE_UNUSED_VAR(contact_size); HYPRE_UNUSED_VAR(contact_proc); HYPRE_UNUSED_VAR(p_send_response_buf); HYPRE_Int myid, tmp_id; HYPRE_BigInt row_end; HYPRE_Int j; HYPRE_Int index, size; HYPRE_BigInt row_val; HYPRE_BigInt *send_response_buf = (HYPRE_BigInt *) *p_send_response_buf; HYPRE_BigInt *recv_contact_buf = (HYPRE_BigInt * ) p_recv_contact_buf; hypre_DataExchangeResponse *response_obj = (hypre_DataExchangeResponse*)ro; hypre_IJAssumedPart *part = (hypre_IJAssumedPart*)response_obj->data1; HYPRE_Int overhead = response_obj->send_response_overhead; /*------------------------------------------------------------------- * we are getting a range of off_d entries - need to see if we own them * or how many ranges to send back - send back * with format [proc_id end_row proc_id #end_row proc_id #end_row etc...]. *----------------------------------------------------------------------*/ hypre_MPI_Comm_rank(comm, &myid); /* populate send_response_buf */ index = 0; /*count entries in send_response_buf*/ j = 0; /*marks which partition of the assumed partition we are in */ row_val = recv_contact_buf[0]; /*beginning of range*/ row_end = part->row_end_list[part->sort_index[j]]; tmp_id = part->proc_list[part->sort_index[j]]; /*check storage in send_buf for adding the ranges */ size = 2 * (part->length); if (response_obj->send_response_storage < size) { response_obj->send_response_storage = hypre_max(size, 20); send_response_buf = hypre_TReAlloc(send_response_buf, HYPRE_BigInt, response_obj->send_response_storage + overhead, HYPRE_MEMORY_HOST); *p_send_response_buf = send_response_buf; /* needed when using ReAlloc */ } while (row_val > row_end) /*which partition to start in */ { j++; row_end = part->row_end_list[part->sort_index[j]]; tmp_id = part->proc_list[part->sort_index[j]]; } /*add this range*/ send_response_buf[index++] = (HYPRE_BigInt)tmp_id; send_response_buf[index++] = row_end; j++; /*increase j to look in next partition */ /*any more? - now compare with end of range value*/ row_val = recv_contact_buf[1]; /*end of range*/ while (j < part->length && row_val > row_end ) { row_end = part->row_end_list[part->sort_index[j]]; tmp_id = part->proc_list[part->sort_index[j]]; send_response_buf[index++] = (HYPRE_BigInt) tmp_id; send_response_buf[index++] = row_end; j++; } *response_message_size = index; *p_send_response_buf = send_response_buf; return hypre_error_flag; } /*-------------------------------------------------------------------- * hypre_FillResponseIJDetermineSendProcs * * Fill response function for determining the send processors * data exchange *--------------------------------------------------------------------*/ HYPRE_Int hypre_FillResponseIJDetermineSendProcs(void *p_recv_contact_buf, HYPRE_Int contact_size, HYPRE_Int contact_proc, void *ro, MPI_Comm comm, void **p_send_response_buf, HYPRE_Int *response_message_size ) { HYPRE_UNUSED_VAR(p_send_response_buf); HYPRE_Int myid; HYPRE_Int i, index, count, elength; HYPRE_BigInt *recv_contact_buf = (HYPRE_BigInt * ) p_recv_contact_buf; hypre_DataExchangeResponse *response_obj = (hypre_DataExchangeResponse*)ro; hypre_ProcListElements *send_proc_obj = (hypre_ProcListElements*)response_obj->data2; hypre_MPI_Comm_rank(comm, &myid ); /*check to see if we need to allocate more space in send_proc_obj for ids*/ if (send_proc_obj->length == send_proc_obj->storage_length) { send_proc_obj->storage_length += 20; /*add space for 20 more processors*/ send_proc_obj->id = hypre_TReAlloc(send_proc_obj->id, HYPRE_Int, send_proc_obj->storage_length, HYPRE_MEMORY_HOST); send_proc_obj->vec_starts = hypre_TReAlloc(send_proc_obj->vec_starts, HYPRE_Int, send_proc_obj->storage_length + 1, HYPRE_MEMORY_HOST); } /*initialize*/ count = send_proc_obj->length; index = send_proc_obj->vec_starts[count]; /*this is the number of elements*/ /*send proc*/ send_proc_obj->id[count] = contact_proc; /*do we need more storage for the elements?*/ if (send_proc_obj->element_storage_length < index + contact_size) { elength = hypre_max(contact_size, 50); elength += index; send_proc_obj->elements = hypre_TReAlloc(send_proc_obj->elements, HYPRE_BigInt, elength, HYPRE_MEMORY_HOST); send_proc_obj->element_storage_length = elength; } /*populate send_proc_obj*/ for (i = 0; i < contact_size; i++) { send_proc_obj->elements[index++] = recv_contact_buf[i]; } send_proc_obj->vec_starts[count + 1] = index; send_proc_obj->length++; /*output - no message to return (confirmation) */ *response_message_size = 0; return hypre_error_flag; } hypre-2.33.0/src/parcsr_mv/new_commpkg.h000066400000000000000000000014021477326011500201730ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #ifndef hypre_NEW_COMMPKG #define hypre_NEW_COMMPKG typedef struct { HYPRE_Int length; HYPRE_Int storage_length; HYPRE_Int *id; HYPRE_Int *vec_starts; HYPRE_Int element_storage_length; HYPRE_BigInt *elements; HYPRE_Real *d_elements; /* Is this used anywhere? */ void *v_elements; } hypre_ProcListElements; #endif /* hypre_NEW_COMMPKG */ hypre-2.33.0/src/parcsr_mv/numbers.c000066400000000000000000000073331477326011500173440ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include #include #include #include "_hypre_parcsr_mv.h" hypre_NumbersNode * hypre_NumbersNewNode( void ) /* makes a new node for a tree representing numbers */ { HYPRE_Int i; hypre_NumbersNode * newnode = hypre_CTAlloc( hypre_NumbersNode, 1, HYPRE_MEMORY_HOST); for ( i = 0; i <= 10; ++i ) { newnode->digit[i] = NULL; } return newnode; } void hypre_NumbersDeleteNode( hypre_NumbersNode * node ) /* deletes a node and the tree of which it is root */ { HYPRE_Int i; for ( i = 0; i <= 10; ++i ) if ( node->digit[i] != NULL ) { hypre_NumbersDeleteNode( node->digit[i] ); node->digit[i] = NULL; }; hypre_TFree( node, HYPRE_MEMORY_HOST); } HYPRE_Int hypre_NumbersEnter( hypre_NumbersNode * node, const HYPRE_Int n ) /* enters a number in the tree starting with 'node'. */ { HYPRE_Int newN = 0; HYPRE_Int q = n / 10; HYPRE_Int r = n % 10; hypre_assert( n >= 0 ); if ( node->digit[r] == NULL ) { node->digit[r] = hypre_NumbersNewNode(); newN = 1; }; if ( q < 10 ) /* q is a one-digit number; point to terminal object */ { if ( (node->digit[r])->digit[10] == NULL ) { (node->digit[r])->digit[10] = hypre_NumbersNewNode(); } } else /* multidigit number; place for this digit points to next node */ { newN = hypre_NumbersEnter(node->digit[r], q ); } return newN; } HYPRE_Int hypre_NumbersNEntered( hypre_NumbersNode * node ) /* returns the number of numbers represented by the tree whose root is 'node' */ { HYPRE_Int i; HYPRE_Int count = 0; if ( node == NULL ) { return 0; } for ( i = 0; i < 10; ++i ) if ( node->digit[i] != NULL ) { count += hypre_NumbersNEntered( node->digit[i] ); } if ( node->digit[10] != NULL ) { ++count; } return count; } HYPRE_Int hypre_NumbersQuery( hypre_NumbersNode * node, const HYPRE_Int n ) /* returns 1 if n is on the tree with root 'node', 0 otherwise */ { HYPRE_Int q = n / 10; HYPRE_Int r = n % 10; hypre_assert( n >= 0 ); if ( node->digit[r] == NULL ) /* low order digit of n not on tree */ { return 0; } else if ( q < 10 ) /* q is a one-digit number; check terminal object */ { if ( (node->digit[r])->digit[10] == NULL ) { return 0; } else { return 1; } } else /* look for higher order digits of n on tree of its low order digit r */ { return hypre_NumbersQuery( node->digit[r], q ); } } HYPRE_Int * hypre_NumbersArray( hypre_NumbersNode * node ) /* allocates and returns an unordered array of ints as a simpler representation of the contents of the Numbers tree. For the array length, call hypre_NumbersNEntered */ { HYPRE_Int i, j, Ntemp; HYPRE_Int k = 0; HYPRE_Int N = hypre_NumbersNEntered(node); HYPRE_Int * array, * temp; array = hypre_CTAlloc( HYPRE_Int, N, HYPRE_MEMORY_HOST); if ( node == NULL ) { return array; } for ( i = 0; i < 10; ++i ) if ( node->digit[i] != NULL ) { Ntemp = hypre_NumbersNEntered( node->digit[i] ); temp = hypre_NumbersArray( node->digit[i] ); for ( j = 0; j < Ntemp; ++j ) { array[k++] = temp[j] * 10 + i; } hypre_TFree(temp, HYPRE_MEMORY_HOST); } if ( node->digit[10] != NULL ) { array[k++] = 0; } hypre_assert( k == N ); return array; } hypre-2.33.0/src/parcsr_mv/numbers.h000066400000000000000000000035131477326011500173450ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * Tree structure for keeping track of numbers (e.g. column numbers) - * when you get them one at a time, in no particular order, possibly very * sparse. In a scalable manner you want to be able to store them and find * out whether a number has been stored. * All decimal numbers will fit in a tree with 10 branches (digits) * off each node. We also have a terminal "digit" to indicate that the entire * number has been seen. E.g., 1234 would be entered in a tree as: * (numbering the digits off a node as 0 1 2 3 4 5 6 7 8 9 TERM ) * root * | * - - - - 4 - - - - - - * | * - - - 3 - - - - - - - * | * - - 2 - - - - - - - - * | * - 1 - - - - - - - - - * | * - - - - - - - - - - T * * * This tree represents a number through its decimal expansion, but if needed * base depends on how the numbers encountered are distributed. Totally * The more clustered, the larger the base should be in my judgement. * *****************************************************************************/ #ifndef hypre_NUMBERS_HEADER #define hypre_NUMBERS_HEADER typedef struct hypre_NumbersNode { struct hypre_NumbersNode * digit[11]; } hypre_NumbersNode; #endif hypre-2.33.0/src/parcsr_mv/par_chord_matrix.h000066400000000000000000000074401477326011500212220ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * Header info for Parallel Chord Matrix data structures * *****************************************************************************/ #ifndef hypre_PAR_CHORD_MATRIX_HEADER #define hypre_PAR_CHORD_MATRIX_HEADER /*-------------------------------------------------------------------------- * Parallel Chord Matrix *--------------------------------------------------------------------------*/ typedef struct { MPI_Comm comm; /* A structure: -------------------------------------------------------- */ HYPRE_Int num_inprocessors; HYPRE_Int *inprocessor; /* receiving in idof from different (in)processors; ---------------------- */ HYPRE_Int *num_idofs_inprocessor; HYPRE_Int **idof_inprocessor; /* symmetric information: ----------------------------------------------- */ /* this can be replaces by CSR format: ---------------------------------- */ HYPRE_Int *num_inchords; HYPRE_Int **inchord_idof; HYPRE_Int **inchord_rdof; HYPRE_Complex **inchord_data; HYPRE_Int num_idofs; HYPRE_Int num_rdofs; HYPRE_Int *firstindex_idof; /* not owned by my_id; ---------------------- */ HYPRE_Int *firstindex_rdof; /* not owned by my_id; ---------------------- */ /* --------------------------- mirror information: ---------------------- */ /* participation of rdof in different processors; ----------------------- */ HYPRE_Int num_toprocessors; HYPRE_Int *toprocessor; /* rdofs to be sentto toprocessors; ------------------------------------- ---------------------------------------------------------------------- */ HYPRE_Int *num_rdofs_toprocessor; HYPRE_Int **rdof_toprocessor; } hypre_ParChordMatrix; /*-------------------------------------------------------------------------- * Accessor functions for the Parallel CSR Matrix structure *--------------------------------------------------------------------------*/ #define hypre_ParChordMatrixComm(matrix) ((matrix) -> comm) /* matrix structure: ----------------------------------------------------- */ #define hypre_ParChordMatrixNumInprocessors(matrix) ((matrix) -> num_inprocessors) #define hypre_ParChordMatrixInprocessor(matrix) ((matrix) -> inprocessor) #define hypre_ParChordMatrixNumIdofsInprocessor(matrix) ((matrix) -> num_idofs_inprocessor) #define hypre_ParChordMatrixIdofInprocessor(matrix) ((matrix) -> idof_inprocessor) #define hypre_ParChordMatrixNumInchords(matrix) ((matrix) -> num_inchords) #define hypre_ParChordMatrixInchordIdof(matrix) ((matrix) -> inchord_idof) #define hypre_ParChordMatrixInchordRdof(matrix) ((matrix) -> inchord_rdof) #define hypre_ParChordMatrixInchordData(matrix) ((matrix) -> inchord_data) #define hypre_ParChordMatrixNumIdofs(matrix) ((matrix) -> num_idofs) #define hypre_ParChordMatrixNumRdofs(matrix) ((matrix) -> num_rdofs) #define hypre_ParChordMatrixFirstindexIdof(matrix) ((matrix) -> firstindex_idof) #define hypre_ParChordMatrixFirstindexRdof(matrix) ((matrix) -> firstindex_rdof) /* participation of rdof in different processors; ---------- */ #define hypre_ParChordMatrixNumToprocessors(matrix) ((matrix) -> num_toprocessors) #define hypre_ParChordMatrixToprocessor(matrix) ((matrix) -> toprocessor) #define hypre_ParChordMatrixNumRdofsToprocessor(matrix) ((matrix) -> num_rdofs_toprocessor) #define hypre_ParChordMatrixRdofToprocessor(matrix) ((matrix) -> rdof_toprocessor) #endif hypre-2.33.0/src/parcsr_mv/par_csr_aat.c000066400000000000000000001126451477326011500201520ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /* Will compute A*A^T, A a Boolean matrix or matrix of doubles. based on par_csr_matop.c and mli_pcsr_bool_matop.c */ #include "_hypre_parcsr_mv.h" extern hypre_CSRMatrix * hypre_ParCSRMatrixExtractAExt( hypre_ParCSRMatrix *A, HYPRE_Int data, HYPRE_BigInt ** pA_ext_row_map ); void hypre_ParAat_RowSizes( HYPRE_Int ** C_diag_i, HYPRE_Int ** C_offd_i, HYPRE_Int * B_marker, HYPRE_Int * A_diag_i, HYPRE_Int * A_diag_j, HYPRE_Int * A_offd_i, HYPRE_Int * A_offd_j, HYPRE_BigInt * A_col_map_offd, HYPRE_Int * A_ext_i, HYPRE_BigInt * A_ext_j, HYPRE_BigInt * A_ext_row_map, HYPRE_Int *C_diag_size, HYPRE_Int *C_offd_size, HYPRE_Int num_rows_diag_A, HYPRE_Int num_cols_offd_A, HYPRE_Int num_rows_A_ext, HYPRE_BigInt first_col_diag_A, HYPRE_BigInt first_row_index_A ) /* computes the sizes of the rows of C = A * A^T. Out: HYPRE_Int** C_diag_i, C_offd_i Workspace provided: HYPRE_Int * B_marker In: HYPRE_Int* A_diag_i, A_diag_j, A_offd_i, A_offd_j, A_ext_i, A_ext_j, A_ext_row_map Out: HYPRE_Int* C_diag_size, C_offd_size In: HYPRE_Int num_rows_diag_A, num_cols_offd_A, num_rows_offd_A_ext, first_row_index_A */ { /* There are 3 CSRMatrix or CSRBooleanMatrix objects behind the arrays here: Any ext*Y belongs to another processor. And diag*offd, offd*diag never have any entries because by definition diag and offd have different columns. So we have to do 4: offd*ext, diag*diag, diag*ext, and offd*offd. */ HYPRE_Int i1, i3, jj2, jj3; HYPRE_BigInt big_i2; HYPRE_Int jj_count_diag, jj_count_offd, jj_row_begin_diag, jj_row_begin_offd; HYPRE_BigInt last_col_diag_C; HYPRE_Int start_indexing = 0; /* start indexing for C_data at 0 */ *C_diag_i = hypre_CTAlloc(HYPRE_Int, num_rows_diag_A + 1, HYPRE_MEMORY_HOST); *C_offd_i = hypre_CTAlloc(HYPRE_Int, num_rows_diag_A + 1, HYPRE_MEMORY_HOST); last_col_diag_C = first_row_index_A + (HYPRE_BigInt) num_rows_diag_A - 1; jj_count_diag = start_indexing; jj_count_offd = start_indexing; for (i1 = 0; i1 < num_rows_diag_A + num_rows_A_ext; i1++) { B_marker[i1] = -1; } /*----------------------------------------------------------------------- * Loop over rows i1 of A (or C). *-----------------------------------------------------------------------*/ for (i1 = 0; i1 < num_rows_diag_A; i1++) { /*-------------------------------------------------------------------- * Set count marker for diagonal entry, C_{i1,i1}. *--------------------------------------------------------------------*/ B_marker[i1] = jj_count_diag; jj_row_begin_diag = jj_count_diag; jj_row_begin_offd = jj_count_offd; jj_count_diag++; /*----------------------------------------------------------------- * Loop over entries (columns) i2 in row i1 of A_offd. * For each such column we will find the contributions of * the corresponding rows i2 of A^T to C=A*A^T - but in A^T we look * only at the external part of A^T, i.e. with columns (rows of A) * which live on other processors. *-----------------------------------------------------------------*/ if (num_cols_offd_A) { for (jj2 = A_offd_i[i1]; jj2 < A_offd_i[i1 + 1]; jj2++) { big_i2 = A_col_map_offd[ A_offd_j[jj2] ]; /* offd*ext */ /*----------------------------------------------------------- * Loop over entries (columns) i3 in row i2 of (A_ext)^T * That is, rows i3 having a column i2 of A_ext. * For now, for each row i3 of A_ext we crudely check _all_ * columns to see whether one matches i2. * For each entry (i2,i3) of (A_ext)^T, mark C(i1,i3) * as a potential nonzero. *-----------------------------------------------------------*/ for ( i3 = 0; i3 < num_rows_A_ext; i3++ ) { for ( jj3 = A_ext_i[i3]; jj3 < A_ext_i[i3 + 1]; jj3++ ) { if ( A_ext_j[jj3] == big_i2 ) { /* row i3, column i2 of A_ext; or, row i2, column i3 of (A_ext)^T */ /*-------------------------------------------------------- * Check B_marker to see that C_{i1,i3} has not already * been accounted for. If it has not, mark it and increment * counter. *--------------------------------------------------------*/ if ( A_ext_row_map[i3] < first_row_index_A || A_ext_row_map[i3] > last_col_diag_C ) /* offd */ { if (B_marker[i3 + num_rows_diag_A] < jj_row_begin_offd) { B_marker[i3 + num_rows_diag_A] = jj_count_offd; jj_count_offd++; } } else /* diag */ { if (B_marker[i3 + num_rows_diag_A] < jj_row_begin_diag) { B_marker[i3 + num_rows_diag_A] = jj_count_diag; jj_count_diag++; } } } } } /* offd*offd */ /*----------------------------------------------------------- * Loop over entries (columns) i3 in row i2 of A^T * That is, rows i3 having a column i2 of A (local part). * For now, for each row i3 of A we crudely check _all_ * columns to see whether one matches i2. * This i3-loop is for the local off-diagonal part of A. * For each entry (i2,i3) of A^T, mark C(i1,i3) * as a potential nonzero. *-----------------------------------------------------------*/ for ( i3 = 0; i3 < num_rows_diag_A; i3++ ) { /* ... note that num_rows_diag_A == num_rows_offd_A */ for ( jj3 = A_offd_i[i3]; jj3 < A_offd_i[i3 + 1]; jj3++ ) { if ( A_col_map_offd[ A_offd_j[jj3] ] == big_i2 ) { /* row i3, column i2 of A; or, row i2, column i3 of A^T */ /*-------------------------------------------------------- * Check B_marker to see that C_{i1,i3} has not already * been accounted for. If it has not, mark it and increment * counter. *--------------------------------------------------------*/ if (B_marker[i3] < jj_row_begin_diag) { B_marker[i3] = jj_count_diag; jj_count_diag++; } } } } } } /*----------------------------------------------------------------- * Loop over entries (columns) i2 in row i1 of A_diag. * For each such column we will find the contributions of * the corresponding rows i2 of A^T to C=A*A^T - but in A^T we look * only at the external part of A^T, i.e. with columns (rows of A) * which live on other processors. *-----------------------------------------------------------------*/ for (jj2 = A_diag_i[i1]; jj2 < A_diag_i[i1 + 1]; jj2++) { big_i2 = (HYPRE_BigInt)A_diag_j[jj2] + first_col_diag_A ; /* diag*ext */ /*----------------------------------------------------------- * Loop over entries (columns) i3 in row i2 of (A_ext)^T * That is, rows i3 having a column i2 of A_ext. * For now, for each row i3 of A_ext we crudely check _all_ * columns to see whether one matches i2. * For each entry (i2,i3) of (A_ext)^T, mark C(i1,i3) * as a potential nonzero. *-----------------------------------------------------------*/ for ( i3 = 0; i3 < num_rows_A_ext; i3++ ) { for ( jj3 = A_ext_i[i3]; jj3 < A_ext_i[i3 + 1]; jj3++ ) { if ( A_ext_j[jj3] == big_i2 ) { /* row i3, column i2 of A_ext; or, row i2, column i3 of (A_ext)^T */ /*-------------------------------------------------------- * Check B_marker to see that C_{i1,i3} has not already * been accounted for. If it has not, mark it and increment * counter. *--------------------------------------------------------*/ if ( A_ext_row_map[i3] < first_row_index_A || A_ext_row_map[i3] > last_col_diag_C ) /* offd */ { if (B_marker[i3 + num_rows_diag_A] < jj_row_begin_offd) { B_marker[i3 + num_rows_diag_A] = jj_count_offd; jj_count_offd++; } } else /* diag */ { if (B_marker[i3 + num_rows_diag_A] < jj_row_begin_diag) { B_marker[i3 + num_rows_diag_A] = jj_count_diag; jj_count_diag++; } } } } } } /*----------------------------------------------------------------- * Loop over entries (columns) i2 in row i1 of A_diag. * For each such column we will find the contributions of the * corresponding rows i2 of A^T to C=A*A^T . Now we only look * at the local part of A^T - with columns (rows of A) living * on this processor. *-----------------------------------------------------------------*/ for (jj2 = A_diag_i[i1]; jj2 < A_diag_i[i1 + 1]; jj2++) { big_i2 = (HYPRE_BigInt)A_diag_j[jj2] + first_col_diag_A ; /* diag*diag */ /*----------------------------------------------------------- * Loop over entries (columns) i3 in row i2 of A^T * That is, rows i3 having a column i2 of A (local part). * For now, for each row i3 of A we crudely check _all_ * columns to see whether one matches i2. * This first i3-loop is for the diagonal part of A. * For each entry (i2,i3) of A^T, mark C(i1,i3) * as a potential nonzero. *-----------------------------------------------------------*/ for ( i3 = 0; i3 < num_rows_diag_A; i3++ ) { for ( jj3 = A_diag_i[i3]; jj3 < A_diag_i[i3 + 1]; jj3++ ) { if ( (HYPRE_BigInt)A_diag_j[jj3] + first_col_diag_A == big_i2 ) { /* row i3, column i2 of A; or, row i2, column i3 of A^T */ /*-------------------------------------------------------- * Check B_marker to see that C_{i1,i3} has not already * been accounted for. If it has not, mark it and increment * counter. *--------------------------------------------------------*/ if (B_marker[i3] < jj_row_begin_diag) { B_marker[i3] = jj_count_diag; jj_count_diag++; } } } } } /* end of second and last i2 loop */ /*-------------------------------------------------------------------- * Set C_diag_i and C_offd_i for this row. *--------------------------------------------------------------------*/ (*C_diag_i)[i1] = jj_row_begin_diag; (*C_offd_i)[i1] = jj_row_begin_offd; } /* end of i1 loop */ (*C_diag_i)[num_rows_diag_A] = jj_count_diag; (*C_offd_i)[num_rows_diag_A] = jj_count_offd; /*----------------------------------------------------------------------- * Allocate C_diag_data and C_diag_j arrays. * Allocate C_offd_data and C_offd_j arrays. *-----------------------------------------------------------------------*/ *C_diag_size = jj_count_diag; *C_offd_size = jj_count_offd; /* End of First Pass */ } /*-------------------------------------------------------------------------- * hypre_ParCSRAAt : multiplies ParCSRMatrix A by its transpose, A*A^T * and returns the product in ParCSRMatrix C * Note that C does not own the partitionings *--------------------------------------------------------------------------*/ /* There are lots of possible optimizations. There is excess communication going on, nothing is being done to take advantage of symmetry, and probably more things. */ hypre_ParCSRMatrix* hypre_ParCSRAAt(hypre_ParCSRMatrix *A) { MPI_Comm comm = hypre_ParCSRMatrixComm(A); hypre_CSRMatrix *A_diag = hypre_ParCSRMatrixDiag(A); HYPRE_Complex *A_diag_data = hypre_CSRMatrixData(A_diag); HYPRE_Int *A_diag_i = hypre_CSRMatrixI(A_diag); HYPRE_Int *A_diag_j = hypre_CSRMatrixJ(A_diag); hypre_CSRMatrix *A_offd = hypre_ParCSRMatrixOffd(A); HYPRE_Complex *A_offd_data = hypre_CSRMatrixData(A_offd); HYPRE_Int *A_offd_i = hypre_CSRMatrixI(A_offd); HYPRE_Int *A_offd_j = hypre_CSRMatrixJ(A_offd); HYPRE_BigInt *A_col_map_offd = hypre_ParCSRMatrixColMapOffd(A); HYPRE_BigInt *A_ext_row_map; HYPRE_BigInt *row_starts_A = hypre_ParCSRMatrixRowStarts(A); HYPRE_Int num_rows_diag_A = hypre_CSRMatrixNumRows(A_diag); HYPRE_Int num_cols_offd_A = hypre_CSRMatrixNumCols(A_offd); hypre_ParCSRMatrix *C; HYPRE_BigInt *col_map_offd_C; hypre_CSRMatrix *C_diag; HYPRE_Complex *C_diag_data; HYPRE_Int *C_diag_i; HYPRE_Int *C_diag_j; hypre_CSRMatrix *C_offd; HYPRE_Complex *C_offd_data = NULL; HYPRE_Int *C_offd_i = NULL; HYPRE_Int *C_offd_j = NULL; HYPRE_Int *new_C_offd_j; HYPRE_Int C_diag_size; HYPRE_Int C_offd_size; HYPRE_BigInt last_col_diag_C; HYPRE_Int num_cols_offd_C; hypre_CSRMatrix *A_ext = NULL; HYPRE_Complex *A_ext_data = NULL; HYPRE_Int *A_ext_i = NULL; HYPRE_BigInt *A_ext_j = NULL; HYPRE_Int num_rows_A_ext = 0; HYPRE_BigInt first_row_index_A = hypre_ParCSRMatrixFirstRowIndex(A); HYPRE_BigInt first_col_diag_A = hypre_ParCSRMatrixFirstColDiag(A); HYPRE_Int *B_marker; HYPRE_Int i; HYPRE_Int i1, i2, i3; HYPRE_Int jj2, jj3; HYPRE_Int jj_count_diag, jj_count_offd; HYPRE_Int jj_row_begin_diag, jj_row_begin_offd; HYPRE_Int start_indexing = 0; /* start indexing for C_data at 0 */ HYPRE_Int count; HYPRE_BigInt n_rows_A, n_cols_A; HYPRE_Complex a_entry; HYPRE_Complex a_b_product; HYPRE_Complex zero = 0.0; n_rows_A = hypre_ParCSRMatrixGlobalNumRows(A); n_cols_A = hypre_ParCSRMatrixGlobalNumCols(A); if (n_cols_A != n_rows_A) { hypre_error_w_msg(HYPRE_ERROR_GENERIC, " Error! Incompatible matrix dimensions!\n"); return NULL; } /*----------------------------------------------------------------------- * Extract A_ext, i.e. portion of A that is stored on neighbor procs * and needed locally for A^T in the matrix matrix product A*A^T *-----------------------------------------------------------------------*/ if ((HYPRE_BigInt)num_rows_diag_A != n_rows_A) { /*--------------------------------------------------------------------- * If there exists no CommPkg for A, a CommPkg is generated using * equally load balanced partitionings *--------------------------------------------------------------------*/ if (!hypre_ParCSRMatrixCommPkg(A)) { hypre_MatTCommPkgCreate(A); } A_ext = hypre_ParCSRMatrixExtractAExt( A, 1, &A_ext_row_map ); A_ext_data = hypre_CSRMatrixData(A_ext); A_ext_i = hypre_CSRMatrixI(A_ext); A_ext_j = hypre_CSRMatrixBigJ(A_ext); num_rows_A_ext = hypre_CSRMatrixNumRows(A_ext); } /*----------------------------------------------------------------------- * Allocate marker array. *-----------------------------------------------------------------------*/ B_marker = hypre_CTAlloc(HYPRE_Int, num_rows_diag_A + num_rows_A_ext, HYPRE_MEMORY_HOST); /*----------------------------------------------------------------------- * Initialize some stuff. *-----------------------------------------------------------------------*/ for ( i1 = 0; i1 < num_rows_diag_A + num_rows_A_ext; ++i1 ) { B_marker[i1] = -1; } hypre_ParAat_RowSizes( &C_diag_i, &C_offd_i, B_marker, A_diag_i, A_diag_j, A_offd_i, A_offd_j, A_col_map_offd, A_ext_i, A_ext_j, A_ext_row_map, &C_diag_size, &C_offd_size, num_rows_diag_A, num_cols_offd_A, num_rows_A_ext, first_col_diag_A, first_row_index_A ); #if 0 /* debugging output: */ hypre_printf("A_ext_row_map (%i):", num_rows_A_ext); for ( i1 = 0; i1 < num_rows_A_ext; ++i1 ) { hypre_printf(" %i", A_ext_row_map[i1] ); } hypre_printf("\nC_diag_i (%i):", C_diag_size); for ( i1 = 0; i1 <= num_rows_diag_A; ++i1 ) { hypre_printf(" %i", C_diag_i[i1] ); } hypre_printf("\nC_offd_i (%i):", C_offd_size); for ( i1 = 0; i1 <= num_rows_diag_A; ++i1 ) { hypre_printf(" %i", C_offd_i[i1] ); } hypre_printf("\n"); #endif /*----------------------------------------------------------------------- * Allocate C_diag_data and C_diag_j arrays. * Allocate C_offd_data and C_offd_j arrays. *-----------------------------------------------------------------------*/ last_col_diag_C = first_row_index_A + (HYPRE_BigInt) num_rows_diag_A - 1; C_diag_data = hypre_CTAlloc(HYPRE_Complex, C_diag_size, HYPRE_MEMORY_HOST); C_diag_j = hypre_CTAlloc(HYPRE_Int, C_diag_size, HYPRE_MEMORY_HOST); C_offd_data = hypre_CTAlloc(HYPRE_Complex, C_offd_size, HYPRE_MEMORY_HOST); C_offd_j = hypre_CTAlloc(HYPRE_Int, C_offd_size, HYPRE_MEMORY_HOST); /*----------------------------------------------------------------------- * Second Pass: Fill in C_diag_data and C_diag_j. * Second Pass: Fill in C_offd_data and C_offd_j. *-----------------------------------------------------------------------*/ /*----------------------------------------------------------------------- * Initialize some stuff. *-----------------------------------------------------------------------*/ jj_count_diag = start_indexing; jj_count_offd = start_indexing; for ( i1 = 0; i1 < num_rows_diag_A + num_rows_A_ext; ++i1 ) { B_marker[i1] = -1; } /*----------------------------------------------------------------------- * Loop over interior c-points. *-----------------------------------------------------------------------*/ for (i1 = 0; i1 < num_rows_diag_A; i1++) { /*-------------------------------------------------------------------- * Create diagonal entry, C_{i1,i1} *--------------------------------------------------------------------*/ B_marker[i1] = jj_count_diag; jj_row_begin_diag = jj_count_diag; jj_row_begin_offd = jj_count_offd; C_diag_data[jj_count_diag] = zero; C_diag_j[jj_count_diag] = i1; jj_count_diag++; /*----------------------------------------------------------------- * Loop over entries in row i1 of A_offd. *-----------------------------------------------------------------*/ /* There are 3 CSRMatrix or CSRBooleanMatrix objects here: ext*ext, ext*diag, and ext*offd belong to another processor. diag*offd and offd*diag don't count - never share a column by definition. So we have to do 4 cases: diag*ext, offd*ext, diag*diag, and offd*offd. */ for (jj2 = A_diag_i[i1]; jj2 < A_diag_i[i1 + 1]; jj2++) { i2 = A_diag_j[jj2]; a_entry = A_diag_data[jj2]; /* diag*ext */ /*----------------------------------------------------------- * Loop over entries (columns) i3 in row i2 of (A_ext)^T * That is, rows i3 having a column i2 of A_ext. * For now, for each row i3 of A_ext we crudely check _all_ * columns to see whether one matches i2. * For each entry (i2,i3) of (A_ext)^T, add A(i1,i2)*A(i3,i2) * to C(i1,i3) . This contributes to both the diag and offd * blocks of C. *-----------------------------------------------------------*/ for ( i3 = 0; i3 < num_rows_A_ext; i3++ ) { for ( jj3 = A_ext_i[i3]; jj3 < A_ext_i[i3 + 1]; jj3++ ) { if ( A_ext_j[jj3] == (HYPRE_BigInt)i2 + first_col_diag_A ) { /* row i3, column i2 of A_ext; or, row i2, column i3 of (A_ext)^T */ a_b_product = a_entry * A_ext_data[jj3]; /*-------------------------------------------------------- * Check B_marker to see that C_{i1,i3} has not already * been accounted for. If it has not, create a new entry. * If it has, add new contribution. *--------------------------------------------------------*/ if ( A_ext_row_map[i3] < first_row_index_A || A_ext_row_map[i3] > last_col_diag_C ) /* offd */ { if (B_marker[i3 + num_rows_diag_A] < jj_row_begin_offd) { B_marker[i3 + num_rows_diag_A] = jj_count_offd; C_offd_data[jj_count_offd] = a_b_product; C_offd_j[jj_count_offd] = i3; jj_count_offd++; } else { C_offd_data[B_marker[i3 + num_rows_diag_A]] += a_b_product; } } else /* diag */ { if (B_marker[i3 + num_rows_diag_A] < jj_row_begin_diag) { B_marker[i3 + num_rows_diag_A] = jj_count_diag; C_diag_data[jj_count_diag] = a_b_product; C_diag_j[jj_count_diag] = (HYPRE_Int)(i3 - first_col_diag_A); jj_count_diag++; } else { C_diag_data[B_marker[i3 + num_rows_diag_A]] += a_b_product; } } } } } } if (num_cols_offd_A) { for (jj2 = A_offd_i[i1]; jj2 < A_offd_i[i1 + 1]; jj2++) { i2 = A_offd_j[jj2]; a_entry = A_offd_data[jj2]; /* offd * ext */ /*----------------------------------------------------------- * Loop over entries (columns) i3 in row i2 of (A_ext)^T * That is, rows i3 having a column i2 of A_ext. * For now, for each row i3 of A_ext we crudely check _all_ * columns to see whether one matches i2. * For each entry (i2,i3) of (A_ext)^T, add A(i1,i2)*A(i3,i2) * to C(i1,i3) . This contributes to both the diag and offd * blocks of C. *-----------------------------------------------------------*/ for ( i3 = 0; i3 < num_rows_A_ext; i3++ ) { for ( jj3 = A_ext_i[i3]; jj3 < A_ext_i[i3 + 1]; jj3++ ) { if ( A_ext_j[jj3] == A_col_map_offd[i2] ) { /* row i3, column i2 of A_ext; or, row i2, column i3 of (A_ext)^T */ a_b_product = a_entry * A_ext_data[jj3]; /*-------------------------------------------------------- * Check B_marker to see that C_{i1,i3} has not already * been accounted for. If it has not, create a new entry. * If it has, add new contribution. *--------------------------------------------------------*/ if ( A_ext_row_map[i3] < first_row_index_A || A_ext_row_map[i3] > last_col_diag_C ) /* offd */ { if (B_marker[i3 + num_rows_diag_A] < jj_row_begin_offd) { B_marker[i3 + num_rows_diag_A] = jj_count_offd; C_offd_data[jj_count_offd] = a_b_product; C_offd_j[jj_count_offd] = i3; jj_count_offd++; } else { C_offd_data[B_marker[i3 + num_rows_diag_A]] += a_b_product; } } else /* diag */ { if (B_marker[i3 + num_rows_diag_A] < jj_row_begin_diag) { B_marker[i3 + num_rows_diag_A] = jj_count_diag; C_diag_data[jj_count_diag] = a_b_product; C_diag_j[jj_count_diag] = (HYPRE_Int)(i3 - first_row_index_A); jj_count_diag++; } else { C_diag_data[B_marker[i3 + num_rows_diag_A]] += a_b_product; } } } } } } } /* diag * diag */ /*----------------------------------------------------------------- * Loop over entries (columns) i2 in row i1 of A_diag. * For each such column we will find the contributions of the * corresponding rows i2 of A^T to C=A*A^T . Now we only look * at the local part of A^T - with columns (rows of A) living * on this processor. *-----------------------------------------------------------------*/ for (jj2 = A_diag_i[i1]; jj2 < A_diag_i[i1 + 1]; jj2++) { i2 = A_diag_j[jj2]; a_entry = A_diag_data[jj2]; /*----------------------------------------------------------- * Loop over entries (columns) i3 in row i2 of A^T * That is, rows i3 having a column i2 of A (local part). * For now, for each row i3 of A we crudely check _all_ * columns to see whether one matches i2. * This i3-loop is for the diagonal block of A. * It contributes to the diagonal block of C. * For each entry (i2,i3) of A^T, add A(i1,i2)*A(i3,i2) * to C(i1,i3) *-----------------------------------------------------------*/ for ( i3 = 0; i3 < num_rows_diag_A; i3++ ) { for ( jj3 = A_diag_i[i3]; jj3 < A_diag_i[i3 + 1]; jj3++ ) { if ( A_diag_j[jj3] == i2 ) { /* row i3, column i2 of A; or, row i2, column i3 of A^T */ a_b_product = a_entry * A_diag_data[jj3]; /*-------------------------------------------------------- * Check B_marker to see that C_{i1,i3} has not already * been accounted for. If it has not, mark it and increment * counter. *--------------------------------------------------------*/ if (B_marker[i3] < jj_row_begin_diag) { B_marker[i3] = jj_count_diag; C_diag_data[jj_count_diag] = a_b_product; C_diag_j[jj_count_diag] = i3; jj_count_diag++; } else { C_diag_data[B_marker[i3]] += a_b_product; } } } } /* end of i3 loop */ } /* end of third i2 loop */ /* offd * offd */ /*----------------------------------------------------------- * Loop over offd columns i2 of A in A*A^T. Then * loop over offd entries (columns) i3 in row i2 of A^T * That is, rows i3 having a column i2 of A (local part). * For now, for each row i3 of A we crudely check _all_ * columns to see whether one matches i2. * This i3-loop is for the off-diagonal block of A. * It contributes to the diag block of C. * For each entry (i2,i3) of A^T, add A*A^T to C *-----------------------------------------------------------*/ if (num_cols_offd_A) { for (jj2 = A_offd_i[i1]; jj2 < A_offd_i[i1 + 1]; jj2++) { i2 = A_offd_j[jj2]; a_entry = A_offd_data[jj2]; for ( i3 = 0; i3 < num_rows_diag_A; i3++ ) { /* ... note that num_rows_diag_A == num_rows_offd_A */ for ( jj3 = A_offd_i[i3]; jj3 < A_offd_i[i3 + 1]; jj3++ ) { if ( A_offd_j[jj3] == i2 ) { /* row i3, column i2 of A; or, row i2, column i3 of A^T */ a_b_product = a_entry * A_offd_data[jj3]; /*-------------------------------------------------------- * Check B_marker to see that C_{i1,i3} has not already * been accounted for. If it has not, create a new entry. * If it has, add new contribution *--------------------------------------------------------*/ if (B_marker[i3] < jj_row_begin_diag) { B_marker[i3] = jj_count_diag; C_diag_data[jj_count_diag] = a_b_product; C_diag_j[jj_count_diag] = i3; jj_count_diag++; } else { C_diag_data[B_marker[i3]] += a_b_product; } } } } /* end of last i3 loop */ } /* end of if (num_cols_offd_A) */ } /* end of fourth and last i2 loop */ #if 0 /* debugging printout */ hypre_printf("end of i1 loop: i1=%i jj_count_diag=%i\n", i1, jj_count_diag ); hypre_printf(" C_diag_j="); for ( jj3 = 0; jj3 < jj_count_diag; ++jj3) { hypre_printf("%i ", C_diag_j[jj3]); } hypre_printf(" C_diag_data="); for ( jj3 = 0; jj3 < jj_count_diag; ++jj3) { hypre_printf("%f ", C_diag_data[jj3]); } hypre_printf("\n"); hypre_printf(" C_offd_j="); for ( jj3 = 0; jj3 < jj_count_offd; ++jj3) { hypre_printf("%i ", C_offd_j[jj3]); } hypre_printf(" C_offd_data="); for ( jj3 = 0; jj3 < jj_count_offd; ++jj3) { hypre_printf("%f ", C_offd_data[jj3]); } hypre_printf("\n"); hypre_printf( " B_marker =" ); for ( it = 0; it < num_rows_diag_A + num_rows_A_ext; ++it ) { hypre_printf(" %i", B_marker[it] ); } hypre_printf( "\n" ); #endif } /* end of i1 loop */ /*----------------------------------------------------------------------- * Delete 0-columns in C_offd, i.e. generate col_map_offd and reset * C_offd_j. Note that (with the indexing we have coming into this * block) col_map_offd_C[i3]==A_ext_row_map[i3]. *-----------------------------------------------------------------------*/ for ( i = 0; i < num_rows_diag_A + num_rows_A_ext; ++i ) { B_marker[i] = -1; } for ( i = 0; i < C_offd_size; i++ ) { B_marker[ C_offd_j[i] ] = -2; } count = 0; for (i = 0; i < num_rows_diag_A + num_rows_A_ext; i++) { if (B_marker[i] == -2) { B_marker[i] = count; count++; } } num_cols_offd_C = count; if (num_cols_offd_C) { col_map_offd_C = hypre_CTAlloc(HYPRE_BigInt, num_cols_offd_C, HYPRE_MEMORY_HOST); new_C_offd_j = hypre_CTAlloc(HYPRE_Int, C_offd_size, HYPRE_MEMORY_HOST); /* ... a bit big, but num_cols_offd_C is too small. It might be worth computing the correct size, which is sum( no. columns in row i, over all rows i ) */ for (i = 0; i < C_offd_size; i++) { new_C_offd_j[i] = B_marker[C_offd_j[i]]; col_map_offd_C[ new_C_offd_j[i] ] = A_ext_row_map[ C_offd_j[i] ]; } hypre_TFree(C_offd_j, HYPRE_MEMORY_HOST); C_offd_j = new_C_offd_j; } /*---------------------------------------------------------------- * Create C *----------------------------------------------------------------*/ C = hypre_ParCSRMatrixCreate(comm, n_rows_A, n_rows_A, row_starts_A, row_starts_A, num_cols_offd_C, C_diag_size, C_offd_size); C_diag = hypre_ParCSRMatrixDiag(C); hypre_CSRMatrixData(C_diag) = C_diag_data; hypre_CSRMatrixI(C_diag) = C_diag_i; hypre_CSRMatrixJ(C_diag) = C_diag_j; if (num_cols_offd_C) { C_offd = hypre_ParCSRMatrixOffd(C); hypre_CSRMatrixData(C_offd) = C_offd_data; hypre_CSRMatrixI(C_offd) = C_offd_i; hypre_CSRMatrixJ(C_offd) = C_offd_j; hypre_ParCSRMatrixOffd(C) = C_offd; hypre_ParCSRMatrixColMapOffd(C) = col_map_offd_C; } else { hypre_TFree(C_offd_i, HYPRE_MEMORY_HOST); } /*----------------------------------------------------------------------- * Free B_ext and marker array. *-----------------------------------------------------------------------*/ if (num_cols_offd_A) { hypre_CSRMatrixDestroy(A_ext); A_ext = NULL; } hypre_TFree(B_marker, HYPRE_MEMORY_HOST); if ( num_rows_diag_A != n_rows_A ) { hypre_TFree(A_ext_row_map, HYPRE_MEMORY_HOST); } return C; } /*-------------------------------------------------------------------------- * hypre_ParCSRMatrixExtractAExt : extracts rows from A which are located on other * processors and needed for multiplying A^T with the local part of A. The rows * are returned as CSRMatrix. A row map for A_ext (like the ParCSRColMap) is * returned through the third argument. *--------------------------------------------------------------------------*/ hypre_CSRMatrix * hypre_ParCSRMatrixExtractAExt( hypre_ParCSRMatrix *A, HYPRE_Int data, HYPRE_BigInt ** pA_ext_row_map ) { /* Note that A's role as the first factor in A*A^T is used only through ...CommPkgT(A), which basically says which rows of A (columns of A^T) are needed. In all the other places where A serves as an input, it is through its role as A^T, the matrix whose data needs to be passed between processors. */ MPI_Comm comm = hypre_ParCSRMatrixComm(A); HYPRE_BigInt first_col_diag = hypre_ParCSRMatrixFirstColDiag(A); /*HYPRE_Int first_row_index = hypre_ParCSRMatrixFirstRowIndex(A);*/ HYPRE_BigInt *col_map_offd = hypre_ParCSRMatrixColMapOffd(A); hypre_ParCSRCommPkg *comm_pkg = hypre_ParCSRMatrixCommPkgT(A); /* ... CommPkgT(A) should identify all rows of A^T needed for A*A^T (that is * generally a bigger set than ...CommPkg(A), the rows of B needed for A*B) */ HYPRE_Int num_recvs = hypre_ParCSRCommPkgNumRecvs(comm_pkg); HYPRE_Int *recv_vec_starts = hypre_ParCSRCommPkgRecvVecStarts(comm_pkg); HYPRE_Int num_sends = hypre_ParCSRCommPkgNumSends(comm_pkg); HYPRE_Int *send_map_starts = hypre_ParCSRCommPkgSendMapStarts(comm_pkg); HYPRE_Int *send_map_elmts = hypre_ParCSRCommPkgSendMapElmts(comm_pkg); hypre_CSRMatrix *diag = hypre_ParCSRMatrixDiag(A); HYPRE_Int *diag_i = hypre_CSRMatrixI(diag); HYPRE_Int *diag_j = hypre_CSRMatrixJ(diag); HYPRE_Complex *diag_data = hypre_CSRMatrixData(diag); hypre_CSRMatrix *offd = hypre_ParCSRMatrixOffd(A); HYPRE_Int *offd_i = hypre_CSRMatrixI(offd); HYPRE_Int *offd_j = hypre_CSRMatrixJ(offd); HYPRE_Complex *offd_data = hypre_CSRMatrixData(offd); HYPRE_BigInt num_cols_A; HYPRE_Int num_nonzeros; HYPRE_Int num_rows_A_ext; hypre_CSRMatrix *A_ext; HYPRE_Int *A_ext_i; HYPRE_BigInt *A_ext_j; HYPRE_Complex *A_ext_data; num_cols_A = hypre_ParCSRMatrixGlobalNumCols(A); num_rows_A_ext = recv_vec_starts[num_recvs]; hypre_ParCSRMatrixExtractBExt_Arrays ( &A_ext_i, &A_ext_j, &A_ext_data, pA_ext_row_map, &num_nonzeros, data, 1, comm, comm_pkg, num_cols_A, num_recvs, num_sends, first_col_diag, A->row_starts, recv_vec_starts, send_map_starts, send_map_elmts, diag_i, diag_j, offd_i, offd_j, col_map_offd, diag_data, offd_data ); A_ext = hypre_CSRMatrixCreate(num_rows_A_ext, num_cols_A, num_nonzeros); hypre_CSRMatrixI(A_ext) = A_ext_i; hypre_CSRMatrixBigJ(A_ext) = A_ext_j; if (data) { hypre_CSRMatrixData(A_ext) = A_ext_data; } return A_ext; } hypre-2.33.0/src/parcsr_mv/par_csr_assumed_part.c000066400000000000000000000453321477326011500220720ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /*---------------------------------------------------- * Functions for the IJ assumed partition * (Some of these were formerly in new_commpkg.c) * AHB 4/06 *-----------------------------------------------------*/ #include "_hypre_parcsr_mv.h" /* This is used only in the function below */ #define CONTACT(a,b) (contact_list[(a)*3+(b)]) /*-------------------------------------------------------------------- * hypre_LocateAssumedPartition * Reconcile assumed partition with actual partition. Essentially * each processor ends of with a partition of its assumed partition. *--------------------------------------------------------------------*/ HYPRE_Int hypre_LocateAssumedPartition(MPI_Comm comm, HYPRE_BigInt row_start, HYPRE_BigInt row_end, HYPRE_BigInt global_first_row, HYPRE_BigInt global_num_rows, hypre_IJAssumedPart *part, HYPRE_Int myid) { HYPRE_Int i; HYPRE_BigInt *contact_list; HYPRE_Int contact_list_length, contact_list_storage; HYPRE_BigInt contact_row_start[2], contact_row_end[2], contact_ranges; HYPRE_Int owner_start, owner_end; HYPRE_BigInt tmp_row_start, tmp_row_end; HYPRE_Int complete; /*HYPRE_Int locate_row_start[2]; */ /*HYPRE_Int locate_ranges;*/ HYPRE_Int locate_row_count, rows_found; HYPRE_BigInt tmp_range[2]; HYPRE_BigInt *sortme; HYPRE_Int *si; const HYPRE_Int flag1 = 17; hypre_MPI_Request *requests; hypre_MPI_Status status0, *statuses; HYPRE_ANNOTATE_FUNC_BEGIN; /*----------------------------------------------------------- * Contact ranges - * which rows do I have that others are assumed responsible for? * (at most two ranges - maybe none) *-----------------------------------------------------------*/ contact_row_start[0] = 0; contact_row_end[0] = 0; contact_row_start[1] = 0; contact_row_end[1] = 0; contact_ranges = 0; if (row_start <= row_end ) { /*must own at least one row*/ if ( part->row_end < row_start || row_end < part->row_start ) { /*no overlap - so all of my rows and only one range*/ contact_row_start[0] = row_start; contact_row_end[0] = row_end; contact_ranges++; } else /* the two regions overlap - so one or two ranges */ { /* check for contact rows on the low end of the local range */ if (row_start < part->row_start) { contact_row_start[0] = row_start; contact_row_end[0] = part->row_start - 1; contact_ranges++; } if (part->row_end < row_end) /* check the high end */ { if (contact_ranges) /* already found one range */ { contact_row_start[1] = part->row_end + 1; contact_row_end[1] = row_end; } else { contact_row_start[0] = part->row_end + 1; contact_row_end[0] = row_end; } contact_ranges++; } } } /*----------------------------------------------------------- * Contact: find out who is assumed responsible for these * ranges of contact rows and contact them * *-----------------------------------------------------------*/ contact_list_length = 0; contact_list_storage = 5; contact_list = hypre_TAlloc(HYPRE_BigInt, contact_list_storage * 3, HYPRE_MEMORY_HOST); /*each contact needs 3 ints */ for (i = 0; i < contact_ranges; i++) { /*get start and end row owners */ hypre_GetAssumedPartitionProcFromRow(comm, contact_row_start[i], global_first_row, global_num_rows, &owner_start); hypre_GetAssumedPartitionProcFromRow(comm, contact_row_end[i], global_first_row, global_num_rows, &owner_end); if (owner_start == owner_end) /* same processor owns the whole range */ { if (contact_list_length == contact_list_storage) { /*allocate more space*/ contact_list_storage += 5; contact_list = hypre_TReAlloc(contact_list, HYPRE_BigInt, (contact_list_storage * 3), HYPRE_MEMORY_HOST); } CONTACT(contact_list_length, 0) = (HYPRE_BigInt) owner_start; /*proc #*/ CONTACT(contact_list_length, 1) = contact_row_start[i]; /* start row */ CONTACT(contact_list_length, 2) = contact_row_end[i]; /*end row */ contact_list_length++; } else { complete = 0; while (!complete) { hypre_GetAssumedPartitionRowRange(comm, owner_start, global_first_row, global_num_rows, &tmp_row_start, &tmp_row_end); if (tmp_row_end >= contact_row_end[i]) { tmp_row_end = contact_row_end[i]; complete = 1; } if (tmp_row_start < contact_row_start[i]) { tmp_row_start = contact_row_start[i]; } if (contact_list_length == contact_list_storage) { /*allocate more space*/ contact_list_storage += 5; contact_list = hypre_TReAlloc(contact_list, HYPRE_BigInt, (contact_list_storage * 3), HYPRE_MEMORY_HOST); } CONTACT(contact_list_length, 0) = (HYPRE_BigInt) owner_start; /*proc #*/ CONTACT(contact_list_length, 1) = tmp_row_start; /* start row */ CONTACT(contact_list_length, 2) = tmp_row_end; /*end row */ contact_list_length++; owner_start++; /*processors are seqential */ } } } requests = hypre_CTAlloc(hypre_MPI_Request, contact_list_length, HYPRE_MEMORY_HOST); statuses = hypre_CTAlloc(hypre_MPI_Status, contact_list_length, HYPRE_MEMORY_HOST); /*send out messages */ for (i = 0; i < contact_list_length; i++) { hypre_MPI_Isend(&CONTACT(i, 1), 2, HYPRE_MPI_BIG_INT, CONTACT(i, 0), flag1, comm, &requests[i]); /*hypre_MPI_COMM_WORLD, &requests[i]);*/ } /*----------------------------------------------------------- * Locate ranges - * which rows in my assumed range do I not own * (at most two ranges - maybe none) * locate_row_count = total number of rows I must locate *-----------------------------------------------------------*/ locate_row_count = 0; /*locate_row_start[0]=0; locate_row_start[1]=0;*/ /*locate_ranges = 0;*/ if (part->row_end < row_start || row_end < part->row_start ) /*no overlap - so all of my assumed rows */ { /*locate_row_start[0] = part->row_start;*/ /*locate_ranges++;*/ locate_row_count += part->row_end - part->row_start + 1; } else /* the two regions overlap */ { if (part->row_start < row_start) { /* check for locate rows on the low end of the local range */ /*locate_row_start[0] = part->row_start;*/ /*locate_ranges++;*/ locate_row_count += (row_start - 1) - part->row_start + 1; } if (row_end < part->row_end) /* check the high end */ { /*if (locate_ranges)*/ /* already have one range */ /*{ locate_row_start[1] = row_end +1; } else { locate_row_start[0] = row_end +1; }*/ /*locate_ranges++;*/ locate_row_count += part->row_end - (row_end + 1) + 1; } } /*----------------------------------------------------------- * Receive messages from other procs telling us where * all our locate rows actually reside *-----------------------------------------------------------*/ /* we will keep a partition of our assumed partition - list ourselves first. We will sort later with an additional index. In practice, this should only contain a few processors */ /*which part do I own?*/ tmp_row_start = hypre_max(part->row_start, row_start); tmp_row_end = hypre_min(row_end, part->row_end); if (tmp_row_start <= tmp_row_end) { part->proc_list[0] = myid; part->row_start_list[0] = tmp_row_start; part->row_end_list[0] = tmp_row_end; part->length++; } /* now look for messages that tell us which processor has our locate rows */ /* these will be blocking receives as we know how many to expect and they should be waiting (and we don't want to continue on without them) */ rows_found = 0; while (rows_found != locate_row_count) { hypre_MPI_Recv( tmp_range, 2, HYPRE_MPI_BIG_INT, hypre_MPI_ANY_SOURCE, flag1, comm, &status0); /*flag1 , hypre_MPI_COMM_WORLD, &status0);*/ if (part->length == part->storage_length) { part->storage_length += 10; part->proc_list = hypre_TReAlloc(part->proc_list, HYPRE_Int, part->storage_length, HYPRE_MEMORY_HOST); part->row_start_list = hypre_TReAlloc(part->row_start_list, HYPRE_BigInt, part->storage_length, HYPRE_MEMORY_HOST); part->row_end_list = hypre_TReAlloc(part->row_end_list, HYPRE_BigInt, part->storage_length, HYPRE_MEMORY_HOST); } part->row_start_list[part->length] = tmp_range[0]; part->row_end_list[part->length] = tmp_range[1]; part->proc_list[part->length] = status0.hypre_MPI_SOURCE; rows_found += tmp_range[1] - tmp_range[0] + 1; part->length++; } /*In case the partition of the assumed partition is longish, we would like to know the sorted order */ si = hypre_CTAlloc(HYPRE_Int, part->length, HYPRE_MEMORY_HOST); sortme = hypre_CTAlloc(HYPRE_BigInt, part->length, HYPRE_MEMORY_HOST); for (i = 0; i < part->length; i++) { si[i] = i; sortme[i] = part->row_start_list[i]; } hypre_BigQsortbi( sortme, si, 0, (part->length) - 1); part->sort_index = si; /*free the requests */ hypre_MPI_Waitall(contact_list_length, requests, statuses); hypre_TFree(statuses, HYPRE_MEMORY_HOST); hypre_TFree(requests, HYPRE_MEMORY_HOST); hypre_TFree(sortme, HYPRE_MEMORY_HOST); hypre_TFree(contact_list, HYPRE_MEMORY_HOST); HYPRE_ANNOTATE_FUNC_END; return hypre_error_flag; } hypre_IJAssumedPart* hypre_AssumedPartitionCreate(MPI_Comm comm, HYPRE_BigInt global_num, HYPRE_BigInt start, HYPRE_BigInt end) { hypre_IJAssumedPart *apart; HYPRE_Int myid; hypre_MPI_Comm_rank(comm, &myid ); /* allocate space */ apart = hypre_CTAlloc(hypre_IJAssumedPart, 1, HYPRE_MEMORY_HOST); hypre_GetAssumedPartitionRowRange( comm, myid, 0, global_num, &(apart->row_start), &(apart->row_end)); /*allocate some space for the partition of the assumed partition */ apart->length = 0; /*room for 10 owners of the assumed partition*/ apart->storage_length = 10; /*need to be >=1 */ apart->proc_list = hypre_TAlloc(HYPRE_Int, apart->storage_length, HYPRE_MEMORY_HOST); apart->row_start_list = hypre_TAlloc(HYPRE_BigInt, apart->storage_length, HYPRE_MEMORY_HOST); apart->row_end_list = hypre_TAlloc(HYPRE_BigInt, apart->storage_length, HYPRE_MEMORY_HOST); /* now we want to reconcile our actual partition with the assumed partition */ hypre_LocateAssumedPartition(comm, start, end, 0, global_num, apart, myid); return apart; } /*-------------------------------------------------------------------- * hypre_ParCSRMatrixCreateAssumedPartition - * Each proc gets it own range. Then * each needs to reconcile its actual range with its assumed * range - the result is essentila a partition of its assumed range - * this is the assumed partition. *--------------------------------------------------------------------*/ HYPRE_Int hypre_ParCSRMatrixCreateAssumedPartition( hypre_ParCSRMatrix *matrix) { HYPRE_BigInt global_num_cols; /* HYPRE_Int myid; */ HYPRE_BigInt row_start = 0, row_end = 0, col_start = 0, col_end = 0; MPI_Comm comm; hypre_IJAssumedPart *apart; global_num_cols = hypre_ParCSRMatrixGlobalNumCols(matrix); comm = hypre_ParCSRMatrixComm(matrix); /* find out my actualy range of rows and columns */ hypre_ParCSRMatrixGetLocalRange( matrix, &row_start, &row_end, /* these two are not used */ &col_start, &col_end ); /* get my assumed partitioning - we want partitioning of the vector that the matrix multiplies - so we use the col start and end */ apart = hypre_AssumedPartitionCreate(comm, global_num_cols, col_start, col_end); /* this partition will be saved in the matrix data structure until the matrix is destroyed */ hypre_ParCSRMatrixAssumedPartition(matrix) = apart; return hypre_error_flag; } /*-------------------------------------------------------------------- * hypre_AssumedPartitionDestroy *--------------------------------------------------------------------*/ HYPRE_Int hypre_AssumedPartitionDestroy(hypre_IJAssumedPart *apart ) { if (apart->storage_length > 0) { hypre_TFree(apart->proc_list, HYPRE_MEMORY_HOST); hypre_TFree(apart->row_start_list, HYPRE_MEMORY_HOST); hypre_TFree(apart->row_end_list, HYPRE_MEMORY_HOST); hypre_TFree(apart->sort_index, HYPRE_MEMORY_HOST); } hypre_TFree(apart, HYPRE_MEMORY_HOST); return hypre_error_flag; } /*-------------------------------------------------------------------- * hypre_GetAssumedPartitionProcFromRow * Assumed partition for IJ case. Given a particular row j, return * the processor that is assumed to own that row. *--------------------------------------------------------------------*/ HYPRE_Int hypre_GetAssumedPartitionProcFromRow( MPI_Comm comm, HYPRE_BigInt row, HYPRE_BigInt global_first_row, HYPRE_BigInt global_num_rows, HYPRE_Int *proc_id) { HYPRE_Int num_procs; HYPRE_BigInt size, switch_row, extra; hypre_MPI_Comm_size(comm, &num_procs ); /*hypre_MPI_Comm_size(hypre_MPI_COMM_WORLD, &num_procs );*/ /* j = floor[(row*p/N] - this overflows*/ /* *proc_id = (row*num_procs)/global_num_rows;*/ /* this looks a bit odd, but we have to be very careful that this function and the next are inverses - and rounding errors make this difficult!!!!! */ size = global_num_rows / (HYPRE_BigInt)num_procs; extra = global_num_rows - size * (HYPRE_BigInt)num_procs; switch_row = global_first_row + (size + 1) * extra; if (row >= switch_row) { *proc_id = (HYPRE_Int)(extra + (row - switch_row) / size); } else { *proc_id = (HYPRE_Int)((row - global_first_row) / (size + 1)); } return hypre_error_flag; } /*-------------------------------------------------------------------- * hypre_GetAssumedPartitionRowRange * Assumed partition for IJ case. Given a particular processor id, return * the assumed range of rows ([row_start, row_end]) for that processor. *--------------------------------------------------------------------*/ HYPRE_Int hypre_GetAssumedPartitionRowRange( MPI_Comm comm, HYPRE_Int proc_id, HYPRE_BigInt global_first_row, HYPRE_BigInt global_num_rows, HYPRE_BigInt *row_start, HYPRE_BigInt* row_end) { HYPRE_Int num_procs; HYPRE_Int extra; HYPRE_BigInt size; hypre_MPI_Comm_size(comm, &num_procs ); /*hypre_MPI_Comm_size(hypre_MPI_COMM_WORLD, &num_procs );*/ /* this may look non-intuitive, but we have to be very careful that this function and the next are inverses - and avoiding overflow and rounding errors makes this difficult! */ size = global_num_rows / (HYPRE_BigInt)num_procs; extra = (HYPRE_Int)(global_num_rows - size * (HYPRE_BigInt)num_procs); *row_start = global_first_row + size * (HYPRE_BigInt)proc_id; *row_start += (HYPRE_BigInt) hypre_min(proc_id, extra); *row_end = global_first_row + size * (HYPRE_BigInt)(proc_id + 1); *row_end += (HYPRE_BigInt)hypre_min(proc_id + 1, extra); *row_end = *row_end - 1; return hypre_error_flag; } /*-------------------------------------------------------------------- * hypre_ParVectorCreateAssumedPartition - * Essentially the same as for a matrix! * Each proc gets it own range. Then * each needs to reconcile its actual range with its assumed * range - the result is essentila a partition of its assumed range - * this is the assumed partition. *--------------------------------------------------------------------*/ HYPRE_Int hypre_ParVectorCreateAssumedPartition( hypre_ParVector *vector) { HYPRE_BigInt global_num; HYPRE_Int myid; HYPRE_BigInt start = 0, end = 0; MPI_Comm comm; hypre_IJAssumedPart *apart; global_num = hypre_ParVectorGlobalSize(vector); comm = hypre_ParVectorComm(vector); /* find out my actualy range of rows */ start = hypre_ParVectorFirstIndex(vector); end = hypre_ParVectorLastIndex(vector); hypre_MPI_Comm_rank(comm, &myid ); /* allocate space */ apart = hypre_CTAlloc(hypre_IJAssumedPart, 1, HYPRE_MEMORY_HOST); /* get my assumed partitioning - we want partitioning of the vector that the matrix multiplies - so we use the col start and end */ hypre_GetAssumedPartitionRowRange( comm, myid, 0, global_num, &(apart->row_start), &(apart->row_end)); /*allocate some space for the partition of the assumed partition */ apart->length = 0; /*room for 10 owners of the assumed partition*/ apart->storage_length = 10; /*need to be >=1 */ apart->proc_list = hypre_TAlloc(HYPRE_Int, apart->storage_length, HYPRE_MEMORY_HOST); apart->row_start_list = hypre_TAlloc(HYPRE_BigInt, apart->storage_length, HYPRE_MEMORY_HOST); apart->row_end_list = hypre_TAlloc(HYPRE_BigInt, apart->storage_length, HYPRE_MEMORY_HOST); /* now we want to reconcile our actual partition with the assumed partition */ hypre_LocateAssumedPartition(comm, start, end, 0, global_num, apart, myid); /* this partition will be saved in the vector data structure until the vector is destroyed */ hypre_ParVectorAssumedPartition(vector) = apart; return hypre_error_flag; } hypre-2.33.0/src/parcsr_mv/par_csr_assumed_part.h000066400000000000000000000015301477326011500220670ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #ifndef hypre_PARCSR_ASSUMED_PART #define hypre_PARCSR_ASSUMED_PART typedef struct { HYPRE_Int length; HYPRE_BigInt row_start; HYPRE_BigInt row_end; HYPRE_Int storage_length; HYPRE_Int *proc_list; HYPRE_BigInt *row_start_list; HYPRE_BigInt *row_end_list; HYPRE_Int *sort_index; } hypre_IJAssumedPart; #endif /* hypre_PARCSR_ASSUMED_PART */ hypre-2.33.0/src/parcsr_mv/par_csr_bool_matop.c000066400000000000000000001330311477326011500215300ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "_hypre_parcsr_mv.h" hypre_ParCSRBooleanMatrix* hypre_ParBooleanMatmul( hypre_ParCSRBooleanMatrix *A, hypre_ParCSRBooleanMatrix *B ) { MPI_Comm comm = hypre_ParCSRBooleanMatrix_Get_Comm(A); hypre_CSRBooleanMatrix *A_diag = hypre_ParCSRBooleanMatrix_Get_Diag(A); HYPRE_Int *A_diag_i = hypre_CSRBooleanMatrix_Get_I(A_diag); HYPRE_Int *A_diag_j = hypre_CSRBooleanMatrix_Get_J(A_diag); hypre_CSRBooleanMatrix *A_offd = hypre_ParCSRBooleanMatrix_Get_Offd(A); HYPRE_Int *A_offd_i = hypre_CSRBooleanMatrix_Get_I(A_offd); HYPRE_Int *A_offd_j = hypre_CSRBooleanMatrix_Get_J(A_offd); HYPRE_BigInt *row_starts_A = hypre_ParCSRBooleanMatrix_Get_RowStarts(A); HYPRE_Int num_rows_diag_A = hypre_CSRBooleanMatrix_Get_NRows(A_diag); HYPRE_Int num_cols_diag_A = hypre_CSRBooleanMatrix_Get_NCols(A_diag); HYPRE_Int num_cols_offd_A = hypre_CSRBooleanMatrix_Get_NCols(A_offd); hypre_CSRBooleanMatrix *B_diag = hypre_ParCSRBooleanMatrix_Get_Diag(B); HYPRE_Int *B_diag_i = hypre_CSRBooleanMatrix_Get_I(B_diag); HYPRE_Int *B_diag_j = hypre_CSRBooleanMatrix_Get_J(B_diag); hypre_CSRBooleanMatrix *B_offd = hypre_ParCSRBooleanMatrix_Get_Offd(B); HYPRE_BigInt *col_map_offd_B = hypre_ParCSRBooleanMatrix_Get_ColMapOffd(B); HYPRE_Int *B_offd_i = hypre_CSRBooleanMatrix_Get_I(B_offd); HYPRE_Int *B_offd_j = hypre_CSRBooleanMatrix_Get_J(B_offd); HYPRE_BigInt first_col_diag_B = hypre_ParCSRBooleanMatrix_Get_FirstColDiag(B); HYPRE_BigInt last_col_diag_B; HYPRE_BigInt *col_starts_B = hypre_ParCSRBooleanMatrix_Get_ColStarts(B); HYPRE_Int num_rows_diag_B = hypre_CSRBooleanMatrix_Get_NRows(B_diag); HYPRE_Int num_cols_diag_B = hypre_CSRBooleanMatrix_Get_NCols(B_diag); HYPRE_Int num_cols_offd_B = hypre_CSRBooleanMatrix_Get_NCols(B_offd); hypre_ParCSRBooleanMatrix *C; HYPRE_BigInt *col_map_offd_C = NULL; HYPRE_Int *map_B_to_C = NULL; hypre_CSRBooleanMatrix *C_diag; HYPRE_Int *C_diag_i; HYPRE_Int *C_diag_j; hypre_CSRBooleanMatrix *C_offd; HYPRE_Int *C_offd_i = NULL; HYPRE_Int *C_offd_j = NULL; HYPRE_Int C_diag_size; HYPRE_Int C_offd_size; HYPRE_Int num_cols_offd_C = 0; hypre_CSRBooleanMatrix *Bs_ext = NULL; HYPRE_Int *Bs_ext_i = NULL; HYPRE_BigInt *Bs_ext_j = NULL; HYPRE_Int *B_ext_diag_i = NULL; HYPRE_Int *B_ext_diag_j = NULL; HYPRE_Int B_ext_diag_size; HYPRE_Int *B_ext_offd_i = NULL; HYPRE_Int *B_ext_offd_j = NULL; HYPRE_BigInt *B_tmp_offd_j = NULL; HYPRE_Int B_ext_offd_size; HYPRE_Int *B_marker; HYPRE_BigInt *temp; HYPRE_Int i, j; HYPRE_Int i1, i2, i3; HYPRE_Int jj2, jj3; HYPRE_Int jj_count_diag, jj_count_offd; HYPRE_Int jj_row_begin_diag, jj_row_begin_offd; HYPRE_Int start_indexing = 0; /* start indexing for C_data at 0 */ HYPRE_BigInt n_rows_A, n_cols_A; HYPRE_BigInt n_rows_B, n_cols_B; HYPRE_Int allsquare = 0; HYPRE_Int cnt, cnt_offd, cnt_diag; HYPRE_Int num_procs; HYPRE_BigInt value; n_rows_A = hypre_ParCSRBooleanMatrix_Get_GlobalNRows(A); n_cols_A = hypre_ParCSRBooleanMatrix_Get_GlobalNCols(A); n_rows_B = hypre_ParCSRBooleanMatrix_Get_GlobalNRows(B); n_cols_B = hypre_ParCSRBooleanMatrix_Get_GlobalNCols(B); if (n_cols_A != n_rows_B || num_cols_diag_A != num_rows_diag_B) { hypre_error_w_msg(HYPRE_ERROR_GENERIC, " Error! Incompatible matrix dimensions!\n"); return NULL; } if ( num_rows_diag_A == num_cols_diag_B ) { allsquare = 1; } /*----------------------------------------------------------------------- * Extract B_ext, i.e. portion of B that is stored on neighbor procs * and needed locally for matrix matrix product *-----------------------------------------------------------------------*/ hypre_MPI_Comm_size(comm, &num_procs); if (num_procs > 1) { /*--------------------------------------------------------------------- * If there exists no CommPkg for A, a CommPkg is generated using * equally load balanced partitionings *--------------------------------------------------------------------*/ if (!hypre_ParCSRBooleanMatrix_Get_CommPkg(A)) { hypre_BooleanMatvecCommPkgCreate(A); } Bs_ext = hypre_ParCSRBooleanMatrixExtractBExt(B, A); Bs_ext_i = hypre_CSRBooleanMatrix_Get_I(Bs_ext); Bs_ext_j = hypre_CSRBooleanMatrix_Get_BigJ(Bs_ext); } B_ext_diag_i = hypre_CTAlloc(HYPRE_Int, num_cols_offd_A + 1, HYPRE_MEMORY_HOST); B_ext_offd_i = hypre_CTAlloc(HYPRE_Int, num_cols_offd_A + 1, HYPRE_MEMORY_HOST); B_ext_diag_size = 0; B_ext_offd_size = 0; last_col_diag_B = first_col_diag_B + num_cols_diag_B - 1; for (i = 0; i < num_cols_offd_A; i++) { for (j = Bs_ext_i[i]; j < Bs_ext_i[i + 1]; j++) if (Bs_ext_j[j] < first_col_diag_B || Bs_ext_j[j] > last_col_diag_B) { B_ext_offd_size++; } else { B_ext_diag_size++; } B_ext_diag_i[i + 1] = B_ext_diag_size; B_ext_offd_i[i + 1] = B_ext_offd_size; } if (B_ext_diag_size) { B_ext_diag_j = hypre_CTAlloc(HYPRE_Int, B_ext_diag_size, HYPRE_MEMORY_HOST); } if (B_ext_offd_size) { B_ext_offd_j = hypre_CTAlloc(HYPRE_Int, B_ext_offd_size, HYPRE_MEMORY_HOST); B_tmp_offd_j = hypre_CTAlloc(HYPRE_BigInt, B_ext_offd_size, HYPRE_MEMORY_HOST); } cnt_offd = 0; cnt_diag = 0; for (i = 0; i < num_cols_offd_A; i++) { for (j = Bs_ext_i[i]; j < Bs_ext_i[i + 1]; j++) if (Bs_ext_j[j] < first_col_diag_B || Bs_ext_j[j] > last_col_diag_B) { B_tmp_offd_j[cnt_offd++] = Bs_ext_j[j]; //temp[cnt_offd++] = Bs_ext_j[j]; } else { B_ext_diag_j[cnt_diag++] = (HYPRE_Int)(Bs_ext_j[j] - first_col_diag_B); } } if (num_procs > 1) { hypre_CSRBooleanMatrixDestroy(Bs_ext); Bs_ext = NULL; } cnt = 0; if (B_ext_offd_size || num_cols_offd_B) { temp = hypre_CTAlloc(HYPRE_BigInt, B_ext_offd_size + num_cols_offd_B, HYPRE_MEMORY_HOST); for (i = 0; i < B_ext_offd_size; i++) { temp[i] = B_tmp_offd_j[i]; } cnt = B_ext_offd_size; for (i = 0; i < num_cols_offd_B; i++) { temp[cnt++] = col_map_offd_B[i]; } } if (cnt) { hypre_BigQsort0(temp, 0, cnt - 1); num_cols_offd_C = 1; value = temp[0]; for (i = 1; i < cnt; i++) { if (temp[i] > value) { value = temp[i]; temp[num_cols_offd_C++] = value; } } } if (num_cols_offd_C) { col_map_offd_C = hypre_CTAlloc(HYPRE_BigInt, num_cols_offd_C, HYPRE_MEMORY_HOST); } for (i = 0; i < num_cols_offd_C; i++) { col_map_offd_C[i] = temp[i]; } if (B_ext_offd_size || num_cols_offd_B) { hypre_TFree(temp, HYPRE_MEMORY_HOST); } for (i = 0 ; i < B_ext_offd_size; i++) B_ext_offd_j[i] = hypre_BigBinarySearch(col_map_offd_C, B_tmp_offd_j[i], num_cols_offd_C); if (B_ext_offd_size) { hypre_TFree(B_tmp_offd_j, HYPRE_MEMORY_HOST); } if (num_cols_offd_B) { map_B_to_C = hypre_CTAlloc(HYPRE_Int, num_cols_offd_B, HYPRE_MEMORY_HOST); cnt = 0; for (i = 0; i < num_cols_offd_C; i++) if (col_map_offd_C[i] == col_map_offd_B[cnt]) { map_B_to_C[cnt++] = i; if (cnt == num_cols_offd_B) { break; } } } hypre_ParMatmul_RowSizes( /*&C_diag_i, &C_offd_i, &B_marker,*/ /* BooleanMatrix only uses HOST memory for now */ HYPRE_MEMORY_HOST, &C_diag_i, &C_offd_i, NULL, A_diag_i, A_diag_j, A_offd_i, A_offd_j, B_diag_i, B_diag_j, B_offd_i, B_offd_j, B_ext_diag_i, B_ext_diag_j, B_ext_offd_i, B_ext_offd_j, map_B_to_C, &C_diag_size, &C_offd_size, num_rows_diag_A, num_rows_diag_A, num_cols_offd_A, allsquare, num_cols_diag_B, num_cols_offd_B, num_cols_offd_C ); /*----------------------------------------------------------------------- * Allocate C_diag_j arrays. * Allocate C_offd_j arrays. *-----------------------------------------------------------------------*/ last_col_diag_B = first_col_diag_B + (HYPRE_BigInt)num_cols_diag_B - 1; C_diag_j = hypre_CTAlloc(HYPRE_Int, C_diag_size, HYPRE_MEMORY_HOST); if (C_offd_size) { C_offd_j = hypre_CTAlloc(HYPRE_Int, C_offd_size, HYPRE_MEMORY_HOST); } /*----------------------------------------------------------------------- * Second Pass: Fill in C_diag_j. * Second Pass: Fill in C_offd_j. *-----------------------------------------------------------------------*/ /*----------------------------------------------------------------------- * Allocate marker array. *-----------------------------------------------------------------------*/ B_marker = hypre_CTAlloc(HYPRE_Int, num_cols_diag_B + num_cols_offd_C, HYPRE_MEMORY_HOST); /*----------------------------------------------------------------------- * Initialize some stuff. *-----------------------------------------------------------------------*/ jj_count_diag = start_indexing; jj_count_offd = start_indexing; for (i1 = 0; i1 < num_cols_diag_B + num_cols_offd_C; i1++) { B_marker[i1] = -1; } /*----------------------------------------------------------------------- * Loop over interior c-points. *-----------------------------------------------------------------------*/ for (i1 = 0; i1 < num_rows_diag_A; i1++) { /*-------------------------------------------------------------------- * Create diagonal entry, C_{i1,i1} *--------------------------------------------------------------------*/ jj_row_begin_diag = jj_count_diag; jj_row_begin_offd = jj_count_offd; if ( allsquare ) { B_marker[i1] = jj_count_diag; C_diag_j[jj_count_diag] = i1; jj_count_diag++; } /*----------------------------------------------------------------- * Loop over entries in row i1 of A_offd. *-----------------------------------------------------------------*/ if (num_cols_offd_A) { for (jj2 = A_offd_i[i1]; jj2 < A_offd_i[i1 + 1]; jj2++) { i2 = A_offd_j[jj2]; /*----------------------------------------------------------- * Loop over entries in row i2 of B_ext. *-----------------------------------------------------------*/ for (jj3 = B_ext_offd_i[i2]; jj3 < B_ext_offd_i[i2 + 1]; jj3++) { i3 = num_cols_diag_B + B_ext_offd_j[jj3]; /*-------------------------------------------------------- * Check B_marker to see that C_{i1,i3} has not already * been accounted for. If it has not, create a new entry. * If it has, add new contribution. *--------------------------------------------------------*/ if (B_marker[i3] < jj_row_begin_offd) { B_marker[i3] = jj_count_offd; C_offd_j[jj_count_offd] = i3 - num_cols_diag_B; jj_count_offd++; } } for (jj3 = B_ext_diag_i[i2]; jj3 < B_ext_diag_i[i2 + 1]; jj3++) { i3 = B_ext_diag_j[jj3]; if (B_marker[i3] < jj_row_begin_diag) { B_marker[i3] = jj_count_diag; C_diag_j[jj_count_diag] = i3; jj_count_diag++; } } } } /*----------------------------------------------------------------- * Loop over entries in row i1 of A_diag. *-----------------------------------------------------------------*/ for (jj2 = A_diag_i[i1]; jj2 < A_diag_i[i1 + 1]; jj2++) { i2 = A_diag_j[jj2]; /*----------------------------------------------------------- * Loop over entries in row i2 of B_diag. *-----------------------------------------------------------*/ for (jj3 = B_diag_i[i2]; jj3 < B_diag_i[i2 + 1]; jj3++) { i3 = B_diag_j[jj3]; /*-------------------------------------------------------- * Check B_marker to see that C_{i1,i3} has not already * been accounted for. If it has not, create a new entry. * If it has, add new contribution. *--------------------------------------------------------*/ if (B_marker[i3] < jj_row_begin_diag) { B_marker[i3] = jj_count_diag; C_diag_j[jj_count_diag] = i3; jj_count_diag++; } } if (num_cols_offd_B) { for (jj3 = B_offd_i[i2]; jj3 < B_offd_i[i2 + 1]; jj3++) { i3 = num_cols_diag_B + map_B_to_C[B_offd_j[jj3]]; /*-------------------------------------------------------- * Check B_marker to see that C_{i1,i3} has not already * been accounted for. If it has not, create a new entry. * If it has, add new contribution. *--------------------------------------------------------*/ if (B_marker[i3] < jj_row_begin_offd) { B_marker[i3] = jj_count_offd; C_offd_j[jj_count_offd] = i3 - num_cols_diag_B; jj_count_offd++; } } } } } C = hypre_ParCSRBooleanMatrixCreate(comm, n_rows_A, n_cols_B, row_starts_A, col_starts_B, num_cols_offd_C, C_diag_size, C_offd_size); /* Note that C does not own the partitionings */ hypre_ParCSRBooleanMatrixSetRowStartsOwner(C, 0); hypre_ParCSRBooleanMatrixSetColStartsOwner(C, 0); C_diag = hypre_ParCSRBooleanMatrix_Get_Diag(C); hypre_CSRBooleanMatrix_Get_I(C_diag) = C_diag_i; hypre_CSRBooleanMatrix_Get_J(C_diag) = C_diag_j; C_offd = hypre_ParCSRBooleanMatrix_Get_Offd(C); hypre_CSRBooleanMatrix_Get_I(C_offd) = C_offd_i; hypre_ParCSRBooleanMatrix_Get_Offd(C) = C_offd; if (num_cols_offd_C) { hypre_CSRBooleanMatrix_Get_J(C_offd) = C_offd_j; hypre_ParCSRBooleanMatrix_Get_ColMapOffd(C) = col_map_offd_C; } /*----------------------------------------------------------------------- * Free B_ext and marker array. *-----------------------------------------------------------------------*/ hypre_TFree(B_marker, HYPRE_MEMORY_HOST); hypre_TFree(B_ext_diag_i, HYPRE_MEMORY_HOST); if (B_ext_diag_size) { hypre_TFree(B_ext_diag_j, HYPRE_MEMORY_HOST); } hypre_TFree(B_ext_offd_i, HYPRE_MEMORY_HOST); if (B_ext_offd_size) { hypre_TFree(B_ext_offd_j, HYPRE_MEMORY_HOST); } if (num_cols_offd_B) { hypre_TFree(map_B_to_C, HYPRE_MEMORY_HOST); } return C; } /*-------------------------------------------------------------------------- * hypre_ParCSRBooleanMatrixExtractBExt : * extracts rows from B which are located on other * processors and needed for multiplication with A locally. The rows * are returned as CSRBooleanMatrix. *--------------------------------------------------------------------------*/ hypre_CSRBooleanMatrix * hypre_ParCSRBooleanMatrixExtractBExt ( hypre_ParCSRBooleanMatrix *B, hypre_ParCSRBooleanMatrix *A ) { MPI_Comm comm = hypre_ParCSRBooleanMatrix_Get_Comm(B); HYPRE_BigInt first_col_diag = hypre_ParCSRBooleanMatrix_Get_FirstColDiag(B); /*HYPRE_Int first_row_index = hypre_ParCSRBooleanMatrix_Get_FirstRowIndex(B);*/ HYPRE_BigInt *col_map_offd = hypre_ParCSRBooleanMatrix_Get_ColMapOffd(B); hypre_ParCSRCommPkg *comm_pkg = hypre_ParCSRBooleanMatrix_Get_CommPkg(A); HYPRE_Int num_recvs = hypre_ParCSRCommPkgNumRecvs(comm_pkg); HYPRE_Int *recv_vec_starts = hypre_ParCSRCommPkgRecvVecStarts(comm_pkg); HYPRE_Int num_sends = hypre_ParCSRCommPkgNumSends(comm_pkg); HYPRE_Int *send_map_starts = hypre_ParCSRCommPkgSendMapStarts(comm_pkg); HYPRE_Int *send_map_elmts = hypre_ParCSRCommPkgSendMapElmts(comm_pkg); hypre_CSRBooleanMatrix *diag = hypre_ParCSRBooleanMatrix_Get_Diag(B); HYPRE_Int *diag_i = hypre_CSRBooleanMatrix_Get_I(diag); HYPRE_Int *diag_j = hypre_CSRBooleanMatrix_Get_J(diag); hypre_CSRBooleanMatrix *offd = hypre_ParCSRBooleanMatrix_Get_Offd(B); HYPRE_Int *offd_i = hypre_CSRBooleanMatrix_Get_I(offd); HYPRE_Int *offd_j = hypre_CSRBooleanMatrix_Get_J(offd); HYPRE_Int num_cols_B, num_nonzeros; HYPRE_Int num_rows_B_ext; hypre_CSRBooleanMatrix *B_ext; HYPRE_Int *B_ext_i; HYPRE_BigInt *B_ext_j; HYPRE_Complex *B_ext_data = NULL, *diag_data = NULL, *offd_data = NULL; HYPRE_BigInt *B_ext_row_map = NULL; /* ... not referenced, but needed for function call */ num_cols_B = hypre_ParCSRBooleanMatrix_Get_GlobalNCols(B); num_rows_B_ext = recv_vec_starts[num_recvs]; hypre_ParCSRMatrixExtractBExt_Arrays ( &B_ext_i, &B_ext_j, &B_ext_data, &B_ext_row_map, &num_nonzeros, 0, 0, comm, comm_pkg, num_cols_B, num_recvs, num_sends, first_col_diag, B->row_starts, recv_vec_starts, send_map_starts, send_map_elmts, diag_i, diag_j, offd_i, offd_j, col_map_offd, diag_data, offd_data ); B_ext = hypre_CSRBooleanMatrixCreate(num_rows_B_ext, num_cols_B, num_nonzeros); hypre_CSRBooleanMatrix_Get_I(B_ext) = B_ext_i; hypre_CSRBooleanMatrix_Get_BigJ(B_ext) = B_ext_j; return B_ext; } /*-------------------------------------------------------------------------- * hypre_ParCSRBooleanMatrixExtractAExt : extracts rows from A which are located on other * processors and needed for multiplying A^T with the local part of A. The rows * are returned as CSRBooleanMatrix. A row map for A_ext (like the ParCSRColMap) is * returned through the third argument. *--------------------------------------------------------------------------*/ hypre_CSRBooleanMatrix * hypre_ParCSRBooleanMatrixExtractAExt( hypre_ParCSRBooleanMatrix *A, HYPRE_BigInt ** pA_ext_row_map ) { /* Note that A's role as the first factor in A*A^T is used only through ...CommPkgT(A), which basically says which rows of A (columns of A^T) are needed. In all the other places where A serves as an input, it is through its role as A^T, the matrix whose data needs to be passed between processors. */ MPI_Comm comm = hypre_ParCSRBooleanMatrix_Get_Comm(A); HYPRE_BigInt first_col_diag = hypre_ParCSRBooleanMatrix_Get_FirstColDiag(A); /*HYPRE_Int first_row_index = hypre_ParCSRBooleanMatrix_Get_FirstRowIndex(A);*/ HYPRE_BigInt *col_map_offd = hypre_ParCSRBooleanMatrix_Get_ColMapOffd(A); hypre_ParCSRCommPkg *comm_pkg = hypre_ParCSRBooleanMatrix_Get_CommPkgT(A); /* ... CommPkgT(A) should identify all rows of A^T needed for A*A^T (that is * generally a bigger set than ...CommPkg(A), the rows of B needed for A*B) */ HYPRE_Int num_recvs = hypre_ParCSRCommPkgNumRecvs(comm_pkg); HYPRE_Int *recv_vec_starts = hypre_ParCSRCommPkgRecvVecStarts(comm_pkg); HYPRE_Int num_sends = hypre_ParCSRCommPkgNumSends(comm_pkg); HYPRE_Int *send_map_starts = hypre_ParCSRCommPkgSendMapStarts(comm_pkg); HYPRE_Int *send_map_elmts = hypre_ParCSRCommPkgSendMapElmts(comm_pkg); hypre_CSRBooleanMatrix *diag = hypre_ParCSRBooleanMatrix_Get_Diag(A); HYPRE_Int *diag_i = hypre_CSRMatrixI(diag); HYPRE_Int *diag_j = hypre_CSRMatrixJ(diag); hypre_CSRBooleanMatrix *offd = hypre_ParCSRBooleanMatrix_Get_Offd(A); HYPRE_Int *offd_i = hypre_CSRMatrixI(offd); HYPRE_Int *offd_j = hypre_CSRMatrixJ(offd); HYPRE_BigInt num_cols_A; HYPRE_Int num_nonzeros; HYPRE_Int num_rows_A_ext; hypre_CSRBooleanMatrix *A_ext; HYPRE_Int *A_ext_i; HYPRE_BigInt *A_ext_j; HYPRE_Int data = 0; HYPRE_Complex *A_ext_data = NULL, *diag_data = NULL, *offd_data = NULL; /* ... not referenced, but needed for function call */ num_cols_A = hypre_ParCSRBooleanMatrix_Get_GlobalNCols(A); num_rows_A_ext = recv_vec_starts[num_recvs]; hypre_ParCSRMatrixExtractBExt_Arrays ( &A_ext_i, &A_ext_j, &A_ext_data, pA_ext_row_map, &num_nonzeros, data, 1, comm, comm_pkg, num_cols_A, num_recvs, num_sends, first_col_diag, A->row_starts, recv_vec_starts, send_map_starts, send_map_elmts, diag_i, diag_j, offd_i, offd_j, col_map_offd, diag_data, offd_data ); A_ext = hypre_CSRBooleanMatrixCreate(num_rows_A_ext, num_cols_A, num_nonzeros); hypre_CSRBooleanMatrix_Get_I(A_ext) = A_ext_i; hypre_CSRBooleanMatrix_Get_BigJ(A_ext) = A_ext_j; return A_ext; } /*-------------------------------------------------------------------------- * hypre_ParBooleanAAT : multiplies hypre_ParCSRBooleanMatrix A by its transpose, * A*A^T, and returns the product in hypre_ParCSRBooleanMatrix C * Note that C does not own the partitionings * This is based on hypre_ParCSRAAt. *--------------------------------------------------------------------------*/ hypre_ParCSRBooleanMatrix* hypre_ParBooleanAAt(hypre_ParCSRBooleanMatrix *A) { MPI_Comm comm = hypre_ParCSRBooleanMatrix_Get_Comm(A); hypre_CSRBooleanMatrix *A_diag = hypre_ParCSRBooleanMatrix_Get_Diag(A); HYPRE_Int *A_diag_i = hypre_CSRBooleanMatrix_Get_I(A_diag); HYPRE_Int *A_diag_j = hypre_CSRBooleanMatrix_Get_J(A_diag); hypre_CSRBooleanMatrix *A_offd = hypre_ParCSRBooleanMatrix_Get_Offd(A); HYPRE_Int *A_offd_i = hypre_CSRBooleanMatrix_Get_I(A_offd); HYPRE_Int *A_offd_j = hypre_CSRBooleanMatrix_Get_J(A_offd); HYPRE_BigInt *A_col_map_offd = hypre_ParCSRBooleanMatrix_Get_ColMapOffd(A); HYPRE_BigInt *A_ext_row_map; HYPRE_BigInt *row_starts_A = hypre_ParCSRBooleanMatrix_Get_RowStarts(A); HYPRE_Int num_rows_diag_A = hypre_CSRBooleanMatrix_Get_NRows(A_diag); HYPRE_Int num_cols_offd_A = hypre_CSRBooleanMatrix_Get_NCols(A_offd); hypre_ParCSRBooleanMatrix *C; HYPRE_BigInt *col_map_offd_C; hypre_CSRBooleanMatrix *C_diag; HYPRE_Int *C_diag_i; HYPRE_Int *C_diag_j; hypre_CSRBooleanMatrix *C_offd; HYPRE_Int *C_offd_i = NULL; HYPRE_Int *C_offd_j = NULL; HYPRE_Int *new_C_offd_j; HYPRE_Int C_diag_size; HYPRE_Int C_offd_size; HYPRE_BigInt last_col_diag_C; HYPRE_Int num_cols_offd_C; hypre_CSRBooleanMatrix *A_ext = NULL; HYPRE_Int *A_ext_i = NULL; HYPRE_BigInt *A_ext_j = NULL; HYPRE_Int num_rows_A_ext = 0; HYPRE_BigInt first_row_index_A = hypre_ParCSRBooleanMatrix_Get_FirstRowIndex(A); HYPRE_BigInt first_col_diag_A = hypre_ParCSRBooleanMatrix_Get_FirstColDiag(A); HYPRE_Int *B_marker; HYPRE_Int i; HYPRE_Int i1, i2, i3; HYPRE_Int jj2, jj3; HYPRE_Int jj_count_diag, jj_count_offd; HYPRE_Int jj_row_begin_diag, jj_row_begin_offd; HYPRE_Int start_indexing = 0; /* start indexing for C_data at 0 */ HYPRE_Int count; HYPRE_BigInt n_rows_A, n_cols_A; n_rows_A = hypre_ParCSRBooleanMatrix_Get_GlobalNRows(A); n_cols_A = hypre_ParCSRBooleanMatrix_Get_GlobalNCols(A); if (n_cols_A != n_rows_A) { hypre_error_w_msg(HYPRE_ERROR_GENERIC, " Error! Incompatible matrix dimensions!\n"); return NULL; } /*----------------------------------------------------------------------- * Extract A_ext, i.e. portion of A that is stored on neighbor procs * and needed locally for A^T in the matrix matrix product A*A^T *-----------------------------------------------------------------------*/ if ((HYPRE_BigInt)num_rows_diag_A != n_rows_A) { /*--------------------------------------------------------------------- * If there exists no CommPkg for A, a CommPkg is generated using * equally load balanced partitionings *--------------------------------------------------------------------*/ if (!hypre_ParCSRBooleanMatrix_Get_CommPkg(A)) { hypre_BooleanMatTCommPkgCreate(A); } A_ext = hypre_ParCSRBooleanMatrixExtractAExt( A, &A_ext_row_map ); A_ext_i = hypre_CSRBooleanMatrix_Get_I(A_ext); A_ext_j = hypre_CSRBooleanMatrix_Get_BigJ(A_ext); num_rows_A_ext = hypre_CSRBooleanMatrix_Get_NRows(A_ext); } /*----------------------------------------------------------------------- * Allocate marker array. *-----------------------------------------------------------------------*/ B_marker = hypre_CTAlloc(HYPRE_Int, num_rows_diag_A + num_rows_A_ext, HYPRE_MEMORY_HOST); /*----------------------------------------------------------------------- * Initialize some stuff. *-----------------------------------------------------------------------*/ for ( i1 = 0; i1 < num_rows_diag_A + num_rows_A_ext; ++i1 ) { B_marker[i1] = -1; } hypre_ParAat_RowSizes( &C_diag_i, &C_offd_i, B_marker, A_diag_i, A_diag_j, A_offd_i, A_offd_j, A_col_map_offd, A_ext_i, A_ext_j, A_ext_row_map, &C_diag_size, &C_offd_size, num_rows_diag_A, num_cols_offd_A, num_rows_A_ext, first_col_diag_A, first_row_index_A ); #if 0 /* debugging output: */ hypre_printf("A_ext_row_map (%i):", num_rows_A_ext); for ( i1 = 0; i1 < num_rows_A_ext; ++i1 ) { hypre_printf(" %i", A_ext_row_map[i1] ); } hypre_printf("\nC_diag_i (%i):", C_diag_size); for ( i1 = 0; i1 <= num_rows_diag_A; ++i1 ) { hypre_printf(" %i", C_diag_i[i1] ); } hypre_printf("\nC_offd_i (%i):", C_offd_size); for ( i1 = 0; i1 <= num_rows_diag_A; ++i1 ) { hypre_printf(" %i", C_offd_i[i1] ); } hypre_printf("\n"); #endif /*----------------------------------------------------------------------- * Allocate C_diag_j arrays. * Allocate C_offd_j arrays. *-----------------------------------------------------------------------*/ last_col_diag_C = first_row_index_A + num_rows_diag_A - 1; C_diag_j = hypre_CTAlloc(HYPRE_Int, C_diag_size, HYPRE_MEMORY_HOST); if (C_offd_size) { C_offd_j = hypre_CTAlloc(HYPRE_Int, C_offd_size, HYPRE_MEMORY_HOST); } /*----------------------------------------------------------------------- * Second Pass: Fill in C_diag_j. * Second Pass: Fill in C_offd_j. *-----------------------------------------------------------------------*/ /*----------------------------------------------------------------------- * Initialize some stuff. *-----------------------------------------------------------------------*/ jj_count_diag = start_indexing; jj_count_offd = start_indexing; for ( i1 = 0; i1 < num_rows_diag_A + num_rows_A_ext; ++i1 ) { B_marker[i1] = -1; } /*----------------------------------------------------------------------- * Loop over interior c-points. *-----------------------------------------------------------------------*/ for (i1 = 0; i1 < num_rows_diag_A; i1++) { /*-------------------------------------------------------------------- * Create diagonal entry, C_{i1,i1} *--------------------------------------------------------------------*/ B_marker[i1] = jj_count_diag; jj_row_begin_diag = jj_count_diag; jj_row_begin_offd = jj_count_offd; C_diag_j[jj_count_diag] = i1; jj_count_diag++; /*----------------------------------------------------------------- * Loop over entries in row i1 of A_offd. *-----------------------------------------------------------------*/ /* There are 3 CSRMatrix or CSRBooleanMatrix objects here: ext*ext, ext*diag, and ext*offd belong to another processor. diag*offd and offd*diag don't count - never share a column by definition. So we have to do 4 cases: diag*ext, offd*ext, diag*diag, and offd*offd. */ for (jj2 = A_diag_i[i1]; jj2 < A_diag_i[i1 + 1]; jj2++) { i2 = A_diag_j[jj2]; /* diag*ext */ /*----------------------------------------------------------- * Loop over entries (columns) i3 in row i2 of (A_ext)^T * That is, rows i3 having a column i2 of A_ext. * For now, for each row i3 of A_ext we crudely check _all_ * columns to see whether one matches i2. * For each entry (i2,i3) of (A_ext)^T, A(i1,i2)*A(i3,i2) defines * C(i1,i3) . This contributes to both the diag and offd * blocks of C. *-----------------------------------------------------------*/ for ( i3 = 0; i3 < num_rows_A_ext; i3++ ) { for ( jj3 = A_ext_i[i3]; jj3 < A_ext_i[i3 + 1]; jj3++ ) { if ( A_ext_j[jj3] == (HYPRE_BigInt)i2 + first_col_diag_A ) { /* row i3, column i2 of A_ext; or, row i2, column i3 of (A_ext)^T */ /*-------------------------------------------------------- * Check B_marker to see that C_{i1,i3} has not already * been accounted for. If it has not, create a new entry. *--------------------------------------------------------*/ if ( A_ext_row_map[i3] < first_row_index_A || A_ext_row_map[i3] > last_col_diag_C ) /* offd */ { if (B_marker[i3 + num_rows_diag_A] < jj_row_begin_offd) { B_marker[i3 + num_rows_diag_A] = jj_count_offd; C_offd_j[jj_count_offd] = i3; jj_count_offd++; } } else /* diag */ { if (B_marker[i3 + num_rows_diag_A] < jj_row_begin_diag) { B_marker[i3 + num_rows_diag_A] = jj_count_diag; C_diag_j[jj_count_diag] = i3 - (HYPRE_Int)first_col_diag_A; jj_count_diag++; } } } } } } if (num_cols_offd_A) { for (jj2 = A_offd_i[i1]; jj2 < A_offd_i[i1 + 1]; jj2++) { i2 = A_offd_j[jj2]; /* offd * ext */ /*----------------------------------------------------------- * Loop over entries (columns) i3 in row i2 of (A_ext)^T * That is, rows i3 having a column i2 of A_ext. * For now, for each row i3 of A_ext we crudely check _all_ * columns to see whether one matches i2. * For each entry (i2,i3) of (A_ext)^T, A(i1,i2)*A(i3,i2) defines * C(i1,i3) . This contributes to both the diag and offd * blocks of C. *-----------------------------------------------------------*/ for ( i3 = 0; i3 < num_rows_A_ext; i3++ ) { for ( jj3 = A_ext_i[i3]; jj3 < A_ext_i[i3 + 1]; jj3++ ) { if ( A_ext_j[jj3] == A_col_map_offd[i2] ) { /* row i3, column i2 of A_ext; or, row i2, column i3 of (A_ext)^T */ /*-------------------------------------------------------- * Check B_marker to see that C_{i1,i3} has not already * been accounted for. If it has not, create a new entry. * If it has, add new contribution. *--------------------------------------------------------*/ if ( A_ext_row_map[i3] < first_row_index_A || A_ext_row_map[i3] > last_col_diag_C ) /* offd */ { if (B_marker[i3 + num_rows_diag_A] < jj_row_begin_offd) { B_marker[i3 + num_rows_diag_A] = jj_count_offd; C_offd_j[jj_count_offd] = i3; jj_count_offd++; } } else /* diag */ { if (B_marker[i3 + num_rows_diag_A] < jj_row_begin_diag) { B_marker[i3 + num_rows_diag_A] = jj_count_diag; C_diag_j[jj_count_diag] = i3 - (HYPRE_Int)first_row_index_A; jj_count_diag++; } } } } } } } /* diag * diag */ /*----------------------------------------------------------------- * Loop over entries (columns) i2 in row i1 of A_diag. * For each such column we will find the contributions of the * corresponding rows i2 of A^T to C=A*A^T . Now we only look * at the local part of A^T - with columns (rows of A) living * on this processor. *-----------------------------------------------------------------*/ for (jj2 = A_diag_i[i1]; jj2 < A_diag_i[i1 + 1]; jj2++) { i2 = A_diag_j[jj2]; /*----------------------------------------------------------- * Loop over entries (columns) i3 in row i2 of A^T * That is, rows i3 having a column i2 of A (local part). * For now, for each row i3 of A we crudely check _all_ * columns to see whether one matches i2. * This i3-loop is for the diagonal block of A. * It contributes to the diagonal block of C. * For each entry (i2,i3) of A^T, A(i1,i2)*A(i3,i2) defines * to C(i1,i3) *-----------------------------------------------------------*/ for ( i3 = 0; i3 < num_rows_diag_A; i3++ ) { for ( jj3 = A_diag_i[i3]; jj3 < A_diag_i[i3 + 1]; jj3++ ) { if ( A_diag_j[jj3] == i2 ) { /* row i3, column i2 of A; or, row i2, column i3 of A^T */ /*-------------------------------------------------------- * Check B_marker to see that C_{i1,i3} has not already * been accounted for. If it has not, mark it and increment * counter. *--------------------------------------------------------*/ if (B_marker[i3] < jj_row_begin_diag) { B_marker[i3] = jj_count_diag; C_diag_j[jj_count_diag] = i3; jj_count_diag++; } } } } /* end of i3 loop */ } /* end of third i2 loop */ /* offd * offd */ /*----------------------------------------------------------- * Loop over offd columns i2 of A in A*A^T. Then * loop over offd entries (columns) i3 in row i2 of A^T * That is, rows i3 having a column i2 of A (local part). * For now, for each row i3 of A we crudely check _all_ * columns to see whether one matches i2. * This i3-loop is for the off-diagonal block of A. * It contributes to the diag block of C. * For each entry (i2,i3) of A^T, A*A^T defines C *-----------------------------------------------------------*/ if (num_cols_offd_A) { for (jj2 = A_offd_i[i1]; jj2 < A_offd_i[i1 + 1]; jj2++) { i2 = A_offd_j[jj2]; for ( i3 = 0; i3 < num_rows_diag_A; i3++ ) { /* ... note that num_rows_diag_A == num_rows_offd_A */ for ( jj3 = A_offd_i[i3]; jj3 < A_offd_i[i3 + 1]; jj3++ ) { if ( A_offd_j[jj3] == i2 ) { /* row i3, column i2 of A; or, row i2, column i3 of A^T */ /*-------------------------------------------------------- * Check B_marker to see that C_{i1,i3} has not already * been accounted for. If it has not, create a new entry. * If it has, add new contribution *--------------------------------------------------------*/ if (B_marker[i3] < jj_row_begin_diag) { B_marker[i3] = jj_count_diag; C_diag_j[jj_count_diag] = i3; jj_count_diag++; } } } } /* end of last i3 loop */ } /* end of if (num_cols_offd_A) */ } /* end of fourth and last i2 loop */ #if 0 /* debugging printout */ hypre_printf("end of i1 loop: i1=%i jj_count_diag=%i\n", i1, jj_count_diag ); hypre_printf(" C_diag_j="); for ( jj3 = 0; jj3 < jj_count_diag; ++jj3) { hypre_printf("%i ", C_diag_j[jj3]); } hypre_printf("\n"); hypre_printf(" C_offd_j="); for ( jj3 = 0; jj3 < jj_count_offd; ++jj3) { hypre_printf("%i ", C_offd_j[jj3]); } hypre_printf("\n"); hypre_printf( " B_marker =" ); for ( it = 0; it < num_rows_diag_A + num_rows_A_ext; ++it ) { hypre_printf(" %i", B_marker[it] ); } hypre_printf( "\n" ); #endif } /* end of i1 loop */ /*----------------------------------------------------------------------- * Delete 0-columns in C_offd, i.e. generate col_map_offd and reset * C_offd_j. Note that (with the indexing we have coming into this * block) col_map_offd_C[i3]==A_ext_row_map[i3]. *-----------------------------------------------------------------------*/ for ( i = 0; i < num_rows_diag_A + num_rows_A_ext; ++i ) { B_marker[i] = -1; } for ( i = 0; i < C_offd_size; i++ ) { B_marker[ C_offd_j[i] ] = -2; } count = 0; for (i = 0; i < num_rows_diag_A + num_rows_A_ext; i++) { if (B_marker[i] == -2) { B_marker[i] = count; count++; } } num_cols_offd_C = count; if (num_cols_offd_C) { col_map_offd_C = hypre_CTAlloc(HYPRE_BigInt, num_cols_offd_C, HYPRE_MEMORY_HOST); new_C_offd_j = hypre_CTAlloc(HYPRE_Int, C_offd_size, HYPRE_MEMORY_HOST); /* ... a bit big, but num_cols_offd_C is too small. It might be worth computing the correct size, which is sum( no. columns in row i, over all rows i ) */ for (i = 0; i < C_offd_size; i++) { new_C_offd_j[i] = B_marker[C_offd_j[i]]; col_map_offd_C[ new_C_offd_j[i] ] = A_ext_row_map[ C_offd_j[i] ]; } hypre_TFree(C_offd_j, HYPRE_MEMORY_HOST); C_offd_j = new_C_offd_j; } /*---------------------------------------------------------------- * Create C *----------------------------------------------------------------*/ C = hypre_ParCSRBooleanMatrixCreate(comm, n_rows_A, n_rows_A, row_starts_A, row_starts_A, num_cols_offd_C, C_diag_size, C_offd_size); /* Note that C does not own the partitionings */ hypre_ParCSRBooleanMatrixSetRowStartsOwner(C, 0); hypre_ParCSRBooleanMatrixSetColStartsOwner(C, 0); C_diag = hypre_ParCSRBooleanMatrix_Get_Diag(C); hypre_CSRBooleanMatrix_Get_I(C_diag) = C_diag_i; hypre_CSRBooleanMatrix_Get_J(C_diag) = C_diag_j; if (num_cols_offd_C) { C_offd = hypre_ParCSRBooleanMatrix_Get_Offd(C); hypre_CSRBooleanMatrix_Get_I(C_offd) = C_offd_i; hypre_CSRBooleanMatrix_Get_J(C_offd) = C_offd_j; hypre_ParCSRBooleanMatrix_Get_Offd(C) = C_offd; hypre_ParCSRBooleanMatrix_Get_ColMapOffd(C) = col_map_offd_C; } else { hypre_TFree(C_offd_i, HYPRE_MEMORY_HOST); } /*----------------------------------------------------------------------- * Free B_ext and marker array. *-----------------------------------------------------------------------*/ if (num_cols_offd_A) { hypre_CSRBooleanMatrixDestroy(A_ext); A_ext = NULL; } hypre_TFree(B_marker, HYPRE_MEMORY_HOST); if ( num_rows_diag_A != n_rows_A ) { hypre_TFree(A_ext_row_map, HYPRE_MEMORY_HOST); } return C; } /* ---------------------------------------------------------------------- * hypre_BooleanMatTCommPkgCreate * generates a special comm_pkg for a Boolean matrix A - for use in multiplying * by its transpose, A * A^T * if no row and/or column partitioning is given, the routine determines * them with MPE_Decomp1d * ---------------------------------------------------------------------*/ HYPRE_Int hypre_BooleanMatTCommPkgCreate ( hypre_ParCSRBooleanMatrix *A) { MPI_Comm comm = hypre_ParCSRBooleanMatrix_Get_Comm(A); HYPRE_BigInt *col_map_offd = hypre_ParCSRBooleanMatrix_Get_ColMapOffd(A); HYPRE_BigInt first_col_diag = hypre_ParCSRBooleanMatrix_Get_FirstColDiag(A); HYPRE_BigInt *col_starts = hypre_ParCSRBooleanMatrix_Get_ColStarts(A); HYPRE_Int num_rows_diag = hypre_CSRBooleanMatrix_Get_NRows(hypre_ParCSRBooleanMatrix_Get_Diag( A)); HYPRE_Int num_cols_diag = hypre_CSRBooleanMatrix_Get_NCols(hypre_ParCSRBooleanMatrix_Get_Diag( A)); HYPRE_Int num_cols_offd = hypre_CSRBooleanMatrix_Get_NCols(hypre_ParCSRBooleanMatrix_Get_Offd( A)); HYPRE_BigInt *row_starts = hypre_ParCSRBooleanMatrix_Get_RowStarts(A); HYPRE_Int num_sends; HYPRE_Int *send_procs; HYPRE_Int *send_map_starts; HYPRE_Int *send_map_elmts; HYPRE_Int num_recvs; HYPRE_Int *recv_procs; HYPRE_Int *recv_vec_starts; hypre_ParCSRCommPkg *comm_pkg = NULL; hypre_MatTCommPkgCreate_core ( comm, col_map_offd, first_col_diag, col_starts, num_rows_diag, num_cols_diag, num_cols_offd, row_starts, hypre_ParCSRBooleanMatrix_Get_FirstColDiag(A), hypre_ParCSRBooleanMatrix_Get_ColMapOffd(A), hypre_CSRBooleanMatrix_Get_I( hypre_ParCSRBooleanMatrix_Get_Diag(A) ), hypre_CSRBooleanMatrix_Get_J( hypre_ParCSRBooleanMatrix_Get_Diag(A) ), hypre_CSRBooleanMatrix_Get_I( hypre_ParCSRBooleanMatrix_Get_Offd(A) ), hypre_CSRBooleanMatrix_Get_J( hypre_ParCSRBooleanMatrix_Get_Offd(A) ), 0, &num_recvs, &recv_procs, &recv_vec_starts, &num_sends, &send_procs, &send_map_starts, &send_map_elmts ); /* Create communication package */ hypre_ParCSRCommPkgCreateAndFill(comm, num_recvs, recv_procs, recv_vec_starts, num_sends, send_procs, send_map_starts, send_map_elmts, &comm_pkg); hypre_ParCSRBooleanMatrix_Get_CommPkgT(A) = comm_pkg; return hypre_error_flag; } /* ---------------------------------------------------------------------- * hypre_BooleanMatvecCommPkgCreate * generates the comm_pkg for a Boolean matrix A , to be used for A*B. * if no row and/or column partitioning is given, the routine determines * them with MPE_Decomp1d * ---------------------------------------------------------------------*/ HYPRE_Int hypre_BooleanMatvecCommPkgCreate ( hypre_ParCSRBooleanMatrix *A) { MPI_Comm comm = hypre_ParCSRBooleanMatrix_Get_Comm(A); HYPRE_BigInt *col_map_offd = hypre_ParCSRBooleanMatrix_Get_ColMapOffd(A); HYPRE_BigInt first_col_diag = hypre_ParCSRBooleanMatrix_Get_FirstColDiag(A); HYPRE_BigInt *col_starts = hypre_ParCSRBooleanMatrix_Get_ColStarts(A); HYPRE_Int num_cols_diag = hypre_CSRBooleanMatrix_Get_NCols(hypre_ParCSRBooleanMatrix_Get_Diag( A)); HYPRE_Int num_cols_offd = hypre_CSRBooleanMatrix_Get_NCols(hypre_ParCSRBooleanMatrix_Get_Offd( A)); HYPRE_Int num_sends; HYPRE_Int *send_procs; HYPRE_Int *send_map_starts; HYPRE_Int *send_map_elmts; HYPRE_Int num_recvs; HYPRE_Int *recv_procs; HYPRE_Int *recv_vec_starts; hypre_ParCSRCommPkg *comm_pkg = NULL; hypre_ParCSRCommPkgCreate_core ( comm, col_map_offd, first_col_diag, col_starts, num_cols_diag, num_cols_offd, &num_recvs, &recv_procs, &recv_vec_starts, &num_sends, &send_procs, &send_map_starts, &send_map_elmts ); /* Create communication package */ hypre_ParCSRCommPkgCreateAndFill(comm, num_recvs, recv_procs, recv_vec_starts, num_sends, send_procs, send_map_starts, send_map_elmts, &comm_pkg); hypre_ParCSRBooleanMatrix_Get_CommPkg(A) = comm_pkg; return hypre_error_flag; } hypre-2.33.0/src/parcsr_mv/par_csr_bool_matrix.c000066400000000000000000001134161477326011500217210ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * Member functions for hypre_CSRBooleanMatrix and hypre_ParCSRBooleanMatrix class. * *****************************************************************************/ #include "_hypre_parcsr_mv.h" /*-------------------------------------------------------------------------- * hypre_CSRBooleanMatrixCreate *--------------------------------------------------------------------------*/ hypre_CSRBooleanMatrix *hypre_CSRBooleanMatrixCreate(HYPRE_Int num_rows, HYPRE_Int num_cols, HYPRE_Int num_nonzeros ) { hypre_CSRBooleanMatrix *matrix; matrix = hypre_CTAlloc(hypre_CSRBooleanMatrix, 1, HYPRE_MEMORY_HOST); hypre_CSRBooleanMatrix_Get_I(matrix) = NULL; hypre_CSRBooleanMatrix_Get_J(matrix) = NULL; hypre_CSRBooleanMatrix_Get_BigJ(matrix) = NULL; hypre_CSRBooleanMatrix_Get_NRows(matrix) = num_rows; hypre_CSRBooleanMatrix_Get_NCols(matrix) = num_cols; hypre_CSRBooleanMatrix_Get_NNZ(matrix) = num_nonzeros; hypre_CSRBooleanMatrix_Get_OwnsData(matrix) = 1; return matrix; } /*-------------------------------------------------------------------------- * hypre_CSRBooleanMatrixDestroy *--------------------------------------------------------------------------*/ HYPRE_Int hypre_CSRBooleanMatrixDestroy( hypre_CSRBooleanMatrix *matrix ) { if (matrix) { hypre_TFree(hypre_CSRBooleanMatrix_Get_I(matrix), HYPRE_MEMORY_HOST); if ( hypre_CSRBooleanMatrix_Get_OwnsData(matrix) ) { hypre_TFree(hypre_CSRBooleanMatrix_Get_J(matrix), HYPRE_MEMORY_HOST); hypre_TFree(hypre_CSRBooleanMatrix_Get_BigJ(matrix), HYPRE_MEMORY_HOST); } hypre_TFree(matrix, HYPRE_MEMORY_HOST); } return 0; } /*-------------------------------------------------------------------------- * hypre_CSRBooleanMatrixInitialize *--------------------------------------------------------------------------*/ HYPRE_Int hypre_CSRBooleanMatrixInitialize( hypre_CSRBooleanMatrix *matrix ) { HYPRE_Int num_rows = hypre_CSRBooleanMatrix_Get_NRows(matrix); HYPRE_Int num_nonzeros = hypre_CSRBooleanMatrix_Get_NNZ(matrix); if ( ! hypre_CSRBooleanMatrix_Get_I(matrix) ) { hypre_CSRBooleanMatrix_Get_I(matrix) = hypre_CTAlloc(HYPRE_Int, num_rows + 1, HYPRE_MEMORY_HOST); } if ( ! hypre_CSRBooleanMatrix_Get_J(matrix) ) { hypre_CSRBooleanMatrix_Get_J(matrix) = hypre_CTAlloc(HYPRE_Int, num_nonzeros, HYPRE_MEMORY_HOST); } return 0; } /*-------------------------------------------------------------------------- * hypre_CSRBooleanMatrixBigInitialize *--------------------------------------------------------------------------*/ HYPRE_Int hypre_CSRBooleanMatrixBigInitialize( hypre_CSRBooleanMatrix *matrix ) { HYPRE_Int num_rows = hypre_CSRBooleanMatrix_Get_NRows(matrix); HYPRE_Int num_nonzeros = hypre_CSRBooleanMatrix_Get_NNZ(matrix); if ( ! hypre_CSRBooleanMatrix_Get_I(matrix) ) { hypre_CSRBooleanMatrix_Get_I(matrix) = hypre_CTAlloc(HYPRE_Int, num_rows + 1, HYPRE_MEMORY_HOST); } if ( ! hypre_CSRBooleanMatrix_Get_BigJ(matrix) ) { hypre_CSRBooleanMatrix_Get_BigJ(matrix) = hypre_CTAlloc(HYPRE_BigInt, num_nonzeros, HYPRE_MEMORY_HOST); } return 0; } /*-------------------------------------------------------------------------- * hypre_CSRBooleanMatrixSetDataOwner *--------------------------------------------------------------------------*/ HYPRE_Int hypre_CSRBooleanMatrixSetDataOwner( hypre_CSRBooleanMatrix *matrix, HYPRE_Int owns_data ) { hypre_CSRBooleanMatrix_Get_OwnsData(matrix) = owns_data; return 0; } /*-------------------------------------------------------------------------- * hypre_CSRBooleanMatrixRead *--------------------------------------------------------------------------*/ hypre_CSRBooleanMatrix * hypre_CSRBooleanMatrixRead( const char *file_name ) { hypre_CSRBooleanMatrix *matrix; FILE *fp; HYPRE_Int *matrix_i; HYPRE_Int *matrix_j; HYPRE_Int num_rows; HYPRE_Int num_nonzeros; HYPRE_Int max_col = 0; HYPRE_Int file_base = 1; HYPRE_Int j; /*---------------------------------------------------------- * Read in the data *----------------------------------------------------------*/ fp = fopen(file_name, "r"); hypre_fscanf(fp, "%d", &num_rows); matrix_i = hypre_CTAlloc(HYPRE_Int, num_rows + 1, HYPRE_MEMORY_HOST); for (j = 0; j < num_rows + 1; j++) { hypre_fscanf(fp, "%d", &matrix_i[j]); matrix_i[j] -= file_base; } num_nonzeros = matrix_i[num_rows]; matrix = hypre_CSRBooleanMatrixCreate(num_rows, num_rows, matrix_i[num_rows]); hypre_CSRBooleanMatrix_Get_I(matrix) = matrix_i; hypre_CSRBooleanMatrixInitialize(matrix); matrix_j = hypre_CSRBooleanMatrix_Get_J(matrix); for (j = 0; j < num_nonzeros; j++) { hypre_fscanf(fp, "%d", &matrix_j[j]); matrix_j[j] -= file_base; if (matrix_j[j] > max_col) { max_col = matrix_j[j]; } } fclose(fp); hypre_CSRBooleanMatrix_Get_NNZ(matrix) = num_nonzeros; hypre_CSRBooleanMatrix_Get_NCols(matrix) = ++max_col; return matrix; } /*-------------------------------------------------------------------------- * hypre_CSRBooleanMatrixPrint *--------------------------------------------------------------------------*/ HYPRE_Int hypre_CSRBooleanMatrixPrint( hypre_CSRBooleanMatrix *matrix, const char *file_name ) { FILE *fp; HYPRE_Int *matrix_i; HYPRE_Int *matrix_j; HYPRE_Int num_rows; HYPRE_Int file_base = 1; HYPRE_Int j; HYPRE_Int ierr = 0; /*---------------------------------------------------------- * Print the matrix data *----------------------------------------------------------*/ matrix_i = hypre_CSRBooleanMatrix_Get_I(matrix); matrix_j = hypre_CSRBooleanMatrix_Get_J(matrix); num_rows = hypre_CSRBooleanMatrix_Get_NRows(matrix); fp = fopen(file_name, "w"); hypre_fprintf(fp, "%d\n", num_rows); for (j = 0; j <= num_rows; j++) { hypre_fprintf(fp, "%d\n", matrix_i[j] + file_base); } for (j = 0; j < matrix_i[num_rows]; j++) { hypre_fprintf(fp, "%d\n", matrix_j[j] + file_base); } fclose(fp); return ierr; } /*-------------------------------------------------------------------------- * hypre_ParCSRBooleanMatrixCreate *--------------------------------------------------------------------------*/ hypre_ParCSRBooleanMatrix *hypre_ParCSRBooleanMatrixCreate( MPI_Comm comm, HYPRE_BigInt global_num_rows, HYPRE_BigInt global_num_cols, HYPRE_BigInt *row_starts, HYPRE_BigInt *col_starts, HYPRE_Int num_cols_offd, HYPRE_Int num_nonzeros_diag, HYPRE_Int num_nonzeros_offd) { hypre_ParCSRBooleanMatrix *matrix; HYPRE_Int num_procs, my_id; HYPRE_Int local_num_rows, local_num_cols; HYPRE_BigInt first_row_index, first_col_diag; matrix = hypre_CTAlloc(hypre_ParCSRBooleanMatrix, 1, HYPRE_MEMORY_HOST); hypre_MPI_Comm_rank(comm, &my_id); hypre_MPI_Comm_size(comm, &num_procs); if (!row_starts) { hypre_GeneratePartitioning(global_num_rows, num_procs, &row_starts); } if (!col_starts) { if (global_num_rows == global_num_cols) { col_starts = row_starts; } else { hypre_GeneratePartitioning(global_num_cols, num_procs, &col_starts); } } first_row_index = row_starts[my_id]; local_num_rows = row_starts[my_id + 1] - first_row_index; first_col_diag = col_starts[my_id]; local_num_cols = col_starts[my_id + 1] - first_col_diag; hypre_ParCSRBooleanMatrix_Get_Comm(matrix) = comm; hypre_ParCSRBooleanMatrix_Get_Diag(matrix) = hypre_CSRBooleanMatrixCreate(local_num_rows, local_num_cols, num_nonzeros_diag); hypre_ParCSRBooleanMatrix_Get_Offd(matrix) = hypre_CSRBooleanMatrixCreate(local_num_rows, num_cols_offd, num_nonzeros_offd); hypre_ParCSRBooleanMatrix_Get_GlobalNRows(matrix) = global_num_rows; hypre_ParCSRBooleanMatrix_Get_GlobalNCols(matrix) = global_num_cols; hypre_ParCSRBooleanMatrix_Get_StartRow(matrix) = first_row_index; hypre_ParCSRBooleanMatrix_Get_FirstColDiag(matrix) = first_col_diag; hypre_ParCSRBooleanMatrix_Get_ColMapOffd(matrix) = NULL; hypre_ParCSRBooleanMatrix_Get_RowStarts(matrix) = row_starts; hypre_ParCSRBooleanMatrix_Get_ColStarts(matrix) = col_starts; hypre_ParCSRBooleanMatrix_Get_CommPkg(matrix) = NULL; hypre_ParCSRBooleanMatrix_Get_OwnsData(matrix) = 1; hypre_ParCSRBooleanMatrix_Get_OwnsRowStarts(matrix) = 1; hypre_ParCSRBooleanMatrix_Get_OwnsColStarts(matrix) = 1; if (row_starts == col_starts) { hypre_ParCSRBooleanMatrix_Get_OwnsColStarts(matrix) = 0; } hypre_ParCSRBooleanMatrix_Get_Rowindices(matrix) = NULL; hypre_ParCSRBooleanMatrix_Get_Getrowactive(matrix) = 0; return matrix; } /*-------------------------------------------------------------------------- * hypre_ParCSRBooleanMatrixDestroy *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ParCSRBooleanMatrixDestroy( hypre_ParCSRBooleanMatrix *matrix ) { HYPRE_Int ierr = 0; if (matrix) { if ( hypre_ParCSRBooleanMatrix_Get_OwnsData(matrix) ) { hypre_CSRBooleanMatrixDestroy(hypre_ParCSRBooleanMatrix_Get_Diag(matrix)); hypre_CSRBooleanMatrixDestroy(hypre_ParCSRBooleanMatrix_Get_Offd(matrix)); if (hypre_ParCSRBooleanMatrix_Get_ColMapOffd(matrix)) { hypre_TFree(hypre_ParCSRBooleanMatrix_Get_ColMapOffd(matrix), HYPRE_MEMORY_HOST); } if (hypre_ParCSRBooleanMatrix_Get_CommPkg(matrix)) { hypre_MatvecCommPkgDestroy(hypre_ParCSRBooleanMatrix_Get_CommPkg(matrix)); } } if ( hypre_ParCSRBooleanMatrix_Get_OwnsRowStarts(matrix) ) { hypre_TFree(hypre_ParCSRBooleanMatrix_Get_RowStarts(matrix), HYPRE_MEMORY_HOST); } if ( hypre_ParCSRBooleanMatrix_Get_OwnsColStarts(matrix) ) { hypre_TFree(hypre_ParCSRBooleanMatrix_Get_ColStarts(matrix), HYPRE_MEMORY_HOST); } hypre_TFree(hypre_ParCSRBooleanMatrix_Get_Rowindices(matrix), HYPRE_MEMORY_HOST); hypre_TFree(matrix, HYPRE_MEMORY_HOST); } return ierr; } /*-------------------------------------------------------------------------- * hypre_ParCSRBooleanMatrixInitialize *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ParCSRBooleanMatrixInitialize( hypre_ParCSRBooleanMatrix *matrix ) { HYPRE_Int ierr = 0; hypre_CSRBooleanMatrixInitialize(hypre_ParCSRBooleanMatrix_Get_Diag(matrix)); hypre_CSRBooleanMatrixInitialize(hypre_ParCSRBooleanMatrix_Get_Offd(matrix)); hypre_ParCSRBooleanMatrix_Get_ColMapOffd(matrix) = hypre_CTAlloc(HYPRE_BigInt, hypre_CSRBooleanMatrix_Get_NCols( hypre_ParCSRBooleanMatrix_Get_Offd(matrix)), HYPRE_MEMORY_HOST); return ierr; } /*-------------------------------------------------------------------------- * hypre_ParCSRBooleanMatrixSetNNZ *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ParCSRBooleanMatrixSetNNZ( hypre_ParCSRBooleanMatrix *matrix) { MPI_Comm comm = hypre_ParCSRBooleanMatrix_Get_Comm(matrix); hypre_CSRBooleanMatrix *diag = hypre_ParCSRBooleanMatrix_Get_Diag(matrix); HYPRE_Int *diag_i = hypre_CSRBooleanMatrix_Get_I(diag); hypre_CSRBooleanMatrix *offd = hypre_ParCSRBooleanMatrix_Get_Offd(matrix); HYPRE_Int *offd_i = hypre_CSRBooleanMatrix_Get_I(offd); HYPRE_Int local_num_rows = hypre_CSRBooleanMatrix_Get_NRows(diag); HYPRE_Int total_num_nonzeros; HYPRE_Int local_num_nonzeros; HYPRE_Int ierr = 0; local_num_nonzeros = diag_i[local_num_rows] + offd_i[local_num_rows]; hypre_MPI_Allreduce(&local_num_nonzeros, &total_num_nonzeros, 1, HYPRE_MPI_INT, hypre_MPI_SUM, comm); hypre_ParCSRBooleanMatrix_Get_NNZ(matrix) = total_num_nonzeros; return ierr; } /*-------------------------------------------------------------------------- * hypre_ParCSRBooleanMatrixSetDataOwner *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ParCSRBooleanMatrixSetDataOwner(hypre_ParCSRBooleanMatrix *matrix, HYPRE_Int owns_data ) { hypre_ParCSRBooleanMatrix_Get_OwnsData(matrix) = owns_data; return 0; } /*-------------------------------------------------------------------------- * hypre_ParCSRBooleanMatrixSetRowStartsOwner *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ParCSRBooleanMatrixSetRowStartsOwner(hypre_ParCSRBooleanMatrix *matrix, HYPRE_Int owns_row_starts ) { hypre_ParCSRBooleanMatrix_Get_OwnsRowStarts(matrix) = owns_row_starts; return 0; } /*-------------------------------------------------------------------------- * hypre_ParCSRBooleanMatrixSetColStartsOwner *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ParCSRBooleanMatrixSetColStartsOwner(hypre_ParCSRBooleanMatrix *matrix, HYPRE_Int owns_col_starts ) { hypre_ParCSRBooleanMatrix_Get_OwnsColStarts(matrix) = owns_col_starts; return 0; } /*-------------------------------------------------------------------------- * hypre_ParCSRBooleanMatrixRead *--------------------------------------------------------------------------*/ hypre_ParCSRBooleanMatrix * hypre_ParCSRBooleanMatrixRead( MPI_Comm comm, const char *file_name ) { hypre_ParCSRBooleanMatrix *matrix; hypre_CSRBooleanMatrix *diag; hypre_CSRBooleanMatrix *offd; HYPRE_Int my_id, i, num_procs; char new_file_d[80], new_file_o[80], new_file_info[80]; HYPRE_BigInt global_num_rows, global_num_cols; HYPRE_Int num_cols_offd; HYPRE_Int local_num_rows; HYPRE_BigInt *row_starts; HYPRE_BigInt *col_starts; HYPRE_BigInt *col_map_offd; FILE *fp; HYPRE_Int equal = 1; hypre_MPI_Comm_rank(comm, &my_id); hypre_MPI_Comm_size(comm, &num_procs); row_starts = hypre_CTAlloc(HYPRE_BigInt, num_procs + 1, HYPRE_MEMORY_HOST); col_starts = hypre_CTAlloc(HYPRE_BigInt, num_procs + 1, HYPRE_MEMORY_HOST); hypre_sprintf(new_file_d, "%s.D.%d", file_name, my_id); hypre_sprintf(new_file_o, "%s.O.%d", file_name, my_id); hypre_sprintf(new_file_info, "%s.INFO.%d", file_name, my_id); fp = fopen(new_file_info, "r"); hypre_fscanf(fp, "%b", &global_num_rows); hypre_fscanf(fp, "%b", &global_num_cols); hypre_fscanf(fp, "%d", &num_cols_offd); for (i = 0; i < num_procs; i++) { hypre_fscanf(fp, "%b %b", &row_starts[i], &col_starts[i]); } row_starts[num_procs] = global_num_rows; col_starts[num_procs] = global_num_cols; col_map_offd = hypre_CTAlloc(HYPRE_BigInt, num_cols_offd, HYPRE_MEMORY_HOST); for (i = 0; i < num_cols_offd; i++) { hypre_fscanf(fp, "%b", &col_map_offd[i]); } fclose(fp); for (i = num_procs; i >= 0; i--) if (row_starts[i] != col_starts[i]) { equal = 0; break; } if (equal) { hypre_TFree(col_starts, HYPRE_MEMORY_HOST); col_starts = row_starts; } diag = hypre_CSRBooleanMatrixRead(new_file_d); local_num_rows = hypre_CSRBooleanMatrix_Get_NRows(diag); if (num_cols_offd) { offd = hypre_CSRBooleanMatrixRead(new_file_o); } else { offd = hypre_CSRBooleanMatrixCreate(local_num_rows, 0, 0); } matrix = hypre_CTAlloc(hypre_ParCSRBooleanMatrix, 1, HYPRE_MEMORY_HOST); hypre_ParCSRBooleanMatrix_Get_Comm(matrix) = comm; hypre_ParCSRBooleanMatrix_Get_GlobalNRows(matrix) = global_num_rows; hypre_ParCSRBooleanMatrix_Get_GlobalNCols(matrix) = global_num_cols; hypre_ParCSRBooleanMatrix_Get_StartRow(matrix) = row_starts[my_id]; hypre_ParCSRBooleanMatrix_Get_FirstColDiag(matrix) = col_starts[my_id]; hypre_ParCSRBooleanMatrix_Get_RowStarts(matrix) = row_starts; hypre_ParCSRBooleanMatrix_Get_ColStarts(matrix) = col_starts; hypre_ParCSRBooleanMatrix_Get_CommPkg(matrix) = NULL; /* set defaults */ hypre_ParCSRBooleanMatrix_Get_OwnsData(matrix) = 1; hypre_ParCSRBooleanMatrix_Get_OwnsRowStarts(matrix) = 1; hypre_ParCSRBooleanMatrix_Get_OwnsColStarts(matrix) = 1; if (row_starts == col_starts) { hypre_ParCSRBooleanMatrix_Get_OwnsColStarts(matrix) = 0; } hypre_ParCSRBooleanMatrix_Get_Diag(matrix) = diag; hypre_ParCSRBooleanMatrix_Get_Offd(matrix) = offd; if (num_cols_offd) { hypre_ParCSRBooleanMatrix_Get_ColMapOffd(matrix) = col_map_offd; } else { hypre_ParCSRBooleanMatrix_Get_ColMapOffd(matrix) = NULL; } return matrix; } /*-------------------------------------------------------------------------- * hypre_ParCSRBooleanMatrixPrint *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ParCSRBooleanMatrixPrint( hypre_ParCSRBooleanMatrix *matrix, const char *file_name ) { MPI_Comm comm = hypre_ParCSRBooleanMatrix_Get_Comm(matrix); HYPRE_BigInt global_num_rows = hypre_ParCSRBooleanMatrix_Get_GlobalNRows(matrix); HYPRE_BigInt global_num_cols = hypre_ParCSRBooleanMatrix_Get_GlobalNCols(matrix); HYPRE_BigInt *col_map_offd = hypre_ParCSRBooleanMatrix_Get_ColMapOffd(matrix); HYPRE_BigInt *row_starts = hypre_ParCSRBooleanMatrix_Get_RowStarts(matrix); HYPRE_BigInt *col_starts = hypre_ParCSRBooleanMatrix_Get_ColStarts(matrix); HYPRE_Int my_id, i, num_procs; char new_file_d[80], new_file_o[80], new_file_info[80]; HYPRE_Int ierr = 0; FILE *fp; HYPRE_Int num_cols_offd = 0; if (hypre_ParCSRBooleanMatrix_Get_Offd(matrix)) num_cols_offd = hypre_CSRBooleanMatrix_Get_NCols(hypre_ParCSRBooleanMatrix_Get_Offd(matrix)); hypre_MPI_Comm_rank(comm, &my_id); hypre_MPI_Comm_size(comm, &num_procs); hypre_sprintf(new_file_d, "%s.D.%d", file_name, my_id); hypre_sprintf(new_file_o, "%s.O.%d", file_name, my_id); hypre_sprintf(new_file_info, "%s.INFO.%d", file_name, my_id); hypre_CSRBooleanMatrixPrint(hypre_ParCSRBooleanMatrix_Get_Diag(matrix), new_file_d); if (num_cols_offd != 0) hypre_CSRBooleanMatrixPrint(hypre_ParCSRBooleanMatrix_Get_Offd(matrix), new_file_o); fp = fopen(new_file_info, "w"); hypre_fprintf(fp, "%b\n", global_num_rows); hypre_fprintf(fp, "%b\n", global_num_cols); hypre_fprintf(fp, "%d\n", num_cols_offd); for (i = 0; i < num_procs; i++) { hypre_fprintf(fp, "%b %b\n", row_starts[i], col_starts[i]); } for (i = 0; i < num_cols_offd; i++) { hypre_fprintf(fp, "%b\n", col_map_offd[i]); } fclose(fp); return ierr; } /*-------------------------------------------------------------------------- * hypre_ParCSRBooleanMatrixPrintIJ *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ParCSRBooleanMatrixPrintIJ( hypre_ParCSRBooleanMatrix *matrix, const char *filename ) { MPI_Comm comm = hypre_ParCSRBooleanMatrix_Get_Comm(matrix); HYPRE_BigInt global_num_rows = hypre_ParCSRBooleanMatrix_Get_GlobalNRows(matrix); HYPRE_BigInt global_num_cols = hypre_ParCSRBooleanMatrix_Get_GlobalNCols(matrix); HYPRE_BigInt first_row_index = hypre_ParCSRBooleanMatrix_Get_StartRow(matrix); HYPRE_BigInt first_col_diag = hypre_ParCSRBooleanMatrix_Get_FirstColDiag(matrix); HYPRE_BigInt *col_map_offd = hypre_ParCSRBooleanMatrix_Get_ColMapOffd(matrix); HYPRE_Int num_rows = hypre_ParCSRBooleanMatrix_Get_NRows(matrix); HYPRE_Int *diag_i; HYPRE_Int *diag_j; HYPRE_Int *offd_i = NULL; HYPRE_Int *offd_j = NULL; HYPRE_Int myid, i, j; HYPRE_BigInt I, J; HYPRE_Int ierr = 0; char new_filename[255]; FILE *file; hypre_CSRBooleanMatrix *diag = hypre_ParCSRBooleanMatrix_Get_Diag(matrix); hypre_CSRBooleanMatrix *offd = hypre_ParCSRBooleanMatrix_Get_Offd(matrix); HYPRE_Int num_cols_offd = 0; if (offd) num_cols_offd = hypre_CSRBooleanMatrix_Get_NCols(hypre_ParCSRBooleanMatrix_Get_Offd(matrix)); hypre_MPI_Comm_rank(comm, &myid); hypre_sprintf(new_filename, "%s.%05d", filename, myid); if ((file = fopen(new_filename, "w")) == NULL) { hypre_printf("Error: can't open output file %s\n", new_filename); exit(1); } hypre_fprintf(file, "%b, %b\n", global_num_rows, global_num_cols); hypre_fprintf(file, "%d\n", num_rows); diag_i = hypre_CSRBooleanMatrix_Get_I(diag); diag_j = hypre_CSRBooleanMatrix_Get_J(diag); if (num_cols_offd) { offd_i = hypre_CSRBooleanMatrix_Get_I(offd); offd_j = hypre_CSRBooleanMatrix_Get_J(offd); } for (i = 0; i < num_rows; i++) { I = first_row_index + i; /* print diag columns */ for (j = diag_i[i]; j < diag_i[i + 1]; j++) { J = first_col_diag + diag_j[j]; hypre_fprintf(file, "%b, %b\n", I, J ); } /* print offd columns */ if (num_cols_offd) { for (j = offd_i[i]; j < offd_i[i + 1]; j++) { J = col_map_offd[offd_j[j]]; hypre_fprintf(file, "%b, %b \n", I, J); } } } fclose(file); return ierr; } /*-------------------------------------------------------------------------- * hypre_ParCSRBooleanMatrixGetLocalRange * returns the row numbers of the rows stored on this processor. * "End" is actually the row number of the last row on this processor. *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ParCSRBooleanMatrixGetLocalRange(hypre_ParCSRBooleanMatrix *matrix, HYPRE_BigInt *row_start, HYPRE_BigInt *row_end, HYPRE_BigInt *col_start, HYPRE_BigInt *col_end ) { HYPRE_Int ierr = 0; HYPRE_Int my_id; hypre_MPI_Comm_rank( hypre_ParCSRBooleanMatrix_Get_Comm(matrix), &my_id ); *row_start = hypre_ParCSRBooleanMatrix_Get_RowStarts(matrix)[ my_id ]; *row_end = hypre_ParCSRBooleanMatrix_Get_RowStarts(matrix)[ my_id + 1 ] - 1; *col_start = hypre_ParCSRBooleanMatrix_Get_ColStarts(matrix)[ my_id ]; *col_end = hypre_ParCSRBooleanMatrix_Get_ColStarts(matrix)[ my_id + 1 ] - 1; return ( ierr ); } /*-------------------------------------------------------------------------- * hypre_ParCSRBooleanMatrixGetRow * Returns global column indices for a given row in the global matrix. * Global row number is used, but the row must be stored locally or * an error is returned. This implementation copies from the two matrices that * store the local data, storing them in the hypre_ParCSRBooleanMatrix structure. * Only a single row can be accessed via this function at any one time; the * corresponding RestoreRow function must be called, to avoid bleeding memory, * and to be able to look at another row. All indices are returned in 0-based * indexing, no matter what is used under the hood. * EXCEPTION: currently this only works if the local CSR matrices * use 0-based indexing. * This code, semantics, implementation, etc., are all based on PETSc's hypre_MPI_AIJ * matrix code, adjusted for our data and software structures. * AJC 4/99. *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ParCSRBooleanMatrixGetRow(hypre_ParCSRBooleanMatrix *mat, HYPRE_BigInt row, HYPRE_Int *size, HYPRE_BigInt **col_ind) { HYPRE_Int i, m, ierr = 0, max = 1, tmp, my_id; HYPRE_BigInt row_start, row_end, cstart; HYPRE_Int *cworkA, *cworkB; HYPRE_Int nztot, nzA, nzB, lrow; HYPRE_BigInt *cmap, *idx_p; hypre_CSRBooleanMatrix *Aa, *Ba; Aa = (hypre_CSRBooleanMatrix *) hypre_ParCSRBooleanMatrix_Get_Diag(mat); Ba = (hypre_CSRBooleanMatrix *) hypre_ParCSRBooleanMatrix_Get_Offd(mat); if (hypre_ParCSRBooleanMatrix_Get_Getrowactive(mat)) { return (-1); } hypre_MPI_Comm_rank( hypre_ParCSRBooleanMatrix_Get_Comm(mat), &my_id ); hypre_ParCSRBooleanMatrix_Get_Getrowactive(mat) = 1; row_end = hypre_ParCSRBooleanMatrix_Get_RowStarts(mat)[ my_id + 1 ]; row_start = hypre_ParCSRBooleanMatrix_Get_RowStarts(mat)[ my_id ]; lrow = (HYPRE_Int)(row - row_start); if (row < row_start || row >= row_end) { return (-1); } if ( col_ind ) { m = (HYPRE_Int)(row_end - row_start); for ( i = 0; i < m; i++ ) { tmp = hypre_CSRBooleanMatrix_Get_I(Aa)[i + 1] - hypre_CSRBooleanMatrix_Get_I(Aa)[i] + hypre_CSRBooleanMatrix_Get_I(Ba)[i + 1] - hypre_CSRBooleanMatrix_Get_I(Ba)[i]; if (max < tmp) { max = tmp; } } hypre_ParCSRBooleanMatrix_Get_Rowindices(mat) = (HYPRE_BigInt *) hypre_CTAlloc(HYPRE_BigInt, max, HYPRE_MEMORY_HOST); } cstart = hypre_ParCSRBooleanMatrix_Get_FirstColDiag(mat); nzA = hypre_CSRBooleanMatrix_Get_I(Aa)[lrow + 1] - hypre_CSRBooleanMatrix_Get_I(Aa)[lrow]; cworkA = &(hypre_CSRBooleanMatrix_Get_J(Aa)[hypre_CSRBooleanMatrix_Get_I(Aa)[lrow]]); nzB = hypre_CSRBooleanMatrix_Get_I(Ba)[lrow + 1] - hypre_CSRBooleanMatrix_Get_I(Ba)[lrow]; cworkB = &(hypre_CSRBooleanMatrix_Get_J(Ba)[hypre_CSRBooleanMatrix_Get_I(Ba)[lrow]]); nztot = nzA + nzB; cmap = hypre_ParCSRBooleanMatrix_Get_ColMapOffd(mat); if (col_ind) { if (nztot) { HYPRE_Int imark = -1; if (col_ind) { *col_ind = idx_p = hypre_ParCSRBooleanMatrix_Get_Rowindices(mat); if (imark > -1) { for ( i = 0; i < imark; i++ ) { idx_p[i] = cmap[cworkB[i]]; } } else { for ( i = 0; i < nzB; i++ ) { if (cmap[cworkB[i]] < cstart) { idx_p[i] = cmap[cworkB[i]]; } else { break; } } imark = i; } for ( i = 0; i < nzA; i++ ) { idx_p[imark + i] = cstart + (HYPRE_BigInt)cworkA[i]; } for ( i = imark; i < nzB; i++ ) { idx_p[nzA + i] = cmap[cworkB[i]]; } } } else { if (col_ind) { *col_ind = 0; } } } *size = nztot; return ( ierr ); } /*-------------------------------------------------------------------------- * hypre_ParCSRBooleanMatrixRestoreRow *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ParCSRBooleanMatrixRestoreRow( hypre_ParCSRBooleanMatrix *matrix, HYPRE_BigInt row, HYPRE_Int *size, HYPRE_BigInt **col_ind ) { HYPRE_UNUSED_VAR(row); HYPRE_UNUSED_VAR(size); HYPRE_UNUSED_VAR(col_ind); if (!hypre_ParCSRBooleanMatrix_Get_Getrowactive(matrix)) { return ( -1 ); } hypre_ParCSRBooleanMatrix_Get_Getrowactive(matrix) = 0; return ( 0 ); } /*-------------------------------------------------------------------------- * hypre_BuildCSRBooleanMatrixMPIDataType *--------------------------------------------------------------------------*/ HYPRE_Int hypre_BuildCSRBooleanMatrixMPIDataType( HYPRE_Int num_nonzeros, HYPRE_Int num_rows, HYPRE_Int *a_i, HYPRE_Int *a_j, hypre_MPI_Datatype *csr_matrix_datatype ) { HYPRE_Int block_lens[2]; hypre_MPI_Aint displ[2]; hypre_MPI_Datatype types[2]; HYPRE_Int ierr = 0; block_lens[0] = num_rows + 1; block_lens[1] = num_nonzeros; types[0] = HYPRE_MPI_INT; types[1] = HYPRE_MPI_INT; hypre_MPI_Address(a_i, &displ[0]); hypre_MPI_Address(a_j, &displ[1]); hypre_MPI_Type_struct(2, block_lens, displ, types, csr_matrix_datatype); hypre_MPI_Type_commit(csr_matrix_datatype); return ierr; } /*-------------------------------------------------------------------------- * hypre_CSRBooleanMatrixToParCSRBooleanMatrix: * generates a ParCSRBooleanMatrix distributed across the processors in comm * from a CSRBooleanMatrix on proc 0 . *--------------------------------------------------------------------------*/ hypre_ParCSRBooleanMatrix * hypre_CSRBooleanMatrixToParCSRBooleanMatrix( MPI_Comm comm, hypre_CSRBooleanMatrix *A, HYPRE_BigInt *row_starts, HYPRE_BigInt *col_starts ) { HYPRE_BigInt global_data[2]; HYPRE_BigInt global_num_rows; HYPRE_BigInt global_num_cols; HYPRE_Int *local_num_rows; HYPRE_Int num_procs, my_id; HYPRE_Int *local_num_nonzeros = NULL; HYPRE_Int num_nonzeros; HYPRE_Int *a_i = NULL; HYPRE_Int *a_j = NULL; hypre_CSRBooleanMatrix *local_A; hypre_MPI_Request *requests; hypre_MPI_Status *status, status0; hypre_MPI_Datatype *csr_matrix_datatypes; hypre_ParCSRBooleanMatrix *par_matrix; HYPRE_BigInt first_col_diag; HYPRE_BigInt last_col_diag; HYPRE_Int i, j, ind; hypre_MPI_Comm_rank(comm, &my_id); hypre_MPI_Comm_size(comm, &num_procs); if (my_id == 0) { global_data[0] = (HYPRE_BigInt)hypre_CSRBooleanMatrix_Get_NRows(A); global_data[1] = (HYPRE_BigInt)hypre_CSRBooleanMatrix_Get_NCols(A); a_i = hypre_CSRBooleanMatrix_Get_I(A); a_j = hypre_CSRBooleanMatrix_Get_J(A); } hypre_MPI_Bcast(global_data, 2, HYPRE_MPI_BIG_INT, 0, comm); global_num_rows = global_data[0]; global_num_cols = global_data[1]; local_num_rows = hypre_CTAlloc(HYPRE_Int, num_procs, HYPRE_MEMORY_HOST); csr_matrix_datatypes = hypre_CTAlloc(hypre_MPI_Datatype, num_procs, HYPRE_MEMORY_HOST); par_matrix = hypre_ParCSRBooleanMatrixCreate (comm, global_num_rows, global_num_cols, row_starts, col_starts, 0, 0, 0); row_starts = hypre_ParCSRBooleanMatrix_Get_RowStarts(par_matrix); col_starts = hypre_ParCSRBooleanMatrix_Get_ColStarts(par_matrix); for (i = 0; i < num_procs; i++) { local_num_rows[i] = (HYPRE_Int)(row_starts[i + 1] - row_starts[i]); } if (my_id == 0) { local_num_nonzeros = hypre_CTAlloc(HYPRE_Int, num_procs, HYPRE_MEMORY_HOST); for (i = 0; i < num_procs - 1; i++) local_num_nonzeros[i] = a_i[(HYPRE_Int)row_starts[i + 1]] - a_i[(HYPRE_Int)row_starts[i]]; local_num_nonzeros[num_procs - 1] = a_i[(HYPRE_Int)global_num_rows] - a_i[(HYPRE_Int)row_starts[num_procs - 1]]; } hypre_MPI_Scatter(local_num_nonzeros, 1, HYPRE_MPI_INT, &num_nonzeros, 1, HYPRE_MPI_INT, 0, comm); if (my_id == 0) { num_nonzeros = local_num_nonzeros[0]; } local_A = hypre_CSRBooleanMatrixCreate(local_num_rows[my_id], (HYPRE_Int)global_num_cols, num_nonzeros); if (my_id == 0) { requests = hypre_CTAlloc(hypre_MPI_Request, num_procs - 1, HYPRE_MEMORY_HOST); status = hypre_CTAlloc(hypre_MPI_Status, num_procs - 1, HYPRE_MEMORY_HOST); j = 0; for (i = 1; i < num_procs; i++) { ind = a_i[(HYPRE_Int)row_starts[i]]; hypre_BuildCSRBooleanMatrixMPIDataType(local_num_nonzeros[i], local_num_rows[i], &a_i[(HYPRE_Int)row_starts[i]], &a_j[ind], &csr_matrix_datatypes[i]); hypre_MPI_Isend(hypre_MPI_BOTTOM, 1, csr_matrix_datatypes[i], i, 0, comm, &requests[j++]); hypre_MPI_Type_free(&csr_matrix_datatypes[i]); } hypre_CSRBooleanMatrix_Get_I(local_A) = a_i; hypre_CSRBooleanMatrix_Get_J(local_A) = a_j; hypre_MPI_Waitall(num_procs - 1, requests, status); hypre_TFree(requests, HYPRE_MEMORY_HOST); hypre_TFree(status, HYPRE_MEMORY_HOST); hypre_TFree(local_num_nonzeros, HYPRE_MEMORY_HOST); } else { hypre_CSRBooleanMatrixInitialize(local_A); hypre_BuildCSRBooleanMatrixMPIDataType(num_nonzeros, local_num_rows[my_id], hypre_CSRBooleanMatrix_Get_I(local_A), hypre_CSRBooleanMatrix_Get_J(local_A), csr_matrix_datatypes); hypre_MPI_Recv(hypre_MPI_BOTTOM, 1, csr_matrix_datatypes[0], 0, 0, comm, &status0); hypre_MPI_Type_free(csr_matrix_datatypes); } first_col_diag = col_starts[my_id]; last_col_diag = col_starts[my_id + 1] - 1; hypre_BooleanGenerateDiagAndOffd(local_A, par_matrix, first_col_diag, last_col_diag); /* set pointers back to NULL before destroying */ if (my_id == 0) { hypre_CSRBooleanMatrix_Get_I(local_A) = NULL; hypre_CSRBooleanMatrix_Get_J(local_A) = NULL; } hypre_CSRBooleanMatrixDestroy(local_A); hypre_TFree(local_num_rows, HYPRE_MEMORY_HOST); hypre_TFree(csr_matrix_datatypes, HYPRE_MEMORY_HOST); return par_matrix; } HYPRE_Int hypre_BooleanGenerateDiagAndOffd(hypre_CSRBooleanMatrix *A, hypre_ParCSRBooleanMatrix *matrix, HYPRE_BigInt first_col_diag, HYPRE_BigInt last_col_diag) { HYPRE_Int i, j; HYPRE_Int jo, jd; HYPRE_Int ierr = 0; HYPRE_Int num_rows = hypre_CSRBooleanMatrix_Get_NRows(A); HYPRE_Int num_cols = hypre_CSRBooleanMatrix_Get_NCols(A); HYPRE_Int *a_i = hypre_CSRBooleanMatrix_Get_I(A); HYPRE_Int *a_j = hypre_CSRBooleanMatrix_Get_J(A); hypre_CSRBooleanMatrix *diag = hypre_ParCSRBooleanMatrix_Get_Diag(matrix); hypre_CSRBooleanMatrix *offd = hypre_ParCSRBooleanMatrix_Get_Offd(matrix); HYPRE_BigInt *col_map_offd; HYPRE_Int *diag_i, *offd_i; HYPRE_Int *diag_j, *offd_j = NULL; HYPRE_Int *marker; HYPRE_Int num_cols_diag, num_cols_offd; HYPRE_Int first_elmt = a_i[0]; HYPRE_Int num_nonzeros = a_i[num_rows] - first_elmt; HYPRE_Int counter; num_cols_diag = (HYPRE_Int)(last_col_diag - first_col_diag + 1); num_cols_offd = 0; if (num_cols - num_cols_diag) { hypre_CSRBooleanMatrixInitialize(diag); diag_i = hypre_CSRBooleanMatrix_Get_I(diag); hypre_CSRBooleanMatrixInitialize(offd); offd_i = hypre_CSRBooleanMatrix_Get_I(offd); marker = hypre_CTAlloc(HYPRE_Int, num_cols, HYPRE_MEMORY_HOST); for (i = 0; i < num_cols; i++) { marker[i] = 0; } jo = 0; jd = 0; for (i = 0; i < num_rows; i++) { offd_i[i] = jo; diag_i[i] = jd; for (j = a_i[i] - first_elmt; j < a_i[i + 1] - first_elmt; j++) if (a_j[j] < (HYPRE_Int)first_col_diag || a_j[j] > (HYPRE_Int)last_col_diag) { if (!marker[a_j[j]]) { marker[a_j[j]] = 1; num_cols_offd++; } jo++; } else { jd++; } } offd_i[num_rows] = jo; diag_i[num_rows] = jd; hypre_ParCSRBooleanMatrix_Get_ColMapOffd(matrix) = hypre_CTAlloc(HYPRE_BigInt, num_cols_offd, HYPRE_MEMORY_HOST); col_map_offd = hypre_ParCSRBooleanMatrix_Get_ColMapOffd(matrix); counter = 0; for (i = 0; i < num_cols; i++) if (marker[i]) { col_map_offd[counter] = (HYPRE_BigInt)i; marker[i] = counter; counter++; } hypre_CSRBooleanMatrix_Get_NNZ(diag) = jd; hypre_CSRBooleanMatrixInitialize(diag); diag_j = hypre_CSRBooleanMatrix_Get_J(diag); hypre_CSRBooleanMatrix_Get_NNZ(offd) = jo; hypre_CSRBooleanMatrix_Get_NCols(offd) = num_cols_offd; hypre_CSRBooleanMatrixInitialize(offd); offd_j = hypre_CSRBooleanMatrix_Get_J(offd); jo = 0; jd = 0; for (i = 0; i < num_rows; i++) { for (j = a_i[i] - first_elmt; j < a_i[i + 1] - first_elmt; j++) if (a_j[j] < first_col_diag || a_j[j] > last_col_diag) { offd_j[jo++] = marker[a_j[j]]; } else { diag_j[jd++] = a_j[j] - (HYPRE_Int)first_col_diag; } } hypre_TFree(marker, HYPRE_MEMORY_HOST); } else { hypre_CSRBooleanMatrix_Get_NNZ(diag) = num_nonzeros; hypre_CSRBooleanMatrixInitialize(diag); diag_i = hypre_CSRBooleanMatrix_Get_I(diag); diag_j = hypre_CSRBooleanMatrix_Get_J(diag); for (i = 0; i < num_nonzeros; i++) { diag_j[i] = a_j[i]; } offd_i = hypre_CTAlloc(HYPRE_Int, num_rows + 1, HYPRE_MEMORY_HOST); for (i = 0; i < num_rows + 1; i++) { diag_i[i] = a_i[i]; offd_i[i] = 0; } hypre_CSRBooleanMatrix_Get_NCols(offd) = 0; hypre_CSRBooleanMatrix_Get_I(offd) = offd_i; } return ierr; } hypre-2.33.0/src/parcsr_mv/par_csr_communication.c000066400000000000000000001535371477326011500222570ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "_hypre_parcsr_mv.h" /*==========================================================================*/ #ifdef HYPRE_USING_PERSISTENT_COMM static CommPkgJobType getJobTypeOf(HYPRE_Int job) { CommPkgJobType job_type = HYPRE_COMM_PKG_JOB_COMPLEX; switch (job) { case 1: job_type = HYPRE_COMM_PKG_JOB_COMPLEX; break; case 2: job_type = HYPRE_COMM_PKG_JOB_COMPLEX_TRANSPOSE; break; case 11: job_type = HYPRE_COMM_PKG_JOB_INT; break; case 12: job_type = HYPRE_COMM_PKG_JOB_INT_TRANSPOSE; break; case 21: job_type = HYPRE_COMM_PKG_JOB_BIGINT; break; case 22: job_type = HYPRE_COMM_PKG_JOB_BIGINT_TRANSPOSE; break; } // switch (job) return job_type; } /*------------------------------------------------------------------ * hypre_ParCSRPersistentCommHandleCreate * * When send_data and recv_data are NULL, buffers are internally * allocated and CommHandle owns the buffer *------------------------------------------------------------------*/ hypre_ParCSRPersistentCommHandle* hypre_ParCSRPersistentCommHandleCreate( HYPRE_Int job, hypre_ParCSRCommPkg *comm_pkg ) { HYPRE_Int i; size_t num_bytes_send, num_bytes_recv; hypre_ParCSRPersistentCommHandle *comm_handle = hypre_CTAlloc(hypre_ParCSRPersistentCommHandle, 1, HYPRE_MEMORY_HOST); CommPkgJobType job_type = getJobTypeOf(job); HYPRE_Int num_sends = hypre_ParCSRCommPkgNumSends(comm_pkg); HYPRE_Int num_recvs = hypre_ParCSRCommPkgNumRecvs(comm_pkg); MPI_Comm comm = hypre_ParCSRCommPkgComm(comm_pkg); HYPRE_Int num_requests = num_sends + num_recvs; hypre_MPI_Request *requests = hypre_CTAlloc(hypre_MPI_Request, num_requests, HYPRE_MEMORY_HOST); hypre_ParCSRCommHandleNumRequests(comm_handle) = num_requests; hypre_ParCSRCommHandleRequests(comm_handle) = requests; void *send_buff = NULL, *recv_buff = NULL; switch (job_type) { case HYPRE_COMM_PKG_JOB_COMPLEX: num_bytes_send = sizeof(HYPRE_Complex) * hypre_ParCSRCommPkgSendMapStart(comm_pkg, num_sends); num_bytes_recv = sizeof(HYPRE_Complex) * hypre_ParCSRCommPkgRecvVecStart(comm_pkg, num_recvs); send_buff = hypre_TAlloc(HYPRE_Complex, hypre_ParCSRCommPkgSendMapStart(comm_pkg, num_sends), HYPRE_MEMORY_HOST); recv_buff = hypre_TAlloc(HYPRE_Complex, hypre_ParCSRCommPkgRecvVecStart(comm_pkg, num_recvs), HYPRE_MEMORY_HOST); for (i = 0; i < num_recvs; ++i) { HYPRE_Int ip = hypre_ParCSRCommPkgRecvProc(comm_pkg, i); HYPRE_Int vec_start = hypre_ParCSRCommPkgRecvVecStart(comm_pkg, i); HYPRE_Int vec_len = hypre_ParCSRCommPkgRecvVecStart(comm_pkg, i + 1) - vec_start; hypre_MPI_Recv_init( (HYPRE_Complex *)recv_buff + vec_start, vec_len, HYPRE_MPI_COMPLEX, ip, 0, comm, requests + i ); } for (i = 0; i < num_sends; ++i) { HYPRE_Int ip = hypre_ParCSRCommPkgSendProc(comm_pkg, i); HYPRE_Int vec_start = hypre_ParCSRCommPkgSendMapStart(comm_pkg, i); HYPRE_Int vec_len = hypre_ParCSRCommPkgSendMapStart(comm_pkg, i + 1) - vec_start; hypre_MPI_Send_init( (HYPRE_Complex *)send_buff + vec_start, vec_len, HYPRE_MPI_COMPLEX, ip, 0, comm, requests + num_recvs + i ); } break; case HYPRE_COMM_PKG_JOB_COMPLEX_TRANSPOSE: num_bytes_recv = sizeof(HYPRE_Complex) * hypre_ParCSRCommPkgSendMapStart(comm_pkg, num_sends); num_bytes_send = sizeof(HYPRE_Complex) * hypre_ParCSRCommPkgRecvVecStart(comm_pkg, num_recvs); recv_buff = hypre_TAlloc(HYPRE_Complex, hypre_ParCSRCommPkgSendMapStart(comm_pkg, num_sends), HYPRE_MEMORY_HOST); send_buff = hypre_TAlloc(HYPRE_Complex, hypre_ParCSRCommPkgRecvVecStart(comm_pkg, num_recvs), HYPRE_MEMORY_HOST); for (i = 0; i < num_sends; ++i) { HYPRE_Int ip = hypre_ParCSRCommPkgSendProc(comm_pkg, i); HYPRE_Int vec_start = hypre_ParCSRCommPkgSendMapStart(comm_pkg, i); HYPRE_Int vec_len = hypre_ParCSRCommPkgSendMapStart(comm_pkg, i + 1) - vec_start; hypre_MPI_Recv_init( (HYPRE_Complex *)recv_buff + vec_start, vec_len, HYPRE_MPI_COMPLEX, ip, 0, comm, requests + i ); } for (i = 0; i < num_recvs; ++i) { HYPRE_Int ip = hypre_ParCSRCommPkgRecvProc(comm_pkg, i); HYPRE_Int vec_start = hypre_ParCSRCommPkgRecvVecStart(comm_pkg, i); HYPRE_Int vec_len = hypre_ParCSRCommPkgRecvVecStart(comm_pkg, i + 1) - vec_start; hypre_MPI_Send_init( (HYPRE_Complex *)send_buff + vec_start, vec_len, HYPRE_MPI_COMPLEX, ip, 0, comm, requests + num_sends + i ); } break; case HYPRE_COMM_PKG_JOB_INT: num_bytes_send = sizeof(HYPRE_Int) * hypre_ParCSRCommPkgSendMapStart(comm_pkg, num_sends); num_bytes_recv = sizeof(HYPRE_Int) * hypre_ParCSRCommPkgRecvVecStart(comm_pkg, num_recvs); send_buff = hypre_TAlloc(HYPRE_Int, hypre_ParCSRCommPkgSendMapStart(comm_pkg, num_sends), HYPRE_MEMORY_HOST); recv_buff = hypre_TAlloc(HYPRE_Int, hypre_ParCSRCommPkgRecvVecStart(comm_pkg, num_recvs), HYPRE_MEMORY_HOST); for (i = 0; i < num_recvs; ++i) { HYPRE_Int ip = hypre_ParCSRCommPkgRecvProc(comm_pkg, i); HYPRE_Int vec_start = hypre_ParCSRCommPkgRecvVecStart(comm_pkg, i); HYPRE_Int vec_len = hypre_ParCSRCommPkgRecvVecStart(comm_pkg, i + 1) - vec_start; hypre_MPI_Recv_init( (HYPRE_Int *)recv_buff + vec_start, vec_len, HYPRE_MPI_INT, ip, 0, comm, requests + i ); } for (i = 0; i < num_sends; ++i) { HYPRE_Int ip = hypre_ParCSRCommPkgSendProc(comm_pkg, i); HYPRE_Int vec_start = hypre_ParCSRCommPkgSendMapStart(comm_pkg, i); HYPRE_Int vec_len = hypre_ParCSRCommPkgSendMapStart(comm_pkg, i + 1) - vec_start; hypre_MPI_Send_init( (HYPRE_Int *)send_buff + vec_start, vec_len, HYPRE_MPI_INT, ip, 0, comm, requests + num_recvs + i ); } break; case HYPRE_COMM_PKG_JOB_INT_TRANSPOSE: num_bytes_recv = sizeof(HYPRE_Int) * hypre_ParCSRCommPkgSendMapStart(comm_pkg, num_sends); num_bytes_send = sizeof(HYPRE_Int) * hypre_ParCSRCommPkgRecvVecStart(comm_pkg, num_recvs); recv_buff = hypre_TAlloc(HYPRE_Int, hypre_ParCSRCommPkgSendMapStart(comm_pkg, num_sends), HYPRE_MEMORY_HOST); send_buff = hypre_TAlloc(HYPRE_Int, hypre_ParCSRCommPkgRecvVecStart(comm_pkg, num_recvs), HYPRE_MEMORY_HOST); for (i = 0; i < num_sends; ++i) { HYPRE_Int ip = hypre_ParCSRCommPkgSendProc(comm_pkg, i); HYPRE_Int vec_start = hypre_ParCSRCommPkgSendMapStart(comm_pkg, i); HYPRE_Int vec_len = hypre_ParCSRCommPkgSendMapStart(comm_pkg, i + 1) - vec_start; hypre_MPI_Recv_init( (HYPRE_Int *)recv_buff + vec_start, vec_len, HYPRE_MPI_INT, ip, 0, comm, requests + i ); } for (i = 0; i < num_recvs; ++i) { HYPRE_Int ip = hypre_ParCSRCommPkgRecvProc(comm_pkg, i); HYPRE_Int vec_start = hypre_ParCSRCommPkgRecvVecStart(comm_pkg, i); HYPRE_Int vec_len = hypre_ParCSRCommPkgRecvVecStart(comm_pkg, i + 1) - vec_start; hypre_MPI_Send_init( (HYPRE_Int *)send_buff + vec_start, vec_len, HYPRE_MPI_INT, ip, 0, comm, requests + num_sends + i ); } break; case HYPRE_COMM_PKG_JOB_BIGINT: num_bytes_send = sizeof(HYPRE_BigInt) * hypre_ParCSRCommPkgSendMapStart(comm_pkg, num_sends); num_bytes_recv = sizeof(HYPRE_BigInt) * hypre_ParCSRCommPkgRecvVecStart(comm_pkg, num_recvs); send_buff = hypre_TAlloc(HYPRE_BigInt, hypre_ParCSRCommPkgSendMapStart(comm_pkg, num_sends), HYPRE_MEMORY_HOST); recv_buff = hypre_TAlloc(HYPRE_BigInt, hypre_ParCSRCommPkgRecvVecStart(comm_pkg, num_recvs), HYPRE_MEMORY_HOST); for (i = 0; i < num_recvs; ++i) { HYPRE_Int ip = hypre_ParCSRCommPkgRecvProc(comm_pkg, i); HYPRE_Int vec_start = hypre_ParCSRCommPkgRecvVecStart(comm_pkg, i); HYPRE_Int vec_len = hypre_ParCSRCommPkgRecvVecStart(comm_pkg, i + 1) - vec_start; hypre_MPI_Recv_init( (HYPRE_BigInt *)recv_buff + (HYPRE_BigInt)vec_start, vec_len, HYPRE_MPI_BIG_INT, ip, 0, comm, requests + i ); } for (i = 0; i < num_sends; ++i) { HYPRE_Int ip = hypre_ParCSRCommPkgSendProc(comm_pkg, i); HYPRE_Int vec_start = hypre_ParCSRCommPkgSendMapStart(comm_pkg, i); HYPRE_Int vec_len = hypre_ParCSRCommPkgSendMapStart(comm_pkg, i + 1) - vec_start; hypre_MPI_Send_init( (HYPRE_BigInt *)send_buff + (HYPRE_BigInt)vec_start, vec_len, HYPRE_MPI_BIG_INT, ip, 0, comm, requests + num_recvs + i); } break; case HYPRE_COMM_PKG_JOB_BIGINT_TRANSPOSE: num_bytes_recv = sizeof(HYPRE_BigInt) * hypre_ParCSRCommPkgSendMapStart(comm_pkg, num_sends); num_bytes_send = sizeof(HYPRE_BigInt) * hypre_ParCSRCommPkgRecvVecStart(comm_pkg, num_recvs); recv_buff = hypre_TAlloc(HYPRE_BigInt, hypre_ParCSRCommPkgSendMapStart(comm_pkg, num_sends), HYPRE_MEMORY_HOST); send_buff = hypre_TAlloc(HYPRE_BigInt, hypre_ParCSRCommPkgRecvVecStart(comm_pkg, num_recvs), HYPRE_MEMORY_HOST); for (i = 0; i < num_sends; ++i) { HYPRE_Int ip = hypre_ParCSRCommPkgSendProc(comm_pkg, i); HYPRE_Int vec_start = hypre_ParCSRCommPkgSendMapStart(comm_pkg, i); HYPRE_Int vec_len = hypre_ParCSRCommPkgSendMapStart(comm_pkg, i + 1) - vec_start; hypre_MPI_Recv_init( (HYPRE_BigInt *)recv_buff + (HYPRE_BigInt)vec_start, vec_len, HYPRE_MPI_BIG_INT, ip, 0, comm, requests + i ); } for (i = 0; i < num_recvs; ++i) { HYPRE_Int ip = hypre_ParCSRCommPkgRecvProc(comm_pkg, i); HYPRE_Int vec_start = hypre_ParCSRCommPkgRecvVecStart(comm_pkg, i); HYPRE_Int vec_len = hypre_ParCSRCommPkgRecvVecStart(comm_pkg, i + 1) - vec_start; hypre_MPI_Send_init( (HYPRE_BigInt *)send_buff + (HYPRE_BigInt)vec_start, vec_len, HYPRE_MPI_BIG_INT, ip, 0, comm, requests + num_sends + i); } break; default: hypre_assert(1 == 0); break; } // switch (job_type) hypre_ParCSRCommHandleRecvDataBuffer(comm_handle) = recv_buff; hypre_ParCSRCommHandleSendDataBuffer(comm_handle) = send_buff; hypre_ParCSRCommHandleNumSendBytes(comm_handle) = num_bytes_send; hypre_ParCSRCommHandleNumRecvBytes(comm_handle) = num_bytes_recv; return ( comm_handle ); } /*------------------------------------------------------------------ * hypre_ParCSRCommPkgGetPersistentCommHandle *------------------------------------------------------------------*/ hypre_ParCSRPersistentCommHandle* hypre_ParCSRCommPkgGetPersistentCommHandle( HYPRE_Int job, hypre_ParCSRCommPkg *comm_pkg ) { CommPkgJobType type = getJobTypeOf(job); if (!comm_pkg->persistent_comm_handles[type]) { /* data is owned by persistent comm handle */ comm_pkg->persistent_comm_handles[type] = hypre_ParCSRPersistentCommHandleCreate(job, comm_pkg); } return comm_pkg->persistent_comm_handles[type]; } /*------------------------------------------------------------------ * hypre_ParCSRPersistentCommHandleDestroy *------------------------------------------------------------------*/ void hypre_ParCSRPersistentCommHandleDestroy( hypre_ParCSRPersistentCommHandle *comm_handle ) { if (comm_handle) { hypre_TFree(hypre_ParCSRCommHandleSendDataBuffer(comm_handle), HYPRE_MEMORY_HOST); hypre_TFree(hypre_ParCSRCommHandleRecvDataBuffer(comm_handle), HYPRE_MEMORY_HOST); hypre_TFree(comm_handle->requests, HYPRE_MEMORY_HOST); hypre_TFree(comm_handle, HYPRE_MEMORY_HOST); } } /*------------------------------------------------------------------ * hypre_ParCSRPersistentCommHandleStart *------------------------------------------------------------------*/ void hypre_ParCSRPersistentCommHandleStart( hypre_ParCSRPersistentCommHandle *comm_handle, HYPRE_MemoryLocation send_memory_location, void *send_data ) { hypre_ParCSRCommHandleSendData(comm_handle) = send_data; hypre_ParCSRCommHandleSendMemoryLocation(comm_handle) = send_memory_location; if (hypre_ParCSRCommHandleNumRequests(comm_handle) > 0) { hypre_TMemcpy( hypre_ParCSRCommHandleSendDataBuffer(comm_handle), send_data, char, hypre_ParCSRCommHandleNumSendBytes(comm_handle), HYPRE_MEMORY_HOST, send_memory_location ); HYPRE_Int ret = hypre_MPI_Startall(hypre_ParCSRCommHandleNumRequests(comm_handle), hypre_ParCSRCommHandleRequests(comm_handle)); if (hypre_MPI_SUCCESS != ret) { hypre_error_w_msg(HYPRE_ERROR_GENERIC, "MPI error\n"); /*hypre_printf("MPI error %d in %s (%s, line %u)\n", ret, __FUNCTION__, __FILE__, __LINE__);*/ } } } /*------------------------------------------------------------------ * hypre_ParCSRPersistentCommHandleWait *------------------------------------------------------------------*/ void hypre_ParCSRPersistentCommHandleWait( hypre_ParCSRPersistentCommHandle *comm_handle, HYPRE_MemoryLocation recv_memory_location, void *recv_data ) { hypre_ParCSRCommHandleRecvData(comm_handle) = recv_data; hypre_ParCSRCommHandleRecvMemoryLocation(comm_handle) = recv_memory_location; if (hypre_ParCSRCommHandleNumRequests(comm_handle) > 0) { HYPRE_Int ret = hypre_MPI_Waitall(hypre_ParCSRCommHandleNumRequests(comm_handle), hypre_ParCSRCommHandleRequests(comm_handle), hypre_MPI_STATUSES_IGNORE); if (hypre_MPI_SUCCESS != ret) { hypre_error_w_msg(HYPRE_ERROR_GENERIC, "MPI error\n"); /*hypre_printf("MPI error %d in %s (%s, line %u)\n", ret, __FUNCTION__, __FILE__, __LINE__);*/ } hypre_TMemcpy(recv_data, hypre_ParCSRCommHandleRecvDataBuffer(comm_handle), char, hypre_ParCSRCommHandleNumRecvBytes(comm_handle), recv_memory_location, HYPRE_MEMORY_HOST); } } #endif // HYPRE_USING_PERSISTENT_COMM /*------------------------------------------------------------------ * hypre_ParCSRCommHandleCreate *------------------------------------------------------------------*/ hypre_ParCSRCommHandle* hypre_ParCSRCommHandleCreate ( HYPRE_Int job, hypre_ParCSRCommPkg *comm_pkg, void *send_data, void *recv_data ) { return hypre_ParCSRCommHandleCreate_v2(job, comm_pkg, HYPRE_MEMORY_HOST, send_data, HYPRE_MEMORY_HOST, recv_data); } /*------------------------------------------------------------------ * hypre_ParCSRCommHandleCreate_v2 *------------------------------------------------------------------*/ hypre_ParCSRCommHandle* hypre_ParCSRCommHandleCreate_v2 ( HYPRE_Int job, hypre_ParCSRCommPkg *comm_pkg, HYPRE_MemoryLocation send_memory_location, void *send_data_in, HYPRE_MemoryLocation recv_memory_location, void *recv_data_in ) { hypre_GpuProfilingPushRange("hypre_ParCSRCommHandleCreate_v2"); HYPRE_Int num_sends = hypre_ParCSRCommPkgNumSends(comm_pkg); HYPRE_Int num_recvs = hypre_ParCSRCommPkgNumRecvs(comm_pkg); MPI_Comm comm = hypre_ParCSRCommPkgComm(comm_pkg); HYPRE_Int num_send_bytes = 0; HYPRE_Int num_recv_bytes = 0; hypre_ParCSRCommHandle *comm_handle; HYPRE_Int num_requests; hypre_MPI_Request *requests; HYPRE_Int i, j; HYPRE_Int my_id, num_procs; HYPRE_Int ip, vec_start, vec_len; void *send_data; void *recv_data; /*-------------------------------------------------------------------- * hypre_Initialize sets up a communication handle, * posts receives and initiates sends. It always requires num_sends, * num_recvs, recv_procs and send_procs to be set in comm_pkg. * There are different options for job: * job = 1 : is used to initialize communication exchange for the parts * of vector needed to perform a Matvec, it requires send_data * and recv_data to be doubles, recv_vec_starts and * send_map_starts need to be set in comm_pkg. * job = 2 : is used to initialize communication exchange for the parts * of vector needed to perform a MatvecT, it requires send_data * and recv_data to be doubles, recv_vec_starts and * send_map_starts need to be set in comm_pkg. * job = 11: similar to job = 1, but exchanges data of type HYPRE_Int (not HYPRE_Complex), * requires send_data and recv_data to be ints * recv_vec_starts and send_map_starts need to be set in comm_pkg. * job = 12: similar to job = 2, but exchanges data of type HYPRE_Int (not HYPRE_Complex), * requires send_data and recv_data to be ints * recv_vec_starts and send_map_starts need to be set in comm_pkg. * job = 21: similar to job = 1, but exchanges data of type HYPRE_BigInt (not HYPRE_Complex), * requires send_data and recv_data to be ints * recv_vec_starts and send_map_starts need to be set in comm_pkg. * job = 22: similar to job = 2, but exchanges data of type HYPRE_BigInt (not HYPRE_Complex), * requires send_data and recv_data to be ints * recv_vec_starts and send_map_starts need to be set in comm_pkg. * default: ignores send_data and recv_data, requires send_mpi_types * and recv_mpi_types to be set in comm_pkg. * datatypes need to point to absolute * addresses, e.g. generated using hypre_MPI_Address . *--------------------------------------------------------------------*/ if (!hypre_GetGpuAwareMPI()) { switch (job) { case 1: num_send_bytes = hypre_ParCSRCommPkgSendMapStart(comm_pkg, num_sends) * sizeof(HYPRE_Complex); num_recv_bytes = hypre_ParCSRCommPkgRecvVecStart(comm_pkg, num_recvs) * sizeof(HYPRE_Complex); break; case 2: num_send_bytes = hypre_ParCSRCommPkgRecvVecStart(comm_pkg, num_recvs) * sizeof(HYPRE_Complex); num_recv_bytes = hypre_ParCSRCommPkgSendMapStart(comm_pkg, num_sends) * sizeof(HYPRE_Complex); break; case 11: num_send_bytes = hypre_ParCSRCommPkgSendMapStart(comm_pkg, num_sends) * sizeof(HYPRE_Int); num_recv_bytes = hypre_ParCSRCommPkgRecvVecStart(comm_pkg, num_recvs) * sizeof(HYPRE_Int); break; case 12: num_send_bytes = hypre_ParCSRCommPkgRecvVecStart(comm_pkg, num_recvs) * sizeof(HYPRE_Int); num_recv_bytes = hypre_ParCSRCommPkgSendMapStart(comm_pkg, num_sends) * sizeof(HYPRE_Int); break; case 21: num_send_bytes = hypre_ParCSRCommPkgSendMapStart(comm_pkg, num_sends) * sizeof(HYPRE_BigInt); num_recv_bytes = hypre_ParCSRCommPkgRecvVecStart(comm_pkg, num_recvs) * sizeof(HYPRE_BigInt); break; case 22: num_send_bytes = hypre_ParCSRCommPkgRecvVecStart(comm_pkg, num_recvs) * sizeof(HYPRE_BigInt); num_recv_bytes = hypre_ParCSRCommPkgSendMapStart(comm_pkg, num_sends) * sizeof(HYPRE_BigInt); break; } hypre_MemoryLocation act_send_memory_location = hypre_GetActualMemLocation(send_memory_location); if ( act_send_memory_location == hypre_MEMORY_DEVICE || act_send_memory_location == hypre_MEMORY_UNIFIED ) { //send_data = _hypre_TAlloc(char, num_send_bytes, hypre_MEMORY_HOST_PINNED); send_data = hypre_TAlloc(char, num_send_bytes, HYPRE_MEMORY_HOST); hypre_GpuProfilingPushRange("MPI-D2H"); hypre_TMemcpy(send_data, send_data_in, char, num_send_bytes, HYPRE_MEMORY_HOST, HYPRE_MEMORY_DEVICE); hypre_GpuProfilingPopRange(); } else { send_data = send_data_in; } hypre_MemoryLocation act_recv_memory_location = hypre_GetActualMemLocation(recv_memory_location); if ( act_recv_memory_location == hypre_MEMORY_DEVICE || act_recv_memory_location == hypre_MEMORY_UNIFIED ) { //recv_data = hypre_TAlloc(char, num_recv_bytes, hypre_MEMORY_HOST_PINNED); recv_data = hypre_TAlloc(char, num_recv_bytes, HYPRE_MEMORY_HOST); } else { recv_data = recv_data_in; } } else { send_data = send_data_in; recv_data = recv_data_in; } num_requests = num_sends + num_recvs; requests = hypre_CTAlloc(hypre_MPI_Request, num_requests, HYPRE_MEMORY_HOST); hypre_MPI_Comm_size(comm, &num_procs); hypre_MPI_Comm_rank(comm, &my_id); j = 0; switch (job) { case 1: { HYPRE_Complex *d_send_data = (HYPRE_Complex *) send_data; HYPRE_Complex *d_recv_data = (HYPRE_Complex *) recv_data; for (i = 0; i < num_recvs; i++) { ip = hypre_ParCSRCommPkgRecvProc(comm_pkg, i); vec_start = hypre_ParCSRCommPkgRecvVecStart(comm_pkg, i); vec_len = hypre_ParCSRCommPkgRecvVecStart(comm_pkg, i + 1) - vec_start; hypre_MPI_Irecv(&d_recv_data[vec_start], vec_len, HYPRE_MPI_COMPLEX, ip, 0, comm, &requests[j++]); } for (i = 0; i < num_sends; i++) { ip = hypre_ParCSRCommPkgSendProc(comm_pkg, i); vec_start = hypre_ParCSRCommPkgSendMapStart(comm_pkg, i); vec_len = hypre_ParCSRCommPkgSendMapStart(comm_pkg, i + 1) - vec_start; hypre_MPI_Isend(&d_send_data[vec_start], vec_len, HYPRE_MPI_COMPLEX, ip, 0, comm, &requests[j++]); } break; } case 2: { HYPRE_Complex *d_send_data = (HYPRE_Complex *) send_data; HYPRE_Complex *d_recv_data = (HYPRE_Complex *) recv_data; for (i = 0; i < num_sends; i++) { ip = hypre_ParCSRCommPkgSendProc(comm_pkg, i); vec_start = hypre_ParCSRCommPkgSendMapStart(comm_pkg, i); vec_len = hypre_ParCSRCommPkgSendMapStart(comm_pkg, i + 1) - vec_start; hypre_MPI_Irecv(&d_recv_data[vec_start], vec_len, HYPRE_MPI_COMPLEX, ip, 0, comm, &requests[j++]); } for (i = 0; i < num_recvs; i++) { ip = hypre_ParCSRCommPkgRecvProc(comm_pkg, i); vec_start = hypre_ParCSRCommPkgRecvVecStart(comm_pkg, i); vec_len = hypre_ParCSRCommPkgRecvVecStart(comm_pkg, i + 1) - vec_start; hypre_MPI_Isend(&d_send_data[vec_start], vec_len, HYPRE_MPI_COMPLEX, ip, 0, comm, &requests[j++]); } break; } case 11: { HYPRE_Int *i_send_data = (HYPRE_Int *) send_data; HYPRE_Int *i_recv_data = (HYPRE_Int *) recv_data; for (i = 0; i < num_recvs; i++) { ip = hypre_ParCSRCommPkgRecvProc(comm_pkg, i); vec_start = hypre_ParCSRCommPkgRecvVecStart(comm_pkg, i); vec_len = hypre_ParCSRCommPkgRecvVecStart(comm_pkg, i + 1) - vec_start; hypre_MPI_Irecv(&i_recv_data[vec_start], vec_len, HYPRE_MPI_INT, ip, 0, comm, &requests[j++]); } for (i = 0; i < num_sends; i++) { ip = hypre_ParCSRCommPkgSendProc(comm_pkg, i); vec_start = hypre_ParCSRCommPkgSendMapStart(comm_pkg, i); vec_len = hypre_ParCSRCommPkgSendMapStart(comm_pkg, i + 1) - vec_start; hypre_MPI_Isend(&i_send_data[vec_start], vec_len, HYPRE_MPI_INT, ip, 0, comm, &requests[j++]); } break; } case 12: { HYPRE_Int *i_send_data = (HYPRE_Int *) send_data; HYPRE_Int *i_recv_data = (HYPRE_Int *) recv_data; for (i = 0; i < num_sends; i++) { ip = hypre_ParCSRCommPkgSendProc(comm_pkg, i); vec_start = hypre_ParCSRCommPkgSendMapStart(comm_pkg, i); vec_len = hypre_ParCSRCommPkgSendMapStart(comm_pkg, i + 1) - vec_start; hypre_MPI_Irecv(&i_recv_data[vec_start], vec_len, HYPRE_MPI_INT, ip, 0, comm, &requests[j++]); } for (i = 0; i < num_recvs; i++) { ip = hypre_ParCSRCommPkgRecvProc(comm_pkg, i); vec_start = hypre_ParCSRCommPkgRecvVecStart(comm_pkg, i); vec_len = hypre_ParCSRCommPkgRecvVecStart(comm_pkg, i + 1) - vec_start; hypre_MPI_Isend(&i_send_data[vec_start], vec_len, HYPRE_MPI_INT, ip, 0, comm, &requests[j++]); } break; } case 21: { HYPRE_BigInt *i_send_data = (HYPRE_BigInt *) send_data; HYPRE_BigInt *i_recv_data = (HYPRE_BigInt *) recv_data; for (i = 0; i < num_recvs; i++) { ip = hypre_ParCSRCommPkgRecvProc(comm_pkg, i); vec_start = hypre_ParCSRCommPkgRecvVecStart(comm_pkg, i); vec_len = hypre_ParCSRCommPkgRecvVecStart(comm_pkg, i + 1) - vec_start; hypre_MPI_Irecv(&i_recv_data[vec_start], vec_len, HYPRE_MPI_BIG_INT, ip, 0, comm, &requests[j++]); } for (i = 0; i < num_sends; i++) { vec_start = hypre_ParCSRCommPkgSendMapStart(comm_pkg, i); vec_len = hypre_ParCSRCommPkgSendMapStart(comm_pkg, i + 1) - vec_start; ip = hypre_ParCSRCommPkgSendProc(comm_pkg, i); hypre_MPI_Isend(&i_send_data[vec_start], vec_len, HYPRE_MPI_BIG_INT, ip, 0, comm, &requests[j++]); } break; } case 22: { HYPRE_BigInt *i_send_data = (HYPRE_BigInt *) send_data; HYPRE_BigInt *i_recv_data = (HYPRE_BigInt *) recv_data; for (i = 0; i < num_sends; i++) { vec_start = hypre_ParCSRCommPkgSendMapStart(comm_pkg, i); vec_len = hypre_ParCSRCommPkgSendMapStart(comm_pkg, i + 1) - vec_start; ip = hypre_ParCSRCommPkgSendProc(comm_pkg, i); hypre_MPI_Irecv(&i_recv_data[vec_start], vec_len, HYPRE_MPI_BIG_INT, ip, 0, comm, &requests[j++]); } for (i = 0; i < num_recvs; i++) { ip = hypre_ParCSRCommPkgRecvProc(comm_pkg, i); vec_start = hypre_ParCSRCommPkgRecvVecStart(comm_pkg, i); vec_len = hypre_ParCSRCommPkgRecvVecStart(comm_pkg, i + 1) - vec_start; hypre_MPI_Isend(&i_send_data[vec_start], vec_len, HYPRE_MPI_BIG_INT, ip, 0, comm, &requests[j++]); } break; } } /*-------------------------------------------------------------------- * set up comm_handle and return *--------------------------------------------------------------------*/ comm_handle = hypre_CTAlloc(hypre_ParCSRCommHandle, 1, HYPRE_MEMORY_HOST); hypre_ParCSRCommHandleCommPkg(comm_handle) = comm_pkg; hypre_ParCSRCommHandleSendMemoryLocation(comm_handle) = send_memory_location; hypre_ParCSRCommHandleRecvMemoryLocation(comm_handle) = recv_memory_location; hypre_ParCSRCommHandleNumSendBytes(comm_handle) = num_send_bytes; hypre_ParCSRCommHandleNumRecvBytes(comm_handle) = num_recv_bytes; hypre_ParCSRCommHandleSendData(comm_handle) = send_data_in; hypre_ParCSRCommHandleRecvData(comm_handle) = recv_data_in; hypre_ParCSRCommHandleSendDataBuffer(comm_handle) = send_data; hypre_ParCSRCommHandleRecvDataBuffer(comm_handle) = recv_data; hypre_ParCSRCommHandleNumRequests(comm_handle) = num_requests; hypre_ParCSRCommHandleRequests(comm_handle) = requests; hypre_GpuProfilingPopRange(); return ( comm_handle ); } /*------------------------------------------------------------------ * hypre_ParCSRCommHandleDestroy *------------------------------------------------------------------*/ HYPRE_Int hypre_ParCSRCommHandleDestroy( hypre_ParCSRCommHandle *comm_handle ) { if ( comm_handle == NULL ) { return hypre_error_flag; } hypre_GpuProfilingPushRange("hypre_ParCSRCommHandleDestroy"); if (hypre_ParCSRCommHandleNumRequests(comm_handle)) { hypre_MPI_Status *status0; status0 = hypre_CTAlloc(hypre_MPI_Status, hypre_ParCSRCommHandleNumRequests(comm_handle), HYPRE_MEMORY_HOST); hypre_GpuProfilingPushRange("hypre_MPI_Waitall"); hypre_MPI_Waitall(hypre_ParCSRCommHandleNumRequests(comm_handle), hypre_ParCSRCommHandleRequests(comm_handle), status0); hypre_GpuProfilingPopRange(); hypre_TFree(status0, HYPRE_MEMORY_HOST); } if (!hypre_GetGpuAwareMPI()) { hypre_MemoryLocation act_send_memory_location = hypre_GetActualMemLocation(hypre_ParCSRCommHandleSendMemoryLocation(comm_handle)); if ( act_send_memory_location == hypre_MEMORY_DEVICE || act_send_memory_location == hypre_MEMORY_UNIFIED ) { //hypre_HostPinnedFree(hypre_ParCSRCommHandleSendDataBuffer(comm_handle)); hypre_TFree(hypre_ParCSRCommHandleSendDataBuffer(comm_handle), HYPRE_MEMORY_HOST); } hypre_MemoryLocation act_recv_memory_location = hypre_GetActualMemLocation(hypre_ParCSRCommHandleRecvMemoryLocation(comm_handle)); if ( act_recv_memory_location == hypre_MEMORY_DEVICE || act_recv_memory_location == hypre_MEMORY_UNIFIED ) { hypre_GpuProfilingPushRange("MPI-H2D"); hypre_TMemcpy( hypre_ParCSRCommHandleRecvData(comm_handle), hypre_ParCSRCommHandleRecvDataBuffer(comm_handle), char, hypre_ParCSRCommHandleNumRecvBytes(comm_handle), HYPRE_MEMORY_DEVICE, HYPRE_MEMORY_HOST ); hypre_GpuProfilingPopRange(); //hypre_HostPinnedFree(hypre_ParCSRCommHandleRecvDataBuffer(comm_handle)); hypre_TFree(hypre_ParCSRCommHandleRecvDataBuffer(comm_handle), HYPRE_MEMORY_HOST); } } hypre_TFree(hypre_ParCSRCommHandleRequests(comm_handle), HYPRE_MEMORY_HOST); hypre_TFree(comm_handle, HYPRE_MEMORY_HOST); hypre_GpuProfilingPopRange(); return hypre_error_flag; } /*------------------------------------------------------------------ * hypre_ParCSRCommPkgCreate_core * * This function does all the communications and computations for * hypre_ParCSRCommPkgCreate(hypre_ParCSRMatrix *A) and * hypre_BooleanMatvecCommPkgCreate(hypre_ParCSRBooleanMatrix *A) * * To support both data types, it has hardly any data structures * other than HYPRE_Int*. *------------------------------------------------------------------*/ void hypre_ParCSRCommPkgCreate_core( /* input args: */ MPI_Comm comm, HYPRE_BigInt *col_map_offd, HYPRE_BigInt first_col_diag, HYPRE_BigInt *col_starts, HYPRE_Int num_cols_diag, HYPRE_Int num_cols_offd, /* pointers to output args: */ HYPRE_Int *p_num_recvs, HYPRE_Int **p_recv_procs, HYPRE_Int **p_recv_vec_starts, HYPRE_Int *p_num_sends, HYPRE_Int **p_send_procs, HYPRE_Int **p_send_map_starts, HYPRE_Int **p_send_map_elmts ) { HYPRE_Int i, j; HYPRE_Int num_procs, my_id, proc_num, num_elmts; HYPRE_Int local_info; HYPRE_BigInt offd_col; HYPRE_BigInt *big_buf_data = NULL; HYPRE_Int *proc_mark, *proc_add, *tmp, *recv_buf, *displs, *info; /* outputs: */ HYPRE_Int num_recvs, *recv_procs, *recv_vec_starts; HYPRE_Int num_sends, *send_procs, *send_map_starts, *send_map_elmts; HYPRE_Int ip, vec_start, vec_len, num_requests; hypre_MPI_Request *requests = NULL; hypre_MPI_Status *status = NULL; hypre_MPI_Comm_size(comm, &num_procs); hypre_MPI_Comm_rank(comm, &my_id); proc_mark = hypre_CTAlloc(HYPRE_Int, num_procs, HYPRE_MEMORY_HOST); proc_add = hypre_CTAlloc(HYPRE_Int, num_procs, HYPRE_MEMORY_HOST); info = hypre_CTAlloc(HYPRE_Int, num_procs, HYPRE_MEMORY_HOST); /* ---------------------------------------------------------------------- * determine which processors to receive from (set proc_mark) and num_recvs, * at the end of the loop proc_mark[i] contains the number of elements to be * received from Proc. i * ---------------------------------------------------------------------*/ proc_num = 0; if (num_cols_offd) { offd_col = col_map_offd[0]; } num_recvs = 0; for (i = 0; i < num_cols_offd; i++) { if (num_cols_diag) { proc_num = hypre_min(num_procs - 1, (HYPRE_Int)(offd_col / (HYPRE_BigInt)num_cols_diag)); } while (col_starts[proc_num] > offd_col ) { proc_num = proc_num - 1; } while (col_starts[proc_num + 1] - 1 < offd_col ) { proc_num = proc_num + 1; } proc_mark[num_recvs] = proc_num; j = i; while (col_starts[proc_num + 1] > offd_col) { proc_add[num_recvs]++; if (j < num_cols_offd - 1) { j++; offd_col = col_map_offd[j]; } else { j++; offd_col = col_starts[num_procs]; } } num_recvs++; i = (j < num_cols_offd) ? (j - 1) : j; } local_info = 2 * num_recvs; hypre_MPI_Allgather(&local_info, 1, HYPRE_MPI_INT, info, 1, HYPRE_MPI_INT, comm); /* ---------------------------------------------------------------------- * generate information to be sent: tmp contains for each recv_proc: * id of recv_procs, number of elements to be received for this processor, * indices of elements (in this order) * ---------------------------------------------------------------------*/ displs = hypre_CTAlloc(HYPRE_Int, num_procs + 1, HYPRE_MEMORY_HOST); for (i = 1; i < num_procs + 1; i++) { displs[i] = displs[i - 1] + info[i - 1]; } recv_buf = hypre_CTAlloc(HYPRE_Int, displs[num_procs], HYPRE_MEMORY_HOST); recv_procs = NULL; tmp = NULL; if (num_recvs) { recv_procs = hypre_CTAlloc(HYPRE_Int, num_recvs, HYPRE_MEMORY_HOST); tmp = hypre_CTAlloc(HYPRE_Int, local_info, HYPRE_MEMORY_HOST); } recv_vec_starts = hypre_CTAlloc(HYPRE_Int, num_recvs + 1, HYPRE_MEMORY_HOST); j = 0; for (i = 0; i < num_recvs; i++) { num_elmts = proc_add[i]; recv_procs[i] = proc_mark[i]; recv_vec_starts[i + 1] = recv_vec_starts[i] + num_elmts; tmp[j++] = proc_mark[i]; tmp[j++] = num_elmts; } hypre_MPI_Allgatherv(tmp, local_info, HYPRE_MPI_INT, recv_buf, info, displs, HYPRE_MPI_INT, comm); /* ---------------------------------------------------------------------- * determine num_sends and number of elements to be sent * ---------------------------------------------------------------------*/ num_sends = 0; num_elmts = 0; proc_add[0] = 0; for (i = 0; i < num_procs; i++) { j = displs[i]; while ( j < displs[i + 1]) { if (recv_buf[j++] == my_id) { proc_mark[num_sends] = i; num_sends++; proc_add[num_sends] = proc_add[num_sends - 1] + recv_buf[j]; break; } j++; } } /* ---------------------------------------------------------------------- * determine send_procs and actual elements to be send (in send_map_elmts) * and send_map_starts whose i-th entry points to the beginning of the * elements to be send to proc. i * ---------------------------------------------------------------------*/ send_procs = NULL; send_map_elmts = NULL; if (num_sends) { send_procs = hypre_CTAlloc(HYPRE_Int, num_sends, HYPRE_MEMORY_HOST); send_map_elmts = hypre_CTAlloc(HYPRE_Int, proc_add[num_sends], HYPRE_MEMORY_HOST); big_buf_data = hypre_CTAlloc(HYPRE_BigInt, proc_add[num_sends], HYPRE_MEMORY_HOST); } send_map_starts = hypre_CTAlloc(HYPRE_Int, num_sends + 1, HYPRE_MEMORY_HOST); num_requests = num_recvs + num_sends; if (num_requests) { requests = hypre_CTAlloc(hypre_MPI_Request, num_requests, HYPRE_MEMORY_HOST); status = hypre_CTAlloc(hypre_MPI_Status, num_requests, HYPRE_MEMORY_HOST); } for (i = 0; i < num_sends; i++) { send_map_starts[i + 1] = proc_add[i + 1]; send_procs[i] = proc_mark[i]; } j = 0; for (i = 0; i < num_sends; i++) { vec_start = send_map_starts[i]; vec_len = send_map_starts[i + 1] - vec_start; ip = send_procs[i]; hypre_MPI_Irecv(&big_buf_data[vec_start], vec_len, HYPRE_MPI_BIG_INT, ip, 0, comm, &requests[j++]); } for (i = 0; i < num_recvs; i++) { vec_start = recv_vec_starts[i]; vec_len = recv_vec_starts[i + 1] - vec_start; ip = recv_procs[i]; hypre_MPI_Isend(&col_map_offd[vec_start], vec_len, HYPRE_MPI_BIG_INT, ip, 0, comm, &requests[j++]); } if (num_requests) { hypre_MPI_Waitall(num_requests, requests, status); hypre_TFree(requests, HYPRE_MEMORY_HOST); hypre_TFree(status, HYPRE_MEMORY_HOST); } if (num_sends) { for (i = 0; i < send_map_starts[num_sends]; i++) { send_map_elmts[i] = (HYPRE_Int)(big_buf_data[i] - first_col_diag); } } hypre_TFree(proc_add, HYPRE_MEMORY_HOST); hypre_TFree(proc_mark, HYPRE_MEMORY_HOST); hypre_TFree(tmp, HYPRE_MEMORY_HOST); hypre_TFree(recv_buf, HYPRE_MEMORY_HOST); hypre_TFree(displs, HYPRE_MEMORY_HOST); hypre_TFree(info, HYPRE_MEMORY_HOST); hypre_TFree(big_buf_data, HYPRE_MEMORY_HOST); /* finish up with the hand-coded call-by-reference... */ *p_num_recvs = num_recvs; *p_recv_procs = recv_procs; *p_recv_vec_starts = recv_vec_starts; *p_num_sends = num_sends; *p_send_procs = send_procs; *p_send_map_starts = send_map_starts; *p_send_map_elmts = send_map_elmts; } /*------------------------------------------------------------------ * hypre_ParCSRCommPkgCreate * * Creates the communication package with MPI collectives calls. * * Notes: * 1) This version does not use the assumed partition. * 2) comm_pkg must be allocated outside of this function *------------------------------------------------------------------*/ HYPRE_Int hypre_ParCSRCommPkgCreate( MPI_Comm comm, HYPRE_BigInt *col_map_offd, HYPRE_BigInt first_col_diag, HYPRE_BigInt *col_starts, HYPRE_Int num_cols_diag, HYPRE_Int num_cols_offd, hypre_ParCSRCommPkg *comm_pkg ) { HYPRE_Int num_sends; HYPRE_Int *send_procs; HYPRE_Int *send_map_starts; HYPRE_Int *send_map_elmts; HYPRE_Int num_recvs; HYPRE_Int *recv_procs; HYPRE_Int *recv_vec_starts; hypre_ParCSRCommPkgCreate_core(comm, col_map_offd, first_col_diag, col_starts, num_cols_diag, num_cols_offd, &num_recvs, &recv_procs, &recv_vec_starts, &num_sends, &send_procs, &send_map_starts, &send_map_elmts); /* Fill the communication package */ hypre_ParCSRCommPkgCreateAndFill(comm, num_recvs, recv_procs, recv_vec_starts, num_sends, send_procs, send_map_starts, send_map_elmts, &comm_pkg); return hypre_error_flag; } /*------------------------------------------------------------------ * hypre_ParCSRCommPkgCreateAndFill *------------------------------------------------------------------*/ HYPRE_Int hypre_ParCSRCommPkgCreateAndFill( MPI_Comm comm, HYPRE_Int num_recvs, HYPRE_Int *recv_procs, HYPRE_Int *recv_vec_starts, HYPRE_Int num_sends, HYPRE_Int *send_procs, HYPRE_Int *send_map_starts, HYPRE_Int *send_map_elmts, hypre_ParCSRCommPkg **comm_pkg_ptr ) { hypre_ParCSRCommPkg *comm_pkg; /* Allocate memory for comm_pkg if needed */ if (*comm_pkg_ptr == NULL) { comm_pkg = hypre_TAlloc(hypre_ParCSRCommPkg, 1, HYPRE_MEMORY_HOST); } else { comm_pkg = *comm_pkg_ptr; } /* Set default info */ hypre_ParCSRCommPkgNumComponents(comm_pkg) = 1; hypre_ParCSRCommPkgDeviceSendMapElmts(comm_pkg) = NULL; #if defined(HYPRE_USING_GPU) || defined(HYPRE_USING_DEVICE_OPENMP) hypre_ParCSRCommPkgTmpData(comm_pkg) = NULL; hypre_ParCSRCommPkgBufData(comm_pkg) = NULL; hypre_ParCSRCommPkgMatrixE(comm_pkg) = NULL; #endif #if defined(HYPRE_USING_PERSISTENT_COMM) HYPRE_Int i; for (i = 0; i < NUM_OF_COMM_PKG_JOB_TYPE; i++) { comm_pkg->persistent_comm_handles[i] = NULL; } #endif /* Set input info */ hypre_ParCSRCommPkgComm(comm_pkg) = comm; hypre_ParCSRCommPkgNumRecvs(comm_pkg) = num_recvs; hypre_ParCSRCommPkgRecvProcs(comm_pkg) = recv_procs; hypre_ParCSRCommPkgRecvVecStarts(comm_pkg) = recv_vec_starts; hypre_ParCSRCommPkgNumSends(comm_pkg) = num_sends; hypre_ParCSRCommPkgSendProcs(comm_pkg) = send_procs; hypre_ParCSRCommPkgSendMapStarts(comm_pkg) = send_map_starts; hypre_ParCSRCommPkgSendMapElmts(comm_pkg) = send_map_elmts; /* Set output pointer */ *comm_pkg_ptr = comm_pkg; return hypre_error_flag; } /*------------------------------------------------------------------ * hypre_ParCSRCommPkgUpdateVecStarts *------------------------------------------------------------------*/ HYPRE_Int hypre_ParCSRCommPkgUpdateVecStarts( hypre_ParCSRCommPkg *comm_pkg, HYPRE_Int num_components_in, HYPRE_Int vecstride, HYPRE_Int idxstride ) { HYPRE_Int num_components = hypre_ParCSRCommPkgNumComponents(comm_pkg); HYPRE_Int num_sends = hypre_ParCSRCommPkgNumSends(comm_pkg); HYPRE_Int num_recvs = hypre_ParCSRCommPkgNumRecvs(comm_pkg); HYPRE_Int *recv_vec_starts = hypre_ParCSRCommPkgRecvVecStarts(comm_pkg); HYPRE_Int *send_map_starts = hypre_ParCSRCommPkgSendMapStarts(comm_pkg); HYPRE_Int *send_map_elmts = hypre_ParCSRCommPkgSendMapElmts(comm_pkg); HYPRE_Int *send_map_elmts_new; HYPRE_Int i, j; hypre_assert(num_components > 0); if (num_components_in != num_components) { /* Update number of components in the communication package */ hypre_ParCSRCommPkgNumComponents(comm_pkg) = num_components_in; /* Allocate send_maps_elmts */ send_map_elmts_new = hypre_CTAlloc(HYPRE_Int, send_map_starts[num_sends] * num_components_in, HYPRE_MEMORY_HOST); /* Update send_maps_elmts */ if (num_components_in > num_components) { if (num_components == 1) { for (i = 0; i < send_map_starts[num_sends]; i++) { for (j = 0; j < num_components_in; j++) { send_map_elmts_new[i * num_components_in + j] = send_map_elmts[i] * idxstride + j * vecstride; } } } else { for (i = 0; i < send_map_starts[num_sends]; i++) { for (j = 0; j < num_components_in; j++) { send_map_elmts_new[i * num_components_in + j] = send_map_elmts[i * num_components] * idxstride + j * vecstride; } } } } else { /* num_components_in < num_components */ if (num_components_in == 1) { for (i = 0; i < send_map_starts[num_sends]; i++) { send_map_elmts_new[i] = send_map_elmts[i * num_components]; } } else { for (i = 0; i < send_map_starts[num_sends]; i++) { for (j = 0; j < num_components_in; j++) { send_map_elmts_new[i * num_components_in + j] = send_map_elmts[i * num_components + j]; } } } } hypre_ParCSRCommPkgSendMapElmts(comm_pkg) = send_map_elmts_new; /* Free memory */ hypre_TFree(send_map_elmts, HYPRE_MEMORY_HOST); hypre_TFree(hypre_ParCSRCommPkgDeviceSendMapElmts(comm_pkg), HYPRE_MEMORY_DEVICE); #if defined(HYPRE_USING_GPU) || defined(HYPRE_USING_DEVICE_OPENMP) hypre_CSRMatrixDestroy(hypre_ParCSRCommPkgMatrixE(comm_pkg)); hypre_ParCSRCommPkgMatrixE(comm_pkg) = NULL; #endif /* Update send_map_starts */ for (i = 0; i < num_sends + 1; i++) { send_map_starts[i] *= num_components_in / num_components; } /* Update recv_vec_starts */ for (i = 0; i < num_recvs + 1; i++) { recv_vec_starts[i] *= num_components_in / num_components; } } return hypre_error_flag; } /*------------------------------------------------------------------ * hypre_MatvecCommPkgCreate * * Generates the communication package for A using assumed partition *------------------------------------------------------------------*/ HYPRE_Int hypre_MatvecCommPkgCreate ( hypre_ParCSRMatrix *A ) { MPI_Comm comm = hypre_ParCSRMatrixComm(A); hypre_IJAssumedPart *apart = hypre_ParCSRMatrixAssumedPartition(A); hypre_ParCSRCommPkg *comm_pkg; HYPRE_BigInt first_col_diag = hypre_ParCSRMatrixFirstColDiag(A); HYPRE_BigInt *col_map_offd = hypre_ParCSRMatrixColMapOffd(A); HYPRE_Int num_cols_offd = hypre_CSRMatrixNumCols(hypre_ParCSRMatrixOffd(A)); HYPRE_BigInt global_num_cols = hypre_ParCSRMatrixGlobalNumCols(A); HYPRE_ANNOTATE_FUNC_BEGIN; /* Create the assumed partition and should own it */ if (apart == NULL) { hypre_ParCSRMatrixCreateAssumedPartition(A); hypre_ParCSRMatrixOwnsAssumedPartition(A) = 1; apart = hypre_ParCSRMatrixAssumedPartition(A); } /*----------------------------------------------------------- * setup commpkg *----------------------------------------------------------*/ comm_pkg = hypre_TAlloc(hypre_ParCSRCommPkg, 1, HYPRE_MEMORY_HOST); hypre_ParCSRMatrixCommPkg(A) = comm_pkg; hypre_ParCSRCommPkgCreateApart( comm, col_map_offd, first_col_diag, num_cols_offd, global_num_cols, apart, comm_pkg ); HYPRE_ANNOTATE_FUNC_END; return hypre_error_flag; } /*------------------------------------------------------------------ * hypre_MatvecCommPkgDestroy *------------------------------------------------------------------*/ HYPRE_Int hypre_MatvecCommPkgDestroy( hypre_ParCSRCommPkg *comm_pkg ) { #ifdef HYPRE_USING_PERSISTENT_COMM HYPRE_Int i; for (i = HYPRE_COMM_PKG_JOB_COMPLEX; i < NUM_OF_COMM_PKG_JOB_TYPE; ++i) { if (comm_pkg->persistent_comm_handles[i]) { hypre_ParCSRPersistentCommHandleDestroy(comm_pkg->persistent_comm_handles[i]); } } #endif if (hypre_ParCSRCommPkgNumSends(comm_pkg)) { hypre_TFree(hypre_ParCSRCommPkgSendProcs(comm_pkg), HYPRE_MEMORY_HOST); hypre_TFree(hypre_ParCSRCommPkgSendMapElmts(comm_pkg), HYPRE_MEMORY_HOST); hypre_TFree(hypre_ParCSRCommPkgDeviceSendMapElmts(comm_pkg), HYPRE_MEMORY_DEVICE); } hypre_TFree(hypre_ParCSRCommPkgSendMapStarts(comm_pkg), HYPRE_MEMORY_HOST); /* if (hypre_ParCSRCommPkgSendMPITypes(comm_pkg)) hypre_TFree(hypre_ParCSRCommPkgSendMPITypes(comm_pkg), HYPRE_MEMORY_HOST); */ if (hypre_ParCSRCommPkgNumRecvs(comm_pkg)) { hypre_TFree(hypre_ParCSRCommPkgRecvProcs(comm_pkg), HYPRE_MEMORY_HOST); } hypre_TFree(hypre_ParCSRCommPkgRecvVecStarts(comm_pkg), HYPRE_MEMORY_HOST); /* if (hypre_ParCSRCommPkgRecvMPITypes(comm_pkg)) hypre_TFree(hypre_ParCSRCommPkgRecvMPITypes(comm_pkg), HYPRE_MEMORY_HOST); */ #if defined(HYPRE_USING_GPU) || defined(HYPRE_USING_DEVICE_OPENMP) hypre_TFree(hypre_ParCSRCommPkgTmpData(comm_pkg), HYPRE_MEMORY_DEVICE); hypre_TFree(hypre_ParCSRCommPkgBufData(comm_pkg), HYPRE_MEMORY_DEVICE); hypre_CSRMatrixDestroy(hypre_ParCSRCommPkgMatrixE(comm_pkg)); #endif hypre_TFree(comm_pkg, HYPRE_MEMORY_HOST); return hypre_error_flag; } /*------------------------------------------------------------------ * hypre_ParCSRFindExtendCommPkg * * AHB 11/06 : alternate to the extend function below - creates a * second comm pkg based on indices - this makes it easier to use the * global partition * * RL: renamed and moved it here *------------------------------------------------------------------*/ HYPRE_Int hypre_ParCSRFindExtendCommPkg(MPI_Comm comm, HYPRE_BigInt global_num, HYPRE_BigInt my_first, HYPRE_Int local_num, HYPRE_BigInt *starts, hypre_IJAssumedPart *apart, HYPRE_Int indices_len, HYPRE_BigInt *indices, hypre_ParCSRCommPkg **extend_comm_pkg) { HYPRE_UNUSED_VAR(local_num); HYPRE_UNUSED_VAR(starts); hypre_ParCSRCommPkg *new_comm_pkg = hypre_TAlloc(hypre_ParCSRCommPkg, 1, HYPRE_MEMORY_HOST); hypre_assert(apart != NULL); hypre_ParCSRCommPkgCreateApart(comm, indices, my_first, indices_len, global_num, apart, new_comm_pkg); *extend_comm_pkg = new_comm_pkg; return hypre_error_flag; } /*------------------------------------------------------------------ * hypre_BuildCSRMatrixMPIDataType *------------------------------------------------------------------*/ HYPRE_Int hypre_BuildCSRMatrixMPIDataType( HYPRE_Int num_nonzeros, HYPRE_Int num_rows, HYPRE_Complex *a_data, HYPRE_Int *a_i, HYPRE_Int *a_j, hypre_MPI_Datatype *csr_matrix_datatype ) { HYPRE_Int block_lens[3]; hypre_MPI_Aint displ[3]; hypre_MPI_Datatype types[3]; block_lens[0] = num_nonzeros; block_lens[1] = num_rows + 1; block_lens[2] = num_nonzeros; types[0] = HYPRE_MPI_COMPLEX; types[1] = HYPRE_MPI_INT; types[2] = HYPRE_MPI_INT; hypre_MPI_Address(a_data, &displ[0]); hypre_MPI_Address(a_i, &displ[1]); hypre_MPI_Address(a_j, &displ[2]); hypre_MPI_Type_struct(3, block_lens, displ, types, csr_matrix_datatype); hypre_MPI_Type_commit(csr_matrix_datatype); return hypre_error_flag; } /*------------------------------------------------------------------ * hypre_BuildCSRMatrixMPIDataType *------------------------------------------------------------------*/ HYPRE_Int hypre_BuildCSRJDataType( HYPRE_Int num_nonzeros, HYPRE_Complex *a_data, HYPRE_Int *a_j, hypre_MPI_Datatype *csr_jdata_datatype ) { HYPRE_Int block_lens[2]; hypre_MPI_Aint displs[2]; hypre_MPI_Datatype types[2]; block_lens[0] = num_nonzeros; block_lens[1] = num_nonzeros; types[0] = HYPRE_MPI_COMPLEX; types[1] = HYPRE_MPI_INT; hypre_MPI_Address(a_data, &displs[0]); hypre_MPI_Address(a_j, &displs[1]); hypre_MPI_Type_struct(2, block_lens, displs, types, csr_jdata_datatype); hypre_MPI_Type_commit(csr_jdata_datatype); return hypre_error_flag; } hypre-2.33.0/src/parcsr_mv/par_csr_communication.h000066400000000000000000000166051477326011500222560ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #ifndef HYPRE_PAR_CSR_COMMUNICATION_HEADER #define HYPRE_PAR_CSR_COMMUNICATION_HEADER /*-------------------------------------------------------------------------- * hypre_ParCSRCommPkg: * Structure containing information for doing communications *--------------------------------------------------------------------------*/ #ifdef HYPRE_USING_PERSISTENT_COMM typedef enum CommPkgJobType { HYPRE_COMM_PKG_JOB_COMPLEX = 0, HYPRE_COMM_PKG_JOB_COMPLEX_TRANSPOSE, HYPRE_COMM_PKG_JOB_INT, HYPRE_COMM_PKG_JOB_INT_TRANSPOSE, HYPRE_COMM_PKG_JOB_BIGINT, HYPRE_COMM_PKG_JOB_BIGINT_TRANSPOSE, NUM_OF_COMM_PKG_JOB_TYPE, } CommPkgJobType; #endif /*-------------------------------------------------------------------------- * hypre_ParCSRCommHandle, hypre_ParCSRPersistentCommHandle *--------------------------------------------------------------------------*/ struct _hypre_ParCSRCommPkg; typedef struct { struct _hypre_ParCSRCommPkg *comm_pkg; HYPRE_MemoryLocation send_memory_location; HYPRE_MemoryLocation recv_memory_location; HYPRE_Int num_send_bytes; HYPRE_Int num_recv_bytes; void *send_data; void *recv_data; void *send_data_buffer; void *recv_data_buffer; HYPRE_Int num_requests; hypre_MPI_Request *requests; } hypre_ParCSRCommHandle; typedef hypre_ParCSRCommHandle hypre_ParCSRPersistentCommHandle; typedef struct _hypre_ParCSRCommPkg { MPI_Comm comm; HYPRE_Int num_components; HYPRE_Int num_sends; HYPRE_Int *send_procs; HYPRE_Int *send_map_starts; HYPRE_Int *send_map_elmts; HYPRE_Int *device_send_map_elmts; HYPRE_Int num_recvs; HYPRE_Int *recv_procs; HYPRE_Int *recv_vec_starts; /* remote communication information */ hypre_MPI_Datatype *send_mpi_types; hypre_MPI_Datatype *recv_mpi_types; #ifdef HYPRE_USING_PERSISTENT_COMM hypre_ParCSRPersistentCommHandle *persistent_comm_handles[NUM_OF_COMM_PKG_JOB_TYPE]; #endif #if defined(HYPRE_USING_GPU) || defined(HYPRE_USING_DEVICE_OPENMP) /* temporary memory for matvec. cudaMalloc is expensive. alloc once and reuse */ HYPRE_Complex *tmp_data; HYPRE_Complex *buf_data; hypre_CSRMatrix *matrix_E; /* for matvecT */ #endif } hypre_ParCSRCommPkg; /*-------------------------------------------------------------------------- * Accessor macros: hypre_ParCSRCommPkg *--------------------------------------------------------------------------*/ #define hypre_ParCSRCommPkgComm(comm_pkg) (comm_pkg -> comm) #define hypre_ParCSRCommPkgNumComponents(comm_pkg) (comm_pkg -> num_components) #define hypre_ParCSRCommPkgNumSends(comm_pkg) (comm_pkg -> num_sends) #define hypre_ParCSRCommPkgSendProcs(comm_pkg) (comm_pkg -> send_procs) #define hypre_ParCSRCommPkgSendProc(comm_pkg, i) (comm_pkg -> send_procs[i]) #define hypre_ParCSRCommPkgSendMapStarts(comm_pkg) (comm_pkg -> send_map_starts) #define hypre_ParCSRCommPkgSendMapStart(comm_pkg,i) (comm_pkg -> send_map_starts[i]) #define hypre_ParCSRCommPkgSendMapElmts(comm_pkg) (comm_pkg -> send_map_elmts) #define hypre_ParCSRCommPkgDeviceSendMapElmts(comm_pkg) (comm_pkg -> device_send_map_elmts) #define hypre_ParCSRCommPkgSendMapElmt(comm_pkg,i) (comm_pkg -> send_map_elmts[i]) #define hypre_ParCSRCommPkgDeviceSendMapElmt(comm_pkg,i) (comm_pkg -> device_send_map_elmts[i]) #define hypre_ParCSRCommPkgNumRecvs(comm_pkg) (comm_pkg -> num_recvs) #define hypre_ParCSRCommPkgRecvProcs(comm_pkg) (comm_pkg -> recv_procs) #define hypre_ParCSRCommPkgRecvProc(comm_pkg, i) (comm_pkg -> recv_procs[i]) #define hypre_ParCSRCommPkgRecvVecStarts(comm_pkg) (comm_pkg -> recv_vec_starts) #define hypre_ParCSRCommPkgRecvVecStart(comm_pkg,i) (comm_pkg -> recv_vec_starts[i]) #define hypre_ParCSRCommPkgSendMPITypes(comm_pkg) (comm_pkg -> send_mpi_types) #define hypre_ParCSRCommPkgSendMPIType(comm_pkg,i) (comm_pkg -> send_mpi_types[i]) #define hypre_ParCSRCommPkgRecvMPITypes(comm_pkg) (comm_pkg -> recv_mpi_types) #define hypre_ParCSRCommPkgRecvMPIType(comm_pkg,i) (comm_pkg -> recv_mpi_types[i]) #if defined(HYPRE_USING_GPU) || defined(HYPRE_USING_DEVICE_OPENMP) #define hypre_ParCSRCommPkgTmpData(comm_pkg) ((comm_pkg) -> tmp_data) #define hypre_ParCSRCommPkgBufData(comm_pkg) ((comm_pkg) -> buf_data) #define hypre_ParCSRCommPkgMatrixE(comm_pkg) ((comm_pkg) -> matrix_E) #endif static inline HYPRE_MAYBE_UNUSED_FUNC void hypre_ParCSRCommPkgCopySendMapElmtsToDevice(hypre_ParCSRCommPkg *comm_pkg) { #if defined(HYPRE_USING_GPU) || defined(HYPRE_USING_DEVICE_OPENMP) HYPRE_Int num_sends = hypre_ParCSRCommPkgNumSends(comm_pkg); if (hypre_ParCSRCommPkgDeviceSendMapElmts(comm_pkg) == NULL) { hypre_ParCSRCommPkgDeviceSendMapElmts(comm_pkg) = hypre_TAlloc(HYPRE_Int, hypre_ParCSRCommPkgSendMapStart(comm_pkg, num_sends), HYPRE_MEMORY_DEVICE); hypre_TMemcpy(hypre_ParCSRCommPkgDeviceSendMapElmts(comm_pkg), hypre_ParCSRCommPkgSendMapElmts(comm_pkg), HYPRE_Int, hypre_ParCSRCommPkgSendMapStart(comm_pkg, num_sends), HYPRE_MEMORY_DEVICE, HYPRE_MEMORY_HOST); } #else HYPRE_UNUSED_VAR(comm_pkg); #endif } /*-------------------------------------------------------------------------- * Accessor macros: hypre_ParCSRCommHandle *--------------------------------------------------------------------------*/ #define hypre_ParCSRCommHandleCommPkg(comm_handle) (comm_handle -> comm_pkg) #define hypre_ParCSRCommHandleSendMemoryLocation(comm_handle) (comm_handle -> send_memory_location) #define hypre_ParCSRCommHandleRecvMemoryLocation(comm_handle) (comm_handle -> recv_memory_location) #define hypre_ParCSRCommHandleNumSendBytes(comm_handle) (comm_handle -> num_send_bytes) #define hypre_ParCSRCommHandleNumRecvBytes(comm_handle) (comm_handle -> num_recv_bytes) #define hypre_ParCSRCommHandleSendData(comm_handle) (comm_handle -> send_data) #define hypre_ParCSRCommHandleRecvData(comm_handle) (comm_handle -> recv_data) #define hypre_ParCSRCommHandleSendDataBuffer(comm_handle) (comm_handle -> send_data_buffer) #define hypre_ParCSRCommHandleRecvDataBuffer(comm_handle) (comm_handle -> recv_data_buffer) #define hypre_ParCSRCommHandleNumRequests(comm_handle) (comm_handle -> num_requests) #define hypre_ParCSRCommHandleRequests(comm_handle) (comm_handle -> requests) #define hypre_ParCSRCommHandleRequest(comm_handle, i) (comm_handle -> requests[i]) #endif /* HYPRE_PAR_CSR_COMMUNICATION_HEADER */ hypre-2.33.0/src/parcsr_mv/par_csr_fffc_device.c000066400000000000000000002723431477326011500216320ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "_hypre_onedpl.hpp" #include "_hypre_utilities.h" #include "_hypre_parcsr_mv.h" #include "_hypre_utilities.hpp" #if defined(HYPRE_USING_GPU) #if defined(HYPRE_USING_SYCL) namespace thrust = std; #endif typedef thrust::tuple Tuple; /* transform from local F/C index to global F/C index, * where F index "x" are saved as "-x-1" */ #if (defined(THRUST_VERSION) && THRUST_VERSION < 101000) struct FFFC_functor : public thrust::unary_function #else struct FFFC_functor #endif { HYPRE_BigInt CF_first[2]; FFFC_functor(HYPRE_BigInt F_first_, HYPRE_BigInt C_first_) { CF_first[1] = F_first_; CF_first[0] = C_first_; } __host__ __device__ HYPRE_BigInt operator()(const Tuple& t) const { const HYPRE_Int local_idx = thrust::get<0>(t); const HYPRE_Int cf_marker = thrust::get<1>(t); const HYPRE_Int s = cf_marker < 0; const HYPRE_Int m = 1 - 2 * s; return m * (local_idx + CF_first[s] + s); } }; /* this predicate selects A^s_{FF} */ template #if (defined(THRUST_VERSION) && THRUST_VERSION < 101000) struct FF_pred : public thrust::unary_function #else struct FF_pred #endif { HYPRE_Int option; HYPRE_Int *row_CF_marker; T *col_CF_marker; FF_pred(HYPRE_Int option_, HYPRE_Int *row_CF_marker_, T *col_CF_marker_) { option = option_; row_CF_marker = row_CF_marker_; col_CF_marker = col_CF_marker_; } __host__ __device__ bool operator()(const Tuple& t) const { const HYPRE_Int i = thrust::get<0>(t); const HYPRE_Int j = thrust::get<1>(t); if (option == 1) { /* A_{F,F} */ return row_CF_marker[i] < 0 && (j == -2 || (j >= 0 && col_CF_marker[j] < 0)); } else { /* A_{F2, F} */ return row_CF_marker[i] == -2 && (j == -2 || (j >= 0 && col_CF_marker[j] < 0)); } } }; /* this predicate selects A^s_{FC} */ template #if (defined(THRUST_VERSION) && THRUST_VERSION < 101000) struct FC_pred #else struct FC_pred : public thrust::unary_function #endif { HYPRE_Int *row_CF_marker; T *col_CF_marker; FC_pred(HYPRE_Int *row_CF_marker_, T *col_CF_marker_) { row_CF_marker = row_CF_marker_; col_CF_marker = col_CF_marker_; } __host__ __device__ bool operator()(const Tuple& t) const { const HYPRE_Int i = thrust::get<0>(t); const HYPRE_Int j = thrust::get<1>(t); return row_CF_marker[i] < 0 && (j >= 0 && col_CF_marker[j] >= 0); } }; /* this predicate selects A^s_{CF} */ template #if (defined(THRUST_VERSION) && THRUST_VERSION < 101000) struct CF_pred : public thrust::unary_function #else struct CF_pred #endif { HYPRE_Int *row_CF_marker; T *col_CF_marker; CF_pred(HYPRE_Int *row_CF_marker_, T *col_CF_marker_) { row_CF_marker = row_CF_marker_; col_CF_marker = col_CF_marker_; } __host__ __device__ bool operator()(const Tuple& t) const { const HYPRE_Int i = thrust::get<0>(t); const HYPRE_Int j = thrust::get<1>(t); return row_CF_marker[i] >= 0 && (j >= 0 && col_CF_marker[j] < 0); } }; /* this predicate selects A^s_{CC} */ template #if (defined(THRUST_VERSION) && THRUST_VERSION < 101000) struct CC_pred : public thrust::unary_function #else struct CC_pred #endif { HYPRE_Int *row_CF_marker; T *col_CF_marker; CC_pred(HYPRE_Int *row_CF_marker_, T *col_CF_marker_) { row_CF_marker = row_CF_marker_; col_CF_marker = col_CF_marker_; } __host__ __device__ bool operator()(const Tuple& t) const { const HYPRE_Int i = thrust::get<0>(t); const HYPRE_Int j = thrust::get<1>(t); return row_CF_marker[i] >= 0 && (j == -2 || (j >= 0 && col_CF_marker[j] >= 0)); } }; /* this predicate selects A^s_{C,:} */ #if (defined(THRUST_VERSION) && THRUST_VERSION < 101000) struct CX_pred : public thrust::unary_function #else struct CX_pred #endif { HYPRE_Int *row_CF_marker; CX_pred(HYPRE_Int *row_CF_marker_) { row_CF_marker = row_CF_marker_; } __host__ __device__ bool operator()(const Tuple& t) const { const HYPRE_Int i = thrust::get<0>(t); const HYPRE_Int j = thrust::get<1>(t); return row_CF_marker[i] >= 0 && (j == -2 || j >= 0); } }; /* this predicate selects A^s_{:,C} */ template #if (defined(THRUST_VERSION) && THRUST_VERSION < 101000) struct XC_pred : public thrust::unary_function #else struct XC_pred #endif { T *col_CF_marker; XC_pred(T *col_CF_marker_) { col_CF_marker = col_CF_marker_; } __host__ __device__ bool operator()(const Tuple& t) const { const HYPRE_Int i = thrust::get<0>(t); const HYPRE_Int j = thrust::get<1>(t); return (j == -2 && col_CF_marker[i] >= 0) || (j >= 0 && col_CF_marker[j] >= 0); } }; /* Option = 1: * F is marked as -1, C is +1 * | AFF AFC | * | ACF ACC | * * Option = 2 (for aggressive coarsening): * F_2 is marked as -2 in CF_marker, F_1 as -1, and C_2 as +1 * | AF1F1 AF1F2 AF1C2 | * | AF2F1 AF2F2 AF2C2 | * | AC2F1 AC2F2 AC2C2 | * F = F1 + F2 * AFC: A_{F, C2} * AFF: A_{F2, F} * ACF: A_{C2, F} * ACC: A_{C2, C2} */ HYPRE_Int hypre_ParCSRMatrixGenerateFFFCDevice_core( hypre_ParCSRMatrix *A, HYPRE_Int *CF_marker, HYPRE_BigInt *cpts_starts, hypre_ParCSRMatrix *S, hypre_ParCSRMatrix **AFC_ptr, hypre_ParCSRMatrix **AFF_ptr, hypre_ParCSRMatrix **ACF_ptr, hypre_ParCSRMatrix **ACC_ptr, HYPRE_Int option ) { MPI_Comm comm = hypre_ParCSRMatrixComm(A); if (!hypre_ParCSRMatrixCommPkg(A)) { hypre_MatvecCommPkgCreate(A); } hypre_ParCSRCommPkg *comm_pkg = hypre_ParCSRMatrixCommPkg(A); hypre_ParCSRCommHandle *comm_handle; HYPRE_Int num_sends = hypre_ParCSRCommPkgNumSends(comm_pkg); HYPRE_Int num_elem_send = hypre_ParCSRCommPkgSendMapStart(comm_pkg, num_sends); //HYPRE_MemoryLocation memory_location = hypre_ParCSRMatrixMemoryLocation(A); /* diag part of A */ hypre_CSRMatrix *A_diag = hypre_ParCSRMatrixDiag(A); HYPRE_Complex *A_diag_a = hypre_CSRMatrixData(A_diag); HYPRE_Int *A_diag_i = hypre_CSRMatrixI(A_diag); HYPRE_Int *A_diag_j = hypre_CSRMatrixJ(A_diag); HYPRE_Int A_diag_nnz = hypre_CSRMatrixNumNonzeros(A_diag); /* offd part of A */ hypre_CSRMatrix *A_offd = hypre_ParCSRMatrixOffd(A); HYPRE_Complex *A_offd_a = hypre_CSRMatrixData(A_offd); HYPRE_Int *A_offd_i = hypre_CSRMatrixI(A_offd); HYPRE_Int *A_offd_j = hypre_CSRMatrixJ(A_offd); HYPRE_Int A_offd_nnz = hypre_CSRMatrixNumNonzeros(A_offd); HYPRE_Int num_cols_A_offd = hypre_CSRMatrixNumCols(A_offd); /* SoC */ HYPRE_Int *Soc_diag_j = S ? hypre_ParCSRMatrixSocDiagJ(S) : A_diag_j; HYPRE_Int *Soc_offd_j = S ? hypre_ParCSRMatrixSocOffdJ(S) : A_offd_j; /* MPI size and rank */ HYPRE_Int my_id, num_procs; /* nF and nC */ HYPRE_Int n_local, nF_local, nC_local, nF2_local = 0; HYPRE_BigInt fpts_starts[2], *row_starts, f2pts_starts[2]; HYPRE_BigInt nF_global, nC_global, nF2_global = 0; HYPRE_BigInt F_first, C_first; /* work arrays */ HYPRE_Int *map2FC, *map2F2 = NULL, *itmp, *A_diag_ii, *A_offd_ii, *offd_mark; HYPRE_BigInt *send_buf, *recv_buf; hypre_GpuProfilingPushRange("ParCSRMatrixGenerateFFFC"); hypre_MPI_Comm_size(comm, &num_procs); hypre_MPI_Comm_rank(comm, &my_id); n_local = hypre_ParCSRMatrixNumRows(A); row_starts = hypre_ParCSRMatrixRowStarts(A); if (my_id == (num_procs - 1)) { nC_global = cpts_starts[1]; } hypre_MPI_Bcast(&nC_global, 1, HYPRE_MPI_BIG_INT, num_procs - 1, comm); nC_local = (HYPRE_Int) (cpts_starts[1] - cpts_starts[0]); fpts_starts[0] = row_starts[0] - cpts_starts[0]; fpts_starts[1] = row_starts[1] - cpts_starts[1]; F_first = fpts_starts[0]; C_first = cpts_starts[0]; nF_local = n_local - nC_local; nF_global = hypre_ParCSRMatrixGlobalNumRows(A) - nC_global; map2FC = hypre_TAlloc(HYPRE_Int, n_local, HYPRE_MEMORY_DEVICE); itmp = hypre_TAlloc(HYPRE_Int, n_local, HYPRE_MEMORY_DEVICE); recv_buf = hypre_TAlloc(HYPRE_BigInt, num_cols_A_offd, HYPRE_MEMORY_DEVICE); if (option == 2) { #if defined(HYPRE_USING_SYCL) nF2_local = HYPRE_ONEDPL_CALL( std::count, CF_marker, CF_marker + n_local, -2 ); #else nF2_local = HYPRE_THRUST_CALL( count, CF_marker, CF_marker + n_local, -2 ); #endif HYPRE_BigInt nF2_local_big = nF2_local; hypre_MPI_Scan(&nF2_local_big, f2pts_starts + 1, 1, HYPRE_MPI_BIG_INT, hypre_MPI_SUM, comm); f2pts_starts[0] = f2pts_starts[1] - nF2_local_big; if (my_id == (num_procs - 1)) { nF2_global = f2pts_starts[1]; } hypre_MPI_Bcast(&nF2_global, 1, HYPRE_MPI_BIG_INT, num_procs - 1, comm); } /* map from all points (i.e, F+C) to F/C indices */ #if defined(HYPRE_USING_SYCL) HYPRE_ONEDPL_CALL( std::exclusive_scan, oneapi::dpl::make_transform_iterator(CF_marker, is_negative()), oneapi::dpl::make_transform_iterator(CF_marker + n_local, is_negative()), map2FC, /* F */ HYPRE_Int(0) ); HYPRE_ONEDPL_CALL( std::exclusive_scan, oneapi::dpl::make_transform_iterator(CF_marker, is_nonnegative()), oneapi::dpl::make_transform_iterator(CF_marker + n_local, is_nonnegative()), itmp, /* C */ HYPRE_Int(0) ); hypreSycl_scatter_if( itmp, itmp + n_local, oneapi::dpl::counting_iterator(0), CF_marker, map2FC, is_nonnegative() ); /* FC combined */ #else HYPRE_THRUST_CALL( exclusive_scan, thrust::make_transform_iterator(CF_marker, is_negative()), thrust::make_transform_iterator(CF_marker + n_local, is_negative()), map2FC, /* F */ HYPRE_Int(0) ); /* *MUST* pass init value since input and output types diff. */ HYPRE_THRUST_CALL( exclusive_scan, thrust::make_transform_iterator(CF_marker, is_nonnegative()), thrust::make_transform_iterator(CF_marker + n_local, is_nonnegative()), itmp, /* C */ HYPRE_Int(0) ); /* *MUST* pass init value since input and output types diff. */ HYPRE_THRUST_CALL( scatter_if, itmp, itmp + n_local, thrust::counting_iterator(0), thrust::make_transform_iterator(CF_marker, is_nonnegative()), map2FC ); /* FC combined */ #endif hypre_TFree(itmp, HYPRE_MEMORY_DEVICE); if (option == 2) { map2F2 = hypre_TAlloc(HYPRE_Int, n_local, HYPRE_MEMORY_DEVICE); #if defined(HYPRE_USING_SYCL) HYPRE_ONEDPL_CALL( std::exclusive_scan, oneapi::dpl::make_transform_iterator(CF_marker, equal(-2)), oneapi::dpl::make_transform_iterator(CF_marker + n_local, equal(-2)), map2F2, /* F2 */ HYPRE_Int(0) ); /* *MUST* pass init value since input and output types diff. */ #else HYPRE_THRUST_CALL( exclusive_scan, thrust::make_transform_iterator(CF_marker, equal(-2)), thrust::make_transform_iterator(CF_marker + n_local, equal(-2)), map2F2, /* F2 */ HYPRE_Int(0) ); /* *MUST* pass init value since input and output types diff. */ #endif } /* send_buf: global F/C indices. Note F-pts "x" are saved as "-x-1" */ send_buf = hypre_TAlloc(HYPRE_BigInt, num_elem_send, HYPRE_MEMORY_DEVICE); hypre_ParCSRCommPkgCopySendMapElmtsToDevice(comm_pkg); FFFC_functor functor(F_first, C_first); #if defined(HYPRE_USING_SYCL) hypreSycl_gather( hypre_ParCSRCommPkgDeviceSendMapElmts(comm_pkg), hypre_ParCSRCommPkgDeviceSendMapElmts(comm_pkg) + num_elem_send, oneapi::dpl::make_transform_iterator( oneapi::dpl::make_zip_iterator(map2FC, CF_marker), functor), send_buf ); #else HYPRE_THRUST_CALL( gather, hypre_ParCSRCommPkgDeviceSendMapElmts(comm_pkg), hypre_ParCSRCommPkgDeviceSendMapElmts(comm_pkg) + num_elem_send, thrust::make_transform_iterator(thrust::make_zip_iterator(thrust::make_tuple(map2FC, CF_marker)), functor), send_buf ); #endif #if defined(HYPRE_USING_THRUST_NOSYNC) /* RL: make sure send_buf is ready before issuing GPU-GPU MPI */ if (hypre_GetGpuAwareMPI()) { hypre_ForceSyncComputeStream(); } #endif comm_handle = hypre_ParCSRCommHandleCreate_v2(21, comm_pkg, HYPRE_MEMORY_DEVICE, send_buf, HYPRE_MEMORY_DEVICE, recv_buf); hypre_ParCSRCommHandleDestroy(comm_handle); hypre_TFree(send_buf, HYPRE_MEMORY_DEVICE); A_diag_ii = hypre_TAlloc(HYPRE_Int, A_diag_nnz, HYPRE_MEMORY_DEVICE); A_offd_ii = hypre_TAlloc(HYPRE_Int, A_offd_nnz, HYPRE_MEMORY_DEVICE); offd_mark = hypre_TAlloc(HYPRE_Int, num_cols_A_offd, HYPRE_MEMORY_DEVICE); hypreDevice_CsrRowPtrsToIndices_v2(n_local, A_diag_nnz, A_diag_i, A_diag_ii); hypreDevice_CsrRowPtrsToIndices_v2(n_local, A_offd_nnz, A_offd_i, A_offd_ii); if (AFF_ptr) { HYPRE_Int AFF_diag_nnz, AFF_offd_nnz; HYPRE_Int *AFF_diag_ii, *AFF_diag_i, *AFF_diag_j; HYPRE_Complex *AFF_diag_a; HYPRE_Int *AFF_offd_ii, *AFF_offd_i, *AFF_offd_j; HYPRE_Complex *AFF_offd_a; hypre_ParCSRMatrix *AFF; hypre_CSRMatrix *AFF_diag, *AFF_offd; HYPRE_BigInt *col_map_offd_AFF; HYPRE_Int num_cols_AFF_offd; /* AFF Diag */ FF_pred AFF_pred_diag(option, CF_marker, CF_marker); #if defined(HYPRE_USING_SYCL) AFF_diag_nnz = HYPRE_ONEDPL_CALL( std::count_if, oneapi::dpl::make_zip_iterator(A_diag_ii, Soc_diag_j), oneapi::dpl::make_zip_iterator(A_diag_ii, Soc_diag_j) + A_diag_nnz, AFF_pred_diag ); #else AFF_diag_nnz = HYPRE_THRUST_CALL( count_if, thrust::make_zip_iterator(thrust::make_tuple(A_diag_ii, Soc_diag_j)), thrust::make_zip_iterator(thrust::make_tuple(A_diag_ii, Soc_diag_j)) + A_diag_nnz, AFF_pred_diag ); #endif AFF_diag_ii = hypre_TAlloc(HYPRE_Int, AFF_diag_nnz, HYPRE_MEMORY_DEVICE); AFF_diag_j = hypre_TAlloc(HYPRE_Int, AFF_diag_nnz, HYPRE_MEMORY_DEVICE); AFF_diag_a = hypre_TAlloc(HYPRE_Complex, AFF_diag_nnz, HYPRE_MEMORY_DEVICE); #if defined(HYPRE_USING_SYCL) /* Notice that we cannot use Soc_diag_j in the first two arguments since the diagonal is marked as -2 */ auto new_end = hypreSycl_copy_if( oneapi::dpl::make_zip_iterator(A_diag_ii, A_diag_j, A_diag_a), oneapi::dpl::make_zip_iterator(A_diag_ii, A_diag_j, A_diag_a) + A_diag_nnz, oneapi::dpl::make_zip_iterator(A_diag_ii, Soc_diag_j), oneapi::dpl::make_zip_iterator(AFF_diag_ii, AFF_diag_j, AFF_diag_a), AFF_pred_diag ); hypre_assert( std::get<0>(new_end.base()) == AFF_diag_ii + AFF_diag_nnz ); hypreSycl_gather( AFF_diag_j, AFF_diag_j + AFF_diag_nnz, map2FC, AFF_diag_j ); hypreSycl_gather( AFF_diag_ii, AFF_diag_ii + AFF_diag_nnz, option == 1 ? map2FC : map2F2, AFF_diag_ii ); #else /* Notice that we cannot use Soc_diag_j in the first two arguments since the diagonal is marked as -2 */ auto new_end = HYPRE_THRUST_CALL( copy_if, thrust::make_zip_iterator(thrust::make_tuple(A_diag_ii, A_diag_j, A_diag_a)), thrust::make_zip_iterator(thrust::make_tuple(A_diag_ii, A_diag_j, A_diag_a)) + A_diag_nnz, thrust::make_zip_iterator(thrust::make_tuple(A_diag_ii, Soc_diag_j)), thrust::make_zip_iterator(thrust::make_tuple(AFF_diag_ii, AFF_diag_j, AFF_diag_a)), AFF_pred_diag ); hypre_assert( thrust::get<0>(new_end.get_iterator_tuple()) == AFF_diag_ii + AFF_diag_nnz ); HYPRE_THRUST_CALL ( gather, AFF_diag_j, AFF_diag_j + AFF_diag_nnz, map2FC, AFF_diag_j ); HYPRE_THRUST_CALL ( gather, AFF_diag_ii, AFF_diag_ii + AFF_diag_nnz, option == 1 ? map2FC : map2F2, AFF_diag_ii ); #endif AFF_diag_i = hypreDevice_CsrRowIndicesToPtrs(option == 1 ? nF_local : nF2_local, AFF_diag_nnz, AFF_diag_ii); hypre_TFree(AFF_diag_ii, HYPRE_MEMORY_DEVICE); /* AFF Offd */ FF_pred AFF_pred_offd(option, CF_marker, recv_buf); #if defined(HYPRE_USING_SYCL) AFF_offd_nnz = HYPRE_ONEDPL_CALL( std::count_if, oneapi::dpl::make_zip_iterator(A_offd_ii, Soc_offd_j), oneapi::dpl::make_zip_iterator(A_offd_ii, Soc_offd_j) + A_offd_nnz, AFF_pred_offd ); #else AFF_offd_nnz = HYPRE_THRUST_CALL( count_if, thrust::make_zip_iterator(thrust::make_tuple(A_offd_ii, Soc_offd_j)), thrust::make_zip_iterator(thrust::make_tuple(A_offd_ii, Soc_offd_j)) + A_offd_nnz, AFF_pred_offd ); #endif AFF_offd_ii = hypre_TAlloc(HYPRE_Int, AFF_offd_nnz, HYPRE_MEMORY_DEVICE); AFF_offd_j = hypre_TAlloc(HYPRE_Int, AFF_offd_nnz, HYPRE_MEMORY_DEVICE); AFF_offd_a = hypre_TAlloc(HYPRE_Complex, AFF_offd_nnz, HYPRE_MEMORY_DEVICE); #if defined(HYPRE_USING_SYCL) new_end = hypreSycl_copy_if( oneapi::dpl::make_zip_iterator(A_offd_ii, Soc_offd_j, A_offd_a), oneapi::dpl::make_zip_iterator(A_offd_ii, Soc_offd_j, A_offd_a) + A_offd_nnz, oneapi::dpl::make_zip_iterator(A_offd_ii, Soc_offd_j), oneapi::dpl::make_zip_iterator(AFF_offd_ii, AFF_offd_j, AFF_offd_a), AFF_pred_offd ); hypre_assert( std::get<0>(new_end.base()) == AFF_offd_ii + AFF_offd_nnz ); hypreSycl_gather( AFF_offd_ii, AFF_offd_ii + AFF_offd_nnz, option == 1 ? map2FC : map2F2, AFF_offd_ii ); #else new_end = HYPRE_THRUST_CALL( copy_if, thrust::make_zip_iterator(thrust::make_tuple(A_offd_ii, Soc_offd_j, A_offd_a)), thrust::make_zip_iterator(thrust::make_tuple(A_offd_ii, Soc_offd_j, A_offd_a)) + A_offd_nnz, thrust::make_zip_iterator(thrust::make_tuple(A_offd_ii, Soc_offd_j)), thrust::make_zip_iterator(thrust::make_tuple(AFF_offd_ii, AFF_offd_j, AFF_offd_a)), AFF_pred_offd ); hypre_assert( thrust::get<0>(new_end.get_iterator_tuple()) == AFF_offd_ii + AFF_offd_nnz ); HYPRE_THRUST_CALL ( gather, AFF_offd_ii, AFF_offd_ii + AFF_offd_nnz, option == 1 ? map2FC : map2F2, AFF_offd_ii ); #endif AFF_offd_i = hypreDevice_CsrRowIndicesToPtrs(option == 1 ? nF_local : nF2_local, AFF_offd_nnz, AFF_offd_ii); hypre_TFree(AFF_offd_ii, HYPRE_MEMORY_DEVICE); /* col_map_offd_AFF */ HYPRE_Int *tmp_j = hypre_TAlloc(HYPRE_Int, hypre_max(AFF_offd_nnz, num_cols_A_offd), HYPRE_MEMORY_DEVICE); hypre_TMemcpy(tmp_j, AFF_offd_j, HYPRE_Int, AFF_offd_nnz, HYPRE_MEMORY_DEVICE, HYPRE_MEMORY_DEVICE); #if defined(HYPRE_USING_SYCL) HYPRE_ONEDPL_CALL( std::sort, tmp_j, tmp_j + AFF_offd_nnz ); HYPRE_Int *tmp_end = HYPRE_ONEDPL_CALL( std::unique, tmp_j, tmp_j + AFF_offd_nnz ); num_cols_AFF_offd = tmp_end - tmp_j; HYPRE_ONEDPL_CALL( std::fill_n, offd_mark, num_cols_A_offd, 0 ); hypreDevice_ScatterConstant(offd_mark, num_cols_AFF_offd, tmp_j, (HYPRE_Int) 1); HYPRE_ONEDPL_CALL( std::exclusive_scan, offd_mark, offd_mark + num_cols_A_offd, tmp_j, 0 ); hypreSycl_gather( AFF_offd_j, AFF_offd_j + AFF_offd_nnz, tmp_j, AFF_offd_j ); col_map_offd_AFF = hypre_TAlloc(HYPRE_BigInt, num_cols_AFF_offd, HYPRE_MEMORY_DEVICE); HYPRE_BigInt *tmp_end_big = hypreSycl_copy_if( recv_buf, recv_buf + num_cols_A_offd, offd_mark, col_map_offd_AFF, [] (const auto & x) {return x;} ); HYPRE_ONEDPL_CALL( std::transform, col_map_offd_AFF, col_map_offd_AFF + num_cols_AFF_offd, col_map_offd_AFF, [] (auto const & x) { return -x - 1; } ); hypre_assert(tmp_end_big - col_map_offd_AFF == num_cols_AFF_offd); #else HYPRE_THRUST_CALL( sort, tmp_j, tmp_j + AFF_offd_nnz ); HYPRE_Int *tmp_end = HYPRE_THRUST_CALL( unique, tmp_j, tmp_j + AFF_offd_nnz ); num_cols_AFF_offd = tmp_end - tmp_j; hypreDevice_IntFilln( offd_mark, num_cols_A_offd, 0 ); hypreDevice_ScatterConstant(offd_mark, num_cols_AFF_offd, tmp_j, (HYPRE_Int) 1); HYPRE_THRUST_CALL( exclusive_scan, offd_mark, offd_mark + num_cols_A_offd, tmp_j ); HYPRE_THRUST_CALL( gather, AFF_offd_j, AFF_offd_j + AFF_offd_nnz, tmp_j, AFF_offd_j ); col_map_offd_AFF = hypre_TAlloc(HYPRE_BigInt, num_cols_AFF_offd, HYPRE_MEMORY_DEVICE); HYPRE_BigInt *tmp_end_big = HYPRE_THRUST_CALL( copy_if, thrust::make_transform_iterator(recv_buf, -_1 - 1), thrust::make_transform_iterator(recv_buf, -_1 - 1) + num_cols_A_offd, offd_mark, col_map_offd_AFF, thrust::identity() ); hypre_assert(tmp_end_big - col_map_offd_AFF == num_cols_AFF_offd); #endif hypre_TFree(tmp_j, HYPRE_MEMORY_DEVICE); AFF = hypre_ParCSRMatrixCreate(comm, option == 1 ? nF_global : nF2_global, nF_global, option == 1 ? fpts_starts : f2pts_starts, fpts_starts, num_cols_AFF_offd, AFF_diag_nnz, AFF_offd_nnz); AFF_diag = hypre_ParCSRMatrixDiag(AFF); hypre_CSRMatrixData(AFF_diag) = AFF_diag_a; hypre_CSRMatrixI(AFF_diag) = AFF_diag_i; hypre_CSRMatrixJ(AFF_diag) = AFF_diag_j; AFF_offd = hypre_ParCSRMatrixOffd(AFF); hypre_CSRMatrixData(AFF_offd) = AFF_offd_a; hypre_CSRMatrixI(AFF_offd) = AFF_offd_i; hypre_CSRMatrixJ(AFF_offd) = AFF_offd_j; hypre_CSRMatrixMemoryLocation(AFF_diag) = HYPRE_MEMORY_DEVICE; hypre_CSRMatrixMemoryLocation(AFF_offd) = HYPRE_MEMORY_DEVICE; hypre_ParCSRMatrixDeviceColMapOffd(AFF) = col_map_offd_AFF; hypre_ParCSRMatrixColMapOffd(AFF) = hypre_TAlloc(HYPRE_BigInt, num_cols_AFF_offd, HYPRE_MEMORY_HOST); hypre_TMemcpy(hypre_ParCSRMatrixColMapOffd(AFF), col_map_offd_AFF, HYPRE_BigInt, num_cols_AFF_offd, HYPRE_MEMORY_HOST, HYPRE_MEMORY_DEVICE); hypre_ParCSRMatrixSetNumNonzeros(AFF); hypre_ParCSRMatrixDNumNonzeros(AFF) = (HYPRE_Real) hypre_ParCSRMatrixNumNonzeros(AFF); hypre_MatvecCommPkgCreate(AFF); *AFF_ptr = AFF; } if (AFC_ptr) { HYPRE_Int AFC_diag_nnz, AFC_offd_nnz; HYPRE_Int *AFC_diag_ii, *AFC_diag_i, *AFC_diag_j; HYPRE_Complex *AFC_diag_a; HYPRE_Int *AFC_offd_ii, *AFC_offd_i, *AFC_offd_j; HYPRE_Complex *AFC_offd_a; hypre_ParCSRMatrix *AFC; hypre_CSRMatrix *AFC_diag, *AFC_offd; HYPRE_BigInt *col_map_offd_AFC; HYPRE_Int num_cols_AFC_offd; /* AFC Diag */ FC_pred AFC_pred_diag(CF_marker, CF_marker); #if defined(HYPRE_USING_SYCL) AFC_diag_nnz = HYPRE_ONEDPL_CALL( std::count_if, oneapi::dpl::make_zip_iterator(A_diag_ii, Soc_diag_j), oneapi::dpl::make_zip_iterator(A_diag_ii, Soc_diag_j) + A_diag_nnz, AFC_pred_diag ); #else AFC_diag_nnz = HYPRE_THRUST_CALL( count_if, thrust::make_zip_iterator(thrust::make_tuple(A_diag_ii, Soc_diag_j)), thrust::make_zip_iterator(thrust::make_tuple(A_diag_ii, Soc_diag_j)) + A_diag_nnz, AFC_pred_diag ); #endif AFC_diag_ii = hypre_TAlloc(HYPRE_Int, AFC_diag_nnz, HYPRE_MEMORY_DEVICE); AFC_diag_j = hypre_TAlloc(HYPRE_Int, AFC_diag_nnz, HYPRE_MEMORY_DEVICE); AFC_diag_a = hypre_TAlloc(HYPRE_Complex, AFC_diag_nnz, HYPRE_MEMORY_DEVICE); #if defined(HYPRE_USING_SYCL) auto new_end = hypreSycl_copy_if( oneapi::dpl::make_zip_iterator(A_diag_ii, Soc_diag_j, A_diag_a), oneapi::dpl::make_zip_iterator(A_diag_ii, Soc_diag_j, A_diag_a) + A_diag_nnz, oneapi::dpl::make_zip_iterator(A_diag_ii, Soc_diag_j), oneapi::dpl::make_zip_iterator(AFC_diag_ii, AFC_diag_j, AFC_diag_a), AFC_pred_diag ); hypre_assert( std::get<0>(new_end.base()) == AFC_diag_ii + AFC_diag_nnz ); hypreSycl_gather( AFC_diag_j, AFC_diag_j + AFC_diag_nnz, map2FC, AFC_diag_j ); hypreSycl_gather( AFC_diag_ii, AFC_diag_ii + AFC_diag_nnz, map2FC, AFC_diag_ii ); #else auto new_end = HYPRE_THRUST_CALL( copy_if, thrust::make_zip_iterator(thrust::make_tuple(A_diag_ii, Soc_diag_j, A_diag_a)), thrust::make_zip_iterator(thrust::make_tuple(A_diag_ii, Soc_diag_j, A_diag_a)) + A_diag_nnz, thrust::make_zip_iterator(thrust::make_tuple(A_diag_ii, Soc_diag_j)), thrust::make_zip_iterator(thrust::make_tuple(AFC_diag_ii, AFC_diag_j, AFC_diag_a)), AFC_pred_diag ); hypre_assert( thrust::get<0>(new_end.get_iterator_tuple()) == AFC_diag_ii + AFC_diag_nnz ); HYPRE_THRUST_CALL ( gather, AFC_diag_j, AFC_diag_j + AFC_diag_nnz, map2FC, AFC_diag_j ); HYPRE_THRUST_CALL ( gather, AFC_diag_ii, AFC_diag_ii + AFC_diag_nnz, map2FC, AFC_diag_ii ); #endif AFC_diag_i = hypreDevice_CsrRowIndicesToPtrs(nF_local, AFC_diag_nnz, AFC_diag_ii); hypre_TFree(AFC_diag_ii, HYPRE_MEMORY_DEVICE); /* AFC Offd */ FC_pred AFC_pred_offd(CF_marker, recv_buf); #if defined(HYPRE_USING_SYCL) AFC_offd_nnz = HYPRE_ONEDPL_CALL( std::count_if, oneapi::dpl::make_zip_iterator(A_offd_ii, Soc_offd_j), oneapi::dpl::make_zip_iterator(A_offd_ii, Soc_offd_j) + A_offd_nnz, AFC_pred_offd ); #else AFC_offd_nnz = HYPRE_THRUST_CALL( count_if, thrust::make_zip_iterator(thrust::make_tuple(A_offd_ii, Soc_offd_j)), thrust::make_zip_iterator(thrust::make_tuple(A_offd_ii, Soc_offd_j)) + A_offd_nnz, AFC_pred_offd ); #endif AFC_offd_ii = hypre_TAlloc(HYPRE_Int, AFC_offd_nnz, HYPRE_MEMORY_DEVICE); AFC_offd_j = hypre_TAlloc(HYPRE_Int, AFC_offd_nnz, HYPRE_MEMORY_DEVICE); AFC_offd_a = hypre_TAlloc(HYPRE_Complex, AFC_offd_nnz, HYPRE_MEMORY_DEVICE); #if defined(HYPRE_USING_SYCL) new_end = hypreSycl_copy_if( oneapi::dpl::make_zip_iterator(A_offd_ii, Soc_offd_j, A_offd_a), oneapi::dpl::make_zip_iterator(A_offd_ii, Soc_offd_j, A_offd_a) + A_offd_nnz, oneapi::dpl::make_zip_iterator(A_offd_ii, Soc_offd_j), oneapi::dpl::make_zip_iterator(AFC_offd_ii, AFC_offd_j, AFC_offd_a), AFC_pred_offd ); hypre_assert( std::get<0>(new_end.base()) == AFC_offd_ii + AFC_offd_nnz ); hypreSycl_gather( AFC_offd_ii, AFC_offd_ii + AFC_offd_nnz, map2FC, AFC_offd_ii ); #else new_end = HYPRE_THRUST_CALL( copy_if, thrust::make_zip_iterator(thrust::make_tuple(A_offd_ii, Soc_offd_j, A_offd_a)), thrust::make_zip_iterator(thrust::make_tuple(A_offd_ii, Soc_offd_j, A_offd_a)) + A_offd_nnz, thrust::make_zip_iterator(thrust::make_tuple(A_offd_ii, Soc_offd_j)), thrust::make_zip_iterator(thrust::make_tuple(AFC_offd_ii, AFC_offd_j, AFC_offd_a)), AFC_pred_offd ); hypre_assert( thrust::get<0>(new_end.get_iterator_tuple()) == AFC_offd_ii + AFC_offd_nnz ); HYPRE_THRUST_CALL ( gather, AFC_offd_ii, AFC_offd_ii + AFC_offd_nnz, map2FC, AFC_offd_ii ); #endif AFC_offd_i = hypreDevice_CsrRowIndicesToPtrs(nF_local, AFC_offd_nnz, AFC_offd_ii); hypre_TFree(AFC_offd_ii, HYPRE_MEMORY_DEVICE); /* col_map_offd_AFC */ HYPRE_Int *tmp_j = hypre_TAlloc(HYPRE_Int, hypre_max(AFC_offd_nnz, num_cols_A_offd), HYPRE_MEMORY_DEVICE); hypre_TMemcpy(tmp_j, AFC_offd_j, HYPRE_Int, AFC_offd_nnz, HYPRE_MEMORY_DEVICE, HYPRE_MEMORY_DEVICE); #if defined(HYPRE_USING_SYCL) HYPRE_ONEDPL_CALL( std::sort, tmp_j, tmp_j + AFC_offd_nnz ); HYPRE_Int *tmp_end = HYPRE_ONEDPL_CALL( std::unique, tmp_j, tmp_j + AFC_offd_nnz ); num_cols_AFC_offd = tmp_end - tmp_j; HYPRE_ONEDPL_CALL( std::fill_n, offd_mark, num_cols_A_offd, 0 ); hypreDevice_ScatterConstant(offd_mark, num_cols_AFC_offd, tmp_j, (HYPRE_Int) 1); HYPRE_ONEDPL_CALL( std::exclusive_scan, offd_mark, offd_mark + num_cols_A_offd, tmp_j, 0); hypreSycl_gather( AFC_offd_j, AFC_offd_j + AFC_offd_nnz, tmp_j, AFC_offd_j ); col_map_offd_AFC = hypre_TAlloc(HYPRE_BigInt, num_cols_AFC_offd, HYPRE_MEMORY_DEVICE); HYPRE_BigInt *tmp_end_big = hypreSycl_copy_if( recv_buf, recv_buf + num_cols_A_offd, offd_mark, col_map_offd_AFC, [] (const auto & x) {return x;}); #else HYPRE_THRUST_CALL( sort, tmp_j, tmp_j + AFC_offd_nnz ); HYPRE_Int *tmp_end = HYPRE_THRUST_CALL( unique, tmp_j, tmp_j + AFC_offd_nnz ); num_cols_AFC_offd = tmp_end - tmp_j; hypreDevice_IntFilln( offd_mark, num_cols_A_offd, 0 ); hypreDevice_ScatterConstant(offd_mark, num_cols_AFC_offd, tmp_j, (HYPRE_Int) 1); HYPRE_THRUST_CALL( exclusive_scan, offd_mark, offd_mark + num_cols_A_offd, tmp_j); HYPRE_THRUST_CALL( gather, AFC_offd_j, AFC_offd_j + AFC_offd_nnz, tmp_j, AFC_offd_j ); col_map_offd_AFC = hypre_TAlloc(HYPRE_BigInt, num_cols_AFC_offd, HYPRE_MEMORY_DEVICE); HYPRE_BigInt *tmp_end_big = HYPRE_THRUST_CALL( copy_if, recv_buf, recv_buf + num_cols_A_offd, offd_mark, col_map_offd_AFC, thrust::identity()); #endif hypre_assert(tmp_end_big - col_map_offd_AFC == num_cols_AFC_offd); hypre_TFree(tmp_j, HYPRE_MEMORY_DEVICE); /* AFC */ AFC = hypre_ParCSRMatrixCreate(comm, nF_global, nC_global, fpts_starts, cpts_starts, num_cols_AFC_offd, AFC_diag_nnz, AFC_offd_nnz); AFC_diag = hypre_ParCSRMatrixDiag(AFC); hypre_CSRMatrixData(AFC_diag) = AFC_diag_a; hypre_CSRMatrixI(AFC_diag) = AFC_diag_i; hypre_CSRMatrixJ(AFC_diag) = AFC_diag_j; AFC_offd = hypre_ParCSRMatrixOffd(AFC); hypre_CSRMatrixData(AFC_offd) = AFC_offd_a; hypre_CSRMatrixI(AFC_offd) = AFC_offd_i; hypre_CSRMatrixJ(AFC_offd) = AFC_offd_j; hypre_CSRMatrixMemoryLocation(AFC_diag) = HYPRE_MEMORY_DEVICE; hypre_CSRMatrixMemoryLocation(AFC_offd) = HYPRE_MEMORY_DEVICE; hypre_ParCSRMatrixDeviceColMapOffd(AFC) = col_map_offd_AFC; hypre_ParCSRMatrixColMapOffd(AFC) = hypre_TAlloc(HYPRE_BigInt, num_cols_AFC_offd, HYPRE_MEMORY_HOST); hypre_TMemcpy(hypre_ParCSRMatrixColMapOffd(AFC), col_map_offd_AFC, HYPRE_BigInt, num_cols_AFC_offd, HYPRE_MEMORY_HOST, HYPRE_MEMORY_DEVICE); hypre_ParCSRMatrixSetNumNonzeros(AFC); hypre_ParCSRMatrixDNumNonzeros(AFC) = (HYPRE_Real) hypre_ParCSRMatrixNumNonzeros(AFC); hypre_MatvecCommPkgCreate(AFC); *AFC_ptr = AFC; } if (ACF_ptr) { HYPRE_Int ACF_diag_nnz, ACF_offd_nnz; HYPRE_Int *ACF_diag_ii, *ACF_diag_i, *ACF_diag_j; HYPRE_Complex *ACF_diag_a; HYPRE_Int *ACF_offd_ii, *ACF_offd_i, *ACF_offd_j; HYPRE_Complex *ACF_offd_a; hypre_ParCSRMatrix *ACF; hypre_CSRMatrix *ACF_diag, *ACF_offd; HYPRE_BigInt *col_map_offd_ACF; HYPRE_Int num_cols_ACF_offd; /* ACF Diag */ CF_pred ACF_pred_diag(CF_marker, CF_marker); #if defined(HYPRE_USING_SYCL) ACF_diag_nnz = HYPRE_ONEDPL_CALL( std::count_if, oneapi::dpl::make_zip_iterator(A_diag_ii, Soc_diag_j), oneapi::dpl::make_zip_iterator(A_diag_ii, Soc_diag_j) + A_diag_nnz, ACF_pred_diag ); #else ACF_diag_nnz = HYPRE_THRUST_CALL( count_if, thrust::make_zip_iterator(thrust::make_tuple(A_diag_ii, Soc_diag_j)), thrust::make_zip_iterator(thrust::make_tuple(A_diag_ii, Soc_diag_j)) + A_diag_nnz, ACF_pred_diag ); #endif ACF_diag_ii = hypre_TAlloc(HYPRE_Int, ACF_diag_nnz, HYPRE_MEMORY_DEVICE); ACF_diag_j = hypre_TAlloc(HYPRE_Int, ACF_diag_nnz, HYPRE_MEMORY_DEVICE); ACF_diag_a = hypre_TAlloc(HYPRE_Complex, ACF_diag_nnz, HYPRE_MEMORY_DEVICE); #if defined(HYPRE_USING_SYCL) auto new_end = hypreSycl_copy_if( oneapi::dpl::make_zip_iterator(A_diag_ii, Soc_diag_j, A_diag_a), oneapi::dpl::make_zip_iterator(A_diag_ii, Soc_diag_j, A_diag_a) + A_diag_nnz, oneapi::dpl::make_zip_iterator(A_diag_ii, Soc_diag_j), oneapi::dpl::make_zip_iterator(ACF_diag_ii, ACF_diag_j, ACF_diag_a), ACF_pred_diag ); hypre_assert( std::get<0>(new_end.base()) == ACF_diag_ii + ACF_diag_nnz ); hypreSycl_gather( ACF_diag_j, ACF_diag_j + ACF_diag_nnz, map2FC, ACF_diag_j ); hypreSycl_gather( ACF_diag_ii, ACF_diag_ii + ACF_diag_nnz, map2FC, ACF_diag_ii ); #else auto new_end = HYPRE_THRUST_CALL( copy_if, thrust::make_zip_iterator(thrust::make_tuple(A_diag_ii, Soc_diag_j, A_diag_a)), thrust::make_zip_iterator(thrust::make_tuple(A_diag_ii, Soc_diag_j, A_diag_a)) + A_diag_nnz, thrust::make_zip_iterator(thrust::make_tuple(A_diag_ii, Soc_diag_j)), thrust::make_zip_iterator(thrust::make_tuple(ACF_diag_ii, ACF_diag_j, ACF_diag_a)), ACF_pred_diag ); hypre_assert( thrust::get<0>(new_end.get_iterator_tuple()) == ACF_diag_ii + ACF_diag_nnz ); HYPRE_THRUST_CALL ( gather, ACF_diag_j, ACF_diag_j + ACF_diag_nnz, map2FC, ACF_diag_j ); HYPRE_THRUST_CALL ( gather, ACF_diag_ii, ACF_diag_ii + ACF_diag_nnz, map2FC, ACF_diag_ii ); #endif ACF_diag_i = hypreDevice_CsrRowIndicesToPtrs(nC_local, ACF_diag_nnz, ACF_diag_ii); hypre_TFree(ACF_diag_ii, HYPRE_MEMORY_DEVICE); /* ACF Offd */ CF_pred ACF_pred_offd(CF_marker, recv_buf); #if defined(HYPRE_USING_SYCL) ACF_offd_nnz = HYPRE_ONEDPL_CALL( std::count_if, oneapi::dpl::make_zip_iterator(A_offd_ii, Soc_offd_j), oneapi::dpl::make_zip_iterator(A_offd_ii, Soc_offd_j) + A_offd_nnz, ACF_pred_offd ); #else ACF_offd_nnz = HYPRE_THRUST_CALL( count_if, thrust::make_zip_iterator(thrust::make_tuple(A_offd_ii, Soc_offd_j)), thrust::make_zip_iterator(thrust::make_tuple(A_offd_ii, Soc_offd_j)) + A_offd_nnz, ACF_pred_offd ); #endif ACF_offd_ii = hypre_TAlloc(HYPRE_Int, ACF_offd_nnz, HYPRE_MEMORY_DEVICE); ACF_offd_j = hypre_TAlloc(HYPRE_Int, ACF_offd_nnz, HYPRE_MEMORY_DEVICE); ACF_offd_a = hypre_TAlloc(HYPRE_Complex, ACF_offd_nnz, HYPRE_MEMORY_DEVICE); #if defined(HYPRE_USING_SYCL) new_end = hypreSycl_copy_if( oneapi::dpl::make_zip_iterator(A_offd_ii, Soc_offd_j, A_offd_a), oneapi::dpl::make_zip_iterator(A_offd_ii, Soc_offd_j, A_offd_a) + A_offd_nnz, oneapi::dpl::make_zip_iterator(A_offd_ii, Soc_offd_j), oneapi::dpl::make_zip_iterator(ACF_offd_ii, ACF_offd_j, ACF_offd_a), ACF_pred_offd ); hypre_assert( std::get<0>(new_end.base()) == ACF_offd_ii + ACF_offd_nnz ); hypreSycl_gather( ACF_offd_ii, ACF_offd_ii + ACF_offd_nnz, map2FC, ACF_offd_ii ); #else new_end = HYPRE_THRUST_CALL( copy_if, thrust::make_zip_iterator(thrust::make_tuple(A_offd_ii, Soc_offd_j, A_offd_a)), thrust::make_zip_iterator(thrust::make_tuple(A_offd_ii, Soc_offd_j, A_offd_a)) + A_offd_nnz, thrust::make_zip_iterator(thrust::make_tuple(A_offd_ii, Soc_offd_j)), thrust::make_zip_iterator(thrust::make_tuple(ACF_offd_ii, ACF_offd_j, ACF_offd_a)), ACF_pred_offd ); hypre_assert( thrust::get<0>(new_end.get_iterator_tuple()) == ACF_offd_ii + ACF_offd_nnz ); HYPRE_THRUST_CALL ( gather, ACF_offd_ii, ACF_offd_ii + ACF_offd_nnz, map2FC, ACF_offd_ii ); #endif ACF_offd_i = hypreDevice_CsrRowIndicesToPtrs(nC_local, ACF_offd_nnz, ACF_offd_ii); hypre_TFree(ACF_offd_ii, HYPRE_MEMORY_DEVICE); /* col_map_offd_ACF */ HYPRE_Int *tmp_j = hypre_TAlloc(HYPRE_Int, hypre_max(ACF_offd_nnz, num_cols_A_offd), HYPRE_MEMORY_DEVICE); hypre_TMemcpy(tmp_j, ACF_offd_j, HYPRE_Int, ACF_offd_nnz, HYPRE_MEMORY_DEVICE, HYPRE_MEMORY_DEVICE); #if defined(HYPRE_USING_SYCL) HYPRE_ONEDPL_CALL( std::sort, tmp_j, tmp_j + ACF_offd_nnz ); HYPRE_Int *tmp_end = HYPRE_ONEDPL_CALL( std::unique, tmp_j, tmp_j + ACF_offd_nnz ); num_cols_ACF_offd = tmp_end - tmp_j; HYPRE_ONEDPL_CALL( std::fill_n, offd_mark, num_cols_A_offd, 0 ); hypreDevice_ScatterConstant(offd_mark, num_cols_ACF_offd, tmp_j, (HYPRE_Int) 1); HYPRE_ONEDPL_CALL( std::exclusive_scan, offd_mark, offd_mark + num_cols_A_offd, tmp_j, 0); hypreSycl_gather( ACF_offd_j, ACF_offd_j + ACF_offd_nnz, tmp_j, ACF_offd_j ); col_map_offd_ACF = hypre_TAlloc(HYPRE_BigInt, num_cols_ACF_offd, HYPRE_MEMORY_DEVICE); HYPRE_BigInt *tmp_end_big = hypreSycl_copy_if( recv_buf, recv_buf + num_cols_A_offd, offd_mark, col_map_offd_ACF, [] (const auto & x) {return x;} ); HYPRE_ONEDPL_CALL( std::transform, col_map_offd_ACF, col_map_offd_ACF + num_cols_ACF_offd, col_map_offd_ACF, [] (const auto & x) {return -x - 1;} ); #else HYPRE_THRUST_CALL( sort, tmp_j, tmp_j + ACF_offd_nnz ); HYPRE_Int *tmp_end = HYPRE_THRUST_CALL( unique, tmp_j, tmp_j + ACF_offd_nnz ); num_cols_ACF_offd = tmp_end - tmp_j; hypreDevice_IntFilln( offd_mark, num_cols_A_offd, 0 ); hypreDevice_ScatterConstant(offd_mark, num_cols_ACF_offd, tmp_j, (HYPRE_Int) 1); HYPRE_THRUST_CALL( exclusive_scan, offd_mark, offd_mark + num_cols_A_offd, tmp_j); HYPRE_THRUST_CALL( gather, ACF_offd_j, ACF_offd_j + ACF_offd_nnz, tmp_j, ACF_offd_j ); col_map_offd_ACF = hypre_TAlloc(HYPRE_BigInt, num_cols_ACF_offd, HYPRE_MEMORY_DEVICE); HYPRE_BigInt *tmp_end_big = HYPRE_THRUST_CALL( copy_if, thrust::make_transform_iterator(recv_buf, -_1 - 1), thrust::make_transform_iterator(recv_buf, -_1 - 1) + num_cols_A_offd, offd_mark, col_map_offd_ACF, thrust::identity()); #endif hypre_assert(tmp_end_big - col_map_offd_ACF == num_cols_ACF_offd); hypre_TFree(tmp_j, HYPRE_MEMORY_DEVICE); /* ACF */ ACF = hypre_ParCSRMatrixCreate(comm, nC_global, nF_global, cpts_starts, fpts_starts, num_cols_ACF_offd, ACF_diag_nnz, ACF_offd_nnz); ACF_diag = hypre_ParCSRMatrixDiag(ACF); hypre_CSRMatrixData(ACF_diag) = ACF_diag_a; hypre_CSRMatrixI(ACF_diag) = ACF_diag_i; hypre_CSRMatrixJ(ACF_diag) = ACF_diag_j; ACF_offd = hypre_ParCSRMatrixOffd(ACF); hypre_CSRMatrixData(ACF_offd) = ACF_offd_a; hypre_CSRMatrixI(ACF_offd) = ACF_offd_i; hypre_CSRMatrixJ(ACF_offd) = ACF_offd_j; hypre_CSRMatrixMemoryLocation(ACF_diag) = HYPRE_MEMORY_DEVICE; hypre_CSRMatrixMemoryLocation(ACF_offd) = HYPRE_MEMORY_DEVICE; hypre_ParCSRMatrixDeviceColMapOffd(ACF) = col_map_offd_ACF; hypre_ParCSRMatrixColMapOffd(ACF) = hypre_TAlloc(HYPRE_BigInt, num_cols_ACF_offd, HYPRE_MEMORY_HOST); hypre_TMemcpy(hypre_ParCSRMatrixColMapOffd(ACF), col_map_offd_ACF, HYPRE_BigInt, num_cols_ACF_offd, HYPRE_MEMORY_HOST, HYPRE_MEMORY_DEVICE); hypre_ParCSRMatrixSetNumNonzeros(ACF); hypre_ParCSRMatrixDNumNonzeros(ACF) = (HYPRE_Real) hypre_ParCSRMatrixNumNonzeros(ACF); hypre_MatvecCommPkgCreate(ACF); *ACF_ptr = ACF; } if (ACC_ptr) { HYPRE_Int ACC_diag_nnz, ACC_offd_nnz; HYPRE_Int *ACC_diag_ii, *ACC_diag_i, *ACC_diag_j; HYPRE_Complex *ACC_diag_a; HYPRE_Int *ACC_offd_ii, *ACC_offd_i, *ACC_offd_j; HYPRE_Complex *ACC_offd_a; hypre_ParCSRMatrix *ACC; hypre_CSRMatrix *ACC_diag, *ACC_offd; HYPRE_BigInt *col_map_offd_ACC; HYPRE_Int num_cols_ACC_offd; /* ACC Diag */ CC_pred ACC_pred_diag(CF_marker, CF_marker); #if defined(HYPRE_USING_SYCL) ACC_diag_nnz = HYPRE_ONEDPL_CALL( std::count_if, oneapi::dpl::make_zip_iterator(A_diag_ii, Soc_diag_j), oneapi::dpl::make_zip_iterator(A_diag_ii, Soc_diag_j) + A_diag_nnz, ACC_pred_diag ); #else ACC_diag_nnz = HYPRE_THRUST_CALL( count_if, thrust::make_zip_iterator(thrust::make_tuple(A_diag_ii, Soc_diag_j)), thrust::make_zip_iterator(thrust::make_tuple(A_diag_ii, Soc_diag_j)) + A_diag_nnz, ACC_pred_diag ); #endif ACC_diag_ii = hypre_TAlloc(HYPRE_Int, ACC_diag_nnz, HYPRE_MEMORY_DEVICE); ACC_diag_j = hypre_TAlloc(HYPRE_Int, ACC_diag_nnz, HYPRE_MEMORY_DEVICE); ACC_diag_a = hypre_TAlloc(HYPRE_Complex, ACC_diag_nnz, HYPRE_MEMORY_DEVICE); /* Notice that we cannot use Soc_diag_j in the first two arguments since the diagonal is marked as -2 */ #if defined(HYPRE_USING_SYCL) auto new_end = hypreSycl_copy_if( oneapi::dpl::make_zip_iterator(A_diag_ii, A_diag_j, A_diag_a), oneapi::dpl::make_zip_iterator(A_diag_ii, A_diag_j, A_diag_a) + A_diag_nnz, oneapi::dpl::make_zip_iterator(A_diag_ii, Soc_diag_j), oneapi::dpl::make_zip_iterator(ACC_diag_ii, ACC_diag_j, ACC_diag_a), ACC_pred_diag ); hypre_assert( std::get<0>(new_end.base()) == ACC_diag_ii + ACC_diag_nnz ); hypreSycl_gather( ACC_diag_j, ACC_diag_j + ACC_diag_nnz, map2FC, ACC_diag_j ); hypreSycl_gather( ACC_diag_ii, ACC_diag_ii + ACC_diag_nnz, map2FC, ACC_diag_ii ); #else auto new_end = HYPRE_THRUST_CALL( copy_if, thrust::make_zip_iterator(thrust::make_tuple(A_diag_ii, A_diag_j, A_diag_a)), thrust::make_zip_iterator(thrust::make_tuple(A_diag_ii, A_diag_j, A_diag_a)) + A_diag_nnz, thrust::make_zip_iterator(thrust::make_tuple(A_diag_ii, Soc_diag_j)), thrust::make_zip_iterator(thrust::make_tuple(ACC_diag_ii, ACC_diag_j, ACC_diag_a)), ACC_pred_diag ); hypre_assert( thrust::get<0>(new_end.get_iterator_tuple()) == ACC_diag_ii + ACC_diag_nnz ); HYPRE_THRUST_CALL ( gather, ACC_diag_j, ACC_diag_j + ACC_diag_nnz, map2FC, ACC_diag_j ); HYPRE_THRUST_CALL ( gather, ACC_diag_ii, ACC_diag_ii + ACC_diag_nnz, map2FC, ACC_diag_ii ); #endif ACC_diag_i = hypreDevice_CsrRowIndicesToPtrs(nC_local, ACC_diag_nnz, ACC_diag_ii); hypre_TFree(ACC_diag_ii, HYPRE_MEMORY_DEVICE); /* ACC Offd */ CC_pred ACC_pred_offd(CF_marker, recv_buf); #if defined(HYPRE_USING_SYCL) ACC_offd_nnz = HYPRE_ONEDPL_CALL( std::count_if, oneapi::dpl::make_zip_iterator(A_offd_ii, Soc_offd_j), oneapi::dpl::make_zip_iterator(A_offd_ii, Soc_offd_j) + A_offd_nnz, ACC_pred_offd ); #else ACC_offd_nnz = HYPRE_THRUST_CALL( count_if, thrust::make_zip_iterator(thrust::make_tuple(A_offd_ii, Soc_offd_j)), thrust::make_zip_iterator(thrust::make_tuple(A_offd_ii, Soc_offd_j)) + A_offd_nnz, ACC_pred_offd ); #endif ACC_offd_ii = hypre_TAlloc(HYPRE_Int, ACC_offd_nnz, HYPRE_MEMORY_DEVICE); ACC_offd_j = hypre_TAlloc(HYPRE_Int, ACC_offd_nnz, HYPRE_MEMORY_DEVICE); ACC_offd_a = hypre_TAlloc(HYPRE_Complex, ACC_offd_nnz, HYPRE_MEMORY_DEVICE); #if defined(HYPRE_USING_SYCL) new_end = hypreSycl_copy_if( oneapi::dpl::make_zip_iterator(A_offd_ii, Soc_offd_j, A_offd_a), oneapi::dpl::make_zip_iterator(A_offd_ii, Soc_offd_j, A_offd_a) + A_offd_nnz, oneapi::dpl::make_zip_iterator(A_offd_ii, Soc_offd_j), oneapi::dpl::make_zip_iterator(ACC_offd_ii, ACC_offd_j, ACC_offd_a), ACC_pred_offd ); hypre_assert( std::get<0>(new_end.base()) == ACC_offd_ii + ACC_offd_nnz ); hypreSycl_gather( ACC_offd_ii, ACC_offd_ii + ACC_offd_nnz, map2FC, ACC_offd_ii ); #else new_end = HYPRE_THRUST_CALL( copy_if, thrust::make_zip_iterator(thrust::make_tuple(A_offd_ii, Soc_offd_j, A_offd_a)), thrust::make_zip_iterator(thrust::make_tuple(A_offd_ii, Soc_offd_j, A_offd_a)) + A_offd_nnz, thrust::make_zip_iterator(thrust::make_tuple(A_offd_ii, Soc_offd_j)), thrust::make_zip_iterator(thrust::make_tuple(ACC_offd_ii, ACC_offd_j, ACC_offd_a)), ACC_pred_offd ); hypre_assert( thrust::get<0>(new_end.get_iterator_tuple()) == ACC_offd_ii + ACC_offd_nnz ); HYPRE_THRUST_CALL ( gather, ACC_offd_ii, ACC_offd_ii + ACC_offd_nnz, map2FC, ACC_offd_ii ); #endif ACC_offd_i = hypreDevice_CsrRowIndicesToPtrs(nC_local, ACC_offd_nnz, ACC_offd_ii); hypre_TFree(ACC_offd_ii, HYPRE_MEMORY_DEVICE); /* col_map_offd_ACC */ HYPRE_Int *tmp_j = hypre_TAlloc(HYPRE_Int, hypre_max(ACC_offd_nnz, num_cols_A_offd), HYPRE_MEMORY_DEVICE); hypre_TMemcpy(tmp_j, ACC_offd_j, HYPRE_Int, ACC_offd_nnz, HYPRE_MEMORY_DEVICE, HYPRE_MEMORY_DEVICE); #if defined(HYPRE_USING_SYCL) HYPRE_ONEDPL_CALL( std::sort, tmp_j, tmp_j + ACC_offd_nnz ); HYPRE_Int *tmp_end = HYPRE_ONEDPL_CALL( std::unique, tmp_j, tmp_j + ACC_offd_nnz ); num_cols_ACC_offd = tmp_end - tmp_j; HYPRE_ONEDPL_CALL( std::fill_n, offd_mark, num_cols_A_offd, 0 ); hypreDevice_ScatterConstant(offd_mark, num_cols_ACC_offd, tmp_j, (HYPRE_Int) 1); HYPRE_ONEDPL_CALL( std::exclusive_scan, offd_mark, offd_mark + num_cols_A_offd, tmp_j, 0); hypreSycl_gather( ACC_offd_j, ACC_offd_j + ACC_offd_nnz, tmp_j, ACC_offd_j ); col_map_offd_ACC = hypre_TAlloc(HYPRE_BigInt, num_cols_ACC_offd, HYPRE_MEMORY_DEVICE); HYPRE_BigInt *tmp_end_big = hypreSycl_copy_if( recv_buf, recv_buf + num_cols_A_offd, offd_mark, col_map_offd_ACC, [] (const auto & x) {return x;} ); #else HYPRE_THRUST_CALL( sort, tmp_j, tmp_j + ACC_offd_nnz ); HYPRE_Int *tmp_end = HYPRE_THRUST_CALL( unique, tmp_j, tmp_j + ACC_offd_nnz ); num_cols_ACC_offd = tmp_end - tmp_j; hypreDevice_IntFilln( offd_mark, num_cols_A_offd, 0 ); hypreDevice_ScatterConstant(offd_mark, num_cols_ACC_offd, tmp_j, (HYPRE_Int) 1); HYPRE_THRUST_CALL( exclusive_scan, offd_mark, offd_mark + num_cols_A_offd, tmp_j); HYPRE_THRUST_CALL( gather, ACC_offd_j, ACC_offd_j + ACC_offd_nnz, tmp_j, ACC_offd_j ); col_map_offd_ACC = hypre_TAlloc(HYPRE_BigInt, num_cols_ACC_offd, HYPRE_MEMORY_DEVICE); HYPRE_BigInt *tmp_end_big = HYPRE_THRUST_CALL( copy_if, recv_buf, recv_buf + num_cols_A_offd, offd_mark, col_map_offd_ACC, thrust::identity()); #endif hypre_assert(tmp_end_big - col_map_offd_ACC == num_cols_ACC_offd); hypre_TFree(tmp_j, HYPRE_MEMORY_DEVICE); /* ACC */ ACC = hypre_ParCSRMatrixCreate(comm, nC_global, nC_global, cpts_starts, cpts_starts, num_cols_ACC_offd, ACC_diag_nnz, ACC_offd_nnz); ACC_diag = hypre_ParCSRMatrixDiag(ACC); hypre_CSRMatrixData(ACC_diag) = ACC_diag_a; hypre_CSRMatrixI(ACC_diag) = ACC_diag_i; hypre_CSRMatrixJ(ACC_diag) = ACC_diag_j; ACC_offd = hypre_ParCSRMatrixOffd(ACC); hypre_CSRMatrixData(ACC_offd) = ACC_offd_a; hypre_CSRMatrixI(ACC_offd) = ACC_offd_i; hypre_CSRMatrixJ(ACC_offd) = ACC_offd_j; hypre_CSRMatrixMemoryLocation(ACC_diag) = HYPRE_MEMORY_DEVICE; hypre_CSRMatrixMemoryLocation(ACC_offd) = HYPRE_MEMORY_DEVICE; hypre_ParCSRMatrixDeviceColMapOffd(ACC) = col_map_offd_ACC; hypre_ParCSRMatrixColMapOffd(ACC) = hypre_TAlloc(HYPRE_BigInt, num_cols_ACC_offd, HYPRE_MEMORY_HOST); hypre_TMemcpy(hypre_ParCSRMatrixColMapOffd(ACC), col_map_offd_ACC, HYPRE_BigInt, num_cols_ACC_offd, HYPRE_MEMORY_HOST, HYPRE_MEMORY_DEVICE); hypre_ParCSRMatrixSetNumNonzeros(ACC); hypre_ParCSRMatrixDNumNonzeros(ACC) = (HYPRE_Real) hypre_ParCSRMatrixNumNonzeros(ACC); hypre_MatvecCommPkgCreate(ACC); *ACC_ptr = ACC; } hypre_TFree(A_diag_ii, HYPRE_MEMORY_DEVICE); hypre_TFree(A_offd_ii, HYPRE_MEMORY_DEVICE); hypre_TFree(offd_mark, HYPRE_MEMORY_DEVICE); hypre_TFree(map2FC, HYPRE_MEMORY_DEVICE); hypre_TFree(map2F2, HYPRE_MEMORY_DEVICE); hypre_TFree(recv_buf, HYPRE_MEMORY_DEVICE); hypre_GpuProfilingPopRange(); return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_ParCSRMatrixGenerateFFFCDevice *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ParCSRMatrixGenerateFFFCDevice( hypre_ParCSRMatrix *A, HYPRE_Int *CF_marker, HYPRE_BigInt *cpts_starts, hypre_ParCSRMatrix *S, hypre_ParCSRMatrix **AFC_ptr, hypre_ParCSRMatrix **AFF_ptr ) { return hypre_ParCSRMatrixGenerateFFFCDevice_core(A, CF_marker, cpts_starts, S, AFC_ptr, AFF_ptr, NULL, NULL, 1); } /*-------------------------------------------------------------------------- * hypre_ParCSRMatrixGenerateFFFC3Device *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ParCSRMatrixGenerateFFFC3Device( hypre_ParCSRMatrix *A, HYPRE_Int *CF_marker, HYPRE_BigInt *cpts_starts, hypre_ParCSRMatrix *S, hypre_ParCSRMatrix **AFC_ptr, hypre_ParCSRMatrix **AFF_ptr) { return hypre_ParCSRMatrixGenerateFFFCDevice_core(A, CF_marker, cpts_starts, S, AFC_ptr, AFF_ptr, NULL, NULL, 2); } /*-------------------------------------------------------------------------- * hypre_ParCSRMatrixGenerateFFCFDevice *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ParCSRMatrixGenerateFFCFDevice( hypre_ParCSRMatrix *A, HYPRE_Int *CF_marker, HYPRE_BigInt *cpts_starts, hypre_ParCSRMatrix *S, hypre_ParCSRMatrix **ACF_ptr, hypre_ParCSRMatrix **AFF_ptr ) { return hypre_ParCSRMatrixGenerateFFFCDevice_core(A, CF_marker, cpts_starts, S, NULL, AFF_ptr, ACF_ptr, NULL, 1); } /*-------------------------------------------------------------------------- * hypre_ParCSRMatrixGenerateCFDevice *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ParCSRMatrixGenerateCFDevice( hypre_ParCSRMatrix *A, HYPRE_Int *CF_marker, HYPRE_BigInt *cpts_starts, hypre_ParCSRMatrix *S, hypre_ParCSRMatrix **ACF_ptr) { return hypre_ParCSRMatrixGenerateFFFCDevice_core(A, CF_marker, cpts_starts, S, NULL, NULL, ACF_ptr, NULL, 1); } /*-------------------------------------------------------------------------- * hypre_ParCSRMatrixGenerateCCDevice *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ParCSRMatrixGenerateCCDevice( hypre_ParCSRMatrix *A, HYPRE_Int *CF_marker, HYPRE_BigInt *cpts_starts, hypre_ParCSRMatrix *S, hypre_ParCSRMatrix **ACC_ptr) { return hypre_ParCSRMatrixGenerateFFFCDevice_core(A, CF_marker, cpts_starts, S, NULL, NULL, NULL, ACC_ptr, 1); } /*-------------------------------------------------------------------------- * hypre_ParCSRMatrixGenerateCCCFDevice *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ParCSRMatrixGenerateCCCFDevice( hypre_ParCSRMatrix *A, HYPRE_Int *CF_marker, HYPRE_BigInt *cpts_starts, hypre_ParCSRMatrix *S, hypre_ParCSRMatrix **ACF_ptr, hypre_ParCSRMatrix **ACC_ptr) { return hypre_ParCSRMatrixGenerateFFFCDevice_core(A, CF_marker, cpts_starts, S, NULL, NULL, ACF_ptr, ACC_ptr, 1); } /*-------------------------------------------------------------------------- * hypre_ParCSRMatrixGenerate1DCFDevice *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ParCSRMatrixGenerate1DCFDevice( hypre_ParCSRMatrix *A, HYPRE_Int *CF_marker, HYPRE_BigInt *cpts_starts, hypre_ParCSRMatrix *S, hypre_ParCSRMatrix **ACX_ptr, hypre_ParCSRMatrix **AXC_ptr ) { MPI_Comm comm = hypre_ParCSRMatrixComm(A); hypre_ParCSRCommPkg *comm_pkg = hypre_ParCSRMatrixCommPkg(A); hypre_ParCSRCommHandle *comm_handle; HYPRE_Int num_sends = hypre_ParCSRCommPkgNumSends(comm_pkg); HYPRE_Int num_elem_send = hypre_ParCSRCommPkgSendMapStart(comm_pkg, num_sends); //HYPRE_MemoryLocation memory_location = hypre_ParCSRMatrixMemoryLocation(A); /* diag part of A */ hypre_CSRMatrix *A_diag = hypre_ParCSRMatrixDiag(A); HYPRE_Complex *A_diag_a = hypre_CSRMatrixData(A_diag); HYPRE_Int *A_diag_i = hypre_CSRMatrixI(A_diag); HYPRE_Int *A_diag_j = hypre_CSRMatrixJ(A_diag); HYPRE_Int A_diag_nnz = hypre_CSRMatrixNumNonzeros(A_diag); /* offd part of A */ hypre_CSRMatrix *A_offd = hypre_ParCSRMatrixOffd(A); HYPRE_Complex *A_offd_a = hypre_CSRMatrixData(A_offd); HYPRE_Int *A_offd_i = hypre_CSRMatrixI(A_offd); HYPRE_Int *A_offd_j = hypre_CSRMatrixJ(A_offd); HYPRE_Int A_offd_nnz = hypre_CSRMatrixNumNonzeros(A_offd); HYPRE_BigInt *col_map_offd_A = hypre_ParCSRMatrixDeviceColMapOffd(A); HYPRE_Int num_cols_A_offd = hypre_CSRMatrixNumCols(A_offd); /* SoC */ HYPRE_Int *Soc_diag_j = S ? hypre_ParCSRMatrixSocDiagJ(S) : A_diag_j; HYPRE_Int *Soc_offd_j = S ? hypre_ParCSRMatrixSocOffdJ(S) : A_offd_j; /* MPI size and rank */ HYPRE_Int my_id, num_procs; /* nF and nC */ HYPRE_Int n_local, /*nF_local,*/ nC_local; HYPRE_BigInt fpts_starts[2], *row_starts; HYPRE_BigInt /*nF_global,*/ nC_global; HYPRE_BigInt F_first, C_first; /* work arrays */ HYPRE_Int *map2FC, *itmp, *A_diag_ii, *A_offd_ii, *offd_mark; HYPRE_BigInt *send_buf, *recv_buf; hypre_MPI_Comm_size(comm, &num_procs); hypre_MPI_Comm_rank(comm, &my_id); n_local = hypre_ParCSRMatrixNumRows(A); row_starts = hypre_ParCSRMatrixRowStarts(A); if (!col_map_offd_A) { col_map_offd_A = hypre_TAlloc(HYPRE_BigInt, num_cols_A_offd, HYPRE_MEMORY_DEVICE); hypre_TMemcpy(col_map_offd_A, hypre_ParCSRMatrixColMapOffd(A), HYPRE_BigInt, num_cols_A_offd, HYPRE_MEMORY_DEVICE, HYPRE_MEMORY_HOST); hypre_ParCSRMatrixDeviceColMapOffd(A) = col_map_offd_A; } if (my_id == (num_procs - 1)) { nC_global = cpts_starts[1]; } hypre_MPI_Bcast(&nC_global, 1, HYPRE_MPI_BIG_INT, num_procs - 1, comm); nC_local = (HYPRE_Int) (cpts_starts[1] - cpts_starts[0]); fpts_starts[0] = row_starts[0] - cpts_starts[0]; fpts_starts[1] = row_starts[1] - cpts_starts[1]; F_first = fpts_starts[0]; C_first = cpts_starts[0]; /* nF_local = n_local - nC_local; nF_global = hypre_ParCSRMatrixGlobalNumRows(A) - nC_global; */ map2FC = hypre_TAlloc(HYPRE_Int, n_local, HYPRE_MEMORY_DEVICE); itmp = hypre_TAlloc(HYPRE_Int, n_local, HYPRE_MEMORY_DEVICE); recv_buf = hypre_TAlloc(HYPRE_BigInt, num_cols_A_offd, HYPRE_MEMORY_DEVICE); #if defined(HYPRE_USING_SYCL) /* map from all points (i.e, F+C) to F/C indices */ HYPRE_ONEDPL_CALL( std::exclusive_scan, oneapi::dpl::make_transform_iterator(CF_marker, is_negative()), oneapi::dpl::make_transform_iterator(CF_marker + n_local, is_negative()), map2FC, /* F */ HYPRE_Int(0) ); /* *MUST* pass init value since input and output types diff. */ HYPRE_ONEDPL_CALL( std::exclusive_scan, oneapi::dpl::make_transform_iterator(CF_marker, is_nonnegative()), oneapi::dpl::make_transform_iterator(CF_marker + n_local, is_nonnegative()), itmp, /* C */ HYPRE_Int(0) ); /* *MUST* pass init value since input and output types diff. */ hypreSycl_scatter_if( itmp, itmp + n_local, oneapi::dpl::counting_iterator(0), CF_marker, map2FC, /* FC combined */ is_nonnegative() ); #else /* map from all points (i.e, F+C) to F/C indices */ HYPRE_THRUST_CALL( exclusive_scan, thrust::make_transform_iterator(CF_marker, is_negative()), thrust::make_transform_iterator(CF_marker + n_local, is_negative()), map2FC, /* F */ HYPRE_Int(0) ); /* *MUST* pass init value since input and output types diff. */ HYPRE_THRUST_CALL( exclusive_scan, thrust::make_transform_iterator(CF_marker, is_nonnegative()), thrust::make_transform_iterator(CF_marker + n_local, is_nonnegative()), itmp, /* C */ HYPRE_Int(0) ); /* *MUST* pass init value since input and output types diff. */ HYPRE_THRUST_CALL( scatter_if, itmp, itmp + n_local, thrust::counting_iterator(0), thrust::make_transform_iterator(CF_marker, is_nonnegative()), map2FC ); /* FC combined */ #endif hypre_TFree(itmp, HYPRE_MEMORY_DEVICE); /* send_buf: global F/C indices. Note F-pts "x" are saved as "-x-1" */ send_buf = hypre_TAlloc(HYPRE_BigInt, num_elem_send, HYPRE_MEMORY_DEVICE); hypre_ParCSRCommPkgCopySendMapElmtsToDevice(comm_pkg); FFFC_functor functor(F_first, C_first); #if defined(HYPRE_USING_SYCL) auto zip = oneapi::dpl::make_zip_iterator(map2FC, CF_marker); hypreSycl_gather( hypre_ParCSRCommPkgDeviceSendMapElmts(comm_pkg), hypre_ParCSRCommPkgDeviceSendMapElmts(comm_pkg) + num_elem_send, oneapi::dpl::make_transform_iterator(zip, functor), send_buf ); #else HYPRE_THRUST_CALL( gather, hypre_ParCSRCommPkgDeviceSendMapElmts(comm_pkg), hypre_ParCSRCommPkgDeviceSendMapElmts(comm_pkg) + num_elem_send, thrust::make_transform_iterator(thrust::make_zip_iterator(thrust::make_tuple(map2FC, CF_marker)), functor), send_buf ); #endif #if defined(HYPRE_USING_THRUST_NOSYNC) /* RL: make sure send_buf is ready before issuing GPU-GPU MPI */ if (hypre_GetGpuAwareMPI()) { hypre_ForceSyncComputeStream(); } #endif comm_handle = hypre_ParCSRCommHandleCreate_v2(21, comm_pkg, HYPRE_MEMORY_DEVICE, send_buf, HYPRE_MEMORY_DEVICE, recv_buf); hypre_ParCSRCommHandleDestroy(comm_handle); hypre_TFree(send_buf, HYPRE_MEMORY_DEVICE); A_diag_ii = hypre_TAlloc(HYPRE_Int, A_diag_nnz, HYPRE_MEMORY_DEVICE); A_offd_ii = hypre_TAlloc(HYPRE_Int, A_offd_nnz, HYPRE_MEMORY_DEVICE); offd_mark = hypre_TAlloc(HYPRE_Int, num_cols_A_offd, HYPRE_MEMORY_DEVICE); hypreDevice_CsrRowPtrsToIndices_v2(n_local, A_diag_nnz, A_diag_i, A_diag_ii); hypreDevice_CsrRowPtrsToIndices_v2(n_local, A_offd_nnz, A_offd_i, A_offd_ii); if (ACX_ptr) { HYPRE_Int ACX_diag_nnz, ACX_offd_nnz; HYPRE_Int *ACX_diag_ii, *ACX_diag_i, *ACX_diag_j; HYPRE_Complex *ACX_diag_a; HYPRE_Int *ACX_offd_ii, *ACX_offd_i, *ACX_offd_j; HYPRE_Complex *ACX_offd_a; hypre_ParCSRMatrix *ACX; hypre_CSRMatrix *ACX_diag, *ACX_offd; HYPRE_BigInt *col_map_offd_ACX; HYPRE_Int num_cols_ACX_offd; /* ACX Diag */ CX_pred ACX_pred(CF_marker); #if defined(HYPRE_USING_SYCL) ACX_diag_nnz = HYPRE_ONEDPL_CALL( std::count_if, oneapi::dpl::make_zip_iterator(A_diag_ii, Soc_diag_j), oneapi::dpl::make_zip_iterator(A_diag_ii, Soc_diag_j) + A_diag_nnz, ACX_pred ); #else ACX_diag_nnz = HYPRE_THRUST_CALL( count_if, thrust::make_zip_iterator(thrust::make_tuple(A_diag_ii, Soc_diag_j)), thrust::make_zip_iterator(thrust::make_tuple(A_diag_ii, Soc_diag_j)) + A_diag_nnz, ACX_pred ); #endif ACX_diag_ii = hypre_TAlloc(HYPRE_Int, ACX_diag_nnz, HYPRE_MEMORY_DEVICE); ACX_diag_j = hypre_TAlloc(HYPRE_Int, ACX_diag_nnz, HYPRE_MEMORY_DEVICE); ACX_diag_a = hypre_TAlloc(HYPRE_Complex, ACX_diag_nnz, HYPRE_MEMORY_DEVICE); /* Notice that we cannot use Soc_diag_j in the first two arguments since the diagonal is marked as -2 */ #if defined(HYPRE_USING_SYCL) auto new_end = hypreSycl_copy_if( oneapi::dpl::make_zip_iterator(A_diag_ii, A_diag_j, A_diag_a), oneapi::dpl::make_zip_iterator(A_diag_ii, A_diag_j, A_diag_a) + A_diag_nnz, oneapi::dpl::make_zip_iterator(A_diag_ii, Soc_diag_j), oneapi::dpl::make_zip_iterator(ACX_diag_ii, ACX_diag_j, ACX_diag_a), ACX_pred ); hypre_assert( std::get<0>(new_end.base()) == ACX_diag_ii + ACX_diag_nnz ); hypreSycl_gather( ACX_diag_ii, ACX_diag_ii + ACX_diag_nnz, map2FC, ACX_diag_ii ); #else auto new_end = HYPRE_THRUST_CALL( copy_if, thrust::make_zip_iterator(thrust::make_tuple(A_diag_ii, A_diag_j, A_diag_a)), thrust::make_zip_iterator(thrust::make_tuple(A_diag_ii, A_diag_j, A_diag_a)) + A_diag_nnz, thrust::make_zip_iterator(thrust::make_tuple(A_diag_ii, Soc_diag_j)), thrust::make_zip_iterator(thrust::make_tuple(ACX_diag_ii, ACX_diag_j, ACX_diag_a)), ACX_pred ); hypre_assert( thrust::get<0>(new_end.get_iterator_tuple()) == ACX_diag_ii + ACX_diag_nnz ); HYPRE_THRUST_CALL ( gather, ACX_diag_ii, ACX_diag_ii + ACX_diag_nnz, map2FC, ACX_diag_ii ); #endif ACX_diag_i = hypreDevice_CsrRowIndicesToPtrs(nC_local, ACX_diag_nnz, ACX_diag_ii); hypre_TFree(ACX_diag_ii, HYPRE_MEMORY_DEVICE); /* ACX Offd */ #if defined(HYPRE_USING_SYCL) ACX_offd_nnz = HYPRE_ONEDPL_CALL( std::count_if, oneapi::dpl::make_zip_iterator(A_offd_ii, Soc_offd_j), oneapi::dpl::make_zip_iterator(A_offd_ii, Soc_offd_j) + A_offd_nnz, ACX_pred ); #else ACX_offd_nnz = HYPRE_THRUST_CALL( count_if, thrust::make_zip_iterator(thrust::make_tuple(A_offd_ii, Soc_offd_j)), thrust::make_zip_iterator(thrust::make_tuple(A_offd_ii, Soc_offd_j)) + A_offd_nnz, ACX_pred ); #endif ACX_offd_ii = hypre_TAlloc(HYPRE_Int, ACX_offd_nnz, HYPRE_MEMORY_DEVICE); ACX_offd_j = hypre_TAlloc(HYPRE_Int, ACX_offd_nnz, HYPRE_MEMORY_DEVICE); ACX_offd_a = hypre_TAlloc(HYPRE_Complex, ACX_offd_nnz, HYPRE_MEMORY_DEVICE); #if defined(HYPRE_USING_SYCL) new_end = hypreSycl_copy_if( oneapi::dpl::make_zip_iterator(A_offd_ii, Soc_offd_j, A_offd_a), oneapi::dpl::make_zip_iterator(A_offd_ii, Soc_offd_j, A_offd_a) + A_offd_nnz, oneapi::dpl::make_zip_iterator(A_offd_ii, Soc_offd_j), oneapi::dpl::make_zip_iterator(ACX_offd_ii, ACX_offd_j, ACX_offd_a), ACX_pred ); hypre_assert( std::get<0>(new_end.base()) == ACX_offd_ii + ACX_offd_nnz ); hypreSycl_gather( ACX_offd_ii, ACX_offd_ii + ACX_offd_nnz, map2FC, ACX_offd_ii ); #else new_end = HYPRE_THRUST_CALL( copy_if, thrust::make_zip_iterator(thrust::make_tuple(A_offd_ii, Soc_offd_j, A_offd_a)), thrust::make_zip_iterator(thrust::make_tuple(A_offd_ii, Soc_offd_j, A_offd_a)) + A_offd_nnz, thrust::make_zip_iterator(thrust::make_tuple(A_offd_ii, Soc_offd_j)), thrust::make_zip_iterator(thrust::make_tuple(ACX_offd_ii, ACX_offd_j, ACX_offd_a)), ACX_pred ); hypre_assert( thrust::get<0>(new_end.get_iterator_tuple()) == ACX_offd_ii + ACX_offd_nnz ); HYPRE_THRUST_CALL ( gather, ACX_offd_ii, ACX_offd_ii + ACX_offd_nnz, map2FC, ACX_offd_ii ); #endif ACX_offd_i = hypreDevice_CsrRowIndicesToPtrs(nC_local, ACX_offd_nnz, ACX_offd_ii); hypre_TFree(ACX_offd_ii, HYPRE_MEMORY_DEVICE); /* col_map_offd_ACX */ HYPRE_Int *tmp_j = hypre_TAlloc(HYPRE_Int, hypre_max(ACX_offd_nnz, num_cols_A_offd), HYPRE_MEMORY_DEVICE); hypre_TMemcpy(tmp_j, ACX_offd_j, HYPRE_Int, ACX_offd_nnz, HYPRE_MEMORY_DEVICE, HYPRE_MEMORY_DEVICE); #if defined(HYPRE_USING_SYCL) HYPRE_ONEDPL_CALL( std::sort, tmp_j, tmp_j + ACX_offd_nnz ); HYPRE_Int *tmp_end = HYPRE_ONEDPL_CALL( std::unique, tmp_j, tmp_j + ACX_offd_nnz ); #else HYPRE_THRUST_CALL( sort, tmp_j, tmp_j + ACX_offd_nnz ); HYPRE_Int *tmp_end = HYPRE_THRUST_CALL( unique, tmp_j, tmp_j + ACX_offd_nnz ); #endif num_cols_ACX_offd = tmp_end - tmp_j; hypreDevice_IntFilln( offd_mark, num_cols_A_offd, 0 ); hypreDevice_ScatterConstant(offd_mark, num_cols_ACX_offd, tmp_j, (HYPRE_Int) 1); #if defined(HYPRE_USING_SYCL) HYPRE_ONEDPL_CALL( std::exclusive_scan, offd_mark, offd_mark + num_cols_A_offd, tmp_j, 0 ); hypreSycl_gather( ACX_offd_j, ACX_offd_j + ACX_offd_nnz, tmp_j, ACX_offd_j ); col_map_offd_ACX = hypre_TAlloc(HYPRE_BigInt, num_cols_ACX_offd, HYPRE_MEMORY_DEVICE); HYPRE_BigInt *tmp_end_big = hypreSycl_copy_if( col_map_offd_A, col_map_offd_A + num_cols_A_offd, offd_mark, col_map_offd_ACX, [] (const auto & x) {return x;} ); #else HYPRE_THRUST_CALL( exclusive_scan, offd_mark, offd_mark + num_cols_A_offd, tmp_j); HYPRE_THRUST_CALL( gather, ACX_offd_j, ACX_offd_j + ACX_offd_nnz, tmp_j, ACX_offd_j ); col_map_offd_ACX = hypre_TAlloc(HYPRE_BigInt, num_cols_ACX_offd, HYPRE_MEMORY_DEVICE); HYPRE_BigInt *tmp_end_big = HYPRE_THRUST_CALL( copy_if, col_map_offd_A, col_map_offd_A + num_cols_A_offd, offd_mark, col_map_offd_ACX, thrust::identity()); #endif hypre_assert(tmp_end_big - col_map_offd_ACX == num_cols_ACX_offd); hypre_TFree(tmp_j, HYPRE_MEMORY_DEVICE); /* ACX */ ACX = hypre_ParCSRMatrixCreate(comm, nC_global, hypre_ParCSRMatrixGlobalNumCols(A), cpts_starts, hypre_ParCSRMatrixColStarts(A), num_cols_ACX_offd, ACX_diag_nnz, ACX_offd_nnz); ACX_diag = hypre_ParCSRMatrixDiag(ACX); hypre_CSRMatrixData(ACX_diag) = ACX_diag_a; hypre_CSRMatrixI(ACX_diag) = ACX_diag_i; hypre_CSRMatrixJ(ACX_diag) = ACX_diag_j; ACX_offd = hypre_ParCSRMatrixOffd(ACX); hypre_CSRMatrixData(ACX_offd) = ACX_offd_a; hypre_CSRMatrixI(ACX_offd) = ACX_offd_i; hypre_CSRMatrixJ(ACX_offd) = ACX_offd_j; hypre_CSRMatrixMemoryLocation(ACX_diag) = HYPRE_MEMORY_DEVICE; hypre_CSRMatrixMemoryLocation(ACX_offd) = HYPRE_MEMORY_DEVICE; hypre_ParCSRMatrixDeviceColMapOffd(ACX) = col_map_offd_ACX; hypre_ParCSRMatrixColMapOffd(ACX) = hypre_TAlloc(HYPRE_BigInt, num_cols_ACX_offd, HYPRE_MEMORY_HOST); hypre_TMemcpy(hypre_ParCSRMatrixColMapOffd(ACX), col_map_offd_ACX, HYPRE_BigInt, num_cols_ACX_offd, HYPRE_MEMORY_HOST, HYPRE_MEMORY_DEVICE); hypre_ParCSRMatrixSetNumNonzeros(ACX); hypre_ParCSRMatrixDNumNonzeros(ACX) = (HYPRE_Real) hypre_ParCSRMatrixNumNonzeros(ACX); hypre_MatvecCommPkgCreate(ACX); *ACX_ptr = ACX; } if (AXC_ptr) { HYPRE_Int AXC_diag_nnz, AXC_offd_nnz; HYPRE_Int *AXC_diag_ii, *AXC_diag_i, *AXC_diag_j; HYPRE_Complex *AXC_diag_a; HYPRE_Int *AXC_offd_ii, *AXC_offd_i, *AXC_offd_j; HYPRE_Complex *AXC_offd_a; hypre_ParCSRMatrix *AXC; hypre_CSRMatrix *AXC_diag, *AXC_offd; HYPRE_BigInt *col_map_offd_AXC; HYPRE_Int num_cols_AXC_offd; /* AXC Diag */ XC_pred AXC_pred_diag(CF_marker); #if defined(HYPRE_USING_SYCL) AXC_diag_nnz = HYPRE_ONEDPL_CALL( std::count_if, oneapi::dpl::make_zip_iterator(A_diag_ii, Soc_diag_j), oneapi::dpl::make_zip_iterator(A_diag_ii, Soc_diag_j) + A_diag_nnz, AXC_pred_diag ); #else AXC_diag_nnz = HYPRE_THRUST_CALL( count_if, thrust::make_zip_iterator(thrust::make_tuple(A_diag_ii, Soc_diag_j)), thrust::make_zip_iterator(thrust::make_tuple(A_diag_ii, Soc_diag_j)) + A_diag_nnz, AXC_pred_diag ); #endif AXC_diag_ii = hypre_TAlloc(HYPRE_Int, AXC_diag_nnz, HYPRE_MEMORY_DEVICE); AXC_diag_j = hypre_TAlloc(HYPRE_Int, AXC_diag_nnz, HYPRE_MEMORY_DEVICE); AXC_diag_a = hypre_TAlloc(HYPRE_Complex, AXC_diag_nnz, HYPRE_MEMORY_DEVICE); /* Notice that we cannot use Soc_diag_j in the first two arguments since the diagonal is marked as -2 */ #if defined(HYPRE_USING_SYCL) auto new_end = hypreSycl_copy_if( oneapi::dpl::make_zip_iterator(A_diag_ii, A_diag_j, A_diag_a), oneapi::dpl::make_zip_iterator(A_diag_ii, A_diag_j, A_diag_a) + A_diag_nnz, oneapi::dpl::make_zip_iterator(A_diag_ii, Soc_diag_j), oneapi::dpl::make_zip_iterator(AXC_diag_ii, AXC_diag_j, AXC_diag_a), AXC_pred_diag ); hypre_assert( std::get<0>(new_end.base()) == AXC_diag_ii + AXC_diag_nnz ); hypreSycl_gather( AXC_diag_j, AXC_diag_j + AXC_diag_nnz, map2FC, AXC_diag_j ); #else auto new_end = HYPRE_THRUST_CALL( copy_if, thrust::make_zip_iterator(thrust::make_tuple(A_diag_ii, A_diag_j, A_diag_a)), thrust::make_zip_iterator(thrust::make_tuple(A_diag_ii, A_diag_j, A_diag_a)) + A_diag_nnz, thrust::make_zip_iterator(thrust::make_tuple(A_diag_ii, Soc_diag_j)), thrust::make_zip_iterator(thrust::make_tuple(AXC_diag_ii, AXC_diag_j, AXC_diag_a)), AXC_pred_diag ); hypre_assert( thrust::get<0>(new_end.get_iterator_tuple()) == AXC_diag_ii + AXC_diag_nnz ); HYPRE_THRUST_CALL ( gather, AXC_diag_j, AXC_diag_j + AXC_diag_nnz, map2FC, AXC_diag_j ); #endif AXC_diag_i = hypreDevice_CsrRowIndicesToPtrs(n_local, AXC_diag_nnz, AXC_diag_ii); hypre_TFree(AXC_diag_ii, HYPRE_MEMORY_DEVICE); /* AXC Offd */ XC_pred AXC_pred_offd(recv_buf); #if defined(HYPRE_USING_SYCL) AXC_offd_nnz = HYPRE_ONEDPL_CALL( std::count_if, oneapi::dpl::make_zip_iterator(A_offd_ii, Soc_offd_j), oneapi::dpl::make_zip_iterator(A_offd_ii, Soc_offd_j) + A_offd_nnz, AXC_pred_offd ); #else AXC_offd_nnz = HYPRE_THRUST_CALL( count_if, thrust::make_zip_iterator(thrust::make_tuple(A_offd_ii, Soc_offd_j)), thrust::make_zip_iterator(thrust::make_tuple(A_offd_ii, Soc_offd_j)) + A_offd_nnz, AXC_pred_offd ); #endif AXC_offd_ii = hypre_TAlloc(HYPRE_Int, AXC_offd_nnz, HYPRE_MEMORY_DEVICE); AXC_offd_j = hypre_TAlloc(HYPRE_Int, AXC_offd_nnz, HYPRE_MEMORY_DEVICE); AXC_offd_a = hypre_TAlloc(HYPRE_Complex, AXC_offd_nnz, HYPRE_MEMORY_DEVICE); #if defined(HYPRE_USING_SYCL) new_end = hypreSycl_copy_if( oneapi::dpl::make_zip_iterator(A_offd_ii, Soc_offd_j, A_offd_a), oneapi::dpl::make_zip_iterator(A_offd_ii, Soc_offd_j, A_offd_a) + A_offd_nnz, oneapi::dpl::make_zip_iterator(A_offd_ii, Soc_offd_j), oneapi::dpl::make_zip_iterator(AXC_offd_ii, AXC_offd_j, AXC_offd_a), AXC_pred_offd ); hypre_assert( std::get<0>(new_end.base()) == AXC_offd_ii + AXC_offd_nnz ); #else new_end = HYPRE_THRUST_CALL( copy_if, thrust::make_zip_iterator(thrust::make_tuple(A_offd_ii, Soc_offd_j, A_offd_a)), thrust::make_zip_iterator(thrust::make_tuple(A_offd_ii, Soc_offd_j, A_offd_a)) + A_offd_nnz, thrust::make_zip_iterator(thrust::make_tuple(A_offd_ii, Soc_offd_j)), thrust::make_zip_iterator(thrust::make_tuple(AXC_offd_ii, AXC_offd_j, AXC_offd_a)), AXC_pred_offd ); hypre_assert( thrust::get<0>(new_end.get_iterator_tuple()) == AXC_offd_ii + AXC_offd_nnz ); #endif AXC_offd_i = hypreDevice_CsrRowIndicesToPtrs(n_local, AXC_offd_nnz, AXC_offd_ii); hypre_TFree(AXC_offd_ii, HYPRE_MEMORY_DEVICE); /* col_map_offd_AXC */ HYPRE_Int *tmp_j = hypre_TAlloc(HYPRE_Int, hypre_max(AXC_offd_nnz, num_cols_A_offd), HYPRE_MEMORY_DEVICE); hypre_TMemcpy(tmp_j, AXC_offd_j, HYPRE_Int, AXC_offd_nnz, HYPRE_MEMORY_DEVICE, HYPRE_MEMORY_DEVICE); #if defined(HYPRE_USING_SYCL) HYPRE_ONEDPL_CALL( std::sort, tmp_j, tmp_j + AXC_offd_nnz ); HYPRE_Int *tmp_end = HYPRE_ONEDPL_CALL( std::unique, tmp_j, tmp_j + AXC_offd_nnz ); #else HYPRE_THRUST_CALL( sort, tmp_j, tmp_j + AXC_offd_nnz ); HYPRE_Int *tmp_end = HYPRE_THRUST_CALL( unique, tmp_j, tmp_j + AXC_offd_nnz ); #endif num_cols_AXC_offd = tmp_end - tmp_j; hypreDevice_IntFilln( offd_mark, num_cols_A_offd, 0 ); hypreDevice_ScatterConstant(offd_mark, num_cols_AXC_offd, tmp_j, (HYPRE_Int) 1); #if defined(HYPRE_USING_SYCL) HYPRE_ONEDPL_CALL( std::exclusive_scan, offd_mark, offd_mark + num_cols_A_offd, tmp_j, 0 ); hypreSycl_gather( AXC_offd_j, AXC_offd_j + AXC_offd_nnz, tmp_j, AXC_offd_j ); col_map_offd_AXC = hypre_TAlloc(HYPRE_BigInt, num_cols_AXC_offd, HYPRE_MEMORY_DEVICE); HYPRE_BigInt *tmp_end_big = hypreSycl_copy_if( recv_buf, recv_buf + num_cols_A_offd, offd_mark, col_map_offd_AXC, [] (const auto & x) {return x;} ); #else HYPRE_THRUST_CALL( exclusive_scan, offd_mark, offd_mark + num_cols_A_offd, tmp_j); HYPRE_THRUST_CALL( gather, AXC_offd_j, AXC_offd_j + AXC_offd_nnz, tmp_j, AXC_offd_j ); col_map_offd_AXC = hypre_TAlloc(HYPRE_BigInt, num_cols_AXC_offd, HYPRE_MEMORY_DEVICE); HYPRE_BigInt *tmp_end_big = HYPRE_THRUST_CALL( copy_if, recv_buf, recv_buf + num_cols_A_offd, offd_mark, col_map_offd_AXC, thrust::identity()); #endif hypre_assert(tmp_end_big - col_map_offd_AXC == num_cols_AXC_offd); hypre_TFree(tmp_j, HYPRE_MEMORY_DEVICE); /* AXC */ AXC = hypre_ParCSRMatrixCreate(comm, hypre_ParCSRMatrixGlobalNumRows(A), nC_global, row_starts, cpts_starts, num_cols_AXC_offd, AXC_diag_nnz, AXC_offd_nnz); AXC_diag = hypre_ParCSRMatrixDiag(AXC); hypre_CSRMatrixData(AXC_diag) = AXC_diag_a; hypre_CSRMatrixI(AXC_diag) = AXC_diag_i; hypre_CSRMatrixJ(AXC_diag) = AXC_diag_j; AXC_offd = hypre_ParCSRMatrixOffd(AXC); hypre_CSRMatrixData(AXC_offd) = AXC_offd_a; hypre_CSRMatrixI(AXC_offd) = AXC_offd_i; hypre_CSRMatrixJ(AXC_offd) = AXC_offd_j; hypre_CSRMatrixMemoryLocation(AXC_diag) = HYPRE_MEMORY_DEVICE; hypre_CSRMatrixMemoryLocation(AXC_offd) = HYPRE_MEMORY_DEVICE; hypre_ParCSRMatrixDeviceColMapOffd(AXC) = col_map_offd_AXC; hypre_ParCSRMatrixColMapOffd(AXC) = hypre_TAlloc(HYPRE_BigInt, num_cols_AXC_offd, HYPRE_MEMORY_HOST); hypre_TMemcpy(hypre_ParCSRMatrixColMapOffd(AXC), col_map_offd_AXC, HYPRE_BigInt, num_cols_AXC_offd, HYPRE_MEMORY_HOST, HYPRE_MEMORY_DEVICE); hypre_ParCSRMatrixSetNumNonzeros(AXC); hypre_ParCSRMatrixDNumNonzeros(AXC) = (HYPRE_Real) hypre_ParCSRMatrixNumNonzeros(AXC); hypre_MatvecCommPkgCreate(AXC); *AXC_ptr = AXC; } hypre_TFree(A_diag_ii, HYPRE_MEMORY_DEVICE); hypre_TFree(A_offd_ii, HYPRE_MEMORY_DEVICE); hypre_TFree(offd_mark, HYPRE_MEMORY_DEVICE); hypre_TFree(map2FC, HYPRE_MEMORY_DEVICE); hypre_TFree(recv_buf, HYPRE_MEMORY_DEVICE); return hypre_error_flag; } #endif // #if defined(HYPRE_USING_GPU) hypre-2.33.0/src/parcsr_mv/par_csr_filter.c000066400000000000000000000165641477326011500206750ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * Member functions for hypre_ParCSRMatrix class. * *****************************************************************************/ #include "_hypre_parcsr_mv.h" /*-------------------------------------------------------------------------- * hypre_ParCSRMatrixBlkFilterHost *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ParCSRMatrixBlkFilterHost( hypre_ParCSRMatrix *A, HYPRE_Int block_size, hypre_ParCSRMatrix **B_ptr ) { MPI_Comm comm = hypre_ParCSRMatrixComm(A); HYPRE_BigInt global_num_rows = hypre_ParCSRMatrixGlobalNumRows(A); HYPRE_BigInt global_num_cols = hypre_ParCSRMatrixGlobalNumCols(A); HYPRE_BigInt *row_starts = hypre_ParCSRMatrixRowStarts(A); HYPRE_BigInt *col_starts = hypre_ParCSRMatrixColStarts(A); HYPRE_BigInt *col_map_offd_A = hypre_ParCSRMatrixColMapOffd(A); HYPRE_MemoryLocation memory_location = hypre_ParCSRMatrixMemoryLocation(A); hypre_CSRMatrix *A_diag = hypre_ParCSRMatrixDiag(A); HYPRE_Int num_rows = hypre_CSRMatrixNumRows(A_diag); HYPRE_Int *A_diag_i = hypre_CSRMatrixI(A_diag); HYPRE_Int *A_diag_j = hypre_CSRMatrixJ(A_diag); HYPRE_Complex *A_diag_a = hypre_CSRMatrixData(A_diag); hypre_CSRMatrix *A_offd = hypre_ParCSRMatrixOffd(A); HYPRE_Int *A_offd_i = hypre_CSRMatrixI(A_offd); HYPRE_Int *A_offd_j = hypre_CSRMatrixJ(A_offd); HYPRE_Complex *A_offd_a = hypre_CSRMatrixData(A_offd); HYPRE_Int num_cols_offd_A = hypre_CSRMatrixNumCols(A_offd); /* Output matrix variables */ hypre_ParCSRMatrix *B; hypre_CSRMatrix *B_diag, *B_offd; HYPRE_Int *B_diag_i, *B_offd_i; HYPRE_Int *B_diag_j, *B_offd_j; HYPRE_Complex *B_diag_a, *B_offd_a; HYPRE_BigInt *col_map_offd_B; HYPRE_Int num_cols_offd_B; HYPRE_Int B_diag_nnz, B_offd_nnz; /* Local variables */ HYPRE_BigInt big_block_size = (HYPRE_BigInt) block_size; HYPRE_Int i, j, c; HYPRE_Int *marker; /*----------------------------------------------------------------------- * Sanity checks *-----------------------------------------------------------------------*/ if (block_size < 1) { hypre_error_w_msg(HYPRE_ERROR_GENERIC, "block size must be greater than one!\n"); return hypre_error_flag; } if (global_num_rows % big_block_size) { hypre_error_w_msg(HYPRE_ERROR_GENERIC, "block size is not a divisor of the number of rows!\n"); return hypre_error_flag; } if (row_starts[0] % big_block_size) { hypre_error_w_msg(HYPRE_ERROR_GENERIC, "block size is not a divisor of the first global row!\n"); return hypre_error_flag; } if (global_num_rows != global_num_cols) { hypre_error_w_msg(HYPRE_ERROR_GENERIC, "Function not implemented for rectangular matrices!\n"); return hypre_error_flag; } /*----------------------------------------------------------------------- * First pass: compute nonzero counts of B *-----------------------------------------------------------------------*/ B_diag_nnz = B_offd_nnz = 0; for (i = 0; i < num_rows; i++) { c = i % block_size; for (j = A_diag_i[i]; j < A_diag_i[i + 1]; j++) { if (c == (A_diag_j[j] % block_size)) { B_diag_nnz++; } } for (j = A_offd_i[i]; j < A_offd_i[i + 1]; j++) { if (c == (HYPRE_Int) (col_map_offd_A[A_offd_j[j]] % big_block_size)) { B_offd_nnz++; } } } /*----------------------------------------------------------------------- * Create and initialize output matrix *-----------------------------------------------------------------------*/ B = hypre_ParCSRMatrixCreate(comm, global_num_rows, global_num_cols, row_starts, col_starts, num_cols_offd_A, B_diag_nnz, B_offd_nnz); hypre_ParCSRMatrixInitialize_v2(B, memory_location); B_diag = hypre_ParCSRMatrixDiag(B); B_diag_i = hypre_CSRMatrixI(B_diag); B_diag_j = hypre_CSRMatrixJ(B_diag); B_diag_a = hypre_CSRMatrixData(B_diag); B_offd = hypre_ParCSRMatrixOffd(B); B_offd_i = hypre_CSRMatrixI(B_offd); B_offd_j = hypre_CSRMatrixJ(B_offd); B_offd_a = hypre_CSRMatrixData(B_offd); col_map_offd_B = hypre_ParCSRMatrixColMapOffd(B); /*----------------------------------------------------------------------- * Second pass: Fill entries of B *-----------------------------------------------------------------------*/ marker = hypre_CTAlloc(HYPRE_Int, num_cols_offd_A, HYPRE_MEMORY_HOST); for (i = 0; i < num_rows; i++) { c = i % block_size; B_diag_i[i + 1] = B_diag_i[i]; for (j = A_diag_i[i]; j < A_diag_i[i + 1]; j++) { if (c == (A_diag_j[j] % block_size)) { B_diag_j[B_diag_i[i + 1]] = A_diag_j[j]; B_diag_a[B_diag_i[i + 1]] = A_diag_a[j]; B_diag_i[i + 1]++; } } B_offd_i[i + 1] = B_offd_i[i]; for (j = A_offd_i[i]; j < A_offd_i[i + 1]; j++) { if (c == (HYPRE_Int) (col_map_offd_A[A_offd_j[j]] % big_block_size)) { B_offd_j[B_offd_i[i + 1]] = A_offd_j[j]; B_offd_a[B_offd_i[i + 1]] = A_offd_a[j]; B_offd_i[i + 1]++; marker[A_offd_j[j]] = 1; } } } /* Update col_map array */ num_cols_offd_B = 0; for (i = 0; i < num_cols_offd_A; i++) { if (marker[i]) { col_map_offd_B[num_cols_offd_B++] = col_map_offd_A[i]; } } hypre_CSRMatrixNumCols(B_offd) = num_cols_offd_B; hypre_TFree(marker, HYPRE_MEMORY_HOST); /* Update global nonzeros */ hypre_ParCSRMatrixSetDNumNonzeros(B); hypre_ParCSRMatrixNumNonzeros(B) = (HYPRE_BigInt) hypre_ParCSRMatrixDNumNonzeros(B); hypre_MatvecCommPkgCreate(B); /* Set output pointer */ *B_ptr = B; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_ParCSRMatrixBlkFilter *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ParCSRMatrixBlkFilter( hypre_ParCSRMatrix *A, HYPRE_Int block_size, hypre_ParCSRMatrix **B_ptr ) { HYPRE_ANNOTATE_FUNC_BEGIN; #if defined(HYPRE_USING_GPU) if (hypre_GetExecPolicy1(hypre_ParCSRMatrixMemoryLocation(A)) == HYPRE_EXEC_DEVICE) { hypre_ParCSRMatrixBlkFilterDevice(A, block_size, B_ptr); } else #endif { hypre_ParCSRMatrixBlkFilterHost(A, block_size, B_ptr); } HYPRE_ANNOTATE_FUNC_END; return hypre_error_flag; } hypre-2.33.0/src/parcsr_mv/par_csr_filter_device.c000066400000000000000000000336571477326011500222160ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "_hypre_onedpl.hpp" #include "_hypre_parcsr_mv.h" #include "_hypre_utilities.hpp" #if defined(HYPRE_USING_GPU) /*-------------------------------------------------------------------------- * hypreGPUKernel_ParCSRMatrixBlkFilterCount *--------------------------------------------------------------------------*/ __global__ void hypreGPUKernel_ParCSRMatrixBlkFilterCount(hypre_DeviceItem &item, HYPRE_Int num_rows, HYPRE_Int block_size, HYPRE_Int *A_diag_i, HYPRE_Int *A_diag_j, HYPRE_Int *A_offd_i, HYPRE_Int *A_offd_j, HYPRE_BigInt *A_col_map_offd, HYPRE_Int *B_diag_i, HYPRE_Int *B_offd_i) { HYPRE_Int row = hypre_gpu_get_grid_warp_id<1, 1>(item); HYPRE_Int lane = hypre_gpu_get_lane_id<1>(item); HYPRE_BigInt big_block_size = (HYPRE_BigInt) block_size; if (row < num_rows) { HYPRE_Int p = 0, q = 0, pA, qA; if (lane < 2) { p = read_only_load(A_diag_i + row + lane); q = read_only_load(A_offd_i + row + lane); } pA = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, p, 1); p = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, p, 0); qA = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, q, 1); q = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, q, 0); HYPRE_Int diag_count = 0; HYPRE_Int offd_count = 0; for (HYPRE_Int j = p + lane; warp_any_sync(item, HYPRE_WARP_FULL_MASK, j < pA); j += HYPRE_WARP_SIZE) { if (j < pA) { const HYPRE_Int col = read_only_load(A_diag_j + j); if ((col % block_size) == (row % block_size)) { diag_count++; } } } for (HYPRE_Int j = q + lane; warp_any_sync(item, HYPRE_WARP_FULL_MASK, j < qA); j += HYPRE_WARP_SIZE) { if (j < qA) { const HYPRE_Int col = read_only_load(A_offd_j + j); const HYPRE_BigInt global_col = read_only_load(A_col_map_offd + col); if ((HYPRE_Int) (global_col % big_block_size) == (row % block_size)) { offd_count++; } } } diag_count = warp_reduce_sum(item, diag_count); offd_count = warp_reduce_sum(item, offd_count); if (lane == 0) { B_diag_i[row] = diag_count; B_offd_i[row] = offd_count; } } } /*-------------------------------------------------------------------------- * hypreGPUKernel_ParCSRMatrixBlkFilterFill *--------------------------------------------------------------------------*/ __global__ void hypreGPUKernel_ParCSRMatrixBlkFilterFill(hypre_DeviceItem &item, HYPRE_Int num_rows, HYPRE_Int block_size, HYPRE_Int A_num_cols_offd, HYPRE_Int *A_diag_i, HYPRE_Int *A_diag_j, HYPRE_Complex *A_diag_a, HYPRE_Int *A_offd_i, HYPRE_Int *A_offd_j, HYPRE_Complex *A_offd_a, HYPRE_BigInt *A_col_map_offd, HYPRE_Int *B_diag_i, HYPRE_Int *B_diag_j, HYPRE_Complex *B_diag_a, HYPRE_Int *B_offd_i, HYPRE_Int *B_offd_j, HYPRE_Complex *B_offd_a, HYPRE_Int *col_map_marker) { const HYPRE_Int row = hypre_gpu_get_grid_warp_id<1, 1>(item); const HYPRE_Int lane = hypre_gpu_get_lane_id<1>(item); HYPRE_Int p = 0, q = 0, pA, qA; HYPRE_BigInt big_block_size = (HYPRE_BigInt) block_size; if (row >= num_rows) { return; } if (lane < 2) { p = read_only_load(A_diag_i + row + lane); q = read_only_load(A_offd_i + row + lane); } pA = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, p, 1); p = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, p, 0); qA = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, q, 1); q = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, q, 0); HYPRE_Int diag_offset = B_diag_i[row]; for (HYPRE_Int j = p + lane; warp_any_sync(item, HYPRE_WARP_FULL_MASK, j < pA); j += HYPRE_WARP_SIZE) { const HYPRE_Int col = (j < pA) ? read_only_load(A_diag_j + j) : 0; HYPRE_Int write = (j < pA && (col % block_size) == (row % block_size)); hypre_mask ballot = hypre_ballot_sync(item, HYPRE_WARP_FULL_MASK, write); HYPRE_Int laneoff = hypre_popc(ballot & ((hypre_mask_one << lane) - 1)); if (write) { HYPRE_Int idx = diag_offset + laneoff; B_diag_j[idx] = col; B_diag_a[idx] = A_diag_a[j]; } diag_offset += hypre_popc(ballot); } if (col_map_marker) { HYPRE_Int offd_offset = B_offd_i[row]; for (HYPRE_Int j = q + lane; warp_any_sync(item, HYPRE_WARP_FULL_MASK, j < qA); j += HYPRE_WARP_SIZE) { const HYPRE_Int col = (j < qA) ? read_only_load(A_offd_j + j) : 0; const HYPRE_BigInt global_col = (j < qA) ? read_only_load(A_col_map_offd + col) : 0; HYPRE_Int write = (j < qA) && (HYPRE_Int) (global_col % big_block_size) == (row % block_size); hypre_mask ballot = hypre_ballot_sync(item, HYPRE_WARP_FULL_MASK, write); HYPRE_Int laneoff = hypre_popc(ballot & ((hypre_mask_one << lane) - 1)); if (write) { HYPRE_Int idx = offd_offset + laneoff; B_offd_j[idx] = col; B_offd_a[idx] = A_offd_a[j]; if (col < A_num_cols_offd) { col_map_marker[col] = 1; } } offd_offset += hypre_popc(ballot); } } } /*-------------------------------------------------------------------------- * hypre_ParCSRMatrixBlkFilterDevice *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ParCSRMatrixBlkFilterDevice(hypre_ParCSRMatrix *A, HYPRE_Int block_size, hypre_ParCSRMatrix **B_ptr) { MPI_Comm comm = hypre_ParCSRMatrixComm(A); HYPRE_BigInt global_num_rows = hypre_ParCSRMatrixGlobalNumRows(A); HYPRE_BigInt global_num_cols = hypre_ParCSRMatrixGlobalNumCols(A); HYPRE_BigInt *row_starts = hypre_ParCSRMatrixRowStarts(A); HYPRE_BigInt *col_starts = hypre_ParCSRMatrixColStarts(A); HYPRE_BigInt *A_col_map_offd = hypre_ParCSRMatrixDeviceColMapOffd(A); HYPRE_MemoryLocation memory_location = hypre_ParCSRMatrixMemoryLocation(A); hypre_CSRMatrix *A_diag = hypre_ParCSRMatrixDiag(A); HYPRE_Int num_rows = hypre_CSRMatrixNumRows(A_diag); HYPRE_Int *A_diag_i = hypre_CSRMatrixI(A_diag); HYPRE_Int *A_diag_j = hypre_CSRMatrixJ(A_diag); HYPRE_Complex *A_diag_a = hypre_CSRMatrixData(A_diag); hypre_CSRMatrix *A_offd = hypre_ParCSRMatrixOffd(A); HYPRE_Int *A_offd_i = hypre_CSRMatrixI(A_offd); HYPRE_Int *A_offd_j = hypre_CSRMatrixJ(A_offd); HYPRE_Complex *A_offd_a = hypre_CSRMatrixData(A_offd); HYPRE_Int num_cols_offd = hypre_CSRMatrixNumCols(A_offd); hypre_ParCSRMatrix *B; hypre_CSRMatrix *B_diag; hypre_CSRMatrix *B_offd; HYPRE_Int *B_diag_i; HYPRE_Int *B_diag_j; HYPRE_Complex *B_diag_a; HYPRE_Int *B_offd_i; HYPRE_Int *B_offd_j; HYPRE_Complex *B_offd_a; HYPRE_Int B_diag_nnz, B_offd_nnz; HYPRE_BigInt *B_col_map_offd; HYPRE_Int *col_map_marker; HYPRE_BigInt *col_map_end; const dim3 bDim = hypre_GetDefaultDeviceBlockDimension(); const dim3 gDim = hypre_GetDefaultDeviceGridDimension(num_rows, "w", bDim); hypre_GpuProfilingPushRange("ParCSRMatrixBlkFilter"); /* Create A's device column map */ if (!hypre_ParCSRMatrixDeviceColMapOffd(A) && hypre_ParCSRMatrixColMapOffd(A)) { hypre_ParCSRMatrixCopyColMapOffdToDevice(A); A_col_map_offd = hypre_ParCSRMatrixDeviceColMapOffd(A); } /* Create and initialize output matrix B */ B = hypre_ParCSRMatrixCreate(comm, global_num_rows, global_num_cols, row_starts, col_starts, num_cols_offd, 0, 0); hypre_ParCSRMatrixInitialize_v2(B, memory_location); B_diag = hypre_ParCSRMatrixDiag(B); B_offd = hypre_ParCSRMatrixOffd(B); B_diag_i = hypre_CSRMatrixI(B_diag); B_offd_i = hypre_CSRMatrixI(B_offd); /* First pass: count nonzeros */ HYPRE_GPU_LAUNCH( hypreGPUKernel_ParCSRMatrixBlkFilterCount, gDim, bDim, num_rows, block_size, A_diag_i, A_diag_j, A_offd_i, A_offd_j, A_col_map_offd, B_diag_i, B_offd_i ); /* Compute row pointers and get total number of nonzeros */ hypreDevice_IntegerExclusiveScan(num_rows + 1, B_diag_i); hypreDevice_IntegerExclusiveScan(num_rows + 1, B_offd_i); hypre_TMemcpy(&B_diag_nnz, B_diag_i + num_rows, HYPRE_Int, 1, HYPRE_MEMORY_HOST, memory_location); hypre_TMemcpy(&B_offd_nnz, B_offd_i + num_rows, HYPRE_Int, 1, HYPRE_MEMORY_HOST, memory_location); /* Allocate memory for B */ B_diag_j = hypre_TAlloc(HYPRE_Int, B_diag_nnz, memory_location); B_offd_j = hypre_TAlloc(HYPRE_Int, B_offd_nnz, memory_location); B_diag_a = hypre_TAlloc(HYPRE_Complex, B_diag_nnz, memory_location); B_offd_a = hypre_TAlloc(HYPRE_Complex, B_offd_nnz, memory_location); /* Create a marker for used columns */ if (num_cols_offd > 0) { col_map_marker = hypre_CTAlloc(HYPRE_Int, num_cols_offd, memory_location); } else { col_map_marker = NULL; } /* Second pass: fill B */ HYPRE_GPU_LAUNCH( hypreGPUKernel_ParCSRMatrixBlkFilterFill, gDim, bDim, num_rows, block_size, num_cols_offd, A_diag_i, A_diag_j, A_diag_a, A_offd_i, A_offd_j, A_offd_a, A_col_map_offd, B_diag_i, B_diag_j, B_diag_a, B_offd_i, B_offd_j, B_offd_a, col_map_marker ); /* Update CSR matrix structures */ hypre_CSRMatrixJ(B_diag) = B_diag_j; hypre_CSRMatrixData(B_diag) = B_diag_a; hypre_CSRMatrixNumNonzeros(B_diag) = B_diag_nnz; hypre_CSRMatrixJ(B_offd) = B_offd_j; hypre_CSRMatrixData(B_offd) = B_offd_a; hypre_CSRMatrixNumNonzeros(B_offd) = B_offd_nnz; /* Set up B's col_map_offd */ if (B_offd_nnz > 0) { /* Create B's device column map */ hypre_ParCSRMatrixDeviceColMapOffd(B) = hypre_CTAlloc(HYPRE_BigInt, num_cols_offd, HYPRE_MEMORY_DEVICE); B_col_map_offd = hypre_ParCSRMatrixDeviceColMapOffd(B); #if defined(HYPRE_USING_SYCL) /* Copy used columns to B's col_map_offd */ col_map_end = hypreSycl_copy_if(A_col_map_offd, A_col_map_offd + num_cols_offd, col_map_marker, B_col_map_offd, [] (const auto & x) {return x;} ); #else /* Copy used columns to B's col_map_offd */ col_map_end = HYPRE_THRUST_CALL(copy_if, A_col_map_offd, A_col_map_offd + num_cols_offd, col_map_marker, B_col_map_offd, thrust::identity()); #endif hypre_CSRMatrixNumCols(B_offd) = (HYPRE_Int) (col_map_end - B_col_map_offd); /* Copy B's column map to host */ hypre_TMemcpy(hypre_ParCSRMatrixColMapOffd(B), hypre_ParCSRMatrixDeviceColMapOffd(B), HYPRE_BigInt, hypre_CSRMatrixNumCols(B_offd), HYPRE_MEMORY_HOST, HYPRE_MEMORY_DEVICE); } /* Update global nonzeros */ hypre_ParCSRMatrixSetDNumNonzeros(B); hypre_ParCSRMatrixNumNonzeros(B) = (HYPRE_BigInt) hypre_ParCSRMatrixDNumNonzeros(B); /* TODO (VPM): compute B's commpkg directly from A's commpkg */ hypre_MatvecCommPkgCreate(B); /* Set output pointer */ *B_ptr = B; hypre_TFree(col_map_marker, memory_location); hypre_GpuProfilingPopRange(); return hypre_error_flag; } #endif /* if defined(HYPRE_USING_GPU) */ hypre-2.33.0/src/parcsr_mv/par_csr_matmat.c000066400000000000000000000123561477326011500206660ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "_hypre_parcsr_mv.h" /*-------------------------------------------------------------------------- * hypre_ParCSRMatMatDiagHost *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ParCSRMatMatDiagHost(hypre_ParCSRMatrix *A, hypre_ParCSRMatrix *BT, hypre_ParCSRMatrix *C) { HYPRE_Int num_rows = hypre_ParCSRMatrixNumRows(A); hypre_CSRMatrix *A_diag = hypre_ParCSRMatrixDiag(A); hypre_CSRMatrix *A_offd = hypre_ParCSRMatrixOffd(A); hypre_CSRMatrix *BT_diag, *BT_offd, *C_diag; HYPRE_Int *A_diag_i, *BT_diag_i, *C_diag_i; HYPRE_Int *A_offd_i, *BT_offd_i; HYPRE_Int *A_diag_j, *BT_diag_j, *C_diag_j; HYPRE_Int *A_offd_j, *BT_offd_j; HYPRE_Complex *A_diag_a, *BT_diag_a, *C_diag_a; HYPRE_Complex *A_offd_a, *BT_offd_a; HYPRE_BigInt *A_col_map_offd; HYPRE_BigInt *BT_col_map_offd; HYPRE_Int i, kA, kB; HYPRE_Complex diag; /* Load pointers */ BT_diag = hypre_ParCSRMatrixDiag(BT); BT_offd = hypre_ParCSRMatrixOffd(BT); BT_diag_i = hypre_CSRMatrixI(BT_diag); BT_offd_i = hypre_CSRMatrixI(BT_offd); BT_diag_j = hypre_CSRMatrixJ(BT_diag); BT_offd_j = hypre_CSRMatrixJ(BT_offd); BT_diag_a = hypre_CSRMatrixData(BT_diag); BT_offd_a = hypre_CSRMatrixData(BT_offd); A_diag_i = hypre_CSRMatrixI(A_diag); A_offd_i = hypre_CSRMatrixI(A_offd); A_diag_j = hypre_CSRMatrixJ(A_diag); A_offd_j = hypre_CSRMatrixJ(A_offd); A_diag_a = hypre_CSRMatrixData(A_diag); A_offd_a = hypre_CSRMatrixData(A_offd); C_diag = hypre_ParCSRMatrixDiag(C); C_diag_i = hypre_CSRMatrixI(C_diag); C_diag_j = hypre_CSRMatrixJ(C_diag); C_diag_a = hypre_CSRMatrixData(C_diag); BT_col_map_offd = hypre_ParCSRMatrixColMapOffd(BT); A_col_map_offd = hypre_ParCSRMatrixColMapOffd(A); /* Compute C = diag(A .* BT) */ #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i, kA, kB, diag) #endif for (i = 0; i < num_rows; i++) { /* Compute diagonal matrix contributions */ diag = 0.0; for (kA = A_diag_i[i], kB = BT_diag_i[i]; kA < A_diag_i[i + 1] && kB < BT_diag_i[i + 1];) { if (A_diag_j[kA] < BT_diag_j[kB]) { kA++; } else if (A_diag_j[kA] > BT_diag_j[kB]) { kB++; } else { diag += A_diag_a[kA] * BT_diag_a[kB]; kA++; kB++; } } /* Compute off-diagonal matrix contributions */ for (kA = A_offd_i[i], kB = BT_offd_i[i]; kA < A_offd_i[i + 1] && kB < BT_offd_i[i + 1];) { if (A_col_map_offd[A_offd_j[kA]] < BT_col_map_offd[BT_offd_j[kB]]) { kA++; } else if (A_col_map_offd[A_offd_j[kA]] > BT_col_map_offd[BT_offd_j[kB]]) { kB++; } else { diag += A_offd_a[kA] * BT_offd_a[kB]; kA++; kB++; } } C_diag_a[i] = diag; C_diag_j[i] = i; C_diag_i[i + 1] = i + 1; } return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_ParCSRMatMatDiag * * Computes C = diag(A * B) *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ParCSRMatMatDiag(hypre_ParCSRMatrix *A, hypre_ParCSRMatrix *B, hypre_ParCSRMatrix **C_ptr) { MPI_Comm comm = hypre_ParCSRMatrixComm(A); HYPRE_BigInt global_num_rows = hypre_ParCSRMatrixGlobalNumRows(A); HYPRE_BigInt global_num_cols = hypre_ParCSRMatrixGlobalNumCols(B); HYPRE_Int num_rows = hypre_ParCSRMatrixNumRows(A); HYPRE_BigInt *row_starts = hypre_ParCSRMatrixRowStarts(A); HYPRE_MemoryLocation memory_location = hypre_ParCSRMatrixMemoryLocation(A); hypre_ParCSRMatrix *C, *BT; /* Create and initialize output matrix C */ C = hypre_ParCSRMatrixCreate(comm, global_num_rows, global_num_cols, row_starts, row_starts, 0, num_rows, 0); hypre_ParCSRMatrixInitialize_v2(C, memory_location); /* Transpose B for easier multiplication with A */ hypre_ParCSRMatrixTranspose(B, &BT, 1); #if defined(HYPRE_USING_GPU) HYPRE_ExecutionPolicy exec = hypre_GetExecPolicy2(hypre_ParCSRMatrixMemoryLocation(A), hypre_ParCSRMatrixMemoryLocation(BT)); if (exec == HYPRE_EXEC_DEVICE) { hypre_ParCSRMatMatDiagDevice(A, BT, C); } else #endif { hypre_ParCSRMatMatDiagHost(A, BT, C); } /* Output pointer */ *C_ptr = C; /* Free memory */ hypre_ParCSRMatrixDestroy(BT); return hypre_error_flag; } hypre-2.33.0/src/parcsr_mv/par_csr_matmat_device.c000066400000000000000000000126571477326011500222110ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "_hypre_onedpl.hpp" #include "_hypre_parcsr_mv.h" #include "_hypre_utilities.hpp" #if defined(HYPRE_USING_GPU) /*-------------------------------------------------------------------------- * hypreGPUKernel_ParCSRMatMatDiag *--------------------------------------------------------------------------*/ __global__ void hypreGPUKernel_ParCSRMatMatDiag(hypre_DeviceItem &item, HYPRE_Int num_rows, HYPRE_Int *A_diag_i, HYPRE_Int *A_diag_j, HYPRE_Complex *A_diag_data, HYPRE_Int *A_offd_i, HYPRE_Int *A_offd_j, HYPRE_Complex *A_offd_data, HYPRE_Int *BT_diag_i, HYPRE_Int *BT_diag_j, HYPRE_Complex *BT_diag_data, HYPRE_Int *BT_offd_i, HYPRE_Int *BT_offd_j, HYPRE_Complex *BT_offd_data, HYPRE_BigInt *A_col_map_offd, HYPRE_BigInt *BT_col_map_offd, HYPRE_Complex *C_diag_data) { const HYPRE_Int row = hypre_gpu_get_thread_id<1>(item); if (row < num_rows) { HYPRE_Complex sum = 0.0; /* Process diagonal part of A */ HYPRE_Int kA = A_diag_i[row]; HYPRE_Int kB = BT_diag_i[row]; while (kA < A_diag_i[row + 1] && kB < BT_diag_i[row + 1]) { if (A_diag_j[kA] < BT_diag_j[kB]) { kA++; } else if (A_diag_j[kA] > BT_diag_j[kB]) { kB++; } else { sum += A_diag_data[kA] * BT_diag_data[kB]; kA++; kB++; } } /* Process off-diagonal part of A */ kA = A_offd_i[row]; kB = BT_offd_i[row]; while (kA < A_offd_i[row + 1] && kB < BT_offd_i[row + 1]) { HYPRE_BigInt col_A = A_col_map_offd[A_offd_j[kA]]; HYPRE_BigInt col_B = BT_col_map_offd[BT_offd_j[kB]]; if (col_A < col_B) { kA++; } else if (col_A > col_B) { kB++; } else { sum += A_offd_data[kA] * BT_offd_data[kB]; kA++; kB++; } } C_diag_data[row] = sum; } } /*-------------------------------------------------------------------------- * hypre_ParCSRMatMatDiagDevice *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ParCSRMatMatDiagDevice(hypre_ParCSRMatrix *A, hypre_ParCSRMatrix *BT, hypre_ParCSRMatrix *C) { HYPRE_Int num_rows = hypre_ParCSRMatrixNumRows(A); hypre_CSRMatrix *A_diag = hypre_ParCSRMatrixDiag(A); hypre_CSRMatrix *A_offd = hypre_ParCSRMatrixOffd(A); hypre_CSRMatrix *BT_diag = hypre_ParCSRMatrixDiag(BT); hypre_CSRMatrix *BT_offd = hypre_ParCSRMatrixOffd(BT); hypre_CSRMatrix *C_diag = hypre_ParCSRMatrixDiag(C); HYPRE_Int *C_diag_i = hypre_CSRMatrixI(C_diag); HYPRE_Int *C_diag_j = hypre_CSRMatrixJ(C_diag); hypre_GpuProfilingPushRange("ParCSRMatMatDiag"); /* Set up C_diag_i and C_diag_j */ #if defined(HYPRE_USING_SYCL) hypreSycl_sequence(C_diag_i, C_diag_i + num_rows + 1, 0); hypreSycl_sequence(C_diag_j, C_diag_j + num_rows, 0); #else HYPRE_THRUST_CALL(sequence, C_diag_i, C_diag_i + num_rows + 1, 0); HYPRE_THRUST_CALL(sequence, C_diag_j, C_diag_j + num_rows, 0); #endif /* Update device column maps if needed */ hypre_ParCSRMatrixCopyColMapOffdToDevice(A); hypre_ParCSRMatrixCopyColMapOffdToDevice(BT); /* Launch GPU kernel */ const dim3 bDim = hypre_GetDefaultDeviceBlockDimension(); const dim3 gDim = hypre_GetDefaultDeviceGridDimension(num_rows, "threads", bDim); HYPRE_GPU_LAUNCH( hypreGPUKernel_ParCSRMatMatDiag, gDim, bDim, num_rows, hypre_CSRMatrixI(A_diag), hypre_CSRMatrixJ(A_diag), hypre_CSRMatrixData(A_diag), hypre_CSRMatrixI(A_offd), hypre_CSRMatrixJ(A_offd), hypre_CSRMatrixData(A_offd), hypre_CSRMatrixI(BT_diag), hypre_CSRMatrixJ(BT_diag), hypre_CSRMatrixData(BT_diag), hypre_CSRMatrixI(BT_offd), hypre_CSRMatrixJ(BT_offd), hypre_CSRMatrixData(BT_offd), hypre_ParCSRMatrixDeviceColMapOffd(A), hypre_ParCSRMatrixDeviceColMapOffd(BT), hypre_CSRMatrixData(C_diag) ); hypre_GpuProfilingPopRange(); return hypre_error_flag; } #endif /* if defined(HYPRE_USING_GPU) */ hypre-2.33.0/src/parcsr_mv/par_csr_matop.c000066400000000000000000007367611477326011500205400ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "_hypre_utilities.h" #include "_hypre_parcsr_mv.h" #include "_hypre_lapack.h" #include "_hypre_blas.h" /*-------------------------------------------------------------------------- * hypre_ParMatmul_RowSizes: * * Computes sizes of C rows. Formerly part of hypre_ParMatmul but removed * so it can also be used for multiplication of Boolean matrices. * * Arrays computed: C_diag_i, C_offd_i. * * Arrays needed: (17, all HYPRE_Int*) * rownnz_A, * A_diag_i, A_diag_j, * A_offd_i, A_offd_j, * B_diag_i, B_diag_j, * B_offd_i, B_offd_j, * B_ext_i, B_ext_j, * col_map_offd_B, col_map_offd_B, * B_offd_i, B_offd_j, * B_ext_i, B_ext_j. * * Scalars computed: C_diag_size, C_offd_size. * * Scalars needed: * num_rownnz_A, num_rows_diag_A, num_cols_offd_A, allsquare, * first_col_diag_B, num_cols_diag_B, num_cols_offd_B, num_cols_offd_C *--------------------------------------------------------------------------*/ void hypre_ParMatmul_RowSizes( HYPRE_MemoryLocation memory_location, HYPRE_Int **C_diag_i, HYPRE_Int **C_offd_i, HYPRE_Int *rownnz_A, HYPRE_Int *A_diag_i, HYPRE_Int *A_diag_j, HYPRE_Int *A_offd_i, HYPRE_Int *A_offd_j, HYPRE_Int *B_diag_i, HYPRE_Int *B_diag_j, HYPRE_Int *B_offd_i, HYPRE_Int *B_offd_j, HYPRE_Int *B_ext_diag_i, HYPRE_Int *B_ext_diag_j, HYPRE_Int *B_ext_offd_i, HYPRE_Int *B_ext_offd_j, HYPRE_Int *map_B_to_C, HYPRE_Int *C_diag_size, HYPRE_Int *C_offd_size, HYPRE_Int num_rownnz_A, HYPRE_Int num_rows_diag_A, HYPRE_Int num_cols_offd_A, HYPRE_Int allsquare, HYPRE_Int num_cols_diag_B, HYPRE_Int num_cols_offd_B, HYPRE_Int num_cols_offd_C ) { HYPRE_Int *jj_count_diag_array; HYPRE_Int *jj_count_offd_array; HYPRE_Int start_indexing = 0; /* start indexing for C_data at 0 */ HYPRE_Int num_threads = hypre_NumThreads(); *C_diag_i = hypre_CTAlloc(HYPRE_Int, num_rows_diag_A + 1, memory_location); *C_offd_i = hypre_CTAlloc(HYPRE_Int, num_rows_diag_A + 1, memory_location); jj_count_diag_array = hypre_CTAlloc(HYPRE_Int, num_threads, HYPRE_MEMORY_HOST); jj_count_offd_array = hypre_CTAlloc(HYPRE_Int, num_threads, HYPRE_MEMORY_HOST); /*----------------------------------------------------------------------- * Loop over rows of A *-----------------------------------------------------------------------*/ #ifdef HYPRE_USING_OPENMP #pragma omp parallel #endif { HYPRE_Int *B_marker = NULL; HYPRE_Int jj_row_begin_diag, jj_count_diag; HYPRE_Int jj_row_begin_offd, jj_count_offd; HYPRE_Int i1, ii1, i2, i3, jj2, jj3; HYPRE_Int size, rest, num_threads; HYPRE_Int ii, ns, ne; num_threads = hypre_NumActiveThreads(); size = num_rownnz_A / num_threads; rest = num_rownnz_A - size * num_threads; ii = hypre_GetThreadNum(); if (ii < rest) { ns = ii * size + ii; ne = (ii + 1) * size + ii + 1; } else { ns = ii * size + rest; ne = (ii + 1) * size + rest; } jj_count_diag = start_indexing; jj_count_offd = start_indexing; if (num_cols_diag_B || num_cols_offd_C) { B_marker = hypre_CTAlloc(HYPRE_Int, num_cols_diag_B + num_cols_offd_C, HYPRE_MEMORY_HOST); } for (i1 = 0; i1 < num_cols_diag_B + num_cols_offd_C; i1++) { B_marker[i1] = -1; } for (i1 = ns; i1 < ne; i1++) { jj_row_begin_diag = jj_count_diag; jj_row_begin_offd = jj_count_offd; if (rownnz_A) { ii1 = rownnz_A[i1]; } else { ii1 = i1; /*-------------------------------------------------------------------- * Set marker for diagonal entry, C_{i1,i1} (for square matrices). *--------------------------------------------------------------------*/ if (allsquare) { B_marker[i1] = jj_count_diag; jj_count_diag++; } } /*----------------------------------------------------------------- * Loop over entries in row ii1 of A_offd. *-----------------------------------------------------------------*/ if (num_cols_offd_A) { for (jj2 = A_offd_i[ii1]; jj2 < A_offd_i[ii1 + 1]; jj2++) { i2 = A_offd_j[jj2]; /*----------------------------------------------------------- * Loop over entries in row i2 of B_ext. *-----------------------------------------------------------*/ for (jj3 = B_ext_offd_i[i2]; jj3 < B_ext_offd_i[i2 + 1]; jj3++) { i3 = num_cols_diag_B + B_ext_offd_j[jj3]; /*-------------------------------------------------------- * Check B_marker to see that C_{ii1,i3} has not already * been accounted for. If it has not, mark it and increment * counter. *--------------------------------------------------------*/ if (B_marker[i3] < jj_row_begin_offd) { B_marker[i3] = jj_count_offd; jj_count_offd++; } } for (jj3 = B_ext_diag_i[i2]; jj3 < B_ext_diag_i[i2 + 1]; jj3++) { i3 = B_ext_diag_j[jj3]; if (B_marker[i3] < jj_row_begin_diag) { B_marker[i3] = jj_count_diag; jj_count_diag++; } } } } /*----------------------------------------------------------------- * Loop over entries in row ii1 of A_diag. *-----------------------------------------------------------------*/ for (jj2 = A_diag_i[ii1]; jj2 < A_diag_i[ii1 + 1]; jj2++) { i2 = A_diag_j[jj2]; /*----------------------------------------------------------- * Loop over entries in row i2 of B_diag. *-----------------------------------------------------------*/ for (jj3 = B_diag_i[i2]; jj3 < B_diag_i[i2 + 1]; jj3++) { i3 = B_diag_j[jj3]; /*-------------------------------------------------------- * Check B_marker to see that C_{ii1,i3} has not already * been accounted for. If it has not, mark it and increment * counter. *--------------------------------------------------------*/ if (B_marker[i3] < jj_row_begin_diag) { B_marker[i3] = jj_count_diag; jj_count_diag++; } } /*----------------------------------------------------------- * Loop over entries in row i2 of B_offd. *-----------------------------------------------------------*/ if (num_cols_offd_B) { for (jj3 = B_offd_i[i2]; jj3 < B_offd_i[i2 + 1]; jj3++) { i3 = num_cols_diag_B + map_B_to_C[B_offd_j[jj3]]; /*-------------------------------------------------------- * Check B_marker to see that C_{ii1,i3} has not already * been accounted for. If it has not, mark it and increment * counter. *--------------------------------------------------------*/ if (B_marker[i3] < jj_row_begin_offd) { B_marker[i3] = jj_count_offd; jj_count_offd++; } } } } /*-------------------------------------------------------------------- * Set C_diag_i and C_offd_i for this row. *--------------------------------------------------------------------*/ (*C_diag_i)[ii1] = jj_row_begin_diag; (*C_offd_i)[ii1] = jj_row_begin_offd; } jj_count_diag_array[ii] = jj_count_diag; jj_count_offd_array[ii] = jj_count_offd; hypre_TFree(B_marker, HYPRE_MEMORY_HOST); #ifdef HYPRE_USING_OPENMP #pragma omp barrier #endif /* Correct diag_i and offd_i - phase 1 */ if (ii) { jj_count_diag = jj_count_diag_array[0]; jj_count_offd = jj_count_offd_array[0]; for (i1 = 1; i1 < ii; i1++) { jj_count_diag += jj_count_diag_array[i1]; jj_count_offd += jj_count_offd_array[i1]; } for (i1 = ns; i1 < ne; i1++) { ii1 = rownnz_A ? rownnz_A[i1] : i1; (*C_diag_i)[ii1] += jj_count_diag; (*C_offd_i)[ii1] += jj_count_offd; } } else { (*C_diag_i)[num_rows_diag_A] = 0; (*C_offd_i)[num_rows_diag_A] = 0; for (i1 = 0; i1 < num_threads; i1++) { (*C_diag_i)[num_rows_diag_A] += jj_count_diag_array[i1]; (*C_offd_i)[num_rows_diag_A] += jj_count_offd_array[i1]; } } /* Correct diag_i and offd_i - phase 2 */ if (rownnz_A != NULL) { #ifdef HYPRE_USING_OPENMP #pragma omp barrier #endif for (i1 = ns; i1 < (ne - 1); i1++) { for (ii1 = rownnz_A[i1] + 1; ii1 < rownnz_A[i1 + 1]; ii1++) { (*C_diag_i)[ii1] = (*C_diag_i)[rownnz_A[i1 + 1]]; (*C_offd_i)[ii1] = (*C_offd_i)[rownnz_A[i1 + 1]]; } } if (ii < (num_threads - 1)) { for (ii1 = rownnz_A[ne - 1] + 1; ii1 < rownnz_A[ne]; ii1++) { (*C_diag_i)[ii1] = (*C_diag_i)[rownnz_A[ne]]; (*C_offd_i)[ii1] = (*C_offd_i)[rownnz_A[ne]]; } } else { for (ii1 = rownnz_A[ne - 1] + 1; ii1 < num_rows_diag_A; ii1++) { (*C_diag_i)[ii1] = (*C_diag_i)[num_rows_diag_A]; (*C_offd_i)[ii1] = (*C_offd_i)[num_rows_diag_A]; } } } } /* end parallel loop */ *C_diag_size = (*C_diag_i)[num_rows_diag_A]; *C_offd_size = (*C_offd_i)[num_rows_diag_A]; #ifdef HYPRE_DEBUG HYPRE_Int i; for (i = 0; i < num_rows_diag_A; i++) { hypre_assert((*C_diag_i)[i] <= (*C_diag_i)[i + 1]); hypre_assert((*C_offd_i)[i] <= (*C_offd_i)[i + 1]); } #endif hypre_TFree(jj_count_diag_array, HYPRE_MEMORY_HOST); hypre_TFree(jj_count_offd_array, HYPRE_MEMORY_HOST); /* End of First Pass */ } /*-------------------------------------------------------------------------- * hypre_ParMatmul: * * Multiplies two ParCSRMatrices A and B and returns the product in * ParCSRMatrix C. *--------------------------------------------------------------------------*/ hypre_ParCSRMatrix* hypre_ParMatmul( hypre_ParCSRMatrix *A, hypre_ParCSRMatrix *B ) { #ifdef HYPRE_PROFILE hypre_profile_times[HYPRE_TIMER_ID_MATMUL] -= hypre_MPI_Wtime(); #endif /* ParCSRMatrix A */ MPI_Comm comm = hypre_ParCSRMatrixComm(A); HYPRE_BigInt nrows_A = hypre_ParCSRMatrixGlobalNumRows(A); HYPRE_BigInt ncols_A = hypre_ParCSRMatrixGlobalNumCols(A); HYPRE_BigInt *row_starts_A = hypre_ParCSRMatrixRowStarts(A); HYPRE_Int num_rownnz_A; HYPRE_Int *rownnz_A = NULL; /* ParCSRMatrix B */ HYPRE_BigInt nrows_B = hypre_ParCSRMatrixGlobalNumRows(B); HYPRE_BigInt ncols_B = hypre_ParCSRMatrixGlobalNumCols(B); HYPRE_BigInt first_col_diag_B = hypre_ParCSRMatrixFirstColDiag(B); HYPRE_BigInt *col_starts_B = hypre_ParCSRMatrixColStarts(B); HYPRE_BigInt last_col_diag_B; /* A_diag */ hypre_CSRMatrix *A_diag = hypre_ParCSRMatrixDiag(A); HYPRE_Complex *A_diag_data = hypre_CSRMatrixData(A_diag); HYPRE_Int *A_diag_i = hypre_CSRMatrixI(A_diag); HYPRE_Int *A_diag_j = hypre_CSRMatrixJ(A_diag); HYPRE_Int *A_diag_ir = hypre_CSRMatrixRownnz(A_diag); HYPRE_Int num_rownnz_diag_A = hypre_CSRMatrixNumRownnz(A_diag); HYPRE_Int num_rows_diag_A = hypre_CSRMatrixNumRows(A_diag); HYPRE_Int num_cols_diag_A = hypre_CSRMatrixNumCols(A_diag); /* A_offd */ hypre_CSRMatrix *A_offd = hypre_ParCSRMatrixOffd(A); HYPRE_Complex *A_offd_data = hypre_CSRMatrixData(A_offd); HYPRE_Int *A_offd_i = hypre_CSRMatrixI(A_offd); HYPRE_Int *A_offd_j = hypre_CSRMatrixJ(A_offd); HYPRE_Int *A_offd_ir = hypre_CSRMatrixRownnz(A_offd); HYPRE_Int num_rownnz_offd_A = hypre_CSRMatrixNumRownnz(A_offd); HYPRE_Int num_rows_offd_A = hypre_CSRMatrixNumRows(A_offd); HYPRE_Int num_cols_offd_A = hypre_CSRMatrixNumCols(A_offd); /* B_diag */ hypre_CSRMatrix *B_diag = hypre_ParCSRMatrixDiag(B); HYPRE_Complex *B_diag_data = hypre_CSRMatrixData(B_diag); HYPRE_Int *B_diag_i = hypre_CSRMatrixI(B_diag); HYPRE_Int *B_diag_j = hypre_CSRMatrixJ(B_diag); HYPRE_Int num_rows_diag_B = hypre_CSRMatrixNumRows(B_diag); HYPRE_Int num_cols_diag_B = hypre_CSRMatrixNumCols(B_diag); /* B_offd */ hypre_CSRMatrix *B_offd = hypre_ParCSRMatrixOffd(B); HYPRE_BigInt *col_map_offd_B = hypre_ParCSRMatrixColMapOffd(B); HYPRE_Complex *B_offd_data = hypre_CSRMatrixData(B_offd); HYPRE_Int *B_offd_i = hypre_CSRMatrixI(B_offd); HYPRE_Int *B_offd_j = hypre_CSRMatrixJ(B_offd); HYPRE_Int num_cols_offd_B = hypre_CSRMatrixNumCols(B_offd); /* ParCSRMatrix C */ hypre_ParCSRMatrix *C; HYPRE_BigInt *col_map_offd_C = NULL; HYPRE_Int *map_B_to_C = NULL; /* C_diag */ hypre_CSRMatrix *C_diag; HYPRE_Complex *C_diag_data; HYPRE_Int *C_diag_i; HYPRE_Int *C_diag_j; HYPRE_Int C_offd_size; HYPRE_Int num_cols_offd_C = 0; /* C_offd */ hypre_CSRMatrix *C_offd; HYPRE_Complex *C_offd_data = NULL; HYPRE_Int *C_offd_i = NULL; HYPRE_Int *C_offd_j = NULL; HYPRE_Int C_diag_size; /* Bs_ext */ hypre_CSRMatrix *Bs_ext = NULL; HYPRE_Complex *Bs_ext_data = NULL; HYPRE_Int *Bs_ext_i = NULL; HYPRE_BigInt *Bs_ext_j = NULL; HYPRE_Complex *B_ext_diag_data = NULL; HYPRE_Int *B_ext_diag_i; HYPRE_Int *B_ext_diag_j = NULL; HYPRE_Int B_ext_diag_size; HYPRE_Complex *B_ext_offd_data = NULL; HYPRE_Int *B_ext_offd_i; HYPRE_Int *B_ext_offd_j = NULL; HYPRE_BigInt *B_big_offd_j = NULL; HYPRE_Int B_ext_offd_size; HYPRE_Int allsquare = 0; HYPRE_Int num_procs; HYPRE_Int *my_diag_array; HYPRE_Int *my_offd_array; HYPRE_Int max_num_threads; HYPRE_Complex zero = 0.0; HYPRE_MemoryLocation memory_location_A = hypre_ParCSRMatrixMemoryLocation(A); HYPRE_MemoryLocation memory_location_B = hypre_ParCSRMatrixMemoryLocation(B); /* RL: TODO cannot guarantee, maybe should never assert hypre_assert(memory_location_A == memory_location_B); */ /* RL: in the case of A=H, B=D, or A=D, B=H, let C = D, * not sure if this is the right thing to do. * Also, need something like this in other places * TODO */ HYPRE_MemoryLocation memory_location_C = hypre_max(memory_location_A, memory_location_B); HYPRE_ANNOTATE_FUNC_BEGIN; max_num_threads = hypre_NumThreads(); my_diag_array = hypre_CTAlloc(HYPRE_Int, max_num_threads, HYPRE_MEMORY_HOST); my_offd_array = hypre_CTAlloc(HYPRE_Int, max_num_threads, HYPRE_MEMORY_HOST); if (ncols_A != nrows_B || num_cols_diag_A != num_rows_diag_B) { hypre_error_w_msg(HYPRE_ERROR_GENERIC, " Error! Incompatible matrix dimensions!\n"); HYPRE_ANNOTATE_FUNC_END; return NULL; } /* if C=A*B is square globally and locally, then C_diag should be square also */ if ( num_rows_diag_A == num_cols_diag_B && nrows_A == ncols_B ) { allsquare = 1; } /* Set rownnz of A */ if (num_rownnz_diag_A != num_rows_diag_A && num_rownnz_offd_A != num_rows_offd_A ) { hypre_IntArray arr_diag; hypre_IntArray arr_offd; hypre_IntArray arr_rownnz; hypre_IntArrayData(&arr_diag) = A_diag_ir; hypre_IntArrayData(&arr_offd) = A_offd_ir; hypre_IntArraySize(&arr_diag) = num_rownnz_diag_A; hypre_IntArraySize(&arr_offd) = num_rownnz_offd_A; hypre_IntArrayMemoryLocation(&arr_rownnz) = memory_location_A; hypre_IntArrayMergeOrdered(&arr_diag, &arr_offd, &arr_rownnz); num_rownnz_A = hypre_IntArraySize(&arr_rownnz); rownnz_A = hypre_IntArrayData(&arr_rownnz); } else { num_rownnz_A = hypre_max(num_rows_diag_A, num_rows_offd_A); } /*----------------------------------------------------------------------- * Extract B_ext, i.e. portion of B that is stored on neighbor procs * and needed locally for matrix matrix product *-----------------------------------------------------------------------*/ hypre_MPI_Comm_size(comm, &num_procs); #ifdef HYPRE_PROFILE hypre_profile_times[HYPRE_TIMER_ID_RENUMBER_COLIDX] -= hypre_MPI_Wtime(); #endif if (num_procs > 1) { /*--------------------------------------------------------------------- * If there exists no CommPkg for A, a CommPkg is generated using * equally load balanced partitionings within * hypre_ParCSRMatrixExtractBExt *--------------------------------------------------------------------*/ Bs_ext = hypre_ParCSRMatrixExtractBExt(B, A, 1); Bs_ext_data = hypre_CSRMatrixData(Bs_ext); Bs_ext_i = hypre_CSRMatrixI(Bs_ext); Bs_ext_j = hypre_CSRMatrixBigJ(Bs_ext); } B_ext_diag_i = hypre_CTAlloc(HYPRE_Int, num_cols_offd_A + 1, HYPRE_MEMORY_HOST); B_ext_offd_i = hypre_CTAlloc(HYPRE_Int, num_cols_offd_A + 1, HYPRE_MEMORY_HOST); B_ext_diag_size = 0; B_ext_offd_size = 0; last_col_diag_B = first_col_diag_B + (HYPRE_BigInt) num_cols_diag_B - 1; #ifdef HYPRE_CONCURRENT_HOPSCOTCH hypre_UnorderedBigIntSet set; #pragma omp parallel { HYPRE_Int size, rest, ii; HYPRE_Int ns, ne; HYPRE_Int i1, i, j; HYPRE_Int my_offd_size, my_diag_size; HYPRE_Int cnt_offd, cnt_diag; HYPRE_Int num_threads = hypre_NumActiveThreads(); size = num_cols_offd_A / num_threads; rest = num_cols_offd_A - size * num_threads; ii = hypre_GetThreadNum(); if (ii < rest) { ns = ii * size + ii; ne = (ii + 1) * size + ii + 1; } else { ns = ii * size + rest; ne = (ii + 1) * size + rest; } my_diag_size = 0; my_offd_size = 0; for (i = ns; i < ne; i++) { B_ext_diag_i[i] = my_diag_size; B_ext_offd_i[i] = my_offd_size; for (j = Bs_ext_i[i]; j < Bs_ext_i[i + 1]; j++) { if (Bs_ext_j[j] < first_col_diag_B || Bs_ext_j[j] > last_col_diag_B) { my_offd_size++; } else { my_diag_size++; } } } my_diag_array[ii] = my_diag_size; my_offd_array[ii] = my_offd_size; #pragma omp barrier if (ii) { my_diag_size = my_diag_array[0]; my_offd_size = my_offd_array[0]; for (i1 = 1; i1 < ii; i1++) { my_diag_size += my_diag_array[i1]; my_offd_size += my_offd_array[i1]; } for (i1 = ns; i1 < ne; i1++) { B_ext_diag_i[i1] += my_diag_size; B_ext_offd_i[i1] += my_offd_size; } } else { B_ext_diag_size = 0; B_ext_offd_size = 0; for (i1 = 0; i1 < num_threads; i1++) { B_ext_diag_size += my_diag_array[i1]; B_ext_offd_size += my_offd_array[i1]; } B_ext_diag_i[num_cols_offd_A] = B_ext_diag_size; B_ext_offd_i[num_cols_offd_A] = B_ext_offd_size; if (B_ext_diag_size) { B_ext_diag_j = hypre_CTAlloc(HYPRE_Int, B_ext_diag_size, HYPRE_MEMORY_HOST); B_ext_diag_data = hypre_CTAlloc(HYPRE_Complex, B_ext_diag_size, HYPRE_MEMORY_HOST); } if (B_ext_offd_size) { B_ext_offd_j = hypre_CTAlloc(HYPRE_Int, B_ext_offd_size, HYPRE_MEMORY_HOST); B_big_offd_j = hypre_CTAlloc(HYPRE_BigInt, B_ext_offd_size, HYPRE_MEMORY_HOST); B_ext_offd_data = hypre_CTAlloc(HYPRE_Complex, B_ext_offd_size, HYPRE_MEMORY_HOST); } hypre_UnorderedBigIntSetCreate(&set, B_ext_offd_size + num_cols_offd_B, 16 * hypre_NumThreads()); } #pragma omp barrier cnt_offd = B_ext_offd_i[ns]; cnt_diag = B_ext_diag_i[ns]; for (i = ns; i < ne; i++) { for (j = Bs_ext_i[i]; j < Bs_ext_i[i + 1]; j++) { if (Bs_ext_j[j] < first_col_diag_B || Bs_ext_j[j] > last_col_diag_B) { hypre_UnorderedBigIntSetPut(&set, Bs_ext_j[j]); B_big_offd_j[cnt_offd] = Bs_ext_j[j]; //Bs_ext_j[cnt_offd] = Bs_ext_j[j]; B_ext_offd_data[cnt_offd++] = Bs_ext_data[j]; } else { B_ext_diag_j[cnt_diag] = (HYPRE_Int)(Bs_ext_j[j] - first_col_diag_B); B_ext_diag_data[cnt_diag++] = Bs_ext_data[j]; } } } HYPRE_Int i_begin, i_end; hypre_GetSimpleThreadPartition(&i_begin, &i_end, num_cols_offd_B); for (i = i_begin; i < i_end; i++) { hypre_UnorderedBigIntSetPut(&set, col_map_offd_B[i]); } } /* omp parallel */ col_map_offd_C = hypre_UnorderedBigIntSetCopyToArray(&set, &num_cols_offd_C); hypre_UnorderedBigIntSetDestroy(&set); hypre_UnorderedBigIntMap col_map_offd_C_inverse; hypre_big_sort_and_create_inverse_map(col_map_offd_C, num_cols_offd_C, &col_map_offd_C, &col_map_offd_C_inverse); HYPRE_Int i, j; #pragma omp parallel for private(j) HYPRE_SMP_SCHEDULE for (i = 0; i < num_cols_offd_A; i++) { for (j = B_ext_offd_i[i]; j < B_ext_offd_i[i + 1]; j++) { //B_ext_offd_j[j] = hypre_UnorderedIntMapGet(&col_map_offd_C_inverse, B_ext_offd_j[j]); B_ext_offd_j[j] = hypre_UnorderedBigIntMapGet(&col_map_offd_C_inverse, B_big_offd_j[j]); } } if (num_cols_offd_C) { hypre_UnorderedBigIntMapDestroy(&col_map_offd_C_inverse); } hypre_TFree(my_diag_array, HYPRE_MEMORY_HOST); hypre_TFree(my_offd_array, HYPRE_MEMORY_HOST); if (num_cols_offd_B) { HYPRE_Int i; map_B_to_C = hypre_CTAlloc(HYPRE_Int, num_cols_offd_B, HYPRE_MEMORY_HOST); #pragma omp parallel private(i) { HYPRE_Int i_begin, i_end; hypre_GetSimpleThreadPartition(&i_begin, &i_end, num_cols_offd_C); HYPRE_Int cnt = 0; if (i_end > i_begin) { cnt = hypre_BigLowerBound(col_map_offd_B, col_map_offd_B + (HYPRE_BigInt)num_cols_offd_B, col_map_offd_C[i_begin]) - col_map_offd_B; } for (i = i_begin; i < i_end && cnt < num_cols_offd_B; i++) { if (col_map_offd_C[i] == col_map_offd_B[cnt]) { map_B_to_C[cnt++] = i; } } } } if (num_procs > 1) { hypre_CSRMatrixDestroy(Bs_ext); Bs_ext = NULL; } #else /* !HYPRE_CONCURRENT_HOPSCOTCH */ HYPRE_BigInt *temp = NULL; #ifdef HYPRE_USING_OPENMP #pragma omp parallel #endif { HYPRE_Int size, rest, ii; HYPRE_Int ns, ne; HYPRE_Int i1, i, j; HYPRE_Int my_offd_size, my_diag_size; HYPRE_Int cnt_offd, cnt_diag; HYPRE_Int num_threads = hypre_NumActiveThreads(); size = num_cols_offd_A / num_threads; rest = num_cols_offd_A - size * num_threads; ii = hypre_GetThreadNum(); if (ii < rest) { ns = ii * size + ii; ne = (ii + 1) * size + ii + 1; } else { ns = ii * size + rest; ne = (ii + 1) * size + rest; } my_diag_size = 0; my_offd_size = 0; for (i = ns; i < ne; i++) { B_ext_diag_i[i] = my_diag_size; B_ext_offd_i[i] = my_offd_size; for (j = Bs_ext_i[i]; j < Bs_ext_i[i + 1]; j++) { if (Bs_ext_j[j] < first_col_diag_B || Bs_ext_j[j] > last_col_diag_B) { my_offd_size++; } else { my_diag_size++; } } } my_diag_array[ii] = my_diag_size; my_offd_array[ii] = my_offd_size; #ifdef HYPRE_USING_OPENMP #pragma omp barrier #endif if (ii) { my_diag_size = my_diag_array[0]; my_offd_size = my_offd_array[0]; for (i1 = 1; i1 < ii; i1++) { my_diag_size += my_diag_array[i1]; my_offd_size += my_offd_array[i1]; } for (i1 = ns; i1 < ne; i1++) { B_ext_diag_i[i1] += my_diag_size; B_ext_offd_i[i1] += my_offd_size; } } else { B_ext_diag_size = 0; B_ext_offd_size = 0; for (i1 = 0; i1 < num_threads; i1++) { B_ext_diag_size += my_diag_array[i1]; B_ext_offd_size += my_offd_array[i1]; } B_ext_diag_i[num_cols_offd_A] = B_ext_diag_size; B_ext_offd_i[num_cols_offd_A] = B_ext_offd_size; if (B_ext_diag_size) { B_ext_diag_j = hypre_CTAlloc(HYPRE_Int, B_ext_diag_size, HYPRE_MEMORY_HOST); B_ext_diag_data = hypre_CTAlloc(HYPRE_Complex, B_ext_diag_size, HYPRE_MEMORY_HOST); } if (B_ext_offd_size) { B_ext_offd_j = hypre_CTAlloc(HYPRE_Int, B_ext_offd_size, HYPRE_MEMORY_HOST); B_big_offd_j = hypre_CTAlloc(HYPRE_BigInt, B_ext_offd_size, HYPRE_MEMORY_HOST); B_ext_offd_data = hypre_CTAlloc(HYPRE_Complex, B_ext_offd_size, HYPRE_MEMORY_HOST); } if (B_ext_offd_size || num_cols_offd_B) { temp = hypre_CTAlloc(HYPRE_BigInt, B_ext_offd_size + num_cols_offd_B, HYPRE_MEMORY_HOST); } } #ifdef HYPRE_USING_OPENMP #pragma omp barrier #endif cnt_offd = B_ext_offd_i[ns]; cnt_diag = B_ext_diag_i[ns]; for (i = ns; i < ne; i++) { for (j = Bs_ext_i[i]; j < Bs_ext_i[i + 1]; j++) { if (Bs_ext_j[j] < first_col_diag_B || Bs_ext_j[j] > last_col_diag_B) { temp[cnt_offd] = Bs_ext_j[j]; B_big_offd_j[cnt_offd] = Bs_ext_j[j]; //Bs_ext_j[cnt_offd] = Bs_ext_j[j]; B_ext_offd_data[cnt_offd++] = Bs_ext_data[j]; } else { B_ext_diag_j[cnt_diag] = (HYPRE_Int)(Bs_ext_j[j] - first_col_diag_B); B_ext_diag_data[cnt_diag++] = Bs_ext_data[j]; } } } #ifdef HYPRE_USING_OPENMP #pragma omp barrier #endif if (ii == 0) { HYPRE_Int cnt; if (num_procs > 1) { hypre_CSRMatrixDestroy(Bs_ext); Bs_ext = NULL; } cnt = 0; if (B_ext_offd_size || num_cols_offd_B) { cnt = B_ext_offd_size; for (i = 0; i < num_cols_offd_B; i++) { temp[cnt++] = col_map_offd_B[i]; } if (cnt) { HYPRE_BigInt value; hypre_BigQsort0(temp, 0, cnt - 1); num_cols_offd_C = 1; value = temp[0]; for (i = 1; i < cnt; i++) { if (temp[i] > value) { value = temp[i]; temp[num_cols_offd_C++] = value; } } } if (num_cols_offd_C) { col_map_offd_C = hypre_CTAlloc(HYPRE_BigInt, num_cols_offd_C, HYPRE_MEMORY_HOST); } for (i = 0; i < num_cols_offd_C; i++) { col_map_offd_C[i] = temp[i]; } hypre_TFree(temp, HYPRE_MEMORY_HOST); } } #ifdef HYPRE_USING_OPENMP #pragma omp barrier #endif for (i = ns; i < ne; i++) { for (j = B_ext_offd_i[i]; j < B_ext_offd_i[i + 1]; j++) { B_ext_offd_j[j] = hypre_BigBinarySearch(col_map_offd_C, B_big_offd_j[j], //B_ext_offd_j[j] = hypre_BigBinarySearch(col_map_offd_C, Bs_ext_j[j], num_cols_offd_C); } } } /* end parallel region */ hypre_TFree(B_big_offd_j, HYPRE_MEMORY_HOST); hypre_TFree(my_diag_array, HYPRE_MEMORY_HOST); hypre_TFree(my_offd_array, HYPRE_MEMORY_HOST); if (num_cols_offd_B) { HYPRE_Int i, cnt; map_B_to_C = hypre_CTAlloc(HYPRE_Int, num_cols_offd_B, HYPRE_MEMORY_HOST); cnt = 0; for (i = 0; i < num_cols_offd_C; i++) { if (col_map_offd_C[i] == col_map_offd_B[cnt]) { map_B_to_C[cnt++] = i; if (cnt == num_cols_offd_B) { break; } } } } #endif /* !HYPRE_CONCURRENT_HOPSCOTCH */ #ifdef HYPRE_PROFILE hypre_profile_times[HYPRE_TIMER_ID_RENUMBER_COLIDX] += hypre_MPI_Wtime(); #endif HYPRE_ANNOTATE_REGION_BEGIN("%s", "First pass"); hypre_ParMatmul_RowSizes(memory_location_C, &C_diag_i, &C_offd_i, rownnz_A, A_diag_i, A_diag_j, A_offd_i, A_offd_j, B_diag_i, B_diag_j, B_offd_i, B_offd_j, B_ext_diag_i, B_ext_diag_j, B_ext_offd_i, B_ext_offd_j, map_B_to_C, &C_diag_size, &C_offd_size, num_rownnz_A, num_rows_diag_A, num_cols_offd_A, allsquare, num_cols_diag_B, num_cols_offd_B, num_cols_offd_C); HYPRE_ANNOTATE_REGION_END("%s", "First pass"); /*----------------------------------------------------------------------- * Allocate C_diag_data and C_diag_j arrays. * Allocate C_offd_data and C_offd_j arrays. *-----------------------------------------------------------------------*/ last_col_diag_B = first_col_diag_B + (HYPRE_BigInt)num_cols_diag_B - 1; C_diag_data = hypre_CTAlloc(HYPRE_Complex, C_diag_size, memory_location_C); C_diag_j = hypre_CTAlloc(HYPRE_Int, C_diag_size, memory_location_C); if (C_offd_size) { C_offd_data = hypre_CTAlloc(HYPRE_Complex, C_offd_size, memory_location_C); C_offd_j = hypre_CTAlloc(HYPRE_Int, C_offd_size, memory_location_C); } /*----------------------------------------------------------------------- * Second Pass: Fill in C_diag_data and C_diag_j. * Second Pass: Fill in C_offd_data and C_offd_j. *-----------------------------------------------------------------------*/ HYPRE_ANNOTATE_REGION_BEGIN("%s", "Second pass"); #ifdef HYPRE_USING_OPENMP #pragma omp parallel #endif { HYPRE_Int *B_marker = NULL; HYPRE_Int ns, ne, size, rest, ii; HYPRE_Int i1, ii1, i2, i3, jj2, jj3; HYPRE_Int jj_row_begin_diag, jj_count_diag; HYPRE_Int jj_row_begin_offd, jj_count_offd; HYPRE_Int num_threads; HYPRE_Complex a_entry; /*, a_b_product;*/ num_threads = hypre_NumActiveThreads(); size = num_rownnz_A / num_threads; rest = num_rownnz_A - size * num_threads; ii = hypre_GetThreadNum(); if (ii < rest) { ns = ii * size + ii; ne = (ii + 1) * size + ii + 1; } else { ns = ii * size + rest; ne = (ii + 1) * size + rest; } jj_count_diag = C_diag_i[rownnz_A ? rownnz_A[ns] : ns]; jj_count_offd = C_offd_i[rownnz_A ? rownnz_A[ns] : ns]; if (num_cols_diag_B || num_cols_offd_C) { B_marker = hypre_CTAlloc(HYPRE_Int, num_cols_diag_B + num_cols_offd_C, HYPRE_MEMORY_HOST); for (i1 = 0; i1 < num_cols_diag_B + num_cols_offd_C; i1++) { B_marker[i1] = -1; } } /*----------------------------------------------------------------------- * Loop over interior c-points. *-----------------------------------------------------------------------*/ for (i1 = ns; i1 < ne; i1++) { jj_row_begin_diag = jj_count_diag; jj_row_begin_offd = jj_count_offd; if (rownnz_A) { ii1 = rownnz_A[i1]; } else { ii1 = i1; /*-------------------------------------------------------------------- * Create diagonal entry, C_{i1,i1} *--------------------------------------------------------------------*/ if (allsquare) { B_marker[i1] = jj_count_diag; C_diag_data[jj_count_diag] = zero; C_diag_j[jj_count_diag] = i1; jj_count_diag++; } } /*----------------------------------------------------------------- * Loop over entries in row i1 of A_offd. *-----------------------------------------------------------------*/ if (num_cols_offd_A) { for (jj2 = A_offd_i[ii1]; jj2 < A_offd_i[ii1 + 1]; jj2++) { i2 = A_offd_j[jj2]; a_entry = A_offd_data[jj2]; /*----------------------------------------------------------- * Loop over entries in row i2 of B_ext. *-----------------------------------------------------------*/ for (jj3 = B_ext_offd_i[i2]; jj3 < B_ext_offd_i[i2 + 1]; jj3++) { i3 = num_cols_diag_B + B_ext_offd_j[jj3]; /*-------------------------------------------------------- * Check B_marker to see that C_{ii1,i3} has not already * been accounted for. If it has not, create a new entry. * If it has, add new contribution. *--------------------------------------------------------*/ if (B_marker[i3] < jj_row_begin_offd) { B_marker[i3] = jj_count_offd; C_offd_data[jj_count_offd] = a_entry * B_ext_offd_data[jj3]; C_offd_j[jj_count_offd] = i3 - num_cols_diag_B; jj_count_offd++; } else { C_offd_data[B_marker[i3]] += a_entry * B_ext_offd_data[jj3]; } } for (jj3 = B_ext_diag_i[i2]; jj3 < B_ext_diag_i[i2 + 1]; jj3++) { i3 = B_ext_diag_j[jj3]; if (B_marker[i3] < jj_row_begin_diag) { B_marker[i3] = jj_count_diag; C_diag_data[jj_count_diag] = a_entry * B_ext_diag_data[jj3]; C_diag_j[jj_count_diag] = i3; jj_count_diag++; } else { C_diag_data[B_marker[i3]] += a_entry * B_ext_diag_data[jj3]; } } } } /*----------------------------------------------------------------- * Loop over entries in row ii1 of A_diag. *-----------------------------------------------------------------*/ for (jj2 = A_diag_i[ii1]; jj2 < A_diag_i[ii1 + 1]; jj2++) { i2 = A_diag_j[jj2]; a_entry = A_diag_data[jj2]; /*----------------------------------------------------------- * Loop over entries in row i2 of B_diag. *-----------------------------------------------------------*/ for (jj3 = B_diag_i[i2]; jj3 < B_diag_i[i2 + 1]; jj3++) { i3 = B_diag_j[jj3]; /*-------------------------------------------------------- * Check B_marker to see that C_{ii1,i3} has not already * been accounted for. If it has not, create a new entry. * If it has, add new contribution. *--------------------------------------------------------*/ if (B_marker[i3] < jj_row_begin_diag) { B_marker[i3] = jj_count_diag; C_diag_data[jj_count_diag] = a_entry * B_diag_data[jj3]; C_diag_j[jj_count_diag] = i3; jj_count_diag++; } else { C_diag_data[B_marker[i3]] += a_entry * B_diag_data[jj3]; } } if (num_cols_offd_B) { for (jj3 = B_offd_i[i2]; jj3 < B_offd_i[i2 + 1]; jj3++) { i3 = num_cols_diag_B + map_B_to_C[B_offd_j[jj3]]; /*-------------------------------------------------------- * Check B_marker to see that C_{ii1,i3} has not already * been accounted for. If it has not, create a new entry. * If it has, add new contribution. *--------------------------------------------------------*/ if (B_marker[i3] < jj_row_begin_offd) { B_marker[i3] = jj_count_offd; C_offd_data[jj_count_offd] = a_entry * B_offd_data[jj3]; C_offd_j[jj_count_offd] = i3 - num_cols_diag_B; jj_count_offd++; } else { C_offd_data[B_marker[i3]] += a_entry * B_offd_data[jj3]; } } } } } hypre_TFree(B_marker, HYPRE_MEMORY_HOST); } /*end parallel region */ HYPRE_ANNOTATE_REGION_END("%s", "Second pass"); C = hypre_ParCSRMatrixCreate(comm, nrows_A, ncols_B, row_starts_A, col_starts_B, num_cols_offd_C, C_diag_size, C_offd_size); C_diag = hypre_ParCSRMatrixDiag(C); hypre_CSRMatrixData(C_diag) = C_diag_data; hypre_CSRMatrixI(C_diag) = C_diag_i; hypre_CSRMatrixJ(C_diag) = C_diag_j; hypre_CSRMatrixMemoryLocation(C_diag) = memory_location_C; hypre_CSRMatrixSetRownnz(C_diag); C_offd = hypre_ParCSRMatrixOffd(C); hypre_CSRMatrixI(C_offd) = C_offd_i; hypre_ParCSRMatrixOffd(C) = C_offd; if (num_cols_offd_C) { hypre_CSRMatrixData(C_offd) = C_offd_data; hypre_CSRMatrixJ(C_offd) = C_offd_j; hypre_ParCSRMatrixColMapOffd(C) = col_map_offd_C; } hypre_CSRMatrixMemoryLocation(C_offd) = memory_location_C; hypre_CSRMatrixSetRownnz(C_offd); /*----------------------------------------------------------------------- * Free various arrays *-----------------------------------------------------------------------*/ hypre_TFree(B_ext_diag_i, HYPRE_MEMORY_HOST); if (B_ext_diag_size) { hypre_TFree(B_ext_diag_j, HYPRE_MEMORY_HOST); hypre_TFree(B_ext_diag_data, HYPRE_MEMORY_HOST); } hypre_TFree(B_ext_offd_i, HYPRE_MEMORY_HOST); if (B_ext_offd_size) { hypre_TFree(B_ext_offd_j, HYPRE_MEMORY_HOST); hypre_TFree(B_ext_offd_data, HYPRE_MEMORY_HOST); } if (num_cols_offd_B) { hypre_TFree(map_B_to_C, HYPRE_MEMORY_HOST); } hypre_TFree(rownnz_A, memory_location_A); #ifdef HYPRE_PROFILE hypre_profile_times[HYPRE_TIMER_ID_MATMUL] += hypre_MPI_Wtime(); #endif HYPRE_ANNOTATE_FUNC_END; return C; } /*-------------------------------------------------------------------------- * hypre_ParCSRMatrixExtractBExt_Arrays_Overlap * * The following function was formerly part of hypre_ParCSRMatrixExtractBExt * but the code was removed so it can be used for a corresponding function * for Boolean matrices * * JSP: to allow communication overlapping, it returns comm_handle_idx and * comm_handle_data. Before accessing B, they should be destroyed (including * send_data contained in the comm_handle). *--------------------------------------------------------------------------*/ void hypre_ParCSRMatrixExtractBExt_Arrays_Overlap( HYPRE_Int ** pB_ext_i, HYPRE_BigInt ** pB_ext_j, HYPRE_Complex ** pB_ext_data, HYPRE_BigInt ** pB_ext_row_map, HYPRE_Int * num_nonzeros, HYPRE_Int data, HYPRE_Int find_row_map, MPI_Comm comm, hypre_ParCSRCommPkg * comm_pkg, HYPRE_Int num_cols_B, HYPRE_Int num_recvs, HYPRE_Int num_sends, HYPRE_BigInt first_col_diag, HYPRE_BigInt * row_starts, HYPRE_Int * recv_vec_starts, HYPRE_Int * send_map_starts, HYPRE_Int * send_map_elmts, HYPRE_Int * diag_i, HYPRE_Int * diag_j, HYPRE_Int * offd_i, HYPRE_Int * offd_j, HYPRE_BigInt * col_map_offd, HYPRE_Real * diag_data, HYPRE_Real * offd_data, hypre_ParCSRCommHandle **comm_handle_idx, hypre_ParCSRCommHandle **comm_handle_data, HYPRE_Int *CF_marker, HYPRE_Int *CF_marker_offd, HYPRE_Int skip_fine, /* 1 if only coarse points are needed */ HYPRE_Int skip_same_sign /* 1 if only points that have the same sign are needed */ // extended based long range interpolation: skip_fine = 1, skip_same_sign = 0 for S matrix, skip_fine = 1, skip_same_sign = 1 for A matrix // other interpolation: skip_fine = 0, skip_same_sign = 0 ) { HYPRE_UNUSED_VAR(num_cols_B); hypre_ParCSRCommHandle *comm_handle, *row_map_comm_handle = NULL; hypre_ParCSRCommPkg *tmp_comm_pkg = NULL; HYPRE_Int *B_int_i; HYPRE_BigInt *B_int_j; HYPRE_Int *B_ext_i; HYPRE_BigInt * B_ext_j; HYPRE_Complex * B_ext_data = NULL; HYPRE_Complex * B_int_data = NULL; HYPRE_BigInt * B_int_row_map = NULL; HYPRE_BigInt * B_ext_row_map = NULL; HYPRE_Int num_procs, my_id; HYPRE_Int *jdata_recv_vec_starts; HYPRE_Int *jdata_send_map_starts; HYPRE_Int i, j, k; HYPRE_Int start_index; /*HYPRE_Int jrow;*/ HYPRE_Int num_rows_B_ext; HYPRE_Int *prefix_sum_workspace; hypre_MPI_Comm_size(comm, &num_procs); hypre_MPI_Comm_rank(comm, &my_id); HYPRE_BigInt first_row_index = row_starts[0]; num_rows_B_ext = recv_vec_starts[num_recvs]; if ( num_rows_B_ext < 0 ) /* no B_ext, no communication */ { *pB_ext_i = NULL; *pB_ext_j = NULL; if ( data ) { *pB_ext_data = NULL; } if ( find_row_map ) { *pB_ext_row_map = NULL; } *num_nonzeros = 0; return; }; B_int_i = hypre_CTAlloc(HYPRE_Int, send_map_starts[num_sends] + 1, HYPRE_MEMORY_HOST); B_ext_i = hypre_CTAlloc(HYPRE_Int, num_rows_B_ext + 1, HYPRE_MEMORY_HOST); *pB_ext_i = B_ext_i; if ( find_row_map ) { B_int_row_map = hypre_CTAlloc( HYPRE_BigInt, send_map_starts[num_sends] + 1, HYPRE_MEMORY_HOST); B_ext_row_map = hypre_CTAlloc( HYPRE_BigInt, num_rows_B_ext + 1, HYPRE_MEMORY_HOST); *pB_ext_row_map = B_ext_row_map; }; /*-------------------------------------------------------------------------- * generate B_int_i through adding number of row-elements of offd and diag * for corresponding rows. B_int_i[j+1] contains the number of elements of * a row j (which is determined through send_map_elmts) *--------------------------------------------------------------------------*/ jdata_send_map_starts = hypre_CTAlloc(HYPRE_Int, num_sends + 1, HYPRE_MEMORY_HOST); jdata_recv_vec_starts = hypre_CTAlloc(HYPRE_Int, num_recvs + 1, HYPRE_MEMORY_HOST); jdata_send_map_starts[0] = B_int_i[0] = 0; /*HYPRE_Int prefix_sum_workspace[(hypre_NumThreads() + 1)*num_sends];*/ prefix_sum_workspace = hypre_TAlloc(HYPRE_Int, (hypre_NumThreads() + 1) * num_sends, HYPRE_MEMORY_HOST); #ifdef HYPRE_USING_OPENMP #pragma omp parallel private(i,j,k) #endif { /*HYPRE_Int counts[num_sends];*/ HYPRE_Int *counts; counts = hypre_TAlloc(HYPRE_Int, num_sends, HYPRE_MEMORY_HOST); for (i = 0; i < num_sends; i++) { HYPRE_Int j_begin, j_end; hypre_GetSimpleThreadPartition(&j_begin, &j_end, send_map_starts[i + 1] - send_map_starts[i]); j_begin += send_map_starts[i]; j_end += send_map_starts[i]; HYPRE_Int count = 0; if (skip_fine && skip_same_sign) { for (j = j_begin; j < j_end; j++) { HYPRE_Int jrow = send_map_elmts[j]; HYPRE_Int len = 0; if (diag_data[diag_i[jrow]] >= 0) { for (k = diag_i[jrow] + 1; k < diag_i[jrow + 1]; k++) { if (diag_data[k] < 0 && CF_marker[diag_j[k]] >= 0) { len++; } } for (k = offd_i[jrow]; k < offd_i[jrow + 1]; k++) { if (offd_data[k] < 0) { len++; } } } else { for (k = diag_i[jrow] + 1; k < diag_i[jrow + 1]; k++) { if (diag_data[k] > 0 && CF_marker[diag_j[k]] >= 0) { len++; } } for (k = offd_i[jrow]; k < offd_i[jrow + 1]; k++) { if (offd_data[k] > 0) { len++; } } } B_int_i[j + 1] = len; count += len; } } else if (skip_fine) { for (j = j_begin; j < j_end; j++) { HYPRE_Int jrow = send_map_elmts[j]; HYPRE_Int len = 0; for (k = diag_i[jrow]; k < diag_i[jrow + 1]; k++) { if (CF_marker[diag_j[k]] >= 0) { len++; } } for (k = offd_i[jrow]; k < offd_i[jrow + 1]; k++) { if (CF_marker_offd[offd_j[k]] >= 0) { len++; } } B_int_i[j + 1] = len; count += len; } } else { for (j = j_begin; j < j_end; j++) { HYPRE_Int jrow = send_map_elmts[j]; HYPRE_Int len = diag_i[jrow + 1] - diag_i[jrow]; len += offd_i[jrow + 1] - offd_i[jrow]; B_int_i[j + 1] = len; count += len; } } if (find_row_map) { for (j = j_begin; j < j_end; j++) { HYPRE_Int jrow = send_map_elmts[j]; B_int_row_map[j] = (HYPRE_BigInt)jrow + first_row_index; } } counts[i] = count; } hypre_prefix_sum_multiple(counts, jdata_send_map_starts + 1, num_sends, prefix_sum_workspace); #ifdef HYPRE_USING_OPENMP #pragma omp master #endif { for (i = 1; i < num_sends; i++) { jdata_send_map_starts[i + 1] += jdata_send_map_starts[i]; } /*-------------------------------------------------------------------------- * initialize communication *--------------------------------------------------------------------------*/ comm_handle = hypre_ParCSRCommHandleCreate(11, comm_pkg, &B_int_i[1], &(B_ext_i[1]) ); if ( find_row_map ) { /* scatter/gather B_int row numbers to form array of B_ext row numbers */ row_map_comm_handle = hypre_ParCSRCommHandleCreate (21, comm_pkg, B_int_row_map, B_ext_row_map ); } B_int_j = hypre_TAlloc(HYPRE_BigInt, jdata_send_map_starts[num_sends], HYPRE_MEMORY_HOST); if (data) { B_int_data = hypre_TAlloc(HYPRE_Complex, jdata_send_map_starts[num_sends], HYPRE_MEMORY_HOST); } } #ifdef HYPRE_USING_OPENMP #pragma omp barrier #endif for (i = 0; i < num_sends; i++) { HYPRE_Int j_begin, j_end; hypre_GetSimpleThreadPartition(&j_begin, &j_end, send_map_starts[i + 1] - send_map_starts[i]); j_begin += send_map_starts[i]; j_end += send_map_starts[i]; HYPRE_Int count = counts[i] + jdata_send_map_starts[i]; if (data) { if (skip_same_sign && skip_fine) { for (j = j_begin; j < j_end; j++) { HYPRE_Int jrow = send_map_elmts[j]; /*HYPRE_Int count_begin = count;*/ if (diag_data[diag_i[jrow]] >= 0) { for (k = diag_i[jrow] + 1; k < diag_i[jrow + 1]; k++) { if (diag_data[k] < 0 && CF_marker[diag_j[k]] >= 0) { B_int_j[count] = (HYPRE_BigInt)diag_j[k] + first_col_diag; B_int_data[count] = diag_data[k]; count++; } } for (k = offd_i[jrow]; k < offd_i[jrow + 1]; k++) { HYPRE_Int c = offd_j[k]; HYPRE_BigInt c_global = col_map_offd[c]; if (offd_data[k] < 0) { B_int_j[count] = c_global; B_int_data[count] = offd_data[k]; count++; } } } else { for (k = diag_i[jrow] + 1; k < diag_i[jrow + 1]; k++) { if (diag_data[k] > 0 && CF_marker[diag_j[k]] >= 0) { B_int_j[count] = (HYPRE_BigInt)diag_j[k] + first_col_diag; B_int_data[count] = diag_data[k]; count++; } } for (k = offd_i[jrow]; k < offd_i[jrow + 1]; k++) { HYPRE_Int c = offd_j[k]; HYPRE_BigInt c_global = col_map_offd[c]; if (offd_data[k] > 0) { B_int_j[count] = c_global; B_int_data[count] = offd_data[k]; count++; } } } } } else { for (j = j_begin; j < j_end; ++j) { HYPRE_Int jrow = send_map_elmts[j]; for (k = diag_i[jrow]; k < diag_i[jrow + 1]; k++) { B_int_j[count] = (HYPRE_BigInt)diag_j[k] + first_col_diag; B_int_data[count] = diag_data[k]; count++; } for (k = offd_i[jrow]; k < offd_i[jrow + 1]; k++) { B_int_j[count] = col_map_offd[offd_j[k]]; B_int_data[count] = offd_data[k]; count++; } } } } // data else { if (skip_fine) { for (j = j_begin; j < j_end; j++) { HYPRE_Int jrow = send_map_elmts[j]; for (k = diag_i[jrow]; k < diag_i[jrow + 1]; k++) { if (CF_marker[diag_j[k]] >= 0) { B_int_j[count] = (HYPRE_BigInt)diag_j[k] + first_col_diag; count++; } } for (k = offd_i[jrow]; k < offd_i[jrow + 1]; k++) { if (CF_marker_offd[offd_j[k]] >= 0) { B_int_j[count] = col_map_offd[offd_j[k]]; count++; } } } } else { for (j = j_begin; j < j_end; ++j) { HYPRE_Int jrow = send_map_elmts[j]; for (k = diag_i[jrow]; k < diag_i[jrow + 1]; k++) { B_int_j[count] = (HYPRE_BigInt)diag_j[k] + first_col_diag; count++; } for (k = offd_i[jrow]; k < offd_i[jrow + 1]; k++) { B_int_j[count] = col_map_offd[offd_j[k]]; count++; } } } } // !data } /* for each send target */ hypre_TFree(counts, HYPRE_MEMORY_HOST); } /* omp parallel. JSP: this takes most of time in this function */ hypre_TFree(prefix_sum_workspace, HYPRE_MEMORY_HOST); /* Create temporary communication package */ hypre_ParCSRCommPkgCreateAndFill(comm, num_recvs, hypre_ParCSRCommPkgRecvProcs(comm_pkg), jdata_recv_vec_starts, num_sends, hypre_ParCSRCommPkgSendProcs(comm_pkg), jdata_send_map_starts, NULL, &tmp_comm_pkg); hypre_ParCSRCommHandleDestroy(comm_handle); comm_handle = NULL; /*-------------------------------------------------------------------------- * after communication exchange B_ext_i[j+1] contains the number of elements * of a row j ! * evaluate B_ext_i and compute *num_nonzeros for B_ext *--------------------------------------------------------------------------*/ for (i = 0; i < num_recvs; i++) { for (j = recv_vec_starts[i]; j < recv_vec_starts[i + 1]; j++) { B_ext_i[j + 1] += B_ext_i[j]; } } *num_nonzeros = B_ext_i[num_rows_B_ext]; *pB_ext_j = hypre_TAlloc(HYPRE_BigInt, *num_nonzeros, HYPRE_MEMORY_HOST); B_ext_j = *pB_ext_j; if (data) { *pB_ext_data = hypre_TAlloc(HYPRE_Complex, *num_nonzeros, HYPRE_MEMORY_HOST); B_ext_data = *pB_ext_data; } for (i = 0; i < num_recvs; i++) { start_index = B_ext_i[recv_vec_starts[i]]; *num_nonzeros = B_ext_i[recv_vec_starts[i + 1]] - start_index; jdata_recv_vec_starts[i + 1] = B_ext_i[recv_vec_starts[i + 1]]; } *comm_handle_idx = hypre_ParCSRCommHandleCreate(21, tmp_comm_pkg, B_int_j, B_ext_j); if (data) { *comm_handle_data = hypre_ParCSRCommHandleCreate(1, tmp_comm_pkg, B_int_data, B_ext_data); } /* Free memory */ hypre_TFree(jdata_send_map_starts, HYPRE_MEMORY_HOST); hypre_TFree(jdata_recv_vec_starts, HYPRE_MEMORY_HOST); hypre_TFree(tmp_comm_pkg, HYPRE_MEMORY_HOST); if (row_map_comm_handle) { hypre_ParCSRCommHandleDestroy(row_map_comm_handle); row_map_comm_handle = NULL; } if (find_row_map) { hypre_TFree(B_int_row_map, HYPRE_MEMORY_HOST); } hypre_TFree(B_int_i, HYPRE_MEMORY_HOST); /* end generic part */ } /*-------------------------------------------------------------------------- * hypre_ParCSRMatrixExtractBExt_Arrays *--------------------------------------------------------------------------*/ void hypre_ParCSRMatrixExtractBExt_Arrays( HYPRE_Int ** pB_ext_i, HYPRE_BigInt ** pB_ext_j, HYPRE_Complex ** pB_ext_data, HYPRE_BigInt ** pB_ext_row_map, HYPRE_Int * num_nonzeros, HYPRE_Int data, HYPRE_Int find_row_map, MPI_Comm comm, hypre_ParCSRCommPkg * comm_pkg, HYPRE_Int num_cols_B, HYPRE_Int num_recvs, HYPRE_Int num_sends, HYPRE_BigInt first_col_diag, HYPRE_BigInt * row_starts, HYPRE_Int * recv_vec_starts, HYPRE_Int * send_map_starts, HYPRE_Int * send_map_elmts, HYPRE_Int * diag_i, HYPRE_Int * diag_j, HYPRE_Int * offd_i, HYPRE_Int * offd_j, HYPRE_BigInt * col_map_offd, HYPRE_Real * diag_data, HYPRE_Real * offd_data ) { hypre_ParCSRCommHandle *comm_handle_idx, *comm_handle_data; hypre_ParCSRMatrixExtractBExt_Arrays_Overlap( pB_ext_i, pB_ext_j, pB_ext_data, pB_ext_row_map, num_nonzeros, data, find_row_map, comm, comm_pkg, num_cols_B, num_recvs, num_sends, first_col_diag, row_starts, recv_vec_starts, send_map_starts, send_map_elmts, diag_i, diag_j, offd_i, offd_j, col_map_offd, diag_data, offd_data, &comm_handle_idx, &comm_handle_data, NULL, NULL, 0, 0); HYPRE_Int *send_idx = (HYPRE_Int *)comm_handle_idx->send_data; hypre_ParCSRCommHandleDestroy(comm_handle_idx); hypre_TFree(send_idx, HYPRE_MEMORY_HOST); if (data) { HYPRE_Real *send_data = (HYPRE_Real *)comm_handle_data->send_data; hypre_ParCSRCommHandleDestroy(comm_handle_data); hypre_TFree(send_data, HYPRE_MEMORY_HOST); } } /*-------------------------------------------------------------------------- * hypre_ParCSRMatrixExtractBExt : extracts rows from B which are located on * other processors and needed for multiplication with A locally. The rows * are returned as CSRMatrix. *--------------------------------------------------------------------------*/ hypre_CSRMatrix * hypre_ParCSRMatrixExtractBExt_Overlap( hypre_ParCSRMatrix *B, hypre_ParCSRMatrix *A, HYPRE_Int data, hypre_ParCSRCommHandle **comm_handle_idx, hypre_ParCSRCommHandle **comm_handle_data, HYPRE_Int *CF_marker, HYPRE_Int *CF_marker_offd, HYPRE_Int skip_fine, HYPRE_Int skip_same_sign ) { MPI_Comm comm = hypre_ParCSRMatrixComm(B); HYPRE_BigInt first_col_diag = hypre_ParCSRMatrixFirstColDiag(B); /*HYPRE_Int first_row_index = hypre_ParCSRMatrixFirstRowIndex(B);*/ HYPRE_BigInt *col_map_offd = hypre_ParCSRMatrixColMapOffd(B); hypre_ParCSRCommPkg *comm_pkg = hypre_ParCSRMatrixCommPkg(A); HYPRE_Int num_recvs; HYPRE_Int *recv_vec_starts; HYPRE_Int num_sends; HYPRE_Int *send_map_starts; HYPRE_Int *send_map_elmts; hypre_CSRMatrix *diag = hypre_ParCSRMatrixDiag(B); HYPRE_Int *diag_i = hypre_CSRMatrixI(diag); HYPRE_Int *diag_j = hypre_CSRMatrixJ(diag); HYPRE_Real *diag_data = hypre_CSRMatrixData(diag); hypre_CSRMatrix *offd = hypre_ParCSRMatrixOffd(B); HYPRE_Int *offd_i = hypre_CSRMatrixI(offd); HYPRE_Int *offd_j = hypre_CSRMatrixJ(offd); HYPRE_Real *offd_data = hypre_CSRMatrixData(offd); HYPRE_Int num_cols_B, num_nonzeros; HYPRE_Int num_rows_B_ext; hypre_CSRMatrix *B_ext; HYPRE_Int *B_ext_i; HYPRE_BigInt *B_ext_j; HYPRE_Complex *B_ext_data; HYPRE_BigInt *idummy; /*--------------------------------------------------------------------- * If there exists no CommPkg for A, a CommPkg is generated using * equally load balanced partitionings *--------------------------------------------------------------------*/ if (!hypre_ParCSRMatrixCommPkg(A)) { hypre_MatvecCommPkgCreate(A); } comm_pkg = hypre_ParCSRMatrixCommPkg(A); num_recvs = hypre_ParCSRCommPkgNumRecvs(comm_pkg); recv_vec_starts = hypre_ParCSRCommPkgRecvVecStarts(comm_pkg); num_sends = hypre_ParCSRCommPkgNumSends(comm_pkg); send_map_starts = hypre_ParCSRCommPkgSendMapStarts(comm_pkg); send_map_elmts = hypre_ParCSRCommPkgSendMapElmts(comm_pkg); num_cols_B = hypre_ParCSRMatrixGlobalNumCols(B); num_rows_B_ext = recv_vec_starts[num_recvs]; hypre_ParCSRMatrixExtractBExt_Arrays_Overlap ( &B_ext_i, &B_ext_j, &B_ext_data, &idummy, &num_nonzeros, data, 0, comm, comm_pkg, num_cols_B, num_recvs, num_sends, first_col_diag, B->row_starts, recv_vec_starts, send_map_starts, send_map_elmts, diag_i, diag_j, offd_i, offd_j, col_map_offd, diag_data, offd_data, comm_handle_idx, comm_handle_data, CF_marker, CF_marker_offd, skip_fine, skip_same_sign ); B_ext = hypre_CSRMatrixCreate(num_rows_B_ext, num_cols_B, num_nonzeros); hypre_CSRMatrixMemoryLocation(B_ext) = HYPRE_MEMORY_HOST; hypre_CSRMatrixI(B_ext) = B_ext_i; hypre_CSRMatrixBigJ(B_ext) = B_ext_j; if (data) { hypre_CSRMatrixData(B_ext) = B_ext_data; } return B_ext; } hypre_CSRMatrix * hypre_ParCSRMatrixExtractBExt( hypre_ParCSRMatrix *B, hypre_ParCSRMatrix *A, HYPRE_Int want_data ) { #if 0 hypre_ParCSRCommHandle *comm_handle_idx, *comm_handle_data; hypre_CSRMatrix *B_ext = hypre_ParCSRMatrixExtractBExt_Overlap(B, A, want_data, &comm_handle_idx, &comm_handle_data, NULL, NULL, 0, 0); HYPRE_Int *send_idx = (HYPRE_Int *)comm_handle_idx->send_data; hypre_ParCSRCommHandleDestroy(comm_handle_idx); hypre_TFree(send_idx, HYPRE_MEMORY_HOST); if (want_data) { HYPRE_Real *send_data = (HYPRE_Real *)comm_handle_data->send_data; hypre_ParCSRCommHandleDestroy(comm_handle_data); hypre_TFree(send_data, HYPRE_MEMORY_HOST); } #else hypre_assert( hypre_CSRMatrixMemoryLocation(hypre_ParCSRMatrixDiag(B)) == hypre_CSRMatrixMemoryLocation(hypre_ParCSRMatrixOffd(B)) ); hypre_CSRMatrix *B_ext; void *request; if (!hypre_ParCSRMatrixCommPkg(A)) { hypre_MatvecCommPkgCreate(A); } hypre_ParcsrGetExternalRowsInit(B, hypre_CSRMatrixNumCols(hypre_ParCSRMatrixOffd(A)), hypre_ParCSRMatrixColMapOffd(A), hypre_ParCSRMatrixCommPkg(A), want_data, &request); B_ext = hypre_ParcsrGetExternalRowsWait(request); #endif return B_ext; } /*-------------------------------------------------------------------------- * hypre_ParCSRMatrixTransposeHost *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ParCSRMatrixTransposeHost( hypre_ParCSRMatrix *A, hypre_ParCSRMatrix **AT_ptr, HYPRE_Int data ) { MPI_Comm comm = hypre_ParCSRMatrixComm(A); hypre_ParCSRCommPkg *comm_pkg = hypre_ParCSRMatrixCommPkg(A); hypre_CSRMatrix *A_diag = hypre_ParCSRMatrixDiag(A); hypre_CSRMatrix *A_offd = hypre_ParCSRMatrixOffd(A); HYPRE_Int num_cols = hypre_ParCSRMatrixNumCols(A); HYPRE_BigInt first_row_index = hypre_ParCSRMatrixFirstRowIndex(A); HYPRE_BigInt *row_starts = hypre_ParCSRMatrixRowStarts(A); HYPRE_BigInt *col_starts = hypre_ParCSRMatrixColStarts(A); HYPRE_Int num_cols_offd = hypre_CSRMatrixNumCols(A_offd); HYPRE_Int num_sends = 0, num_recvs = 0, num_cols_offd_AT; HYPRE_Int i, j, k, index, counter, j_row; HYPRE_BigInt value; hypre_ParCSRMatrix *AT; hypre_CSRMatrix *AT_diag; hypre_CSRMatrix *AT_offd; hypre_CSRMatrix *AT_tmp; HYPRE_BigInt first_row_index_AT, first_col_diag_AT; HYPRE_Int local_num_rows_AT, local_num_cols_AT; HYPRE_Int *AT_tmp_i; HYPRE_Int *AT_tmp_j; HYPRE_BigInt *AT_big_j = NULL; HYPRE_Complex *AT_tmp_data = NULL; HYPRE_Int *AT_buf_i = NULL; HYPRE_BigInt *AT_buf_j = NULL; HYPRE_Complex *AT_buf_data = NULL; HYPRE_Int *AT_offd_i; HYPRE_Int *AT_offd_j; HYPRE_Complex *AT_offd_data; HYPRE_BigInt *col_map_offd_AT; HYPRE_BigInt row_starts_AT[2]; HYPRE_BigInt col_starts_AT[2]; HYPRE_Int num_procs, my_id; HYPRE_Int *recv_procs = NULL; HYPRE_Int *send_procs = NULL; HYPRE_Int *recv_vec_starts = NULL; HYPRE_Int *send_map_starts = NULL; HYPRE_Int *send_map_elmts = NULL; HYPRE_Int *tmp_recv_vec_starts; HYPRE_Int *tmp_send_map_starts; hypre_ParCSRCommPkg *tmp_comm_pkg = NULL; hypre_ParCSRCommHandle *comm_handle = NULL; hypre_MPI_Comm_size(comm, &num_procs); hypre_MPI_Comm_rank(comm, &my_id); num_cols_offd_AT = 0; counter = 0; AT_offd_j = NULL; AT_offd_data = NULL; col_map_offd_AT = NULL; HYPRE_MemoryLocation memory_location = hypre_ParCSRMatrixMemoryLocation(A); /*--------------------------------------------------------------------- * If there exists no CommPkg for A, a CommPkg is generated using * equally load balanced partitionings *--------------------------------------------------------------------*/ if (!comm_pkg) { hypre_MatvecCommPkgCreate(A); comm_pkg = hypre_ParCSRMatrixCommPkg(A); } if (num_procs > 1) { hypre_CSRMatrixTranspose (A_offd, &AT_tmp, data); AT_tmp_i = hypre_CSRMatrixI(AT_tmp); AT_tmp_j = hypre_CSRMatrixJ(AT_tmp); if (data) { AT_tmp_data = hypre_CSRMatrixData(AT_tmp); } num_sends = hypre_ParCSRCommPkgNumSends(comm_pkg); num_recvs = hypre_ParCSRCommPkgNumRecvs(comm_pkg); recv_procs = hypre_ParCSRCommPkgRecvProcs(comm_pkg); send_procs = hypre_ParCSRCommPkgSendProcs(comm_pkg); recv_vec_starts = hypre_ParCSRCommPkgRecvVecStarts(comm_pkg); send_map_starts = hypre_ParCSRCommPkgSendMapStarts(comm_pkg); send_map_elmts = hypre_ParCSRCommPkgSendMapElmts(comm_pkg); AT_buf_i = hypre_CTAlloc(HYPRE_Int, send_map_starts[num_sends], HYPRE_MEMORY_HOST); if (AT_tmp_i[num_cols_offd]) { AT_big_j = hypre_CTAlloc(HYPRE_BigInt, AT_tmp_i[num_cols_offd], HYPRE_MEMORY_HOST); } for (i = 0; i < AT_tmp_i[num_cols_offd]; i++) { //AT_tmp_j[i] += first_row_index; AT_big_j[i] = (HYPRE_BigInt)AT_tmp_j[i] + first_row_index; } for (i = 0; i < num_cols_offd; i++) { AT_tmp_i[i] = AT_tmp_i[i + 1] - AT_tmp_i[i]; } comm_handle = hypre_ParCSRCommHandleCreate(12, comm_pkg, AT_tmp_i, AT_buf_i); } hypre_CSRMatrixTranspose(A_diag, &AT_diag, data); AT_offd_i = hypre_CTAlloc(HYPRE_Int, num_cols + 1, memory_location); if (num_procs > 1) { hypre_ParCSRCommHandleDestroy(comm_handle); comm_handle = NULL; tmp_send_map_starts = hypre_CTAlloc(HYPRE_Int, num_sends + 1, HYPRE_MEMORY_HOST); tmp_recv_vec_starts = hypre_CTAlloc(HYPRE_Int, num_recvs + 1, HYPRE_MEMORY_HOST); tmp_send_map_starts[0] = send_map_starts[0]; for (i = 0; i < num_sends; i++) { tmp_send_map_starts[i + 1] = tmp_send_map_starts[i]; for (j = send_map_starts[i]; j < send_map_starts[i + 1]; j++) { tmp_send_map_starts[i + 1] += AT_buf_i[j]; AT_offd_i[send_map_elmts[j] + 1] += AT_buf_i[j]; } } for (i = 0; i < num_cols; i++) { AT_offd_i[i + 1] += AT_offd_i[i]; } tmp_recv_vec_starts[0] = recv_vec_starts[0]; for (i = 0; i < num_recvs; i++) { tmp_recv_vec_starts[i + 1] = tmp_recv_vec_starts[i]; for (j = recv_vec_starts[i]; j < recv_vec_starts[i + 1]; j++) { tmp_recv_vec_starts[i + 1] += AT_tmp_i[j]; } } /* Create temporary communication package */ hypre_ParCSRCommPkgCreateAndFill(comm, num_recvs, recv_procs, tmp_recv_vec_starts, num_sends, send_procs, tmp_send_map_starts, NULL, &tmp_comm_pkg); AT_buf_j = hypre_CTAlloc(HYPRE_BigInt, tmp_send_map_starts[num_sends], HYPRE_MEMORY_HOST); comm_handle = hypre_ParCSRCommHandleCreate(22, tmp_comm_pkg, AT_big_j, AT_buf_j); hypre_ParCSRCommHandleDestroy(comm_handle); comm_handle = NULL; hypre_TFree(AT_big_j, HYPRE_MEMORY_HOST); if (data) { AT_buf_data = hypre_CTAlloc(HYPRE_Complex, tmp_send_map_starts[num_sends], HYPRE_MEMORY_HOST); comm_handle = hypre_ParCSRCommHandleCreate(2, tmp_comm_pkg, AT_tmp_data, AT_buf_data); hypre_ParCSRCommHandleDestroy(comm_handle); comm_handle = NULL; } hypre_TFree(tmp_recv_vec_starts, HYPRE_MEMORY_HOST); hypre_TFree(tmp_send_map_starts, HYPRE_MEMORY_HOST); hypre_TFree(tmp_comm_pkg, HYPRE_MEMORY_HOST); hypre_CSRMatrixDestroy(AT_tmp); if (AT_offd_i[num_cols]) { AT_offd_j = hypre_CTAlloc(HYPRE_Int, AT_offd_i[num_cols], memory_location); AT_big_j = hypre_CTAlloc(HYPRE_BigInt, AT_offd_i[num_cols], HYPRE_MEMORY_HOST); if (data) { AT_offd_data = hypre_CTAlloc(HYPRE_Complex, AT_offd_i[num_cols], memory_location); } } else { AT_offd_j = NULL; AT_offd_data = NULL; } counter = 0; for (i = 0; i < num_sends; i++) { for (j = send_map_starts[i]; j < send_map_starts[i + 1]; j++) { j_row = send_map_elmts[j]; index = AT_offd_i[j_row]; for (k = 0; k < AT_buf_i[j]; k++) { if (data) { AT_offd_data[index] = AT_buf_data[counter]; } AT_big_j[index++] = AT_buf_j[counter++]; } AT_offd_i[j_row] = index; } } for (i = num_cols; i > 0; i--) { AT_offd_i[i] = AT_offd_i[i - 1]; } AT_offd_i[0] = 0; if (counter) { hypre_BigQsort0(AT_buf_j, 0, counter - 1); num_cols_offd_AT = 1; value = AT_buf_j[0]; for (i = 1; i < counter; i++) { if (value < AT_buf_j[i]) { AT_buf_j[num_cols_offd_AT++] = AT_buf_j[i]; value = AT_buf_j[i]; } } } if (num_cols_offd_AT) { col_map_offd_AT = hypre_CTAlloc(HYPRE_BigInt, num_cols_offd_AT, HYPRE_MEMORY_HOST); } else { col_map_offd_AT = NULL; } for (i = 0; i < num_cols_offd_AT; i++) { col_map_offd_AT[i] = AT_buf_j[i]; } hypre_TFree(AT_buf_i, HYPRE_MEMORY_HOST); hypre_TFree(AT_buf_j, HYPRE_MEMORY_HOST); if (data) { hypre_TFree(AT_buf_data, HYPRE_MEMORY_HOST); } for (i = 0; i < counter; i++) { AT_offd_j[i] = hypre_BigBinarySearch(col_map_offd_AT, AT_big_j[i], num_cols_offd_AT); } hypre_TFree(AT_big_j, HYPRE_MEMORY_HOST); } AT_offd = hypre_CSRMatrixCreate(num_cols, num_cols_offd_AT, counter); hypre_CSRMatrixMemoryLocation(AT_offd) = memory_location; hypre_CSRMatrixI(AT_offd) = AT_offd_i; hypre_CSRMatrixJ(AT_offd) = AT_offd_j; hypre_CSRMatrixData(AT_offd) = AT_offd_data; for (i = 0; i < 2; i++) { row_starts_AT[i] = col_starts[i]; col_starts_AT[i] = row_starts[i]; } first_row_index_AT = row_starts_AT[0]; first_col_diag_AT = col_starts_AT[0]; local_num_rows_AT = (HYPRE_Int)(row_starts_AT[1] - first_row_index_AT ); local_num_cols_AT = (HYPRE_Int)(col_starts_AT[1] - first_col_diag_AT); AT = hypre_CTAlloc(hypre_ParCSRMatrix, 1, HYPRE_MEMORY_HOST); hypre_ParCSRMatrixComm(AT) = comm; hypre_ParCSRMatrixDiag(AT) = AT_diag; hypre_ParCSRMatrixOffd(AT) = AT_offd; hypre_ParCSRMatrixGlobalNumRows(AT) = hypre_ParCSRMatrixGlobalNumCols(A); hypre_ParCSRMatrixGlobalNumCols(AT) = hypre_ParCSRMatrixGlobalNumRows(A); hypre_ParCSRMatrixRowStarts(AT)[0] = row_starts_AT[0]; hypre_ParCSRMatrixRowStarts(AT)[1] = row_starts_AT[1]; hypre_ParCSRMatrixColStarts(AT)[0] = col_starts_AT[0]; hypre_ParCSRMatrixColStarts(AT)[1] = col_starts_AT[1]; hypre_ParCSRMatrixColMapOffd(AT) = col_map_offd_AT; hypre_ParCSRMatrixFirstRowIndex(AT) = first_row_index_AT; hypre_ParCSRMatrixFirstColDiag(AT) = first_col_diag_AT; hypre_ParCSRMatrixLastRowIndex(AT) = first_row_index_AT + local_num_rows_AT - 1; hypre_ParCSRMatrixLastColDiag(AT) = first_col_diag_AT + local_num_cols_AT - 1; hypre_ParCSRMatrixOwnsData(AT) = 1; hypre_ParCSRMatrixCommPkg(AT) = NULL; hypre_ParCSRMatrixCommPkgT(AT) = NULL; hypre_ParCSRMatrixRowindices(AT) = NULL; hypre_ParCSRMatrixRowvalues(AT) = NULL; hypre_ParCSRMatrixGetrowactive(AT) = 0; hypre_ParCSRMatrixOwnsAssumedPartition(AT) = 1; *AT_ptr = AT; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_ParCSRMatrixTranspose *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ParCSRMatrixTranspose( hypre_ParCSRMatrix *A, hypre_ParCSRMatrix **AT_ptr, HYPRE_Int data ) { hypre_GpuProfilingPushRange("ParCSRMatrixTranspose"); #if defined(HYPRE_USING_GPU) HYPRE_ExecutionPolicy exec = hypre_GetExecPolicy1( hypre_ParCSRMatrixMemoryLocation(A) ); if (exec == HYPRE_EXEC_DEVICE) { hypre_ParCSRMatrixTransposeDevice(A, AT_ptr, data); } else #endif { hypre_ParCSRMatrixTransposeHost(A, AT_ptr, data); } hypre_GpuProfilingPopRange(); return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_ParCSRMatrixLocalTranspose *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ParCSRMatrixLocalTranspose( hypre_ParCSRMatrix *A ) { if (!hypre_ParCSRMatrixDiagT(A)) { hypre_CSRMatrix *A_diag = hypre_ParCSRMatrixDiag(A); if (A_diag) { hypre_CSRMatrix *AT_diag = NULL; hypre_CSRMatrixTranspose(A_diag, &AT_diag, 1); hypre_ParCSRMatrixDiagT(A) = AT_diag; } } if (!hypre_ParCSRMatrixOffdT(A)) { hypre_CSRMatrix *A_offd = hypre_ParCSRMatrixOffd(A); if (A_offd) { hypre_CSRMatrix *AT_offd = NULL; hypre_CSRMatrixTranspose(A_offd, &AT_offd, 1); hypre_ParCSRMatrixOffdT(A) = AT_offd; } } return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_ParCSRMatrixGenSpanningTree * * generate a parallel spanning tree (for Maxwell Equation) * G_csr is the node to edge connectivity matrix *--------------------------------------------------------------------------*/ void hypre_ParCSRMatrixGenSpanningTree( hypre_ParCSRMatrix *G_csr, HYPRE_Int **indices, HYPRE_Int G_type ) { HYPRE_BigInt nrows_G, ncols_G; HYPRE_Int *G_diag_i, *G_diag_j, *GT_diag_mat, i, j, k, edge; HYPRE_Int *nodes_marked, *edges_marked, *queue, queue_tail, queue_head, node; HYPRE_Int mypid, nprocs, n_children, *children, nsends, *send_procs, *recv_cnts; HYPRE_Int nrecvs, *recv_procs, n_proc_array, *proc_array, *pgraph_i, *pgraph_j; HYPRE_Int parent, proc, proc2, node2, found, *t_indices, tree_size, *T_diag_i; HYPRE_Int *T_diag_j, *counts, offset; MPI_Comm comm; hypre_ParCSRCommPkg *comm_pkg; hypre_CSRMatrix *G_diag; /* fetch G matrix (G_type = 0 ==> node to edge) */ if (G_type == 0) { nrows_G = hypre_ParCSRMatrixGlobalNumRows(G_csr); ncols_G = hypre_ParCSRMatrixGlobalNumCols(G_csr); G_diag = hypre_ParCSRMatrixDiag(G_csr); G_diag_i = hypre_CSRMatrixI(G_diag); G_diag_j = hypre_CSRMatrixJ(G_diag); } else { nrows_G = hypre_ParCSRMatrixGlobalNumCols(G_csr); ncols_G = hypre_ParCSRMatrixGlobalNumRows(G_csr); G_diag = hypre_ParCSRMatrixDiag(G_csr); T_diag_i = hypre_CSRMatrixI(G_diag); T_diag_j = hypre_CSRMatrixJ(G_diag); counts = hypre_TAlloc(HYPRE_Int, nrows_G, HYPRE_MEMORY_HOST); for (i = 0; i < nrows_G; i++) { counts[i] = 0; } for (i = 0; i < T_diag_i[ncols_G]; i++) { counts[T_diag_j[i]]++; } G_diag_i = hypre_TAlloc(HYPRE_Int, (nrows_G + 1), HYPRE_MEMORY_HOST); G_diag_j = hypre_TAlloc(HYPRE_Int, T_diag_i[ncols_G], HYPRE_MEMORY_HOST); G_diag_i[0] = 0; for (i = 1; i <= nrows_G; i++) { G_diag_i[i] = G_diag_i[i - 1] + counts[i - 1]; } for (i = 0; i < ncols_G; i++) { for (j = T_diag_i[i]; j < T_diag_i[i + 1]; j++) { k = T_diag_j[j]; offset = G_diag_i[k]++; G_diag_j[offset] = i; } } G_diag_i[0] = 0; for (i = 1; i <= nrows_G; i++) { G_diag_i[i] = G_diag_i[i - 1] + counts[i - 1]; } hypre_TFree(counts, HYPRE_MEMORY_HOST); } /* form G transpose in special form (2 nodes per edge max) */ GT_diag_mat = hypre_TAlloc(HYPRE_Int, 2 * ncols_G, HYPRE_MEMORY_HOST); for (i = 0; i < 2 * ncols_G; i++) { GT_diag_mat[i] = -1; } for (i = 0; i < nrows_G; i++) { for (j = G_diag_i[i]; j < G_diag_i[i + 1]; j++) { edge = G_diag_j[j]; if (GT_diag_mat[edge * 2] == -1) { GT_diag_mat[edge * 2] = i; } else { GT_diag_mat[edge * 2 + 1] = i; } } } /* BFS on the local matrix graph to find tree */ nodes_marked = hypre_TAlloc(HYPRE_Int, nrows_G, HYPRE_MEMORY_HOST); edges_marked = hypre_TAlloc(HYPRE_Int, ncols_G, HYPRE_MEMORY_HOST); for (i = 0; i < nrows_G; i++) { nodes_marked[i] = 0; } for (i = 0; i < ncols_G; i++) { edges_marked[i] = 0; } queue = hypre_TAlloc(HYPRE_Int, nrows_G, HYPRE_MEMORY_HOST); queue_head = 0; queue_tail = 1; queue[0] = 0; nodes_marked[0] = 1; while ((queue_tail - queue_head) > 0) { node = queue[queue_tail - 1]; queue_tail--; for (i = G_diag_i[node]; i < G_diag_i[node + 1]; i++) { edge = G_diag_j[i]; if (edges_marked[edge] == 0) { if (GT_diag_mat[2 * edge + 1] != -1) { node2 = GT_diag_mat[2 * edge]; if (node2 == node) { node2 = GT_diag_mat[2 * edge + 1]; } if (nodes_marked[node2] == 0) { nodes_marked[node2] = 1; edges_marked[edge] = 1; queue[queue_tail] = node2; queue_tail++; } } } } } hypre_TFree(nodes_marked, HYPRE_MEMORY_HOST); hypre_TFree(queue, HYPRE_MEMORY_HOST); hypre_TFree(GT_diag_mat, HYPRE_MEMORY_HOST); /* fetch the communication information from */ comm = hypre_ParCSRMatrixComm(G_csr); hypre_MPI_Comm_rank(comm, &mypid); hypre_MPI_Comm_size(comm, &nprocs); comm_pkg = hypre_ParCSRMatrixCommPkg(G_csr); if (nprocs == 1 && comm_pkg == NULL) { hypre_MatvecCommPkgCreate((hypre_ParCSRMatrix *) G_csr); comm_pkg = hypre_ParCSRMatrixCommPkg(G_csr); } /* construct processor graph based on node-edge connection */ /* (local edges connected to neighbor processor nodes) */ n_children = 0; nrecvs = nsends = 0; if (nprocs > 1) { nsends = hypre_ParCSRCommPkgNumSends(comm_pkg); send_procs = hypre_ParCSRCommPkgSendProcs(comm_pkg); nrecvs = hypre_ParCSRCommPkgNumRecvs(comm_pkg); recv_procs = hypre_ParCSRCommPkgRecvProcs(comm_pkg); proc_array = NULL; if ((nsends + nrecvs) > 0) { n_proc_array = 0; proc_array = hypre_TAlloc(HYPRE_Int, (nsends + nrecvs), HYPRE_MEMORY_HOST); for (i = 0; i < nsends; i++) { proc_array[i] = send_procs[i]; } for (i = 0; i < nrecvs; i++) { proc_array[nsends + i] = recv_procs[i]; } hypre_qsort0(proc_array, 0, nsends + nrecvs - 1); n_proc_array = 1; for (i = 1; i < nrecvs + nsends; i++) if (proc_array[i] != proc_array[n_proc_array]) { proc_array[n_proc_array++] = proc_array[i]; } } pgraph_i = hypre_TAlloc(HYPRE_Int, (nprocs + 1), HYPRE_MEMORY_HOST); recv_cnts = hypre_TAlloc(HYPRE_Int, nprocs, HYPRE_MEMORY_HOST); hypre_MPI_Allgather(&n_proc_array, 1, HYPRE_MPI_INT, recv_cnts, 1, HYPRE_MPI_INT, comm); pgraph_i[0] = 0; for (i = 1; i <= nprocs; i++) { pgraph_i[i] = pgraph_i[i - 1] + recv_cnts[i - 1]; } pgraph_j = hypre_TAlloc(HYPRE_Int, pgraph_i[nprocs], HYPRE_MEMORY_HOST); hypre_MPI_Allgatherv(proc_array, n_proc_array, HYPRE_MPI_INT, pgraph_j, recv_cnts, pgraph_i, HYPRE_MPI_INT, comm); hypre_TFree(recv_cnts, HYPRE_MEMORY_HOST); /* BFS on the processor graph to determine parent and children */ nodes_marked = hypre_TAlloc(HYPRE_Int, nprocs, HYPRE_MEMORY_HOST); for (i = 0; i < nprocs; i++) { nodes_marked[i] = -1; } queue = hypre_TAlloc(HYPRE_Int, nprocs, HYPRE_MEMORY_HOST); queue_head = 0; queue_tail = 1; node = 0; queue[0] = node; while ((queue_tail - queue_head) > 0) { proc = queue[queue_tail - 1]; queue_tail--; for (i = pgraph_i[proc]; i < pgraph_i[proc + 1]; i++) { proc2 = pgraph_j[i]; if (nodes_marked[proc2] < 0) { nodes_marked[proc2] = proc; queue[queue_tail] = proc2; queue_tail++; } } } parent = nodes_marked[mypid]; n_children = 0; for (i = 0; i < nprocs; i++) if (nodes_marked[i] == mypid) { n_children++; } if (n_children == 0) {n_children = 0; children = NULL;} else { children = hypre_TAlloc(HYPRE_Int, n_children, HYPRE_MEMORY_HOST); n_children = 0; for (i = 0; i < nprocs; i++) if (nodes_marked[i] == mypid) { children[n_children++] = i; } } hypre_TFree(nodes_marked, HYPRE_MEMORY_HOST); hypre_TFree(queue, HYPRE_MEMORY_HOST); hypre_TFree(pgraph_i, HYPRE_MEMORY_HOST); hypre_TFree(pgraph_j, HYPRE_MEMORY_HOST); } /* first, connection with my parent : if the edge in my parent * * is incident to one of my nodes, then my parent will mark it */ found = 0; for (i = 0; i < nrecvs; i++) { proc = hypre_ParCSRCommPkgRecvProc(comm_pkg, i); if (proc == parent) { found = 1; break; } } /* but if all the edges connected to my parent are on my side, * * then I will just pick one of them as tree edge */ if (found == 0) { for (i = 0; i < nsends; i++) { proc = hypre_ParCSRCommPkgSendProc(comm_pkg, i); if (proc == parent) { k = hypre_ParCSRCommPkgSendMapStart(comm_pkg, i); edge = hypre_ParCSRCommPkgSendMapElmt(comm_pkg, k); edges_marked[edge] = 1; break; } } } /* next, if my processor has an edge incident on one node in my * * child, put this edge on the tree. But if there is no such * * edge, then I will assume my child will pick up an edge */ for (j = 0; j < n_children; j++) { proc = children[j]; for (i = 0; i < nsends; i++) { proc2 = hypre_ParCSRCommPkgSendProc(comm_pkg, i); if (proc == proc2) { k = hypre_ParCSRCommPkgSendMapStart(comm_pkg, i); edge = hypre_ParCSRCommPkgSendMapElmt(comm_pkg, k); edges_marked[edge] = 1; break; } } } if (n_children > 0) { hypre_TFree(children, HYPRE_MEMORY_HOST); } /* count the size of the tree */ tree_size = 0; for (i = 0; i < ncols_G; i++) if (edges_marked[i] == 1) { tree_size++; } t_indices = hypre_TAlloc(HYPRE_Int, (tree_size + 1), HYPRE_MEMORY_HOST); t_indices[0] = tree_size; tree_size = 1; for (i = 0; i < ncols_G; i++) if (edges_marked[i] == 1) { t_indices[tree_size++] = i; } (*indices) = t_indices; hypre_TFree(edges_marked, HYPRE_MEMORY_HOST); if (G_type != 0) { hypre_TFree(G_diag_i, HYPRE_MEMORY_HOST); hypre_TFree(G_diag_j, HYPRE_MEMORY_HOST); } } /* ----------------------------------------------------------------------------- * extract submatrices based on given indices * ----------------------------------------------------------------------------- */ void hypre_ParCSRMatrixExtractSubmatrices( hypre_ParCSRMatrix *A_csr, HYPRE_Int *indices2, hypre_ParCSRMatrix ***submatrices ) { HYPRE_Int nrows_A, nindices, *indices, *A_diag_i, *A_diag_j, mypid, nprocs; HYPRE_Int i, j, k, *proc_offsets1, *proc_offsets2, *exp_indices; HYPRE_BigInt *itmp_array; HYPRE_Int nnz11, nnz12, nnz21, nnz22, col, ncols_offd, nnz_offd, nnz_diag; HYPRE_Int nrows, nnz; HYPRE_BigInt global_nrows, global_ncols, *row_starts, *col_starts; HYPRE_Int *diag_i, *diag_j, row, *offd_i; HYPRE_Complex *A_diag_a, *diag_a; hypre_ParCSRMatrix *A11_csr, *A12_csr, *A21_csr, *A22_csr; hypre_CSRMatrix *A_diag, *diag, *offd; MPI_Comm comm; /* ----------------------------------------------------- * first make sure the incoming indices are in order * ----------------------------------------------------- */ nindices = indices2[0]; indices = &(indices2[1]); hypre_qsort0(indices, 0, nindices - 1); /* ----------------------------------------------------- * fetch matrix information * ----------------------------------------------------- */ nrows_A = (HYPRE_Int) hypre_ParCSRMatrixGlobalNumRows(A_csr); A_diag = hypre_ParCSRMatrixDiag(A_csr); A_diag_i = hypre_CSRMatrixI(A_diag); A_diag_j = hypre_CSRMatrixJ(A_diag); A_diag_a = hypre_CSRMatrixData(A_diag); comm = hypre_ParCSRMatrixComm(A_csr); hypre_MPI_Comm_rank(comm, &mypid); hypre_MPI_Comm_size(comm, &nprocs); if (nprocs > 1) { hypre_error_w_msg(HYPRE_ERROR_GENERIC, "ExtractSubmatrices: cannot handle nprocs > 1 yet.\n"); exit(1); } /* ----------------------------------------------------- * compute new matrix dimensions * ----------------------------------------------------- */ proc_offsets1 = hypre_TAlloc(HYPRE_Int, (nprocs + 1), HYPRE_MEMORY_HOST); proc_offsets2 = hypre_TAlloc(HYPRE_Int, (nprocs + 1), HYPRE_MEMORY_HOST); hypre_MPI_Allgather(&nindices, 1, HYPRE_MPI_INT, proc_offsets1, 1, HYPRE_MPI_INT, comm); k = 0; for (i = 0; i < nprocs; i++) { j = proc_offsets1[i]; proc_offsets1[i] = k; k += j; } proc_offsets1[nprocs] = k; itmp_array = hypre_ParCSRMatrixRowStarts(A_csr); for (i = 0; i <= nprocs; i++) { proc_offsets2[i] = itmp_array[i] - proc_offsets1[i]; } /* ----------------------------------------------------- * assign id's to row and col for later processing * ----------------------------------------------------- */ exp_indices = hypre_TAlloc(HYPRE_Int, nrows_A, HYPRE_MEMORY_HOST); for (i = 0; i < nrows_A; i++) { exp_indices[i] = -1; } for (i = 0; i < nindices; i++) { if (exp_indices[indices[i]] == -1) { exp_indices[indices[i]] = i; } else { hypre_error_w_msg(HYPRE_ERROR_GENERIC, "ExtractSubmatrices: wrong index %d %d\n"); exit(1); } } k = 0; for (i = 0; i < nrows_A; i++) { if (exp_indices[i] < 0) { exp_indices[i] = - k - 1; k++; } } /* ----------------------------------------------------- * compute number of nonzeros for each block * ----------------------------------------------------- */ nnz11 = nnz12 = nnz21 = nnz22 = 0; for (i = 0; i < nrows_A; i++) { if (exp_indices[i] >= 0) { for (j = A_diag_i[i]; j < A_diag_i[i + 1]; j++) { col = A_diag_j[j]; if (exp_indices[col] >= 0) { nnz11++; } else { nnz12++; } } } else { for (j = A_diag_i[i]; j < A_diag_i[i + 1]; j++) { col = A_diag_j[j]; if (exp_indices[col] >= 0) { nnz21++; } else { nnz22++; } } } } /* ----------------------------------------------------- * create A11 matrix (assume sequential for the moment) * ----------------------------------------------------- */ ncols_offd = 0; nnz_offd = 0; nnz_diag = nnz11; /* This case is not yet implemented! */ global_nrows = 0; global_ncols = 0; row_starts = NULL; col_starts = NULL; A11_csr = hypre_ParCSRMatrixCreate(comm, global_nrows, global_ncols, row_starts, col_starts, ncols_offd, nnz_diag, nnz_offd); nrows = nindices; diag_i = hypre_CTAlloc(HYPRE_Int, nrows + 1, HYPRE_MEMORY_HOST); diag_j = hypre_CTAlloc(HYPRE_Int, nnz_diag, HYPRE_MEMORY_HOST); diag_a = hypre_CTAlloc(HYPRE_Complex, nnz_diag, HYPRE_MEMORY_HOST); nnz = 0; row = 0; diag_i[0] = 0; for (i = 0; i < nrows_A; i++) { if (exp_indices[i] >= 0) { for (j = A_diag_i[i]; j < A_diag_i[i + 1]; j++) { col = A_diag_j[j]; if (exp_indices[col] >= 0) { diag_j[nnz] = exp_indices[col]; diag_a[nnz++] = A_diag_a[j]; } } row++; diag_i[row] = nnz; } } diag = hypre_ParCSRMatrixDiag(A11_csr); hypre_CSRMatrixI(diag) = diag_i; hypre_CSRMatrixJ(diag) = diag_j; hypre_CSRMatrixData(diag) = diag_a; offd_i = hypre_CTAlloc(HYPRE_Int, nrows + 1, HYPRE_MEMORY_HOST); for (i = 0; i <= nrows; i++) { offd_i[i] = 0; } offd = hypre_ParCSRMatrixOffd(A11_csr); hypre_CSRMatrixI(offd) = offd_i; hypre_CSRMatrixJ(offd) = NULL; hypre_CSRMatrixData(offd) = NULL; /* ----------------------------------------------------- * create A12 matrix (assume sequential for the moment) * ----------------------------------------------------- */ ncols_offd = 0; nnz_offd = 0; nnz_diag = nnz12; global_nrows = (HYPRE_BigInt)proc_offsets1[nprocs]; global_ncols = (HYPRE_BigInt)proc_offsets2[nprocs]; row_starts = hypre_CTAlloc(HYPRE_BigInt, nprocs + 1, HYPRE_MEMORY_HOST); col_starts = hypre_CTAlloc(HYPRE_BigInt, nprocs + 1, HYPRE_MEMORY_HOST); for (i = 0; i <= nprocs; i++) { row_starts[i] = (HYPRE_BigInt)proc_offsets1[i]; col_starts[i] = (HYPRE_BigInt)proc_offsets2[i]; } A12_csr = hypre_ParCSRMatrixCreate(comm, global_nrows, global_ncols, row_starts, col_starts, ncols_offd, nnz_diag, nnz_offd); nrows = nindices; diag_i = hypre_CTAlloc(HYPRE_Int, nrows + 1, HYPRE_MEMORY_HOST); diag_j = hypre_CTAlloc(HYPRE_Int, nnz_diag, HYPRE_MEMORY_HOST); diag_a = hypre_CTAlloc(HYPRE_Complex, nnz_diag, HYPRE_MEMORY_HOST); nnz = 0; row = 0; diag_i[0] = 0; for (i = 0; i < nrows_A; i++) { if (exp_indices[i] >= 0) { for (j = A_diag_i[i]; j < A_diag_i[i + 1]; j++) { col = A_diag_j[j]; if (exp_indices[col] < 0) { diag_j[nnz] = - exp_indices[col] - 1; diag_a[nnz++] = A_diag_a[j]; } } row++; diag_i[row] = nnz; } } if (nnz > nnz_diag) { hypre_assert(0); hypre_error(HYPRE_ERROR_GENERIC); } diag = hypre_ParCSRMatrixDiag(A12_csr); hypre_CSRMatrixI(diag) = diag_i; hypre_CSRMatrixJ(diag) = diag_j; hypre_CSRMatrixData(diag) = diag_a; offd_i = hypre_CTAlloc(HYPRE_Int, nrows + 1, HYPRE_MEMORY_HOST); for (i = 0; i <= nrows; i++) { offd_i[i] = 0; } offd = hypre_ParCSRMatrixOffd(A12_csr); hypre_CSRMatrixI(offd) = offd_i; hypre_CSRMatrixJ(offd) = NULL; hypre_CSRMatrixData(offd) = NULL; hypre_TFree(row_starts, HYPRE_MEMORY_HOST); hypre_TFree(col_starts, HYPRE_MEMORY_HOST); /* ----------------------------------------------------- * create A21 matrix (assume sequential for the moment) * ----------------------------------------------------- */ ncols_offd = 0; nnz_offd = 0; nnz_diag = nnz21; global_nrows = (HYPRE_BigInt)proc_offsets2[nprocs]; global_ncols = (HYPRE_BigInt)proc_offsets1[nprocs]; row_starts = hypre_CTAlloc(HYPRE_BigInt, nprocs + 1, HYPRE_MEMORY_HOST); col_starts = hypre_CTAlloc(HYPRE_BigInt, nprocs + 1, HYPRE_MEMORY_HOST); for (i = 0; i <= nprocs; i++) { row_starts[i] = (HYPRE_BigInt)proc_offsets2[i]; col_starts[i] = (HYPRE_BigInt)proc_offsets1[i]; } A21_csr = hypre_ParCSRMatrixCreate(comm, global_nrows, global_ncols, row_starts, col_starts, ncols_offd, nnz_diag, nnz_offd); nrows = nrows_A - nindices; diag_i = hypre_CTAlloc(HYPRE_Int, nrows + 1, HYPRE_MEMORY_HOST); diag_j = hypre_CTAlloc(HYPRE_Int, nnz_diag, HYPRE_MEMORY_HOST); diag_a = hypre_CTAlloc(HYPRE_Complex, nnz_diag, HYPRE_MEMORY_HOST); nnz = 0; row = 0; diag_i[0] = 0; for (i = 0; i < nrows_A; i++) { if (exp_indices[i] < 0) { for (j = A_diag_i[i]; j < A_diag_i[i + 1]; j++) { col = A_diag_j[j]; if (exp_indices[col] >= 0) { diag_j[nnz] = exp_indices[col]; diag_a[nnz++] = A_diag_a[j]; } } row++; diag_i[row] = nnz; } } diag = hypre_ParCSRMatrixDiag(A21_csr); hypre_CSRMatrixI(diag) = diag_i; hypre_CSRMatrixJ(diag) = diag_j; hypre_CSRMatrixData(diag) = diag_a; offd_i = hypre_CTAlloc(HYPRE_Int, nrows + 1, HYPRE_MEMORY_HOST); for (i = 0; i <= nrows; i++) { offd_i[i] = 0; } offd = hypre_ParCSRMatrixOffd(A21_csr); hypre_CSRMatrixI(offd) = offd_i; hypre_CSRMatrixJ(offd) = NULL; hypre_CSRMatrixData(offd) = NULL; hypre_TFree(row_starts, HYPRE_MEMORY_HOST); hypre_TFree(col_starts, HYPRE_MEMORY_HOST); /* ----------------------------------------------------- * create A22 matrix (assume sequential for the moment) * ----------------------------------------------------- */ ncols_offd = 0; nnz_offd = 0; nnz_diag = nnz22; global_nrows = (HYPRE_BigInt)proc_offsets2[nprocs]; global_ncols = (HYPRE_BigInt)proc_offsets2[nprocs]; row_starts = hypre_CTAlloc(HYPRE_BigInt, nprocs + 1, HYPRE_MEMORY_HOST); col_starts = hypre_CTAlloc(HYPRE_BigInt, nprocs + 1, HYPRE_MEMORY_HOST); for (i = 0; i <= nprocs; i++) { row_starts[i] = (HYPRE_BigInt)proc_offsets2[i]; col_starts[i] = (HYPRE_BigInt)proc_offsets2[i]; } A22_csr = hypre_ParCSRMatrixCreate(comm, global_nrows, global_ncols, row_starts, col_starts, ncols_offd, nnz_diag, nnz_offd); nrows = nrows_A - nindices; diag_i = hypre_CTAlloc(HYPRE_Int, nrows + 1, HYPRE_MEMORY_HOST); diag_j = hypre_CTAlloc(HYPRE_Int, nnz_diag, HYPRE_MEMORY_HOST); diag_a = hypre_CTAlloc(HYPRE_Complex, nnz_diag, HYPRE_MEMORY_HOST); nnz = 0; row = 0; diag_i[0] = 0; for (i = 0; i < nrows_A; i++) { if (exp_indices[i] < 0) { for (j = A_diag_i[i]; j < A_diag_i[i + 1]; j++) { col = A_diag_j[j]; if (exp_indices[col] < 0) { diag_j[nnz] = - exp_indices[col] - 1; diag_a[nnz++] = A_diag_a[j]; } } row++; diag_i[row] = nnz; } } diag = hypre_ParCSRMatrixDiag(A22_csr); hypre_CSRMatrixI(diag) = diag_i; hypre_CSRMatrixJ(diag) = diag_j; hypre_CSRMatrixData(diag) = diag_a; offd_i = hypre_CTAlloc(HYPRE_Int, nrows + 1, HYPRE_MEMORY_HOST); for (i = 0; i <= nrows; i++) { offd_i[i] = 0; } offd = hypre_ParCSRMatrixOffd(A22_csr); hypre_CSRMatrixI(offd) = offd_i; hypre_CSRMatrixJ(offd) = NULL; hypre_CSRMatrixData(offd) = NULL; hypre_TFree(row_starts, HYPRE_MEMORY_HOST); hypre_TFree(col_starts, HYPRE_MEMORY_HOST); /* ----------------------------------------------------- * hand the matrices back to the caller and clean up * ----------------------------------------------------- */ (*submatrices)[0] = A11_csr; (*submatrices)[1] = A12_csr; (*submatrices)[2] = A21_csr; (*submatrices)[3] = A22_csr; hypre_TFree(proc_offsets1, HYPRE_MEMORY_HOST); hypre_TFree(proc_offsets2, HYPRE_MEMORY_HOST); hypre_TFree(exp_indices, HYPRE_MEMORY_HOST); } /* ----------------------------------------------------------------------------- * extract submatrices of a rectangular matrix * ----------------------------------------------------------------------------- */ void hypre_ParCSRMatrixExtractRowSubmatrices( hypre_ParCSRMatrix *A_csr, HYPRE_Int *indices2, hypre_ParCSRMatrix ***submatrices ) { HYPRE_Int nrows_A, nindices, *indices, *A_diag_i, *A_diag_j, mypid, nprocs; HYPRE_Int i, j, k, *proc_offsets1, *proc_offsets2, *exp_indices; HYPRE_Int nnz11, nnz21, col, ncols_offd, nnz_offd, nnz_diag; HYPRE_Int *A_offd_i, *A_offd_j; HYPRE_Int nrows, nnz; HYPRE_BigInt global_nrows, global_ncols, *row_starts, *col_starts, *itmp_array; HYPRE_Int *diag_i, *diag_j, row, *offd_i, *offd_j, nnz11_offd, nnz21_offd; HYPRE_Complex *A_diag_a, *diag_a, *offd_a; hypre_ParCSRMatrix *A11_csr, *A21_csr; hypre_CSRMatrix *A_diag, *diag, *A_offd, *offd; MPI_Comm comm; /* ----------------------------------------------------- * first make sure the incoming indices are in order * ----------------------------------------------------- */ nindices = indices2[0]; indices = &(indices2[1]); hypre_qsort0(indices, 0, nindices - 1); /* ----------------------------------------------------- * fetch matrix information * ----------------------------------------------------- */ nrows_A = (HYPRE_Int)hypre_ParCSRMatrixGlobalNumRows(A_csr); A_diag = hypre_ParCSRMatrixDiag(A_csr); A_diag_i = hypre_CSRMatrixI(A_diag); A_diag_j = hypre_CSRMatrixJ(A_diag); A_diag_a = hypre_CSRMatrixData(A_diag); A_offd = hypre_ParCSRMatrixOffd(A_csr); A_offd_i = hypre_CSRMatrixI(A_offd); A_offd_j = hypre_CSRMatrixJ(A_offd); comm = hypre_ParCSRMatrixComm(A_csr); hypre_MPI_Comm_rank(comm, &mypid); hypre_MPI_Comm_size(comm, &nprocs); /* ----------------------------------------------------- * compute new matrix dimensions * ----------------------------------------------------- */ proc_offsets1 = hypre_TAlloc(HYPRE_Int, (nprocs + 1), HYPRE_MEMORY_HOST); proc_offsets2 = hypre_TAlloc(HYPRE_Int, (nprocs + 1), HYPRE_MEMORY_HOST); hypre_MPI_Allgather(&nindices, 1, HYPRE_MPI_INT, proc_offsets1, 1, HYPRE_MPI_INT, comm); k = 0; for (i = 0; i < nprocs; i++) { j = proc_offsets1[i]; proc_offsets1[i] = k; k += j; } proc_offsets1[nprocs] = k; itmp_array = hypre_ParCSRMatrixRowStarts(A_csr); for (i = 0; i <= nprocs; i++) { proc_offsets2[i] = (HYPRE_Int)(itmp_array[i] - proc_offsets1[i]); } /* ----------------------------------------------------- * assign id's to row and col for later processing * ----------------------------------------------------- */ exp_indices = hypre_TAlloc(HYPRE_Int, nrows_A, HYPRE_MEMORY_HOST); for (i = 0; i < nrows_A; i++) { exp_indices[i] = -1; } for (i = 0; i < nindices; i++) { if (exp_indices[indices[i]] == -1) { exp_indices[indices[i]] = i; } else { hypre_error_w_msg(HYPRE_ERROR_GENERIC, "ExtractRowSubmatrices: wrong index %d %d\n"); exit(1); } } k = 0; for (i = 0; i < nrows_A; i++) { if (exp_indices[i] < 0) { exp_indices[i] = - k - 1; k++; } } /* ----------------------------------------------------- * compute number of nonzeros for each block * ----------------------------------------------------- */ nnz11 = nnz21 = nnz11_offd = nnz21_offd = 0; for (i = 0; i < nrows_A; i++) { if (exp_indices[i] >= 0) { for (j = A_diag_i[i]; j < A_diag_i[i + 1]; j++) { col = A_diag_j[j]; if (exp_indices[col] >= 0) { nnz11++; } } nnz11_offd += A_offd_i[i + 1] - A_offd_i[i]; } else { for (j = A_diag_i[i]; j < A_diag_i[i + 1]; j++) { col = A_diag_j[j]; if (exp_indices[col] < 0) { nnz21++; } } nnz21_offd += A_offd_i[i + 1] - A_offd_i[i]; } } /* ----------------------------------------------------- * create A11 matrix (assume sequential for the moment) * ----------------------------------------------------- */ ncols_offd = hypre_CSRMatrixNumCols(hypre_ParCSRMatrixDiag(A_csr)); nnz_diag = nnz11; nnz_offd = nnz11_offd; global_nrows = (HYPRE_BigInt)proc_offsets1[nprocs]; itmp_array = hypre_ParCSRMatrixColStarts(A_csr); global_ncols = itmp_array[nprocs]; row_starts = hypre_CTAlloc(HYPRE_BigInt, nprocs + 1, HYPRE_MEMORY_HOST); col_starts = hypre_CTAlloc(HYPRE_BigInt, nprocs + 1, HYPRE_MEMORY_HOST); for (i = 0; i <= nprocs; i++) { row_starts[i] = (HYPRE_BigInt)proc_offsets1[i]; col_starts[i] = itmp_array[i]; } A11_csr = hypre_ParCSRMatrixCreate(comm, global_nrows, global_ncols, row_starts, col_starts, ncols_offd, nnz_diag, nnz_offd); nrows = nindices; diag_i = hypre_CTAlloc(HYPRE_Int, nrows + 1, HYPRE_MEMORY_HOST); diag_j = hypre_CTAlloc(HYPRE_Int, nnz_diag, HYPRE_MEMORY_HOST); diag_a = hypre_CTAlloc(HYPRE_Complex, nnz_diag, HYPRE_MEMORY_HOST); nnz = 0; row = 0; diag_i[0] = 0; for (i = 0; i < nrows_A; i++) { if (exp_indices[i] >= 0) { for (j = A_diag_i[i]; j < A_diag_i[i + 1]; j++) { col = A_diag_j[j]; if (exp_indices[col] >= 0) { diag_j[nnz] = exp_indices[col]; diag_a[nnz++] = A_diag_a[j]; } } row++; diag_i[row] = nnz; } } diag = hypre_ParCSRMatrixDiag(A11_csr); hypre_CSRMatrixI(diag) = diag_i; hypre_CSRMatrixJ(diag) = diag_j; hypre_CSRMatrixData(diag) = diag_a; offd_i = hypre_CTAlloc(HYPRE_Int, nrows + 1, HYPRE_MEMORY_HOST); offd_j = hypre_CTAlloc(HYPRE_Int, nnz_offd, HYPRE_MEMORY_HOST); offd_a = hypre_CTAlloc(HYPRE_Complex, nnz_offd, HYPRE_MEMORY_HOST); nnz = 0; row = 0; offd_i[0] = 0; for (i = 0; i < nrows_A; i++) { if (exp_indices[i] >= 0) { for (j = A_offd_i[i]; j < A_offd_i[i + 1]; j++) { offd_j[nnz] = A_offd_j[j]; offd_a[nnz++] = A_diag_a[j]; } row++; offd_i[row] = nnz; } } offd = hypre_ParCSRMatrixOffd(A11_csr); hypre_CSRMatrixI(offd) = offd_i; hypre_CSRMatrixJ(offd) = offd_j; hypre_CSRMatrixData(offd) = offd_a; hypre_TFree(row_starts, HYPRE_MEMORY_HOST); hypre_TFree(col_starts, HYPRE_MEMORY_HOST); /* ----------------------------------------------------- * create A21 matrix * ----------------------------------------------------- */ ncols_offd = hypre_CSRMatrixNumCols(hypre_ParCSRMatrixDiag(A_csr)); nnz_offd = nnz21_offd; nnz_diag = nnz21; global_nrows = (HYPRE_BigInt)proc_offsets2[nprocs]; itmp_array = hypre_ParCSRMatrixColStarts(A_csr); global_ncols = itmp_array[nprocs]; row_starts = hypre_CTAlloc(HYPRE_BigInt, nprocs + 1, HYPRE_MEMORY_HOST); col_starts = hypre_CTAlloc(HYPRE_BigInt, nprocs + 1, HYPRE_MEMORY_HOST); for (i = 0; i <= nprocs; i++) { row_starts[i] = (HYPRE_BigInt)proc_offsets2[i]; col_starts[i] = itmp_array[i]; } A21_csr = hypre_ParCSRMatrixCreate(comm, global_nrows, global_ncols, row_starts, col_starts, ncols_offd, nnz_diag, nnz_offd); nrows = nrows_A - nindices; diag_i = hypre_CTAlloc(HYPRE_Int, nrows + 1, HYPRE_MEMORY_HOST); diag_j = hypre_CTAlloc(HYPRE_Int, nnz_diag, HYPRE_MEMORY_HOST); diag_a = hypre_CTAlloc(HYPRE_Complex, nnz_diag, HYPRE_MEMORY_HOST); nnz = 0; row = 0; diag_i[0] = 0; for (i = 0; i < nrows_A; i++) { if (exp_indices[i] < 0) { for (j = A_diag_i[i]; j < A_diag_i[i + 1]; j++) { diag_j[nnz] = A_diag_j[j]; diag_a[nnz++] = A_diag_a[j]; } row++; diag_i[row] = nnz; } } diag = hypre_ParCSRMatrixDiag(A21_csr); hypre_CSRMatrixI(diag) = diag_i; hypre_CSRMatrixJ(diag) = diag_j; hypre_CSRMatrixData(diag) = diag_a; offd_i = hypre_CTAlloc(HYPRE_Int, nrows + 1, HYPRE_MEMORY_HOST); offd_j = hypre_CTAlloc(HYPRE_Int, nnz_offd, HYPRE_MEMORY_HOST); offd_a = hypre_CTAlloc(HYPRE_Complex, nnz_offd, HYPRE_MEMORY_HOST); nnz = 0; row = 0; offd_i[0] = 0; for (i = 0; i < nrows_A; i++) { if (exp_indices[i] < 0) { for (j = A_offd_i[i]; j < A_offd_i[i + 1]; j++) { offd_j[nnz] = A_offd_j[j]; offd_a[nnz++] = A_diag_a[j]; } row++; offd_i[row] = nnz; } } offd = hypre_ParCSRMatrixOffd(A21_csr); hypre_CSRMatrixI(offd) = offd_i; hypre_CSRMatrixJ(offd) = offd_j; hypre_CSRMatrixData(offd) = offd_a; hypre_TFree(row_starts, HYPRE_MEMORY_HOST); hypre_TFree(col_starts, HYPRE_MEMORY_HOST); /* ----------------------------------------------------- * hand the matrices back to the caller and clean up * ----------------------------------------------------- */ (*submatrices)[0] = A11_csr; (*submatrices)[1] = A21_csr; hypre_TFree(proc_offsets1, HYPRE_MEMORY_HOST); hypre_TFree(proc_offsets2, HYPRE_MEMORY_HOST); hypre_TFree(exp_indices, HYPRE_MEMORY_HOST); } /* ----------------------------------------------------------------------------- * return the sum of all local elements of the matrix * ----------------------------------------------------------------------------- */ HYPRE_Complex hypre_ParCSRMatrixLocalSumElts( hypre_ParCSRMatrix * A ) { hypre_CSRMatrix * A_diag = hypre_ParCSRMatrixDiag( A ); hypre_CSRMatrix * A_offd = hypre_ParCSRMatrixOffd( A ); return hypre_CSRMatrixSumElts(A_diag) + hypre_CSRMatrixSumElts(A_offd); } /*-------------------------------------------------------------------------- * hypre_ParCSRMatrixMatAminvDB * computes C = (A - inv(D)B) where D is a diagonal matrix * Note: Data structure of A is expected to be a subset of data structure of B! *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ParCSRMatrixAminvDB( hypre_ParCSRMatrix *A, hypre_ParCSRMatrix *B, HYPRE_Complex *d, hypre_ParCSRMatrix **C_ptr) { MPI_Comm comm = hypre_ParCSRMatrixComm(B); hypre_CSRMatrix *A_diag = hypre_ParCSRMatrixDiag(A); hypre_CSRMatrix *A_offd = hypre_ParCSRMatrixOffd(A); HYPRE_Int num_cols_offd_A = hypre_CSRMatrixNumCols(A_offd); hypre_ParCSRCommPkg *comm_pkg_B = hypre_ParCSRMatrixCommPkg(B); hypre_CSRMatrix *B_diag = hypre_ParCSRMatrixDiag(B); hypre_CSRMatrix *B_offd = hypre_ParCSRMatrixOffd(B); HYPRE_Int num_cols_offd_B = hypre_CSRMatrixNumCols(B_offd); HYPRE_Int num_sends_B; HYPRE_Int num_recvs_B; HYPRE_Int i, j, cnt; HYPRE_Int *A_diag_i = hypre_CSRMatrixI(A_diag); HYPRE_Int *A_diag_j = hypre_CSRMatrixJ(A_diag); HYPRE_Complex *A_diag_data = hypre_CSRMatrixData(A_diag); HYPRE_Int *A_offd_i = hypre_CSRMatrixI(A_offd); HYPRE_Int *A_offd_j = hypre_CSRMatrixJ(A_offd); HYPRE_Complex *A_offd_data = hypre_CSRMatrixData(A_offd); HYPRE_BigInt *col_map_offd_A = hypre_ParCSRMatrixColMapOffd(A); HYPRE_Int num_rows = hypre_CSRMatrixNumRows(B_diag); HYPRE_Int *B_diag_i = hypre_CSRMatrixI(B_diag); HYPRE_Int *B_diag_j = hypre_CSRMatrixJ(B_diag); HYPRE_Complex *B_diag_data = hypre_CSRMatrixData(B_diag); HYPRE_Int *B_offd_i = hypre_CSRMatrixI(B_offd); HYPRE_Int *B_offd_j = hypre_CSRMatrixJ(B_offd); HYPRE_Complex *B_offd_data = hypre_CSRMatrixData(B_offd); HYPRE_BigInt *col_map_offd_B = hypre_ParCSRMatrixColMapOffd(B); hypre_ParCSRMatrix *C = NULL; hypre_CSRMatrix *C_diag = NULL; hypre_CSRMatrix *C_offd = NULL; HYPRE_Int *C_diag_i = NULL; HYPRE_Int *C_diag_j = NULL; HYPRE_Complex *C_diag_data = NULL; HYPRE_Int *C_offd_i = NULL; HYPRE_Int *C_offd_j = NULL; HYPRE_Complex *C_offd_data = NULL; HYPRE_Int num_procs, my_id; HYPRE_Int *recv_procs_B; HYPRE_Int *send_procs_B; HYPRE_Int *recv_vec_starts_B; HYPRE_Int *send_map_starts_B; HYPRE_Int *send_map_elmts_B; hypre_ParCSRCommPkg *comm_pkg_C = NULL; HYPRE_Int *recv_procs_C; HYPRE_Int *send_procs_C; HYPRE_Int *recv_vec_starts_C; HYPRE_Int *send_map_starts_C; HYPRE_Int *send_map_elmts_C; HYPRE_Int *map_to_B = NULL; HYPRE_Complex *D_tmp; HYPRE_Int size, rest, num_threads, ii; hypre_MPI_Comm_size(comm, &num_procs); hypre_MPI_Comm_rank(comm, &my_id); num_threads = hypre_NumThreads(); /*--------------------------------------------------------------------- * If there exists no CommPkg for B, a CommPkg is generated *--------------------------------------------------------------------*/ if (!comm_pkg_B) { hypre_MatvecCommPkgCreate(B); comm_pkg_B = hypre_ParCSRMatrixCommPkg(B); } C = hypre_ParCSRMatrixClone(B, 0); /*hypre_ParCSRMatrixInitialize(C);*/ C_diag = hypre_ParCSRMatrixDiag(C); C_diag_i = hypre_CSRMatrixI(C_diag); C_diag_j = hypre_CSRMatrixJ(C_diag); C_diag_data = hypre_CSRMatrixData(C_diag); C_offd = hypre_ParCSRMatrixOffd(C); C_offd_i = hypre_CSRMatrixI(C_offd); C_offd_j = hypre_CSRMatrixJ(C_offd); C_offd_data = hypre_CSRMatrixData(C_offd); size = num_rows / num_threads; rest = num_rows - size * num_threads; D_tmp = hypre_CTAlloc(HYPRE_Complex, num_rows, HYPRE_MEMORY_HOST); if (num_cols_offd_A) { map_to_B = hypre_CTAlloc(HYPRE_Int, num_cols_offd_A, HYPRE_MEMORY_HOST); cnt = 0; for (i = 0; i < num_cols_offd_A; i++) { while (col_map_offd_B[cnt] < col_map_offd_A[i]) { cnt++; } map_to_B[i] = cnt; cnt++; } } #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(ii, i, j) #endif for (ii = 0; ii < num_threads; ii++) { HYPRE_Int *A_marker = NULL; HYPRE_Int ns, ne, A_col, num_cols, nmax; if (ii < rest) { ns = ii * size + ii; ne = (ii + 1) * size + ii + 1; } else { ns = ii * size + rest; ne = (ii + 1) * size + rest; } nmax = hypre_max(num_rows, num_cols_offd_B); A_marker = hypre_CTAlloc(HYPRE_Int, nmax, HYPRE_MEMORY_HOST); for (i = 0; i < num_rows; i++) { A_marker[i] = -1; } for (i = ns; i < ne; i++) { D_tmp[i] = 1.0 / d[i]; } num_cols = C_diag_i[ns]; for (i = ns; i < ne; i++) { for (j = A_diag_i[i]; j < A_diag_i[i + 1]; j++) { A_col = A_diag_j[j]; if (A_marker[A_col] < C_diag_i[i]) { A_marker[A_col] = num_cols; C_diag_j[num_cols] = A_col; C_diag_data[num_cols] = A_diag_data[j]; num_cols++; } else { C_diag_data[A_marker[A_col]] += A_diag_data[j]; } } for (j = B_diag_i[i]; j < B_diag_i[i + 1]; j++) { A_col = B_diag_j[j]; if (A_marker[A_col] < C_diag_i[i]) { A_marker[A_col] = num_cols; C_diag_j[num_cols] = A_col; C_diag_data[num_cols] = -D_tmp[i] * B_diag_data[j]; num_cols++; } else { C_diag_data[A_marker[A_col]] -= D_tmp[i] * B_diag_data[j]; } } } for (i = 0; i < num_cols_offd_B; i++) { A_marker[i] = -1; } num_cols = C_offd_i[ns]; for (i = ns; i < ne; i++) { for (j = A_offd_i[i]; j < A_offd_i[i + 1]; j++) { A_col = map_to_B[A_offd_j[j]]; if (A_marker[A_col] < B_offd_i[i]) { A_marker[A_col] = num_cols; C_offd_j[num_cols] = A_col; C_offd_data[num_cols] = A_offd_data[j]; num_cols++; } else { C_offd_data[A_marker[A_col]] += A_offd_data[j]; } } for (j = B_offd_i[i]; j < B_offd_i[i + 1]; j++) { A_col = B_offd_j[j]; if (A_marker[A_col] < B_offd_i[i]) { A_marker[A_col] = num_cols; C_offd_j[num_cols] = A_col; C_offd_data[num_cols] = -D_tmp[i] * B_offd_data[j]; num_cols++; } else { C_offd_data[A_marker[A_col]] -= D_tmp[i] * B_offd_data[j]; } } } hypre_TFree(A_marker, HYPRE_MEMORY_HOST); } /* end parallel region */ /*for (i=0; i < num_cols_offd_B; i++) col_map_offd_C[i] = col_map_offd_B[i]; */ num_sends_B = hypre_ParCSRCommPkgNumSends(comm_pkg_B); num_recvs_B = hypre_ParCSRCommPkgNumRecvs(comm_pkg_B); recv_procs_B = hypre_ParCSRCommPkgRecvProcs(comm_pkg_B); recv_vec_starts_B = hypre_ParCSRCommPkgRecvVecStarts(comm_pkg_B); send_procs_B = hypre_ParCSRCommPkgSendProcs(comm_pkg_B); send_map_starts_B = hypre_ParCSRCommPkgSendMapStarts(comm_pkg_B); send_map_elmts_B = hypre_ParCSRCommPkgSendMapElmts(comm_pkg_B); recv_procs_C = hypre_CTAlloc(HYPRE_Int, num_recvs_B, HYPRE_MEMORY_HOST); recv_vec_starts_C = hypre_CTAlloc(HYPRE_Int, num_recvs_B + 1, HYPRE_MEMORY_HOST); send_procs_C = hypre_CTAlloc(HYPRE_Int, num_sends_B, HYPRE_MEMORY_HOST); send_map_starts_C = hypre_CTAlloc(HYPRE_Int, num_sends_B + 1, HYPRE_MEMORY_HOST); send_map_elmts_C = hypre_CTAlloc(HYPRE_Int, send_map_starts_B[num_sends_B], HYPRE_MEMORY_HOST); for (i = 0; i < num_recvs_B; i++) { recv_procs_C[i] = recv_procs_B[i]; } for (i = 0; i < num_recvs_B + 1; i++) { recv_vec_starts_C[i] = recv_vec_starts_B[i]; } for (i = 0; i < num_sends_B; i++) { send_procs_C[i] = send_procs_B[i]; } for (i = 0; i < num_sends_B + 1; i++) { send_map_starts_C[i] = send_map_starts_B[i]; } for (i = 0; i < send_map_starts_B[num_sends_B]; i++) { send_map_elmts_C[i] = send_map_elmts_B[i]; } /* Create communication package */ hypre_ParCSRCommPkgCreateAndFill(comm, num_recvs_B, recv_procs_C, recv_vec_starts_C, num_sends_B, send_procs_C, send_map_starts_C, send_map_elmts_C, &comm_pkg_C); hypre_ParCSRMatrixCommPkg(C) = comm_pkg_C; hypre_TFree(D_tmp, HYPRE_MEMORY_HOST); if (num_cols_offd_A) { hypre_TFree(map_to_B, HYPRE_MEMORY_HOST); } *C_ptr = C; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_ParTMatmul: * * Multiplies two ParCSRMatrices transpose(A) and B and returns * the product in ParCSRMatrix C * * Note that C does not own the partitionings since its row_starts * is owned by A and col_starts by B. *--------------------------------------------------------------------------*/ hypre_ParCSRMatrix* hypre_ParTMatmul( hypre_ParCSRMatrix *A, hypre_ParCSRMatrix *B) { MPI_Comm comm = hypre_ParCSRMatrixComm(A); hypre_ParCSRCommPkg *comm_pkg_A = hypre_ParCSRMatrixCommPkg(A); hypre_CSRMatrix *A_diag = hypre_ParCSRMatrixDiag(A); hypre_CSRMatrix *AT_diag = NULL; hypre_CSRMatrix *A_offd = hypre_ParCSRMatrixOffd(A); hypre_CSRMatrix *AT_offd = NULL; HYPRE_Int num_rows_diag_A = hypre_CSRMatrixNumRows(A_diag); HYPRE_Int num_cols_diag_A = hypre_CSRMatrixNumCols(A_diag); hypre_CSRMatrix *B_diag = hypre_ParCSRMatrixDiag(B); hypre_CSRMatrix *B_offd = hypre_ParCSRMatrixOffd(B); HYPRE_BigInt *col_map_offd_B = hypre_ParCSRMatrixColMapOffd(B); HYPRE_BigInt first_col_diag_B = hypre_ParCSRMatrixFirstColDiag(B); HYPRE_BigInt *col_starts_A = hypre_ParCSRMatrixColStarts(A); HYPRE_BigInt *col_starts_B = hypre_ParCSRMatrixColStarts(B); HYPRE_Int num_rows_diag_B = hypre_CSRMatrixNumRows(B_diag); HYPRE_Int num_cols_diag_B = hypre_CSRMatrixNumCols(B_diag); HYPRE_Int num_cols_offd_B = hypre_CSRMatrixNumCols(B_offd); hypre_ParCSRMatrix *C; HYPRE_BigInt *col_map_offd_C = NULL; HYPRE_Int *map_B_to_C = NULL; hypre_CSRMatrix *C_diag = NULL; hypre_CSRMatrix *C_tmp_diag = NULL; HYPRE_Complex *C_diag_data = NULL; HYPRE_Int *C_diag_i = NULL; HYPRE_Int *C_diag_j = NULL; HYPRE_BigInt first_col_diag_C; HYPRE_BigInt last_col_diag_C; hypre_CSRMatrix *C_offd = NULL; hypre_CSRMatrix *C_tmp_offd = NULL; hypre_CSRMatrix *C_int = NULL; hypre_CSRMatrix *C_ext = NULL; HYPRE_Int *C_ext_i = NULL; HYPRE_BigInt *C_ext_j = NULL; HYPRE_Complex *C_ext_data = NULL; HYPRE_Int *C_ext_diag_i = NULL; HYPRE_Int *C_ext_diag_j = NULL; HYPRE_Complex *C_ext_diag_data = NULL; HYPRE_Int *C_ext_offd_i = NULL; HYPRE_Int *C_ext_offd_j = NULL; HYPRE_Complex *C_ext_offd_data = NULL; HYPRE_Int C_ext_size = 0; HYPRE_Int C_ext_diag_size = 0; HYPRE_Int C_ext_offd_size = 0; HYPRE_Int *C_tmp_diag_i; HYPRE_Int *C_tmp_diag_j = NULL; HYPRE_Complex *C_tmp_diag_data = NULL; HYPRE_Int *C_tmp_offd_i = NULL; HYPRE_Int *C_tmp_offd_j = NULL; HYPRE_Complex *C_tmp_offd_data = NULL; HYPRE_Complex *C_offd_data = NULL; HYPRE_Int *C_offd_i = NULL; HYPRE_Int *C_offd_j = NULL; HYPRE_BigInt *temp; HYPRE_Int *send_map_starts_A = NULL; HYPRE_Int *send_map_elmts_A = NULL; HYPRE_Int num_sends_A = 0; HYPRE_Int num_cols_offd_C = 0; HYPRE_Int *P_marker; HYPRE_Int i, j; HYPRE_Int i1, j_indx; HYPRE_BigInt nrows_A, ncols_A; HYPRE_BigInt nrows_B, ncols_B; /*HYPRE_Int allsquare = 0;*/ HYPRE_Int cnt, cnt_offd, cnt_diag; HYPRE_BigInt value; HYPRE_Int num_procs, my_id; HYPRE_Int max_num_threads; HYPRE_Int *C_diag_array = NULL; HYPRE_Int *C_offd_array = NULL; HYPRE_BigInt first_row_index, first_col_diag; HYPRE_Int local_num_rows, local_num_cols; nrows_A = hypre_ParCSRMatrixGlobalNumRows(A); ncols_A = hypre_ParCSRMatrixGlobalNumCols(A); nrows_B = hypre_ParCSRMatrixGlobalNumRows(B); ncols_B = hypre_ParCSRMatrixGlobalNumCols(B); hypre_MPI_Comm_size(comm, &num_procs); hypre_MPI_Comm_rank(comm, &my_id); max_num_threads = hypre_NumThreads(); if (nrows_A != nrows_B || num_rows_diag_A != num_rows_diag_B) { hypre_error_w_msg(HYPRE_ERROR_GENERIC, " Error! Incompatible matrix dimensions!\n"); return NULL; } HYPRE_MemoryLocation memory_location_A = hypre_ParCSRMatrixMemoryLocation(A); HYPRE_MemoryLocation memory_location_B = hypre_ParCSRMatrixMemoryLocation(B); /* RL: TODO cannot guarantee, maybe should never assert hypre_assert(memory_location_A == memory_location_B); */ /* RL: in the case of A=H, B=D, or A=D, B=H, let C = D, * not sure if this is the right thing to do. * Also, need something like this in other places * TODO */ HYPRE_MemoryLocation memory_location_C = hypre_max(memory_location_A, memory_location_B); /*if (num_cols_diag_A == num_cols_diag_B) allsquare = 1;*/ /*--------------------------------------------------------------------- * If there exists no CommPkg for A, a CommPkg is generated using * equally load balanced partitionings *--------------------------------------------------------------------*/ HYPRE_ANNOTATE_FUNC_BEGIN; if (!comm_pkg_A) { hypre_MatvecCommPkgCreate(A); comm_pkg_A = hypre_ParCSRMatrixCommPkg(A); } hypre_CSRMatrixTranspose(A_diag, &AT_diag, 1); hypre_CSRMatrixTranspose(A_offd, &AT_offd, 1); C_tmp_diag = hypre_CSRMatrixMultiply(AT_diag, B_diag); C_ext_size = 0; if (num_procs > 1) { hypre_CSRMatrix *C_int_diag; hypre_CSRMatrix *C_int_offd; void *request; C_tmp_offd = hypre_CSRMatrixMultiply(AT_diag, B_offd); C_int_diag = hypre_CSRMatrixMultiply(AT_offd, B_diag); C_int_offd = hypre_CSRMatrixMultiply(AT_offd, B_offd); hypre_ParCSRMatrixDiag(B) = C_int_diag; hypre_ParCSRMatrixOffd(B) = C_int_offd; C_int = hypre_MergeDiagAndOffd(B); hypre_ParCSRMatrixDiag(B) = B_diag; hypre_ParCSRMatrixOffd(B) = B_offd; hypre_ExchangeExternalRowsInit(C_int, comm_pkg_A, &request); C_ext = hypre_ExchangeExternalRowsWait(request); C_ext_i = hypre_CSRMatrixI(C_ext); C_ext_j = hypre_CSRMatrixBigJ(C_ext); C_ext_data = hypre_CSRMatrixData(C_ext); C_ext_size = C_ext_i[hypre_CSRMatrixNumRows(C_ext)]; hypre_CSRMatrixDestroy(C_int); hypre_CSRMatrixDestroy(C_int_diag); hypre_CSRMatrixDestroy(C_int_offd); } else { C_tmp_offd = hypre_CSRMatrixCreate(num_cols_diag_A, 0, 0); hypre_CSRMatrixInitialize(C_tmp_offd); hypre_CSRMatrixNumRownnz(C_tmp_offd) = 0; } hypre_CSRMatrixDestroy(AT_diag); hypre_CSRMatrixDestroy(AT_offd); /*----------------------------------------------------------------------- * Add contents of C_ext to C_tmp_diag and C_tmp_offd * to obtain C_diag and C_offd *-----------------------------------------------------------------------*/ /* check for new nonzero columns in C_offd generated through C_ext */ first_col_diag_C = first_col_diag_B; last_col_diag_C = first_col_diag_B + (HYPRE_BigInt)num_cols_diag_B - 1; C_tmp_diag_i = hypre_CSRMatrixI(C_tmp_diag); if (C_ext_size || num_cols_offd_B) { HYPRE_Int C_ext_num_rows; num_sends_A = hypre_ParCSRCommPkgNumSends(comm_pkg_A); send_map_starts_A = hypre_ParCSRCommPkgSendMapStarts(comm_pkg_A); send_map_elmts_A = hypre_ParCSRCommPkgSendMapElmts(comm_pkg_A); C_ext_num_rows = send_map_starts_A[num_sends_A]; C_ext_diag_i = hypre_CTAlloc(HYPRE_Int, C_ext_num_rows + 1, HYPRE_MEMORY_HOST); C_ext_offd_i = hypre_CTAlloc(HYPRE_Int, C_ext_num_rows + 1, HYPRE_MEMORY_HOST); temp = hypre_CTAlloc(HYPRE_BigInt, C_ext_size + num_cols_offd_B, HYPRE_MEMORY_HOST); C_ext_diag_size = 0; C_ext_offd_size = 0; for (i = 0; i < C_ext_num_rows; i++) { for (j = C_ext_i[i]; j < C_ext_i[i + 1]; j++) { if (C_ext_j[j] < first_col_diag_C || C_ext_j[j] > last_col_diag_C) { temp[C_ext_offd_size++] = C_ext_j[j]; } else { C_ext_diag_size++; } } C_ext_diag_i[i + 1] = C_ext_diag_size; C_ext_offd_i[i + 1] = C_ext_offd_size; } cnt = C_ext_offd_size; for (i = 0; i < num_cols_offd_B; i++) { temp[cnt++] = col_map_offd_B[i]; } if (cnt) { hypre_BigQsort0(temp, 0, cnt - 1); value = temp[0]; num_cols_offd_C = 1; for (i = 1; i < cnt; i++) { if (temp[i] > value) { value = temp[i]; temp[num_cols_offd_C++] = value; } } } if (num_cols_offd_C) { col_map_offd_C = hypre_CTAlloc(HYPRE_BigInt, num_cols_offd_C, HYPRE_MEMORY_HOST); } for (i = 0; i < num_cols_offd_C; i++) { col_map_offd_C[i] = temp[i]; } hypre_TFree(temp, HYPRE_MEMORY_HOST); if (C_ext_diag_size) { C_ext_diag_j = hypre_CTAlloc(HYPRE_Int, C_ext_diag_size, HYPRE_MEMORY_HOST); C_ext_diag_data = hypre_CTAlloc(HYPRE_Complex, C_ext_diag_size, HYPRE_MEMORY_HOST); } if (C_ext_offd_size) { C_ext_offd_j = hypre_CTAlloc(HYPRE_Int, C_ext_offd_size, HYPRE_MEMORY_HOST); C_ext_offd_data = hypre_CTAlloc(HYPRE_Complex, C_ext_offd_size, HYPRE_MEMORY_HOST); } C_tmp_diag_j = hypre_CSRMatrixJ(C_tmp_diag); C_tmp_diag_data = hypre_CSRMatrixData(C_tmp_diag); C_tmp_offd_i = hypre_CSRMatrixI(C_tmp_offd); C_tmp_offd_j = hypre_CSRMatrixJ(C_tmp_offd); C_tmp_offd_data = hypre_CSRMatrixData(C_tmp_offd); cnt_offd = 0; cnt_diag = 0; for (i = 0; i < C_ext_num_rows; i++) { for (j = C_ext_i[i]; j < C_ext_i[i + 1]; j++) { if (C_ext_j[j] < first_col_diag_C || C_ext_j[j] > last_col_diag_C) { C_ext_offd_j[cnt_offd] = hypre_BigBinarySearch(col_map_offd_C, C_ext_j[j], num_cols_offd_C); C_ext_offd_data[cnt_offd++] = C_ext_data[j]; } else { C_ext_diag_j[cnt_diag] = (HYPRE_Int)(C_ext_j[j] - first_col_diag_C); C_ext_diag_data[cnt_diag++] = C_ext_data[j]; } } } } if (C_ext) { hypre_CSRMatrixDestroy(C_ext); C_ext = NULL; } if (num_cols_offd_B) { map_B_to_C = hypre_CTAlloc(HYPRE_Int, num_cols_offd_B, HYPRE_MEMORY_HOST); cnt = 0; for (i = 0; i < num_cols_offd_C; i++) { if (col_map_offd_C[i] == col_map_offd_B[cnt]) { map_B_to_C[cnt++] = i; if (cnt == num_cols_offd_B) { break; } } } for (i = 0; i < hypre_CSRMatrixI(C_tmp_offd)[hypre_CSRMatrixNumRows(C_tmp_offd)]; i++) { j_indx = C_tmp_offd_j[i]; C_tmp_offd_j[i] = map_B_to_C[j_indx]; } } /*----------------------------------------------------------------------- * Need to compute: * C_diag = C_tmp_diag + C_ext_diag * C_offd = C_tmp_offd + C_ext_offd * * First generate structure *-----------------------------------------------------------------------*/ if (C_ext_size || num_cols_offd_B) { C_diag_i = hypre_CTAlloc(HYPRE_Int, num_cols_diag_A + 1, memory_location_C); C_offd_i = hypre_CTAlloc(HYPRE_Int, num_cols_diag_A + 1, memory_location_C); C_diag_array = hypre_CTAlloc(HYPRE_Int, max_num_threads, HYPRE_MEMORY_HOST); C_offd_array = hypre_CTAlloc(HYPRE_Int, max_num_threads, HYPRE_MEMORY_HOST); #ifdef HYPRE_USING_OPENMP #pragma omp parallel #endif { HYPRE_Int *B_marker = NULL; HYPRE_Int *B_marker_offd = NULL; HYPRE_Int ik, jk, j1, j2, jcol; HYPRE_Int ns, ne, ii, nnz_d, nnz_o; HYPRE_Int rest, size; HYPRE_Int num_threads = hypre_NumActiveThreads(); size = num_cols_diag_A / num_threads; rest = num_cols_diag_A - size * num_threads; ii = hypre_GetThreadNum(); if (ii < rest) { ns = ii * size + ii; ne = (ii + 1) * size + ii + 1; } else { ns = ii * size + rest; ne = (ii + 1) * size + rest; } B_marker = hypre_CTAlloc(HYPRE_Int, num_cols_diag_B, HYPRE_MEMORY_HOST); B_marker_offd = hypre_CTAlloc(HYPRE_Int, num_cols_offd_C, HYPRE_MEMORY_HOST); for (ik = 0; ik < num_cols_diag_B; ik++) { B_marker[ik] = -1; } for (ik = 0; ik < num_cols_offd_C; ik++) { B_marker_offd[ik] = -1; } nnz_d = 0; nnz_o = 0; for (ik = ns; ik < ne; ik++) { for (jk = C_tmp_diag_i[ik]; jk < C_tmp_diag_i[ik + 1]; jk++) { jcol = C_tmp_diag_j[jk]; B_marker[jcol] = ik; nnz_d++; } for (jk = C_tmp_offd_i[ik]; jk < C_tmp_offd_i[ik + 1]; jk++) { jcol = C_tmp_offd_j[jk]; B_marker_offd[jcol] = ik; nnz_o++; } for (jk = 0; jk < num_sends_A; jk++) { for (j1 = send_map_starts_A[jk]; j1 < send_map_starts_A[jk + 1]; j1++) { if (send_map_elmts_A[j1] == ik) { for (j2 = C_ext_diag_i[j1]; j2 < C_ext_diag_i[j1 + 1]; j2++) { jcol = C_ext_diag_j[j2]; if (B_marker[jcol] < ik) { B_marker[jcol] = ik; nnz_d++; } } for (j2 = C_ext_offd_i[j1]; j2 < C_ext_offd_i[j1 + 1]; j2++) { jcol = C_ext_offd_j[j2]; if (B_marker_offd[jcol] < ik) { B_marker_offd[jcol] = ik; nnz_o++; } } break; } } } C_diag_array[ii] = nnz_d; C_offd_array[ii] = nnz_o; } #ifdef HYPRE_USING_OPENMP #pragma omp barrier #endif if (ii == 0) { nnz_d = 0; nnz_o = 0; for (ik = 0; ik < num_threads - 1; ik++) { C_diag_array[ik + 1] += C_diag_array[ik]; C_offd_array[ik + 1] += C_offd_array[ik]; } nnz_d = C_diag_array[num_threads - 1]; nnz_o = C_offd_array[num_threads - 1]; C_diag_i[num_cols_diag_A] = nnz_d; C_offd_i[num_cols_diag_A] = nnz_o; C_diag = hypre_CSRMatrixCreate(num_cols_diag_A, num_cols_diag_A, nnz_d); C_offd = hypre_CSRMatrixCreate(num_cols_diag_A, num_cols_offd_C, nnz_o); hypre_CSRMatrixI(C_diag) = C_diag_i; hypre_CSRMatrixInitialize_v2(C_diag, 0, memory_location_C); C_diag_j = hypre_CSRMatrixJ(C_diag); C_diag_data = hypre_CSRMatrixData(C_diag); hypre_CSRMatrixI(C_offd) = C_offd_i; hypre_CSRMatrixInitialize_v2(C_offd, 0, memory_location_C); C_offd_j = hypre_CSRMatrixJ(C_offd); C_offd_data = hypre_CSRMatrixData(C_offd); } #ifdef HYPRE_USING_OPENMP #pragma omp barrier #endif /*----------------------------------------------------------------------- * Need to compute C_diag = C_tmp_diag + C_ext_diag * and C_offd = C_tmp_offd + C_ext_offd !!!! * Now fill in values *-----------------------------------------------------------------------*/ for (ik = 0; ik < num_cols_diag_B; ik++) { B_marker[ik] = -1; } for (ik = 0; ik < num_cols_offd_C; ik++) { B_marker_offd[ik] = -1; } /*----------------------------------------------------------------------- * Populate matrices *-----------------------------------------------------------------------*/ nnz_d = 0; nnz_o = 0; if (ii) { nnz_d = C_diag_array[ii - 1]; nnz_o = C_offd_array[ii - 1]; } for (ik = ns; ik < ne; ik++) { C_diag_i[ik] = nnz_d; C_offd_i[ik] = nnz_o; for (jk = C_tmp_diag_i[ik]; jk < C_tmp_diag_i[ik + 1]; jk++) { jcol = C_tmp_diag_j[jk]; C_diag_j[nnz_d] = jcol; C_diag_data[nnz_d] = C_tmp_diag_data[jk]; B_marker[jcol] = nnz_d; nnz_d++; } for (jk = C_tmp_offd_i[ik]; jk < C_tmp_offd_i[ik + 1]; jk++) { jcol = C_tmp_offd_j[jk]; C_offd_j[nnz_o] = jcol; C_offd_data[nnz_o] = C_tmp_offd_data[jk]; B_marker_offd[jcol] = nnz_o; nnz_o++; } for (jk = 0; jk < num_sends_A; jk++) { for (j1 = send_map_starts_A[jk]; j1 < send_map_starts_A[jk + 1]; j1++) { if (send_map_elmts_A[j1] == ik) { for (j2 = C_ext_diag_i[j1]; j2 < C_ext_diag_i[j1 + 1]; j2++) { jcol = C_ext_diag_j[j2]; if (B_marker[jcol] < C_diag_i[ik]) { C_diag_j[nnz_d] = jcol; C_diag_data[nnz_d] = C_ext_diag_data[j2]; B_marker[jcol] = nnz_d; nnz_d++; } else { C_diag_data[B_marker[jcol]] += C_ext_diag_data[j2]; } } for (j2 = C_ext_offd_i[j1]; j2 < C_ext_offd_i[j1 + 1]; j2++) { jcol = C_ext_offd_j[j2]; if (B_marker_offd[jcol] < C_offd_i[ik]) { C_offd_j[nnz_o] = jcol; C_offd_data[nnz_o] = C_ext_offd_data[j2]; B_marker_offd[jcol] = nnz_o; nnz_o++; } else { C_offd_data[B_marker_offd[jcol]] += C_ext_offd_data[j2]; } } break; } } } } hypre_TFree(B_marker, HYPRE_MEMORY_HOST); hypre_TFree(B_marker_offd, HYPRE_MEMORY_HOST); } /*end parallel region */ hypre_TFree(C_diag_array, HYPRE_MEMORY_HOST); hypre_TFree(C_offd_array, HYPRE_MEMORY_HOST); } /*C = hypre_ParCSRMatrixCreate(comm, ncols_A, ncols_B, col_starts_A, col_starts_B, num_cols_offd_C, nnz_diag, nnz_offd); hypre_CSRMatrixDestroy(hypre_ParCSRMatrixDiag(C)); hypre_CSRMatrixDestroy(hypre_ParCSRMatrixOffd(C)); */ /* row_starts[0] is start of local rows. row_starts[1] is start of next processor's rows */ first_row_index = col_starts_A[0]; local_num_rows = (HYPRE_Int)(col_starts_A[1] - first_row_index ); first_col_diag = col_starts_B[0]; local_num_cols = (HYPRE_Int)(col_starts_B[1] - first_col_diag); C = hypre_CTAlloc(hypre_ParCSRMatrix, 1, HYPRE_MEMORY_HOST); hypre_ParCSRMatrixComm(C) = comm; hypre_ParCSRMatrixGlobalNumRows(C) = ncols_A; hypre_ParCSRMatrixGlobalNumCols(C) = ncols_B; hypre_ParCSRMatrixFirstRowIndex(C) = first_row_index; hypre_ParCSRMatrixFirstColDiag(C) = first_col_diag; hypre_ParCSRMatrixLastRowIndex(C) = first_row_index + (HYPRE_BigInt)local_num_rows - 1; hypre_ParCSRMatrixLastColDiag(C) = first_col_diag + (HYPRE_BigInt)local_num_cols - 1; hypre_ParCSRMatrixColMapOffd(C) = NULL; hypre_ParCSRMatrixAssumedPartition(C) = NULL; hypre_ParCSRMatrixCommPkg(C) = NULL; hypre_ParCSRMatrixCommPkgT(C) = NULL; /* C row/col starts*/ hypre_ParCSRMatrixRowStarts(C)[0] = col_starts_A[0]; hypre_ParCSRMatrixRowStarts(C)[1] = col_starts_A[1]; hypre_ParCSRMatrixColStarts(C)[0] = col_starts_B[0]; hypre_ParCSRMatrixColStarts(C)[1] = col_starts_B[1]; /* set defaults */ hypre_ParCSRMatrixOwnsData(C) = 1; hypre_ParCSRMatrixRowindices(C) = NULL; hypre_ParCSRMatrixRowvalues(C) = NULL; hypre_ParCSRMatrixGetrowactive(C) = 0; if (C_diag) { hypre_CSRMatrixSetRownnz(C_diag); hypre_ParCSRMatrixDiag(C) = C_diag; } else { hypre_ParCSRMatrixDiag(C) = C_tmp_diag; } if (C_offd) { hypre_CSRMatrixSetRownnz(C_offd); hypre_ParCSRMatrixOffd(C) = C_offd; } else { hypre_ParCSRMatrixOffd(C) = C_tmp_offd; } hypre_assert(hypre_CSRMatrixMemoryLocation(hypre_ParCSRMatrixDiag(C)) == memory_location_C); hypre_assert(hypre_CSRMatrixMemoryLocation(hypre_ParCSRMatrixOffd(C)) == memory_location_C); if (num_cols_offd_C) { HYPRE_Int jj_count_offd, nnz_offd; HYPRE_BigInt *new_col_map_offd_C = NULL; P_marker = hypre_CTAlloc(HYPRE_Int, num_cols_offd_C, HYPRE_MEMORY_HOST); for (i = 0; i < num_cols_offd_C; i++) { P_marker[i] = -1; } jj_count_offd = 0; nnz_offd = C_offd_i[num_cols_diag_A]; for (i = 0; i < nnz_offd; i++) { i1 = C_offd_j[i]; if (P_marker[i1]) { P_marker[i1] = 0; jj_count_offd++; } } if (jj_count_offd < num_cols_offd_C) { new_col_map_offd_C = hypre_CTAlloc(HYPRE_BigInt, jj_count_offd, HYPRE_MEMORY_HOST); jj_count_offd = 0; for (i = 0; i < num_cols_offd_C; i++) { if (!P_marker[i]) { P_marker[i] = jj_count_offd; new_col_map_offd_C[jj_count_offd++] = col_map_offd_C[i]; } } for (i = 0; i < nnz_offd; i++) { i1 = C_offd_j[i]; C_offd_j[i] = P_marker[i1]; } num_cols_offd_C = jj_count_offd; hypre_TFree(col_map_offd_C, HYPRE_MEMORY_HOST); col_map_offd_C = new_col_map_offd_C; hypre_CSRMatrixNumCols(hypre_ParCSRMatrixOffd(C)) = num_cols_offd_C; } hypre_TFree(P_marker, HYPRE_MEMORY_HOST); } hypre_ParCSRMatrixColMapOffd(C) = col_map_offd_C; /*----------------------------------------------------------------------- * Free various arrays *-----------------------------------------------------------------------*/ if (C_ext_size || num_cols_offd_B) { hypre_TFree(C_ext_diag_i, HYPRE_MEMORY_HOST); hypre_TFree(C_ext_offd_i, HYPRE_MEMORY_HOST); } if (C_ext_diag_size) { hypre_TFree(C_ext_diag_j, HYPRE_MEMORY_HOST); hypre_TFree(C_ext_diag_data, HYPRE_MEMORY_HOST); } if (C_ext_offd_size) { hypre_TFree(C_ext_offd_j, HYPRE_MEMORY_HOST); hypre_TFree(C_ext_offd_data, HYPRE_MEMORY_HOST); } if (num_cols_offd_B) { hypre_TFree(map_B_to_C, HYPRE_MEMORY_HOST); } if (C_diag) { hypre_CSRMatrixDestroy(C_tmp_diag); } if (C_offd) { hypre_CSRMatrixDestroy(C_tmp_offd); } #if defined(HYPRE_USING_GPU) if ( hypre_GetExecPolicy2(memory_location_A, memory_location_B) == HYPRE_EXEC_DEVICE ) { hypre_CSRMatrixMoveDiagFirstDevice(hypre_ParCSRMatrixDiag(C)); hypre_SyncComputeStream(); } #endif HYPRE_ANNOTATE_FUNC_END; return C; } /*-------------------------------------------------------------------------- * hypre_ParvecBdiagInvScal *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ParvecBdiagInvScal( hypre_ParVector *b, HYPRE_Int blockSize, hypre_ParVector **bs, hypre_ParCSRMatrix *A) { MPI_Comm comm = hypre_ParCSRMatrixComm(b); HYPRE_Int num_procs, my_id; hypre_MPI_Comm_rank(comm, &my_id); hypre_MPI_Comm_size(comm, &num_procs); HYPRE_Int i, j, s; HYPRE_BigInt block_start, block_end; HYPRE_BigInt nrow_global = hypre_ParVectorGlobalSize(b); HYPRE_BigInt first_row = hypre_ParVectorFirstIndex(b); HYPRE_BigInt last_row = hypre_ParVectorLastIndex(b); HYPRE_BigInt end_row = last_row + 1; /* one past-the-last */ HYPRE_BigInt first_row_block = first_row / (HYPRE_BigInt)(blockSize) * (HYPRE_BigInt)blockSize; HYPRE_BigInt end_row_block = hypre_min( (last_row / (HYPRE_BigInt)blockSize + 1) * (HYPRE_BigInt)blockSize, nrow_global ); hypre_assert(blockSize == A->bdiag_size); HYPRE_Complex *bdiaginv = A->bdiaginv; hypre_ParCSRCommPkg *comm_pkg = A->bdiaginv_comm_pkg; HYPRE_Complex *dense = bdiaginv; //for (i=first_row_block; i < end_row; i+=blockSize) ; //printf("===[%d %d), [ %d %d ) %d === \n", first_row, end_row, first_row_block, end_row_block, i); /* local vector of b */ hypre_Vector *b_local = hypre_ParVectorLocalVector(b); HYPRE_Complex *b_local_data = hypre_VectorData(b_local); /* number of sends (#procs) */ HYPRE_Int num_sends = hypre_ParCSRCommPkgNumSends(comm_pkg); /* number of rows to send */ HYPRE_Int num_rows_send = hypre_ParCSRCommPkgSendMapStart(comm_pkg, num_sends); /* number of recvs (#procs) */ HYPRE_Int num_recvs = hypre_ParCSRCommPkgNumRecvs(comm_pkg); /* number of rows to recv */ HYPRE_Int num_rows_recv = hypre_ParCSRCommPkgRecvVecStart(comm_pkg, num_recvs); hypre_ParCSRCommHandle *comm_handle; hypre_ParVector *bnew = hypre_ParVectorCreate( hypre_ParVectorComm(b), hypre_ParVectorGlobalSize(b), hypre_ParVectorPartitioning(b) ); hypre_ParVectorInitialize(bnew); hypre_Vector *bnew_local = hypre_ParVectorLocalVector(bnew); HYPRE_Complex *bnew_local_data = hypre_VectorData(bnew_local); /* send and recv b */ HYPRE_Complex *send_b = hypre_TAlloc(HYPRE_Complex, num_rows_send, HYPRE_MEMORY_HOST); HYPRE_Complex *recv_b = hypre_TAlloc(HYPRE_Complex, num_rows_recv, HYPRE_MEMORY_HOST); for (i = 0; i < num_rows_send; i++) { j = hypre_ParCSRCommPkgSendMapElmt(comm_pkg, i); send_b[i] = b_local_data[j]; } comm_handle = hypre_ParCSRCommHandleCreate(1, comm_pkg, send_b, recv_b); /* ... */ hypre_ParCSRCommHandleDestroy(comm_handle); for (block_start = first_row_block; block_start < end_row_block; block_start += blockSize) { HYPRE_BigInt big_i; block_end = hypre_min(block_start + (HYPRE_BigInt)blockSize, nrow_global); s = (HYPRE_Int)(block_end - block_start); for (big_i = block_start; big_i < block_end; big_i++) { if (big_i < first_row || big_i >= end_row) { continue; } HYPRE_Int local_i = (HYPRE_Int)(big_i - first_row); HYPRE_Int block_i = (HYPRE_Int)(big_i - block_start); bnew_local_data[local_i] = 0.0; for (j = 0; j < s; j++) { HYPRE_BigInt global_rid = block_start + (HYPRE_BigInt)j; HYPRE_Complex val = dense[block_i + j * blockSize]; if (val == 0.0) { continue; } if (global_rid >= first_row && global_rid < end_row) { HYPRE_Int rid = (HYPRE_Int)(global_rid - first_row); bnew_local_data[local_i] += val * b_local_data[rid]; } else { HYPRE_Int rid; if (global_rid < first_row) { rid = (HYPRE_Int)(global_rid - first_row_block); } else { rid = (HYPRE_Int)(first_row - first_row_block + global_rid - end_row); } bnew_local_data[local_i] += val * recv_b[rid]; } } } dense += blockSize * blockSize; } hypre_TFree(send_b, HYPRE_MEMORY_HOST); hypre_TFree(recv_b, HYPRE_MEMORY_HOST); *bs = bnew; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_ParcsrBdiagInvScal * * Compute As = B^{-1}*A, where B is the block diagonal of A. *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ParcsrBdiagInvScal( hypre_ParCSRMatrix *A, HYPRE_Int blockSize, hypre_ParCSRMatrix **As) { MPI_Comm comm = hypre_ParCSRMatrixComm(A); HYPRE_Int num_procs, my_id; hypre_MPI_Comm_rank(comm, &my_id); hypre_MPI_Comm_size(comm, &num_procs); HYPRE_Int i, j, k, s; HYPRE_BigInt block_start, block_end; /* diag part of A */ hypre_CSRMatrix *A_diag = hypre_ParCSRMatrixDiag(A); HYPRE_Real *A_diag_a = hypre_CSRMatrixData(A_diag); HYPRE_Int *A_diag_i = hypre_CSRMatrixI(A_diag); HYPRE_Int *A_diag_j = hypre_CSRMatrixJ(A_diag); /* off-diag part of A */ hypre_CSRMatrix *A_offd = hypre_ParCSRMatrixOffd(A); HYPRE_Real *A_offd_a = hypre_CSRMatrixData(A_offd); HYPRE_Int *A_offd_i = hypre_CSRMatrixI(A_offd); HYPRE_Int *A_offd_j = hypre_CSRMatrixJ(A_offd); HYPRE_Int num_cols_A_offd = hypre_CSRMatrixNumCols(A_offd); HYPRE_BigInt *col_map_offd_A = hypre_ParCSRMatrixColMapOffd(A); HYPRE_Int nrow_local = hypre_CSRMatrixNumRows(A_diag); HYPRE_BigInt first_row = hypre_ParCSRMatrixFirstRowIndex(A); HYPRE_BigInt last_row = hypre_ParCSRMatrixLastRowIndex(A); HYPRE_BigInt end_row = first_row + (HYPRE_BigInt)nrow_local; /* one past-the-last */ HYPRE_Int ncol_local = hypre_CSRMatrixNumCols(A_diag); HYPRE_BigInt first_col = hypre_ParCSRMatrixFirstColDiag(A); /* HYPRE_Int last_col = hypre_ParCSRMatrixLastColDiag(A); */ HYPRE_BigInt end_col = first_col + (HYPRE_BigInt)ncol_local; HYPRE_BigInt nrow_global = hypre_ParCSRMatrixGlobalNumRows(A); HYPRE_BigInt ncol_global = hypre_ParCSRMatrixGlobalNumCols(A); HYPRE_BigInt *row_starts = hypre_ParCSRMatrixRowStarts(A); void *request; /* if square globally and locally */ HYPRE_Int square2 = (nrow_global == ncol_global) && (nrow_local == ncol_local) && (first_row == first_col); if (nrow_global != ncol_global) { hypre_printf("hypre_ParcsrBdiagInvScal: only support N_ROW == N_COL\n"); return hypre_error_flag; } /* in block diagonals, row range of the blocks this proc span */ HYPRE_BigInt first_row_block = first_row / (HYPRE_BigInt)blockSize * (HYPRE_BigInt)blockSize; HYPRE_BigInt end_row_block = hypre_min( (last_row / (HYPRE_BigInt)blockSize + 1) * (HYPRE_BigInt)blockSize, nrow_global ); HYPRE_Int num_blocks = (HYPRE_Int)(last_row / (HYPRE_BigInt)blockSize + 1 - first_row / (HYPRE_BigInt)blockSize); //for (i=first_row_block; i < end_row; i+=blockSize) ; //printf("===[%d %d), [ %d %d ) %d === \n", first_row, end_row, first_row_block, end_row_block, i); //return 0; /* number of external rows */ HYPRE_Int num_ext_rows = (HYPRE_Int)(end_row_block - first_row_block - (end_row - first_row)); HYPRE_BigInt *ext_indices; HYPRE_Int A_ext_nnz; hypre_CSRMatrix *A_ext = NULL; HYPRE_Complex *A_ext_a = NULL; HYPRE_Int *A_ext_i = NULL; HYPRE_BigInt *A_ext_j = NULL; HYPRE_Real *dense_all = hypre_CTAlloc(HYPRE_Complex, num_blocks * blockSize * blockSize, HYPRE_MEMORY_HOST); HYPRE_Real *dense = dense_all; HYPRE_Int *IPIV = hypre_TAlloc(HYPRE_Int, blockSize, HYPRE_MEMORY_HOST); HYPRE_Complex *dgetri_work = NULL; HYPRE_Int dgetri_lwork = -1, lapack_info; HYPRE_Int num_cols_A_offd_new; HYPRE_BigInt *col_map_offd_A_new; HYPRE_BigInt big_i; HYPRE_Int *offd2new = NULL; HYPRE_Int *marker_diag, *marker_newoffd; HYPRE_Int nnz_diag = A_diag_i[nrow_local]; HYPRE_Int nnz_offd = A_offd_i[nrow_local]; HYPRE_Int nnz_diag_new = 0, nnz_offd_new = 0; HYPRE_Int *A_diag_i_new, *A_diag_j_new, *A_offd_i_new, *A_offd_j_new; HYPRE_Complex *A_diag_a_new, *A_offd_a_new; /* heuristic */ HYPRE_Int nnz_diag_alloc = 2 * nnz_diag; HYPRE_Int nnz_offd_alloc = 2 * nnz_offd; A_diag_i_new = hypre_CTAlloc(HYPRE_Int, nrow_local + 1, HYPRE_MEMORY_HOST); A_diag_j_new = hypre_CTAlloc(HYPRE_Int, nnz_diag_alloc, HYPRE_MEMORY_HOST); A_diag_a_new = hypre_CTAlloc(HYPRE_Complex, nnz_diag_alloc, HYPRE_MEMORY_HOST); A_offd_i_new = hypre_CTAlloc(HYPRE_Int, nrow_local + 1, HYPRE_MEMORY_HOST); A_offd_j_new = hypre_CTAlloc(HYPRE_Int, nnz_offd_alloc, HYPRE_MEMORY_HOST); A_offd_a_new = hypre_CTAlloc(HYPRE_Complex, nnz_offd_alloc, HYPRE_MEMORY_HOST); hypre_ParCSRMatrix *Anew; hypre_CSRMatrix *Anew_diag; hypre_CSRMatrix *Anew_offd; HYPRE_Real eps = 2.2e-16; /* Start with extracting the external rows */ HYPRE_BigInt *ext_offd; ext_indices = hypre_CTAlloc(HYPRE_BigInt, num_ext_rows, HYPRE_MEMORY_HOST); j = 0; for (big_i = first_row_block; big_i < first_row; big_i++) { ext_indices[j++] = big_i; } for (big_i = end_row; big_i < end_row_block; big_i++) { ext_indices[j++] = big_i; } hypre_assert(j == num_ext_rows); /* create CommPkg for external rows */ hypre_ParCSRFindExtendCommPkg(comm, nrow_global, first_row, nrow_local, row_starts, hypre_ParCSRMatrixAssumedPartition(A), num_ext_rows, ext_indices, &A->bdiaginv_comm_pkg); hypre_ParcsrGetExternalRowsInit(A, num_ext_rows, ext_indices, A->bdiaginv_comm_pkg, 1, &request); A_ext = hypre_ParcsrGetExternalRowsWait(request); hypre_TFree(ext_indices, HYPRE_MEMORY_HOST); A_ext_i = hypre_CSRMatrixI(A_ext); A_ext_j = hypre_CSRMatrixBigJ(A_ext); A_ext_a = hypre_CSRMatrixData(A_ext); A_ext_nnz = A_ext_i[num_ext_rows]; ext_offd = hypre_CTAlloc(HYPRE_BigInt, A_ext_nnz, HYPRE_MEMORY_HOST); /* fint the offd incides in A_ext */ for (i = 0, j = 0; i < A_ext_nnz; i++) { /* global index */ HYPRE_BigInt cid = A_ext_j[i]; /* keep the offd indices */ if (cid < first_col || cid >= end_col) { ext_offd[j++] = cid; } } /* remove duplicates after sorting (TODO better ways?) */ hypre_BigQsort0(ext_offd, 0, j - 1); for (i = 0, k = 0; i < j; i++) { if (i == 0 || ext_offd[i] != ext_offd[i - 1]) { ext_offd[k++] = ext_offd[i]; } } /* uniion these `k' new indices into col_map_offd_A */ col_map_offd_A_new = hypre_CTAlloc(HYPRE_BigInt, num_cols_A_offd + k, HYPRE_MEMORY_HOST); if (k) { /* map offd to offd_new */ offd2new = hypre_CTAlloc(HYPRE_Int, num_cols_A_offd, HYPRE_MEMORY_HOST); } hypre_union2(num_cols_A_offd, col_map_offd_A, k, ext_offd, &num_cols_A_offd_new, col_map_offd_A_new, offd2new, NULL); hypre_TFree(ext_offd, HYPRE_MEMORY_HOST); /* * adjust column indices in A_ext */ for (i = 0; i < A_ext_nnz; i++) { HYPRE_BigInt cid = A_ext_j[i]; if (cid < first_col || cid >= end_col) { j = hypre_BigBinarySearch(col_map_offd_A_new, cid, num_cols_A_offd_new); /* searching must succeed */ hypre_assert(j >= 0 && j < num_cols_A_offd_new); /* trick: save ncol_local + j back */ A_ext_j[i] = ncol_local + j; } else { /* save local index: [0, ncol_local-1] */ A_ext_j[i] = cid - first_col; } } /* marker for diag */ marker_diag = hypre_TAlloc(HYPRE_Int, ncol_local, HYPRE_MEMORY_HOST); for (i = 0; i < ncol_local; i++) { marker_diag[i] = -1; } /* marker for newoffd */ marker_newoffd = hypre_TAlloc(HYPRE_Int, num_cols_A_offd_new, HYPRE_MEMORY_HOST); for (i = 0; i < num_cols_A_offd_new; i++) { marker_newoffd[i] = -1; } /* outer most loop for blocks */ for (block_start = first_row_block; block_start < end_row_block; block_start += (HYPRE_BigInt)blockSize) { HYPRE_BigInt big_i; block_end = hypre_min(block_start + (HYPRE_BigInt)blockSize, nrow_global); s = (HYPRE_Int)(block_end - block_start); /* 1. fill the dense block diag matrix */ for (big_i = block_start; big_i < block_end; big_i++) { /* row index in this block */ HYPRE_Int block_i = (HYPRE_Int)(big_i - block_start); /* row index i: it can be local or external */ if (big_i >= first_row && big_i < end_row) { /* is a local row */ j = (HYPRE_Int)(big_i - first_row); for (k = A_diag_i[j]; k < A_diag_i[j + 1]; k++) { HYPRE_BigInt cid = (HYPRE_BigInt)A_diag_j[k] + first_col; if (cid >= block_start && cid < block_end) { dense[block_i + (HYPRE_Int)(cid - block_start)*blockSize] = A_diag_a[k]; } } if (num_cols_A_offd) { for (k = A_offd_i[j]; k < A_offd_i[j + 1]; k++) { HYPRE_BigInt cid = col_map_offd_A[A_offd_j[k]]; if (cid >= block_start && cid < block_end) { dense[block_i + (HYPRE_Int)(cid - block_start)*blockSize] = A_offd_a[k]; } } } } else { /* is an external row */ if (big_i < first_row) { j = (HYPRE_Int)(big_i - first_row_block); } else { j = (HYPRE_Int)(first_row - first_row_block + big_i - end_row); } for (k = A_ext_i[j]; k < A_ext_i[j + 1]; k++) { HYPRE_BigInt cid = A_ext_j[k]; /* recover the global index */ cid = cid < (HYPRE_BigInt)ncol_local ? cid + first_col : col_map_offd_A_new[cid - ncol_local]; if (cid >= block_start && cid < block_end) { dense[block_i + (HYPRE_Int)(cid - block_start)*blockSize] = A_ext_a[k]; } } } } /* 2. invert the dense matrix */ hypre_dgetrf(&s, &s, dense, &blockSize, IPIV, &lapack_info); hypre_assert(lapack_info == 0); if (lapack_info == 0) { HYPRE_Int query = -1; HYPRE_Real lwork_opt; /* query the optimal size of work */ hypre_dgetri(&s, dense, &blockSize, IPIV, &lwork_opt, &query, &lapack_info); hypre_assert(lapack_info == 0); if (lwork_opt > dgetri_lwork) { dgetri_lwork = (HYPRE_Int)lwork_opt; dgetri_work = hypre_TReAlloc(dgetri_work, HYPRE_Complex, dgetri_lwork, HYPRE_MEMORY_HOST); } hypre_dgetri(&s, dense, &blockSize, IPIV, dgetri_work, &dgetri_lwork, &lapack_info); hypre_assert(lapack_info == 0); } /* filter out *zeros* */ HYPRE_Real Fnorm = 0.0; for (i = 0; i < s; i++) { for (j = 0; j < s; j++) { HYPRE_Complex t = dense[j + i * blockSize]; Fnorm += t * t; } } Fnorm = hypre_sqrt(Fnorm); for (i = 0; i < s; i++) { for (j = 0; j < s; j++) { if ( hypre_abs(dense[j + i * blockSize]) < eps * Fnorm ) { dense[j + i * blockSize] = 0.0; } } } /* 3. premultiplication: one-pass dynamic allocation */ for (big_i = block_start; big_i < block_end; big_i++) { /* starting points of this row in j */ HYPRE_Int diag_i_start = nnz_diag_new; HYPRE_Int offd_i_start = nnz_offd_new; /* compute a new row with global index 'i' and local index 'local_i' */ HYPRE_Int local_i = (HYPRE_Int)(big_i - first_row); /* row index in this block */ HYPRE_Int block_i = (HYPRE_Int)(big_i - block_start); if (big_i < first_row || big_i >= end_row) { continue; } /* if square^2: reserve the first space in diag part to the diag entry */ if (square2) { marker_diag[local_i] = nnz_diag_new; if (nnz_diag_new == nnz_diag_alloc) { nnz_diag_alloc = nnz_diag_alloc * 2 + 1; A_diag_j_new = hypre_TReAlloc(A_diag_j_new, HYPRE_Int, nnz_diag_alloc, HYPRE_MEMORY_HOST); A_diag_a_new = hypre_TReAlloc(A_diag_a_new, HYPRE_Complex, nnz_diag_alloc, HYPRE_MEMORY_HOST); } A_diag_j_new[nnz_diag_new] = local_i; A_diag_a_new[nnz_diag_new] = 0.0; nnz_diag_new ++; } /* combine s rows */ for (j = 0; j < s; j++) { /* row to combine: global row id */ HYPRE_BigInt global_rid = block_start + (HYPRE_BigInt)j; /* the multipiler */ HYPRE_Complex val = dense[block_i + j * blockSize]; if (val == 0.0) { continue; } if (global_rid >= first_row && global_rid < end_row) { /* this row is local */ HYPRE_Int rid = (HYPRE_Int)(global_rid - first_row); HYPRE_Int ii; for (ii = A_diag_i[rid]; ii < A_diag_i[rid + 1]; ii++) { HYPRE_Int col = A_diag_j[ii]; HYPRE_Complex vv = A_diag_a[ii]; if (marker_diag[col] < diag_i_start) { /* this col has not been seen before, create new entry */ marker_diag[col] = nnz_diag_new; if (nnz_diag_new == nnz_diag_alloc) { nnz_diag_alloc = nnz_diag_alloc * 2 + 1; A_diag_j_new = hypre_TReAlloc(A_diag_j_new, HYPRE_Int, nnz_diag_alloc, HYPRE_MEMORY_HOST); A_diag_a_new = hypre_TReAlloc(A_diag_a_new, HYPRE_Complex, nnz_diag_alloc, HYPRE_MEMORY_HOST); } A_diag_j_new[nnz_diag_new] = col; A_diag_a_new[nnz_diag_new] = val * vv; nnz_diag_new ++; } else { /* existing entry, update */ HYPRE_Int p = marker_diag[col]; hypre_assert(A_diag_j_new[p] == col); A_diag_a_new[p] += val * vv; } } for (ii = A_offd_i[rid]; ii < A_offd_i[rid + 1]; ii++) { HYPRE_Int col = A_offd_j[ii]; /* use the mapper to map to new offd */ HYPRE_Int col_new = offd2new ? offd2new[col] : col; HYPRE_Complex vv = A_offd_a[ii]; if (marker_newoffd[col_new] < offd_i_start) { /* this col has not been seen before, create new entry */ marker_newoffd[col_new] = nnz_offd_new; if (nnz_offd_new == nnz_offd_alloc) { nnz_offd_alloc = nnz_offd_alloc * 2 + 1; A_offd_j_new = hypre_TReAlloc(A_offd_j_new, HYPRE_Int, nnz_offd_alloc, HYPRE_MEMORY_HOST); A_offd_a_new = hypre_TReAlloc(A_offd_a_new, HYPRE_Complex, nnz_offd_alloc, HYPRE_MEMORY_HOST); } A_offd_j_new[nnz_offd_new] = col_new; A_offd_a_new[nnz_offd_new] = val * vv; nnz_offd_new ++; } else { /* existing entry, update */ HYPRE_Int p = marker_newoffd[col_new]; hypre_assert(A_offd_j_new[p] == col_new); A_offd_a_new[p] += val * vv; } } } else { /* this is an external row: go to A_ext */ HYPRE_Int rid, ii; if (global_rid < first_row) { rid = (HYPRE_Int)(global_rid - first_row_block); } else { rid = (HYPRE_Int)(first_row - first_row_block + global_rid - end_row); } for (ii = A_ext_i[rid]; ii < A_ext_i[rid + 1]; ii++) { HYPRE_Int col = (HYPRE_Int)A_ext_j[ii]; HYPRE_Complex vv = A_ext_a[ii]; if (col < ncol_local) { /* in diag part */ if (marker_diag[col] < diag_i_start) { /* this col has not been seen before, create new entry */ marker_diag[col] = nnz_diag_new; if (nnz_diag_new == nnz_diag_alloc) { nnz_diag_alloc = nnz_diag_alloc * 2 + 1; A_diag_j_new = hypre_TReAlloc(A_diag_j_new, HYPRE_Int, nnz_diag_alloc, HYPRE_MEMORY_HOST); A_diag_a_new = hypre_TReAlloc(A_diag_a_new, HYPRE_Complex, nnz_diag_alloc, HYPRE_MEMORY_HOST); } A_diag_j_new[nnz_diag_new] = col; A_diag_a_new[nnz_diag_new] = val * vv; nnz_diag_new ++; } else { /* existing entry, update */ HYPRE_Int p = marker_diag[col]; hypre_assert(A_diag_j_new[p] == col); A_diag_a_new[p] += val * vv; } } else { /* in offd part */ col -= ncol_local; if (marker_newoffd[col] < offd_i_start) { /* this col has not been seen before, create new entry */ marker_newoffd[col] = nnz_offd_new; if (nnz_offd_new == nnz_offd_alloc) { nnz_offd_alloc = nnz_offd_alloc * 2 + 1; A_offd_j_new = hypre_TReAlloc(A_offd_j_new, HYPRE_Int, nnz_offd_alloc, HYPRE_MEMORY_HOST); A_offd_a_new = hypre_TReAlloc(A_offd_a_new, HYPRE_Complex, nnz_offd_alloc, HYPRE_MEMORY_HOST); } A_offd_j_new[nnz_offd_new] = col; A_offd_a_new[nnz_offd_new] = val * vv; nnz_offd_new ++; } else { /* existing entry, update */ HYPRE_Int p = marker_newoffd[col]; hypre_assert(A_offd_j_new[p] == col); A_offd_a_new[p] += val * vv; } } } } } /* done for row local_i */ A_diag_i_new[local_i + 1] = nnz_diag_new; A_offd_i_new[local_i + 1] = nnz_offd_new; } /* for i, each row */ dense += blockSize * blockSize; } /* for each block */ /* done with all rows */ /* resize properly */ A_diag_j_new = hypre_TReAlloc(A_diag_j_new, HYPRE_Int, nnz_diag_new, HYPRE_MEMORY_HOST); A_diag_a_new = hypre_TReAlloc(A_diag_a_new, HYPRE_Complex, nnz_diag_new, HYPRE_MEMORY_HOST); A_offd_j_new = hypre_TReAlloc(A_offd_j_new, HYPRE_Int, nnz_offd_new, HYPRE_MEMORY_HOST); A_offd_a_new = hypre_TReAlloc(A_offd_a_new, HYPRE_Complex, nnz_offd_new, HYPRE_MEMORY_HOST); /* readjust col_map_offd_new */ for (i = 0; i < num_cols_A_offd_new; i++) { marker_newoffd[i] = -1; } for (i = 0; i < nnz_offd_new; i++) { j = A_offd_j_new[i]; if (marker_newoffd[j] == -1) { marker_newoffd[j] = 1; } } for (i = 0, j = 0; i < num_cols_A_offd_new; i++) { if (marker_newoffd[i] == 1) { col_map_offd_A_new[j] = col_map_offd_A_new[i]; marker_newoffd[i] = j++; } } num_cols_A_offd_new = j; for (i = 0; i < nnz_offd_new; i++) { j = marker_newoffd[A_offd_j_new[i]]; hypre_assert(j >= 0 && j < num_cols_A_offd_new); A_offd_j_new[i] = j; } /* Now, we should have everything of Parcsr matrix As */ Anew = hypre_ParCSRMatrixCreate(comm, nrow_global, ncol_global, hypre_ParCSRMatrixRowStarts(A), hypre_ParCSRMatrixColStarts(A), num_cols_A_offd_new, nnz_diag_new, nnz_offd_new); Anew_diag = hypre_ParCSRMatrixDiag(Anew); hypre_CSRMatrixData(Anew_diag) = A_diag_a_new; hypre_CSRMatrixI(Anew_diag) = A_diag_i_new; hypre_CSRMatrixJ(Anew_diag) = A_diag_j_new; Anew_offd = hypre_ParCSRMatrixOffd(Anew); hypre_CSRMatrixData(Anew_offd) = A_offd_a_new; hypre_CSRMatrixI(Anew_offd) = A_offd_i_new; hypre_CSRMatrixJ(Anew_offd) = A_offd_j_new; hypre_ParCSRMatrixColMapOffd(Anew) = col_map_offd_A_new; hypre_ParCSRMatrixSetNumNonzeros(Anew); hypre_ParCSRMatrixDNumNonzeros(Anew) = (HYPRE_Real) hypre_ParCSRMatrixNumNonzeros(Anew); //printf("nnz_diag %d --> %d, nnz_offd %d --> %d\n", nnz_diag, nnz_diag_new, nnz_offd, nnz_offd_new); /* create CommPkg of Anew */ hypre_MatvecCommPkgCreate(Anew); *As = Anew; /* if (bdiaginv) { *bdiaginv = dense_all; } else { hypre_TFree(dense_all, HYPRE_MEMORY_HOST); } */ /* save diagonal blocks in A */ A->bdiag_size = blockSize; A->bdiaginv = dense_all; /* free workspace */ hypre_TFree(IPIV, HYPRE_MEMORY_HOST); hypre_TFree(dgetri_work, HYPRE_MEMORY_HOST); hypre_TFree(marker_diag, HYPRE_MEMORY_HOST); hypre_TFree(marker_newoffd, HYPRE_MEMORY_HOST); hypre_TFree(offd2new, HYPRE_MEMORY_HOST); hypre_CSRMatrixDestroy(A_ext); return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_ParcsrGetExternalRowsInit *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ParcsrGetExternalRowsInit( hypre_ParCSRMatrix *A, HYPRE_Int indices_len, HYPRE_BigInt *indices, hypre_ParCSRCommPkg *comm_pkg, HYPRE_Int want_data, void **request_ptr) { HYPRE_UNUSED_VAR(indices); MPI_Comm comm = hypre_ParCSRMatrixComm(A); HYPRE_BigInt first_col = hypre_ParCSRMatrixFirstColDiag(A); HYPRE_BigInt *col_map_offd_A = hypre_ParCSRMatrixColMapOffd(A); /* diag part of A */ hypre_CSRMatrix *A_diag = hypre_ParCSRMatrixDiag(A); HYPRE_Real *A_diag_a = hypre_CSRMatrixData(A_diag); HYPRE_Int *A_diag_i = hypre_CSRMatrixI(A_diag); HYPRE_Int *A_diag_j = hypre_CSRMatrixJ(A_diag); /* off-diag part of A */ hypre_CSRMatrix *A_offd = hypre_ParCSRMatrixOffd(A); HYPRE_Real *A_offd_a = hypre_CSRMatrixData(A_offd); HYPRE_Int *A_offd_i = hypre_CSRMatrixI(A_offd); HYPRE_Int *A_offd_j = hypre_CSRMatrixJ(A_offd); hypre_CSRMatrix *A_ext; HYPRE_Int num_procs, my_id; void **vrequest; HYPRE_Int i, j, k; HYPRE_Int num_sends, num_rows_send, num_nnz_send, *send_i; HYPRE_Int num_recvs, num_rows_recv, num_nnz_recv, *recv_i; HYPRE_Int *send_jstarts, *recv_jstarts, *send_i_offset; HYPRE_BigInt *send_j, *recv_j; HYPRE_Complex *send_a = NULL, *recv_a = NULL; hypre_ParCSRCommPkg *comm_pkg_j = NULL; hypre_ParCSRCommHandle *comm_handle, *comm_handle_j, *comm_handle_a; hypre_MPI_Comm_size(comm, &num_procs); hypre_MPI_Comm_rank(comm, &my_id); /* number of sends (#procs) */ num_sends = hypre_ParCSRCommPkgNumSends(comm_pkg); /* number of rows to send */ num_rows_send = hypre_ParCSRCommPkgSendMapStart(comm_pkg, num_sends); /* number of recvs (#procs) */ num_recvs = hypre_ParCSRCommPkgNumRecvs(comm_pkg); /* number of rows to recv */ num_rows_recv = hypre_ParCSRCommPkgRecvVecStart(comm_pkg, num_recvs); /* must be true if indices contains proper offd indices */ hypre_assert(indices_len == num_rows_recv); /* send_i/recv_i: * the arrays to send and recv: we first send and recv the row lengths */ send_i = hypre_TAlloc(HYPRE_Int, num_rows_send, HYPRE_MEMORY_HOST); recv_i = hypre_CTAlloc(HYPRE_Int, num_rows_recv + 1, HYPRE_MEMORY_HOST); /* fill the send array with row lengths */ for (i = 0, num_nnz_send = 0; i < num_rows_send; i++) { /* j: row index to send */ j = hypre_ParCSRCommPkgSendMapElmt(comm_pkg, i); send_i[i] = A_diag_i[j + 1] - A_diag_i[j] + A_offd_i[j + 1] - A_offd_i[j]; num_nnz_send += send_i[i]; } /* send this array out: note the shift in recv_i by one (async) */ comm_handle = hypre_ParCSRCommHandleCreate(11, comm_pkg, send_i, recv_i + 1); /* prepare data to send out. overlap with the above commmunication */ send_j = hypre_TAlloc(HYPRE_BigInt, num_nnz_send, HYPRE_MEMORY_HOST); if (want_data) { send_a = hypre_TAlloc(HYPRE_Complex, num_nnz_send, HYPRE_MEMORY_HOST); } send_i_offset = hypre_TAlloc(HYPRE_Int, num_rows_send + 1, HYPRE_MEMORY_HOST); send_i_offset[0] = 0; hypre_TMemcpy(send_i_offset + 1, send_i, HYPRE_Int, num_rows_send, HYPRE_MEMORY_HOST, HYPRE_MEMORY_HOST); /* prefix sum. TODO: OMP parallelization */ for (i = 1; i <= num_rows_send; i++) { send_i_offset[i] += send_i_offset[i - 1]; } hypre_assert(send_i_offset[num_rows_send] == num_nnz_send); /* pointers to each proc in send_j */ send_jstarts = hypre_TAlloc(HYPRE_Int, num_sends + 1, HYPRE_MEMORY_HOST); #ifdef HYPRE_USING_OPENMP #pragma omp parallel for HYPRE_SMP_SCHEDULE #endif for (i = 0; i <= num_sends; i++) { send_jstarts[i] = send_i_offset[hypre_ParCSRCommPkgSendMapStart(comm_pkg, i)]; } hypre_assert(send_jstarts[num_sends] == num_nnz_send); /* fill the CSR matrix: j and a */ #ifdef HYPRE_USING_OPENMP #pragma omp parallel for HYPRE_SMP_SCHEDULE private(i,j,k) #endif for (i = 0; i < num_rows_send; i++) { HYPRE_Int i1 = send_i_offset[i]; j = hypre_ParCSRCommPkgSendMapElmt(comm_pkg, i); /* open row j and fill ja and a to send */ for (k = A_diag_i[j]; k < A_diag_i[j + 1]; k++) { send_j[i1] = first_col + A_diag_j[k]; if (want_data) { send_a[i1] = A_diag_a[k]; } i1++; } if (num_procs > 1) { for (k = A_offd_i[j]; k < A_offd_i[j + 1]; k++) { send_j[i1] = col_map_offd_A[A_offd_j[k]]; if (want_data) { send_a[i1] = A_offd_a[k]; } i1++; } } hypre_assert(send_i_offset[i + 1] == i1); } /* finish the above communication: send_i/recv_i */ hypre_ParCSRCommHandleDestroy(comm_handle); /* adjust recv_i to ptrs */ for (i = 1; i <= num_rows_recv; i++) { recv_i[i] += recv_i[i - 1]; } num_nnz_recv = recv_i[num_rows_recv]; recv_j = hypre_CTAlloc(HYPRE_BigInt, num_nnz_recv, HYPRE_MEMORY_HOST); if (want_data) { recv_a = hypre_CTAlloc(HYPRE_Complex, num_nnz_recv, HYPRE_MEMORY_HOST); } recv_jstarts = hypre_CTAlloc(HYPRE_Int, num_recvs + 1, HYPRE_MEMORY_HOST); for (i = 1; i <= num_recvs; i++) { j = hypre_ParCSRCommPkgRecvVecStart(comm_pkg, i); recv_jstarts[i] = recv_i[j]; } /* Create communication package */ hypre_ParCSRCommPkgCreateAndFill(comm, num_recvs, hypre_ParCSRCommPkgRecvProcs(comm_pkg), recv_jstarts, num_sends, hypre_ParCSRCommPkgSendProcs(comm_pkg), send_jstarts, NULL, &comm_pkg_j); /* init communication */ /* ja */ comm_handle_j = hypre_ParCSRCommHandleCreate(21, comm_pkg_j, send_j, recv_j); if (want_data) { /* a */ comm_handle_a = hypre_ParCSRCommHandleCreate(1, comm_pkg_j, send_a, recv_a); } else { comm_handle_a = NULL; } /* create A_ext */ A_ext = hypre_CSRMatrixCreate(num_rows_recv, hypre_ParCSRMatrixGlobalNumCols(A), num_nnz_recv); hypre_CSRMatrixMemoryLocation(A_ext) = HYPRE_MEMORY_HOST; hypre_CSRMatrixI (A_ext) = recv_i; hypre_CSRMatrixBigJ(A_ext) = recv_j; hypre_CSRMatrixData(A_ext) = recv_a; /* output */ vrequest = hypre_TAlloc(void *, 4, HYPRE_MEMORY_HOST); vrequest[0] = (void *) comm_handle_j; vrequest[1] = (void *) comm_handle_a; vrequest[2] = (void *) A_ext; vrequest[3] = (void *) comm_pkg_j; *request_ptr = (void *) vrequest; /* free */ hypre_TFree(send_i, HYPRE_MEMORY_HOST); hypre_TFree(send_i_offset, HYPRE_MEMORY_HOST); return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_ParcsrGetExternalRowsWait *--------------------------------------------------------------------------*/ hypre_CSRMatrix* hypre_ParcsrGetExternalRowsWait(void *vrequest) { void **request = (void **) vrequest; hypre_ParCSRCommHandle *comm_handle_j = (hypre_ParCSRCommHandle *) request[0]; hypre_ParCSRCommHandle *comm_handle_a = (hypre_ParCSRCommHandle *) request[1]; hypre_CSRMatrix *A_ext = (hypre_CSRMatrix *) request[2]; hypre_ParCSRCommPkg *comm_pkg_j = (hypre_ParCSRCommPkg *) request[3]; HYPRE_BigInt *send_j = (HYPRE_BigInt *) hypre_ParCSRCommHandleSendData( comm_handle_j); if (comm_handle_a) { HYPRE_Complex *send_a = (HYPRE_Complex *) hypre_ParCSRCommHandleSendData(comm_handle_a); hypre_ParCSRCommHandleDestroy(comm_handle_a); hypre_TFree(send_a, HYPRE_MEMORY_HOST); } hypre_ParCSRCommHandleDestroy(comm_handle_j); hypre_TFree(send_j, HYPRE_MEMORY_HOST); hypre_TFree(hypre_ParCSRCommPkgSendMapStarts(comm_pkg_j), HYPRE_MEMORY_HOST); hypre_TFree(hypre_ParCSRCommPkgRecvVecStarts(comm_pkg_j), HYPRE_MEMORY_HOST); hypre_TFree(comm_pkg_j, HYPRE_MEMORY_HOST); hypre_TFree(request, HYPRE_MEMORY_HOST); return A_ext; } /*-------------------------------------------------------------------------- * hypre_ParCSRMatrixAddHost * * Host (CPU) version of hypre_ParCSRMatrixAdd *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ParCSRMatrixAddHost( HYPRE_Complex alpha, hypre_ParCSRMatrix *A, HYPRE_Complex beta, hypre_ParCSRMatrix *B, hypre_ParCSRMatrix **C_ptr ) { /* ParCSRMatrix data */ MPI_Comm comm = hypre_ParCSRMatrixComm(A); HYPRE_BigInt num_rows_A = hypre_ParCSRMatrixGlobalNumRows(A); HYPRE_BigInt num_cols_A = hypre_ParCSRMatrixGlobalNumCols(A); /* HYPRE_BigInt num_rows_B = hypre_ParCSRMatrixGlobalNumRows(B); */ /* HYPRE_BigInt num_cols_B = hypre_ParCSRMatrixGlobalNumCols(B); */ /* diag part of A */ hypre_CSRMatrix *A_diag = hypre_ParCSRMatrixDiag(A); HYPRE_Int *rownnz_diag_A = hypre_CSRMatrixRownnz(A_diag); HYPRE_Int num_rownnz_diag_A = hypre_CSRMatrixNumRownnz(A_diag); HYPRE_Int num_rows_diag_A = hypre_CSRMatrixNumRows(A_diag); HYPRE_Int num_cols_diag_A = hypre_CSRMatrixNumCols(A_diag); /* off-diag part of A */ hypre_CSRMatrix *A_offd = hypre_ParCSRMatrixOffd(A); HYPRE_Int *rownnz_offd_A = hypre_CSRMatrixRownnz(A_offd); HYPRE_Int num_rownnz_offd_A = hypre_CSRMatrixNumRownnz(A_offd); HYPRE_Int num_rows_offd_A = hypre_CSRMatrixNumRows(A_offd); HYPRE_Int num_cols_offd_A = hypre_CSRMatrixNumCols(A_offd); HYPRE_BigInt *col_map_offd_A = hypre_ParCSRMatrixColMapOffd(A); HYPRE_Int *A2C_offd; /* diag part of B */ hypre_CSRMatrix *B_diag = hypre_ParCSRMatrixDiag(B); HYPRE_Int *rownnz_diag_B = hypre_CSRMatrixRownnz(B_diag); HYPRE_Int num_rownnz_diag_B = hypre_CSRMatrixNumRownnz(B_diag); HYPRE_Int num_rows_diag_B = hypre_CSRMatrixNumRows(B_diag); /* HYPRE_Int num_cols_diag_B = hypre_CSRMatrixNumCols(B_diag); */ /* off-diag part of B */ hypre_CSRMatrix *B_offd = hypre_ParCSRMatrixOffd(B); HYPRE_Int *rownnz_offd_B = hypre_CSRMatrixRownnz(B_offd); HYPRE_Int num_rownnz_offd_B = hypre_CSRMatrixNumRownnz(B_offd); HYPRE_Int num_rows_offd_B = hypre_CSRMatrixNumRows(B_offd); HYPRE_Int num_cols_offd_B = hypre_CSRMatrixNumCols(B_offd); HYPRE_BigInt *col_map_offd_B = hypre_ParCSRMatrixColMapOffd(B); HYPRE_Int *B2C_offd; /* C data */ hypre_ParCSRMatrix *C; hypre_CSRMatrix *C_diag; hypre_CSRMatrix *C_offd; HYPRE_BigInt *col_map_offd_C; HYPRE_Int *C_diag_i, *C_offd_i; HYPRE_Int *rownnz_diag_C = NULL; HYPRE_Int *rownnz_offd_C = NULL; HYPRE_Int num_rownnz_diag_C; HYPRE_Int num_rownnz_offd_C; HYPRE_Int num_rows_diag_C = num_rows_diag_A; HYPRE_Int num_cols_diag_C = num_cols_diag_A; HYPRE_Int num_rows_offd_C = num_rows_offd_A; HYPRE_Int num_cols_offd_C = num_cols_offd_A + num_cols_offd_B; HYPRE_Int *twspace; HYPRE_MemoryLocation memory_location_A = hypre_ParCSRMatrixMemoryLocation(A); HYPRE_MemoryLocation memory_location_B = hypre_ParCSRMatrixMemoryLocation(B); /* RL: TODO cannot guarantee, maybe should never assert hypre_assert(memory_location_A == memory_location_B); */ /* RL: in the case of A=H, B=D, or A=D, B=H, let C = D, * not sure if this is the right thing to do. * Also, need something like this in other places * TODO */ HYPRE_MemoryLocation memory_location_C = hypre_max(memory_location_A, memory_location_B); HYPRE_ANNOTATE_FUNC_BEGIN; /* Allocate memory */ twspace = hypre_TAlloc(HYPRE_Int, hypre_NumThreads(), HYPRE_MEMORY_HOST); C_diag_i = hypre_CTAlloc(HYPRE_Int, num_rows_diag_A + 1, memory_location_C); C_offd_i = hypre_CTAlloc(HYPRE_Int, num_rows_offd_A + 1, memory_location_C); col_map_offd_C = hypre_TAlloc(HYPRE_BigInt, num_cols_offd_C, HYPRE_MEMORY_HOST); /* Compute num_cols_offd_C, A2C_offd, and B2C_offd*/ A2C_offd = hypre_TAlloc(HYPRE_Int, num_cols_offd_A, HYPRE_MEMORY_HOST); B2C_offd = hypre_TAlloc(HYPRE_Int, num_cols_offd_B, HYPRE_MEMORY_HOST); hypre_union2(num_cols_offd_A, col_map_offd_A, num_cols_offd_B, col_map_offd_B, &num_cols_offd_C, col_map_offd_C, A2C_offd, B2C_offd); /* Set nonzero rows data of diag_C */ num_rownnz_diag_C = num_rows_diag_A; if ((num_rownnz_diag_A < num_rows_diag_A) && (num_rownnz_diag_B < num_rows_diag_B)) { hypre_IntArray arr_diagA; hypre_IntArray arr_diagB; hypre_IntArray arr_diagC; hypre_IntArrayData(&arr_diagA) = rownnz_diag_A; hypre_IntArrayData(&arr_diagB) = rownnz_diag_B; hypre_IntArraySize(&arr_diagA) = num_rownnz_diag_A; hypre_IntArraySize(&arr_diagB) = num_rownnz_diag_B; hypre_IntArrayMemoryLocation(&arr_diagC) = memory_location_C; hypre_IntArrayMergeOrdered(&arr_diagA, &arr_diagB, &arr_diagC); num_rownnz_diag_C = hypre_IntArraySize(&arr_diagC); rownnz_diag_C = hypre_IntArrayData(&arr_diagC); } /* Set nonzero rows data of offd_C */ num_rownnz_offd_C = num_rows_offd_A; if ((num_rownnz_offd_A < num_rows_offd_A) && (num_rownnz_offd_B < num_rows_offd_B)) { hypre_IntArray arr_offdA; hypre_IntArray arr_offdB; hypre_IntArray arr_offdC; hypre_IntArrayData(&arr_offdA) = rownnz_offd_A; hypre_IntArrayData(&arr_offdB) = rownnz_offd_B; hypre_IntArraySize(&arr_offdA) = num_rownnz_offd_A; hypre_IntArraySize(&arr_offdB) = num_rownnz_offd_B; hypre_IntArrayMemoryLocation(&arr_offdC) = memory_location_C; hypre_IntArrayMergeOrdered(&arr_offdA, &arr_offdB, &arr_offdC); num_rownnz_offd_C = hypre_IntArraySize(&arr_offdC); rownnz_offd_C = hypre_IntArrayData(&arr_offdC); } /* Set diag_C */ #ifdef HYPRE_USING_OPENMP #pragma omp parallel #endif { HYPRE_Int ii, num_threads; HYPRE_Int size, rest, ns, ne; HYPRE_Int *marker_diag; HYPRE_Int *marker_offd; ii = hypre_GetThreadNum(); num_threads = hypre_NumActiveThreads(); /*----------------------------------------------------------------------- * Compute C_diag = alpha*A_diag + beta*B_diag *-----------------------------------------------------------------------*/ size = num_rownnz_diag_C / num_threads; rest = num_rownnz_diag_C - size * num_threads; if (ii < rest) { ns = ii * size + ii; ne = (ii + 1) * size + ii + 1; } else { ns = ii * size + rest; ne = (ii + 1) * size + rest; } marker_diag = hypre_TAlloc(HYPRE_Int, num_cols_diag_A, HYPRE_MEMORY_HOST); hypre_CSRMatrixAddFirstPass(ns, ne, twspace, marker_diag, NULL, NULL, A_diag, B_diag, num_rows_diag_C, num_rownnz_diag_C, num_cols_diag_C, rownnz_diag_C, memory_location_C, C_diag_i, &C_diag); hypre_CSRMatrixAddSecondPass(ns, ne, marker_diag, NULL, NULL, rownnz_diag_C, alpha, beta, A_diag, B_diag, C_diag); hypre_TFree(marker_diag, HYPRE_MEMORY_HOST); /*----------------------------------------------------------------------- * Compute C_offd = alpha*A_offd + beta*B_offd *-----------------------------------------------------------------------*/ size = num_rownnz_offd_C / num_threads; rest = num_rownnz_offd_C - size * num_threads; if (ii < rest) { ns = ii * size + ii; ne = (ii + 1) * size + ii + 1; } else { ns = ii * size + rest; ne = (ii + 1) * size + rest; } marker_offd = hypre_TAlloc(HYPRE_Int, num_cols_offd_C, HYPRE_MEMORY_HOST); hypre_CSRMatrixAddFirstPass(ns, ne, twspace, marker_offd, A2C_offd, B2C_offd, A_offd, B_offd, num_rows_offd_C, num_rownnz_offd_C, num_cols_offd_C, rownnz_offd_C, memory_location_C, C_offd_i, &C_offd); hypre_CSRMatrixAddSecondPass(ns, ne, marker_offd, A2C_offd, B2C_offd, rownnz_offd_C, alpha, beta, A_offd, B_offd, C_offd); hypre_TFree(marker_offd, HYPRE_MEMORY_HOST); } /* end of omp parallel region */ /* Free memory */ hypre_TFree(twspace, HYPRE_MEMORY_HOST); hypre_TFree(A2C_offd, HYPRE_MEMORY_HOST); hypre_TFree(B2C_offd, HYPRE_MEMORY_HOST); /* Create ParCSRMatrix C */ C = hypre_ParCSRMatrixCreate(comm, num_rows_A, num_cols_A, hypre_ParCSRMatrixRowStarts(A), hypre_ParCSRMatrixColStarts(A), num_cols_offd_C, hypre_CSRMatrixNumNonzeros(C_diag), hypre_CSRMatrixNumNonzeros(C_offd)); hypre_CSRMatrixDestroy(hypre_ParCSRMatrixDiag(C)); hypre_CSRMatrixDestroy(hypre_ParCSRMatrixOffd(C)); hypre_ParCSRMatrixDiag(C) = C_diag; hypre_ParCSRMatrixOffd(C) = C_offd; hypre_ParCSRMatrixColMapOffd(C) = col_map_offd_C; hypre_ParCSRMatrixSetNumNonzeros(C); hypre_ParCSRMatrixDNumNonzeros(C) = (HYPRE_Real) hypre_ParCSRMatrixNumNonzeros(C); /* create CommPkg of C */ hypre_MatvecCommPkgCreate(C); *C_ptr = C; HYPRE_ANNOTATE_FUNC_END; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_ParCSRMatrixAdd * * Interface for Host/Device functions for computing C = alpha*A + beta*B * * A and B are assumed to have the same row and column partitionings *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ParCSRMatrixAdd( HYPRE_Complex alpha, hypre_ParCSRMatrix *A, HYPRE_Complex beta, hypre_ParCSRMatrix *B, hypre_ParCSRMatrix **C_ptr ) { hypre_assert(hypre_ParCSRMatrixGlobalNumRows(A) == hypre_ParCSRMatrixGlobalNumRows(B)); hypre_assert(hypre_ParCSRMatrixGlobalNumCols(A) == hypre_ParCSRMatrixGlobalNumCols(B)); hypre_assert(hypre_ParCSRMatrixNumRows(A) == hypre_ParCSRMatrixNumRows(B)); hypre_assert(hypre_ParCSRMatrixNumCols(A) == hypre_ParCSRMatrixNumCols(B)); #if defined(HYPRE_USING_GPU) if ( hypre_GetExecPolicy2( hypre_ParCSRMatrixMemoryLocation(A), hypre_ParCSRMatrixMemoryLocation(B) ) == HYPRE_EXEC_DEVICE ) { hypre_ParCSRMatrixAddDevice(alpha, A, beta, B, C_ptr); } else #endif { hypre_ParCSRMatrixAddHost(alpha, A, beta, B, C_ptr); } return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_ParCSRMatrixFnorm *--------------------------------------------------------------------------*/ HYPRE_Real hypre_ParCSRMatrixFnorm( hypre_ParCSRMatrix *A ) { MPI_Comm comm = hypre_ParCSRMatrixComm(A); HYPRE_Real f_diag, f_offd, local_result, result; f_diag = hypre_CSRMatrixFnorm(hypre_ParCSRMatrixDiag(A)); f_offd = hypre_CSRMatrixFnorm(hypre_ParCSRMatrixOffd(A)); local_result = f_diag * f_diag + f_offd * f_offd; hypre_MPI_Allreduce(&local_result, &result, 1, HYPRE_MPI_REAL, hypre_MPI_SUM, comm); return hypre_sqrt(result); } /*-------------------------------------------------------------------------- * hypre_ParCSRMatrixInfNorm * * Computes the infinity norm of A: * * norm = max_{i} sum_{j} |A_{ij}| *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ParCSRMatrixInfNorm( hypre_ParCSRMatrix *A, HYPRE_Real *norm ) { MPI_Comm comm = hypre_ParCSRMatrixComm(A); /* diag part of A */ hypre_CSRMatrix *A_diag = hypre_ParCSRMatrixDiag(A); HYPRE_Complex *A_diag_a = hypre_CSRMatrixData(A_diag); HYPRE_Int *A_diag_i = hypre_CSRMatrixI(A_diag); HYPRE_Int num_rows_diag_A = hypre_CSRMatrixNumRows(A_diag); /* off-diag part of A */ hypre_CSRMatrix *A_offd = hypre_ParCSRMatrixOffd(A); HYPRE_Complex *A_offd_a = hypre_CSRMatrixData(A_offd); HYPRE_Int *A_offd_i = hypre_CSRMatrixI(A_offd); /* Local variables */ HYPRE_Int i, j; HYPRE_Real maxsum = 0.0; HYPRE_Real rowsum; #ifdef _MSC_VER #ifdef HYPRE_USING_OPENMP #pragma omp parallel private(i,j,rowsum) #endif { HYPRE_Real maxsum_local; maxsum_local = 0.0; #ifdef HYPRE_USING_OPENMP #pragma omp for HYPRE_SMP_SCHEDULE #endif for (i = 0; i < num_rows_diag_A; i++) { rowsum = 0.0; for (j = A_diag_i[i]; j < A_diag_i[i + 1]; j++) { rowsum += hypre_cabs(A_diag_a[j]); } for (j = A_offd_i[i]; j < A_offd_i[i + 1]; j++) { rowsum += hypre_cabs(A_offd_a[j]); } maxsum_local = hypre_max(maxsum_local, rowsum); } #ifdef HYPRE_USING_OPENMP #pragma omp critical #endif { maxsum = hypre_max(maxsum, maxsum_local); } } #else #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i,j,rowsum) reduction(max:maxsum) HYPRE_SMP_SCHEDULE #endif for (i = 0; i < num_rows_diag_A; i++) { rowsum = 0.0; for (j = A_diag_i[i]; j < A_diag_i[i + 1]; j++) { rowsum += hypre_cabs(A_diag_a[j]); } for (j = A_offd_i[i]; j < A_offd_i[i + 1]; j++) { rowsum += hypre_cabs(A_offd_a[j]); } maxsum = hypre_max(maxsum, rowsum); } #endif hypre_MPI_Allreduce(&maxsum, norm, 1, HYPRE_MPI_REAL, hypre_MPI_MAX, comm); return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_ExchangeExternalRowsInit *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ExchangeExternalRowsInit( hypre_CSRMatrix *B_ext, hypre_ParCSRCommPkg *comm_pkg_A, void **request_ptr) { MPI_Comm comm = hypre_ParCSRCommPkgComm(comm_pkg_A); HYPRE_Int num_recvs = hypre_ParCSRCommPkgNumRecvs(comm_pkg_A); HYPRE_Int *recv_procs = hypre_ParCSRCommPkgRecvProcs(comm_pkg_A); HYPRE_Int *recv_vec_starts = hypre_ParCSRCommPkgRecvVecStarts(comm_pkg_A); HYPRE_Int num_sends = hypre_ParCSRCommPkgNumSends(comm_pkg_A); HYPRE_Int *send_procs = hypre_ParCSRCommPkgSendProcs(comm_pkg_A); HYPRE_Int *send_map_starts = hypre_ParCSRCommPkgSendMapStarts(comm_pkg_A); HYPRE_Int num_elmts_send = send_map_starts[num_sends]; HYPRE_Int num_elmts_recv = recv_vec_starts[num_recvs]; HYPRE_Int *B_ext_i = B_ext ? hypre_CSRMatrixI(B_ext) : NULL; HYPRE_BigInt *B_ext_j = B_ext ? hypre_CSRMatrixBigJ(B_ext) : NULL; HYPRE_Complex *B_ext_data = B_ext ? hypre_CSRMatrixData(B_ext) : NULL; HYPRE_Int B_ext_ncols = B_ext ? hypre_CSRMatrixNumCols(B_ext) : 0; HYPRE_Int B_ext_nrows = B_ext ? hypre_CSRMatrixNumRows(B_ext) : 0; HYPRE_Int *B_ext_rownnz = hypre_CTAlloc(HYPRE_Int, B_ext_nrows, HYPRE_MEMORY_HOST); hypre_assert(num_elmts_recv == B_ext_nrows); /* output matrix */ hypre_CSRMatrix *B_int; HYPRE_Int B_int_nrows = num_elmts_send; HYPRE_Int B_int_ncols = B_ext_ncols; HYPRE_Int *B_int_i = hypre_TAlloc(HYPRE_Int, B_int_nrows + 1, HYPRE_MEMORY_HOST); HYPRE_BigInt *B_int_j = NULL; HYPRE_Complex *B_int_data = NULL; HYPRE_Int B_int_nnz; hypre_ParCSRCommHandle *comm_handle, *comm_handle_j, *comm_handle_a; hypre_ParCSRCommPkg *comm_pkg_j = NULL; HYPRE_Int *jdata_recv_vec_starts; HYPRE_Int *jdata_send_map_starts; HYPRE_Int i; HYPRE_Int num_procs; void **vrequest; hypre_MPI_Comm_size(comm, &num_procs); jdata_send_map_starts = hypre_TAlloc(HYPRE_Int, num_sends + 1, HYPRE_MEMORY_HOST); /*-------------------------------------------------------------------------- * B_ext_rownnz contains the number of elements of row j * (to be determined through send_map_elmnts on the receiving end) *--------------------------------------------------------------------------*/ for (i = 0; i < B_ext_nrows; i++) { B_ext_rownnz[i] = B_ext_i[i + 1] - B_ext_i[i]; } /*-------------------------------------------------------------------------- * initialize communication: send/recv the row nnz * (note the use of comm_pkg_A, mode 12, as in transpose matvec *--------------------------------------------------------------------------*/ comm_handle = hypre_ParCSRCommHandleCreate(12, comm_pkg_A, B_ext_rownnz, B_int_i + 1); jdata_recv_vec_starts = hypre_TAlloc(HYPRE_Int, num_recvs + 1, HYPRE_MEMORY_HOST); jdata_recv_vec_starts[0] = 0; for (i = 1; i <= num_recvs; i++) { jdata_recv_vec_starts[i] = B_ext_i[recv_vec_starts[i]]; } /* Create communication package - note the order of send/recv is reversed */ hypre_ParCSRCommPkgCreateAndFill(comm, num_sends, send_procs, jdata_send_map_starts, num_recvs, recv_procs, jdata_recv_vec_starts, NULL, &comm_pkg_j); hypre_ParCSRCommHandleDestroy(comm_handle); /*-------------------------------------------------------------------------- * compute B_int: row nnz to row ptrs *--------------------------------------------------------------------------*/ B_int_i[0] = 0; for (i = 1; i <= B_int_nrows; i++) { B_int_i[i] += B_int_i[i - 1]; } B_int_nnz = B_int_i[B_int_nrows]; B_int_j = hypre_TAlloc(HYPRE_BigInt, B_int_nnz, HYPRE_MEMORY_HOST); B_int_data = hypre_TAlloc(HYPRE_Complex, B_int_nnz, HYPRE_MEMORY_HOST); for (i = 0; i <= num_sends; i++) { jdata_send_map_starts[i] = B_int_i[send_map_starts[i]]; } /* send/recv CSR rows */ comm_handle_a = hypre_ParCSRCommHandleCreate( 1, comm_pkg_j, B_ext_data, B_int_data); comm_handle_j = hypre_ParCSRCommHandleCreate(21, comm_pkg_j, B_ext_j, B_int_j); /* create CSR */ B_int = hypre_CSRMatrixCreate(B_int_nrows, B_int_ncols, B_int_nnz); hypre_CSRMatrixMemoryLocation(B_int) = HYPRE_MEMORY_HOST; hypre_CSRMatrixI(B_int) = B_int_i; hypre_CSRMatrixBigJ(B_int) = B_int_j; hypre_CSRMatrixData(B_int) = B_int_data; /* output */ vrequest = hypre_TAlloc(void *, 4, HYPRE_MEMORY_HOST); vrequest[0] = (void *) comm_handle_j; vrequest[1] = (void *) comm_handle_a; vrequest[2] = (void *) B_int; vrequest[3] = (void *) comm_pkg_j; *request_ptr = (void *) vrequest; hypre_TFree(B_ext_rownnz, HYPRE_MEMORY_HOST); return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_ExchangeExternalRowsWait *--------------------------------------------------------------------------*/ hypre_CSRMatrix* hypre_ExchangeExternalRowsWait(void *vrequest) { void **request = (void **) vrequest; hypre_ParCSRCommHandle *comm_handle_j = (hypre_ParCSRCommHandle *) request[0]; hypre_ParCSRCommHandle *comm_handle_a = (hypre_ParCSRCommHandle *) request[1]; hypre_CSRMatrix *B_int = (hypre_CSRMatrix *) request[2]; hypre_ParCSRCommPkg *comm_pkg_j = (hypre_ParCSRCommPkg *) request[3]; /* communication done */ hypre_ParCSRCommHandleDestroy(comm_handle_a); hypre_ParCSRCommHandleDestroy(comm_handle_j); hypre_TFree(hypre_ParCSRCommPkgSendMapStarts(comm_pkg_j), HYPRE_MEMORY_HOST); hypre_TFree(hypre_ParCSRCommPkgRecvVecStarts(comm_pkg_j), HYPRE_MEMORY_HOST); hypre_TFree(comm_pkg_j, HYPRE_MEMORY_HOST); hypre_TFree(request, HYPRE_MEMORY_HOST); return B_int; } /*-------------------------------------------------------------------------- * hypre_ParCSRMatrixExtractSubmatrixFC * * extract submatrix A_{FF}, A_{FC}, A_{CF} or A_{CC} * char job[2] = "FF", "FC", "CF" or "CC" * * TODO (VPM): Can we do the same with hypre_ParCSRMatrixGenerateFFFC? *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ParCSRMatrixExtractSubmatrixFC( hypre_ParCSRMatrix *A, HYPRE_Int *CF_marker, HYPRE_BigInt *cpts_starts, const char *job, hypre_ParCSRMatrix **B_ptr, HYPRE_Real strength_thresh) { MPI_Comm comm = hypre_ParCSRMatrixComm(A); hypre_ParCSRCommPkg *comm_pkg = hypre_ParCSRMatrixCommPkg(A); hypre_ParCSRCommHandle *comm_handle; /* diag part of A */ hypre_CSRMatrix *A_diag = hypre_ParCSRMatrixDiag(A); HYPRE_Complex *A_diag_a = hypre_CSRMatrixData(A_diag); HYPRE_Int *A_diag_i = hypre_CSRMatrixI(A_diag); HYPRE_Int *A_diag_j = hypre_CSRMatrixJ(A_diag); /* off-diag part of A */ hypre_CSRMatrix *A_offd = hypre_ParCSRMatrixOffd(A); HYPRE_Complex *A_offd_a = hypre_CSRMatrixData(A_offd); HYPRE_Int *A_offd_i = hypre_CSRMatrixI(A_offd); HYPRE_Int *A_offd_j = hypre_CSRMatrixJ(A_offd); HYPRE_Int num_cols_A_offd = hypre_CSRMatrixNumCols(A_offd); //HYPRE_Int *col_map_offd_A = hypre_ParCSRMatrixColMapOffd(A); hypre_ParCSRMatrix *B; hypre_CSRMatrix *B_diag, *B_offd; HYPRE_Real *B_maxel_row; HYPRE_Int *B_diag_i, *B_diag_j, *B_offd_i, *B_offd_j; HYPRE_Complex *B_diag_a, *B_offd_a; HYPRE_Int num_cols_B_offd; HYPRE_BigInt *col_map_offd_B; HYPRE_Int i, j, k, k1, k2; HYPRE_BigInt B_nrow_global, B_ncol_global; HYPRE_Int A_nlocal, B_nrow_local, B_ncol_local, B_nnz_diag, B_nnz_offd; HYPRE_BigInt total_global_fpts, total_global_cpts, fpts_starts[2]; HYPRE_Int nf_local, nc_local = 0; HYPRE_BigInt big_nf_local; HYPRE_Int row_set, col_set; HYPRE_BigInt *B_row_starts, *B_col_starts, B_first_col; HYPRE_Int my_id, num_procs; HYPRE_Int *sub_idx_diag; HYPRE_BigInt *sub_idx_offd; HYPRE_Int num_sends; HYPRE_BigInt *send_buf_data; /* MPI size and rank*/ hypre_MPI_Comm_size(comm, &num_procs); hypre_MPI_Comm_rank(comm, &my_id); row_set = job[0] == 'F' ? -1 : 1; col_set = job[1] == 'F' ? -1 : 1; A_nlocal = hypre_CSRMatrixNumRows(A_diag); /*-------------- global number of C points and local C points * assuming cpts_starts is given */ if (row_set == 1 || col_set == 1) { if (my_id == (num_procs - 1)) { total_global_cpts = cpts_starts[1]; } hypre_MPI_Bcast(&total_global_cpts, 1, HYPRE_MPI_BIG_INT, num_procs - 1, comm); nc_local = (HYPRE_Int)(cpts_starts[1] - cpts_starts[0]); } /*-------------- global number of F points, local F points, and F starts */ if (row_set == -1 || col_set == -1) { nf_local = 0; for (i = 0; i < A_nlocal; i++) { if (CF_marker[i] < 0) { nf_local++; } } big_nf_local = (HYPRE_BigInt) nf_local; hypre_MPI_Scan(&big_nf_local, fpts_starts + 1, 1, HYPRE_MPI_BIG_INT, hypre_MPI_SUM, comm); fpts_starts[0] = fpts_starts[1] - nf_local; if (my_id == num_procs - 1) { total_global_fpts = fpts_starts[1]; } hypre_MPI_Bcast(&total_global_fpts, 1, HYPRE_MPI_BIG_INT, num_procs - 1, comm); } if (row_set == -1 && col_set == -1) { /* FF */ B_nrow_local = nf_local; B_ncol_local = nf_local; B_nrow_global = total_global_fpts; B_ncol_global = total_global_fpts; B_row_starts = B_col_starts = fpts_starts; } else if (row_set == -1 && col_set == 1) { /* FC */ B_nrow_local = nf_local; B_ncol_local = nc_local; B_nrow_global = total_global_fpts; B_ncol_global = total_global_cpts; B_row_starts = fpts_starts; B_col_starts = cpts_starts; } else if (row_set == 1 && col_set == -1) { /* CF */ B_nrow_local = nc_local; B_ncol_local = nf_local; B_nrow_global = total_global_cpts; B_ncol_global = total_global_fpts; B_row_starts = cpts_starts; B_col_starts = fpts_starts; } else { /* CC */ B_nrow_local = nc_local; B_ncol_local = nc_local; B_nrow_global = total_global_cpts; B_ncol_global = total_global_cpts; B_row_starts = B_col_starts = cpts_starts; } /* global index of my first col */ B_first_col = B_col_starts[0]; /* sub_idx_diag: [local] mapping from F+C to F/C, if not selected, be -1 */ sub_idx_diag = hypre_TAlloc(HYPRE_Int, A_nlocal, HYPRE_MEMORY_HOST); for (i = 0, k = 0; i < A_nlocal; i++) { HYPRE_Int CF_i = CF_marker[i] > 0 ? 1 : -1; if (CF_i == col_set) { sub_idx_diag[i] = k++; } else { sub_idx_diag[i] = -1; } } hypre_assert(k == B_ncol_local); num_sends = hypre_ParCSRCommPkgNumSends(comm_pkg); send_buf_data = hypre_TAlloc(HYPRE_BigInt, hypre_ParCSRCommPkgSendMapStart(comm_pkg, num_sends), HYPRE_MEMORY_HOST); k = 0; for (i = 0; i < num_sends; i++) { /* start pos of elements sent to send_proc[i] */ HYPRE_Int si = hypre_ParCSRCommPkgSendMapStart(comm_pkg, i); HYPRE_Int ei = hypre_ParCSRCommPkgSendMapStart(comm_pkg, i + 1); /* loop through all elems to send_proc[i] */ for (j = si; j < ei; j++) { /* j1: local idx */ HYPRE_BigInt j1 = sub_idx_diag[hypre_ParCSRCommPkgSendMapElmt(comm_pkg, j)]; if (j1 != -1) { /* adjust j1 to B global idx */ j1 += B_first_col; } send_buf_data[k++] = j1; } } hypre_assert(k == hypre_ParCSRCommPkgSendMapStart(comm_pkg, num_sends)); /* recv buffer */ sub_idx_offd = hypre_TAlloc(HYPRE_BigInt, num_cols_A_offd, HYPRE_MEMORY_HOST); /* create a handle to start communication. 11: for integer */ comm_handle = hypre_ParCSRCommHandleCreate(21, comm_pkg, send_buf_data, sub_idx_offd); /* destroy the handle to finish communication */ hypre_ParCSRCommHandleDestroy(comm_handle); for (i = 0, num_cols_B_offd = 0; i < num_cols_A_offd; i++) { if (sub_idx_offd[i] != -1) { num_cols_B_offd ++; } } col_map_offd_B = hypre_TAlloc(HYPRE_BigInt, num_cols_B_offd, HYPRE_MEMORY_HOST); for (i = 0, k = 0; i < num_cols_A_offd; i++) { if (sub_idx_offd[i] != -1) { col_map_offd_B[k] = sub_idx_offd[i]; sub_idx_offd[i] = k++; } } hypre_assert(k == num_cols_B_offd); /* count nnz and set ia */ B_nnz_diag = B_nnz_offd = 0; B_maxel_row = hypre_TAlloc(HYPRE_Real, B_nrow_local, HYPRE_MEMORY_HOST); B_diag_i = hypre_TAlloc(HYPRE_Int, B_nrow_local + 1, HYPRE_MEMORY_HOST); B_offd_i = hypre_TAlloc(HYPRE_Int, B_nrow_local + 1, HYPRE_MEMORY_HOST); B_diag_i[0] = B_offd_i[0] = 0; for (i = 0, k = 0; i < A_nlocal; i++) { HYPRE_Int CF_i = CF_marker[i] > 0 ? 1 : -1; if (CF_i != row_set) { continue; } k++; // Get max abs-value element of this row HYPRE_Real temp_max = 0; if (strength_thresh > 0) { for (j = A_diag_i[i] + 1; j < A_diag_i[i + 1]; j++) { if (hypre_cabs(A_diag_a[j]) > temp_max) { temp_max = hypre_cabs(A_diag_a[j]); } } for (j = A_offd_i[i]; j < A_offd_i[i + 1]; j++) { if (hypre_cabs(A_offd_a[j]) > temp_max) { temp_max = hypre_cabs(A_offd_a[j]); } } } B_maxel_row[k - 1] = temp_max; // add one for diagonal element j = A_diag_i[i]; if (sub_idx_diag[A_diag_j[j]] != -1) { B_nnz_diag++; } // Count nnzs larger than tolerance times max row element for (j = A_diag_i[i] + 1; j < A_diag_i[i + 1]; j++) { if ( (sub_idx_diag[A_diag_j[j]] != -1) && (hypre_cabs(A_diag_a[j]) > (strength_thresh * temp_max)) ) { B_nnz_diag++; } } for (j = A_offd_i[i]; j < A_offd_i[i + 1]; j++) { if ( (sub_idx_offd[A_offd_j[j]] != -1) && (hypre_cabs(A_offd_a[j]) > (strength_thresh * temp_max)) ) { B_nnz_offd++; } } B_diag_i[k] = B_nnz_diag; B_offd_i[k] = B_nnz_offd; } hypre_assert(k == B_nrow_local); B_diag_j = hypre_TAlloc(HYPRE_Int, B_nnz_diag, HYPRE_MEMORY_HOST); B_diag_a = hypre_TAlloc(HYPRE_Complex, B_nnz_diag, HYPRE_MEMORY_HOST); B_offd_j = hypre_TAlloc(HYPRE_Int, B_nnz_offd, HYPRE_MEMORY_HOST); B_offd_a = hypre_TAlloc(HYPRE_Complex, B_nnz_offd, HYPRE_MEMORY_HOST); for (i = 0, k = 0, k1 = 0, k2 = 0; i < A_nlocal; i++) { HYPRE_Int CF_i = CF_marker[i] > 0 ? 1 : -1; if (CF_i != row_set) { continue; } HYPRE_Real maxel = B_maxel_row[k]; k++; for (j = A_diag_i[i]; j < A_diag_i[i + 1]; j++) { HYPRE_Int j1 = sub_idx_diag[A_diag_j[j]]; if ( (j1 != -1) && ( (hypre_cabs(A_diag_a[j]) > (strength_thresh * maxel)) || j == A_diag_i[i] ) ) { B_diag_j[k1] = j1; B_diag_a[k1] = A_diag_a[j]; k1++; } } for (j = A_offd_i[i]; j < A_offd_i[i + 1]; j++) { HYPRE_Int j1 = (HYPRE_Int) sub_idx_offd[A_offd_j[j]]; if ((j1 != -1) && (hypre_cabs(A_offd_a[j]) > (strength_thresh * maxel))) { hypre_assert(j1 >= 0 && j1 < num_cols_B_offd); B_offd_j[k2] = j1; B_offd_a[k2] = A_offd_a[j]; k2++; } } } hypre_assert(k1 == B_nnz_diag && k2 == B_nnz_offd); /* ready to create B = A(rowset, colset) */ B = hypre_ParCSRMatrixCreate(comm, B_nrow_global, B_ncol_global, B_row_starts, B_col_starts, num_cols_B_offd, B_nnz_diag, B_nnz_offd); B_diag = hypre_ParCSRMatrixDiag(B); hypre_CSRMatrixMemoryLocation(B_diag) = HYPRE_MEMORY_HOST; hypre_CSRMatrixData(B_diag) = B_diag_a; hypre_CSRMatrixI(B_diag) = B_diag_i; hypre_CSRMatrixJ(B_diag) = B_diag_j; B_offd = hypre_ParCSRMatrixOffd(B); hypre_CSRMatrixMemoryLocation(B_offd) = HYPRE_MEMORY_HOST; hypre_CSRMatrixData(B_offd) = B_offd_a; hypre_CSRMatrixI(B_offd) = B_offd_i; hypre_CSRMatrixJ(B_offd) = B_offd_j; hypre_ParCSRMatrixColMapOffd(B) = col_map_offd_B; hypre_ParCSRMatrixSetNumNonzeros(B); hypre_ParCSRMatrixDNumNonzeros(B) = (HYPRE_Real) hypre_ParCSRMatrixNumNonzeros(B); hypre_MatvecCommPkgCreate(B); *B_ptr = B; hypre_TFree(B_maxel_row, HYPRE_MEMORY_HOST); hypre_TFree(send_buf_data, HYPRE_MEMORY_HOST); hypre_TFree(sub_idx_diag, HYPRE_MEMORY_HOST); hypre_TFree(sub_idx_offd, HYPRE_MEMORY_HOST); return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_ParCSRMatrixDropSmallEntriesHost * * drop the entries that are not on the diagonal and smaller than: * type 0: tol (TODO) * type 1: tol*(1-norm of row) * type 2: tol*(2-norm of row) * type -1: tol*(infinity norm of row) *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ParCSRMatrixDropSmallEntriesHost( hypre_ParCSRMatrix *A, HYPRE_Real tol, HYPRE_Int type) { HYPRE_Int i, j, k, nnz_diag, nnz_offd, A_diag_i_i, A_offd_i_i; MPI_Comm comm = hypre_ParCSRMatrixComm(A); /* diag part of A */ hypre_CSRMatrix *A_diag = hypre_ParCSRMatrixDiag(A); HYPRE_Real *A_diag_a = hypre_CSRMatrixData(A_diag); HYPRE_Int *A_diag_i = hypre_CSRMatrixI(A_diag); HYPRE_Int *A_diag_j = hypre_CSRMatrixJ(A_diag); /* off-diag part of A */ hypre_CSRMatrix *A_offd = hypre_ParCSRMatrixOffd(A); HYPRE_Real *A_offd_a = hypre_CSRMatrixData(A_offd); HYPRE_Int *A_offd_i = hypre_CSRMatrixI(A_offd); HYPRE_Int *A_offd_j = hypre_CSRMatrixJ(A_offd); HYPRE_Int num_cols_A_offd = hypre_CSRMatrixNumCols(A_offd); HYPRE_BigInt *col_map_offd_A = hypre_ParCSRMatrixColMapOffd(A); HYPRE_Int *marker_offd = NULL; HYPRE_BigInt first_row = hypre_ParCSRMatrixFirstRowIndex(A); HYPRE_Int nrow_local = hypre_CSRMatrixNumRows(A_diag); HYPRE_Int my_id, num_procs; /* MPI size and rank*/ hypre_MPI_Comm_size(comm, &num_procs); hypre_MPI_Comm_rank(comm, &my_id); marker_offd = hypre_CTAlloc(HYPRE_Int, num_cols_A_offd, HYPRE_MEMORY_HOST); nnz_diag = nnz_offd = A_diag_i_i = A_offd_i_i = 0; for (i = 0; i < nrow_local; i++) { /* compute row norm */ HYPRE_Real row_nrm = 0.0; for (j = A_diag_i_i; j < A_diag_i[i + 1]; j++) { HYPRE_Complex v = A_diag_a[j]; if (type == 1) { row_nrm += hypre_cabs(v); } else if (type == 2) { row_nrm += v * v; } else { row_nrm = hypre_max(row_nrm, hypre_cabs(v)); } } if (num_procs > 1) { for (j = A_offd_i_i; j < A_offd_i[i + 1]; j++) { HYPRE_Complex v = A_offd_a[j]; if (type == 1) { row_nrm += hypre_cabs(v); } else if (type == 2) { row_nrm += v * v; } else { row_nrm = hypre_max(row_nrm, hypre_cabs(v)); } } } if (type == 2) { row_nrm = hypre_sqrt(row_nrm); } /* drop small entries based on tol and row norm */ for (j = A_diag_i_i; j < A_diag_i[i + 1]; j++) { HYPRE_Int col = A_diag_j[j]; HYPRE_Complex val = A_diag_a[j]; if (i == col || hypre_cabs(val) >= tol * row_nrm) { A_diag_j[nnz_diag] = col; A_diag_a[nnz_diag] = val; nnz_diag ++; } } if (num_procs > 1) { for (j = A_offd_i_i; j < A_offd_i[i + 1]; j++) { HYPRE_Int col = A_offd_j[j]; HYPRE_Complex val = A_offd_a[j]; /* in normal cases: diagonal entry should not * appear in A_offd (but this can still be possible) */ if (i + first_row == col_map_offd_A[col] || hypre_cabs(val) >= tol * row_nrm) { if (0 == marker_offd[col]) { marker_offd[col] = 1; } A_offd_j[nnz_offd] = col; A_offd_a[nnz_offd] = val; nnz_offd ++; } } } A_diag_i_i = A_diag_i[i + 1]; A_offd_i_i = A_offd_i[i + 1]; A_diag_i[i + 1] = nnz_diag; A_offd_i[i + 1] = nnz_offd; } hypre_CSRMatrixNumNonzeros(A_diag) = nnz_diag; hypre_CSRMatrixNumNonzeros(A_offd) = nnz_offd; hypre_ParCSRMatrixSetNumNonzeros(A); hypre_ParCSRMatrixDNumNonzeros(A) = (HYPRE_Real) hypre_ParCSRMatrixNumNonzeros(A); for (i = 0, k = 0; i < num_cols_A_offd; i++) { if (marker_offd[i]) { col_map_offd_A[k] = col_map_offd_A[i]; marker_offd[i] = k++; } } /* num_cols_A_offd = k; */ hypre_CSRMatrixNumCols(A_offd) = k; for (i = 0; i < nnz_offd; i++) { A_offd_j[i] = marker_offd[A_offd_j[i]]; } if ( hypre_ParCSRMatrixCommPkg(A) ) { hypre_MatvecCommPkgDestroy( hypre_ParCSRMatrixCommPkg(A) ); } hypre_MatvecCommPkgCreate(A); hypre_TFree(marker_offd, HYPRE_MEMORY_HOST); return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_ParCSRMatrixDropSmallEntries * * drop the entries that are not on the diagonal and smaller than * type 0: tol * type 1: tol*(1-norm of row) * type 2: tol*(2-norm of row) * type -1: tol*(infinity norm of row) * NOTE: some type options above unavailable on either host or device *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ParCSRMatrixDropSmallEntries( hypre_ParCSRMatrix *A, HYPRE_Real tol, HYPRE_Int type) { if (tol <= 0.0) { return hypre_error_flag; } #if defined(HYPRE_USING_GPU) HYPRE_ExecutionPolicy exec = hypre_GetExecPolicy1( hypre_ParCSRMatrixMemoryLocation(A) ); if (exec == HYPRE_EXEC_DEVICE) { hypre_ParCSRMatrixDropSmallEntriesDevice(A, tol, type); } else #endif { hypre_ParCSRMatrixDropSmallEntriesHost(A, tol, type); } return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_ParCSRMatrixScale * * Computes A = scalar * A *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ParCSRMatrixScale(hypre_ParCSRMatrix *A, HYPRE_Complex scalar) { hypre_CSRMatrix *A_diag = hypre_ParCSRMatrixDiag(A); hypre_CSRMatrix *A_offd = hypre_ParCSRMatrixOffd(A); hypre_CSRMatrixScale(A_diag, scalar); hypre_CSRMatrixScale(A_offd, scalar); return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_ParCSRMatrixDiagScaleHost *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ParCSRMatrixDiagScaleHost( hypre_ParCSRMatrix *par_A, hypre_ParVector *par_ld, hypre_ParVector *par_rd ) { /* Input variables */ hypre_ParCSRCommPkg *comm_pkg = hypre_ParCSRMatrixCommPkg(par_A); HYPRE_Int num_sends; HYPRE_Int *send_map_elmts; HYPRE_Int *send_map_starts; hypre_CSRMatrix *A_diag = hypre_ParCSRMatrixDiag(par_A); hypre_CSRMatrix *A_offd = hypre_ParCSRMatrixOffd(par_A); HYPRE_Int num_cols_offd = hypre_CSRMatrixNumCols(A_offd); hypre_Vector *ld = (par_ld) ? hypre_ParVectorLocalVector(par_ld) : NULL; hypre_Vector *rd = hypre_ParVectorLocalVector(par_rd); HYPRE_Complex *rd_data = hypre_VectorData(rd); /* Local variables */ HYPRE_Int i; hypre_Vector *rdbuf; HYPRE_Complex *recv_rdbuf_data; HYPRE_Complex *send_rdbuf_data; /*--------------------------------------------------------------------- * Communication phase *--------------------------------------------------------------------*/ /* Create buffer vectors */ rdbuf = hypre_SeqVectorCreate(num_cols_offd); /* If there exists no CommPkg for A, create it. */ if (!comm_pkg) { hypre_MatvecCommPkgCreate(par_A); comm_pkg = hypre_ParCSRMatrixCommPkg(par_A); } num_sends = hypre_ParCSRCommPkgNumSends(comm_pkg); send_map_elmts = hypre_ParCSRCommPkgSendMapElmts(comm_pkg); send_map_starts = hypre_ParCSRCommPkgSendMapStarts(comm_pkg); #if defined(HYPRE_USING_PERSISTENT_COMM) hypre_ParCSRPersistentCommHandle *comm_handle = hypre_ParCSRCommPkgGetPersistentCommHandle(1, comm_pkg); hypre_VectorData(rdbuf) = (HYPRE_Complex *) hypre_ParCSRCommHandleRecvDataBuffer(comm_handle); hypre_SeqVectorSetDataOwner(rdbuf, 0); #else hypre_ParCSRCommHandle *comm_handle; #endif /* Initialize rdbuf */ hypre_SeqVectorInitialize_v2(rdbuf, HYPRE_MEMORY_HOST); recv_rdbuf_data = hypre_VectorData(rdbuf); /* Allocate send buffer for rdbuf */ #if defined(HYPRE_USING_PERSISTENT_COMM) send_rdbuf_data = (HYPRE_Complex *) hypre_ParCSRCommHandleSendDataBuffer(comm_handle); #else send_rdbuf_data = hypre_TAlloc(HYPRE_Complex, send_map_starts[num_sends], HYPRE_MEMORY_HOST); #endif /* Pack send data */ #if defined(HYPRE_USING_OPENMP) #pragma omp parallel for private(i) HYPRE_SMP_SCHEDULE #endif for (i = send_map_starts[0]; i < send_map_starts[num_sends]; i++) { send_rdbuf_data[i] = rd_data[send_map_elmts[i]]; } /* Non-blocking communication starts */ #ifdef HYPRE_USING_PERSISTENT_COMM hypre_ParCSRPersistentCommHandleStart(comm_handle, HYPRE_MEMORY_HOST, send_rdbuf_data); #else comm_handle = hypre_ParCSRCommHandleCreate_v2(1, comm_pkg, HYPRE_MEMORY_HOST, send_rdbuf_data, HYPRE_MEMORY_HOST, recv_rdbuf_data); #endif /*--------------------------------------------------------------------- * Computation phase *--------------------------------------------------------------------*/ /* A_diag = diag(ld) * A_diag * diag(rd) */ hypre_CSRMatrixDiagScale(A_diag, ld, rd); /* Non-blocking communication ends */ #ifdef HYPRE_USING_PERSISTENT_COMM hypre_ParCSRPersistentCommHandleWait(comm_handle, HYPRE_MEMORY_HOST, recv_rdbuf_data); #else hypre_ParCSRCommHandleDestroy(comm_handle); #endif /* A_offd = diag(ld) * A_offd * diag(rd) */ hypre_CSRMatrixDiagScale(A_offd, ld, rdbuf); /* Free memory */ hypre_SeqVectorDestroy(rdbuf); #if !defined(HYPRE_USING_PERSISTENT_COMM) hypre_TFree(send_rdbuf_data, HYPRE_MEMORY_HOST); #endif return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_ParCSRMatrixDiagScale * * Computes A = diag(ld) * A * diag(rd), where the diagonal matrices * "diag(ld)" and "diag(rd)" are stored as distributed vectors. *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ParCSRMatrixDiagScale( hypre_ParCSRMatrix *par_A, hypre_ParVector *par_ld, hypre_ParVector *par_rd ) { /* Input variables */ hypre_CSRMatrix *A_diag = hypre_ParCSRMatrixDiag(par_A); hypre_CSRMatrix *A_offd = hypre_ParCSRMatrixOffd(par_A); hypre_Vector *ld; /* Sanity check */ if (!par_rd && !par_ld) { hypre_error_w_msg(HYPRE_ERROR_GENERIC, "Scaling matrices are not set!\n"); return hypre_error_flag; } /* Perform row scaling only (no communication) */ if (!par_rd && par_ld) { ld = hypre_ParVectorLocalVector(par_ld); hypre_CSRMatrixDiagScale(A_diag, ld, NULL); hypre_CSRMatrixDiagScale(A_offd, ld, NULL); return hypre_error_flag; } #if defined(HYPRE_USING_GPU) HYPRE_ExecutionPolicy exec = hypre_GetExecPolicy1( hypre_ParCSRMatrixMemoryLocation(par_A) ); if (exec == HYPRE_EXEC_DEVICE) { hypre_ParCSRMatrixDiagScaleDevice(par_A, par_ld, par_rd); } else #endif { hypre_ParCSRMatrixDiagScaleHost(par_A, par_ld, par_rd); } return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_ParCSRMatrixReorder: * * Reorders the column and data arrays of a the diagonal component of a square * ParCSR matrix, such that the first entry in each row is the diagonal one. *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ParCSRMatrixReorder(hypre_ParCSRMatrix *A) { HYPRE_BigInt nrows_A = hypre_ParCSRMatrixGlobalNumRows(A); HYPRE_BigInt ncols_A = hypre_ParCSRMatrixGlobalNumCols(A); hypre_CSRMatrix *A_diag = hypre_ParCSRMatrixDiag(A); if (nrows_A != ncols_A) { hypre_error_w_msg(HYPRE_ERROR_GENERIC, " Error! Matrix should be square!\n"); return hypre_error_flag; } hypre_CSRMatrixReorder(A_diag); return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_ParCSRMatrixCompressOffdMap *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ParCSRMatrixCompressOffdMap(hypre_ParCSRMatrix *A) { #if defined(HYPRE_USING_GPU) HYPRE_ExecutionPolicy exec = hypre_GetExecPolicy1( hypre_ParCSRMatrixMemoryLocation(A) ); if (exec == HYPRE_EXEC_DEVICE) { hypre_ParCSRMatrixCompressOffdMapDevice(A); } #else // RL: I guess it's not needed for the host code [?] HYPRE_UNUSED_VAR(A); #endif return hypre_error_flag; } /*-------------------------------------------------------------------------- * HYPRE_ParCSRDiagScaleVectorHost *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ParCSRDiagScaleVectorHost( hypre_ParCSRMatrix *par_A, hypre_ParVector *par_y, hypre_ParVector *par_x ) { /* Local Matrix and Vectors */ hypre_CSRMatrix *A_diag = hypre_ParCSRMatrixDiag(par_A); hypre_Vector *x = hypre_ParVectorLocalVector(par_x); hypre_Vector *y = hypre_ParVectorLocalVector(par_y); /* Local vector x info */ HYPRE_Complex *x_data = hypre_VectorData(x); HYPRE_Int x_num_vectors = hypre_VectorNumVectors(x); HYPRE_Int x_vecstride = hypre_VectorVectorStride(x); /* Local vector y info */ HYPRE_Complex *y_data = hypre_VectorData(y); HYPRE_Int y_vecstride = hypre_VectorVectorStride(y); /* Local matrix A info */ HYPRE_Complex *A_data = hypre_CSRMatrixData(A_diag); HYPRE_Int *A_i = hypre_CSRMatrixI(A_diag); HYPRE_Int num_rows = hypre_CSRMatrixNumRows(A_diag); /* Local variables */ HYPRE_Int i, k; HYPRE_Complex coef; switch (x_num_vectors) { case 1: #if defined(HYPRE_USING_OPENMP) #pragma omp parallel for private(i) HYPRE_SMP_SCHEDULE #endif for (i = 0; i < num_rows; i++) { x_data[i] = y_data[i] / A_data[A_i[i]]; } break; case 2: #if defined(HYPRE_USING_OPENMP) #pragma omp parallel for private(i, coef) HYPRE_SMP_SCHEDULE #endif for (i = 0; i < num_rows; i++) { coef = 1.0 / A_data[A_i[i]]; x_data[i] = y_data[i] * coef; x_data[i + x_vecstride] = y_data[i + y_vecstride] * coef; } break; case 3: #if defined(HYPRE_USING_OPENMP) #pragma omp parallel for private(i, coef) HYPRE_SMP_SCHEDULE #endif for (i = 0; i < num_rows; i++) { coef = 1.0 / A_data[A_i[i]]; x_data[i] = y_data[i] * coef; x_data[i + x_vecstride] = y_data[i + y_vecstride] * coef; x_data[i + 2 * x_vecstride] = y_data[i + 2 * y_vecstride] * coef; } break; case 4: #if defined(HYPRE_USING_OPENMP) #pragma omp parallel for private(i, coef) HYPRE_SMP_SCHEDULE #endif for (i = 0; i < num_rows; i++) { coef = 1.0 / A_data[A_i[i]]; x_data[i] = y_data[i] * coef; x_data[i + x_vecstride] = y_data[i + y_vecstride] * coef; x_data[i + 2 * x_vecstride] = y_data[i + 2 * y_vecstride] * coef; x_data[i + 3 * x_vecstride] = y_data[i + 3 * y_vecstride] * coef; } break; default: #if defined(HYPRE_USING_OPENMP) #pragma omp parallel for private(i, k, coef) HYPRE_SMP_SCHEDULE #endif for (i = 0; i < num_rows; i++) { coef = 1.0 / A_data[A_i[i]]; for (k = 0; k < x_num_vectors; k++) { x_data[i + k * x_vecstride] = y_data[i + k * y_vecstride] * coef; } } break; } return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_ParCSRDiagScaleVector *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ParCSRDiagScaleVector( hypre_ParCSRMatrix *par_A, hypre_ParVector *par_y, hypre_ParVector *par_x ) { /* Local Matrix and Vectors */ hypre_CSRMatrix *A_diag = hypre_ParCSRMatrixDiag(par_A); hypre_Vector *x = hypre_ParVectorLocalVector(par_x); hypre_Vector *y = hypre_ParVectorLocalVector(par_y); /* Local vector x info */ HYPRE_Int x_size = hypre_VectorSize(x); HYPRE_Int x_num_vectors = hypre_VectorNumVectors(x); HYPRE_Int x_vecstride = hypre_VectorVectorStride(x); /* Local vector y info */ HYPRE_Int y_size = hypre_VectorSize(y); HYPRE_Int y_num_vectors = hypre_VectorNumVectors(y); HYPRE_Int y_vecstride = hypre_VectorVectorStride(y); /* Local matrix A info */ HYPRE_Int num_rows = hypre_CSRMatrixNumRows(A_diag); /*--------------------------------------------- * Sanity checks *---------------------------------------------*/ if (x_num_vectors != y_num_vectors) { hypre_error_w_msg(HYPRE_ERROR_GENERIC, "Error! incompatible number of vectors!\n"); return hypre_error_flag; } if (num_rows != x_size) { hypre_error_w_msg(HYPRE_ERROR_GENERIC, "Error! incompatible x size!\n"); return hypre_error_flag; } if (x_size > 0 && x_vecstride <= 0) { hypre_error_w_msg(HYPRE_ERROR_GENERIC, "Error! non-positive x vector stride!\n"); return hypre_error_flag; } if (y_size > 0 && y_vecstride <= 0) { hypre_error_w_msg(HYPRE_ERROR_GENERIC, "Error! non-positive y vector stride!\n"); return hypre_error_flag; } if (num_rows != y_size) { hypre_error_w_msg(HYPRE_ERROR_GENERIC, "Error! incompatible y size!\n"); return hypre_error_flag; } /*--------------------------------------------- * Computation *---------------------------------------------*/ #if defined(HYPRE_USING_GPU) HYPRE_ExecutionPolicy exec = hypre_GetExecPolicy1( hypre_ParCSRMatrixMemoryLocation(par_A) ); if (exec == HYPRE_EXEC_DEVICE) { hypre_ParCSRDiagScaleVectorDevice(par_A, par_y, par_x); } else #endif { hypre_ParCSRDiagScaleVectorHost(par_A, par_y, par_x); } return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_ParCSRMatrixBlockColSumHost *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ParCSRMatrixBlockColSumHost( hypre_ParCSRMatrix *A, hypre_DenseBlockMatrix *B ) { /* ParCSRMatrix A */ HYPRE_MemoryLocation memory_location = hypre_ParCSRMatrixMemoryLocation(A); /* A_diag */ hypre_CSRMatrix *A_diag = hypre_ParCSRMatrixDiag(A); HYPRE_Complex *A_diag_data = hypre_CSRMatrixData(A_diag); HYPRE_Int *A_diag_i = hypre_CSRMatrixI(A_diag); HYPRE_Int *A_diag_j = hypre_CSRMatrixJ(A_diag); HYPRE_Int num_rows_diag_A = hypre_CSRMatrixNumRows(A_diag); /* A_offd */ hypre_CSRMatrix *A_offd = hypre_ParCSRMatrixOffd(A); HYPRE_Complex *A_offd_data = hypre_CSRMatrixData(A_offd); HYPRE_Int *A_offd_i = hypre_CSRMatrixI(A_offd); HYPRE_Int *A_offd_j = hypre_CSRMatrixJ(A_offd); HYPRE_Int num_rows_offd_A = hypre_CSRMatrixNumRows(A_offd); HYPRE_Int num_cols_offd_A = hypre_CSRMatrixNumCols(A_offd); /* Output vector variables */ HYPRE_Int num_rows_block_B = hypre_DenseBlockMatrixNumRowsBlock(B); HYPRE_Int num_cols_block_B = hypre_DenseBlockMatrixNumColsBlock(B); /* Local variables */ HYPRE_Int i, j, col; HYPRE_Int ib, ir, jr; HYPRE_Complex *recv_data; HYPRE_Complex *send_data; /* Communication variables */ hypre_ParCSRCommPkg *comm_pkg = hypre_ParCSRMatrixCommPkg(A); HYPRE_Int num_sends = hypre_ParCSRCommPkgNumSends(comm_pkg); HYPRE_Int *send_map_elmts; HYPRE_Int *send_map_starts; #if defined(HYPRE_USING_PERSISTENT_COMM) hypre_ParCSRPersistentCommHandle *comm_handle; #else hypre_ParCSRCommHandle *comm_handle; #endif /* Update commpkg offsets */ hypre_ParCSRCommPkgUpdateVecStarts(comm_pkg, 1, 0, 1); send_map_elmts = hypre_ParCSRCommPkgSendMapElmts(comm_pkg); send_map_starts = hypre_ParCSRCommPkgSendMapStarts(comm_pkg); /* Allocate the recv and send buffers */ #if defined(HYPRE_USING_PERSISTENT_COMM) comm_handle = hypre_ParCSRCommPkgGetPersistentCommHandle(HYPRE_COMM_PKG_JOB_COMPLEX, comm_pkg); recv_data = (HYPRE_Complex *) hypre_ParCSRCommHandleRecvDataBuffer(comm_handle); send_data = (HYPRE_Complex *) hypre_ParCSRCommHandleSendDataBuffer(comm_handle); send_data = hypre_Memset((void *) send_data, 0, (size_t) (num_cols_offd_A) * sizeof(HYPRE_Complex), memory_location); #else send_data = hypre_CTAlloc(HYPRE_Complex, num_cols_offd_A, memory_location); recv_data = hypre_TAlloc(HYPRE_Complex, send_map_starts[num_sends], memory_location); #endif /* Pack send data */ if (A_offd_i[num_rows_offd_A] - A_offd_i[0] > 0) { for (i = 0; i < num_rows_offd_A; i++) { for (j = A_offd_i[i]; j < A_offd_i[i + 1]; j++) { col = A_offd_j[j]; send_data[col] += A_offd_data[j]; } } } /* Non-blocking communication starts */ #if defined(HYPRE_USING_PERSISTENT_COMM) hypre_ParCSRPersistentCommHandleStart(comm_handle, memory_location, send_data); #else comm_handle = hypre_ParCSRCommHandleCreate_v2(2, comm_pkg, memory_location, send_data, memory_location, recv_data); #endif /* Overlapped local computation. */ for (i = 0; i < num_rows_diag_A; i++) { ir = i % num_rows_block_B; for (j = A_diag_i[i]; j < A_diag_i[i + 1]; j++) { col = A_diag_j[j]; ib = col / num_cols_block_B; jr = col % num_cols_block_B; hypre_assert(hypre_DenseBlockMatrixNumNonzerosBlock(B) * ib + hypre_DenseBlockMatrixRowStride(B) * ir + hypre_DenseBlockMatrixColStride(B) * jr < hypre_DenseBlockMatrixNumNonzeros(B)); hypre_DenseBlockMatrixDataBIJ(B, ib, ir, jr) += A_diag_data[j]; } } /* Non-blocking communication ends */ #if defined(HYPRE_USING_PERSISTENT_COMM) hypre_ParCSRPersistentCommHandleWait(comm_handle, memory_location, recv_data); #else hypre_ParCSRCommHandleDestroy(comm_handle); #endif /* Unpack recv data */ for (i = send_map_starts[0]; i < send_map_starts[num_sends]; i++) { col = send_map_elmts[i]; ib = col / num_cols_block_B; ir = col % num_rows_block_B; jr = col % num_cols_block_B; hypre_assert(hypre_DenseBlockMatrixNumNonzerosBlock(B) * ib + hypre_DenseBlockMatrixRowStride(B) * ir + hypre_DenseBlockMatrixColStride(B) * jr < hypre_DenseBlockMatrixNumNonzeros(B)); hypre_DenseBlockMatrixDataBIJ(B, ib, ir, jr) += recv_data[i]; } /* Free memory */ #if !defined(HYPRE_USING_PERSISTENT_COMM) hypre_TFree(send_data, memory_location); hypre_TFree(recv_data, memory_location); #endif return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_ParCSRMatrixBlockColSum *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ParCSRMatrixBlockColSum( hypre_ParCSRMatrix *A, HYPRE_Int row_major, HYPRE_Int num_rows_block, HYPRE_Int num_cols_block, hypre_DenseBlockMatrix **B_ptr ) { HYPRE_MemoryLocation memory_location = hypre_ParCSRMatrixMemoryLocation(A); HYPRE_BigInt num_rows_A = hypre_ParCSRMatrixGlobalNumRows(A); HYPRE_BigInt num_cols_A = hypre_ParCSRMatrixGlobalNumCols(A); hypre_CSRMatrix *A_diag = hypre_ParCSRMatrixDiag(A); HYPRE_Int num_rows_diag_A = hypre_CSRMatrixNumRows(A_diag); HYPRE_Int num_cols_diag_A = hypre_CSRMatrixNumCols(A_diag); hypre_DenseBlockMatrix *B; /*--------------------------------------------- * Sanity checks *---------------------------------------------*/ if (num_rows_block < 1 || num_cols_block < 1) { *B_ptr = NULL; return hypre_error_flag; } if (num_rows_A % ((HYPRE_BigInt) num_rows_block)) { hypre_error_w_msg(HYPRE_ERROR_GENERIC, "Global number of rows is not divisable by the block dimension"); return hypre_error_flag; } if (num_cols_A % ((HYPRE_BigInt) num_cols_block)) { hypre_error_w_msg(HYPRE_ERROR_GENERIC, "Global number of columns is not divisable by the block dimension"); return hypre_error_flag; } HYPRE_ANNOTATE_FUNC_BEGIN; if (!hypre_ParCSRMatrixCommPkg(A)) { hypre_MatvecCommPkgCreate(A); } /*--------------------------------------------- * Compute block column sum matrix *---------------------------------------------*/ /* Create output matrix */ B = hypre_DenseBlockMatrixCreate(row_major, num_rows_diag_A, num_cols_diag_A, num_rows_block, num_cols_block); /* Initialize the output matrix */ hypre_DenseBlockMatrixInitializeOn(B, memory_location); #if defined(HYPRE_USING_GPU) HYPRE_ExecutionPolicy exec = hypre_GetExecPolicy1(memory_location); if (exec == HYPRE_EXEC_DEVICE) { /* TODO (VPM): hypre_ParCSRMatrixColSumReduceDevice */ hypre_ParCSRMatrixMigrate(A, HYPRE_MEMORY_HOST); hypre_ParCSRMatrixBlockColSumHost(A, B); hypre_ParCSRMatrixMigrate(A, HYPRE_MEMORY_DEVICE); hypre_DenseBlockMatrixMigrate(B, HYPRE_MEMORY_DEVICE); } else #endif { hypre_ParCSRMatrixBlockColSumHost(A, B); } /* Set output pointer */ *B_ptr = B; HYPRE_ANNOTATE_FUNC_END; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_ParCSRMatrixColSumHost *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ParCSRMatrixColSumHost( hypre_ParCSRMatrix *A, hypre_ParVector *b ) { /* ParCSRMatrix A */ HYPRE_MemoryLocation memory_location = hypre_ParCSRMatrixMemoryLocation(A); /* A_diag */ hypre_CSRMatrix *A_diag = hypre_ParCSRMatrixDiag(A); HYPRE_Complex *A_diag_data = hypre_CSRMatrixData(A_diag); HYPRE_Int *A_diag_i = hypre_CSRMatrixI(A_diag); HYPRE_Int *A_diag_j = hypre_CSRMatrixJ(A_diag); HYPRE_Int num_rows_diag_A = hypre_CSRMatrixNumRows(A_diag); /* A_offd */ hypre_CSRMatrix *A_offd = hypre_ParCSRMatrixOffd(A); HYPRE_Complex *A_offd_data = hypre_CSRMatrixData(A_offd); HYPRE_Int *A_offd_i = hypre_CSRMatrixI(A_offd); HYPRE_Int *A_offd_j = hypre_CSRMatrixJ(A_offd); HYPRE_Int num_rows_offd_A = hypre_CSRMatrixNumRows(A_offd); HYPRE_Int num_cols_offd_A = hypre_CSRMatrixNumCols(A_offd); /* Local variables */ HYPRE_Int i, j, col; HYPRE_Complex *recv_data; HYPRE_Complex *send_data; /* Communication variables */ hypre_ParCSRCommPkg *comm_pkg = hypre_ParCSRMatrixCommPkg(A); HYPRE_Int num_sends = hypre_ParCSRCommPkgNumSends(comm_pkg); HYPRE_Int *send_map_elmts; HYPRE_Int *send_map_starts; #if defined(HYPRE_USING_PERSISTENT_COMM) hypre_ParCSRPersistentCommHandle *comm_handle; #else hypre_ParCSRCommHandle *comm_handle; #endif /* Update commpkg offsets */ hypre_ParCSRCommPkgUpdateVecStarts(comm_pkg, 1, 0, 1); send_map_elmts = hypre_ParCSRCommPkgSendMapElmts(comm_pkg); send_map_starts = hypre_ParCSRCommPkgSendMapStarts(comm_pkg); /* Allocate the recv and send buffers */ #if defined(HYPRE_USING_PERSISTENT_COMM) comm_handle = hypre_ParCSRCommPkgGetPersistentCommHandle(HYPRE_COMM_PKG_JOB_COMPLEX, comm_pkg); recv_data = (HYPRE_Complex *) hypre_ParCSRCommHandleRecvDataBuffer(comm_handle); send_data = (HYPRE_Complex *) hypre_ParCSRCommHandleSendDataBuffer(comm_handle); send_data = hypre_Memset((void *) send_data, 0, (size_t) (num_cols_offd_A) * sizeof(HYPRE_Complex), memory_location); #else send_data = hypre_CTAlloc(HYPRE_Complex, num_cols_offd_A, memory_location); recv_data = hypre_TAlloc(HYPRE_Complex, send_map_starts[num_sends], memory_location); #endif /* Pack send data */ for (i = 0; i < num_rows_offd_A; i++) { for (j = A_offd_i[i]; j < A_offd_i[i + 1]; j++) { col = A_offd_j[j]; send_data[col] += A_offd_data[j]; } } /* Non-blocking communication starts */ #if defined(HYPRE_USING_PERSISTENT_COMM) hypre_ParCSRPersistentCommHandleStart(comm_handle, memory_location, send_data); #else comm_handle = hypre_ParCSRCommHandleCreate_v2(2, comm_pkg, memory_location, send_data, memory_location, recv_data); #endif /* Overlapped local computation. */ for (i = 0; i < num_rows_diag_A; i++) { for (j = A_diag_i[i]; j < A_diag_i[i + 1]; j++) { col = A_diag_j[j]; hypre_ParVectorEntryI(b, col) += A_diag_data[j]; } } /* Non-blocking communication ends */ #if defined(HYPRE_USING_PERSISTENT_COMM) hypre_ParCSRPersistentCommHandleWait(comm_handle, memory_location, recv_data); #else hypre_ParCSRCommHandleDestroy(comm_handle); #endif /* Unpack recv data */ for (i = send_map_starts[0]; i < send_map_starts[num_sends]; i++) { col = send_map_elmts[i]; hypre_ParVectorEntryI(b, col) += recv_data[i]; } /* Free memory */ #if !defined(HYPRE_USING_PERSISTENT_COMM) hypre_TFree(send_data, memory_location); hypre_TFree(recv_data, memory_location); #endif return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_ParCSRMatrixColSum *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ParCSRMatrixColSum( hypre_ParCSRMatrix *A, hypre_ParVector **b_ptr ) { MPI_Comm comm = hypre_ParCSRMatrixComm(A); HYPRE_BigInt global_num_cols = hypre_ParCSRMatrixGlobalNumCols(A); HYPRE_BigInt *col_starts = hypre_ParCSRMatrixColStarts(A); HYPRE_MemoryLocation memory_location = hypre_ParCSRMatrixMemoryLocation(A); hypre_ParVector *b; HYPRE_ANNOTATE_FUNC_BEGIN; if (!hypre_ParCSRMatrixCommPkg(A)) { hypre_MatvecCommPkgCreate(A); } /* Create output vector */ b = hypre_ParVectorCreate(comm, global_num_cols, col_starts); /* Initialize the output vector */ hypre_ParVectorInitialize_v2(b, memory_location); /*--------------------------------------------- * Compute column sum vector *---------------------------------------------*/ #if defined(HYPRE_USING_GPU) HYPRE_ExecutionPolicy exec = hypre_GetExecPolicy1(memory_location); if (exec == HYPRE_EXEC_DEVICE) { /* TODO (VPM): hypre_ParCSRMatrixColSumDevice */ hypre_ParCSRMatrixMigrate(A, HYPRE_MEMORY_HOST); hypre_ParVectorMigrate(b, HYPRE_MEMORY_HOST); hypre_ParCSRMatrixColSumHost(A, b); hypre_ParCSRMatrixMigrate(A, HYPRE_MEMORY_DEVICE); hypre_ParVectorMigrate(b, HYPRE_MEMORY_DEVICE); } else #endif { hypre_ParCSRMatrixColSumHost(A, b); } /* Set output pointer */ *b_ptr = b; HYPRE_ANNOTATE_FUNC_END; return hypre_error_flag; } hypre-2.33.0/src/parcsr_mv/par_csr_matop_device.c000066400000000000000000002343331477326011500220430ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "_hypre_onedpl.hpp" #include "_hypre_utilities.h" #include "_hypre_parcsr_mv.h" #include "_hypre_utilities.hpp" #if defined(HYPRE_USING_GPU) /* return B = [Adiag, Aoffd] */ #if 1 __global__ void hypreGPUKernel_ConcatDiagAndOffd( hypre_DeviceItem &item, HYPRE_Int nrows, HYPRE_Int diag_ncol, HYPRE_Int *d_diag_i, HYPRE_Int *d_diag_j, HYPRE_Complex *d_diag_a, HYPRE_Int *d_offd_i, HYPRE_Int *d_offd_j, HYPRE_Complex *d_offd_a, HYPRE_Int *cols_offd_map, HYPRE_Int *d_ib, HYPRE_Int *d_jb, HYPRE_Complex *d_ab) { const HYPRE_Int row = hypre_gpu_get_grid_warp_id<1, 1>(item); if (row >= nrows) { return; } /* lane id inside the warp */ const HYPRE_Int lane_id = hypre_gpu_get_lane_id<1>(item); HYPRE_Int i, j = 0, k = 0, p, istart, iend, bstart; /* diag part */ if (lane_id < 2) { j = read_only_load(d_diag_i + row + lane_id); } if (lane_id == 0) { k = read_only_load(d_ib + row); } istart = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, j, 0); iend = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, j, 1); bstart = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, k, 0); p = bstart - istart; for (i = istart + lane_id; i < iend; i += HYPRE_WARP_SIZE) { d_jb[p + i] = read_only_load(d_diag_j + i); d_ab[p + i] = read_only_load(d_diag_a + i); } /* offd part */ if (lane_id < 2) { j = read_only_load(d_offd_i + row + lane_id); } bstart += iend - istart; istart = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, j, 0); iend = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, j, 1); p = bstart - istart; for (i = istart + lane_id; i < iend; i += HYPRE_WARP_SIZE) { const HYPRE_Int t = read_only_load(d_offd_j + i); d_jb[p + i] = (cols_offd_map ? read_only_load(&cols_offd_map[t]) : t) + diag_ncol; d_ab[p + i] = read_only_load(d_offd_a + i); } } hypre_CSRMatrix* hypre_ConcatDiagAndOffdDevice(hypre_ParCSRMatrix *A) { hypre_GpuProfilingPushRange("ConcatDiagAndOffdDevice"); hypre_CSRMatrix *A_diag = hypre_ParCSRMatrixDiag(A); hypre_CSRMatrix *A_offd = hypre_ParCSRMatrixOffd(A); hypre_CSRMatrix *B = hypre_CSRMatrixCreate( hypre_CSRMatrixNumRows(A_diag), hypre_CSRMatrixNumCols(A_diag) + hypre_CSRMatrixNumCols(A_offd), hypre_CSRMatrixNumNonzeros(A_diag) + hypre_CSRMatrixNumNonzeros(A_offd) ); hypre_CSRMatrixInitialize_v2(B, 0, HYPRE_MEMORY_DEVICE); hypreDevice_GetRowNnz(hypre_CSRMatrixNumRows(B), NULL, hypre_CSRMatrixI(A_diag), hypre_CSRMatrixI(A_offd), hypre_CSRMatrixI(B)); hypreDevice_IntegerExclusiveScan(hypre_CSRMatrixNumRows(B) + 1, hypre_CSRMatrixI(B)); const dim3 bDim = hypre_GetDefaultDeviceBlockDimension(); const dim3 gDim = hypre_GetDefaultDeviceGridDimension(hypre_CSRMatrixNumRows(A_diag), "warp", bDim); HYPRE_Int nrows = hypre_CSRMatrixNumRows(A_diag); HYPRE_Int diag_ncol = hypre_CSRMatrixNumCols(A_diag); HYPRE_Int *d_diag_i = hypre_CSRMatrixI(A_diag); HYPRE_Int *d_diag_j = hypre_CSRMatrixJ(A_diag); HYPRE_Complex *d_diag_a = hypre_CSRMatrixData(A_diag); HYPRE_Int *d_offd_i = hypre_CSRMatrixI(A_offd); HYPRE_Int *d_offd_j = hypre_CSRMatrixJ(A_offd); HYPRE_Complex *d_offd_a = hypre_CSRMatrixData(A_offd); HYPRE_Int *cols_offd_map = NULL; HYPRE_Int *d_ib = hypre_CSRMatrixI(B); HYPRE_Int *d_jb = hypre_CSRMatrixJ(B); HYPRE_Complex *d_ab = hypre_CSRMatrixData(B); HYPRE_GPU_LAUNCH( hypreGPUKernel_ConcatDiagAndOffd, gDim, bDim, nrows, diag_ncol, d_diag_i, d_diag_j, d_diag_a, d_offd_i, d_offd_j, d_offd_a, cols_offd_map, d_ib, d_jb, d_ab ); hypre_GpuProfilingPopRange(); return B; } #else hypre_CSRMatrix* hypre_ConcatDiagAndOffdDevice(hypre_ParCSRMatrix *A) { hypre_CSRMatrix *A_diag = hypre_ParCSRMatrixDiag(A); HYPRE_Int *A_diag_i = hypre_CSRMatrixI(A_diag); HYPRE_Int *A_diag_j = hypre_CSRMatrixJ(A_diag); HYPRE_Complex *A_diag_a = hypre_CSRMatrixData(A_diag); HYPRE_Int A_diag_nnz = hypre_CSRMatrixNumNonzeros(A_diag); hypre_CSRMatrix *A_offd = hypre_ParCSRMatrixOffd(A); HYPRE_Int *A_offd_i = hypre_CSRMatrixI(A_offd); HYPRE_Int *A_offd_j = hypre_CSRMatrixJ(A_offd); HYPRE_Complex *A_offd_a = hypre_CSRMatrixData(A_offd); HYPRE_Int A_offd_nnz = hypre_CSRMatrixNumNonzeros(A_offd); hypre_CSRMatrix *B; HYPRE_Int B_nrows = hypre_CSRMatrixNumRows(A_diag); HYPRE_Int B_ncols = hypre_CSRMatrixNumCols(A_diag) + hypre_CSRMatrixNumCols(A_offd); HYPRE_Int B_nnz = A_diag_nnz + A_offd_nnz; HYPRE_Int *B_ii = hypre_TAlloc(HYPRE_Int, B_nnz, HYPRE_MEMORY_DEVICE); HYPRE_Int *B_j = hypre_TAlloc(HYPRE_Int, B_nnz, HYPRE_MEMORY_DEVICE); HYPRE_Complex *B_a = hypre_TAlloc(HYPRE_Complex, B_nnz, HYPRE_MEMORY_DEVICE); // Adiag HYPRE_Int *A_diag_ii = hypreDevice_CsrRowPtrsToIndices(B_nrows, A_diag_nnz, A_diag_i); HYPRE_THRUST_CALL( copy_n, thrust::make_zip_iterator(thrust::make_tuple(A_diag_ii, A_diag_j, A_diag_a)), A_diag_nnz, thrust::make_zip_iterator(thrust::make_tuple(B_ii, B_j, B_a)) ); hypre_TFree(A_diag_ii, HYPRE_MEMORY_DEVICE); // Aoffd HYPRE_Int *A_offd_ii = hypreDevice_CsrRowPtrsToIndices(B_nrows, A_offd_nnz, A_offd_i); HYPRE_THRUST_CALL( copy_n, thrust::make_zip_iterator(thrust::make_tuple(A_offd_ii, A_offd_a)), A_offd_nnz, thrust::make_zip_iterator(thrust::make_tuple(B_ii, B_a)) + A_diag_nnz ); hypre_TFree(A_offd_ii, HYPRE_MEMORY_DEVICE); HYPRE_THRUST_CALL( transform, A_offd_j, A_offd_j + A_offd_nnz, thrust::make_constant_iterator(hypre_CSRMatrixNumCols(A_diag)), B_j + A_diag_nnz, thrust::plus() ); // B HYPRE_THRUST_CALL( stable_sort_by_key, B_ii, B_ii + B_nnz, thrust::make_zip_iterator(thrust::make_tuple(B_j, B_a)) ); HYPRE_Int *B_i = hypreDevice_CsrRowIndicesToPtrs(B_nrows, B_nnz, B_ii); hypre_TFree(B_ii, HYPRE_MEMORY_DEVICE); B = hypre_CSRMatrixCreate(B_nrows, B_ncols, B_nnz); hypre_CSRMatrixI(B) = B_i; hypre_CSRMatrixJ(B) = B_j; hypre_CSRMatrixData(B) = B_a; hypre_CSRMatrixMemoryLocation(B) = HYPRE_MEMORY_DEVICE; return B; } #endif /* return B = [Adiag, Aoffd; E] */ #if 1 HYPRE_Int hypre_ConcatDiagOffdAndExtDevice(hypre_ParCSRMatrix *A, hypre_CSRMatrix *E, hypre_CSRMatrix **B_ptr, HYPRE_Int *num_cols_offd_ptr, HYPRE_BigInt **cols_map_offd_ptr) { hypre_CSRMatrix *A_diag = hypre_ParCSRMatrixDiag(A); hypre_CSRMatrix *A_offd = hypre_ParCSRMatrixOffd(A); hypre_CSRMatrix *E_diag, *E_offd, *B; HYPRE_Int *cols_offd_map, num_cols_offd; HYPRE_BigInt *cols_map_offd; hypre_CSRMatrixSplitDevice(E, hypre_ParCSRMatrixFirstColDiag(A), hypre_ParCSRMatrixLastColDiag(A), hypre_CSRMatrixNumCols(A_offd), hypre_ParCSRMatrixDeviceColMapOffd(A), &cols_offd_map, &num_cols_offd, &cols_map_offd, &E_diag, &E_offd); B = hypre_CSRMatrixCreate(hypre_ParCSRMatrixNumRows(A) + hypre_CSRMatrixNumRows(E), hypre_ParCSRMatrixNumCols(A) + num_cols_offd, hypre_CSRMatrixNumNonzeros(A_diag) + hypre_CSRMatrixNumNonzeros(A_offd) + hypre_CSRMatrixNumNonzeros(E)); hypre_CSRMatrixInitialize_v2(B, 0, HYPRE_MEMORY_DEVICE); hypreDevice_GetRowNnz(hypre_ParCSRMatrixNumRows(A), NULL, hypre_CSRMatrixI(A_diag), hypre_CSRMatrixI(A_offd), hypre_CSRMatrixI(B)); hypreDevice_IntegerExclusiveScan(hypre_ParCSRMatrixNumRows(A) + 1, hypre_CSRMatrixI(B)); dim3 bDim = hypre_GetDefaultDeviceBlockDimension(); dim3 gDim = hypre_GetDefaultDeviceGridDimension(hypre_ParCSRMatrixNumRows(A), "warp", bDim); HYPRE_Int nrows = hypre_CSRMatrixNumRows(A_diag); HYPRE_Int diag_ncol = hypre_CSRMatrixNumCols(A_diag); HYPRE_Int *d_diag_i = hypre_CSRMatrixI(A_diag); HYPRE_Int *d_diag_j = hypre_CSRMatrixJ(A_diag); HYPRE_Complex *d_diag_a = hypre_CSRMatrixData(A_diag); HYPRE_Int *d_offd_i = hypre_CSRMatrixI(A_offd); HYPRE_Int *d_offd_j = hypre_CSRMatrixJ(A_offd); HYPRE_Complex *d_offd_a = hypre_CSRMatrixData(A_offd); HYPRE_Int *d_ib = hypre_CSRMatrixI(B); HYPRE_Int *d_jb = hypre_CSRMatrixJ(B); HYPRE_Complex *d_ab = hypre_CSRMatrixData(B); HYPRE_GPU_LAUNCH( hypreGPUKernel_ConcatDiagAndOffd, gDim, bDim, nrows, diag_ncol, d_diag_i, d_diag_j, d_diag_a, d_offd_i, d_offd_j, d_offd_a, cols_offd_map, d_ib, d_jb, d_ab ); hypre_TFree(cols_offd_map, HYPRE_MEMORY_DEVICE); hypre_TMemcpy(hypre_CSRMatrixI(B) + hypre_ParCSRMatrixNumRows(A) + 1, hypre_CSRMatrixI(E) + 1, HYPRE_Int, hypre_CSRMatrixNumRows(E), HYPRE_MEMORY_DEVICE, HYPRE_MEMORY_DEVICE); #ifdef HYPRE_USING_SYCL HYPRE_ONEDPL_CALL( std::transform, hypre_CSRMatrixI(B) + hypre_ParCSRMatrixNumRows(A) + 1, hypre_CSRMatrixI(B) + hypre_ParCSRMatrixNumRows(A) + hypre_CSRMatrixNumRows(E) + 1, hypre_CSRMatrixI(B) + hypre_ParCSRMatrixNumRows(A) + 1, [const_val = hypre_CSRMatrixNumNonzeros(A_diag) + hypre_CSRMatrixNumNonzeros(A_offd)] ( const auto & x) {return x + const_val;} ); #else HYPRE_THRUST_CALL( transform, hypre_CSRMatrixI(B) + hypre_ParCSRMatrixNumRows(A) + 1, hypre_CSRMatrixI(B) + hypre_ParCSRMatrixNumRows(A) + hypre_CSRMatrixNumRows(E) + 1, thrust::make_constant_iterator(hypre_CSRMatrixNumNonzeros(A_diag) + hypre_CSRMatrixNumNonzeros( A_offd)), hypre_CSRMatrixI(B) + hypre_ParCSRMatrixNumRows(A) + 1, thrust::plus() ); #endif gDim = hypre_GetDefaultDeviceGridDimension(hypre_CSRMatrixNumRows(E), "warp", bDim); hypre_assert(hypre_CSRMatrixNumCols(E_diag) == hypre_CSRMatrixNumCols(A_diag)); nrows = hypre_CSRMatrixNumRows(E_diag); diag_ncol = hypre_CSRMatrixNumCols(E_diag); d_diag_i = hypre_CSRMatrixI(E_diag); d_diag_j = hypre_CSRMatrixJ(E_diag); d_diag_a = hypre_CSRMatrixData(E_diag); d_offd_i = hypre_CSRMatrixI(E_offd); d_offd_j = hypre_CSRMatrixJ(E_offd); d_offd_a = hypre_CSRMatrixData(E_offd); cols_offd_map = NULL; d_ib = hypre_CSRMatrixI(B) + hypre_ParCSRMatrixNumRows(A); d_jb = hypre_CSRMatrixJ(B); d_ab = hypre_CSRMatrixData(B); HYPRE_GPU_LAUNCH( hypreGPUKernel_ConcatDiagAndOffd, gDim, bDim, nrows, diag_ncol, d_diag_i, d_diag_j, d_diag_a, d_offd_i, d_offd_j, d_offd_a, cols_offd_map, d_ib, d_jb, d_ab ); hypre_CSRMatrixDestroy(E_diag); hypre_CSRMatrixDestroy(E_offd); *B_ptr = B; *num_cols_offd_ptr = num_cols_offd; *cols_map_offd_ptr = cols_map_offd; return hypre_error_flag; } #else HYPRE_Int hypre_ConcatDiagOffdAndExtDevice(hypre_ParCSRMatrix *A, hypre_CSRMatrix *E, hypre_CSRMatrix **B_ptr, HYPRE_Int *num_cols_offd_ptr, HYPRE_BigInt **cols_map_offd_ptr) { hypre_CSRMatrix *A_diag = hypre_ParCSRMatrixDiag(A); HYPRE_Int A_nrows = hypre_CSRMatrixNumRows(A_diag); HYPRE_Int A_ncols = hypre_CSRMatrixNumCols(A_diag); HYPRE_Int *A_diag_i = hypre_CSRMatrixI(A_diag); HYPRE_Int *A_diag_j = hypre_CSRMatrixJ(A_diag); HYPRE_Complex *A_diag_a = hypre_CSRMatrixData(A_diag); HYPRE_Int A_diag_nnz = hypre_CSRMatrixNumNonzeros(A_diag); hypre_CSRMatrix *A_offd = hypre_ParCSRMatrixOffd(A); HYPRE_Int *A_offd_i = hypre_CSRMatrixI(A_offd); HYPRE_Int *A_offd_j = hypre_CSRMatrixJ(A_offd); HYPRE_Complex *A_offd_a = hypre_CSRMatrixData(A_offd); HYPRE_Int A_offd_nnz = hypre_CSRMatrixNumNonzeros(A_offd); HYPRE_BigInt first_col_A = hypre_ParCSRMatrixFirstColDiag(A); HYPRE_BigInt last_col_A = hypre_ParCSRMatrixLastColDiag(A); HYPRE_Int num_cols_offd_A = hypre_CSRMatrixNumCols(A_offd); HYPRE_BigInt *col_map_offd_A = hypre_ParCSRMatrixDeviceColMapOffd(A); HYPRE_Int *E_i = hypre_CSRMatrixI(E); HYPRE_BigInt *E_bigj = hypre_CSRMatrixBigJ(E); HYPRE_Complex *E_a = hypre_CSRMatrixData(E); HYPRE_Int E_nrows = hypre_CSRMatrixNumRows(E); HYPRE_Int E_nnz = hypre_CSRMatrixNumNonzeros(E); HYPRE_Int E_diag_nnz, E_offd_nnz; hypre_CSRMatrix *B; HYPRE_Int B_nnz = A_diag_nnz + A_offd_nnz + E_nnz; HYPRE_Int *B_ii = hypre_TAlloc(HYPRE_Int, B_nnz, HYPRE_MEMORY_DEVICE); HYPRE_Int *B_j = hypre_TAlloc(HYPRE_Int, B_nnz, HYPRE_MEMORY_DEVICE); HYPRE_Complex *B_a = hypre_TAlloc(HYPRE_Complex, B_nnz, HYPRE_MEMORY_DEVICE); // E hypre_CSRMatrixSplitDevice_core(0, E_nrows, E_nnz, NULL, E_bigj, NULL, NULL, first_col_A, last_col_A, num_cols_offd_A, NULL, NULL, NULL, NULL, &E_diag_nnz, NULL, NULL, NULL, NULL, &E_offd_nnz, NULL, NULL, NULL, NULL); HYPRE_Int *cols_offd_map, num_cols_offd; HYPRE_BigInt *cols_map_offd; HYPRE_Int *E_ii = hypreDevice_CsrRowPtrsToIndices(E_nrows, E_nnz, E_i); hypre_CSRMatrixSplitDevice_core(1, E_nrows, E_nnz, E_ii, E_bigj, E_a, NULL, first_col_A, last_col_A, num_cols_offd_A, col_map_offd_A, &cols_offd_map, &num_cols_offd, &cols_map_offd, &E_diag_nnz, B_ii + A_diag_nnz + A_offd_nnz, B_j + A_diag_nnz + A_offd_nnz, B_a + A_diag_nnz + A_offd_nnz, NULL, &E_offd_nnz, B_ii + A_diag_nnz + A_offd_nnz + E_diag_nnz, B_j + A_diag_nnz + A_offd_nnz + E_diag_nnz, B_a + A_diag_nnz + A_offd_nnz + E_diag_nnz, NULL); hypre_TFree(E_ii, HYPRE_MEMORY_DEVICE); HYPRE_THRUST_CALL( transform, B_ii + A_diag_nnz + A_offd_nnz, B_ii + B_nnz, thrust::make_constant_iterator(A_nrows), B_ii + A_diag_nnz + A_offd_nnz, thrust::plus() ); // Adiag HYPRE_Int *A_diag_ii = hypreDevice_CsrRowPtrsToIndices(A_nrows, A_diag_nnz, A_diag_i); HYPRE_THRUST_CALL( copy_n, thrust::make_zip_iterator(thrust::make_tuple(A_diag_ii, A_diag_j, A_diag_a)), A_diag_nnz, thrust::make_zip_iterator(thrust::make_tuple(B_ii, B_j, B_a)) ); hypre_TFree(A_diag_ii, HYPRE_MEMORY_DEVICE); // Aoffd HYPRE_Int *A_offd_ii = hypreDevice_CsrRowPtrsToIndices(A_nrows, A_offd_nnz, A_offd_i); HYPRE_THRUST_CALL( copy_n, thrust::make_zip_iterator(thrust::make_tuple(A_offd_ii, A_offd_a)), A_offd_nnz, thrust::make_zip_iterator(thrust::make_tuple(B_ii, B_a)) + A_diag_nnz ); hypre_TFree(A_offd_ii, HYPRE_MEMORY_DEVICE); HYPRE_THRUST_CALL( gather, A_offd_j, A_offd_j + A_offd_nnz, cols_offd_map, B_j + A_diag_nnz); hypre_TFree(cols_offd_map, HYPRE_MEMORY_DEVICE); HYPRE_THRUST_CALL( transform, B_j + A_diag_nnz, B_j + A_diag_nnz + A_offd_nnz, thrust::make_constant_iterator(A_ncols), B_j + A_diag_nnz, thrust::plus() ); HYPRE_THRUST_CALL( transform, B_j + A_diag_nnz + A_offd_nnz + E_diag_nnz, B_j + B_nnz, thrust::make_constant_iterator(A_ncols), B_j + A_diag_nnz + A_offd_nnz + E_diag_nnz, thrust::plus() ); // B HYPRE_THRUST_CALL( stable_sort_by_key, B_ii, B_ii + B_nnz, thrust::make_zip_iterator(thrust::make_tuple(B_j, B_a)) ); HYPRE_Int *B_i = hypreDevice_CsrRowIndicesToPtrs(A_nrows + E_nrows, B_nnz, B_ii); hypre_TFree(B_ii, HYPRE_MEMORY_DEVICE); B = hypre_CSRMatrixCreate(A_nrows + E_nrows, A_ncols + num_cols_offd, B_nnz); hypre_CSRMatrixI(B) = B_i; hypre_CSRMatrixJ(B) = B_j; hypre_CSRMatrixData(B) = B_a; hypre_CSRMatrixMemoryLocation(B) = HYPRE_MEMORY_DEVICE; *B_ptr = B; *num_cols_offd_ptr = num_cols_offd; *cols_map_offd_ptr = cols_map_offd; return hypre_error_flag; } #endif /* The input B_ext is a BigJ matrix, so is the output */ /* RL: TODO FIX the num of columns of the output (from B_ext 'big' num cols) */ HYPRE_Int hypre_ExchangeExternalRowsDeviceInit( hypre_CSRMatrix *B_ext, hypre_ParCSRCommPkg *comm_pkg_A, HYPRE_Int want_data, void **request_ptr) { MPI_Comm comm = hypre_ParCSRCommPkgComm(comm_pkg_A); HYPRE_Int num_recvs = hypre_ParCSRCommPkgNumRecvs(comm_pkg_A); HYPRE_Int *recv_procs = hypre_ParCSRCommPkgRecvProcs(comm_pkg_A); HYPRE_Int *recv_vec_starts = hypre_ParCSRCommPkgRecvVecStarts(comm_pkg_A); HYPRE_Int num_sends = hypre_ParCSRCommPkgNumSends(comm_pkg_A); HYPRE_Int *send_procs = hypre_ParCSRCommPkgSendProcs(comm_pkg_A); HYPRE_Int *send_map_starts = hypre_ParCSRCommPkgSendMapStarts(comm_pkg_A); HYPRE_Int num_elmts_send = send_map_starts[num_sends]; HYPRE_Int num_elmts_recv = recv_vec_starts[num_recvs]; HYPRE_Int *B_ext_i_d = hypre_CSRMatrixI(B_ext); HYPRE_BigInt *B_ext_j_d = hypre_CSRMatrixBigJ(B_ext); HYPRE_Complex *B_ext_a_d = hypre_CSRMatrixData(B_ext); HYPRE_Int B_ext_ncols = hypre_CSRMatrixNumCols(B_ext); HYPRE_Int B_ext_nrows = hypre_CSRMatrixNumRows(B_ext); HYPRE_Int B_ext_nnz = hypre_CSRMatrixNumNonzeros(B_ext); HYPRE_Int *B_ext_rownnz_d = hypre_TAlloc(HYPRE_Int, B_ext_nrows + 1, HYPRE_MEMORY_DEVICE); HYPRE_Int *B_ext_rownnz_h = hypre_TAlloc(HYPRE_Int, B_ext_nrows, HYPRE_MEMORY_HOST); HYPRE_Int *B_ext_i_h = hypre_TAlloc(HYPRE_Int, B_ext_nrows + 1, HYPRE_MEMORY_HOST); hypre_assert(num_elmts_recv == B_ext_nrows); /* output matrix */ hypre_CSRMatrix *B_int_d; HYPRE_Int B_int_nrows = num_elmts_send; HYPRE_Int B_int_ncols = B_ext_ncols; HYPRE_Int *B_int_i_h = hypre_TAlloc(HYPRE_Int, B_int_nrows + 1, HYPRE_MEMORY_HOST); HYPRE_Int *B_int_i_d = hypre_TAlloc(HYPRE_Int, B_int_nrows + 1, HYPRE_MEMORY_DEVICE); HYPRE_BigInt *B_int_j_d = NULL; HYPRE_Complex *B_int_a_d = NULL; HYPRE_Int B_int_nnz; hypre_ParCSRCommHandle *comm_handle, *comm_handle_j, *comm_handle_a; hypre_ParCSRCommPkg *comm_pkg_j = NULL; HYPRE_Int *jdata_recv_vec_starts; HYPRE_Int *jdata_send_map_starts; HYPRE_Int i; HYPRE_Int num_procs, my_id; void **vrequest; hypre_MPI_Comm_size(comm, &num_procs); hypre_MPI_Comm_rank(comm, &my_id); jdata_send_map_starts = hypre_TAlloc(HYPRE_Int, num_sends + 1, HYPRE_MEMORY_HOST); /*-------------------------------------------------------------------------- * B_ext_rownnz contains the number of elements of row j * (to be determined through send_map_elmnts on the receiving end) *--------------------------------------------------------------------------*/ #if defined(HYPRE_USING_SYCL) HYPRE_ONEDPL_CALL(std::adjacent_difference, B_ext_i_d, B_ext_i_d + B_ext_nrows + 1, B_ext_rownnz_d); #else HYPRE_THRUST_CALL(adjacent_difference, B_ext_i_d, B_ext_i_d + B_ext_nrows + 1, B_ext_rownnz_d); #endif hypre_TMemcpy(B_ext_rownnz_h, B_ext_rownnz_d + 1, HYPRE_Int, B_ext_nrows, HYPRE_MEMORY_HOST, HYPRE_MEMORY_DEVICE); /*-------------------------------------------------------------------------- * initialize communication: send/recv the row nnz * (note the use of comm_pkg_A, mode 12, as in transpose matvec *--------------------------------------------------------------------------*/ comm_handle = hypre_ParCSRCommHandleCreate(12, comm_pkg_A, B_ext_rownnz_h, B_int_i_h + 1); jdata_recv_vec_starts = hypre_TAlloc(HYPRE_Int, num_recvs + 1, HYPRE_MEMORY_HOST); jdata_recv_vec_starts[0] = 0; B_ext_i_h[0] = 0; hypre_TMemcpy(B_ext_i_h + 1, B_ext_rownnz_h, HYPRE_Int, B_ext_nrows, HYPRE_MEMORY_HOST, HYPRE_MEMORY_HOST); for (i = 1; i <= B_ext_nrows; i++) { B_ext_i_h[i] += B_ext_i_h[i - 1]; } hypre_assert(B_ext_i_h[B_ext_nrows] == B_ext_nnz); for (i = 1; i <= num_recvs; i++) { jdata_recv_vec_starts[i] = B_ext_i_h[recv_vec_starts[i]]; } /* Create the communication package - note the order of send/recv is reversed */ hypre_ParCSRCommPkgCreateAndFill(comm, num_sends, send_procs, jdata_send_map_starts, num_recvs, recv_procs, jdata_recv_vec_starts, NULL, &comm_pkg_j); hypre_ParCSRCommHandleDestroy(comm_handle); /*-------------------------------------------------------------------------- * compute B_int: row nnz to row ptrs *--------------------------------------------------------------------------*/ B_int_i_h[0] = 0; for (i = 1; i <= B_int_nrows; i++) { B_int_i_h[i] += B_int_i_h[i - 1]; } B_int_nnz = B_int_i_h[B_int_nrows]; B_int_j_d = hypre_TAlloc(HYPRE_BigInt, B_int_nnz, HYPRE_MEMORY_DEVICE); if (want_data) { B_int_a_d = hypre_TAlloc(HYPRE_Complex, B_int_nnz, HYPRE_MEMORY_DEVICE); } for (i = 0; i <= num_sends; i++) { jdata_send_map_starts[i] = B_int_i_h[send_map_starts[i]]; } /* RL: assume B_ext_a_d and B_ext_j_d are ready at input */ /* send/recv CSR rows */ if (want_data) { comm_handle_a = hypre_ParCSRCommHandleCreate_v2( 1, comm_pkg_j, HYPRE_MEMORY_DEVICE, B_ext_a_d, HYPRE_MEMORY_DEVICE, B_int_a_d ); } else { comm_handle_a = NULL; } comm_handle_j = hypre_ParCSRCommHandleCreate_v2(21, comm_pkg_j, HYPRE_MEMORY_DEVICE, B_ext_j_d, HYPRE_MEMORY_DEVICE, B_int_j_d ); hypre_TMemcpy(B_int_i_d, B_int_i_h, HYPRE_Int, B_int_nrows + 1, HYPRE_MEMORY_DEVICE, HYPRE_MEMORY_HOST); /* create CSR: on device */ B_int_d = hypre_CSRMatrixCreate(B_int_nrows, B_int_ncols, B_int_nnz); hypre_CSRMatrixI(B_int_d) = B_int_i_d; hypre_CSRMatrixBigJ(B_int_d) = B_int_j_d; hypre_CSRMatrixData(B_int_d) = B_int_a_d; hypre_CSRMatrixMemoryLocation(B_int_d) = HYPRE_MEMORY_DEVICE; /* output */ vrequest = hypre_TAlloc(void *, 3, HYPRE_MEMORY_HOST); vrequest[0] = (void *) comm_handle_j; vrequest[1] = (void *) comm_handle_a; vrequest[2] = (void *) B_int_d; *request_ptr = (void *) vrequest; /* free */ hypre_TFree(B_ext_rownnz_d, HYPRE_MEMORY_DEVICE); hypre_TFree(B_ext_rownnz_h, HYPRE_MEMORY_HOST); hypre_TFree(B_ext_i_h, HYPRE_MEMORY_HOST); hypre_TFree(B_int_i_h, HYPRE_MEMORY_HOST); hypre_TFree(hypre_ParCSRCommPkgSendMapStarts(comm_pkg_j), HYPRE_MEMORY_HOST); hypre_TFree(hypre_ParCSRCommPkgRecvVecStarts(comm_pkg_j), HYPRE_MEMORY_HOST); hypre_TFree(comm_pkg_j, HYPRE_MEMORY_HOST); return hypre_error_flag; } hypre_CSRMatrix* hypre_ExchangeExternalRowsDeviceWait(void *vrequest) { void **request = (void **) vrequest; hypre_ParCSRCommHandle *comm_handle_j = (hypre_ParCSRCommHandle *) request[0]; hypre_ParCSRCommHandle *comm_handle_a = (hypre_ParCSRCommHandle *) request[1]; hypre_CSRMatrix *B_int_d = (hypre_CSRMatrix *) request[2]; /* communication done */ hypre_ParCSRCommHandleDestroy(comm_handle_j); hypre_ParCSRCommHandleDestroy(comm_handle_a); hypre_TFree(request, HYPRE_MEMORY_HOST); return B_int_d; } HYPRE_Int hypre_ParCSRMatrixExtractBExtDeviceInit( hypre_ParCSRMatrix *B, hypre_ParCSRMatrix *A, HYPRE_Int want_data, void **request_ptr) { hypre_assert( hypre_CSRMatrixMemoryLocation(hypre_ParCSRMatrixDiag(B)) == hypre_CSRMatrixMemoryLocation(hypre_ParCSRMatrixOffd(B)) ); /* hypre_assert( hypre_GetActualMemLocation( hypre_CSRMatrixMemoryLocation(hypre_ParCSRMatrixDiag(B))) == HYPRE_MEMORY_DEVICE ); */ if (!hypre_ParCSRMatrixCommPkg(A)) { hypre_MatvecCommPkgCreate(A); } hypre_ParcsrGetExternalRowsDeviceInit(B, hypre_CSRMatrixNumCols(hypre_ParCSRMatrixOffd(A)), hypre_ParCSRMatrixColMapOffd(A), hypre_ParCSRMatrixCommPkg(A), want_data, request_ptr); return hypre_error_flag; } hypre_CSRMatrix* hypre_ParCSRMatrixExtractBExtDeviceWait(void *request) { return hypre_ParcsrGetExternalRowsDeviceWait(request); } hypre_CSRMatrix* hypre_ParCSRMatrixExtractBExtDevice( hypre_ParCSRMatrix *B, hypre_ParCSRMatrix *A, HYPRE_Int want_data ) { void *request; hypre_ParCSRMatrixExtractBExtDeviceInit(B, A, want_data, &request); return hypre_ParCSRMatrixExtractBExtDeviceWait(request); } HYPRE_Int hypre_ParcsrGetExternalRowsDeviceInit( hypre_ParCSRMatrix *A, HYPRE_Int indices_len, HYPRE_BigInt *indices, hypre_ParCSRCommPkg *comm_pkg, HYPRE_Int want_data, void **request_ptr) { HYPRE_UNUSED_VAR(indices); HYPRE_UNUSED_VAR(indices_len); HYPRE_Int i, j; HYPRE_Int num_sends, num_rows_send, num_nnz_send, num_recvs, num_rows_recv, num_nnz_recv; HYPRE_Int *d_send_i, *send_i, *d_send_map, *d_recv_i, *recv_i; HYPRE_BigInt *d_send_j, *d_recv_j; HYPRE_Int *send_jstarts, *recv_jstarts; HYPRE_Complex *d_send_a = NULL, *d_recv_a = NULL; hypre_ParCSRCommPkg *comm_pkg_j = NULL; hypre_ParCSRCommHandle *comm_handle, *comm_handle_j, *comm_handle_a; /* HYPRE_Int global_num_rows = hypre_ParCSRMatrixGlobalNumRows(A); */ /* diag part of A */ hypre_CSRMatrix *A_diag = hypre_ParCSRMatrixDiag(A); HYPRE_Complex *A_diag_a = hypre_CSRMatrixData(A_diag); HYPRE_Int *A_diag_i = hypre_CSRMatrixI(A_diag); HYPRE_Int *A_diag_j = hypre_CSRMatrixJ(A_diag); /* HYPRE_Int local_num_rows = hypre_CSRMatrixNumRows(A_diag); */ /* off-diag part of A */ hypre_CSRMatrix *A_offd = hypre_ParCSRMatrixOffd(A); HYPRE_Complex *A_offd_a = hypre_CSRMatrixData(A_offd); HYPRE_Int *A_offd_i = hypre_CSRMatrixI(A_offd); HYPRE_Int *A_offd_j = hypre_CSRMatrixJ(A_offd); /* HYPRE_Int *row_starts = hypre_ParCSRMatrixRowStarts(A); */ /* HYPRE_Int first_row = hypre_ParCSRMatrixFirstRowIndex(A); */ HYPRE_BigInt first_col = hypre_ParCSRMatrixFirstColDiag(A); HYPRE_BigInt *col_map_offd_A = hypre_ParCSRMatrixColMapOffd(A); HYPRE_Int num_cols_A_offd = hypre_CSRMatrixNumCols(A_offd); HYPRE_BigInt *d_col_map_offd_A = hypre_ParCSRMatrixDeviceColMapOffd(A); MPI_Comm comm = hypre_ParCSRMatrixComm(A); HYPRE_Int num_procs; HYPRE_Int my_id; void **vrequest; hypre_CSRMatrix *A_ext; hypre_MPI_Comm_size(comm, &num_procs); hypre_MPI_Comm_rank(comm, &my_id); /* number of sends (#procs) */ num_sends = hypre_ParCSRCommPkgNumSends(comm_pkg); /* number of rows to send */ num_rows_send = hypre_ParCSRCommPkgSendMapStart(comm_pkg, num_sends); /* number of recvs (#procs) */ num_recvs = hypre_ParCSRCommPkgNumRecvs(comm_pkg); /* number of rows to recv */ num_rows_recv = hypre_ParCSRCommPkgRecvVecStart(comm_pkg, num_recvs); /* must be true if indices contains proper offd indices */ hypre_assert(indices_len == num_rows_recv); /* send_i/recv_i: * the arrays to send and recv: we first send and recv the row lengths */ d_send_i = hypre_TAlloc(HYPRE_Int, num_rows_send + 1, HYPRE_MEMORY_DEVICE); d_send_map = hypre_TAlloc(HYPRE_Int, num_rows_send, HYPRE_MEMORY_DEVICE); send_i = hypre_TAlloc(HYPRE_Int, num_rows_send, HYPRE_MEMORY_HOST); recv_i = hypre_TAlloc(HYPRE_Int, num_rows_recv + 1, HYPRE_MEMORY_HOST); d_recv_i = hypre_TAlloc(HYPRE_Int, num_rows_recv + 1, HYPRE_MEMORY_DEVICE); /* fill the send array with row lengths */ hypre_TMemcpy(d_send_map, hypre_ParCSRCommPkgSendMapElmts(comm_pkg), HYPRE_Int, num_rows_send, HYPRE_MEMORY_DEVICE, HYPRE_MEMORY_HOST); hypre_Memset(d_send_i, 0, sizeof(HYPRE_Int), HYPRE_MEMORY_DEVICE); hypreDevice_GetRowNnz(num_rows_send, d_send_map, A_diag_i, A_offd_i, d_send_i + 1); /* send array send_i out: deviceTohost first and MPI (async) * note the shift in recv_i by one */ hypre_TMemcpy(send_i, d_send_i + 1, HYPRE_Int, num_rows_send, HYPRE_MEMORY_HOST, HYPRE_MEMORY_DEVICE); comm_handle = hypre_ParCSRCommHandleCreate(11, comm_pkg, send_i, recv_i + 1); hypreDevice_IntegerInclusiveScan(num_rows_send + 1, d_send_i); /* total number of nnz to send */ hypre_TMemcpy(&num_nnz_send, d_send_i + num_rows_send, HYPRE_Int, 1, HYPRE_MEMORY_HOST, HYPRE_MEMORY_DEVICE); /* prepare data to send out. overlap with the above commmunication */ d_send_j = hypre_TAlloc(HYPRE_BigInt, num_nnz_send, HYPRE_MEMORY_DEVICE); if (want_data) { d_send_a = hypre_TAlloc(HYPRE_Complex, num_nnz_send, HYPRE_MEMORY_DEVICE); } if (d_col_map_offd_A == NULL) { d_col_map_offd_A = hypre_TAlloc(HYPRE_BigInt, num_cols_A_offd, HYPRE_MEMORY_DEVICE); hypre_TMemcpy(d_col_map_offd_A, col_map_offd_A, HYPRE_BigInt, num_cols_A_offd, HYPRE_MEMORY_DEVICE, HYPRE_MEMORY_HOST); hypre_ParCSRMatrixDeviceColMapOffd(A) = d_col_map_offd_A; } /* job == 2, d_send_i is input that contains row ptrs (length num_rows_send) */ hypreDevice_CopyParCSRRows(num_rows_send, d_send_map, 2, num_procs > 1, first_col, d_col_map_offd_A, A_diag_i, A_diag_j, A_diag_a, A_offd_i, A_offd_j, A_offd_a, d_send_i, d_send_j, d_send_a); /* pointers to each proc in send_j */ send_jstarts = hypre_TAlloc(HYPRE_Int, num_sends + 1, HYPRE_MEMORY_HOST); send_jstarts[0] = 0; for (i = 1; i <= num_sends; i++) { send_jstarts[i] = send_jstarts[i - 1]; for ( j = hypre_ParCSRCommPkgSendMapStart(comm_pkg, i - 1); j < hypre_ParCSRCommPkgSendMapStart(comm_pkg, i); j++ ) { send_jstarts[i] += send_i[j]; } } hypre_assert(send_jstarts[num_sends] == num_nnz_send); /* finish the above communication: send_i/recv_i */ hypre_ParCSRCommHandleDestroy(comm_handle); /* adjust recv_i to ptrs */ recv_i[0] = 0; for (i = 1; i <= num_rows_recv; i++) { recv_i[i] += recv_i[i - 1]; } num_nnz_recv = recv_i[num_rows_recv]; /* allocate device memory for j and a */ d_recv_j = hypre_TAlloc(HYPRE_BigInt, num_nnz_recv, HYPRE_MEMORY_DEVICE); if (want_data) { d_recv_a = hypre_TAlloc(HYPRE_Complex, num_nnz_recv, HYPRE_MEMORY_DEVICE); } recv_jstarts = hypre_TAlloc(HYPRE_Int, num_recvs + 1, HYPRE_MEMORY_HOST); recv_jstarts[0] = 0; for (i = 1; i <= num_recvs; i++) { j = hypre_ParCSRCommPkgRecvVecStart(comm_pkg, i); recv_jstarts[i] = recv_i[j]; } /* ready to send and recv: create a communication package for data */ hypre_ParCSRCommPkgCreateAndFill(comm, num_recvs, hypre_ParCSRCommPkgRecvProcs(comm_pkg), recv_jstarts, num_sends, hypre_ParCSRCommPkgSendProcs(comm_pkg), send_jstarts, NULL, &comm_pkg_j); /* RL: make sure d_send_j/d_send_a is ready before issuing GPU-GPU MPI */ if (hypre_GetGpuAwareMPI()) { hypre_ForceSyncComputeStream(); } /* init communication */ /* ja */ comm_handle_j = hypre_ParCSRCommHandleCreate_v2(21, comm_pkg_j, HYPRE_MEMORY_DEVICE, d_send_j, HYPRE_MEMORY_DEVICE, d_recv_j); if (want_data) { /* a */ comm_handle_a = hypre_ParCSRCommHandleCreate_v2(1, comm_pkg_j, HYPRE_MEMORY_DEVICE, d_send_a, HYPRE_MEMORY_DEVICE, d_recv_a); } else { comm_handle_a = NULL; } hypre_TMemcpy(d_recv_i, recv_i, HYPRE_Int, num_rows_recv + 1, HYPRE_MEMORY_DEVICE, HYPRE_MEMORY_HOST); /* create A_ext: on device */ A_ext = hypre_CSRMatrixCreate(num_rows_recv, hypre_ParCSRMatrixGlobalNumCols(A), num_nnz_recv); hypre_CSRMatrixI (A_ext) = d_recv_i; hypre_CSRMatrixBigJ(A_ext) = d_recv_j; hypre_CSRMatrixData(A_ext) = d_recv_a; hypre_CSRMatrixMemoryLocation(A_ext) = HYPRE_MEMORY_DEVICE; /* output */ vrequest = hypre_TAlloc(void *, 3, HYPRE_MEMORY_HOST); vrequest[0] = (void *) comm_handle_j; vrequest[1] = (void *) comm_handle_a; vrequest[2] = (void *) A_ext; *request_ptr = (void *) vrequest; /* free */ hypre_TFree(send_i, HYPRE_MEMORY_HOST); hypre_TFree(recv_i, HYPRE_MEMORY_HOST); hypre_TFree(d_send_i, HYPRE_MEMORY_DEVICE); hypre_TFree(d_send_map, HYPRE_MEMORY_DEVICE); hypre_TFree(hypre_ParCSRCommPkgSendMapStarts(comm_pkg_j), HYPRE_MEMORY_HOST); hypre_TFree(hypre_ParCSRCommPkgRecvVecStarts(comm_pkg_j), HYPRE_MEMORY_HOST); hypre_TFree(comm_pkg_j, HYPRE_MEMORY_HOST); return hypre_error_flag; } hypre_CSRMatrix* hypre_ParcsrGetExternalRowsDeviceWait(void *vrequest) { void **request = (void **) vrequest; hypre_ParCSRCommHandle *comm_handle_j = (hypre_ParCSRCommHandle *) request[0]; hypre_ParCSRCommHandle *comm_handle_a = (hypre_ParCSRCommHandle *) request[1]; hypre_CSRMatrix *A_ext = (hypre_CSRMatrix *) request[2]; HYPRE_BigInt *send_j = comm_handle_j ? (HYPRE_BigInt *) hypre_ParCSRCommHandleSendData(comm_handle_j) : NULL; HYPRE_Complex *send_a = comm_handle_a ? (HYPRE_Complex *) hypre_ParCSRCommHandleSendData(comm_handle_a) : NULL; hypre_ParCSRCommHandleDestroy(comm_handle_j); hypre_ParCSRCommHandleDestroy(comm_handle_a); hypre_TFree(send_j, HYPRE_MEMORY_DEVICE); hypre_TFree(send_a, HYPRE_MEMORY_DEVICE); hypre_TFree(request, HYPRE_MEMORY_HOST); return A_ext; } HYPRE_Int hypre_ParCSRCommPkgCreateMatrixE( hypre_ParCSRCommPkg *comm_pkg, HYPRE_Int num_cols ) { /* Input variables */ HYPRE_Int num_sends = hypre_ParCSRCommPkgNumSends(comm_pkg); HYPRE_Int num_elements = hypre_ParCSRCommPkgSendMapStart(comm_pkg, num_sends); HYPRE_Int num_components = hypre_ParCSRCommPkgNumComponents(comm_pkg); HYPRE_Int *send_map = hypre_ParCSRCommPkgDeviceSendMapElmts(comm_pkg); HYPRE_Int *send_map_def; /* Local variables */ hypre_CSRMatrix *matrix_E; HYPRE_Int *e_i; HYPRE_Int *e_ii; HYPRE_Int *e_j; HYPRE_Int *new_end; HYPRE_Int nid; /* Update number of elements exchanged when communicating multivectors */ num_elements /= num_components; /* Create matrix_E */ matrix_E = hypre_CSRMatrixCreate(num_cols, num_elements, num_elements); hypre_CSRMatrixMemoryLocation(matrix_E) = HYPRE_MEMORY_DEVICE; /* Build default (original) send_map_elements array */ if (num_components > 1) { send_map_def = hypre_TAlloc(HYPRE_Int, num_elements, HYPRE_MEMORY_DEVICE); hypreDevice_IntStridedCopy(num_elements, num_components, send_map, send_map_def); } else { send_map_def = send_map; } /* Allocate arrays */ e_ii = hypre_TAlloc(HYPRE_Int, num_elements, HYPRE_MEMORY_DEVICE); e_j = hypre_TAlloc(HYPRE_Int, num_elements, HYPRE_MEMORY_DEVICE); /* Build e_ii and e_j */ hypre_TMemcpy(e_ii, send_map_def, HYPRE_Int, num_elements, HYPRE_MEMORY_DEVICE, HYPRE_MEMORY_DEVICE); #if defined(HYPRE_USING_SYCL) hypreSycl_sequence(e_j, e_j + num_elements, 0); hypreSycl_stable_sort_by_key(e_ii, e_ii + num_elements, e_j); #else HYPRE_THRUST_CALL(sequence, e_j, e_j + num_elements); HYPRE_THRUST_CALL(stable_sort_by_key, e_ii, e_ii + num_elements, e_j); #endif /* Construct row pointers from row indices */ e_i = hypreDevice_CsrRowIndicesToPtrs(num_cols, num_elements, e_ii); /* Find row indices with nonzero coefficients */ #if defined(HYPRE_USING_SYCL) new_end = HYPRE_ONEDPL_CALL(std::unique, e_ii, e_ii + num_elements); #else new_end = HYPRE_THRUST_CALL(unique, e_ii, e_ii + num_elements); #endif nid = new_end - e_ii; e_ii = hypre_TReAlloc_v2(e_ii, HYPRE_Int, num_elements, HYPRE_Int, nid, HYPRE_MEMORY_DEVICE); /* Set matrix_E pointers */ hypre_CSRMatrixI(matrix_E) = e_i; hypre_CSRMatrixJ(matrix_E) = e_j; hypre_CSRMatrixNumRownnz(matrix_E) = nid; hypre_CSRMatrixRownnz(matrix_E) = e_ii; /* Set matrix_E */ hypre_ParCSRCommPkgMatrixE(comm_pkg) = matrix_E; /* Free memory */ if (num_components > 1) { hypre_TFree(send_map_def, HYPRE_MEMORY_DEVICE); } return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_ParCSRMatrixCompressOffdMapDevice *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ParCSRMatrixCompressOffdMapDevice(hypre_ParCSRMatrix *A) { hypre_GpuProfilingPushRange("CompressOffdMap"); hypre_ParCSRMatrixCopyColMapOffdToDevice(A); hypre_CSRMatrix *A_offd = hypre_ParCSRMatrixOffd(A); HYPRE_Int num_cols_A_offd = hypre_CSRMatrixNumCols(A_offd); HYPRE_BigInt *col_map_offd_A = hypre_ParCSRMatrixDeviceColMapOffd(A); HYPRE_BigInt *col_map_offd_A_new; HYPRE_Int num_cols_A_offd_new; hypre_CSRMatrixCompressColumnsDevice(A_offd, col_map_offd_A, NULL, &col_map_offd_A_new); num_cols_A_offd_new = hypre_CSRMatrixNumCols(A_offd); if (num_cols_A_offd_new < num_cols_A_offd) { hypre_TFree(col_map_offd_A, HYPRE_MEMORY_DEVICE); hypre_ParCSRMatrixDeviceColMapOffd(A) = col_map_offd_A_new; hypre_ParCSRMatrixColMapOffd(A) = hypre_TReAlloc(hypre_ParCSRMatrixColMapOffd(A), HYPRE_BigInt, num_cols_A_offd_new, HYPRE_MEMORY_HOST); hypre_TMemcpy(hypre_ParCSRMatrixColMapOffd(A), hypre_ParCSRMatrixDeviceColMapOffd(A), HYPRE_BigInt, num_cols_A_offd_new, HYPRE_MEMORY_HOST, HYPRE_MEMORY_DEVICE); } hypre_GpuProfilingPopRange(); return hypre_error_flag; } /* Get element-wise tolerances based on row norms for ParCSRMatrix * NOTE: Keep the diagonal, i.e. elmt_tol = 0.0 for diagonals * Output vectors have size nnz: * elmt_tols_diag[j] = tol * (norm of row i) for j in [ A_diag_i[i] , A_diag_i[i+1] ) * elmt_tols_offd[j] = tol * (norm of row i) for j in [ A_offd_i[i] , A_offd_i[i+1] ) * type == -1, infinity norm, * 1, 1-norm * 2, 2-norm */ template __global__ void hypre_ParCSRMatrixDropSmallEntriesDevice_getElmtTols( hypre_DeviceItem &item, HYPRE_Int nrows, HYPRE_Real tol, HYPRE_Int *A_diag_i, HYPRE_Int *A_diag_j, HYPRE_Complex *A_diag_a, HYPRE_Int *A_offd_i, HYPRE_Complex *A_offd_a, HYPRE_Real *elmt_tols_diag, HYPRE_Real *elmt_tols_offd) { HYPRE_Int row_i = hypre_gpu_get_grid_warp_id<1, 1>(item); if (row_i >= nrows) { return; } HYPRE_Int lane = hypre_gpu_get_lane_id<1>(item); HYPRE_Int p_diag = 0, p_offd = 0, q_diag, q_offd; /* sum row norm over diag part */ if (lane < 2) { p_diag = read_only_load(A_diag_i + row_i + lane); } q_diag = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, p_diag, 1); p_diag = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, p_diag, 0); HYPRE_Real row_norm_i = 0.0; for (HYPRE_Int j = p_diag + lane; j < q_diag; j += HYPRE_WARP_SIZE) { HYPRE_Complex val = A_diag_a[j]; if (type == -1) { row_norm_i = hypre_max(row_norm_i, hypre_cabs(val)); } else if (type == 1) { row_norm_i += hypre_cabs(val); } else if (type == 2) { row_norm_i += val * val; } } /* sum row norm over offd part */ if (lane < 2) { p_offd = read_only_load(A_offd_i + row_i + lane); } q_offd = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, p_offd, 1); p_offd = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, p_offd, 0); for (HYPRE_Int j = p_offd + lane; j < q_offd; j += HYPRE_WARP_SIZE) { HYPRE_Complex val = A_offd_a[j]; if (type == -1) { row_norm_i = hypre_max(row_norm_i, hypre_cabs(val)); } else if (type == 1) { row_norm_i += hypre_cabs(val); } else if (type == 2) { row_norm_i += val * val; } } /* allreduce to get the row norm on all threads */ if (type == -1) { row_norm_i = warp_allreduce_max(item, row_norm_i); } else { row_norm_i = warp_allreduce_sum(item, row_norm_i); } if (type == 2) { row_norm_i = hypre_sqrt(row_norm_i); } /* set elmt_tols_diag */ for (HYPRE_Int j = p_diag + lane; j < q_diag; j += HYPRE_WARP_SIZE) { HYPRE_Int col = A_diag_j[j]; /* elmt_tol = 0.0 ensures diagonal will be kept */ if (col == row_i) { elmt_tols_diag[j] = 0.0; } else { elmt_tols_diag[j] = tol * row_norm_i; } } /* set elmt_tols_offd */ for (HYPRE_Int j = p_offd + lane; j < q_offd; j += HYPRE_WARP_SIZE) { elmt_tols_offd[j] = tol * row_norm_i; } } /* drop the entries that are not on the diagonal and smaller than: * type 0: tol * type 1: tol*(1-norm of row) * type 2: tol*(2-norm of row) * type -1: tol*(infinity norm of row) */ HYPRE_Int hypre_ParCSRMatrixDropSmallEntriesDevice( hypre_ParCSRMatrix *A, HYPRE_Complex tol, HYPRE_Int type) { hypre_CSRMatrix *A_diag = hypre_ParCSRMatrixDiag(A); hypre_CSRMatrix *A_offd = hypre_ParCSRMatrixOffd(A); HYPRE_Int num_cols_A_offd = hypre_CSRMatrixNumCols(A_offd); HYPRE_BigInt *h_col_map_offd_A = hypre_ParCSRMatrixColMapOffd(A); HYPRE_BigInt *col_map_offd_A = hypre_ParCSRMatrixDeviceColMapOffd(A); HYPRE_Real *elmt_tols_diag = NULL; HYPRE_Real *elmt_tols_offd = NULL; /* Exit if tolerance is zero */ if (tol < HYPRE_REAL_MIN) { return hypre_error_flag; } hypre_GpuProfilingPushRange("ParCSRMatrixDropSmallEntries"); if (col_map_offd_A == NULL) { col_map_offd_A = hypre_TAlloc(HYPRE_BigInt, num_cols_A_offd, HYPRE_MEMORY_DEVICE); hypre_TMemcpy(col_map_offd_A, h_col_map_offd_A, HYPRE_BigInt, num_cols_A_offd, HYPRE_MEMORY_DEVICE, HYPRE_MEMORY_HOST); hypre_ParCSRMatrixDeviceColMapOffd(A) = col_map_offd_A; } /* get elmement-wise tolerances if needed */ if (type != 0) { elmt_tols_diag = hypre_TAlloc(HYPRE_Real, hypre_CSRMatrixNumNonzeros(A_diag), HYPRE_MEMORY_DEVICE); elmt_tols_offd = hypre_TAlloc(HYPRE_Real, hypre_CSRMatrixNumNonzeros(A_offd), HYPRE_MEMORY_DEVICE); } dim3 bDim = hypre_GetDefaultDeviceBlockDimension(); dim3 gDim = hypre_GetDefaultDeviceGridDimension(hypre_CSRMatrixNumRows(A_diag), "warp", bDim); HYPRE_Int A_diag_nrows = hypre_CSRMatrixNumRows(A_diag); HYPRE_Int *A_diag_i = hypre_CSRMatrixI(A_diag); HYPRE_Int *A_diag_j = hypre_CSRMatrixJ(A_diag); HYPRE_Complex *A_diag_data = hypre_CSRMatrixData(A_diag); HYPRE_Int *A_offd_i = hypre_CSRMatrixI(A_offd); HYPRE_Complex *A_offd_data = hypre_CSRMatrixData(A_offd); if (type == -1) { HYPRE_GPU_LAUNCH( hypre_ParCSRMatrixDropSmallEntriesDevice_getElmtTols < -1 >, gDim, bDim, A_diag_nrows, tol, A_diag_i, A_diag_j, A_diag_data, A_offd_i, A_offd_data, elmt_tols_diag, elmt_tols_offd); } if (type == 1) { HYPRE_GPU_LAUNCH( hypre_ParCSRMatrixDropSmallEntriesDevice_getElmtTols<1>, gDim, bDim, A_diag_nrows, tol, A_diag_i, A_diag_j, A_diag_data, A_offd_i, A_offd_data, elmt_tols_diag, elmt_tols_offd); } if (type == 2) { HYPRE_GPU_LAUNCH( hypre_ParCSRMatrixDropSmallEntriesDevice_getElmtTols<2>, gDim, bDim, A_diag_nrows, tol, A_diag_i, A_diag_j, A_diag_data, A_offd_i, A_offd_data, elmt_tols_diag, elmt_tols_offd); } /* drop entries from diag and offd CSR matrices */ hypre_CSRMatrixDropSmallEntriesDevice(A_diag, tol, elmt_tols_diag); hypre_CSRMatrixDropSmallEntriesDevice(A_offd, tol, elmt_tols_offd); hypre_ParCSRMatrixSetNumNonzeros(A); hypre_ParCSRMatrixDNumNonzeros(A) = (HYPRE_Real) hypre_ParCSRMatrixNumNonzeros(A); /* squeeze out zero columns of A_offd */ hypre_ParCSRMatrixCompressOffdMapDevice(A); if (type != 0) { hypre_TFree(elmt_tols_diag, HYPRE_MEMORY_DEVICE); hypre_TFree(elmt_tols_offd, HYPRE_MEMORY_DEVICE); } hypre_GpuProfilingPopRange(); return hypre_error_flag; } hypre_CSRMatrix* hypre_MergeDiagAndOffdDevice(hypre_ParCSRMatrix *A) { MPI_Comm comm = hypre_ParCSRMatrixComm(A); hypre_CSRMatrix *A_diag = hypre_ParCSRMatrixDiag(A); HYPRE_Complex *A_diag_a = hypre_CSRMatrixData(A_diag); HYPRE_Int *A_diag_i = hypre_CSRMatrixI(A_diag); HYPRE_Int *A_diag_j = hypre_CSRMatrixJ(A_diag); hypre_CSRMatrix *A_offd = hypre_ParCSRMatrixOffd(A); HYPRE_Complex *A_offd_a = hypre_CSRMatrixData(A_offd); HYPRE_Int *A_offd_i = hypre_CSRMatrixI(A_offd); HYPRE_Int *A_offd_j = hypre_CSRMatrixJ(A_offd); HYPRE_Int local_num_rows = hypre_CSRMatrixNumRows(A_diag); HYPRE_BigInt glbal_num_cols = hypre_ParCSRMatrixGlobalNumCols(A); HYPRE_BigInt first_col = hypre_ParCSRMatrixFirstColDiag(A); HYPRE_Int num_cols_A_offd = hypre_CSRMatrixNumCols(A_offd); HYPRE_BigInt *col_map_offd_A = hypre_ParCSRMatrixColMapOffd(A); HYPRE_BigInt *d_col_map_offd_A = hypre_ParCSRMatrixDeviceColMapOffd(A); hypre_CSRMatrix *B; HYPRE_Int B_nrows = local_num_rows; HYPRE_BigInt B_ncols = glbal_num_cols; HYPRE_Int *B_i = hypre_TAlloc(HYPRE_Int, B_nrows + 1, HYPRE_MEMORY_DEVICE); HYPRE_BigInt *B_j; HYPRE_Complex *B_a; HYPRE_Int B_nnz; HYPRE_Int num_procs; hypre_MPI_Comm_size(comm, &num_procs); hypre_Memset(B_i, 0, sizeof(HYPRE_Int), HYPRE_MEMORY_DEVICE); hypreDevice_GetRowNnz(B_nrows, NULL, A_diag_i, A_offd_i, B_i + 1); hypreDevice_IntegerInclusiveScan(B_nrows + 1, B_i); /* total number of nnz */ hypre_TMemcpy(&B_nnz, B_i + B_nrows, HYPRE_Int, 1, HYPRE_MEMORY_HOST, HYPRE_MEMORY_DEVICE); B_j = hypre_TAlloc(HYPRE_BigInt, B_nnz, HYPRE_MEMORY_DEVICE); B_a = hypre_TAlloc(HYPRE_Complex, B_nnz, HYPRE_MEMORY_DEVICE); if (d_col_map_offd_A == NULL) { d_col_map_offd_A = hypre_TAlloc(HYPRE_BigInt, num_cols_A_offd, HYPRE_MEMORY_DEVICE); hypre_TMemcpy(d_col_map_offd_A, col_map_offd_A, HYPRE_BigInt, num_cols_A_offd, HYPRE_MEMORY_DEVICE, HYPRE_MEMORY_HOST); hypre_ParCSRMatrixDeviceColMapOffd(A) = d_col_map_offd_A; } hypreDevice_CopyParCSRRows(B_nrows, NULL, 2, num_procs > 1, first_col, d_col_map_offd_A, A_diag_i, A_diag_j, A_diag_a, A_offd_i, A_offd_j, A_offd_a, B_i, B_j, B_a); /* output */ B = hypre_CSRMatrixCreate(B_nrows, B_ncols, B_nnz); hypre_CSRMatrixI (B) = B_i; hypre_CSRMatrixBigJ(B) = B_j; hypre_CSRMatrixData(B) = B_a; hypre_CSRMatrixMemoryLocation(B) = HYPRE_MEMORY_DEVICE; hypre_SyncComputeStream(); return B; } HYPRE_Int hypre_ParCSRMatrixGetRowDevice( hypre_ParCSRMatrix *mat, HYPRE_BigInt row, HYPRE_Int *size, HYPRE_BigInt **col_ind, HYPRE_Complex **values ) { HYPRE_Int nrows, local_row; HYPRE_BigInt row_start, row_end; hypre_CSRMatrix *Aa; hypre_CSRMatrix *Ba; if (!mat) { hypre_error_in_arg(1); return hypre_error_flag; } Aa = (hypre_CSRMatrix *) hypre_ParCSRMatrixDiag(mat); Ba = (hypre_CSRMatrix *) hypre_ParCSRMatrixOffd(mat); if (hypre_ParCSRMatrixGetrowactive(mat)) { return (-1); } hypre_ParCSRMatrixGetrowactive(mat) = 1; row_start = hypre_ParCSRMatrixFirstRowIndex(mat); row_end = hypre_ParCSRMatrixLastRowIndex(mat) + 1; nrows = row_end - row_start; if (row < row_start || row >= row_end) { return (-1); } local_row = row - row_start; /* if buffer is not allocated and some information is requested, allocate buffer with the max row_nnz */ if ( !hypre_ParCSRMatrixRowvalues(mat) && (col_ind || values) ) { HYPRE_Int max_row_nnz; HYPRE_Int *row_nnz = hypre_TAlloc(HYPRE_Int, nrows, HYPRE_MEMORY_DEVICE); hypreDevice_GetRowNnz(nrows, NULL, hypre_CSRMatrixI(Aa), hypre_CSRMatrixI(Ba), row_nnz); hypre_TMemcpy(size, row_nnz + local_row, HYPRE_Int, 1, HYPRE_MEMORY_HOST, HYPRE_MEMORY_DEVICE); #if defined(HYPRE_USING_SYCL) max_row_nnz = HYPRE_ONEDPL_CALL(std::reduce, row_nnz, row_nnz + nrows, 0, oneapi::dpl::maximum()); #else max_row_nnz = HYPRE_THRUST_CALL(reduce, row_nnz, row_nnz + nrows, 0, thrust::maximum()); #endif /* HYPRE_Int *max_row_nnz_d = HYPRE_THRUST_CALL(max_element, row_nnz, row_nnz + nrows); hypre_TMemcpy( &max_row_nnz, max_row_nnz_d, HYPRE_Int, 1, HYPRE_MEMORY_HOST, HYPRE_MEMORY_DEVICE ); */ hypre_TFree(row_nnz, HYPRE_MEMORY_DEVICE); hypre_ParCSRMatrixRowvalues(mat) = (HYPRE_Complex *) hypre_TAlloc(HYPRE_Complex, max_row_nnz, hypre_ParCSRMatrixMemoryLocation(mat)); hypre_ParCSRMatrixRowindices(mat) = (HYPRE_BigInt *) hypre_TAlloc(HYPRE_BigInt, max_row_nnz, hypre_ParCSRMatrixMemoryLocation(mat)); } else { HYPRE_Int *size_d = hypre_TAlloc(HYPRE_Int, 1, HYPRE_MEMORY_DEVICE); hypreDevice_GetRowNnz(1, NULL, hypre_CSRMatrixI(Aa) + local_row, hypre_CSRMatrixI(Ba) + local_row, size_d); hypre_TMemcpy(size, size_d, HYPRE_Int, 1, HYPRE_MEMORY_HOST, HYPRE_MEMORY_DEVICE); hypre_TFree(size_d, HYPRE_MEMORY_DEVICE); } if (col_ind || values) { if (hypre_ParCSRMatrixDeviceColMapOffd(mat) == NULL) { hypre_ParCSRMatrixDeviceColMapOffd(mat) = hypre_TAlloc(HYPRE_BigInt, hypre_CSRMatrixNumCols(Ba), HYPRE_MEMORY_DEVICE); hypre_TMemcpy( hypre_ParCSRMatrixDeviceColMapOffd(mat), hypre_ParCSRMatrixColMapOffd(mat), HYPRE_BigInt, hypre_CSRMatrixNumCols(Ba), HYPRE_MEMORY_DEVICE, HYPRE_MEMORY_HOST ); } hypreDevice_CopyParCSRRows( 1, NULL, -1, Ba != NULL, hypre_ParCSRMatrixFirstColDiag(mat), hypre_ParCSRMatrixDeviceColMapOffd(mat), hypre_CSRMatrixI(Aa) + local_row, hypre_CSRMatrixJ(Aa), hypre_CSRMatrixData(Aa), hypre_CSRMatrixI(Ba) + local_row, hypre_CSRMatrixJ(Ba), hypre_CSRMatrixData(Ba), NULL, hypre_ParCSRMatrixRowindices(mat), hypre_ParCSRMatrixRowvalues(mat) ); } if (col_ind) { *col_ind = hypre_ParCSRMatrixRowindices(mat); } if (values) { *values = hypre_ParCSRMatrixRowvalues(mat); } hypre_SyncComputeStream(); return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_ParCSRMatrixTransposeDevice *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ParCSRMatrixTransposeDevice( hypre_ParCSRMatrix *A, hypre_ParCSRMatrix **AT_ptr, HYPRE_Int data ) { hypre_CSRMatrix *A_diag = hypre_ParCSRMatrixDiag(A); hypre_CSRMatrix *A_offd = hypre_ParCSRMatrixOffd(A); hypre_CSRMatrix *A_diagT; hypre_CSRMatrix *AT_offd; HYPRE_Int num_procs; HYPRE_Int num_cols_offd_AT = 0; HYPRE_BigInt *col_map_offd_AT = NULL; hypre_ParCSRMatrix *AT; hypre_MPI_Comm_size(hypre_ParCSRMatrixComm(A), &num_procs); if (num_procs > 1) { void *request; hypre_CSRMatrix *A_offdT, *Aext; HYPRE_Int *Aext_ii, *Aext_j, Aext_nnz; HYPRE_Complex *Aext_data; HYPRE_BigInt *tmp_bigj; hypre_CSRMatrixTranspose(A_offd, &A_offdT, data); hypre_CSRMatrixBigJ(A_offdT) = hypre_TAlloc(HYPRE_BigInt, hypre_CSRMatrixNumNonzeros(A_offdT), HYPRE_MEMORY_DEVICE); #if defined(HYPRE_USING_SYCL) HYPRE_ONEDPL_CALL( std::transform, hypre_CSRMatrixJ(A_offdT), hypre_CSRMatrixJ(A_offdT) + hypre_CSRMatrixNumNonzeros(A_offdT), hypre_CSRMatrixBigJ(A_offdT), [y = hypre_ParCSRMatrixFirstRowIndex(A)] (const auto & x) {return x + y;} ); #else HYPRE_THRUST_CALL( transform, hypre_CSRMatrixJ(A_offdT), hypre_CSRMatrixJ(A_offdT) + hypre_CSRMatrixNumNonzeros(A_offdT), thrust::make_constant_iterator(hypre_ParCSRMatrixFirstRowIndex(A)), hypre_CSRMatrixBigJ(A_offdT), thrust::plus() ); #endif #if defined(HYPRE_USING_THRUST_NOSYNC) /* RL: make sure A_offdT is ready before issuing GPU-GPU MPI */ if (hypre_GetGpuAwareMPI()) { hypre_ForceSyncComputeStream(); } #endif if (!hypre_ParCSRMatrixCommPkg(A)) { hypre_MatvecCommPkgCreate(A); } hypre_ExchangeExternalRowsDeviceInit(A_offdT, hypre_ParCSRMatrixCommPkg(A), data, &request); hypre_CSRMatrixTranspose(A_diag, &A_diagT, data); Aext = hypre_ExchangeExternalRowsDeviceWait(request); hypre_CSRMatrixDestroy(A_offdT); // Aext contains offd of AT Aext_nnz = hypre_CSRMatrixNumNonzeros(Aext); Aext_ii = hypreDevice_CsrRowPtrsToIndices(hypre_CSRMatrixNumRows(Aext), Aext_nnz, hypre_CSRMatrixI(Aext)); hypre_ParCSRCommPkgCopySendMapElmtsToDevice(hypre_ParCSRMatrixCommPkg(A)); #if defined(HYPRE_USING_SYCL) hypreSycl_gather( Aext_ii, Aext_ii + Aext_nnz, hypre_ParCSRCommPkgDeviceSendMapElmts(hypre_ParCSRMatrixCommPkg(A)), Aext_ii ); #else HYPRE_THRUST_CALL( gather, Aext_ii, Aext_ii + Aext_nnz, hypre_ParCSRCommPkgDeviceSendMapElmts(hypre_ParCSRMatrixCommPkg(A)), Aext_ii ); #endif tmp_bigj = hypre_TAlloc(HYPRE_BigInt, Aext_nnz, HYPRE_MEMORY_DEVICE); hypre_TMemcpy(tmp_bigj, hypre_CSRMatrixBigJ(Aext), HYPRE_BigInt, Aext_nnz, HYPRE_MEMORY_DEVICE, HYPRE_MEMORY_DEVICE); #if defined(HYPRE_USING_SYCL) HYPRE_ONEDPL_CALL( std::sort, tmp_bigj, tmp_bigj + Aext_nnz ); HYPRE_BigInt *new_end = HYPRE_ONEDPL_CALL( std::unique, tmp_bigj, tmp_bigj + Aext_nnz ); #else HYPRE_THRUST_CALL( sort, tmp_bigj, tmp_bigj + Aext_nnz ); HYPRE_BigInt *new_end = HYPRE_THRUST_CALL( unique, tmp_bigj, tmp_bigj + Aext_nnz ); #endif num_cols_offd_AT = new_end - tmp_bigj; col_map_offd_AT = hypre_TAlloc(HYPRE_BigInt, num_cols_offd_AT, HYPRE_MEMORY_DEVICE); hypre_TMemcpy(col_map_offd_AT, tmp_bigj, HYPRE_BigInt, num_cols_offd_AT, HYPRE_MEMORY_DEVICE, HYPRE_MEMORY_DEVICE); hypre_TFree(tmp_bigj, HYPRE_MEMORY_DEVICE); Aext_j = hypre_TAlloc(HYPRE_Int, Aext_nnz, HYPRE_MEMORY_DEVICE); #if defined(HYPRE_USING_SYCL) HYPRE_ONEDPL_CALL( oneapi::dpl::lower_bound, col_map_offd_AT, col_map_offd_AT + num_cols_offd_AT, hypre_CSRMatrixBigJ(Aext), hypre_CSRMatrixBigJ(Aext) + Aext_nnz, Aext_j ); #else HYPRE_THRUST_CALL( lower_bound, col_map_offd_AT, col_map_offd_AT + num_cols_offd_AT, hypre_CSRMatrixBigJ(Aext), hypre_CSRMatrixBigJ(Aext) + Aext_nnz, Aext_j ); #endif Aext_data = hypre_CSRMatrixData(Aext); hypre_CSRMatrixData(Aext) = NULL; hypre_CSRMatrixDestroy(Aext); if (data) { hypreDevice_StableSortByTupleKey(Aext_nnz, Aext_ii, Aext_j, Aext_data, 0); } else { #if defined(HYPRE_USING_SYCL) HYPRE_ONEDPL_CALL( std::stable_sort, oneapi::dpl::make_zip_iterator(Aext_ii, Aext_j), oneapi::dpl::make_zip_iterator(Aext_ii, Aext_j) + Aext_nnz, [] (const auto & x, const auto & y) {return std::get<0>(x) < std::get<0>(y);} ); #else HYPRE_THRUST_CALL( stable_sort, thrust::make_zip_iterator(thrust::make_tuple(Aext_ii, Aext_j)), thrust::make_zip_iterator(thrust::make_tuple(Aext_ii, Aext_j)) + Aext_nnz ); #endif } AT_offd = hypre_CSRMatrixCreate(hypre_ParCSRMatrixNumCols(A), num_cols_offd_AT, Aext_nnz); hypre_CSRMatrixJ(AT_offd) = Aext_j; hypre_CSRMatrixData(AT_offd) = Aext_data; hypre_CSRMatrixInitialize_v2(AT_offd, 0, HYPRE_MEMORY_DEVICE); hypreDevice_CsrRowIndicesToPtrs_v2(hypre_CSRMatrixNumRows(AT_offd), Aext_nnz, Aext_ii, hypre_CSRMatrixI(AT_offd)); hypre_TFree(Aext_ii, HYPRE_MEMORY_DEVICE); } else { hypre_CSRMatrixTransposeDevice(A_diag, &A_diagT, data); AT_offd = hypre_CSRMatrixCreate(hypre_ParCSRMatrixNumCols(A), 0, 0); hypre_CSRMatrixInitialize_v2(AT_offd, 0, HYPRE_MEMORY_DEVICE); } AT = hypre_ParCSRMatrixCreate(hypre_ParCSRMatrixComm(A), hypre_ParCSRMatrixGlobalNumCols(A), hypre_ParCSRMatrixGlobalNumRows(A), hypre_ParCSRMatrixColStarts(A), hypre_ParCSRMatrixRowStarts(A), num_cols_offd_AT, hypre_CSRMatrixNumNonzeros(A_diagT), hypre_CSRMatrixNumNonzeros(AT_offd)); hypre_CSRMatrixDestroy(hypre_ParCSRMatrixDiag(AT)); hypre_ParCSRMatrixDiag(AT) = A_diagT; hypre_CSRMatrixDestroy(hypre_ParCSRMatrixOffd(AT)); hypre_ParCSRMatrixOffd(AT) = AT_offd; if (num_cols_offd_AT) { hypre_ParCSRMatrixDeviceColMapOffd(AT) = col_map_offd_AT; hypre_ParCSRMatrixColMapOffd(AT) = hypre_TAlloc(HYPRE_BigInt, num_cols_offd_AT, HYPRE_MEMORY_HOST); hypre_TMemcpy(hypre_ParCSRMatrixColMapOffd(AT), col_map_offd_AT, HYPRE_BigInt, num_cols_offd_AT, HYPRE_MEMORY_HOST, HYPRE_MEMORY_DEVICE); } *AT_ptr = AT; return hypre_error_flag; } HYPRE_Int hypre_ParCSRMatrixAddDevice( HYPRE_Complex alpha, hypre_ParCSRMatrix *A, HYPRE_Complex beta, hypre_ParCSRMatrix *B, hypre_ParCSRMatrix **C_ptr ) { hypre_CSRMatrix *A_diag = hypre_ParCSRMatrixDiag(A); hypre_CSRMatrix *A_offd = hypre_ParCSRMatrixOffd(A); hypre_CSRMatrix *B_diag = hypre_ParCSRMatrixDiag(B); hypre_CSRMatrix *B_offd = hypre_ParCSRMatrixOffd(B); HYPRE_Int num_cols_offd_A = hypre_CSRMatrixNumCols(A_offd); HYPRE_Int num_cols_offd_B = hypre_CSRMatrixNumCols(B_offd); HYPRE_Int num_cols_offd_C = 0; HYPRE_BigInt *d_col_map_offd_C = NULL; HYPRE_Int num_procs; hypre_MPI_Comm_size(hypre_ParCSRMatrixComm(A), &num_procs); hypre_GpuProfilingPushRange("hypre_ParCSRMatrixAdd"); hypre_CSRMatrix *C_diag = hypre_CSRMatrixAddDevice(alpha, A_diag, beta, B_diag); hypre_CSRMatrix *C_offd; //if (num_cols_offd_A || num_cols_offd_B) if (num_procs > 1) { hypre_ParCSRMatrixCopyColMapOffdToDevice(A); hypre_ParCSRMatrixCopyColMapOffdToDevice(B); HYPRE_BigInt *tmp = hypre_TAlloc(HYPRE_BigInt, num_cols_offd_A + num_cols_offd_B, HYPRE_MEMORY_DEVICE); hypre_TMemcpy(tmp, hypre_ParCSRMatrixDeviceColMapOffd(A), HYPRE_BigInt, num_cols_offd_A, HYPRE_MEMORY_DEVICE, HYPRE_MEMORY_DEVICE); hypre_TMemcpy(tmp + num_cols_offd_A, hypre_ParCSRMatrixDeviceColMapOffd(B), HYPRE_BigInt, num_cols_offd_B, HYPRE_MEMORY_DEVICE, HYPRE_MEMORY_DEVICE); #if defined(HYPRE_USING_SYCL) HYPRE_ONEDPL_CALL( std::sort, tmp, tmp + num_cols_offd_A + num_cols_offd_B ); HYPRE_BigInt *new_end = HYPRE_ONEDPL_CALL( std::unique, tmp, tmp + num_cols_offd_A + num_cols_offd_B ); #else HYPRE_THRUST_CALL( sort, tmp, tmp + num_cols_offd_A + num_cols_offd_B ); HYPRE_BigInt *new_end = HYPRE_THRUST_CALL( unique, tmp, tmp + num_cols_offd_A + num_cols_offd_B ); #endif num_cols_offd_C = new_end - tmp; d_col_map_offd_C = hypre_TAlloc(HYPRE_BigInt, num_cols_offd_C, HYPRE_MEMORY_DEVICE); hypre_TMemcpy(d_col_map_offd_C, tmp, HYPRE_BigInt, num_cols_offd_C, HYPRE_MEMORY_DEVICE, HYPRE_MEMORY_DEVICE); /* reuse memory of tmp */ HYPRE_Int *offd_A2C = (HYPRE_Int *) tmp; HYPRE_Int *offd_B2C = offd_A2C + num_cols_offd_A; #if defined(HYPRE_USING_SYCL) /* WM: todo - getting an error when num_cols_offd_A is zero */ if (num_cols_offd_A > 0) { HYPRE_ONEDPL_CALL( oneapi::dpl::lower_bound, d_col_map_offd_C, d_col_map_offd_C + num_cols_offd_C, hypre_ParCSRMatrixDeviceColMapOffd(A), hypre_ParCSRMatrixDeviceColMapOffd(A) + num_cols_offd_A, offd_A2C ); } /* WM: todo - getting an error when num_cols_offd_B is zero */ if (num_cols_offd_B > 0) { HYPRE_ONEDPL_CALL( oneapi::dpl::lower_bound, d_col_map_offd_C, d_col_map_offd_C + num_cols_offd_C, hypre_ParCSRMatrixDeviceColMapOffd(B), hypre_ParCSRMatrixDeviceColMapOffd(B) + num_cols_offd_B, offd_B2C ); } #else HYPRE_THRUST_CALL( lower_bound, d_col_map_offd_C, d_col_map_offd_C + num_cols_offd_C, hypre_ParCSRMatrixDeviceColMapOffd(A), hypre_ParCSRMatrixDeviceColMapOffd(A) + num_cols_offd_A, offd_A2C ); HYPRE_THRUST_CALL( lower_bound, d_col_map_offd_C, d_col_map_offd_C + num_cols_offd_C, hypre_ParCSRMatrixDeviceColMapOffd(B), hypre_ParCSRMatrixDeviceColMapOffd(B) + num_cols_offd_B, offd_B2C ); #endif HYPRE_Int *C_offd_i, *C_offd_j, nnzC_offd; HYPRE_Complex *C_offd_a; hypreDevice_CSRSpAdd( hypre_CSRMatrixNumRows(A_offd), hypre_CSRMatrixNumRows(B_offd), hypre_CSRMatrixNumNonzeros(A_offd), hypre_CSRMatrixNumNonzeros(B_offd), hypre_CSRMatrixI(A_offd), hypre_CSRMatrixJ(A_offd), alpha, hypre_CSRMatrixData(A_offd), offd_A2C, hypre_CSRMatrixI(B_offd), hypre_CSRMatrixJ(B_offd), beta, hypre_CSRMatrixData(B_offd), offd_B2C, NULL, &nnzC_offd, &C_offd_i, &C_offd_j, &C_offd_a ); hypre_TFree(tmp, HYPRE_MEMORY_DEVICE); C_offd = hypre_CSRMatrixCreate(hypre_CSRMatrixNumRows(A_offd), num_cols_offd_C, nnzC_offd); hypre_CSRMatrixI(C_offd) = C_offd_i; hypre_CSRMatrixJ(C_offd) = C_offd_j; hypre_CSRMatrixData(C_offd) = C_offd_a; hypre_CSRMatrixMemoryLocation(C_offd) = HYPRE_MEMORY_DEVICE; } else { C_offd = hypre_CSRMatrixCreate(hypre_CSRMatrixNumRows(A_offd), 0, 0); hypre_CSRMatrixInitialize_v2(C_offd, 0, HYPRE_MEMORY_DEVICE); } /* Create ParCSRMatrix C */ hypre_ParCSRMatrix *C = hypre_ParCSRMatrixCreate(hypre_ParCSRMatrixComm(A), hypre_ParCSRMatrixGlobalNumRows(A), hypre_ParCSRMatrixGlobalNumCols(A), hypre_ParCSRMatrixRowStarts(A), hypre_ParCSRMatrixColStarts(A), num_cols_offd_C, hypre_CSRMatrixNumNonzeros(C_diag), hypre_CSRMatrixNumNonzeros(C_offd)); hypre_CSRMatrixDestroy(hypre_ParCSRMatrixDiag(C)); hypre_CSRMatrixDestroy(hypre_ParCSRMatrixOffd(C)); hypre_ParCSRMatrixDiag(C) = C_diag; hypre_ParCSRMatrixOffd(C) = C_offd; if (num_cols_offd_C) { hypre_ParCSRMatrixDeviceColMapOffd(C) = d_col_map_offd_C; hypre_ParCSRMatrixColMapOffd(C) = hypre_TAlloc(HYPRE_BigInt, num_cols_offd_C, HYPRE_MEMORY_HOST); hypre_TMemcpy(hypre_ParCSRMatrixColMapOffd(C), d_col_map_offd_C, HYPRE_BigInt, num_cols_offd_C, HYPRE_MEMORY_HOST, HYPRE_MEMORY_DEVICE); } hypre_ParCSRMatrixSetNumNonzeros(C); hypre_ParCSRMatrixDNumNonzeros(C) = (HYPRE_Real) hypre_ParCSRMatrixNumNonzeros(C); /* create CommPkg of C */ hypre_MatvecCommPkgCreate(C); *C_ptr = C; hypre_GpuProfilingPopRange(); return hypre_error_flag; } #endif // #if defined(HYPRE_USING_GPU) #if defined(HYPRE_USING_GPU) || defined(HYPRE_USING_DEVICE_OPENMP) /*-------------------------------------------------------------------------- * hypre_ParCSRMatrixDiagScaleDevice *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ParCSRMatrixDiagScaleDevice( hypre_ParCSRMatrix *par_A, hypre_ParVector *par_ld, hypre_ParVector *par_rd ) { /* Input variables */ hypre_ParCSRCommPkg *comm_pkg = hypre_ParCSRMatrixCommPkg(par_A); hypre_ParCSRCommHandle *comm_handle; HYPRE_Int num_sends; HYPRE_Int *d_send_map_elmts; HYPRE_Int send_map_num_elmts; hypre_CSRMatrix *A_diag = hypre_ParCSRMatrixDiag(par_A); hypre_CSRMatrix *A_offd = hypre_ParCSRMatrixOffd(par_A); HYPRE_Int num_cols_offd = hypre_CSRMatrixNumCols(A_offd); hypre_Vector *ld = (par_ld) ? hypre_ParVectorLocalVector(par_ld) : NULL; hypre_Vector *rd = hypre_ParVectorLocalVector(par_rd); HYPRE_Complex *rd_data = hypre_VectorData(rd); /* Local variables */ hypre_Vector *rdbuf; HYPRE_Complex *recv_rdbuf_data; HYPRE_Complex *send_rdbuf_data; HYPRE_Int sync_stream; /*--------------------------------------------------------------------- * Setup communication info *--------------------------------------------------------------------*/ hypre_GetSyncCudaCompute(&sync_stream); hypre_SetSyncCudaCompute(0); /* Create buffer vectors */ rdbuf = hypre_SeqVectorCreate(num_cols_offd); /* If there exists no CommPkg for A, create it. */ if (!comm_pkg) { hypre_MatvecCommPkgCreate(par_A); comm_pkg = hypre_ParCSRMatrixCommPkg(par_A); } /* Communicate a single vector component */ hypre_ParCSRCommPkgUpdateVecStarts(comm_pkg, hypre_VectorNumVectors(rd), hypre_VectorVectorStride(rd), hypre_VectorIndexStride(rd)); /* send_map_elmts on device */ hypre_ParCSRCommPkgCopySendMapElmtsToDevice(comm_pkg); /* Set variables */ num_sends = hypre_ParCSRCommPkgNumSends(comm_pkg); d_send_map_elmts = hypre_ParCSRCommPkgDeviceSendMapElmts(comm_pkg); send_map_num_elmts = hypre_ParCSRCommPkgSendMapStart(comm_pkg, num_sends); /*--------------------------------------------------------------------- * Allocate/reuse receive data buffer *--------------------------------------------------------------------*/ if (!hypre_ParCSRCommPkgTmpData(comm_pkg)) { hypre_ParCSRCommPkgTmpData(comm_pkg) = hypre_TAlloc(HYPRE_Complex, num_cols_offd, HYPRE_MEMORY_DEVICE); } hypre_VectorData(rdbuf) = recv_rdbuf_data = hypre_ParCSRCommPkgTmpData(comm_pkg); hypre_SeqVectorSetDataOwner(rdbuf, 0); hypre_SeqVectorInitialize_v2(rdbuf, HYPRE_MEMORY_DEVICE); /*--------------------------------------------------------------------- * Allocate/reuse send data buffer *--------------------------------------------------------------------*/ if (!hypre_ParCSRCommPkgBufData(comm_pkg)) { hypre_ParCSRCommPkgBufData(comm_pkg) = hypre_TAlloc(HYPRE_Complex, send_map_num_elmts, HYPRE_MEMORY_DEVICE); } send_rdbuf_data = hypre_ParCSRCommPkgBufData(comm_pkg); /*--------------------------------------------------------------------- * Pack send data *--------------------------------------------------------------------*/ #if defined(HYPRE_USING_DEVICE_OPENMP) HYPRE_Int i; #pragma omp target teams distribute parallel for private(i) is_device_ptr(send_rdbuf_data, rd_data, d_send_map_elmts) for (i = 0; i < send_map_num_elmts; i++) { send_rdbuf_data[i] = rd_data[d_send_map_elmts[i]]; } #else #if defined(HYPRE_USING_SYCL) auto permuted_source = oneapi::dpl::make_permutation_iterator(rd_data, d_send_map_elmts); HYPRE_ONEDPL_CALL( std::copy, permuted_source, permuted_source + send_map_num_elmts, send_rdbuf_data ); #else HYPRE_THRUST_CALL( gather, d_send_map_elmts, d_send_map_elmts + send_map_num_elmts, rd_data, send_rdbuf_data ); #endif #endif #if defined(HYPRE_USING_THRUST_NOSYNC) /* make sure send_rdbuf_data is ready before issuing GPU-GPU MPI */ if (hypre_GetGpuAwareMPI()) { hypre_ForceSyncComputeStream(); } #endif /* A_diag = diag(ld) * A_diag * diag(rd) */ hypre_CSRMatrixDiagScale(A_diag, ld, rd); /* Communication phase */ comm_handle = hypre_ParCSRCommHandleCreate_v2(1, comm_pkg, HYPRE_MEMORY_DEVICE, send_rdbuf_data, HYPRE_MEMORY_DEVICE, recv_rdbuf_data); hypre_ParCSRCommHandleDestroy(comm_handle); /* A_offd = diag(ld) * A_offd * diag(rd) */ hypre_CSRMatrixDiagScale(A_offd, ld, rdbuf); #if defined(HYPRE_USING_GPU) /*--------------------------------------------------------------------- * Synchronize calls *--------------------------------------------------------------------*/ hypre_SetSyncCudaCompute(sync_stream); hypre_SyncComputeStream(); #endif /* Free memory */ hypre_SeqVectorDestroy(rdbuf); return hypre_error_flag; } /*-------------------------------------------------------------------------- * HYPRE_ParCSRDiagScaleVectorDevice *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ParCSRDiagScaleVectorDevice( hypre_ParCSRMatrix *par_A, hypre_ParVector *par_y, hypre_ParVector *par_x ) { /* Local Matrix and Vectors */ hypre_CSRMatrix *A_diag = hypre_ParCSRMatrixDiag(par_A); hypre_Vector *x = hypre_ParVectorLocalVector(par_x); hypre_Vector *y = hypre_ParVectorLocalVector(par_y); /* Local vector x info */ HYPRE_Complex *x_data = hypre_VectorData(x); HYPRE_Int x_size = hypre_VectorSize(x); HYPRE_Int x_num_vectors = hypre_VectorNumVectors(x); HYPRE_Int x_vecstride = hypre_VectorVectorStride(x); /* Local vector y info */ HYPRE_Complex *y_data = hypre_VectorData(y); HYPRE_Int y_size = hypre_VectorSize(y); HYPRE_Int y_num_vectors = hypre_VectorNumVectors(y); HYPRE_Int y_vecstride = hypre_VectorVectorStride(y); /* Local matrix A info */ HYPRE_Int num_rows = hypre_CSRMatrixNumRows(A_diag); HYPRE_Int *A_i = hypre_CSRMatrixI(A_diag); HYPRE_Complex *A_data = hypre_CSRMatrixData(A_diag); /* Sanity checks */ hypre_assert(x_vecstride == x_size); hypre_assert(y_vecstride == y_size); hypre_assert(x_num_vectors == y_num_vectors); hypre_GpuProfilingPushRange("ParCSRDiagScaleVector"); #if defined(HYPRE_USING_DEVICE_OPENMP) HYPRE_Int i; #pragma omp target teams distribute parallel for private(i) is_device_ptr(x_data,y_data,A_data,A_i) for (i = 0; i < num_rows; i++) { x_data[i] = y_data[i] / A_data[A_i[i]]; } #else hypreDevice_DiagScaleVector(x_num_vectors, num_rows, A_i, A_data, y_data, 0.0, x_data); #endif // #if defined(HYPRE_USING_DEVICE_OPENMP) hypre_GpuProfilingPopRange(); return hypre_error_flag; } #endif // #if defined(HYPRE_USING_GPU) || defined(HYPRE_USING_DEVICE_OPENMP) hypre-2.33.0/src/parcsr_mv/par_csr_matop_marked.c000066400000000000000000001455301477326011500220470ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "_hypre_parcsr_mv.h" void hypre_ParCSRMatrixCopy_C( hypre_ParCSRMatrix * P, hypre_ParCSRMatrix * C, HYPRE_Int * CF_marker ); void hypre_ParCSRMatrixZero_F( hypre_ParCSRMatrix * P, HYPRE_Int * CF_marker ); void hypre_ParMatmul_RowSizes_Marked( HYPRE_Int ** C_diag_i, HYPRE_Int ** C_offd_i, HYPRE_Int ** B_marker, HYPRE_Int * A_diag_i, HYPRE_Int * A_diag_j, HYPRE_Int * A_offd_i, HYPRE_Int * A_offd_j, HYPRE_Int * B_diag_i, HYPRE_Int * B_diag_j, HYPRE_Int * B_offd_i, HYPRE_Int * B_offd_j, HYPRE_Int * B_ext_diag_i, HYPRE_Int * B_ext_diag_j, HYPRE_Int * B_ext_offd_i, HYPRE_Int * B_ext_offd_j, HYPRE_Int * map_B_to_C, HYPRE_Int *C_diag_size, HYPRE_Int *C_offd_size, HYPRE_Int num_rows_diag_A, HYPRE_Int num_cols_offd_A, HYPRE_Int allsquare, HYPRE_Int num_cols_diag_B, HYPRE_Int num_cols_offd_B, HYPRE_Int num_cols_offd_C, HYPRE_Int * CF_marker, HYPRE_Int * dof_func, HYPRE_Int * dof_func_offd ) /* Compute row sizes of result of a matrix multiplication A*B. But we only consider rows designated by CF_marker(i)<0 ("Fine" rows). This function is the same as hypre_ParMatmul_RowSizes,but with a little code added to use the marker array. Input arguments like num_rows_diag_A should refer to the full size matrix A, not just the "Fine" part. The principle here is that A and B have coarse+fine data, C only has fine data. But C is the full size of the product A*B. */ { HYPRE_Int i1, i2, i3, jj2, jj3; HYPRE_Int jj_count_diag, jj_count_offd, jj_row_begin_diag, jj_row_begin_offd; HYPRE_Int start_indexing = 0; /* start indexing for C_data at 0 */ /* First pass begins here. Computes sizes of marked C rows. Arrays computed: C_diag_i, C_offd_i, B_marker Arrays needed: (11, all HYPRE_Int*) A_diag_i, A_diag_j, A_offd_i, A_offd_j, B_diag_i, B_diag_j, B_offd_i, B_offd_j, B_ext_i, B_ext_j, col_map_offd_B, col_map_offd_B, B_offd_i, B_offd_j, B_ext_i, B_ext_j, Scalars computed: C_diag_size, C_offd_size Scalars needed: num_rows_diag_A, num_rows_diag_A, num_cols_offd_A, allsquare, first_col_diag_B, n_cols_B, num_cols_offd_B, num_cols_diag_B */ *C_diag_i = hypre_CTAlloc(HYPRE_Int, num_rows_diag_A + 1, HYPRE_MEMORY_HOST); *C_offd_i = hypre_CTAlloc(HYPRE_Int, num_rows_diag_A + 1, HYPRE_MEMORY_HOST); /* ... CTAlloc initializes to 0, so entries ignored due to CF_marker will be returned as 0 */ jj_count_diag = start_indexing; jj_count_offd = start_indexing; for (i1 = 0; i1 < num_cols_diag_B + num_cols_offd_C; i1++) { (*B_marker)[i1] = -1; } /*----------------------------------------------------------------------- * Loop over rows of A *-----------------------------------------------------------------------*/ for (i1 = 0; i1 < num_rows_diag_A; i1++) if ( CF_marker[i1] >= 0 ) /* Coarse row */ { /* To make an empty C row i1, its begin point should be the same as for * i1: */ /* (*C_diag_i)[i1] = jj_count_diag; (*C_offd_i)[i1] = jj_count_offd;*/ /* To make the C row i1 the same size as the B row i1: */ jj_row_begin_diag = jj_count_diag; jj_row_begin_offd = jj_count_offd; jj_count_diag += B_diag_i[i1 + 1] - B_diag_i[i1]; jj_count_offd += B_offd_i[i1 + 1] - B_offd_i[i1]; (*C_diag_i)[i1] = jj_row_begin_diag; (*C_offd_i)[i1] = jj_row_begin_offd; } else { /* This block, most of of this function, is unchanged from hypre_ParMatmul_Row_Sizes (except for the dof_func checks, which are effectively gone if you set dof_func=NULL); maybe it can be spun off into a separate shared function.*/ /*-------------------------------------------------------------------- * Set marker for diagonal entry, C_{i1,i1} (for square matrices). *--------------------------------------------------------------------*/ jj_row_begin_diag = jj_count_diag; jj_row_begin_offd = jj_count_offd; if ( allsquare ) { (*B_marker)[i1] = jj_count_diag; jj_count_diag++; } /*----------------------------------------------------------------- * Loop over entries in row i1 of A_offd. *-----------------------------------------------------------------*/ if (num_cols_offd_A) { for (jj2 = A_offd_i[i1]; jj2 < A_offd_i[i1 + 1]; jj2++) { i2 = A_offd_j[jj2]; if ( dof_func == NULL || dof_func[i1] == dof_func_offd[i2] ) { /* interpolate only like "functions" */ /*----------------------------------------------------------- * Loop over entries in row i2 of B_ext. *-----------------------------------------------------------*/ for (jj3 = B_ext_offd_i[i2]; jj3 < B_ext_offd_i[i2 + 1]; jj3++) { i3 = num_cols_diag_B + B_ext_offd_j[jj3]; /*-------------------------------------------------------- * Check B_marker to see that C_{i1,i3} has not already * been accounted for. If it has not, mark it and increment * counter. *--------------------------------------------------------*/ if ((*B_marker)[i3] < jj_row_begin_offd) { (*B_marker)[i3] = jj_count_offd; jj_count_offd++; } } for (jj3 = B_ext_diag_i[i2]; jj3 < B_ext_diag_i[i2 + 1]; jj3++) { i3 = B_ext_diag_j[jj3]; if ((*B_marker)[i3] < jj_row_begin_diag) { (*B_marker)[i3] = jj_count_diag; jj_count_diag++; } } } } } /*----------------------------------------------------------------- * Loop over entries in row i1 of A_diag. *-----------------------------------------------------------------*/ for (jj2 = A_diag_i[i1]; jj2 < A_diag_i[i1 + 1]; jj2++) { i2 = A_diag_j[jj2]; if ( dof_func == NULL || dof_func[i1] == dof_func[i2] ) { /* interpolate only like "functions" */ /*----------------------------------------------------------- * Loop over entries in row i2 of B_diag. *-----------------------------------------------------------*/ for (jj3 = B_diag_i[i2]; jj3 < B_diag_i[i2 + 1]; jj3++) { i3 = B_diag_j[jj3]; /*-------------------------------------------------------- * Check B_marker to see that C_{i1,i3} has not already * been accounted for. If it has not, mark it and increment * counter. *--------------------------------------------------------*/ if ((*B_marker)[i3] < jj_row_begin_diag) { (*B_marker)[i3] = jj_count_diag; jj_count_diag++; } } /*----------------------------------------------------------- * Loop over entries in row i2 of B_offd. *-----------------------------------------------------------*/ if (num_cols_offd_B) { for (jj3 = B_offd_i[i2]; jj3 < B_offd_i[i2 + 1]; jj3++) { i3 = num_cols_diag_B + map_B_to_C[B_offd_j[jj3]]; /*-------------------------------------------------------- * Check B_marker to see that C_{i1,i3} has not already * been accounted for. If it has not, mark it and increment * counter. *--------------------------------------------------------*/ if ((*B_marker)[i3] < jj_row_begin_offd) { (*B_marker)[i3] = jj_count_offd; jj_count_offd++; } } } } } /*-------------------------------------------------------------------- * Set C_diag_i and C_offd_i for this row. *--------------------------------------------------------------------*/ (*C_diag_i)[i1] = jj_row_begin_diag; (*C_offd_i)[i1] = jj_row_begin_offd; } (*C_diag_i)[num_rows_diag_A] = jj_count_diag; (*C_offd_i)[num_rows_diag_A] = jj_count_offd; /*----------------------------------------------------------------------- * Allocate C_diag_data and C_diag_j arrays. * Allocate C_offd_data and C_offd_j arrays. *-----------------------------------------------------------------------*/ *C_diag_size = jj_count_diag; *C_offd_size = jj_count_offd; /* End of First Pass */ } hypre_ParCSRMatrix * hypre_ParMatmul_FC( hypre_ParCSRMatrix * A, hypre_ParCSRMatrix * P, HYPRE_Int * CF_marker, HYPRE_Int * dof_func, HYPRE_Int * dof_func_offd ) /* hypre_parMatmul_FC creates and returns the "Fine"-designated rows of the matrix product A*P. A's size is (nC+nF)*(nC+nF), P's size is (nC+nF)*nC where nC is the number of coarse rows/columns, nF the number of fine rows/columns. The size of C=A*P is (nC+nF)*nC, even though not all rows of C are actually computed. If we were to construct a matrix consisting only of the computed rows of C, its size would be nF*nC. "Fine" is defined solely by the marker array, and for example could be a proper subset of the fine points of a multigrid hierarchy. */ { /* To compute a submatrix of C containing only the computed data, i.e. only "Fine" rows, we would have to do a lot of computational work, with a lot of communication. The communication is because such a matrix would need global information that depends on which rows are "Fine". */ MPI_Comm comm = hypre_ParCSRMatrixComm(A); hypre_CSRMatrix *A_diag = hypre_ParCSRMatrixDiag(A); HYPRE_Complex *A_diag_data = hypre_CSRMatrixData(A_diag); HYPRE_Int *A_diag_i = hypre_CSRMatrixI(A_diag); HYPRE_Int *A_diag_j = hypre_CSRMatrixJ(A_diag); hypre_CSRMatrix *A_offd = hypre_ParCSRMatrixOffd(A); HYPRE_Complex *A_offd_data = hypre_CSRMatrixData(A_offd); HYPRE_Int *A_offd_i = hypre_CSRMatrixI(A_offd); HYPRE_Int *A_offd_j = hypre_CSRMatrixJ(A_offd); HYPRE_BigInt *row_starts_A = hypre_ParCSRMatrixRowStarts(A); HYPRE_Int num_rows_diag_A = hypre_CSRMatrixNumRows(A_diag); HYPRE_Int num_cols_diag_A = hypre_CSRMatrixNumCols(A_diag); HYPRE_Int num_cols_offd_A = hypre_CSRMatrixNumCols(A_offd); hypre_CSRMatrix *P_diag = hypre_ParCSRMatrixDiag(P); HYPRE_Complex *P_diag_data = hypre_CSRMatrixData(P_diag); HYPRE_Int *P_diag_i = hypre_CSRMatrixI(P_diag); HYPRE_Int *P_diag_j = hypre_CSRMatrixJ(P_diag); hypre_CSRMatrix *P_offd = hypre_ParCSRMatrixOffd(P); HYPRE_BigInt *col_map_offd_P = hypre_ParCSRMatrixColMapOffd(P); HYPRE_Complex *P_offd_data = hypre_CSRMatrixData(P_offd); HYPRE_Int *P_offd_i = hypre_CSRMatrixI(P_offd); HYPRE_Int *P_offd_j = hypre_CSRMatrixJ(P_offd); HYPRE_BigInt first_col_diag_P = hypre_ParCSRMatrixFirstColDiag(P); HYPRE_BigInt last_col_diag_P; HYPRE_BigInt *col_starts_P = hypre_ParCSRMatrixColStarts(P); HYPRE_Int num_rows_diag_P = hypre_CSRMatrixNumRows(P_diag); HYPRE_Int num_cols_diag_P = hypre_CSRMatrixNumCols(P_diag); HYPRE_Int num_cols_offd_P = hypre_CSRMatrixNumCols(P_offd); hypre_ParCSRMatrix *C; HYPRE_BigInt *col_map_offd_C; HYPRE_Int *map_P_to_C = NULL; hypre_CSRMatrix *C_diag; HYPRE_Complex *C_diag_data; HYPRE_Int *C_diag_i; HYPRE_Int *C_diag_j; hypre_CSRMatrix *C_offd; HYPRE_Complex *C_offd_data = NULL; HYPRE_Int *C_offd_i = NULL; HYPRE_Int *C_offd_j = NULL; HYPRE_Int C_diag_size; HYPRE_Int C_offd_size; HYPRE_Int num_cols_offd_C = 0; hypre_CSRMatrix *Ps_ext = NULL; HYPRE_Complex *Ps_ext_data = NULL; HYPRE_Int *Ps_ext_i = NULL; HYPRE_BigInt *Ps_ext_j = NULL; HYPRE_Complex *P_ext_diag_data = NULL; HYPRE_Int *P_ext_diag_i; HYPRE_Int *P_ext_diag_j = NULL; HYPRE_Int P_ext_diag_size; HYPRE_Complex *P_ext_offd_data = NULL; HYPRE_Int *P_ext_offd_i; HYPRE_Int *P_ext_offd_j = NULL; HYPRE_BigInt *P_ext_tmp_j = NULL; HYPRE_Int P_ext_offd_size; HYPRE_Int *P_marker; HYPRE_BigInt *temp; HYPRE_Int i, j; HYPRE_Int i1, i2, i3; HYPRE_Int jj2, jj3; HYPRE_Int jj_count_diag, jj_count_offd; HYPRE_Int jj_row_begin_diag, jj_row_begin_offd; HYPRE_Int start_indexing = 0; /* start indexing for C_data at 0 */ HYPRE_BigInt n_rows_A_global, n_cols_A_global; HYPRE_BigInt n_rows_P_global, n_cols_P_global; HYPRE_Int allsquare = 0; HYPRE_Int cnt, cnt_offd, cnt_diag; HYPRE_Int num_procs; HYPRE_BigInt value; HYPRE_Complex a_entry; HYPRE_Complex a_b_product; n_rows_A_global = hypre_ParCSRMatrixGlobalNumRows(A); n_cols_A_global = hypre_ParCSRMatrixGlobalNumCols(A); n_rows_P_global = hypre_ParCSRMatrixGlobalNumRows(P); n_cols_P_global = hypre_ParCSRMatrixGlobalNumCols(P); if (n_cols_A_global != n_rows_P_global || num_cols_diag_A != num_rows_diag_P) { hypre_printf(" Error! Incompatible matrix dimensions!\n"); return NULL; } /* if (num_rows_A==num_cols_P) allsquare = 1; */ /*----------------------------------------------------------------------- * Extract P_ext, i.e. portion of P that is stored on neighbor procs * and needed locally for matrix matrix product *-----------------------------------------------------------------------*/ hypre_MPI_Comm_size(comm, &num_procs); if (num_procs > 1) { /*--------------------------------------------------------------------- * If there exists no CommPkg for A, a CommPkg is generated using * equally load balanced partitionings within * hypre_ParCSRMatrixExtractBExt *--------------------------------------------------------------------*/ Ps_ext = hypre_ParCSRMatrixExtractBExt(P, A, 1); Ps_ext_data = hypre_CSRMatrixData(Ps_ext); Ps_ext_i = hypre_CSRMatrixI(Ps_ext); Ps_ext_j = hypre_CSRMatrixBigJ(Ps_ext); } P_ext_diag_i = hypre_CTAlloc(HYPRE_Int, num_cols_offd_A + 1, HYPRE_MEMORY_HOST); P_ext_offd_i = hypre_CTAlloc(HYPRE_Int, num_cols_offd_A + 1, HYPRE_MEMORY_HOST); P_ext_diag_size = 0; P_ext_offd_size = 0; last_col_diag_P = first_col_diag_P + num_cols_diag_P - 1; for (i = 0; i < num_cols_offd_A; i++) { for (j = Ps_ext_i[i]; j < Ps_ext_i[i + 1]; j++) if (Ps_ext_j[j] < first_col_diag_P || Ps_ext_j[j] > last_col_diag_P) { P_ext_offd_size++; } else { P_ext_diag_size++; } P_ext_diag_i[i + 1] = P_ext_diag_size; P_ext_offd_i[i + 1] = P_ext_offd_size; } if (P_ext_diag_size) { P_ext_diag_j = hypre_CTAlloc(HYPRE_Int, P_ext_diag_size, HYPRE_MEMORY_HOST); P_ext_diag_data = hypre_CTAlloc(HYPRE_Complex, P_ext_diag_size, HYPRE_MEMORY_HOST); } if (P_ext_offd_size) { P_ext_tmp_j = hypre_CTAlloc(HYPRE_BigInt, P_ext_offd_size, HYPRE_MEMORY_HOST); P_ext_offd_j = hypre_CTAlloc(HYPRE_Int, P_ext_offd_size, HYPRE_MEMORY_HOST); P_ext_offd_data = hypre_CTAlloc(HYPRE_Complex, P_ext_offd_size, HYPRE_MEMORY_HOST); } cnt_offd = 0; cnt_diag = 0; for (i = 0; i < num_cols_offd_A; i++) { for (j = Ps_ext_i[i]; j < Ps_ext_i[i + 1]; j++) if (Ps_ext_j[j] < first_col_diag_P || Ps_ext_j[j] > last_col_diag_P) { P_ext_tmp_j[cnt_offd] = Ps_ext_j[j]; Ps_ext_j[cnt_offd] = Ps_ext_j[j]; P_ext_offd_data[cnt_offd++] = Ps_ext_data[j]; } else { P_ext_diag_j[cnt_diag] = (HYPRE_Int)(Ps_ext_j[j] - first_col_diag_P); P_ext_diag_data[cnt_diag++] = Ps_ext_data[j]; } } if (num_procs > 1) { hypre_CSRMatrixDestroy(Ps_ext); Ps_ext = NULL; } cnt = 0; if (P_ext_offd_size || num_cols_offd_P) { temp = hypre_CTAlloc(HYPRE_BigInt, P_ext_offd_size + num_cols_offd_P, HYPRE_MEMORY_HOST); for (i = 0; i < P_ext_offd_size; i++) { temp[i] = P_ext_offd_j[i]; } cnt = P_ext_offd_size; for (i = 0; i < num_cols_offd_P; i++) { temp[cnt++] = col_map_offd_P[i]; } } if (cnt) { hypre_BigQsort0(temp, 0, cnt - 1); num_cols_offd_C = 1; value = temp[0]; for (i = 1; i < cnt; i++) { if (temp[i] > value) { value = temp[i]; temp[num_cols_offd_C++] = value; } } } col_map_offd_C = hypre_CTAlloc(HYPRE_BigInt, num_cols_offd_C, HYPRE_MEMORY_HOST); for (i = 0; i < num_cols_offd_C; i++) { col_map_offd_C[i] = temp[i]; } if (P_ext_offd_size || num_cols_offd_P) { hypre_TFree(temp, HYPRE_MEMORY_HOST); } for (i = 0; i < P_ext_offd_size; i++) { P_ext_offd_j[i] = hypre_BigBinarySearch(col_map_offd_C, Ps_ext_j[i], num_cols_offd_C); } if (num_cols_offd_P) { map_P_to_C = hypre_CTAlloc(HYPRE_Int, num_cols_offd_P, HYPRE_MEMORY_HOST); cnt = 0; for (i = 0; i < num_cols_offd_C; i++) { if (col_map_offd_C[i] == col_map_offd_P[cnt]) { map_P_to_C[cnt++] = i; if (cnt == num_cols_offd_P) { break; } } } } if (num_procs > 1) { hypre_CSRMatrixDestroy(Ps_ext); } /*----------------------------------------------------------------------- * Allocate marker array. *-----------------------------------------------------------------------*/ P_marker = hypre_CTAlloc(HYPRE_Int, num_cols_diag_P + num_cols_offd_C, HYPRE_MEMORY_HOST); /*----------------------------------------------------------------------- * Initialize some stuff. *-----------------------------------------------------------------------*/ for (i1 = 0; i1 < num_cols_diag_P + num_cols_offd_C; i1++) { P_marker[i1] = -1; } /* no changes for the marked version above this point */ /* This function call is the first pass: */ hypre_ParMatmul_RowSizes_Marked( &C_diag_i, &C_offd_i, &P_marker, A_diag_i, A_diag_j, A_offd_i, A_offd_j, P_diag_i, P_diag_j, P_offd_i, P_offd_j, P_ext_diag_i, P_ext_diag_j, P_ext_offd_i, P_ext_offd_j, map_P_to_C, &C_diag_size, &C_offd_size, num_rows_diag_A, num_cols_offd_A, allsquare, num_cols_diag_P, num_cols_offd_P, num_cols_offd_C, CF_marker, dof_func, dof_func_offd ); /* The above call of hypre_ParMatmul_RowSizes_Marked computed two scalars: C_diag_size, C_offd_size, and two arrays: C_diag_i, C_offd_i ( P_marker is also computed, but only used internally ) */ /*----------------------------------------------------------------------- * Allocate C_diag_data and C_diag_j arrays. * Allocate C_offd_data and C_offd_j arrays. *-----------------------------------------------------------------------*/ last_col_diag_P = first_col_diag_P + num_cols_diag_P - 1; C_diag_data = hypre_CTAlloc(HYPRE_Complex, C_diag_size, HYPRE_MEMORY_HOST); C_diag_j = hypre_CTAlloc(HYPRE_Int, C_diag_size, HYPRE_MEMORY_HOST); if (C_offd_size) { C_offd_data = hypre_CTAlloc(HYPRE_Complex, C_offd_size, HYPRE_MEMORY_HOST); C_offd_j = hypre_CTAlloc(HYPRE_Int, C_offd_size, HYPRE_MEMORY_HOST); } /*----------------------------------------------------------------------- * Second Pass: Fill in C_diag_data and C_diag_j. * Second Pass: Fill in C_offd_data and C_offd_j. *-----------------------------------------------------------------------*/ /*----------------------------------------------------------------------- * Initialize some stuff. *-----------------------------------------------------------------------*/ jj_count_diag = start_indexing; jj_count_offd = start_indexing; for (i1 = 0; i1 < num_cols_diag_P + num_cols_offd_C; i1++) { P_marker[i1] = -1; } /*----------------------------------------------------------------------- * Loop over interior c-points. *-----------------------------------------------------------------------*/ for (i1 = 0; i1 < num_rows_diag_A; i1++) { if ( CF_marker[i1] < 0 ) /* i1 is a fine row */ /* ... This and the coarse row code are the only parts between first pass and near the end where hypre_ParMatmul_FC is different from the regular hypre_ParMatmul */ { /*-------------------------------------------------------------------- * Create diagonal entry, C_{i1,i1} *--------------------------------------------------------------------*/ jj_row_begin_diag = jj_count_diag; jj_row_begin_offd = jj_count_offd; /*----------------------------------------------------------------- * Loop over entries in row i1 of A_offd. *-----------------------------------------------------------------*/ if (num_cols_offd_A) { for (jj2 = A_offd_i[i1]; jj2 < A_offd_i[i1 + 1]; jj2++) { i2 = A_offd_j[jj2]; if ( dof_func == NULL || dof_func[i1] == dof_func_offd[i2] ) { /* interpolate only like "functions" */ a_entry = A_offd_data[jj2]; /*----------------------------------------------------------- * Loop over entries in row i2 of P_ext. *-----------------------------------------------------------*/ for (jj3 = P_ext_offd_i[i2]; jj3 < P_ext_offd_i[i2 + 1]; jj3++) { i3 = num_cols_diag_P + P_ext_offd_j[jj3]; a_b_product = a_entry * P_ext_offd_data[jj3]; /*-------------------------------------------------------- * Check P_marker to see that C_{i1,i3} has not already * been accounted for. If it has not, create a new entry. * If it has, add new contribution. *--------------------------------------------------------*/ if (P_marker[i3] < jj_row_begin_offd) { P_marker[i3] = jj_count_offd; C_offd_data[jj_count_offd] = a_b_product; C_offd_j[jj_count_offd] = i3 - num_cols_diag_P; jj_count_offd++; } else { C_offd_data[P_marker[i3]] += a_b_product; } } for (jj3 = P_ext_diag_i[i2]; jj3 < P_ext_diag_i[i2 + 1]; jj3++) { i3 = P_ext_diag_j[jj3]; a_b_product = a_entry * P_ext_diag_data[jj3]; if (P_marker[i3] < jj_row_begin_diag) { P_marker[i3] = jj_count_diag; C_diag_data[jj_count_diag] = a_b_product; C_diag_j[jj_count_diag] = i3; jj_count_diag++; } else { C_diag_data[P_marker[i3]] += a_b_product; } } } else { /* Interpolation mat should be 0 where i1 and i2 correspond to different "functions". As we haven't created an entry for C(i1,i2), nothing needs to be done. */ } } } /*----------------------------------------------------------------- * Loop over entries in row i1 of A_diag. *-----------------------------------------------------------------*/ for (jj2 = A_diag_i[i1]; jj2 < A_diag_i[i1 + 1]; jj2++) { i2 = A_diag_j[jj2]; if ( dof_func == NULL || dof_func[i1] == dof_func[i2] ) { /* interpolate only like "functions" */ a_entry = A_diag_data[jj2]; /*----------------------------------------------------------- * Loop over entries in row i2 of P_diag. *-----------------------------------------------------------*/ for (jj3 = P_diag_i[i2]; jj3 < P_diag_i[i2 + 1]; jj3++) { i3 = P_diag_j[jj3]; a_b_product = a_entry * P_diag_data[jj3]; /*-------------------------------------------------------- * Check P_marker to see that C_{i1,i3} has not already * been accounted for. If it has not, create a new entry. * If it has, add new contribution. *--------------------------------------------------------*/ if (P_marker[i3] < jj_row_begin_diag) { P_marker[i3] = jj_count_diag; C_diag_data[jj_count_diag] = a_b_product; C_diag_j[jj_count_diag] = i3; jj_count_diag++; } else { C_diag_data[P_marker[i3]] += a_b_product; } } if (num_cols_offd_P) { for (jj3 = P_offd_i[i2]; jj3 < P_offd_i[i2 + 1]; jj3++) { i3 = num_cols_diag_P + map_P_to_C[P_offd_j[jj3]]; a_b_product = a_entry * P_offd_data[jj3]; /*-------------------------------------------------------- * Check P_marker to see that C_{i1,i3} has not already * been accounted for. If it has not, create a new entry. * If it has, add new contribution. *--------------------------------------------------------*/ if (P_marker[i3] < jj_row_begin_offd) { P_marker[i3] = jj_count_offd; C_offd_data[jj_count_offd] = a_b_product; C_offd_j[jj_count_offd] = i3 - num_cols_diag_P; jj_count_offd++; } else { C_offd_data[P_marker[i3]] += a_b_product; } } } } else { /* Interpolation mat should be 0 where i1 and i2 correspond to different "functions". As we haven't created an entry for C(i1,i2), nothing needs to be done. */ } } } else /* i1 is a coarse row.*/ /* Copy P coarse-row values to C. This is useful if C is meant to become a replacement for P */ { if (num_cols_offd_P) { for (jj2 = P_offd_i[i1]; jj2 < P_offd_i[i1 + 1]; jj2++) { C_offd_j[jj_count_offd] = P_offd_j[jj_count_offd]; C_offd_data[jj_count_offd] = P_offd_data[jj_count_offd]; ++jj_count_offd; } } for (jj2 = P_diag_i[i1]; jj2 < P_diag_i[i1 + 1]; jj2++) { C_diag_j[jj_count_diag] = P_diag_j[jj2]; C_diag_data[jj_count_diag] = P_diag_data[jj2]; ++jj_count_diag; } } } C = hypre_ParCSRMatrixCreate( comm, n_rows_A_global, n_cols_P_global, row_starts_A, col_starts_P, num_cols_offd_C, C_diag_size, C_offd_size ); C_diag = hypre_ParCSRMatrixDiag(C); hypre_CSRMatrixData(C_diag) = C_diag_data; hypre_CSRMatrixI(C_diag) = C_diag_i; hypre_CSRMatrixJ(C_diag) = C_diag_j; C_offd = hypre_ParCSRMatrixOffd(C); hypre_CSRMatrixI(C_offd) = C_offd_i; hypre_ParCSRMatrixOffd(C) = C_offd; if (num_cols_offd_C) { hypre_CSRMatrixData(C_offd) = C_offd_data; hypre_CSRMatrixJ(C_offd) = C_offd_j; hypre_ParCSRMatrixColMapOffd(C) = col_map_offd_C; } /*----------------------------------------------------------------------- * Free various arrays *-----------------------------------------------------------------------*/ hypre_TFree(P_marker, HYPRE_MEMORY_HOST); hypre_TFree(P_ext_diag_i, HYPRE_MEMORY_HOST); if (P_ext_diag_size) { hypre_TFree(P_ext_diag_j, HYPRE_MEMORY_HOST); hypre_TFree(P_ext_diag_data, HYPRE_MEMORY_HOST); } hypre_TFree(P_ext_offd_i, HYPRE_MEMORY_HOST); if (P_ext_offd_size) { hypre_TFree(P_ext_offd_j, HYPRE_MEMORY_HOST); hypre_TFree(P_ext_offd_data, HYPRE_MEMORY_HOST); } if (num_cols_offd_P) { hypre_TFree(map_P_to_C, HYPRE_MEMORY_HOST); } return C; } void hypre_ParMatScaleDiagInv_F( hypre_ParCSRMatrix * C, hypre_ParCSRMatrix * A, HYPRE_Complex weight, HYPRE_Int * CF_marker ) /* hypre_ParMatScaleDiagInv scales certain rows of its first * argument by premultiplying with a submatrix of the inverse of * the diagonal of its second argument; and _also_ multiplying by the scalar * third argument. * The marker array determines rows are changed and which diagonal elements * are used. */ { /* If A=(Aij),C=(Cik), i&j in Fine+Coarse, k in Coarse, we want new Cik = (1/aii)*Cik, for Fine i only, all k. Unlike a matmul, this computation is purely local, only the diag blocks are involved. */ hypre_CSRMatrix *A_diag = hypre_ParCSRMatrixDiag(A); hypre_CSRMatrix *C_diag = hypre_ParCSRMatrixDiag(C); hypre_CSRMatrix *C_offd = hypre_ParCSRMatrixOffd(C); HYPRE_Complex *A_diag_data = hypre_CSRMatrixData(A_diag); HYPRE_Int *A_diag_i = hypre_CSRMatrixI(A_diag); HYPRE_Int *A_diag_j = hypre_CSRMatrixJ(A_diag); HYPRE_Complex *C_diag_data = hypre_CSRMatrixData(C_diag); HYPRE_Complex *C_offd_data = hypre_CSRMatrixData(C_offd); HYPRE_Int *C_diag_i = hypre_CSRMatrixI(C_diag); HYPRE_Int *C_offd_i = hypre_CSRMatrixI(C_offd); HYPRE_Int num_rows_diag_C = hypre_CSRMatrixNumRows(C_diag); HYPRE_Int num_cols_offd_C = hypre_CSRMatrixNumCols(C_offd); HYPRE_Int i1, i2; HYPRE_Int jj2, jj3; HYPRE_Complex a_entry; /*----------------------------------------------------------------------- * Loop over C_diag rows. *-----------------------------------------------------------------------*/ for (i1 = 0; i1 < num_rows_diag_C; i1++) { if ( CF_marker[i1] < 0 ) /* Fine data only */ { /*----------------------------------------------------------------- * Loop over A_diag data *-----------------------------------------------------------------*/ for (jj2 = A_diag_i[i1]; jj2 < A_diag_i[i1 + 1]; jj2++) { i2 = A_diag_j[jj2]; if ( i1 == i2 ) /* diagonal of A only */ { a_entry = A_diag_data[jj2] * weight; /*----------------------------------------------------------- * Loop over entries in current row of C_diag. *-----------------------------------------------------------*/ for (jj3 = C_diag_i[i2]; jj3 < C_diag_i[i2 + 1]; jj3++) { C_diag_data[jj3] = C_diag_data[jj3] / a_entry; } /*----------------------------------------------------------- * Loop over entries in current row of C_offd. *-----------------------------------------------------------*/ if ( num_cols_offd_C ) { for (jj3 = C_offd_i[i2]; jj3 < C_offd_i[i2 + 1]; jj3++) { C_offd_data[jj3] = C_offd_data[jj3] / a_entry; } } } } } } } hypre_ParCSRMatrix * hypre_ParMatMinus_F( hypre_ParCSRMatrix * P, hypre_ParCSRMatrix * C, HYPRE_Int * CF_marker ) /* hypre_ParMatMinus_F subtracts selected rows of its second argument from selected rows of its first argument. The marker array determines which rows are affected - those for which CF_marker<0. The result is returned as a new matrix. */ { /* If P=(Pik),C=(Cik), i in Fine+Coarse, k in Coarse, we want new Pik = Pik - Cik, for Fine i only, all k. This computation is purely local. */ /* This is _not_ a general-purpose matrix subtraction function. This is written for an interpolation problem where it is known that C(i,k) exists whenever P(i,k) does (because C=A*P where A has nonzero diagonal elements). */ hypre_ParCSRMatrix *Pnew; hypre_CSRMatrix *P_diag = hypre_ParCSRMatrixDiag(P); hypre_CSRMatrix *P_offd = hypre_ParCSRMatrixOffd(P); hypre_CSRMatrix *C_diag = hypre_ParCSRMatrixDiag(C); hypre_CSRMatrix *C_offd = hypre_ParCSRMatrixOffd(C); hypre_CSRMatrix *Pnew_diag; hypre_CSRMatrix *Pnew_offd; HYPRE_Complex *P_diag_data = hypre_CSRMatrixData(P_diag); HYPRE_Int *P_diag_i = hypre_CSRMatrixI(P_diag); HYPRE_Int *P_diag_j = hypre_CSRMatrixJ(P_diag); HYPRE_Complex *P_offd_data = hypre_CSRMatrixData(P_offd); HYPRE_Int *P_offd_i = hypre_CSRMatrixI(P_offd); HYPRE_Int *P_offd_j = hypre_CSRMatrixJ(P_offd); HYPRE_BigInt *P_col_map_offd = hypre_ParCSRMatrixColMapOffd( P ); HYPRE_Complex *C_diag_data = hypre_CSRMatrixData(C_diag); HYPRE_Int *C_diag_i = hypre_CSRMatrixI(C_diag); HYPRE_Int *C_diag_j = hypre_CSRMatrixJ(C_diag); HYPRE_Complex *C_offd_data = hypre_CSRMatrixData(C_offd); HYPRE_Int *C_offd_i = hypre_CSRMatrixI(C_offd); HYPRE_Int *C_offd_j = hypre_CSRMatrixJ(C_offd); HYPRE_BigInt *C_col_map_offd = hypre_ParCSRMatrixColMapOffd( C ); HYPRE_Int *Pnew_diag_i; HYPRE_Int *Pnew_diag_j; HYPRE_Complex *Pnew_diag_data; HYPRE_Int *Pnew_offd_i; HYPRE_Int *Pnew_offd_j; HYPRE_Complex *Pnew_offd_data; HYPRE_Int *Pnew_j2m; HYPRE_BigInt *Pnew_col_map_offd; HYPRE_Int num_rows_diag_C = hypre_CSRMatrixNumRows(C_diag); /* HYPRE_Int num_rows_offd_C = hypre_CSRMatrixNumRows(C_offd); */ HYPRE_Int num_cols_offd_C = hypre_CSRMatrixNumCols(C_offd); HYPRE_Int num_cols_offd_P = hypre_CSRMatrixNumCols(P_offd); HYPRE_Int num_cols_offd_Pnew, num_rows_offd_Pnew; HYPRE_Int i1, jmin, jmax, jrange, jrangem1; HYPRE_Int j, m, mc, mp, jc, jp, jP, jC; HYPRE_BigInt jg, jCg, jPg; HYPRE_Complex dc, dp; /* Pnew = hypre_ParCSRMatrixCompleteClone( C );*/ Pnew = hypre_ParCSRMatrixUnion( C, P ); ; hypre_ParCSRMatrixZero_F( Pnew, CF_marker ); /* fine rows of Pnew set to 0 */ hypre_ParCSRMatrixCopy_C( Pnew, C, CF_marker ); /* coarse rows of Pnew copied * from C (or P) */ /* ...Zero_F may not be needed depending on how Pnew is made */ Pnew_diag = hypre_ParCSRMatrixDiag(Pnew); Pnew_offd = hypre_ParCSRMatrixOffd(Pnew); Pnew_diag_i = hypre_CSRMatrixI(Pnew_diag); Pnew_diag_j = hypre_CSRMatrixJ(Pnew_diag); Pnew_offd_i = hypre_CSRMatrixI(Pnew_offd); Pnew_offd_j = hypre_CSRMatrixJ(Pnew_offd); Pnew_diag_data = hypre_CSRMatrixData(Pnew_diag); Pnew_offd_data = hypre_CSRMatrixData(Pnew_offd); Pnew_col_map_offd = hypre_ParCSRMatrixColMapOffd( Pnew ); num_rows_offd_Pnew = hypre_CSRMatrixNumRows(Pnew_offd); num_cols_offd_Pnew = hypre_CSRMatrixNumCols(Pnew_offd); /* Find the j-ranges, needed to allocate a "reverse lookup" array. */ /* This is the max j - min j over P and Pnew (which here is a copy of C). Only the diag block is considered. */ /* For scalability reasons (jrange can get big) this won't work for the offd block. Also, indexing is more complicated in the offd block (c.f. col_map_offd). It's not clear, though whether the "quadratic" algorithm I'm using for the offd block is really any slower than the more complicated "linear" algorithm here. */ jrange = 0; jrangem1 = -1; for ( i1 = 0; i1 < num_rows_diag_C; i1++ ) { /* only Fine rows matter */ if ( CF_marker[i1] < 0 && hypre_CSRMatrixNumNonzeros(Pnew_diag) > 0 ) { jmin = Pnew_diag_j[ Pnew_diag_i[i1] ]; jmax = Pnew_diag_j[ Pnew_diag_i[i1 + 1] - 1 ]; jrangem1 = jmax - jmin; jrange = hypre_max(jrange, jrangem1 + 1); /* If columns (of a given row) were in increasing order, the above would be sufficient. If not, the following would be necessary (and sufficient) */ jmin = Pnew_diag_j[ Pnew_diag_i[i1] ]; jmax = Pnew_diag_j[ Pnew_diag_i[i1] ]; for ( m = Pnew_diag_i[i1] + 1; m < Pnew_diag_i[i1 + 1]; ++m ) { j = Pnew_diag_j[m]; jmin = hypre_min( jmin, j ); jmax = hypre_max( jmax, j ); } for ( m = P_diag_i[i1]; m < P_diag_i[i1 + 1]; ++m ) { j = P_diag_j[m]; jmin = hypre_min( jmin, j ); jmax = hypre_max( jmax, j ); } jrangem1 = jmax - jmin; jrange = hypre_max(jrange, jrangem1 + 1); } } /*----------------------------------------------------------------------- * Loop over Pnew_diag rows. Construct a temporary reverse array: * If j is a column number, Pnew_j2m[j] is the array index for j, i.e. * Pnew_diag_j[ Pnew_j2m[j] ] = j *-----------------------------------------------------------------------*/ Pnew_j2m = hypre_CTAlloc( HYPRE_Int, jrange, HYPRE_MEMORY_HOST); for ( i1 = 0; i1 < num_rows_diag_C; i1++ ) { /* Fine data only */ if ( CF_marker[i1] < 0 && hypre_CSRMatrixNumNonzeros(Pnew_diag) > 0 ) { /* just needed for an assertion below... */ for ( j = 0; j < jrange; ++j ) { Pnew_j2m[j] = -1; } jmin = Pnew_diag_j[ Pnew_diag_i[i1] ]; /* If columns (of a given row) were in increasing order, the above line would be sufficient. If not, the following loop would have to be added (or store the jmin computed above )*/ for ( m = Pnew_diag_i[i1] + 1; m < Pnew_diag_i[i1 + 1]; ++m ) { j = Pnew_diag_j[m]; jmin = hypre_min( jmin, j ); } for ( m = P_diag_i[i1]; m < P_diag_i[i1 + 1]; ++m ) { j = P_diag_j[m]; jmin = hypre_min( jmin, j ); } for ( m = Pnew_diag_i[i1]; m < Pnew_diag_i[i1 + 1]; ++m ) { j = Pnew_diag_j[m]; hypre_assert( j - jmin >= 0 ); hypre_assert( j - jmin < jrange ); Pnew_j2m[ j - jmin ] = m; } /*----------------------------------------------------------------------- * Loop over C_diag data for the current row. * Subtract each C data entry from the corresponding Pnew entry. *-----------------------------------------------------------------------*/ for ( mc = C_diag_i[i1]; mc < C_diag_i[i1 + 1]; ++mc ) { jc = C_diag_j[mc]; dc = C_diag_data[mc]; m = Pnew_j2m[jc - jmin]; hypre_assert( m >= 0 ); Pnew_diag_data[m] -= dc; } /*----------------------------------------------------------------------- * Loop over P_diag data for the current row. * Add each P data entry from the corresponding Pnew entry. *-----------------------------------------------------------------------*/ for ( mp = P_diag_i[i1]; mp < P_diag_i[i1 + 1]; ++mp ) { jp = P_diag_j[mp]; dp = P_diag_data[mp]; m = Pnew_j2m[jp - jmin]; hypre_assert( m >= 0 ); Pnew_diag_data[m] += dp; } } } /*----------------------------------------------------------------------- * Repeat for the offd block. *-----------------------------------------------------------------------*/ for ( i1 = 0; i1 < num_rows_offd_Pnew; i1++ ) { /* Fine data only */ if ( CF_marker[i1] < 0 && hypre_CSRMatrixNumNonzeros(Pnew_offd) > 0 ) { if ( num_cols_offd_Pnew ) { /* This is a simple quadratic algorithm. If necessary I may try to implement the ideas used on the diag block later. */ for ( m = Pnew_offd_i[i1]; m < Pnew_offd_i[i1 + 1]; ++m ) { j = Pnew_offd_j[m]; jg = Pnew_col_map_offd[j]; Pnew_offd_data[m] = 0; if ( num_cols_offd_C ) for ( mc = C_offd_i[i1]; mc < C_offd_i[i1 + 1]; ++mc ) { jC = C_offd_j[mc]; jCg = C_col_map_offd[jC]; if ( jCg == jg ) { Pnew_offd_data[m] -= C_offd_data[mc]; } } if ( num_cols_offd_P ) for ( mp = P_offd_i[i1]; mp < P_offd_i[i1 + 1]; ++mp ) { jP = P_offd_j[mp]; jPg = P_col_map_offd[jP]; if ( jPg == jg ) { Pnew_offd_data[m] += P_offd_data[mp]; } } } } } } hypre_TFree(Pnew_j2m, HYPRE_MEMORY_HOST); return Pnew; } /* fine (marked <0 ) rows of Pnew set to 0 */ void hypre_ParCSRMatrixZero_F( hypre_ParCSRMatrix * P, HYPRE_Int * CF_marker ) { hypre_CSRMatrix *P_diag = hypre_ParCSRMatrixDiag(P); hypre_CSRMatrix *P_offd = hypre_ParCSRMatrixOffd(P); HYPRE_Complex *P_diag_data = hypre_CSRMatrixData(P_diag); HYPRE_Int *P_diag_i = hypre_CSRMatrixI(P_diag); HYPRE_Complex *P_offd_data = hypre_CSRMatrixData(P_offd); HYPRE_Int *P_offd_i = hypre_CSRMatrixI(P_offd); HYPRE_Int num_rows_diag_P = hypre_CSRMatrixNumRows(P_diag); HYPRE_Int num_rows_offd_P = hypre_CSRMatrixNumRows(P_offd); HYPRE_Int num_cols_offd_P = hypre_CSRMatrixNumCols(P_offd); HYPRE_Int i1, m; for ( i1 = 0; i1 < num_rows_diag_P; i1++ ) { if ( CF_marker[i1] < 0 ) /* Fine rows only */ { for ( m = P_diag_i[i1]; m < P_diag_i[i1 + 1]; ++m ) { P_diag_data[m] = 0; } } } if ( num_cols_offd_P ) for ( i1 = 0; i1 < num_rows_offd_P; i1++ ) { if ( CF_marker[i1] < 0 ) /* Fine rows only */ { for ( m = P_offd_i[i1]; m < P_offd_i[i1 + 1]; ++m ) { P_offd_data[m] = 0; } } } } /* coarse (marked >=0) rows of P copied from C Both matrices have the same sizes. */ void hypre_ParCSRMatrixCopy_C( hypre_ParCSRMatrix * P, hypre_ParCSRMatrix * C, HYPRE_Int * CF_marker ) { hypre_CSRMatrix *C_diag = hypre_ParCSRMatrixDiag(C); hypre_CSRMatrix *C_offd = hypre_ParCSRMatrixOffd(C); hypre_CSRMatrix *P_diag = hypre_ParCSRMatrixDiag(P); hypre_CSRMatrix *P_offd = hypre_ParCSRMatrixOffd(P); HYPRE_Complex *C_diag_data = hypre_CSRMatrixData(C_diag); HYPRE_Int *C_diag_i = hypre_CSRMatrixI(C_diag); HYPRE_Complex *C_offd_data = hypre_CSRMatrixData(C_offd); HYPRE_Int *C_offd_i = hypre_CSRMatrixI(C_offd); HYPRE_Complex *P_diag_data = hypre_CSRMatrixData(P_diag); HYPRE_Complex *P_offd_data = hypre_CSRMatrixData(P_offd); HYPRE_Int num_rows_diag_C = hypre_CSRMatrixNumRows(C_diag); HYPRE_Int num_rows_offd_C = hypre_CSRMatrixNumRows(C_offd); HYPRE_Int num_cols_offd_C = hypre_CSRMatrixNumCols(C_offd); HYPRE_Int i1, m; for ( i1 = 0; i1 < num_rows_diag_C; i1++ ) { if ( CF_marker[i1] >= 0 ) /* Coarse rows only */ { for ( m = C_diag_i[i1]; m < C_diag_i[i1 + 1]; ++m ) { P_diag_data[m] = C_diag_data[m]; } } } if ( num_cols_offd_C ) for ( i1 = 0; i1 < num_rows_offd_C; i1++ ) { if ( CF_marker[i1] >= 0 ) /* Coarse rows only */ { for ( m = C_offd_i[i1]; m < C_offd_i[i1 + 1]; ++m ) { P_offd_data[m] = C_offd_data[m]; } } } } /* RDF: Commented out due to issues with complex types and comparisons that * don't make sense anyway. The function wasn't being used, either. */ #if 0 /* Delete any matrix entry C(i,j) for which the corresponding entry P(i,j) doesn't exist - but only for "fine" rows C(i)<0 This is done as a purely local computation - C and P must have the same data distribution (among processors). */ void hypre_ParCSRMatrixDropEntries( hypre_ParCSRMatrix * C, hypre_ParCSRMatrix * P, HYPRE_Int * CF_marker ) { hypre_CSRMatrix *C_diag = hypre_ParCSRMatrixDiag(C); hypre_CSRMatrix *C_offd = hypre_ParCSRMatrixOffd(C); HYPRE_Complex *C_diag_data = hypre_CSRMatrixData(C_diag); HYPRE_Int *C_diag_i = hypre_CSRMatrixI(C_diag); HYPRE_Int *C_diag_j = hypre_CSRMatrixJ(C_diag); HYPRE_Complex *C_offd_data = hypre_CSRMatrixData(C_offd); HYPRE_Int *C_offd_i = hypre_CSRMatrixI(C_offd); HYPRE_Int *C_offd_j = hypre_CSRMatrixJ(C_offd); hypre_CSRMatrix *P_diag = hypre_ParCSRMatrixDiag(P); hypre_CSRMatrix *P_offd = hypre_ParCSRMatrixOffd(P); HYPRE_Int *P_diag_i = hypre_CSRMatrixI(P_diag); HYPRE_Int *P_diag_j = hypre_CSRMatrixJ(P_diag); HYPRE_Int *P_offd_i = hypre_CSRMatrixI(P_offd); HYPRE_Int *P_offd_j = hypre_CSRMatrixJ(P_offd); HYPRE_Int *new_C_diag_i; HYPRE_Int *new_C_offd_i; HYPRE_Int num_rows_diag_C = hypre_CSRMatrixNumRows(C_diag); HYPRE_Int num_rows_offd_C = hypre_CSRMatrixNumCols(C_offd); HYPRE_Int num_nonzeros_diag = hypre_CSRMatrixNumNonzeros(C_diag); HYPRE_Int num_nonzeros_offd = hypre_CSRMatrixNumNonzeros(C_offd); HYPRE_Complex vmax = 0.0; HYPRE_Complex vmin = 0.0; HYPRE_Complex v, old_sum, new_sum, scale; HYPRE_Int i1, m, m1d, m1o, jC, mP, keep; /* Repack the i,j,and data arrays of C so as to discard those elements for which there is no corresponding element in P. Elements of Coarse rows (CF_marker>=0) are always kept. The arrays are not re-allocated, so there will generally be unused space at the ends of the arrays. */ new_C_diag_i = hypre_CTAlloc( HYPRE_Int, num_rows_diag_C + 1, HYPRE_MEMORY_HOST); new_C_offd_i = hypre_CTAlloc( HYPRE_Int, num_rows_offd_C + 1, HYPRE_MEMORY_HOST); m1d = C_diag_i[0]; m1o = C_offd_i[0]; for ( i1 = 0; i1 < num_rows_diag_C; i1++ ) { old_sum = 0; new_sum = 0; for ( m = C_diag_i[i1]; m < C_diag_i[i1 + 1]; ++m ) { v = C_diag_data[m]; jC = C_diag_j[m]; old_sum += v; /* Do we know anything about the order of P_diag_j? It would be better not to search through it all here. If we know nothing, some ordering or index scheme will be needed for efficiency (worth doing iff this function gets called at all ) (may2006: this function is no longer called) */ keep = 0; for ( mP = P_diag_i[i1]; mP < P_diag_i[i1 + 1]; ++mP ) { if ( jC == P_diag_j[m] ) { keep = 1; break; } } if ( CF_marker[i1] >= 0 || keep == 1 ) { /* keep v in C */ new_sum += v; C_diag_j[m1d] = C_diag_j[m]; C_diag_data[m1d] = C_diag_data[m]; ++m1d; } else { /* discard v */ --num_nonzeros_diag; } } for ( m = C_offd_i[i1]; m < C_offd_i[i1 + 1]; ++m ) { v = C_offd_data[m]; jC = C_diag_j[m]; old_sum += v; keep = 0; for ( mP = P_offd_i[i1]; mP < P_offd_i[i1 + 1]; ++mP ) { if ( jC == P_offd_j[m] ) { keep = 1; break; } } if ( CF_marker[i1] >= 0 || v >= vmax || v <= vmin ) /* RDF: Always true!? */ { /* keep v in C */ new_sum += v; C_offd_j[m1o] = C_offd_j[m]; C_offd_data[m1o] = C_offd_data[m]; ++m1o; } else { /* discard v */ --num_nonzeros_offd; } } new_C_diag_i[i1 + 1] = m1d; if ( i1 < num_rows_offd_C ) { new_C_offd_i[i1 + 1] = m1o; } /* rescale to keep row sum the same */ if (new_sum != 0) { scale = old_sum / new_sum; } else { scale = 1.0; } for ( m = new_C_diag_i[i1]; m < new_C_diag_i[i1 + 1]; ++m ) { C_diag_data[m] *= scale; } if ( i1 < num_rows_offd_C ) /* this test fails when there is no offd block */ for ( m = new_C_offd_i[i1]; m < new_C_offd_i[i1 + 1]; ++m ) { C_offd_data[m] *= scale; } } for ( i1 = 1; i1 <= num_rows_diag_C; i1++ ) { C_diag_i[i1] = new_C_diag_i[i1]; if ( i1 < num_rows_offd_C ) { C_offd_i[i1] = new_C_offd_i[i1]; } } hypre_TFree( new_C_diag_i, HYPRE_MEMORY_HOST); if ( num_rows_offd_C > 0 ) { hypre_TFree( new_C_offd_i, HYPRE_MEMORY_HOST); } hypre_CSRMatrixNumNonzeros(C_diag) = num_nonzeros_diag; hypre_CSRMatrixNumNonzeros(C_offd) = num_nonzeros_offd; /* SetNumNonzeros, SetDNumNonzeros are global, need hypre_MPI_Allreduce. I suspect, but don't know, that other parts of hypre do not assume that the correct values have been set. hypre_ParCSRMatrixSetNumNonzeros( C ); hypre_ParCSRMatrixSetDNumNonzeros( C );*/ hypre_ParCSRMatrixNumNonzeros( C ) = 0; hypre_ParCSRMatrixDNumNonzeros( C ) = 0.0; } #endif hypre-2.33.0/src/parcsr_mv/par_csr_matrix.c000066400000000000000000003557351477326011500207220ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * Member functions for hypre_ParCSRMatrix class. * *****************************************************************************/ #include "_hypre_parcsr_mv.h" #include "../seq_mv/HYPRE_seq_mv.h" #include "../seq_mv/csr_matrix.h" /* In addition to publically accessible interface in HYPRE_mv.h, the implementation in this file uses accessor macros into the sequential matrix structure, and so includes the .h that defines that structure. Should those accessor functions become proper functions at some later date, this will not be necessary. AJC 4/99 */ HYPRE_Int hypre_FillResponseParToCSRMatrix(void*, HYPRE_Int, HYPRE_Int, void*, MPI_Comm, void**, HYPRE_Int*); /*-------------------------------------------------------------------------- * hypre_ParCSRMatrixCreate *--------------------------------------------------------------------------*/ /* If create is called and row_starts and col_starts are NOT null, then it is assumed that they are of length 2 containing the start row of the calling processor followed by the start row of the next processor - AHB 6/05 */ hypre_ParCSRMatrix* hypre_ParCSRMatrixCreate( MPI_Comm comm, HYPRE_BigInt global_num_rows, HYPRE_BigInt global_num_cols, HYPRE_BigInt *row_starts_in, HYPRE_BigInt *col_starts_in, HYPRE_Int num_cols_offd, HYPRE_Int num_nonzeros_diag, HYPRE_Int num_nonzeros_offd ) { hypre_ParCSRMatrix *matrix; HYPRE_Int num_procs, my_id; HYPRE_Int local_num_rows; HYPRE_Int local_num_cols; HYPRE_BigInt row_starts[2]; HYPRE_BigInt col_starts[2]; HYPRE_BigInt first_row_index, first_col_diag; matrix = hypre_CTAlloc(hypre_ParCSRMatrix, 1, HYPRE_MEMORY_HOST); hypre_MPI_Comm_rank(comm, &my_id); hypre_MPI_Comm_size(comm, &num_procs); if (!row_starts_in) { hypre_GenerateLocalPartitioning(global_num_rows, num_procs, my_id, row_starts); } else { row_starts[0] = row_starts_in[0]; row_starts[1] = row_starts_in[1]; } if (!col_starts_in) { hypre_GenerateLocalPartitioning(global_num_cols, num_procs, my_id, col_starts); } else { col_starts[0] = col_starts_in[0]; col_starts[1] = col_starts_in[1]; } /* row_starts[0] is start of local rows. row_starts[1] is start of next processor's rows */ first_row_index = row_starts[0]; local_num_rows = row_starts[1] - first_row_index; first_col_diag = col_starts[0]; local_num_cols = col_starts[1] - first_col_diag; hypre_ParCSRMatrixComm(matrix) = comm; hypre_ParCSRMatrixDiag(matrix) = hypre_CSRMatrixCreate(local_num_rows, local_num_cols, num_nonzeros_diag); hypre_ParCSRMatrixOffd(matrix) = hypre_CSRMatrixCreate(local_num_rows, num_cols_offd, num_nonzeros_offd); hypre_ParCSRMatrixDiagT(matrix) = NULL; hypre_ParCSRMatrixOffdT(matrix) = NULL; // JSP: transposed matrices are optional hypre_ParCSRMatrixGlobalNumRows(matrix) = global_num_rows; hypre_ParCSRMatrixGlobalNumCols(matrix) = global_num_cols; hypre_ParCSRMatrixGlobalNumRownnz(matrix) = global_num_rows; hypre_ParCSRMatrixNumNonzeros(matrix) = -1; /* Uninitialized */ hypre_ParCSRMatrixDNumNonzeros(matrix) = -1.0; /* Uninitialized */ hypre_ParCSRMatrixFirstRowIndex(matrix) = first_row_index; hypre_ParCSRMatrixFirstColDiag(matrix) = first_col_diag; hypre_ParCSRMatrixLastRowIndex(matrix) = first_row_index + local_num_rows - 1; hypre_ParCSRMatrixLastColDiag(matrix) = first_col_diag + local_num_cols - 1; hypre_ParCSRMatrixRowStarts(matrix)[0] = row_starts[0]; hypre_ParCSRMatrixRowStarts(matrix)[1] = row_starts[1]; hypre_ParCSRMatrixColStarts(matrix)[0] = col_starts[0]; hypre_ParCSRMatrixColStarts(matrix)[1] = col_starts[1]; hypre_ParCSRMatrixColMapOffd(matrix) = NULL; hypre_ParCSRMatrixDeviceColMapOffd(matrix) = NULL; hypre_ParCSRMatrixProcOrdering(matrix) = NULL; hypre_ParCSRMatrixAssumedPartition(matrix) = NULL; hypre_ParCSRMatrixOwnsAssumedPartition(matrix) = 1; hypre_ParCSRMatrixCommPkg(matrix) = NULL; hypre_ParCSRMatrixCommPkgT(matrix) = NULL; /* set defaults */ hypre_ParCSRMatrixOwnsData(matrix) = 1; hypre_ParCSRMatrixRowindices(matrix) = NULL; hypre_ParCSRMatrixRowvalues(matrix) = NULL; hypre_ParCSRMatrixGetrowactive(matrix) = 0; matrix->bdiaginv = NULL; matrix->bdiaginv_comm_pkg = NULL; matrix->bdiag_size = -1; #if defined(HYPRE_USING_GPU) hypre_ParCSRMatrixSocDiagJ(matrix) = NULL; hypre_ParCSRMatrixSocOffdJ(matrix) = NULL; #endif return matrix; } /*-------------------------------------------------------------------------- * hypre_ParCSRMatrixDestroy *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ParCSRMatrixDestroy( hypre_ParCSRMatrix *matrix ) { if (matrix) { HYPRE_MemoryLocation memory_location = hypre_ParCSRMatrixMemoryLocation(matrix); if ( hypre_ParCSRMatrixOwnsData(matrix) ) { hypre_CSRMatrixDestroy(hypre_ParCSRMatrixDiag(matrix)); hypre_CSRMatrixDestroy(hypre_ParCSRMatrixOffd(matrix)); if ( hypre_ParCSRMatrixDiagT(matrix) ) { hypre_CSRMatrixDestroy(hypre_ParCSRMatrixDiagT(matrix)); } if ( hypre_ParCSRMatrixOffdT(matrix) ) { hypre_CSRMatrixDestroy(hypre_ParCSRMatrixOffdT(matrix)); } if (hypre_ParCSRMatrixColMapOffd(matrix)) { hypre_TFree(hypre_ParCSRMatrixColMapOffd(matrix), HYPRE_MEMORY_HOST); } if (hypre_ParCSRMatrixDeviceColMapOffd(matrix)) { hypre_TFree(hypre_ParCSRMatrixDeviceColMapOffd(matrix), HYPRE_MEMORY_DEVICE); } if (hypre_ParCSRMatrixCommPkg(matrix)) { hypre_MatvecCommPkgDestroy(hypre_ParCSRMatrixCommPkg(matrix)); } if (hypre_ParCSRMatrixCommPkgT(matrix)) { hypre_MatvecCommPkgDestroy(hypre_ParCSRMatrixCommPkgT(matrix)); } } /* RL: this is actually not correct since the memory_location may have been changed after allocation * put them in containers TODO */ hypre_TFree(hypre_ParCSRMatrixRowindices(matrix), memory_location); hypre_TFree(hypre_ParCSRMatrixRowvalues(matrix), memory_location); if ( hypre_ParCSRMatrixAssumedPartition(matrix) && hypre_ParCSRMatrixOwnsAssumedPartition(matrix) ) { hypre_AssumedPartitionDestroy(hypre_ParCSRMatrixAssumedPartition(matrix)); } if ( hypre_ParCSRMatrixProcOrdering(matrix) ) { hypre_TFree(hypre_ParCSRMatrixProcOrdering(matrix), HYPRE_MEMORY_HOST); } hypre_TFree(matrix->bdiaginv, HYPRE_MEMORY_HOST); if (matrix->bdiaginv_comm_pkg) { hypre_MatvecCommPkgDestroy(matrix->bdiaginv_comm_pkg); } #if defined(HYPRE_USING_GPU) hypre_TFree(hypre_ParCSRMatrixSocDiagJ(matrix), HYPRE_MEMORY_DEVICE); hypre_TFree(hypre_ParCSRMatrixSocOffdJ(matrix), HYPRE_MEMORY_DEVICE); #endif hypre_TFree(matrix, HYPRE_MEMORY_HOST); } return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_ParCSRMatrixInitialize_v2 *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ParCSRMatrixInitialize_v2( hypre_ParCSRMatrix *matrix, HYPRE_MemoryLocation memory_location ) { if (!matrix) { hypre_error_in_arg(1); return hypre_error_flag; } hypre_CSRMatrixInitialize_v2(hypre_ParCSRMatrixDiag(matrix), 0, memory_location); hypre_CSRMatrixInitialize_v2(hypre_ParCSRMatrixOffd(matrix), 0, memory_location); hypre_ParCSRMatrixColMapOffd(matrix) = hypre_CTAlloc(HYPRE_BigInt, hypre_CSRMatrixNumCols(hypre_ParCSRMatrixOffd(matrix)), HYPRE_MEMORY_HOST); return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_ParCSRMatrixInitialize *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ParCSRMatrixInitialize( hypre_ParCSRMatrix *matrix ) { return hypre_ParCSRMatrixInitialize_v2(matrix, hypre_ParCSRMatrixMemoryLocation(matrix)); } /*-------------------------------------------------------------------------- * hypre_ParCSRMatrixClone * Creates and returns a new copy S of the argument A * The following variables are not copied because they will be constructed * later if needed: CommPkg, CommPkgT, rowindices, rowvalues *--------------------------------------------------------------------------*/ hypre_ParCSRMatrix* hypre_ParCSRMatrixClone_v2(hypre_ParCSRMatrix *A, HYPRE_Int copy_data, HYPRE_MemoryLocation memory_location) { hypre_ParCSRMatrix *S; hypre_GpuProfilingPushRange("hypre_ParCSRMatrixClone"); S = hypre_ParCSRMatrixCreate( hypre_ParCSRMatrixComm(A), hypre_ParCSRMatrixGlobalNumRows(A), hypre_ParCSRMatrixGlobalNumCols(A), hypre_ParCSRMatrixRowStarts(A), hypre_ParCSRMatrixColStarts(A), hypre_CSRMatrixNumCols(hypre_ParCSRMatrixOffd(A)), hypre_CSRMatrixNumNonzeros(hypre_ParCSRMatrixDiag(A)), hypre_CSRMatrixNumNonzeros(hypre_ParCSRMatrixOffd(A)) ); hypre_ParCSRMatrixNumNonzeros(S) = hypre_ParCSRMatrixNumNonzeros(A); hypre_ParCSRMatrixDNumNonzeros(S) = hypre_ParCSRMatrixNumNonzeros(A); hypre_ParCSRMatrixInitialize_v2(S, memory_location); hypre_ParCSRMatrixCopy(A, S, copy_data); hypre_GpuProfilingPopRange(); return S; } /*-------------------------------------------------------------------------- * hypre_ParCSRMatrixClone *--------------------------------------------------------------------------*/ hypre_ParCSRMatrix* hypre_ParCSRMatrixClone(hypre_ParCSRMatrix *A, HYPRE_Int copy_data) { return hypre_ParCSRMatrixClone_v2(A, copy_data, hypre_ParCSRMatrixMemoryLocation(A)); } /*-------------------------------------------------------------------------- * hypre_ParCSRMatrixMigrate *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ParCSRMatrixMigrate(hypre_ParCSRMatrix *A, HYPRE_MemoryLocation memory_location) { if (!A) { return hypre_error_flag; } HYPRE_MemoryLocation old_memory_location = hypre_ParCSRMatrixMemoryLocation(A); hypre_CSRMatrixMigrate(hypre_ParCSRMatrixDiag(A), memory_location); hypre_CSRMatrixMigrate(hypre_ParCSRMatrixOffd(A), memory_location); /* Free buffers */ if ( hypre_GetActualMemLocation(memory_location) != hypre_GetActualMemLocation(old_memory_location) ) { hypre_TFree(hypre_ParCSRMatrixRowindices(A), old_memory_location); hypre_TFree(hypre_ParCSRMatrixRowvalues(A), old_memory_location); } return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_ParCSRMatrixSetNumNonzeros_core *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ParCSRMatrixSetNumNonzeros_core( hypre_ParCSRMatrix *matrix, const char *format ) { MPI_Comm comm; hypre_CSRMatrix *diag; hypre_CSRMatrix *offd; if (!matrix) { hypre_error_in_arg(1); return hypre_error_flag; } comm = hypre_ParCSRMatrixComm(matrix); diag = hypre_ParCSRMatrixDiag(matrix); offd = hypre_ParCSRMatrixOffd(matrix); #if defined(HYPRE_DEBUG) hypre_CSRMatrixCheckSetNumNonzeros(diag); hypre_CSRMatrixCheckSetNumNonzeros(offd); #endif if (format[0] == 'I') { HYPRE_BigInt total_num_nonzeros; HYPRE_BigInt local_num_nonzeros; local_num_nonzeros = (HYPRE_BigInt) ( hypre_CSRMatrixNumNonzeros(diag) + hypre_CSRMatrixNumNonzeros(offd) ); hypre_MPI_Allreduce(&local_num_nonzeros, &total_num_nonzeros, 1, HYPRE_MPI_BIG_INT, hypre_MPI_SUM, comm); hypre_ParCSRMatrixNumNonzeros(matrix) = total_num_nonzeros; } else if (format[0] == 'D') { HYPRE_Real total_num_nonzeros; HYPRE_Real local_num_nonzeros; local_num_nonzeros = (HYPRE_Real) ( hypre_CSRMatrixNumNonzeros(diag) + hypre_CSRMatrixNumNonzeros(offd) ); hypre_MPI_Allreduce(&local_num_nonzeros, &total_num_nonzeros, 1, HYPRE_MPI_REAL, hypre_MPI_SUM, comm); hypre_ParCSRMatrixDNumNonzeros(matrix) = total_num_nonzeros; } else { hypre_error_in_arg(1); return hypre_error_flag; } return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_ParCSRMatrixSetNumNonzeros *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ParCSRMatrixSetNumNonzeros( hypre_ParCSRMatrix *matrix ) { return hypre_ParCSRMatrixSetNumNonzeros_core(matrix, "Int"); } /*-------------------------------------------------------------------------- * hypre_ParCSRMatrixSetDNumNonzeros *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ParCSRMatrixSetDNumNonzeros( hypre_ParCSRMatrix *matrix ) { return hypre_ParCSRMatrixSetNumNonzeros_core(matrix, "Double"); } /*-------------------------------------------------------------------------- * hypre_ParCSRMatrixSetNumRownnz *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ParCSRMatrixSetNumRownnz( hypre_ParCSRMatrix *matrix ) { MPI_Comm comm = hypre_ParCSRMatrixComm(matrix); hypre_CSRMatrix *diag = hypre_ParCSRMatrixDiag(matrix); hypre_CSRMatrix *offd = hypre_ParCSRMatrixOffd(matrix); HYPRE_Int *rownnz_diag = hypre_CSRMatrixRownnz(diag); HYPRE_Int *rownnz_offd = hypre_CSRMatrixRownnz(offd); HYPRE_Int num_rownnz_diag = hypre_CSRMatrixNumRownnz(diag); HYPRE_Int num_rownnz_offd = hypre_CSRMatrixNumRownnz(offd); HYPRE_BigInt local_num_rownnz; HYPRE_BigInt global_num_rownnz; HYPRE_Int i, j; if (!matrix) { hypre_error_in_arg(1); return hypre_error_flag; } local_num_rownnz = i = j = 0; while (i < num_rownnz_diag && j < num_rownnz_offd) { local_num_rownnz++; if (rownnz_diag[i] < rownnz_offd[j]) { i++; } else { j++; } } local_num_rownnz += (HYPRE_BigInt) ((num_rownnz_diag - i) + (num_rownnz_offd - j)); hypre_MPI_Allreduce(&local_num_rownnz, &global_num_rownnz, 1, HYPRE_MPI_BIG_INT, hypre_MPI_SUM, comm); hypre_ParCSRMatrixGlobalNumRownnz(matrix) = global_num_rownnz; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_ParCSRMatrixSetDataOwner *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ParCSRMatrixSetDataOwner( hypre_ParCSRMatrix *matrix, HYPRE_Int owns_data ) { if (!matrix) { hypre_error_in_arg(1); return hypre_error_flag; } hypre_ParCSRMatrixOwnsData(matrix) = owns_data; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_ParCSRMatrixSetPatternOnly *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ParCSRMatrixSetPatternOnly( hypre_ParCSRMatrix *matrix, HYPRE_Int pattern_only) { if (!matrix) { hypre_error_in_arg(1); return hypre_error_flag; } if (hypre_ParCSRMatrixDiag(matrix)) { hypre_CSRMatrixSetPatternOnly(hypre_ParCSRMatrixDiag(matrix), pattern_only); } if (hypre_ParCSRMatrixOffd(matrix)) { hypre_CSRMatrixSetPatternOnly(hypre_ParCSRMatrixOffd(matrix), pattern_only); } return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_ParCSRMatrixCreateFromDenseBlockMatrix *--------------------------------------------------------------------------*/ hypre_ParCSRMatrix* hypre_ParCSRMatrixCreateFromDenseBlockMatrix(MPI_Comm comm, HYPRE_BigInt global_num_rows, HYPRE_BigInt global_num_cols, HYPRE_BigInt *row_starts, HYPRE_BigInt *col_starts, hypre_DenseBlockMatrix *B) { /* Input matrix variables */ HYPRE_Int num_rows_diag = hypre_DenseBlockMatrixNumRows(B); HYPRE_Int num_nonzeros_diag = hypre_DenseBlockMatrixNumNonzeros(B); HYPRE_Int num_rows_block = hypre_DenseBlockMatrixNumRowsBlock(B); HYPRE_Int num_cols_block = hypre_DenseBlockMatrixNumColsBlock(B); HYPRE_Int num_cols_offd = 0; HYPRE_Int num_nonzeros_offd = 0; HYPRE_MemoryLocation memory_location = hypre_DenseBlockMatrixMemoryLocation(B); /* Output matrix variables */ hypre_ParCSRMatrix *A; hypre_CSRMatrix *A_diag; hypre_CSRMatrix *A_offd; HYPRE_Int *A_diag_i; HYPRE_Int *A_diag_j; /* Local variables */ HYPRE_Int i, j, ib; /* Create output matrix */ A = hypre_ParCSRMatrixCreate(comm, global_num_rows, global_num_cols, row_starts, col_starts, num_cols_offd, num_nonzeros_diag, num_nonzeros_offd); A_diag = hypre_ParCSRMatrixDiag(A); A_offd = hypre_ParCSRMatrixOffd(A); /* Set memory locations */ hypre_CSRMatrixMemoryLocation(A_diag) = memory_location; hypre_CSRMatrixMemoryLocation(A_offd) = memory_location; /* Set diag's data pointer */ if (hypre_DenseBlockMatrixOwnsData(B)) { hypre_CSRMatrixData(A_diag) = hypre_DenseBlockMatrixData(B); } else { hypre_CSRMatrixData(A_diag) = hypre_CTAlloc(HYPRE_Complex, num_nonzeros_diag, memory_location); hypre_TMemcpy(hypre_CSRMatrixData(A_diag), hypre_DenseBlockMatrixData(B), HYPRE_Complex, num_nonzeros_diag, memory_location, memory_location); } hypre_DenseBlockMatrixOwnsData(B) = 0; /* Set diag's row pointer and column indices */ A_diag_i = hypre_CTAlloc(HYPRE_Int, num_rows_diag + 1, HYPRE_MEMORY_HOST); A_diag_j = hypre_CTAlloc(HYPRE_Int, num_nonzeros_diag, HYPRE_MEMORY_HOST); #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i, ib, j) HYPRE_SMP_SCHEDULE #endif for (i = 0; i < num_rows_diag; i++) { ib = i / num_rows_block; A_diag_i[i] = i * num_cols_block; for (j = A_diag_i[i]; j < (i + 1) * num_cols_block; j++) { A_diag_j[j] = ib * num_cols_block + (j - A_diag_i[i]); } } A_diag_i[num_rows_diag] = num_rows_diag * num_cols_block; /* Migrate to dest. memory location */ if (memory_location != HYPRE_MEMORY_HOST) { hypre_CSRMatrixI(A_diag) = hypre_TAlloc(HYPRE_Int, num_rows_diag + 1, memory_location); hypre_CSRMatrixJ(A_diag) = hypre_TAlloc(HYPRE_Int, num_nonzeros_diag, memory_location); hypre_TMemcpy(hypre_CSRMatrixI(A_diag), A_diag_i, HYPRE_Int, num_rows_diag + 1, memory_location, HYPRE_MEMORY_HOST); hypre_TMemcpy(hypre_CSRMatrixJ(A_diag), A_diag_j, HYPRE_Int, num_nonzeros_diag, memory_location, HYPRE_MEMORY_HOST); } else { hypre_CSRMatrixI(A_diag) = A_diag_i; hypre_CSRMatrixJ(A_diag) = A_diag_j; } return A; } /*-------------------------------------------------------------------------- * hypre_ParCSRMatrixCreateFromParVector *--------------------------------------------------------------------------*/ hypre_ParCSRMatrix* hypre_ParCSRMatrixCreateFromParVector(hypre_ParVector *b, HYPRE_BigInt global_num_rows, HYPRE_BigInt global_num_cols, HYPRE_BigInt *row_starts, HYPRE_BigInt *col_starts) { /* Input vector variables */ MPI_Comm comm = hypre_ParVectorComm(b); hypre_Vector *local_vector = hypre_ParVectorLocalVector(b); HYPRE_MemoryLocation memory_location = hypre_ParVectorMemoryLocation(b); /* Auxiliary variables */ HYPRE_Int num_rows = (HYPRE_Int) row_starts[1] - row_starts[0]; HYPRE_Int num_cols = (HYPRE_Int) col_starts[1] - col_starts[0]; HYPRE_Int num_nonzeros = hypre_min(num_rows, num_cols); /* Output matrix variables */ hypre_ParCSRMatrix *A; hypre_CSRMatrix *A_diag; hypre_CSRMatrix *A_offd; HYPRE_Int *A_diag_i; HYPRE_Int *A_diag_j; /* Local variables */ HYPRE_Int i; /* Sanity check */ if (hypre_ParVectorNumVectors(b) > 1) { hypre_error_w_msg(HYPRE_ERROR_GENERIC, "Not implemented for multi-component vectors"); return NULL; } /* Create output matrix */ A = hypre_ParCSRMatrixCreate(comm, global_num_rows, global_num_cols, row_starts, col_starts, 0, num_nonzeros, 0); A_diag = hypre_ParCSRMatrixDiag(A); A_offd = hypre_ParCSRMatrixOffd(A); /* Set memory locations */ hypre_CSRMatrixMemoryLocation(A_diag) = memory_location; hypre_CSRMatrixMemoryLocation(A_offd) = memory_location; /* Set diag's data pointer */ if (hypre_VectorOwnsData(local_vector)) { hypre_CSRMatrixData(A_diag) = hypre_VectorData(local_vector); hypre_VectorOwnsData(local_vector) = 0; } else { hypre_CSRMatrixData(A_diag) = hypre_CTAlloc(HYPRE_Complex, num_nonzeros, memory_location); hypre_TMemcpy(hypre_CSRMatrixData(A_diag), hypre_VectorData(local_vector), HYPRE_Complex, num_nonzeros, memory_location, memory_location); } /* Set diag's row pointer and column indices */ A_diag_i = hypre_CTAlloc(HYPRE_Int, num_rows + 1, HYPRE_MEMORY_HOST); A_diag_j = hypre_CTAlloc(HYPRE_Int, num_nonzeros, HYPRE_MEMORY_HOST); #ifdef HYPRE_USING_OPENMP #pragma omp parallel for HYPRE_SMP_SCHEDULE #endif for (i = 0; i < num_nonzeros; i++) { A_diag_i[i] = A_diag_j[i] = i; } #ifdef HYPRE_USING_OPENMP #pragma omp parallel for HYPRE_SMP_SCHEDULE #endif for (i = num_nonzeros; i < num_rows + 1; i++) { A_diag_i[i] = num_nonzeros; } /* Initialize offd portion */ hypre_CSRMatrixInitialize_v2(A_offd, 0, memory_location); /* Migrate to dest. memory location */ if (memory_location != HYPRE_MEMORY_HOST) { hypre_CSRMatrixI(A_diag) = hypre_TAlloc(HYPRE_Int, num_rows + 1, memory_location); hypre_CSRMatrixJ(A_diag) = hypre_TAlloc(HYPRE_Int, num_nonzeros, memory_location); hypre_TMemcpy(hypre_CSRMatrixI(A_diag), A_diag_i, HYPRE_Int, num_rows + 1, memory_location, HYPRE_MEMORY_HOST); hypre_TMemcpy(hypre_CSRMatrixJ(A_diag), A_diag_j, HYPRE_Int, num_nonzeros, memory_location, HYPRE_MEMORY_HOST); hypre_TFree(A_diag_i, HYPRE_MEMORY_HOST); hypre_TFree(A_diag_j, HYPRE_MEMORY_HOST); } else { hypre_CSRMatrixI(A_diag) = A_diag_i; hypre_CSRMatrixJ(A_diag) = A_diag_j; } return A; } /*-------------------------------------------------------------------------- * hypre_ParCSRMatrixRead *--------------------------------------------------------------------------*/ hypre_ParCSRMatrix * hypre_ParCSRMatrixRead( MPI_Comm comm, const char *file_name ) { hypre_ParCSRMatrix *matrix; hypre_CSRMatrix *diag; hypre_CSRMatrix *offd; HYPRE_Int my_id, num_procs; HYPRE_Int num_cols_offd; HYPRE_Int i, local_num_rows; HYPRE_BigInt row_starts[2]; HYPRE_BigInt col_starts[2]; HYPRE_BigInt *col_map_offd; HYPRE_BigInt row_s, row_e, col_s, col_e; HYPRE_BigInt global_num_rows, global_num_cols; FILE *fp; char new_file_d[HYPRE_MAX_FILE_NAME_LEN]; char new_file_o[HYPRE_MAX_FILE_NAME_LEN]; char new_file_info[HYPRE_MAX_FILE_NAME_LEN]; hypre_MPI_Comm_rank(comm, &my_id); hypre_MPI_Comm_size(comm, &num_procs); hypre_sprintf(new_file_d, "%s.D.%d", file_name, my_id); hypre_sprintf(new_file_o, "%s.O.%d", file_name, my_id); hypre_sprintf(new_file_info, "%s.INFO.%d", file_name, my_id); fp = fopen(new_file_info, "r"); hypre_fscanf(fp, "%b", &global_num_rows); hypre_fscanf(fp, "%b", &global_num_cols); hypre_fscanf(fp, "%d", &num_cols_offd); /* the bgl input file should only contain the EXACT range for local processor */ hypre_fscanf(fp, "%b %b %b %b", &row_s, &row_e, &col_s, &col_e); row_starts[0] = row_s; row_starts[1] = row_e; col_starts[0] = col_s; col_starts[1] = col_e; col_map_offd = hypre_CTAlloc(HYPRE_BigInt, num_cols_offd, HYPRE_MEMORY_HOST); for (i = 0; i < num_cols_offd; i++) { hypre_fscanf(fp, "%b", &col_map_offd[i]); } fclose(fp); diag = hypre_CSRMatrixRead(new_file_d); local_num_rows = hypre_CSRMatrixNumRows(diag); if (num_cols_offd) { offd = hypre_CSRMatrixRead(new_file_o); } else { offd = hypre_CSRMatrixCreate(local_num_rows, 0, 0); hypre_CSRMatrixInitialize_v2(offd, 0, HYPRE_MEMORY_HOST); } matrix = hypre_CTAlloc(hypre_ParCSRMatrix, 1, HYPRE_MEMORY_HOST); hypre_ParCSRMatrixComm(matrix) = comm; hypre_ParCSRMatrixGlobalNumRows(matrix) = global_num_rows; hypre_ParCSRMatrixGlobalNumCols(matrix) = global_num_cols; hypre_ParCSRMatrixFirstRowIndex(matrix) = row_s; hypre_ParCSRMatrixFirstColDiag(matrix) = col_s; hypre_ParCSRMatrixLastRowIndex(matrix) = row_e - 1; hypre_ParCSRMatrixLastColDiag(matrix) = col_e - 1; hypre_ParCSRMatrixRowStarts(matrix)[0] = row_starts[0]; hypre_ParCSRMatrixRowStarts(matrix)[1] = row_starts[1]; hypre_ParCSRMatrixColStarts(matrix)[0] = col_starts[0]; hypre_ParCSRMatrixColStarts(matrix)[1] = col_starts[1]; hypre_ParCSRMatrixCommPkg(matrix) = NULL; /* set defaults */ hypre_ParCSRMatrixOwnsData(matrix) = 1; hypre_ParCSRMatrixDiag(matrix) = diag; hypre_ParCSRMatrixOffd(matrix) = offd; if (num_cols_offd) { hypre_ParCSRMatrixColMapOffd(matrix) = col_map_offd; } else { hypre_ParCSRMatrixColMapOffd(matrix) = NULL; } return matrix; } /*-------------------------------------------------------------------------- * hypre_ParCSRMatrixPrint *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ParCSRMatrixPrint( hypre_ParCSRMatrix *matrix, const char *file_name ) { MPI_Comm comm; HYPRE_BigInt global_num_rows; HYPRE_BigInt global_num_cols; HYPRE_BigInt *col_map_offd; HYPRE_Int my_id, i, num_procs; char new_file_d[HYPRE_MAX_FILE_NAME_LEN]; char new_file_o[HYPRE_MAX_FILE_NAME_LEN]; char new_file_info[HYPRE_MAX_FILE_NAME_LEN]; FILE *fp; HYPRE_Int num_cols_offd = 0; HYPRE_BigInt row_s, row_e, col_s, col_e; if (!matrix) { hypre_error_in_arg(1); return hypre_error_flag; } comm = hypre_ParCSRMatrixComm(matrix); global_num_rows = hypre_ParCSRMatrixGlobalNumRows(matrix); global_num_cols = hypre_ParCSRMatrixGlobalNumCols(matrix); col_map_offd = hypre_ParCSRMatrixColMapOffd(matrix); if (hypre_ParCSRMatrixOffd(matrix)) { num_cols_offd = hypre_CSRMatrixNumCols(hypre_ParCSRMatrixOffd(matrix)); } hypre_MPI_Comm_rank(comm, &my_id); hypre_MPI_Comm_size(comm, &num_procs); hypre_sprintf(new_file_d, "%s.D.%d", file_name, my_id); hypre_sprintf(new_file_o, "%s.O.%d", file_name, my_id); hypre_sprintf(new_file_info, "%s.INFO.%d", file_name, my_id); hypre_CSRMatrixPrint(hypre_ParCSRMatrixDiag(matrix), new_file_d); if (num_cols_offd != 0) { hypre_CSRMatrixPrint(hypre_ParCSRMatrixOffd(matrix), new_file_o); } fp = fopen(new_file_info, "w"); hypre_fprintf(fp, "%b\n", global_num_rows); hypre_fprintf(fp, "%b\n", global_num_cols); hypre_fprintf(fp, "%d\n", num_cols_offd); row_s = hypre_ParCSRMatrixFirstRowIndex(matrix); row_e = hypre_ParCSRMatrixLastRowIndex(matrix); col_s = hypre_ParCSRMatrixFirstColDiag(matrix); col_e = hypre_ParCSRMatrixLastColDiag(matrix); /* add 1 to the ends because this is a starts partition */ hypre_fprintf(fp, "%b %b %b %b\n", row_s, row_e + 1, col_s, col_e + 1); for (i = 0; i < num_cols_offd; i++) { hypre_fprintf(fp, "%b\n", col_map_offd[i]); } fclose(fp); return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_ParCSRMatrixPrintIJ *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ParCSRMatrixPrintIJ( const hypre_ParCSRMatrix *matrix, const HYPRE_Int base_i, const HYPRE_Int base_j, const char *filename ) { hypre_ParCSRMatrix *h_matrix; MPI_Comm comm; HYPRE_BigInt first_row_index; HYPRE_BigInt first_col_diag; hypre_CSRMatrix *diag; hypre_CSRMatrix *offd; HYPRE_BigInt *col_map_offd; HYPRE_Int num_rows; const HYPRE_BigInt *row_starts; const HYPRE_BigInt *col_starts; HYPRE_Complex *diag_data; HYPRE_Int *diag_i; HYPRE_Int *diag_j; HYPRE_Complex *offd_data; HYPRE_Int *offd_i = NULL; HYPRE_Int *offd_j; HYPRE_Int myid, num_procs, i, j; HYPRE_BigInt I, J; char new_filename[HYPRE_MAX_FILE_NAME_LEN]; FILE *file; HYPRE_Int num_nonzeros_offd; HYPRE_BigInt ilower, iupper, jlower, jupper; HYPRE_MemoryLocation memory_location = hypre_ParCSRMatrixMemoryLocation((hypre_ParCSRMatrix*) matrix); if (!matrix) { hypre_error_in_arg(1); return hypre_error_flag; } /* Create temporary matrix on host memory if needed */ if (hypre_GetActualMemLocation(memory_location) == hypre_MEMORY_HOST) { h_matrix = (hypre_ParCSRMatrix *) matrix; } else { h_matrix = hypre_ParCSRMatrixClone_v2((hypre_ParCSRMatrix *) matrix, 1, HYPRE_MEMORY_HOST); } comm = hypre_ParCSRMatrixComm(h_matrix); first_row_index = hypre_ParCSRMatrixFirstRowIndex(h_matrix); first_col_diag = hypre_ParCSRMatrixFirstColDiag(h_matrix); diag = hypre_ParCSRMatrixDiag(h_matrix); offd = hypre_ParCSRMatrixOffd(h_matrix); col_map_offd = hypre_ParCSRMatrixColMapOffd(h_matrix); num_rows = hypre_ParCSRMatrixNumRows(h_matrix); row_starts = hypre_ParCSRMatrixRowStarts(h_matrix); col_starts = hypre_ParCSRMatrixColStarts(h_matrix); hypre_MPI_Comm_rank(comm, &myid); hypre_MPI_Comm_size(comm, &num_procs); hypre_sprintf(new_filename, "%s.%05d", filename, myid); if ((file = fopen(new_filename, "w")) == NULL) { hypre_error_w_msg(HYPRE_ERROR_GENERIC, "Error: can't open output file %s\n"); return hypre_error_flag; } diag_data = hypre_CSRMatrixData(diag); diag_i = hypre_CSRMatrixI(diag); diag_j = hypre_CSRMatrixJ(diag); num_nonzeros_offd = hypre_CSRMatrixNumNonzeros(offd); if (num_nonzeros_offd) { offd_data = hypre_CSRMatrixData(offd); offd_i = hypre_CSRMatrixI(offd); offd_j = hypre_CSRMatrixJ(offd); } ilower = row_starts[0] + (HYPRE_BigInt) base_i; iupper = row_starts[1] + (HYPRE_BigInt) base_i - 1; jlower = col_starts[0] + (HYPRE_BigInt) base_j; jupper = col_starts[1] + (HYPRE_BigInt) base_j - 1; hypre_fprintf(file, "%b %b %b %b\n", ilower, iupper, jlower, jupper); for (i = 0; i < num_rows; i++) { I = first_row_index + (HYPRE_BigInt)(i + base_i); /* print diag columns */ for (j = diag_i[i]; j < diag_i[i + 1]; j++) { J = first_col_diag + (HYPRE_BigInt)(diag_j[j] + base_j); if (diag_data) { #ifdef HYPRE_COMPLEX hypre_fprintf(file, "%b %b %.14e , %.14e\n", I, J, hypre_creal(diag_data[j]), hypre_cimag(diag_data[j])); #else hypre_fprintf(file, "%b %b %.14e\n", I, J, diag_data[j]); #endif } else { hypre_fprintf(file, "%b %b\n", I, J); } } /* print offd columns */ if (num_nonzeros_offd) { for (j = offd_i[i]; j < offd_i[i + 1]; j++) { J = col_map_offd[offd_j[j]] + (HYPRE_BigInt) base_j; if (offd_data) { #ifdef HYPRE_COMPLEX hypre_fprintf(file, "%b %b %.14e , %.14e\n", I, J, hypre_creal(offd_data[j]), hypre_cimag(offd_data[j])); #else hypre_fprintf(file, "%b %b %.14e\n", I, J, offd_data[j]); #endif } else { hypre_fprintf(file, "%b %b\n", I, J); } } } } fclose(file); /* Free temporary matrix */ if (hypre_GetActualMemLocation(memory_location) != hypre_MEMORY_HOST) { hypre_ParCSRMatrixDestroy(h_matrix); } return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_ParCSRMatrixPrintBinaryIJ * * Prints a ParCSRMatrix in binary format. The data from each process is * printed to a separate file. Metadata info about the matrix is printed in * the header section of every file, and it is followed by the raw data, i.e., * row, column, and coefficients. * * The header section is composed by 11 entries stored in 88 bytes (8 bytes * each) and their meanings are: * * 0) Header version * 1) Number of bytes for storing an integer type (row and columns) * 2) Number of bytes for storing a real type (coefficients) * 3) Number of rows in the matrix * 4) Number of columns in the matrix * 5) Number of nonzero coefficients in the matrix * 6) Number of local nonzero coefficients in the current matrix block * 7) Global index of the first row of the current matrix block * 8) Global index of the last row of the current matrix block * 9) Global index of the first column in the diagonal matrix block * 10) Global index of the last column in the diagonal matrix block *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ParCSRMatrixPrintBinaryIJ( hypre_ParCSRMatrix *matrix, HYPRE_Int base_i, HYPRE_Int base_j, const char *filename ) { MPI_Comm comm = hypre_ParCSRMatrixComm(matrix); HYPRE_MemoryLocation memory_location = hypre_ParCSRMatrixMemoryLocation(matrix); hypre_ParCSRMatrix *h_matrix; HYPRE_BigInt first_row_index; HYPRE_BigInt first_col_diag; hypre_CSRMatrix *diag, *offd; HYPRE_BigInt *col_map_offd; HYPRE_Int num_rows; HYPRE_BigInt *row_starts, *col_starts; HYPRE_Complex *diag_data; HYPRE_Int *diag_i, *diag_j; HYPRE_Int diag_nnz; HYPRE_Complex *offd_data; HYPRE_Int *offd_i, *offd_j; HYPRE_Int offd_nnz; /* Local buffers */ hypre_uint32 *i32buffer = NULL; hypre_uint64 *i64buffer = NULL; hypre_float *f32buffer = NULL; hypre_double *f64buffer = NULL; /* Local variables */ char new_filename[HYPRE_MAX_FILE_NAME_LEN]; FILE *fp; hypre_uint64 header[11]; size_t count, k; HYPRE_Int one = 1; HYPRE_Int myid, i, j; HYPRE_BigInt bigI, bigJ; HYPRE_BigInt ilower, iupper, jlower, jupper; HYPRE_Complex val; /* Exit if trying to write from big-endian machine */ if ((*(char*)&one) == 0) { hypre_error_w_msg(HYPRE_ERROR_GENERIC, "Support to big-endian machines is incomplete!\n"); return hypre_error_flag; } /* MPI variables */ hypre_MPI_Comm_rank(comm, &myid); /* Create temporary matrix on host memory if needed */ h_matrix = (hypre_GetActualMemLocation(memory_location) == hypre_MEMORY_DEVICE) ? hypre_ParCSRMatrixClone_v2(matrix, 1, HYPRE_MEMORY_HOST) : matrix; /* Update global number of nonzeros */ hypre_ParCSRMatrixSetDNumNonzeros(h_matrix); /* Matrix variables */ first_row_index = hypre_ParCSRMatrixFirstRowIndex(h_matrix); first_col_diag = hypre_ParCSRMatrixFirstColDiag(h_matrix); diag = hypre_ParCSRMatrixDiag(h_matrix); offd = hypre_ParCSRMatrixOffd(h_matrix); col_map_offd = hypre_ParCSRMatrixColMapOffd(h_matrix); num_rows = hypre_ParCSRMatrixNumRows(h_matrix); row_starts = hypre_ParCSRMatrixRowStarts(h_matrix); col_starts = hypre_ParCSRMatrixColStarts(h_matrix); /* Diagonal matrix variables */ diag_nnz = hypre_CSRMatrixNumNonzeros(diag); diag_data = hypre_CSRMatrixData(diag); diag_i = hypre_CSRMatrixI(diag); diag_j = hypre_CSRMatrixJ(diag); /* Off-diagonal matrix variables */ offd_nnz = hypre_CSRMatrixNumNonzeros(offd); offd_data = hypre_CSRMatrixData(offd); offd_i = hypre_CSRMatrixI(offd); offd_j = hypre_CSRMatrixJ(offd); /* Set global matrix bounds */ ilower = row_starts[0] + (HYPRE_BigInt) base_i; iupper = row_starts[1] + (HYPRE_BigInt) base_i - 1; jlower = col_starts[0] + (HYPRE_BigInt) base_j; jupper = col_starts[1] + (HYPRE_BigInt) base_j - 1; /* Open binary file */ hypre_sprintf(new_filename, "%s.%05d.bin", filename, myid); if ((fp = fopen(new_filename, "wb")) == NULL) { hypre_error_w_msg(HYPRE_ERROR_GENERIC, "Could not open output file!"); return hypre_error_flag; } /*--------------------------------------------- * Write header (88 bytes) *---------------------------------------------*/ count = 11; header[0] = (hypre_uint64) 1; /* Header version */ header[1] = (hypre_uint64) sizeof(HYPRE_BigInt); header[2] = (hypre_uint64) sizeof(HYPRE_Complex); header[3] = (hypre_uint64) hypre_ParCSRMatrixGlobalNumRows(h_matrix);; header[4] = (hypre_uint64) hypre_ParCSRMatrixGlobalNumCols(h_matrix);; header[5] = (hypre_uint64) hypre_ParCSRMatrixDNumNonzeros(h_matrix); header[6] = (hypre_uint64) diag_nnz + offd_nnz; /* local number of nonzeros*/ header[7] = (hypre_uint64) ilower; header[8] = (hypre_uint64) iupper; header[9] = (hypre_uint64) jlower; header[10] = (hypre_uint64) jupper; if (fwrite((const void*) header, sizeof(hypre_uint64), count, fp) != count) { hypre_error_w_msg(HYPRE_ERROR_GENERIC, "Could not write all header entries\n"); return hypre_error_flag; } /* Allocate memory for buffers */ if (sizeof(HYPRE_BigInt) == sizeof(hypre_uint32)) { i32buffer = hypre_TAlloc(hypre_uint32, header[6], HYPRE_MEMORY_HOST); } else if (sizeof(HYPRE_BigInt) == sizeof(hypre_uint64)) { i64buffer = hypre_TAlloc(hypre_uint64, header[6], HYPRE_MEMORY_HOST); } else { hypre_error_w_msg(HYPRE_ERROR_GENERIC, "Unsupported data type for row/column indices\n"); return hypre_error_flag; } /* Allocate memory for buffers */ if (sizeof(HYPRE_Complex) == sizeof(hypre_float)) { f32buffer = hypre_TAlloc(hypre_float, header[6], HYPRE_MEMORY_HOST); } else if (sizeof(HYPRE_Complex) == sizeof(hypre_double)) { f64buffer = hypre_TAlloc(hypre_double, header[6], HYPRE_MEMORY_HOST); } else { hypre_error_w_msg(HYPRE_ERROR_GENERIC, "Unsupported data type for matrix coefficients\n"); return hypre_error_flag; } /*--------------------------------------------- * Write row indices to file *---------------------------------------------*/ for (i = 0, k = 0; i < num_rows; i++) { bigI = first_row_index + (HYPRE_BigInt)(i + base_i); for (j = 0; j < (diag_i[i + 1] - diag_i[i]) + (offd_i[i + 1] - offd_i[i]); j++) { if (i32buffer) { i32buffer[k++] = (hypre_uint32) bigI; } else { i64buffer[k++] = (hypre_uint64) bigI; } } } /* Write buffer */ if (i32buffer) { count = fwrite((const void*) i32buffer, sizeof(hypre_uint32), k, fp); } else if (i64buffer) { count = fwrite((const void*) i64buffer, sizeof(hypre_uint64), k, fp); } if (count != k) { hypre_error_w_msg(HYPRE_ERROR_GENERIC, "Could not write all row indices entries\n"); return hypre_error_flag; } /*--------------------------------------------- * Write columns indices to file *---------------------------------------------*/ for (i = 0, k = 0; i < num_rows; i++) { for (j = diag_i[i]; j < diag_i[i + 1]; j++) { bigJ = first_col_diag + (HYPRE_BigInt)(diag_j[j] + base_j); if (i32buffer) { i32buffer[k++] = (hypre_uint32) bigJ; } else { i64buffer[k++] = (hypre_uint64) bigJ; } } for (j = offd_i[i]; j < offd_i[i + 1]; j++) { bigJ = col_map_offd[offd_j[j]] + (HYPRE_BigInt) base_j; if (i32buffer) { i32buffer[k++] = (hypre_uint32) bigJ; } else { i64buffer[k++] = (hypre_uint64) bigJ; } } } /* Write buffer */ if (i32buffer) { count = fwrite((const void*) i32buffer, sizeof(hypre_uint32), k, fp); } else if (i64buffer) { count = fwrite((const void*) i64buffer, sizeof(hypre_uint64), k, fp); } if (count != k) { hypre_error_w_msg(HYPRE_ERROR_GENERIC, "Could not write all column indices entries\n"); return hypre_error_flag; } /*--------------------------------------------- * Write coefficients indices to file *---------------------------------------------*/ if (diag_data) { for (i = 0, k = 0; i < num_rows; i++) { for (j = diag_i[i]; j < diag_i[i + 1]; j++) { val = diag_data[j]; if (f32buffer) { f32buffer[k++] = (hypre_float) val; } else { f64buffer[k++] = (hypre_double) val; } } for (j = offd_i[i]; j < offd_i[i + 1]; j++) { val = offd_data[j]; if (f32buffer) { f32buffer[k++] = (hypre_float) val; } else { f64buffer[k++] = (hypre_double) val; } } } /* Write buffer */ if (f32buffer) { count = fwrite((const void*) f32buffer, sizeof(hypre_float), k, fp); } else if (f64buffer) { count = fwrite((const void*) f64buffer, sizeof(hypre_double), k, fp); } if (count != k) { hypre_error_w_msg(HYPRE_ERROR_GENERIC, "Could not write all matrix coefficients\n"); return hypre_error_flag; } } fclose(fp); /*--------------------------------------------- * Free memory *---------------------------------------------*/ if (h_matrix != matrix) { hypre_ParCSRMatrixDestroy(h_matrix); } hypre_TFree(i32buffer, HYPRE_MEMORY_HOST); hypre_TFree(i64buffer, HYPRE_MEMORY_HOST); hypre_TFree(f32buffer, HYPRE_MEMORY_HOST); hypre_TFree(f64buffer, HYPRE_MEMORY_HOST); return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_ParCSRMatrixReadIJ *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ParCSRMatrixReadIJ( MPI_Comm comm, const char *filename, HYPRE_Int *base_i_ptr, HYPRE_Int *base_j_ptr, hypre_ParCSRMatrix **matrix_ptr) { HYPRE_BigInt global_num_rows; HYPRE_BigInt global_num_cols; HYPRE_BigInt first_row_index; HYPRE_BigInt first_col_diag; HYPRE_BigInt last_col_diag; hypre_ParCSRMatrix *matrix; hypre_CSRMatrix *diag; hypre_CSRMatrix *offd; HYPRE_BigInt *col_map_offd; HYPRE_BigInt row_starts[2]; HYPRE_BigInt col_starts[2]; HYPRE_Int num_rows; HYPRE_BigInt big_base_i, big_base_j; HYPRE_Int base_i, base_j; HYPRE_Complex *diag_data; HYPRE_Int *diag_i; HYPRE_Int *diag_j; HYPRE_Complex *offd_data = NULL; HYPRE_Int *offd_i; HYPRE_Int *offd_j = NULL; HYPRE_BigInt *tmp_j = NULL; HYPRE_BigInt *aux_offd_j; HYPRE_BigInt I, J; HYPRE_Int myid, num_procs, i, i2, j; char new_filename[HYPRE_MAX_FILE_NAME_LEN]; FILE *file; HYPRE_Int num_cols_offd, num_nonzeros_diag, num_nonzeros_offd; HYPRE_Int i_col, num_cols; HYPRE_Int diag_cnt, offd_cnt, row_cnt; HYPRE_Complex data; hypre_MPI_Comm_size(comm, &num_procs); hypre_MPI_Comm_rank(comm, &myid); hypre_sprintf(new_filename, "%s.%05d", filename, myid); if ((file = fopen(new_filename, "r")) == NULL) { hypre_error_w_msg(HYPRE_ERROR_GENERIC, "Error: can't open output file %s\n"); return hypre_error_flag; } hypre_fscanf(file, "%b %b", &global_num_rows, &global_num_cols); hypre_fscanf(file, "%d %d %d", &num_rows, &num_cols, &num_cols_offd); hypre_fscanf(file, "%d %d", &num_nonzeros_diag, &num_nonzeros_offd); hypre_fscanf(file, "%b %b %b %b", &row_starts[0], &col_starts[0], &row_starts[1], &col_starts[1]); big_base_i = row_starts[0]; big_base_j = col_starts[0]; base_i = (HYPRE_Int) row_starts[0]; base_j = (HYPRE_Int) col_starts[0]; matrix = hypre_ParCSRMatrixCreate(comm, global_num_rows, global_num_cols, row_starts, col_starts, num_cols_offd, num_nonzeros_diag, num_nonzeros_offd); hypre_ParCSRMatrixInitialize(matrix); diag = hypre_ParCSRMatrixDiag(matrix); offd = hypre_ParCSRMatrixOffd(matrix); diag_data = hypre_CSRMatrixData(diag); diag_i = hypre_CSRMatrixI(diag); diag_j = hypre_CSRMatrixJ(diag); offd_i = hypre_CSRMatrixI(offd); if (num_nonzeros_offd) { offd_data = hypre_CSRMatrixData(offd); offd_j = hypre_CSRMatrixJ(offd); tmp_j = hypre_CTAlloc(HYPRE_BigInt, num_nonzeros_offd, HYPRE_MEMORY_HOST); } first_row_index = hypre_ParCSRMatrixFirstRowIndex(matrix); first_col_diag = hypre_ParCSRMatrixFirstColDiag(matrix); last_col_diag = first_col_diag + (HYPRE_BigInt)num_cols - 1; diag_cnt = 0; offd_cnt = 0; row_cnt = 0; for (i = 0; i < num_nonzeros_diag + num_nonzeros_offd; i++) { /* read values */ hypre_fscanf(file, "%b %b %le", &I, &J, &data); i2 = (HYPRE_Int)(I - big_base_i - first_row_index); J -= big_base_j; if (i2 > row_cnt) { diag_i[i2] = diag_cnt; offd_i[i2] = offd_cnt; row_cnt++; } if (J < first_col_diag || J > last_col_diag) { tmp_j[offd_cnt] = J; offd_data[offd_cnt++] = data; } else { diag_j[diag_cnt] = (HYPRE_Int)(J - first_col_diag); diag_data[diag_cnt++] = data; } } diag_i[num_rows] = diag_cnt; offd_i[num_rows] = offd_cnt; fclose(file); /* generate col_map_offd */ if (num_nonzeros_offd) { aux_offd_j = hypre_CTAlloc(HYPRE_BigInt, num_nonzeros_offd, HYPRE_MEMORY_HOST); for (i = 0; i < num_nonzeros_offd; i++) { aux_offd_j[i] = (HYPRE_BigInt)offd_j[i]; } hypre_BigQsort0(aux_offd_j, 0, num_nonzeros_offd - 1); col_map_offd = hypre_ParCSRMatrixColMapOffd(matrix); col_map_offd[0] = aux_offd_j[0]; offd_cnt = 0; for (i = 1; i < num_nonzeros_offd; i++) { if (aux_offd_j[i] > col_map_offd[offd_cnt]) { col_map_offd[++offd_cnt] = aux_offd_j[i]; } } for (i = 0; i < num_nonzeros_offd; i++) { offd_j[i] = hypre_BigBinarySearch(col_map_offd, tmp_j[i], num_cols_offd); } hypre_TFree(aux_offd_j, HYPRE_MEMORY_HOST); hypre_TFree(tmp_j, HYPRE_MEMORY_HOST); } /* move diagonal element in first position in each row */ for (i = 0; i < num_rows; i++) { i_col = diag_i[i]; for (j = i_col; j < diag_i[i + 1]; j++) { if (diag_j[j] == i) { diag_j[j] = diag_j[i_col]; data = diag_data[j]; diag_data[j] = diag_data[i_col]; diag_data[i_col] = data; diag_j[i_col] = i; break; } } } *base_i_ptr = base_i; *base_j_ptr = base_j; *matrix_ptr = matrix; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_ParCSRMatrixGetLocalRange * returns the row numbers of the rows stored on this processor. * "End" is actually the row number of the last row on this processor. *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ParCSRMatrixGetLocalRange( hypre_ParCSRMatrix *matrix, HYPRE_BigInt *row_start, HYPRE_BigInt *row_end, HYPRE_BigInt *col_start, HYPRE_BigInt *col_end ) { HYPRE_Int my_id; if (!matrix) { hypre_error_in_arg(1); return hypre_error_flag; } hypre_MPI_Comm_rank( hypre_ParCSRMatrixComm(matrix), &my_id ); *row_start = hypre_ParCSRMatrixFirstRowIndex(matrix); *row_end = hypre_ParCSRMatrixLastRowIndex(matrix); *col_start = hypre_ParCSRMatrixFirstColDiag(matrix); *col_end = hypre_ParCSRMatrixLastColDiag(matrix); return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_ParCSRMatrixGetRow * Returns global column indices and/or values for a given row in the global * matrix. Global row number is used, but the row must be stored locally or * an error is returned. This implementation copies from the two matrices that * store the local data, storing them in the hypre_ParCSRMatrix structure. * Only a single row can be accessed via this function at any one time; the * corresponding RestoreRow function must be called, to avoid bleeding memory, * and to be able to look at another row. * Either one of col_ind and values can be left null, and those values will * not be returned. * All indices are returned in 0-based indexing, no matter what is used under * the hood. EXCEPTION: currently this only works if the local CSR matrices * use 0-based indexing. * This code, semantics, implementation, etc., are all based on PETSc's hypre_MPI_AIJ * matrix code, adjusted for our data and software structures. * AJC 4/99. *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ParCSRMatrixGetRowHost( hypre_ParCSRMatrix *mat, HYPRE_BigInt row, HYPRE_Int *size, HYPRE_BigInt **col_ind, HYPRE_Complex **values ) { HYPRE_Int my_id; HYPRE_BigInt row_start, row_end; hypre_CSRMatrix *Aa; hypre_CSRMatrix *Ba; if (!mat) { hypre_error_in_arg(1); return hypre_error_flag; } Aa = (hypre_CSRMatrix *) hypre_ParCSRMatrixDiag(mat); Ba = (hypre_CSRMatrix *) hypre_ParCSRMatrixOffd(mat); if (hypre_ParCSRMatrixGetrowactive(mat)) { return (-1); } hypre_MPI_Comm_rank( hypre_ParCSRMatrixComm(mat), &my_id ); hypre_ParCSRMatrixGetrowactive(mat) = 1; row_start = hypre_ParCSRMatrixFirstRowIndex(mat); row_end = hypre_ParCSRMatrixLastRowIndex(mat) + 1; if (row < row_start || row >= row_end) { return (-1); } /* if buffer is not allocated and some information is requested, allocate buffer */ if (!hypre_ParCSRMatrixRowvalues(mat) && ( col_ind || values )) { /* allocate enough space to hold information from the longest row. */ HYPRE_Int max = 1, tmp; HYPRE_Int i; HYPRE_Int m = row_end - row_start; for ( i = 0; i < m; i++ ) { tmp = hypre_CSRMatrixI(Aa)[i + 1] - hypre_CSRMatrixI(Aa)[i] + hypre_CSRMatrixI(Ba)[i + 1] - hypre_CSRMatrixI(Ba)[i]; if (max < tmp) { max = tmp; } } hypre_ParCSRMatrixRowvalues(mat) = (HYPRE_Complex *) hypre_CTAlloc(HYPRE_Complex, max, hypre_ParCSRMatrixMemoryLocation(mat)); hypre_ParCSRMatrixRowindices(mat) = (HYPRE_BigInt *) hypre_CTAlloc(HYPRE_BigInt, max, hypre_ParCSRMatrixMemoryLocation(mat)); } /* Copy from dual sequential matrices into buffer */ { HYPRE_Complex *vworkA, *vworkB, *v_p; HYPRE_Int i, *cworkA, *cworkB; HYPRE_BigInt cstart = hypre_ParCSRMatrixFirstColDiag(mat); HYPRE_Int nztot, nzA, nzB, lrow = (HYPRE_Int)(row - row_start); HYPRE_BigInt *cmap, *idx_p; nzA = hypre_CSRMatrixI(Aa)[lrow + 1] - hypre_CSRMatrixI(Aa)[lrow]; cworkA = &( hypre_CSRMatrixJ(Aa)[ hypre_CSRMatrixI(Aa)[lrow] ] ); vworkA = &( hypre_CSRMatrixData(Aa)[ hypre_CSRMatrixI(Aa)[lrow] ] ); nzB = hypre_CSRMatrixI(Ba)[lrow + 1] - hypre_CSRMatrixI(Ba)[lrow]; cworkB = &( hypre_CSRMatrixJ(Ba)[ hypre_CSRMatrixI(Ba)[lrow] ] ); vworkB = &( hypre_CSRMatrixData(Ba)[ hypre_CSRMatrixI(Ba)[lrow] ] ); nztot = nzA + nzB; cmap = hypre_ParCSRMatrixColMapOffd(mat); if (values || col_ind) { if (nztot) { /* Sort by increasing column numbers, assuming A and B already sorted */ HYPRE_Int imark = -1; if (values) { *values = v_p = hypre_ParCSRMatrixRowvalues(mat); for ( i = 0; i < nzB; i++ ) { if (cmap[cworkB[i]] < cstart) { v_p[i] = vworkB[i]; } else { break; } } imark = i; for ( i = 0; i < nzA; i++ ) { v_p[imark + i] = vworkA[i]; } for ( i = imark; i < nzB; i++ ) { v_p[nzA + i] = vworkB[i]; } } if (col_ind) { *col_ind = idx_p = hypre_ParCSRMatrixRowindices(mat); if (imark > -1) { for ( i = 0; i < imark; i++ ) { idx_p[i] = cmap[cworkB[i]]; } } else { for ( i = 0; i < nzB; i++ ) { if (cmap[cworkB[i]] < cstart) { idx_p[i] = cmap[cworkB[i]]; } else { break; } } imark = i; } for ( i = 0; i < nzA; i++ ) { idx_p[imark + i] = cstart + cworkA[i]; } for ( i = imark; i < nzB; i++ ) { idx_p[nzA + i] = cmap[cworkB[i]]; } } } else { if (col_ind) { *col_ind = 0; } if (values) { *values = 0; } } } *size = nztot; } /* End of copy */ return hypre_error_flag; } HYPRE_Int hypre_ParCSRMatrixGetRow( hypre_ParCSRMatrix *mat, HYPRE_BigInt row, HYPRE_Int *size, HYPRE_BigInt **col_ind, HYPRE_Complex **values ) { #if defined(HYPRE_USING_GPU) HYPRE_ExecutionPolicy exec = hypre_GetExecPolicy1( hypre_ParCSRMatrixMemoryLocation(mat) ); if (exec == HYPRE_EXEC_DEVICE) { hypre_ParCSRMatrixGetRowDevice(mat, row, size, col_ind, values); } else #endif { hypre_ParCSRMatrixGetRowHost(mat, row, size, col_ind, values); } return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_ParCSRMatrixRestoreRow *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ParCSRMatrixRestoreRow( hypre_ParCSRMatrix *matrix, HYPRE_BigInt row, HYPRE_Int *size, HYPRE_BigInt **col_ind, HYPRE_Complex **values ) { HYPRE_UNUSED_VAR(row); HYPRE_UNUSED_VAR(size); HYPRE_UNUSED_VAR(col_ind); HYPRE_UNUSED_VAR(values); if (!hypre_ParCSRMatrixGetrowactive(matrix)) { hypre_error(HYPRE_ERROR_GENERIC); return hypre_error_flag; } hypre_ParCSRMatrixGetrowactive(matrix) = 0; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_CSRMatrixToParCSRMatrix: * * Generates a ParCSRMatrix distributed across the processors in comm * from a CSRMatrix on proc 0 . * *--------------------------------------------------------------------------*/ hypre_ParCSRMatrix * hypre_CSRMatrixToParCSRMatrix( MPI_Comm comm, hypre_CSRMatrix *A, HYPRE_BigInt *global_row_starts, HYPRE_BigInt *global_col_starts ) { hypre_ParCSRMatrix *parcsr_A; HYPRE_BigInt *global_data; HYPRE_BigInt global_size; HYPRE_BigInt global_num_rows; HYPRE_BigInt global_num_cols; HYPRE_Int num_procs, my_id; HYPRE_Int *num_rows_proc; HYPRE_Int *num_nonzeros_proc; HYPRE_BigInt row_starts[2]; HYPRE_BigInt col_starts[2]; hypre_CSRMatrix *local_A; HYPRE_Complex *A_data = NULL; HYPRE_Int *A_i = NULL; HYPRE_Int *A_j = NULL; hypre_MPI_Request *requests; hypre_MPI_Status *status, status0; hypre_MPI_Datatype *csr_matrix_datatypes; HYPRE_Int free_global_row_starts = 0; HYPRE_Int free_global_col_starts = 0; HYPRE_Int total_size; HYPRE_BigInt first_col_diag; HYPRE_BigInt last_col_diag; HYPRE_Int num_rows; HYPRE_Int num_nonzeros; HYPRE_Int i, ind; hypre_MPI_Comm_rank(comm, &my_id); hypre_MPI_Comm_size(comm, &num_procs); total_size = 4; if (my_id == 0) { total_size += 2 * (num_procs + 1); } global_data = hypre_CTAlloc(HYPRE_BigInt, total_size, HYPRE_MEMORY_HOST); if (my_id == 0) { global_size = 3; if (global_row_starts) { if (global_col_starts) { if (global_col_starts != global_row_starts) { /* contains code for what to expect, if 0: global_row_starts = global_col_starts, only global_row_starts given if 1: only global_row_starts given, global_col_starts = NULL if 2: both global_row_starts and global_col_starts given if 3: only global_col_starts given, global_row_starts = NULL */ global_data[3] = 2; global_size += (HYPRE_BigInt) (2 * (num_procs + 1) + 1); for (i = 0; i < (num_procs + 1); i++) { global_data[i + 4] = global_row_starts[i]; } for (i = 0; i < (num_procs + 1); i++) { global_data[i + num_procs + 5] = global_col_starts[i]; } } else { global_data[3] = 0; global_size += (HYPRE_BigInt) ((num_procs + 1) + 1); for (i = 0; i < (num_procs + 1); i++) { global_data[i + 4] = global_row_starts[i]; } } } else { global_data[3] = 1; global_size += (HYPRE_BigInt) ((num_procs + 1) + 1); for (i = 0; i < (num_procs + 1); i++) { global_data[i + 4] = global_row_starts[i]; } } } else { if (global_col_starts) { global_data[3] = 3; global_size += (HYPRE_BigInt) ((num_procs + 1) + 1); for (i = 0; i < (num_procs + 1); i++) { global_data[i + 4] = global_col_starts[i]; } } } global_data[0] = (HYPRE_BigInt) hypre_CSRMatrixNumRows(A); global_data[1] = (HYPRE_BigInt) hypre_CSRMatrixNumCols(A); global_data[2] = global_size; A_data = hypre_CSRMatrixData(A); A_i = hypre_CSRMatrixI(A); A_j = hypre_CSRMatrixJ(A); } hypre_MPI_Bcast(global_data, 3, HYPRE_MPI_BIG_INT, 0, comm); global_num_rows = global_data[0]; global_num_cols = global_data[1]; global_size = global_data[2]; if (global_size > 3) { HYPRE_Int send_start; if (global_data[3] == 2) { send_start = 4; hypre_MPI_Scatter(&global_data[send_start], 1, HYPRE_MPI_BIG_INT, &row_starts[0], 1, HYPRE_MPI_BIG_INT, 0, comm); send_start = 5; hypre_MPI_Scatter(&global_data[send_start], 1, HYPRE_MPI_BIG_INT, &row_starts[1], 1, HYPRE_MPI_BIG_INT, 0, comm); send_start = 4 + (num_procs + 1); hypre_MPI_Scatter(&global_data[send_start], 1, HYPRE_MPI_BIG_INT, &col_starts[0], 1, HYPRE_MPI_BIG_INT, 0, comm); send_start = 5 + (num_procs + 1); hypre_MPI_Scatter(&global_data[send_start], 1, HYPRE_MPI_BIG_INT, &col_starts[1], 1, HYPRE_MPI_BIG_INT, 0, comm); } else if ((global_data[3] == 0) || (global_data[3] == 1)) { send_start = 4; hypre_MPI_Scatter(&global_data[send_start], 1, HYPRE_MPI_BIG_INT, &row_starts[0], 1, HYPRE_MPI_BIG_INT, 0, comm); send_start = 5; hypre_MPI_Scatter(&global_data[send_start], 1, HYPRE_MPI_BIG_INT, &row_starts[1], 1, HYPRE_MPI_BIG_INT, 0, comm); if (global_data[3] == 0) { col_starts[0] = row_starts[0]; col_starts[1] = row_starts[1]; } } else { send_start = 4; hypre_MPI_Scatter(&global_data[send_start], 1, HYPRE_MPI_BIG_INT, &col_starts[0], 1, HYPRE_MPI_BIG_INT, 0, comm); send_start = 5; hypre_MPI_Scatter(&global_data[send_start], 1, HYPRE_MPI_BIG_INT, &col_starts[1], 1, HYPRE_MPI_BIG_INT, 0, comm); } } hypre_TFree(global_data, HYPRE_MEMORY_HOST); // Create ParCSR matrix parcsr_A = hypre_ParCSRMatrixCreate(comm, global_num_rows, global_num_cols, row_starts, col_starts, 0, 0, 0); // Allocate memory for building ParCSR matrix num_rows_proc = hypre_CTAlloc(HYPRE_Int, num_procs, HYPRE_MEMORY_HOST); num_nonzeros_proc = hypre_CTAlloc(HYPRE_Int, num_procs, HYPRE_MEMORY_HOST); if (my_id == 0) { if (!global_row_starts) { hypre_GeneratePartitioning(global_num_rows, num_procs, &global_row_starts); free_global_row_starts = 1; } if (!global_col_starts) { hypre_GeneratePartitioning(global_num_rows, num_procs, &global_col_starts); free_global_col_starts = 1; } for (i = 0; i < num_procs; i++) { num_rows_proc[i] = (HYPRE_Int) (global_row_starts[i + 1] - global_row_starts[i]); num_nonzeros_proc[i] = A_i[(HYPRE_Int)global_row_starts[i + 1]] - A_i[(HYPRE_Int)global_row_starts[i]]; } //num_nonzeros_proc[num_procs-1] = A_i[(HYPRE_Int)global_num_rows] - A_i[(HYPRE_Int)row_starts[num_procs-1]]; } hypre_MPI_Scatter(num_rows_proc, 1, HYPRE_MPI_INT, &num_rows, 1, HYPRE_MPI_INT, 0, comm); hypre_MPI_Scatter(num_nonzeros_proc, 1, HYPRE_MPI_INT, &num_nonzeros, 1, HYPRE_MPI_INT, 0, comm); /* RL: this is not correct: (HYPRE_Int) global_num_cols */ local_A = hypre_CSRMatrixCreate(num_rows, (HYPRE_Int) global_num_cols, num_nonzeros); csr_matrix_datatypes = hypre_CTAlloc(hypre_MPI_Datatype, num_procs, HYPRE_MEMORY_HOST); if (my_id == 0) { requests = hypre_CTAlloc(hypre_MPI_Request, num_procs - 1, HYPRE_MEMORY_HOST); status = hypre_CTAlloc(hypre_MPI_Status, num_procs - 1, HYPRE_MEMORY_HOST); for (i = 1; i < num_procs; i++) { ind = A_i[(HYPRE_Int) global_row_starts[i]]; hypre_BuildCSRMatrixMPIDataType(num_nonzeros_proc[i], num_rows_proc[i], &A_data[ind], &A_i[(HYPRE_Int) global_row_starts[i]], &A_j[ind], &csr_matrix_datatypes[i]); hypre_MPI_Isend(hypre_MPI_BOTTOM, 1, csr_matrix_datatypes[i], i, 0, comm, &requests[i - 1]); hypre_MPI_Type_free(&csr_matrix_datatypes[i]); } hypre_CSRMatrixData(local_A) = A_data; hypre_CSRMatrixI(local_A) = A_i; hypre_CSRMatrixJ(local_A) = A_j; hypre_CSRMatrixOwnsData(local_A) = 0; hypre_MPI_Waitall(num_procs - 1, requests, status); hypre_TFree(requests, HYPRE_MEMORY_HOST); hypre_TFree(status, HYPRE_MEMORY_HOST); hypre_TFree(num_rows_proc, HYPRE_MEMORY_HOST); hypre_TFree(num_nonzeros_proc, HYPRE_MEMORY_HOST); if (free_global_row_starts) { hypre_TFree(global_row_starts, HYPRE_MEMORY_HOST); } if (free_global_col_starts) { hypre_TFree(global_col_starts, HYPRE_MEMORY_HOST); } } else { hypre_CSRMatrixInitialize(local_A); hypre_BuildCSRMatrixMPIDataType(num_nonzeros, num_rows, hypre_CSRMatrixData(local_A), hypre_CSRMatrixI(local_A), hypre_CSRMatrixJ(local_A), &csr_matrix_datatypes[0]); hypre_MPI_Recv(hypre_MPI_BOTTOM, 1, csr_matrix_datatypes[0], 0, 0, comm, &status0); hypre_MPI_Type_free(csr_matrix_datatypes); } first_col_diag = hypre_ParCSRMatrixFirstColDiag(parcsr_A); last_col_diag = hypre_ParCSRMatrixLastColDiag(parcsr_A); GenerateDiagAndOffd(local_A, parcsr_A, first_col_diag, last_col_diag); /* set pointers back to NULL before destroying */ if (my_id == 0) { hypre_CSRMatrixData(local_A) = NULL; hypre_CSRMatrixI(local_A) = NULL; hypre_CSRMatrixJ(local_A) = NULL; } hypre_CSRMatrixDestroy(local_A); hypre_TFree(csr_matrix_datatypes, HYPRE_MEMORY_HOST); return parcsr_A; } /* RL: XXX this is not a scalable routine, see `marker' therein */ HYPRE_Int GenerateDiagAndOffd(hypre_CSRMatrix *A, hypre_ParCSRMatrix *matrix, HYPRE_BigInt first_col_diag, HYPRE_BigInt last_col_diag) { HYPRE_Int i, j; HYPRE_Int jo, jd; HYPRE_Int num_rows = hypre_CSRMatrixNumRows(A); HYPRE_Int num_cols = hypre_CSRMatrixNumCols(A); HYPRE_Complex *a_data = hypre_CSRMatrixData(A); HYPRE_Int *a_i = hypre_CSRMatrixI(A); /*RL: XXX FIXME if A spans global column space, the following a_j should be bigJ */ HYPRE_Int *a_j = hypre_CSRMatrixJ(A); hypre_CSRMatrix *diag = hypre_ParCSRMatrixDiag(matrix); hypre_CSRMatrix *offd = hypre_ParCSRMatrixOffd(matrix); HYPRE_BigInt *col_map_offd; HYPRE_Complex *diag_data, *offd_data; HYPRE_Int *diag_i, *offd_i; HYPRE_Int *diag_j, *offd_j; HYPRE_Int *marker; HYPRE_Int num_cols_diag, num_cols_offd; HYPRE_Int first_elmt = a_i[0]; HYPRE_Int num_nonzeros = a_i[num_rows] - first_elmt; HYPRE_Int counter; num_cols_diag = (HYPRE_Int)(last_col_diag - first_col_diag + 1); num_cols_offd = 0; HYPRE_MemoryLocation memory_location = hypre_CSRMatrixMemoryLocation(A); if (num_cols - num_cols_diag) { hypre_CSRMatrixInitialize_v2(diag, 0, memory_location); diag_i = hypre_CSRMatrixI(diag); hypre_CSRMatrixInitialize_v2(offd, 0, memory_location); offd_i = hypre_CSRMatrixI(offd); marker = hypre_CTAlloc(HYPRE_Int, num_cols, HYPRE_MEMORY_HOST); for (i = 0; i < num_cols; i++) { marker[i] = 0; } jo = 0; jd = 0; for (i = 0; i < num_rows; i++) { offd_i[i] = jo; diag_i[i] = jd; for (j = a_i[i] - first_elmt; j < a_i[i + 1] - first_elmt; j++) { if (a_j[j] < first_col_diag || a_j[j] > last_col_diag) { if (!marker[a_j[j]]) { marker[a_j[j]] = 1; num_cols_offd++; } jo++; } else { jd++; } } } offd_i[num_rows] = jo; diag_i[num_rows] = jd; hypre_ParCSRMatrixColMapOffd(matrix) = hypre_CTAlloc(HYPRE_BigInt, num_cols_offd, HYPRE_MEMORY_HOST); col_map_offd = hypre_ParCSRMatrixColMapOffd(matrix); counter = 0; for (i = 0; i < num_cols; i++) { if (marker[i]) { col_map_offd[counter] = (HYPRE_BigInt) i; marker[i] = counter; counter++; } } hypre_CSRMatrixNumNonzeros(diag) = jd; hypre_CSRMatrixInitialize(diag); diag_data = hypre_CSRMatrixData(diag); diag_j = hypre_CSRMatrixJ(diag); hypre_CSRMatrixNumNonzeros(offd) = jo; hypre_CSRMatrixNumCols(offd) = num_cols_offd; hypre_CSRMatrixInitialize(offd); offd_data = hypre_CSRMatrixData(offd); offd_j = hypre_CSRMatrixJ(offd); jo = 0; jd = 0; for (i = 0; i < num_rows; i++) { for (j = a_i[i] - first_elmt; j < a_i[i + 1] - first_elmt; j++) { if (a_j[j] < (HYPRE_Int)first_col_diag || a_j[j] > (HYPRE_Int)last_col_diag) { offd_data[jo] = a_data[j]; offd_j[jo++] = marker[a_j[j]]; } else { diag_data[jd] = a_data[j]; diag_j[jd++] = (HYPRE_Int)(a_j[j] - first_col_diag); } } } hypre_TFree(marker, HYPRE_MEMORY_HOST); } else { hypre_CSRMatrixNumNonzeros(diag) = num_nonzeros; hypre_CSRMatrixInitialize(diag); diag_data = hypre_CSRMatrixData(diag); diag_i = hypre_CSRMatrixI(diag); diag_j = hypre_CSRMatrixJ(diag); for (i = 0; i < num_nonzeros; i++) { diag_data[i] = a_data[i]; diag_j[i] = a_j[i]; } offd_i = hypre_CTAlloc(HYPRE_Int, num_rows + 1, HYPRE_MEMORY_HOST); for (i = 0; i < num_rows + 1; i++) { diag_i[i] = a_i[i]; offd_i[i] = 0; } hypre_CSRMatrixNumCols(offd) = 0; hypre_CSRMatrixI(offd) = offd_i; } return hypre_error_flag; } hypre_CSRMatrix * hypre_MergeDiagAndOffdHost(hypre_ParCSRMatrix *par_matrix) { hypre_CSRMatrix *diag = hypre_ParCSRMatrixDiag(par_matrix); hypre_CSRMatrix *offd = hypre_ParCSRMatrixOffd(par_matrix); hypre_CSRMatrix *matrix; HYPRE_BigInt num_cols = hypre_ParCSRMatrixGlobalNumCols(par_matrix); HYPRE_BigInt first_col_diag = hypre_ParCSRMatrixFirstColDiag(par_matrix); HYPRE_BigInt *col_map_offd = hypre_ParCSRMatrixColMapOffd(par_matrix); HYPRE_Int num_rows = hypre_CSRMatrixNumRows(diag); HYPRE_Int *diag_i = hypre_CSRMatrixI(diag); HYPRE_Int *diag_j = hypre_CSRMatrixJ(diag); HYPRE_Complex *diag_data = hypre_CSRMatrixData(diag); HYPRE_Int *offd_i = hypre_CSRMatrixI(offd); HYPRE_Int *offd_j = hypre_CSRMatrixJ(offd); HYPRE_Complex *offd_data = hypre_CSRMatrixData(offd); HYPRE_Int *matrix_i; HYPRE_BigInt *matrix_j; HYPRE_Complex *matrix_data; HYPRE_Int num_nonzeros, i, j; HYPRE_Int count; HYPRE_Int size, rest, num_threads, ii; HYPRE_MemoryLocation memory_location = hypre_ParCSRMatrixMemoryLocation(par_matrix); num_nonzeros = diag_i[num_rows] + offd_i[num_rows]; matrix = hypre_CSRMatrixCreate(num_rows, num_cols, num_nonzeros); hypre_CSRMatrixMemoryLocation(matrix) = memory_location; hypre_CSRMatrixBigInitialize(matrix); matrix_i = hypre_CSRMatrixI(matrix); matrix_j = hypre_CSRMatrixBigJ(matrix); matrix_data = hypre_CSRMatrixData(matrix); num_threads = hypre_NumThreads(); size = num_rows / num_threads; rest = num_rows - size * num_threads; #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(ii, i, j, count) HYPRE_SMP_SCHEDULE #endif for (ii = 0; ii < num_threads; ii++) { HYPRE_Int ns, ne; if (ii < rest) { ns = ii * size + ii; ne = (ii + 1) * size + ii + 1; } else { ns = ii * size + rest; ne = (ii + 1) * size + rest; } count = diag_i[ns] + offd_i[ns];; for (i = ns; i < ne; i++) { matrix_i[i] = count; for (j = diag_i[i]; j < diag_i[i + 1]; j++) { matrix_data[count] = diag_data[j]; matrix_j[count++] = (HYPRE_BigInt)diag_j[j] + first_col_diag; } for (j = offd_i[i]; j < offd_i[i + 1]; j++) { matrix_data[count] = offd_data[j]; matrix_j[count++] = col_map_offd[offd_j[j]]; } } } /* end parallel region */ matrix_i[num_rows] = num_nonzeros; return matrix; } hypre_CSRMatrix * hypre_MergeDiagAndOffd(hypre_ParCSRMatrix *par_matrix) { #if defined(HYPRE_USING_CUDA) || defined(HYPRE_USING_HIP) HYPRE_ExecutionPolicy exec = hypre_GetExecPolicy1( hypre_ParCSRMatrixMemoryLocation(par_matrix) ); if (exec == HYPRE_EXEC_DEVICE) { return hypre_MergeDiagAndOffdDevice(par_matrix); } else #endif { return hypre_MergeDiagAndOffdHost(par_matrix); } } /*-------------------------------------------------------------------------- * hypre_ParCSRMatrixToCSRMatrixAll * * The resulting matrix is stored in the space given by memory_location *--------------------------------------------------------------------------*/ hypre_CSRMatrix* hypre_ParCSRMatrixToCSRMatrixAll(hypre_ParCSRMatrix *par_A) { return hypre_ParCSRMatrixToCSRMatrixAll_v2(par_A, hypre_ParCSRMatrixMemoryLocation(par_A)); } /*-------------------------------------------------------------------------- * hypre_ParCSRMatrixToCSRMatrixAll_v2 * * Generates a CSRMatrix from a ParCSRMatrix on all processors that have * parts of the ParCSRMatrix * * Warning: This only works for a ParCSRMatrix with num_rows < 2,147,483,647 *--------------------------------------------------------------------------*/ hypre_CSRMatrix* hypre_ParCSRMatrixToCSRMatrixAll_v2( hypre_ParCSRMatrix *par_matrix, HYPRE_MemoryLocation memory_location ) { MPI_Comm comm = hypre_ParCSRMatrixComm(par_matrix); HYPRE_Int num_rows = (HYPRE_Int) hypre_ParCSRMatrixGlobalNumRows(par_matrix); HYPRE_Int num_cols = (HYPRE_Int) hypre_ParCSRMatrixGlobalNumCols(par_matrix); HYPRE_BigInt first_row_index = hypre_ParCSRMatrixFirstRowIndex(par_matrix); HYPRE_BigInt last_row_index = hypre_ParCSRMatrixLastRowIndex(par_matrix); hypre_ParCSRMatrix *par_temp; hypre_CSRMatrix *matrix; HYPRE_Int *matrix_i; HYPRE_Int *matrix_j; HYPRE_Complex *matrix_data; hypre_CSRMatrix *local_matrix; HYPRE_Int local_num_rows; HYPRE_Int local_num_nonzeros; HYPRE_Int *local_matrix_i; HYPRE_Int *local_matrix_j; HYPRE_Complex *local_matrix_data; HYPRE_Int i, j; HYPRE_Int num_nonzeros; HYPRE_Int num_data; HYPRE_Int num_requests; HYPRE_Int vec_len, offset; HYPRE_Int start_index; HYPRE_Int proc_id; HYPRE_Int num_procs, my_id; HYPRE_Int num_types; HYPRE_Int *used_procs; HYPRE_Int *new_vec_starts; hypre_MPI_Request *requests; hypre_MPI_Status *status; HYPRE_Int num_contacts; HYPRE_Int contact_proc_list[1]; HYPRE_Int contact_send_buf[1]; HYPRE_Int contact_send_buf_starts[2]; HYPRE_Int max_response_size; HYPRE_Int *response_recv_buf = NULL; HYPRE_Int *response_recv_buf_starts = NULL; hypre_DataExchangeResponse response_obj; hypre_ProcListElements send_proc_obj; HYPRE_Int *send_info = NULL; hypre_MPI_Status status1; HYPRE_Int count, start; HYPRE_Int tag1 = 11112, tag2 = 22223, tag3 = 33334; hypre_MPI_Comm_size(comm, &num_procs); hypre_MPI_Comm_rank(comm, &my_id); /* Clone input matrix to host memory */ par_temp = hypre_ParCSRMatrixClone_v2(par_matrix, 1, HYPRE_MEMORY_HOST); /* Creates local matrix on host memory */ local_matrix = hypre_MergeDiagAndOffd(par_temp); hypre_ParCSRMatrixDestroy(par_temp); /* copies big_j to j */ hypre_CSRMatrixBigJtoJ(local_matrix); local_matrix_i = hypre_CSRMatrixI(local_matrix); local_matrix_j = hypre_CSRMatrixJ(local_matrix); local_matrix_data = hypre_CSRMatrixData(local_matrix); local_num_rows = (HYPRE_Int) (last_row_index - first_row_index + 1); /* determine procs that have vector data and store their ids in used_procs */ /* we need to do an exchange data for this. If I own row then I will contact processor 0 with the endpoint of my local range */ if (local_num_rows > 0) { num_contacts = 1; contact_proc_list[0] = 0; contact_send_buf[0] = (HYPRE_Int) hypre_ParCSRMatrixLastRowIndex(par_matrix); contact_send_buf_starts[0] = 0; contact_send_buf_starts[1] = 1; } else { num_contacts = 0; contact_send_buf_starts[0] = 0; contact_send_buf_starts[1] = 0; } /*build the response object*/ /*send_proc_obj will be for saving info from contacts */ send_proc_obj.length = 0; send_proc_obj.storage_length = 10; send_proc_obj.id = hypre_CTAlloc(HYPRE_Int, send_proc_obj.storage_length, HYPRE_MEMORY_HOST); send_proc_obj.vec_starts = hypre_CTAlloc(HYPRE_Int, send_proc_obj.storage_length + 1, HYPRE_MEMORY_HOST); send_proc_obj.vec_starts[0] = 0; send_proc_obj.element_storage_length = 10; send_proc_obj.elements = hypre_CTAlloc(HYPRE_BigInt, send_proc_obj.element_storage_length, HYPRE_MEMORY_HOST); max_response_size = 0; /* each response is null */ response_obj.fill_response = hypre_FillResponseParToCSRMatrix; response_obj.data1 = NULL; response_obj.data2 = &send_proc_obj; /*this is where we keep info from contacts*/ hypre_DataExchangeList(num_contacts, contact_proc_list, contact_send_buf, contact_send_buf_starts, sizeof(HYPRE_Int), sizeof(HYPRE_Int), &response_obj, max_response_size, 1, comm, (void**) &response_recv_buf, &response_recv_buf_starts); /* now processor 0 should have a list of ranges for processors that have rows - these are in send_proc_obj - it needs to create the new list of processors and also an array of vec starts - and send to those who own row*/ if (my_id) { if (local_num_rows) { /* look for a message from processor 0 */ hypre_MPI_Probe(0, tag1, comm, &status1); hypre_MPI_Get_count(&status1, HYPRE_MPI_INT, &count); send_info = hypre_CTAlloc(HYPRE_Int, count, HYPRE_MEMORY_HOST); hypre_MPI_Recv(send_info, count, HYPRE_MPI_INT, 0, tag1, comm, &status1); /* now unpack */ num_types = send_info[0]; used_procs = hypre_CTAlloc(HYPRE_Int, num_types, HYPRE_MEMORY_HOST); new_vec_starts = hypre_CTAlloc(HYPRE_Int, num_types + 1, HYPRE_MEMORY_HOST); for (i = 1; i <= num_types; i++) { used_procs[i - 1] = send_info[i]; } for (i = num_types + 1; i < count; i++) { new_vec_starts[i - num_types - 1] = send_info[i] ; } } else /* clean up and exit */ { hypre_TFree(send_proc_obj.vec_starts, HYPRE_MEMORY_HOST); hypre_TFree(send_proc_obj.id, HYPRE_MEMORY_HOST); hypre_TFree(send_proc_obj.elements, HYPRE_MEMORY_HOST); hypre_TFree(response_recv_buf, HYPRE_MEMORY_HOST); hypre_TFree(response_recv_buf_starts, HYPRE_MEMORY_HOST); hypre_CSRMatrixDestroy(local_matrix); return NULL; } } else /* my_id ==0 */ { num_types = send_proc_obj.length; used_procs = hypre_CTAlloc(HYPRE_Int, num_types, HYPRE_MEMORY_HOST); new_vec_starts = hypre_CTAlloc(HYPRE_Int, num_types + 1, HYPRE_MEMORY_HOST); new_vec_starts[0] = 0; for (i = 0; i < num_types; i++) { used_procs[i] = send_proc_obj.id[i]; new_vec_starts[i + 1] = send_proc_obj.elements[i] + 1; } hypre_qsort0(used_procs, 0, num_types - 1); hypre_qsort0(new_vec_starts, 0, num_types); /* Now we need to put into an array to send */ count = 2 * num_types + 2; send_info = hypre_CTAlloc(HYPRE_Int, count, HYPRE_MEMORY_HOST); send_info[0] = num_types; for (i = 1; i <= num_types; i++) { send_info[i] = (HYPRE_BigInt) used_procs[i - 1]; } for (i = num_types + 1; i < count; i++) { send_info[i] = new_vec_starts[i - num_types - 1]; } requests = hypre_CTAlloc(hypre_MPI_Request, num_types, HYPRE_MEMORY_HOST); status = hypre_CTAlloc(hypre_MPI_Status, num_types, HYPRE_MEMORY_HOST); /* don't send to myself - these are sorted so my id would be first*/ start = 0; if (num_types && used_procs[0] == 0) { start = 1; } for (i = start; i < num_types; i++) { hypre_MPI_Isend(send_info, count, HYPRE_MPI_INT, used_procs[i], tag1, comm, &requests[i - start]); } hypre_MPI_Waitall(num_types - start, requests, status); hypre_TFree(status, HYPRE_MEMORY_HOST); hypre_TFree(requests, HYPRE_MEMORY_HOST); } /* Clean up */ hypre_TFree(send_proc_obj.vec_starts, HYPRE_MEMORY_HOST); hypre_TFree(send_proc_obj.id, HYPRE_MEMORY_HOST); hypre_TFree(send_proc_obj.elements, HYPRE_MEMORY_HOST); hypre_TFree(send_info, HYPRE_MEMORY_HOST); hypre_TFree(response_recv_buf, HYPRE_MEMORY_HOST); hypre_TFree(response_recv_buf_starts, HYPRE_MEMORY_HOST); /* now proc 0 can exit if it has no rows */ if (!local_num_rows) { hypre_CSRMatrixDestroy(local_matrix); hypre_TFree(new_vec_starts, HYPRE_MEMORY_HOST); hypre_TFree(used_procs, HYPRE_MEMORY_HOST); return NULL; } /* everyone left has rows and knows: new_vec_starts, num_types, and used_procs */ /* this matrix should be rather small */ matrix_i = hypre_CTAlloc(HYPRE_Int, num_rows + 1, HYPRE_MEMORY_HOST); num_requests = 4 * num_types; requests = hypre_CTAlloc(hypre_MPI_Request, num_requests, HYPRE_MEMORY_HOST); status = hypre_CTAlloc(hypre_MPI_Status, num_requests, HYPRE_MEMORY_HOST); /* exchange contents of local_matrix_i - here we are sending to ourself also*/ j = 0; for (i = 0; i < num_types; i++) { proc_id = used_procs[i]; vec_len = (HYPRE_Int)(new_vec_starts[i + 1] - new_vec_starts[i]); hypre_MPI_Irecv(&matrix_i[new_vec_starts[i] + 1], vec_len, HYPRE_MPI_INT, proc_id, tag2, comm, &requests[j++]); } for (i = 0; i < num_types; i++) { proc_id = used_procs[i]; hypre_MPI_Isend(&local_matrix_i[1], local_num_rows, HYPRE_MPI_INT, proc_id, tag2, comm, &requests[j++]); } hypre_MPI_Waitall(j, requests, status); /* generate matrix_i from received data */ /* global numbering?*/ offset = matrix_i[new_vec_starts[1]]; for (i = 1; i < num_types; i++) { for (j = new_vec_starts[i]; j < new_vec_starts[i + 1]; j++) { matrix_i[j + 1] += offset; } offset = matrix_i[new_vec_starts[i + 1]]; } num_nonzeros = matrix_i[num_rows]; matrix = hypre_CSRMatrixCreate(num_rows, num_cols, num_nonzeros); hypre_CSRMatrixI(matrix) = matrix_i; hypre_CSRMatrixInitialize_v2(matrix, 0, HYPRE_MEMORY_HOST); matrix_j = hypre_CSRMatrixJ(matrix); matrix_data = hypre_CSRMatrixData(matrix); /* generate datatypes for further data exchange and exchange remaining data, i.e. column info and actual data */ j = 0; for (i = 0; i < num_types; i++) { proc_id = used_procs[i]; start_index = matrix_i[(HYPRE_Int)new_vec_starts[i]]; num_data = matrix_i[(HYPRE_Int)new_vec_starts[i + 1]] - start_index; hypre_MPI_Irecv(&matrix_data[start_index], num_data, HYPRE_MPI_COMPLEX, used_procs[i], tag1, comm, &requests[j++]); hypre_MPI_Irecv(&matrix_j[start_index], num_data, HYPRE_MPI_INT, used_procs[i], tag3, comm, &requests[j++]); } local_num_nonzeros = local_matrix_i[local_num_rows]; for (i = 0; i < num_types; i++) { hypre_MPI_Isend(local_matrix_data, local_num_nonzeros, HYPRE_MPI_COMPLEX, used_procs[i], tag1, comm, &requests[j++]); hypre_MPI_Isend(local_matrix_j, local_num_nonzeros, HYPRE_MPI_INT, used_procs[i], tag3, comm, &requests[j++]); } hypre_MPI_Waitall(num_requests, requests, status); hypre_TFree(new_vec_starts, HYPRE_MEMORY_HOST); if (num_requests) { hypre_TFree(requests, HYPRE_MEMORY_HOST); hypre_TFree(status, HYPRE_MEMORY_HOST); hypre_TFree(used_procs, HYPRE_MEMORY_HOST); } hypre_CSRMatrixDestroy(local_matrix); /* Move resulting matrix to the memory location passed as input */ hypre_CSRMatrixMigrate(matrix, memory_location); return matrix; } /*-------------------------------------------------------------------------- * hypre_ParCSRMatrixCopy, * copies B to A, * if copy_data = 0, only the structure of A is copied to B * the routine does not check whether the dimensions of A and B are compatible *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ParCSRMatrixCopy( hypre_ParCSRMatrix *A, hypre_ParCSRMatrix *B, HYPRE_Int copy_data ) { hypre_CSRMatrix *A_diag; hypre_CSRMatrix *A_offd; HYPRE_BigInt *col_map_offd_A; hypre_CSRMatrix *B_diag; hypre_CSRMatrix *B_offd; HYPRE_BigInt *col_map_offd_B; HYPRE_Int num_cols_offd_A; HYPRE_Int num_cols_offd_B; if (!A) { hypre_error_in_arg(1); return hypre_error_flag; } if (!B) { hypre_error_in_arg(1); return hypre_error_flag; } A_diag = hypre_ParCSRMatrixDiag(A); A_offd = hypre_ParCSRMatrixOffd(A); B_diag = hypre_ParCSRMatrixDiag(B); B_offd = hypre_ParCSRMatrixOffd(B); num_cols_offd_A = hypre_CSRMatrixNumCols(A_offd); num_cols_offd_B = hypre_CSRMatrixNumCols(B_offd); hypre_assert(num_cols_offd_A == num_cols_offd_B); col_map_offd_A = hypre_ParCSRMatrixColMapOffd(A); col_map_offd_B = hypre_ParCSRMatrixColMapOffd(B); hypre_CSRMatrixCopy(A_diag, B_diag, copy_data); hypre_CSRMatrixCopy(A_offd, B_offd, copy_data); /* should not happen if B has been initialized */ if (num_cols_offd_B && col_map_offd_B == NULL) { col_map_offd_B = hypre_TAlloc(HYPRE_BigInt, num_cols_offd_B, HYPRE_MEMORY_HOST); hypre_ParCSRMatrixColMapOffd(B) = col_map_offd_B; } hypre_TMemcpy(col_map_offd_B, col_map_offd_A, HYPRE_BigInt, num_cols_offd_B, HYPRE_MEMORY_HOST, HYPRE_MEMORY_HOST); return hypre_error_flag; } /*-------------------------------------------------------------------- * hypre_FillResponseParToCSRMatrix * Fill response function for determining the send processors * data exchange *--------------------------------------------------------------------*/ HYPRE_Int hypre_FillResponseParToCSRMatrix( void *p_recv_contact_buf, HYPRE_Int contact_size, HYPRE_Int contact_proc, void *ro, MPI_Comm comm, void **p_send_response_buf, HYPRE_Int *response_message_size ) { HYPRE_UNUSED_VAR(p_send_response_buf); HYPRE_Int myid; HYPRE_Int i, index, count, elength; HYPRE_BigInt *recv_contact_buf = (HYPRE_BigInt * ) p_recv_contact_buf; hypre_DataExchangeResponse *response_obj = (hypre_DataExchangeResponse*)ro; hypre_ProcListElements *send_proc_obj = (hypre_ProcListElements*)response_obj->data2; hypre_MPI_Comm_rank(comm, &myid ); /*check to see if we need to allocate more space in send_proc_obj for ids*/ if (send_proc_obj->length == send_proc_obj->storage_length) { send_proc_obj->storage_length += 10; /*add space for 10 more processors*/ send_proc_obj->id = hypre_TReAlloc(send_proc_obj->id, HYPRE_Int, send_proc_obj->storage_length, HYPRE_MEMORY_HOST); send_proc_obj->vec_starts = hypre_TReAlloc(send_proc_obj->vec_starts, HYPRE_Int, send_proc_obj->storage_length + 1, HYPRE_MEMORY_HOST); } /*initialize*/ count = send_proc_obj->length; index = send_proc_obj->vec_starts[count]; /*this is the number of elements*/ /*send proc*/ send_proc_obj->id[count] = contact_proc; /*do we need more storage for the elements?*/ if (send_proc_obj->element_storage_length < index + contact_size) { elength = hypre_max(contact_size, 10); elength += index; send_proc_obj->elements = hypre_TReAlloc(send_proc_obj->elements, HYPRE_BigInt, elength, HYPRE_MEMORY_HOST); send_proc_obj->element_storage_length = elength; } /*populate send_proc_obj*/ for (i = 0; i < contact_size; i++) { send_proc_obj->elements[index++] = recv_contact_buf[i]; } send_proc_obj->vec_starts[count + 1] = index; send_proc_obj->length++; /*output - no message to return (confirmation) */ *response_message_size = 0; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_ParCSRMatrixUnion * * Creates and returns a new matrix whose elements are the union of A and B. * Data is not copied, only structural information is created. * A and B must have the same communicator, numbers and distributions of rows * and columns (they can differ in which row-column pairs are nonzero, thus * in which columns are in a offd block) * * TODO (VPM): This function should use hypre_ParCSRMatrixCreate to create * the matrix. *--------------------------------------------------------------------------*/ hypre_ParCSRMatrix* hypre_ParCSRMatrixUnion( hypre_ParCSRMatrix *A, hypre_ParCSRMatrix *B ) { hypre_ParCSRMatrix *C; HYPRE_BigInt *col_map_offd_C = NULL; HYPRE_Int my_id, p; MPI_Comm comm = hypre_ParCSRMatrixComm( A ); hypre_MPI_Comm_rank(comm, &my_id); C = hypre_CTAlloc( hypre_ParCSRMatrix, 1, HYPRE_MEMORY_HOST); hypre_ParCSRMatrixComm( C ) = hypre_ParCSRMatrixComm( A ); hypre_ParCSRMatrixGlobalNumRows( C ) = hypre_ParCSRMatrixGlobalNumRows( A ); hypre_ParCSRMatrixGlobalNumCols( C ) = hypre_ParCSRMatrixGlobalNumCols( A ); hypre_ParCSRMatrixFirstRowIndex( C ) = hypre_ParCSRMatrixFirstRowIndex( A ); hypre_assert( hypre_ParCSRMatrixFirstRowIndex( B ) == hypre_ParCSRMatrixFirstRowIndex( A ) ); hypre_TMemcpy(hypre_ParCSRMatrixRowStarts(C), hypre_ParCSRMatrixRowStarts(A), HYPRE_BigInt, 2, HYPRE_MEMORY_HOST, HYPRE_MEMORY_HOST); hypre_TMemcpy(hypre_ParCSRMatrixColStarts(C), hypre_ParCSRMatrixColStarts(A), HYPRE_BigInt, 2, HYPRE_MEMORY_HOST, HYPRE_MEMORY_HOST); for (p = 0; p < 2; ++p) hypre_assert( hypre_ParCSRMatrixColStarts(A)[p] == hypre_ParCSRMatrixColStarts(B)[p] ); hypre_ParCSRMatrixFirstColDiag( C ) = hypre_ParCSRMatrixFirstColDiag( A ); hypre_ParCSRMatrixLastRowIndex( C ) = hypre_ParCSRMatrixLastRowIndex( A ); hypre_ParCSRMatrixLastColDiag( C ) = hypre_ParCSRMatrixLastColDiag( A ); hypre_ParCSRMatrixDiag( C ) = hypre_CSRMatrixUnion( hypre_ParCSRMatrixDiag(A), hypre_ParCSRMatrixDiag(B), 0, 0, 0 ); hypre_ParCSRMatrixOffd( C ) = hypre_CSRMatrixUnion( hypre_ParCSRMatrixOffd(A), hypre_ParCSRMatrixOffd(B), hypre_ParCSRMatrixColMapOffd(A), hypre_ParCSRMatrixColMapOffd(B), &col_map_offd_C ); hypre_ParCSRMatrixColMapOffd( C ) = col_map_offd_C; hypre_ParCSRMatrixCommPkg( C ) = NULL; hypre_ParCSRMatrixCommPkgT( C ) = NULL; hypre_ParCSRMatrixOwnsData( C ) = 1; /* SetNumNonzeros, SetDNumNonzeros are global, need hypre_MPI_Allreduce. I suspect, but don't know, that other parts of hypre do not assume that the correct values have been set. hypre_ParCSRMatrixSetNumNonzeros( C ); hypre_ParCSRMatrixSetDNumNonzeros( C );*/ hypre_ParCSRMatrixNumNonzeros( C ) = 0; hypre_ParCSRMatrixDNumNonzeros( C ) = 0.0; hypre_ParCSRMatrixRowindices( C ) = NULL; hypre_ParCSRMatrixRowvalues( C ) = NULL; hypre_ParCSRMatrixGetrowactive( C ) = 0; return C; } /*-------------------------------------------------------------------------- * hypre_ParCSRMatrixTruncate * * Perform dual truncation of ParCSR matrix. * * This code is adapted from original BoomerAMGInterpTruncate() * * A: parCSR matrix to be modified * tol: relative tolerance or truncation factor for dropping small terms * max_row_elmts: maximum number of (largest) nonzero elements to keep. * rescale: Boolean on whether or not to scale resulting matrix. Scaling for * each row satisfies: sum(nonzero values before dropping) / * sum(nonzero values after dropping), * this way, the application of the truncated matrix on a constant vector * is the same as that of the original matrix. * nrm_type: type of norm used for dropping with tol. * -- 0 = infinity-norm * -- 1 = 1-norm * -- 2 = 2-norm *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ParCSRMatrixTruncate(hypre_ParCSRMatrix *A, HYPRE_Real tol, HYPRE_Int max_row_elmts, HYPRE_Int rescale, HYPRE_Int nrm_type) { #ifdef HYPRE_PROFILE hypre_profile_times[HYPRE_TIMER_ID_INTERP_TRUNC] -= hypre_MPI_Wtime(); #endif hypre_CSRMatrix *A_diag = hypre_ParCSRMatrixDiag(A); HYPRE_Int *A_diag_i = hypre_CSRMatrixI(A_diag); HYPRE_Int *A_diag_j = hypre_CSRMatrixJ(A_diag); HYPRE_Real *A_diag_data = hypre_CSRMatrixData(A_diag); HYPRE_Int *A_diag_j_new; HYPRE_Real *A_diag_data_new; hypre_CSRMatrix *A_offd = hypre_ParCSRMatrixOffd(A); HYPRE_Int *A_offd_i = hypre_CSRMatrixI(A_offd); HYPRE_Int *A_offd_j = hypre_CSRMatrixJ(A_offd); HYPRE_Real *A_offd_data = hypre_CSRMatrixData(A_offd); HYPRE_Int *A_offd_j_new; HYPRE_Real *A_offd_data_new; HYPRE_Int n_fine = hypre_CSRMatrixNumRows(A_diag); HYPRE_Int num_cols = hypre_CSRMatrixNumCols(A_diag); HYPRE_Int i, j, start_j; HYPRE_Int ierr = 0; HYPRE_Int next_open; HYPRE_Int now_checking; HYPRE_Int num_lost; HYPRE_Int num_lost_global = 0; HYPRE_Int next_open_offd; HYPRE_Int now_checking_offd; HYPRE_Int num_lost_offd; HYPRE_Int num_lost_global_offd; HYPRE_Int A_diag_size; HYPRE_Int A_offd_size; HYPRE_Int num_elmts; HYPRE_Int cnt, cnt_diag, cnt_offd; HYPRE_Real row_nrm; HYPRE_Real drop_coeff; HYPRE_Real row_sum; HYPRE_Real scale; HYPRE_MemoryLocation memory_location_diag = hypre_CSRMatrixMemoryLocation(A_diag); HYPRE_MemoryLocation memory_location_offd = hypre_CSRMatrixMemoryLocation(A_offd); /* Threading variables. Entry i of num_lost_(offd_)per_thread holds the * number of dropped entries over thread i's row range. Cum_lost_per_thread * will temporarily store the cumulative number of dropped entries up to * each thread. */ HYPRE_Int my_thread_num, num_threads, start, stop; HYPRE_Int * max_num_threads = hypre_CTAlloc(HYPRE_Int, 1, HYPRE_MEMORY_HOST); HYPRE_Int * cum_lost_per_thread; HYPRE_Int * num_lost_per_thread; HYPRE_Int * num_lost_offd_per_thread; /* Initialize threading variables */ max_num_threads[0] = hypre_NumThreads(); cum_lost_per_thread = hypre_CTAlloc(HYPRE_Int, max_num_threads[0], HYPRE_MEMORY_HOST); num_lost_per_thread = hypre_CTAlloc(HYPRE_Int, max_num_threads[0], HYPRE_MEMORY_HOST); num_lost_offd_per_thread = hypre_CTAlloc(HYPRE_Int, max_num_threads[0], HYPRE_MEMORY_HOST); for (i = 0; i < max_num_threads[0]; i++) { num_lost_per_thread[i] = 0; num_lost_offd_per_thread[i] = 0; } #ifdef HYPRE_USING_OPENMP #pragma omp parallel private(i,my_thread_num,num_threads,row_nrm, drop_coeff,j,start_j,row_sum,scale,num_lost,now_checking,next_open,num_lost_offd,now_checking_offd,next_open_offd,start,stop,cnt_diag,cnt_offd,num_elmts,cnt) #endif { my_thread_num = hypre_GetThreadNum(); num_threads = hypre_NumActiveThreads(); /* Compute each thread's range of rows to truncate and compress. Note, * that i, j and data are all compressed as entries are dropped, but * that the compression only occurs locally over each thread's row * range. A_diag_i is only made globally consistent at the end of this * routine. During the dropping phases, A_diag_i[stop] will point to * the start of the next thread's row range. */ /* my row range */ start = (n_fine / num_threads) * my_thread_num; if (my_thread_num == num_threads - 1) { stop = n_fine; } else { stop = (n_fine / num_threads) * (my_thread_num + 1); } /* * Truncate based on truncation tolerance */ if (tol > 0) { num_lost = 0; num_lost_offd = 0; next_open = A_diag_i[start]; now_checking = A_diag_i[start]; next_open_offd = A_offd_i[start];; now_checking_offd = A_offd_i[start];; for (i = start; i < stop; i++) { row_nrm = 0; /* compute norm for dropping small terms */ if (nrm_type == 0) { /* infty-norm */ for (j = A_diag_i[i]; j < A_diag_i[i + 1]; j++) { row_nrm = (row_nrm < hypre_cabs(A_diag_data[j])) ? hypre_cabs(A_diag_data[j]) : row_nrm; } for (j = A_offd_i[i]; j < A_offd_i[i + 1]; j++) { row_nrm = (row_nrm < hypre_cabs(A_offd_data[j])) ? hypre_cabs(A_offd_data[j]) : row_nrm; } } if (nrm_type == 1) { /* 1-norm */ for (j = A_diag_i[i]; j < A_diag_i[i + 1]; j++) { row_nrm += hypre_cabs(A_diag_data[j]); } for (j = A_offd_i[i]; j < A_offd_i[i + 1]; j++) { row_nrm += hypre_cabs(A_offd_data[j]); } } if (nrm_type == 2) { /* 2-norm */ for (j = A_diag_i[i]; j < A_diag_i[i + 1]; j++) { HYPRE_Complex v = A_diag_data[j]; row_nrm += v * v; } for (j = A_offd_i[i]; j < A_offd_i[i + 1]; j++) { HYPRE_Complex v = A_offd_data[j]; row_nrm += v * v; } row_nrm = hypre_sqrt(row_nrm); } drop_coeff = tol * row_nrm; start_j = A_diag_i[i]; if (num_lost) { A_diag_i[i] -= num_lost; } row_sum = 0; scale = 0; for (j = start_j; j < A_diag_i[i + 1]; j++) { row_sum += A_diag_data[now_checking]; if (hypre_cabs(A_diag_data[now_checking]) < drop_coeff) { num_lost++; now_checking++; } else { scale += A_diag_data[now_checking]; A_diag_data[next_open] = A_diag_data[now_checking]; A_diag_j[next_open] = A_diag_j[now_checking]; now_checking++; next_open++; } } start_j = A_offd_i[i]; if (num_lost_offd) { A_offd_i[i] -= num_lost_offd; } for (j = start_j; j < A_offd_i[i + 1]; j++) { row_sum += A_offd_data[now_checking_offd]; if (hypre_cabs(A_offd_data[now_checking_offd]) < drop_coeff) { num_lost_offd++; now_checking_offd++; } else { scale += A_offd_data[now_checking_offd]; A_offd_data[next_open_offd] = A_offd_data[now_checking_offd]; A_offd_j[next_open_offd] = A_offd_j[now_checking_offd]; now_checking_offd++; next_open_offd++; } } /* scale row of A */ if (rescale && scale != 0.) { if (scale != row_sum) { scale = row_sum / scale; for (j = A_diag_i[i]; j < (A_diag_i[i + 1] - num_lost); j++) { A_diag_data[j] *= scale; } for (j = A_offd_i[i]; j < (A_offd_i[i + 1] - num_lost_offd); j++) { A_offd_data[j] *= scale; } } } } /* end loop for (i = 0; i < n_fine; i++) */ /* store number of dropped elements and number of threads */ if (my_thread_num == 0) { max_num_threads[0] = num_threads; } num_lost_per_thread[my_thread_num] = num_lost; num_lost_offd_per_thread[my_thread_num] = num_lost_offd; } /* end if (trunc_factor > 0) */ /* * Truncate based on capping the nnz per row * */ if (max_row_elmts > 0) { HYPRE_Int A_mxnum, cnt1, last_index, last_index_offd; HYPRE_Int *A_aux_j; HYPRE_Real *A_aux_data; /* find maximum row length locally over this row range */ A_mxnum = 0; for (i = start; i < stop; i++) { /* Note A_diag_i[stop] is the starting point for the next thread * in j and data, not the stop point for this thread */ last_index = A_diag_i[i + 1]; last_index_offd = A_offd_i[i + 1]; if (i == stop - 1) { last_index -= num_lost_per_thread[my_thread_num]; last_index_offd -= num_lost_offd_per_thread[my_thread_num]; } cnt1 = last_index - A_diag_i[i] + last_index_offd - A_offd_i[i]; if (cnt1 > A_mxnum) { A_mxnum = cnt1; } } /* Some rows exceed max_row_elmts, and require truncation. Essentially, * each thread truncates and compresses its range of rows locally. */ if (A_mxnum > max_row_elmts) { num_lost = 0; num_lost_offd = 0; /* two temporary arrays to hold row i for temporary operations */ A_aux_j = hypre_CTAlloc(HYPRE_Int, A_mxnum, HYPRE_MEMORY_HOST); A_aux_data = hypre_CTAlloc(HYPRE_Real, A_mxnum, HYPRE_MEMORY_HOST); cnt_diag = A_diag_i[start]; cnt_offd = A_offd_i[start]; for (i = start; i < stop; i++) { /* Note A_diag_i[stop] is the starting point for the next thread * in j and data, not the stop point for this thread */ last_index = A_diag_i[i + 1]; last_index_offd = A_offd_i[i + 1]; if (i == stop - 1) { last_index -= num_lost_per_thread[my_thread_num]; last_index_offd -= num_lost_offd_per_thread[my_thread_num]; } row_sum = 0; num_elmts = last_index - A_diag_i[i] + last_index_offd - A_offd_i[i]; if (max_row_elmts < num_elmts) { /* copy both diagonal and off-diag parts of row i to _aux_ arrays */ cnt = 0; for (j = A_diag_i[i]; j < last_index; j++) { A_aux_j[cnt] = A_diag_j[j]; A_aux_data[cnt++] = A_diag_data[j]; row_sum += A_diag_data[j]; } num_lost += cnt; cnt1 = cnt; for (j = A_offd_i[i]; j < last_index_offd; j++) { A_aux_j[cnt] = A_offd_j[j] + num_cols; A_aux_data[cnt++] = A_offd_data[j]; row_sum += A_offd_data[j]; } num_lost_offd += cnt - cnt1; /* sort data */ hypre_qsort2_abs(A_aux_j, A_aux_data, 0, cnt - 1); scale = 0; if (i > start) { A_diag_i[i] = cnt_diag; A_offd_i[i] = cnt_offd; } for (j = 0; j < max_row_elmts; j++) { scale += A_aux_data[j]; if (A_aux_j[j] < num_cols) { A_diag_j[cnt_diag] = A_aux_j[j]; A_diag_data[cnt_diag++] = A_aux_data[j]; } else { A_offd_j[cnt_offd] = A_aux_j[j] - num_cols; A_offd_data[cnt_offd++] = A_aux_data[j]; } } num_lost -= cnt_diag - A_diag_i[i]; num_lost_offd -= cnt_offd - A_offd_i[i]; /* scale row of A */ if (rescale && (scale != 0.)) { if (scale != row_sum) { scale = row_sum / scale; for (j = A_diag_i[i]; j < cnt_diag; j++) { A_diag_data[j] *= scale; } for (j = A_offd_i[i]; j < cnt_offd; j++) { A_offd_data[j] *= scale; } } } } /* end if (max_row_elmts < num_elmts) */ else { /* nothing dropped from this row, but still have to shift entries back * by the number dropped so far */ if (A_diag_i[i] != cnt_diag) { start_j = A_diag_i[i]; A_diag_i[i] = cnt_diag; for (j = start_j; j < last_index; j++) { A_diag_j[cnt_diag] = A_diag_j[j]; A_diag_data[cnt_diag++] = A_diag_data[j]; } } else { cnt_diag += last_index - A_diag_i[i]; } if (A_offd_i[i] != cnt_offd) { start_j = A_offd_i[i]; A_offd_i[i] = cnt_offd; for (j = start_j; j < last_index_offd; j++) { A_offd_j[cnt_offd] = A_offd_j[j]; A_offd_data[cnt_offd++] = A_offd_data[j]; } } else { cnt_offd += last_index_offd - A_offd_i[i]; } } } /* end for (i = 0; i < n_fine; i++) */ num_lost_per_thread[my_thread_num] += num_lost; num_lost_offd_per_thread[my_thread_num] += num_lost_offd; hypre_TFree(A_aux_j, HYPRE_MEMORY_HOST); hypre_TFree(A_aux_data, HYPRE_MEMORY_HOST); } /* end if (A_mxnum > max_row_elmts) */ } /* end if (max_row_elmts > 0) */ /* Sum up num_lost_global */ #ifdef HYPRE_USING_OPENMP #pragma omp barrier #endif if (my_thread_num == 0) { num_lost_global = 0; num_lost_global_offd = 0; for (i = 0; i < max_num_threads[0]; i++) { num_lost_global += num_lost_per_thread[i]; num_lost_global_offd += num_lost_offd_per_thread[i]; } } #ifdef HYPRE_USING_OPENMP #pragma omp barrier #endif /* * Synchronize and create new diag data structures */ if (num_lost_global) { /* Each thread has it's own locally compressed CSR matrix from rows start * to stop. Now, we have to copy each thread's chunk into the new * process-wide CSR data structures * * First, we compute the new process-wide number of nonzeros (i.e., * A_diag_size), and compute cum_lost_per_thread[k] so that this * entry holds the cumulative sum of entries dropped up to and * including thread k. */ if (my_thread_num == 0) { A_diag_size = A_diag_i[n_fine]; for (i = 0; i < max_num_threads[0]; i++) { A_diag_size -= num_lost_per_thread[i]; if (i > 0) { cum_lost_per_thread[i] = num_lost_per_thread[i] + cum_lost_per_thread[i - 1]; } else { cum_lost_per_thread[i] = num_lost_per_thread[i]; } } A_diag_j_new = hypre_CTAlloc(HYPRE_Int, A_diag_size, memory_location_diag); A_diag_data_new = hypre_CTAlloc(HYPRE_Real, A_diag_size, memory_location_diag); } #ifdef HYPRE_USING_OPENMP #pragma omp barrier #endif /* points to next open spot in new data structures for this thread */ if (my_thread_num == 0) { next_open = 0; } else { /* remember, cum_lost_per_thread[k] stores the num dropped up to and * including thread k */ next_open = A_diag_i[start] - cum_lost_per_thread[my_thread_num - 1]; } /* copy the j and data arrays over */ for (i = A_diag_i[start]; i < A_diag_i[stop] - num_lost_per_thread[my_thread_num]; i++) { A_diag_j_new[next_open] = A_diag_j[i]; A_diag_data_new[next_open] = A_diag_data[i]; next_open += 1; } #ifdef HYPRE_USING_OPENMP #pragma omp barrier #endif /* update A_diag_i with number of dropped entries by all lower ranked * threads */ if (my_thread_num > 0) { for (i = start; i < stop; i++) { A_diag_i[i] -= cum_lost_per_thread[my_thread_num - 1]; } } if (my_thread_num == 0) { /* Set last entry */ A_diag_i[n_fine] = A_diag_size ; hypre_TFree(A_diag_j, memory_location_diag); hypre_TFree(A_diag_data, memory_location_diag); hypre_CSRMatrixJ(A_diag) = A_diag_j_new; hypre_CSRMatrixData(A_diag) = A_diag_data_new; hypre_CSRMatrixNumNonzeros(A_diag) = A_diag_size; } } /* * Synchronize and create new offd data structures */ #ifdef HYPRE_USING_OPENMP #pragma omp barrier #endif if (num_lost_global_offd) { /* Repeat process for off-diagonal */ if (my_thread_num == 0) { A_offd_size = A_offd_i[n_fine]; for (i = 0; i < max_num_threads[0]; i++) { A_offd_size -= num_lost_offd_per_thread[i]; if (i > 0) { cum_lost_per_thread[i] = num_lost_offd_per_thread[i] + cum_lost_per_thread[i - 1]; } else { cum_lost_per_thread[i] = num_lost_offd_per_thread[i]; } } A_offd_j_new = hypre_CTAlloc(HYPRE_Int, A_offd_size, memory_location_offd); A_offd_data_new = hypre_CTAlloc(HYPRE_Real, A_offd_size, memory_location_offd); } #ifdef HYPRE_USING_OPENMP #pragma omp barrier #endif /* points to next open spot in new data structures for this thread */ if (my_thread_num == 0) { next_open = 0; } else { /* remember, cum_lost_per_thread[k] stores the num dropped up to and * including thread k */ next_open = A_offd_i[start] - cum_lost_per_thread[my_thread_num - 1]; } /* copy the j and data arrays over */ for (i = A_offd_i[start]; i < A_offd_i[stop] - num_lost_offd_per_thread[my_thread_num]; i++) { A_offd_j_new[next_open] = A_offd_j[i]; A_offd_data_new[next_open] = A_offd_data[i]; next_open += 1; } #ifdef HYPRE_USING_OPENMP #pragma omp barrier #endif /* update A_offd_i with number of dropped entries by all lower ranked * threads */ if (my_thread_num > 0) { for (i = start; i < stop; i++) { A_offd_i[i] -= cum_lost_per_thread[my_thread_num - 1]; } } if (my_thread_num == 0) { /* Set last entry */ A_offd_i[n_fine] = A_offd_size ; hypre_TFree(A_offd_j, memory_location_offd); hypre_TFree(A_offd_data, memory_location_offd); hypre_CSRMatrixJ(A_offd) = A_offd_j_new; hypre_CSRMatrixData(A_offd) = A_offd_data_new; hypre_CSRMatrixNumNonzeros(A_offd) = A_offd_size; } } } /* end parallel region */ hypre_TFree(max_num_threads, HYPRE_MEMORY_HOST); hypre_TFree(cum_lost_per_thread, HYPRE_MEMORY_HOST); hypre_TFree(num_lost_per_thread, HYPRE_MEMORY_HOST); hypre_TFree(num_lost_offd_per_thread, HYPRE_MEMORY_HOST); #ifdef HYPRE_PROFILE hypre_profile_times[HYPRE_TIMER_ID_INTERP_TRUNC] += hypre_MPI_Wtime(); #endif return ierr; } /*-------------------------------------------------------------------------- * hypre_ParCSRMatrixSetConstantValues *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ParCSRMatrixSetConstantValues( hypre_ParCSRMatrix *A, HYPRE_Complex value ) { hypre_CSRMatrixSetConstantValues(hypre_ParCSRMatrixDiag(A), value); hypre_CSRMatrixSetConstantValues(hypre_ParCSRMatrixOffd(A), value); return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_ParCSRMatrixCopyColMapOffdToDevice *--------------------------------------------------------------------------*/ void hypre_ParCSRMatrixCopyColMapOffdToDevice(hypre_ParCSRMatrix *A) { #if defined(HYPRE_USING_GPU) || defined(HYPRE_USING_DEVICE_OPENMP) if (hypre_ParCSRMatrixDeviceColMapOffd(A) == NULL) { const HYPRE_Int num_cols_A_offd = hypre_CSRMatrixNumCols(hypre_ParCSRMatrixOffd(A)); hypre_ParCSRMatrixDeviceColMapOffd(A) = hypre_TAlloc(HYPRE_BigInt, num_cols_A_offd, HYPRE_MEMORY_DEVICE); hypre_TMemcpy(hypre_ParCSRMatrixDeviceColMapOffd(A), hypre_ParCSRMatrixColMapOffd(A), HYPRE_BigInt, num_cols_A_offd, HYPRE_MEMORY_DEVICE, HYPRE_MEMORY_HOST); } #else HYPRE_UNUSED_VAR(A); #endif } /*-------------------------------------------------------------------------- * hypre_ParCSRMatrixCopyColMapOffdToHost *--------------------------------------------------------------------------*/ void hypre_ParCSRMatrixCopyColMapOffdToHost(hypre_ParCSRMatrix *A) { #if defined(HYPRE_USING_GPU) if (hypre_ParCSRMatrixColMapOffd(A) == NULL) { const HYPRE_Int num_cols_A_offd = hypre_CSRMatrixNumCols(hypre_ParCSRMatrixOffd(A)); hypre_ParCSRMatrixColMapOffd(A) = hypre_TAlloc(HYPRE_BigInt, num_cols_A_offd, HYPRE_MEMORY_HOST); hypre_TMemcpy(hypre_ParCSRMatrixColMapOffd(A), hypre_ParCSRMatrixDeviceColMapOffd(A), HYPRE_BigInt, num_cols_A_offd, HYPRE_MEMORY_HOST, HYPRE_MEMORY_DEVICE); } #else HYPRE_UNUSED_VAR(A); #endif } hypre-2.33.0/src/parcsr_mv/par_csr_matrix.h000066400000000000000000000241731477326011500207140ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * Header info for Parallel CSR Matrix data structures * * Note: this matrix currently uses 0-based indexing. * *****************************************************************************/ #ifndef hypre_PAR_CSR_MATRIX_HEADER #define hypre_PAR_CSR_MATRIX_HEADER /*-------------------------------------------------------------------------- * Parallel CSR Matrix *--------------------------------------------------------------------------*/ #ifndef HYPRE_PAR_CSR_MATRIX_STRUCT #define HYPRE_PAR_CSR_MATRIX_STRUCT #endif typedef struct hypre_ParCSRMatrix_struct { MPI_Comm comm; HYPRE_BigInt global_num_rows; HYPRE_BigInt global_num_cols; HYPRE_BigInt global_num_rownnz; HYPRE_BigInt num_nonzeros; HYPRE_Real d_num_nonzeros; HYPRE_BigInt first_row_index; HYPRE_BigInt first_col_diag; /* need to know entire local range in case row_starts and col_starts are null (i.e., bgl) AHB 6/05*/ HYPRE_BigInt last_row_index; HYPRE_BigInt last_col_diag; hypre_CSRMatrix *diag; hypre_CSRMatrix *offd; hypre_CSRMatrix *diagT, *offdT; /* JSP: transposed matrices are created lazily and optional */ HYPRE_BigInt *col_map_offd; HYPRE_BigInt *device_col_map_offd; /* maps columns of offd to global columns */ HYPRE_BigInt row_starts[2]; /* row_starts[0] is start of local rows row_starts[1] is start of next processor's rows */ HYPRE_BigInt col_starts[2]; /* col_starts[0] is start of local columns col_starts[1] is start of next processor's columns */ hypre_ParCSRCommPkg *comm_pkg; hypre_ParCSRCommPkg *comm_pkgT; /* Does the ParCSRMatrix create/destroy `diag', `offd', `col_map_offd'? */ HYPRE_Int owns_data; /* Buffers used by GetRow to hold row currently being accessed. AJC, 4/99 */ HYPRE_BigInt *rowindices; HYPRE_Complex *rowvalues; HYPRE_Int getrowactive; hypre_IJAssumedPart *assumed_partition; HYPRE_Int owns_assumed_partition; /* Array to store ordering of local diagonal block to relax. In particular, used for triangulr matrices that are not ordered to be triangular. */ HYPRE_Int *proc_ordering; /* Save block diagonal inverse */ HYPRE_Int bdiag_size; HYPRE_Complex *bdiaginv; hypre_ParCSRCommPkg *bdiaginv_comm_pkg; #if defined(HYPRE_USING_GPU) /* these two arrays are reserveed for SoC matrices on GPUs to help build interpolation */ HYPRE_Int *soc_diag_j; HYPRE_Int *soc_offd_j; #endif } hypre_ParCSRMatrix; /*-------------------------------------------------------------------------- * Accessor functions for the Parallel CSR Matrix structure *--------------------------------------------------------------------------*/ #define hypre_ParCSRMatrixComm(matrix) ((matrix) -> comm) #define hypre_ParCSRMatrixGlobalNumRows(matrix) ((matrix) -> global_num_rows) #define hypre_ParCSRMatrixGlobalNumCols(matrix) ((matrix) -> global_num_cols) #define hypre_ParCSRMatrixGlobalNumRownnz(matrix) ((matrix) -> global_num_rownnz) #define hypre_ParCSRMatrixNumNonzeros(matrix) ((matrix) -> num_nonzeros) #define hypre_ParCSRMatrixDNumNonzeros(matrix) ((matrix) -> d_num_nonzeros) #define hypre_ParCSRMatrixFirstRowIndex(matrix) ((matrix) -> first_row_index) #define hypre_ParCSRMatrixFirstColDiag(matrix) ((matrix) -> first_col_diag) #define hypre_ParCSRMatrixLastRowIndex(matrix) ((matrix) -> last_row_index) #define hypre_ParCSRMatrixLastColDiag(matrix) ((matrix) -> last_col_diag) #define hypre_ParCSRMatrixDiag(matrix) ((matrix) -> diag) #define hypre_ParCSRMatrixOffd(matrix) ((matrix) -> offd) #define hypre_ParCSRMatrixDiagT(matrix) ((matrix) -> diagT) #define hypre_ParCSRMatrixOffdT(matrix) ((matrix) -> offdT) #define hypre_ParCSRMatrixColMapOffd(matrix) ((matrix) -> col_map_offd) #define hypre_ParCSRMatrixDeviceColMapOffd(matrix) ((matrix) -> device_col_map_offd) #define hypre_ParCSRMatrixRowStarts(matrix) ((matrix) -> row_starts) #define hypre_ParCSRMatrixColStarts(matrix) ((matrix) -> col_starts) #define hypre_ParCSRMatrixCommPkg(matrix) ((matrix) -> comm_pkg) #define hypre_ParCSRMatrixCommPkgT(matrix) ((matrix) -> comm_pkgT) #define hypre_ParCSRMatrixOwnsData(matrix) ((matrix) -> owns_data) #define hypre_ParCSRMatrixRowindices(matrix) ((matrix) -> rowindices) #define hypre_ParCSRMatrixRowvalues(matrix) ((matrix) -> rowvalues) #define hypre_ParCSRMatrixGetrowactive(matrix) ((matrix) -> getrowactive) #define hypre_ParCSRMatrixAssumedPartition(matrix) ((matrix) -> assumed_partition) #define hypre_ParCSRMatrixOwnsAssumedPartition(matrix) ((matrix) -> owns_assumed_partition) #define hypre_ParCSRMatrixProcOrdering(matrix) ((matrix) -> proc_ordering) #if defined(HYPRE_USING_GPU) #define hypre_ParCSRMatrixSocDiagJ(matrix) ((matrix) -> soc_diag_j) #define hypre_ParCSRMatrixSocOffdJ(matrix) ((matrix) -> soc_offd_j) #endif #define hypre_ParCSRMatrixNumRows(matrix) hypre_CSRMatrixNumRows(hypre_ParCSRMatrixDiag(matrix)) #define hypre_ParCSRMatrixNumCols(matrix) hypre_CSRMatrixNumCols(hypre_ParCSRMatrixDiag(matrix)) static inline HYPRE_MAYBE_UNUSED_FUNC HYPRE_MemoryLocation hypre_ParCSRMatrixMemoryLocation(hypre_ParCSRMatrix *matrix) { if (!matrix) { return HYPRE_MEMORY_UNDEFINED; } hypre_CSRMatrix *diag = hypre_ParCSRMatrixDiag(matrix); hypre_CSRMatrix *offd = hypre_ParCSRMatrixOffd(matrix); HYPRE_MemoryLocation memory_diag = diag ? hypre_CSRMatrixMemoryLocation( diag) : HYPRE_MEMORY_UNDEFINED; HYPRE_MemoryLocation memory_offd = offd ? hypre_CSRMatrixMemoryLocation( offd) : HYPRE_MEMORY_UNDEFINED; if (diag && offd) { if (memory_diag != memory_offd) { char err_msg[1024]; hypre_sprintf(err_msg, "Error: ParCSRMatrix Memory Location Diag (%d) != Offd (%d)\n", memory_diag, memory_offd); hypre_error_w_msg(HYPRE_ERROR_MEMORY, err_msg); hypre_assert(0); return HYPRE_MEMORY_UNDEFINED; } return memory_diag; } if (diag) { return memory_diag; } if (offd) { return memory_offd; } return HYPRE_MEMORY_UNDEFINED; } /*-------------------------------------------------------------------------- * Parallel CSR Boolean Matrix *--------------------------------------------------------------------------*/ typedef struct { MPI_Comm comm; HYPRE_BigInt global_num_rows; HYPRE_BigInt global_num_cols; HYPRE_BigInt first_row_index; HYPRE_BigInt first_col_diag; HYPRE_BigInt last_row_index; HYPRE_BigInt last_col_diag; hypre_CSRBooleanMatrix *diag; hypre_CSRBooleanMatrix *offd; HYPRE_BigInt *col_map_offd; HYPRE_BigInt *row_starts; HYPRE_BigInt *col_starts; hypre_ParCSRCommPkg *comm_pkg; hypre_ParCSRCommPkg *comm_pkgT; HYPRE_Int owns_data; HYPRE_Int owns_row_starts; HYPRE_Int owns_col_starts; HYPRE_BigInt num_nonzeros; HYPRE_BigInt *rowindices; HYPRE_Int getrowactive; } hypre_ParCSRBooleanMatrix; /*-------------------------------------------------------------------------- * Accessor functions for the Parallel CSR Boolean Matrix structure *--------------------------------------------------------------------------*/ #define hypre_ParCSRBooleanMatrix_Get_Comm(matrix) ((matrix)->comm) #define hypre_ParCSRBooleanMatrix_Get_GlobalNRows(matrix) ((matrix)->global_num_rows) #define hypre_ParCSRBooleanMatrix_Get_GlobalNCols(matrix) ((matrix)->global_num_cols) #define hypre_ParCSRBooleanMatrix_Get_StartRow(matrix) ((matrix)->first_row_index) #define hypre_ParCSRBooleanMatrix_Get_FirstRowIndex(matrix) ((matrix)->first_row_index) #define hypre_ParCSRBooleanMatrix_Get_FirstColDiag(matrix) ((matrix)->first_col_diag) #define hypre_ParCSRBooleanMatrix_Get_LastRowIndex(matrix) ((matrix)->last_row_index) #define hypre_ParCSRBooleanMatrix_Get_LastColDiag(matrix) ((matrix)->last_col_diag) #define hypre_ParCSRBooleanMatrix_Get_Diag(matrix) ((matrix)->diag) #define hypre_ParCSRBooleanMatrix_Get_Offd(matrix) ((matrix)->offd) #define hypre_ParCSRBooleanMatrix_Get_ColMapOffd(matrix) ((matrix)->col_map_offd) #define hypre_ParCSRBooleanMatrix_Get_RowStarts(matrix) ((matrix)->row_starts) #define hypre_ParCSRBooleanMatrix_Get_ColStarts(matrix) ((matrix)->col_starts) #define hypre_ParCSRBooleanMatrix_Get_CommPkg(matrix) ((matrix)->comm_pkg) #define hypre_ParCSRBooleanMatrix_Get_CommPkgT(matrix) ((matrix)->comm_pkgT) #define hypre_ParCSRBooleanMatrix_Get_OwnsData(matrix) ((matrix)->owns_data) #define hypre_ParCSRBooleanMatrix_Get_OwnsRowStarts(matrix) ((matrix)->owns_row_starts) #define hypre_ParCSRBooleanMatrix_Get_OwnsColStarts(matrix) ((matrix)->owns_col_starts) #define hypre_ParCSRBooleanMatrix_Get_NRows(matrix) ((matrix->diag->num_rows)) #define hypre_ParCSRBooleanMatrix_Get_NCols(matrix) ((matrix->diag->num_cols)) #define hypre_ParCSRBooleanMatrix_Get_NNZ(matrix) ((matrix)->num_nonzeros) #define hypre_ParCSRBooleanMatrix_Get_Rowindices(matrix) ((matrix)->rowindices) #define hypre_ParCSRBooleanMatrix_Get_Getrowactive(matrix) ((matrix)->getrowactive) #endif hypre-2.33.0/src/parcsr_mv/par_csr_matrix_stats.c000066400000000000000000000423051477326011500221220ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * Member functions for matrix statistics specialized to ParCSRMatrix types * *****************************************************************************/ #include "_hypre_parcsr_mv.h" /* Shortcuts */ #define sendbuffer(i, j, lda) sendbuffer[i * lda + j] #define recvbuffer(i, j, lda) recvbuffer[i * lda + j] /*-------------------------------------------------------------------------- * hypre_ParCSRMatrixStatsComputePassOneLocalHost *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ParCSRMatrixStatsComputePassOneLocalHost(hypre_ParCSRMatrix *A, hypre_MatrixStats *stats) { /* Diag matrix data */ hypre_CSRMatrix *diag; HYPRE_Int *diag_i; HYPRE_Complex *diag_a; /* Offd matrix data */ hypre_CSRMatrix *offd; HYPRE_Int *offd_i; HYPRE_Complex *offd_a; /* Local arrays */ hypre_ulonglongint *actual_nonzeros; HYPRE_Int *nnzrow_min; HYPRE_Int *nnzrow_max; HYPRE_Real *rowsum_min; HYPRE_Real *rowsum_max; HYPRE_Real *rowsum_avg; /* Local variables */ HYPRE_Int i, j; HYPRE_Int num_rows; HYPRE_Int num_threads = hypre_NumThreads(); /* Allocate memory */ actual_nonzeros = hypre_TAlloc(hypre_ulonglongint, num_threads, HYPRE_MEMORY_HOST); nnzrow_min = hypre_TAlloc(HYPRE_Int, num_threads, HYPRE_MEMORY_HOST); nnzrow_max = hypre_TAlloc(HYPRE_Int, num_threads, HYPRE_MEMORY_HOST); rowsum_min = hypre_TAlloc(HYPRE_Real, num_threads, HYPRE_MEMORY_HOST); rowsum_max = hypre_TAlloc(HYPRE_Real, num_threads, HYPRE_MEMORY_HOST); rowsum_avg = hypre_TAlloc(HYPRE_Real, num_threads, HYPRE_MEMORY_HOST); /* ParCSRMatrix info */ num_rows = hypre_ParCSRMatrixNumRows(A); /* Diag matrix data */ diag = hypre_ParCSRMatrixDiag(A); diag_i = hypre_CSRMatrixI(diag); diag_a = hypre_CSRMatrixData(diag); /* Offd matrix data */ offd = hypre_ParCSRMatrixOffd(A); offd_i = hypre_CSRMatrixI(offd); offd_a = hypre_CSRMatrixData(offd); /* Initialize local thread arrays */ for (i = 0; i < num_threads; i++) { actual_nonzeros[i] = 0ULL; nnzrow_min[i] = hypre_pow2(30); nnzrow_max[i] = 0; rowsum_min[i] = hypre_pow(2, 100); rowsum_max[i] = - hypre_pow(2, 100); rowsum_avg[i] = 0.0; } #ifdef HYPRE_USING_OPENMP #pragma omp parallel private(i, j) #endif { HYPRE_Int nnzrow, ns, ne; HYPRE_Int mytid = hypre_GetThreadNum(); HYPRE_Real threshold = hypre_MatrixStatsActualThreshold(stats); HYPRE_Real rowsum; hypre_partition1D(num_rows, hypre_NumActiveThreads(), mytid, &ns, &ne); for (i = ns; i < ne; i++) { nnzrow = (diag_i[i + 1] - diag_i[i]) + (offd_i[i + 1] - offd_i[i]); rowsum = 0.0; for (j = diag_i[i]; j < diag_i[i + 1]; j++) { actual_nonzeros[mytid] += (hypre_cabs(diag_a[j]) > threshold) ? 1 : 0; rowsum += diag_a[j]; } for (j = offd_i[i]; j < offd_i[i + 1]; j++) { actual_nonzeros[mytid] += (hypre_cabs(offd_a[j]) > threshold) ? 1 : 0; rowsum += offd_a[j]; } /* Update sum quantities */ rowsum_avg[mytid] += rowsum; /* Update min quantities */ nnzrow_min[mytid] = (nnzrow_min[mytid] > nnzrow) ? nnzrow : nnzrow_min[mytid]; rowsum_min[mytid] = (rowsum_min[mytid] > rowsum) ? rowsum : rowsum_min[mytid]; /* Update max quantities */ nnzrow_max[mytid] = (nnzrow_max[mytid] < nnzrow) ? nnzrow : nnzrow_max[mytid]; rowsum_max[mytid] = (rowsum_max[mytid] < rowsum) ? rowsum : rowsum_max[mytid]; } } /* end of parallel region */ /* Reduce along threads */ for (i = 1; i < num_threads; i++) { actual_nonzeros[0] += actual_nonzeros[i]; rowsum_avg[0] += rowsum_avg[i]; nnzrow_min[0] = hypre_min(nnzrow_min[0], nnzrow_min[i]); nnzrow_max[0] = hypre_max(nnzrow_max[0], nnzrow_max[i]); rowsum_min[0] = hypre_min(rowsum_min[0], rowsum_min[i]); rowsum_max[0] = hypre_max(rowsum_max[0], rowsum_max[i]); } /* Set output values */ hypre_MatrixStatsActualNonzeros(stats) = actual_nonzeros[0]; hypre_MatrixStatsNnzrowMin(stats) = nnzrow_min[0]; hypre_MatrixStatsNnzrowMax(stats) = nnzrow_max[0]; hypre_MatrixStatsRowsumMin(stats) = rowsum_min[0]; hypre_MatrixStatsRowsumMax(stats) = rowsum_max[0]; hypre_MatrixStatsRowsumAvg(stats) = rowsum_avg[0]; /* Free memory */ hypre_TFree(actual_nonzeros, HYPRE_MEMORY_HOST); hypre_TFree(nnzrow_min, HYPRE_MEMORY_HOST); hypre_TFree(nnzrow_max, HYPRE_MEMORY_HOST); hypre_TFree(rowsum_min, HYPRE_MEMORY_HOST); hypre_TFree(rowsum_max, HYPRE_MEMORY_HOST); hypre_TFree(rowsum_avg, HYPRE_MEMORY_HOST); return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_ParCSRMatrixStatsComputePassTwoLocalHost *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ParCSRMatrixStatsComputePassTwoLocalHost(hypre_ParCSRMatrix *A, hypre_MatrixStats *stats) { /* Diag matrix data */ hypre_CSRMatrix *diag; HYPRE_Int *diag_i; HYPRE_Complex *diag_a; /* Offd matrix data */ hypre_CSRMatrix *offd; HYPRE_Int *offd_i; HYPRE_Complex *offd_a; /* Local arrays */ HYPRE_Real *nnzrow_avg; HYPRE_Real *rowsum_avg; HYPRE_Real *nnzrow_sqsum; HYPRE_Real *rowsum_sqsum; /* Local variables */ HYPRE_Int i, j; HYPRE_Int num_rows; HYPRE_Int num_threads = hypre_NumThreads(); HYPRE_Int nnzrow; /* Allocate memory */ nnzrow_avg = hypre_TAlloc(HYPRE_Real, num_threads, HYPRE_MEMORY_HOST); rowsum_avg = hypre_TAlloc(HYPRE_Real, num_threads, HYPRE_MEMORY_HOST); nnzrow_sqsum = hypre_TAlloc(HYPRE_Real, num_threads, HYPRE_MEMORY_HOST); rowsum_sqsum = hypre_TAlloc(HYPRE_Real, num_threads, HYPRE_MEMORY_HOST); /* Initialize matrix variables */ diag = hypre_ParCSRMatrixDiag(A); offd = hypre_ParCSRMatrixOffd(A); diag_i = hypre_CSRMatrixI(diag); offd_i = hypre_CSRMatrixI(offd); diag_a = hypre_CSRMatrixData(diag); offd_a = hypre_CSRMatrixData(offd); num_rows = hypre_CSRMatrixNumRows(diag); /* Initialize local thread variables */ for (i = 0; i < num_threads; i++) { rowsum_avg[i] = hypre_MatrixStatsRowsumAvg(stats); nnzrow_avg[i] = hypre_MatrixStatsNnzrowAvg(stats); nnzrow_sqsum[i] = 0.0; rowsum_sqsum[i] = 0.0; } #ifdef HYPRE_USING_OPENMP #pragma omp parallel private(i, j) #endif { HYPRE_Int ns, ne; HYPRE_Int mytid = hypre_GetThreadNum(); HYPRE_Real rowsum; hypre_partition1D(num_rows, hypre_NumActiveThreads(), mytid, &ns, &ne); for (i = ns; i < ne; i++) { nnzrow = (diag_i[i + 1] - diag_i[i]) + (offd_i[i + 1] - offd_i[i]); rowsum = 0.0; for (j = diag_i[i]; j < diag_i[i + 1]; j++) { rowsum += diag_a[j]; } for (j = offd_i[i]; j < offd_i[i + 1]; j++) { rowsum += offd_a[j]; } /* Update sum quantities */ nnzrow_sqsum[mytid] += hypre_squared((HYPRE_Real) nnzrow - nnzrow_avg[mytid]); rowsum_sqsum[mytid] += hypre_squared(rowsum - rowsum_avg[mytid]); } } /* end of parallel region */ /* Reduce along threads */ for (i = 1; i < num_threads; i++) { nnzrow_sqsum[0] += nnzrow_sqsum[i]; rowsum_sqsum[0] += rowsum_sqsum[i]; } /* Set output values */ hypre_MatrixStatsNnzrowSqsum(stats) = nnzrow_sqsum[0]; hypre_MatrixStatsRowsumSqsum(stats) = rowsum_sqsum[0]; /* Free memory */ hypre_TFree(nnzrow_sqsum, HYPRE_MEMORY_HOST); hypre_TFree(rowsum_sqsum, HYPRE_MEMORY_HOST); hypre_TFree(nnzrow_avg, HYPRE_MEMORY_HOST); hypre_TFree(rowsum_avg, HYPRE_MEMORY_HOST); return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_ParCSRMatrixStatsComputePassOneLocal * * Compute the first pass of matrix statistics locally on a rank consisting * of average (avg), minimum (min) and maximum (max) quantities. *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ParCSRMatrixStatsComputePassOneLocal(hypre_ParCSRMatrix *A, hypre_MatrixStats *stats) { /* Call backend implementations */ #if defined(HYPRE_USING_CUDA) || defined(HYPRE_USING_HIP) HYPRE_ExecutionPolicy exec = hypre_GetExecPolicy1(hypre_ParCSRMatrixMemoryLocation(A)); if (exec == HYPRE_EXEC_DEVICE) { /* TODO (VPM): Implement computation on device */ hypre_ParCSRMatrix *h_A = hypre_ParCSRMatrixClone_v2(A, 1, HYPRE_MEMORY_HOST); hypre_ParCSRMatrixStatsComputePassOneLocalHost(h_A, stats); hypre_ParCSRMatrixDestroy(h_A); } else #endif { hypre_ParCSRMatrixStatsComputePassOneLocalHost(A, stats); } return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_ParCSRMatrixStatsComputePassTwoLocal * * Compute the second pass of matrix statistics locally on a rank consisting * of squared sum (sqsum) and standard deviation (stdev) quantities. *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ParCSRMatrixStatsComputePassTwoLocal(hypre_ParCSRMatrix *A, hypre_MatrixStats *stats) { /* Call backend implementations */ #if defined(HYPRE_USING_CUDA) || defined(HYPRE_USING_HIP) HYPRE_ExecutionPolicy exec = hypre_GetExecPolicy1(hypre_ParCSRMatrixMemoryLocation(A)); if (exec == HYPRE_EXEC_DEVICE) { /* TODO (VPM): Implement computation on device */ hypre_ParCSRMatrix *h_A = hypre_ParCSRMatrixClone_v2(A, 1, HYPRE_MEMORY_HOST); hypre_ParCSRMatrixStatsComputePassTwoLocalHost(h_A, stats); hypre_ParCSRMatrixDestroy(h_A); } else #endif { hypre_ParCSRMatrixStatsComputePassTwoLocalHost(A, stats); } return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_ParCSRMatrixStatsArrayCompute *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ParCSRMatrixStatsArrayCompute(HYPRE_Int num_matrices, hypre_ParCSRMatrix **matrices, hypre_MatrixStatsArray *stats_array) { hypre_MatrixStats *stats; /* MPI buffers */ HYPRE_Real *recvbuffer; HYPRE_Real *sendbuffer; /* Local variables */ MPI_Comm comm; hypre_CSRMatrix *diag; hypre_CSRMatrix *offd; HYPRE_Int i; HYPRE_BigInt global_num_rows; HYPRE_Real global_size; /* Sanity check */ if (num_matrices < 1) { return hypre_error_flag; } /* We assume all MPI communicators are equal */ comm = hypre_ParCSRMatrixComm(matrices[0]); /* Allocate MPI buffers */ recvbuffer = hypre_CTAlloc(HYPRE_Real, 4 * num_matrices, HYPRE_MEMORY_HOST); sendbuffer = hypre_CTAlloc(HYPRE_Real, 4 * num_matrices, HYPRE_MEMORY_HOST); /* Set matrix dimensions */ for (i = 0; i < num_matrices; i++) { stats = hypre_MatrixStatsArrayEntry(stats_array, i); hypre_MatrixStatsNumRows(stats) = hypre_ParCSRMatrixGlobalNumRows(matrices[i]); hypre_MatrixStatsNumCols(stats) = hypre_ParCSRMatrixGlobalNumCols(matrices[i]); } /*------------------------------------------------- * First pass for computing statistics *-------------------------------------------------*/ for (i = 0; i < num_matrices; i++) { stats = hypre_MatrixStatsArrayEntry(stats_array, i); hypre_ParCSRMatrixStatsComputePassOneLocal(matrices[i], stats); } /*------------------------------------------------- * Global reduce for min/max quantities *-------------------------------------------------*/ /* Pack MPI buffers */ for (i = 0; i < num_matrices; i++) { stats = hypre_MatrixStatsArrayEntry(stats_array, i); sendbuffer(i, 0, 4) = (HYPRE_Real) - hypre_MatrixStatsNnzrowMin(stats); sendbuffer(i, 1, 4) = (HYPRE_Real) hypre_MatrixStatsNnzrowMax(stats); sendbuffer(i, 2, 4) = (HYPRE_Real) - hypre_MatrixStatsRowsumMin(stats); sendbuffer(i, 3, 4) = (HYPRE_Real) hypre_MatrixStatsRowsumMax(stats); } hypre_MPI_Reduce(sendbuffer, recvbuffer, 4 * num_matrices, HYPRE_MPI_REAL, hypre_MPI_MAX, 0, comm); /* Unpack MPI buffers */ for (i = 0; i < num_matrices; i++) { stats = hypre_MatrixStatsArrayEntry(stats_array, i); hypre_MatrixStatsNnzrowMin(stats) = (HYPRE_Int) - recvbuffer(i, 0, 4); hypre_MatrixStatsNnzrowMax(stats) = (HYPRE_Int) recvbuffer(i, 1, 4); hypre_MatrixStatsRowsumMin(stats) = (HYPRE_Real) - recvbuffer(i, 2, 4); hypre_MatrixStatsRowsumMax(stats) = (HYPRE_Real) recvbuffer(i, 3, 4); } /*------------------------------------------------- * Global reduce for summation quantities *-------------------------------------------------*/ /* Pack MPI buffers */ for (i = 0; i < num_matrices; i++) { stats = hypre_MatrixStatsArrayEntry(stats_array, i); diag = hypre_ParCSRMatrixDiag(matrices[i]); offd = hypre_ParCSRMatrixOffd(matrices[i]); sendbuffer(i, 0, 3) = (HYPRE_Real) (hypre_CSRMatrixNumNonzeros(diag) + hypre_CSRMatrixNumNonzeros(offd)); sendbuffer(i, 1, 3) = (HYPRE_Real) hypre_MatrixStatsActualNonzeros(stats); sendbuffer(i, 2, 3) = (HYPRE_Real) hypre_MatrixStatsRowsumAvg(stats); } hypre_MPI_Reduce(sendbuffer, recvbuffer, 3 * num_matrices, HYPRE_MPI_REAL, hypre_MPI_SUM, 0, comm); /* Unpack MPI buffers */ for (i = 0; i < num_matrices; i++) { stats = hypre_MatrixStatsArrayEntry(stats_array, i); global_num_rows = hypre_ParCSRMatrixGlobalNumRows(matrices[i]); global_size = hypre_squared((HYPRE_Real) global_num_rows); hypre_MatrixStatsNumNonzeros(stats) = (hypre_ulonglongint) recvbuffer(i, 0, 3); hypre_MatrixStatsActualNonzeros(stats) = (hypre_ulonglongint) recvbuffer(i, 1, 3); hypre_MatrixStatsRowsumAvg(stats) = (HYPRE_Real) recvbuffer(i, 2, 3) / (HYPRE_Real) global_num_rows; hypre_MatrixStatsNnzrowAvg(stats) = (HYPRE_Real) recvbuffer(i, 0, 3) / (HYPRE_Real) global_num_rows; hypre_MatrixStatsSparsity(stats) = 100.0 * (1.0 - recvbuffer(i, 0, 3) / global_size); hypre_ParCSRMatrixNumNonzeros(matrices[i]) = (HYPRE_Int) recvbuffer(i, 0, 3); hypre_ParCSRMatrixDNumNonzeros(matrices[i]) = (HYPRE_Real) recvbuffer(i, 0, 3); } /*------------------------------------------------- * Second pass for computing statistics *-------------------------------------------------*/ for (i = 0; i < num_matrices; i++) { stats = hypre_MatrixStatsArrayEntry(stats_array, i); hypre_ParCSRMatrixStatsComputePassTwoLocal(matrices[i], stats); } /*------------------------------------------------- * Global reduce for summation quantities *-------------------------------------------------*/ /* Pack MPI buffers */ for (i = 0; i < num_matrices; i++) { stats = hypre_MatrixStatsArrayEntry(stats_array, i); sendbuffer(i, 0, 2) = hypre_MatrixStatsNnzrowSqsum(stats); sendbuffer(i, 1, 2) = hypre_MatrixStatsRowsumSqsum(stats); } hypre_MPI_Reduce(sendbuffer, recvbuffer, 2 * num_matrices, HYPRE_MPI_REAL, hypre_MPI_SUM, 0, comm); /* Unpack MPI buffers */ for (i = 0; i < num_matrices; i++) { stats = hypre_MatrixStatsArrayEntry(stats_array, i); global_num_rows = hypre_ParCSRMatrixGlobalNumRows(matrices[i]); hypre_MatrixStatsNnzrowSqsum(stats) = recvbuffer(i, 0, 2); hypre_MatrixStatsRowsumSqsum(stats) = recvbuffer(i, 1, 2); hypre_MatrixStatsNnzrowStDev(stats) = hypre_sqrt(recvbuffer(i, 0, 2) / (HYPRE_Real) global_num_rows); hypre_MatrixStatsRowsumStDev(stats) = hypre_sqrt(recvbuffer(i, 1, 2) / (HYPRE_Real) global_num_rows); } /* Free MPI buffers */ hypre_TFree(recvbuffer, HYPRE_MEMORY_HOST); hypre_TFree(sendbuffer, HYPRE_MEMORY_HOST); return hypre_error_flag; } hypre-2.33.0/src/parcsr_mv/par_csr_matvec.c000066400000000000000000000605571477326011500206700ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * Matvec functions for hypre_CSRMatrix class. * *****************************************************************************/ #include "_hypre_parcsr_mv.h" /*-------------------------------------------------------------------------- * hypre_ParCSRMatrixMatvecOutOfPlaceHost *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ParCSRMatrixMatvecOutOfPlaceHost( HYPRE_Complex alpha, hypre_ParCSRMatrix *A, hypre_ParVector *x, HYPRE_Complex beta, hypre_ParVector *b, hypre_ParVector *y ) { hypre_ParCSRCommPkg *comm_pkg = hypre_ParCSRMatrixCommPkg(A); hypre_CSRMatrix *diag = hypre_ParCSRMatrixDiag(A); hypre_CSRMatrix *offd = hypre_ParCSRMatrixOffd(A); hypre_Vector *x_local = hypre_ParVectorLocalVector(x); hypre_Vector *b_local = hypre_ParVectorLocalVector(b); hypre_Vector *y_local = hypre_ParVectorLocalVector(y); hypre_Vector *x_tmp; HYPRE_BigInt num_rows = hypre_ParCSRMatrixGlobalNumRows(A); HYPRE_BigInt num_cols = hypre_ParCSRMatrixGlobalNumCols(A); HYPRE_BigInt x_size = hypre_ParVectorGlobalSize(x); HYPRE_BigInt b_size = hypre_ParVectorGlobalSize(b); HYPRE_BigInt y_size = hypre_ParVectorGlobalSize(y); HYPRE_Int num_cols_offd = hypre_CSRMatrixNumCols(offd); HYPRE_Int num_recvs, num_sends; HYPRE_Int ierr = 0; HYPRE_Int i; HYPRE_Int idxstride = hypre_VectorIndexStride(x_local); HYPRE_Int num_vectors = hypre_VectorNumVectors(x_local); HYPRE_Complex *x_local_data = hypre_VectorData(x_local); HYPRE_Complex *x_tmp_data; HYPRE_Complex *x_buf_data; HYPRE_ANNOTATE_FUNC_BEGIN; /*--------------------------------------------------------------------- * Check for size compatibility. ParMatvec returns ierr = 11 if * length of X doesn't equal the number of columns of A, * ierr = 12 if the length of Y doesn't equal the number of rows * of A, and ierr = 13 if both are true. * * Because temporary vectors are often used in ParMatvec, none of * these conditions terminates processing, and the ierr flag * is informational only. *--------------------------------------------------------------------*/ hypre_assert( idxstride > 0 ); if (num_cols != x_size) { ierr = 11; } if (num_rows != y_size || num_rows != b_size) { ierr = 12; } if (num_cols != x_size && (num_rows != y_size || num_rows != b_size)) { ierr = 13; } hypre_assert( hypre_VectorNumVectors(b_local) == num_vectors ); hypre_assert( hypre_VectorNumVectors(y_local) == num_vectors ); if (num_vectors == 1) { x_tmp = hypre_SeqVectorCreate(num_cols_offd); } else { hypre_assert(num_vectors > 1); x_tmp = hypre_SeqMultiVectorCreate(num_cols_offd, num_vectors); hypre_VectorMultiVecStorageMethod(x_tmp) = 1; } /*--------------------------------------------------------------------- * If there exists no CommPkg for A, a CommPkg is generated using * equally load balanced partitionings *--------------------------------------------------------------------*/ if (!comm_pkg) { hypre_MatvecCommPkgCreate(A); comm_pkg = hypre_ParCSRMatrixCommPkg(A); } /* Update send_map_starts, send_map_elmts, and recv_vec_starts when doing sparse matrix/multivector product */ hypre_ParCSRCommPkgUpdateVecStarts(comm_pkg, num_vectors, hypre_VectorVectorStride(hypre_ParVectorLocalVector(x)), hypre_VectorIndexStride(hypre_ParVectorLocalVector(x))); num_recvs = hypre_ParCSRCommPkgNumRecvs(comm_pkg); num_sends = hypre_ParCSRCommPkgNumSends(comm_pkg); hypre_assert( num_cols_offd * num_vectors == hypre_ParCSRCommPkgRecvVecStart(comm_pkg, num_recvs) ); hypre_assert( hypre_ParCSRCommPkgRecvVecStart(comm_pkg, 0) == 0 ); hypre_assert( hypre_ParCSRCommPkgSendMapStart(comm_pkg, 0) == 0 ); #ifdef HYPRE_PROFILE hypre_profile_times[HYPRE_TIMER_ID_PACK_UNPACK] -= hypre_MPI_Wtime(); #endif #if defined(HYPRE_USING_PERSISTENT_COMM) hypre_ParCSRPersistentCommHandle *persistent_comm_handle = hypre_ParCSRCommPkgGetPersistentCommHandle(1, comm_pkg); #else hypre_ParCSRCommHandle *comm_handle; #endif /*--------------------------------------------------------------------- * Allocate (during hypre_SeqVectorInitialize_v2) or retrieve * persistent receive data buffer for x_tmp (if persistent is enabled). *--------------------------------------------------------------------*/ #if defined(HYPRE_USING_PERSISTENT_COMM) hypre_VectorData(x_tmp) = (HYPRE_Complex *) hypre_ParCSRCommHandleRecvDataBuffer(persistent_comm_handle); hypre_SeqVectorSetDataOwner(x_tmp, 0); #endif hypre_SeqVectorInitialize_v2(x_tmp, HYPRE_MEMORY_HOST); x_tmp_data = hypre_VectorData(x_tmp); /*--------------------------------------------------------------------- * Allocate data send buffer *--------------------------------------------------------------------*/ #if defined(HYPRE_USING_PERSISTENT_COMM) x_buf_data = (HYPRE_Complex *) hypre_ParCSRCommHandleSendDataBuffer(persistent_comm_handle); #else x_buf_data = hypre_TAlloc(HYPRE_Complex, hypre_ParCSRCommPkgSendMapStart(comm_pkg, num_sends), HYPRE_MEMORY_HOST); #endif /* The assert is because this code has been tested for column-wise vector storage only. */ hypre_assert(idxstride == 1); /*--------------------------------------------------------------------- * Pack send data *--------------------------------------------------------------------*/ #if defined(HYPRE_USING_OPENMP) #pragma omp parallel for HYPRE_SMP_SCHEDULE #endif for (i = hypre_ParCSRCommPkgSendMapStart(comm_pkg, 0); i < hypre_ParCSRCommPkgSendMapStart(comm_pkg, num_sends); i++) { x_buf_data[i] = x_local_data[hypre_ParCSRCommPkgSendMapElmt(comm_pkg, i)]; } #ifdef HYPRE_PROFILE hypre_profile_times[HYPRE_TIMER_ID_PACK_UNPACK] += hypre_MPI_Wtime(); hypre_profile_times[HYPRE_TIMER_ID_HALO_EXCHANGE] -= hypre_MPI_Wtime(); #endif /* Non-blocking communication starts */ #ifdef HYPRE_USING_PERSISTENT_COMM hypre_ParCSRPersistentCommHandleStart(persistent_comm_handle, HYPRE_MEMORY_HOST, x_buf_data); #else comm_handle = hypre_ParCSRCommHandleCreate_v2(1, comm_pkg, HYPRE_MEMORY_HOST, x_buf_data, HYPRE_MEMORY_HOST, x_tmp_data); #endif #ifdef HYPRE_PROFILE hypre_profile_times[HYPRE_TIMER_ID_HALO_EXCHANGE] += hypre_MPI_Wtime(); #endif /* overlapped local computation */ hypre_CSRMatrixMatvecOutOfPlace(alpha, diag, x_local, beta, b_local, y_local, 0); #ifdef HYPRE_PROFILE hypre_profile_times[HYPRE_TIMER_ID_HALO_EXCHANGE] -= hypre_MPI_Wtime(); #endif /* Non-blocking communication ends */ #ifdef HYPRE_USING_PERSISTENT_COMM hypre_ParCSRPersistentCommHandleWait(persistent_comm_handle, HYPRE_MEMORY_HOST, x_tmp_data); #else hypre_ParCSRCommHandleDestroy(comm_handle); #endif #ifdef HYPRE_PROFILE hypre_profile_times[HYPRE_TIMER_ID_HALO_EXCHANGE] += hypre_MPI_Wtime(); #endif /* computation offd part */ if (num_cols_offd) { hypre_CSRMatrixMatvec(alpha, offd, x_tmp, 1.0, y_local); } /*--------------------------------------------------------------------- * Free memory *--------------------------------------------------------------------*/ hypre_SeqVectorDestroy(x_tmp); #if !defined(HYPRE_USING_PERSISTENT_COMM) hypre_TFree(x_buf_data, HYPRE_MEMORY_HOST); #endif HYPRE_ANNOTATE_FUNC_END; return ierr; } /*-------------------------------------------------------------------------- * hypre_ParCSRMatrixMatvecOutOfPlace * * Performs y <- alpha * A * x + beta * b *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ParCSRMatrixMatvecOutOfPlace( HYPRE_Complex alpha, hypre_ParCSRMatrix *A, hypre_ParVector *x, HYPRE_Complex beta, hypre_ParVector *b, hypre_ParVector *y ) { HYPRE_Int ierr = 0; #if defined(HYPRE_USING_GPU) HYPRE_ExecutionPolicy exec = hypre_GetExecPolicy2( hypre_ParCSRMatrixMemoryLocation(A), hypre_ParVectorMemoryLocation(x) ); if (exec == HYPRE_EXEC_DEVICE) { ierr = hypre_ParCSRMatrixMatvecOutOfPlaceDevice(alpha, A, x, beta, b, y); } else #endif { ierr = hypre_ParCSRMatrixMatvecOutOfPlaceHost(alpha, A, x, beta, b, y); } return ierr; } /*-------------------------------------------------------------------------- * hypre_ParCSRMatrixMatvec * * Performs y <- alpha * A * x + beta * y *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ParCSRMatrixMatvec( HYPRE_Complex alpha, hypre_ParCSRMatrix *A, hypre_ParVector *x, HYPRE_Complex beta, hypre_ParVector *y ) { return hypre_ParCSRMatrixMatvecOutOfPlace(alpha, A, x, beta, y, y); } /*-------------------------------------------------------------------------- * hypre_ParCSRMatrixMatvecTHost *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ParCSRMatrixMatvecTHost( HYPRE_Complex alpha, hypre_ParCSRMatrix *A, hypre_ParVector *x, HYPRE_Complex beta, hypre_ParVector *y ) { hypre_ParCSRCommPkg *comm_pkg = hypre_ParCSRMatrixCommPkg(A); hypre_CSRMatrix *diag = hypre_ParCSRMatrixDiag(A); hypre_CSRMatrix *offd = hypre_ParCSRMatrixOffd(A); hypre_CSRMatrix *diagT = hypre_ParCSRMatrixDiagT(A); hypre_CSRMatrix *offdT = hypre_ParCSRMatrixOffdT(A); hypre_Vector *x_local = hypre_ParVectorLocalVector(x); hypre_Vector *y_local = hypre_ParVectorLocalVector(y); hypre_Vector *y_tmp; HYPRE_Int num_cols_offd = hypre_CSRMatrixNumCols(offd); HYPRE_BigInt num_rows = hypre_ParCSRMatrixGlobalNumRows(A); HYPRE_BigInt num_cols = hypre_ParCSRMatrixGlobalNumCols(A); HYPRE_BigInt x_size = hypre_ParVectorGlobalSize(x); HYPRE_BigInt y_size = hypre_ParVectorGlobalSize(y); HYPRE_Complex *y_tmp_data; HYPRE_Complex *y_buf_data; HYPRE_Complex *y_local_data = hypre_VectorData(y_local); HYPRE_Int idxstride = hypre_VectorIndexStride(y_local); HYPRE_Int num_vectors = hypre_VectorNumVectors(y_local); HYPRE_Int num_sends; HYPRE_Int num_recvs; HYPRE_Int i; HYPRE_Int ierr = 0; HYPRE_ANNOTATE_FUNC_BEGIN; /*--------------------------------------------------------------------- * Check for size compatibility. MatvecT returns ierr = 1 if * length of X doesn't equal the number of rows of A, * ierr = 2 if the length of Y doesn't equal the number of * columns of A, and ierr = 3 if both are true. * * Because temporary vectors are often used in MatvecT, none of * these conditions terminates processing, and the ierr flag * is informational only. *--------------------------------------------------------------------*/ if (num_rows != x_size) { ierr = 1; } if (num_cols != y_size) { ierr = 2; } if (num_rows != x_size && num_cols != y_size) { ierr = 3; } hypre_assert( hypre_VectorNumVectors(x_local) == num_vectors ); hypre_assert( hypre_VectorNumVectors(y_local) == num_vectors ); if (num_vectors == 1) { y_tmp = hypre_SeqVectorCreate(num_cols_offd); } else { hypre_assert(num_vectors > 1); y_tmp = hypre_SeqMultiVectorCreate(num_cols_offd, num_vectors); hypre_VectorMultiVecStorageMethod(y_tmp) = 1; } /*--------------------------------------------------------------------- * If there exists no CommPkg for A, a CommPkg is generated using * equally load balanced partitionings *--------------------------------------------------------------------*/ if (!comm_pkg) { hypre_MatvecCommPkgCreate(A); comm_pkg = hypre_ParCSRMatrixCommPkg(A); } /* Update send_map_starts, send_map_elmts, and recv_vec_starts for SpMV with multivecs */ hypre_ParCSRCommPkgUpdateVecStarts(comm_pkg, num_vectors, hypre_VectorVectorStride(hypre_ParVectorLocalVector(y)), hypre_VectorIndexStride(hypre_ParVectorLocalVector(y))); num_recvs = hypre_ParCSRCommPkgNumRecvs(comm_pkg); num_sends = hypre_ParCSRCommPkgNumSends(comm_pkg); hypre_assert( num_cols_offd * num_vectors == hypre_ParCSRCommPkgRecvVecStart(comm_pkg, num_recvs) ); hypre_assert( hypre_ParCSRCommPkgRecvVecStart(comm_pkg, 0) == 0 ); hypre_assert( hypre_ParCSRCommPkgSendMapStart(comm_pkg, 0) == 0 ); #ifdef HYPRE_PROFILE hypre_profile_times[HYPRE_TIMER_ID_PACK_UNPACK] -= hypre_MPI_Wtime(); #endif #if defined(HYPRE_USING_PERSISTENT_COMM) hypre_ParCSRPersistentCommHandle *persistent_comm_handle = hypre_ParCSRCommPkgGetPersistentCommHandle(2, comm_pkg); #else hypre_ParCSRCommHandle *comm_handle; #endif /*--------------------------------------------------------------------- * Allocate (during hypre_SeqVectorInitialize_v2) or retrieve * persistent send data buffer for y_tmp (if persistent is enabled). *--------------------------------------------------------------------*/ #if defined(HYPRE_USING_PERSISTENT_COMM) hypre_VectorData(y_tmp) = (HYPRE_Complex *) hypre_ParCSRCommHandleSendDataBuffer(persistent_comm_handle); hypre_SeqVectorSetDataOwner(y_tmp, 0); #endif hypre_SeqVectorInitialize_v2(y_tmp, HYPRE_MEMORY_HOST); y_tmp_data = hypre_VectorData(y_tmp); /*--------------------------------------------------------------------- * Allocate receive data buffer *--------------------------------------------------------------------*/ #if defined(HYPRE_USING_PERSISTENT_COMM) y_buf_data = (HYPRE_Complex *) hypre_ParCSRCommHandleRecvDataBuffer(persistent_comm_handle); #else y_buf_data = hypre_TAlloc(HYPRE_Complex, hypre_ParCSRCommPkgSendMapStart(comm_pkg, num_sends), HYPRE_MEMORY_HOST); #endif #ifdef HYPRE_PROFILE hypre_profile_times[HYPRE_TIMER_ID_PACK_UNPACK] += hypre_MPI_Wtime(); #endif /* Compute y_tmp = offd^T * x_local */ if (num_cols_offd) { if (offdT) { // offdT is optional. Used only if it's present hypre_CSRMatrixMatvec(alpha, offdT, x_local, 0.0, y_tmp); } else { hypre_CSRMatrixMatvecT(alpha, offd, x_local, 0.0, y_tmp); } } #ifdef HYPRE_PROFILE hypre_profile_times[HYPRE_TIMER_ID_HALO_EXCHANGE] -= hypre_MPI_Wtime(); #endif /* Non-blocking communication starts */ #if defined(HYPRE_USING_PERSISTENT_COMM) hypre_ParCSRPersistentCommHandleStart(persistent_comm_handle, HYPRE_MEMORY_HOST, y_tmp_data); #else comm_handle = hypre_ParCSRCommHandleCreate_v2(2, comm_pkg, HYPRE_MEMORY_HOST, y_tmp_data, HYPRE_MEMORY_HOST, y_buf_data ); #endif #ifdef HYPRE_PROFILE hypre_profile_times[HYPRE_TIMER_ID_HALO_EXCHANGE] += hypre_MPI_Wtime(); #endif /* Overlapped local computation. diagT is optional. Used only if it's present. */ if (diagT) { hypre_CSRMatrixMatvec(alpha, diagT, x_local, beta, y_local); } else { hypre_CSRMatrixMatvecT(alpha, diag, x_local, beta, y_local); } #ifdef HYPRE_PROFILE hypre_profile_times[HYPRE_TIMER_ID_HALO_EXCHANGE] -= hypre_MPI_Wtime(); #endif /* Non-blocking communication ends */ #if defined(HYPRE_USING_PERSISTENT_COMM) hypre_ParCSRPersistentCommHandleWait(persistent_comm_handle, HYPRE_MEMORY_HOST, y_buf_data); #else hypre_ParCSRCommHandleDestroy(comm_handle); #endif #ifdef HYPRE_PROFILE hypre_profile_times[HYPRE_TIMER_ID_HALO_EXCHANGE] += hypre_MPI_Wtime(); hypre_profile_times[HYPRE_TIMER_ID_PACK_UNPACK] -= hypre_MPI_Wtime(); #endif /* The assert is here because this code has been tested for column-wise vector storage only. */ hypre_assert(idxstride == 1); /* unpack recv data on host, TODO OMP? */ for (i = hypre_ParCSRCommPkgSendMapStart(comm_pkg, 0); i < hypre_ParCSRCommPkgSendMapStart(comm_pkg, num_sends); i ++) { y_local_data[hypre_ParCSRCommPkgSendMapElmt(comm_pkg, i)] += y_buf_data[i]; } /*--------------------------------------------------------------------- * Free memory *--------------------------------------------------------------------*/ hypre_SeqVectorDestroy(y_tmp); #if !defined(HYPRE_USING_PERSISTENT_COMM) hypre_TFree(y_buf_data, HYPRE_MEMORY_HOST); #endif HYPRE_ANNOTATE_FUNC_END; #ifdef HYPRE_PROFILE hypre_profile_times[HYPRE_TIMER_ID_PACK_UNPACK] += hypre_MPI_Wtime(); #endif return ierr; } /*-------------------------------------------------------------------------- * hypre_ParCSRMatrixMatvecT * * Performs y <- alpha * A^T * x + beta * y *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ParCSRMatrixMatvecT( HYPRE_Complex alpha, hypre_ParCSRMatrix *A, hypre_ParVector *x, HYPRE_Complex beta, hypre_ParVector *y ) { HYPRE_Int ierr = 0; #if defined(HYPRE_USING_GPU) HYPRE_ExecutionPolicy exec = hypre_GetExecPolicy2( hypre_ParCSRMatrixMemoryLocation(A), hypre_ParVectorMemoryLocation(x) ); if (exec == HYPRE_EXEC_DEVICE) { ierr = hypre_ParCSRMatrixMatvecTDevice(alpha, A, x, beta, y); } else #endif { ierr = hypre_ParCSRMatrixMatvecTHost(alpha, A, x, beta, y); } return ierr; } /*-------------------------------------------------------------------------- * hypre_ParCSRMatrixMatvec_FF *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ParCSRMatrixMatvec_FF( HYPRE_Complex alpha, hypre_ParCSRMatrix *A, hypre_ParVector *x, HYPRE_Complex beta, hypre_ParVector *y, HYPRE_Int *CF_marker, HYPRE_Int fpt ) { MPI_Comm comm = hypre_ParCSRMatrixComm(A); hypre_ParCSRCommHandle *comm_handle = NULL; hypre_ParCSRCommPkg *comm_pkg = hypre_ParCSRMatrixCommPkg(A); hypre_CSRMatrix *diag = hypre_ParCSRMatrixDiag(A); hypre_CSRMatrix *offd = hypre_ParCSRMatrixOffd(A); hypre_Vector *x_local = hypre_ParVectorLocalVector(x); hypre_Vector *y_local = hypre_ParVectorLocalVector(y); HYPRE_BigInt num_rows = hypre_ParCSRMatrixGlobalNumRows(A); HYPRE_BigInt num_cols = hypre_ParCSRMatrixGlobalNumCols(A); hypre_Vector *x_tmp = NULL; HYPRE_BigInt x_size = hypre_ParVectorGlobalSize(x); HYPRE_BigInt y_size = hypre_ParVectorGlobalSize(y); HYPRE_Int num_cols_offd = hypre_CSRMatrixNumCols(offd); HYPRE_Int ierr = 0; HYPRE_Int num_sends = 0, i, j, index, start, num_procs; HYPRE_Int *int_buf_data = NULL; HYPRE_Int *CF_marker_offd = NULL; HYPRE_Complex *x_tmp_data = NULL; HYPRE_Complex *x_buf_data = NULL; HYPRE_Complex *x_local_data = hypre_VectorData(x_local); /*--------------------------------------------------------------------- * Check for size compatibility. ParMatvec returns ierr = 11 if * length of X doesn't equal the number of columns of A, * ierr = 12 if the length of Y doesn't equal the number of rows * of A, and ierr = 13 if both are true. * * Because temporary vectors are often used in ParMatvec, none of * these conditions terminates processing, and the ierr flag * is informational only. *--------------------------------------------------------------------*/ hypre_MPI_Comm_size(comm, &num_procs); if (num_cols != x_size) { ierr = 11; } if (num_rows != y_size) { ierr = 12; } if (num_cols != x_size && num_rows != y_size) { ierr = 13; } if (num_procs > 1) { if (num_cols_offd) { x_tmp = hypre_SeqVectorCreate( num_cols_offd ); hypre_SeqVectorInitialize(x_tmp); x_tmp_data = hypre_VectorData(x_tmp); } /*--------------------------------------------------------------------- * If there exists no CommPkg for A, a CommPkg is generated using * equally load balanced partitionings *--------------------------------------------------------------------*/ if (!comm_pkg) { hypre_MatvecCommPkgCreate(A); comm_pkg = hypre_ParCSRMatrixCommPkg(A); } num_sends = hypre_ParCSRCommPkgNumSends(comm_pkg); if (num_sends) x_buf_data = hypre_CTAlloc(HYPRE_Complex, hypre_ParCSRCommPkgSendMapStart (comm_pkg, num_sends), HYPRE_MEMORY_HOST); index = 0; for (i = 0; i < num_sends; i++) { start = hypre_ParCSRCommPkgSendMapStart(comm_pkg, i); for (j = start; j < hypre_ParCSRCommPkgSendMapStart(comm_pkg, i + 1); j++) x_buf_data[index++] = x_local_data[hypre_ParCSRCommPkgSendMapElmt(comm_pkg, j)]; } comm_handle = hypre_ParCSRCommHandleCreate ( 1, comm_pkg, x_buf_data, x_tmp_data ); } hypre_CSRMatrixMatvec_FF( alpha, diag, x_local, beta, y_local, CF_marker, CF_marker, fpt); if (num_procs > 1) { hypre_ParCSRCommHandleDestroy(comm_handle); comm_handle = NULL; if (num_sends) int_buf_data = hypre_CTAlloc(HYPRE_Int, hypre_ParCSRCommPkgSendMapStart (comm_pkg, num_sends), HYPRE_MEMORY_HOST); if (num_cols_offd) { CF_marker_offd = hypre_CTAlloc(HYPRE_Int, num_cols_offd, HYPRE_MEMORY_HOST); } index = 0; for (i = 0; i < num_sends; i++) { start = hypre_ParCSRCommPkgSendMapStart(comm_pkg, i); for (j = start; j < hypre_ParCSRCommPkgSendMapStart(comm_pkg, i + 1); j++) int_buf_data[index++] = CF_marker[hypre_ParCSRCommPkgSendMapElmt(comm_pkg, j)]; } comm_handle = hypre_ParCSRCommHandleCreate(11, comm_pkg, int_buf_data, CF_marker_offd ); hypre_ParCSRCommHandleDestroy(comm_handle); comm_handle = NULL; if (num_cols_offd) hypre_CSRMatrixMatvec_FF(alpha, offd, x_tmp, 1.0, y_local, CF_marker, CF_marker_offd, fpt); hypre_SeqVectorDestroy(x_tmp); x_tmp = NULL; hypre_TFree(x_buf_data, HYPRE_MEMORY_HOST); hypre_TFree(int_buf_data, HYPRE_MEMORY_HOST); hypre_TFree(CF_marker_offd, HYPRE_MEMORY_HOST); } return ierr; } hypre-2.33.0/src/parcsr_mv/par_csr_matvec_device.c000066400000000000000000000532051477326011500221770ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * Matvec functions for hypre_CSRMatrix class. * *****************************************************************************/ #include "_hypre_onedpl.hpp" #include "_hypre_parcsr_mv.h" #include "_hypre_utilities.hpp" #if defined(HYPRE_USING_GPU) /*-------------------------------------------------------------------------- * hypre_ParCSRMatrixMatvecOutOfPlaceDevice *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ParCSRMatrixMatvecOutOfPlaceDevice( HYPRE_Complex alpha, hypre_ParCSRMatrix *A, hypre_ParVector *x, HYPRE_Complex beta, hypre_ParVector *b, hypre_ParVector *y ) { hypre_GpuProfilingPushRange("Matvec"); hypre_ParCSRCommPkg *comm_pkg = hypre_ParCSRMatrixCommPkg(A); hypre_ParCSRCommHandle *comm_handle; HYPRE_Int *d_send_map_elmts; HYPRE_Int send_map_num_elmts; hypre_CSRMatrix *diag = hypre_ParCSRMatrixDiag(A); hypre_CSRMatrix *offd = hypre_ParCSRMatrixOffd(A); hypre_Vector *x_local = hypre_ParVectorLocalVector(x); hypre_Vector *b_local = hypre_ParVectorLocalVector(b); hypre_Vector *y_local = hypre_ParVectorLocalVector(y); hypre_Vector *x_tmp; HYPRE_BigInt num_rows = hypre_ParCSRMatrixGlobalNumRows(A); HYPRE_BigInt num_cols = hypre_ParCSRMatrixGlobalNumCols(A); HYPRE_BigInt x_size = hypre_ParVectorGlobalSize(x); HYPRE_BigInt b_size = hypre_ParVectorGlobalSize(b); HYPRE_BigInt y_size = hypre_ParVectorGlobalSize(y); HYPRE_Int num_cols_offd = hypre_CSRMatrixNumCols(offd); HYPRE_Int num_recvs, num_sends; HYPRE_Int ierr = 0; HYPRE_Int idxstride = hypre_VectorIndexStride(x_local); HYPRE_Int num_vectors = hypre_VectorNumVectors(x_local); HYPRE_Complex *x_local_data = hypre_VectorData(x_local); HYPRE_Complex *x_tmp_data; HYPRE_Complex *x_buf_data; HYPRE_Int sync_stream; HYPRE_ANNOTATE_FUNC_BEGIN; hypre_GetSyncCudaCompute(&sync_stream); hypre_SetSyncCudaCompute(0); /*--------------------------------------------------------------------- * Check for size compatibility. ParMatvec returns ierr = 11 if * length of X doesn't equal the number of columns of A, * ierr = 12 if the length of Y doesn't equal the number of rows * of A, and ierr = 13 if both are true. * * Because temporary vectors are often used in ParMatvec, none of * these conditions terminates processing, and the ierr flag * is informational only. *--------------------------------------------------------------------*/ hypre_assert( idxstride > 0 ); if (num_cols != x_size) { ierr = 11; } if (num_rows != y_size || num_rows != b_size) { ierr = 12; } if (num_cols != x_size && (num_rows != y_size || num_rows != b_size)) { ierr = 13; } hypre_assert( hypre_VectorNumVectors(b_local) == num_vectors ); hypre_assert( hypre_VectorNumVectors(y_local) == num_vectors ); if (num_vectors == 1) { x_tmp = hypre_SeqVectorCreate(num_cols_offd); } else { hypre_assert(num_vectors > 1); x_tmp = hypre_SeqMultiVectorCreate(num_cols_offd, num_vectors); hypre_VectorMultiVecStorageMethod(x_tmp) = 1; } /*--------------------------------------------------------------------- * If there exists no CommPkg for A, a CommPkg is generated using * equally load balanced partitionings *--------------------------------------------------------------------*/ if (!comm_pkg) { hypre_MatvecCommPkgCreate(A); comm_pkg = hypre_ParCSRMatrixCommPkg(A); } /* Update send_map_starts, send_map_elmts, and recv_vec_starts when doing sparse matrix/multivector product */ hypre_ParCSRCommPkgUpdateVecStarts(comm_pkg, num_vectors, hypre_VectorVectorStride(hypre_ParVectorLocalVector(x)), hypre_VectorIndexStride(hypre_ParVectorLocalVector(x))); /* Copy send_map_elmts to the device if not already there */ hypre_ParCSRCommPkgCopySendMapElmtsToDevice(comm_pkg); /* Get information from the communication package*/ num_recvs = hypre_ParCSRCommPkgNumRecvs(comm_pkg); num_sends = hypre_ParCSRCommPkgNumSends(comm_pkg); d_send_map_elmts = hypre_ParCSRCommPkgDeviceSendMapElmts(comm_pkg); send_map_num_elmts = hypre_ParCSRCommPkgSendMapStart(comm_pkg, num_sends); /* Sanity checks */ hypre_assert( num_cols_offd * num_vectors == hypre_ParCSRCommPkgRecvVecStart(comm_pkg, num_recvs) ); hypre_assert( hypre_ParCSRCommPkgRecvVecStart(comm_pkg, 0) == 0 ); hypre_assert( hypre_ParCSRCommPkgSendMapStart(comm_pkg, 0) == 0 ); #ifdef HYPRE_PROFILE hypre_profile_times[HYPRE_TIMER_ID_PACK_UNPACK] -= hypre_MPI_Wtime(); #endif /*--------------------------------------------------------------------- * Allocate or reuse receive data buffer for x_tmp *--------------------------------------------------------------------*/ if (!hypre_ParCSRCommPkgTmpData(comm_pkg)) { hypre_ParCSRCommPkgTmpData(comm_pkg) = hypre_TAlloc(HYPRE_Complex, num_cols_offd * num_vectors, HYPRE_MEMORY_DEVICE); } hypre_VectorData(x_tmp) = x_tmp_data = hypre_ParCSRCommPkgTmpData(comm_pkg); hypre_SeqVectorSetDataOwner(x_tmp, 0); hypre_SeqVectorInitialize_v2(x_tmp, HYPRE_MEMORY_DEVICE); /*--------------------------------------------------------------------- * Allocate or reuse send data buffer *--------------------------------------------------------------------*/ if (!hypre_ParCSRCommPkgBufData(comm_pkg)) { hypre_ParCSRCommPkgBufData(comm_pkg) = hypre_TAlloc(HYPRE_Complex, send_map_num_elmts, HYPRE_MEMORY_DEVICE); } x_buf_data = hypre_ParCSRCommPkgBufData(comm_pkg); /* The assert is because this code has been tested for column-wise vector storage only. */ hypre_assert(idxstride == 1); //hypre_SeqVectorPrefetch(x_local, HYPRE_MEMORY_DEVICE); /*--------------------------------------------------------------------- * Pack send data *--------------------------------------------------------------------*/ #if defined(HYPRE_USING_DEVICE_OPENMP) HYPRE_Int i; #pragma omp target teams distribute parallel for private(i) is_device_ptr(x_buf_data, x_local_data, d_send_map_elmts) for (i = 0; i < send_map_num_elmts; i++) { x_buf_data[i] = x_local_data[d_send_map_elmts[i]]; } #else #if defined(HYPRE_USING_SYCL) auto permuted_source = oneapi::dpl::make_permutation_iterator(x_local_data, d_send_map_elmts); HYPRE_ONEDPL_CALL( std::copy, permuted_source, permuted_source + send_map_num_elmts, x_buf_data ); #else HYPRE_THRUST_CALL( gather, d_send_map_elmts, d_send_map_elmts + send_map_num_elmts, x_local_data, x_buf_data ); #endif #endif #ifdef HYPRE_PROFILE hypre_profile_times[HYPRE_TIMER_ID_PACK_UNPACK] += hypre_MPI_Wtime(); #endif #if defined(HYPRE_USING_THRUST_NOSYNC) /* RL: make sure x_buf_data is ready before issuing GPU-GPU MPI */ if (hypre_GetGpuAwareMPI()) { hypre_ForceSyncComputeStream(); } #endif /* when using GPUs, start local matvec first in order to overlap with communication */ hypre_CSRMatrixMatvecOutOfPlace(alpha, diag, x_local, beta, b_local, y_local, 0); #ifdef HYPRE_PROFILE hypre_profile_times[HYPRE_TIMER_ID_HALO_EXCHANGE] -= hypre_MPI_Wtime(); #endif /* Non-blocking communication starts */ comm_handle = hypre_ParCSRCommHandleCreate_v2(1, comm_pkg, HYPRE_MEMORY_DEVICE, x_buf_data, HYPRE_MEMORY_DEVICE, x_tmp_data); /* Non-blocking communication ends */ hypre_ParCSRCommHandleDestroy(comm_handle); #ifdef HYPRE_PROFILE hypre_profile_times[HYPRE_TIMER_ID_HALO_EXCHANGE] += hypre_MPI_Wtime(); #endif /* computation offd part */ if (num_cols_offd) { hypre_CSRMatrixMatvec(alpha, offd, x_tmp, 1.0, y_local); } #ifdef HYPRE_PROFILE hypre_profile_times[HYPRE_TIMER_ID_PACK_UNPACK] -= hypre_MPI_Wtime(); #endif /*--------------------------------------------------------------------- * Free memory *--------------------------------------------------------------------*/ hypre_SeqVectorDestroy(x_tmp); /*--------------------------------------------------------------------- * Synchronize calls *--------------------------------------------------------------------*/ hypre_SetSyncCudaCompute(sync_stream); hypre_SyncComputeStream(); /*--------------------------------------------------------------------- * Performance profiling *--------------------------------------------------------------------*/ #ifdef HYPRE_PROFILE hypre_profile_times[HYPRE_TIMER_ID_PACK_UNPACK] += hypre_MPI_Wtime(); #endif HYPRE_ANNOTATE_FUNC_END; hypre_GpuProfilingPopRange(); return ierr; } /*-------------------------------------------------------------------------- * hypre_ParCSRMatrixMatvecTDevice *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ParCSRMatrixMatvecTDevice( HYPRE_Complex alpha, hypre_ParCSRMatrix *A, hypre_ParVector *x, HYPRE_Complex beta, hypre_ParVector *y ) { hypre_GpuProfilingPushRange("MatvecT"); hypre_ParCSRCommPkg *comm_pkg = hypre_ParCSRMatrixCommPkg(A); hypre_ParCSRCommHandle *comm_handle; HYPRE_Int send_map_num_elmts; hypre_CSRMatrix *diag = hypre_ParCSRMatrixDiag(A); hypre_CSRMatrix *offd = hypre_ParCSRMatrixOffd(A); hypre_CSRMatrix *diagT = hypre_ParCSRMatrixDiagT(A); hypre_CSRMatrix *offdT = hypre_ParCSRMatrixOffdT(A); hypre_Vector *x_local = hypre_ParVectorLocalVector(x); hypre_Vector *y_local = hypre_ParVectorLocalVector(y); hypre_Vector *y_tmp; HYPRE_Int num_cols_diag = hypre_CSRMatrixNumCols(diag); HYPRE_Int num_cols_offd = hypre_CSRMatrixNumCols(offd); HYPRE_BigInt num_rows = hypre_ParCSRMatrixGlobalNumRows(A); HYPRE_BigInt num_cols = hypre_ParCSRMatrixGlobalNumCols(A); HYPRE_BigInt x_size = hypre_ParVectorGlobalSize(x); HYPRE_BigInt y_size = hypre_ParVectorGlobalSize(y); HYPRE_Complex *y_tmp_data; HYPRE_Complex *y_buf_data; HYPRE_Complex *y_local_data = hypre_VectorData(y_local); HYPRE_Int idxstride = hypre_VectorIndexStride(y_local); HYPRE_Int num_vectors = hypre_VectorNumVectors(y_local); HYPRE_Int num_sends; HYPRE_Int num_recvs; HYPRE_Int ierr = 0; HYPRE_Int sync_stream; HYPRE_ANNOTATE_FUNC_BEGIN; hypre_GetSyncCudaCompute(&sync_stream); hypre_SetSyncCudaCompute(0); /*--------------------------------------------------------------------- * Check for size compatibility. MatvecT returns ierr = 1 if * length of X doesn't equal the number of rows of A, * ierr = 2 if the length of Y doesn't equal the number of * columns of A, and ierr = 3 if both are true. * * Because temporary vectors are often used in MatvecT, none of * these conditions terminates processing, and the ierr flag * is informational only. *--------------------------------------------------------------------*/ if (num_rows != x_size) { ierr = 1; } if (num_cols != y_size) { ierr = 2; } if (num_rows != x_size && num_cols != y_size) { ierr = 3; } hypre_assert( hypre_VectorNumVectors(x_local) == num_vectors ); hypre_assert( hypre_VectorNumVectors(y_local) == num_vectors ); if (num_vectors == 1) { y_tmp = hypre_SeqVectorCreate(num_cols_offd); } else { hypre_assert(num_vectors > 1); y_tmp = hypre_SeqMultiVectorCreate(num_cols_offd, num_vectors); hypre_VectorMultiVecStorageMethod(y_tmp) = 1; } /*--------------------------------------------------------------------- * If there exists no CommPkg for A, a CommPkg is generated using * equally load balanced partitionings *--------------------------------------------------------------------*/ if (!comm_pkg) { hypre_MatvecCommPkgCreate(A); comm_pkg = hypre_ParCSRMatrixCommPkg(A); } /* Update send_map_starts, send_map_elmts, and recv_vec_starts for SpMV with multivecs */ hypre_ParCSRCommPkgUpdateVecStarts(comm_pkg, num_vectors, hypre_VectorVectorStride(hypre_ParVectorLocalVector(y)), hypre_VectorIndexStride(hypre_ParVectorLocalVector(y))); /* Update send_map_elmts on device */ hypre_ParCSRCommPkgCopySendMapElmtsToDevice(comm_pkg); /* Get information from the communication package*/ num_recvs = hypre_ParCSRCommPkgNumRecvs(comm_pkg); num_sends = hypre_ParCSRCommPkgNumSends(comm_pkg); send_map_num_elmts = hypre_ParCSRCommPkgSendMapStart(comm_pkg, num_sends); /* Sanity checks */ hypre_assert( num_cols_offd * num_vectors == hypre_ParCSRCommPkgRecvVecStart(comm_pkg, num_recvs) ); hypre_assert( hypre_ParCSRCommPkgRecvVecStart(comm_pkg, 0) == 0 ); hypre_assert( hypre_ParCSRCommPkgSendMapStart(comm_pkg, 0) == 0 ); #ifdef HYPRE_PROFILE hypre_profile_times[HYPRE_TIMER_ID_PACK_UNPACK] -= hypre_MPI_Wtime(); #endif /*--------------------------------------------------------------------- * Allocate or reuse send data buffer for y_tmp *--------------------------------------------------------------------*/ if (!hypre_ParCSRCommPkgTmpData(comm_pkg)) { hypre_ParCSRCommPkgTmpData(comm_pkg) = hypre_TAlloc(HYPRE_Complex, num_cols_offd * num_vectors, HYPRE_MEMORY_DEVICE); } hypre_VectorData(y_tmp) = y_tmp_data = hypre_ParCSRCommPkgTmpData(comm_pkg); hypre_SeqVectorSetDataOwner(y_tmp, 0); hypre_SeqVectorInitialize_v2(y_tmp, HYPRE_MEMORY_DEVICE); /*--------------------------------------------------------------------- * Allocate receive data buffer *--------------------------------------------------------------------*/ if (!hypre_ParCSRCommPkgBufData(comm_pkg)) { hypre_ParCSRCommPkgBufData(comm_pkg) = hypre_TAlloc(HYPRE_Complex, send_map_num_elmts, HYPRE_MEMORY_DEVICE); } y_buf_data = hypre_ParCSRCommPkgBufData(comm_pkg); #ifdef HYPRE_PROFILE hypre_profile_times[HYPRE_TIMER_ID_PACK_UNPACK] += hypre_MPI_Wtime(); #endif /* Compute y_tmp = offd^T * x_local */ if (num_cols_offd) { if (offdT) { // offdT is optional. Used only if it's present hypre_CSRMatrixMatvec(alpha, offdT, x_local, 0.0, y_tmp); } else { hypre_CSRMatrixMatvecT(alpha, offd, x_local, 0.0, y_tmp); } } /* RL: make sure y_tmp is ready before issuing GPU-GPU MPI */ if (hypre_GetGpuAwareMPI()) { hypre_ForceSyncComputeStream(); } /* when using GPUs, start local matvec first in order to overlap with communication */ if (diagT) { // diagT is optional. Used only if it's present. hypre_CSRMatrixMatvec(alpha, diagT, x_local, beta, y_local); } else { hypre_CSRMatrixMatvecT(alpha, diag, x_local, beta, y_local); } #ifdef HYPRE_PROFILE hypre_profile_times[HYPRE_TIMER_ID_HALO_EXCHANGE] -= hypre_MPI_Wtime(); #endif /* Non-blocking communication starts */ comm_handle = hypre_ParCSRCommHandleCreate_v2(2, comm_pkg, HYPRE_MEMORY_DEVICE, y_tmp_data, HYPRE_MEMORY_DEVICE, y_buf_data ); /* Non-blocking communication ends */ hypre_ParCSRCommHandleDestroy(comm_handle); #ifdef HYPRE_PROFILE hypre_profile_times[HYPRE_TIMER_ID_HALO_EXCHANGE] += hypre_MPI_Wtime(); hypre_profile_times[HYPRE_TIMER_ID_PACK_UNPACK] -= hypre_MPI_Wtime(); #endif /* The assert is here because this code has been tested for column-wise vector storage only. */ hypre_assert( idxstride == 1 ); /*--------------------------------------------------------------------- * Unpack receive data *--------------------------------------------------------------------*/ #if defined(HYPRE_USING_DEVICE_OPENMP) HYPRE_Int *d_send_map_elmts = hypre_ParCSRCommPkgDeviceSendMapElmts(comm_pkg); HYPRE_Int i, j; for (i = 0; i < num_sends; i++) { HYPRE_Int start = hypre_ParCSRCommPkgSendMapStart(comm_pkg, i); HYPRE_Int end = hypre_ParCSRCommPkgSendMapStart(comm_pkg, i + 1); #pragma omp target teams distribute parallel for private(j) is_device_ptr(y_buf_data, y_local_data, d_send_map_elmts) for (j = start; j < end; j++) { y_local_data[d_send_map_elmts[j]] += y_buf_data[j]; } } #else /* Use SpMV to unpack data */ hypre_ParCSRMatrixMatvecT_unpack(comm_pkg, num_cols_diag, y_buf_data, y_local_data); #endif /*--------------------------------------------------------------------- * Free memory *--------------------------------------------------------------------*/ hypre_SeqVectorDestroy(y_tmp); /*--------------------------------------------------------------------- * Synchronize when using GPUs *--------------------------------------------------------------------*/ #if defined(HYPRE_USING_GPU) hypre_SetSyncCudaCompute(sync_stream); hypre_SyncComputeStream(); #endif /*--------------------------------------------------------------------- * Performance profiling *--------------------------------------------------------------------*/ #ifdef HYPRE_PROFILE hypre_profile_times[HYPRE_TIMER_ID_PACK_UNPACK] += hypre_MPI_Wtime(); #endif HYPRE_ANNOTATE_FUNC_END; hypre_GpuProfilingPopRange(); return ierr; } /*-------------------------------------------------------------------------- * hypre_ParCSRMatrixMatvecT_unpack * * Computes on the device: * * local_data[send_map_elmts] += recv_data * * with hypre's internal SpMV. *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ParCSRMatrixMatvecT_unpack( hypre_ParCSRCommPkg *comm_pkg, HYPRE_Int num_cols, HYPRE_Complex *recv_data, HYPRE_Complex *local_data ) { /* Input variables */ hypre_CSRMatrix *matrix_E = hypre_ParCSRCommPkgMatrixE(comm_pkg); HYPRE_Int num_sends = hypre_ParCSRCommPkgNumSends(comm_pkg); HYPRE_Int num_elements = hypre_ParCSRCommPkgSendMapStart(comm_pkg, num_sends); HYPRE_Int num_components = hypre_ParCSRCommPkgNumComponents(comm_pkg); /* Local variables */ hypre_Vector vec_x; hypre_Vector vec_y; HYPRE_Int trans = 0; HYPRE_Int fill = 0; HYPRE_Complex alpha = 1.0; HYPRE_Complex beta = 1.0; if (num_elements == 0) { return hypre_error_flag; } /* Create matrix E if it not exists */ if (!matrix_E) { hypre_ParCSRCommPkgCreateMatrixE(comm_pkg, num_cols); matrix_E = hypre_ParCSRCommPkgMatrixE(comm_pkg); } /* Set vector x */ hypre_VectorData(&vec_x) = recv_data; hypre_VectorOwnsData(&vec_x) = 0; hypre_VectorSize(&vec_x) = num_elements / num_components; hypre_VectorVectorStride(&vec_x) = 1; hypre_VectorIndexStride(&vec_x) = num_components; hypre_VectorNumVectors(&vec_x) = num_components; hypre_VectorMultiVecStorageMethod(&vec_x) = 1; /* Set vector y */ hypre_VectorData(&vec_y) = local_data; hypre_VectorOwnsData(&vec_y) = 0; hypre_VectorSize(&vec_y) = num_cols; hypre_VectorVectorStride(&vec_y) = num_cols; hypre_VectorIndexStride(&vec_y) = 1; hypre_VectorNumVectors(&vec_y) = num_components; hypre_VectorMultiVecStorageMethod(&vec_y) = 0; /* Compute y += E*x */ hypre_CSRMatrixSpMVDevice(trans, alpha, matrix_E, &vec_x, beta, &vec_y, fill); return hypre_error_flag; } #endif /* #if defined(HYPRE_USING_GPU) */ hypre-2.33.0/src/parcsr_mv/par_csr_triplemat.c000066400000000000000000001050501477326011500213760ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "_hypre_parcsr_mv.h" #include "_hypre_utilities.h" #include "../parcsr_mv/_hypre_parcsr_mv.h" /*-------------------------------------------------------------------------- * hypre_ParCSRMatMatHost * * Host implementation of hypre_ParCSRMatMat (C = A * B) *--------------------------------------------------------------------------*/ hypre_ParCSRMatrix* hypre_ParCSRMatMatHost( hypre_ParCSRMatrix *A, hypre_ParCSRMatrix *B ) { MPI_Comm comm = hypre_ParCSRMatrixComm(A); hypre_CSRMatrix *A_diag = hypre_ParCSRMatrixDiag(A); hypre_CSRMatrix *A_offd = hypre_ParCSRMatrixOffd(A); HYPRE_BigInt *row_starts_A = hypre_ParCSRMatrixRowStarts(A); HYPRE_Int num_cols_diag_A = hypre_CSRMatrixNumCols(A_diag); HYPRE_Int num_rows_diag_A = hypre_CSRMatrixNumRows(A_diag); hypre_CSRMatrix *B_diag = hypre_ParCSRMatrixDiag(B); hypre_CSRMatrix *B_offd = hypre_ParCSRMatrixOffd(B); HYPRE_BigInt *col_map_offd_B = hypre_ParCSRMatrixColMapOffd(B); HYPRE_BigInt first_col_diag_B = hypre_ParCSRMatrixFirstColDiag(B); HYPRE_BigInt last_col_diag_B; HYPRE_BigInt *col_starts_B = hypre_ParCSRMatrixColStarts(B); HYPRE_Int num_rows_diag_B = hypre_CSRMatrixNumRows(B_diag); HYPRE_Int num_cols_diag_B = hypre_CSRMatrixNumCols(B_diag); HYPRE_Int num_cols_offd_B = hypre_CSRMatrixNumCols(B_offd); hypre_ParCSRMatrix *C; HYPRE_BigInt *col_map_offd_C = NULL; HYPRE_Int *map_B_to_C = NULL; hypre_CSRMatrix *C_diag = NULL; hypre_CSRMatrix *C_offd = NULL; HYPRE_Int num_cols_offd_C = 0; hypre_CSRMatrix *Bs_ext; hypre_CSRMatrix *Bext_diag; hypre_CSRMatrix *Bext_offd; hypre_CSRMatrix *AB_diag; hypre_CSRMatrix *AB_offd; HYPRE_Int AB_offd_num_nonzeros; HYPRE_Int *AB_offd_j; hypre_CSRMatrix *ABext_diag; hypre_CSRMatrix *ABext_offd; HYPRE_BigInt n_rows_A, n_cols_A; HYPRE_BigInt n_rows_B, n_cols_B; HYPRE_Int cnt, i; HYPRE_Int num_procs; HYPRE_Int my_id; n_rows_A = hypre_ParCSRMatrixGlobalNumRows(A); n_cols_A = hypre_ParCSRMatrixGlobalNumCols(A); n_rows_B = hypre_ParCSRMatrixGlobalNumRows(B); n_cols_B = hypre_ParCSRMatrixGlobalNumCols(B); if (n_cols_A != n_rows_B || num_cols_diag_A != num_rows_diag_B) { hypre_error_in_arg(1); hypre_printf(" Error! Incompatible matrix dimensions!\n"); return NULL; } /*----------------------------------------------------------------------- * Extract B_ext, i.e. portion of B that is stored on neighbor procs * and needed locally for matrix matrix product *-----------------------------------------------------------------------*/ hypre_MPI_Comm_size(comm, &num_procs); hypre_MPI_Comm_rank(comm, &my_id); last_col_diag_B = first_col_diag_B + num_cols_diag_B - 1; if (num_procs > 1) { /*--------------------------------------------------------------------- * If there exists no CommPkg for A, a CommPkg is generated using * equally load balanced partitionings within * hypre_ParCSRMatrixExtractBExt *--------------------------------------------------------------------*/ Bs_ext = hypre_ParCSRMatrixExtractBExt(B, A, 1); /* contains communication which should be explicitly included to allow for overlap */ hypre_CSRMatrixSplit(Bs_ext, first_col_diag_B, last_col_diag_B, num_cols_offd_B, col_map_offd_B, &num_cols_offd_C, &col_map_offd_C, &Bext_diag, &Bext_offd); hypre_CSRMatrixDestroy(Bs_ext); /* These are local and could be overlapped with communication */ AB_diag = hypre_CSRMatrixMultiplyHost(A_diag, B_diag); AB_offd = hypre_CSRMatrixMultiplyHost(A_diag, B_offd); /* These require data from other processes */ ABext_diag = hypre_CSRMatrixMultiplyHost(A_offd, Bext_diag); ABext_offd = hypre_CSRMatrixMultiplyHost(A_offd, Bext_offd); hypre_CSRMatrixDestroy(Bext_diag); hypre_CSRMatrixDestroy(Bext_offd); if (num_cols_offd_B) { map_B_to_C = hypre_CTAlloc(HYPRE_Int, num_cols_offd_B, HYPRE_MEMORY_HOST); cnt = 0; for (i = 0; i < num_cols_offd_C; i++) { if (col_map_offd_C[i] == col_map_offd_B[cnt]) { map_B_to_C[cnt++] = i; if (cnt == num_cols_offd_B) { break; } } } } AB_offd_num_nonzeros = hypre_CSRMatrixNumNonzeros(AB_offd); AB_offd_j = hypre_CSRMatrixJ(AB_offd); for (i = 0; i < AB_offd_num_nonzeros; i++) { AB_offd_j[i] = map_B_to_C[AB_offd_j[i]]; } if (num_cols_offd_B) { hypre_TFree(map_B_to_C, HYPRE_MEMORY_HOST); } hypre_CSRMatrixNumCols(AB_diag) = num_cols_diag_B; hypre_CSRMatrixNumCols(ABext_diag) = num_cols_diag_B; hypre_CSRMatrixNumCols(AB_offd) = num_cols_offd_C; hypre_CSRMatrixNumCols(ABext_offd) = num_cols_offd_C; C_diag = hypre_CSRMatrixAdd(1.0, AB_diag, 1.0, ABext_diag); C_offd = hypre_CSRMatrixAdd(1.0, AB_offd, 1.0, ABext_offd); hypre_CSRMatrixDestroy(AB_diag); hypre_CSRMatrixDestroy(ABext_diag); hypre_CSRMatrixDestroy(AB_offd); hypre_CSRMatrixDestroy(ABext_offd); } else { C_diag = hypre_CSRMatrixMultiplyHost(A_diag, B_diag); C_offd = hypre_CSRMatrixCreate(num_rows_diag_A, 0, 0); hypre_CSRMatrixInitialize_v2(C_offd, 0, hypre_CSRMatrixMemoryLocation(C_diag)); } /*----------------------------------------------------------------------- * Allocate C_diag_data and C_diag_j arrays. * Allocate C_offd_data and C_offd_j arrays. *-----------------------------------------------------------------------*/ C = hypre_ParCSRMatrixCreate(comm, n_rows_A, n_cols_B, row_starts_A, col_starts_B, num_cols_offd_C, C_diag->num_nonzeros, C_offd->num_nonzeros); hypre_CSRMatrixDestroy(hypre_ParCSRMatrixDiag(C)); hypre_ParCSRMatrixDiag(C) = C_diag; hypre_CSRMatrixDestroy(hypre_ParCSRMatrixOffd(C)); hypre_ParCSRMatrixOffd(C) = C_offd; if (num_cols_offd_C) { hypre_ParCSRMatrixColMapOffd(C) = col_map_offd_C; } return C; } /*-------------------------------------------------------------------------- * hypre_ParCSRMatMat * * Computes C = A*B *--------------------------------------------------------------------------*/ hypre_ParCSRMatrix* hypre_ParCSRMatMat( hypre_ParCSRMatrix *A, hypre_ParCSRMatrix *B ) { hypre_ParCSRMatrix *C = NULL; HYPRE_ANNOTATE_FUNC_BEGIN; hypre_GpuProfilingPushRange("Mat-Mat"); #if defined(HYPRE_USING_GPU) HYPRE_ExecutionPolicy exec = hypre_GetExecPolicy2( hypre_ParCSRMatrixMemoryLocation(A), hypre_ParCSRMatrixMemoryLocation(B) ); if (exec == HYPRE_EXEC_DEVICE) { C = hypre_ParCSRMatMatDevice(A, B); } else #endif { C = hypre_ParCSRMatMatHost(A, B); } hypre_GpuProfilingPopRange(); HYPRE_ANNOTATE_FUNC_END; return C; } /*-------------------------------------------------------------------------- * hypre_ParCSRTMatMatKTHost * * Host implementation of hypre_ParCSRTMatMatKT (C = A^T * B) *--------------------------------------------------------------------------*/ hypre_ParCSRMatrix* hypre_ParCSRTMatMatKTHost( hypre_ParCSRMatrix *A, hypre_ParCSRMatrix *B, HYPRE_Int keep_transpose) { MPI_Comm comm = hypre_ParCSRMatrixComm(A); hypre_ParCSRCommPkg *comm_pkg_A = NULL; hypre_CSRMatrix *A_diag = hypre_ParCSRMatrixDiag(A); hypre_CSRMatrix *A_offd = hypre_ParCSRMatrixOffd(A); hypre_CSRMatrix *B_diag = hypre_ParCSRMatrixDiag(B); hypre_CSRMatrix *B_offd = hypre_ParCSRMatrixOffd(B); hypre_CSRMatrix *AT_diag; hypre_CSRMatrix *AT_offd; HYPRE_Int num_rows_diag_A = hypre_CSRMatrixNumRows(A_diag); HYPRE_Int num_cols_diag_A = hypre_CSRMatrixNumCols(A_diag); HYPRE_Int num_rows_diag_B = hypre_CSRMatrixNumRows(B_diag); HYPRE_Int num_cols_diag_B = hypre_CSRMatrixNumCols(B_diag); HYPRE_Int num_cols_offd_B = hypre_CSRMatrixNumCols(B_offd); HYPRE_BigInt first_col_diag_B = hypre_ParCSRMatrixFirstColDiag(B); HYPRE_BigInt *col_map_offd_B = hypre_ParCSRMatrixColMapOffd(B); HYPRE_BigInt *col_starts_A = hypre_ParCSRMatrixColStarts(A); HYPRE_BigInt *col_starts_B = hypre_ParCSRMatrixColStarts(B); hypre_ParCSRMatrix *C; hypre_CSRMatrix *C_diag = NULL; hypre_CSRMatrix *C_offd = NULL; HYPRE_BigInt *col_map_offd_C = NULL; HYPRE_Int *map_B_to_C; HYPRE_BigInt first_col_diag_C; HYPRE_BigInt last_col_diag_C; HYPRE_Int num_cols_offd_C = 0; HYPRE_BigInt n_rows_A, n_cols_A; HYPRE_BigInt n_rows_B, n_cols_B; HYPRE_Int j_indx, cnt; HYPRE_Int num_procs, my_id; n_rows_A = hypre_ParCSRMatrixGlobalNumRows(A); n_cols_A = hypre_ParCSRMatrixGlobalNumCols(A); n_rows_B = hypre_ParCSRMatrixGlobalNumRows(B); n_cols_B = hypre_ParCSRMatrixGlobalNumCols(B); hypre_MPI_Comm_size(comm, &num_procs); hypre_MPI_Comm_rank(comm, &my_id); if (n_rows_A != n_rows_B || num_rows_diag_A != num_rows_diag_B) { hypre_error_w_msg(HYPRE_ERROR_GENERIC, " Error! Incompatible matrix dimensions!\n"); return NULL; } /*if (num_cols_diag_A == num_cols_diag_B) allsquare = 1;*/ /* Compute AT_diag if necessary */ if (!hypre_ParCSRMatrixDiagT(A)) { hypre_CSRMatrixTranspose(A_diag, &AT_diag, 1); } else { AT_diag = hypre_ParCSRMatrixDiagT(A); } if (num_procs == 1) { C_diag = hypre_CSRMatrixMultiplyHost(AT_diag, B_diag); C_offd = hypre_CSRMatrixCreate(num_cols_diag_A, 0, 0); hypre_CSRMatrixInitialize_v2(C_offd, 0, hypre_CSRMatrixMemoryLocation(C_diag)); hypre_CSRMatrixNumRownnz(C_offd) = 0; } else { hypre_CSRMatrix *C_tmp_diag = NULL; hypre_CSRMatrix *C_tmp_offd = NULL; hypre_CSRMatrix *C_int = NULL; hypre_CSRMatrix *C_ext = NULL; hypre_CSRMatrix *C_ext_diag = NULL; hypre_CSRMatrix *C_ext_offd = NULL; hypre_CSRMatrix *C_int_diag = NULL; hypre_CSRMatrix *C_int_offd = NULL; HYPRE_Int i; HYPRE_Int *C_tmp_offd_i; HYPRE_Int *C_tmp_offd_j; HYPRE_Int *send_map_elmts_A; void *request; /* Compute AT_offd if necessary */ if (!hypre_ParCSRMatrixOffdT(A)) { hypre_CSRMatrixTranspose(A_offd, &AT_offd, 1); } else { AT_offd = hypre_ParCSRMatrixOffdT(A); } C_int_diag = hypre_CSRMatrixMultiplyHost(AT_offd, B_diag); C_int_offd = hypre_CSRMatrixMultiplyHost(AT_offd, B_offd); hypre_ParCSRMatrixDiag(B) = C_int_diag; hypre_ParCSRMatrixOffd(B) = C_int_offd; C_int = hypre_MergeDiagAndOffd(B); hypre_ParCSRMatrixDiag(B) = B_diag; hypre_ParCSRMatrixOffd(B) = B_offd; if (!hypre_ParCSRMatrixCommPkg(A)) { hypre_MatvecCommPkgCreate(A); } comm_pkg_A = hypre_ParCSRMatrixCommPkg(A); /* contains communication; should be explicitly included to allow for overlap */ hypre_ExchangeExternalRowsInit(C_int, comm_pkg_A, &request); C_ext = hypre_ExchangeExternalRowsWait(request); hypre_CSRMatrixDestroy(C_int); hypre_CSRMatrixDestroy(C_int_diag); hypre_CSRMatrixDestroy(C_int_offd); C_tmp_diag = hypre_CSRMatrixMultiplyHost(AT_diag, B_diag); C_tmp_offd = hypre_CSRMatrixMultiplyHost(AT_diag, B_offd); if (!hypre_ParCSRMatrixOffdT(A)) { if (keep_transpose) { hypre_ParCSRMatrixOffdT(A) = AT_offd; } else { hypre_CSRMatrixDestroy(AT_offd); } } /*----------------------------------------------------------------------- * Add contents of C_ext to C_tmp_diag and C_tmp_offd * to obtain C_diag and C_offd *-----------------------------------------------------------------------*/ /* split C_ext in local C_ext_diag and nonlocal part C_ext_offd, also generate new col_map_offd and adjust column indices accordingly */ first_col_diag_C = first_col_diag_B; last_col_diag_C = first_col_diag_B + num_cols_diag_B - 1; if (C_ext) { hypre_CSRMatrixSplit(C_ext, first_col_diag_C, last_col_diag_C, num_cols_offd_B, col_map_offd_B, &num_cols_offd_C, &col_map_offd_C, &C_ext_diag, &C_ext_offd); hypre_CSRMatrixDestroy(C_ext); C_ext = NULL; } C_tmp_offd_i = hypre_CSRMatrixI(C_tmp_offd); C_tmp_offd_j = hypre_CSRMatrixJ(C_tmp_offd); if (num_cols_offd_B) { map_B_to_C = hypre_CTAlloc(HYPRE_Int, num_cols_offd_B, HYPRE_MEMORY_HOST); cnt = 0; for (i = 0; i < num_cols_offd_C; i++) { if (col_map_offd_C[i] == col_map_offd_B[cnt]) { map_B_to_C[cnt++] = i; if (cnt == num_cols_offd_B) { break; } } } for (i = 0; i < C_tmp_offd_i[hypre_CSRMatrixNumRows(C_tmp_offd)]; i++) { j_indx = C_tmp_offd_j[i]; C_tmp_offd_j[i] = map_B_to_C[j_indx]; } hypre_TFree(map_B_to_C, HYPRE_MEMORY_HOST); } /*----------------------------------------------------------------------- * Need to compute C_diag = C_tmp_diag + C_ext_diag * and C_offd = C_tmp_offd + C_ext_offd !!!! *-----------------------------------------------------------------------*/ send_map_elmts_A = hypre_ParCSRCommPkgSendMapElmts(comm_pkg_A); C_diag = hypre_CSRMatrixAddPartial(C_tmp_diag, C_ext_diag, send_map_elmts_A); hypre_CSRMatrixNumCols(C_tmp_offd) = num_cols_offd_C; C_offd = hypre_CSRMatrixAddPartial(C_tmp_offd, C_ext_offd, send_map_elmts_A); hypre_CSRMatrixDestroy(C_tmp_diag); hypre_CSRMatrixDestroy(C_tmp_offd); hypre_CSRMatrixDestroy(C_ext_diag); hypre_CSRMatrixDestroy(C_ext_offd); } if (!hypre_ParCSRMatrixDiagT(A)) { if (keep_transpose) { hypre_ParCSRMatrixDiagT(A) = AT_diag; } else { hypre_CSRMatrixDestroy(AT_diag); } } C = hypre_ParCSRMatrixCreate(comm, n_cols_A, n_cols_B, col_starts_A, col_starts_B, num_cols_offd_C, C_diag->num_nonzeros, C_offd->num_nonzeros); hypre_CSRMatrixDestroy(hypre_ParCSRMatrixDiag(C)); hypre_ParCSRMatrixDiag(C) = C_diag; hypre_CSRMatrixDestroy(hypre_ParCSRMatrixOffd(C)); hypre_ParCSRMatrixOffd(C) = C_offd; hypre_ParCSRMatrixColMapOffd(C) = col_map_offd_C; return C; } /*-------------------------------------------------------------------------- * hypre_ParCSRTMatMatKT * * Multiplies two ParCSRMatrices transpose(A) and B and returns * the product in ParCSRMatrix C. * * If either AT_diag or AT_offd don't exist and the flag keep_transpose is * true, these local matrices are saved in the ParCSRMatrix A *--------------------------------------------------------------------------*/ hypre_ParCSRMatrix* hypre_ParCSRTMatMatKT( hypre_ParCSRMatrix *A, hypre_ParCSRMatrix *B, HYPRE_Int keep_transpose) { hypre_GpuProfilingPushRange("Mat-T-Mat"); hypre_ParCSRMatrix *C = NULL; #if defined(HYPRE_USING_GPU) HYPRE_ExecutionPolicy exec = hypre_GetExecPolicy2( hypre_ParCSRMatrixMemoryLocation(A), hypre_ParCSRMatrixMemoryLocation(B) ); if (exec == HYPRE_EXEC_DEVICE) { C = hypre_ParCSRTMatMatKTDevice(A, B, keep_transpose); } else #endif { C = hypre_ParCSRTMatMatKTHost(A, B, keep_transpose); } hypre_GpuProfilingPopRange(); return C; } /*-------------------------------------------------------------------------- * hypre_ParCSRTMatMat * * Computes "C = A^T * B" and discards the temporary local matrices generated * in the algorithm (keep_transpose = 0). *--------------------------------------------------------------------------*/ hypre_ParCSRMatrix* hypre_ParCSRTMatMat( hypre_ParCSRMatrix *A, hypre_ParCSRMatrix *B) { return hypre_ParCSRTMatMatKT(A, B, 0); } /*-------------------------------------------------------------------------- * hypre_ParCSRMatrixRAPKTHost * * Host implementation of hypre_ParCSRMatrixRAPKT *--------------------------------------------------------------------------*/ hypre_ParCSRMatrix* hypre_ParCSRMatrixRAPKTHost( hypre_ParCSRMatrix *R, hypre_ParCSRMatrix *A, hypre_ParCSRMatrix *P, HYPRE_Int keep_transpose ) { MPI_Comm comm = hypre_ParCSRMatrixComm(A); hypre_ParCSRCommPkg *comm_pkg_R = hypre_ParCSRMatrixCommPkg(R); HYPRE_BigInt n_rows_R = hypre_ParCSRMatrixGlobalNumRows(R); HYPRE_BigInt n_cols_R = hypre_ParCSRMatrixGlobalNumCols(R); hypre_CSRMatrix *R_diag = hypre_ParCSRMatrixDiag(R); hypre_CSRMatrix *RT_diag = hypre_ParCSRMatrixDiagT(R); hypre_CSRMatrix *R_offd = hypre_ParCSRMatrixOffd(R); hypre_CSRMatrix *RT_offd = hypre_ParCSRMatrixOffdT(R); HYPRE_Int num_rows_diag_R = hypre_CSRMatrixNumRows(R_diag); HYPRE_Int num_cols_diag_R = hypre_CSRMatrixNumCols(R_diag); HYPRE_Int num_cols_offd_R = hypre_CSRMatrixNumCols(R_offd); HYPRE_BigInt *col_starts_R = hypre_ParCSRMatrixColStarts(R); hypre_CSRMatrix *A_diag = hypre_ParCSRMatrixDiag(A); hypre_CSRMatrix *A_offd = hypre_ParCSRMatrixOffd(A); HYPRE_BigInt n_rows_A = hypre_ParCSRMatrixGlobalNumRows(A); HYPRE_BigInt n_cols_A = hypre_ParCSRMatrixGlobalNumCols(A); HYPRE_BigInt *row_starts_A = hypre_ParCSRMatrixRowStarts(A); HYPRE_Int num_rows_diag_A = hypre_CSRMatrixNumRows(A_diag); HYPRE_Int num_cols_diag_A = hypre_CSRMatrixNumCols(A_diag); HYPRE_Int num_cols_offd_A = hypre_CSRMatrixNumCols(A_offd); HYPRE_BigInt n_rows_P = hypre_ParCSRMatrixGlobalNumRows(P); HYPRE_BigInt n_cols_P = hypre_ParCSRMatrixGlobalNumCols(P); HYPRE_BigInt *col_map_offd_P = hypre_ParCSRMatrixColMapOffd(P); hypre_CSRMatrix *P_diag = hypre_ParCSRMatrixDiag(P); hypre_CSRMatrix *P_offd = hypre_ParCSRMatrixOffd(P); HYPRE_BigInt first_col_diag_P = hypre_ParCSRMatrixFirstColDiag(P); HYPRE_BigInt *col_starts_P = hypre_ParCSRMatrixColStarts(P); HYPRE_Int num_rows_diag_P = hypre_CSRMatrixNumRows(P_diag); HYPRE_Int num_cols_diag_P = hypre_CSRMatrixNumCols(P_diag); HYPRE_Int num_cols_offd_P = hypre_CSRMatrixNumCols(P_offd); hypre_ParCSRMatrix *Q; HYPRE_BigInt *col_map_offd_Q = NULL; HYPRE_Int *map_P_to_Q = NULL; hypre_CSRMatrix *Q_diag = NULL; hypre_CSRMatrix *Q_offd = NULL; HYPRE_Int num_cols_offd_Q = 0; hypre_CSRMatrix *Ps_ext; hypre_CSRMatrix *Pext_diag; hypre_CSRMatrix *Pext_offd; hypre_CSRMatrix *AP_diag; hypre_CSRMatrix *AP_offd; HYPRE_Int AP_offd_num_nonzeros; HYPRE_Int *AP_offd_j; hypre_CSRMatrix *APext_diag = NULL; hypre_CSRMatrix *APext_offd = NULL; hypre_ParCSRMatrix *C; HYPRE_BigInt *col_map_offd_C = NULL; HYPRE_Int *map_Q_to_C; hypre_CSRMatrix *C_diag = NULL; hypre_CSRMatrix *C_offd = NULL; HYPRE_BigInt first_col_diag_C; HYPRE_BigInt last_col_diag_C; HYPRE_Int num_cols_offd_C = 0; HYPRE_Int j_indx; HYPRE_Int num_procs, my_id; HYPRE_Int cnt, i; hypre_MPI_Comm_size(comm, &num_procs); hypre_MPI_Comm_rank(comm, &my_id); if ( n_rows_R != n_rows_A || num_rows_diag_R != num_rows_diag_A || n_cols_A != n_rows_P || num_cols_diag_A != num_rows_diag_P ) { hypre_error_w_msg(HYPRE_ERROR_GENERIC, " Error! Incompatible matrix dimensions!\n"); return NULL; } /* Compute RT_diag if necessary */ if (!hypre_ParCSRMatrixDiagT(R)) { hypre_CSRMatrixTranspose(R_diag, &RT_diag, 1); } else { RT_diag = hypre_ParCSRMatrixDiagT(R); } if (num_procs > 1) { HYPRE_BigInt last_col_diag_P; hypre_CSRMatrix *C_tmp_diag = NULL; hypre_CSRMatrix *C_tmp_offd = NULL; hypre_CSRMatrix *C_int = NULL; hypre_CSRMatrix *C_ext = NULL; hypre_CSRMatrix *C_ext_diag = NULL; hypre_CSRMatrix *C_ext_offd = NULL; hypre_CSRMatrix *C_int_diag = NULL; hypre_CSRMatrix *C_int_offd = NULL; HYPRE_Int *C_tmp_offd_i; HYPRE_Int *C_tmp_offd_j; HYPRE_Int *send_map_elmts_R; void *request; /*--------------------------------------------------------------------- * If there exists no CommPkg for A, a CommPkg is generated using * equally load balanced partitionings within * hypre_ParCSRMatrixExtractBExt *--------------------------------------------------------------------*/ Ps_ext = hypre_ParCSRMatrixExtractBExt(P, A, 1); /* contains communication which should be explicitly included to allow for overlap */ if (num_cols_offd_A) { last_col_diag_P = first_col_diag_P + num_cols_diag_P - 1; hypre_CSRMatrixSplit(Ps_ext, first_col_diag_P, last_col_diag_P, num_cols_offd_P, col_map_offd_P, &num_cols_offd_Q, &col_map_offd_Q, &Pext_diag, &Pext_offd); /* These require data from other processes */ APext_diag = hypre_CSRMatrixMultiplyHost(A_offd, Pext_diag); APext_offd = hypre_CSRMatrixMultiplyHost(A_offd, Pext_offd); hypre_CSRMatrixDestroy(Pext_diag); hypre_CSRMatrixDestroy(Pext_offd); } else { num_cols_offd_Q = num_cols_offd_P; col_map_offd_Q = hypre_CTAlloc(HYPRE_BigInt, num_cols_offd_Q, HYPRE_MEMORY_HOST); for (i = 0; i < num_cols_offd_P; i++) { col_map_offd_Q[i] = col_map_offd_P[i]; } } hypre_CSRMatrixDestroy(Ps_ext); /* These are local and could be overlapped with communication */ AP_diag = hypre_CSRMatrixMultiplyHost(A_diag, P_diag); if (num_cols_offd_P) { AP_offd = hypre_CSRMatrixMultiplyHost(A_diag, P_offd); if (num_cols_offd_Q > num_cols_offd_P) { map_P_to_Q = hypre_CTAlloc(HYPRE_Int, num_cols_offd_P, HYPRE_MEMORY_HOST); cnt = 0; for (i = 0; i < num_cols_offd_Q; i++) { if (col_map_offd_Q[i] == col_map_offd_P[cnt]) { map_P_to_Q[cnt++] = i; if (cnt == num_cols_offd_P) { break; } } } AP_offd_num_nonzeros = hypre_CSRMatrixNumNonzeros(AP_offd); AP_offd_j = hypre_CSRMatrixJ(AP_offd); for (i = 0; i < AP_offd_num_nonzeros; i++) { AP_offd_j[i] = map_P_to_Q[AP_offd_j[i]]; } hypre_TFree(map_P_to_Q, HYPRE_MEMORY_HOST); hypre_CSRMatrixNumCols(AP_offd) = num_cols_offd_Q; } } if (num_cols_offd_A) /* number of rows for Pext_diag */ { Q_diag = hypre_CSRMatrixAdd(1.0, AP_diag, 1.0, APext_diag); hypre_CSRMatrixDestroy(AP_diag); hypre_CSRMatrixDestroy(APext_diag); } else { Q_diag = AP_diag; } if (num_cols_offd_P && num_cols_offd_A) { Q_offd = hypre_CSRMatrixAdd(1.0, AP_offd, 1.0, APext_offd); hypre_CSRMatrixDestroy(APext_offd); hypre_CSRMatrixDestroy(AP_offd); } else if (num_cols_offd_A) { Q_offd = APext_offd; } else if (num_cols_offd_P) { Q_offd = AP_offd; } else { Q_offd = hypre_CSRMatrixClone(A_offd, 1); } Q = hypre_ParCSRMatrixCreate(comm, n_rows_A, n_cols_P, row_starts_A, col_starts_P, num_cols_offd_Q, Q_diag->num_nonzeros, Q_offd->num_nonzeros); hypre_CSRMatrixDestroy(hypre_ParCSRMatrixDiag(Q)); hypre_CSRMatrixDestroy(hypre_ParCSRMatrixOffd(Q)); hypre_ParCSRMatrixDiag(Q) = Q_diag; hypre_ParCSRMatrixOffd(Q) = Q_offd; hypre_ParCSRMatrixColMapOffd(Q) = col_map_offd_Q; C_tmp_diag = hypre_CSRMatrixMultiplyHost(RT_diag, Q_diag); if (num_cols_offd_Q) { C_tmp_offd = hypre_CSRMatrixMultiplyHost(RT_diag, Q_offd); } else { C_tmp_offd = hypre_CSRMatrixClone(Q_offd, 1); hypre_CSRMatrixNumRows(C_tmp_offd) = num_cols_diag_R; } if (num_cols_offd_R) { /* Compute RT_offd if necessary */ if (!hypre_ParCSRMatrixOffdT(R)) { hypre_CSRMatrixTranspose(R_offd, &RT_offd, 1); } else { RT_offd = hypre_ParCSRMatrixOffdT(R); } C_int_diag = hypre_CSRMatrixMultiplyHost(RT_offd, Q_diag); C_int_offd = hypre_CSRMatrixMultiplyHost(RT_offd, Q_offd); hypre_ParCSRMatrixDiag(Q) = C_int_diag; hypre_ParCSRMatrixOffd(Q) = C_int_offd; C_int = hypre_MergeDiagAndOffd(Q); hypre_ParCSRMatrixDiag(Q) = Q_diag; hypre_ParCSRMatrixOffd(Q) = Q_offd; } else { C_int = hypre_CSRMatrixCreate(0, 0, 0); hypre_CSRMatrixInitialize(C_int); } /* contains communication; should be explicitly included to allow for overlap */ hypre_ExchangeExternalRowsInit(C_int, comm_pkg_R, &request); C_ext = hypre_ExchangeExternalRowsWait(request); hypre_CSRMatrixDestroy(C_int); if (num_cols_offd_R) { hypre_CSRMatrixDestroy(C_int_diag); hypre_CSRMatrixDestroy(C_int_offd); if (!hypre_ParCSRMatrixOffdT(R)) { if (keep_transpose) { hypre_ParCSRMatrixOffdT(R) = RT_offd; } else { hypre_CSRMatrixDestroy(RT_offd); } } } /*----------------------------------------------------------------------- * Add contents of C_ext to C_tmp_diag and C_tmp_offd * to obtain C_diag and C_offd *-----------------------------------------------------------------------*/ /* split C_ext in local C_ext_diag and nonlocal part C_ext_offd, also generate new col_map_offd and adjust column indices accordingly */ if (C_ext) { first_col_diag_C = first_col_diag_P; last_col_diag_C = first_col_diag_P + num_cols_diag_P - 1; hypre_CSRMatrixSplit(C_ext, first_col_diag_C, last_col_diag_C, num_cols_offd_Q, col_map_offd_Q, &num_cols_offd_C, &col_map_offd_C, &C_ext_diag, &C_ext_offd); hypre_CSRMatrixDestroy(C_ext); C_ext = NULL; /*if (C_ext_offd->num_nonzeros == 0) C_ext_offd->num_cols = 0;*/ } if (num_cols_offd_Q && C_tmp_offd->num_cols) { C_tmp_offd_i = hypre_CSRMatrixI(C_tmp_offd); C_tmp_offd_j = hypre_CSRMatrixJ(C_tmp_offd); map_Q_to_C = hypre_CTAlloc(HYPRE_Int, num_cols_offd_Q, HYPRE_MEMORY_HOST); cnt = 0; for (i = 0; i < num_cols_offd_C; i++) { if (col_map_offd_C[i] == col_map_offd_Q[cnt]) { map_Q_to_C[cnt++] = i; if (cnt == num_cols_offd_Q) { break; } } } for (i = 0; i < C_tmp_offd_i[hypre_CSRMatrixNumRows(C_tmp_offd)]; i++) { j_indx = C_tmp_offd_j[i]; C_tmp_offd_j[i] = map_Q_to_C[j_indx]; } hypre_TFree(map_Q_to_C, HYPRE_MEMORY_HOST); } hypre_CSRMatrixNumCols(C_tmp_offd) = num_cols_offd_C; hypre_ParCSRMatrixDestroy(Q); /*----------------------------------------------------------------------- * Need to compute C_diag = C_tmp_diag + C_ext_diag * and C_offd = C_tmp_offd + C_ext_offd !!!! *-----------------------------------------------------------------------*/ send_map_elmts_R = hypre_ParCSRCommPkgSendMapElmts(comm_pkg_R); if (C_ext_diag) { C_diag = hypre_CSRMatrixAddPartial(C_tmp_diag, C_ext_diag, send_map_elmts_R); hypre_CSRMatrixDestroy(C_tmp_diag); hypre_CSRMatrixDestroy(C_ext_diag); } else { C_diag = C_tmp_diag; } if (C_ext_offd) { C_offd = hypre_CSRMatrixAddPartial(C_tmp_offd, C_ext_offd, send_map_elmts_R); hypre_CSRMatrixDestroy(C_tmp_offd); hypre_CSRMatrixDestroy(C_ext_offd); } else { C_offd = C_tmp_offd; } } else { Q_diag = hypre_CSRMatrixMultiplyHost(A_diag, P_diag); C_diag = hypre_CSRMatrixMultiplyHost(RT_diag, Q_diag); C_offd = hypre_CSRMatrixCreate(num_cols_diag_R, 0, 0); hypre_CSRMatrixInitialize_v2(C_offd, 0, hypre_CSRMatrixMemoryLocation(C_diag)); hypre_CSRMatrixDestroy(Q_diag); } if (!hypre_ParCSRMatrixDiagT(R)) { if (keep_transpose) { hypre_ParCSRMatrixDiagT(R) = RT_diag; } else { hypre_CSRMatrixDestroy(RT_diag); } } C = hypre_ParCSRMatrixCreate(comm, n_cols_R, n_cols_P, col_starts_R, col_starts_P, num_cols_offd_C, 0, 0); hypre_CSRMatrixDestroy(hypre_ParCSRMatrixDiag(C)); hypre_CSRMatrixDestroy(hypre_ParCSRMatrixOffd(C)); hypre_ParCSRMatrixDiag(C) = C_diag; if (C_offd) { hypre_ParCSRMatrixOffd(C) = C_offd; } else { C_offd = hypre_CSRMatrixCreate(num_cols_diag_R, 0, 0); hypre_CSRMatrixInitialize(C_offd); hypre_ParCSRMatrixOffd(C) = C_offd; } hypre_ParCSRMatrixColMapOffd(C) = col_map_offd_C; if (num_procs > 1) { /* hypre_GenerateRAPCommPkg(RAP, A); */ hypre_MatvecCommPkgCreate(C); } return C; } /*-------------------------------------------------------------------------- * hypre_ParCSRMatrixRAPKT * * Computes "C = R * A * P". * * If either RT_diag or RT_offd don't exist and the flag keep_transpose is * true, these local matrices are saved in the ParCSRMatrix R *--------------------------------------------------------------------------*/ hypre_ParCSRMatrix* hypre_ParCSRMatrixRAPKT( hypre_ParCSRMatrix *R, hypre_ParCSRMatrix *A, hypre_ParCSRMatrix *P, HYPRE_Int keep_transpose) { hypre_ParCSRMatrix *C = NULL; HYPRE_ANNOTATE_FUNC_BEGIN; hypre_GpuProfilingPushRange("TripleMat-RAP"); #if defined(HYPRE_USING_GPU) HYPRE_ExecutionPolicy exec = hypre_GetExecPolicy2( hypre_ParCSRMatrixMemoryLocation(R), hypre_ParCSRMatrixMemoryLocation(A) ); if (exec == HYPRE_EXEC_DEVICE) { C = hypre_ParCSRMatrixRAPKTDevice(R, A, P, keep_transpose); } else #endif { C = hypre_ParCSRMatrixRAPKTHost(R, A, P, keep_transpose); } hypre_GpuProfilingPopRange(); HYPRE_ANNOTATE_FUNC_END; return C; } /*-------------------------------------------------------------------------- * hypre_ParCSRMatrixRAP * * Computes "C = R * A * P" and discards the temporary local matrices generated * in the algorithm (keep_transpose = 0). *--------------------------------------------------------------------------*/ hypre_ParCSRMatrix* hypre_ParCSRMatrixRAP( hypre_ParCSRMatrix *R, hypre_ParCSRMatrix *A, hypre_ParCSRMatrix *P ) { return hypre_ParCSRMatrixRAPKT(R, A, P, 0); } /*-------------------------------------------------------------------------- * OLD NOTES: * Sketch of John's code to build RAP * * Uses two integer arrays icg and ifg as marker arrays * * icg needs to be of size n_fine; size of ia. * A negative value of icg(i) indicates i is a f-point, otherwise * icg(i) is the converts from fine to coarse grid orderings. * Note that I belive the code assumes that if i irap(ic) < irap(jc)) but I don't * think there is a guarantee that the entries within a row will * be ordered in any way except that the diagonal entry comes first. * * As structured now, the code requires that the size of rap be * predicted up front. To avoid this, one could execute the code * twice, the first time would only keep track of icg ,ifg and ka. * Then you would know how much memory to allocate for rap and jrap. * The second time would fill in these arrays. Actually you might * be able to include the filling in of jrap into the first pass; * just overestimate its size (its an integer array) and cut it * back before the second time through. This would avoid some if tests * in the second pass. * * Questions * 1) parallel (PetSc) version? * 2) what if we don't store R row-wise and don't * even want to store a copy of it in this form * temporarily? *--------------------------------------------------------------------------*/ hypre-2.33.0/src/parcsr_mv/par_csr_triplemat_device.c000066400000000000000000001423011477326011500227150ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "_hypre_onedpl.hpp" #include "_hypre_parcsr_mv.h" #include "_hypre_utilities.hpp" #define PARCSRGEMM_TIMING 0 #if defined(HYPRE_USING_GPU) /* option == 1, T = HYPRE_BigInt * option == 2, T = HYPRE_Int, */ template #if (defined(THRUST_VERSION) && THRUST_VERSION < 101000) struct RAP_functor : public thrust::unary_function #else struct RAP_functor #endif { HYPRE_Int num_col; T first_col; T *col_map; RAP_functor(HYPRE_Int num_col_, T first_col_, T *col_map_) { num_col = num_col_; first_col = first_col_; col_map = col_map_; } __host__ __device__ T operator()(const HYPRE_Int x) const { if (x < num_col) { if (option == 1) { return x + first_col; } else { return x; } } if (option == 1) { return col_map[x - num_col]; } else { return col_map[x - num_col] + num_col; } } }; /* C = A * B */ hypre_ParCSRMatrix* hypre_ParCSRMatMatDevice( hypre_ParCSRMatrix *A, hypre_ParCSRMatrix *B ) { hypre_ParCSRMatrix *C; hypre_CSRMatrix *C_diag; hypre_CSRMatrix *C_offd; HYPRE_Int num_cols_offd_C = 0; HYPRE_BigInt *col_map_offd_C = NULL; HYPRE_Int num_procs; MPI_Comm comm = hypre_ParCSRMatrixComm(A); hypre_MPI_Comm_size(comm, &num_procs); if ( hypre_ParCSRMatrixGlobalNumCols(A) != hypre_ParCSRMatrixGlobalNumRows(B) || hypre_ParCSRMatrixNumCols(A) != hypre_ParCSRMatrixNumRows(B) ) { hypre_error_in_arg(1); hypre_printf(" Error! Incompatible matrix dimensions!\n"); return NULL; } #if PARCSRGEMM_TIMING > 0 HYPRE_Real ta, tb; ta = hypre_MPI_Wtime(); #endif #if PARCSRGEMM_TIMING > 1 HYPRE_Real t1, t2; #endif /*----------------------------------------------------------------------- * Extract B_ext, i.e. portion of B that is stored on neighbor procs * and needed locally for matrix matrix product *-----------------------------------------------------------------------*/ if (num_procs > 1) { void *request; hypre_CSRMatrix *Abar, *Bbar, *Cbar, *Bext; /*--------------------------------------------------------------------- * If there exists no CommPkg for A, a CommPkg is generated using * equally load balanced partitionings within * hypre_ParCSRMatrixExtractBExt *--------------------------------------------------------------------*/ #if PARCSRGEMM_TIMING > 1 t1 = hypre_MPI_Wtime(); #endif /* contains communication which should be explicitly included to allow for overlap */ hypre_ParCSRMatrixExtractBExtDeviceInit(B, A, 1, &request); #if PARCSRGEMM_TIMING > 1 t2 = hypre_MPI_Wtime(); #endif Abar = hypre_ConcatDiagAndOffdDevice(A); #if PARCSRGEMM_TIMING > 1 hypre_ForceSyncComputeStream(); t2 = hypre_MPI_Wtime() - t2; hypre_ParPrintf(comm, "Time Concat %f\n", t2); #endif Bext = hypre_ParCSRMatrixExtractBExtDeviceWait(request); #if PARCSRGEMM_TIMING > 1 hypre_ForceSyncComputeStream(); t2 = hypre_MPI_Wtime() - t1 - t2; hypre_ParPrintf(comm, "Time Bext %f\n", t2); hypre_ParPrintf(comm, "Size Bext %d %d %d\n", hypre_CSRMatrixNumRows(Bext), hypre_CSRMatrixNumCols(Bext), hypre_CSRMatrixNumNonzeros(Bext)); #endif #if PARCSRGEMM_TIMING > 1 t1 = hypre_MPI_Wtime(); #endif hypre_ConcatDiagOffdAndExtDevice(B, Bext, &Bbar, &num_cols_offd_C, &col_map_offd_C); hypre_CSRMatrixDestroy(Bext); #if PARCSRGEMM_TIMING > 1 hypre_ForceSyncComputeStream(); t2 = hypre_MPI_Wtime() - t1; hypre_ParPrintf(comm, "Time Concat %f\n", t2); #endif #if PARCSRGEMM_TIMING > 1 t1 = hypre_MPI_Wtime(); #endif Cbar = hypre_CSRMatrixMultiplyDevice(Abar, Bbar); #if PARCSRGEMM_TIMING > 1 hypre_ForceSyncComputeStream(); t2 = hypre_MPI_Wtime() - t1; hypre_ParPrintf(comm, "Time SpGemm %f\n", t2); #endif hypre_CSRMatrixDestroy(Abar); hypre_CSRMatrixDestroy(Bbar); hypre_assert(hypre_CSRMatrixNumRows(Cbar) == hypre_ParCSRMatrixNumRows(A)); hypre_assert(hypre_CSRMatrixNumCols(Cbar) == hypre_ParCSRMatrixNumCols(B) + num_cols_offd_C); // split into diag and offd #if PARCSRGEMM_TIMING > 1 t1 = hypre_MPI_Wtime(); #endif in_range pred(0, hypre_ParCSRMatrixNumCols(B) - 1); #if defined(HYPRE_USING_SYCL) HYPRE_Int nnz_C_diag = HYPRE_ONEDPL_CALL( std::count_if, hypre_CSRMatrixJ(Cbar), hypre_CSRMatrixJ(Cbar) + hypre_CSRMatrixNumNonzeros(Cbar), pred ); #else HYPRE_Int nnz_C_diag = HYPRE_THRUST_CALL( count_if, hypre_CSRMatrixJ(Cbar), hypre_CSRMatrixJ(Cbar) + hypre_CSRMatrixNumNonzeros(Cbar), pred ); #endif HYPRE_Int nnz_C_offd = hypre_CSRMatrixNumNonzeros(Cbar) - nnz_C_diag; C_diag = hypre_CSRMatrixCreate(hypre_ParCSRMatrixNumRows(A), hypre_ParCSRMatrixNumCols(B), nnz_C_diag); hypre_CSRMatrixInitialize_v2(C_diag, 0, HYPRE_MEMORY_DEVICE); HYPRE_Int *C_diag_ii = hypre_TAlloc(HYPRE_Int, nnz_C_diag, HYPRE_MEMORY_DEVICE); HYPRE_Int *C_diag_j = hypre_CSRMatrixJ(C_diag); HYPRE_Complex *C_diag_a = hypre_CSRMatrixData(C_diag); HYPRE_Int *Cbar_ii = hypreDevice_CsrRowPtrsToIndices(hypre_ParCSRMatrixNumRows(A), hypre_CSRMatrixNumNonzeros(Cbar), hypre_CSRMatrixI(Cbar)); #if defined(HYPRE_USING_SYCL) auto new_end = hypreSycl_copy_if( oneapi::dpl::make_zip_iterator(Cbar_ii, hypre_CSRMatrixJ(Cbar), hypre_CSRMatrixData(Cbar)), oneapi::dpl::make_zip_iterator(Cbar_ii, hypre_CSRMatrixJ(Cbar), hypre_CSRMatrixData(Cbar)) + hypre_CSRMatrixNumNonzeros(Cbar), hypre_CSRMatrixJ(Cbar), oneapi::dpl::make_zip_iterator(C_diag_ii, C_diag_j, C_diag_a), pred ); hypre_assert( std::get<0>(new_end.base()) == C_diag_ii + nnz_C_diag ); #else auto new_end = HYPRE_THRUST_CALL( copy_if, thrust::make_zip_iterator(thrust::make_tuple(Cbar_ii, hypre_CSRMatrixJ(Cbar), hypre_CSRMatrixData(Cbar))), thrust::make_zip_iterator(thrust::make_tuple(Cbar_ii, hypre_CSRMatrixJ(Cbar), hypre_CSRMatrixData(Cbar))) + hypre_CSRMatrixNumNonzeros(Cbar), hypre_CSRMatrixJ(Cbar), thrust::make_zip_iterator(thrust::make_tuple(C_diag_ii, C_diag_j, C_diag_a)), pred ); hypre_assert( thrust::get<0>(new_end.get_iterator_tuple()) == C_diag_ii + nnz_C_diag ); #endif hypreDevice_CsrRowIndicesToPtrs_v2(hypre_CSRMatrixNumRows(C_diag), nnz_C_diag, C_diag_ii, hypre_CSRMatrixI(C_diag)); hypre_TFree(C_diag_ii, HYPRE_MEMORY_DEVICE); C_offd = hypre_CSRMatrixCreate(hypre_ParCSRMatrixNumRows(A), num_cols_offd_C, nnz_C_offd); hypre_CSRMatrixInitialize_v2(C_offd, 0, HYPRE_MEMORY_DEVICE); HYPRE_Int *C_offd_ii = hypre_TAlloc(HYPRE_Int, nnz_C_offd, HYPRE_MEMORY_DEVICE); HYPRE_Int *C_offd_j = hypre_CSRMatrixJ(C_offd); HYPRE_Complex *C_offd_a = hypre_CSRMatrixData(C_offd); #if defined(HYPRE_USING_SYCL) new_end = hypreSycl_copy_if( oneapi::dpl::make_zip_iterator(Cbar_ii, hypre_CSRMatrixJ(Cbar), hypre_CSRMatrixData(Cbar)), oneapi::dpl::make_zip_iterator(Cbar_ii, hypre_CSRMatrixJ(Cbar), hypre_CSRMatrixData(Cbar)) + hypre_CSRMatrixNumNonzeros(Cbar), hypre_CSRMatrixJ(Cbar), oneapi::dpl::make_zip_iterator(C_offd_ii, C_offd_j, C_offd_a), std::not_fn(pred) ); hypre_assert( std::get<0>(new_end.base()) == C_offd_ii + nnz_C_offd ); #else new_end = HYPRE_THRUST_CALL( copy_if, thrust::make_zip_iterator(thrust::make_tuple(Cbar_ii, hypre_CSRMatrixJ(Cbar), hypre_CSRMatrixData(Cbar))), thrust::make_zip_iterator(thrust::make_tuple(Cbar_ii, hypre_CSRMatrixJ(Cbar), hypre_CSRMatrixData(Cbar))) + hypre_CSRMatrixNumNonzeros(Cbar), hypre_CSRMatrixJ(Cbar), thrust::make_zip_iterator(thrust::make_tuple(C_offd_ii, C_offd_j, C_offd_a)), HYPRE_THRUST_NOT(pred) ); hypre_assert( thrust::get<0>(new_end.get_iterator_tuple()) == C_offd_ii + nnz_C_offd ); #endif hypreDevice_CsrRowIndicesToPtrs_v2(hypre_CSRMatrixNumRows(C_offd), nnz_C_offd, C_offd_ii, hypre_CSRMatrixI(C_offd)); hypre_TFree(C_offd_ii, HYPRE_MEMORY_DEVICE); #if defined(HYPRE_USING_SYCL) HYPRE_ONEDPL_CALL( std::transform, C_offd_j, C_offd_j + nnz_C_offd, C_offd_j, [const_val = hypre_ParCSRMatrixNumCols(B)] (const auto & x) {return x - const_val;} ); #else HYPRE_THRUST_CALL( transform, C_offd_j, C_offd_j + nnz_C_offd, thrust::make_constant_iterator(hypre_ParCSRMatrixNumCols(B)), C_offd_j, thrust::minus() ); #endif hypre_TFree(Cbar_ii, HYPRE_MEMORY_DEVICE); hypre_CSRMatrixDestroy(Cbar); #if PARCSRGEMM_TIMING > 1 hypre_ForceSyncComputeStream(); t2 = hypre_MPI_Wtime() - t1; hypre_ParPrintf(comm, "Time Split %f\n", t2); #endif } else { #if PARCSRGEMM_TIMING > 1 t1 = hypre_MPI_Wtime(); #endif C_diag = hypre_CSRMatrixMultiplyDevice(hypre_ParCSRMatrixDiag(A), hypre_ParCSRMatrixDiag(B)); #if PARCSRGEMM_TIMING > 1 hypre_ForceSyncComputeStream(); t2 = hypre_MPI_Wtime() - t1; hypre_ParPrintf(comm, "Time SpGemm %f\n", t2); #endif C_offd = hypre_CSRMatrixCreate(hypre_ParCSRMatrixNumRows(A), 0, 0); hypre_CSRMatrixInitialize_v2(C_offd, 0, HYPRE_MEMORY_DEVICE); } C = hypre_ParCSRMatrixCreate(hypre_ParCSRMatrixComm(A), hypre_ParCSRMatrixGlobalNumRows(A), hypre_ParCSRMatrixGlobalNumCols(B), hypre_ParCSRMatrixRowStarts(A), hypre_ParCSRMatrixColStarts(B), num_cols_offd_C, hypre_CSRMatrixNumNonzeros(C_diag), hypre_CSRMatrixNumNonzeros(C_offd)); hypre_CSRMatrixDestroy(hypre_ParCSRMatrixDiag(C)); hypre_ParCSRMatrixDiag(C) = C_diag; hypre_CSRMatrixDestroy(hypre_ParCSRMatrixOffd(C)); hypre_ParCSRMatrixOffd(C) = C_offd; if (num_cols_offd_C) { hypre_ParCSRMatrixDeviceColMapOffd(C) = col_map_offd_C; } hypre_ParCSRMatrixCopyColMapOffdToHost(C); #if PARCSRGEMM_TIMING > 0 hypre_ForceSyncComputeStream(); tb = hypre_MPI_Wtime() - ta; hypre_ParPrintf(comm, "Time hypre_ParCSRMatMatDevice %f\n", tb); #endif return C; } /* C = A^T * B */ hypre_ParCSRMatrix* hypre_ParCSRTMatMatKTDevice( hypre_ParCSRMatrix *A, hypre_ParCSRMatrix *B, HYPRE_Int keep_transpose) { hypre_CSRMatrix *A_diag = hypre_ParCSRMatrixDiag(A); hypre_CSRMatrix *A_offd = hypre_ParCSRMatrixOffd(A); hypre_ParCSRMatrix *C; hypre_CSRMatrix *C_diag; hypre_CSRMatrix *C_offd; HYPRE_Int num_cols_offd_C = 0; HYPRE_BigInt *col_map_offd_C = NULL; HYPRE_Int num_procs; MPI_Comm comm = hypre_ParCSRMatrixComm(A); hypre_MPI_Comm_size(comm, &num_procs); if (hypre_ParCSRMatrixGlobalNumRows(A) != hypre_ParCSRMatrixGlobalNumRows(B) || hypre_ParCSRMatrixNumRows(A) != hypre_ParCSRMatrixNumRows(B)) { hypre_error_w_msg(HYPRE_ERROR_GENERIC, " Error! Incompatible matrix dimensions!\n"); return NULL; } #if PARCSRGEMM_TIMING > 0 HYPRE_Real ta, tb; ta = hypre_MPI_Wtime(); #endif #if PARCSRGEMM_TIMING > 1 HYPRE_Real t1, t2; #endif if (num_procs > 1) { void *request; hypre_CSRMatrix *Bbar, *AbarT, *Cbar, *AT_diag, *AT_offd, *Cint, *Cext; hypre_CSRMatrix *B_offd = hypre_ParCSRMatrixOffd(B); HYPRE_Int local_nnz_Cbar; #if PARCSRGEMM_TIMING > 1 t1 = hypre_MPI_Wtime(); #endif Bbar = hypre_ConcatDiagAndOffdDevice(B); #if PARCSRGEMM_TIMING > 1 hypre_ForceSyncComputeStream(); t2 = hypre_MPI_Wtime() - t1; hypre_ParPrintf(comm, "Time Concat %f\n", t2); #endif #if PARCSRGEMM_TIMING > 1 t1 = hypre_MPI_Wtime(); #endif if (hypre_ParCSRMatrixDiagT(A)) { AT_diag = hypre_ParCSRMatrixDiagT(A); } else { hypre_CSRMatrixTranspose(A_diag, &AT_diag, 1); } if (hypre_ParCSRMatrixOffdT(A)) { AT_offd = hypre_ParCSRMatrixOffdT(A); } else { hypre_CSRMatrixTranspose(A_offd, &AT_offd, 1); } #if PARCSRGEMM_TIMING > 1 hypre_ForceSyncComputeStream(); t2 = hypre_MPI_Wtime() - t1; hypre_ParPrintf(comm, "Time Transpose %f\n", t2); #endif #if PARCSRGEMM_TIMING > 1 t1 = hypre_MPI_Wtime(); #endif AbarT = hypre_CSRMatrixStack2Device(AT_diag, AT_offd); #if PARCSRGEMM_TIMING > 1 hypre_ForceSyncComputeStream(); t2 = hypre_MPI_Wtime() - t1; hypre_ParPrintf(comm, "Time Stack %f\n", t2); #endif if (!hypre_ParCSRMatrixDiagT(A)) { if (keep_transpose) { hypre_ParCSRMatrixDiagT(A) = AT_diag; } else { hypre_CSRMatrixDestroy(AT_diag); } } if (!hypre_ParCSRMatrixOffdT(A)) { if (keep_transpose) { hypre_ParCSRMatrixOffdT(A) = AT_offd; } else { hypre_CSRMatrixDestroy(AT_offd); } } #if PARCSRGEMM_TIMING > 1 t1 = hypre_MPI_Wtime(); #endif Cbar = hypre_CSRMatrixMultiplyDevice(AbarT, Bbar); #if PARCSRGEMM_TIMING > 1 hypre_ForceSyncComputeStream(); t2 = hypre_MPI_Wtime() - t1; hypre_ParPrintf(comm, "Time SpGemm %f\n", t2); #endif hypre_CSRMatrixDestroy(AbarT); hypre_CSRMatrixDestroy(Bbar); hypre_assert(hypre_CSRMatrixNumRows(Cbar) == hypre_ParCSRMatrixNumCols(A) + hypre_CSRMatrixNumCols( A_offd)); hypre_assert(hypre_CSRMatrixNumCols(Cbar) == hypre_ParCSRMatrixNumCols(B) + hypre_CSRMatrixNumCols( B_offd)); #if PARCSRGEMM_TIMING > 1 t1 = hypre_MPI_Wtime(); #endif hypre_TMemcpy(&local_nnz_Cbar, hypre_CSRMatrixI(Cbar) + hypre_ParCSRMatrixNumCols(A), HYPRE_Int, 1, HYPRE_MEMORY_HOST, HYPRE_MEMORY_DEVICE); // Cint is the bottom part of Cbar Cint = hypre_CSRMatrixCreate(hypre_CSRMatrixNumCols(A_offd), hypre_CSRMatrixNumCols(Cbar), hypre_CSRMatrixNumNonzeros(Cbar) - local_nnz_Cbar); hypre_CSRMatrixMemoryLocation(Cint) = HYPRE_MEMORY_DEVICE; hypre_CSRMatrixOwnsData(Cint) = 0; hypre_CSRMatrixI(Cint) = hypre_CSRMatrixI(Cbar) + hypre_ParCSRMatrixNumCols(A); #if defined(HYPRE_USING_SYCL) HYPRE_ONEDPL_CALL( std::transform, hypre_CSRMatrixI(Cint), hypre_CSRMatrixI(Cint) + hypre_CSRMatrixNumRows(Cint) + 1, hypre_CSRMatrixI(Cint), [const_val = local_nnz_Cbar] (const auto & x) {return x - const_val;} ); #else HYPRE_THRUST_CALL( transform, hypre_CSRMatrixI(Cint), hypre_CSRMatrixI(Cint) + hypre_CSRMatrixNumRows(Cint) + 1, thrust::make_constant_iterator(local_nnz_Cbar), hypre_CSRMatrixI(Cint), thrust::minus() ); #endif // Change Cint into a BigJ matrix // RL: TODO FIX the 'big' num of columns to global size hypre_CSRMatrixBigJ(Cint) = hypre_TAlloc(HYPRE_BigInt, hypre_CSRMatrixNumNonzeros(Cint), HYPRE_MEMORY_DEVICE); RAP_functor<1, HYPRE_BigInt> func1( hypre_ParCSRMatrixNumCols(B), hypre_ParCSRMatrixFirstColDiag(B), hypre_ParCSRMatrixDeviceColMapOffd(B) ); #if defined(HYPRE_USING_SYCL) HYPRE_ONEDPL_CALL( std::transform, hypre_CSRMatrixJ(Cbar) + local_nnz_Cbar, hypre_CSRMatrixJ(Cbar) + hypre_CSRMatrixNumNonzeros(Cbar), hypre_CSRMatrixBigJ(Cint), func1 ); #else HYPRE_THRUST_CALL( transform, hypre_CSRMatrixJ(Cbar) + local_nnz_Cbar, hypre_CSRMatrixJ(Cbar) + hypre_CSRMatrixNumNonzeros(Cbar), hypre_CSRMatrixBigJ(Cint), func1 ); #endif #if defined(HYPRE_USING_THRUST_NOSYNC) /* RL: make sure Cint is ready before issuing GPU-GPU MPI */ if (hypre_GetGpuAwareMPI()) { hypre_ForceSyncComputeStream(); } #endif hypre_CSRMatrixData(Cint) = hypre_CSRMatrixData(Cbar) + local_nnz_Cbar; #if PARCSRGEMM_TIMING > 1 hypre_ForceSyncComputeStream(); t2 = hypre_MPI_Wtime() - t1; hypre_ParPrintf(comm, "Time Cint %f\n", t2); #endif #if PARCSRGEMM_TIMING > 1 t1 = hypre_MPI_Wtime(); #endif hypre_ExchangeExternalRowsDeviceInit(Cint, hypre_ParCSRMatrixCommPkg(A), 1, &request); Cext = hypre_ExchangeExternalRowsDeviceWait(request); hypre_TFree(hypre_CSRMatrixBigJ(Cint), HYPRE_MEMORY_DEVICE); hypre_TFree(Cint, HYPRE_MEMORY_HOST); hypre_TMemcpy(hypre_CSRMatrixI(Cbar) + hypre_ParCSRMatrixNumCols(A), &local_nnz_Cbar, HYPRE_Int, 1, HYPRE_MEMORY_DEVICE, HYPRE_MEMORY_HOST); #if PARCSRGEMM_TIMING > 1 hypre_ForceSyncComputeStream(); t2 = hypre_MPI_Wtime() - t1; hypre_ParPrintf(comm, "Time Cext %f\n", t2); hypre_ParPrintf(comm, "Size Cext %d %d %d\n", hypre_CSRMatrixNumRows(Cext), hypre_CSRMatrixNumCols(Cext), hypre_CSRMatrixNumNonzeros(Cext)); #endif /* add Cext to local part of Cbar */ hypre_ParCSRTMatMatPartialAddDevice(hypre_ParCSRMatrixCommPkg(A), hypre_ParCSRMatrixNumCols(A), hypre_ParCSRMatrixNumCols(B), hypre_ParCSRMatrixFirstColDiag(B), hypre_ParCSRMatrixLastColDiag(B), hypre_CSRMatrixNumCols(B_offd), hypre_ParCSRMatrixDeviceColMapOffd(B), local_nnz_Cbar, Cbar, Cext, &C_diag, &C_offd, &num_cols_offd_C, &col_map_offd_C); } else { hypre_CSRMatrix *AT_diag; hypre_CSRMatrix *B_diag = hypre_ParCSRMatrixDiag(B); #if PARCSRGEMM_TIMING > 1 t1 = hypre_MPI_Wtime(); #endif hypre_CSRMatrixTransposeDevice(A_diag, &AT_diag, 1); #if PARCSRGEMM_TIMING > 1 hypre_ForceSyncComputeStream(); t2 = hypre_MPI_Wtime() - t1; hypre_ParPrintf(comm, "Time Transpose %f\n", t2); #endif #if PARCSRGEMM_TIMING > 1 t1 = hypre_MPI_Wtime(); #endif C_diag = hypre_CSRMatrixMultiplyDevice(AT_diag, B_diag); #if PARCSRGEMM_TIMING > 1 hypre_ForceSyncComputeStream(); t2 = hypre_MPI_Wtime() - t1; hypre_ParPrintf(comm, "Time SpGemm %f\n", t2); #endif C_offd = hypre_CSRMatrixCreate(hypre_ParCSRMatrixNumCols(A), 0, 0); hypre_CSRMatrixInitialize_v2(C_offd, 0, HYPRE_MEMORY_DEVICE); if (keep_transpose) { hypre_ParCSRMatrixDiagT(A) = AT_diag; } else { hypre_CSRMatrixDestroy(AT_diag); } } /* Move the diagonal entry to the first of each row */ hypre_CSRMatrixMoveDiagFirstDevice(C_diag); C = hypre_ParCSRMatrixCreate(hypre_ParCSRMatrixComm(A), hypre_ParCSRMatrixGlobalNumCols(A), hypre_ParCSRMatrixGlobalNumCols(B), hypre_ParCSRMatrixColStarts(A), hypre_ParCSRMatrixColStarts(B), num_cols_offd_C, hypre_CSRMatrixNumNonzeros(C_diag), hypre_CSRMatrixNumNonzeros(C_offd)); hypre_CSRMatrixDestroy(hypre_ParCSRMatrixDiag(C)); hypre_ParCSRMatrixDiag(C) = C_diag; hypre_CSRMatrixDestroy(hypre_ParCSRMatrixOffd(C)); hypre_ParCSRMatrixOffd(C) = C_offd; hypre_ParCSRMatrixDeviceColMapOffd(C) = col_map_offd_C; hypre_ParCSRMatrixCompressOffdMapDevice(C); hypre_ParCSRMatrixCopyColMapOffdToHost(C); hypre_assert(!hypre_CSRMatrixCheckDiagFirstDevice(hypre_ParCSRMatrixDiag(C))); hypre_SyncComputeStream(); #if PARCSRGEMM_TIMING > 0 hypre_ForceSyncComputeStream(); tb = hypre_MPI_Wtime() - ta; hypre_ParPrintf(comm, "Time hypre_ParCSRTMatMatKTDevice %f\n", tb); #endif return C; } /* C = R^{T} * A * P */ hypre_ParCSRMatrix* hypre_ParCSRMatrixRAPKTDevice( hypre_ParCSRMatrix *R, hypre_ParCSRMatrix *A, hypre_ParCSRMatrix *P, HYPRE_Int keep_transpose ) { MPI_Comm comm = hypre_ParCSRMatrixComm(A); hypre_CSRMatrix *R_diag = hypre_ParCSRMatrixDiag(R); hypre_CSRMatrix *R_offd = hypre_ParCSRMatrixOffd(R); hypre_ParCSRMatrix *C; hypre_CSRMatrix *C_diag; hypre_CSRMatrix *C_offd; HYPRE_Int num_cols_offd_C = 0; HYPRE_BigInt *col_map_offd_C = NULL; HYPRE_Int num_procs; hypre_MPI_Comm_size(comm, &num_procs); if ( hypre_ParCSRMatrixGlobalNumRows(R) != hypre_ParCSRMatrixGlobalNumRows(A) || hypre_ParCSRMatrixGlobalNumCols(A) != hypre_ParCSRMatrixGlobalNumRows(P) ) { hypre_error_in_arg(1); hypre_printf(" Error! Incompatible matrix global dimensions!\n"); return NULL; } if ( hypre_ParCSRMatrixNumRows(R) != hypre_ParCSRMatrixNumRows(A) || hypre_ParCSRMatrixNumCols(A) != hypre_ParCSRMatrixNumRows(P) ) { hypre_error_in_arg(1); hypre_printf(" Error! Incompatible matrix local dimensions!\n"); return NULL; } if (num_procs > 1) { void *request; hypre_CSRMatrix *Abar, *RbarT, *Pext, *Pbar, *R_diagT, *R_offdT, *Cbar, *Cint, *Cext; HYPRE_Int num_cols_offd, local_nnz_Cbar; HYPRE_BigInt *col_map_offd; hypre_ParCSRMatrixExtractBExtDeviceInit(P, A, 1, &request); Abar = hypre_ConcatDiagAndOffdDevice(A); if (hypre_ParCSRMatrixDiagT(R)) { R_diagT = hypre_ParCSRMatrixDiagT(R); } else { hypre_CSRMatrixTransposeDevice(R_diag, &R_diagT, 1); } if (hypre_ParCSRMatrixOffdT(R)) { R_offdT = hypre_ParCSRMatrixOffdT(R); } else { hypre_CSRMatrixTransposeDevice(R_offd, &R_offdT, 1); } RbarT = hypre_CSRMatrixStack2Device(R_diagT, R_offdT); if (!hypre_ParCSRMatrixDiagT(R)) { if (keep_transpose) { hypre_ParCSRMatrixDiagT(R) = R_diagT; } else { hypre_CSRMatrixDestroy(R_diagT); } } if (!hypre_ParCSRMatrixOffdT(R)) { if (keep_transpose) { hypre_ParCSRMatrixOffdT(R) = R_offdT; } else { hypre_CSRMatrixDestroy(R_offdT); } } Pext = hypre_ParCSRMatrixExtractBExtDeviceWait(request); hypre_ConcatDiagOffdAndExtDevice(P, Pext, &Pbar, &num_cols_offd, &col_map_offd); hypre_CSRMatrixDestroy(Pext); Cbar = hypre_CSRMatrixTripleMultiplyDevice(RbarT, Abar, Pbar); hypre_CSRMatrixDestroy(RbarT); hypre_CSRMatrixDestroy(Abar); hypre_CSRMatrixDestroy(Pbar); hypre_assert(hypre_CSRMatrixNumRows(Cbar) == hypre_ParCSRMatrixNumCols(R) + hypre_CSRMatrixNumCols(R_offd)); hypre_assert(hypre_CSRMatrixNumCols(Cbar) == hypre_ParCSRMatrixNumCols(P) + num_cols_offd); hypre_TMemcpy(&local_nnz_Cbar, hypre_CSRMatrixI(Cbar) + hypre_ParCSRMatrixNumCols(R), HYPRE_Int, 1, HYPRE_MEMORY_HOST, HYPRE_MEMORY_DEVICE); // Cint is the bottom part of Cbar Cint = hypre_CSRMatrixCreate(hypre_CSRMatrixNumCols(R_offd), hypre_CSRMatrixNumCols(Cbar), hypre_CSRMatrixNumNonzeros(Cbar) - local_nnz_Cbar); hypre_CSRMatrixMemoryLocation(Cint) = HYPRE_MEMORY_DEVICE; hypre_CSRMatrixOwnsData(Cint) = 0; hypre_CSRMatrixI(Cint) = hypre_CSRMatrixI(Cbar) + hypre_ParCSRMatrixNumCols(R); #if defined(HYPRE_USING_SYCL) HYPRE_ONEDPL_CALL( std::transform, hypre_CSRMatrixI(Cint), hypre_CSRMatrixI(Cint) + hypre_CSRMatrixNumRows(Cint) + 1, hypre_CSRMatrixI(Cint), [const_val = local_nnz_Cbar] (const auto & x) {return x - const_val;} ); #else HYPRE_THRUST_CALL( transform, hypre_CSRMatrixI(Cint), hypre_CSRMatrixI(Cint) + hypre_CSRMatrixNumRows(Cint) + 1, thrust::make_constant_iterator(local_nnz_Cbar), hypre_CSRMatrixI(Cint), thrust::minus() ); #endif // Change Cint into a BigJ matrix // RL: TODO FIX the 'big' num of columns to global size hypre_CSRMatrixBigJ(Cint) = hypre_TAlloc(HYPRE_BigInt, hypre_CSRMatrixNumNonzeros(Cint), HYPRE_MEMORY_DEVICE); RAP_functor<1, HYPRE_BigInt> func1(hypre_ParCSRMatrixNumCols(P), hypre_ParCSRMatrixFirstColDiag(P), col_map_offd); #if defined(HYPRE_USING_SYCL) HYPRE_ONEDPL_CALL( std::transform, hypre_CSRMatrixJ(Cbar) + local_nnz_Cbar, hypre_CSRMatrixJ(Cbar) + hypre_CSRMatrixNumNonzeros(Cbar), hypre_CSRMatrixBigJ(Cint), func1 ); #else HYPRE_THRUST_CALL( transform, hypre_CSRMatrixJ(Cbar) + local_nnz_Cbar, hypre_CSRMatrixJ(Cbar) + hypre_CSRMatrixNumNonzeros(Cbar), hypre_CSRMatrixBigJ(Cint), func1 ); #endif #if defined(HYPRE_USING_THRUST_NOSYNC) /* RL: make sure Cint is ready before issuing GPU-GPU MPI */ if (hypre_GetGpuAwareMPI()) { hypre_ForceSyncComputeStream(); } #endif hypre_CSRMatrixData(Cint) = hypre_CSRMatrixData(Cbar) + local_nnz_Cbar; hypre_ExchangeExternalRowsDeviceInit(Cint, hypre_ParCSRMatrixCommPkg(R), 1, &request); Cext = hypre_ExchangeExternalRowsDeviceWait(request); hypre_TFree(hypre_CSRMatrixBigJ(Cint), HYPRE_MEMORY_DEVICE); hypre_TFree(Cint, HYPRE_MEMORY_HOST); hypre_TMemcpy(hypre_CSRMatrixI(Cbar) + hypre_ParCSRMatrixNumCols(R), &local_nnz_Cbar, HYPRE_Int, 1, HYPRE_MEMORY_DEVICE, HYPRE_MEMORY_HOST); /* add Cext to local part of Cbar */ hypre_ParCSRTMatMatPartialAddDevice(hypre_ParCSRMatrixCommPkg(R), hypre_ParCSRMatrixNumCols(R), hypre_ParCSRMatrixNumCols(P), hypre_ParCSRMatrixFirstColDiag(P), hypre_ParCSRMatrixLastColDiag(P), num_cols_offd, col_map_offd, local_nnz_Cbar, Cbar, Cext, &C_diag, &C_offd, &num_cols_offd_C, &col_map_offd_C); hypre_TFree(col_map_offd, HYPRE_MEMORY_DEVICE); } else { hypre_CSRMatrix *R_diagT; hypre_CSRMatrix *A_diag = hypre_ParCSRMatrixDiag(A); hypre_CSRMatrix *P_diag = hypre_ParCSRMatrixDiag(P); /* Recover or compute transpose of R_diag */ if (hypre_ParCSRMatrixDiagT(R)) { R_diagT = hypre_ParCSRMatrixDiagT(R); } else { hypre_CSRMatrixTransposeDevice(R_diag, &R_diagT, 1); } C_diag = hypre_CSRMatrixTripleMultiplyDevice(R_diagT, A_diag, P_diag); C_offd = hypre_CSRMatrixCreate(hypre_ParCSRMatrixNumCols(R), 0, 0); hypre_CSRMatrixInitialize_v2(C_offd, 0, HYPRE_MEMORY_DEVICE); /* Keep or destroy transpose of R_diag */ if (!hypre_ParCSRMatrixDiagT(R)) { if (keep_transpose) { hypre_ParCSRMatrixDiagT(R) = R_diagT; } else { hypre_CSRMatrixDestroy(R_diagT); } } } C = hypre_ParCSRMatrixCreate(hypre_ParCSRMatrixComm(A), hypre_ParCSRMatrixGlobalNumCols(R), hypre_ParCSRMatrixGlobalNumCols(P), hypre_ParCSRMatrixColStarts(R), hypre_ParCSRMatrixColStarts(P), num_cols_offd_C, hypre_CSRMatrixNumNonzeros(C_diag), hypre_CSRMatrixNumNonzeros(C_offd)); hypre_CSRMatrixDestroy(hypre_ParCSRMatrixDiag(C)); hypre_ParCSRMatrixDiag(C) = C_diag; hypre_CSRMatrixDestroy(hypre_ParCSRMatrixOffd(C)); hypre_ParCSRMatrixOffd(C) = C_offd; hypre_ParCSRMatrixDeviceColMapOffd(C) = col_map_offd_C; hypre_ParCSRMatrixCompressOffdMapDevice(C); hypre_ParCSRMatrixCopyColMapOffdToHost(C); /* Ensure that the diagonal entries exist in the matrix structure (even if numerically zero) */ if (hypre_CSRMatrixCheckForMissingDiagonal(C_diag)) { hypre_CSRMatrix *zero = hypre_CSRMatrixIdentityDevice(hypre_CSRMatrixNumRows(C_diag), 0.0); hypre_CSRMatrix *C_diag_new = hypre_CSRMatrixAddDevice(1.0, C_diag, 1.0, zero); hypre_CSRMatrixDestroy(C_diag); hypre_CSRMatrixDestroy(zero); hypre_ParCSRMatrixDiag(C) = C_diag_new; } /* Move the diagonal entry to the first of each row */ hypre_CSRMatrixMoveDiagFirstDevice(hypre_ParCSRMatrixDiag(C)); hypre_assert(!hypre_CSRMatrixCheckDiagFirstDevice(hypre_ParCSRMatrixDiag(C))); hypre_SyncComputeStream(); return C; } HYPRE_Int hypre_ParCSRTMatMatPartialAddDevice( hypre_ParCSRCommPkg *comm_pkg, HYPRE_Int num_rows, HYPRE_Int num_cols, HYPRE_BigInt first_col_diag, HYPRE_BigInt last_col_diag, HYPRE_Int num_cols_offd, HYPRE_BigInt *col_map_offd, HYPRE_Int local_nnz_Cbar, hypre_CSRMatrix *Cbar, hypre_CSRMatrix *Cext, hypre_CSRMatrix **C_diag_ptr, hypre_CSRMatrix **C_offd_ptr, HYPRE_Int *num_cols_offd_C_ptr, HYPRE_BigInt **col_map_offd_C_ptr ) { #if PARCSRGEMM_TIMING > 1 MPI_Comm comm = hypre_ParCSRCommPkgComm(comm_pkg); HYPRE_Real t1, t2; t1 = hypre_MPI_Wtime(); #endif HYPRE_Int Cext_nnz = hypre_CSRMatrixNumNonzeros(Cext); HYPRE_Int num_cols_offd_C; HYPRE_BigInt *col_map_offd_C; hypre_CSRMatrix *Cz; // local part of Cbar hypre_CSRMatrix *Cbar_local = hypre_CSRMatrixCreate(num_rows, hypre_CSRMatrixNumCols(Cbar), local_nnz_Cbar); hypre_CSRMatrixI(Cbar_local) = hypre_CSRMatrixI(Cbar); hypre_CSRMatrixJ(Cbar_local) = hypre_CSRMatrixJ(Cbar); hypre_CSRMatrixData(Cbar_local) = hypre_CSRMatrixData(Cbar); hypre_CSRMatrixOwnsData(Cbar_local) = 0; hypre_CSRMatrixMemoryLocation(Cbar_local) = HYPRE_MEMORY_DEVICE; if (!Cext_nnz) { num_cols_offd_C = num_cols_offd; col_map_offd_C = hypre_TAlloc(HYPRE_BigInt, num_cols_offd, HYPRE_MEMORY_DEVICE); hypre_TMemcpy(col_map_offd_C, col_map_offd, HYPRE_BigInt, num_cols_offd, HYPRE_MEMORY_DEVICE, HYPRE_MEMORY_DEVICE); Cz = Cbar_local; } else { in_range pred1(first_col_diag, last_col_diag); if (!hypre_CSRMatrixJ(Cext)) { hypre_CSRMatrixJ(Cext) = hypre_TAlloc(HYPRE_Int, Cext_nnz, HYPRE_MEMORY_DEVICE); } HYPRE_BigInt *Cext_bigj = hypre_CSRMatrixBigJ(Cext); HYPRE_BigInt *big_work = hypre_TAlloc(HYPRE_BigInt, Cext_nnz, HYPRE_MEMORY_DEVICE); HYPRE_Int *work = hypre_TAlloc(HYPRE_Int, Cext_nnz, HYPRE_MEMORY_DEVICE); HYPRE_Int *map_offd_to_C; // Convert Cext from BigJ to J // Cext offd #if defined(HYPRE_USING_SYCL) auto off_end = hypreSycl_copy_if( oneapi::dpl::make_zip_iterator(oneapi::dpl::counting_iterator(0), Cext_bigj), oneapi::dpl::make_zip_iterator(oneapi::dpl::counting_iterator(0), Cext_bigj) + Cext_nnz, Cext_bigj, oneapi::dpl::make_zip_iterator(work, big_work), std::not_fn(pred1) ); HYPRE_Int Cext_offd_nnz = std::get<0>(off_end.base()) - work; #else auto off_end = HYPRE_THRUST_CALL( copy_if, thrust::make_zip_iterator(thrust::make_tuple(thrust::make_counting_iterator(0), Cext_bigj)), thrust::make_zip_iterator(thrust::make_tuple(thrust::make_counting_iterator(0), Cext_bigj)) + Cext_nnz, Cext_bigj, thrust::make_zip_iterator(thrust::make_tuple(work, big_work)), HYPRE_THRUST_NOT(pred1) ); HYPRE_Int Cext_offd_nnz = thrust::get<0>(off_end.get_iterator_tuple()) - work; #endif hypre_CSRMatrixMergeColMapOffd(num_cols_offd, col_map_offd, Cext_offd_nnz, big_work, &num_cols_offd_C, &col_map_offd_C, &map_offd_to_C); #if defined(HYPRE_USING_SYCL) /* WM: onedpl lower_bound currently does not accept zero length values */ if (Cext_offd_nnz > 0) { HYPRE_ONEDPL_CALL( oneapi::dpl::lower_bound, col_map_offd_C, col_map_offd_C + num_cols_offd_C, big_work, big_work + Cext_offd_nnz, oneapi::dpl::make_permutation_iterator(hypre_CSRMatrixJ(Cext), work) ); } HYPRE_ONEDPL_CALL( std::transform, oneapi::dpl::make_permutation_iterator(hypre_CSRMatrixJ(Cext), work), oneapi::dpl::make_permutation_iterator(hypre_CSRMatrixJ(Cext), work) + Cext_offd_nnz, oneapi::dpl::make_permutation_iterator(hypre_CSRMatrixJ(Cext), work), [const_val = num_cols] (const auto & x) {return x + const_val;} ); #else HYPRE_THRUST_CALL( lower_bound, col_map_offd_C, col_map_offd_C + num_cols_offd_C, big_work, big_work + Cext_offd_nnz, thrust::make_permutation_iterator(hypre_CSRMatrixJ(Cext), work) ); HYPRE_THRUST_CALL( transform, thrust::make_permutation_iterator(hypre_CSRMatrixJ(Cext), work), thrust::make_permutation_iterator(hypre_CSRMatrixJ(Cext), work) + Cext_offd_nnz, thrust::make_constant_iterator(num_cols), thrust::make_permutation_iterator(hypre_CSRMatrixJ(Cext), work), thrust::plus() ); #endif // Cext diag #if defined(HYPRE_USING_SYCL) auto dia_end = hypreSycl_copy_if( oneapi::dpl::make_zip_iterator(oneapi::dpl::counting_iterator(0), Cext_bigj), oneapi::dpl::make_zip_iterator(oneapi::dpl::counting_iterator(0), Cext_bigj) + Cext_nnz, Cext_bigj, oneapi::dpl::make_zip_iterator(work, big_work), pred1 ); HYPRE_Int Cext_diag_nnz = std::get<0>(dia_end.base()) - work; #else auto dia_end = HYPRE_THRUST_CALL( copy_if, thrust::make_zip_iterator(thrust::make_tuple(thrust::make_counting_iterator(0), Cext_bigj)), thrust::make_zip_iterator(thrust::make_tuple(thrust::make_counting_iterator(0), Cext_bigj)) + Cext_nnz, Cext_bigj, thrust::make_zip_iterator(thrust::make_tuple(work, big_work)), pred1 ); HYPRE_Int Cext_diag_nnz = thrust::get<0>(dia_end.get_iterator_tuple()) - work; #endif hypre_assert(Cext_diag_nnz + Cext_offd_nnz == Cext_nnz); #if defined(HYPRE_USING_SYCL) HYPRE_ONEDPL_CALL( std::transform, big_work, big_work + Cext_diag_nnz, oneapi::dpl::make_permutation_iterator(hypre_CSRMatrixJ(Cext), work), [const_val = first_col_diag](const auto & x) {return x - const_val;} ); #else HYPRE_THRUST_CALL( transform, big_work, big_work + Cext_diag_nnz, thrust::make_constant_iterator(first_col_diag), thrust::make_permutation_iterator(hypre_CSRMatrixJ(Cext), work), thrust::minus()); #endif hypre_CSRMatrixNumCols(Cext) = num_cols + num_cols_offd_C; // transform Cbar_local J index RAP_functor<2, HYPRE_Int> func2(num_cols, 0, map_offd_to_C); #if defined(HYPRE_USING_SYCL) HYPRE_ONEDPL_CALL( std::transform, hypre_CSRMatrixJ(Cbar_local), hypre_CSRMatrixJ(Cbar_local) + local_nnz_Cbar, hypre_CSRMatrixJ(Cbar_local), func2 ); #else HYPRE_THRUST_CALL( transform, hypre_CSRMatrixJ(Cbar_local), hypre_CSRMatrixJ(Cbar_local) + local_nnz_Cbar, hypre_CSRMatrixJ(Cbar_local), func2 ); #endif hypre_CSRMatrixNumCols(Cbar_local) = num_cols + num_cols_offd_C; hypre_TFree(big_work, HYPRE_MEMORY_DEVICE); hypre_TFree(work, HYPRE_MEMORY_DEVICE); hypre_TFree(map_offd_to_C, HYPRE_MEMORY_DEVICE); hypre_TFree(Cext_bigj, HYPRE_MEMORY_DEVICE); hypre_CSRMatrixBigJ(Cext) = NULL; #if PARCSRGEMM_TIMING > 1 hypre_ForceSyncComputeStream(); t2 = hypre_MPI_Wtime() - t1; hypre_ParPrintf(comm, "Time PartialAdd1 %f\n", t2); #endif #if PARCSRGEMM_TIMING > 1 t1 = hypre_MPI_Wtime(); #endif // IE = [I, E] hypre_ParCSRCommPkgCopySendMapElmtsToDevice(comm_pkg); HYPRE_Int num_sends = hypre_ParCSRCommPkgNumSends(comm_pkg); HYPRE_Int num_elemt = hypre_ParCSRCommPkgSendMapStart(comm_pkg, num_sends); HYPRE_Int *send_map = hypre_ParCSRCommPkgDeviceSendMapElmts(comm_pkg); hypre_CSRMatrix *IE = hypre_CSRMatrixCreate(num_rows, num_rows + num_elemt, num_rows + num_elemt); hypre_CSRMatrixMemoryLocation(IE) = HYPRE_MEMORY_DEVICE; HYPRE_Int *ie_ii = hypre_TAlloc(HYPRE_Int, num_rows + num_elemt, HYPRE_MEMORY_DEVICE); HYPRE_Int *ie_j = hypre_TAlloc(HYPRE_Int, num_rows + num_elemt, HYPRE_MEMORY_DEVICE); HYPRE_Complex *ie_a = NULL; if (hypre_HandleSpgemmUseVendor(hypre_handle())) { ie_a = hypre_TAlloc(HYPRE_Complex, num_rows + num_elemt, HYPRE_MEMORY_DEVICE); #if defined(HYPRE_USING_SYCL) HYPRE_ONEDPL_CALL(std::fill, ie_a, ie_a + num_rows + num_elemt, 1.0); #else HYPRE_THRUST_CALL(fill, ie_a, ie_a + num_rows + num_elemt, 1.0); #endif } #if defined(HYPRE_USING_SYCL) hypreSycl_sequence(ie_ii, ie_ii + num_rows, 0); HYPRE_ONEDPL_CALL( std::copy, send_map, send_map + num_elemt, ie_ii + num_rows); hypreSycl_sequence(ie_j, ie_j + num_rows + num_elemt, 0); auto zipped_begin = oneapi::dpl::make_zip_iterator(ie_ii, ie_j); HYPRE_ONEDPL_CALL( std::stable_sort, zipped_begin, zipped_begin + num_rows + num_elemt, [](auto lhs, auto rhs) { return std::get<0>(lhs) < std::get<0>(rhs); } ); #else HYPRE_THRUST_CALL( sequence, ie_ii, ie_ii + num_rows); HYPRE_THRUST_CALL( copy, send_map, send_map + num_elemt, ie_ii + num_rows); HYPRE_THRUST_CALL( sequence, ie_j, ie_j + num_rows + num_elemt); HYPRE_THRUST_CALL( stable_sort_by_key, ie_ii, ie_ii + num_rows + num_elemt, ie_j ); #endif HYPRE_Int *ie_i = hypreDevice_CsrRowIndicesToPtrs(num_rows, num_rows + num_elemt, ie_ii); hypre_TFree(ie_ii, HYPRE_MEMORY_DEVICE); hypre_CSRMatrixI(IE) = ie_i; hypre_CSRMatrixJ(IE) = ie_j; hypre_CSRMatrixData(IE) = ie_a; // CC = [Cbar_local; Cext] hypre_CSRMatrix *CC = hypre_CSRMatrixStack2Device(Cbar_local, Cext); hypre_CSRMatrixDestroy(Cbar); hypre_CSRMatrixDestroy(Cext); #if PARCSRGEMM_TIMING > 1 hypre_ForceSyncComputeStream(); t2 = hypre_MPI_Wtime() - t1; hypre_ParPrintf(comm, "Time PartialAdd2 %f\n", t2); #endif // Cz = IE * CC #if PARCSRGEMM_TIMING > 1 t1 = hypre_MPI_Wtime(); #endif Cz = hypre_CSRMatrixMultiplyDevice(IE, CC); hypre_CSRMatrixDestroy(IE); hypre_CSRMatrixDestroy(CC); #if PARCSRGEMM_TIMING > 1 hypre_ForceSyncComputeStream(); t2 = hypre_MPI_Wtime() - t1; hypre_ParPrintf(comm, "Time PartialAdd-SpGemm %f\n", t2); #endif } #if PARCSRGEMM_TIMING > 1 t1 = hypre_MPI_Wtime(); #endif // split into diag and offd HYPRE_Int local_nnz_C = hypre_CSRMatrixNumNonzeros(Cz); HYPRE_Int *zmp_i = hypreDevice_CsrRowPtrsToIndices(num_rows, local_nnz_C, hypre_CSRMatrixI(Cz)); HYPRE_Int *zmp_j = hypre_CSRMatrixJ(Cz); HYPRE_Complex *zmp_a = hypre_CSRMatrixData(Cz); in_range pred(0, num_cols - 1); #if defined(HYPRE_USING_SYCL) HYPRE_Int nnz_C_diag = HYPRE_ONEDPL_CALL( std::count_if, zmp_j, zmp_j + local_nnz_C, pred ); #else HYPRE_Int nnz_C_diag = HYPRE_THRUST_CALL( count_if, zmp_j, zmp_j + local_nnz_C, pred ); #endif HYPRE_Int nnz_C_offd = local_nnz_C - nnz_C_diag; // diag hypre_CSRMatrix *C_diag = hypre_CSRMatrixCreate(num_rows, num_cols, nnz_C_diag); hypre_CSRMatrixInitialize_v2(C_diag, 0, HYPRE_MEMORY_DEVICE); HYPRE_Int *C_diag_ii = hypre_TAlloc(HYPRE_Int, nnz_C_diag, HYPRE_MEMORY_DEVICE); HYPRE_Int *C_diag_j = hypre_CSRMatrixJ(C_diag); HYPRE_Complex *C_diag_a = hypre_CSRMatrixData(C_diag); #if defined(HYPRE_USING_SYCL) auto new_end = hypreSycl_copy_if( oneapi::dpl::make_zip_iterator(zmp_i, zmp_j, zmp_a), oneapi::dpl::make_zip_iterator(zmp_i, zmp_j, zmp_a) + local_nnz_C, zmp_j, oneapi::dpl::make_zip_iterator(C_diag_ii, C_diag_j, C_diag_a), pred ); hypre_assert( std::get<0>(new_end.base()) == C_diag_ii + nnz_C_diag ); #else auto new_end = HYPRE_THRUST_CALL( copy_if, thrust::make_zip_iterator(thrust::make_tuple(zmp_i, zmp_j, zmp_a)), thrust::make_zip_iterator(thrust::make_tuple(zmp_i, zmp_j, zmp_a)) + local_nnz_C, zmp_j, thrust::make_zip_iterator(thrust::make_tuple(C_diag_ii, C_diag_j, C_diag_a)), pred ); hypre_assert( thrust::get<0>(new_end.get_iterator_tuple()) == C_diag_ii + nnz_C_diag ); #endif hypreDevice_CsrRowIndicesToPtrs_v2(hypre_CSRMatrixNumRows(C_diag), nnz_C_diag, C_diag_ii, hypre_CSRMatrixI(C_diag)); hypre_TFree(C_diag_ii, HYPRE_MEMORY_DEVICE); // offd hypre_CSRMatrix *C_offd = hypre_CSRMatrixCreate(num_rows, num_cols_offd_C, nnz_C_offd); hypre_CSRMatrixInitialize_v2(C_offd, 0, HYPRE_MEMORY_DEVICE); HYPRE_Int *C_offd_ii = hypre_TAlloc(HYPRE_Int, nnz_C_offd, HYPRE_MEMORY_DEVICE); HYPRE_Int *C_offd_j = hypre_CSRMatrixJ(C_offd); HYPRE_Complex *C_offd_a = hypre_CSRMatrixData(C_offd); #if defined(HYPRE_USING_SYCL) new_end = hypreSycl_copy_if( oneapi::dpl::make_zip_iterator(zmp_i, zmp_j, zmp_a), oneapi::dpl::make_zip_iterator(zmp_i, zmp_j, zmp_a) + local_nnz_C, zmp_j, oneapi::dpl::make_zip_iterator(C_offd_ii, C_offd_j, C_offd_a), std::not_fn(pred) ); hypre_assert( std::get<0>(new_end.base()) == C_offd_ii + nnz_C_offd ); #else new_end = HYPRE_THRUST_CALL( copy_if, thrust::make_zip_iterator(thrust::make_tuple(zmp_i, zmp_j, zmp_a)), thrust::make_zip_iterator(thrust::make_tuple(zmp_i, zmp_j, zmp_a)) + local_nnz_C, zmp_j, thrust::make_zip_iterator(thrust::make_tuple(C_offd_ii, C_offd_j, C_offd_a)), HYPRE_THRUST_NOT(pred) ); hypre_assert( thrust::get<0>(new_end.get_iterator_tuple()) == C_offd_ii + nnz_C_offd ); #endif hypreDevice_CsrRowIndicesToPtrs_v2(hypre_CSRMatrixNumRows(C_offd), nnz_C_offd, C_offd_ii, hypre_CSRMatrixI(C_offd)); hypre_TFree(C_offd_ii, HYPRE_MEMORY_DEVICE); #if defined(HYPRE_USING_SYCL) HYPRE_ONEDPL_CALL( std::transform, C_offd_j, C_offd_j + nnz_C_offd, C_offd_j, [const_val = num_cols] (const auto & x) {return x - const_val;} ); #else HYPRE_THRUST_CALL( transform, C_offd_j, C_offd_j + nnz_C_offd, thrust::make_constant_iterator(num_cols), C_offd_j, thrust::minus() ); #endif // free hypre_TFree(Cbar_local, HYPRE_MEMORY_HOST); hypre_TFree(zmp_i, HYPRE_MEMORY_DEVICE); if (!Cext_nnz) { hypre_CSRMatrixDestroy(Cbar); hypre_CSRMatrixDestroy(Cext); } else { hypre_CSRMatrixDestroy(Cz); } #if PARCSRGEMM_TIMING > 1 hypre_ForceSyncComputeStream(); t2 = hypre_MPI_Wtime() - t1; hypre_ParPrintf(comm, "Time Split %f\n", t2); #endif // output *C_diag_ptr = C_diag; *C_offd_ptr = C_offd; *num_cols_offd_C_ptr = num_cols_offd_C; *col_map_offd_C_ptr = col_map_offd_C; return hypre_error_flag; } #endif /* #if defined(HYPRE_USING_GPU) */ hypre-2.33.0/src/parcsr_mv/par_make_system.c000066400000000000000000000363121477326011500210530ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "_hypre_parcsr_mv.h" /* This routine takes as input 2 parcsr matrices L1 and L2 (and the corresponding initial guess and rhs), and creates the system M*[L1 0; 0 L2] x = [ x1; x2] b = [b1; b2]. The entries of M are M = [m11 m12; m21 m22] and should be given as M_vals = [m11 m12 m21 m22]; So we return A = [ m11L1 m12L2; m21L1 m22L2] We assume that L1 and L2 are the same size, both square, and partitioned the same. We also assume that m11 and m22 are nonzero. To Do: This function could be easily extended to create a system with 3 or even N unknowns */ HYPRE_ParCSR_System_Problem * HYPRE_Generate2DSystem(HYPRE_ParCSRMatrix H_L1, HYPRE_ParCSRMatrix H_L2, HYPRE_ParVector H_b1, HYPRE_ParVector H_b2, HYPRE_ParVector H_x1, HYPRE_ParVector H_x2, HYPRE_Complex* M_vals) { HYPRE_ParCSR_System_Problem *sys_prob; hypre_ParCSRMatrix *A; hypre_ParCSRMatrix *L1 = (hypre_ParCSRMatrix*) H_L1; hypre_ParCSRMatrix *L2 = (hypre_ParCSRMatrix*) H_L2; hypre_CSRMatrix *A_diag; hypre_CSRMatrix *A_offd; hypre_ParVector *x, *b; hypre_ParVector *b1 = (hypre_ParVector*) H_b1; hypre_ParVector *b2 = (hypre_ParVector*) H_b2; hypre_ParVector *x1 = (hypre_ParVector*) H_x1; hypre_ParVector *x2 = (hypre_ParVector*) H_x2; HYPRE_Complex *b_data, *x_data; HYPRE_Int dim = 2; HYPRE_Complex m11, m12, m21, m22; MPI_Comm comm = hypre_ParCSRMatrixComm(L1); HYPRE_BigInt L_n = hypre_ParCSRMatrixGlobalNumRows(L1); HYPRE_BigInt n; HYPRE_Int num_procs, i; HYPRE_BigInt *L_row_starts = hypre_ParCSRMatrixRowStarts(L1); hypre_CSRMatrix *L1_diag = hypre_ParCSRMatrixDiag(L1); hypre_CSRMatrix *L1_offd = hypre_ParCSRMatrixOffd(L1); hypre_CSRMatrix *L2_diag = hypre_ParCSRMatrixDiag(L2); hypre_CSRMatrix *L2_offd = hypre_ParCSRMatrixOffd(L2); HYPRE_Complex *L1_diag_data = hypre_CSRMatrixData(L1_diag); HYPRE_Int *L1_diag_i = hypre_CSRMatrixI(L1_diag); HYPRE_Int *L1_diag_j = hypre_CSRMatrixJ(L1_diag); HYPRE_Complex *L2_diag_data = hypre_CSRMatrixData(L2_diag); HYPRE_Int *L2_diag_i = hypre_CSRMatrixI(L2_diag); HYPRE_Int *L2_diag_j = hypre_CSRMatrixJ(L2_diag); HYPRE_Complex *L1_offd_data = hypre_CSRMatrixData(L1_offd); HYPRE_Int *L1_offd_i = hypre_CSRMatrixI(L1_offd); HYPRE_Int *L1_offd_j = hypre_CSRMatrixJ(L1_offd); HYPRE_Complex *L2_offd_data = hypre_CSRMatrixData(L2_offd); HYPRE_Int *L2_offd_i = hypre_CSRMatrixI(L2_offd); HYPRE_Int *L2_offd_j = hypre_CSRMatrixJ(L2_offd); HYPRE_Int L1_num_cols_offd = hypre_CSRMatrixNumCols(L1_offd); HYPRE_Int L2_num_cols_offd = hypre_CSRMatrixNumCols(L2_offd); HYPRE_Int L1_nnz_diag = hypre_CSRMatrixNumNonzeros(L1_diag); HYPRE_Int L1_nnz_offd = hypre_CSRMatrixNumNonzeros(L1_offd); HYPRE_Int L2_nnz_diag = hypre_CSRMatrixNumNonzeros(L2_diag); HYPRE_Int L2_nnz_offd = hypre_CSRMatrixNumNonzeros(L2_offd); HYPRE_BigInt *L1_col_map_offd = hypre_ParCSRMatrixColMapOffd(L1); HYPRE_BigInt *L2_col_map_offd = hypre_ParCSRMatrixColMapOffd(L2); HYPRE_BigInt A_row_starts[2]; HYPRE_BigInt A_col_starts[2]; HYPRE_BigInt *A_col_map_offd = NULL; HYPRE_Int A_nnz_diag, A_nnz_offd, A_num_cols_offd; HYPRE_Int *A_diag_i, *A_diag_j, *A_offd_i, *A_offd_j; HYPRE_Complex *A_diag_data, *A_offd_data; /* initialize stuff */ m11 = M_vals[0]; m12 = M_vals[1]; m21 = M_vals[2]; m22 = M_vals[3]; hypre_MPI_Comm_size(comm, &num_procs); sys_prob = hypre_CTAlloc(HYPRE_ParCSR_System_Problem, 1, HYPRE_MEMORY_HOST); /* global number of variables */ n = L_n * (HYPRE_BigInt)dim; /* global row/col starts */ for (i = 0; i < 2; i++) { A_row_starts[i] = L_row_starts[i] * (HYPRE_BigInt)dim; A_col_starts[i] = L_row_starts[i] * (HYPRE_BigInt)dim; } /***** first we will do the diag part ******/ { HYPRE_Int L_num_rows, A_num_rows; HYPRE_Int num1, num2, A_j_count; HYPRE_Int k, L1_j_count, L2_j_count; L_num_rows = hypre_CSRMatrixNumRows(L1_diag); A_num_rows = L_num_rows * dim; /* assume m11 and m22 are nonzero */ A_nnz_diag = L1_nnz_diag + L2_nnz_diag; if (m12) { A_nnz_diag += L2_nnz_diag; } if (m21) { A_nnz_diag += L1_nnz_diag; } A_diag_i = hypre_CTAlloc(HYPRE_Int, A_num_rows + 1, HYPRE_MEMORY_HOST); A_diag_j = hypre_CTAlloc(HYPRE_Int, A_nnz_diag, HYPRE_MEMORY_HOST); A_diag_data = hypre_CTAlloc(HYPRE_Complex, A_nnz_diag, HYPRE_MEMORY_HOST); A_diag_i[0] = 0; A_j_count = 0; L1_j_count = 0; L2_j_count = 0; for (i = 0; i < L_num_rows; i++) { num1 = L1_diag_i[i + 1] - L1_diag_i[i]; num2 = (L2_diag_i[i + 1] - L2_diag_i[i]); /* unknown 1*/ if (m12 == 0.0) { A_diag_i[i * 2 + 1] = num1 + A_diag_i[i * 2]; for (k = 0; k < num1; k++) { A_diag_j[A_j_count + k] = dim * L1_diag_j[L1_j_count + k]; A_diag_data[A_j_count + k] = m11 * L1_diag_data[L1_j_count + k]; } A_j_count += num1; } else /* m12 is nonzero */ { A_diag_i[i * 2 + 1] = num1 + num2 + A_diag_i[i * 2]; for (k = 0; k < num1; k++) { A_diag_j[A_j_count + k] = dim * L1_diag_j[L1_j_count + k]; A_diag_data[A_j_count + k] = m11 * L1_diag_data[L1_j_count + k]; } A_j_count += num1; for (k = 0; k < num2; k++) { A_diag_j[A_j_count + k] = 1 + dim * L2_diag_j[L2_j_count + k]; A_diag_data[A_j_count + k] = m12 * L2_diag_data[L2_j_count + k]; } A_j_count += num2; /* don't increment the j_count for L1 and L2 until after doing the next unknown */ } /* end unknown 1 */ /* unknown 2*/ if (m21 == 0.0) { A_diag_i[i * 2 + 2] = num2 + A_diag_i[i * 2 + 1]; for (k = 0; k < num2; k++) { A_diag_j[A_j_count + k] = 1 + dim * L2_diag_j[L2_j_count + k]; A_diag_data[A_j_count + k] = m22 * L2_diag_data[L2_j_count + k]; } A_j_count += num2; } else /* m21 is nonzero */ { A_diag_i[i * 2 + 2] = num1 + num2 + A_diag_i[i * 2 + 1]; for (k = 0; k < num2; k++) { A_diag_j[A_j_count + k] = 1 + dim * L2_diag_j[L2_j_count + k]; A_diag_data[A_j_count + k] = m22 * L2_diag_data[L2_j_count + k]; } A_j_count += num2; for (k = 0; k < num1; k++) { A_diag_j[A_j_count + k] = dim * L1_diag_j[L1_j_count + k]; A_diag_data[A_j_count + k] = m21 * L1_diag_data[L1_j_count + k]; } A_j_count += num1; } /* end unknown 2 */ L1_j_count += num1; L2_j_count += num2; } /* end of for each row loop....*/ }/* end of diag part of A*/ /**** off-diag part of A ******/ { HYPRE_Int L_num_rows, A_num_rows; HYPRE_Int *L1_map_to_new, *L2_map_to_new; HYPRE_BigInt ent1, ent2; HYPRE_Int tmp_i, num1, num2; HYPRE_Int L1_map_count, L2_map_count; HYPRE_Int k, L1_j_count, L2_j_count, A_j_count; L_num_rows = hypre_CSRMatrixNumRows(L1_offd); A_num_rows = L_num_rows * dim; A_nnz_offd = L1_nnz_offd + L2_nnz_offd; if (m12) { A_nnz_offd += L2_nnz_offd; } if (m21) { A_nnz_offd += L1_nnz_offd; } A_num_cols_offd = L1_num_cols_offd + L2_num_cols_offd; A_offd_i = hypre_CTAlloc(HYPRE_Int, A_num_rows + 1, HYPRE_MEMORY_HOST); A_offd_j = hypre_CTAlloc(HYPRE_Int, A_nnz_offd, HYPRE_MEMORY_HOST); A_offd_data = hypre_CTAlloc(HYPRE_Complex, A_nnz_offd, HYPRE_MEMORY_HOST); A_col_map_offd = hypre_CTAlloc(HYPRE_BigInt, A_num_cols_offd, HYPRE_MEMORY_HOST); L1_map_to_new = hypre_CTAlloc(HYPRE_Int, L1_num_cols_offd, HYPRE_MEMORY_HOST); L2_map_to_new = hypre_CTAlloc(HYPRE_Int, L2_num_cols_offd, HYPRE_MEMORY_HOST); /* For offd, the j index is a local numbering and then the col_map is global - so first we will adjust the numbering of the 2 col maps and merge the two col. maps - these need to be in ascending order */ L1_map_count = 0; L2_map_count = 0; for (i = 0; i < A_num_cols_offd; i++) { if (L1_map_count < L1_num_cols_offd && L2_map_count < L2_num_cols_offd) { ent1 = L1_col_map_offd[L1_map_count] * 2; ent2 = L2_col_map_offd[L2_map_count] * 2 + 1; if (ent1 < ent2) { A_col_map_offd[i] = ent1; L1_map_to_new[L1_map_count++] = i; } else { A_col_map_offd[i] = ent2; L2_map_to_new[L2_map_count++] = i; } } else if (L1_map_count >= L1_num_cols_offd) { ent2 = L2_col_map_offd[L2_map_count] * 2 + 1; A_col_map_offd[i] = ent2; L2_map_to_new[L2_map_count++] = i; } else if (L2_map_count >= L2_num_cols_offd) { ent1 = L1_col_map_offd[L1_map_count] * 2; A_col_map_offd[i] = ent1; L1_map_to_new[L1_map_count++] = i; } else { hypre_error(HYPRE_ERROR_GENERIC); } } /* now go through the rows */ A_j_count = 0; L1_j_count = 0; L2_j_count = 0; A_offd_i[0] = 0; for (i = 0; i < L_num_rows; i++) { num1 = L1_offd_i[i + 1] - L1_offd_i[i]; num2 = (L2_offd_i[i + 1] - L2_offd_i[i]); /* unknown 1*/ if (m12 == 0.0) { A_offd_i[i * 2 + 1] = num1 + A_offd_i[i * 2]; for (k = 0; k < num1; k++) { tmp_i = L1_offd_j[L1_j_count + k]; A_offd_j[A_j_count + k] = L1_map_to_new[tmp_i]; A_offd_data[A_j_count + k] = m11 * L1_offd_data[L1_j_count + k]; } A_j_count += num1; } else /* m12 is nonzero */ { A_offd_i[i * 2 + 1] = num1 + num2 + A_offd_i[i * 2]; for (k = 0; k < num1; k++) { tmp_i = L1_offd_j[L1_j_count + k]; A_offd_j[A_j_count + k] = L1_map_to_new[tmp_i]; A_offd_data[A_j_count + k] = m11 * L1_offd_data[L1_j_count + k]; } A_j_count += num1; for (k = 0; k < num2; k++) { tmp_i = L2_offd_j[L2_j_count + k]; A_offd_j[A_j_count + k] = L2_map_to_new[tmp_i]; A_offd_data[A_j_count + k] = m12 * L2_offd_data[L2_j_count + k]; } A_j_count += num2; } /* end unknown 1 */ /* unknown 2*/ if (m21 == 0.0) { A_offd_i[i * 2 + 2] = num2 + A_offd_i[i * 2 + 1]; for (k = 0; k < num2; k++) { tmp_i = L2_offd_j[L2_j_count + k]; A_offd_j[A_j_count + k] = L2_map_to_new[tmp_i]; A_offd_data[A_j_count + k] = m22 * L2_offd_data[L2_j_count + k]; } A_j_count += num2; } else /* m21 is nonzero */ { A_offd_i[i * 2 + 2] = num1 + num2 + A_offd_i[i * 2 + 1]; for (k = 0; k < num2; k++) { tmp_i = L2_offd_j[L2_j_count + k]; A_offd_j[A_j_count + k] = L2_map_to_new[tmp_i]; A_offd_data[A_j_count + k] = m22 * L2_offd_data[L2_j_count + k]; } A_j_count += num2; for (k = 0; k < num1; k++) { tmp_i = L1_offd_j[L1_j_count + k]; A_offd_j[A_j_count + k] = L1_map_to_new[tmp_i]; A_offd_data[A_j_count + k] = m21 * L1_offd_data[L1_j_count + k]; } A_j_count += num1; } /* end unknown 2 */ L1_j_count += num1; L2_j_count += num2; } /* end of for each row loop....*/ hypre_TFree(L1_map_to_new, HYPRE_MEMORY_HOST); hypre_TFree(L2_map_to_new, HYPRE_MEMORY_HOST); } /* end of offd part */ /* create A*/ { A = hypre_ParCSRMatrixCreate(comm, n, n, A_row_starts, A_col_starts, A_num_cols_offd, A_nnz_diag, A_nnz_offd); A_diag = hypre_ParCSRMatrixDiag(A); hypre_CSRMatrixData(A_diag) = A_diag_data; hypre_CSRMatrixI(A_diag) = A_diag_i; hypre_CSRMatrixJ(A_diag) = A_diag_j; A_offd = hypre_ParCSRMatrixOffd(A); hypre_CSRMatrixData(A_offd) = A_offd_data; hypre_CSRMatrixI(A_offd) = A_offd_i; hypre_CSRMatrixJ(A_offd) = A_offd_j; hypre_ParCSRMatrixColMapOffd(A) = A_col_map_offd; hypre_ParCSRMatrixSetNumNonzeros(A); } /* create b */ { hypre_Vector *b1_local = hypre_ParVectorLocalVector(b1); hypre_Vector *b2_local = hypre_ParVectorLocalVector(b2); HYPRE_Int size = hypre_VectorSize(b1_local); HYPRE_Complex *b1_data = hypre_VectorData(b1_local); HYPRE_Complex *b2_data = hypre_VectorData(b2_local); b_data = hypre_CTAlloc(HYPRE_Complex, size * 2, HYPRE_MEMORY_HOST); for (i = 0; i < size; i++) { b_data[i * 2] = b1_data[i]; b_data[i * 2 + 1] = b2_data[i]; } b = hypre_ParVectorCreate( comm, n, A_row_starts); hypre_ParVectorInitialize(b); hypre_TFree(hypre_VectorData(hypre_ParVectorLocalVector(b)), HYPRE_MEMORY_HOST); hypre_VectorData(hypre_ParVectorLocalVector(b)) = b_data; hypre_ParVectorSetDataOwner(b, 1); } /* create x */ { hypre_Vector *x1_local = hypre_ParVectorLocalVector(x1); hypre_Vector *x2_local = hypre_ParVectorLocalVector(x2); HYPRE_Int size = hypre_VectorSize(x1_local); HYPRE_Complex *x1_data = hypre_VectorData(x1_local); HYPRE_Complex *x2_data = hypre_VectorData(x2_local); x_data = hypre_CTAlloc(HYPRE_Complex, size * 2, HYPRE_MEMORY_HOST); for (i = 0; i < size; i++) { x_data[i * 2] = x1_data[i]; x_data[i * 2 + 1] = x2_data[i]; } x = hypre_ParVectorCreate( comm, n, A_row_starts); hypre_ParVectorInitialize(x); hypre_TFree(hypre_VectorData(hypre_ParVectorLocalVector(x)), HYPRE_MEMORY_HOST); hypre_VectorData(hypre_ParVectorLocalVector(x)) = x_data; hypre_ParVectorSetDataOwner(x, 1); } sys_prob->A = A; sys_prob->x = x; sys_prob->b = b; return sys_prob; } HYPRE_Int HYPRE_Destroy2DSystem( HYPRE_ParCSR_System_Problem *sys_prob) { hypre_ParCSRMatrixDestroy(sys_prob->A); hypre_ParVectorDestroy(sys_prob->b); hypre_ParVectorDestroy(sys_prob->x); hypre_TFree(sys_prob, HYPRE_MEMORY_HOST); return hypre_error_flag; } hypre-2.33.0/src/parcsr_mv/par_make_system.h000066400000000000000000000011121477326011500210460ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #ifndef hypre_PAR_MAKE_SYSTEM #define hypre_PAR_MAKE_SYSTEM typedef struct { hypre_ParCSRMatrix *A; hypre_ParVector *x; hypre_ParVector *b; } HYPRE_ParCSR_System_Problem; #endif /* hypre_PAR_MAKE_SYSTEM */ hypre-2.33.0/src/parcsr_mv/par_vector.c000066400000000000000000001415731477326011500200420ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * Member functions for hypre_Vector class. * *****************************************************************************/ #include "_hypre_parcsr_mv.h" HYPRE_Int hypre_FillResponseParToVectorAll(void*, HYPRE_Int, HYPRE_Int, void*, MPI_Comm, void**, HYPRE_Int*); /*-------------------------------------------------------------------------- * hypre_ParVectorCreate * * If create is called and partitioning is NOT null, then it is assumed that it * is array of length 2 containing the start row of the calling processor * followed by the start row of the next processor - AHB 6/05 *--------------------------------------------------------------------------*/ hypre_ParVector * hypre_ParVectorCreate( MPI_Comm comm, HYPRE_BigInt global_size, HYPRE_BigInt *partitioning_in ) { hypre_ParVector *vector; HYPRE_Int num_procs, my_id, local_size; HYPRE_BigInt partitioning[2]; if (global_size < 0) { hypre_error_in_arg(2); return NULL; } vector = hypre_CTAlloc(hypre_ParVector, 1, HYPRE_MEMORY_HOST); hypre_MPI_Comm_rank(comm, &my_id); if (!partitioning_in) { hypre_MPI_Comm_size(comm, &num_procs); hypre_GenerateLocalPartitioning(global_size, num_procs, my_id, partitioning); } else { partitioning[0] = partitioning_in[0]; partitioning[1] = partitioning_in[1]; } local_size = (HYPRE_Int) (partitioning[1] - partitioning[0]); hypre_ParVectorAssumedPartition(vector) = NULL; hypre_ParVectorComm(vector) = comm; hypre_ParVectorGlobalSize(vector) = global_size; hypre_ParVectorPartitioning(vector)[0] = partitioning[0]; hypre_ParVectorPartitioning(vector)[1] = partitioning[1]; hypre_ParVectorFirstIndex(vector) = hypre_ParVectorPartitioning(vector)[0]; hypre_ParVectorLastIndex(vector) = hypre_ParVectorPartitioning(vector)[1] - 1; hypre_ParVectorLocalVector(vector) = hypre_SeqVectorCreate(local_size); /* set defaults */ hypre_ParVectorOwnsData(vector) = 1; hypre_ParVectorActualLocalSize(vector) = 0; return vector; } /*-------------------------------------------------------------------------- * hypre_ParMultiVectorCreate *--------------------------------------------------------------------------*/ hypre_ParVector * hypre_ParMultiVectorCreate( MPI_Comm comm, HYPRE_BigInt global_size, HYPRE_BigInt *partitioning, HYPRE_Int num_vectors ) { /* note that global_size is the global length of a single vector */ hypre_ParVector *vector = hypre_ParVectorCreate( comm, global_size, partitioning ); hypre_ParVectorNumVectors(vector) = num_vectors; return vector; } /*-------------------------------------------------------------------------- * hypre_ParVectorDestroy *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ParVectorDestroy( hypre_ParVector *vector ) { if (vector) { if ( hypre_ParVectorOwnsData(vector) ) { hypre_SeqVectorDestroy(hypre_ParVectorLocalVector(vector)); } if (hypre_ParVectorAssumedPartition(vector)) { hypre_AssumedPartitionDestroy(hypre_ParVectorAssumedPartition(vector)); } hypre_TFree(vector, HYPRE_MEMORY_HOST); } return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_ParVectorInitializeShell *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ParVectorInitializeShell(hypre_ParVector *vector) { if (!vector) { hypre_error_in_arg(1); return hypre_error_flag; } hypre_Vector *local_vector = hypre_ParVectorLocalVector(vector); hypre_SeqVectorInitializeShell(local_vector); hypre_ParVectorActualLocalSize(vector) = hypre_VectorSize(local_vector); return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_ParVectorSetData *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ParVectorSetData(hypre_ParVector *vector, HYPRE_Complex *data) { hypre_SeqVectorSetData(hypre_ParVectorLocalVector(vector), data); return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_ParVectorInitialize_v2 * * Initialize a hypre_ParVector at a given memory location *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ParVectorInitialize_v2( hypre_ParVector *vector, HYPRE_MemoryLocation memory_location ) { hypre_Vector *local_vector = hypre_ParVectorLocalVector(vector); hypre_ParVectorInitializeShell(vector); hypre_SeqVectorInitialize_v2(local_vector, memory_location); return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_ParVectorInitialize *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ParVectorInitialize( hypre_ParVector *vector ) { return hypre_ParVectorInitialize_v2(vector, hypre_ParVectorMemoryLocation(vector)); } /*-------------------------------------------------------------------------- * hypre_ParVectorSetComponent * * Set the identifier of the active component of a hypre_ParVector for the * purpose of Set/AddTo/Get values functions. *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ParVectorSetComponent( hypre_ParVector *vector, HYPRE_Int component ) { hypre_Vector *local_vector = hypre_ParVectorLocalVector(vector); hypre_VectorComponent(local_vector) = component; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_ParVectorSetDataOwner *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ParVectorSetDataOwner( hypre_ParVector *vector, HYPRE_Int owns_data ) { if (!vector) { hypre_error_in_arg(1); return hypre_error_flag; } hypre_ParVectorOwnsData(vector) = owns_data; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_ParVectorSetLocalSize *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ParVectorSetLocalSize( hypre_ParVector *vector, HYPRE_Int local_size ) { hypre_Vector *local_vector = hypre_ParVectorLocalVector(vector); hypre_SeqVectorSetSize(local_vector, local_size); return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_ParVectorSetNumVectors * call before calling hypre_ParVectorInitialize * probably this will do more harm than good, use hypre_ParMultiVectorCreate *--------------------------------------------------------------------------*/ #if 0 HYPRE_Int hypre_ParVectorSetNumVectors( hypre_ParVector *vector, HYPRE_Int num_vectors ) { HYPRE_Int ierr = 0; hypre_Vector *local_vector = hypre_ParVectorLocalVector(v); hypre_SeqVectorSetNumVectors( local_vector, num_vectors ); return ierr; } #endif /*-------------------------------------------------------------------------- * hypre_ParVectorResize *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ParVectorResize( hypre_ParVector *vector, HYPRE_Int num_vectors ) { if (vector) { hypre_SeqVectorResize(hypre_ParVectorLocalVector(vector), num_vectors); } return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_ParVectorRead *--------------------------------------------------------------------------*/ hypre_ParVector* hypre_ParVectorRead( MPI_Comm comm, const char *file_name ) { char new_file_name[256]; hypre_ParVector *par_vector; HYPRE_Int my_id; HYPRE_BigInt partitioning[2]; HYPRE_BigInt global_size; FILE *fp; hypre_MPI_Comm_rank(comm, &my_id); hypre_sprintf(new_file_name, "%s.INFO.%d", file_name, my_id); fp = fopen(new_file_name, "r"); hypre_fscanf(fp, "%b\n", &global_size); hypre_fscanf(fp, "%b\n", &partitioning[0]); hypre_fscanf(fp, "%b\n", &partitioning[1]); fclose (fp); par_vector = hypre_CTAlloc(hypre_ParVector, 1, HYPRE_MEMORY_HOST); hypre_ParVectorComm(par_vector) = comm; hypre_ParVectorGlobalSize(par_vector) = global_size; hypre_ParVectorFirstIndex(par_vector) = partitioning[0]; hypre_ParVectorLastIndex(par_vector) = partitioning[1] - 1; hypre_ParVectorPartitioning(par_vector)[0] = partitioning[0]; hypre_ParVectorPartitioning(par_vector)[1] = partitioning[1]; hypre_ParVectorOwnsData(par_vector) = 1; hypre_sprintf(new_file_name, "%s.%d", file_name, my_id); hypre_ParVectorLocalVector(par_vector) = hypre_SeqVectorRead(new_file_name); /* multivector code not written yet */ hypre_assert( hypre_ParVectorNumVectors(par_vector) == 1 ); return par_vector; } /*-------------------------------------------------------------------------- * hypre_ParVectorPrint *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ParVectorPrint( hypre_ParVector *vector, const char *file_name ) { char new_file_name[256]; hypre_Vector *local_vector; MPI_Comm comm; HYPRE_Int my_id; HYPRE_BigInt *partitioning; HYPRE_BigInt global_size; FILE *fp; if (!vector) { hypre_error_in_arg(1); return hypre_error_flag; } local_vector = hypre_ParVectorLocalVector(vector); comm = hypre_ParVectorComm(vector); partitioning = hypre_ParVectorPartitioning(vector); global_size = hypre_ParVectorGlobalSize(vector); hypre_MPI_Comm_rank(comm, &my_id); hypre_sprintf(new_file_name, "%s.%d", file_name, my_id); hypre_SeqVectorPrint(local_vector, new_file_name); hypre_sprintf(new_file_name, "%s.INFO.%d", file_name, my_id); fp = fopen(new_file_name, "w"); hypre_fprintf(fp, "%b\n", global_size); hypre_fprintf(fp, "%b\n", partitioning[0]); hypre_fprintf(fp, "%b\n", partitioning[1]); fclose(fp); return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_ParVectorSetConstantValues *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ParVectorSetConstantValues( hypre_ParVector *v, HYPRE_Complex value ) { hypre_Vector *v_local = hypre_ParVectorLocalVector(v); return hypre_SeqVectorSetConstantValues(v_local, value); } /*-------------------------------------------------------------------------- * hypre_ParVectorSetZeros *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ParVectorSetZeros( hypre_ParVector *v ) { hypre_ParVectorAllZeros(v) = 1; return hypre_ParVectorSetConstantValues(v, 0.0); } /*-------------------------------------------------------------------------- * hypre_ParVectorSetRandomValues *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ParVectorSetRandomValues( hypre_ParVector *v, HYPRE_Int seed ) { HYPRE_Int my_id; hypre_Vector *v_local = hypre_ParVectorLocalVector(v); MPI_Comm comm = hypre_ParVectorComm(v); hypre_MPI_Comm_rank(comm, &my_id); seed *= (my_id + 1); return hypre_SeqVectorSetRandomValues(v_local, seed); } /*-------------------------------------------------------------------------- * hypre_ParVectorCopy *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ParVectorCopy( hypre_ParVector *x, hypre_ParVector *y ) { hypre_Vector *x_local = hypre_ParVectorLocalVector(x); hypre_Vector *y_local = hypre_ParVectorLocalVector(y); return hypre_SeqVectorCopy(x_local, y_local); } /*-------------------------------------------------------------------------- * hypre_ParVectorStridedCopy *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ParVectorStridedCopy( hypre_ParVector *x, HYPRE_Int istride, HYPRE_Int ostride, HYPRE_Int size, HYPRE_Complex *data) { hypre_Vector *x_local = hypre_ParVectorLocalVector(x); return hypre_SeqVectorStridedCopy(x_local, istride, ostride, size, data); } /*-------------------------------------------------------------------------- * hypre_ParVectorCloneShallow * * Returns a complete copy of a hypre_ParVector x - a shallow copy, re-using * the partitioning and data arrays of x *--------------------------------------------------------------------------*/ hypre_ParVector * hypre_ParVectorCloneShallow( hypre_ParVector *x ) { hypre_ParVector * y = hypre_ParVectorCreate(hypre_ParVectorComm(x), hypre_ParVectorGlobalSize(x), hypre_ParVectorPartitioning(x)); hypre_ParVectorOwnsData(y) = 1; /* ...This vector owns its local vector, although the local vector doesn't * own _its_ data */ hypre_SeqVectorDestroy( hypre_ParVectorLocalVector(y) ); hypre_ParVectorLocalVector(y) = hypre_SeqVectorCloneShallow(hypre_ParVectorLocalVector(x) ); hypre_ParVectorFirstIndex(y) = hypre_ParVectorFirstIndex(x); return y; } /*-------------------------------------------------------------------------- * hypre_ParVectorCloneDeep_v2 *--------------------------------------------------------------------------*/ hypre_ParVector * hypre_ParVectorCloneDeep_v2( hypre_ParVector *x, HYPRE_MemoryLocation memory_location ) { hypre_ParVector *y = hypre_ParVectorCreate(hypre_ParVectorComm(x), hypre_ParVectorGlobalSize(x), hypre_ParVectorPartitioning(x)); hypre_ParVectorOwnsData(y) = 1; hypre_SeqVectorDestroy( hypre_ParVectorLocalVector(y) ); hypre_ParVectorLocalVector(y) = hypre_SeqVectorCloneDeep_v2( hypre_ParVectorLocalVector(x), memory_location ); hypre_ParVectorFirstIndex(y) = hypre_ParVectorFirstIndex(x); //RL: WHY HERE? return y; } /*-------------------------------------------------------------------------- * hypre_ParVectorMigrate *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ParVectorMigrate(hypre_ParVector *x, HYPRE_MemoryLocation memory_location) { if (!x) { return hypre_error_flag; } if ( hypre_GetActualMemLocation(memory_location) != hypre_GetActualMemLocation(hypre_ParVectorMemoryLocation(x)) ) { hypre_Vector *x_local = hypre_SeqVectorCloneDeep_v2(hypre_ParVectorLocalVector(x), memory_location); hypre_SeqVectorDestroy(hypre_ParVectorLocalVector(x)); hypre_ParVectorLocalVector(x) = x_local; } else { hypre_VectorMemoryLocation(hypre_ParVectorLocalVector(x)) = memory_location; } return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_ParVectorScale *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ParVectorScale( HYPRE_Complex alpha, hypre_ParVector *y ) { hypre_Vector *y_local = hypre_ParVectorLocalVector(y); return hypre_SeqVectorScale(alpha, y_local); } /*-------------------------------------------------------------------------- * hypre_ParVectorAxpy *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ParVectorAxpy( HYPRE_Complex alpha, hypre_ParVector *x, hypre_ParVector *y ) { hypre_Vector *x_local = hypre_ParVectorLocalVector(x); hypre_Vector *y_local = hypre_ParVectorLocalVector(y); return hypre_SeqVectorAxpy(alpha, x_local, y_local); } /*-------------------------------------------------------------------------- * hypre_ParVectorAxpyz *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ParVectorAxpyz( HYPRE_Complex alpha, hypre_ParVector *x, HYPRE_Complex beta, hypre_ParVector *y, hypre_ParVector *z ) { hypre_Vector *x_local = hypre_ParVectorLocalVector(x); hypre_Vector *y_local = hypre_ParVectorLocalVector(y); hypre_Vector *z_local = hypre_ParVectorLocalVector(z); return hypre_SeqVectorAxpyz(alpha, x_local, beta, y_local, z_local); } /*-------------------------------------------------------------------------- * hypre_ParVectorInnerProd *--------------------------------------------------------------------------*/ HYPRE_Real hypre_ParVectorInnerProd( hypre_ParVector *x, hypre_ParVector *y ) { MPI_Comm comm = hypre_ParVectorComm(x); hypre_Vector *x_local = hypre_ParVectorLocalVector(x); hypre_Vector *y_local = hypre_ParVectorLocalVector(y); HYPRE_Real result = 0.0; HYPRE_Real local_result = hypre_SeqVectorInnerProd(x_local, y_local); #ifdef HYPRE_PROFILE hypre_profile_times[HYPRE_TIMER_ID_ALL_REDUCE] -= hypre_MPI_Wtime(); #endif hypre_MPI_Allreduce(&local_result, &result, 1, HYPRE_MPI_REAL, hypre_MPI_SUM, comm); #ifdef HYPRE_PROFILE hypre_profile_times[HYPRE_TIMER_ID_ALL_REDUCE] += hypre_MPI_Wtime(); #endif return result; } /*-------------------------------------------------------------------------- * hypre_ParVectorElmdivpy * * y = y + x ./ b [MATLAB Notation] *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ParVectorElmdivpy( hypre_ParVector *x, hypre_ParVector *b, hypre_ParVector *y ) { hypre_Vector *x_local = hypre_ParVectorLocalVector(x); hypre_Vector *b_local = hypre_ParVectorLocalVector(b); hypre_Vector *y_local = hypre_ParVectorLocalVector(y); return hypre_SeqVectorElmdivpy(x_local, b_local, y_local); } /*-------------------------------------------------------------------------- * hypre_ParVectorElmdivpyMarked * * y[i] += x[i] / b[i] where marker[i] == marker_val *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ParVectorElmdivpyMarked( hypre_ParVector *x, hypre_ParVector *b, hypre_ParVector *y, HYPRE_Int *marker, HYPRE_Int marker_val ) { hypre_Vector *x_local = hypre_ParVectorLocalVector(x); hypre_Vector *b_local = hypre_ParVectorLocalVector(b); hypre_Vector *y_local = hypre_ParVectorLocalVector(y); return hypre_SeqVectorElmdivpyMarked(x_local, b_local, y_local, marker, marker_val); } /*-------------------------------------------------------------------------- * hypre_VectorToParVector * * Generates a ParVector from a Vector on proc 0 and distributes the pieces * to the other procs in comm *--------------------------------------------------------------------------*/ hypre_ParVector * hypre_VectorToParVector ( MPI_Comm comm, hypre_Vector *v, HYPRE_BigInt *vec_starts ) { HYPRE_BigInt global_size; HYPRE_BigInt *global_vec_starts = NULL; HYPRE_BigInt first_index; HYPRE_BigInt last_index; HYPRE_Int local_size; HYPRE_Int num_vectors; HYPRE_Int num_procs, my_id; HYPRE_Int global_vecstride, vecstride, idxstride; hypre_ParVector *par_vector; hypre_Vector *local_vector; HYPRE_Complex *v_data = NULL; HYPRE_Complex *local_data; hypre_MPI_Request *requests; hypre_MPI_Status *status, status0; HYPRE_Int i, j, k, p; hypre_MPI_Comm_size(comm, &num_procs); hypre_MPI_Comm_rank(comm, &my_id); if (my_id == 0) { global_size = (HYPRE_BigInt)hypre_VectorSize(v); v_data = hypre_VectorData(v); num_vectors = hypre_VectorNumVectors(v); /* for multivectors */ global_vecstride = hypre_VectorVectorStride(v); } hypre_MPI_Bcast(&global_size, 1, HYPRE_MPI_BIG_INT, 0, comm); hypre_MPI_Bcast(&num_vectors, 1, HYPRE_MPI_INT, 0, comm); hypre_MPI_Bcast(&global_vecstride, 1, HYPRE_MPI_INT, 0, comm); if (num_vectors == 1) { par_vector = hypre_ParVectorCreate(comm, global_size, vec_starts); } else { par_vector = hypre_ParMultiVectorCreate(comm, global_size, vec_starts, num_vectors); } vec_starts = hypre_ParVectorPartitioning(par_vector); first_index = hypre_ParVectorFirstIndex(par_vector); last_index = hypre_ParVectorLastIndex(par_vector); local_size = (HYPRE_Int)(last_index - first_index) + 1; if (my_id == 0) { global_vec_starts = hypre_CTAlloc(HYPRE_BigInt, num_procs + 1, HYPRE_MEMORY_HOST); } hypre_MPI_Gather(&first_index, 1, HYPRE_MPI_BIG_INT, global_vec_starts, 1, HYPRE_MPI_BIG_INT, 0, comm); if (my_id == 0) { global_vec_starts[num_procs] = hypre_ParVectorGlobalSize(par_vector); } hypre_ParVectorInitialize(par_vector); local_vector = hypre_ParVectorLocalVector(par_vector); local_data = hypre_VectorData(local_vector); vecstride = hypre_VectorVectorStride(local_vector); idxstride = hypre_VectorIndexStride(local_vector); /* so far the only implemented multivector StorageMethod is 0 */ hypre_assert( idxstride == 1 ); if (my_id == 0) { requests = hypre_CTAlloc(hypre_MPI_Request, num_vectors * (num_procs - 1), HYPRE_MEMORY_HOST); status = hypre_CTAlloc(hypre_MPI_Status, num_vectors * (num_procs - 1), HYPRE_MEMORY_HOST); k = 0; for (p = 1; p < num_procs; p++) for (j = 0; j < num_vectors; ++j) { hypre_MPI_Isend( &v_data[(HYPRE_Int) global_vec_starts[p]] + j * global_vecstride, (HYPRE_Int)(global_vec_starts[p + 1] - global_vec_starts[p]), HYPRE_MPI_COMPLEX, p, 0, comm, &requests[k++] ); } if (num_vectors == 1) { for (i = 0; i < local_size; i++) { local_data[i] = v_data[i]; } } else { for (j = 0; j < num_vectors; ++j) { for (i = 0; i < local_size; i++) { local_data[i + j * vecstride] = v_data[i + j * global_vecstride]; } } } hypre_MPI_Waitall(num_procs - 1, requests, status); hypre_TFree(requests, HYPRE_MEMORY_HOST); hypre_TFree(status, HYPRE_MEMORY_HOST); } else { for ( j = 0; j < num_vectors; ++j ) hypre_MPI_Recv( local_data + j * vecstride, local_size, HYPRE_MPI_COMPLEX, 0, 0, comm, &status0 ); } if (global_vec_starts) { hypre_TFree(global_vec_starts, HYPRE_MEMORY_HOST); } return par_vector; } /*-------------------------------------------------------------------------- * hypre_ParVectorToVectorAll *--------------------------------------------------------------------------*/ hypre_Vector * hypre_ParVectorToVectorAll( hypre_ParVector *par_v ) { return hypre_ParVectorToVectorAll_v2(par_v, hypre_ParVectorMemoryLocation(par_v)); } /*-------------------------------------------------------------------------- * hypre_ParVectorToVectorAll_v2 * * Generates a Vector on every proc which has a piece of the data * from a ParVector on several procs in comm. * The resulting vector lives in the same memory space as the input vector. * vec_starts needs to contain the partitioning across all procs in comm *--------------------------------------------------------------------------*/ hypre_Vector * hypre_ParVectorToVectorAll_v2( hypre_ParVector *par_v, HYPRE_MemoryLocation memory_location ) { MPI_Comm comm = hypre_ParVectorComm(par_v); HYPRE_Int num_vectors = hypre_ParVectorNumVectors(par_v); HYPRE_BigInt global_size = hypre_ParVectorGlobalSize(par_v); HYPRE_BigInt first_index = hypre_ParVectorFirstIndex(par_v); HYPRE_BigInt last_index = hypre_ParVectorLastIndex(par_v); hypre_Vector *local_vector; hypre_Vector *vector; HYPRE_Complex *vector_data; HYPRE_Complex *local_data; HYPRE_Int local_size; hypre_MPI_Request *requests; hypre_MPI_Status *status; HYPRE_Int i, j; HYPRE_Int *used_procs; HYPRE_Int num_types, num_requests; HYPRE_Int vec_len; HYPRE_Int *new_vec_starts; HYPRE_Int num_contacts; HYPRE_Int contact_proc_list[1]; HYPRE_Int contact_send_buf[1]; HYPRE_Int contact_send_buf_starts[2]; HYPRE_Int max_response_size; HYPRE_Int *response_recv_buf = NULL; HYPRE_Int *response_recv_buf_starts = NULL; hypre_DataExchangeResponse response_obj; hypre_ProcListElements send_proc_obj; HYPRE_Int *send_info = NULL; hypre_MPI_Status status1; HYPRE_Int count, tag1 = 112, tag2 = 223; HYPRE_Int start; HYPRE_Int num_procs, my_id; hypre_MPI_Comm_size(comm, &num_procs); hypre_MPI_Comm_rank(comm, &my_id); local_size = (HYPRE_Int)(last_index - first_index + 1); if (hypre_GetActualMemLocation(hypre_ParVectorMemoryLocation(par_v)) != hypre_GetActualMemLocation(HYPRE_MEMORY_HOST)) { local_vector = hypre_SeqVectorCloneDeep_v2(hypre_ParVectorLocalVector(par_v), HYPRE_MEMORY_HOST); } else { local_vector = hypre_ParVectorLocalVector(par_v); } /* determine procs which hold data of par_v and store ids in used_procs */ /* we need to do an exchange data for this. If I own row then I will contact processor 0 with the endpoint of my local range */ if (local_size > 0) { num_contacts = 1; contact_proc_list[0] = 0; contact_send_buf[0] = last_index; contact_send_buf_starts[0] = 0; contact_send_buf_starts[1] = 1; } else { num_contacts = 0; contact_send_buf_starts[0] = 0; contact_send_buf_starts[1] = 0; } /*build the response object*/ /*send_proc_obj will be for saving info from contacts */ send_proc_obj.length = 0; send_proc_obj.storage_length = 10; send_proc_obj.id = hypre_CTAlloc(HYPRE_Int, send_proc_obj.storage_length, HYPRE_MEMORY_HOST); send_proc_obj.vec_starts = hypre_CTAlloc(HYPRE_Int, send_proc_obj.storage_length + 1, HYPRE_MEMORY_HOST); send_proc_obj.vec_starts[0] = 0; send_proc_obj.element_storage_length = 10; send_proc_obj.elements = hypre_CTAlloc(HYPRE_BigInt, send_proc_obj.element_storage_length, HYPRE_MEMORY_HOST); max_response_size = 0; /* each response is null */ response_obj.fill_response = hypre_FillResponseParToVectorAll; response_obj.data1 = NULL; response_obj.data2 = &send_proc_obj; /*this is where we keep info from contacts*/ hypre_DataExchangeList(num_contacts, contact_proc_list, contact_send_buf, contact_send_buf_starts, sizeof(HYPRE_Int), //0, &response_obj, sizeof(HYPRE_Int), &response_obj, max_response_size, 1, comm, (void**) &response_recv_buf, &response_recv_buf_starts); /* now processor 0 should have a list of ranges for processors that have rows - these are in send_proc_obj - it needs to create the new list of processors and also an array of vec starts - and send to those who own row*/ if (my_id) { if (local_size) { /* look for a message from processor 0 */ hypre_MPI_Probe(0, tag1, comm, &status1); hypre_MPI_Get_count(&status1, HYPRE_MPI_INT, &count); send_info = hypre_CTAlloc(HYPRE_Int, count, HYPRE_MEMORY_HOST); hypre_MPI_Recv(send_info, count, HYPRE_MPI_INT, 0, tag1, comm, &status1); /* now unpack */ num_types = send_info[0]; used_procs = hypre_CTAlloc(HYPRE_Int, num_types, HYPRE_MEMORY_HOST); new_vec_starts = hypre_CTAlloc(HYPRE_Int, num_types + 1, HYPRE_MEMORY_HOST); for (i = 1; i <= num_types; i++) { used_procs[i - 1] = (HYPRE_Int)send_info[i]; } for (i = num_types + 1; i < count; i++) { new_vec_starts[i - num_types - 1] = send_info[i] ; } } else /* clean up and exit */ { hypre_TFree(send_proc_obj.vec_starts, HYPRE_MEMORY_HOST); hypre_TFree(send_proc_obj.id, HYPRE_MEMORY_HOST); hypre_TFree(send_proc_obj.elements, HYPRE_MEMORY_HOST); hypre_TFree(response_recv_buf, HYPRE_MEMORY_HOST); hypre_TFree(response_recv_buf_starts, HYPRE_MEMORY_HOST); return NULL; } } else /* my_id ==0 */ { num_types = send_proc_obj.length; used_procs = hypre_CTAlloc(HYPRE_Int, num_types, HYPRE_MEMORY_HOST); new_vec_starts = hypre_CTAlloc(HYPRE_Int, num_types + 1, HYPRE_MEMORY_HOST); new_vec_starts[0] = 0; for (i = 0; i < num_types; i++) { used_procs[i] = send_proc_obj.id[i]; new_vec_starts[i + 1] = send_proc_obj.elements[i] + 1; } hypre_qsort0(used_procs, 0, num_types - 1); hypre_qsort0(new_vec_starts, 0, num_types); /*now we need to put into an array to send */ count = 2 * num_types + 2; send_info = hypre_CTAlloc(HYPRE_Int, count, HYPRE_MEMORY_HOST); send_info[0] = num_types; for (i = 1; i <= num_types; i++) { send_info[i] = (HYPRE_Int) used_procs[i - 1]; } for (i = num_types + 1; i < count; i++) { send_info[i] = new_vec_starts[i - num_types - 1]; } requests = hypre_CTAlloc(hypre_MPI_Request, num_types, HYPRE_MEMORY_HOST); status = hypre_CTAlloc(hypre_MPI_Status, num_types, HYPRE_MEMORY_HOST); /* don't send to myself - these are sorted so my id would be first*/ start = 0; if (used_procs[0] == 0) { start = 1; } for (i = start; i < num_types; i++) { hypre_MPI_Isend(send_info, count, HYPRE_MPI_INT, used_procs[i], tag1, comm, &requests[i - start]); } hypre_MPI_Waitall(num_types - start, requests, status); hypre_TFree(status, HYPRE_MEMORY_HOST); hypre_TFree(requests, HYPRE_MEMORY_HOST); } /* Clean up */ hypre_TFree(send_proc_obj.vec_starts, HYPRE_MEMORY_HOST); hypre_TFree(send_proc_obj.id, HYPRE_MEMORY_HOST); hypre_TFree(send_proc_obj.elements, HYPRE_MEMORY_HOST); hypre_TFree(send_info, HYPRE_MEMORY_HOST); hypre_TFree(response_recv_buf, HYPRE_MEMORY_HOST); hypre_TFree(response_recv_buf_starts, HYPRE_MEMORY_HOST); /* now proc 0 can exit if it has no rows */ if (!local_size) { hypre_TFree(used_procs, HYPRE_MEMORY_HOST); hypre_TFree(new_vec_starts, HYPRE_MEMORY_HOST); return NULL; } /* everyone left has rows and knows: new_vec_starts, num_types, and used_procs */ /* this vector should be rather small */ local_data = hypre_VectorData(local_vector); vector = hypre_SeqVectorCreate((HYPRE_Int) global_size); hypre_VectorNumVectors(vector) = num_vectors; hypre_SeqVectorInitialize_v2(vector, HYPRE_MEMORY_HOST); vector_data = hypre_VectorData(vector); num_requests = 2 * num_types; requests = hypre_CTAlloc(hypre_MPI_Request, num_requests, HYPRE_MEMORY_HOST); status = hypre_CTAlloc(hypre_MPI_Status, num_requests, HYPRE_MEMORY_HOST); /* initialize data exchange among used_procs and generate vector - here we send to ourself also*/ j = 0; for (i = 0; i < num_types; i++) { vec_len = (HYPRE_Int) (new_vec_starts[i + 1] - new_vec_starts[i]); hypre_MPI_Irecv(&vector_data[(HYPRE_Int)new_vec_starts[i]], num_vectors * vec_len, HYPRE_MPI_COMPLEX, used_procs[i], tag2, comm, &requests[j++]); } for (i = 0; i < num_types; i++) { hypre_MPI_Isend(local_data, num_vectors * local_size, HYPRE_MPI_COMPLEX, used_procs[i], tag2, comm, &requests[j++]); } hypre_MPI_Waitall(num_requests, requests, status); /* Move vector to final destination */ hypre_SeqVectorMigrate(vector, memory_location); /* Free memory */ hypre_TFree(requests, HYPRE_MEMORY_HOST); hypre_TFree(status, HYPRE_MEMORY_HOST); hypre_TFree(used_procs, HYPRE_MEMORY_HOST); hypre_TFree(new_vec_starts, HYPRE_MEMORY_HOST); if (local_vector != hypre_ParVectorLocalVector(par_v)) { hypre_SeqVectorDestroy(local_vector); } return vector; } /*-------------------------------------------------------------------------- * hypre_ParVectorPrintIJ *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ParVectorPrintIJ( hypre_ParVector *vector, HYPRE_Int base_j, const char *filename ) { MPI_Comm comm; HYPRE_BigInt *partitioning; hypre_Vector *local_vector; HYPRE_Int local_size; HYPRE_Int myid, num_procs, i, j; char new_filename[HYPRE_MAX_FILE_NAME_LEN]; char msg[1024]; FILE *file; if (!vector) { hypre_error_in_arg(1); return hypre_error_flag; } comm = hypre_ParVectorComm(vector); partitioning = hypre_ParVectorPartitioning(vector); local_vector = hypre_ParVectorLocalVector(vector); local_size = hypre_VectorSize(local_vector); hypre_MPI_Comm_rank(comm, &myid); hypre_MPI_Comm_size(comm, &num_procs); hypre_sprintf(new_filename, "%s.%05d", filename, myid); if ((file = fopen(new_filename, "w")) == NULL) { hypre_sprintf(msg, "Error: cannot open output file: %s", new_filename); hypre_error_w_msg(HYPRE_ERROR_GENERIC, msg); return hypre_error_flag; } /* Write header: global partitioning */ hypre_fprintf(file, "%b %b\n", partitioning[0] + base_j, partitioning[1] + base_j - 1); /* Write additional header line in the case of multi-component vectors */ if (hypre_ParVectorNumVectors(vector) > 1) { hypre_fprintf(file, "%d %d %d %d\n", hypre_VectorNumVectors(local_vector), hypre_VectorMultiVecStorageMethod(local_vector), hypre_VectorVectorStride(local_vector), hypre_VectorIndexStride(local_vector)); } /* Write coefficients */ if (hypre_ParVectorNumVectors(vector) > 1) { /* Multi-component vectors */ for (i = 0; i < local_size; i++) { hypre_fprintf(file, "%b", (HYPRE_BigInt) (i + base_j) + partitioning[0]); for (j = 0; j < hypre_VectorNumVectors(local_vector); j++) { hypre_fprintf(file, " %.14e", hypre_VectorEntryIJ(local_vector, i, j)); } hypre_fprintf(file, "\n"); } } else { /* Single-component (regular) vectors */ for (j = 0; j < local_size; j++) { hypre_fprintf(file, "%b %.14e\n", (HYPRE_BigInt) (j + base_j) + partitioning[0], hypre_VectorEntryI(local_vector, j)); } } fclose(file); return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_ParVectorPrintBinaryIJ * * Prints a ParVector in binary format. The data from each process is * printed to a separate file. Metadata info about the vector is printed in * the header section of every file, and followed by the vector entries * * The header section is composed by 8 entries stored in 64 bytes (8 bytes * each) and their meanings are: * * 0) Header version * 1) Number of bytes for storing a real type (vector entries) * 2) Global index of the first vector entry in this process * 3) Global index of the last vector entry in this process * 4) Number of entries of a global vector * 5) Number of entries of a local vector * 6) Number of components of a vector * 7) Storage method for multi-component vectors *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ParVectorPrintBinaryIJ( hypre_ParVector *par_vector, const char *filename ) { MPI_Comm comm = hypre_ParVectorComm(par_vector); HYPRE_BigInt global_size = hypre_ParVectorGlobalSize(par_vector); HYPRE_BigInt *partitioning = hypre_ParVectorPartitioning(par_vector); HYPRE_MemoryLocation memory_location = hypre_ParVectorMemoryLocation(par_vector); hypre_ParVector *h_parvector; hypre_Vector *h_vector; HYPRE_Int size; HYPRE_Int num_components; HYPRE_Int storage_method; /* Local variables */ char new_filename[HYPRE_MAX_FILE_NAME_LEN]; FILE *fp; size_t count, total_size; hypre_uint64 header[8]; HYPRE_Int one = 1; HYPRE_Complex *data; HYPRE_Int myid; /* Exit if trying to write from big-endian machine */ if ((*(char*)&one) == 0) { hypre_error_w_msg(HYPRE_ERROR_GENERIC, "Support to big-endian machines is incomplete!\n"); return hypre_error_flag; } /* MPI variables */ hypre_MPI_Comm_rank(comm, &myid); /* Create temporary vector on host memory if needed */ h_parvector = (hypre_GetActualMemLocation(memory_location) == hypre_MEMORY_DEVICE) ? hypre_ParVectorCloneDeep_v2(par_vector, HYPRE_MEMORY_HOST) : par_vector; /* Local vector variables */ h_vector = hypre_ParVectorLocalVector(h_parvector); num_components = hypre_VectorNumVectors(h_vector); storage_method = hypre_VectorMultiVecStorageMethod(h_vector); data = hypre_VectorData(h_vector); size = hypre_VectorSize(h_vector); total_size = size * num_components; /* Open binary file */ hypre_sprintf(new_filename, "%s.%05d.bin", filename, myid); if ((fp = fopen(new_filename, "wb")) == NULL) { hypre_error_w_msg(HYPRE_ERROR_GENERIC, "Could not open output file!"); return hypre_error_flag; } /*--------------------------------------------- * Write header (64 bytes) *---------------------------------------------*/ count = 8; header[0] = (hypre_uint64) 1; /* Header version */ header[1] = (hypre_uint64) sizeof(HYPRE_Complex); header[2] = (hypre_uint64) partitioning[0]; header[3] = (hypre_uint64) partitioning[1]; header[4] = (hypre_uint64) global_size; header[5] = (hypre_uint64) size; header[6] = (hypre_uint64) num_components; header[7] = (hypre_uint64) storage_method; if (fwrite((const void*) header, sizeof(hypre_uint64), count, fp) != count) { hypre_error_w_msg(HYPRE_ERROR_GENERIC, "Could not write all header entries\n"); return hypre_error_flag; } /*--------------------------------------------- * Write vector coefficients *---------------------------------------------*/ count = fwrite((const void*) data, sizeof(HYPRE_Complex), total_size, fp); if (count != total_size) { hypre_error_w_msg(HYPRE_ERROR_GENERIC, "Could not write all entries\n"); return hypre_error_flag; } /*--------------------------------------------- * Finalize *---------------------------------------------*/ fclose(fp); if (h_parvector != par_vector) { hypre_ParVectorDestroy(h_parvector); } return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_ParVectorReadIJ * Warning: wrong base for assumed partition if base > 0 *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ParVectorReadIJ( MPI_Comm comm, const char *filename, HYPRE_Int *base_j_ptr, hypre_ParVector **vector_ptr ) { HYPRE_BigInt global_size, J; hypre_ParVector *vector; hypre_Vector *local_vector; HYPRE_Complex *local_data; HYPRE_BigInt big_local_size; HYPRE_BigInt partitioning[2] = {0, 0}; HYPRE_Int base_j; HYPRE_Int myid, num_procs, j; char new_filename[HYPRE_MAX_FILE_NAME_LEN]; FILE *file; hypre_MPI_Comm_size(comm, &num_procs); hypre_MPI_Comm_rank(comm, &myid); hypre_sprintf(new_filename, "%s.%05d", filename, myid); if ((file = fopen(new_filename, "r")) == NULL) { hypre_error_w_msg(HYPRE_ERROR_GENERIC, "Error: can't open output file %s\n"); return hypre_error_flag; } /* this may need to be changed so that the base is available in the file! */ hypre_fscanf(file, "%b %b", partitioning[0], partitioning[1]); big_local_size = partitioning[1] - partitioning[0] + 1; hypre_MPI_Allreduce(&big_local_size, &global_size, 1, HYPRE_MPI_BIG_INT, hypre_MPI_SUM, comm); /* This is not yet implemented correctly! */ base_j = 0; vector = hypre_ParVectorCreate(comm, global_size, partitioning); hypre_ParVectorInitialize_v2(vector, HYPRE_MEMORY_HOST); local_vector = hypre_ParVectorLocalVector(vector); local_data = hypre_VectorData(local_vector); for (j = 0; j < (HYPRE_Int) big_local_size; j++) { hypre_fscanf(file, "%b %le", &J, local_data + j); } fclose(file); *base_j_ptr = base_j; *vector_ptr = vector; /* multivector code not written yet */ hypre_assert( hypre_ParVectorNumVectors(vector) == 1 ); if ( hypre_ParVectorNumVectors(vector) != 1 ) { hypre_error(HYPRE_ERROR_GENERIC); } return hypre_error_flag; } /*-------------------------------------------------------------------- * hypre_FillResponseParToVectorAll * Fill response function for determining the send processors * data exchange *--------------------------------------------------------------------*/ HYPRE_Int hypre_FillResponseParToVectorAll( void *p_recv_contact_buf, HYPRE_Int contact_size, HYPRE_Int contact_proc, void *ro, MPI_Comm comm, void **p_send_response_buf, HYPRE_Int *response_message_size ) { HYPRE_UNUSED_VAR(p_send_response_buf); HYPRE_Int myid; HYPRE_Int i, index, count, elength; HYPRE_BigInt *recv_contact_buf = (HYPRE_BigInt * ) p_recv_contact_buf; hypre_DataExchangeResponse *response_obj = (hypre_DataExchangeResponse*)ro; hypre_ProcListElements *send_proc_obj = (hypre_ProcListElements*)response_obj->data2; hypre_MPI_Comm_rank(comm, &myid ); /*check to see if we need to allocate more space in send_proc_obj for ids*/ if (send_proc_obj->length == send_proc_obj->storage_length) { send_proc_obj->storage_length += 10; /*add space for 10 more processors*/ send_proc_obj->id = hypre_TReAlloc(send_proc_obj->id, HYPRE_Int, send_proc_obj->storage_length, HYPRE_MEMORY_HOST); send_proc_obj->vec_starts = hypre_TReAlloc(send_proc_obj->vec_starts, HYPRE_Int, send_proc_obj->storage_length + 1, HYPRE_MEMORY_HOST); } /*initialize*/ count = send_proc_obj->length; index = send_proc_obj->vec_starts[count]; /*this is the number of elements*/ /*send proc*/ send_proc_obj->id[count] = contact_proc; /*do we need more storage for the elements?*/ if (send_proc_obj->element_storage_length < index + contact_size) { elength = hypre_max(contact_size, 10); elength += index; send_proc_obj->elements = hypre_TReAlloc(send_proc_obj->elements, HYPRE_BigInt, elength, HYPRE_MEMORY_HOST); send_proc_obj->element_storage_length = elength; } /*populate send_proc_obj*/ for (i = 0; i < contact_size; i++) { send_proc_obj->elements[index++] = recv_contact_buf[i]; } send_proc_obj->vec_starts[count + 1] = index; send_proc_obj->length++; /*output - no message to return (confirmation) */ *response_message_size = 0; return hypre_error_flag; } /*-------------------------------------------------------------------- * hypre_ParVectorLocalSumElts * * Return the sum of all local elements of the vector *--------------------------------------------------------------------*/ HYPRE_Complex hypre_ParVectorLocalSumElts( hypre_ParVector *vector ) { return hypre_SeqVectorSumElts( hypre_ParVectorLocalVector(vector) ); } /*-------------------------------------------------------------------- * hypre_ParVectorGetValuesHost *--------------------------------------------------------------------*/ HYPRE_Int hypre_ParVectorGetValuesHost(hypre_ParVector *vector, HYPRE_Int num_values, HYPRE_BigInt *indices, HYPRE_BigInt base, HYPRE_Complex *values) { HYPRE_BigInt first_index = hypre_ParVectorFirstIndex(vector); HYPRE_BigInt last_index = hypre_ParVectorLastIndex(vector); hypre_Vector *local_vector = hypre_ParVectorLocalVector(vector); HYPRE_Int component = hypre_VectorComponent(local_vector); HYPRE_Int vecstride = hypre_VectorVectorStride(local_vector); HYPRE_Int idxstride = hypre_VectorIndexStride(local_vector); HYPRE_Complex *data = hypre_VectorData(local_vector); HYPRE_Int vecoffset = component * vecstride; HYPRE_Int i, ierr = 0; if (indices) { #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i) reduction(+:ierr) HYPRE_SMP_SCHEDULE #endif for (i = 0; i < num_values; i++) { HYPRE_BigInt index = indices[i] - base; if (index < first_index || index > last_index) { ierr++; } else { HYPRE_Int local_index = (HYPRE_Int) (index - first_index); values[i] = data[vecoffset + local_index * idxstride]; } } if (ierr) { hypre_error_in_arg(3); hypre_error_w_msg(HYPRE_ERROR_GENERIC, "Index out of range! -- hypre_ParVectorGetValues."); hypre_printf("Index out of range! -- hypre_ParVectorGetValues\n"); } } else { if (num_values > hypre_VectorSize(local_vector)) { hypre_error_in_arg(2); return hypre_error_flag; } #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i) HYPRE_SMP_SCHEDULE #endif for (i = 0; i < num_values; i++) { values[i] = data[vecoffset + i * idxstride]; } } return hypre_error_flag; } /*-------------------------------------------------------------------- * hypre_ParVectorGetValues2 *--------------------------------------------------------------------*/ HYPRE_Int hypre_ParVectorGetValues2(hypre_ParVector *vector, HYPRE_Int num_values, HYPRE_BigInt *indices, HYPRE_BigInt base, HYPRE_Complex *values) { #if defined(HYPRE_USING_GPU) if (HYPRE_EXEC_DEVICE == hypre_GetExecPolicy1( hypre_ParVectorMemoryLocation(vector) )) { hypre_ParVectorGetValuesDevice(vector, num_values, indices, base, values); } else #endif { hypre_ParVectorGetValuesHost(vector, num_values, indices, base, values); } return hypre_error_flag; } /*-------------------------------------------------------------------- * hypre_ParVectorGetValues *--------------------------------------------------------------------*/ HYPRE_Int hypre_ParVectorGetValues(hypre_ParVector *vector, HYPRE_Int num_values, HYPRE_BigInt *indices, HYPRE_Complex *values) { return hypre_ParVectorGetValues2(vector, num_values, indices, 0, values); } hypre-2.33.0/src/parcsr_mv/par_vector.h000066400000000000000000000064611477326011500200430ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * Header info for Parallel Vector data structure * *****************************************************************************/ #ifndef hypre_PAR_VECTOR_HEADER #define hypre_PAR_VECTOR_HEADER /*-------------------------------------------------------------------------- * hypre_ParVector *--------------------------------------------------------------------------*/ #ifndef HYPRE_PAR_VECTOR_STRUCT #define HYPRE_PAR_VECTOR_STRUCT #endif typedef struct hypre_ParVector_struct { MPI_Comm comm; HYPRE_BigInt global_size; HYPRE_BigInt first_index; HYPRE_BigInt last_index; HYPRE_BigInt partitioning[2]; /* stores actual length of data in local vector to allow memory * manipulations for temporary vectors*/ HYPRE_Int actual_local_size; hypre_Vector *local_vector; /* Does the Vector create/destroy `data'? */ HYPRE_Int owns_data; /* If the vector is all zeros */ HYPRE_Int all_zeros; hypre_IJAssumedPart *assumed_partition; /* only populated if this partition needed (for setting off-proc elements, for example)*/ } hypre_ParVector; /*-------------------------------------------------------------------------- * Accessor functions for the Vector structure *--------------------------------------------------------------------------*/ #define hypre_ParVectorComm(vector) ((vector) -> comm) #define hypre_ParVectorGlobalSize(vector) ((vector) -> global_size) #define hypre_ParVectorFirstIndex(vector) ((vector) -> first_index) #define hypre_ParVectorLastIndex(vector) ((vector) -> last_index) #define hypre_ParVectorPartitioning(vector) ((vector) -> partitioning) #define hypre_ParVectorActualLocalSize(vector) ((vector) -> actual_local_size) #define hypre_ParVectorOwnsData(vector) ((vector) -> owns_data) #define hypre_ParVectorAllZeros(vector) ((vector) -> all_zeros) #define hypre_ParVectorLocalVector(vector) ((vector) -> local_vector) #define hypre_ParVectorLocalSize(vector) ((vector) -> local_vector -> size) #define hypre_ParVectorLocalData(vector) ((vector) -> local_vector -> data) #define hypre_ParVectorLocalStorage(vector) ((vector) -> local_vector -> multivec_storage_method) #define hypre_ParVectorNumVectors(vector) ((vector) -> local_vector -> num_vectors) #define hypre_ParVectorEntryI(vector, i) (hypre_VectorEntryI((vector) -> local_vector, i)) #define hypre_ParVectorEntryIJ(vector, i, j) (hypre_VectorEntryIJ((vector) -> local_vector, i, j)) #define hypre_ParVectorAssumedPartition(vector) ((vector) -> assumed_partition) static inline HYPRE_MAYBE_UNUSED_FUNC HYPRE_MemoryLocation hypre_ParVectorMemoryLocation(hypre_ParVector *vector) { return hypre_VectorMemoryLocation(hypre_ParVectorLocalVector(vector)); } #endif hypre-2.33.0/src/parcsr_mv/par_vector_batched.c000066400000000000000000000111221477326011500214760ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * Member functions for hypre_Vector class. * *****************************************************************************/ #include "_hypre_parcsr_mv.h" /*-------------------------------------------------------------------------- * hypre_ParVectorMassAxpy *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ParVectorMassAxpy( HYPRE_Complex *alpha, hypre_ParVector **x, hypre_ParVector *y, HYPRE_Int k, HYPRE_Int unroll ) { HYPRE_Int i; hypre_Vector **x_local; hypre_Vector *y_local = hypre_ParVectorLocalVector(y); x_local = hypre_TAlloc(hypre_Vector *, k, HYPRE_MEMORY_HOST); for (i = 0; i < k; i++) { x_local[i] = hypre_ParVectorLocalVector(x[i]); } hypre_SeqVectorMassAxpy( alpha, x_local, y_local, k, unroll); hypre_TFree(x_local, HYPRE_MEMORY_HOST); return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_ParVectorMassInnerProd *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ParVectorMassInnerProd( hypre_ParVector *x, hypre_ParVector **y, HYPRE_Int k, HYPRE_Int unroll, HYPRE_Real *result ) { MPI_Comm comm = hypre_ParVectorComm(x); hypre_Vector *x_local = hypre_ParVectorLocalVector(x); HYPRE_Real *local_result; HYPRE_Int i; hypre_Vector **y_local; y_local = hypre_TAlloc(hypre_Vector *, k, HYPRE_MEMORY_HOST); for (i = 0; i < k; i++) { y_local[i] = (hypre_Vector *) hypre_ParVectorLocalVector(y[i]); } local_result = hypre_CTAlloc(HYPRE_Real, k, HYPRE_MEMORY_HOST); hypre_SeqVectorMassInnerProd(x_local, y_local, k, unroll, local_result); #ifdef HYPRE_PROFILE hypre_profile_times[HYPRE_TIMER_ID_ALL_REDUCE] -= hypre_MPI_Wtime(); #endif hypre_MPI_Allreduce(local_result, result, k, HYPRE_MPI_REAL, hypre_MPI_SUM, comm); #ifdef HYPRE_PROFILE hypre_profile_times[HYPRE_TIMER_ID_ALL_REDUCE] += hypre_MPI_Wtime(); #endif hypre_TFree(y_local, HYPRE_MEMORY_HOST); hypre_TFree(local_result, HYPRE_MEMORY_HOST); return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_ParVectorMassDotpTwo *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ParVectorMassDotpTwo ( hypre_ParVector *x, hypre_ParVector *y, hypre_ParVector **z, HYPRE_Int k, HYPRE_Int unroll, HYPRE_Real *result_x, HYPRE_Real *result_y ) { MPI_Comm comm = hypre_ParVectorComm(x); hypre_Vector *x_local = hypre_ParVectorLocalVector(x); hypre_Vector *y_local = hypre_ParVectorLocalVector(y); HYPRE_Real *local_result, *result; HYPRE_Int i; hypre_Vector **z_local; z_local = hypre_TAlloc(hypre_Vector*, k, HYPRE_MEMORY_HOST); for (i = 0; i < k; i++) { z_local[i] = (hypre_Vector *) hypre_ParVectorLocalVector(z[i]); } local_result = hypre_CTAlloc(HYPRE_Real, 2 * k, HYPRE_MEMORY_HOST); result = hypre_CTAlloc(HYPRE_Real, 2 * k, HYPRE_MEMORY_HOST); hypre_SeqVectorMassDotpTwo(x_local, y_local, z_local, k, unroll, &local_result[0], &local_result[k]); #ifdef HYPRE_PROFILE hypre_profile_times[HYPRE_TIMER_ID_ALL_REDUCE] -= hypre_MPI_Wtime(); #endif hypre_MPI_Allreduce(local_result, result, 2 * k, HYPRE_MPI_REAL, hypre_MPI_SUM, comm); #ifdef HYPRE_PROFILE hypre_profile_times[HYPRE_TIMER_ID_ALL_REDUCE] += hypre_MPI_Wtime(); #endif for (i = 0; i < k; i++) { result_x[i] = result[i]; result_y[i] = result[k + i]; } hypre_TFree(z_local, HYPRE_MEMORY_HOST); hypre_TFree(local_result, HYPRE_MEMORY_HOST); hypre_TFree(result, HYPRE_MEMORY_HOST); return hypre_error_flag; } hypre-2.33.0/src/parcsr_mv/par_vector_device.c000066400000000000000000000106671477326011500213600ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "_hypre_onedpl.hpp" #include "_hypre_parcsr_mv.h" #include "_hypre_utilities.hpp" #if defined(HYPRE_USING_GPU) HYPRE_Int hypre_ParVectorGetValuesDevice(hypre_ParVector *vector, HYPRE_Int num_values, HYPRE_BigInt *indices, HYPRE_BigInt base, HYPRE_Complex *values) { HYPRE_BigInt first_index = hypre_ParVectorFirstIndex(vector); HYPRE_BigInt last_index = hypre_ParVectorLastIndex(vector); hypre_Vector *local_vector = hypre_ParVectorLocalVector(vector); HYPRE_Int component = hypre_VectorComponent(local_vector); HYPRE_Int vecstride = hypre_VectorVectorStride(local_vector); HYPRE_Int idxstride = hypre_VectorIndexStride(local_vector); HYPRE_Complex *data = hypre_VectorData(local_vector); HYPRE_Int vecoffset = component * vecstride; HYPRE_Int ierr = 0; if (idxstride != 1) { hypre_error_w_msg(HYPRE_ERROR_GENERIC, "hypre_ParVectorGetValuesDevice not implemented for non-columnwise vector storage\n"); return hypre_error_flag; } /* If indices == NULL, assume that num_values components are to be retrieved from block starting at vec_start */ if (indices) { #if defined(HYPRE_USING_SYCL) ierr = HYPRE_ONEDPL_CALL( std::count_if, indices, indices + num_values, out_of_range(first_index + base, last_index + base) ); #else ierr = HYPRE_THRUST_CALL( count_if, indices, indices + num_values, out_of_range(first_index + base, last_index + base) ); #endif if (ierr) { hypre_error_in_arg(3); hypre_error_w_msg(HYPRE_ERROR_GENERIC, "Index out of range! -- hypre_ParVectorGetValues."); hypre_printf(" error: %d indices out of range! -- hypre_ParVectorGetValues\n", ierr); #if defined(HYPRE_USING_SYCL) auto trans_it = oneapi::dpl::make_transform_iterator(indices, [base, first_index] (const auto & x) {return x - base - first_index;} ); hypreSycl_gather_if( trans_it, trans_it + num_values, indices, data + vecoffset, values, in_range(first_index + base, last_index + base) ); } else { auto trans_it = oneapi::dpl::make_transform_iterator(indices, [base, first_index] (const auto & x) {return x - base - first_index;} ); hypreSycl_gather( trans_it, trans_it + num_values, data + vecoffset, values); #else HYPRE_THRUST_CALL( gather_if, thrust::make_transform_iterator(indices, _1 - base - first_index), thrust::make_transform_iterator(indices, _1 - base - first_index) + num_values, indices, data + vecoffset, values, in_range(first_index + base, last_index + base) ); } else { HYPRE_THRUST_CALL( gather, thrust::make_transform_iterator(indices, _1 - base - first_index), thrust::make_transform_iterator(indices, _1 - base - first_index) + num_values, data + vecoffset, values); #endif } } else { if (num_values > hypre_VectorSize(local_vector)) { hypre_error_in_arg(3); return hypre_error_flag; } hypre_TMemcpy(values, data + vecoffset, HYPRE_Complex, num_values, HYPRE_MEMORY_DEVICE, HYPRE_MEMORY_DEVICE); } return hypre_error_flag; } #endif // #if defined(HYPRE_USING_GPU) hypre-2.33.0/src/parcsr_mv/parchord_to_parcsr.c000066400000000000000000000720321477326011500215450ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /* ----------------------------------------------------------------------- */ /* */ /* ParCSRMatrix to ParChordMatrix */ /* and */ /* ParCSRMatrix to ParChordMatrix: */ /* */ /* ----------------------------------------------------------------------- */ #include #include #include #include "_hypre_parcsr_mv.h" void hypre_ParChordMatrix_RowStarts( hypre_ParChordMatrix *Ac, MPI_Comm comm, HYPRE_BigInt ** row_starts, HYPRE_BigInt * global_num_cols ) /* This function computes the ParCSRMatrix-style row_starts from a chord matrix. It requires the the idofs of the chord matrix be partitioned among processors, so their numbering is monotonic with the processor number; see below. The algorithm: each proc. p knows its min & max global row & col numbers. Mins are first_index_rdof[p], first_index_idof[p] ***IF*** these were in proper order (see below), first_index_rdof[p] is row_starts[p]. Add num_rdofs-1 to get the max, i.e. add num_rdofs to get row_starts[p+1] (IF the processors are ordered thus). Compute these, then broadcast to the other processors to form row_starts. (We also could get global_num_rows by an AllReduce num_idofs.) We get global_num_cols by taking the min and max over processors of the min and max col no.s on each processor. If the chord matrix is not ordered so the above will work, then we would need to to completely move matrices around sometimes, a very expensive operation. The problem is that the chord matrix format makes no assumptions about processor order, but the ParCSR format assumes that p (local row numbers of p) < (local row numbers of q) Maybe instead I could change the global numbering scheme as part of this conversion. A closely related ordering-type problem to watch for: row_starts must be a partition for a ParCSRMatrix. In a ChordMatrix, the struct itself makes no guarantees, but Panayot said, in essence, that row_starts will be a partition. col_starts should be NULL; later we shall let the Create function compute one. */ { HYPRE_BigInt * fis_idof = hypre_ParChordMatrixFirstindexIdof(Ac); HYPRE_BigInt * fis_rdof = hypre_ParChordMatrixFirstindexRdof(Ac); HYPRE_Int my_id, num_procs; HYPRE_Int num_idofs = hypre_ParChordMatrixNumIdofs(Ac); HYPRE_Int num_rdofs = hypre_ParChordMatrixNumRdofs(Ac); HYPRE_BigInt min_rdof, max_rdof, global_min_rdof, global_max_rdof; HYPRE_Int p, lens[2], lastlens[2]; hypre_MPI_Status *status; hypre_MPI_Request *request; hypre_MPI_Comm_rank(comm, &my_id); hypre_MPI_Comm_size(comm, &num_procs); request = hypre_CTAlloc(hypre_MPI_Request, 1, HYPRE_MEMORY_HOST); status = hypre_CTAlloc(hypre_MPI_Status, 1, HYPRE_MEMORY_HOST); min_rdof = fis_rdof[my_id]; max_rdof = min_rdof + num_rdofs; lens[0] = num_idofs; lens[1] = num_rdofs; /* row_starts (except last value */ *row_starts = hypre_CTAlloc( HYPRE_BigInt, num_procs + 1, HYPRE_MEMORY_HOST); for ( p = 0; p < num_procs; ++p ) { (*row_starts)[p] = fis_idof[p]; } /* check that ordering and partitioning of rows is as expected (much is missing, and even then not perfect)... */ if ( my_id < num_procs - 1 ) { hypre_MPI_Isend( lens, 2, HYPRE_MPI_INT, my_id + 1, 0, comm, request ); } if ( my_id > 0 ) { hypre_MPI_Recv( lastlens, 2, HYPRE_MPI_INT, my_id - 1, 0, comm, status ); } if ( my_id < num_procs - 1 ) { hypre_MPI_Waitall( 1, request, status); } if ( my_id > 0 ) { hypre_assert( (*row_starts)[my_id] == (*row_starts)[my_id - 1] + (HYPRE_BigInt)lastlens[0] ); } hypre_TFree( request, HYPRE_MEMORY_HOST); hypre_TFree( status, HYPRE_MEMORY_HOST); /* Get the upper bound for all the rows */ hypre_MPI_Bcast( lens, 2, HYPRE_MPI_INT, num_procs - 1, comm ); (*row_starts)[num_procs] = (*row_starts)[num_procs - 1] + (HYPRE_Int)lens[0]; /* Global number of columns */ /* hypre_MPI_Allreduce( &num_rdofs, global_num_cols, 1, HYPRE_MPI_INT, hypre_MPI_SUM, comm );*/ hypre_MPI_Allreduce( &min_rdof, &global_min_rdof, 1, HYPRE_MPI_BIG_INT, hypre_MPI_MIN, comm ); hypre_MPI_Allreduce( &max_rdof, &global_max_rdof, 1, HYPRE_MPI_BIG_INT, hypre_MPI_MAX, comm ); *global_num_cols = global_max_rdof - global_min_rdof; } HYPRE_Int hypre_ParChordMatrixToParCSRMatrix( hypre_ParChordMatrix *Ac, MPI_Comm comm, hypre_ParCSRMatrix **pAp ) { /* Some parts of this function are copied from hypre_CSRMatrixToParCSRMatrix. */ hypre_ParCSRMatrix *Ap; HYPRE_BigInt *row_starts, *col_starts; HYPRE_BigInt global_num_rows, global_num_cols; HYPRE_Int my_id, num_procs; HYPRE_Int num_cols_offd, num_nonzeros_diag, num_nonzeros_offd; HYPRE_Int *local_num_rows; /* not computed HYPRE_Int *local_num_nonzeros; */ HYPRE_Int num_nonzeros; HYPRE_BigInt first_col_diag, last_col_diag; HYPRE_Int i, ic, ij, ir, ilocal, p, r, r_p, r_global, r_local, jlen; HYPRE_Int *a_i, *a_j, *ilen; HYPRE_Int **rdofs, **ps; HYPRE_Complex data; HYPRE_Complex *a_data; HYPRE_Complex **datas; hypre_CSRMatrix *local_A; hypre_MPI_Comm_rank(comm, &my_id); hypre_MPI_Comm_size(comm, &num_procs); hypre_ParChordMatrix_RowStarts ( Ac, comm, &row_starts, &global_num_cols ); /* ... this function works correctly only under some assumptions; see the function definition for details */ global_num_rows = row_starts[num_procs] - row_starts[0]; col_starts = NULL; /* The offd and diag blocks aren't defined until we have both row and column partitions... */ num_cols_offd = 0; num_nonzeros_diag = 0; num_nonzeros_offd = 0; Ap = hypre_ParCSRMatrixCreate( comm, global_num_rows, global_num_cols, row_starts, col_starts, num_cols_offd, num_nonzeros_diag, num_nonzeros_offd); *pAp = Ap; row_starts = hypre_ParCSRMatrixRowStarts(Ap); col_starts = hypre_ParCSRMatrixColStarts(Ap); local_num_rows = hypre_CTAlloc(HYPRE_Int, num_procs, HYPRE_MEMORY_HOST); for (i = 0; i < num_procs; i++) { local_num_rows[i] = (HYPRE_Int)(row_starts[i + 1] - row_starts[i]); } num_nonzeros = 0; for ( p = 0; p < hypre_ParChordMatrixNumInprocessors(Ac); ++p ) { num_nonzeros += hypre_ParChordMatrixNumInchords(Ac)[p]; }; local_A = hypre_CSRMatrixCreate( local_num_rows[my_id], (HYPRE_Int)global_num_cols, num_nonzeros ); /* Compute local CSRMatrix-like i,j arrays for this processor. */ ps = hypre_CTAlloc( HYPRE_Int*, hypre_ParChordMatrixNumIdofs(Ac), HYPRE_MEMORY_HOST); rdofs = hypre_CTAlloc( HYPRE_Int*, hypre_ParChordMatrixNumIdofs(Ac), HYPRE_MEMORY_HOST); datas = hypre_CTAlloc( HYPRE_Complex*, hypre_ParChordMatrixNumIdofs(Ac), HYPRE_MEMORY_HOST); ilen = hypre_CTAlloc( HYPRE_Int, hypre_ParChordMatrixNumIdofs(Ac), HYPRE_MEMORY_HOST); jlen = 0; for ( i = 0; i < hypre_ParChordMatrixNumIdofs(Ac); ++i ) { ilen[i] = 0; ps[i] = hypre_CTAlloc( HYPRE_Int, hypre_ParChordMatrixNumRdofs(Ac), HYPRE_MEMORY_HOST); rdofs[i] = hypre_CTAlloc( HYPRE_Int, hypre_ParChordMatrixNumRdofs(Ac), HYPRE_MEMORY_HOST); datas[i] = hypre_CTAlloc( HYPRE_Complex, hypre_ParChordMatrixNumRdofs(Ac), HYPRE_MEMORY_HOST); /* ... rdofs[i], datas[i] will generally, not always, be much too big */ } for ( p = 0; p < hypre_ParChordMatrixNumInprocessors(Ac); ++p ) { for ( ic = 0; ic < hypre_ParChordMatrixNumInchords(Ac)[p]; ++ic ) { ilocal = hypre_ParChordMatrixInchordIdof(Ac)[p][ic]; r = hypre_ParChordMatrixInchordRdof(Ac)[p][ic]; data = hypre_ParChordMatrixInchordData(Ac)[p][ic]; ps[ilocal][ ilen[ilocal] ] = p; rdofs[ilocal][ ilen[ilocal] ] = r; datas[ilocal][ ilen[ilocal] ] = data; ++ilen[ilocal]; ++jlen; } }; a_i = hypre_CTAlloc( HYPRE_Int, hypre_ParChordMatrixNumIdofs(Ac) + 1, HYPRE_MEMORY_HOST); a_j = hypre_CTAlloc( HYPRE_Int, jlen, HYPRE_MEMORY_HOST); a_data = hypre_CTAlloc( HYPRE_Complex, jlen, HYPRE_MEMORY_HOST); a_i[0] = 0; for ( ilocal = 0; ilocal < hypre_ParChordMatrixNumIdofs(Ac); ++ilocal ) { a_i[ilocal + 1] = a_i[ilocal] + ilen[ilocal]; ir = 0; for ( ij = a_i[ilocal]; ij < a_i[ilocal + 1]; ++ij ) { p = ps[ilocal][ir]; r_p = rdofs[ilocal][ir]; /* local in proc. p */ r_global = r_p + hypre_ParChordMatrixFirstindexRdof(Ac)[p]; r_local = r_global - hypre_ParChordMatrixFirstindexRdof(Ac)[my_id]; a_j[ij] = r_local; a_data[ij] = datas[ilocal][ir]; ir++; }; }; for ( i = 0; i < hypre_ParChordMatrixNumIdofs(Ac); ++i ) { hypre_TFree( ps[i], HYPRE_MEMORY_HOST); hypre_TFree( rdofs[i], HYPRE_MEMORY_HOST); hypre_TFree( datas[i], HYPRE_MEMORY_HOST); }; hypre_TFree( ps, HYPRE_MEMORY_HOST); hypre_TFree( rdofs, HYPRE_MEMORY_HOST); hypre_TFree( datas, HYPRE_MEMORY_HOST); hypre_TFree( ilen, HYPRE_MEMORY_HOST); first_col_diag = col_starts[my_id]; last_col_diag = col_starts[my_id + 1] - 1; hypre_CSRMatrixData(local_A) = a_data; hypre_CSRMatrixI(local_A) = a_i; hypre_CSRMatrixJ(local_A) = a_j; hypre_CSRMatrixOwnsData(local_A) = 0; GenerateDiagAndOffd(local_A, Ap, first_col_diag, last_col_diag); /* set pointers back to NULL before destroying */ if (my_id == 0) { hypre_TFree(a_data, HYPRE_MEMORY_HOST); /* ... the data has been copied into different diag & offd arrays of Ap */ hypre_TFree(a_j, HYPRE_MEMORY_HOST); hypre_TFree(a_i, HYPRE_MEMORY_HOST); hypre_CSRMatrixData(local_A) = NULL; hypre_CSRMatrixI(local_A) = NULL; hypre_CSRMatrixJ(local_A) = NULL; } hypre_CSRMatrixDestroy(local_A); hypre_TFree(local_num_rows, HYPRE_MEMORY_HOST); /* hypre_TFree(csr_matrix_datatypes);*/ return 0; } HYPRE_Int hypre_ParCSRMatrixToParChordMatrix( hypre_ParCSRMatrix *Ap, MPI_Comm comm, hypre_ParChordMatrix **pAc ) { HYPRE_BigInt * row_starts = hypre_ParCSRMatrixRowStarts(Ap); HYPRE_BigInt * col_starts = hypre_ParCSRMatrixColStarts(Ap); hypre_CSRMatrix * diag = hypre_ParCSRMatrixDiag(Ap); hypre_CSRMatrix * offd = hypre_ParCSRMatrixOffd(Ap); HYPRE_Int * offd_j = hypre_CSRMatrixJ(offd); HYPRE_Int * diag_j = hypre_CSRMatrixJ(diag); HYPRE_BigInt * col_map_offd = hypre_ParCSRMatrixColMapOffd(Ap); HYPRE_BigInt first_col_diag = hypre_ParCSRMatrixFirstColDiag(Ap); hypre_ParChordMatrix * Ac; hypre_NumbersNode * rdofs, * offd_cols_me; hypre_NumbersNode ** offd_cols; HYPRE_Int ** offd_col_array; HYPRE_Int * len_offd_col_array, * offd_col_array_me; HYPRE_Int len_offd_col_array_me; HYPRE_Int num_idofs, num_rdofs, j_local, j_global, row_global; HYPRE_Int i, j, jj, p, pto, q, qto, my_id, my_q, row, ireq; HYPRE_Int num_inprocessors, num_toprocessors, num_procs, len_num_rdofs_toprocessor; HYPRE_Int *inprocessor, *toprocessor, *pcr, *qcr, *num_inchords, *chord, *chordto; HYPRE_Int *inproc, *toproc, *num_rdofs_toprocessor; HYPRE_Int **inchord_idof, **inchord_rdof, **rdof_toprocessor; HYPRE_Complex **inchord_data; HYPRE_Complex data; HYPRE_Int *first_index_idof, *first_index_rdof; hypre_MPI_Request * request; hypre_MPI_Status * status; hypre_MPI_Comm_rank(comm, &my_id); hypre_MPI_Comm_size(comm, &num_procs); num_idofs = row_starts[my_id + 1] - row_starts[my_id]; num_rdofs = col_starts[my_id + 1] - col_starts[my_id]; hypre_ParChordMatrixCreate( pAc, comm, num_idofs, num_rdofs ); Ac = *pAc; /* The following block sets Inprocessor: On each proc. my_id, we find the columns in the offd and diag blocks (global no.s). The columns are rdofs (contrary to what I wrote in ChordMatrix.txt). For each such col/rdof r, find the proc. p which owns row/idof r. We set the temporary array pcr[p]=1 for such p. An MPI all-to-all will exchange such arrays so my_id's array qcr has qcr[q]=1 iff, on proc. q, pcr[my_id]=1. In other words, qcr[q]=1 if my_id owns a row/idof i which is the same as a col/rdof owned by q. Collect all such q's into in the array Inprocessor. While constructing pcr, we also construct pj such that for any index jj into offd_j,offd_data, pj[jj] is the processor which owns jj as a row (idof) (the number jj is local to this processor). */ pcr = hypre_CTAlloc( HYPRE_Int, num_procs, HYPRE_MEMORY_HOST); qcr = hypre_CTAlloc( HYPRE_Int, num_procs, HYPRE_MEMORY_HOST); for ( p = 0; p < num_procs; ++p ) { pcr[p] = 0; } for ( jj = 0; jj < hypre_CSRMatrixNumNonzeros(offd); ++jj ) { j_local = offd_j[jj]; j_global = col_map_offd[j_local]; for ( p = 0; p < num_procs; ++p ) { if ( j_global >= row_starts[p] && j_global < row_starts[p + 1] ) { pcr[p] = 1; /* not used yet... pj[jj] = p;*/ break; } } } /* jjd = jj; ...not used yet */ /* pcr[my_id] = 1; ...for square matrices (with nonzero diag block) this one line would do the job of the following nested loop. For non-square matrices, the data distribution is too arbitrary. */ for ( jj = 0; jj < hypre_CSRMatrixNumNonzeros(diag); ++jj ) { j_local = diag_j[jj]; j_global = j_local + first_col_diag; for ( p = 0; p < num_procs; ++p ) { if ( j_global >= row_starts[p] && j_global < row_starts[p + 1] ) { pcr[p] = 1; /* not used yet... pj[jj+jjd] = p;*/ break; } } } /* Now pcr[p]=1 iff my_id owns a col/rdof r which proc. p owns as a row/idof */ hypre_MPI_Alltoall( pcr, 1, HYPRE_MPI_INT, qcr, 1, HYPRE_MPI_INT, comm ); /* Now qcr[q]==1 if my_id owns a row/idof i which is a col/rdof of proc. q The array of such q's is the array Inprocessor. */ num_inprocessors = 0; for ( q = 0; q < num_procs; ++q ) if ( qcr[q] == 1 ) { ++num_inprocessors; } inprocessor = hypre_CTAlloc( HYPRE_Int, num_inprocessors, HYPRE_MEMORY_HOST); p = 0; for ( q = 0; q < num_procs; ++q ) if ( qcr[q] == 1 ) { inprocessor[ p++ ] = q; } num_toprocessors = 0; for ( q = 0; q < num_procs; ++q ) if ( pcr[q] == 1 ) { ++num_toprocessors; } toprocessor = hypre_CTAlloc( HYPRE_Int, num_toprocessors, HYPRE_MEMORY_HOST); p = 0; for ( q = 0; q < num_procs; ++q ) if ( pcr[q] == 1 ) { toprocessor[ p++ ] = q; } hypre_ParChordMatrixNumInprocessors(Ac) = num_inprocessors; hypre_ParChordMatrixInprocessor(Ac) = inprocessor; hypre_ParChordMatrixNumToprocessors(Ac) = num_toprocessors; hypre_ParChordMatrixToprocessor(Ac) = toprocessor; hypre_TFree( qcr, HYPRE_MEMORY_HOST); /* FirstIndexIdof[p] is the global index of proc. p's row 0 */ /* FirstIndexRdof[p] is the global index of proc. p's col 0 */ /* Fir FirstIndexIdof, we copy the array row_starts rather than its pointers, because the chord matrix will think it's free to delete FirstIndexIdof */ /* col_starts[p] contains the global index of the first column in the diag block of p. But for first_index_rdof we want the global index of the first column in p (whether that's in the diag or offd block). So it's more involved than row/idof: we also check the offd block, and have to do a gather to get first_index_rdof for every proc. on every proc. */ first_index_idof = hypre_CTAlloc( HYPRE_Int, num_procs + 1, HYPRE_MEMORY_HOST); first_index_rdof = hypre_CTAlloc( HYPRE_Int, num_procs + 1, HYPRE_MEMORY_HOST); for ( p = 0; p <= num_procs; ++p ) { first_index_idof[p] = row_starts[p]; first_index_rdof[p] = col_starts[p]; }; if ( hypre_CSRMatrixNumRows(offd) > 0 && hypre_CSRMatrixNumCols(offd) > 0 ) first_index_rdof[my_id] = col_starts[my_id] < col_map_offd[0] ? col_starts[my_id] : col_map_offd[0]; hypre_MPI_Allgather( &first_index_rdof[my_id], 1, HYPRE_MPI_INT, first_index_rdof, 1, HYPRE_MPI_INT, comm ); /* Set num_inchords: num_inchords[p] is no. chords on my_id connected to p. Set each chord (idof,jdof,data). We go through each matrix element in the diag block, find what processor owns its column no. as a row, then update num_inchords[p], inchord_idof[p], inchord_rdof[p], inchord_data[p]. */ inchord_idof = hypre_CTAlloc( HYPRE_Int*, num_inprocessors, HYPRE_MEMORY_HOST); inchord_rdof = hypre_CTAlloc( HYPRE_Int*, num_inprocessors, HYPRE_MEMORY_HOST); inchord_data = hypre_CTAlloc( HYPRE_Complex*, num_inprocessors, HYPRE_MEMORY_HOST); num_inchords = hypre_CTAlloc( HYPRE_Int, num_inprocessors, HYPRE_MEMORY_HOST); chord = hypre_CTAlloc( HYPRE_Int, num_inprocessors, HYPRE_MEMORY_HOST); chordto = hypre_CTAlloc( HYPRE_Int, num_toprocessors, HYPRE_MEMORY_HOST); num_rdofs = 0; for ( q = 0; q < num_inprocessors; ++q ) { num_inchords[q] = 0; } my_q = -1; for ( q = 0; q < num_inprocessors; ++q ) if ( inprocessor[q] == my_id ) { my_q = q; } hypre_assert( my_q >= 0 ); /* diag block: first count chords (from my_id to my_id), then set them from diag block's CSR data structure */ num_idofs = hypre_CSRMatrixNumRows(diag); rdofs = hypre_NumbersNewNode(); for ( row = 0; row < hypre_CSRMatrixNumRows(diag); ++row ) { for ( i = hypre_CSRMatrixI(diag)[row]; i < hypre_CSRMatrixI(diag)[row + 1]; ++i ) { j_local = hypre_CSRMatrixJ(diag)[i]; hypre_NumbersEnter( rdofs, j_local ); ++num_inchords[my_q]; } }; num_rdofs = hypre_NumbersNEntered( rdofs ); inchord_idof[my_q] = hypre_CTAlloc( HYPRE_Int, num_inchords[my_q], HYPRE_MEMORY_HOST); inchord_rdof[my_q] = hypre_CTAlloc( HYPRE_Int, num_inchords[my_q], HYPRE_MEMORY_HOST); inchord_data[my_q] = hypre_CTAlloc( HYPRE_Complex, num_inchords[my_q], HYPRE_MEMORY_HOST); chord[0] = 0; for ( row = 0; row < hypre_CSRMatrixNumRows(diag); ++row ) { for ( i = hypre_CSRMatrixI(diag)[row]; i < hypre_CSRMatrixI(diag)[row + 1]; ++i ) { j_local = hypre_CSRMatrixJ(diag)[i]; data = hypre_CSRMatrixData(diag)[i]; inchord_idof[my_q][chord[0]] = row; /* Here We need to convert from j_local - a column local to the diag of this proc., to a j which is local only to this processor - a column (rdof) numbering scheme to be shared by the diag and offd blocks... */ j_global = j_local + hypre_ParCSRMatrixColStarts(Ap)[my_q]; j = j_global - first_index_rdof[my_q]; inchord_rdof[my_q][chord[0]] = j; inchord_data[my_q][chord[0]] = data; hypre_assert( chord[0] < num_inchords[my_q] ); ++chord[0]; } }; hypre_NumbersDeleteNode(rdofs); /* offd block: */ /* offd_cols_me duplicates rdofs */ offd_cols_me = hypre_NumbersNewNode(); for ( row = 0; row < hypre_CSRMatrixNumRows(offd); ++row ) { for ( i = hypre_CSRMatrixI(offd)[row]; i < hypre_CSRMatrixI(offd)[row + 1]; ++i ) { j_local = hypre_CSRMatrixJ(offd)[i]; j_global = col_map_offd[j_local]; hypre_NumbersEnter( offd_cols_me, j_global ); } } offd_col_array = hypre_CTAlloc( HYPRE_Int*, num_inprocessors, HYPRE_MEMORY_HOST); len_offd_col_array = hypre_CTAlloc( HYPRE_Int, num_inprocessors, HYPRE_MEMORY_HOST); offd_col_array_me = hypre_NumbersArray( offd_cols_me ); len_offd_col_array_me = hypre_NumbersNEntered( offd_cols_me ); request = hypre_CTAlloc(hypre_MPI_Request, 2 * num_procs, HYPRE_MEMORY_HOST); ireq = 0; for ( q = 0; q < num_inprocessors; ++q ) hypre_MPI_Irecv( &len_offd_col_array[q], 1, HYPRE_MPI_INT, inprocessor[q], 0, comm, &request[ireq++] ); for ( p = 0; p < num_procs; ++p ) if ( pcr[p] == 1 ) { hypre_MPI_Isend( &len_offd_col_array_me, 1, HYPRE_MPI_INT, p, 0, comm, &request[ireq++] ); } status = hypre_CTAlloc(hypre_MPI_Status, ireq, HYPRE_MEMORY_HOST); hypre_MPI_Waitall( ireq, request, status ); hypre_TFree(status, HYPRE_MEMORY_HOST); ireq = 0; for ( q = 0; q < num_inprocessors; ++q ) { offd_col_array[q] = hypre_CTAlloc( HYPRE_Int, len_offd_col_array[q], HYPRE_MEMORY_HOST); } for ( q = 0; q < num_inprocessors; ++q ) hypre_MPI_Irecv( offd_col_array[q], len_offd_col_array[q], HYPRE_MPI_INT, inprocessor[q], 0, comm, &request[ireq++] ); for ( p = 0; p < num_procs; ++p ) if ( pcr[p] == 1 ) { hypre_MPI_Isend( offd_col_array_me, len_offd_col_array_me, HYPRE_MPI_INT, p, 0, comm, &request[ireq++] ); } status = hypre_CTAlloc(hypre_MPI_Status, ireq, HYPRE_MEMORY_HOST); hypre_MPI_Waitall( ireq, request, status ); hypre_TFree(request, HYPRE_MEMORY_HOST); hypre_TFree(status, HYPRE_MEMORY_HOST); offd_cols = hypre_CTAlloc( hypre_NumbersNode *, num_inprocessors, HYPRE_MEMORY_HOST); for ( q = 0; q < num_inprocessors; ++q ) { offd_cols[q] = hypre_NumbersNewNode(); for ( i = 0; i < len_offd_col_array[q]; ++i ) { hypre_NumbersEnter( offd_cols[q], offd_col_array[q][i] ); } } len_num_rdofs_toprocessor = 1 + hypre_CSRMatrixI(offd) [hypre_CSRMatrixNumRows(offd)]; inproc = hypre_CTAlloc( HYPRE_Int, len_num_rdofs_toprocessor, HYPRE_MEMORY_HOST); toproc = hypre_CTAlloc( HYPRE_Int, len_num_rdofs_toprocessor, HYPRE_MEMORY_HOST); num_rdofs_toprocessor = hypre_CTAlloc( HYPRE_Int, len_num_rdofs_toprocessor, HYPRE_MEMORY_HOST); for ( qto = 0; qto < len_num_rdofs_toprocessor; ++qto ) { inproc[qto] = -1; toproc[qto] = -1; num_rdofs_toprocessor[qto] = 0; }; rdofs = hypre_NumbersNewNode(); for ( row = 0; row < hypre_CSRMatrixNumRows(offd); ++row ) { for ( i = hypre_CSRMatrixI(offd)[row]; i < hypre_CSRMatrixI(offd)[row + 1]; ++i ) { j_local = hypre_CSRMatrixJ(offd)[i]; j_global = col_map_offd[j_local]; hypre_NumbersEnter( rdofs, j_local ); /* TO DO: find faster ways to do the two processor lookups below.*/ /* Find a processor p (local index q) from the inprocessor list, which owns the column(rdof) whichis the same as this processor's row(idof) row. Update num_inchords for p. Save q as inproc[i] for quick recall later. It represents an inprocessor (not unique) connected to a chord i. */ inproc[i] = -1; for ( q = 0; q < num_inprocessors; ++q ) if (q != my_q) { p = inprocessor[q]; if ( hypre_NumbersQuery( offd_cols[q], row + hypre_ParCSRMatrixFirstRowIndex(Ap) ) == 1 ) { /* row is one of the offd columns of p */ ++num_inchords[q]; inproc[i] = q; break; } } if ( inproc[i] < 0 ) { /* For square matrices, we would have found the column in some other processor's offd. But for non-square matrices it could exist only in some other processor's diag...*/ /* Note that all data in a diag block is stored. We don't check whether the value of a data entry is zero. */ for ( q = 0; q < num_inprocessors; ++q ) if (q != my_q) { p = inprocessor[q]; row_global = row + hypre_ParCSRMatrixFirstRowIndex(Ap); if ( row_global >= col_starts[p] && row_global < col_starts[p + 1] ) { /* row is one of the diag columns of p */ ++num_inchords[q]; inproc[i] = q; break; } } } hypre_assert( inproc[i] >= 0 ); /* Find the processor pto (local index qto) from the toprocessor list, which owns the row(idof) which is the same as this processor's column(rdof) j_global. Update num_rdofs_toprocessor for pto. Save pto as toproc[i] for quick recall later. It represents the toprocessor connected to a chord i. */ for ( qto = 0; qto < num_toprocessors; ++qto ) { pto = toprocessor[qto]; if ( j_global >= row_starts[pto] && j_global < row_starts[pto + 1] ) { hypre_assert( qto < len_num_rdofs_toprocessor ); ++num_rdofs_toprocessor[qto]; /* ... an overestimate, as if two chords share an rdof, that rdof will be counted twice in num_rdofs_toprocessor. It can be fixed up later.*/ toproc[i] = qto; break; } } } }; num_rdofs += hypre_NumbersNEntered(rdofs); hypre_NumbersDeleteNode(rdofs); for ( q = 0; q < num_inprocessors; ++q ) if (q != my_q) { inchord_idof[q] = hypre_CTAlloc( HYPRE_Int, num_inchords[q], HYPRE_MEMORY_HOST); inchord_rdof[q] = hypre_CTAlloc( HYPRE_Int, num_inchords[q], HYPRE_MEMORY_HOST); inchord_data[q] = hypre_CTAlloc( HYPRE_Complex, num_inchords[q], HYPRE_MEMORY_HOST); chord[q] = 0; }; for ( q = 0; q < num_inprocessors; ++q ) if (q != my_q) { for ( i = 0; i < num_inchords[q]; ++i ) { inchord_idof[q][i] = -1; } }; rdof_toprocessor = hypre_CTAlloc( HYPRE_Int*, num_toprocessors, HYPRE_MEMORY_HOST); for ( qto = 0; qto < num_toprocessors; ++qto ) /*if (qto!=my_q)*/ { hypre_assert( qto < len_num_rdofs_toprocessor ); rdof_toprocessor[qto] = hypre_CTAlloc( HYPRE_Int, num_rdofs_toprocessor[qto], HYPRE_MEMORY_HOST); chordto[qto] = 0; }; for ( row = 0; row < hypre_CSRMatrixNumRows(offd); ++row ) { for ( i = hypre_CSRMatrixI(offd)[row]; i < hypre_CSRMatrixI(offd)[row + 1]; ++i ) { j_local = hypre_CSRMatrixJ(offd)[i]; j_global = col_map_offd[j_local]; data = hypre_CSRMatrixData(offd)[i]; qto = toproc[i]; q = inproc[i]; hypre_assert( q != my_q ); hypre_assert( chord[q] < num_inchords[q] ); inchord_idof[q][chord[q]] = row; j = j_global - first_index_rdof[q]; inchord_rdof[q][chord[q]] = j; inchord_data[q][chord[q]] = data; /* Note that although inchord_* is organized according to the inprocessors, the rdof has the local number of a toprocessor - the only thing which makes sense and fits with what I've been told about chord matrices. */ hypre_assert( chord[q] < num_inchords[q] ); ++chord[q]; if ( qto >= 0 ) { /* There is an rdof processor for this chord */ rdof_toprocessor[qto][chordto[qto]] = j; ++chordto[qto]; } } }; /* fix up overestimate of num_rdofs_toprocessor. We're not going to bother to fix the excessive size which has been allocated to rdof_toprocessor... */ for ( qto = 0; qto < num_toprocessors; ++qto ) /*if (qto!=my_q)*/ { num_rdofs_toprocessor[qto] = chordto[qto] - 1; } hypre_NumbersDeleteNode( offd_cols_me ); for ( q = 0; q < num_inprocessors; ++q ) { hypre_NumbersDeleteNode( offd_cols[q]); } hypre_TFree( offd_cols, HYPRE_MEMORY_HOST); for ( q = 0; q < num_inprocessors; ++q ) { hypre_TFree( offd_col_array[q], HYPRE_MEMORY_HOST); } hypre_TFree( offd_col_array, HYPRE_MEMORY_HOST); hypre_TFree( len_offd_col_array, HYPRE_MEMORY_HOST); hypre_TFree( chordto, HYPRE_MEMORY_HOST); hypre_TFree( inproc, HYPRE_MEMORY_HOST); hypre_TFree( toproc, HYPRE_MEMORY_HOST); hypre_TFree( chord, HYPRE_MEMORY_HOST); hypre_TFree( pcr, HYPRE_MEMORY_HOST); hypre_ParChordMatrixFirstindexIdof(Ac) = first_index_idof; hypre_ParChordMatrixFirstindexRdof(Ac) = first_index_rdof; hypre_ParChordMatrixNumInchords(Ac) = num_inchords; hypre_ParChordMatrixInchordIdof(Ac) = inchord_idof; hypre_ParChordMatrixInchordRdof(Ac) = inchord_rdof; hypre_ParChordMatrixInchordData(Ac) = inchord_data; hypre_ParChordMatrixNumIdofs(Ac) = num_idofs; hypre_ParChordMatrixNumRdofs(Ac) = num_rdofs; hypre_ParChordMatrixNumRdofsToprocessor(Ac) = num_rdofs_toprocessor; hypre_ParChordMatrixRdofToprocessor(Ac) = rdof_toprocessor; /* >>> to set... hypre_ParChordMatrixNumIdofsInprocessor(Ac) (low priority - not used); hypre_ParChordMatrixIdofInprocessor(Ac) (low priority - not used); */ return 0; } hypre-2.33.0/src/parcsr_mv/protos.h000066400000000000000000001472341477326011500172310ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /* communicationT.c */ void hypre_RowsWithColumn_original ( HYPRE_Int *rowmin, HYPRE_Int *rowmax, HYPRE_BigInt column, hypre_ParCSRMatrix *A ); void hypre_RowsWithColumn ( HYPRE_Int *rowmin, HYPRE_Int *rowmax, HYPRE_BigInt column, HYPRE_Int num_rows_diag, HYPRE_BigInt firstColDiag, HYPRE_BigInt *colMapOffd, HYPRE_Int *mat_i_diag, HYPRE_Int *mat_j_diag, HYPRE_Int *mat_i_offd, HYPRE_Int *mat_j_offd ); void hypre_MatTCommPkgCreate_core ( MPI_Comm comm, HYPRE_BigInt *col_map_offd, HYPRE_BigInt first_col_diag, HYPRE_BigInt *col_starts, HYPRE_Int num_rows_diag, HYPRE_Int num_cols_diag, HYPRE_Int num_cols_offd, HYPRE_BigInt *row_starts, HYPRE_BigInt firstColDiag, HYPRE_BigInt *colMapOffd, HYPRE_Int *mat_i_diag, HYPRE_Int *mat_j_diag, HYPRE_Int *mat_i_offd, HYPRE_Int *mat_j_offd, HYPRE_Int data, HYPRE_Int *p_num_recvs, HYPRE_Int **p_recv_procs, HYPRE_Int **p_recv_vec_starts, HYPRE_Int *p_num_sends, HYPRE_Int **p_send_procs, HYPRE_Int **p_send_map_starts, HYPRE_Int **p_send_map_elmts ); HYPRE_Int hypre_MatTCommPkgCreate ( hypre_ParCSRMatrix *A ); /* driver_aat.c */ /* driver_boolaat.c */ /* driver_boolmatmul.c */ /* driver.c */ /* driver_matmul.c */ /* driver_mat_multivec.c */ /* driver_matvec.c */ /* driver_multivec.c */ /* HYPRE_parcsr_matrix.c */ HYPRE_Int HYPRE_ParCSRMatrixCreate ( MPI_Comm comm, HYPRE_BigInt global_num_rows, HYPRE_BigInt global_num_cols, HYPRE_BigInt *row_starts, HYPRE_BigInt *col_starts, HYPRE_Int num_cols_offd, HYPRE_Int num_nonzeros_diag, HYPRE_Int num_nonzeros_offd, HYPRE_ParCSRMatrix *matrix ); HYPRE_Int HYPRE_ParCSRMatrixDestroy ( HYPRE_ParCSRMatrix matrix ); HYPRE_Int HYPRE_ParCSRMatrixInitialize ( HYPRE_ParCSRMatrix matrix ); HYPRE_Int HYPRE_ParCSRMatrixBigInitialize ( HYPRE_ParCSRMatrix matrix ); HYPRE_Int HYPRE_ParCSRMatrixRead ( MPI_Comm comm, const char *file_name, HYPRE_ParCSRMatrix *matrix ); HYPRE_Int HYPRE_ParCSRMatrixPrint ( HYPRE_ParCSRMatrix matrix, const char *file_name ); HYPRE_Int HYPRE_ParCSRMatrixGetComm ( HYPRE_ParCSRMatrix matrix, MPI_Comm *comm ); HYPRE_Int HYPRE_ParCSRMatrixGetDims ( HYPRE_ParCSRMatrix matrix, HYPRE_BigInt *M, HYPRE_BigInt *N ); HYPRE_Int HYPRE_ParCSRMatrixGetRowPartitioning ( HYPRE_ParCSRMatrix matrix, HYPRE_BigInt **row_partitioning_ptr ); HYPRE_Int HYPRE_ParCSRMatrixGetGlobalRowPartitioning ( HYPRE_ParCSRMatrix matrix, HYPRE_Int all_procs, HYPRE_BigInt **row_partitioning_ptr ); HYPRE_Int HYPRE_ParCSRMatrixGetColPartitioning ( HYPRE_ParCSRMatrix matrix, HYPRE_BigInt **col_partitioning_ptr ); HYPRE_Int HYPRE_ParCSRMatrixGetLocalRange ( HYPRE_ParCSRMatrix matrix, HYPRE_BigInt *row_start, HYPRE_BigInt *row_end, HYPRE_BigInt *col_start, HYPRE_BigInt *col_end ); HYPRE_Int HYPRE_ParCSRMatrixGetRow ( HYPRE_ParCSRMatrix matrix, HYPRE_BigInt row, HYPRE_Int *size, HYPRE_BigInt **col_ind, HYPRE_Complex **values ); HYPRE_Int HYPRE_ParCSRMatrixRestoreRow ( HYPRE_ParCSRMatrix matrix, HYPRE_BigInt row, HYPRE_Int *size, HYPRE_BigInt **col_ind, HYPRE_Complex **values ); HYPRE_Int HYPRE_CSRMatrixToParCSRMatrix ( MPI_Comm comm, HYPRE_CSRMatrix A_CSR, HYPRE_BigInt *row_partitioning, HYPRE_BigInt *col_partitioning, HYPRE_ParCSRMatrix *matrix ); HYPRE_Int HYPRE_CSRMatrixToParCSRMatrix_WithNewPartitioning ( MPI_Comm comm, HYPRE_CSRMatrix A_CSR, HYPRE_ParCSRMatrix *matrix ); HYPRE_Int HYPRE_ParCSRMatrixMatvec ( HYPRE_Complex alpha, HYPRE_ParCSRMatrix A, HYPRE_ParVector x, HYPRE_Complex beta, HYPRE_ParVector y ); HYPRE_Int HYPRE_ParCSRMatrixMatvecT ( HYPRE_Complex alpha, HYPRE_ParCSRMatrix A, HYPRE_ParVector x, HYPRE_Complex beta, HYPRE_ParVector y ); /* HYPRE_parcsr_vector.c */ HYPRE_Int HYPRE_ParVectorCreate ( MPI_Comm comm, HYPRE_BigInt global_size, HYPRE_BigInt *partitioning, HYPRE_ParVector *vector ); HYPRE_Int HYPRE_ParMultiVectorCreate ( MPI_Comm comm, HYPRE_BigInt global_size, HYPRE_BigInt *partitioning, HYPRE_Int number_vectors, HYPRE_ParVector *vector ); HYPRE_Int HYPRE_ParVectorDestroy ( HYPRE_ParVector vector ); HYPRE_Int HYPRE_ParVectorInitialize ( HYPRE_ParVector vector ); HYPRE_Int HYPRE_ParVectorRead ( MPI_Comm comm, const char *file_name, HYPRE_ParVector *vector ); HYPRE_Int HYPRE_ParVectorPrint ( HYPRE_ParVector vector, const char *file_name ); HYPRE_Int HYPRE_ParVectorPrintBinaryIJ ( HYPRE_ParVector vector, const char *file_name ); HYPRE_Int HYPRE_ParVectorSetConstantValues ( HYPRE_ParVector vector, HYPRE_Complex value ); HYPRE_Int HYPRE_ParVectorSetRandomValues ( HYPRE_ParVector vector, HYPRE_Int seed ); HYPRE_Int HYPRE_ParVectorCopy ( HYPRE_ParVector x, HYPRE_ParVector y ); HYPRE_Int hypre_ParVectorStridedCopy( hypre_ParVector *x, HYPRE_Int istride, HYPRE_Int ostride, HYPRE_Int size, HYPRE_Complex *data ); HYPRE_ParVector HYPRE_ParVectorCloneShallow ( HYPRE_ParVector x ); HYPRE_Int HYPRE_ParVectorScale ( HYPRE_Complex value, HYPRE_ParVector x ); HYPRE_Int HYPRE_ParVectorAxpy ( HYPRE_Complex alpha, HYPRE_ParVector x, HYPRE_ParVector y ); HYPRE_Int HYPRE_ParVectorInnerProd ( HYPRE_ParVector x, HYPRE_ParVector y, HYPRE_Real *prod ); HYPRE_Int HYPRE_VectorToParVector ( MPI_Comm comm, HYPRE_Vector b, HYPRE_BigInt *partitioning, HYPRE_ParVector *vector ); HYPRE_Int HYPRE_ParVectorGetValues ( HYPRE_ParVector vector, HYPRE_Int num_values, HYPRE_BigInt *indices, HYPRE_Complex *values); /* gen_fffc.c */ HYPRE_Int hypre_ParCSRMatrixGenerateFFFCHost( hypre_ParCSRMatrix *A, HYPRE_Int *CF_marker, HYPRE_BigInt *cpts_starts, hypre_ParCSRMatrix *S, hypre_ParCSRMatrix **A_FC_ptr, hypre_ParCSRMatrix **A_FF_ptr ) ; HYPRE_Int hypre_ParCSRMatrixGenerateFFFC( hypre_ParCSRMatrix *A, HYPRE_Int *CF_marker, HYPRE_BigInt *cpts_starts, hypre_ParCSRMatrix *S, hypre_ParCSRMatrix **A_FC_ptr, hypre_ParCSRMatrix **A_FF_ptr ) ; HYPRE_Int hypre_ParCSRMatrixGenerateFFFC3(hypre_ParCSRMatrix *A, HYPRE_Int *CF_marker, HYPRE_BigInt *cpts_starts, hypre_ParCSRMatrix *S, hypre_ParCSRMatrix **A_FC_ptr, hypre_ParCSRMatrix **A_FF_ptr ) ; HYPRE_Int hypre_ParCSRMatrixGenerateFFFCD3(hypre_ParCSRMatrix *A, HYPRE_Int *CF_marker, HYPRE_BigInt *cpts_starts, hypre_ParCSRMatrix *S, hypre_ParCSRMatrix **A_FC_ptr, hypre_ParCSRMatrix **A_FF_ptr, HYPRE_Real **D_lambda_ptr ) ; HYPRE_Int hypre_ParCSRMatrixGenerateFFFC3Device(hypre_ParCSRMatrix *A, HYPRE_Int *CF_marker, HYPRE_BigInt *cpts_starts, hypre_ParCSRMatrix *S, hypre_ParCSRMatrix **A_FC_ptr, hypre_ParCSRMatrix **A_FF_ptr ) ; HYPRE_Int hypre_ParCSRMatrixGenerateCFDevice( hypre_ParCSRMatrix *A, HYPRE_Int *CF_marker, HYPRE_BigInt *cpts_starts, hypre_ParCSRMatrix *S, hypre_ParCSRMatrix **ACF_ptr) ; HYPRE_Int hypre_ParCSRMatrixGenerateCCDevice( hypre_ParCSRMatrix *A, HYPRE_Int *CF_marker, HYPRE_BigInt *cpts_starts, hypre_ParCSRMatrix *S, hypre_ParCSRMatrix **ACC_ptr) ; HYPRE_Int hypre_ParCSRMatrixGenerate1DCFDevice( hypre_ParCSRMatrix *A, HYPRE_Int *CF_marker, HYPRE_BigInt *cpts_starts, hypre_ParCSRMatrix *S, hypre_ParCSRMatrix **ACX_ptr, hypre_ParCSRMatrix **AXC_ptr ) ; /* new_commpkg.c */ HYPRE_Int hypre_PrintCommpkg ( hypre_ParCSRMatrix *A, const char *file_name ); HYPRE_Int hypre_ParCSRCommPkgCreateApart_core ( MPI_Comm comm, HYPRE_BigInt *col_map_off_d, HYPRE_BigInt first_col_diag, HYPRE_Int num_cols_off_d, HYPRE_BigInt global_num_cols, HYPRE_Int *p_num_recvs, HYPRE_Int **p_recv_procs, HYPRE_Int **p_recv_vec_starts, HYPRE_Int *p_num_sends, HYPRE_Int **p_send_procs, HYPRE_Int **p_send_map_starts, HYPRE_Int **p_send_map_elements, hypre_IJAssumedPart *apart ); HYPRE_Int hypre_ParCSRCommPkgCreateApart ( MPI_Comm comm, HYPRE_BigInt *col_map_off_d, HYPRE_BigInt first_col_diag, HYPRE_Int num_cols_off_d, HYPRE_BigInt global_num_cols, hypre_IJAssumedPart *apart, hypre_ParCSRCommPkg *comm_pkg ); HYPRE_Int hypre_NewCommPkgDestroy ( hypre_ParCSRMatrix *parcsr_A ); HYPRE_Int hypre_RangeFillResponseIJDetermineRecvProcs ( void *p_recv_contact_buf, HYPRE_Int contact_size, HYPRE_Int contact_proc, void *ro, MPI_Comm comm, void **p_send_response_buf, HYPRE_Int *response_message_size ); HYPRE_Int hypre_FillResponseIJDetermineSendProcs ( void *p_recv_contact_buf, HYPRE_Int contact_size, HYPRE_Int contact_proc, void *ro, MPI_Comm comm, void **p_send_response_buf, HYPRE_Int *response_message_size ); /* numbers.c */ hypre_NumbersNode *hypre_NumbersNewNode ( void ); void hypre_NumbersDeleteNode ( hypre_NumbersNode *node ); HYPRE_Int hypre_NumbersEnter ( hypre_NumbersNode *node, const HYPRE_Int n ); HYPRE_Int hypre_NumbersNEntered ( hypre_NumbersNode *node ); HYPRE_Int hypre_NumbersQuery ( hypre_NumbersNode *node, const HYPRE_Int n ); HYPRE_Int *hypre_NumbersArray ( hypre_NumbersNode *node ); /* parchord_to_parcsr.c */ void hypre_ParChordMatrix_RowStarts ( hypre_ParChordMatrix *Ac, MPI_Comm comm, HYPRE_BigInt **row_starts, HYPRE_BigInt *global_num_cols ); HYPRE_Int hypre_ParChordMatrixToParCSRMatrix ( hypre_ParChordMatrix *Ac, MPI_Comm comm, hypre_ParCSRMatrix **pAp ); HYPRE_Int hypre_ParCSRMatrixToParChordMatrix ( hypre_ParCSRMatrix *Ap, MPI_Comm comm, hypre_ParChordMatrix **pAc ); /* par_csr_aat.c */ void hypre_ParAat_RowSizes ( HYPRE_Int **C_diag_i, HYPRE_Int **C_offd_i, HYPRE_Int *B_marker, HYPRE_Int *A_diag_i, HYPRE_Int *A_diag_j, HYPRE_Int *A_offd_i, HYPRE_Int *A_offd_j, HYPRE_BigInt *A_col_map_offd, HYPRE_Int *A_ext_i, HYPRE_BigInt *A_ext_j, HYPRE_BigInt *A_ext_row_map, HYPRE_Int *C_diag_size, HYPRE_Int *C_offd_size, HYPRE_Int num_rows_diag_A, HYPRE_Int num_cols_offd_A, HYPRE_Int num_rows_A_ext, HYPRE_BigInt first_col_diag_A, HYPRE_BigInt first_row_index_A ); hypre_ParCSRMatrix *hypre_ParCSRAAt ( hypre_ParCSRMatrix *A ); hypre_CSRMatrix *hypre_ParCSRMatrixExtractAExt ( hypre_ParCSRMatrix *A, HYPRE_Int data, HYPRE_BigInt **pA_ext_row_map ); /* par_csr_assumed_part.c */ HYPRE_Int hypre_LocateAssumedPartition ( MPI_Comm comm, HYPRE_BigInt row_start, HYPRE_BigInt row_end, HYPRE_BigInt global_first_row, HYPRE_BigInt global_num_rows, hypre_IJAssumedPart *part, HYPRE_Int myid ); hypre_IJAssumedPart *hypre_AssumedPartitionCreate ( MPI_Comm comm, HYPRE_BigInt global_num, HYPRE_BigInt start, HYPRE_BigInt end ); HYPRE_Int hypre_ParCSRMatrixCreateAssumedPartition ( hypre_ParCSRMatrix *matrix ); HYPRE_Int hypre_AssumedPartitionDestroy ( hypre_IJAssumedPart *apart ); HYPRE_Int hypre_GetAssumedPartitionProcFromRow ( MPI_Comm comm, HYPRE_BigInt row, HYPRE_BigInt global_first_row, HYPRE_BigInt global_num_rows, HYPRE_Int *proc_id ); HYPRE_Int hypre_GetAssumedPartitionRowRange ( MPI_Comm comm, HYPRE_Int proc_id, HYPRE_BigInt global_first_row, HYPRE_BigInt global_num_rows, HYPRE_BigInt *row_start, HYPRE_BigInt *row_end ); HYPRE_Int hypre_ParVectorCreateAssumedPartition ( hypre_ParVector *vector ); /* par_csr_bool_matop.c */ hypre_ParCSRBooleanMatrix *hypre_ParBooleanMatmul ( hypre_ParCSRBooleanMatrix *A, hypre_ParCSRBooleanMatrix *B ); hypre_CSRBooleanMatrix *hypre_ParCSRBooleanMatrixExtractBExt ( hypre_ParCSRBooleanMatrix *B, hypre_ParCSRBooleanMatrix *A ); hypre_CSRBooleanMatrix *hypre_ParCSRBooleanMatrixExtractAExt ( hypre_ParCSRBooleanMatrix *A, HYPRE_BigInt **pA_ext_row_map ); hypre_ParCSRBooleanMatrix *hypre_ParBooleanAAt ( hypre_ParCSRBooleanMatrix *A ); HYPRE_Int hypre_BooleanMatTCommPkgCreate ( hypre_ParCSRBooleanMatrix *A ); HYPRE_Int hypre_BooleanMatvecCommPkgCreate ( hypre_ParCSRBooleanMatrix *A ); /* par_csr_bool_matrix.c */ hypre_CSRBooleanMatrix *hypre_CSRBooleanMatrixCreate ( HYPRE_Int num_rows, HYPRE_Int num_cols, HYPRE_Int num_nonzeros ); HYPRE_Int hypre_CSRBooleanMatrixDestroy ( hypre_CSRBooleanMatrix *matrix ); HYPRE_Int hypre_CSRBooleanMatrixInitialize ( hypre_CSRBooleanMatrix *matrix ); HYPRE_Int hypre_CSRBooleanMatrixBigInitialize ( hypre_CSRBooleanMatrix *matrix ); HYPRE_Int hypre_CSRBooleanMatrixSetDataOwner ( hypre_CSRBooleanMatrix *matrix, HYPRE_Int owns_data ); HYPRE_Int hypre_CSRBooleanMatrixSetBigDataOwner ( hypre_CSRBooleanMatrix *matrix, HYPRE_Int owns_data ); hypre_CSRBooleanMatrix *hypre_CSRBooleanMatrixRead ( const char *file_name ); HYPRE_Int hypre_CSRBooleanMatrixPrint ( hypre_CSRBooleanMatrix *matrix, const char *file_name ); hypre_ParCSRBooleanMatrix *hypre_ParCSRBooleanMatrixCreate ( MPI_Comm comm, HYPRE_BigInt global_num_rows, HYPRE_BigInt global_num_cols, HYPRE_BigInt *row_starts, HYPRE_BigInt *col_starts, HYPRE_Int num_cols_offd, HYPRE_Int num_nonzeros_diag, HYPRE_Int num_nonzeros_offd ); HYPRE_Int hypre_ParCSRBooleanMatrixDestroy ( hypre_ParCSRBooleanMatrix *matrix ); HYPRE_Int hypre_ParCSRBooleanMatrixInitialize ( hypre_ParCSRBooleanMatrix *matrix ); HYPRE_Int hypre_ParCSRBooleanMatrixSetNNZ ( hypre_ParCSRBooleanMatrix *matrix ); HYPRE_Int hypre_ParCSRBooleanMatrixSetDataOwner ( hypre_ParCSRBooleanMatrix *matrix, HYPRE_Int owns_data ); HYPRE_Int hypre_ParCSRBooleanMatrixSetRowStartsOwner ( hypre_ParCSRBooleanMatrix *matrix, HYPRE_Int owns_row_starts ); HYPRE_Int hypre_ParCSRBooleanMatrixSetColStartsOwner ( hypre_ParCSRBooleanMatrix *matrix, HYPRE_Int owns_col_starts ); hypre_ParCSRBooleanMatrix *hypre_ParCSRBooleanMatrixRead ( MPI_Comm comm, const char *file_name ); HYPRE_Int hypre_ParCSRBooleanMatrixPrint ( hypre_ParCSRBooleanMatrix *matrix, const char *file_name ); HYPRE_Int hypre_ParCSRBooleanMatrixPrintIJ ( hypre_ParCSRBooleanMatrix *matrix, const char *filename ); HYPRE_Int hypre_ParCSRBooleanMatrixGetLocalRange ( hypre_ParCSRBooleanMatrix *matrix, HYPRE_BigInt *row_start, HYPRE_BigInt *row_end, HYPRE_BigInt *col_start, HYPRE_BigInt *col_end ); HYPRE_Int hypre_ParCSRBooleanMatrixGetRow ( hypre_ParCSRBooleanMatrix *mat, HYPRE_BigInt row, HYPRE_Int *size, HYPRE_BigInt **col_ind ); HYPRE_Int hypre_ParCSRBooleanMatrixRestoreRow ( hypre_ParCSRBooleanMatrix *matrix, HYPRE_BigInt row, HYPRE_Int *size, HYPRE_BigInt **col_ind ); HYPRE_Int hypre_BuildCSRBooleanMatrixMPIDataType ( HYPRE_Int num_nonzeros, HYPRE_Int num_rows, HYPRE_Int *a_i, HYPRE_Int *a_j, hypre_MPI_Datatype *csr_matrix_datatype ); hypre_ParCSRBooleanMatrix *hypre_CSRBooleanMatrixToParCSRBooleanMatrix ( MPI_Comm comm, hypre_CSRBooleanMatrix *A, HYPRE_BigInt *row_starts, HYPRE_BigInt *col_starts ); HYPRE_Int hypre_BooleanGenerateDiagAndOffd ( hypre_CSRBooleanMatrix *A, hypre_ParCSRBooleanMatrix *matrix, HYPRE_BigInt first_col_diag, HYPRE_BigInt last_col_diag ); /* par_csr_communication.c */ hypre_ParCSRCommHandle *hypre_ParCSRCommHandleCreate ( HYPRE_Int job, hypre_ParCSRCommPkg *comm_pkg, void *send_data, void *recv_data ); hypre_ParCSRCommHandle *hypre_ParCSRCommHandleCreate_v2 ( HYPRE_Int job, hypre_ParCSRCommPkg *comm_pkg, HYPRE_MemoryLocation send_memory_location, void *send_data_in, HYPRE_MemoryLocation recv_memory_location, void *recv_data_in ); HYPRE_Int hypre_ParCSRCommHandleDestroy ( hypre_ParCSRCommHandle *comm_handle ); void hypre_ParCSRCommPkgCreate_core ( MPI_Comm comm, HYPRE_BigInt *col_map_offd, HYPRE_BigInt first_col_diag, HYPRE_BigInt *col_starts, HYPRE_Int num_cols_diag, HYPRE_Int num_cols_offd, HYPRE_Int *p_num_recvs, HYPRE_Int **p_recv_procs, HYPRE_Int **p_recv_vec_starts, HYPRE_Int *p_num_sends, HYPRE_Int **p_send_procs, HYPRE_Int **p_send_map_starts, HYPRE_Int **p_send_map_elmts ); HYPRE_Int hypre_ParCSRCommPkgCreate(MPI_Comm comm, HYPRE_BigInt *col_map_offd, HYPRE_BigInt first_col_diag, HYPRE_BigInt *col_starts, HYPRE_Int num_cols_diag, HYPRE_Int num_cols_offd, hypre_ParCSRCommPkg *comm_pkg); HYPRE_Int hypre_ParCSRCommPkgCreateAndFill ( MPI_Comm comm, HYPRE_Int num_recvs, HYPRE_Int *recv_procs, HYPRE_Int *recv_vec_starts, HYPRE_Int num_sends, HYPRE_Int *send_procs, HYPRE_Int *send_map_starts, HYPRE_Int *send_map_elmts, hypre_ParCSRCommPkg **comm_pkg_ptr ); HYPRE_Int hypre_ParCSRCommPkgUpdateVecStarts ( hypre_ParCSRCommPkg *comm_pkg, HYPRE_Int num_components_in, HYPRE_Int vecstride, HYPRE_Int idxstride ); HYPRE_Int hypre_MatvecCommPkgCreate ( hypre_ParCSRMatrix *A ); HYPRE_Int hypre_MatvecCommPkgDestroy ( hypre_ParCSRCommPkg *comm_pkg ); HYPRE_Int hypre_BuildCSRMatrixMPIDataType ( HYPRE_Int num_nonzeros, HYPRE_Int num_rows, HYPRE_Complex *a_data, HYPRE_Int *a_i, HYPRE_Int *a_j, hypre_MPI_Datatype *csr_matrix_datatype ); HYPRE_Int hypre_BuildCSRJDataType ( HYPRE_Int num_nonzeros, HYPRE_Complex *a_data, HYPRE_Int *a_j, hypre_MPI_Datatype *csr_jdata_datatype ); HYPRE_Int hypre_ParCSRFindExtendCommPkg(MPI_Comm comm, HYPRE_BigInt global_num_cols, HYPRE_BigInt first_col_diag, HYPRE_Int num_cols_diag, HYPRE_BigInt *col_starts, hypre_IJAssumedPart *apart, HYPRE_Int indices_len, HYPRE_BigInt *indices, hypre_ParCSRCommPkg **extend_comm_pkg); /* par_csr_filter.c */ HYPRE_Int hypre_ParCSRMatrixBlkFilter(hypre_ParCSRMatrix *A, HYPRE_Int block_size, hypre_ParCSRMatrix **B_ptr); /* par_csr_matop.c */ HYPRE_Int hypre_ParCSRMatrixScale(hypre_ParCSRMatrix *A, HYPRE_Complex scalar); void hypre_ParMatmul_RowSizes ( HYPRE_MemoryLocation memory_location, HYPRE_Int **C_diag_i, HYPRE_Int **C_offd_i, HYPRE_Int *rownnz_A, HYPRE_Int *A_diag_i, HYPRE_Int *A_diag_j, HYPRE_Int *A_offd_i, HYPRE_Int *A_offd_j, HYPRE_Int *B_diag_i, HYPRE_Int *B_diag_j, HYPRE_Int *B_offd_i, HYPRE_Int *B_offd_j, HYPRE_Int *B_ext_diag_i, HYPRE_Int *B_ext_diag_j, HYPRE_Int *B_ext_offd_i, HYPRE_Int *B_ext_offd_j, HYPRE_Int *map_B_to_C, HYPRE_Int *C_diag_size, HYPRE_Int *C_offd_size, HYPRE_Int num_rownnz_A, HYPRE_Int num_rows_diag_A, HYPRE_Int num_cols_offd_A, HYPRE_Int allsquare, HYPRE_Int num_cols_diag_B, HYPRE_Int num_cols_offd_B, HYPRE_Int num_cols_offd_C ); hypre_ParCSRMatrix *hypre_ParMatmul ( hypre_ParCSRMatrix *A, hypre_ParCSRMatrix *B ); void hypre_ParCSRMatrixExtractBExt_Arrays ( HYPRE_Int **pB_ext_i, HYPRE_BigInt **pB_ext_j, HYPRE_Complex **pB_ext_data, HYPRE_BigInt **pB_ext_row_map, HYPRE_Int *num_nonzeros, HYPRE_Int data, HYPRE_Int find_row_map, MPI_Comm comm, hypre_ParCSRCommPkg *comm_pkg, HYPRE_Int num_cols_B, HYPRE_Int num_recvs, HYPRE_Int num_sends, HYPRE_BigInt first_col_diag, HYPRE_BigInt *row_starts, HYPRE_Int *recv_vec_starts, HYPRE_Int *send_map_starts, HYPRE_Int *send_map_elmts, HYPRE_Int *diag_i, HYPRE_Int *diag_j, HYPRE_Int *offd_i, HYPRE_Int *offd_j, HYPRE_BigInt *col_map_offd, HYPRE_Real *diag_data, HYPRE_Real *offd_data ); void hypre_ParCSRMatrixExtractBExt_Arrays_Overlap ( HYPRE_Int **pB_ext_i, HYPRE_BigInt **pB_ext_j, HYPRE_Complex **pB_ext_data, HYPRE_BigInt **pB_ext_row_map, HYPRE_Int *num_nonzeros, HYPRE_Int data, HYPRE_Int find_row_map, MPI_Comm comm, hypre_ParCSRCommPkg *comm_pkg, HYPRE_Int num_cols_B, HYPRE_Int num_recvs, HYPRE_Int num_sends, HYPRE_BigInt first_col_diag, HYPRE_BigInt *row_starts, HYPRE_Int *recv_vec_starts, HYPRE_Int *send_map_starts, HYPRE_Int *send_map_elmts, HYPRE_Int *diag_i, HYPRE_Int *diag_j, HYPRE_Int *offd_i, HYPRE_Int *offd_j, HYPRE_BigInt *col_map_offd, HYPRE_Real *diag_data, HYPRE_Real *offd_data, hypre_ParCSRCommHandle **comm_handle_idx, hypre_ParCSRCommHandle **comm_handle_data, HYPRE_Int *CF_marker, HYPRE_Int *CF_marker_offd, HYPRE_Int skip_fine, HYPRE_Int skip_same_sign ); hypre_CSRMatrix *hypre_ParCSRMatrixExtractBExt ( hypre_ParCSRMatrix *B, hypre_ParCSRMatrix *A, HYPRE_Int data ); hypre_CSRMatrix *hypre_ParCSRMatrixExtractBExt_Overlap ( hypre_ParCSRMatrix *B, hypre_ParCSRMatrix *A, HYPRE_Int data, hypre_ParCSRCommHandle **comm_handle_idx, hypre_ParCSRCommHandle **comm_handle_data, HYPRE_Int *CF_marker, HYPRE_Int *CF_marker_offd, HYPRE_Int skip_fine, HYPRE_Int skip_same_sign ); HYPRE_Int hypre_ParCSRMatrixExtractBExtDeviceInit( hypre_ParCSRMatrix *B, hypre_ParCSRMatrix *A, HYPRE_Int want_data, void **request_ptr); hypre_CSRMatrix* hypre_ParCSRMatrixExtractBExtDeviceWait(void *request); hypre_CSRMatrix* hypre_ParCSRMatrixExtractBExtDevice( hypre_ParCSRMatrix *B, hypre_ParCSRMatrix *A, HYPRE_Int want_data ); HYPRE_Int hypre_ParCSRMatrixLocalTranspose( hypre_ParCSRMatrix *A ); HYPRE_Int hypre_ParCSRMatrixTranspose ( hypre_ParCSRMatrix *A, hypre_ParCSRMatrix **AT_ptr, HYPRE_Int data ); HYPRE_Int hypre_ParCSRMatrixTransposeHost ( hypre_ParCSRMatrix *A, hypre_ParCSRMatrix **AT_ptr, HYPRE_Int data ); HYPRE_Int hypre_ParCSRMatrixTransposeDevice ( hypre_ParCSRMatrix *A, hypre_ParCSRMatrix **AT_ptr, HYPRE_Int data ); void hypre_ParCSRMatrixGenSpanningTree ( hypre_ParCSRMatrix *G_csr, HYPRE_Int **indices, HYPRE_Int G_type ); void hypre_ParCSRMatrixExtractSubmatrices ( hypre_ParCSRMatrix *A_csr, HYPRE_Int *indices2, hypre_ParCSRMatrix ***submatrices ); void hypre_ParCSRMatrixExtractRowSubmatrices ( hypre_ParCSRMatrix *A_csr, HYPRE_Int *indices2, hypre_ParCSRMatrix ***submatrices ); HYPRE_Complex hypre_ParCSRMatrixLocalSumElts ( hypre_ParCSRMatrix *A ); HYPRE_Int hypre_ParCSRMatrixAminvDB ( hypre_ParCSRMatrix *A, hypre_ParCSRMatrix *B, HYPRE_Complex *d, hypre_ParCSRMatrix **C_ptr ); hypre_ParCSRMatrix *hypre_ParTMatmul ( hypre_ParCSRMatrix *A, hypre_ParCSRMatrix *B ); HYPRE_Real hypre_ParCSRMatrixFnorm( hypre_ParCSRMatrix *A ); HYPRE_Int hypre_ParCSRMatrixInfNorm ( hypre_ParCSRMatrix *A, HYPRE_Real *norm ); HYPRE_Int hypre_ExchangeExternalRowsInit( hypre_CSRMatrix *B_ext, hypre_ParCSRCommPkg *comm_pkg_A, void **request_ptr); hypre_CSRMatrix* hypre_ExchangeExternalRowsWait(void *vequest); HYPRE_Int hypre_ExchangeExternalRowsDeviceInit( hypre_CSRMatrix *B_ext, hypre_ParCSRCommPkg *comm_pkg_A, HYPRE_Int want_data, void **request_ptr); hypre_CSRMatrix* hypre_ExchangeExternalRowsDeviceWait(void *vrequest); HYPRE_Int hypre_ParCSRMatrixGenerateFFFCDevice( hypre_ParCSRMatrix *A, HYPRE_Int *CF_marker, HYPRE_BigInt *cpts_starts, hypre_ParCSRMatrix *S, hypre_ParCSRMatrix **A_FC_ptr, hypre_ParCSRMatrix **A_FF_ptr ); HYPRE_Int hypre_ParCSRMatrixGenerateFFCFDevice( hypre_ParCSRMatrix *A, HYPRE_Int *CF_marker, HYPRE_BigInt *cpts_starts, hypre_ParCSRMatrix *S, hypre_ParCSRMatrix **A_CF_ptr, hypre_ParCSRMatrix **A_FF_ptr ); HYPRE_Int hypre_ParCSRMatrixGenerateCCCFDevice( hypre_ParCSRMatrix *A, HYPRE_Int *CF_marker, HYPRE_BigInt *cpts_starts, hypre_ParCSRMatrix *S, hypre_ParCSRMatrix **A_CF_ptr, hypre_ParCSRMatrix **A_CC_ptr ); hypre_CSRMatrix* hypre_ConcatDiagAndOffdDevice(hypre_ParCSRMatrix *A); HYPRE_Int hypre_ConcatDiagOffdAndExtDevice(hypre_ParCSRMatrix *A, hypre_CSRMatrix *E, hypre_CSRMatrix **B_ptr, HYPRE_Int *num_cols_offd_ptr, HYPRE_BigInt **cols_map_offd_ptr); HYPRE_Int hypre_ParCSRMatrixGetRowDevice( hypre_ParCSRMatrix *mat, HYPRE_BigInt row, HYPRE_Int *size, HYPRE_BigInt **col_ind, HYPRE_Complex **values ); HYPRE_Int hypre_ParCSRDiagScaleVector( hypre_ParCSRMatrix *par_A, hypre_ParVector *par_y, hypre_ParVector *par_x ); HYPRE_Int hypre_ParCSRDiagScaleVectorHost( hypre_ParCSRMatrix *par_A, hypre_ParVector *par_y, hypre_ParVector *par_x ); HYPRE_Int hypre_ParCSRDiagScaleVectorDevice( hypre_ParCSRMatrix *par_A, hypre_ParVector *par_y, hypre_ParVector *par_x ); HYPRE_Int hypre_ParCSRMatrixDropSmallEntries( hypre_ParCSRMatrix *A, HYPRE_Real tol, HYPRE_Int type); HYPRE_Int hypre_ParCSRMatrixDropSmallEntriesHost( hypre_ParCSRMatrix *A, HYPRE_Real tol, HYPRE_Int type); HYPRE_Int hypre_ParCSRMatrixDropSmallEntriesDevice( hypre_ParCSRMatrix *A, HYPRE_Complex tol, HYPRE_Int type); HYPRE_Int hypre_ParCSRCommPkgCreateMatrixE( hypre_ParCSRCommPkg *comm_pkg, HYPRE_Int local_ncols ); #ifdef HYPRE_USING_PERSISTENT_COMM hypre_ParCSRPersistentCommHandle* hypre_ParCSRPersistentCommHandleCreate(HYPRE_Int job, hypre_ParCSRCommPkg *comm_pkg); hypre_ParCSRPersistentCommHandle* hypre_ParCSRCommPkgGetPersistentCommHandle(HYPRE_Int job, hypre_ParCSRCommPkg *comm_pkg); void hypre_ParCSRPersistentCommHandleDestroy(hypre_ParCSRPersistentCommHandle *comm_handle); void hypre_ParCSRPersistentCommHandleStart(hypre_ParCSRPersistentCommHandle *comm_handle, HYPRE_MemoryLocation send_memory_location, void *send_data); void hypre_ParCSRPersistentCommHandleWait(hypre_ParCSRPersistentCommHandle *comm_handle, HYPRE_MemoryLocation recv_memory_location, void *recv_data); #endif HYPRE_Int hypre_ParcsrGetExternalRowsInit( hypre_ParCSRMatrix *A, HYPRE_Int indices_len, HYPRE_BigInt *indices, hypre_ParCSRCommPkg *comm_pkg, HYPRE_Int want_data, void **request_ptr); hypre_CSRMatrix* hypre_ParcsrGetExternalRowsWait(void *vrequest); HYPRE_Int hypre_ParcsrGetExternalRowsDeviceInit( hypre_ParCSRMatrix *A, HYPRE_Int indices_len, HYPRE_BigInt *indices, hypre_ParCSRCommPkg *comm_pkg, HYPRE_Int want_data, void **request_ptr); hypre_CSRMatrix* hypre_ParcsrGetExternalRowsDeviceWait(void *vrequest); HYPRE_Int hypre_ParvecBdiagInvScal( hypre_ParVector *b, HYPRE_Int blockSize, hypre_ParVector **bs, hypre_ParCSRMatrix *A); HYPRE_Int hypre_ParcsrBdiagInvScal( hypre_ParCSRMatrix *A, HYPRE_Int blockSize, hypre_ParCSRMatrix **As); HYPRE_Int hypre_ParCSRMatrixExtractSubmatrixFC( hypre_ParCSRMatrix *A, HYPRE_Int *CF_marker, HYPRE_BigInt *cpts_starts, const char *job, hypre_ParCSRMatrix **B_ptr, HYPRE_Real strength_thresh); HYPRE_Int hypre_ParCSRMatrixDiagScale( hypre_ParCSRMatrix *par_A, hypre_ParVector *par_ld, hypre_ParVector *par_rd ); HYPRE_Int hypre_ParCSRMatrixReorder ( hypre_ParCSRMatrix *A ); HYPRE_Int hypre_ParCSRMatrixAdd( HYPRE_Complex alpha, hypre_ParCSRMatrix *A, HYPRE_Complex beta, hypre_ParCSRMatrix *B, hypre_ParCSRMatrix **Cout); HYPRE_Int hypre_ParCSRMatrixAddHost( HYPRE_Complex alpha, hypre_ParCSRMatrix *A, HYPRE_Complex beta, hypre_ParCSRMatrix *B, hypre_ParCSRMatrix **Cout); HYPRE_Int hypre_ParCSRMatrixAddDevice( HYPRE_Complex alpha, hypre_ParCSRMatrix *A, HYPRE_Complex beta, hypre_ParCSRMatrix *B, hypre_ParCSRMatrix **Cout); HYPRE_Int hypre_ParCSRMatrixBlockColSum( hypre_ParCSRMatrix *A, HYPRE_Int row_major, HYPRE_Int num_rows_block, HYPRE_Int num_cols_block, hypre_DenseBlockMatrix **B_ptr ); HYPRE_Int hypre_ParCSRMatrixColSum( hypre_ParCSRMatrix *A, hypre_ParVector **B_ptr ); /* par_csr_filter_device.c */ HYPRE_Int hypre_ParCSRMatrixBlkFilterDevice(hypre_ParCSRMatrix *A, HYPRE_Int block_size, hypre_ParCSRMatrix **B_ptr); /* par_csr_matop_device.c */ HYPRE_Int hypre_ParCSRMatrixDiagScaleDevice ( hypre_ParCSRMatrix *par_A, hypre_ParVector *par_ld, hypre_ParVector *par_rd ); HYPRE_Int hypre_ParCSRMatrixCompressOffdMapDevice(hypre_ParCSRMatrix *A); HYPRE_Int hypre_ParCSRMatrixCompressOffdMap(hypre_ParCSRMatrix *A); /* par_csr_matop_marked.c */ void hypre_ParMatmul_RowSizes_Marked ( HYPRE_Int **C_diag_i, HYPRE_Int **C_offd_i, HYPRE_Int **B_marker, HYPRE_Int *A_diag_i, HYPRE_Int *A_diag_j, HYPRE_Int *A_offd_i, HYPRE_Int *A_offd_j, HYPRE_Int *B_diag_i, HYPRE_Int *B_diag_j, HYPRE_Int *B_offd_i, HYPRE_Int *B_offd_j, HYPRE_Int *B_ext_diag_i, HYPRE_Int *B_ext_diag_j, HYPRE_Int *B_ext_offd_i, HYPRE_Int *B_ext_offd_j, HYPRE_Int *map_B_to_C, HYPRE_Int *C_diag_size, HYPRE_Int *C_offd_size, HYPRE_Int num_rows_diag_A, HYPRE_Int num_cols_offd_A, HYPRE_Int allsquare, HYPRE_Int num_cols_diag_B, HYPRE_Int num_cols_offd_B, HYPRE_Int num_cols_offd_C, HYPRE_Int *CF_marker, HYPRE_Int *dof_func, HYPRE_Int *dof_func_offd ); hypre_ParCSRMatrix *hypre_ParMatmul_FC ( hypre_ParCSRMatrix *A, hypre_ParCSRMatrix *P, HYPRE_Int *CF_marker, HYPRE_Int *dof_func, HYPRE_Int *dof_func_offd ); void hypre_ParMatScaleDiagInv_F ( hypre_ParCSRMatrix *C, hypre_ParCSRMatrix *A, HYPRE_Complex weight, HYPRE_Int *CF_marker ); hypre_ParCSRMatrix *hypre_ParMatMinus_F ( hypre_ParCSRMatrix *P, hypre_ParCSRMatrix *C, HYPRE_Int *CF_marker ); void hypre_ParCSRMatrixZero_F ( hypre_ParCSRMatrix *P, HYPRE_Int *CF_marker ); void hypre_ParCSRMatrixCopy_C ( hypre_ParCSRMatrix *P, hypre_ParCSRMatrix *C, HYPRE_Int *CF_marker ); void hypre_ParCSRMatrixDropEntries ( hypre_ParCSRMatrix *C, hypre_ParCSRMatrix *P, HYPRE_Int *CF_marker ); /* par_csr_matrix.c */ hypre_ParCSRMatrix *hypre_ParCSRMatrixCreate ( MPI_Comm comm, HYPRE_BigInt global_num_rows, HYPRE_BigInt global_num_cols, HYPRE_BigInt *row_starts_in, HYPRE_BigInt *col_starts_in, HYPRE_Int num_cols_offd, HYPRE_Int num_nonzeros_diag, HYPRE_Int num_nonzeros_offd ); HYPRE_Int hypre_ParCSRMatrixDestroy ( hypre_ParCSRMatrix *matrix ); HYPRE_Int hypre_ParCSRMatrixInitialize_v2( hypre_ParCSRMatrix *matrix, HYPRE_MemoryLocation memory_location ); HYPRE_Int hypre_ParCSRMatrixInitialize ( hypre_ParCSRMatrix *matrix ); HYPRE_Int hypre_ParCSRMatrixSetNumNonzeros ( hypre_ParCSRMatrix *matrix ); HYPRE_Int hypre_ParCSRMatrixSetDNumNonzeros ( hypre_ParCSRMatrix *matrix ); HYPRE_Int hypre_ParCSRMatrixSetNumRownnz ( hypre_ParCSRMatrix *matrix ); HYPRE_Int hypre_ParCSRMatrixSetDataOwner ( hypre_ParCSRMatrix *matrix, HYPRE_Int owns_data ); HYPRE_Int hypre_ParCSRMatrixSetPatternOnly( hypre_ParCSRMatrix *matrix, HYPRE_Int pattern_only); hypre_ParCSRMatrix* hypre_ParCSRMatrixCreateFromDenseBlockMatrix(MPI_Comm comm, HYPRE_BigInt global_num_rows, HYPRE_BigInt global_num_cols, HYPRE_BigInt *row_starts, HYPRE_BigInt *col_starts, hypre_DenseBlockMatrix *B); hypre_ParCSRMatrix* hypre_ParCSRMatrixCreateFromParVector(hypre_ParVector *b, HYPRE_BigInt global_num_rows, HYPRE_BigInt global_num_cols, HYPRE_BigInt *row_starts, HYPRE_BigInt *col_starts); hypre_ParCSRMatrix *hypre_ParCSRMatrixRead ( MPI_Comm comm, const char *file_name ); HYPRE_Int hypre_ParCSRMatrixPrint ( hypre_ParCSRMatrix *matrix, const char *file_name ); HYPRE_Int hypre_ParCSRMatrixPrintIJ ( const hypre_ParCSRMatrix *matrix, const HYPRE_Int base_i, const HYPRE_Int base_j, const char *filename ); HYPRE_Int hypre_ParCSRMatrixPrintBinaryIJ ( hypre_ParCSRMatrix *matrix, HYPRE_Int base_i, HYPRE_Int base_j, const char *filename ); HYPRE_Int hypre_ParCSRMatrixReadIJ ( MPI_Comm comm, const char *filename, HYPRE_Int *base_i_ptr, HYPRE_Int *base_j_ptr, hypre_ParCSRMatrix **matrix_ptr ); HYPRE_Int hypre_ParCSRMatrixGetLocalRange ( hypre_ParCSRMatrix *matrix, HYPRE_BigInt *row_start, HYPRE_BigInt *row_end, HYPRE_BigInt *col_start, HYPRE_BigInt *col_end ); HYPRE_Int hypre_ParCSRMatrixGetRow ( hypre_ParCSRMatrix *mat, HYPRE_BigInt row, HYPRE_Int *size, HYPRE_BigInt **col_ind, HYPRE_Complex **values ); HYPRE_Int hypre_ParCSRMatrixRestoreRow ( hypre_ParCSRMatrix *matrix, HYPRE_BigInt row, HYPRE_Int *size, HYPRE_BigInt **col_ind, HYPRE_Complex **values ); hypre_ParCSRMatrix *hypre_CSRMatrixToParCSRMatrix ( MPI_Comm comm, hypre_CSRMatrix *A, HYPRE_BigInt *row_starts, HYPRE_BigInt *col_starts ); HYPRE_Int GenerateDiagAndOffd ( hypre_CSRMatrix *A, hypre_ParCSRMatrix *matrix, HYPRE_BigInt first_col_diag, HYPRE_BigInt last_col_diag ); hypre_CSRMatrix *hypre_MergeDiagAndOffd ( hypre_ParCSRMatrix *par_matrix ); hypre_CSRMatrix *hypre_MergeDiagAndOffdDevice ( hypre_ParCSRMatrix *par_matrix ); hypre_CSRMatrix *hypre_ParCSRMatrixToCSRMatrixAll ( hypre_ParCSRMatrix *par_matrix ); hypre_CSRMatrix *hypre_ParCSRMatrixToCSRMatrixAll_v2 ( hypre_ParCSRMatrix *par_matrix, HYPRE_MemoryLocation memory_location ); HYPRE_Int hypre_ParCSRMatrixCopy ( hypre_ParCSRMatrix *A, hypre_ParCSRMatrix *B, HYPRE_Int copy_data ); HYPRE_Int hypre_FillResponseParToCSRMatrix ( void *p_recv_contact_buf, HYPRE_Int contact_size, HYPRE_Int contact_proc, void *ro, MPI_Comm comm, void **p_send_response_buf, HYPRE_Int *response_message_size ); hypre_ParCSRMatrix *hypre_ParCSRMatrixUnion ( hypre_ParCSRMatrix *A, hypre_ParCSRMatrix *B ); hypre_ParCSRMatrix* hypre_ParCSRMatrixClone ( hypre_ParCSRMatrix *A, HYPRE_Int copy_data ); #define hypre_ParCSRMatrixCompleteClone(A) hypre_ParCSRMatrixClone(A,0) hypre_ParCSRMatrix* hypre_ParCSRMatrixClone_v2 ( hypre_ParCSRMatrix *A, HYPRE_Int copy_data, HYPRE_MemoryLocation memory_location ); HYPRE_Int hypre_ParCSRMatrixTruncate(hypre_ParCSRMatrix *A, HYPRE_Real tol, HYPRE_Int max_row_elmts, HYPRE_Int rescale, HYPRE_Int nrm_type); HYPRE_Int hypre_ParCSRMatrixMigrate(hypre_ParCSRMatrix *A, HYPRE_MemoryLocation memory_location); HYPRE_Int hypre_ParCSRMatrixSetConstantValues( hypre_ParCSRMatrix *A, HYPRE_Complex value ); void hypre_ParCSRMatrixCopyColMapOffdToDevice(hypre_ParCSRMatrix *A); void hypre_ParCSRMatrixCopyColMapOffdToHost(hypre_ParCSRMatrix *A); /* par_csr_matrix_stats.c */ HYPRE_Int hypre_ParCSRMatrixStatsArrayCompute( HYPRE_Int num_matrices, hypre_ParCSRMatrix **matrices, hypre_MatrixStatsArray *stats_array ); /* par_csr_matmat_device.c */ HYPRE_Int hypre_ParCSRMatMatDiagDevice( hypre_ParCSRMatrix *A, hypre_ParCSRMatrix *BT, hypre_ParCSRMatrix *C ); /* par_csr_matmat.c */ HYPRE_Int hypre_ParCSRMatMatDiag( hypre_ParCSRMatrix *A, hypre_ParCSRMatrix *B, hypre_ParCSRMatrix **C_ptr ); /* par_csr_matvec.c */ // y = alpha*A*x + beta*b HYPRE_Int hypre_ParCSRMatrixMatvecOutOfPlace ( HYPRE_Complex alpha, hypre_ParCSRMatrix *A, hypre_ParVector *x, HYPRE_Complex beta, hypre_ParVector *b, hypre_ParVector *y ); HYPRE_Int hypre_ParCSRMatrixMatvecOutOfPlaceDevice ( HYPRE_Complex alpha, hypre_ParCSRMatrix *A, hypre_ParVector *x, HYPRE_Complex beta, hypre_ParVector *b, hypre_ParVector *y ); // y = alpha*A*x + beta*y HYPRE_Int hypre_ParCSRMatrixMatvec ( HYPRE_Complex alpha, hypre_ParCSRMatrix *A, hypre_ParVector *x, HYPRE_Complex beta, hypre_ParVector *y ); HYPRE_Int hypre_ParCSRMatrixMatvecT ( HYPRE_Complex alpha, hypre_ParCSRMatrix *A, hypre_ParVector *x, HYPRE_Complex beta, hypre_ParVector *y ); HYPRE_Int hypre_ParCSRMatrixMatvecTDevice ( HYPRE_Complex alpha, hypre_ParCSRMatrix *A, hypre_ParVector *x, HYPRE_Complex beta, hypre_ParVector *y ); HYPRE_Int hypre_ParCSRMatrixMatvecT_unpack( hypre_ParCSRCommPkg *comm_pkg, HYPRE_Int num_cols, HYPRE_Complex *recv_data, HYPRE_Complex *local_data ); HYPRE_Int hypre_ParCSRMatrixMatvec_FF ( HYPRE_Complex alpha, hypre_ParCSRMatrix *A, hypre_ParVector *x, HYPRE_Complex beta, hypre_ParVector *y, HYPRE_Int *CF_marker, HYPRE_Int fpt ); /* par_csr_triplemat.c */ HYPRE_Int hypre_ParCSRTMatMatPartialAddDevice( hypre_ParCSRCommPkg *comm_pkg_A, HYPRE_Int num_cols_A, HYPRE_Int num_cols_B, HYPRE_BigInt first_col_diag_B, HYPRE_BigInt last_col_diag_B, HYPRE_Int num_cols_offd_B, HYPRE_BigInt *col_map_offd_B, HYPRE_Int local_nnz_Cbar, hypre_CSRMatrix *Cbar, hypre_CSRMatrix *Cext, hypre_CSRMatrix **C_diag_ptr, hypre_CSRMatrix **C_offd_ptr, HYPRE_Int *num_cols_offd_C_ptr, HYPRE_BigInt **col_map_offd_C_ptr ); hypre_ParCSRMatrix *hypre_ParCSRMatMat( hypre_ParCSRMatrix *A, hypre_ParCSRMatrix *B ); hypre_ParCSRMatrix *hypre_ParCSRMatMatHost( hypre_ParCSRMatrix *A, hypre_ParCSRMatrix *B ); hypre_ParCSRMatrix *hypre_ParCSRMatMatDevice( hypre_ParCSRMatrix *A, hypre_ParCSRMatrix *B ); hypre_ParCSRMatrix *hypre_ParCSRTMatMatKTHost( hypre_ParCSRMatrix *A, hypre_ParCSRMatrix *B, HYPRE_Int keep_transpose); hypre_ParCSRMatrix *hypre_ParCSRTMatMatKTDevice( hypre_ParCSRMatrix *A, hypre_ParCSRMatrix *B, HYPRE_Int keep_transpose); hypre_ParCSRMatrix *hypre_ParCSRTMatMatKT( hypre_ParCSRMatrix *A, hypre_ParCSRMatrix *B, HYPRE_Int keep_transpose); hypre_ParCSRMatrix *hypre_ParCSRTMatMat( hypre_ParCSRMatrix *A, hypre_ParCSRMatrix *B); hypre_ParCSRMatrix *hypre_ParCSRMatrixRAPKT( hypre_ParCSRMatrix *R, hypre_ParCSRMatrix *A, hypre_ParCSRMatrix *P, HYPRE_Int keepTranspose ); hypre_ParCSRMatrix *hypre_ParCSRMatrixRAP( hypre_ParCSRMatrix *R, hypre_ParCSRMatrix *A, hypre_ParCSRMatrix *P ); hypre_ParCSRMatrix* hypre_ParCSRMatrixRAPKTDevice( hypre_ParCSRMatrix *R, hypre_ParCSRMatrix *A, hypre_ParCSRMatrix *P, HYPRE_Int keep_transpose ); hypre_ParCSRMatrix* hypre_ParCSRMatrixRAPKTHost( hypre_ParCSRMatrix *R, hypre_ParCSRMatrix *A, hypre_ParCSRMatrix *P, HYPRE_Int keep_transpose ); /* par_make_system.c */ HYPRE_ParCSR_System_Problem *HYPRE_Generate2DSystem ( HYPRE_ParCSRMatrix H_L1, HYPRE_ParCSRMatrix H_L2, HYPRE_ParVector H_b1, HYPRE_ParVector H_b2, HYPRE_ParVector H_x1, HYPRE_ParVector H_x2, HYPRE_Complex *M_vals ); HYPRE_Int HYPRE_Destroy2DSystem ( HYPRE_ParCSR_System_Problem *sys_prob ); /* par_vector.c */ hypre_ParVector *hypre_ParVectorCreate ( MPI_Comm comm, HYPRE_BigInt global_size, HYPRE_BigInt *partitioning_in ); hypre_ParVector *hypre_ParMultiVectorCreate ( MPI_Comm comm, HYPRE_BigInt global_size, HYPRE_BigInt *partitioning, HYPRE_Int num_vectors ); HYPRE_Int hypre_ParVectorDestroy ( hypre_ParVector *vector ); HYPRE_Int hypre_ParVectorInitializeShell( hypre_ParVector *vector ); HYPRE_Int hypre_ParVectorSetData( hypre_ParVector *vector, HYPRE_Complex *data ); HYPRE_Int hypre_ParVectorInitialize ( hypre_ParVector *vector ); HYPRE_Int hypre_ParVectorInitialize_v2( hypre_ParVector *vector, HYPRE_MemoryLocation memory_location ); HYPRE_Int hypre_ParVectorSetDataOwner ( hypre_ParVector *vector, HYPRE_Int owns_data ); HYPRE_Int hypre_ParVectorSetLocalSize ( hypre_ParVector *vector, HYPRE_Int local_size ); HYPRE_Int hypre_ParVectorSetNumVectors ( hypre_ParVector *vector, HYPRE_Int num_vectors ); HYPRE_Int hypre_ParVectorSetComponent ( hypre_ParVector *vector, HYPRE_Int component ); HYPRE_Int hypre_ParVectorResize ( hypre_ParVector *vector, HYPRE_Int num_vectors ); hypre_ParVector *hypre_ParVectorRead ( MPI_Comm comm, const char *file_name ); HYPRE_Int hypre_ParVectorSetConstantValues ( hypre_ParVector *v, HYPRE_Complex value ); HYPRE_Int hypre_ParVectorSetZeros( hypre_ParVector *v ); HYPRE_Int hypre_ParVectorSetRandomValues ( hypre_ParVector *v, HYPRE_Int seed ); HYPRE_Int hypre_ParVectorCopy ( hypre_ParVector *x, hypre_ParVector *y ); hypre_ParVector *hypre_ParVectorCloneShallow ( hypre_ParVector *x ); hypre_ParVector *hypre_ParVectorCloneDeep_v2( hypre_ParVector *x, HYPRE_MemoryLocation memory_location ); HYPRE_Int hypre_ParVectorMigrate(hypre_ParVector *x, HYPRE_MemoryLocation memory_location); HYPRE_Int hypre_ParVectorScale ( HYPRE_Complex alpha, hypre_ParVector *y ); HYPRE_Int hypre_ParVectorAxpy ( HYPRE_Complex alpha, hypre_ParVector *x, hypre_ParVector *y ); HYPRE_Int hypre_ParVectorAxpyz ( HYPRE_Complex alpha, hypre_ParVector *x, HYPRE_Complex beta, hypre_ParVector *y, hypre_ParVector *z ); HYPRE_Int hypre_ParVectorMassAxpy ( HYPRE_Complex *alpha, hypre_ParVector **x, hypre_ParVector *y, HYPRE_Int k, HYPRE_Int unroll); HYPRE_Real hypre_ParVectorInnerProd ( hypre_ParVector *x, hypre_ParVector *y ); HYPRE_Int hypre_ParVectorMassInnerProd ( hypre_ParVector *x, hypre_ParVector **y, HYPRE_Int k, HYPRE_Int unroll, HYPRE_Real *prod ); HYPRE_Int hypre_ParVectorMassDotpTwo ( hypre_ParVector *x, hypre_ParVector *y, hypre_ParVector **z, HYPRE_Int k, HYPRE_Int unroll, HYPRE_Real *prod_x, HYPRE_Real *prod_y ); hypre_ParVector *hypre_VectorToParVector ( MPI_Comm comm, hypre_Vector *v, HYPRE_BigInt *vec_starts ); hypre_Vector *hypre_ParVectorToVectorAll ( hypre_ParVector *par_v ); hypre_Vector *hypre_ParVectorToVectorAll_v2 ( hypre_ParVector *par_v, HYPRE_MemoryLocation memory_location ); HYPRE_Int hypre_ParVectorPrint ( hypre_ParVector *vector, const char *file_name ); HYPRE_Int hypre_ParVectorPrintIJ ( hypre_ParVector *vector, HYPRE_Int base_j, const char *filename ); HYPRE_Int hypre_ParVectorPrintBinaryIJ ( hypre_ParVector *par_vector, const char *filename ); HYPRE_Int hypre_ParVectorReadIJ ( MPI_Comm comm, const char *filename, HYPRE_Int *base_j_ptr, hypre_ParVector **vector_ptr ); HYPRE_Int hypre_FillResponseParToVectorAll ( void *p_recv_contact_buf, HYPRE_Int contact_size, HYPRE_Int contact_proc, void *ro, MPI_Comm comm, void **p_send_response_buf, HYPRE_Int *response_message_size ); HYPRE_Complex hypre_ParVectorLocalSumElts ( hypre_ParVector *vector ); HYPRE_Int hypre_ParVectorGetValues ( hypre_ParVector *vector, HYPRE_Int num_values, HYPRE_BigInt *indices, HYPRE_Complex *values); HYPRE_Int hypre_ParVectorGetValues2( hypre_ParVector *vector, HYPRE_Int num_values, HYPRE_BigInt *indices, HYPRE_BigInt base, HYPRE_Complex *values ); HYPRE_Int hypre_ParVectorGetValuesHost(hypre_ParVector *vector, HYPRE_Int num_values, HYPRE_BigInt *indices, HYPRE_BigInt base, HYPRE_Complex *values); HYPRE_Int hypre_ParVectorElmdivpy( hypre_ParVector *x, hypre_ParVector *b, hypre_ParVector *y ); HYPRE_Int hypre_ParVectorElmdivpyMarked( hypre_ParVector *x, hypre_ParVector *b, hypre_ParVector *y, HYPRE_Int *marker, HYPRE_Int marker_val ); /* par_vector_device.c */ HYPRE_Int hypre_ParVectorGetValuesDevice(hypre_ParVector *vector, HYPRE_Int num_values, HYPRE_BigInt *indices, HYPRE_BigInt base, HYPRE_Complex *values); hypre-2.33.0/src/seq_block_mv/000077500000000000000000000000001477326011500161675ustar00rootroot00000000000000hypre-2.33.0/src/seq_block_mv/CMakeLists.txt000066400000000000000000000012221477326011500207240ustar00rootroot00000000000000# Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) set(HDRS _hypre_seq_block_mv.h ) set(SRCS dense_block_matrix.c dense_block_matmult.c ) target_sources(${PROJECT_NAME} PRIVATE ${SRCS} ${HDRS} ) # if (HYPRE_USING_GPU) # set(GPU_SRCS # # File name here # ) # convert_filenames_to_full_paths(GPU_SRCS) # set(HYPRE_GPU_SOURCES ${HYPRE_GPU_SOURCES} ${GPU_SRCS} PARENT_SCOPE) # endif () convert_filenames_to_full_paths(HDRS) set(HYPRE_HEADERS ${HYPRE_HEADERS} ${HDRS} PARENT_SCOPE) hypre-2.33.0/src/seq_block_mv/Makefile000066400000000000000000000030221477326011500176240ustar00rootroot00000000000000# Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) include ../config/Makefile.config CINCLUDES = ${INCLUDES} ${MPIINCLUDE} C_COMPILE_FLAGS =\ -I..\ -I$(srcdir)\ -I$(srcdir)/..\ -I$(srcdir)/../seq_mv\ -I$(srcdir)/../utilities\ ${CINCLUDES} HEADERS =\ _hypre_seq_block_mv.h FILES =\ dense_block_matrix.c\ dense_block_matmult.c # CUFILES =\ COBJS = ${FILES:.c=.o} #CUOBJS = ${CUFILES:.c=.obj} #OBJS = ${COBJS} ${CUOBJS} OBJS = ${COBJS} SONAME = libHYPRE_seq_block_mv-${HYPRE_RELEASE_VERSION}${HYPRE_LIB_SUFFIX} ################################################################## # Targets ################################################################## all: $(MAKE) lib lib: libHYPRE_seq_block_mv${HYPRE_LIB_SUFFIX} cp -fR $(srcdir)/_hypre_seq_block_mv.h $(HYPRE_BUILD_DIR)/include install: libHYPRE_seq_block_mv${HYPRE_LIB_SUFFIX} cp -fR $(srcdir)/_hypre_seq_block_mv.h $(HYPRE_INC_INSTALL) clean: rm -f *.o *.obj libHYPRE* distclean: clean ################################################################## # Rules ################################################################## libHYPRE_seq_block_mv.a: ${OBJS} @echo "Building $@ ... " ${AR} $@ ${OBJS} ${RANLIB} $@ libHYPRE_seq_block_mv.so libHYPRE_seq_block_mv.dylib: ${OBJS} @echo "Building $@ ... " ${BUILD_CC_SHARED} -o ${SONAME} ${OBJS} ${SHARED_SET_SONAME}${SONAME} ln -s -f ${SONAME} $@ ${OBJS}: ${HEADERS} hypre-2.33.0/src/seq_block_mv/_hypre_seq_block_mv.h000066400000000000000000000134011477326011500223510ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /*** DO NOT EDIT THIS FILE DIRECTLY (use 'headers' to generate) ***/ #ifndef hypre_SEQ_BLOCK_MV_HEADER #define hypre_SEQ_BLOCK_MV_HEADER #include #include "seq_mv.h" #ifdef __cplusplus extern "C" { #endif /****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #ifndef hypre_DENSE_BLOCK_MATRIX_HEADER #define hypre_DENSE_BLOCK_MATRIX_HEADER /*-------------------------------------------------------------------------- * Uniformly blocked dense matrix data structure *--------------------------------------------------------------------------*/ typedef struct hypre_DenseBlockMatrix_struct { HYPRE_Int row_major; /* Flag indicating storage format (false: col major)*/ HYPRE_Int num_rows; /* Number of rows of entire matrix */ HYPRE_Int num_cols; /* Number of columns of entire matrix */ HYPRE_Int num_nonzeros; /* Number of nonzero coefficients of entire matrix */ HYPRE_Int num_blocks; /* Number of sub-matrices (blocks) */ /* Local info for a individual block (sub-matrix) */ HYPRE_Int row_stride; /* Stride for accessing row values */ HYPRE_Int col_stride; /* Stride for accessing column values */ HYPRE_Int num_rows_block; /* Number of rows per block */ HYPRE_Int num_cols_block; /* Number of columns per block */ HYPRE_Int num_nonzeros_block; /* Number of nonzero coefficients per block */ /* Matrix coefficients array */ HYPRE_Int owns_data; /* Flag indicating ownership of the data array */ HYPRE_Complex *data; /* Matrix coefficients */ HYPRE_Complex **data_aop; /* Array of pointers to data */ HYPRE_MemoryLocation memory_location; /* Memory location of data array */ } hypre_DenseBlockMatrix; /*-------------------------------------------------------------------------- * Accessor functions for the uniform batched matrix structure *--------------------------------------------------------------------------*/ #define hypre_DenseBlockMatrixRowMajor(matrix) ((matrix) -> row_major) #define hypre_DenseBlockMatrixNumRows(matrix) ((matrix) -> num_rows) #define hypre_DenseBlockMatrixNumCols(matrix) ((matrix) -> num_cols) #define hypre_DenseBlockMatrixNumNonzeros(matrix) ((matrix) -> num_nonzeros) #define hypre_DenseBlockMatrixNumBlocks(matrix) ((matrix) -> num_blocks) #define hypre_DenseBlockMatrixRowStride(matrix) ((matrix) -> row_stride) #define hypre_DenseBlockMatrixColStride(matrix) ((matrix) -> col_stride) #define hypre_DenseBlockMatrixNumRowsBlock(matrix) ((matrix) -> num_rows_block) #define hypre_DenseBlockMatrixNumColsBlock(matrix) ((matrix) -> num_cols_block) #define hypre_DenseBlockMatrixNumNonzerosBlock(matrix) ((matrix) -> num_nonzeros_block) #define hypre_DenseBlockMatrixOwnsData(matrix) ((matrix) -> owns_data) #define hypre_DenseBlockMatrixData(matrix) ((matrix) -> data) #define hypre_DenseBlockMatrixDataAOP(matrix) ((matrix) -> data_aop) #define hypre_DenseBlockMatrixMemoryLocation(matrix) ((matrix) -> memory_location) #define hypre_DenseBlockMatrixDataIJ(matrix, d, i, j) \ (d[(matrix) -> row_stride * i + \ (matrix) -> col_stride * j]) #define hypre_DenseBlockMatrixDataBIJ(matrix, b, i, j) \ ((matrix) -> data[(matrix) -> num_nonzeros_block * b + \ (matrix) -> row_stride * i + \ (matrix) -> col_stride * j]) #endif /****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /* dense_block_matrix.c */ hypre_DenseBlockMatrix* hypre_DenseBlockMatrixCreate(HYPRE_Int, HYPRE_Int, HYPRE_Int, HYPRE_Int, HYPRE_Int); hypre_DenseBlockMatrix* hypre_DenseBlockMatrixCreateByBlock(HYPRE_Int, HYPRE_Int, HYPRE_Int, HYPRE_Int); hypre_DenseBlockMatrix* hypre_DenseBlockMatrixClone(hypre_DenseBlockMatrix*, HYPRE_Int); HYPRE_Int hypre_DenseBlockMatrixDestroy(hypre_DenseBlockMatrix*); HYPRE_Int hypre_DenseBlockMatrixInitializeOn(hypre_DenseBlockMatrix*, HYPRE_MemoryLocation); HYPRE_Int hypre_DenseBlockMatrixInitialize(hypre_DenseBlockMatrix*); HYPRE_Int hypre_DenseBlockMatrixBuildAOP(hypre_DenseBlockMatrix*); HYPRE_Int hypre_DenseBlockMatrixCopy(hypre_DenseBlockMatrix*, hypre_DenseBlockMatrix*); HYPRE_Int hypre_DenseBlockMatrixMigrate(hypre_DenseBlockMatrix*, HYPRE_MemoryLocation); HYPRE_Int hypre_DenseBlockMatrixPrint(MPI_Comm, hypre_DenseBlockMatrix*, const char*); /* dense_block_matmult.c */ HYPRE_Int hypre_DenseBlockMatrixMultiply(hypre_DenseBlockMatrix*, hypre_DenseBlockMatrix*, hypre_DenseBlockMatrix**); #ifdef __cplusplus } #endif #endif hypre-2.33.0/src/seq_block_mv/dense_block_matmult.c000066400000000000000000000121221477326011500223440ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "_hypre_seq_block_mv.h" /*-------------------------------------------------------------------------- * hypre_DenseBlockMatrixMultiplyHost * * TODO (VPM): implement special cases such as (locally): * 1) A = 1x2 and B = 2x2 * 2) A = 1x3 and B = 3x3 * 3) A = 1x4 and B = 4x4 * * TODO (VPM): use lapack's dgemm for large matrices (local blocks). *--------------------------------------------------------------------------*/ HYPRE_Int hypre_DenseBlockMatrixMultiplyHost( hypre_DenseBlockMatrix *A, hypre_DenseBlockMatrix *B, hypre_DenseBlockMatrix *C) { HYPRE_Int num_blocks = hypre_DenseBlockMatrixNumBlocks(A); HYPRE_Int num_rows_block_C = hypre_DenseBlockMatrixNumRowsBlock(C); HYPRE_Int num_cols_block_C = hypre_DenseBlockMatrixNumColsBlock(C); HYPRE_Int num_rows_block_B = hypre_DenseBlockMatrixNumRowsBlock(B); HYPRE_Int num_nonzeros_block_A = hypre_DenseBlockMatrixNumNonzerosBlock(A); HYPRE_Int num_nonzeros_block_B = hypre_DenseBlockMatrixNumNonzerosBlock(B); HYPRE_Int num_nonzeros_block_C = hypre_DenseBlockMatrixNumNonzerosBlock(C); HYPRE_Int ib; #if defined(HYPRE_USING_OPENMP) #pragma omp parallel for private(ib) HYPRE_SMP_SCHEDULE #endif for (ib = 0; ib < num_blocks; ib++) { HYPRE_Int i, j, k; HYPRE_Complex *data_A = hypre_DenseBlockMatrixData(A) + ib * num_nonzeros_block_A; HYPRE_Complex *data_B = hypre_DenseBlockMatrixData(B) + ib * num_nonzeros_block_B; HYPRE_Complex *data_C = hypre_DenseBlockMatrixData(C) + ib * num_nonzeros_block_C; for (i = 0; i < num_rows_block_C; i++) { for (j = 0; j < num_cols_block_C; j++) { for (k = 0; k < num_rows_block_B; k++) { /* C[i][j] += A[i][k] * B[k][j]; */ hypre_DenseBlockMatrixDataIJ(C, data_C, i, j) += hypre_DenseBlockMatrixDataIJ(A, data_A, i, k) * hypre_DenseBlockMatrixDataIJ(B, data_B, k, j); } } } } return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_DenseBlockMatrixMultiply * * Computes: C = A * B. *--------------------------------------------------------------------------*/ HYPRE_Int hypre_DenseBlockMatrixMultiply( hypre_DenseBlockMatrix *A, hypre_DenseBlockMatrix *B, hypre_DenseBlockMatrix **C_ptr) { hypre_DenseBlockMatrix *C = *C_ptr; /* Check if multiplication makes sense */ if (hypre_DenseBlockMatrixNumCols(A) != hypre_DenseBlockMatrixNumRows(B)) { hypre_error_w_msg(HYPRE_ERROR_GENERIC, "cols(A) != rows(B)"); return hypre_error_flag; } if (hypre_DenseBlockMatrixNumColsBlock(A) != hypre_DenseBlockMatrixNumRowsBlock(B)) { hypre_error_w_msg(HYPRE_ERROR_GENERIC, "local cols(A) != local rows(B)"); return hypre_error_flag; } /* Create and initialize output matrix if necessary */ if (!C) { /* Use same storage layout as A */ C = hypre_DenseBlockMatrixCreate(hypre_DenseBlockMatrixRowMajor(A), hypre_DenseBlockMatrixNumRows(A), hypre_DenseBlockMatrixNumCols(B), hypre_DenseBlockMatrixNumRowsBlock(A), hypre_DenseBlockMatrixNumColsBlock(B)); hypre_DenseBlockMatrixInitializeOn(C, hypre_DenseBlockMatrixMemoryLocation(A)); } else { /* Reset output coefficients to zero */ hypre_Memset(hypre_DenseBlockMatrixData(C), 0, hypre_DenseBlockMatrixNumNonzeros(C) * sizeof(HYPRE_Complex), hypre_DenseBlockMatrixMemoryLocation(C)); } /* Compute matrix C */ #if defined(HYPRE_USING_GPU) HYPRE_ExecutionPolicy exec = hypre_GetExecPolicy2(hypre_DenseBlockMatrixMemoryLocation(A), hypre_DenseBlockMatrixMemoryLocation(B)); if (exec == HYPRE_EXEC_DEVICE) { /* TODO (VPM): Implement hypre_DenseBlockMatrixMultiplyDevice */ hypre_DenseBlockMatrixMigrate(A, HYPRE_MEMORY_HOST); hypre_DenseBlockMatrixMigrate(B, HYPRE_MEMORY_HOST); hypre_DenseBlockMatrixMigrate(C, HYPRE_MEMORY_HOST); hypre_DenseBlockMatrixMultiplyHost(A, B, C); hypre_DenseBlockMatrixMigrate(A, HYPRE_MEMORY_DEVICE); hypre_DenseBlockMatrixMigrate(B, HYPRE_MEMORY_DEVICE); hypre_DenseBlockMatrixMigrate(C, HYPRE_MEMORY_DEVICE); } else #endif { hypre_DenseBlockMatrixMultiplyHost(A, B, C); } /* Set output pointer */ *C_ptr = C; return hypre_error_flag; } hypre-2.33.0/src/seq_block_mv/dense_block_matrix.c000066400000000000000000000300061477326011500221660ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * Member functions for hypre_DenseBlockMatrix class. * *****************************************************************************/ #include "_hypre_seq_block_mv.h" /*-------------------------------------------------------------------------- * hypre_DenseBlockMatrixCreate *--------------------------------------------------------------------------*/ hypre_DenseBlockMatrix * hypre_DenseBlockMatrixCreate( HYPRE_Int row_major, HYPRE_Int num_rows, HYPRE_Int num_cols, HYPRE_Int num_rows_block, HYPRE_Int num_cols_block ) { hypre_DenseBlockMatrix *A; HYPRE_Int num_blocks[2]; /* Compute number of blocks */ num_blocks[0] = hypre_ceildiv(num_rows, num_rows_block); num_blocks[1] = hypre_ceildiv(num_cols, num_cols_block); if (num_blocks[0] != num_blocks[1]) { hypre_error_w_msg(HYPRE_ERROR_GENERIC, "Invalid number of blocks!"); return NULL; } /* Allocate memory */ A = hypre_TAlloc(hypre_DenseBlockMatrix, 1, HYPRE_MEMORY_HOST); hypre_DenseBlockMatrixRowMajor(A) = row_major; hypre_DenseBlockMatrixNumRowsBlock(A) = num_rows_block; hypre_DenseBlockMatrixNumColsBlock(A) = num_cols_block; hypre_DenseBlockMatrixNumBlocks(A) = num_blocks[0]; hypre_DenseBlockMatrixNumRows(A) = num_blocks[0] * hypre_DenseBlockMatrixNumRowsBlock(A); hypre_DenseBlockMatrixNumCols(A) = num_blocks[0] * hypre_DenseBlockMatrixNumColsBlock(A); hypre_DenseBlockMatrixNumNonzerosBlock(A) = hypre_DenseBlockMatrixNumRowsBlock(A) * hypre_DenseBlockMatrixNumColsBlock(A); hypre_DenseBlockMatrixNumNonzeros(A) = num_blocks[0] * hypre_DenseBlockMatrixNumNonzerosBlock(A); hypre_DenseBlockMatrixOwnsData(A) = 0; hypre_DenseBlockMatrixData(A) = NULL; hypre_DenseBlockMatrixDataAOP(A) = NULL; hypre_DenseBlockMatrixMemoryLocation(A) = hypre_HandleMemoryLocation(hypre_handle()); if (row_major) { hypre_DenseBlockMatrixRowStride(A) = 1; hypre_DenseBlockMatrixColStride(A) = hypre_DenseBlockMatrixNumColsBlock(A); } else { hypre_DenseBlockMatrixRowStride(A) = hypre_DenseBlockMatrixNumRowsBlock(A); hypre_DenseBlockMatrixColStride(A) = 1; } return A; } /*-------------------------------------------------------------------------- * hypre_DenseBlockMatrixCreateByBlock *--------------------------------------------------------------------------*/ hypre_DenseBlockMatrix * hypre_DenseBlockMatrixCreateByBlock( HYPRE_Int row_major, HYPRE_Int num_blocks, HYPRE_Int num_rows_block, HYPRE_Int num_cols_block ) { return hypre_DenseBlockMatrixCreate(row_major, num_blocks * num_rows_block, num_blocks * num_cols_block, num_rows_block, num_cols_block); } /*-------------------------------------------------------------------------- * hypre_DenseBlockMatrixClone *--------------------------------------------------------------------------*/ hypre_DenseBlockMatrix* hypre_DenseBlockMatrixClone( hypre_DenseBlockMatrix *A, HYPRE_Int copy_data ) { HYPRE_Int row_major = hypre_DenseBlockMatrixRowMajor(A); HYPRE_Int num_rows = hypre_DenseBlockMatrixNumRows(A); HYPRE_Int num_cols = hypre_DenseBlockMatrixNumCols(A); HYPRE_Int num_rows_block = hypre_DenseBlockMatrixNumRowsBlock(A); HYPRE_Int num_cols_block = hypre_DenseBlockMatrixNumColsBlock(A); hypre_DenseBlockMatrix *B; /* Create new matrix */ B = hypre_DenseBlockMatrixCreate(row_major, num_rows, num_cols, num_rows_block, num_cols_block); /* Initialize matrix */ hypre_DenseBlockMatrixInitializeOn(B, hypre_DenseBlockMatrixMemoryLocation(A)); /* Copy data array */ if (copy_data) { hypre_DenseBlockMatrixCopy(A, B); } return B; } /*-------------------------------------------------------------------------- * hypre_DenseBlockMatrixDestroy *--------------------------------------------------------------------------*/ HYPRE_Int hypre_DenseBlockMatrixDestroy( hypre_DenseBlockMatrix *A ) { if (A) { HYPRE_MemoryLocation memory_location = hypre_DenseBlockMatrixMemoryLocation(A); if (hypre_DenseBlockMatrixOwnsData(A)) { hypre_TFree(hypre_DenseBlockMatrixData(A), memory_location); } /* data_aop is always owned by a hypre_DenseBlockMatrix */ hypre_TFree(hypre_DenseBlockMatrixDataAOP(A), memory_location); /* Free matrix pointer */ hypre_TFree(A, HYPRE_MEMORY_HOST); } return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_DenseBlockMatrixInitializeOn *--------------------------------------------------------------------------*/ HYPRE_Int hypre_DenseBlockMatrixInitializeOn( hypre_DenseBlockMatrix *A, HYPRE_MemoryLocation memory_location ) { hypre_DenseBlockMatrixMemoryLocation(A) = memory_location; /* Allocate memory for data */ if (!hypre_DenseBlockMatrixData(A) && hypre_DenseBlockMatrixNumNonzeros(A)) { hypre_DenseBlockMatrixData(A) = hypre_CTAlloc(HYPRE_Complex, hypre_DenseBlockMatrixNumNonzeros(A), memory_location); hypre_DenseBlockMatrixOwnsData(A) = 1; } return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_DenseBlockMatrixInitialize *--------------------------------------------------------------------------*/ HYPRE_Int hypre_DenseBlockMatrixInitialize( hypre_DenseBlockMatrix *A ) { return hypre_DenseBlockMatrixInitializeOn(A, hypre_DenseBlockMatrixMemoryLocation(A)); } /*-------------------------------------------------------------------------- * hypre_DenseBlockMatrixBuildAOP *--------------------------------------------------------------------------*/ HYPRE_Int hypre_DenseBlockMatrixBuildAOP( hypre_DenseBlockMatrix *A ) { HYPRE_MemoryLocation memory_location = hypre_DenseBlockMatrixMemoryLocation(A); /* Allocate memory if we need */ if (!hypre_DenseBlockMatrixDataAOP(A)) { hypre_DenseBlockMatrixDataAOP(A) = hypre_TAlloc(HYPRE_Complex *, hypre_DenseBlockMatrixNumBlocks(A), memory_location); } /* Build array of pointers to the matrix data */ #if defined(HYPRE_USING_GPU) HYPRE_ExecutionPolicy exec = hypre_GetExecPolicy1(memory_location); if (exec == HYPRE_EXEC_DEVICE) { hypreDevice_ComplexArrayToArrayOfPtrs(hypre_DenseBlockMatrixNumBlocks(A), hypre_DenseBlockMatrixNumNonzerosBlock(A), hypre_DenseBlockMatrixData(A), hypre_DenseBlockMatrixDataAOP(A)); } #endif return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_DenseBlockMatrixCopy *--------------------------------------------------------------------------*/ HYPRE_Int hypre_DenseBlockMatrixCopy( hypre_DenseBlockMatrix *A, hypre_DenseBlockMatrix *B ) { /* Copy coeficients from matrix A to B */ hypre_TMemcpy(hypre_DenseBlockMatrixData(B), hypre_DenseBlockMatrixData(A), HYPRE_Complex, hypre_DenseBlockMatrixNumNonzeros(A), hypre_DenseBlockMatrixMemoryLocation(B), hypre_DenseBlockMatrixMemoryLocation(A)); return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_DenseBlockMatrixMigrate *--------------------------------------------------------------------------*/ HYPRE_Int hypre_DenseBlockMatrixMigrate( hypre_DenseBlockMatrix *A, HYPRE_MemoryLocation memory_location ) { /* Input matrix info */ HYPRE_MemoryLocation old_memory_location = hypre_DenseBlockMatrixMemoryLocation(A); HYPRE_Int num_nonzeros = hypre_DenseBlockMatrixNumNonzeros(A); HYPRE_Complex *A_data = hypre_DenseBlockMatrixData(A); /* Output matrix info */ HYPRE_Complex *B_data; /* Update A's memory location */ hypre_DenseBlockMatrixMemoryLocation(A) = memory_location; if ( hypre_GetActualMemLocation(memory_location) != hypre_GetActualMemLocation(old_memory_location) ) { if (A_data) { B_data = hypre_TAlloc(HYPRE_Complex, num_nonzeros, memory_location); hypre_TMemcpy(B_data, A_data, HYPRE_Complex, num_nonzeros, memory_location, old_memory_location); hypre_TFree(A_data, old_memory_location); hypre_DenseBlockMatrixData(A) = B_data; } } return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_DenseBlockMatrixPrint *--------------------------------------------------------------------------*/ HYPRE_Int hypre_DenseBlockMatrixPrint( MPI_Comm comm, hypre_DenseBlockMatrix *A, const char* filename ) { /* Input matrix info */ HYPRE_MemoryLocation memory_location = hypre_DenseBlockMatrixMemoryLocation(A); /* Local variables */ char new_filename[HYPRE_MAX_FILE_NAME_LEN]; HYPRE_Int myid, ib, i, j; FILE *file; /* Move matrix to host */ hypre_DenseBlockMatrixMigrate(A, HYPRE_MEMORY_HOST); /* Open file */ hypre_MPI_Comm_rank(comm, &myid); hypre_sprintf(new_filename, "%s.%05d", filename, myid); if ((file = fopen(new_filename, "w")) == NULL) { hypre_error_w_msg(HYPRE_ERROR_GENERIC, "Cannot open output file!"); return hypre_error_flag; } /*--------------------------------------------- * Write the header *---------------------------------------------*/ /* 1st header line: matrix info */ hypre_fprintf(file, "%d %d\n", hypre_DenseBlockMatrixNumRows(A), hypre_DenseBlockMatrixNumCols(A)); /* 2nd header line: local block info */ hypre_fprintf(file, "%d %d %d %d\n", hypre_DenseBlockMatrixRowMajor(A), hypre_DenseBlockMatrixNumBlocks(A), hypre_DenseBlockMatrixNumRowsBlock(A), hypre_DenseBlockMatrixNumColsBlock(A)); /*--------------------------------------------- * Write coefficients *---------------------------------------------*/ for (ib = 0; ib < hypre_DenseBlockMatrixNumBlocks(A); ib++) { hypre_fprintf(file, "%d\n", ib); for (i = 0; i < hypre_DenseBlockMatrixNumRowsBlock(A); i++) { for (j = 0; j < hypre_DenseBlockMatrixNumColsBlock(A); j++) { hypre_fprintf(file, " %22.15e", hypre_DenseBlockMatrixDataBIJ(A, ib, i, j)); } hypre_fprintf(file, ";\n"); } } fclose(file); /* Move matrix back to original lcoation */ hypre_DenseBlockMatrixMigrate(A, memory_location); return hypre_error_flag; } hypre-2.33.0/src/seq_block_mv/dense_block_matrix.h000066400000000000000000000072011477326011500221740ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #ifndef hypre_DENSE_BLOCK_MATRIX_HEADER #define hypre_DENSE_BLOCK_MATRIX_HEADER /*-------------------------------------------------------------------------- * Uniformly blocked dense matrix data structure *--------------------------------------------------------------------------*/ typedef struct hypre_DenseBlockMatrix_struct { HYPRE_Int row_major; /* Flag indicating storage format (false: col major)*/ HYPRE_Int num_rows; /* Number of rows of entire matrix */ HYPRE_Int num_cols; /* Number of columns of entire matrix */ HYPRE_Int num_nonzeros; /* Number of nonzero coefficients of entire matrix */ HYPRE_Int num_blocks; /* Number of sub-matrices (blocks) */ /* Local info for a individual block (sub-matrix) */ HYPRE_Int row_stride; /* Stride for accessing row values */ HYPRE_Int col_stride; /* Stride for accessing column values */ HYPRE_Int num_rows_block; /* Number of rows per block */ HYPRE_Int num_cols_block; /* Number of columns per block */ HYPRE_Int num_nonzeros_block; /* Number of nonzero coefficients per block */ /* Matrix coefficients array */ HYPRE_Int owns_data; /* Flag indicating ownership of the data array */ HYPRE_Complex *data; /* Matrix coefficients */ HYPRE_Complex **data_aop; /* Array of pointers to data */ HYPRE_MemoryLocation memory_location; /* Memory location of data array */ } hypre_DenseBlockMatrix; /*-------------------------------------------------------------------------- * Accessor functions for the uniform batched matrix structure *--------------------------------------------------------------------------*/ #define hypre_DenseBlockMatrixRowMajor(matrix) ((matrix) -> row_major) #define hypre_DenseBlockMatrixNumRows(matrix) ((matrix) -> num_rows) #define hypre_DenseBlockMatrixNumCols(matrix) ((matrix) -> num_cols) #define hypre_DenseBlockMatrixNumNonzeros(matrix) ((matrix) -> num_nonzeros) #define hypre_DenseBlockMatrixNumBlocks(matrix) ((matrix) -> num_blocks) #define hypre_DenseBlockMatrixRowStride(matrix) ((matrix) -> row_stride) #define hypre_DenseBlockMatrixColStride(matrix) ((matrix) -> col_stride) #define hypre_DenseBlockMatrixNumRowsBlock(matrix) ((matrix) -> num_rows_block) #define hypre_DenseBlockMatrixNumColsBlock(matrix) ((matrix) -> num_cols_block) #define hypre_DenseBlockMatrixNumNonzerosBlock(matrix) ((matrix) -> num_nonzeros_block) #define hypre_DenseBlockMatrixOwnsData(matrix) ((matrix) -> owns_data) #define hypre_DenseBlockMatrixData(matrix) ((matrix) -> data) #define hypre_DenseBlockMatrixDataAOP(matrix) ((matrix) -> data_aop) #define hypre_DenseBlockMatrixMemoryLocation(matrix) ((matrix) -> memory_location) #define hypre_DenseBlockMatrixDataIJ(matrix, d, i, j) \ (d[(matrix) -> row_stride * i + \ (matrix) -> col_stride * j]) #define hypre_DenseBlockMatrixDataBIJ(matrix, b, i, j) \ ((matrix) -> data[(matrix) -> num_nonzeros_block * b + \ (matrix) -> row_stride * i + \ (matrix) -> col_stride * j]) #endif hypre-2.33.0/src/seq_block_mv/headers000077500000000000000000000025531477326011500175350ustar00rootroot00000000000000#!/bin/bash # Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) INTERNAL_HEADER=_hypre_seq_block_mv.h #=========================================================================== # Include guards and other includes #=========================================================================== cat > $INTERNAL_HEADER <<@ /****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /*** DO NOT EDIT THIS FILE DIRECTLY (use 'headers' to generate) ***/ #ifndef hypre_SEQ_BLOCK_MV_HEADER #define hypre_SEQ_BLOCK_MV_HEADER #include #include "seq_mv.h" #ifdef __cplusplus extern "C" { #endif @ cat dense_block_matrix.h >> $INTERNAL_HEADER cat protos.h >> $INTERNAL_HEADER #=========================================================================== # Include guards #=========================================================================== cat >> $INTERNAL_HEADER <<@ #ifdef __cplusplus } #endif #endif @ hypre-2.33.0/src/seq_block_mv/protos.h000066400000000000000000000030171477326011500176670ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /* dense_block_matrix.c */ hypre_DenseBlockMatrix* hypre_DenseBlockMatrixCreate(HYPRE_Int, HYPRE_Int, HYPRE_Int, HYPRE_Int, HYPRE_Int); hypre_DenseBlockMatrix* hypre_DenseBlockMatrixCreateByBlock(HYPRE_Int, HYPRE_Int, HYPRE_Int, HYPRE_Int); hypre_DenseBlockMatrix* hypre_DenseBlockMatrixClone(hypre_DenseBlockMatrix*, HYPRE_Int); HYPRE_Int hypre_DenseBlockMatrixDestroy(hypre_DenseBlockMatrix*); HYPRE_Int hypre_DenseBlockMatrixInitializeOn(hypre_DenseBlockMatrix*, HYPRE_MemoryLocation); HYPRE_Int hypre_DenseBlockMatrixInitialize(hypre_DenseBlockMatrix*); HYPRE_Int hypre_DenseBlockMatrixBuildAOP(hypre_DenseBlockMatrix*); HYPRE_Int hypre_DenseBlockMatrixCopy(hypre_DenseBlockMatrix*, hypre_DenseBlockMatrix*); HYPRE_Int hypre_DenseBlockMatrixMigrate(hypre_DenseBlockMatrix*, HYPRE_MemoryLocation); HYPRE_Int hypre_DenseBlockMatrixPrint(MPI_Comm, hypre_DenseBlockMatrix*, const char*); /* dense_block_matmult.c */ HYPRE_Int hypre_DenseBlockMatrixMultiply(hypre_DenseBlockMatrix*, hypre_DenseBlockMatrix*, hypre_DenseBlockMatrix**); hypre-2.33.0/src/seq_mv/000077500000000000000000000000001477326011500150155ustar00rootroot00000000000000hypre-2.33.0/src/seq_mv/.gitignore000066400000000000000000000002701477326011500170040ustar00rootroot00000000000000##################### # Autogenerated files ##################### csr_spgemm_device_numer[1-9].c csr_spgemm_device_numer10.c csr_spgemm_device_symbl[1-9].c csr_spgemm_device_symbl10.c hypre-2.33.0/src/seq_mv/CMakeLists.txt000066400000000000000000000071121477326011500175560ustar00rootroot00000000000000# Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) set(HDRS HYPRE_seq_mv.h seq_mv.h ) set(SRCS csr_filter.c csr_matop.c csr_matrix.c csr_matvec.c genpart.c HYPRE_csr_matrix.c HYPRE_mapped_matrix.c HYPRE_multiblock_matrix.c HYPRE_vector.c mapped_matrix.c multiblock_matrix.c vector_batched.c csr_matop_device.c csr_matrix_cuda_utils.c csr_matvec_device.c csr_matvec_oomp.c csr_spadd_device.c csr_spgemm_device.c csr_spgemm_device_cusparse.c csr_spgemm_device_numblocks.c csr_spgemm_device_numer.c csr_spgemm_device_numer1.c csr_spgemm_device_numer2.c csr_spgemm_device_numer3.c csr_spgemm_device_numer4.c csr_spgemm_device_numer5.c csr_spgemm_device_numer6.c csr_spgemm_device_numer7.c csr_spgemm_device_numer8.c csr_spgemm_device_numer9.c csr_spgemm_device_numer10.c csr_spgemm_device_onemklsparse.c csr_spgemm_device_rocsparse.c csr_spgemm_device_rowest.c csr_spgemm_device_symbl.c csr_spgemm_device_symbl1.c csr_spgemm_device_symbl2.c csr_spgemm_device_symbl3.c csr_spgemm_device_symbl4.c csr_spgemm_device_symbl5.c csr_spgemm_device_symbl6.c csr_spgemm_device_symbl7.c csr_spgemm_device_symbl8.c csr_spgemm_device_symbl9.c csr_spgemm_device_symbl10.c csr_spgemm_device_util.c csr_spmv_device.c csr_sptrans_device.c vector.c vector_device.c ) # Autogenerate csr_spgemm_device_numer$ files file(READ "csr_spgemm_device_numer.in" CONTENTS) foreach(number RANGE 1 10) # Check if file exists, then don't recreate set(fn "csr_spgemm_device_numer${number}.c") if (NOT EXISTS ${fn}) file(WRITE ${fn} "#define HYPRE_SPGEMM_BIN ${number}") file(APPEND ${fn} "${CONTENTS}") endif (NOT EXISTS ${fn}) endforeach(number RANGE 1 10) # Autogenerate csr_spgemm_device_symbl$ files file(READ "csr_spgemm_device_symbl.in" CONTENTS) foreach(number RANGE 1 10) set(fn "csr_spgemm_device_symbl${number}.c") if (NOT EXISTS ${fn}) file(WRITE ${fn} "#define HYPRE_SPGEMM_BIN ${number}") file(APPEND ${fn} "${CONTENTS}") endif (NOT EXISTS ${fn}) endforeach(number RANGE 1 10) target_sources(${PROJECT_NAME} PRIVATE ${SRCS} ${HDRS} ) if (HYPRE_USING_GPU) set(GPU_SRCS csr_matop_device.c csr_matrix_cuda_utils.c csr_matvec_device.c csr_matvec_oomp.c csr_spadd_device.c csr_spgemm_device.c csr_spgemm_device_cusparse.c csr_spgemm_device_numblocks.c csr_spgemm_device_numer.c csr_spgemm_device_numer1.c csr_spgemm_device_numer2.c csr_spgemm_device_numer3.c csr_spgemm_device_numer4.c csr_spgemm_device_numer5.c csr_spgemm_device_numer6.c csr_spgemm_device_numer7.c csr_spgemm_device_numer8.c csr_spgemm_device_numer9.c csr_spgemm_device_numer10.c csr_spgemm_device_onemklsparse.c csr_spgemm_device_rocsparse.c csr_spgemm_device_rowest.c csr_spgemm_device_symbl.c csr_spgemm_device_symbl1.c csr_spgemm_device_symbl2.c csr_spgemm_device_symbl3.c csr_spgemm_device_symbl4.c csr_spgemm_device_symbl5.c csr_spgemm_device_symbl6.c csr_spgemm_device_symbl7.c csr_spgemm_device_symbl8.c csr_spgemm_device_symbl9.c csr_spgemm_device_symbl10.c csr_spgemm_device_util.c csr_spmv_device.c csr_sptrans_device.c vector_device.c ) convert_filenames_to_full_paths(GPU_SRCS) set(HYPRE_GPU_SOURCES ${HYPRE_GPU_SOURCES} ${GPU_SRCS} PARENT_SCOPE) endif () convert_filenames_to_full_paths(HDRS) set(HYPRE_HEADERS ${HYPRE_HEADERS} ${HDRS} PARENT_SCOPE) hypre-2.33.0/src/seq_mv/HYPRE_csr_matrix.c000066400000000000000000000060311477326011500203030ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * HYPRE_CSRMatrix interface * *****************************************************************************/ #include "seq_mv.h" /*-------------------------------------------------------------------------- * HYPRE_CSRMatrixCreate *--------------------------------------------------------------------------*/ HYPRE_CSRMatrix HYPRE_CSRMatrixCreate( HYPRE_Int num_rows, HYPRE_Int num_cols, HYPRE_Int *row_sizes ) { hypre_CSRMatrix *matrix; HYPRE_Int *matrix_i; HYPRE_Int i; matrix_i = hypre_CTAlloc(HYPRE_Int, num_rows + 1, HYPRE_MEMORY_HOST); matrix_i[0] = 0; for (i = 0; i < num_rows; i++) { matrix_i[i + 1] = matrix_i[i] + row_sizes[i]; } matrix = hypre_CSRMatrixCreate(num_rows, num_cols, matrix_i[num_rows]); hypre_CSRMatrixI(matrix) = matrix_i; return ( (HYPRE_CSRMatrix) matrix ); } /*-------------------------------------------------------------------------- * HYPRE_CSRMatrixDestroy *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_CSRMatrixDestroy( HYPRE_CSRMatrix matrix ) { return ( hypre_CSRMatrixDestroy( (hypre_CSRMatrix *) matrix ) ); } /*-------------------------------------------------------------------------- * HYPRE_CSRMatrixInitialize *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_CSRMatrixInitialize( HYPRE_CSRMatrix matrix ) { return ( hypre_CSRMatrixInitialize( (hypre_CSRMatrix *) matrix ) ); } /*-------------------------------------------------------------------------- * HYPRE_CSRMatrixRead *--------------------------------------------------------------------------*/ HYPRE_CSRMatrix HYPRE_CSRMatrixRead( char *file_name ) { return ( (HYPRE_CSRMatrix) hypre_CSRMatrixRead( file_name ) ); } /*-------------------------------------------------------------------------- * HYPRE_CSRMatrixPrint *--------------------------------------------------------------------------*/ void HYPRE_CSRMatrixPrint( HYPRE_CSRMatrix matrix, char *file_name ) { hypre_CSRMatrixPrint( (hypre_CSRMatrix *) matrix, file_name ); } /*-------------------------------------------------------------------------- * HYPRE_CSRMatrixGetNumRows *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_CSRMatrixGetNumRows( HYPRE_CSRMatrix matrix, HYPRE_Int *num_rows ) { hypre_CSRMatrix *csr_matrix = (hypre_CSRMatrix *) matrix; *num_rows = hypre_CSRMatrixNumRows( csr_matrix ); return 0; } hypre-2.33.0/src/seq_mv/HYPRE_mapped_matrix.c000066400000000000000000000111021477326011500207550ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * HYPRE_MappedMatrix interface * *****************************************************************************/ #include "seq_mv.h" /*-------------------------------------------------------------------------- * HYPRE_MappedMatrixCreate *--------------------------------------------------------------------------*/ HYPRE_MappedMatrix HYPRE_MappedMatrixCreate( void ) { return ( (HYPRE_MappedMatrix) hypre_MappedMatrixCreate( )); } /*-------------------------------------------------------------------------- * HYPRE_MappedMatrixDestroy *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_MappedMatrixDestroy( HYPRE_MappedMatrix matrix ) { return ( hypre_MappedMatrixDestroy( (hypre_MappedMatrix *) matrix ) ); } /*-------------------------------------------------------------------------- * HYPRE_MappedMatrixLimitedDestroy *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_MappedMatrixLimitedDestroy( HYPRE_MappedMatrix matrix ) { return ( hypre_MappedMatrixLimitedDestroy( (hypre_MappedMatrix *) matrix ) ); } /*-------------------------------------------------------------------------- * HYPRE_MappedMatrixInitialize *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_MappedMatrixInitialize( HYPRE_MappedMatrix matrix ) { return ( hypre_MappedMatrixInitialize( (hypre_MappedMatrix *) matrix ) ); } /*-------------------------------------------------------------------------- * HYPRE_MappedMatrixAssemble *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_MappedMatrixAssemble( HYPRE_MappedMatrix matrix ) { return ( hypre_MappedMatrixAssemble( (hypre_MappedMatrix *) matrix ) ); } /*-------------------------------------------------------------------------- * HYPRE_MappedMatrixPrint *--------------------------------------------------------------------------*/ void HYPRE_MappedMatrixPrint( HYPRE_MappedMatrix matrix ) { hypre_MappedMatrixPrint( (hypre_MappedMatrix *) matrix ); } /**************************************************************************** END OF ROUTINES THAT ARE ESSENTIALLY JUST CALLS THROUGH TO OTHER ROUTINES AND THAT ARE INDEPENDENT OF THE PARTICULAR MATRIX TYPE (except for names) ***************************************************************************/ /*-------------------------------------------------------------------------- * HYPRE_MappedMatrixGetColIndex *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_MappedMatrixGetColIndex( HYPRE_MappedMatrix matrix, HYPRE_Int j ) { return ( hypre_MappedMatrixGetColIndex( (hypre_MappedMatrix *) matrix, j )); } /*-------------------------------------------------------------------------- * HYPRE_MappedMatrixGetMatrix *--------------------------------------------------------------------------*/ void * HYPRE_MappedMatrixGetMatrix( HYPRE_MappedMatrix matrix ) { return ( hypre_MappedMatrixGetMatrix( (hypre_MappedMatrix *) matrix )); } /*-------------------------------------------------------------------------- * HYPRE_MappedMatrixSetMatrix *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_MappedMatrixSetMatrix( HYPRE_MappedMatrix matrix, void *matrix_data ) { return ( hypre_MappedMatrixSetMatrix( (hypre_MappedMatrix *) matrix, matrix_data ) ); } /*-------------------------------------------------------------------------- * HYPRE_MappedMatrixSetColMap *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_MappedMatrixSetColMap( HYPRE_MappedMatrix matrix, HYPRE_Int (*ColMap)(HYPRE_Int, void *) ) { return ( hypre_MappedMatrixSetColMap( (hypre_MappedMatrix *) matrix, ColMap ) ); } /*-------------------------------------------------------------------------- * HYPRE_MappedMatrixSetMapData *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_MappedMatrixSetMapData( HYPRE_MappedMatrix matrix, void *MapData ) { return ( hypre_MappedMatrixSetMapData( (hypre_MappedMatrix *) matrix, MapData ) ); } hypre-2.33.0/src/seq_mv/HYPRE_multiblock_matrix.c000066400000000000000000000075131477326011500216670ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * HYPRE_MultiblockMatrix interface * *****************************************************************************/ #include "seq_mv.h" /*-------------------------------------------------------------------------- * HYPRE_MultiblockMatrixCreate *--------------------------------------------------------------------------*/ HYPRE_MultiblockMatrix HYPRE_MultiblockMatrixCreate( void ) { return ( (HYPRE_MultiblockMatrix) hypre_MultiblockMatrixCreate( )); } /*-------------------------------------------------------------------------- * HYPRE_MultiblockMatrixDestroy *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_MultiblockMatrixDestroy( HYPRE_MultiblockMatrix matrix ) { return ( hypre_MultiblockMatrixDestroy( (hypre_MultiblockMatrix *) matrix ) ); } /*-------------------------------------------------------------------------- * HYPRE_MultiblockMatrixLimitedDestroy *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_MultiblockMatrixLimitedDestroy( HYPRE_MultiblockMatrix matrix ) { return ( hypre_MultiblockMatrixLimitedDestroy( (hypre_MultiblockMatrix *) matrix ) ); } /*-------------------------------------------------------------------------- * HYPRE_MultiblockMatrixInitialize *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_MultiblockMatrixInitialize( HYPRE_MultiblockMatrix matrix ) { return ( hypre_MultiblockMatrixInitialize( (hypre_MultiblockMatrix *) matrix ) ); } /*-------------------------------------------------------------------------- * HYPRE_MultiblockMatrixAssemble *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_MultiblockMatrixAssemble( HYPRE_MultiblockMatrix matrix ) { return ( hypre_MultiblockMatrixAssemble( (hypre_MultiblockMatrix *) matrix ) ); } /*-------------------------------------------------------------------------- * HYPRE_MultiblockMatrixPrint *--------------------------------------------------------------------------*/ void HYPRE_MultiblockMatrixPrint( HYPRE_MultiblockMatrix matrix ) { hypre_MultiblockMatrixPrint( (hypre_MultiblockMatrix *) matrix ); } /**************************************************************************** END OF ROUTINES THAT ARE ESSENTIALLY JUST CALLS THROUGH TO OTHER ROUTINES AND THAT ARE INDEPENDENT OF THE PARTICULAR MATRIX TYPE (except for names) ***************************************************************************/ /*-------------------------------------------------------------------------- * HYPRE_MultiblockMatrixSetNumSubmatrices *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_MultiblockMatrixSetNumSubmatrices( HYPRE_MultiblockMatrix matrix, HYPRE_Int n ) { return ( hypre_MultiblockMatrixSetNumSubmatrices( (hypre_MultiblockMatrix *) matrix, n ) ); } /*-------------------------------------------------------------------------- * HYPRE_MultiblockMatrixSetSubmatrixType *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_MultiblockMatrixSetSubmatrixType( HYPRE_MultiblockMatrix matrix, HYPRE_Int j, HYPRE_Int type ) { return ( hypre_MultiblockMatrixSetSubmatrixType( (hypre_MultiblockMatrix *) matrix, j, type ) ); } hypre-2.33.0/src/seq_mv/HYPRE_seq_mv.h000066400000000000000000000122221477326011500174260ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * Header file for HYPRE_mv library * *****************************************************************************/ #ifndef HYPRE_SEQ_MV_HEADER #define HYPRE_SEQ_MV_HEADER #include "HYPRE_utilities.h" #ifdef __cplusplus extern "C" { #endif /*-------------------------------------------------------------------------- * Structures *--------------------------------------------------------------------------*/ struct hypre_CSRMatrix_struct; typedef struct hypre_CSRMatrix_struct *HYPRE_CSRMatrix; struct hypre_MappedMatrix_struct; typedef struct hypre_MappedMatrix_struct *HYPRE_MappedMatrix; struct hypre_MultiblockMatrix_struct; typedef struct hypre_MultiblockMatrix_struct *HYPRE_MultiblockMatrix; /*-------------------------------------------------------------------------- * Prototypes *--------------------------------------------------------------------------*/ /* HYPRE_csr_matrix.c */ HYPRE_CSRMatrix HYPRE_CSRMatrixCreate( HYPRE_Int num_rows, HYPRE_Int num_cols, HYPRE_Int *row_sizes ); HYPRE_Int HYPRE_CSRMatrixDestroy( HYPRE_CSRMatrix matrix ); HYPRE_Int HYPRE_CSRMatrixInitialize( HYPRE_CSRMatrix matrix ); HYPRE_CSRMatrix HYPRE_CSRMatrixRead( char *file_name ); void HYPRE_CSRMatrixPrint( HYPRE_CSRMatrix matrix, char *file_name ); HYPRE_Int HYPRE_CSRMatrixGetNumRows( HYPRE_CSRMatrix matrix, HYPRE_Int *num_rows ); /* HYPRE_mapped_matrix.c */ HYPRE_MappedMatrix HYPRE_MappedMatrixCreate( void ); HYPRE_Int HYPRE_MappedMatrixDestroy( HYPRE_MappedMatrix matrix ); HYPRE_Int HYPRE_MappedMatrixLimitedDestroy( HYPRE_MappedMatrix matrix ); HYPRE_Int HYPRE_MappedMatrixInitialize( HYPRE_MappedMatrix matrix ); HYPRE_Int HYPRE_MappedMatrixAssemble( HYPRE_MappedMatrix matrix ); void HYPRE_MappedMatrixPrint( HYPRE_MappedMatrix matrix ); HYPRE_Int HYPRE_MappedMatrixGetColIndex( HYPRE_MappedMatrix matrix, HYPRE_Int j ); void *HYPRE_MappedMatrixGetMatrix( HYPRE_MappedMatrix matrix ); HYPRE_Int HYPRE_MappedMatrixSetMatrix( HYPRE_MappedMatrix matrix, void *matrix_data ); HYPRE_Int HYPRE_MappedMatrixSetColMap( HYPRE_MappedMatrix matrix, HYPRE_Int (*ColMap )(HYPRE_Int, void *)); HYPRE_Int HYPRE_MappedMatrixSetMapData( HYPRE_MappedMatrix matrix, void *MapData ); /* HYPRE_multiblock_matrix.c */ HYPRE_MultiblockMatrix HYPRE_MultiblockMatrixCreate( void ); HYPRE_Int HYPRE_MultiblockMatrixDestroy( HYPRE_MultiblockMatrix matrix ); HYPRE_Int HYPRE_MultiblockMatrixLimitedDestroy( HYPRE_MultiblockMatrix matrix ); HYPRE_Int HYPRE_MultiblockMatrixInitialize( HYPRE_MultiblockMatrix matrix ); HYPRE_Int HYPRE_MultiblockMatrixAssemble( HYPRE_MultiblockMatrix matrix ); void HYPRE_MultiblockMatrixPrint( HYPRE_MultiblockMatrix matrix ); HYPRE_Int HYPRE_MultiblockMatrixSetNumSubmatrices( HYPRE_MultiblockMatrix matrix, HYPRE_Int n ); HYPRE_Int HYPRE_MultiblockMatrixSetSubmatrixType( HYPRE_MultiblockMatrix matrix, HYPRE_Int j, HYPRE_Int type ); /* HYPRE_vector.c */ HYPRE_Vector HYPRE_VectorCreate( HYPRE_Int size ); HYPRE_Int HYPRE_VectorDestroy( HYPRE_Vector vector ); HYPRE_Int HYPRE_VectorInitialize( HYPRE_Vector vector ); HYPRE_Int HYPRE_VectorPrint( HYPRE_Vector vector, char *file_name ); HYPRE_Vector HYPRE_VectorRead( char *file_name ); typedef enum HYPRE_TimerID { // timers for solver phase HYPRE_TIMER_ID_MATVEC = 0, HYPRE_TIMER_ID_BLAS1, HYPRE_TIMER_ID_RELAX, HYPRE_TIMER_ID_GS_ELIM_SOLVE, // timers for solve MPI HYPRE_TIMER_ID_PACK_UNPACK, // copying data to/from send/recv buf HYPRE_TIMER_ID_HALO_EXCHANGE, // halo exchange in matvec and relax HYPRE_TIMER_ID_ALL_REDUCE, // timers for setup phase // coarsening HYPRE_TIMER_ID_CREATES, HYPRE_TIMER_ID_CREATE_2NDS, HYPRE_TIMER_ID_PMIS, // interpolation HYPRE_TIMER_ID_EXTENDED_I_INTERP, HYPRE_TIMER_ID_PARTIAL_INTERP, HYPRE_TIMER_ID_MULTIPASS_INTERP, HYPRE_TIMER_ID_INTERP_TRUNC, HYPRE_TIMER_ID_MATMUL, // matrix-matrix multiplication HYPRE_TIMER_ID_COARSE_PARAMS, // rap HYPRE_TIMER_ID_RAP, // timers for setup MPI HYPRE_TIMER_ID_RENUMBER_COLIDX, HYPRE_TIMER_ID_EXCHANGE_INTERP_DATA, // setup etc HYPRE_TIMER_ID_GS_ELIM_SETUP, // temporaries HYPRE_TIMER_ID_BEXT_A, HYPRE_TIMER_ID_BEXT_S, HYPRE_TIMER_ID_RENUMBER_COLIDX_RAP, HYPRE_TIMER_ID_MERGE, // csr matop HYPRE_TIMER_ID_SPGEMM_ROWNNZ, HYPRE_TIMER_ID_SPGEMM_ATTEMPT1, HYPRE_TIMER_ID_SPGEMM_ATTEMPT2, HYPRE_TIMER_ID_SPGEMM_SYMBOLIC, HYPRE_TIMER_ID_SPGEMM_NUMERIC, HYPRE_TIMER_ID_SPGEMM, HYPRE_TIMER_ID_SPADD, HYPRE_TIMER_ID_SPTRANS, HYPRE_TIMER_ID_COUNT } HYPRE_TimerID; extern HYPRE_Real hypre_profile_times[HYPRE_TIMER_ID_COUNT]; #ifdef __cplusplus } #endif #endif hypre-2.33.0/src/seq_mv/HYPRE_vector.c000066400000000000000000000041731477326011500174370ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * HYPRE_Vector interface * *****************************************************************************/ #include "seq_mv.h" /*-------------------------------------------------------------------------- * HYPRE_VectorCreate *--------------------------------------------------------------------------*/ HYPRE_Vector HYPRE_VectorCreate( HYPRE_Int size ) { return ( (HYPRE_Vector) hypre_SeqVectorCreate(size) ); } /*-------------------------------------------------------------------------- * HYPRE_VectorDestroy *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_VectorDestroy( HYPRE_Vector vector ) { return ( hypre_SeqVectorDestroy( (hypre_Vector *) vector ) ); } /*-------------------------------------------------------------------------- * HYPRE_VectorInitialize *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_VectorInitialize( HYPRE_Vector vector ) { return ( hypre_SeqVectorInitialize( (hypre_Vector *) vector ) ); } /*-------------------------------------------------------------------------- * HYPRE_VectorPrint *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_VectorPrint( HYPRE_Vector vector, char *file_name ) { return ( hypre_SeqVectorPrint( (hypre_Vector *) vector, file_name ) ); } /*-------------------------------------------------------------------------- * HYPRE_VectorRead *--------------------------------------------------------------------------*/ HYPRE_Vector HYPRE_VectorRead( char *file_name ) { return ( (HYPRE_Vector) hypre_SeqVectorRead( file_name ) ); } hypre-2.33.0/src/seq_mv/MakeIRIX000066400000000000000000000027501477326011500163150ustar00rootroot00000000000000# Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) .SUFFIXES: .SUFFIXES: .c .f .o HEADERS =\ HYPRE_mv.h\ csr_matrix.h\ mapped_matrix.h\ multiblock_matrix.h\ vector.h FILES =\ HYPRE_csr_matrix.c\ HYPRE_mapped_matrix.c\ HYPRE_multiblock_matrix.c\ csr_matrix.c\ csr_matop.c\ csr_matvec.c\ mapped_matrix.c\ multiblock_matrix.c\ vector.c OBJS = ${FILES:.c=.o} CC = cc CFLAGS =\ -I/usr/local/include\ -I/home/casc/include\ -I.. LFLAGS =\ -L/usr/local/lib\ -L/home/casc/lib\ -L/home/casc/g77/lib\ -L.\ -L../utilities\ -lHYPRE_memory\ -lf2c\ -lcegdb\ -lm ################################################################## # Main rules ################################################################## libHYPRE_mv.a: ${OBJS} @echo "Building $@ ... " ar -ru $@ ${OBJS} ranlib $@ ${OBJS}: ${HEADERS} ################################################################## # Generic rules ################################################################## .c.o: @echo "Making (c) " $@ @${CC} -o $@ -c ${CFLAGS} $< .f.${AMG_ARCH}.o: @echo "Making (f) " $@ @${F77} -o $@ -c ${FFLAGS} $< ################################################################## # Miscellaneous rules ################################################################## veryclean: clean @rm -f libHYPRE_mv.a @rm -f driver driver_internal clean: @rm -f *.o hypre-2.33.0/src/seq_mv/Makefile000066400000000000000000000070631477326011500164630ustar00rootroot00000000000000# Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) include ../config/Makefile.config CINCLUDES = ${INCLUDES} ${MPIINCLUDE} C_COMPILE_FLAGS =\ -I..\ -I$(srcdir)\ -I$(srcdir)/..\ -I$(srcdir)/../utilities\ ${CINCLUDES} HEADERS =\ csr_matrix.h\ HYPRE_seq_mv.h\ mapped_matrix.h\ multiblock_matrix.h\ seq_mv.h\ seq_mv.hpp\ vector.h FILES =\ csr_filter.c\ csr_matop.c\ csr_matrix.c\ csr_matvec.c\ genpart.c\ HYPRE_csr_matrix.c\ HYPRE_mapped_matrix.c\ HYPRE_multiblock_matrix.c\ HYPRE_vector.c\ mapped_matrix.c\ multiblock_matrix.c\ vector.c\ vector_batched.c CUFILES =\ csr_matop_device.c\ csr_matrix_cuda_utils.c\ csr_matvec_device.c\ csr_matvec_oomp.c\ csr_spadd_device.c\ csr_spgemm_device.c\ csr_spgemm_device_cusparse.c\ csr_spgemm_device_numblocks.c\ csr_spgemm_device_numer.c\ csr_spgemm_device_numer1.c\ csr_spgemm_device_numer2.c\ csr_spgemm_device_numer3.c\ csr_spgemm_device_numer4.c\ csr_spgemm_device_numer5.c\ csr_spgemm_device_numer6.c\ csr_spgemm_device_numer7.c\ csr_spgemm_device_numer8.c\ csr_spgemm_device_numer9.c\ csr_spgemm_device_numer10.c\ csr_spgemm_device_onemklsparse.c\ csr_spgemm_device_rocsparse.c \ csr_spgemm_device_rowest.c\ csr_spgemm_device_symbl.c\ csr_spgemm_device_symbl1.c\ csr_spgemm_device_symbl2.c\ csr_spgemm_device_symbl3.c\ csr_spgemm_device_symbl4.c\ csr_spgemm_device_symbl5.c\ csr_spgemm_device_symbl6.c\ csr_spgemm_device_symbl7.c\ csr_spgemm_device_symbl8.c\ csr_spgemm_device_symbl9.c\ csr_spgemm_device_symbl10.c\ csr_spgemm_device_util.c\ csr_spmv_device.c\ csr_sptrans_device.c\ vector_device.c COBJS = ${FILES:.c=.o} CUOBJS = ${CUFILES:.c=.obj} OBJS = ${COBJS} ${CUOBJS} SONAME = libHYPRE_seq_mv-${HYPRE_RELEASE_VERSION}${HYPRE_LIB_SUFFIX} ################################################################## # Targets ################################################################## all: $(MAKE) autogen $(MAKE) lib lib: libHYPRE_seq_mv${HYPRE_LIB_SUFFIX} cp -fR $(srcdir)/HYPRE_*.h $(HYPRE_BUILD_DIR)/include cp -fR $(srcdir)/seq_mv.h $(HYPRE_BUILD_DIR)/include # cp -fR libHYPRE* $(HYPRE_BUILD_DIR)/lib install: libHYPRE_seq_mv${HYPRE_LIB_SUFFIX} cp -fR $(srcdir)/HYPRE_*.h $(HYPRE_INC_INSTALL) cp -fR $(srcdir)/seq_mv.h $(HYPRE_INC_INSTALL) # cp -fR libHYPRE* $(HYPRE_LIB_INSTALL) clean: deleteautogen rm -f *.o *.obj libHYPRE* rm -rf pchdir tca.map *inslog* distclean: clean autogen: @for number in 1 2 3 4 5 6 7 8 9 10; do \ fn=csr_spgemm_device_numer$$number.c; \ if [ ! -f $$fn ]; then \ echo "#define HYPRE_SPGEMM_BIN $$number" > $$fn; \ cat csr_spgemm_device_numer.in >> $$fn; \ fi \ done @for number in 1 2 3 4 5 6 7 8 9 10; do \ fn=csr_spgemm_device_symbl$$number.c; \ if [ ! -f $$fn ]; then \ echo "#define HYPRE_SPGEMM_BIN $$number" > $$fn; \ cat csr_spgemm_device_symbl.in >> $$fn; \ fi \ done deleteautogen: rm -f csr_spgemm_device_numer[1-9].c rm -f csr_spgemm_device_numer10.c rm -f csr_spgemm_device_symbl[1-9].c rm -f csr_spgemm_device_symbl10.c ################################################################## # Rules ################################################################## libHYPRE_seq_mv.a: ${OBJS} @echo "Building $@ ... " ${AR} $@ ${OBJS} ${RANLIB} $@ libHYPRE_seq_mv.so libHYPRE_seq_mv.dylib: ${OBJS} @echo "Building $@ ... " ${BUILD_CC_SHARED} -o ${SONAME} ${OBJS} ${SHARED_SET_SONAME}${SONAME} ln -s -f ${SONAME} $@ ${OBJS}: ${HEADERS} hypre-2.33.0/src/seq_mv/csr_filter.c000066400000000000000000000036451477326011500173250ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * Methods for matrix truncation/filtering * *****************************************************************************/ #include "seq_mv.h" /*-------------------------------------------------------------------------- * hypre_CSRMatrixTruncateDiag * * Truncates the input matrix to its diagonal portion. *--------------------------------------------------------------------------*/ HYPRE_Int hypre_CSRMatrixTruncateDiag(hypre_CSRMatrix *A) { HYPRE_MemoryLocation memory_location = hypre_CSRMatrixMemoryLocation(A); HYPRE_Int num_rows = hypre_CSRMatrixNumRows(A); HYPRE_Complex *A_a; HYPRE_Int *A_i, *A_j; /* Extract diagonal */ A_a = hypre_TAlloc(HYPRE_Complex, num_rows, memory_location); hypre_CSRMatrixExtractDiagonal(A, A_a, 0); /* Free old matrix data */ hypre_TFree(hypre_CSRMatrixData(A), memory_location); hypre_TFree(hypre_CSRMatrixI(A), memory_location); hypre_TFree(hypre_CSRMatrixJ(A), memory_location); /* Update matrix sparsity pattern */ A_i = hypre_TAlloc(HYPRE_Int, num_rows + 1, memory_location); A_j = hypre_TAlloc(HYPRE_Int, num_rows, memory_location); hypre_IntSequence(memory_location, num_rows + 1, A_i); hypre_IntSequence(memory_location, num_rows, A_j); /* Update matrix pointers and number of nonzero entries */ hypre_CSRMatrixNumNonzeros(A) = num_rows; hypre_CSRMatrixI(A) = A_i; hypre_CSRMatrixJ(A) = A_j; hypre_CSRMatrixData(A) = A_a; return hypre_error_flag; } hypre-2.33.0/src/seq_mv/csr_matop.c000066400000000000000000001775461477326011500171740ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * Matrix operation functions for hypre_CSRMatrix class. * *****************************************************************************/ #include "seq_mv.h" #include "csr_matrix.h" /*-------------------------------------------------------------------------- * hypre_CSRMatrixAddFirstPass: * * Performs the first pass needed for Matrix/Matrix addition (C = A + B). * This function: * 1) Computes the row pointer of the resulting matrix C_i * 2) Allocates memory for the matrix C and returns it to the user * * Notes: 1) It can be used safely inside OpenMP parallel regions. * 2) firstrow, lastrow and marker are private variables. * 3) The remaining arguments are shared variables. * 4) twspace (thread workspace) must be allocated outside the * parallel region. * 5) The mapping arrays map_A2C and map_B2C are used when adding * off-diagonal matrices. They can be set to NULL pointer when * adding diagonal matrices. * 6) Assumes that the elements of C_i are initialized to zero. *--------------------------------------------------------------------------*/ HYPRE_Int hypre_CSRMatrixAddFirstPass( HYPRE_Int firstrow, HYPRE_Int lastrow, HYPRE_Int *twspace, HYPRE_Int *marker, HYPRE_Int *map_A2C, HYPRE_Int *map_B2C, hypre_CSRMatrix *A, hypre_CSRMatrix *B, HYPRE_Int nrows_C, HYPRE_Int nnzrows_C, HYPRE_Int ncols_C, HYPRE_Int *rownnz_C, HYPRE_MemoryLocation memory_location_C, HYPRE_Int *C_i, hypre_CSRMatrix **C_ptr ) { HYPRE_Int *A_i = hypre_CSRMatrixI(A); HYPRE_Int *A_j = hypre_CSRMatrixJ(A); HYPRE_Int *B_i = hypre_CSRMatrixI(B); HYPRE_Int *B_j = hypre_CSRMatrixJ(B); HYPRE_Int i, ia, ib, ic, iic, ii, i1; HYPRE_Int jcol, jj; HYPRE_Int num_threads = hypre_NumActiveThreads(); HYPRE_Int num_nonzeros; /* Initialize marker array */ for (i = 0; i < ncols_C; i++) { marker[i] = -1; } ii = hypre_GetThreadNum(); num_nonzeros = 0; for (ic = firstrow; ic < lastrow; ic++) { iic = rownnz_C ? rownnz_C[ic] : ic; if (map_A2C) { for (ia = A_i[iic]; ia < A_i[iic + 1]; ia++) { jcol = map_A2C[A_j[ia]]; marker[jcol] = iic; num_nonzeros++; } } else { for (ia = A_i[iic]; ia < A_i[iic + 1]; ia++) { jcol = A_j[ia]; marker[jcol] = iic; num_nonzeros++; } } if (map_B2C) { for (ib = B_i[iic]; ib < B_i[iic + 1]; ib++) { jcol = map_B2C[B_j[ib]]; if (marker[jcol] != iic) { marker[jcol] = iic; num_nonzeros++; } } } else { for (ib = B_i[iic]; ib < B_i[iic + 1]; ib++) { jcol = B_j[ib]; if (marker[jcol] != iic) { marker[jcol] = iic; num_nonzeros++; } } } C_i[iic + 1] = num_nonzeros; } twspace[ii] = num_nonzeros; #ifdef HYPRE_USING_OPENMP #pragma omp barrier #endif /* Correct C_i - phase 1 */ if (ii) { jj = twspace[0]; for (i1 = 1; i1 < ii; i1++) { jj += twspace[i1]; } for (ic = firstrow; ic < lastrow; ic++) { iic = rownnz_C ? rownnz_C[ic] : ic; C_i[iic + 1] += jj; } } else { num_nonzeros = 0; for (i1 = 0; i1 < num_threads; i1++) { num_nonzeros += twspace[i1]; } *C_ptr = hypre_CSRMatrixCreate(nrows_C, ncols_C, num_nonzeros); hypre_CSRMatrixI(*C_ptr) = C_i; hypre_CSRMatrixRownnz(*C_ptr) = rownnz_C; hypre_CSRMatrixNumRownnz(*C_ptr) = nnzrows_C; hypre_CSRMatrixInitialize_v2(*C_ptr, 0, memory_location_C); } /* Correct C_i - phase 2 */ if (rownnz_C != NULL) { #ifdef HYPRE_USING_OPENMP #pragma omp barrier #endif for (ic = firstrow; ic < (lastrow - 1); ic++) { for (iic = rownnz_C[ic] + 1; iic < rownnz_C[ic + 1]; iic++) { hypre_assert(C_i[iic + 1] == 0); C_i[iic + 1] = C_i[rownnz_C[ic] + 1]; } } if (ii < (num_threads - 1)) { for (iic = rownnz_C[lastrow - 1] + 1; iic < rownnz_C[lastrow]; iic++) { hypre_assert(C_i[iic + 1] == 0); C_i[iic + 1] = C_i[rownnz_C[lastrow - 1] + 1]; } } else { for (iic = rownnz_C[lastrow - 1] + 1; iic < nrows_C; iic++) { hypre_assert(C_i[iic + 1] == 0); C_i[iic + 1] = C_i[rownnz_C[lastrow - 1] + 1]; } } } #ifdef HYPRE_USING_OPENMP #pragma omp barrier #endif #ifdef HYPRE_DEBUG if (!ii) { for (i = 0; i < nrows_C; i++) { hypre_assert(C_i[i] <= C_i[i + 1]); hypre_assert(((A_i[i + 1] - A_i[i]) + (B_i[i + 1] - B_i[i])) >= (C_i[i + 1] - C_i[i])); hypre_assert((C_i[i + 1] - C_i[i]) >= (A_i[i + 1] - A_i[i])); hypre_assert((C_i[i + 1] - C_i[i]) >= (B_i[i + 1] - B_i[i])); } hypre_assert((C_i[nrows_C] - C_i[0]) == num_nonzeros); } #endif return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_CSRMatrixAddSecondPass: * * Performs the second pass needed for Matrix/Matrix addition (C = A + B). * This function computes C_j and C_data. * * Notes: see notes for hypre_CSRMatrixAddFirstPass *--------------------------------------------------------------------------*/ HYPRE_Int hypre_CSRMatrixAddSecondPass( HYPRE_Int firstrow, HYPRE_Int lastrow, HYPRE_Int *marker, HYPRE_Int *map_A2C, HYPRE_Int *map_B2C, HYPRE_Int *rownnz_C, HYPRE_Complex alpha, HYPRE_Complex beta, hypre_CSRMatrix *A, hypre_CSRMatrix *B, hypre_CSRMatrix *C ) { HYPRE_Int *A_i = hypre_CSRMatrixI(A); HYPRE_Int *A_j = hypre_CSRMatrixJ(A); HYPRE_Complex *A_data = hypre_CSRMatrixData(A); HYPRE_Int nnzs_A = hypre_CSRMatrixNumNonzeros(A); HYPRE_Int *B_i = hypre_CSRMatrixI(B); HYPRE_Int *B_j = hypre_CSRMatrixJ(B); HYPRE_Complex *B_data = hypre_CSRMatrixData(B); HYPRE_Int nnzs_B = hypre_CSRMatrixNumNonzeros(B); HYPRE_Int *C_i = hypre_CSRMatrixI(C); HYPRE_Int *C_j = hypre_CSRMatrixJ(C); HYPRE_Complex *C_data = hypre_CSRMatrixData(C); HYPRE_Int ncols_C = hypre_CSRMatrixNumCols(C); HYPRE_Int ia, ib, ic, iic; HYPRE_Int jcol, pos; hypre_assert(( map_A2C && map_B2C) || (!map_A2C && !map_B2C) || ( map_A2C && (nnzs_B == 0)) || ( map_B2C && (nnzs_A == 0))); /* Initialize marker vector */ for (ia = 0; ia < ncols_C; ia++) { marker[ia] = -1; } pos = C_i[rownnz_C ? rownnz_C[firstrow] : firstrow]; if ((map_A2C && map_B2C) || ( map_A2C && (nnzs_B == 0)) || ( map_B2C && (nnzs_A == 0))) { for (ic = firstrow; ic < lastrow; ic++) { iic = rownnz_C ? rownnz_C[ic] : ic; for (ia = A_i[iic]; ia < A_i[iic + 1]; ia++) { jcol = map_A2C[A_j[ia]]; C_j[pos] = jcol; C_data[pos] = alpha * A_data[ia]; marker[jcol] = pos; pos++; } for (ib = B_i[iic]; ib < B_i[iic + 1]; ib++) { jcol = map_B2C[B_j[ib]]; if (marker[jcol] < C_i[iic]) { C_j[pos] = jcol; C_data[pos] = beta * B_data[ib]; marker[jcol] = pos; pos++; } else { hypre_assert(C_j[marker[jcol]] == jcol); C_data[marker[jcol]] += beta * B_data[ib]; } } hypre_assert(pos == C_i[iic + 1]); } /* end for loop */ } else { for (ic = firstrow; ic < lastrow; ic++) { iic = rownnz_C ? rownnz_C[ic] : ic; for (ia = A_i[iic]; ia < A_i[iic + 1]; ia++) { jcol = A_j[ia]; C_j[pos] = jcol; C_data[pos] = alpha * A_data[ia]; marker[jcol] = pos; pos++; } for (ib = B_i[iic]; ib < B_i[iic + 1]; ib++) { jcol = B_j[ib]; if (marker[jcol] < C_i[iic]) { C_j[pos] = jcol; C_data[pos] = beta * B_data[ib]; marker[jcol] = pos; pos++; } else { hypre_assert(C_j[marker[jcol]] == jcol); C_data[marker[jcol]] += beta * B_data[ib]; } } hypre_assert(pos == C_i[iic + 1]); } /* end for loop */ } hypre_assert(pos == C_i[rownnz_C ? rownnz_C[lastrow - 1] + 1 : lastrow]); return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_CSRMatrixAdd: * * Adds two CSR Matrices A and B and returns a CSR Matrix C = alpha*A + beta*B; * * Note: The routine does not check for 0-elements which might be generated * through cancellation of elements in A and B or already contained * in A and B. To remove those, use hypre_CSRMatrixDeleteZeros *--------------------------------------------------------------------------*/ hypre_CSRMatrix* hypre_CSRMatrixAddHost ( HYPRE_Complex alpha, hypre_CSRMatrix *A, HYPRE_Complex beta, hypre_CSRMatrix *B ) { /* CSRMatrix A */ HYPRE_Int *rownnz_A = hypre_CSRMatrixRownnz(A); HYPRE_Int nrows_A = hypre_CSRMatrixNumRows(A); HYPRE_Int nnzrows_A = hypre_CSRMatrixNumRownnz(A); HYPRE_Int ncols_A = hypre_CSRMatrixNumCols(A); /* CSRMatrix B */ HYPRE_Int *rownnz_B = hypre_CSRMatrixRownnz(B); HYPRE_Int nrows_B = hypre_CSRMatrixNumRows(B); HYPRE_Int nnzrows_B = hypre_CSRMatrixNumRownnz(B); HYPRE_Int ncols_B = hypre_CSRMatrixNumCols(B); /* CSRMatrix C */ hypre_CSRMatrix *C; HYPRE_Int *C_i; HYPRE_Int *rownnz_C; HYPRE_Int nnzrows_C; HYPRE_Int *twspace; HYPRE_MemoryLocation memory_location_A = hypre_CSRMatrixMemoryLocation(A); HYPRE_MemoryLocation memory_location_B = hypre_CSRMatrixMemoryLocation(B); /* RL: TODO cannot guarantee, maybe should never assert hypre_assert(memory_location_A == memory_location_B); */ /* RL: in the case of A=H, B=D, or A=D, B=H, let C = D, * not sure if this is the right thing to do. * Also, need something like this in other places * TODO */ HYPRE_MemoryLocation memory_location_C = hypre_max(memory_location_A, memory_location_B); if (nrows_A != nrows_B || ncols_A != ncols_B) { hypre_error_w_msg(HYPRE_ERROR_GENERIC, "Warning! incompatible matrix dimensions!\n"); return NULL; } /* Allocate memory */ twspace = hypre_TAlloc(HYPRE_Int, hypre_NumThreads(), HYPRE_MEMORY_HOST); C_i = hypre_CTAlloc(HYPRE_Int, nrows_A + 1, memory_location_C); /* Set nonzero rows data of diag_C */ nnzrows_C = nrows_A; if ((nnzrows_A < nrows_A) && (nnzrows_B < nrows_B)) { hypre_IntArray arr_A; hypre_IntArray arr_B; hypre_IntArray arr_C; hypre_IntArrayData(&arr_A) = rownnz_A; hypre_IntArrayData(&arr_B) = rownnz_B; hypre_IntArraySize(&arr_A) = nnzrows_A; hypre_IntArraySize(&arr_B) = nnzrows_B; hypre_IntArrayMemoryLocation(&arr_C) = memory_location_C; hypre_IntArrayMergeOrdered(&arr_A, &arr_B, &arr_C); nnzrows_C = hypre_IntArraySize(&arr_C); rownnz_C = hypre_IntArrayData(&arr_C); } else { rownnz_C = NULL; } #ifdef HYPRE_USING_OPENMP #pragma omp parallel #endif { HYPRE_Int ns, ne; HYPRE_Int *marker = NULL; hypre_partition1D(nnzrows_C, hypre_NumActiveThreads(), hypre_GetThreadNum(), &ns, &ne); marker = hypre_CTAlloc(HYPRE_Int, ncols_A, HYPRE_MEMORY_HOST); hypre_CSRMatrixAddFirstPass(ns, ne, twspace, marker, NULL, NULL, A, B, nrows_A, nnzrows_C, ncols_A, rownnz_C, memory_location_C, C_i, &C); hypre_CSRMatrixAddSecondPass(ns, ne, marker, NULL, NULL, rownnz_C, alpha, beta, A, B, C); hypre_TFree(marker, HYPRE_MEMORY_HOST); } /* end of parallel region */ /* Free memory */ hypre_TFree(twspace, HYPRE_MEMORY_HOST); return C; } hypre_CSRMatrix* hypre_CSRMatrixAdd( HYPRE_Complex alpha, hypre_CSRMatrix *A, HYPRE_Complex beta, hypre_CSRMatrix *B) { hypre_CSRMatrix *C = NULL; #if defined(HYPRE_USING_CUDA) || defined(HYPRE_USING_HIP) HYPRE_ExecutionPolicy exec = hypre_GetExecPolicy2( hypre_CSRMatrixMemoryLocation(A), hypre_CSRMatrixMemoryLocation(B) ); if (exec == HYPRE_EXEC_DEVICE) { C = hypre_CSRMatrixAddDevice(alpha, A, beta, B); } else #endif { C = hypre_CSRMatrixAddHost(alpha, A, beta, B); } return C; } #if 0 /*-------------------------------------------------------------------------- * hypre_CSRMatrixBigAdd: * * RL: comment it out which was used in ams.c. Should be combined with * above hypre_CSRMatrixAddHost whenever it is needed again * * Adds two CSR Matrices A and B with column indices stored as HYPRE_BigInt * and returns a CSR Matrix C; * * Note: The routine does not check for 0-elements which might be generated * through cancellation of elements in A and B or already contained * in A and B. To remove those, use hypre_CSRMatrixDeleteZeros *--------------------------------------------------------------------------*/ hypre_CSRMatrix * hypre_CSRMatrixBigAdd( hypre_CSRMatrix *A, hypre_CSRMatrix *B ) { HYPRE_Complex *A_data = hypre_CSRMatrixData(A); HYPRE_Int *A_i = hypre_CSRMatrixI(A); HYPRE_BigInt *A_j = hypre_CSRMatrixBigJ(A); HYPRE_Int nrows_A = hypre_CSRMatrixNumRows(A); HYPRE_Int ncols_A = hypre_CSRMatrixNumCols(A); HYPRE_Complex *B_data = hypre_CSRMatrixData(B); HYPRE_Int *B_i = hypre_CSRMatrixI(B); HYPRE_BigInt *B_j = hypre_CSRMatrixBigJ(B); HYPRE_Int nrows_B = hypre_CSRMatrixNumRows(B); HYPRE_Int ncols_B = hypre_CSRMatrixNumCols(B); hypre_CSRMatrix *C; HYPRE_Complex *C_data; HYPRE_Int *C_i; HYPRE_BigInt *C_j; HYPRE_Int *twspace; HYPRE_MemoryLocation memory_location_A = hypre_CSRMatrixMemoryLocation(A); HYPRE_MemoryLocation memory_location_B = hypre_CSRMatrixMemoryLocation(B); /* RL: TODO cannot guarantee, maybe should never assert hypre_assert(memory_location_A == memory_location_B); */ /* RL: in the case of A=H, B=D, or A=D, B=H, let C = D, * not sure if this is the right thing to do. * Also, need something like this in other places * TODO */ HYPRE_MemoryLocation memory_location_C = hypre_max(memory_location_A, memory_location_B); if (nrows_A != nrows_B || ncols_A != ncols_B) { hypre_error_w_msg(HYPRE_ERROR_GENERIC, "Warning! incompatible matrix dimensions!\n"); return NULL; } /* Allocate memory */ twspace = hypre_TAlloc(HYPRE_Int, hypre_NumThreads(), HYPRE_MEMORY_HOST); C_i = hypre_CTAlloc(HYPRE_Int, nrows_A + 1, memory_location_C); #ifdef HYPRE_USING_OPENMP #pragma omp parallel #endif { HYPRE_Int ia, ib, ic, num_nonzeros; HYPRE_Int ns, ne, pos; HYPRE_BigInt jcol; HYPRE_Int ii, num_threads; HYPRE_Int jj; HYPRE_Int *marker = NULL; ii = hypre_GetThreadNum(); num_threads = hypre_NumActiveThreads(); hypre_partition1D(nrows_A, num_threads, ii, &ns, &ne); marker = hypre_CTAlloc(HYPRE_Int, ncols_A, HYPRE_MEMORY_HOST); for (ia = 0; ia < ncols_A; ia++) { marker[ia] = -1; } /* First pass */ num_nonzeros = 0; for (ic = ns; ic < ne; ic++) { C_i[ic] = num_nonzeros; for (ia = A_i[ic]; ia < A_i[ic + 1]; ia++) { jcol = A_j[ia]; marker[jcol] = ic; num_nonzeros++; } for (ib = B_i[ic]; ib < B_i[ic + 1]; ib++) { jcol = B_j[ib]; if (marker[jcol] != ic) { marker[jcol] = ic; num_nonzeros++; } } C_i[ic + 1] = num_nonzeros; } twspace[ii] = num_nonzeros; #ifdef HYPRE_USING_OPENMP #pragma omp barrier #endif /* Correct row pointer */ if (ii) { jj = twspace[0]; for (ic = 1; ic < ii; ic++) { jj += twspace[ia]; } for (ic = ns; ic < ne; ic++) { C_i[ic] += jj; } } else { C_i[nrows_A] = 0; for (ic = 0; ic < num_threads; ic++) { C_i[nrows_A] += twspace[ic]; } C = hypre_CSRMatrixCreate(nrows_A, ncols_A, C_i[nrows_A]); hypre_CSRMatrixI(C) = C_i; hypre_CSRMatrixInitialize_v2(C, 1, memory_location_C); C_j = hypre_CSRMatrixBigJ(C); C_data = hypre_CSRMatrixData(C); } /* Second pass */ for (ia = 0; ia < ncols_A; ia++) { marker[ia] = -1; } pos = C_i[ns]; for (ic = ns; ic < ne; ic++) { for (ia = A_i[ic]; ia < A_i[ic + 1]; ia++) { jcol = A_j[ia]; C_j[pos] = jcol; C_data[pos] = A_data[ia]; marker[jcol] = pos; pos++; } for (ib = B_i[ic]; ib < B_i[ic + 1]; ib++) { jcol = B_j[ib]; if (marker[jcol] < C_i[ic]) { C_j[pos] = jcol; C_data[pos] = B_data[ib]; marker[jcol] = pos; pos++; } else { C_data[marker[jcol]] += B_data[ib]; } } } hypre_TFree(marker, HYPRE_MEMORY_HOST); } /* end of parallel region */ /* Free memory */ hypre_TFree(twspace, HYPRE_MEMORY_HOST); return C; } #endif /*-------------------------------------------------------------------------- * hypre_CSRMatrixMultiplyHost * * Multiplies two CSR Matrices A and B and returns a CSR Matrix C; * * Note: The routine does not check for 0-elements which might be generated * through cancellation of elements in A and B or already contained * in A and B. To remove those, use hypre_CSRMatrixDeleteZeros *--------------------------------------------------------------------------*/ hypre_CSRMatrix* hypre_CSRMatrixMultiplyHost( hypre_CSRMatrix *A, hypre_CSRMatrix *B ) { HYPRE_Complex *A_data = hypre_CSRMatrixData(A); HYPRE_Int *A_i = hypre_CSRMatrixI(A); HYPRE_Int *A_j = hypre_CSRMatrixJ(A); HYPRE_Int *rownnz_A = hypre_CSRMatrixRownnz(A); HYPRE_Int nrows_A = hypre_CSRMatrixNumRows(A); HYPRE_Int ncols_A = hypre_CSRMatrixNumCols(A); HYPRE_Int nnzrows_A = hypre_CSRMatrixNumRownnz(A); HYPRE_Int num_nnz_A = hypre_CSRMatrixNumNonzeros(A); HYPRE_Complex *B_data = hypre_CSRMatrixData(B); HYPRE_Int *B_i = hypre_CSRMatrixI(B); HYPRE_Int *B_j = hypre_CSRMatrixJ(B); HYPRE_Int nrows_B = hypre_CSRMatrixNumRows(B); HYPRE_Int ncols_B = hypre_CSRMatrixNumCols(B); HYPRE_Int num_nnz_B = hypre_CSRMatrixNumNonzeros(B); HYPRE_MemoryLocation memory_location_A = hypre_CSRMatrixMemoryLocation(A); HYPRE_MemoryLocation memory_location_B = hypre_CSRMatrixMemoryLocation(B); hypre_CSRMatrix *C; HYPRE_Complex *C_data; HYPRE_Int *C_i; HYPRE_Int *C_j; HYPRE_Int ia, ib, ic, ja, jb, num_nonzeros; HYPRE_Int counter; HYPRE_Complex a_entry, b_entry; HYPRE_Int allsquare = 0; HYPRE_Int *twspace; /* RL: TODO cannot guarantee, maybe should never assert hypre_assert(memory_location_A == memory_location_B); */ /* RL: in the case of A=H, B=D, or A=D, B=H, let C = D, * not sure if this is the right thing to do. * Also, need something like this in other places * TODO */ HYPRE_MemoryLocation memory_location_C = hypre_max(memory_location_A, memory_location_B); if (ncols_A != nrows_B) { hypre_error_w_msg(HYPRE_ERROR_GENERIC, "Warning! incompatible matrix dimensions!\n"); return NULL; } if (nrows_A == ncols_B) { allsquare = 1; } if ((num_nnz_A == 0) || (num_nnz_B == 0)) { C = hypre_CSRMatrixCreate(nrows_A, ncols_B, 0); hypre_CSRMatrixNumRownnz(C) = 0; hypre_CSRMatrixInitialize_v2(C, 0, memory_location_C); return C; } /* Allocate memory */ twspace = hypre_TAlloc(HYPRE_Int, hypre_NumThreads(), HYPRE_MEMORY_HOST); C_i = hypre_CTAlloc(HYPRE_Int, nrows_A + 1, memory_location_C); #ifdef HYPRE_USING_OPENMP #pragma omp parallel private(ia, ib, ic, ja, jb, num_nonzeros, counter, a_entry, b_entry) #endif { HYPRE_Int *B_marker = NULL; HYPRE_Int ns, ne, ii, jj; HYPRE_Int num_threads; HYPRE_Int i1, iic; ii = hypre_GetThreadNum(); num_threads = hypre_NumActiveThreads(); hypre_partition1D(nnzrows_A, num_threads, ii, &ns, &ne); B_marker = hypre_CTAlloc(HYPRE_Int, ncols_B, HYPRE_MEMORY_HOST); for (ib = 0; ib < ncols_B; ib++) { B_marker[ib] = -1; } HYPRE_ANNOTATE_REGION_BEGIN("%s", "First pass"); /* First pass: compute sizes of C rows. */ num_nonzeros = 0; for (ic = ns; ic < ne; ic++) { if (rownnz_A) { iic = rownnz_A[ic]; C_i[iic] = num_nonzeros; } else { iic = ic; C_i[iic] = num_nonzeros; if (allsquare) { B_marker[iic] = iic; num_nonzeros++; } } for (ia = A_i[iic]; ia < A_i[iic + 1]; ia++) { ja = A_j[ia]; for (ib = B_i[ja]; ib < B_i[ja + 1]; ib++) { jb = B_j[ib]; if (B_marker[jb] != iic) { B_marker[jb] = iic; num_nonzeros++; } } } } twspace[ii] = num_nonzeros; #ifdef HYPRE_USING_OPENMP #pragma omp barrier #endif /* Correct C_i - phase 1 */ if (ii) { jj = twspace[0]; for (i1 = 1; i1 < ii; i1++) { jj += twspace[i1]; } for (i1 = ns; i1 < ne; i1++) { iic = rownnz_A ? rownnz_A[i1] : i1; C_i[iic] += jj; } } else { C_i[nrows_A] = 0; for (i1 = 0; i1 < num_threads; i1++) { C_i[nrows_A] += twspace[i1]; } C = hypre_CSRMatrixCreate(nrows_A, ncols_B, C_i[nrows_A]); hypre_CSRMatrixI(C) = C_i; hypre_CSRMatrixInitialize_v2(C, 0, memory_location_C); C_j = hypre_CSRMatrixJ(C); C_data = hypre_CSRMatrixData(C); } /* Correct C_i - phase 2 */ if (rownnz_A != NULL) { #ifdef HYPRE_USING_OPENMP #pragma omp barrier #endif for (ic = ns; ic < (ne - 1); ic++) { for (iic = rownnz_A[ic] + 1; iic < rownnz_A[ic + 1]; iic++) { C_i[iic] = C_i[rownnz_A[ic + 1]]; } } if (ii < (num_threads - 1)) { for (iic = rownnz_A[ne - 1] + 1; iic < rownnz_A[ne]; iic++) { C_i[iic] = C_i[rownnz_A[ne]]; } } else { for (iic = rownnz_A[ne - 1] + 1; iic < nrows_A; iic++) { C_i[iic] = C_i[nrows_A]; } } } /* End of First Pass */ HYPRE_ANNOTATE_REGION_END("%s", "First pass"); #ifdef HYPRE_USING_OPENMP #pragma omp barrier #endif /* Second pass: Fill in C_data and C_j. */ HYPRE_ANNOTATE_REGION_BEGIN("%s", "Second pass"); for (ib = 0; ib < ncols_B; ib++) { B_marker[ib] = -1; } counter = rownnz_A ? C_i[rownnz_A[ns]] : C_i[ns]; for (ic = ns; ic < ne; ic++) { if (rownnz_A) { iic = rownnz_A[ic]; } else { iic = ic; if (allsquare) { B_marker[ic] = counter; C_data[counter] = 0; C_j[counter] = ic; counter++; } } for (ia = A_i[iic]; ia < A_i[iic + 1]; ia++) { ja = A_j[ia]; a_entry = A_data[ia]; for (ib = B_i[ja]; ib < B_i[ja + 1]; ib++) { jb = B_j[ib]; b_entry = B_data[ib]; if (B_marker[jb] < C_i[iic]) { B_marker[jb] = counter; C_j[B_marker[jb]] = jb; C_data[B_marker[jb]] = a_entry * b_entry; counter++; } else { C_data[B_marker[jb]] += a_entry * b_entry; } } } } HYPRE_ANNOTATE_REGION_END("%s", "Second pass"); /* End of Second Pass */ hypre_TFree(B_marker, HYPRE_MEMORY_HOST); } /*end parallel region */ #ifdef HYPRE_DEBUG for (ic = 0; ic < nrows_A; ic++) { hypre_assert(C_i[ic] <= C_i[ic + 1]); } #endif // Set rownnz and num_rownnz hypre_CSRMatrixSetRownnz(C); /* Free memory */ hypre_TFree(twspace, HYPRE_MEMORY_HOST); return C; } hypre_CSRMatrix* hypre_CSRMatrixMultiply( hypre_CSRMatrix *A, hypre_CSRMatrix *B) { hypre_CSRMatrix *C = NULL; #if defined(HYPRE_USING_GPU) HYPRE_ExecutionPolicy exec = hypre_GetExecPolicy2( hypre_CSRMatrixMemoryLocation(A), hypre_CSRMatrixMemoryLocation(B) ); if (exec == HYPRE_EXEC_DEVICE) { C = hypre_CSRMatrixMultiplyDevice(A, B); } else #endif { C = hypre_CSRMatrixMultiplyHost(A, B); } return C; } /*-------------------------------------------------------------------------- * hypre_CSRMatrixDeleteZeros *--------------------------------------------------------------------------*/ hypre_CSRMatrix * hypre_CSRMatrixDeleteZeros( hypre_CSRMatrix *A, HYPRE_Real tol ) { HYPRE_Complex *A_data = hypre_CSRMatrixData(A); HYPRE_Int *A_i = hypre_CSRMatrixI(A); HYPRE_Int *A_j = hypre_CSRMatrixJ(A); HYPRE_Int nrows_A = hypre_CSRMatrixNumRows(A); HYPRE_Int ncols_A = hypre_CSRMatrixNumCols(A); HYPRE_Int num_nonzeros = hypre_CSRMatrixNumNonzeros(A); hypre_CSRMatrix *B; HYPRE_Complex *B_data; HYPRE_Int *B_i; HYPRE_Int *B_j; HYPRE_Int zeros; HYPRE_Int i, j; HYPRE_Int pos_A, pos_B; zeros = 0; for (i = 0; i < num_nonzeros; i++) { if (hypre_cabs(A_data[i]) <= tol) { zeros++; } } if (zeros) { B = hypre_CSRMatrixCreate(nrows_A, ncols_A, num_nonzeros - zeros); hypre_CSRMatrixInitialize(B); B_i = hypre_CSRMatrixI(B); B_j = hypre_CSRMatrixJ(B); B_data = hypre_CSRMatrixData(B); B_i[0] = 0; pos_A = pos_B = 0; for (i = 0; i < nrows_A; i++) { for (j = A_i[i]; j < A_i[i + 1]; j++) { if (hypre_cabs(A_data[j]) <= tol) { pos_A++; } else { B_data[pos_B] = A_data[pos_A]; B_j[pos_B] = A_j[pos_A]; pos_B++; pos_A++; } } B_i[i + 1] = pos_B; } return B; } else { return NULL; } } /****************************************************************************** * * Finds transpose of a hypre_CSRMatrix * *****************************************************************************/ /** * idx = idx2*dim1 + idx1 * -> ret = idx1*dim2 + idx2 * = (idx%dim1)*dim2 + idx/dim1 */ static inline HYPRE_Int transpose_idx (HYPRE_Int idx, HYPRE_Int dim1, HYPRE_Int dim2) { return idx % dim1 * dim2 + idx / dim1; } /*-------------------------------------------------------------------------- * hypre_CSRMatrixTransposeHost *--------------------------------------------------------------------------*/ HYPRE_Int hypre_CSRMatrixTransposeHost(hypre_CSRMatrix *A, hypre_CSRMatrix **AT, HYPRE_Int data) { HYPRE_Complex *A_data = hypre_CSRMatrixData(A); HYPRE_Int *A_i = hypre_CSRMatrixI(A); HYPRE_Int *A_j = hypre_CSRMatrixJ(A); HYPRE_Int *rownnz_A = hypre_CSRMatrixRownnz(A); HYPRE_Int nnzrows_A = hypre_CSRMatrixNumRownnz(A); HYPRE_Int num_rows_A = hypre_CSRMatrixNumRows(A); HYPRE_Int num_cols_A = hypre_CSRMatrixNumCols(A); HYPRE_Int num_nnzs_A = hypre_CSRMatrixNumNonzeros(A); HYPRE_MemoryLocation memory_location = hypre_CSRMatrixMemoryLocation(A); HYPRE_Complex *AT_data = NULL; HYPRE_Int *AT_j; HYPRE_Int num_rows_AT; HYPRE_Int num_cols_AT; HYPRE_Int num_nnzs_AT; HYPRE_Int max_col; HYPRE_Int i, j; /*-------------------------------------------------------------- * First, ascertain that num_cols and num_nonzeros has been set. * If not, set them. *--------------------------------------------------------------*/ HYPRE_ANNOTATE_FUNC_BEGIN; if (!num_nnzs_A && A_i) { num_nnzs_A = A_i[num_rows_A]; } if (num_rows_A && num_nnzs_A && ! num_cols_A) { max_col = -1; for (i = 0; i < num_rows_A; ++i) { for (j = A_i[i]; j < A_i[i + 1]; j++) { if (A_j[j] > max_col) { max_col = A_j[j]; } } } num_cols_A = max_col + 1; } num_rows_AT = num_cols_A; num_cols_AT = num_rows_A; num_nnzs_AT = num_nnzs_A; *AT = hypre_CSRMatrixCreate(num_rows_AT, num_cols_AT, num_nnzs_AT); hypre_CSRMatrixMemoryLocation(*AT) = memory_location; if (num_cols_A == 0) { // JSP: parallel counting sorting breaks down // when A has no columns hypre_CSRMatrixInitialize(*AT); HYPRE_ANNOTATE_FUNC_END; return hypre_error_flag; } AT_j = hypre_CTAlloc(HYPRE_Int, num_nnzs_AT, memory_location); hypre_CSRMatrixJ(*AT) = AT_j; if (data) { AT_data = hypre_CTAlloc(HYPRE_Complex, num_nnzs_AT, memory_location); hypre_CSRMatrixData(*AT) = AT_data; } /*----------------------------------------------------------------- * Parallel count sort *-----------------------------------------------------------------*/ HYPRE_Int *bucket = hypre_CTAlloc(HYPRE_Int, (num_cols_A + 1) * hypre_NumThreads(), HYPRE_MEMORY_HOST); #ifdef HYPRE_USING_OPENMP #pragma omp parallel #endif { HYPRE_Int ii, num_threads, ns, ne; HYPRE_Int i, j, j0, j1, ir; HYPRE_Int idx, offset; HYPRE_Int transpose_i; HYPRE_Int transpose_i_minus_1; HYPRE_Int transpose_i0; HYPRE_Int transpose_j0; HYPRE_Int transpose_j1; ii = hypre_GetThreadNum(); num_threads = hypre_NumActiveThreads(); hypre_partition1D(nnzrows_A, num_threads, ii, &ns, &ne); /*----------------------------------------------------------------- * Count the number of entries that will go into each bucket * bucket is used as HYPRE_Int[num_threads][num_colsA] 2D array *-----------------------------------------------------------------*/ if (rownnz_A == NULL) { for (j = A_i[ns]; j < A_i[ne]; ++j) { bucket[ii * num_cols_A + A_j[j]]++; } } else { for (i = ns; i < ne; i++) { ir = rownnz_A[i]; for (j = A_i[ir]; j < A_i[ir + 1]; ++j) { bucket[ii * num_cols_A + A_j[j]]++; } } } /*----------------------------------------------------------------- * Parallel prefix sum of bucket with length num_colsA * num_threads * accessed as if it is transposed as HYPRE_Int[num_colsA][num_threads] *-----------------------------------------------------------------*/ #ifdef HYPRE_USING_OPENMP #pragma omp barrier #endif for (i = ii * num_cols_A + 1; i < (ii + 1)*num_cols_A; ++i) { transpose_i = transpose_idx(i, num_threads, num_cols_A); transpose_i_minus_1 = transpose_idx(i - 1, num_threads, num_cols_A); bucket[transpose_i] += bucket[transpose_i_minus_1]; } #ifdef HYPRE_USING_OPENMP #pragma omp barrier #pragma omp master #endif { for (i = 1; i < num_threads; ++i) { j0 = num_cols_A * i - 1; j1 = num_cols_A * (i + 1) - 1; transpose_j0 = transpose_idx(j0, num_threads, num_cols_A); transpose_j1 = transpose_idx(j1, num_threads, num_cols_A); bucket[transpose_j1] += bucket[transpose_j0]; } } #ifdef HYPRE_USING_OPENMP #pragma omp barrier #endif if (ii > 0) { transpose_i0 = transpose_idx(num_cols_A * ii - 1, num_threads, num_cols_A); offset = bucket[transpose_i0]; for (i = ii * num_cols_A; i < (ii + 1)*num_cols_A - 1; ++i) { transpose_i = transpose_idx(i, num_threads, num_cols_A); bucket[transpose_i] += offset; } } #ifdef HYPRE_USING_OPENMP #pragma omp barrier #endif /*---------------------------------------------------------------- * Load the data and column numbers of AT *----------------------------------------------------------------*/ if (data) { for (i = ne - 1; i >= ns; --i) { ir = rownnz_A ? rownnz_A[i] : i; for (j = A_i[ir + 1] - 1; j >= A_i[ir]; --j) { idx = A_j[j]; --bucket[ii * num_cols_A + idx]; offset = bucket[ii * num_cols_A + idx]; AT_data[offset] = A_data[j]; AT_j[offset] = ir; } } } else { for (i = ne - 1; i >= ns; --i) { ir = rownnz_A ? rownnz_A[i] : i; for (j = A_i[ir + 1] - 1; j >= A_i[ir]; --j) { idx = A_j[j]; --bucket[ii * num_cols_A + idx]; offset = bucket[ii * num_cols_A + idx]; AT_j[offset] = ir; } } } } /* end parallel region */ hypre_CSRMatrixI(*AT) = hypre_TAlloc(HYPRE_Int, num_cols_A + 1, memory_location); hypre_TMemcpy(hypre_CSRMatrixI(*AT), bucket, HYPRE_Int, num_cols_A + 1, memory_location, HYPRE_MEMORY_HOST); hypre_CSRMatrixI(*AT)[num_cols_A] = num_nnzs_A; hypre_TFree(bucket, HYPRE_MEMORY_HOST); // Set rownnz and num_rownnz if (hypre_CSRMatrixNumRownnz(A) < num_rows_A) { hypre_CSRMatrixSetRownnz(*AT); } HYPRE_ANNOTATE_FUNC_END; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_CSRMatrixTranspose *--------------------------------------------------------------------------*/ HYPRE_Int hypre_CSRMatrixTranspose(hypre_CSRMatrix *A, hypre_CSRMatrix **AT, HYPRE_Int data) { HYPRE_Int ierr = 0; #if defined(HYPRE_USING_GPU) HYPRE_ExecutionPolicy exec = hypre_GetExecPolicy1( hypre_CSRMatrixMemoryLocation(A) ); if (exec == HYPRE_EXEC_DEVICE) { ierr = hypre_CSRMatrixTransposeDevice(A, AT, data); } else #endif { ierr = hypre_CSRMatrixTransposeHost(A, AT, data); } hypre_CSRMatrixSetPatternOnly(*AT, hypre_CSRMatrixPatternOnly(A)); return ierr; } /*-------------------------------------------------------------------------- * hypre_CSRMatrixSplit *--------------------------------------------------------------------------*/ /* RL: TODO add memory locations */ HYPRE_Int hypre_CSRMatrixSplit(hypre_CSRMatrix *Bs_ext, HYPRE_BigInt first_col_diag_B, HYPRE_BigInt last_col_diag_B, HYPRE_Int num_cols_offd_B, HYPRE_BigInt *col_map_offd_B, HYPRE_Int *num_cols_offd_C_ptr, HYPRE_BigInt **col_map_offd_C_ptr, hypre_CSRMatrix **Bext_diag_ptr, hypre_CSRMatrix **Bext_offd_ptr) { HYPRE_Complex *Bs_ext_data = hypre_CSRMatrixData(Bs_ext); HYPRE_Int *Bs_ext_i = hypre_CSRMatrixI(Bs_ext); HYPRE_BigInt *Bs_ext_j = hypre_CSRMatrixBigJ(Bs_ext); HYPRE_Int num_rows_Bext = hypre_CSRMatrixNumRows(Bs_ext); HYPRE_Int B_ext_diag_size = 0; HYPRE_Int B_ext_offd_size = 0; HYPRE_Int *B_ext_diag_i = NULL; HYPRE_Int *B_ext_diag_j = NULL; HYPRE_Complex *B_ext_diag_data = NULL; HYPRE_Int *B_ext_offd_i = NULL; HYPRE_Int *B_ext_offd_j = NULL; HYPRE_BigInt *B_ext_offd_bigj = NULL; HYPRE_Complex *B_ext_offd_data = NULL; HYPRE_Int *my_diag_array; HYPRE_Int *my_offd_array; HYPRE_BigInt *temp = NULL; HYPRE_Int max_num_threads; HYPRE_Int cnt = 0; hypre_CSRMatrix *Bext_diag = NULL; hypre_CSRMatrix *Bext_offd = NULL; HYPRE_BigInt *col_map_offd_C = NULL; HYPRE_Int num_cols_offd_C = 0; B_ext_diag_i = hypre_CTAlloc(HYPRE_Int, num_rows_Bext + 1, HYPRE_MEMORY_HOST); B_ext_offd_i = hypre_CTAlloc(HYPRE_Int, num_rows_Bext + 1, HYPRE_MEMORY_HOST); max_num_threads = hypre_NumThreads(); my_diag_array = hypre_CTAlloc(HYPRE_Int, max_num_threads, HYPRE_MEMORY_HOST); my_offd_array = hypre_CTAlloc(HYPRE_Int, max_num_threads, HYPRE_MEMORY_HOST); #ifdef HYPRE_USING_OPENMP #pragma omp parallel #endif { HYPRE_Int ns, ne, ii, num_threads; HYPRE_Int i1, i, j; HYPRE_Int my_offd_size, my_diag_size; HYPRE_Int cnt_offd, cnt_diag; ii = hypre_GetThreadNum(); num_threads = hypre_NumActiveThreads(); hypre_partition1D(num_rows_Bext, num_threads, ii, &ns, &ne); my_diag_size = 0; my_offd_size = 0; for (i = ns; i < ne; i++) { B_ext_diag_i[i] = my_diag_size; B_ext_offd_i[i] = my_offd_size; for (j = Bs_ext_i[i]; j < Bs_ext_i[i + 1]; j++) { if (Bs_ext_j[j] < first_col_diag_B || Bs_ext_j[j] > last_col_diag_B) { my_offd_size++; } else { my_diag_size++; } } } my_diag_array[ii] = my_diag_size; my_offd_array[ii] = my_offd_size; #ifdef HYPRE_USING_OPENMP #pragma omp barrier #endif if (ii) { my_diag_size = my_diag_array[0]; my_offd_size = my_offd_array[0]; for (i1 = 1; i1 < ii; i1++) { my_diag_size += my_diag_array[i1]; my_offd_size += my_offd_array[i1]; } for (i1 = ns; i1 < ne; i1++) { B_ext_diag_i[i1] += my_diag_size; B_ext_offd_i[i1] += my_offd_size; } } else { B_ext_diag_size = 0; B_ext_offd_size = 0; for (i1 = 0; i1 < num_threads; i1++) { B_ext_diag_size += my_diag_array[i1]; B_ext_offd_size += my_offd_array[i1]; } B_ext_diag_i[num_rows_Bext] = B_ext_diag_size; B_ext_offd_i[num_rows_Bext] = B_ext_offd_size; B_ext_diag_j = hypre_CTAlloc(HYPRE_Int, B_ext_diag_size, HYPRE_MEMORY_HOST); B_ext_diag_data = hypre_CTAlloc(HYPRE_Complex, B_ext_diag_size, HYPRE_MEMORY_HOST); B_ext_offd_j = hypre_CTAlloc(HYPRE_Int, B_ext_offd_size, HYPRE_MEMORY_HOST); B_ext_offd_bigj = hypre_CTAlloc(HYPRE_BigInt, B_ext_offd_size, HYPRE_MEMORY_HOST); B_ext_offd_data = hypre_CTAlloc(HYPRE_Complex, B_ext_offd_size, HYPRE_MEMORY_HOST); if (B_ext_offd_size || num_cols_offd_B) { temp = hypre_CTAlloc(HYPRE_BigInt, B_ext_offd_size + num_cols_offd_B, HYPRE_MEMORY_HOST); } } #ifdef HYPRE_USING_OPENMP #pragma omp barrier #endif cnt_offd = B_ext_offd_i[ns]; cnt_diag = B_ext_diag_i[ns]; for (i = ns; i < ne; i++) { for (j = Bs_ext_i[i]; j < Bs_ext_i[i + 1]; j++) { if (Bs_ext_j[j] < first_col_diag_B || Bs_ext_j[j] > last_col_diag_B) { temp[cnt_offd] = Bs_ext_j[j]; B_ext_offd_bigj[cnt_offd] = Bs_ext_j[j]; B_ext_offd_data[cnt_offd++] = Bs_ext_data[j]; } else { B_ext_diag_j[cnt_diag] = (HYPRE_Int) (Bs_ext_j[j] - first_col_diag_B); B_ext_diag_data[cnt_diag++] = Bs_ext_data[j]; } } } /* This computes the mappings */ #ifdef HYPRE_USING_OPENMP #pragma omp barrier #endif if (ii == 0) { cnt = 0; if (B_ext_offd_size || num_cols_offd_B) { cnt = B_ext_offd_size; for (i = 0; i < num_cols_offd_B; i++) { temp[cnt++] = col_map_offd_B[i]; } if (cnt) { hypre_BigQsort0(temp, 0, cnt - 1); num_cols_offd_C = 1; HYPRE_BigInt value = temp[0]; for (i = 1; i < cnt; i++) { if (temp[i] > value) { value = temp[i]; temp[num_cols_offd_C++] = value; } } } if (num_cols_offd_C) { col_map_offd_C = hypre_CTAlloc(HYPRE_BigInt, num_cols_offd_C, HYPRE_MEMORY_HOST); } for (i = 0; i < num_cols_offd_C; i++) { col_map_offd_C[i] = temp[i]; } hypre_TFree(temp, HYPRE_MEMORY_HOST); } } #ifdef HYPRE_USING_OPENMP #pragma omp barrier #endif for (i = ns; i < ne; i++) { for (j = B_ext_offd_i[i]; j < B_ext_offd_i[i + 1]; j++) { B_ext_offd_j[j] = hypre_BigBinarySearch(col_map_offd_C, B_ext_offd_bigj[j], num_cols_offd_C); } } } /* end parallel region */ hypre_TFree(my_diag_array, HYPRE_MEMORY_HOST); hypre_TFree(my_offd_array, HYPRE_MEMORY_HOST); hypre_TFree(B_ext_offd_bigj, HYPRE_MEMORY_HOST); Bext_diag = hypre_CSRMatrixCreate(num_rows_Bext, (HYPRE_Int) (last_col_diag_B - first_col_diag_B + 1), B_ext_diag_size); hypre_CSRMatrixMemoryLocation(Bext_diag) = HYPRE_MEMORY_HOST; Bext_offd = hypre_CSRMatrixCreate(num_rows_Bext, num_cols_offd_C, B_ext_offd_size); hypre_CSRMatrixMemoryLocation(Bext_offd) = HYPRE_MEMORY_HOST; hypre_CSRMatrixI(Bext_diag) = B_ext_diag_i; hypre_CSRMatrixJ(Bext_diag) = B_ext_diag_j; hypre_CSRMatrixData(Bext_diag) = B_ext_diag_data; hypre_CSRMatrixI(Bext_offd) = B_ext_offd_i; hypre_CSRMatrixJ(Bext_offd) = B_ext_offd_j; hypre_CSRMatrixData(Bext_offd) = B_ext_offd_data; *col_map_offd_C_ptr = col_map_offd_C; *Bext_diag_ptr = Bext_diag; *Bext_offd_ptr = Bext_offd; *num_cols_offd_C_ptr = num_cols_offd_C; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_CSRMatrixReorderHost *--------------------------------------------------------------------------*/ HYPRE_Int hypre_CSRMatrixReorderHost(hypre_CSRMatrix *A) { HYPRE_Complex *A_data = hypre_CSRMatrixData(A); HYPRE_Int *A_i = hypre_CSRMatrixI(A); HYPRE_Int *A_j = hypre_CSRMatrixJ(A); HYPRE_Int *rownnz_A = hypre_CSRMatrixRownnz(A); HYPRE_Int nnzrows_A = hypre_CSRMatrixNumRownnz(A); HYPRE_Int num_rows_A = hypre_CSRMatrixNumRows(A); HYPRE_Int num_cols_A = hypre_CSRMatrixNumCols(A); HYPRE_Int i, ii, j; /* the matrix should be square */ if (num_rows_A != num_cols_A) { return -1; } #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i, ii, j) HYPRE_SMP_SCHEDULE #endif for (i = 0; i < nnzrows_A; i++) { ii = rownnz_A ? rownnz_A[i] : i; for (j = A_i[ii]; j < A_i[ii + 1]; j++) { if (A_j[j] == ii) { if (j != A_i[ii]) { hypre_swap(A_j, A_i[ii], j); hypre_swap_c(A_data, A_i[ii], j); } break; } } } return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_CSRMatrixReorder: * * Reorders the column and data arrays of a square CSR matrix, such that the * first entry in each row is the diagonal one. *--------------------------------------------------------------------------*/ HYPRE_Int hypre_CSRMatrixReorder(hypre_CSRMatrix *A) { HYPRE_Int ierr = 0; #if defined(HYPRE_USING_GPU) HYPRE_ExecutionPolicy exec = hypre_GetExecPolicy1( hypre_CSRMatrixMemoryLocation(A) ); if (exec == HYPRE_EXEC_DEVICE) { ierr = hypre_CSRMatrixMoveDiagFirstDevice(A); } else #endif { ierr = hypre_CSRMatrixReorderHost(A); } return ierr; } /*-------------------------------------------------------------------------- * hypre_CSRMatrixAddPartial: * adds matrix rows in the CSR matrix B to the CSR Matrix A, where row_nums[i] * defines to which row of A the i-th row of B is added, and returns a CSR Matrix C; * Note: The routine does not check for 0-elements which might be generated * through cancellation of elements in A and B or already contained * in A and B. To remove those, use hypre_CSRMatrixDeleteZeros *--------------------------------------------------------------------------*/ hypre_CSRMatrix * hypre_CSRMatrixAddPartial( hypre_CSRMatrix *A, hypre_CSRMatrix *B, HYPRE_Int *row_nums) { HYPRE_Complex *A_data = hypre_CSRMatrixData(A); HYPRE_Int *A_i = hypre_CSRMatrixI(A); HYPRE_Int *A_j = hypre_CSRMatrixJ(A); HYPRE_Int nrows_A = hypre_CSRMatrixNumRows(A); HYPRE_Int ncols_A = hypre_CSRMatrixNumCols(A); HYPRE_Complex *B_data = hypre_CSRMatrixData(B); HYPRE_Int *B_i = hypre_CSRMatrixI(B); HYPRE_Int *B_j = hypre_CSRMatrixJ(B); HYPRE_Int nrows_B = hypre_CSRMatrixNumRows(B); HYPRE_Int ncols_B = hypre_CSRMatrixNumCols(B); hypre_CSRMatrix *C; HYPRE_Complex *C_data; HYPRE_Int *C_i; HYPRE_Int *C_j; HYPRE_Int ia, ib, ic, jcol, num_nonzeros; HYPRE_Int pos, i, i2, j, cnt; HYPRE_Int *marker; HYPRE_Int *map; HYPRE_Int *temp; HYPRE_MemoryLocation memory_location_A = hypre_CSRMatrixMemoryLocation(A); HYPRE_MemoryLocation memory_location_B = hypre_CSRMatrixMemoryLocation(B); /* RL: TODO cannot guarantee, maybe should never assert hypre_assert(memory_location_A == memory_location_B); */ /* RL: in the case of A=H, B=D, or A=D, B=H, let C = D, * not sure if this is the right thing to do. * Also, need something like this in other places * TODO */ HYPRE_MemoryLocation memory_location_C = hypre_max(memory_location_A, memory_location_B); if (ncols_A != ncols_B) { hypre_error_w_msg(HYPRE_ERROR_GENERIC, "Warning! incompatible matrix dimensions!\n"); return NULL; } map = hypre_CTAlloc(HYPRE_Int, nrows_B, HYPRE_MEMORY_HOST); temp = hypre_CTAlloc(HYPRE_Int, nrows_B, HYPRE_MEMORY_HOST); for (i = 0; i < nrows_B; i++) { map[i] = i; temp[i] = row_nums[i]; } hypre_qsort2i(temp, map, 0, nrows_B - 1); marker = hypre_CTAlloc(HYPRE_Int, ncols_A, HYPRE_MEMORY_HOST); C_i = hypre_CTAlloc(HYPRE_Int, nrows_A + 1, memory_location_C); for (ia = 0; ia < ncols_A; ia++) { marker[ia] = -1; } num_nonzeros = 0; C_i[0] = 0; cnt = 0; for (ic = 0; ic < nrows_A; ic++) { for (ia = A_i[ic]; ia < A_i[ic + 1]; ia++) { jcol = A_j[ia]; marker[jcol] = ic; num_nonzeros++; } if (cnt < nrows_B && temp[cnt] == ic) { for (j = cnt; j < nrows_B; j++) { if (temp[j] == ic) { i2 = map[cnt++]; for (ib = B_i[i2]; ib < B_i[i2 + 1]; ib++) { jcol = B_j[ib]; if (marker[jcol] != ic) { marker[jcol] = ic; num_nonzeros++; } } } else { break; } } } C_i[ic + 1] = num_nonzeros; } C = hypre_CSRMatrixCreate(nrows_A, ncols_A, num_nonzeros); hypre_CSRMatrixI(C) = C_i; hypre_CSRMatrixInitialize_v2(C, 0, memory_location_C); C_j = hypre_CSRMatrixJ(C); C_data = hypre_CSRMatrixData(C); for (ia = 0; ia < ncols_A; ia++) { marker[ia] = -1; } cnt = 0; pos = 0; for (ic = 0; ic < nrows_A; ic++) { for (ia = A_i[ic]; ia < A_i[ic + 1]; ia++) { jcol = A_j[ia]; C_j[pos] = jcol; C_data[pos] = A_data[ia]; marker[jcol] = pos; pos++; } if (cnt < nrows_B && temp[cnt] == ic) { for (j = cnt; j < nrows_B; j++) { if (temp[j] == ic) { i2 = map[cnt++]; for (ib = B_i[i2]; ib < B_i[i2 + 1]; ib++) { jcol = B_j[ib]; if (marker[jcol] < C_i[ic]) { C_j[pos] = jcol; C_data[pos] = B_data[ib]; marker[jcol] = pos; pos++; } else { C_data[marker[jcol]] += B_data[ib]; } } } else { break; } } } } hypre_TFree(marker, HYPRE_MEMORY_HOST); hypre_TFree(map, HYPRE_MEMORY_HOST); hypre_TFree(temp, HYPRE_MEMORY_HOST); return C; } /*-------------------------------------------------------------------------- * hypre_CSRMatrixSumElts: * Returns the sum of all matrix elements. *--------------------------------------------------------------------------*/ HYPRE_Complex hypre_CSRMatrixSumElts( hypre_CSRMatrix *A ) { HYPRE_Complex sum = 0; HYPRE_Complex *data = hypre_CSRMatrixData(A); HYPRE_Int num_nonzeros = hypre_CSRMatrixNumNonzeros(A); HYPRE_Int i; #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i) reduction(+:sum) HYPRE_SMP_SCHEDULE #endif for (i = 0; i < num_nonzeros; i++) { sum += data[i]; } return sum; } /*-------------------------------------------------------------------------- * hypre_CSRMatrixFnorm *--------------------------------------------------------------------------*/ HYPRE_Real hypre_CSRMatrixFnorm( hypre_CSRMatrix *A ) { HYPRE_Int nrows = hypre_CSRMatrixNumRows(A); HYPRE_Int num_nonzeros = hypre_CSRMatrixNumNonzeros(A); HYPRE_Int *A_i = hypre_CSRMatrixI(A); HYPRE_Complex *A_data = hypre_CSRMatrixData(A); HYPRE_Int i; HYPRE_Complex sum = 0; hypre_assert(num_nonzeros == A_i[nrows]); #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i) reduction(+:sum) HYPRE_SMP_SCHEDULE #endif for (i = 0; i < num_nonzeros; ++i) { HYPRE_Complex v = A_data[i]; sum += v * v; } return hypre_sqrt(sum); } /*-------------------------------------------------------------------------- * hypre_CSRMatrixComputeRowSumHost * * type == 0, sum, * 1, abs sum * 2, square sum *--------------------------------------------------------------------------*/ void hypre_CSRMatrixComputeRowSumHost( hypre_CSRMatrix *A, HYPRE_Int *CF_i, HYPRE_Int *CF_j, HYPRE_Complex *row_sum, HYPRE_Int type, HYPRE_Complex scal, const char *set_or_add) { HYPRE_Int nrows = hypre_CSRMatrixNumRows(A); HYPRE_Complex *A_data = hypre_CSRMatrixData(A); HYPRE_Int *A_i = hypre_CSRMatrixI(A); HYPRE_Int *A_j = hypre_CSRMatrixJ(A); HYPRE_Int i, j; for (i = 0; i < nrows; i++) { HYPRE_Complex row_sum_i = set_or_add[0] == 's' ? 0.0 : row_sum[i]; for (j = A_i[i]; j < A_i[i + 1]; j++) { if (CF_i && CF_j && CF_i[i] != CF_j[A_j[j]]) { continue; } if (type == 0) { row_sum_i += scal * A_data[j]; } else if (type == 1) { row_sum_i += scal * hypre_cabs(A_data[j]); } else if (type == 2) { row_sum_i += scal * A_data[j] * A_data[j]; } } row_sum[i] = row_sum_i; } } /*-------------------------------------------------------------------------- * hypre_CSRMatrixComputeRowSum *--------------------------------------------------------------------------*/ void hypre_CSRMatrixComputeRowSum( hypre_CSRMatrix *A, HYPRE_Int *CF_i, HYPRE_Int *CF_j, HYPRE_Complex *row_sum, HYPRE_Int type, HYPRE_Complex scal, const char *set_or_add) { hypre_assert( (CF_i && CF_j) || (!CF_i && !CF_j) ); #if defined(HYPRE_USING_GPU) HYPRE_ExecutionPolicy exec = hypre_GetExecPolicy1( hypre_CSRMatrixMemoryLocation(A) ); if (exec == HYPRE_EXEC_DEVICE) { hypre_CSRMatrixComputeRowSumDevice(A, CF_i, CF_j, row_sum, type, scal, set_or_add); } else #endif { hypre_CSRMatrixComputeRowSumHost(A, CF_i, CF_j, row_sum, type, scal, set_or_add); } } /*-------------------------------------------------------------------------- * hypre_CSRMatrixExtractDiagonalHost * type 0: diag * 1: abs diag * 2: diag inverse * 3: diag inverse sqrt * 4: abs diag inverse sqrt *--------------------------------------------------------------------------*/ HYPRE_Int hypre_CSRMatrixExtractDiagonalHost( hypre_CSRMatrix *A, HYPRE_Complex *d, HYPRE_Int type) { HYPRE_Int nrows = hypre_CSRMatrixNumRows(A); HYPRE_Complex *A_data = hypre_CSRMatrixData(A); HYPRE_Int *A_i = hypre_CSRMatrixI(A); HYPRE_Int *A_j = hypre_CSRMatrixJ(A); HYPRE_Int i, j; HYPRE_Complex d_i; char msg[HYPRE_MAX_MSG_LEN]; for (i = 0; i < nrows; i++) { d_i = 0.0; for (j = A_i[i]; j < A_i[i + 1]; j++) { if (A_j[j] == i) { if (type == 0) { d_i = A_data[j]; } else if (type == 1) { d_i = hypre_cabs(A_data[j]); } else { if (A_data[j] == 0.0) { hypre_sprintf(msg, "Zero diagonal found at row %i!", i); hypre_error_w_msg(HYPRE_ERROR_GENERIC, msg); } else if (type == 2) { d_i = 1.0 / A_data[j]; } else if (type == 3) { d_i = 1.0 / hypre_sqrt(A_data[j]); } else if (type == 4) { d_i = 1.0 / hypre_sqrt(hypre_cabs(A_data[j])); } } break; } } d[i] = d_i; } return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_CSRMatrixExtractDiagonal * * type 0: diag * 1: abs diag * 2: diag inverse * 3: diag inverse sqrt *--------------------------------------------------------------------------*/ HYPRE_Int hypre_CSRMatrixExtractDiagonal( hypre_CSRMatrix *A, HYPRE_Complex *d, HYPRE_Int type) { #if defined(HYPRE_USING_GPU) HYPRE_ExecutionPolicy exec = hypre_GetExecPolicy1( hypre_CSRMatrixMemoryLocation(A) ); if (exec == HYPRE_EXEC_DEVICE) { hypre_CSRMatrixExtractDiagonalDevice(A, d, type); } else #endif { hypre_CSRMatrixExtractDiagonalHost(A, d, type); } return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_CSRMatrixScale * * Scales CSR matrix: A = scalar * A. *--------------------------------------------------------------------------*/ HYPRE_Int hypre_CSRMatrixScale( hypre_CSRMatrix *A, HYPRE_Complex scalar) { HYPRE_Complex *data = hypre_CSRMatrixData(A); HYPRE_Int i; HYPRE_Int k = hypre_CSRMatrixNumNonzeros(A); #if defined(HYPRE_USING_GPU) HYPRE_ExecutionPolicy exec = hypre_GetExecPolicy1( hypre_CSRMatrixMemoryLocation(A) ); if (exec == HYPRE_EXEC_DEVICE) { hypreDevice_ComplexScalen(data, k, data, scalar); } else #endif { for (i = 0; i < k; i++) { data[i] *= scalar; } } return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_CSRMatrixDiagScaleHost *--------------------------------------------------------------------------*/ HYPRE_Int hypre_CSRMatrixDiagScaleHost( hypre_CSRMatrix *A, hypre_Vector *ld, hypre_Vector *rd) { HYPRE_Int nrows = hypre_CSRMatrixNumRows(A); HYPRE_Complex *A_data = hypre_CSRMatrixData(A); HYPRE_Int *A_i = hypre_CSRMatrixI(A); HYPRE_Int *A_j = hypre_CSRMatrixJ(A); HYPRE_Complex *ldata = ld ? hypre_VectorData(ld) : NULL; HYPRE_Complex *rdata = rd ? hypre_VectorData(rd) : NULL; HYPRE_Int lsize = ld ? hypre_VectorSize(ld) : 0; HYPRE_Int rsize = rd ? hypre_VectorSize(rd) : 0; HYPRE_Int i, j; HYPRE_Complex sl; HYPRE_Complex sr; if (ldata && rdata) { #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i, j, sl, sr) HYPRE_SMP_SCHEDULE #endif for (i = 0; i < nrows; i++) { sl = ldata[i]; for (j = A_i[i]; j < A_i[i + 1]; j++) { sr = rdata[A_j[j]]; A_data[j] = sl * A_data[j] * sr; } } } else if (ldata && !rdata) { #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i, j, sl) HYPRE_SMP_SCHEDULE #endif for (i = 0; i < nrows; i++) { sl = ldata[i]; for (j = A_i[i]; j < A_i[i + 1]; j++) { A_data[j] = sl * A_data[j]; } } } else if (!ldata && rdata) { #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i, j, sr) HYPRE_SMP_SCHEDULE #endif for (i = 0; i < nrows; i++) { for (j = A_i[i]; j < A_i[i + 1]; j++) { sr = rdata[A_j[j]]; A_data[j] = A_data[j] * sr; } } } else { /* Throw an error if the scaling factors should have a size different than zero */ if (lsize || rsize) { hypre_error_w_msg(HYPRE_ERROR_GENERIC, "Scaling matrices are not set!\n"); } } return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_CSRMatrixDiagScale * * Computes A = diag(ld) * A * diag(rd), where the diagonal matrices * "diag(ld)" and "diag(rd)" are stored as local vectors. *--------------------------------------------------------------------------*/ HYPRE_Int hypre_CSRMatrixDiagScale( hypre_CSRMatrix *A, hypre_Vector *ld, hypre_Vector *rd) { /* Sanity checks */ if (ld && hypre_VectorSize(ld) && !hypre_VectorData(ld)) { hypre_error_w_msg(HYPRE_ERROR_GENERIC, "ld scaling coefficients are not set\n"); return hypre_error_flag; } if (rd && hypre_VectorSize(rd) && !hypre_VectorData(rd)) { hypre_error_w_msg(HYPRE_ERROR_GENERIC, "rd scaling coefficients are not set\n"); return hypre_error_flag; } if (!rd && !ld) { return hypre_error_flag; } #if defined(HYPRE_USING_GPU) HYPRE_ExecutionPolicy exec; if (ld && rd) { /* TODO (VPM): replace with GetExecPolicy3 */ exec = hypre_GetExecPolicy2(hypre_CSRMatrixMemoryLocation(A), hypre_VectorMemoryLocation(ld)); } else if (ld) { exec = hypre_GetExecPolicy2(hypre_CSRMatrixMemoryLocation(A), hypre_VectorMemoryLocation(ld)); } else { exec = hypre_GetExecPolicy2(hypre_CSRMatrixMemoryLocation(A), hypre_VectorMemoryLocation(rd)); } if (exec == HYPRE_EXEC_DEVICE) { hypre_CSRMatrixDiagScaleDevice(A, ld, rd); } else #endif { hypre_CSRMatrixDiagScaleHost(A, ld, rd); } return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_CSRMatrixSetConstantValues *--------------------------------------------------------------------------*/ HYPRE_Int hypre_CSRMatrixSetConstantValues( hypre_CSRMatrix *A, HYPRE_Complex value) { HYPRE_Int i; HYPRE_Int nnz = hypre_CSRMatrixNumNonzeros(A); if (!hypre_CSRMatrixData(A)) { hypre_CSRMatrixData(A) = hypre_TAlloc(HYPRE_Complex, nnz, hypre_CSRMatrixMemoryLocation(A)); } #if defined(HYPRE_USING_GPU) HYPRE_ExecutionPolicy exec = hypre_GetExecPolicy1( hypre_CSRMatrixMemoryLocation(A) ); if (exec == HYPRE_EXEC_DEVICE) { hypreDevice_ComplexFilln(hypre_CSRMatrixData(A), nnz, value); } else #endif { for (i = 0; i < nnz; i++) { hypre_CSRMatrixData(A)[i] = value; } } return hypre_error_flag; } hypre-2.33.0/src/seq_mv/csr_matop_device.c000066400000000000000000004223221477326011500204740ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * Matrix operation functions for hypre_CSRMatrix class. * *****************************************************************************/ #include "_hypre_onedpl.hpp" #include "seq_mv.h" #include "_hypre_utilities.hpp" #include "seq_mv.hpp" #if defined(HYPRE_USING_CUSPARSE) ||\ defined(HYPRE_USING_ROCSPARSE) ||\ defined(HYPRE_USING_ONEMKLSPARSE) /*-------------------------------------------------------------------------- * hypre_CsrsvDataCreate *--------------------------------------------------------------------------*/ hypre_CsrsvData* hypre_CsrsvDataCreate() { hypre_CsrsvData *data = hypre_CTAlloc(hypre_CsrsvData, 1, HYPRE_MEMORY_HOST); #if defined(HYPRE_USING_CUSPARSE) HYPRE_CUSPARSE_CALL( hypre_cusparseSpSV_createDescr(&hypre_CsrsvDataInfoL(data)) ); HYPRE_CUSPARSE_CALL( hypre_cusparseSpSV_createDescr(&hypre_CsrsvDataInfoU(data)) ); #elif defined(HYPRE_USING_ROCSPARSE) HYPRE_ROCSPARSE_CALL( rocsparse_create_mat_info(&(hypre_CsrsvDataInfoL(data)) ) ); HYPRE_ROCSPARSE_CALL( rocsparse_create_mat_info(&(hypre_CsrsvDataInfoU(data)) ) ); #endif hypre_CsrsvDataAnalyzedL(data) = 0; hypre_CsrsvDataAnalyzedU(data) = 0; return data; } /*-------------------------------------------------------------------------- * hypre_CsrsvDataDestroy *--------------------------------------------------------------------------*/ HYPRE_Int hypre_CsrsvDataDestroy(hypre_CsrsvData* data) { if (data) { #if !defined(HYPRE_USING_ONEMKLSPARSE) /* Lower matrix info */ if (hypre_CsrsvDataInfoL(data)) { #if defined(HYPRE_USING_CUSPARSE) HYPRE_CUSPARSE_CALL( hypre_cusparseSpSV_destroyDescr(hypre_CsrsvDataInfoL(data)) ); #elif defined(HYPRE_USING_ROCSPARSE) HYPRE_ROCSPARSE_CALL( rocsparse_destroy_mat_info(hypre_CsrsvDataInfoL(data)) ); #endif } /* Upper matrix info */ if (hypre_CsrsvDataInfoU(data)) { #if defined(HYPRE_USING_CUSPARSE) HYPRE_CUSPARSE_CALL( hypre_cusparseSpSV_destroyDescr(hypre_CsrsvDataInfoU(data)) ); #elif defined(HYPRE_USING_ROCSPARSE) HYPRE_ROCSPARSE_CALL( rocsparse_destroy_mat_info(hypre_CsrsvDataInfoU(data)) ); #endif } /* Buffers */ #if defined(HYPRE_USING_CUSPARSE) && (CUSPARSE_VERSION >= CUSPARSE_SPSV_VERSION) hypre_TFree(hypre_CsrsvDataBufferL(data), HYPRE_MEMORY_DEVICE); hypre_TFree(hypre_CsrsvDataBufferU(data), HYPRE_MEMORY_DEVICE); #else hypre_TFree(hypre_CsrsvDataBuffer(data), HYPRE_MEMORY_DEVICE); #endif #endif // #if !defined(HYPRE_USING_ONEMKLSPARSE) hypre_TFree(hypre_CsrsvDataMatData(data), HYPRE_MEMORY_DEVICE); /* Free data structure pointer */ hypre_TFree(data, HYPRE_MEMORY_HOST); } return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_GpuMatDataCreate *--------------------------------------------------------------------------*/ hypre_GpuMatData * hypre_GpuMatDataCreate() { hypre_GpuMatData *data = hypre_CTAlloc(hypre_GpuMatData, 1, HYPRE_MEMORY_HOST); #if defined(HYPRE_USING_CUSPARSE) cusparseMatDescr_t mat_descr; HYPRE_CUSPARSE_CALL( cusparseCreateMatDescr(&mat_descr) ); HYPRE_CUSPARSE_CALL( cusparseSetMatType(mat_descr, CUSPARSE_MATRIX_TYPE_GENERAL) ); HYPRE_CUSPARSE_CALL( cusparseSetMatIndexBase(mat_descr, CUSPARSE_INDEX_BASE_ZERO) ); hypre_GpuMatDataMatDescr(data) = mat_descr; #elif defined(HYPRE_USING_ROCSPARSE) rocsparse_mat_descr mat_descr; rocsparse_mat_info info; HYPRE_ROCSPARSE_CALL( rocsparse_create_mat_descr(&mat_descr) ); HYPRE_ROCSPARSE_CALL( rocsparse_set_mat_type(mat_descr, rocsparse_matrix_type_general) ); HYPRE_ROCSPARSE_CALL( rocsparse_set_mat_index_base(mat_descr, rocsparse_index_base_zero) ); HYPRE_ROCSPARSE_CALL( rocsparse_create_mat_info(&info) ); hypre_GpuMatDataMatDescr(data) = mat_descr; hypre_GpuMatDataMatInfo(data) = info; #elif defined(HYPRE_USING_ONEMKLSPARSE) oneapi::mkl::sparse::matrix_handle_t mat_handle; HYPRE_ONEMKL_CALL( oneapi::mkl::sparse::init_matrix_handle(&mat_handle) ); hypre_GpuMatDataMatHandle(data) = mat_handle; #endif return data; } /*-------------------------------------------------------------------------- * hypre_GPUMatDataSetCSRData *--------------------------------------------------------------------------*/ HYPRE_Int hypre_GPUMatDataSetCSRData(hypre_CSRMatrix *matrix) { #if defined(HYPRE_USING_ONEMKLSPARSE) #if defined(HYPRE_BIGINT) HYPRE_ONEMKL_CALL( oneapi::mkl::sparse::set_csr_data(*hypre_HandleComputeStream(hypre_handle()), hypre_CSRMatrixGPUMatHandle(matrix), hypre_CSRMatrixNumRows(matrix), hypre_CSRMatrixNumCols(matrix), oneapi::mkl::index_base::zero, reinterpret_cast(hypre_CSRMatrixI(matrix)), reinterpret_cast(hypre_CSRMatrixJ(matrix)), hypre_CSRMatrixData(matrix)) ); #else HYPRE_ONEMKL_CALL( oneapi::mkl::sparse::set_csr_data(*hypre_HandleComputeStream(hypre_handle()), hypre_CSRMatrixGPUMatHandle(matrix), hypre_CSRMatrixNumRows(matrix), hypre_CSRMatrixNumCols(matrix), oneapi::mkl::index_base::zero, hypre_CSRMatrixI(matrix), hypre_CSRMatrixJ(matrix), hypre_CSRMatrixData(matrix)) ); #endif #else HYPRE_UNUSED_VAR(matrix); #endif return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_GpuMatDataDestroy *--------------------------------------------------------------------------*/ HYPRE_Int hypre_GpuMatDataDestroy(hypre_GpuMatData *data) { if (data) { #if defined(HYPRE_USING_CUSPARSE) HYPRE_CUSPARSE_CALL( cusparseDestroyMatDescr(hypre_GpuMatDataMatDescr(data)) ); hypre_TFree(hypre_GpuMatDataSpMVBuffer(data), HYPRE_MEMORY_DEVICE); #elif defined(HYPRE_USING_ROCSPARSE) HYPRE_ROCSPARSE_CALL( rocsparse_destroy_mat_descr(hypre_GpuMatDataMatDescr(data)) ); HYPRE_ROCSPARSE_CALL( rocsparse_destroy_mat_info(hypre_GpuMatDataMatInfo(data)) ); #elif defined(HYPRE_USING_ONEMKLSPARSE) HYPRE_ONEMKL_CALL( oneapi::mkl::sparse::release_matrix_handle(*hypre_HandleComputeStream( hypre_handle()), &hypre_GpuMatDataMatHandle(data)) ); #endif } hypre_TFree(data, HYPRE_MEMORY_HOST); return hypre_error_flag; } #endif /* #if defined(HYPRE_USING_CUSPARSE) || defined(HYPRE_USING_ROCSPARSE) || defined(HYPRE_USING_ONEMKLSPARSE) */ #if defined(HYPRE_USING_GPU) /*-------------------------------------------------------------------------- * hypre_CSRMatrixAddDevice *--------------------------------------------------------------------------*/ hypre_CSRMatrix* hypre_CSRMatrixAddDevice( HYPRE_Complex alpha, hypre_CSRMatrix *A, HYPRE_Complex beta, hypre_CSRMatrix *B ) { HYPRE_Complex *A_data = hypre_CSRMatrixData(A); HYPRE_Int *A_i = hypre_CSRMatrixI(A); HYPRE_Int *A_j = hypre_CSRMatrixJ(A); HYPRE_Int nrows_A = hypre_CSRMatrixNumRows(A); HYPRE_Int ncols_A = hypre_CSRMatrixNumCols(A); HYPRE_Int nnz_A = hypre_CSRMatrixNumNonzeros(A); HYPRE_Complex *B_data = hypre_CSRMatrixData(B); HYPRE_Int *B_i = hypre_CSRMatrixI(B); HYPRE_Int *B_j = hypre_CSRMatrixJ(B); HYPRE_Int nrows_B = hypre_CSRMatrixNumRows(B); HYPRE_Int ncols_B = hypre_CSRMatrixNumCols(B); HYPRE_Int nnz_B = hypre_CSRMatrixNumNonzeros(B); HYPRE_Complex *C_data; HYPRE_Int *C_i; HYPRE_Int *C_j; HYPRE_Int nnzC; hypre_CSRMatrix *C; if (nrows_A != nrows_B || ncols_A != ncols_B) { hypre_error_w_msg(HYPRE_ERROR_GENERIC, "Warning! Incompatible matrix dimensions!\n"); return NULL; } hypreDevice_CSRSpAdd(nrows_A, nrows_B, nnz_A, nnz_B, A_i, A_j, alpha, A_data, NULL, B_i, B_j, beta, B_data, NULL, NULL, &nnzC, &C_i, &C_j, &C_data); C = hypre_CSRMatrixCreate(nrows_A, ncols_B, nnzC); hypre_CSRMatrixI(C) = C_i; hypre_CSRMatrixJ(C) = C_j; hypre_CSRMatrixData(C) = C_data; hypre_CSRMatrixMemoryLocation(C) = HYPRE_MEMORY_DEVICE; hypre_SyncComputeStream(); return C; } /*-------------------------------------------------------------------------- * hypre_CSRMatrixMultiplyDevice *--------------------------------------------------------------------------*/ hypre_CSRMatrix* hypre_CSRMatrixMultiplyDevice( hypre_CSRMatrix *A, hypre_CSRMatrix *B ) { HYPRE_Int ncols_A = hypre_CSRMatrixNumCols(A); HYPRE_Int nrows_B = hypre_CSRMatrixNumRows(B); hypre_CSRMatrix *C; if (ncols_A != nrows_B) { hypre_printf("Warning! incompatible matrix dimensions!\n"); hypre_error_w_msg(HYPRE_ERROR_GENERIC, "Warning! incompatible matrix dimensions!\n"); return NULL; } hypre_GpuProfilingPushRange("CSRMatrixMultiply"); hypreDevice_CSRSpGemm(A, B, &C); hypre_SyncComputeStream(); hypre_GpuProfilingPopRange(); return C; } /*-------------------------------------------------------------------------- * hypre_CSRMatrixTripleMultiplyDevice *--------------------------------------------------------------------------*/ hypre_CSRMatrix* hypre_CSRMatrixTripleMultiplyDevice ( hypre_CSRMatrix *A, hypre_CSRMatrix *B, hypre_CSRMatrix *C ) { hypre_CSRMatrix *BC = hypre_CSRMatrixMultiplyDevice(B, C); hypre_CSRMatrix *ABC = hypre_CSRMatrixMultiplyDevice(A, BC); hypre_CSRMatrixDestroy(BC); return ABC; } /*-------------------------------------------------------------------------- * hypre_CSRMatrixSplitDevice * * Split CSR matrix B_ext (extended rows of parcsr B) into diag part and * offd part corresponding to B. * * Input - col_map_offd_B: * Output - col_map_offd_C: union of col_map_offd_B and offd-indices of * Bext_offd * map_B_to_C: mapping from col_map_offd_B to col_map_offd_C *--------------------------------------------------------------------------*/ HYPRE_Int hypre_CSRMatrixSplitDevice( hypre_CSRMatrix *B_ext, HYPRE_BigInt first_col_diag_B, HYPRE_BigInt last_col_diag_B, HYPRE_Int num_cols_offd_B, HYPRE_BigInt *col_map_offd_B, HYPRE_Int **map_B_to_C_ptr, HYPRE_Int *num_cols_offd_C_ptr, HYPRE_BigInt **col_map_offd_C_ptr, hypre_CSRMatrix **B_ext_diag_ptr, hypre_CSRMatrix **B_ext_offd_ptr ) { HYPRE_Int num_rows = hypre_CSRMatrixNumRows(B_ext); HYPRE_Int B_ext_nnz = hypre_CSRMatrixNumNonzeros(B_ext); HYPRE_Int *B_ext_ii = hypre_TAlloc(HYPRE_Int, B_ext_nnz, HYPRE_MEMORY_DEVICE); hypreDevice_CsrRowPtrsToIndices_v2(num_rows, B_ext_nnz, hypre_CSRMatrixI(B_ext), B_ext_ii); HYPRE_Int B_ext_diag_nnz; HYPRE_Int B_ext_offd_nnz; HYPRE_Int ierr; ierr = hypre_CSRMatrixSplitDevice_core( 0, num_rows, B_ext_nnz, NULL, hypre_CSRMatrixBigJ(B_ext), NULL, NULL, first_col_diag_B, last_col_diag_B, num_cols_offd_B, NULL, NULL, NULL, NULL, &B_ext_diag_nnz, NULL, NULL, NULL, NULL, &B_ext_offd_nnz, NULL, NULL, NULL, NULL ); HYPRE_Int *B_ext_diag_ii = hypre_TAlloc(HYPRE_Int, B_ext_diag_nnz, HYPRE_MEMORY_DEVICE); HYPRE_Int *B_ext_diag_j = hypre_TAlloc(HYPRE_Int, B_ext_diag_nnz, HYPRE_MEMORY_DEVICE); HYPRE_Complex *B_ext_diag_a = hypre_TAlloc(HYPRE_Complex, B_ext_diag_nnz, HYPRE_MEMORY_DEVICE); HYPRE_Int *B_ext_offd_ii = hypre_TAlloc(HYPRE_Int, B_ext_offd_nnz, HYPRE_MEMORY_DEVICE); HYPRE_Int *B_ext_offd_j = hypre_TAlloc(HYPRE_Int, B_ext_offd_nnz, HYPRE_MEMORY_DEVICE); HYPRE_Complex *B_ext_offd_a = hypre_TAlloc(HYPRE_Complex, B_ext_offd_nnz, HYPRE_MEMORY_DEVICE); ierr = hypre_CSRMatrixSplitDevice_core( 1, num_rows, B_ext_nnz, B_ext_ii, hypre_CSRMatrixBigJ(B_ext), hypre_CSRMatrixData(B_ext), NULL, first_col_diag_B, last_col_diag_B, num_cols_offd_B, col_map_offd_B, map_B_to_C_ptr, num_cols_offd_C_ptr, col_map_offd_C_ptr, &B_ext_diag_nnz, B_ext_diag_ii, B_ext_diag_j, B_ext_diag_a, NULL, &B_ext_offd_nnz, B_ext_offd_ii, B_ext_offd_j, B_ext_offd_a, NULL ); hypre_TFree(B_ext_ii, HYPRE_MEMORY_DEVICE); /* convert to row ptrs */ HYPRE_Int *B_ext_diag_i = hypreDevice_CsrRowIndicesToPtrs(num_rows, B_ext_diag_nnz, B_ext_diag_ii); HYPRE_Int *B_ext_offd_i = hypreDevice_CsrRowIndicesToPtrs(num_rows, B_ext_offd_nnz, B_ext_offd_ii); hypre_TFree(B_ext_diag_ii, HYPRE_MEMORY_DEVICE); hypre_TFree(B_ext_offd_ii, HYPRE_MEMORY_DEVICE); /* create diag and offd CSR */ hypre_CSRMatrix *B_ext_diag = hypre_CSRMatrixCreate(num_rows, last_col_diag_B - first_col_diag_B + 1, B_ext_diag_nnz); hypre_CSRMatrix *B_ext_offd = hypre_CSRMatrixCreate(num_rows, *num_cols_offd_C_ptr, B_ext_offd_nnz); hypre_CSRMatrixI(B_ext_diag) = B_ext_diag_i; hypre_CSRMatrixJ(B_ext_diag) = B_ext_diag_j; hypre_CSRMatrixData(B_ext_diag) = B_ext_diag_a; hypre_CSRMatrixNumNonzeros(B_ext_diag) = B_ext_diag_nnz; hypre_CSRMatrixMemoryLocation(B_ext_diag) = HYPRE_MEMORY_DEVICE; hypre_CSRMatrixI(B_ext_offd) = B_ext_offd_i; hypre_CSRMatrixJ(B_ext_offd) = B_ext_offd_j; hypre_CSRMatrixData(B_ext_offd) = B_ext_offd_a; hypre_CSRMatrixNumNonzeros(B_ext_offd) = B_ext_offd_nnz; hypre_CSRMatrixMemoryLocation(B_ext_offd) = HYPRE_MEMORY_DEVICE; *B_ext_diag_ptr = B_ext_diag; *B_ext_offd_ptr = B_ext_offd; hypre_SyncComputeStream(); return ierr; } /*-------------------------------------------------------------------------- * hypre_CSRMatrixMergeColMapOffd *--------------------------------------------------------------------------*/ HYPRE_Int hypre_CSRMatrixMergeColMapOffd( HYPRE_Int num_cols_offd_B, HYPRE_BigInt *col_map_offd_B, HYPRE_Int B_ext_offd_nnz, HYPRE_BigInt *B_ext_offd_bigj, HYPRE_Int *num_cols_offd_C_ptr, HYPRE_BigInt **col_map_offd_C_ptr, HYPRE_Int **map_B_to_C_ptr ) { /* offd map of B_ext_offd Union col_map_offd_B */ HYPRE_BigInt *col_map_offd_C = hypre_TAlloc(HYPRE_BigInt, B_ext_offd_nnz + num_cols_offd_B, HYPRE_MEMORY_DEVICE); hypre_TMemcpy(col_map_offd_C, B_ext_offd_bigj, HYPRE_BigInt, B_ext_offd_nnz, HYPRE_MEMORY_DEVICE, HYPRE_MEMORY_DEVICE); hypre_TMemcpy(col_map_offd_C + B_ext_offd_nnz, col_map_offd_B, HYPRE_BigInt, num_cols_offd_B, HYPRE_MEMORY_DEVICE, HYPRE_MEMORY_DEVICE); #if defined(HYPRE_USING_SYCL) HYPRE_ONEDPL_CALL( std::sort, col_map_offd_C, col_map_offd_C + B_ext_offd_nnz + num_cols_offd_B ); HYPRE_BigInt *new_end = HYPRE_ONEDPL_CALL( std::unique, col_map_offd_C, col_map_offd_C + B_ext_offd_nnz + num_cols_offd_B ); #else HYPRE_THRUST_CALL( sort, col_map_offd_C, col_map_offd_C + B_ext_offd_nnz + num_cols_offd_B ); HYPRE_BigInt *new_end = HYPRE_THRUST_CALL( unique, col_map_offd_C, col_map_offd_C + B_ext_offd_nnz + num_cols_offd_B ); #endif HYPRE_Int num_cols_offd_C = new_end - col_map_offd_C; #if 1 HYPRE_BigInt *tmp = hypre_TAlloc(HYPRE_BigInt, num_cols_offd_C, HYPRE_MEMORY_DEVICE); hypre_TMemcpy(tmp, col_map_offd_C, HYPRE_BigInt, num_cols_offd_C, HYPRE_MEMORY_DEVICE, HYPRE_MEMORY_DEVICE); hypre_TFree(col_map_offd_C, HYPRE_MEMORY_DEVICE); col_map_offd_C = tmp; #else col_map_offd_C = hypre_TReAlloc_v2(col_map_offd_C, HYPRE_BigInt, B_ext_offd_nnz + num_cols_offd_B, HYPRE_Int, num_cols_offd_C, HYPRE_MEMORY_DEVICE); #endif /* create map from col_map_offd_B */ HYPRE_Int *map_B_to_C = hypre_TAlloc(HYPRE_Int, num_cols_offd_B, HYPRE_MEMORY_DEVICE); if (num_cols_offd_B) { #if defined(HYPRE_USING_SYCL) HYPRE_ONEDPL_CALL( oneapi::dpl::lower_bound, col_map_offd_C, col_map_offd_C + num_cols_offd_C, col_map_offd_B, col_map_offd_B + num_cols_offd_B, map_B_to_C ); #else HYPRE_THRUST_CALL( lower_bound, col_map_offd_C, col_map_offd_C + num_cols_offd_C, col_map_offd_B, col_map_offd_B + num_cols_offd_B, map_B_to_C ); #endif } *map_B_to_C_ptr = map_B_to_C; *num_cols_offd_C_ptr = num_cols_offd_C; *col_map_offd_C_ptr = col_map_offd_C; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_CSRMatrixSplitDevice_core * * job = 0: query B_ext_diag/offd_nnz; 1: real computation * * NOTES: * B_ext_ii: NOT row pointers of CSR but row indices of COO * B_ext_bigj: [BigInt] global column indices * B_ext_xata: companion data with B_ext_data; NULL if none * B_ext_diag_ii: memory allocated outside * B_ext_diag_xata: companion with B_ext_diag_data_ptr; NULL if none * B_ext_offd_ii: memory allocated outside * B_ext_offd_xata: companion with B_ext_offd_data_ptr; NULL if none *--------------------------------------------------------------------------*/ HYPRE_Int hypre_CSRMatrixSplitDevice_core( HYPRE_Int job, HYPRE_Int num_rows, HYPRE_Int B_ext_nnz, HYPRE_Int *B_ext_ii, HYPRE_BigInt *B_ext_bigj, HYPRE_Complex *B_ext_data, char *B_ext_xata, HYPRE_BigInt first_col_diag_B, HYPRE_BigInt last_col_diag_B, HYPRE_Int num_cols_offd_B, HYPRE_BigInt *col_map_offd_B, HYPRE_Int **map_B_to_C_ptr, HYPRE_Int *num_cols_offd_C_ptr, HYPRE_BigInt **col_map_offd_C_ptr, HYPRE_Int *B_ext_diag_nnz_ptr, HYPRE_Int *B_ext_diag_ii, HYPRE_Int *B_ext_diag_j, HYPRE_Complex *B_ext_diag_data, char *B_ext_diag_xata, HYPRE_Int *B_ext_offd_nnz_ptr, HYPRE_Int *B_ext_offd_ii, HYPRE_Int *B_ext_offd_j, HYPRE_Complex *B_ext_offd_data, char *B_ext_offd_xata ) { HYPRE_UNUSED_VAR(num_rows); HYPRE_Int B_ext_diag_nnz; HYPRE_Int B_ext_offd_nnz; HYPRE_BigInt *B_ext_diag_bigj = NULL; HYPRE_BigInt *B_ext_offd_bigj = NULL; HYPRE_BigInt *col_map_offd_C; HYPRE_Int *map_B_to_C = NULL; HYPRE_Int num_cols_offd_C; hypre_GpuProfilingPushRange("CSRMatrixSplitDevice_core"); in_range pred1(first_col_diag_B, last_col_diag_B); /* get diag and offd nnz */ if (job == 0) { /* query the nnz's */ #if defined(HYPRE_USING_SYCL) B_ext_diag_nnz = HYPRE_ONEDPL_CALL( std::count_if, B_ext_bigj, B_ext_bigj + B_ext_nnz, pred1 ); #else B_ext_diag_nnz = HYPRE_THRUST_CALL( count_if, B_ext_bigj, B_ext_bigj + B_ext_nnz, pred1 ); #endif B_ext_offd_nnz = B_ext_nnz - B_ext_diag_nnz; *B_ext_diag_nnz_ptr = B_ext_diag_nnz; *B_ext_offd_nnz_ptr = B_ext_offd_nnz; hypre_GpuProfilingPopRange(); return hypre_error_flag; } else { B_ext_diag_nnz = *B_ext_diag_nnz_ptr; B_ext_offd_nnz = *B_ext_offd_nnz_ptr; } /* copy to diag */ B_ext_diag_bigj = hypre_TAlloc(HYPRE_BigInt, B_ext_diag_nnz, HYPRE_MEMORY_DEVICE); if (B_ext_diag_xata) { #if defined(HYPRE_USING_SYCL) auto first = oneapi::dpl::make_zip_iterator(B_ext_ii, B_ext_bigj, B_ext_data, B_ext_xata); auto new_end = hypreSycl_copy_if( first, /* first */ first + B_ext_nnz, /* last */ B_ext_bigj, /* stencil */ oneapi::dpl::make_zip_iterator(B_ext_diag_ii, B_ext_diag_bigj, B_ext_diag_data, B_ext_diag_xata), /* result */ pred1 ); hypre_assert( std::get<0>(new_end.base()) == B_ext_diag_ii + B_ext_diag_nnz ); #else auto new_end = HYPRE_THRUST_CALL( copy_if, thrust::make_zip_iterator(thrust::make_tuple(B_ext_ii, B_ext_bigj, B_ext_data, B_ext_xata)), /* first */ thrust::make_zip_iterator(thrust::make_tuple(B_ext_ii, B_ext_bigj, B_ext_data, B_ext_xata)) + B_ext_nnz, /* last */ B_ext_bigj, /* stencil */ thrust::make_zip_iterator(thrust::make_tuple(B_ext_diag_ii, B_ext_diag_bigj, B_ext_diag_data, B_ext_diag_xata)), /* result */ pred1 ); hypre_assert( thrust::get<0>(new_end.get_iterator_tuple()) == B_ext_diag_ii + B_ext_diag_nnz ); #endif } else { #if defined(HYPRE_USING_SYCL) auto first = oneapi::dpl::make_zip_iterator(B_ext_ii, B_ext_bigj, B_ext_data); auto new_end = hypreSycl_copy_if( first, /* first */ first + B_ext_nnz, /* last */ B_ext_bigj, /* stencil */ oneapi::dpl::make_zip_iterator(B_ext_diag_ii, B_ext_diag_bigj, B_ext_diag_data), /* result */ pred1 ); hypre_assert( std::get<0>(new_end.base()) == B_ext_diag_ii + B_ext_diag_nnz ); #else auto new_end = HYPRE_THRUST_CALL( copy_if, thrust::make_zip_iterator(thrust::make_tuple(B_ext_ii, B_ext_bigj, B_ext_data)), /* first */ thrust::make_zip_iterator(thrust::make_tuple(B_ext_ii, B_ext_bigj, B_ext_data)) + B_ext_nnz, /* last */ B_ext_bigj, /* stencil */ thrust::make_zip_iterator(thrust::make_tuple(B_ext_diag_ii, B_ext_diag_bigj, B_ext_diag_data)), /* result */ pred1 ); hypre_assert( thrust::get<0>(new_end.get_iterator_tuple()) == B_ext_diag_ii + B_ext_diag_nnz ); #endif } #if defined(HYPRE_USING_SYCL) HYPRE_ONEDPL_CALL( std::transform, B_ext_diag_bigj, B_ext_diag_bigj + B_ext_diag_nnz, B_ext_diag_j, [const_val = first_col_diag_B](const auto & x) {return x - const_val;} ); #else HYPRE_THRUST_CALL( transform, B_ext_diag_bigj, B_ext_diag_bigj + B_ext_diag_nnz, thrust::make_constant_iterator(first_col_diag_B), B_ext_diag_j, thrust::minus()); #endif hypre_TFree(B_ext_diag_bigj, HYPRE_MEMORY_DEVICE); /* copy to offd */ B_ext_offd_bigj = hypre_TAlloc(HYPRE_BigInt, B_ext_offd_nnz, HYPRE_MEMORY_DEVICE); if (B_ext_offd_xata) { #if defined(HYPRE_USING_SYCL) auto first = oneapi::dpl::make_zip_iterator(B_ext_ii, B_ext_bigj, B_ext_data, B_ext_xata); auto new_end = hypreSycl_copy_if( first, /* first */ first + B_ext_nnz, /* last */ B_ext_bigj, /* stencil */ oneapi::dpl::make_zip_iterator(B_ext_offd_ii, B_ext_offd_bigj, B_ext_offd_data, B_ext_offd_xata), /* result */ std::not_fn(pred1) ); hypre_assert( std::get<0>(new_end.base()) == B_ext_offd_ii + B_ext_offd_nnz ); #else auto new_end = HYPRE_THRUST_CALL( copy_if, thrust::make_zip_iterator(thrust::make_tuple(B_ext_ii, B_ext_bigj, B_ext_data, B_ext_xata)), /* first */ thrust::make_zip_iterator(thrust::make_tuple(B_ext_ii, B_ext_bigj, B_ext_data, B_ext_xata)) + B_ext_nnz, /* last */ B_ext_bigj, /* stencil */ thrust::make_zip_iterator(thrust::make_tuple(B_ext_offd_ii, B_ext_offd_bigj, B_ext_offd_data, B_ext_offd_xata)), /* result */ HYPRE_THRUST_NOT(pred1) ); hypre_assert( thrust::get<0>(new_end.get_iterator_tuple()) == B_ext_offd_ii + B_ext_offd_nnz ); #endif } else { #if defined(HYPRE_USING_SYCL) auto first = oneapi::dpl::make_zip_iterator(B_ext_ii, B_ext_bigj, B_ext_data); auto new_end = hypreSycl_copy_if( first, /* first */ first + B_ext_nnz, /* last */ B_ext_bigj, /* stencil */ oneapi::dpl::make_zip_iterator(B_ext_offd_ii, B_ext_offd_bigj, B_ext_offd_data), /* result */ std::not_fn(pred1) ); hypre_assert( std::get<0>(new_end.base()) == B_ext_offd_ii + B_ext_offd_nnz ); #else auto new_end = HYPRE_THRUST_CALL( copy_if, thrust::make_zip_iterator(thrust::make_tuple(B_ext_ii, B_ext_bigj, B_ext_data)), /* first */ thrust::make_zip_iterator(thrust::make_tuple(B_ext_ii, B_ext_bigj, B_ext_data)) + B_ext_nnz, /* last */ B_ext_bigj, /* stencil */ thrust::make_zip_iterator(thrust::make_tuple(B_ext_offd_ii, B_ext_offd_bigj, B_ext_offd_data)), /* result */ HYPRE_THRUST_NOT(pred1) ); hypre_assert( thrust::get<0>(new_end.get_iterator_tuple()) == B_ext_offd_ii + B_ext_offd_nnz ); #endif } hypre_CSRMatrixMergeColMapOffd(num_cols_offd_B, col_map_offd_B, B_ext_offd_nnz, B_ext_offd_bigj, &num_cols_offd_C, &col_map_offd_C, &map_B_to_C); #if defined(HYPRE_USING_SYCL) if (num_cols_offd_C > 0 && B_ext_offd_nnz > 0) { HYPRE_ONEDPL_CALL( oneapi::dpl::lower_bound, col_map_offd_C, col_map_offd_C + num_cols_offd_C, B_ext_offd_bigj, B_ext_offd_bigj + B_ext_offd_nnz, B_ext_offd_j ); } #else HYPRE_THRUST_CALL( lower_bound, col_map_offd_C, col_map_offd_C + num_cols_offd_C, B_ext_offd_bigj, B_ext_offd_bigj + B_ext_offd_nnz, B_ext_offd_j ); #endif hypre_TFree(B_ext_offd_bigj, HYPRE_MEMORY_DEVICE); *map_B_to_C_ptr = map_B_to_C; *num_cols_offd_C_ptr = num_cols_offd_C; *col_map_offd_C_ptr = col_map_offd_C; hypre_GpuProfilingPopRange(); return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_CSRMatrixCompressColumnsDevice *--------------------------------------------------------------------------*/ HYPRE_Int hypre_CSRMatrixCompressColumnsDevice(hypre_CSRMatrix *A, HYPRE_BigInt *col_map, HYPRE_Int **col_idx_new_ptr, HYPRE_BigInt **col_map_new_ptr) { HYPRE_Int num_cols = hypre_CSRMatrixNumCols(A); HYPRE_Int nnz = hypre_CSRMatrixNumNonzeros(A); HYPRE_Int *A_j = hypre_CSRMatrixJ(A); HYPRE_Int *tmp_j = hypre_TAlloc(HYPRE_Int, nnz, HYPRE_MEMORY_DEVICE); HYPRE_Int *tmp_end; HYPRE_Int num_cols_new; hypre_TMemcpy(tmp_j, A_j, HYPRE_Int, nnz, HYPRE_MEMORY_DEVICE, HYPRE_MEMORY_DEVICE); #if defined(HYPRE_USING_SYCL) HYPRE_ONEDPL_CALL(std::sort, tmp_j, tmp_j + nnz); tmp_end = HYPRE_ONEDPL_CALL(std::unique, tmp_j, tmp_j + nnz); #else HYPRE_THRUST_CALL(sort, tmp_j, tmp_j + nnz); tmp_end = HYPRE_THRUST_CALL(unique, tmp_j, tmp_j + nnz); #endif num_cols_new = tmp_end - tmp_j; hypre_assert(num_cols_new <= num_cols); if (num_cols_new < num_cols) { HYPRE_Int *offd_mark = NULL; HYPRE_BigInt *col_map_new; if (num_cols_new) { offd_mark = hypre_TAlloc(HYPRE_Int, num_cols, HYPRE_MEMORY_DEVICE); } if (col_map_new_ptr) { col_map_new = hypre_TAlloc(HYPRE_BigInt, num_cols_new, HYPRE_MEMORY_DEVICE); } #if defined(HYPRE_USING_SYCL) oneapi::dpl::counting_iterator count(0); hypreSycl_scatter( count, count + num_cols_new, tmp_j, offd_mark ); hypreSycl_gather(A_j, A_j + nnz, offd_mark, A_j); if (col_map_new_ptr) { hypreSycl_gather(tmp_j, tmp_j + num_cols_new, col_map, col_map_new); } #else HYPRE_THRUST_CALL( scatter, thrust::counting_iterator(0), thrust::counting_iterator(num_cols_new), tmp_j, offd_mark ); HYPRE_THRUST_CALL(gather, A_j, A_j + nnz, offd_mark, A_j); if (col_map_new_ptr) { HYPRE_THRUST_CALL(gather, tmp_j, tmp_j + num_cols_new, col_map, col_map_new); } #endif hypre_TFree(offd_mark, HYPRE_MEMORY_DEVICE); hypre_CSRMatrixNumCols(A) = num_cols_new; if (col_idx_new_ptr) { *col_idx_new_ptr = tmp_j; } else { hypre_TFree(tmp_j, HYPRE_MEMORY_DEVICE); } if (col_map_new_ptr) { *col_map_new_ptr = col_map_new; } } else { if (col_idx_new_ptr) { *col_idx_new_ptr = NULL; } if (col_map_new_ptr) { *col_map_new_ptr = NULL; } hypre_TFree(tmp_j, HYPRE_MEMORY_DEVICE); } return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_CSRMatrixTriLowerUpperSolveDevice_core * * TODO (VPM): The analysis portion (setup phase) of the triangular solve * is embedded into the vendor libraries wrappers. * Should we create a separate function "Setup" function? *--------------------------------------------------------------------------*/ HYPRE_Int hypre_CSRMatrixTriLowerUpperSolveDevice_core(char uplo, HYPRE_Int unit_diag, hypre_CSRMatrix *A, HYPRE_Real *l1_norms, hypre_Vector *f, HYPRE_Int offset_f, hypre_Vector *u, HYPRE_Int offset_u) { /* Trivial case: no rows */ if (hypre_CSRMatrixNumRows(A) <= 0) { return hypre_error_flag; } /* Trivial case: empty rows */ if (hypre_CSRMatrixNumNonzeros(A) <= 0) { return hypre_error_flag; } /* Sanity check */ if (hypre_CSRMatrixNumRows(A) != hypre_CSRMatrixNumCols(A)) { hypre_error_w_msg(HYPRE_ERROR_GENERIC, "Triangular matrix solver works only for square matrices!"); return hypre_error_flag; } /* Call vendor specific implementations */ #if defined(HYPRE_USING_CUSPARSE) hypre_CSRMatrixTriLowerUpperSolveCusparse(uplo, unit_diag, A, l1_norms, hypre_VectorData(f) + offset_f, hypre_VectorData(u) + offset_u); #elif defined(HYPRE_USING_ROCSPARSE) hypre_CSRMatrixTriLowerUpperSolveRocsparse(uplo, unit_diag, A, l1_norms, hypre_VectorData(f) + offset_f, hypre_VectorData(u) + offset_u); #elif defined(HYPRE_USING_ONEMKLSPARSE) hypre_CSRMatrixTriLowerUpperSolveOnemklsparse(uplo, unit_diag, A, l1_norms, hypre_VectorData(f) + offset_f, hypre_VectorData(u) + offset_u); #else hypre_error_w_msg(HYPRE_ERROR_GENERIC, "hypre_CSRMatrixTriLowerUpperSolveDevice requires configuration with either cuSPARSE or rocSPARSE\n"); #endif return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_CSRMatrixTriLowerUpperSolveDevice *--------------------------------------------------------------------------*/ HYPRE_Int hypre_CSRMatrixTriLowerUpperSolveDevice(char uplo, HYPRE_Int unit_diag, hypre_CSRMatrix *A, HYPRE_Real *l1_norms, hypre_Vector *f, hypre_Vector *u ) { return hypre_CSRMatrixTriLowerUpperSolveDevice_core(uplo, unit_diag, A, l1_norms, f, 0, u, 0); } /*-------------------------------------------------------------------------- * hypre_CSRMatrixAddPartial * * Adds matrix rows in the CSR matrix B to the CSR Matrix A, where row_nums[i] * defines to which row of A the i-th row of B is added, and returns a CSR * Matrix C. Repeated row indices are allowed in row_nums * * Note: The routine does not check for 0-elements which might be generated * through cancellation of elements in A and B or already contained * in A and B. To remove those, use hypre_CSRMatrixDeleteZeros *--------------------------------------------------------------------------*/ hypre_CSRMatrix* hypre_CSRMatrixAddPartialDevice( hypre_CSRMatrix *A, hypre_CSRMatrix *B, HYPRE_Int *row_nums) { HYPRE_Complex *A_data = hypre_CSRMatrixData(A); HYPRE_Int *A_i = hypre_CSRMatrixI(A); HYPRE_Int *A_j = hypre_CSRMatrixJ(A); HYPRE_Int nrows_A = hypre_CSRMatrixNumRows(A); HYPRE_Int ncols_A = hypre_CSRMatrixNumCols(A); HYPRE_Int nnz_A = hypre_CSRMatrixNumNonzeros(A); HYPRE_Complex *B_data = hypre_CSRMatrixData(B); HYPRE_Int *B_i = hypre_CSRMatrixI(B); HYPRE_Int *B_j = hypre_CSRMatrixJ(B); HYPRE_Int nrows_B = hypre_CSRMatrixNumRows(B); HYPRE_Int ncols_B = hypre_CSRMatrixNumCols(B); HYPRE_Int nnz_B = hypre_CSRMatrixNumNonzeros(B); HYPRE_Complex *C_data; HYPRE_Int *C_i; HYPRE_Int *C_j; HYPRE_Int nnzC; hypre_CSRMatrix *C; if (ncols_A != ncols_B) { hypre_error_w_msg(HYPRE_ERROR_GENERIC, "Warning! incompatible matrix dimensions!\n"); return NULL; } hypreDevice_CSRSpAdd(nrows_A, nrows_B, nnz_A, nnz_B, A_i, A_j, 1.0, A_data, NULL, B_i, B_j, 1.0, B_data, NULL, row_nums, &nnzC, &C_i, &C_j, &C_data); C = hypre_CSRMatrixCreate(nrows_A, ncols_B, nnzC); hypre_CSRMatrixI(C) = C_i; hypre_CSRMatrixJ(C) = C_j; hypre_CSRMatrixData(C) = C_data; hypre_CSRMatrixMemoryLocation(C) = HYPRE_MEMORY_DEVICE; hypre_SyncComputeStream(); return C; } /*-------------------------------------------------------------------------- * hypre_CSRMatrixColNNzRealDevice *--------------------------------------------------------------------------*/ HYPRE_Int hypre_CSRMatrixColNNzRealDevice( hypre_CSRMatrix *A, HYPRE_Real *colnnz) { HYPRE_Int *A_j = hypre_CSRMatrixJ(A); HYPRE_Int ncols_A = hypre_CSRMatrixNumCols(A); HYPRE_Int nnz_A = hypre_CSRMatrixNumNonzeros(A); HYPRE_Int *A_j_sorted; HYPRE_Int num_reduced_col_indices; HYPRE_Int *reduced_col_indices; HYPRE_Int *reduced_col_nnz; A_j_sorted = hypre_TAlloc(HYPRE_Int, nnz_A, HYPRE_MEMORY_DEVICE); hypre_TMemcpy(A_j_sorted, A_j, HYPRE_Int, nnz_A, HYPRE_MEMORY_DEVICE, HYPRE_MEMORY_DEVICE); #if defined(HYPRE_USING_SYCL) HYPRE_ONEDPL_CALL(std::sort, A_j_sorted, A_j_sorted + nnz_A); #else HYPRE_THRUST_CALL(sort, A_j_sorted, A_j_sorted + nnz_A); #endif reduced_col_indices = hypre_TAlloc(HYPRE_Int, ncols_A, HYPRE_MEMORY_DEVICE); reduced_col_nnz = hypre_TAlloc(HYPRE_Int, ncols_A, HYPRE_MEMORY_DEVICE); #if defined(HYPRE_USING_SYCL) auto new_end = HYPRE_ONEDPL_CALL( oneapi::dpl::reduce_by_segment, A_j_sorted, A_j_sorted + nnz_A, dpct::constant_iterator(1), reduced_col_indices, reduced_col_nnz); hypre_assert(new_end.first - reduced_col_indices == new_end.second - reduced_col_nnz); num_reduced_col_indices = new_end.first - reduced_col_indices; #else thrust::pair new_end = HYPRE_THRUST_CALL(reduce_by_key, A_j_sorted, A_j_sorted + nnz_A, thrust::make_constant_iterator(1), reduced_col_indices, reduced_col_nnz); hypre_assert(new_end.first - reduced_col_indices == new_end.second - reduced_col_nnz); num_reduced_col_indices = new_end.first - reduced_col_indices; #endif hypre_Memset(colnnz, 0, ncols_A * sizeof(HYPRE_Real), HYPRE_MEMORY_DEVICE); #if defined(HYPRE_USING_SYCL) HYPRE_ONEDPL_CALL( std::copy, reduced_col_nnz, reduced_col_nnz + num_reduced_col_indices, oneapi::dpl::make_permutation_iterator(colnnz, reduced_col_indices) ); #else HYPRE_THRUST_CALL(scatter, reduced_col_nnz, reduced_col_nnz + num_reduced_col_indices, reduced_col_indices, colnnz); #endif hypre_TFree(A_j_sorted, HYPRE_MEMORY_DEVICE); hypre_TFree(reduced_col_indices, HYPRE_MEMORY_DEVICE); hypre_TFree(reduced_col_nnz, HYPRE_MEMORY_DEVICE); hypre_SyncComputeStream(); return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypreGPUKernel_CSRMoveDiagFirst *--------------------------------------------------------------------------*/ __global__ void hypreGPUKernel_CSRMoveDiagFirst( hypre_DeviceItem &item, HYPRE_Int nrows, HYPRE_Int *ia, HYPRE_Int *ja, HYPRE_Complex *aa ) { HYPRE_Int row = hypre_gpu_get_grid_warp_id<1, 1>(item); HYPRE_Int lane = hypre_gpu_get_lane_id<1>(item); if (row >= nrows) { return; } HYPRE_Int p = 0, q = 0; if (lane < 2) { p = read_only_load(ia + row + lane); } q = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, p, 1); p = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, p, 0); for (HYPRE_Int j = p + lane + 1; warp_any_sync(item, HYPRE_WARP_FULL_MASK, j < q); j += HYPRE_WARP_SIZE) { hypre_int find_diag = j < q && ja[j] == row; if (find_diag) { ja[j] = ja[p]; ja[p] = row; HYPRE_Complex tmp = aa[p]; aa[p] = aa[j]; aa[j] = tmp; } if ( warp_any_sync(item, HYPRE_WARP_FULL_MASK, find_diag) ) { break; } } } /*-------------------------------------------------------------------------- * hypre_CSRMatrixMoveDiagFirstDevice *--------------------------------------------------------------------------*/ HYPRE_Int hypre_CSRMatrixMoveDiagFirstDevice( hypre_CSRMatrix *A ) { HYPRE_Int nrows = hypre_CSRMatrixNumRows(A); HYPRE_Complex *A_data = hypre_CSRMatrixData(A); HYPRE_Int *A_i = hypre_CSRMatrixI(A); HYPRE_Int *A_j = hypre_CSRMatrixJ(A); dim3 bDim = hypre_GetDefaultDeviceBlockDimension(); dim3 gDim = hypre_GetDefaultDeviceGridDimension(nrows, "warp", bDim); HYPRE_GPU_LAUNCH(hypreGPUKernel_CSRMoveDiagFirst, gDim, bDim, nrows, A_i, A_j, A_data); hypre_SyncComputeStream(); return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_CSRMatrixStack2Device * * return C = [A; B] *--------------------------------------------------------------------------*/ hypre_CSRMatrix* hypre_CSRMatrixStack2Device(hypre_CSRMatrix *A, hypre_CSRMatrix *B) { hypre_GpuProfilingPushRange("CSRMatrixStack2"); hypre_assert( hypre_CSRMatrixNumCols(A) == hypre_CSRMatrixNumCols(B) ); hypre_CSRMatrix *C = hypre_CSRMatrixCreate( hypre_CSRMatrixNumRows(A) + hypre_CSRMatrixNumRows(B), hypre_CSRMatrixNumCols(A), hypre_CSRMatrixNumNonzeros(A) + hypre_CSRMatrixNumNonzeros(B) ); HYPRE_Int *C_i = hypre_TAlloc(HYPRE_Int, hypre_CSRMatrixNumRows(C) + 1, HYPRE_MEMORY_DEVICE); HYPRE_Int *C_j = hypre_TAlloc(HYPRE_Int, hypre_CSRMatrixNumNonzeros(C), HYPRE_MEMORY_DEVICE); HYPRE_Complex *C_a = hypre_TAlloc(HYPRE_Complex, hypre_CSRMatrixNumNonzeros(C), HYPRE_MEMORY_DEVICE); hypre_TMemcpy(C_i, hypre_CSRMatrixI(A), HYPRE_Int, hypre_CSRMatrixNumRows(A) + 1, HYPRE_MEMORY_DEVICE, HYPRE_MEMORY_DEVICE); hypre_TMemcpy(C_i + hypre_CSRMatrixNumRows(A) + 1, hypre_CSRMatrixI(B) + 1, HYPRE_Int, hypre_CSRMatrixNumRows(B), HYPRE_MEMORY_DEVICE, HYPRE_MEMORY_DEVICE); #if defined(HYPRE_USING_SYCL) HYPRE_ONEDPL_CALL( std::transform, C_i + hypre_CSRMatrixNumRows(A) + 1, C_i + hypre_CSRMatrixNumRows(C) + 1, C_i + hypre_CSRMatrixNumRows(A) + 1, [const_val = hypre_CSRMatrixNumNonzeros(A)] (const auto & x) {return x + const_val;} ); #else HYPRE_THRUST_CALL( transform, C_i + hypre_CSRMatrixNumRows(A) + 1, C_i + hypre_CSRMatrixNumRows(C) + 1, thrust::make_constant_iterator(hypre_CSRMatrixNumNonzeros(A)), C_i + hypre_CSRMatrixNumRows(A) + 1, thrust::plus() ); #endif hypre_TMemcpy(C_j, hypre_CSRMatrixJ(A), HYPRE_Int, hypre_CSRMatrixNumNonzeros(A), HYPRE_MEMORY_DEVICE, HYPRE_MEMORY_DEVICE); hypre_TMemcpy(C_j + hypre_CSRMatrixNumNonzeros(A), hypre_CSRMatrixJ(B), HYPRE_Int, hypre_CSRMatrixNumNonzeros(B), HYPRE_MEMORY_DEVICE, HYPRE_MEMORY_DEVICE); hypre_TMemcpy(C_a, hypre_CSRMatrixData(A), HYPRE_Complex, hypre_CSRMatrixNumNonzeros(A), HYPRE_MEMORY_DEVICE, HYPRE_MEMORY_DEVICE); hypre_TMemcpy(C_a + hypre_CSRMatrixNumNonzeros(A), hypre_CSRMatrixData(B), HYPRE_Complex, hypre_CSRMatrixNumNonzeros(B), HYPRE_MEMORY_DEVICE, HYPRE_MEMORY_DEVICE); hypre_CSRMatrixI(C) = C_i; hypre_CSRMatrixJ(C) = C_j; hypre_CSRMatrixData(C) = C_a; hypre_CSRMatrixMemoryLocation(C) = HYPRE_MEMORY_DEVICE; hypre_GpuProfilingPopRange(); return C; } /*-------------------------------------------------------------------------- * hypreGPUKernel_CSRRowSum * * type == 0, sum, * 1, abs sum (l-1) * 2, square sum (l-2) *--------------------------------------------------------------------------*/ template __global__ void hypreGPUKernel_CSRRowSum( hypre_DeviceItem &item, HYPRE_Int nrows, HYPRE_Int *ia, HYPRE_Int *ja, HYPRE_Complex *aa, HYPRE_Int *CF_i, HYPRE_Int *CF_j, HYPRE_Complex *row_sum, HYPRE_Complex scal, HYPRE_Int set) { HYPRE_Int row_i = hypre_gpu_get_grid_warp_id<1, 1>(item); if (row_i >= nrows) { return; } HYPRE_Int lane = hypre_gpu_get_lane_id<1>(item); HYPRE_Int p = 0, q = 0; if (lane < 2) { p = read_only_load(ia + row_i + lane); } q = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, p, 1); p = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, p, 0); HYPRE_Complex row_sum_i = 0.0; for (HYPRE_Int j = p + lane; j < q; j += HYPRE_WARP_SIZE) { if ( CF_i && CF_j && read_only_load(&CF_i[row_i]) != read_only_load(&CF_j[ja[j]]) ) { continue; } HYPRE_Complex aii = aa[j]; if (type == 0) { row_sum_i += aii; } else if (type == 1) { row_sum_i += hypre_abs(aii); } else if (type == 2) { row_sum_i += aii * aii; } } row_sum_i = warp_reduce_sum(item, row_sum_i); if (lane == 0) { if (set) { row_sum[row_i] = scal * row_sum_i; } else { row_sum[row_i] += scal * row_sum_i; } } } /*-------------------------------------------------------------------------- * hypre_CSRMatrixComputeRowSumDevice *--------------------------------------------------------------------------*/ HYPRE_Int hypre_CSRMatrixComputeRowSumDevice( hypre_CSRMatrix *A, HYPRE_Int *CF_i, HYPRE_Int *CF_j, HYPRE_Complex *row_sum, HYPRE_Int type, HYPRE_Complex scal, const char *set_or_add) { HYPRE_Int nrows = hypre_CSRMatrixNumRows(A); HYPRE_Complex *A_data = hypre_CSRMatrixData(A); HYPRE_Int *A_i = hypre_CSRMatrixI(A); HYPRE_Int *A_j = hypre_CSRMatrixJ(A); dim3 bDim = hypre_GetDefaultDeviceBlockDimension(); dim3 gDim = hypre_GetDefaultDeviceGridDimension(nrows, "warp", bDim); HYPRE_Int set = set_or_add[0] == 's'; if (type == 0) { HYPRE_GPU_LAUNCH( hypreGPUKernel_CSRRowSum<0>, gDim, bDim, nrows, A_i, A_j, A_data, CF_i, CF_j, row_sum, scal, set ); } else if (type == 1) { HYPRE_GPU_LAUNCH( hypreGPUKernel_CSRRowSum<1>, gDim, bDim, nrows, A_i, A_j, A_data, CF_i, CF_j, row_sum, scal, set ); } else if (type == 2) { HYPRE_GPU_LAUNCH( hypreGPUKernel_CSRRowSum<2>, gDim, bDim, nrows, A_i, A_j, A_data, CF_i, CF_j, row_sum, scal, set ); } hypre_SyncComputeStream(); return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypreGPUKernel_CSRMatrixIntersectPattern * * mark is of size nA * diag_option: 1: special treatment for diag entries, mark as -2 *--------------------------------------------------------------------------*/ __global__ void hypreGPUKernel_CSRMatrixIntersectPattern(hypre_DeviceItem &item, HYPRE_Int n, HYPRE_Int nA, HYPRE_Int *rowid, HYPRE_Int *colid, HYPRE_Int *idx, HYPRE_Int *mark, HYPRE_Int diag_option) { HYPRE_Int i = hypre_gpu_get_grid_thread_id<1, 1>(item); if (i >= n) { return; } HYPRE_Int r1 = read_only_load(&rowid[i]); HYPRE_Int c1 = read_only_load(&colid[i]); HYPRE_Int j = read_only_load(&idx[i]); if (0 == diag_option) { if (j < nA) { HYPRE_Int r2 = i < n - 1 ? read_only_load(&rowid[i + 1]) : -1; HYPRE_Int c2 = i < n - 1 ? read_only_load(&colid[i + 1]) : -1; if (r1 == r2 && c1 == c2) { mark[j] = c1; } else { mark[j] = -1; } } } else if (1 == diag_option) { if (j < nA) { if (r1 == c1) { mark[j] = -2; } else { HYPRE_Int r2 = i < n - 1 ? read_only_load(&rowid[i + 1]) : -1; HYPRE_Int c2 = i < n - 1 ? read_only_load(&colid[i + 1]) : -1; if (r1 == r2 && c1 == c2) { mark[j] = c1; } else { mark[j] = -1; } } } } } /*-------------------------------------------------------------------------- * hypre_CSRMatrixIntersectPattern * * markA: array of size nnz(A), for pattern of (A and B), markA is the * column indices as in A_J. Otherwise, mark pattern not in A-B as -1 in markA * * Note the special treatment for diagonal entries of A (marked as -2) *--------------------------------------------------------------------------*/ HYPRE_Int hypre_CSRMatrixIntersectPattern(hypre_CSRMatrix *A, hypre_CSRMatrix *B, HYPRE_Int *markA, HYPRE_Int diag_opt) { HYPRE_Int nrows = hypre_CSRMatrixNumRows(A); HYPRE_Int nnzA = hypre_CSRMatrixNumNonzeros(A); HYPRE_Int nnzB = hypre_CSRMatrixNumNonzeros(B); HYPRE_Int *Cii = hypre_TAlloc(HYPRE_Int, nnzA + nnzB, HYPRE_MEMORY_DEVICE); HYPRE_Int *Cjj = hypre_TAlloc(HYPRE_Int, nnzA + nnzB, HYPRE_MEMORY_DEVICE); HYPRE_Int *idx = hypre_TAlloc(HYPRE_Int, nnzA + nnzB, HYPRE_MEMORY_DEVICE); hypreDevice_CsrRowPtrsToIndices_v2(nrows, nnzA, hypre_CSRMatrixI(A), Cii); hypreDevice_CsrRowPtrsToIndices_v2(nrows, nnzB, hypre_CSRMatrixI(B), Cii + nnzA); hypre_TMemcpy(Cjj, hypre_CSRMatrixJ(A), HYPRE_Int, nnzA, HYPRE_MEMORY_DEVICE, HYPRE_MEMORY_DEVICE); hypre_TMemcpy(Cjj + nnzA, hypre_CSRMatrixJ(B), HYPRE_Int, nnzB, HYPRE_MEMORY_DEVICE, HYPRE_MEMORY_DEVICE); #if defined(HYPRE_USING_SYCL) hypreSycl_sequence(idx, idx + nnzA + nnzB, 0); auto zipped_begin = oneapi::dpl::make_zip_iterator(Cii, Cjj, idx); HYPRE_ONEDPL_CALL( std::stable_sort, zipped_begin, zipped_begin + nnzA + nnzB, [](auto lhs, auto rhs) { if (std::get<0>(lhs) == std::get<0>(rhs)) { return std::get<1>(lhs) < std::get<1>(rhs); } else { return std::get<0>(lhs) < std::get<0>(rhs); } } ); #else HYPRE_THRUST_CALL( sequence, idx, idx + nnzA + nnzB ); HYPRE_THRUST_CALL( stable_sort_by_key, thrust::make_zip_iterator(thrust::make_tuple(Cii, Cjj)), thrust::make_zip_iterator(thrust::make_tuple(Cii, Cjj)) + nnzA + nnzB, idx ); #endif hypre_TMemcpy(markA, hypre_CSRMatrixJ(A), HYPRE_Int, nnzA, HYPRE_MEMORY_DEVICE, HYPRE_MEMORY_DEVICE); dim3 bDim = hypre_GetDefaultDeviceBlockDimension(); dim3 gDim = hypre_GetDefaultDeviceGridDimension(nnzA + nnzB, "thread", bDim); HYPRE_GPU_LAUNCH( hypreGPUKernel_CSRMatrixIntersectPattern, gDim, bDim, nnzA + nnzB, nnzA, Cii, Cjj, idx, markA, diag_opt ); hypre_TFree(Cii, HYPRE_MEMORY_DEVICE); hypre_TFree(Cjj, HYPRE_MEMORY_DEVICE); hypre_TFree(idx, HYPRE_MEMORY_DEVICE); return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypreGPUKernel_CSRExtractDiag * * type 0: diag * 1: abs diag * 2: diag inverse * 3: diag inverse sqrt * 4: abs diag inverse sqrt *--------------------------------------------------------------------------*/ __global__ void hypreGPUKernel_CSRExtractDiag( hypre_DeviceItem &item, HYPRE_Int nrows, HYPRE_Int *ia, HYPRE_Int *ja, HYPRE_Complex *aa, HYPRE_Complex *d, HYPRE_Int type) { HYPRE_Int row = hypre_gpu_get_grid_warp_id<1, 1>(item); if (row >= nrows) { return; } HYPRE_Int lane = hypre_gpu_get_lane_id<1>(item); HYPRE_Int p = 0, q = 0; if (lane < 2) { p = read_only_load(ia + row + lane); } q = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, p, 1); p = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, p, 0); HYPRE_Int has_diag = 0; for (HYPRE_Int j = p + lane; warp_any_sync(item, HYPRE_WARP_FULL_MASK, j < q); j += HYPRE_WARP_SIZE) { hypre_int find_diag = j < q && ja[j] == row; if (find_diag) { if (type == 0) { d[row] = aa[j]; } else if (type == 1) { d[row] = hypre_abs(aa[j]); } else { if (aa[j] == 0.0) { d[row] = 0.0; } else if (type == 2) { d[row] = 1.0 / aa[j]; } else if (type == 3) { d[row] = 1.0 / hypre_sqrt(aa[j]); } else if (type == 4) { d[row] = 1.0 / hypre_sqrt(hypre_abs(aa[j])); } } } if (warp_any_sync(item, HYPRE_WARP_FULL_MASK, find_diag)) { has_diag = 1; break; } } if (!has_diag && lane == 0) { d[row] = 0.0; } } /*-------------------------------------------------------------------------- * hypre_CSRMatrixExtractDiagonalDevice *--------------------------------------------------------------------------*/ HYPRE_Int hypre_CSRMatrixExtractDiagonalDevice( hypre_CSRMatrix *A, HYPRE_Complex *d, HYPRE_Int type) { HYPRE_Int nrows = hypre_CSRMatrixNumRows(A); HYPRE_Complex *A_data = hypre_CSRMatrixData(A); HYPRE_Int *A_i = hypre_CSRMatrixI(A); HYPRE_Int *A_j = hypre_CSRMatrixJ(A); dim3 bDim = hypre_GetDefaultDeviceBlockDimension(); dim3 gDim = hypre_GetDefaultDeviceGridDimension(nrows, "warp", bDim); HYPRE_GPU_LAUNCH( hypreGPUKernel_CSRExtractDiag, gDim, bDim, nrows, A_i, A_j, A_data, d, type ); hypre_SyncComputeStream(); return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypreGPUKernel_CSRCheckDiagFirst * * check if diagonal entry is the first one at each row * Return: the number of rows that do not have the first entry as diagonal * RL: only check if it's a non-empty row *--------------------------------------------------------------------------*/ __global__ void hypreGPUKernel_CSRCheckDiagFirst( hypre_DeviceItem &item, HYPRE_Int nrows, HYPRE_Int *ia, HYPRE_Int *ja, HYPRE_Int *result ) { const HYPRE_Int row = hypre_gpu_get_grid_thread_id<1, 1>(item); if (row < nrows) { result[row] = (ia[row + 1] > ia[row]) && (ja[ia[row]] != row); } } /*-------------------------------------------------------------------------- * hypre_CSRMatrixCheckDiagFirstDevice *--------------------------------------------------------------------------*/ HYPRE_Int hypre_CSRMatrixCheckDiagFirstDevice( hypre_CSRMatrix *A ) { HYPRE_Int *A_i = hypre_CSRMatrixI(A); HYPRE_Int *A_j = hypre_CSRMatrixJ(A); HYPRE_Int num_rows = hypre_CSRMatrixNumRows(A); HYPRE_Int *result; HYPRE_Int ierr; /* Sanity check */ if (hypre_CSRMatrixNumRows(A) != hypre_CSRMatrixNumCols(A)) { return 0; } dim3 bDim = hypre_GetDefaultDeviceBlockDimension(); dim3 gDim = hypre_GetDefaultDeviceGridDimension(hypre_CSRMatrixNumRows(A), "thread", bDim); result = hypre_TAlloc(HYPRE_Int, num_rows, HYPRE_MEMORY_DEVICE); HYPRE_GPU_LAUNCH( hypreGPUKernel_CSRCheckDiagFirst, gDim, bDim, num_rows, A_i, A_j, result ); /* Compute number of rows in which the diagonal is not the first entry */ #if defined(HYPRE_USING_SYCL) ierr = HYPRE_ONEDPL_CALL( std::reduce, result, result + hypre_CSRMatrixNumRows(A) ); #else ierr = HYPRE_THRUST_CALL( reduce, result, result + hypre_CSRMatrixNumRows(A) ); #endif hypre_TFree(result, HYPRE_MEMORY_DEVICE); hypre_SyncComputeStream(); return ierr; } /*-------------------------------------------------------------------------- * hypreGPUKernel_CSRMatrixCheckForMissingDiagonal *--------------------------------------------------------------------------*/ __global__ void hypreGPUKernel_CSRMatrixCheckForMissingDiagonal( hypre_DeviceItem &item, HYPRE_Int nrows, HYPRE_Int *ia, HYPRE_Int *ja, HYPRE_Int *result ) { const HYPRE_Int row = hypre_gpu_get_grid_warp_id<1, 1>(item); if (row >= nrows) { return; } HYPRE_Int lane = hypre_gpu_get_lane_id<1>(item); HYPRE_Int p = 0, q = 0; bool missing_diagonal = true; if (lane < 2) { p = read_only_load(ia + row + lane); } q = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, p, 1); p = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, p, 0); for (HYPRE_Int j = p + lane; warp_any_sync(item, HYPRE_WARP_FULL_MASK, j < q); j += HYPRE_WARP_SIZE) { hypre_int find_diag = j < q && read_only_load(&ja[j]) == row; if ( warp_any_sync(item, HYPRE_WARP_FULL_MASK, find_diag) ) { missing_diagonal = false; break; } } if (missing_diagonal && lane == 0) { result[row] = 1; } } /*-------------------------------------------------------------------------- * hypre_CSRMatrixCheckForMissingDiagonal *--------------------------------------------------------------------------*/ HYPRE_Int hypre_CSRMatrixCheckForMissingDiagonal( hypre_CSRMatrix *A ) { HYPRE_Int *A_i = hypre_CSRMatrixI(A); HYPRE_Int *A_j = hypre_CSRMatrixJ(A); HYPRE_Int num_rows = hypre_CSRMatrixNumRows(A); HYPRE_Int *result; HYPRE_Int ierr; /* This test is only for square matrices */ if (hypre_CSRMatrixNumRows(A) != hypre_CSRMatrixNumCols(A)) { return 0; } dim3 bDim = hypre_GetDefaultDeviceBlockDimension(); dim3 gDim = hypre_GetDefaultDeviceGridDimension(hypre_CSRMatrixNumRows(A), "thread", bDim); result = hypre_CTAlloc(HYPRE_Int, num_rows, HYPRE_MEMORY_DEVICE); HYPRE_GPU_LAUNCH( hypreGPUKernel_CSRMatrixCheckForMissingDiagonal, gDim, bDim, num_rows, A_i, A_j, result ); /* Compute number of rows in which the diagonal is not the first entry */ #if defined(HYPRE_USING_SYCL) ierr = HYPRE_ONEDPL_CALL( std::reduce, result, result + hypre_CSRMatrixNumRows(A) ); #else ierr = HYPRE_THRUST_CALL( reduce, result, result + hypre_CSRMatrixNumRows(A) ); #endif hypre_TFree(result, HYPRE_MEMORY_DEVICE); return ierr; } /*-------------------------------------------------------------------------- * hypreGPUKernel_CSRMatrixReplaceDiagDevice *--------------------------------------------------------------------------*/ __global__ void hypreGPUKernel_CSRMatrixReplaceDiagDevice( hypre_DeviceItem &item, HYPRE_Complex *new_diag, HYPRE_Complex v, HYPRE_Int nrows, HYPRE_Int *ia, HYPRE_Int *ja, HYPRE_Complex *data, HYPRE_Real tol, HYPRE_Int *result ) { const HYPRE_Int row = hypre_gpu_get_grid_warp_id<1, 1>(item); if (row >= nrows) { return; } HYPRE_Int lane = hypre_gpu_get_lane_id<1>(item); HYPRE_Int p = 0, q = 0; bool has_diag = false; if (lane < 2) { p = read_only_load(ia + row + lane); } q = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, p, 1); p = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, p, 0); for (HYPRE_Int j = p + lane; warp_any_sync(item, HYPRE_WARP_FULL_MASK, j < q); j += HYPRE_WARP_SIZE) { hypre_int find_diag = j < q && read_only_load(&ja[j]) == row; if (find_diag) { if (new_diag) { HYPRE_Complex d = read_only_load(&new_diag[row]); data[j] = hypre_abs(d) <= tol ? v : d; } else { if (hypre_abs(data[j]) <= tol) { data[j] = v; } } } if ( warp_any_sync(item, HYPRE_WARP_FULL_MASK, find_diag) ) { has_diag = true; break; } } if (result && !has_diag && lane == 0) { result[row] = 1; } } /*-------------------------------------------------------------------------- * hypre_CSRMatrixReplaceDiagDevice *--------------------------------------------------------------------------*/ HYPRE_Int hypre_CSRMatrixReplaceDiagDevice( hypre_CSRMatrix *A, HYPRE_Complex *new_diag, HYPRE_Complex v, HYPRE_Real tol ) { if (hypre_CSRMatrixNumRows(A) != hypre_CSRMatrixNumCols(A)) { return hypre_error_flag; } dim3 bDim = hypre_GetDefaultDeviceBlockDimension(); dim3 gDim = hypre_GetDefaultDeviceGridDimension(hypre_CSRMatrixNumRows(A), "warp", bDim); #if HYPRE_DEBUG HYPRE_Int *result = hypre_CTAlloc(HYPRE_Int, hypre_CSRMatrixNumRows(A), HYPRE_MEMORY_DEVICE); #else HYPRE_Int *result = NULL; #endif HYPRE_Int num_rows = hypre_CSRMatrixNumRows(A); HYPRE_Int *A_i = hypre_CSRMatrixI(A); HYPRE_Int *A_j = hypre_CSRMatrixJ(A); HYPRE_Complex *A_data = hypre_CSRMatrixData(A); HYPRE_GPU_LAUNCH( hypreGPUKernel_CSRMatrixReplaceDiagDevice, gDim, bDim, new_diag, v, num_rows, A_i, A_j, A_data, tol, result ); #if HYPRE_DEBUG /* the number of structural zero in A */ #if defined(HYPRE_USING_SYCL) HYPRE_Int num_zeros = HYPRE_ONEDPL_CALL( std::reduce, result, result + hypre_CSRMatrixNumRows(A) ); #else HYPRE_Int num_zeros = HYPRE_THRUST_CALL( reduce, result, result + hypre_CSRMatrixNumRows(A) ); #endif hypre_TFree(result, HYPRE_MEMORY_DEVICE); if (num_zeros) { hypre_error_w_msg(num_zeros, "structural zero in hypre_CSRMatrixReplaceDiagDevice"); } #endif hypre_SyncComputeStream(); return hypre_error_flag; } #if defined(HYPRE_USING_SYCL) typedef std::tuple Int2; struct Int2Unequal { bool operator()(const Int2& t) const { return (std::get<0>(t) != std::get<1>(t)); } }; #else typedef thrust::tuple Int2; #if (defined(THRUST_VERSION) && THRUST_VERSION < 101000) struct Int2Unequal : public thrust::unary_function #else struct Int2Unequal #endif { __host__ __device__ bool operator()(const Int2& t) const { return (thrust::get<0>(t) != thrust::get<1>(t)); } }; #endif /*-------------------------------------------------------------------------- * hypre_CSRMatrixRemoveDiagonalDevice *--------------------------------------------------------------------------*/ HYPRE_Int hypre_CSRMatrixRemoveDiagonalDevice(hypre_CSRMatrix *A) { HYPRE_Int nrows = hypre_CSRMatrixNumRows(A); HYPRE_Int nnz = hypre_CSRMatrixNumNonzeros(A); HYPRE_Int *A_i = hypre_CSRMatrixI(A); HYPRE_Int *A_j = hypre_CSRMatrixJ(A); HYPRE_Complex *A_data = hypre_CSRMatrixData(A); HYPRE_Int *A_ii = hypreDevice_CsrRowPtrsToIndices(nrows, nnz, A_i); HYPRE_Int new_nnz; HYPRE_Int *new_ii; HYPRE_Int *new_j; HYPRE_Complex *new_data; #if defined(HYPRE_USING_SYCL) auto zip_ij = oneapi::dpl::make_zip_iterator(A_ii, A_j); new_nnz = HYPRE_ONEDPL_CALL( std::count_if, zip_ij, zip_ij + nnz, Int2Unequal() ); #else new_nnz = HYPRE_THRUST_CALL( count_if, thrust::make_zip_iterator(thrust::make_tuple(A_ii, A_j)), thrust::make_zip_iterator(thrust::make_tuple(A_ii, A_j)) + nnz, Int2Unequal() ); #endif if (new_nnz == nnz) { /* no diagonal entries found */ hypre_TFree(A_ii, HYPRE_MEMORY_DEVICE); return hypre_error_flag; } new_ii = hypre_TAlloc(HYPRE_Int, new_nnz, HYPRE_MEMORY_DEVICE); new_j = hypre_TAlloc(HYPRE_Int, new_nnz, HYPRE_MEMORY_DEVICE); if (A_data) { new_data = hypre_TAlloc(HYPRE_Complex, new_nnz, HYPRE_MEMORY_DEVICE); #if defined(HYPRE_USING_SYCL) auto zip_ija = oneapi::dpl::make_zip_iterator(A_ii, A_j, A_data); auto zip_new_ija = oneapi::dpl::make_zip_iterator(new_ii, new_j, new_data); auto new_end = hypreSycl_copy_if( zip_ija, zip_ija + nnz, zip_ij, zip_new_ija, Int2Unequal() ); hypre_assert( std::get<0>(new_end.base()) == new_ii + new_nnz ); #else auto new_end = HYPRE_THRUST_CALL( copy_if, thrust::make_zip_iterator(thrust::make_tuple(A_ii, A_j, A_data)), thrust::make_zip_iterator(thrust::make_tuple(A_ii, A_j, A_data)) + nnz, thrust::make_zip_iterator(thrust::make_tuple(A_ii, A_j)), thrust::make_zip_iterator(thrust::make_tuple(new_ii, new_j, new_data)), Int2Unequal() ); hypre_assert( thrust::get<0>(new_end.get_iterator_tuple()) == new_ii + new_nnz ); #endif } else { new_data = NULL; #if defined(HYPRE_USING_SYCL) auto zip_new_ij = oneapi::dpl::make_zip_iterator(new_ii, new_j); auto new_end = hypreSycl_copy_if( zip_ij, zip_ij + nnz, zip_ij, zip_new_ij, Int2Unequal() ); hypre_assert( std::get<0>(new_end.base()) == new_ii + new_nnz ); #else auto new_end = HYPRE_THRUST_CALL( copy_if, thrust::make_zip_iterator(thrust::make_tuple(A_ii, A_j)), thrust::make_zip_iterator(thrust::make_tuple(A_ii, A_j)) + nnz, thrust::make_zip_iterator(thrust::make_tuple(A_ii, A_j)), thrust::make_zip_iterator(thrust::make_tuple(new_ii, new_j)), Int2Unequal() ); hypre_assert( thrust::get<0>(new_end.get_iterator_tuple()) == new_ii + new_nnz ); #endif } hypre_TFree(A_ii, HYPRE_MEMORY_DEVICE); hypre_TFree(A_i, HYPRE_MEMORY_DEVICE); hypre_TFree(A_j, HYPRE_MEMORY_DEVICE); hypre_TFree(A_data, HYPRE_MEMORY_DEVICE); hypre_CSRMatrixNumNonzeros(A) = new_nnz; hypre_CSRMatrixI(A) = hypreDevice_CsrRowIndicesToPtrs(nrows, new_nnz, new_ii); hypre_CSRMatrixJ(A) = new_j; hypre_CSRMatrixData(A) = new_data; hypre_TFree(new_ii, HYPRE_MEMORY_DEVICE); return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypreGPUKernel_CSRDiagScale *--------------------------------------------------------------------------*/ __global__ void hypreGPUKernel_CSRDiagScale( hypre_DeviceItem &item, HYPRE_Int nrows, HYPRE_Int *ia, HYPRE_Int *ja, HYPRE_Complex *aa, HYPRE_Complex *ld, HYPRE_Complex *rd) { HYPRE_Int row = hypre_gpu_get_grid_warp_id<1, 1>(item); if (row >= nrows) { return; } HYPRE_Int lane = hypre_gpu_get_lane_id<1>(item); HYPRE_Int p = 0, q = 0; if (lane < 2) { p = read_only_load(ia + row + lane); } q = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, p, 1); p = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, p, 0); HYPRE_Complex sl = 1.0; if (ld) { if (!lane) { sl = read_only_load(ld + row); } sl = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, sl, 0); } if (rd) { for (HYPRE_Int i = p + lane; i < q; i += HYPRE_WARP_SIZE) { const HYPRE_Int col = read_only_load(ja + i); const HYPRE_Complex sr = read_only_load(rd + col); aa[i] = sl * aa[i] * sr; } } else if (sl != 1.0) { for (HYPRE_Int i = p + lane; i < q; i += HYPRE_WARP_SIZE) { aa[i] = sl * aa[i]; } } } /*-------------------------------------------------------------------------- * hypre_CSRMatrixDiagScaleDevice *--------------------------------------------------------------------------*/ HYPRE_Int hypre_CSRMatrixDiagScaleDevice( hypre_CSRMatrix *A, hypre_Vector *ld, hypre_Vector *rd) { HYPRE_Int nrows = hypre_CSRMatrixNumRows(A); HYPRE_Complex *A_data = hypre_CSRMatrixData(A); HYPRE_Int *A_i = hypre_CSRMatrixI(A); HYPRE_Int *A_j = hypre_CSRMatrixJ(A); HYPRE_Complex *ldata = ld ? hypre_VectorData(ld) : NULL; HYPRE_Complex *rdata = rd ? hypre_VectorData(rd) : NULL; dim3 bDim = hypre_GetDefaultDeviceBlockDimension(); dim3 gDim = hypre_GetDefaultDeviceGridDimension(nrows, "warp", bDim); HYPRE_GPU_LAUNCH(hypreGPUKernel_CSRDiagScale, gDim, bDim, nrows, A_i, A_j, A_data, ldata, rdata); hypre_SyncComputeStream(); return hypre_error_flag; } /*-------------------------------------------------------------------------- * cabsfirst_greaterthan_second_pred * * This predicate compares first and second element in a tuple in absolute * value first is assumed to be complex, second to be real > 0 *--------------------------------------------------------------------------*/ #if defined(HYPRE_USING_SYCL) struct cabsfirst_greaterthan_second_pred { bool operator()(const std::tuple& t) const { const HYPRE_Complex i = std::get<0>(t); const HYPRE_Real j = std::get<1>(t); return hypre_cabs(i) > j; } }; #else #if (defined(THRUST_VERSION) && THRUST_VERSION < 101000) struct cabsfirst_greaterthan_second_pred : public thrust::unary_function, bool> #else struct cabsfirst_greaterthan_second_pred #endif { __host__ __device__ bool operator()(const thrust::tuple& t) const { const HYPRE_Complex i = thrust::get<0>(t); const HYPRE_Real j = thrust::get<1>(t); return hypre_cabs(i) > j; } }; #endif /*-------------------------------------------------------------------------- * hypre_CSRMatrixDropSmallEntriesDevice * * drop the entries that are smaller than: * tol if elmt_tols == null, * elmt_tols[j] otherwise where j = 0...NumNonzeros(A) *--------------------------------------------------------------------------*/ HYPRE_Int hypre_CSRMatrixDropSmallEntriesDevice( hypre_CSRMatrix *A, HYPRE_Real tol, HYPRE_Real *elmt_tols) { HYPRE_Int nrows = hypre_CSRMatrixNumRows(A); HYPRE_Int nnz = hypre_CSRMatrixNumNonzeros(A); HYPRE_Int *A_i = hypre_CSRMatrixI(A); HYPRE_Int *A_j = hypre_CSRMatrixJ(A); HYPRE_Complex *A_data = hypre_CSRMatrixData(A); HYPRE_Int *A_ii = NULL; HYPRE_Int new_nnz = 0; HYPRE_Int *new_ii; HYPRE_Int *new_j; HYPRE_Complex *new_data; #if defined(HYPRE_USING_SYCL) if (elmt_tols == NULL) { new_nnz = HYPRE_ONEDPL_CALL( std::count_if, A_data, A_data + nnz, [tol] (const auto & x) {return !(x < tol);} ); } else { new_nnz = HYPRE_ONEDPL_CALL( std::count_if, oneapi::dpl::make_zip_iterator(A_data, elmt_tols), oneapi::dpl::make_zip_iterator(A_data, elmt_tols) + nnz, cabsfirst_greaterthan_second_pred() ); } #else if (elmt_tols == NULL) { new_nnz = HYPRE_THRUST_CALL( count_if, A_data, A_data + nnz, HYPRE_THRUST_NOT(less_than(tol)) ); } else { new_nnz = HYPRE_THRUST_CALL( count_if, thrust::make_zip_iterator(thrust::make_tuple(A_data, elmt_tols)), thrust::make_zip_iterator(thrust::make_tuple(A_data, elmt_tols)) + nnz, cabsfirst_greaterthan_second_pred() ); } #endif if (new_nnz == nnz) { hypre_TFree(A_ii, HYPRE_MEMORY_DEVICE); return hypre_error_flag; } if (!A_ii) { A_ii = hypreDevice_CsrRowPtrsToIndices(nrows, nnz, A_i); } new_ii = hypre_TAlloc(HYPRE_Int, new_nnz, HYPRE_MEMORY_DEVICE); new_j = hypre_TAlloc(HYPRE_Int, new_nnz, HYPRE_MEMORY_DEVICE); new_data = hypre_TAlloc(HYPRE_Complex, new_nnz, HYPRE_MEMORY_DEVICE); #if defined(HYPRE_USING_SYCL) if (elmt_tols == NULL) { auto new_end = hypreSycl_copy_if( oneapi::dpl::make_zip_iterator(A_ii, A_j, A_data), oneapi::dpl::make_zip_iterator(A_ii, A_j, A_data) + nnz, A_data, oneapi::dpl::make_zip_iterator(new_ii, new_j, new_data), [tol] (const auto & x) {return !(x < tol);} ); hypre_assert( std::get<0>(new_end.base()) == new_ii + new_nnz ); } else { auto new_end = hypreSycl_copy_if( oneapi::dpl::make_zip_iterator(A_ii, A_j, A_data), oneapi::dpl::make_zip_iterator(A_ii, A_j, A_data) + nnz, oneapi::dpl::make_zip_iterator(A_data, elmt_tols), oneapi::dpl::make_zip_iterator(new_ii, new_j, new_data), cabsfirst_greaterthan_second_pred() ); hypre_assert( std::get<0>(new_end.base()) == new_ii + new_nnz ); } #else if (elmt_tols == NULL) { auto new_end = HYPRE_THRUST_CALL( copy_if, thrust::make_zip_iterator(thrust::make_tuple(A_ii, A_j, A_data)), thrust::make_zip_iterator(thrust::make_tuple(A_ii, A_j, A_data)) + nnz, A_data, thrust::make_zip_iterator(thrust::make_tuple(new_ii, new_j, new_data)), HYPRE_THRUST_NOT(less_than(tol)) ); hypre_assert( thrust::get<0>(new_end.get_iterator_tuple()) == new_ii + new_nnz ); } else { auto new_end = HYPRE_THRUST_CALL( copy_if, thrust::make_zip_iterator(thrust::make_tuple(A_ii, A_j, A_data)), thrust::make_zip_iterator(thrust::make_tuple(A_ii, A_j, A_data)) + nnz, thrust::make_zip_iterator(thrust::make_tuple(A_data, elmt_tols)), thrust::make_zip_iterator(thrust::make_tuple(new_ii, new_j, new_data)), cabsfirst_greaterthan_second_pred() ); hypre_assert( thrust::get<0>(new_end.get_iterator_tuple()) == new_ii + new_nnz ); } #endif hypre_TFree(A_ii, HYPRE_MEMORY_DEVICE); hypre_TFree(A_i, HYPRE_MEMORY_DEVICE); hypre_TFree(A_j, HYPRE_MEMORY_DEVICE); hypre_TFree(A_data, HYPRE_MEMORY_DEVICE); hypre_CSRMatrixNumNonzeros(A) = new_nnz; hypre_CSRMatrixI(A) = hypreDevice_CsrRowIndicesToPtrs(nrows, new_nnz, new_ii); hypre_CSRMatrixJ(A) = new_j; hypre_CSRMatrixData(A) = new_data; hypre_TFree(new_ii, HYPRE_MEMORY_DEVICE); return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_CSRMatrixIdentityDevice * * A = alp * I *--------------------------------------------------------------------------*/ hypre_CSRMatrix * hypre_CSRMatrixIdentityDevice(HYPRE_Int n, HYPRE_Complex alp) { hypre_CSRMatrix *A = hypre_CSRMatrixCreate(n, n, n); hypre_CSRMatrixInitialize_v2(A, 0, HYPRE_MEMORY_DEVICE); #if defined(HYPRE_USING_SYCL) hypreSycl_sequence( hypre_CSRMatrixI(A), hypre_CSRMatrixI(A) + n + 1, 0 ); hypreSycl_sequence( hypre_CSRMatrixJ(A), hypre_CSRMatrixJ(A) + n, 0 ); HYPRE_ONEDPL_CALL( std::fill, hypre_CSRMatrixData(A), hypre_CSRMatrixData(A) + n, alp ); #else HYPRE_THRUST_CALL( sequence, hypre_CSRMatrixI(A), hypre_CSRMatrixI(A) + n + 1, 0 ); HYPRE_THRUST_CALL( sequence, hypre_CSRMatrixJ(A), hypre_CSRMatrixJ(A) + n, 0 ); HYPRE_THRUST_CALL( fill, hypre_CSRMatrixData(A), hypre_CSRMatrixData(A) + n, alp ); #endif return A; } /*-------------------------------------------------------------------------- * hypre_CSRMatrixDiagMatrixFromVectorDevice * * A = diag(v) *--------------------------------------------------------------------------*/ hypre_CSRMatrix * hypre_CSRMatrixDiagMatrixFromVectorDevice(HYPRE_Int n, HYPRE_Complex *v) { hypre_CSRMatrix *A = hypre_CSRMatrixCreate(n, n, n); hypre_CSRMatrixInitialize_v2(A, 0, HYPRE_MEMORY_DEVICE); #if defined(HYPRE_USING_SYCL) hypreSycl_sequence( hypre_CSRMatrixI(A), hypre_CSRMatrixI(A) + n + 1, 0 ); hypreSycl_sequence( hypre_CSRMatrixJ(A), hypre_CSRMatrixJ(A) + n, 0 ); HYPRE_ONEDPL_CALL( std::copy, v, v + n, hypre_CSRMatrixData(A) ); #else HYPRE_THRUST_CALL( sequence, hypre_CSRMatrixI(A), hypre_CSRMatrixI(A) + n + 1, 0 ); HYPRE_THRUST_CALL( sequence, hypre_CSRMatrixJ(A), hypre_CSRMatrixJ(A) + n, 0 ); HYPRE_THRUST_CALL( copy, v, v + n, hypre_CSRMatrixData(A) ); #endif return A; } /*-------------------------------------------------------------------------- * hypre_CSRMatrixDiagMatrixFromMatrixDevice * * B = diagm(A) *--------------------------------------------------------------------------*/ hypre_CSRMatrix * hypre_CSRMatrixDiagMatrixFromMatrixDevice(hypre_CSRMatrix *A, HYPRE_Int type) { HYPRE_Int nrows = hypre_CSRMatrixNumRows(A); HYPRE_Complex *diag = hypre_CTAlloc(HYPRE_Complex, nrows, HYPRE_MEMORY_DEVICE); hypre_CSRMatrixExtractDiagonalDevice(A, diag, type); hypre_CSRMatrix *diag_mat = hypre_CSRMatrixDiagMatrixFromVectorDevice(nrows, diag); hypre_TFree(diag, HYPRE_MEMORY_DEVICE); return diag_mat; } /*-------------------------------------------------------------------------- * adj_functor (Used in hypre_CSRMatrixPermuteDevice) *--------------------------------------------------------------------------*/ #if (defined(THRUST_VERSION) && THRUST_VERSION < 101000) struct adj_functor : public thrust::unary_function #else struct adj_functor #endif { HYPRE_Int *ia_; adj_functor(HYPRE_Int *ia) { ia_ = ia; } __host__ __device__ HYPRE_Int operator()(HYPRE_Int i) const { return ia_[i + 1] - ia_[i]; } }; /*-------------------------------------------------------------------------- * bii_functor (Used in hypre_CSRMatrixPermuteDevice) *--------------------------------------------------------------------------*/ struct bii_functor { HYPRE_Int *p_, *ia_, *ib_, *rb_; bii_functor(HYPRE_Int *p, HYPRE_Int *ia, HYPRE_Int *ib, HYPRE_Int *rb) { p_ = p; ia_ = ia; ib_ = ib; rb_ = rb; } __host__ __device__ void operator()(HYPRE_Int i) const { const HYPRE_Int r = rb_[i]; rb_[i] = ia_[p_[r]] + i - ib_[r]; } }; /*-------------------------------------------------------------------------- * hypre_CSRMatrixPermuteDevice * * See hypre_CSRMatrixPermute. *--------------------------------------------------------------------------*/ HYPRE_Int hypre_CSRMatrixPermuteDevice( hypre_CSRMatrix *A, HYPRE_Int *perm, HYPRE_Int *rqperm, hypre_CSRMatrix *B ) { /* Input matrix */ HYPRE_Int num_rows = hypre_CSRMatrixNumRows(A); HYPRE_Int num_nonzeros = hypre_CSRMatrixNumNonzeros(A); HYPRE_Int *A_i = hypre_CSRMatrixI(A); HYPRE_Int *A_j = hypre_CSRMatrixJ(A); HYPRE_Complex *A_a = hypre_CSRMatrixData(A); HYPRE_Int *B_i = hypre_CSRMatrixI(B); HYPRE_Int *B_j = hypre_CSRMatrixJ(B); HYPRE_Complex *B_a = hypre_CSRMatrixData(B); HYPRE_Int *B_ii; /* Build B_i */ #if defined(HYPRE_USING_SYCL) oneapi::dpl::counting_iterator count(0); hypreSycl_gather(perm, perm + num_rows, oneapi::dpl::make_transform_iterator(count, adj_functor(A_i)), B_i); #else HYPRE_THRUST_CALL(gather, perm, perm + num_rows, thrust::make_transform_iterator(thrust::make_counting_iterator(0), adj_functor(A_i)), B_i); #endif hypreDevice_IntegerExclusiveScan(num_rows + 1, B_i); /* Build B_ii (row indices array) */ B_ii = hypre_TAlloc(HYPRE_Int, num_nonzeros, HYPRE_MEMORY_DEVICE); hypreDevice_CsrRowPtrsToIndices_v2(num_rows, num_nonzeros, B_i, B_ii); #if defined(HYPRE_USING_SYCL) HYPRE_ONEDPL_CALL(std::for_each, count, count + num_nonzeros, bii_functor(perm, A_i, B_i, B_ii)); /* Build B_j and B_a */ hypreSycl_gather( B_ii, B_ii + num_nonzeros, oneapi::dpl::make_zip_iterator(oneapi::dpl::make_permutation_iterator(rqperm, A_j), A_a), oneapi::dpl::make_zip_iterator(B_j, B_a)); #else HYPRE_THRUST_CALL(for_each, thrust::make_counting_iterator(0), thrust::make_counting_iterator(num_nonzeros), bii_functor(perm, A_i, B_i, B_ii)); /* Build B_j and B_a */ HYPRE_THRUST_CALL(gather, B_ii, B_ii + num_nonzeros, thrust::make_zip_iterator(thrust::make_tuple( thrust::make_permutation_iterator(rqperm, A_j), A_a)), thrust::make_zip_iterator(thrust::make_tuple(B_j, B_a))); #endif /* Free memory */ hypre_TFree(B_ii, HYPRE_MEMORY_DEVICE); return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_CSRMatrixTransposeDevice *--------------------------------------------------------------------------*/ HYPRE_Int hypre_CSRMatrixTransposeDevice(hypre_CSRMatrix *A, hypre_CSRMatrix **AT_ptr, HYPRE_Int data) { HYPRE_Complex *A_data = hypre_CSRMatrixData(A); HYPRE_Int *A_i = hypre_CSRMatrixI(A); HYPRE_Int *A_j = hypre_CSRMatrixJ(A); HYPRE_Int nrows_A = hypre_CSRMatrixNumRows(A); HYPRE_Int ncols_A = hypre_CSRMatrixNumCols(A); HYPRE_Int nnz_A = hypre_CSRMatrixNumNonzeros(A); HYPRE_Complex *C_data; HYPRE_Int *C_i; HYPRE_Int *C_j; hypre_CSRMatrix *C; HYPRE_ANNOTATE_FUNC_BEGIN; hypre_GpuProfilingPushRange("CSRMatrixTranspose"); /* trivial case */ if (nnz_A == 0) { C_i = hypre_CTAlloc(HYPRE_Int, ncols_A + 1, HYPRE_MEMORY_DEVICE); C_j = hypre_CTAlloc(HYPRE_Int, 0, HYPRE_MEMORY_DEVICE); C_data = hypre_CTAlloc(HYPRE_Complex, 0, HYPRE_MEMORY_DEVICE); } else { if ( !hypre_HandleSpTransUseVendor(hypre_handle()) ) { #if defined(HYPRE_USING_GPU) hypreDevice_CSRSpTrans(nrows_A, ncols_A, nnz_A, A_i, A_j, A_data, &C_i, &C_j, &C_data, data); #endif } else { #if defined(HYPRE_USING_CUSPARSE) hypreDevice_CSRSpTransCusparse(nrows_A, ncols_A, nnz_A, A_i, A_j, A_data, &C_i, &C_j, &C_data, data); #elif defined(HYPRE_USING_ROCSPARSE) hypreDevice_CSRSpTransRocsparse(nrows_A, ncols_A, nnz_A, A_i, A_j, A_data, &C_i, &C_j, &C_data, data); #elif defined(HYPRE_USING_GPU) hypreDevice_CSRSpTrans(nrows_A, ncols_A, nnz_A, A_i, A_j, A_data, &C_i, &C_j, &C_data, data); #endif } } C = hypre_CSRMatrixCreate(ncols_A, nrows_A, nnz_A); hypre_CSRMatrixI(C) = C_i; hypre_CSRMatrixJ(C) = C_j; hypre_CSRMatrixData(C) = C_data; hypre_CSRMatrixMemoryLocation(C) = HYPRE_MEMORY_DEVICE; *AT_ptr = C; hypre_SyncComputeStream(); hypre_GpuProfilingPopRange(); HYPRE_ANNOTATE_FUNC_END; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_CSRMatrixSortRow *--------------------------------------------------------------------------*/ HYPRE_Int hypre_CSRMatrixSortRow(hypre_CSRMatrix *A) { hypre_GpuProfilingPushRange("CSRMatrixSort"); #if defined(HYPRE_USING_CUSPARSE) hypre_SortCSRCusparse(hypre_CSRMatrixNumRows(A), hypre_CSRMatrixNumCols(A), hypre_CSRMatrixNumNonzeros(A), hypre_CSRMatrixGPUMatDescr(A), hypre_CSRMatrixI(A), hypre_CSRMatrixJ(A), hypre_CSRMatrixData(A)); #elif defined(HYPRE_USING_ROCSPARSE) hypre_SortCSRRocsparse(hypre_CSRMatrixNumRows(A), hypre_CSRMatrixNumCols(A), hypre_CSRMatrixNumNonzeros(A), hypre_CSRMatrixGPUMatDescr(A), hypre_CSRMatrixI(A), hypre_CSRMatrixJ(A), hypre_CSRMatrixData(A)); #elif defined(HYPRE_USING_ONEMKLSPARSE) HYPRE_ONEMKL_CALL( oneapi::mkl::sparse::sort_matrix(*hypre_HandleComputeStream(hypre_handle()), hypre_CSRMatrixGPUMatHandle(A), {}).wait() ); #else HYPRE_UNUSED_VAR(A); hypre_error_w_msg(HYPRE_ERROR_GENERIC, "hypre_CSRMatrixSortRow only implemented for cuSPARSE/rocSPARSE/oneMKLSparse!\n"); #endif hypre_GpuProfilingPopRange(); return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_CSRMatrixSortRowOutOfPlace *--------------------------------------------------------------------------*/ HYPRE_Int hypre_CSRMatrixSortRowOutOfPlace(hypre_CSRMatrix *A) { HYPRE_Int *A_j = hypre_CSRMatrixJ(A); HYPRE_Complex *A_a = hypre_CSRMatrixData(A); HYPRE_Int nnzA = hypre_CSRMatrixNumNonzeros(A); /* if both exist, we assume A has been sorted */ if (hypre_CSRMatrixSortedJ(A) && hypre_CSRMatrixSortedData(A)) { return hypre_error_flag; } hypre_TFree(hypre_CSRMatrixSortedJ(A), HYPRE_MEMORY_DEVICE); hypre_TFree(hypre_CSRMatrixSortedData(A), HYPRE_MEMORY_DEVICE); hypre_CSRMatrixSortedJ(A) = hypre_TAlloc(HYPRE_Int, nnzA, HYPRE_MEMORY_DEVICE); hypre_CSRMatrixSortedData(A) = hypre_TAlloc(HYPRE_Complex, nnzA, HYPRE_MEMORY_DEVICE); hypre_TMemcpy(hypre_CSRMatrixSortedJ(A), A_j, HYPRE_Int, nnzA, HYPRE_MEMORY_DEVICE, HYPRE_MEMORY_DEVICE); hypre_TMemcpy(hypre_CSRMatrixSortedData(A), A_a, HYPRE_Complex, nnzA, HYPRE_MEMORY_DEVICE, HYPRE_MEMORY_DEVICE); hypre_CSRMatrixJ(A) = hypre_CSRMatrixSortedJ(A); hypre_CSRMatrixData(A) = hypre_CSRMatrixSortedData(A); hypre_CSRMatrixSortRow(A); hypre_CSRMatrixJ(A) = A_j; hypre_CSRMatrixData(A) = A_a; return hypre_error_flag; } #if defined(HYPRE_USING_CUSPARSE) /*-------------------------------------------------------------------------- * hypre_SortCSRCusparse * * Sorts values and column indices in each row in ascending order INPLACE * * Parameters: * n: Number of rows [in] * m: Number of columns [in] * nnzA: Number of nonzeros [in] * d_ia: row pointers [in/out] * d_ja_sorted: column indices [in/out] * d_a_sorted: coefficients [in/out] *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SortCSRCusparse( HYPRE_Int n, HYPRE_Int m, HYPRE_Int nnzA, cusparseMatDescr_t descrA, const HYPRE_Int *d_ia, HYPRE_Int *d_ja_sorted, HYPRE_Complex *d_a_sorted ) { cusparseHandle_t cusparsehandle = hypre_HandleCusparseHandle(hypre_handle()); size_t pBufferSizeInBytes = 0; void *pBuffer = NULL; csru2csrInfo_t sortInfoA; hypre_GpuProfilingPushRange("SortCSRCusparse"); HYPRE_CUSPARSE_CALL( cusparseCreateCsru2csrInfo(&sortInfoA) ); HYPRE_CUSPARSE_CALL( hypre_cusparse_csru2csr_bufferSizeExt(cusparsehandle, n, m, nnzA, d_a_sorted, d_ia, d_ja_sorted, sortInfoA, &pBufferSizeInBytes) ); pBuffer = hypre_TAlloc(char, pBufferSizeInBytes, HYPRE_MEMORY_DEVICE); HYPRE_CUSPARSE_CALL( hypre_cusparse_csru2csr(cusparsehandle, n, m, nnzA, descrA, d_a_sorted, d_ia, d_ja_sorted, sortInfoA, pBuffer) ); hypre_TFree(pBuffer, HYPRE_MEMORY_DEVICE); HYPRE_CUSPARSE_CALL(cusparseDestroyCsru2csrInfo(sortInfoA)); hypre_GpuProfilingPopRange(); return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_CSRMatrixTriLowerUpperSolveCusparse *--------------------------------------------------------------------------*/ HYPRE_Int hypre_CSRMatrixTriLowerUpperSolveCusparse(char uplo, HYPRE_Int unit_diag, hypre_CSRMatrix *A, HYPRE_Real *l1_norms, HYPRE_Complex *f_data, HYPRE_Complex *u_data ) { HYPRE_Int num_rows = hypre_CSRMatrixNumRows(A); HYPRE_Int num_nonzeros = hypre_CSRMatrixNumNonzeros(A); HYPRE_Int *A_i = hypre_CSRMatrixI(A); HYPRE_Int *A_j = hypre_CSRMatrixJ(A); HYPRE_Complex *A_a = hypre_CSRMatrixData(A); hypre_CsrsvData *csrsv_data = hypre_CSRMatrixCsrsvData(A); HYPRE_Complex *A_ma; cusparseHandle_t handle = hypre_HandleCusparseHandle(hypre_handle()); cusparseDiagType_t diag_type = unit_diag ? CUSPARSE_DIAG_TYPE_UNIT : CUSPARSE_DIAG_TYPE_NON_UNIT; cusparseFillMode_t fill_mode_L = CUSPARSE_FILL_MODE_LOWER; cusparseFillMode_t fill_mode_U = CUSPARSE_FILL_MODE_UPPER; cusparseOperation_t operation = CUSPARSE_OPERATION_NON_TRANSPOSE; HYPRE_Complex alpha = 1.0; #if CUSPARSE_VERSION >= CUSPARSE_SPSV_VERSION HYPRE_Int num_cols = hypre_CSRMatrixNumCols(A); cusparseSpMatDescr_t matA; cusparseDnVecDescr_t vecF; cusparseDnVecDescr_t vecU; cudaDataType data_type = hypre_HYPREComplexToCudaDataType(); size_t buffer_size; char* buffer_L; char* buffer_U; #else cusparseSolvePolicy_t policy = CUSPARSE_SOLVE_POLICY_USE_LEVEL; cusparseMatDescr_t descr; cusparseStatus_t status; HYPRE_Int *A_sj; hypre_int buffer_size; char* buffer; hypre_int structural_zero; char msg[256]; /* cuSPARSE's legacy API requires sorted rows. Sort and save in CSR's (sj, sa) */ hypre_CSRMatrixSortRowOutOfPlace(A); #endif /* setup csrsvdata in CSR: modify the diagonal (once) */ if (!csrsv_data) { hypre_CSRMatrixCsrsvData(A) = hypre_CsrsvDataCreate(); csrsv_data = hypre_CSRMatrixCsrsvData(A); hypre_CsrsvDataMatData(csrsv_data) = hypre_TAlloc(HYPRE_Complex, num_nonzeros, HYPRE_MEMORY_DEVICE); hypre_CSRMatrixData(A) = hypre_CsrsvDataMatData(csrsv_data); #if CUSPARSE_VERSION >= CUSPARSE_SPSV_VERSION hypre_TMemcpy(hypre_CsrsvDataMatData(csrsv_data), A_a, HYPRE_Complex, num_nonzeros, HYPRE_MEMORY_DEVICE, HYPRE_MEMORY_DEVICE); #else hypre_TMemcpy(hypre_CsrsvDataMatData(csrsv_data), hypre_CSRMatrixSortedData(A), HYPRE_Complex, num_nonzeros, HYPRE_MEMORY_DEVICE, HYPRE_MEMORY_DEVICE); hypre_CSRMatrixJ(A) = hypre_CSRMatrixSortedJ(A); #endif /* if (l1_norms), replace A's diag with l1_norm, and * replace zero diag with inf. so as to skip relaxation for this unknown */ hypre_CSRMatrixReplaceDiagDevice(A, l1_norms, INFINITY, 0.0); hypre_CSRMatrixData(A) = A_a; #if CUSPARSE_VERSION < CUSPARSE_SPSV_VERSION hypre_CSRMatrixJ(A) = A_j; #endif } /* Analysis and Solve */ A_ma = hypre_CsrsvDataMatData(csrsv_data); #if CUSPARSE_VERSION >= CUSPARSE_SPSV_VERSION matA = hypre_CSRMatrixToCusparseSpMat_core(num_rows, num_cols, 0, num_nonzeros, A_i, A_j, A_ma); vecF = hypre_VectorToCusparseDnVec_core(f_data, num_rows); vecU = hypre_VectorToCusparseDnVec_core(u_data, num_cols); HYPRE_CUSPARSE_CALL( cusparseSpMatSetAttribute(matA, CUSPARSE_SPMAT_DIAG_TYPE, &diag_type, sizeof(cusparseDiagType_t)) ); #else A_sj = hypre_CSRMatrixSortedJ(A); descr = hypre_CSRMatrixGPUMatDescr(A); HYPRE_CUSPARSE_CALL( cusparseSetMatDiagType(descr, diag_type) ); #endif if (uplo == 'L') { #if CUSPARSE_VERSION >= CUSPARSE_SPSV_VERSION HYPRE_CUSPARSE_CALL( cusparseSpMatSetAttribute(matA, CUSPARSE_SPMAT_FILL_MODE, &fill_mode_L, sizeof(cusparseFillMode_t)) ); #else HYPRE_CUSPARSE_CALL( cusparseSetMatFillMode(descr, fill_mode_L) ); #endif /* TODO (VPM): move the following block to hypre_CSRMatrixTriSetupCusparse */ if (!hypre_CsrsvDataAnalyzedL(csrsv_data)) { #if CUSPARSE_VERSION >= CUSPARSE_SPSV_VERSION HYPRE_CUSPARSE_CALL( cusparseSpSV_bufferSize(handle, operation, &alpha, matA, vecF, vecU, data_type, CUSPARSE_SPSV_ALG_DEFAULT, hypre_CsrsvDataInfoL(csrsv_data), &buffer_size) ); #else HYPRE_CUSPARSE_CALL( hypre_cusparse_csrsv2_bufferSize(handle, operation, num_rows, num_nonzeros, descr, A_ma, A_i, A_sj, hypre_CsrsvDataInfoL(csrsv_data), &buffer_size) ); #endif #if CUSPARSE_VERSION >= CUSPARSE_SPSV_VERSION if (hypre_CsrsvDataBufferSizeL(csrsv_data) < buffer_size) { buffer_L = hypre_TReAlloc_v2(hypre_CsrsvDataBufferL(csrsv_data), char, hypre_CsrsvDataBufferSizeL(csrsv_data), char, buffer_size, HYPRE_MEMORY_DEVICE); hypre_CsrsvDataBufferL(csrsv_data) = buffer_L; hypre_CsrsvDataBufferSizeL(csrsv_data) = buffer_size; } #else if (hypre_CsrsvDataBufferSize(csrsv_data) < buffer_size) { buffer = hypre_TReAlloc_v2(hypre_CsrsvDataBuffer(csrsv_data), char, hypre_CsrsvDataBufferSize(csrsv_data), char, buffer_size, HYPRE_MEMORY_DEVICE); hypre_CsrsvDataBuffer(csrsv_data) = buffer; hypre_CsrsvDataBufferSize(csrsv_data) = buffer_size; } #endif #if CUSPARSE_VERSION >= CUSPARSE_SPSV_VERSION HYPRE_CUSPARSE_CALL( cusparseSpSV_analysis(handle, operation, &alpha, matA, vecF, vecU, data_type, CUSPARSE_SPSV_ALG_DEFAULT, hypre_CsrsvDataInfoL(csrsv_data), hypre_CsrsvDataBufferL(csrsv_data)) ); #else HYPRE_CUSPARSE_CALL( hypre_cusparse_csrsv2_analysis(handle, operation, num_rows, num_nonzeros, descr, A_ma, A_i, A_sj, hypre_CsrsvDataInfoL(csrsv_data), policy, hypre_CsrsvDataBuffer(csrsv_data)) ); status = cusparseXcsrsv2_zeroPivot(handle, hypre_CsrsvDataInfoL(csrsv_data), &structural_zero); if (CUSPARSE_STATUS_ZERO_PIVOT == status) { hypre_sprintf(msg, "A(%d,%d) is missing\n", structural_zero, structural_zero); hypre_error_w_msg(1, msg); } #endif hypre_CsrsvDataAnalyzedL(csrsv_data) = 1; } #if CUSPARSE_VERSION >= CUSPARSE_SPSV_VERSION HYPRE_CUSPARSE_CALL( cusparseSpSV_solve(handle, operation, &alpha, matA, vecF, vecU, data_type, CUSPARSE_SPSV_ALG_DEFAULT, hypre_CsrsvDataInfoL(csrsv_data)) ); #else HYPRE_CUSPARSE_CALL( hypre_cusparse_csrsv2_solve(handle, operation, num_rows, num_nonzeros, &alpha, descr, A_ma, A_i, A_sj, hypre_CsrsvDataInfoL(csrsv_data), f_data, u_data, policy, hypre_CsrsvDataBuffer(csrsv_data)) ); #endif } else { #if CUSPARSE_VERSION >= CUSPARSE_SPSV_VERSION HYPRE_CUSPARSE_CALL( cusparseSpMatSetAttribute(matA, CUSPARSE_SPMAT_FILL_MODE, &fill_mode_U, sizeof(cusparseFillMode_t)) ); #else HYPRE_CUSPARSE_CALL( cusparseSetMatFillMode(descr, fill_mode_U) ); #endif /* TODO (VPM): move the following block to hypre_CSRMatrixTriSetupCusparse */ if (!hypre_CsrsvDataAnalyzedU(csrsv_data)) { #if CUSPARSE_VERSION >= CUSPARSE_SPSV_VERSION HYPRE_CUSPARSE_CALL( cusparseSpSV_bufferSize(handle, operation, &alpha, matA, vecF, vecU, data_type, CUSPARSE_SPSV_ALG_DEFAULT, hypre_CsrsvDataInfoU(csrsv_data), &buffer_size) ); #else HYPRE_CUSPARSE_CALL( hypre_cusparse_csrsv2_bufferSize(handle, operation, num_rows, num_nonzeros, descr, A_ma, A_i, A_sj, hypre_CsrsvDataInfoU(csrsv_data), &buffer_size) ); #endif #if CUSPARSE_VERSION >= CUSPARSE_SPSV_VERSION if (hypre_CsrsvDataBufferSizeU(csrsv_data) < buffer_size) { buffer_U = hypre_TReAlloc_v2(hypre_CsrsvDataBufferU(csrsv_data), char, hypre_CsrsvDataBufferSizeU(csrsv_data), char, buffer_size, HYPRE_MEMORY_DEVICE); hypre_CsrsvDataBufferU(csrsv_data) = buffer_U; hypre_CsrsvDataBufferSizeU(csrsv_data) = buffer_size; } #else if (hypre_CsrsvDataBufferSize(csrsv_data) < buffer_size) { buffer = hypre_TReAlloc_v2(hypre_CsrsvDataBuffer(csrsv_data), char, hypre_CsrsvDataBufferSize(csrsv_data), char, buffer_size, HYPRE_MEMORY_DEVICE); hypre_CsrsvDataBuffer(csrsv_data) = buffer; hypre_CsrsvDataBufferSize(csrsv_data) = buffer_size; } #endif #if CUSPARSE_VERSION >= CUSPARSE_SPSV_VERSION HYPRE_CUSPARSE_CALL( cusparseSpSV_analysis(handle, operation, &alpha, matA, vecF, vecU, data_type, CUSPARSE_SPSV_ALG_DEFAULT, hypre_CsrsvDataInfoU(csrsv_data), hypre_CsrsvDataBufferU(csrsv_data)) ); #else HYPRE_CUSPARSE_CALL( hypre_cusparse_csrsv2_analysis(handle, operation, num_rows, num_nonzeros, descr, A_ma, A_i, A_sj, hypre_CsrsvDataInfoU(csrsv_data), policy, hypre_CsrsvDataBuffer(csrsv_data)) ); status = cusparseXcsrsv2_zeroPivot(handle, hypre_CsrsvDataInfoU(csrsv_data), &structural_zero); if (CUSPARSE_STATUS_ZERO_PIVOT == status) { hypre_sprintf(msg, "A(%d,%d) is missing\n", structural_zero, structural_zero); hypre_error_w_msg(1, msg); } #endif hypre_CsrsvDataAnalyzedU(csrsv_data) = 1; } #if CUSPARSE_VERSION >= CUSPARSE_SPSV_VERSION HYPRE_CUSPARSE_CALL( cusparseSpSV_solve(handle, operation, &alpha, matA, vecF, vecU, data_type, CUSPARSE_SPSV_ALG_DEFAULT, hypre_CsrsvDataInfoU(csrsv_data)) ); #else HYPRE_CUSPARSE_CALL( hypre_cusparse_csrsv2_solve(handle, operation, num_rows, num_nonzeros, &alpha, descr, A_ma, A_i, A_sj, hypre_CsrsvDataInfoU(csrsv_data), f_data, u_data, policy, hypre_CsrsvDataBuffer(csrsv_data)) ); #endif } /* Free memory */ #if CUSPARSE_VERSION >= CUSPARSE_SPSV_VERSION HYPRE_CUSPARSE_CALL( cusparseDestroySpMat(matA) ); HYPRE_CUSPARSE_CALL( cusparseDestroyDnVec(vecF) ); HYPRE_CUSPARSE_CALL( cusparseDestroyDnVec(vecU) ); #endif return hypre_error_flag; } #elif defined(HYPRE_USING_ROCSPARSE) /*-------------------------------------------------------------------------- * hypre_CSRMatrixTriLowerUpperSolveRocsparse *--------------------------------------------------------------------------*/ HYPRE_Int hypre_CSRMatrixTriLowerUpperSolveRocsparse(char uplo, HYPRE_Int unit_diag, hypre_CSRMatrix *A, HYPRE_Real *l1_norms, HYPRE_Complex *f_data, HYPRE_Complex *u_data ) { HYPRE_Int num_rows = hypre_CSRMatrixNumRows(A); HYPRE_Int num_nonzeros = hypre_CSRMatrixNumNonzeros(A); HYPRE_Int *A_i = hypre_CSRMatrixI(A); HYPRE_Int *A_j = hypre_CSRMatrixJ(A); HYPRE_Complex *A_a = hypre_CSRMatrixData(A); hypre_CsrsvData *csrsv_data = hypre_CSRMatrixCsrsvData(A); rocsparse_handle handle = hypre_HandleCusparseHandle(hypre_handle()); rocsparse_mat_descr descr = hypre_CSRMatrixGPUMatDescr(A); HYPRE_Int *A_sj; HYPRE_Complex *A_ma; rocsparse_status status; rocsparse_diag_type diag_type = unit_diag ? rocsparse_diag_type_unit : rocsparse_diag_type_non_unit; HYPRE_Complex alpha = 1.0; hypre_int structural_zero; size_t buffer_size; char *buffer; char msg[256]; /* rocSPARSE requires sorted rows. Sort and save in CSR's (sj, sa) */ hypre_CSRMatrixSortRowOutOfPlace(A); /* Setup csrsvdata in CSR: modify the diagonal (once) */ if (!csrsv_data) { hypre_CSRMatrixCsrsvData(A) = hypre_CsrsvDataCreate(); csrsv_data = hypre_CSRMatrixCsrsvData(A); hypre_CsrsvDataMatData(csrsv_data) = hypre_TAlloc(HYPRE_Complex, num_nonzeros, HYPRE_MEMORY_DEVICE); hypre_CSRMatrixData(A) = hypre_CsrsvDataMatData(csrsv_data); hypre_TMemcpy(hypre_CsrsvDataMatData(csrsv_data), hypre_CSRMatrixSortedData(A), HYPRE_Complex, num_nonzeros, HYPRE_MEMORY_DEVICE, HYPRE_MEMORY_DEVICE); hypre_CSRMatrixJ(A) = hypre_CSRMatrixSortedJ(A); /* if (l1_norms), replace A's diag with l1_norm, and * replace zero diag with inf. so as to skip relaxation for this unknown */ hypre_CSRMatrixReplaceDiagDevice(A, l1_norms, INFINITY, 0.0); hypre_CSRMatrixData(A) = A_a; hypre_CSRMatrixJ(A) = A_j; } /* Analysis and Solve */ buffer = hypre_CsrsvDataBuffer(csrsv_data); A_ma = hypre_CsrsvDataMatData(csrsv_data); A_sj = hypre_CSRMatrixSortedJ(A); /* Set matrix diagonal type */ HYPRE_ROCSPARSE_CALL( rocsparse_set_mat_diag_type(descr, diag_type) ); if (uplo == 'L') { HYPRE_ROCSPARSE_CALL( rocsparse_set_mat_fill_mode(descr, rocsparse_fill_mode_lower) ); /* TODO (VPM): move the following block to hypre_CSRMatrixTriSetupRocsparse */ if (!hypre_CsrsvDataAnalyzedL(csrsv_data)) { HYPRE_ROCSPARSE_CALL( hypre_rocsparse_csrsv_buffer_size(handle, rocsparse_operation_none, num_rows, num_nonzeros, descr, A_ma, A_i, A_sj, hypre_CsrsvDataInfoL(csrsv_data), &buffer_size) ); if (hypre_CsrsvDataBufferSize(csrsv_data) < buffer_size) { buffer = hypre_TReAlloc_v2(hypre_CsrsvDataBuffer(csrsv_data), char, hypre_CsrsvDataBufferSize(csrsv_data), char, buffer_size, HYPRE_MEMORY_DEVICE); hypre_CsrsvDataBuffer(csrsv_data) = buffer; hypre_CsrsvDataBufferSize(csrsv_data) = buffer_size; } HYPRE_ROCSPARSE_CALL( hypre_rocsparse_csrsv_analysis(handle, rocsparse_operation_none, num_rows, num_nonzeros, descr, A_ma, A_i, A_sj, hypre_CsrsvDataInfoL(csrsv_data), rocsparse_analysis_policy_reuse, rocsparse_solve_policy_auto, buffer) ); status = rocsparse_csrsv_zero_pivot(handle, descr, hypre_CsrsvDataInfoL(csrsv_data), &structural_zero); if (rocsparse_status_zero_pivot == status) { hypre_sprintf(msg, "hypre_CSRMatrixTriLowerUpperSolveRocsparse A(%d,%d) is missing\n", structural_zero, structural_zero); hypre_error_w_msg(1, msg); } hypre_CsrsvDataAnalyzedL(csrsv_data) = 1; } HYPRE_ROCSPARSE_CALL( hypre_rocsparse_csrsv_solve(handle, rocsparse_operation_none, num_rows, num_nonzeros, &alpha, descr, A_ma, A_i, A_sj, hypre_CsrsvDataInfoL(csrsv_data), f_data, u_data, rocsparse_solve_policy_auto, buffer) ); } else { HYPRE_ROCSPARSE_CALL( rocsparse_set_mat_fill_mode(descr, rocsparse_fill_mode_upper) ); /* TODO (VPM): move the following block to hypre_CSRMatrixTriSetupRocsparse */ if (!hypre_CsrsvDataAnalyzedU(csrsv_data)) { HYPRE_ROCSPARSE_CALL( hypre_rocsparse_csrsv_buffer_size(handle, rocsparse_operation_none, num_rows, num_nonzeros, descr, A_ma, A_i, A_sj, hypre_CsrsvDataInfoU(csrsv_data), &buffer_size) ); if (hypre_CsrsvDataBufferSize(csrsv_data) < buffer_size) { buffer = hypre_TReAlloc_v2(hypre_CsrsvDataBuffer(csrsv_data), char, hypre_CsrsvDataBufferSize(csrsv_data), char, buffer_size, HYPRE_MEMORY_DEVICE); hypre_CsrsvDataBuffer(csrsv_data) = buffer; hypre_CsrsvDataBufferSize(csrsv_data) = buffer_size; } HYPRE_ROCSPARSE_CALL( hypre_rocsparse_csrsv_analysis(handle, rocsparse_operation_none, num_rows, num_nonzeros, descr, A_ma, A_i, A_sj, hypre_CsrsvDataInfoU(csrsv_data), rocsparse_analysis_policy_reuse, rocsparse_solve_policy_auto, buffer) ); status = rocsparse_csrsv_zero_pivot(handle, descr, hypre_CsrsvDataInfoU(csrsv_data), &structural_zero); if (rocsparse_status_zero_pivot == status) { hypre_sprintf(msg, "hypre_CSRMatrixTriLowerUpperSolveRocsparse A(%d,%d) is missing\n", structural_zero, structural_zero); hypre_error_w_msg(1, msg); } hypre_CsrsvDataAnalyzedU(csrsv_data) = 1; } HYPRE_ROCSPARSE_CALL( hypre_rocsparse_csrsv_solve(handle, rocsparse_operation_none, num_rows, num_nonzeros, &alpha, descr, A_ma, A_i, A_sj, hypre_CsrsvDataInfoU(csrsv_data), f_data, u_data, rocsparse_solve_policy_auto, buffer) ); } return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_SortCSRRocsparse * * @brief This functions sorts values and column indices in each row in * ascending order OUT-OF-PLACE * * @param[in] n Number of rows * @param[in] m Number of columns * @param[in] nnzA Number of nonzeroes * @param[in] *d_ia (Unsorted) Row indices * @param[in,out] *d_ja_sorted On Start: Unsorted column indices. * On return: Sorted column indices * @param[in,out] *d_a_sorted On Start: Unsorted values. * On Return: Sorted values corresponding with * column indices *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SortCSRRocsparse( HYPRE_Int n, HYPRE_Int m, HYPRE_Int num_nonzeros, rocsparse_mat_descr descrA, const HYPRE_Int *d_ia, HYPRE_Int *d_ja_sorted, HYPRE_Complex *d_a_sorted ) { rocsparse_handle handle = hypre_HandleCusparseHandle(hypre_handle()); size_t pBufferSizeInBytes = 0; void *pBuffer = NULL; HYPRE_Int *P = NULL; HYPRE_Complex *d_a_tmp; // FIXME: There is not in-place version of csr sort in rocSPARSE currently, so we make // a temporary copy of the data for gthr, sort that, and then copy the sorted values // back to the array being returned. Where there is an in-place version available, // we should use it. d_a_tmp = hypre_TAlloc(HYPRE_Complex, num_nonzeros, HYPRE_MEMORY_DEVICE); HYPRE_ROCSPARSE_CALL( rocsparse_csrsort_buffer_size(handle, n, m, num_nonzeros, d_ia, d_ja_sorted, &pBufferSizeInBytes) ); pBuffer = hypre_TAlloc(char, pBufferSizeInBytes, HYPRE_MEMORY_DEVICE); P = hypre_TAlloc(HYPRE_Int, num_nonzeros, HYPRE_MEMORY_DEVICE); HYPRE_ROCSPARSE_CALL( rocsparse_create_identity_permutation(handle, num_nonzeros, P) ); HYPRE_ROCSPARSE_CALL( rocsparse_csrsort(handle, n, m, num_nonzeros, descrA, d_ia, d_ja_sorted, P, pBuffer) ); HYPRE_ROCSPARSE_CALL( hypre_rocsparse_gthr(handle, num_nonzeros, d_a_sorted, d_a_tmp, P, rocsparse_index_base_zero) ); hypre_TFree(pBuffer, HYPRE_MEMORY_DEVICE); hypre_TFree(P, HYPRE_MEMORY_DEVICE); hypre_TMemcpy(d_a_sorted, d_a_tmp, HYPRE_Complex, num_nonzeros, HYPRE_MEMORY_DEVICE, HYPRE_MEMORY_DEVICE); hypre_TFree(d_a_tmp, HYPRE_MEMORY_DEVICE); return hypre_error_flag; } #elif defined(HYPRE_USING_ONEMKLSPARSE) /*-------------------------------------------------------------------------- * hypre_CSRMatrixTriLowerUpperSolveOnemklsparse *--------------------------------------------------------------------------*/ HYPRE_Int hypre_CSRMatrixTriLowerUpperSolveOnemklsparse(char uplo, HYPRE_Int unit_diag, hypre_CSRMatrix *A, HYPRE_Real *l1_norms, HYPRE_Complex *f_data, HYPRE_Complex *u_data ) { HYPRE_Int *A_j = hypre_CSRMatrixJ(A); HYPRE_Complex *A_a = hypre_CSRMatrixData(A); oneapi::mkl::sparse::matrix_handle_t handle_A = hypre_CSRMatrixGPUMatHandle(A); hypre_CsrsvData *csrsv_data = hypre_CSRMatrixCsrsvData(A); /* Generate sorted matrix */ hypre_CSRMatrixSortRowOutOfPlace(A); /* Generate csrsv data if necessary */ if (!csrsv_data) { hypre_CSRMatrixCsrsvData(A) = hypre_CsrsvDataCreate(); csrsv_data = hypre_CSRMatrixCsrsvData(A); hypre_CsrsvDataMatData(csrsv_data) = hypre_TAlloc(HYPRE_Complex, hypre_CSRMatrixNumNonzeros(A), HYPRE_MEMORY_DEVICE); /* Copy the sorted data to csrsv mat data */ hypre_TMemcpy(hypre_CsrsvDataMatData(csrsv_data), hypre_CSRMatrixSortedData(A), HYPRE_Complex, hypre_CSRMatrixNumNonzeros(A), HYPRE_MEMORY_DEVICE, HYPRE_MEMORY_DEVICE); /* if (l1_norms), replace A's diag with l1_norm, and * replace zero diag with inf. so as to skip relaxation for this unknown */ hypre_CSRMatrixData(A) = hypre_CsrsvDataMatData(csrsv_data); hypre_CSRMatrixJ(A) = hypre_CSRMatrixSortedJ(A); hypre_CSRMatrixReplaceDiagDevice(A, l1_norms, INFINITY, 0.0); } /* Use sorted column indices and sorted matrix data with modified diagonal */ hypre_CSRMatrixJ(A) = hypre_CSRMatrixSortedJ(A); hypre_CSRMatrixData(A) = hypre_CsrsvDataMatData(csrsv_data); hypre_GPUMatDataSetCSRData(A); /* Do optimization the first time */ if ( (!hypre_CsrsvDataAnalyzedL(csrsv_data) && uplo == 'L') || (!hypre_CsrsvDataAnalyzedU(csrsv_data) && uplo == 'U') ) { HYPRE_ONEMKL_CALL( oneapi::mkl::sparse::optimize_trsv( *hypre_HandleComputeStream(hypre_handle()), (uplo == 'L') ? oneapi::mkl::uplo::L : oneapi::mkl::uplo::U, oneapi::mkl::transpose::N, unit_diag ? oneapi::mkl::diag::U : oneapi::mkl::diag::N, handle_A, {} ).wait() ); } /* Do the triangular solve */ HYPRE_ONEMKL_CALL( oneapi::mkl::sparse::trsv( *hypre_HandleComputeStream(hypre_handle()), (uplo == 'L') ? oneapi::mkl::uplo::L : oneapi::mkl::uplo::U, oneapi::mkl::transpose::N, unit_diag ? oneapi::mkl::diag::U : oneapi::mkl::diag::N, 1.0, handle_A, f_data, u_data, {} ).wait() ); /* Restore the original matrix data */ hypre_CSRMatrixJ(A) = A_j; hypre_CSRMatrixData(A) = A_a; hypre_GPUMatDataSetCSRData(A); return hypre_error_flag; } #endif // #if defined(HYPRE_USING_CUSPARSE) #elif defined(HYPRE_USING_ROCSPARSE) #if defined(HYPRE_USING_CUSPARSE) || defined(HYPRE_USING_ROCSPARSE) /*-------------------------------------------------------------------------- * hypre_CSRMatrixILU0 * * TODO (VPM): Change this function's name to hypre_ILU0SetupDevice? *--------------------------------------------------------------------------*/ HYPRE_Int hypre_CSRMatrixILU0(hypre_CSRMatrix *A) { /* Input matrix data */ HYPRE_Int num_rows = hypre_CSRMatrixNumRows(A); HYPRE_Int num_cols = hypre_CSRMatrixNumCols(A); HYPRE_Int num_nonzeros = hypre_CSRMatrixNumNonzeros(A); HYPRE_Int *A_i = hypre_CSRMatrixI(A); HYPRE_Int *A_j = hypre_CSRMatrixJ(A); HYPRE_Complex *A_data = hypre_CSRMatrixData(A); /* Vendor math sparse libraries data */ #if defined(HYPRE_USING_CUSPARSE) csrilu02Info_t matA_info = NULL; cusparseHandle_t handle = hypre_HandleCusparseHandle(hypre_handle()); cusparseMatDescr_t descr = hypre_CSRMatrixGPUMatDescr(A); cusparseSolvePolicy_t analysis_policy = CUSPARSE_SOLVE_POLICY_USE_LEVEL; cusparseSolvePolicy_t solve_policy = CUSPARSE_SOLVE_POLICY_USE_LEVEL; cusparseStatus_t status; HYPRE_Int buffer_size; #elif defined(HYPRE_USING_ROCSPARSE) rocsparse_mat_info matA_info = NULL; rocsparse_handle handle = hypre_HandleCusparseHandle(hypre_handle()); rocsparse_mat_descr descr = hypre_CSRMatrixGPUMatDescr(A); rocsparse_analysis_policy analysis_policy = rocsparse_analysis_policy_reuse; rocsparse_solve_policy solve_policy = rocsparse_solve_policy_auto; rocsparse_status status; size_t buffer_size; #endif void *buffer = NULL; HYPRE_Int zero_pivot; char errmsg[1024]; /* Sanity check */ if (num_rows != num_cols) { hypre_error_w_msg(HYPRE_ERROR_GENERIC, "Not a square matrix!"); return hypre_error_flag; } HYPRE_ANNOTATE_FUNC_BEGIN; hypre_GpuProfilingPushRange("CSRMatrixILU0"); /*------------------------------------------------------------------------------------- * 1. Sort columns inside each row first, we can't assume that's sorted *-------------------------------------------------------------------------------------*/ hypre_CSRMatrixSortRow(A); /*------------------------------------------------------------------------------------- * 2. Create info for ilu setup and solve *-------------------------------------------------------------------------------------*/ #if defined(HYPRE_USING_CUSPARSE) HYPRE_CUSPARSE_CALL(cusparseCreateCsrilu02Info(&matA_info)); #elif defined(HYPRE_USING_ROCSPARSE) HYPRE_ROCSPARSE_CALL(rocsparse_create_mat_info(&matA_info)); #endif /*------------------------------------------------------------------------------------- * 3. Get work array size *-------------------------------------------------------------------------------------*/ #if defined(HYPRE_USING_CUSPARSE) HYPRE_CUSPARSE_CALL(hypre_cusparse_csrilu02_bufferSize(handle, num_rows, num_nonzeros, descr, A_data, A_i, A_j, matA_info, &buffer_size)); #elif defined(HYPRE_USING_ROCSPARSE) HYPRE_ROCSPARSE_CALL(hypre_rocsparse_csrilu0_buffer_size(handle, num_rows, num_nonzeros, descr, A_data, A_i, A_j, matA_info, &buffer_size)); #endif /*------------------------------------------------------------------------------------- * 4. Create work array on the device *-------------------------------------------------------------------------------------*/ buffer = hypre_TAlloc(char, buffer_size, HYPRE_MEMORY_DEVICE); /*------------------------------------------------------------------------------------- * 5.1 Perform the analysis *-------------------------------------------------------------------------------------*/ hypre_GpuProfilingPushRange("Analysis"); #if defined(HYPRE_USING_CUSPARSE) HYPRE_CUSPARSE_CALL(hypre_cusparse_csrilu02_analysis(handle, num_rows, num_nonzeros, descr, A_data, A_i, A_j, matA_info, analysis_policy, buffer)); #elif defined(HYPRE_USING_ROCSPARSE) HYPRE_ROCSPARSE_CALL(hypre_rocsparse_csrilu0_analysis(handle, num_rows, num_nonzeros, descr, A_data, A_i, A_j, matA_info, analysis_policy, solve_policy, buffer)); #endif hypre_GpuProfilingPopRange(); /*------------------------------------------------------------------------------------- * 5.2. Check for zero pivots *-------------------------------------------------------------------------------------*/ #if defined(HYPRE_USING_CUSPARSE) status = cusparseXcsrilu02_zeroPivot(handle, matA_info, &zero_pivot); if (status == CUSPARSE_STATUS_ZERO_PIVOT) { hypre_sprintf(errmsg, "hypre_ILU: found zero pivot at A(%d, %d) after analysis\n", zero_pivot, zero_pivot); hypre_error_w_msg(HYPRE_ERROR_GENERIC, errmsg); return hypre_error_flag; } else if (status != CUSPARSE_STATUS_SUCCESS) { hypre_sprintf(errmsg, "cuSPARSE ERROR (code = %d, %s) at %s:%d\n", status, cusparseGetErrorString(status), __FILE__, __LINE__); hypre_error_w_msg(HYPRE_ERROR_GENERIC, errmsg); return hypre_error_flag; } #elif defined(HYPRE_USING_ROCSPARSE) status = rocsparse_csrsv_zero_pivot(handle, descr, matA_info, &zero_pivot); if (status == rocsparse_status_zero_pivot) { hypre_sprintf(errmsg, "hypre_ILU: found zero pivot at A(%d, %d) after analysis\n", zero_pivot, zero_pivot); hypre_error_w_msg(HYPRE_ERROR_GENERIC, errmsg); return hypre_error_flag; } else if (status != rocsparse_status_success) { hypre_sprintf(errmsg, "rocSPARSE ERROR (code = %d) at %s:%d\n", status, __FILE__, __LINE__); hypre_error_w_msg(HYPRE_ERROR_GENERIC, errmsg); return hypre_error_flag; } #endif /*------------------------------------------------------------------------------------- * 6.1 Compute the numerical factorization *-------------------------------------------------------------------------------------*/ hypre_GpuProfilingPushRange("Factorization"); #if defined(HYPRE_USING_CUSPARSE) HYPRE_CUSPARSE_CALL(hypre_cusparse_csrilu02(handle, num_rows, num_nonzeros, descr, A_data, A_i, A_j, matA_info, solve_policy, buffer)); #elif defined(HYPRE_USING_ROCSPARSE) HYPRE_ROCSPARSE_CALL(hypre_rocsparse_csrilu0(handle, num_rows, num_nonzeros, descr, A_data, A_i, A_j, matA_info, solve_policy, buffer)); #endif hypre_GpuProfilingPopRange(); /*------------------------------------------------------------------------------------- * 6.2 Check for zero pivots *-------------------------------------------------------------------------------------*/ #if defined(HYPRE_USING_CUSPARSE) status = cusparseXcsrilu02_zeroPivot(handle, matA_info, &zero_pivot); if (status == CUSPARSE_STATUS_ZERO_PIVOT) { hypre_sprintf(errmsg, "hypre_ILU: found zero pivot at A(%d, %d) after factorization\n", zero_pivot, zero_pivot); hypre_error_w_msg(HYPRE_ERROR_GENERIC, errmsg); return hypre_error_flag; } else if (status != CUSPARSE_STATUS_SUCCESS) { hypre_sprintf(errmsg, "cuSPARSE ERROR (code = %d, %s) at %s:%d\n", status, cusparseGetErrorString(status), __FILE__, __LINE__); hypre_error_w_msg(HYPRE_ERROR_GENERIC, errmsg); return hypre_error_flag; } #elif defined(HYPRE_USING_ROCSPARSE) status = rocsparse_csrsv_zero_pivot(handle, descr, matA_info, &zero_pivot); if (status == rocsparse_status_zero_pivot) { hypre_sprintf(errmsg, "hypre_ILU: found zero pivot at A(%d, %d) after factorization\n", zero_pivot, zero_pivot); hypre_error_w_msg(HYPRE_ERROR_GENERIC, errmsg); return hypre_error_flag; } else if (status != rocsparse_status_success) { hypre_sprintf(errmsg, "rocSPARSE ERROR (code = %d) at %s:%d\n", status, __FILE__, __LINE__); hypre_error_w_msg(HYPRE_ERROR_GENERIC, errmsg); return hypre_error_flag; } #endif /*------------------------------------------------------------------------------------- * 7. Free memory *-------------------------------------------------------------------------------------*/ #if defined(HYPRE_USING_CUSPARSE) HYPRE_CUSPARSE_CALL(cusparseDestroyCsrilu02Info(matA_info)); #elif defined(HYPRE_USING_ROCSPARSE) HYPRE_ROCSPARSE_CALL(rocsparse_destroy_mat_info(matA_info)); #endif /* Free buffer */ hypre_TFree(buffer, HYPRE_MEMORY_DEVICE); hypre_GpuProfilingPopRange(); HYPRE_ANNOTATE_FUNC_END; return hypre_error_flag; } #endif /* #if defined(HYPRE_USING_CUSPARSE) || defined(HYPRE_USING_ROCSPARSE) */ /*-------------------------------------------------------------------------- * hypre_CSRMatrixSpMVAnalysisDevice *--------------------------------------------------------------------------*/ HYPRE_Int hypre_CSRMatrixSpMVAnalysisDevice(hypre_CSRMatrix *matrix) { #if defined(HYPRE_USING_ROCSPARSE) HYPRE_ExecutionPolicy exec = hypre_GetExecPolicy1( hypre_CSRMatrixMemoryLocation(matrix) ); rocsparse_handle handle = hypre_HandleCusparseHandle(hypre_handle()); if (exec == HYPRE_EXEC_DEVICE) { HYPRE_ROCSPARSE_CALL( hypre_rocsparse_csrmv_analysis(handle, rocsparse_operation_none, hypre_CSRMatrixNumRows(matrix), hypre_CSRMatrixNumCols(matrix), hypre_CSRMatrixNumNonzeros(matrix), hypre_CSRMatrixGPUMatDescr(matrix), hypre_CSRMatrixData(matrix), hypre_CSRMatrixI(matrix), hypre_CSRMatrixJ(matrix), hypre_CSRMatrixGPUMatInfo(matrix)) ); } #else HYPRE_UNUSED_VAR(matrix); #endif /* #if defined(HYPRE_USING_ROCSPARSE) */ return hypre_error_flag; } #endif /* #if defined(HYPRE_USING_GPU) */ hypre-2.33.0/src/seq_mv/csr_matrix.c000066400000000000000000001314701477326011500173420ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * Member functions for hypre_CSRMatrix class. * *****************************************************************************/ #include "seq_mv.h" #ifdef HYPRE_PROFILE HYPRE_Real hypre_profile_times[HYPRE_TIMER_ID_COUNT] = { 0 }; #endif /*-------------------------------------------------------------------------- * hypre_CSRMatrixCreate *--------------------------------------------------------------------------*/ hypre_CSRMatrix * hypre_CSRMatrixCreate( HYPRE_Int num_rows, HYPRE_Int num_cols, HYPRE_Int num_nonzeros ) { hypre_CSRMatrix *matrix; matrix = hypre_CTAlloc(hypre_CSRMatrix, 1, HYPRE_MEMORY_HOST); hypre_CSRMatrixData(matrix) = NULL; hypre_CSRMatrixI(matrix) = NULL; hypre_CSRMatrixJ(matrix) = NULL; hypre_CSRMatrixBigJ(matrix) = NULL; hypre_CSRMatrixRownnz(matrix) = NULL; hypre_CSRMatrixNumRows(matrix) = num_rows; hypre_CSRMatrixNumRownnz(matrix) = num_rows; hypre_CSRMatrixNumCols(matrix) = num_cols; hypre_CSRMatrixNumNonzeros(matrix) = num_nonzeros; hypre_CSRMatrixMemoryLocation(matrix) = hypre_HandleMemoryLocation(hypre_handle()); /* set defaults */ hypre_CSRMatrixOwnsData(matrix) = 1; #if defined(HYPRE_USING_CUSPARSE) || defined(HYPRE_USING_ROCSPARSE) || defined(HYPRE_USING_ONEMKLSPARSE) hypre_CSRMatrixSortedJ(matrix) = NULL; hypre_CSRMatrixSortedData(matrix) = NULL; hypre_CSRMatrixCsrsvData(matrix) = NULL; #endif return matrix; } /*-------------------------------------------------------------------------- * hypre_CSRMatrixDestroy *--------------------------------------------------------------------------*/ HYPRE_Int hypre_CSRMatrixDestroy( hypre_CSRMatrix *matrix ) { if (matrix) { HYPRE_MemoryLocation memory_location = hypre_CSRMatrixMemoryLocation(matrix); hypre_TFree(hypre_CSRMatrixI(matrix), memory_location); hypre_TFree(hypre_CSRMatrixRownnz(matrix), memory_location); if ( hypre_CSRMatrixOwnsData(matrix) ) { hypre_TFree(hypre_CSRMatrixData(matrix), memory_location); hypre_TFree(hypre_CSRMatrixJ(matrix), memory_location); /* RL: TODO There might be cases BigJ cannot be freed FIXME * Not so clear how to do it */ hypre_TFree(hypre_CSRMatrixBigJ(matrix), memory_location); } #if defined(HYPRE_USING_CUSPARSE) || defined(HYPRE_USING_ROCSPARSE) || defined(HYPRE_USING_ONEMKLSPARSE) hypre_TFree(hypre_CSRMatrixSortedData(matrix), memory_location); hypre_TFree(hypre_CSRMatrixSortedJ(matrix), memory_location); hypre_CsrsvDataDestroy(hypre_CSRMatrixCsrsvData(matrix)); hypre_GpuMatDataDestroy(hypre_CSRMatrixGPUMatData(matrix)); #endif hypre_TFree(matrix, HYPRE_MEMORY_HOST); } return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_CSRMatrixInitialize *--------------------------------------------------------------------------*/ HYPRE_Int hypre_CSRMatrixInitialize_v2( hypre_CSRMatrix *matrix, HYPRE_Int bigInit, HYPRE_MemoryLocation memory_location ) { HYPRE_Int num_rows = hypre_CSRMatrixNumRows(matrix); HYPRE_Int num_nonzeros = hypre_CSRMatrixNumNonzeros(matrix); /* HYPRE_Int num_rownnz = hypre_CSRMatrixNumRownnz(matrix); */ hypre_CSRMatrixMemoryLocation(matrix) = memory_location; /* Caveat: for pre-existing i, j, data, their memory location must be guaranteed to be consistent with `memory_location' * Otherwise, mismatches will exist and problems will be encountered when being used, and freed */ if ( !hypre_CSRMatrixData(matrix) && num_nonzeros ) { hypre_CSRMatrixData(matrix) = hypre_CTAlloc(HYPRE_Complex, num_nonzeros, memory_location); } /* else { //if (PointerAttributes(hypre_CSRMatrixData(matrix))==HYPRE_HOST_POINTER) printf("MATREIX INITIAL WITH JHOST DATA\n"); } */ if ( !hypre_CSRMatrixI(matrix) ) { hypre_CSRMatrixI(matrix) = hypre_CTAlloc(HYPRE_Int, num_rows + 1, memory_location); } /* if (!hypre_CSRMatrixRownnz(matrix)) { hypre_CSRMatrixRownnz(matrix) = hypre_CTAlloc(HYPRE_Int, num_rownnz, memory_location); } */ if (bigInit) { if ( !hypre_CSRMatrixBigJ(matrix) && num_nonzeros ) { hypre_CSRMatrixBigJ(matrix) = hypre_CTAlloc(HYPRE_BigInt, num_nonzeros, memory_location); } } else { if ( !hypre_CSRMatrixJ(matrix) && num_nonzeros ) { hypre_CSRMatrixJ(matrix) = hypre_CTAlloc(HYPRE_Int, num_nonzeros, memory_location); } } return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_CSRMatrixInitialize *--------------------------------------------------------------------------*/ HYPRE_Int hypre_CSRMatrixInitialize( hypre_CSRMatrix *matrix ) { return hypre_CSRMatrixInitialize_v2( matrix, 0, hypre_CSRMatrixMemoryLocation(matrix) ); } /*-------------------------------------------------------------------------- * hypre_CSRMatrixResize *--------------------------------------------------------------------------*/ HYPRE_Int hypre_CSRMatrixResize( hypre_CSRMatrix *matrix, HYPRE_Int new_num_rows, HYPRE_Int new_num_cols, HYPRE_Int new_num_nonzeros ) { HYPRE_MemoryLocation memory_location = hypre_CSRMatrixMemoryLocation(matrix); HYPRE_Int old_num_nonzeros = hypre_CSRMatrixNumNonzeros(matrix); HYPRE_Int old_num_rows = hypre_CSRMatrixNumRows(matrix); if (!hypre_CSRMatrixOwnsData(matrix)) { hypre_error_w_msg(HYPRE_ERROR_GENERIC, "Error: called hypre_CSRMatrixResize on a matrix that doesn't own the data\n"); return hypre_error_flag; } hypre_CSRMatrixNumCols(matrix) = new_num_cols; if (new_num_nonzeros != hypre_CSRMatrixNumNonzeros(matrix)) { hypre_CSRMatrixNumNonzeros(matrix) = new_num_nonzeros; if (!hypre_CSRMatrixData(matrix)) { hypre_CSRMatrixData(matrix) = hypre_CTAlloc(HYPRE_Complex, new_num_nonzeros, memory_location); } else { hypre_CSRMatrixData(matrix) = hypre_TReAlloc_v2(hypre_CSRMatrixData(matrix), HYPRE_Complex, old_num_nonzeros, HYPRE_Complex, new_num_nonzeros, memory_location); } if (hypre_CSRMatrixBigJ(matrix)) { hypre_CSRMatrixBigJ(matrix) = hypre_TReAlloc_v2(hypre_CSRMatrixBigJ(matrix), HYPRE_BigInt, old_num_nonzeros, HYPRE_BigInt, new_num_nonzeros, memory_location); } else { if (!hypre_CSRMatrixJ(matrix)) { hypre_CSRMatrixJ(matrix) = hypre_CTAlloc(HYPRE_Int, new_num_nonzeros, memory_location); } else { hypre_CSRMatrixJ(matrix) = hypre_TReAlloc_v2(hypre_CSRMatrixJ(matrix), HYPRE_Int, old_num_nonzeros, HYPRE_Int, new_num_nonzeros, memory_location); } } } if (new_num_rows != hypre_CSRMatrixNumRows(matrix)) { hypre_CSRMatrixNumRows(matrix) = new_num_rows; if (!hypre_CSRMatrixI(matrix)) { hypre_CSRMatrixI(matrix) = hypre_CTAlloc(HYPRE_Int, new_num_rows + 1, memory_location); } else { hypre_CSRMatrixI(matrix) = hypre_TReAlloc_v2(hypre_CSRMatrixI(matrix), HYPRE_Int, old_num_rows + 1, HYPRE_Int, new_num_rows + 1, memory_location); } } return 0; } /*-------------------------------------------------------------------------- * hypre_CSRMatrixBigInitialize *--------------------------------------------------------------------------*/ HYPRE_Int hypre_CSRMatrixBigInitialize( hypre_CSRMatrix *matrix ) { return hypre_CSRMatrixInitialize_v2( matrix, 1, hypre_CSRMatrixMemoryLocation(matrix) ); } /*-------------------------------------------------------------------------- * hypre_CSRMatrixBigJtoJ * RL: TODO GPU impl. *--------------------------------------------------------------------------*/ HYPRE_Int hypre_CSRMatrixBigJtoJ( hypre_CSRMatrix *matrix ) { HYPRE_Int num_nonzeros = hypre_CSRMatrixNumNonzeros(matrix); HYPRE_BigInt *matrix_big_j = hypre_CSRMatrixBigJ(matrix); HYPRE_Int *matrix_j = NULL; if (num_nonzeros && matrix_big_j) { #if defined(HYPRE_MIXEDINT) || defined(HYPRE_BIGINT) HYPRE_Int i; matrix_j = hypre_TAlloc(HYPRE_Int, num_nonzeros, hypre_CSRMatrixMemoryLocation(matrix)); for (i = 0; i < num_nonzeros; i++) { matrix_j[i] = (HYPRE_Int) matrix_big_j[i]; } hypre_TFree(matrix_big_j, hypre_CSRMatrixMemoryLocation(matrix)); #else hypre_assert(sizeof(HYPRE_Int) == sizeof(HYPRE_BigInt)); matrix_j = (HYPRE_Int *) matrix_big_j; #endif hypre_CSRMatrixJ(matrix) = matrix_j; hypre_CSRMatrixBigJ(matrix) = NULL; } return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_CSRMatrixJtoBigJ * RL: TODO GPU impl. *--------------------------------------------------------------------------*/ HYPRE_Int hypre_CSRMatrixJtoBigJ( hypre_CSRMatrix *matrix ) { HYPRE_Int num_nonzeros = hypre_CSRMatrixNumNonzeros(matrix); HYPRE_Int *matrix_j = hypre_CSRMatrixJ(matrix); HYPRE_BigInt *matrix_big_j = NULL; if (num_nonzeros && matrix_j) { #if defined(HYPRE_MIXEDINT) || defined(HYPRE_BIGINT) HYPRE_Int i; matrix_big_j = hypre_TAlloc(HYPRE_BigInt, num_nonzeros, hypre_CSRMatrixMemoryLocation(matrix)); for (i = 0; i < num_nonzeros; i++) { matrix_big_j[i] = (HYPRE_BigInt) matrix_j[i]; } hypre_TFree(matrix_j, hypre_CSRMatrixMemoryLocation(matrix)); #else hypre_assert(sizeof(HYPRE_Int) == sizeof(HYPRE_BigInt)); matrix_big_j = (HYPRE_BigInt *) matrix_j; #endif hypre_CSRMatrixBigJ(matrix) = matrix_big_j; hypre_CSRMatrixJ(matrix) = NULL; } return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_CSRMatrixSetDataOwner *--------------------------------------------------------------------------*/ HYPRE_Int hypre_CSRMatrixSetDataOwner( hypre_CSRMatrix *matrix, HYPRE_Int owns_data ) { hypre_CSRMatrixOwnsData(matrix) = owns_data; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_CSRMatrixSetPatternOnly *--------------------------------------------------------------------------*/ HYPRE_Int hypre_CSRMatrixSetPatternOnly( hypre_CSRMatrix *matrix, HYPRE_Int pattern_only ) { hypre_CSRMatrixPatternOnly(matrix) = pattern_only; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_CSRMatrixSetRownnzHost *--------------------------------------------------------------------------*/ HYPRE_Int hypre_CSRMatrixSetRownnzHost( hypre_CSRMatrix *matrix ) { HYPRE_MemoryLocation memory_location = hypre_CSRMatrixMemoryLocation(matrix); HYPRE_Int num_rows = hypre_CSRMatrixNumRows(matrix); HYPRE_Int *A_i = hypre_CSRMatrixI(matrix); HYPRE_Int *Arownnz = hypre_CSRMatrixRownnz(matrix); HYPRE_Int i, irownnz = 0; for (i = 0; i < num_rows; i++) { if ((A_i[i + 1] - A_i[i]) > 0) { irownnz++; } } hypre_CSRMatrixNumRownnz(matrix) = irownnz; /* Free old rownnz pointer */ hypre_TFree(Arownnz, memory_location); /* Set new rownnz pointer */ if (irownnz == 0 || irownnz == num_rows) { hypre_CSRMatrixRownnz(matrix) = NULL; } else { Arownnz = hypre_CTAlloc(HYPRE_Int, irownnz, memory_location); irownnz = 0; for (i = 0; i < num_rows; i++) { if ((A_i[i + 1] - A_i[i]) > 0) { Arownnz[irownnz++] = i; } } hypre_CSRMatrixRownnz(matrix) = Arownnz; } return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_CSRMatrixSetRownnz * * function to set the substructure rownnz and num_rowsnnz inside the CSRMatrix * it needs the A_i substructure of CSRMatrix to find the nonzero rows. * It runs after the create CSR and when A_i is known..It does not check for * the existence of A_i or of the CSR matrix. *--------------------------------------------------------------------------*/ HYPRE_Int hypre_CSRMatrixSetRownnz( hypre_CSRMatrix *matrix ) { #if defined(HYPRE_USING_CUDA) || defined(HYPRE_USING_HIP) HYPRE_ExecutionPolicy exec = hypre_GetExecPolicy1( hypre_CSRMatrixMemoryLocation(matrix) ); if (exec == HYPRE_EXEC_DEVICE) { // TODO RL: there's no need currently for having rownnz on GPUs } else #endif { hypre_CSRMatrixSetRownnzHost(matrix); } return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_CSRMatrixCheckSetNumNonzeros * * check if numnonzeros was properly set to be ia[nrow] *--------------------------------------------------------------------------*/ HYPRE_Int hypre_CSRMatrixCheckSetNumNonzeros( hypre_CSRMatrix *matrix ) { if (!matrix) { return 0; } HYPRE_Int nnz, ierr = 0; hypre_TMemcpy(&nnz, hypre_CSRMatrixI(matrix) + hypre_CSRMatrixNumRows(matrix), HYPRE_Int, 1, HYPRE_MEMORY_HOST, hypre_CSRMatrixMemoryLocation(matrix)); if (hypre_CSRMatrixNumNonzeros(matrix) != nnz) { ierr = 1; hypre_printf("warning: CSR matrix nnz was not set properly (!= ia[nrow], %d %d)\n", hypre_CSRMatrixNumNonzeros(matrix), nnz ); hypre_assert(0); hypre_CSRMatrixNumNonzeros(matrix) = nnz; } return ierr; } /*-------------------------------------------------------------------------- * hypre_CSRMatrixRead *--------------------------------------------------------------------------*/ hypre_CSRMatrix * hypre_CSRMatrixRead( char *file_name ) { hypre_CSRMatrix *matrix; FILE *fp; HYPRE_Complex *matrix_data; HYPRE_Int *matrix_i; HYPRE_Int *matrix_j; HYPRE_Int num_rows; HYPRE_Int num_nonzeros; HYPRE_Int max_col = 0; HYPRE_Int file_base = 1; HYPRE_Int j; /*---------------------------------------------------------- * Read in the data *----------------------------------------------------------*/ fp = fopen(file_name, "r"); hypre_fscanf(fp, "%d", &num_rows); matrix_i = hypre_CTAlloc(HYPRE_Int, num_rows + 1, HYPRE_MEMORY_HOST); for (j = 0; j < num_rows + 1; j++) { hypre_fscanf(fp, "%d", &matrix_i[j]); matrix_i[j] -= file_base; } num_nonzeros = matrix_i[num_rows]; matrix = hypre_CSRMatrixCreate(num_rows, num_rows, matrix_i[num_rows]); hypre_CSRMatrixI(matrix) = matrix_i; hypre_CSRMatrixInitialize_v2(matrix, 0, HYPRE_MEMORY_HOST); matrix_j = hypre_CSRMatrixJ(matrix); for (j = 0; j < num_nonzeros; j++) { hypre_fscanf(fp, "%d", &matrix_j[j]); matrix_j[j] -= file_base; if (matrix_j[j] > max_col) { max_col = matrix_j[j]; } } matrix_data = hypre_CSRMatrixData(matrix); for (j = 0; j < matrix_i[num_rows]; j++) { hypre_fscanf(fp, "%le", &matrix_data[j]); } fclose(fp); hypre_CSRMatrixNumNonzeros(matrix) = num_nonzeros; hypre_CSRMatrixNumCols(matrix) = ++max_col; hypre_CSRMatrixSetRownnz(matrix); return matrix; } /*-------------------------------------------------------------------------- * hypre_CSRMatrixPrint *--------------------------------------------------------------------------*/ HYPRE_Int hypre_CSRMatrixPrint( hypre_CSRMatrix *matrix, const char *file_name ) { FILE *fp; HYPRE_Complex *matrix_data; HYPRE_Int *matrix_i; HYPRE_Int *matrix_j; HYPRE_BigInt *matrix_bigj; HYPRE_Int num_rows; HYPRE_Int file_base = 1; HYPRE_Int j; HYPRE_Int ierr = 0; /*---------------------------------------------------------- * Print the matrix data *----------------------------------------------------------*/ matrix_data = hypre_CSRMatrixData(matrix); matrix_i = hypre_CSRMatrixI(matrix); matrix_j = hypre_CSRMatrixJ(matrix); matrix_bigj = hypre_CSRMatrixBigJ(matrix); num_rows = hypre_CSRMatrixNumRows(matrix); fp = fopen(file_name, "w"); hypre_fprintf(fp, "%d\n", num_rows); for (j = 0; j <= num_rows; j++) { hypre_fprintf(fp, "%d\n", matrix_i[j] + file_base); } if (matrix_j) { for (j = 0; j < matrix_i[num_rows]; j++) { hypre_fprintf(fp, "%d\n", matrix_j[j] + file_base); } } if (matrix_bigj) { for (j = 0; j < matrix_i[num_rows]; j++) { hypre_fprintf(fp, "%d\n", matrix_bigj[j] + file_base); } } if (matrix_data) { for (j = 0; j < matrix_i[num_rows]; j++) { #ifdef HYPRE_COMPLEX hypre_fprintf(fp, "%.14e , %.14e\n", hypre_creal(matrix_data[j]), hypre_cimag(matrix_data[j])); #else hypre_fprintf(fp, "%.14e\n", matrix_data[j]); #endif } } else { hypre_fprintf(fp, "Warning: No matrix data!\n"); } fclose(fp); return ierr; } /*-------------------------------------------------------------------------- * hypre_CSRMatrixPrintIJ *--------------------------------------------------------------------------*/ HYPRE_Int hypre_CSRMatrixPrintIJ( hypre_CSRMatrix *matrix, HYPRE_Int base_i, HYPRE_Int base_j, char *filename ) { HYPRE_MemoryLocation memory_location = hypre_CSRMatrixMemoryLocation(matrix); hypre_CSRMatrix *h_matrix; HYPRE_Int patt_only; HYPRE_Int num_rows; HYPRE_Int num_cols; HYPRE_Int *matrix_i; HYPRE_Int *matrix_j; HYPRE_BigInt *matrix_bj; HYPRE_Complex *matrix_a; HYPRE_Int i, j, ii, jj; HYPRE_Int ilower, iupper, jlower, jupper; FILE *file; if (!matrix) { hypre_error_in_arg(1); return hypre_error_flag; } /* Create temporary matrix on host memory if needed */ h_matrix = (hypre_GetActualMemLocation(memory_location) == hypre_MEMORY_DEVICE) ? hypre_CSRMatrixClone_v2(matrix, 1, HYPRE_MEMORY_HOST) : matrix; /* Set matrix info */ patt_only = hypre_CSRMatrixPatternOnly(h_matrix); num_rows = hypre_CSRMatrixNumRows(h_matrix); num_cols = hypre_CSRMatrixNumCols(h_matrix); matrix_i = hypre_CSRMatrixI(h_matrix); matrix_j = hypre_CSRMatrixJ(h_matrix); matrix_bj = hypre_CSRMatrixBigJ(h_matrix); matrix_a = hypre_CSRMatrixData(h_matrix); if ((file = fopen(filename, "w")) == NULL) { hypre_error_w_msg(HYPRE_ERROR_GENERIC, "Error: can't open output file %s\n"); return hypre_error_flag; } /* Print matrix bounds */ ilower = base_i; iupper = num_rows + base_i - 1; jlower = base_j; jupper = num_cols + base_j - 1; hypre_fprintf(file, "%b %b %b %b\n", ilower, iupper, jlower, jupper); for (i = 0; i < num_rows; i++) { ii = i + base_i; /* print diag columns */ for (j = matrix_i[i]; j < matrix_i[i + 1]; j++) { jj = (matrix_bj) ? (matrix_bj[j] + base_j) : (matrix_j[j] + base_j); if (!patt_only) { #ifdef HYPRE_COMPLEX hypre_fprintf(file, "%b %b %.14e , %.14e\n", ii, jj, hypre_creal(matrix_a[j]), hypre_cimag(matrix_a[j])); #else hypre_fprintf(file, "%b %b %.14e\n", ii, jj, matrix_a[j]); #endif } else { hypre_fprintf(file, "%b %b\n", ii, jj); } } } fclose(file); /* Free temporary matrix */ if (h_matrix != matrix) { hypre_CSRMatrixDestroy(h_matrix); } return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_CSRMatrixPrintMM *--------------------------------------------------------------------------*/ HYPRE_Int hypre_CSRMatrixPrintMM( hypre_CSRMatrix *matrix, HYPRE_Int basei, HYPRE_Int basej, HYPRE_Int trans, const char *file_name ) { FILE *fp = file_name ? fopen(file_name, "w") : stdout; if (!fp) { hypre_error_w_msg(1, "Cannot open output file"); return hypre_error_flag; } const HYPRE_Complex *matrix_data = hypre_CSRMatrixData(matrix); const HYPRE_Int *matrix_i = hypre_CSRMatrixI(matrix); const HYPRE_Int *matrix_j = hypre_CSRMatrixJ(matrix); hypre_assert(hypre_CSRMatrixI(matrix)[hypre_CSRMatrixNumRows(matrix)] == hypre_CSRMatrixNumNonzeros(matrix)); if (matrix_data) { hypre_fprintf(fp, "%%%%MatrixMarket matrix coordinate real general\n"); } else { hypre_fprintf(fp, "%%%%MatrixMarket matrix coordinate pattern general\n"); } hypre_fprintf(fp, "%d %d %d\n", trans ? hypre_CSRMatrixNumCols(matrix) : hypre_CSRMatrixNumRows(matrix), trans ? hypre_CSRMatrixNumRows(matrix) : hypre_CSRMatrixNumCols(matrix), hypre_CSRMatrixNumNonzeros(matrix)); HYPRE_Int i, j; for (i = 0; i < hypre_CSRMatrixNumRows(matrix); i++) { for (j = matrix_i[i]; j < matrix_i[i + 1]; j++) { const HYPRE_Int row = (trans ? matrix_j[j] : i) + basei; const HYPRE_Int col = (trans ? i : matrix_j[j]) + basej; if (matrix_data) { hypre_fprintf(fp, "%d %d %.15e\n", row, col, matrix_data[j]); } else { hypre_fprintf(fp, "%d %d\n", row, col); } } } if (file_name) { fclose(fp); } return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_CSRMatrixPrintHB: * * Print a CSRMatrix in Harwell-Boeing format *--------------------------------------------------------------------------*/ HYPRE_Int hypre_CSRMatrixPrintHB( hypre_CSRMatrix *matrix_input, char *file_name ) { FILE *fp; hypre_CSRMatrix *matrix; HYPRE_Complex *matrix_data; HYPRE_Int *matrix_i; HYPRE_Int *matrix_j; HYPRE_Int num_rows; HYPRE_Int file_base = 1; HYPRE_Int j, totcrd, ptrcrd, indcrd, valcrd, rhscrd; /*---------------------------------------------------------- * Print the matrix data *----------------------------------------------------------*/ /* First transpose the input matrix, since HB is in CSC format */ hypre_CSRMatrixTranspose(matrix_input, &matrix, 1); matrix_data = hypre_CSRMatrixData(matrix); matrix_i = hypre_CSRMatrixI(matrix); matrix_j = hypre_CSRMatrixJ(matrix); num_rows = hypre_CSRMatrixNumRows(matrix); fp = fopen(file_name, "w"); hypre_fprintf(fp, "%-70s Key \n", "Title"); ptrcrd = num_rows; indcrd = matrix_i[num_rows]; valcrd = matrix_i[num_rows]; rhscrd = 0; totcrd = ptrcrd + indcrd + valcrd + rhscrd; hypre_fprintf (fp, "%14d%14d%14d%14d%14d\n", totcrd, ptrcrd, indcrd, valcrd, rhscrd); hypre_fprintf (fp, "%-14s%14i%14i%14i%14i\n", "RUA", num_rows, num_rows, valcrd, 0); hypre_fprintf (fp, "%-16s%-16s%-16s%26s\n", "(1I8)", "(1I8)", "(1E16.8)", ""); for (j = 0; j <= num_rows; j++) { hypre_fprintf(fp, "%8d\n", matrix_i[j] + file_base); } for (j = 0; j < matrix_i[num_rows]; j++) { hypre_fprintf(fp, "%8d\n", matrix_j[j] + file_base); } if (matrix_data) { for (j = 0; j < matrix_i[num_rows]; j++) { #ifdef HYPRE_COMPLEX hypre_fprintf(fp, "%16.8e , %16.8e\n", hypre_creal(matrix_data[j]), hypre_cimag(matrix_data[j])); #else hypre_fprintf(fp, "%16.8e\n", matrix_data[j]); #endif } } else { hypre_fprintf(fp, "Warning: No matrix data!\n"); } fclose(fp); hypre_CSRMatrixDestroy(matrix); return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_CSRMatrixCopy: copy A to B, * * if copy_data = 0 only the structure of A is copied to B. * the routine does not check if the dimensions/sparsity of A and B match !!! *--------------------------------------------------------------------------*/ HYPRE_Int hypre_CSRMatrixCopy( hypre_CSRMatrix *A, hypre_CSRMatrix *B, HYPRE_Int copy_data ) { HYPRE_Int num_rows = hypre_CSRMatrixNumRows(A); HYPRE_Int num_nonzeros = hypre_CSRMatrixNumNonzeros(A); HYPRE_Int *A_i = hypre_CSRMatrixI(A); HYPRE_Int *A_j = hypre_CSRMatrixJ(A); HYPRE_BigInt *A_bigj = hypre_CSRMatrixBigJ(A); HYPRE_Int *A_rownnz = hypre_CSRMatrixRownnz(A); HYPRE_Complex *A_data; HYPRE_Int *B_i = hypre_CSRMatrixI(B); HYPRE_Int *B_j = hypre_CSRMatrixJ(B); HYPRE_BigInt *B_bigj = hypre_CSRMatrixBigJ(B); HYPRE_Int *B_rownnz = hypre_CSRMatrixRownnz(B); HYPRE_Complex *B_data; HYPRE_MemoryLocation memory_location_A = hypre_CSRMatrixMemoryLocation(A); HYPRE_MemoryLocation memory_location_B = hypre_CSRMatrixMemoryLocation(B); hypre_TMemcpy(B_i, A_i, HYPRE_Int, num_rows + 1, memory_location_B, memory_location_A); if (A_rownnz) { if (!B_rownnz) { B_rownnz = hypre_TAlloc(HYPRE_Int, hypre_CSRMatrixNumRownnz(A), memory_location_B); hypre_CSRMatrixRownnz(B) = B_rownnz; } hypre_TMemcpy(B_rownnz, A_rownnz, HYPRE_Int, hypre_CSRMatrixNumRownnz(A), memory_location_B, memory_location_A); } hypre_CSRMatrixNumRownnz(B) = hypre_CSRMatrixNumRownnz(A); if (A_j && B_j) { hypre_TMemcpy(B_j, A_j, HYPRE_Int, num_nonzeros, memory_location_B, memory_location_A); } if (A_bigj && B_bigj) { hypre_TMemcpy(B_bigj, A_bigj, HYPRE_BigInt, num_nonzeros, memory_location_B, memory_location_A); } if (copy_data) { A_data = hypre_CSRMatrixData(A); B_data = hypre_CSRMatrixData(B); hypre_TMemcpy(B_data, A_data, HYPRE_Complex, num_nonzeros, memory_location_B, memory_location_A); } return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_CSRMatrixMigrate * * Migrates matrix row pointer, column indices and data to memory_location * if it is different to the current one. * * Note: Does not move rownnz array. *--------------------------------------------------------------------------*/ HYPRE_Int hypre_CSRMatrixMigrate( hypre_CSRMatrix *A, HYPRE_MemoryLocation memory_location ) { /* Input matrix info */ HYPRE_Int num_rows = hypre_CSRMatrixNumRows(A); HYPRE_Int num_nonzeros = hypre_CSRMatrixNumNonzeros(A); HYPRE_Int num_rownnz = hypre_CSRMatrixNumRownnz(A); HYPRE_Int *A_ri = hypre_CSRMatrixRownnz(A); HYPRE_Int *A_i = hypre_CSRMatrixI(A); HYPRE_Int *A_j = hypre_CSRMatrixJ(A); HYPRE_BigInt *A_big_j = hypre_CSRMatrixBigJ(A); HYPRE_Complex *A_data = hypre_CSRMatrixData(A); HYPRE_MemoryLocation old_memory_location = hypre_CSRMatrixMemoryLocation(A); /* Output matrix info */ HYPRE_Int *B_i; HYPRE_Int *B_j; HYPRE_BigInt *B_big_j; HYPRE_Complex *B_data; HYPRE_Int *B_ri; /* Check pointer locations in debug mode */ #if defined(HYPRE_DEBUG) hypre_CheckMemoryLocation((void*) A_ri, hypre_GetActualMemLocation(old_memory_location)); hypre_CheckMemoryLocation((void*) A_i, hypre_GetActualMemLocation(old_memory_location)); hypre_CheckMemoryLocation((void*) A_j, hypre_GetActualMemLocation(old_memory_location)); hypre_CheckMemoryLocation((void*) A_big_j, hypre_GetActualMemLocation(old_memory_location)); hypre_CheckMemoryLocation((void*) A_data, hypre_GetActualMemLocation(old_memory_location)); #endif /* Update A's memory location */ hypre_CSRMatrixMemoryLocation(A) = memory_location; if ( hypre_GetActualMemLocation(memory_location) != hypre_GetActualMemLocation(old_memory_location) ) { if (A_ri) { B_ri = hypre_TAlloc(HYPRE_Int, num_rownnz, memory_location); hypre_TMemcpy(B_ri, A_ri, HYPRE_Int, num_rownnz, memory_location, old_memory_location); hypre_TFree(A_ri, old_memory_location); hypre_CSRMatrixRownnz(A) = B_ri; } if (A_i) { B_i = hypre_TAlloc(HYPRE_Int, num_rows + 1, memory_location); hypre_TMemcpy(B_i, A_i, HYPRE_Int, num_rows + 1, memory_location, old_memory_location); hypre_TFree(A_i, old_memory_location); hypre_CSRMatrixI(A) = B_i; } if (A_j) { B_j = hypre_TAlloc(HYPRE_Int, num_nonzeros, memory_location); hypre_TMemcpy(B_j, A_j, HYPRE_Int, num_nonzeros, memory_location, old_memory_location); hypre_TFree(A_j, old_memory_location); hypre_CSRMatrixJ(A) = B_j; } if (A_big_j) { B_big_j = hypre_TAlloc(HYPRE_BigInt, num_nonzeros, memory_location); hypre_TMemcpy(B_big_j, A_big_j, HYPRE_BigInt, num_nonzeros, memory_location, old_memory_location); hypre_TFree(A_big_j, old_memory_location); hypre_CSRMatrixBigJ(A) = B_big_j; } if (A_data) { B_data = hypre_TAlloc(HYPRE_Complex, num_nonzeros, memory_location); hypre_TMemcpy(B_data, A_data, HYPRE_Complex, num_nonzeros, memory_location, old_memory_location); hypre_TFree(A_data, old_memory_location); hypre_CSRMatrixData(A) = B_data; } } return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_CSRMatrixClone_v2 * * This function does the same job as hypre_CSRMatrixClone; however, here * the user can specify the memory location of the resulting matrix. *--------------------------------------------------------------------------*/ hypre_CSRMatrix* hypre_CSRMatrixClone_v2( hypre_CSRMatrix *A, HYPRE_Int copy_data, HYPRE_MemoryLocation memory_location ) { HYPRE_Int num_rows = hypre_CSRMatrixNumRows(A); HYPRE_Int num_cols = hypre_CSRMatrixNumCols(A); HYPRE_Int num_nonzeros = hypre_CSRMatrixNumNonzeros(A); hypre_CSRMatrix *B = hypre_CSRMatrixCreate(num_rows, num_cols, num_nonzeros); HYPRE_Int bigInit = hypre_CSRMatrixBigJ(A) != NULL; hypre_CSRMatrixInitialize_v2(B, bigInit, memory_location); hypre_CSRMatrixCopy(A, B, copy_data); return B; } /*-------------------------------------------------------------------------- * hypre_CSRMatrixClone * * Creates and returns a new copy of the argument, A. * Performs a deep copy of information (no pointers are copied); * New arrays are created where necessary. *--------------------------------------------------------------------------*/ hypre_CSRMatrix* hypre_CSRMatrixClone( hypre_CSRMatrix *A, HYPRE_Int copy_data ) { return hypre_CSRMatrixClone_v2(A, copy_data, hypre_CSRMatrixMemoryLocation(A)); } /*-------------------------------------------------------------------------- * hypre_CSRMatrixPermuteHost * * See hypre_CSRMatrixPermute. TODO (VPM): OpenMP implementation *--------------------------------------------------------------------------*/ HYPRE_Int hypre_CSRMatrixPermuteHost( hypre_CSRMatrix *A, HYPRE_Int *perm, HYPRE_Int *rqperm, hypre_CSRMatrix *B ) { /* Input variables */ HYPRE_Int num_rows = hypre_CSRMatrixNumRows(A); HYPRE_Int num_nonzeros = hypre_CSRMatrixNumNonzeros(A); HYPRE_Int *A_i = hypre_CSRMatrixI(A); HYPRE_Int *A_j = hypre_CSRMatrixJ(A); HYPRE_Complex *A_a = hypre_CSRMatrixData(A); HYPRE_Int *B_i = hypre_CSRMatrixI(B); HYPRE_Int *B_j = hypre_CSRMatrixJ(B); HYPRE_Complex *B_a = hypre_CSRMatrixData(B); /* Local variables */ HYPRE_Int i, j, k; /* Build B = A(perm, qperm) */ k = 0; for (i = 0; i < num_rows; i++) { B_i[i] = k; for (j = A_i[perm[i]]; j < A_i[perm[i] + 1]; j++) { B_j[k] = rqperm[A_j[j]]; B_a[k++] = A_a[j]; } } B_i[num_rows] = k; hypre_assert(k == num_nonzeros); return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_CSRMatrixPermute * * Reorder a CSRMatrix according to a row-permutation array (perm) and * reverse column-permutation array (rqperm). * * Notes: * 1) This function does not move the diagonal to the first entry of a row * 2) When perm == rqperm == NULL, B is a deep copy of A. * * TODO (VPM): add check for permutation arrays under HYPRE_DEBUG *--------------------------------------------------------------------------*/ HYPRE_Int hypre_CSRMatrixPermute( hypre_CSRMatrix *A, HYPRE_Int *perm, HYPRE_Int *rqperm, hypre_CSRMatrix **B_ptr ) { HYPRE_Int num_rows = hypre_CSRMatrixNumRows(A); HYPRE_Int num_cols = hypre_CSRMatrixNumCols(A); HYPRE_Int num_nonzeros = hypre_CSRMatrixNumNonzeros(A); hypre_CSRMatrix *B; hypre_GpuProfilingPushRange("CSRMatrixPermute"); /* Special case: one of the permutation vectors are not provided, then B = A */ if (!perm || !rqperm) { *B_ptr = hypre_CSRMatrixClone(A, 1); hypre_GpuProfilingPopRange(); return hypre_error_flag; } /* Create output matrix B */ B = hypre_CSRMatrixCreate(num_rows, num_cols, num_nonzeros); hypre_CSRMatrixInitialize_v2(B, 0, hypre_CSRMatrixMemoryLocation(A)); #if defined(HYPRE_USING_CUDA) || defined(HYPRE_USING_HIP) HYPRE_ExecutionPolicy exec = hypre_GetExecPolicy1( hypre_CSRMatrixMemoryLocation(A) ); if (exec == HYPRE_EXEC_DEVICE) { hypre_CSRMatrixPermuteDevice(A, perm, rqperm, B); } else #endif { hypre_CSRMatrixPermuteHost(A, perm, rqperm, B); } hypre_GpuProfilingPopRange(); /* Set output pointer */ *B_ptr = B; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_CSRMatrixUnion * Creates and returns a matrix whose elements are the union of those of A and B. * Data is not computed, only structural information is created. * A and B must have the same numbers of rows. * Nothing is done about Rownnz. * * If col_map_offd_A and col_map_offd_B are zero, A and B are expected to have * the same column indexing. Otherwise, col_map_offd_A, col_map_offd_B should * be the arrays of that name from two ParCSRMatrices of which A and B are the * offd blocks. * * The algorithm can be expected to have reasonable efficiency only for very * sparse matrices (many rows, few nonzeros per row). * The nonzeros of a computed row are NOT necessarily in any particular order. *--------------------------------------------------------------------------*/ hypre_CSRMatrix* hypre_CSRMatrixUnion( hypre_CSRMatrix *A, hypre_CSRMatrix *B, HYPRE_BigInt *col_map_offd_A, HYPRE_BigInt *col_map_offd_B, HYPRE_BigInt **col_map_offd_C ) { HYPRE_Int num_rows = hypre_CSRMatrixNumRows( A ); HYPRE_Int num_cols_A = hypre_CSRMatrixNumCols( A ); HYPRE_Int num_cols_B = hypre_CSRMatrixNumCols( B ); HYPRE_Int num_cols; HYPRE_Int num_nonzeros; HYPRE_Int *A_i = hypre_CSRMatrixI(A); HYPRE_Int *A_j = hypre_CSRMatrixJ(A); HYPRE_Int *B_i = hypre_CSRMatrixI(B); HYPRE_Int *B_j = hypre_CSRMatrixJ(B); HYPRE_Int *C_i; HYPRE_Int *C_j; HYPRE_Int *jC = NULL; HYPRE_BigInt jBg, big_jA = -1, big_jB = -1; HYPRE_Int i, jA, jB; HYPRE_Int ma, mb, mc, ma_min, ma_max, match; hypre_CSRMatrix* C; HYPRE_MemoryLocation memory_location = hypre_CSRMatrixMemoryLocation(A); hypre_assert( num_rows == hypre_CSRMatrixNumRows(B) ); if ( col_map_offd_B ) { hypre_assert( col_map_offd_A ); } if ( col_map_offd_A ) { hypre_assert( col_map_offd_B ); } /* ==== First, go through the columns of A and B to count the columns of C. */ if ( col_map_offd_A == 0 ) { /* The matrices are diagonal blocks. Normally num_cols_A==num_cols_B, col_starts is the same, etc. */ num_cols = hypre_max( num_cols_A, num_cols_B ); } else { /* The matrices are offdiagonal blocks. */ jC = hypre_CTAlloc(HYPRE_Int, num_cols_B, HYPRE_MEMORY_HOST); num_cols = num_cols_A; /* initialization; we'll compute the actual value */ for ( jB = 0; jB < num_cols_B; ++jB ) { match = 0; jBg = col_map_offd_B[jB]; for ( ma = 0; ma < num_cols_A; ++ma ) { if ( col_map_offd_A[ma] == jBg ) { match = 1; } } if ( match == 0 ) { jC[jB] = num_cols; ++num_cols; } } } /* ==== If we're working on a ParCSRMatrix's offd block, make and load col_map_offd_C */ if ( col_map_offd_A ) { *col_map_offd_C = hypre_CTAlloc( HYPRE_BigInt, num_cols, HYPRE_MEMORY_HOST); for ( jA = 0; jA < num_cols_A; ++jA ) { (*col_map_offd_C)[jA] = col_map_offd_A[jA]; } for ( jB = 0; jB < num_cols_B; ++jB ) { match = 0; jBg = col_map_offd_B[jB]; for ( ma = 0; ma < num_cols_A; ++ma ) { if ( col_map_offd_A[ma] == jBg ) { match = 1; } } if ( match == 0 ) { (*col_map_offd_C)[ jC[jB] ] = jBg; } } } /* ==== The first run through A and B is to count the number of nonzero elements, without HYPRE_Complex-counting duplicates. Then we can create C. */ num_nonzeros = hypre_CSRMatrixNumNonzeros(A); for ( i = 0; i < num_rows; ++i ) { ma_min = A_i[i]; ma_max = A_i[i + 1]; for ( mb = B_i[i]; mb < B_i[i + 1]; ++mb ) { jB = B_j[mb]; if ( col_map_offd_B ) { big_jB = col_map_offd_B[jB]; } match = 0; for ( ma = ma_min; ma < ma_max; ++ma ) { jA = A_j[ma]; if ( col_map_offd_A ) { big_jA = col_map_offd_A[jA]; } if ( big_jB == big_jA ) { match = 1; if ( ma == ma_min ) { ++ma_min; } break; } } if ( match == 0 ) { ++num_nonzeros; } } } C = hypre_CSRMatrixCreate( num_rows, num_cols, num_nonzeros ); hypre_CSRMatrixInitialize_v2( C, 0, memory_location ); /* ==== The second run through A and B is to pick out the column numbers for each row, and put them in C. */ C_i = hypre_CSRMatrixI(C); C_i[0] = 0; C_j = hypre_CSRMatrixJ(C); mc = 0; for ( i = 0; i < num_rows; ++i ) { ma_min = A_i[i]; ma_max = A_i[i + 1]; for ( ma = ma_min; ma < ma_max; ++ma ) { C_j[mc] = A_j[ma]; ++mc; } for ( mb = B_i[i]; mb < B_i[i + 1]; ++mb ) { jB = B_j[mb]; if ( col_map_offd_B ) { big_jB = col_map_offd_B[jB]; } match = 0; for ( ma = ma_min; ma < ma_max; ++ma ) { jA = A_j[ma]; if ( col_map_offd_A ) { big_jA = col_map_offd_A[jA]; } if ( big_jB == big_jA ) { match = 1; if ( ma == ma_min ) { ++ma_min; } break; } } if ( match == 0 ) { if ( col_map_offd_A ) { C_j[mc] = jC[ B_j[mb] ]; } else { C_j[mc] = B_j[mb]; } /* ... I don't know whether column indices are required to be in any particular order. If so, we'll need to sort. */ ++mc; } } C_i[i + 1] = mc; } hypre_assert( mc == num_nonzeros ); hypre_TFree(jC, HYPRE_MEMORY_HOST); return C; } /*-------------------------------------------------------------------------- * hypre_CSRMatrixGetLoadBalancedPartitionBoundary *--------------------------------------------------------------------------*/ static HYPRE_Int hypre_CSRMatrixGetLoadBalancedPartitionBoundary(hypre_CSRMatrix *A, HYPRE_Int idx) { HYPRE_Int num_nonzerosA = hypre_CSRMatrixNumNonzeros(A); HYPRE_Int num_rowsA = hypre_CSRMatrixNumRows(A); HYPRE_Int *A_i = hypre_CSRMatrixI(A); HYPRE_Int num_threads = hypre_NumActiveThreads(); HYPRE_Int nonzeros_per_thread = (num_nonzerosA + num_threads - 1) / num_threads; if (idx <= 0) { return 0; } else if (idx >= num_threads) { return num_rowsA; } else { return (HYPRE_Int)(hypre_LowerBound(A_i, A_i + num_rowsA, nonzeros_per_thread * idx) - A_i); } } /*-------------------------------------------------------------------------- * hypre_CSRMatrixGetLoadBalancedPartitionBegin *--------------------------------------------------------------------------*/ HYPRE_Int hypre_CSRMatrixGetLoadBalancedPartitionBegin(hypre_CSRMatrix *A) { return hypre_CSRMatrixGetLoadBalancedPartitionBoundary(A, hypre_GetThreadNum()); } /*-------------------------------------------------------------------------- * hypre_CSRMatrixGetLoadBalancedPartitionEnd *--------------------------------------------------------------------------*/ HYPRE_Int hypre_CSRMatrixGetLoadBalancedPartitionEnd(hypre_CSRMatrix *A) { return hypre_CSRMatrixGetLoadBalancedPartitionBoundary(A, hypre_GetThreadNum() + 1); } /*-------------------------------------------------------------------------- * hypre_CSRMatrixPrefetch *--------------------------------------------------------------------------*/ HYPRE_Int hypre_CSRMatrixPrefetch( hypre_CSRMatrix *A, HYPRE_MemoryLocation memory_location ) { #if defined(HYPRE_USING_UNIFIED_MEMORY) if (hypre_CSRMatrixMemoryLocation(A) != HYPRE_MEMORY_DEVICE) { hypre_error_w_msg(HYPRE_ERROR_GENERIC, "A is not at HYPRE_MEMORY_DEVICE"); return hypre_error_flag; } HYPRE_Complex *data = hypre_CSRMatrixData(A); HYPRE_Int *ia = hypre_CSRMatrixI(A); HYPRE_Int *ja = hypre_CSRMatrixJ(A); HYPRE_Int nrow = hypre_CSRMatrixNumRows(A); HYPRE_Int nnzA = hypre_CSRMatrixNumNonzeros(A); hypre_MemPrefetch(data, sizeof(HYPRE_Complex)*nnzA, memory_location); hypre_MemPrefetch(ia, sizeof(HYPRE_Int) * (nrow + 1), memory_location); hypre_MemPrefetch(ja, sizeof(HYPRE_Int)*nnzA, memory_location); #else HYPRE_UNUSED_VAR(A); HYPRE_UNUSED_VAR(memory_location); #endif return hypre_error_flag; } #if defined(HYPRE_USING_CUSPARSE) ||\ defined(HYPRE_USING_ROCSPARSE) ||\ defined(HYPRE_USING_ONEMKLSPARSE) /*-------------------------------------------------------------------------- * hypre_CSRMatrixGetGPUMatData *--------------------------------------------------------------------------*/ hypre_GpuMatData* hypre_CSRMatrixGetGPUMatData(hypre_CSRMatrix *matrix) { if (!matrix) { return NULL; } if (!hypre_CSRMatrixGPUMatData(matrix)) { hypre_CSRMatrixGPUMatData(matrix) = hypre_GpuMatDataCreate(); hypre_GPUMatDataSetCSRData(matrix); } return hypre_CSRMatrixGPUMatData(matrix); } #endif hypre-2.33.0/src/seq_mv/csr_matrix.h000066400000000000000000000116421477326011500173450ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * Header info for CSR Matrix data structures * * Note: this matrix currently uses 0-based indexing. * *****************************************************************************/ #ifndef hypre_CSR_MATRIX_HEADER #define hypre_CSR_MATRIX_HEADER #if defined(HYPRE_USING_CUSPARSE) ||\ defined(HYPRE_USING_ROCSPARSE) ||\ defined(HYPRE_USING_ONEMKLSPARSE) struct hypre_CsrsvData; typedef struct hypre_CsrsvData hypre_CsrsvData; struct hypre_GpuMatData; typedef struct hypre_GpuMatData hypre_GpuMatData; #endif /*-------------------------------------------------------------------------- * CSR Matrix *--------------------------------------------------------------------------*/ typedef struct { HYPRE_Int *i; HYPRE_Int *j; HYPRE_BigInt *big_j; HYPRE_Int num_rows; HYPRE_Int num_cols; HYPRE_Int num_nonzeros; hypre_int *i_short; hypre_int *j_short; HYPRE_Int owns_data; /* Does the CSRMatrix create/destroy `data', `i', `j'? */ HYPRE_Int pattern_only; /* 1: data array is ignored, and assumed to be all 1's */ HYPRE_Complex *data; HYPRE_Int *rownnz; /* for compressing rows in matrix multiplication */ HYPRE_Int num_rownnz; HYPRE_MemoryLocation memory_location; /* memory location of arrays i, j, data */ #if defined(HYPRE_USING_CUSPARSE) ||\ defined(HYPRE_USING_ROCSPARSE) ||\ defined(HYPRE_USING_ONEMKLSPARSE) HYPRE_Int *sorted_j; /* some cusparse routines require sorted CSR */ HYPRE_Complex *sorted_data; hypre_CsrsvData *csrsv_data; hypre_GpuMatData *mat_data; #endif } hypre_CSRMatrix; /*-------------------------------------------------------------------------- * Accessor functions for the CSR Matrix structure *--------------------------------------------------------------------------*/ #define hypre_CSRMatrixData(matrix) ((matrix) -> data) #define hypre_CSRMatrixI(matrix) ((matrix) -> i) #define hypre_CSRMatrixJ(matrix) ((matrix) -> j) #define hypre_CSRMatrixBigJ(matrix) ((matrix) -> big_j) #define hypre_CSRMatrixNumRows(matrix) ((matrix) -> num_rows) #define hypre_CSRMatrixNumCols(matrix) ((matrix) -> num_cols) #define hypre_CSRMatrixNumNonzeros(matrix) ((matrix) -> num_nonzeros) #define hypre_CSRMatrixRownnz(matrix) ((matrix) -> rownnz) #define hypre_CSRMatrixNumRownnz(matrix) ((matrix) -> num_rownnz) #define hypre_CSRMatrixOwnsData(matrix) ((matrix) -> owns_data) #define hypre_CSRMatrixPatternOnly(matrix) ((matrix) -> pattern_only) #define hypre_CSRMatrixMemoryLocation(matrix) ((matrix) -> memory_location) #if defined(HYPRE_USING_CUSPARSE) ||\ defined(HYPRE_USING_ROCSPARSE) ||\ defined(HYPRE_USING_ONEMKLSPARSE) #define hypre_CSRMatrixSortedJ(matrix) ((matrix) -> sorted_j) #define hypre_CSRMatrixSortedData(matrix) ((matrix) -> sorted_data) #define hypre_CSRMatrixCsrsvData(matrix) ((matrix) -> csrsv_data) #define hypre_CSRMatrixGPUMatData(matrix) ((matrix) -> mat_data) #endif HYPRE_Int hypre_CSRMatrixGetLoadBalancedPartitionBegin( hypre_CSRMatrix *A ); HYPRE_Int hypre_CSRMatrixGetLoadBalancedPartitionEnd( hypre_CSRMatrix *A ); /*-------------------------------------------------------------------------- * CSR Boolean Matrix *--------------------------------------------------------------------------*/ typedef struct { HYPRE_Int *i; HYPRE_Int *j; HYPRE_BigInt *big_j; HYPRE_Int num_rows; HYPRE_Int num_cols; HYPRE_Int num_nonzeros; HYPRE_Int owns_data; } hypre_CSRBooleanMatrix; /*-------------------------------------------------------------------------- * Accessor functions for the CSR Boolean Matrix structure *--------------------------------------------------------------------------*/ #define hypre_CSRBooleanMatrix_Get_I(matrix) ((matrix)->i) #define hypre_CSRBooleanMatrix_Get_J(matrix) ((matrix)->j) #define hypre_CSRBooleanMatrix_Get_BigJ(matrix) ((matrix)->big_j) #define hypre_CSRBooleanMatrix_Get_NRows(matrix) ((matrix)->num_rows) #define hypre_CSRBooleanMatrix_Get_NCols(matrix) ((matrix)->num_cols) #define hypre_CSRBooleanMatrix_Get_NNZ(matrix) ((matrix)->num_nonzeros) #define hypre_CSRBooleanMatrix_Get_OwnsData(matrix) ((matrix)->owns_data) #endif hypre-2.33.0/src/seq_mv/csr_matrix_cuda_utils.c000066400000000000000000000131741477326011500215560ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "seq_mv.h" #include "_hypre_utilities.hpp" #include "seq_mv.hpp" #if defined(HYPRE_USING_CUSPARSE) #if CUSPARSE_VERSION >= CUSPARSE_NEWAPI_VERSION /* * @brief Creates a cuda csr descriptor for a raw CSR matrix * @param[in] n Number of rows * @param[in] m Number of columns * @param[in] offset the first row considered * @param[in] nnz Number of nonzeroes * @param[in] *i Row indices * @param[in] *j Colmn indices * @param[in] *data Values * @return Descriptor */ cusparseSpMatDescr_t hypre_CSRMatrixToCusparseSpMat_core( HYPRE_Int n, HYPRE_Int m, HYPRE_Int offset, HYPRE_Int nnz, HYPRE_Int *i, HYPRE_Int *j, HYPRE_Complex *data) { const cudaDataType data_type = hypre_HYPREComplexToCudaDataType(); const cusparseIndexType_t index_type = hypre_HYPREIntToCusparseIndexType(); const cusparseIndexBase_t index_base = CUSPARSE_INDEX_BASE_ZERO; cusparseSpMatDescr_t matA; /* hypre_assert( (hypre_CSRMatrixNumRows(A) - offset != 0) && (hypre_CSRMatrixNumCols(A) != 0) && (hypre_CSRMatrixNumNonzeros(A) != 0) && "Matrix has no nonzeros"); */ HYPRE_CUSPARSE_CALL( cusparseCreateCsr(&matA, n - offset, m, nnz, i + offset, j, data, index_type, index_type, index_base, data_type) ); return matA; } /* * @brief Creates a cuSPARSE CSR descriptor from a hypre_CSRMatrix * @param[in] *A Pointer to hypre_CSRMatrix * @param[in] offset Row offset * @return cuSPARSE CSR Descriptor * @warning Assumes CSRMatrix has base 0 */ cusparseSpMatDescr_t hypre_CSRMatrixToCusparseSpMat(const hypre_CSRMatrix *A, HYPRE_Int offset) { return hypre_CSRMatrixToCusparseSpMat_core( hypre_CSRMatrixNumRows(A), hypre_CSRMatrixNumCols(A), offset, hypre_CSRMatrixNumNonzeros(A), hypre_CSRMatrixI(A), hypre_CSRMatrixJ(A), hypre_CSRMatrixData(A) ); } /* * @brief Creates a cuSPARSE dense vector descriptor from a hypre_Vector * @param[in] *x Pointer to a hypre_Vector * @param[in] offset Row offset * @return cuSPARSE dense vector descriptor * @warning Assumes CSRMatrix uses doubles for values */ cusparseDnVecDescr_t hypre_VectorToCusparseDnVec_core(HYPRE_Complex *x_data, HYPRE_Int n) { const cudaDataType data_type = hypre_HYPREComplexToCudaDataType(); cusparseDnVecDescr_t vecX; HYPRE_CUSPARSE_CALL( cusparseCreateDnVec(&vecX, n, x_data, data_type) ); return vecX; } cusparseDnVecDescr_t hypre_VectorToCusparseDnVec(const hypre_Vector *x, HYPRE_Int offset, HYPRE_Int size_override) { return hypre_VectorToCusparseDnVec_core(hypre_VectorData(x) + offset, size_override >= 0 ? size_override : hypre_VectorSize(x) - offset); } /* * @brief Creates a cuSPARSE dense matrix descriptor from a hypre_Vector * @param[in] *x Pointer to a hypre_Vector * @return cuSPARSE dense matrix descriptor * @warning Assumes CSRMatrix uses doubles for values */ cusparseDnMatDescr_t hypre_VectorToCusparseDnMat_core(HYPRE_Complex *x_data, HYPRE_Int nrow, HYPRE_Int ncol, HYPRE_Int order) { cudaDataType data_type = hypre_HYPREComplexToCudaDataType(); cusparseDnMatDescr_t matX; HYPRE_CUSPARSE_CALL( cusparseCreateDnMat(&matX, nrow, ncol, (order == 0) ? nrow : ncol, x_data, data_type, (order == 0) ? CUSPARSE_ORDER_COL : CUSPARSE_ORDER_ROW) ); return matX; } cusparseDnMatDescr_t hypre_VectorToCusparseDnMat(const hypre_Vector *x) { return hypre_VectorToCusparseDnMat_core(hypre_VectorData(x), hypre_VectorSize(x), hypre_VectorNumVectors(x), hypre_VectorMultiVecStorageMethod(x)); } #endif // #if CUSPARSE_VERSION >= CUSPARSE_NEWAPI_VERSION #endif // #if defined(HYPRE_USING_CUSPARSE) hypre-2.33.0/src/seq_mv/csr_matvec.c000066400000000000000000001171771477326011500173250ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * Matvec functions for hypre_CSRMatrix class. * *****************************************************************************/ #include "seq_mv.h" /*-------------------------------------------------------------------------- * hypre_CSRMatrixMatvec *--------------------------------------------------------------------------*/ /* y[offset:end] = alpha*A[offset:end,:]*x + beta*b[offset:end] */ HYPRE_Int hypre_CSRMatrixMatvecOutOfPlaceHost( HYPRE_Complex alpha, hypre_CSRMatrix *A, hypre_Vector *x, HYPRE_Complex beta, hypre_Vector *b, hypre_Vector *y, HYPRE_Int offset ) { HYPRE_Complex *A_data = hypre_CSRMatrixData(A); HYPRE_Int *A_i = hypre_CSRMatrixI(A) + offset; HYPRE_Int *A_j = hypre_CSRMatrixJ(A); HYPRE_Int num_rows = hypre_CSRMatrixNumRows(A) - offset; HYPRE_Int num_cols = hypre_CSRMatrixNumCols(A); HYPRE_Int *A_rownnz = hypre_CSRMatrixRownnz(A); HYPRE_Int num_rownnz = hypre_CSRMatrixNumRownnz(A); HYPRE_Complex *x_data = hypre_VectorData(x); HYPRE_Complex *b_data = hypre_VectorData(b) + offset; HYPRE_Complex *y_data = hypre_VectorData(y) + offset; HYPRE_Int x_size = hypre_VectorSize(x); HYPRE_Int b_size = hypre_VectorSize(b) - offset; HYPRE_Int y_size = hypre_VectorSize(y) - offset; HYPRE_Int num_vectors = hypre_VectorNumVectors(x); HYPRE_Int idxstride_y = hypre_VectorIndexStride(y); HYPRE_Int vecstride_y = hypre_VectorVectorStride(y); HYPRE_Int idxstride_b = hypre_VectorIndexStride(b); HYPRE_Int vecstride_b = hypre_VectorVectorStride(b); HYPRE_Int idxstride_x = hypre_VectorIndexStride(x); HYPRE_Int vecstride_x = hypre_VectorVectorStride(x); HYPRE_Complex temp, tempx; HYPRE_Int i, j, jj, m, ierr = 0; HYPRE_Real xpar = 0.7; hypre_Vector *x_tmp = NULL; /*--------------------------------------------------------------------- * Check for size compatibility. Matvec returns ierr = 1 if * length of X doesn't equal the number of columns of A, * ierr = 2 if the length of Y doesn't equal the number of rows * of A, and ierr = 3 if both are true. * * Because temporary vectors are often used in Matvec, none of * these conditions terminates processing, and the ierr flag * is informational only. *--------------------------------------------------------------------*/ hypre_assert(num_vectors == hypre_VectorNumVectors(y)); hypre_assert(num_vectors == hypre_VectorNumVectors(b)); hypre_assert(idxstride_b == idxstride_y); hypre_assert(vecstride_b == vecstride_y); if (num_cols != x_size) { ierr = 1; } if (num_rows != y_size || num_rows != b_size) { ierr = 2; } if (num_cols != x_size && (num_rows != y_size || num_rows != b_size)) { ierr = 3; } /*----------------------------------------------------------------------- * Do (alpha == 0.0) computation - RDF: USE MACHINE EPS *-----------------------------------------------------------------------*/ if (alpha == 0.0) { #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i) HYPRE_SMP_SCHEDULE #endif for (i = 0; i < num_rows * num_vectors; i++) { y_data[i] = beta * b_data[i]; } #ifdef HYPRE_PROFILE hypre_profile_times[HYPRE_TIMER_ID_MATVEC] += hypre_MPI_Wtime() - time_begin; #endif return ierr; } if (x == y) { x_tmp = hypre_SeqVectorCloneDeep(x); x_data = hypre_VectorData(x_tmp); } temp = beta / alpha; if (num_vectors > 1) { /*----------------------------------------------------------------------- * y = (beta/alpha)*b *-----------------------------------------------------------------------*/ if (temp == 0.0) { #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i) HYPRE_SMP_SCHEDULE #endif for (i = 0; i < num_rows * num_vectors; i++) { y_data[i] = 0.0; } } else if (temp == 1.0) { #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i) HYPRE_SMP_SCHEDULE #endif for (i = 0; i < num_rows * num_vectors; i++) { y_data[i] = b_data[i]; } } else if (temp == -1.0) { #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i) HYPRE_SMP_SCHEDULE #endif for (i = 0; i < num_rows * num_vectors; i++) { y_data[i] = -b_data[i]; } } else { #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i) HYPRE_SMP_SCHEDULE #endif for (i = 0; i < num_rows * num_vectors; i++) { y_data[i] = temp * b_data[i]; } } /*----------------------------------------------------------------- * y += A*x *-----------------------------------------------------------------*/ if (num_rownnz < xpar * num_rows) { switch (num_vectors) { case 2: #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i,j,jj,m) HYPRE_SMP_SCHEDULE #endif for (i = 0; i < num_rownnz; i++) { m = A_rownnz[i]; HYPRE_Complex tmp[2] = {0.0, 0.0}; for (jj = A_i[m]; jj < A_i[m + 1]; jj++) { HYPRE_Int xidx = A_j[jj] * idxstride_x; HYPRE_Complex coef = A_data[jj]; tmp[0] += coef * x_data[xidx]; tmp[1] += coef * x_data[xidx + vecstride_x]; } HYPRE_Int yidx = m * idxstride_y; y_data[yidx] += tmp[0]; y_data[yidx + vecstride_y] += tmp[1]; } break; case 3: #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i,j,jj,m) HYPRE_SMP_SCHEDULE #endif for (i = 0; i < num_rownnz; i++) { m = A_rownnz[i]; HYPRE_Complex tmp[3] = {0.0, 0.0, 0.0}; for (jj = A_i[m]; jj < A_i[m + 1]; jj++) { HYPRE_Int xidx = A_j[jj] * idxstride_x; HYPRE_Complex coef = A_data[jj]; tmp[0] += coef * x_data[xidx]; tmp[1] += coef * x_data[xidx + vecstride_x]; tmp[2] += coef * x_data[xidx + 2 * vecstride_x]; } HYPRE_Int yidx = m * idxstride_y; y_data[yidx] += tmp[0]; y_data[yidx + vecstride_y] += tmp[1]; y_data[yidx + 2 * vecstride_y] += tmp[2]; } break; case 4: #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i,j,jj,m) HYPRE_SMP_SCHEDULE #endif for (i = 0; i < num_rownnz; i++) { m = A_rownnz[i]; HYPRE_Complex tmp[4] = {0.0, 0.0, 0.0, 0.0}; for (jj = A_i[m]; jj < A_i[m + 1]; jj++) { HYPRE_Int xidx = A_j[jj] * idxstride_x; HYPRE_Complex coef = A_data[jj]; tmp[0] += coef * x_data[xidx]; tmp[1] += coef * x_data[xidx + vecstride_x]; tmp[2] += coef * x_data[xidx + 2 * vecstride_x]; tmp[3] += coef * x_data[xidx + 3 * vecstride_x]; } HYPRE_Int yidx = m * idxstride_y; y_data[yidx] += tmp[0]; y_data[yidx + vecstride_y] += tmp[1]; y_data[yidx + 2 * vecstride_y] += tmp[2]; y_data[yidx + 3 * vecstride_y] += tmp[3]; } break; default: #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i,j,jj,m,tempx) HYPRE_SMP_SCHEDULE #endif for (i = 0; i < num_rownnz; i++) { m = A_rownnz[i]; for (j = 0; j < num_vectors; j++) { tempx = 0.0; for (jj = A_i[m]; jj < A_i[m + 1]; jj++) { tempx += A_data[jj] * x_data[j * vecstride_x + A_j[jj] * idxstride_x]; } y_data[j * vecstride_y + m * idxstride_y] += tempx; } } break; } /* switch (num_vectors) */ } else { switch (num_vectors) { case 2: #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i,j,jj) HYPRE_SMP_SCHEDULE #endif for (i = 0; i < num_rows; i++) { HYPRE_Complex tmp[2] = {0.0, 0.0}; for (jj = A_i[i]; jj < A_i[i + 1]; jj++) { HYPRE_Int xidx = A_j[jj] * idxstride_x; HYPRE_Complex coef = A_data[jj]; tmp[0] += coef * x_data[xidx]; tmp[1] += coef * x_data[xidx + vecstride_x]; } HYPRE_Int yidx = i * idxstride_y; y_data[yidx] += tmp[0]; y_data[yidx + vecstride_y] += tmp[1]; } break; case 3: #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i,j,jj) HYPRE_SMP_SCHEDULE #endif for (i = 0; i < num_rows; i++) { HYPRE_Complex tmp[3] = {0.0, 0.0, 0.0}; for (jj = A_i[i]; jj < A_i[i + 1]; jj++) { HYPRE_Int xidx = A_j[jj] * idxstride_x; HYPRE_Complex coef = A_data[jj]; tmp[0] += coef * x_data[xidx]; tmp[1] += coef * x_data[xidx + vecstride_x]; tmp[2] += coef * x_data[xidx + 2 * vecstride_x]; } HYPRE_Int yidx = i * idxstride_y; y_data[yidx] += tmp[0]; y_data[yidx + vecstride_y] += tmp[1]; y_data[yidx + 2 * vecstride_y] += tmp[2]; } break; case 4: #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i,j,jj) HYPRE_SMP_SCHEDULE #endif for (i = 0; i < num_rows; i++) { HYPRE_Complex tmp[4] = {0.0, 0.0, 0.0, 0.0}; for (jj = A_i[i]; jj < A_i[i + 1]; jj++) { HYPRE_Int xidx = A_j[jj] * idxstride_x; HYPRE_Complex coef = A_data[jj]; tmp[0] += coef * x_data[xidx]; tmp[1] += coef * x_data[xidx + vecstride_x]; tmp[2] += coef * x_data[xidx + 2 * vecstride_x]; tmp[3] += coef * x_data[xidx + 3 * vecstride_x]; } HYPRE_Int yidx = i * idxstride_y; y_data[yidx] += tmp[0]; y_data[yidx + vecstride_y] += tmp[1]; y_data[yidx + 2 * vecstride_y] += tmp[2]; y_data[yidx + 3 * vecstride_y] += tmp[3]; } break; default: #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i,j,jj,tempx) HYPRE_SMP_SCHEDULE #endif for (i = 0; i < num_rows; i++) { for (j = 0; j < num_vectors; ++j) { tempx = 0.0; for (jj = A_i[i]; jj < A_i[i + 1]; jj++) { tempx += A_data[jj] * x_data[j * vecstride_x + A_j[jj] * idxstride_x]; } y_data[j * vecstride_y + i * idxstride_y] += tempx; } } break; } /* switch (num_vectors) */ } /* if (num_rownnz < xpar * num_rows) */ /*----------------------------------------------------------------- * y = alpha*y *-----------------------------------------------------------------*/ if (alpha != 1.0) { #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i) HYPRE_SMP_SCHEDULE #endif for (i = 0; i < num_rows * num_vectors; i++) { y_data[i] *= alpha; } } } else if (num_rownnz < xpar * num_rows) { /* use rownnz pointer to do the A*x multiplication when num_rownnz is smaller than xpar*num_rows */ if (temp == 0.0) { #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i) HYPRE_SMP_SCHEDULE #endif for (i = 0; i < num_rows; i++) { y_data[i] = 0.0; } if (alpha == 1.0) { #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i,j,m,tempx) HYPRE_SMP_SCHEDULE #endif for (i = 0; i < num_rownnz; i++) { m = A_rownnz[i]; tempx = 0.0; for (j = A_i[m]; j < A_i[m + 1]; j++) { tempx += A_data[j] * x_data[A_j[j]]; } y_data[m] = tempx; } } // y = A*x else if (alpha == -1.0) { #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i,j,m,tempx) HYPRE_SMP_SCHEDULE #endif for (i = 0; i < num_rownnz; i++) { m = A_rownnz[i]; tempx = 0.0; for (j = A_i[m]; j < A_i[m + 1]; j++) { tempx -= A_data[j] * x_data[A_j[j]]; } y_data[m] = tempx; } } // y = -A*x else { #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i,j,m,tempx) HYPRE_SMP_SCHEDULE #endif for (i = 0; i < num_rownnz; i++) { m = A_rownnz[i]; tempx = 0.0; for (j = A_i[m]; j < A_i[m + 1]; j++) { tempx += A_data[j] * x_data[A_j[j]]; } y_data[m] = alpha * tempx; } } // y = alpha*A*x } // temp == 0 else if (temp == -1.0) // beta == -alpha { if (alpha == 1.0) { #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i) HYPRE_SMP_SCHEDULE #endif for (i = 0; i < num_rows; i++) { y_data[i] = -b_data[i]; } #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i,j,m,tempx) HYPRE_SMP_SCHEDULE #endif for (i = 0; i < num_rownnz; i++) { m = A_rownnz[i]; tempx = 0.0; for (j = A_i[m]; j < A_i[m + 1]; j++) { tempx += A_data[j] * x_data[A_j[j]]; } y_data[m] += tempx; } } // y = A*x - b else if (alpha == -1.0) { #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i) HYPRE_SMP_SCHEDULE #endif for (i = 0; i < num_rows; i++) { y_data[i] = b_data[i]; } #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i,j,m,tempx) HYPRE_SMP_SCHEDULE #endif for (i = 0; i < num_rownnz; i++) { m = A_rownnz[i]; tempx = 0.0; for (j = A_i[m]; j < A_i[m + 1]; j++) { tempx += A_data[j] * x_data[A_j[j]]; } y_data[m] -= tempx; } } // y = -A*x + b else { #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i) HYPRE_SMP_SCHEDULE #endif for (i = 0; i < num_rows; i++) { y_data[i] = -alpha * b_data[i]; } #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i,j,m,tempx) HYPRE_SMP_SCHEDULE #endif for (i = 0; i < num_rownnz; i++) { m = A_rownnz[i]; tempx = 0.0; for (j = A_i[m]; j < A_i[m + 1]; j++) { tempx += A_data[j] * x_data[A_j[j]]; } y_data[m] += alpha * tempx; } } // y = alpha*(A*x - b) } // temp == -1 else if (temp == 1.0) // beta == alpha { if (alpha == 1.0) { #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i) HYPRE_SMP_SCHEDULE #endif for (i = 0; i < num_rows; i++) { y_data[i] = b_data[i]; } #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i,j,m,tempx) HYPRE_SMP_SCHEDULE #endif for (i = 0; i < num_rownnz; i++) { m = A_rownnz[i]; tempx = 0.0; for (j = A_i[m]; j < A_i[m + 1]; j++) { tempx += A_data[j] * x_data[A_j[j]]; } y_data[m] += tempx; } } // y = A*x + b else if (alpha == -1.0) { #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i) HYPRE_SMP_SCHEDULE #endif for (i = 0; i < num_rows; i++) { y_data[i] = -b_data[i]; } #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i,j,m,tempx) HYPRE_SMP_SCHEDULE #endif for (i = 0; i < num_rownnz; i++) { m = A_rownnz[i]; tempx = 0.0; for (j = A_i[m]; j < A_i[m + 1]; j++) { tempx -= A_data[j] * x_data[A_j[j]]; } y_data[m] += tempx; } } // y = -A*x - b else { #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i) HYPRE_SMP_SCHEDULE #endif for (i = 0; i < num_rows; i++) { y_data[i] = alpha * b_data[i]; } #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i,j,m,tempx) HYPRE_SMP_SCHEDULE #endif for (i = 0; i < num_rownnz; i++) { m = A_rownnz[i]; tempx = 0.0; for (j = A_i[m]; j < A_i[m + 1]; j++) { tempx += A_data[j] * x_data[A_j[j]]; } y_data[m] += alpha * tempx; } } // y = alpha*(A*x + b) } else { if (alpha == 1.0) { #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i) HYPRE_SMP_SCHEDULE #endif for (i = 0; i < num_rows; i++) { y_data[i] = beta * b_data[i]; } #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i,j,m,tempx) HYPRE_SMP_SCHEDULE #endif for (i = 0; i < num_rownnz; i++) { m = A_rownnz[i]; tempx = 0.0; for (j = A_i[m]; j < A_i[m + 1]; j++) { tempx += A_data[j] * x_data[A_j[j]]; } y_data[m] += tempx; } } // y = A*x + beta*b else if (-1 == alpha) { #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i) HYPRE_SMP_SCHEDULE #endif for (i = 0; i < num_rows; i++) { y_data[i] = -temp * b_data[i]; } #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i,j,m,tempx) HYPRE_SMP_SCHEDULE #endif for (i = 0; i < num_rownnz; i++) { m = A_rownnz[i]; tempx = 0.0; for (j = A_i[m]; j < A_i[m + 1]; j++) { tempx -= A_data[j] * x_data[A_j[j]]; } y_data[m] += tempx; } } // y = -A*x - temp*b else { #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i) HYPRE_SMP_SCHEDULE #endif for (i = 0; i < num_rows; i++) { y_data[i] = beta * b_data[i]; } #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i,j,m,tempx) HYPRE_SMP_SCHEDULE #endif for (i = 0; i < num_rownnz; i++) { m = A_rownnz[i]; tempx = 0.0; for (j = A_i[m]; j < A_i[m + 1]; j++) { tempx += A_data[j] * x_data[A_j[j]]; } y_data[m] += alpha * tempx; } } // y = alpha*(A*x + temp*b) } // temp != 0 && temp != -1 && temp != 1 } else { #ifdef HYPRE_USING_OPENMP #pragma omp parallel private(i,jj,tempx) #endif { HYPRE_Int iBegin = hypre_CSRMatrixGetLoadBalancedPartitionBegin(A); HYPRE_Int iEnd = hypre_CSRMatrixGetLoadBalancedPartitionEnd(A); hypre_assert(iBegin <= iEnd); hypre_assert(iBegin >= 0 && iBegin <= num_rows); hypre_assert(iEnd >= 0 && iEnd <= num_rows); if (temp == 0.0) { if (alpha == 1.0) // JSP: a common path { for (i = iBegin; i < iEnd; i++) { tempx = 0.0; for (jj = A_i[i]; jj < A_i[i + 1]; jj++) { tempx += A_data[jj] * x_data[A_j[jj]]; } y_data[i] = tempx; } } // y = A*x else if (alpha == -1.0) { for (i = iBegin; i < iEnd; i++) { tempx = 0.0; for (jj = A_i[i]; jj < A_i[i + 1]; jj++) { tempx -= A_data[jj] * x_data[A_j[jj]]; } y_data[i] = tempx; } } // y = -A*x else { for (i = iBegin; i < iEnd; i++) { tempx = 0.0; for (jj = A_i[i]; jj < A_i[i + 1]; jj++) { tempx += A_data[jj] * x_data[A_j[jj]]; } y_data[i] = alpha * tempx; } } // y = alpha*A*x } // temp == 0 else if (temp == -1.0) // beta == -alpha { if (alpha == 1.0) // JSP: a common path { for (i = iBegin; i < iEnd; i++) { y_data[i] = -b_data[i]; tempx = 0.0; for (jj = A_i[i]; jj < A_i[i + 1]; jj++) { tempx += A_data[jj] * x_data[A_j[jj]]; } y_data[i] += tempx; } } // y = A*x - y else if (alpha == -1.0) // JSP: a common path { for (i = iBegin; i < iEnd; i++) { y_data[i] = b_data[i]; tempx = 0.0; for (jj = A_i[i]; jj < A_i[i + 1]; jj++) { tempx -= A_data[jj] * x_data[A_j[jj]]; } y_data[i] += tempx; } } // y = -A*x + y else { for (i = iBegin; i < iEnd; i++) { y_data[i] = -alpha * b_data[i]; tempx = 0.0; for (jj = A_i[i]; jj < A_i[i + 1]; jj++) { tempx += A_data[jj] * x_data[A_j[jj]]; } y_data[i] += alpha * tempx; } } // y = alpha*(A*x - y) } // temp == -1 else if (temp == 1.0) { if (alpha == 1.0) // JSP: a common path { for (i = iBegin; i < iEnd; i++) { y_data[i] = b_data[i]; tempx = 0.0; for (jj = A_i[i]; jj < A_i[i + 1]; jj++) { tempx += A_data[jj] * x_data[A_j[jj]]; } y_data[i] += tempx; } } // y = A*x + y else if (alpha == -1.0) { for (i = iBegin; i < iEnd; i++) { y_data[i] = -b_data[i]; tempx = 0.0; for (jj = A_i[i]; jj < A_i[i + 1]; jj++) { tempx -= A_data[jj] * x_data[A_j[jj]]; } y_data[i] += tempx; } } // y = -A*x - y else { for (i = iBegin; i < iEnd; i++) { y_data[i] = alpha * b_data[i]; tempx = 0.0; for (jj = A_i[i]; jj < A_i[i + 1]; jj++) { tempx += A_data[jj] * x_data[A_j[jj]]; } y_data[i] += alpha * tempx; } } // y = alpha*(A*x + y) } else { if (alpha == 1.0) // JSP: a common path { for (i = iBegin; i < iEnd; i++) { y_data[i] = b_data[i] * temp; tempx = 0.0; for (jj = A_i[i]; jj < A_i[i + 1]; jj++) { tempx += A_data[jj] * x_data[A_j[jj]]; } y_data[i] += tempx; } } // y = A*x + temp*y else if (alpha == -1.0) { for (i = iBegin; i < iEnd; i++) { y_data[i] = -b_data[i] * temp; tempx = 0.0; for (jj = A_i[i]; jj < A_i[i + 1]; jj++) { tempx -= A_data[jj] * x_data[A_j[jj]]; } y_data[i] += tempx; } } // y = -A*x - temp*y else { for (i = iBegin; i < iEnd; i++) { y_data[i] = b_data[i] * beta; tempx = 0.0; for (jj = A_i[i]; jj < A_i[i + 1]; jj++) { tempx += A_data[jj] * x_data[A_j[jj]]; } y_data[i] += alpha * tempx; } } // y = alpha*(A*x + temp*y) } // temp != 0 && temp != -1 && temp != 1 } // omp parallel } if (x == y) { hypre_SeqVectorDestroy(x_tmp); } return ierr; } HYPRE_Int hypre_CSRMatrixMatvecOutOfPlace( HYPRE_Complex alpha, hypre_CSRMatrix *A, hypre_Vector *x, HYPRE_Complex beta, hypre_Vector *b, hypre_Vector *y, HYPRE_Int offset ) { #ifdef HYPRE_PROFILE HYPRE_Real time_begin = hypre_MPI_Wtime(); #endif HYPRE_Int ierr = 0; #if defined(HYPRE_USING_GPU) || defined(HYPRE_USING_DEVICE_OPENMP) HYPRE_ExecutionPolicy exec = hypre_GetExecPolicy1( hypre_CSRMatrixMemoryLocation(A) ); if (exec == HYPRE_EXEC_DEVICE) { ierr = hypre_CSRMatrixMatvecDevice(0, alpha, A, x, beta, b, y, offset); } else #endif { ierr = hypre_CSRMatrixMatvecOutOfPlaceHost(alpha, A, x, beta, b, y, offset); } #ifdef HYPRE_PROFILE hypre_profile_times[HYPRE_TIMER_ID_MATVEC] += hypre_MPI_Wtime() - time_begin; #endif return ierr; } HYPRE_Int hypre_CSRMatrixMatvec( HYPRE_Complex alpha, hypre_CSRMatrix *A, hypre_Vector *x, HYPRE_Complex beta, hypre_Vector *y ) { return hypre_CSRMatrixMatvecOutOfPlace(alpha, A, x, beta, y, y, 0); } /*-------------------------------------------------------------------------- * hypre_CSRMatrixMatvecT * * This version is using a different (more efficient) threading scheme * Performs y <- alpha * A^T * x + beta * y * * From Van Henson's modification of hypre_CSRMatrixMatvec. *--------------------------------------------------------------------------*/ HYPRE_Int hypre_CSRMatrixMatvecTHost( HYPRE_Complex alpha, hypre_CSRMatrix *A, hypre_Vector *x, HYPRE_Complex beta, hypre_Vector *y ) { HYPRE_Complex *A_data = hypre_CSRMatrixData(A); HYPRE_Int *A_i = hypre_CSRMatrixI(A); HYPRE_Int *A_j = hypre_CSRMatrixJ(A); HYPRE_Int num_rows = hypre_CSRMatrixNumRows(A); HYPRE_Int num_cols = hypre_CSRMatrixNumCols(A); HYPRE_Complex *x_data = hypre_VectorData(x); HYPRE_Complex *y_data = hypre_VectorData(y); HYPRE_Int x_size = hypre_VectorSize(x); HYPRE_Int y_size = hypre_VectorSize(y); HYPRE_Int num_vectors = hypre_VectorNumVectors(x); HYPRE_Int idxstride_y = hypre_VectorIndexStride(y); HYPRE_Int vecstride_y = hypre_VectorVectorStride(y); HYPRE_Int idxstride_x = hypre_VectorIndexStride(x); HYPRE_Int vecstride_x = hypre_VectorVectorStride(x); HYPRE_Complex temp; HYPRE_Complex *y_data_expand; HYPRE_Int my_thread_num = 0, offset = 0; HYPRE_Int i, j, jv, jj; HYPRE_Int num_threads; HYPRE_Int ierr = 0; hypre_Vector *x_tmp = NULL; /*--------------------------------------------------------------------- * Check for size compatibility. MatvecT returns ierr = 1 if * length of X doesn't equal the number of rows of A, * ierr = 2 if the length of Y doesn't equal the number of * columns of A, and ierr = 3 if both are true. * * Because temporary vectors are often used in MatvecT, none of * these conditions terminates processing, and the ierr flag * is informational only. *--------------------------------------------------------------------*/ hypre_assert( num_vectors == hypre_VectorNumVectors(y) ); if (num_rows != x_size) { ierr = 1; } if (num_cols != y_size) { ierr = 2; } if (num_rows != x_size && num_cols != y_size) { ierr = 3; } /*----------------------------------------------------------------------- * Do (alpha == 0.0) computation - RDF: USE MACHINE EPS *-----------------------------------------------------------------------*/ if (alpha == 0.0) { #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i) HYPRE_SMP_SCHEDULE #endif for (i = 0; i < num_cols * num_vectors; i++) { y_data[i] *= beta; } return ierr; } if (x == y) { x_tmp = hypre_SeqVectorCloneDeep(x); x_data = hypre_VectorData(x_tmp); } /*----------------------------------------------------------------------- * y = (beta/alpha)*y *-----------------------------------------------------------------------*/ temp = beta / alpha; if (temp != 1.0) { if (temp == 0.0) { #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i) HYPRE_SMP_SCHEDULE #endif for (i = 0; i < num_cols * num_vectors; i++) { y_data[i] = 0.0; } } else { #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i) HYPRE_SMP_SCHEDULE #endif for (i = 0; i < num_cols * num_vectors; i++) { y_data[i] *= temp; } } } /*----------------------------------------------------------------- * y += A^T*x *-----------------------------------------------------------------*/ num_threads = hypre_NumThreads(); if (num_threads > 1) { y_data_expand = hypre_CTAlloc(HYPRE_Complex, num_threads * y_size, HYPRE_MEMORY_HOST); if ( num_vectors == 1 ) { #ifdef HYPRE_USING_OPENMP #pragma omp parallel private(i,jj,j,my_thread_num,offset) #endif { my_thread_num = hypre_GetThreadNum(); offset = y_size * my_thread_num; #ifdef HYPRE_USING_OPENMP #pragma omp for HYPRE_SMP_SCHEDULE #endif for (i = 0; i < num_rows; i++) { for (jj = A_i[i]; jj < A_i[i + 1]; jj++) { j = A_j[jj]; y_data_expand[offset + j] += A_data[jj] * x_data[i]; } } /* implied barrier (for threads)*/ #ifdef HYPRE_USING_OPENMP #pragma omp for HYPRE_SMP_SCHEDULE #endif for (i = 0; i < y_size; i++) { for (j = 0; j < num_threads; j++) { y_data[i] += y_data_expand[j * y_size + i]; } } } /* end parallel threaded region */ } else { /* multiple vector case is not threaded */ for (i = 0; i < num_rows; i++) { for ( jv = 0; jv < num_vectors; ++jv ) { for (jj = A_i[i]; jj < A_i[i + 1]; jj++) { j = A_j[jj]; y_data[ j * idxstride_y + jv * vecstride_y ] += A_data[jj] * x_data[ i * idxstride_x + jv * vecstride_x]; } } } } hypre_TFree(y_data_expand, HYPRE_MEMORY_HOST); } else { for (i = 0; i < num_rows; i++) { if ( num_vectors == 1 ) { for (jj = A_i[i]; jj < A_i[i + 1]; jj++) { j = A_j[jj]; y_data[j] += A_data[jj] * x_data[i]; } } else { for ( jv = 0; jv < num_vectors; ++jv ) { for (jj = A_i[i]; jj < A_i[i + 1]; jj++) { j = A_j[jj]; y_data[ j * idxstride_y + jv * vecstride_y ] += A_data[jj] * x_data[ i * idxstride_x + jv * vecstride_x ]; } } } } } /*----------------------------------------------------------------- * y = alpha*y *-----------------------------------------------------------------*/ if (alpha != 1.0) { #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i) HYPRE_SMP_SCHEDULE #endif for (i = 0; i < num_cols * num_vectors; i++) { y_data[i] *= alpha; } } if (x == y) { hypre_SeqVectorDestroy(x_tmp); } return ierr; } HYPRE_Int hypre_CSRMatrixMatvecT( HYPRE_Complex alpha, hypre_CSRMatrix *A, hypre_Vector *x, HYPRE_Complex beta, hypre_Vector *y ) { #ifdef HYPRE_PROFILE HYPRE_Real time_begin = hypre_MPI_Wtime(); #endif HYPRE_Int ierr = 0; #if defined(HYPRE_USING_GPU) || defined(HYPRE_USING_DEVICE_OPENMP) HYPRE_ExecutionPolicy exec = hypre_GetExecPolicy1( hypre_CSRMatrixMemoryLocation(A) ); if (exec == HYPRE_EXEC_DEVICE) { ierr = hypre_CSRMatrixMatvecDevice(1, alpha, A, x, beta, y, y, 0 ); } else #endif { ierr = hypre_CSRMatrixMatvecTHost(alpha, A, x, beta, y); } #ifdef HYPRE_PROFILE hypre_profile_times[HYPRE_TIMER_ID_MATVEC] += hypre_MPI_Wtime() - time_begin; #endif return ierr; } /*-------------------------------------------------------------------------- * hypre_CSRMatrixMatvec_FF *--------------------------------------------------------------------------*/ HYPRE_Int hypre_CSRMatrixMatvec_FF( HYPRE_Complex alpha, hypre_CSRMatrix *A, hypre_Vector *x, HYPRE_Complex beta, hypre_Vector *y, HYPRE_Int *CF_marker_x, HYPRE_Int *CF_marker_y, HYPRE_Int fpt ) { HYPRE_Complex *A_data = hypre_CSRMatrixData(A); HYPRE_Int *A_i = hypre_CSRMatrixI(A); HYPRE_Int *A_j = hypre_CSRMatrixJ(A); HYPRE_Int num_rows = hypre_CSRMatrixNumRows(A); HYPRE_Int num_cols = hypre_CSRMatrixNumCols(A); HYPRE_Complex *x_data = hypre_VectorData(x); HYPRE_Complex *y_data = hypre_VectorData(y); HYPRE_Int x_size = hypre_VectorSize(x); HYPRE_Int y_size = hypre_VectorSize(y); HYPRE_Complex temp; HYPRE_Int i, jj; HYPRE_Int ierr = 0; /*--------------------------------------------------------------------- * Check for size compatibility. Matvec returns ierr = 1 if * length of X doesn't equal the number of columns of A, * ierr = 2 if the length of Y doesn't equal the number of rows * of A, and ierr = 3 if both are true. * * Because temporary vectors are often used in Matvec, none of * these conditions terminates processing, and the ierr flag * is informational only. *--------------------------------------------------------------------*/ if (num_cols != x_size) { ierr = 1; } if (num_rows != y_size) { ierr = 2; } if (num_cols != x_size && num_rows != y_size) { ierr = 3; } /*----------------------------------------------------------------------- * Do (alpha == 0.0) computation - RDF: USE MACHINE EPS *-----------------------------------------------------------------------*/ if (alpha == 0.0) { #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i) HYPRE_SMP_SCHEDULE #endif for (i = 0; i < num_rows; i++) if (CF_marker_x[i] == fpt) { y_data[i] *= beta; } return ierr; } /*----------------------------------------------------------------------- * y = (beta/alpha)*y *-----------------------------------------------------------------------*/ temp = beta / alpha; if (temp != 1.0) { if (temp == 0.0) { #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i) HYPRE_SMP_SCHEDULE #endif for (i = 0; i < num_rows; i++) if (CF_marker_x[i] == fpt) { y_data[i] = 0.0; } } else { #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i) HYPRE_SMP_SCHEDULE #endif for (i = 0; i < num_rows; i++) if (CF_marker_x[i] == fpt) { y_data[i] *= temp; } } } /*----------------------------------------------------------------- * y += A*x *-----------------------------------------------------------------*/ #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i,jj) HYPRE_SMP_SCHEDULE #endif for (i = 0; i < num_rows; i++) { if (CF_marker_x[i] == fpt) { temp = y_data[i]; for (jj = A_i[i]; jj < A_i[i + 1]; jj++) if (CF_marker_y[A_j[jj]] == fpt) { temp += A_data[jj] * x_data[A_j[jj]]; } y_data[i] = temp; } } /*----------------------------------------------------------------- * y = alpha*y *-----------------------------------------------------------------*/ if (alpha != 1.0) { #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i) HYPRE_SMP_SCHEDULE #endif for (i = 0; i < num_rows; i++) if (CF_marker_x[i] == fpt) { y_data[i] *= alpha; } } return ierr; } hypre-2.33.0/src/seq_mv/csr_matvec_device.c000066400000000000000000000442751477326011500206420ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * Matvec functions for hypre_CSRMatrix class. * *****************************************************************************/ #include "seq_mv.h" #include "_hypre_utilities.hpp" #include "seq_mv.hpp" #if defined(HYPRE_USING_GPU) || defined(HYPRE_USING_DEVICE_OPENMP) #if CUSPARSE_VERSION >= CUSPARSE_NEWSPMM_VERSION #define HYPRE_CUSPARSE_SPMV_ALG CUSPARSE_SPMV_CSR_ALG2 #define HYPRE_CUSPARSE_SPMM_ALG CUSPARSE_SPMM_CSR_ALG3 #elif CUSPARSE_VERSION >= CUSPARSE_NEWAPI_VERSION #define HYPRE_CUSPARSE_SPMV_ALG CUSPARSE_CSRMV_ALG2 #define HYPRE_CUSPARSE_SPMM_ALG CUSPARSE_SPMM_CSR_ALG1 #else #define HYPRE_CUSPARSE_SPMV_ALG CUSPARSE_CSRMV_ALG2 #define HYPRE_CUSPARSE_SPMM_ALG CUSPARSE_CSRMM_ALG1 #endif /* y = alpha * A * x + beta * y * This function is supposed to be only used inside the other functions in this file */ static inline HYPRE_Int hypre_CSRMatrixMatvecDevice2( HYPRE_Int trans, HYPRE_Complex alpha, hypre_CSRMatrix *A, hypre_Vector *x, HYPRE_Complex beta, hypre_Vector *y, HYPRE_Int offset ) { /* Sanity check */ if (hypre_VectorData(x) == hypre_VectorData(y)) { hypre_error_w_msg(HYPRE_ERROR_GENERIC, "ERROR::x and y are the same pointer in hypre_CSRMatrixMatvecDevice2"); } #if defined(HYPRE_USING_CUSPARSE) || \ defined(HYPRE_USING_ROCSPARSE) || \ defined(HYPRE_USING_ONEMKLSPARSE) /* Input variables */ HYPRE_Int num_vectors_x = hypre_VectorNumVectors(x); HYPRE_Int num_vectors_y = hypre_VectorNumVectors(y); /* Local variables */ HYPRE_Int use_vendor = hypre_HandleSpMVUseVendor(hypre_handle()); #if defined(HYPRE_USING_CUSPARSE) && CUSPARSE_VERSION >= CUSPARSE_NEWAPI_VERSION HYPRE_Int multivec_storage_x = hypre_VectorMultiVecStorageMethod(x); HYPRE_Int multivec_storage_y = hypre_VectorMultiVecStorageMethod(y); /* Force use of hypre's SpMV for row-wise multivectors */ if ((num_vectors_x > 1 && multivec_storage_x == 1) || (num_vectors_y > 1 && multivec_storage_y == 1)) { use_vendor = 0; } #else /* TODO - enable cuda 10, rocsparse, and onemkle sparse support for multi-vectors */ if (num_vectors_x > 1 || num_vectors_y > 1) { use_vendor = 0; } #endif if (use_vendor) { #if defined(HYPRE_USING_CUSPARSE) hypre_CSRMatrixMatvecCusparse(trans, alpha, A, x, beta, y, offset); #elif defined(HYPRE_USING_ROCSPARSE) hypre_CSRMatrixMatvecRocsparse(trans, alpha, A, x, beta, y, offset); #elif defined(HYPRE_USING_ONEMKLSPARSE) hypre_CSRMatrixMatvecOnemklsparse(trans, alpha, A, x, beta, y, offset); #endif } else #endif // defined(HYPRE_USING_CUSPARSE) || defined(HYPRE_USING_ROCSPARSE) ... { #if defined(HYPRE_USING_GPU) hypre_CSRMatrixSpMVDevice(trans, alpha, A, x, beta, y, 0); #elif defined(HYPRE_USING_DEVICE_OPENMP) hypre_CSRMatrixMatvecOMPOffload(trans, alpha, A, x, beta, y, offset); #endif } return hypre_error_flag; } /* y = alpha * A * x + beta * b */ HYPRE_Int hypre_CSRMatrixMatvecDevice( HYPRE_Int trans, HYPRE_Complex alpha, hypre_CSRMatrix *A, hypre_Vector *x, HYPRE_Complex beta, hypre_Vector *b, hypre_Vector *y, HYPRE_Int offset ) { //hypre_GpuProfilingPushRange("CSRMatrixMatvec"); HYPRE_Int num_vectors = hypre_VectorNumVectors(x); // TODO: RL: do we need offset > 0 at all? hypre_assert(offset == 0); // VPM: offset > 0 does not work with multivectors. Remove offset? See comment above hypre_assert(!(offset != 0 && num_vectors > 1)); hypre_assert(num_vectors > 0); HYPRE_Int nx = trans ? hypre_CSRMatrixNumRows(A) : hypre_CSRMatrixNumCols(A); HYPRE_Int ny = trans ? hypre_CSRMatrixNumCols(A) : hypre_CSRMatrixNumRows(A); //RL: Note the "<=", since the vectors sometimes can be temporary work spaces that have // large sizes than the needed (such as in par_cheby.c) hypre_assert(ny <= hypre_VectorSize(y)); hypre_assert(nx <= hypre_VectorSize(x)); hypre_assert(ny <= hypre_VectorSize(b)); //hypre_CSRMatrixPrefetch(A, HYPRE_MEMORY_DEVICE); //hypre_SeqVectorPrefetch(x, HYPRE_MEMORY_DEVICE); //hypre_SeqVectorPrefetch(b, HYPRE_MEMORY_DEVICE); //if (hypre_VectorData(b) != hypre_VectorData(y)) //{ // hypre_SeqVectorPrefetch(y, HYPRE_MEMORY_DEVICE); //} if (hypre_VectorData(b) != hypre_VectorData(y)) { hypre_TMemcpy( hypre_VectorData(y) + offset, hypre_VectorData(b) + offset, HYPRE_Complex, (ny - offset) * num_vectors, hypre_VectorMemoryLocation(y), hypre_VectorMemoryLocation(b) ); } if (hypre_CSRMatrixNumNonzeros(A) <= 0 || alpha == 0.0) { hypre_SeqVectorScale(beta, y); } else { hypre_CSRMatrixMatvecDevice2(trans, alpha, A, x, beta, y, offset); } #if defined(HYPRE_USING_GPU) hypre_SyncComputeStream(); #endif //hypre_GpuProfilingPopRange(); return hypre_error_flag; } #if defined(HYPRE_USING_CUSPARSE) #if CUSPARSE_VERSION >= CUSPARSE_NEWAPI_VERSION /*-------------------------------------------------------------------------- * hypre_CSRMatrixMatvecCusparseNewAPI * * Sparse Matrix/(Multi)Vector interface to cusparse's API 11 * * Note: The descriptor variables are not saved to allow for generic input *--------------------------------------------------------------------------*/ HYPRE_Int hypre_CSRMatrixMatvecCusparseNewAPI( HYPRE_Int trans, HYPRE_Complex alpha, hypre_CSRMatrix *A, hypre_Vector *x, HYPRE_Complex beta, hypre_Vector *y, HYPRE_Int offset ) { /* Input variables */ HYPRE_Int num_vectors = hypre_VectorNumVectors(x); HYPRE_Int num_cols = trans ? hypre_CSRMatrixNumRows(A) : hypre_CSRMatrixNumCols(A); HYPRE_Int num_rows = trans ? hypre_CSRMatrixNumCols(A) : hypre_CSRMatrixNumRows(A); hypre_CSRMatrix *AT; hypre_CSRMatrix *B; /* SpMV data */ size_t bufferSize = 0; char *dBuffer = hypre_CSRMatrixGPUMatSpMVBuffer(A); cusparseHandle_t handle = hypre_HandleCusparseHandle(hypre_handle()); const cudaDataType data_type = hypre_HYPREComplexToCudaDataType(); const cusparseIndexType_t index_type = hypre_HYPREIntToCusparseIndexType(); /* Local cusparse descriptor variables */ cusparseSpMatDescr_t matA; cusparseDnVecDescr_t vecX, vecY; cusparseDnMatDescr_t matX, matY; /* We handle the transpose explicitly to ensure the same output each run * and for potential performance improvement memory for AT */ if (trans) { hypre_CSRMatrixTransposeDevice(A, &AT, 1); B = AT; } else { B = A; } /* Create cuSPARSE vector data structures */ matA = hypre_CSRMatrixToCusparseSpMat(B, offset); if (num_vectors == 1) { vecX = hypre_VectorToCusparseDnVec(x, 0, num_cols); vecY = hypre_VectorToCusparseDnVec(y, offset, num_rows - offset); } else { matX = hypre_VectorToCusparseDnMat(x); matY = hypre_VectorToCusparseDnMat(y); } if (!dBuffer) { if (num_vectors == 1) { HYPRE_CUSPARSE_CALL( cusparseSpMV_bufferSize(handle, CUSPARSE_OPERATION_NON_TRANSPOSE, &alpha, matA, vecX, &beta, vecY, data_type, HYPRE_CUSPARSE_SPMV_ALG, &bufferSize) ); } else { HYPRE_CUSPARSE_CALL( cusparseSpMM_bufferSize(handle, CUSPARSE_OPERATION_NON_TRANSPOSE, CUSPARSE_OPERATION_NON_TRANSPOSE, &alpha, matA, matX, &beta, matY, data_type, HYPRE_CUSPARSE_SPMM_ALG, &bufferSize) ); } dBuffer = hypre_TAlloc(char, bufferSize, HYPRE_MEMORY_DEVICE); hypre_CSRMatrixGPUMatSpMVBuffer(A) = dBuffer; #if CUSPARSE_VERSION >= CUSPARSE_NEWSPMM_VERSION if (num_vectors > 1) { HYPRE_CUSPARSE_CALL( cusparseSpMM_preprocess(handle, CUSPARSE_OPERATION_NON_TRANSPOSE, CUSPARSE_OPERATION_NON_TRANSPOSE, &alpha, matA, matX, &beta, matY, data_type, HYPRE_CUSPARSE_SPMM_ALG, dBuffer) ); } #endif } if (num_vectors == 1) { HYPRE_CUSPARSE_CALL( cusparseSpMV(handle, CUSPARSE_OPERATION_NON_TRANSPOSE, &alpha, matA, vecX, &beta, vecY, data_type, HYPRE_CUSPARSE_SPMV_ALG, dBuffer) ); } else { HYPRE_CUSPARSE_CALL( cusparseSpMM(handle, CUSPARSE_OPERATION_NON_TRANSPOSE, CUSPARSE_OPERATION_NON_TRANSPOSE, &alpha, matA, matX, &beta, matY, data_type, HYPRE_CUSPARSE_SPMM_ALG, dBuffer) ); } #if defined(HYPRE_USING_GPU) hypre_SyncComputeStream(); #endif /* Free memory */ HYPRE_CUSPARSE_CALL( cusparseDestroySpMat(matA) ); if (num_vectors == 1) { HYPRE_CUSPARSE_CALL( cusparseDestroyDnVec(vecX) ); HYPRE_CUSPARSE_CALL( cusparseDestroyDnVec(vecY) ); } else { HYPRE_CUSPARSE_CALL( cusparseDestroyDnMat(matX) ); HYPRE_CUSPARSE_CALL( cusparseDestroyDnMat(matY) ); } if (trans) { hypre_CSRMatrixDestroy(AT); } return hypre_error_flag; } #else // #if CUSPARSE_VERSION >= CUSPARSE_NEWAPI_VERSION HYPRE_Int hypre_CSRMatrixMatvecCusparseOldAPI( HYPRE_Int trans, HYPRE_Complex alpha, hypre_CSRMatrix *A, hypre_Vector *x, HYPRE_Complex beta, hypre_Vector *y, HYPRE_Int offset ) { #ifdef HYPRE_BIGINT #error "ERROR: cusparse old API should not be used when bigint is enabled!" #endif cusparseHandle_t handle = hypre_HandleCusparseHandle(hypre_handle()); cusparseMatDescr_t descr = hypre_CSRMatrixGPUMatDescr(A); hypre_CSRMatrix *B; if (trans) { hypre_CSRMatrixTransposeDevice(A, &B, 1); } else { B = A; } HYPRE_CUSPARSE_CALL( hypre_cusparse_csrmv(handle, CUSPARSE_OPERATION_NON_TRANSPOSE, hypre_CSRMatrixNumRows(B) - offset, hypre_CSRMatrixNumCols(B), hypre_CSRMatrixNumNonzeros(B), &alpha, descr, hypre_CSRMatrixData(B), hypre_CSRMatrixI(B) + offset, hypre_CSRMatrixJ(B), hypre_VectorData(x), &beta, hypre_VectorData(y) + offset) ); if (trans) { hypre_CSRMatrixDestroy(B); } return hypre_error_flag; } #endif // #if CUSPARSE_VERSION >= CUSPARSE_NEWAPI_VERSION HYPRE_Int hypre_CSRMatrixMatvecCusparse( HYPRE_Int trans, HYPRE_Complex alpha, hypre_CSRMatrix *A, hypre_Vector *x, HYPRE_Complex beta, hypre_Vector *y, HYPRE_Int offset ) { #if CUSPARSE_VERSION >= CUSPARSE_NEWAPI_VERSION /* Luke E: The generic API is techinically supported on 10.1,10.2 as a preview, * with Dscrmv being deprecated. However, there are limitations. * While in Cuda < 11, there are specific mentions of using csr2csc involving * transposed matrix products with dcsrm*, * they are not present in SpMV interface. */ hypre_CSRMatrixMatvecCusparseNewAPI(trans, alpha, A, x, beta, y, offset); #else hypre_CSRMatrixMatvecCusparseOldAPI(trans, alpha, A, x, beta, y, offset); #endif return hypre_error_flag; } #endif // #if defined(HYPRE_USING_CUSPARSE) #if defined(HYPRE_USING_ROCSPARSE) HYPRE_Int hypre_CSRMatrixMatvecRocsparse( HYPRE_Int trans, HYPRE_Complex alpha, hypre_CSRMatrix *A, hypre_Vector *x, HYPRE_Complex beta, hypre_Vector *y, HYPRE_Int offset ) { rocsparse_handle handle = hypre_HandleCusparseHandle(hypre_handle()); rocsparse_mat_descr descr = hypre_CSRMatrixGPUMatDescr(A); rocsparse_mat_info info = hypre_CSRMatrixGPUMatInfo(A); hypre_CSRMatrix *B; if (trans) { hypre_CSRMatrixTransposeDevice(A, &B, 1); } else { B = A; } HYPRE_ROCSPARSE_CALL( hypre_rocsparse_csrmv(handle, rocsparse_operation_none, hypre_CSRMatrixNumRows(B) - offset, hypre_CSRMatrixNumCols(B), hypre_CSRMatrixNumNonzeros(B), &alpha, descr, hypre_CSRMatrixData(B), hypre_CSRMatrixI(B) + offset, hypre_CSRMatrixJ(B), info, hypre_VectorData(x), &beta, hypre_VectorData(y) + offset) ); if (trans) { hypre_CSRMatrixDestroy(B); } return hypre_error_flag; } #endif // #if defined(HYPRE_USING_ROCSPARSE) #if defined(HYPRE_USING_ONEMKLSPARSE) HYPRE_Int hypre_CSRMatrixMatvecOnemklsparse( HYPRE_Int trans, HYPRE_Complex alpha, hypre_CSRMatrix *A, hypre_Vector *x, HYPRE_Complex beta, hypre_Vector *y, HYPRE_Int offset ) { sycl::queue *compute_queue = hypre_HandleComputeStream(hypre_handle()); hypre_CSRMatrix *AT; oneapi::mkl::sparse::matrix_handle_t matA_handle = hypre_CSRMatrixGPUMatHandle(A); hypre_GPUMatDataSetCSRData(A); if (trans) { hypre_CSRMatrixTransposeDevice(A, &AT, 1); hypre_GPUMatDataSetCSRData(AT); matA_handle = hypre_CSRMatrixGPUMatHandle(AT); } HYPRE_ONEMKL_CALL( oneapi::mkl::sparse::gemv(*compute_queue, oneapi::mkl::transpose::nontrans, alpha, matA_handle, hypre_VectorData(x), beta, hypre_VectorData(y) + offset).wait() ); if (trans) { hypre_CSRMatrixDestroy(AT); } return hypre_error_flag; } #endif // #if defined(HYPRE_USING_ROCSPARSE) #endif // #if defined(HYPRE_USING_GPU) || defined(HYPRE_USING_DEVICE_OPENMP) hypre-2.33.0/src/seq_mv/csr_matvec_oomp.c000066400000000000000000000044341477326011500203460ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * Matvec functions for hypre_CSRMatrix class. * *****************************************************************************/ #include "seq_mv.h" #include "_hypre_utilities.hpp" #if defined(HYPRE_USING_DEVICE_OPENMP) /*-------------------------------------------------------------------------- * hypre_CSRMatrixMatvec *--------------------------------------------------------------------------*/ /* y[offset:end] = alpha*A[offset:end,:]*x + beta*b[offset:end] */ HYPRE_Int hypre_CSRMatrixMatvecOMPOffload( HYPRE_Int trans, HYPRE_Complex alpha, hypre_CSRMatrix *A, hypre_Vector *x, HYPRE_Complex beta, hypre_Vector *y, HYPRE_Int offset ) { hypre_CSRMatrix *B; if (trans) { hypre_CSRMatrixTranspose(A, &B, 1); /* HYPRE_CUDA_CALL(cudaDeviceSynchronize()); */ } else { B = A; } HYPRE_Int A_nrows = hypre_CSRMatrixNumRows(B); HYPRE_Complex *A_data = hypre_CSRMatrixData(B); HYPRE_Int *A_i = hypre_CSRMatrixI(B); HYPRE_Int *A_j = hypre_CSRMatrixJ(B); HYPRE_Complex *x_data = hypre_VectorData(x); HYPRE_Complex *y_data = hypre_VectorData(y); HYPRE_Int i; #pragma omp target teams distribute parallel for private(i) is_device_ptr(A_data, A_i, A_j, y_data, x_data) for (i = offset; i < A_nrows; i++) { HYPRE_Complex tempx = 0.0; HYPRE_Int j; for (j = A_i[i]; j < A_i[i + 1]; j++) { tempx += A_data[j] * x_data[A_j[j]]; } y_data[i] = alpha * tempx + beta * y_data[i]; } /* HYPRE_CUDA_CALL(cudaDeviceSynchronize()); */ return hypre_error_flag; } #endif /* #if defined(HYPRE_USING_DEVICE_OPENMP) */ hypre-2.33.0/src/seq_mv/csr_spadd_device.c000066400000000000000000000153101477326011500204420ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "_hypre_onedpl.hpp" #include "seq_mv.h" #include "_hypre_utilities.hpp" #if defined(HYPRE_USING_GPU) /* This function effectively does (in Matlab notation) * C := alpha * A(:, a_colmap) * C(num_b, :) += beta * B(:, b_colmap) * * if num_b != NULL: A is ma x n and B is mb x n. len(num_b) == mb. * All numbers in num_b must be in [0,...,ma-1] * * if num_b == NULL: C = alpha * A + beta * B. ma == mb * * if d_ja_map/d_jb_map == NULL, it is [0:n) */ HYPRE_Int hypreDevice_CSRSpAdd( HYPRE_Int ma, /* num of rows of A */ HYPRE_Int mb, /* num of rows of B */ HYPRE_Int nnzA, HYPRE_Int nnzB, HYPRE_Int *d_ia, HYPRE_Int *d_ja, HYPRE_Complex alpha, HYPRE_Complex *d_aa, HYPRE_Int *d_ja_map, HYPRE_Int *d_ib, HYPRE_Int *d_jb, HYPRE_Complex beta, HYPRE_Complex *d_ab, HYPRE_Int *d_jb_map, HYPRE_Int *d_num_b, HYPRE_Int *nnzC_out, HYPRE_Int **d_ic_out, HYPRE_Int **d_jc_out, HYPRE_Complex **d_ac_out) { /* trivial case */ if (nnzA == 0 && nnzB == 0) { *d_ic_out = hypre_CTAlloc(HYPRE_Int, ma + 1, HYPRE_MEMORY_DEVICE); *d_jc_out = hypre_CTAlloc(HYPRE_Int, 0, HYPRE_MEMORY_DEVICE); *d_ac_out = hypre_CTAlloc(HYPRE_Complex, 0, HYPRE_MEMORY_DEVICE); *nnzC_out = 0; return hypre_error_flag; } #ifdef HYPRE_PROFILE hypre_profile_times[HYPRE_TIMER_ID_SPADD] -= hypre_MPI_Wtime(); #endif /* expansion size */ HYPRE_Int nnzT = nnzA + nnzB, nnzC; HYPRE_Int *d_it, *d_jt, *d_it_cp, *d_jt_cp, *d_ic, *d_jc; HYPRE_Complex *d_at, *d_at_cp, *d_ac; /* some trick here for memory alignment. maybe not worth it at all */ HYPRE_Int align = 32; HYPRE_Int nnzT2 = (nnzT + align - 1) / align * align; char *work_mem = hypre_TAlloc(char, (4 * sizeof(HYPRE_Int) + 2 * sizeof(HYPRE_Complex)) * nnzT2, HYPRE_MEMORY_DEVICE); char *work_mem_saved = work_mem; //d_it = hypre_TAlloc(HYPRE_Int, nnzT, HYPRE_MEMORY_DEVICE); //d_jt = hypre_TAlloc(HYPRE_Int, nnzT, HYPRE_MEMORY_DEVICE); //d_at = hypre_TAlloc(HYPRE_Complex, nnzT, HYPRE_MEMORY_DEVICE); d_it = (HYPRE_Int *) work_mem; work_mem += sizeof(HYPRE_Int) * nnzT2; d_jt = (HYPRE_Int *) work_mem; work_mem += sizeof(HYPRE_Int) * nnzT2; d_at = (HYPRE_Complex *) work_mem; work_mem += sizeof(HYPRE_Complex) * nnzT2; /* expansion: j */ if (d_ja_map) { #if defined(HYPRE_USING_SYCL) hypreSycl_gather(d_ja, d_ja + nnzA, d_ja_map, d_jt); #else HYPRE_THRUST_CALL(gather, d_ja, d_ja + nnzA, d_ja_map, d_jt); #endif } else { hypre_TMemcpy(d_jt, d_ja, HYPRE_Int, nnzA, HYPRE_MEMORY_DEVICE, HYPRE_MEMORY_DEVICE); } if (d_jb_map) { #if defined(HYPRE_USING_SYCL) hypreSycl_gather(d_jb, d_jb + nnzB, d_jb_map, d_jt + nnzA); #else HYPRE_THRUST_CALL(gather, d_jb, d_jb + nnzB, d_jb_map, d_jt + nnzA); #endif } else { hypre_TMemcpy(d_jt + nnzA, d_jb, HYPRE_Int, nnzB, HYPRE_MEMORY_DEVICE, HYPRE_MEMORY_DEVICE); } /* expansion: a */ if (alpha == 1.0) { hypre_TMemcpy(d_at, d_aa, HYPRE_Complex, nnzA, HYPRE_MEMORY_DEVICE, HYPRE_MEMORY_DEVICE); } else { hypreDevice_ComplexScalen( d_aa, nnzA, d_at, alpha ); } if (beta == 1.0) { hypre_TMemcpy(d_at + nnzA, d_ab, HYPRE_Complex, nnzB, HYPRE_MEMORY_DEVICE, HYPRE_MEMORY_DEVICE); } else { hypreDevice_ComplexScalen( d_ab, nnzB, d_at + nnzA, beta ); } /* expansion: i */ hypreDevice_CsrRowPtrsToIndices_v2(ma, nnzA, d_ia, d_it); if (d_num_b || mb <= 0) { hypreDevice_CsrRowPtrsToIndicesWithRowNum(mb, nnzB, d_ib, d_num_b, d_it + nnzA); } else { hypre_assert(ma == mb); hypreDevice_CsrRowPtrsToIndices_v2(mb, nnzB, d_ib, d_it + nnzA); } /* make copy of (it, jt, at), since reduce cannot be done in-place */ //d_it_cp = hypre_TAlloc(HYPRE_Int, nnzT, HYPRE_MEMORY_DEVICE); //d_jt_cp = hypre_TAlloc(HYPRE_Int, nnzT, HYPRE_MEMORY_DEVICE); //d_at_cp = hypre_TAlloc(HYPRE_Complex, nnzT, HYPRE_MEMORY_DEVICE); d_it_cp = (HYPRE_Int *) work_mem; work_mem += sizeof(HYPRE_Int) * nnzT2; d_jt_cp = (HYPRE_Int *) work_mem; work_mem += sizeof(HYPRE_Int) * nnzT2; d_at_cp = (HYPRE_Complex *) work_mem; work_mem += sizeof(HYPRE_Complex) * nnzT2; hypre_assert( (size_t) (work_mem - work_mem_saved) == (4 * sizeof(HYPRE_Int) + 2 * sizeof( HYPRE_Complex)) * ((size_t)nnzT2) ); /* sort: lexicographical order (row, col): hypreDevice_StableSortByTupleKey */ hypreDevice_StableSortByTupleKey(nnzT, d_it, d_jt, d_at, 0); /* compress */ /* returns end: so nnz = end - start */ nnzC = hypreDevice_ReduceByTupleKey(nnzT, d_it, d_jt, d_at, d_it_cp, d_jt_cp, d_at_cp); /* allocate final C */ d_jc = hypre_TAlloc(HYPRE_Int, nnzC, HYPRE_MEMORY_DEVICE); d_ac = hypre_TAlloc(HYPRE_Complex, nnzC, HYPRE_MEMORY_DEVICE); hypre_TMemcpy(d_jc, d_jt_cp, HYPRE_Int, nnzC, HYPRE_MEMORY_DEVICE, HYPRE_MEMORY_DEVICE); hypre_TMemcpy(d_ac, d_at_cp, HYPRE_Complex, nnzC, HYPRE_MEMORY_DEVICE, HYPRE_MEMORY_DEVICE); /* convert into ic: row idx --> row ptrs */ d_ic = hypreDevice_CsrRowIndicesToPtrs(ma, nnzC, d_it_cp); #ifdef HYPRE_DEBUG HYPRE_Int tmp_nnzC; hypre_TMemcpy(&tmp_nnzC, &d_ic[ma], HYPRE_Int, 1, HYPRE_MEMORY_HOST, HYPRE_MEMORY_DEVICE); hypre_assert(nnzC == tmp_nnzC); #endif /* hypre_TFree(d_it, HYPRE_MEMORY_DEVICE); hypre_TFree(d_jt, HYPRE_MEMORY_DEVICE); hypre_TFree(d_at, HYPRE_MEMORY_DEVICE); hypre_TFree(d_it_cp, HYPRE_MEMORY_DEVICE); hypre_TFree(d_jt_cp, HYPRE_MEMORY_DEVICE); hypre_TFree(d_at_cp, HYPRE_MEMORY_DEVICE); */ hypre_TFree(work_mem_saved, HYPRE_MEMORY_DEVICE); *nnzC_out = nnzC; *d_ic_out = d_ic; *d_jc_out = d_jc; *d_ac_out = d_ac; #ifdef HYPRE_PROFILE hypre_profile_times[HYPRE_TIMER_ID_SPADD] += hypre_MPI_Wtime(); #endif return hypre_error_flag; } #endif // defined(HYPRE_USING_GPU) hypre-2.33.0/src/seq_mv/csr_spgemm_device.c000066400000000000000000000116651477326011500206500ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "seq_mv.h" #include "csr_spgemm_device.h" #include "seq_mv.hpp" #if defined(HYPRE_USING_GPU) HYPRE_Int hypreDevice_CSRSpGemm(hypre_CSRMatrix *A, hypre_CSRMatrix *B, hypre_CSRMatrix **C_ptr) { HYPRE_Complex *d_a = hypre_CSRMatrixData(A); HYPRE_Int *d_ia = hypre_CSRMatrixI(A); HYPRE_Int *d_ja = hypre_CSRMatrixJ(A); HYPRE_Int m = hypre_CSRMatrixNumRows(A); HYPRE_Int k = hypre_CSRMatrixNumCols(A); HYPRE_Int nnza = hypre_CSRMatrixNumNonzeros(A); HYPRE_Complex *d_b = hypre_CSRMatrixData(B); HYPRE_Int *d_ib = hypre_CSRMatrixI(B); HYPRE_Int *d_jb = hypre_CSRMatrixJ(B); HYPRE_Int n = hypre_CSRMatrixNumCols(B); HYPRE_Int nnzb = hypre_CSRMatrixNumNonzeros(B); HYPRE_Complex *d_c; HYPRE_Int *d_ic; HYPRE_Int *d_jc; HYPRE_Int nnzC; hypre_CSRMatrix *C; *C_ptr = C = hypre_CSRMatrixCreate(m, n, 0); hypre_CSRMatrixMemoryLocation(C) = HYPRE_MEMORY_DEVICE; /* trivial case */ if (nnza == 0 || nnzb == 0) { hypre_CSRMatrixI(C) = hypre_CTAlloc(HYPRE_Int, m + 1, HYPRE_MEMORY_DEVICE); return hypre_error_flag; } #ifdef HYPRE_PROFILE hypre_profile_times[HYPRE_TIMER_ID_SPGEMM] -= hypre_MPI_Wtime(); #endif #ifdef HYPRE_SPGEMM_TIMING hypre_ForceSyncComputeStream(); HYPRE_Real ta = hypre_MPI_Wtime(); #endif /* use CUSPARSE or rocSPARSE*/ if (hypre_HandleSpgemmUseVendor(hypre_handle())) { #if defined(HYPRE_USING_CUSPARSE) hypreDevice_CSRSpGemmCusparse(m, k, n, hypre_CSRMatrixGPUMatDescr(A), nnza, d_ia, d_ja, d_a, hypre_CSRMatrixGPUMatDescr(B), nnzb, d_ib, d_jb, d_b, hypre_CSRMatrixGPUMatDescr(C), &nnzC, &d_ic, &d_jc, &d_c); #elif defined(HYPRE_USING_ROCSPARSE) hypreDevice_CSRSpGemmRocsparse(m, k, n, hypre_CSRMatrixGPUMatDescr(A), nnza, d_ia, d_ja, d_a, hypre_CSRMatrixGPUMatDescr(B), nnzb, d_ib, d_jb, d_b, hypre_CSRMatrixGPUMatDescr(C), hypre_CSRMatrixGPUMatInfo(C), &nnzC, &d_ic, &d_jc, &d_c); #elif defined(HYPRE_USING_ONEMKLSPARSE) hypreDevice_CSRSpGemmOnemklsparse( m, k, n, hypre_CSRMatrixGPUMatHandle(A), nnza, d_ia, d_ja, d_a, hypre_CSRMatrixGPUMatHandle(B), nnzb, d_ib, d_jb, d_b, hypre_CSRMatrixGPUMatHandle(C), &nnzC, &d_ic, &d_jc, &d_c); #else hypre_error_w_msg(HYPRE_ERROR_GENERIC, "Attempting to use device sparse matrix library for SpGEMM without having compiled support for it!\n"); #endif } else { d_a = hypre_CSRMatrixPatternOnly(A) ? NULL : d_a; d_b = hypre_CSRMatrixPatternOnly(B) ? NULL : d_b; HYPRE_Int *d_rc = hypre_TAlloc(HYPRE_Int, m, HYPRE_MEMORY_DEVICE); const HYPRE_Int alg = hypre_HandleSpgemmAlgorithm(hypre_handle()); if (hypre_HandleSpgemmNumBin(hypre_handle()) == 0) { hypreDevice_CSRSpGemmBinnedGetBlockNumDim(); } if (alg == 1) { hypreDevice_CSRSpGemmRownnz (m, k, n, nnza, d_ia, d_ja, d_ib, d_jb, 0 /* without input rc */, d_rc); hypreDevice_CSRSpGemmNumerWithRownnzUpperbound (m, k, n, d_ia, d_ja, d_a, d_ib, d_jb, d_b, d_rc, 1, &d_ic, &d_jc, &d_c, &nnzC); } else /* if (alg == 3) */ { const HYPRE_Int row_est_mtd = hypre_HandleSpgemmRownnzEstimateMethod(hypre_handle()); hypreDevice_CSRSpGemmRownnzEstimate(m, k, n, d_ia, d_ja, d_ib, d_jb, d_rc, row_est_mtd); HYPRE_Int rownnz_exact; hypreDevice_CSRSpGemmRownnzUpperbound (m, k, n, d_ia, d_ja, d_ib, d_jb, 1 /* with input rc */, d_rc, &rownnz_exact); hypreDevice_CSRSpGemmNumerWithRownnzUpperbound (m, k, n, d_ia, d_ja, d_a, d_ib, d_jb, d_b, d_rc, rownnz_exact, &d_ic, &d_jc, &d_c, &nnzC); } hypre_TFree(d_rc, HYPRE_MEMORY_DEVICE); } #ifdef HYPRE_SPGEMM_TIMING hypre_ForceSyncComputeStream(); HYPRE_Real tb = hypre_MPI_Wtime() - ta; HYPRE_SPGEMM_PRINT("SpGemm time %f\n", tb); #endif hypre_CSRMatrixNumNonzeros(C) = nnzC; hypre_CSRMatrixI(C) = d_ic; hypre_CSRMatrixJ(C) = d_jc; hypre_CSRMatrixData(C) = d_c; #ifdef HYPRE_PROFILE hypre_profile_times[HYPRE_TIMER_ID_SPGEMM] += hypre_MPI_Wtime(); #endif return hypre_error_flag; } #endif /* defined(HYPRE_USING_GPU) */ hypre-2.33.0/src/seq_mv/csr_spgemm_device.h000066400000000000000000000355621477326011500206570ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #ifndef CSR_SPGEMM_DEVICE_H #define CSR_SPGEMM_DEVICE_H #include "_hypre_utilities.hpp" #if defined(HYPRE_USING_GPU) #define COHEN_USE_SHMEM 0 static const char HYPRE_SPGEMM_HASH_TYPE = 'D'; /* bin settings 0 1 2 3 4 5 6 7 8 9 10 */ constexpr HYPRE_Int SYMBL_HASH_SIZE[11] = { 0, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 16384 }; #if defined(HYPRE_USING_CUDA) constexpr HYPRE_Int NUMER_HASH_SIZE[11] = { 0, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192 }; #elif defined(HYPRE_USING_HIP) constexpr HYPRE_Int NUMER_HASH_SIZE[11] = { 0, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096 }; #elif defined(HYPRE_USING_SYCL) constexpr HYPRE_Int NUMER_HASH_SIZE[11] = { 0, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096 }; #endif constexpr HYPRE_Int T_GROUP_SIZE[11] = { 0, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024 }; #if defined(HYPRE_USING_CUDA) #define HYPRE_SPGEMM_DEFAULT_BIN 5 #elif defined(HYPRE_USING_HIP) #define HYPRE_SPGEMM_DEFAULT_BIN 6 #elif defined(HYPRE_USING_SYCL) #define HYPRE_SPGEMM_DEFAULT_BIN 6 #endif /* unroll factor in the kernels */ #if defined(HYPRE_USING_CUDA) #define HYPRE_SPGEMM_NUMER_UNROLL 256 #define HYPRE_SPGEMM_SYMBL_UNROLL 512 #elif defined(HYPRE_USING_HIP) #define HYPRE_SPGEMM_NUMER_UNROLL 256 #define HYPRE_SPGEMM_SYMBL_UNROLL 512 #elif defined(HYPRE_USING_SYCL) #define HYPRE_SPGEMM_NUMER_UNROLL 256 #define HYPRE_SPGEMM_SYMBL_UNROLL 512 #endif //#define HYPRE_SPGEMM_TIMING //#define HYPRE_SPGEMM_PRINTF //#define HYPRE_SPGEMM_NVTX /* ----------------------------------------------------------------------------------------------- * * these are under the assumptions made in spgemm on block sizes: only use in csr_spgemm routines * where we assume CUDA block is 3D and blockDim.x * blockDim.y = GROUP_SIZE * Note - sycl linearizes indices differently from cuda, i.e. a cuda block with dimensions * (x, y, z) is equivalent to a sycl nd_range (z, y, x) *------------------------------------------------------------------------------------------------ */ /* the number of groups in block */ static __device__ __forceinline__ hypre_int get_num_groups(hypre_DeviceItem &item) { #if defined(HYPRE_USING_SYCL) return item.get_local_range(0); #else return blockDim.z; #endif } /* the group id in the block */ static __device__ __forceinline__ hypre_int get_group_id(hypre_DeviceItem &item) { #if defined(HYPRE_USING_SYCL) return item.get_local_id(0); #else return threadIdx.z; #endif } /* the thread id (lane) in the group */ static __device__ __forceinline__ hypre_int get_group_lane_id(hypre_DeviceItem &item) { #if defined(HYPRE_USING_SYCL) return item.get_local_id(1) * item.get_local_range(2) + item.get_local_id(2); #else return hypre_gpu_get_thread_id<2>(item); #endif } /* the warp id in the group */ template static __device__ __forceinline__ hypre_int get_warp_in_group_id(hypre_DeviceItem &item) { if (GROUP_SIZE <= HYPRE_WARP_SIZE) { return 0; } else { #if defined(HYPRE_USING_SYCL) return get_group_lane_id(item) >> HYPRE_WARP_BITSHIFT; #else return hypre_gpu_get_warp_id<2>(item); #endif } } /* group reads 2 values from ptr to v1 and v2 * GROUP_SIZE must be >= 2 */ template static __device__ __forceinline__ void group_read(hypre_DeviceItem &item, const HYPRE_Int *ptr, bool valid_ptr, HYPRE_Int &v1, HYPRE_Int &v2) { if (GROUP_SIZE >= HYPRE_WARP_SIZE) { /* lane = warp_lane * Note: use "2" since assume HYPRE_WARP_SIZE divides (blockDim.x * blockDim.y) */ #if defined(HYPRE_USING_SYCL) const HYPRE_Int lane = get_group_lane_id(item) & (HYPRE_WARP_SIZE - 1); #else const HYPRE_Int lane = hypre_gpu_get_lane_id<2>(item); #endif if (lane < 2) { v1 = read_only_load(ptr + lane); } v2 = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, v1, 1); v1 = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, v1, 0); } else { /* lane = group_lane */ const HYPRE_Int lane = get_group_lane_id(item); if (valid_ptr && lane < 2) { v1 = read_only_load(ptr + lane); } v2 = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, v1, 1, GROUP_SIZE); v1 = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, v1, 0, GROUP_SIZE); } } /* group reads a value from ptr to v1 * GROUP_SIZE must be >= 2 */ template static __device__ __forceinline__ void group_read(hypre_DeviceItem &item, const HYPRE_Int *ptr, bool valid_ptr, HYPRE_Int &v1) { if (GROUP_SIZE >= HYPRE_WARP_SIZE) { /* lane = warp_lane * Note: use "2" since assume HYPRE_WARP_SIZE divides (blockDim.x * blockDim.y) */ #if defined(HYPRE_USING_SYCL) const HYPRE_Int lane = get_group_lane_id(item) & (HYPRE_WARP_SIZE - 1); #else const HYPRE_Int lane = hypre_gpu_get_lane_id<2>(item); #endif if (!lane) { v1 = read_only_load(ptr); } v1 = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, v1, 0); } else { /* lane = group_lane */ const HYPRE_Int lane = get_group_lane_id(item); if (valid_ptr && !lane) { v1 = read_only_load(ptr); } v1 = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, v1, 0, GROUP_SIZE); } } template static __device__ __forceinline__ T group_reduce_sum(hypre_DeviceItem &item, T in) { #if defined(HYPRE_DEBUG) hypre_device_assert(GROUP_SIZE <= HYPRE_WARP_SIZE); #endif #pragma unroll for (hypre_int d = GROUP_SIZE / 2; d > 0; d >>= 1) { in += warp_shuffle_down_sync(item, HYPRE_WARP_FULL_MASK, in, d); } return in; } /* s_WarpData[NUM_GROUPS_PER_BLOCK * GROUP_SIZE / HYPRE_WARP_SIZE] */ template static __device__ __forceinline__ T group_reduce_sum(hypre_DeviceItem &item, T in, volatile T *s_WarpData) { #if defined(HYPRE_DEBUG) hypre_device_assert(GROUP_SIZE > HYPRE_WARP_SIZE); #endif T out = warp_reduce_sum(item, in); #if defined(HYPRE_USING_SYCL) const HYPRE_Int warp_lane_id = get_group_lane_id(item) & (HYPRE_WARP_SIZE - 1); #else const HYPRE_Int warp_lane_id = hypre_gpu_get_lane_id<2>(item); #endif const HYPRE_Int warp_id = hypre_gpu_get_warp_id<3>(item); if (warp_lane_id == 0) { s_WarpData[warp_id] = out; } block_sync(item); if (get_warp_in_group_id(item) == 0) { const T a = warp_lane_id < GROUP_SIZE / HYPRE_WARP_SIZE ? s_WarpData[warp_id + warp_lane_id] : 0.0; out = warp_reduce_sum(item, a); } block_sync(item); return out; } /* GROUP_SIZE must <= HYPRE_WARP_SIZE */ template static __device__ __forceinline__ T group_prefix_sum(hypre_DeviceItem &item, hypre_int lane_id, T in, T &all_sum) { #pragma unroll for (hypre_int d = 2; d <= GROUP_SIZE; d <<= 1) { T t = warp_shuffle_up_sync(item, HYPRE_WARP_FULL_MASK, in, d >> 1, GROUP_SIZE); if ( (lane_id & (d - 1)) == (d - 1) ) { in += t; } } all_sum = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, in, GROUP_SIZE - 1, GROUP_SIZE); if (lane_id == GROUP_SIZE - 1) { in = 0; } #pragma unroll for (hypre_int d = GROUP_SIZE >> 1; d > 0; d >>= 1) { T t = warp_shuffle_xor_sync(item, HYPRE_WARP_FULL_MASK, in, d, GROUP_SIZE); if ( (lane_id & (d - 1)) == (d - 1)) { if ( (lane_id & ((d << 1) - 1)) == ((d << 1) - 1) ) { in += t; } else { in = t; } } } return in; } template static __device__ __forceinline__ void group_sync(hypre_DeviceItem &item) { if (GROUP_SIZE <= HYPRE_WARP_SIZE) { warp_sync(item); } else { block_sync(item); } } /* Hash functions */ static __device__ __forceinline__ HYPRE_Int Hash2Func(HYPRE_Int key) { //return ( (key << 1) | 1 ); //TODO: 6 --> should depend on hash1 size return ( (key >> 6) | 1 ); } template static __device__ __forceinline__ HYPRE_Int HashFunc(HYPRE_Int m, HYPRE_Int key, HYPRE_Int i, HYPRE_Int prev) { HYPRE_Int hashval = 0; /* assume m is power of 2 */ if (HASHTYPE == 'L') { //hashval = (key + i) % m; hashval = ( prev + 1 ) & (m - 1); } else if (HASHTYPE == 'Q') { //hashval = (key + (i + i*i)/2) & (m-1); hashval = ( prev + i ) & (m - 1); } else if (HASHTYPE == 'D') { //hashval = (key + i*Hash2Func(key) ) & (m - 1); hashval = ( prev + Hash2Func(key) ) & (m - 1); } return hashval; } template static __device__ __forceinline__ HYPRE_Int HashFunc(HYPRE_Int key, HYPRE_Int i, HYPRE_Int prev) { HYPRE_Int hashval = 0; /* assume m is power of 2 */ if (HASHTYPE == 'L') { //hashval = (key + i) % SHMEM_HASH_SIZE; hashval = ( prev + 1 ) & (SHMEM_HASH_SIZE - 1); } else if (HASHTYPE == 'Q') { //hashval = (key + (i + i*i)/2) & (SHMEM_HASH_SIZE-1); hashval = ( prev + i ) & (SHMEM_HASH_SIZE - 1); } else if (HASHTYPE == 'D') { //hashval = (key + i*Hash2Func(key) ) & (SHMEM_HASH_SIZE - 1); hashval = ( prev + Hash2Func(key) ) & (SHMEM_HASH_SIZE - 1); } return hashval; } template #if (defined(THRUST_VERSION) && THRUST_VERSION < 101000) struct spgemm_bin_op : public thrust::unary_function #else struct spgemm_bin_op #endif { char s, t, u; /* s: base size of bins; t: lowest bin; u: highest bin */ spgemm_bin_op(char s_, char t_, char u_) { s = s_; t = t_; u = u_; } __device__ char operator()(const T &x) const { if (x <= 0) { return 0; } const T y = (x + s - 1) / s; if ( y <= (1 << (t - 1)) ) { return t; } for (char i = t; i < u - 1; i++) { if (y <= (1 << i)) { return i + 1; } } return u; } }; void hypre_create_ija(HYPRE_Int m, HYPRE_Int *row_id, HYPRE_Int *d_c, HYPRE_Int *d_i, HYPRE_Int **d_j, HYPRE_Complex **d_a, HYPRE_Int *nnz_ptr ); void hypre_create_ija(HYPRE_Int SHMEM_HASH_SIZE, HYPRE_Int m, HYPRE_Int *row_id, HYPRE_Int *d_c, HYPRE_Int *d_i, HYPRE_Int **d_j, HYPRE_Complex **d_a, HYPRE_Int *nnz_ptr ); HYPRE_Int hypre_SpGemmCreateGlobalHashTable( HYPRE_Int num_rows, HYPRE_Int *row_id, HYPRE_Int num_ghash, HYPRE_Int *row_sizes, HYPRE_Int SHMEM_HASH_SIZE, HYPRE_Int **ghash_i_ptr, HYPRE_Int **ghash_j_ptr, HYPRE_Complex **ghash_a_ptr, HYPRE_Int *ghash_size_ptr); HYPRE_Int hypreDevice_CSRSpGemmRownnzEstimate(HYPRE_Int m, HYPRE_Int k, HYPRE_Int n, HYPRE_Int *d_ia, HYPRE_Int *d_ja, HYPRE_Int *d_ib, HYPRE_Int *d_jb, HYPRE_Int *d_rc, HYPRE_Int row_est_mtd); HYPRE_Int hypreDevice_CSRSpGemmRownnzUpperbound(HYPRE_Int m, HYPRE_Int k, HYPRE_Int n, HYPRE_Int *d_ia, HYPRE_Int *d_ja, HYPRE_Int *d_ib, HYPRE_Int *d_jb, HYPRE_Int in_rc, HYPRE_Int *d_rc, HYPRE_Int *rownnz_exact_ptr); HYPRE_Int hypreDevice_CSRSpGemmRownnz(HYPRE_Int m, HYPRE_Int k, HYPRE_Int n, HYPRE_Int nnzA, HYPRE_Int *d_ia, HYPRE_Int *d_ja, HYPRE_Int *d_ib, HYPRE_Int *d_jb, HYPRE_Int in_rc, HYPRE_Int *d_rc); HYPRE_Int hypreDevice_CSRSpGemmNumerWithRownnzUpperbound(HYPRE_Int m, HYPRE_Int k, HYPRE_Int n, HYPRE_Int *d_ia, HYPRE_Int *d_ja, HYPRE_Complex *d_a, HYPRE_Int *d_ib, HYPRE_Int *d_jb, HYPRE_Complex *d_b, HYPRE_Int *d_rc, HYPRE_Int exact_rownnz, HYPRE_Int **d_ic_out, HYPRE_Int **d_jc_out, HYPRE_Complex **d_c_out, HYPRE_Int *nnzC); HYPRE_Int hypre_SpGemmCreateBins( HYPRE_Int m, char s, char t, char u, HYPRE_Int *d_rc, bool d_rc_indice_in, HYPRE_Int *d_rc_indice, HYPRE_Int *h_bin_ptr ); template HYPRE_Int hypre_spgemm_symbolic_rownnz( HYPRE_Int m, HYPRE_Int *row_ind, HYPRE_Int k, HYPRE_Int n, bool need_ghash, HYPRE_Int *d_ia, HYPRE_Int *d_ja, HYPRE_Int *d_ib, HYPRE_Int *d_jb, HYPRE_Int *d_rc, bool can_fail, char *d_rf ); template HYPRE_Int hypre_spgemm_numerical_with_rownnz( HYPRE_Int m, HYPRE_Int *row_ind, HYPRE_Int k, HYPRE_Int n, bool need_ghash, HYPRE_Int exact_rownnz, HYPRE_Int *d_ia, HYPRE_Int *d_ja, HYPRE_Complex *d_a, HYPRE_Int *d_ib, HYPRE_Int *d_jb, HYPRE_Complex *d_b, HYPRE_Int *d_rc, HYPRE_Int *d_ic, HYPRE_Int *d_jc, HYPRE_Complex *d_c ); template HYPRE_Int hypre_spgemm_symbolic_max_num_blocks( HYPRE_Int multiProcessorCount, HYPRE_Int *num_blocks_ptr, HYPRE_Int *block_size_ptr ); template HYPRE_Int hypre_spgemm_numerical_max_num_blocks( HYPRE_Int multiProcessorCount, HYPRE_Int *num_blocks_ptr, HYPRE_Int *block_size_ptr ); HYPRE_Int hypreDevice_CSRSpGemmBinnedGetBlockNumDim(); template HYPRE_Int hypreDevice_CSRSpGemmNumerPostCopy( HYPRE_Int m, HYPRE_Int *d_rc, HYPRE_Int *nnzC, HYPRE_Int **d_ic, HYPRE_Int **d_jc, HYPRE_Complex **d_c); template static constexpr HYPRE_Int hypre_spgemm_get_num_groups_per_block() { #if defined(HYPRE_USING_CUDA) return hypre_min(hypre_max(512 / GROUP_SIZE, 1), 64); #elif defined(HYPRE_USING_HIP) return hypre_max(512 / GROUP_SIZE, 1); #elif defined(HYPRE_USING_SYCL) return hypre_max(512 / GROUP_SIZE, 1); #endif } #if defined(HYPRE_SPGEMM_PRINTF) || defined(HYPRE_SPGEMM_TIMING) #define HYPRE_SPGEMM_PRINT(...) hypre_ParPrintf(hypre_MPI_COMM_WORLD, __VA_ARGS__) #else #define HYPRE_SPGEMM_PRINT(...) #endif #endif /* defined(HYPRE_USING_GPU) */ #endif /* #ifndef CSR_SPGEMM_DEVICE_H */ hypre-2.33.0/src/seq_mv/csr_spgemm_device_cusparse.c000066400000000000000000000331401477326011500225450ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "seq_mv.h" #include "_hypre_utilities.hpp" #include "seq_mv.hpp" #include "csr_spgemm_device.h" #if defined(HYPRE_USING_CUDA) && defined(HYPRE_USING_CUSPARSE) HYPRE_Int hypreDevice_CSRSpGemmCusparse(HYPRE_Int m, HYPRE_Int k, HYPRE_Int n, cusparseMatDescr_t descr_A, HYPRE_Int nnzA, HYPRE_Int *d_ia, HYPRE_Int *d_ja, HYPRE_Complex *d_a, cusparseMatDescr_t descr_B, HYPRE_Int nnzB, HYPRE_Int *d_ib, HYPRE_Int *d_jb, HYPRE_Complex *d_b, cusparseMatDescr_t descr_C, HYPRE_Int *nnzC_out, HYPRE_Int **d_ic_out, HYPRE_Int **d_jc_out, HYPRE_Complex **d_c_out) { #if CUSPARSE_VERSION >= CUSPARSE_NEWAPI_VERSION hypreDevice_CSRSpGemmCusparseGenericAPI(m, k, n, nnzA, d_ia, d_ja, d_a, nnzB, d_ib, d_jb, d_b, nnzC_out, d_ic_out, d_jc_out, d_c_out); HYPRE_UNUSED_VAR(descr_A); HYPRE_UNUSED_VAR(descr_B); HYPRE_UNUSED_VAR(descr_C); #else hypreDevice_CSRSpGemmCusparseOldAPI(m, k, n, descr_A, nnzA, d_ia, d_ja, d_a, descr_B, nnzB, d_ib, d_jb, d_b, descr_C, nnzC_out, d_ic_out, d_jc_out, d_c_out); #endif return hypre_error_flag; } #if CUSPARSE_VERSION >= CUSPARSE_NEWAPI_VERSION /* * @brief Uses Cusparse to calculate a sparse-matrix x sparse-matrix product in CSRS format. Supports Cusparse generic API (11+) * * @param[in] m Number of rows of A,C * @param[in] k Number of columns of B,C * @param[in] n Number of columns of A, number of rows of B * @param[in] nnzA Number of nonzeros in A * @param[in] *d_ia Array containing the row pointers of A * @param[in] *d_ja Array containing the column indices of A * @param[in] *d_a Array containing values of A * @param[in] nnzB Number of nonzeros in B * @param[in] *d_ib Array containing the row pointers of B * @param[in] *d_jb Array containing the column indices of B * @param[in] *d_b Array containing values of B * @param[out] *nnzC_out Pointer to address with number of nonzeros in C * @param[out] *d_ic_out Array containing the row pointers of C * @param[out] *d_jc_out Array containing the column indices of C * @param[out] *d_c_out Array containing values of C */ HYPRE_Int hypreDevice_CSRSpGemmCusparseGenericAPI(HYPRE_Int m, HYPRE_Int k, HYPRE_Int n, HYPRE_Int nnzA, HYPRE_Int *d_ia, HYPRE_Int *d_ja, HYPRE_Complex *d_a, HYPRE_Int nnzB, HYPRE_Int *d_ib, HYPRE_Int *d_jb, HYPRE_Complex *d_b, HYPRE_Int *nnzC_out, HYPRE_Int **d_ic_out, HYPRE_Int **d_jc_out, HYPRE_Complex **d_c_out) { cusparseHandle_t cusparsehandle = hypre_HandleCusparseHandle(hypre_handle()); //Initialize the descriptors for the mats HYPRE_Int *d_ic = hypre_TAlloc(HYPRE_Int, m + 1, HYPRE_MEMORY_DEVICE); cusparseSpMatDescr_t matA = hypre_CSRMatrixToCusparseSpMat_core(m, k, 0, nnzA, d_ia, d_ja, d_a); cusparseSpMatDescr_t matB = hypre_CSRMatrixToCusparseSpMat_core(k, n, 0, nnzB, d_ib, d_jb, d_b); cusparseSpMatDescr_t matC = hypre_CSRMatrixToCusparseSpMat_core(m, n, 0, 0, d_ic, NULL, NULL); cusparseOperation_t opA = CUSPARSE_OPERATION_NON_TRANSPOSE; cusparseOperation_t opB = CUSPARSE_OPERATION_NON_TRANSPOSE; /* Create the SpGEMM Descriptor */ cusparseSpGEMMDescr_t spgemmDesc; HYPRE_CUSPARSE_CALL( cusparseSpGEMM_createDescr(&spgemmDesc) ); cudaDataType computeType = hypre_HYPREComplexToCudaDataType(); HYPRE_Complex alpha = 1.0; HYPRE_Complex beta = 0.0; size_t bufferSize1; size_t bufferSize2; void *dBuffer1 = NULL; void *dBuffer2 = NULL; #ifdef HYPRE_SPGEMM_TIMING HYPRE_Real t1, t2; #endif #ifdef HYPRE_SPGEMM_TIMING hypre_ForceSyncComputeStream(); t1 = hypre_MPI_Wtime(); #endif /* Do work estimation */ HYPRE_CUSPARSE_CALL( cusparseSpGEMM_workEstimation(cusparsehandle, opA, opB, &alpha, matA, matB, &beta, matC, computeType, CUSPARSE_SPGEMM_DEFAULT, spgemmDesc, &bufferSize1, NULL) ); dBuffer1 = hypre_TAlloc(char, bufferSize1, HYPRE_MEMORY_DEVICE); HYPRE_CUSPARSE_CALL( cusparseSpGEMM_workEstimation(cusparsehandle, opA, opB, &alpha, matA, matB, &beta, matC, computeType, CUSPARSE_SPGEMM_DEFAULT, spgemmDesc, &bufferSize1, dBuffer1) ); #ifdef HYPRE_SPGEMM_TIMING hypre_ForceSyncComputeStream(); t2 = hypre_MPI_Wtime() - t1; hypre_printf("WorkEst %f\n", t2); #endif #ifdef HYPRE_SPGEMM_TIMING t1 = hypre_MPI_Wtime(); #endif /* Do computation */ HYPRE_CUSPARSE_CALL( cusparseSpGEMM_compute(cusparsehandle, opA, opB, &alpha, matA, matB, &beta, matC, computeType, CUSPARSE_SPGEMM_DEFAULT, spgemmDesc, &bufferSize2, NULL) ); dBuffer2 = hypre_TAlloc(char, bufferSize2, HYPRE_MEMORY_DEVICE); HYPRE_CUSPARSE_CALL( cusparseSpGEMM_compute(cusparsehandle, opA, opB, &alpha, matA, matB, &beta, matC, computeType, CUSPARSE_SPGEMM_DEFAULT, spgemmDesc, &bufferSize2, dBuffer2) ); #ifdef HYPRE_SPGEMM_TIMING hypre_ForceSyncComputeStream(); t2 = hypre_MPI_Wtime() - t1; hypre_printf("Compute %f\n", t2); #endif #ifdef HYPRE_SPGEMM_TIMING t1 = hypre_MPI_Wtime(); #endif /* Required by cusparse api (as of 11) to be int64_t */ int64_t C_num_rows, C_num_cols, nnzC; HYPRE_Int *d_jc; HYPRE_Complex *d_c; /* Get required information for C */ HYPRE_CUSPARSE_CALL( cusparseSpMatGetSize(matC, &C_num_rows, &C_num_cols, &nnzC) ); hypre_assert(C_num_rows == m); hypre_assert(C_num_cols == n); d_jc = hypre_TAlloc(HYPRE_Int, nnzC, HYPRE_MEMORY_DEVICE); d_c = hypre_TAlloc(HYPRE_Complex, nnzC, HYPRE_MEMORY_DEVICE); /* Setup the required descriptor for C */ HYPRE_CUSPARSE_CALL(cusparseCsrSetPointers(matC, d_ic, d_jc, d_c)); /* Copy the data into C */ HYPRE_CUSPARSE_CALL(cusparseSpGEMM_copy( cusparsehandle, opA, opB, &alpha, matA, matB, &beta, matC, computeType, CUSPARSE_SPGEMM_DEFAULT, spgemmDesc) ); #ifdef HYPRE_SPGEMM_TIMING hypre_ForceSyncComputeStream(); t2 = hypre_MPI_Wtime() - t1; hypre_printf("Copy %f\n", t2); #endif /* Cleanup the data */ HYPRE_CUSPARSE_CALL( cusparseSpGEMM_destroyDescr(spgemmDesc) ); HYPRE_CUSPARSE_CALL( cusparseDestroySpMat(matA) ); HYPRE_CUSPARSE_CALL( cusparseDestroySpMat(matB) ); HYPRE_CUSPARSE_CALL( cusparseDestroySpMat(matC) ); hypre_TFree(dBuffer1, HYPRE_MEMORY_DEVICE); hypre_TFree(dBuffer2, HYPRE_MEMORY_DEVICE); /* Assign the output */ *nnzC_out = nnzC; *d_ic_out = d_ic; *d_jc_out = d_jc; *d_c_out = d_c; return hypre_error_flag; } #else HYPRE_Int hypreDevice_CSRSpGemmCusparseOldAPI(HYPRE_Int m, HYPRE_Int k, HYPRE_Int n, cusparseMatDescr_t descr_A, HYPRE_Int nnzA, HYPRE_Int *d_ia, HYPRE_Int *d_ja, HYPRE_Complex *d_a, cusparseMatDescr_t descr_B, HYPRE_Int nnzB, HYPRE_Int *d_ib, HYPRE_Int *d_jb, HYPRE_Complex *d_b, cusparseMatDescr_t descr_C, HYPRE_Int *nnzC_out, HYPRE_Int **d_ic_out, HYPRE_Int **d_jc_out, HYPRE_Complex **d_c_out) { HYPRE_Int *d_ic, *d_jc, baseC, nnzC; HYPRE_Int *d_ja_sorted, *d_jb_sorted; HYPRE_Complex *d_c, *d_a_sorted, *d_b_sorted; #ifdef HYPRE_SPGEMM_TIMING HYPRE_Real t1, t2; #endif #ifdef HYPRE_SPGEMM_TIMING t1 = hypre_MPI_Wtime(); #endif /* Allocate space for sorted arrays */ d_a_sorted = hypre_TAlloc(HYPRE_Complex, nnzA, HYPRE_MEMORY_DEVICE); d_b_sorted = hypre_TAlloc(HYPRE_Complex, nnzB, HYPRE_MEMORY_DEVICE); d_ja_sorted = hypre_TAlloc(HYPRE_Int, nnzA, HYPRE_MEMORY_DEVICE); d_jb_sorted = hypre_TAlloc(HYPRE_Int, nnzB, HYPRE_MEMORY_DEVICE); cusparseHandle_t cusparsehandle = hypre_HandleCusparseHandle(hypre_handle()); cusparseOperation_t transA = CUSPARSE_OPERATION_NON_TRANSPOSE; cusparseOperation_t transB = CUSPARSE_OPERATION_NON_TRANSPOSE; /* Copy the unsorted over as the initial "sorted" */ hypre_TMemcpy(d_ja_sorted, d_ja, HYPRE_Int, nnzA, HYPRE_MEMORY_DEVICE, HYPRE_MEMORY_DEVICE); hypre_TMemcpy(d_a_sorted, d_a, HYPRE_Complex, nnzA, HYPRE_MEMORY_DEVICE, HYPRE_MEMORY_DEVICE); hypre_TMemcpy(d_jb_sorted, d_jb, HYPRE_Int, nnzB, HYPRE_MEMORY_DEVICE, HYPRE_MEMORY_DEVICE); hypre_TMemcpy(d_b_sorted, d_b, HYPRE_Complex, nnzB, HYPRE_MEMORY_DEVICE, HYPRE_MEMORY_DEVICE); /* Sort each of the CSR matrices */ hypre_SortCSRCusparse(m, k, nnzA, descr_A, d_ia, d_ja_sorted, d_a_sorted); hypre_SortCSRCusparse(k, n, nnzB, descr_B, d_ib, d_jb_sorted, d_b_sorted); #ifdef HYPRE_SPGEMM_TIMING hypre_ForceSyncComputeStream(); t2 = hypre_MPI_Wtime() - t1; hypre_printf("sort %f\n", t2); #endif #ifdef HYPRE_SPGEMM_TIMING t1 = hypre_MPI_Wtime(); #endif // nnzTotalDevHostPtr points to host memory HYPRE_Int *nnzTotalDevHostPtr = &nnzC; HYPRE_CUSPARSE_CALL( cusparseSetPointerMode(cusparsehandle, CUSPARSE_POINTER_MODE_HOST) ); d_ic = hypre_TAlloc(HYPRE_Int, m + 1, HYPRE_MEMORY_DEVICE); HYPRE_CUSPARSE_CALL( cusparseXcsrgemmNnz(cusparsehandle, transA, transB, m, n, k, descr_A, nnzA, d_ia, d_ja_sorted, descr_B, nnzB, d_ib, d_jb_sorted, descr_C, d_ic, nnzTotalDevHostPtr ) ); /* RL: this if is always true (code copied from cusparse manual */ if (NULL != nnzTotalDevHostPtr) { nnzC = *nnzTotalDevHostPtr; } else { hypre_TMemcpy(&nnzC, d_ic + m, HYPRE_Int, 1, HYPRE_MEMORY_HOST, HYPRE_MEMORY_DEVICE); hypre_TMemcpy(&baseC, d_ic, HYPRE_Int, 1, HYPRE_MEMORY_HOST, HYPRE_MEMORY_DEVICE); nnzC -= baseC; } #ifdef HYPRE_SPGEMM_TIMING hypre_ForceSyncComputeStream(); t2 = hypre_MPI_Wtime() - t1; hypre_printf("csrgemmNnz %f\n", t2); #endif #ifdef HYPRE_SPGEMM_TIMING t1 = hypre_MPI_Wtime(); #endif d_jc = hypre_TAlloc(HYPRE_Int, nnzC, HYPRE_MEMORY_DEVICE); d_c = hypre_TAlloc(HYPRE_Complex, nnzC, HYPRE_MEMORY_DEVICE); HYPRE_CUSPARSE_CALL( hypre_cusparse_csrgemm(cusparsehandle, transA, transB, m, n, k, descr_A, nnzA, d_a_sorted, d_ia, d_ja_sorted, descr_B, nnzB, d_b_sorted, d_ib, d_jb_sorted, descr_C, d_c, d_ic, d_jc) ); #ifdef HYPRE_SPGEMM_TIMING hypre_ForceSyncComputeStream(); t2 = hypre_MPI_Wtime() - t1; hypre_printf("csrgemm %f\n", t2); #endif *d_ic_out = d_ic; *d_jc_out = d_jc; *d_c_out = d_c; *nnzC_out = nnzC; hypre_TFree(d_a_sorted, HYPRE_MEMORY_DEVICE); hypre_TFree(d_b_sorted, HYPRE_MEMORY_DEVICE); hypre_TFree(d_ja_sorted, HYPRE_MEMORY_DEVICE); hypre_TFree(d_jb_sorted, HYPRE_MEMORY_DEVICE); return hypre_error_flag; } #endif /* #if CUSPARSE_VERSION >= CUSPARSE_NEWAPI_VERSION */ #endif /* #if defined(HYPRE_USING_CUDA) && defined(HYPRE_USING_CUSPARSE) */ hypre-2.33.0/src/seq_mv/csr_spgemm_device_numblocks.c000066400000000000000000000154051477326011500227210ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "seq_mv.h" #if defined(HYPRE_USING_GPU) #include "csr_spgemm_device.h" HYPRE_Int hypreDevice_CSRSpGemmBinnedGetBlockNumDim() { hypre_int multiProcessorCount = 0; /* bins 1, 2, ..., num_bins, are effective; 0 is reserved for empty rows */ const HYPRE_Int num_bins = 10; hypre_HandleSpgemmNumBin(hypre_handle()) = num_bins; #if defined(HYPRE_USING_CUDA) HYPRE_CUDA_CALL(cudaDeviceGetAttribute( &multiProcessorCount, cudaDevAttrMultiProcessorCount, hypre_HandleDevice(hypre_handle()))); #elif defined(HYPRE_USING_HIP) HYPRE_HIP_CALL(hipDeviceGetAttribute( &multiProcessorCount, hipDeviceAttributeMultiprocessorCount, hypre_HandleDevice(hypre_handle()))); #elif defined(HYPRE_USING_SYCL) multiProcessorCount = hypre_HandleDevice(hypre_handle())->get_info(); #endif typedef HYPRE_Int arrType[4][HYPRE_SPGEMM_MAX_NBIN + 1]; arrType &max_nblocks = hypre_HandleSpgemmBlockNumDim(hypre_handle()); for (HYPRE_Int i = 0; i < num_bins + 1; i++) { max_nblocks[0][i] = max_nblocks[1][i] = max_nblocks[2][i] = max_nblocks[3][i] = 0; } /* symbolic */ hypre_spgemm_symbolic_max_num_blocks< SYMBL_HASH_SIZE[1], T_GROUP_SIZE[1] > (multiProcessorCount, &max_nblocks[0][1], &max_nblocks[2][1]); hypre_spgemm_symbolic_max_num_blocks< SYMBL_HASH_SIZE[2], T_GROUP_SIZE[2] > (multiProcessorCount, &max_nblocks[0][2], &max_nblocks[2][2]); hypre_spgemm_symbolic_max_num_blocks< SYMBL_HASH_SIZE[3], T_GROUP_SIZE[3] > (multiProcessorCount, &max_nblocks[0][3], &max_nblocks[2][3]); hypre_spgemm_symbolic_max_num_blocks< SYMBL_HASH_SIZE[4], T_GROUP_SIZE[4] > (multiProcessorCount, &max_nblocks[0][4], &max_nblocks[2][4]); hypre_spgemm_symbolic_max_num_blocks< SYMBL_HASH_SIZE[5], T_GROUP_SIZE[5] > (multiProcessorCount, &max_nblocks[0][5], &max_nblocks[2][5]); hypre_spgemm_symbolic_max_num_blocks< SYMBL_HASH_SIZE[6], T_GROUP_SIZE[6] > (multiProcessorCount, &max_nblocks[0][6], &max_nblocks[2][6]); hypre_spgemm_symbolic_max_num_blocks< SYMBL_HASH_SIZE[7], T_GROUP_SIZE[7] > (multiProcessorCount, &max_nblocks[0][7], &max_nblocks[2][7]); hypre_spgemm_symbolic_max_num_blocks< SYMBL_HASH_SIZE[8], T_GROUP_SIZE[8] > (multiProcessorCount, &max_nblocks[0][8], &max_nblocks[2][8]); hypre_spgemm_symbolic_max_num_blocks< SYMBL_HASH_SIZE[9], T_GROUP_SIZE[9] > (multiProcessorCount, &max_nblocks[0][9], &max_nblocks[2][9]); hypre_spgemm_symbolic_max_num_blocks< SYMBL_HASH_SIZE[10], T_GROUP_SIZE[10] > (multiProcessorCount, &max_nblocks[0][10], &max_nblocks[2][10]); /* numeric */ hypre_spgemm_numerical_max_num_blocks< NUMER_HASH_SIZE[1], T_GROUP_SIZE[1] > (multiProcessorCount, &max_nblocks[1][1], &max_nblocks[3][1]); hypre_spgemm_numerical_max_num_blocks< NUMER_HASH_SIZE[2], T_GROUP_SIZE[2] > (multiProcessorCount, &max_nblocks[1][2], &max_nblocks[3][2]); hypre_spgemm_numerical_max_num_blocks< NUMER_HASH_SIZE[3], T_GROUP_SIZE[3] > (multiProcessorCount, &max_nblocks[1][3], &max_nblocks[3][3]); hypre_spgemm_numerical_max_num_blocks< NUMER_HASH_SIZE[4], T_GROUP_SIZE[4] > (multiProcessorCount, &max_nblocks[1][4], &max_nblocks[3][4]); hypre_spgemm_numerical_max_num_blocks< NUMER_HASH_SIZE[5], T_GROUP_SIZE[5] > (multiProcessorCount, &max_nblocks[1][5], &max_nblocks[3][5]); hypre_spgemm_numerical_max_num_blocks< NUMER_HASH_SIZE[6], T_GROUP_SIZE[6] > (multiProcessorCount, &max_nblocks[1][6], &max_nblocks[3][6]); hypre_spgemm_numerical_max_num_blocks< NUMER_HASH_SIZE[7], T_GROUP_SIZE[7] > (multiProcessorCount, &max_nblocks[1][7], &max_nblocks[3][7]); hypre_spgemm_numerical_max_num_blocks< NUMER_HASH_SIZE[8], T_GROUP_SIZE[8] > (multiProcessorCount, &max_nblocks[1][8], &max_nblocks[3][8]); hypre_spgemm_numerical_max_num_blocks< NUMER_HASH_SIZE[9], T_GROUP_SIZE[9] > (multiProcessorCount, &max_nblocks[1][9], &max_nblocks[3][9]); hypre_spgemm_numerical_max_num_blocks< NUMER_HASH_SIZE[10], T_GROUP_SIZE[10] > (multiProcessorCount, &max_nblocks[1][10], &max_nblocks[3][10]); /* highest bin with nonzero num blocks */ typedef HYPRE_Int arr2Type[2]; arr2Type &high_bin = hypre_HandleSpgemmHighestBin(hypre_handle()); for (HYPRE_Int i = num_bins; i >= 0; i--) { if (max_nblocks[0][i] > 0) { high_bin[0] = i; break; } } for (HYPRE_Int i = num_bins; i >= 0; i--) { if (max_nblocks[1][i] > 0) { high_bin[1] = i; break; } } /* this is just a heuristic; having more blocks (than max active) seems improving performance */ #if defined(HYPRE_USING_CUDA) for (HYPRE_Int i = 0; i < num_bins + 1; i++) { max_nblocks[0][i] *= 5; max_nblocks[1][i] *= 5; } #endif #if defined(HYPRE_SPGEMM_PRINTF) HYPRE_SPGEMM_PRINT("===========================================================================\n"); HYPRE_SPGEMM_PRINT("SM count %d\n", multiProcessorCount); HYPRE_SPGEMM_PRINT("Highest Bin Symbl %d, Numer %d\n", hypre_HandleSpgemmHighestBin(hypre_handle())[0], hypre_HandleSpgemmHighestBin(hypre_handle())[1]); HYPRE_SPGEMM_PRINT("---------------------------------------------------------------------------\n"); HYPRE_SPGEMM_PRINT("Bin: "); for (HYPRE_Int i = 0; i < num_bins + 1; i++) { HYPRE_SPGEMM_PRINT("%5d ", i); } HYPRE_SPGEMM_PRINT("\n"); HYPRE_SPGEMM_PRINT("---------------------------------------------------------------------------\n"); HYPRE_SPGEMM_PRINT("Sym-Bdim: "); for (HYPRE_Int i = 0; i < num_bins + 1; i++) { HYPRE_SPGEMM_PRINT("%5d ", hypre_HandleSpgemmBlockNumDim(hypre_handle())[2][i]); } HYPRE_SPGEMM_PRINT("\n"); HYPRE_SPGEMM_PRINT("Sym-Gdim: "); for (HYPRE_Int i = 0; i < num_bins + 1; i++) { HYPRE_SPGEMM_PRINT("%5d ", hypre_HandleSpgemmBlockNumDim(hypre_handle())[0][i]); } HYPRE_SPGEMM_PRINT("\n"); HYPRE_SPGEMM_PRINT("Num-Bdim: "); for (HYPRE_Int i = 0; i < num_bins + 1; i++) { HYPRE_SPGEMM_PRINT("%5d ", hypre_HandleSpgemmBlockNumDim(hypre_handle())[3][i]); } HYPRE_SPGEMM_PRINT("\n"); HYPRE_SPGEMM_PRINT("Num-Gdim: "); for (HYPRE_Int i = 0; i < num_bins + 1; i++) { HYPRE_SPGEMM_PRINT("%5d ", hypre_HandleSpgemmBlockNumDim(hypre_handle())[1][i]); } HYPRE_SPGEMM_PRINT("\n"); HYPRE_SPGEMM_PRINT("===========================================================================\n"); #endif return hypre_error_flag; } #endif /* defined(HYPRE_USING_GPU) */ hypre-2.33.0/src/seq_mv/csr_spgemm_device_numer.c000066400000000000000000000260731477326011500220550ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "_hypre_onedpl.hpp" #include "seq_mv.h" #include "csr_spgemm_device.h" #if defined(HYPRE_USING_GPU) /* * d_rc: input: nnz (upper bound) of each row * exact_rownnz: if d_rc is exact */ HYPRE_Int hypreDevice_CSRSpGemmNumerWithRownnzUpperboundNoBin( HYPRE_Int m, HYPRE_Int k, HYPRE_Int n, HYPRE_Int *d_ia, HYPRE_Int *d_ja, HYPRE_Complex *d_a, HYPRE_Int *d_ib, HYPRE_Int *d_jb, HYPRE_Complex *d_b, HYPRE_Int *d_rc, HYPRE_Int exact_rownnz, HYPRE_Int **d_ic_out, HYPRE_Int **d_jc_out, HYPRE_Complex **d_c_out, HYPRE_Int *nnzC_out ) { static constexpr HYPRE_Int SHMEM_HASH_SIZE = NUMER_HASH_SIZE[HYPRE_SPGEMM_DEFAULT_BIN]; static constexpr HYPRE_Int GROUP_SIZE = T_GROUP_SIZE[HYPRE_SPGEMM_DEFAULT_BIN]; static constexpr HYPRE_Int BIN = HYPRE_SPGEMM_DEFAULT_BIN; #ifdef HYPRE_SPGEMM_PRINTF #if defined(HYPRE_USING_SYCL) HYPRE_Int max_rc = HYPRE_ONEDPL_CALL(std::reduce, d_rc, d_rc + m, 0, sycl::maximum()); HYPRE_Int min_rc = HYPRE_ONEDPL_CALL(std::reduce, d_rc, d_rc + m, max_rc, sycl::minimum()); #else HYPRE_Int max_rc = HYPRE_THRUST_CALL(reduce, d_rc, d_rc + m, 0, thrust::maximum()); HYPRE_Int min_rc = HYPRE_THRUST_CALL(reduce, d_rc, d_rc + m, max_rc, thrust::minimum()); #endif HYPRE_SPGEMM_PRINT("%s[%d]: max RC %d, min RC %d\n", __FILE__, __LINE__, max_rc, min_rc); #endif /* if rc contains exact rownnz: can allocate the final C=(ic,jc,c) directly; if rc contains upper bound : it is a temporary space that is more than enough to store C */ HYPRE_Int *d_ic = hypre_TAlloc(HYPRE_Int, m + 1, HYPRE_MEMORY_DEVICE); HYPRE_Int *d_jc; HYPRE_Complex *d_c; HYPRE_Int nnzC = -1; hypre_create_ija(m, NULL, d_rc, d_ic, &d_jc, &d_c, &nnzC); #ifdef HYPRE_SPGEMM_PRINTF HYPRE_SPGEMM_PRINT("%s[%d]: nnzC %d\n", __FILE__, __LINE__, nnzC); #endif /* even with exact rownnz, still may need global hash, since shared hash is smaller than symbol */ hypre_spgemm_numerical_with_rownnz (m, NULL, k, n, true, exact_rownnz, d_ia, d_ja, d_a, d_ib, d_jb, d_b, d_rc, d_ic, d_jc, d_c); if (!exact_rownnz) { hypreDevice_CSRSpGemmNumerPostCopy(m, d_rc, &nnzC, &d_ic, &d_jc, &d_c); } *d_ic_out = d_ic; *d_jc_out = d_jc; *d_c_out = d_c; *nnzC_out = nnzC; return hypre_error_flag; } #define HYPRE_SPGEMM_NUMERICAL_WITH_ROWNNZ_BINNED2(BIN, BIN2, SHMEM_HASH_SIZE, GROUP_SIZE, EXACT_ROWNNZ, GHASH) \ { \ const HYPRE_Int p = h_bin_ptr[BIN - 1]; \ const HYPRE_Int q = h_bin_ptr[BIN]; \ const HYPRE_Int bs = q - p; \ if (bs) \ { \ HYPRE_SPGEMM_PRINT("bin[%d]: %d rows, p %d, q %d\n", BIN, bs, p, q); \ hypre_spgemm_numerical_with_rownnz \ (bs, d_rind + p, k, n, GHASH, EXACT_ROWNNZ, d_ia, d_ja, d_a, d_ib, d_jb, d_b, d_rc, d_ic, d_jc, d_c); \ } \ } #define HYPRE_SPGEMM_NUMERICAL_WITH_ROWNNZ_BINNED(BIN, SHMEM_HASH_SIZE, GROUP_SIZE, EXACT_ROWNNZ, GHASH) \ HYPRE_SPGEMM_NUMERICAL_WITH_ROWNNZ_BINNED2(BIN, BIN, SHMEM_HASH_SIZE, GROUP_SIZE, EXACT_ROWNNZ, GHASH) HYPRE_Int hypreDevice_CSRSpGemmNumerWithRownnzUpperboundBinned( HYPRE_Int m, HYPRE_Int k, HYPRE_Int n, HYPRE_Int *d_ia, HYPRE_Int *d_ja, HYPRE_Complex *d_a, HYPRE_Int *d_ib, HYPRE_Int *d_jb, HYPRE_Complex *d_b, HYPRE_Int *d_rc, HYPRE_Int exact_rownnz, HYPRE_Int **d_ic_out, HYPRE_Int **d_jc_out, HYPRE_Complex **d_c_out, HYPRE_Int *nnzC_out ) { /* if rc contains exact rownnz: can allocate the final C=(ic,jc,c) directly; if rc contains upper bound : it is a temporary space that is more than enough to store C */ HYPRE_Int *d_ic = hypre_TAlloc(HYPRE_Int, m + 1, HYPRE_MEMORY_DEVICE); HYPRE_Int *d_jc; HYPRE_Complex *d_c; HYPRE_Int nnzC = -1; hypre_create_ija(m, NULL, d_rc, d_ic, &d_jc, &d_c, &nnzC); #ifdef HYPRE_SPGEMM_PRINTF HYPRE_SPGEMM_PRINT("%s[%d]: nnzC %d\n", __FILE__, __LINE__, nnzC); #endif HYPRE_Int *d_rind = hypre_TAlloc(HYPRE_Int, m, HYPRE_MEMORY_DEVICE); HYPRE_Int h_bin_ptr[HYPRE_SPGEMM_MAX_NBIN + 1]; //HYPRE_Int num_bins = hypre_HandleSpgemmNumBin(hypre_handle()); HYPRE_Int high_bin = hypre_HandleSpgemmHighestBin(hypre_handle())[1]; const bool hbin9 = 9 == high_bin; const char s = NUMER_HASH_SIZE[1] / 2, t = 2, u = high_bin; hypre_SpGemmCreateBins(m, s, t, u, d_rc, false, d_rind, h_bin_ptr); #if 0 HYPRE_SPGEMM_NUMERICAL_WITH_ROWNNZ_BINNED( 1, NUMER_HASH_SIZE[ 1], T_GROUP_SIZE[ 1], exact_rownnz, false); #endif HYPRE_SPGEMM_NUMERICAL_WITH_ROWNNZ_BINNED( 2, NUMER_HASH_SIZE[ 2], T_GROUP_SIZE[ 2], exact_rownnz, false); HYPRE_SPGEMM_NUMERICAL_WITH_ROWNNZ_BINNED( 3, NUMER_HASH_SIZE[ 3], T_GROUP_SIZE[ 3], exact_rownnz, false); HYPRE_SPGEMM_NUMERICAL_WITH_ROWNNZ_BINNED( 4, NUMER_HASH_SIZE[ 4], T_GROUP_SIZE[ 4], exact_rownnz, false); HYPRE_SPGEMM_NUMERICAL_WITH_ROWNNZ_BINNED( 5, NUMER_HASH_SIZE[ 5], T_GROUP_SIZE[ 5], exact_rownnz, false); HYPRE_SPGEMM_NUMERICAL_WITH_ROWNNZ_BINNED( 6, NUMER_HASH_SIZE[ 6], T_GROUP_SIZE[ 6], exact_rownnz, false); HYPRE_SPGEMM_NUMERICAL_WITH_ROWNNZ_BINNED( 7, NUMER_HASH_SIZE[ 7], T_GROUP_SIZE[ 7], exact_rownnz, false); HYPRE_SPGEMM_NUMERICAL_WITH_ROWNNZ_BINNED( 8, NUMER_HASH_SIZE[ 8], T_GROUP_SIZE[ 8], exact_rownnz, false); HYPRE_SPGEMM_NUMERICAL_WITH_ROWNNZ_BINNED( 9, NUMER_HASH_SIZE[ 9], T_GROUP_SIZE[ 9], exact_rownnz, hbin9); HYPRE_SPGEMM_NUMERICAL_WITH_ROWNNZ_BINNED( 10, NUMER_HASH_SIZE[10], T_GROUP_SIZE[10], exact_rownnz, true); if (!exact_rownnz) { hypreDevice_CSRSpGemmNumerPostCopy(m, d_rc, &nnzC, &d_ic, &d_jc, &d_c); } *d_ic_out = d_ic; *d_jc_out = d_jc; *d_c_out = d_c; *nnzC_out = nnzC; hypre_TFree(d_rind, HYPRE_MEMORY_DEVICE); return hypre_error_flag; } HYPRE_Int hypreDevice_CSRSpGemmNumerWithRownnzUpperbound( HYPRE_Int m, HYPRE_Int k, HYPRE_Int n, HYPRE_Int *d_ia, HYPRE_Int *d_ja, HYPRE_Complex *d_a, HYPRE_Int *d_ib, HYPRE_Int *d_jb, HYPRE_Complex *d_b, HYPRE_Int *d_rc, HYPRE_Int exact_rownnz, HYPRE_Int **d_ic_out, HYPRE_Int **d_jc_out, HYPRE_Complex **d_c_out, HYPRE_Int *nnzC_out ) { HYPRE_UNUSED_VAR(exact_rownnz); #ifdef HYPRE_PROFILE hypre_profile_times[HYPRE_TIMER_ID_SPGEMM_NUMERIC] -= hypre_MPI_Wtime(); #endif #ifdef HYPRE_SPGEMM_NVTX hypre_GpuProfilingPushRange("CSRSpGemmNumer"); #endif #ifdef HYPRE_SPGEMM_TIMING HYPRE_Real t1 = hypre_MPI_Wtime(); #endif const HYPRE_Int binned = hypre_HandleSpgemmBinned(hypre_handle()); if (binned) { hypreDevice_CSRSpGemmNumerWithRownnzUpperboundBinned (m, k, n, d_ia, d_ja, d_a, d_ib, d_jb, d_b, d_rc, 1, d_ic_out, d_jc_out, d_c_out, nnzC_out); } else { hypreDevice_CSRSpGemmNumerWithRownnzUpperboundNoBin (m, k, n, d_ia, d_ja, d_a, d_ib, d_jb, d_b, d_rc, 1, d_ic_out, d_jc_out, d_c_out, nnzC_out); } #ifdef HYPRE_SPGEMM_TIMING hypre_ForceSyncComputeStream(); HYPRE_Real t2 = hypre_MPI_Wtime() - t1; HYPRE_SPGEMM_PRINT("SpGemmNumerical time %f\n", t2); #endif #ifdef HYPRE_SPGEMM_NVTX hypre_GpuProfilingPopRange(); #endif #ifdef HYPRE_PROFILE hypre_profile_times[HYPRE_TIMER_ID_SPGEMM_NUMERIC] += hypre_MPI_Wtime(); #endif return hypre_error_flag; } #endif /* defined(HYPRE_USING_GPU) */ hypre-2.33.0/src/seq_mv/csr_spgemm_device_numer.h000066400000000000000000001030041477326011500220500ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /*- - - - - - - - - - - - - - - - - - - - - - - - - - * Perform SpGEMM with Row Nnz Upper Bound *- - - - - - - - - - - - - - - - - - - - - - - - - - */ #include "seq_mv.h" #include "csr_spgemm_device.h" /*- - - - - - - - - - - - - - - - - - - - - - - - - - * Numerical Multiplication *- - - - - - - - - - - - - - - - - - - - - - - - - - */ #if defined(HYPRE_USING_GPU) /* HashKeys: assumed to be initialized as all -1's * HashVals: assumed to be initialized as all 0's * Key: assumed to be nonnegative */ template static __device__ __forceinline__ HYPRE_Int hypre_spgemm_hash_insert_numer( #if defined(HYPRE_USING_SYCL) HYPRE_Int *HashKeys, HYPRE_Complex *HashVals, #else volatile HYPRE_Int *HashKeys, volatile HYPRE_Complex *HashVals, #endif HYPRE_Int key, HYPRE_Complex val ) { HYPRE_Int j = 0; HYPRE_Int old = -1; #if defined(HYPRE_USING_HIP) && (HIP_VERSION == 50422804) /* VPM: see https://github.com/hypre-space/hypre/issues/875 */ #pragma unroll 8 #else #pragma unroll UNROLL_FACTOR #endif for (HYPRE_Int i = 0; i < SHMEM_HASH_SIZE; i++) { /* compute the hash value of key */ if (i == 0) { j = key & (SHMEM_HASH_SIZE - 1); } else { j = HashFunc(key, i, j); } /* try to insert key+1 into slot j */ #if defined(HYPRE_USING_SYCL) auto atomic_key = sycl::atomic_ref < HYPRE_Int, sycl::memory_order::relaxed, sycl::memory_scope::device, sycl::access::address_space::local_space > (HashKeys[j]); old = -1; atomic_key.compare_exchange_strong(old, key); #else old = atomicCAS((HYPRE_Int *)(HashKeys + j), -1, key); #endif if (old == -1 || old == key) { /* this slot was open or contained 'key', update value */ #if defined(HYPRE_USING_SYCL) auto atomic_val = sycl::atomic_ref < HYPRE_Complex, sycl::memory_order::relaxed, sycl::memory_scope::device, sycl::access::address_space::local_space > (HashVals[j]); /* WM: replacing fetch_add(), which has slow performance due to poor compiler interpretation */ /* atomic_val.fetch_add(val); */ auto curr = atomic_val.load(sycl::memory_order::relaxed); while (!atomic_val.compare_exchange_strong(curr, curr + val, sycl::memory_order::relaxed)) {} #else atomicAdd((HYPRE_Complex*)(HashVals + j), val); #endif return j; } } return -1; } template static __device__ __forceinline__ HYPRE_Int hypre_spgemm_hash_insert_numer( HYPRE_Int HashSize, #if defined(HYPRE_USING_SYCL) HYPRE_Int *HashKeys, HYPRE_Complex *HashVals, #else volatile HYPRE_Int *HashKeys, volatile HYPRE_Complex *HashVals, #endif HYPRE_Int key, HYPRE_Complex val ) { HYPRE_Int j = 0; HYPRE_Int old = -1; for (HYPRE_Int i = 0; i < HashSize; i++) { /* compute the hash value of key */ if (i == 0) { j = key & (HashSize - 1); } else { j = HashFunc(HashSize, key, i, j); } /* try to insert key+1 into slot j */ #if defined(HYPRE_USING_SYCL) auto atomic_key = sycl::atomic_ref < HYPRE_Int, sycl::memory_order::relaxed, sycl::memory_scope::device, sycl::access::address_space::local_space > (HashKeys[j]); old = -1; atomic_key.compare_exchange_strong(old, key); #else old = atomicCAS((HYPRE_Int *)(HashKeys + j), -1, key); #endif if (old == -1 || old == key) { /* this slot was open or contained 'key', update value */ #if defined(HYPRE_USING_SYCL) auto atomic_val = sycl::atomic_ref < HYPRE_Complex, sycl::memory_order::relaxed, sycl::memory_scope::device, sycl::access::address_space::local_space > (HashVals[j]); /* WM: replacing fetch_add(), which has slow performance due to poor compiler interpretation */ /* atomic_val.fetch_add(val); */ auto curr = atomic_val.load(sycl::memory_order::relaxed); while (!atomic_val.compare_exchange_strong(curr, curr + val, sycl::memory_order::relaxed)) {} #else atomicAdd((HYPRE_Complex*)(HashVals + j), val); #endif return j; } } return -1; } template static __device__ __forceinline__ void hypre_spgemm_compute_row_numer( hypre_DeviceItem &item, HYPRE_Int istart_a, HYPRE_Int iend_a, HYPRE_Int istart_c, #if defined(HYPRE_DEBUG) HYPRE_Int iend_c, #endif const HYPRE_Int *ja, const HYPRE_Complex *aa, const HYPRE_Int *ib, const HYPRE_Int *jb, const HYPRE_Complex *ab, HYPRE_Int *jc, HYPRE_Complex *ac, #if defined(HYPRE_USING_SYCL) HYPRE_Int *s_HashKeys, HYPRE_Complex *s_HashVals, #else volatile HYPRE_Int *s_HashKeys, volatile HYPRE_Complex *s_HashVals, #endif HYPRE_Int g_HashSize, HYPRE_Int *g_HashKeys, HYPRE_Complex *g_HashVals ) { #if defined(HYPRE_USING_SYCL) HYPRE_Int threadIdx_x = item.get_local_id(2); HYPRE_Int threadIdx_y = item.get_local_id(1); HYPRE_Int blockDim_x = item.get_local_range(2); HYPRE_Int blockDim_y = item.get_local_range(1); #else HYPRE_Int threadIdx_x = threadIdx.x; HYPRE_Int threadIdx_y = threadIdx.y; HYPRE_Int blockDim_x = blockDim.x; HYPRE_Int blockDim_y = blockDim.y; #endif /* load column idx and values of row of A */ for (HYPRE_Int i = istart_a + threadIdx_y; warp_any_sync(item, HYPRE_WARP_FULL_MASK, i < iend_a); i += blockDim_y) { HYPRE_Int rowB = -1; HYPRE_Complex mult = 0.0; if (threadIdx_x == 0 && i < iend_a) { rowB = read_only_load(ja + i); mult = aa ? read_only_load(aa + i) : 1.0; } #if 0 //const HYPRE_Int ymask = get_mask<4>(...); // TODO: need to confirm the behavior of __ballot_sync, leave it here for now //const HYPRE_Int num_valid_rows = __popc(__ballot_sync(ymask, valid_i)); //for (HYPRE_Int j = 0; j < num_valid_rows; j++) #endif /* threads in the same ygroup work on one row together */ rowB = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, rowB, 0, blockDim_x); mult = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, mult, 0, blockDim_x); /* open this row of B, collectively */ HYPRE_Int tmp = 0; if (rowB != -1 && threadIdx_x < 2) { tmp = read_only_load(ib + rowB + threadIdx_x); } const HYPRE_Int rowB_start = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, tmp, 0, blockDim_x); const HYPRE_Int rowB_end = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, tmp, 1, blockDim_x); #if defined(HYPRE_DEBUG) if (IA1) { hypre_device_assert(rowB == -1 || rowB_end - rowB_start == iend_c - istart_c); } #endif for (HYPRE_Int k = rowB_start + threadIdx_x; warp_any_sync(item, HYPRE_WARP_FULL_MASK, k < rowB_end); k += blockDim_x) { /* WM: todo - have a warp_any_sync(k < rowB_end) to enter the loop directly followed by if (k < rowB_end)... do we need the any_sync above? */ /* I seem to be getting a hang here in sycl... does the use of atomics below require all threads in the group/subgroup to hit this or something? */ if (k < rowB_end) { const HYPRE_Int k_idx = read_only_load(jb + k); const HYPRE_Complex k_val = (ab ? read_only_load(ab + k) : 1.0) * mult; if (IA1) { jc[istart_c + k - rowB_start] = k_idx; ac[istart_c + k - rowB_start] = k_val; } else { /* first try to insert into shared memory hash table */ HYPRE_Int pos = hypre_spgemm_hash_insert_numer (s_HashKeys, s_HashVals, k_idx, k_val); if (HAS_GHASH && -1 == pos) { pos = hypre_spgemm_hash_insert_numer (g_HashSize, g_HashKeys, g_HashVals, k_idx, k_val); } hypre_device_assert(pos != -1); } } } } } template static __device__ __forceinline__ HYPRE_Int hypre_spgemm_copy_from_hash_into_C_row( hypre_DeviceItem &item, HYPRE_Int lane_id, HYPRE_Int do_shared_copy, #if defined(HYPRE_USING_SYCL) HYPRE_Int *s_HashKeys, HYPRE_Complex *s_HashVals, #else volatile HYPRE_Int *s_HashKeys, volatile HYPRE_Complex *s_HashVals, #endif HYPRE_Int ghash_size, HYPRE_Int *jg_start, HYPRE_Complex *ag_start, HYPRE_Int *jc_start, HYPRE_Complex *ac_start ) { HYPRE_Int j = 0; const HYPRE_Int STEP_SIZE = hypre_min(GROUP_SIZE, HYPRE_WARP_SIZE); /* copy shared memory hash table into C */ //#pragma unroll UNROLL_FACTOR if (warp_any_sync(item, HYPRE_WARP_FULL_MASK, do_shared_copy)) { for (HYPRE_Int k = lane_id; k < SHMEM_HASH_SIZE; k += STEP_SIZE) { HYPRE_Int sum; HYPRE_Int key = do_shared_copy ? s_HashKeys[k] : -1; HYPRE_Int pos = group_prefix_sum(item, lane_id, (HYPRE_Int) (key != -1), sum); if (key != -1) { jc_start[j + pos] = key; ac_start[j + pos] = s_HashVals[k]; } j += sum; } } if (HAS_GHASH) { /* copy global memory hash table into C */ for (HYPRE_Int k = lane_id; warp_any_sync(item, HYPRE_WARP_FULL_MASK, k < ghash_size); k += STEP_SIZE) { HYPRE_Int sum; HYPRE_Int key = k < ghash_size ? jg_start[k] : -1; HYPRE_Int pos = group_prefix_sum(item, lane_id, (HYPRE_Int) (key != -1), sum); if (key != -1) { jc_start[j + pos] = key; ac_start[j + pos] = ag_start[k]; } j += sum; } } return j; } template __global__ void hypre_spgemm_numeric( hypre_DeviceItem &item, #if defined(HYPRE_USING_SYCL) char *shmem_ptr, #endif const HYPRE_Int M, const HYPRE_Int* __restrict__ rind, const HYPRE_Int* __restrict__ ia, const HYPRE_Int* __restrict__ ja, const HYPRE_Complex* __restrict__ aa, const HYPRE_Int* __restrict__ ib, const HYPRE_Int* __restrict__ jb, const HYPRE_Complex* __restrict__ ab, const HYPRE_Int* __restrict__ ic, HYPRE_Int* __restrict__ jc, HYPRE_Complex* __restrict__ ac, HYPRE_Int* __restrict__ rc, const HYPRE_Int* __restrict__ ig, HYPRE_Int* __restrict__ jg, HYPRE_Complex* __restrict__ ag ) { /* number of groups in the grid */ #if defined(HYPRE_USING_SYCL) volatile const HYPRE_Int grid_num_groups = get_num_groups(item) * item.get_group_range(2); #else volatile const HYPRE_Int grid_num_groups = get_num_groups(item) * gridDim.x; #endif /* group id inside the block */ volatile const HYPRE_Int group_id = get_group_id(item); /* group id in the grid */ #if defined(HYPRE_USING_SYCL) volatile const HYPRE_Int grid_group_id = item.get_group(2) * get_num_groups(item) + group_id; #else volatile const HYPRE_Int grid_group_id = blockIdx.x * get_num_groups(item) + group_id; #endif /* lane id inside the group */ volatile const HYPRE_Int lane_id = get_group_lane_id(item); #if defined(HYPRE_USING_SYCL) /* shared memory hash table */ HYPRE_Int *s_HashKeys = (HYPRE_Int*) & (shmem_ptr[0]); HYPRE_Complex *s_HashVals = (HYPRE_Complex*) & (s_HashKeys[NUM_GROUPS_PER_BLOCK * SHMEM_HASH_SIZE]); /* shared memory hash table for this group */ HYPRE_Int *group_s_HashKeys = s_HashKeys + group_id * SHMEM_HASH_SIZE; HYPRE_Complex *group_s_HashVals = s_HashVals + group_id * SHMEM_HASH_SIZE; #else /* shared memory hash table */ #if defined(HYPRE_SPGEMM_DEVICE_USE_DSHMEM) extern __shared__ volatile HYPRE_Int shared_mem[]; volatile HYPRE_Int *s_HashKeys = shared_mem; volatile HYPRE_Complex *s_HashVals = (volatile HYPRE_Complex *) &s_HashKeys[NUM_GROUPS_PER_BLOCK * SHMEM_HASH_SIZE]; #else __shared__ volatile HYPRE_Int s_HashKeys[NUM_GROUPS_PER_BLOCK * SHMEM_HASH_SIZE]; __shared__ volatile HYPRE_Complex s_HashVals[NUM_GROUPS_PER_BLOCK * SHMEM_HASH_SIZE]; #endif /* shared memory hash table for this group */ volatile HYPRE_Int *group_s_HashKeys = s_HashKeys + group_id * SHMEM_HASH_SIZE; volatile HYPRE_Complex *group_s_HashVals = s_HashVals + group_id * SHMEM_HASH_SIZE; #endif const HYPRE_Int UNROLL_FACTOR = hypre_min(HYPRE_SPGEMM_NUMER_UNROLL, SHMEM_HASH_SIZE); HYPRE_Int do_shared_copy; HYPRE_Int valid_ptr; #if defined(HYPRE_USING_SYCL) hypre_device_assert(item.get_local_range(2) * item.get_local_range(1) == GROUP_SIZE); #else hypre_device_assert(blockDim.x * blockDim.y == GROUP_SIZE); #endif /* Note - in cuda/hip, exited threads are not required to reach collective calls like * syncthreads(), but this is not true for sycl (all threads must call the collective). * Thus, all threads in the block must enter the loop (which is not ensured for cuda). */ #if defined(HYPRE_USING_SYCL) for (HYPRE_Int i = grid_group_id; sycl::any_of_group(item.get_group(), i < M); i += grid_num_groups) #else for (HYPRE_Int i = grid_group_id; warp_any_sync(item, HYPRE_WARP_FULL_MASK, i < M); i += grid_num_groups) #endif { #if defined(HYPRE_USING_SYCL) valid_ptr = warp_any_sync(item, HYPRE_WARP_FULL_MASK, i < M) && (GROUP_SIZE >= HYPRE_WARP_SIZE || i < M); #else valid_ptr = GROUP_SIZE >= HYPRE_WARP_SIZE || i < M; #endif HYPRE_Int ii = -1; if (HAS_RIND) { group_read(item, rind + i, valid_ptr, ii); } else { ii = i; } /* start/end position of global memory hash table */ HYPRE_Int istart_g = 0, iend_g = 0, ghash_size = 0; if (HAS_GHASH) { group_read(item, ig + grid_group_id, valid_ptr, istart_g, iend_g); /* size of global hash table allocated for this row (must be power of 2 and >= the actual size of the row of C) */ ghash_size = iend_g - istart_g; /* initialize group's global memory hash table */ for (HYPRE_Int k = lane_id; k < ghash_size; k += GROUP_SIZE) { jg[istart_g + k] = -1; ag[istart_g + k] = 0.0; } } /* initialize group's shared memory hash table */ if (valid_ptr) { #pragma unroll UNROLL_FACTOR for (HYPRE_Int k = lane_id; k < SHMEM_HASH_SIZE; k += GROUP_SIZE) { group_s_HashKeys[k] = -1; group_s_HashVals[k] = 0.0; } } group_sync(item); /* start/end position of row of A */ HYPRE_Int istart_a = 0, iend_a = 0; /* load the start and end position of row ii of A */ group_read(item, ia + ii, valid_ptr, istart_a, iend_a); /* start/end position of row of C */ HYPRE_Int istart_c = 0; #if defined(HYPRE_DEBUG) HYPRE_Int iend_c = 0; group_read(item, ic + ii, valid_ptr, istart_c, iend_c); #else group_read(item, ic + ii, valid_ptr, istart_c); #endif /* work with two hash tables */ if (iend_a == istart_a + 1) { hypre_spgemm_compute_row_numer (item, istart_a, iend_a, istart_c, #if defined(HYPRE_DEBUG) iend_c, #endif ja, aa, ib, jb, ab, jc, ac, group_s_HashKeys, group_s_HashVals, ghash_size, jg + istart_g, ag + istart_g); } else { hypre_spgemm_compute_row_numer (item, istart_a, iend_a, istart_c, #if defined(HYPRE_DEBUG) iend_c, #endif ja, aa, ib, jb, ab, jc, ac, group_s_HashKeys, group_s_HashVals, ghash_size, jg + istart_g, ag + istart_g); } if (GROUP_SIZE > HYPRE_WARP_SIZE) { group_sync(item); } HYPRE_Int jsum = 0; /* the first warp of the group copies results into the final C * if GROUP_SIZE < WARP_SIZE, the whole group copies */ if (get_warp_in_group_id(item) == 0) { do_shared_copy = (iend_a > istart_a + 1) && (valid_ptr); jsum = hypre_spgemm_copy_from_hash_into_C_row (item, lane_id, do_shared_copy, group_s_HashKeys, group_s_HashVals, ghash_size, jg + istart_g, ag + istart_g, jc + istart_c, ac + istart_c); #if defined(HYPRE_DEBUG) if (iend_a != istart_a + 1) { if (FAILED_SYMBL) { hypre_device_assert(istart_c + jsum <= iend_c); } else { hypre_device_assert(istart_c + jsum == iend_c); } } #endif } if (GROUP_SIZE > HYPRE_WARP_SIZE) { group_sync(item); } if (FAILED_SYMBL) { /* when symb mult was failed, save (exact) row nnz */ if ((valid_ptr) && lane_id == 0) { rc[ii] = jsum; } } } } /* SpGeMM with Rownnz/Upper bound */ template HYPRE_Int hypre_spgemm_numerical_with_rownnz( HYPRE_Int m, HYPRE_Int *row_ind, HYPRE_Int k, HYPRE_Int n, bool need_ghash, HYPRE_Int exact_rownnz, HYPRE_Int *d_ia, HYPRE_Int *d_ja, HYPRE_Complex *d_a, HYPRE_Int *d_ib, HYPRE_Int *d_jb, HYPRE_Complex *d_b, HYPRE_Int *d_rc, HYPRE_Int *d_ic, HYPRE_Int *d_jc, HYPRE_Complex *d_c ) { const HYPRE_Int num_groups_per_block = hypre_spgemm_get_num_groups_per_block(); #if defined(HYPRE_USING_CUDA) const HYPRE_Int BDIMX = hypre_min(4, GROUP_SIZE); #elif defined(HYPRE_USING_HIP) const HYPRE_Int BDIMX = hypre_min(4, GROUP_SIZE); #elif defined(HYPRE_USING_SYCL) const HYPRE_Int BDIMX = hypre_min(4, GROUP_SIZE); #endif const HYPRE_Int BDIMY = GROUP_SIZE / BDIMX; #if defined(HYPRE_USING_SYCL) /* CUDA kernel configurations: bDim.z is the number of groups in block */ dim3 bDim(num_groups_per_block, BDIMY, BDIMX); hypre_assert(bDim.get(2) * bDim.get(1) == GROUP_SIZE); // grid dimension (number of blocks) const HYPRE_Int num_blocks = hypre_min( hypre_HandleSpgemmBlockNumDim(hypre_handle())[1][BIN], (m + bDim.get(0) - 1) / bDim.get(0) ); dim3 gDim(1, 1, num_blocks); // number of active groups HYPRE_Int num_act_groups = hypre_min(bDim.get(0) * gDim.get(2), m); #else /* CUDA kernel configurations: bDim.z is the number of groups in block */ dim3 bDim(BDIMX, BDIMY, num_groups_per_block); hypre_assert(bDim.x * bDim.y == GROUP_SIZE); // grid dimension (number of blocks) const HYPRE_Int num_blocks = hypre_min( hypre_HandleSpgemmBlockNumDim(hypre_handle())[1][BIN], (HYPRE_Int) ((m + bDim.z - 1) / bDim.z) ); dim3 gDim( num_blocks ); // number of active groups HYPRE_Int num_act_groups = hypre_min((HYPRE_Int) (bDim.z * gDim.x), m); #endif const char HASH_TYPE = HYPRE_SPGEMM_HASH_TYPE; if (HASH_TYPE != 'L' && HASH_TYPE != 'Q' && HASH_TYPE != 'D') { hypre_error_w_msg(1, "Unrecognized hash type ... [L(inear), Q(uadratic), D(ouble)]\n"); } /* --------------------------------------------------------------------------- * build hash table * ---------------------------------------------------------------------------*/ HYPRE_Int *d_ghash_i = NULL; HYPRE_Int *d_ghash_j = NULL; HYPRE_Complex *d_ghash_a = NULL; HYPRE_Int ghash_size = 0; if (need_ghash) { hypre_SpGemmCreateGlobalHashTable(m, row_ind, num_act_groups, d_rc, SHMEM_HASH_SIZE, &d_ghash_i, &d_ghash_j, &d_ghash_a, &ghash_size); } #ifdef HYPRE_SPGEMM_PRINTF HYPRE_SPGEMM_PRINT("%s[%d], BIN[%d]: m %d k %d n %d, HASH %c, SHMEM_HASH_SIZE %d, GROUP_SIZE %d, " "exact_rownnz %d, need_ghash %d, ghash %p size %d\n", __FILE__, __LINE__, BIN, m, k, n, HASH_TYPE, SHMEM_HASH_SIZE, GROUP_SIZE, exact_rownnz, need_ghash, d_ghash_i, ghash_size); #if defined(HYPRE_USING_SYCL) HYPRE_SPGEMM_PRINT("kernel spec [%d %d %d] x [%d %d %d]\n", gDim.get(2), gDim.get(1), gDim.get(0), bDim.get(2), bDim.get(1), bDim.get(0)); #else HYPRE_SPGEMM_PRINT("kernel spec [%d %d %d] x [%d %d %d]\n", gDim.x, gDim.y, gDim.z, bDim.x, bDim.y, bDim.z); #endif #else HYPRE_UNUSED_VAR(k); HYPRE_UNUSED_VAR(n); #endif #if defined(HYPRE_SPGEMM_DEVICE_USE_DSHMEM) || defined(HYPRE_USING_SYCL) const size_t shmem_bytes = num_groups_per_block * SHMEM_HASH_SIZE * (sizeof(HYPRE_Int) + sizeof( HYPRE_Complex)); #else const size_t shmem_bytes = 0; #endif /* --------------------------------------------------------------------------- * numerical multiplication: * ---------------------------------------------------------------------------*/ hypre_assert(HAS_RIND == (row_ind != NULL) ); /* */ if (exact_rownnz) { if (ghash_size) { HYPRE_GPU_LAUNCH2 ( (hypre_spgemm_numeric), gDim, bDim, shmem_bytes, m, row_ind, d_ia, d_ja, d_a, d_ib, d_jb, d_b, d_ic, d_jc, d_c, NULL, d_ghash_i, d_ghash_j, d_ghash_a ); } else { HYPRE_GPU_LAUNCH2 ( (hypre_spgemm_numeric), gDim, bDim, shmem_bytes, m, row_ind, d_ia, d_ja, d_a, d_ib, d_jb, d_b, d_ic, d_jc, d_c, NULL, d_ghash_i, d_ghash_j, d_ghash_a ); } } else { if (ghash_size) { HYPRE_GPU_LAUNCH2 ( (hypre_spgemm_numeric), gDim, bDim, shmem_bytes, m, row_ind, d_ia, d_ja, d_a, d_ib, d_jb, d_b, d_ic, d_jc, d_c, d_rc, d_ghash_i, d_ghash_j, d_ghash_a ); } else { HYPRE_GPU_LAUNCH2 ( (hypre_spgemm_numeric), gDim, bDim, shmem_bytes, m, row_ind, d_ia, d_ja, d_a, d_ib, d_jb, d_b, d_ic, d_jc, d_c, d_rc, d_ghash_i, d_ghash_j, d_ghash_a ); } } hypre_TFree(d_ghash_i, HYPRE_MEMORY_DEVICE); hypre_TFree(d_ghash_j, HYPRE_MEMORY_DEVICE); hypre_TFree(d_ghash_a, HYPRE_MEMORY_DEVICE); return hypre_error_flag; } template __global__ void hypre_spgemm_copy_from_Cext_into_C( hypre_DeviceItem &item, HYPRE_Int M, HYPRE_Int *ix, HYPRE_Int *jx, HYPRE_Complex *ax, HYPRE_Int *ic, HYPRE_Int *jc, HYPRE_Complex *ac ) { /* number of groups in the grid */ #if defined(HYPRE_USING_SYCL) const HYPRE_Int grid_num_groups = get_num_groups(item) * item.get_group_range(2); #else const HYPRE_Int grid_num_groups = get_num_groups(item) * gridDim.x; #endif /* group id inside the block */ const HYPRE_Int group_id = get_group_id(item); /* group id in the grid */ #if defined(HYPRE_USING_SYCL) const HYPRE_Int grid_group_id = item.get_group_range(2) * get_num_groups(item) + group_id; #else const HYPRE_Int grid_group_id = blockIdx.x * get_num_groups(item) + group_id; #endif /* lane id inside the group */ const HYPRE_Int lane_id = get_group_lane_id(item); #if defined(HYPRE_USING_SYCL) hypre_device_assert(item.get_local_range(2) * item.get_local_range(1) == GROUP_SIZE); #else hypre_device_assert(blockDim.x * blockDim.y == GROUP_SIZE); #endif for (HYPRE_Int i = grid_group_id; warp_any_sync(item, HYPRE_WARP_FULL_MASK, i < M); i += grid_num_groups) { HYPRE_Int istart_c = 0, iend_c = 0, istart_x = 0; /* start/end position in C and X */ group_read(item, ic + i, GROUP_SIZE >= HYPRE_WARP_SIZE || i < M, istart_c, iend_c); #if defined(HYPRE_DEBUG) HYPRE_Int iend_x = 0; group_read(item, ix + i, GROUP_SIZE >= HYPRE_WARP_SIZE || i < M, istart_x, iend_x); hypre_device_assert(iend_c - istart_c <= iend_x - istart_x); #else group_read(item, ix + i, GROUP_SIZE >= HYPRE_WARP_SIZE || i < M, istart_x); #endif const HYPRE_Int p = istart_x - istart_c; for (HYPRE_Int k = istart_c + lane_id; k < iend_c; k += GROUP_SIZE) { jc[k] = jx[k + p]; ac[k] = ax[k + p]; } } } template HYPRE_Int hypreDevice_CSRSpGemmNumerPostCopy( HYPRE_Int m, HYPRE_Int *d_rc, HYPRE_Int *nnzC, HYPRE_Int **d_ic, HYPRE_Int **d_jc, HYPRE_Complex **d_c) { HYPRE_Int nnzC_new = hypreDevice_IntegerReduceSum(m, d_rc); hypre_assert(nnzC_new <= *nnzC && nnzC_new >= 0); if (nnzC_new < *nnzC) { HYPRE_Int *d_ic_new = hypre_TAlloc(HYPRE_Int, m + 1, HYPRE_MEMORY_DEVICE); HYPRE_Int *d_jc_new; HYPRE_Complex *d_c_new; /* alloc final C */ hypre_create_ija(m, NULL, d_rc, d_ic_new, &d_jc_new, &d_c_new, &nnzC_new); #ifdef HYPRE_SPGEMM_PRINTF HYPRE_SPGEMM_PRINT("%s[%d]: Post Copy: new nnzC %d\n", __FILE__, __LINE__, nnzC_new); #endif /* copy to the final C */ const HYPRE_Int num_groups_per_block = hypre_spgemm_get_num_groups_per_block(); dim3 bDim(GROUP_SIZE, 1, num_groups_per_block); #if defined(HYPRE_USING_SYCL) dim3 gDim(1, 1, (m + bDim.get(2) - 1) / bDim.get(2) ); #else dim3 gDim( (m + bDim.z - 1) / bDim.z ); #endif HYPRE_GPU_LAUNCH( (hypre_spgemm_copy_from_Cext_into_C), gDim, bDim, m, *d_ic, *d_jc, *d_c, d_ic_new, d_jc_new, d_c_new ); hypre_TFree(*d_ic, HYPRE_MEMORY_DEVICE); hypre_TFree(*d_jc, HYPRE_MEMORY_DEVICE); hypre_TFree(*d_c, HYPRE_MEMORY_DEVICE); *d_ic = d_ic_new; *d_jc = d_jc_new; *d_c = d_c_new; *nnzC = nnzC_new; } return hypre_error_flag; } template HYPRE_Int hypre_spgemm_numerical_max_num_blocks( HYPRE_Int multiProcessorCount, HYPRE_Int *num_blocks_ptr, HYPRE_Int *block_size_ptr ) { const char HASH_TYPE = HYPRE_SPGEMM_HASH_TYPE; const HYPRE_Int num_groups_per_block = hypre_spgemm_get_num_groups_per_block(); const HYPRE_Int block_size = num_groups_per_block * GROUP_SIZE; hypre_int numBlocksPerSm = 0; /* Note - sycl shmem is alwasy dynamic */ #if defined(HYPRE_SPGEMM_DEVICE_USE_DSHMEM) || defined(HYPRE_USING_SYCL) const hypre_int shmem_bytes = num_groups_per_block * SHMEM_HASH_SIZE * (sizeof(HYPRE_Int) + sizeof(HYPRE_Complex)); hypre_int dynamic_shmem_size = shmem_bytes; #else hypre_int dynamic_shmem_size = 0; #endif #if defined(HYPRE_SPGEMM_DEVICE_USE_DSHMEM) #if defined(HYPRE_USING_CUDA) /* with CUDA, to use > 48K shared memory, must use dynamic and must opt-in. BIN = 10 requires 96K */ hypre_int max_shmem_optin; hypre_GetDeviceMaxShmemSize(-1, NULL, &max_shmem_optin); if (dynamic_shmem_size <= max_shmem_optin) { HYPRE_CUDA_CALL( cudaFuncSetAttribute( hypre_spgemm_numeric, cudaFuncAttributeMaxDynamicSharedMemorySize, dynamic_shmem_size) ); HYPRE_CUDA_CALL( cudaFuncSetAttribute( hypre_spgemm_numeric, cudaFuncAttributeMaxDynamicSharedMemorySize, dynamic_shmem_size) ); HYPRE_CUDA_CALL( cudaFuncSetAttribute( hypre_spgemm_numeric, cudaFuncAttributeMaxDynamicSharedMemorySize, dynamic_shmem_size) ); HYPRE_CUDA_CALL( cudaFuncSetAttribute( hypre_spgemm_numeric, cudaFuncAttributeMaxDynamicSharedMemorySize, dynamic_shmem_size) ); /* HYPRE_CUDA_CALL( cudaFuncSetAttribute( hypre_spgemm_numeric, cudaFuncAttributeMaxDynamicSharedMemorySize, dynamic_shmem_size) ); */ } #endif #endif #if defined(HYPRE_USING_CUDA) HYPRE_CUDA_CALL(cudaOccupancyMaxActiveBlocksPerMultiprocessor( &numBlocksPerSm, hypre_spgemm_numeric, block_size, dynamic_shmem_size)); #endif #if defined(HYPRE_USING_HIP) HYPRE_HIP_CALL(hipOccupancyMaxActiveBlocksPerMultiprocessor( &numBlocksPerSm, hypre_spgemm_numeric, block_size, dynamic_shmem_size)); #endif #if defined(HYPRE_USING_SYCL) /* WM: todo */ numBlocksPerSm = 1; #endif *num_blocks_ptr = multiProcessorCount * numBlocksPerSm; *block_size_ptr = block_size; return hypre_error_flag; } #endif /* defined(HYPRE_USING_GPU) */ hypre-2.33.0/src/seq_mv/csr_spgemm_device_numer.in000066400000000000000000000036321477326011500222350ustar00rootroot00000000000000 /****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "seq_mv.h" #if defined(HYPRE_USING_GPU) #if HYPRE_SPGEMM_BIN >= 10 #define HYPRE_SPGEMM_DEVICE_USE_DSHMEM #endif #include template HYPRE_Int hypre_spgemm_numerical_with_rownnz < HYPRE_SPGEMM_BIN, NUMER_HASH_SIZE[HYPRE_SPGEMM_BIN], T_GROUP_SIZE[HYPRE_SPGEMM_BIN], true > ( HYPRE_Int m, HYPRE_Int *row_ind, HYPRE_Int k, HYPRE_Int n, bool need_ghash, HYPRE_Int exact_rownnz, HYPRE_Int *d_ia, HYPRE_Int *d_ja, HYPRE_Complex *d_a, HYPRE_Int *d_ib, HYPRE_Int *d_jb, HYPRE_Complex *d_b, HYPRE_Int *d_rc, HYPRE_Int *d_ic, HYPRE_Int *d_jc, HYPRE_Complex *d_c ); #if HYPRE_SPGEMM_BIN == HYPRE_SPGEMM_DEFAULT_BIN template HYPRE_Int hypre_spgemm_numerical_with_rownnz < HYPRE_SPGEMM_BIN, NUMER_HASH_SIZE[HYPRE_SPGEMM_BIN], T_GROUP_SIZE[HYPRE_SPGEMM_BIN], false > ( HYPRE_Int m, HYPRE_Int *row_ind, HYPRE_Int k, HYPRE_Int n, bool need_ghash, HYPRE_Int exact_rownnz, HYPRE_Int *d_ia, HYPRE_Int *d_ja, HYPRE_Complex *d_a, HYPRE_Int *d_ib, HYPRE_Int *d_jb, HYPRE_Complex *d_b, HYPRE_Int *d_rc, HYPRE_Int *d_ic, HYPRE_Int *d_jc, HYPRE_Complex *d_c ); #endif template HYPRE_Int hypre_spgemm_numerical_max_num_blocks < NUMER_HASH_SIZE[HYPRE_SPGEMM_BIN], T_GROUP_SIZE[HYPRE_SPGEMM_BIN] > ( HYPRE_Int multiProcessorCount, HYPRE_Int *num_blocks_ptr, HYPRE_Int *block_size_ptr ); #if HYPRE_SPGEMM_BIN == 5 template HYPRE_Int hypreDevice_CSRSpGemmNumerPostCopy ( HYPRE_Int m, HYPRE_Int *d_rc, HYPRE_Int *nnzC, HYPRE_Int **d_ic, HYPRE_Int **d_jc, HYPRE_Complex **d_c ); #endif #endif /* defined(HYPRE_USING_GPU) */ hypre-2.33.0/src/seq_mv/csr_spgemm_device_onemklsparse.c000066400000000000000000000326541477326011500234340ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "seq_mv.h" #include "_hypre_utilities.hpp" #include "seq_mv.hpp" #if defined(HYPRE_USING_SYCL) && defined(HYPRE_USING_ONEMKLSPARSE) HYPRE_Int hypreDevice_CSRSpGemmOnemklsparse(HYPRE_Int m, HYPRE_Int k, HYPRE_Int n, oneapi::mkl::sparse::matrix_handle_t handle_A, HYPRE_Int nnzA, HYPRE_Int *_d_ia, HYPRE_Int *_d_ja, HYPRE_Complex *d_a, oneapi::mkl::sparse::matrix_handle_t handle_B, HYPRE_Int nnzB, HYPRE_Int *_d_ib, HYPRE_Int *_d_jb, HYPRE_Complex *d_b, oneapi::mkl::sparse::matrix_handle_t handle_C, HYPRE_Int *nnzC_out, HYPRE_Int **d_ic_out, HYPRE_Int **d_jc_out, HYPRE_Complex **d_c_out) { /* Need these conversions in the case of the bigint build */ #if defined(HYPRE_BIGINT) std::int64_t *d_ia = reinterpret_cast(_d_ia); std::int64_t *d_ja = reinterpret_cast(_d_ja); std::int64_t *d_ib = reinterpret_cast(_d_ib); std::int64_t *d_jb = reinterpret_cast(_d_jb); std::int64_t *d_ic, *d_jc = NULL; std::int64_t *d_ja_sorted, *d_jb_sorted; /* Allocate space for sorted arrays */ d_ja_sorted = hypre_TAlloc(std::int64_t, nnzA, HYPRE_MEMORY_DEVICE); d_jb_sorted = hypre_TAlloc(std::int64_t, nnzB, HYPRE_MEMORY_DEVICE); /* Copy the unsorted over as the initial "sorted" */ hypre_TMemcpy(d_ja_sorted, d_ja, std::int64_t, nnzA, HYPRE_MEMORY_DEVICE, HYPRE_MEMORY_DEVICE); hypre_TMemcpy(d_jb_sorted, d_jb, std::int64_t, nnzB, HYPRE_MEMORY_DEVICE, HYPRE_MEMORY_DEVICE); #else HYPRE_Int *d_ia = _d_ia; HYPRE_Int *d_ja = _d_ja; HYPRE_Int *d_ib = _d_ib; HYPRE_Int *d_jb = _d_jb; HYPRE_Int *d_ic, *d_jc = NULL; HYPRE_Int *d_ja_sorted, *d_jb_sorted; /* Allocate space for sorted arrays */ d_ja_sorted = hypre_TAlloc(HYPRE_Int, nnzA, HYPRE_MEMORY_DEVICE); d_jb_sorted = hypre_TAlloc(HYPRE_Int, nnzB, HYPRE_MEMORY_DEVICE); /* Copy the unsorted over as the initial "sorted" */ hypre_TMemcpy(d_ja_sorted, d_ja, HYPRE_Int, nnzA, HYPRE_MEMORY_DEVICE, HYPRE_MEMORY_DEVICE); hypre_TMemcpy(d_jb_sorted, d_jb, HYPRE_Int, nnzB, HYPRE_MEMORY_DEVICE, HYPRE_MEMORY_DEVICE); #endif std::int64_t *tmp_size1_h = NULL, *tmp_size1_d = NULL; std::int64_t *tmp_size2_h = NULL, *tmp_size2_d = NULL; std::int64_t *nnzC_h = NULL, *nnzC_d; void *tmp_buffer1 = NULL; void *tmp_buffer2 = NULL; HYPRE_Complex *d_c = NULL; HYPRE_Complex *d_a_sorted, *d_b_sorted; /* Allocate space for sorted arrays */ d_a_sorted = hypre_TAlloc(HYPRE_Complex, nnzA, HYPRE_MEMORY_DEVICE); d_b_sorted = hypre_TAlloc(HYPRE_Complex, nnzB, HYPRE_MEMORY_DEVICE); /* Copy the unsorted over as the initial "sorted" */ hypre_TMemcpy(d_a_sorted, d_a, HYPRE_Complex, nnzA, HYPRE_MEMORY_DEVICE, HYPRE_MEMORY_DEVICE); hypre_TMemcpy(d_b_sorted, d_b, HYPRE_Complex, nnzB, HYPRE_MEMORY_DEVICE, HYPRE_MEMORY_DEVICE); /* sort copies of col indices and data for A and B */ HYPRE_ONEMKL_CALL( oneapi::mkl::sparse::set_csr_data(*hypre_HandleComputeStream(hypre_handle()), handle_A, m, k, oneapi::mkl::index_base::zero, d_ia, d_ja_sorted, d_a_sorted).wait() ); HYPRE_ONEMKL_CALL( oneapi::mkl::sparse::set_csr_data(*hypre_HandleComputeStream(hypre_handle()), handle_B, k, n, oneapi::mkl::index_base::zero, d_ib, d_jb_sorted, d_b_sorted).wait() ); HYPRE_ONEMKL_CALL( oneapi::mkl::sparse::sort_matrix(*hypre_HandleComputeStream(hypre_handle()), handle_A, {}).wait() ); HYPRE_ONEMKL_CALL( oneapi::mkl::sparse::sort_matrix(*hypre_HandleComputeStream(hypre_handle()), handle_B, {}).wait() ); oneapi::mkl::sparse::matmat_descr_t descr = NULL; oneapi::mkl::sparse::matmat_request req; #if defined(HYPRE_BIGINT) d_ic = hypre_TAlloc(std::int64_t, m + 1, HYPRE_MEMORY_DEVICE); #else d_ic = hypre_TAlloc(HYPRE_Int, m + 1, HYPRE_MEMORY_DEVICE); #endif HYPRE_ONEMKL_CALL( oneapi::mkl::sparse::set_csr_data(*hypre_HandleComputeStream(hypre_handle()), handle_C, m, n, oneapi::mkl::index_base::zero, d_ic, d_jc, d_c).wait() ); HYPRE_ONEMKL_CALL( oneapi::mkl::sparse::init_matmat_descr(&descr) ); HYPRE_ONEMKL_CALL( oneapi::mkl::sparse::set_matmat_data(descr, oneapi::mkl::sparse::matrix_view_descr::general, oneapi::mkl::transpose::nontrans, oneapi::mkl::sparse::matrix_view_descr::general, oneapi::mkl::transpose::nontrans, oneapi::mkl::sparse::matrix_view_descr::general) ); /* get tmp_buffer1 size for work estimation */ req = oneapi::mkl::sparse::matmat_request::get_work_estimation_buf_size; tmp_size1_d = hypre_TAlloc(std::int64_t, 1, HYPRE_MEMORY_DEVICE); HYPRE_ONEMKL_CALL( oneapi::mkl::sparse::matmat(*hypre_HandleComputeStream(hypre_handle()), handle_A, handle_B, handle_C, req, descr, tmp_size1_d, NULL, {}).wait() ); /* allocate tmp_buffer1 for work estimation */ tmp_size1_h = hypre_TAlloc(std::int64_t, 1, HYPRE_MEMORY_HOST); hypre_TMemcpy(tmp_size1_h, tmp_size1_d, std::int64_t, 1, HYPRE_MEMORY_HOST, HYPRE_MEMORY_DEVICE); tmp_buffer1 = (void*) hypre_TAlloc(std::uint8_t, *tmp_size1_h, HYPRE_MEMORY_DEVICE); /* do work_estimation */ req = oneapi::mkl::sparse::matmat_request::work_estimation; HYPRE_ONEMKL_CALL( oneapi::mkl::sparse::matmat(*hypre_HandleComputeStream(hypre_handle()), handle_A, handle_B, handle_C, req, descr, tmp_size1_d, tmp_buffer1, {}).wait() ); /* get tmp_buffer2 size for computation */ req = oneapi::mkl::sparse::matmat_request::get_compute_buf_size; tmp_size2_d = hypre_TAlloc(std::int64_t, 1, HYPRE_MEMORY_DEVICE); HYPRE_ONEMKL_CALL( oneapi::mkl::sparse::matmat(*hypre_HandleComputeStream(hypre_handle()), handle_A, handle_B, handle_C, req, descr, tmp_size2_d, NULL, {}).wait() ); /* allocate tmp_buffer2 for computation */ tmp_size2_h = hypre_TAlloc(std::int64_t, 1, HYPRE_MEMORY_HOST); hypre_TMemcpy(tmp_size2_h, tmp_size2_d, std::int64_t, 1, HYPRE_MEMORY_HOST, HYPRE_MEMORY_DEVICE); tmp_buffer2 = (void*) hypre_TAlloc(std::uint8_t, *tmp_size2_h, HYPRE_MEMORY_DEVICE); /* do the computation */ req = oneapi::mkl::sparse::matmat_request::compute; HYPRE_ONEMKL_CALL( oneapi::mkl::sparse::matmat(*hypre_HandleComputeStream(hypre_handle()), handle_A, handle_B, handle_C, req, descr, tmp_size2_d, tmp_buffer2, {}).wait() ); /* get nnzC */ req = oneapi::mkl::sparse::matmat_request::get_nnz; nnzC_d = hypre_TAlloc(std::int64_t, 1, HYPRE_MEMORY_DEVICE); HYPRE_ONEMKL_CALL( oneapi::mkl::sparse::matmat(*hypre_HandleComputeStream(hypre_handle()), handle_A, handle_B, handle_C, req, descr, nnzC_d, NULL, {}).wait() ); /* allocate col index and data arrays */ nnzC_h = hypre_TAlloc(std::int64_t, 1, HYPRE_MEMORY_HOST); hypre_TMemcpy(nnzC_h, nnzC_d, std::int64_t, 1, HYPRE_MEMORY_HOST, HYPRE_MEMORY_DEVICE); if (*nnzC_h > 0) { #if defined(HYPRE_BIGINT) d_jc = hypre_TAlloc(std::int64_t, *nnzC_h, HYPRE_MEMORY_DEVICE); #else d_jc = hypre_TAlloc(HYPRE_Int, *nnzC_h, HYPRE_MEMORY_DEVICE); #endif d_c = hypre_TAlloc(HYPRE_Complex, *nnzC_h, HYPRE_MEMORY_DEVICE); HYPRE_ONEMKL_CALL( oneapi::mkl::sparse::set_csr_data(*hypre_HandleComputeStream(hypre_handle()), handle_C, m, n, oneapi::mkl::index_base::zero, d_ic, d_jc, d_c).wait() ); /* finalize C */ req = oneapi::mkl::sparse::matmat_request::finalize; HYPRE_ONEMKL_CALL( oneapi::mkl::sparse::matmat(*hypre_HandleComputeStream(hypre_handle()), handle_A, handle_B, handle_C, req, descr, NULL, NULL, {}).wait() ); } /* release the matmat descr */ HYPRE_ONEMKL_CALL( oneapi::mkl::sparse::release_matmat_descr(&descr) ); /* assign the output */ *nnzC_out = *nnzC_h; #if defined(HYPRE_BIGINT) *d_ic_out = reinterpret_cast(d_ic); *d_jc_out = reinterpret_cast(d_jc); #else *d_ic_out = d_ic; *d_jc_out = d_jc; #endif *d_c_out = d_c; /* restore the original (unsorted) col indices and data to A and B and free sorted arrays */ HYPRE_ONEMKL_CALL( oneapi::mkl::sparse::set_csr_data(*hypre_HandleComputeStream(hypre_handle()), handle_A, m, k, oneapi::mkl::index_base::zero, d_ia, d_ja, d_a).wait() ); HYPRE_ONEMKL_CALL( oneapi::mkl::sparse::set_csr_data(*hypre_HandleComputeStream(hypre_handle()), handle_B, k, n, oneapi::mkl::index_base::zero, d_ib, d_jb, d_b).wait() ); hypre_TFree(d_a_sorted, HYPRE_MEMORY_DEVICE); hypre_TFree(d_b_sorted, HYPRE_MEMORY_DEVICE); hypre_TFree(d_ja_sorted, HYPRE_MEMORY_DEVICE); hypre_TFree(d_jb_sorted, HYPRE_MEMORY_DEVICE); /* free temporary arrays */ hypre_TFree(tmp_size1_h, HYPRE_MEMORY_HOST); hypre_TFree(tmp_size1_d, HYPRE_MEMORY_DEVICE); hypre_TFree(tmp_size2_h, HYPRE_MEMORY_HOST); hypre_TFree(tmp_size2_d, HYPRE_MEMORY_DEVICE); hypre_TFree(nnzC_h, HYPRE_MEMORY_HOST); hypre_TFree(nnzC_d, HYPRE_MEMORY_DEVICE); hypre_TFree(tmp_buffer1, HYPRE_MEMORY_DEVICE); hypre_TFree(tmp_buffer2, HYPRE_MEMORY_DEVICE); return hypre_error_flag; } #endif hypre-2.33.0/src/seq_mv/csr_spgemm_device_rocsparse.c000066400000000000000000000155451477326011500227320ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "seq_mv.h" #include "_hypre_utilities.hpp" #include "seq_mv.hpp" #if defined(HYPRE_USING_HIP) && defined(HYPRE_USING_ROCSPARSE) HYPRE_Int hypreDevice_CSRSpGemmRocsparse(HYPRE_Int m, HYPRE_Int k, HYPRE_Int n, rocsparse_mat_descr descrA, HYPRE_Int nnzA, HYPRE_Int *d_ia, HYPRE_Int *d_ja, HYPRE_Complex *d_a, rocsparse_mat_descr descrB, HYPRE_Int nnzB, HYPRE_Int *d_ib, HYPRE_Int *d_jb, HYPRE_Complex *d_b, rocsparse_mat_descr descrC, rocsparse_mat_info infoC, HYPRE_Int *nnzC_out, HYPRE_Int **d_ic_out, HYPRE_Int **d_jc_out, HYPRE_Complex **d_c_out) { HYPRE_Int *d_ic, *d_jc, baseC, nnzC; HYPRE_Int *d_ja_sorted, *d_jb_sorted; HYPRE_Complex *d_c, *d_a_sorted, *d_b_sorted; d_a_sorted = hypre_TAlloc(HYPRE_Complex, nnzA, HYPRE_MEMORY_DEVICE); d_b_sorted = hypre_TAlloc(HYPRE_Complex, nnzB, HYPRE_MEMORY_DEVICE); d_ja_sorted = hypre_TAlloc(HYPRE_Int, nnzA, HYPRE_MEMORY_DEVICE); d_jb_sorted = hypre_TAlloc(HYPRE_Int, nnzB, HYPRE_MEMORY_DEVICE); rocsparse_handle handle = hypre_HandleCusparseHandle(hypre_handle()); rocsparse_operation transA = rocsparse_operation_none; rocsparse_operation transB = rocsparse_operation_none; /* Copy the unsorted over as the initial "sorted" */ hypre_TMemcpy(d_ja_sorted, d_ja, HYPRE_Int, nnzA, HYPRE_MEMORY_DEVICE, HYPRE_MEMORY_DEVICE); hypre_TMemcpy(d_a_sorted, d_a, HYPRE_Complex, nnzA, HYPRE_MEMORY_DEVICE, HYPRE_MEMORY_DEVICE); hypre_TMemcpy(d_jb_sorted, d_jb, HYPRE_Int, nnzB, HYPRE_MEMORY_DEVICE, HYPRE_MEMORY_DEVICE); hypre_TMemcpy(d_b_sorted, d_b, HYPRE_Complex, nnzB, HYPRE_MEMORY_DEVICE, HYPRE_MEMORY_DEVICE); /* For rocSPARSE, the CSR SpGEMM implementation does not require the columns to be sorted! */ /* RL: for matrices with long rows, it seemed that the sorting is still needed */ /* VPM: Adding sorting back since it is necessary for correctness in a few cases */ #if 1 hypre_SortCSRRocsparse(m, k, nnzA, descrA, d_ia, d_ja_sorted, d_a_sorted); hypre_SortCSRRocsparse(k, n, nnzB, descrB, d_ib, d_jb_sorted, d_b_sorted); #endif // nnzTotalDevHostPtr points to host memory HYPRE_Int *nnzTotalDevHostPtr = &nnzC; HYPRE_ROCSPARSE_CALL( rocsparse_set_pointer_mode(handle, rocsparse_pointer_mode_host) ); d_ic = hypre_TAlloc(HYPRE_Int, m + 1, HYPRE_MEMORY_DEVICE); // For rocsparse, we need an extra buffer for computing the // csrgemmnnz and the csrgemm // // Once the buffer is allocated, we can use the same allocated // buffer for both the csrgemm_nnz and csrgemm // // Note that rocsparse csrgemms do: C = \alpha*A*B +\beta*D // So we hardcode \alpha=1, D to nothing, and pass NULL for beta // to indicate \beta = 0 to match the cusparse behavior. HYPRE_Complex alpha = 1.0; size_t rs_buffer_size = 0; void *rs_buffer; HYPRE_ROCSPARSE_CALL( hypre_rocsparse_csrgemm_buffer_size(handle, transA, transB, m, n, k, &alpha, // \alpha = 1 descrA, nnzA, d_ia, d_ja_sorted, descrB, nnzB, d_ib, d_jb_sorted, NULL, // \beta = 0 NULL, 0, NULL, NULL, // D is nothing infoC, &rs_buffer_size) ); rs_buffer = hypre_TAlloc(char, rs_buffer_size, HYPRE_MEMORY_DEVICE); // Note that rocsparse csrgemms do: C = \alpha*A*B +\beta*D // So we hardcode \alpha=1, D to nothing, and \beta = 0 // to match the cusparse behavior HYPRE_ROCSPARSE_CALL( rocsparse_csrgemm_nnz(handle, transA, transB, m, n, k, descrA, nnzA, d_ia, d_ja_sorted, descrB, nnzB, d_ib, d_jb_sorted, NULL, 0, NULL, NULL, // D is nothing descrC, d_ic, nnzTotalDevHostPtr, infoC, rs_buffer) ); if (NULL != nnzTotalDevHostPtr) { nnzC = *nnzTotalDevHostPtr; } else { hypre_TMemcpy(&nnzC, d_ic + m, HYPRE_Int, 1, HYPRE_MEMORY_HOST, HYPRE_MEMORY_DEVICE); hypre_TMemcpy(&baseC, d_ic, HYPRE_Int, 1, HYPRE_MEMORY_HOST, HYPRE_MEMORY_DEVICE); nnzC -= baseC; } d_jc = hypre_TAlloc(HYPRE_Int, nnzC, HYPRE_MEMORY_DEVICE); d_c = hypre_TAlloc(HYPRE_Complex, nnzC, HYPRE_MEMORY_DEVICE); HYPRE_ROCSPARSE_CALL( hypre_rocsparse_csrgemm(handle, transA, transB, m, n, k, &alpha, // alpha = 1 descrA, nnzA, d_a_sorted, d_ia, d_ja_sorted, descrB, nnzB, d_b_sorted, d_ib, d_jb_sorted, NULL, // beta = 0 NULL, 0, NULL, NULL, NULL, // D is nothing descrC, d_c, d_ic, d_jc, infoC, rs_buffer) ); // Free up the memory needed by rocsparse hypre_TFree(rs_buffer, HYPRE_MEMORY_DEVICE); *d_ic_out = d_ic; *d_jc_out = d_jc; *d_c_out = d_c; *nnzC_out = nnzC; hypre_TFree(d_a_sorted, HYPRE_MEMORY_DEVICE); hypre_TFree(d_b_sorted, HYPRE_MEMORY_DEVICE); hypre_TFree(d_ja_sorted, HYPRE_MEMORY_DEVICE); hypre_TFree(d_jb_sorted, HYPRE_MEMORY_DEVICE); return hypre_error_flag; } #endif // defined(HYPRE_USING_HIP) && defined(HYPRE_USING_ROCSPARSE) hypre-2.33.0/src/seq_mv/csr_spgemm_device_rowest.c000066400000000000000000000414251477326011500222500ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /*- - - - - - - - - - - - - - - - - - - - - - - - - - * Row size estimations *- - - - - - - - - - - - - - - - - - - - - - - - - - */ #include "seq_mv.h" #include "csr_spgemm_device.h" #if defined(HYPRE_USING_GPU) /*- - - - - - - - - - - - - - - - - - - - - - - - - - * NAIVE *- - - - - - - - - - - - - - - - - - - - - - - - - - */ template static __device__ __forceinline__ void hypre_rownnz_naive_rowi( hypre_DeviceItem &item, HYPRE_Int rowi, HYPRE_Int lane_id, HYPRE_Int *ia, HYPRE_Int *ja, HYPRE_Int *ib, HYPRE_Int &row_nnz_sum, HYPRE_Int &row_nnz_max ) { /* load the start and end position of row i of A */ HYPRE_Int j = -1; if (lane_id < 2) { j = read_only_load(ia + rowi + lane_id); } const HYPRE_Int istart = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, j, 0); const HYPRE_Int iend = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, j, 1); row_nnz_sum = 0; row_nnz_max = 0; /* load column idx and values of row i of A */ for (HYPRE_Int i = istart; i < iend; i += HYPRE_WARP_SIZE) { if (i + lane_id < iend) { HYPRE_Int colA = read_only_load(ja + i + lane_id); HYPRE_Int rowB_start = read_only_load(ib + colA); HYPRE_Int rowB_end = read_only_load(ib + colA + 1); if (type == 'U' || type == 'B') { row_nnz_sum += rowB_end - rowB_start; } if (type == 'L' || type == 'B') { #if defined(HYPRE_USING_SYCL) row_nnz_max = std::max(row_nnz_max, rowB_end - rowB_start); #else row_nnz_max = max(row_nnz_max, rowB_end - rowB_start); #endif } } } } template __global__ void hypre_spgemm_rownnz_naive( hypre_DeviceItem &item, HYPRE_Int M, HYPRE_Int N, HYPRE_Int *ia, HYPRE_Int *ja, HYPRE_Int *ib, HYPRE_Int *jb, HYPRE_Int *rcL, HYPRE_Int *rcU ) { #if defined(HYPRE_USING_SYCL) const HYPRE_Int num_warps = NUM_WARPS_PER_BLOCK * item.get_global_range(2); HYPRE_Int blockIdx_x = item.get_group(2); #else const HYPRE_Int num_warps = NUM_WARPS_PER_BLOCK * gridDim.x; HYPRE_Int blockIdx_x = blockIdx.x; #endif /* warp id inside the block */ const HYPRE_Int warp_id = get_group_id(item); /* lane id inside the warp */ volatile const HYPRE_Int lane_id = get_group_lane_id(item); #if defined(HYPRE_USING_SYCL) hypre_device_assert(item.get_local_range(2) * item.get_local_range(1) == HYPRE_WARP_SIZE); #else hypre_device_assert(blockDim.x * blockDim.y == HYPRE_WARP_SIZE); #endif for (HYPRE_Int i = blockIdx_x * NUM_WARPS_PER_BLOCK + warp_id; i < M; i += num_warps) { HYPRE_Int jU, jL; hypre_rownnz_naive_rowi(item, i, lane_id, ia, ja, ib, jU, jL); if (type == 'U' || type == 'B') { jU = warp_reduce_sum(item, jU); #if defined(HYPRE_USING_SYCL) jU = sycl::min(jU, N); #else jU = min(jU, N); #endif } if (type == 'L' || type == 'B') { jL = warp_reduce_max(item, jL); } if (lane_id == 0) { if (type == 'L' || type == 'B') { rcL[i] = jL; } if (type == 'U' || type == 'B') { rcU[i] = jU; } } } } /*- - - - - - - - - - - - - - - - - - - - - - - - - - * COHEN *- - - - - - - - - - - - - - - - - - - - - - - - - - */ __global__ void hypre_expdistfromuniform( hypre_DeviceItem &item, HYPRE_Int n, float *x ) { const HYPRE_Int global_thread_id = hypre_gpu_get_grid_thread_id<3, 1>(item); const HYPRE_Int total_num_threads = hypre_gpu_get_grid_num_threads<3, 1>(item); #if defined(HYPRE_USING_SYCL) hypre_device_assert(item.get_local_range(2) * item.get_local_range(1) == HYPRE_WARP_SIZE); #else hypre_device_assert(blockDim.x * blockDim.y == HYPRE_WARP_SIZE); #endif for (HYPRE_Int i = global_thread_id; i < n; i += total_num_threads) { x[i] = -logf(x[i]); } } /* T = float: single precision should be enough */ template __global__ void hypre_cohen_rowest_kernel( hypre_DeviceItem &item, HYPRE_Int nrow, HYPRE_Int *rowptr, HYPRE_Int *colidx, T *V_in, T *V_out, HYPRE_Int *rc, HYPRE_Int nsamples, HYPRE_Int *low, HYPRE_Int *upp, T mult ) { #if defined(HYPRE_USING_SYCL) const HYPRE_Int num_warps = NUM_WARPS_PER_BLOCK * item.get_global_range(2); HYPRE_Int blockIdx_x = item.get_group(2); #else const HYPRE_Int num_warps = NUM_WARPS_PER_BLOCK * gridDim.x; HYPRE_Int blockIdx_x = blockIdx.x; #endif /* warp id inside the block */ const HYPRE_Int warp_id = get_group_id(item); /* lane id inside the warp */ volatile HYPRE_Int lane_id = get_group_lane_id(item); #if COHEN_USE_SHMEM __shared__ volatile HYPRE_Int s_col[NUM_WARPS_PER_BLOCK * SHMEM_SIZE_PER_WARP]; volatile HYPRE_Int *warp_s_col = s_col + warp_id * SHMEM_SIZE_PER_WARP; #endif #if defined(HYPRE_USING_SYCL) hypre_device_assert(item.get_local_range(1) == NUM_WARPS_PER_BLOCK); hypre_device_assert(item.get_local_range(2) * item.get_local_range(1) == HYPRE_WARP_SIZE); #else hypre_device_assert(blockDim.z == NUM_WARPS_PER_BLOCK); hypre_device_assert(blockDim.x * blockDim.y == HYPRE_WARP_SIZE); #endif hypre_device_assert(sizeof(T) == sizeof(float)); for (HYPRE_Int i = blockIdx_x * NUM_WARPS_PER_BLOCK + warp_id; i < nrow; i += num_warps) { /* load the start and end position of row i */ HYPRE_Int tmp = -1; if (lane_id < 2) { tmp = read_only_load(rowptr + i + lane_id); } const HYPRE_Int istart = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, tmp, 0); const HYPRE_Int iend = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, tmp, 1); /* works on WARP_SIZE samples at a time */ for (HYPRE_Int r = 0; r < nsamples; r += HYPRE_WARP_SIZE) { T vmin = HYPRE_FLT_LARGE; for (HYPRE_Int j = istart; j < iend; j += HYPRE_WARP_SIZE) { HYPRE_Int col = -1; const HYPRE_Int j1 = j + lane_id; #if COHEN_USE_SHMEM const HYPRE_Int j2 = j1 - istart; if (r == 0) { if (j1 < iend) { col = read_only_load(colidx + j1); if (j2 < SHMEM_SIZE_PER_WARP) { warp_s_col[j2] = col; } } } else { if (j1 < iend) { if (j2 < SHMEM_SIZE_PER_WARP) { col = warp_s_col[j2]; } else { col = read_only_load(colidx + j1); } } } #else if (j1 < iend) { col = read_only_load(colidx + j1); } #endif for (HYPRE_Int k = 0; k < HYPRE_WARP_SIZE; k++) { HYPRE_Int colk = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, col, k); if (colk == -1) { hypre_device_assert(j + HYPRE_WARP_SIZE >= iend); break; } if (r + lane_id < nsamples) { T val = read_only_load(V_in + r + lane_id + colk * nsamples); #if defined(HYPRE_USING_SYCL) vmin = sycl::min(vmin, val); #else vmin = min(vmin, val); #endif } } } if (layer == 2) { if (r + lane_id < nsamples) { V_out[r + lane_id + i * nsamples] = vmin; } } else if (layer == 1) { if (r + lane_id >= nsamples) { vmin = 0.0; } /* partial sum along r */ vmin = warp_reduce_sum(item, vmin); if (lane_id == 0) { if (r == 0) { V_out[i] = vmin; } else { V_out[i] += vmin; } } } } /* for (r = 0; ...) */ if (layer == 1) { if (lane_id == 0) { /* estimated length of row i*/ HYPRE_Int len = rintf( (nsamples - 1) / V_out[i] * mult ); if (low) { #if defined(HYPRE_USING_SYCL) len = std::max(low[i], len); #else len = max(low[i], len); #endif } if (upp) { #if defined(HYPRE_USING_SYCL) len = std::min(upp[i], len); #else len = min(upp[i], len); #endif } if (rc) { rc[i] = len; } } } } /* for (i = ...) */ } template void hypre_spgemm_rownnz_cohen( HYPRE_Int M, HYPRE_Int K, HYPRE_Int N, HYPRE_Int *d_ia, HYPRE_Int *d_ja, HYPRE_Int *d_ib, HYPRE_Int *d_jb, HYPRE_Int *d_low, HYPRE_Int *d_upp, HYPRE_Int *d_rc, HYPRE_Int nsamples, T mult_factor, T *work ) { #if defined(HYPRE_USING_SYCL) dim3 bDim(NUM_WARPS_PER_BLOCK, BDIMY, BDIMX); hypre_assert(bDim.get(2) * bDim.get(1) == HYPRE_WARP_SIZE); #else dim3 bDim(BDIMX, BDIMY, NUM_WARPS_PER_BLOCK); hypre_assert(bDim.x * bDim.y == HYPRE_WARP_SIZE); #endif T *d_V1, *d_V2, *d_V3; d_V1 = work; d_V2 = d_V1 + nsamples * N; //d_V1 = hypre_TAlloc(T, nsamples*N, HYPRE_MEMORY_DEVICE); //d_V2 = hypre_TAlloc(T, nsamples*K, HYPRE_MEMORY_DEVICE); #ifdef HYPRE_SPGEMM_TIMING HYPRE_Real t1, t2; t1 = hypre_MPI_Wtime(); #endif /* random V1: uniform --> exp */ hypre_CurandUniformSingle(nsamples * N, d_V1, 0, 0, 0, 0); #ifdef HYPRE_SPGEMM_TIMING hypre_ForceSyncComputeStream(); t2 = hypre_MPI_Wtime() - t1; HYPRE_SPGEMM_PRINT("Curand time %f\n", t2); #endif #if defined(HYPRE_USING_SYCL) dim3 gDim( 1, 1, (nsamples * N + bDim.get(0) * HYPRE_WARP_SIZE - 1) / (bDim.get( 0) * HYPRE_WARP_SIZE) ); #else dim3 gDim( (nsamples * N + bDim.z * HYPRE_WARP_SIZE - 1) / (bDim.z * HYPRE_WARP_SIZE), 1, 1 ); #endif HYPRE_GPU_LAUNCH( hypre_expdistfromuniform, gDim, bDim, nsamples * N, d_V1 ); /* step-1: layer 3-2 */ #if defined(HYPRE_USING_SYCL) gDim[2] = (K + bDim.get(0) - 1) / bDim.get(0); #else gDim.x = (K + bDim.z - 1) / bDim.z; #endif HYPRE_GPU_LAUNCH( (hypre_cohen_rowest_kernel), gDim, bDim, K, d_ib, d_jb, d_V1, d_V2, NULL, nsamples, NULL, NULL, -1.0); //hypre_TFree(d_V1, HYPRE_MEMORY_DEVICE); /* step-2: layer 2-1 */ d_V3 = (T*) d_rc; #if defined(HYPRE_USING_SYCL) gDim[2] = (M + bDim.get(0) - 1) / bDim.get(0); #else gDim.x = (M + bDim.z - 1) / bDim.z; #endif HYPRE_GPU_LAUNCH( (hypre_cohen_rowest_kernel), gDim, bDim, M, d_ia, d_ja, d_V2, d_V3, d_rc, nsamples, d_low, d_upp, mult_factor); /* done */ //hypre_TFree(d_V2, HYPRE_MEMORY_DEVICE); } HYPRE_Int hypreDevice_CSRSpGemmRownnzEstimate( HYPRE_Int m, HYPRE_Int k, HYPRE_Int n, HYPRE_Int *d_ia, HYPRE_Int *d_ja, HYPRE_Int *d_ib, HYPRE_Int *d_jb, HYPRE_Int *d_rc, HYPRE_Int row_est_mtd ) { #ifdef HYPRE_SPGEMM_NVTX hypre_GpuProfilingPushRange("CSRSpGemmRowEstimate"); #endif #ifdef HYPRE_PROFILE hypre_profile_times[HYPRE_TIMER_ID_SPGEMM_ROWNNZ] -= hypre_MPI_Wtime(); #endif #ifdef HYPRE_SPGEMM_TIMING HYPRE_Real t1 = hypre_MPI_Wtime(); #endif static constexpr HYPRE_Int shmem_size_per_warp = 128; const HYPRE_Int num_warps_per_block = 16; const HYPRE_Int BDIMX = 2; const HYPRE_Int BDIMY = HYPRE_WARP_SIZE / BDIMX; #if defined(HYPRE_USING_SYCL) /* CUDA kernel configurations */ dim3 bDim(num_warps_per_block, BDIMY, BDIMX); hypre_assert(bDim.get(2) * bDim.get(1) == HYPRE_WARP_SIZE); // for cases where one WARP works on a row dim3 gDim(1, 1, (m + bDim.get(0) - 1) / bDim.get(0)); #else /* CUDA kernel configurations */ dim3 bDim(BDIMX, BDIMY, num_warps_per_block); hypre_assert(bDim.x * bDim.y == HYPRE_WARP_SIZE); // for cases where one WARP works on a row dim3 gDim( (m + bDim.z - 1) / bDim.z ); #endif size_t cohen_nsamples = hypre_HandleSpgemmRownnzEstimateNsamples(hypre_handle()); float cohen_mult = hypre_HandleSpgemmRownnzEstimateMultFactor(hypre_handle()); //hypre_printf("Cohen Nsamples %d, mult %f\n", cohen_nsamples, cohen_mult); if (row_est_mtd == 1) { /* naive overestimate */ HYPRE_GPU_LAUNCH( (hypre_spgemm_rownnz_naive<'U', num_warps_per_block>), gDim, bDim, m, /*k,*/ n, d_ia, d_ja, d_ib, d_jb, NULL, d_rc ); } else if (row_est_mtd == 2) { /* naive underestimate */ HYPRE_GPU_LAUNCH( (hypre_spgemm_rownnz_naive<'L', num_warps_per_block>), gDim, bDim, m, /*k,*/ n, d_ia, d_ja, d_ib, d_jb, d_rc, NULL ); } else if (row_est_mtd == 3) { /* [optional] first run naive estimate for naive lower and upper bounds, which will be given to Cohen's alg as corrections */ char *work_mem = hypre_TAlloc(char, cohen_nsamples * (n + k) * sizeof(float) + 2 * m * sizeof(HYPRE_Int), HYPRE_MEMORY_DEVICE); char *work_mem_saved = work_mem; //HYPRE_Int *d_low_upp = hypre_TAlloc(HYPRE_Int, 2 * m, HYPRE_MEMORY_DEVICE); HYPRE_Int *d_low_upp = (HYPRE_Int *) work_mem; work_mem += 2 * m * sizeof(HYPRE_Int); HYPRE_Int *d_low = d_low_upp; HYPRE_Int *d_upp = d_low_upp + m; HYPRE_GPU_LAUNCH( (hypre_spgemm_rownnz_naive<'B', num_warps_per_block>), gDim, bDim, m, /*k,*/ n, d_ia, d_ja, d_ib, d_jb, d_low, d_upp ); /* Cohen's algorithm, stochastic approach */ hypre_spgemm_rownnz_cohen (m, k, n, d_ia, d_ja, d_ib, d_jb, d_low, d_upp, d_rc, cohen_nsamples, cohen_mult, (float *)work_mem); //hypre_TFree(d_low_upp, HYPRE_MEMORY_DEVICE); hypre_TFree(work_mem_saved, HYPRE_MEMORY_DEVICE); } else { char msg[256]; hypre_sprintf(msg, "Unknown row nnz estimation method %d! \n", row_est_mtd); hypre_error_w_msg(HYPRE_ERROR_GENERIC, msg); } #ifdef HYPRE_SPGEMM_TIMING hypre_ForceSyncComputeStream(); HYPRE_Real t2 = hypre_MPI_Wtime() - t1; HYPRE_SPGEMM_PRINT("RownnzEst time %f\n", t2); #endif #ifdef HYPRE_PROFILE hypre_profile_times[HYPRE_TIMER_ID_SPGEMM_ROWNNZ] += hypre_MPI_Wtime(); #endif #ifdef HYPRE_SPGEMM_NVTX hypre_GpuProfilingPopRange(); #endif return hypre_error_flag; } #endif /* defined(HYPRE_USING_GPU) */ hypre-2.33.0/src/seq_mv/csr_spgemm_device_symbl.c000066400000000000000000000375631477326011500220630ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "_hypre_onedpl.hpp" #include "seq_mv.h" #include "csr_spgemm_device.h" #if defined(HYPRE_USING_GPU) #define HYPRE_SPGEMM_ROWNNZ_BINNED(BIN, SHMEM_HASH_SIZE, GROUP_SIZE, GHASH, CAN_FAIL, RF) \ { \ const HYPRE_Int p = h_bin_ptr[BIN - 1]; \ const HYPRE_Int q = h_bin_ptr[BIN]; \ const HYPRE_Int bs = q - p; \ if (bs) \ { \ HYPRE_SPGEMM_PRINT("bin[%d]: %d rows, p %d, q %d\n", BIN, bs, p, q); \ hypre_spgemm_symbolic_rownnz \ ( bs, d_rind + p, k, n, GHASH, d_ia, d_ja, d_ib, d_jb, d_rc, CAN_FAIL, RF ); \ } \ } HYPRE_Int hypreDevice_CSRSpGemmRownnzUpperboundNoBin( HYPRE_Int m, HYPRE_Int k, HYPRE_Int n, HYPRE_Int *d_ia, HYPRE_Int *d_ja, HYPRE_Int *d_ib, HYPRE_Int *d_jb, HYPRE_Int in_rc, HYPRE_Int *d_rc, char *d_rf ) { static constexpr HYPRE_Int SHMEM_HASH_SIZE = SYMBL_HASH_SIZE[5]; static constexpr HYPRE_Int GROUP_SIZE = T_GROUP_SIZE[5]; static constexpr HYPRE_Int BIN = 5; const bool need_ghash = in_rc > 0; const bool can_fail = in_rc < 2; hypre_spgemm_symbolic_rownnz (m, NULL, k, n, need_ghash, d_ia, d_ja, d_ib, d_jb, d_rc, can_fail, d_rf); return hypre_error_flag; } HYPRE_Int hypreDevice_CSRSpGemmRownnzUpperboundBinned( HYPRE_Int m, HYPRE_Int k, HYPRE_Int n, HYPRE_Int *d_ia, HYPRE_Int *d_ja, HYPRE_Int *d_ib, HYPRE_Int *d_jb, HYPRE_Int in_rc, HYPRE_Int *d_rc, char *d_rf ) { HYPRE_UNUSED_VAR(in_rc); const bool CAN_FAIL = true; /* Binning (bins 3-10) with d_rc */ HYPRE_Int h_bin_ptr[HYPRE_SPGEMM_MAX_NBIN + 1]; //HYPRE_Int num_bins = hypre_HandleSpgemmNumBin(hypre_handle()); HYPRE_Int high_bin = hypre_HandleSpgemmHighestBin(hypre_handle())[0]; const bool hbin9 = 9 == high_bin; const char s = 32, t = 3, u = high_bin; HYPRE_Int *d_rind = hypre_TAlloc(HYPRE_Int, m, HYPRE_MEMORY_DEVICE); hypre_SpGemmCreateBins(m, s, t, u, d_rc, false, d_rind, h_bin_ptr); HYPRE_SPGEMM_ROWNNZ_BINNED( 3, SYMBL_HASH_SIZE[ 3], T_GROUP_SIZE[ 3], false, CAN_FAIL, d_rf); HYPRE_SPGEMM_ROWNNZ_BINNED( 4, SYMBL_HASH_SIZE[ 4], T_GROUP_SIZE[ 4], false, CAN_FAIL, d_rf); HYPRE_SPGEMM_ROWNNZ_BINNED( 5, SYMBL_HASH_SIZE[ 5], T_GROUP_SIZE[ 5], false, CAN_FAIL, d_rf); HYPRE_SPGEMM_ROWNNZ_BINNED( 6, SYMBL_HASH_SIZE[ 6], T_GROUP_SIZE[ 6], false, CAN_FAIL, d_rf); HYPRE_SPGEMM_ROWNNZ_BINNED( 7, SYMBL_HASH_SIZE[ 7], T_GROUP_SIZE[ 7], false, CAN_FAIL, d_rf); HYPRE_SPGEMM_ROWNNZ_BINNED( 8, SYMBL_HASH_SIZE[ 8], T_GROUP_SIZE[ 8], false, CAN_FAIL, d_rf); HYPRE_SPGEMM_ROWNNZ_BINNED( 9, SYMBL_HASH_SIZE[ 9], T_GROUP_SIZE[ 9], hbin9, CAN_FAIL, d_rf); HYPRE_SPGEMM_ROWNNZ_BINNED( 10, SYMBL_HASH_SIZE[10], T_GROUP_SIZE[10], true, CAN_FAIL, d_rf); hypre_TFree(d_rind, HYPRE_MEMORY_DEVICE); return hypre_error_flag; } /* in_rc: 0: no input row count * 1: input row count est (CURRENTLY ONLY 1) */ HYPRE_Int hypreDevice_CSRSpGemmRownnzUpperbound( HYPRE_Int m, HYPRE_Int k, HYPRE_Int n, HYPRE_Int *d_ia, HYPRE_Int *d_ja, HYPRE_Int *d_ib, HYPRE_Int *d_jb, HYPRE_Int in_rc, HYPRE_Int *d_rc, HYPRE_Int *rownnz_exact_ptr) { HYPRE_UNUSED_VAR(in_rc); #ifdef HYPRE_PROFILE hypre_profile_times[HYPRE_TIMER_ID_SPGEMM_SYMBOLIC] -= hypre_MPI_Wtime(); #endif #ifdef HYPRE_SPGEMM_NVTX hypre_GpuProfilingPushRange("CSRSpGemmRownnzUpperbound"); #endif #ifdef HYPRE_SPGEMM_TIMING HYPRE_Real t1 = hypre_MPI_Wtime(); #endif char *d_rf = hypre_TAlloc(char, m, HYPRE_MEMORY_DEVICE); const HYPRE_Int binned = hypre_HandleSpgemmBinned(hypre_handle()); if (binned) { hypreDevice_CSRSpGemmRownnzUpperboundBinned (m, k, n, d_ia, d_ja, d_ib, d_jb, 1 /* with input rc */, d_rc, d_rf); } else { hypreDevice_CSRSpGemmRownnzUpperboundNoBin (m, k, n, d_ia, d_ja, d_ib, d_jb, 1 /* with input rc */, d_rc, d_rf); } /* row nnz is exact if no row failed */ #if defined(HYPRE_USING_SYCL) *rownnz_exact_ptr = !HYPRE_ONEDPL_CALL( std::any_of, d_rf, d_rf + m, [] (const auto & x) {return x;} ); #else *rownnz_exact_ptr = !HYPRE_THRUST_CALL( any_of, d_rf, d_rf + m, thrust::identity() ); #endif hypre_TFree(d_rf, HYPRE_MEMORY_DEVICE); #ifdef HYPRE_SPGEMM_TIMING hypre_ForceSyncComputeStream(); HYPRE_Real t2 = hypre_MPI_Wtime() - t1; HYPRE_SPGEMM_PRINT("RownnzBound time %f\n", t2); #endif #ifdef HYPRE_SPGEMM_NVTX hypre_GpuProfilingPopRange(); #endif #ifdef HYPRE_PROFILE hypre_profile_times[HYPRE_TIMER_ID_SPGEMM_SYMBOLIC] += hypre_MPI_Wtime(); #endif return hypre_error_flag; } /* in_rc: 0: no input row count (CURRENTLY ONLY 0) * 1: input row count est * 2: input row bound */ HYPRE_Int hypreDevice_CSRSpGemmRownnzNoBin( HYPRE_Int m, HYPRE_Int k, HYPRE_Int n, HYPRE_Int *d_ia, HYPRE_Int *d_ja, HYPRE_Int *d_ib, HYPRE_Int *d_jb, HYPRE_Int in_rc, HYPRE_Int *d_rc ) { static constexpr HYPRE_Int SHMEM_HASH_SIZE = SYMBL_HASH_SIZE[5]; static constexpr HYPRE_Int GROUP_SIZE = T_GROUP_SIZE[5]; static constexpr HYPRE_Int BIN = 5; const bool need_ghash = in_rc > 0; const bool can_fail = in_rc < 2; char *d_rf = can_fail ? hypre_TAlloc(char, m, HYPRE_MEMORY_DEVICE) : NULL; hypre_spgemm_symbolic_rownnz (m, NULL, k, n, need_ghash, d_ia, d_ja, d_ib, d_jb, d_rc, can_fail, d_rf); if (can_fail) { /* row nnz is exact if no row failed */ #if defined(HYPRE_USING_SYCL) HYPRE_Int num_failed_rows = HYPRE_ONEDPL_CALL( std::reduce, oneapi::dpl::make_transform_iterator(d_rf, type_cast()), oneapi::dpl::make_transform_iterator(d_rf + m, type_cast()) ); #else HYPRE_Int num_failed_rows = HYPRE_THRUST_CALL( reduce, thrust::make_transform_iterator(d_rf, type_cast()), thrust::make_transform_iterator(d_rf + m, type_cast()) ); #endif if (num_failed_rows) { #ifdef HYPRE_SPGEMM_PRINTF HYPRE_SPGEMM_PRINT("[%s, %d]: num of failed rows %d (%.2f)\n", __FILE__, __LINE__, num_failed_rows, num_failed_rows / (m + 0.0) ); #endif HYPRE_Int *d_rind = hypre_TAlloc(HYPRE_Int, num_failed_rows, HYPRE_MEMORY_DEVICE); #if defined(HYPRE_USING_SYCL) oneapi::dpl::counting_iterator count(0); HYPRE_Int *new_end = hypreSycl_copy_if( count, count + m, d_rf, d_rind, [] (const auto & x) {return x;} ); #else HYPRE_Int *new_end = HYPRE_THRUST_CALL( copy_if, thrust::make_counting_iterator(0), thrust::make_counting_iterator(m), d_rf, d_rind, thrust::identity() ); #endif hypre_assert(new_end - d_rind == num_failed_rows); hypre_spgemm_symbolic_rownnz < BIN + 1, 2 * SHMEM_HASH_SIZE, 2 * GROUP_SIZE, true > (num_failed_rows, d_rind, k, n, true, d_ia, d_ja, d_ib, d_jb, d_rc, false, NULL); hypre_TFree(d_rind, HYPRE_MEMORY_DEVICE); } } hypre_TFree(d_rf, HYPRE_MEMORY_DEVICE); return hypre_error_flag; } /* in_rc: 0: no input row count (CURRENTLY ONLY 0) * 1: input row count est * 2: input row bound */ HYPRE_Int hypreDevice_CSRSpGemmRownnzBinned( HYPRE_Int m, HYPRE_Int k, HYPRE_Int n, HYPRE_Int nnzA, HYPRE_Int *d_ia, HYPRE_Int *d_ja, HYPRE_Int *d_ib, HYPRE_Int *d_jb, HYPRE_Int in_rc, HYPRE_Int *d_rc ) { HYPRE_UNUSED_VAR(in_rc); const char s = 32, t = 1, u = 5; HYPRE_Int h_bin_ptr[HYPRE_SPGEMM_MAX_NBIN + 1]; #if 0 HYPRE_Int *d_rind = hypre_TAlloc(HYPRE_Int, m, HYPRE_MEMORY_DEVICE); hypreDevice_CSRSpGemmRownnzEstimate(m, k, n, d_ia, d_ja, d_ib, d_jb, d_rc, 1); #else HYPRE_Int *d_rind = hypre_TAlloc(HYPRE_Int, hypre_max(m, k + 1), HYPRE_MEMORY_DEVICE); #ifdef HYPRE_SPGEMM_TIMING HYPRE_Real t1 = hypre_MPI_Wtime(); #endif /* naive upper bound */ #if defined(HYPRE_USING_SYCL) HYPRE_ONEDPL_CALL( std::adjacent_difference, d_ib, d_ib + k + 1, d_rind ); #else HYPRE_THRUST_CALL( adjacent_difference, d_ib, d_ib + k + 1, d_rind ); #endif hypre_CSRMatrixIntSpMVDevice(m, nnzA, 1, d_ia, d_ja, NULL, d_rind + 1, 0, d_rc); #ifdef HYPRE_SPGEMM_TIMING hypre_ForceSyncComputeStream(); HYPRE_Real t2 = hypre_MPI_Wtime() - t1; HYPRE_SPGEMM_PRINT("RownnzEst time %f\n", t2); #endif #endif hypre_SpGemmCreateBins(m, s, t, u, d_rc, false, d_rind, h_bin_ptr); HYPRE_SPGEMM_ROWNNZ_BINNED( 1, SYMBL_HASH_SIZE[1], T_GROUP_SIZE[1], false, false, NULL); HYPRE_SPGEMM_ROWNNZ_BINNED( 2, SYMBL_HASH_SIZE[2], T_GROUP_SIZE[2], false, false, NULL); HYPRE_SPGEMM_ROWNNZ_BINNED( 3, SYMBL_HASH_SIZE[3], T_GROUP_SIZE[3], false, false, NULL); HYPRE_SPGEMM_ROWNNZ_BINNED( 4, SYMBL_HASH_SIZE[4], T_GROUP_SIZE[4], false, false, NULL); if (h_bin_ptr[5] > h_bin_ptr[4]) { char *d_rf = hypre_CTAlloc(char, m, HYPRE_MEMORY_DEVICE); HYPRE_SPGEMM_ROWNNZ_BINNED( 5, SYMBL_HASH_SIZE[5], T_GROUP_SIZE[5], false, true, d_rf); #if defined(HYPRE_USING_SYCL) HYPRE_Int num_failed_rows = HYPRE_ONEDPL_CALL( std::reduce, oneapi::dpl::make_transform_iterator(d_rf, type_cast()), oneapi::dpl::make_transform_iterator(d_rf + m, type_cast()) ); #else HYPRE_Int num_failed_rows = HYPRE_THRUST_CALL( reduce, thrust::make_transform_iterator(d_rf, type_cast()), thrust::make_transform_iterator(d_rf + m, type_cast()) ); #endif if (num_failed_rows) { #ifdef HYPRE_SPGEMM_PRINTF HYPRE_SPGEMM_PRINT("[%s, %d]: num of failed rows %d (%.2f)\n", __FILE__, __LINE__, num_failed_rows, num_failed_rows / (m + 0.0) ); #endif #if defined(HYPRE_USING_SYCL) oneapi::dpl::counting_iterator count(0); HYPRE_Int *new_end = hypreSycl_copy_if( count, count + m, d_rf, d_rind, [] (const auto & x) {return x;} ); #else HYPRE_Int *new_end = HYPRE_THRUST_CALL( copy_if, thrust::make_counting_iterator(0), thrust::make_counting_iterator(m), d_rf, d_rind, thrust::identity() ); #endif hypre_assert(new_end - d_rind == num_failed_rows); /* Binning (bins 6-10) with d_rc which is a **rownnz-bound** now */ HYPRE_Int high_bin = hypre_HandleSpgemmHighestBin(hypre_handle())[0]; const char t = 6, u = high_bin; const bool hbin9 = 9 == high_bin; hypre_SpGemmCreateBins(num_failed_rows, s, t, u, d_rc, true, d_rind, h_bin_ptr); HYPRE_SPGEMM_ROWNNZ_BINNED( 6, SYMBL_HASH_SIZE[ 6], T_GROUP_SIZE[ 6], false, false, NULL); HYPRE_SPGEMM_ROWNNZ_BINNED( 7, SYMBL_HASH_SIZE[ 7], T_GROUP_SIZE[ 7], false, false, NULL); HYPRE_SPGEMM_ROWNNZ_BINNED( 8, SYMBL_HASH_SIZE[ 8], T_GROUP_SIZE[ 8], false, false, NULL); HYPRE_SPGEMM_ROWNNZ_BINNED( 9, SYMBL_HASH_SIZE[ 9], T_GROUP_SIZE[ 9], hbin9, false, NULL); HYPRE_SPGEMM_ROWNNZ_BINNED( 10, SYMBL_HASH_SIZE[10], T_GROUP_SIZE[10], true, false, NULL); } hypre_TFree(d_rf, HYPRE_MEMORY_DEVICE); } hypre_TFree(d_rind, HYPRE_MEMORY_DEVICE); return hypre_error_flag; } HYPRE_Int hypreDevice_CSRSpGemmRownnz( HYPRE_Int m, HYPRE_Int k, HYPRE_Int n, HYPRE_Int nnzA, HYPRE_Int *d_ia, HYPRE_Int *d_ja, HYPRE_Int *d_ib, HYPRE_Int *d_jb, HYPRE_Int in_rc, HYPRE_Int *d_rc ) { HYPRE_UNUSED_VAR(in_rc); #ifdef HYPRE_PROFILE hypre_profile_times[HYPRE_TIMER_ID_SPGEMM_SYMBOLIC] -= hypre_MPI_Wtime(); #endif #ifdef HYPRE_SPGEMM_NVTX hypre_GpuProfilingPushRange("CSRSpGemmRownnz"); #endif #ifdef HYPRE_SPGEMM_TIMING HYPRE_Real t1 = hypre_MPI_Wtime(); #endif const HYPRE_Int binned = hypre_HandleSpgemmBinned(hypre_handle()); if (binned) { hypreDevice_CSRSpGemmRownnzBinned (m, k, n, nnzA, d_ia, d_ja, d_ib, d_jb, 0 /* without input rc */, d_rc); } else { hypreDevice_CSRSpGemmRownnzNoBin (m, k, n, d_ia, d_ja, d_ib, d_jb, 0 /* without input rc */, d_rc); } #ifdef HYPRE_SPGEMM_TIMING hypre_ForceSyncComputeStream(); HYPRE_Real t2 = hypre_MPI_Wtime() - t1; HYPRE_SPGEMM_PRINT("Rownnz time %f\n", t2); #endif #ifdef HYPRE_SPGEMM_NVTX hypre_GpuProfilingPopRange(); #endif #ifdef HYPRE_PROFILE hypre_profile_times[HYPRE_TIMER_ID_SPGEMM_SYMBOLIC] += hypre_MPI_Wtime(); #endif return hypre_error_flag; } #endif /* defined(HYPRE_USING_GPU) */ hypre-2.33.0/src/seq_mv/csr_spgemm_device_symbl.h000066400000000000000000000551301477326011500220560ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "seq_mv.h" #include "csr_spgemm_device.h" /*- - - - - - - - - - - - - - - - - - - - - - - - - - * Symbolic Multiplication *- - - - - - - - - - - - - - - - - - - - - - - - - - */ #if defined(HYPRE_USING_GPU) /* HashKeys: assumed to be initialized as all -1's * Key: assumed to be nonnegative * increase by 1 if is a new entry */ template static __device__ __forceinline__ HYPRE_Int hypre_spgemm_hash_insert_symbl( #if defined(HYPRE_USING_SYCL) HYPRE_Int *HashKeys, #else volatile HYPRE_Int *HashKeys, #endif HYPRE_Int key, HYPRE_Int &count ) { HYPRE_Int j = 0; HYPRE_Int old = -1; #if defined(HYPRE_USING_HIP) && (HIP_VERSION == 50422804) /* VPM: see https://github.com/hypre-space/hypre/issues/875 */ #pragma unroll 8 #else #pragma unroll UNROLL_FACTOR #endif for (HYPRE_Int i = 0; i < SHMEM_HASH_SIZE; i++) { /* compute the hash value of key */ if (i == 0) { j = key & (SHMEM_HASH_SIZE - 1); } else { j = HashFunc(key, i, j); } /* try to insert key+1 into slot j */ #if defined(HYPRE_USING_SYCL) auto atomic_key = sycl::atomic_ref < HYPRE_Int, sycl::memory_order::relaxed, sycl::memory_scope::device, sycl::access::address_space::local_space > (HashKeys[j]); old = -1; atomic_key.compare_exchange_strong(old, key); #else old = atomicCAS((HYPRE_Int*)(HashKeys + j), -1, key); #endif if (old == -1) { count++; return j; } if (old == key) { return j; } } return -1; } template static __device__ __forceinline__ HYPRE_Int hypre_spgemm_hash_insert_symbl( HYPRE_Int HashSize, #if defined(HYPRE_USING_SYCL) HYPRE_Int *HashKeys, #else volatile HYPRE_Int *HashKeys, #endif HYPRE_Int key, HYPRE_Int &count ) { HYPRE_Int j = 0; HYPRE_Int old = -1; for (HYPRE_Int i = 0; i < HashSize; i++) { /* compute the hash value of key */ if (i == 0) { j = key & (HashSize - 1); } else { j = HashFunc(HashSize, key, i, j); } /* try to insert key+1 into slot j */ #if defined(HYPRE_USING_SYCL) auto atomic_key = sycl::atomic_ref < HYPRE_Int, sycl::memory_order::relaxed, sycl::memory_scope::device, sycl::access::address_space::local_space > (HashKeys[j]); old = -1; atomic_key.compare_exchange_strong(old, key); #else old = atomicCAS((HYPRE_Int*)(HashKeys + j), -1, key); #endif if (old == -1) { count++; return j; } if (old == key) { return j; } } return -1; } template static __device__ __forceinline__ HYPRE_Int hypre_spgemm_compute_row_symbl( hypre_DeviceItem &item, HYPRE_Int istart_a, HYPRE_Int iend_a, const HYPRE_Int *ja, const HYPRE_Int *ib, const HYPRE_Int *jb, #if defined(HYPRE_USING_SYCL) HYPRE_Int *s_HashKeys, #else volatile HYPRE_Int *s_HashKeys, #endif HYPRE_Int g_HashSize, HYPRE_Int *g_HashKeys, char &failed ) { #if defined(HYPRE_USING_SYCL) HYPRE_Int threadIdx_x = item.get_local_id(2); HYPRE_Int threadIdx_y = item.get_local_id(1); HYPRE_Int blockDim_x = item.get_local_range(2); HYPRE_Int blockDim_y = item.get_local_range(1); #else HYPRE_Int threadIdx_x = threadIdx.x; HYPRE_Int threadIdx_y = threadIdx.y; HYPRE_Int blockDim_x = blockDim.x; HYPRE_Int blockDim_y = blockDim.y; #endif HYPRE_Int num_new_insert = 0; /* load column idx and values of row i of A */ for (HYPRE_Int i = istart_a + threadIdx_y; warp_any_sync(item, HYPRE_WARP_FULL_MASK, i < iend_a); i += blockDim_y) { HYPRE_Int rowB = -1; if (threadIdx_x == 0 && i < iend_a) { rowB = read_only_load(ja + i); } #if 0 //const HYPRE_Int ymask = get_mask<4>(...); // TODO: need to confirm the behavior of __ballot_sync, leave it here for now //const HYPRE_Int num_valid_rows = __popc(__ballot_sync(ymask, valid_i)); //for (HYPRE_Int j = 0; j < num_valid_rows; j++) #endif /* threads in the same ygroup work on one row together */ rowB = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, rowB, 0, blockDim_x); /* open this row of B, collectively */ HYPRE_Int tmp = 0; if (rowB != -1 && threadIdx_x < 2) { tmp = read_only_load(ib + rowB + threadIdx_x); } const HYPRE_Int rowB_start = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, tmp, 0, blockDim_x); const HYPRE_Int rowB_end = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, tmp, 1, blockDim_x); for (HYPRE_Int k = rowB_start + threadIdx_x; warp_any_sync(item, HYPRE_WARP_FULL_MASK, k < rowB_end); k += blockDim_x) { if (k < rowB_end) { if (IA1) { num_new_insert ++; } else { const HYPRE_Int k_idx = read_only_load(jb + k); /* first try to insert into shared memory hash table */ HYPRE_Int pos = hypre_spgemm_hash_insert_symbl (s_HashKeys, k_idx, num_new_insert); if (HAS_GHASH && -1 == pos) { pos = hypre_spgemm_hash_insert_symbl (g_HashSize, g_HashKeys, k_idx, num_new_insert); } /* if failed again, both hash tables must have been full (hash table size estimation was too small). Increase the counter anyhow (will lead to over-counting) */ if (pos == -1) { num_new_insert ++; failed = 1; } } } } } return num_new_insert; } template __global__ void hypre_spgemm_symbolic( hypre_DeviceItem &item, #if defined(HYPRE_USING_SYCL) char *shmem_ptr, #endif const HYPRE_Int M, const HYPRE_Int* __restrict__ rind, const HYPRE_Int* __restrict__ ia, const HYPRE_Int* __restrict__ ja, const HYPRE_Int* __restrict__ ib, const HYPRE_Int* __restrict__ jb, const HYPRE_Int* __restrict__ ig, HYPRE_Int* __restrict__ jg, HYPRE_Int* __restrict__ rc, char* __restrict__ rf ) { /* number of groups in the grid */ #if defined(HYPRE_USING_SYCL) volatile const HYPRE_Int grid_num_groups = get_num_groups(item) * item.get_group_range(2); #else volatile const HYPRE_Int grid_num_groups = get_num_groups(item) * gridDim.x; #endif /* group id inside the block */ volatile const HYPRE_Int group_id = get_group_id(item); /* group id in the grid */ #if defined(HYPRE_USING_SYCL) volatile const HYPRE_Int grid_group_id = item.get_group(2) * get_num_groups(item) + group_id; #else volatile const HYPRE_Int grid_group_id = blockIdx.x * get_num_groups(item) + group_id; #endif /* lane id inside the group */ volatile const HYPRE_Int lane_id = get_group_lane_id(item); #if defined(HYPRE_USING_SYCL) /* shared memory hash table */ HYPRE_Int *s_HashKeys = (HYPRE_Int*) shmem_ptr; /* shared memory hash table for this group */ HYPRE_Int *group_s_HashKeys = s_HashKeys + group_id * SHMEM_HASH_SIZE; #else /* shared memory hash table */ #if defined(HYPRE_SPGEMM_DEVICE_USE_DSHMEM) extern __shared__ volatile HYPRE_Int shared_mem[]; volatile HYPRE_Int *s_HashKeys = shared_mem; #else __shared__ volatile HYPRE_Int s_HashKeys[NUM_GROUPS_PER_BLOCK * SHMEM_HASH_SIZE]; #endif /* shared memory hash table for this group */ volatile HYPRE_Int *group_s_HashKeys = s_HashKeys + group_id * SHMEM_HASH_SIZE; #endif const HYPRE_Int UNROLL_FACTOR = hypre_min(HYPRE_SPGEMM_SYMBL_UNROLL, SHMEM_HASH_SIZE); HYPRE_Int valid_ptr; #if defined(HYPRE_USING_SYCL) hypre_device_assert(item.get_local_range(2) * item.get_local_range(1) == GROUP_SIZE); #else hypre_device_assert(blockDim.x * blockDim.y == GROUP_SIZE); #endif /* WM: note - in cuda/hip, exited threads are not required to reach collective calls like * syncthreads(), but this is not true for sycl (all threads must call the collective). * Thus, all threads in the block must enter the loop (which is not ensured for cuda). */ #if defined(HYPRE_USING_SYCL) for (HYPRE_Int i = grid_group_id; sycl::any_of_group(item.get_group(), i < M); i += grid_num_groups) #else for (HYPRE_Int i = grid_group_id; warp_any_sync(item, HYPRE_WARP_FULL_MASK, i < M); i += grid_num_groups) #endif { #if defined(HYPRE_USING_SYCL) valid_ptr = warp_any_sync(item, HYPRE_WARP_FULL_MASK, i < M) && (GROUP_SIZE >= HYPRE_WARP_SIZE || i < M); #else valid_ptr = GROUP_SIZE >= HYPRE_WARP_SIZE || i < M; #endif HYPRE_Int ii = -1; char failed = 0; if (HAS_RIND) { group_read(item, rind + i, valid_ptr, ii); } else { ii = i; } /* start/end position of global memory hash table */ HYPRE_Int istart_g = 0, iend_g = 0, ghash_size = 0; if (HAS_GHASH) { group_read(item, ig + grid_group_id, valid_ptr, istart_g, iend_g); /* size of global hash table allocated for this row (must be power of 2 and >= the actual size of the row of C - shmem hash size) */ ghash_size = iend_g - istart_g; /* initialize group's global memory hash table */ for (HYPRE_Int k = lane_id; k < ghash_size; k += GROUP_SIZE) { jg[istart_g + k] = -1; } } /* initialize group's shared memory hash table */ if (valid_ptr) { #pragma unroll UNROLL_FACTOR for (HYPRE_Int k = lane_id; k < SHMEM_HASH_SIZE; k += GROUP_SIZE) { group_s_HashKeys[k] = -1; } } group_sync(item); /* start/end position of row of A */ HYPRE_Int istart_a = 0, iend_a = 0; /* load the start and end position of row ii of A */ group_read(item, ia + ii, valid_ptr, istart_a, iend_a); /* work with two hash tables */ HYPRE_Int jsum; if (iend_a == istart_a + 1) { jsum = hypre_spgemm_compute_row_symbl (item, istart_a, iend_a, ja, ib, jb, group_s_HashKeys, ghash_size, jg + istart_g, failed); } else { jsum = hypre_spgemm_compute_row_symbl (item, istart_a, iend_a, ja, ib, jb, group_s_HashKeys, ghash_size, jg + istart_g, failed); } #if defined(HYPRE_DEBUG) hypre_device_assert(CAN_FAIL || failed == 0); #endif /* num of nonzeros of this row (an upper bound) * use s_HashKeys as shared memory workspace */ if (GROUP_SIZE <= HYPRE_WARP_SIZE) { jsum = group_reduce_sum(item, jsum); } else { group_sync(item); jsum = group_reduce_sum(item, jsum, s_HashKeys); } /* if this row failed */ if (CAN_FAIL) { if (GROUP_SIZE <= HYPRE_WARP_SIZE) { failed = (char) group_reduce_sum(item, (hypre_int) failed); } else { failed = (char) group_reduce_sum(item, (HYPRE_Int) failed, s_HashKeys); } } if ((valid_ptr) && lane_id == 0) { #if defined(HYPRE_DEBUG) hypre_device_assert(ii >= 0); #endif rc[ii] = jsum; if (CAN_FAIL) { rf[ii] = failed > 0; } } } } template HYPRE_Int hypre_spgemm_symbolic_rownnz( HYPRE_Int m, HYPRE_Int *row_ind, /* input: row indices (length of m) */ HYPRE_Int k, HYPRE_Int n, bool need_ghash, HYPRE_Int *d_ia, HYPRE_Int *d_ja, HYPRE_Int *d_ib, HYPRE_Int *d_jb, HYPRE_Int *d_rc, bool can_fail, char *d_rf /* output: if symbolic mult. failed for each row */ ) { const HYPRE_Int num_groups_per_block = hypre_spgemm_get_num_groups_per_block(); #if defined(HYPRE_USING_CUDA) const HYPRE_Int BDIMX = hypre_min(4, GROUP_SIZE); #elif defined(HYPRE_USING_HIP) const HYPRE_Int BDIMX = hypre_min(2, GROUP_SIZE); #elif defined(HYPRE_USING_SYCL) const HYPRE_Int BDIMX = hypre_min(2, GROUP_SIZE); #endif const HYPRE_Int BDIMY = GROUP_SIZE / BDIMX; #if defined(HYPRE_USING_SYCL) /* CUDA kernel configurations: bDim.z is the number of groups in block */ dim3 bDim(num_groups_per_block, BDIMY, BDIMX); hypre_assert(bDim.get(2) * bDim.get(1) == GROUP_SIZE); // grid dimension (number of blocks) const HYPRE_Int num_blocks = hypre_min( hypre_HandleSpgemmBlockNumDim(hypre_handle())[0][BIN], (m + bDim.get(0) - 1) / bDim.get(0) ); dim3 gDim(1, 1, num_blocks); // number of active groups HYPRE_Int num_act_groups = hypre_min(bDim.get(0) * gDim.get(2), m); #else /* CUDA kernel configurations: bDim.z is the number of groups in block */ dim3 bDim(BDIMX, BDIMY, num_groups_per_block); hypre_assert(bDim.x * bDim.y == GROUP_SIZE); // grid dimension (number of blocks) const HYPRE_Int num_blocks = hypre_min( hypre_HandleSpgemmBlockNumDim(hypre_handle())[0][BIN], (HYPRE_Int) ((m + bDim.z - 1) / bDim.z) ); dim3 gDim( num_blocks ); // number of active groups HYPRE_Int num_act_groups = hypre_min((HYPRE_Int) (bDim.z * gDim.x), m); #endif const char HASH_TYPE = HYPRE_SPGEMM_HASH_TYPE; if (HASH_TYPE != 'L' && HASH_TYPE != 'Q' && HASH_TYPE != 'D') { hypre_printf("Unrecognized hash type ... [L(inear), Q(uadratic), D(ouble)]\n"); } /* --------------------------------------------------------------------------- * build hash table (no values) * ---------------------------------------------------------------------------*/ HYPRE_Int *d_ghash_i = NULL; HYPRE_Int *d_ghash_j = NULL; HYPRE_Int ghash_size = 0; if (need_ghash) { hypre_SpGemmCreateGlobalHashTable(m, row_ind, num_act_groups, d_rc, SHMEM_HASH_SIZE, &d_ghash_i, &d_ghash_j, NULL, &ghash_size); } #ifdef HYPRE_SPGEMM_PRINTF HYPRE_SPGEMM_PRINT("%s[%d], BIN[%d]: m %d k %d n %d, HASH %c, SHMEM_HASH_SIZE %d, GROUP_SIZE %d, " "can_fail %d, need_ghash %d, ghash %p size %d\n", __FILE__, __LINE__, BIN, m, k, n, HASH_TYPE, SHMEM_HASH_SIZE, GROUP_SIZE, can_fail, need_ghash, d_ghash_i, ghash_size); #if defined(HYPRE_USING_SYCL) HYPRE_SPGEMM_PRINT("kernel spec [%d %d %d] x [%d %d %d]\n", gDim.get(2), gDim.get(1), gDim.get(0), bDim.get(2), bDim.get(1), bDim.get(0)); #else HYPRE_SPGEMM_PRINT("kernel spec [%d %d %d] x [%d %d %d]\n", gDim.x, gDim.y, gDim.z, bDim.x, bDim.y, bDim.z); #endif #else HYPRE_UNUSED_VAR(k); HYPRE_UNUSED_VAR(n); #endif #if defined(HYPRE_SPGEMM_DEVICE_USE_DSHMEM) || defined(HYPRE_USING_SYCL) const size_t shmem_bytes = num_groups_per_block * SHMEM_HASH_SIZE * sizeof(HYPRE_Int); #else const size_t shmem_bytes = 0; #endif /* --------------------------------------------------------------------------- * symbolic multiplication: * On output, it provides an upper bound of nnz in rows of C * ---------------------------------------------------------------------------*/ hypre_assert(HAS_RIND == (row_ind != NULL) ); /* */ if (can_fail) { if (ghash_size) { HYPRE_GPU_LAUNCH2( (hypre_spgemm_symbolic), gDim, bDim, shmem_bytes, m, row_ind, d_ia, d_ja, d_ib, d_jb, d_ghash_i, d_ghash_j, d_rc, d_rf ); } else { HYPRE_GPU_LAUNCH2( (hypre_spgemm_symbolic), gDim, bDim, shmem_bytes, m, row_ind, d_ia, d_ja, d_ib, d_jb, d_ghash_i, d_ghash_j, d_rc, d_rf ); } } else { if (ghash_size) { HYPRE_GPU_LAUNCH2( (hypre_spgemm_symbolic), gDim, bDim, shmem_bytes, m, row_ind, d_ia, d_ja, d_ib, d_jb, d_ghash_i, d_ghash_j, d_rc, d_rf ); } else { HYPRE_GPU_LAUNCH2( (hypre_spgemm_symbolic), gDim, bDim, shmem_bytes, m, row_ind, d_ia, d_ja, d_ib, d_jb, d_ghash_i, d_ghash_j, d_rc, d_rf ); } } hypre_TFree(d_ghash_i, HYPRE_MEMORY_DEVICE); hypre_TFree(d_ghash_j, HYPRE_MEMORY_DEVICE); return hypre_error_flag; } template HYPRE_Int hypre_spgemm_symbolic_max_num_blocks( HYPRE_Int multiProcessorCount, HYPRE_Int *num_blocks_ptr, HYPRE_Int *block_size_ptr ) { const char HASH_TYPE = HYPRE_SPGEMM_HASH_TYPE; const HYPRE_Int num_groups_per_block = hypre_spgemm_get_num_groups_per_block(); const HYPRE_Int block_size = num_groups_per_block * GROUP_SIZE; hypre_int numBlocksPerSm = 0; #if defined(HYPRE_SPGEMM_DEVICE_USE_DSHMEM) const hypre_int shmem_bytes = num_groups_per_block * SHMEM_HASH_SIZE * sizeof(HYPRE_Int); hypre_int dynamic_shmem_size = shmem_bytes; #else hypre_int dynamic_shmem_size = 0; #endif #if defined(HYPRE_SPGEMM_DEVICE_USE_DSHMEM) #if defined(HYPRE_USING_CUDA) /* with CUDA, to use > 48K shared memory, must use dynamic and must opt-in. BIN = 10 requires 64K */ hypre_int max_shmem_optin; hypre_GetDeviceMaxShmemSize(-1, NULL, &max_shmem_optin); if (dynamic_shmem_size <= max_shmem_optin) { HYPRE_CUDA_CALL( cudaFuncSetAttribute( hypre_spgemm_symbolic, cudaFuncAttributeMaxDynamicSharedMemorySize, dynamic_shmem_size) ); HYPRE_CUDA_CALL( cudaFuncSetAttribute( hypre_spgemm_symbolic, cudaFuncAttributeMaxDynamicSharedMemorySize, dynamic_shmem_size) ); HYPRE_CUDA_CALL( cudaFuncSetAttribute( hypre_spgemm_symbolic, cudaFuncAttributeMaxDynamicSharedMemorySize, dynamic_shmem_size) ); HYPRE_CUDA_CALL( cudaFuncSetAttribute( hypre_spgemm_symbolic, cudaFuncAttributeMaxDynamicSharedMemorySize, dynamic_shmem_size) ); /* HYPRE_CUDA_CALL( cudaFuncSetAttribute( hypre_spgemm_symbolic, cudaFuncAttributeMaxDynamicSharedMemorySize, dynamic_shmem_size) ); */ } #endif #endif #if defined(HYPRE_USING_CUDA) HYPRE_CUDA_CALL(cudaOccupancyMaxActiveBlocksPerMultiprocessor( &numBlocksPerSm, hypre_spgemm_symbolic, block_size, dynamic_shmem_size)); #endif #if defined(HYPRE_USING_HIP) HYPRE_HIP_CALL(hipOccupancyMaxActiveBlocksPerMultiprocessor( &numBlocksPerSm, hypre_spgemm_symbolic, block_size, dynamic_shmem_size)); #endif #if defined(HYPRE_USING_SYCL) /* WM: todo - sycl version of the above? */ numBlocksPerSm = 1; #endif *num_blocks_ptr = multiProcessorCount * numBlocksPerSm; *block_size_ptr = block_size; return hypre_error_flag; } #endif /* defined(HYPRE_USING_GPU) */ hypre-2.33.0/src/seq_mv/csr_spgemm_device_symbl.in000066400000000000000000000027611477326011500222370ustar00rootroot00000000000000 /****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "seq_mv.h" #if defined(HYPRE_USING_GPU) #if defined(HYPRE_USING_CUDA) && HYPRE_SPGEMM_BIN >= 10 #define HYPRE_SPGEMM_DEVICE_USE_DSHMEM #endif #include template HYPRE_Int hypre_spgemm_symbolic_rownnz < HYPRE_SPGEMM_BIN, SYMBL_HASH_SIZE[HYPRE_SPGEMM_BIN], T_GROUP_SIZE[HYPRE_SPGEMM_BIN], true > ( HYPRE_Int m, HYPRE_Int *row_ind, HYPRE_Int k, HYPRE_Int n, bool need_ghash, HYPRE_Int *d_ia, HYPRE_Int *d_ja, HYPRE_Int *d_ib, HYPRE_Int *d_jb, HYPRE_Int *d_rc, bool can_fail, char *d_rf ); #if HYPRE_SPGEMM_BIN == 5 template HYPRE_Int hypre_spgemm_symbolic_rownnz < HYPRE_SPGEMM_BIN, SYMBL_HASH_SIZE[HYPRE_SPGEMM_BIN], T_GROUP_SIZE[HYPRE_SPGEMM_BIN], false > ( HYPRE_Int m, HYPRE_Int *row_ind, HYPRE_Int k, HYPRE_Int n, bool need_ghash, HYPRE_Int *d_ia, HYPRE_Int *d_ja, HYPRE_Int *d_ib, HYPRE_Int *d_jb, HYPRE_Int *d_rc, bool can_fail, char *d_rf ); #endif template HYPRE_Int hypre_spgemm_symbolic_max_num_blocks < SYMBL_HASH_SIZE[HYPRE_SPGEMM_BIN], T_GROUP_SIZE[HYPRE_SPGEMM_BIN] > ( HYPRE_Int multiProcessorCount, HYPRE_Int *num_blocks_ptr, HYPRE_Int *block_size_ptr ); #endif /* defined(HYPRE_USING_GPU) */ hypre-2.33.0/src/seq_mv/csr_spgemm_device_util.c000066400000000000000000000261001477326011500216730ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "_hypre_onedpl.hpp" #include "seq_mv.h" #include "csr_spgemm_device.h" #if defined(HYPRE_USING_GPU) #if (defined(THRUST_VERSION) && THRUST_VERSION < 101000) struct row_size : public thrust::unary_function #else struct row_size #endif { HYPRE_Int SHMEM_HASH_SIZE; row_size(HYPRE_Int SHMEM_HASH_SIZE_ = HYPRE_Int()) { SHMEM_HASH_SIZE = SHMEM_HASH_SIZE_; } __device__ HYPRE_Int operator()(const HYPRE_Int &x) const { // RL: ??? return next_power_of_2(x - SHMEM_HASH_SIZE) + x; } }; /* Assume d_c is of length m and contains the size of each row * d_i has size (m+1) on entry * generate (i,j,a) with d_c */ void hypre_create_ija( HYPRE_Int m, HYPRE_Int *row_id, /* length of m, row indices; if null, it is [0,1,2,3,...] */ HYPRE_Int *d_c, /* d_c[row_id[i]] is the size of ith row */ HYPRE_Int *d_i, HYPRE_Int **d_j, HYPRE_Complex **d_a, HYPRE_Int *nnz_ptr /* in/out: if input >= 0, it must be the sum of d_c, remain unchanged in output if input < 0, it is computed as the sum of d_c and output */) { HYPRE_Int nnz = 0; hypre_Memset(d_i, 0, sizeof(HYPRE_Int), HYPRE_MEMORY_DEVICE); #if defined(HYPRE_USING_SYCL) if (row_id) { HYPRE_ONEDPL_CALL(std::inclusive_scan, oneapi::dpl::make_permutation_iterator(d_c, row_id), oneapi::dpl::make_permutation_iterator(d_c, row_id) + m, d_i + 1); } else { HYPRE_ONEDPL_CALL(std::inclusive_scan, d_c, d_c + m, d_i + 1); } #else if (row_id) { HYPRE_THRUST_CALL(inclusive_scan, thrust::make_permutation_iterator(d_c, row_id), thrust::make_permutation_iterator(d_c, row_id) + m, d_i + 1); } else { HYPRE_THRUST_CALL(inclusive_scan, d_c, d_c + m, d_i + 1); } #endif if (*nnz_ptr >= 0) { #if defined(HYPRE_DEBUG) hypre_TMemcpy(&nnz, d_i + m, HYPRE_Int, 1, HYPRE_MEMORY_HOST, HYPRE_MEMORY_DEVICE); hypre_assert(nnz == *nnz_ptr); #endif nnz = *nnz_ptr; } else { hypre_TMemcpy(&nnz, d_i + m, HYPRE_Int, 1, HYPRE_MEMORY_HOST, HYPRE_MEMORY_DEVICE); *nnz_ptr = nnz; } if (d_j) { *d_j = hypre_TAlloc(HYPRE_Int, nnz, HYPRE_MEMORY_DEVICE); } if (d_a) { *d_a = hypre_TAlloc(HYPRE_Complex, nnz, HYPRE_MEMORY_DEVICE); } } /* Assume d_c is of length m and contains the size of each row * d_i has size (m+1) on entry * generate (i,j,a) with row_size(d_c) see above (over allocation) */ void hypre_create_ija( HYPRE_Int SHMEM_HASH_SIZE, HYPRE_Int m, HYPRE_Int *row_id, /* length of m, row indices; if null, it is [0,1,2,3,...] */ HYPRE_Int *d_c, /* d_c[row_id[i]] is the size of ith row */ HYPRE_Int *d_i, HYPRE_Int **d_j, HYPRE_Complex **d_a, HYPRE_Int *nnz_ptr ) { HYPRE_Int nnz = 0; hypre_Memset(d_i, 0, sizeof(HYPRE_Int), HYPRE_MEMORY_DEVICE); #if defined(HYPRE_USING_SYCL) if (row_id) { HYPRE_ONEDPL_CALL( std::inclusive_scan, oneapi::dpl::make_transform_iterator(oneapi::dpl::make_permutation_iterator(d_c, row_id), row_size(SHMEM_HASH_SIZE)), oneapi::dpl::make_transform_iterator(oneapi::dpl::make_permutation_iterator(d_c, row_id), row_size(SHMEM_HASH_SIZE)) + m, d_i + 1 ); } else { HYPRE_ONEDPL_CALL( std::inclusive_scan, oneapi::dpl::make_transform_iterator(d_c, row_size(SHMEM_HASH_SIZE)), oneapi::dpl::make_transform_iterator(d_c, row_size(SHMEM_HASH_SIZE)) + m, d_i + 1 ); } #else if (row_id) { HYPRE_THRUST_CALL( inclusive_scan, thrust::make_transform_iterator(thrust::make_permutation_iterator(d_c, row_id), row_size(SHMEM_HASH_SIZE)), thrust::make_transform_iterator(thrust::make_permutation_iterator(d_c, row_id), row_size(SHMEM_HASH_SIZE)) + m, d_i + 1 ); } else { HYPRE_THRUST_CALL( inclusive_scan, thrust::make_transform_iterator(d_c, row_size(SHMEM_HASH_SIZE)), thrust::make_transform_iterator(d_c, row_size(SHMEM_HASH_SIZE)) + m, d_i + 1 ); } #endif hypre_TMemcpy(&nnz, d_i + m, HYPRE_Int, 1, HYPRE_MEMORY_HOST, HYPRE_MEMORY_DEVICE); if (nnz_ptr) { *nnz_ptr = nnz; } if (d_j) { *d_j = hypre_TAlloc(HYPRE_Int, nnz, HYPRE_MEMORY_DEVICE); } if (d_a) { *d_a = hypre_TAlloc(HYPRE_Complex, nnz, HYPRE_MEMORY_DEVICE); } } __global__ void hypre_SpGemmGhashSize( hypre_DeviceItem &item, HYPRE_Int num_rows, HYPRE_Int *row_id, HYPRE_Int num_ghash, HYPRE_Int *row_sizes, HYPRE_Int *ghash_sizes, HYPRE_Int SHMEM_HASH_SIZE ) { const HYPRE_Int global_thread_id = hypre_gpu_get_grid_thread_id<1, 1>(item); if (global_thread_id >= num_ghash) { return; } HYPRE_Int j = 0; for (HYPRE_Int i = global_thread_id; i < num_rows; i += num_ghash) { const HYPRE_Int rid = row_id ? read_only_load(&row_id[i]) : i; const HYPRE_Int rnz = read_only_load(&row_sizes[rid]); const HYPRE_Int j1 = next_power_of_2(rnz - SHMEM_HASH_SIZE); j = hypre_max(j, j1); } ghash_sizes[global_thread_id] = j; } HYPRE_Int hypre_SpGemmCreateGlobalHashTable( HYPRE_Int num_rows, /* number of rows */ HYPRE_Int *row_id, /* row_id[i] is index of ith row; i if row_id == NULL */ HYPRE_Int num_ghash, /* number of hash tables <= num_rows */ HYPRE_Int *row_sizes, /* row_sizes[rowid[i]] is the size of ith row */ HYPRE_Int SHMEM_HASH_SIZE, HYPRE_Int **ghash_i_ptr, /* of length num_ghash + 1 */ HYPRE_Int **ghash_j_ptr, HYPRE_Complex **ghash_a_ptr, HYPRE_Int *ghash_size_ptr ) { hypre_assert(num_ghash <= num_rows); HYPRE_Int *ghash_i, ghash_size; dim3 bDim = hypre_GetDefaultDeviceBlockDimension(); ghash_i = hypre_TAlloc(HYPRE_Int, num_ghash + 1, HYPRE_MEMORY_DEVICE); hypre_Memset(ghash_i + num_ghash, 0, sizeof(HYPRE_Int), HYPRE_MEMORY_DEVICE); dim3 gDim = hypre_GetDefaultDeviceGridDimension(num_ghash, "thread", bDim); HYPRE_GPU_LAUNCH( hypre_SpGemmGhashSize, gDim, bDim, num_rows, row_id, num_ghash, row_sizes, ghash_i, SHMEM_HASH_SIZE ); hypreDevice_IntegerExclusiveScan(num_ghash + 1, ghash_i); hypre_TMemcpy(&ghash_size, ghash_i + num_ghash, HYPRE_Int, 1, HYPRE_MEMORY_HOST, HYPRE_MEMORY_DEVICE); if (!ghash_size) { hypre_TFree(ghash_i, HYPRE_MEMORY_DEVICE); hypre_assert(ghash_i == NULL); } if (ghash_i_ptr) { *ghash_i_ptr = ghash_i; } if (ghash_j_ptr) { *ghash_j_ptr = hypre_TAlloc(HYPRE_Int, ghash_size, HYPRE_MEMORY_DEVICE); } if (ghash_a_ptr) { *ghash_a_ptr = hypre_TAlloc(HYPRE_Complex, ghash_size, HYPRE_MEMORY_DEVICE); } if (ghash_size_ptr) { *ghash_size_ptr = ghash_size; } return hypre_error_flag; } HYPRE_Int hypre_SpGemmCreateBins( HYPRE_Int m, char s, char t, char u, HYPRE_Int *d_rc, bool d_rc_indice_in, HYPRE_Int *d_rc_indice, HYPRE_Int *h_bin_ptr ) { #ifdef HYPRE_SPGEMM_TIMING hypre_ForceSyncComputeStream(); HYPRE_Real t1 = hypre_MPI_Wtime(); #endif HYPRE_Int num_bins = hypre_HandleSpgemmNumBin(hypre_handle()); HYPRE_Int *d_bin_ptr = hypre_TAlloc(HYPRE_Int, num_bins + 1, HYPRE_MEMORY_DEVICE); /* assume there are no more than 127 = 2^7-1 bins, which should be enough */ char *d_bin_key = hypre_TAlloc(char, m, HYPRE_MEMORY_DEVICE); #if defined(HYPRE_USING_SYCL) HYPRE_ONEDPL_CALL( std::transform, d_rc, d_rc + m, d_bin_key, spgemm_bin_op(s, t, u) ); if (!d_rc_indice_in) { hypreSycl_sequence(d_rc_indice, d_rc_indice + m, 0); } hypreSycl_stable_sort_by_key(d_bin_key, d_bin_key + m, d_rc_indice); HYPRE_ONEDPL_CALL( oneapi::dpl::lower_bound, d_bin_key, d_bin_key + m, oneapi::dpl::counting_iterator(1), oneapi::dpl::counting_iterator(num_bins + 2), d_bin_ptr ); #else HYPRE_THRUST_CALL( transform, d_rc, d_rc + m, d_bin_key, spgemm_bin_op(s, t, u) ); if (!d_rc_indice_in) { HYPRE_THRUST_CALL( sequence, d_rc_indice, d_rc_indice + m); } HYPRE_THRUST_CALL( stable_sort_by_key, d_bin_key, d_bin_key + m, d_rc_indice ); HYPRE_THRUST_CALL( lower_bound, d_bin_key, d_bin_key + m, thrust::make_counting_iterator(1), thrust::make_counting_iterator(num_bins + 2), d_bin_ptr ); #endif hypre_TMemcpy(h_bin_ptr, d_bin_ptr, HYPRE_Int, num_bins + 1, HYPRE_MEMORY_HOST, HYPRE_MEMORY_DEVICE); hypre_assert(h_bin_ptr[num_bins] == m); hypre_TFree(d_bin_key, HYPRE_MEMORY_DEVICE); hypre_TFree(d_bin_ptr, HYPRE_MEMORY_DEVICE); #ifdef HYPRE_SPGEMM_TIMING hypre_ForceSyncComputeStream(); HYPRE_Real t2 = hypre_MPI_Wtime() - t1; HYPRE_SPGEMM_PRINT("%s[%d]: Binning time %f\n", __FILE__, __LINE__, t2); #endif return hypre_error_flag; } #endif // #if defined(HYPRE_USING_GPU) hypre-2.33.0/src/seq_mv/csr_spmv_device.c000066400000000000000000000563731477326011500203520ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * Matvec functions for hypre_CSRMatrix class. * *****************************************************************************/ #include "seq_mv.h" #include "_hypre_utilities.hpp" #if defined(HYPRE_USING_GPU) #include "csr_spmv_device.h" /*-------------------------------------------------------------------------- * hypreGPUKernel_CSRMatvecShuffleGT8 * * Templated SpMV device kernel based of warp-shuffle reduction. * Uses groups of K threads per row. * Specialized function for num_vectors > 8 * * Template parameters: * 1) K: number of threads working on a single row. K = 2, 4, 8, 16, 32 * 2) F: fill-mode. See hypreDevice_CSRMatrixMatvec for supported values * 3) NV: number of vectors (> 1 for multi-component vectors) * 4) T: data type of matrix/vector coefficients *--------------------------------------------------------------------------*/ template __global__ void hypreGPUKernel_CSRMatvecShuffleGT8(hypre_DeviceItem &item, HYPRE_Int num_rows, HYPRE_Int num_vectors, HYPRE_Int *row_id, HYPRE_Int idxstride_x, HYPRE_Int idxstride_y, HYPRE_Int vecstride_x, HYPRE_Int vecstride_y, T alpha, HYPRE_Int *d_ia, HYPRE_Int *d_ja, T *d_a, T *d_x, T beta, T *d_y ) { #if defined (HYPRE_USING_SYCL) const HYPRE_Int grid_ngroups = item.get_group_range(2) * (HYPRE_SPMV_BLOCKDIM / K); HYPRE_Int grid_group_id = (item.get_group(2) * HYPRE_SPMV_BLOCKDIM + item.get_local_id( 2)) / K; const HYPRE_Int group_lane = item.get_local_id(2) & (K - 1); #else const HYPRE_Int grid_ngroups = gridDim.x * (HYPRE_SPMV_BLOCKDIM / K); HYPRE_Int grid_group_id = (blockIdx.x * HYPRE_SPMV_BLOCKDIM + threadIdx.x) / K; const HYPRE_Int group_lane = threadIdx.x & (K - 1); #endif T sum[64]; for (; warp_any_sync(item, HYPRE_WARP_FULL_MASK, grid_group_id < num_rows); grid_group_id += grid_ngroups) { HYPRE_Int grid_row_id = -1, p = 0, q = 0; if (row_id) { if (grid_group_id < num_rows && group_lane == 0) { grid_row_id = read_only_load(&row_id[grid_group_id]); } grid_row_id = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, grid_row_id, 0, K); } else { grid_row_id = grid_group_id; } if (grid_group_id < num_rows && group_lane < 2) { p = read_only_load(&d_ia[grid_row_id + group_lane]); } q = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, p, 1, K); p = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, p, 0, K); for (HYPRE_Int i = 0; i < num_vectors; i++) { sum[i] = T(0.0); } #pragma unroll 1 for (p += group_lane; p < q; p += K * 2) { HYPRE_SPMV_ADD_SUM(p, num_vectors) if (p + K < q) { HYPRE_SPMV_ADD_SUM((p + K), num_vectors) } } // parallel reduction for (HYPRE_Int i = 0; i < num_vectors; i++) { for (HYPRE_Int d = K / 2; d > 0; d >>= 1) { sum[i] += warp_shuffle_down_sync(item, HYPRE_WARP_FULL_MASK, sum[i], d); } } if (grid_group_id < num_rows && group_lane == 0) { if (beta) { for (HYPRE_Int i = 0; i < num_vectors; i++) { d_y[grid_row_id * idxstride_y + i * vecstride_y] = alpha * sum[i] + beta * d_y[grid_row_id * idxstride_y + i * vecstride_y]; } } else { for (HYPRE_Int i = 0; i < num_vectors; i++) { d_y[grid_row_id * idxstride_y + i * vecstride_y] = alpha * sum[i]; } } } } } /*-------------------------------------------------------------------------- * hypreGPUKernel_CSRMatvecShuffle * * Templated SpMV device kernel based of warp-shuffle reduction. * Uses groups of K threads per row * * Template parameters: * 1) K: number of threads working on a single row. K = 2, 4, 8, 16, 32 * 2) F: fill-mode. See hypreDevice_CSRMatrixMatvec for supported values * 3) NV: number of vectors (> 1 for multi-component vectors) * 4) T: data type of matrix/vector coefficients *--------------------------------------------------------------------------*/ template __global__ void //__launch_bounds__(512, 1) hypreGPUKernel_CSRMatvecShuffle(hypre_DeviceItem &item, HYPRE_Int num_rows, HYPRE_Int num_vectors, HYPRE_Int *row_id, HYPRE_Int idxstride_x, HYPRE_Int idxstride_y, HYPRE_Int vecstride_x, HYPRE_Int vecstride_y, T alpha, HYPRE_Int *d_ia, HYPRE_Int *d_ja, T *d_a, T *d_x, T beta, T *d_y ) { #if defined(HYPRE_USING_SYCL) HYPRE_Int grid_ngroups = item.get_group_range(2) * (HYPRE_SPMV_BLOCKDIM / K); HYPRE_Int grid_group_id = (item.get_group(2) * HYPRE_SPMV_BLOCKDIM + item.get_local_id(2)) / K; HYPRE_Int group_lane = item.get_local_id(2) & (K - 1); #else const HYPRE_Int grid_ngroups = gridDim.x * (HYPRE_SPMV_BLOCKDIM / K); HYPRE_Int grid_group_id = (blockIdx.x * HYPRE_SPMV_BLOCKDIM + threadIdx.x) / K; const HYPRE_Int group_lane = threadIdx.x & (K - 1); #endif for (; warp_any_sync(item, HYPRE_WARP_FULL_MASK, grid_group_id < num_rows); grid_group_id += grid_ngroups) { HYPRE_Int grid_row_id = -1, p = 0, q = 0; if (row_id) { if (grid_group_id < num_rows && group_lane == 0) { grid_row_id = read_only_load(&row_id[grid_group_id]); } grid_row_id = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, grid_row_id, 0, K); } else { grid_row_id = grid_group_id; } if (grid_group_id < num_rows && group_lane < 2) { p = read_only_load(&d_ia[grid_row_id + group_lane]); } q = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, p, 1, K); p = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, p, 0, K); T sum[NV] = {T(0)}; #if HYPRE_SPMV_VERSION == 1 #pragma unroll 1 for (p += group_lane; p < q; p += K * 2) { HYPRE_SPMV_ADD_SUM(p, NV) if (p + K < q) { HYPRE_SPMV_ADD_SUM((p + K), NV) } } #elif HYPRE_SPMV_VERSION == 2 #pragma unroll 1 for (p += group_lane; warp_any_sync(item, HYPRE_WARP_FULL_MASK, p < q); p += K) { if (p < q) { HYPRE_SPMV_ADD_SUM(p, NV) } } #else #pragma unroll 1 for (p += group_lane; p < q; p += K) { HYPRE_SPMV_ADD_SUM(p, NV) } #endif // parallel reduction for (HYPRE_Int i = 0; i < NV; i++) { for (HYPRE_Int d = K / 2; d > 0; d >>= 1) { sum[i] += warp_shuffle_down_sync(item, HYPRE_WARP_FULL_MASK, sum[i], d); } } if (grid_group_id < num_rows && group_lane == 0) { if (beta) { for (HYPRE_Int i = 0; i < NV; i++) { d_y[grid_row_id * idxstride_y + i * vecstride_y] = alpha * sum[i] + beta * d_y[grid_row_id * idxstride_y + i * vecstride_y]; } } else { for (HYPRE_Int i = 0; i < NV; i++) { d_y[grid_row_id * idxstride_y + i * vecstride_y] = alpha * sum[i]; } } } } } /*-------------------------------------------------------------------------- * hypreDevice_CSRMatrixMatvec * * Templated host function for launching the device kernels for SpMV. * * The template parameter F is the fill-mode. Supported values: * 0: whole matrix * -1: lower * 1: upper * -2: strict lower * 2: strict upper * The template parameter T is the matrix/vector coefficient data type *--------------------------------------------------------------------------*/ template HYPRE_Int hypreDevice_CSRMatrixMatvec( HYPRE_Int num_vectors, HYPRE_Int num_rows, HYPRE_Int *rowid, HYPRE_Int num_nonzeros, HYPRE_Int idxstride_x, HYPRE_Int idxstride_y, HYPRE_Int vecstride_x, HYPRE_Int vecstride_y, T alpha, HYPRE_Int *d_ia, HYPRE_Int *d_ja, T *d_a, T *d_x, T beta, T *d_y ) { if (num_vectors > 64) { hypre_error_w_msg(HYPRE_ERROR_GENERIC, "hypre's SpMV: (num_vectors > 64) not implemented"); return hypre_error_flag; } const HYPRE_Int avg_rownnz = (num_nonzeros + num_rows - 1) / num_rows; static constexpr HYPRE_Int group_sizes[5] = {32, 16, 8, 4, 4}; static constexpr HYPRE_Int unroll_depth[9] = {0, 1, 2, 3, 4, 5, 6, 7, 8}; static HYPRE_Int avg_rownnz_lower_bounds[5] = {64, 32, 16, 8, 0}; static HYPRE_Int num_groups_per_block[5] = { HYPRE_SPMV_BLOCKDIM / group_sizes[0], HYPRE_SPMV_BLOCKDIM / group_sizes[1], HYPRE_SPMV_BLOCKDIM / group_sizes[2], HYPRE_SPMV_BLOCKDIM / group_sizes[3], HYPRE_SPMV_BLOCKDIM / group_sizes[4] }; const dim3 bDim = hypre_dim3(HYPRE_SPMV_BLOCKDIM); /* Select execution path */ switch (num_vectors) { case unroll_depth[1]: HYPRE_SPMV_GPU_LAUNCH(hypreGPUKernel_CSRMatvecShuffle, unroll_depth[1]); break; case unroll_depth[2]: HYPRE_SPMV_GPU_LAUNCH(hypreGPUKernel_CSRMatvecShuffle, unroll_depth[2]); break; case unroll_depth[3]: HYPRE_SPMV_GPU_LAUNCH(hypreGPUKernel_CSRMatvecShuffle, unroll_depth[3]); break; case unroll_depth[4]: HYPRE_SPMV_GPU_LAUNCH(hypreGPUKernel_CSRMatvecShuffle, unroll_depth[4]); break; case unroll_depth[5]: HYPRE_SPMV_GPU_LAUNCH(hypreGPUKernel_CSRMatvecShuffle, unroll_depth[5]); break; case unroll_depth[6]: HYPRE_SPMV_GPU_LAUNCH(hypreGPUKernel_CSRMatvecShuffle, unroll_depth[6]); break; case unroll_depth[7]: HYPRE_SPMV_GPU_LAUNCH(hypreGPUKernel_CSRMatvecShuffle, unroll_depth[7]); break; case unroll_depth[8]: HYPRE_SPMV_GPU_LAUNCH(hypreGPUKernel_CSRMatvecShuffle, unroll_depth[8]); break; default: HYPRE_SPMV_GPU_LAUNCH(hypreGPUKernel_CSRMatvecShuffleGT8, unroll_depth[8]); break; } return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_CSRMatrixSpMVDevice * * hypre's internal implementation of sparse matrix/vector multiplication * (SpMV) on GPUs. * * Computes: y = alpha*op(B)*x + beta*y * * Supported cases: * 1) rownnz_B != NULL: y(rownnz_B) = alpha*op(B)*x + beta*y(rownnz_B) * * 2) op(B) = B (trans = 0) or B^T (trans = 1) * op(B) = B^T: not recommended since it computes B^T at every call * * 3) multi-component vectors up to 64 components (1 <= num_vectors <= 64) * * Notes: * 1) if B has no numerical values, assume the values are all ones *--------------------------------------------------------------------------*/ HYPRE_Int hypre_CSRMatrixSpMVDevice( HYPRE_Int trans, HYPRE_Complex alpha, hypre_CSRMatrix *B, hypre_Vector *x, HYPRE_Complex beta, hypre_Vector *y, HYPRE_Int fill ) { /* Input data variables */ HYPRE_Int num_rows = trans ? hypre_CSRMatrixNumCols(B) : hypre_CSRMatrixNumRows(B); HYPRE_Int num_nonzeros = hypre_CSRMatrixNumNonzeros(B); HYPRE_Int num_vectors_x = hypre_VectorNumVectors(x); HYPRE_Int num_vectors_y = hypre_VectorNumVectors(y); HYPRE_Complex *d_x = hypre_VectorData(x); HYPRE_Complex *d_y = hypre_VectorData(y); HYPRE_Int idxstride_x = hypre_VectorIndexStride(x); HYPRE_Int vecstride_x = hypre_VectorVectorStride(x); HYPRE_Int idxstride_y = hypre_VectorIndexStride(y); HYPRE_Int vecstride_y = hypre_VectorVectorStride(y); /* Matrix A variables */ hypre_CSRMatrix *A = NULL; HYPRE_Int *d_ia; HYPRE_Int *d_ja; HYPRE_Complex *d_a; HYPRE_Int *d_rownnz_A = NULL; /* Sanity checks */ if (num_vectors_x != num_vectors_y) { hypre_error_w_msg(HYPRE_ERROR_GENERIC, "num_vectors_x != num_vectors_y"); return hypre_error_flag; } hypre_assert(num_rows > 0); /* Trivial case when alpha * op(B) * x = 0 */ if (num_nonzeros <= 0 || alpha == 0.0) { hypre_SeqVectorScale(beta, y); return hypre_error_flag; } /* Select op(B) */ if (trans) { hypre_CSRMatrixTransposeDevice(B, &A, hypre_CSRMatrixData(B) != NULL); } else { A = B; } /* Get matrix A info */ d_ia = hypre_CSRMatrixI(A); d_ja = hypre_CSRMatrixJ(A); d_a = hypre_CSRMatrixData(A); if (hypre_CSRMatrixRownnz(A)) { num_rows = hypre_CSRMatrixNumRownnz(A); d_rownnz_A = hypre_CSRMatrixRownnz(A); hypre_SeqVectorScale(beta, y); beta = beta ? 1.0 : 0.0; } /* Choose matrix fill mode */ switch (fill) { case HYPRE_SPMV_FILL_STRICT_LOWER: /* Strict lower matrix */ hypreDevice_CSRMatrixMatvec(num_vectors_x, num_rows, d_rownnz_A, num_nonzeros, idxstride_x, idxstride_y, vecstride_x, vecstride_y, alpha, d_ia, d_ja, d_a, d_x, beta, d_y); break; case HYPRE_SPMV_FILL_LOWER: /* Lower matrix */ hypreDevice_CSRMatrixMatvec(num_vectors_x, num_rows, d_rownnz_A, num_nonzeros, idxstride_x, idxstride_y, vecstride_x, vecstride_y, alpha, d_ia, d_ja, d_a, d_x, beta, d_y); break; case HYPRE_SPMV_FILL_WHOLE: /* Full matrix */ hypreDevice_CSRMatrixMatvec(num_vectors_x, num_rows, d_rownnz_A, num_nonzeros, idxstride_x, idxstride_y, vecstride_x, vecstride_y, alpha, d_ia, d_ja, d_a, d_x, beta, d_y); break; case HYPRE_SPMV_FILL_UPPER: /* Upper matrix */ hypreDevice_CSRMatrixMatvec(num_vectors_x, num_rows, d_rownnz_A, num_nonzeros, idxstride_x, idxstride_y, vecstride_x, vecstride_y, alpha, d_ia, d_ja, d_a, d_x, beta, d_y); break; case HYPRE_SPMV_FILL_STRICT_UPPER: /* Strict upper matrix */ hypreDevice_CSRMatrixMatvec(num_vectors_x, num_rows, d_rownnz_A, num_nonzeros, idxstride_x, idxstride_y, vecstride_x, vecstride_y, alpha, d_ia, d_ja, d_a, d_x, beta, d_y); break; default: hypre_error_w_msg(HYPRE_ERROR_GENERIC, "Fill mode for SpMV unavailable!"); return hypre_error_flag; } /* Free memory */ if (trans) { hypre_CSRMatrixDestroy(A); } return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_CSRMatrixIntSpMVDevice * * Sparse matrix/vector multiplication with integer data on GPUs * * Note: This function does not support multi-component vectors *--------------------------------------------------------------------------*/ HYPRE_Int hypre_CSRMatrixIntSpMVDevice( HYPRE_Int num_rows, HYPRE_Int num_nonzeros, HYPRE_Int alpha, HYPRE_Int *d_ia, HYPRE_Int *d_ja, HYPRE_Int *d_a, HYPRE_Int *d_x, HYPRE_Int beta, HYPRE_Int *d_y ) { /* Additional input variables */ HYPRE_Int num_vectors = 1; HYPRE_Int idxstride_x = 1; HYPRE_Int vecstride_x = 1; HYPRE_Int idxstride_y = 1; HYPRE_Int vecstride_y = 1; HYPRE_Int *d_rownnz = NULL; hypreDevice_CSRMatrixMatvec(num_vectors, num_rows, d_rownnz, num_nonzeros, idxstride_x, idxstride_y, vecstride_x, vecstride_y, alpha, d_ia, d_ja, d_a, d_x, beta, d_y); return hypre_error_flag; } #endif /* #if defined(HYPRE_USING_GPU) */ hypre-2.33.0/src/seq_mv/csr_spmv_device.h000066400000000000000000000233061477326011500203450ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #ifndef hypre_CSR_SPMV_DEVICE_H #define hypre_CSR_SPMV_DEVICE_H #define HYPRE_SPMV_BLOCKDIM 512 #define HYPRE_SPMV_VERSION 1 #define HYPRE_SPMV_FILL_STRICT_LOWER -2 #define HYPRE_SPMV_FILL_LOWER -1 #define HYPRE_SPMV_FILL_WHOLE 0 #define HYPRE_SPMV_FILL_UPPER 1 #define HYPRE_SPMV_FILL_STRICT_UPPER 2 #define HYPRE_SPMV_ADD_SUM(p, nv) \ { \ const HYPRE_Int col = read_only_load(&d_ja[p]); \ if (F == HYPRE_SPMV_FILL_WHOLE) \ { \ const T val = d_a ? read_only_load(&d_a[p]) : T(1); \ for (HYPRE_Int i = 0; i < nv; i++) \ { \ sum[i] += val * read_only_load(&d_x[col * idxstride_x + i * vecstride_x]); \ } \ } \ else if (F == HYPRE_SPMV_FILL_LOWER) \ { \ if (col <= grid_group_id) \ { \ const T val = d_a ? read_only_load(&d_a[p]) : T(1); \ for (HYPRE_Int i = 0; i < nv; i++) \ { \ sum[i] += val * read_only_load(&d_x[col * idxstride_x + i * vecstride_x]); \ } \ } \ } \ else if (F == HYPRE_SPMV_FILL_UPPER) \ { \ if (col >= grid_group_id) \ { \ const T val = d_a ? read_only_load(&d_a[p]) : T(1); \ for (HYPRE_Int i = 0; i < nv; i++) \ { \ sum[i] += val * read_only_load(&d_x[col * idxstride_x + i * vecstride_x]); \ } \ } \ } \ else if (F == HYPRE_SPMV_FILL_STRICT_LOWER) \ { \ if (col < grid_group_id) \ { \ const T val = d_a ? read_only_load(&d_a[p]) : T(1); \ for (HYPRE_Int i = 0; i < nv; i++) \ { \ sum[i] += val * read_only_load(&d_x[col * idxstride_x + i * vecstride_x]); \ } \ } \ } \ else if (F == HYPRE_SPMV_FILL_STRICT_UPPER) \ { \ if (col > grid_group_id) \ { \ const T val = d_a ? read_only_load(&d_a[p]) : T(1); \ for (HYPRE_Int i = 0; i < nv; i++) \ { \ sum[i] += val * read_only_load(&d_x[col * idxstride_x + i * vecstride_x]); \ } \ } \ } \ } #define HYPRE_SPMV_GPU_LAUNCH(kernel, nv) \ if (avg_rownnz >= avg_rownnz_lower_bounds[0]) \ { \ const dim3 gDim = \ hypre_dim3((num_rows + num_groups_per_block[0] - 1) / num_groups_per_block[0]); \ HYPRE_GPU_LAUNCH( (kernel), \ gDim, bDim, num_rows, num_vectors, rowid, idxstride_x, \ idxstride_y, vecstride_x, vecstride_y, alpha, \ d_ia, d_ja, d_a, d_x, beta, d_y ); \ } \ else if (avg_rownnz >= avg_rownnz_lower_bounds[1]) \ { \ const dim3 gDim = \ hypre_dim3((num_rows + num_groups_per_block[1] - 1) / num_groups_per_block[1]); \ HYPRE_GPU_LAUNCH( (kernel), \ gDim, bDim, num_rows, num_vectors, rowid, idxstride_x, \ idxstride_y, vecstride_x, vecstride_y, alpha, \ d_ia, d_ja, d_a, d_x, beta, d_y ); \ } \ else if (avg_rownnz >= avg_rownnz_lower_bounds[2]) \ { \ const dim3 gDim = \ hypre_dim3((num_rows + num_groups_per_block[2] - 1) / num_groups_per_block[2]); \ HYPRE_GPU_LAUNCH( (kernel), \ gDim, bDim, num_rows, num_vectors, rowid, idxstride_x, \ idxstride_y, vecstride_x, vecstride_y, alpha, \ d_ia, d_ja, d_a, d_x, beta, d_y ); \ } \ else if (avg_rownnz >= avg_rownnz_lower_bounds[3]) \ { \ const dim3 gDim = \ hypre_dim3((num_rows + num_groups_per_block[3] - 1) / num_groups_per_block[3]); \ HYPRE_GPU_LAUNCH( (kernel), \ gDim, bDim, num_rows, num_vectors, rowid, idxstride_x, \ idxstride_y, vecstride_x, vecstride_y, alpha, \ d_ia, d_ja, d_a, d_x, beta, d_y ); \ } \ else \ { \ const dim3 gDim = \ hypre_dim3((num_rows + num_groups_per_block[4] - 1) / num_groups_per_block[4]); \ HYPRE_GPU_LAUNCH( (kernel), \ gDim, bDim, num_rows, num_vectors, rowid, idxstride_x, \ idxstride_y, vecstride_x, vecstride_y, alpha, \ d_ia, d_ja, d_a, d_x, beta, d_y ); \ } #endif hypre-2.33.0/src/seq_mv/csr_sptrans_device.c000066400000000000000000000246711477326011500210530ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "_hypre_onedpl.hpp" #include "seq_mv.h" #include "_hypre_utilities.hpp" #if defined(HYPRE_USING_CUSPARSE) HYPRE_Int hypreDevice_CSRSpTransCusparse(HYPRE_Int m, HYPRE_Int n, HYPRE_Int nnzA, HYPRE_Int *d_ia, HYPRE_Int *d_ja, HYPRE_Complex *d_aa, HYPRE_Int **d_ic_out, HYPRE_Int **d_jc_out, HYPRE_Complex **d_ac_out, HYPRE_Int want_data) { #ifdef HYPRE_PROFILE hypre_profile_times[HYPRE_TIMER_ID_SPTRANS] -= hypre_MPI_Wtime(); #endif cusparseHandle_t handle = hypre_HandleCusparseHandle(hypre_handle()); cusparseAction_t action = want_data ? CUSPARSE_ACTION_NUMERIC : CUSPARSE_ACTION_SYMBOLIC; HYPRE_Complex *csc_a; if (want_data) { csc_a = hypre_TAlloc(HYPRE_Complex, nnzA, HYPRE_MEMORY_DEVICE); } else { csc_a = NULL; d_aa = NULL; } HYPRE_Int *csc_j = hypre_TAlloc(HYPRE_Int, nnzA, HYPRE_MEMORY_DEVICE); HYPRE_Int *csc_i = hypre_TAlloc(HYPRE_Int, n + 1, HYPRE_MEMORY_DEVICE); #if CUSPARSE_VERSION >= CUSPARSE_NEWAPI_VERSION size_t bufferSize = 0; const cudaDataType data_type = hypre_HYPREComplexToCudaDataType(); HYPRE_CUSPARSE_CALL( cusparseCsr2cscEx2_bufferSize(handle, m, n, nnzA, d_aa, d_ia, d_ja, csc_a, csc_i, csc_j, data_type, action, CUSPARSE_INDEX_BASE_ZERO, CUSPARSE_CSR2CSC_ALG1, &bufferSize) ); char *dBuffer = hypre_TAlloc(char, bufferSize, HYPRE_MEMORY_DEVICE); HYPRE_CUSPARSE_CALL( cusparseCsr2cscEx2(handle, m, n, nnzA, d_aa, d_ia, d_ja, csc_a, csc_i, csc_j, data_type, action, CUSPARSE_INDEX_BASE_ZERO, CUSPARSE_CSR2CSC_ALG1, dBuffer) ); hypre_TFree(dBuffer, HYPRE_MEMORY_DEVICE); #else HYPRE_CUSPARSE_CALL( hypre_cusparse_csr2csc(handle, m, n, nnzA, d_aa, d_ia, d_ja, csc_a, csc_j, csc_i, action, CUSPARSE_INDEX_BASE_ZERO) ); #endif /* #if CUSPARSE_VERSION >= CUSPARSE_NEWAPI_VERSION */ *d_ic_out = csc_i; *d_jc_out = csc_j; *d_ac_out = csc_a; #ifdef HYPRE_PROFILE hypre_profile_times[HYPRE_TIMER_ID_SPTRANS] += hypre_MPI_Wtime(); #endif return hypre_error_flag; } #endif // #if defined(HYPRE_USING_CUSPARSE) #if defined(HYPRE_USING_ROCSPARSE) HYPRE_Int hypreDevice_CSRSpTransRocsparse(HYPRE_Int m, HYPRE_Int n, HYPRE_Int nnzA, HYPRE_Int *d_ia, HYPRE_Int *d_ja, HYPRE_Complex *d_aa, HYPRE_Int **d_ic_out, HYPRE_Int **d_jc_out, HYPRE_Complex **d_ac_out, HYPRE_Int want_data) { #ifdef HYPRE_PROFILE hypre_profile_times[HYPRE_TIMER_ID_SPTRANS] -= hypre_MPI_Wtime(); #endif rocsparse_handle handle = hypre_HandleCusparseHandle(hypre_handle()); rocsparse_action action = want_data ? rocsparse_action_numeric : rocsparse_action_symbolic; HYPRE_Complex *csc_a; if (want_data) { csc_a = hypre_TAlloc(HYPRE_Complex, nnzA, HYPRE_MEMORY_DEVICE); } else { csc_a = NULL; d_aa = NULL; } HYPRE_Int *csc_j = hypre_TAlloc(HYPRE_Int, nnzA, HYPRE_MEMORY_DEVICE); HYPRE_Int *csc_i = hypre_TAlloc(HYPRE_Int, n + 1, HYPRE_MEMORY_DEVICE); size_t buffer_size = 0; HYPRE_ROCSPARSE_CALL( rocsparse_csr2csc_buffer_size(handle, m, n, nnzA, csc_i, csc_j, action, &buffer_size) ); void * buffer; buffer = hypre_TAlloc(char, buffer_size, HYPRE_MEMORY_DEVICE); HYPRE_ROCSPARSE_CALL( hypre_rocsparse_csr2csc(handle, m, n, nnzA, d_aa, d_ia, d_ja, csc_a, csc_j, csc_i, action, rocsparse_index_base_zero, buffer) ); hypre_TFree(buffer, HYPRE_MEMORY_DEVICE); *d_ic_out = csc_i; *d_jc_out = csc_j; *d_ac_out = csc_a; #ifdef HYPRE_PROFILE hypre_SyncDevice(); hypre_profile_times[HYPRE_TIMER_ID_SPTRANS] += hypre_MPI_Wtime(); #endif return hypre_error_flag; } #endif // #if defined(HYPRE_USING_ROCSPARSE) #if defined(HYPRE_USING_CUDA) || defined(HYPRE_USING_HIP) HYPRE_Int hypreDevice_CSRSpTrans(HYPRE_Int m, HYPRE_Int n, HYPRE_Int nnzA, HYPRE_Int *d_ia, HYPRE_Int *d_ja, HYPRE_Complex *d_aa, HYPRE_Int **d_ic_out, HYPRE_Int **d_jc_out, HYPRE_Complex **d_ac_out, HYPRE_Int want_data) { #ifdef HYPRE_PROFILE hypre_profile_times[HYPRE_TIMER_ID_SPTRANS] -= hypre_MPI_Wtime(); #endif HYPRE_Int *d_jt, *d_it, *d_pm, *d_ic, *d_jc; HYPRE_Complex *d_ac = NULL; HYPRE_Int *mem_work = hypre_TAlloc(HYPRE_Int, 3 * nnzA, HYPRE_MEMORY_DEVICE); /* allocate C */ d_jc = hypre_TAlloc(HYPRE_Int, nnzA, HYPRE_MEMORY_DEVICE); if (want_data) { d_ac = hypre_TAlloc(HYPRE_Complex, nnzA, HYPRE_MEMORY_DEVICE); } /* permutation vector */ //d_pm = hypre_TAlloc(HYPRE_Int, nnzA, HYPRE_MEMORY_DEVICE); d_pm = mem_work; /* expansion: A's row idx */ //d_it = hypre_TAlloc(HYPRE_Int, nnzA, HYPRE_MEMORY_DEVICE); d_it = d_pm + nnzA; hypreDevice_CsrRowPtrsToIndices_v2(m, nnzA, d_ia, d_it); /* a copy of col idx of A */ //d_jt = hypre_TAlloc(HYPRE_Int, nnzA, HYPRE_MEMORY_DEVICE); d_jt = d_it + nnzA; hypre_TMemcpy(d_jt, d_ja, HYPRE_Int, nnzA, HYPRE_MEMORY_DEVICE, HYPRE_MEMORY_DEVICE); /* sort: by col */ HYPRE_THRUST_CALL(sequence, d_pm, d_pm + nnzA); HYPRE_THRUST_CALL(stable_sort_by_key, d_jt, d_jt + nnzA, d_pm); HYPRE_THRUST_CALL(gather, d_pm, d_pm + nnzA, d_it, d_jc); if (want_data) { HYPRE_THRUST_CALL(gather, d_pm, d_pm + nnzA, d_aa, d_ac); } /* convert into ic: row idx --> row ptrs */ d_ic = hypreDevice_CsrRowIndicesToPtrs(n, nnzA, d_jt); #ifdef HYPRE_DEBUG HYPRE_Int nnzC; hypre_TMemcpy(&nnzC, &d_ic[n], HYPRE_Int, 1, HYPRE_MEMORY_HOST, HYPRE_MEMORY_DEVICE); hypre_assert(nnzC == nnzA); #endif /* hypre_TFree(d_jt, HYPRE_MEMORY_DEVICE); hypre_TFree(d_it, HYPRE_MEMORY_DEVICE); hypre_TFree(d_pm, HYPRE_MEMORY_DEVICE); */ hypre_TFree(mem_work, HYPRE_MEMORY_DEVICE); *d_ic_out = d_ic; *d_jc_out = d_jc; *d_ac_out = d_ac; #ifdef HYPRE_PROFILE hypre_profile_times[HYPRE_TIMER_ID_SPTRANS] += hypre_MPI_Wtime(); #endif return hypre_error_flag; } #endif /* HYPRE_USING_CUDA || defined(HYPRE_USING_HIP) */ #if defined(HYPRE_USING_SYCL) HYPRE_Int hypreDevice_CSRSpTrans(HYPRE_Int m, HYPRE_Int n, HYPRE_Int nnzA, HYPRE_Int *d_ia, HYPRE_Int *d_ja, HYPRE_Complex *d_aa, HYPRE_Int **d_ic_out, HYPRE_Int **d_jc_out, HYPRE_Complex **d_ac_out, HYPRE_Int want_data) { #ifdef HYPRE_PROFILE hypre_profile_times[HYPRE_TIMER_ID_SPTRANS] -= hypre_MPI_Wtime(); #endif HYPRE_Int *d_jt, *d_it, *d_pm, *d_ic, *d_jc; HYPRE_Complex *d_ac = NULL; HYPRE_Int *mem_work = hypre_TAlloc(HYPRE_Int, 3 * nnzA, HYPRE_MEMORY_DEVICE); /* allocate C */ d_jc = hypre_TAlloc(HYPRE_Int, nnzA, HYPRE_MEMORY_DEVICE); if (want_data) { d_ac = hypre_TAlloc(HYPRE_Complex, nnzA, HYPRE_MEMORY_DEVICE); } /* permutation vector */ d_pm = mem_work; /* expansion: A's row idx */ d_it = d_pm + nnzA; hypreDevice_CsrRowPtrsToIndices_v2(m, nnzA, d_ia, d_it); /* a copy of col idx of A */ d_jt = d_it + nnzA; hypre_TMemcpy(d_jt, d_ja, HYPRE_Int, nnzA, HYPRE_MEMORY_DEVICE, HYPRE_MEMORY_DEVICE); /* sort: by col */ oneapi::dpl::counting_iterator count(0); HYPRE_ONEDPL_CALL( std::copy, count, count + nnzA, d_pm); auto zip_jt_pm = oneapi::dpl::make_zip_iterator(d_jt, d_pm); HYPRE_ONEDPL_CALL( std::stable_sort, zip_jt_pm, zip_jt_pm + nnzA, [](auto lhs, auto rhs) { return std::get<0>(lhs) < std::get<0>(rhs); } ); auto permuted_it = oneapi::dpl::make_permutation_iterator(d_it, d_pm); HYPRE_ONEDPL_CALL( std::copy, permuted_it, permuted_it + nnzA, d_jc ); if (want_data) { auto permuted_aa = oneapi::dpl::make_permutation_iterator(d_aa, d_pm); HYPRE_ONEDPL_CALL( std::copy, permuted_aa, permuted_aa + nnzA, d_ac ); } /* convert into ic: row idx --> row ptrs */ d_ic = hypreDevice_CsrRowIndicesToPtrs(n, nnzA, d_jt); #ifdef HYPRE_DEBUG HYPRE_Int nnzC; hypre_TMemcpy(&nnzC, &d_ic[n], HYPRE_Int, 1, HYPRE_MEMORY_HOST, HYPRE_MEMORY_DEVICE); hypre_assert(nnzC == nnzA); #endif hypre_TFree(mem_work, HYPRE_MEMORY_DEVICE); *d_ic_out = d_ic; *d_jc_out = d_jc; *d_ac_out = d_ac; #ifdef HYPRE_PROFILE hypre_profile_times[HYPRE_TIMER_ID_SPTRANS] += hypre_MPI_Wtime(); #endif return hypre_error_flag; } #endif // #if defined(HYPRE_USING_SYCL) hypre-2.33.0/src/seq_mv/genpart.c000066400000000000000000000046051477326011500166260ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "seq_mv.h" /*-------------------------------------------------------------------------- * hypre_GeneratePartitioning: * generates load balanced partitioning of a 1-d array *--------------------------------------------------------------------------*/ /* for multivectors, length should be the (global) length of a single vector. Thus each of the vectors of the multivector will get the same data distribution. */ HYPRE_Int hypre_GeneratePartitioning(HYPRE_BigInt length, HYPRE_Int num_procs, HYPRE_BigInt **part_ptr) { HYPRE_Int ierr = 0; HYPRE_BigInt *part; HYPRE_Int size, rest; HYPRE_Int i; part = hypre_CTAlloc(HYPRE_BigInt, num_procs + 1, HYPRE_MEMORY_HOST); size = (HYPRE_Int)(length / (HYPRE_BigInt)num_procs); rest = (HYPRE_Int)(length - (HYPRE_BigInt)(size * num_procs)); part[0] = 0; for (i = 0; i < num_procs; i++) { part[i + 1] = part[i] + (HYPRE_BigInt)size; if (i < rest) { part[i + 1]++; } } *part_ptr = part; return ierr; } /* This function differs from the above in that it only returns the portion of the partition belonging to the individual process - to do this it requires the processor id as well AHB 6/05. This functions assumes that part is on the stack memory and has size equal to 2. */ HYPRE_Int hypre_GenerateLocalPartitioning(HYPRE_BigInt length, HYPRE_Int num_procs, HYPRE_Int myid, HYPRE_BigInt *part) { HYPRE_Int size, rest; size = (HYPRE_Int)(length / (HYPRE_BigInt)num_procs); rest = (HYPRE_Int)(length - (HYPRE_BigInt)(size * num_procs)); /* first row I own */ part[0] = (HYPRE_BigInt)(size * myid); part[0] += (HYPRE_BigInt)(hypre_min(myid, rest)); /* last row I own */ part[1] = (HYPRE_BigInt)(size * (myid + 1)); part[1] += (HYPRE_BigInt)(hypre_min(myid + 1, rest)); part[1] = part[1] - 1; /* add 1 to last row since this is for "starts" vector */ part[1] = part[1] + 1; return hypre_error_flag; } hypre-2.33.0/src/seq_mv/headers000077500000000000000000000027141477326011500163620ustar00rootroot00000000000000#!/bin/bash # Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) INTERNAL_HEADER=seq_mv.h #=========================================================================== # Include guards and other includes #=========================================================================== cat > $INTERNAL_HEADER <<@ /*** DO NOT EDIT THIS FILE DIRECTLY (use 'headers' to generate) ***/ #ifndef hypre_MV_HEADER #define hypre_MV_HEADER #include #include #include #include #include "HYPRE_seq_mv.h" #include "_hypre_utilities.h" #ifdef __cplusplus extern "C" { #endif @ #=========================================================================== # Structures and prototypes #=========================================================================== cat csr_matrix.h >> $INTERNAL_HEADER cat mapped_matrix.h >> $INTERNAL_HEADER cat multiblock_matrix.h >> $INTERNAL_HEADER cat vector.h >> $INTERNAL_HEADER cat protos.h >> $INTERNAL_HEADER #../utilities/protos *.c >> $INTERNAL_HEADER #=========================================================================== # Include guards #=========================================================================== cat >> $INTERNAL_HEADER <<@ #ifdef __cplusplus } #endif #endif @ hypre-2.33.0/src/seq_mv/mapped_matrix.c000066400000000000000000000115571477326011500200240ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * Member functions for hypre_MappedMatrix class. * *****************************************************************************/ #include "seq_mv.h" /*-------------------------------------------------------------------------- * hypre_MappedMatrixCreate *--------------------------------------------------------------------------*/ hypre_MappedMatrix * hypre_MappedMatrixCreate( void ) { hypre_MappedMatrix *matrix; matrix = hypre_CTAlloc(hypre_MappedMatrix, 1, HYPRE_MEMORY_HOST); return ( matrix ); } /*-------------------------------------------------------------------------- * hypre_MappedMatrixDestroy *--------------------------------------------------------------------------*/ HYPRE_Int hypre_MappedMatrixDestroy( hypre_MappedMatrix *matrix ) { HYPRE_Int ierr = 0; if (matrix) { hypre_TFree(hypre_MappedMatrixMatrix(matrix), HYPRE_MEMORY_HOST); hypre_TFree(hypre_MappedMatrixMapData(matrix), HYPRE_MEMORY_HOST); hypre_TFree(matrix, HYPRE_MEMORY_HOST); } return ierr; } /*-------------------------------------------------------------------------- * hypre_MappedMatrixLimitedDestroy *--------------------------------------------------------------------------*/ HYPRE_Int hypre_MappedMatrixLimitedDestroy( hypre_MappedMatrix *matrix ) { HYPRE_Int ierr = 0; if (matrix) { hypre_TFree(matrix, HYPRE_MEMORY_HOST); } return ierr; } /*-------------------------------------------------------------------------- * hypre_MappedMatrixInitialize *--------------------------------------------------------------------------*/ HYPRE_Int hypre_MappedMatrixInitialize( hypre_MappedMatrix *matrix ) { HYPRE_Int ierr = 0; HYPRE_UNUSED_VAR(matrix); return ierr; } /*-------------------------------------------------------------------------- * hypre_MappedMatrixAssemble *--------------------------------------------------------------------------*/ HYPRE_Int hypre_MappedMatrixAssemble( hypre_MappedMatrix *matrix ) { HYPRE_Int ierr = 0; if ( matrix == NULL ) { return ( -1 ) ; } if ( hypre_MappedMatrixMatrix(matrix) == NULL ) { return ( -1 ) ; } if ( hypre_MappedMatrixColMap(matrix) == NULL ) { return ( -1 ) ; } if ( hypre_MappedMatrixMapData(matrix) == NULL ) { return ( -1 ) ; } return (ierr); } /*-------------------------------------------------------------------------- * hypre_MappedMatrixPrint *--------------------------------------------------------------------------*/ void hypre_MappedMatrixPrint(hypre_MappedMatrix *matrix ) { HYPRE_UNUSED_VAR(matrix); hypre_printf("Stub for hypre_MappedMatrix\n"); } /*-------------------------------------------------------------------------- * hypre_MappedMatrixGetColIndex *--------------------------------------------------------------------------*/ HYPRE_Int hypre_MappedMatrixGetColIndex(hypre_MappedMatrix *matrix, HYPRE_Int j ) { return ( hypre_MappedMatrixColIndex(matrix, j) ); } /*-------------------------------------------------------------------------- * hypre_MappedMatrixGetMatrix *--------------------------------------------------------------------------*/ void * hypre_MappedMatrixGetMatrix(hypre_MappedMatrix *matrix ) { return ( hypre_MappedMatrixMatrix(matrix) ); } /*-------------------------------------------------------------------------- * hypre_MappedMatrixSetMatrix *--------------------------------------------------------------------------*/ HYPRE_Int hypre_MappedMatrixSetMatrix(hypre_MappedMatrix *matrix, void *matrix_data ) { HYPRE_Int ierr = 0; hypre_MappedMatrixMatrix(matrix) = matrix_data; return (ierr); } /*-------------------------------------------------------------------------- * hypre_MappedMatrixSetColMap *--------------------------------------------------------------------------*/ HYPRE_Int hypre_MappedMatrixSetColMap(hypre_MappedMatrix *matrix, HYPRE_Int (*ColMap)(HYPRE_Int, void *) ) { HYPRE_Int ierr = 0; hypre_MappedMatrixColMap(matrix) = ColMap; return (ierr); } /*-------------------------------------------------------------------------- * hypre_MappedMatrixSetMapData *--------------------------------------------------------------------------*/ HYPRE_Int hypre_MappedMatrixSetMapData(hypre_MappedMatrix *matrix, void *map_data ) { HYPRE_Int ierr = 0; hypre_MappedMatrixMapData(matrix) = map_data; return (ierr); } hypre-2.33.0/src/seq_mv/mapped_matrix.h000066400000000000000000000030101477326011500200120ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * Header info for Mapped Matrix data structures * *****************************************************************************/ #ifndef hypre_MAPPED_MATRIX_HEADER #define hypre_MAPPED_MATRIX_HEADER /*-------------------------------------------------------------------------- * Mapped Matrix *--------------------------------------------------------------------------*/ typedef struct { void *matrix; HYPRE_Int (*ColMap)(HYPRE_Int, void *); void *MapData; } hypre_MappedMatrix; /*-------------------------------------------------------------------------- * Accessor functions for the Mapped Matrix structure *--------------------------------------------------------------------------*/ #define hypre_MappedMatrixMatrix(matrix) ((matrix) -> matrix) #define hypre_MappedMatrixColMap(matrix) ((matrix) -> ColMap) #define hypre_MappedMatrixMapData(matrix) ((matrix) -> MapData) #define hypre_MappedMatrixColIndex(matrix,j) \ (hypre_MappedMatrixColMap(matrix)(j,hypre_MappedMatrixMapData(matrix))) #endif hypre-2.33.0/src/seq_mv/multiblock_matrix.c000066400000000000000000000122331477326011500207130ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * Member functions for hypre_MultiblockMatrix class. * *****************************************************************************/ #include "seq_mv.h" /*-------------------------------------------------------------------------- * hypre_MultiblockMatrixCreate *--------------------------------------------------------------------------*/ hypre_MultiblockMatrix * hypre_MultiblockMatrixCreate( void ) { hypre_MultiblockMatrix *matrix; matrix = hypre_CTAlloc(hypre_MultiblockMatrix, 1, HYPRE_MEMORY_HOST); return ( matrix ); } /*-------------------------------------------------------------------------- * hypre_MultiblockMatrixDestroy *--------------------------------------------------------------------------*/ HYPRE_Int hypre_MultiblockMatrixDestroy( hypre_MultiblockMatrix *matrix ) { HYPRE_Int ierr = 0, i; if (matrix) { for (i = 0; i < hypre_MultiblockMatrixNumSubmatrices(matrix); i++) { hypre_TFree(hypre_MultiblockMatrixSubmatrix(matrix, i), HYPRE_MEMORY_HOST); } hypre_TFree(hypre_MultiblockMatrixSubmatrices(matrix), HYPRE_MEMORY_HOST); hypre_TFree(hypre_MultiblockMatrixSubmatrixTypes(matrix), HYPRE_MEMORY_HOST); hypre_TFree(matrix, HYPRE_MEMORY_HOST); } return ierr; } /*-------------------------------------------------------------------------- * hypre_MultiblockMatrixLimitedDestroy *--------------------------------------------------------------------------*/ HYPRE_Int hypre_MultiblockMatrixLimitedDestroy( hypre_MultiblockMatrix *matrix ) { HYPRE_Int ierr = 0; if (matrix) { hypre_TFree(hypre_MultiblockMatrixSubmatrices(matrix), HYPRE_MEMORY_HOST); hypre_TFree(hypre_MultiblockMatrixSubmatrixTypes(matrix), HYPRE_MEMORY_HOST); hypre_TFree(matrix, HYPRE_MEMORY_HOST); } return ierr; } /*-------------------------------------------------------------------------- * hypre_MultiblockMatrixInitialize *--------------------------------------------------------------------------*/ HYPRE_Int hypre_MultiblockMatrixInitialize( hypre_MultiblockMatrix *matrix ) { HYPRE_Int ierr = 0; if ( hypre_MultiblockMatrixNumSubmatrices(matrix) <= 0 ) { return (-1); } hypre_MultiblockMatrixSubmatrixTypes(matrix) = hypre_CTAlloc( HYPRE_Int, hypre_MultiblockMatrixNumSubmatrices(matrix), HYPRE_MEMORY_HOST); hypre_MultiblockMatrixSubmatrices(matrix) = hypre_CTAlloc( void *, hypre_MultiblockMatrixNumSubmatrices(matrix), HYPRE_MEMORY_HOST); return ierr; } /*-------------------------------------------------------------------------- * hypre_MultiblockMatrixAssemble *--------------------------------------------------------------------------*/ HYPRE_Int hypre_MultiblockMatrixAssemble( hypre_MultiblockMatrix *matrix ) { HYPRE_Int ierr = 0; HYPRE_UNUSED_VAR(matrix); return (ierr); } /*-------------------------------------------------------------------------- * hypre_MultiblockMatrixPrint *--------------------------------------------------------------------------*/ void hypre_MultiblockMatrixPrint(hypre_MultiblockMatrix *matrix ) { HYPRE_UNUSED_VAR(matrix); hypre_printf("Stub for hypre_MultiblockMatrix\n"); } /*-------------------------------------------------------------------------- * hypre_MultiblockMatrixSetNumSubmatrices *--------------------------------------------------------------------------*/ HYPRE_Int hypre_MultiblockMatrixSetNumSubmatrices(hypre_MultiblockMatrix *matrix, HYPRE_Int n ) { HYPRE_Int ierr = 0; hypre_MultiblockMatrixNumSubmatrices(matrix) = n; return ( ierr ); } /*-------------------------------------------------------------------------- * hypre_MultiblockMatrixSetSubmatrixType *--------------------------------------------------------------------------*/ HYPRE_Int hypre_MultiblockMatrixSetSubmatrixType(hypre_MultiblockMatrix *matrix, HYPRE_Int j, HYPRE_Int type ) { HYPRE_Int ierr = 0; if ( (j < 0) || (j >= hypre_MultiblockMatrixNumSubmatrices(matrix)) ) { return (-1); } hypre_MultiblockMatrixSubmatrixType(matrix, j) = type; return ( ierr ); } /*-------------------------------------------------------------------------- * hypre_MultiblockMatrixSetSubmatrix *--------------------------------------------------------------------------*/ HYPRE_Int hypre_MultiblockMatrixSetSubmatrix(hypre_MultiblockMatrix *matrix, HYPRE_Int j, void *submatrix ) { HYPRE_Int ierr = 0; if ( (j < 0) || (j >= hypre_MultiblockMatrixNumSubmatrices(matrix)) ) { return (-1); } hypre_MultiblockMatrixSubmatrix(matrix, j) = submatrix; return ( ierr ); } hypre-2.33.0/src/seq_mv/multiblock_matrix.h000066400000000000000000000032351477326011500207220ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * Header info for Multiblock Matrix data structures * *****************************************************************************/ #ifndef hypre_MULTIBLOCK_MATRIX_HEADER #define hypre_MULTIBLOCK_MATRIX_HEADER /*-------------------------------------------------------------------------- * Multiblock Matrix *--------------------------------------------------------------------------*/ typedef struct { HYPRE_Int num_submatrices; HYPRE_Int *submatrix_types; void **submatrices; } hypre_MultiblockMatrix; /*-------------------------------------------------------------------------- * Accessor functions for the Multiblock Matrix structure *--------------------------------------------------------------------------*/ #define hypre_MultiblockMatrixSubmatrices(matrix) ((matrix) -> submatrices) #define hypre_MultiblockMatrixNumSubmatrices(matrix) ((matrix) -> num_submatrices) #define hypre_MultiblockMatrixSubmatrixTypes(matrix) ((matrix) -> submatrix_types) #define hypre_MultiblockMatrixSubmatrix(matrix,j) (hypre_MultiblockMatrixSubmatrices\ (matrix)[j]) #define hypre_MultiblockMatrixSubmatrixType(matrix,j) (hypre_MultiblockMatrixSubmatrixTypes\ (matrix)[j]) #endif hypre-2.33.0/src/seq_mv/protos.h000066400000000000000000000714241477326011500165240ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /* csr_filter.c */ HYPRE_Int hypre_CSRMatrixTruncateDiag(hypre_CSRMatrix *A); /* csr_matop.c */ HYPRE_Int hypre_CSRMatrixAddFirstPass ( HYPRE_Int firstrow, HYPRE_Int lastrow, HYPRE_Int *marker, HYPRE_Int *twspace, HYPRE_Int *map_A2C, HYPRE_Int *map_B2C, hypre_CSRMatrix *A, hypre_CSRMatrix *B, HYPRE_Int nnzrows_C, HYPRE_Int nrows_C, HYPRE_Int ncols_C, HYPRE_Int *rownnz_C, HYPRE_MemoryLocation memory_location_C, HYPRE_Int *C_i, hypre_CSRMatrix **C_ptr ); HYPRE_Int hypre_CSRMatrixAddSecondPass ( HYPRE_Int firstrow, HYPRE_Int lastrow, HYPRE_Int *marker, HYPRE_Int *map_A2C, HYPRE_Int *map_B2C, HYPRE_Int *rownnz_C, HYPRE_Complex alpha, HYPRE_Complex beta, hypre_CSRMatrix *A, hypre_CSRMatrix *B, hypre_CSRMatrix *C); hypre_CSRMatrix *hypre_CSRMatrixAddHost ( HYPRE_Complex alpha, hypre_CSRMatrix *A, HYPRE_Complex beta, hypre_CSRMatrix *B ); hypre_CSRMatrix *hypre_CSRMatrixAdd ( HYPRE_Complex alpha, hypre_CSRMatrix *A, HYPRE_Complex beta, hypre_CSRMatrix *B ); hypre_CSRMatrix *hypre_CSRMatrixBigAdd ( hypre_CSRMatrix *A, hypre_CSRMatrix *B ); hypre_CSRMatrix *hypre_CSRMatrixMultiplyHost ( hypre_CSRMatrix *A, hypre_CSRMatrix *B ); hypre_CSRMatrix *hypre_CSRMatrixMultiply ( hypre_CSRMatrix *A, hypre_CSRMatrix *B ); hypre_CSRMatrix *hypre_CSRMatrixDeleteZeros ( hypre_CSRMatrix *A, HYPRE_Real tol ); HYPRE_Int hypre_CSRMatrixTransposeHost ( hypre_CSRMatrix *A, hypre_CSRMatrix **AT, HYPRE_Int data ); HYPRE_Int hypre_CSRMatrixTranspose ( hypre_CSRMatrix *A, hypre_CSRMatrix **AT, HYPRE_Int data ); HYPRE_Int hypre_CSRMatrixReorder ( hypre_CSRMatrix *A ); HYPRE_Complex hypre_CSRMatrixSumElts ( hypre_CSRMatrix *A ); HYPRE_Real hypre_CSRMatrixFnorm( hypre_CSRMatrix *A ); HYPRE_Int hypre_CSRMatrixSplit(hypre_CSRMatrix *Bs_ext, HYPRE_BigInt first_col_diag_B, HYPRE_BigInt last_col_diag_B, HYPRE_Int num_cols_offd_B, HYPRE_BigInt *col_map_offd_B, HYPRE_Int *num_cols_offd_C_ptr, HYPRE_BigInt **col_map_offd_C_ptr, hypre_CSRMatrix **Bext_diag_ptr, hypre_CSRMatrix **Bext_offd_ptr); hypre_CSRMatrix * hypre_CSRMatrixAddPartial( hypre_CSRMatrix *A, hypre_CSRMatrix *B, HYPRE_Int *row_nums); void hypre_CSRMatrixComputeRowSumHost( hypre_CSRMatrix *A, HYPRE_Int *CF_i, HYPRE_Int *CF_j, HYPRE_Complex *row_sum, HYPRE_Int type, HYPRE_Complex scal, const char *set_or_add); void hypre_CSRMatrixComputeRowSum( hypre_CSRMatrix *A, HYPRE_Int *CF_i, HYPRE_Int *CF_j, HYPRE_Complex *row_sum, HYPRE_Int type, HYPRE_Complex scal, const char *set_or_add); HYPRE_Int hypre_CSRMatrixExtractDiagonal( hypre_CSRMatrix *A, HYPRE_Complex *d, HYPRE_Int type); HYPRE_Int hypre_CSRMatrixExtractDiagonalHost( hypre_CSRMatrix *A, HYPRE_Complex *d, HYPRE_Int type); HYPRE_Int hypre_CSRMatrixScale(hypre_CSRMatrix *A, HYPRE_Complex scalar); HYPRE_Int hypre_CSRMatrixSetConstantValues( hypre_CSRMatrix *A, HYPRE_Complex value); HYPRE_Int hypre_CSRMatrixDiagScale( hypre_CSRMatrix *A, hypre_Vector *ld, hypre_Vector *rd); /* csr_matop_device.c */ hypre_CSRMatrix *hypre_CSRMatrixAddDevice ( HYPRE_Complex alpha, hypre_CSRMatrix *A, HYPRE_Complex beta, hypre_CSRMatrix *B ); hypre_CSRMatrix *hypre_CSRMatrixMultiplyDevice ( hypre_CSRMatrix *A, hypre_CSRMatrix *B ); hypre_CSRMatrix *hypre_CSRMatrixTripleMultiplyDevice ( hypre_CSRMatrix *A, hypre_CSRMatrix *B, hypre_CSRMatrix *C ); HYPRE_Int hypre_CSRMatrixMergeColMapOffd( HYPRE_Int num_cols_offd_B, HYPRE_BigInt *col_map_offd_B, HYPRE_Int B_ext_offd_nnz, HYPRE_BigInt *B_ext_offd_bigj, HYPRE_Int *num_cols_offd_C_ptr, HYPRE_BigInt **col_map_offd_C_ptr, HYPRE_Int **map_B_to_C_ptr ); HYPRE_Int hypre_CSRMatrixSplitDevice_core( HYPRE_Int job, HYPRE_Int num_rows, HYPRE_Int B_ext_nnz, HYPRE_Int *B_ext_ii, HYPRE_BigInt *B_ext_bigj, HYPRE_Complex *B_ext_data, char *B_ext_xata, HYPRE_BigInt first_col_diag_B, HYPRE_BigInt last_col_diag_B, HYPRE_Int num_cols_offd_B, HYPRE_BigInt *col_map_offd_B, HYPRE_Int **map_B_to_C_ptr, HYPRE_Int *num_cols_offd_C_ptr, HYPRE_BigInt **col_map_offd_C_ptr, HYPRE_Int *B_ext_diag_nnz_ptr, HYPRE_Int *B_ext_diag_ii, HYPRE_Int *B_ext_diag_j, HYPRE_Complex *B_ext_diag_data, char *B_ext_diag_xata, HYPRE_Int *B_ext_offd_nnz_ptr, HYPRE_Int *B_ext_offd_ii, HYPRE_Int *B_ext_offd_j, HYPRE_Complex *B_ext_offd_data, char *B_ext_offd_xata ); HYPRE_Int hypre_CSRMatrixSplitDevice(hypre_CSRMatrix *B_ext, HYPRE_BigInt first_col_diag_B, HYPRE_BigInt last_col_diag_B, HYPRE_Int num_cols_offd_B, HYPRE_BigInt *col_map_offd_B, HYPRE_Int **map_B_to_C_ptr, HYPRE_Int *num_cols_offd_C_ptr, HYPRE_BigInt **col_map_offd_C_ptr, hypre_CSRMatrix **B_ext_diag_ptr, hypre_CSRMatrix **B_ext_offd_ptr); HYPRE_Int hypre_CSRMatrixTransposeDevice ( hypre_CSRMatrix *A, hypre_CSRMatrix **AT, HYPRE_Int data ); hypre_CSRMatrix* hypre_CSRMatrixAddPartialDevice( hypre_CSRMatrix *A, hypre_CSRMatrix *B, HYPRE_Int *row_nums); HYPRE_Int hypre_CSRMatrixColNNzRealDevice( hypre_CSRMatrix *A, HYPRE_Real *colnnz); HYPRE_Int hypre_CSRMatrixMoveDiagFirstDevice( hypre_CSRMatrix *A ); HYPRE_Int hypre_CSRMatrixCheckDiagFirstDevice( hypre_CSRMatrix *A ); HYPRE_Int hypre_CSRMatrixCheckForMissingDiagonal( hypre_CSRMatrix *A ); HYPRE_Int hypre_CSRMatrixReplaceDiagDevice( hypre_CSRMatrix *A, HYPRE_Complex *new_diag, HYPRE_Complex v, HYPRE_Real tol ); HYPRE_Int hypre_CSRMatrixComputeRowSumDevice( hypre_CSRMatrix *A, HYPRE_Int *CF_i, HYPRE_Int *CF_j, HYPRE_Complex *row_sum, HYPRE_Int type, HYPRE_Complex scal, const char *set_or_add ); HYPRE_Int hypre_CSRMatrixExtractDiagonalDevice( hypre_CSRMatrix *A, HYPRE_Complex *d, HYPRE_Int type ); hypre_CSRMatrix* hypre_CSRMatrixStack2Device(hypre_CSRMatrix *A, hypre_CSRMatrix *B); hypre_CSRMatrix* hypre_CSRMatrixIdentityDevice(HYPRE_Int n, HYPRE_Complex alp); hypre_CSRMatrix* hypre_CSRMatrixDiagMatrixFromVectorDevice(HYPRE_Int n, HYPRE_Complex *v); hypre_CSRMatrix* hypre_CSRMatrixDiagMatrixFromMatrixDevice(hypre_CSRMatrix *A, HYPRE_Int type); HYPRE_Int hypre_CSRMatrixRemoveDiagonalDevice(hypre_CSRMatrix *A); HYPRE_Int hypre_CSRMatrixDropSmallEntriesDevice( hypre_CSRMatrix *A, HYPRE_Real tol, HYPRE_Real *elmt_tols); HYPRE_Int hypre_CSRMatrixPermuteDevice( hypre_CSRMatrix *A, HYPRE_Int *perm, HYPRE_Int *rqperm, hypre_CSRMatrix *B ); HYPRE_Int hypre_CSRMatrixSortRow(hypre_CSRMatrix *A); HYPRE_Int hypre_CSRMatrixSortRowOutOfPlace(hypre_CSRMatrix *A); HYPRE_Int hypre_CSRMatrixTriLowerUpperSolveDevice_core(char uplo, HYPRE_Int unit_diag, hypre_CSRMatrix *A, HYPRE_Real *l1_norms, hypre_Vector *f, HYPRE_Int offset_f, hypre_Vector *u, HYPRE_Int offset_u); HYPRE_Int hypre_CSRMatrixTriLowerUpperSolveDevice(char uplo, HYPRE_Int unit_diag, hypre_CSRMatrix *A, HYPRE_Real *l1_norms, hypre_Vector *f, hypre_Vector *u ); HYPRE_Int hypre_CSRMatrixTriLowerUpperSolveRocsparse(char uplo, HYPRE_Int unit_diag, hypre_CSRMatrix *A, HYPRE_Real *l1_norms, HYPRE_Complex *f, HYPRE_Complex *u ); HYPRE_Int hypre_CSRMatrixTriLowerUpperSolveCusparse(char uplo, HYPRE_Int unit_diag, hypre_CSRMatrix *A, HYPRE_Real *l1_norms, HYPRE_Complex *f, HYPRE_Complex *u ); HYPRE_Int hypre_CSRMatrixTriLowerUpperSolveOnemklsparse(char uplo, HYPRE_Int unit_diag, hypre_CSRMatrix *A, HYPRE_Real *l1_norms, HYPRE_Complex *f, HYPRE_Complex *u ); HYPRE_Int hypre_CSRMatrixIntersectPattern(hypre_CSRMatrix *A, hypre_CSRMatrix *B, HYPRE_Int *markA, HYPRE_Int diag_option); HYPRE_Int hypre_CSRMatrixDiagScaleDevice( hypre_CSRMatrix *A, hypre_Vector *ld, hypre_Vector *rd); HYPRE_Int hypre_CSRMatrixCompressColumnsDevice(hypre_CSRMatrix *A, HYPRE_BigInt *col_map, HYPRE_Int **col_idx_new_ptr, HYPRE_BigInt **col_map_new_ptr); HYPRE_Int hypre_CSRMatrixILU0(hypre_CSRMatrix *A); /* csr_matrix.c */ hypre_CSRMatrix *hypre_CSRMatrixCreate ( HYPRE_Int num_rows, HYPRE_Int num_cols, HYPRE_Int num_nonzeros ); HYPRE_Int hypre_CSRMatrixDestroy ( hypre_CSRMatrix *matrix ); HYPRE_Int hypre_CSRMatrixInitialize_v2( hypre_CSRMatrix *matrix, HYPRE_Int bigInit, HYPRE_MemoryLocation memory_location ); HYPRE_Int hypre_CSRMatrixInitialize ( hypre_CSRMatrix *matrix ); HYPRE_Int hypre_CSRMatrixBigInitialize ( hypre_CSRMatrix *matrix ); HYPRE_Int hypre_CSRMatrixBigJtoJ ( hypre_CSRMatrix *matrix ); HYPRE_Int hypre_CSRMatrixJtoBigJ ( hypre_CSRMatrix *matrix ); HYPRE_Int hypre_CSRMatrixSetDataOwner ( hypre_CSRMatrix *matrix, HYPRE_Int owns_data ); HYPRE_Int hypre_CSRMatrixSetPatternOnly( hypre_CSRMatrix *matrix, HYPRE_Int pattern_only ); HYPRE_Int hypre_CSRMatrixSetRownnz ( hypre_CSRMatrix *matrix ); hypre_CSRMatrix *hypre_CSRMatrixRead ( char *file_name ); HYPRE_Int hypre_CSRMatrixPrint ( hypre_CSRMatrix *matrix, const char *file_name ); HYPRE_Int hypre_CSRMatrixPrintIJ( hypre_CSRMatrix *matrix, HYPRE_Int base_i, HYPRE_Int base_j, char *filename ); HYPRE_Int hypre_CSRMatrixPrintHB ( hypre_CSRMatrix *matrix_input, char *file_name ); HYPRE_Int hypre_CSRMatrixPrintMM( hypre_CSRMatrix *matrix, HYPRE_Int basei, HYPRE_Int basej, HYPRE_Int trans, const char *file_name ); HYPRE_Int hypre_CSRMatrixCopy ( hypre_CSRMatrix *A, hypre_CSRMatrix *B, HYPRE_Int copy_data ); HYPRE_Int hypre_CSRMatrixMigrate( hypre_CSRMatrix *A, HYPRE_MemoryLocation memory_location ); hypre_CSRMatrix *hypre_CSRMatrixClone ( hypre_CSRMatrix *A, HYPRE_Int copy_data ); hypre_CSRMatrix *hypre_CSRMatrixClone_v2( hypre_CSRMatrix *A, HYPRE_Int copy_data, HYPRE_MemoryLocation memory_location ); HYPRE_Int hypre_CSRMatrixPermute( hypre_CSRMatrix *A, HYPRE_Int *perm, HYPRE_Int *rqperm, hypre_CSRMatrix **B_ptr ); hypre_CSRMatrix *hypre_CSRMatrixUnion( hypre_CSRMatrix *A, hypre_CSRMatrix *B, HYPRE_BigInt *col_map_offd_A, HYPRE_BigInt *col_map_offd_B, HYPRE_BigInt **col_map_offd_C ); HYPRE_Int hypre_CSRMatrixPrefetch( hypre_CSRMatrix *A, HYPRE_MemoryLocation memory_location); HYPRE_Int hypre_CSRMatrixCheckSetNumNonzeros( hypre_CSRMatrix *matrix ); HYPRE_Int hypre_CSRMatrixResize( hypre_CSRMatrix *matrix, HYPRE_Int new_num_rows, HYPRE_Int new_num_cols, HYPRE_Int new_num_nonzeros ); /* csr_matvec.c */ // y[offset:end] = alpha*A[offset:end,:]*x + beta*b[offset:end] HYPRE_Int hypre_CSRMatrixMatvecOutOfPlace ( HYPRE_Complex alpha, hypre_CSRMatrix *A, hypre_Vector *x, HYPRE_Complex beta, hypre_Vector *b, hypre_Vector *y, HYPRE_Int offset ); // y = alpha*A + beta*y HYPRE_Int hypre_CSRMatrixMatvec ( HYPRE_Complex alpha, hypre_CSRMatrix *A, hypre_Vector *x, HYPRE_Complex beta, hypre_Vector *y ); HYPRE_Int hypre_CSRMatrixMatvecT ( HYPRE_Complex alpha, hypre_CSRMatrix *A, hypre_Vector *x, HYPRE_Complex beta, hypre_Vector *y ); HYPRE_Int hypre_CSRMatrixMatvec_FF ( HYPRE_Complex alpha, hypre_CSRMatrix *A, hypre_Vector *x, HYPRE_Complex beta, hypre_Vector *y, HYPRE_Int *CF_marker_x, HYPRE_Int *CF_marker_y, HYPRE_Int fpt ); /* csr_matvec_device.c */ HYPRE_Int hypre_CSRMatrixMatvecDevice(HYPRE_Int trans, HYPRE_Complex alpha, hypre_CSRMatrix *A, hypre_Vector *x, HYPRE_Complex beta, hypre_Vector *b, hypre_Vector *y, HYPRE_Int offset ); HYPRE_Int hypre_CSRMatrixMatvecCusparseNewAPI( HYPRE_Int trans, HYPRE_Complex alpha, hypre_CSRMatrix *A, hypre_Vector *x, HYPRE_Complex beta, hypre_Vector *y, HYPRE_Int offset ); HYPRE_Int hypre_CSRMatrixMatvecCusparseOldAPI( HYPRE_Int trans, HYPRE_Complex alpha, hypre_CSRMatrix *A, hypre_Vector *x, HYPRE_Complex beta, hypre_Vector *y, HYPRE_Int offset ); HYPRE_Int hypre_CSRMatrixMatvecCusparse( HYPRE_Int trans, HYPRE_Complex alpha, hypre_CSRMatrix *A, hypre_Vector *x, HYPRE_Complex beta, hypre_Vector *y, HYPRE_Int offset ); HYPRE_Int hypre_CSRMatrixMatvecOMPOffload (HYPRE_Int trans, HYPRE_Complex alpha, hypre_CSRMatrix *A, hypre_Vector *x, HYPRE_Complex beta, hypre_Vector *y, HYPRE_Int offset ); HYPRE_Int hypre_CSRMatrixMatvecRocsparse (HYPRE_Int trans, HYPRE_Complex alpha, hypre_CSRMatrix *A, hypre_Vector *x, HYPRE_Complex beta, hypre_Vector *y, HYPRE_Int offset ); HYPRE_Int hypre_CSRMatrixMatvecOnemklsparse (HYPRE_Int trans, HYPRE_Complex alpha, hypre_CSRMatrix *A, hypre_Vector *x, HYPRE_Complex beta, hypre_Vector *y, HYPRE_Int offset ); /* genpart.c */ HYPRE_Int hypre_GeneratePartitioning ( HYPRE_BigInt length, HYPRE_Int num_procs, HYPRE_BigInt **part_ptr ); HYPRE_Int hypre_GenerateLocalPartitioning ( HYPRE_BigInt length, HYPRE_Int num_procs, HYPRE_Int myid, HYPRE_BigInt *part ); /* HYPRE_csr_matrix.c */ HYPRE_CSRMatrix HYPRE_CSRMatrixCreate ( HYPRE_Int num_rows, HYPRE_Int num_cols, HYPRE_Int *row_sizes ); HYPRE_Int HYPRE_CSRMatrixDestroy ( HYPRE_CSRMatrix matrix ); HYPRE_Int HYPRE_CSRMatrixInitialize ( HYPRE_CSRMatrix matrix ); HYPRE_CSRMatrix HYPRE_CSRMatrixRead ( char *file_name ); void HYPRE_CSRMatrixPrint ( HYPRE_CSRMatrix matrix, char *file_name ); HYPRE_Int HYPRE_CSRMatrixGetNumRows ( HYPRE_CSRMatrix matrix, HYPRE_Int *num_rows ); /* HYPRE_mapped_matrix.c */ HYPRE_MappedMatrix HYPRE_MappedMatrixCreate ( void ); HYPRE_Int HYPRE_MappedMatrixDestroy ( HYPRE_MappedMatrix matrix ); HYPRE_Int HYPRE_MappedMatrixLimitedDestroy ( HYPRE_MappedMatrix matrix ); HYPRE_Int HYPRE_MappedMatrixInitialize ( HYPRE_MappedMatrix matrix ); HYPRE_Int HYPRE_MappedMatrixAssemble ( HYPRE_MappedMatrix matrix ); void HYPRE_MappedMatrixPrint ( HYPRE_MappedMatrix matrix ); HYPRE_Int HYPRE_MappedMatrixGetColIndex ( HYPRE_MappedMatrix matrix, HYPRE_Int j ); void *HYPRE_MappedMatrixGetMatrix ( HYPRE_MappedMatrix matrix ); HYPRE_Int HYPRE_MappedMatrixSetMatrix ( HYPRE_MappedMatrix matrix, void *matrix_data ); HYPRE_Int HYPRE_MappedMatrixSetColMap ( HYPRE_MappedMatrix matrix, HYPRE_Int (*ColMap )(HYPRE_Int, void *)); HYPRE_Int HYPRE_MappedMatrixSetMapData ( HYPRE_MappedMatrix matrix, void *MapData ); /* HYPRE_multiblock_matrix.c */ HYPRE_MultiblockMatrix HYPRE_MultiblockMatrixCreate ( void ); HYPRE_Int HYPRE_MultiblockMatrixDestroy ( HYPRE_MultiblockMatrix matrix ); HYPRE_Int HYPRE_MultiblockMatrixLimitedDestroy ( HYPRE_MultiblockMatrix matrix ); HYPRE_Int HYPRE_MultiblockMatrixInitialize ( HYPRE_MultiblockMatrix matrix ); HYPRE_Int HYPRE_MultiblockMatrixAssemble ( HYPRE_MultiblockMatrix matrix ); void HYPRE_MultiblockMatrixPrint ( HYPRE_MultiblockMatrix matrix ); HYPRE_Int HYPRE_MultiblockMatrixSetNumSubmatrices ( HYPRE_MultiblockMatrix matrix, HYPRE_Int n ); HYPRE_Int HYPRE_MultiblockMatrixSetSubmatrixType ( HYPRE_MultiblockMatrix matrix, HYPRE_Int j, HYPRE_Int type ); /* HYPRE_vector.c */ HYPRE_Vector HYPRE_VectorCreate ( HYPRE_Int size ); HYPRE_Int HYPRE_VectorDestroy ( HYPRE_Vector vector ); HYPRE_Int HYPRE_VectorInitialize ( HYPRE_Vector vector ); HYPRE_Int HYPRE_VectorPrint ( HYPRE_Vector vector, char *file_name ); HYPRE_Vector HYPRE_VectorRead ( char *file_name ); /* mapped_matrix.c */ hypre_MappedMatrix *hypre_MappedMatrixCreate ( void ); HYPRE_Int hypre_MappedMatrixDestroy ( hypre_MappedMatrix *matrix ); HYPRE_Int hypre_MappedMatrixLimitedDestroy ( hypre_MappedMatrix *matrix ); HYPRE_Int hypre_MappedMatrixInitialize ( hypre_MappedMatrix *matrix ); HYPRE_Int hypre_MappedMatrixAssemble ( hypre_MappedMatrix *matrix ); void hypre_MappedMatrixPrint ( hypre_MappedMatrix *matrix ); HYPRE_Int hypre_MappedMatrixGetColIndex ( hypre_MappedMatrix *matrix, HYPRE_Int j ); void *hypre_MappedMatrixGetMatrix ( hypre_MappedMatrix *matrix ); HYPRE_Int hypre_MappedMatrixSetMatrix ( hypre_MappedMatrix *matrix, void *matrix_data ); HYPRE_Int hypre_MappedMatrixSetColMap ( hypre_MappedMatrix *matrix, HYPRE_Int (*ColMap )(HYPRE_Int, void *)); HYPRE_Int hypre_MappedMatrixSetMapData ( hypre_MappedMatrix *matrix, void *map_data ); /* multiblock_matrix.c */ hypre_MultiblockMatrix *hypre_MultiblockMatrixCreate ( void ); HYPRE_Int hypre_MultiblockMatrixDestroy ( hypre_MultiblockMatrix *matrix ); HYPRE_Int hypre_MultiblockMatrixLimitedDestroy ( hypre_MultiblockMatrix *matrix ); HYPRE_Int hypre_MultiblockMatrixInitialize ( hypre_MultiblockMatrix *matrix ); HYPRE_Int hypre_MultiblockMatrixAssemble ( hypre_MultiblockMatrix *matrix ); void hypre_MultiblockMatrixPrint ( hypre_MultiblockMatrix *matrix ); HYPRE_Int hypre_MultiblockMatrixSetNumSubmatrices ( hypre_MultiblockMatrix *matrix, HYPRE_Int n ); HYPRE_Int hypre_MultiblockMatrixSetSubmatrixType ( hypre_MultiblockMatrix *matrix, HYPRE_Int j, HYPRE_Int type ); HYPRE_Int hypre_MultiblockMatrixSetSubmatrix ( hypre_MultiblockMatrix *matrix, HYPRE_Int j, void *submatrix ); /* vector.c */ hypre_Vector *hypre_SeqVectorCreate ( HYPRE_Int size ); hypre_Vector *hypre_SeqMultiVectorCreate ( HYPRE_Int size, HYPRE_Int num_vectors ); HYPRE_Int hypre_SeqVectorDestroy ( hypre_Vector *vector ); HYPRE_Int hypre_SeqVectorInitializeShell( hypre_Vector *vector ); HYPRE_Int hypre_SeqVectorSetData( hypre_Vector *vector, HYPRE_Complex *data ); HYPRE_Int hypre_SeqVectorInitialize_v2( hypre_Vector *vector, HYPRE_MemoryLocation memory_location ); HYPRE_Int hypre_SeqVectorInitialize ( hypre_Vector *vector ); HYPRE_Int hypre_SeqVectorSetDataOwner ( hypre_Vector *vector, HYPRE_Int owns_data ); HYPRE_Int hypre_SeqVectorSetSize ( hypre_Vector *vector, HYPRE_Int size ); HYPRE_Int hypre_SeqVectorResize ( hypre_Vector *vector, HYPRE_Int num_vectors_in ); hypre_Vector *hypre_SeqVectorRead ( char *file_name ); HYPRE_Int hypre_SeqVectorPrint ( hypre_Vector *vector, char *file_name ); HYPRE_Int hypre_SeqVectorSetConstantValues ( hypre_Vector *v, HYPRE_Complex value ); HYPRE_Int hypre_SeqVectorSetConstantValuesHost ( hypre_Vector *v, HYPRE_Complex value ); HYPRE_Int hypre_SeqVectorSetRandomValues ( hypre_Vector *v, HYPRE_Int seed ); HYPRE_Int hypre_SeqVectorCopy ( hypre_Vector *x, hypre_Vector *y ); HYPRE_Int hypre_SeqVectorStridedCopy( hypre_Vector *x, HYPRE_Int istride, HYPRE_Int ostride, HYPRE_Int size, HYPRE_Complex *data); hypre_Vector *hypre_SeqVectorCloneDeep ( hypre_Vector *x ); hypre_Vector *hypre_SeqVectorCloneDeep_v2( hypre_Vector *x, HYPRE_MemoryLocation memory_location ); hypre_Vector *hypre_SeqVectorCloneShallow ( hypre_Vector *x ); HYPRE_Int hypre_SeqVectorMigrate( hypre_Vector *x, HYPRE_MemoryLocation memory_location ); HYPRE_Int hypre_SeqVectorScale( HYPRE_Complex alpha, hypre_Vector *y ); HYPRE_Int hypre_SeqVectorScaleHost( HYPRE_Complex alpha, hypre_Vector *y ); HYPRE_Int hypre_SeqVectorAxpy ( HYPRE_Complex alpha, hypre_Vector *x, hypre_Vector *y ); HYPRE_Int hypre_SeqVectorAxpyHost ( HYPRE_Complex alpha, hypre_Vector *x, hypre_Vector *y ); HYPRE_Int hypre_SeqVectorAxpyz ( HYPRE_Complex alpha, hypre_Vector *x, HYPRE_Complex beta, hypre_Vector *y, hypre_Vector *z ); HYPRE_Real hypre_SeqVectorInnerProd ( hypre_Vector *x, hypre_Vector *y ); HYPRE_Real hypre_SeqVectorInnerProdHost ( hypre_Vector *x, hypre_Vector *y ); HYPRE_Int hypre_SeqVectorMassInnerProd(hypre_Vector *x, hypre_Vector **y, HYPRE_Int k, HYPRE_Int unroll, HYPRE_Real *result); HYPRE_Int hypre_SeqVectorMassInnerProd4(hypre_Vector *x, hypre_Vector **y, HYPRE_Int k, HYPRE_Real *result); HYPRE_Int hypre_SeqVectorMassInnerProd8(hypre_Vector *x, hypre_Vector **y, HYPRE_Int k, HYPRE_Real *result); HYPRE_Int hypre_SeqVectorMassDotpTwo(hypre_Vector *x, hypre_Vector *y, hypre_Vector **z, HYPRE_Int k, HYPRE_Int unroll, HYPRE_Real *result_x, HYPRE_Real *result_y); HYPRE_Int hypre_SeqVectorMassDotpTwo4(hypre_Vector *x, hypre_Vector *y, hypre_Vector **z, HYPRE_Int k, HYPRE_Real *result_x, HYPRE_Real *result_y); HYPRE_Int hypre_SeqVectorMassDotpTwo8(hypre_Vector *x, hypre_Vector *y, hypre_Vector **z, HYPRE_Int k, HYPRE_Real *result_x, HYPRE_Real *result_y); HYPRE_Int hypre_SeqVectorMassAxpy(HYPRE_Complex *alpha, hypre_Vector **x, hypre_Vector *y, HYPRE_Int k, HYPRE_Int unroll); HYPRE_Int hypre_SeqVectorMassAxpy4(HYPRE_Complex *alpha, hypre_Vector **x, hypre_Vector *y, HYPRE_Int k); HYPRE_Int hypre_SeqVectorMassAxpy8(HYPRE_Complex *alpha, hypre_Vector **x, hypre_Vector *y, HYPRE_Int k); HYPRE_Complex hypre_SeqVectorSumElts ( hypre_Vector *vector ); HYPRE_Complex hypre_SeqVectorSumEltsHost ( hypre_Vector *vector ); //HYPRE_Int hypre_SeqVectorMax( HYPRE_Complex alpha, hypre_Vector *x, HYPRE_Complex beta, hypre_Vector *y ); HYPRE_Int hypreDevice_CSRSpAdd(HYPRE_Int ma, HYPRE_Int mb, HYPRE_Int nnzA, HYPRE_Int nnzB, HYPRE_Int *d_ia, HYPRE_Int *d_ja, HYPRE_Complex alpha, HYPRE_Complex *d_aa, HYPRE_Int *d_ja_map, HYPRE_Int *d_ib, HYPRE_Int *d_jb, HYPRE_Complex beta, HYPRE_Complex *d_ab, HYPRE_Int *d_jb_map, HYPRE_Int *d_num_b, HYPRE_Int *nnzC_out, HYPRE_Int **d_ic_out, HYPRE_Int **d_jc_out, HYPRE_Complex **d_ac_out); HYPRE_Int hypreDevice_CSRSpTrans(HYPRE_Int m, HYPRE_Int n, HYPRE_Int nnzA, HYPRE_Int *d_ia, HYPRE_Int *d_ja, HYPRE_Complex *d_aa, HYPRE_Int **d_ic_out, HYPRE_Int **d_jc_out, HYPRE_Complex **d_ac_out, HYPRE_Int want_data); HYPRE_Int hypreDevice_CSRSpTransCusparse(HYPRE_Int m, HYPRE_Int n, HYPRE_Int nnzA, HYPRE_Int *d_ia, HYPRE_Int *d_ja, HYPRE_Complex *d_aa, HYPRE_Int **d_ic_out, HYPRE_Int **d_jc_out, HYPRE_Complex **d_ac_out, HYPRE_Int want_data); HYPRE_Int hypreDevice_CSRSpTransRocsparse(HYPRE_Int m, HYPRE_Int n, HYPRE_Int nnzA, HYPRE_Int *d_ia, HYPRE_Int *d_ja, HYPRE_Complex *d_aa, HYPRE_Int **d_ic_out, HYPRE_Int **d_jc_out, HYPRE_Complex **d_ac_out, HYPRE_Int want_data); HYPRE_Int hypreDevice_CSRSpTransOnemklsparse(HYPRE_Int m, HYPRE_Int n, HYPRE_Int nnzA, HYPRE_Int *d_ia, HYPRE_Int *d_ja, HYPRE_Complex *d_aa, HYPRE_Int **d_ic_out, HYPRE_Int **d_jc_out, HYPRE_Complex **d_ac_out, HYPRE_Int want_data); HYPRE_Int hypreDevice_CSRSpGemm(hypre_CSRMatrix *A, hypre_CSRMatrix *B, hypre_CSRMatrix **C_ptr); HYPRE_Int hypreDevice_CSRSpGemmCusparseGenericAPI(HYPRE_Int m, HYPRE_Int k, HYPRE_Int n, HYPRE_Int nnzA, HYPRE_Int *d_ia, HYPRE_Int *d_ja, HYPRE_Complex *d_a, HYPRE_Int nnzB, HYPRE_Int *d_ib, HYPRE_Int *d_jb, HYPRE_Complex *d_b, HYPRE_Int *nnzC_out, HYPRE_Int **d_ic_out, HYPRE_Int **d_jc_out, HYPRE_Complex **d_c_out); HYPRE_Int hypre_SeqVectorElmdivpy( hypre_Vector *x, hypre_Vector *b, hypre_Vector *y ); HYPRE_Int hypre_SeqVectorElmdivpyMarked( hypre_Vector *x, hypre_Vector *b, hypre_Vector *y, HYPRE_Int *marker, HYPRE_Int marker_val ); HYPRE_Int hypre_SeqVectorElmdivpyHost( hypre_Vector *x, hypre_Vector *b, hypre_Vector *y, HYPRE_Int *marker, HYPRE_Int marker_val ); HYPRE_Int hypre_CSRMatrixSpMVDevice( HYPRE_Int trans, HYPRE_Complex alpha, hypre_CSRMatrix *A, hypre_Vector *x, HYPRE_Complex beta, hypre_Vector *y, HYPRE_Int fill ); HYPRE_Int hypre_CSRMatrixIntSpMVDevice( HYPRE_Int num_rows, HYPRE_Int num_nonzeros, HYPRE_Int alpha, HYPRE_Int *d_ia, HYPRE_Int *d_ja, HYPRE_Int *d_a, HYPRE_Int *d_x, HYPRE_Int beta, HYPRE_Int *d_y ); #if defined(HYPRE_USING_CUSPARSE) ||\ defined(HYPRE_USING_ROCSPARSE) ||\ defined(HYPRE_USING_ONEMKLSPARSE) hypre_CsrsvData* hypre_CsrsvDataCreate(); HYPRE_Int hypre_CsrsvDataDestroy(hypre_CsrsvData *data); hypre_GpuMatData* hypre_GpuMatDataCreate(); HYPRE_Int hypre_GPUMatDataSetCSRData(hypre_CSRMatrix *matrix); HYPRE_Int hypre_GpuMatDataDestroy(hypre_GpuMatData *data); hypre_GpuMatData* hypre_CSRMatrixGetGPUMatData(hypre_CSRMatrix *matrix); #define hypre_CSRMatrixGPUMatDescr(matrix) ( hypre_GpuMatDataMatDescr(hypre_CSRMatrixGetGPUMatData(matrix)) ) #define hypre_CSRMatrixGPUMatInfo(matrix) ( hypre_GpuMatDataMatInfo (hypre_CSRMatrixGetGPUMatData(matrix)) ) #define hypre_CSRMatrixGPUMatHandle(matrix) ( hypre_GpuMatDataMatHandle (hypre_CSRMatrixGetGPUMatData(matrix)) ) #define hypre_CSRMatrixGPUMatSpMVBuffer(matrix) ( hypre_GpuMatDataSpMVBuffer (hypre_CSRMatrixGetGPUMatData(matrix)) ) #endif HYPRE_Int hypre_CSRMatrixSpMVAnalysisDevice(hypre_CSRMatrix *matrix); /* vector_device.c */ HYPRE_Int hypre_SeqVectorSetConstantValuesDevice ( hypre_Vector *v, HYPRE_Complex value ); HYPRE_Int hypre_SeqVectorScaleDevice( HYPRE_Complex alpha, hypre_Vector *y ); HYPRE_Int hypre_SeqVectorAxpyDevice ( HYPRE_Complex alpha, hypre_Vector *x, hypre_Vector *y ); HYPRE_Int hypre_SeqVectorAxpyzDevice ( HYPRE_Complex alpha, hypre_Vector *x, HYPRE_Complex beta, hypre_Vector *y, hypre_Vector *z ); HYPRE_Int hypre_SeqVectorElmdivpyDevice( hypre_Vector *x, hypre_Vector *b, hypre_Vector *y, HYPRE_Int *marker, HYPRE_Int marker_val ); HYPRE_Real hypre_SeqVectorInnerProdDevice ( hypre_Vector *x, hypre_Vector *y ); HYPRE_Complex hypre_SeqVectorSumEltsDevice ( hypre_Vector *vector ); HYPRE_Int hypre_SeqVectorStridedCopyDevice( hypre_Vector *vector, HYPRE_Int istride, HYPRE_Int ostride, HYPRE_Int size, HYPRE_Complex *data ); HYPRE_Int hypre_SeqVectorPrefetch(hypre_Vector *x, HYPRE_MemoryLocation memory_location); hypre-2.33.0/src/seq_mv/seq_mv.h000066400000000000000000001177451477326011500164770ustar00rootroot00000000000000 /*** DO NOT EDIT THIS FILE DIRECTLY (use 'headers' to generate) ***/ #ifndef hypre_MV_HEADER #define hypre_MV_HEADER #include #include #include #include #include "HYPRE_seq_mv.h" #include "_hypre_utilities.h" #ifdef __cplusplus extern "C" { #endif /****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * Header info for CSR Matrix data structures * * Note: this matrix currently uses 0-based indexing. * *****************************************************************************/ #ifndef hypre_CSR_MATRIX_HEADER #define hypre_CSR_MATRIX_HEADER #if defined(HYPRE_USING_CUSPARSE) ||\ defined(HYPRE_USING_ROCSPARSE) ||\ defined(HYPRE_USING_ONEMKLSPARSE) struct hypre_CsrsvData; typedef struct hypre_CsrsvData hypre_CsrsvData; struct hypre_GpuMatData; typedef struct hypre_GpuMatData hypre_GpuMatData; #endif /*-------------------------------------------------------------------------- * CSR Matrix *--------------------------------------------------------------------------*/ typedef struct { HYPRE_Int *i; HYPRE_Int *j; HYPRE_BigInt *big_j; HYPRE_Int num_rows; HYPRE_Int num_cols; HYPRE_Int num_nonzeros; hypre_int *i_short; hypre_int *j_short; HYPRE_Int owns_data; /* Does the CSRMatrix create/destroy `data', `i', `j'? */ HYPRE_Int pattern_only; /* 1: data array is ignored, and assumed to be all 1's */ HYPRE_Complex *data; HYPRE_Int *rownnz; /* for compressing rows in matrix multiplication */ HYPRE_Int num_rownnz; HYPRE_MemoryLocation memory_location; /* memory location of arrays i, j, data */ #if defined(HYPRE_USING_CUSPARSE) ||\ defined(HYPRE_USING_ROCSPARSE) ||\ defined(HYPRE_USING_ONEMKLSPARSE) HYPRE_Int *sorted_j; /* some cusparse routines require sorted CSR */ HYPRE_Complex *sorted_data; hypre_CsrsvData *csrsv_data; hypre_GpuMatData *mat_data; #endif } hypre_CSRMatrix; /*-------------------------------------------------------------------------- * Accessor functions for the CSR Matrix structure *--------------------------------------------------------------------------*/ #define hypre_CSRMatrixData(matrix) ((matrix) -> data) #define hypre_CSRMatrixI(matrix) ((matrix) -> i) #define hypre_CSRMatrixJ(matrix) ((matrix) -> j) #define hypre_CSRMatrixBigJ(matrix) ((matrix) -> big_j) #define hypre_CSRMatrixNumRows(matrix) ((matrix) -> num_rows) #define hypre_CSRMatrixNumCols(matrix) ((matrix) -> num_cols) #define hypre_CSRMatrixNumNonzeros(matrix) ((matrix) -> num_nonzeros) #define hypre_CSRMatrixRownnz(matrix) ((matrix) -> rownnz) #define hypre_CSRMatrixNumRownnz(matrix) ((matrix) -> num_rownnz) #define hypre_CSRMatrixOwnsData(matrix) ((matrix) -> owns_data) #define hypre_CSRMatrixPatternOnly(matrix) ((matrix) -> pattern_only) #define hypre_CSRMatrixMemoryLocation(matrix) ((matrix) -> memory_location) #if defined(HYPRE_USING_CUSPARSE) ||\ defined(HYPRE_USING_ROCSPARSE) ||\ defined(HYPRE_USING_ONEMKLSPARSE) #define hypre_CSRMatrixSortedJ(matrix) ((matrix) -> sorted_j) #define hypre_CSRMatrixSortedData(matrix) ((matrix) -> sorted_data) #define hypre_CSRMatrixCsrsvData(matrix) ((matrix) -> csrsv_data) #define hypre_CSRMatrixGPUMatData(matrix) ((matrix) -> mat_data) #endif HYPRE_Int hypre_CSRMatrixGetLoadBalancedPartitionBegin( hypre_CSRMatrix *A ); HYPRE_Int hypre_CSRMatrixGetLoadBalancedPartitionEnd( hypre_CSRMatrix *A ); /*-------------------------------------------------------------------------- * CSR Boolean Matrix *--------------------------------------------------------------------------*/ typedef struct { HYPRE_Int *i; HYPRE_Int *j; HYPRE_BigInt *big_j; HYPRE_Int num_rows; HYPRE_Int num_cols; HYPRE_Int num_nonzeros; HYPRE_Int owns_data; } hypre_CSRBooleanMatrix; /*-------------------------------------------------------------------------- * Accessor functions for the CSR Boolean Matrix structure *--------------------------------------------------------------------------*/ #define hypre_CSRBooleanMatrix_Get_I(matrix) ((matrix)->i) #define hypre_CSRBooleanMatrix_Get_J(matrix) ((matrix)->j) #define hypre_CSRBooleanMatrix_Get_BigJ(matrix) ((matrix)->big_j) #define hypre_CSRBooleanMatrix_Get_NRows(matrix) ((matrix)->num_rows) #define hypre_CSRBooleanMatrix_Get_NCols(matrix) ((matrix)->num_cols) #define hypre_CSRBooleanMatrix_Get_NNZ(matrix) ((matrix)->num_nonzeros) #define hypre_CSRBooleanMatrix_Get_OwnsData(matrix) ((matrix)->owns_data) #endif /****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * Header info for Mapped Matrix data structures * *****************************************************************************/ #ifndef hypre_MAPPED_MATRIX_HEADER #define hypre_MAPPED_MATRIX_HEADER /*-------------------------------------------------------------------------- * Mapped Matrix *--------------------------------------------------------------------------*/ typedef struct { void *matrix; HYPRE_Int (*ColMap)(HYPRE_Int, void *); void *MapData; } hypre_MappedMatrix; /*-------------------------------------------------------------------------- * Accessor functions for the Mapped Matrix structure *--------------------------------------------------------------------------*/ #define hypre_MappedMatrixMatrix(matrix) ((matrix) -> matrix) #define hypre_MappedMatrixColMap(matrix) ((matrix) -> ColMap) #define hypre_MappedMatrixMapData(matrix) ((matrix) -> MapData) #define hypre_MappedMatrixColIndex(matrix,j) \ (hypre_MappedMatrixColMap(matrix)(j,hypre_MappedMatrixMapData(matrix))) #endif /****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * Header info for Multiblock Matrix data structures * *****************************************************************************/ #ifndef hypre_MULTIBLOCK_MATRIX_HEADER #define hypre_MULTIBLOCK_MATRIX_HEADER /*-------------------------------------------------------------------------- * Multiblock Matrix *--------------------------------------------------------------------------*/ typedef struct { HYPRE_Int num_submatrices; HYPRE_Int *submatrix_types; void **submatrices; } hypre_MultiblockMatrix; /*-------------------------------------------------------------------------- * Accessor functions for the Multiblock Matrix structure *--------------------------------------------------------------------------*/ #define hypre_MultiblockMatrixSubmatrices(matrix) ((matrix) -> submatrices) #define hypre_MultiblockMatrixNumSubmatrices(matrix) ((matrix) -> num_submatrices) #define hypre_MultiblockMatrixSubmatrixTypes(matrix) ((matrix) -> submatrix_types) #define hypre_MultiblockMatrixSubmatrix(matrix,j) (hypre_MultiblockMatrixSubmatrices\ (matrix)[j]) #define hypre_MultiblockMatrixSubmatrixType(matrix,j) (hypre_MultiblockMatrixSubmatrixTypes\ (matrix)[j]) #endif /****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * Header info for Vector data structure * *****************************************************************************/ #ifndef hypre_VECTOR_HEADER #define hypre_VECTOR_HEADER /*-------------------------------------------------------------------------- * hypre_Vector *--------------------------------------------------------------------------*/ typedef struct { HYPRE_Complex *data; HYPRE_Int size; /* Number of elements of a single vector component */ HYPRE_Int component; /* Index of a multivector component (used for set/get routines )*/ HYPRE_Int owns_data; /* Does the Vector create/destroy `data'? */ HYPRE_MemoryLocation memory_location; /* memory location of data array */ /* For multivectors...*/ HYPRE_Int num_vectors; /* the above "size" is size of one vector */ HYPRE_Int multivec_storage_method; /* ...if 0, store colwise v0[0], v0[1], ..., v1[0], v1[1], ... v2[0]... */ /* ...if 1, store rowwise v0[0], v1[0], ..., v0[1], v1[1], ... */ /* With colwise storage, vj[i] = data[ j*size + i] With rowwise storage, vj[i] = data[ j + num_vectors*i] */ HYPRE_Int vecstride, idxstride; /* ... so vj[i] = data[ j*vecstride + i*idxstride ] regardless of row_storage.*/ } hypre_Vector; /*-------------------------------------------------------------------------- * Accessor functions for the Vector structure *--------------------------------------------------------------------------*/ #define hypre_VectorData(vector) ((vector) -> data) #define hypre_VectorSize(vector) ((vector) -> size) #define hypre_VectorComponent(vector) ((vector) -> component) #define hypre_VectorOwnsData(vector) ((vector) -> owns_data) #define hypre_VectorMemoryLocation(vector) ((vector) -> memory_location) #define hypre_VectorNumVectors(vector) ((vector) -> num_vectors) #define hypre_VectorMultiVecStorageMethod(vector) ((vector) -> multivec_storage_method) #define hypre_VectorVectorStride(vector) ((vector) -> vecstride) #define hypre_VectorIndexStride(vector) ((vector) -> idxstride) #define hypre_VectorEntryI(vector, i) ((vector) -> data[i]) #define hypre_VectorEntryIJ(vector, i, j) \ ((vector) -> data[((vector) -> vecstride) * j + ((vector) -> idxstride) * i]) #endif /****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /* csr_filter.c */ HYPRE_Int hypre_CSRMatrixTruncateDiag(hypre_CSRMatrix *A); /* csr_matop.c */ HYPRE_Int hypre_CSRMatrixAddFirstPass ( HYPRE_Int firstrow, HYPRE_Int lastrow, HYPRE_Int *marker, HYPRE_Int *twspace, HYPRE_Int *map_A2C, HYPRE_Int *map_B2C, hypre_CSRMatrix *A, hypre_CSRMatrix *B, HYPRE_Int nnzrows_C, HYPRE_Int nrows_C, HYPRE_Int ncols_C, HYPRE_Int *rownnz_C, HYPRE_MemoryLocation memory_location_C, HYPRE_Int *C_i, hypre_CSRMatrix **C_ptr ); HYPRE_Int hypre_CSRMatrixAddSecondPass ( HYPRE_Int firstrow, HYPRE_Int lastrow, HYPRE_Int *marker, HYPRE_Int *map_A2C, HYPRE_Int *map_B2C, HYPRE_Int *rownnz_C, HYPRE_Complex alpha, HYPRE_Complex beta, hypre_CSRMatrix *A, hypre_CSRMatrix *B, hypre_CSRMatrix *C); hypre_CSRMatrix *hypre_CSRMatrixAddHost ( HYPRE_Complex alpha, hypre_CSRMatrix *A, HYPRE_Complex beta, hypre_CSRMatrix *B ); hypre_CSRMatrix *hypre_CSRMatrixAdd ( HYPRE_Complex alpha, hypre_CSRMatrix *A, HYPRE_Complex beta, hypre_CSRMatrix *B ); hypre_CSRMatrix *hypre_CSRMatrixBigAdd ( hypre_CSRMatrix *A, hypre_CSRMatrix *B ); hypre_CSRMatrix *hypre_CSRMatrixMultiplyHost ( hypre_CSRMatrix *A, hypre_CSRMatrix *B ); hypre_CSRMatrix *hypre_CSRMatrixMultiply ( hypre_CSRMatrix *A, hypre_CSRMatrix *B ); hypre_CSRMatrix *hypre_CSRMatrixDeleteZeros ( hypre_CSRMatrix *A, HYPRE_Real tol ); HYPRE_Int hypre_CSRMatrixTransposeHost ( hypre_CSRMatrix *A, hypre_CSRMatrix **AT, HYPRE_Int data ); HYPRE_Int hypre_CSRMatrixTranspose ( hypre_CSRMatrix *A, hypre_CSRMatrix **AT, HYPRE_Int data ); HYPRE_Int hypre_CSRMatrixReorder ( hypre_CSRMatrix *A ); HYPRE_Complex hypre_CSRMatrixSumElts ( hypre_CSRMatrix *A ); HYPRE_Real hypre_CSRMatrixFnorm( hypre_CSRMatrix *A ); HYPRE_Int hypre_CSRMatrixSplit(hypre_CSRMatrix *Bs_ext, HYPRE_BigInt first_col_diag_B, HYPRE_BigInt last_col_diag_B, HYPRE_Int num_cols_offd_B, HYPRE_BigInt *col_map_offd_B, HYPRE_Int *num_cols_offd_C_ptr, HYPRE_BigInt **col_map_offd_C_ptr, hypre_CSRMatrix **Bext_diag_ptr, hypre_CSRMatrix **Bext_offd_ptr); hypre_CSRMatrix * hypre_CSRMatrixAddPartial( hypre_CSRMatrix *A, hypre_CSRMatrix *B, HYPRE_Int *row_nums); void hypre_CSRMatrixComputeRowSumHost( hypre_CSRMatrix *A, HYPRE_Int *CF_i, HYPRE_Int *CF_j, HYPRE_Complex *row_sum, HYPRE_Int type, HYPRE_Complex scal, const char *set_or_add); void hypre_CSRMatrixComputeRowSum( hypre_CSRMatrix *A, HYPRE_Int *CF_i, HYPRE_Int *CF_j, HYPRE_Complex *row_sum, HYPRE_Int type, HYPRE_Complex scal, const char *set_or_add); HYPRE_Int hypre_CSRMatrixExtractDiagonal( hypre_CSRMatrix *A, HYPRE_Complex *d, HYPRE_Int type); HYPRE_Int hypre_CSRMatrixExtractDiagonalHost( hypre_CSRMatrix *A, HYPRE_Complex *d, HYPRE_Int type); HYPRE_Int hypre_CSRMatrixScale(hypre_CSRMatrix *A, HYPRE_Complex scalar); HYPRE_Int hypre_CSRMatrixSetConstantValues( hypre_CSRMatrix *A, HYPRE_Complex value); HYPRE_Int hypre_CSRMatrixDiagScale( hypre_CSRMatrix *A, hypre_Vector *ld, hypre_Vector *rd); /* csr_matop_device.c */ hypre_CSRMatrix *hypre_CSRMatrixAddDevice ( HYPRE_Complex alpha, hypre_CSRMatrix *A, HYPRE_Complex beta, hypre_CSRMatrix *B ); hypre_CSRMatrix *hypre_CSRMatrixMultiplyDevice ( hypre_CSRMatrix *A, hypre_CSRMatrix *B ); hypre_CSRMatrix *hypre_CSRMatrixTripleMultiplyDevice ( hypre_CSRMatrix *A, hypre_CSRMatrix *B, hypre_CSRMatrix *C ); HYPRE_Int hypre_CSRMatrixMergeColMapOffd( HYPRE_Int num_cols_offd_B, HYPRE_BigInt *col_map_offd_B, HYPRE_Int B_ext_offd_nnz, HYPRE_BigInt *B_ext_offd_bigj, HYPRE_Int *num_cols_offd_C_ptr, HYPRE_BigInt **col_map_offd_C_ptr, HYPRE_Int **map_B_to_C_ptr ); HYPRE_Int hypre_CSRMatrixSplitDevice_core( HYPRE_Int job, HYPRE_Int num_rows, HYPRE_Int B_ext_nnz, HYPRE_Int *B_ext_ii, HYPRE_BigInt *B_ext_bigj, HYPRE_Complex *B_ext_data, char *B_ext_xata, HYPRE_BigInt first_col_diag_B, HYPRE_BigInt last_col_diag_B, HYPRE_Int num_cols_offd_B, HYPRE_BigInt *col_map_offd_B, HYPRE_Int **map_B_to_C_ptr, HYPRE_Int *num_cols_offd_C_ptr, HYPRE_BigInt **col_map_offd_C_ptr, HYPRE_Int *B_ext_diag_nnz_ptr, HYPRE_Int *B_ext_diag_ii, HYPRE_Int *B_ext_diag_j, HYPRE_Complex *B_ext_diag_data, char *B_ext_diag_xata, HYPRE_Int *B_ext_offd_nnz_ptr, HYPRE_Int *B_ext_offd_ii, HYPRE_Int *B_ext_offd_j, HYPRE_Complex *B_ext_offd_data, char *B_ext_offd_xata ); HYPRE_Int hypre_CSRMatrixSplitDevice(hypre_CSRMatrix *B_ext, HYPRE_BigInt first_col_diag_B, HYPRE_BigInt last_col_diag_B, HYPRE_Int num_cols_offd_B, HYPRE_BigInt *col_map_offd_B, HYPRE_Int **map_B_to_C_ptr, HYPRE_Int *num_cols_offd_C_ptr, HYPRE_BigInt **col_map_offd_C_ptr, hypre_CSRMatrix **B_ext_diag_ptr, hypre_CSRMatrix **B_ext_offd_ptr); HYPRE_Int hypre_CSRMatrixTransposeDevice ( hypre_CSRMatrix *A, hypre_CSRMatrix **AT, HYPRE_Int data ); hypre_CSRMatrix* hypre_CSRMatrixAddPartialDevice( hypre_CSRMatrix *A, hypre_CSRMatrix *B, HYPRE_Int *row_nums); HYPRE_Int hypre_CSRMatrixColNNzRealDevice( hypre_CSRMatrix *A, HYPRE_Real *colnnz); HYPRE_Int hypre_CSRMatrixMoveDiagFirstDevice( hypre_CSRMatrix *A ); HYPRE_Int hypre_CSRMatrixCheckDiagFirstDevice( hypre_CSRMatrix *A ); HYPRE_Int hypre_CSRMatrixCheckForMissingDiagonal( hypre_CSRMatrix *A ); HYPRE_Int hypre_CSRMatrixReplaceDiagDevice( hypre_CSRMatrix *A, HYPRE_Complex *new_diag, HYPRE_Complex v, HYPRE_Real tol ); HYPRE_Int hypre_CSRMatrixComputeRowSumDevice( hypre_CSRMatrix *A, HYPRE_Int *CF_i, HYPRE_Int *CF_j, HYPRE_Complex *row_sum, HYPRE_Int type, HYPRE_Complex scal, const char *set_or_add ); HYPRE_Int hypre_CSRMatrixExtractDiagonalDevice( hypre_CSRMatrix *A, HYPRE_Complex *d, HYPRE_Int type ); hypre_CSRMatrix* hypre_CSRMatrixStack2Device(hypre_CSRMatrix *A, hypre_CSRMatrix *B); hypre_CSRMatrix* hypre_CSRMatrixIdentityDevice(HYPRE_Int n, HYPRE_Complex alp); hypre_CSRMatrix* hypre_CSRMatrixDiagMatrixFromVectorDevice(HYPRE_Int n, HYPRE_Complex *v); hypre_CSRMatrix* hypre_CSRMatrixDiagMatrixFromMatrixDevice(hypre_CSRMatrix *A, HYPRE_Int type); HYPRE_Int hypre_CSRMatrixRemoveDiagonalDevice(hypre_CSRMatrix *A); HYPRE_Int hypre_CSRMatrixDropSmallEntriesDevice( hypre_CSRMatrix *A, HYPRE_Real tol, HYPRE_Real *elmt_tols); HYPRE_Int hypre_CSRMatrixPermuteDevice( hypre_CSRMatrix *A, HYPRE_Int *perm, HYPRE_Int *rqperm, hypre_CSRMatrix *B ); HYPRE_Int hypre_CSRMatrixSortRow(hypre_CSRMatrix *A); HYPRE_Int hypre_CSRMatrixSortRowOutOfPlace(hypre_CSRMatrix *A); HYPRE_Int hypre_CSRMatrixTriLowerUpperSolveDevice_core(char uplo, HYPRE_Int unit_diag, hypre_CSRMatrix *A, HYPRE_Real *l1_norms, hypre_Vector *f, HYPRE_Int offset_f, hypre_Vector *u, HYPRE_Int offset_u); HYPRE_Int hypre_CSRMatrixTriLowerUpperSolveDevice(char uplo, HYPRE_Int unit_diag, hypre_CSRMatrix *A, HYPRE_Real *l1_norms, hypre_Vector *f, hypre_Vector *u ); HYPRE_Int hypre_CSRMatrixTriLowerUpperSolveRocsparse(char uplo, HYPRE_Int unit_diag, hypre_CSRMatrix *A, HYPRE_Real *l1_norms, HYPRE_Complex *f, HYPRE_Complex *u ); HYPRE_Int hypre_CSRMatrixTriLowerUpperSolveCusparse(char uplo, HYPRE_Int unit_diag, hypre_CSRMatrix *A, HYPRE_Real *l1_norms, HYPRE_Complex *f, HYPRE_Complex *u ); HYPRE_Int hypre_CSRMatrixTriLowerUpperSolveOnemklsparse(char uplo, HYPRE_Int unit_diag, hypre_CSRMatrix *A, HYPRE_Real *l1_norms, HYPRE_Complex *f, HYPRE_Complex *u ); HYPRE_Int hypre_CSRMatrixIntersectPattern(hypre_CSRMatrix *A, hypre_CSRMatrix *B, HYPRE_Int *markA, HYPRE_Int diag_option); HYPRE_Int hypre_CSRMatrixDiagScaleDevice( hypre_CSRMatrix *A, hypre_Vector *ld, hypre_Vector *rd); HYPRE_Int hypre_CSRMatrixCompressColumnsDevice(hypre_CSRMatrix *A, HYPRE_BigInt *col_map, HYPRE_Int **col_idx_new_ptr, HYPRE_BigInt **col_map_new_ptr); HYPRE_Int hypre_CSRMatrixILU0(hypre_CSRMatrix *A); /* csr_matrix.c */ hypre_CSRMatrix *hypre_CSRMatrixCreate ( HYPRE_Int num_rows, HYPRE_Int num_cols, HYPRE_Int num_nonzeros ); HYPRE_Int hypre_CSRMatrixDestroy ( hypre_CSRMatrix *matrix ); HYPRE_Int hypre_CSRMatrixInitialize_v2( hypre_CSRMatrix *matrix, HYPRE_Int bigInit, HYPRE_MemoryLocation memory_location ); HYPRE_Int hypre_CSRMatrixInitialize ( hypre_CSRMatrix *matrix ); HYPRE_Int hypre_CSRMatrixBigInitialize ( hypre_CSRMatrix *matrix ); HYPRE_Int hypre_CSRMatrixBigJtoJ ( hypre_CSRMatrix *matrix ); HYPRE_Int hypre_CSRMatrixJtoBigJ ( hypre_CSRMatrix *matrix ); HYPRE_Int hypre_CSRMatrixSetDataOwner ( hypre_CSRMatrix *matrix, HYPRE_Int owns_data ); HYPRE_Int hypre_CSRMatrixSetPatternOnly( hypre_CSRMatrix *matrix, HYPRE_Int pattern_only ); HYPRE_Int hypre_CSRMatrixSetRownnz ( hypre_CSRMatrix *matrix ); hypre_CSRMatrix *hypre_CSRMatrixRead ( char *file_name ); HYPRE_Int hypre_CSRMatrixPrint ( hypre_CSRMatrix *matrix, const char *file_name ); HYPRE_Int hypre_CSRMatrixPrintIJ( hypre_CSRMatrix *matrix, HYPRE_Int base_i, HYPRE_Int base_j, char *filename ); HYPRE_Int hypre_CSRMatrixPrintHB ( hypre_CSRMatrix *matrix_input, char *file_name ); HYPRE_Int hypre_CSRMatrixPrintMM( hypre_CSRMatrix *matrix, HYPRE_Int basei, HYPRE_Int basej, HYPRE_Int trans, const char *file_name ); HYPRE_Int hypre_CSRMatrixCopy ( hypre_CSRMatrix *A, hypre_CSRMatrix *B, HYPRE_Int copy_data ); HYPRE_Int hypre_CSRMatrixMigrate( hypre_CSRMatrix *A, HYPRE_MemoryLocation memory_location ); hypre_CSRMatrix *hypre_CSRMatrixClone ( hypre_CSRMatrix *A, HYPRE_Int copy_data ); hypre_CSRMatrix *hypre_CSRMatrixClone_v2( hypre_CSRMatrix *A, HYPRE_Int copy_data, HYPRE_MemoryLocation memory_location ); HYPRE_Int hypre_CSRMatrixPermute( hypre_CSRMatrix *A, HYPRE_Int *perm, HYPRE_Int *rqperm, hypre_CSRMatrix **B_ptr ); hypre_CSRMatrix *hypre_CSRMatrixUnion( hypre_CSRMatrix *A, hypre_CSRMatrix *B, HYPRE_BigInt *col_map_offd_A, HYPRE_BigInt *col_map_offd_B, HYPRE_BigInt **col_map_offd_C ); HYPRE_Int hypre_CSRMatrixPrefetch( hypre_CSRMatrix *A, HYPRE_MemoryLocation memory_location); HYPRE_Int hypre_CSRMatrixCheckSetNumNonzeros( hypre_CSRMatrix *matrix ); HYPRE_Int hypre_CSRMatrixResize( hypre_CSRMatrix *matrix, HYPRE_Int new_num_rows, HYPRE_Int new_num_cols, HYPRE_Int new_num_nonzeros ); /* csr_matvec.c */ // y[offset:end] = alpha*A[offset:end,:]*x + beta*b[offset:end] HYPRE_Int hypre_CSRMatrixMatvecOutOfPlace ( HYPRE_Complex alpha, hypre_CSRMatrix *A, hypre_Vector *x, HYPRE_Complex beta, hypre_Vector *b, hypre_Vector *y, HYPRE_Int offset ); // y = alpha*A + beta*y HYPRE_Int hypre_CSRMatrixMatvec ( HYPRE_Complex alpha, hypre_CSRMatrix *A, hypre_Vector *x, HYPRE_Complex beta, hypre_Vector *y ); HYPRE_Int hypre_CSRMatrixMatvecT ( HYPRE_Complex alpha, hypre_CSRMatrix *A, hypre_Vector *x, HYPRE_Complex beta, hypre_Vector *y ); HYPRE_Int hypre_CSRMatrixMatvec_FF ( HYPRE_Complex alpha, hypre_CSRMatrix *A, hypre_Vector *x, HYPRE_Complex beta, hypre_Vector *y, HYPRE_Int *CF_marker_x, HYPRE_Int *CF_marker_y, HYPRE_Int fpt ); /* csr_matvec_device.c */ HYPRE_Int hypre_CSRMatrixMatvecDevice(HYPRE_Int trans, HYPRE_Complex alpha, hypre_CSRMatrix *A, hypre_Vector *x, HYPRE_Complex beta, hypre_Vector *b, hypre_Vector *y, HYPRE_Int offset ); HYPRE_Int hypre_CSRMatrixMatvecCusparseNewAPI( HYPRE_Int trans, HYPRE_Complex alpha, hypre_CSRMatrix *A, hypre_Vector *x, HYPRE_Complex beta, hypre_Vector *y, HYPRE_Int offset ); HYPRE_Int hypre_CSRMatrixMatvecCusparseOldAPI( HYPRE_Int trans, HYPRE_Complex alpha, hypre_CSRMatrix *A, hypre_Vector *x, HYPRE_Complex beta, hypre_Vector *y, HYPRE_Int offset ); HYPRE_Int hypre_CSRMatrixMatvecCusparse( HYPRE_Int trans, HYPRE_Complex alpha, hypre_CSRMatrix *A, hypre_Vector *x, HYPRE_Complex beta, hypre_Vector *y, HYPRE_Int offset ); HYPRE_Int hypre_CSRMatrixMatvecOMPOffload (HYPRE_Int trans, HYPRE_Complex alpha, hypre_CSRMatrix *A, hypre_Vector *x, HYPRE_Complex beta, hypre_Vector *y, HYPRE_Int offset ); HYPRE_Int hypre_CSRMatrixMatvecRocsparse (HYPRE_Int trans, HYPRE_Complex alpha, hypre_CSRMatrix *A, hypre_Vector *x, HYPRE_Complex beta, hypre_Vector *y, HYPRE_Int offset ); HYPRE_Int hypre_CSRMatrixMatvecOnemklsparse (HYPRE_Int trans, HYPRE_Complex alpha, hypre_CSRMatrix *A, hypre_Vector *x, HYPRE_Complex beta, hypre_Vector *y, HYPRE_Int offset ); /* genpart.c */ HYPRE_Int hypre_GeneratePartitioning ( HYPRE_BigInt length, HYPRE_Int num_procs, HYPRE_BigInt **part_ptr ); HYPRE_Int hypre_GenerateLocalPartitioning ( HYPRE_BigInt length, HYPRE_Int num_procs, HYPRE_Int myid, HYPRE_BigInt *part ); /* HYPRE_csr_matrix.c */ HYPRE_CSRMatrix HYPRE_CSRMatrixCreate ( HYPRE_Int num_rows, HYPRE_Int num_cols, HYPRE_Int *row_sizes ); HYPRE_Int HYPRE_CSRMatrixDestroy ( HYPRE_CSRMatrix matrix ); HYPRE_Int HYPRE_CSRMatrixInitialize ( HYPRE_CSRMatrix matrix ); HYPRE_CSRMatrix HYPRE_CSRMatrixRead ( char *file_name ); void HYPRE_CSRMatrixPrint ( HYPRE_CSRMatrix matrix, char *file_name ); HYPRE_Int HYPRE_CSRMatrixGetNumRows ( HYPRE_CSRMatrix matrix, HYPRE_Int *num_rows ); /* HYPRE_mapped_matrix.c */ HYPRE_MappedMatrix HYPRE_MappedMatrixCreate ( void ); HYPRE_Int HYPRE_MappedMatrixDestroy ( HYPRE_MappedMatrix matrix ); HYPRE_Int HYPRE_MappedMatrixLimitedDestroy ( HYPRE_MappedMatrix matrix ); HYPRE_Int HYPRE_MappedMatrixInitialize ( HYPRE_MappedMatrix matrix ); HYPRE_Int HYPRE_MappedMatrixAssemble ( HYPRE_MappedMatrix matrix ); void HYPRE_MappedMatrixPrint ( HYPRE_MappedMatrix matrix ); HYPRE_Int HYPRE_MappedMatrixGetColIndex ( HYPRE_MappedMatrix matrix, HYPRE_Int j ); void *HYPRE_MappedMatrixGetMatrix ( HYPRE_MappedMatrix matrix ); HYPRE_Int HYPRE_MappedMatrixSetMatrix ( HYPRE_MappedMatrix matrix, void *matrix_data ); HYPRE_Int HYPRE_MappedMatrixSetColMap ( HYPRE_MappedMatrix matrix, HYPRE_Int (*ColMap )(HYPRE_Int, void *)); HYPRE_Int HYPRE_MappedMatrixSetMapData ( HYPRE_MappedMatrix matrix, void *MapData ); /* HYPRE_multiblock_matrix.c */ HYPRE_MultiblockMatrix HYPRE_MultiblockMatrixCreate ( void ); HYPRE_Int HYPRE_MultiblockMatrixDestroy ( HYPRE_MultiblockMatrix matrix ); HYPRE_Int HYPRE_MultiblockMatrixLimitedDestroy ( HYPRE_MultiblockMatrix matrix ); HYPRE_Int HYPRE_MultiblockMatrixInitialize ( HYPRE_MultiblockMatrix matrix ); HYPRE_Int HYPRE_MultiblockMatrixAssemble ( HYPRE_MultiblockMatrix matrix ); void HYPRE_MultiblockMatrixPrint ( HYPRE_MultiblockMatrix matrix ); HYPRE_Int HYPRE_MultiblockMatrixSetNumSubmatrices ( HYPRE_MultiblockMatrix matrix, HYPRE_Int n ); HYPRE_Int HYPRE_MultiblockMatrixSetSubmatrixType ( HYPRE_MultiblockMatrix matrix, HYPRE_Int j, HYPRE_Int type ); /* HYPRE_vector.c */ HYPRE_Vector HYPRE_VectorCreate ( HYPRE_Int size ); HYPRE_Int HYPRE_VectorDestroy ( HYPRE_Vector vector ); HYPRE_Int HYPRE_VectorInitialize ( HYPRE_Vector vector ); HYPRE_Int HYPRE_VectorPrint ( HYPRE_Vector vector, char *file_name ); HYPRE_Vector HYPRE_VectorRead ( char *file_name ); /* mapped_matrix.c */ hypre_MappedMatrix *hypre_MappedMatrixCreate ( void ); HYPRE_Int hypre_MappedMatrixDestroy ( hypre_MappedMatrix *matrix ); HYPRE_Int hypre_MappedMatrixLimitedDestroy ( hypre_MappedMatrix *matrix ); HYPRE_Int hypre_MappedMatrixInitialize ( hypre_MappedMatrix *matrix ); HYPRE_Int hypre_MappedMatrixAssemble ( hypre_MappedMatrix *matrix ); void hypre_MappedMatrixPrint ( hypre_MappedMatrix *matrix ); HYPRE_Int hypre_MappedMatrixGetColIndex ( hypre_MappedMatrix *matrix, HYPRE_Int j ); void *hypre_MappedMatrixGetMatrix ( hypre_MappedMatrix *matrix ); HYPRE_Int hypre_MappedMatrixSetMatrix ( hypre_MappedMatrix *matrix, void *matrix_data ); HYPRE_Int hypre_MappedMatrixSetColMap ( hypre_MappedMatrix *matrix, HYPRE_Int (*ColMap )(HYPRE_Int, void *)); HYPRE_Int hypre_MappedMatrixSetMapData ( hypre_MappedMatrix *matrix, void *map_data ); /* multiblock_matrix.c */ hypre_MultiblockMatrix *hypre_MultiblockMatrixCreate ( void ); HYPRE_Int hypre_MultiblockMatrixDestroy ( hypre_MultiblockMatrix *matrix ); HYPRE_Int hypre_MultiblockMatrixLimitedDestroy ( hypre_MultiblockMatrix *matrix ); HYPRE_Int hypre_MultiblockMatrixInitialize ( hypre_MultiblockMatrix *matrix ); HYPRE_Int hypre_MultiblockMatrixAssemble ( hypre_MultiblockMatrix *matrix ); void hypre_MultiblockMatrixPrint ( hypre_MultiblockMatrix *matrix ); HYPRE_Int hypre_MultiblockMatrixSetNumSubmatrices ( hypre_MultiblockMatrix *matrix, HYPRE_Int n ); HYPRE_Int hypre_MultiblockMatrixSetSubmatrixType ( hypre_MultiblockMatrix *matrix, HYPRE_Int j, HYPRE_Int type ); HYPRE_Int hypre_MultiblockMatrixSetSubmatrix ( hypre_MultiblockMatrix *matrix, HYPRE_Int j, void *submatrix ); /* vector.c */ hypre_Vector *hypre_SeqVectorCreate ( HYPRE_Int size ); hypre_Vector *hypre_SeqMultiVectorCreate ( HYPRE_Int size, HYPRE_Int num_vectors ); HYPRE_Int hypre_SeqVectorDestroy ( hypre_Vector *vector ); HYPRE_Int hypre_SeqVectorInitializeShell( hypre_Vector *vector ); HYPRE_Int hypre_SeqVectorSetData( hypre_Vector *vector, HYPRE_Complex *data ); HYPRE_Int hypre_SeqVectorInitialize_v2( hypre_Vector *vector, HYPRE_MemoryLocation memory_location ); HYPRE_Int hypre_SeqVectorInitialize ( hypre_Vector *vector ); HYPRE_Int hypre_SeqVectorSetDataOwner ( hypre_Vector *vector, HYPRE_Int owns_data ); HYPRE_Int hypre_SeqVectorSetSize ( hypre_Vector *vector, HYPRE_Int size ); HYPRE_Int hypre_SeqVectorResize ( hypre_Vector *vector, HYPRE_Int num_vectors_in ); hypre_Vector *hypre_SeqVectorRead ( char *file_name ); HYPRE_Int hypre_SeqVectorPrint ( hypre_Vector *vector, char *file_name ); HYPRE_Int hypre_SeqVectorSetConstantValues ( hypre_Vector *v, HYPRE_Complex value ); HYPRE_Int hypre_SeqVectorSetConstantValuesHost ( hypre_Vector *v, HYPRE_Complex value ); HYPRE_Int hypre_SeqVectorSetRandomValues ( hypre_Vector *v, HYPRE_Int seed ); HYPRE_Int hypre_SeqVectorCopy ( hypre_Vector *x, hypre_Vector *y ); HYPRE_Int hypre_SeqVectorStridedCopy( hypre_Vector *x, HYPRE_Int istride, HYPRE_Int ostride, HYPRE_Int size, HYPRE_Complex *data); hypre_Vector *hypre_SeqVectorCloneDeep ( hypre_Vector *x ); hypre_Vector *hypre_SeqVectorCloneDeep_v2( hypre_Vector *x, HYPRE_MemoryLocation memory_location ); hypre_Vector *hypre_SeqVectorCloneShallow ( hypre_Vector *x ); HYPRE_Int hypre_SeqVectorMigrate( hypre_Vector *x, HYPRE_MemoryLocation memory_location ); HYPRE_Int hypre_SeqVectorScale( HYPRE_Complex alpha, hypre_Vector *y ); HYPRE_Int hypre_SeqVectorScaleHost( HYPRE_Complex alpha, hypre_Vector *y ); HYPRE_Int hypre_SeqVectorAxpy ( HYPRE_Complex alpha, hypre_Vector *x, hypre_Vector *y ); HYPRE_Int hypre_SeqVectorAxpyHost ( HYPRE_Complex alpha, hypre_Vector *x, hypre_Vector *y ); HYPRE_Int hypre_SeqVectorAxpyz ( HYPRE_Complex alpha, hypre_Vector *x, HYPRE_Complex beta, hypre_Vector *y, hypre_Vector *z ); HYPRE_Real hypre_SeqVectorInnerProd ( hypre_Vector *x, hypre_Vector *y ); HYPRE_Real hypre_SeqVectorInnerProdHost ( hypre_Vector *x, hypre_Vector *y ); HYPRE_Int hypre_SeqVectorMassInnerProd(hypre_Vector *x, hypre_Vector **y, HYPRE_Int k, HYPRE_Int unroll, HYPRE_Real *result); HYPRE_Int hypre_SeqVectorMassInnerProd4(hypre_Vector *x, hypre_Vector **y, HYPRE_Int k, HYPRE_Real *result); HYPRE_Int hypre_SeqVectorMassInnerProd8(hypre_Vector *x, hypre_Vector **y, HYPRE_Int k, HYPRE_Real *result); HYPRE_Int hypre_SeqVectorMassDotpTwo(hypre_Vector *x, hypre_Vector *y, hypre_Vector **z, HYPRE_Int k, HYPRE_Int unroll, HYPRE_Real *result_x, HYPRE_Real *result_y); HYPRE_Int hypre_SeqVectorMassDotpTwo4(hypre_Vector *x, hypre_Vector *y, hypre_Vector **z, HYPRE_Int k, HYPRE_Real *result_x, HYPRE_Real *result_y); HYPRE_Int hypre_SeqVectorMassDotpTwo8(hypre_Vector *x, hypre_Vector *y, hypre_Vector **z, HYPRE_Int k, HYPRE_Real *result_x, HYPRE_Real *result_y); HYPRE_Int hypre_SeqVectorMassAxpy(HYPRE_Complex *alpha, hypre_Vector **x, hypre_Vector *y, HYPRE_Int k, HYPRE_Int unroll); HYPRE_Int hypre_SeqVectorMassAxpy4(HYPRE_Complex *alpha, hypre_Vector **x, hypre_Vector *y, HYPRE_Int k); HYPRE_Int hypre_SeqVectorMassAxpy8(HYPRE_Complex *alpha, hypre_Vector **x, hypre_Vector *y, HYPRE_Int k); HYPRE_Complex hypre_SeqVectorSumElts ( hypre_Vector *vector ); HYPRE_Complex hypre_SeqVectorSumEltsHost ( hypre_Vector *vector ); //HYPRE_Int hypre_SeqVectorMax( HYPRE_Complex alpha, hypre_Vector *x, HYPRE_Complex beta, hypre_Vector *y ); HYPRE_Int hypreDevice_CSRSpAdd(HYPRE_Int ma, HYPRE_Int mb, HYPRE_Int nnzA, HYPRE_Int nnzB, HYPRE_Int *d_ia, HYPRE_Int *d_ja, HYPRE_Complex alpha, HYPRE_Complex *d_aa, HYPRE_Int *d_ja_map, HYPRE_Int *d_ib, HYPRE_Int *d_jb, HYPRE_Complex beta, HYPRE_Complex *d_ab, HYPRE_Int *d_jb_map, HYPRE_Int *d_num_b, HYPRE_Int *nnzC_out, HYPRE_Int **d_ic_out, HYPRE_Int **d_jc_out, HYPRE_Complex **d_ac_out); HYPRE_Int hypreDevice_CSRSpTrans(HYPRE_Int m, HYPRE_Int n, HYPRE_Int nnzA, HYPRE_Int *d_ia, HYPRE_Int *d_ja, HYPRE_Complex *d_aa, HYPRE_Int **d_ic_out, HYPRE_Int **d_jc_out, HYPRE_Complex **d_ac_out, HYPRE_Int want_data); HYPRE_Int hypreDevice_CSRSpTransCusparse(HYPRE_Int m, HYPRE_Int n, HYPRE_Int nnzA, HYPRE_Int *d_ia, HYPRE_Int *d_ja, HYPRE_Complex *d_aa, HYPRE_Int **d_ic_out, HYPRE_Int **d_jc_out, HYPRE_Complex **d_ac_out, HYPRE_Int want_data); HYPRE_Int hypreDevice_CSRSpTransRocsparse(HYPRE_Int m, HYPRE_Int n, HYPRE_Int nnzA, HYPRE_Int *d_ia, HYPRE_Int *d_ja, HYPRE_Complex *d_aa, HYPRE_Int **d_ic_out, HYPRE_Int **d_jc_out, HYPRE_Complex **d_ac_out, HYPRE_Int want_data); HYPRE_Int hypreDevice_CSRSpTransOnemklsparse(HYPRE_Int m, HYPRE_Int n, HYPRE_Int nnzA, HYPRE_Int *d_ia, HYPRE_Int *d_ja, HYPRE_Complex *d_aa, HYPRE_Int **d_ic_out, HYPRE_Int **d_jc_out, HYPRE_Complex **d_ac_out, HYPRE_Int want_data); HYPRE_Int hypreDevice_CSRSpGemm(hypre_CSRMatrix *A, hypre_CSRMatrix *B, hypre_CSRMatrix **C_ptr); HYPRE_Int hypreDevice_CSRSpGemmCusparseGenericAPI(HYPRE_Int m, HYPRE_Int k, HYPRE_Int n, HYPRE_Int nnzA, HYPRE_Int *d_ia, HYPRE_Int *d_ja, HYPRE_Complex *d_a, HYPRE_Int nnzB, HYPRE_Int *d_ib, HYPRE_Int *d_jb, HYPRE_Complex *d_b, HYPRE_Int *nnzC_out, HYPRE_Int **d_ic_out, HYPRE_Int **d_jc_out, HYPRE_Complex **d_c_out); HYPRE_Int hypre_SeqVectorElmdivpy( hypre_Vector *x, hypre_Vector *b, hypre_Vector *y ); HYPRE_Int hypre_SeqVectorElmdivpyMarked( hypre_Vector *x, hypre_Vector *b, hypre_Vector *y, HYPRE_Int *marker, HYPRE_Int marker_val ); HYPRE_Int hypre_SeqVectorElmdivpyHost( hypre_Vector *x, hypre_Vector *b, hypre_Vector *y, HYPRE_Int *marker, HYPRE_Int marker_val ); HYPRE_Int hypre_CSRMatrixSpMVDevice( HYPRE_Int trans, HYPRE_Complex alpha, hypre_CSRMatrix *A, hypre_Vector *x, HYPRE_Complex beta, hypre_Vector *y, HYPRE_Int fill ); HYPRE_Int hypre_CSRMatrixIntSpMVDevice( HYPRE_Int num_rows, HYPRE_Int num_nonzeros, HYPRE_Int alpha, HYPRE_Int *d_ia, HYPRE_Int *d_ja, HYPRE_Int *d_a, HYPRE_Int *d_x, HYPRE_Int beta, HYPRE_Int *d_y ); #if defined(HYPRE_USING_CUSPARSE) ||\ defined(HYPRE_USING_ROCSPARSE) ||\ defined(HYPRE_USING_ONEMKLSPARSE) hypre_CsrsvData* hypre_CsrsvDataCreate(); HYPRE_Int hypre_CsrsvDataDestroy(hypre_CsrsvData *data); hypre_GpuMatData* hypre_GpuMatDataCreate(); HYPRE_Int hypre_GPUMatDataSetCSRData(hypre_CSRMatrix *matrix); HYPRE_Int hypre_GpuMatDataDestroy(hypre_GpuMatData *data); hypre_GpuMatData* hypre_CSRMatrixGetGPUMatData(hypre_CSRMatrix *matrix); #define hypre_CSRMatrixGPUMatDescr(matrix) ( hypre_GpuMatDataMatDescr(hypre_CSRMatrixGetGPUMatData(matrix)) ) #define hypre_CSRMatrixGPUMatInfo(matrix) ( hypre_GpuMatDataMatInfo (hypre_CSRMatrixGetGPUMatData(matrix)) ) #define hypre_CSRMatrixGPUMatHandle(matrix) ( hypre_GpuMatDataMatHandle (hypre_CSRMatrixGetGPUMatData(matrix)) ) #define hypre_CSRMatrixGPUMatSpMVBuffer(matrix) ( hypre_GpuMatDataSpMVBuffer (hypre_CSRMatrixGetGPUMatData(matrix)) ) #endif HYPRE_Int hypre_CSRMatrixSpMVAnalysisDevice(hypre_CSRMatrix *matrix); /* vector_device.c */ HYPRE_Int hypre_SeqVectorSetConstantValuesDevice ( hypre_Vector *v, HYPRE_Complex value ); HYPRE_Int hypre_SeqVectorScaleDevice( HYPRE_Complex alpha, hypre_Vector *y ); HYPRE_Int hypre_SeqVectorAxpyDevice ( HYPRE_Complex alpha, hypre_Vector *x, hypre_Vector *y ); HYPRE_Int hypre_SeqVectorAxpyzDevice ( HYPRE_Complex alpha, hypre_Vector *x, HYPRE_Complex beta, hypre_Vector *y, hypre_Vector *z ); HYPRE_Int hypre_SeqVectorElmdivpyDevice( hypre_Vector *x, hypre_Vector *b, hypre_Vector *y, HYPRE_Int *marker, HYPRE_Int marker_val ); HYPRE_Real hypre_SeqVectorInnerProdDevice ( hypre_Vector *x, hypre_Vector *y ); HYPRE_Complex hypre_SeqVectorSumEltsDevice ( hypre_Vector *vector ); HYPRE_Int hypre_SeqVectorStridedCopyDevice( hypre_Vector *vector, HYPRE_Int istride, HYPRE_Int ostride, HYPRE_Int size, HYPRE_Complex *data ); HYPRE_Int hypre_SeqVectorPrefetch(hypre_Vector *x, HYPRE_MemoryLocation memory_location); #ifdef __cplusplus } #endif #endif hypre-2.33.0/src/seq_mv/seq_mv.hpp000066400000000000000000000105251477326011500170230ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #ifndef SEQ_MV_HPP #define SEQ_MV_HPP #ifdef __cplusplus extern "C" { #endif #if defined(HYPRE_USING_CUSPARSE) #if CUSPARSE_VERSION >= CUSPARSE_NEWAPI_VERSION cusparseSpMatDescr_t hypre_CSRMatrixToCusparseSpMat(const hypre_CSRMatrix *A, HYPRE_Int offset); cusparseSpMatDescr_t hypre_CSRMatrixToCusparseSpMat_core( HYPRE_Int n, HYPRE_Int m, HYPRE_Int offset, HYPRE_Int nnz, HYPRE_Int *i, HYPRE_Int *j, HYPRE_Complex *data); cusparseDnVecDescr_t hypre_VectorToCusparseDnVec_core(HYPRE_Complex *x_data, HYPRE_Int n); cusparseDnVecDescr_t hypre_VectorToCusparseDnVec(const hypre_Vector *x, HYPRE_Int offset, HYPRE_Int size_override); cusparseDnMatDescr_t hypre_VectorToCusparseDnMat_core(HYPRE_Complex *x_data, HYPRE_Int nrow, HYPRE_Int ncol, HYPRE_Int order); cusparseDnMatDescr_t hypre_VectorToCusparseDnMat(const hypre_Vector *x); #endif HYPRE_Int hypreDevice_CSRSpGemmCusparseOldAPI(HYPRE_Int m, HYPRE_Int k, HYPRE_Int n, cusparseMatDescr_t descr_A, HYPRE_Int nnzA, HYPRE_Int *d_ia, HYPRE_Int *d_ja, HYPRE_Complex *d_a, cusparseMatDescr_t descr_B, HYPRE_Int nnzB, HYPRE_Int *d_ib, HYPRE_Int *d_jb, HYPRE_Complex *d_b, cusparseMatDescr_t descr_C, HYPRE_Int *nnzC_out, HYPRE_Int **d_ic_out, HYPRE_Int **d_jc_out, HYPRE_Complex **d_c_out); HYPRE_Int hypreDevice_CSRSpGemmCusparse(HYPRE_Int m, HYPRE_Int k, HYPRE_Int n, cusparseMatDescr_t descr_A, HYPRE_Int nnzA, HYPRE_Int *d_ia, HYPRE_Int *d_ja, HYPRE_Complex *d_a, cusparseMatDescr_t descr_B, HYPRE_Int nnzB, HYPRE_Int *d_ib, HYPRE_Int *d_jb, HYPRE_Complex *d_b, cusparseMatDescr_t descr_C, HYPRE_Int *nnzC_out, HYPRE_Int **d_ic_out, HYPRE_Int **d_jc_out, HYPRE_Complex **d_c_out); HYPRE_Int hypre_SortCSRCusparse( HYPRE_Int n, HYPRE_Int m, HYPRE_Int nnzA, cusparseMatDescr_t descrA, const HYPRE_Int *d_ia, HYPRE_Int *d_ja_sorted, HYPRE_Complex *d_a_sorted ); #endif #if defined(HYPRE_USING_ROCSPARSE) HYPRE_Int hypreDevice_CSRSpGemmRocsparse(HYPRE_Int m, HYPRE_Int k, HYPRE_Int n, rocsparse_mat_descr descrA, HYPRE_Int nnzA, HYPRE_Int *d_ia, HYPRE_Int *d_ja, HYPRE_Complex *d_a, rocsparse_mat_descr descrB, HYPRE_Int nnzB, HYPRE_Int *d_ib, HYPRE_Int *d_jb, HYPRE_Complex *d_b, rocsparse_mat_descr descrC, rocsparse_mat_info infoC, HYPRE_Int *nnzC_out, HYPRE_Int **d_ic_out, HYPRE_Int **d_jc_out, HYPRE_Complex **d_c_out); HYPRE_Int hypre_SortCSRRocsparse( HYPRE_Int n, HYPRE_Int m, HYPRE_Int nnzA, rocsparse_mat_descr descrA, const HYPRE_Int *d_ia, HYPRE_Int *d_ja_sorted, HYPRE_Complex *d_a_sorted ); #endif #if defined(HYPRE_USING_ONEMKLSPARSE) HYPRE_Int hypreDevice_CSRSpGemmOnemklsparse(HYPRE_Int m, HYPRE_Int k, HYPRE_Int n, oneapi::mkl::sparse::matrix_handle_t handle_A, HYPRE_Int nnzA, HYPRE_Int *d_ia, HYPRE_Int *d_ja, HYPRE_Complex *d_a, oneapi::mkl::sparse::matrix_handle_t handle_B, HYPRE_Int nnzB, HYPRE_Int *d_ib, HYPRE_Int *d_jb, HYPRE_Complex *d_b, oneapi::mkl::sparse::matrix_handle_t handle_C, HYPRE_Int *nnzC_out, HYPRE_Int **d_ic_out, HYPRE_Int **d_jc_out, HYPRE_Complex **d_c_out); #endif #ifdef __cplusplus } #endif #endif hypre-2.33.0/src/seq_mv/vector.c000066400000000000000000001073351477326011500164740ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * Member functions for hypre_Vector class. * *****************************************************************************/ #include "seq_mv.h" /*-------------------------------------------------------------------------- * hypre_SeqVectorCreate *--------------------------------------------------------------------------*/ hypre_Vector * hypre_SeqVectorCreate( HYPRE_Int size ) { hypre_Vector *vector; vector = hypre_CTAlloc(hypre_Vector, 1, HYPRE_MEMORY_HOST); hypre_VectorData(vector) = NULL; hypre_VectorSize(vector) = size; hypre_VectorNumVectors(vector) = 1; hypre_VectorMultiVecStorageMethod(vector) = 0; /* set defaults */ hypre_VectorOwnsData(vector) = 1; hypre_VectorMemoryLocation(vector) = hypre_HandleMemoryLocation(hypre_handle()); return vector; } /*-------------------------------------------------------------------------- * hypre_SeqMultiVectorCreate *--------------------------------------------------------------------------*/ hypre_Vector * hypre_SeqMultiVectorCreate( HYPRE_Int size, HYPRE_Int num_vectors ) { hypre_Vector *vector = hypre_SeqVectorCreate(size); hypre_VectorNumVectors(vector) = num_vectors; return vector; } /*-------------------------------------------------------------------------- * hypre_SeqVectorDestroy *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SeqVectorDestroy( hypre_Vector *vector ) { if (vector) { HYPRE_MemoryLocation memory_location = hypre_VectorMemoryLocation(vector); if (hypre_VectorOwnsData(vector)) { hypre_TFree(hypre_VectorData(vector), memory_location); } hypre_TFree(vector, HYPRE_MEMORY_HOST); } return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_SeqVectorInitializeShell *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SeqVectorInitializeShell( hypre_Vector *vector ) { HYPRE_Int size = hypre_VectorSize(vector); HYPRE_Int num_vectors = hypre_VectorNumVectors(vector); HYPRE_Int multivec_storage_method = hypre_VectorMultiVecStorageMethod(vector); if (multivec_storage_method == 0) { hypre_VectorVectorStride(vector) = size; hypre_VectorIndexStride(vector) = 1; } else if (multivec_storage_method == 1) { hypre_VectorVectorStride(vector) = 1; hypre_VectorIndexStride(vector) = num_vectors; } else { hypre_error_w_msg(HYPRE_ERROR_GENERIC, "Invalid multivec storage method!\n"); return hypre_error_flag; } return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_SeqVectorSetData *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SeqVectorSetData( hypre_Vector *vector, HYPRE_Complex *data ) { /* Free data array if already present */ if (hypre_VectorData(vector) && hypre_VectorOwnsData(vector)) { hypre_TFree(hypre_VectorData(vector), hypre_VectorMemoryLocation(vector)); } /* Set data pointer passed via input */ hypre_VectorData(vector) = data; /* Remove data pointer ownership */ hypre_VectorOwnsData(vector) = 0; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_SeqVectorInitialize_v2 * * Initialize a vector at a given memory location *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SeqVectorInitialize_v2( hypre_Vector *vector, HYPRE_MemoryLocation memory_location ) { HYPRE_Int size = hypre_VectorSize(vector); HYPRE_Int num_vectors = hypre_VectorNumVectors(vector); /* Set up the basic structure and metadata for the local vector */ hypre_SeqVectorInitializeShell(vector); /* Set memory location */ hypre_VectorMemoryLocation(vector) = memory_location; /* Caveat: for pre-existing data, the memory location must be guaranteed * to be consistent with `memory_location' * Otherwise, mismatches will exist and problems will be encountered * when being used, and freed */ if (!hypre_VectorData(vector)) { hypre_VectorData(vector) = hypre_CTAlloc(HYPRE_Complex, num_vectors * size, memory_location); } return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_SeqVectorInitialize *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SeqVectorInitialize( hypre_Vector *vector ) { return hypre_SeqVectorInitialize_v2(vector, hypre_VectorMemoryLocation(vector)); } /*-------------------------------------------------------------------------- * hypre_SeqVectorSetDataOwner *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SeqVectorSetDataOwner( hypre_Vector *vector, HYPRE_Int owns_data ) { hypre_VectorOwnsData(vector) = owns_data; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_SeqVectorSetSize *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SeqVectorSetSize( hypre_Vector *vector, HYPRE_Int size ) { HYPRE_Int multivec_storage_method = hypre_VectorMultiVecStorageMethod(vector); hypre_VectorSize(vector) = size; if (multivec_storage_method == 0) { hypre_VectorVectorStride(vector) = size; } return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_SeqVectorResize * * Resize a sequential vector when changing its number of components. *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SeqVectorResize( hypre_Vector *vector, HYPRE_Int num_vectors_in ) { HYPRE_Int method = hypre_VectorMultiVecStorageMethod(vector); HYPRE_Int size = hypre_VectorSize(vector); HYPRE_Int num_vectors = hypre_VectorNumVectors(vector); HYPRE_Int total_size = num_vectors * size; HYPRE_Int total_size_in = num_vectors_in * size; /* Reallocate data array */ if (total_size_in > total_size) { hypre_VectorData(vector) = hypre_TReAlloc_v2(hypre_VectorData(vector), HYPRE_Complex, total_size, HYPRE_Complex, total_size_in, hypre_VectorMemoryLocation(vector)); } /* Update vector info */ hypre_VectorNumVectors(vector) = num_vectors_in; if (method == 0) { hypre_VectorVectorStride(vector) = size; hypre_VectorIndexStride(vector) = 1; } else if (method == 1) { hypre_VectorVectorStride(vector) = 1; hypre_VectorIndexStride(vector) = num_vectors; } return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_SeqVectorRead *--------------------------------------------------------------------------*/ hypre_Vector * hypre_SeqVectorRead( char *file_name ) { hypre_Vector *vector; FILE *fp; HYPRE_Complex *data; HYPRE_Int size; HYPRE_Int j; /*---------------------------------------------------------- * Read in the data *----------------------------------------------------------*/ fp = fopen(file_name, "r"); hypre_fscanf(fp, "%d", &size); vector = hypre_SeqVectorCreate(size); hypre_VectorMemoryLocation(vector) = HYPRE_MEMORY_HOST; hypre_SeqVectorInitialize(vector); data = hypre_VectorData(vector); for (j = 0; j < size; j++) { hypre_fscanf(fp, "%le", &data[j]); } fclose(fp); /* multivector code not written yet */ hypre_assert( hypre_VectorNumVectors(vector) == 1 ); return vector; } /*-------------------------------------------------------------------------- * hypre_SeqVectorPrint *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SeqVectorPrint( hypre_Vector *vector, char *file_name ) { FILE *fp; HYPRE_Complex *data; HYPRE_Int size, num_vectors, vecstride, idxstride; HYPRE_Int i, j; HYPRE_Complex value; num_vectors = hypre_VectorNumVectors(vector); vecstride = hypre_VectorVectorStride(vector); idxstride = hypre_VectorIndexStride(vector); /*---------------------------------------------------------- * Print in the data *----------------------------------------------------------*/ data = hypre_VectorData(vector); size = hypre_VectorSize(vector); fp = fopen(file_name, "w"); if ( hypre_VectorNumVectors(vector) == 1 ) { hypre_fprintf(fp, "%d\n", size); } else { hypre_fprintf(fp, "%d vectors of size %d\n", num_vectors, size ); } if ( num_vectors > 1 ) { for ( j = 0; j < num_vectors; ++j ) { hypre_fprintf(fp, "vector %d\n", j ); for (i = 0; i < size; i++) { value = data[ j * vecstride + i * idxstride ]; #ifdef HYPRE_COMPLEX hypre_fprintf(fp, "%.14e , %.14e\n", hypre_creal(value), hypre_cimag(value)); #else hypre_fprintf(fp, "%.14e\n", value); #endif } } } else { for (i = 0; i < size; i++) { #ifdef HYPRE_COMPLEX hypre_fprintf(fp, "%.14e , %.14e\n", hypre_creal(data[i]), hypre_cimag(data[i])); #else hypre_fprintf(fp, "%.14e\n", data[i]); #endif } } fclose(fp); return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_SeqVectorSetConstantValuesHost *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SeqVectorSetConstantValuesHost( hypre_Vector *v, HYPRE_Complex value ) { HYPRE_Complex *vector_data = hypre_VectorData(v); HYPRE_Int num_vectors = hypre_VectorNumVectors(v); HYPRE_Int size = hypre_VectorSize(v); HYPRE_Int total_size = size * num_vectors; HYPRE_Int i; #if defined(HYPRE_USING_OPENMP) #pragma omp parallel for private(i) HYPRE_SMP_SCHEDULE #endif for (i = 0; i < total_size; i++) { vector_data[i] = value; } return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_SeqVectorSetConstantValues *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SeqVectorSetConstantValues( hypre_Vector *v, HYPRE_Complex value ) { #ifdef HYPRE_PROFILE hypre_profile_times[HYPRE_TIMER_ID_BLAS1] -= hypre_MPI_Wtime(); #endif HYPRE_Int num_vectors = hypre_VectorNumVectors(v); HYPRE_Int size = hypre_VectorSize(v); HYPRE_Int total_size = size * num_vectors; /* Trivial case */ if (total_size <= 0) { return hypre_error_flag; } #if defined(HYPRE_USING_GPU) || defined(HYPRE_USING_DEVICE_OPENMP) HYPRE_ExecutionPolicy exec = hypre_GetExecPolicy1(hypre_VectorMemoryLocation(v)); if (exec == HYPRE_EXEC_DEVICE) { hypre_SeqVectorSetConstantValuesDevice(v, value); } else #endif { hypre_SeqVectorSetConstantValuesHost(v, value); } #ifdef HYPRE_PROFILE hypre_profile_times[HYPRE_TIMER_ID_BLAS1] += hypre_MPI_Wtime(); #endif return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_SeqVectorSetRandomValues * * returns vector of values randomly distributed between -1.0 and +1.0 *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SeqVectorSetRandomValues( hypre_Vector *v, HYPRE_Int seed ) { HYPRE_Complex *vector_data = hypre_VectorData(v); HYPRE_Int size = hypre_VectorSize(v); HYPRE_Int i; hypre_SeedRand(seed); size *= hypre_VectorNumVectors(v); if (hypre_GetActualMemLocation(hypre_VectorMemoryLocation(v)) == hypre_MEMORY_HOST) { /* RDF: threading this loop may cause problems because of hypre_Rand() */ for (i = 0; i < size; i++) { vector_data[i] = 2.0 * hypre_Rand() - 1.0; } } else { HYPRE_Complex *h_data = hypre_TAlloc(HYPRE_Complex, size, HYPRE_MEMORY_HOST); for (i = 0; i < size; i++) { h_data[i] = 2.0 * hypre_Rand() - 1.0; } hypre_TMemcpy(vector_data, h_data, HYPRE_Complex, size, hypre_VectorMemoryLocation(v), HYPRE_MEMORY_HOST); hypre_TFree(h_data, HYPRE_MEMORY_HOST); } return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_SeqVectorCopy * copies data from x to y * if size of x is larger than y only the first size_y elements of x are * copied to y *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SeqVectorCopy( hypre_Vector *x, hypre_Vector *y ) { #ifdef HYPRE_PROFILE hypre_profile_times[HYPRE_TIMER_ID_BLAS1] -= hypre_MPI_Wtime(); #endif hypre_GpuProfilingPushRange("SeqVectorCopy"); size_t size = hypre_min(hypre_VectorSize(x), hypre_VectorSize(y)) * hypre_VectorNumVectors(x); hypre_TMemcpy( hypre_VectorData(y), hypre_VectorData(x), HYPRE_Complex, size, hypre_VectorMemoryLocation(y), hypre_VectorMemoryLocation(x) ); #ifdef HYPRE_PROFILE hypre_profile_times[HYPRE_TIMER_ID_BLAS1] += hypre_MPI_Wtime(); #endif hypre_GpuProfilingPopRange(); return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_SeqVectorStridedCopy * * Perform strided copy from a data array to x->data. * * We assume that the data array lives in the same memory location as x->data *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SeqVectorStridedCopy( hypre_Vector *x, HYPRE_Int istride, HYPRE_Int ostride, HYPRE_Int size, HYPRE_Complex *data) { HYPRE_Int x_size = hypre_VectorSize(x); HYPRE_Complex *x_data = hypre_VectorData(x); HYPRE_Int i; /* Sanity checks */ if (istride < 1) { hypre_error_w_msg(HYPRE_ERROR_GENERIC, "Input stride needs to be greater than zero!"); return hypre_error_flag; } if (ostride < 1) { hypre_error_w_msg(HYPRE_ERROR_GENERIC, "Output stride needs to be greater than zero!"); return hypre_error_flag; } if (x_size < (size / istride) * ostride) { hypre_error_w_msg(HYPRE_ERROR_GENERIC, "Not enough space in x!"); return hypre_error_flag; } #if defined(HYPRE_USING_GPU) HYPRE_ExecutionPolicy exec = hypre_GetExecPolicy1(hypre_VectorMemoryLocation(x)); if (exec == HYPRE_EXEC_DEVICE) { hypre_SeqVectorStridedCopyDevice(x, istride, ostride, size, data); } else #endif { #if defined(HYPRE_USING_OPENMP) #pragma omp parallel for private(i) HYPRE_SMP_SCHEDULE #endif for (i = 0; i < size; i += istride) { x_data[(i / istride) * ostride] = data[i]; } } return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_SeqVectorCloneDeep_v2 *--------------------------------------------------------------------------*/ hypre_Vector* hypre_SeqVectorCloneDeep_v2( hypre_Vector *x, HYPRE_MemoryLocation memory_location ) { HYPRE_Int size = hypre_VectorSize(x); HYPRE_Int num_vectors = hypre_VectorNumVectors(x); hypre_Vector *y = hypre_SeqMultiVectorCreate( size, num_vectors ); hypre_VectorMultiVecStorageMethod(y) = hypre_VectorMultiVecStorageMethod(x); hypre_VectorVectorStride(y) = hypre_VectorVectorStride(x); hypre_VectorIndexStride(y) = hypre_VectorIndexStride(x); hypre_SeqVectorInitialize_v2(y, memory_location); hypre_SeqVectorCopy( x, y ); return y; } /*-------------------------------------------------------------------------- * hypre_SeqVectorCloneDeep * * Returns a complete copy of x - a deep copy, with its own copy of the data. *--------------------------------------------------------------------------*/ hypre_Vector* hypre_SeqVectorCloneDeep( hypre_Vector *x ) { return hypre_SeqVectorCloneDeep_v2(x, hypre_VectorMemoryLocation(x)); } /*-------------------------------------------------------------------------- * hypre_SeqVectorCloneShallow * * Returns a complete copy of x - a shallow copy, pointing the data of x *--------------------------------------------------------------------------*/ hypre_Vector * hypre_SeqVectorCloneShallow( hypre_Vector *x ) { HYPRE_Int size = hypre_VectorSize(x); HYPRE_Int num_vectors = hypre_VectorNumVectors(x); hypre_Vector *y = hypre_SeqMultiVectorCreate(size, num_vectors); hypre_VectorMultiVecStorageMethod(y) = hypre_VectorMultiVecStorageMethod(x); hypre_VectorVectorStride(y) = hypre_VectorVectorStride(x); hypre_VectorIndexStride(y) = hypre_VectorIndexStride(x); hypre_VectorMemoryLocation(y) = hypre_VectorMemoryLocation(x); hypre_VectorData(y) = hypre_VectorData(x); hypre_SeqVectorSetDataOwner(y, 0); hypre_SeqVectorInitialize(y); return y; } /*-------------------------------------------------------------------------- * hypre_SeqVectorMigrate * * Migrates the vector data to memory_location. *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SeqVectorMigrate(hypre_Vector *x, HYPRE_MemoryLocation memory_location ) { HYPRE_Complex *data = hypre_VectorData(x); HYPRE_Int size = hypre_VectorSize(x); HYPRE_Int num_vectors = hypre_VectorNumVectors(x); HYPRE_MemoryLocation old_memory_location = hypre_VectorMemoryLocation(x); HYPRE_Int total_size = size * num_vectors; /* Update x's memory location */ hypre_VectorMemoryLocation(x) = memory_location; if ( hypre_GetActualMemLocation(memory_location) != hypre_GetActualMemLocation(old_memory_location) ) { if (data) { HYPRE_Complex *new_data; new_data = hypre_TAlloc(HYPRE_Complex, total_size, memory_location); hypre_TMemcpy(new_data, data, HYPRE_Complex, total_size, memory_location, old_memory_location); hypre_VectorData(x) = new_data; hypre_VectorOwnsData(x) = 1; /* Free old data */ hypre_TFree(data, old_memory_location); } } return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_SeqVectorScaleHost *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SeqVectorScaleHost( HYPRE_Complex alpha, hypre_Vector *y ) { HYPRE_Complex *y_data = hypre_VectorData(y); HYPRE_Int num_vectors = hypre_VectorNumVectors(y); HYPRE_Int size = hypre_VectorSize(y); HYPRE_Int total_size = size * num_vectors; HYPRE_Int i; #if defined(HYPRE_USING_OPENMP) #pragma omp parallel for private(i) HYPRE_SMP_SCHEDULE #endif for (i = 0; i < total_size; i++) { y_data[i] *= alpha; } return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_SeqVectorScale *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SeqVectorScale( HYPRE_Complex alpha, hypre_Vector *y ) { #ifdef HYPRE_PROFILE hypre_profile_times[HYPRE_TIMER_ID_BLAS1] -= hypre_MPI_Wtime(); #endif /* special cases */ if (alpha == 1.0) { return hypre_error_flag; } if (alpha == 0.0) { return hypre_SeqVectorSetConstantValues(y, 0.0); } #if defined(HYPRE_USING_GPU) HYPRE_ExecutionPolicy exec = hypre_GetExecPolicy1(hypre_VectorMemoryLocation(y)); if (exec == HYPRE_EXEC_DEVICE) { hypre_SeqVectorScaleDevice(alpha, y); } else #endif { hypre_SeqVectorScaleHost(alpha, y); } #ifdef HYPRE_PROFILE hypre_profile_times[HYPRE_TIMER_ID_BLAS1] += hypre_MPI_Wtime(); #endif return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_SeqVectorAxpyHost *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SeqVectorAxpyHost( HYPRE_Complex alpha, hypre_Vector *x, hypre_Vector *y ) { HYPRE_Complex *x_data = hypre_VectorData(x); HYPRE_Complex *y_data = hypre_VectorData(y); HYPRE_Int num_vectors = hypre_VectorNumVectors(x); HYPRE_Int size = hypre_VectorSize(x); HYPRE_Int total_size = size * num_vectors; HYPRE_Int i; #if defined(HYPRE_USING_OPENMP) #pragma omp parallel for private(i) HYPRE_SMP_SCHEDULE #endif for (i = 0; i < total_size; i++) { y_data[i] += alpha * x_data[i]; } return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_SeqVectorAxpy *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SeqVectorAxpy( HYPRE_Complex alpha, hypre_Vector *x, hypre_Vector *y ) { #ifdef HYPRE_PROFILE hypre_profile_times[HYPRE_TIMER_ID_BLAS1] -= hypre_MPI_Wtime(); #endif #if defined(HYPRE_USING_GPU) HYPRE_ExecutionPolicy exec = hypre_GetExecPolicy2( hypre_VectorMemoryLocation(x), hypre_VectorMemoryLocation(y) ); if (exec == HYPRE_EXEC_DEVICE) { hypre_SeqVectorAxpyDevice(alpha, x, y); } else #endif { hypre_SeqVectorAxpyHost(alpha, x, y); } #ifdef HYPRE_PROFILE hypre_profile_times[HYPRE_TIMER_ID_BLAS1] += hypre_MPI_Wtime(); #endif return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_SeqVectorAxpyzHost *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SeqVectorAxpyzHost( HYPRE_Complex alpha, hypre_Vector *x, HYPRE_Complex beta, hypre_Vector *y, hypre_Vector *z ) { HYPRE_Complex *x_data = hypre_VectorData(x); HYPRE_Complex *y_data = hypre_VectorData(y); HYPRE_Complex *z_data = hypre_VectorData(z); HYPRE_Int num_vectors = hypre_VectorNumVectors(x); HYPRE_Int size = hypre_VectorSize(x); HYPRE_Int total_size = size * num_vectors; HYPRE_Int i; #if defined(HYPRE_USING_OPENMP) #pragma omp parallel for private(i) HYPRE_SMP_SCHEDULE #endif for (i = 0; i < total_size; i++) { z_data[i] = alpha * x_data[i] + beta * y_data[i]; } return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_SeqVectorAxpyz * * Computes z = a*x + b*y *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SeqVectorAxpyz( HYPRE_Complex alpha, hypre_Vector *x, HYPRE_Complex beta, hypre_Vector *y, hypre_Vector *z ) { #if defined(HYPRE_USING_GPU) HYPRE_ExecutionPolicy exec = hypre_GetExecPolicy2( hypre_VectorMemoryLocation(x), hypre_VectorMemoryLocation(y)); if (exec == HYPRE_EXEC_DEVICE) { hypre_SeqVectorAxpyzDevice(alpha, x, beta, y, z); } else #endif { hypre_SeqVectorAxpyzHost(alpha, x, beta, y, z); } return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_SeqVectorElmdivpyHost * * if marker != NULL: only for marker[i] == marker_val * * TODO: * 1) Change to hypre_SeqVectorElmdivpyMarkedHost? * 2) Add vecstride/idxstride variables *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SeqVectorElmdivpyHost( hypre_Vector *x, hypre_Vector *b, hypre_Vector *y, HYPRE_Int *marker, HYPRE_Int marker_val ) { HYPRE_Complex *x_data = hypre_VectorData(x); HYPRE_Complex *b_data = hypre_VectorData(b); HYPRE_Complex *y_data = hypre_VectorData(y); HYPRE_Int num_vectors_x = hypre_VectorNumVectors(x); HYPRE_Int num_vectors_y = hypre_VectorNumVectors(y); HYPRE_Int num_vectors_b = hypre_VectorNumVectors(b); HYPRE_Int size = hypre_VectorSize(b); HYPRE_Int i, j; HYPRE_Complex val; if (num_vectors_b == 1) { if (num_vectors_x == 1 && num_vectors_y == 1) { if (marker) { #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i) HYPRE_SMP_SCHEDULE #endif for (i = 0; i < size; i++) { if (marker[i] == marker_val) { y_data[i] += x_data[i] / b_data[i]; } } } else { #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i) HYPRE_SMP_SCHEDULE #endif for (i = 0; i < size; i++) { y_data[i] += x_data[i] / b_data[i]; } } /* if (marker) */ } else if (num_vectors_x == 2 && num_vectors_y == 2) { if (marker) { #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i) HYPRE_SMP_SCHEDULE #endif for (i = 0; i < size; i++) { val = 1.0 / b_data[i]; if (marker[i] == marker_val) { y_data[i] += x_data[i] * val; y_data[i + size] += x_data[i + size] * val; } } } else { #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i) HYPRE_SMP_SCHEDULE #endif for (i = 0; i < size; i++) { val = 1.0 / b_data[i]; y_data[i] += x_data[i] * val; y_data[i + size] += x_data[i + size] * val; } } /* if (marker) */ } else if (num_vectors_x == num_vectors_y) { if (marker) { #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i, j) HYPRE_SMP_SCHEDULE #endif for (i = 0; i < size; i++) { val = 1.0 / b_data[i]; if (marker[i] == marker_val) { for (j = 0; j < num_vectors_x; j++) { y_data[i + size * j] += x_data[i + size * j] * val; } } } } else { #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i, j) HYPRE_SMP_SCHEDULE #endif for (i = 0; i < size; i++) { val = 1.0 / b_data[i]; for (j = 0; j < num_vectors_x; j++) { y_data[i + size * j] += x_data[i + size * j] * val; } } } /* if (marker) */ } else { hypre_error_w_msg(HYPRE_ERROR_GENERIC, "Unsupported combination of num_vectors!\n"); } } else { hypre_error_w_msg(HYPRE_ERROR_GENERIC, "num_vectors_b != 1 not supported!\n"); } return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_SeqVectorElmdivpyMarked * * Computes: y[i] = y[i] + x[i] / b[i] for marker[i] = marker_val *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SeqVectorElmdivpyMarked( hypre_Vector *x, hypre_Vector *b, hypre_Vector *y, HYPRE_Int *marker, HYPRE_Int marker_val) { #ifdef HYPRE_PROFILE hypre_profile_times[HYPRE_TIMER_ID_BLAS1] -= hypre_MPI_Wtime(); #endif /* Sanity checks */ if (hypre_VectorSize(x) < hypre_VectorSize(b)) { hypre_error_w_msg(HYPRE_ERROR_GENERIC, "sizes of x and b do not match!\n"); return hypre_error_flag; } if (!hypre_VectorSize(x)) { /* VPM: Do not throw an error message here since this can happen for idle processors */ return hypre_error_flag; } if (!hypre_VectorData(x)) { hypre_error_w_msg(HYPRE_ERROR_GENERIC, "x_data is not present!\n"); return hypre_error_flag; } if (!hypre_VectorData(b)) { hypre_error_w_msg(HYPRE_ERROR_GENERIC, "b_data is not present!\n"); return hypre_error_flag; } if (!hypre_VectorData(y)) { hypre_error_w_msg(HYPRE_ERROR_GENERIC, "y_data is not present!\n"); return hypre_error_flag; } /* row-wise multivec is not supported */ hypre_assert(hypre_VectorMultiVecStorageMethod(x) == 0); hypre_assert(hypre_VectorMultiVecStorageMethod(b) == 0); hypre_assert(hypre_VectorMultiVecStorageMethod(y) == 0); #if defined(HYPRE_USING_GPU) HYPRE_ExecutionPolicy exec = hypre_GetExecPolicy2( hypre_VectorMemoryLocation(x), hypre_VectorMemoryLocation(b) ); if (exec == HYPRE_EXEC_DEVICE) { hypre_SeqVectorElmdivpyDevice(x, b, y, marker, marker_val); } else #endif { hypre_SeqVectorElmdivpyHost(x, b, y, marker, marker_val); } #ifdef HYPRE_PROFILE hypre_profile_times[HYPRE_TIMER_ID_BLAS1] += hypre_MPI_Wtime(); #endif return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_SeqVectorElmdivpy * * Computes: y = y + x ./ b * * Notes: * 1) x and b must have the same sizes * 2) x and y can have different sizes *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SeqVectorElmdivpy( hypre_Vector *x, hypre_Vector *b, hypre_Vector *y ) { return hypre_SeqVectorElmdivpyMarked(x, b, y, NULL, -1); } /*-------------------------------------------------------------------------- * hypre_SeqVectorInnerProdHost *--------------------------------------------------------------------------*/ HYPRE_Real hypre_SeqVectorInnerProdHost( hypre_Vector *x, hypre_Vector *y ) { HYPRE_Complex *x_data = hypre_VectorData(x); HYPRE_Complex *y_data = hypre_VectorData(y); HYPRE_Int num_vectors = hypre_VectorNumVectors(x); HYPRE_Int size = hypre_VectorSize(x); HYPRE_Int total_size = size * num_vectors; HYPRE_Real result = 0.0; HYPRE_Int i; #if defined(HYPRE_USING_OPENMP) #pragma omp parallel for private(i) reduction(+:result) HYPRE_SMP_SCHEDULE #endif for (i = 0; i < total_size; i++) { result += hypre_conj(y_data[i]) * x_data[i]; } return result; } /*-------------------------------------------------------------------------- * hypre_SeqVectorInnerProd *--------------------------------------------------------------------------*/ HYPRE_Real hypre_SeqVectorInnerProd( hypre_Vector *x, hypre_Vector *y ) { #ifdef HYPRE_PROFILE hypre_profile_times[HYPRE_TIMER_ID_BLAS1] -= hypre_MPI_Wtime(); #endif HYPRE_Real result; #if defined(HYPRE_USING_GPU) HYPRE_ExecutionPolicy exec = hypre_GetExecPolicy2( hypre_VectorMemoryLocation(x), hypre_VectorMemoryLocation(y) ); if (exec == HYPRE_EXEC_DEVICE) { result = hypre_SeqVectorInnerProdDevice(x, y); } else #endif { result = hypre_SeqVectorInnerProdHost(x, y); } #ifdef HYPRE_PROFILE hypre_profile_times[HYPRE_TIMER_ID_BLAS1] += hypre_MPI_Wtime(); #endif return result; } /*-------------------------------------------------------------------------- * hypre_SeqVectorSumEltsHost *--------------------------------------------------------------------------*/ HYPRE_Complex hypre_SeqVectorSumEltsHost( hypre_Vector *vector ) { HYPRE_Complex *data = hypre_VectorData( vector ); HYPRE_Int num_vectors = hypre_VectorNumVectors(vector); HYPRE_Int size = hypre_VectorSize(vector); HYPRE_Int total_size = size * num_vectors; HYPRE_Complex sum = 0; HYPRE_Int i; #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i) reduction(+:sum) HYPRE_SMP_SCHEDULE #endif for (i = 0; i < total_size; i++) { sum += data[i]; } return sum; } /*-------------------------------------------------------------------------- * hypre_SeqVectorSumElts: * * Returns the sum of all vector elements. *--------------------------------------------------------------------------*/ HYPRE_Complex hypre_SeqVectorSumElts( hypre_Vector *v ) { #ifdef HYPRE_PROFILE hypre_profile_times[HYPRE_TIMER_ID_BLAS1] -= hypre_MPI_Wtime(); #endif HYPRE_Complex sum; #if defined(HYPRE_USING_GPU) HYPRE_ExecutionPolicy exec = hypre_GetExecPolicy1(hypre_VectorMemoryLocation(v)); if (exec == HYPRE_EXEC_DEVICE) { sum = hypre_SeqVectorSumEltsDevice(v); } else #endif { sum = hypre_SeqVectorSumEltsHost(v); } #ifdef HYPRE_PROFILE hypre_profile_times[HYPRE_TIMER_ID_BLAS1] += hypre_MPI_Wtime(); #endif return sum; } #if 0 /* y[i] = max(alpha*x[i], beta*y[i]) */ HYPRE_Int hypre_SeqVectorMax( HYPRE_Complex alpha, hypre_Vector *x, HYPRE_Complex beta, hypre_Vector *y ) { #ifdef HYPRE_PROFILE hypre_profile_times[HYPRE_TIMER_ID_BLAS1] -= hypre_MPI_Wtime(); #endif HYPRE_Complex *x_data = hypre_VectorData(x); HYPRE_Complex *y_data = hypre_VectorData(y); HYPRE_Int size = hypre_VectorSize(x); size *= hypre_VectorNumVectors(x); //hypre_SeqVectorPrefetch(x, HYPRE_MEMORY_DEVICE); //hypre_SeqVectorPrefetch(y, HYPRE_MEMORY_DEVICE); thrust::maximum mx; #if defined(HYPRE_USING_CUDA) || defined(HYPRE_USING_HIP) HYPRE_THRUST_CALL( transform, thrust::make_transform_iterator(x_data, alpha * _1), thrust::make_transform_iterator(x_data + size, alpha * _1), thrust::make_transform_iterator(y_data, beta * _1), y_data, mx ); #else HYPRE_Int i; #if defined(HYPRE_USING_DEVICE_OPENMP) #pragma omp target teams distribute parallel for private(i) is_device_ptr(y_data, x_data) #elif defined(HYPRE_USING_OPENMP) #pragma omp parallel for private(i) HYPRE_SMP_SCHEDULE #endif for (i = 0; i < size; i++) { y_data[i] += hypre_max(alpha * x_data[i], beta * y_data[i]); } #endif /* defined(HYPRE_USING_CUDA) || defined(HYPRE_USING_HIP) */ hypre_SyncComputeStream(); #ifdef HYPRE_PROFILE hypre_profile_times[HYPRE_TIMER_ID_BLAS1] += hypre_MPI_Wtime(); #endif return hypre_error_flag; } #endif hypre-2.33.0/src/seq_mv/vector.h000066400000000000000000000054651477326011500165020ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * Header info for Vector data structure * *****************************************************************************/ #ifndef hypre_VECTOR_HEADER #define hypre_VECTOR_HEADER /*-------------------------------------------------------------------------- * hypre_Vector *--------------------------------------------------------------------------*/ typedef struct { HYPRE_Complex *data; HYPRE_Int size; /* Number of elements of a single vector component */ HYPRE_Int component; /* Index of a multivector component (used for set/get routines )*/ HYPRE_Int owns_data; /* Does the Vector create/destroy `data'? */ HYPRE_MemoryLocation memory_location; /* memory location of data array */ /* For multivectors...*/ HYPRE_Int num_vectors; /* the above "size" is size of one vector */ HYPRE_Int multivec_storage_method; /* ...if 0, store colwise v0[0], v0[1], ..., v1[0], v1[1], ... v2[0]... */ /* ...if 1, store rowwise v0[0], v1[0], ..., v0[1], v1[1], ... */ /* With colwise storage, vj[i] = data[ j*size + i] With rowwise storage, vj[i] = data[ j + num_vectors*i] */ HYPRE_Int vecstride, idxstride; /* ... so vj[i] = data[ j*vecstride + i*idxstride ] regardless of row_storage.*/ } hypre_Vector; /*-------------------------------------------------------------------------- * Accessor functions for the Vector structure *--------------------------------------------------------------------------*/ #define hypre_VectorData(vector) ((vector) -> data) #define hypre_VectorSize(vector) ((vector) -> size) #define hypre_VectorComponent(vector) ((vector) -> component) #define hypre_VectorOwnsData(vector) ((vector) -> owns_data) #define hypre_VectorMemoryLocation(vector) ((vector) -> memory_location) #define hypre_VectorNumVectors(vector) ((vector) -> num_vectors) #define hypre_VectorMultiVecStorageMethod(vector) ((vector) -> multivec_storage_method) #define hypre_VectorVectorStride(vector) ((vector) -> vecstride) #define hypre_VectorIndexStride(vector) ((vector) -> idxstride) #define hypre_VectorEntryI(vector, i) ((vector) -> data[i]) #define hypre_VectorEntryIJ(vector, i, j) \ ((vector) -> data[((vector) -> vecstride) * j + ((vector) -> idxstride) * i]) #endif hypre-2.33.0/src/seq_mv/vector_batched.c000066400000000000000000001135211477326011500201400ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "seq_mv.h" /*-------------------------------------------------------------------------- * hypre_SeqVectorMassAxpy8 *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SeqVectorMassAxpy8( HYPRE_Complex *alpha, hypre_Vector **x, hypre_Vector *y, HYPRE_Int k) { HYPRE_Complex *x_data = hypre_VectorData(x[0]); HYPRE_Complex *y_data = hypre_VectorData(y); HYPRE_Int size = hypre_VectorSize(x[0]); HYPRE_Int i, j, jstart, restk; restk = (k - (k / 8 * 8)); if (k > 7) { for (j = 0; j < k - 7; j += 8) { jstart = j * size; #if defined(HYPRE_USING_OPENMP) #pragma omp parallel for private(i) HYPRE_SMP_SCHEDULE #endif for (i = 0; i < size; i++) { y_data[i] += alpha[j] * x_data[jstart + i] + alpha[j + 1] * x_data[jstart + i + size] + alpha[j + 2] * x_data[(j + 2) * size + i] + alpha[j + 3] * x_data[(j + 3) * size + i] + alpha[j + 4] * x_data[(j + 4) * size + i] + alpha[j + 5] * x_data[(j + 5) * size + i] + alpha[j + 6] * x_data[(j + 6) * size + i] + alpha[j + 7] * x_data[(j + 7) * size + i]; } } } if (restk == 1) { jstart = (k - 1) * size; #if defined(HYPRE_USING_OPENMP) #pragma omp parallel for private(i) HYPRE_SMP_SCHEDULE #endif for (i = 0; i < size; i++) { y_data[i] += alpha[k - 1] * x_data[jstart + i]; } } else if (restk == 2) { jstart = (k - 2) * size; #if defined(HYPRE_USING_OPENMP) #pragma omp parallel for private(i) HYPRE_SMP_SCHEDULE #endif for (i = 0; i < size; i++) { y_data[i] += alpha[k - 2] * x_data[jstart + i] + alpha[k - 1] * x_data[jstart + size + i]; } } else if (restk == 3) { jstart = (k - 3) * size; #if defined(HYPRE_USING_OPENMP) #pragma omp parallel for private(i) HYPRE_SMP_SCHEDULE #endif for (i = 0; i < size; i++) { y_data[i] += alpha[k - 3] * x_data[jstart + i] + alpha[k - 2] * x_data[jstart + size + i] + alpha[k - 1] * x_data[(k - 1) * size + i]; } } else if (restk == 4) { jstart = (k - 4) * size; #if defined(HYPRE_USING_OPENMP) #pragma omp parallel for private(i) HYPRE_SMP_SCHEDULE #endif for (i = 0; i < size; i++) { y_data[i] += alpha[k - 4] * x_data[(k - 4) * size + i] + alpha[k - 3] * x_data[(k - 3) * size + i] + alpha[k - 2] * x_data[(k - 2) * size + i] + alpha[k - 1] * x_data[(k - 1) * size + i]; } } else if (restk == 5) { #if defined(HYPRE_USING_OPENMP) #pragma omp parallel for private(i) HYPRE_SMP_SCHEDULE #endif for (i = 0; i < size; i++) { y_data[i] += + alpha[k - 5] * x_data[(k - 5) * size + i] + alpha[k - 4] * x_data[(k - 4) * size + i] + alpha[k - 3] * x_data[(k - 3) * size + i] + alpha[k - 2] * x_data[(k - 2) * size + i] + alpha[k - 1] * x_data[(k - 1) * size + i]; } } else if (restk == 6) { jstart = (k - 6) * size; #if defined(HYPRE_USING_OPENMP) #pragma omp parallel for private(i) HYPRE_SMP_SCHEDULE #endif for (i = 0; i < size; i++) { y_data[i] += alpha[k - 6] * x_data[jstart + i] + alpha[k - 5] * x_data[jstart + i + size] + alpha[k - 4] * x_data[(k - 4) * size + i] + alpha[k - 3] * x_data[(k - 3) * size + i] + alpha[k - 2] * x_data[(k - 2) * size + i] + alpha[k - 1] * x_data[(k - 1) * size + i]; } } else if (restk == 7) { jstart = (k - 7) * size; #if defined(HYPRE_USING_OPENMP) #pragma omp parallel for private(i) HYPRE_SMP_SCHEDULE #endif for (i = 0; i < size; i++) { y_data[i] += alpha[k - 7] * x_data[jstart + i] + alpha[k - 6] * x_data[jstart + i + size] + alpha[k - 5] * x_data[(k - 5) * size + i] + alpha[k - 4] * x_data[(k - 4) * size + i] + alpha[k - 3] * x_data[(k - 3) * size + i] + alpha[k - 2] * x_data[(k - 2) * size + i] + alpha[k - 1] * x_data[(k - 1) * size + i]; } } return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_SeqVectorMassAxpy4 *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SeqVectorMassAxpy4( HYPRE_Complex *alpha, hypre_Vector **x, hypre_Vector *y, HYPRE_Int k) { HYPRE_Complex *x_data = hypre_VectorData(x[0]); HYPRE_Complex *y_data = hypre_VectorData(y); HYPRE_Int size = hypre_VectorSize(x[0]); HYPRE_Int i, j, jstart, restk; restk = (k - (k / 4 * 4)); if (k > 3) { for (j = 0; j < k - 3; j += 4) { jstart = j * size; #if defined(HYPRE_USING_OPENMP) #pragma omp parallel for private(i) HYPRE_SMP_SCHEDULE #endif for (i = 0; i < size; i++) { y_data[i] += alpha[j] * x_data[jstart + i] + alpha[j + 1] * x_data[jstart + i + size] + alpha[j + 2] * x_data[(j + 2) * size + i] + alpha[j + 3] * x_data[(j + 3) * size + i]; } } } if (restk == 1) { jstart = (k - 1) * size; #if defined(HYPRE_USING_OPENMP) #pragma omp parallel for private(i) HYPRE_SMP_SCHEDULE #endif for (i = 0; i < size; i++) { y_data[i] += alpha[k - 1] * x_data[jstart + i]; } } else if (restk == 2) { jstart = (k - 2) * size; #if defined(HYPRE_USING_OPENMP) #pragma omp parallel for private(i) HYPRE_SMP_SCHEDULE #endif for (i = 0; i < size; i++) { y_data[i] += alpha[k - 2] * x_data[jstart + i] + alpha[k - 1] * x_data[jstart + size + i]; } } else if (restk == 3) { jstart = (k - 3) * size; #if defined(HYPRE_USING_OPENMP) #pragma omp parallel for private(i) HYPRE_SMP_SCHEDULE #endif for (i = 0; i < size; i++) { y_data[i] += alpha[k - 3] * x_data[jstart + i] + alpha[k - 2] * x_data[jstart + size + i] + alpha[k - 1] * x_data[(k - 1) * size + i]; } } return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_SeqVectorMassAxpy *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SeqVectorMassAxpy( HYPRE_Complex *alpha, hypre_Vector **x, hypre_Vector *y, HYPRE_Int k, HYPRE_Int unroll) { HYPRE_Complex *x_data = hypre_VectorData(x[0]); HYPRE_Complex *y_data = hypre_VectorData(y); HYPRE_Int size = hypre_VectorSize(x[0]); HYPRE_Int i, j, jstart; if (unroll == 8) { hypre_SeqVectorMassAxpy8(alpha, x, y, k); return hypre_error_flag; } else if (unroll == 4) { hypre_SeqVectorMassAxpy4(alpha, x, y, k); return hypre_error_flag; } else { for (j = 0; j < k; j++) { jstart = j * size; #if defined(HYPRE_USING_OPENMP) #pragma omp parallel for private(i) HYPRE_SMP_SCHEDULE #endif for (i = 0; i < size; i++) { y_data[i] += alpha[j] * x_data[jstart + i]; } } } return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_SeqVectorMassInnerProd8 *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SeqVectorMassInnerProd8( hypre_Vector *x, hypre_Vector **y, HYPRE_Int k, HYPRE_Real *result) { HYPRE_Complex *x_data = hypre_VectorData(x); HYPRE_Complex *y_data = hypre_VectorData(y[0]); HYPRE_Int size = hypre_VectorSize(x); HYPRE_Int i, j, restk; HYPRE_Real res1; HYPRE_Real res2; HYPRE_Real res3; HYPRE_Real res4; HYPRE_Real res5; HYPRE_Real res6; HYPRE_Real res7; HYPRE_Real res8; HYPRE_Int jstart; HYPRE_Int jstart1; HYPRE_Int jstart2; HYPRE_Int jstart3; HYPRE_Int jstart4; HYPRE_Int jstart5; HYPRE_Int jstart6; HYPRE_Int jstart7; restk = (k - (k / 8 * 8)); if (k > 7) { for (j = 0; j < k - 7; j += 8) { res1 = 0; res2 = 0; res3 = 0; res4 = 0; res5 = 0; res6 = 0; res7 = 0; res8 = 0; jstart = j * size; jstart1 = jstart + size; jstart2 = jstart1 + size; jstart3 = jstart2 + size; jstart4 = jstart3 + size; jstart5 = jstart4 + size; jstart6 = jstart5 + size; jstart7 = jstart6 + size; #if defined(HYPRE_USING_OPENMP) #pragma omp parallel for private(i) reduction(+:res1,res2,res3,res4,res5,res6,res7,res8) HYPRE_SMP_SCHEDULE #endif for (i = 0; i < size; i++) { res1 += hypre_conj(y_data[jstart + i]) * x_data[i]; res2 += hypre_conj(y_data[jstart1 + i]) * x_data[i]; res3 += hypre_conj(y_data[jstart2 + i]) * x_data[i]; res4 += hypre_conj(y_data[jstart3 + i]) * x_data[i]; res5 += hypre_conj(y_data[jstart4 + i]) * x_data[i]; res6 += hypre_conj(y_data[jstart5 + i]) * x_data[i]; res7 += hypre_conj(y_data[jstart6 + i]) * x_data[i]; res8 += hypre_conj(y_data[jstart7 + i]) * x_data[i]; } result[j] = res1; result[j + 1] = res2; result[j + 2] = res3; result[j + 3] = res4; result[j + 4] = res5; result[j + 5] = res6; result[j + 6] = res7; result[j + 7] = res8; } } if (restk == 1) { res1 = 0; jstart = (k - 1) * size; #if defined(HYPRE_USING_OPENMP) #pragma omp parallel for private(i) reduction(+:res1) HYPRE_SMP_SCHEDULE #endif for (i = 0; i < size; i++) { res1 += hypre_conj(y_data[jstart + i]) * x_data[i]; } result[k - 1] = res1; } else if (restk == 2) { res1 = 0; res2 = 0; jstart = (k - 2) * size; jstart1 = jstart + size; #if defined(HYPRE_USING_OPENMP) #pragma omp parallel for private(i) reduction(+:res1,res2) HYPRE_SMP_SCHEDULE #endif for (i = 0; i < size; i++) { res1 += hypre_conj(y_data[jstart + i]) * x_data[i]; res2 += hypre_conj(y_data[jstart1 + i]) * x_data[i]; } result[k - 2] = res1; result[k - 1] = res2; } else if (restk == 3) { res1 = 0; res2 = 0; res3 = 0; jstart = (k - 3) * size; jstart1 = jstart + size; jstart2 = jstart1 + size; #if defined(HYPRE_USING_OPENMP) #pragma omp parallel for private(i) reduction(+:res1,res2,res3) HYPRE_SMP_SCHEDULE #endif for (i = 0; i < size; i++) { res1 += hypre_conj(y_data[jstart + i]) * x_data[i]; res2 += hypre_conj(y_data[jstart1 + i]) * x_data[i]; res3 += hypre_conj(y_data[jstart2 + i]) * x_data[i]; } result[k - 3] = res1; result[k - 2] = res2; result[k - 1] = res3; } else if (restk == 4) { res1 = 0; res2 = 0; res3 = 0; res4 = 0; jstart = (k - 4) * size; jstart1 = jstart + size; jstart2 = jstart1 + size; jstart3 = jstart2 + size; #if defined(HYPRE_USING_OPENMP) #pragma omp parallel for private(i) reduction(+:res1,res2,res3,res4) HYPRE_SMP_SCHEDULE #endif for (i = 0; i < size; i++) { res1 += hypre_conj(y_data[jstart + i]) * x_data[i]; res2 += hypre_conj(y_data[jstart1 + i]) * x_data[i]; res3 += hypre_conj(y_data[jstart2 + i]) * x_data[i]; res4 += hypre_conj(y_data[jstart3 + i]) * x_data[i]; } result[k - 4] = res1; result[k - 3] = res2; result[k - 2] = res3; result[k - 1] = res4; } else if (restk == 5) { res1 = 0; res2 = 0; res3 = 0; res4 = 0; res5 = 0; jstart = (k - 5) * size; jstart1 = jstart + size; jstart2 = jstart1 + size; jstart3 = jstart2 + size; jstart4 = jstart3 + size; #if defined(HYPRE_USING_OPENMP) #pragma omp parallel for private(i) reduction(+:res1,res2,res3,res4,res5) HYPRE_SMP_SCHEDULE #endif for (i = 0; i < size; i++) { res1 += hypre_conj(y_data[jstart + i]) * x_data[i]; res2 += hypre_conj(y_data[jstart1 + i]) * x_data[i]; res3 += hypre_conj(y_data[jstart2 + i]) * x_data[i]; res4 += hypre_conj(y_data[jstart3 + i]) * x_data[i]; res5 += hypre_conj(y_data[jstart4 + i]) * x_data[i]; } result[k - 5] = res1; result[k - 4] = res2; result[k - 3] = res3; result[k - 2] = res4; result[k - 1] = res5; } else if (restk == 6) { res1 = 0; res2 = 0; res3 = 0; res4 = 0; res5 = 0; res6 = 0; jstart = (k - 6) * size; jstart1 = jstart + size; jstart2 = jstart1 + size; jstart3 = jstart2 + size; jstart4 = jstart3 + size; jstart5 = jstart4 + size; #if defined(HYPRE_USING_OPENMP) #pragma omp parallel for private(i) reduction(+:res1,res2,res3,res4,res5,res6) HYPRE_SMP_SCHEDULE #endif for (i = 0; i < size; i++) { res1 += hypre_conj(y_data[jstart + i]) * x_data[i]; res2 += hypre_conj(y_data[jstart1 + i]) * x_data[i]; res3 += hypre_conj(y_data[jstart2 + i]) * x_data[i]; res4 += hypre_conj(y_data[jstart3 + i]) * x_data[i]; res5 += hypre_conj(y_data[jstart4 + i]) * x_data[i]; res6 += hypre_conj(y_data[jstart5 + i]) * x_data[i]; } result[k - 6] = res1; result[k - 5] = res2; result[k - 4] = res3; result[k - 3] = res4; result[k - 2] = res5; result[k - 1] = res6; } else if (restk == 7) { res1 = 0; res2 = 0; res3 = 0; res4 = 0; res5 = 0; res6 = 0; res7 = 0; jstart = (k - 7) * size; jstart1 = jstart + size; jstart2 = jstart1 + size; jstart3 = jstart2 + size; jstart4 = jstart3 + size; jstart5 = jstart4 + size; jstart6 = jstart5 + size; #if defined(HYPRE_USING_OPENMP) #pragma omp parallel for private(i) reduction(+:res1,res2,res3,res4,res5,res6,res7) HYPRE_SMP_SCHEDULE #endif for (i = 0; i < size; i++) { res1 += hypre_conj(y_data[jstart + i]) * x_data[i]; res2 += hypre_conj(y_data[jstart1 + i]) * x_data[i]; res3 += hypre_conj(y_data[jstart2 + i]) * x_data[i]; res4 += hypre_conj(y_data[jstart3 + i]) * x_data[i]; res5 += hypre_conj(y_data[jstart4 + i]) * x_data[i]; res6 += hypre_conj(y_data[jstart5 + i]) * x_data[i]; res7 += hypre_conj(y_data[jstart6 + i]) * x_data[i]; } result[k - 7] = res1; result[k - 6] = res2; result[k - 5] = res3; result[k - 4] = res4; result[k - 3] = res5; result[k - 2] = res6; result[k - 1] = res7; } return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_SeqVectorMassInnerProd4 *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SeqVectorMassInnerProd4( hypre_Vector *x, hypre_Vector **y, HYPRE_Int k, HYPRE_Real *result) { HYPRE_Complex *x_data = hypre_VectorData(x); HYPRE_Complex *y_data = hypre_VectorData(y[0]); HYPRE_Int size = hypre_VectorSize(x); HYPRE_Int i, j, restk; HYPRE_Real res1; HYPRE_Real res2; HYPRE_Real res3; HYPRE_Real res4; HYPRE_Int jstart; HYPRE_Int jstart1; HYPRE_Int jstart2; HYPRE_Int jstart3; restk = (k - (k / 4 * 4)); if (k > 3) { for (j = 0; j < k - 3; j += 4) { res1 = 0; res2 = 0; res3 = 0; res4 = 0; jstart = j * size; jstart1 = jstart + size; jstart2 = jstart1 + size; jstart3 = jstart2 + size; #if defined(HYPRE_USING_OPENMP) #pragma omp parallel for private(i) reduction(+:res1,res2,res3,res4) HYPRE_SMP_SCHEDULE #endif for (i = 0; i < size; i++) { res1 += hypre_conj(y_data[jstart + i]) * x_data[i]; res2 += hypre_conj(y_data[jstart1 + i]) * x_data[i]; res3 += hypre_conj(y_data[jstart2 + i]) * x_data[i]; res4 += hypre_conj(y_data[jstart3 + i]) * x_data[i]; } result[j] = res1; result[j + 1] = res2; result[j + 2] = res3; result[j + 3] = res4; } } if (restk == 1) { res1 = 0; jstart = (k - 1) * size; #if defined(HYPRE_USING_OPENMP) #pragma omp parallel for private(i) reduction(+:res1) HYPRE_SMP_SCHEDULE #endif for (i = 0; i < size; i++) { res1 += hypre_conj(y_data[jstart + i]) * x_data[i]; } result[k - 1] = res1; } else if (restk == 2) { res1 = 0; res2 = 0; jstart = (k - 2) * size; jstart1 = jstart + size; #if defined(HYPRE_USING_OPENMP) #pragma omp parallel for private(i) reduction(+:res1,res2) HYPRE_SMP_SCHEDULE #endif for (i = 0; i < size; i++) { res1 += hypre_conj(y_data[jstart + i]) * x_data[i]; res2 += hypre_conj(y_data[jstart1 + i]) * x_data[i]; } result[k - 2] = res1; result[k - 1] = res2; } else if (restk == 3) { res1 = 0; res2 = 0; res3 = 0; jstart = (k - 3) * size; jstart1 = jstart + size; jstart2 = jstart1 + size; #if defined(HYPRE_USING_OPENMP) #pragma omp parallel for private(i) reduction(+:res1,res2,res3) HYPRE_SMP_SCHEDULE #endif for (i = 0; i < size; i++) { res1 += hypre_conj(y_data[jstart + i]) * x_data[i]; res2 += hypre_conj(y_data[jstart1 + i]) * x_data[i]; res3 += hypre_conj(y_data[jstart2 + i]) * x_data[i]; } result[k - 3] = res1; result[k - 2] = res2; result[k - 1] = res3; } return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_SeqVectorMassDotpTwo8 *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SeqVectorMassDotpTwo8( hypre_Vector *x, hypre_Vector *y, hypre_Vector **z, HYPRE_Int k, HYPRE_Real *result_x, HYPRE_Real *result_y) { HYPRE_Complex *x_data = hypre_VectorData(x); HYPRE_Complex *y_data = hypre_VectorData(y); HYPRE_Complex *z_data = hypre_VectorData(z[0]); HYPRE_Int size = hypre_VectorSize(x); HYPRE_Int i, j, restk; HYPRE_Real res_x1; HYPRE_Real res_x2; HYPRE_Real res_x3; HYPRE_Real res_x4; HYPRE_Real res_x5; HYPRE_Real res_x6; HYPRE_Real res_x7; HYPRE_Real res_x8; HYPRE_Real res_y1; HYPRE_Real res_y2; HYPRE_Real res_y3; HYPRE_Real res_y4; HYPRE_Real res_y5; HYPRE_Real res_y6; HYPRE_Real res_y7; HYPRE_Real res_y8; HYPRE_Int jstart; HYPRE_Int jstart1; HYPRE_Int jstart2; HYPRE_Int jstart3; HYPRE_Int jstart4; HYPRE_Int jstart5; HYPRE_Int jstart6; HYPRE_Int jstart7; restk = (k - (k / 8 * 8)); if (k > 7) { for (j = 0; j < k - 7; j += 8) { res_x1 = 0; res_x2 = 0; res_x3 = 0; res_x4 = 0; res_x5 = 0; res_x6 = 0; res_x7 = 0; res_x8 = 0; res_y1 = 0; res_y2 = 0; res_y3 = 0; res_y4 = 0; res_y5 = 0; res_y6 = 0; res_y7 = 0; res_y8 = 0; jstart = j * size; jstart1 = jstart + size; jstart2 = jstart1 + size; jstart3 = jstart2 + size; jstart4 = jstart3 + size; jstart5 = jstart4 + size; jstart6 = jstart5 + size; jstart7 = jstart6 + size; #if defined(HYPRE_USING_OPENMP) #pragma omp parallel for private(i) reduction(+:res_x1,res_x2,res_x3,res_x4,res_x5,res_x6,res_x7,res_x8,res_y1,res_y2,res_y3,res_y4,res_y5,res_y6,res_y7,res_y8) HYPRE_SMP_SCHEDULE #endif for (i = 0; i < size; i++) { res_x1 += hypre_conj(z_data[jstart + i]) * x_data[i]; res_y1 += hypre_conj(z_data[jstart + i]) * y_data[i]; res_x2 += hypre_conj(z_data[jstart1 + i]) * x_data[i]; res_y2 += hypre_conj(z_data[jstart1 + i]) * y_data[i]; res_x3 += hypre_conj(z_data[jstart2 + i]) * x_data[i]; res_y3 += hypre_conj(z_data[jstart2 + i]) * y_data[i]; res_x4 += hypre_conj(z_data[jstart3 + i]) * x_data[i]; res_y4 += hypre_conj(z_data[jstart3 + i]) * y_data[i]; res_x5 += hypre_conj(z_data[jstart4 + i]) * x_data[i]; res_y5 += hypre_conj(z_data[jstart4 + i]) * y_data[i]; res_x6 += hypre_conj(z_data[jstart5 + i]) * x_data[i]; res_y6 += hypre_conj(z_data[jstart5 + i]) * y_data[i]; res_x7 += hypre_conj(z_data[jstart6 + i]) * x_data[i]; res_y7 += hypre_conj(z_data[jstart6 + i]) * y_data[i]; res_x8 += hypre_conj(z_data[jstart7 + i]) * x_data[i]; res_y8 += hypre_conj(z_data[jstart7 + i]) * y_data[i]; } result_x[j] = res_x1; result_x[j + 1] = res_x2; result_x[j + 2] = res_x3; result_x[j + 3] = res_x4; result_x[j + 4] = res_x5; result_x[j + 5] = res_x6; result_x[j + 6] = res_x7; result_x[j + 7] = res_x8; result_y[j] = res_y1; result_y[j + 1] = res_y2; result_y[j + 2] = res_y3; result_y[j + 3] = res_y4; result_y[j + 4] = res_y5; result_y[j + 5] = res_y6; result_y[j + 6] = res_y7; result_y[j + 7] = res_y8; } } if (restk == 1) { res_x1 = 0; res_y1 = 0; jstart = (k - 1) * size; #if defined(HYPRE_USING_OPENMP) #pragma omp parallel for private(i) reduction(+:res_x1,res_y1) HYPRE_SMP_SCHEDULE #endif for (i = 0; i < size; i++) { res_x1 += hypre_conj(z_data[jstart + i]) * x_data[i]; res_y1 += hypre_conj(z_data[jstart + i]) * y_data[i]; } result_x[k - 1] = res_x1; result_y[k - 1] = res_y1; } else if (restk == 2) { res_x1 = 0; res_x2 = 0; res_y1 = 0; res_y2 = 0; jstart = (k - 2) * size; jstart1 = jstart + size; #if defined(HYPRE_USING_OPENMP) #pragma omp parallel for private(i) reduction(+:res_x1,res_x2,res_y1,res_y2) HYPRE_SMP_SCHEDULE #endif for (i = 0; i < size; i++) { res_x1 += hypre_conj(z_data[jstart + i]) * x_data[i]; res_y1 += hypre_conj(z_data[jstart + i]) * y_data[i]; res_x2 += hypre_conj(z_data[jstart1 + i]) * x_data[i]; res_y2 += hypre_conj(z_data[jstart1 + i]) * y_data[i]; } result_x[k - 2] = res_x1; result_x[k - 1] = res_x2; result_y[k - 2] = res_y1; result_y[k - 1] = res_y2; } else if (restk == 3) { res_x1 = 0; res_x2 = 0; res_x3 = 0; res_y1 = 0; res_y2 = 0; res_y3 = 0; jstart = (k - 3) * size; jstart1 = jstart + size; jstart2 = jstart1 + size; #if defined(HYPRE_USING_OPENMP) #pragma omp parallel for private(i) reduction(+:res_x1,res_x2,res_x3,res_y1,res_y2,res_y3) HYPRE_SMP_SCHEDULE #endif for (i = 0; i < size; i++) { res_x1 += hypre_conj(z_data[jstart + i]) * x_data[i]; res_y1 += hypre_conj(z_data[jstart + i]) * y_data[i]; res_x2 += hypre_conj(z_data[jstart1 + i]) * x_data[i]; res_y2 += hypre_conj(z_data[jstart1 + i]) * y_data[i]; res_x3 += hypre_conj(z_data[jstart2 + i]) * x_data[i]; res_y3 += hypre_conj(z_data[jstart2 + i]) * y_data[i]; } result_x[k - 3] = res_x1; result_x[k - 2] = res_x2; result_x[k - 1] = res_x3; result_y[k - 3] = res_y1; result_y[k - 2] = res_y2; result_y[k - 1] = res_y3; } else if (restk == 4) { res_x1 = 0; res_x2 = 0; res_x3 = 0; res_x4 = 0; res_y1 = 0; res_y2 = 0; res_y3 = 0; res_y4 = 0; jstart = (k - 4) * size; jstart1 = jstart + size; jstart2 = jstart1 + size; jstart3 = jstart2 + size; #if defined(HYPRE_USING_OPENMP) #pragma omp parallel for private(i) reduction(+:res_x1,res_x2,res_x3,res_x4,res_y1,res_y2,res_y3,res_y4) HYPRE_SMP_SCHEDULE #endif for (i = 0; i < size; i++) { res_x1 += hypre_conj(z_data[jstart + i]) * x_data[i]; res_y1 += hypre_conj(z_data[jstart + i]) * y_data[i]; res_x2 += hypre_conj(z_data[jstart1 + i]) * x_data[i]; res_y2 += hypre_conj(z_data[jstart1 + i]) * y_data[i]; res_x3 += hypre_conj(z_data[jstart2 + i]) * x_data[i]; res_y3 += hypre_conj(z_data[jstart2 + i]) * y_data[i]; res_x4 += hypre_conj(z_data[jstart3 + i]) * x_data[i]; res_y4 += hypre_conj(z_data[jstart3 + i]) * y_data[i]; } result_x[k - 4] = res_x1; result_x[k - 3] = res_x2; result_x[k - 2] = res_x3; result_x[k - 1] = res_x4; result_y[k - 4] = res_y1; result_y[k - 3] = res_y2; result_y[k - 2] = res_y3; result_y[k - 1] = res_y4; } else if (restk == 5) { res_x1 = 0; res_x2 = 0; res_x3 = 0; res_x4 = 0; res_x5 = 0; res_y1 = 0; res_y2 = 0; res_y3 = 0; res_y4 = 0; res_y5 = 0; jstart = (k - 5) * size; jstart1 = jstart + size; jstart2 = jstart1 + size; jstart3 = jstart2 + size; jstart4 = jstart3 + size; #if defined(HYPRE_USING_OPENMP) #pragma omp parallel for private(i) reduction(+:res_x1,res_x2,res_x3,res_x4,res_x5,res_y1,res_y2,res_y3,res_y4,res_y5) HYPRE_SMP_SCHEDULE #endif for (i = 0; i < size; i++) { res_x1 += hypre_conj(z_data[jstart + i]) * x_data[i]; res_y1 += hypre_conj(z_data[jstart + i]) * y_data[i]; res_x2 += hypre_conj(z_data[jstart1 + i]) * x_data[i]; res_y2 += hypre_conj(z_data[jstart1 + i]) * y_data[i]; res_x3 += hypre_conj(z_data[jstart2 + i]) * x_data[i]; res_y3 += hypre_conj(z_data[jstart2 + i]) * y_data[i]; res_x4 += hypre_conj(z_data[jstart3 + i]) * x_data[i]; res_y4 += hypre_conj(z_data[jstart3 + i]) * y_data[i]; res_x5 += hypre_conj(z_data[jstart4 + i]) * x_data[i]; res_y5 += hypre_conj(z_data[jstart4 + i]) * y_data[i]; } result_x[k - 5] = res_x1; result_x[k - 4] = res_x2; result_x[k - 3] = res_x3; result_x[k - 2] = res_x4; result_x[k - 1] = res_x5; result_y[k - 5] = res_y1; result_y[k - 4] = res_y2; result_y[k - 3] = res_y3; result_y[k - 2] = res_y4; result_y[k - 1] = res_y5; } else if (restk == 6) { res_x1 = 0; res_x2 = 0; res_x3 = 0; res_x4 = 0; res_x5 = 0; res_x6 = 0; res_y1 = 0; res_y2 = 0; res_y3 = 0; res_y4 = 0; res_y5 = 0; res_y6 = 0; jstart = (k - 6) * size; jstart1 = jstart + size; jstart2 = jstart1 + size; jstart3 = jstart2 + size; jstart4 = jstart3 + size; jstart5 = jstart4 + size; #if defined(HYPRE_USING_OPENMP) #pragma omp parallel for private(i) reduction(+:res_x1,res_x2,res_x3,res_x4,res_x5,res_x6,res_y1,res_y2,res_y3,res_y4,res_y5,res_y6) HYPRE_SMP_SCHEDULE #endif for (i = 0; i < size; i++) { res_x1 += hypre_conj(z_data[jstart + i]) * x_data[i]; res_y1 += hypre_conj(z_data[jstart + i]) * y_data[i]; res_x2 += hypre_conj(z_data[jstart1 + i]) * x_data[i]; res_y2 += hypre_conj(z_data[jstart1 + i]) * y_data[i]; res_x3 += hypre_conj(z_data[jstart2 + i]) * x_data[i]; res_y3 += hypre_conj(z_data[jstart2 + i]) * y_data[i]; res_x4 += hypre_conj(z_data[jstart3 + i]) * x_data[i]; res_y4 += hypre_conj(z_data[jstart3 + i]) * y_data[i]; res_x5 += hypre_conj(z_data[jstart4 + i]) * x_data[i]; res_y5 += hypre_conj(z_data[jstart4 + i]) * y_data[i]; res_x6 += hypre_conj(z_data[jstart5 + i]) * x_data[i]; res_y6 += hypre_conj(z_data[jstart5 + i]) * y_data[i]; } result_x[k - 6] = res_x1; result_x[k - 5] = res_x2; result_x[k - 4] = res_x3; result_x[k - 3] = res_x4; result_x[k - 2] = res_x5; result_x[k - 1] = res_x6; result_y[k - 6] = res_y1; result_y[k - 5] = res_y2; result_y[k - 4] = res_y3; result_y[k - 3] = res_y4; result_y[k - 2] = res_y5; result_y[k - 1] = res_y6; } else if (restk == 7) { res_x1 = 0; res_x2 = 0; res_x3 = 0; res_x4 = 0; res_x5 = 0; res_x6 = 0; res_x7 = 0; res_y1 = 0; res_y2 = 0; res_y3 = 0; res_y4 = 0; res_y5 = 0; res_y6 = 0; res_y7 = 0; jstart = (k - 7) * size; jstart1 = jstart + size; jstart2 = jstart1 + size; jstart3 = jstart2 + size; jstart4 = jstart3 + size; jstart5 = jstart4 + size; jstart6 = jstart5 + size; #if defined(HYPRE_USING_OPENMP) #pragma omp parallel for private(i) reduction(+:res_x1,res_x2,res_x3,res_x4,res_x5,res_x6,res_x7,res_y1,res_y2,res_y3,res_y4,res_y5,res_y6,res_y7) HYPRE_SMP_SCHEDULE #endif for (i = 0; i < size; i++) { res_x1 += hypre_conj(z_data[jstart + i]) * x_data[i]; res_y1 += hypre_conj(z_data[jstart + i]) * y_data[i]; res_x2 += hypre_conj(z_data[jstart1 + i]) * x_data[i]; res_y2 += hypre_conj(z_data[jstart1 + i]) * y_data[i]; res_x3 += hypre_conj(z_data[jstart2 + i]) * x_data[i]; res_y3 += hypre_conj(z_data[jstart2 + i]) * y_data[i]; res_x4 += hypre_conj(z_data[jstart3 + i]) * x_data[i]; res_y4 += hypre_conj(z_data[jstart3 + i]) * y_data[i]; res_x5 += hypre_conj(z_data[jstart4 + i]) * x_data[i]; res_y5 += hypre_conj(z_data[jstart4 + i]) * y_data[i]; res_x6 += hypre_conj(z_data[jstart5 + i]) * x_data[i]; res_y6 += hypre_conj(z_data[jstart5 + i]) * y_data[i]; res_x7 += hypre_conj(z_data[jstart6 + i]) * x_data[i]; res_y7 += hypre_conj(z_data[jstart6 + i]) * y_data[i]; } result_x[k - 7] = res_x1; result_x[k - 6] = res_x2; result_x[k - 5] = res_x3; result_x[k - 4] = res_x4; result_x[k - 3] = res_x5; result_x[k - 2] = res_x6; result_x[k - 1] = res_x7; result_y[k - 7] = res_y1; result_y[k - 6] = res_y2; result_y[k - 5] = res_y3; result_y[k - 4] = res_y4; result_y[k - 3] = res_y5; result_y[k - 2] = res_y6; result_y[k - 1] = res_y7; } return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_SeqVectorMassDotpTwo4 *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SeqVectorMassDotpTwo4( hypre_Vector *x, hypre_Vector *y, hypre_Vector **z, HYPRE_Int k, HYPRE_Real *result_x, HYPRE_Real *result_y) { HYPRE_Complex *x_data = hypre_VectorData(x); HYPRE_Complex *y_data = hypre_VectorData(y); HYPRE_Complex *z_data = hypre_VectorData(z[0]); HYPRE_Int size = hypre_VectorSize(x); HYPRE_Int i, j, restk; HYPRE_Real res_x1; HYPRE_Real res_x2; HYPRE_Real res_x3; HYPRE_Real res_x4; HYPRE_Real res_y1; HYPRE_Real res_y2; HYPRE_Real res_y3; HYPRE_Real res_y4; HYPRE_Int jstart; HYPRE_Int jstart1; HYPRE_Int jstart2; HYPRE_Int jstart3; restk = (k - (k / 4 * 4)); if (k > 3) { for (j = 0; j < k - 3; j += 4) { res_x1 = 0; res_x2 = 0; res_x3 = 0; res_x4 = 0; res_y1 = 0; res_y2 = 0; res_y3 = 0; res_y4 = 0; jstart = j * size; jstart1 = jstart + size; jstart2 = jstart1 + size; jstart3 = jstart2 + size; #if defined(HYPRE_USING_OPENMP) #pragma omp parallel for private(i) reduction(+:res_x1,res_x2,res_x3,res_x4,res_y1,res_y2,res_y3,res_y4) HYPRE_SMP_SCHEDULE #endif for (i = 0; i < size; i++) { res_x1 += hypre_conj(z_data[jstart + i]) * x_data[i]; res_y1 += hypre_conj(z_data[jstart + i]) * y_data[i]; res_x2 += hypre_conj(z_data[jstart1 + i]) * x_data[i]; res_y2 += hypre_conj(z_data[jstart1 + i]) * y_data[i]; res_x3 += hypre_conj(z_data[jstart2 + i]) * x_data[i]; res_y3 += hypre_conj(z_data[jstart2 + i]) * y_data[i]; res_x4 += hypre_conj(z_data[jstart3 + i]) * x_data[i]; res_y4 += hypre_conj(z_data[jstart3 + i]) * y_data[i]; } result_x[j] = res_x1; result_x[j + 1] = res_x2; result_x[j + 2] = res_x3; result_x[j + 3] = res_x4; result_y[j] = res_y1; result_y[j + 1] = res_y2; result_y[j + 2] = res_y3; result_y[j + 3] = res_y4; } } if (restk == 1) { res_x1 = 0; res_y1 = 0; jstart = (k - 1) * size; #if defined(HYPRE_USING_OPENMP) #pragma omp parallel for private(i) reduction(+:res_x1,res_y1) HYPRE_SMP_SCHEDULE #endif for (i = 0; i < size; i++) { res_x1 += hypre_conj(z_data[jstart + i]) * x_data[i]; res_y1 += hypre_conj(z_data[jstart + i]) * y_data[i]; } result_x[k - 1] = res_x1; result_y[k - 1] = res_y1; } else if (restk == 2) { res_x1 = 0; res_x2 = 0; res_y1 = 0; res_y2 = 0; jstart = (k - 2) * size; jstart1 = jstart + size; #if defined(HYPRE_USING_OPENMP) #pragma omp parallel for private(i) reduction(+:res_x1,res_x2,res_y1,res_y2) HYPRE_SMP_SCHEDULE #endif for (i = 0; i < size; i++) { res_x1 += hypre_conj(z_data[jstart + i]) * x_data[i]; res_y1 += hypre_conj(z_data[jstart + i]) * y_data[i]; res_x2 += hypre_conj(z_data[jstart1 + i]) * x_data[i]; res_y2 += hypre_conj(z_data[jstart1 + i]) * y_data[i]; } result_x[k - 2] = res_x1; result_x[k - 1] = res_x2; result_y[k - 2] = res_y1; result_y[k - 1] = res_y2; } else if (restk == 3) { res_x1 = 0; res_x2 = 0; res_x3 = 0; res_y1 = 0; res_y2 = 0; res_y3 = 0; jstart = (k - 3) * size; jstart1 = jstart + size; jstart2 = jstart1 + size; #if defined(HYPRE_USING_OPENMP) #pragma omp parallel for private(i) reduction(+:res_x1,res_x2,res_x3,res_y1,res_y2,res_y3) HYPRE_SMP_SCHEDULE #endif for (i = 0; i < size; i++) { res_x1 += hypre_conj(z_data[jstart + i]) * x_data[i]; res_y1 += hypre_conj(z_data[jstart + i]) * y_data[i]; res_x2 += hypre_conj(z_data[jstart1 + i]) * x_data[i]; res_y2 += hypre_conj(z_data[jstart1 + i]) * y_data[i]; res_x3 += hypre_conj(z_data[jstart2 + i]) * x_data[i]; res_y3 += hypre_conj(z_data[jstart2 + i]) * y_data[i]; } result_x[k - 3] = res_x1; result_x[k - 2] = res_x2; result_x[k - 1] = res_x3; result_y[k - 3] = res_y1; result_y[k - 2] = res_y2; result_y[k - 1] = res_y3; } return hypre_error_flag; } HYPRE_Int hypre_SeqVectorMassInnerProd( hypre_Vector *x, hypre_Vector **y, HYPRE_Int k, HYPRE_Int unroll, HYPRE_Real *result) { HYPRE_Complex *x_data = hypre_VectorData(x); HYPRE_Complex *y_data = hypre_VectorData(y[0]); HYPRE_Real res; HYPRE_Int size = hypre_VectorSize(x); HYPRE_Int i, j, jstart; if (unroll == 8) { hypre_SeqVectorMassInnerProd8(x, y, k, result); return hypre_error_flag; } else if (unroll == 4) { hypre_SeqVectorMassInnerProd4(x, y, k, result); return hypre_error_flag; } else { for (j = 0; j < k; j++) { res = 0; jstart = j * size; #if defined(HYPRE_USING_OPENMP) #pragma omp parallel for private(i) reduction(+:res) HYPRE_SMP_SCHEDULE #endif for (i = 0; i < size; i++) { res += hypre_conj(y_data[jstart + i]) * x_data[i]; } result[j] = res; } } return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_SeqVectorMassDotpTwo *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SeqVectorMassDotpTwo( hypre_Vector *x, hypre_Vector *y, hypre_Vector **z, HYPRE_Int k, HYPRE_Int unroll, HYPRE_Real *result_x, HYPRE_Real *result_y) { HYPRE_Complex *x_data = hypre_VectorData(x); HYPRE_Complex *y_data = hypre_VectorData(y); HYPRE_Complex *z_data = hypre_VectorData(z[0]); HYPRE_Real res_x, res_y; HYPRE_Int size = hypre_VectorSize(x); HYPRE_Int i, j, jstart; if (unroll == 8) { hypre_SeqVectorMassDotpTwo8(x, y, z, k, result_x, result_y); return hypre_error_flag; } else if (unroll == 4) { hypre_SeqVectorMassDotpTwo4(x, y, z, k, result_x, result_y); return hypre_error_flag; } else { for (j = 0; j < k; j++) { res_x = 0; //result_x[j]; res_y = 0; //result_y[j]; jstart = j * size; #if defined(HYPRE_USING_OPENMP) #pragma omp parallel for private(i) reduction(+:res_x,res_y) HYPRE_SMP_SCHEDULE #endif for (i = 0; i < size; i++) { res_x += hypre_conj(z_data[jstart + i]) * x_data[i]; res_y += hypre_conj(z_data[jstart + i]) * y_data[i]; } result_x[j] = res_x; result_y[j] = res_y; } } return hypre_error_flag; } hypre-2.33.0/src/seq_mv/vector_device.c000066400000000000000000000324701477326011500200100ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * Matvec functions for hypre_CSRMatrix class. * *****************************************************************************/ #include "_hypre_onedpl.hpp" #include "seq_mv.h" #include "_hypre_utilities.hpp" #include "seq_mv.hpp" #if defined(HYPRE_USING_GPU) || defined(HYPRE_USING_DEVICE_OPENMP) /*-------------------------------------------------------------------------- * hypre_SeqVectorSetConstantValuesDevice *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SeqVectorSetConstantValuesDevice( hypre_Vector *v, HYPRE_Complex value ) { HYPRE_Complex *vector_data = hypre_VectorData(v); HYPRE_Int num_vectors = hypre_VectorNumVectors(v); HYPRE_Int size = hypre_VectorSize(v); HYPRE_Int total_size = size * num_vectors; //hypre_SeqVectorPrefetch(v, HYPRE_MEMORY_DEVICE); #if defined(HYPRE_USING_GPU) hypreDevice_ComplexFilln( vector_data, total_size, value ); hypre_SyncComputeStream(); #elif defined(HYPRE_USING_DEVICE_OPENMP) HYPRE_Int i; #pragma omp target teams distribute parallel for private(i) is_device_ptr(vector_data) for (i = 0; i < total_size; i++) { vector_data[i] = value; } #endif return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_SeqVectorScaleDevice *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SeqVectorScaleDevice( HYPRE_Complex alpha, hypre_Vector *y ) { HYPRE_Complex *y_data = hypre_VectorData(y); HYPRE_Int num_vectors = hypre_VectorNumVectors(y); HYPRE_Int size = hypre_VectorSize(y); HYPRE_Int total_size = size * num_vectors; hypre_GpuProfilingPushRange("SeqVectorScale"); //hypre_SeqVectorPrefetch(y, HYPRE_MEMORY_DEVICE); #if defined(HYPRE_USING_GPU) #if ( defined(HYPRE_USING_CUDA) || defined(HYPRE_USING_HIP) ) && defined(HYPRE_USING_CUBLAS) HYPRE_CUBLAS_CALL( hypre_cublas_scal(hypre_HandleCublasHandle(hypre_handle()), total_size, &alpha, y_data, 1) ); #elif defined(HYPRE_USING_SYCL) && defined(HYPRE_USING_ONEMKLBLAS) HYPRE_ONEMKL_CALL( oneapi::mkl::blas::scal(*hypre_HandleComputeStream(hypre_handle()), total_size, alpha, y_data, 1).wait() ); #else hypreDevice_ComplexScalen( y_data, total_size, y_data, alpha ); #endif hypre_SyncComputeStream(); #elif defined(HYPRE_USING_DEVICE_OPENMP) HYPRE_Int i; #pragma omp target teams distribute parallel for private(i) is_device_ptr(y_data) for (i = 0; i < total_size; i++) { y_data[i] *= alpha; } #endif hypre_GpuProfilingPopRange(); return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_SeqVectorAxpyDevice *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SeqVectorAxpyDevice( HYPRE_Complex alpha, hypre_Vector *x, hypre_Vector *y ) { HYPRE_Complex *x_data = hypre_VectorData(x); HYPRE_Complex *y_data = hypre_VectorData(y); HYPRE_Int num_vectors = hypre_VectorNumVectors(x); HYPRE_Int size = hypre_VectorSize(x); HYPRE_Int total_size = size * num_vectors; #if defined(HYPRE_USING_GPU) #if ( defined(HYPRE_USING_CUDA) || defined(HYPRE_USING_HIP) ) && defined(HYPRE_USING_CUBLAS) HYPRE_CUBLAS_CALL( hypre_cublas_axpy(hypre_HandleCublasHandle(hypre_handle()), total_size, &alpha, x_data, 1, y_data, 1) ); #elif defined(HYPRE_USING_SYCL) && defined(HYPRE_USING_ONEMKLBLAS) HYPRE_ONEMKL_CALL( oneapi::mkl::blas::axpy(*hypre_HandleComputeStream(hypre_handle()), total_size, alpha, x_data, 1, y_data, 1).wait() ); #else hypreDevice_ComplexAxpyn(x_data, total_size, y_data, y_data, alpha); #endif hypre_SyncComputeStream(); #elif defined(HYPRE_USING_DEVICE_OPENMP) HYPRE_Int i; #pragma omp target teams distribute parallel for private(i) is_device_ptr(y_data, x_data) for (i = 0; i < total_size; i++) { y_data[i] += alpha * x_data[i]; } #endif return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_SeqVectorAxpyzDevice *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SeqVectorAxpyzDevice( HYPRE_Complex alpha, hypre_Vector *x, HYPRE_Complex beta, hypre_Vector *y, hypre_Vector *z ) { HYPRE_Complex *x_data = hypre_VectorData(x); HYPRE_Complex *y_data = hypre_VectorData(y); HYPRE_Complex *z_data = hypre_VectorData(z); HYPRE_Int num_vectors = hypre_VectorNumVectors(x); HYPRE_Int size = hypre_VectorSize(x); HYPRE_Int total_size = size * num_vectors; #if defined(HYPRE_USING_GPU) hypreDevice_ComplexAxpyzn(total_size, x_data, y_data, z_data, alpha, beta); hypre_SyncComputeStream(); #elif defined(HYPRE_USING_DEVICE_OPENMP) HYPRE_Int i; #pragma omp target teams distribute parallel for private(i) is_device_ptr(z_data, y_data, x_data) for (i = 0; i < total_size; i++) { z_data[i] = alpha * x_data[i] + beta * y_data[i]; } #endif return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_SeqVectorElmdivpyDevice *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SeqVectorElmdivpyDevice( hypre_Vector *x, hypre_Vector *b, hypre_Vector *y, HYPRE_Int *marker, HYPRE_Int marker_val ) { #if defined(HYPRE_USING_GPU) HYPRE_Complex *x_data = hypre_VectorData(x); HYPRE_Complex *b_data = hypre_VectorData(b); HYPRE_Complex *y_data = hypre_VectorData(y); HYPRE_Int num_vectors_x = hypre_VectorNumVectors(x); HYPRE_Int num_vectors_y = hypre_VectorNumVectors(y); HYPRE_Int num_vectors_b = hypre_VectorNumVectors(b); HYPRE_Int size = hypre_VectorSize(b); hypre_GpuProfilingPushRange("SeqVectorElmdivpyDevice"); if (num_vectors_b == 1) { if (num_vectors_x == 1) { if (marker) { hypreDevice_IVAXPYMarked(size, b_data, x_data, y_data, marker, marker_val); } else { hypreDevice_IVAXPY(size, b_data, x_data, y_data); } } #if !defined(HYPRE_USING_SYCL) else if (num_vectors_x == num_vectors_y) { if (!marker) { hypreDevice_IVAMXPMY(num_vectors_x, size, b_data, x_data, y_data); } else { hypre_error_w_msg(HYPRE_ERROR_GENERIC, "marker != NULL not supported!\n"); } } else { hypre_error_w_msg(HYPRE_ERROR_GENERIC, "Unsupported combination of num_vectors!\n"); } #else else { hypre_error_w_msg(HYPRE_ERROR_GENERIC, "num_vectors_x != 1 not supported for SYCL!\n"); } #endif } else { hypre_error_w_msg(HYPRE_ERROR_GENERIC, "num_vectors_b != 1 not supported!\n"); } hypre_SyncComputeStream(); hypre_GpuProfilingPopRange(); #elif defined(HYPRE_USING_OPENMP) hypre_error_w_msg(HYPRE_ERROR_GENERIC, "Not implemented for device OpenMP!\n"); #endif return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_SeqVectorInnerProdDevice *--------------------------------------------------------------------------*/ HYPRE_Real hypre_SeqVectorInnerProdDevice( hypre_Vector *x, hypre_Vector *y ) { HYPRE_Complex *x_data = hypre_VectorData(x); HYPRE_Complex *y_data = hypre_VectorData(y); HYPRE_Int num_vectors = hypre_VectorNumVectors(x); HYPRE_Int size = hypre_VectorSize(x); HYPRE_Int total_size = size * num_vectors; HYPRE_Real result = 0.0; //hypre_SeqVectorPrefetch(x, HYPRE_MEMORY_DEVICE); //hypre_SeqVectorPrefetch(y, HYPRE_MEMORY_DEVICE); #if defined(HYPRE_USING_GPU) #if defined(HYPRE_USING_CUDA) || defined(HYPRE_USING_HIP) #if defined(HYPRE_USING_CUBLAS) HYPRE_CUBLAS_CALL( hypre_cublas_dot(hypre_HandleCublasHandle(hypre_handle()), total_size, x_data, 1, y_data, 1, &result) ); #else result = HYPRE_THRUST_CALL( inner_product, x_data, x_data + total_size, y_data, 0.0 ); #endif #elif defined(HYPRE_USING_SYCL) #if defined(HYPRE_USING_ONEMKLBLAS) HYPRE_Real *result_dev = hypre_CTAlloc(HYPRE_Real, 1, HYPRE_MEMORY_DEVICE); HYPRE_ONEMKL_CALL( oneapi::mkl::blas::dot(*hypre_HandleComputeStream(hypre_handle()), total_size, x_data, 1, y_data, 1, result_dev).wait() ); hypre_TMemcpy(&result, result_dev, HYPRE_Real, 1, HYPRE_MEMORY_HOST, HYPRE_MEMORY_DEVICE); hypre_TFree(result_dev, HYPRE_MEMORY_DEVICE); #else result = HYPRE_ONEDPL_CALL( std::transform_reduce, x_data, x_data + total_size, y_data, 0.0 ); #endif #endif hypre_SyncComputeStream(); #elif defined(HYPRE_USING_DEVICE_OPENMP) HYPRE_Int i; #pragma omp target teams distribute parallel for private(i) reduction(+:result) is_device_ptr(y_data, x_data) map(result) for (i = 0; i < total_size; i++) { result += hypre_conj(y_data[i]) * x_data[i]; } #endif return result; } /*-------------------------------------------------------------------------- * hypre_SeqVectorSumEltsDevice *--------------------------------------------------------------------------*/ HYPRE_Complex hypre_SeqVectorSumEltsDevice( hypre_Vector *vector ) { HYPRE_Complex *data = hypre_VectorData(vector); HYPRE_Int num_vectors = hypre_VectorNumVectors(vector); HYPRE_Int size = hypre_VectorSize(vector); HYPRE_Int total_size = size * num_vectors; HYPRE_Complex sum = 0.0; #if defined(HYPRE_USING_GPU) sum = hypreDevice_ComplexReduceSum(total_size, data); hypre_SyncComputeStream(); #elif HYPRE_USING_DEVICE_OPENMP HYPRE_Int i; #pragma omp target teams distribute parallel for private(i) reduction(+:sum) is_device_ptr(data) map(sum) for (i = 0; i < total_size; i++) { sum += data[i]; } #endif return sum; } /*-------------------------------------------------------------------------- * hypre_SeqVectorStridedCopyDevice *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SeqVectorStridedCopyDevice( hypre_Vector *vector, HYPRE_Int istride, HYPRE_Int ostride, HYPRE_Int size, HYPRE_Complex *data) { HYPRE_Complex *v_data = hypre_VectorData(vector); #if defined(HYPRE_USING_CUDA) || defined(HYPRE_USING_HIP) auto begin = thrust::make_counting_iterator(0); auto last = thrust::make_counting_iterator(size / istride); HYPRE_THRUST_CALL( transform, begin, last, thrust::make_permutation_iterator(v_data, thrust::make_transform_iterator(begin, hypreFunctor_IndexStrided(ostride))), hypreFunctor_ArrayStridedAccess(istride, data) ); #elif defined(HYPRE_USING_DEVICE_OPENMP) || defined(HYPRE_USING_SYCL) hypre_error_w_msg(HYPRE_ERROR_GENERIC, "Not implemented!"); #endif return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_SeqVectorPrefetch *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SeqVectorPrefetch( hypre_Vector *x, HYPRE_MemoryLocation memory_location ) { #if defined(HYPRE_USING_UNIFIED_MEMORY) if (hypre_VectorMemoryLocation(x) != HYPRE_MEMORY_DEVICE) { /* hypre_error_w_msg(HYPRE_ERROR_GENERIC," Error! CUDA Prefetch with non-unified momory\n"); */ return hypre_error_flag; } HYPRE_Complex *x_data = hypre_VectorData(x); HYPRE_Int num_vectors = hypre_VectorNumVectors(x); HYPRE_Int size = hypre_VectorSize(x); HYPRE_Int total_size = size * num_vectors; if (total_size == 0) { return hypre_error_flag; } hypre_MemPrefetch(x_data, sizeof(HYPRE_Complex) * total_size, memory_location); #endif return hypre_error_flag; } #endif hypre-2.33.0/src/sstruct_ls/000077500000000000000000000000001477326011500157305ustar00rootroot00000000000000hypre-2.33.0/src/sstruct_ls/CMakeLists.txt000066400000000000000000000040731477326011500204740ustar00rootroot00000000000000# Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) set(HDRS HYPRE_sstruct_ls.h _hypre_sstruct_ls.h ) set(SRCS F90_HYPRE_sstruct_bicgstab.c F90_HYPRE_sstruct_gmres.c F90_HYPRE_sstruct_flexgmres.c F90_HYPRE_sstruct_lgmres.c F90_HYPRE_sstruct_InterFAC.c F90_HYPRE_sstruct_int.c F90_HYPRE_sstruct_maxwell.c F90_HYPRE_sstruct_pcg.c F90_HYPRE_sstruct_split.c F90_HYPRE_sstruct_sys_pfmg.c HYPRE_sstruct_bicgstab.c HYPRE_sstruct_gmres.c HYPRE_sstruct_flexgmres.c HYPRE_sstruct_lgmres.c HYPRE_sstruct_InterFAC.c HYPRE_sstruct_int.c HYPRE_sstruct_maxwell.c HYPRE_sstruct_pcg.c HYPRE_sstruct_split.c HYPRE_sstruct_sys_pfmg.c bsearch.c fac.c fac_amr_rap.c fac_amr_fcoarsen.c fac_amr_zero_data.c fac_cf_coarsen.c fac_cfstencil_box.c fac_CFInterfaceExtents.c fac_interp2.c fac_relax.c fac_restrict2.c fac_setup2.c fac_solve3.c fac_zero_cdata.c fac_zero_stencilcoef.c krylov.c krylov_sstruct.c eliminate_rowscols.c maxwell_grad.c maxwell_physbdy.c maxwell_PNedelec.c maxwell_PNedelec_bdy.c maxwell_semi_interp.c maxwell_solve.c maxwell_solve2.c maxwell_TV.c maxwell_TV_setup.c maxwell_zeroBC.c nd1_amge_interpolation.c node_relax.c sstruct_amr_intercommunication.c sstruct_owninfo.c sstruct_recvinfo.c sstruct_sendinfo.c sstruct_sharedDOFComm.c sys_pfmg.c sys_pfmg_relax.c sys_pfmg_setup.c sys_pfmg_setup_interp.c sys_pfmg_setup_rap.c sys_pfmg_solve.c sys_semi_interp.c sys_semi_restrict.c ) target_sources(${PROJECT_NAME} PRIVATE ${SRCS} ${HDRS} ) if (HYPRE_USING_GPU) set(GPU_SRCS fac_amr_fcoarsen.c fac_amr_rap.c fac_restrict2.c fac_setup2.c fac_zero_stencilcoef.c node_relax.c ) convert_filenames_to_full_paths(GPU_SRCS) set(HYPRE_GPU_SOURCES ${HYPRE_GPU_SOURCES} ${GPU_SRCS} PARENT_SCOPE) endif () convert_filenames_to_full_paths(HDRS) set(HYPRE_HEADERS ${HYPRE_HEADERS} ${HDRS} PARENT_SCOPE) hypre-2.33.0/src/sstruct_ls/F90_HYPRE_sstruct_InterFAC.c000066400000000000000000000345021477326011500226470ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * HYPRE_SStructFAC Routines * *****************************************************************************/ #include "_hypre_sstruct_ls.h" #include "fortran.h" #ifdef __cplusplus extern "C" { #endif /*-------------------------------------------------------------------------- * HYPRE_SStructFACCreate *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_sstructfaccreate, HYPRE_SSTRUCTFACCREATE) (hypre_F90_Comm *comm, hypre_F90_Obj *solver, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) ( HYPRE_SStructFACCreate( hypre_F90_PassComm (comm), hypre_F90_PassObjRef (HYPRE_SStructSolver, solver) )); } /*-------------------------------------------------------------------------- * HYPRE_SStructFACDestroy2 *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_sstructfacdestroy2, HYPRE_SSTRUCTFACDESTROY2) (hypre_F90_Obj *solver, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) ( HYPRE_SStructFACDestroy2( hypre_F90_PassObj (HYPRE_SStructSolver, solver) )); } /*-------------------------------------------------------------------------- * HYPRE_SStructFACAMR_RAP *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_sstructfacamrrap, HYPRE_SSTRUCTFACAMRRAP) (hypre_F90_Obj *A, HYPRE_Int (*rfactors)[HYPRE_MAXDIM], hypre_F90_Obj *facA, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) ( HYPRE_SStructFACAMR_RAP( hypre_F90_PassObj (HYPRE_SStructMatrix, A), rfactors, hypre_F90_PassObjRef (HYPRE_SStructMatrix, facA) )); } /*-------------------------------------------------------------------------- * HYPRE_SStructFACSetup2 *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_sstructfacsetup2, HYPRE_SSTRUCTFACSETUP2) (hypre_F90_Obj *solver, hypre_F90_Obj *A, hypre_F90_Obj *b, hypre_F90_Obj *x, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) ( HYPRE_SStructFACSetup2( hypre_F90_PassObj (HYPRE_SStructSolver, solver), hypre_F90_PassObj (HYPRE_SStructMatrix, A), hypre_F90_PassObj (HYPRE_SStructVector, b), hypre_F90_PassObj (HYPRE_SStructVector, x) )); } /*-------------------------------------------------------------------------- * HYPRE_SStructFACSolve3 *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_sstructfacsolve3, HYPRE_SSTRUCTFACSOLVE3) (hypre_F90_Obj *solver, hypre_F90_Obj *A, hypre_F90_Obj *b, hypre_F90_Obj *x, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) ( HYPRE_SStructFACSolve3( hypre_F90_PassObj (HYPRE_SStructSolver, solver), hypre_F90_PassObj (HYPRE_SStructMatrix, A), hypre_F90_PassObj (HYPRE_SStructVector, b), hypre_F90_PassObj (HYPRE_SStructVector, x))); } /*-------------------------------------------------------------------------- * HYPRE_SStructFACSetTol *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_sstructfacsettol, HYPRE_SSTRUCTFACSETTOL) (hypre_F90_Obj *solver, hypre_F90_Real *tol, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) ( HYPRE_SStructFACSetTol( hypre_F90_PassObj (HYPRE_SStructSolver, solver), hypre_F90_PassReal (tol) )); } /*-------------------------------------------------------------------------- * HYPRE_SStructFACSetPLevels *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_sstructfacsetplevels, HYPRE_SSTRUCTFACSETPLEVELS) (hypre_F90_Obj *solver, hypre_F90_Int *nparts, hypre_F90_IntArray *plevels, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) ( HYPRE_SStructFACSetPLevels( hypre_F90_PassObj (HYPRE_SStructSolver, solver), hypre_F90_PassInt (nparts), hypre_F90_PassIntArray (plevels))); } /*-------------------------------------------------------------------------- * HYPRE_SStructFACZeroCFSten *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_sstructfaczerocfsten, HYPRE_SSTRUCTFACZEROCFSTEN) (hypre_F90_Obj *A, hypre_F90_Obj *grid, hypre_F90_Int *part, HYPRE_Int (*rfactors)[HYPRE_MAXDIM], hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) ( HYPRE_SStructFACZeroCFSten( hypre_F90_PassObj (HYPRE_SStructMatrix, A), hypre_F90_PassObj (HYPRE_SStructGrid, grid), hypre_F90_PassInt (part), rfactors[HYPRE_MAXDIM] )); } /*-------------------------------------------------------------------------- * HYPRE_SStructFACZeroFCSten *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_sstructfaczerofcsten, HYPRE_SSTRUCTFACZEROFCSTEN) (hypre_F90_Obj *A, hypre_F90_Obj *grid, hypre_F90_Int *part, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) ( HYPRE_SStructFACZeroFCSten( hypre_F90_PassObj (HYPRE_SStructMatrix, A), hypre_F90_PassObj (HYPRE_SStructGrid, grid), hypre_F90_PassInt (part) )); } /*-------------------------------------------------------------------------- * HYPRE_SStructFACZeroAMRMatrixData *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_sstructfaczeroamrmatrixdata, HYPRE_SSTRUCTFACZEROAMRMATRIXDATA) (hypre_F90_Obj *A, hypre_F90_Int *part_crse, HYPRE_Int (*rfactors)[HYPRE_MAXDIM], hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) ( HYPRE_SStructFACZeroAMRMatrixData( hypre_F90_PassObj (HYPRE_SStructMatrix, A), hypre_F90_PassInt (part_crse), rfactors[HYPRE_MAXDIM] )); } /*-------------------------------------------------------------------------- * HYPRE_SStructFACZeroAMRVectorData *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_sstructfaczeroamrvectordata, HYPRE_SSTRUCTFACZEROAMRVECTORDATA) (hypre_F90_Obj *b, hypre_F90_IntArray *plevels, HYPRE_Int (*rfactors)[HYPRE_MAXDIM], hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) ( HYPRE_SStructFACZeroAMRVectorData( hypre_F90_PassObj (HYPRE_SStructVector, b), hypre_F90_PassIntArray (plevels), rfactors )); } /*-------------------------------------------------------------------------- * HYPRE_SStructFACSetPRefinements *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_sstructfacsetprefinements, HYPRE_SSTRUCTFACSETPREFINEMENTS) (hypre_F90_Obj *solver, hypre_F90_Int *nparts, HYPRE_Int (*rfactors)[HYPRE_MAXDIM], hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) ( HYPRE_SStructFACSetPRefinements( hypre_F90_PassObj (HYPRE_SStructSolver, solver), hypre_F90_PassInt (nparts), rfactors )); } /*-------------------------------------------------------------------------- * HYPRE_SStructFACSetMaxLevels *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_sstructfacsetmaxlevels, HYPRE_SSTRUCTFACSETMAXLEVELS) (hypre_F90_Obj *solver, hypre_F90_Int *max_levels, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) ( HYPRE_SStructFACSetMaxLevels( hypre_F90_PassObj (HYPRE_SStructSolver, solver), hypre_F90_PassInt (max_levels) )); } /*-------------------------------------------------------------------------- * HYPRE_SStructFACSetMaxIter *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_sstructfacsetmaxiter, HYPRE_SSTRUCTFACSETMAXITER) (hypre_F90_Obj *solver, hypre_F90_Int *max_iter, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) ( HYPRE_SStructFACSetMaxIter( hypre_F90_PassObj (HYPRE_SStructSolver, solver), hypre_F90_PassInt (max_iter) )); } /*-------------------------------------------------------------------------- * HYPRE_SStructFACSetRelChange *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_sstructfacsetrelchange, HYPRE_SSTRUCTFACSETRELCHANGE) (hypre_F90_Obj *solver, hypre_F90_Int *rel_change, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) ( HYPRE_SStructFACSetRelChange( hypre_F90_PassObj (HYPRE_SStructSolver, solver), hypre_F90_PassInt (rel_change) )); } /*-------------------------------------------------------------------------- * HYPRE_SStructFACSetZeroGuess *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_sstructfacsetzeroguess, HYPRE_SSTRUCTFACSETZEROGUESS) (hypre_F90_Obj *solver, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) ( HYPRE_SStructFACSetZeroGuess( hypre_F90_PassObj (HYPRE_SStructSolver, solver) )); } /*-------------------------------------------------------------------------- * HYPRE_SStructFACSetNonZeroGuess *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_sstructfacsetnonzeroguess, HYPRE_SSTRUCTFACSETNONZEROGUESS) (hypre_F90_Obj *solver, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) ( HYPRE_SStructFACSetNonZeroGuess( hypre_F90_PassObj (HYPRE_SStructSolver, solver) )); } /*-------------------------------------------------------------------------- * HYPRE_SStructFACSetRelaxType *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_sstructfacsetrelaxtype, HYPRE_SSTRUCTFACSETRELAXTYPE) (hypre_F90_Obj *solver, hypre_F90_Int *relax_type, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) ( HYPRE_SStructFACSetRelaxType( hypre_F90_PassObj (HYPRE_SStructSolver, solver), hypre_F90_PassInt (relax_type) )); } /*-------------------------------------------------------------------------- * HYPRE_SStructFACSetJacobiWeight *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_sstructfacsetjacobiweigh, HYPRE_SSTRUCTFACSETJACOBIWEIGH) (hypre_F90_Obj *solver, hypre_F90_Real *weight, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) (HYPRE_SStructFACSetJacobiWeight( hypre_F90_PassObj (HYPRE_SStructSolver, solver), hypre_F90_PassReal (weight) ) ); } /*-------------------------------------------------------------------------- * HYPRE_SStructFACSetNumPreRelax *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_sstructfacsetnumprerelax, HYPRE_SSTRUCTFACSETNUMPRERELAX) (hypre_F90_Obj *solver, hypre_F90_Int *num_pre_relax, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) ( HYPRE_SStructFACSetNumPreRelax( hypre_F90_PassObj (HYPRE_SStructSolver, solver), hypre_F90_PassInt (num_pre_relax) )); } /*-------------------------------------------------------------------------- * HYPRE_SStructFACSetNumPostRelax *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_sstructfacsetnumpostrelax, HYPRE_SSTRUCTFACSETNUMPOSTRELAX) (hypre_F90_Obj *solver, hypre_F90_Int *num_post_relax, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) (HYPRE_SStructFACSetNumPostRelax( hypre_F90_PassObj (HYPRE_SStructSolver, solver), hypre_F90_PassInt (num_post_relax) )); } /*-------------------------------------------------------------------------- * HYPRE_SStructFACSetCoarseSolverType *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_sstructfacsetcoarsesolver, HYPRE_SSTRUCTFACSETCOARSESOLVER) (hypre_F90_Obj *solver, hypre_F90_Int *csolver_type, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) (HYPRE_SStructFACSetCoarseSolverType( hypre_F90_PassObj (HYPRE_SStructSolver, solver), hypre_F90_PassInt (csolver_type))); } /*-------------------------------------------------------------------------- * HYPRE_SStructFACSetLogging *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_sstructfacsetlogging, HYPRE_SSTRUCTFACSETLOGGING) (hypre_F90_Obj *solver, hypre_F90_Int *logging, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) (HYPRE_SStructFACSetLogging( hypre_F90_PassObj (HYPRE_SStructSolver, solver), hypre_F90_PassInt (logging) )); } /*-------------------------------------------------------------------------- * HYPRE_SStructFACGetNumIterations *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_sstructfacgetnumiteration, HYPRE_SSTRUCTFACGETNUMITERATION) (hypre_F90_Obj *solver, hypre_F90_Int *num_iterations, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) ( HYPRE_SStructFACGetNumIterations( hypre_F90_PassObj (HYPRE_SStructSolver, solver), hypre_F90_PassIntRef (num_iterations))); } /*-------------------------------------------------------------------------- * HYPRE_SStructFACGetFinalRelativeResidualNorm *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_sstructfacgetfinalrelativ, HYPRE_SSTRUCTFACGETFINALRELATIV) (hypre_F90_Obj *solver, hypre_F90_Real *norm, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) ( HYPRE_SStructFACGetFinalRelativeResidualNorm( hypre_F90_PassObj (HYPRE_SStructSolver, solver), hypre_F90_PassRealRef (norm) )); } #ifdef __cplusplus } #endif hypre-2.33.0/src/sstruct_ls/F90_HYPRE_sstruct_bicgstab.c000066400000000000000000000241111477326011500230250ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * HYPRE_SStructBiCGSTAB interface * *****************************************************************************/ #include "_hypre_sstruct_ls.h" #include "fortran.h" #ifdef __cplusplus extern "C" { #endif /*-------------------------------------------------------------------------- * HYPRE_SStructBiCGSTABCreate *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_sstructbicgstabcreate, HYPRE_SSTRUCTBICGSTABCREATE) (hypre_F90_Comm *comm, hypre_F90_Obj *solver, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) (HYPRE_SStructBiCGSTABCreate( hypre_F90_PassComm (comm), hypre_F90_PassObjRef (HYPRE_SStructSolver, solver) )) ; } /*-------------------------------------------------------------------------- * HYPRE_SStructBiCGSTABDestroy *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_sstructbicgstabdestroy, HYPRE_SSTRUCTBICGSTABDESTROY) (hypre_F90_Obj *solver, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) (HYPRE_SStructBiCGSTABDestroy( hypre_F90_PassObj (HYPRE_SStructSolver, solver) )); } /*-------------------------------------------------------------------------- * HYPRE_SStructBiCGSTABSetup *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_sstructbicgstabsetup, HYPRE_SSTRUCTBICGSTABSETUP) (hypre_F90_Obj *solver, hypre_F90_Obj *A, hypre_F90_Obj *b, hypre_F90_Obj *x, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) (HYPRE_SStructBiCGSTABSetup( hypre_F90_PassObj (HYPRE_SStructSolver, solver), hypre_F90_PassObj (HYPRE_SStructMatrix, A), hypre_F90_PassObj (HYPRE_SStructVector, b), hypre_F90_PassObj (HYPRE_SStructVector, x) )); } /*-------------------------------------------------------------------------- * HYPRE_SStructBiCGSTABSolve *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_sstructbicgstabsolve, HYPRE_SSTRUCTBICGSTABSOLVE) (hypre_F90_Obj *solver, hypre_F90_Obj *A, hypre_F90_Obj *b, hypre_F90_Obj *x, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) (HYPRE_SStructBiCGSTABSolve( hypre_F90_PassObj (HYPRE_SStructSolver, solver), hypre_F90_PassObj (HYPRE_SStructMatrix, A), hypre_F90_PassObj (HYPRE_SStructVector, b), hypre_F90_PassObj (HYPRE_SStructVector, x) )); } /*-------------------------------------------------------------------------- * HYPRE_SStructBiCGSTABSetTol *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_sstructbicgstabsettol, HYPRE_SSTRUCTBICGSTABSETTOL) (hypre_F90_Obj *solver, hypre_F90_Real *tol, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) (HYPRE_SStructBiCGSTABSetTol( hypre_F90_PassObj (HYPRE_SStructSolver, solver), hypre_F90_PassReal (tol) )); } /*-------------------------------------------------------------------------- * HYPRE_SStructBiCGSTABSetAnsoluteTol *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_sstructbicgstabsetabsolutetol, HYPRE_SSTRUCTBICGSTABSETABSOLUTETOL) (hypre_F90_Obj *solver, hypre_F90_Real *tol, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) (HYPRE_SStructBiCGSTABSetAbsoluteTol( hypre_F90_PassObj (HYPRE_SStructSolver, solver), hypre_F90_PassReal (tol) )); } /*-------------------------------------------------------------------------- * HYPRE_SStructBiCGSTABSetMinIter *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_sstructbicgstabsetminiter, HYPRE_SSTRUCTBICGSTABSETMINITER) (hypre_F90_Obj *solver, hypre_F90_Int *min_iter, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) (HYPRE_SStructBiCGSTABSetMinIter( hypre_F90_PassObj (HYPRE_SStructSolver, solver), hypre_F90_PassInt (min_iter) )); } /*-------------------------------------------------------------------------- * HYPRE_SStructBiCGSTABSetMaxIter *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_sstructbicgstabsetmaxiter, HYPRE_SSTRUCTBICGSTABSETMAXITER) (hypre_F90_Obj *solver, hypre_F90_Int *max_iter, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) (HYPRE_SStructBiCGSTABSetMaxIter( hypre_F90_PassObj (HYPRE_SStructSolver, solver), hypre_F90_PassInt (max_iter) )); } /*-------------------------------------------------------------------------- * HYPRE_SStructBiCGSTABSetStopCrit *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_sstructbicgstabsetstopcri, HYPRE_SSTRUCTBICGSTABSETSTOPCRI) (hypre_F90_Obj *solver, hypre_F90_Int *stop_crit, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) (HYPRE_SStructBiCGSTABSetStopCrit( hypre_F90_PassObj (HYPRE_SStructSolver, solver), hypre_F90_PassInt (stop_crit) )); } /*-------------------------------------------------------------------------- * HYPRE_SStructBiCGSTABSetPrecond *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_sstructbicgstabsetprecond, HYPRE_SSTRUCTBICGSTABSETPRECOND) (hypre_F90_Obj *solver, hypre_F90_Int *precond_id, hypre_F90_Obj *precond_solver, hypre_F90_Int *ierr) /*------------------------------------------ * precond_id flags mean: * 2 - setup a split-solver preconditioner * 3 - setup a syspfmg preconditioner * 8 - setup a DiagScale preconditioner * 9 - no preconditioner setup *----------------------------------------*/ { if (*precond_id == 2) { *ierr = (hypre_F90_Int) (HYPRE_SStructBiCGSTABSetPrecond( hypre_F90_PassObj (HYPRE_SStructSolver, solver), HYPRE_SStructSplitSolve, HYPRE_SStructSplitSetup, hypre_F90_PassObjRef (HYPRE_SStructSolver, precond_solver))); } else if (*precond_id == 3) { *ierr = (hypre_F90_Int) (HYPRE_SStructBiCGSTABSetPrecond( hypre_F90_PassObj (HYPRE_SStructSolver, solver), HYPRE_SStructSysPFMGSolve, HYPRE_SStructSysPFMGSetup, hypre_F90_PassObj (HYPRE_SStructSolver, precond_solver))); } else if (*precond_id == 8) { *ierr = (hypre_F90_Int) (HYPRE_SStructBiCGSTABSetPrecond( hypre_F90_PassObj (HYPRE_SStructSolver, solver), HYPRE_SStructDiagScale, HYPRE_SStructDiagScaleSetup, hypre_F90_PassObj (HYPRE_SStructSolver, precond_solver))); } else if (*precond_id == 9) { *ierr = 0; } else { *ierr = -1; } } /*-------------------------------------------------------------------------- * HYPRE_SStructBiCGSTABSetLogging *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_sstructbicgstabsetlogging, HYPRE_SSTRUCTBICGSTABSETLOGGING) (hypre_F90_Obj *solver, hypre_F90_Int *logging, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) (HYPRE_SStructBiCGSTABSetLogging( hypre_F90_PassObj (HYPRE_SStructSolver, solver), hypre_F90_PassInt (logging) )); } /*-------------------------------------------------------------------------- * HYPRE_SStructBiCGSTABSetPrintLevel *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_sstructbicgstabsetprintle, HYPRE_SSTRUCTBICGSTABSETPRINTLE) (hypre_F90_Obj *solver, hypre_F90_Int *print_level, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) (HYPRE_SStructBiCGSTABSetPrintLevel( hypre_F90_PassObj (HYPRE_SStructSolver, solver), hypre_F90_PassInt (print_level) )); } /*-------------------------------------------------------------------------- * HYPRE_SStructBiCGSTABGetNumIterations *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_sstructbicgstabgetnumiter, HYPRE_SSTRUCTBICGSTABGETNUMITER) (hypre_F90_Obj *solver, hypre_F90_Int *num_iterations, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) (HYPRE_SStructBiCGSTABGetNumIterations( hypre_F90_PassObj (HYPRE_SStructSolver, solver), hypre_F90_PassIntRef (num_iterations) ) ); } /*-------------------------------------------------------------------------- * HYPRE_SStructBiCGSTABGetFinalRelativeResidualNorm *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_sstructbicgstabgetfinalre, HYPRE_SSTRUCTBICGSTABGETFINALRE) (hypre_F90_Obj *solver, hypre_F90_Real *norm, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) (HYPRE_SStructBiCGSTABGetFinalRelativeResidualNorm( hypre_F90_PassObj (HYPRE_SStructSolver, solver), hypre_F90_PassRealRef (norm) )); } /*-------------------------------------------------------------------------- * HYPRE_SStructBiCGSTABGetResidual *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_sstructbicgstabgetresidua, HYPRE_SSTRUCTBICGSTABGETRESIDUA) (hypre_F90_Obj *solver, hypre_F90_Obj *residual, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) (HYPRE_SStructBiCGSTABGetResidual( hypre_F90_PassObj (HYPRE_SStructSolver, solver), (void **) *residual)); } #ifdef __cplusplus } #endif hypre-2.33.0/src/sstruct_ls/F90_HYPRE_sstruct_flexgmres.c000066400000000000000000000242131477326011500232460ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * HYPRE_SStructFlexGMRES interface * *****************************************************************************/ #include "_hypre_sstruct_ls.h" #include "fortran.h" #ifdef __cplusplus extern "C" { #endif /*-------------------------------------------------------------------------- * HYPRE_SStructFlexGMRESCreate *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_sstructflexgmrescreate, HYPRE_SSTRUCTFLEXGMRESCREATE) (hypre_F90_Comm *comm, hypre_F90_Obj *solver, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) (HYPRE_SStructFlexGMRESCreate( hypre_F90_PassComm (comm), hypre_F90_PassObjRef (HYPRE_SStructSolver, solver) )); } /*-------------------------------------------------------------------------- * HYPRE_SStructFlexGMRESDestroy *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_sstructflexgmresdestroy, HYPRE_SSTRUCTFLEXGMRESDESTROY) (hypre_F90_Obj *solver, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) (HYPRE_SStructFlexGMRESDestroy( hypre_F90_PassObj (HYPRE_SStructSolver, solver) )); } /*-------------------------------------------------------------------------- * HYPRE_SStructFlexGMRESSetup *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_sstructflexgmressetup, HYPRE_SSTRUCTFLEXGMRESSETUP) (hypre_F90_Obj *solver, hypre_F90_Obj *A, hypre_F90_Obj *b, hypre_F90_Obj *x, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) (HYPRE_SStructFlexGMRESSetup( hypre_F90_PassObj (HYPRE_SStructSolver, solver), hypre_F90_PassObj (HYPRE_SStructMatrix, A), hypre_F90_PassObj (HYPRE_SStructVector, b), hypre_F90_PassObj (HYPRE_SStructVector, x) ) ); } /*-------------------------------------------------------------------------- * HYPRE_SStructFlexGMRESSolve *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_sstructflexgmressolve, HYPRE_SSTRUCTFLEXGMRESSOLVE) (hypre_F90_Obj *solver, hypre_F90_Obj *A, hypre_F90_Obj *b, hypre_F90_Obj *x, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) (HYPRE_SStructFlexGMRESSolve( hypre_F90_PassObj (HYPRE_SStructSolver, solver), hypre_F90_PassObj (HYPRE_SStructMatrix, A), hypre_F90_PassObj (HYPRE_SStructVector, b), hypre_F90_PassObj (HYPRE_SStructVector, x) ) ); } /*-------------------------------------------------------------------------- * HYPRE_SStructFlexGMRESSetKDim *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_sstructflexgmressetkdim, HYPRE_SSTRUCTFLEXGMRESSETKDIM) (hypre_F90_Obj *solver, hypre_F90_Int *k_dim, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) (HYPRE_SStructFlexGMRESSetKDim( hypre_F90_PassObj (HYPRE_SStructSolver, solver), hypre_F90_PassInt (k_dim) )); } /*-------------------------------------------------------------------------- * HYPRE_SStructFlexGMRESSetTol *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_sstructflexgmressettol, HYPRE_SSTRUCTFLEXGMRESSETTOL) (hypre_F90_Obj *solver, hypre_F90_Real *tol, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) (HYPRE_SStructFlexGMRESSetTol( hypre_F90_PassObj (HYPRE_SStructSolver, solver), hypre_F90_PassReal (tol) ) ); } /*-------------------------------------------------------------------------- * HYPRE_SStructFlexGMRESSetAbsoluteTol *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_sstructflexgmressetabsolutetol, HYPRE_SSTRUCTFLEXGMRESSETABSOLUTETOL) (hypre_F90_Obj *solver, hypre_F90_Real *tol, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) (HYPRE_SStructFlexGMRESSetAbsoluteTol( hypre_F90_PassObj (HYPRE_SStructSolver, solver), hypre_F90_PassReal (tol) ) ); } /*-------------------------------------------------------------------------- * HYPRE_SStructFlexGMRESSetMinIter *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_sstructflexgmressetminiter, HYPRE_SSTRUCTFLEXGMRESSETMINITER) (hypre_F90_Obj *solver, hypre_F90_Int *min_iter, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) (HYPRE_SStructFlexGMRESSetMinIter( hypre_F90_PassObj (HYPRE_SStructSolver, solver), hypre_F90_PassInt (min_iter) ) ); } /*-------------------------------------------------------------------------- * HYPRE_SStructFlexGMRESSetMaxIter *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_sstructflexgmressetmaxiter, HYPRE_SSTRUCTFLEXGMRESSETMAXITER) (hypre_F90_Obj *solver, hypre_F90_Int *max_iter, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) (HYPRE_SStructFlexGMRESSetMaxIter( hypre_F90_PassObj (HYPRE_SStructSolver, solver), hypre_F90_PassInt (max_iter) ) ); } /*-------------------------------------------------------------------------- * HYPRE_SStructFlexGMRESSetPrecond *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_sstructflexgmressetprecond, HYPRE_SSTRUCTFLEXGMRESSETPRECOND) (hypre_F90_Obj *solver, hypre_F90_Int *precond_id, hypre_F90_Obj *precond_solver, hypre_F90_Int *ierr) /*------------------------------------------ * precond_id flags mean: * 2 - setup a split-solver preconditioner * 3 - setup a syspfmg preconditioner * 8 - setup a DiagScale preconditioner * 9 - no preconditioner setup *----------------------------------------*/ { if (*precond_id == 2) { *ierr = (hypre_F90_Int) (HYPRE_SStructFlexGMRESSetPrecond( hypre_F90_PassObj (HYPRE_SStructSolver, solver), HYPRE_SStructSplitSolve, HYPRE_SStructSplitSetup, hypre_F90_PassObjRef (HYPRE_SStructSolver, precond_solver))); } else if (*precond_id == 3) { *ierr = (hypre_F90_Int) (HYPRE_SStructFlexGMRESSetPrecond( hypre_F90_PassObj (HYPRE_SStructSolver, solver), HYPRE_SStructSysPFMGSolve, HYPRE_SStructSysPFMGSetup, hypre_F90_PassObjRef (HYPRE_SStructSolver, precond_solver))); } else if (*precond_id == 8) { *ierr = (hypre_F90_Int) (HYPRE_SStructFlexGMRESSetPrecond( hypre_F90_PassObj (HYPRE_SStructSolver, solver), HYPRE_SStructDiagScale, HYPRE_SStructDiagScaleSetup, hypre_F90_PassObjRef (HYPRE_SStructSolver, precond_solver))); } else if (*precond_id == 9) { *ierr = 0; } else { *ierr = -1; } } /*-------------------------------------------------------------------------- * HYPRE_SStructFlexGMRESSetLogging *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_sstructflexgmressetlogging, HYPRE_SSTRUCTFLEXGMRESSETLOGGING) (hypre_F90_Obj *solver, hypre_F90_Int *logging, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) (HYPRE_SStructFlexGMRESSetLogging( hypre_F90_PassObj (HYPRE_SStructSolver, solver), hypre_F90_PassInt (logging) ) ); } /*-------------------------------------------------------------------------- * HYPRE_SStructFlexGMRESSetPrintLevel *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_sstructflexgmressetprintlevel, HYPRE_SSTRUCTFLEXGMRESSETPRINTLEVEL) (hypre_F90_Obj *solver, hypre_F90_Int *level, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) (HYPRE_SStructFlexGMRESSetPrintLevel( hypre_F90_PassObj (HYPRE_SStructSolver, solver), hypre_F90_PassInt (level) ) ); } /*-------------------------------------------------------------------------- * HYPRE_SStructFlexGMRESGetNumIterations *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_sstructflexgmresgetnumiterati, HYPRE_SSTRUCTFLEXGMRESGETNUMITERATI) (hypre_F90_Obj *solver, hypre_F90_Int *num_iterations, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) (HYPRE_SStructFlexGMRESGetNumIterations( hypre_F90_PassObj (HYPRE_SStructSolver, solver), hypre_F90_PassIntRef (num_iterations) ) ); } /*-------------------------------------------------------------------------- * HYPRE_SStructFlexGMRESGetFinalRelativeResidualNorm *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_sstructflexgmresgetfinalrelat, HYPRE_SSTRUCTFLEXGMRESGETFINALRELAT) (hypre_F90_Obj *solver, hypre_F90_Real *norm, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) (HYPRE_SStructFlexGMRESGetFinalRelativeResidualNorm( hypre_F90_PassObj (HYPRE_SStructSolver, solver), hypre_F90_PassRealRef (norm) ) ); } /*-------------------------------------------------------------------------- * HYPRE_SStructFlexGMRESGetResidual *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_sstructflexgmresgetresidual, HYPRE_SSTRUCTFLEXGMRESGETRESIDUAL) (hypre_F90_Obj *solver, hypre_F90_Obj *residual, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) (HYPRE_SStructFlexGMRESGetResidual( hypre_F90_PassObj (HYPRE_SStructSolver, solver), (void **) *residual ) ); } #ifdef __cplusplus } #endif hypre-2.33.0/src/sstruct_ls/F90_HYPRE_sstruct_gmres.c000066400000000000000000000246231477326011500223740ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * HYPRE_SStructGMRES interface * *****************************************************************************/ #include "_hypre_sstruct_ls.h" #include "fortran.h" #ifdef __cplusplus extern "C" { #endif /*-------------------------------------------------------------------------- * HYPRE_SStructGMRESCreate *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_sstructgmrescreate, HYPRE_SSTRUCTGMRESCREATE) (hypre_F90_Comm *comm, hypre_F90_Obj *solver, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) HYPRE_SStructGMRESCreate( hypre_F90_PassComm(comm), hypre_F90_PassObjRef(HYPRE_SStructSolver, solver)); } /*-------------------------------------------------------------------------- * HYPRE_SStructGMRESDestroy *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_sstructgmresdestroy, HYPRE_SSTRUCTGMRESDESTROY) (hypre_F90_Obj *solver, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) (HYPRE_SStructGMRESDestroy( hypre_F90_PassObj (HYPRE_SStructSolver, solver) )); } /*-------------------------------------------------------------------------- * HYPRE_SStructGMRESSetup *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_sstructgmressetup, HYPRE_SSTRUCTGMRESSETUP) (hypre_F90_Obj *solver, hypre_F90_Obj *A, hypre_F90_Obj *b, hypre_F90_Obj *x, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) (HYPRE_SStructGMRESSetup( hypre_F90_PassObj (HYPRE_SStructSolver, solver), hypre_F90_PassObj (HYPRE_SStructMatrix, A), hypre_F90_PassObj (HYPRE_SStructVector, b), hypre_F90_PassObj (HYPRE_SStructVector, x) ) ); } /*-------------------------------------------------------------------------- * HYPRE_SStructGMRESSolve *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_sstructgmressolve, HYPRE_SSTRUCTGMRESSOLVE) (hypre_F90_Obj *solver, hypre_F90_Obj *A, hypre_F90_Obj *b, hypre_F90_Obj *x, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) (HYPRE_SStructGMRESSolve( hypre_F90_PassObj (HYPRE_SStructSolver, solver), hypre_F90_PassObj (HYPRE_SStructMatrix, A), hypre_F90_PassObj (HYPRE_SStructVector, b), hypre_F90_PassObj (HYPRE_SStructVector, x) ) ); } /*-------------------------------------------------------------------------- * HYPRE_SStructGMRESSetKDim *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_sstructgmressetkdim, HYPRE_SSTRUCTGMRESSETKDIM) (hypre_F90_Obj *solver, hypre_F90_Int *k_dim, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) (HYPRE_SStructGMRESSetKDim( hypre_F90_PassObj (HYPRE_SStructSolver, solver), hypre_F90_PassInt (k_dim) )); } /*-------------------------------------------------------------------------- * HYPRE_SStructGMRESSetTol *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_sstructgmressettol, HYPRE_SSTRUCTGMRESSETTOL) (hypre_F90_Obj *solver, hypre_F90_Real *tol, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) (HYPRE_SStructGMRESSetTol( hypre_F90_PassObj (HYPRE_SStructSolver, solver), hypre_F90_PassReal (tol) ) ); } /*-------------------------------------------------------------------------- * HYPRE_SStructGMRESSetAbsoluteTol *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_sstructgmressetabsolutetol, HYPRE_SSTRUCTGMRESSETABSOLUTETOL) (hypre_F90_Obj *solver, hypre_F90_Real *tol, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) (HYPRE_SStructGMRESSetAbsoluteTol( hypre_F90_PassObj (HYPRE_SStructSolver, solver), hypre_F90_PassReal (tol) ) ); } /*-------------------------------------------------------------------------- * HYPRE_SStructGMRESSetMinIter *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_sstructgmressetminiter, HYPRE_SSTRUCTGMRESSETMINITER) (hypre_F90_Obj *solver, hypre_F90_Int *min_iter, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) (HYPRE_SStructGMRESSetMinIter( hypre_F90_PassObj (HYPRE_SStructSolver, solver), hypre_F90_PassInt (min_iter) ) ); } /*-------------------------------------------------------------------------- * HYPRE_SStructGMRESSetMaxIter *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_sstructgmressetmaxiter, HYPRE_SSTRUCTGMRESSETMAXITER) (hypre_F90_Obj *solver, hypre_F90_Int *max_iter, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) (HYPRE_SStructGMRESSetMaxIter( hypre_F90_PassObj (HYPRE_SStructSolver, solver), hypre_F90_PassInt (max_iter) ) ); } /*-------------------------------------------------------------------------- * HYPRE_SStructGMRESSetStopCrit *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_sstructgmressetstopcrit, HYPRE_SSTRUCTGMRESSETSTOPCRIT) (hypre_F90_Obj *solver, hypre_F90_Int *stop_crit, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) (HYPRE_SStructGMRESSetStopCrit( hypre_F90_PassObj (HYPRE_SStructSolver, solver), hypre_F90_PassInt (stop_crit) ) ); } /*-------------------------------------------------------------------------- * HYPRE_SStructGMRESSetPrecond *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_sstructgmressetprecond, HYPRE_SSTRUCTGMRESSETPRECOND) (hypre_F90_Obj *solver, hypre_F90_Int *precond_id, hypre_F90_Obj *precond_solver, hypre_F90_Int *ierr) /*------------------------------------------ * precond_id flags mean: * 2 - setup a split-solver preconditioner * 3 - setup a syspfmg preconditioner * 8 - setup a DiagScale preconditioner * 9 - no preconditioner setup *----------------------------------------*/ { if (*precond_id == 2) { *ierr = (hypre_F90_Int) (HYPRE_SStructGMRESSetPrecond( hypre_F90_PassObj (HYPRE_SStructSolver, solver), HYPRE_SStructSplitSolve, HYPRE_SStructSplitSetup, hypre_F90_PassObjRef (HYPRE_SStructSolver, precond_solver))); } else if (*precond_id == 3) { *ierr = (hypre_F90_Int) (HYPRE_SStructGMRESSetPrecond( hypre_F90_PassObj (HYPRE_SStructSolver, solver), HYPRE_SStructSysPFMGSolve, HYPRE_SStructSysPFMGSetup, hypre_F90_PassObjRef (HYPRE_SStructSolver, precond_solver))); } else if (*precond_id == 8) { *ierr = (hypre_F90_Int) (HYPRE_SStructGMRESSetPrecond( hypre_F90_PassObj (HYPRE_SStructSolver, solver), HYPRE_SStructDiagScale, HYPRE_SStructDiagScaleSetup, hypre_F90_PassObjRef (HYPRE_SStructSolver, precond_solver))); } else if (*precond_id == 9) { *ierr = 0; } else { *ierr = -1; } } /*-------------------------------------------------------------------------- * HYPRE_SStructGMRESSetLogging *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_sstructgmressetlogging, HYPRE_SSTRUCTGMRESSETLOGGING) (hypre_F90_Obj *solver, hypre_F90_Int *logging, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) (HYPRE_SStructGMRESSetLogging( hypre_F90_PassObj (HYPRE_SStructSolver, solver), hypre_F90_PassInt (logging) ) ); } /*-------------------------------------------------------------------------- * HYPRE_SStructGMRESSetPrintLevel *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_sstructgmressetprintlevel, HYPRE_SSTRUCTGMRESSETPRINTLEVEL) (hypre_F90_Obj *solver, hypre_F90_Int *level, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) (HYPRE_SStructGMRESSetPrintLevel( hypre_F90_PassObj (HYPRE_SStructSolver, solver), hypre_F90_PassInt (level) ) ); } /*-------------------------------------------------------------------------- * HYPRE_SStructGMRESGetNumIterations *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_sstructgmresgetnumiterati, HYPRE_SSTRUCTGMRESGETNUMITERATI) (hypre_F90_Obj *solver, hypre_F90_Int *num_iterations, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) (HYPRE_SStructGMRESGetNumIterations( hypre_F90_PassObj (HYPRE_SStructSolver, solver), hypre_F90_PassIntRef (num_iterations) ) ); } /*-------------------------------------------------------------------------- * HYPRE_SStructGMRESGetFinalRelativeResidualNorm *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_sstructgmresgetfinalrelat, HYPRE_SSTRUCTGMRESGETFINALRELAT) (hypre_F90_Obj *solver, hypre_F90_Real *norm, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) (HYPRE_SStructGMRESGetFinalRelativeResidualNorm( hypre_F90_PassObj (HYPRE_SStructSolver, solver), hypre_F90_PassRealRef (norm) ) ); } /*-------------------------------------------------------------------------- * HYPRE_SStructGMRESGetResidual *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_sstructgmresgetresidual, HYPRE_SSTRUCTGMRESGETRESIDUAL) (hypre_F90_Obj *solver, hypre_F90_Obj *residual, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) (HYPRE_SStructGMRESGetResidual( hypre_F90_PassObj (HYPRE_SStructSolver, solver), (void **) *residual ) ); } #ifdef __cplusplus } #endif hypre-2.33.0/src/sstruct_ls/F90_HYPRE_sstruct_int.c000066400000000000000000000060731477326011500220500ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * HYPRE_SStructInt Fortran interface * *****************************************************************************/ #include "_hypre_sstruct_ls.h" #include "fortran.h" #include "HYPRE_MatvecFunctions.h" #ifdef __cplusplus extern "C" { #endif /*-------------------------------------------------------------------------- * HYPRE_SStructPVectorSetRandomValues *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_sstructpvectorsetrandomva, HYPRE_SSTRUCTPVECTORSETRANDOMVA) (hypre_F90_Obj *pvector, hypre_F90_Int *seed, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) ( hypre_SStructPVectorSetRandomValues( (hypre_SStructPVector *) pvector, hypre_F90_PassInt (seed) )); } /*-------------------------------------------------------------------------- * HYPRE_SStructVectorSetRandomValues *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_sstructvectorsetrandomval, HYPRE_SSTRUCTVECTORSETRANDOMVAL) (hypre_F90_Obj *vector, hypre_F90_Int *seed, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) ( hypre_SStructVectorSetRandomValues( (hypre_SStructVector *) vector, hypre_F90_PassInt (seed) )); } /*-------------------------------------------------------------------------- * HYPRE_SStructSetRandomValues *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_sstructsetrandomvalues, HYPRE_SSTRUCTSETRANDOMVALUES) (hypre_F90_Obj *v, hypre_F90_Int *seed, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) ( hypre_SStructSetRandomValues( (void *) v, hypre_F90_PassInt (seed) )); } /*-------------------------------------------------------------------------- * HYPRE_SStructVectorSetupInterpreter *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_sstructsetupinterpreter, HYPRE_SSTRUCTSETUPINTERPRETER) (hypre_F90_Obj *i, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) ( HYPRE_SStructSetupInterpreter( (mv_InterfaceInterpreter *) i )); } /*-------------------------------------------------------------------------- * HYPRE_SStructSetupMatvec *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_sstructsetupmatvec, HYPRE_SSTRUCTSETUPMATVEC) (hypre_F90_Obj *mv, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) ( HYPRE_SStructSetupMatvec( hypre_F90_PassObjRef (HYPRE_MatvecFunctions, mv))); } #ifdef __cplusplus } #endif hypre-2.33.0/src/sstruct_ls/F90_HYPRE_sstruct_lgmres.c000066400000000000000000000247321477326011500225510ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * HYPRE_SStructLGMRES interface * *****************************************************************************/ #include "_hypre_sstruct_ls.h" #include "fortran.h" #ifdef __cplusplus extern "C" { #endif /*-------------------------------------------------------------------------- * HYPRE_SStructLGMRESCreate *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_sstructlgmrescreate, HYPRE_SSTRUCTLGMRESCREATE) (hypre_F90_Comm *comm, hypre_F90_Obj *solver, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) (HYPRE_SStructLGMRESCreate( hypre_F90_PassComm (comm), hypre_F90_PassObjRef (HYPRE_SStructSolver, solver) )); } /*-------------------------------------------------------------------------- * HYPRE_SStructLGMRESDestroy *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_sstructlgmresdestroy, HYPRE_SSTRUCTLGMRESDESTROY) (hypre_F90_Obj *solver, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) (HYPRE_SStructLGMRESDestroy( hypre_F90_PassObj (HYPRE_SStructSolver, solver) )); } /*-------------------------------------------------------------------------- * HYPRE_SStructLGMRESSetup *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_sstructlgmressetup, HYPRE_SSTRUCTLGMRESSETUP) (hypre_F90_Obj *solver, hypre_F90_Obj *A, hypre_F90_Obj *b, hypre_F90_Obj *x, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) (HYPRE_SStructLGMRESSetup( hypre_F90_PassObj (HYPRE_SStructSolver, solver), hypre_F90_PassObj (HYPRE_SStructMatrix, A), hypre_F90_PassObj (HYPRE_SStructVector, b), hypre_F90_PassObj (HYPRE_SStructVector, x) ) ); } /*-------------------------------------------------------------------------- * HYPRE_SStructLGMRESSolve *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_sstructlgmressolve, HYPRE_SSTRUCTLGMRESSOLVE) (hypre_F90_Obj *solver, hypre_F90_Obj *A, hypre_F90_Obj *b, hypre_F90_Obj *x, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) (HYPRE_SStructLGMRESSolve( hypre_F90_PassObj (HYPRE_SStructSolver, solver), hypre_F90_PassObj (HYPRE_SStructMatrix, A), hypre_F90_PassObj (HYPRE_SStructVector, b), hypre_F90_PassObj (HYPRE_SStructVector, x) ) ); } /*-------------------------------------------------------------------------- * HYPRE_SStructLGMRESSetKDim *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_sstructlgmressetkdim, HYPRE_SSTRUCTLGMRESSETKDIM) (hypre_F90_Obj *solver, hypre_F90_Int *k_dim, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) (HYPRE_SStructLGMRESSetKDim( hypre_F90_PassObj (HYPRE_SStructSolver, solver), hypre_F90_PassInt (k_dim) )); } /*-------------------------------------------------------------------------- * HYPRE_SStructLGMRESSetAugDim *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_sstructlgmressetaugdim, HYPRE_SSTRUCTLGMRESSETAUGDIM) (hypre_F90_Obj *solver, hypre_F90_Int *aug_dim, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) (HYPRE_SStructLGMRESSetAugDim( hypre_F90_PassObj (HYPRE_SStructSolver, solver), hypre_F90_PassInt (aug_dim) )); } /*-------------------------------------------------------------------------- * HYPRE_SStructLGMRESSetTol *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_sstructlgmressettol, HYPRE_SSTRUCTLGMRESSETTOL) (hypre_F90_Obj *solver, hypre_F90_Real *tol, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) (HYPRE_SStructLGMRESSetTol( hypre_F90_PassObj (HYPRE_SStructSolver, solver), hypre_F90_PassReal (tol) ) ); } /*-------------------------------------------------------------------------- * HYPRE_SStructLGMRESSetAbsoluteTol *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_sstructlgmressetabsolutetol, HYPRE_SSTRUCTLGMRESSETABSOLUTETOL) (hypre_F90_Obj *solver, hypre_F90_Real *tol, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) (HYPRE_SStructLGMRESSetAbsoluteTol( hypre_F90_PassObj (HYPRE_SStructSolver, solver), hypre_F90_PassReal (tol) ) ); } /*-------------------------------------------------------------------------- * HYPRE_SStructLGMRESSetMinIter *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_sstructlgmressetminiter, HYPRE_SSTRUCTLGMRESSETMINITER) (hypre_F90_Obj *solver, hypre_F90_Int *min_iter, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) (HYPRE_SStructLGMRESSetMinIter( hypre_F90_PassObj (HYPRE_SStructSolver, solver), hypre_F90_PassInt (min_iter) ) ); } /*-------------------------------------------------------------------------- * HYPRE_SStructLGMRESSetMaxIter *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_sstructlgmressetmaxiter, HYPRE_SSTRUCTLGMRESSETMAXITER) (hypre_F90_Obj *solver, hypre_F90_Int *max_iter, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) (HYPRE_SStructLGMRESSetMaxIter( hypre_F90_PassObj (HYPRE_SStructSolver, solver), hypre_F90_PassInt (max_iter) ) ); } /*-------------------------------------------------------------------------- * HYPRE_SStructLGMRESSetPrecond *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_sstructlgmressetprecond, HYPRE_SSTRUCTLGMRESSETPRECOND) (hypre_F90_Obj *solver, hypre_F90_Int *precond_id, hypre_F90_Obj *precond_solver, hypre_F90_Int *ierr) /*------------------------------------------ * precond_id flags mean: * 2 - setup a split-solver preconditioner * 3 - setup a syspfmg preconditioner * 8 - setup a DiagScale preconditioner * 9 - no preconditioner setup *----------------------------------------*/ { if (*precond_id == 2) { *ierr = (hypre_F90_Int) (HYPRE_SStructLGMRESSetPrecond( hypre_F90_PassObj (HYPRE_SStructSolver, solver), HYPRE_SStructSplitSolve, HYPRE_SStructSplitSetup, hypre_F90_PassObjRef (HYPRE_SStructSolver, precond_solver))); } else if (*precond_id == 3) { *ierr = (hypre_F90_Int) (HYPRE_SStructLGMRESSetPrecond( hypre_F90_PassObj (HYPRE_SStructSolver, solver), HYPRE_SStructSysPFMGSolve, HYPRE_SStructSysPFMGSetup, hypre_F90_PassObjRef (HYPRE_SStructSolver, precond_solver))); } else if (*precond_id == 8) { *ierr = (hypre_F90_Int) (HYPRE_SStructLGMRESSetPrecond( hypre_F90_PassObj (HYPRE_SStructSolver, solver), HYPRE_SStructDiagScale, HYPRE_SStructDiagScaleSetup, hypre_F90_PassObjRef (HYPRE_SStructSolver, precond_solver))); } else if (*precond_id == 9) { *ierr = 0; } else { *ierr = -1; } } /*-------------------------------------------------------------------------- * HYPRE_SStructLGMRESSetLogging *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_sstructlgmressetlogging, HYPRE_SSTRUCTLGMRESSETLOGGING) (hypre_F90_Obj *solver, hypre_F90_Int *logging, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) (HYPRE_SStructLGMRESSetLogging( hypre_F90_PassObj (HYPRE_SStructSolver, solver), hypre_F90_PassInt (logging) ) ); } /*-------------------------------------------------------------------------- * HYPRE_SStructLGMRESSetPrintLevel *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_sstructlgmressetprintlevel, HYPRE_SSTRUCTLGMRESSETPRINTLEVEL) (hypre_F90_Obj *solver, hypre_F90_Int *level, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) (HYPRE_SStructLGMRESSetPrintLevel( hypre_F90_PassObj (HYPRE_SStructSolver, solver), hypre_F90_PassInt (level) ) ); } /*-------------------------------------------------------------------------- * HYPRE_SStructLGMRESGetNumIterations *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_sstructlgmresgetnumiterati, HYPRE_SSTRUCTLGMRESGETNUMITERATI) (hypre_F90_Obj *solver, hypre_F90_Int *num_iterations, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) (HYPRE_SStructLGMRESGetNumIterations( hypre_F90_PassObj (HYPRE_SStructSolver, solver), hypre_F90_PassIntRef (num_iterations) ) ); } /*-------------------------------------------------------------------------- * HYPRE_SStructLGMRESGetFinalRelativeResidualNorm *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_sstructlgmresgetfinalrelat, HYPRE_SSTRUCTLGMRESGETFINALRELAT) (hypre_F90_Obj *solver, hypre_F90_Real *norm, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) (HYPRE_SStructLGMRESGetFinalRelativeResidualNorm( hypre_F90_PassObj (HYPRE_SStructSolver, solver), hypre_F90_PassRealRef (norm) ) ); } /*-------------------------------------------------------------------------- * HYPRE_SStructLGMRESGetResidual *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_sstructlgmresgetresidual, HYPRE_SSTRUCTLGMRESGETRESIDUAL) (hypre_F90_Obj *solver, hypre_F90_Obj *residual, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) (HYPRE_SStructLGMRESGetResidual( hypre_F90_PassObj (HYPRE_SStructSolver, solver), (void **) *residual ) ); } #ifdef __cplusplus } #endif hypre-2.33.0/src/sstruct_ls/F90_HYPRE_sstruct_maxwell.c000066400000000000000000000316771477326011500227370ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * HYPRE_SStructMaxwell interface * *****************************************************************************/ #include "_hypre_sstruct_ls.h" #include "fortran.h" #ifdef __cplusplus extern "C" { #endif /*-------------------------------------------------------------------------- * HYPRE_SStructMaxwellCreate *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_sstructmaxwellcreate, HYPRE_SSTRUCTMAXWELLCREATE) (hypre_F90_Comm *comm, hypre_F90_Obj *solver, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) (HYPRE_SStructMaxwellCreate( hypre_F90_PassComm (comm), hypre_F90_PassObjRef (HYPRE_SStructSolver, solver)) ); } /*-------------------------------------------------------------------------- * HYPRE_SStructMaxwellDestroy *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_sstructmaxwelldestroy, HYPRE_SSTRUCTMAXWELLDESTROY) (hypre_F90_Obj *solver, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) (HYPRE_SStructMaxwellDestroy( hypre_F90_PassObj (HYPRE_SStructSolver, solver))); } /*-------------------------------------------------------------------------- * HYPRE_SStructMaxwellSetup *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_sstructmaxwellsetup, HYPRE_SSTRUCTMAXWELLSETUP) (hypre_F90_Obj *solver, hypre_F90_Obj *A, hypre_F90_Obj *b, hypre_F90_Obj *x, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) ( HYPRE_SStructMaxwellSetup( hypre_F90_PassObj (HYPRE_SStructSolver, solver), hypre_F90_PassObj (HYPRE_SStructMatrix, A), hypre_F90_PassObj (HYPRE_SStructVector, b), hypre_F90_PassObj (HYPRE_SStructVector, x) )); } /*-------------------------------------------------------------------------- * HYPRE_SStructMaxwellSolve *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_sstructmaxwellsolve, HYPRE_SSTRUCTMAXWELLSOLVE) (hypre_F90_Obj *solver, hypre_F90_Obj *A, hypre_F90_Obj *b, hypre_F90_Obj *x, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) (HYPRE_SStructMaxwellSolve( hypre_F90_PassObj (HYPRE_SStructSolver, solver), hypre_F90_PassObj (HYPRE_SStructMatrix, A), hypre_F90_PassObj (HYPRE_SStructVector, b), hypre_F90_PassObj (HYPRE_SStructVector, x) ) ); } /*-------------------------------------------------------------------------- * HYPRE_SStructMaxwellSolve2 *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_sstructmaxwellsolve2, HYPRE_SSTRUCTMAXWELLSOLVE2) (hypre_F90_Obj *solver, hypre_F90_Obj *A, hypre_F90_Obj *b, hypre_F90_Obj *x, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) (HYPRE_SStructMaxwellSolve2( hypre_F90_PassObj (HYPRE_SStructSolver, solver), hypre_F90_PassObj (HYPRE_SStructMatrix, A), hypre_F90_PassObj (HYPRE_SStructVector, b), hypre_F90_PassObj (HYPRE_SStructVector, x) ) ); } /*-------------------------------------------------------------------------- * HYPRE_MaxwellGrad *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_maxwellgrad, HYPRE_MAXWELLGRAD) (hypre_F90_Obj *grid, hypre_F90_Obj *T, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) ( HYPRE_MaxwellGrad( hypre_F90_PassObj (HYPRE_SStructGrid, grid), hypre_F90_PassObjRef (HYPRE_ParCSRMatrix, T) ) ); } /*-------------------------------------------------------------------------- * HYPRE_SStructMaxwellSetGrad *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_sstructmaxwellsetgrad, HYPRE_SSTRUCTMAXWELLSETGRAD) (hypre_F90_Obj *solver, hypre_F90_Obj *T, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) ( HYPRE_SStructMaxwellSetGrad( hypre_F90_PassObj (HYPRE_SStructSolver, solver), hypre_F90_PassObj (HYPRE_ParCSRMatrix, T) )); } /*-------------------------------------------------------------------------- * HYPRE_SStructMaxwellSetRfactors *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_sstructmaxwellsetrfactors, HYPRE_SSTRUCTMAXWELLSETRFACTORS) (hypre_F90_Obj *solver, HYPRE_Int (*rfactors)[3], hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) ( HYPRE_SStructMaxwellSetRfactors( hypre_F90_PassObj (HYPRE_SStructSolver, solver), rfactors[3] )); } /*-------------------------------------------------------------------------- * HYPRE_SStructMaxwellSetTol *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_sstructmaxwellsettol, HYPRE_SSTRUCTMAXWELLSETTOL) (hypre_F90_Obj *solver, hypre_F90_Real *tol, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) ( HYPRE_SStructMaxwellSetTol( hypre_F90_PassObj (HYPRE_SStructSolver, solver), hypre_F90_PassReal (tol) )); } /*-------------------------------------------------------------------------- * HYPRE_SStructMaxwellSetConstantCoef *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_sstructmaxwellsetconstant, HYPRE_SSTRUCTMAXWELLSETCONSTANT) (hypre_F90_Obj *solver, hypre_F90_Int *constant_coef, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) ( HYPRE_SStructMaxwellSetConstantCoef( (HYPRE_SStructSolver ) * solver, hypre_F90_PassInt (constant_coef)) ); } /*-------------------------------------------------------------------------- * HYPRE_SStructMaxwellSetMaxIter *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_sstructmaxwellsetmaxiter, HYPRE_SSTRUCTMAXWELLSETMAXITER) (hypre_F90_Obj *solver, hypre_F90_Int *max_iter, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) ( HYPRE_SStructMaxwellSetMaxIter( hypre_F90_PassObj (HYPRE_SStructSolver, solver), hypre_F90_PassInt (max_iter) )); } /*-------------------------------------------------------------------------- * HYPRE_SStructMaxwellSetRelChange *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_sstructmaxwellsetrelchang, HYPRE_SSTRUCTMAXWELLSETRELCHANG) (hypre_F90_Obj *solver, hypre_F90_Int *rel_change, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) ( HYPRE_SStructMaxwellSetRelChange( hypre_F90_PassObj (HYPRE_SStructSolver, solver), hypre_F90_PassInt (rel_change) )); } /*-------------------------------------------------------------------------- * HYPRE_SStructMaxwellSetNumPreRelax *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_sstructmaxwellsetnumprere, HYPRE_SSTRUCTMAXWELLSETNUMPRERE) (hypre_F90_Obj *solver, hypre_F90_Int *num_pre_relax, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) ( HYPRE_SStructMaxwellSetNumPreRelax( hypre_F90_PassObj (HYPRE_SStructSolver, solver), hypre_F90_PassInt (num_pre_relax) )); } /*-------------------------------------------------------------------------- * HYPRE_SStructMaxwellSetNumPostRelax *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_sstructmaxwellsetnumpostr, HYPRE_SSTRUCTMAXWELLSETNUMPOSTR) (hypre_F90_Obj *solver, hypre_F90_Int *num_post_relax, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) ( HYPRE_SStructMaxwellSetNumPostRelax( hypre_F90_PassObj (HYPRE_SStructSolver, solver), hypre_F90_PassInt (num_post_relax) )); } /*-------------------------------------------------------------------------- * HYPRE_SStructMaxwellSetLogging *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_sstructmaxwellsetlogging, HYPRE_SSTRUCTMAXWELLSETLOGGING) (hypre_F90_Obj *solver, hypre_F90_Int *logging, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) ( HYPRE_SStructMaxwellSetLogging( hypre_F90_PassObj (HYPRE_SStructSolver, solver), hypre_F90_PassInt (logging))); } /*-------------------------------------------------------------------------- HYPRE_SStructMaxwellSetPrintLevel *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_sstructmaxwellsetprintlev, HYPRE_SSTRUCTMAXWELLSETPRINTLEV) (hypre_F90_Obj *solver, hypre_F90_Int *print_level, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) ( HYPRE_SStructMaxwellSetPrintLevel( hypre_F90_PassObj (HYPRE_SStructSolver, solver), hypre_F90_PassInt (print_level) )); } /*-------------------------------------------------------------------------- * HYPRE_SStructMaxwellPrintLogging *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_sstructmaxwellprintloggin, HYPRE_SSTRUCTMAXWELLPRINTLOGGIN) (hypre_F90_Obj *solver, hypre_F90_Int *myid, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) ( HYPRE_SStructMaxwellPrintLogging( hypre_F90_PassObj (HYPRE_SStructSolver, solver), hypre_F90_PassInt (myid))); } /*-------------------------------------------------------------------------- * HYPRE_SStructMaxwellGetNumIterations *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_sstructmaxwellgetnumitera, HYPRE_SSTRUCTMAXWELLGETNUMITERA) (hypre_F90_Obj *solver, hypre_F90_Int *num_iterations, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) ( HYPRE_SStructMaxwellGetNumIterations( hypre_F90_PassObj (HYPRE_SStructSolver, solver), hypre_F90_PassIntRef (num_iterations) )); } /*-------------------------------------------------------------------------- * HYPRE_SStructMaxwellGetFinalRelativeResidualNorm *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_sstructmaxwellgetfinalrel, HYPRE_SSTRUCTMAXWELLGETFINALREL) (hypre_F90_Obj *solver, hypre_F90_Real *norm, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) ( HYPRE_SStructMaxwellGetFinalRelativeResidualNorm( hypre_F90_PassObj (HYPRE_SStructSolver, solver), hypre_F90_PassRealRef (norm) )); } /*-------------------------------------------------------------------------- * HYPRE_SStructMaxwellPhysBdy *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_sstructmaxwellphysbdy, HYPRE_SSTRUCTMAXWELLPHYSBDY) (hypre_F90_Obj *grid_l, hypre_F90_Int *num_levels, HYPRE_Int (*rfactors)[3], HYPRE_Int (***BdryRanks_ptr), HYPRE_Int (**BdryRanksCnt_ptr), hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) ( HYPRE_SStructMaxwellPhysBdy( hypre_F90_PassObjRef (HYPRE_SStructGrid, grid_l), hypre_F90_PassInt (num_levels), rfactors[3], BdryRanks_ptr, BdryRanksCnt_ptr )); } /*-------------------------------------------------------------------------- * HYPRE_SStructMaxwellEliminateRowsCols *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_sstructmaxwelleliminatero, HYPRE_SSTRUCTMAXWELLELIMINATERO) (hypre_F90_Obj *A, hypre_F90_Int *nrows, hypre_F90_IntArray *rows, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) ( HYPRE_SStructMaxwellEliminateRowsCols( hypre_F90_PassObj (HYPRE_ParCSRMatrix, A), hypre_F90_PassInt (nrows), hypre_F90_PassIntArray (rows) )); } /*-------------------------------------------------------------------------- * HYPRE_SStructMaxwellZeroVector *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_sstructmaxwellzerovector, HYPRE_SSTRUCTMAXWELLZEROVECTOR) (hypre_F90_Obj *b, hypre_F90_IntArray *rows, hypre_F90_Int *nrows, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) ( HYPRE_SStructMaxwellZeroVector( hypre_F90_PassObj (HYPRE_ParVector, b), hypre_F90_PassIntArray (rows), hypre_F90_PassInt (nrows) )); } #ifdef __cplusplus } #endif hypre-2.33.0/src/sstruct_ls/F90_HYPRE_sstruct_pcg.c000066400000000000000000000262321477326011500220260ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * HYPRE_SStructPCG interface * *****************************************************************************/ #include "_hypre_sstruct_ls.h" #include "fortran.h" #ifdef __cplusplus extern "C" { #endif /*-------------------------------------------------------------------------- * HYPRE_SStructPCGCreate *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_sstructpcgcreate, HYPRE_SSTRUCTPCGCREATE) (hypre_F90_Comm *comm, hypre_F90_Obj *solver, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) (HYPRE_SStructPCGCreate( hypre_F90_PassComm (comm), hypre_F90_PassObjRef (HYPRE_SStructSolver, solver) ) ); } /*-------------------------------------------------------------------------- * HYPRE_SStructPCGDestroy *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_sstructpcgdestroy, HYPRE_SSTRUCTPCGDESTROY) (hypre_F90_Obj *solver, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) (HYPRE_SStructPCGDestroy( hypre_F90_PassObj (HYPRE_SStructSolver, solver) )); } /*-------------------------------------------------------------------------- * HYPRE_SStructPCGSetup *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_sstructpcgsetup, HYPRE_SSTRUCTPCGSETUP) (hypre_F90_Obj *solver, hypre_F90_Obj *A, hypre_F90_Obj *b, hypre_F90_Obj *x, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) (HYPRE_SStructPCGSetup( hypre_F90_PassObj (HYPRE_SStructSolver, solver), hypre_F90_PassObj (HYPRE_SStructMatrix, A), hypre_F90_PassObj (HYPRE_SStructVector, b), hypre_F90_PassObj (HYPRE_SStructVector, x) ) ); } /*-------------------------------------------------------------------------- * HYPRE_SStructPCGSolve *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_sstructpcgsolve, HYPRE_SSTRUCTPCGSOLVE) (hypre_F90_Obj *solver, hypre_F90_Obj *A, hypre_F90_Obj *b, hypre_F90_Obj *x, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) (HYPRE_SStructPCGSolve( hypre_F90_PassObj (HYPRE_SStructSolver, solver), hypre_F90_PassObj (HYPRE_SStructMatrix, A), hypre_F90_PassObj (HYPRE_SStructVector, b), hypre_F90_PassObj (HYPRE_SStructVector, x) ) ); } /*-------------------------------------------------------------------------- * HYPRE_SStructPCGSetTol *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_sstructpcgsettol, HYPRE_SSTRUCTPCGSETTOL) (hypre_F90_Obj *solver, hypre_F90_Real *tol, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) (HYPRE_SStructPCGSetTol( hypre_F90_PassObj (HYPRE_SStructSolver, solver), hypre_F90_PassReal (tol) ) ); } /*-------------------------------------------------------------------------- * HYPRE_SStructPCGSetAbsoluteTol *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_sstructpcgsetabsolutetol, HYPRE_SSTRUCTPCGSETABSOLUTETOL) (hypre_F90_Obj *solver, hypre_F90_Real *tol, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) (HYPRE_SStructPCGSetAbsoluteTol( hypre_F90_PassObj (HYPRE_SStructSolver, solver), hypre_F90_PassReal (tol) ) ); } /*-------------------------------------------------------------------------- * HYPRE_SStructPCGSetMaxIter *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_sstructpcgsetmaxiter, HYPRE_SSTRUCTPCGSETMAXITER) (hypre_F90_Obj *solver, hypre_F90_Int *max_iter, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) (HYPRE_SStructPCGSetMaxIter( hypre_F90_PassObj (HYPRE_SStructSolver, solver), hypre_F90_PassInt (max_iter) ) ); } /*-------------------------------------------------------------------------- * HYPRE_SStructPCGSetTwoNorm *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_sstructpcgsettwonorm, HYPRE_SSTRUCTPCGSETTWONORM) (hypre_F90_Obj *solver, hypre_F90_Int *two_norm, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) (HYPRE_SStructPCGSetTwoNorm( hypre_F90_PassObj (HYPRE_SStructSolver, solver), hypre_F90_PassInt (two_norm) ) ); } /*-------------------------------------------------------------------------- * HYPRE_SStructPCGSetRelChange *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_sstructpcgsetrelchange, HYPRE_SSTRUCTPCGSETRELCHANGE) (hypre_F90_Obj *solver, hypre_F90_Int *rel_change, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) (HYPRE_SStructPCGSetRelChange( hypre_F90_PassObj (HYPRE_SStructSolver, solver), hypre_F90_PassInt (rel_change) ) ); } /*-------------------------------------------------------------------------- * HYPRE_SStructPCGSetPrecond *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_sstructpcgsetprecond, HYPRE_SSTRUCTPCGSETPRECOND) (hypre_F90_Obj *solver, hypre_F90_Int *precond_id, hypre_F90_Obj *precond_solver, hypre_F90_Int *ierr) /*------------------------------------------ * precond_id flags mean: * 2 - setup a split-solver preconditioner * 3 - setup a syspfmg preconditioner * 8 - setup a DiagScale preconditioner * 9 - no preconditioner setup *----------------------------------------*/ { if (*precond_id == 2) { *ierr = (hypre_F90_Int) (HYPRE_SStructPCGSetPrecond( hypre_F90_PassObj (HYPRE_SStructSolver, solver), HYPRE_SStructSplitSolve, HYPRE_SStructSplitSetup, hypre_F90_PassObjRef (HYPRE_SStructSolver, precond_solver))); } else if (*precond_id == 3) { *ierr = (hypre_F90_Int) (HYPRE_SStructPCGSetPrecond( hypre_F90_PassObj (HYPRE_SStructSolver, solver), HYPRE_SStructSysPFMGSolve, HYPRE_SStructSysPFMGSetup, hypre_F90_PassObjRef (HYPRE_SStructSolver, precond_solver))); } else if (*precond_id == 8) { *ierr = (hypre_F90_Int) (HYPRE_SStructPCGSetPrecond( hypre_F90_PassObj (HYPRE_SStructSolver, solver), HYPRE_SStructDiagScale, HYPRE_SStructDiagScaleSetup, hypre_F90_PassObjRef (HYPRE_SStructSolver, precond_solver))); } else if (*precond_id == 9) { *ierr = 0; } else { *ierr = -1; } } /*-------------------------------------------------------------------------- * HYPRE_SStructPCGSetLogging *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_sstructpcgsetlogging, HYPRE_SSTRUCTPCGSETLOGGING) (hypre_F90_Obj *solver, hypre_F90_Int *logging, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) (HYPRE_SStructPCGSetLogging( hypre_F90_PassObj (HYPRE_SStructSolver, solver), hypre_F90_PassInt (logging) ) ); } /*-------------------------------------------------------------------------- * HYPRE_SStructPCGSetPrintLevel *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_sstructpcgsetprintlevel, HYPRE_SSTRUCTPCGSETPRINTLEVEL) (hypre_F90_Obj *solver, hypre_F90_Int *level, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) (HYPRE_SStructPCGSetPrintLevel( hypre_F90_PassObj (HYPRE_SStructSolver, solver), hypre_F90_PassInt (level) ) ); } /*-------------------------------------------------------------------------- * HYPRE_SStructPCGGetNumIterations *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_sstructpcggetnumiteration, HYPRE_SSTRUCTPCGGETNUMITERATION) (hypre_F90_Obj *solver, hypre_F90_Int *num_iterations, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) (HYPRE_SStructPCGGetNumIterations( hypre_F90_PassObj (HYPRE_SStructSolver, solver), hypre_F90_PassIntRef (num_iterations) ) ); } /*-------------------------------------------------------------------------- * HYPRE_SStructPCGGetFinalRelativeResidualNorm *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_sstructpcggetfinalrelativ, HYPRE_SSTRUCTPCGGETFINALRELATIV) (hypre_F90_Obj *solver, hypre_F90_Real *norm, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) (HYPRE_SStructPCGGetFinalRelativeResidualNorm( hypre_F90_PassObj (HYPRE_SStructSolver, solver), hypre_F90_PassRealRef (norm) ) ); } /*-------------------------------------------------------------------------- * HYPRE_SStructPCGGetResidual *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_sstructpcggetresidual, HYPRE_SSTRUCTPCGGETRESIDUAL) (hypre_F90_Obj *solver, hypre_F90_Obj *residual, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) (HYPRE_SStructPCGGetResidual( hypre_F90_PassObj (HYPRE_SStructSolver, solver), (void **) *residual ) ); } /*-------------------------------------------------------------------------- * HYPRE_SStructDiagScaleSetup *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_sstructdiagscalesetup, HYPRE_SSTRUCTDIAGSCALESETUP) (hypre_F90_Obj *solver, hypre_F90_Obj *A, hypre_F90_Obj *y, hypre_F90_Obj *x, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) (HYPRE_SStructDiagScaleSetup( hypre_F90_PassObj (HYPRE_SStructSolver, solver), hypre_F90_PassObj (HYPRE_SStructMatrix, A), hypre_F90_PassObj (HYPRE_SStructVector, y), hypre_F90_PassObj (HYPRE_SStructVector, x) ) ); } /*-------------------------------------------------------------------------- * HYPRE_SStructDiagScale *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_sstructdiagscale, HYPRE_SSTRUCTDIAGSCALE) (hypre_F90_Obj *solver, hypre_F90_Obj *A, hypre_F90_Obj *y, hypre_F90_Obj *x, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) (HYPRE_SStructDiagScale( hypre_F90_PassObj (HYPRE_SStructSolver, solver), hypre_F90_PassObj (HYPRE_SStructMatrix, A), hypre_F90_PassObj (HYPRE_SStructVector, y), hypre_F90_PassObj (HYPRE_SStructVector, x) ) ); } #ifdef __cplusplus } #endif hypre-2.33.0/src/sstruct_ls/F90_HYPRE_sstruct_split.c000066400000000000000000000147731477326011500224170ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * HYPRE_SStructSplit solver interface *****************************************************************************/ #include "_hypre_sstruct_ls.h" #include "fortran.h" #ifdef __cplusplus extern "C" { #endif /*-------------------------------------------------------------------------- * HYPRE_SStructSplitCreate *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_sstructsplitcreate, HYPRE_SSTRUCTSPLITCREATE) (hypre_F90_Comm *comm, hypre_F90_Obj *solver_ptr, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) (HYPRE_SStructSplitCreate( hypre_F90_PassComm (comm), hypre_F90_PassObjRef (HYPRE_SStructSolver, solver_ptr) ) ); } /*-------------------------------------------------------------------------- * HYPRE_SStructSplitDestroy *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_sstructsplitdestroy, HYPRE_SSTRUCTSPLITDESTROY) (hypre_F90_Obj *solver, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) (HYPRE_SStructSplitDestroy( hypre_F90_PassObj (HYPRE_SStructSolver, solver) ) ); } /*-------------------------------------------------------------------------- * HYPRE_SStructSplitSetup *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_sstructsplitsetup, HYPRE_SSTRUCTSPLITSETUP) (hypre_F90_Obj *solver, hypre_F90_Obj *A, hypre_F90_Obj *b, hypre_F90_Obj *x, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) (HYPRE_SStructSplitSetup( hypre_F90_PassObj (HYPRE_SStructSolver, solver), hypre_F90_PassObj (HYPRE_SStructMatrix, A), hypre_F90_PassObj (HYPRE_SStructVector, b), hypre_F90_PassObj (HYPRE_SStructVector, x) ) ); } /*-------------------------------------------------------------------------- * HYPRE_SStructSplitSolve *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_sstructsplitsolve, HYPRE_SSTRUCTSPLITSOLVE) (hypre_F90_Obj *solver, hypre_F90_Obj *A, hypre_F90_Obj *b, hypre_F90_Obj *x, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) (HYPRE_SStructSplitSolve( hypre_F90_PassObj (HYPRE_SStructSolver, solver), hypre_F90_PassObj (HYPRE_SStructMatrix, A), hypre_F90_PassObj (HYPRE_SStructVector, b), hypre_F90_PassObj (HYPRE_SStructVector, x) ) ); } /*-------------------------------------------------------------------------- * HYPRE_SStructSplitSetTol *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_sstructsplitsettol, HYPRE_SSTRUCTSPLITSETTOL) (hypre_F90_Obj *solver, hypre_F90_Real *tol, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) (HYPRE_SStructSplitSetTol( hypre_F90_PassObj (HYPRE_SStructSolver, solver), hypre_F90_PassReal (tol) ) ); } /*-------------------------------------------------------------------------- * HYPRE_SStructSplitSetMaxIter *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_sstructsplitsetmaxiter, HYPRE_SSTRUCTSPLITSETMAXITER) (hypre_F90_Obj *solver, hypre_F90_Int *max_iter, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) (HYPRE_SStructSplitSetMaxIter( hypre_F90_PassObj (HYPRE_SStructSolver, solver), hypre_F90_PassInt (max_iter) ) ); } /*-------------------------------------------------------------------------- * HYPRE_SStructSplitSetZeroGuess *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_sstructsplitsetzeroguess, HYPRE_SSTRUCTSPLITSETZEROGUESS) (hypre_F90_Obj *solver, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) (HYPRE_SStructSplitSetZeroGuess( hypre_F90_PassObj (HYPRE_SStructSolver, solver) ) ); } /*-------------------------------------------------------------------------- * HYPRE_SStructSplitSetNonZeroGuess *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_sstructsplitsetnonzerogue, HYPRE_SSTRUCTSPLITSETNONZEROGUE) (hypre_F90_Obj *solver, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) (HYPRE_SStructSplitSetNonZeroGuess( hypre_F90_PassObj (HYPRE_SStructSolver, solver) )); } /*-------------------------------------------------------------------------- * HYPRE_SStructSplitSetStructSolver *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_sstructsplitsetstructsolv, HYPRE_SSTRUCTSPLITSETSTRUCTSOLV) (hypre_F90_Obj *solver, hypre_F90_Int *ssolver, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) (HYPRE_SStructSplitSetStructSolver( hypre_F90_PassObj (HYPRE_SStructSolver, solver), hypre_F90_PassInt (ssolver) ) ); } /*-------------------------------------------------------------------------- * HYPRE_SStructSplitGetNumIterations *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_sstructsplitgetnumiterati, HYPRE_SSTRUCTSPLITGETNUMITERATI) (hypre_F90_Obj *solver, hypre_F90_Int *num_iterations, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) (HYPRE_SStructSplitGetNumIterations( hypre_F90_PassObj (HYPRE_SStructSolver, solver), hypre_F90_PassIntRef (num_iterations) ) ); } /*-------------------------------------------------------------------------- * HYPRE_SStructSplitGetFinalRelativeResidualNorm *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_sstructsplitgetfinalrelat, HYPRE_SSTRUCTSPLITGETFINALRELAT) (hypre_F90_Obj *solver, hypre_F90_Real *norm, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) (HYPRE_SStructSplitGetFinalRelativeResidualNorm( hypre_F90_PassObj (HYPRE_SStructSolver, solver), hypre_F90_PassRealRef (norm) ) ); } #ifdef __cplusplus } #endif hypre-2.33.0/src/sstruct_ls/F90_HYPRE_sstruct_sys_pfmg.c000066400000000000000000000255121477326011500231040ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * HYPRE_SStructSysPFMG interface * *****************************************************************************/ #include "_hypre_sstruct_ls.h" #include "fortran.h" #ifdef __cplusplus extern "C" { #endif /*-------------------------------------------------------------------------- * HYPRE_SStructSysPFMGCreate *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_sstructsyspfmgcreate, HYPRE_SSTRUCTSYSPFMGCREATE) (hypre_F90_Comm *comm, hypre_F90_Obj *solver, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) (HYPRE_SStructSysPFMGCreate( hypre_F90_PassComm (comm), hypre_F90_PassObjRef (HYPRE_SStructSolver, solver) )); } /*-------------------------------------------------------------------------- * HYPRE_SStructSysPFMGDestroy *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_sstructsyspfmgdestroy, HYPRE_SSTRUCTSYSPFMGDESTROY) (hypre_F90_Obj *solver, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) (HYPRE_SStructSysPFMGDestroy( hypre_F90_PassObj (HYPRE_SStructSolver, solver) )); } /*-------------------------------------------------------------------------- * HYPRE_SStructSysPFMGSetup *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_sstructsyspfmgsetup, HYPRE_SSTRUCTSYSPFMGSETUP) (hypre_F90_Obj *solver, hypre_F90_Obj *A, hypre_F90_Obj *b, hypre_F90_Obj *x, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) (HYPRE_SStructSysPFMGSetup( hypre_F90_PassObj (HYPRE_SStructSolver, solver), hypre_F90_PassObj (HYPRE_SStructMatrix, A), hypre_F90_PassObj (HYPRE_SStructVector, b), hypre_F90_PassObj (HYPRE_SStructVector, x) ) ); } /*-------------------------------------------------------------------------- * HYPRE_SStructSysPFMGSolve *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_sstructsyspfmgsolve, HYPRE_SSTRUCTSYSPFMGSOLVE) (hypre_F90_Obj *solver, hypre_F90_Obj *A, hypre_F90_Obj *b, hypre_F90_Obj *x, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) (HYPRE_SStructSysPFMGSolve( hypre_F90_PassObj (HYPRE_SStructSolver, solver), hypre_F90_PassObj (HYPRE_SStructMatrix, A), hypre_F90_PassObj (HYPRE_SStructVector, b), hypre_F90_PassObj (HYPRE_SStructVector, x) ) ); } /*-------------------------------------------------------------------------- * HYPRE_SStructSysPFMGSetTol *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_sstructsyspfmgsettol, HYPRE_SSTRUCTSYSPFMGSETTOL) (hypre_F90_Obj *solver, hypre_F90_Real *tol, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) (HYPRE_SStructSysPFMGSetTol( hypre_F90_PassObj (HYPRE_SStructSolver, solver), hypre_F90_PassReal (tol) ) ); } /*-------------------------------------------------------------------------- * HYPRE_SStructSysPFMGSetMaxIter *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_sstructsyspfmgsetmaxiter, HYPRE_SSTRUCTSYSPFMGSETMAXITER) (hypre_F90_Obj *solver, hypre_F90_Int *max_iter, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) (HYPRE_SStructSysPFMGSetMaxIter( hypre_F90_PassObj (HYPRE_SStructSolver, solver), hypre_F90_PassInt (max_iter) ) ); } /*-------------------------------------------------------------------------- * HYPRE_SStructSysPFMGSetRelChange *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_sstructsyspfmgsetrelchang, HYPRE_SSTRUCTSYSPFMGSETRELCHANG) (hypre_F90_Obj *solver, hypre_F90_Int *rel_change, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) (HYPRE_SStructSysPFMGSetRelChange( hypre_F90_PassObj (HYPRE_SStructSolver, solver), hypre_F90_PassInt (rel_change) )); } /*-------------------------------------------------------------------------- * HYPRE_SStructSysPFMGSetZeroGuess *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_sstructsyspfmgsetzerogues, HYPRE_SSTRUCTSYSPFMGSETZEROGUES) (hypre_F90_Obj *solver, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) (HYPRE_SStructSysPFMGSetZeroGuess( hypre_F90_PassObj (HYPRE_SStructSolver, solver) )); } /*-------------------------------------------------------------------------- * HYPRE_SStructSysPFMGSetNonZeroGuess *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_sstructsyspfmgsetnonzerog, HYPRE_SSTRUCTSYSPFMGSETNONZEROG) (hypre_F90_Obj *solver, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) (HYPRE_SStructSysPFMGSetNonZeroGuess( hypre_F90_PassObj (HYPRE_SStructSolver, solver) )); } /*-------------------------------------------------------------------------- * HYPRE_SStructSysPFMGSetRelaxType *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_sstructsyspfmgsetrelaxtyp, HYPRE_SSTRUCTSYSPFMGSETRELAXTYP) (hypre_F90_Obj *solver, hypre_F90_Int *relax_type, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) (HYPRE_SStructSysPFMGSetRelaxType( hypre_F90_PassObj (HYPRE_SStructSolver, solver), hypre_F90_PassInt (relax_type) )); } /*-------------------------------------------------------------------------- * HYPRE_SStructSysPFMGSetJacobiWeight *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_sstructsyspfmgsetjacobiweigh, HYPRE_SSTRUCTSYSPFMGSETJACOBIWEIGH) (hypre_F90_Obj *solver, hypre_F90_Real *weight, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) (HYPRE_SStructSysPFMGSetJacobiWeight( hypre_F90_PassObj (HYPRE_SStructSolver, solver), hypre_F90_PassReal (weight) ) ); } /*-------------------------------------------------------------------------- * HYPRE_SStructSysPFMGSetNumPreRelax *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_sstructsyspfmgsetnumprere, HYPRE_SSTRUCTSYSPFMGSETNUMPRERE) (hypre_F90_Obj *solver, hypre_F90_Int *num_pre_relax, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) (HYPRE_SStructSysPFMGSetNumPreRelax( hypre_F90_PassObj (HYPRE_SStructSolver, solver), hypre_F90_PassInt (num_pre_relax) )); } /*-------------------------------------------------------------------------- * HYPRE_SStructSysPFMGSetNumPostRelax *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_sstructsyspfmgsetnumpostr, HYPRE_SSTRUCTSYSPFMGSETNUMPOSTR) (hypre_F90_Obj *solver, hypre_F90_Int *num_post_relax, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) (HYPRE_SStructSysPFMGSetNumPostRelax( hypre_F90_PassObj (HYPRE_SStructSolver, solver), hypre_F90_PassInt (num_post_relax) )); } /*-------------------------------------------------------------------------- * HYPRE_SStructSysPFMGSetSkipRelax *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_sstructsyspfmgsetskiprela, HYPRE_SSTRUCTSYSPFMGSETSKIPRELA) (hypre_F90_Obj *solver, hypre_F90_Int *skip_relax, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) (HYPRE_SStructSysPFMGSetSkipRelax( hypre_F90_PassObj (HYPRE_SStructSolver, solver), hypre_F90_PassInt (skip_relax) )); } /*-------------------------------------------------------------------------- * HYPRE_SStructSysPFMGSetDxyz *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_sstructsyspfmgsetdxyz, HYPRE_SSTRUCTSYSPFMGSETDXYZ) (hypre_F90_Obj *solver, hypre_F90_RealArray *dxyz, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) (HYPRE_SStructSysPFMGSetDxyz( hypre_F90_PassObj (HYPRE_SStructSolver, solver), hypre_F90_PassRealArray (dxyz) )); } /*-------------------------------------------------------------------------- * HYPRE_SStructSysPFMGSetLogging *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_sstructsyspfmgsetlogging, HYPRE_SSTRUCTSYSPFMGSETLOGGING) (hypre_F90_Obj *solver, hypre_F90_Int *logging, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) (HYPRE_SStructSysPFMGSetLogging( hypre_F90_PassObj (HYPRE_SStructSolver, solver), hypre_F90_PassInt (logging) )); } /*-------------------------------------------------------------------------- HYPRE_SStructSysPFMGSetPrintLevel *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_sstructsyspfmgsetprintlev, HYPRE_SSTRUCTSYSPFMGSETPRINTLEV) (hypre_F90_Obj *solver, hypre_F90_Int *print_level, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) (HYPRE_SStructSysPFMGSetPrintLevel( hypre_F90_PassObj (HYPRE_SStructSolver, solver), hypre_F90_PassInt (print_level) )); } /*-------------------------------------------------------------------------- * HYPRE_SStructSysPFMGGetNumIterations *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_sstructsyspfmggetnumitera, HYPRE_SSTRUCTSYSPFMGGETNUMITERA) (hypre_F90_Obj *solver, hypre_F90_Int *num_iterations, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) (HYPRE_SStructSysPFMGGetNumIterations( hypre_F90_PassObj (HYPRE_SStructSolver, solver), hypre_F90_PassIntRef (num_iterations) )); } /*-------------------------------------------------------------------------- * HYPRE_SStructSysPFMGGetFinalRelativeResidualNorm *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_sstructsyspfmggetfinalrel, HYPRE_SSTRUCTSYSPFMGGETFINALREL) (hypre_F90_Obj *solver, hypre_F90_Real *norm, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) (HYPRE_SStructSysPFMGGetFinalRelativeResidualNorm( hypre_F90_PassObj (HYPRE_SStructSolver, solver), hypre_F90_PassRealRef (norm) )); } #ifdef __cplusplus } #endif hypre-2.33.0/src/sstruct_ls/HYPRE_sstruct_InterFAC.c000066400000000000000000000264141477326011500222340ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * HYPRE_SStructFAC Routines * *****************************************************************************/ #include "_hypre_sstruct_ls.h" /*-------------------------------------------------------------------------- * HYPRE_SStructFACCreate *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_SStructFACCreate( MPI_Comm comm, HYPRE_SStructSolver *solver ) { *solver = ( (HYPRE_SStructSolver) hypre_FACCreate( comm ) ); return 0; } /*-------------------------------------------------------------------------- * HYPRE_SStructFACDestroy2 *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_SStructFACDestroy2( HYPRE_SStructSolver solver ) { return ( hypre_FACDestroy2( (void *) solver ) ); } /*-------------------------------------------------------------------------- * HYPRE_SStructFACAMR_RAP *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_SStructFACAMR_RAP( HYPRE_SStructMatrix A, HYPRE_Int (*rfactors)[HYPRE_MAXDIM], HYPRE_SStructMatrix *fac_A ) { return ( hypre_AMR_RAP(A, rfactors, fac_A) ); } /*-------------------------------------------------------------------------- * HYPRE_SStructFACSetup2 *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_SStructFACSetup2( HYPRE_SStructSolver solver, HYPRE_SStructMatrix A, HYPRE_SStructVector b, HYPRE_SStructVector x ) { return ( hypre_FacSetup2( (void *) solver, (hypre_SStructMatrix *) A, (hypre_SStructVector *) b, (hypre_SStructVector *) x ) ); } /*-------------------------------------------------------------------------- * HYPRE_SStructFACSolve3 *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_SStructFACSolve3(HYPRE_SStructSolver solver, HYPRE_SStructMatrix A, HYPRE_SStructVector b, HYPRE_SStructVector x) { return ( hypre_FACSolve3((void *) solver, (hypre_SStructMatrix *) A, (hypre_SStructVector *) b, (hypre_SStructVector *) x ) ); } /*-------------------------------------------------------------------------- * HYPRE_SStructFACSetTol *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_SStructFACSetTol( HYPRE_SStructSolver solver, HYPRE_Real tol ) { return ( hypre_FACSetTol( (void *) solver, tol ) ); } /*-------------------------------------------------------------------------- * HYPRE_SStructFACSetPLevels *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_SStructFACSetPLevels( HYPRE_SStructSolver solver, HYPRE_Int nparts, HYPRE_Int *plevels) { return ( hypre_FACSetPLevels( (void *) solver, nparts, plevels ) ); } /*-------------------------------------------------------------------------- * HYPRE_SStructFACZeroCFSten *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_SStructFACZeroCFSten( HYPRE_SStructMatrix A, HYPRE_SStructGrid grid, HYPRE_Int part, HYPRE_Int rfactors[HYPRE_MAXDIM] ) { hypre_SStructPMatrix *Af = hypre_SStructMatrixPMatrix(A, part); hypre_SStructPMatrix *Ac = hypre_SStructMatrixPMatrix(A, part - 1); return ( hypre_FacZeroCFSten(Af, Ac, (hypre_SStructGrid *)grid, part, rfactors) ); } /*-------------------------------------------------------------------------- * HYPRE_SStructFACZeroFCSten *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_SStructFACZeroFCSten( HYPRE_SStructMatrix A, HYPRE_SStructGrid grid, HYPRE_Int part ) { hypre_SStructPMatrix *Af = hypre_SStructMatrixPMatrix(A, part); return ( hypre_FacZeroFCSten(Af, (hypre_SStructGrid *)grid, part) ); } /*-------------------------------------------------------------------------- * HYPRE_SStructFACZeroAMRMatrixData *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_SStructFACZeroAMRMatrixData( HYPRE_SStructMatrix A, HYPRE_Int part_crse, HYPRE_Int rfactors[HYPRE_MAXDIM] ) { return ( hypre_ZeroAMRMatrixData(A, part_crse, rfactors) ); } /*-------------------------------------------------------------------------- * HYPRE_SStructFACZeroAMRVectorData *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_SStructFACZeroAMRVectorData( HYPRE_SStructVector b, HYPRE_Int *plevels, HYPRE_Int (*rfactors)[HYPRE_MAXDIM] ) { return ( hypre_ZeroAMRVectorData(b, plevels, rfactors) ); } /*-------------------------------------------------------------------------- * HYPRE_SStructFACSetPRefinements *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_SStructFACSetPRefinements( HYPRE_SStructSolver solver, HYPRE_Int nparts, HYPRE_Int (*rfactors)[HYPRE_MAXDIM] ) { return ( hypre_FACSetPRefinements( (void *) solver, nparts, rfactors ) ); } /*-------------------------------------------------------------------------- * HYPRE_SStructFACSetMaxLevels *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_SStructFACSetMaxLevels( HYPRE_SStructSolver solver, HYPRE_Int max_levels ) { return ( hypre_FACSetMaxLevels( (void *) solver, max_levels ) ); } /*-------------------------------------------------------------------------- * HYPRE_SStructFACSetMaxIter *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_SStructFACSetMaxIter( HYPRE_SStructSolver solver, HYPRE_Int max_iter ) { return ( hypre_FACSetMaxIter( (void *) solver, max_iter ) ); } /*-------------------------------------------------------------------------- * HYPRE_SStructFACSetRelChange *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_SStructFACSetRelChange( HYPRE_SStructSolver solver, HYPRE_Int rel_change ) { return ( hypre_FACSetRelChange( (void *) solver, rel_change ) ); } /*-------------------------------------------------------------------------- * HYPRE_SStructFACSetZeroGuess *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_SStructFACSetZeroGuess( HYPRE_SStructSolver solver ) { return ( hypre_FACSetZeroGuess( (void *) solver, 1 ) ); } /*-------------------------------------------------------------------------- * HYPRE_SStructFACSetNonZeroGuess *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_SStructFACSetNonZeroGuess( HYPRE_SStructSolver solver ) { return ( hypre_FACSetZeroGuess( (void *) solver, 0 ) ); } /*-------------------------------------------------------------------------- * HYPRE_SStructFACSetRelaxType *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_SStructFACSetRelaxType( HYPRE_SStructSolver solver, HYPRE_Int relax_type ) { return ( hypre_FACSetRelaxType( (void *) solver, relax_type) ); } /*-------------------------------------------------------------------------- * HYPRE_SStructFACSetJacobiWeight *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_SStructFACSetJacobiWeight( HYPRE_SStructSolver solver, HYPRE_Real weight) { return ( hypre_FACSetJacobiWeight( (void *) solver, weight) ); } /*-------------------------------------------------------------------------- * HYPRE_SStructFACSetNumPreRelax *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_SStructFACSetNumPreRelax( HYPRE_SStructSolver solver, HYPRE_Int num_pre_relax ) { return ( hypre_FACSetNumPreSmooth( (void *) solver, num_pre_relax) ); } /*-------------------------------------------------------------------------- * HYPRE_SStructFACSetNumPostRelax *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_SStructFACSetNumPostRelax( HYPRE_SStructSolver solver, HYPRE_Int num_post_relax ) { return ( hypre_FACSetNumPostSmooth( (void *) solver, num_post_relax) ); } /*-------------------------------------------------------------------------- * HYPRE_SStructFACSetCoarseSolverType *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_SStructFACSetCoarseSolverType( HYPRE_SStructSolver solver, HYPRE_Int csolver_type) { return ( hypre_FACSetCoarseSolverType( (void *) solver, csolver_type) ); } /*-------------------------------------------------------------------------- * HYPRE_SStructFACSetLogging *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_SStructFACSetLogging( HYPRE_SStructSolver solver, HYPRE_Int logging ) { return ( hypre_FACSetLogging( (void *) solver, logging) ); } /*-------------------------------------------------------------------------- * HYPRE_SStructFACGetNumIterations *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_SStructFACGetNumIterations( HYPRE_SStructSolver solver, HYPRE_Int *num_iterations ) { return ( hypre_FACGetNumIterations( (void *) solver, num_iterations ) ); } /*-------------------------------------------------------------------------- * HYPRE_SStructFACGetFinalRelativeResidualNorm *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_SStructFACGetFinalRelativeResidualNorm( HYPRE_SStructSolver solver, HYPRE_Real *norm ) { return ( hypre_FACGetFinalRelativeResidualNorm( (void *) solver, norm ) ); } hypre-2.33.0/src/sstruct_ls/HYPRE_sstruct_bicgstab.c000066400000000000000000000165471477326011500224250ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "_hypre_sstruct_ls.h" /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_SStructBiCGSTABCreate( MPI_Comm comm, HYPRE_SStructSolver *solver ) { HYPRE_UNUSED_VAR(comm); hypre_BiCGSTABFunctions * bicgstab_functions = hypre_BiCGSTABFunctionsCreate( hypre_SStructKrylovCreateVector, hypre_SStructKrylovDestroyVector, hypre_SStructKrylovMatvecCreate, hypre_SStructKrylovMatvec, hypre_SStructKrylovMatvecDestroy, hypre_SStructKrylovInnerProd, hypre_SStructKrylovCopyVector, hypre_SStructKrylovClearVector, hypre_SStructKrylovScaleVector, hypre_SStructKrylovAxpy, hypre_SStructKrylovCommInfo, hypre_SStructKrylovIdentitySetup, hypre_SStructKrylovIdentity ); *solver = ( (HYPRE_SStructSolver) hypre_BiCGSTABCreate( bicgstab_functions ) ); return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_SStructBiCGSTABDestroy( HYPRE_SStructSolver solver ) { return ( hypre_BiCGSTABDestroy( (void *) solver ) ); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_SStructBiCGSTABSetup( HYPRE_SStructSolver solver, HYPRE_SStructMatrix A, HYPRE_SStructVector b, HYPRE_SStructVector x ) { return ( HYPRE_BiCGSTABSetup( (HYPRE_Solver) solver, (HYPRE_Matrix) A, (HYPRE_Vector) b, (HYPRE_Vector) x ) ); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_SStructBiCGSTABSolve( HYPRE_SStructSolver solver, HYPRE_SStructMatrix A, HYPRE_SStructVector b, HYPRE_SStructVector x ) { return ( HYPRE_BiCGSTABSolve( (HYPRE_Solver) solver, (HYPRE_Matrix) A, (HYPRE_Vector) b, (HYPRE_Vector) x ) ); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_SStructBiCGSTABSetTol( HYPRE_SStructSolver solver, HYPRE_Real tol ) { return ( HYPRE_BiCGSTABSetTol( (HYPRE_Solver) solver, tol ) ); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_SStructBiCGSTABSetAbsoluteTol( HYPRE_SStructSolver solver, HYPRE_Real tol ) { return ( HYPRE_BiCGSTABSetAbsoluteTol( (HYPRE_Solver) solver, tol ) ); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_SStructBiCGSTABSetMinIter( HYPRE_SStructSolver solver, HYPRE_Int min_iter ) { return ( HYPRE_BiCGSTABSetMinIter( (HYPRE_Solver) solver, min_iter ) ); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_SStructBiCGSTABSetMaxIter( HYPRE_SStructSolver solver, HYPRE_Int max_iter ) { return ( HYPRE_BiCGSTABSetMaxIter( (HYPRE_Solver) solver, max_iter ) ); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_SStructBiCGSTABSetStopCrit( HYPRE_SStructSolver solver, HYPRE_Int stop_crit ) { return ( HYPRE_BiCGSTABSetStopCrit( (HYPRE_Solver) solver, stop_crit ) ); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_SStructBiCGSTABSetPrecond( HYPRE_SStructSolver solver, HYPRE_PtrToSStructSolverFcn precond, HYPRE_PtrToSStructSolverFcn precond_setup, void * precond_data ) { return ( HYPRE_BiCGSTABSetPrecond( (HYPRE_Solver) solver, (HYPRE_PtrToSolverFcn) precond, (HYPRE_PtrToSolverFcn) precond_setup, (HYPRE_Solver) precond_data ) ); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_SStructBiCGSTABSetLogging( HYPRE_SStructSolver solver, HYPRE_Int logging ) { return ( HYPRE_BiCGSTABSetLogging( (HYPRE_Solver) solver, logging ) ); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_SStructBiCGSTABSetPrintLevel( HYPRE_SStructSolver solver, HYPRE_Int print_level ) { return ( HYPRE_BiCGSTABSetPrintLevel( (HYPRE_Solver) solver, print_level ) ); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_SStructBiCGSTABGetNumIterations( HYPRE_SStructSolver solver, HYPRE_Int *num_iterations ) { return ( HYPRE_BiCGSTABGetNumIterations( (HYPRE_Solver) solver, num_iterations ) ); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_SStructBiCGSTABGetFinalRelativeResidualNorm( HYPRE_SStructSolver solver, HYPRE_Real *norm ) { return ( HYPRE_BiCGSTABGetFinalRelativeResidualNorm( (HYPRE_Solver) solver, norm ) ); } /*-------------------------------------------------------------------------- * HYPRE_SStructBiCGSTABGetResidual *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_SStructBiCGSTABGetResidual( HYPRE_SStructSolver solver, void **residual) { return ( HYPRE_BiCGSTABGetResidual( (HYPRE_Solver) solver, residual ) ); } hypre-2.33.0/src/sstruct_ls/HYPRE_sstruct_flexgmres.c000066400000000000000000000176211477326011500226350ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "_hypre_sstruct_ls.h" /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_SStructFlexGMRESCreate( MPI_Comm comm, HYPRE_SStructSolver *solver ) { HYPRE_UNUSED_VAR(comm); hypre_FlexGMRESFunctions * fgmres_functions = hypre_FlexGMRESFunctionsCreate( hypre_SStructKrylovCAlloc, hypre_SStructKrylovFree, hypre_SStructKrylovCommInfo, hypre_SStructKrylovCreateVector, hypre_SStructKrylovCreateVectorArray, hypre_SStructKrylovDestroyVector, hypre_SStructKrylovMatvecCreate, hypre_SStructKrylovMatvec, hypre_SStructKrylovMatvecDestroy, hypre_SStructKrylovInnerProd, hypre_SStructKrylovCopyVector, hypre_SStructKrylovClearVector, hypre_SStructKrylovScaleVector, hypre_SStructKrylovAxpy, hypre_SStructKrylovIdentitySetup, hypre_SStructKrylovIdentity ); *solver = ( (HYPRE_SStructSolver) hypre_FlexGMRESCreate( fgmres_functions ) ); return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_SStructFlexGMRESDestroy( HYPRE_SStructSolver solver ) { return ( hypre_FlexGMRESDestroy( (void *) solver ) ); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_SStructFlexGMRESSetup( HYPRE_SStructSolver solver, HYPRE_SStructMatrix A, HYPRE_SStructVector b, HYPRE_SStructVector x ) { return ( HYPRE_FlexGMRESSetup( (HYPRE_Solver) solver, (HYPRE_Matrix) A, (HYPRE_Vector) b, (HYPRE_Vector) x ) ); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_SStructFlexGMRESSolve( HYPRE_SStructSolver solver, HYPRE_SStructMatrix A, HYPRE_SStructVector b, HYPRE_SStructVector x ) { return ( HYPRE_FlexGMRESSolve( (HYPRE_Solver) solver, (HYPRE_Matrix) A, (HYPRE_Vector) b, (HYPRE_Vector) x ) ); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_SStructFlexGMRESSetKDim( HYPRE_SStructSolver solver, HYPRE_Int k_dim ) { return ( HYPRE_FlexGMRESSetKDim( (HYPRE_Solver) solver, k_dim ) ); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_SStructFlexGMRESSetTol( HYPRE_SStructSolver solver, HYPRE_Real tol ) { return ( HYPRE_FlexGMRESSetTol( (HYPRE_Solver) solver, tol ) ); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_SStructFlexGMRESSetAbsoluteTol( HYPRE_SStructSolver solver, HYPRE_Real tol ) { return ( HYPRE_FlexGMRESSetAbsoluteTol( (HYPRE_Solver) solver, tol ) ); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_SStructFlexGMRESSetMinIter( HYPRE_SStructSolver solver, HYPRE_Int min_iter ) { return ( HYPRE_FlexGMRESSetMinIter( (HYPRE_Solver) solver, min_iter ) ); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_SStructFlexGMRESSetMaxIter( HYPRE_SStructSolver solver, HYPRE_Int max_iter ) { return ( HYPRE_FlexGMRESSetMaxIter( (HYPRE_Solver) solver, max_iter ) ); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_SStructFlexGMRESSetPrecond( HYPRE_SStructSolver solver, HYPRE_PtrToSStructSolverFcn precond, HYPRE_PtrToSStructSolverFcn precond_setup, void * precond_data ) { return ( HYPRE_FlexGMRESSetPrecond( (HYPRE_Solver) solver, (HYPRE_PtrToSolverFcn) precond, (HYPRE_PtrToSolverFcn) precond_setup, (HYPRE_Solver) precond_data ) ); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_SStructFlexGMRESSetLogging( HYPRE_SStructSolver solver, HYPRE_Int logging ) { return ( HYPRE_FlexGMRESSetLogging( (HYPRE_Solver) solver, logging ) ); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_SStructFlexGMRESSetPrintLevel( HYPRE_SStructSolver solver, HYPRE_Int level ) { return ( HYPRE_FlexGMRESSetPrintLevel( (HYPRE_Solver) solver, level ) ); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_SStructFlexGMRESGetNumIterations( HYPRE_SStructSolver solver, HYPRE_Int *num_iterations ) { return ( HYPRE_FlexGMRESGetNumIterations( (HYPRE_Solver) solver, num_iterations ) ); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_SStructFlexGMRESGetFinalRelativeResidualNorm( HYPRE_SStructSolver solver, HYPRE_Real *norm ) { return ( HYPRE_FlexGMRESGetFinalRelativeResidualNorm( (HYPRE_Solver) solver, norm ) ); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_SStructFlexGMRESGetResidual( HYPRE_SStructSolver solver, void **residual ) { return ( HYPRE_FlexGMRESGetResidual( (HYPRE_Solver) solver, residual ) ); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_SStructFlexGMRESSetModifyPC( HYPRE_SStructSolver solver, HYPRE_PtrToModifyPCFcn modify_pc) { return ( HYPRE_FlexGMRESSetModifyPC( (HYPRE_Solver) solver, (HYPRE_PtrToModifyPCFcn) modify_pc)); } hypre-2.33.0/src/sstruct_ls/HYPRE_sstruct_gmres.c000066400000000000000000000167321477326011500217600ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "_hypre_sstruct_ls.h" /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_SStructGMRESCreate( MPI_Comm comm, HYPRE_SStructSolver *solver ) { HYPRE_UNUSED_VAR(comm); hypre_GMRESFunctions * gmres_functions = hypre_GMRESFunctionsCreate( hypre_SStructKrylovCAlloc, hypre_SStructKrylovFree, hypre_SStructKrylovCommInfo, hypre_SStructKrylovCreateVector, hypre_SStructKrylovCreateVectorArray, hypre_SStructKrylovDestroyVector, hypre_SStructKrylovMatvecCreate, hypre_SStructKrylovMatvec, hypre_SStructKrylovMatvecDestroy, hypre_SStructKrylovInnerProd, hypre_SStructKrylovCopyVector, hypre_SStructKrylovClearVector, hypre_SStructKrylovScaleVector, hypre_SStructKrylovAxpy, hypre_SStructKrylovIdentitySetup, hypre_SStructKrylovIdentity ); *solver = ( (HYPRE_SStructSolver) hypre_GMRESCreate( gmres_functions ) ); return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_SStructGMRESDestroy( HYPRE_SStructSolver solver ) { return ( hypre_GMRESDestroy( (void *) solver ) ); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_SStructGMRESSetup( HYPRE_SStructSolver solver, HYPRE_SStructMatrix A, HYPRE_SStructVector b, HYPRE_SStructVector x ) { return ( HYPRE_GMRESSetup( (HYPRE_Solver) solver, (HYPRE_Matrix) A, (HYPRE_Vector) b, (HYPRE_Vector) x ) ); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_SStructGMRESSolve( HYPRE_SStructSolver solver, HYPRE_SStructMatrix A, HYPRE_SStructVector b, HYPRE_SStructVector x ) { return ( HYPRE_GMRESSolve( (HYPRE_Solver) solver, (HYPRE_Matrix) A, (HYPRE_Vector) b, (HYPRE_Vector) x ) ); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_SStructGMRESSetKDim( HYPRE_SStructSolver solver, HYPRE_Int k_dim ) { return ( HYPRE_GMRESSetKDim( (HYPRE_Solver) solver, k_dim ) ); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_SStructGMRESSetTol( HYPRE_SStructSolver solver, HYPRE_Real tol ) { return ( HYPRE_GMRESSetTol( (HYPRE_Solver) solver, tol ) ); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_SStructGMRESSetAbsoluteTol( HYPRE_SStructSolver solver, HYPRE_Real atol ) { return ( HYPRE_GMRESSetAbsoluteTol( (HYPRE_Solver) solver, atol ) ); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_SStructGMRESSetMinIter( HYPRE_SStructSolver solver, HYPRE_Int min_iter ) { return ( HYPRE_GMRESSetMinIter( (HYPRE_Solver) solver, min_iter ) ); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_SStructGMRESSetMaxIter( HYPRE_SStructSolver solver, HYPRE_Int max_iter ) { return ( HYPRE_GMRESSetMaxIter( (HYPRE_Solver) solver, max_iter ) ); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_SStructGMRESSetStopCrit( HYPRE_SStructSolver solver, HYPRE_Int stop_crit ) { return ( HYPRE_GMRESSetStopCrit( (HYPRE_Solver) solver, stop_crit ) ); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_SStructGMRESSetPrecond( HYPRE_SStructSolver solver, HYPRE_PtrToSStructSolverFcn precond, HYPRE_PtrToSStructSolverFcn precond_setup, void * precond_data ) { return ( HYPRE_GMRESSetPrecond( (HYPRE_Solver) solver, (HYPRE_PtrToSolverFcn) precond, (HYPRE_PtrToSolverFcn) precond_setup, (HYPRE_Solver) precond_data ) ); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_SStructGMRESSetLogging( HYPRE_SStructSolver solver, HYPRE_Int logging ) { return ( HYPRE_GMRESSetLogging( (HYPRE_Solver) solver, logging ) ); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_SStructGMRESSetPrintLevel( HYPRE_SStructSolver solver, HYPRE_Int level ) { return ( HYPRE_GMRESSetPrintLevel( (HYPRE_Solver) solver, level ) ); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_SStructGMRESGetNumIterations( HYPRE_SStructSolver solver, HYPRE_Int *num_iterations ) { return ( HYPRE_GMRESGetNumIterations( (HYPRE_Solver) solver, num_iterations ) ); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_SStructGMRESGetFinalRelativeResidualNorm( HYPRE_SStructSolver solver, HYPRE_Real *norm ) { return ( HYPRE_GMRESGetFinalRelativeResidualNorm( (HYPRE_Solver) solver, norm ) ); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_SStructGMRESGetResidual( HYPRE_SStructSolver solver, void **residual ) { return ( HYPRE_GMRESGetResidual( (HYPRE_Solver) solver, residual ) ); } hypre-2.33.0/src/sstruct_ls/HYPRE_sstruct_int.c000066400000000000000000000062531477326011500214320ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "_hypre_sstruct_ls.h" #include "interpreter.h" #include "HYPRE_MatvecFunctions.h" #include "temp_multivector.h" HYPRE_Int hypre_SStructPVectorSetRandomValues( hypre_SStructPVector *pvector, HYPRE_Int seed ) { HYPRE_Int ierr = 0; HYPRE_Int nvars = hypre_SStructPVectorNVars(pvector); hypre_StructVector *svector; HYPRE_Int var; hypre_SeedRand( seed ); for (var = 0; var < nvars; var++) { svector = hypre_SStructPVectorSVector(pvector, var); seed = hypre_RandI(); hypre_StructVectorSetRandomValues(svector, seed); } return ierr; } HYPRE_Int hypre_SStructVectorSetRandomValues( hypre_SStructVector *vector, HYPRE_Int seed ) { HYPRE_Int ierr = 0; HYPRE_Int nparts = hypre_SStructVectorNParts(vector); hypre_SStructPVector *pvector; HYPRE_Int part; hypre_SeedRand( seed ); for (part = 0; part < nparts; part++) { pvector = hypre_SStructVectorPVector(vector, part); seed = hypre_RandI(); hypre_SStructPVectorSetRandomValues(pvector, seed); } return ierr; } HYPRE_Int hypre_SStructSetRandomValues( void* v, HYPRE_Int seed ) { return hypre_SStructVectorSetRandomValues( (hypre_SStructVector*)v, seed ); } HYPRE_Int HYPRE_SStructSetupInterpreter( mv_InterfaceInterpreter *i ) { i->CreateVector = hypre_SStructKrylovCreateVector; i->DestroyVector = hypre_SStructKrylovDestroyVector; i->InnerProd = hypre_SStructKrylovInnerProd; i->CopyVector = hypre_SStructKrylovCopyVector; i->ClearVector = hypre_SStructKrylovClearVector; i->SetRandomValues = hypre_SStructSetRandomValues; i->ScaleVector = hypre_SStructKrylovScaleVector; i->Axpy = hypre_SStructKrylovAxpy; i->CreateMultiVector = mv_TempMultiVectorCreateFromSampleVector; i->CopyCreateMultiVector = mv_TempMultiVectorCreateCopy; i->DestroyMultiVector = mv_TempMultiVectorDestroy; i->Width = mv_TempMultiVectorWidth; i->Height = mv_TempMultiVectorHeight; i->SetMask = mv_TempMultiVectorSetMask; i->CopyMultiVector = mv_TempMultiVectorCopy; i->ClearMultiVector = mv_TempMultiVectorClear; i->SetRandomVectors = mv_TempMultiVectorSetRandom; i->MultiInnerProd = mv_TempMultiVectorByMultiVector; i->MultiInnerProdDiag = mv_TempMultiVectorByMultiVectorDiag; i->MultiVecMat = mv_TempMultiVectorByMatrix; i->MultiVecMatDiag = mv_TempMultiVectorByDiagonal; i->MultiAxpy = mv_TempMultiVectorAxpy; i->MultiXapy = mv_TempMultiVectorXapy; i->Eval = mv_TempMultiVectorEval; return 0; } HYPRE_Int HYPRE_SStructSetupMatvec(HYPRE_MatvecFunctions * mv) { mv->MatvecCreate = hypre_SStructKrylovMatvecCreate; mv->Matvec = hypre_SStructKrylovMatvec; mv->MatvecDestroy = hypre_SStructKrylovMatvecDestroy; mv->MatMultiVecCreate = NULL; mv->MatMultiVec = NULL; mv->MatMultiVecDestroy = NULL; return 0; } hypre-2.33.0/src/sstruct_ls/HYPRE_sstruct_lgmres.c000066400000000000000000000170241477326011500221270ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "_hypre_sstruct_ls.h" /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_SStructLGMRESCreate( MPI_Comm comm, HYPRE_SStructSolver *solver ) { HYPRE_UNUSED_VAR(comm); hypre_LGMRESFunctions * lgmres_functions = hypre_LGMRESFunctionsCreate( hypre_SStructKrylovCAlloc, hypre_SStructKrylovFree, hypre_SStructKrylovCommInfo, hypre_SStructKrylovCreateVector, hypre_SStructKrylovCreateVectorArray, hypre_SStructKrylovDestroyVector, hypre_SStructKrylovMatvecCreate, hypre_SStructKrylovMatvec, hypre_SStructKrylovMatvecDestroy, hypre_SStructKrylovInnerProd, hypre_SStructKrylovCopyVector, hypre_SStructKrylovClearVector, hypre_SStructKrylovScaleVector, hypre_SStructKrylovAxpy, hypre_SStructKrylovIdentitySetup, hypre_SStructKrylovIdentity ); *solver = ( (HYPRE_SStructSolver) hypre_LGMRESCreate( lgmres_functions ) ); return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_SStructLGMRESDestroy( HYPRE_SStructSolver solver ) { return ( hypre_LGMRESDestroy( (void *) solver ) ); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_SStructLGMRESSetup( HYPRE_SStructSolver solver, HYPRE_SStructMatrix A, HYPRE_SStructVector b, HYPRE_SStructVector x ) { return ( HYPRE_LGMRESSetup( (HYPRE_Solver) solver, (HYPRE_Matrix) A, (HYPRE_Vector) b, (HYPRE_Vector) x ) ); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_SStructLGMRESSolve( HYPRE_SStructSolver solver, HYPRE_SStructMatrix A, HYPRE_SStructVector b, HYPRE_SStructVector x ) { return ( HYPRE_LGMRESSolve( (HYPRE_Solver) solver, (HYPRE_Matrix) A, (HYPRE_Vector) b, (HYPRE_Vector) x ) ); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_SStructLGMRESSetKDim( HYPRE_SStructSolver solver, HYPRE_Int k_dim ) { return ( HYPRE_LGMRESSetKDim( (HYPRE_Solver) solver, k_dim ) ); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_SStructLGMRESSetAugDim( HYPRE_SStructSolver solver, HYPRE_Int aug_dim ) { return ( HYPRE_LGMRESSetAugDim( (HYPRE_Solver) solver, aug_dim ) ); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_SStructLGMRESSetTol( HYPRE_SStructSolver solver, HYPRE_Real tol ) { return ( HYPRE_LGMRESSetTol( (HYPRE_Solver) solver, tol ) ); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_SStructLGMRESSetAbsoluteTol( HYPRE_SStructSolver solver, HYPRE_Real atol ) { return ( HYPRE_LGMRESSetAbsoluteTol( (HYPRE_Solver) solver, atol ) ); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_SStructLGMRESSetMinIter( HYPRE_SStructSolver solver, HYPRE_Int min_iter ) { return ( HYPRE_LGMRESSetMinIter( (HYPRE_Solver) solver, min_iter ) ); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_SStructLGMRESSetMaxIter( HYPRE_SStructSolver solver, HYPRE_Int max_iter ) { return ( HYPRE_LGMRESSetMaxIter( (HYPRE_Solver) solver, max_iter ) ); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_SStructLGMRESSetPrecond( HYPRE_SStructSolver solver, HYPRE_PtrToSStructSolverFcn precond, HYPRE_PtrToSStructSolverFcn precond_setup, void * precond_data ) { return ( HYPRE_LGMRESSetPrecond( (HYPRE_Solver) solver, (HYPRE_PtrToSolverFcn) precond, (HYPRE_PtrToSolverFcn) precond_setup, (HYPRE_Solver) precond_data ) ); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_SStructLGMRESSetLogging( HYPRE_SStructSolver solver, HYPRE_Int logging ) { return ( HYPRE_LGMRESSetLogging( (HYPRE_Solver) solver, logging ) ); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_SStructLGMRESSetPrintLevel( HYPRE_SStructSolver solver, HYPRE_Int level ) { return ( HYPRE_LGMRESSetPrintLevel( (HYPRE_Solver) solver, level ) ); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_SStructLGMRESGetNumIterations( HYPRE_SStructSolver solver, HYPRE_Int *num_iterations ) { return ( HYPRE_LGMRESGetNumIterations( (HYPRE_Solver) solver, num_iterations ) ); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_SStructLGMRESGetFinalRelativeResidualNorm( HYPRE_SStructSolver solver, HYPRE_Real *norm ) { return ( HYPRE_LGMRESGetFinalRelativeResidualNorm( (HYPRE_Solver) solver, norm ) ); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_SStructLGMRESGetResidual( HYPRE_SStructSolver solver, void **residual ) { return ( HYPRE_LGMRESGetResidual( (HYPRE_Solver) solver, residual ) ); } hypre-2.33.0/src/sstruct_ls/HYPRE_sstruct_ls.h000066400000000000000000001157331477326011500212670ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #ifndef HYPRE_SSTRUCT_LS_HEADER #define HYPRE_SSTRUCT_LS_HEADER #include "HYPRE_config.h" #include "HYPRE_utilities.h" #include "HYPRE.h" #include "HYPRE_sstruct_mv.h" #include "HYPRE_struct_ls.h" #include "HYPRE_parcsr_ls.h" #include "HYPRE_lobpcg.h" #ifdef __cplusplus extern "C" { #endif /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ /** * @defgroup SStructSolvers SStruct Solvers * * Linear solvers for semi-structured grids. These solvers use matrix/vector * storage schemes that are taylored to semi-structured grid problems. * * @{ **/ /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ /** * @name SStruct Solvers * * @{ **/ struct hypre_SStructSolver_struct; /** * The solver object. **/ typedef struct hypre_SStructSolver_struct *HYPRE_SStructSolver; typedef HYPRE_Int (*HYPRE_PtrToSStructSolverFcn)(HYPRE_SStructSolver, HYPRE_SStructMatrix, HYPRE_SStructVector, HYPRE_SStructVector); #ifndef HYPRE_MODIFYPC #define HYPRE_MODIFYPC /* if pc not defined, then may need HYPRE_SOLVER also */ typedef HYPRE_Int (*HYPRE_PtrToModifyPCFcn)(HYPRE_Solver, HYPRE_Int, HYPRE_Real); #endif /**@}*/ /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ /** * @name SStruct SysPFMG Solver * * SysPFMG is a semicoarsening multigrid solver similar to PFMG, but for systems * of PDEs. For periodic problems, users should try to set the grid size in * periodic dimensions to be as close to a power-of-two as possible (for more * details, see \ref Struct PFMG Solver). * * @{ **/ /** * Create a solver object. **/ HYPRE_Int HYPRE_SStructSysPFMGCreate(MPI_Comm comm, HYPRE_SStructSolver *solver); /** * Destroy a solver object. An object should be explicitly destroyed * using this destructor when the user's code no longer needs direct * access to it. Once destroyed, the object must not be referenced * again. Note that the object may not be deallocated at the * completion of this call, since there may be internal package * references to the object. The object will then be destroyed when * all internal reference counts go to zero. **/ HYPRE_Int HYPRE_SStructSysPFMGDestroy(HYPRE_SStructSolver solver); /** * Prepare to solve the system. The coefficient data in \e b and \e x is * ignored here, but information about the layout of the data may be used. **/ HYPRE_Int HYPRE_SStructSysPFMGSetup(HYPRE_SStructSolver solver, HYPRE_SStructMatrix A, HYPRE_SStructVector b, HYPRE_SStructVector x); /** * Solve the system. **/ HYPRE_Int HYPRE_SStructSysPFMGSolve(HYPRE_SStructSolver solver, HYPRE_SStructMatrix A, HYPRE_SStructVector b, HYPRE_SStructVector x); /** * (Optional) Set the convergence tolerance. **/ HYPRE_Int HYPRE_SStructSysPFMGSetTol(HYPRE_SStructSolver solver, HYPRE_Real tol); /** * (Optional) Set maximum number of iterations. **/ HYPRE_Int HYPRE_SStructSysPFMGSetMaxIter(HYPRE_SStructSolver solver, HYPRE_Int max_iter); /** * (Optional) Additionally require that the relative difference in * successive iterates be small. **/ HYPRE_Int HYPRE_SStructSysPFMGSetRelChange(HYPRE_SStructSolver solver, HYPRE_Int rel_change); /** * (Optional) Use a zero initial guess. This allows the solver to cut corners * in the case where a zero initial guess is needed (e.g., for preconditioning) * to reduce compuational cost. **/ HYPRE_Int HYPRE_SStructSysPFMGSetZeroGuess(HYPRE_SStructSolver solver); /** * (Optional) Use a nonzero initial guess. This is the default behavior, but * this routine allows the user to switch back after using \e SetZeroGuess. **/ HYPRE_Int HYPRE_SStructSysPFMGSetNonZeroGuess(HYPRE_SStructSolver solver); /** * (Optional) Set relaxation type. * * Current relaxation methods set by \e relax\_type are: * * - 0 : Jacobi * - 1 : Weighted Jacobi (default) * - 2 : Red/Black Gauss-Seidel (symmetric: RB pre-relaxation, BR post-relaxation) **/ HYPRE_Int HYPRE_SStructSysPFMGSetRelaxType(HYPRE_SStructSolver solver, HYPRE_Int relax_type); /** * (Optional) Set Jacobi Weight. **/ HYPRE_Int HYPRE_SStructSysPFMGSetJacobiWeight(HYPRE_SStructSolver solver, HYPRE_Real weight); /** * (Optional) Set number of relaxation sweeps before coarse-grid correction. **/ HYPRE_Int HYPRE_SStructSysPFMGSetNumPreRelax(HYPRE_SStructSolver solver, HYPRE_Int num_pre_relax); /** * (Optional) Set number of relaxation sweeps after coarse-grid correction. **/ HYPRE_Int HYPRE_SStructSysPFMGSetNumPostRelax(HYPRE_SStructSolver solver, HYPRE_Int num_post_relax); /** * (Optional) Skip relaxation on certain grids for isotropic problems. This can * greatly improve efficiency by eliminating unnecessary relaxations when the * underlying problem is isotropic. **/ HYPRE_Int HYPRE_SStructSysPFMGSetSkipRelax(HYPRE_SStructSolver solver, HYPRE_Int skip_relax); /* * RE-VISIT **/ HYPRE_Int HYPRE_SStructSysPFMGSetDxyz(HYPRE_SStructSolver solver, HYPRE_Real *dxyz); /** * (Optional) Set the amount of logging to do. **/ HYPRE_Int HYPRE_SStructSysPFMGSetLogging(HYPRE_SStructSolver solver, HYPRE_Int logging); /** * (Optional) Set the amount of printing to do to the screen. **/ HYPRE_Int HYPRE_SStructSysPFMGSetPrintLevel(HYPRE_SStructSolver solver, HYPRE_Int print_level); /** * Return the number of iterations taken. **/ HYPRE_Int HYPRE_SStructSysPFMGGetNumIterations(HYPRE_SStructSolver solver, HYPRE_Int *num_iterations); /** * Return the norm of the final relative residual. **/ HYPRE_Int HYPRE_SStructSysPFMGGetFinalRelativeResidualNorm(HYPRE_SStructSolver solver, HYPRE_Real *norm); /**@}*/ /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ /** * @name SStruct Split Solver * * @{ **/ #define HYPRE_PFMG 10 #define HYPRE_SMG 11 #define HYPRE_Jacobi 17 /** * Create a solver object. **/ HYPRE_Int HYPRE_SStructSplitCreate(MPI_Comm comm, HYPRE_SStructSolver *solver); /** * Destroy a solver object. An object should be explicitly destroyed * using this destructor when the user's code no longer needs direct * access to it. Once destroyed, the object must not be referenced * again. Note that the object may not be deallocated at the * completion of this call, since there may be internal package * references to the object. The object will then be destroyed when * all internal reference counts go to zero. **/ HYPRE_Int HYPRE_SStructSplitDestroy(HYPRE_SStructSolver solver); /** * Prepare to solve the system. The coefficient data in \e b and \e x is * ignored here, but information about the layout of the data may be used. **/ HYPRE_Int HYPRE_SStructSplitSetup(HYPRE_SStructSolver solver, HYPRE_SStructMatrix A, HYPRE_SStructVector b, HYPRE_SStructVector x); /** * Solve the system. **/ HYPRE_Int HYPRE_SStructSplitSolve(HYPRE_SStructSolver solver, HYPRE_SStructMatrix A, HYPRE_SStructVector b, HYPRE_SStructVector x); /** * (Optional) Set the convergence tolerance. **/ HYPRE_Int HYPRE_SStructSplitSetTol(HYPRE_SStructSolver solver, HYPRE_Real tol); /** * (Optional) Set maximum number of iterations. **/ HYPRE_Int HYPRE_SStructSplitSetMaxIter(HYPRE_SStructSolver solver, HYPRE_Int max_iter); /** * (Optional) Use a zero initial guess. This allows the solver to cut corners * in the case where a zero initial guess is needed (e.g., for preconditioning) * to reduce compuational cost. **/ HYPRE_Int HYPRE_SStructSplitSetZeroGuess(HYPRE_SStructSolver solver); /** * (Optional) Use a nonzero initial guess. This is the default behavior, but * this routine allows the user to switch back after using \e SetZeroGuess. **/ HYPRE_Int HYPRE_SStructSplitSetNonZeroGuess(HYPRE_SStructSolver solver); /** * (Optional) Set up the type of diagonal struct solver. Either \e ssolver is * set to \e HYPRE\_SMG or \e HYPRE\_PFMG. **/ HYPRE_Int HYPRE_SStructSplitSetStructSolver(HYPRE_SStructSolver solver, HYPRE_Int ssolver ); /** * Return the number of iterations taken. **/ HYPRE_Int HYPRE_SStructSplitGetNumIterations(HYPRE_SStructSolver solver, HYPRE_Int *num_iterations); /** * Return the norm of the final relative residual. **/ HYPRE_Int HYPRE_SStructSplitGetFinalRelativeResidualNorm(HYPRE_SStructSolver solver, HYPRE_Real *norm); /**@}*/ /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ /** * @name SStruct FAC Solver * * @{ **/ /** * Create a solver object. **/ HYPRE_Int HYPRE_SStructFACCreate(MPI_Comm comm, HYPRE_SStructSolver *solver); /** * Destroy a solver object. An object should be explicitly destroyed * using this destructor when the user's code no longer needs direct * access to it. Once destroyed, the object must not be referenced * again. Note that the object may not be deallocated at the * completion of this call, since there may be internal package * references to the object. The object will then be destroyed when * all internal reference counts go to zero. **/ HYPRE_Int HYPRE_SStructFACDestroy2(HYPRE_SStructSolver solver); /** * Re-distribute the composite matrix so that the amr hierachy is approximately * nested. Coarse underlying operators are also formed. **/ HYPRE_Int HYPRE_SStructFACAMR_RAP(HYPRE_SStructMatrix A, HYPRE_Int (*rfactors)[HYPRE_MAXDIM], HYPRE_SStructMatrix *fac_A); /** * Set up the FAC solver structure . **/ HYPRE_Int HYPRE_SStructFACSetup2(HYPRE_SStructSolver solver, HYPRE_SStructMatrix A, HYPRE_SStructVector b, HYPRE_SStructVector x); /** * Solve the system. **/ HYPRE_Int HYPRE_SStructFACSolve3(HYPRE_SStructSolver solver, HYPRE_SStructMatrix A, HYPRE_SStructVector b, HYPRE_SStructVector x); /** * Set up amr structure **/ HYPRE_Int HYPRE_SStructFACSetPLevels(HYPRE_SStructSolver solver, HYPRE_Int nparts, HYPRE_Int *plevels); /** * Set up amr refinement factors **/ HYPRE_Int HYPRE_SStructFACSetPRefinements(HYPRE_SStructSolver solver, HYPRE_Int nparts, HYPRE_Int (*rfactors)[HYPRE_MAXDIM] ); /** * (Optional, but user must make sure that they do this function otherwise.) * Zero off the coarse level stencils reaching into a fine level grid. **/ HYPRE_Int HYPRE_SStructFACZeroCFSten(HYPRE_SStructMatrix A, HYPRE_SStructGrid grid, HYPRE_Int part, HYPRE_Int rfactors[HYPRE_MAXDIM]); /** * (Optional, but user must make sure that they do this function otherwise.) * Zero off the fine level stencils reaching into a coarse level grid. **/ HYPRE_Int HYPRE_SStructFACZeroFCSten(HYPRE_SStructMatrix A, HYPRE_SStructGrid grid, HYPRE_Int part); /** * (Optional, but user must make sure that they do this function otherwise.) * Places the identity in the coarse grid matrix underlying the fine patches. * Required between each pair of amr levels. **/ HYPRE_Int HYPRE_SStructFACZeroAMRMatrixData(HYPRE_SStructMatrix A, HYPRE_Int part_crse, HYPRE_Int rfactors[HYPRE_MAXDIM]); /** * (Optional, but user must make sure that they do this function otherwise.) * Places zeros in the coarse grid vector underlying the fine patches. * Required between each pair of amr levels. **/ HYPRE_Int HYPRE_SStructFACZeroAMRVectorData(HYPRE_SStructVector b, HYPRE_Int *plevels, HYPRE_Int (*rfactors)[HYPRE_MAXDIM] ); /** * (Optional) Set maximum number of FAC levels. **/ HYPRE_Int HYPRE_SStructFACSetMaxLevels( HYPRE_SStructSolver solver, HYPRE_Int max_levels ); /** * (Optional) Set the convergence tolerance. **/ HYPRE_Int HYPRE_SStructFACSetTol(HYPRE_SStructSolver solver, HYPRE_Real tol); /** * (Optional) Set maximum number of iterations. **/ HYPRE_Int HYPRE_SStructFACSetMaxIter(HYPRE_SStructSolver solver, HYPRE_Int max_iter); /** * (Optional) Additionally require that the relative difference in * successive iterates be small. **/ HYPRE_Int HYPRE_SStructFACSetRelChange(HYPRE_SStructSolver solver, HYPRE_Int rel_change); /** * (Optional) Use a zero initial guess. This allows the solver to cut corners * in the case where a zero initial guess is needed (e.g., for preconditioning) * to reduce compuational cost. **/ HYPRE_Int HYPRE_SStructFACSetZeroGuess(HYPRE_SStructSolver solver); /** * (Optional) Use a nonzero initial guess. This is the default behavior, but * this routine allows the user to switch back after using \e SetZeroGuess. **/ HYPRE_Int HYPRE_SStructFACSetNonZeroGuess(HYPRE_SStructSolver solver); /** * (Optional) Set relaxation type. See \ref HYPRE_SStructSysPFMGSetRelaxType * for appropriate values of \e relax\_type. **/ HYPRE_Int HYPRE_SStructFACSetRelaxType(HYPRE_SStructSolver solver, HYPRE_Int relax_type); /** * (Optional) Set Jacobi weight if weighted Jacobi is used. **/ HYPRE_Int HYPRE_SStructFACSetJacobiWeight(HYPRE_SStructSolver solver, HYPRE_Real weight); /** * (Optional) Set number of relaxation sweeps before coarse-grid correction. **/ HYPRE_Int HYPRE_SStructFACSetNumPreRelax(HYPRE_SStructSolver solver, HYPRE_Int num_pre_relax); /** * (Optional) Set number of relaxation sweeps after coarse-grid correction. **/ HYPRE_Int HYPRE_SStructFACSetNumPostRelax(HYPRE_SStructSolver solver, HYPRE_Int num_post_relax); /** * (Optional) Set coarsest solver type. * * Current solver types set by \e csolver\_type are: * * - 1 : SysPFMG-PCG (default) * - 2 : SysPFMG **/ HYPRE_Int HYPRE_SStructFACSetCoarseSolverType(HYPRE_SStructSolver solver, HYPRE_Int csolver_type); /** * (Optional) Set the amount of logging to do. **/ HYPRE_Int HYPRE_SStructFACSetLogging(HYPRE_SStructSolver solver, HYPRE_Int logging); /** * Return the number of iterations taken. **/ HYPRE_Int HYPRE_SStructFACGetNumIterations(HYPRE_SStructSolver solver, HYPRE_Int *num_iterations); /** * Return the norm of the final relative residual. **/ HYPRE_Int HYPRE_SStructFACGetFinalRelativeResidualNorm(HYPRE_SStructSolver solver, HYPRE_Real *norm); /**@}*/ /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ /** * @name SStruct Maxwell Solver * * @{ **/ /** * Create a solver object. **/ HYPRE_Int HYPRE_SStructMaxwellCreate( MPI_Comm comm, HYPRE_SStructSolver *solver ); /** * Destroy a solver object. An object should be explicitly destroyed * using this destructor when the user's code no longer needs direct * access to it. Once destroyed, the object must not be referenced * again. Note that the object may not be deallocated at the * completion of this call, since there may be internal package * references to the object. The object will then be destroyed when * all internal reference counts go to zero. **/ HYPRE_Int HYPRE_SStructMaxwellDestroy( HYPRE_SStructSolver solver ); /** * Prepare to solve the system. The coefficient data in \e b and \e x is * ignored here, but information about the layout of the data may be used. **/ HYPRE_Int HYPRE_SStructMaxwellSetup(HYPRE_SStructSolver solver, HYPRE_SStructMatrix A, HYPRE_SStructVector b, HYPRE_SStructVector x); /** * Solve the system. Full coupling of the augmented system used * throughout the multigrid hierarchy. **/ HYPRE_Int HYPRE_SStructMaxwellSolve(HYPRE_SStructSolver solver, HYPRE_SStructMatrix A, HYPRE_SStructVector b, HYPRE_SStructVector x); /** * Solve the system. Full coupling of the augmented system used * only on the finest level, i.e., the node and edge multigrid * cycles are coupled only on the finest level. **/ HYPRE_Int HYPRE_SStructMaxwellSolve2(HYPRE_SStructSolver solver, HYPRE_SStructMatrix A, HYPRE_SStructVector b, HYPRE_SStructVector x); /** * Sets the gradient operator in the Maxwell solver. **/ HYPRE_Int HYPRE_SStructMaxwellSetGrad(HYPRE_SStructSolver solver, HYPRE_ParCSRMatrix T); /** * Sets the coarsening factor. **/ HYPRE_Int HYPRE_SStructMaxwellSetRfactors(HYPRE_SStructSolver solver, HYPRE_Int *rfactors); /** * Finds the physical boundary row ranks on all levels. **/ HYPRE_Int HYPRE_SStructMaxwellPhysBdy(HYPRE_SStructGrid *grid_l, HYPRE_Int num_levels, HYPRE_Int *rfactors, HYPRE_Int ***BdryRanks_ptr, HYPRE_Int **BdryRanksCnt_ptr ); /** * Eliminates the rows and cols corresponding to the physical boundary in * a parcsr matrix. **/ HYPRE_Int HYPRE_SStructMaxwellEliminateRowsCols(HYPRE_ParCSRMatrix parA, HYPRE_Int nrows, HYPRE_Int *rows ); /** * Zeros the rows corresponding to the physical boundary in * a par vector. **/ HYPRE_Int HYPRE_SStructMaxwellZeroVector(HYPRE_ParVector b, HYPRE_Int *rows, HYPRE_Int nrows ); /** * (Optional) Set the constant coefficient flag- Nedelec interpolation * used. **/ HYPRE_Int HYPRE_SStructMaxwellSetSetConstantCoef(HYPRE_SStructSolver solver, HYPRE_Int flag); /** * (Optional) Creates a gradient matrix from the grid. This presupposes * a particular orientation of the edge elements. **/ HYPRE_Int HYPRE_SStructMaxwellGrad(HYPRE_SStructGrid grid, HYPRE_ParCSRMatrix *T); /** * (Optional) Set the convergence tolerance. **/ HYPRE_Int HYPRE_SStructMaxwellSetTol(HYPRE_SStructSolver solver, HYPRE_Real tol); /** * (Optional) Set maximum number of iterations. **/ HYPRE_Int HYPRE_SStructMaxwellSetMaxIter(HYPRE_SStructSolver solver, HYPRE_Int max_iter); /** * (Optional) Additionally require that the relative difference in * successive iterates be small. **/ HYPRE_Int HYPRE_SStructMaxwellSetRelChange(HYPRE_SStructSolver solver, HYPRE_Int rel_change); /** * (Optional) Set number of relaxation sweeps before coarse-grid correction. **/ HYPRE_Int HYPRE_SStructMaxwellSetNumPreRelax(HYPRE_SStructSolver solver, HYPRE_Int num_pre_relax); /** * (Optional) Set number of relaxation sweeps after coarse-grid correction. **/ HYPRE_Int HYPRE_SStructMaxwellSetNumPostRelax(HYPRE_SStructSolver solver, HYPRE_Int num_post_relax); /** * (Optional) Set the amount of logging to do. **/ HYPRE_Int HYPRE_SStructMaxwellSetLogging(HYPRE_SStructSolver solver, HYPRE_Int logging); /** * Return the number of iterations taken. **/ HYPRE_Int HYPRE_SStructMaxwellGetNumIterations(HYPRE_SStructSolver solver, HYPRE_Int *num_iterations); /** * Return the norm of the final relative residual. **/ HYPRE_Int HYPRE_SStructMaxwellGetFinalRelativeResidualNorm(HYPRE_SStructSolver solver, HYPRE_Real *norm); /**@}*/ /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ /** * @name SStruct PCG Solver * * These routines should be used in conjunction with the generic interface in * \ref KrylovSolvers. * * @{ **/ /** * Create a solver object. **/ HYPRE_Int HYPRE_SStructPCGCreate(MPI_Comm comm, HYPRE_SStructSolver *solver); /** * Destroy a solver object. An object should be explicitly destroyed * using this destructor when the user's code no longer needs direct * access to it. Once destroyed, the object must not be referenced * again. Note that the object may not be deallocated at the * completion of this call, since there may be internal package * references to the object. The object will then be destroyed when * all internal reference counts go to zero. **/ HYPRE_Int HYPRE_SStructPCGDestroy(HYPRE_SStructSolver solver); HYPRE_Int HYPRE_SStructPCGSetup(HYPRE_SStructSolver solver, HYPRE_SStructMatrix A, HYPRE_SStructVector b, HYPRE_SStructVector x); HYPRE_Int HYPRE_SStructPCGSolve(HYPRE_SStructSolver solver, HYPRE_SStructMatrix A, HYPRE_SStructVector b, HYPRE_SStructVector x); HYPRE_Int HYPRE_SStructPCGSetTol(HYPRE_SStructSolver solver, HYPRE_Real tol); HYPRE_Int HYPRE_SStructPCGSetAbsoluteTol(HYPRE_SStructSolver solver, HYPRE_Real tol); HYPRE_Int HYPRE_SStructPCGSetMaxIter(HYPRE_SStructSolver solver, HYPRE_Int max_iter); HYPRE_Int HYPRE_SStructPCGSetTwoNorm(HYPRE_SStructSolver solver, HYPRE_Int two_norm); HYPRE_Int HYPRE_SStructPCGSetRelChange(HYPRE_SStructSolver solver, HYPRE_Int rel_change); HYPRE_Int HYPRE_SStructPCGSetPrecond(HYPRE_SStructSolver solver, HYPRE_PtrToSStructSolverFcn precond, HYPRE_PtrToSStructSolverFcn precond_setup, void *precond_solver); HYPRE_Int HYPRE_SStructPCGSetLogging(HYPRE_SStructSolver solver, HYPRE_Int logging); HYPRE_Int HYPRE_SStructPCGSetPrintLevel(HYPRE_SStructSolver solver, HYPRE_Int level); HYPRE_Int HYPRE_SStructPCGGetNumIterations(HYPRE_SStructSolver solver, HYPRE_Int *num_iterations); HYPRE_Int HYPRE_SStructPCGGetFinalRelativeResidualNorm(HYPRE_SStructSolver solver, HYPRE_Real *norm); HYPRE_Int HYPRE_SStructPCGGetResidual(HYPRE_SStructSolver solver, void **residual); /** * Setup routine for diagonal preconditioning. **/ HYPRE_Int HYPRE_SStructDiagScaleSetup(HYPRE_SStructSolver solver, HYPRE_SStructMatrix A, HYPRE_SStructVector y, HYPRE_SStructVector x); /** * Solve routine for diagonal preconditioning. **/ HYPRE_Int HYPRE_SStructDiagScale(HYPRE_SStructSolver solver, HYPRE_SStructMatrix A, HYPRE_SStructVector y, HYPRE_SStructVector x); /**@}*/ /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ /** * @name SStruct GMRES Solver * * These routines should be used in conjunction with the generic interface in * \ref KrylovSolvers. * * @{ **/ /** * Create a solver object. **/ HYPRE_Int HYPRE_SStructGMRESCreate(MPI_Comm comm, HYPRE_SStructSolver *solver); /** * Destroy a solver object. An object should be explicitly destroyed * using this destructor when the user's code no longer needs direct * access to it. Once destroyed, the object must not be referenced * again. Note that the object may not be deallocated at the * completion of this call, since there may be internal package * references to the object. The object will then be destroyed when * all internal reference counts go to zero. **/ HYPRE_Int HYPRE_SStructGMRESDestroy(HYPRE_SStructSolver solver); HYPRE_Int HYPRE_SStructGMRESSetup(HYPRE_SStructSolver solver, HYPRE_SStructMatrix A, HYPRE_SStructVector b, HYPRE_SStructVector x); HYPRE_Int HYPRE_SStructGMRESSolve(HYPRE_SStructSolver solver, HYPRE_SStructMatrix A, HYPRE_SStructVector b, HYPRE_SStructVector x); HYPRE_Int HYPRE_SStructGMRESSetTol(HYPRE_SStructSolver solver, HYPRE_Real tol); HYPRE_Int HYPRE_SStructGMRESSetAbsoluteTol(HYPRE_SStructSolver solver, HYPRE_Real tol); /* * RE-VISIT **/ HYPRE_Int HYPRE_SStructGMRESSetMinIter(HYPRE_SStructSolver solver, HYPRE_Int min_iter); HYPRE_Int HYPRE_SStructGMRESSetMaxIter(HYPRE_SStructSolver solver, HYPRE_Int max_iter); HYPRE_Int HYPRE_SStructGMRESSetKDim(HYPRE_SStructSolver solver, HYPRE_Int k_dim); /* * RE-VISIT **/ HYPRE_Int HYPRE_SStructGMRESSetStopCrit(HYPRE_SStructSolver solver, HYPRE_Int stop_crit); HYPRE_Int HYPRE_SStructGMRESSetPrecond(HYPRE_SStructSolver solver, HYPRE_PtrToSStructSolverFcn precond, HYPRE_PtrToSStructSolverFcn precond_setup, void *precond_solver); HYPRE_Int HYPRE_SStructGMRESSetLogging(HYPRE_SStructSolver solver, HYPRE_Int logging); HYPRE_Int HYPRE_SStructGMRESSetPrintLevel(HYPRE_SStructSolver solver, HYPRE_Int print_level); HYPRE_Int HYPRE_SStructGMRESGetNumIterations(HYPRE_SStructSolver solver, HYPRE_Int *num_iterations); HYPRE_Int HYPRE_SStructGMRESGetFinalRelativeResidualNorm(HYPRE_SStructSolver solver, HYPRE_Real *norm); HYPRE_Int HYPRE_SStructGMRESGetResidual(HYPRE_SStructSolver solver, void **residual); /**@}*/ /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ /** * @name SStruct FlexGMRES Solver * * These routines should be used in conjunction with the generic interface in * \ref KrylovSolvers. * * @{ **/ /** * Create a solver object. **/ HYPRE_Int HYPRE_SStructFlexGMRESCreate(MPI_Comm comm, HYPRE_SStructSolver *solver); /** * Destroy a solver object. An object should be explicitly destroyed * using this destructor when the user's code no longer needs direct * access to it. Once destroyed, the object must not be referenced * again. Note that the object may not be deallocated at the * completion of this call, since there may be internal package * references to the object. The object will then be destroyed when * all internal reference counts go to zero. **/ HYPRE_Int HYPRE_SStructFlexGMRESDestroy(HYPRE_SStructSolver solver); HYPRE_Int HYPRE_SStructFlexGMRESSetup(HYPRE_SStructSolver solver, HYPRE_SStructMatrix A, HYPRE_SStructVector b, HYPRE_SStructVector x); HYPRE_Int HYPRE_SStructFlexGMRESSolve(HYPRE_SStructSolver solver, HYPRE_SStructMatrix A, HYPRE_SStructVector b, HYPRE_SStructVector x); HYPRE_Int HYPRE_SStructFlexGMRESSetTol(HYPRE_SStructSolver solver, HYPRE_Real tol); HYPRE_Int HYPRE_SStructFlexGMRESSetAbsoluteTol(HYPRE_SStructSolver solver, HYPRE_Real tol); /* * RE-VISIT **/ HYPRE_Int HYPRE_SStructFlexGMRESSetMinIter(HYPRE_SStructSolver solver, HYPRE_Int min_iter); HYPRE_Int HYPRE_SStructFlexGMRESSetMaxIter(HYPRE_SStructSolver solver, HYPRE_Int max_iter); HYPRE_Int HYPRE_SStructFlexGMRESSetKDim(HYPRE_SStructSolver solver, HYPRE_Int k_dim); HYPRE_Int HYPRE_SStructFlexGMRESSetPrecond(HYPRE_SStructSolver solver, HYPRE_PtrToSStructSolverFcn precond, HYPRE_PtrToSStructSolverFcn precond_setup, void *precond_solver); HYPRE_Int HYPRE_SStructFlexGMRESSetLogging(HYPRE_SStructSolver solver, HYPRE_Int logging); HYPRE_Int HYPRE_SStructFlexGMRESSetPrintLevel(HYPRE_SStructSolver solver, HYPRE_Int print_level); HYPRE_Int HYPRE_SStructFlexGMRESGetNumIterations(HYPRE_SStructSolver solver, HYPRE_Int *num_iterations); HYPRE_Int HYPRE_SStructFlexGMRESGetFinalRelativeResidualNorm(HYPRE_SStructSolver solver, HYPRE_Real *norm); HYPRE_Int HYPRE_SStructFlexGMRESGetResidual(HYPRE_SStructSolver solver, void **residual); HYPRE_Int HYPRE_SStructFlexGMRESSetModifyPC(HYPRE_SStructSolver solver, HYPRE_PtrToModifyPCFcn modify_pc); /**@}*/ /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ /** * @name SStruct LGMRES Solver * * These routines should be used in conjunction with the generic interface in * \ref KrylovSolvers. * * @{ **/ /** * Create a solver object. **/ HYPRE_Int HYPRE_SStructLGMRESCreate(MPI_Comm comm, HYPRE_SStructSolver *solver); /** * Destroy a solver object. An object should be explicitly destroyed * using this destructor when the user's code no longer needs direct * access to it. Once destroyed, the object must not be referenced * again. Note that the object may not be deallocated at the * completion of this call, since there may be internal package * references to the object. The object will then be destroyed when * all internal reference counts go to zero. **/ HYPRE_Int HYPRE_SStructLGMRESDestroy(HYPRE_SStructSolver solver); HYPRE_Int HYPRE_SStructLGMRESSetup(HYPRE_SStructSolver solver, HYPRE_SStructMatrix A, HYPRE_SStructVector b, HYPRE_SStructVector x); HYPRE_Int HYPRE_SStructLGMRESSolve(HYPRE_SStructSolver solver, HYPRE_SStructMatrix A, HYPRE_SStructVector b, HYPRE_SStructVector x); HYPRE_Int HYPRE_SStructLGMRESSetTol(HYPRE_SStructSolver solver, HYPRE_Real tol); HYPRE_Int HYPRE_SStructLGMRESSetAbsoluteTol(HYPRE_SStructSolver solver, HYPRE_Real tol); /* * RE-VISIT **/ HYPRE_Int HYPRE_SStructLGMRESSetMinIter(HYPRE_SStructSolver solver, HYPRE_Int min_iter); HYPRE_Int HYPRE_SStructLGMRESSetMaxIter(HYPRE_SStructSolver solver, HYPRE_Int max_iter); HYPRE_Int HYPRE_SStructLGMRESSetKDim(HYPRE_SStructSolver solver, HYPRE_Int k_dim); HYPRE_Int HYPRE_SStructLGMRESSetAugDim(HYPRE_SStructSolver solver, HYPRE_Int aug_dim); HYPRE_Int HYPRE_SStructLGMRESSetPrecond(HYPRE_SStructSolver solver, HYPRE_PtrToSStructSolverFcn precond, HYPRE_PtrToSStructSolverFcn precond_setup, void *precond_solver); HYPRE_Int HYPRE_SStructLGMRESSetLogging(HYPRE_SStructSolver solver, HYPRE_Int logging); HYPRE_Int HYPRE_SStructLGMRESSetPrintLevel(HYPRE_SStructSolver solver, HYPRE_Int print_level); HYPRE_Int HYPRE_SStructLGMRESGetNumIterations(HYPRE_SStructSolver solver, HYPRE_Int *num_iterations); HYPRE_Int HYPRE_SStructLGMRESGetFinalRelativeResidualNorm(HYPRE_SStructSolver solver, HYPRE_Real *norm); HYPRE_Int HYPRE_SStructLGMRESGetResidual(HYPRE_SStructSolver solver, void **residual); /**@}*/ /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ /** * @name SStruct BiCGSTAB Solver * * These routines should be used in conjunction with the generic interface in * \ref KrylovSolvers. * * @{ **/ /** * Create a solver object. **/ HYPRE_Int HYPRE_SStructBiCGSTABCreate(MPI_Comm comm, HYPRE_SStructSolver *solver); /** * Destroy a solver object. An object should be explicitly destroyed * using this destructor when the user's code no longer needs direct * access to it. Once destroyed, the object must not be referenced * again. Note that the object may not be deallocated at the * completion of this call, since there may be internal package * references to the object. The object will then be destroyed when * all internal reference counts go to zero. **/ HYPRE_Int HYPRE_SStructBiCGSTABDestroy(HYPRE_SStructSolver solver); HYPRE_Int HYPRE_SStructBiCGSTABSetup(HYPRE_SStructSolver solver, HYPRE_SStructMatrix A, HYPRE_SStructVector b, HYPRE_SStructVector x); HYPRE_Int HYPRE_SStructBiCGSTABSolve(HYPRE_SStructSolver solver, HYPRE_SStructMatrix A, HYPRE_SStructVector b, HYPRE_SStructVector x); HYPRE_Int HYPRE_SStructBiCGSTABSetTol(HYPRE_SStructSolver solver, HYPRE_Real tol); HYPRE_Int HYPRE_SStructBiCGSTABSetAbsoluteTol(HYPRE_SStructSolver solver, HYPRE_Real tol); /* * RE-VISIT **/ HYPRE_Int HYPRE_SStructBiCGSTABSetMinIter(HYPRE_SStructSolver solver, HYPRE_Int min_iter); HYPRE_Int HYPRE_SStructBiCGSTABSetMaxIter(HYPRE_SStructSolver solver, HYPRE_Int max_iter); /* * RE-VISIT **/ HYPRE_Int HYPRE_SStructBiCGSTABSetStopCrit(HYPRE_SStructSolver solver, HYPRE_Int stop_crit); HYPRE_Int HYPRE_SStructBiCGSTABSetPrecond(HYPRE_SStructSolver solver, HYPRE_PtrToSStructSolverFcn precond, HYPRE_PtrToSStructSolverFcn precond_setup, void *precond_solver); HYPRE_Int HYPRE_SStructBiCGSTABSetLogging(HYPRE_SStructSolver solver, HYPRE_Int logging); HYPRE_Int HYPRE_SStructBiCGSTABSetPrintLevel(HYPRE_SStructSolver solver, HYPRE_Int level); HYPRE_Int HYPRE_SStructBiCGSTABGetNumIterations(HYPRE_SStructSolver solver, HYPRE_Int *num_iterations); HYPRE_Int HYPRE_SStructBiCGSTABGetFinalRelativeResidualNorm(HYPRE_SStructSolver solver, HYPRE_Real *norm); HYPRE_Int HYPRE_SStructBiCGSTABGetResidual(HYPRE_SStructSolver solver, void **residual); /**@}*/ /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ /** * @name SStruct LOBPCG Eigensolver * * These routines should be used in conjunction with the generic interface in * \ref Eigensolvers. * * @{ **/ /** * Load interface interpreter. Vector part loaded with hypre_SStructKrylov * functions and multivector part loaded with mv_TempMultiVector functions. **/ HYPRE_Int HYPRE_SStructSetupInterpreter(mv_InterfaceInterpreter *i); /** * Load Matvec interpreter with hypre_SStructKrylov functions. **/ HYPRE_Int HYPRE_SStructSetupMatvec(HYPRE_MatvecFunctions *mv); /**@}*/ /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ /**@}*/ #ifdef __cplusplus } #endif #endif hypre-2.33.0/src/sstruct_ls/HYPRE_sstruct_maxwell.c000066400000000000000000000253031477326011500223060ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * HYPRE_SStructMaxwell interface * *****************************************************************************/ #include "_hypre_sstruct_ls.h" /*-------------------------------------------------------------------------- * HYPRE_SStructMaxwellCreate *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_SStructMaxwellCreate(MPI_Comm comm, HYPRE_SStructSolver *solver) { *solver = ( (HYPRE_SStructSolver) hypre_MaxwellTVCreate(comm) ); return 0; } /*-------------------------------------------------------------------------- * HYPRE_SStructMaxwellDestroy *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_SStructMaxwellDestroy(HYPRE_SStructSolver solver) { return ( hypre_MaxwellTVDestroy( (void *) solver ) ); } /*-------------------------------------------------------------------------- * HYPRE_SStructMaxwellSetup *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_SStructMaxwellSetup( HYPRE_SStructSolver solver, HYPRE_SStructMatrix A, HYPRE_SStructVector b, HYPRE_SStructVector x ) { return ( hypre_MaxwellTV_Setup( (void *) solver, (hypre_SStructMatrix *) A, (hypre_SStructVector *) b, (hypre_SStructVector *) x )); } /*-------------------------------------------------------------------------- * HYPRE_SStructMaxwellSolve *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_SStructMaxwellSolve( HYPRE_SStructSolver solver, HYPRE_SStructMatrix A, HYPRE_SStructVector b, HYPRE_SStructVector x ) { return ( hypre_MaxwellSolve( (void *) solver, (hypre_SStructMatrix *) A, (hypre_SStructVector *) b, (hypre_SStructVector *) x ) ); } /*-------------------------------------------------------------------------- * HYPRE_SStructMaxwellSolve2 *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_SStructMaxwellSolve2( HYPRE_SStructSolver solver, HYPRE_SStructMatrix A, HYPRE_SStructVector b, HYPRE_SStructVector x ) { return ( hypre_MaxwellSolve2( (void *) solver, (hypre_SStructMatrix *) A, (hypre_SStructVector *) b, (hypre_SStructVector *) x ) ); } /*-------------------------------------------------------------------------- * HYPRE_MaxwellGrad *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_MaxwellGrad( HYPRE_SStructGrid grid, HYPRE_ParCSRMatrix *T ) { *T = ( (HYPRE_ParCSRMatrix) hypre_Maxwell_Grad( (hypre_SStructGrid *) grid)); return 0; } /*-------------------------------------------------------------------------- * HYPRE_SStructMaxwellSetGrad *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_SStructMaxwellSetGrad( HYPRE_SStructSolver solver, HYPRE_ParCSRMatrix T ) { return ( hypre_MaxwellSetGrad( (void *) solver, (hypre_ParCSRMatrix *) T) ); } /*-------------------------------------------------------------------------- * HYPRE_SStructMaxwellSetRfactors *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_SStructMaxwellSetRfactors( HYPRE_SStructSolver solver, HYPRE_Int *rfactors ) { return ( hypre_MaxwellSetRfactors( (void *) solver, rfactors ) ); } /*-------------------------------------------------------------------------- * HYPRE_SStructMaxwellSetTol *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_SStructMaxwellSetTol( HYPRE_SStructSolver solver, HYPRE_Real tol ) { return ( hypre_MaxwellSetTol( (void *) solver, tol ) ); } /*-------------------------------------------------------------------------- * HYPRE_SStructMaxwellSetConstantCoef *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_SStructMaxwellSetConstantCoef( HYPRE_SStructSolver solver, HYPRE_Int constant_coef) { return ( hypre_MaxwellSetConstantCoef( (void *) solver, constant_coef) ); } /*-------------------------------------------------------------------------- * HYPRE_SStructMaxwellSetMaxIter *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_SStructMaxwellSetMaxIter( HYPRE_SStructSolver solver, HYPRE_Int max_iter ) { return ( hypre_MaxwellSetMaxIter( (void *) solver, max_iter ) ); } /*-------------------------------------------------------------------------- * HYPRE_SStructMaxwellSetRelChange *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_SStructMaxwellSetRelChange( HYPRE_SStructSolver solver, HYPRE_Int rel_change ) { return ( hypre_MaxwellSetRelChange( (void *) solver, rel_change ) ); } /*-------------------------------------------------------------------------- * HYPRE_SStructMaxwellSetNumPreRelax *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_SStructMaxwellSetNumPreRelax( HYPRE_SStructSolver solver, HYPRE_Int num_pre_relax ) { return ( hypre_MaxwellSetNumPreRelax( (void *) solver, num_pre_relax) ); } /*-------------------------------------------------------------------------- * HYPRE_SStructMaxwellSetNumPostRelax *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_SStructMaxwellSetNumPostRelax( HYPRE_SStructSolver solver, HYPRE_Int num_post_relax ) { return ( hypre_MaxwellSetNumPostRelax( (void *) solver, num_post_relax) ); } /*-------------------------------------------------------------------------- * HYPRE_SStructMaxwellSetLogging *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_SStructMaxwellSetLogging( HYPRE_SStructSolver solver, HYPRE_Int logging ) { return ( hypre_MaxwellSetLogging( (void *) solver, logging) ); } /*-------------------------------------------------------------------------- HYPRE_SStructMaxwellSetPrintLevel *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_SStructMaxwellSetPrintLevel( HYPRE_SStructSolver solver, HYPRE_Int print_level ) { return ( hypre_MaxwellSetPrintLevel( (void *) solver, print_level) ); } /*-------------------------------------------------------------------------- * HYPRE_SStructMaxwellPrintLogging *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_SStructMaxwellPrintLogging( HYPRE_SStructSolver solver, HYPRE_Int myid) { return ( hypre_MaxwellPrintLogging( (void *) solver, myid) ); } /*-------------------------------------------------------------------------- * HYPRE_SStructMaxwellGetNumIterations *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_SStructMaxwellGetNumIterations( HYPRE_SStructSolver solver, HYPRE_Int *num_iterations ) { return ( hypre_MaxwellGetNumIterations( (void *) solver, num_iterations ) ); } /*-------------------------------------------------------------------------- * HYPRE_SStructMaxwellGetFinalRelativeResidualNorm *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_SStructMaxwellGetFinalRelativeResidualNorm( HYPRE_SStructSolver solver, HYPRE_Real *norm ) { return ( hypre_MaxwellGetFinalRelativeResidualNorm( (void *) solver, norm ) ); } /*-------------------------------------------------------------------------- * HYPRE_SStructMaxwellPhysBdy *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_SStructMaxwellPhysBdy( HYPRE_SStructGrid *grid_l, HYPRE_Int num_levels, HYPRE_Int *rfactors, HYPRE_Int ***BdryRanks_ptr, HYPRE_Int **BdryRanksCnt_ptr ) { return ( hypre_Maxwell_PhysBdy( (hypre_SStructGrid **) grid_l, num_levels, rfactors, BdryRanks_ptr, BdryRanksCnt_ptr ) ); } /*-------------------------------------------------------------------------- * HYPRE_SStructMaxwellEliminateRowsCols *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_SStructMaxwellEliminateRowsCols( HYPRE_ParCSRMatrix parA, HYPRE_Int nrows, HYPRE_Int *rows ) { return ( hypre_ParCSRMatrixEliminateRowsCols( (hypre_ParCSRMatrix *) parA, nrows, rows ) ); } /*-------------------------------------------------------------------------- * HYPRE_SStructMaxwellZeroVector *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_SStructMaxwellZeroVector(HYPRE_ParVector v, HYPRE_Int *rows, HYPRE_Int nrows) { return ( hypre_ParVectorZeroBCValues( (hypre_ParVector *) v, rows, nrows ) ); } hypre-2.33.0/src/sstruct_ls/HYPRE_sstruct_pcg.c000066400000000000000000000217421477326011500214110ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "_hypre_sstruct_ls.h" /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_SStructPCGCreate( MPI_Comm comm, HYPRE_SStructSolver *solver ) { HYPRE_UNUSED_VAR(comm); hypre_PCGFunctions * pcg_functions = hypre_PCGFunctionsCreate( hypre_SStructKrylovCAlloc, hypre_SStructKrylovFree, hypre_SStructKrylovCommInfo, hypre_SStructKrylovCreateVector, hypre_SStructKrylovDestroyVector, hypre_SStructKrylovMatvecCreate, hypre_SStructKrylovMatvec, hypre_SStructKrylovMatvecDestroy, hypre_SStructKrylovInnerProd, hypre_SStructKrylovCopyVector, hypre_SStructKrylovClearVector, hypre_SStructKrylovScaleVector, hypre_SStructKrylovAxpy, hypre_SStructKrylovIdentitySetup, hypre_SStructKrylovIdentity ); *solver = ( (HYPRE_SStructSolver) hypre_PCGCreate( pcg_functions ) ); return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_SStructPCGDestroy( HYPRE_SStructSolver solver ) { return ( hypre_PCGDestroy( (void *) solver ) ); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_SStructPCGSetup( HYPRE_SStructSolver solver, HYPRE_SStructMatrix A, HYPRE_SStructVector b, HYPRE_SStructVector x ) { return ( HYPRE_PCGSetup( (HYPRE_Solver) solver, (HYPRE_Matrix) A, (HYPRE_Vector) b, (HYPRE_Vector) x ) ); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_SStructPCGSolve( HYPRE_SStructSolver solver, HYPRE_SStructMatrix A, HYPRE_SStructVector b, HYPRE_SStructVector x ) { return ( HYPRE_PCGSolve( (HYPRE_Solver) solver, (HYPRE_Matrix) A, (HYPRE_Vector) b, (HYPRE_Vector) x ) ); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_SStructPCGSetTol( HYPRE_SStructSolver solver, HYPRE_Real tol ) { return ( HYPRE_PCGSetTol( (HYPRE_Solver) solver, tol ) ); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_SStructPCGSetAbsoluteTol( HYPRE_SStructSolver solver, HYPRE_Real tol ) { return ( HYPRE_PCGSetAbsoluteTol( (HYPRE_Solver) solver, tol ) ); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_SStructPCGSetMaxIter( HYPRE_SStructSolver solver, HYPRE_Int max_iter ) { return ( HYPRE_PCGSetMaxIter( (HYPRE_Solver) solver, max_iter ) ); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_SStructPCGSetTwoNorm( HYPRE_SStructSolver solver, HYPRE_Int two_norm ) { return ( HYPRE_PCGSetTwoNorm( (HYPRE_Solver) solver, two_norm ) ); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_SStructPCGSetRelChange( HYPRE_SStructSolver solver, HYPRE_Int rel_change ) { return ( HYPRE_PCGSetRelChange( (HYPRE_Solver) solver, rel_change ) ); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_SStructPCGSetPrecond( HYPRE_SStructSolver solver, HYPRE_PtrToSStructSolverFcn precond, HYPRE_PtrToSStructSolverFcn precond_setup, void *precond_data ) { return ( HYPRE_PCGSetPrecond( (HYPRE_Solver) solver, (HYPRE_PtrToSolverFcn) precond, (HYPRE_PtrToSolverFcn) precond_setup, (HYPRE_Solver) precond_data ) ); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_SStructPCGSetLogging( HYPRE_SStructSolver solver, HYPRE_Int logging ) { return ( HYPRE_PCGSetLogging( (HYPRE_Solver) solver, logging ) ); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_SStructPCGSetPrintLevel( HYPRE_SStructSolver solver, HYPRE_Int level ) { return ( HYPRE_PCGSetPrintLevel( (HYPRE_Solver) solver, level ) ); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_SStructPCGGetNumIterations( HYPRE_SStructSolver solver, HYPRE_Int *num_iterations ) { return ( HYPRE_PCGGetNumIterations( (HYPRE_Solver) solver, num_iterations ) ); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_SStructPCGGetFinalRelativeResidualNorm( HYPRE_SStructSolver solver, HYPRE_Real *norm ) { return ( HYPRE_PCGGetFinalRelativeResidualNorm( (HYPRE_Solver) solver, norm ) ); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_SStructPCGGetResidual( HYPRE_SStructSolver solver, void **residual ) { return ( HYPRE_PCGGetResidual( (HYPRE_Solver) solver, residual ) ); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_SStructDiagScaleSetup( HYPRE_SStructSolver solver, HYPRE_SStructMatrix A, HYPRE_SStructVector y, HYPRE_SStructVector x ) { return ( HYPRE_StructDiagScaleSetup( (HYPRE_StructSolver) solver, (HYPRE_StructMatrix) A, (HYPRE_StructVector) y, (HYPRE_StructVector) x ) ); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_SStructDiagScale( HYPRE_SStructSolver solver, HYPRE_SStructMatrix A, HYPRE_SStructVector y, HYPRE_SStructVector x ) { HYPRE_Int nparts = hypre_SStructMatrixNParts(A); hypre_SStructPMatrix *pA; hypre_SStructPVector *px; hypre_SStructPVector *py; hypre_StructMatrix *sA; hypre_StructVector *sx; hypre_StructVector *sy; HYPRE_Int part, vi; HYPRE_Int nvars; for (part = 0; part < nparts; part++) { pA = hypre_SStructMatrixPMatrix(A, part); px = hypre_SStructVectorPVector(x, part); py = hypre_SStructVectorPVector(y, part); nvars = hypre_SStructPMatrixNVars(pA); for (vi = 0; vi < nvars; vi++) { sA = hypre_SStructPMatrixSMatrix(pA, vi, vi); sx = hypre_SStructPVectorSVector(px, vi); sy = hypre_SStructPVectorSVector(py, vi); HYPRE_StructDiagScale( (HYPRE_StructSolver) solver, (HYPRE_StructMatrix) sA, (HYPRE_StructVector) sy, (HYPRE_StructVector) sx ); } } return hypre_error_flag; } hypre-2.33.0/src/sstruct_ls/HYPRE_sstruct_split.c000066400000000000000000000443141477326011500217730ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * HYPRE_SStructSplit solver interface * * This solver does the following iteration: * * x_{k+1} = M^{-1} (b + N x_k) , * * where A = M - N is a splitting of A, and M is the block-diagonal * matrix of structured intra-variable couplings. * *****************************************************************************/ #include "_hypre_sstruct_ls.h" typedef HYPRE_Int (*HYPRE_PtrToVoid1Fcn)(void*); typedef HYPRE_Int (*HYPRE_PtrToVoid4Fcn)(void*, void*, void*, void*); /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ typedef struct hypre_SStructSolver_struct { hypre_SStructVector *y; HYPRE_Int nparts; HYPRE_Int *nvars; void ****smatvec_data; HYPRE_PtrToVoid1Fcn **ssolver_destroy; HYPRE_PtrToVoid4Fcn **ssolver_solve; void ***ssolver_data; HYPRE_Real tol; HYPRE_Int max_iter; HYPRE_Int zero_guess; HYPRE_Int num_iterations; HYPRE_Real rel_norm; HYPRE_Int ssolver; void *matvec_data; } hypre_SStructSolver; /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_SStructSplitCreate( MPI_Comm comm, HYPRE_SStructSolver *solver_ptr ) { HYPRE_UNUSED_VAR(comm); hypre_SStructSolver *solver; solver = hypre_TAlloc(hypre_SStructSolver, 1, HYPRE_MEMORY_HOST); (solver -> y) = NULL; (solver -> nparts) = 0; (solver -> nvars) = 0; (solver -> smatvec_data) = NULL; (solver -> ssolver_solve) = NULL; (solver -> ssolver_destroy) = NULL; (solver -> ssolver_data) = NULL; (solver -> tol) = 1.0e-06; (solver -> max_iter) = 200; (solver -> zero_guess) = 0; (solver -> num_iterations) = 0; (solver -> rel_norm) = 0; (solver -> ssolver) = HYPRE_SMG; (solver -> matvec_data) = NULL; *solver_ptr = solver; return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_SStructSplitDestroy( HYPRE_SStructSolver solver ) { hypre_SStructVector *y; HYPRE_Int nparts; HYPRE_Int *nvars; void ****smatvec_data; HYPRE_PtrToVoid4Fcn **ssolver_solve; HYPRE_PtrToVoid1Fcn **ssolver_destroy; void ***ssolver_data; HYPRE_PtrToVoid1Fcn sdestroy; void *sdata; HYPRE_Int part, vi, vj; if (solver) { y = (solver -> y); nparts = (solver -> nparts); nvars = (solver -> nvars); smatvec_data = (solver -> smatvec_data); ssolver_solve = (solver -> ssolver_solve); ssolver_destroy = (solver -> ssolver_destroy); ssolver_data = (solver -> ssolver_data); HYPRE_SStructVectorDestroy(y); for (part = 0; part < nparts; part++) { for (vi = 0; vi < nvars[part]; vi++) { for (vj = 0; vj < nvars[part]; vj++) { if (smatvec_data[part][vi][vj] != NULL) { hypre_StructMatvecDestroy(smatvec_data[part][vi][vj]); } } hypre_TFree(smatvec_data[part][vi], HYPRE_MEMORY_HOST); sdestroy = ssolver_destroy[part][vi]; sdata = ssolver_data[part][vi]; sdestroy(sdata); } hypre_TFree(smatvec_data[part], HYPRE_MEMORY_HOST); hypre_TFree(ssolver_solve[part], HYPRE_MEMORY_HOST); hypre_TFree(ssolver_destroy[part], HYPRE_MEMORY_HOST); hypre_TFree(ssolver_data[part], HYPRE_MEMORY_HOST); } hypre_TFree(nvars, HYPRE_MEMORY_HOST); hypre_TFree(smatvec_data, HYPRE_MEMORY_HOST); hypre_TFree(ssolver_solve, HYPRE_MEMORY_HOST); hypre_TFree(ssolver_destroy, HYPRE_MEMORY_HOST); hypre_TFree(ssolver_data, HYPRE_MEMORY_HOST); hypre_SStructMatvecDestroy(solver -> matvec_data); hypre_TFree(solver, HYPRE_MEMORY_HOST); } return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_SStructSplitSetup( HYPRE_SStructSolver solver, HYPRE_SStructMatrix A, HYPRE_SStructVector b, HYPRE_SStructVector x ) { HYPRE_Int ssolver = (solver -> ssolver); hypre_SStructVector *y; HYPRE_Int nparts; HYPRE_Int *nvars; void ****smatvec_data; HYPRE_PtrToVoid4Fcn **ssolver_solve; HYPRE_PtrToVoid1Fcn **ssolver_destroy; void ***ssolver_data; MPI_Comm comm; hypre_SStructGrid *grid; hypre_SStructPMatrix *pA; hypre_SStructPVector *px; hypre_SStructPVector *py; hypre_StructMatrix *sA; hypre_StructVector *sx; hypre_StructVector *sy; HYPRE_StructMatrix sAH; HYPRE_StructVector sxH; HYPRE_StructVector syH; HYPRE_PtrToVoid4Fcn ssolve; HYPRE_PtrToVoid1Fcn sdestroy; void *sdata; HYPRE_Int part, vi, vj; comm = hypre_SStructVectorComm(b); grid = hypre_SStructVectorGrid(b); HYPRE_SStructVectorCreate(comm, grid, &y); HYPRE_SStructVectorInitialize(y); HYPRE_SStructVectorAssemble(y); nparts = hypre_SStructMatrixNParts(A); nvars = hypre_TAlloc(HYPRE_Int, nparts, HYPRE_MEMORY_HOST); smatvec_data = hypre_TAlloc(void***, nparts, HYPRE_MEMORY_HOST); ssolver_solve = hypre_TAlloc(HYPRE_PtrToVoid4Fcn*, nparts, HYPRE_MEMORY_HOST); ssolver_destroy = hypre_TAlloc(HYPRE_PtrToVoid1Fcn*, nparts, HYPRE_MEMORY_HOST); ssolver_data = hypre_TAlloc(void**, nparts, HYPRE_MEMORY_HOST); for (part = 0; part < nparts; part++) { pA = hypre_SStructMatrixPMatrix(A, part); px = hypre_SStructVectorPVector(x, part); py = hypre_SStructVectorPVector(y, part); nvars[part] = hypre_SStructPMatrixNVars(pA); smatvec_data[part] = hypre_TAlloc(void**, nvars[part], HYPRE_MEMORY_HOST); ssolver_solve[part] = hypre_TAlloc(HYPRE_PtrToVoid4Fcn, nvars[part], HYPRE_MEMORY_HOST); ssolver_destroy[part] = hypre_TAlloc(HYPRE_PtrToVoid1Fcn, nvars[part], HYPRE_MEMORY_HOST); ssolver_data[part] = hypre_TAlloc(void*, nvars[part], HYPRE_MEMORY_HOST); for (vi = 0; vi < nvars[part]; vi++) { smatvec_data[part][vi] = hypre_TAlloc(void*, nvars[part], HYPRE_MEMORY_HOST); for (vj = 0; vj < nvars[part]; vj++) { sA = hypre_SStructPMatrixSMatrix(pA, vi, vj); sx = hypre_SStructPVectorSVector(px, vj); smatvec_data[part][vi][vj] = NULL; if (sA != NULL) { smatvec_data[part][vi][vj] = hypre_StructMatvecCreate(); hypre_StructMatvecSetup(smatvec_data[part][vi][vj], sA, sx); } } sA = hypre_SStructPMatrixSMatrix(pA, vi, vi); sx = hypre_SStructPVectorSVector(px, vi); sy = hypre_SStructPVectorSVector(py, vi); sAH = (HYPRE_StructMatrix) sA; sxH = (HYPRE_StructVector) sx; syH = (HYPRE_StructVector) sy; switch (ssolver) { default: /* If no solver is matched, use Jacobi, but throw and error */ if (ssolver != HYPRE_Jacobi) { hypre_error(HYPRE_ERROR_GENERIC); } /* fall through */ case HYPRE_Jacobi: HYPRE_StructJacobiCreate(comm, (HYPRE_StructSolver *)&sdata); HYPRE_StructJacobiSetMaxIter((HYPRE_StructSolver)sdata, 1); HYPRE_StructJacobiSetTol((HYPRE_StructSolver)sdata, 0.0); if (solver -> zero_guess) { HYPRE_StructJacobiSetZeroGuess((HYPRE_StructSolver)sdata); } HYPRE_StructJacobiSetup((HYPRE_StructSolver)sdata, sAH, syH, sxH); ssolve = (HYPRE_PtrToVoid4Fcn) HYPRE_StructJacobiSolve; sdestroy = (HYPRE_PtrToVoid1Fcn) HYPRE_StructJacobiDestroy; break; case HYPRE_SMG: HYPRE_StructSMGCreate(comm, (HYPRE_StructSolver *)&sdata); HYPRE_StructSMGSetMemoryUse((HYPRE_StructSolver)sdata, 0); HYPRE_StructSMGSetMaxIter((HYPRE_StructSolver)sdata, 1); HYPRE_StructSMGSetTol((HYPRE_StructSolver)sdata, 0.0); if (solver -> zero_guess) { HYPRE_StructSMGSetZeroGuess((HYPRE_StructSolver)sdata); } HYPRE_StructSMGSetNumPreRelax((HYPRE_StructSolver)sdata, 1); HYPRE_StructSMGSetNumPostRelax((HYPRE_StructSolver)sdata, 1); HYPRE_StructSMGSetLogging((HYPRE_StructSolver)sdata, 0); HYPRE_StructSMGSetPrintLevel((HYPRE_StructSolver)sdata, 0); HYPRE_StructSMGSetup((HYPRE_StructSolver)sdata, sAH, syH, sxH); ssolve = (HYPRE_PtrToVoid4Fcn) HYPRE_StructSMGSolve; sdestroy = (HYPRE_PtrToVoid1Fcn) HYPRE_StructSMGDestroy; break; case HYPRE_PFMG: HYPRE_StructPFMGCreate(comm, (HYPRE_StructSolver *)&sdata); HYPRE_StructPFMGSetMaxIter((HYPRE_StructSolver)sdata, 1); HYPRE_StructPFMGSetTol((HYPRE_StructSolver)sdata, 0.0); if (solver -> zero_guess) { HYPRE_StructPFMGSetZeroGuess((HYPRE_StructSolver)sdata); } HYPRE_StructPFMGSetRelaxType((HYPRE_StructSolver)sdata, 1); HYPRE_StructPFMGSetNumPreRelax((HYPRE_StructSolver)sdata, 1); HYPRE_StructPFMGSetNumPostRelax((HYPRE_StructSolver)sdata, 1); HYPRE_StructPFMGSetLogging((HYPRE_StructSolver)sdata, 0); HYPRE_StructPFMGSetPrintLevel((HYPRE_StructSolver)sdata, 0); HYPRE_StructPFMGSetup((HYPRE_StructSolver)sdata, sAH, syH, sxH); ssolve = (HYPRE_PtrToVoid4Fcn) HYPRE_StructPFMGSolve; sdestroy = (HYPRE_PtrToVoid1Fcn) HYPRE_StructPFMGDestroy; break; } ssolver_solve[part][vi] = ssolve; ssolver_destroy[part][vi] = sdestroy; ssolver_data[part][vi] = sdata; } } (solver -> y) = y; (solver -> nparts) = nparts; (solver -> nvars) = nvars; (solver -> smatvec_data) = smatvec_data; (solver -> ssolver_solve) = ssolver_solve; (solver -> ssolver_destroy) = ssolver_destroy; (solver -> ssolver_data) = ssolver_data; if ((solver -> tol) > 0.0) { hypre_SStructMatvecCreate(&(solver -> matvec_data)); hypre_SStructMatvecSetup((solver -> matvec_data), A, x); } return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_SStructSplitSolve( HYPRE_SStructSolver solver, HYPRE_SStructMatrix A, HYPRE_SStructVector b, HYPRE_SStructVector x ) { hypre_SStructVector *y = (solver -> y); HYPRE_Int nparts = (solver -> nparts); HYPRE_Int *nvars = (solver -> nvars); void ****smatvec_data = (solver -> smatvec_data); HYPRE_PtrToVoid4Fcn **ssolver_solve = (solver -> ssolver_solve); void ***ssolver_data = (solver -> ssolver_data); HYPRE_Real tol = (solver -> tol); HYPRE_Int max_iter = (solver -> max_iter); HYPRE_Int zero_guess = (solver -> zero_guess); void *matvec_data = (solver -> matvec_data); hypre_SStructPMatrix *pA; hypre_SStructPVector *px; hypre_SStructPVector *py; hypre_StructMatrix *sA; hypre_StructVector *sx; hypre_StructVector *sy; HYPRE_PtrToVoid4Fcn ssolve; void *sdata; hypre_ParCSRMatrix *parcsrA; hypre_ParVector *parx; hypre_ParVector *pary; HYPRE_Int iter, part, vi, vj; HYPRE_Real b_dot_b = 0, r_dot_r; /* part of convergence check */ if (tol > 0.0) { /* eps = (tol^2) */ hypre_SStructInnerProd(b, b, &b_dot_b); /* if rhs is zero, return a zero solution */ if (b_dot_b == 0.0) { hypre_SStructVectorSetConstantValues(x, 0.0); (solver -> rel_norm) = 0.0; return hypre_error_flag; } } for (iter = 0; iter < max_iter; iter++) { /* convergence check */ if (tol > 0.0) { /* compute fine grid residual (b - Ax) */ hypre_SStructCopy(b, y); hypre_SStructMatvecCompute(matvec_data, -1.0, A, x, 1.0, y); hypre_SStructInnerProd(y, y, &r_dot_r); (solver -> rel_norm) = hypre_sqrt(r_dot_r / b_dot_b); if ((solver -> rel_norm) < tol) { break; } } /* copy b into y */ hypre_SStructCopy(b, y); /* compute y = y + Nx */ if (!zero_guess || (iter > 0)) { for (part = 0; part < nparts; part++) { pA = hypre_SStructMatrixPMatrix(A, part); px = hypre_SStructVectorPVector(x, part); py = hypre_SStructVectorPVector(y, part); for (vi = 0; vi < nvars[part]; vi++) { for (vj = 0; vj < nvars[part]; vj++) { sdata = smatvec_data[part][vi][vj]; sy = hypre_SStructPVectorSVector(py, vi); if ((sdata != NULL) && (vj != vi)) { sA = hypre_SStructPMatrixSMatrix(pA, vi, vj); sx = hypre_SStructPVectorSVector(px, vj); hypre_StructMatvecCompute(sdata, -1.0, sA, sx, 1.0, sy); } } } } parcsrA = hypre_SStructMatrixParCSRMatrix(A); hypre_SStructVectorConvert(x, &parx); hypre_SStructVectorConvert(y, &pary); hypre_ParCSRMatrixMatvec(-1.0, parcsrA, parx, 1.0, pary); hypre_SStructVectorRestore(x, NULL); hypre_SStructVectorRestore(y, pary); } /* compute x = M^{-1} y */ for (part = 0; part < nparts; part++) { pA = hypre_SStructMatrixPMatrix(A, part); px = hypre_SStructVectorPVector(x, part); py = hypre_SStructVectorPVector(y, part); for (vi = 0; vi < nvars[part]; vi++) { ssolve = ssolver_solve[part][vi]; sdata = ssolver_data[part][vi]; sA = hypre_SStructPMatrixSMatrix(pA, vi, vi); sx = hypre_SStructPVectorSVector(px, vi); sy = hypre_SStructPVectorSVector(py, vi); ssolve(sdata, (void*) sA, (void*) sy, (void*) sx); } } } (solver -> num_iterations) = iter; return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_SStructSplitSetTol( HYPRE_SStructSolver solver, HYPRE_Real tol ) { (solver -> tol) = tol; return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_SStructSplitSetMaxIter( HYPRE_SStructSolver solver, HYPRE_Int max_iter ) { (solver -> max_iter) = max_iter; return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_SStructSplitSetZeroGuess( HYPRE_SStructSolver solver ) { (solver -> zero_guess) = 1; return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_SStructSplitSetNonZeroGuess( HYPRE_SStructSolver solver ) { (solver -> zero_guess) = 0; return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_SStructSplitSetStructSolver( HYPRE_SStructSolver solver, HYPRE_Int ssolver ) { (solver -> ssolver) = ssolver; return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_SStructSplitGetNumIterations( HYPRE_SStructSolver solver, HYPRE_Int *num_iterations ) { *num_iterations = (solver -> num_iterations); return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_SStructSplitGetFinalRelativeResidualNorm( HYPRE_SStructSolver solver, HYPRE_Real *norm ) { *norm = (solver -> rel_norm); return hypre_error_flag; } hypre-2.33.0/src/sstruct_ls/HYPRE_sstruct_sys_pfmg.c000066400000000000000000000170201477326011500224610ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "_hypre_sstruct_ls.h" /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_SStructSysPFMGCreate( MPI_Comm comm, HYPRE_SStructSolver *solver ) { *solver = ( (HYPRE_SStructSolver) hypre_SysPFMGCreate( comm ) ); return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_SStructSysPFMGDestroy( HYPRE_SStructSolver solver ) { return ( hypre_SysPFMGDestroy( (void *) solver ) ); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_SStructSysPFMGSetup( HYPRE_SStructSolver solver, HYPRE_SStructMatrix A, HYPRE_SStructVector b, HYPRE_SStructVector x ) { return ( hypre_SysPFMGSetup( (void *) solver, (hypre_SStructMatrix *) A, (hypre_SStructVector *) b, (hypre_SStructVector *) x ) ); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_SStructSysPFMGSolve( HYPRE_SStructSolver solver, HYPRE_SStructMatrix A, HYPRE_SStructVector b, HYPRE_SStructVector x ) { return ( hypre_SysPFMGSolve( (void *) solver, (hypre_SStructMatrix *) A, (hypre_SStructVector *) b, (hypre_SStructVector *) x ) ); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_SStructSysPFMGSetTol( HYPRE_SStructSolver solver, HYPRE_Real tol ) { return ( hypre_SysPFMGSetTol( (void *) solver, tol ) ); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_SStructSysPFMGSetMaxIter( HYPRE_SStructSolver solver, HYPRE_Int max_iter ) { return ( hypre_SysPFMGSetMaxIter( (void *) solver, max_iter ) ); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_SStructSysPFMGSetRelChange( HYPRE_SStructSolver solver, HYPRE_Int rel_change ) { return ( hypre_SysPFMGSetRelChange( (void *) solver, rel_change ) ); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_SStructSysPFMGSetZeroGuess( HYPRE_SStructSolver solver ) { return ( hypre_SysPFMGSetZeroGuess( (void *) solver, 1 ) ); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_SStructSysPFMGSetNonZeroGuess( HYPRE_SStructSolver solver ) { return ( hypre_SysPFMGSetZeroGuess( (void *) solver, 0 ) ); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_SStructSysPFMGSetRelaxType( HYPRE_SStructSolver solver, HYPRE_Int relax_type ) { return ( hypre_SysPFMGSetRelaxType( (void *) solver, relax_type) ); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_SStructSysPFMGSetJacobiWeight(HYPRE_SStructSolver solver, HYPRE_Real weight) { return ( hypre_SysPFMGSetJacobiWeight( (void *) solver, weight) ); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_SStructSysPFMGSetNumPreRelax( HYPRE_SStructSolver solver, HYPRE_Int num_pre_relax ) { return ( hypre_SysPFMGSetNumPreRelax( (void *) solver, num_pre_relax) ); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_SStructSysPFMGSetNumPostRelax( HYPRE_SStructSolver solver, HYPRE_Int num_post_relax ) { return ( hypre_SysPFMGSetNumPostRelax( (void *) solver, num_post_relax) ); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_SStructSysPFMGSetSkipRelax( HYPRE_SStructSolver solver, HYPRE_Int skip_relax ) { return ( hypre_SysPFMGSetSkipRelax( (void *) solver, skip_relax) ); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_SStructSysPFMGSetDxyz( HYPRE_SStructSolver solver, HYPRE_Real *dxyz ) { return ( hypre_SysPFMGSetDxyz( (void *) solver, dxyz) ); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_SStructSysPFMGSetLogging( HYPRE_SStructSolver solver, HYPRE_Int logging ) { return ( hypre_SysPFMGSetLogging( (void *) solver, logging) ); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_SStructSysPFMGSetPrintLevel( HYPRE_SStructSolver solver, HYPRE_Int print_level ) { return ( hypre_SysPFMGSetPrintLevel( (void *) solver, print_level) ); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_SStructSysPFMGGetNumIterations( HYPRE_SStructSolver solver, HYPRE_Int *num_iterations ) { return ( hypre_SysPFMGGetNumIterations( (void *) solver, num_iterations ) ); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_SStructSysPFMGGetFinalRelativeResidualNorm( HYPRE_SStructSolver solver, HYPRE_Real *norm ) { return ( hypre_SysPFMGGetFinalRelativeResidualNorm( (void *) solver, norm ) ); } hypre-2.33.0/src/sstruct_ls/Makefile000066400000000000000000000067041477326011500173770ustar00rootroot00000000000000# Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) include ../config/Makefile.config CINCLUDES = ${INCLUDES} ${MPIINCLUDE} C_COMPILE_FLAGS = \ -I..\ -I$(srcdir)\ -I$(srcdir)/..\ -I$(srcdir)/../multivector\ -I$(srcdir)/../utilities\ -I$(srcdir)/../krylov\ -I$(srcdir)/../struct_mv\ -I$(srcdir)/../seq_mv\ -I$(srcdir)/../seq_block_mv\ -I$(srcdir)/../parcsr_mv\ -I$(srcdir)/../IJ_mv\ -I$(srcdir)/../parcsr_block_mv\ -I$(srcdir)/../sstruct_mv\ -I$(srcdir)/../struct_ls\ -I$(srcdir)/../parcsr_ls\ $(SUPERLU_INCLUDE)\ $(DSUPERLU_INCLUDE)\ ${CINCLUDES} HEADERS =\ HYPRE_sstruct_ls.h\ _hypre_sstruct_ls.h\ fac.h\ maxwell_TV.h\ nd1_amge_interpolation.h\ sstruct_owninfo.h\ sstruct_recvinfo.h\ sstruct_sendinfo.h\ sys_pfmg.h FILES =\ F90_HYPRE_sstruct_bicgstab.c\ F90_HYPRE_sstruct_gmres.c\ F90_HYPRE_sstruct_flexgmres.c\ F90_HYPRE_sstruct_lgmres.c\ F90_HYPRE_sstruct_InterFAC.c\ F90_HYPRE_sstruct_int.c\ F90_HYPRE_sstruct_maxwell.c\ F90_HYPRE_sstruct_pcg.c\ F90_HYPRE_sstruct_split.c\ F90_HYPRE_sstruct_sys_pfmg.c\ HYPRE_sstruct_bicgstab.c\ HYPRE_sstruct_gmres.c\ HYPRE_sstruct_flexgmres.c\ HYPRE_sstruct_lgmres.c\ HYPRE_sstruct_InterFAC.c\ HYPRE_sstruct_int.c\ HYPRE_sstruct_maxwell.c\ HYPRE_sstruct_pcg.c\ HYPRE_sstruct_split.c\ HYPRE_sstruct_sys_pfmg.c\ bsearch.c\ fac.c\ fac_amr_zero_data.c\ fac_cf_coarsen.c\ fac_cfstencil_box.c\ fac_CFInterfaceExtents.c\ fac_interp2.c\ fac_relax.c\ fac_solve3.c\ fac_zero_cdata.c\ krylov.c\ krylov_sstruct.c\ eliminate_rowscols.c\ maxwell_grad.c\ maxwell_physbdy.c\ maxwell_PNedelec.c\ maxwell_PNedelec_bdy.c\ maxwell_semi_interp.c\ maxwell_solve.c\ maxwell_solve2.c\ maxwell_TV.c\ maxwell_TV_setup.c\ maxwell_zeroBC.c\ nd1_amge_interpolation.c\ sstruct_amr_intercommunication.c\ sstruct_owninfo.c\ sstruct_recvinfo.c\ sstruct_sendinfo.c\ sstruct_sharedDOFComm.c\ sys_pfmg.c\ sys_pfmg_relax.c\ sys_pfmg_setup.c\ sys_pfmg_setup_interp.c\ sys_pfmg_setup_rap.c\ sys_pfmg_solve.c\ sys_semi_interp.c\ sys_semi_restrict.c CUFILES =\ fac_amr_fcoarsen.c\ fac_amr_rap.c\ fac_restrict2.c\ fac_setup2.c\ fac_zero_stencilcoef.c\ node_relax.c\ COBJS = ${FILES:.c=.o} CUOBJS = ${CUFILES:.c=.obj} OBJS = ${COBJS} ${CUOBJS} SONAME = libHYPRE_sstruct_ls-${HYPRE_RELEASE_VERSION}${HYPRE_LIB_SUFFIX} ################################################################## # Targets ################################################################## all: libHYPRE_sstruct_ls${HYPRE_LIB_SUFFIX} cp -fR $(srcdir)/HYPRE_*.h $(HYPRE_BUILD_DIR)/include cp -fR $(srcdir)/_hypre_sstruct_ls.h $(HYPRE_BUILD_DIR)/include # cp -fR libHYPRE* $(HYPRE_BUILD_DIR)/lib install: libHYPRE_sstruct_ls${HYPRE_LIB_SUFFIX} cp -fR $(srcdir)/HYPRE_*.h $(HYPRE_INC_INSTALL) cp -fR $(srcdir)/_hypre_sstruct_ls.h $(HYPRE_INC_INSTALL) # cp -fR libHYPRE* $(HYPRE_LIB_INSTALL) clean: rm -f *.o *.obj libHYPRE* rm -rf pchdir tca.map *inslog* distclean: clean ################################################################## # Rules ################################################################## libHYPRE_sstruct_ls.a: ${OBJS} @echo "Building $@ ... " ${AR} $@ ${OBJS} ${RANLIB} $@ libHYPRE_sstruct_ls.so libHYPRE_sstruct_ls.dylib: ${OBJS} @echo "Building $@ ... " ${BUILD_CC_SHARED} -o ${SONAME} ${OBJS} ${SHARED_SET_SONAME}${SONAME} ln -s -f ${SONAME} $@ ${OBJS}: ${HEADERS} hypre-2.33.0/src/sstruct_ls/_hypre_sstruct_ls.h000066400000000000000000001344351477326011500216660ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #ifndef hypre_SSTRUCT_LS_HEADER #define hypre_SSTRUCT_LS_HEADER #include #include #include #include #include "HYPRE_sstruct_ls.h" #include "_hypre_utilities.h" #include "krylov.h" #include "_hypre_struct_ls.h" #include "_hypre_sstruct_mv.h" #include "_hypre_parcsr_ls.h" #include "multivector.h" #ifdef __cplusplus extern "C" { #endif /*-------------------------------------------------------------------------- * hypre_SStructOwnInfo data structure * This structure is for the coarsen fboxes that are on this processor, * and the cboxes of cgrid/(all coarsened fboxes) on this processor (i.e., * the coarse boxes of the composite cgrid (no underlying) on this processor). *--------------------------------------------------------------------------*/ #ifndef hypre_OWNINFODATA_HEADER #define hypre_OWNINFODATA_HEADER typedef struct { HYPRE_Int size; hypre_BoxArrayArray *own_boxes; /* size of fgrid */ HYPRE_Int **own_cboxnums; /* local cbox number- each fbox leads to an array of cboxes */ hypre_BoxArrayArray *own_composite_cboxes; /* size of cgrid */ HYPRE_Int own_composite_size; } hypre_SStructOwnInfoData; /*-------------------------------------------------------------------------- * Accessor macros: hypre_SStructOwnInfoData; *--------------------------------------------------------------------------*/ #define hypre_SStructOwnInfoDataSize(own_data) ((own_data) -> size) #define hypre_SStructOwnInfoDataOwnBoxes(own_data) ((own_data) -> own_boxes) #define hypre_SStructOwnInfoDataOwnBoxNums(own_data) \ ((own_data) -> own_cboxnums) #define hypre_SStructOwnInfoDataCompositeCBoxes(own_data) \ ((own_data) -> own_composite_cboxes) #define hypre_SStructOwnInfoDataCompositeSize(own_data) \ ((own_data) -> own_composite_size) #endif /*-------------------------------------------------------------------------- * hypre_SStructRecvInfo data structure *--------------------------------------------------------------------------*/ #ifndef hypre_RECVINFODATA_HEADER #define hypre_RECVINFODATA_HEADER typedef struct { HYPRE_Int size; hypre_BoxArrayArray *recv_boxes; HYPRE_Int **recv_procs; } hypre_SStructRecvInfoData; #endif /*-------------------------------------------------------------------------- * hypre_SStructSendInfo data structure *--------------------------------------------------------------------------*/ #ifndef hypre_SENDINFODATA_HEADER #define hypre_SENDINFODATA_HEADER typedef struct { HYPRE_Int size; hypre_BoxArrayArray *send_boxes; HYPRE_Int **send_procs; HYPRE_Int **send_remote_boxnums; } hypre_SStructSendInfoData; #endif typedef struct { hypre_IJMatrix *Face_iedge; hypre_IJMatrix *Element_iedge; hypre_IJMatrix *Edge_iedge; hypre_IJMatrix *Element_Face; hypre_IJMatrix *Element_Edge; } hypre_PTopology; /****************************************************************************** * * Header info for the Maxwell solver * *****************************************************************************/ #ifndef hypre_MAXWELL_HEADER #define hypre_MAXWELL_HEADER /*-------------------------------------------------------------------------- * hypre_MaxwellData: *--------------------------------------------------------------------------*/ typedef struct { MPI_Comm comm; HYPRE_Real tol; HYPRE_Int max_iter; HYPRE_Int rel_change; HYPRE_Int zero_guess; HYPRE_Int ndim; HYPRE_Int num_pre_relax; /* number of pre relaxation sweeps */ HYPRE_Int num_post_relax; /* number of post relaxation sweeps */ HYPRE_Int constant_coef; hypre_Index *rfactor; hypre_SStructGrid **egrid_l; HYPRE_IJMatrix Aen; hypre_ParCSRMatrix **Aen_l; /* these will be extracted from the amg_data structure. Note that there is no grid underlying these matrices and vectors if they are generated by the amg_setup. So, will be stored as Parcsr_matrices and Par_vectors. */ hypre_SStructMatrix *Ann; hypre_SStructVector *bn; hypre_SStructVector *xn; void *amg_vdata; hypre_ParCSRMatrix **Ann_l; hypre_SStructStencil **Ann_stencils; hypre_ParCSRMatrix **Pn_l; hypre_ParCSRMatrix **RnT_l; hypre_ParVector **bn_l; hypre_ParVector **xn_l; hypre_ParVector **resn_l; hypre_ParVector **en_l; hypre_ParVector **nVtemp_l; hypre_ParVector **nVtemp2_l; HYPRE_Int **nCF_marker_l; HYPRE_Real *nrelax_weight; HYPRE_Real *nomega; HYPRE_Int nrelax_type; HYPRE_Int node_numlevels; hypre_ParCSRMatrix *Tgrad; hypre_ParCSRMatrix *T_transpose; /* edge data structure. These will have grids. */ HYPRE_Int edge_maxlevels; HYPRE_Int edge_numlevels; hypre_ParCSRMatrix **Aee_l; hypre_ParVector **be_l; hypre_ParVector **xe_l; hypre_ParVector **rese_l; hypre_ParVector **ee_l; hypre_ParVector **eVtemp_l; hypre_ParVector **eVtemp2_l; HYPRE_Int **eCF_marker_l; HYPRE_Real *erelax_weight; HYPRE_Real *eomega; HYPRE_Int erelax_type; /* edge data structure. These will have no grid. */ hypre_IJMatrix **Pe_l; hypre_IJMatrix **ReT_l; HYPRE_Int **BdryRanks_l; HYPRE_Int *BdryRanksCnts_l; /* edge-node data structure. These will have grids. */ HYPRE_Int en_numlevels; /* log info (always logged) */ HYPRE_Int num_iterations; HYPRE_Int time_index; /* additional log info (logged when `logging' > 0) */ HYPRE_Int print_level; HYPRE_Int logging; HYPRE_Real *norms; HYPRE_Real *rel_norms; } hypre_MaxwellData; #endif typedef struct { HYPRE_Int row; HYPRE_Int ncols; HYPRE_BigInt *cols; HYPRE_Real *data; } hypre_MaxwellOffProcRow; /* eliminate_rowscols.c */ HYPRE_Int hypre_ParCSRMatrixEliminateRowsCols ( hypre_ParCSRMatrix *A, HYPRE_Int nrows_to_eliminate, HYPRE_Int *rows_to_eliminate ); HYPRE_Int hypre_CSRMatrixEliminateRowsColsDiag ( hypre_ParCSRMatrix *A, HYPRE_Int nrows_to_eliminate, HYPRE_Int *rows_to_eliminate ); HYPRE_Int hypre_CSRMatrixEliminateRowsOffd ( hypre_ParCSRMatrix *A, HYPRE_Int nrows_to_eliminate, HYPRE_Int *rows_to_eliminate ); HYPRE_Int hypre_CSRMatrixEliminateColsOffd ( hypre_CSRMatrix *Aoffd, HYPRE_Int ncols_to_eliminate, HYPRE_Int *cols_to_eliminate ); /* fac_amr_fcoarsen.c */ HYPRE_Int hypre_AMR_FCoarsen ( hypre_SStructMatrix *A, hypre_SStructMatrix *fac_A, hypre_SStructPMatrix *A_crse, hypre_Index refine_factors, HYPRE_Int level ); /* fac_amr_rap.c */ HYPRE_Int hypre_AMR_RAP ( hypre_SStructMatrix *A, hypre_Index *rfactors, hypre_SStructMatrix **fac_A_ptr ); /* fac_amr_zero_data.c */ HYPRE_Int hypre_ZeroAMRVectorData ( hypre_SStructVector *b, HYPRE_Int *plevels, hypre_Index *rfactors ); HYPRE_Int hypre_ZeroAMRMatrixData ( hypre_SStructMatrix *A, HYPRE_Int part_crse, hypre_Index rfactors ); /* fac.c */ void *hypre_FACCreate ( MPI_Comm comm ); HYPRE_Int hypre_FACDestroy2 ( void *fac_vdata ); HYPRE_Int hypre_FACSetTol ( void *fac_vdata, HYPRE_Real tol ); HYPRE_Int hypre_FACSetPLevels ( void *fac_vdata, HYPRE_Int nparts, HYPRE_Int *plevels ); HYPRE_Int hypre_FACSetPRefinements ( void *fac_vdata, HYPRE_Int nparts, hypre_Index *prefinements); HYPRE_Int hypre_FACSetMaxLevels ( void *fac_vdata, HYPRE_Int nparts ); HYPRE_Int hypre_FACSetMaxIter ( void *fac_vdata, HYPRE_Int max_iter ); HYPRE_Int hypre_FACSetRelChange ( void *fac_vdata, HYPRE_Int rel_change ); HYPRE_Int hypre_FACSetZeroGuess ( void *fac_vdata, HYPRE_Int zero_guess ); HYPRE_Int hypre_FACSetRelaxType ( void *fac_vdata, HYPRE_Int relax_type ); HYPRE_Int hypre_FACSetJacobiWeight ( void *fac_vdata, HYPRE_Real weight ); HYPRE_Int hypre_FACSetNumPreSmooth ( void *fac_vdata, HYPRE_Int num_pre_smooth ); HYPRE_Int hypre_FACSetNumPostSmooth ( void *fac_vdata, HYPRE_Int num_post_smooth ); HYPRE_Int hypre_FACSetCoarseSolverType ( void *fac_vdata, HYPRE_Int csolver_type ); HYPRE_Int hypre_FACSetLogging ( void *fac_vdata, HYPRE_Int logging ); HYPRE_Int hypre_FACGetNumIterations ( void *fac_vdata, HYPRE_Int *num_iterations ); HYPRE_Int hypre_FACPrintLogging ( void *fac_vdata, HYPRE_Int myid ); HYPRE_Int hypre_FACGetFinalRelativeResidualNorm ( void *fac_vdata, HYPRE_Real *relative_residual_norm ); /* fac_cf_coarsen.c */ HYPRE_Int hypre_AMR_CFCoarsen ( hypre_SStructMatrix *A, hypre_SStructMatrix *fac_A, hypre_Index refine_factors, HYPRE_Int level ); /* fac_CFInterfaceExtents.c */ hypre_BoxArray *hypre_CFInterfaceExtents ( hypre_Box *fgrid_box, hypre_Box *cgrid_box, hypre_StructStencil *stencils, hypre_Index rfactors ); HYPRE_Int hypre_CFInterfaceExtents2 ( hypre_Box *fgrid_box, hypre_Box *cgrid_box, hypre_StructStencil *stencils, hypre_Index rfactors, hypre_BoxArray *cf_interface ); /* fac_cfstencil_box.c */ hypre_Box *hypre_CF_StenBox ( hypre_Box *fgrid_box, hypre_Box *cgrid_box, hypre_Index stencil_shape, hypre_Index rfactors, HYPRE_Int ndim ); /* fac_interp2.c */ HYPRE_Int hypre_FacSemiInterpCreate2 ( void **fac_interp_vdata_ptr ); HYPRE_Int hypre_FacSemiInterpDestroy2 ( void *fac_interp_vdata ); HYPRE_Int hypre_FacSemiInterpSetup2 ( void *fac_interp_vdata, hypre_SStructVector *e, hypre_SStructPVector *ec, hypre_Index rfactors ); HYPRE_Int hypre_FAC_IdentityInterp2 ( void *fac_interp_vdata, hypre_SStructPVector *xc, hypre_SStructVector *e ); HYPRE_Int hypre_FAC_WeightedInterp2 ( void *fac_interp_vdata, hypre_SStructPVector *xc, hypre_SStructVector *e_parts ); /* fac_relax.c */ HYPRE_Int hypre_FacLocalRelax ( void *relax_vdata, hypre_SStructPMatrix *A, hypre_SStructPVector *x, hypre_SStructPVector *b, HYPRE_Int num_relax, HYPRE_Int *zero_guess ); /* fac_restrict2.c */ HYPRE_Int hypre_FacSemiRestrictCreate2 ( void **fac_restrict_vdata_ptr ); HYPRE_Int hypre_FacSemiRestrictSetup2 ( void *fac_restrict_vdata, hypre_SStructVector *r, HYPRE_Int part_crse, HYPRE_Int part_fine, hypre_SStructPVector *rc, hypre_Index rfactors ); HYPRE_Int hypre_FACRestrict2 ( void *fac_restrict_vdata, hypre_SStructVector *xf, hypre_SStructPVector *xc ); HYPRE_Int hypre_FacSemiRestrictDestroy2 ( void *fac_restrict_vdata ); /* fac_setup2.c */ HYPRE_Int hypre_FacSetup2 ( void *fac_vdata, hypre_SStructMatrix *A_in, hypre_SStructVector *b, hypre_SStructVector *x ); /* fac_solve3.c */ HYPRE_Int hypre_FACSolve3 ( void *fac_vdata, hypre_SStructMatrix *A_user, hypre_SStructVector *b_in, hypre_SStructVector *x_in ); /* fac_zero_cdata.c */ HYPRE_Int hypre_FacZeroCData ( void *fac_vdata, hypre_SStructMatrix *A ); /* fac_zero_stencilcoef.c */ HYPRE_Int hypre_FacZeroCFSten ( hypre_SStructPMatrix *Af, hypre_SStructPMatrix *Ac, hypre_SStructGrid *grid, HYPRE_Int fine_part, hypre_Index rfactors ); HYPRE_Int hypre_FacZeroFCSten ( hypre_SStructPMatrix *A, hypre_SStructGrid *grid, HYPRE_Int fine_part ); /* bsearch.c */ HYPRE_Int hypre_LowerBinarySearch ( HYPRE_Int *list, HYPRE_Int value, HYPRE_Int list_length ); HYPRE_Int hypre_UpperBinarySearch ( HYPRE_Int *list, HYPRE_Int value, HYPRE_Int list_length ); /* maxwell_solve2.c */ HYPRE_Int hypre_MaxwellSolve2 ( void *maxwell_vdata, hypre_SStructMatrix *A_in, hypre_SStructVector *f, hypre_SStructVector *u ); /* maxwell_solve.c */ HYPRE_Int hypre_MaxwellSolve ( void *maxwell_vdata, hypre_SStructMatrix *A_in, hypre_SStructVector *f, hypre_SStructVector *u ); /* HYPRE_sstruct_bicgstab.c */ HYPRE_Int HYPRE_SStructBiCGSTABCreate ( MPI_Comm comm, HYPRE_SStructSolver *solver ); HYPRE_Int HYPRE_SStructBiCGSTABDestroy ( HYPRE_SStructSolver solver ); HYPRE_Int HYPRE_SStructBiCGSTABSetup ( HYPRE_SStructSolver solver, HYPRE_SStructMatrix A, HYPRE_SStructVector b, HYPRE_SStructVector x ); HYPRE_Int HYPRE_SStructBiCGSTABSolve ( HYPRE_SStructSolver solver, HYPRE_SStructMatrix A, HYPRE_SStructVector b, HYPRE_SStructVector x ); HYPRE_Int HYPRE_SStructBiCGSTABSetTol ( HYPRE_SStructSolver solver, HYPRE_Real tol ); HYPRE_Int HYPRE_SStructBiCGSTABSetAbsoluteTol ( HYPRE_SStructSolver solver, HYPRE_Real tol ); HYPRE_Int HYPRE_SStructBiCGSTABSetMinIter ( HYPRE_SStructSolver solver, HYPRE_Int min_iter ); HYPRE_Int HYPRE_SStructBiCGSTABSetMaxIter ( HYPRE_SStructSolver solver, HYPRE_Int max_iter ); HYPRE_Int HYPRE_SStructBiCGSTABSetStopCrit ( HYPRE_SStructSolver solver, HYPRE_Int stop_crit ); HYPRE_Int HYPRE_SStructBiCGSTABSetPrecond ( HYPRE_SStructSolver solver, HYPRE_PtrToSStructSolverFcn precond, HYPRE_PtrToSStructSolverFcn precond_setup, void *precond_data ); HYPRE_Int HYPRE_SStructBiCGSTABSetLogging ( HYPRE_SStructSolver solver, HYPRE_Int logging ); HYPRE_Int HYPRE_SStructBiCGSTABSetPrintLevel ( HYPRE_SStructSolver solver, HYPRE_Int print_level ); HYPRE_Int HYPRE_SStructBiCGSTABGetNumIterations ( HYPRE_SStructSolver solver, HYPRE_Int *num_iterations ); HYPRE_Int HYPRE_SStructBiCGSTABGetFinalRelativeResidualNorm ( HYPRE_SStructSolver solver, HYPRE_Real *norm ); HYPRE_Int HYPRE_SStructBiCGSTABGetResidual ( HYPRE_SStructSolver solver, void **residual ); /* HYPRE_sstruct_flexgmres.c */ HYPRE_Int HYPRE_SStructFlexGMRESCreate ( MPI_Comm comm, HYPRE_SStructSolver *solver ); HYPRE_Int HYPRE_SStructFlexGMRESDestroy ( HYPRE_SStructSolver solver ); HYPRE_Int HYPRE_SStructFlexGMRESSetup ( HYPRE_SStructSolver solver, HYPRE_SStructMatrix A, HYPRE_SStructVector b, HYPRE_SStructVector x ); HYPRE_Int HYPRE_SStructFlexGMRESSolve ( HYPRE_SStructSolver solver, HYPRE_SStructMatrix A, HYPRE_SStructVector b, HYPRE_SStructVector x ); HYPRE_Int HYPRE_SStructFlexGMRESSetKDim ( HYPRE_SStructSolver solver, HYPRE_Int k_dim ); HYPRE_Int HYPRE_SStructFlexGMRESSetTol ( HYPRE_SStructSolver solver, HYPRE_Real tol ); HYPRE_Int HYPRE_SStructFlexGMRESSetAbsoluteTol ( HYPRE_SStructSolver solver, HYPRE_Real tol ); HYPRE_Int HYPRE_SStructFlexGMRESSetMinIter ( HYPRE_SStructSolver solver, HYPRE_Int min_iter ); HYPRE_Int HYPRE_SStructFlexGMRESSetMaxIter ( HYPRE_SStructSolver solver, HYPRE_Int max_iter ); HYPRE_Int HYPRE_SStructFlexGMRESSetPrecond ( HYPRE_SStructSolver solver, HYPRE_PtrToSStructSolverFcn precond, HYPRE_PtrToSStructSolverFcn precond_setup, void *precond_data ); HYPRE_Int HYPRE_SStructFlexGMRESSetLogging ( HYPRE_SStructSolver solver, HYPRE_Int logging ); HYPRE_Int HYPRE_SStructFlexGMRESSetPrintLevel ( HYPRE_SStructSolver solver, HYPRE_Int level ); HYPRE_Int HYPRE_SStructFlexGMRESGetNumIterations ( HYPRE_SStructSolver solver, HYPRE_Int *num_iterations ); HYPRE_Int HYPRE_SStructFlexGMRESGetFinalRelativeResidualNorm ( HYPRE_SStructSolver solver, HYPRE_Real *norm ); HYPRE_Int HYPRE_SStructFlexGMRESGetResidual ( HYPRE_SStructSolver solver, void **residual ); HYPRE_Int HYPRE_SStructFlexGMRESSetModifyPC ( HYPRE_SStructSolver solver, HYPRE_PtrToModifyPCFcn modify_pc ); /* HYPRE_sstruct_gmres.c */ HYPRE_Int HYPRE_SStructGMRESCreate ( MPI_Comm comm, HYPRE_SStructSolver *solver ); HYPRE_Int HYPRE_SStructGMRESDestroy ( HYPRE_SStructSolver solver ); HYPRE_Int HYPRE_SStructGMRESSetup ( HYPRE_SStructSolver solver, HYPRE_SStructMatrix A, HYPRE_SStructVector b, HYPRE_SStructVector x ); HYPRE_Int HYPRE_SStructGMRESSolve ( HYPRE_SStructSolver solver, HYPRE_SStructMatrix A, HYPRE_SStructVector b, HYPRE_SStructVector x ); HYPRE_Int HYPRE_SStructGMRESSetKDim ( HYPRE_SStructSolver solver, HYPRE_Int k_dim ); HYPRE_Int HYPRE_SStructGMRESSetTol ( HYPRE_SStructSolver solver, HYPRE_Real tol ); HYPRE_Int HYPRE_SStructGMRESSetAbsoluteTol ( HYPRE_SStructSolver solver, HYPRE_Real atol ); HYPRE_Int HYPRE_SStructGMRESSetMinIter ( HYPRE_SStructSolver solver, HYPRE_Int min_iter ); HYPRE_Int HYPRE_SStructGMRESSetMaxIter ( HYPRE_SStructSolver solver, HYPRE_Int max_iter ); HYPRE_Int HYPRE_SStructGMRESSetStopCrit ( HYPRE_SStructSolver solver, HYPRE_Int stop_crit ); HYPRE_Int HYPRE_SStructGMRESSetPrecond ( HYPRE_SStructSolver solver, HYPRE_PtrToSStructSolverFcn precond, HYPRE_PtrToSStructSolverFcn precond_setup, void *precond_data ); HYPRE_Int HYPRE_SStructGMRESSetLogging ( HYPRE_SStructSolver solver, HYPRE_Int logging ); HYPRE_Int HYPRE_SStructGMRESSetPrintLevel ( HYPRE_SStructSolver solver, HYPRE_Int level ); HYPRE_Int HYPRE_SStructGMRESGetNumIterations ( HYPRE_SStructSolver solver, HYPRE_Int *num_iterations ); HYPRE_Int HYPRE_SStructGMRESGetFinalRelativeResidualNorm ( HYPRE_SStructSolver solver, HYPRE_Real *norm ); HYPRE_Int HYPRE_SStructGMRESGetResidual ( HYPRE_SStructSolver solver, void **residual ); /* HYPRE_sstruct_int.c */ HYPRE_Int hypre_SStructPVectorSetRandomValues ( hypre_SStructPVector *pvector, HYPRE_Int seed ); HYPRE_Int hypre_SStructVectorSetRandomValues ( hypre_SStructVector *vector, HYPRE_Int seed ); HYPRE_Int hypre_SStructSetRandomValues ( void *v, HYPRE_Int seed ); HYPRE_Int HYPRE_SStructSetupInterpreter ( mv_InterfaceInterpreter *i ); HYPRE_Int HYPRE_SStructSetupMatvec ( HYPRE_MatvecFunctions *mv ); /* HYPRE_sstruct_InterFAC.c */ HYPRE_Int HYPRE_SStructFACCreate ( MPI_Comm comm, HYPRE_SStructSolver *solver ); HYPRE_Int HYPRE_SStructFACDestroy2 ( HYPRE_SStructSolver solver ); HYPRE_Int HYPRE_SStructFACAMR_RAP ( HYPRE_SStructMatrix A, HYPRE_Int (*rfactors )[HYPRE_MAXDIM], HYPRE_SStructMatrix *fac_A ); HYPRE_Int HYPRE_SStructFACSetup2 ( HYPRE_SStructSolver solver, HYPRE_SStructMatrix A, HYPRE_SStructVector b, HYPRE_SStructVector x ); HYPRE_Int HYPRE_SStructFACSolve3 ( HYPRE_SStructSolver solver, HYPRE_SStructMatrix A, HYPRE_SStructVector b, HYPRE_SStructVector x ); HYPRE_Int HYPRE_SStructFACSetTol ( HYPRE_SStructSolver solver, HYPRE_Real tol ); HYPRE_Int HYPRE_SStructFACSetPLevels ( HYPRE_SStructSolver solver, HYPRE_Int nparts, HYPRE_Int *plevels ); HYPRE_Int HYPRE_SStructFACZeroCFSten ( HYPRE_SStructMatrix A, HYPRE_SStructGrid grid, HYPRE_Int part, HYPRE_Int rfactors [HYPRE_MAXDIM]); HYPRE_Int HYPRE_SStructFACZeroFCSten ( HYPRE_SStructMatrix A, HYPRE_SStructGrid grid, HYPRE_Int part ); HYPRE_Int HYPRE_SStructFACZeroAMRMatrixData ( HYPRE_SStructMatrix A, HYPRE_Int part_crse, HYPRE_Int rfactors [HYPRE_MAXDIM]); HYPRE_Int HYPRE_SStructFACZeroAMRVectorData ( HYPRE_SStructVector b, HYPRE_Int *plevels, HYPRE_Int (*rfactors )[HYPRE_MAXDIM]); HYPRE_Int HYPRE_SStructFACSetPRefinements ( HYPRE_SStructSolver solver, HYPRE_Int nparts, HYPRE_Int (*rfactors )[HYPRE_MAXDIM]); HYPRE_Int HYPRE_SStructFACSetMaxLevels ( HYPRE_SStructSolver solver, HYPRE_Int max_levels ); HYPRE_Int HYPRE_SStructFACSetMaxIter ( HYPRE_SStructSolver solver, HYPRE_Int max_iter ); HYPRE_Int HYPRE_SStructFACSetRelChange ( HYPRE_SStructSolver solver, HYPRE_Int rel_change ); HYPRE_Int HYPRE_SStructFACSetZeroGuess ( HYPRE_SStructSolver solver ); HYPRE_Int HYPRE_SStructFACSetNonZeroGuess ( HYPRE_SStructSolver solver ); HYPRE_Int HYPRE_SStructFACSetRelaxType ( HYPRE_SStructSolver solver, HYPRE_Int relax_type ); HYPRE_Int HYPRE_SStructFACSetJacobiWeight ( HYPRE_SStructSolver solver, HYPRE_Real weight ); HYPRE_Int HYPRE_SStructFACSetNumPreRelax ( HYPRE_SStructSolver solver, HYPRE_Int num_pre_relax ); HYPRE_Int HYPRE_SStructFACSetNumPostRelax ( HYPRE_SStructSolver solver, HYPRE_Int num_post_relax ); HYPRE_Int HYPRE_SStructFACSetCoarseSolverType ( HYPRE_SStructSolver solver, HYPRE_Int csolver_type ); HYPRE_Int HYPRE_SStructFACSetLogging ( HYPRE_SStructSolver solver, HYPRE_Int logging ); HYPRE_Int HYPRE_SStructFACGetNumIterations ( HYPRE_SStructSolver solver, HYPRE_Int *num_iterations ); HYPRE_Int HYPRE_SStructFACGetFinalRelativeResidualNorm ( HYPRE_SStructSolver solver, HYPRE_Real *norm ); /* HYPRE_sstruct_lgmres.c */ HYPRE_Int HYPRE_SStructLGMRESCreate ( MPI_Comm comm, HYPRE_SStructSolver *solver ); HYPRE_Int HYPRE_SStructLGMRESDestroy ( HYPRE_SStructSolver solver ); HYPRE_Int HYPRE_SStructLGMRESSetup ( HYPRE_SStructSolver solver, HYPRE_SStructMatrix A, HYPRE_SStructVector b, HYPRE_SStructVector x ); HYPRE_Int HYPRE_SStructLGMRESSolve ( HYPRE_SStructSolver solver, HYPRE_SStructMatrix A, HYPRE_SStructVector b, HYPRE_SStructVector x ); HYPRE_Int HYPRE_SStructLGMRESSetKDim ( HYPRE_SStructSolver solver, HYPRE_Int k_dim ); HYPRE_Int HYPRE_SStructLGMRESSetAugDim ( HYPRE_SStructSolver solver, HYPRE_Int aug_dim ); HYPRE_Int HYPRE_SStructLGMRESSetTol ( HYPRE_SStructSolver solver, HYPRE_Real tol ); HYPRE_Int HYPRE_SStructLGMRESSetAbsoluteTol ( HYPRE_SStructSolver solver, HYPRE_Real atol ); HYPRE_Int HYPRE_SStructLGMRESSetMinIter ( HYPRE_SStructSolver solver, HYPRE_Int min_iter ); HYPRE_Int HYPRE_SStructLGMRESSetMaxIter ( HYPRE_SStructSolver solver, HYPRE_Int max_iter ); HYPRE_Int HYPRE_SStructLGMRESSetPrecond ( HYPRE_SStructSolver solver, HYPRE_PtrToSStructSolverFcn precond, HYPRE_PtrToSStructSolverFcn precond_setup, void *precond_data ); HYPRE_Int HYPRE_SStructLGMRESSetLogging ( HYPRE_SStructSolver solver, HYPRE_Int logging ); HYPRE_Int HYPRE_SStructLGMRESSetPrintLevel ( HYPRE_SStructSolver solver, HYPRE_Int level ); HYPRE_Int HYPRE_SStructLGMRESGetNumIterations ( HYPRE_SStructSolver solver, HYPRE_Int *num_iterations ); HYPRE_Int HYPRE_SStructLGMRESGetFinalRelativeResidualNorm ( HYPRE_SStructSolver solver, HYPRE_Real *norm ); HYPRE_Int HYPRE_SStructLGMRESGetResidual ( HYPRE_SStructSolver solver, void **residual ); /* HYPRE_sstruct_maxwell.c */ HYPRE_Int HYPRE_SStructMaxwellCreate ( MPI_Comm comm, HYPRE_SStructSolver *solver ); HYPRE_Int HYPRE_SStructMaxwellDestroy ( HYPRE_SStructSolver solver ); HYPRE_Int HYPRE_SStructMaxwellSetup ( HYPRE_SStructSolver solver, HYPRE_SStructMatrix A, HYPRE_SStructVector b, HYPRE_SStructVector x ); HYPRE_Int HYPRE_SStructMaxwellSolve ( HYPRE_SStructSolver solver, HYPRE_SStructMatrix A, HYPRE_SStructVector b, HYPRE_SStructVector x ); HYPRE_Int HYPRE_SStructMaxwellSolve2 ( HYPRE_SStructSolver solver, HYPRE_SStructMatrix A, HYPRE_SStructVector b, HYPRE_SStructVector x ); HYPRE_Int HYPRE_MaxwellGrad ( HYPRE_SStructGrid grid, HYPRE_ParCSRMatrix *T ); HYPRE_Int HYPRE_SStructMaxwellSetGrad ( HYPRE_SStructSolver solver, HYPRE_ParCSRMatrix T ); HYPRE_Int HYPRE_SStructMaxwellSetRfactors ( HYPRE_SStructSolver solver, HYPRE_Int *rfactors); HYPRE_Int HYPRE_SStructMaxwellSetTol ( HYPRE_SStructSolver solver, HYPRE_Real tol ); HYPRE_Int HYPRE_SStructMaxwellSetConstantCoef ( HYPRE_SStructSolver solver, HYPRE_Int constant_coef ); HYPRE_Int HYPRE_SStructMaxwellSetMaxIter ( HYPRE_SStructSolver solver, HYPRE_Int max_iter ); HYPRE_Int HYPRE_SStructMaxwellSetRelChange ( HYPRE_SStructSolver solver, HYPRE_Int rel_change ); HYPRE_Int HYPRE_SStructMaxwellSetNumPreRelax ( HYPRE_SStructSolver solver, HYPRE_Int num_pre_relax ); HYPRE_Int HYPRE_SStructMaxwellSetNumPostRelax ( HYPRE_SStructSolver solver, HYPRE_Int num_post_relax ); HYPRE_Int HYPRE_SStructMaxwellSetLogging ( HYPRE_SStructSolver solver, HYPRE_Int logging ); HYPRE_Int HYPRE_SStructMaxwellSetPrintLevel ( HYPRE_SStructSolver solver, HYPRE_Int print_level ); HYPRE_Int HYPRE_SStructMaxwellPrintLogging ( HYPRE_SStructSolver solver, HYPRE_Int myid ); HYPRE_Int HYPRE_SStructMaxwellGetNumIterations ( HYPRE_SStructSolver solver, HYPRE_Int *num_iterations ); HYPRE_Int HYPRE_SStructMaxwellGetFinalRelativeResidualNorm ( HYPRE_SStructSolver solver, HYPRE_Real *norm ); HYPRE_Int HYPRE_SStructMaxwellPhysBdy ( HYPRE_SStructGrid *grid_l, HYPRE_Int num_levels, HYPRE_Int *rfactors, HYPRE_Int ***BdryRanks_ptr, HYPRE_Int **BdryRanksCnt_ptr ); HYPRE_Int HYPRE_SStructMaxwellEliminateRowsCols ( HYPRE_ParCSRMatrix parA, HYPRE_Int nrows, HYPRE_Int *rows ); HYPRE_Int HYPRE_SStructMaxwellZeroVector ( HYPRE_ParVector v, HYPRE_Int *rows, HYPRE_Int nrows ); /* HYPRE_sstruct_pcg.c */ HYPRE_Int HYPRE_SStructPCGCreate ( MPI_Comm comm, HYPRE_SStructSolver *solver ); HYPRE_Int HYPRE_SStructPCGDestroy ( HYPRE_SStructSolver solver ); HYPRE_Int HYPRE_SStructPCGSetup ( HYPRE_SStructSolver solver, HYPRE_SStructMatrix A, HYPRE_SStructVector b, HYPRE_SStructVector x ); HYPRE_Int HYPRE_SStructPCGSolve ( HYPRE_SStructSolver solver, HYPRE_SStructMatrix A, HYPRE_SStructVector b, HYPRE_SStructVector x ); HYPRE_Int HYPRE_SStructPCGSetTol ( HYPRE_SStructSolver solver, HYPRE_Real tol ); HYPRE_Int HYPRE_SStructPCGSetAbsoluteTol ( HYPRE_SStructSolver solver, HYPRE_Real tol ); HYPRE_Int HYPRE_SStructPCGSetMaxIter ( HYPRE_SStructSolver solver, HYPRE_Int max_iter ); HYPRE_Int HYPRE_SStructPCGSetTwoNorm ( HYPRE_SStructSolver solver, HYPRE_Int two_norm ); HYPRE_Int HYPRE_SStructPCGSetRelChange ( HYPRE_SStructSolver solver, HYPRE_Int rel_change ); HYPRE_Int HYPRE_SStructPCGSetPrecond ( HYPRE_SStructSolver solver, HYPRE_PtrToSStructSolverFcn precond, HYPRE_PtrToSStructSolverFcn precond_setup, void *precond_data ); HYPRE_Int HYPRE_SStructPCGSetLogging ( HYPRE_SStructSolver solver, HYPRE_Int logging ); HYPRE_Int HYPRE_SStructPCGSetPrintLevel ( HYPRE_SStructSolver solver, HYPRE_Int level ); HYPRE_Int HYPRE_SStructPCGGetNumIterations ( HYPRE_SStructSolver solver, HYPRE_Int *num_iterations ); HYPRE_Int HYPRE_SStructPCGGetFinalRelativeResidualNorm ( HYPRE_SStructSolver solver, HYPRE_Real *norm ); HYPRE_Int HYPRE_SStructPCGGetResidual ( HYPRE_SStructSolver solver, void **residual ); HYPRE_Int HYPRE_SStructDiagScaleSetup ( HYPRE_SStructSolver solver, HYPRE_SStructMatrix A, HYPRE_SStructVector y, HYPRE_SStructVector x ); HYPRE_Int HYPRE_SStructDiagScale ( HYPRE_SStructSolver solver, HYPRE_SStructMatrix A, HYPRE_SStructVector y, HYPRE_SStructVector x ); /* HYPRE_sstruct_split.c */ HYPRE_Int HYPRE_SStructSplitCreate ( MPI_Comm comm, HYPRE_SStructSolver *solver_ptr ); HYPRE_Int HYPRE_SStructSplitDestroy ( HYPRE_SStructSolver solver ); HYPRE_Int HYPRE_SStructSplitSetup ( HYPRE_SStructSolver solver, HYPRE_SStructMatrix A, HYPRE_SStructVector b, HYPRE_SStructVector x ); HYPRE_Int HYPRE_SStructSplitSolve ( HYPRE_SStructSolver solver, HYPRE_SStructMatrix A, HYPRE_SStructVector b, HYPRE_SStructVector x ); HYPRE_Int HYPRE_SStructSplitSetTol ( HYPRE_SStructSolver solver, HYPRE_Real tol ); HYPRE_Int HYPRE_SStructSplitSetMaxIter ( HYPRE_SStructSolver solver, HYPRE_Int max_iter ); HYPRE_Int HYPRE_SStructSplitSetZeroGuess ( HYPRE_SStructSolver solver ); HYPRE_Int HYPRE_SStructSplitSetNonZeroGuess ( HYPRE_SStructSolver solver ); HYPRE_Int HYPRE_SStructSplitSetStructSolver ( HYPRE_SStructSolver solver, HYPRE_Int ssolver ); HYPRE_Int HYPRE_SStructSplitGetNumIterations ( HYPRE_SStructSolver solver, HYPRE_Int *num_iterations ); HYPRE_Int HYPRE_SStructSplitGetFinalRelativeResidualNorm ( HYPRE_SStructSolver solver, HYPRE_Real *norm ); /* HYPRE_sstruct_sys_pfmg.c */ HYPRE_Int HYPRE_SStructSysPFMGCreate ( MPI_Comm comm, HYPRE_SStructSolver *solver ); HYPRE_Int HYPRE_SStructSysPFMGDestroy ( HYPRE_SStructSolver solver ); HYPRE_Int HYPRE_SStructSysPFMGSetup ( HYPRE_SStructSolver solver, HYPRE_SStructMatrix A, HYPRE_SStructVector b, HYPRE_SStructVector x ); HYPRE_Int HYPRE_SStructSysPFMGSolve ( HYPRE_SStructSolver solver, HYPRE_SStructMatrix A, HYPRE_SStructVector b, HYPRE_SStructVector x ); HYPRE_Int HYPRE_SStructSysPFMGSetTol ( HYPRE_SStructSolver solver, HYPRE_Real tol ); HYPRE_Int HYPRE_SStructSysPFMGSetMaxIter ( HYPRE_SStructSolver solver, HYPRE_Int max_iter ); HYPRE_Int HYPRE_SStructSysPFMGSetRelChange ( HYPRE_SStructSolver solver, HYPRE_Int rel_change ); HYPRE_Int HYPRE_SStructSysPFMGSetZeroGuess ( HYPRE_SStructSolver solver ); HYPRE_Int HYPRE_SStructSysPFMGSetNonZeroGuess ( HYPRE_SStructSolver solver ); HYPRE_Int HYPRE_SStructSysPFMGSetRelaxType ( HYPRE_SStructSolver solver, HYPRE_Int relax_type ); HYPRE_Int HYPRE_SStructSysPFMGSetJacobiWeight ( HYPRE_SStructSolver solver, HYPRE_Real weight ); HYPRE_Int HYPRE_SStructSysPFMGSetNumPreRelax ( HYPRE_SStructSolver solver, HYPRE_Int num_pre_relax ); HYPRE_Int HYPRE_SStructSysPFMGSetNumPostRelax ( HYPRE_SStructSolver solver, HYPRE_Int num_post_relax ); HYPRE_Int HYPRE_SStructSysPFMGSetSkipRelax ( HYPRE_SStructSolver solver, HYPRE_Int skip_relax ); HYPRE_Int HYPRE_SStructSysPFMGSetDxyz ( HYPRE_SStructSolver solver, HYPRE_Real *dxyz ); HYPRE_Int HYPRE_SStructSysPFMGSetLogging ( HYPRE_SStructSolver solver, HYPRE_Int logging ); HYPRE_Int HYPRE_SStructSysPFMGSetPrintLevel ( HYPRE_SStructSolver solver, HYPRE_Int print_level ); HYPRE_Int HYPRE_SStructSysPFMGGetNumIterations ( HYPRE_SStructSolver solver, HYPRE_Int *num_iterations ); HYPRE_Int HYPRE_SStructSysPFMGGetFinalRelativeResidualNorm ( HYPRE_SStructSolver solver, HYPRE_Real *norm ); /* krylov.c */ HYPRE_Int hypre_SStructKrylovIdentitySetup ( void *vdata, void *A, void *b, void *x ); HYPRE_Int hypre_SStructKrylovIdentity ( void *vdata, void *A, void *b, void *x ); /* krylov_sstruct.c */ void *hypre_SStructKrylovCAlloc ( size_t count, size_t elt_size, HYPRE_MemoryLocation location ); HYPRE_Int hypre_SStructKrylovFree ( void *ptr ); void *hypre_SStructKrylovCreateVector ( void *vvector ); void *hypre_SStructKrylovCreateVectorArray ( HYPRE_Int n, void *vvector ); HYPRE_Int hypre_SStructKrylovDestroyVector ( void *vvector ); void *hypre_SStructKrylovMatvecCreate ( void *A, void *x ); HYPRE_Int hypre_SStructKrylovMatvec ( void *matvec_data, HYPRE_Complex alpha, void *A, void *x, HYPRE_Complex beta, void *y ); HYPRE_Int hypre_SStructKrylovMatvecDestroy ( void *matvec_data ); HYPRE_Real hypre_SStructKrylovInnerProd ( void *x, void *y ); HYPRE_Int hypre_SStructKrylovCopyVector ( void *x, void *y ); HYPRE_Int hypre_SStructKrylovClearVector ( void *x ); HYPRE_Int hypre_SStructKrylovScaleVector ( HYPRE_Complex alpha, void *x ); HYPRE_Int hypre_SStructKrylovAxpy ( HYPRE_Complex alpha, void *x, void *y ); HYPRE_Int hypre_SStructKrylovCommInfo ( void *A, HYPRE_Int *my_id, HYPRE_Int *num_procs ); /* maxwell_grad.c */ hypre_ParCSRMatrix *hypre_Maxwell_Grad ( hypre_SStructGrid *grid ); /* maxwell_physbdy.c */ HYPRE_Int hypre_Maxwell_PhysBdy ( hypre_SStructGrid **grid_l, HYPRE_Int num_levels, hypre_Index rfactors, HYPRE_Int ***BdryRanksl_ptr, HYPRE_Int **BdryRanksCntsl_ptr ); HYPRE_Int hypre_Maxwell_VarBdy ( hypre_SStructPGrid *pgrid, hypre_BoxArrayArray **bdry ); /* maxwell_PNedelec_bdy.c */ HYPRE_Int hypre_Maxwell_PNedelec_Bdy ( hypre_StructGrid *cell_grid, hypre_SStructPGrid *pgrid, hypre_BoxArrayArray ****bdry_ptr ); /* maxwell_PNedelec.c */ hypre_IJMatrix *hypre_Maxwell_PNedelec ( hypre_SStructGrid *fgrid_edge, hypre_SStructGrid *cgrid_edge, hypre_Index rfactor ); /* maxwell_semi_interp.c */ HYPRE_Int hypre_CreatePTopology ( void **PTopology_vdata_ptr ); HYPRE_Int hypre_DestroyPTopology ( void *PTopology_vdata ); hypre_IJMatrix *hypre_Maxwell_PTopology ( hypre_SStructGrid *fgrid_edge, hypre_SStructGrid *cgrid_edge, hypre_SStructGrid *fgrid_face, hypre_SStructGrid *cgrid_face, hypre_SStructGrid *fgrid_element, hypre_SStructGrid *cgrid_element, hypre_ParCSRMatrix *Aee, hypre_Index rfactor, void *PTopology_vdata ); HYPRE_Int hypre_CollapseStencilToStencil ( hypre_ParCSRMatrix *Aee, hypre_SStructGrid *grid, HYPRE_Int part, HYPRE_Int var, hypre_Index pt_location, HYPRE_Int collapse_dir, HYPRE_Int new_stencil_dir, HYPRE_Real **collapsed_vals_ptr ); HYPRE_Int hypre_TriDiagSolve ( HYPRE_Real *diag, HYPRE_Real *upper, HYPRE_Real *lower, HYPRE_Real *rhs, HYPRE_Int size ); /* maxwell_TV.c */ void *hypre_MaxwellTVCreate ( MPI_Comm comm ); HYPRE_Int hypre_MaxwellTVDestroy ( void *maxwell_vdata ); HYPRE_Int hypre_MaxwellSetRfactors ( void *maxwell_vdata, HYPRE_Int rfactor [HYPRE_MAXDIM]); HYPRE_Int hypre_MaxwellSetGrad ( void *maxwell_vdata, hypre_ParCSRMatrix *T ); HYPRE_Int hypre_MaxwellSetConstantCoef ( void *maxwell_vdata, HYPRE_Int constant_coef ); HYPRE_Int hypre_MaxwellSetTol ( void *maxwell_vdata, HYPRE_Real tol ); HYPRE_Int hypre_MaxwellSetMaxIter ( void *maxwell_vdata, HYPRE_Int max_iter ); HYPRE_Int hypre_MaxwellSetRelChange ( void *maxwell_vdata, HYPRE_Int rel_change ); HYPRE_Int hypre_MaxwellSetNumPreRelax ( void *maxwell_vdata, HYPRE_Int num_pre_relax ); HYPRE_Int hypre_MaxwellSetNumPostRelax ( void *maxwell_vdata, HYPRE_Int num_post_relax ); HYPRE_Int hypre_MaxwellGetNumIterations ( void *maxwell_vdata, HYPRE_Int *num_iterations ); HYPRE_Int hypre_MaxwellSetPrintLevel ( void *maxwell_vdata, HYPRE_Int print_level ); HYPRE_Int hypre_MaxwellSetLogging ( void *maxwell_vdata, HYPRE_Int logging ); HYPRE_Int hypre_MaxwellPrintLogging ( void *maxwell_vdata, HYPRE_Int myid ); HYPRE_Int hypre_MaxwellGetFinalRelativeResidualNorm ( void *maxwell_vdata, HYPRE_Real *relative_residual_norm ); /* maxwell_TV_setup.c */ HYPRE_Int hypre_MaxwellTV_Setup ( void *maxwell_vdata, hypre_SStructMatrix *Aee_in, hypre_SStructVector *b_in, hypre_SStructVector *x_in ); HYPRE_Int hypre_CoarsenPGrid ( hypre_SStructGrid *fgrid, hypre_Index index, hypre_Index stride, HYPRE_Int part, hypre_SStructGrid *cgrid, HYPRE_Int *nboxes ); hypre_Box *hypre_BoxContraction ( hypre_Box *box, hypre_StructGrid *sgrid, hypre_Index rfactor ); /* maxwell_zeroBC.c */ HYPRE_Int hypre_ParVectorZeroBCValues ( hypre_ParVector *v, HYPRE_Int *rows, HYPRE_Int nrows ); HYPRE_Int hypre_SeqVectorZeroBCValues ( hypre_Vector *v, HYPRE_Int *rows, HYPRE_Int nrows ); /* nd1_amge_interpolation.c */ HYPRE_Int hypre_ND1AMGeInterpolation ( hypre_ParCSRMatrix *Aee, hypre_ParCSRMatrix *ELEM_idof, hypre_ParCSRMatrix *FACE_idof, hypre_ParCSRMatrix *EDGE_idof, hypre_ParCSRMatrix *ELEM_FACE, hypre_ParCSRMatrix *ELEM_EDGE, HYPRE_Int num_OffProcRows, hypre_MaxwellOffProcRow **OffProcRows, hypre_IJMatrix *IJ_dof_DOF ); HYPRE_Int hypre_HarmonicExtension ( hypre_CSRMatrix *A, hypre_CSRMatrix *P, HYPRE_Int num_DOF, HYPRE_BigInt *DOF, HYPRE_Int num_idof, HYPRE_BigInt *idof, HYPRE_Int num_bdof, HYPRE_BigInt *bdof ); /* node_relax.c */ void *hypre_NodeRelaxCreate ( MPI_Comm comm ); HYPRE_Int hypre_NodeRelaxDestroy ( void *relax_vdata ); HYPRE_Int hypre_NodeRelaxSetup ( void *relax_vdata, hypre_SStructPMatrix *A, hypre_SStructPVector *b, hypre_SStructPVector *x ); HYPRE_Int hypre_NodeRelax ( void *relax_vdata, hypre_SStructPMatrix *A, hypre_SStructPVector *b, hypre_SStructPVector *x ); HYPRE_Int hypre_NodeRelaxSetTol ( void *relax_vdata, HYPRE_Real tol ); HYPRE_Int hypre_NodeRelaxSetMaxIter ( void *relax_vdata, HYPRE_Int max_iter ); HYPRE_Int hypre_NodeRelaxSetZeroGuess ( void *relax_vdata, HYPRE_Int zero_guess ); HYPRE_Int hypre_NodeRelaxSetWeight ( void *relax_vdata, HYPRE_Real weight ); HYPRE_Int hypre_NodeRelaxSetNumNodesets ( void *relax_vdata, HYPRE_Int num_nodesets ); HYPRE_Int hypre_NodeRelaxSetNodeset ( void *relax_vdata, HYPRE_Int nodeset, HYPRE_Int nodeset_size, hypre_Index nodeset_stride, hypre_Index *nodeset_indices ); HYPRE_Int hypre_NodeRelaxSetNodesetRank ( void *relax_vdata, HYPRE_Int nodeset, HYPRE_Int nodeset_rank ); HYPRE_Int hypre_NodeRelaxSetTempVec ( void *relax_vdata, hypre_SStructPVector *t ); /* sstruct_amr_intercommunication.c */ HYPRE_Int hypre_SStructAMRInterCommunication ( hypre_SStructSendInfoData *sendinfo, hypre_SStructRecvInfoData *recvinfo, hypre_BoxArray *send_data_space, hypre_BoxArray *recv_data_space, HYPRE_Int num_values, MPI_Comm comm, hypre_CommPkg **comm_pkg_ptr ); /* sstruct_owninfo.c */ HYPRE_Int hypre_SStructIndexScaleF_C ( hypre_Index findex, hypre_Index index, hypre_Index stride, hypre_Index cindex ); HYPRE_Int hypre_SStructIndexScaleC_F ( hypre_Index cindex, hypre_Index index, hypre_Index stride, hypre_Index findex ); hypre_SStructOwnInfoData *hypre_SStructOwnInfo ( hypre_StructGrid *fgrid, hypre_StructGrid *cgrid, hypre_BoxManager *cboxman, hypre_BoxManager *fboxman, hypre_Index rfactor ); HYPRE_Int hypre_SStructOwnInfoDataDestroy ( hypre_SStructOwnInfoData *owninfo_data ); /* sstruct_recvinfo.c */ hypre_SStructRecvInfoData *hypre_SStructRecvInfo ( hypre_StructGrid *cgrid, hypre_BoxManager *fboxman, hypre_Index rfactor ); HYPRE_Int hypre_SStructRecvInfoDataDestroy ( hypre_SStructRecvInfoData *recvinfo_data ); /* sstruct_sendinfo.c */ hypre_SStructSendInfoData *hypre_SStructSendInfo ( hypre_StructGrid *fgrid, hypre_BoxManager *cboxman, hypre_Index rfactor ); HYPRE_Int hypre_SStructSendInfoDataDestroy ( hypre_SStructSendInfoData *sendinfo_data ); /* sstruct_sharedDOFComm.c */ hypre_MaxwellOffProcRow *hypre_MaxwellOffProcRowCreate ( HYPRE_Int ncols ); HYPRE_Int hypre_MaxwellOffProcRowDestroy ( void *OffProcRow_vdata ); HYPRE_Int hypre_SStructSharedDOF_ParcsrMatRowsComm ( hypre_SStructGrid *grid, hypre_ParCSRMatrix *A, HYPRE_Int *num_offprocrows_ptr, hypre_MaxwellOffProcRow ***OffProcRows_ptr ); /* sys_pfmg.c */ void *hypre_SysPFMGCreate ( MPI_Comm comm ); HYPRE_Int hypre_SysPFMGDestroy ( void *sys_pfmg_vdata ); HYPRE_Int hypre_SysPFMGSetTol ( void *sys_pfmg_vdata, HYPRE_Real tol ); HYPRE_Int hypre_SysPFMGSetMaxIter ( void *sys_pfmg_vdata, HYPRE_Int max_iter ); HYPRE_Int hypre_SysPFMGSetRelChange ( void *sys_pfmg_vdata, HYPRE_Int rel_change ); HYPRE_Int hypre_SysPFMGSetZeroGuess ( void *sys_pfmg_vdata, HYPRE_Int zero_guess ); HYPRE_Int hypre_SysPFMGSetRelaxType ( void *sys_pfmg_vdata, HYPRE_Int relax_type ); HYPRE_Int hypre_SysPFMGSetJacobiWeight ( void *sys_pfmg_vdata, HYPRE_Real weight ); HYPRE_Int hypre_SysPFMGSetNumPreRelax ( void *sys_pfmg_vdata, HYPRE_Int num_pre_relax ); HYPRE_Int hypre_SysPFMGSetNumPostRelax ( void *sys_pfmg_vdata, HYPRE_Int num_post_relax ); HYPRE_Int hypre_SysPFMGSetSkipRelax ( void *sys_pfmg_vdata, HYPRE_Int skip_relax ); HYPRE_Int hypre_SysPFMGSetDxyz ( void *sys_pfmg_vdata, HYPRE_Real *dxyz ); HYPRE_Int hypre_SysPFMGSetLogging ( void *sys_pfmg_vdata, HYPRE_Int logging ); HYPRE_Int hypre_SysPFMGSetPrintLevel ( void *sys_pfmg_vdata, HYPRE_Int print_level ); HYPRE_Int hypre_SysPFMGGetNumIterations ( void *sys_pfmg_vdata, HYPRE_Int *num_iterations ); HYPRE_Int hypre_SysPFMGPrintLogging ( void *sys_pfmg_vdata, HYPRE_Int myid ); HYPRE_Int hypre_SysPFMGGetFinalRelativeResidualNorm ( void *sys_pfmg_vdata, HYPRE_Real *relative_residual_norm ); /* sys_pfmg_relax.c */ void *hypre_SysPFMGRelaxCreate ( MPI_Comm comm ); HYPRE_Int hypre_SysPFMGRelaxDestroy ( void *sys_pfmg_relax_vdata ); HYPRE_Int hypre_SysPFMGRelax ( void *sys_pfmg_relax_vdata, hypre_SStructPMatrix *A, hypre_SStructPVector *b, hypre_SStructPVector *x ); HYPRE_Int hypre_SysPFMGRelaxSetup ( void *sys_pfmg_relax_vdata, hypre_SStructPMatrix *A, hypre_SStructPVector *b, hypre_SStructPVector *x ); HYPRE_Int hypre_SysPFMGRelaxSetType ( void *sys_pfmg_relax_vdata, HYPRE_Int relax_type ); HYPRE_Int hypre_SysPFMGRelaxSetJacobiWeight ( void *sys_pfmg_relax_vdata, HYPRE_Real weight ); HYPRE_Int hypre_SysPFMGRelaxSetPreRelax ( void *sys_pfmg_relax_vdata ); HYPRE_Int hypre_SysPFMGRelaxSetPostRelax ( void *sys_pfmg_relax_vdata ); HYPRE_Int hypre_SysPFMGRelaxSetTol ( void *sys_pfmg_relax_vdata, HYPRE_Real tol ); HYPRE_Int hypre_SysPFMGRelaxSetMaxIter ( void *sys_pfmg_relax_vdata, HYPRE_Int max_iter ); HYPRE_Int hypre_SysPFMGRelaxSetZeroGuess ( void *sys_pfmg_relax_vdata, HYPRE_Int zero_guess ); HYPRE_Int hypre_SysPFMGRelaxSetTempVec ( void *sys_pfmg_relax_vdata, hypre_SStructPVector *t ); /* sys_pfmg_setup.c */ HYPRE_Int hypre_SysPFMGSetup ( void *sys_pfmg_vdata, hypre_SStructMatrix *A_in, hypre_SStructVector *b_in, hypre_SStructVector *x_in ); HYPRE_Int hypre_SysStructCoarsen ( hypre_SStructPGrid *fgrid, hypre_Index index, hypre_Index stride, HYPRE_Int prune, hypre_SStructPGrid **cgrid_ptr ); /* sys_pfmg_setup_interp.c */ hypre_SStructPMatrix *hypre_SysPFMGCreateInterpOp ( hypre_SStructPMatrix *A, hypre_SStructPGrid *cgrid, HYPRE_Int cdir ); HYPRE_Int hypre_SysPFMGSetupInterpOp ( hypre_SStructPMatrix *A, HYPRE_Int cdir, hypre_Index findex, hypre_Index stride, hypre_SStructPMatrix *P ); /* sys_pfmg_setup_rap.c */ hypre_SStructPMatrix *hypre_SysPFMGCreateRAPOp ( hypre_SStructPMatrix *R, hypre_SStructPMatrix *A, hypre_SStructPMatrix *P, hypre_SStructPGrid *coarse_grid, HYPRE_Int cdir ); HYPRE_Int hypre_SysPFMGSetupRAPOp ( hypre_SStructPMatrix *R, hypre_SStructPMatrix *A, hypre_SStructPMatrix *P, HYPRE_Int cdir, hypre_Index cindex, hypre_Index cstride, hypre_SStructPMatrix *Ac ); /* sys_pfmg_solve.c */ HYPRE_Int hypre_SysPFMGSolve ( void *sys_pfmg_vdata, hypre_SStructMatrix *A_in, hypre_SStructVector *b_in, hypre_SStructVector *x_in ); /* sys_semi_interp.c */ HYPRE_Int hypre_SysSemiInterpCreate ( void **sys_interp_vdata_ptr ); HYPRE_Int hypre_SysSemiInterpSetup ( void *sys_interp_vdata, hypre_SStructPMatrix *P, HYPRE_Int P_stored_as_transpose, hypre_SStructPVector *xc, hypre_SStructPVector *e, hypre_Index cindex, hypre_Index findex, hypre_Index stride ); HYPRE_Int hypre_SysSemiInterp ( void *sys_interp_vdata, hypre_SStructPMatrix *P, hypre_SStructPVector *xc, hypre_SStructPVector *e ); HYPRE_Int hypre_SysSemiInterpDestroy ( void *sys_interp_vdata ); /* sys_semi_restrict.c */ HYPRE_Int hypre_SysSemiRestrictCreate ( void **sys_restrict_vdata_ptr ); HYPRE_Int hypre_SysSemiRestrictSetup ( void *sys_restrict_vdata, hypre_SStructPMatrix *R, HYPRE_Int R_stored_as_transpose, hypre_SStructPVector *r, hypre_SStructPVector *rc, hypre_Index cindex, hypre_Index findex, hypre_Index stride ); HYPRE_Int hypre_SysSemiRestrict ( void *sys_restrict_vdata, hypre_SStructPMatrix *R, hypre_SStructPVector *r, hypre_SStructPVector *rc ); HYPRE_Int hypre_SysSemiRestrictDestroy ( void *sys_restrict_vdata ); #ifdef __cplusplus } #endif #endif hypre-2.33.0/src/sstruct_ls/bsearch.c000066400000000000000000000047331477326011500175120ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "_hypre_utilities.h" #include "_hypre_sstruct_ls.h" /*-------------------------------------------------------------------------- * hypre_LowerBinarySearch * integers such that * list[m-1] < value <= list[m]. * The routine returns location m or -1. *--------------------------------------------------------------------------*/ HYPRE_Int hypre_LowerBinarySearch(HYPRE_Int *list, HYPRE_Int value, HYPRE_Int list_length) { HYPRE_Int low, high, m; HYPRE_Int not_found = 1; /* special case, list is size zero. */ if (list_length < 1) { return -1; } /* special case, list[0] >= value */ if (list[0] >= value) { return 0; } low = 0; high = list_length - 1; while (not_found && low <= high) { m = (low + high) / 2; if (m < 1) { m = 1; } if (list[m - 1] < value && list[m] < value) { low = m + 1; } else if (value <= list[m - 1] && value <= list[m]) { high = m - 1; } else { not_found = 0; return m; } } return -1; } /*-------------------------------------------------------------------------- * hypre_UpperBinarySearch * integers such that * list[m] <= value < list[m+1]. * The routine returns location m or -1. *--------------------------------------------------------------------------*/ HYPRE_Int hypre_UpperBinarySearch(HYPRE_Int *list, HYPRE_Int value, HYPRE_Int list_length) { HYPRE_Int low, high, m; HYPRE_Int not_found = 1; /* special case, list is size zero. */ if (list_length < 1) { return -1; } /* special case, list[list_length-1] >= value */ if (list[list_length - 1] <= value) { return (list_length - 1); } low = 0; high = list_length - 1; while (not_found && low <= high) { m = (low + high) / 2; if (list[m] <= value && list[m + 1] <= value) { low = m + 1; } else if (value < list[m] && value < list[m + 1]) { high = m - 1; } else { not_found = 0; return m; } } return -1; } hypre-2.33.0/src/sstruct_ls/eliminate_rowscols.c000066400000000000000000000170651477326011500220070ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "_hypre_parcsr_mv.h" #include "eliminate_rowscols.h" HYPRE_Int hypre_ParCSRMatrixEliminateRowsCols (hypre_ParCSRMatrix *A, HYPRE_Int nrows_to_eliminate, HYPRE_Int *rows_to_eliminate) { HYPRE_Int ierr = 0; MPI_Comm comm = hypre_ParCSRMatrixComm(A); hypre_CSRMatrix *diag = hypre_ParCSRMatrixDiag(A); hypre_CSRMatrix *offd = hypre_ParCSRMatrixOffd(A); HYPRE_Int diag_nrows = hypre_CSRMatrixNumRows(diag); HYPRE_Int offd_ncols = hypre_CSRMatrixNumCols(offd); HYPRE_Int ncols_to_eliminate; HYPRE_Int *cols_to_eliminate; HYPRE_Int myproc; HYPRE_Int ibeg; hypre_MPI_Comm_rank(comm, &myproc); ibeg = 0; /* take care of the diagonal part (sequential elimination) */ hypre_CSRMatrixEliminateRowsColsDiag (A, nrows_to_eliminate, rows_to_eliminate); /* eliminate the off-diagonal rows */ hypre_CSRMatrixEliminateRowsOffd (A, nrows_to_eliminate, rows_to_eliminate); /* figure out which offd cols should be eliminated */ { hypre_ParCSRCommHandle *comm_handle; hypre_ParCSRCommPkg *comm_pkg; HYPRE_Int num_sends, *int_buf_data; HYPRE_Int index, start; HYPRE_Int i, j, k; HYPRE_Int *eliminate_row = hypre_CTAlloc(HYPRE_Int, diag_nrows, HYPRE_MEMORY_HOST); HYPRE_Int *eliminate_col = hypre_CTAlloc(HYPRE_Int, offd_ncols, HYPRE_MEMORY_HOST); /* make sure A has a communication package */ comm_pkg = hypre_ParCSRMatrixCommPkg(A); if (!comm_pkg) { hypre_MatvecCommPkgCreate(A); comm_pkg = hypre_ParCSRMatrixCommPkg(A); } /* which of the local rows are to be eliminated */ for (i = 0; i < diag_nrows; i++) { eliminate_row[i] = 0; } for (i = 0; i < nrows_to_eliminate; i++) { eliminate_row[rows_to_eliminate[i] - ibeg] = 1; } /* use a Matvec communication pattern to find (in eliminate_col) which of the local offd columns are to be eliminated */ num_sends = hypre_ParCSRCommPkgNumSends(comm_pkg); int_buf_data = hypre_CTAlloc(HYPRE_Int, hypre_ParCSRCommPkgSendMapStart(comm_pkg, num_sends), HYPRE_MEMORY_HOST); index = 0; for (i = 0; i < num_sends; i++) { start = hypre_ParCSRCommPkgSendMapStart(comm_pkg, i); for (j = start; j < hypre_ParCSRCommPkgSendMapStart(comm_pkg, i + 1); j++) { k = hypre_ParCSRCommPkgSendMapElmt(comm_pkg, j); int_buf_data[index++] = eliminate_row[k]; } } comm_handle = hypre_ParCSRCommHandleCreate(11, comm_pkg, int_buf_data, eliminate_col); hypre_ParCSRCommHandleDestroy(comm_handle); /* set the array cols_to_eliminate */ ncols_to_eliminate = 0; for (i = 0; i < offd_ncols; i++) if (eliminate_col[i]) { ncols_to_eliminate++; } cols_to_eliminate = hypre_CTAlloc(HYPRE_Int, ncols_to_eliminate, HYPRE_MEMORY_HOST); ncols_to_eliminate = 0; for (i = 0; i < offd_ncols; i++) if (eliminate_col[i]) { cols_to_eliminate[ncols_to_eliminate++] = i; } hypre_TFree(int_buf_data, HYPRE_MEMORY_HOST); hypre_TFree(eliminate_row, HYPRE_MEMORY_HOST); hypre_TFree(eliminate_col, HYPRE_MEMORY_HOST); } /* eliminate the off-diagonal columns */ hypre_CSRMatrixEliminateColsOffd (offd, ncols_to_eliminate, cols_to_eliminate); hypre_TFree(cols_to_eliminate, HYPRE_MEMORY_HOST); return ierr; } HYPRE_Int hypre_CSRMatrixEliminateRowsColsDiag (hypre_ParCSRMatrix *A, HYPRE_Int nrows_to_eliminate, HYPRE_Int *rows_to_eliminate) { HYPRE_Int ierr = 0; MPI_Comm comm = hypre_ParCSRMatrixComm(A); hypre_CSRMatrix *Adiag = hypre_ParCSRMatrixDiag(A); HYPRE_Int i, j; HYPRE_Int irow, ibeg, iend; HYPRE_Int nnz = hypre_CSRMatrixNumNonzeros(Adiag); HYPRE_Int *Ai = hypre_CSRMatrixI(Adiag); HYPRE_Int *Aj = hypre_CSRMatrixJ(Adiag); HYPRE_Real *Adata = hypre_CSRMatrixData(Adiag); HYPRE_Int *local_rows; HYPRE_Int myproc; hypre_MPI_Comm_rank(comm, &myproc); ibeg = 0; /* grab local rows to eliminate */ local_rows = hypre_TAlloc(HYPRE_Int, nrows_to_eliminate, HYPRE_MEMORY_HOST); for (i = 0; i < nrows_to_eliminate; i++) { local_rows[i] = rows_to_eliminate[i] - ibeg; } /* remove the columns */ for (i = 0; i < nnz; i++) { irow = hypre_BinarySearch(local_rows, Aj[i], nrows_to_eliminate); if (irow != -1) { Adata[i] = 0.0; } } /* remove the rows and set the diagonal equal to 1 */ for (i = 0; i < nrows_to_eliminate; i++) { irow = local_rows[i]; ibeg = Ai[irow]; iend = Ai[irow + 1]; for (j = ibeg; j < iend; j++) if (Aj[j] == irow) { Adata[j] = 1.0; } else { Adata[j] = 0.0; } } hypre_TFree(local_rows, HYPRE_MEMORY_HOST); return ierr; } HYPRE_Int hypre_CSRMatrixEliminateRowsOffd (hypre_ParCSRMatrix *A, HYPRE_Int nrows_to_eliminate, HYPRE_Int *rows_to_eliminate) { HYPRE_Int ierr = 0; MPI_Comm comm = hypre_ParCSRMatrixComm(A); hypre_CSRMatrix *Aoffd = hypre_ParCSRMatrixOffd(A); HYPRE_Int *Ai = hypre_CSRMatrixI(Aoffd); HYPRE_Real *Adata = hypre_CSRMatrixData(Aoffd); HYPRE_Int i, j; HYPRE_Int ibeg, iend; HYPRE_Int *local_rows; HYPRE_Int myproc; hypre_MPI_Comm_rank(comm, &myproc); ibeg = 0; /* grab local rows to eliminate */ local_rows = hypre_TAlloc(HYPRE_Int, nrows_to_eliminate, HYPRE_MEMORY_HOST); for (i = 0; i < nrows_to_eliminate; i++) { local_rows[i] = rows_to_eliminate[i] - ibeg; } for (i = 0; i < nrows_to_eliminate; i++) { ibeg = Ai[local_rows[i]]; iend = Ai[local_rows[i] + 1]; for (j = ibeg; j < iend; j++) { Adata[j] = 0.0; } } hypre_TFree(local_rows, HYPRE_MEMORY_HOST); return ierr; } HYPRE_Int hypre_CSRMatrixEliminateColsOffd (hypre_CSRMatrix *Aoffd, HYPRE_Int ncols_to_eliminate, HYPRE_Int *cols_to_eliminate) { HYPRE_Int ierr = 0; HYPRE_Int i; HYPRE_Int icol; HYPRE_Int nnz = hypre_CSRMatrixNumNonzeros(Aoffd); HYPRE_Int *Aj = hypre_CSRMatrixJ(Aoffd); HYPRE_Real *Adata = hypre_CSRMatrixData(Aoffd); for (i = 0; i < nnz; i++) { icol = hypre_BinarySearch(cols_to_eliminate, Aj[i], ncols_to_eliminate); if (icol != -1) { Adata[i] = 0.0; } } return ierr; } hypre-2.33.0/src/sstruct_ls/eliminate_rowscols.h000066400000000000000000000042501477326011500220040ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #ifndef hypre_PARCSR_ELIMINATE_ROWSCOLS #define hypre_PARCSR_ELIMINATE_ROWSCOLS #ifdef __cplusplus extern "C" { #endif /* Function: hypre_ParCSRMatrixEliminateRowsCols This function eliminates the global rows and columns of a matrix A corresponding to given lists of sorted (!) local row numbers. The elimination is done as follows: / A_ii | A_ib \ / A_ii | 0 \ (input) A = | -----+----- | ---> | -----+----- | (output) \ A_bi | A_bb / \ 0 | I / */ HYPRE_Int hypre_ParCSRMatrixEliminateRowsCols (hypre_ParCSRMatrix *A, HYPRE_Int nrows_to_eliminate, HYPRE_Int *rows_to_eliminate); /* Function: hypre_CSRMatrixEliminateRowsColsDiag Eliminate the rows and columns of Adiag corresponding to the given sorted (!) list of rows. Put I on the eliminated diagonal. */ HYPRE_Int hypre_CSRMatrixEliminateRowsColsDiag (hypre_ParCSRMatrix *A, HYPRE_Int nrows_to_eliminate, HYPRE_Int *rows_to_eliminate); /* Function: hypre_CSRMatrixEliminateRowsOffd Eliminate the given list of rows of Aoffd. */ HYPRE_Int hypre_CSRMatrixEliminateRowsOffd (hypre_ParCSRMatrix *A, HYPRE_Int nrows_to_eliminate, HYPRE_Int *rows_to_eliminate); /* Function: hypre_CSRMatrixEliminateColsOffd Eliminate the given sorted (!) list of columns of Aoffd. */ HYPRE_Int hypre_CSRMatrixEliminateColsOffd (hypre_CSRMatrix *Aoffd, HYPRE_Int ncols_to_eliminate, HYPRE_Int *cols_to_eliminate); #ifdef __cplusplus } #endif #endif hypre-2.33.0/src/sstruct_ls/fac.c000066400000000000000000000320561477326011500166330ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "_hypre_sstruct_ls.h" #include "fac.h" /*-------------------------------------------------------------------------- * hypre_FACCreate *--------------------------------------------------------------------------*/ void * hypre_FACCreate( MPI_Comm comm ) { hypre_FACData *fac_data; fac_data = hypre_CTAlloc(hypre_FACData, 1, HYPRE_MEMORY_HOST); (fac_data -> comm) = comm; (fac_data -> time_index) = hypre_InitializeTiming("FAC"); /* set defaults */ (fac_data -> tol) = 1.0e-06; (fac_data -> max_cycles) = 200; (fac_data -> zero_guess) = 0; (fac_data -> max_levels) = 0; (fac_data -> relax_type) = 2; /* 1 Jacobi; 2 Gauss-Seidel */ (fac_data -> jacobi_weight) = 0.0; (fac_data -> usr_jacobi_weight) = 0; (fac_data -> num_pre_smooth) = 1; (fac_data -> num_post_smooth) = 1; (fac_data -> csolver_type) = 1; (fac_data -> logging) = 0; return (void *) fac_data; } /*-------------------------------------------------------------------------- * hypre_FACDestroy *--------------------------------------------------------------------------*/ HYPRE_Int hypre_FACDestroy2(void *fac_vdata) { hypre_FACData *fac_data = (hypre_FACData *)fac_vdata; HYPRE_Int level; HYPRE_Int ierr = 0; if (fac_data) { hypre_TFree((fac_data ->plevels), HYPRE_MEMORY_HOST); hypre_TFree((fac_data ->prefinements), HYPRE_MEMORY_HOST); HYPRE_SStructGraphDestroy(hypre_SStructMatrixGraph((fac_data -> A_rap))); HYPRE_SStructMatrixDestroy((fac_data -> A_rap)); for (level = 0; level <= (fac_data -> max_levels); level++) { HYPRE_SStructMatrixDestroy( (fac_data -> A_level[level]) ); HYPRE_SStructVectorDestroy( (fac_data -> x_level[level]) ); HYPRE_SStructVectorDestroy( (fac_data -> b_level[level]) ); HYPRE_SStructVectorDestroy( (fac_data -> r_level[level]) ); HYPRE_SStructVectorDestroy( (fac_data -> e_level[level]) ); hypre_SStructPVectorDestroy( (fac_data -> tx_level[level]) ); HYPRE_SStructGraphDestroy( (fac_data -> graph_level[level]) ); HYPRE_SStructGridDestroy( (fac_data -> grid_level[level]) ); hypre_SStructMatvecDestroy( (fac_data -> matvec_data_level[level]) ); hypre_SStructPMatvecDestroy((fac_data -> pmatvec_data_level[level]) ); hypre_SysPFMGRelaxDestroy( (fac_data -> relax_data_level[level]) ); if (level > 0) { hypre_FacSemiRestrictDestroy2( (fac_data -> restrict_data_level[level]) ); } if (level < (fac_data -> max_levels)) { hypre_FacSemiInterpDestroy2( (fac_data -> interp_data_level[level]) ); } } hypre_SStructMatvecDestroy( (fac_data -> matvec_data) ); hypre_TFree(fac_data -> A_level, HYPRE_MEMORY_HOST); hypre_TFree(fac_data -> x_level, HYPRE_MEMORY_HOST); hypre_TFree(fac_data -> b_level, HYPRE_MEMORY_HOST); hypre_TFree(fac_data -> r_level, HYPRE_MEMORY_HOST); hypre_TFree(fac_data -> e_level, HYPRE_MEMORY_HOST); hypre_TFree(fac_data -> tx_level, HYPRE_MEMORY_HOST); hypre_TFree(fac_data -> relax_data_level, HYPRE_MEMORY_HOST); hypre_TFree(fac_data -> restrict_data_level, HYPRE_MEMORY_HOST); hypre_TFree(fac_data -> matvec_data_level, HYPRE_MEMORY_HOST); hypre_TFree(fac_data -> pmatvec_data_level, HYPRE_MEMORY_HOST); hypre_TFree(fac_data -> interp_data_level, HYPRE_MEMORY_HOST); hypre_TFree(fac_data -> grid_level, HYPRE_MEMORY_HOST); hypre_TFree(fac_data -> graph_level, HYPRE_MEMORY_HOST); HYPRE_SStructVectorDestroy(fac_data -> tx); hypre_TFree(fac_data -> level_to_part, HYPRE_MEMORY_HOST); hypre_TFree(fac_data -> part_to_level, HYPRE_MEMORY_HOST); hypre_TFree(fac_data -> refine_factors, HYPRE_MEMORY_HOST); if ( (fac_data -> csolver_type) == 1) { HYPRE_SStructPCGDestroy(fac_data -> csolver); HYPRE_SStructSysPFMGDestroy(fac_data -> cprecond); } else if ((fac_data -> csolver_type) == 2) { HYPRE_SStructSysPFMGDestroy(fac_data -> csolver); } if ((fac_data -> logging) > 0) { hypre_TFree(fac_data -> norms, HYPRE_MEMORY_HOST); hypre_TFree(fac_data -> rel_norms, HYPRE_MEMORY_HOST); } hypre_FinalizeTiming(fac_data -> time_index); hypre_TFree(fac_data, HYPRE_MEMORY_HOST); } return (ierr); } HYPRE_Int hypre_FACSetTol( void *fac_vdata, HYPRE_Real tol ) { hypre_FACData *fac_data = (hypre_FACData *)fac_vdata; HYPRE_Int ierr = 0; (fac_data -> tol) = tol; return ierr; } /*-------------------------------------------------------------------------- * hypre_FACSetPLevels *--------------------------------------------------------------------------*/ HYPRE_Int hypre_FACSetPLevels( void *fac_vdata, HYPRE_Int nparts, HYPRE_Int *plevels) { hypre_FACData *fac_data = (hypre_FACData *)fac_vdata; HYPRE_Int *fac_plevels; HYPRE_Int ierr = 0; HYPRE_Int i; fac_plevels = hypre_CTAlloc(HYPRE_Int, nparts, HYPRE_MEMORY_HOST); for (i = 0; i < nparts; i++) { fac_plevels[i] = plevels[i]; } (fac_data -> plevels) = fac_plevels; return ierr; } /*-------------------------------------------------------------------------- * hypre_FACSetPRefinements *--------------------------------------------------------------------------*/ HYPRE_Int hypre_FACSetPRefinements( void *fac_vdata, HYPRE_Int nparts, hypre_Index *prefinements ) { hypre_FACData *fac_data = (hypre_FACData *)fac_vdata; hypre_Index *fac_prefinements; HYPRE_Int ierr = 0; HYPRE_Int i; fac_prefinements = hypre_TAlloc(hypre_Index, nparts, HYPRE_MEMORY_HOST); for (i = 0; i < nparts; i++) { hypre_CopyIndex( prefinements[i], fac_prefinements[i] ); } (fac_data -> prefinements) = fac_prefinements; return ierr; } /*-------------------------------------------------------------------------- * hypre_FACSetMaxLevels *--------------------------------------------------------------------------*/ HYPRE_Int hypre_FACSetMaxLevels( void *fac_vdata, HYPRE_Int nparts ) { hypre_FACData *fac_data = (hypre_FACData *)fac_vdata; HYPRE_Int ierr = 0; (fac_data -> max_levels) = nparts - 1; return ierr; } /*-------------------------------------------------------------------------- * hypre_FACSetMaxIter *--------------------------------------------------------------------------*/ HYPRE_Int hypre_FACSetMaxIter( void *fac_vdata, HYPRE_Int max_iter ) { hypre_FACData *fac_data = (hypre_FACData *)fac_vdata; HYPRE_Int ierr = 0; (fac_data -> max_cycles) = max_iter; return ierr; } /*-------------------------------------------------------------------------- * hypre_FACSetRelChange *--------------------------------------------------------------------------*/ HYPRE_Int hypre_FACSetRelChange( void *fac_vdata, HYPRE_Int rel_change ) { hypre_FACData *fac_data = (hypre_FACData *)fac_vdata; HYPRE_Int ierr = 0; (fac_data -> rel_change) = rel_change; return ierr; } /*-------------------------------------------------------------------------- * hypre_FACSetZeroGuess *--------------------------------------------------------------------------*/ HYPRE_Int hypre_FACSetZeroGuess( void *fac_vdata, HYPRE_Int zero_guess ) { hypre_FACData *fac_data = (hypre_FACData *)fac_vdata; HYPRE_Int ierr = 0; (fac_data -> zero_guess) = zero_guess; return ierr; } /*-------------------------------------------------------------------------- * hypre_FACSetRelaxType *--------------------------------------------------------------------------*/ HYPRE_Int hypre_FACSetRelaxType( void *fac_vdata, HYPRE_Int relax_type ) { hypre_FACData *fac_data = (hypre_FACData *)fac_vdata; HYPRE_Int ierr = 0; (fac_data -> relax_type) = relax_type; return ierr; } /*-------------------------------------------------------------------------- * hypre_FACSetJacobiWeight *--------------------------------------------------------------------------*/ HYPRE_Int hypre_FACSetJacobiWeight( void *fac_vdata, HYPRE_Real weight ) { hypre_FACData *fac_data = (hypre_FACData *)fac_vdata; (fac_data -> jacobi_weight) = weight; (fac_data -> usr_jacobi_weight) = 1; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_FACSetNumPreRelax *--------------------------------------------------------------------------*/ HYPRE_Int hypre_FACSetNumPreSmooth( void *fac_vdata, HYPRE_Int num_pre_smooth ) { hypre_FACData *fac_data = (hypre_FACData *)fac_vdata; HYPRE_Int ierr = 0; (fac_data -> num_pre_smooth) = num_pre_smooth; return ierr; } /*-------------------------------------------------------------------------- * hypre_FACSetNumPostRelax *--------------------------------------------------------------------------*/ HYPRE_Int hypre_FACSetNumPostSmooth( void *fac_vdata, HYPRE_Int num_post_smooth ) { hypre_FACData *fac_data = (hypre_FACData *)fac_vdata; HYPRE_Int ierr = 0; (fac_data -> num_post_smooth) = num_post_smooth; return ierr; } /*-------------------------------------------------------------------------- * hypre_FACSetCoarseSolverType *--------------------------------------------------------------------------*/ HYPRE_Int hypre_FACSetCoarseSolverType( void *fac_vdata, HYPRE_Int csolver_type) { hypre_FACData *fac_data = (hypre_FACData *)fac_vdata; HYPRE_Int ierr = 0; (fac_data -> csolver_type) = csolver_type; return ierr; } /*-------------------------------------------------------------------------- * hypre_FACSetLogging *--------------------------------------------------------------------------*/ HYPRE_Int hypre_FACSetLogging( void *fac_vdata, HYPRE_Int logging) { hypre_FACData *fac_data = (hypre_FACData *)fac_vdata; HYPRE_Int ierr = 0; (fac_data -> logging) = logging; return ierr; } /*-------------------------------------------------------------------------- * hypre_SysFACGetNumIterations *--------------------------------------------------------------------------*/ HYPRE_Int hypre_FACGetNumIterations( void *fac_vdata, HYPRE_Int *num_iterations ) { hypre_FACData *fac_data = (hypre_FACData *)fac_vdata; HYPRE_Int ierr = 0; *num_iterations = (fac_data -> num_iterations); return ierr; } /*-------------------------------------------------------------------------- * hypre_FACPrintLogging *--------------------------------------------------------------------------*/ HYPRE_Int hypre_FACPrintLogging( void *fac_vdata, HYPRE_Int myid) { hypre_FACData *fac_data = (hypre_FACData *)fac_vdata; HYPRE_Int ierr = 0; HYPRE_Int i; HYPRE_Int num_iterations = (fac_data -> num_iterations); HYPRE_Int logging = (fac_data -> logging); HYPRE_Real *norms = (fac_data -> norms); HYPRE_Real *rel_norms = (fac_data -> rel_norms); if (myid == 0) { if (logging > 0) { for (i = 0; i < num_iterations; i++) { hypre_printf("Residual norm[%d] = %e ", i, norms[i]); hypre_printf("Relative residual norm[%d] = %e\n", i, rel_norms[i]); } } } return ierr; } /*-------------------------------------------------------------------------- * hypre_FACGetFinalRelativeResidualNorm *--------------------------------------------------------------------------*/ HYPRE_Int hypre_FACGetFinalRelativeResidualNorm( void *fac_vdata, HYPRE_Real *relative_residual_norm ) { hypre_FACData *fac_data = (hypre_FACData *)fac_vdata; HYPRE_Int max_iter = (fac_data -> max_cycles); HYPRE_Int num_iterations = (fac_data -> num_iterations); HYPRE_Int logging = (fac_data -> logging); HYPRE_Real *rel_norms = (fac_data -> rel_norms); HYPRE_Int ierr = 0; if (logging > 0) { if (max_iter == 0) { ierr = 1; } else if (num_iterations == max_iter) { *relative_residual_norm = rel_norms[num_iterations - 1]; } else { *relative_residual_norm = rel_norms[num_iterations]; } } return ierr; } hypre-2.33.0/src/sstruct_ls/fac.h000066400000000000000000000060251477326011500166350ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * Header info for the FAC solver * *****************************************************************************/ /*-------------------------------------------------------------------------- * hypre_FACData: *--------------------------------------------------------------------------*/ #ifndef hypre_FAC_HEADER #define hypre_FAC_HEADER typedef struct { MPI_Comm comm; HYPRE_Int *plevels; hypre_Index *prefinements; HYPRE_Int max_levels; HYPRE_Int *level_to_part; HYPRE_Int *part_to_level; hypre_Index *refine_factors; /* refine_factors[level] */ hypre_SStructGrid **grid_level; hypre_SStructGraph **graph_level; hypre_SStructMatrix *A_rap; hypre_SStructMatrix **A_level; hypre_SStructVector **b_level; hypre_SStructVector **x_level; hypre_SStructVector **r_level; hypre_SStructVector **e_level; hypre_SStructPVector **tx_level; hypre_SStructVector *tx; void **matvec_data_level; void **pmatvec_data_level; void *matvec_data; void **relax_data_level; void **restrict_data_level; void **interp_data_level; HYPRE_Int csolver_type; HYPRE_SStructSolver csolver; HYPRE_SStructSolver cprecond; HYPRE_Real tol; HYPRE_Int max_cycles; HYPRE_Int zero_guess; HYPRE_Int relax_type; HYPRE_Real jacobi_weight; /* weighted jacobi weight */ HYPRE_Int usr_jacobi_weight; /* indicator flag for user weight */ HYPRE_Int num_pre_smooth; HYPRE_Int num_post_smooth; /* log info (always logged) */ HYPRE_Int num_iterations; HYPRE_Int time_index; HYPRE_Int rel_change; HYPRE_Int logging; HYPRE_Real *norms; HYPRE_Real *rel_norms; } hypre_FACData; /*-------------------------------------------------------------------------- * Accessor macros: hypre_FACData *--------------------------------------------------------------------------*/ #define hypre_FACDataMaxLevels(fac_data)\ ((fac_data) -> max_levels) #define hypre_FACDataLevelToPart(fac_data)\ ((fac_data) -> level_to_part) #define hypre_FACDataPartToLevel(fac_data)\ ((fac_data) -> part_to_level) #define hypre_FACDataRefineFactors(fac_data)\ ((fac_data) -> refine_factors) #define hypre_FACDataRefineFactorsLevel(fac_data, level)\ ((fac_data) -> refinements[level]) #endif hypre-2.33.0/src/sstruct_ls/fac_CFInterfaceExtents.c000066400000000000000000000154611477326011500224000ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "_hypre_sstruct_ls.h" #include "fac.h" #define AbsStencilShape(stencil, abs_shape) \ {\ HYPRE_Int ii,jj,kk;\ ii = hypre_IndexX(stencil);\ jj = hypre_IndexY(stencil);\ kk = hypre_IndexZ(stencil);\ abs_shape= hypre_abs(ii) + hypre_abs(jj) + hypre_abs(kk); \ } /*-------------------------------------------------------------------------- * hypre_CFInterfaceExtents: Given a cgrid_box, a fgrid_box, and stencils, * find the extents of the C/F interface (interface nodes in the C box). * Boxes corresponding to stencil shifts are stored in the first stencil_size * boxes, and the union of these are appended to the end of the returned * box_array. *--------------------------------------------------------------------------*/ hypre_BoxArray * hypre_CFInterfaceExtents( hypre_Box *fgrid_box, hypre_Box *cgrid_box, hypre_StructStencil *stencils, hypre_Index rfactors ) { hypre_BoxArray *stencil_box_extents; hypre_BoxArray *union_boxes; hypre_Box *cfine_box; hypre_Box *box; hypre_Index stencil_shape, cstart, zero_index, neg_index; HYPRE_Int stencil_size; HYPRE_Int abs_stencil; HYPRE_Int ndim = hypre_StructStencilNDim(stencils); HYPRE_Int i, j; hypre_ClearIndex(zero_index); hypre_ClearIndex(neg_index); for (i = 0; i < ndim; i++) { neg_index[i] = -1; } hypre_CopyIndex(hypre_BoxIMin(cgrid_box), cstart); stencil_size = hypre_StructStencilSize(stencils); stencil_box_extents = hypre_BoxArrayCreate(stencil_size, ndim); union_boxes = hypre_BoxArrayCreate(0, ndim); for (i = 0; i < stencil_size; i++) { hypre_CopyIndex(hypre_StructStencilElement(stencils, i), stencil_shape); AbsStencilShape(stencil_shape, abs_stencil); if (abs_stencil) /* only do if not the centre stencil */ { cfine_box = hypre_CF_StenBox(fgrid_box, cgrid_box, stencil_shape, rfactors, ndim); if ( hypre_BoxVolume(cfine_box) ) { hypre_AppendBox(cfine_box, union_boxes); hypre_CopyBox(cfine_box, hypre_BoxArrayBox(stencil_box_extents, i)); for (j = 0; j < ndim; j++) { hypre_BoxIMin(cfine_box)[j] -= cstart[j]; hypre_BoxIMax(cfine_box)[j] -= cstart[j]; } hypre_CopyBox(cfine_box, hypre_BoxArrayBox(stencil_box_extents, i)); } else { hypre_BoxSetExtents(hypre_BoxArrayBox(stencil_box_extents, i), zero_index, neg_index); } hypre_BoxDestroy(cfine_box); } else /* centre */ { hypre_BoxSetExtents(hypre_BoxArrayBox(stencil_box_extents, i), zero_index, neg_index); } } /*-------------------------------------------------------------------------- * Union the stencil_box_extents to get the full CF extents and append to * the end of the stencil_box_extents BoxArray. Then shift the unioned boxes * by cstart. *--------------------------------------------------------------------------*/ if (hypre_BoxArraySize(union_boxes) > 1) { hypre_UnionBoxes(union_boxes); } hypre_ForBoxI(i, union_boxes) { hypre_AppendBox(hypre_BoxArrayBox(union_boxes, i), stencil_box_extents); } hypre_BoxArrayDestroy(union_boxes); for (i = stencil_size; i < hypre_BoxArraySize(stencil_box_extents); i++) { box = hypre_BoxArrayBox(stencil_box_extents, i); for (j = 0; j < ndim; j++) { hypre_BoxIMin(box)[j] -= cstart[j]; hypre_BoxIMax(box)[j] -= cstart[j]; } } return stencil_box_extents; } HYPRE_Int hypre_CFInterfaceExtents2( hypre_Box *fgrid_box, hypre_Box *cgrid_box, hypre_StructStencil *stencils, hypre_Index rfactors, hypre_BoxArray *cf_interface ) { hypre_BoxArray *stencil_box_extents; hypre_BoxArray *union_boxes; hypre_Box *cfine_box; hypre_Index stencil_shape, zero_index, neg_index; HYPRE_Int stencil_size; HYPRE_Int abs_stencil; HYPRE_Int ndim = hypre_StructStencilNDim(stencils); HYPRE_Int i; HYPRE_Int ierr = 0; hypre_ClearIndex(zero_index); hypre_ClearIndex(neg_index); for (i = 0; i < ndim; i++) { neg_index[i] = -1; } stencil_size = hypre_StructStencilSize(stencils); stencil_box_extents = hypre_BoxArrayCreate(stencil_size, ndim); union_boxes = hypre_BoxArrayCreate(0, ndim); for (i = 0; i < stencil_size; i++) { hypre_CopyIndex(hypre_StructStencilElement(stencils, i), stencil_shape); AbsStencilShape(stencil_shape, abs_stencil); if (abs_stencil) /* only do if not the centre stencil */ { cfine_box = hypre_CF_StenBox(fgrid_box, cgrid_box, stencil_shape, rfactors, ndim); if ( hypre_BoxVolume(cfine_box) ) { hypre_AppendBox(cfine_box, union_boxes); hypre_CopyBox(cfine_box, hypre_BoxArrayBox(stencil_box_extents, i)); } else { hypre_BoxSetExtents(hypre_BoxArrayBox(stencil_box_extents, i), zero_index, neg_index); } hypre_BoxDestroy(cfine_box); } else /* centre */ { hypre_BoxSetExtents(hypre_BoxArrayBox(stencil_box_extents, i), zero_index, neg_index); } } /*-------------------------------------------------------------------------- * Union the stencil_box_extents to get the full CF extents and append to * the end of the stencil_box_extents BoxArray. *--------------------------------------------------------------------------*/ if (hypre_BoxArraySize(union_boxes) > 1) { hypre_UnionBoxes(union_boxes); } hypre_ForBoxI(i, union_boxes) { hypre_AppendBox(hypre_BoxArrayBox(union_boxes, i), stencil_box_extents); } hypre_AppendBoxArray(stencil_box_extents, cf_interface); hypre_BoxArrayDestroy(union_boxes); hypre_BoxArrayDestroy(stencil_box_extents); return ierr; } hypre-2.33.0/src/sstruct_ls/fac_amr_fcoarsen.c000066400000000000000000005061631477326011500213570ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * OpenMP Problems * * Need to fix the way these variables are set and incremented in loops: * vals * ******************************************************************************/ #include "_hypre_sstruct_ls.h" #include "_hypre_struct_mv.hpp" #include "fac.h" #define MapStencilRank(stencil, rank) \ { \ HYPRE_Int ii,jj,kk; \ ii = hypre_IndexX(stencil); \ jj = hypre_IndexY(stencil); \ kk = hypre_IndexZ(stencil); \ if (ii==-1) \ ii=2; \ if (jj==-1) \ jj=2; \ if (kk==-1) \ kk=2; \ rank = ii + 3*jj + 9*kk; \ } #define InverseMapStencilRank(rank, stencil) \ { \ HYPRE_Int ij,ii,jj,kk; \ ij = (rank%9); \ ii = (ij%3); \ jj = (ij-ii)/3; \ kk = (rank-3*jj-ii)/9; \ if (ii==2) \ ii= -1; \ if (jj==2) \ jj= -1; \ if (kk==2) \ kk= -1; \ hypre_SetIndex3(stencil, ii, jj, kk); \ } #define AbsStencilShape(stencil, abs_shape) \ { \ HYPRE_Int ii,jj,kk; \ ii = hypre_IndexX(stencil); \ jj = hypre_IndexY(stencil); \ kk = hypre_IndexZ(stencil); \ abs_shape= hypre_abs(ii) + hypre_abs(jj) + hypre_abs(kk); \ } /*-------------------------------------------------------------------------- * hypre_AMR_FCoarsen: Coarsen the fbox and f/c connections. Forms the * coarse operator by averaging neighboring connections in the refinement * patch. *--------------------------------------------------------------------------*/ HYPRE_Int hypre_AMR_FCoarsen( hypre_SStructMatrix * A, hypre_SStructMatrix * fac_A, hypre_SStructPMatrix * A_crse, hypre_Index refine_factors, HYPRE_Int level ) { hypre_Box fine_box; hypre_Box intersect_box; MPI_Comm comm = hypre_SStructMatrixComm(A); hypre_SStructGraph *graph = hypre_SStructMatrixGraph(A); HYPRE_Int graph_type = hypre_SStructGraphObjectType(graph); hypre_SStructGrid *grid = hypre_SStructGraphGrid(graph); HYPRE_IJMatrix ij_A = hypre_SStructMatrixIJMatrix(A); HYPRE_Int matrix_type = hypre_SStructMatrixObjectType(A); HYPRE_Int ndim = hypre_SStructMatrixNDim(A); hypre_SStructPMatrix *A_pmatrix = hypre_SStructMatrixPMatrix(fac_A, level); hypre_StructMatrix *smatrix_var; hypre_StructStencil *stencils, *stencils_last; HYPRE_Int stencil_size = 0, stencil_last_size; hypre_Index stencil_shape_i, stencil_last_shape_i; hypre_Index loop_size; hypre_Box loop_box; HYPRE_Real **a_ptrs; hypre_Box *A_dbox; HYPRE_Int part_crse = level - 1; HYPRE_Int part_fine = level; hypre_StructMatrix *crse_smatrix; HYPRE_Real *crse_ptr; HYPRE_Real **crse_ptrs; hypre_Box *crse_dbox; hypre_StructGrid *cgrid; hypre_BoxArray *cgrid_boxes; hypre_Box *cgrid_box; hypre_Index cstart; hypre_Index fstart, fend; hypre_Index stridec, stridef; hypre_StructGrid *fgrid; hypre_BoxArray *fgrid_boxes; hypre_Box *fgrid_box; hypre_BoxArray ***fgrid_crse_extents; hypre_BoxArray ***fbox_interior; hypre_BoxArrayArray ***fbox_bdy; HYPRE_Int ***interior_fboxi; HYPRE_Int ***bdy_fboxi; HYPRE_Int ***cboxi_fboxes; HYPRE_Int **cboxi_fcnt; hypre_BoxArray *fbox_interior_ci, *fbox_bdy_ci_fi; hypre_BoxArrayArray *fbox_bdy_ci; HYPRE_Int *interior_fboxi_ci; HYPRE_Int *bdy_fboxi_ci; HYPRE_Int centre; hypre_BoxArray *data_space; HYPRE_Int ci, fi, arrayi; HYPRE_Int max_stencil_size = 27; HYPRE_Int trueV = 1; HYPRE_Int falseV = 0; HYPRE_Int found, sort; HYPRE_Int stencil_marker; HYPRE_Int *stencil_ranks = NULL, *rank_stencils = NULL; HYPRE_Int *stencil_contrib_cnt = NULL; HYPRE_Int **stencil_contrib_i = NULL; HYPRE_Real **weight_contrib_i = NULL; HYPRE_Real weights[4] = {1.0, 0.25, 0.125, 0.0625}; HYPRE_Real sum; HYPRE_Int abs_stencil_shape; hypre_Box **shift_box = NULL; hypre_Box coarse_cell_box; HYPRE_Int volume_coarse_cell_box; HYPRE_Int *volume_shift_box = NULL; HYPRE_Int max_contribut_size = 0, stencil_i; HYPRE_BigInt startrank, rank; HYPRE_Real *vals = NULL, *vals2 = NULL; HYPRE_Int i, j, k, l, m, n, ll, kk, jj; HYPRE_Int nvars, var1, var2, var2_start; HYPRE_Int iA_shift_z, iA_shift_zy, iA_shift_zyx; hypre_Index lindex; hypre_Index index1, index2; hypre_Index index_temp; HYPRE_Int **box_graph_indices; HYPRE_Int *box_graph_cnts; HYPRE_Int *box_ranks, *box_ranks_cnt, *box_to_ranks_cnt; HYPRE_Int *cdata_space_ranks, *box_starts, *box_ends; HYPRE_Int *box_connections; HYPRE_Int **coarse_contrib_Uv; HYPRE_Int *fine_interface_ranks; HYPRE_Int nUventries = hypre_SStructGraphNUVEntries(graph); HYPRE_Int *iUventries = hypre_SStructGraphIUVEntries(graph); hypre_SStructUVEntry **Uventries = hypre_SStructGraphUVEntries(graph); hypre_SStructUVEntry *Uventry; HYPRE_Int nUentries, cnt1; hypre_Index index, *cindex, *Uv_cindex; HYPRE_Int box_array_size, cbox_array_size; HYPRE_Int nrows; HYPRE_BigInt to_rank; HYPRE_Int *ncols; HYPRE_BigInt *rows, *cols; HYPRE_Int **interface_max_stencil_ranks; HYPRE_Int **interface_max_stencil_cnt; HYPRE_Int **interface_rank_stencils; HYPRE_Int **interface_stencil_ranks; HYPRE_Int *coarse_stencil_cnt; HYPRE_Real *stencil_vals; HYPRE_Int *common_rank_stencils, *common_stencil_ranks; HYPRE_Int *common_stencil_i; hypre_BoxManEntry *boxman_entry; HYPRE_Int *temp1, *temp2; HYPRE_Real *temp3; HYPRE_Real sum_contrib, scaling; HYPRE_Int **OffsetA; HYPRE_Int *parents; HYPRE_Int *parents_cnodes; HYPRE_Int myid; hypre_MPI_Comm_rank(comm, &myid); hypre_BoxInit(&fine_box, ndim); hypre_BoxInit(&intersect_box, ndim); hypre_BoxInit(&loop_box, ndim); hypre_BoxInit(&coarse_cell_box, ndim); hypre_SetIndex3(lindex, 0, 0, 0); /*-------------------------------------------------------------------------- * Task: Coarsen the fbox and f/c connections to form the coarse grid * operator inside the fgrid. *--------------------------------------------------------------------------*/ if (graph_type == HYPRE_SSTRUCT) { startrank = hypre_SStructGridGhstartRank(grid); } else if (graph_type == HYPRE_PARCSR) { startrank = hypre_SStructGridStartRank(grid); } else { hypre_error_w_msg(HYPRE_ERROR_GENERIC, "Unsupported graph_type!"); return hypre_error_flag; } /*-------------------------------------------------------------------------- * Fine grid strides by the refinement factors. *--------------------------------------------------------------------------*/ hypre_SetIndex3(stridec, 1, 1, 1); for (i = 0; i < ndim; i++) { stridef[i] = refine_factors[i]; } for (i = ndim; i < 3; i++) { stridef[i] = 1; } /*-------------------------------------------------------------------------- * Scaling for averaging row sum. *--------------------------------------------------------------------------*/ scaling = 1.0; for (i = 0; i < ndim - 2; i++) { scaling *= refine_factors[0]; } /*-------------------------------------------------------------------------- * Determine the coarsened fine grid- fgrid_crse_extents. * These are between fpart= level and cpart= (level-1). The * fgrid_crse_extents will be indexed by cboxes- the boxarray of coarsened * fboxes FULLY in a given cbox. * * Also, determine the interior and boundary boxes of each fbox. Having * these will allow us to determine the f/c interface nodes without * extensive checking. These are also indexed by the cboxes. * fgrid_interior- for each cbox, we have a collection of child fboxes, * each leading to an interior=> boxarray * fgrid_bdy - for each cbox, we have a collection of child fboxes, * each leading to a boxarray of bdies=> boxarrayarray. * Because we need to know the fbox id for these boxarray/boxarrayarray, * we will need one for each fbox. * * And, determine which cboxes contain a given fbox. That is, given a * fbox, find all cboxes that contain a chunk of it. *--------------------------------------------------------------------------*/ nvars = hypre_SStructPMatrixNVars(A_pmatrix); fgrid_crse_extents = hypre_TAlloc(hypre_BoxArray **, nvars, HYPRE_MEMORY_HOST); fbox_interior = hypre_TAlloc(hypre_BoxArray **, nvars, HYPRE_MEMORY_HOST); fbox_bdy = hypre_TAlloc(hypre_BoxArrayArray **, nvars, HYPRE_MEMORY_HOST); interior_fboxi = hypre_TAlloc(HYPRE_Int **, nvars, HYPRE_MEMORY_HOST); bdy_fboxi = hypre_TAlloc(HYPRE_Int **, nvars, HYPRE_MEMORY_HOST); cboxi_fboxes = hypre_TAlloc(HYPRE_Int **, nvars, HYPRE_MEMORY_HOST); cboxi_fcnt = hypre_TAlloc(HYPRE_Int *, nvars, HYPRE_MEMORY_HOST); for (var1 = 0; var1 < nvars; var1++) { cgrid = hypre_SStructPGridSGrid(hypre_SStructPMatrixPGrid(A_crse), var1); cgrid_boxes = hypre_StructGridBoxes(cgrid); fgrid_crse_extents[var1] = hypre_TAlloc(hypre_BoxArray *, hypre_BoxArraySize(cgrid_boxes), HYPRE_MEMORY_HOST); fbox_interior[var1] = hypre_TAlloc(hypre_BoxArray *, hypre_BoxArraySize(cgrid_boxes), HYPRE_MEMORY_HOST); fbox_bdy[var1] = hypre_TAlloc(hypre_BoxArrayArray *, hypre_BoxArraySize(cgrid_boxes), HYPRE_MEMORY_HOST); interior_fboxi[var1] = hypre_TAlloc(HYPRE_Int *, hypre_BoxArraySize(cgrid_boxes), HYPRE_MEMORY_HOST); bdy_fboxi[var1] = hypre_TAlloc(HYPRE_Int *, hypre_BoxArraySize(cgrid_boxes), HYPRE_MEMORY_HOST); fgrid = hypre_SStructPGridSGrid(hypre_SStructPMatrixPGrid(A_pmatrix), var1); fgrid_boxes = hypre_StructGridBoxes(fgrid); cboxi_fboxes[var1] = hypre_CTAlloc(HYPRE_Int *, hypre_BoxArraySize(fgrid_boxes), HYPRE_MEMORY_HOST); cboxi_fcnt[var1] = hypre_CTAlloc(HYPRE_Int, hypre_BoxArraySize(fgrid_boxes), HYPRE_MEMORY_HOST); /*----------------------------------------------------------------------- * Determine the fine grid boxes that are underlying a coarse grid box. * Coarsen the indices to determine the looping extents of these * boxes. Also, find the looping extents for the extended coarsened * boxes, and the interior and boundary extents of a fine_grid box. * The fine_grid boxes must be adjusted so that only the coarse nodes * inside these boxes are included. Only the lower bound needs to be * adjusted. *-----------------------------------------------------------------------*/ hypre_ForBoxI(ci, cgrid_boxes) { cgrid_box = hypre_BoxArrayBox(cgrid_boxes, ci); hypre_CopyIndex(hypre_BoxIMin(cgrid_box), cstart); cnt1 = 0; temp1 = hypre_CTAlloc(HYPRE_Int, hypre_BoxArraySize(fgrid_boxes), HYPRE_MEMORY_HOST); hypre_ClearIndex(index_temp); hypre_ForBoxI(fi, fgrid_boxes) { fgrid_box = hypre_BoxArrayBox(fgrid_boxes, fi); hypre_CopyIndex(hypre_BoxIMin(fgrid_box), fstart); for (i = 0; i < ndim; i++) { j = fstart[i] % refine_factors[i]; if (j) { fstart[i] += refine_factors[i] - j; } } hypre_StructMapFineToCoarse(fstart, index_temp, refine_factors, hypre_BoxIMin(&fine_box)); hypre_StructMapFineToCoarse(hypre_BoxIMax(fgrid_box), index_temp, refine_factors, hypre_BoxIMax(&fine_box)); hypre_IntersectBoxes(&fine_box, cgrid_box, &intersect_box); if (hypre_BoxVolume(&intersect_box) > 0) { temp1[cnt1++] = fi; } } fgrid_crse_extents[var1][ci] = hypre_BoxArrayCreate(cnt1, ndim); fbox_interior[var1][ci] = hypre_BoxArrayCreate(cnt1, ndim); fbox_bdy[var1][ci] = hypre_BoxArrayArrayCreate(cnt1, ndim); interior_fboxi[var1][ci] = hypre_CTAlloc(HYPRE_Int, cnt1, HYPRE_MEMORY_HOST); bdy_fboxi[var1][ci] = hypre_CTAlloc(HYPRE_Int, cnt1, HYPRE_MEMORY_HOST); for (fi = 0; fi < cnt1; fi++) { fgrid_box = hypre_BoxArrayBox(fgrid_boxes, temp1[fi]); hypre_CopyIndex(hypre_BoxIMin(fgrid_box), fstart); hypre_CopyIndex(hypre_BoxIMax(fgrid_box), fend); /*-------------------------------------------------------------------- * record which sides will be adjusted- fstart adjustments will * decrease the box size, whereas fend adjustments will increase the * box size. Since we fstart decreases the box size, we cannot * have an f/c interface at an adjusted fstart end. fend may * correspond to an f/c interface whether it has been adjusted or not. *--------------------------------------------------------------------*/ hypre_SetIndex3(index1, 1, 1, 1); for (i = 0; i < ndim; i++) { j = fstart[i] % refine_factors[i]; if (j) { fstart[i] += refine_factors[i] - j; index1[i] = 0; } j = fend[i] % refine_factors[i]; if (refine_factors[i] - 1 - j) { fend[i] += (refine_factors[i] - 1) - j; } } hypre_StructMapFineToCoarse(fstart, index_temp, refine_factors, hypre_BoxIMin(&fine_box)); hypre_StructMapFineToCoarse(hypre_BoxIMax(fgrid_box), index_temp, refine_factors, hypre_BoxIMax(&fine_box)); hypre_IntersectBoxes(&fine_box, cgrid_box, &intersect_box); hypre_CopyBox(&intersect_box, hypre_BoxArrayBox(fgrid_crse_extents[var1][ci], fi)); /*-------------------------------------------------------------------- * adjust the fine intersect_box so that we get the interior and * boundaries separately. *--------------------------------------------------------------------*/ hypre_StructMapCoarseToFine(hypre_BoxIMin(&intersect_box), index_temp, refine_factors, hypre_BoxIMin(&fine_box)); /* the following index2 shift for ndim<3 is no problem since refine_factors[j]= 1 for j>=ndim. */ hypre_SetIndex3(index2, refine_factors[0] - 1, refine_factors[1] - 1, refine_factors[2] - 1); hypre_StructMapCoarseToFine(hypre_BoxIMax(&intersect_box), index2, refine_factors, hypre_BoxIMax(&fine_box)); hypre_SetIndex3(index2, 1, 1, 1); hypre_CopyBox(&fine_box, &loop_box); for (i = 0; i < ndim; i++) { hypre_BoxIMin(&loop_box)[i] += refine_factors[i] * index1[i]; hypre_BoxIMax(&loop_box)[i] -= refine_factors[i] * index2[i]; } hypre_CopyBox(&loop_box, hypre_BoxArrayBox(fbox_interior[var1][ci], fi)); interior_fboxi[var1][ci][fi] = temp1[fi]; hypre_SubtractBoxes(&fine_box, &loop_box, hypre_BoxArrayArrayBoxArray(fbox_bdy[var1][ci], fi)); bdy_fboxi[var1][ci][fi] = temp1[fi]; } hypre_TFree(temp1, HYPRE_MEMORY_HOST); } /* hypre_ForBoxI(ci, cgrid_boxes) */ /*-------------------------------------------------------------------- * Determine the cboxes that contain a chunk of a given fbox. *--------------------------------------------------------------------*/ hypre_ForBoxI(fi, fgrid_boxes) { fgrid_box = hypre_BoxArrayBox(fgrid_boxes, fi); hypre_CopyIndex(hypre_BoxIMin(fgrid_box), fstart); for (i = 0; i < ndim; i++) { j = fstart[i] % refine_factors[i]; if (j) { fstart[i] += refine_factors[i] - j; } } hypre_StructMapFineToCoarse(fstart, index_temp, refine_factors, hypre_BoxIMin(&fine_box)); hypre_StructMapFineToCoarse(hypre_BoxIMax(fgrid_box), index_temp, refine_factors, hypre_BoxIMax(&fine_box)); temp1 = hypre_CTAlloc(HYPRE_Int, hypre_BoxArraySize(cgrid_boxes), HYPRE_MEMORY_HOST); hypre_ForBoxI(i, cgrid_boxes) { cgrid_box = hypre_BoxArrayBox(cgrid_boxes, i); hypre_IntersectBoxes(&fine_box, cgrid_box, &intersect_box); if (hypre_BoxVolume(&intersect_box) > 0) { temp1[cboxi_fcnt[var1][fi]] = i; cboxi_fcnt[var1][fi]++; } } cboxi_fboxes[var1][fi] = hypre_TAlloc(HYPRE_Int, cboxi_fcnt[var1][fi], HYPRE_MEMORY_HOST); for (i = 0; i < cboxi_fcnt[var1][fi]; i++) { cboxi_fboxes[var1][fi][i] = temp1[i]; } hypre_TFree(temp1, HYPRE_MEMORY_HOST); } } /* for (var1= 0; var1< nvars; var1++) */ /*-------------------------------------------------------------------------- * STEP 1: * COMPUTE THE COARSE LEVEL OPERATOR INSIDE OF A REFINED BOX. * * We assume that the coarse and fine grid variables are of the same type. * * Coarse stencils in the refinement patches are obtained by averaging the * fine grid coefficients. Since we are assuming cell-centred discretization, * we apply a weighted averaging of ONLY the fine grid coefficients along * interfaces of adjacent agglomerated coarse cells. * * Since the stencil pattern is assumed arbitrary, we must determine the * stencil pattern of each var1-var2 struct_matrix to get the correct * contributing stencil coefficients, averaging weights, etc. *--------------------------------------------------------------------------*/ /*-------------------------------------------------------------------------- * Agglomerated coarse cell info. These are needed in defining the looping * extents for averaging- i.e., we loop over extents determined by the * size of the agglomerated coarse cell. * Note that the agglomerated coarse cell is constructed correctly for * any dimensions (1, 2, or 3). *--------------------------------------------------------------------------*/ hypre_ClearIndex(index_temp); hypre_CopyIndex(index_temp, hypre_BoxIMin(&coarse_cell_box)); hypre_SetIndex3(index_temp, refine_factors[0] - 1, refine_factors[1] - 1, refine_factors[2] - 1 ); hypre_CopyIndex(index_temp, hypre_BoxIMax(&coarse_cell_box)); volume_coarse_cell_box = hypre_BoxVolume(&coarse_cell_box); /*-------------------------------------------------------------------------- * Offsets in y & z directions for refinement patches. These will be used * for pointing to correct coarse stencil location. *--------------------------------------------------------------------------*/ OffsetA = hypre_CTAlloc(HYPRE_Int *, 2, HYPRE_MEMORY_HOST); for (i = 0; i < 2; i++) { OffsetA[i] = hypre_CTAlloc(HYPRE_Int, refine_factors[i + 1], HYPRE_MEMORY_HOST); } /*-------------------------------------------------------------------------- * Stencil contribution cnts, weights, etc are computed only if we have * a new stencil pattern. If the pattern is the same, the previously * computed stencil contribution cnts, weights, etc can be used. * * Mark the stencil_marker so that the first time the stencil is non-null, * the stencil contribution cnts, weights, etc are computed. *--------------------------------------------------------------------------*/ stencil_marker = trueV; for (var1 = 0; var1 < nvars; var1++) { cgrid = hypre_SStructPGridSGrid(hypre_SStructPMatrixPGrid(A_crse), var1); cgrid_boxes = hypre_StructGridBoxes(cgrid); fgrid = hypre_SStructPGridSGrid(hypre_SStructPMatrixPGrid(A_pmatrix), var1); fgrid_boxes = hypre_StructGridBoxes(fgrid); for (var2 = 0; var2 < nvars; var2++) { stencils = hypre_SStructPMatrixSStencil(A_crse, var1, var2); if (stencils != NULL) { stencil_size = hypre_StructStencilSize(stencils); /*----------------------------------------------------------------- * When stencil_marker== true, form the stencil contributions cnts, * weights, etc. This occurs for the first non-null stencil or * when the stencil shape of the current non-null stencil has a * different stencil shape from that of the latest non-null stencil. * * But when stencil_marker== false, we must check to see if we * need new stencil contributions cnts, weights, etc. Thus, find * the latest non-null stencil for comparison. *-----------------------------------------------------------------*/ if (stencil_marker == falseV) { /* search for the first previous non-null stencil */ found = falseV; var2_start = var2 - 1; for (j = var1; j >= 0; j--) { for (i = var2_start; i >= 0; i--) { stencils_last = hypre_SStructPMatrixSStencil(A_crse, j, i); if (stencils_last != NULL) { found = trueV; break; } } if (found) { break; } else { var2_start = nvars - 1; } } /*-------------------------------------------------------------- * Compare the stencil shape. *--------------------------------------------------------------*/ stencil_last_size = hypre_StructStencilSize(stencils_last); if (stencil_last_size != stencil_size) { stencil_marker = trueV; break; } else { found = falseV; for (i = 0; i < stencil_size; i++) { hypre_CopyIndex(hypre_StructStencilElement(stencils, i), stencil_shape_i); hypre_CopyIndex(hypre_StructStencilElement(stencils_last, i), stencil_last_shape_i); hypre_SetIndex3(index_temp, stencil_shape_i[0] - stencil_last_shape_i[0], stencil_shape_i[1] - stencil_last_shape_i[1], stencil_shape_i[2] - stencil_last_shape_i[2]); AbsStencilShape(index_temp, abs_stencil_shape); if (abs_stencil_shape) { found = trueV; stencil_marker = trueV; hypre_TFree(stencil_contrib_cnt, HYPRE_MEMORY_HOST); hypre_TFree(stencil_ranks, HYPRE_MEMORY_HOST); for (i = 0; i < stencil_size; i++) { hypre_BoxDestroy(shift_box[i]); } hypre_TFree(shift_box, HYPRE_MEMORY_HOST); hypre_TFree(volume_shift_box, HYPRE_MEMORY_HOST); hypre_TFree(vals, HYPRE_MEMORY_HOST); for (j = 1; j < max_stencil_size; j++) { stencil_i = rank_stencils[j]; if (stencil_i != -1) { hypre_TFree(stencil_contrib_i[stencil_i], HYPRE_MEMORY_HOST); hypre_TFree(weight_contrib_i[stencil_i], HYPRE_MEMORY_HOST); } } hypre_TFree(stencil_contrib_i, HYPRE_MEMORY_HOST); hypre_TFree(weight_contrib_i, HYPRE_MEMORY_HOST); hypre_TFree(rank_stencils, HYPRE_MEMORY_HOST); } if (found) { break; } } /* for (i= 0; i< stencil_size; i++) */ } /* else */ } /* if (stencil_marker == false) */ /*----------------------------------------------------------------- * If stencil_marker==true, form the contribution structures. * Since the type of averaging is determined by the stencil shapes, * we need a ranking of the stencil shape to allow for easy * determination. * * top: 14 12 13 centre: 5 3 4 bottom 23 21 22 * 11 9 10 2 0 1 20 18 19 * 17 15 16 8 6 7 26 24 25 * * for stencil of max. size 27. * * stencil_contrib_cnt[i]= no. of fine stencils averaged to * form stencil entry i. * stencil_contrib_i[i] = rank of fine stencils contributing * to form stencil entry i. * weight_contrib_i[i] = array of weights for weighting * the contributions to stencil entry i. * stencil_ranks[i] = rank of stencil entry i. * rank_stencils[i] = stencil entry of rank i. *-----------------------------------------------------------------*/ if (stencil_marker == trueV) { /* mark stencil_marker for the next stencil */ stencil_marker = falseV; stencil_contrib_cnt = hypre_CTAlloc(HYPRE_Int, stencil_size, HYPRE_MEMORY_HOST); stencil_contrib_i = hypre_TAlloc(HYPRE_Int *, stencil_size, HYPRE_MEMORY_HOST); weight_contrib_i = hypre_TAlloc(HYPRE_Real *, stencil_size, HYPRE_MEMORY_HOST); stencil_ranks = hypre_TAlloc(HYPRE_Int, stencil_size, HYPRE_MEMORY_HOST); rank_stencils = hypre_TAlloc(HYPRE_Int, max_stencil_size, HYPRE_MEMORY_HOST); shift_box = hypre_TAlloc(hypre_Box *, stencil_size, HYPRE_MEMORY_HOST); volume_shift_box = hypre_TAlloc(HYPRE_Int, stencil_size, HYPRE_MEMORY_HOST); for (i = 0; i < max_stencil_size; i++) { rank_stencils[i] = -1; if (i < stencil_size) { stencil_ranks[i] = -1; } } /*----------------------------------------------------------------- * Get mappings between stencil entries and ranks and vice versa; * fine grid looping extents for averaging of the fine coefficients; * and the number of fine grid values to be averaged. * Note that the shift_boxes are constructed correctly for any * dimensions. For j>=ndim, * hypre_BoxIMin(shift_box[i])[j]=hypre_BoxIMax(shift_box[i])[j]= 0. *-----------------------------------------------------------------*/ for (i = 0; i < stencil_size; i++) { shift_box[i] = hypre_BoxCreate(ndim); hypre_CopyIndex(hypre_StructStencilElement(stencils, i), stencil_shape_i); MapStencilRank(stencil_shape_i, j); stencil_ranks[i] = j; rank_stencils[stencil_ranks[i]] = i; hypre_SetIndex3(hypre_BoxIMin(shift_box[i]), (refine_factors[0] - 1)*stencil_shape_i[0], (refine_factors[1] - 1)*stencil_shape_i[1], (refine_factors[2] - 1)*stencil_shape_i[2]); hypre_AddIndexes(hypre_BoxIMin(shift_box[i]), hypre_BoxIMax(&coarse_cell_box), 3, hypre_BoxIMax(shift_box[i])); hypre_IntersectBoxes(&coarse_cell_box, shift_box[i], shift_box[i]); volume_shift_box[i] = hypre_BoxVolume(shift_box[i]); } /*----------------------------------------------------------------- * Derive the contribution info. * The above rank table is used to determine the direction indices. * Weight construction procedure valid for any dimensions. *-----------------------------------------------------------------*/ /* east */ stencil_i = rank_stencils[1]; if (stencil_i != -1) { stencil_contrib_cnt[stencil_i]++; for (i = 4; i <= 7; i += 3) { if (rank_stencils[i] != -1) /* ne or se */ { stencil_contrib_cnt[stencil_i]++; } } if (ndim > 2) { for (j = 1; j <= 2; j++) { for (i = 1; i <= 7; i += 3) { if (rank_stencils[j * 9 + i] != -1) /* bottom or top planes */ { stencil_contrib_cnt[stencil_i]++; } } } } max_contribut_size = stencil_contrib_cnt[stencil_i]; } /* fill up the east contribution stencil indices */ if (stencil_i != -1) { stencil_contrib_i[stencil_i] = hypre_TAlloc(HYPRE_Int, stencil_contrib_cnt[stencil_i], HYPRE_MEMORY_HOST); weight_contrib_i[stencil_i] = hypre_TAlloc(HYPRE_Real, stencil_contrib_cnt[stencil_i], HYPRE_MEMORY_HOST); sum = 0.0; k = 0; stencil_contrib_i[stencil_i][k] = stencil_i; AbsStencilShape( hypre_StructStencilElement(stencils, stencil_i), abs_stencil_shape ); weight_contrib_i[stencil_i][k++] = weights[abs_stencil_shape]; sum += weights[abs_stencil_shape]; for (i = 4; i <= 7; i += 3) { if (rank_stencils[i] != -1) { stencil_contrib_i[stencil_i][k] = rank_stencils[i]; AbsStencilShape(hypre_StructStencilElement(stencils, rank_stencils[i]), abs_stencil_shape ); weight_contrib_i[stencil_i][k++] = weights[abs_stencil_shape]; sum += weights[abs_stencil_shape]; } } if (ndim > 2) { for (j = 1; j <= 2; j++) { for (i = 1; i <= 7; i += 3) { if (rank_stencils[j * 9 + i] != -1) { stencil_contrib_i[stencil_i][k] = rank_stencils[j * 9 + i]; AbsStencilShape( hypre_StructStencilElement(stencils, rank_stencils[j * 9 + i]), abs_stencil_shape ); weight_contrib_i[stencil_i][k++] = weights[abs_stencil_shape]; sum += weights[abs_stencil_shape]; } } } } for (i = 0; i < k ; i++) { weight_contrib_i[stencil_i][i] /= sum; } } /* west */ stencil_i = rank_stencils[2]; if (stencil_i != -1) { stencil_contrib_cnt[stencil_i]++; for (i = 5; i <= 8; i += 3) { if (rank_stencils[i] != -1) /* nw or sw */ { stencil_contrib_cnt[stencil_i]++; } } if (ndim > 2) { for (j = 1; j <= 2; j++) { for (i = 2; i <= 8; i += 3) { if (rank_stencils[j * 9 + i] != -1) /* bottom or top planes */ { stencil_contrib_cnt[stencil_i]++; } } } } max_contribut_size = hypre_max( max_contribut_size, stencil_contrib_cnt[stencil_i] ); } if (stencil_i != -1) { stencil_contrib_i[stencil_i] = hypre_TAlloc(HYPRE_Int, stencil_contrib_cnt[stencil_i], HYPRE_MEMORY_HOST); weight_contrib_i[stencil_i] = hypre_TAlloc(HYPRE_Real, stencil_contrib_cnt[stencil_i], HYPRE_MEMORY_HOST); sum = 0.0; k = 0; stencil_contrib_i[stencil_i][k] = stencil_i; AbsStencilShape( hypre_StructStencilElement(stencils, stencil_i), abs_stencil_shape ); weight_contrib_i[stencil_i][k++] = weights[abs_stencil_shape]; sum += weights[abs_stencil_shape]; for (i = 5; i <= 8; i += 3) { if (rank_stencils[i] != -1) { stencil_contrib_i[stencil_i][k] = rank_stencils[i]; AbsStencilShape(hypre_StructStencilElement(stencils, rank_stencils[i]), abs_stencil_shape ); weight_contrib_i[stencil_i][k++] = weights[abs_stencil_shape]; sum += weights[abs_stencil_shape]; } } if (ndim > 2) { for (j = 1; j <= 2; j++) { for (i = 2; i <= 8; i += 3) { if (rank_stencils[j * 9 + i] != -1) { stencil_contrib_i[stencil_i][k] = rank_stencils[j * 9 + i]; AbsStencilShape( hypre_StructStencilElement(stencils, rank_stencils[j * 9 + i]), abs_stencil_shape ); weight_contrib_i[stencil_i][k++] = weights[abs_stencil_shape]; sum += weights[abs_stencil_shape]; } } } } for (i = 0; i < k ; i++) { weight_contrib_i[stencil_i][i] /= sum; } } /* north */ stencil_i = rank_stencils[3]; if (stencil_i != -1) { stencil_contrib_cnt[stencil_i]++; for (i = 4; i <= 5; i++) { if (rank_stencils[i] != -1) /* ne or nw */ { stencil_contrib_cnt[stencil_i]++; } } if (ndim > 2) { for (j = 1; j <= 2; j++) { for (i = 3; i <= 5; i++) { if (rank_stencils[j * 9 + i] != -1) /* bottom or top planes */ { stencil_contrib_cnt[stencil_i]++; } } } } max_contribut_size = hypre_max( max_contribut_size, stencil_contrib_cnt[stencil_i] ); } if (stencil_i != -1) { stencil_contrib_i[stencil_i] = hypre_TAlloc(HYPRE_Int, stencil_contrib_cnt[stencil_i], HYPRE_MEMORY_HOST); weight_contrib_i[stencil_i] = hypre_TAlloc(HYPRE_Real, stencil_contrib_cnt[stencil_i], HYPRE_MEMORY_HOST); sum = 0.0; k = 0; stencil_contrib_i[stencil_i][k] = stencil_i; AbsStencilShape( hypre_StructStencilElement(stencils, stencil_i), abs_stencil_shape ); weight_contrib_i[stencil_i][k++] = weights[abs_stencil_shape]; sum += weights[abs_stencil_shape]; for (i = 4; i <= 5; i++) { if (rank_stencils[i] != -1) { stencil_contrib_i[stencil_i][k] = rank_stencils[i]; AbsStencilShape(hypre_StructStencilElement(stencils, rank_stencils[i]), abs_stencil_shape ); weight_contrib_i[stencil_i][k++] = weights[abs_stencil_shape]; sum += weights[abs_stencil_shape]; } } if (ndim > 2) { for (j = 1; j <= 2; j++) { for (i = 3; i <= 5; i++) { if (rank_stencils[j * 9 + i] != -1) { stencil_contrib_i[stencil_i][k] = rank_stencils[j * 9 + i]; AbsStencilShape( hypre_StructStencilElement(stencils, rank_stencils[j * 9 + i]), abs_stencil_shape ); weight_contrib_i[stencil_i][k++] = weights[abs_stencil_shape]; sum += weights[abs_stencil_shape]; } } } } for (i = 0; i < k ; i++) { weight_contrib_i[stencil_i][i] /= sum; } } /* south */ stencil_i = rank_stencils[6]; if (stencil_i != -1) { stencil_contrib_cnt[stencil_i]++; for (i = 7; i <= 8; i++) { if (rank_stencils[i] != -1) /* ne or nw */ { stencil_contrib_cnt[stencil_i]++; } } if (ndim > 2) { for (j = 1; j <= 2; j++) { for (i = 6; i <= 8; i++) { if (rank_stencils[j * 9 + i] != -1) /* bottom or top planes */ { stencil_contrib_cnt[stencil_i]++; } } } } max_contribut_size = hypre_max( max_contribut_size, stencil_contrib_cnt[stencil_i] ); } if (stencil_i != -1) { stencil_contrib_i[stencil_i] = hypre_TAlloc(HYPRE_Int, stencil_contrib_cnt[stencil_i], HYPRE_MEMORY_HOST); weight_contrib_i[stencil_i] = hypre_TAlloc(HYPRE_Real, stencil_contrib_cnt[stencil_i], HYPRE_MEMORY_HOST); sum = 0.0; k = 0; stencil_contrib_i[stencil_i][k] = stencil_i; AbsStencilShape( hypre_StructStencilElement(stencils, stencil_i), abs_stencil_shape ); weight_contrib_i[stencil_i][k++] = weights[abs_stencil_shape]; sum += weights[abs_stencil_shape]; for (i = 7; i <= 8; i++) { if (rank_stencils[i] != -1) { stencil_contrib_i[stencil_i][k] = rank_stencils[i]; AbsStencilShape(hypre_StructStencilElement(stencils, rank_stencils[i]), abs_stencil_shape ); weight_contrib_i[stencil_i][k++] = weights[abs_stencil_shape]; sum += weights[abs_stencil_shape]; } } if (ndim > 2) { for (j = 1; j <= 2; j++) { for (i = 6; i <= 8; i++) { if (rank_stencils[j * 9 + i] != -1) { stencil_contrib_i[stencil_i][k] = rank_stencils[j * 9 + i]; AbsStencilShape( hypre_StructStencilElement(stencils, rank_stencils[j * 9 + i]), abs_stencil_shape ); weight_contrib_i[stencil_i][k++] = weights[abs_stencil_shape]; sum += weights[abs_stencil_shape]; } } } } for (i = 0; i < k ; i++) { weight_contrib_i[stencil_i][i] /= sum; } } /*----------------------------------------------------------------- * If only 2-d, extract the corner indices. *-----------------------------------------------------------------*/ if (ndim == 2) { /* corners: ne & nw */ for (i = 4; i <= 5; i++) { stencil_i = rank_stencils[i]; if (stencil_i != -1) { stencil_contrib_cnt[stencil_i]++; stencil_contrib_i[stencil_i] = hypre_TAlloc(HYPRE_Int, 1, HYPRE_MEMORY_HOST); weight_contrib_i[stencil_i] = hypre_TAlloc(HYPRE_Real, 1, HYPRE_MEMORY_HOST); stencil_contrib_i[stencil_i][0] = stencil_i; weight_contrib_i[stencil_i][0] = weights[0]; } } /* corners: se & sw */ for (i = 7; i <= 8; i++) { stencil_i = rank_stencils[i]; if (stencil_i != -1) { stencil_contrib_cnt[stencil_i]++; stencil_contrib_i[stencil_i] = hypre_TAlloc(HYPRE_Int, 1, HYPRE_MEMORY_HOST); weight_contrib_i[stencil_i] = hypre_TAlloc(HYPRE_Real, 1, HYPRE_MEMORY_HOST); stencil_contrib_i[stencil_i][0] = stencil_i; weight_contrib_i[stencil_i][0] = weights[0]; } } } /*----------------------------------------------------------------- * Additional directions for 3-dim case *-----------------------------------------------------------------*/ if (ndim > 2) { /* sides: top */ stencil_i = rank_stencils[9]; if (stencil_i != -1) { stencil_contrib_cnt[stencil_i]++; for (i = 1; i <= 8; i++) { if (rank_stencils[9 + i] != -1) { stencil_contrib_cnt[stencil_i]++; } } max_contribut_size = hypre_max( max_contribut_size, stencil_contrib_cnt[stencil_i] ); } if (stencil_i != -1) { stencil_contrib_i[stencil_i] = hypre_TAlloc(HYPRE_Int, stencil_contrib_cnt[stencil_i], HYPRE_MEMORY_HOST); weight_contrib_i[stencil_i] = hypre_TAlloc(HYPRE_Real, stencil_contrib_cnt[stencil_i], HYPRE_MEMORY_HOST); sum = 0.0; k = 0; stencil_contrib_i[stencil_i][k] = stencil_i; AbsStencilShape( hypre_StructStencilElement(stencils, stencil_i), abs_stencil_shape ); weight_contrib_i[stencil_i][k++] = weights[abs_stencil_shape]; sum += weights[abs_stencil_shape]; for (i = 1; i <= 8; i++) { if (rank_stencils[9 + i] != -1) { stencil_contrib_i[stencil_i][k] = rank_stencils[9 + i]; AbsStencilShape(hypre_StructStencilElement(stencils, rank_stencils[9 + i]), abs_stencil_shape ); weight_contrib_i[stencil_i][k++] = weights[abs_stencil_shape]; sum += weights[abs_stencil_shape]; } } for (i = 0; i < k ; i++) { weight_contrib_i[stencil_i][i] /= sum; } } /* sides: bottom */ stencil_i = rank_stencils[18]; if (stencil_i != -1) { stencil_contrib_cnt[stencil_i]++; for (i = 1; i <= 8; i++) { if (rank_stencils[18 + i] != -1) { stencil_contrib_cnt[stencil_i]++; } } max_contribut_size = hypre_max( max_contribut_size, stencil_contrib_cnt[stencil_i] ); } if (stencil_i != -1) { stencil_contrib_i[stencil_i] = hypre_TAlloc(HYPRE_Int, stencil_contrib_cnt[stencil_i], HYPRE_MEMORY_HOST); weight_contrib_i[stencil_i] = hypre_TAlloc(HYPRE_Real, stencil_contrib_cnt[stencil_i], HYPRE_MEMORY_HOST); sum = 0.0; k = 0; stencil_contrib_i[stencil_i][k] = stencil_i; AbsStencilShape( hypre_StructStencilElement(stencils, stencil_i), abs_stencil_shape ); weight_contrib_i[stencil_i][k++] = weights[abs_stencil_shape]; sum += weights[abs_stencil_shape]; for (i = 1; i <= 8; i++) { if (rank_stencils[18 + i] != -1) { stencil_contrib_i[stencil_i][k] = rank_stencils[18 + i]; AbsStencilShape(hypre_StructStencilElement(stencils, rank_stencils[18 + i]), abs_stencil_shape ); weight_contrib_i[stencil_i][k++] = weights[abs_stencil_shape]; sum += weights[abs_stencil_shape]; } } for (i = 0; i < k ; i++) { weight_contrib_i[stencil_i][i] /= sum; } } /* edges: cne */ stencil_i = rank_stencils[4]; if (stencil_i != -1) { stencil_contrib_cnt[stencil_i]++; for (j = 1; j <= 2; j++) { if (rank_stencils[j * 9 + 4] != -1) /* bottom or top planes */ { stencil_contrib_cnt[stencil_i]++; } } max_contribut_size = hypre_max( max_contribut_size, stencil_contrib_cnt[stencil_i] ); } if (stencil_i != -1) { stencil_contrib_i[stencil_i] = hypre_TAlloc(HYPRE_Int, stencil_contrib_cnt[stencil_i], HYPRE_MEMORY_HOST); weight_contrib_i[stencil_i] = hypre_TAlloc(HYPRE_Real, stencil_contrib_cnt[stencil_i], HYPRE_MEMORY_HOST); sum = 0.0; k = 0; stencil_contrib_i[stencil_i][k] = stencil_i; AbsStencilShape( hypre_StructStencilElement(stencils, stencil_i), abs_stencil_shape ); weight_contrib_i[stencil_i][k++] = weights[abs_stencil_shape]; sum += weights[abs_stencil_shape]; for (j = 1; j <= 2; j++) { if (rank_stencils[j * 9 + 4] != -1) { stencil_contrib_i[stencil_i][k] = rank_stencils[j * 9 + 4]; AbsStencilShape(hypre_StructStencilElement(stencils, rank_stencils[j * 9 + 4]), abs_stencil_shape ); weight_contrib_i[stencil_i][k++] = weights[abs_stencil_shape]; sum += weights[abs_stencil_shape]; } } for (i = 0; i < k ; i++) { weight_contrib_i[stencil_i][i] /= sum; } } /* edges: cse */ stencil_i = rank_stencils[7]; if (stencil_i != -1) { stencil_contrib_cnt[stencil_i]++; for (j = 1; j <= 2; j++) { if (rank_stencils[j * 9 + 7] != -1) /* bottom or top planes */ { stencil_contrib_cnt[stencil_i]++; } } max_contribut_size = hypre_max( max_contribut_size, stencil_contrib_cnt[stencil_i] ); } if (stencil_i != -1) { stencil_contrib_i[stencil_i] = hypre_TAlloc(HYPRE_Int, stencil_contrib_cnt[stencil_i], HYPRE_MEMORY_HOST); weight_contrib_i[stencil_i] = hypre_TAlloc(HYPRE_Real, stencil_contrib_cnt[stencil_i], HYPRE_MEMORY_HOST); sum = 0.0; k = 0; stencil_contrib_i[stencil_i][k] = stencil_i; AbsStencilShape( hypre_StructStencilElement(stencils, stencil_i), abs_stencil_shape ); weight_contrib_i[stencil_i][k++] = weights[abs_stencil_shape]; sum += weights[abs_stencil_shape]; for (j = 1; j <= 2; j++) { if (rank_stencils[j * 9 + 7] != -1) { stencil_contrib_i[stencil_i][k] = rank_stencils[j * 9 + 7]; AbsStencilShape(hypre_StructStencilElement(stencils, rank_stencils[j * 9 + 7]), abs_stencil_shape ); weight_contrib_i[stencil_i][k++] = weights[abs_stencil_shape]; sum += weights[abs_stencil_shape]; } } for (i = 0; i < k ; i++) { weight_contrib_i[stencil_i][i] /= sum; } } /* edges: cnw */ stencil_i = rank_stencils[5]; if (stencil_i != -1) { stencil_contrib_cnt[stencil_i]++; for (j = 1; j <= 2; j++) { if (rank_stencils[j * 9 + 5] != -1) /* bottom or top planes */ { stencil_contrib_cnt[stencil_i]++; } } max_contribut_size = hypre_max( max_contribut_size, stencil_contrib_cnt[stencil_i] ); } if (stencil_i != -1) { stencil_contrib_i[stencil_i] = hypre_TAlloc(HYPRE_Int, stencil_contrib_cnt[stencil_i], HYPRE_MEMORY_HOST); weight_contrib_i[stencil_i] = hypre_TAlloc(HYPRE_Real, stencil_contrib_cnt[stencil_i], HYPRE_MEMORY_HOST); sum = 0.0; k = 0; stencil_contrib_i[stencil_i][k] = stencil_i; AbsStencilShape( hypre_StructStencilElement(stencils, stencil_i), abs_stencil_shape ); weight_contrib_i[stencil_i][k++] = weights[abs_stencil_shape]; sum += weights[abs_stencil_shape]; for (j = 1; j <= 2; j++) { if (rank_stencils[j * 9 + 5] != -1) { stencil_contrib_i[stencil_i][k] = rank_stencils[j * 9 + 5]; AbsStencilShape(hypre_StructStencilElement(stencils, rank_stencils[j * 9 + 5]), abs_stencil_shape ); weight_contrib_i[stencil_i][k++] = weights[abs_stencil_shape]; sum += weights[abs_stencil_shape]; } } for (i = 0; i < k ; i++) { weight_contrib_i[stencil_i][i] /= sum; } } /* edges: csw */ stencil_i = rank_stencils[8]; if (stencil_i != -1) { stencil_contrib_cnt[stencil_i]++; for (j = 1; j <= 2; j++) { if (rank_stencils[j * 9 + 8] != -1) /* bottom or top planes */ { stencil_contrib_cnt[stencil_i]++; } } max_contribut_size = hypre_max( max_contribut_size, stencil_contrib_cnt[stencil_i] ); } if (stencil_i != -1) { stencil_contrib_i[stencil_i] = hypre_TAlloc(HYPRE_Int, stencil_contrib_cnt[stencil_i], HYPRE_MEMORY_HOST); weight_contrib_i[stencil_i] = hypre_TAlloc(HYPRE_Real, stencil_contrib_cnt[stencil_i], HYPRE_MEMORY_HOST); sum = 0.0; k = 0; stencil_contrib_i[stencil_i][k] = stencil_i; AbsStencilShape( hypre_StructStencilElement(stencils, stencil_i), abs_stencil_shape ); weight_contrib_i[stencil_i][k++] = weights[abs_stencil_shape]; sum += weights[abs_stencil_shape]; for (j = 1; j <= 2; j++) { if (rank_stencils[j * 9 + 8] != -1) { stencil_contrib_i[stencil_i][k] = rank_stencils[j * 9 + 8]; AbsStencilShape(hypre_StructStencilElement(stencils, rank_stencils[j * 9 + 8]), abs_stencil_shape ); weight_contrib_i[stencil_i][k++] = weights[abs_stencil_shape]; sum += weights[abs_stencil_shape]; } } for (i = 0; i < k ; i++) { weight_contrib_i[stencil_i][i] /= sum; } } /* edges: top east */ stencil_i = rank_stencils[10]; if (stencil_i != -1) { stencil_contrib_cnt[stencil_i]++; for (i = 3; i <= 6; i += 3) { if (rank_stencils[10 + i] != -1) { stencil_contrib_cnt[stencil_i]++; } } max_contribut_size = hypre_max( max_contribut_size, stencil_contrib_cnt[stencil_i] ); } if (stencil_i != -1) { stencil_contrib_i[stencil_i] = hypre_TAlloc(HYPRE_Int, stencil_contrib_cnt[stencil_i], HYPRE_MEMORY_HOST); weight_contrib_i[stencil_i] = hypre_TAlloc(HYPRE_Real, stencil_contrib_cnt[stencil_i], HYPRE_MEMORY_HOST); sum = 0.0; k = 0; stencil_contrib_i[stencil_i][k] = stencil_i; AbsStencilShape( hypre_StructStencilElement(stencils, stencil_i), abs_stencil_shape ); weight_contrib_i[stencil_i][k++] = weights[abs_stencil_shape]; sum += weights[abs_stencil_shape]; for (i = 3; i <= 6; i += 3) { if (rank_stencils[10 + i] != -1) { stencil_contrib_i[stencil_i][k] = rank_stencils[10 + i]; AbsStencilShape(hypre_StructStencilElement(stencils, rank_stencils[10 + i]), abs_stencil_shape ); weight_contrib_i[stencil_i][k++] = weights[abs_stencil_shape]; sum += weights[abs_stencil_shape]; } } for (i = 0; i < k ; i++) { weight_contrib_i[stencil_i][i] /= sum; } } /* edges: top west */ stencil_i = rank_stencils[11]; if (stencil_i != -1) { stencil_contrib_cnt[stencil_i]++; for (i = 3; i <= 6; i += 3) { if (rank_stencils[11 + i] != -1) { stencil_contrib_cnt[stencil_i]++; } } max_contribut_size = hypre_max( max_contribut_size, stencil_contrib_cnt[stencil_i] ); } if (stencil_i != -1) { stencil_contrib_i[stencil_i] = hypre_TAlloc(HYPRE_Int, stencil_contrib_cnt[stencil_i], HYPRE_MEMORY_HOST); weight_contrib_i[stencil_i] = hypre_TAlloc(HYPRE_Real, stencil_contrib_cnt[stencil_i], HYPRE_MEMORY_HOST); sum = 0.0; k = 0; stencil_contrib_i[stencil_i][k] = stencil_i; AbsStencilShape( hypre_StructStencilElement(stencils, stencil_i), abs_stencil_shape ); weight_contrib_i[stencil_i][k++] = weights[abs_stencil_shape]; sum += weights[abs_stencil_shape]; for (i = 3; i <= 6; i += 3) { if (rank_stencils[11 + i] != -1) { stencil_contrib_i[stencil_i][k] = rank_stencils[11 + i]; AbsStencilShape(hypre_StructStencilElement(stencils, rank_stencils[11 + i]), abs_stencil_shape ); weight_contrib_i[stencil_i][k++] = weights[abs_stencil_shape]; sum += weights[abs_stencil_shape]; } } for (i = 0; i < k ; i++) { weight_contrib_i[stencil_i][i] /= sum; } } /* edges: top north */ stencil_i = rank_stencils[12]; if (stencil_i != -1) { stencil_contrib_cnt[stencil_i]++; for (i = 13; i <= 14; i++) { if (rank_stencils[i] != -1) { stencil_contrib_cnt[stencil_i]++; } } max_contribut_size = hypre_max( max_contribut_size, stencil_contrib_cnt[stencil_i] ); } if (stencil_i != -1) { stencil_contrib_i[stencil_i] = hypre_TAlloc(HYPRE_Int, stencil_contrib_cnt[stencil_i], HYPRE_MEMORY_HOST); weight_contrib_i[stencil_i] = hypre_TAlloc(HYPRE_Real, stencil_contrib_cnt[stencil_i], HYPRE_MEMORY_HOST); sum = 0.0; k = 0; stencil_contrib_i[stencil_i][k] = stencil_i; AbsStencilShape( hypre_StructStencilElement(stencils, stencil_i), abs_stencil_shape ); weight_contrib_i[stencil_i][k++] = weights[abs_stencil_shape]; sum += weights[abs_stencil_shape]; for (i = 13; i <= 14; i++) { if (rank_stencils[i] != -1) { stencil_contrib_i[stencil_i][k] = rank_stencils[i]; AbsStencilShape(hypre_StructStencilElement(stencils, rank_stencils[i]), abs_stencil_shape ); weight_contrib_i[stencil_i][k++] = weights[abs_stencil_shape]; sum += weights[abs_stencil_shape]; } } for (i = 0; i < k ; i++) { weight_contrib_i[stencil_i][i] /= sum; } } /* edges: top south*/ stencil_i = rank_stencils[15]; if (stencil_i != -1) { stencil_contrib_cnt[stencil_i]++; for (i = 16; i <= 17; i++) { if (rank_stencils[i] != -1) { stencil_contrib_cnt[stencil_i]++; } } max_contribut_size = hypre_max( max_contribut_size, stencil_contrib_cnt[stencil_i] ); } if (stencil_i != -1) { stencil_contrib_i[stencil_i] = hypre_TAlloc(HYPRE_Int, stencil_contrib_cnt[stencil_i], HYPRE_MEMORY_HOST); weight_contrib_i[stencil_i] = hypre_TAlloc(HYPRE_Real, stencil_contrib_cnt[stencil_i], HYPRE_MEMORY_HOST); sum = 0.0; k = 0; stencil_contrib_i[stencil_i][k] = stencil_i; AbsStencilShape( hypre_StructStencilElement(stencils, stencil_i), abs_stencil_shape ); weight_contrib_i[stencil_i][k++] = weights[abs_stencil_shape]; sum += weights[abs_stencil_shape]; for (i = 16; i <= 17; i++) { if (rank_stencils[i] != -1) { stencil_contrib_i[stencil_i][k] = rank_stencils[i]; AbsStencilShape(hypre_StructStencilElement(stencils, rank_stencils[i]), abs_stencil_shape ); weight_contrib_i[stencil_i][k++] = weights[abs_stencil_shape]; sum += weights[abs_stencil_shape]; } } for (i = 0; i < k ; i++) { weight_contrib_i[stencil_i][i] /= sum; } } /* edges: bottom east */ stencil_i = rank_stencils[19]; if (stencil_i != -1) { stencil_contrib_cnt[stencil_i]++; for (i = 3; i <= 6; i += 3) { if (rank_stencils[19 + i] != -1) { stencil_contrib_cnt[stencil_i]++; } } max_contribut_size = hypre_max( max_contribut_size, stencil_contrib_cnt[stencil_i] ); } if (stencil_i != -1) { stencil_contrib_i[stencil_i] = hypre_TAlloc(HYPRE_Int, stencil_contrib_cnt[stencil_i], HYPRE_MEMORY_HOST); weight_contrib_i[stencil_i] = hypre_TAlloc(HYPRE_Real, stencil_contrib_cnt[stencil_i], HYPRE_MEMORY_HOST); sum = 0.0; k = 0; stencil_contrib_i[stencil_i][k] = stencil_i; AbsStencilShape( hypre_StructStencilElement(stencils, stencil_i), abs_stencil_shape ); weight_contrib_i[stencil_i][k++] = weights[abs_stencil_shape]; sum += weights[abs_stencil_shape]; for (i = 3; i <= 6; i += 3) { if (rank_stencils[19 + i] != -1) { stencil_contrib_i[stencil_i][k] = rank_stencils[19 + i]; AbsStencilShape(hypre_StructStencilElement(stencils, rank_stencils[19 + i]), abs_stencil_shape ); weight_contrib_i[stencil_i][k++] = weights[abs_stencil_shape]; sum += weights[abs_stencil_shape]; } } for (i = 0; i < k ; i++) { weight_contrib_i[stencil_i][i] /= sum; } } /* edges: bottom west */ stencil_i = rank_stencils[20]; if (stencil_i != -1) { stencil_contrib_cnt[stencil_i]++; for (i = 3; i <= 6; i += 3) { if (rank_stencils[20 + i] != -1) { stencil_contrib_cnt[stencil_i]++; } } max_contribut_size = hypre_max( max_contribut_size, stencil_contrib_cnt[stencil_i] ); } if (stencil_i != -1) { stencil_contrib_i[stencil_i] = hypre_TAlloc(HYPRE_Int, stencil_contrib_cnt[stencil_i], HYPRE_MEMORY_HOST); weight_contrib_i[stencil_i] = hypre_TAlloc(HYPRE_Real, stencil_contrib_cnt[stencil_i], HYPRE_MEMORY_HOST); sum = 0.0; k = 0; stencil_contrib_i[stencil_i][k] = stencil_i; AbsStencilShape( hypre_StructStencilElement(stencils, stencil_i), abs_stencil_shape ); weight_contrib_i[stencil_i][k++] = weights[abs_stencil_shape]; sum += weights[abs_stencil_shape]; for (i = 3; i <= 6; i += 3) { if (rank_stencils[20 + i] != -1) { stencil_contrib_i[stencil_i][k] = rank_stencils[20 + i]; AbsStencilShape(hypre_StructStencilElement(stencils, rank_stencils[20 + i]), abs_stencil_shape ); weight_contrib_i[stencil_i][k++] = weights[abs_stencil_shape]; sum += weights[abs_stencil_shape]; } } for (i = 0; i < k ; i++) { weight_contrib_i[stencil_i][i] /= sum; } } /* edges: bottom north */ stencil_i = rank_stencils[21]; if (stencil_i != -1) { stencil_contrib_cnt[stencil_i]++; for (i = 22; i <= 23; i++) { if (rank_stencils[i] != -1) { stencil_contrib_cnt[stencil_i]++; } } max_contribut_size = hypre_max( max_contribut_size, stencil_contrib_cnt[stencil_i] ); } if (stencil_i != -1) { stencil_contrib_i[stencil_i] = hypre_TAlloc(HYPRE_Int, stencil_contrib_cnt[stencil_i], HYPRE_MEMORY_HOST); weight_contrib_i[stencil_i] = hypre_TAlloc(HYPRE_Real, stencil_contrib_cnt[stencil_i], HYPRE_MEMORY_HOST); sum = 0.0; k = 0; stencil_contrib_i[stencil_i][k] = stencil_i; AbsStencilShape( hypre_StructStencilElement(stencils, stencil_i), abs_stencil_shape ); weight_contrib_i[stencil_i][k++] = weights[abs_stencil_shape]; sum += weights[abs_stencil_shape]; for (i = 22; i <= 23; i++) { if (rank_stencils[i] != -1) { stencil_contrib_i[stencil_i][k] = rank_stencils[i]; AbsStencilShape(hypre_StructStencilElement(stencils, rank_stencils[i]), abs_stencil_shape ); weight_contrib_i[stencil_i][k++] = weights[abs_stencil_shape]; sum += weights[abs_stencil_shape]; } } for (i = 0; i < k ; i++) { weight_contrib_i[stencil_i][i] /= sum; } } /* edges: bottom south*/ stencil_i = rank_stencils[24]; if (stencil_i != -1) { stencil_contrib_cnt[stencil_i]++; for (i = 25; i <= 26; i++) { if (rank_stencils[i] != -1) { stencil_contrib_cnt[stencil_i]++; } } max_contribut_size = hypre_max( max_contribut_size, stencil_contrib_cnt[stencil_i] ); } if (stencil_i != -1) { stencil_contrib_i[stencil_i] = hypre_TAlloc(HYPRE_Int, stencil_contrib_cnt[stencil_i], HYPRE_MEMORY_HOST); weight_contrib_i[stencil_i] = hypre_TAlloc(HYPRE_Real, stencil_contrib_cnt[stencil_i], HYPRE_MEMORY_HOST); sum = 0.0; k = 0; stencil_contrib_i[stencil_i][k] = stencil_i; AbsStencilShape( hypre_StructStencilElement(stencils, stencil_i), abs_stencil_shape ); weight_contrib_i[stencil_i][k++] = weights[abs_stencil_shape]; sum += weights[abs_stencil_shape]; for (i = 25; i <= 26; i++) { if (rank_stencils[i] != -1) { stencil_contrib_i[stencil_i][k] = rank_stencils[i]; AbsStencilShape(hypre_StructStencilElement(stencils, rank_stencils[i]), abs_stencil_shape ); weight_contrib_i[stencil_i][k++] = weights[abs_stencil_shape]; sum += weights[abs_stencil_shape]; } } for (i = 0; i < k ; i++) { weight_contrib_i[stencil_i][i] /= sum; } } /* corners*/ for (j = 1; j <= 2; j++) { for (i = 4; i <= 5; i++) { stencil_i = rank_stencils[9 * j + i]; if (stencil_i != -1) { stencil_contrib_cnt[stencil_i]++; stencil_contrib_i[stencil_i] = hypre_TAlloc(HYPRE_Int, 1, HYPRE_MEMORY_HOST); weight_contrib_i[stencil_i] = hypre_TAlloc(HYPRE_Real, 1, HYPRE_MEMORY_HOST); stencil_contrib_i[stencil_i][0] = stencil_i; weight_contrib_i[stencil_i][0] = weights[0]; } } for (i = 7; i <= 8; i++) { stencil_i = rank_stencils[9 * j + i]; if (stencil_i != -1) { stencil_contrib_cnt[stencil_i]++; stencil_contrib_i[stencil_i] = hypre_TAlloc(HYPRE_Int, 1, HYPRE_MEMORY_HOST); weight_contrib_i[stencil_i] = hypre_TAlloc(HYPRE_Real, 1, HYPRE_MEMORY_HOST); stencil_contrib_i[stencil_i][0] = stencil_i; weight_contrib_i[stencil_i][0] = weights[0]; } } } } /* if ndim > 2 */ /*----------------------------------------------------------------- * Allocate for the temporary vector used in computing the * averages. *-----------------------------------------------------------------*/ vals = hypre_CTAlloc(HYPRE_Real, max_contribut_size, HYPRE_MEMORY_HOST); /*----------------------------------------------------------------- * coarse grid stencil contributor structures have been formed. *-----------------------------------------------------------------*/ } /* if (stencil_marker == true) */ /*--------------------------------------------------------------------- * Loop over gridboxes to average stencils *---------------------------------------------------------------------*/ smatrix_var = hypre_SStructPMatrixSMatrix(A_pmatrix, var1, var2); crse_smatrix = hypre_SStructPMatrixSMatrix(A_crse, var1, var2); /*--------------------------------------------------------------------- * data ptrs to extract and fill in data. *---------------------------------------------------------------------*/ a_ptrs = hypre_TAlloc(HYPRE_Real *, stencil_size, HYPRE_MEMORY_HOST); crse_ptrs = hypre_TAlloc(HYPRE_Real *, stencil_size, HYPRE_MEMORY_HOST); hypre_ForBoxI(ci, cgrid_boxes) { cgrid_box = hypre_BoxArrayBox(cgrid_boxes, ci); fbox_interior_ci = fbox_interior[var1][ci]; fbox_bdy_ci = fbox_bdy[var1][ci]; interior_fboxi_ci = interior_fboxi[var1][ci]; bdy_fboxi_ci = bdy_fboxi[var1][ci]; crse_dbox = hypre_BoxArrayBox(hypre_StructMatrixDataSpace(crse_smatrix), ci); /*------------------------------------------------------------------ * grab the correct coarse grid pointers. These are the parent base * grids. *------------------------------------------------------------------*/ for (i = 0; i < stencil_size; i++) { hypre_CopyIndex(hypre_StructStencilElement(stencils, i), stencil_shape_i); crse_ptrs[i] = hypre_StructMatrixExtractPointerByIndex(crse_smatrix, ci, stencil_shape_i); } /*------------------------------------------------------------------ * Loop over the interior of each patch inside cgrid_box. *------------------------------------------------------------------*/ hypre_ForBoxI(fi, fbox_interior_ci) { fgrid_box = hypre_BoxArrayBox(fbox_interior_ci, fi); /*-------------------------------------------------------------- * grab the fine grid ptrs & create the offsets for the fine * grid ptrs. *--------------------------------------------------------------*/ A_dbox = hypre_BoxArrayBox(hypre_StructMatrixDataSpace(smatrix_var), interior_fboxi_ci[fi]); for (i = 0; i < stencil_size; i++) { hypre_CopyIndex(hypre_StructStencilElement(stencils, i), stencil_shape_i); a_ptrs[i] = hypre_StructMatrixExtractPointerByIndex(smatrix_var, interior_fboxi_ci[fi], stencil_shape_i); } /*--------------------------------------------------------------- * Compute the offsets for pointing to the correct data. * Note that for 1-d, OffsetA[j][i]= 0. Therefore, this ptr * will be correct for 1-d. *---------------------------------------------------------------*/ for (j = 0; j < 2; j++) { OffsetA[j][0] = 0; for (i = 1; i < refine_factors[j + 1]; i++) { if (j == 0) { hypre_SetIndex3(index_temp, 0, i, 0); } else { hypre_SetIndex3(index_temp, 0, 0, i); } OffsetA[j][i] = hypre_BoxOffsetDistance(A_dbox, index_temp); } } hypre_CopyIndex(hypre_BoxIMin(fgrid_box), fstart); hypre_CopyIndex(hypre_BoxIMax(fgrid_box), fend); /* coarsen the interior patch box*/ hypre_ClearIndex(index_temp); hypre_StructMapFineToCoarse(fstart, index_temp, stridef, hypre_BoxIMin(&fine_box)); hypre_StructMapFineToCoarse(fend, index_temp, stridef, hypre_BoxIMax(&fine_box)); hypre_CopyIndex(hypre_BoxIMin(&fine_box), cstart); /*---------------------------------------------------------------- * Loop over interior grid box. *----------------------------------------------------------------*/ hypre_BoxGetSize(&fine_box, loop_size); hypre_SerialBoxLoop2Begin(ndim, loop_size, A_dbox, fstart, stridef, iA, crse_dbox, cstart, stridec, iAc); { for (i = 0; i < stencil_size; i++) { rank = stencil_ranks[i]; /*------------------------------------------------------------ * Loop over refinement agglomeration making up a coarse cell * when a non-centre stencil. *------------------------------------------------------------*/ if (rank) { /*-------------------------------------------------------- * Loop over refinement agglomeration extents making up a * a coarse cell. *--------------------------------------------------------*/ hypre_CopyIndex(hypre_BoxIMin(shift_box[i]), index1); hypre_CopyIndex(hypre_BoxIMax(shift_box[i]), index2); for (m = 0; m < stencil_contrib_cnt[i]; m++) { vals[m] = 0.0; } /*-------------------------------------------------------- * For 1-d, index1[l]= index2[l]= 0, l>=1. So * iA_shift_zyx= j, * which is correct. Similarly, 2-d is correct. *--------------------------------------------------------*/ for (l = index1[2]; l <= index2[2]; l++) { iA_shift_z = iA + OffsetA[1][l]; for (k = index1[1]; k <= index2[1]; k++) { iA_shift_zy = iA_shift_z + OffsetA[0][k]; for (j = index1[0]; j <= index2[0]; j++) { iA_shift_zyx = iA_shift_zy + j; for (m = 0; m < stencil_contrib_cnt[i]; m++) { stencil_i = stencil_contrib_i[i][m]; vals[m] += a_ptrs[stencil_i][iA_shift_zyx]; } } } } /*---------------------------------------------------------- * average & weight the contributions and place into coarse * stencil entry. *----------------------------------------------------------*/ crse_ptrs[i][iAc] = 0.0; for (m = 0; m < stencil_contrib_cnt[i]; m++) { crse_ptrs[i][iAc] += vals[m] * weight_contrib_i[i][m]; } crse_ptrs[i][iAc] /= volume_shift_box[i]; } /* if (rank) */ } /* for i */ /*------------------------------------------------------------------ * centre stencil: * The centre stencil is computed so that the row sum is equal to * the sum of the row sums of the fine matrix. Uses the computed * coarse off-diagonal stencils. * * No fine-coarse interface for the interior boxes. *------------------------------------------------------------------*/ hypre_CopyIndex(hypre_BoxIMin(&coarse_cell_box), index1); hypre_CopyIndex(hypre_BoxIMax(&coarse_cell_box), index2); sum = 0.0; for (l = index1[2]; l <= index2[2]; l++) { iA_shift_z = iA + OffsetA[1][l]; for (k = index1[1]; k <= index2[1]; k++) { iA_shift_zy = iA_shift_z + OffsetA[0][k]; for (j = index1[0]; j <= index2[0]; j++) { iA_shift_zyx = iA_shift_zy + j; for (m = 0; m < stencil_size; m++) { sum += a_ptrs[m][iA_shift_zyx]; } } } } /*--------------------------------------------------------------- * coarse centre coefficient- when away from the fine-coarse * interface, the centre coefficient is the sum of the * off-diagonal components. *---------------------------------------------------------------*/ sum /= scaling; for (m = 0; m < stencil_size; m++) { rank = stencil_ranks[m]; if (rank) { sum -= crse_ptrs[m][iAc]; } } crse_ptrs[ rank_stencils[0] ][iAc] = sum; } hypre_SerialBoxLoop2End(iA, iAc); } /* end hypre_ForBoxI(fi, fbox_interior_ci) */ /*------------------------------------------------------------------ * Loop over the boundaries of each patch inside cgrid_box. *------------------------------------------------------------------*/ hypre_ForBoxArrayI(arrayi, fbox_bdy_ci) { fbox_bdy_ci_fi = hypre_BoxArrayArrayBoxArray(fbox_bdy_ci, arrayi); hypre_ForBoxI(fi, fbox_bdy_ci_fi) { fgrid_box = hypre_BoxArrayBox(fbox_bdy_ci_fi, fi); /*----------------------------------------------------------- * grab the fine grid ptrs & create the offsets for the fine * grid ptrs. *-----------------------------------------------------------*/ A_dbox = hypre_BoxArrayBox(hypre_StructMatrixDataSpace(smatrix_var), bdy_fboxi_ci[arrayi]); for (i = 0; i < stencil_size; i++) { hypre_CopyIndex(hypre_StructStencilElement(stencils, i), stencil_shape_i); a_ptrs[i] = hypre_StructMatrixExtractPointerByIndex(smatrix_var, bdy_fboxi_ci[arrayi], stencil_shape_i); } /*-------------------------------------------------------------- * Compute the offsets for pointing to the correct data. *--------------------------------------------------------------*/ for (j = 0; j < 2; j++) { OffsetA[j][0] = 0; for (i = 1; i < refine_factors[j + 1]; i++) { if (j == 0) { hypre_SetIndex3(index_temp, 0, i, 0); } else { hypre_SetIndex3(index_temp, 0, 0, i); } OffsetA[j][i] = hypre_BoxOffsetDistance(A_dbox, index_temp); } } hypre_CopyIndex(hypre_BoxIMin(fgrid_box), fstart); hypre_CopyIndex(hypre_BoxIMax(fgrid_box), fend); /* coarsen the patch box*/ hypre_ClearIndex(index_temp); hypre_StructMapFineToCoarse(fstart, index_temp, stridef, hypre_BoxIMin(&fine_box)); hypre_StructMapFineToCoarse(fend, index_temp, stridef, hypre_BoxIMax(&fine_box)); hypre_CopyIndex(hypre_BoxIMin(&fine_box), cstart); /*-------------------------------------------------------------- * Loop over boundary grid box. *--------------------------------------------------------------*/ hypre_BoxGetSize(&fine_box, loop_size); hypre_SerialBoxLoop2Begin(ndim, loop_size, A_dbox, fstart, stridef, iA, crse_dbox, cstart, stridec, iAc); { zypre_BoxLoopGetIndex(lindex); for (i = 0; i < stencil_size; i++) { rank = stencil_ranks[i]; /*-------------------------------------------------------- * Loop over refinement agglomeration making up a coarse * cell when a non-centre stencil. *--------------------------------------------------------*/ if (rank) { /*----------------------------------------------------- * Loop over refinement agglomeration extents making up * a coarse cell. *-----------------------------------------------------*/ hypre_CopyIndex(hypre_BoxIMin(shift_box[i]), index1); hypre_CopyIndex(hypre_BoxIMax(shift_box[i]), index2); for (m = 0; m < stencil_contrib_cnt[i]; m++) { vals[m] = 0.0; } for (l = index1[2]; l <= index2[2]; l++) { iA_shift_z = iA + OffsetA[1][l]; for (k = index1[1]; k <= index2[1]; k++) { iA_shift_zy = iA_shift_z + OffsetA[0][k]; for (j = index1[0]; j <= index2[0]; j++) { iA_shift_zyx = iA_shift_zy + j; for (m = 0; m < stencil_contrib_cnt[i]; m++) { stencil_i = stencil_contrib_i[i][m]; vals[m] += a_ptrs[stencil_i][iA_shift_zyx]; } } } } /*--------------------------------------------------------- * average & weight the contributions and place into coarse * stencil entry. *---------------------------------------------------------*/ crse_ptrs[i][iAc] = 0.0; for (m = 0; m < stencil_contrib_cnt[i]; m++) { crse_ptrs[i][iAc] += vals[m] * weight_contrib_i[i][m]; } crse_ptrs[i][iAc] /= volume_shift_box[i]; } /* if (rank) */ } /* for i */ /*--------------------------------------------------------------- * centre stencil: * The centre stencil is computed so that the row sum is equal to * th sum of the row sums of the fine matrix. Uses the computed * coarse off-diagonal stencils. * * Along the fine-coarse interface, we need to add the unstructured * connections. *---------------------------------------------------------------*/ hypre_CopyIndex(hypre_BoxIMin(&coarse_cell_box), index1); hypre_CopyIndex(hypre_BoxIMax(&coarse_cell_box), index2); temp3 = hypre_CTAlloc(HYPRE_Real, volume_coarse_cell_box, HYPRE_MEMORY_HOST); /*--------------------------------------------------------------- * iA_shift_zyx is computed correctly for 1 & 2-d. Also, * ll= 0 for 2-d, and ll= kk= 0 for 1-d. Correct ptrs. *---------------------------------------------------------------*/ for (l = index1[2]; l <= index2[2]; l++) { iA_shift_z = iA + OffsetA[1][l]; ll = l * refine_factors[1] * refine_factors[0]; for (k = index1[1]; k <= index2[1]; k++) { iA_shift_zy = iA_shift_z + OffsetA[0][k]; kk = ll + k * refine_factors[0]; for (j = index1[0]; j <= index2[0]; j++) { iA_shift_zyx = iA_shift_zy + j; jj = kk + j; for (m = 0; m < stencil_size; m++) { temp3[jj] += a_ptrs[m][iA_shift_zyx]; } } } } /*------------------------------------------------------------ * extract all unstructured connections. Note that we extract * from sstruct_matrix A, which already has been assembled. *------------------------------------------------------------*/ if (nUventries > 0) { temp2 = hypre_CTAlloc(HYPRE_Int, volume_coarse_cell_box, HYPRE_MEMORY_HOST); cnt1 = 0; for (l = index1[2]; l <= index2[2]; l++) { ll = l * refine_factors[1] * refine_factors[0]; for (k = index1[1]; k <= index2[1]; k++) { kk = ll + k * refine_factors[0]; for (j = index1[0]; j <= index2[0]; j++) { jj = kk + j; hypre_SetIndex3(index_temp, j + lindex[0]*stridef[0], k + lindex[1]*stridef[1], l + lindex[2]*stridef[2]); hypre_AddIndexes(fstart, index_temp, 3, index_temp); hypre_SStructGridFindBoxManEntry(grid, part_fine, index_temp, var1, &boxman_entry); hypre_SStructBoxManEntryGetGlobalRank(boxman_entry, index_temp, &rank, matrix_type); found = falseV; i = hypre_SStructGraphIUVEntry(graph, 0); m = hypre_SStructGraphIUVEntry(graph, nUventries - 1); if ((rank - startrank) >= i && (rank - startrank) <= m) { found = trueV; } if (found) { Uventry = hypre_SStructGraphUVEntry(graph, rank - startrank); if (Uventry != NULL) { nUentries = hypre_SStructUVEntryNUEntries(Uventry); m = 0; for (i = 0; i < nUentries; i++) { if (hypre_SStructUVEntryToPart(Uventry, i) == part_crse) { m++; } } /* for (i= 0; i< nUentries; i++) */ temp2[jj] = m; cnt1 += m; } /* if (Uventry != NULL) */ } /* if (found) */ } /* for (j= index1[0]; j<= index2[0]; j++) */ } /* for (k= index1[1]; k<= index2[1]; k++) */ } /* for (l= index1[2]; l<= index2[2]; l++) */ ncols = hypre_TAlloc(HYPRE_Int, cnt1, HYPRE_MEMORY_HOST); for (l = 0; l < cnt1; l++) { ncols[l] = 1; } rows = hypre_TAlloc(HYPRE_BigInt, cnt1, HYPRE_MEMORY_HOST); cols = hypre_TAlloc(HYPRE_BigInt, cnt1, HYPRE_MEMORY_HOST); vals2 = hypre_CTAlloc(HYPRE_Real, cnt1, HYPRE_MEMORY_HOST); cnt1 = 0; for (l = index1[2]; l <= index2[2]; l++) { ll = l * refine_factors[1] * refine_factors[0]; for (k = index1[1]; k <= index2[1]; k++) { kk = ll + k * refine_factors[0]; for (j = index1[0]; j <= index2[0]; j++) { jj = kk + j; hypre_SetIndex3(index_temp, j + lindex[0]*stridef[0], k + lindex[1]*stridef[1], l + lindex[2]*stridef[2]); hypre_AddIndexes(fstart, index_temp, 3, index_temp); hypre_SStructGridFindBoxManEntry(grid, part_fine, index_temp, var1, &boxman_entry); hypre_SStructBoxManEntryGetGlobalRank(boxman_entry, index_temp, &rank, matrix_type); found = falseV; if (nUventries > 0) { i = hypre_SStructGraphIUVEntry(graph, 0); m = hypre_SStructGraphIUVEntry(graph, nUventries - 1); if ((HYPRE_Int)(rank - startrank) >= i && (HYPRE_Int)(rank - startrank) <= m) { found = trueV; } } if (found) { Uventry = hypre_SStructGraphUVEntry(graph, (HYPRE_Int)(rank - startrank)); if (Uventry != NULL) { nUentries = hypre_SStructUVEntryNUEntries(Uventry); for (i = 0; i < nUentries; i++) { if (hypre_SStructUVEntryToPart(Uventry, i) == part_crse) { rows[cnt1] = rank; cols[cnt1++] = hypre_SStructUVEntryToRank(Uventry, i); } } /* for (i= 0; i< nUentries; i++) */ } /* if (Uventry != NULL) */ } /* if (found) */ } /* for (j= index1[0]; j<= index2[0]; j++) */ } /* for (k= index1[1]; k<= index2[1]; k++) */ } /* for (l= index1[2]; l<= index2[2]; l++) */ HYPRE_IJMatrixGetValues(ij_A, cnt1, ncols, rows, cols, vals2); cnt1 = 0; for (l = index1[2]; l <= index2[2]; l++) { ll = l * refine_factors[1] * refine_factors[0]; for (k = index1[1]; k <= index2[1]; k++) { kk = ll + k * refine_factors[0]; for (j = index1[0]; j <= index2[0]; j++) { jj = kk + j; for (m = 0; m < temp2[jj]; m++) { temp3[jj] += vals2[cnt1]; cnt1++; } temp2[jj] = 0; /* zero off for next time */ } /* for (j= index1[0]; j<= index2[0]; j++) */ } /* for (k= index1[1]; k<= index2[1]; k++) */ } /* for (l= index1[2]; l<= index2[2]; l++) */ hypre_TFree(ncols, HYPRE_MEMORY_HOST); hypre_TFree(rows, HYPRE_MEMORY_HOST); hypre_TFree(cols, HYPRE_MEMORY_HOST); hypre_TFree(vals2, HYPRE_MEMORY_HOST); hypre_TFree(temp2, HYPRE_MEMORY_HOST); } /* if Uventries > 0 */ sum = 0.0; for (l = index1[2]; l <= index2[2]; l++) { ll = l * refine_factors[1] * refine_factors[0]; for (k = index1[1]; k <= index2[1]; k++) { kk = ll + k * refine_factors[0]; for (j = index1[0]; j <= index2[0]; j++) { jj = kk + j; sum += temp3[jj]; } } } sum /= scaling; crse_ptrs[ rank_stencils[0] ][iAc] = sum; hypre_TFree(temp3, HYPRE_MEMORY_HOST); } hypre_SerialBoxLoop2End(iA, iAc); } /* hypre_ForBoxI(fi, fbox_bdy_ci_fi) */ } /* hypre_ForBoxArrayI(arrayi, fbox_bdy_ci) */ } /* hypre_ForBoxI(ci, cgrid_boxes) */ hypre_TFree(a_ptrs, HYPRE_MEMORY_HOST); hypre_TFree(crse_ptrs, HYPRE_MEMORY_HOST); } /* if (stencils != NULL) */ } /* end var2 */ } /* end var1 */ if (stencil_contrib_cnt) { hypre_TFree(stencil_contrib_cnt, HYPRE_MEMORY_HOST); } if (stencil_ranks) { hypre_TFree(stencil_ranks, HYPRE_MEMORY_HOST); } if (volume_shift_box) { hypre_TFree(volume_shift_box, HYPRE_MEMORY_HOST); } if (vals) { hypre_TFree(vals, HYPRE_MEMORY_HOST); } if (shift_box) { for (j = 0; j < stencil_size; j++) { if (shift_box[j]) { hypre_BoxDestroy(shift_box[j]); } } hypre_TFree(shift_box, HYPRE_MEMORY_HOST); } if (stencil_contrib_i) { for (j = 1; j < max_stencil_size; j++) { stencil_i = rank_stencils[j]; if (stencil_i != -1) { if (stencil_contrib_i[stencil_i]) { hypre_TFree(stencil_contrib_i[stencil_i], HYPRE_MEMORY_HOST); } } } hypre_TFree(stencil_contrib_i, HYPRE_MEMORY_HOST); } if (weight_contrib_i) { for (j = 1; j < max_stencil_size; j++) { stencil_i = rank_stencils[j]; if (stencil_i != -1) { if (weight_contrib_i[stencil_i]) { hypre_TFree(weight_contrib_i[stencil_i], HYPRE_MEMORY_HOST); } } } hypre_TFree(weight_contrib_i, HYPRE_MEMORY_HOST); } if (rank_stencils) { hypre_TFree(rank_stencils, HYPRE_MEMORY_HOST); } if (OffsetA) { for (j = 0; j < 2; j++) { if (OffsetA[j]) { hypre_TFree(OffsetA[j], HYPRE_MEMORY_HOST); } } hypre_TFree(OffsetA, HYPRE_MEMORY_HOST); } /*-------------------------------------------------------------------------- * STEP 2: * * Interface coarsening: fine-to-coarse connections. We are * assuming that only like-variables couple along interfaces. * * The task is to coarsen all the fine-to-coarse unstructured * connections and to compute coarse coefficients along the * interfaces (coarse-to-fine coefficients are obtained from these * computed values assuming symmetry). This involves * 1) scanning over the graph entries to find the locations of * the unstructure connections; * 2) determining the stencil shape of the coarsened connections; * 3) averaging the unstructured coefficients to compute * coefficient entries for the interface stencils; * 4) determining the weights of the interface stencil coefficients * to construct the structured coarse grid matrix along the * interfaces. * * We perform this task by * 1) scanning over the graph entries to group the locations * of the fine-to-coarse connections wrt the boxes of the * fine grid. Temporary vectors storing the Uventries indices * and the number of connections for each box will be created; * 2) for each fine grid box, group the fine-to-coarse connections * with respect to the connected coarse nodes. Temporary vectors * storing the Uventry indices and the Uentry indices for each * coarse node will be created (i.e., for a fixed coarse grid node, * record the fine node Uventries indices that connect to this * coarse node and Uentry index of the Uventry that contains * this coarse node.). The grouping is accomplished comparing the * ranks of the coarse nodes; * 3) using the Uventries and Uentry indices for each coarse node, * "coarsen" the fine grid connections to this coarse node to * create interface stencils (wrt to the coarse nodes- i.e., * the centre of the stencil is at a coarse node). Also, find * the IJ rows and columns corresponding to all the fine-to-coarse * connections in a box, and extract the unstructured coefficients; * 4) looping over all coarse grid nodes connected to a fixed fine box, * compute the arithmetically averaged interface stencils; * 5) compare the underlying coarse grid structured stencil shape * to the interface stencil shape to determine how to weight the * averaged interface stencil coefficients. * * EXCEPTION: A NODE CAN CONTAIN ONLY UNSTRUCTURED CONNECTIONS * BETWEEN ONLY TWO AMR LEVELS- I.E., WE CANNOT HAVE A NODE THAT * IS ON THE INTERFACE OF MORE THAN TWO AMR LEVELS. CHANGES TO * HANDLE THIS LATTER CASE WILL INVOLVE THE SEARCH FOR f/c * CONNECTIONS. *-----------------------------------------------------------------*/ if (nUventries > 0) { nvars = hypre_SStructPMatrixNVars(A_pmatrix); for (var1 = 0; var1 < nvars; var1++) { /*----------------------------------------------------------------- * Yank out the structured stencils for this variable (only like * variables considered) and find their ranks. *-----------------------------------------------------------------*/ stencils = hypre_SStructPMatrixSStencil(A_crse, var1, var1); stencil_size = hypre_StructStencilSize(stencils); stencil_ranks = hypre_TAlloc(HYPRE_Int, stencil_size, HYPRE_MEMORY_HOST); rank_stencils = hypre_TAlloc(HYPRE_Int, max_stencil_size, HYPRE_MEMORY_HOST); for (i = 0; i < stencil_size; i++) { hypre_CopyIndex(hypre_StructStencilElement(stencils, i), stencil_shape_i); MapStencilRank( stencil_shape_i, stencil_ranks[i] ); rank_stencils[ stencil_ranks[i] ] = i; } /*----------------------------------------------------------------- * qsort the ranks into ascending order *-----------------------------------------------------------------*/ hypre_qsort0(stencil_ranks, 0, stencil_size - 1); crse_smatrix = hypre_SStructPMatrixSMatrix(A_crse, var1, var1); cgrid = hypre_SStructPGridSGrid(hypre_SStructPMatrixPGrid(A_crse), var1); cgrid_boxes = hypre_StructGridBoxes(cgrid); fgrid = hypre_SStructPGridSGrid(hypre_SStructPMatrixPGrid(A_pmatrix), var1); fgrid_boxes = hypre_StructGridBoxes(fgrid); box_starts = hypre_CTAlloc(HYPRE_Int, hypre_BoxArraySize(fgrid_boxes), HYPRE_MEMORY_HOST); box_ends = hypre_CTAlloc(HYPRE_Int, hypre_BoxArraySize(fgrid_boxes), HYPRE_MEMORY_HOST); hypre_SStructGraphFindSGridEndpts(graph, part_fine, var1, myid, 0, box_starts); hypre_SStructGraphFindSGridEndpts(graph, part_fine, var1, myid, 1, box_ends); /*----------------------------------------------------------------- * Step 1: scanning over the graph entries to group the locations * of the unstructured connections wrt to fine grid boxes. * * Count the components that couple for each box. * * box_graph_indices[fi]= array of Uventries indices in box fi. * box_graph_cnts[fi] = number of Uventries in box fi. * cdata_space_rank[ci] = begin offset rank of coarse data_space * box ci. *-----------------------------------------------------------------*/ box_array_size = hypre_BoxArraySize(fgrid_boxes); cbox_array_size = hypre_BoxArraySize(cgrid_boxes); box_graph_indices = hypre_CTAlloc(HYPRE_Int *, box_array_size, HYPRE_MEMORY_HOST); box_graph_cnts = hypre_CTAlloc(HYPRE_Int, box_array_size, HYPRE_MEMORY_HOST); data_space = hypre_StructMatrixDataSpace(crse_smatrix); cdata_space_ranks = hypre_CTAlloc(HYPRE_Int, cbox_array_size, HYPRE_MEMORY_HOST); cdata_space_ranks[0] = 0; for (i = 1; i < cbox_array_size; i++) { cdata_space_ranks[i] = cdata_space_ranks[i - 1] + hypre_BoxVolume(hypre_BoxArrayBox(data_space, i - 1)); } /*----------------------------------------------------------------- * Scanning obtained by searching iUventries between the start * and end of a fine box. Binary search used to find the interval * between these two endpts. Index (-1) returned if no interval * bounds found. Note that if start has positive index, then end * must have a positive index also. *-----------------------------------------------------------------*/ for (fi = 0; fi < box_array_size; fi++) { i = hypre_LowerBinarySearch(iUventries, box_starts[fi], nUventries); if (i >= 0) { j = hypre_UpperBinarySearch(iUventries, box_ends[fi], nUventries); box_graph_indices[fi] = hypre_TAlloc(HYPRE_Int, j - i + 1, HYPRE_MEMORY_HOST); for (k = 0; k < (j - i + 1); k++) { Uventry = hypre_SStructGraphUVEntry(graph, iUventries[i + k]); for (m = 0; m < hypre_SStructUVEntryNUEntries(Uventry); m++) { if (hypre_SStructUVEntryToPart(Uventry, m) == part_crse) { box_graph_indices[fi][box_graph_cnts[fi]] = iUventries[i + k]; box_graph_cnts[fi]++; break; } } /* for (m= 0; m< hypre_SStructUVEntryNUEntries(Uventry); m++) */ } /* for (k= 0; k< (j-i+1); k++) */ } /* if (i >= 0) */ } /* for (fi= 0; fi< box_array_size; fi++) */ /*----------------------------------------------------------------- * Step 2: * Determine and group the fine-to-coarse connections in a box. * Grouped according to the coarsened fine grid interface nodes. * * box_ranks = ranks of coarsened fine grid interface * nodes. * box_connections = counter for the distinct coarsened fine * grid interface nodes. This can be * used to group all the Uventries of a * coarsened fine grid node. * cindex[l] = the hypre_Index of coarsen node l. * parents_cnodes[l] = parent box that contains the coarsened * fine grid interface node l. * fine_interface_ranks[l]= rank of coarsened fine grid interface * node l. * box_ranks_cnt[l] = counter for no. of Uventries for * coarsened node l. * coarse_contrib_Uv[l] = Uventry indices for Uventries that * contain fine-to-coarse connections of * coarse node l. *-----------------------------------------------------------------*/ for (fi = 0; fi < box_array_size; fi++) { /*------------------------------------------------------------- * Determine the coarse data ptrs corresponding to fine box fi. * These are needed in assigning the averaged unstructured * coefficients. * * Determine how many distinct coarse grid nodes are in the * unstructured connection for a given box. Each node has a * structures. * * temp1 & temp2 are linked lists vectors used for grouping the * Uventries for a given coarse node. *-------------------------------------------------------------*/ box_ranks = hypre_TAlloc(HYPRE_Int, box_graph_cnts[fi], HYPRE_MEMORY_HOST); box_connections = hypre_TAlloc(HYPRE_Int, box_graph_cnts[fi], HYPRE_MEMORY_HOST); parents = hypre_TAlloc(HYPRE_Int, box_graph_cnts[fi], HYPRE_MEMORY_HOST); temp1 = hypre_CTAlloc(HYPRE_Int, box_graph_cnts[fi] + 1, HYPRE_MEMORY_HOST); temp2 = hypre_CTAlloc(HYPRE_Int, box_graph_cnts[fi], HYPRE_MEMORY_HOST); Uv_cindex = hypre_TAlloc(hypre_Index, box_graph_cnts[fi], HYPRE_MEMORY_HOST); /*------------------------------------------------------------- * determine the parent box of this fgrid_box. *-------------------------------------------------------------*/ hypre_ClearIndex(index_temp); for (i = 0; i < box_graph_cnts[fi]; i++) { Uventry = Uventries[box_graph_indices[fi][i]]; /*------------------------------------------------------------- * Coarsen the fine grid interface nodes and then get their * ranks. The correct coarse grid is needed to determine the * correct data_box. * Save the rank of the coarsened index & the parent box id. *-------------------------------------------------------------*/ hypre_CopyIndex(hypre_SStructUVEntryIndex(Uventry), index); hypre_StructMapFineToCoarse(index, index_temp, stridef, Uv_cindex[i]); hypre_BoxSetExtents(&fine_box, Uv_cindex[i], Uv_cindex[i]); ci = 0; for (j = 0; j < cboxi_fcnt[var1][fi]; j++) { ci = cboxi_fboxes[var1][fi][j]; cgrid_box = hypre_BoxArrayBox(cgrid_boxes, ci); hypre_IntersectBoxes(&fine_box, cgrid_box, &intersect_box); if (hypre_BoxVolume(&intersect_box) > 0) { break; } } parents[i] = ci; box_ranks[i] = cdata_space_ranks[ci] + hypre_BoxIndexRank(hypre_BoxArrayBox(data_space, ci), Uv_cindex[i]); } /*--------------------------------------------------------------- * Determine and "group" the Uventries using the box_ranks. * temp2 stores the Uventries indices for a coarsen node. *---------------------------------------------------------------*/ cnt1 = 0; j = 0; temp1[cnt1] = j; for (i = 0; i < box_graph_cnts[fi]; i++) { if (box_ranks[i] != -1) { k = box_ranks[i]; box_connections[i] = cnt1; temp2[j++] = box_graph_indices[fi][i]; for (l = i + 1; l < box_graph_cnts[fi]; l++) { if (box_ranks[l] == k) { box_connections[l] = cnt1; temp2[j++] = box_graph_indices[fi][l]; box_ranks[l] = -1; } } cnt1++; temp1[cnt1] = j; } } /*----------------------------------------------------------------- * Store the graph entry info and other index info for each coarse * grid node. *-----------------------------------------------------------------*/ parents_cnodes = hypre_TAlloc(HYPRE_Int, cnt1, HYPRE_MEMORY_HOST); fine_interface_ranks = hypre_TAlloc(HYPRE_Int, cnt1, HYPRE_MEMORY_HOST); box_ranks_cnt = hypre_CTAlloc(HYPRE_Int, cnt1, HYPRE_MEMORY_HOST); coarse_contrib_Uv = hypre_TAlloc(HYPRE_Int *, cnt1, HYPRE_MEMORY_HOST); cindex = hypre_TAlloc(hypre_Index, cnt1, HYPRE_MEMORY_HOST); for (i = 0; i < box_graph_cnts[fi]; i++) { if (box_ranks[i] != -1) { j = box_connections[i]; parents_cnodes[j] = parents[i]; fine_interface_ranks[j] = hypre_BoxIndexRank(hypre_BoxArrayBox(data_space, parents[i]), Uv_cindex[i]); hypre_CopyIndex(Uv_cindex[i], cindex[j]); box_ranks_cnt[j] = temp1[j + 1] - temp1[j]; coarse_contrib_Uv[j] = hypre_TAlloc(HYPRE_Int, box_ranks_cnt[j], HYPRE_MEMORY_HOST); l = temp1[j]; for (k = 0; k < box_ranks_cnt[j]; k++) { coarse_contrib_Uv[j][k] = temp2[l + k]; } } } if (box_ranks) { hypre_TFree(box_ranks, HYPRE_MEMORY_HOST); } if (box_connections) { hypre_TFree(box_connections, HYPRE_MEMORY_HOST); } if (parents) { hypre_TFree(parents, HYPRE_MEMORY_HOST); } if (temp1) { hypre_TFree(temp1, HYPRE_MEMORY_HOST); } if (temp2) { hypre_TFree(temp2, HYPRE_MEMORY_HOST); } if (Uv_cindex) { hypre_TFree(Uv_cindex, HYPRE_MEMORY_HOST); } /*------------------------------------------------------------------------ * Step 3: * Create the interface stencils. * * interface_max_stencil_ranks[i] = stencil_shape rank for each coarse * Uentry connection of coarsened node * i (i.e., the stencil_shape ranks of * the interface stencils at node i). * interface_max_stencil_cnt[i][m]= counter for number of Uentries * that describes a connection which * coarsens into stencil_shape rank m. * coarse_stencil_cnts[i] = counter for the no. of distinct * interface stencil_shapes (i.e., the * no. entries of the interface stencil). * interface_stencil_ranks[i][l] = stencil_shape rank for interface * stencil entry l, for coarse node i. * interface_rank_stencils[i][j] = interface stencil entry for * stencil_shape rank j, for node i. *------------------------------------------------------------------------*/ /*----------------------------------------------------------------- * Extract rows & cols info for extracting data from IJ matrix. * Extract for all connections for a box. *-----------------------------------------------------------------*/ hypre_ClearIndex(index_temp); nrows = 0; box_to_ranks_cnt = hypre_CTAlloc(HYPRE_Int, cnt1, HYPRE_MEMORY_HOST); for (i = 0; i < cnt1; i++) { for (j = 0; j < box_ranks_cnt[i]; j++) { Uventry = Uventries[ coarse_contrib_Uv[i][j] ]; for (k = 0; k < hypre_SStructUVEntryNUEntries(Uventry); k++) { if (hypre_SStructUVEntryToPart(Uventry, k) == part_crse) { box_to_ranks_cnt[i]++; } } } nrows += box_to_ranks_cnt[i]; } ncols = hypre_TAlloc(HYPRE_Int, nrows, HYPRE_MEMORY_HOST); for (i = 0; i < nrows; i++) { ncols[i] = 1; } rows = hypre_TAlloc(HYPRE_BigInt, nrows, HYPRE_MEMORY_HOST); cols = hypre_TAlloc(HYPRE_BigInt, nrows, HYPRE_MEMORY_HOST); vals = hypre_CTAlloc(HYPRE_Real, nrows, HYPRE_MEMORY_HOST); interface_max_stencil_ranks = hypre_TAlloc(HYPRE_Int *, cnt1, HYPRE_MEMORY_HOST); interface_max_stencil_cnt = hypre_TAlloc(HYPRE_Int *, cnt1, HYPRE_MEMORY_HOST); interface_rank_stencils = hypre_TAlloc(HYPRE_Int *, cnt1, HYPRE_MEMORY_HOST); interface_stencil_ranks = hypre_TAlloc(HYPRE_Int *, cnt1, HYPRE_MEMORY_HOST); coarse_stencil_cnt = hypre_CTAlloc(HYPRE_Int, cnt1, HYPRE_MEMORY_HOST); k = 0; for (i = 0; i < cnt1; i++) { /*----------------------------------------------------------------- * for each coarse interface node, we get a stencil. We compute only * the ranks assuming a maximum size stencil of 27. *-----------------------------------------------------------------*/ interface_max_stencil_ranks[i] = hypre_TAlloc(HYPRE_Int, box_to_ranks_cnt[i], HYPRE_MEMORY_HOST); interface_max_stencil_cnt[i] = hypre_CTAlloc(HYPRE_Int, max_stencil_size, HYPRE_MEMORY_HOST); /*----------------------------------------------------------------- * conjugate the coarse node index for determining the stencil * shapes for the Uentry connections. *-----------------------------------------------------------------*/ hypre_CopyIndex(cindex[i], index1); hypre_SetIndex3(index1, -index1[0], -index1[1], -index1[2]); n = 0; for (j = 0; j < box_ranks_cnt[i]; j++) { /*-------------------------------------------------------------- * extract the row rank for a given Uventry. Note that these * are the ranks in the grid of A. Therefore, we grab the index * from the nested_graph Uventry to determine the global rank. * With the rank, find the corresponding Uventry of the graph * of A. The to_ranks now can be extracted out. *--------------------------------------------------------------*/ Uventry = Uventries[ coarse_contrib_Uv[i][j] ]; hypre_CopyIndex(hypre_SStructUVEntryIndex(Uventry), index); hypre_SStructGridFindBoxManEntry(grid, part_fine, index, var1, &boxman_entry); hypre_SStructBoxManEntryGetGlobalRank(boxman_entry, index, &rank, matrix_type); Uventry = hypre_SStructGraphUVEntry(graph, rank - startrank); nUentries = hypre_SStructUVEntryNUEntries(Uventry); for (l = 0; l < nUentries; l++) { if (hypre_SStructUVEntryToPart(Uventry, l) == part_crse) { to_rank = hypre_SStructUVEntryToRank(Uventry, l); rows[k] = rank; cols[k++] = to_rank; /*--------------------------------------------------------- * compute stencil shape for this Uentry. *---------------------------------------------------------*/ hypre_CopyIndex( hypre_SStructUVEntryToIndex(Uventry, l), index ); hypre_AddIndexes(index, index1, 3, index2); MapStencilRank(index2, m); interface_max_stencil_ranks[i][n++] = m; interface_max_stencil_cnt[i][m]++; } } } hypre_TFree(coarse_contrib_Uv[i], HYPRE_MEMORY_HOST); /*----------------------------------------------------------------- * Determine only the distinct stencil ranks for coarse node i. *-----------------------------------------------------------------*/ l = 0; for (j = 0; j < max_stencil_size; j++) { if (interface_max_stencil_cnt[i][j]) { l++; } } coarse_stencil_cnt[i] = l; interface_stencil_ranks[i] = hypre_TAlloc(HYPRE_Int, l, HYPRE_MEMORY_HOST); interface_rank_stencils[i] = hypre_TAlloc(HYPRE_Int, max_stencil_size, HYPRE_MEMORY_HOST); /*----------------------------------------------------------------- * For each stencil rank, assign one of the stencil_shape_i index. *-----------------------------------------------------------------*/ l = 0; for (j = 0; j < max_stencil_size; j++) { if (interface_max_stencil_cnt[i][j]) { interface_rank_stencils[i][j] = l; interface_stencil_ranks[i][l] = j; l++; } } } /* for (i= 0; i< cnt1; i++) */ hypre_TFree(coarse_contrib_Uv, HYPRE_MEMORY_HOST); hypre_TFree(box_ranks_cnt, HYPRE_MEMORY_HOST); hypre_TFree(cindex, HYPRE_MEMORY_HOST); /*----------------------------------------------------------------- * Extract data from IJ matrix *-----------------------------------------------------------------*/ HYPRE_IJMatrixGetValues(ij_A, nrows, ncols, rows, cols, vals); hypre_TFree(ncols, HYPRE_MEMORY_HOST); hypre_TFree(rows, HYPRE_MEMORY_HOST); hypre_TFree(cols, HYPRE_MEMORY_HOST); /*----------------------------------------------------------------- * Steps 4 & 5: * Compute the arithmetically averaged interface stencils, * and determine the interface stencil weights. * * stencil_vals[l] = averaged stencil coeff for interface * stencil entry l. * common_rank_stencils = final structured coarse stencil entries * for the stencil_shapes that the * interface stencils must collapse to. * common_stencil_ranks = final structured coarse stencil_shape * ranks for the stencil_shapes that the * interface stencils must collapse to. * common_stencil_i = stencil entry of the interface stencil * corresponding to the common * stencil_shape. *-----------------------------------------------------------------*/ k = 0; for (i = 0; i < cnt1; i++) { stencil_vals = hypre_CTAlloc(HYPRE_Real, coarse_stencil_cnt[i], HYPRE_MEMORY_HOST); /*----------------------------------------------------------------- * Compute the arithmetic stencil averages for coarse node i. *-----------------------------------------------------------------*/ for (j = 0; j < box_to_ranks_cnt[i]; j++) { m = interface_max_stencil_ranks[i][j]; l = interface_rank_stencils[i][m]; stencil_vals[l] += vals[k] / interface_max_stencil_cnt[i][m]; k++; } hypre_TFree(interface_max_stencil_ranks[i], HYPRE_MEMORY_HOST); hypre_TFree(interface_max_stencil_cnt[i], HYPRE_MEMORY_HOST); hypre_TFree(interface_rank_stencils[i], HYPRE_MEMORY_HOST); /*----------------------------------------------------------------- * Determine which stencil has to be formed. This is accomplished * by comparing the coarse grid stencil ranks with the computed * interface stencil ranks. We qsort (if there are more than one * rank) the ranks to give quick comparisons. Note that we need * to swap the elements of stencil_vals & fine_interface_ranks[i]'s * accordingly. *-----------------------------------------------------------------*/ sort = falseV; for (j = 0; j < (coarse_stencil_cnt[i] - 1); j++) { if (interface_stencil_ranks[i][j] > interface_stencil_ranks[i][j + 1]) { sort = trueV; break; } } if ( (coarse_stencil_cnt[i] > 1) && (sort == trueV) ) { temp1 = hypre_TAlloc(HYPRE_Int, coarse_stencil_cnt[i], HYPRE_MEMORY_HOST); for (j = 0; j < coarse_stencil_cnt[i]; j++) { temp1[j] = j; } hypre_qsort1(interface_stencil_ranks[i], (HYPRE_Real *) temp1, 0, coarse_stencil_cnt[i] - 1); /*--------------------------------------------------------------- * swap the stencil_vals to agree with the rank swapping. *---------------------------------------------------------------*/ temp3 = hypre_TAlloc(HYPRE_Real, coarse_stencil_cnt[i], HYPRE_MEMORY_HOST); for (j = 0; j < coarse_stencil_cnt[i]; j++) { m = temp1[j]; temp3[j] = stencil_vals[m]; } for (j = 0; j < coarse_stencil_cnt[i]; j++) { stencil_vals[j] = temp3[j]; } hypre_TFree(temp1, HYPRE_MEMORY_HOST); hypre_TFree(temp3, HYPRE_MEMORY_HOST); } /*----------------------------------------------------------------- * Compute the weights for the averaged stencil contributions. * We need to convert the ranks back to stencil_shapes and then * find the abs of the stencil shape. *-----------------------------------------------------------------*/ temp3 = hypre_TAlloc(HYPRE_Real, coarse_stencil_cnt[i], HYPRE_MEMORY_HOST); for (j = 0; j < coarse_stencil_cnt[i]; j++) { InverseMapStencilRank(interface_stencil_ranks[i][j], index_temp); AbsStencilShape(index_temp, abs_stencil_shape); temp3[j] = weights[abs_stencil_shape]; } /*----------------------------------------------------------------- * Compare the coarse stencil and the interface stencil and * extract the common stencil shapes. * WE ARE ASSUMING THAT THE COARSE INTERFACE STENCIL HAS SOME * COMMON STENCIL SHAPE WITH THE COARSE STENCIL. *-----------------------------------------------------------------*/ common_rank_stencils = hypre_TAlloc(HYPRE_Int, stencil_size, HYPRE_MEMORY_HOST); common_stencil_ranks = hypre_TAlloc(HYPRE_Int, stencil_size, HYPRE_MEMORY_HOST); common_stencil_i = hypre_TAlloc(HYPRE_Int, stencil_size, HYPRE_MEMORY_HOST); l = 0; m = 0; for (j = 0; j < stencil_size; j++) { while ( (l < coarse_stencil_cnt[i]) && (stencil_ranks[j] > interface_stencil_ranks[i][l]) ) { l++; } if (l >= coarse_stencil_cnt[i]) { break; } /*-------------------------------------------------------------- * Check if a common stencil shape rank has been found. *--------------------------------------------------------------*/ if ( (stencil_ranks[j] == interface_stencil_ranks[i][l]) && (l < coarse_stencil_cnt[i]) ) { common_rank_stencils[m] = rank_stencils[ stencil_ranks[j] ]; common_stencil_ranks[m] = stencil_ranks[j]; common_stencil_i[m++] = l; l++; } } /*----------------------------------------------------------------- * Find the contribution and weights for the averaged stencils. *-----------------------------------------------------------------*/ for (j = 0; j < m; j++) { hypre_CopyIndex(hypre_StructStencilElement( stencils, common_rank_stencils[j]), stencil_shape_i); AbsStencilShape(stencil_shape_i, abs_stencil_shape); crse_ptr = hypre_StructMatrixExtractPointerByIndex(crse_smatrix, parents_cnodes[i], stencil_shape_i); /*----------------------------------------------------------------- * For a compact stencil (e.g., -1 <= hypre_Index[i] <= 1, i= 0-2), * the value of abs_stencil_shape can be used to determine the * stencil: * abs_stencil_shape= 3 only corners in 3-d * 2 corners in 2-d; or the centre plane * in 3-d, or e,w,n,s of the bottom * or top plane in 3-d * 1 e,w in 1-d; or e,w,n,s in 2-d; * or the centre plane in 3-d, * or c of the bottom or top plane * in 3-d * 0 c in 1-d, 2-d, or 3-d. *-----------------------------------------------------------------*/ switch (abs_stencil_shape) { case 3: /* corners of 3-d stencil */ l = common_stencil_i[j]; crse_ptr[fine_interface_ranks[i]] = stencil_vals[l]; break; case 2: /* corners in 2-d or edges in 3-d */ if (ndim == 2) { l = common_stencil_i[j]; crse_ptr[fine_interface_ranks[i]] = stencil_vals[l]; } else if (ndim == 3) { /*---------------------------------------------------------- * The edge values are weighted sums of the averaged * coefficients. The weights and averaged coefficients must * be found. The contributions are found using the stencil * ranks and the stencil ordering * top: 14 12 13 centre: 5 3 4 bottom 23 21 22 * 11 9 10 2 0 1 20 18 19 * 17 15 16 8 6 7 26 24 25 *----------------------------------------------------------*/ l = common_stencil_ranks[j]; temp1 = hypre_TAlloc(HYPRE_Int, 2, HYPRE_MEMORY_HOST); switch (l) { case 4: /* centre plane ne */ temp1[0] = 13; temp1[1] = 22; break; case 5: /* centre plane nw */ temp1[0] = 14; temp1[1] = 23; break; case 7: /* centre plane se */ temp1[0] = 16; temp1[1] = 25; break; case 8: /* centre plane sw */ temp1[0] = 17; temp1[1] = 26; break; case 10: /* top plane e */ temp1[0] = 13; temp1[1] = 16; break; case 11: /* top plane w */ temp1[0] = 14; temp1[1] = 17; break; case 12: /* top plane n */ temp1[0] = 13; temp1[1] = 14; break; case 15: /* top plane s */ temp1[0] = 16; temp1[1] = 17; break; case 19: /* bottom plane e */ temp1[0] = 22; temp1[1] = 25; break; case 20: /* bottom plane w */ temp1[0] = 23; temp1[1] = 26; break; case 21: /* bottom plane n */ temp1[0] = 22; temp1[1] = 23; break; case 24: /* bottom plane s */ temp1[0] = 25; temp1[1] = 26; break; } /*------------------------------------------------------- * Add up the weighted contributions of the interface * stencils. This involves searching the ranks of * interface_stencil_ranks. The weights must be averaged. *-------------------------------------------------------*/ l = common_stencil_i[j]; sum = temp3[l]; sum_contrib = sum * stencil_vals[l]; n = 1; for (l = 0; l < 2; l++) { while ( (n < coarse_stencil_cnt[i]) && (interface_stencil_ranks[i][n] < temp1[l]) ) { n++; } if (n >= coarse_stencil_cnt[i]) { break; } if (interface_stencil_ranks[i][n] == temp1[l]) { sum += temp3[n]; sum_contrib += temp3[n] * stencil_vals[n]; n++; } } sum_contrib /= sum; /* average out the weights */ l = common_stencil_i[j]; crse_ptr[fine_interface_ranks[i]] = sum_contrib; hypre_TFree(temp1, HYPRE_MEMORY_HOST); } /* else if (ndim == 3) */ break; case 1: /* e,w in 1-d, or edges in 2-d, or faces in 3-d */ if (ndim == 1) { l = common_stencil_i[j]; crse_ptr[fine_interface_ranks[i]] = stencil_vals[l]; } else if (ndim == 2) { l = common_stencil_ranks[j]; temp1 = hypre_TAlloc(HYPRE_Int, 2, HYPRE_MEMORY_HOST); switch (l) { case 1: /* e */ temp1[0] = 4; temp1[1] = 7; break; case 2: /* w */ temp1[0] = 5; temp1[1] = 8; break; case 3: /* n */ temp1[0] = 4; temp1[1] = 5; break; case 6: /* s */ temp1[0] = 7; temp1[1] = 8; break; } /*------------------------------------------------------- * Add up the weighted contributions of the interface * stencils. *-------------------------------------------------------*/ l = common_stencil_i[j]; sum = temp3[l]; sum_contrib = sum * stencil_vals[l]; n = 1; for (l = 0; l < 2; l++) { while ( (n < coarse_stencil_cnt[i]) && (interface_stencil_ranks[i][n] < temp1[l]) ) { n++; } if (n >= coarse_stencil_cnt[i]) { break; } if (interface_stencil_ranks[i][n] == temp1[l]) { sum += temp3[n]; sum_contrib += temp3[n] * stencil_vals[n]; n++; } } sum_contrib /= sum; /* average out the weights */ l = common_stencil_i[j]; crse_ptr[fine_interface_ranks[i]] = sum_contrib; hypre_TFree(temp1, HYPRE_MEMORY_HOST); } /* else if (ndim == 2) */ else /* 3-d */ { l = common_stencil_ranks[j]; temp1 = hypre_TAlloc(HYPRE_Int, 8, HYPRE_MEMORY_HOST); switch (l) { case 1: /* centre plane e */ temp1[0] = 4; temp1[1] = 7; temp1[2] = 10; temp1[3] = 13; temp1[4] = 16; temp1[5] = 19; temp1[6] = 22; temp1[7] = 25; break; case 2: /* centre plane w */ temp1[0] = 5; temp1[1] = 8; temp1[2] = 11; temp1[3] = 14; temp1[4] = 17; temp1[5] = 20; temp1[6] = 23; temp1[7] = 26; break; case 3: /* centre plane n */ temp1[0] = 4; temp1[1] = 5; temp1[2] = 12; temp1[3] = 13; temp1[4] = 14; temp1[5] = 21; temp1[6] = 22; temp1[7] = 23; break; case 6: /* centre plane s */ temp1[0] = 7; temp1[1] = 8; temp1[2] = 15; temp1[3] = 16; temp1[4] = 17; temp1[5] = 24; temp1[6] = 25; temp1[7] = 26; break; case 9: /* top plane c */ for (n = 0; n < 8; n++) { temp1[n] = 10 + n; } break; case 18: /* bottom plane c */ for (n = 0; n < 8; n++) { temp1[n] = 19 + n; } break; } /*------------------------------------------------------- * Add up the weighted contributions of the interface * stencils. *-------------------------------------------------------*/ l = common_stencil_i[j]; sum = temp3[l]; sum_contrib = sum * stencil_vals[l]; n = 1; for (l = 0; l < 8; l++) { while ( (n < coarse_stencil_cnt[i]) && (interface_stencil_ranks[i][n] < temp1[l]) ) { n++; } if (n >= coarse_stencil_cnt[i]) { break; } if (interface_stencil_ranks[i][n] == temp1[l]) { sum += temp3[n]; sum_contrib += temp3[n] * stencil_vals[n]; n++; } } sum_contrib /= sum; /* average out the weights */ l = common_stencil_i[j]; crse_ptr[fine_interface_ranks[i]] = sum_contrib; hypre_TFree(temp1, HYPRE_MEMORY_HOST); } /* else */ break; } /* switch(abs_stencil_shape) */ } /* for (j= 0; j< m; j++) */ hypre_TFree(interface_stencil_ranks[i], HYPRE_MEMORY_HOST); hypre_TFree(stencil_vals, HYPRE_MEMORY_HOST); hypre_TFree(temp3, HYPRE_MEMORY_HOST); hypre_TFree(common_rank_stencils, HYPRE_MEMORY_HOST); hypre_TFree(common_stencil_ranks, HYPRE_MEMORY_HOST); hypre_TFree(common_stencil_ranks, HYPRE_MEMORY_HOST); hypre_TFree(common_stencil_i, HYPRE_MEMORY_HOST); } /* for (i= 0; i< cnt1; i++) */ hypre_TFree(box_to_ranks_cnt, HYPRE_MEMORY_HOST); hypre_TFree(interface_max_stencil_ranks, HYPRE_MEMORY_HOST); hypre_TFree(interface_max_stencil_cnt, HYPRE_MEMORY_HOST); hypre_TFree(interface_rank_stencils, HYPRE_MEMORY_HOST); hypre_TFree(interface_stencil_ranks, HYPRE_MEMORY_HOST); hypre_TFree(coarse_stencil_cnt, HYPRE_MEMORY_HOST); hypre_TFree(fine_interface_ranks, HYPRE_MEMORY_HOST); hypre_TFree(parents_cnodes, HYPRE_MEMORY_HOST); hypre_TFree(vals, HYPRE_MEMORY_HOST); /*----------------------------------------------------------- * Box fi is completed. *-----------------------------------------------------------*/ } /* for (fi= 0; fi< box_array_size; fi++) */ hypre_TFree(stencil_ranks, HYPRE_MEMORY_HOST); hypre_TFree(rank_stencils, HYPRE_MEMORY_HOST); hypre_TFree(cdata_space_ranks, HYPRE_MEMORY_HOST); hypre_TFree(box_graph_cnts, HYPRE_MEMORY_HOST); for (i = 0; i < box_array_size; i++) { if (box_graph_indices[i]) { hypre_TFree(box_graph_indices[i], HYPRE_MEMORY_HOST); } } hypre_TFree(box_graph_indices, HYPRE_MEMORY_HOST); hypre_TFree(box_starts, HYPRE_MEMORY_HOST); hypre_TFree(box_ends, HYPRE_MEMORY_HOST); } /* for (var1= 0; var1< nvars; var1++) */ } /* if (nUventries > 0) */ /*-------------------------------------------------------------------------- * STEP 3: * Coarsened f/c interface coefficients can be used to create the * centre components along the coarsened f/c nodes now. Loop over * the coarsened fbox_bdy's and set the centre stencils. *--------------------------------------------------------------------------*/ hypre_ClearIndex(index_temp); for (var1 = 0; var1 < nvars; var1++) { /* only like variables couple. */ smatrix_var = hypre_SStructPMatrixSMatrix(A_crse, var1, var1); stencils = hypre_SStructPMatrixSStencil(A_crse, var1, var1); stencil_size = hypre_StructStencilSize(stencils); a_ptrs = hypre_TAlloc(HYPRE_Real *, stencil_size, HYPRE_MEMORY_HOST); rank_stencils = hypre_TAlloc(HYPRE_Int, max_stencil_size, HYPRE_MEMORY_HOST); for (i = 0; i < stencil_size; i++) { hypre_CopyIndex(hypre_StructStencilElement(stencils, i), stencil_shape_i); MapStencilRank(stencil_shape_i, rank); rank_stencils[rank] = i; } centre = rank_stencils[0]; cgrid = hypre_SStructPGridSGrid(hypre_SStructPMatrixPGrid(A_crse), var1); cgrid_boxes = hypre_StructGridBoxes(cgrid); hypre_ForBoxI(ci, cgrid_boxes) { A_dbox = hypre_BoxArrayBox(hypre_StructMatrixDataSpace(smatrix_var), ci); fbox_bdy_ci = fbox_bdy[var1][ci]; for (i = 0; i < stencil_size; i++) { hypre_CopyIndex(hypre_StructStencilElement(stencils, i), stencil_shape_i); a_ptrs[i] = hypre_StructMatrixExtractPointerByIndex(smatrix_var, ci, stencil_shape_i); } /*------------------------------------------------------------------ * Loop over the boundaries of each patch inside cgrid_box ci. * These patch boxes must be coarsened to get the correct extents. *------------------------------------------------------------------*/ hypre_ForBoxArrayI(arrayi, fbox_bdy_ci) { fbox_bdy_ci_fi = hypre_BoxArrayArrayBoxArray(fbox_bdy_ci, arrayi); hypre_ForBoxI(fi, fbox_bdy_ci_fi) { fgrid_box = hypre_BoxArrayBox(fbox_bdy_ci_fi, fi); hypre_StructMapFineToCoarse(hypre_BoxIMin(fgrid_box), index_temp, stridef, hypre_BoxIMin(&fine_box)); hypre_StructMapFineToCoarse(hypre_BoxIMax(fgrid_box), index_temp, stridef, hypre_BoxIMax(&fine_box)); hypre_CopyIndex(hypre_BoxIMin(&fine_box), cstart); hypre_BoxGetSize(&fine_box, loop_size); #define DEVICE_VAR is_device_ptr(a_ptrs) hypre_BoxLoop1Begin(ndim, loop_size, A_dbox, cstart, stridec, iA); { HYPRE_Int i; for (i = 0; i < stencil_size; i++) { if (i != centre) { a_ptrs[centre][iA] -= a_ptrs[i][iA]; } } } hypre_BoxLoop1End(iA); #undef DEVICE_VAR } /* hypre_ForBoxI(fi, fbox_bdy_ci_fi) */ } /* hypre_ForBoxArrayI(arrayi, fbox_bdy_ci) */ } /* hypre_ForBoxI(ci, cgrid_boxes) */ hypre_TFree(a_ptrs, HYPRE_MEMORY_HOST); hypre_TFree(rank_stencils, HYPRE_MEMORY_HOST); } /* for (var1= 0; var1< nvars; var1++) */ for (var1 = 0; var1 < nvars; var1++) { cgrid = hypre_SStructPGridSGrid(hypre_SStructPMatrixPGrid(A_crse), var1); cgrid_boxes = hypre_StructGridBoxes(cgrid); fgrid = hypre_SStructPGridSGrid(hypre_SStructPMatrixPGrid(A_pmatrix), var1); fgrid_boxes = hypre_StructGridBoxes(fgrid); hypre_ForBoxI(ci, cgrid_boxes) { hypre_BoxArrayDestroy(fgrid_crse_extents[var1][ci]); hypre_BoxArrayDestroy(fbox_interior[var1][ci]); hypre_BoxArrayArrayDestroy(fbox_bdy[var1][ci]); hypre_TFree(interior_fboxi[var1][ci], HYPRE_MEMORY_HOST); hypre_TFree(bdy_fboxi[var1][ci], HYPRE_MEMORY_HOST); } hypre_TFree(fgrid_crse_extents[var1], HYPRE_MEMORY_HOST); hypre_TFree(fbox_interior[var1], HYPRE_MEMORY_HOST); hypre_TFree(fbox_bdy[var1], HYPRE_MEMORY_HOST); hypre_TFree(interior_fboxi[var1], HYPRE_MEMORY_HOST); hypre_TFree(bdy_fboxi[var1], HYPRE_MEMORY_HOST); hypre_ForBoxI(fi, fgrid_boxes) { hypre_TFree(cboxi_fboxes[var1][fi], HYPRE_MEMORY_HOST); } hypre_TFree(cboxi_fboxes[var1], HYPRE_MEMORY_HOST); hypre_TFree(cboxi_fcnt[var1], HYPRE_MEMORY_HOST); } hypre_TFree(fgrid_crse_extents, HYPRE_MEMORY_HOST); hypre_TFree(fbox_interior, HYPRE_MEMORY_HOST); hypre_TFree(fbox_bdy, HYPRE_MEMORY_HOST); hypre_TFree(interior_fboxi, HYPRE_MEMORY_HOST); hypre_TFree(bdy_fboxi, HYPRE_MEMORY_HOST); hypre_TFree(cboxi_fboxes, HYPRE_MEMORY_HOST); hypre_TFree(cboxi_fcnt, HYPRE_MEMORY_HOST); return 0; } hypre-2.33.0/src/sstruct_ls/fac_amr_rap.c000066400000000000000000000533271477326011500203400ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "_hypre_sstruct_ls.h" #include "_hypre_struct_mv.hpp" #include "fac.h" /*-------------------------------------------------------------------------- * hypre_AMR_RAP: Forms the coarse operators for all amr levels. * Given an amr composite matrix, the coarse grid operator is produced. * Nesting of amr levels is not assumed. Communication of chunks of the * coarse grid operator is performed. * * Note: The sstruct_grid of A and fac_A are the same. These are kept the * same so that the row ranks are the same. However, the generated * coarse-grid operators are re-distributed so that each processor has its * operator on its grid. *--------------------------------------------------------------------------*/ HYPRE_Int hypre_AMR_RAP( hypre_SStructMatrix *A, hypre_Index *rfactors, hypre_SStructMatrix **fac_A_ptr ) { MPI_Comm comm = hypre_SStructMatrixComm(A); HYPRE_Int ndim = hypre_SStructMatrixNDim(A); HYPRE_Int nparts = hypre_SStructMatrixNParts(A); hypre_SStructGraph *graph = hypre_SStructMatrixGraph(A); HYPRE_IJMatrix ij_A = hypre_SStructMatrixIJMatrix(A); HYPRE_Int matrix_type = hypre_SStructMatrixObjectType(A); hypre_SStructGrid *grid = hypre_SStructGraphGrid(graph); HYPRE_Int nUventries = hypre_SStructGraphNUVEntries(graph); HYPRE_Int *iUventries = hypre_SStructGraphIUVEntries(graph); hypre_SStructUVEntry **Uventries = hypre_SStructGraphUVEntries(graph); hypre_SStructUVEntry *Uventry; HYPRE_Int nUentries; hypre_CommPkg *amrA_comm_pkg; hypre_CommHandle *comm_handle; hypre_SStructMatrix *fac_A; hypre_SStructPMatrix *pmatrix, *fac_pmatrix; hypre_StructMatrix *smatrix, *fac_smatrix; hypre_Box *smatrix_dbox, *fac_smatrix_dbox; HYPRE_Real *smatrix_vals, *fac_smatrix_vals; hypre_SStructGrid *fac_grid; hypre_SStructGraph *fac_graph; hypre_SStructPGrid *f_pgrid, *c_pgrid; hypre_StructGrid *fgrid, *cgrid; hypre_BoxArray *grid_boxes, *cgrid_boxes; hypre_Box *grid_box; hypre_Box scaled_box; hypre_SStructPGrid *temp_pgrid; hypre_SStructStencil **temp_sstencils; hypre_SStructPMatrix *temp_pmatrix; hypre_SStructOwnInfoData ***owninfo; hypre_SStructRecvInfoData *recvinfo; hypre_SStructSendInfoData *sendinfo; hypre_BoxArrayArray *own_composite_cboxes, *own_boxes; hypre_BoxArray *own_composite_cbox; HYPRE_Int **own_cboxnums; hypre_BoxManager *fboxman, *cboxman; hypre_BoxManEntry *boxman_entry; hypre_Index ilower; HYPRE_Real *values; HYPRE_Int *ncols, tot_cols; HYPRE_BigInt *rows, *cols; hypre_SStructStencil *stencils; hypre_Index stencil_shape, loop_size; HYPRE_Int stencil_size, *stencil_vars; hypre_Index index, stride, zero_index; HYPRE_Int nvars, var1, var2, part, cbox; HYPRE_Int i, j, k, size; HYPRE_Int myid; HYPRE_Int ierr = 0; hypre_MPI_Comm_rank(comm, &myid); hypre_ClearIndex(zero_index); hypre_BoxInit(&scaled_box, ndim); hypre_SStructGraphRef(graph, &fac_graph); fac_grid = hypre_SStructGraphGrid(fac_graph); HYPRE_SStructMatrixCreate(comm, fac_graph, &fac_A); HYPRE_SStructMatrixInitialize(fac_A); /*-------------------------------------------------------------------------- * Copy all A's unstructured data and structured data that are not processed * into fac_A. Since the grids are the same for both matrices, the ranks * are also the same. Thus, the rows, cols, etc. for the IJ_matrix are * the same. *--------------------------------------------------------------------------*/ ncols = hypre_CTAlloc(HYPRE_Int, nUventries, HYPRE_MEMORY_HOST); rows = hypre_CTAlloc(HYPRE_BigInt, nUventries, HYPRE_MEMORY_HOST); tot_cols = 0; for (i = 0; i < nUventries; i++) { Uventry = Uventries[iUventries[i]]; tot_cols += hypre_SStructUVEntryNUEntries(Uventry); } cols = hypre_CTAlloc(HYPRE_BigInt, tot_cols, HYPRE_MEMORY_HOST); k = 0; for (i = 0; i < nUventries; i++) { Uventry = Uventries[iUventries[i]]; part = hypre_SStructUVEntryPart(Uventry); hypre_CopyIndex(hypre_SStructUVEntryIndex(Uventry), index); var1 = hypre_SStructUVEntryVar(Uventry); nUentries = hypre_SStructUVEntryNUEntries(Uventry); ncols[i] = nUentries; hypre_SStructGridFindBoxManEntry(grid, part, index, var1, &boxman_entry); hypre_SStructBoxManEntryGetGlobalRank(boxman_entry, index, &rows[i], matrix_type); for (j = 0; j < nUentries; j++) { cols[k++] = hypre_SStructUVEntryToRank(Uventry, j); } } values = hypre_CTAlloc(HYPRE_Real, tot_cols, HYPRE_MEMORY_HOST); HYPRE_IJMatrixGetValues(ij_A, nUventries, ncols, rows, cols, values); HYPRE_IJMatrixSetValues(hypre_SStructMatrixIJMatrix(fac_A), nUventries, ncols, (const HYPRE_BigInt *) rows, (const HYPRE_BigInt *) cols, (const HYPRE_Real *) values); hypre_TFree(ncols, HYPRE_MEMORY_HOST); hypre_TFree(rows, HYPRE_MEMORY_HOST); hypre_TFree(cols, HYPRE_MEMORY_HOST); hypre_TFree(values, HYPRE_MEMORY_HOST); owninfo = hypre_CTAlloc(hypre_SStructOwnInfoData **, nparts, HYPRE_MEMORY_HOST); for (part = (nparts - 1); part > 0; part--) { f_pgrid = hypre_SStructGridPGrid(fac_grid, part); c_pgrid = hypre_SStructGridPGrid(fac_grid, part - 1); nvars = hypre_SStructPGridNVars(f_pgrid); owninfo[part] = hypre_CTAlloc(hypre_SStructOwnInfoData *, nvars, HYPRE_MEMORY_HOST); for (var1 = 0; var1 < nvars; var1++) { fboxman = hypre_SStructGridBoxManager(fac_grid, part, var1); cboxman = hypre_SStructGridBoxManager(fac_grid, part - 1, var1); fgrid = hypre_SStructPGridSGrid(f_pgrid, var1); cgrid = hypre_SStructPGridSGrid(c_pgrid, var1); owninfo[part][var1] = hypre_SStructOwnInfo(fgrid, cgrid, cboxman, fboxman, rfactors[part]); } } hypre_SetIndex3(stride, 1, 1, 1); for (part = (nparts - 1); part > 0; part--) { f_pgrid = hypre_SStructGridPGrid(fac_grid, part); c_pgrid = hypre_SStructGridPGrid(fac_grid, part - 1); nvars = hypre_SStructPGridNVars(f_pgrid); for (var1 = 0; var1 < nvars; var1++) { fgrid = hypre_SStructPGridSGrid(f_pgrid, var1); cgrid = hypre_SStructPGridSGrid(c_pgrid, var1); grid_boxes = hypre_StructGridBoxes(fgrid); stencils = hypre_SStructGraphStencil(graph, part, var1); stencil_size = hypre_SStructStencilSize(stencils); stencil_vars = hypre_SStructStencilVars(stencils); if (part == (nparts - 1)) /* copy all fine data */ { pmatrix = hypre_SStructMatrixPMatrix(A, part); fac_pmatrix = hypre_SStructMatrixPMatrix(fac_A, part); hypre_ForBoxI(i, grid_boxes) { grid_box = hypre_BoxArrayBox(grid_boxes, i); hypre_BoxGetSize(grid_box, loop_size); hypre_CopyIndex(hypre_BoxIMin(grid_box), ilower); for (j = 0; j < stencil_size; j++) { var2 = stencil_vars[j]; smatrix = hypre_SStructPMatrixSMatrix(pmatrix, var1, var2); fac_smatrix = hypre_SStructPMatrixSMatrix(fac_pmatrix, var1, var2); smatrix_dbox = hypre_BoxArrayBox(hypre_StructMatrixDataSpace(smatrix), i); fac_smatrix_dbox = hypre_BoxArrayBox(hypre_StructMatrixDataSpace(fac_smatrix), i); hypre_CopyIndex(hypre_SStructStencilEntry(stencils, j), stencil_shape); smatrix_vals = hypre_StructMatrixExtractPointerByIndex(smatrix, i, stencil_shape); fac_smatrix_vals = hypre_StructMatrixExtractPointerByIndex(fac_smatrix, i, stencil_shape); #define DEVICE_VAR is_device_ptr(fac_smatrix_vals,smatrix_vals) hypre_BoxLoop2Begin(ndim, loop_size, smatrix_dbox, ilower, stride, iA, fac_smatrix_dbox, ilower, stride, iAc); { fac_smatrix_vals[iAc] = smatrix_vals[iA]; } hypre_BoxLoop2End(iA, iAc); #undef DEVICE_VAR } /* for (j = 0; j < stencil_size; j++) */ } /* hypre_ForBoxI(i, grid_boxes) */ } /* if (part == (nparts-1)) */ /*---------------------------------------------------------------------- * Copy all coarse data not underlying a fbox and on this processor- * i.e., the own_composite_cbox data. *----------------------------------------------------------------------*/ pmatrix = hypre_SStructMatrixPMatrix(A, part - 1); fac_pmatrix = hypre_SStructMatrixPMatrix(fac_A, part - 1); own_composite_cboxes = hypre_SStructOwnInfoDataCompositeCBoxes(owninfo[part][var1]); stencils = hypre_SStructGraphStencil(graph, part - 1, var1); stencil_size = hypre_SStructStencilSize(stencils); stencil_vars = hypre_SStructStencilVars(stencils); hypre_ForBoxArrayI(i, own_composite_cboxes) { own_composite_cbox = hypre_BoxArrayArrayBoxArray(own_composite_cboxes, i); hypre_ForBoxI(j, own_composite_cbox) { grid_box = hypre_BoxArrayBox(own_composite_cbox, j); hypre_BoxGetSize(grid_box, loop_size); hypre_CopyIndex(hypre_BoxIMin(grid_box), ilower); for (k = 0; k < stencil_size; k++) { var2 = stencil_vars[k]; smatrix = hypre_SStructPMatrixSMatrix(pmatrix, var1, var2); fac_smatrix = hypre_SStructPMatrixSMatrix(fac_pmatrix, var1, var2); smatrix_dbox = hypre_BoxArrayBox(hypre_StructMatrixDataSpace(smatrix), i); fac_smatrix_dbox = hypre_BoxArrayBox(hypre_StructMatrixDataSpace(fac_smatrix), i); hypre_CopyIndex(hypre_SStructStencilEntry(stencils, k), stencil_shape); smatrix_vals = hypre_StructMatrixExtractPointerByIndex(smatrix, i, stencil_shape); fac_smatrix_vals = hypre_StructMatrixExtractPointerByIndex(fac_smatrix, i, stencil_shape); #define DEVICE_VAR is_device_ptr(fac_smatrix_vals,smatrix_vals) hypre_BoxLoop2Begin(ndim, loop_size, smatrix_dbox, ilower, stride, iA, fac_smatrix_dbox, ilower, stride, iAc); { fac_smatrix_vals[iAc] = smatrix_vals[iA]; } hypre_BoxLoop2End(iA, iAc); #undef DEVICE_VAR } /* for (k = 0; k< stencil_size; k++) */ } /* hypre_ForBoxI(j, own_composite_cbox) */ } /* hypre_ForBoxArrayI(i, own_composite_cboxes) */ } /* for (var1= 0; var1< nvars; var1++) */ } /* for (part= (nparts-1); part> 0; part--) */ /*-------------------------------------------------------------------------- * All possible data has been copied into fac_A- i.e., the original amr * composite operator. Now we need to coarsen away the fboxes and the * interface connections. * * Algo.: * Loop from the finest amr_level to amr_level 1 * { * 1) coarsen the cf connections to get stencil connections from * the coarse nodes to the coarsened fbox nodes. * 2) coarsen the fboxes and the fc connections. These are coarsened * into a temp SStruct_PMatrix whose grid is the coarsened fgrid. * 3) copy all coarsened data that belongs on this processor and * communicate any that belongs to another processor. * } *--------------------------------------------------------------------------*/ for (part = (nparts - 1); part >= 1; part--) { hypre_AMR_CFCoarsen(A, fac_A, rfactors[part], part); /*----------------------------------------------------------------------- * Create the temp SStruct_PMatrix for coarsening away the level= part * boxes. *-----------------------------------------------------------------------*/ f_pgrid = hypre_SStructGridPGrid(fac_grid, part); c_pgrid = hypre_SStructGridPGrid(fac_grid, part - 1); grid_boxes = hypre_SStructPGridCellIBoxArray(f_pgrid); hypre_SStructPGridCreate(hypre_SStructGridComm(f_pgrid), ndim, &temp_pgrid); /*coarsen the fboxes.*/ for (i = 0; i < hypre_BoxArraySize(grid_boxes); i++) { grid_box = hypre_BoxArrayBox(grid_boxes, i); hypre_StructMapFineToCoarse(hypre_BoxIMin(grid_box), zero_index, rfactors[part], hypre_BoxIMin(&scaled_box)); hypre_StructMapFineToCoarse(hypre_BoxIMax(grid_box), zero_index, rfactors[part], hypre_BoxIMax(&scaled_box)); hypre_SStructPGridSetExtents(temp_pgrid, hypre_BoxIMin(&scaled_box), hypre_BoxIMax(&scaled_box)); } nvars = hypre_SStructPGridNVars(f_pgrid); hypre_SStructPGridSetVariables(temp_pgrid, nvars, hypre_SStructPGridVarTypes(f_pgrid)); hypre_SStructPGridAssemble(temp_pgrid); /* reference the sstruct_stencil of fac_pmatrix- to be used in temp_pmatrix */ temp_sstencils = hypre_CTAlloc(hypre_SStructStencil *, nvars, HYPRE_MEMORY_HOST); fac_pmatrix = hypre_SStructMatrixPMatrix(fac_A, part - 1); for (i = 0; i < nvars; i++) { hypre_SStructStencilRef(hypre_SStructPMatrixStencil(fac_pmatrix, i), &temp_sstencils[i]); } hypre_SStructPMatrixCreate(hypre_SStructPMatrixComm(fac_pmatrix), temp_pgrid, temp_sstencils, &temp_pmatrix); hypre_SStructPMatrixInitialize(temp_pmatrix); hypre_AMR_FCoarsen(A, fac_A, temp_pmatrix, rfactors[part], part); /*----------------------------------------------------------------------- * Extract the own_box data (boxes of coarsen data of this processor). *-----------------------------------------------------------------------*/ fac_pmatrix = hypre_SStructMatrixPMatrix(fac_A, part - 1); for (var1 = 0; var1 < nvars; var1++) { stencils = hypre_SStructGraphStencil(graph, part - 1, var1); stencil_size = hypre_SStructStencilSize(stencils); stencil_vars = hypre_SStructStencilVars(stencils); own_boxes = hypre_SStructOwnInfoDataOwnBoxes(owninfo[part][var1]); own_cboxnums = hypre_SStructOwnInfoDataOwnBoxNums(owninfo[part][var1]); size = hypre_SStructOwnInfoDataSize(owninfo[part][var1]); /* loop over all the cbox chunks */ for (i = 0; i < size; i++) { cgrid_boxes = hypre_BoxArrayArrayBoxArray(own_boxes, i); hypre_ForBoxI(j, cgrid_boxes) { grid_box = hypre_BoxArrayBox(cgrid_boxes, j); hypre_BoxGetSize(grid_box, loop_size); hypre_CopyIndex(hypre_BoxIMin(grid_box), ilower); cbox = own_cboxnums[i][j]; for (k = 0; k < stencil_size; k++) { var2 = stencil_vars[k]; smatrix = hypre_SStructPMatrixSMatrix(temp_pmatrix, var1, var2); fac_smatrix = hypre_SStructPMatrixSMatrix(fac_pmatrix, var1, var2); /*--------------------------------------------------------------- * note: the cbox number of the temp_grid is the same as the * fbox number, whereas the cbox numbers of the fac_grid is in * own_cboxnums- i.e., numbers i & cbox, respectively. *---------------------------------------------------------------*/ smatrix_dbox = hypre_BoxArrayBox(hypre_StructMatrixDataSpace(smatrix), i); fac_smatrix_dbox = hypre_BoxArrayBox(hypre_StructMatrixDataSpace(fac_smatrix), cbox); hypre_CopyIndex(hypre_SStructStencilEntry(stencils, k), stencil_shape); smatrix_vals = hypre_StructMatrixExtractPointerByIndex(smatrix, i, stencil_shape); fac_smatrix_vals = hypre_StructMatrixExtractPointerByIndex(fac_smatrix, cbox, stencil_shape); #define DEVICE_VAR is_device_ptr(fac_smatrix_vals,smatrix_vals) hypre_BoxLoop2Begin(ndim, loop_size, smatrix_dbox, ilower, stride, iA, fac_smatrix_dbox, ilower, stride, iAc); { fac_smatrix_vals[iAc] = smatrix_vals[iA]; } hypre_BoxLoop2End(iA, iAc); #undef DEVICE_VAR } /* for (k = 0; k < stencil_size; k++) */ } /* hypre_ForBoxI(j, cgrid_boxes) */ } /* for (i= 0; i< size; i++) */ hypre_SStructOwnInfoDataDestroy(owninfo[part][var1]); } /* for (var1= 0; var1< nvars; var1++) */ hypre_TFree(owninfo[part], HYPRE_MEMORY_HOST); /*----------------------------------------------------------------------- * Communication of off-process coarse data. A communication pkg is * needed. Thus, compute the communication info- sendboxes, recvboxes, * etc. *-----------------------------------------------------------------------*/ for (var1 = 0; var1 < nvars; var1++) { fboxman = hypre_SStructGridBoxManager(fac_grid, part, var1); cboxman = hypre_SStructGridBoxManager(fac_grid, part - 1, var1); fgrid = hypre_SStructPGridSGrid(f_pgrid, var1); cgrid = hypre_SStructPGridSGrid(c_pgrid, var1); sendinfo = hypre_SStructSendInfo(fgrid, cboxman, rfactors[part]); recvinfo = hypre_SStructRecvInfo(cgrid, fboxman, rfactors[part]); /*------------------------------------------------------------------- * need to check this for more than one variable- are the comm. info * for this sgrid okay for cross-variable matrices? *-------------------------------------------------------------------*/ for (var2 = 0; var2 < nvars; var2++) { fac_smatrix = hypre_SStructPMatrixSMatrix(fac_pmatrix, var1, var2); smatrix = hypre_SStructPMatrixSMatrix(temp_pmatrix, var1, var2); hypre_SStructAMRInterCommunication(sendinfo, recvinfo, hypre_StructMatrixDataSpace(smatrix), hypre_StructMatrixDataSpace(fac_smatrix), hypre_StructMatrixNumValues(smatrix), comm, &amrA_comm_pkg); hypre_InitializeCommunication(amrA_comm_pkg, hypre_StructMatrixData(smatrix), hypre_StructMatrixData(fac_smatrix), 0, 0, &comm_handle); hypre_FinalizeCommunication(comm_handle); hypre_CommPkgDestroy(amrA_comm_pkg); } hypre_SStructSendInfoDataDestroy(sendinfo); hypre_SStructRecvInfoDataDestroy(recvinfo); } /* for (var1= 0; var1< nvars; var1++) */ hypre_SStructPGridDestroy(temp_pgrid); hypre_SStructPMatrixDestroy(temp_pmatrix); } /* for (part= 0; part< nparts; part++) */ hypre_TFree(owninfo, HYPRE_MEMORY_HOST); HYPRE_SStructMatrixAssemble(fac_A); *fac_A_ptr = fac_A; return ierr; } hypre-2.33.0/src/sstruct_ls/fac_amr_zero_data.c000066400000000000000000000276431477326011500215300ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "_hypre_sstruct_ls.h" #include "fac.h" /*-------------------------------------------------------------------------- * hypre_ZeroAMRVectorData: Zeroes the data over the underlying coarse * indices of the refinement patches. *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ZeroAMRVectorData(hypre_SStructVector *b, HYPRE_Int *plevels, hypre_Index *rfactors ) { hypre_SStructGrid *grid = hypre_SStructVectorGrid(b); hypre_SStructPGrid *p_cgrid; hypre_StructGrid *cgrid; hypre_BoxArray *cgrid_boxes; hypre_Box *cgrid_box; hypre_BoxManager *fboxman; hypre_BoxManEntry **boxman_entries; HYPRE_Int nboxman_entries; hypre_Box scaled_box; hypre_Box intersect_box; HYPRE_Int npart = hypre_SStructVectorNParts(b); HYPRE_Int ndim = hypre_SStructVectorNDim(b); HYPRE_Int *levels; hypre_Index *refine_factors; hypre_Index temp_index, ilower, iupper; HYPRE_Int level; HYPRE_Int nvars, var; HYPRE_Int part, ci, rem, i, j, intersect_size; HYPRE_Real *values1; HYPRE_Int ierr = 0; hypre_BoxInit(&scaled_box, ndim); hypre_BoxInit(&intersect_box, ndim); levels = hypre_CTAlloc(HYPRE_Int, npart, HYPRE_MEMORY_HOST); refine_factors = hypre_CTAlloc(hypre_Index, npart, HYPRE_MEMORY_HOST); for (part = 0; part < npart; part++) { levels[plevels[part]] = part; for (i = 0; i < ndim; i++) { refine_factors[plevels[part]][i] = rfactors[part][i]; } for (i = ndim; i < 3; i++) { refine_factors[plevels[part]][i] = 1; } } hypre_ClearIndex(temp_index); for (level = npart - 1; level > 0; level--) { p_cgrid = hypre_SStructGridPGrid(grid, levels[level - 1]); nvars = hypre_SStructPGridNVars(p_cgrid); for (var = 0; var < nvars; var++) { /*--------------------------------------------------------------------- * For each variable, find the underlying boxes for each fine box. *---------------------------------------------------------------------*/ cgrid = hypre_SStructPGridSGrid(p_cgrid, var); cgrid_boxes = hypre_StructGridBoxes(cgrid); fboxman = hypre_SStructGridBoxManager(grid, levels[level], var); hypre_ForBoxI(ci, cgrid_boxes) { cgrid_box = hypre_BoxArrayBox(cgrid_boxes, ci); hypre_ClearIndex(temp_index); hypre_StructMapCoarseToFine(hypre_BoxIMin(cgrid_box), temp_index, refine_factors[level], hypre_BoxIMin(&scaled_box)); for (i = 0; i < ndim; i++) { temp_index[i] = refine_factors[level][i] - 1; } hypre_StructMapCoarseToFine(hypre_BoxIMax(cgrid_box), temp_index, refine_factors[level], hypre_BoxIMax(&scaled_box)); hypre_ClearIndex(temp_index); hypre_BoxManIntersect(fboxman, hypre_BoxIMin(&scaled_box), hypre_BoxIMax(&scaled_box), &boxman_entries, &nboxman_entries); for (i = 0; i < nboxman_entries; i++) { hypre_BoxManEntryGetExtents(boxman_entries[i], ilower, iupper); hypre_BoxSetExtents(&intersect_box, ilower, iupper); hypre_IntersectBoxes(&intersect_box, &scaled_box, &intersect_box); /* adjust the box so that it is divisible by refine_factors */ for (j = 0; j < ndim; j++) { rem = hypre_BoxIMin(&intersect_box)[j] % refine_factors[level][j]; if (rem) { hypre_BoxIMin(&intersect_box)[j] += refine_factors[level][j] - rem; } } hypre_StructMapFineToCoarse(hypre_BoxIMin(&intersect_box), temp_index, refine_factors[level], hypre_BoxIMin(&intersect_box)); hypre_StructMapFineToCoarse(hypre_BoxIMax(&intersect_box), temp_index, refine_factors[level], hypre_BoxIMax(&intersect_box)); intersect_size = hypre_BoxVolume(&intersect_box); if (intersect_size > 0) { /*------------------------------------------------------------ * Coarse underlying box found. Now zero off. *------------------------------------------------------------*/ values1 = hypre_CTAlloc(HYPRE_Real, intersect_size, HYPRE_MEMORY_HOST); HYPRE_SStructVectorSetBoxValues(b, levels[level - 1], hypre_BoxIMin(&intersect_box), hypre_BoxIMax(&intersect_box), var, values1); hypre_TFree(values1, HYPRE_MEMORY_HOST); } /* if (intersect_size > 0) */ } /* for (i= 0; i< nboxman_entries; i++) */ hypre_TFree(boxman_entries, HYPRE_MEMORY_HOST); } /* hypre_ForBoxI(ci, cgrid_boxes) */ } /* for (var= 0; var< nvars; var++) */ } /* for (level= max_level; level> 0; level--) */ hypre_TFree(levels, HYPRE_MEMORY_HOST); hypre_TFree(refine_factors, HYPRE_MEMORY_HOST); return ierr; } /*-------------------------------------------------------------------------- * hypre_ZeroAMRMatrixData: Zeroes the data over the underlying coarse * indices of the refinement patches between two levels. *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ZeroAMRMatrixData(hypre_SStructMatrix *A, HYPRE_Int part_crse, hypre_Index rfactors ) { hypre_SStructGraph *graph = hypre_SStructMatrixGraph(A); hypre_SStructGrid *grid = hypre_SStructGraphGrid(graph); HYPRE_Int ndim = hypre_SStructMatrixNDim(A); hypre_SStructPGrid *p_cgrid; hypre_StructGrid *cgrid; hypre_BoxArray *cgrid_boxes; hypre_Box *cgrid_box; hypre_BoxManager *fboxman; hypre_BoxManEntry **boxman_entries; HYPRE_Int nboxman_entries; hypre_Box scaled_box; hypre_Box intersect_box; hypre_SStructStencil *stencils; HYPRE_Int stencil_size; hypre_Index *stencil_shape; hypre_Index temp_index, ilower, iupper; HYPRE_Int nvars, var; HYPRE_Int ci, i, j, rem, intersect_size, rank; HYPRE_Real *values1, *values2; HYPRE_Int ierr = 0; hypre_BoxInit(&scaled_box, ndim); hypre_BoxInit(&intersect_box, ndim); p_cgrid = hypre_SStructGridPGrid(grid, part_crse); nvars = hypre_SStructPGridNVars(p_cgrid); for (var = 0; var < nvars; var++) { stencils = hypre_SStructGraphStencil(graph, part_crse, var); stencil_size = hypre_SStructStencilSize(stencils); stencil_shape = hypre_SStructStencilShape(stencils); /*--------------------------------------------------------------------- * For each variable, find the underlying boxes for each fine box. *---------------------------------------------------------------------*/ cgrid = hypre_SStructPGridSGrid(p_cgrid, var); cgrid_boxes = hypre_StructGridBoxes(cgrid); fboxman = hypre_SStructGridBoxManager(grid, part_crse + 1, var); hypre_ForBoxI(ci, cgrid_boxes) { cgrid_box = hypre_BoxArrayBox(cgrid_boxes, ci); hypre_ClearIndex(temp_index); hypre_StructMapCoarseToFine(hypre_BoxIMin(cgrid_box), temp_index, rfactors, hypre_BoxIMin(&scaled_box)); for (i = 0; i < ndim; i++) { temp_index[i] = rfactors[i] - 1; } hypre_StructMapCoarseToFine(hypre_BoxIMax(cgrid_box), temp_index, rfactors, hypre_BoxIMax(&scaled_box)); hypre_ClearIndex(temp_index); hypre_BoxManIntersect(fboxman, hypre_BoxIMin(&scaled_box), hypre_BoxIMax(&scaled_box), &boxman_entries, &nboxman_entries); for (i = 0; i < nboxman_entries; i++) { hypre_BoxManEntryGetExtents(boxman_entries[i], ilower, iupper); hypre_BoxSetExtents(&intersect_box, ilower, iupper); hypre_IntersectBoxes(&intersect_box, &scaled_box, &intersect_box); /* adjust the box so that it is divisible by refine_factors */ for (j = 0; j < ndim; j++) { rem = hypre_BoxIMin(&intersect_box)[j] % rfactors[j]; if (rem) { hypre_BoxIMin(&intersect_box)[j] += rfactors[j] - rem; } } hypre_StructMapFineToCoarse(hypre_BoxIMin(&intersect_box), temp_index, rfactors, hypre_BoxIMin(&intersect_box)); hypre_StructMapFineToCoarse(hypre_BoxIMax(&intersect_box), temp_index, rfactors, hypre_BoxIMax(&intersect_box)); intersect_size = hypre_BoxVolume(&intersect_box); if (intersect_size > 0) { /*------------------------------------------------------------ * Coarse underlying box found. Now zero off. *------------------------------------------------------------*/ values1 = hypre_CTAlloc(HYPRE_Real, intersect_size, HYPRE_MEMORY_HOST); values2 = hypre_TAlloc(HYPRE_Real, intersect_size, HYPRE_MEMORY_HOST); for (j = 0; j < intersect_size; j++) { values2[j] = 1.0; } for (j = 0; j < stencil_size; j++) { rank = hypre_abs(hypre_IndexX(stencil_shape[j])) + hypre_abs(hypre_IndexY(stencil_shape[j])) + hypre_abs(hypre_IndexZ(stencil_shape[j])); if (rank) { HYPRE_SStructMatrixSetBoxValues(A, part_crse, hypre_BoxIMin(&intersect_box), hypre_BoxIMax(&intersect_box), var, 1, &j, values1); } else { HYPRE_SStructMatrixSetBoxValues(A, part_crse, hypre_BoxIMin(&intersect_box), hypre_BoxIMax(&intersect_box), var, 1, &j, values2); } } hypre_TFree(values1, HYPRE_MEMORY_HOST); hypre_TFree(values2, HYPRE_MEMORY_HOST); } /* if (intersect_size > 0) */ } /* for (i= 0; i< nmap_entries; i++) */ hypre_TFree(boxman_entries, HYPRE_MEMORY_HOST); } /* hypre_ForBoxI(ci, cgrid_boxes) */ } /* for (var= 0; var< nvars; var++) */ return ierr; } hypre-2.33.0/src/sstruct_ls/fac_cf_coarsen.c000066400000000000000000000542351477326011500210200ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * OpenMP Problems * * Are private static arrays a problem? * ******************************************************************************/ #include "_hypre_sstruct_ls.h" #include "fac.h" #define MapStencilRank(stencil, rank) \ { \ HYPRE_Int ii,jj,kk; \ ii = hypre_IndexX(stencil); \ jj = hypre_IndexY(stencil); \ kk = hypre_IndexZ(stencil); \ if (ii==-1) \ ii=2; \ if (jj==-1) \ jj=2; \ if (kk==-1) \ kk=2; \ rank = ii + 3*jj + 9*kk; \ } #define InverseMapStencilRank(rank, stencil) \ { \ HYPRE_Int ij,ii,jj,kk; \ ij = (rank%9); \ ii = (ij%3); \ jj = (ij-ii)/3; \ kk = (rank-3*jj-ii)/9; \ if (ii==2) \ ii= -1; \ if (jj==2) \ jj= -1; \ if (kk==2) \ kk= -1; \ hypre_SetIndex3(stencil, ii, jj, kk); \ } #define AbsStencilShape(stencil, abs_shape) \ { \ HYPRE_Int ii,jj,kk; \ ii = hypre_IndexX(stencil); \ jj = hypre_IndexY(stencil); \ kk = hypre_IndexZ(stencil); \ abs_shape= hypre_abs(ii) + hypre_abs(jj) + hypre_abs(kk); \ } /*-------------------------------------------------------------------------- * hypre_AMR_CFCoarsen: Coarsens the CF interface to get the stencils * reaching into a coarsened fbox. Also sets the centre coefficient of CF * interface nodes to have "preserved" row sum. * * On entry, fac_A already has all the coefficient values of the cgrid * chunks that are not underlying a fbox. Note that A & fac_A have the * same grid & graph. Therefore, we will use A's grid & graph. * * ASSUMING ONLY LIKE-VARIABLES COUPLE THROUGH CF CONNECTIONS. *--------------------------------------------------------------------------*/ HYPRE_Int hypre_AMR_CFCoarsen( hypre_SStructMatrix * A, hypre_SStructMatrix * fac_A, hypre_Index refine_factors, HYPRE_Int level ) { MPI_Comm comm = hypre_SStructMatrixComm(A); hypre_SStructGraph *graph = hypre_SStructMatrixGraph(A); HYPRE_Int graph_type = hypre_SStructGraphObjectType(graph); hypre_SStructGrid *grid = hypre_SStructGraphGrid(graph); HYPRE_Int nUventries = hypre_SStructGraphNUVEntries(graph); HYPRE_IJMatrix ij_A = hypre_SStructMatrixIJMatrix(A); HYPRE_Int matrix_type = hypre_SStructMatrixObjectType(A); HYPRE_Int ndim = hypre_SStructMatrixNDim(A); hypre_SStructPMatrix *A_pmatrix; hypre_StructMatrix *smatrix_var; hypre_StructStencil *stencils; HYPRE_Int stencil_size; hypre_Index stencil_shape_i; hypre_Index loop_size; hypre_Box refined_box; HYPRE_Real **a_ptrs; hypre_Box *A_dbox; HYPRE_Int part_crse = level - 1; HYPRE_Int part_fine = level; hypre_BoxManager *fboxman; hypre_BoxManEntry **boxman_entries, *boxman_entry; HYPRE_Int nboxman_entries; hypre_Box boxman_entry_box; hypre_BoxArrayArray ***fgrid_cinterface_extents; hypre_StructGrid *cgrid; hypre_BoxArray *cgrid_boxes; hypre_Box *cgrid_box; hypre_Index node_extents; hypre_Index stridec, stridef; hypre_BoxArrayArray *cinterface_arrays; hypre_BoxArray *cinterface_array; hypre_Box *fgrid_cinterface; HYPRE_Int centre; HYPRE_Int ci, fi, boxi; HYPRE_Int max_stencil_size = 27; HYPRE_Int falseV = 0; HYPRE_Int trueV = 1; HYPRE_Int found; HYPRE_Int *stencil_ranks, *rank_stencils; HYPRE_BigInt rank, startrank; HYPRE_Real *vals; HYPRE_Int i, j; HYPRE_Int nvars, var1; hypre_Index lindex, zero_index; hypre_Index index1, index2; hypre_Index index_temp; hypre_SStructUVEntry *Uventry; HYPRE_Int nUentries, cnt1; HYPRE_Int box_array_size; HYPRE_Int *ncols; HYPRE_BigInt *rows, *cols; HYPRE_Int *temp1, *temp2; HYPRE_Int myid; hypre_MPI_Comm_rank(comm, &myid); hypre_SetIndex3(zero_index, 0, 0, 0); hypre_SetIndex3(lindex, 0, 0, 0); hypre_BoxInit(&refined_box, ndim); hypre_BoxInit(&boxman_entry_box, ndim); /*-------------------------------------------------------------------------- * Task: Coarsen the CF interface connections of A into fac_A so that * fac_A will have the stencil coefficients extending into a coarsened * fbox. The centre coefficient is constructed to preserve the row sum. *--------------------------------------------------------------------------*/ if (graph_type == HYPRE_SSTRUCT) { startrank = hypre_SStructGridGhstartRank(grid); } else if (graph_type == HYPRE_PARCSR) { startrank = hypre_SStructGridStartRank(grid); } else { startrank = 0; } /*-------------------------------------------------------------------------- * Fine grid strides by the refinement factors. *--------------------------------------------------------------------------*/ hypre_SetIndex3(stridec, 1, 1, 1); for (i = 0; i < ndim; i++) { stridef[i] = refine_factors[i]; } for (i = ndim; i < 3; i++) { stridef[i] = 1; } /*-------------------------------------------------------------------------- * Determine the c/f interface index boxes: fgrid_cinterface_extents. * These are between fpart= level and cpart= (level-1). The * fgrid_cinterface_extents are indexed by cboxes, but fboxes that * abutt a given cbox must be considered. Moreover, for each fbox, * we can have a c/f interface from a number of different stencil * directions- i.e., we have a boxarrayarray for each cbox, each * fbox leading to a boxarray. * * Algo.: For each cbox: * 1) refine & stretch by a unit in each dimension. * 2) boxman_intersect with the fgrid boxman to get all fboxes contained * or abutting this cbox. * 3) get the fgrid_cinterface_extents for each of these fboxes. * * fgrid_cinterface_extents[var1][ci] *--------------------------------------------------------------------------*/ A_pmatrix = hypre_SStructMatrixPMatrix(fac_A, part_crse); nvars = hypre_SStructPMatrixNVars(A_pmatrix); fgrid_cinterface_extents = hypre_TAlloc(hypre_BoxArrayArray **, nvars, HYPRE_MEMORY_HOST); for (var1 = 0; var1 < nvars; var1++) { fboxman = hypre_SStructGridBoxManager(grid, part_fine, var1); stencils = hypre_SStructPMatrixSStencil(A_pmatrix, var1, var1); cgrid = hypre_SStructPGridSGrid(hypre_SStructPMatrixPGrid(A_pmatrix), var1); cgrid_boxes = hypre_StructGridBoxes(cgrid); fgrid_cinterface_extents[var1] = hypre_TAlloc(hypre_BoxArrayArray *, hypre_BoxArraySize(cgrid_boxes), HYPRE_MEMORY_HOST); hypre_ForBoxI(ci, cgrid_boxes) { cgrid_box = hypre_BoxArrayBox(cgrid_boxes, ci); hypre_StructMapCoarseToFine(hypre_BoxIMin(cgrid_box), zero_index, refine_factors, hypre_BoxIMin(&refined_box)); hypre_SetIndex3(index1, refine_factors[0] - 1, refine_factors[1] - 1, refine_factors[2] - 1); hypre_StructMapCoarseToFine(hypre_BoxIMax(cgrid_box), index1, refine_factors, hypre_BoxIMax(&refined_box)); /*------------------------------------------------------------------------ * Stretch the refined_box so that a BoxManIntersect will get abutting * fboxes. *------------------------------------------------------------------------*/ for (i = 0; i < ndim; i++) { hypre_BoxIMin(&refined_box)[i] -= 1; hypre_BoxIMax(&refined_box)[i] += 1; } hypre_BoxManIntersect(fboxman, hypre_BoxIMin(&refined_box), hypre_BoxIMax(&refined_box), &boxman_entries, &nboxman_entries); fgrid_cinterface_extents[var1][ci] = hypre_BoxArrayArrayCreate(nboxman_entries, ndim); /*------------------------------------------------------------------------ * Get the fgrid_cinterface_extents using var1-var1 stencil (only like- * variables couple). *------------------------------------------------------------------------*/ if (stencils != NULL) { for (i = 0; i < nboxman_entries; i++) { hypre_BoxManEntryGetExtents(boxman_entries[i], hypre_BoxIMin(&boxman_entry_box), hypre_BoxIMax(&boxman_entry_box)); hypre_CFInterfaceExtents2(&boxman_entry_box, cgrid_box, stencils, refine_factors, hypre_BoxArrayArrayBoxArray(fgrid_cinterface_extents[var1][ci], i) ); } } hypre_TFree(boxman_entries, HYPRE_MEMORY_HOST); } /* hypre_ForBoxI(ci, cgrid_boxes) */ } /* for (var1= 0; var1< nvars; var1++) */ /*-------------------------------------------------------------------------- * STEP 1: * ADJUST THE ENTRIES ALONG THE C/F BOXES SO THAT THE COARSENED * C/F CONNECTION HAS THE APPROPRIATE ROW SUM. * WE ARE ASSUMING ONLY LIKE VARIABLES COUPLE. *--------------------------------------------------------------------------*/ for (var1 = 0; var1 < nvars; var1++) { cgrid = hypre_SStructPGridSGrid(hypre_SStructPMatrixPGrid(A_pmatrix), var1); cgrid_boxes = hypre_StructGridBoxes(cgrid); stencils = hypre_SStructPMatrixSStencil(A_pmatrix, var1, var1); /*---------------------------------------------------------------------- * Extract only where variables couple. *----------------------------------------------------------------------*/ if (stencils != NULL) { stencil_size = hypre_StructStencilSize(stencils); /*------------------------------------------------------------------ * stencil_ranks[i] = rank of stencil entry i. * rank_stencils[i] = stencil entry of rank i. * * These are needed in collapsing the unstructured connections to * a stencil connection. *------------------------------------------------------------------*/ stencil_ranks = hypre_TAlloc(HYPRE_Int, stencil_size, HYPRE_MEMORY_HOST); rank_stencils = hypre_TAlloc(HYPRE_Int, max_stencil_size, HYPRE_MEMORY_HOST); for (i = 0; i < max_stencil_size; i++) { rank_stencils[i] = -1; if (i < stencil_size) { stencil_ranks[i] = -1; } } for (i = 0; i < stencil_size; i++) { hypre_CopyIndex(hypre_StructStencilElement(stencils, i), stencil_shape_i); MapStencilRank(stencil_shape_i, j); stencil_ranks[i] = j; rank_stencils[stencil_ranks[i]] = i; } centre = rank_stencils[0]; smatrix_var = hypre_SStructPMatrixSMatrix(A_pmatrix, var1, var1); a_ptrs = hypre_TAlloc(HYPRE_Real *, stencil_size, HYPRE_MEMORY_HOST); hypre_ForBoxI(ci, cgrid_boxes) { cgrid_box = hypre_BoxArrayBox(cgrid_boxes, ci); cinterface_arrays = fgrid_cinterface_extents[var1][ci]; A_dbox = hypre_BoxArrayBox(hypre_StructMatrixDataSpace(smatrix_var), ci); /*----------------------------------------------------------------- * Ptrs to the correct data location. *-----------------------------------------------------------------*/ for (i = 0; i < stencil_size; i++) { hypre_CopyIndex(hypre_StructStencilElement(stencils, i), stencil_shape_i); a_ptrs[i] = hypre_StructMatrixExtractPointerByIndex(smatrix_var, ci, stencil_shape_i); } /*------------------------------------------------------------------- * Loop over the c/f interface boxes and set the centre to be the row * sum. Coarsen the c/f connection and set the centre to preserve * the row sum of the composite operator along the c/f interface. *-------------------------------------------------------------------*/ hypre_ForBoxArrayI(fi, cinterface_arrays) { cinterface_array = hypre_BoxArrayArrayBoxArray(cinterface_arrays, fi); box_array_size = hypre_BoxArraySize(cinterface_array); for (boxi = stencil_size; boxi < box_array_size; boxi++) { fgrid_cinterface = hypre_BoxArrayBox(cinterface_array, boxi); hypre_CopyIndex(hypre_BoxIMin(fgrid_cinterface), node_extents); hypre_BoxGetSize(fgrid_cinterface, loop_size); hypre_SerialBoxLoop1Begin(ndim, loop_size, A_dbox, node_extents, stridec, iA); { zypre_BoxLoopGetIndex(lindex); for (i = 0; i < stencil_size; i++) { if (i != centre) { a_ptrs[centre][iA] += a_ptrs[i][iA]; } } /*----------------------------------------------------------------- * Search for unstructured connections for this coarse node. Need * to compute the index of the node. We will "collapse" the * unstructured connections to the appropriate stencil entry. Thus * we need to serch for the stencil entry. *-----------------------------------------------------------------*/ index_temp[0] = node_extents[0] + lindex[0]; index_temp[1] = node_extents[1] + lindex[1]; index_temp[2] = node_extents[2] + lindex[2]; hypre_SStructGridFindBoxManEntry(grid, part_crse, index_temp, var1, &boxman_entry); hypre_SStructBoxManEntryGetGlobalRank(boxman_entry, index_temp, &rank, matrix_type); if (nUventries > 0) { found = falseV; if ((rank - startrank) >= hypre_SStructGraphIUVEntry(graph, 0) && (rank - startrank) <= hypre_SStructGraphIUVEntry(graph, nUventries - 1)) { found = trueV; } } /*----------------------------------------------------------------- * The graph has Uventries only if (nUventries > 0). Therefore, * check this. Only like variables contribute to the row sum. *-----------------------------------------------------------------*/ if (nUventries > 0 && found == trueV) { Uventry = hypre_SStructGraphUVEntry(graph, rank - startrank); if (Uventry != NULL) { nUentries = hypre_SStructUVEntryNUEntries(Uventry); /*----------------------------------------------------------- * extract only the connections to level part_fine and the * correct variable. *-----------------------------------------------------------*/ temp1 = hypre_CTAlloc(HYPRE_Int, nUentries, HYPRE_MEMORY_HOST); cnt1 = 0; for (i = 0; i < nUentries; i++) { if (hypre_SStructUVEntryToPart(Uventry, i) == part_fine && hypre_SStructUVEntryToVar(Uventry, i) == var1) { temp1[cnt1++] = i; } } ncols = hypre_TAlloc(HYPRE_Int, cnt1, HYPRE_MEMORY_HOST); rows = hypre_TAlloc(HYPRE_BigInt, cnt1, HYPRE_MEMORY_HOST); cols = hypre_TAlloc(HYPRE_BigInt, cnt1, HYPRE_MEMORY_HOST); temp2 = hypre_TAlloc(HYPRE_Int, cnt1, HYPRE_MEMORY_HOST); vals = hypre_CTAlloc(HYPRE_Real, cnt1, HYPRE_MEMORY_HOST); for (i = 0; i < cnt1; i++) { ncols[i] = 1; rows[i] = rank; cols[i] = hypre_SStructUVEntryToRank(Uventry, temp1[i]); /* determine the stencil connection pattern */ hypre_StructMapFineToCoarse( hypre_SStructUVEntryToIndex(Uventry, temp1[i]), zero_index, stridef, index2); hypre_SubtractIndexes(index2, index_temp, ndim, index1); MapStencilRank(index1, temp2[i]); /* zero off this stencil connection into the fbox */ if (temp2[i] < max_stencil_size) { j = rank_stencils[temp2[i]]; if (j >= 0) { a_ptrs[j][iA] = 0.0; } } } /* for (i= 0; i< cnt1; i++) */ hypre_TFree(temp1, HYPRE_MEMORY_HOST); HYPRE_IJMatrixGetValues(ij_A, cnt1, ncols, rows, cols, vals); for (i = 0; i < cnt1; i++) { a_ptrs[centre][iA] += vals[i]; } hypre_TFree(ncols, HYPRE_MEMORY_HOST); hypre_TFree(rows, HYPRE_MEMORY_HOST); hypre_TFree(cols, HYPRE_MEMORY_HOST); /* compute the connection to the coarsened fine box */ for (i = 0; i < cnt1; i++) { if (temp2[i] < max_stencil_size) { j = rank_stencils[temp2[i]]; if (j >= 0) { a_ptrs[j][iA] += vals[i]; } } } hypre_TFree(vals, HYPRE_MEMORY_HOST); hypre_TFree(temp2, HYPRE_MEMORY_HOST); /* centre connection which preserves the row sum */ for (i = 0; i < stencil_size; i++) { if (i != centre) { a_ptrs[centre][iA] -= a_ptrs[i][iA]; } } } /* if (Uventry != NULL) */ } /* if (nUventries > 0) */ } hypre_SerialBoxLoop1End(iA); } /* for (boxi= stencil_size; boxi< box_array_size; boxi++) */ } /* hypre_ForBoxArrayI(fi, cinterface_arrays) */ } /* hypre_ForBoxI(ci, cgrid_boxes) */ hypre_TFree(a_ptrs, HYPRE_MEMORY_HOST); hypre_TFree(stencil_ranks, HYPRE_MEMORY_HOST); hypre_TFree(rank_stencils, HYPRE_MEMORY_HOST); } /* if (stencils != NULL) */ } /* end var1 */ for (var1 = 0; var1 < nvars; var1++) { cgrid = hypre_SStructPGridSGrid(hypre_SStructPMatrixPGrid(A_pmatrix), var1); cgrid_boxes = hypre_StructGridBoxes(cgrid); hypre_ForBoxI(ci, cgrid_boxes) { hypre_BoxArrayArrayDestroy(fgrid_cinterface_extents[var1][ci]); } hypre_TFree(fgrid_cinterface_extents[var1], HYPRE_MEMORY_HOST); } hypre_TFree(fgrid_cinterface_extents, HYPRE_MEMORY_HOST); return 0; } hypre-2.33.0/src/sstruct_ls/fac_cfstencil_box.c000066400000000000000000000145711477326011500215370ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "_hypre_sstruct_ls.h" #include "fac.h" #define AbsStencilShape(stencil, abs_shape) \ {\ HYPRE_Int ii,jj,kk;\ ii = hypre_IndexX(stencil);\ jj = hypre_IndexY(stencil);\ kk = hypre_IndexZ(stencil);\ abs_shape= hypre_abs(ii) + hypre_abs(jj) + hypre_abs(kk); \ } /*-------------------------------------------------------------------------- * hypre_CF_StenBox: Given a cgrid_box, a fgrid_box, and a stencil_shape, * the stencil_shape direction. Returns an empty box if these two boxes * are not connected in the stencil_shape direction. *--------------------------------------------------------------------------*/ hypre_Box * hypre_CF_StenBox( hypre_Box *fgrid_box, hypre_Box *cgrid_box, hypre_Index stencil_shape, hypre_Index rfactors, HYPRE_Int ndim ) { hypre_Box coarsen_box; hypre_Box contracted_box; hypre_Box extended_box; hypre_Box intersect_box; hypre_Box *stenbox; hypre_Box shift_cbox, shift_ibox; hypre_Index size_cbox, size_ibox; hypre_Index temp_index; hypre_Index shift_index; HYPRE_Int i, remainder, intersect_size; hypre_ClearIndex(temp_index); stenbox = hypre_BoxCreate(ndim); hypre_BoxInit(&coarsen_box, ndim); hypre_BoxInit(&contracted_box, ndim); hypre_BoxInit(&extended_box, ndim); hypre_BoxInit(&intersect_box, ndim); hypre_BoxInit(&shift_cbox, ndim); hypre_BoxInit(&shift_ibox, ndim); /*-------------------------------------------------------------------------- * Coarsen the fine box, extend it, and shift it to determine if there * is a reach between fgrid_box and cgrid_box in the stencil_shape direction. * Note: the fine_box may not align as the index rule assumes: * [a_0,a_1,a_2]x[b_0,b_1,b_2], a_i= c_i*rfactors[i] * b_i= f_i*rfactors[i]+g_i, g_i= rfactors[i]-1. * When fine_box does not, then there must be a sibling box. fine_box * should be adjusted so that the flooring of the MapFineToCoarse does not * introduce extra coarse nodes in the coarsened box. Only the lower bound * needs to be adjusted. *--------------------------------------------------------------------------*/ hypre_CopyBox(fgrid_box, &contracted_box); for (i = 0; i < ndim; i++) { remainder = hypre_BoxIMin(&contracted_box)[i] % rfactors[i]; if (remainder) { hypre_BoxIMin(&contracted_box)[i] += rfactors[i] - remainder; } } hypre_StructMapFineToCoarse(hypre_BoxIMin(&contracted_box), temp_index, rfactors, hypre_BoxIMin(&coarsen_box)); hypre_StructMapFineToCoarse(hypre_BoxIMax(&contracted_box), temp_index, rfactors, hypre_BoxIMax(&coarsen_box)); hypre_ClearIndex(size_cbox); for (i = 0; i < ndim; i++) { size_cbox[i] = hypre_BoxSizeD(&coarsen_box, i) - 1; } /*--------------------------------------------------------------------- * Extend the coarsened fgrid_box by one layer in each direction so * that actual cf interface is reached. If only coarsen_box were * extended, the actual cf interface may not be reached. *---------------------------------------------------------------------*/ hypre_CopyBox(&coarsen_box, &extended_box); /*hypre_StructMapFineToCoarse(hypre_BoxIMin(fgrid_box), temp_index, rfactors, hypre_BoxIMin(&extended_box)); hypre_StructMapFineToCoarse(hypre_BoxIMax(fgrid_box), temp_index, rfactors, hypre_BoxIMax(&extended_box));*/ for (i = 0; i < ndim; i++) { hypre_BoxIMin(&extended_box)[i] -= 1; hypre_BoxIMax(&extended_box)[i] += 1; } hypre_IntersectBoxes(&extended_box, cgrid_box, &intersect_box); intersect_size = hypre_BoxVolume(&intersect_box); if (intersect_size == 0) { hypre_CopyBox(&intersect_box, stenbox); return stenbox; } hypre_ClearIndex(size_ibox); for (i = 0; i < ndim; i++) { size_ibox[i] = hypre_BoxSizeD(&intersect_box, i) - 1; } /*--------------------------------------------------------------------- * To find the box extents that must be loop over, we need to take the * "opposite" stencil_shape and shift the coarsen and extended boxes. *---------------------------------------------------------------------*/ hypre_SetIndex3(shift_index, -size_ibox[0]*stencil_shape[0], -size_ibox[1]*stencil_shape[1], -size_ibox[2]*stencil_shape[2]); hypre_AddIndexes(shift_index, hypre_BoxIMin(&intersect_box), 3, hypre_BoxIMin(&shift_ibox)); hypre_AddIndexes(shift_index, hypre_BoxIMax(&intersect_box), 3, hypre_BoxIMax(&shift_ibox)); hypre_IntersectBoxes(&shift_ibox, &intersect_box, &shift_ibox); hypre_SetIndex3(shift_index, -size_cbox[0]*stencil_shape[0], -size_cbox[1]*stencil_shape[1], -size_cbox[2]*stencil_shape[2]); hypre_AddIndexes(shift_index, hypre_BoxIMin(&coarsen_box), 3, hypre_BoxIMin(&shift_cbox)); hypre_AddIndexes(shift_index, hypre_BoxIMax(&coarsen_box), 3, hypre_BoxIMax(&shift_cbox)); hypre_IntersectBoxes(&shift_cbox, &coarsen_box, &shift_cbox); /*--------------------------------------------------------------------- * shift_ibox & shift_cbox will contain the loop extents. Shifting * shift_cbox by -stencil_shape and then intersecting with shift_ibox * gives the exact extents. *---------------------------------------------------------------------*/ hypre_SetIndex3(shift_index, -stencil_shape[0], -stencil_shape[1], -stencil_shape[2]); hypre_AddIndexes(shift_index, hypre_BoxIMin(&shift_cbox), 3, hypre_BoxIMin(&shift_cbox)); hypre_AddIndexes(shift_index, hypre_BoxIMax(&shift_cbox), 3, hypre_BoxIMax(&shift_cbox)); hypre_IntersectBoxes(&shift_cbox, &shift_ibox, stenbox); return stenbox; } hypre-2.33.0/src/sstruct_ls/fac_interp2.c000066400000000000000000001774121477326011500203040ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * OpenMP Problems * * Not sure about performace yet, so leaving the '#if 1' blocks below. * ******************************************************************************/ /****************************************************************************** * FAC composite level interpolation. * Identity interpolation of values away from underlying refinement patches; * linear inside patch. ******************************************************************************/ #include "_hypre_sstruct_ls.h" #include "fac.h" /*-------------------------------------------------------------------------- * hypre_FacSemiInterpData data structure *--------------------------------------------------------------------------*/ typedef struct { HYPRE_Int nvars; HYPRE_Int ndim; hypre_Index stride; hypre_SStructPVector *recv_cvectors; HYPRE_Int **recv_boxnum_map; /* mapping between the boxes of the recv_grid and the given grid */ hypre_BoxArrayArray **identity_arrayboxes; hypre_BoxArrayArray **ownboxes; HYPRE_Int ***own_cboxnums; hypre_CommPkg **interlevel_comm; hypre_CommPkg **gnodes_comm_pkg; HYPRE_Real **weights; } hypre_FacSemiInterpData2; /*-------------------------------------------------------------------------- * hypre_FacSemiInterpCreate *--------------------------------------------------------------------------*/ HYPRE_Int hypre_FacSemiInterpCreate2( void **fac_interp_vdata_ptr ) { HYPRE_Int ierr = 0; hypre_FacSemiInterpData2 *fac_interp_data; fac_interp_data = hypre_CTAlloc(hypre_FacSemiInterpData2, 1, HYPRE_MEMORY_HOST); *fac_interp_vdata_ptr = (void *) fac_interp_data; return ierr; } /*-------------------------------------------------------------------------- * hypre_FacSemiInterpDestroy *--------------------------------------------------------------------------*/ HYPRE_Int hypre_FacSemiInterpDestroy2( void *fac_interp_vdata) { HYPRE_Int ierr = 0; hypre_FacSemiInterpData2 *fac_interp_data = (hypre_FacSemiInterpData2 *)fac_interp_vdata; HYPRE_Int i, j, size; if (fac_interp_data) { hypre_SStructPVectorDestroy(fac_interp_data-> recv_cvectors); for (i = 0; i < (fac_interp_data-> nvars); i++) { hypre_TFree(fac_interp_data -> recv_boxnum_map[i], HYPRE_MEMORY_HOST); hypre_BoxArrayArrayDestroy(fac_interp_data -> identity_arrayboxes[i]); size = hypre_BoxArrayArraySize(fac_interp_data -> ownboxes[i]); hypre_BoxArrayArrayDestroy(fac_interp_data -> ownboxes[i]); for (j = 0; j < size; j++) { hypre_TFree(fac_interp_data -> own_cboxnums[i][j], HYPRE_MEMORY_HOST); } hypre_TFree(fac_interp_data -> own_cboxnums[i], HYPRE_MEMORY_HOST); hypre_CommPkgDestroy(fac_interp_data -> gnodes_comm_pkg[i]); hypre_CommPkgDestroy(fac_interp_data -> interlevel_comm[i]); } hypre_TFree(fac_interp_data -> recv_boxnum_map, HYPRE_MEMORY_HOST); hypre_TFree(fac_interp_data -> identity_arrayboxes, HYPRE_MEMORY_HOST); hypre_TFree(fac_interp_data -> ownboxes, HYPRE_MEMORY_HOST); hypre_TFree(fac_interp_data -> own_cboxnums, HYPRE_MEMORY_HOST); hypre_TFree(fac_interp_data -> gnodes_comm_pkg, HYPRE_MEMORY_HOST); hypre_TFree(fac_interp_data -> interlevel_comm, HYPRE_MEMORY_HOST); for (i = 0; i < (fac_interp_data -> ndim); i++) { hypre_TFree(fac_interp_data -> weights[i], HYPRE_MEMORY_HOST); } hypre_TFree(fac_interp_data -> weights, HYPRE_MEMORY_HOST); hypre_TFree(fac_interp_data, HYPRE_MEMORY_HOST); } return ierr; } /*-------------------------------------------------------------------------- * hypre_FacSemiInterpSetup2: * Note that an intermediate coarse SStruct_PVector is used in interpolating * the interlevel communicated data (coarse data). The data in these * intermediate vectors will be interpolated to the fine grid. *--------------------------------------------------------------------------*/ HYPRE_Int hypre_FacSemiInterpSetup2( void *fac_interp_vdata, hypre_SStructVector *e, hypre_SStructPVector *ec, hypre_Index rfactors) { HYPRE_Int ierr = 0; hypre_FacSemiInterpData2 *fac_interp_data = (hypre_FacSemiInterpData2 *)fac_interp_vdata; HYPRE_Int part_fine = 1; HYPRE_Int part_crse = 0; hypre_CommPkg **gnodes_comm_pkg; hypre_CommPkg **interlevel_comm; hypre_CommInfo *comm_info; hypre_SStructPVector *recv_cvectors; hypre_SStructPGrid *recv_cgrid; HYPRE_Int **recv_boxnum_map; hypre_SStructGrid *temp_grid; hypre_SStructPGrid *pgrid; hypre_SStructPVector *ef = hypre_SStructVectorPVector(e, part_fine); hypre_StructVector *e_var, *s_rc, *s_cvector; hypre_BoxArrayArray **identity_arrayboxes; hypre_BoxArrayArray **ownboxes; hypre_BoxArrayArray **send_boxes, *send_rboxes; HYPRE_Int ***send_processes; HYPRE_Int ***send_remote_boxnums; hypre_BoxArrayArray **recv_boxes, *recv_rboxes; HYPRE_Int ***recv_processes; HYPRE_Int ***recv_remote_boxnums; hypre_BoxArray *boxarray; hypre_BoxArray *tmp_boxarray, *intersect_boxes; hypre_Box box, scaled_box; HYPRE_Int ***own_cboxnums; hypre_BoxManager *boxman1; hypre_BoxManEntry **boxman_entries; HYPRE_Int nboxman_entries; HYPRE_Int nvars = hypre_SStructPVectorNVars(ef); HYPRE_Int vars; hypre_Index zero_index, index; hypre_Index ilower, iupper; HYPRE_Int *num_ghost; HYPRE_Int ndim, i, j, k, fi, ci; HYPRE_Int cnt1, cnt2; HYPRE_Int proc, myproc, tot_procs; HYPRE_Int num_values; HYPRE_Real **weights; HYPRE_Real refine_factors_2recp[3]; hypre_Index refine_factors_half; hypre_MPI_Comm_rank(hypre_MPI_COMM_WORLD, &myproc); hypre_MPI_Comm_size(hypre_MPI_COMM_WORLD, &tot_procs); ndim = hypre_SStructPGridNDim(hypre_SStructPVectorPGrid(ef)); hypre_SetIndex3(zero_index, 0, 0, 0); hypre_BoxInit(&box, ndim); hypre_BoxInit(&scaled_box, ndim); /*------------------------------------------------------------------------ * Intralevel communication structures- * A communication pkg must be created for each StructVector. Stencils * are needed in creating the packages- we are assuming that the same * stencil pattern for each StructVector, i.e., linear interpolation for * each variable. *------------------------------------------------------------------------*/ gnodes_comm_pkg = hypre_CTAlloc(hypre_CommPkg *, nvars, HYPRE_MEMORY_HOST); for (vars = 0; vars < nvars; vars++) { e_var = hypre_SStructPVectorSVector(ec, vars); num_ghost = hypre_StructVectorNumGhost(e_var); hypre_CreateCommInfoFromNumGhost(hypre_StructVectorGrid(e_var), num_ghost, &comm_info); hypre_CommPkgCreate(comm_info, hypre_StructVectorDataSpace(e_var), hypre_StructVectorDataSpace(e_var), 1, NULL, 0, hypre_StructVectorComm(e_var), &gnodes_comm_pkg[vars]); hypre_CommInfoDestroy(comm_info); } (fac_interp_data -> ndim) = ndim; (fac_interp_data -> nvars) = nvars; (fac_interp_data -> gnodes_comm_pkg) = gnodes_comm_pkg; hypre_CopyIndex(rfactors, (fac_interp_data -> stride)); /*------------------------------------------------------------------------ * Interlevel communication structures. * * Algorithm for identity_boxes: For each cbox on this processor, refine * it and intersect it with the fmap. * (cbox - all coarsened fmap_intersect boxes)= identity chunks * for cbox. * * Algorithm for own_boxes (fullwgted boxes on this processor): For each * fbox, coarsen it and boxmap intersect it with cmap. * (cmap_intersect boxes on myproc)= ownboxes * for this fbox. * * Algorithm for recv_box: For each fbox, coarsen it and boxmap intersect * it with cmap. * (cmap_intersect boxes off_proc)= unstretched recv_boxes. * These boxes are stretched by one in each direction so that the ghostlayer * is also communicated. However, the recv_grid will consists of the * unstretched boxes so that overlapping does not occur. *--------------------------------------------------------------------------*/ identity_arrayboxes = hypre_CTAlloc(hypre_BoxArrayArray *, nvars, HYPRE_MEMORY_HOST); pgrid = hypre_SStructPVectorPGrid(ec); hypre_ClearIndex(index); for (i = 0; i < ndim; i++) { index[i] = rfactors[i] - 1; } tmp_boxarray = hypre_BoxArrayCreate(0, ndim); for (vars = 0; vars < nvars; vars++) { boxman1 = hypre_SStructGridBoxManager(hypre_SStructVectorGrid(e), part_fine, vars); boxarray = hypre_StructGridBoxes(hypre_SStructPGridSGrid(pgrid, vars)); identity_arrayboxes[vars] = hypre_BoxArrayArrayCreate(hypre_BoxArraySize(boxarray), ndim); hypre_ForBoxI(ci, boxarray) { box = *hypre_BoxArrayBox(boxarray, ci); hypre_AppendBox(&box, hypre_BoxArrayArrayBoxArray(identity_arrayboxes[vars], ci)); hypre_StructMapCoarseToFine(hypre_BoxIMin(&box), zero_index, rfactors, hypre_BoxIMin(&scaled_box)); hypre_StructMapCoarseToFine(hypre_BoxIMax(&box), index, rfactors, hypre_BoxIMax(&scaled_box)); hypre_BoxManIntersect(boxman1, hypre_BoxIMin(&scaled_box), hypre_BoxIMax(&scaled_box), &boxman_entries, &nboxman_entries); intersect_boxes = hypre_BoxArrayCreate(0, ndim); for (i = 0; i < nboxman_entries; i++) { hypre_BoxManEntryGetExtents(boxman_entries[i], ilower, iupper); hypre_BoxSetExtents(&box, ilower, iupper); hypre_IntersectBoxes(&box, &scaled_box, &box); /* contract this refined box so that only the coarse nodes on this processor will be subtracted. */ for (j = 0; j < ndim; j++) { k = hypre_BoxIMin(&box)[j] % rfactors[j]; if (k) { hypre_BoxIMin(&box)[j] += rfactors[j] - k; } } hypre_StructMapFineToCoarse(hypre_BoxIMin(&box), zero_index, rfactors, hypre_BoxIMin(&box)); hypre_StructMapFineToCoarse(hypre_BoxIMax(&box), zero_index, rfactors, hypre_BoxIMax(&box)); hypre_AppendBox(&box, intersect_boxes); } hypre_SubtractBoxArrays(hypre_BoxArrayArrayBoxArray(identity_arrayboxes[vars], ci), intersect_boxes, tmp_boxarray); hypre_MinUnionBoxes(hypre_BoxArrayArrayBoxArray(identity_arrayboxes[vars], ci)); hypre_TFree(boxman_entries, HYPRE_MEMORY_HOST); hypre_BoxArrayDestroy(intersect_boxes); } } hypre_BoxArrayDestroy(tmp_boxarray); fac_interp_data -> identity_arrayboxes = identity_arrayboxes; /*-------------------------------------------------------------------------- * fboxes are coarsened. For each coarsened fbox, we need a boxarray of * recvboxes or ownboxes. *--------------------------------------------------------------------------*/ ownboxes = hypre_CTAlloc(hypre_BoxArrayArray *, nvars, HYPRE_MEMORY_HOST); own_cboxnums = hypre_CTAlloc(HYPRE_Int **, nvars, HYPRE_MEMORY_HOST); recv_boxes = hypre_CTAlloc(hypre_BoxArrayArray *, nvars, HYPRE_MEMORY_HOST); recv_processes = hypre_CTAlloc(HYPRE_Int **, nvars, HYPRE_MEMORY_HOST); /* dummy pointer for CommInfoCreate */ recv_remote_boxnums = hypre_CTAlloc(HYPRE_Int **, nvars, HYPRE_MEMORY_HOST); hypre_ClearIndex(index); for (i = 0; i < ndim; i++) { index[i] = 1; } for (vars = 0; vars < nvars; vars++) { boxman1 = hypre_SStructGridBoxManager(hypre_SStructVectorGrid(e), part_crse, vars); pgrid = hypre_SStructPVectorPGrid(ef); boxarray = hypre_StructGridBoxes(hypre_SStructPGridSGrid(pgrid, vars)); ownboxes[vars] = hypre_BoxArrayArrayCreate(hypre_BoxArraySize(boxarray), ndim); own_cboxnums[vars] = hypre_CTAlloc(HYPRE_Int *, hypre_BoxArraySize(boxarray), HYPRE_MEMORY_HOST); recv_boxes[vars] = hypre_BoxArrayArrayCreate(hypre_BoxArraySize(boxarray), ndim); recv_processes[vars] = hypre_CTAlloc(HYPRE_Int *, hypre_BoxArraySize(boxarray), HYPRE_MEMORY_HOST); recv_remote_boxnums[vars] = hypre_CTAlloc(HYPRE_Int *, hypre_BoxArraySize(boxarray), HYPRE_MEMORY_HOST); hypre_ForBoxI(fi, boxarray) { box = *hypre_BoxArrayBox(boxarray, fi); /*-------------------------------------------------------------------- * Adjust this box so that only the coarse nodes inside the fine box * are extracted. *--------------------------------------------------------------------*/ for (j = 0; j < ndim; j++) { k = hypre_BoxIMin(&box)[j] % rfactors[j]; if (k) { hypre_BoxIMin(&box)[j] += rfactors[j] - k; } } hypre_StructMapFineToCoarse(hypre_BoxIMin(&box), zero_index, rfactors, hypre_BoxIMin(&scaled_box)); hypre_StructMapFineToCoarse(hypre_BoxIMax(&box), zero_index, rfactors, hypre_BoxIMax(&scaled_box)); hypre_BoxManIntersect(boxman1, hypre_BoxIMin(&scaled_box), hypre_BoxIMax(&scaled_box), &boxman_entries, &nboxman_entries); cnt1 = 0; cnt2 = 0; for (i = 0; i < nboxman_entries; i++) { hypre_SStructBoxManEntryGetProcess(boxman_entries[i], &proc); if (proc == myproc) { cnt1++; } else { cnt2++; } } own_cboxnums[vars][fi] = hypre_CTAlloc(HYPRE_Int, cnt1, HYPRE_MEMORY_HOST); recv_processes[vars][fi] = hypre_CTAlloc(HYPRE_Int, cnt2, HYPRE_MEMORY_HOST); recv_remote_boxnums[vars][fi] = hypre_CTAlloc(HYPRE_Int, cnt2, HYPRE_MEMORY_HOST); cnt1 = 0; cnt2 = 0; for (i = 0; i < nboxman_entries; i++) { hypre_BoxManEntryGetExtents(boxman_entries[i], ilower, iupper); hypre_BoxSetExtents(&box, ilower, iupper); hypre_IntersectBoxes(&box, &scaled_box, &box); hypre_SStructBoxManEntryGetProcess(boxman_entries[i], &proc); if (proc == myproc) { hypre_AppendBox(&box, hypre_BoxArrayArrayBoxArray(ownboxes[vars], fi)); hypre_SStructBoxManEntryGetBoxnum(boxman_entries[i], &own_cboxnums[vars][fi][cnt1]); cnt1++; } else { /* extend the box so all the required data for interpolation is recvd. */ hypre_SubtractIndexes(hypre_BoxIMin(&box), index, 3, hypre_BoxIMin(&box)); hypre_AddIndexes(hypre_BoxIMax(&box), index, 3, hypre_BoxIMax(&box)); hypre_AppendBox(&box, hypre_BoxArrayArrayBoxArray(recv_boxes[vars], fi)); recv_processes[vars][fi][cnt2] = proc; cnt2++; } } hypre_TFree(boxman_entries, HYPRE_MEMORY_HOST); } /* hypre_ForBoxI(fi, boxarray) */ } /* for (vars= 0; vars< nvars; vars++) */ (fac_interp_data -> ownboxes) = ownboxes; (fac_interp_data -> own_cboxnums) = own_cboxnums; /*-------------------------------------------------------------------------- * With the recv'ed boxes form a SStructPGrid and a SStructGrid. The * SStructGrid is needed to generate a box_manager (so that a local box ordering * for the remote_boxnums are obtained). Record the recv_boxnum/fbox_num * mapping. That is, we interpolate a recv_box l to a fine box m, generally * l != m since the recv_grid and fgrid do not agree. *--------------------------------------------------------------------------*/ HYPRE_SStructGridCreate(hypre_SStructPVectorComm(ec), ndim, 1, &temp_grid); hypre_SStructPGridCreate(hypre_SStructPVectorComm(ec), ndim, &recv_cgrid); recv_boxnum_map = hypre_CTAlloc(HYPRE_Int *, nvars, HYPRE_MEMORY_HOST); cnt2 = 0; hypre_ClearIndex(index); for (i = 0; i < ndim; i++) { index[i] = 1; } for (vars = 0; vars < nvars; vars++) { cnt1 = 0; hypre_ForBoxArrayI(i, recv_boxes[vars]) { boxarray = hypre_BoxArrayArrayBoxArray(recv_boxes[vars], i); cnt1 += hypre_BoxArraySize(boxarray); } recv_boxnum_map[vars] = hypre_CTAlloc(HYPRE_Int, cnt1, HYPRE_MEMORY_HOST); cnt1 = 0; hypre_ForBoxArrayI(i, recv_boxes[vars]) { boxarray = hypre_BoxArrayArrayBoxArray(recv_boxes[vars], i); hypre_ForBoxI(j, boxarray) { box = *hypre_BoxArrayBox(boxarray, j); /* contract the box its actual size. */ hypre_AddIndexes(hypre_BoxIMin(&box), index, 3, hypre_BoxIMin(&box)); hypre_SubtractIndexes(hypre_BoxIMax(&box), index, 3, hypre_BoxIMax(&box)); hypre_SStructPGridSetExtents(recv_cgrid, hypre_BoxIMin(&box), hypre_BoxIMax(&box)); HYPRE_SStructGridSetExtents(temp_grid, 0, hypre_BoxIMin(&box), hypre_BoxIMax(&box)); recv_boxnum_map[vars][cnt1] = i; /* record the fbox num. i */ cnt1++; cnt2++; } } } /*------------------------------------------------------------------------ * When there are no boxes to communicate, set the temp_grid to have a * box of size zero. This is needed so that this SStructGrid can be * assembled. This is done only when this only one processor. *------------------------------------------------------------------------*/ if (cnt2 == 0) { /* min_index > max_index so that the box has volume zero. */ hypre_BoxSetExtents(&box, index, zero_index); hypre_SStructPGridSetExtents(recv_cgrid, hypre_BoxIMin(&box), hypre_BoxIMax(&box)); HYPRE_SStructGridSetExtents(temp_grid, 0, hypre_BoxIMin(&box), hypre_BoxIMax(&box)); } HYPRE_SStructGridSetVariables(temp_grid, 0, hypre_SStructPGridNVars(pgrid), hypre_SStructPGridVarTypes(pgrid)); HYPRE_SStructGridAssemble(temp_grid); hypre_SStructPGridSetVariables(recv_cgrid, nvars, hypre_SStructPGridVarTypes(pgrid) ); hypre_SStructPGridAssemble(recv_cgrid); hypre_SStructPVectorCreate(hypre_SStructPGridComm(recv_cgrid), recv_cgrid, &recv_cvectors); hypre_SStructPVectorInitialize(recv_cvectors); hypre_SStructPVectorAssemble(recv_cvectors); fac_interp_data -> recv_cvectors = recv_cvectors; fac_interp_data -> recv_boxnum_map = recv_boxnum_map; /* pgrid recv_cgrid no longer needed. */ hypre_SStructPGridDestroy(recv_cgrid); /*------------------------------------------------------------------------ * Send_boxes. * Algorithm for send_boxes: For each cbox on this processor, box_map * intersect it with temp_grid's map. * (intersection boxes off-proc)= send_boxes for this cbox. * Note that the send_boxes will be stretched to include the ghostlayers. * This guarantees that all the data required for linear interpolation * will be on the processor. Also, note that the remote_boxnums are * with respect to the recv_cgrid box numbering. *--------------------------------------------------------------------------*/ send_boxes = hypre_CTAlloc(hypre_BoxArrayArray *, nvars, HYPRE_MEMORY_HOST); send_processes = hypre_CTAlloc(HYPRE_Int **, nvars, HYPRE_MEMORY_HOST); send_remote_boxnums = hypre_CTAlloc(HYPRE_Int **, nvars, HYPRE_MEMORY_HOST); hypre_ClearIndex(index); for (i = 0; i < ndim; i++) { index[i] = 1; } for (vars = 0; vars < nvars; vars++) { /*------------------------------------------------------------------- * send boxes: intersect with temp_grid that has all the recv boxes- * These local box_nums may not be the same as the local box_nums of * the coarse grid. *-------------------------------------------------------------------*/ boxman1 = hypre_SStructGridBoxManager(temp_grid, 0, vars); pgrid = hypre_SStructPVectorPGrid(ec); boxarray = hypre_StructGridBoxes(hypre_SStructPGridSGrid(pgrid, vars)); send_boxes[vars] = hypre_BoxArrayArrayCreate(hypre_BoxArraySize(boxarray), ndim); send_processes[vars] = hypre_CTAlloc(HYPRE_Int *, hypre_BoxArraySize(boxarray), HYPRE_MEMORY_HOST); send_remote_boxnums[vars] = hypre_CTAlloc(HYPRE_Int *, hypre_BoxArraySize(boxarray), HYPRE_MEMORY_HOST); hypre_ForBoxI(ci, boxarray) { box = *hypre_BoxArrayBox(boxarray, ci); hypre_BoxSetExtents(&scaled_box, hypre_BoxIMin(&box), hypre_BoxIMax(&box)); hypre_BoxManIntersect(boxman1, hypre_BoxIMin(&scaled_box), hypre_BoxIMax(&scaled_box), &boxman_entries, &nboxman_entries); cnt1 = 0; for (i = 0; i < nboxman_entries; i++) { hypre_SStructBoxManEntryGetProcess(boxman_entries[i], &proc); if (proc != myproc) { cnt1++; } } send_processes[vars][ci] = hypre_CTAlloc(HYPRE_Int, cnt1, HYPRE_MEMORY_HOST); send_remote_boxnums[vars][ci] = hypre_CTAlloc(HYPRE_Int, cnt1, HYPRE_MEMORY_HOST); cnt1 = 0; for (i = 0; i < nboxman_entries; i++) { hypre_BoxManEntryGetExtents(boxman_entries[i], ilower, iupper); hypre_BoxSetExtents(&box, ilower, iupper); hypre_IntersectBoxes(&box, &scaled_box, &box); hypre_SStructBoxManEntryGetProcess(boxman_entries[i], &proc); if (proc != myproc) { /* strech the box */ hypre_SubtractIndexes(hypre_BoxIMin(&box), index, 3, hypre_BoxIMin(&box)); hypre_AddIndexes(hypre_BoxIMax(&box), index, 3, hypre_BoxIMax(&box)); hypre_AppendBox(&box, hypre_BoxArrayArrayBoxArray(send_boxes[vars], ci)); send_processes[vars][ci][cnt1] = proc; hypre_SStructBoxManEntryGetBoxnum( boxman_entries[i], &send_remote_boxnums[vars][ci][cnt1]); cnt1++; } } hypre_TFree(boxman_entries, HYPRE_MEMORY_HOST); } /* hypre_ForBoxI(ci, boxarray) */ } /* for (vars= 0; vars< nvars; vars++) */ /*-------------------------------------------------------------------------- * Can disgard temp_grid now- only needed it's box_man info, *--------------------------------------------------------------------------*/ HYPRE_SStructGridDestroy(temp_grid); /*-------------------------------------------------------------------------- * Can create the interlevel_comm. *--------------------------------------------------------------------------*/ interlevel_comm = hypre_CTAlloc(hypre_CommPkg *, nvars, HYPRE_MEMORY_HOST); num_values = 1; for (vars = 0; vars < nvars; vars++) { s_rc = hypre_SStructPVectorSVector(ec, vars); s_cvector = hypre_SStructPVectorSVector(recv_cvectors, vars); send_rboxes = hypre_BoxArrayArrayDuplicate(send_boxes[vars]); recv_rboxes = hypre_BoxArrayArrayDuplicate(recv_boxes[vars]); hypre_CommInfoCreate(send_boxes[vars], recv_boxes[vars], send_processes[vars], recv_processes[vars], send_remote_boxnums[vars], recv_remote_boxnums[vars], send_rboxes, recv_rboxes, 1, &comm_info); hypre_CommPkgCreate(comm_info, hypre_StructVectorDataSpace(s_rc), hypre_StructVectorDataSpace(s_cvector), num_values, NULL, 0, hypre_StructVectorComm(s_rc), &interlevel_comm[vars]); hypre_CommInfoDestroy(comm_info); } hypre_TFree(send_boxes, HYPRE_MEMORY_HOST); hypre_TFree(recv_boxes, HYPRE_MEMORY_HOST); hypre_TFree(send_processes, HYPRE_MEMORY_HOST); hypre_TFree(recv_processes, HYPRE_MEMORY_HOST); hypre_TFree(send_remote_boxnums, HYPRE_MEMORY_HOST); hypre_TFree(recv_remote_boxnums, HYPRE_MEMORY_HOST); (fac_interp_data -> interlevel_comm) = interlevel_comm; /* interpolation weights */ weights = hypre_TAlloc(HYPRE_Real *, ndim, HYPRE_MEMORY_HOST); for (i = 0; i < ndim; i++) { weights[i] = hypre_CTAlloc(HYPRE_Real, rfactors[i] + 1, HYPRE_MEMORY_HOST); } hypre_ClearIndex(refine_factors_half); /* hypre_ClearIndex(refine_factors_2recp);*/ for (i = 0; i < ndim; i++) { refine_factors_half[i] = rfactors[i] / 2; refine_factors_2recp[i] = 1.0 / (2.0 * rfactors[i]); } for (i = 0; i < ndim; i++) { for (j = 0; j <= refine_factors_half[i]; j++) { weights[i][j] = refine_factors_2recp[i] * (rfactors[i] + 2 * j - 1.0); } for (j = (refine_factors_half[i] + 1); j <= rfactors[i]; j++) { weights[i][j] = refine_factors_2recp[i] * (2 * j - rfactors[i] - 1.0); } } (fac_interp_data -> weights) = weights; return ierr; } HYPRE_Int hypre_FAC_IdentityInterp2(void * fac_interp_vdata, hypre_SStructPVector * xc, hypre_SStructVector * e) { hypre_FacSemiInterpData2 *interp_data = (hypre_FacSemiInterpData2 *)fac_interp_vdata; hypre_BoxArrayArray **identity_boxes = interp_data-> identity_arrayboxes; HYPRE_Int part_crse = 0; HYPRE_Int ierr = 0; /*----------------------------------------------------------------------- * Compute e at coarse points (injection). * The pgrid of xc is the same as the part_csre pgrid of e. *-----------------------------------------------------------------------*/ hypre_SStructPartialPCopy(xc, hypre_SStructVectorPVector(e, part_crse), identity_boxes); return ierr; } /*------------------------------------------------------------------------- * Linear interpolation. Interpolate the vector first by interpolating the * values in ownboxes and then values in recv_cvectors (the interlevel * communicated data). *-------------------------------------------------------------------------*/ HYPRE_Int hypre_FAC_WeightedInterp2(void *fac_interp_vdata, hypre_SStructPVector *xc, hypre_SStructVector *e_parts) { HYPRE_Int ierr = 0; hypre_FacSemiInterpData2 *interp_data = (hypre_FacSemiInterpData2 *)fac_interp_vdata; hypre_CommPkg **comm_pkg = interp_data-> gnodes_comm_pkg; hypre_CommPkg **interlevel_comm = interp_data-> interlevel_comm; hypre_SStructPVector *recv_cvectors = interp_data-> recv_cvectors; HYPRE_Int **recv_boxnum_map = interp_data-> recv_boxnum_map; hypre_BoxArrayArray **ownboxes = interp_data-> ownboxes; HYPRE_Int ***own_cboxnums = interp_data-> own_cboxnums; HYPRE_Real **weights = interp_data-> weights; HYPRE_Int ndim = interp_data-> ndim; hypre_CommHandle *comm_handle; hypre_IndexRef stride; /* refinement factors */ hypre_SStructPVector *e; hypre_StructGrid *fgrid; hypre_BoxArray *fgrid_boxes; hypre_Box *fbox; hypre_BoxArrayArray *own_cboxes; hypre_BoxArray *own_abox; hypre_Box *ownbox; HYPRE_Int **var_boxnums; HYPRE_Int *cboxnums; hypre_Box *xc_dbox; hypre_Box *e_dbox; hypre_Box refined_box, intersect_box; hypre_StructVector *xc_var; hypre_StructVector *e_var; hypre_StructVector *recv_var; HYPRE_Real ***xcp; HYPRE_Real ***ep; hypre_Index loop_size, lindex; hypre_Index start, start_offset; hypre_Index startc; hypre_Index stridec; hypre_Index refine_factors; hypre_Index refine_factors_half; hypre_Index intersect_size; hypre_Index zero_index, temp_index1, temp_index2; HYPRE_Int fi, bi; HYPRE_Int nvars, var; HYPRE_Int i, j, k, offset_ip1, offset_jp1, offset_kp1; HYPRE_Int ishift, jshift = 0, kshift = 0; HYPRE_Int ptr_ishift, ptr_jshift, ptr_kshift; HYPRE_Int imax, jmax, kmax; HYPRE_Int jsize, ksize; HYPRE_Int part_fine = 1; HYPRE_Real xweight1, xweight2; HYPRE_Real yweight1 = 0.0, yweight2 = 0.0; HYPRE_Real zweight1 = 0.0, zweight2 = 0.0; /*----------------------------------------------------------------------- * Initialize some things *-----------------------------------------------------------------------*/ hypre_BoxInit(&refined_box, ndim); hypre_BoxInit(&intersect_box, ndim); stride = (interp_data -> stride); hypre_SetIndex3(zero_index, 0, 0, 0); hypre_SetIndex3(lindex, 0, 0, 0); hypre_CopyIndex(stride, refine_factors); for (i = ndim; i < 3; i++) { refine_factors[i] = 1; } hypre_SetIndex3(stridec, 1, 1, 1); for (i = 0; i < ndim; i++) { refine_factors_half[i] = refine_factors[i] / 2; } /*----------------------------------------------------------------------- * Compute e in the refined patch. But first communicate the coarse * data. Will need a ghostlayer communication on the given level and an * interlevel communication between levels. *-----------------------------------------------------------------------*/ nvars = hypre_SStructPVectorNVars(xc); for (var = 0; var < nvars; var++) { xc_var = hypre_SStructPVectorSVector(xc, var); hypre_InitializeCommunication(comm_pkg[var], hypre_StructVectorData(xc_var), hypre_StructVectorData(xc_var), 0, 0, &comm_handle); hypre_FinalizeCommunication(comm_handle); if (recv_cvectors != NULL) { recv_var = hypre_SStructPVectorSVector(recv_cvectors, var); hypre_InitializeCommunication(interlevel_comm[var], hypre_StructVectorData(xc_var), hypre_StructVectorData(recv_var), 0, 0, &comm_handle); hypre_FinalizeCommunication(comm_handle); } } e = hypre_SStructVectorPVector(e_parts, part_fine); /*----------------------------------------------------------------------- * Allocate memory for the data pointers. Assuming linear interpolation. * We stride through the refinement patch by the refinement factors, and * so we must have pointers to the intermediate fine nodes=> ep will * be size refine_factors[2]*refine_factors[1]. This holds for all * dimensions since refine_factors[i]= 1 for i>= ndim. * Note that we need 3 coarse nodes per coordinate direction for the * interpolating. This is dimensional dependent: * ndim= 3 kplane= 0,1,2 & jplane= 0,1,2 **ptr size [3][3] * ndim= 2 kplane= 0 & jplane= 0,1,2 **ptr size [1][3] * ndim= 1 kplane= 0 & jplane= 0 **ptr size [1][1] *-----------------------------------------------------------------------*/ ksize = 3; jsize = 3; if (ndim < 3) { ksize = 1; } if (ndim < 2) { jsize = 1; } xcp = hypre_TAlloc(HYPRE_Real **, ksize, HYPRE_MEMORY_HOST); ep = hypre_TAlloc(HYPRE_Real **, refine_factors[2], HYPRE_MEMORY_HOST); for (k = 0; k < refine_factors[2]; k++) { ep[k] = hypre_TAlloc(HYPRE_Real *, refine_factors[1], HYPRE_MEMORY_HOST); } for (k = 0; k < ksize; k++) { xcp[k] = hypre_TAlloc(HYPRE_Real *, jsize, HYPRE_MEMORY_HOST); } for (var = 0; var < nvars; var++) { xc_var = hypre_SStructPVectorSVector(xc, var); e_var = hypre_SStructPVectorSVector(e, var); fgrid = hypre_StructVectorGrid(e_var); fgrid_boxes = hypre_StructGridBoxes(fgrid); own_cboxes = ownboxes[var]; var_boxnums = own_cboxnums[var]; /*-------------------------------------------------------------------- * Interpolate the own_box coarse grid values. *--------------------------------------------------------------------*/ hypre_ForBoxI(fi, fgrid_boxes) { fbox = hypre_BoxArrayBox(fgrid_boxes, fi); e_dbox = hypre_BoxArrayBox(hypre_StructVectorDataSpace(e_var), fi); own_abox = hypre_BoxArrayArrayBoxArray(own_cboxes, fi); cboxnums = var_boxnums[fi]; /*-------------------------------------------------------------------- * Get the ptrs for the fine struct_vectors. *--------------------------------------------------------------------*/ for (k = 0; k < refine_factors[2]; k++) { for (j = 0; j < refine_factors[1]; j++) { hypre_SetIndex3(temp_index1, 0, j, k); ep[k][j] = hypre_StructVectorBoxData(e_var, fi) + hypre_BoxOffsetDistance(e_dbox, temp_index1); } } hypre_ForBoxI(bi, own_abox) { ownbox = hypre_BoxArrayBox(own_abox, bi); hypre_StructMapCoarseToFine(hypre_BoxIMin(ownbox), zero_index, refine_factors, hypre_BoxIMin(&refined_box)); hypre_ClearIndex(temp_index1); for (j = 0; j < ndim; j++) { temp_index1[j] = refine_factors[j] - 1; } hypre_StructMapCoarseToFine(hypre_BoxIMax(ownbox), temp_index1, refine_factors, hypre_BoxIMax(&refined_box)); hypre_IntersectBoxes(fbox, &refined_box, &intersect_box); xc_dbox = hypre_BoxArrayBox(hypre_StructVectorDataSpace(xc_var), cboxnums[bi]); /*----------------------------------------------------------------- * Get ptrs for the crse struct_vectors. For linear interpolation * and arbitrary refinement factors, we need to point to the correct * coarse grid nodes. Note that the ownboxes were created so that * only the coarse nodes inside a fbox are contained in ownbox. * Since we loop over the fine intersect box, we need to refine * ownbox. *-----------------------------------------------------------------*/ hypre_CopyIndex(hypre_BoxIMin(&intersect_box), start); hypre_CopyIndex(hypre_BoxIMax(&intersect_box), intersect_size); for (i = 0; i < 3; i++) { intersect_size[i] -= (start[i] - 1); } /*------------------------------------------------------------------ * The fine intersection box may not be divisible by the refinement * factor. This means that the interpolated coarse nodes and their * wieghts must be carefully determined. We accomplish this using the * offset away from a fine index that is divisible by the factor. * Because the ownboxes were created so that only coarse nodes * completely in the fbox are included, start is always divisible * by refine_factors. We do the calculation anyways for future changes. *------------------------------------------------------------------*/ hypre_ClearIndex(start_offset); for (i = 0; i < ndim; i++) { start_offset[i] = start[i] % refine_factors[i]; } ptr_kshift = 0; if ( (start[2] % refine_factors[2] < refine_factors_half[2]) && ndim == 3 ) { ptr_kshift = -1; } ptr_jshift = 0; if ( start[1] % refine_factors[1] < refine_factors_half[1] && ndim >= 2 ) { ptr_jshift = -1; } ptr_ishift = 0; if ( start[0] % refine_factors[0] < refine_factors_half[0] ) { ptr_ishift = -1; } for (k = 0; k < ksize; k++) { for (j = 0; j < jsize; j++) { hypre_SetIndex3(temp_index2, ptr_ishift, j + ptr_jshift, k + ptr_kshift); xcp[k][j] = hypre_StructVectorBoxData(xc_var, cboxnums[bi]) + hypre_BoxOffsetDistance(xc_dbox, temp_index2); } } hypre_CopyIndex(hypre_BoxIMin(ownbox), startc); hypre_BoxGetSize(ownbox, loop_size); hypre_SerialBoxLoop2Begin(ndim, loop_size, e_dbox, start, stride, ei, xc_dbox, startc, stridec, xci); { /*-------------------------------------------------------- * Linear interpolation. Determine the weights and the * correct coarse grid values to be weighted. All fine * values in an agglomerated coarse cell or in the remainder * agglomerated coarse cells are determined. The upper * extents are needed. *--------------------------------------------------------*/ zypre_BoxLoopGetIndex(lindex); imax = hypre_min( (intersect_size[0] - lindex[0] * stride[0]), refine_factors[0] ); jmax = hypre_min( (intersect_size[1] - lindex[1] * stride[1]), refine_factors[1]); kmax = hypre_min( (intersect_size[2] - lindex[2] * stride[2]), refine_factors[2]); for (k = 0; k < kmax; k++) { if (ndim == 3) { offset_kp1 = start_offset[2] + k + 1; if (ptr_kshift == -1) { if (offset_kp1 <= refine_factors_half[2]) { zweight2 = weights[2][offset_kp1]; kshift = 0; } else { kshift = 1; if (offset_kp1 > refine_factors_half[2] && offset_kp1 <= refine_factors[2]) { zweight2 = weights[2][offset_kp1]; } else { zweight2 = weights[2][offset_kp1 - refine_factors[2]]; } } zweight1 = 1.0 - zweight2; } else { if (offset_kp1 > refine_factors_half[2] && offset_kp1 <= refine_factors[2]) { zweight2 = weights[2][offset_kp1]; kshift = 0; } else { kshift = 0; offset_kp1 -= refine_factors[2]; if (offset_kp1 > 0 && offset_kp1 <= refine_factors_half[2]) { zweight2 = weights[2][offset_kp1]; } else { zweight2 = weights[2][offset_kp1]; kshift = 1; } } zweight1 = 1.0 - zweight2; } } /* if (ndim == 3) */ for (j = 0; j < jmax; j++) { if (ndim >= 2) { offset_jp1 = start_offset[1] + j + 1; if (ptr_jshift == -1) { if (offset_jp1 <= refine_factors_half[1]) { yweight2 = weights[1][offset_jp1]; jshift = 0; } else { jshift = 1; if (offset_jp1 > refine_factors_half[1] && offset_jp1 <= refine_factors[1]) { yweight2 = weights[1][offset_jp1]; } else { yweight2 = weights[1][offset_jp1 - refine_factors[1]]; } } yweight1 = 1.0 - yweight2; } else { if (offset_jp1 > refine_factors_half[1] && offset_jp1 <= refine_factors[1]) { yweight2 = weights[1][offset_jp1]; jshift = 0; } else { jshift = 0; offset_jp1 -= refine_factors[1]; if (offset_jp1 > 0 && offset_jp1 <= refine_factors_half[1]) { yweight2 = weights[1][offset_jp1]; } else { yweight2 = weights[1][offset_jp1]; jshift = 1; } } yweight1 = 1.0 - yweight2; } } /* if (ndim >= 2) */ for (i = 0; i < imax; i++) { offset_ip1 = start_offset[0] + i + 1; if (ptr_ishift == -1) { if (offset_ip1 <= refine_factors_half[0]) { xweight2 = weights[0][offset_ip1]; ishift = 0; } else { ishift = 1; if (offset_ip1 > refine_factors_half[0] && offset_ip1 <= refine_factors[0]) { xweight2 = weights[0][offset_ip1]; } else { xweight2 = weights[0][offset_ip1 - refine_factors[0]]; } } xweight1 = 1.0 - xweight2; } else { if (offset_ip1 > refine_factors_half[0] && offset_ip1 <= refine_factors[0]) { xweight2 = weights[0][offset_ip1]; ishift = 0; } else { ishift = 0; offset_ip1 -= refine_factors[0]; if (offset_ip1 > 0 && offset_ip1 <= refine_factors_half[0]) { xweight2 = weights[0][offset_ip1]; } else { xweight2 = weights[0][offset_ip1]; ishift = 1; } } xweight1 = 1.0 - xweight2; } if (ndim == 3) { ep[k][j][ei + i] = zweight1 * ( yweight1 * ( xweight1 * xcp[kshift][jshift][ishift + xci] + xweight2 * xcp[kshift][jshift][ishift + xci + 1]) + yweight2 * ( xweight1 * xcp[kshift][jshift + 1][ishift + xci] + xweight2 * xcp[kshift][jshift + 1][ishift + xci + 1]) ) + zweight2 * ( yweight1 * ( xweight1 * xcp[kshift + 1][jshift][ishift + xci] + xweight2 * xcp[kshift + 1][jshift][ishift + xci + 1]) + yweight2 * ( xweight1 * xcp[kshift + 1][jshift + 1][ishift + xci] + xweight2 * xcp[kshift + 1][jshift + 1][ishift + xci + 1]) ); } else if (ndim == 2) { ep[0][j][ei + i] = yweight1 * ( xweight1 * xcp[0][jshift][ishift + xci] + xweight2 * xcp[0][jshift][ishift + xci + 1]); ep[0][j][ei + i] += yweight2 * ( xweight1 * xcp[0][jshift + 1][ishift + xci] + xweight2 * xcp[0][jshift + 1][ishift + xci + 1]); } else { ep[0][0][ei + i] = xweight1 * xcp[0][0][ishift + xci] + xweight2 * xcp[0][0][ishift + xci + 1]; } } /* for (i= 0; i< imax; i++) */ } /* for (j= 0; j< jmax; j++) */ } /* for (k= 0; k< kmax; k++) */ } hypre_SerialBoxLoop2End(ei, xci); }/* hypre_ForBoxI(bi, own_abox) */ } /* hypre_ForBoxArray(fi, fgrid_boxes) */ /*-------------------------------------------------------------------- * Interpolate the off-processor coarse grid values. These are the * recv_cvector values. We will use the ownbox ptrs. * recv_vector is non-null even when it has a grid with zero-volume * boxes. *--------------------------------------------------------------------*/ recv_var = hypre_SStructPVectorSVector(recv_cvectors, var); own_abox = hypre_StructGridBoxes(hypre_StructVectorGrid(recv_var)); cboxnums = recv_boxnum_map[var]; hypre_ForBoxI(bi, own_abox) { ownbox = hypre_BoxArrayBox(own_abox, bi); /*check for boxes of volume zero- i.e., recv_cvectors is really null.*/ if (hypre_BoxVolume(ownbox)) { xc_dbox = hypre_BoxArrayBox( hypre_StructVectorDataSpace(recv_var), bi); fi = cboxnums[bi]; fbox = hypre_BoxArrayBox(fgrid_boxes, fi); e_dbox = hypre_BoxArrayBox(hypre_StructVectorDataSpace(e_var), fi); /*------------------------------------------------------------------ * Get the ptrs for the fine struct_vectors. *------------------------------------------------------------------*/ for (k = 0; k < refine_factors[2]; k++) { for (j = 0; j < refine_factors[1]; j++) { hypre_SetIndex3(temp_index1, 0, j, k); ep[k][j] = hypre_StructVectorBoxData(e_var, fi) + hypre_BoxOffsetDistance(e_dbox, temp_index1); } } hypre_StructMapCoarseToFine(hypre_BoxIMin(ownbox), zero_index, refine_factors, hypre_BoxIMin(&refined_box)); hypre_ClearIndex(temp_index1); for (j = 0; j < ndim; j++) { temp_index1[j] = refine_factors[j] - 1; } hypre_StructMapCoarseToFine(hypre_BoxIMax(ownbox), temp_index1, refine_factors, hypre_BoxIMax(&refined_box)); hypre_IntersectBoxes(fbox, &refined_box, &intersect_box); /*----------------------------------------------------------------- * Get ptrs for the crse struct_vectors. For linear interpolation * and arbitrary refinement factors, we need to point to the correct * coarse grid nodes. Note that the ownboxes were created so that * only the coarse nodes inside a fbox are contained in ownbox. * Since we loop over the fine intersect box, we need to refine * ownbox. *-----------------------------------------------------------------*/ hypre_CopyIndex(hypre_BoxIMin(&intersect_box), start); hypre_CopyIndex(hypre_BoxIMax(&intersect_box), intersect_size); for (i = 0; i < 3; i++) { intersect_size[i] -= (start[i] - 1); } /*------------------------------------------------------------------ * The fine intersection box may not be divisible by the refinement * factor. This means that the interpolated coarse nodes and their * weights must be carefully determined. We accomplish this using the * offset away from a fine index that is divisible by the factor. * Because the ownboxes were created so that only coarse nodes * completely in the fbox are included, start is always divisible * by refine_factors. We do the calculation anyways for future changes. *------------------------------------------------------------------*/ hypre_ClearIndex(start_offset); for (i = 0; i < ndim; i++) { start_offset[i] = start[i] % refine_factors[i]; } ptr_kshift = 0; if ((start[2] % refine_factors[2] < refine_factors_half[2]) && ndim == 3) { ptr_kshift = -1; } ptr_jshift = 0; if ((start[1] % refine_factors[1] < refine_factors_half[1]) && ndim >= 2) { ptr_jshift = -1; } ptr_ishift = 0; if ( start[0] % refine_factors[0] < refine_factors_half[0] ) { ptr_ishift = -1; } for (k = 0; k < ksize; k++) { for (j = 0; j < jsize; j++) { hypre_SetIndex3(temp_index2, ptr_ishift, j + ptr_jshift, k + ptr_kshift); xcp[k][j] = hypre_StructVectorBoxData(recv_var, bi) + hypre_BoxOffsetDistance(xc_dbox, temp_index2); } } hypre_CopyIndex(hypre_BoxIMin(ownbox), startc); hypre_BoxGetSize(ownbox, loop_size); hypre_SerialBoxLoop2Begin(ndim, loop_size, e_dbox, start, stride, ei, xc_dbox, startc, stridec, xci); { /*-------------------------------------------------------- * Linear interpolation. Determine the weights and the * correct coarse grid values to be weighted. All fine * values in an agglomerated coarse cell or in the remainder * agglomerated coarse cells are determined. The upper * extents are needed. *--------------------------------------------------------*/ zypre_BoxLoopGetIndex(lindex); imax = hypre_min( (intersect_size[0] - lindex[0] * stride[0]), refine_factors[0] ); jmax = hypre_min( (intersect_size[1] - lindex[1] * stride[1]), refine_factors[1]); kmax = hypre_min( (intersect_size[2] - lindex[2] * stride[2]), refine_factors[2]); for (k = 0; k < kmax; k++) { if (ndim == 3) { offset_kp1 = start_offset[2] + k + 1; if (ptr_kshift == -1) { if (offset_kp1 <= refine_factors_half[2]) { zweight2 = weights[2][offset_kp1]; kshift = 0; } else { kshift = 1; if (offset_kp1 > refine_factors_half[2] && offset_kp1 <= refine_factors[2]) { zweight2 = weights[2][offset_kp1]; } else { zweight2 = weights[2][offset_kp1 - refine_factors[2]]; } } zweight1 = 1.0 - zweight2; } else { if (offset_kp1 > refine_factors_half[2] && offset_kp1 <= refine_factors[2]) { zweight2 = weights[2][offset_kp1]; kshift = 0; } else { kshift = 0; offset_kp1 -= refine_factors[2]; if (offset_kp1 > 0 && offset_kp1 <= refine_factors_half[2]) { zweight2 = weights[2][offset_kp1]; } else { zweight2 = weights[2][offset_kp1]; kshift = 1; } } zweight1 = 1.0 - zweight2; } } /* if (ndim == 3) */ for (j = 0; j < jmax; j++) { if (ndim >= 2) { offset_jp1 = start_offset[1] + j + 1; if (ptr_jshift == -1) { if (offset_jp1 <= refine_factors_half[1]) { yweight2 = weights[1][offset_jp1]; jshift = 0; } else { jshift = 1; if (offset_jp1 > refine_factors_half[1] && offset_jp1 <= refine_factors[1]) { yweight2 = weights[1][offset_jp1]; } else { yweight2 = weights[1][offset_jp1 - refine_factors[1]]; } } yweight1 = 1.0 - yweight2; } else { if (offset_jp1 > refine_factors_half[1] && offset_jp1 <= refine_factors[1]) { yweight2 = weights[1][offset_jp1]; jshift = 0; } else { jshift = 0; offset_jp1 -= refine_factors[1]; if (offset_jp1 > 0 && offset_jp1 <= refine_factors_half[1]) { yweight2 = weights[1][offset_jp1]; } else { yweight2 = weights[1][offset_jp1]; jshift = 1; } } yweight1 = 1.0 - yweight2; } } /* if (ndim >= 2) */ for (i = 0; i < imax; i++) { offset_ip1 = start_offset[0] + i + 1; if (ptr_ishift == -1) { if (offset_ip1 <= refine_factors_half[0]) { xweight2 = weights[0][offset_ip1]; ishift = 0; } else { ishift = 1; if (offset_ip1 > refine_factors_half[0] && offset_ip1 <= refine_factors[0]) { xweight2 = weights[0][offset_ip1]; } else { xweight2 = weights[0][offset_ip1 - refine_factors[0]]; } } xweight1 = 1.0 - xweight2; } else { if (offset_ip1 > refine_factors_half[0] && offset_ip1 <= refine_factors[0]) { xweight2 = weights[0][offset_ip1]; ishift = 0; } else { ishift = 0; offset_ip1 -= refine_factors[0]; if (offset_ip1 > 0 && offset_ip1 <= refine_factors_half[0]) { xweight2 = weights[0][offset_ip1]; } else { xweight2 = weights[0][offset_ip1]; ishift = 1; } } xweight1 = 1.0 - xweight2; } if (ndim == 3) { ep[k][j][ei + i] = zweight1 * ( yweight1 * ( xweight1 * xcp[kshift][jshift][ishift + xci] + xweight2 * xcp[kshift][jshift][ishift + xci + 1]) + yweight2 * ( xweight1 * xcp[kshift][jshift + 1][ishift + xci] + xweight2 * xcp[kshift][jshift + 1][ishift + xci + 1]) ) + zweight2 * ( yweight1 * ( xweight1 * xcp[kshift + 1][jshift][ishift + xci] + xweight2 * xcp[kshift + 1][jshift][ishift + xci + 1]) + yweight2 * ( xweight1 * xcp[kshift + 1][jshift + 1][ishift + xci] + xweight2 * xcp[kshift + 1][jshift + 1][ishift + xci + 1]) ); } else if (ndim == 2) { ep[0][j][ei + i] = yweight1 * ( xweight1 * xcp[0][jshift][ishift + xci] + xweight2 * xcp[0][jshift][ishift + xci + 1]); ep[0][j][ei + i] += yweight2 * ( xweight1 * xcp[0][jshift + 1][ishift + xci] + xweight2 * xcp[0][jshift + 1][ishift + xci + 1]); } else { ep[0][0][ei + i] = xweight1 * xcp[0][0][ishift + xci] + xweight2 * xcp[0][0][ishift + xci + 1]; } } /* for (i= 0; i< imax; i++) */ } /* for (j= 0; j< jmax; j++) */ } /* for (k= 0; k< kmax; k++) */ } hypre_SerialBoxLoop2End(ei, xci); } /* if (hypre_BoxVolume(ownbox)) */ } /* hypre_ForBoxI(bi, own_abox) */ } /* for (var= 0; var< nvars; var++)*/ for (k = 0; k < ksize; k++) { hypre_TFree(xcp[k], HYPRE_MEMORY_HOST); } hypre_TFree(xcp, HYPRE_MEMORY_HOST); for (k = 0; k < refine_factors[2]; k++) { hypre_TFree(ep[k], HYPRE_MEMORY_HOST); } hypre_TFree(ep, HYPRE_MEMORY_HOST); /*----------------------------------------------------------------------- * Return *-----------------------------------------------------------------------*/ return ierr; } hypre-2.33.0/src/sstruct_ls/fac_relax.c000066400000000000000000000023151477326011500200210ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * FAC relaxation. Refinement patches are solved using system pfmg * relaxation. ******************************************************************************/ #include "_hypre_sstruct_ls.h" #include "fac.h" #define DEBUG 0 HYPRE_Int hypre_FacLocalRelax(void *relax_vdata, hypre_SStructPMatrix *A, hypre_SStructPVector *x, hypre_SStructPVector *b, HYPRE_Int num_relax, HYPRE_Int *zero_guess) { hypre_SysPFMGRelaxSetPreRelax(relax_vdata); hypre_SysPFMGRelaxSetMaxIter(relax_vdata, num_relax); hypre_SysPFMGRelaxSetZeroGuess(relax_vdata, *zero_guess); hypre_SysPFMGRelax(relax_vdata, A, b, x); zero_guess = 0; return 0; } hypre-2.33.0/src/sstruct_ls/fac_restrict2.c000066400000000000000000001135401477326011500206320ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * OpenMP Problems * * Are private static arrays a problem? * ******************************************************************************/ /****************************************************************************** * FAC composite level restriction. * Injection away from the refinement patches; constant restriction * inside patch. ******************************************************************************/ #include "_hypre_sstruct_ls.h" #include "_hypre_struct_mv.hpp" #include "fac.h" #define MapCellRank(i, j , k, rank) \ { \ rank = 4*k + 2*j + i; \ } #define InverseMapCellRank(rank, stencil) \ { \ HYPRE_Int ij,ii,jj,kk; \ ij = (rank%4); \ ii = (ij%2); \ jj = (ij-ii)/2; \ kk = (rank-2*jj-ii)/4; \ hypre_SetIndex3(stencil, ii, jj, kk); \ } /*-------------------------------------------------------------------------- * hypre_FacSemiRestrictData data structure *--------------------------------------------------------------------------*/ typedef struct { HYPRE_Int nvars; hypre_Index stride; hypre_SStructPVector *fgrid_cvectors; /* the grid of this vector may not be on the actual grid */ hypre_BoxArrayArray **identity_arrayboxes; hypre_BoxArrayArray **fullwgt_ownboxes; hypre_BoxArrayArray **fullwgt_sendboxes; HYPRE_Int ***own_cboxnums; /* local crs boxnums of ownboxes */ hypre_CommPkg **interlevel_comm; /* hypre_CommPkg **intralevel_comm;*/ /* may need to build an intra comm so that each processor only fullwts its own fine data- may need to add contrib */ } hypre_FacSemiRestrictData2; /*-------------------------------------------------------------------------- * hypre_FacSemiRestrictCreate *--------------------------------------------------------------------------*/ HYPRE_Int hypre_FacSemiRestrictCreate2( void **fac_restrict_vdata_ptr) { HYPRE_Int ierr = 0; hypre_FacSemiRestrictData2 *fac_restrict_data; fac_restrict_data = hypre_CTAlloc(hypre_FacSemiRestrictData2, 1, HYPRE_MEMORY_HOST); *fac_restrict_vdata_ptr = (void *) fac_restrict_data; return ierr; } /*-------------------------------------------------------------------------- * hypre_FacSemiRestrictSetup: * Two types of communication are needed- one for the interlevel coarsened * fine boxes, and the other for the ghostlayer of the restricted vector. * * Approach: Identity away from the patches & fullweighting in a patch. * Since a fbox may not have the desired mapping * fbox= [a_0, a_1, a_2]x [b_0, b_1, b_2], a_i= c_i*rfactor[i] * b_i= f_i*rfactor[i] + g_i * with g_i= (rfactor[i]-1), attention must be paid to what the own_boxes, * send_boxes, and recv_boxes are. These map overlap. The reason: * myproc fullwgts what it can or equivalently, gets the restriction * contributions of its data. Some off_procs can compute the remaining * part of the agglomerate belonging to myproc and communicate it to myproc. * Hence, myproc's own_boxes contains these nodes as well as myproc's * recv_boxes. *--------------------------------------------------------------------------*/ HYPRE_Int hypre_FacSemiRestrictSetup2( void *fac_restrict_vdata, hypre_SStructVector *r, HYPRE_Int part_crse, HYPRE_Int part_fine, hypre_SStructPVector *rc, hypre_Index rfactors ) { HYPRE_Int ierr = 0; hypre_FacSemiRestrictData2 *fac_restrict_data = (hypre_FacSemiRestrictData2 *)fac_restrict_vdata; MPI_Comm comm = hypre_SStructPVectorComm(rc); hypre_CommInfo *comm_info; hypre_CommPkg **interlevel_comm; hypre_SStructPVector *rf = hypre_SStructVectorPVector(r, part_fine); hypre_StructVector *s_rc, *s_cvector; hypre_SStructPGrid *pgrid; hypre_SStructPVector *fgrid_cvectors; hypre_SStructPGrid *fgrid_coarsen; hypre_BoxArrayArray **identity_arrayboxes; hypre_BoxArrayArray **fullwgt_ownboxes; hypre_BoxArrayArray **fullwgt_sendboxes; hypre_BoxArray *boxarray; hypre_BoxArray *tmp_boxarray, *intersect_boxes; HYPRE_Int ***own_cboxnums; hypre_BoxArrayArray **send_boxes, *send_rboxes; HYPRE_Int ***send_processes; HYPRE_Int ***send_remote_boxnums; hypre_BoxArrayArray **recv_boxes, *recv_rboxes; HYPRE_Int ***recv_processes; HYPRE_Int ***recv_remote_boxnums; hypre_BoxManager *boxman; hypre_BoxManEntry **boxman_entries; HYPRE_Int nboxman_entries; hypre_Box box, scaled_box; hypre_Index zero_index, index, ilower, iupper; HYPRE_Int ndim = hypre_SStructVectorNDim(r); HYPRE_Int myproc, proc; HYPRE_Int nvars, vars; HYPRE_Int num_values; HYPRE_Int i, cnt1, cnt2; HYPRE_Int fi, ci; hypre_BoxInit(&box, ndim); hypre_BoxInit(&scaled_box, ndim); hypre_MPI_Comm_rank(comm, &myproc); hypre_ClearIndex(zero_index); nvars = hypre_SStructPVectorNVars(rc); (fac_restrict_data -> nvars) = nvars; hypre_CopyIndex(rfactors, (fac_restrict_data -> stride)); for (i = ndim; i < 3; i++) { rfactors[i] = 1; } /* work vector for storing the fullweighted fgrid boxes */ hypre_SStructPGridCreate(hypre_SStructPVectorComm(rf), ndim, &fgrid_coarsen); pgrid = hypre_SStructPVectorPGrid(rf); for (vars = 0; vars < nvars; vars++) { boxarray = hypre_StructGridBoxes(hypre_SStructPGridSGrid(pgrid, vars)); hypre_ForBoxI(fi, boxarray) { hypre_CopyBox(hypre_BoxArrayBox(boxarray, fi), &box); hypre_StructMapFineToCoarse(hypre_BoxIMin(&box), zero_index, rfactors, hypre_BoxIMin(&box)); hypre_StructMapFineToCoarse(hypre_BoxIMax(&box), zero_index, rfactors, hypre_BoxIMax(&box)); hypre_SStructPGridSetExtents(fgrid_coarsen, hypre_BoxIMin(&box), hypre_BoxIMax(&box)); } } hypre_SStructPGridSetVariables( fgrid_coarsen, nvars, hypre_SStructPGridVarTypes(pgrid) ); hypre_SStructPGridAssemble(fgrid_coarsen); hypre_SStructPVectorCreate(hypre_SStructPGridComm(fgrid_coarsen), fgrid_coarsen, &fgrid_cvectors); hypre_SStructPVectorInitialize(fgrid_cvectors); hypre_SStructPVectorAssemble(fgrid_cvectors); /* pgrid fgrid_coarsen no longer needed */ hypre_SStructPGridDestroy(fgrid_coarsen); fac_restrict_data -> fgrid_cvectors = fgrid_cvectors; /*-------------------------------------------------------------------------- * boxes that are not underlying a fine box: * * algorithm: subtract all coarsened fine grid boxes that intersect with * this processor's coarse boxes. Note that we cannot loop over all the * coarsened fine boxes and subtract them from the coarse grid since we do * not know if some of the overlying fine boxes belong on another * processor. For each cbox, we get a boxarray of boxes that are not * underlying-> size(identity_arrayboxes[vars])= #cboxes. * * Note that no contraction is needed for the intersect boxes since they * will be subtracted from the cbox. Contraction can erroneously lead * to bigger identity boxes. *--------------------------------------------------------------------------*/ identity_arrayboxes = hypre_CTAlloc(hypre_BoxArrayArray *, nvars, HYPRE_MEMORY_HOST); pgrid = hypre_SStructPVectorPGrid(rc); hypre_ClearIndex(index); for (i = 0; i < ndim; i++) { index[i] = rfactors[i] - 1; } tmp_boxarray = hypre_BoxArrayCreate(0, ndim); for (vars = 0; vars < nvars; vars++) { boxman = hypre_SStructGridBoxManager(hypre_SStructVectorGrid(r), part_fine, vars); boxarray = hypre_StructGridBoxes(hypre_SStructPGridSGrid(pgrid, vars)); identity_arrayboxes[vars] = hypre_BoxArrayArrayCreate(hypre_BoxArraySize(boxarray), ndim); hypre_ForBoxI(ci, boxarray) { hypre_CopyBox(hypre_BoxArrayBox(boxarray, ci), &box); hypre_AppendBox(&box, hypre_BoxArrayArrayBoxArray(identity_arrayboxes[vars], ci)); hypre_StructMapCoarseToFine(hypre_BoxIMin(&box), zero_index, rfactors, hypre_BoxIMin(&scaled_box)); hypre_StructMapCoarseToFine(hypre_BoxIMax(&box), index, rfactors, hypre_BoxIMax(&scaled_box)); hypre_BoxManIntersect(boxman, hypre_BoxIMin(&scaled_box), hypre_BoxIMax(&scaled_box), &boxman_entries, &nboxman_entries); /* all send and coarsened fboxes on this processor are collected */ intersect_boxes = hypre_BoxArrayCreate(0, ndim); for (i = 0; i < nboxman_entries; i++) { hypre_BoxManEntryGetExtents(boxman_entries[i], ilower, iupper); hypre_BoxSetExtents(&box, ilower, iupper); hypre_IntersectBoxes(&box, &scaled_box, &box); hypre_StructMapFineToCoarse(hypre_BoxIMin(&box), zero_index, rfactors, hypre_BoxIMin(&box)); hypre_StructMapFineToCoarse(hypre_BoxIMax(&box), zero_index, rfactors, hypre_BoxIMax(&box)); hypre_AppendBox(&box, intersect_boxes); } hypre_SubtractBoxArrays(hypre_BoxArrayArrayBoxArray(identity_arrayboxes[vars], ci), intersect_boxes, tmp_boxarray); hypre_MinUnionBoxes(hypre_BoxArrayArrayBoxArray(identity_arrayboxes[vars], ci)); hypre_TFree(boxman_entries, HYPRE_MEMORY_HOST); hypre_BoxArrayDestroy(intersect_boxes); } } hypre_BoxArrayDestroy(tmp_boxarray); fac_restrict_data -> identity_arrayboxes = identity_arrayboxes; /*-------------------------------------------------------------------------- * fboxes that are coarsened. Some will be sent. We create the communication * pattern. For each fbox, we need a boxarray of sendboxes or ownboxes. * * Algorithm: Coarsen each fbox and see which cboxes it intersects using * BoxManIntersect. Cboxes that do not belong on the processor will have * a chunk sent to it. * * Note that no contraction is needed. Contraction can lead to erroneous * send_boxes. *--------------------------------------------------------------------------*/ interlevel_comm = hypre_CTAlloc(hypre_CommPkg *, nvars, HYPRE_MEMORY_HOST); fullwgt_sendboxes = hypre_CTAlloc(hypre_BoxArrayArray *, nvars, HYPRE_MEMORY_HOST); fullwgt_ownboxes = hypre_CTAlloc(hypre_BoxArrayArray *, nvars, HYPRE_MEMORY_HOST); own_cboxnums = hypre_CTAlloc(HYPRE_Int **, nvars, HYPRE_MEMORY_HOST); send_boxes = hypre_CTAlloc(hypre_BoxArrayArray *, nvars, HYPRE_MEMORY_HOST); send_processes = hypre_CTAlloc(HYPRE_Int **, nvars, HYPRE_MEMORY_HOST); send_remote_boxnums = hypre_CTAlloc(HYPRE_Int **, nvars, HYPRE_MEMORY_HOST); pgrid = hypre_SStructPVectorPGrid(rf); for (vars = 0; vars < nvars; vars++) { boxman = hypre_SStructGridBoxManager(hypre_SStructVectorGrid(r), part_crse, vars); boxarray = hypre_StructGridBoxes(hypre_SStructPGridSGrid(pgrid, vars)); fullwgt_sendboxes[vars] = hypre_BoxArrayArrayCreate(hypre_BoxArraySize(boxarray), ndim); fullwgt_ownboxes[vars] = hypre_BoxArrayArrayCreate(hypre_BoxArraySize(boxarray), ndim); own_cboxnums[vars] = hypre_CTAlloc(HYPRE_Int *, hypre_BoxArraySize(boxarray), HYPRE_MEMORY_HOST); send_boxes[vars] = hypre_BoxArrayArrayCreate(hypre_BoxArraySize(boxarray), ndim); send_processes[vars] = hypre_CTAlloc(HYPRE_Int *, hypre_BoxArraySize(boxarray), HYPRE_MEMORY_HOST); send_remote_boxnums[vars] = hypre_CTAlloc(HYPRE_Int *, hypre_BoxArraySize(boxarray), HYPRE_MEMORY_HOST); hypre_ForBoxI(fi, boxarray) { hypre_CopyBox(hypre_BoxArrayBox(boxarray, fi), &box); hypre_StructMapFineToCoarse(hypre_BoxIMin(&box), zero_index, rfactors, hypre_BoxIMin(&scaled_box)); hypre_StructMapFineToCoarse(hypre_BoxIMax(&box), zero_index, rfactors, hypre_BoxIMax(&scaled_box)); hypre_BoxManIntersect(boxman, hypre_BoxIMin(&scaled_box), hypre_BoxIMax(&scaled_box), &boxman_entries, &nboxman_entries); cnt1 = 0; cnt2 = 0; for (i = 0; i < nboxman_entries; i++) { hypre_SStructBoxManEntryGetProcess(boxman_entries[i], &proc); if (proc != myproc) { cnt1++; } else { cnt2++; } } send_processes[vars][fi] = hypre_CTAlloc(HYPRE_Int, cnt1, HYPRE_MEMORY_HOST); send_remote_boxnums[vars][fi] = hypre_CTAlloc(HYPRE_Int, cnt1, HYPRE_MEMORY_HOST); own_cboxnums[vars][fi] = hypre_CTAlloc(HYPRE_Int, cnt2, HYPRE_MEMORY_HOST); cnt1 = 0; cnt2 = 0; for (i = 0; i < nboxman_entries; i++) { hypre_BoxManEntryGetExtents(boxman_entries[i], ilower, iupper); hypre_BoxSetExtents(&box, ilower, iupper); hypre_IntersectBoxes(&box, &scaled_box, &box); hypre_SStructBoxManEntryGetProcess(boxman_entries[i], &proc); if (proc != myproc) { hypre_AppendBox(&box, hypre_BoxArrayArrayBoxArray(fullwgt_sendboxes[vars], fi)); hypre_AppendBox(&box, hypre_BoxArrayArrayBoxArray(send_boxes[vars], fi)); send_processes[vars][fi][cnt1] = proc; hypre_SStructBoxManEntryGetBoxnum(boxman_entries[i], &send_remote_boxnums[vars][fi][cnt1]); cnt1++; } else { hypre_AppendBox(&box, hypre_BoxArrayArrayBoxArray(fullwgt_ownboxes[vars], fi)); hypre_SStructBoxManEntryGetBoxnum(boxman_entries[i], &own_cboxnums[vars][fi][cnt2]); cnt2++; } } hypre_TFree(boxman_entries, HYPRE_MEMORY_HOST); } /* hypre_ForBoxI(fi, boxarray) */ } /* for (vars= 0; vars< nvars; vars++) */ (fac_restrict_data -> fullwgt_sendboxes) = fullwgt_sendboxes; (fac_restrict_data -> fullwgt_ownboxes) = fullwgt_ownboxes; (fac_restrict_data -> own_cboxnums) = own_cboxnums; /*-------------------------------------------------------------------------- * coarsened fboxes this processor will receive. * * Algorithm: For each cbox on this processor, refine it and find which * processors the refinement belongs in. The processors owning a chunk * are the recv_processors. *--------------------------------------------------------------------------*/ recv_boxes = hypre_CTAlloc(hypre_BoxArrayArray *, nvars, HYPRE_MEMORY_HOST); recv_processes = hypre_CTAlloc(HYPRE_Int **, nvars, HYPRE_MEMORY_HOST); /* dummy pointer for CommInfoCreate */ recv_remote_boxnums = hypre_CTAlloc(HYPRE_Int **, nvars, HYPRE_MEMORY_HOST); pgrid = hypre_SStructPVectorPGrid(rc); for (vars = 0; vars < nvars; vars++) { boxman = hypre_SStructGridBoxManager(hypre_SStructVectorGrid(r), part_fine, vars); boxarray = hypre_StructGridBoxes(hypre_SStructPGridSGrid(pgrid, vars)); recv_boxes[vars] = hypre_BoxArrayArrayCreate(hypre_BoxArraySize(boxarray), ndim); recv_processes[vars] = hypre_CTAlloc(HYPRE_Int *, hypre_BoxArraySize(boxarray), HYPRE_MEMORY_HOST); recv_remote_boxnums[vars] = hypre_CTAlloc(HYPRE_Int *, hypre_BoxArraySize(boxarray), HYPRE_MEMORY_HOST); hypre_ForBoxI(ci, boxarray) { hypre_CopyBox(hypre_BoxArrayBox(boxarray, ci), &box); hypre_StructMapCoarseToFine(hypre_BoxIMin(&box), zero_index, rfactors, hypre_BoxIMin(&scaled_box)); hypre_StructMapCoarseToFine(hypre_BoxIMax(&box), index, rfactors, hypre_BoxIMax(&scaled_box)); hypre_BoxManIntersect(boxman, hypre_BoxIMin(&scaled_box), hypre_BoxIMax(&scaled_box), &boxman_entries, &nboxman_entries); cnt1 = 0; for (i = 0; i < nboxman_entries; i++) { hypre_SStructBoxManEntryGetProcess(boxman_entries[i], &proc); if (proc != myproc) { cnt1++; } } recv_processes[vars][ci] = hypre_CTAlloc(HYPRE_Int, cnt1, HYPRE_MEMORY_HOST); recv_remote_boxnums[vars][ci] = hypre_CTAlloc(HYPRE_Int, cnt1, HYPRE_MEMORY_HOST); cnt1 = 0; for (i = 0; i < nboxman_entries; i++) { hypre_SStructBoxManEntryGetProcess(boxman_entries[i], &proc); if (proc != myproc) { hypre_BoxManEntryGetExtents(boxman_entries[i], ilower, iupper); hypre_BoxSetExtents(&box, ilower, iupper); hypre_IntersectBoxes(&box, &scaled_box, &box); /* no contracting neede */ hypre_StructMapFineToCoarse(hypre_BoxIMin(&box), zero_index, rfactors, hypre_BoxIMin(&box)); hypre_StructMapFineToCoarse(hypre_BoxIMax(&box), zero_index, rfactors, hypre_BoxIMax(&box)); hypre_AppendBox(&box, hypre_BoxArrayArrayBoxArray(recv_boxes[vars], ci)); recv_processes[vars][ci][cnt1] = proc; cnt1++; } /* if (proc != myproc) */ } /* for (i= 0; i< nmap_entries; i++) */ hypre_TFree(boxman_entries, HYPRE_MEMORY_HOST); } /* hypre_ForBoxI(ci, boxarray) */ } /* for (vars= 0; vars< nvars; vars++) */ num_values = 1; for (vars = 0; vars < nvars; vars++) { s_rc = hypre_SStructPVectorSVector(rc, vars); s_cvector = hypre_SStructPVectorSVector(fgrid_cvectors, vars); send_rboxes = hypre_BoxArrayArrayDuplicate(send_boxes[vars]); recv_rboxes = hypre_BoxArrayArrayDuplicate(recv_boxes[vars]); hypre_CommInfoCreate(send_boxes[vars], recv_boxes[vars], send_processes[vars], recv_processes[vars], send_remote_boxnums[vars], recv_remote_boxnums[vars], send_rboxes, recv_rboxes, 1, &comm_info); hypre_CommPkgCreate(comm_info, hypre_StructVectorDataSpace(s_cvector), hypre_StructVectorDataSpace(s_rc), num_values, NULL, 0, hypre_StructVectorComm(s_rc), &interlevel_comm[vars]); hypre_CommInfoDestroy(comm_info); } hypre_TFree(send_boxes, HYPRE_MEMORY_HOST); hypre_TFree(recv_boxes, HYPRE_MEMORY_HOST); hypre_TFree(send_processes, HYPRE_MEMORY_HOST); hypre_TFree(recv_processes, HYPRE_MEMORY_HOST); hypre_TFree(send_remote_boxnums, HYPRE_MEMORY_HOST); hypre_TFree(recv_remote_boxnums, HYPRE_MEMORY_HOST); (fac_restrict_data -> interlevel_comm) = interlevel_comm; return ierr; } HYPRE_Int hypre_FACRestrict2( void * fac_restrict_vdata, hypre_SStructVector * xf, hypre_SStructPVector * xc) { HYPRE_Int ierr = 0; hypre_FacSemiRestrictData2 *restrict_data = (hypre_FacSemiRestrictData2 *)fac_restrict_vdata; hypre_SStructPVector *fgrid_cvectors = restrict_data->fgrid_cvectors; hypre_BoxArrayArray **identity_arrayboxes = restrict_data->identity_arrayboxes; hypre_BoxArrayArray **fullwgt_ownboxes = restrict_data->fullwgt_ownboxes; HYPRE_Int ***own_cboxnums = restrict_data->own_cboxnums; hypre_CommPkg **interlevel_comm = restrict_data-> interlevel_comm; hypre_CommHandle *comm_handle; HYPRE_Int ndim = hypre_SStructVectorNDim(xf); hypre_BoxArrayArray *arrayarray_ownboxes; hypre_IndexRef stride; /* refinement factors */ hypre_StructGrid *fgrid; hypre_BoxArray *fgrid_boxes; hypre_Box *fgrid_box; hypre_StructGrid *cgrid; hypre_BoxArray *cgrid_boxes; hypre_BoxArray *own_boxes; hypre_Box *own_box; HYPRE_Int *boxnums; hypre_Box *xc_temp_dbox; hypre_Box *xf_dbox; hypre_StructVector *xc_temp; hypre_StructVector *xc_var; hypre_StructVector *xf_var; HYPRE_Real ***xfp; HYPRE_Real ***xcp; HYPRE_Real ***xcp_temp; hypre_Index loop_size, lindex; hypre_Index start, fbox_size, node_offset; hypre_Index startc; hypre_Index stridec; hypre_Index rfactors; hypre_Index temp_index1, temp_index2; HYPRE_Int fi, ci; HYPRE_Int nvars, var; /* HYPRE_Int volume_crse_cell; */ HYPRE_Int i, j, k; HYPRE_Int imax, jmax, kmax; HYPRE_Int icell, jcell, kcell, ijkcell; HYPRE_Real *sum; HYPRE_Real scaling; HYPRE_Int part_crse = 0; HYPRE_Int part_fine = 1; HYPRE_Int num_coarse_cells; /*----------------------------------------------------------------------- * Initialize some things *-----------------------------------------------------------------------*/ stride = (restrict_data -> stride); hypre_SetIndex(lindex, 0); hypre_SetIndex(stridec, 1); hypre_CopyIndex(stride, rfactors); for (i = ndim; i < HYPRE_MAXDIM; i++) { rfactors[i] = 1; } /* volume_crse_cell = 1; */ /* for (i = 0; i < ndim; i++) */ /* { */ /* volume_crse_cell *= rfactors[i]; */ /* } */ /*----------------------------------------------------------------------- * We are assuming the refinement and coarsening have same variable * types. *-----------------------------------------------------------------------*/ nvars = hypre_SStructPVectorNVars(xc); /*----------------------------------------------------------------------- * For each coordinate direction, a fine node can contribute only to the * left or right cell=> only 2 coarse cells per direction. *-----------------------------------------------------------------------*/ num_coarse_cells = 1; for (i = 0; i < ndim; i++) { num_coarse_cells *= 2; } sum = hypre_CTAlloc(HYPRE_Real, num_coarse_cells, HYPRE_MEMORY_HOST); /*-------------------------------------------------------------------------- * Scaling for averaging restriction. *--------------------------------------------------------------------------*/ scaling = 1.0; for (i = 0; i < ndim - 2; i++) { scaling *= rfactors[0]; } /*----------------------------------------------------------------------- * Initialize the coarse vector to zero. *-----------------------------------------------------------------------*/ hypre_SStructPVectorSetConstantValues(xc, 0.0); /*----------------------------------------------------------------------- * Copy the coarse data: xf[part_crse] -> xc *-----------------------------------------------------------------------*/ hypre_SStructPartialPCopy(hypre_SStructVectorPVector(xf, part_crse), xc, identity_arrayboxes); /*----------------------------------------------------------------------- * Piecewise constant restriction over the refinement patch. * * Initialize the work vector by setting to zero. *-----------------------------------------------------------------------*/ hypre_SStructPVectorSetConstantValues(fgrid_cvectors, 0.0); /*----------------------------------------------------------------------- * Allocate memory for the data pointers. Assuming constant restriction. * We stride through the refinement patch by the refinement factors, and * so we must have pointers to the intermediate fine nodes=> xfp will * be size rfactors[2]*rfactors[1]. Because the fbox may not have the * ideal refinement form, we need to contribute to 2^ndim cells. *-----------------------------------------------------------------------*/ if (ndim > 1) { xcp_temp = hypre_TAlloc(HYPRE_Real **, (ndim - 1), HYPRE_MEMORY_HOST); xcp = hypre_TAlloc(HYPRE_Real **, (ndim - 1), HYPRE_MEMORY_HOST); for (k = 0; k < (ndim - 1); k++) { xcp_temp[k] = hypre_TAlloc(HYPRE_Real *, 2, HYPRE_MEMORY_HOST); xcp[k] = hypre_TAlloc(HYPRE_Real *, 2, HYPRE_MEMORY_HOST); } } else /* 1d does not really require these HYPRE_Real ptrs */ { xcp_temp = hypre_TAlloc(HYPRE_Real **, 1, HYPRE_MEMORY_HOST); xcp = hypre_TAlloc(HYPRE_Real **, 1, HYPRE_MEMORY_HOST); xcp_temp[0] = hypre_TAlloc(HYPRE_Real *, 1, HYPRE_MEMORY_HOST); xcp[0] = hypre_TAlloc(HYPRE_Real *, 1, HYPRE_MEMORY_HOST); } /* memory allocation of xfp is okay for all dimensions */ xfp = hypre_TAlloc(HYPRE_Real **, rfactors[2], HYPRE_MEMORY_HOST); for (k = 0; k < rfactors[2]; k++) { xfp[k] = hypre_TAlloc(HYPRE_Real *, rfactors[1], HYPRE_MEMORY_HOST); } for (var = 0; var < nvars; var++) { xc_temp = hypre_SStructPVectorSVector(fgrid_cvectors, var); xf_var = hypre_SStructPVectorSVector(hypre_SStructVectorPVector(xf, part_fine), var); fgrid = hypre_StructVectorGrid(xf_var); fgrid_boxes = hypre_StructGridBoxes(fgrid); cgrid = hypre_StructVectorGrid(xc_temp); cgrid_boxes = hypre_StructGridBoxes(cgrid); hypre_ForBoxI(fi, fgrid_boxes) { fgrid_box = hypre_BoxArrayBox(fgrid_boxes, fi); /*-------------------------------------------------------------------- * Get the ptrs for the fine struct_vectors. *--------------------------------------------------------------------*/ xf_dbox = hypre_BoxArrayBox(hypre_StructVectorDataSpace(xf_var), fi); for (k = 0; k < rfactors[2]; k++) { for (j = 0; j < rfactors[1]; j++) { hypre_SetIndex3(temp_index1, 0, j, k); xfp[k][j] = hypre_StructVectorBoxData(xf_var, fi) + hypre_BoxOffsetDistance(xf_dbox, temp_index1); } } /*-------------------------------------------------------------------- * Get the ptrs for the coarse struct_vectors. Note that the coarse * work vector is indexed with respect to the local fine box no.'s. * Work vectors were created this way. * Dimensionally dependent. *--------------------------------------------------------------------*/ xc_temp_dbox = hypre_BoxArrayBox(hypre_StructVectorDataSpace(xc_temp), fi); if (ndim > 1) { for (k = 0; k < (ndim - 1); k++) { for (j = 0; j < 2; j++) { hypre_SetIndex3(temp_index1, 0, j, k); xcp_temp[k][j] = hypre_StructVectorBoxData(xc_temp, fi) + hypre_BoxOffsetDistance(xc_temp_dbox, temp_index1); } } } else /* 1d case */ { hypre_ClearIndex(temp_index1); xcp_temp[0][0] = hypre_StructVectorBoxData(xc_temp, fi) + hypre_BoxOffsetDistance(xc_temp_dbox, temp_index1); } hypre_CopyIndex(hypre_BoxIMin(fgrid_box), start); hypre_CopyIndex(hypre_BoxIMax(fgrid_box), fbox_size); /*-------------------------------------------------------------------- * Adjust "fbox_size" so that this hypre_Index is appropriate for * ndim < 3. * fbox_size= hypre_BoxIMax(fgrid_box)-hypre_BoxIMin(fgrid_box)+1. *--------------------------------------------------------------------*/ for (i = 0; i < 3; i++) { fbox_size[i] -= (start[i] - 1); } /*-------------------------------------------------------------------- * The fine intersection box may not be divisible by the refinement * factor. We need to know the remainder to determine which * coarse node gets the restricted values. *--------------------------------------------------------------------*/ hypre_ClearIndex(node_offset); for (i = 0; i < ndim; i++) { node_offset[i] = rfactors[i] - (start[i] % rfactors[i]) - 1; } hypre_SetIndex3(temp_index2, 0, 0, 0); hypre_StructMapFineToCoarse(start, temp_index2, rfactors, startc); hypre_BoxGetSize(fgrid_box, temp_index1); hypre_StructMapFineToCoarse(temp_index1, temp_index2, rfactors, loop_size); hypre_SerialBoxLoop2Begin(ndim, loop_size, xf_dbox, start, stride, xfi, xc_temp_dbox, startc, stridec, xci); { /*----------------------------------------------------------------- * Arithmetic average the refinement patch values to get * restricted coarse grid values in an agglomerate; i.e., * piecewise constant restriction. *-----------------------------------------------------------------*/ zypre_BoxLoopGetIndex(lindex); imax = hypre_min( (fbox_size[0] - lindex[0] * stride[0]), rfactors[0] ); jmax = hypre_min( (fbox_size[1] - lindex[1] * stride[1]), rfactors[1] ); kmax = hypre_min( (fbox_size[2] - lindex[2] * stride[2]), rfactors[2] ); for (i = 0; i < num_coarse_cells; i++) { sum[i] = 0.0; } for (k = 0; k < kmax; k++) { kcell = 1; if (k <= node_offset[2]) { kcell = 0; } for (j = 0; j < jmax; j++) { jcell = 1; if (j <= node_offset[1]) { jcell = 0; } for (i = 0; i < imax; i++) { icell = 1; if (i <= node_offset[0]) { icell = 0; } MapCellRank(icell, jcell, kcell, ijkcell); sum[ijkcell] += xfp[k][j][xfi + i]; } } } /*----------------------------------------------------------------- * Add the compute averages to the correct coarse cell. *-----------------------------------------------------------------*/ for (ijkcell = 0; ijkcell < num_coarse_cells; ijkcell++) { if (sum[ijkcell] != 0.0) { sum[ijkcell] /= scaling; InverseMapCellRank(ijkcell, temp_index2); i = temp_index2[0]; j = temp_index2[1]; k = temp_index2[2]; xcp_temp[k][j][xci + i] += sum[ijkcell]; } } } hypre_SerialBoxLoop2End(xfi, xci); } /* hypre_ForBoxI(fi, fgrid_boxes) */ } /* for (var= 0; var< nvars; var++)*/ /*------------------------------------------------------------------ * Communicate calculated restricted function over the coarsened * patch. Only actual communicated values will be put in the * coarse vector. *------------------------------------------------------------------*/ for (var = 0; var < nvars; var++) { xc_temp = hypre_SStructPVectorSVector(fgrid_cvectors, var); xc_var = hypre_SStructPVectorSVector(xc, var); hypre_InitializeCommunication(interlevel_comm[var], hypre_StructVectorData(xc_temp), hypre_StructVectorData(xc_var), 0, 0, &comm_handle); hypre_FinalizeCommunication(comm_handle); } /*------------------------------------------------------------------ * Need to add the coarsened patches that belong on this processor * to the coarse vector. *------------------------------------------------------------------*/ for (var = 0; var < nvars; var++) { xc_temp = hypre_SStructPVectorSVector(fgrid_cvectors, var); xc_var = hypre_SStructPVectorSVector(xc, var); cgrid = hypre_StructVectorGrid(xc_temp); cgrid_boxes = hypre_StructGridBoxes(cgrid); arrayarray_ownboxes = fullwgt_ownboxes[var]; hypre_ForBoxI(ci, cgrid_boxes) { xc_temp_dbox = hypre_BoxArrayBox(hypre_StructVectorDataSpace(xc_temp), ci); xcp_temp[0][0] = hypre_StructVectorBoxData(xc_temp, ci); /*-------------------------------------------------------------- * Each ci box of cgrid_box has a boxarray of subboxes. Copy * each of these subboxes to the coarse vector. *--------------------------------------------------------------*/ own_boxes = hypre_BoxArrayArrayBoxArray(arrayarray_ownboxes, ci); boxnums = own_cboxnums[var][ci]; hypre_ForBoxI(i, own_boxes) { own_box = hypre_BoxArrayBox(own_boxes, i); xf_dbox = hypre_BoxArrayBox(hypre_StructVectorDataSpace(xc_var), boxnums[i]); xcp[0][0] = hypre_StructVectorBoxData(xc_var, boxnums[i]); hypre_BoxGetSize(own_box, loop_size); #define DEVICE_VAR is_device_ptr(xcp, xcp_temp) hypre_BoxLoop2Begin(ndim, loop_size, xc_temp_dbox, hypre_BoxIMin(own_box), stridec, xfi, xf_dbox, hypre_BoxIMin(own_box), stridec, xci); { xcp[0][0][xci] += xcp_temp[0][0][xfi]; } hypre_BoxLoop2End(xfi, xci); #undef DEVICE_VAR } /* hypre_ForBoxI(i, own_boxes) */ } /* hypre_ForBoxI(ci, cgrid_boxes) */ } /* for (var= 0; var< nvars; var++) */ hypre_TFree(sum, HYPRE_MEMORY_HOST); for (k = 0; k < rfactors[2]; k++) { hypre_TFree(xfp[k], HYPRE_MEMORY_HOST); } hypre_TFree(xfp, HYPRE_MEMORY_HOST); if (ndim > 1) { for (k = 0; k < (ndim - 1); k++) { hypre_TFree(xcp_temp[k], HYPRE_MEMORY_HOST); hypre_TFree(xcp[k], HYPRE_MEMORY_HOST); } } else { hypre_TFree(xcp_temp[0], HYPRE_MEMORY_HOST); hypre_TFree(xcp[0], HYPRE_MEMORY_HOST); } hypre_TFree(xcp_temp, HYPRE_MEMORY_HOST); hypre_TFree(xcp, HYPRE_MEMORY_HOST); return ierr; } /*-------------------------------------------------------------------------- * hypre_FacSemiRestrictDestroy *--------------------------------------------------------------------------*/ HYPRE_Int hypre_FacSemiRestrictDestroy2( void *fac_restrict_vdata ) { HYPRE_Int ierr = 0; hypre_FacSemiRestrictData2 *fac_restrict_data = (hypre_FacSemiRestrictData2 *)fac_restrict_vdata; HYPRE_Int nvars; HYPRE_Int i, j; if (fac_restrict_data) { nvars = (fac_restrict_data-> nvars); hypre_SStructPVectorDestroy(fac_restrict_data-> fgrid_cvectors); for (i = 0; i < nvars; i++) { hypre_BoxArrayArrayDestroy((fac_restrict_data -> identity_arrayboxes)[i]); hypre_BoxArrayArrayDestroy((fac_restrict_data -> fullwgt_sendboxes)[i]); for (j = 0; j < hypre_BoxArrayArraySize(fac_restrict_data->fullwgt_ownboxes[i]); j++) { hypre_TFree((fac_restrict_data -> own_cboxnums)[i][j], HYPRE_MEMORY_HOST); } hypre_TFree((fac_restrict_data -> own_cboxnums)[i], HYPRE_MEMORY_HOST); hypre_BoxArrayArrayDestroy((fac_restrict_data -> fullwgt_ownboxes)[i]); hypre_CommPkgDestroy((fac_restrict_data -> interlevel_comm)[i]); } hypre_TFree(fac_restrict_data -> identity_arrayboxes, HYPRE_MEMORY_HOST); hypre_TFree(fac_restrict_data -> fullwgt_sendboxes, HYPRE_MEMORY_HOST); hypre_TFree(fac_restrict_data -> own_cboxnums, HYPRE_MEMORY_HOST); hypre_TFree(fac_restrict_data -> fullwgt_ownboxes, HYPRE_MEMORY_HOST); hypre_TFree(fac_restrict_data -> interlevel_comm, HYPRE_MEMORY_HOST); hypre_TFree(fac_restrict_data, HYPRE_MEMORY_HOST); } return ierr; } hypre-2.33.0/src/sstruct_ls/fac_setup2.c000066400000000000000000001146021477326011500201330ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "_hypre_sstruct_ls.h" #include "_hypre_struct_mv.hpp" #include "fac.h" /*-------------------------------------------------------------------------- * hypre_FacSetup2: Constructs the level composite structures. * Each consists only of two levels, the refinement patches and the * coarse parent base grids. *--------------------------------------------------------------------------*/ HYPRE_Int hypre_FacSetup2( void *fac_vdata, hypre_SStructMatrix *A_in, hypre_SStructVector *b, hypre_SStructVector *x ) { HYPRE_UNUSED_VAR(b); hypre_FACData *fac_data = (hypre_FACData*)fac_vdata; HYPRE_Int *plevels = (fac_data-> plevels); hypre_Index *rfactors = (fac_data-> prefinements); MPI_Comm comm; HYPRE_Int ndim; HYPRE_Int npart; HYPRE_Int nparts_level = 2; HYPRE_Int part_crse = 0; HYPRE_Int part_fine = 1; hypre_SStructPMatrix *A_pmatrix; hypre_StructMatrix *A_smatrix; hypre_Box *A_smatrix_dbox; hypre_SStructGrid **grid_level; hypre_SStructGraph **graph_level; HYPRE_Int part, level; HYPRE_Int nvars; hypre_SStructGraph *graph; hypre_SStructGrid *grid; hypre_SStructPGrid *pgrid; hypre_StructGrid *sgrid; hypre_BoxArray *sgrid_boxes; hypre_Box *sgrid_box; hypre_SStructStencil *stencils; hypre_BoxArray *iboxarray; hypre_Index *refine_factors; hypre_IndexRef box_start; hypre_IndexRef box_end; hypre_SStructUVEntry **Uventries; HYPRE_Int nUventries; HYPRE_Int *iUventries; hypre_SStructUVEntry *Uventry; hypre_SStructUEntry *Uentry; hypre_Index index, to_index, stride; HYPRE_Int var, to_var, to_part, level_part, level_topart; HYPRE_Int var1, var2; HYPRE_Int i, j, k, nUentries; HYPRE_BigInt row_coord, to_rank; hypre_BoxManEntry *boxman_entry; hypre_SStructMatrix *A_rap; hypre_SStructMatrix **A_level; hypre_SStructVector **b_level; hypre_SStructVector **x_level; hypre_SStructVector **r_level; hypre_SStructVector **e_level; hypre_SStructPVector **tx_level; hypre_SStructVector *tx; void **matvec_data_level; void **pmatvec_data_level; void *matvec_data; void **relax_data_level; void **interp_data_level; void **restrict_data_level; /* coarsest grid solver */ HYPRE_Int csolver_type = (fac_data-> csolver_type); HYPRE_SStructSolver crse_solver = NULL; HYPRE_SStructSolver crse_precond = NULL; HYPRE_Int max_level = hypre_FACDataMaxLevels(fac_data); HYPRE_Int relax_type = fac_data -> relax_type; HYPRE_Int usr_jacobi_weight = fac_data -> usr_jacobi_weight; HYPRE_Real jacobi_weight = fac_data -> jacobi_weight; HYPRE_Int *levels; HYPRE_Int *part_to_level; HYPRE_Int box, box_volume; HYPRE_Int max_box_volume; HYPRE_Int stencil_size; hypre_Index stencil_shape_i, loop_size; HYPRE_Int *stencil_vars; HYPRE_Real *values; HYPRE_Real *A_smatrix_value; HYPRE_Int *nrows; HYPRE_Int **ncols; HYPRE_BigInt **rows; HYPRE_BigInt **cols; HYPRE_Int *cnt; HYPRE_Real *vals; HYPRE_BigInt *level_rows; HYPRE_BigInt *level_cols; HYPRE_Int level_cnt; HYPRE_IJMatrix ij_A; HYPRE_Int matrix_type; HYPRE_Int max_cycles; HYPRE_Int ierr = 0; /*hypre_SStructMatrix *nested_A; nested_A= hypre_TAlloc(hypre_SStructMatrix , 1, HYPRE_MEMORY_HOST); nested_A= hypre_CoarsenAMROp(fac_vdata, A);*/ /* generate the composite operator with the computed coarse-grid operators */ hypre_AMR_RAP(A_in, rfactors, &A_rap); (fac_data -> A_rap) = A_rap; comm = hypre_SStructMatrixComm(A_rap); ndim = hypre_SStructMatrixNDim(A_rap); npart = hypre_SStructMatrixNParts(A_rap); graph = hypre_SStructMatrixGraph(A_rap); grid = hypre_SStructGraphGrid(graph); ij_A = hypre_SStructMatrixIJMatrix(A_rap); matrix_type = hypre_SStructMatrixObjectType(A_rap); /*-------------------------------------------------------------------------- * logging arrays. *--------------------------------------------------------------------------*/ if ((fac_data -> logging) > 0) { max_cycles = (fac_data -> max_cycles); (fac_data -> norms) = hypre_TAlloc(HYPRE_Real, max_cycles, HYPRE_MEMORY_HOST); (fac_data -> rel_norms) = hypre_TAlloc(HYPRE_Real, max_cycles, HYPRE_MEMORY_HOST); } /*-------------------------------------------------------------------------- * Extract the amr/sstruct level/part structure and refinement factors. *--------------------------------------------------------------------------*/ levels = hypre_CTAlloc(HYPRE_Int, npart, HYPRE_MEMORY_HOST); part_to_level = hypre_CTAlloc(HYPRE_Int, npart, HYPRE_MEMORY_HOST); refine_factors = hypre_CTAlloc(hypre_Index, npart, HYPRE_MEMORY_HOST); for (part = 0; part < npart; part++) { part_to_level[part] = plevels[part]; levels[plevels[part]] = part; for (i = 0; i < ndim; i++) { refine_factors[plevels[part]][i] = rfactors[part][i]; } for (i = ndim; i < 3; i++) { refine_factors[plevels[part]][i] = 1; } } (fac_data -> level_to_part) = levels; (fac_data -> part_to_level) = part_to_level; (fac_data -> refine_factors) = refine_factors; /*-------------------------------------------------------------------------- * Create the level SStructGrids using the original composite grid. *--------------------------------------------------------------------------*/ grid_level = hypre_TAlloc(hypre_SStructGrid *, max_level + 1, HYPRE_MEMORY_HOST); for (level = max_level; level >= 0; level--) { HYPRE_SStructGridCreate(comm, ndim, nparts_level, &grid_level[level]); } for (level = max_level; level >= 0; level--) { /*-------------------------------------------------------------------------- * Create the fine part of the finest level SStructGrids using the original * composite grid. *--------------------------------------------------------------------------*/ if (level == max_level) { pgrid = hypre_SStructGridPGrid(grid, levels[level]); iboxarray = hypre_SStructPGridCellIBoxArray(pgrid); for (box = 0; box < hypre_BoxArraySize(iboxarray); box++) { HYPRE_SStructGridSetExtents(grid_level[level], part_fine, hypre_BoxIMin( hypre_BoxArrayBox(iboxarray, box) ), hypre_BoxIMax( hypre_BoxArrayBox(iboxarray, box) )); } HYPRE_SStructGridSetVariables( grid_level[level], part_fine, hypre_SStructPGridNVars(pgrid), hypre_SStructPGridVarTypes(pgrid) ); /*----------------------------------------------------------------------- * Create the coarsest level grid if A has only 1 level *-----------------------------------------------------------------------*/ if (level == 0) { for (box = 0; box < hypre_BoxArraySize(iboxarray); box++) { HYPRE_SStructGridSetExtents(grid_level[level], part_crse, hypre_BoxIMin( hypre_BoxArrayBox(iboxarray, box) ), hypre_BoxIMax( hypre_BoxArrayBox(iboxarray, box) )); } HYPRE_SStructGridSetVariables( grid_level[level], part_crse, hypre_SStructPGridNVars(pgrid), hypre_SStructPGridVarTypes(pgrid) ); } } /*-------------------------------------------------------------------------- * Create the coarse part of level SStructGrids using the original composite * grid, the coarsest part SStructGrid, and the fine part if level < max_level. *--------------------------------------------------------------------------*/ if (level > 0) { pgrid = hypre_SStructGridPGrid(grid, levels[level - 1]); iboxarray = hypre_SStructPGridCellIBoxArray(pgrid); for (box = 0; box < hypre_BoxArraySize(iboxarray); box++) { HYPRE_SStructGridSetExtents(grid_level[level], part_crse, hypre_BoxIMin( hypre_BoxArrayBox(iboxarray, box) ), hypre_BoxIMax( hypre_BoxArrayBox(iboxarray, box) )); HYPRE_SStructGridSetExtents(grid_level[level - 1], part_fine, hypre_BoxIMin( hypre_BoxArrayBox(iboxarray, box) ), hypre_BoxIMax( hypre_BoxArrayBox(iboxarray, box) )); if (level == 1) { HYPRE_SStructGridSetExtents(grid_level[level - 1], part_crse, hypre_BoxIMin( hypre_BoxArrayBox(iboxarray, box) ), hypre_BoxIMax( hypre_BoxArrayBox(iboxarray, box) )); } } HYPRE_SStructGridSetVariables( grid_level[level], part_crse, hypre_SStructPGridNVars(pgrid), hypre_SStructPGridVarTypes(pgrid) ); HYPRE_SStructGridSetVariables( grid_level[level - 1], part_fine, hypre_SStructPGridNVars(pgrid), hypre_SStructPGridVarTypes(pgrid) ); /* coarsest SStructGrid */ if (level == 1) { HYPRE_SStructGridSetVariables( grid_level[level - 1], part_crse, hypre_SStructPGridNVars(pgrid), hypre_SStructPGridVarTypes(pgrid) ); } } HYPRE_SStructGridAssemble(grid_level[level]); } (fac_data -> grid_level) = grid_level; /*----------------------------------------------------------- * Set up the graph. Create only the structured components * first. *-----------------------------------------------------------*/ graph_level = hypre_TAlloc(hypre_SStructGraph *, max_level + 1, HYPRE_MEMORY_HOST); for (level = max_level; level >= 0; level--) { HYPRE_SStructGraphCreate(comm, grid_level[level], &graph_level[level]); } for (level = max_level; level >= 0; level--) { /*----------------------------------------------------------------------- * Create the fine part of the finest level structured graph connection. *-----------------------------------------------------------------------*/ if (level == max_level) { pgrid = hypre_SStructGridPGrid(grid, levels[level]); nvars = hypre_SStructPGridNVars(pgrid); for (var1 = 0; var1 < nvars; var1++) { stencils = hypre_SStructGraphStencil(graph, levels[level], var1); HYPRE_SStructGraphSetStencil(graph_level[level], part_fine, var1, stencils); if (level == 0) { HYPRE_SStructGraphSetStencil(graph_level[level], part_crse, var1, stencils); } } } /*-------------------------------------------------------------------------- * Create the coarse part of the graph_level using the graph of A, and the * and the fine part if level < max_level. *--------------------------------------------------------------------------*/ if (level > 0) { pgrid = hypre_SStructGridPGrid(grid, levels[level - 1]); nvars = hypre_SStructPGridNVars(pgrid); for (var1 = 0; var1 < nvars; var1++) { stencils = hypre_SStructGraphStencil(graph, levels[level - 1], var1); HYPRE_SStructGraphSetStencil(graph_level[level], part_crse, var1, stencils ); HYPRE_SStructGraphSetStencil(graph_level[level - 1], part_fine, var1, stencils ); if (level == 1) { HYPRE_SStructGraphSetStencil(graph_level[level - 1], part_crse, var1, stencils ); } } } } /*----------------------------------------------------------- * Extract the non-stencil graph structure: assuming only like * variables connect. Also count the number of unstructured * connections per part. * * THE COARSEST COMPOSITE MATRIX DOES NOT HAVE ANY NON-STENCIL * CONNECTIONS. *-----------------------------------------------------------*/ Uventries = hypre_SStructGraphUVEntries(graph); nUventries = hypre_SStructGraphNUVEntries(graph); iUventries = hypre_SStructGraphIUVEntries(graph); nrows = hypre_CTAlloc(HYPRE_Int, max_level + 1, HYPRE_MEMORY_HOST); for (i = 0; i < nUventries; i++) { Uventry = Uventries[iUventries[i]]; part = hypre_SStructUVEntryPart(Uventry); hypre_CopyIndex(hypre_SStructUVEntryIndex(Uventry), index); var = hypre_SStructUVEntryVar(Uventry); nUentries = hypre_SStructUVEntryNUEntries(Uventry); for (k = 0; k < nUentries; k++) { Uentry = hypre_SStructUVEntryUEntry(Uventry, k); to_part = hypre_SStructUEntryToPart(Uentry); hypre_CopyIndex(hypre_SStructUEntryToIndex(Uentry), to_index); to_var = hypre_SStructUEntryToVar(Uentry); if ( part_to_level[part] >= part_to_level[to_part] ) { level = part_to_level[part]; level_part = part_fine; level_topart = part_crse; } else { level = part_to_level[to_part]; level_part = part_crse; level_topart = part_fine; } nrows[level]++; HYPRE_SStructGraphAddEntries(graph_level[level], level_part, index, var, level_topart, to_index, to_var); } } for (level = 0; level <= max_level; level++) { HYPRE_SStructGraphAssemble(graph_level[level]); } (fac_data -> graph_level) = graph_level; /*--------------------------------------------------------------- * Create the level SStruct_Vectors, and temporary global * sstuct_vector. *---------------------------------------------------------------*/ b_level = hypre_TAlloc(hypre_SStructVector *, max_level + 1, HYPRE_MEMORY_HOST); x_level = hypre_TAlloc(hypre_SStructVector *, max_level + 1, HYPRE_MEMORY_HOST); r_level = hypre_TAlloc(hypre_SStructVector *, max_level + 1, HYPRE_MEMORY_HOST); e_level = hypre_TAlloc(hypre_SStructVector *, max_level + 1, HYPRE_MEMORY_HOST); tx_level = hypre_TAlloc(hypre_SStructPVector *, max_level + 1, HYPRE_MEMORY_HOST); for (level = 0; level <= max_level; level++) { HYPRE_SStructVectorCreate(comm, grid_level[level], &b_level[level]); HYPRE_SStructVectorInitialize(b_level[level]); HYPRE_SStructVectorAssemble(b_level[level]); HYPRE_SStructVectorCreate(comm, grid_level[level], &x_level[level]); HYPRE_SStructVectorInitialize(x_level[level]); HYPRE_SStructVectorAssemble(x_level[level]); HYPRE_SStructVectorCreate(comm, grid_level[level], &r_level[level]); HYPRE_SStructVectorInitialize(r_level[level]); HYPRE_SStructVectorAssemble(r_level[level]); HYPRE_SStructVectorCreate(comm, grid_level[level], &e_level[level]); HYPRE_SStructVectorInitialize(e_level[level]); HYPRE_SStructVectorAssemble(e_level[level]); /* temporary vector for fine patch relaxation */ hypre_SStructPVectorCreate(comm, hypre_SStructGridPGrid(grid_level[level], part_fine), &tx_level[level]); hypre_SStructPVectorInitialize(tx_level[level]); hypre_SStructPVectorAssemble(tx_level[level]); } /* temp SStructVectors */ HYPRE_SStructVectorCreate(comm, grid, &tx); HYPRE_SStructVectorInitialize(tx); HYPRE_SStructVectorAssemble(tx); (fac_data -> b_level) = b_level; (fac_data -> x_level) = x_level; (fac_data -> r_level) = r_level; (fac_data -> e_level) = e_level; (fac_data -> tx_level) = tx_level; (fac_data -> tx) = tx; /*----------------------------------------------------------- * Set up the level composite sstruct_matrices. *-----------------------------------------------------------*/ A_level = hypre_TAlloc(hypre_SStructMatrix *, max_level + 1, HYPRE_MEMORY_HOST); hypre_SetIndex3(stride, 1, 1, 1); for (level = 0; level <= max_level; level++) { HYPRE_SStructMatrixCreate(comm, graph_level[level], &A_level[level]); HYPRE_SStructMatrixInitialize(A_level[level]); max_box_volume = 0; pgrid = hypre_SStructGridPGrid(grid, levels[level]); nvars = hypre_SStructPGridNVars(pgrid); for (var1 = 0; var1 < nvars; var1++) { sgrid = hypre_SStructPGridSGrid(pgrid, var1); sgrid_boxes = hypre_StructGridBoxes(sgrid); hypre_ForBoxI(i, sgrid_boxes) { sgrid_box = hypre_BoxArrayBox(sgrid_boxes, i); box_volume = hypre_BoxVolume(sgrid_box); max_box_volume = hypre_max(max_box_volume, box_volume); } } values = hypre_TAlloc(HYPRE_Real, max_box_volume, HYPRE_MEMORY_HOST); A_pmatrix = hypre_SStructMatrixPMatrix(A_rap, levels[level]); /*----------------------------------------------------------- * extract stencil values for all fine levels. *-----------------------------------------------------------*/ for (var1 = 0; var1 < nvars; var1++) { sgrid = hypre_SStructPGridSGrid(pgrid, var1); sgrid_boxes = hypre_StructGridBoxes(sgrid); stencils = hypre_SStructGraphStencil(graph, levels[level], var1); stencil_size = hypre_SStructStencilSize(stencils); stencil_vars = hypre_SStructStencilVars(stencils); for (i = 0; i < stencil_size; i++) { var2 = stencil_vars[i]; A_smatrix = hypre_SStructPMatrixSMatrix(A_pmatrix, var1, var2); hypre_CopyIndex(hypre_SStructStencilEntry(stencils, i), stencil_shape_i); hypre_ForBoxI(j, sgrid_boxes) { sgrid_box = hypre_BoxArrayBox(sgrid_boxes, j); box_start = hypre_BoxIMin(sgrid_box); box_end = hypre_BoxIMax(sgrid_box); A_smatrix_dbox = hypre_BoxArrayBox(hypre_StructMatrixDataSpace(A_smatrix), j); A_smatrix_value = hypre_StructMatrixExtractPointerByIndex(A_smatrix, j, stencil_shape_i); hypre_BoxGetSize(sgrid_box, loop_size); #define DEVICE_VAR is_device_ptr(values,A_smatrix_value) hypre_BoxLoop2Begin(ndim, loop_size, sgrid_box, box_start, stride, k, A_smatrix_dbox, box_start, stride, iA); { values[k] = A_smatrix_value[iA]; } hypre_BoxLoop2End(k, iA); #undef DEVICE_VAR HYPRE_SStructMatrixSetBoxValues(A_level[level], part_fine, box_start, box_end, var1, 1, &i, values); } /* hypre_ForBoxI */ } /* for i */ } /* for var1 */ hypre_TFree(values, HYPRE_MEMORY_HOST); /*----------------------------------------------------------- * Extract the coarse part *-----------------------------------------------------------*/ if (level > 0) { max_box_volume = 0; pgrid = hypre_SStructGridPGrid(grid, levels[level - 1]); nvars = hypre_SStructPGridNVars(pgrid); for (var1 = 0; var1 < nvars; var1++) { sgrid = hypre_SStructPGridSGrid( pgrid, var1 ); sgrid_boxes = hypre_StructGridBoxes(sgrid); hypre_ForBoxI( i, sgrid_boxes ) { sgrid_box = hypre_BoxArrayBox(sgrid_boxes, i); box_volume = hypre_BoxVolume(sgrid_box); max_box_volume = hypre_max(max_box_volume, box_volume ); } } values = hypre_TAlloc(HYPRE_Real, max_box_volume, HYPRE_MEMORY_HOST); A_pmatrix = hypre_SStructMatrixPMatrix(A_rap, levels[level - 1]); /*----------------------------------------------------------- * extract stencil values *-----------------------------------------------------------*/ for (var1 = 0; var1 < nvars; var1++) { sgrid = hypre_SStructPGridSGrid(pgrid, var1); sgrid_boxes = hypre_StructGridBoxes(sgrid); stencils = hypre_SStructGraphStencil(graph, levels[level - 1], var1); stencil_size = hypre_SStructStencilSize(stencils); stencil_vars = hypre_SStructStencilVars(stencils); for (i = 0; i < stencil_size; i++) { var2 = stencil_vars[i]; A_smatrix = hypre_SStructPMatrixSMatrix(A_pmatrix, var1, var2); hypre_CopyIndex(hypre_SStructStencilEntry(stencils, i), stencil_shape_i); hypre_ForBoxI( j, sgrid_boxes ) { sgrid_box = hypre_BoxArrayBox(sgrid_boxes, j); box_start = hypre_BoxIMin(sgrid_box); box_end = hypre_BoxIMax(sgrid_box); A_smatrix_dbox = hypre_BoxArrayBox(hypre_StructMatrixDataSpace(A_smatrix), j); A_smatrix_value = hypre_StructMatrixExtractPointerByIndex(A_smatrix, j, stencil_shape_i); hypre_BoxGetSize(sgrid_box, loop_size); #define DEVICE_VAR is_device_ptr(values,A_smatrix_value) hypre_BoxLoop2Begin(ndim, loop_size, sgrid_box, box_start, stride, k, A_smatrix_dbox, box_start, stride, iA); { values[k] = A_smatrix_value[iA]; } hypre_BoxLoop2End(k, iA); #undef DEVICE_VAR HYPRE_SStructMatrixSetBoxValues(A_level[level], part_crse, box_start, box_end, var1, 1, &i, values); } /* hypre_ForBoxI */ } /* for i */ } /* for var1 */ hypre_TFree(values, HYPRE_MEMORY_HOST); } /* if level > 0 */ } /* for level */ /*----------------------------------------------------------- * extract the non-stencil values for all but the coarsest * level sstruct_matrix. Use the HYPRE_IJMatrixGetValues * for each level of A. *-----------------------------------------------------------*/ Uventries = hypre_SStructGraphUVEntries(graph); nUventries = hypre_SStructGraphNUVEntries(graph); iUventries = hypre_SStructGraphIUVEntries(graph); /*----------------------------------------------------------- * Allocate memory for arguments of HYPRE_IJMatrixGetValues. *-----------------------------------------------------------*/ ncols = hypre_TAlloc(HYPRE_Int *, max_level + 1, HYPRE_MEMORY_HOST); rows = hypre_TAlloc(HYPRE_BigInt *, max_level + 1, HYPRE_MEMORY_HOST); cols = hypre_TAlloc(HYPRE_BigInt *, max_level + 1, HYPRE_MEMORY_HOST); cnt = hypre_CTAlloc(HYPRE_Int, max_level + 1, HYPRE_MEMORY_HOST); ncols[0] = NULL; rows[0] = NULL; cols[0] = NULL; for (level = 1; level <= max_level; level++) { ncols[level] = hypre_TAlloc(HYPRE_Int, nrows[level], HYPRE_MEMORY_HOST); for (i = 0; i < nrows[level]; i++) { ncols[level][i] = 1; } rows[level] = hypre_TAlloc(HYPRE_BigInt, nrows[level], HYPRE_MEMORY_HOST); cols[level] = hypre_TAlloc(HYPRE_BigInt, nrows[level], HYPRE_MEMORY_HOST); } for (i = 0; i < nUventries; i++) { Uventry = Uventries[iUventries[i]]; part = hypre_SStructUVEntryPart(Uventry); hypre_CopyIndex(hypre_SStructUVEntryIndex(Uventry), index); var = hypre_SStructUVEntryVar(Uventry); hypre_SStructGridFindBoxManEntry(grid, part, index, var, &boxman_entry); hypre_SStructBoxManEntryGetGlobalRank(boxman_entry, index, &row_coord, matrix_type); nUentries = hypre_SStructUVEntryNUEntries(Uventry); for (k = 0; k < nUentries; k++) { to_part = hypre_SStructUVEntryToPart(Uventry, k); to_rank = hypre_SStructUVEntryToRank(Uventry, k); /*----------------------------------------------------------- * store the row & col indices in the correct level. *-----------------------------------------------------------*/ level = hypre_max( part_to_level[part], part_to_level[to_part] ); rows[level][ cnt[level] ] = row_coord; cols[level][ cnt[level]++ ] = to_rank; } } hypre_TFree(cnt, HYPRE_MEMORY_HOST); for (level = 1; level <= max_level; level++) { vals = hypre_CTAlloc(HYPRE_Real, nrows[level], HYPRE_MEMORY_HOST); level_rows = hypre_TAlloc(HYPRE_BigInt, nrows[level], HYPRE_MEMORY_HOST); level_cols = hypre_TAlloc(HYPRE_BigInt, nrows[level], HYPRE_MEMORY_HOST); HYPRE_IJMatrixGetValues(ij_A, nrows[level], ncols[level], rows[level], cols[level], vals); Uventries = hypre_SStructGraphUVEntries(graph_level[level]); /*----------------------------------------------------------- * Find the rows & cols of the level ij_matrices where the * extracted data must be placed. Note that because the * order in which the HYPRE_SStructGraphAddEntries in the * graph_level's is the same order in which rows[level] & * cols[level] were formed, the coefficients in val are * in the correct order. *-----------------------------------------------------------*/ level_cnt = 0; for (i = 0; i < hypre_SStructGraphNUVEntries(graph_level[level]); i++) { j = hypre_SStructGraphIUVEntry(graph_level[level], i); Uventry = Uventries[j]; part = hypre_SStructUVEntryPart(Uventry); hypre_CopyIndex(hypre_SStructUVEntryIndex(Uventry), index); var = hypre_SStructUVEntryVar(Uventry); hypre_SStructGridFindBoxManEntry(grid_level[level], part, index, var, &boxman_entry); hypre_SStructBoxManEntryGetGlobalRank(boxman_entry, index, &row_coord, matrix_type); nUentries = hypre_SStructUVEntryNUEntries(Uventry); for (k = 0; k < nUentries; k++) { to_rank = hypre_SStructUVEntryToRank(Uventry, k); level_rows[level_cnt] = row_coord; level_cols[level_cnt++] = to_rank; } } /*----------------------------------------------------------- * Place the extracted ij coefficients into the level ij * matrices. *-----------------------------------------------------------*/ HYPRE_IJMatrixSetValues( hypre_SStructMatrixIJMatrix(A_level[level]), nrows[level], ncols[level], (const HYPRE_BigInt *) level_rows, (const HYPRE_BigInt *) level_cols, (const HYPRE_Real *) vals ); hypre_TFree(ncols[level], HYPRE_MEMORY_HOST); hypre_TFree(rows[level], HYPRE_MEMORY_HOST); hypre_TFree(cols[level], HYPRE_MEMORY_HOST); hypre_TFree(vals, HYPRE_MEMORY_HOST); hypre_TFree(level_rows, HYPRE_MEMORY_HOST); hypre_TFree(level_cols, HYPRE_MEMORY_HOST); } hypre_TFree(ncols, HYPRE_MEMORY_HOST); hypre_TFree(rows, HYPRE_MEMORY_HOST); hypre_TFree(cols, HYPRE_MEMORY_HOST); hypre_TFree(nrows, HYPRE_MEMORY_HOST); /*--------------------------------------------------------------- * Construct the fine grid (part 1) SStruct_PMatrix for all * levels except for max_level. This involves coarsening the * finer level SStruct_Matrix. Coarsening involves interpolation, * matvec, and restriction (to obtain the "row-sum"). *---------------------------------------------------------------*/ matvec_data_level = hypre_TAlloc(void *, max_level + 1, HYPRE_MEMORY_HOST); pmatvec_data_level = hypre_TAlloc(void *, max_level + 1, HYPRE_MEMORY_HOST); interp_data_level = hypre_TAlloc(void *, max_level + 1, HYPRE_MEMORY_HOST); restrict_data_level = hypre_TAlloc(void *, max_level + 1, HYPRE_MEMORY_HOST); for (level = 0; level <= max_level; level++) { if (level < max_level) { hypre_FacSemiInterpCreate2(&interp_data_level[level]); hypre_FacSemiInterpSetup2(interp_data_level[level], x_level[level + 1], hypre_SStructVectorPVector(x_level[level], part_fine), refine_factors[level + 1]); } else { interp_data_level[level] = NULL; } if (level > 0) { hypre_FacSemiRestrictCreate2(&restrict_data_level[level]); hypre_FacSemiRestrictSetup2(restrict_data_level[level], x_level[level], part_crse, part_fine, hypre_SStructVectorPVector(x_level[level - 1], part_fine), refine_factors[level]); } else { restrict_data_level[level] = NULL; } } for (level = max_level; level > 0; level--) { /* hypre_FacZeroCFSten(hypre_SStructMatrixPMatrix(A_level[level], part_fine), hypre_SStructMatrixPMatrix(A_level[level], part_crse), grid_level[level], part_fine, refine_factors[level]); hypre_FacZeroFCSten(hypre_SStructMatrixPMatrix(A_level[level], part_fine), grid_level[level], part_fine); */ hypre_ZeroAMRMatrixData(A_level[level], part_crse, refine_factors[level]); HYPRE_SStructMatrixAssemble(A_level[level]); /*------------------------------------------------------------ * create data structures that are needed for coarsening -------------------------------------------------------------*/ hypre_SStructMatvecCreate(&matvec_data_level[level]); hypre_SStructMatvecSetup(matvec_data_level[level], A_level[level], x_level[level]); hypre_SStructPMatvecCreate(&pmatvec_data_level[level]); hypre_SStructPMatvecSetup(pmatvec_data_level[level], hypre_SStructMatrixPMatrix(A_level[level], part_fine), hypre_SStructVectorPVector(x_level[level], part_fine)); } /*--------------------------------------------------------------- * To avoid memory leaks, we cannot reference the coarsest level * SStructPMatrix. We need only copy the stuctured coefs. *---------------------------------------------------------------*/ pgrid = hypre_SStructGridPGrid(grid_level[0], part_fine); nvars = hypre_SStructPGridNVars(pgrid); A_pmatrix = hypre_SStructMatrixPMatrix(A_level[0], part_fine); for (var1 = 0; var1 < nvars; var1++) { sgrid = hypre_SStructPGridSGrid(pgrid, var1); sgrid_boxes = hypre_StructGridBoxes(sgrid); max_box_volume = 0; hypre_ForBoxI(i, sgrid_boxes) { sgrid_box = hypre_BoxArrayBox(sgrid_boxes, i); box_volume = hypre_BoxVolume(sgrid_box); max_box_volume = hypre_max(max_box_volume, box_volume); } values = hypre_TAlloc(HYPRE_Real, max_box_volume, HYPRE_MEMORY_HOST); stencils = hypre_SStructGraphStencil(graph_level[0], part_fine, var1); stencil_size = hypre_SStructStencilSize(stencils); stencil_vars = hypre_SStructStencilVars(stencils); for (i = 0; i < stencil_size; i++) { var2 = stencil_vars[i]; A_smatrix = hypre_SStructPMatrixSMatrix(A_pmatrix, var1, var2); hypre_CopyIndex(hypre_SStructStencilEntry(stencils, i), stencil_shape_i); hypre_ForBoxI(j, sgrid_boxes) { sgrid_box = hypre_BoxArrayBox(sgrid_boxes, j); box_start = hypre_BoxIMin(sgrid_box); box_end = hypre_BoxIMax(sgrid_box); A_smatrix_dbox = hypre_BoxArrayBox(hypre_StructMatrixDataSpace(A_smatrix), j); A_smatrix_value = hypre_StructMatrixExtractPointerByIndex(A_smatrix, j, stencil_shape_i); hypre_BoxGetSize(sgrid_box, loop_size); #define DEVICE_VAR is_device_ptr(values,A_smatrix_value) hypre_BoxLoop2Begin(ndim, loop_size, sgrid_box, box_start, stride, k, A_smatrix_dbox, box_start, stride, iA); { values[k] = A_smatrix_value[iA]; } hypre_BoxLoop2End(k, iA); #undef DEVICE_VAR HYPRE_SStructMatrixSetBoxValues(A_level[0], part_crse, box_start, box_end, var1, 1, &i, values); } /* hypre_ForBoxI */ } /* for i */ hypre_TFree(values, HYPRE_MEMORY_HOST); } /* for var1 */ HYPRE_SStructMatrixAssemble(A_level[0]); hypre_SStructMatvecCreate(&matvec_data_level[0]); hypre_SStructMatvecSetup(matvec_data_level[0], A_level[0], x_level[0]); hypre_SStructPMatvecCreate(&pmatvec_data_level[0]); hypre_SStructPMatvecSetup(pmatvec_data_level[0], hypre_SStructMatrixPMatrix(A_level[0], part_fine), hypre_SStructVectorPVector(x_level[0], part_fine)); hypre_SStructMatvecCreate(&matvec_data); hypre_SStructMatvecSetup(matvec_data, A_rap, x); /*HYPRE_SStructVectorPrint("sstruct.out.b_l", b_level[max_level], 0);*/ /*HYPRE_SStructMatrixPrint("sstruct.out.A_l", A_level[max_level-2], 0);*/ (fac_data -> A_level) = A_level; (fac_data -> matvec_data_level) = matvec_data_level; (fac_data -> pmatvec_data_level) = pmatvec_data_level; (fac_data -> matvec_data) = matvec_data; (fac_data -> interp_data_level) = interp_data_level; (fac_data -> restrict_data_level) = restrict_data_level; /*--------------------------------------------------------------- * Create the fine patch relax_data structure. *---------------------------------------------------------------*/ relax_data_level = hypre_TAlloc(void *, max_level + 1, HYPRE_MEMORY_HOST); for (level = 0; level <= max_level; level++) { relax_data_level[level] = hypre_SysPFMGRelaxCreate(comm); hypre_SysPFMGRelaxSetTol(relax_data_level[level], 0.0); hypre_SysPFMGRelaxSetType(relax_data_level[level], relax_type); if (usr_jacobi_weight) { hypre_SysPFMGRelaxSetJacobiWeight(relax_data_level[level], jacobi_weight); } hypre_SysPFMGRelaxSetTempVec(relax_data_level[level], tx_level[level]); hypre_SysPFMGRelaxSetup(relax_data_level[level], hypre_SStructMatrixPMatrix(A_level[level], part_fine), hypre_SStructVectorPVector(b_level[level], part_fine), hypre_SStructVectorPVector(x_level[level], part_fine)); } (fac_data -> relax_data_level) = relax_data_level; /*--------------------------------------------------------------- * Create the coarsest composite level preconditioned solver. * csolver_type= 1 multigrid-pcg * csolver_type= 2 multigrid *---------------------------------------------------------------*/ if (csolver_type == 1) { HYPRE_SStructPCGCreate(comm, &crse_solver); HYPRE_PCGSetMaxIter((HYPRE_Solver) crse_solver, 1); HYPRE_PCGSetTol((HYPRE_Solver) crse_solver, 1.0e-6); HYPRE_PCGSetTwoNorm((HYPRE_Solver) crse_solver, 1); /* use SysPFMG solver as preconditioner */ HYPRE_SStructSysPFMGCreate(comm, &crse_precond); HYPRE_SStructSysPFMGSetMaxIter(crse_precond, 1); HYPRE_SStructSysPFMGSetTol(crse_precond, 0.0); HYPRE_SStructSysPFMGSetZeroGuess(crse_precond); /* weighted Jacobi = 1; red-black GS = 2 */ HYPRE_SStructSysPFMGSetRelaxType(crse_precond, 3); if (usr_jacobi_weight) { HYPRE_SStructFACSetJacobiWeight(crse_precond, jacobi_weight); } HYPRE_SStructSysPFMGSetNumPreRelax(crse_precond, 1); HYPRE_SStructSysPFMGSetNumPostRelax(crse_precond, 1); HYPRE_PCGSetPrecond((HYPRE_Solver) crse_solver, (HYPRE_PtrToSolverFcn) HYPRE_SStructSysPFMGSolve, (HYPRE_PtrToSolverFcn) HYPRE_SStructSysPFMGSetup, (HYPRE_Solver) crse_precond); HYPRE_PCGSetup((HYPRE_Solver) crse_solver, (HYPRE_Matrix) A_level[0], (HYPRE_Vector) b_level[0], (HYPRE_Vector) x_level[0]); } else if (csolver_type == 2) { crse_precond = NULL; HYPRE_SStructSysPFMGCreate(comm, &crse_solver); HYPRE_SStructSysPFMGSetMaxIter(crse_solver, 1); HYPRE_SStructSysPFMGSetTol(crse_solver, 1.0e-6); HYPRE_SStructSysPFMGSetZeroGuess(crse_solver); /* weighted Jacobi = 1; red-black GS = 2 */ HYPRE_SStructSysPFMGSetRelaxType(crse_solver, relax_type); if (usr_jacobi_weight) { HYPRE_SStructFACSetJacobiWeight(crse_precond, jacobi_weight); } HYPRE_SStructSysPFMGSetNumPreRelax(crse_solver, 1); HYPRE_SStructSysPFMGSetNumPostRelax(crse_solver, 1); HYPRE_SStructSysPFMGSetup(crse_solver, A_level[0], b_level[0], x_level[0]); } (fac_data -> csolver) = crse_solver; (fac_data -> cprecond) = crse_precond; hypre_FacZeroCData(fac_vdata, A_rap); return ierr; } hypre-2.33.0/src/sstruct_ls/fac_solve3.c000066400000000000000000000406151477326011500201260ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * FAC cycle. Refinement patches are solved using relaxation. * Note that the level solves compute corrections to the composite solution. ******************************************************************************/ #include "_hypre_sstruct_ls.h" #include "fac.h" #define DEBUG 0 HYPRE_Int hypre_FACSolve3( void *fac_vdata, hypre_SStructMatrix *A_user, hypre_SStructVector *b_in, hypre_SStructVector *x_in ) { HYPRE_UNUSED_VAR(A_user); hypre_FACData *fac_data = (hypre_FACData*)fac_vdata; hypre_SStructMatrix *A_in = (fac_data-> A_rap); hypre_SStructMatrix **A_level = (fac_data-> A_level); hypre_SStructVector **b_level = (fac_data-> b_level); hypre_SStructVector **x_level = (fac_data-> x_level); hypre_SStructVector **e_level = (fac_data-> e_level); hypre_SStructPVector **tx_level = (fac_data-> tx_level); hypre_SStructVector *tx = (fac_data-> tx); void **relax_data_level = (fac_data-> relax_data_level); void **matvec_data_level = (fac_data-> matvec_data_level); void **pmatvec_data_level = (fac_data-> pmatvec_data_level); void **restrict_data_level = (fac_data-> restrict_data_level); void **interp_data_level = (fac_data-> interp_data_level); void *matvec_data = (fac_data-> matvec_data); HYPRE_SStructSolver csolver = (fac_data-> csolver); HYPRE_Int max_level = (fac_data-> max_levels); HYPRE_Int *levels = (fac_data-> level_to_part); HYPRE_Int max_cycles = (fac_data-> max_cycles); HYPRE_Int rel_change = (fac_data-> rel_change); HYPRE_Int zero_guess = (fac_data-> zero_guess); HYPRE_Int num_pre_smooth = (fac_data-> num_pre_smooth); HYPRE_Int num_post_smooth = (fac_data-> num_post_smooth); HYPRE_Int csolver_type = (fac_data-> csolver_type); HYPRE_Int logging = (fac_data-> logging); HYPRE_Real *norms = (fac_data-> norms); HYPRE_Real *rel_norms = (fac_data-> rel_norms); HYPRE_Real tol = (fac_data-> tol); HYPRE_Int part_crse = 0; HYPRE_Int part_fine = 1; hypre_SStructPMatrix *pA; hypre_SStructPVector *px; hypre_SStructPVector *py; hypre_ParCSRMatrix *parcsrA; hypre_ParVector *parx; hypre_ParVector *pary; HYPRE_Real b_dot_b = 0, r_dot_r, eps = 0; HYPRE_Real e_dot_e = 0, e_dot_e_l, x_dot_x = 1; HYPRE_Int level, i; HYPRE_Int ierr = 0; /*-------------------------------------------------------------- * Special cases *--------------------------------------------------------------*/ hypre_BeginTiming(fac_data -> time_index); (fac_data -> num_iterations) = 0; /* if max_cycles is zero, return */ if (max_cycles == 0) { /* if using a zero initial guess, return zero */ if (zero_guess) { hypre_SStructVectorSetConstantValues(x_in, 0.0); } hypre_EndTiming(fac_data -> time_index); return ierr; } /*-------------------------------------------------------------- * Convergence check- we need to compute the norm of the * composite rhs. *--------------------------------------------------------------*/ if (tol > 0.0) { /* eps = (tol^2) */ hypre_SStructInnerProd(b_in, b_in, &b_dot_b); if (b_dot_b < 0.000000001) { hypre_SStructInnerProd(x_in, x_in, &b_dot_b); } eps = tol * tol; /* if rhs is zero, return a zero solution */ if (b_dot_b == 0.0) { hypre_SStructVectorSetConstantValues(x_in, 0.0); if (logging > 0) { norms[0] = 0.0; rel_norms[0] = 0.0; } hypre_EndTiming(fac_data -> time_index); return ierr; } } /*-------------------------------------------------------------- * FAC-cycles: *--------------------------------------------------------------*/ for (i = 0; i < max_cycles; i++) { hypre_SStructCopy(b_in, tx); hypre_SStructMatvecCompute(matvec_data, -1.0, A_in, x_in, 1.0, tx); /*----------------------------------------------------------- * convergence check *-----------------------------------------------------------*/ if (tol > 0.0) { /*----------------------------------------------------------- * Compute the inner product of the composite residual. *-----------------------------------------------------------*/ hypre_SStructInnerProd(tx, tx, &r_dot_r); if (logging > 0) { norms[i] = hypre_sqrt(r_dot_r); if (b_dot_b > 0) { rel_norms[i] = hypre_sqrt(r_dot_r / b_dot_b); } else { rel_norms[i] = 0.0; } } /* always do at least 1 FAC V-cycle */ if ((r_dot_r / b_dot_b < eps) && (i > 0)) { if (rel_change) { if ((e_dot_e / x_dot_x) < eps) { break; } } else { break; } } } /*----------------------------------------------------------- * Extract the level composite rhs's. Since we are using a * correction scheme fac cycle, the rhs's is the composite * residuals of A_in, x_in, and b_in. *-----------------------------------------------------------*/ hypre_SStructPCopy(hypre_SStructVectorPVector(tx, levels[max_level]), hypre_SStructVectorPVector(b_level[max_level], part_fine)); for (level = 1; level <= max_level; level++) { hypre_SStructPCopy(hypre_SStructVectorPVector(tx, levels[level - 1]), hypre_SStructVectorPVector(b_level[level], part_crse)); } /*-------------------------------------------------------------- * Down cycle: *--------------------------------------------------------------*/ hypre_SStructVectorSetConstantValues(x_level[max_level], 0.0); for (level = max_level; level > 0; level--) { /*----------------------------------------------------------- * local fine solve: the rhs has already been updated with * the "unstructured" interface coupling. That is, since the * composite corrections are initialized to zero, the patch * fine-to-coarse boundary couplings (conditions) do not * contribute to the rhs of the patch equations. *-----------------------------------------------------------*/ pA = hypre_SStructMatrixPMatrix(A_level[level], part_fine); px = hypre_SStructVectorPVector(x_level[level], part_fine); py = hypre_SStructVectorPVector(b_level[level], part_fine); hypre_FacLocalRelax(relax_data_level[level], pA, px, py, num_pre_smooth, &zero_guess); /*----------------------------------------------------------- * set up the coarse part problem: update two-level composite * residual, restrict, and zero coarse approximation. * * The residual is updated using the patch solution. This * involves coarse-to-fine matvec contributions. Since * part_crse of x_level is zero, only zero fine-to-coarse * contributions are involved. *-----------------------------------------------------------*/ /* structured contribution */ hypre_SStructPMatvecCompute(pmatvec_data_level[level], -1.0, pA, px, 1.0, py); /* unstructured contribution */ parcsrA = hypre_SStructMatrixParCSRMatrix(A_level[level]); hypre_SStructVectorConvert(x_level[level], &parx); hypre_SStructVectorConvert(b_level[level], &pary); hypre_ParCSRMatrixMatvec(-1.0, parcsrA, parx, 1.0, pary); hypre_SStructVectorRestore(x_level[level], parx); hypre_SStructVectorRestore(b_level[level], pary); /*----------------------------------------------------------- * restrict the two-level composite residual. * * This involves restricting the two-level composite residual * of the current level to the part_fine rhs of the next * descending level, or part_crse if the next descending * level is the coarsest. Part_fine of the two-level composite * residual is resricted, part_crse is injected. *-----------------------------------------------------------*/ if (level > 1) { hypre_FACRestrict2(restrict_data_level[level], b_level[level], hypre_SStructVectorPVector(b_level[level - 1], part_fine)); } else { hypre_FACRestrict2(restrict_data_level[level], b_level[level], hypre_SStructVectorPVector(b_level[level - 1], part_crse)); } hypre_SStructVectorSetConstantValues(x_level[level - 1], 0.0); } /*----------------------------------------------------------- * coarsest solve: * The coarsest level is solved using the part_crse data of * A_level[0], b_level[0], x_level[0]. Therefore, copy the * solution to the part_fine. *-----------------------------------------------------------*/ level = 0; if (csolver_type == 1) { HYPRE_PCGSolve((HYPRE_Solver) csolver, (HYPRE_Matrix) A_level[0], (HYPRE_Vector) b_level[0], (HYPRE_Vector) x_level[0]); } else if (csolver_type == 2) { HYPRE_SStructSysPFMGSolve(csolver, A_level[0], b_level[0], x_level[0]); } hypre_SStructPCopy(hypre_SStructVectorPVector(x_level[0], part_crse), hypre_SStructVectorPVector(x_level[0], part_fine)); #if DEBUG #endif /*----------------------------------------------------------- * Up cycle *-----------------------------------------------------------*/ for (level = 1; level <= max_level; level++) { /*----------------------------------------------------------- * Interpolate error, update the residual, and correct * (x = x + Pe_c). Interpolation is done in several stages: * 1)interpolate only the coarse unknowns away from the * refinement patch: identity interpolation, interpolated * to part_crse of the finer composite level. * 2) interpolate the coarse unknowns under the fine grid * patch *-----------------------------------------------------------*/ hypre_SStructVectorSetConstantValues(e_level[level], 0.0); /* hypre_SStructVectorSetConstantValues(x_level[max_level-1], 1.0); */ /*----------------------------------------------------------- * interpolation of unknowns away from the underlying * fine grid patch. Identity interpolation. *-----------------------------------------------------------*/ hypre_FAC_IdentityInterp2(interp_data_level[level - 1], hypre_SStructVectorPVector(x_level[level - 1], part_fine), e_level[level]); /*----------------------------------------------------------- * complete the interpolation- unknowns under the fine * patch. Weighted interpolation. *-----------------------------------------------------------*/ hypre_FAC_WeightedInterp2(interp_data_level[level - 1], hypre_SStructVectorPVector(x_level[level - 1], part_fine), e_level[level]); /*----------------------------------------------------------- * add the correction to x_level *-----------------------------------------------------------*/ hypre_SStructAxpy(1.0, e_level[level], x_level[level]); /*----------------------------------------------------------- * update residual due to the interpolated correction *-----------------------------------------------------------*/ if (num_post_smooth) { hypre_SStructMatvecCompute(matvec_data_level[level], -1.0, A_level[level], e_level[level], 1.0, b_level[level]); } /*----------------------------------------------------------- * post-smooth on the refinement patch *-----------------------------------------------------------*/ if (num_post_smooth) { hypre_SStructPVectorSetConstantValues(tx_level[level], 0.0); pA = hypre_SStructMatrixPMatrix(A_level[level], part_fine); py = hypre_SStructVectorPVector(b_level[level], part_fine); hypre_FacLocalRelax(relax_data_level[level], pA, tx_level[level], py, num_post_smooth, &zero_guess); /*----------------------------------------------------------- * add the post-smooth solution to x_level and to the error * vector e_level if level= max_level. The e_levels should * contain only the correction to x_in. *-----------------------------------------------------------*/ hypre_SStructPAxpy(1.0, tx_level[level], hypre_SStructVectorPVector(x_level[level], part_fine)); if (level == max_level) { hypre_SStructPAxpy(1.0, tx_level[level], hypre_SStructVectorPVector(e_level[level], part_fine)); } } } /*-------------------------------------------------------------- * Add two-level corrections x_level to the composite solution * x_in. * * Notice that except for the finest two-level sstruct_vector, * only the part_crse of each two-level sstruct_vector has * a correction to x_in. For max_level, both part_crse and * part_fine has a correction to x_in. *--------------------------------------------------------------*/ hypre_SStructPAxpy(1.0, hypre_SStructVectorPVector(x_level[max_level], part_fine), hypre_SStructVectorPVector(x_in, levels[max_level])); for (level = 1; level <= max_level; level++) { hypre_SStructPAxpy(1.0, hypre_SStructVectorPVector(x_level[level], part_crse), hypre_SStructVectorPVector(x_in, levels[level - 1]) ); } /*----------------------------------------------- * convergence check *-----------------------------------------------*/ if ((tol > 0.0) && (rel_change)) { hypre_SStructInnerProd(x_in, x_in, &x_dot_x); hypre_SStructInnerProd(e_level[max_level], e_level[max_level], &e_dot_e); for (level = 1; level < max_level; level++) { hypre_SStructPInnerProd( hypre_SStructVectorPVector(e_level[level], part_crse), hypre_SStructVectorPVector(e_level[level], part_crse), &e_dot_e_l); e_dot_e += e_dot_e_l; } } (fac_data -> num_iterations) = (i + 1); } #if DEBUG #endif hypre_EndTiming(fac_data -> time_index); return ierr; } hypre-2.33.0/src/sstruct_ls/fac_zero_cdata.c000066400000000000000000000154201477326011500210220ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "_hypre_sstruct_ls.h" #include "fac.h" /*-------------------------------------------------------------------------- * hypre_FacZeroCData: Zeroes the data over the underlying coarse indices of * the refinement patches. * Algo.:For each cbox * { * 1) refine cbox and boxman_intersect with fboxman * 2) loop over intersection boxes * 3) coarsen and contract (only the coarse nodes on this * processor) and zero data. * } * *--------------------------------------------------------------------------*/ HYPRE_Int hypre_FacZeroCData( void *fac_vdata, hypre_SStructMatrix *A ) { hypre_FACData *fac_data = (hypre_FACData*)fac_vdata; hypre_SStructGrid *grid; hypre_SStructPGrid *p_cgrid; hypre_StructGrid *cgrid; hypre_BoxArray *cgrid_boxes; hypre_Box *cgrid_box; hypre_BoxManager *fboxman; hypre_BoxManEntry **boxman_entries; HYPRE_Int nboxman_entries; hypre_Box scaled_box; hypre_Box intersect_box; hypre_SStructPMatrix *level_pmatrix; hypre_StructStencil *stencils; HYPRE_Int stencil_size; hypre_Index *refine_factors; hypre_Index temp_index; hypre_Index ilower, iupper; HYPRE_Int max_level = fac_data -> max_levels; HYPRE_Int *level_to_part = fac_data -> level_to_part; HYPRE_Int ndim = hypre_SStructMatrixNDim(A); HYPRE_Int part_crse = 0; HYPRE_Int part_fine = 1; HYPRE_Int level; HYPRE_Int nvars, var; HYPRE_Int ci, i, j, rem, intersect_size; HYPRE_Real *values; HYPRE_Int ierr = 0; hypre_BoxInit(&scaled_box, ndim); hypre_BoxInit(&intersect_box, ndim); for (level = max_level; level > 0; level--) { level_pmatrix = hypre_SStructMatrixPMatrix(fac_data -> A_level[level], part_crse); grid = (fac_data -> grid_level[level]); refine_factors = &(fac_data -> refine_factors[level]); p_cgrid = hypre_SStructGridPGrid(grid, part_crse); nvars = hypre_SStructPGridNVars(p_cgrid); for (var = 0; var < nvars; var++) { stencils = hypre_SStructPMatrixSStencil(level_pmatrix, var, var); stencil_size = hypre_StructStencilSize(stencils); /*--------------------------------------------------------------------- * For each variable, find the underlying boxes for each coarse box. *---------------------------------------------------------------------*/ cgrid = hypre_SStructPGridSGrid(p_cgrid, var); cgrid_boxes = hypre_StructGridBoxes(cgrid); fboxman = hypre_SStructGridBoxManager(grid, part_fine, var); hypre_ForBoxI(ci, cgrid_boxes) { cgrid_box = hypre_BoxArrayBox(cgrid_boxes, ci); hypre_ClearIndex(temp_index); hypre_StructMapCoarseToFine(hypre_BoxIMin(cgrid_box), temp_index, *refine_factors, hypre_BoxIMin(&scaled_box)); for (i = 0; i < ndim; i++) { temp_index[i] = (*refine_factors)[i] - 1; } hypre_StructMapCoarseToFine(hypre_BoxIMax(cgrid_box), temp_index, *refine_factors, hypre_BoxIMax(&scaled_box)); hypre_BoxManIntersect(fboxman, hypre_BoxIMin(&scaled_box), hypre_BoxIMax(&scaled_box), &boxman_entries, &nboxman_entries); for (i = 0; i < nboxman_entries; i++) { hypre_BoxManEntryGetExtents(boxman_entries[i], ilower, iupper); hypre_BoxSetExtents(&intersect_box, ilower, iupper); hypre_IntersectBoxes(&intersect_box, &scaled_box, &intersect_box); /* adjust the box so that it is divisible by refine_factors */ for (j = 0; j < ndim; j++) { rem = hypre_BoxIMin(&intersect_box)[j] % (*refine_factors)[j]; if (rem) { hypre_BoxIMin(&intersect_box)[j] += (*refine_factors)[j] - rem; } } hypre_ClearIndex(temp_index); hypre_StructMapFineToCoarse(hypre_BoxIMin(&intersect_box), temp_index, *refine_factors, hypre_BoxIMin(&intersect_box)); hypre_StructMapFineToCoarse(hypre_BoxIMax(&intersect_box), temp_index, *refine_factors, hypre_BoxIMax(&intersect_box)); intersect_size = hypre_BoxVolume(&intersect_box); if (intersect_size > 0) { /*------------------------------------------------------------ * Coarse underlying box found. Now zero off. *------------------------------------------------------------*/ values = hypre_CTAlloc(HYPRE_Real, intersect_size, HYPRE_MEMORY_HOST); for (j = 0; j < stencil_size; j++) { HYPRE_SStructMatrixSetBoxValues(fac_data -> A_level[level], part_crse, hypre_BoxIMin(&intersect_box), hypre_BoxIMax(&intersect_box), var, 1, &j, values); HYPRE_SStructMatrixSetBoxValues(A, level_to_part[level - 1], hypre_BoxIMin(&intersect_box), hypre_BoxIMax(&intersect_box), var, 1, &j, values); } hypre_TFree(values, HYPRE_MEMORY_HOST); } /* if (intersect_size > 0) */ } /* for (i= 0; i< nboxman_entries; i++) */ hypre_TFree(boxman_entries, HYPRE_MEMORY_HOST); } /* hypre_ForBoxI(ci, cgrid_boxes) */ } /* for (var= 0; var< nvars; var++) */ } /* for (level= max_level; level> 0; level--) */ return ierr; } hypre-2.33.0/src/sstruct_ls/fac_zero_stencilcoef.c000066400000000000000000000416671477326011500222600ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "_hypre_sstruct_ls.h" #include "_hypre_struct_mv.hpp" #include "fac.h" #define AbsStencilShape(stencil, abs_shape) \ { \ HYPRE_Int ii,jj,kk; \ ii = hypre_IndexX(stencil); \ jj = hypre_IndexY(stencil); \ kk = hypre_IndexZ(stencil); \ abs_shape= hypre_abs(ii) + hypre_abs(jj) + hypre_abs(kk); \ } /*-------------------------------------------------------------------------- * hypre_FacZeroCFSten: Zeroes the coarse stencil coefficients that reach * into an underlying coarsened refinement box. * Algo: For each cbox * { * 1) refine cbox and expand by one in each direction * 2) boxman_intersect with the fboxman * 3) loop over intersection boxes to see if stencil * reaches over. * } *--------------------------------------------------------------------------*/ HYPRE_Int hypre_FacZeroCFSten( hypre_SStructPMatrix *Af, hypre_SStructPMatrix *Ac, hypre_SStructGrid *grid, HYPRE_Int fine_part, hypre_Index rfactors ) { HYPRE_UNUSED_VAR(Af); hypre_BoxManager *fboxman; hypre_BoxManEntry **boxman_entries; HYPRE_Int nboxman_entries; hypre_SStructPGrid *p_cgrid; hypre_Box fgrid_box; hypre_StructGrid *cgrid; hypre_BoxArray *cgrid_boxes; hypre_Box *cgrid_box; hypre_Box scaled_box; hypre_Box *shift_ibox; hypre_StructMatrix *smatrix; hypre_StructStencil *stencils; HYPRE_Int stencil_size; hypre_Index refine_factors, upper_shift; hypre_Index stride; hypre_Index stencil_shape; hypre_Index zero_index, ilower, iupper; HYPRE_Int nvars, var1, var2; HYPRE_Int ndim; hypre_Box *ac_dbox; HYPRE_Real *ac_ptr; hypre_Index loop_size; HYPRE_Int ci, i, j; HYPRE_Int abs_shape; HYPRE_Int ierr = 0; p_cgrid = hypre_SStructPMatrixPGrid(Ac); nvars = hypre_SStructPMatrixNVars(Ac); ndim = hypre_SStructPGridNDim(p_cgrid); hypre_BoxInit(&fgrid_box, ndim); hypre_BoxInit(&scaled_box, ndim); hypre_ClearIndex(zero_index); hypre_ClearIndex(stride); hypre_ClearIndex(upper_shift); for (i = 0; i < ndim; i++) { stride[i] = 1; upper_shift[i] = rfactors[i] - 1; } hypre_CopyIndex(rfactors, refine_factors); if (ndim < 3) { for (i = ndim; i < 3; i++) { refine_factors[i] = 1; } } for (var1 = 0; var1 < nvars; var1++) { cgrid = hypre_SStructPGridSGrid(hypre_SStructPMatrixPGrid(Ac), var1); cgrid_boxes = hypre_StructGridBoxes(cgrid); fboxman = hypre_SStructGridBoxManager(grid, fine_part, var1); /*------------------------------------------------------------------ * For each parent coarse box find all fboxes that may be connected * through a stencil entry- refine this box, expand it by one * in each direction, and boxman_intersect with fboxman *------------------------------------------------------------------*/ hypre_ForBoxI(ci, cgrid_boxes) { cgrid_box = hypre_BoxArrayBox(cgrid_boxes, ci); hypre_StructMapCoarseToFine(hypre_BoxIMin(cgrid_box), zero_index, refine_factors, hypre_BoxIMin(&scaled_box)); hypre_StructMapCoarseToFine(hypre_BoxIMax(cgrid_box), upper_shift, refine_factors, hypre_BoxIMax(&scaled_box)); hypre_SubtractIndexes(hypre_BoxIMin(&scaled_box), stride, 3, hypre_BoxIMin(&scaled_box)); hypre_AddIndexes(hypre_BoxIMax(&scaled_box), stride, 3, hypre_BoxIMax(&scaled_box)); hypre_BoxManIntersect(fboxman, hypre_BoxIMin(&scaled_box), hypre_BoxIMax(&scaled_box), &boxman_entries, &nboxman_entries); for (var2 = 0; var2 < nvars; var2++) { stencils = hypre_SStructPMatrixSStencil(Ac, var1, var2); if (stencils != NULL) { stencil_size = hypre_StructStencilSize(stencils); smatrix = hypre_SStructPMatrixSMatrix(Ac, var1, var2); ac_dbox = hypre_BoxArrayBox(hypre_StructMatrixDataSpace(smatrix), ci); /*--------------------------------------------------------- * Find the stencil coefficients that must be zeroed off. * Loop over all possible boxes. *---------------------------------------------------------*/ for (i = 0; i < stencil_size; i++) { hypre_CopyIndex(hypre_StructStencilElement(stencils, i), stencil_shape); AbsStencilShape(stencil_shape, abs_shape); if (abs_shape) /* non-centre stencils are zeroed */ { /* look for connecting fboxes that must be zeroed. */ for (j = 0; j < nboxman_entries; j++) { hypre_BoxManEntryGetExtents(boxman_entries[j], ilower, iupper); hypre_BoxSetExtents(&fgrid_box, ilower, iupper); shift_ibox = hypre_CF_StenBox(&fgrid_box, cgrid_box, stencil_shape, refine_factors, ndim); if ( hypre_BoxVolume(shift_ibox) ) { ac_ptr = hypre_StructMatrixExtractPointerByIndex(smatrix, ci, stencil_shape); hypre_BoxGetSize(shift_ibox, loop_size); #define DEVICE_VAR is_device_ptr(ac_ptr) hypre_BoxLoop1Begin(ndim, loop_size, ac_dbox, hypre_BoxIMin(shift_ibox), stride, iac); { ac_ptr[iac] = 0.0; } hypre_BoxLoop1End(iac); #undef DEVICE_VAR } /* if ( hypre_BoxVolume(shift_ibox) ) */ hypre_BoxDestroy(shift_ibox); } /* for (j= 0; j< nboxman_entries; j++) */ } /* if (abs_shape) */ } /* for (i= 0; i< stencil_size; i++) */ } /* if (stencils != NULL) */ } /* for (var2= 0; var2< nvars; var2++) */ hypre_TFree(boxman_entries, HYPRE_MEMORY_HOST); } /* hypre_ForBoxI ci */ } /* for (var1= 0; var1< nvars; var1++) */ return ierr; } /*-------------------------------------------------------------------------- * hypre_FacZeroFCSten: Zeroes the fine stencil coefficients that reach * into a coarse box. * Idea: zero off any stencil connection of a fine box that does not * connect to a sibling box * Algo: For each fbox * { * 1) expand by one in each direction so that sibling boxes can be * reached * 2) boxman_intersect with the fboxman to get all fboxes including * itself and the siblings * 3) loop over intersection boxes, shift them in the stencil * direction (now we are off the fbox), and subtract any sibling * extents. The remaining chunks (boxes of a box_array) are * the desired but shifted extents. * 4) shift these shifted extents in the negative stencil direction * to get back into fbox. Zero-off the matrix over these latter * extents. * } *--------------------------------------------------------------------------*/ HYPRE_Int hypre_FacZeroFCSten( hypre_SStructPMatrix *A, hypre_SStructGrid *grid, HYPRE_Int fine_part) { MPI_Comm comm = hypre_SStructGridComm(grid); hypre_BoxManager *fboxman; hypre_BoxManEntry **boxman_entries; HYPRE_Int nboxman_entries; hypre_SStructPGrid *p_fgrid; hypre_StructGrid *fgrid; hypre_BoxArray *fgrid_boxes; hypre_Box *fgrid_box; hypre_Box scaled_box; hypre_BoxArray *intersect_boxes, *tmp_box_array1, *tmp_box_array2; hypre_StructMatrix *smatrix; hypre_StructStencil *stencils; HYPRE_Int stencil_size; hypre_Index stride, ilower, iupper; hypre_Index stencil_shape, shift_index; hypre_Box shift_ibox; hypre_Box intersect_box; hypre_Index size_ibox; HYPRE_Int nvars, var1, var2; HYPRE_Int ndim; hypre_Box *a_dbox; HYPRE_Real *a_ptr; hypre_Index loop_size; HYPRE_Int fi, fj, i, j; HYPRE_Int abs_shape; HYPRE_Int myid, proc; HYPRE_Int ierr = 0; hypre_MPI_Comm_rank(comm, &myid); p_fgrid = hypre_SStructPMatrixPGrid(A); nvars = hypre_SStructPMatrixNVars(A); ndim = hypre_SStructPGridNDim(p_fgrid); hypre_BoxInit(&scaled_box, ndim); hypre_BoxInit(&shift_ibox, ndim); hypre_BoxInit(&intersect_box, ndim); hypre_ClearIndex(stride); for (i = 0; i < ndim; i++) { stride[i] = 1; } tmp_box_array1 = hypre_BoxArrayCreate(1, ndim); for (var1 = 0; var1 < nvars; var1++) { fgrid = hypre_SStructPGridSGrid(hypre_SStructPMatrixPGrid(A), var1); fgrid_boxes = hypre_StructGridBoxes(fgrid); fboxman = hypre_SStructGridBoxManager(grid, fine_part, var1); hypre_ForBoxI(fi, fgrid_boxes) { fgrid_box = hypre_BoxArrayBox(fgrid_boxes, fi); hypre_ClearIndex(size_ibox); for (i = 0; i < ndim; i++) { size_ibox[i] = hypre_BoxSizeD(fgrid_box, i) - 1; } /* expand fgrid_box & boxman_intersect with fboxman. */ hypre_SubtractIndexes(hypre_BoxIMin(fgrid_box), stride, 3, hypre_BoxIMin(&scaled_box)); hypre_AddIndexes(hypre_BoxIMax(fgrid_box), stride, 3, hypre_BoxIMax(&scaled_box)); hypre_BoxManIntersect(fboxman, hypre_BoxIMin(&scaled_box), hypre_BoxIMax(&scaled_box), &boxman_entries, &nboxman_entries); for (var2 = 0; var2 < nvars; var2++) { stencils = hypre_SStructPMatrixSStencil(A, var1, var2); if (stencils != NULL) { stencil_size = hypre_StructStencilSize(stencils); smatrix = hypre_SStructPMatrixSMatrix(A, var1, var2); a_dbox = hypre_BoxArrayBox(hypre_StructMatrixDataSpace(smatrix), fi); for (i = 0; i < stencil_size; i++) { hypre_CopyIndex(hypre_StructStencilElement(stencils, i), stencil_shape); AbsStencilShape(stencil_shape, abs_shape); if (abs_shape) /* non-centre stencils are zeroed */ { hypre_SetIndex3(shift_index, size_ibox[0]*stencil_shape[0], size_ibox[1]*stencil_shape[1], size_ibox[2]*stencil_shape[2]); hypre_AddIndexes(shift_index, hypre_BoxIMin(fgrid_box), 3, hypre_BoxIMin(&shift_ibox)); hypre_AddIndexes(shift_index, hypre_BoxIMax(fgrid_box), 3, hypre_BoxIMax(&shift_ibox)); hypre_IntersectBoxes(&shift_ibox, fgrid_box, &shift_ibox); hypre_SetIndex3(shift_index, -stencil_shape[0], -stencil_shape[1], -stencil_shape[2]); /*----------------------------------------------------------- * Check to see if the stencil does not couple to a sibling * box. These boxes should be in boxman_entries. But do not * subtract fgrid_box itself, which is also in boxman_entries. *-----------------------------------------------------------*/ hypre_AddIndexes(stencil_shape, hypre_BoxIMin(&shift_ibox), 3, hypre_BoxIMin(&shift_ibox)); hypre_AddIndexes(stencil_shape, hypre_BoxIMax(&shift_ibox), 3, hypre_BoxIMax(&shift_ibox)); intersect_boxes = hypre_BoxArrayCreate(1, ndim); hypre_CopyBox(&shift_ibox, hypre_BoxArrayBox(intersect_boxes, 0)); for (j = 0; j < nboxman_entries; j++) { hypre_SStructBoxManEntryGetProcess(boxman_entries[j], &proc); hypre_SStructBoxManEntryGetBoxnum(boxman_entries[j], &fj); if ((proc != myid) || (fj != fi)) { hypre_BoxManEntryGetExtents(boxman_entries[j], ilower, iupper); hypre_BoxSetExtents(&scaled_box, ilower, iupper); hypre_IntersectBoxes(&shift_ibox, &scaled_box, &intersect_box); if ( hypre_BoxVolume(&intersect_box) ) { hypre_CopyBox(&intersect_box, hypre_BoxArrayBox(tmp_box_array1, 0)); tmp_box_array2 = hypre_BoxArrayCreate(0, ndim); hypre_SubtractBoxArrays(intersect_boxes, tmp_box_array1, tmp_box_array2); hypre_BoxArrayDestroy(tmp_box_array2); } } } /* for (j= 0; j< nboxman_entries; j++) */ /*----------------------------------------------------------- * intersect_boxes now has the shifted extents for the * coefficients to be zeroed. *-----------------------------------------------------------*/ a_ptr = hypre_StructMatrixExtractPointerByIndex(smatrix, fi, stencil_shape); hypre_ForBoxI(fj, intersect_boxes) { hypre_CopyBox(hypre_BoxArrayBox(intersect_boxes, fj), &intersect_box); hypre_AddIndexes(shift_index, hypre_BoxIMin(&intersect_box), 3, hypre_BoxIMin(&intersect_box)); hypre_AddIndexes(shift_index, hypre_BoxIMax(&intersect_box), 3, hypre_BoxIMax(&intersect_box)); hypre_BoxGetSize(&intersect_box, loop_size); #define DEVICE_VAR is_device_ptr(a_ptr) hypre_BoxLoop1Begin(ndim, loop_size, a_dbox, hypre_BoxIMin(&intersect_box), stride, ia); { a_ptr[ia] = 0.0; } hypre_BoxLoop1End(ia); #undef DEVICE_VAR } /* hypre_ForBoxI(fj, intersect_boxes) */ hypre_BoxArrayDestroy(intersect_boxes); } /* if (abs_shape) */ } /* for (i= 0; i< stencil_size; i++) */ } /* if (stencils != NULL) */ } /* for (var2= 0; var2< nvars; var2++) */ hypre_TFree(boxman_entries, HYPRE_MEMORY_HOST); } /* hypre_ForBoxI(fi, fgrid_boxes) */ } /* for (var1= 0; var1< nvars; var1++) */ hypre_BoxArrayDestroy(tmp_box_array1); return ierr; } hypre-2.33.0/src/sstruct_ls/krylov.c000066400000000000000000000025671477326011500174340ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "_hypre_utilities.h" #include "_hypre_sstruct_ls.h" HYPRE_Int hypre_SStructKrylovCopyVector( void *x, void *y ); /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SStructKrylovIdentitySetup( void *vdata, void *A, void *b, void *x ) { HYPRE_UNUSED_VAR(vdata); HYPRE_UNUSED_VAR(A); HYPRE_UNUSED_VAR(b); HYPRE_UNUSED_VAR(x); return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SStructKrylovIdentity( void *vdata, void *A, void *b, void *x ) { HYPRE_UNUSED_VAR(vdata); HYPRE_UNUSED_VAR(A); return ( hypre_SStructKrylovCopyVector(b, x) ); } hypre-2.33.0/src/sstruct_ls/krylov_sstruct.c000066400000000000000000000220401477326011500212070ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * SStruct matrix-vector implementation of Krylov interface routines. * *****************************************************************************/ #include "_hypre_sstruct_ls.h" /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ void * hypre_SStructKrylovCAlloc( size_t count, size_t elt_size, HYPRE_MemoryLocation location ) { return ( (void*) hypre_CTAlloc(char, count * elt_size, location) ); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SStructKrylovFree( void *ptr ) { hypre_TFree( ptr, HYPRE_MEMORY_HOST); return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ void * hypre_SStructKrylovCreateVector( void *vvector ) { hypre_SStructVector *vector = (hypre_SStructVector *)vvector; hypre_SStructVector *new_vector; HYPRE_Int object_type; HYPRE_Int nparts = hypre_SStructVectorNParts(vector); hypre_SStructPVector *pvector; hypre_StructVector *svector; hypre_SStructPVector *new_pvector; hypre_StructVector *new_svector; HYPRE_Int *num_ghost; HYPRE_Int part; HYPRE_Int nvars, var; object_type = hypre_SStructVectorObjectType(vector); HYPRE_SStructVectorCreate(hypre_SStructVectorComm(vector), hypre_SStructVectorGrid(vector), &new_vector); HYPRE_SStructVectorSetObjectType(new_vector, object_type); if (object_type == HYPRE_SSTRUCT || object_type == HYPRE_STRUCT) { for (part = 0; part < nparts; part++) { pvector = hypre_SStructVectorPVector(vector, part); new_pvector = hypre_SStructVectorPVector(new_vector, part); nvars = hypre_SStructPVectorNVars(pvector); for (var = 0; var < nvars; var++) { svector = hypre_SStructPVectorSVector(pvector, var); num_ghost = hypre_StructVectorNumGhost(svector); new_svector = hypre_SStructPVectorSVector(new_pvector, var); hypre_StructVectorSetNumGhost(new_svector, num_ghost); } } } HYPRE_SStructVectorInitialize(new_vector); HYPRE_SStructVectorAssemble(new_vector); return ( (void *) new_vector ); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ void * hypre_SStructKrylovCreateVectorArray(HYPRE_Int n, void *vvector ) { hypre_SStructVector *vector = (hypre_SStructVector *)vvector; hypre_SStructVector **new_vector; HYPRE_Int object_type; HYPRE_Int nparts = hypre_SStructVectorNParts(vector); hypre_SStructPVector *pvector; hypre_StructVector *svector; hypre_SStructPVector *new_pvector; hypre_StructVector *new_svector; HYPRE_Int *num_ghost; HYPRE_Int part; HYPRE_Int nvars, var; HYPRE_Int i; object_type = hypre_SStructVectorObjectType(vector); new_vector = hypre_CTAlloc(hypre_SStructVector*, n, HYPRE_MEMORY_HOST); for (i = 0; i < n; i++) { HYPRE_SStructVectorCreate(hypre_SStructVectorComm(vector), hypre_SStructVectorGrid(vector), &new_vector[i]); HYPRE_SStructVectorSetObjectType(new_vector[i], object_type); if (object_type == HYPRE_SSTRUCT || object_type == HYPRE_STRUCT) { for (part = 0; part < nparts; part++) { pvector = hypre_SStructVectorPVector(vector, part); new_pvector = hypre_SStructVectorPVector(new_vector[i], part); nvars = hypre_SStructPVectorNVars(pvector); for (var = 0; var < nvars; var++) { svector = hypre_SStructPVectorSVector(pvector, var); num_ghost = hypre_StructVectorNumGhost(svector); new_svector = hypre_SStructPVectorSVector(new_pvector, var); hypre_StructVectorSetNumGhost(new_svector, num_ghost); } } } HYPRE_SStructVectorInitialize(new_vector[i]); HYPRE_SStructVectorAssemble(new_vector[i]); } return ( (void *) new_vector ); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SStructKrylovDestroyVector( void *vvector ) { hypre_SStructVector *vector = (hypre_SStructVector *)vvector; return ( HYPRE_SStructVectorDestroy( vector ) ); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ void * hypre_SStructKrylovMatvecCreate( void *A, void *x ) { void *matvec_data; hypre_SStructMatvecCreate( &matvec_data ); hypre_SStructMatvecSetup( matvec_data, (hypre_SStructMatrix *) A, (hypre_SStructVector *) x ); return ( matvec_data ); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SStructKrylovMatvec( void *matvec_data, HYPRE_Complex alpha, void *A, void *x, HYPRE_Complex beta, void *y ) { HYPRE_UNUSED_VAR(matvec_data); return ( hypre_SStructMatvec( alpha, (hypre_SStructMatrix *) A, (hypre_SStructVector *) x, beta, (hypre_SStructVector *) y ) ); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SStructKrylovMatvecDestroy( void *matvec_data ) { return ( hypre_SStructMatvecDestroy( matvec_data ) ); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Real hypre_SStructKrylovInnerProd( void *x, void *y ) { HYPRE_Real result; hypre_SStructInnerProd( (hypre_SStructVector *) x, (hypre_SStructVector *) y, &result ); return result; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SStructKrylovCopyVector( void *x, void *y ) { return ( hypre_SStructCopy( (hypre_SStructVector *) x, (hypre_SStructVector *) y ) ); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SStructKrylovClearVector( void *x ) { return ( hypre_SStructVectorSetConstantValues( (hypre_SStructVector *) x, 0.0 ) ); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SStructKrylovScaleVector( HYPRE_Complex alpha, void *x ) { return ( hypre_SStructScale( alpha, (hypre_SStructVector *) x ) ); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SStructKrylovAxpy( HYPRE_Complex alpha, void *x, void *y ) { return ( hypre_SStructAxpy( alpha, (hypre_SStructVector *) x, (hypre_SStructVector *) y ) ); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SStructKrylovCommInfo( void *A, HYPRE_Int *my_id, HYPRE_Int *num_procs ) { MPI_Comm comm = hypre_SStructMatrixComm((hypre_SStructMatrix *) A); hypre_MPI_Comm_size(comm, num_procs); hypre_MPI_Comm_rank(comm, my_id); return hypre_error_flag; } hypre-2.33.0/src/sstruct_ls/maxwell_PNedelec.c000066400000000000000000004115321477326011500213120ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * OpenMP Problems * * Need to fix the way these variables are set and incremented in loops: * j, k (only where they are listed at the end of SMP_PRIVATE) * ******************************************************************************/ #include "_hypre_sstruct_ls.h" hypre_IJMatrix * hypre_Maxwell_PNedelec( hypre_SStructGrid *fgrid_edge, hypre_SStructGrid *cgrid_edge, hypre_Index rfactor ) { MPI_Comm comm = (fgrid_edge-> comm); HYPRE_IJMatrix edge_Edge; hypre_SStructPGrid *p_cgrid, *p_fgrid; hypre_StructGrid *var_cgrid, *var_fgrid; hypre_BoxArray *cboxes, *fboxes, *box_array; hypre_Box *cbox, *fbox, *cellbox, *vbox, copy_box; hypre_BoxArray **contract_fedgeBoxes; hypre_Index **Edge_cstarts, **upper_shifts, **lower_shifts; HYPRE_Int **cfbox_mapping, **fcbox_mapping; hypre_BoxManEntry *entry; HYPRE_BigInt rank, rank2; HYPRE_BigInt start_rank1, start_rank2; HYPRE_Int nedges; HYPRE_BigInt *iedgeEdge; HYPRE_BigInt *jedge_Edge; HYPRE_Real *vals_edgeEdge; HYPRE_Real fCedge_ratio; HYPRE_Int *ncols_edgeEdge; hypre_Index cindex; hypre_Index findex; hypre_Index var_index, *boxoffset, *suboffset; hypre_Index loop_size, start, cstart, stride, hi_index, lindex; hypre_Index ishift, jshift, kshift, zero_index, one_index; HYPRE_Int n_boxoffsets; HYPRE_Int nparts = hypre_SStructGridNParts(fgrid_edge); HYPRE_Int ndim = hypre_SStructGridNDim(fgrid_edge); HYPRE_SStructVariable *vartypes, *Edge_vartypes; hypre_Index *varoffsets; HYPRE_Int *vartype_map; HYPRE_Int matrix_type = HYPRE_PARCSR; HYPRE_Int nvars, Edge_nvars, part, var; HYPRE_Int tot_vars = 8; HYPRE_Int t, i, j, k, m, n, size; HYPRE_BigInt l, p; HYPRE_BigInt ilower, iupper; HYPRE_BigInt jlower, jupper; HYPRE_BigInt **lower_ranks, **upper_ranks; HYPRE_Int ***n_CtoVbox, ****CtoVboxnums; HYPRE_Int *num_vboxes, **vboxnums; HYPRE_Int trueV = 1; HYPRE_Int falseV = 0; HYPRE_Int row_in; HYPRE_Int myproc; hypre_BoxInit(©_box, ndim); hypre_MPI_Comm_rank(comm, &myproc); hypre_SetIndex3(ishift, 1, 0, 0); hypre_SetIndex3(jshift, 0, 1, 0); hypre_SetIndex3(kshift, 0, 0, 1); hypre_SetIndex(zero_index, 0); hypre_SetIndex(one_index, 1); hypre_SetIndex(lindex, 0); /* set rfactor[2]= 1 if ndim=2. */ if (ndim == 2) { rfactor[2] = 1; } /*------------------------------------------------------------------- * Find the coarse-fine connection pattern, i.e., the topology * needed to create the interpolation operators. * These connections are determined using the cell-centred grids. * Note that we are assuming the variable type enumeration * given in hypre_SStructVariable_enum. * * We consider both 2-d and 3-d cases. In 2-d, the edges are faces. * We will continue to call them edges, but use the face variable * enumeration. *-------------------------------------------------------------------*/ varoffsets = hypre_CTAlloc(hypre_Index, tot_vars, HYPRE_MEMORY_HOST); /* total of 8 variable types. Create a mapping between user enumeration to hypre enumeration. Only need for edge grids. */ vartype_map = hypre_CTAlloc(HYPRE_Int, tot_vars, HYPRE_MEMORY_HOST); part = 0; p_cgrid = hypre_SStructGridPGrid(cgrid_edge, part); nvars = hypre_SStructPGridNVars(p_cgrid); vartypes = hypre_SStructPGridVarTypes(p_cgrid); for (i = 0; i < nvars; i++) { t = vartypes[i]; hypre_SStructVariableGetOffset((hypre_SStructVariable) t, ndim, varoffsets[t]); switch (t) { case 2: { vartype_map[2] = i; break; } case 3: { vartype_map[3] = i; break; } case 5: { vartype_map[5] = i; break; } case 6: { vartype_map[6] = i; break; } case 7: { vartype_map[7] = i; break; } } } /* local sizes */ nedges = 0; for (part = 0; part < nparts; part++) { /* same for 2-d & 3-d, assuming that fgrid_edge= fgrid_face in input */ p_fgrid = hypre_SStructGridPGrid(fgrid_edge, part); /* edge fgrid */ nvars = hypre_SStructPGridNVars(p_fgrid); for (var = 0; var < nvars; var++) { var_fgrid = hypre_SStructPGridSGrid(p_fgrid, var); nedges += hypre_StructGridLocalSize(var_fgrid); } } /*-------------------------------------------------------------------------- * Form mappings between the c & f box numbers. Note that a cbox * can land inside only one fbox since the latter was contracted. Without * the extraction, a cbox can land in more than 1 fboxes (e.g., cbox * boundary extending into other fboxes). *--------------------------------------------------------------------------*/ cfbox_mapping = hypre_TAlloc(HYPRE_Int *, nparts, HYPRE_MEMORY_HOST); fcbox_mapping = hypre_TAlloc(HYPRE_Int *, nparts, HYPRE_MEMORY_HOST); for (i = 0; i < nparts; i++) { p_fgrid = hypre_SStructGridPGrid(fgrid_edge, i); var_fgrid = hypre_SStructPGridCellSGrid(p_fgrid); fboxes = hypre_StructGridBoxes(var_fgrid); j = hypre_BoxArraySize(fboxes); fcbox_mapping[i] = hypre_CTAlloc(HYPRE_Int, j, HYPRE_MEMORY_HOST); p_cgrid = hypre_SStructGridPGrid(cgrid_edge, i); var_cgrid = hypre_SStructPGridCellSGrid(p_cgrid); cboxes = hypre_StructGridBoxes(var_cgrid); j = hypre_BoxArraySize(fboxes); cfbox_mapping[i] = hypre_CTAlloc(HYPRE_Int, j, HYPRE_MEMORY_HOST); /* assuming if i1 > i2 and (box j1) is coarsened from (box i1) and (box j2) from (box i2), then j1 > j2. */ k = 0; hypre_ForBoxI(j, fboxes) { fbox = hypre_BoxArrayBox(fboxes, j); hypre_CopyBox(fbox, ©_box); hypre_ProjectBox(©_box, zero_index, rfactor); hypre_StructMapFineToCoarse(hypre_BoxIMin(©_box), zero_index, rfactor, hypre_BoxIMin(©_box)); hypre_StructMapFineToCoarse(hypre_BoxIMax(©_box), zero_index, rfactor, hypre_BoxIMax(©_box)); /* since the ordering of the cboxes was determined by the fbox ordering, we only have to check if the first cbox in the list intersects with copy_box. If not, this fbox vanished in the coarsening. Note that this gives you the correct interior cbox. */ cbox = hypre_BoxArrayBox(cboxes, k); hypre_IntersectBoxes(©_box, cbox, ©_box); if (hypre_BoxVolume(©_box)) { cfbox_mapping[i][k] = j; fcbox_mapping[i][j] = k; k++; } /* if (hypre_BoxVolume(©_box)) */ } /* hypre_ForBoxI(j, fboxes) */ } /* for (i= 0; i< nparts; i++) */ /* variable rank bounds for this processor */ n_CtoVbox = hypre_TAlloc(HYPRE_Int **, nparts, HYPRE_MEMORY_HOST); CtoVboxnums = hypre_TAlloc(HYPRE_Int ***, nparts, HYPRE_MEMORY_HOST); for (part = 0; part < nparts; part++) { hypre_SStructCellGridBoxNumMap(fgrid_edge, part, &n_CtoVbox[part], &CtoVboxnums[part]); } /* variable rank bounds for this processor */ lower_ranks = hypre_TAlloc(HYPRE_BigInt *, nparts, HYPRE_MEMORY_HOST); upper_ranks = hypre_TAlloc(HYPRE_BigInt *, nparts, HYPRE_MEMORY_HOST); for (part = 0; part < nparts; part++) { p_fgrid = hypre_SStructGridPGrid(fgrid_edge, part); Edge_nvars = hypre_SStructPGridNVars(p_fgrid); lower_ranks[part] = hypre_CTAlloc(HYPRE_BigInt, Edge_nvars, HYPRE_MEMORY_HOST); upper_ranks[part] = hypre_CTAlloc(HYPRE_BigInt, Edge_nvars, HYPRE_MEMORY_HOST); for (t = 0; t < Edge_nvars; t++) { var_fgrid = hypre_SStructPGridSGrid(p_fgrid, t); box_array = hypre_StructGridBoxes(var_fgrid); fbox = hypre_BoxArrayBox(box_array, 0); hypre_CopyIndex(hypre_BoxIMin(fbox), findex); hypre_SStructGridFindBoxManEntry(fgrid_edge, part, findex, t, &entry); hypre_SStructBoxManEntryGetGlobalRank(entry, findex, &lower_ranks[part][t], matrix_type); fbox = hypre_BoxArrayBox(box_array, hypre_BoxArraySize(box_array) - 1); hypre_CopyIndex(hypre_BoxIMax(fbox), findex); hypre_SStructGridFindBoxManEntry(fgrid_edge, part, findex, t, &entry); hypre_SStructBoxManEntryGetGlobalRank(entry, findex, &upper_ranks[part][t], matrix_type); } } /* CREATE IJ_MATRICES- need to find the size of each one. Notice that the row and col ranks of these matrices can be created using only grid information. Grab the first part, first variable, first box, and lower index (lower rank); Grab the last part, last variable, last box, and upper index (upper rank). */ /* edge_Edge. Same for 2-d and 3-d. */ /* lower rank */ start_rank1 = hypre_SStructGridStartRank(fgrid_edge); start_rank2 = hypre_SStructGridStartRank(cgrid_edge); ilower = start_rank1; jlower = start_rank2; /* upper rank */ part = nparts - 1; p_fgrid = hypre_SStructGridPGrid(fgrid_edge, part); nvars = hypre_SStructPGridNVars(p_fgrid); var_fgrid = hypre_SStructPGridSGrid(p_fgrid, nvars - 1); fboxes = hypre_StructGridBoxes(var_fgrid); fbox = hypre_BoxArrayBox(fboxes, hypre_BoxArraySize(fboxes) - 1); hypre_SStructGridBoxProcFindBoxManEntry(fgrid_edge, part, nvars - 1, hypre_BoxArraySize(fboxes) - 1, myproc, &entry); hypre_SStructBoxManEntryGetGlobalCSRank(entry, hypre_BoxIMax(fbox), &iupper); p_cgrid = hypre_SStructGridPGrid(cgrid_edge, part); nvars = hypre_SStructPGridNVars(p_cgrid); var_cgrid = hypre_SStructPGridSGrid(p_cgrid, nvars - 1); cboxes = hypre_StructGridBoxes(var_cgrid); cbox = hypre_BoxArrayBox(cboxes, hypre_BoxArraySize(cboxes) - 1); hypre_SStructGridBoxProcFindBoxManEntry(cgrid_edge, part, nvars - 1, hypre_BoxArraySize(cboxes) - 1, myproc, &entry); hypre_SStructBoxManEntryGetGlobalCSRank(entry, hypre_BoxIMax(cbox), &jupper); HYPRE_IJMatrixCreate(comm, ilower, iupper, jlower, jupper, &edge_Edge); HYPRE_IJMatrixSetObjectType(edge_Edge, HYPRE_PARCSR); HYPRE_IJMatrixInitialize(edge_Edge); /*----------------------------------------------------------------------- * edge_Edge, the actual interpolation matrix. * For each fine edge row, we need to know if it is a edge, * boundary edge, or face edge. Knowing this allows us to determine the * structure and weights of the interpolation matrix. * We assume that a coarse edge interpolates only to fine edges in or on * an agglomerate. That is, fine edges with indices that do were * truncated do not get interpolated to. * Scheme: Loop over fine edge grid. For each fine edge ijk, * 1) map it to a fine cell with the fine edge at the lower end * of the box,e.g. x_edge[ijk] -> cell[i,j+1,k+1]. * 2) coarsen the fine cell to obtain a coarse cell. Determine the * location of the fine edge with respect to the coarse edges * of this cell. Coarsening needed only when determining the * column rank. * Need to distinguish between 2-d and 3-d. *-----------------------------------------------------------------------*/ /* count the row/col connections */ iedgeEdge = hypre_CTAlloc(HYPRE_BigInt, nedges, HYPRE_MEMORY_HOST); ncols_edgeEdge = hypre_CTAlloc(HYPRE_Int, nedges, HYPRE_MEMORY_HOST); /* get the contracted boxes */ contract_fedgeBoxes = hypre_TAlloc(hypre_BoxArray *, nparts, HYPRE_MEMORY_HOST); Edge_cstarts = hypre_TAlloc(hypre_Index *, nparts, HYPRE_MEMORY_HOST); upper_shifts = hypre_TAlloc(hypre_Index *, nparts, HYPRE_MEMORY_HOST); lower_shifts = hypre_TAlloc(hypre_Index *, nparts, HYPRE_MEMORY_HOST); for (part = 0; part < nparts; part++) { p_fgrid = hypre_SStructGridPGrid(fgrid_edge, part); var_fgrid = hypre_SStructPGridCellSGrid(p_fgrid); fboxes = hypre_StructGridBoxes(var_fgrid); /* fill up the contracted box_array */ contract_fedgeBoxes[part] = hypre_BoxArrayCreate(0, ndim); Edge_cstarts[part] = hypre_TAlloc(hypre_Index, hypre_BoxArraySize(fboxes), HYPRE_MEMORY_HOST); upper_shifts[part] = hypre_TAlloc(hypre_Index, hypre_BoxArraySize(fboxes), HYPRE_MEMORY_HOST); lower_shifts[part] = hypre_TAlloc(hypre_Index, hypre_BoxArraySize(fboxes), HYPRE_MEMORY_HOST); hypre_ForBoxI(i, fboxes) { fbox = hypre_BoxArrayBox(fboxes, i); /* contract the fbox to correspond to the correct cbox */ cbox = hypre_BoxContraction(fbox, var_fgrid, rfactor); hypre_AppendBox(cbox, contract_fedgeBoxes[part]); /* record the offset mapping between the coarse cell index and the fine cell index */ hypre_ClearIndex(upper_shifts[part][i]); hypre_ClearIndex(lower_shifts[part][i]); for (k = 0; k < ndim; k++) { m = hypre_BoxIMin(cbox)[k]; p = m % rfactor[k]; if (p > 0 && m > 0) { upper_shifts[part][i][k] = p - 1; lower_shifts[part][i][k] = p - rfactor[k]; } else { upper_shifts[part][i][k] = rfactor[k] - p - 1; lower_shifts[part][i][k] = -p; } } /* record the cstarts of the cbox */ hypre_ProjectBox(cbox, zero_index, rfactor); hypre_CopyIndex(hypre_BoxIMin(cbox), Edge_cstarts[part][i]); hypre_StructMapFineToCoarse(Edge_cstarts[part][i], zero_index, rfactor, Edge_cstarts[part][i]); hypre_BoxDestroy(cbox); } } /* for (part= 0; part< nparts; part++) */ /*----------------------------------------------------------------------- * loop first over the fedges aligning with the agglomerate coarse edges. * Will loop over the face & interior edges separately also. *-----------------------------------------------------------------------*/ j = 0; for (part = 0; part < nparts; part++) { p_fgrid = hypre_SStructGridPGrid(fgrid_edge, part); /* edge grid */ Edge_nvars = hypre_SStructPGridNVars(p_fgrid); Edge_vartypes = hypre_SStructPGridVarTypes(p_fgrid); /* note that fboxes are the contracted CELL boxes. Will get the correct variable grid extents. */ fboxes = contract_fedgeBoxes[part]; for (t = 0; t < Edge_nvars; t++) { var = Edge_vartypes[t]; var_fgrid = hypre_SStructPGridVTSGrid(p_fgrid, var); box_array = hypre_StructGridBoxes(var_fgrid); n_boxoffsets = ndim - 1; boxoffset = hypre_CTAlloc(hypre_Index, n_boxoffsets, HYPRE_MEMORY_HOST); suboffset = hypre_CTAlloc(hypre_Index, n_boxoffsets, HYPRE_MEMORY_HOST); switch (var) { case 2: /* 2-d: x_face (vertical edges), stride=[rfactor[0],1,1] */ { hypre_SetIndex3(stride, rfactor[0], 1, 1); hypre_CopyIndex(varoffsets[2], var_index); /* boxoffset shrink in the i direction */ hypre_SetIndex3(boxoffset[0], rfactor[0] - 1, 0, 0); hypre_SetIndex3(suboffset[0], 1, 0, 0); /* extend loop_size by one in the stride direction */ hypre_SetIndex3(hi_index, 1, 0, 0); break; } case 3: /* 2-d: y_face (horizontal edges), stride=[1,rfactor[1],1] */ { hypre_SetIndex3(stride, 1, rfactor[1], 1); hypre_CopyIndex(varoffsets[3], var_index); /* boxoffset shrink in the j direction */ hypre_SetIndex3(boxoffset[0], 0, rfactor[1] - 1, 0); hypre_SetIndex3(suboffset[0], 0, 1, 0); /* extend loop_size by one in the stride direction */ hypre_SetIndex3(hi_index, 0, 1, 0); break; } case 5: /* 3-d: x_edge, stride=[1,rfactor[1],rfactor[2]] */ { hypre_SetIndex3(stride, 1, rfactor[1], rfactor[2]); hypre_CopyIndex(varoffsets[5], var_index); /* boxoffset shrink in the j & k directions */ hypre_SetIndex3(boxoffset[0], 0, rfactor[1] - 1, 0); hypre_SetIndex3(boxoffset[1], 0, 0, rfactor[2] - 1); hypre_SetIndex3(suboffset[0], 0, 1, 0); hypre_SetIndex3(suboffset[1], 0, 0, 1); /* extend loop_size by one in the stride direction */ hypre_SetIndex3(hi_index, 0, 1, 1); break; } case 6: /* 3-d: y_edge, stride=[rfactor[0],1,rfactor[2]] */ { hypre_SetIndex3(stride, rfactor[0], 1, rfactor[2]); hypre_CopyIndex(varoffsets[6], var_index); /* boxoffset shrink in the i & k directions */ hypre_SetIndex3(boxoffset[0], rfactor[0] - 1, 0, 0); hypre_SetIndex3(boxoffset[1], 0, 0, rfactor[2] - 1); hypre_SetIndex3(suboffset[0], 1, 0, 0); hypre_SetIndex3(suboffset[1], 0, 0, 1); /* extend loop_size by one in the stride direction */ hypre_SetIndex3(hi_index, 1, 0, 1); break; } case 7: /* 3-d: z_edge, stride=[rfactor[0],rfactor[1],1] */ { hypre_SetIndex3(stride, rfactor[0], rfactor[1], 1); hypre_CopyIndex(varoffsets[7], var_index); /* boxoffset shrink in the i & j directions */ hypre_SetIndex3(boxoffset[0], rfactor[0] - 1, 0, 0); hypre_SetIndex3(boxoffset[1], 0, rfactor[1] - 1, 0); hypre_SetIndex3(suboffset[0], 1, 0, 0); hypre_SetIndex3(suboffset[1], 0, 1, 0); /* extend loop_size by one in the stride direction */ hypre_SetIndex3(hi_index, 1, 1, 0); break; } } hypre_ForBoxI(i, fboxes) { cellbox = hypre_BoxArrayBox(fboxes, i); /* vboxes inside the i'th cellbox */ num_vboxes = n_CtoVbox[part][i]; vboxnums = CtoVboxnums[part][i]; /* adjust the project cellbox to the variable box */ hypre_CopyBox(cellbox, ©_box); /* the adjusted variable box may be bigger than the actually variable box- variables that are shared may lead to smaller variable boxes than the SubtractIndex produces. If the box has to be decreased, then we decrease it by (rfactor[j]-1) in the appropriate direction. Check the location of the shifted lower box index. */ for (k = 0; k < n_boxoffsets; k++) { hypre_SubtractIndexes(hypre_BoxIMin(©_box), suboffset[k], 3, findex); row_in = falseV; for (p = 0; p < num_vboxes[t]; p++) { vbox = hypre_BoxArrayBox(box_array, vboxnums[t][p]); if (hypre_IndexInBox(findex, vbox)) { hypre_CopyIndex(findex, hypre_BoxIMin(©_box)); row_in = trueV; break; } } /* not in any vbox */ if (!row_in) { hypre_AddIndexes(hypre_BoxIMin(©_box), boxoffset[k], 3, hypre_BoxIMin(©_box)); } } hypre_BoxGetSize(©_box, loop_size); hypre_StructMapFineToCoarse(loop_size, zero_index, stride, loop_size); /* extend the loop_size so that upper boundary of the box are reached. */ hypre_AddIndexes(loop_size, hi_index, 3, loop_size); hypre_CopyIndex(hypre_BoxIMin(©_box), start); hypre_SerialBoxLoop1Begin(ndim, loop_size, ©_box, start, stride, m); { zypre_BoxLoopGetIndex(lindex); hypre_SetIndex3(findex, lindex[0], lindex[1], lindex[2]); for (k = 0; k < 3; k++) { findex[k] *= stride[k]; } hypre_AddIndexes(findex, start, 3, findex); hypre_SStructGridFindBoxManEntry(fgrid_edge, part, findex, t, &entry); hypre_SStructBoxManEntryGetGlobalRank(entry, findex, &p, matrix_type); /* still row p may be outside the processor- check to make sure in */ if ( (p <= upper_ranks[part][t]) && (p >= lower_ranks[part][t]) ) { iedgeEdge[j] = p; ncols_edgeEdge[j] = 1; j++; } } hypre_SerialBoxLoop1End(m); } /* hypre_ForBoxI */ hypre_TFree(boxoffset, HYPRE_MEMORY_HOST); hypre_TFree(suboffset, HYPRE_MEMORY_HOST); } /* for (t= 0; t< nvars; t++) */ } /* for (part= 0; part< nparts; part++) */ /*----------------------------------------------------------------------- * Record the row ranks for the face edges. Only for 3-d. * Loop over the face edges. *-----------------------------------------------------------------------*/ if (ndim == 3) { for (part = 0; part < nparts; part++) { p_fgrid = hypre_SStructGridPGrid(fgrid_edge, part); /* edge grid */ Edge_nvars = hypre_SStructPGridNVars(p_fgrid); Edge_vartypes = hypre_SStructPGridVarTypes(p_fgrid); /* note that fboxes are the contracted CELL boxes. Will get the correct variable grid extents. */ fboxes = contract_fedgeBoxes[part]; /* may need to shrink a given box in some boxoffset directions */ boxoffset = hypre_TAlloc(hypre_Index, ndim, HYPRE_MEMORY_HOST); for (t = 0; t < ndim; t++) { hypre_ClearIndex(boxoffset[t]); hypre_IndexD(boxoffset[t], t) = rfactor[t] - 1; } for (t = 0; t < Edge_nvars; t++) { var = Edge_vartypes[t]; var_fgrid = hypre_SStructPGridVTSGrid(p_fgrid, var); box_array = hypre_StructGridBoxes(var_fgrid); /* to reduce comparison, take the switch outside of the loop */ switch (var) { case 5: { /* 3-d x_edge, can be Y or Z_Face */ hypre_ForBoxI(i, fboxes) { cellbox = hypre_BoxArrayBox(fboxes, i); /* vboxes inside the i'th cellbox */ num_vboxes = n_CtoVbox[part][i]; vboxnums = CtoVboxnums[part][i]; /* adjust the contracted cellbox to the variable box */ hypre_CopyBox(cellbox, ©_box); /****************************************************** * Check the location of the shifted lower box index: * x_edge-> Z_Face & Y_Face: * Z_Face- contract in the z direction only if the * processor interface is in the z direction * Y_Face- contract in the y direction if the processor * interface is in the y direction. ******************************************************/ hypre_SubtractIndexes(hypre_BoxIMin(©_box), kshift, 3, findex); /* loop over all the vboxes to see if findex is inside */ row_in = falseV; for (p = 0; p < num_vboxes[t]; p++) { vbox = hypre_BoxArrayBox(box_array, vboxnums[t][p]); if (hypre_IndexInBox(findex, vbox)) { hypre_CopyIndex(findex, hypre_BoxIMin(©_box)); row_in = trueV; break; } } /* not in any vbox */ if (!row_in) { hypre_AddIndexes(hypre_BoxIMin(©_box), boxoffset[2], 3, hypre_BoxIMin(©_box)); } hypre_SubtractIndexes(hypre_BoxIMin(©_box), jshift, 3, hypre_BoxIMin(©_box)); hypre_BoxGetSize(©_box, loop_size); hypre_StructMapFineToCoarse(loop_size, zero_index, rfactor, loop_size); hypre_CopyIndex(hypre_BoxIMin(©_box), start); /* increase the loop_size by one in the Z plane direction */ loop_size[2]++; hypre_SerialBoxLoop1Begin(ndim, loop_size, ©_box, start, rfactor, m); { zypre_BoxLoopGetIndex(lindex); hypre_SetIndex3(findex, lindex[0], lindex[1], lindex[2]); for (k = 0; k < 3; k++) { findex[k] *= rfactor[k]; } hypre_AddIndexes(findex, start, 3, findex); /************************************************************ * Loop over the Z_Face x_edges. ************************************************************/ for (p = 0; p < rfactor[0]; p++) { hypre_CopyIndex(findex, var_index); var_index[0] += p; for (n = 1; n < rfactor[1]; n++) { var_index[1]++; hypre_SStructGridFindBoxManEntry(fgrid_edge, part, var_index, t, &entry); hypre_SStructBoxManEntryGetGlobalRank(entry, var_index, &l, matrix_type); /* still row l may be outside the processor */ if ((l <= upper_ranks[part][t]) && (l >= lower_ranks[part][t])) { iedgeEdge[j] = l; /* Z_Face. Two coarse Edge connections. */ ncols_edgeEdge[j] = 2; j++; } } /* for (n= 1; n< rfactor[1]; n++) */ } /* for (p= 0; p< rfactor[0]; p++) */ } hypre_SerialBoxLoop1End(m); /* Y_Face */ hypre_CopyBox(cellbox, ©_box); hypre_SubtractIndexes(hypre_BoxIMin(©_box), jshift, 3, findex); /* loop over all the vboxes to see if findex is inside */ row_in = falseV; for (p = 0; p < num_vboxes[t]; p++) { vbox = hypre_BoxArrayBox(box_array, vboxnums[t][p]); if (hypre_IndexInBox(findex, vbox)) { hypre_CopyIndex(findex, hypre_BoxIMin(©_box)); row_in = trueV; break; } } /* not in any vbox */ if (!row_in) { hypre_AddIndexes(hypre_BoxIMin(©_box), boxoffset[1], 3, hypre_BoxIMin(©_box)); } hypre_SubtractIndexes(hypre_BoxIMin(©_box), kshift, 3, hypre_BoxIMin(©_box)); hypre_BoxGetSize(©_box, loop_size); hypre_StructMapFineToCoarse(loop_size, zero_index, rfactor, loop_size); hypre_CopyIndex(hypre_BoxIMin(©_box), start); loop_size[1]++; hypre_SerialBoxLoop1Begin(ndim, loop_size, ©_box, start, rfactor, m); { zypre_BoxLoopGetIndex(lindex); hypre_SetIndex3(findex, lindex[0], lindex[1], lindex[2]); for (k = 0; k < 3; k++) { findex[k] *= rfactor[k]; } hypre_AddIndexes(findex, start, 3, findex); /* Y_Face */ for (p = 0; p < rfactor[0]; p++) { hypre_CopyIndex(findex, var_index); var_index[0] += p; for (n = 1; n < rfactor[2]; n++) { var_index[2]++; hypre_SStructGridFindBoxManEntry(fgrid_edge, part, var_index, t, &entry); hypre_SStructBoxManEntryGetGlobalRank(entry, var_index, &l, matrix_type); if ((l <= upper_ranks[part][t]) && (l >= lower_ranks[part][t])) { iedgeEdge[j] = l; /* Y_Face. Two coarse Edge connections. */ ncols_edgeEdge[j] = 2; j++; } } /* for (n= 1; n< rfactor[2]; n++) */ } /* for (p= 0; p< rfactor[0]; p++) */ } hypre_SerialBoxLoop1End(m); } /* hypre_ForBoxI(i, fboxes) */ break; } case 6: { /* 3-d y_edge, can be X or Z_Face */ hypre_ForBoxI(i, fboxes) { cellbox = hypre_BoxArrayBox(fboxes, i); /* vboxes inside the i'th cellbox */ num_vboxes = n_CtoVbox[part][i]; vboxnums = CtoVboxnums[part][i]; /* adjust the project cellbox to the variable box */ hypre_CopyBox(cellbox, ©_box); /****************************************************** * Check the location of the shifted lower box index: * y_edge-> X_Face & Z_Face: * Z_Face- contract in the z direction only if the * processor interface is in the z direction * X_Face- contract in the x direction if the processor * interface is in the x direction. ******************************************************/ hypre_SubtractIndexes(hypre_BoxIMin(©_box), kshift, 3, findex); /* loop over all the vboxes to see if findex is inside */ row_in = falseV; for (p = 0; p < num_vboxes[t]; p++) { vbox = hypre_BoxArrayBox(box_array, vboxnums[t][p]); if (hypre_IndexInBox(findex, vbox)) { hypre_CopyIndex(findex, hypre_BoxIMin(©_box)); row_in = trueV; break; } } /* not in any vbox */ if (!row_in) { hypre_AddIndexes(hypre_BoxIMin(©_box), boxoffset[2], 3, hypre_BoxIMin(©_box)); } hypre_SubtractIndexes(hypre_BoxIMin(©_box), ishift, 3, hypre_BoxIMin(©_box)); hypre_BoxGetSize(©_box, loop_size); hypre_StructMapFineToCoarse(loop_size, zero_index, rfactor, loop_size); hypre_CopyIndex(hypre_BoxIMin(©_box), start); /* increase the loop_size by one in the Z_Face direction to cover upper boundary Z_Faces. */ loop_size[2]++; hypre_SerialBoxLoop1Begin(ndim, loop_size, ©_box, start, rfactor, m); { zypre_BoxLoopGetIndex(lindex); hypre_SetIndex3(findex, lindex[0], lindex[1], lindex[2]); for (k = 0; k < 3; k++) { findex[k] *= rfactor[k]; } hypre_AddIndexes(findex, start, 3, findex); /* Z_Face */ for (p = 0; p < rfactor[1]; p++) { hypre_CopyIndex(findex, var_index); var_index[1] += p; for (n = 1; n < rfactor[0]; n++) { var_index[0]++; hypre_SStructGridFindBoxManEntry(fgrid_edge, part, var_index, t, &entry); hypre_SStructBoxManEntryGetGlobalRank(entry, var_index, &l, matrix_type); if ((l <= upper_ranks[part][t]) && (l >= lower_ranks[part][t])) { iedgeEdge[j] = l; /* Z_Face. Two coarse Edge connections. */ ncols_edgeEdge[j] = 2; j++; } } /* for (n= 1; n< rfactor[0]; n++) */ } /* for (p= 0; p< rfactor[1]; p++) */ } hypre_SerialBoxLoop1End(m); /* X_Face */ hypre_CopyBox(cellbox, ©_box); hypre_SubtractIndexes(hypre_BoxIMin(©_box), ishift, 3, findex); /* loop over all the vboxes to see if findex is inside */ row_in = falseV; for (p = 0; p < num_vboxes[t]; p++) { vbox = hypre_BoxArrayBox(box_array, vboxnums[t][p]); if (hypre_IndexInBox(findex, vbox)) { hypre_CopyIndex(findex, hypre_BoxIMin(©_box)); row_in = trueV; break; } } /* not in any vbox */ if (!row_in) { hypre_AddIndexes(hypre_BoxIMin(©_box), boxoffset[0], 3, hypre_BoxIMin(©_box)); } hypre_SubtractIndexes(hypre_BoxIMin(©_box), kshift, 3, hypre_BoxIMin(©_box)); hypre_BoxGetSize(©_box, loop_size); hypre_StructMapFineToCoarse(loop_size, zero_index, rfactor, loop_size); hypre_CopyIndex(hypre_BoxIMin(©_box), start); loop_size[0]++; hypre_SerialBoxLoop1Begin(ndim, loop_size, ©_box, start, rfactor, m); { zypre_BoxLoopGetIndex(lindex); hypre_SetIndex3(findex, lindex[0], lindex[1], lindex[2]); for (k = 0; k < 3; k++) { findex[k] *= rfactor[k]; } hypre_AddIndexes(findex, start, 3, findex); /* X_Face */ for (p = 0; p < rfactor[1]; p++) { hypre_CopyIndex(findex, var_index); var_index[1] += p; for (n = 1; n < rfactor[2]; n++) { var_index[2]++; hypre_SStructGridFindBoxManEntry(fgrid_edge, part, var_index, t, &entry); hypre_SStructBoxManEntryGetGlobalRank(entry, var_index, &l, matrix_type); if ((l <= upper_ranks[part][t]) && (l >= lower_ranks[part][t])) { iedgeEdge[j] = l; /* X_Face. Two coarse Edge connections. */ ncols_edgeEdge[j] = 2; j++; } } /* for (n= 1; n< rfactor[2]; n++) */ } /* for (p= 0; p< rfactor[1]; p++) */ } hypre_SerialBoxLoop1End(m); } /* hypre_ForBoxI(i, fboxes) */ break; } case 7: { /* 3-d z_edge, can be interior, X or Y_Face, or Z_Edge */ hypre_ForBoxI(i, fboxes) { cellbox = hypre_BoxArrayBox(fboxes, i); /* vboxes inside the i'th cellbox */ num_vboxes = n_CtoVbox[part][i]; vboxnums = CtoVboxnums[part][i]; /* adjust the project cellbox to the variable box */ hypre_CopyBox(cellbox, ©_box); /****************************************************** * Check the location of the shifted lower box index: * z_edge-> X_Face & Y_Face: * X_Face- contract in the x direction if the processor * interface is in the x direction. * Y_Face- contract in the y direction if the processor * interface is in the y direction. ******************************************************/ hypre_SubtractIndexes(hypre_BoxIMin(©_box), ishift, 3, findex); /* loop over all the vboxes to see if findex is inside */ row_in = falseV; for (p = 0; p < num_vboxes[t]; p++) { vbox = hypre_BoxArrayBox(box_array, vboxnums[t][p]); if (hypre_IndexInBox(findex, vbox)) { hypre_CopyIndex(findex, hypre_BoxIMin(©_box)); row_in = trueV; break; } } /* not in any vbox */ if (!row_in) { hypre_AddIndexes(hypre_BoxIMin(©_box), boxoffset[0], 3, hypre_BoxIMin(©_box)); } hypre_SubtractIndexes(hypre_BoxIMin(©_box), jshift, 3, hypre_BoxIMin(©_box)); hypre_BoxGetSize(©_box, loop_size); hypre_StructMapFineToCoarse(loop_size, zero_index, rfactor, loop_size); hypre_CopyIndex(hypre_BoxIMin(©_box), start); /* increase the loop_size by one in the X_Face direction */ loop_size[0]++; hypre_SerialBoxLoop1Begin(ndim, loop_size, ©_box, start, rfactor, m); { zypre_BoxLoopGetIndex(lindex); hypre_SetIndex3(findex, lindex[0], lindex[1], lindex[2]); for (k = 0; k < 3; k++) { findex[k] *= rfactor[k]; } hypre_AddIndexes(findex, start, 3, findex); /* X_Face */ for (p = 0; p < rfactor[2]; p++) { hypre_CopyIndex(findex, var_index); var_index[2] += p; for (n = 1; n < rfactor[1]; n++) { var_index[1]++; hypre_SStructGridFindBoxManEntry(fgrid_edge, part, var_index, t, &entry); hypre_SStructBoxManEntryGetGlobalRank(entry, var_index, &l, matrix_type); if ((l <= upper_ranks[part][t]) && (l >= lower_ranks[part][t])) { iedgeEdge[j] = l; /* X_Face. Two coarse Edge connections. */ ncols_edgeEdge[j] = 2; j++; } } /* for (n= 1; n< rfactor[1]; n++) */ } /* for (p= 0; p< rfactor[2]; p++) */ } hypre_SerialBoxLoop1End(m); /* Y_Face */ hypre_CopyBox(cellbox, ©_box); hypre_SubtractIndexes(hypre_BoxIMin(©_box), jshift, 3, findex); /* loop over all the vboxes to see if findex is inside */ row_in = falseV; for (p = 0; p < num_vboxes[t]; p++) { vbox = hypre_BoxArrayBox(box_array, vboxnums[t][p]); if (hypre_IndexInBox(findex, vbox)) { hypre_CopyIndex(findex, hypre_BoxIMin(©_box)); row_in = trueV; break; } } /* not in any vbox */ if (!row_in) { hypre_AddIndexes(hypre_BoxIMin(©_box), boxoffset[1], 3, hypre_BoxIMin(©_box)); } hypre_SubtractIndexes(hypre_BoxIMin(©_box), ishift, 3, hypre_BoxIMin(©_box)); hypre_BoxGetSize(©_box, loop_size); hypre_StructMapFineToCoarse(loop_size, zero_index, rfactor, loop_size); hypre_CopyIndex(hypre_BoxIMin(©_box), start); loop_size[1]++; hypre_SerialBoxLoop1Begin(ndim, loop_size, ©_box, start, rfactor, m); { zypre_BoxLoopGetIndex(lindex); hypre_SetIndex3(findex, lindex[0], lindex[1], lindex[2]); for (k = 0; k < 3; k++) { findex[k] *= rfactor[k]; } hypre_AddIndexes(findex, start, 3, findex); /* Y_Face */ for (p = 0; p < rfactor[2]; p++) { hypre_CopyIndex(findex, var_index); var_index[2] += p; for (n = 1; n < rfactor[0]; n++) { var_index[0]++; hypre_SStructGridFindBoxManEntry(fgrid_edge, part, var_index, t, &entry); hypre_SStructBoxManEntryGetGlobalRank(entry, var_index, &l, matrix_type); if ((l <= upper_ranks[part][t]) && (l >= lower_ranks[part][t])) { iedgeEdge[j] = l; /* Y_Face. Two coarse Edge connections. */ ncols_edgeEdge[j] = 2; j++; } } /* for (n= 1; n< rfactor[0]; n++) */ } /* for (p= 0; p< rfactor[2]; p++) */ } hypre_SerialBoxLoop1End(m); } /* hypre_ForBoxI(i, fboxes) */ break; } } /* switch */ } /* for (t= 0; t< Edge_nvars; t++) */ hypre_TFree(boxoffset, HYPRE_MEMORY_HOST); } /* for (part= 0; part< nparts; part++) */ } /* if (ndim == 3) */ for (part = 0; part < nparts; part++) { p_fgrid = hypre_SStructGridPGrid(fgrid_edge, part); /* edge grid */ Edge_nvars = hypre_SStructPGridNVars(p_fgrid); Edge_vartypes = hypre_SStructPGridVarTypes(p_fgrid); /* note that fboxes are the contracted CELL boxes. Will get the correct variable grid extents. */ fboxes = contract_fedgeBoxes[part]; for (t = 0; t < Edge_nvars; t++) { var = Edge_vartypes[t]; var_fgrid = hypre_SStructPGridVTSGrid(p_fgrid, var); box_array = hypre_StructGridBoxes(var_fgrid); /* to reduce comparison, take the switch outside of the loop */ switch (var) { case 2: { /* 2-d x_face = x_edge, can be interior */ hypre_ForBoxI(i, fboxes) { cellbox = hypre_BoxArrayBox(fboxes, i); /* adjust the contract cellbox to the variable box */ hypre_CopyBox(cellbox, ©_box); hypre_SubtractIndexes(hypre_BoxIMin(©_box), varoffsets[var], 3, hypre_BoxIMin(©_box)); /*hypre_IntersectBoxes(©_box, vbox, ©_box);*/ hypre_BoxGetSize(©_box, loop_size); hypre_StructMapFineToCoarse(loop_size, zero_index, rfactor, loop_size); hypre_CopyIndex(hypre_BoxIMin(©_box), start); hypre_SerialBoxLoop1Begin(ndim, loop_size, ©_box, start, rfactor, m); { zypre_BoxLoopGetIndex(lindex); hypre_SetIndex3(findex, lindex[0], lindex[1], lindex[2]); for (k = 0; k < 3; k++) { findex[k] *= rfactor[k]; } hypre_AddIndexes(findex, start, 3, findex); /* get interior edges */ for (p = 1; p < rfactor[0]; p++) { hypre_CopyIndex(findex, var_index); var_index[0] += p; for (n = 0; n < rfactor[1]; n++) { hypre_SStructGridFindBoxManEntry(fgrid_edge, part, var_index, t, &entry); hypre_SStructBoxManEntryGetGlobalRank(entry, var_index, &l, matrix_type); iedgeEdge[j] = l; /* lies interior of Face. Two coarse Edge connection. */ ncols_edgeEdge[j] = 2; j++; var_index[1]++; } /* for (n= 0; n< rfactor[1]; n++) */ } /* for (p= 1; p< rfactor[0]; p++) */ } hypre_SerialBoxLoop1End(m); } /* hypre_ForBoxI(i, fboxes) */ break; } case 3: { /* 2-d y_face = y_edge, can be interior */ hypre_ForBoxI(i, fboxes) { cellbox = hypre_BoxArrayBox(fboxes, i); /* adjust the project cellbox to the variable box */ hypre_CopyBox(cellbox, ©_box); hypre_SubtractIndexes(hypre_BoxIMin(©_box), varoffsets[var], 3, hypre_BoxIMin(©_box)); /* hypre_IntersectBoxes(©_box, vbox, ©_box);*/ hypre_BoxGetSize(©_box, loop_size); hypre_StructMapFineToCoarse(loop_size, zero_index, rfactor, loop_size); hypre_CopyIndex(hypre_BoxIMin(©_box), start); hypre_SerialBoxLoop1Begin(ndim, loop_size, ©_box, start, rfactor, m); { zypre_BoxLoopGetIndex(lindex); hypre_SetIndex3(findex, lindex[0], lindex[1], lindex[2]); for (k = 0; k < 3; k++) { findex[k] *= rfactor[k]; } hypre_AddIndexes(findex, start, 3, findex); /* get interior edges */ for (p = 1; p < rfactor[1]; p++) { hypre_CopyIndex(findex, var_index); var_index[1] += p; for (n = 0; n < rfactor[0]; n++) { hypre_SStructGridFindBoxManEntry(fgrid_edge, part, var_index, t, &entry); hypre_SStructBoxManEntryGetGlobalRank(entry, var_index, &l, matrix_type); iedgeEdge[j] = l; /* lies interior of Face. Two coarse Edge connection. */ ncols_edgeEdge[j] = 2; j++; var_index[0]++; } /* for (n= 0; n< rfactor[0]; n++) */ } /* for (p= 1; p< rfactor[1]; p++) */ } hypre_SerialBoxLoop1End(m); } /* hypre_ForBoxI(i, fboxes) */ break; } case 5: { /* 3-d x_edge, can be only interior */ hypre_ForBoxI(i, fboxes) { cellbox = hypre_BoxArrayBox(fboxes, i); /* adjust the project cellbox to the variable box */ hypre_CopyBox(cellbox, ©_box); hypre_SubtractIndexes(hypre_BoxIMin(©_box), varoffsets[var], 3, hypre_BoxIMin(©_box)); /* hypre_IntersectBoxes(©_box, vbox, ©_box);*/ hypre_BoxGetSize(©_box, loop_size); hypre_StructMapFineToCoarse(loop_size, zero_index, rfactor, loop_size); hypre_CopyIndex(hypre_BoxIMin(©_box), start); hypre_SerialBoxLoop1Begin(ndim, loop_size, ©_box, start, rfactor, m); { zypre_BoxLoopGetIndex(lindex); hypre_SetIndex3(findex, lindex[0], lindex[1], lindex[2]); for (k = 0; k < 3; k++) { findex[k] *= rfactor[k]; } hypre_AddIndexes(findex, start, 3, findex); /* get interior edges */ for (p = 1; p < rfactor[2]; p++) { hypre_CopyIndex(findex, var_index); var_index[2] += p; for (n = 1; n < rfactor[1]; n++) { var_index[1]++; for (k = 0; k < rfactor[0]; k++) { hypre_SStructGridFindBoxManEntry(fgrid_edge, part, var_index, t, &entry); hypre_SStructBoxManEntryGetGlobalRank(entry, var_index, &l, matrix_type); iedgeEdge[j] = l; /* Interior. Four coarse Edge connections. */ ncols_edgeEdge[j] = 4; j++; var_index[0]++; } /* for (k= 0; k< rfactor[0]; k++) */ /* reset var_index[0] to the initial index for next k loop */ var_index[0] -= rfactor[0]; } /* for (n= 1; n< rfactor[1]; n++) */ /* reset var_index[1] to the initial index for next n loop */ var_index[1] -= (rfactor[1] - 1); } /* for (p= 1; p< rfactor[2]; p++) */ } hypre_SerialBoxLoop1End(m); } /* hypre_ForBoxI(i, fboxes) */ break; } case 6: { /* 3-d y_edge, can be only interior */ hypre_ForBoxI(i, fboxes) { cellbox = hypre_BoxArrayBox(fboxes, i); /* adjust the project cellbox to the variable box */ hypre_CopyBox(cellbox, ©_box); hypre_SubtractIndexes(hypre_BoxIMin(©_box), varoffsets[var], 3, hypre_BoxIMin(©_box)); /* hypre_IntersectBoxes(©_box, vbox, ©_box);*/ hypre_BoxGetSize(©_box, loop_size); hypre_StructMapFineToCoarse(loop_size, zero_index, rfactor, loop_size); hypre_CopyIndex(hypre_BoxIMin(©_box), start); hypre_SerialBoxLoop1Begin(ndim, loop_size, ©_box, start, rfactor, m); { zypre_BoxLoopGetIndex(lindex); hypre_SetIndex3(findex, lindex[0], lindex[1], lindex[2]); for (k = 0; k < 3; k++) { findex[k] *= rfactor[k]; } hypre_AddIndexes(findex, start, 3, findex); /* get interior edges */ for (p = 1; p < rfactor[2]; p++) { hypre_CopyIndex(findex, var_index); var_index[2] += p; for (n = 1; n < rfactor[0]; n++) { var_index[0]++; for (k = 0; k < rfactor[1]; k++) { hypre_SStructGridFindBoxManEntry(fgrid_edge, part, var_index, t, &entry); hypre_SStructBoxManEntryGetGlobalRank(entry, var_index, &l, matrix_type); iedgeEdge[j] = l; /* Interior. Four coarse Edge connections. */ ncols_edgeEdge[j] = 4; j++; var_index[1]++; } /* for (k= 0; k< rfactor[1]; k++) */ /* reset var_index[1] to the initial index for next k loop */ var_index[1] -= rfactor[1]; } /* for (n= 1; n< rfactor[0]; n++) */ /* reset var_index[0] to the initial index for next n loop */ var_index[0] -= (rfactor[0] - 1); } /* for (p= 1; p< rfactor[2]; p++) */ } hypre_SerialBoxLoop1End(m); } /* hypre_ForBoxI(i, fboxes) */ break; } case 7: { /* 3-d z_edge, can be only interior */ hypre_ForBoxI(i, fboxes) { cellbox = hypre_BoxArrayBox(fboxes, i); /* adjust the project cellbox to the variable box */ hypre_CopyBox(cellbox, ©_box); hypre_SubtractIndexes(hypre_BoxIMin(©_box), varoffsets[var], 3, hypre_BoxIMin(©_box)); /* hypre_IntersectBoxes(©_box, vbox, ©_box);*/ hypre_BoxGetSize(©_box, loop_size); hypre_StructMapFineToCoarse(loop_size, zero_index, rfactor, loop_size); hypre_CopyIndex(hypre_BoxIMin(©_box), start); hypre_SerialBoxLoop1Begin(ndim, loop_size, ©_box, start, rfactor, m); { zypre_BoxLoopGetIndex(lindex); hypre_SetIndex3(findex, lindex[0], lindex[1], lindex[2]); for (k = 0; k < 3; k++) { findex[k] *= rfactor[k]; } hypre_AddIndexes(findex, start, 3, findex); /* get interior edges */ for (p = 1; p < rfactor[1]; p++) { hypre_CopyIndex(findex, var_index); var_index[1] += p; for (n = 1; n < rfactor[0]; n++) { var_index[0]++; for (k = 0; k < rfactor[2]; k++) { hypre_SStructGridFindBoxManEntry(fgrid_edge, part, var_index, t, &entry); hypre_SStructBoxManEntryGetGlobalRank(entry, var_index, &l, matrix_type); iedgeEdge[j] = l; /* Interior. Four coarse Edge connections. */ ncols_edgeEdge[j] = 4; j++; var_index[2]++; } /* for (k= 0; k< rfactor[2]; k++) */ /* reset var_index[2] to the initial index for next k loop */ var_index[2] -= rfactor[2]; } /* for (n= 1; n< rfactor[0]; n++) */ /* reset var_index[0] to the initial index for next n loop */ var_index[0] -= (rfactor[0] - 1); } /* for (p= 1; p< rfactor[1]; p++) */ } hypre_SerialBoxLoop1End(m); } /* hypre_ForBoxI(i, fboxes) */ break; } } /* switch */ } /* for (t= 0; t< Edge_nvars; t++) */ } /* for (part= 0; part< nparts; part++) */ k = 0; j = 0; for (i = 0; i < nedges; i++) { if (ncols_edgeEdge[i]) { k += ncols_edgeEdge[i]; j++; } } vals_edgeEdge = hypre_CTAlloc(HYPRE_Real, k, HYPRE_MEMORY_HOST); jedge_Edge = hypre_CTAlloc(HYPRE_BigInt, k, HYPRE_MEMORY_HOST); /* update nedges so that the true number of rows is set */ size = j; /********************************************************************* * Fill up the edge_Edge interpolation matrix. Interpolation weights * are determined differently for each type of fine edges. *********************************************************************/ /* loop over fedges aligning with the agglomerate coarse edges first. */ k = 0; for (part = 0; part < nparts; part++) { p_fgrid = hypre_SStructGridPGrid(fgrid_edge, part); /* edge grid */ Edge_nvars = hypre_SStructPGridNVars(p_fgrid); Edge_vartypes = hypre_SStructPGridVarTypes(p_fgrid); p_cgrid = hypre_SStructGridPGrid(cgrid_edge, part); /* Edge grid */ /* note that fboxes are the contracted CELL boxes. Will get the correct variable grid extents. */ fboxes = contract_fedgeBoxes[part]; for (t = 0; t < Edge_nvars; t++) { var = Edge_vartypes[t]; var_fgrid = hypre_SStructPGridVTSGrid(p_fgrid, var); box_array = hypre_StructGridBoxes(var_fgrid); n_boxoffsets = ndim - 1; boxoffset = hypre_CTAlloc(hypre_Index, n_boxoffsets, HYPRE_MEMORY_HOST); suboffset = hypre_CTAlloc(hypre_Index, n_boxoffsets, HYPRE_MEMORY_HOST); switch (var) { case 2: /* 2-d: x_face (vertical edges), stride=[rfactor[0],1,1] fCedge_ratio= 1.0/rfactor[1] */ { hypre_SetIndex3(stride, rfactor[0], 1, 1); fCedge_ratio = 1.0 / rfactor[1]; /* boxoffset shrink in the i direction */ hypre_SetIndex3(boxoffset[0], rfactor[0] - 1, 0, 0); hypre_SetIndex3(suboffset[0], 1, 0, 0); /* extend loop_size by one in the stride direction */ hypre_SetIndex3(hi_index, 1, 0, 0); break; } case 3: /* 2-d: y_face (horizontal edges), stride=[1,rfactor[1],1] fCedge_ratio= 1.0/rfactor[0] */ { hypre_SetIndex3(stride, 1, rfactor[1], 1); fCedge_ratio = 1.0 / rfactor[0]; /* boxoffset shrink in the j direction */ hypre_SetIndex3(boxoffset[0], 0, rfactor[1] - 1, 0); hypre_SetIndex3(suboffset[0], 0, 1, 0); /* extend loop_size by one in the stride direction */ hypre_SetIndex3(hi_index, 0, 1, 0); break; } case 5: /* 3-d: x_edge, stride=[1,rfactor[1],rfactor[2]] fCedge_ratio= 1.0/rfactor[0] */ { hypre_SetIndex3(stride, 1, rfactor[1], rfactor[2]); fCedge_ratio = 1.0 / rfactor[0]; /* boxoffset shrink in the j & k directions */ hypre_SetIndex3(boxoffset[0], 0, rfactor[1] - 1, 0); hypre_SetIndex3(boxoffset[1], 0, 0, rfactor[2] - 1); hypre_SetIndex3(suboffset[0], 0, 1, 0); hypre_SetIndex3(suboffset[1], 0, 0, 1); /* extend loop_size by one in the stride direction */ hypre_SetIndex3(hi_index, 0, 1, 1); break; } case 6: /* 3-d: y_edge, stride=[rfactor[0],1,rfactor[2]] fCedge_ratio= 1.0/rfactor[1] */ { hypre_SetIndex3(stride, rfactor[0], 1, rfactor[2]); fCedge_ratio = 1.0 / rfactor[1]; /* boxoffset shrink in the i & k directions */ hypre_SetIndex3(boxoffset[0], rfactor[0] - 1, 0, 0); hypre_SetIndex3(boxoffset[1], 0, 0, rfactor[2] - 1); hypre_SetIndex3(suboffset[0], 1, 0, 0); hypre_SetIndex3(suboffset[1], 0, 0, 1); /* extend loop_size by one in the stride direction */ hypre_SetIndex3(hi_index, 1, 0, 1); break; } case 7: /* 3-d: z_edge, stride=[rfactor[0],rfactor[1],1] fCedge_ratio= 1.0/rfactor[2] */ { hypre_SetIndex3(stride, rfactor[0], rfactor[1], 1); fCedge_ratio = 1.0 / rfactor[2]; /* boxoffset shrink in the i & j directions */ hypre_SetIndex3(boxoffset[0], rfactor[0] - 1, 0, 0); hypre_SetIndex3(boxoffset[1], 0, rfactor[1] - 1, 0); hypre_SetIndex3(suboffset[0], 1, 0, 0); hypre_SetIndex3(suboffset[1], 0, 1, 0); /* extend loop_size by one in the stride direction */ hypre_SetIndex3(hi_index, 1, 1, 0); break; } default: { fCedge_ratio = 1.0; } } hypre_ForBoxI(i, fboxes) { cellbox = hypre_BoxArrayBox(fboxes, i); /* vboxes inside the i'th cellbox */ num_vboxes = n_CtoVbox[part][i]; vboxnums = CtoVboxnums[part][i]; hypre_CopyIndex(Edge_cstarts[part][i], cstart); /* adjust the contracted cellbox to the variable box. Note that some of the fboxes may be skipped because they vanish. */ hypre_CopyBox(cellbox, ©_box); for (j = 0; j < n_boxoffsets; j++) { hypre_SubtractIndexes(hypre_BoxIMin(©_box), suboffset[j], 3, findex); row_in = falseV; for (p = 0; p < num_vboxes[t]; p++) { vbox = hypre_BoxArrayBox(box_array, vboxnums[t][p]); if (hypre_IndexInBox(findex, vbox)) { hypre_CopyIndex(findex, hypre_BoxIMin(©_box)); row_in = trueV; break; } } /* not in any vbox */ if (!row_in) { hypre_AddIndexes(hypre_BoxIMin(©_box), boxoffset[j], 3, hypre_BoxIMin(©_box)); /* also modify cstart */ hypre_AddIndexes(boxoffset[j], one_index, 3, boxoffset[j]); hypre_StructMapFineToCoarse(boxoffset[j], zero_index, rfactor, boxoffset[j]); hypre_AddIndexes(cstart, boxoffset[j], 3, cstart); } } hypre_BoxGetSize(©_box, loop_size); hypre_StructMapFineToCoarse(loop_size, zero_index, stride, loop_size); /* extend the loop_size so that upper boundary of the box are reached. */ hypre_AddIndexes(loop_size, hi_index, 3, loop_size); hypre_CopyIndex(hypre_BoxIMin(©_box), start); /* note that the correct cbox corresponding to this non-vanishing fbox is used. */ hypre_SerialBoxLoop1Begin(ndim, loop_size, ©_box, start, stride, m); { zypre_BoxLoopGetIndex(lindex); hypre_SetIndex3(findex, lindex[0], lindex[1], lindex[2]); for (j = 0; j < 3; j++) { findex[j] *= stride[j]; } /* make sure that we do have the fine row corresponding to findex */ hypre_AddIndexes(findex, start, 3, findex); hypre_SStructGridFindBoxManEntry(fgrid_edge, part, findex, t, &entry); hypre_SStructBoxManEntryGetGlobalRank(entry, findex, &p, matrix_type); /* still row p may be outside the processor- check to make sure in */ if ( (p <= upper_ranks[part][t]) && (p >= lower_ranks[part][t]) ) { hypre_SubtractIndexes(findex, start, 3, findex); /* determine where the edge lies- coarsening required. */ hypre_StructMapFineToCoarse(findex, zero_index, rfactor, cindex); hypre_AddIndexes(cindex, cstart, 3, cindex); /* lies on coarse Edge. Coarse Edge connection: var_index= cindex - subtract_index.*/ hypre_SubtractIndexes(cindex, varoffsets[var], 3, var_index); hypre_SStructGridFindBoxManEntry(cgrid_edge, part, var_index, t, &entry); hypre_SStructBoxManEntryGetGlobalRank(entry, var_index, &l, matrix_type); jedge_Edge[k] = l; vals_edgeEdge[k] = fCedge_ratio; k++; } /* if ((p <= upper_ranks[part][t]) && (p >= lower_ranks[part][t])) */ } hypre_SerialBoxLoop1End(m); } /* hypre_ForBoxI */ hypre_TFree(boxoffset, HYPRE_MEMORY_HOST); hypre_TFree(suboffset, HYPRE_MEMORY_HOST); } /* for (t= 0; t< nvars; t++) */ } /* for (part= 0; part< nparts; part++) */ /* generate the face interpolation weights/info. Only for 3-d */ if (ndim == 3) { for (part = 0; part < nparts; part++) { p_fgrid = hypre_SStructGridPGrid(fgrid_edge, part); /* edge grid */ Edge_nvars = hypre_SStructPGridNVars(p_fgrid); Edge_vartypes = hypre_SStructPGridVarTypes(p_fgrid); p_cgrid = hypre_SStructGridPGrid(cgrid_edge, part); /* Edge grid */ /* note that fboxes are the contracted CELL boxes. Will get the correct variable grid extents. */ fboxes = contract_fedgeBoxes[part]; /* may need to shrink a given box in some boxoffset directions */ boxoffset = hypre_TAlloc(hypre_Index, ndim, HYPRE_MEMORY_HOST); for (t = 0; t < ndim; t++) { hypre_ClearIndex(boxoffset[t]); hypre_IndexD(boxoffset[t], t) = rfactor[t] - 1; } for (t = 0; t < Edge_nvars; t++) { var = Edge_vartypes[t]; var_fgrid = hypre_SStructPGridVTSGrid(p_fgrid, var); box_array = hypre_StructGridBoxes(var_fgrid); switch (var) { case 5: { /* 3-d x_edge, can be Y or Z_Face */ hypre_ForBoxI(i, fboxes) { cellbox = hypre_BoxArrayBox(fboxes, i); /* vboxes inside the i'th cellbox */ num_vboxes = n_CtoVbox[part][i]; vboxnums = CtoVboxnums[part][i]; hypre_CopyIndex(Edge_cstarts[part][i], cstart); /* adjust the project cellbox to the variable box */ hypre_CopyBox(cellbox, ©_box); /****************************************************** * Check the location of the shifted lower box index: * x_edge-> Z_Face & Y_Face: * Z_Face- contract in the z direction only if the * processor interface is in the z direction * Y_Face- contract in the y direction if the processor * interface is in the y direction. ******************************************************/ hypre_SubtractIndexes(hypre_BoxIMin(©_box), kshift, 3, findex); /* loop over all the vboxes to see if findex is inside */ row_in = falseV; for (p = 0; p < num_vboxes[t]; p++) { vbox = hypre_BoxArrayBox(box_array, vboxnums[t][p]); if (hypre_IndexInBox(findex, vbox)) { hypre_CopyIndex(findex, hypre_BoxIMin(©_box)); row_in = trueV; break; } } /* not in any vbox */ if (!row_in) { hypre_AddIndexes(hypre_BoxIMin(©_box), boxoffset[2], 3, hypre_BoxIMin(©_box)); /* modify cstart */ hypre_AddIndexes(cstart, kshift, 3, cstart); } hypre_SubtractIndexes(hypre_BoxIMin(©_box), jshift, 3, hypre_BoxIMin(©_box)); hypre_BoxGetSize(©_box, loop_size); hypre_StructMapFineToCoarse(loop_size, zero_index, rfactor, loop_size); hypre_CopyIndex(hypre_BoxIMin(©_box), start); /* increase the loop_size by one in the Z plane direction */ loop_size[2]++; hypre_SerialBoxLoop1Begin(ndim, loop_size, ©_box, start, rfactor, m); { zypre_BoxLoopGetIndex(lindex); hypre_SetIndex3(findex, lindex[0], lindex[1], lindex[2]); /* because of rfactor striding, cindex= findex. But adjust by cstart to get actually coarse edge. */ hypre_CopyIndex(findex, cindex); hypre_AddIndexes(cindex, cstart, 3, cindex); /* Will need the actual fine indices. */ for (l = 0; l < ndim; l++) { findex[l] *= rfactor[l]; } hypre_AddIndexes(findex, start, 3, findex); /****************************************************** * ranks for coarse edges. Fine edges of agglomerate * connect to these coarse edges. * Z_Face (i,j,k-1). Two like-var coarse Edge connections. * x_Edge (i,j,k-1), (i,j-1,k-1) ******************************************************/ hypre_SubtractIndexes(cindex, kshift, 3, var_index); hypre_SStructGridFindBoxManEntry(cgrid_edge, part, var_index, t, &entry); hypre_SStructBoxManEntryGetGlobalRank(entry, var_index, &rank2, matrix_type); hypre_SubtractIndexes(var_index, jshift, 3, var_index); hypre_SStructGridFindBoxManEntry(cgrid_edge, part, var_index, t, &entry); hypre_SStructBoxManEntryGetGlobalRank(entry, var_index, &rank, matrix_type); /* loop over the strips of x_edges making up the Z_Face */ for (p = 0; p < rfactor[0]; p++) { hypre_CopyIndex(findex, var_index); var_index[0] += p; for (n = 1; n < rfactor[1]; n++) { var_index[1]++; hypre_SStructGridFindBoxManEntry(fgrid_edge, part, var_index, t, &entry); hypre_SStructBoxManEntryGetGlobalRank(entry, var_index, &l, matrix_type); /* still row l may be outside the processor */ if ((l <= upper_ranks[part][t]) && (l >= lower_ranks[part][t])) { jedge_Edge[k] = rank; vals_edgeEdge[k] = (HYPRE_Real) n / (rfactor[1] * rfactor[0]); k++; jedge_Edge[k] = rank2; vals_edgeEdge[k] = 1.0 / rfactor[0] * (1.0 - (HYPRE_Real) n / rfactor[1]); k++; } } /* for (n= 1; n< rfactor[1]; n++) */ } /* for (p= 0; p< rfactor[0]; p++) */ } hypre_SerialBoxLoop1End(m); /* Y plane direction */ hypre_CopyIndex(Edge_cstarts[part][i], cstart); hypre_CopyBox(cellbox, ©_box); hypre_SubtractIndexes(hypre_BoxIMin(©_box), jshift, 3, findex); /* loop over all the vboxes to see if findex is inside */ row_in = falseV; for (p = 0; p < num_vboxes[t]; p++) { vbox = hypre_BoxArrayBox(box_array, vboxnums[t][p]); if (hypre_IndexInBox(findex, vbox)) { hypre_CopyIndex(findex, hypre_BoxIMin(©_box)); row_in = trueV; break; } } /* not in any vbox */ if (!row_in) { hypre_AddIndexes(hypre_BoxIMin(©_box), boxoffset[1], 3, hypre_BoxIMin(©_box)); /* modify cstart */ hypre_AddIndexes(cstart, jshift, 3, cstart); } hypre_SubtractIndexes(hypre_BoxIMin(©_box), kshift, 3, hypre_BoxIMin(©_box)); hypre_BoxGetSize(©_box, loop_size); hypre_StructMapFineToCoarse(loop_size, zero_index, rfactor, loop_size); hypre_CopyIndex(hypre_BoxIMin(©_box), start); loop_size[1]++; hypre_SerialBoxLoop1Begin(ndim, loop_size, ©_box, start, rfactor, m); { zypre_BoxLoopGetIndex(lindex); hypre_SetIndex3(findex, lindex[0], lindex[1], lindex[2]); /* because of rfactor striding, cindex= findex. But adjust by cstart to get actually coarse edge. */ hypre_CopyIndex(findex, cindex); hypre_AddIndexes(cindex, cstart, 3, cindex); /* Will need the actual fine indices. */ for (l = 0; l < ndim; l++) { findex[l] *= rfactor[l]; } hypre_AddIndexes(findex, start, 3, findex); /****************************************************** * Y_Face. Two coarse Edge connections. * x_Edge (i,j-1,k), (i,j-1,k-1) ******************************************************/ hypre_SubtractIndexes(cindex, jshift, 3, var_index); hypre_SStructGridFindBoxManEntry(cgrid_edge, part, var_index, t, &entry); hypre_SStructBoxManEntryGetGlobalRank(entry, var_index, &rank2, matrix_type); hypre_SubtractIndexes(var_index, kshift, 3, var_index); hypre_SStructGridFindBoxManEntry(cgrid_edge, part, var_index, t, &entry); hypre_SStructBoxManEntryGetGlobalRank(entry, var_index, &rank, matrix_type); /* loop over the strips of x_edges making up the Y_Face */ for (p = 0; p < rfactor[0]; p++) { hypre_CopyIndex(findex, var_index); var_index[0] += p; for (n = 1; n < rfactor[2]; n++) { var_index[2]++; hypre_SStructGridFindBoxManEntry(fgrid_edge, part, var_index, t, &entry); hypre_SStructBoxManEntryGetGlobalRank(entry, var_index, &l, matrix_type); if ((l <= upper_ranks[part][t]) && (l >= lower_ranks[part][t])) { jedge_Edge[k] = rank; vals_edgeEdge[k] = (HYPRE_Real) n / (rfactor[0] * rfactor[2]); k++; jedge_Edge[k] = rank2; vals_edgeEdge[k] = 1.0 / rfactor[0] * (1.0 - (HYPRE_Real) n / rfactor[2]); k++; } } /* for (n= 1; n< rfactor[2]; n++) */ } /* for (p= 0; p< rfactor[0]; p++) */ } hypre_SerialBoxLoop1End(m); } /* hypre_ForBoxI(i, fboxes) */ break; } case 6: { /* 3-d y_edge, can be X or Z_Face */ hypre_ForBoxI(i, fboxes) { cellbox = hypre_BoxArrayBox(fboxes, i); /* vboxes inside the i'th cellbox */ num_vboxes = n_CtoVbox[part][i]; vboxnums = CtoVboxnums[part][i]; hypre_CopyIndex(Edge_cstarts[part][i], cstart); /* adjust the project cellbox to the variable box */ hypre_CopyBox(cellbox, ©_box); /****************************************************** * Check the location of the shifted lower box index: * y_edge-> X_Face & Z_Face: * Z_Face- contract in the z direction only if the * processor interface is in the z direction * X_Face- contract in the x direction if the processor * interface is in the x direction. ******************************************************/ /* Z_Face */ hypre_SubtractIndexes(hypre_BoxIMin(©_box), kshift, 3, findex); /* loop over all the vboxes to see if findex is inside */ row_in = falseV; for (p = 0; p < num_vboxes[t]; p++) { vbox = hypre_BoxArrayBox(box_array, vboxnums[t][p]); if (hypre_IndexInBox(findex, vbox)) { hypre_CopyIndex(findex, hypre_BoxIMin(©_box)); row_in = trueV; break; } } /* not in any vbox */ if (!row_in) { hypre_AddIndexes(hypre_BoxIMin(©_box), boxoffset[2], 3, hypre_BoxIMin(©_box)); /* modify cstart */ hypre_AddIndexes(cstart, kshift, 3, cstart); } hypre_SubtractIndexes(hypre_BoxIMin(©_box), ishift, 3, hypre_BoxIMin(©_box)); hypre_BoxGetSize(©_box, loop_size); hypre_StructMapFineToCoarse(loop_size, zero_index, rfactor, loop_size); hypre_CopyIndex(hypre_BoxIMin(©_box), start); /* increase the loop_size by one in the Z plane direction */ loop_size[2]++; hypre_SerialBoxLoop1Begin(ndim, loop_size, ©_box, start, rfactor, m); { zypre_BoxLoopGetIndex(lindex); hypre_SetIndex3(findex, lindex[0], lindex[1], lindex[2]); /* because of rfactor striding, cindex= findex. But adjust by cstart to get actually coarse edge. */ hypre_CopyIndex(findex, cindex); hypre_AddIndexes(cindex, cstart, 3, cindex); /* Will need the actual fine indices. */ for (l = 0; l < ndim; l++) { findex[l] *= rfactor[l]; } hypre_AddIndexes(findex, start, 3, findex); /****************************************************** * ranks for coarse edges. Fine edges of agglomerate * connect to these coarse edges. * Z_Face (i,j,k-1). Two like-var coarse Edge connections. * y_Edge (i,j,k-1), (i-1,j,k-1) ******************************************************/ hypre_SubtractIndexes(cindex, kshift, 3, var_index); hypre_SStructGridFindBoxManEntry(cgrid_edge, part, var_index, t, &entry); hypre_SStructBoxManEntryGetGlobalRank(entry, var_index, &rank2, matrix_type); hypre_SubtractIndexes(var_index, ishift, 3, var_index); hypre_SStructGridFindBoxManEntry(cgrid_edge, part, var_index, t, &entry); hypre_SStructBoxManEntryGetGlobalRank(entry, var_index, &rank, matrix_type); /* loop over the strips of y_edges making up the Z_Face */ for (p = 0; p < rfactor[1]; p++) { hypre_CopyIndex(findex, var_index); var_index[1] += p; for (n = 1; n < rfactor[0]; n++) { var_index[0]++; hypre_SStructGridFindBoxManEntry(fgrid_edge, part, var_index, t, &entry); hypre_SStructBoxManEntryGetGlobalRank(entry, var_index, &l, matrix_type); if ((l <= upper_ranks[part][t]) && (l >= lower_ranks[part][t])) { jedge_Edge[k] = rank; vals_edgeEdge[k] = (HYPRE_Real) n / (rfactor[0] * rfactor[1]); k++; jedge_Edge[k] = rank2; vals_edgeEdge[k] = 1.0 / rfactor[1] * (1.0 - (HYPRE_Real) n / rfactor[0]); k++; } } /* for (n= 1; n< rfactor[0]; n++) */ } /* for (p= 0; p< rfactor[1]; p++) */ } hypre_SerialBoxLoop1End(m); /* X_Face */ hypre_CopyBox(cellbox, ©_box); hypre_CopyIndex(Edge_cstarts[part][i], cstart); hypre_SubtractIndexes(hypre_BoxIMin(©_box), ishift, 3, findex); /* loop over all the vboxes to see if findex is inside */ row_in = falseV; for (p = 0; p < num_vboxes[t]; p++) { vbox = hypre_BoxArrayBox(box_array, vboxnums[t][p]); if (hypre_IndexInBox(findex, vbox)) { hypre_CopyIndex(findex, hypre_BoxIMin(©_box)); row_in = trueV; break; } } /* not in any vbox */ if (!row_in) { hypre_AddIndexes(hypre_BoxIMin(©_box), boxoffset[0], 3, hypre_BoxIMin(©_box)); /* modify cstart */ hypre_AddIndexes(cstart, ishift, 3, cstart); } hypre_SubtractIndexes(hypre_BoxIMin(©_box), kshift, 3, hypre_BoxIMin(©_box)); hypre_BoxGetSize(©_box, loop_size); hypre_StructMapFineToCoarse(loop_size, zero_index, rfactor, loop_size); hypre_CopyIndex(hypre_BoxIMin(©_box), start); loop_size[0]++; hypre_SerialBoxLoop1Begin(ndim, loop_size, ©_box, start, rfactor, m); { zypre_BoxLoopGetIndex(lindex); hypre_SetIndex3(findex, lindex[0], lindex[1], lindex[2]); /* because of rfactor striding, cindex= findex. But adjust by cstart to get actually coarse edge. */ hypre_CopyIndex(findex, cindex); hypre_AddIndexes(cindex, cstart, 3, cindex); /* Will need the actual fine indices. */ for (l = 0; l < ndim; l++) { findex[l] *= rfactor[l]; } hypre_AddIndexes(findex, start, 3, findex); /****************************************************** * X_Face. Two coarse Edge connections. * y_Edge (i-1,j,k), (i-1,j,k-1) ******************************************************/ hypre_SubtractIndexes(cindex, ishift, 3, var_index); hypre_SStructGridFindBoxManEntry(cgrid_edge, part, var_index, t, &entry); hypre_SStructBoxManEntryGetGlobalRank(entry, var_index, &rank2, matrix_type); hypre_SubtractIndexes(var_index, kshift, 3, var_index); hypre_SStructGridFindBoxManEntry(cgrid_edge, part, var_index, t, &entry); hypre_SStructBoxManEntryGetGlobalRank(entry, var_index, &rank, matrix_type); /* loop over the strips of y_edges making up the X_Face */ for (p = 0; p < rfactor[1]; p++) { hypre_CopyIndex(findex, var_index); var_index[1] += p; for (n = 1; n < rfactor[2]; n++) { var_index[2]++; hypre_SStructGridFindBoxManEntry(fgrid_edge, part, var_index, t, &entry); hypre_SStructBoxManEntryGetGlobalRank(entry, var_index, &l, matrix_type); if ((l <= upper_ranks[part][t]) && (l >= lower_ranks[part][t])) { jedge_Edge[k] = rank; vals_edgeEdge[k] = (HYPRE_Real) n / (rfactor[1] * rfactor[2]); k++; jedge_Edge[k] = rank2; vals_edgeEdge[k] = 1.0 / rfactor[1] * (1.0 - (HYPRE_Real) n / rfactor[2]); k++; } } /* for (n= 1; n< rfactor[2]; n++) */ } /* for (p= 0; p< rfactor[1]; p++) */ } hypre_SerialBoxLoop1End(m); } /* hypre_ForBoxI(i, fboxes) */ break; } case 7: { /* 3-d z_edge, can be X or Y_Face */ hypre_ForBoxI(i, fboxes) { cellbox = hypre_BoxArrayBox(fboxes, i); /* vboxes inside the i'th cellbox */ num_vboxes = n_CtoVbox[part][i]; vboxnums = CtoVboxnums[part][i]; hypre_CopyIndex(Edge_cstarts[part][i], cstart); /* adjust the project cellbox to the variable box */ hypre_CopyBox(cellbox, ©_box); /****************************************************** * Check the location of the shifted lower box index: * z_edge-> X_Face & Y_Face: * X_Face- contract in the x direction if the processor * interface is in the x direction. * Y_Face- contract in the y direction if the processor * interface is in the y direction. ******************************************************/ hypre_SubtractIndexes(hypre_BoxIMin(©_box), ishift, 3, findex); /* loop over all the vboxes to see if findex is inside */ row_in = falseV; for (p = 0; p < num_vboxes[t]; p++) { vbox = hypre_BoxArrayBox(box_array, vboxnums[t][p]); if (hypre_IndexInBox(findex, vbox)) { hypre_CopyIndex(findex, hypre_BoxIMin(©_box)); row_in = trueV; break; } } /* not in any vbox */ if (!row_in) { hypre_AddIndexes(hypre_BoxIMin(©_box), boxoffset[0], 3, hypre_BoxIMin(©_box)); /* modify cstart */ hypre_AddIndexes(cstart, ishift, 3, cstart); } hypre_SubtractIndexes(hypre_BoxIMin(©_box), jshift, 3, hypre_BoxIMin(©_box)); hypre_BoxGetSize(©_box, loop_size); hypre_StructMapFineToCoarse(loop_size, zero_index, rfactor, loop_size); hypre_CopyIndex(hypre_BoxIMin(©_box), start); /* increase the loop_size by one in the X plane direction */ loop_size[0]++; hypre_SerialBoxLoop1Begin(ndim, loop_size, ©_box, start, rfactor, m); { zypre_BoxLoopGetIndex(lindex); hypre_SetIndex3(findex, lindex[0], lindex[1], lindex[2]); /* because of rfactor striding, cindex= findex. But adjust by cstart to get actually coarse edge. */ hypre_CopyIndex(findex, cindex); hypre_AddIndexes(cindex, cstart, 3, cindex); /* Will need the actual fine indices. */ for (l = 0; l < ndim; l++) { findex[l] *= rfactor[l]; } hypre_AddIndexes(findex, start, 3, findex); /****************************************************** * ranks for coarse edges. Fine edges of agglomerate * connect to these coarse edges. * X_Face. Two coarse Edge connections. * z_Edge (i-1,j,k), (i-1,j-1,k) ******************************************************/ hypre_SubtractIndexes(cindex, ishift, 3, var_index); hypre_SStructGridFindBoxManEntry(cgrid_edge, part, var_index, t, &entry); hypre_SStructBoxManEntryGetGlobalRank(entry, var_index, &rank2, matrix_type); hypre_SubtractIndexes(var_index, jshift, 3, var_index); hypre_SStructGridFindBoxManEntry(cgrid_edge, part, var_index, t, &entry); hypre_SStructBoxManEntryGetGlobalRank(entry, var_index, &rank, matrix_type); /* loop over the strips of z_edges making up the X_Face */ for (p = 0; p < rfactor[2]; p++) { hypre_CopyIndex(findex, var_index); var_index[2] += p; for (n = 1; n < rfactor[1]; n++) { var_index[1]++; hypre_SStructGridFindBoxManEntry(fgrid_edge, part, var_index, t, &entry); hypre_SStructBoxManEntryGetGlobalRank(entry, var_index, &l, matrix_type); if ((l <= upper_ranks[part][t]) && (l >= lower_ranks[part][t])) { jedge_Edge[k] = rank; vals_edgeEdge[k] = (HYPRE_Real) n / (rfactor[0] * rfactor[2]); k++; jedge_Edge[k] = rank2; vals_edgeEdge[k] = 1.0 / rfactor[2] * (1.0 - (HYPRE_Real) n / rfactor[0]); k++; } } /* for (n= 1; n< rfactor[1]; n++) */ } /* for (p= 0; p< rfactor[2]; p++) */ } hypre_SerialBoxLoop1End(m); /* Y plane */ hypre_CopyBox(cellbox, ©_box); hypre_CopyIndex(Edge_cstarts[part][i], cstart); hypre_SubtractIndexes(hypre_BoxIMin(©_box), jshift, 3, findex); /* loop over all the vboxes to see if findex is inside */ row_in = falseV; for (p = 0; p < num_vboxes[t]; p++) { vbox = hypre_BoxArrayBox(box_array, vboxnums[t][p]); if (hypre_IndexInBox(findex, vbox)) { hypre_CopyIndex(findex, hypre_BoxIMin(©_box)); row_in = trueV; break; } } /* not in any vbox */ if (!row_in) { hypre_AddIndexes(hypre_BoxIMin(©_box), boxoffset[1], 3, hypre_BoxIMin(©_box)); /* modify cstart */ hypre_AddIndexes(cstart, jshift, 3, cstart); } hypre_SubtractIndexes(hypre_BoxIMin(©_box), ishift, 3, hypre_BoxIMin(©_box)); hypre_BoxGetSize(©_box, loop_size); hypre_StructMapFineToCoarse(loop_size, zero_index, rfactor, loop_size); hypre_CopyIndex(hypre_BoxIMin(©_box), start); loop_size[1]++; hypre_SerialBoxLoop1Begin(ndim, loop_size, ©_box, start, rfactor, m); { zypre_BoxLoopGetIndex(lindex); hypre_SetIndex3(findex, lindex[0], lindex[1], lindex[2]); /* because of rfactor striding, cindex= findex. But adjust by cstart to get actually coarse edge. */ hypre_CopyIndex(findex, cindex); hypre_AddIndexes(cindex, cstart, 3, cindex); /* Will need the actual fine indices. */ for (l = 0; l < ndim; l++) { findex[l] *= rfactor[l]; } hypre_AddIndexes(findex, start, 3, findex); /********************************************************** * Y_Face (i,j-1,k). Two like-var coarse Edge connections. * z_Edge (i,j-1,k), (i-1,j-1,k) **********************************************************/ hypre_SubtractIndexes(cindex, jshift, 3, var_index); hypre_SStructGridFindBoxManEntry(cgrid_edge, part, var_index, t, &entry); hypre_SStructBoxManEntryGetGlobalRank(entry, var_index, &rank2, matrix_type); hypre_SubtractIndexes(var_index, ishift, 3, var_index); hypre_SStructGridFindBoxManEntry(cgrid_edge, part, var_index, t, &entry); hypre_SStructBoxManEntryGetGlobalRank(entry, var_index, &rank, matrix_type); /* loop over the strips of y_edges making up the Y_Face */ for (p = 0; p < rfactor[2]; p++) { hypre_CopyIndex(findex, var_index); var_index[2] += p; for (n = 1; n < rfactor[0]; n++) { var_index[0]++; hypre_SStructGridFindBoxManEntry(fgrid_edge, part, var_index, t, &entry); hypre_SStructBoxManEntryGetGlobalRank(entry, var_index, &l, matrix_type); if ((l <= upper_ranks[part][t]) && (l >= lower_ranks[part][t])) { jedge_Edge[k] = rank; vals_edgeEdge[k] = (HYPRE_Real) n / (rfactor[0] * rfactor[2]); k++; jedge_Edge[k] = rank2; vals_edgeEdge[k] = 1.0 / rfactor[2] * (1.0 - (HYPRE_Real) n / rfactor[0]); k++; } } /* for (n= 1; n< rfactor[0]; n++) */ } /* for (p= 0; p< rfactor[2]; p++) */ } hypre_SerialBoxLoop1End(m); } /* hypre_ForBoxI(i, fboxes) */ break; } } /* switch */ } /* for (t= 0; t< Edge_nvars; t++) */ hypre_TFree(boxoffset, HYPRE_MEMORY_HOST); } /* for (part= 0; part< nparts; part++) */ } /* if (ndim == 3) */ /* generate the interior interpolation weights/info */ for (part = 0; part < nparts; part++) { p_fgrid = hypre_SStructGridPGrid(fgrid_edge, part); /* edge grid */ Edge_nvars = hypre_SStructPGridNVars(p_fgrid); Edge_vartypes = hypre_SStructPGridVarTypes(p_fgrid); p_cgrid = hypre_SStructGridPGrid(cgrid_edge, part); /* Edge grid */ /* note that fboxes are the contracted CELL boxes. Will get the correct variable grid extents. */ fboxes = contract_fedgeBoxes[part]; for (t = 0; t < Edge_nvars; t++) { var = Edge_vartypes[t]; var_fgrid = hypre_SStructPGridVTSGrid(p_fgrid, var); box_array = hypre_StructGridBoxes(var_fgrid); switch (var) { case 2: { /* 2-d x_face = x_edge, can be interior or on X_Edge */ hypre_ForBoxI(i, fboxes) { cellbox = hypre_BoxArrayBox(fboxes, i); vbox = hypre_BoxArrayBox(box_array, i); hypre_CopyIndex(Edge_cstarts[part][i], cstart); /* adjust the project cellbox to the variable box */ hypre_CopyBox(cellbox, ©_box); hypre_SubtractIndexes(hypre_BoxIMin(©_box), varoffsets[var], 3, hypre_BoxIMin(©_box)); /* hypre_IntersectBoxes(©_box, vbox, ©_box);*/ hypre_BoxGetSize(©_box, loop_size); hypre_StructMapFineToCoarse(loop_size, zero_index, rfactor, loop_size); hypre_CopyIndex(hypre_BoxIMin(©_box), start); hypre_SerialBoxLoop1Begin(ndim, loop_size, ©_box, start, rfactor, r); { zypre_BoxLoopGetIndex(lindex); hypre_SetIndex3(findex, lindex[0], lindex[1], lindex[2]); /***************************************************** * Where the fine edge lies wrt the coarse edge: * Since we stride by rfactor, lindex is * the coarse index. No coarsening needed, i.e., * cindex= findex. * * Loop over the interior fine edges in an agglomerate. *****************************************************/ for (p = 1; p < rfactor[0]; p++) { for (n = 0; n < rfactor[1]; n++) { hypre_CopyIndex(findex, cindex); hypre_AddIndexes(cindex, cstart, 3, cindex); /*interior of Face. Extract the two coarse Edge (x_Edge ijk & (i-1,j,k)*/ hypre_SStructGridFindBoxManEntry(cgrid_edge, part, cindex, t, &entry); hypre_SStructBoxManEntryGetGlobalRank(entry, cindex, &rank, matrix_type); jedge_Edge[k] = rank; vals_edgeEdge[k] = (HYPRE_Real) p / (rfactor[0] * rfactor[1]); k++; hypre_SubtractIndexes(cindex, ishift, 3, var_index); hypre_SStructGridFindBoxManEntry(cgrid_edge, part, var_index, t, &entry); hypre_SStructBoxManEntryGetGlobalRank(entry, var_index, &rank, matrix_type); jedge_Edge[k] = rank; vals_edgeEdge[k] = (HYPRE_Real) (rfactor[0] - p) / (rfactor[0] * rfactor[1]); k++; } /* for (n= 0; n< rfactor[1]; n++) */ } /* for (p= 1; p< rfactor[0]; p++) */ } hypre_SerialBoxLoop1End(r); } /* hypre_ForBoxI(i, fboxes) */ break; } case 3: { /* 2-d y_face = y_edge, can be interior or on Y_Edge */ hypre_ForBoxI(i, fboxes) { cellbox = hypre_BoxArrayBox(fboxes, i); vbox = hypre_BoxArrayBox(box_array, i); hypre_CopyIndex(Edge_cstarts[part][i], cstart); /* adjust the project cellbox to the variable box */ hypre_CopyBox(cellbox, ©_box); hypre_SubtractIndexes(hypre_BoxIMin(©_box), varoffsets[var], 3, hypre_BoxIMin(©_box)); /* hypre_IntersectBoxes(©_box, vbox, ©_box);*/ hypre_BoxGetSize(©_box, loop_size); hypre_StructMapFineToCoarse(loop_size, zero_index, rfactor, loop_size); hypre_CopyIndex(hypre_BoxIMin(©_box), start); hypre_SerialBoxLoop1Begin(ndim, loop_size, ©_box, start, rfactor, r); { zypre_BoxLoopGetIndex(lindex); hypre_SetIndex3(findex, lindex[0], lindex[1], lindex[2]); /***************************************************** * Where the fine edge lies wrt the coarse edge: * Since we stride by rfactor, lindex is * the coarse index. No coarsening needed, i.e., * cindex= findex. * * Loop over the interior fine edges in an agglomerate. *****************************************************/ for (p = 1; p < rfactor[1]; p++) { for (n = 0; n < rfactor[0]; n++) { hypre_CopyIndex(findex, cindex); hypre_AddIndexes(cindex, cstart, 3, cindex); /*lies interior of Face. Extract the two coarse Edge (y_Edge ijk & (i,j-1,k). */ hypre_SStructGridFindBoxManEntry(cgrid_edge, part, cindex, t, &entry); hypre_SStructBoxManEntryGetGlobalRank(entry, cindex, &rank, matrix_type); jedge_Edge[k] = rank; vals_edgeEdge[k] = (HYPRE_Real) p / (rfactor[0] * rfactor[1]); k++; hypre_SubtractIndexes(cindex, jshift, 3, var_index); hypre_SStructGridFindBoxManEntry(cgrid_edge, part, var_index, t, &entry); hypre_SStructBoxManEntryGetGlobalRank(entry, var_index, &rank, matrix_type); jedge_Edge[k] = rank; vals_edgeEdge[k] = (HYPRE_Real) (rfactor[1] - p) / (rfactor[0] * rfactor[1]); k++; } /* for (n= 0; n< rfactor[0]; n++) */ } /* for (p= 1; p< rfactor[1]; p++) */ } hypre_SerialBoxLoop1End(r); } /* hypre_ForBoxI(i, fboxes) */ break; } case 5: { /* 3-d x_edge, must be interior */ hypre_ForBoxI(i, fboxes) { cellbox = hypre_BoxArrayBox(fboxes, i); vbox = hypre_BoxArrayBox(box_array, i); hypre_CopyIndex(Edge_cstarts[part][i], cstart); /* adjust the project cellbox to the variable box */ hypre_CopyBox(cellbox, ©_box); hypre_SubtractIndexes(hypre_BoxIMin(©_box), varoffsets[var], 3, hypre_BoxIMin(©_box)); /*hypre_IntersectBoxes(©_box, vbox, ©_box);*/ hypre_BoxGetSize(©_box, loop_size); hypre_StructMapFineToCoarse(loop_size, zero_index, rfactor, loop_size); hypre_CopyIndex(hypre_BoxIMin(©_box), start); hypre_SerialBoxLoop1Begin(ndim, loop_size, ©_box, start, rfactor, r); { zypre_BoxLoopGetIndex(lindex); hypre_SetIndex3(findex, lindex[0], lindex[1], lindex[2]); /***************************************************** * Where the fine edge lies wrt the coarse edge: * Since we stride by rfactor, lindex is * the coarse index. No coarsening needed, i.e., * cindex= findex. * * Loop over the interior fine edges in an agglomerate. *****************************************************/ for (p = 1; p < rfactor[2]; p++) { for (n = 1; n < rfactor[1]; n++) { for (m = 0; m < rfactor[0]; m++) { hypre_CopyIndex(findex, cindex); hypre_AddIndexes(cindex, cstart, 3, cindex); /*********************************************** * Interior. * x_Edge ijk, (i,j-1,k), (i,j-1,k-1), (i,j,k-1) ***********************************************/ hypre_SStructGridFindBoxManEntry(cgrid_edge, part, cindex, t, &entry); hypre_SStructBoxManEntryGetGlobalRank(entry, cindex, &rank, matrix_type); jedge_Edge[k] = rank; vals_edgeEdge[k] = (HYPRE_Real) p * n / (rfactor[0] * rfactor[1] * rfactor[2]); k++; hypre_SubtractIndexes(cindex, jshift, 3, var_index); hypre_SStructGridFindBoxManEntry(cgrid_edge, part, var_index, t, &entry); hypre_SStructBoxManEntryGetGlobalRank(entry, var_index, &rank, matrix_type); jedge_Edge[k] = rank; vals_edgeEdge[k] = (HYPRE_Real) p * (rfactor[1] - n) / (rfactor[0] * rfactor[1] * rfactor[2]); k++; hypre_SubtractIndexes(var_index, kshift, 3, var_index); hypre_SStructGridFindBoxManEntry(cgrid_edge, part, var_index, t, &entry); hypre_SStructBoxManEntryGetGlobalRank(entry, var_index, &rank, matrix_type); jedge_Edge[k] = rank; vals_edgeEdge[k] = (HYPRE_Real) (rfactor[1] - n) * (rfactor[2] - p) / (rfactor[0] * rfactor[1] * rfactor[2]); k++; hypre_AddIndexes(var_index, jshift, 3, var_index); hypre_SStructGridFindBoxManEntry(cgrid_edge, part, var_index, t, &entry); hypre_SStructBoxManEntryGetGlobalRank(entry, var_index, &rank, matrix_type); jedge_Edge[k] = rank; vals_edgeEdge[k] = (HYPRE_Real) n * (rfactor[2] - p) / (rfactor[0] * rfactor[1] * rfactor[2]); k++; } /* for (m= 0; m< rfactor[0]; m++) */ } /* for (n= 1; n< rfactor[1]; n++) */ } /* for (p= 1; p< rfactor[2]; p++) */ } hypre_SerialBoxLoop1End(r); } /* hypre_ForBoxI(i, fboxes) */ break; } case 6: { /* 3-d y_edge, must be interior */ hypre_ForBoxI(i, fboxes) { cellbox = hypre_BoxArrayBox(fboxes, i); vbox = hypre_BoxArrayBox(box_array, i); hypre_CopyIndex(Edge_cstarts[part][i], cstart); /* adjust the project cellbox to the variable box */ hypre_CopyBox(cellbox, ©_box); hypre_SubtractIndexes(hypre_BoxIMin(©_box), varoffsets[var], 3, hypre_BoxIMin(©_box)); /*hypre_IntersectBoxes(©_box, vbox, ©_box);*/ hypre_BoxGetSize(©_box, loop_size); hypre_StructMapFineToCoarse(loop_size, zero_index, rfactor, loop_size); hypre_CopyIndex(hypre_BoxIMin(©_box), start); hypre_SerialBoxLoop1Begin(ndim, loop_size, ©_box, start, rfactor, r); { zypre_BoxLoopGetIndex(lindex); hypre_SetIndex3(findex, lindex[0], lindex[1], lindex[2]); /***************************************************** * Where the fine edge lies wrt the coarse edge: * Since we stride by rfactor, lindex is * the coarse index. No coarsening needed, i.e., * cindex= findex. * * Loop over the interior fine edges in an agglomerate. *****************************************************/ for (p = 1; p < rfactor[2]; p++) { for (n = 1; n < rfactor[0]; n++) { for (m = 0; m < rfactor[1]; m++) { hypre_CopyIndex(findex, cindex); hypre_AddIndexes(cindex, cstart, 3, cindex); /*********************************************** * Interior. * y_Edge ijk, (i-1,j,k), (i-1,j,k-1), (i,j,k-1) ***********************************************/ hypre_SStructGridFindBoxManEntry(cgrid_edge, part, cindex, t, &entry); hypre_SStructBoxManEntryGetGlobalRank(entry, cindex, &rank, matrix_type); jedge_Edge[k] = rank; vals_edgeEdge[k] = (HYPRE_Real) p * n / (rfactor[0] * rfactor[1] * rfactor[2]); k++; hypre_SubtractIndexes(cindex, ishift, 3, var_index); hypre_SStructGridFindBoxManEntry(cgrid_edge, part, var_index, t, &entry); hypre_SStructBoxManEntryGetGlobalRank(entry, var_index, &rank, matrix_type); jedge_Edge[k] = rank; vals_edgeEdge[k] = (HYPRE_Real) p * (rfactor[0] - n) / (rfactor[0] * rfactor[1] * rfactor[2]); k++; hypre_SubtractIndexes(var_index, kshift, 3, var_index); hypre_SStructGridFindBoxManEntry(cgrid_edge, part, var_index, t, &entry); hypre_SStructBoxManEntryGetGlobalRank(entry, var_index, &rank, matrix_type); jedge_Edge[k] = rank; vals_edgeEdge[k] = (HYPRE_Real) (rfactor[0] - n) * (rfactor[2] - p) / (rfactor[0] * rfactor[1] * rfactor[2]); k++; hypre_AddIndexes(var_index, ishift, 3, var_index); hypre_SStructGridFindBoxManEntry(cgrid_edge, part, var_index, t, &entry); hypre_SStructBoxManEntryGetGlobalRank(entry, var_index, &rank, matrix_type); jedge_Edge[k] = rank; vals_edgeEdge[k] = (HYPRE_Real) n * (rfactor[2] - p) / (rfactor[0] * rfactor[1] * rfactor[2]); k++; } /* for (m= 0; m< rfactor[1]; m++) */ } /* for (n= 1; n< rfactor[0]; n++) */ } /* for (p= 1; p< rfactor[2]; p++) */ } hypre_SerialBoxLoop1End(r); } /* hypre_ForBoxI(i, fboxes) */ break; } case 7: { /* 3-d z_edge, only the interior */ hypre_ForBoxI(i, fboxes) { cellbox = hypre_BoxArrayBox(fboxes, i); vbox = hypre_BoxArrayBox(box_array, i); hypre_CopyIndex(Edge_cstarts[part][i], cstart); /* adjust the project cellbox to the variable box */ hypre_CopyBox(cellbox, ©_box); hypre_SubtractIndexes(hypre_BoxIMin(©_box), varoffsets[var], 3, hypre_BoxIMin(©_box)); /*hypre_IntersectBoxes(©_box, vbox, ©_box);*/ hypre_BoxGetSize(©_box, loop_size); hypre_StructMapFineToCoarse(loop_size, zero_index, rfactor, loop_size); hypre_CopyIndex(hypre_BoxIMin(©_box), start); hypre_SerialBoxLoop1Begin(ndim, loop_size, ©_box, start, rfactor, r); { zypre_BoxLoopGetIndex(lindex); hypre_SetIndex3(findex, lindex[0], lindex[1], lindex[2]); /***************************************************** * Where the fine edge lies wrt the coarse edge: * Since we stride by rfactor, lindex is * the coarse index. No coarsening needed, i.e., * cindex= findex. * * Loop over the interior fine edges in an agglomerate. *****************************************************/ for (p = 1; p < rfactor[1]; p++) { for (n = 1; n < rfactor[0]; n++) { for (m = 0; m < rfactor[2]; m++) { hypre_CopyIndex(findex, cindex); hypre_AddIndexes(cindex, cstart, 3, cindex); /************************************************* * Interior. * z_Edge ijk, (i-1,j,k), (i-1,j-1,k), (i,j-1,k) *************************************************/ hypre_SStructGridFindBoxManEntry(cgrid_edge, part, cindex, t, &entry); hypre_SStructBoxManEntryGetGlobalRank(entry, cindex, &rank, matrix_type); jedge_Edge[k] = rank; vals_edgeEdge[k] = (HYPRE_Real) n * p / (rfactor[0] * rfactor[1] * rfactor[2]); k++; hypre_SubtractIndexes(cindex, ishift, 3, var_index); hypre_SStructGridFindBoxManEntry(cgrid_edge, part, var_index, t, &entry); hypre_SStructBoxManEntryGetGlobalRank(entry, var_index, &rank, matrix_type); jedge_Edge[k] = rank; vals_edgeEdge[k] = (HYPRE_Real) p * (rfactor[0] - n) / (rfactor[0] * rfactor[1] * rfactor[2]); k++; hypre_SubtractIndexes(var_index, jshift, 3, var_index); hypre_SStructGridFindBoxManEntry(cgrid_edge, part, var_index, t, &entry); hypre_SStructBoxManEntryGetGlobalRank(entry, var_index, &rank, matrix_type); jedge_Edge[k] = rank; vals_edgeEdge[k] = (HYPRE_Real) (rfactor[1] - p) * (rfactor[0] - n) / (rfactor[0] * rfactor[1] * rfactor[2]); k++; hypre_AddIndexes(var_index, ishift, 3, var_index); hypre_SStructGridFindBoxManEntry(cgrid_edge, part, var_index, t, &entry); hypre_SStructBoxManEntryGetGlobalRank(entry, var_index, &rank, matrix_type); jedge_Edge[k] = rank; vals_edgeEdge[k] = (HYPRE_Real) n * (rfactor[1] - p) / (rfactor[0] * rfactor[1] * rfactor[2]); k++; } /* for (m= 0; m< rfactor[2]; m++) */ } /* for (n= 1; n< rfactor[0]; n++) */ } /* for (p= 1; p< rfactor[1]; p++) */ } hypre_SerialBoxLoop1End(r); } /* hypre_ForBoxI(i, fboxes) */ break; } } /* switch */ } /* for (t= 0; t< Edge_nvars; t++) */ } /* for (part= 0; part< nparts; part++) */ HYPRE_IJMatrixSetValues(edge_Edge, size, ncols_edgeEdge, (const HYPRE_BigInt*) iedgeEdge, (const HYPRE_BigInt*) jedge_Edge, (const HYPRE_Real*) vals_edgeEdge); HYPRE_IJMatrixAssemble((HYPRE_IJMatrix) edge_Edge); hypre_TFree(ncols_edgeEdge, HYPRE_MEMORY_HOST); hypre_TFree(iedgeEdge, HYPRE_MEMORY_HOST); hypre_TFree(jedge_Edge, HYPRE_MEMORY_HOST); hypre_TFree(vals_edgeEdge, HYPRE_MEMORY_HOST); hypre_TFree(varoffsets, HYPRE_MEMORY_HOST); hypre_TFree(vartype_map, HYPRE_MEMORY_HOST); /* n_CtoVbox[part][cellboxi][var] & CtoVboxnums[part][cellboxi][var][nvboxes] */ for (part = 0; part < nparts; part++) { p_fgrid = hypre_SStructGridPGrid(fgrid_edge, part); Edge_nvars = hypre_SStructPGridNVars(p_fgrid); var_fgrid = hypre_SStructPGridCellSGrid(p_fgrid); fboxes = hypre_StructGridBoxes(var_fgrid); hypre_ForBoxI(j, fboxes) { for (t = 0; t < Edge_nvars; t++) { hypre_TFree(CtoVboxnums[part][j][t], HYPRE_MEMORY_HOST); } hypre_TFree(n_CtoVbox[part][j], HYPRE_MEMORY_HOST); hypre_TFree(CtoVboxnums[part][j], HYPRE_MEMORY_HOST); } hypre_TFree(n_CtoVbox[part], HYPRE_MEMORY_HOST); hypre_TFree(CtoVboxnums[part], HYPRE_MEMORY_HOST); } hypre_TFree(n_CtoVbox, HYPRE_MEMORY_HOST); hypre_TFree(CtoVboxnums, HYPRE_MEMORY_HOST); for (part = 0; part < nparts; part++) { hypre_BoxArrayDestroy(contract_fedgeBoxes[part]); hypre_TFree(Edge_cstarts[part], HYPRE_MEMORY_HOST); hypre_TFree(upper_shifts[part], HYPRE_MEMORY_HOST); hypre_TFree(lower_shifts[part], HYPRE_MEMORY_HOST); hypre_TFree(cfbox_mapping[part], HYPRE_MEMORY_HOST); hypre_TFree(fcbox_mapping[part], HYPRE_MEMORY_HOST); hypre_TFree(upper_ranks[part], HYPRE_MEMORY_HOST); hypre_TFree(lower_ranks[part], HYPRE_MEMORY_HOST); } hypre_TFree(contract_fedgeBoxes, HYPRE_MEMORY_HOST); hypre_TFree(Edge_cstarts, HYPRE_MEMORY_HOST); hypre_TFree(upper_shifts, HYPRE_MEMORY_HOST); hypre_TFree(lower_shifts, HYPRE_MEMORY_HOST); hypre_TFree(cfbox_mapping, HYPRE_MEMORY_HOST); hypre_TFree(fcbox_mapping, HYPRE_MEMORY_HOST); hypre_TFree(upper_ranks, HYPRE_MEMORY_HOST); hypre_TFree(lower_ranks, HYPRE_MEMORY_HOST); return (hypre_IJMatrix *) edge_Edge; } hypre-2.33.0/src/sstruct_ls/maxwell_PNedelec_bdy.c000066400000000000000000000445721477326011500221560ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "_hypre_sstruct_ls.h" /*-------------------------------------------------------------------------- * Finds the boundary boxes for all var_grids in pgrid. Use the cell grid * to determine the boundary. * bdry[n_cellboxes, nvars+1]= boxarrayarray ptr.: hypre_BoxArrayArray ***bdry. * bdry[n_cellboxes, 0] is the cell-centred box. * Each box_arrayarray: for each variable, there are a max of 2*(ndim-1) * box_arrays (e.g., in 3d, the x_edges on the boundary can be the two * z_faces & the two y_faces of the boundary). Each of these box_arrays * consists of boxes that can be on the boundary. *--------------------------------------------------------------------------*/ HYPRE_Int hypre_Maxwell_PNedelec_Bdy( hypre_StructGrid *cell_grid, hypre_SStructPGrid *pgrid, hypre_BoxArrayArray ****bdry_ptr ) { HYPRE_Int ierr = 0; HYPRE_Int nvars = hypre_SStructPGridNVars(pgrid); hypre_BoxArrayArray *cellgrid_bdry; hypre_BoxArrayArray ***bdry; hypre_BoxArray *box_array, *box_array2; hypre_BoxArray *cell_boxes; hypre_Box *box, *bdy_box, *shifted_box; HYPRE_Int ndim = hypre_SStructPGridNDim(pgrid); HYPRE_SStructVariable *vartypes = hypre_SStructPGridVarTypes(pgrid); hypre_Index varoffset, ishift, jshift, kshift; hypre_Index lower, upper; HYPRE_Int *flag; HYPRE_Int i, j, k, t, nboxes, bdy; hypre_SetIndex3(ishift, 1, 0, 0); hypre_SetIndex3(jshift, 0, 1, 0); hypre_SetIndex3(kshift, 0, 0, 1); cell_boxes = hypre_StructGridBoxes(cell_grid); nboxes = hypre_BoxArraySize(cell_boxes); bdry = hypre_TAlloc(hypre_BoxArrayArray **, nboxes, HYPRE_MEMORY_HOST); shifted_box = hypre_BoxCreate(ndim); hypre_ForBoxI(j, cell_boxes) { box = hypre_BoxArrayBox(cell_boxes, j); /* find the cellgrid boundaries of box if there are any. */ cellgrid_bdry = hypre_BoxArrayArrayCreate(2 * ndim, ndim); flag = hypre_CTAlloc(HYPRE_Int, 2 * ndim, HYPRE_MEMORY_HOST); bdy = 0; for (i = 0; i < ndim; i++) { hypre_BoxBoundaryDG(box, cell_grid, hypre_BoxArrayArrayBoxArray(cellgrid_bdry, 2 * i), hypre_BoxArrayArrayBoxArray(cellgrid_bdry, 2 * i + 1), i); if (hypre_BoxArraySize(hypre_BoxArrayArrayBoxArray(cellgrid_bdry, 2 * i))) { flag[2 * i] = 1; bdy++; } if (hypre_BoxArraySize(hypre_BoxArrayArrayBoxArray(cellgrid_bdry, 2 * i + 1))) { flag[2 * i + 1] = 1; bdy++; } } /* There are boundary boxes. Every variable of pgrid will have some */ if (bdy) { bdry[j] = hypre_TAlloc(hypre_BoxArrayArray *, nvars + 1, HYPRE_MEMORY_HOST); /* keep the cell-centred boxarrayarray of boundaries */ bdry[j][0] = hypre_BoxArrayArrayDuplicate(cellgrid_bdry); k = 2 * (ndim - 1); /* 3-d requires 4 boundary faces to be checked */ for (i = 0; i < nvars; i++) { bdry[j][i + 1] = hypre_BoxArrayArrayCreate(k, ndim); /* one for +/- directions */ } for (i = 0; i < nvars; i++) { t = vartypes[i]; hypre_SStructVariableGetOffset(vartypes[i], ndim, varoffset); switch (t) { case 2: /* xface, boundary i= lower, upper */ { if (flag[0]) /* boundary i= lower */ { box_array = hypre_BoxArrayArrayBoxArray(cellgrid_bdry, 0); box_array2 = hypre_BoxArrayArrayBoxArray(bdry[j][i + 1], 0); hypre_ForBoxI(k, box_array) { bdy_box = hypre_BoxArrayBox(box_array, k); /* bdry boxes */ hypre_CopyIndex(hypre_BoxIMin(bdy_box), lower); hypre_CopyIndex(hypre_BoxIMax(bdy_box), upper); hypre_SubtractIndexes(lower, varoffset, ndim, lower); hypre_SubtractIndexes(upper, varoffset, ndim, upper); hypre_BoxSetExtents(shifted_box, lower, upper); hypre_AppendBox(shifted_box, box_array2); } } if (flag[1]) /* boundary i= upper */ { box_array = hypre_BoxArrayArrayBoxArray(cellgrid_bdry, 1); box_array2 = hypre_BoxArrayArrayBoxArray(bdry[j][i + 1], 1); hypre_ForBoxI(k, box_array) { bdy_box = hypre_BoxArrayBox(box_array, k); /* bdry boxes */ hypre_CopyIndex(hypre_BoxIMin(bdy_box), lower); hypre_CopyIndex(hypre_BoxIMax(bdy_box), upper); hypre_BoxSetExtents(shifted_box, lower, upper); hypre_AppendBox(shifted_box, box_array2); } } break; } case 3: /* yface, boundary j= lower, upper */ { if (flag[2]) /* boundary j= lower */ { box_array = hypre_BoxArrayArrayBoxArray(cellgrid_bdry, 2); box_array2 = hypre_BoxArrayArrayBoxArray(bdry[j][i + 1], 0); hypre_ForBoxI(k, box_array) { bdy_box = hypre_BoxArrayBox(box_array, k); /* bdry boxes */ hypre_CopyIndex(hypre_BoxIMin(bdy_box), lower); hypre_CopyIndex(hypre_BoxIMax(bdy_box), upper); hypre_SubtractIndexes(lower, varoffset, ndim, lower); hypre_SubtractIndexes(upper, varoffset, ndim, upper); hypre_BoxSetExtents(shifted_box, lower, upper); hypre_AppendBox(shifted_box, box_array2); } } if (flag[3]) /* boundary j= upper */ { box_array = hypre_BoxArrayArrayBoxArray(cellgrid_bdry, 3); box_array2 = hypre_BoxArrayArrayBoxArray(bdry[j][i + 1], 1); hypre_ForBoxI(k, box_array) { bdy_box = hypre_BoxArrayBox(box_array, k); /* bdry boxes */ hypre_CopyIndex(hypre_BoxIMin(bdy_box), lower); hypre_CopyIndex(hypre_BoxIMax(bdy_box), upper); hypre_BoxSetExtents(shifted_box, lower, upper); hypre_AppendBox(shifted_box, box_array2); } } break; } case 5: /* xedge, boundary z_faces & y_faces */ { if (flag[4]) /* boundary k= lower zface*/ { box_array = hypre_BoxArrayArrayBoxArray(cellgrid_bdry, 4); box_array2 = hypre_BoxArrayArrayBoxArray(bdry[j][i + 1], 0); hypre_ForBoxI(k, box_array) { bdy_box = hypre_BoxArrayBox(box_array, k); /* bdry boxes */ hypre_CopyIndex(hypre_BoxIMin(bdy_box), lower); hypre_CopyIndex(hypre_BoxIMax(bdy_box), upper); hypre_SubtractIndexes(lower, varoffset, ndim, lower); hypre_SubtractIndexes(upper, kshift, ndim, upper); hypre_BoxSetExtents(shifted_box, lower, upper); hypre_AppendBox(shifted_box, box_array2); } } if (flag[5]) /* boundary k= upper zface*/ { box_array = hypre_BoxArrayArrayBoxArray(cellgrid_bdry, 5); box_array2 = hypre_BoxArrayArrayBoxArray(bdry[j][i + 1], 1); hypre_ForBoxI(k, box_array) { bdy_box = hypre_BoxArrayBox(box_array, k); /* bdry boxes */ hypre_CopyIndex(hypre_BoxIMin(bdy_box), lower); hypre_CopyIndex(hypre_BoxIMax(bdy_box), upper); hypre_SubtractIndexes(lower, jshift, ndim, lower); hypre_BoxSetExtents(shifted_box, lower, upper); hypre_AppendBox(shifted_box, box_array2); } } if (flag[2]) /* boundary j= lower yface*/ { box_array = hypre_BoxArrayArrayBoxArray(cellgrid_bdry, 2); box_array2 = hypre_BoxArrayArrayBoxArray(bdry[j][i + 1], 2); hypre_ForBoxI(k, box_array) { bdy_box = hypre_BoxArrayBox(box_array, k); /* bdry boxes */ hypre_CopyIndex(hypre_BoxIMin(bdy_box), lower); hypre_CopyIndex(hypre_BoxIMax(bdy_box), upper); hypre_SubtractIndexes(lower, varoffset, ndim, lower); hypre_SubtractIndexes(upper, jshift, ndim, upper); hypre_BoxSetExtents(shifted_box, lower, upper); hypre_AppendBox(shifted_box, box_array2); } } if (flag[3]) /* boundary j= upper yface*/ { box_array = hypre_BoxArrayArrayBoxArray(cellgrid_bdry, 3); box_array2 = hypre_BoxArrayArrayBoxArray(bdry[j][i + 1], 3); hypre_ForBoxI(k, box_array) { bdy_box = hypre_BoxArrayBox(box_array, k); /* bdry boxes */ hypre_CopyIndex(hypre_BoxIMin(bdy_box), lower); hypre_CopyIndex(hypre_BoxIMax(bdy_box), upper); hypre_SubtractIndexes(lower, kshift, ndim, lower); hypre_BoxSetExtents(shifted_box, lower, upper); hypre_AppendBox(shifted_box, box_array2); } } break; } case 6: /* yedge, boundary z_faces & x_faces */ { if (flag[4]) /* boundary k= lower zface*/ { box_array = hypre_BoxArrayArrayBoxArray(cellgrid_bdry, 4); box_array2 = hypre_BoxArrayArrayBoxArray(bdry[j][i + 1], 0); hypre_ForBoxI(k, box_array) { bdy_box = hypre_BoxArrayBox(box_array, k); /* bdry boxes */ hypre_CopyIndex(hypre_BoxIMin(bdy_box), lower); hypre_CopyIndex(hypre_BoxIMax(bdy_box), upper); hypre_SubtractIndexes(lower, varoffset, ndim, lower); hypre_SubtractIndexes(upper, kshift, ndim, upper); hypre_BoxSetExtents(shifted_box, lower, upper); hypre_AppendBox(shifted_box, box_array2); } } if (flag[5]) /* boundary k= upper zface*/ { box_array = hypre_BoxArrayArrayBoxArray(cellgrid_bdry, 5); box_array2 = hypre_BoxArrayArrayBoxArray(bdry[j][i + 1], 1); hypre_ForBoxI(k, box_array) { bdy_box = hypre_BoxArrayBox(box_array, k); /* bdry boxes */ hypre_CopyIndex(hypre_BoxIMin(bdy_box), lower); hypre_CopyIndex(hypre_BoxIMax(bdy_box), upper); hypre_SubtractIndexes(lower, ishift, ndim, lower); hypre_BoxSetExtents(shifted_box, lower, upper); hypre_AppendBox(shifted_box, box_array2); } } if (flag[0]) /* boundary i= lower xface*/ { box_array = hypre_BoxArrayArrayBoxArray(cellgrid_bdry, 0); box_array2 = hypre_BoxArrayArrayBoxArray(bdry[j][i + 1], 2); hypre_ForBoxI(k, box_array) { bdy_box = hypre_BoxArrayBox(box_array, k); /* bdry boxes */ hypre_CopyIndex(hypre_BoxIMin(bdy_box), lower); hypre_CopyIndex(hypre_BoxIMax(bdy_box), upper); hypre_SubtractIndexes(lower, varoffset, ndim, lower); hypre_SubtractIndexes(upper, ishift, ndim, upper); hypre_BoxSetExtents(shifted_box, lower, upper); hypre_AppendBox(shifted_box, box_array2); } } if (flag[1]) /* boundary i= upper xface*/ { box_array = hypre_BoxArrayArrayBoxArray(cellgrid_bdry, 1); box_array2 = hypre_BoxArrayArrayBoxArray(bdry[j][i + 1], 3); hypre_ForBoxI(k, box_array) { bdy_box = hypre_BoxArrayBox(box_array, k); /* bdry boxes */ hypre_CopyIndex(hypre_BoxIMin(bdy_box), lower); hypre_CopyIndex(hypre_BoxIMax(bdy_box), upper); hypre_SubtractIndexes(lower, kshift, ndim, lower); hypre_BoxSetExtents(shifted_box, lower, upper); hypre_AppendBox(shifted_box, box_array2); } } break; } case 7: /* zedge, boundary y_faces & x_faces */ { if (flag[2]) /* boundary j= lower yface*/ { box_array = hypre_BoxArrayArrayBoxArray(cellgrid_bdry, 2); box_array2 = hypre_BoxArrayArrayBoxArray(bdry[j][i + 1], 0); hypre_ForBoxI(k, box_array) { bdy_box = hypre_BoxArrayBox(box_array, k); /* bdry boxes */ hypre_CopyIndex(hypre_BoxIMin(bdy_box), lower); hypre_CopyIndex(hypre_BoxIMax(bdy_box), upper); hypre_SubtractIndexes(lower, varoffset, ndim, lower); hypre_SubtractIndexes(upper, jshift, ndim, upper); hypre_BoxSetExtents(shifted_box, lower, upper); hypre_AppendBox(shifted_box, box_array2); } } if (flag[3]) /* boundary j= upper yface*/ { box_array = hypre_BoxArrayArrayBoxArray(cellgrid_bdry, 3); box_array2 = hypre_BoxArrayArrayBoxArray(bdry[j][i + 1], 1); hypre_ForBoxI(k, box_array) { bdy_box = hypre_BoxArrayBox(box_array, k); /* bdry boxes */ hypre_CopyIndex(hypre_BoxIMin(bdy_box), lower); hypre_CopyIndex(hypre_BoxIMax(bdy_box), upper); hypre_SubtractIndexes(lower, ishift, ndim, lower); hypre_BoxSetExtents(shifted_box, lower, upper); hypre_AppendBox(shifted_box, box_array2); } } if (flag[0]) /* boundary i= lower xface*/ { box_array = hypre_BoxArrayArrayBoxArray(cellgrid_bdry, 0); box_array2 = hypre_BoxArrayArrayBoxArray(bdry[j][i + 1], 2); hypre_ForBoxI(k, box_array) { bdy_box = hypre_BoxArrayBox(box_array, k); /* bdry boxes */ hypre_CopyIndex(hypre_BoxIMin(bdy_box), lower); hypre_CopyIndex(hypre_BoxIMax(bdy_box), upper); hypre_SubtractIndexes(lower, varoffset, ndim, lower); hypre_SubtractIndexes(upper, ishift, ndim, upper); hypre_BoxSetExtents(shifted_box, lower, upper); hypre_AppendBox(shifted_box, box_array2); } } if (flag[1]) /* boundary i= upper xface*/ { box_array = hypre_BoxArrayArrayBoxArray(cellgrid_bdry, 1); box_array2 = hypre_BoxArrayArrayBoxArray(bdry[j][i + 1], 3); hypre_ForBoxI(k, box_array) { bdy_box = hypre_BoxArrayBox(box_array, k); /* bdry boxes */ hypre_CopyIndex(hypre_BoxIMin(bdy_box), lower); hypre_CopyIndex(hypre_BoxIMax(bdy_box), upper); hypre_SubtractIndexes(lower, jshift, ndim, lower); hypre_BoxSetExtents(shifted_box, lower, upper); hypre_AppendBox(shifted_box, box_array2); } } break; } } /* switch(t) */ } /* for (i= 0; i< nvars; i++) */ } /* if (bdy) */ else { /* make an empty ptr of boxarrayarrays to avoid memory leaks when destroying bdry later. */ bdry[j] = hypre_TAlloc(hypre_BoxArrayArray *, nvars + 1, HYPRE_MEMORY_HOST); for (i = 0; i < nvars + 1; i++) { bdry[j][i] = hypre_BoxArrayArrayCreate(0, ndim); } } hypre_BoxArrayArrayDestroy(cellgrid_bdry); hypre_TFree(flag, HYPRE_MEMORY_HOST); } /* hypre_ForBoxI(j, cell_boxes) */ hypre_BoxDestroy(shifted_box); *bdry_ptr = bdry; return ierr; } hypre-2.33.0/src/sstruct_ls/maxwell_PTopology.h000066400000000000000000000011021477326011500215600ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ typedef struct { hypre_IJMatrix *Face_iedge; hypre_IJMatrix *Element_iedge; hypre_IJMatrix *Edge_iedge; hypre_IJMatrix *Element_Face; hypre_IJMatrix *Element_Edge; } hypre_PTopology; hypre-2.33.0/src/sstruct_ls/maxwell_TV.c000066400000000000000000000326121477326011500201620ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "_hypre_sstruct_ls.h" #include "maxwell_TV.h" /*-------------------------------------------------------------------------- * hypre_MaxwellTVCreate *--------------------------------------------------------------------------*/ void * hypre_MaxwellTVCreate( MPI_Comm comm ) { hypre_MaxwellData *maxwell_data; hypre_Index *maxwell_rfactor; maxwell_data = hypre_CTAlloc(hypre_MaxwellData, 1, HYPRE_MEMORY_HOST); (maxwell_data -> comm) = comm; (maxwell_data -> time_index) = hypre_InitializeTiming("Maxwell_Solver"); /* set defaults */ (maxwell_data -> tol) = 1.0e-06; (maxwell_data -> max_iter) = 200; (maxwell_data -> rel_change) = 0; (maxwell_data -> zero_guess) = 0; (maxwell_data -> num_pre_relax) = 1; (maxwell_data -> num_post_relax) = 1; (maxwell_data -> constant_coef) = 0; (maxwell_data -> print_level) = 0; (maxwell_data -> logging) = 0; maxwell_rfactor = hypre_TAlloc(hypre_Index, 1, HYPRE_MEMORY_HOST); hypre_SetIndex3(maxwell_rfactor[0], 2, 2, 2); (maxwell_data -> rfactor) = maxwell_rfactor; return (void *) maxwell_data; } /*-------------------------------------------------------------------------- * hypre_MaxwellTVDestroy *--------------------------------------------------------------------------*/ HYPRE_Int hypre_MaxwellTVDestroy( void *maxwell_vdata ) { hypre_MaxwellData *maxwell_data = (hypre_MaxwellData *)maxwell_vdata; HYPRE_Int l; HYPRE_Int ierr = 0; if (maxwell_data) { hypre_TFree(maxwell_data-> rfactor, HYPRE_MEMORY_HOST); if ((maxwell_data -> logging) > 0) { hypre_TFree(maxwell_data -> norms, HYPRE_MEMORY_HOST); hypre_TFree(maxwell_data -> rel_norms, HYPRE_MEMORY_HOST); } if ((maxwell_data -> edge_numlevels) > 0) { for (l = 0; l < (maxwell_data-> edge_numlevels); l++) { HYPRE_SStructGridDestroy(maxwell_data-> egrid_l[l]); hypre_ParVectorDestroy(maxwell_data-> rese_l[l]); hypre_ParVectorDestroy(maxwell_data-> ee_l[l]); hypre_ParVectorDestroy(maxwell_data-> eVtemp_l[l]); hypre_ParVectorDestroy(maxwell_data-> eVtemp2_l[l]); hypre_TFree(maxwell_data -> eCF_marker_l[l], HYPRE_MEMORY_HOST); /* Cannot destroy Aee_l[0] since it points to the user Aee_in. */ if (l) { hypre_ParCSRMatrixDestroy(maxwell_data-> Aee_l[l]); hypre_ParVectorDestroy(maxwell_data-> be_l[l]); hypre_ParVectorDestroy(maxwell_data-> xe_l[l]); } if (l < (maxwell_data-> edge_numlevels) - 1) { HYPRE_IJMatrixDestroy( (HYPRE_IJMatrix) (maxwell_data-> Pe_l[l])); } hypre_TFree(maxwell_data-> BdryRanks_l[l], HYPRE_MEMORY_HOST); } hypre_TFree(maxwell_data-> egrid_l, HYPRE_MEMORY_HOST); hypre_TFree(maxwell_data-> Aee_l, HYPRE_MEMORY_HOST); hypre_TFree(maxwell_data-> be_l, HYPRE_MEMORY_HOST); hypre_TFree(maxwell_data-> xe_l, HYPRE_MEMORY_HOST); hypre_TFree(maxwell_data-> rese_l, HYPRE_MEMORY_HOST); hypre_TFree(maxwell_data-> ee_l, HYPRE_MEMORY_HOST); hypre_TFree(maxwell_data-> eVtemp_l, HYPRE_MEMORY_HOST); hypre_TFree(maxwell_data-> eVtemp2_l, HYPRE_MEMORY_HOST); hypre_TFree(maxwell_data-> Pe_l, HYPRE_MEMORY_HOST); hypre_TFree(maxwell_data-> ReT_l, HYPRE_MEMORY_HOST); hypre_TFree(maxwell_data-> eCF_marker_l, HYPRE_MEMORY_HOST); hypre_TFree(maxwell_data-> erelax_weight, HYPRE_MEMORY_HOST); hypre_TFree(maxwell_data-> eomega, HYPRE_MEMORY_HOST); hypre_TFree(maxwell_data-> BdryRanks_l, HYPRE_MEMORY_HOST); hypre_TFree(maxwell_data-> BdryRanksCnts_l, HYPRE_MEMORY_HOST); } if ((maxwell_data -> node_numlevels) > 0) { for (l = 0; l < (maxwell_data-> node_numlevels); l++) { hypre_ParVectorDestroy(maxwell_data-> resn_l[l]); hypre_ParVectorDestroy(maxwell_data-> en_l[l]); hypre_ParVectorDestroy(maxwell_data-> nVtemp_l[l]); hypre_ParVectorDestroy(maxwell_data-> nVtemp2_l[l]); } hypre_BoomerAMGDestroy(maxwell_data-> amg_vdata); hypre_TFree(maxwell_data-> Ann_l, HYPRE_MEMORY_HOST); hypre_TFree(maxwell_data-> Pn_l, HYPRE_MEMORY_HOST); hypre_TFree(maxwell_data-> RnT_l, HYPRE_MEMORY_HOST); hypre_TFree(maxwell_data-> bn_l, HYPRE_MEMORY_HOST); hypre_TFree(maxwell_data-> xn_l, HYPRE_MEMORY_HOST); hypre_TFree(maxwell_data-> resn_l, HYPRE_MEMORY_HOST); hypre_TFree(maxwell_data-> en_l, HYPRE_MEMORY_HOST); hypre_TFree(maxwell_data-> nVtemp_l, HYPRE_MEMORY_HOST); hypre_TFree(maxwell_data-> nVtemp2_l, HYPRE_MEMORY_HOST); hypre_TFree(maxwell_data-> nCF_marker_l, HYPRE_MEMORY_HOST); hypre_TFree(maxwell_data-> nrelax_weight, HYPRE_MEMORY_HOST); hypre_TFree(maxwell_data-> nomega, HYPRE_MEMORY_HOST); } HYPRE_SStructStencilDestroy(maxwell_data-> Ann_stencils[0]); hypre_TFree(maxwell_data-> Ann_stencils, HYPRE_MEMORY_HOST); if ((maxwell_data -> en_numlevels) > 0) { for (l = 1; l < (maxwell_data-> en_numlevels); l++) { hypre_ParCSRMatrixDestroy(maxwell_data-> Aen_l[l]); } } hypre_TFree(maxwell_data-> Aen_l, HYPRE_MEMORY_HOST); HYPRE_SStructVectorDestroy( (HYPRE_SStructVector) maxwell_data-> bn); HYPRE_SStructVectorDestroy( (HYPRE_SStructVector) maxwell_data-> xn); HYPRE_SStructMatrixDestroy( (HYPRE_SStructMatrix) maxwell_data-> Ann); HYPRE_IJMatrixDestroy(maxwell_data-> Aen); hypre_ParCSRMatrixDestroy(maxwell_data-> T_transpose); hypre_FinalizeTiming(maxwell_data -> time_index); hypre_TFree(maxwell_data, HYPRE_MEMORY_HOST); } return (ierr); } /*-------------------------------------------------------------------------- * hypre_MaxwellSetRfactors *--------------------------------------------------------------------------*/ HYPRE_Int hypre_MaxwellSetRfactors(void *maxwell_vdata, HYPRE_Int rfactor[HYPRE_MAXDIM] ) { hypre_MaxwellData *maxwell_data = (hypre_MaxwellData *)maxwell_vdata; hypre_Index *maxwell_rfactor = (maxwell_data -> rfactor); HYPRE_Int ierr = 0; hypre_CopyIndex(rfactor, maxwell_rfactor[0]); return ierr; } /*-------------------------------------------------------------------------- * hypre_MaxwellSetGrad *--------------------------------------------------------------------------*/ HYPRE_Int hypre_MaxwellSetGrad(void *maxwell_vdata, hypre_ParCSRMatrix *T ) { hypre_MaxwellData *maxwell_data = (hypre_MaxwellData *)maxwell_vdata; HYPRE_Int ierr = 0; (maxwell_data -> Tgrad) = T; return ierr; } /*-------------------------------------------------------------------------- * hypre_MaxwellSetConstantCoef *--------------------------------------------------------------------------*/ HYPRE_Int hypre_MaxwellSetConstantCoef( void *maxwell_vdata, HYPRE_Int constant_coef) { hypre_MaxwellData *maxwell_data = (hypre_MaxwellData *)maxwell_vdata; HYPRE_Int ierr = 0; (maxwell_data -> constant_coef) = constant_coef; return ierr; } /*-------------------------------------------------------------------------- * hypre_MaxwellSetTol *--------------------------------------------------------------------------*/ HYPRE_Int hypre_MaxwellSetTol( void *maxwell_vdata, HYPRE_Real tol ) { hypre_MaxwellData *maxwell_data = (hypre_MaxwellData *)maxwell_vdata; HYPRE_Int ierr = 0; (maxwell_data -> tol) = tol; return ierr; } /*-------------------------------------------------------------------------- * hypre_MaxwellSetMaxIter *--------------------------------------------------------------------------*/ HYPRE_Int hypre_MaxwellSetMaxIter( void *maxwell_vdata, HYPRE_Int max_iter ) { hypre_MaxwellData *maxwell_data = (hypre_MaxwellData *)maxwell_vdata; HYPRE_Int ierr = 0; (maxwell_data -> max_iter) = max_iter; return ierr; } /*-------------------------------------------------------------------------- * hypre_MaxwellSetRelChange *--------------------------------------------------------------------------*/ HYPRE_Int hypre_MaxwellSetRelChange( void *maxwell_vdata, HYPRE_Int rel_change ) { hypre_MaxwellData *maxwell_data = (hypre_MaxwellData *)maxwell_vdata; HYPRE_Int ierr = 0; (maxwell_data -> rel_change) = rel_change; return ierr; } /*-------------------------------------------------------------------------- * hypre_MaxwellNumPreRelax *--------------------------------------------------------------------------*/ HYPRE_Int hypre_MaxwellSetNumPreRelax( void *maxwell_vdata, HYPRE_Int num_pre_relax ) { hypre_MaxwellData *maxwell_data = (hypre_MaxwellData *)maxwell_vdata; HYPRE_Int ierr = 0; (maxwell_data -> num_pre_relax) = num_pre_relax; return ierr; } /*-------------------------------------------------------------------------- * hypre_MaxwellSetNumPostRelax *--------------------------------------------------------------------------*/ HYPRE_Int hypre_MaxwellSetNumPostRelax( void *maxwell_vdata, HYPRE_Int num_post_relax ) { hypre_MaxwellData *maxwell_data = (hypre_MaxwellData *)maxwell_vdata; HYPRE_Int ierr = 0; (maxwell_data -> num_post_relax) = num_post_relax; return ierr; } /*-------------------------------------------------------------------------- * hypre_MaxwellGetNumIterations *--------------------------------------------------------------------------*/ HYPRE_Int hypre_MaxwellGetNumIterations( void *maxwell_vdata, HYPRE_Int *num_iterations ) { hypre_MaxwellData *maxwell_data = (hypre_MaxwellData *)maxwell_vdata; HYPRE_Int ierr = 0; *num_iterations = (maxwell_data -> num_iterations); return ierr; } /*-------------------------------------------------------------------------- * hypre_MaxwellSetPrintLevel *--------------------------------------------------------------------------*/ HYPRE_Int hypre_MaxwellSetPrintLevel( void *maxwell_vdata, HYPRE_Int print_level) { hypre_MaxwellData *maxwell_data = (hypre_MaxwellData *)maxwell_vdata; HYPRE_Int ierr = 0; (maxwell_data -> print_level) = print_level; return ierr; } /*-------------------------------------------------------------------------- * hypre_MaxwellSetLogging *--------------------------------------------------------------------------*/ HYPRE_Int hypre_MaxwellSetLogging( void *maxwell_vdata, HYPRE_Int logging) { hypre_MaxwellData *maxwell_data = (hypre_MaxwellData *)maxwell_vdata; HYPRE_Int ierr = 0; (maxwell_data -> logging) = logging; return ierr; } /*-------------------------------------------------------------------------- * hypre_MaxwellPrintLogging *--------------------------------------------------------------------------*/ HYPRE_Int hypre_MaxwellPrintLogging( void *maxwell_vdata, HYPRE_Int myid) { hypre_MaxwellData *maxwell_data = (hypre_MaxwellData *)maxwell_vdata; HYPRE_Int ierr = 0; HYPRE_Int i; HYPRE_Int num_iterations = (maxwell_data -> num_iterations); HYPRE_Int logging = (maxwell_data -> logging); HYPRE_Int print_level = (maxwell_data -> print_level); HYPRE_Real *norms = (maxwell_data -> norms); HYPRE_Real *rel_norms = (maxwell_data -> rel_norms); if (myid == 0) { if (print_level > 0 ) { if (logging > 0) { for (i = 0; i < num_iterations; i++) { hypre_printf("Residual norm[%d] = %e ", i, norms[i]); hypre_printf("Relative residual norm[%d] = %e\n", i, rel_norms[i]); } } } } return ierr; } HYPRE_Int hypre_MaxwellGetFinalRelativeResidualNorm( void *maxwell_vdata, HYPRE_Real *relative_residual_norm ) { hypre_MaxwellData *maxwell_data = (hypre_MaxwellData *)maxwell_vdata; HYPRE_Int max_iter = (maxwell_data -> max_iter); HYPRE_Int num_iterations = (maxwell_data -> num_iterations); HYPRE_Int logging = (maxwell_data -> logging); HYPRE_Real *rel_norms = (maxwell_data -> rel_norms); HYPRE_Int ierr = 0; if (logging > 0) { if (max_iter == 0) { ierr = 1; } else if (num_iterations == max_iter) { *relative_residual_norm = rel_norms[num_iterations - 1]; } else { *relative_residual_norm = rel_norms[num_iterations]; } } return ierr; } hypre-2.33.0/src/sstruct_ls/maxwell_TV.h000066400000000000000000000067741477326011500202010ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * Header info for the Maxwell solver * *****************************************************************************/ #ifndef hypre_MAXWELL_HEADER #define hypre_MAXWELL_HEADER /*-------------------------------------------------------------------------- * hypre_MaxwellData: *--------------------------------------------------------------------------*/ typedef struct { MPI_Comm comm; HYPRE_Real tol; HYPRE_Int max_iter; HYPRE_Int rel_change; HYPRE_Int zero_guess; HYPRE_Int ndim; HYPRE_Int num_pre_relax; /* number of pre relaxation sweeps */ HYPRE_Int num_post_relax; /* number of post relaxation sweeps */ HYPRE_Int constant_coef; hypre_Index *rfactor; hypre_SStructGrid **egrid_l; HYPRE_IJMatrix Aen; hypre_ParCSRMatrix **Aen_l; /* these will be extracted from the amg_data structure. Note that there is no grid underlying these matrices and vectors if they are generated by the amg_setup. So, will be stored as Parcsr_matrices and Par_vectors. */ hypre_SStructMatrix *Ann; hypre_SStructVector *bn; hypre_SStructVector *xn; void *amg_vdata; hypre_ParCSRMatrix **Ann_l; hypre_SStructStencil **Ann_stencils; hypre_ParCSRMatrix **Pn_l; hypre_ParCSRMatrix **RnT_l; hypre_ParVector **bn_l; hypre_ParVector **xn_l; hypre_ParVector **resn_l; hypre_ParVector **en_l; hypre_ParVector **nVtemp_l; hypre_ParVector **nVtemp2_l; HYPRE_Int **nCF_marker_l; HYPRE_Real *nrelax_weight; HYPRE_Real *nomega; HYPRE_Int nrelax_type; HYPRE_Int node_numlevels; hypre_ParCSRMatrix *Tgrad; hypre_ParCSRMatrix *T_transpose; /* edge data structure. These will have grids. */ HYPRE_Int edge_maxlevels; HYPRE_Int edge_numlevels; hypre_ParCSRMatrix **Aee_l; hypre_ParVector **be_l; hypre_ParVector **xe_l; hypre_ParVector **rese_l; hypre_ParVector **ee_l; hypre_ParVector **eVtemp_l; hypre_ParVector **eVtemp2_l; HYPRE_Int **eCF_marker_l; HYPRE_Real *erelax_weight; HYPRE_Real *eomega; HYPRE_Int erelax_type; /* edge data structure. These will have no grid. */ hypre_IJMatrix **Pe_l; hypre_IJMatrix **ReT_l; HYPRE_Int **BdryRanks_l; HYPRE_Int *BdryRanksCnts_l; /* edge-node data structure. These will have grids. */ HYPRE_Int en_numlevels; /* log info (always logged) */ HYPRE_Int num_iterations; HYPRE_Int time_index; /* additional log info (logged when `logging' > 0) */ HYPRE_Int print_level; HYPRE_Int logging; HYPRE_Real *norms; HYPRE_Real *rel_norms; } hypre_MaxwellData; #endif hypre-2.33.0/src/sstruct_ls/maxwell_TV_setup.c000066400000000000000000001660761477326011500214160ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * OpenMP Problems * * Are private static arrays a problem? * ******************************************************************************/ #include "_hypre_sstruct_ls.h" #include "maxwell_TV.h" #include "par_amg.h" #define DEBUG 0 /*-------------------------------------------------------------------------- * hypre_MaxwellTV_Setup *--------------------------------------------------------------------------*/ HYPRE_Int hypre_MaxwellTV_Setup(void *maxwell_vdata, hypre_SStructMatrix *Aee_in, hypre_SStructVector *b_in, hypre_SStructVector *x_in) { hypre_MaxwellData *maxwell_TV_data = (hypre_MaxwellData *)maxwell_vdata; MPI_Comm comm = hypre_SStructMatrixComm(Aee_in); hypre_SStructGraph *graph = hypre_SStructMatrixGraph(Aee_in); hypre_SStructGrid *grid = hypre_SStructGraphGrid(graph); hypre_Index *rfactor_in = (maxwell_TV_data-> rfactor); hypre_ParCSRMatrix *T = (maxwell_TV_data-> Tgrad); hypre_SStructMatrix *Ann; HYPRE_IJMatrix Aen; hypre_SStructVector *bn; hypre_SStructVector *xn; hypre_ParCSRMatrix *Aee = hypre_SStructMatrixParCSRMatrix(Aee_in); hypre_ParCSRMatrix *T_transpose; hypre_ParCSRMatrix *transpose; hypre_ParCSRMatrix *parcsr_mat; HYPRE_Int size, *size_ptr; HYPRE_BigInt *col_inds; HYPRE_Real *values; hypre_ParVector *parvector_x; hypre_ParVector *parvector_b; hypre_ParCSRMatrix **Aen_l; void *amg_vdata; hypre_ParAMGData *amg_data; hypre_ParCSRMatrix **Ann_l; hypre_ParCSRMatrix **Pn_l; hypre_ParCSRMatrix **RnT_l; hypre_ParVector **bn_l; hypre_ParVector **xn_l; hypre_ParVector **resn_l; hypre_ParVector **en_l; hypre_ParVector **nVtemp_l; hypre_ParVector **nVtemp2_l; HYPRE_Int **nCF_marker_l; HYPRE_Real *nrelax_weight; HYPRE_Real *nomega; HYPRE_Int nrelax_type; HYPRE_Int node_numlevels; hypre_ParCSRMatrix **Aee_l; hypre_IJMatrix **Pe_l; hypre_IJMatrix **ReT_l; hypre_ParVector **be_l; hypre_ParVector **xe_l; hypre_ParVector **rese_l; hypre_ParVector **ee_l; hypre_ParVector **eVtemp_l; hypre_ParVector **eVtemp2_l; HYPRE_Real *erelax_weight; HYPRE_Real *eomega; HYPRE_Int **eCF_marker_l; HYPRE_Int erelax_type; #if 0 /* objects needed to fine the edge relaxation parameters */ HYPRE_Int relax_type; HYPRE_Int *relax_types; void *e_amg_vdata; hypre_ParAMGData *e_amgData; HYPRE_Int numCGSweeps = 10; HYPRE_Int **amg_CF_marker; hypre_ParCSRMatrix **A_array; #endif hypre_SStructGrid *node_grid; hypre_SStructGraph *node_graph; HYPRE_Int *coarsen; hypre_SStructGrid **egrid_l; hypre_SStructGrid *edge_grid, *face_grid, *cell_grid; hypre_SStructGrid **topological_edge, **topological_face = NULL, **topological_cell; HYPRE_Int **BdryRanks_l; HYPRE_Int *BdryRanksCnts_l; hypre_SStructPGrid *pgrid; hypre_StructGrid *sgrid; hypre_BoxArray *boxes, *tmp_box_array; hypre_Box *box, *box_piece, *contract_box; hypre_BoxArray *cboxes; HYPRE_SStructVariable *vartypes, *vartype_edges, *vartype_faces = NULL, *vartype_cell; hypre_SStructStencil **Ann_stencils; hypre_MaxwellOffProcRow **OffProcRows; HYPRE_Int num_OffProcRows; hypre_Index rfactor; hypre_Index index, cindex, shape, loop_size, start, lindex; HYPRE_Int stencil_size; HYPRE_Int matrix_type = HYPRE_PARCSR; HYPRE_Int ndim = hypre_SStructMatrixNDim(Aee_in); HYPRE_Int nparts, part, vars, nboxes, lev_nboxes; HYPRE_Int nrows; HYPRE_BigInt rank, start_rank, *jnode, *inode; HYPRE_Int *flag, *ncols; HYPRE_BigInt *flag2; HYPRE_Real *vals; HYPRE_Int i, j, k, l, m; HYPRE_BigInt big_i, *big_i_ptr; hypre_BoxManager *node_boxman; hypre_BoxManEntry *entry; HYPRE_Int kstart = 0, kend = 0; HYPRE_BigInt ilower, iupper; HYPRE_BigInt jlower, jupper; HYPRE_Int myproc; HYPRE_BigInt first_local_row, last_local_row; HYPRE_BigInt first_local_col, last_local_col; HYPRE_Int edge_maxlevels, edge_numlevels, en_numlevels; HYPRE_Int constant_coef = maxwell_TV_data -> constant_coef; HYPRE_Int trueV = 1; HYPRE_Int falseV = 0; HYPRE_Int ierr = 0; #if DEBUG /*char filename[255];*/ #endif HYPRE_MemoryLocation memory_location = hypre_ParCSRMatrixMemoryLocation(Aee); hypre_MPI_Comm_rank(comm, &myproc); (maxwell_TV_data -> ndim) = ndim; /* Adjust rfactor so that the correct dimension is used */ for (i = ndim; i < 3; i++) { rfactor_in[0][i] = 1; } hypre_CopyIndex(rfactor_in[0], rfactor); hypre_SetIndex(lindex, 0); /*--------------------------------------------------------------------- * Set up matrices Ann, Aen. * * Forming the finest node matrix: We are assuming the Aee_in is in the * parcsr data structure, the stencil structure for the node is the * 9 or 27 point fem pattern, etc. * * Need to form the grid, graph, etc. for these matrices. *---------------------------------------------------------------------*/ nparts = hypre_SStructMatrixNParts(Aee_in); HYPRE_SStructGridCreate(comm, ndim, nparts, &node_grid); /* grids can be constructed from the cell-centre grid of Aee_in */ vartypes = hypre_CTAlloc(HYPRE_SStructVariable, 1, HYPRE_MEMORY_HOST); vartypes[0] = HYPRE_SSTRUCT_VARIABLE_NODE; for (i = 0; i < nparts; i++) { pgrid = hypre_SStructPMatrixPGrid(hypre_SStructMatrixPMatrix(Aee_in, i)); sgrid = hypre_SStructPGridCellSGrid(pgrid); boxes = hypre_StructGridBoxes(sgrid); hypre_ForBoxI(j, boxes) { box = hypre_BoxArrayBox(boxes, j); HYPRE_SStructGridSetExtents(node_grid, i, hypre_BoxIMin(box), hypre_BoxIMax(box)); } HYPRE_SStructGridSetVariables(node_grid, i, 1, vartypes); } HYPRE_SStructGridAssemble(node_grid); /* Ann stencils & graph */ stencil_size = 1; for (i = 0; i < ndim; i++) { stencil_size *= 3; } Ann_stencils = hypre_CTAlloc(hypre_SStructStencil *, 1, HYPRE_MEMORY_HOST); HYPRE_SStructStencilCreate(ndim, stencil_size, &Ann_stencils[0]); vars = 0; /* scalar equation, node-to-node */ if (ndim > 2) { kstart = -1; kend = 2; } else if (ndim == 2) { kstart = 0; kend = 1; } m = 0; for (k = kstart; k < kend; k++) { for (j = -1; j < 2; j++) { for (i = -1; i < 2; i++) { hypre_SetIndex3(shape, i, j, k); HYPRE_SStructStencilSetEntry(Ann_stencils[0], m, shape, vars); m++; } } } HYPRE_SStructGraphCreate(comm, node_grid, &node_graph); for (part = 0; part < nparts; part++) { HYPRE_SStructGraphSetStencil(node_graph, part, 0, Ann_stencils[0]); } HYPRE_SStructGraphAssemble(node_graph); HYPRE_SStructMatrixCreate(comm, node_graph, &Ann); HYPRE_SStructMatrixSetObjectType(Ann, HYPRE_PARCSR); HYPRE_SStructMatrixInitialize(Ann); /* Aen is constructed as an IJ matrix. Constructing it as a sstruct_matrix * would make it a square matrix. */ part = 0; i = 0; hypre_SStructGridBoxProcFindBoxManEntry(node_grid, part, 0, i, myproc, &entry); pgrid = hypre_SStructGridPGrid(node_grid, part); vartypes[0] = HYPRE_SSTRUCT_VARIABLE_NODE; j = vartypes[0]; sgrid = hypre_SStructPGridVTSGrid(pgrid, j); boxes = hypre_StructGridBoxes(sgrid); box = hypre_BoxArrayBox(boxes, 0); hypre_SStructBoxManEntryGetGlobalCSRank(entry, hypre_BoxIMin(box), &jlower); hypre_SStructGridBoxProcFindBoxManEntry(grid, part, 0, i, myproc, &entry); pgrid = hypre_SStructGridPGrid(grid, part); /* grab the first edge variable type */ vartypes[0] = hypre_SStructPGridVarType(pgrid, 0); j = vartypes[0]; sgrid = hypre_SStructPGridVTSGrid(pgrid, j); boxes = hypre_StructGridBoxes(sgrid); box = hypre_BoxArrayBox(boxes, 0); hypre_SStructBoxManEntryGetGlobalCSRank(entry, hypre_BoxIMin(box), &ilower); part = nparts - 1; pgrid = hypre_SStructGridPGrid(node_grid, part); vartypes[0] = HYPRE_SSTRUCT_VARIABLE_NODE; j = vartypes[0]; sgrid = hypre_SStructPGridVTSGrid(pgrid, j); boxes = hypre_StructGridBoxes(sgrid); box = hypre_BoxArrayBox(boxes, hypre_BoxArraySize(boxes) - 1); hypre_SStructGridBoxProcFindBoxManEntry(node_grid, part, 0, hypre_BoxArraySize(boxes) - 1, myproc, &entry); hypre_SStructBoxManEntryGetGlobalCSRank(entry, hypre_BoxIMax(box), &jupper); pgrid = hypre_SStructGridPGrid(grid, part); vars = hypre_SStructPGridNVars(pgrid); vartypes[0] = hypre_SStructPGridVarType(pgrid, vars - 1); j = vartypes[0]; sgrid = hypre_SStructPGridVTSGrid(pgrid, j); boxes = hypre_StructGridBoxes(sgrid); box = hypre_BoxArrayBox(boxes, hypre_BoxArraySize(boxes) - 1); hypre_TFree(vartypes, HYPRE_MEMORY_HOST); hypre_SStructGridBoxProcFindBoxManEntry(grid, part, vars - 1, hypre_BoxArraySize(boxes) - 1, myproc, &entry); hypre_SStructBoxManEntryGetGlobalCSRank(entry, hypre_BoxIMax(box), &iupper); HYPRE_IJMatrixCreate(comm, ilower, iupper, jlower, jupper, &Aen); HYPRE_IJMatrixSetObjectType(Aen, HYPRE_PARCSR); HYPRE_IJMatrixInitialize(Aen); /* setup the Aen & Ann using matrix-matrix products * Aen's parscr matrix has not been formed yet-> fill up ij_matrix */ parcsr_mat = hypre_ParMatmul(Aee, T); HYPRE_ParCSRMatrixGetLocalRange((HYPRE_ParCSRMatrix) parcsr_mat, &first_local_row, &last_local_row, &first_local_col, &last_local_col); size_ptr = hypre_TAlloc(HYPRE_Int, 1, memory_location); big_i_ptr = hypre_TAlloc(HYPRE_BigInt, 1, memory_location); for (big_i = first_local_row; big_i <= last_local_row; big_i++) { HYPRE_ParCSRMatrixGetRow((HYPRE_ParCSRMatrix) parcsr_mat, big_i, &size, &col_inds, &values); size_ptr[0] = size; big_i_ptr[0] = big_i; //RL: this is very slow when using on device HYPRE_IJMatrixSetValues(Aen, 1, size_ptr, big_i_ptr, (const HYPRE_BigInt *) col_inds, (const HYPRE_Real *) values); HYPRE_ParCSRMatrixRestoreRow((HYPRE_ParCSRMatrix) parcsr_mat, big_i, &size, &col_inds, &values); } hypre_ParCSRMatrixDestroy(parcsr_mat); HYPRE_IJMatrixAssemble(Aen); /* Ann's parscr matrix has not been formed yet-> fill up ij_matrix */ hypre_ParCSRMatrixTranspose(T, &T_transpose, 1); parcsr_mat = hypre_ParMatmul(T_transpose, (hypre_ParCSRMatrix *) hypre_IJMatrixObject(Aen)); HYPRE_ParCSRMatrixGetLocalRange((HYPRE_ParCSRMatrix) parcsr_mat, &first_local_row, &last_local_row, &first_local_col, &last_local_col); for (big_i = first_local_row; big_i <= last_local_row; big_i++) { HYPRE_ParCSRMatrixGetRow((HYPRE_ParCSRMatrix) parcsr_mat, big_i, &size, &col_inds, &values); size_ptr[0] = size; big_i_ptr[0] = big_i; //RL: this is very slow when using on device HYPRE_IJMatrixSetValues(hypre_SStructMatrixIJMatrix(Ann), 1, size_ptr, big_i_ptr, (const HYPRE_BigInt *) col_inds, (const HYPRE_Real *) values); HYPRE_ParCSRMatrixRestoreRow((HYPRE_ParCSRMatrix) parcsr_mat, big_i, &size, &col_inds, &values); } hypre_ParCSRMatrixDestroy(parcsr_mat); hypre_TFree(size_ptr, memory_location); hypre_TFree(big_i_ptr, memory_location); /* set the physical boundary points to identity */ nrows = 0; for (part = 0; part < nparts; part++) { pgrid = hypre_SStructGridPGrid(node_grid, part); sgrid = hypre_SStructPGridSGrid(pgrid, 0); nrows += hypre_StructGridLocalSize(sgrid); } flag = hypre_CTAlloc(HYPRE_Int, nrows, HYPRE_MEMORY_HOST); flag2 = hypre_CTAlloc(HYPRE_BigInt, nrows, HYPRE_MEMORY_HOST); for (i = 0; i < nrows; i++) { flag[i] = 1; } /* Determine physical boundary points. Get the rank and set flag[rank]= rank. This will boundary point, i.e., ncols[rank]> 0 will flag a boundary point. */ start_rank = hypre_SStructGridStartRank(node_grid); for (part = 0; part < nparts; part++) { pgrid = hypre_SStructGridPGrid(node_grid, part); sgrid = hypre_SStructPGridSGrid(pgrid, 0); boxes = hypre_StructGridBoxes(sgrid); node_boxman = hypre_SStructGridBoxManager(node_grid, part, 0); hypre_ForBoxI(j, boxes) { box = hypre_BoxArrayBox(boxes, j); hypre_BoxManGetEntry(node_boxman, myproc, j, &entry); i = hypre_BoxVolume(box); tmp_box_array = hypre_BoxArrayCreate(0, ndim); ierr += hypre_BoxBoundaryG(box, sgrid, tmp_box_array); for (m = 0; m < hypre_BoxArraySize(tmp_box_array); m++) { box_piece = hypre_BoxArrayBox(tmp_box_array, m); if (hypre_BoxVolume(box_piece) < i) { hypre_BoxGetSize(box_piece, loop_size); hypre_CopyIndex(hypre_BoxIMin(box_piece), start); hypre_SerialBoxLoop0Begin(ndim, loop_size); { zypre_BoxLoopGetIndex(lindex); hypre_SetIndex3(index, lindex[0], lindex[1], lindex[2]); hypre_AddIndexes(index, start, 3, index); hypre_SStructBoxManEntryGetGlobalRank(entry, index, &rank, matrix_type); flag[(HYPRE_Int)(rank - start_rank)] = 0; flag2[(HYPRE_Int)(rank - start_rank)] = rank; } hypre_SerialBoxLoop0End(); } /* if (hypre_BoxVolume(box_piece) < i) */ } /* for (m= 0; m< hypre_BoxArraySize(tmp_box_array); m++) */ hypre_BoxArrayDestroy(tmp_box_array); } /* hypre_ForBoxI(j, boxes) */ } /* for (part= 0; part< nparts; part++) */ /* set up boundary identity */ j = 0; for (i = 0; i < nrows; i++) { if (!flag[i]) { j++; } } inode = hypre_CTAlloc(HYPRE_BigInt, j, memory_location); ncols = hypre_CTAlloc(HYPRE_Int, j, memory_location); jnode = hypre_CTAlloc(HYPRE_BigInt, j, memory_location); vals = hypre_TAlloc(HYPRE_Real, j, memory_location); j = 0; for (i = 0; i < nrows; i++) { if (!flag[i]) { ncols[j] = 1; inode[j] = flag2[i]; jnode[j] = flag2[i]; vals[j] = 1.0; j++; } } hypre_TFree(flag, HYPRE_MEMORY_HOST); hypre_TFree(flag2, HYPRE_MEMORY_HOST); HYPRE_IJMatrixSetValues(hypre_SStructMatrixIJMatrix(Ann), j, ncols, (const HYPRE_BigInt*) inode, (const HYPRE_BigInt*) jnode, (const HYPRE_Real*) vals); hypre_TFree(ncols, memory_location); hypre_TFree(inode, memory_location); hypre_TFree(jnode, memory_location); hypre_TFree(vals, memory_location); HYPRE_SStructMatrixAssemble(Ann); #if DEBUG HYPRE_SStructMatrixPrint("sstruct.out.Ann", Ann, 0); HYPRE_IJMatrixPrint(Aen, "driver.out.Aen"); #endif /* setup bn & xn using matvec. Assemble first and then perform matvec to get the nodal rhs and initial guess. */ HYPRE_SStructVectorCreate(comm, node_grid, &bn); HYPRE_SStructVectorSetObjectType(bn, HYPRE_PARCSR); HYPRE_SStructVectorInitialize(bn); HYPRE_SStructVectorAssemble(bn); hypre_SStructVectorConvert(b_in, &parvector_x); /*HYPRE_SStructVectorGetObject((HYPRE_SStructVector) b_in, (void **) &parvector_x);*/ HYPRE_SStructVectorGetObject((HYPRE_SStructVector) bn, (void **) &parvector_b); hypre_ParCSRMatrixMatvec(1.0, T_transpose, parvector_x, 0.0, parvector_b); HYPRE_SStructVectorCreate(comm, node_grid, &xn); HYPRE_SStructVectorSetObjectType(xn, HYPRE_PARCSR); HYPRE_SStructVectorInitialize(xn); HYPRE_SStructVectorAssemble(xn); hypre_SStructVectorConvert(x_in, &parvector_x); /*HYPRE_SStructVectorGetObject((HYPRE_SStructVector) x_in, (void **) &parvector_x);*/ HYPRE_SStructVectorGetObject((HYPRE_SStructVector) xn, (void **) &parvector_b); hypre_ParCSRMatrixMatvec(1.0, T_transpose, parvector_x, 0.0, parvector_b); /* Destroy the node grid and graph. This only decrements reference counters. */ HYPRE_SStructGridDestroy(node_grid); HYPRE_SStructGraphDestroy(node_graph); /* create the multigrid components for the nodal matrix using amg. We need to extract the nodal mg components to form the system mg components. */ amg_vdata = (void *) hypre_BoomerAMGCreate(); hypre_BoomerAMGSetStrongThreshold(amg_vdata, 0.25); hypre_BoomerAMGSetup(amg_vdata, hypre_SStructMatrixParCSRMatrix(Ann), hypre_SStructVectorParVector(bn), hypre_SStructVectorParVector(xn)); { amg_data = (hypre_ParAMGData*) amg_vdata; node_numlevels = hypre_ParAMGDataNumLevels(amg_data); Ann_l = hypre_CTAlloc(hypre_ParCSRMatrix *, node_numlevels, HYPRE_MEMORY_HOST); Pn_l = hypre_CTAlloc(hypre_ParCSRMatrix *, node_numlevels, HYPRE_MEMORY_HOST); RnT_l = hypre_CTAlloc(hypre_ParCSRMatrix *, node_numlevels, HYPRE_MEMORY_HOST); bn_l = hypre_CTAlloc(hypre_ParVector*, node_numlevels, HYPRE_MEMORY_HOST); xn_l = hypre_CTAlloc(hypre_ParVector*, node_numlevels, HYPRE_MEMORY_HOST); resn_l = hypre_CTAlloc(hypre_ParVector*, node_numlevels, HYPRE_MEMORY_HOST); en_l = hypre_CTAlloc(hypre_ParVector*, node_numlevels, HYPRE_MEMORY_HOST); nVtemp_l = hypre_CTAlloc(hypre_ParVector*, node_numlevels, HYPRE_MEMORY_HOST); nVtemp2_l = hypre_CTAlloc(hypre_ParVector*, node_numlevels, HYPRE_MEMORY_HOST); /* relaxation parameters */ nCF_marker_l = hypre_CTAlloc(HYPRE_Int *, node_numlevels, HYPRE_MEMORY_HOST); nrelax_weight = hypre_CTAlloc(HYPRE_Real, node_numlevels, HYPRE_MEMORY_HOST); nomega = hypre_CTAlloc(HYPRE_Real, node_numlevels, HYPRE_MEMORY_HOST); nrelax_type = 6; /* fast parallel hybrid */ for (i = 0; i < node_numlevels; i++) { Ann_l[i] = (hypre_ParAMGDataAArray(amg_data))[i]; Pn_l[i] = hypre_ParAMGDataPArray(amg_data)[i]; RnT_l[i] = hypre_ParAMGDataRArray(amg_data)[i]; bn_l[i] = hypre_ParAMGDataFArray(amg_data)[i]; xn_l[i] = hypre_ParAMGDataUArray(amg_data)[i]; /* create temporary vectors */ resn_l[i] = hypre_ParVectorCreate(hypre_ParCSRMatrixComm(Ann_l[i]), hypre_ParCSRMatrixGlobalNumRows(Ann_l[i]), hypre_ParCSRMatrixRowStarts(Ann_l[i])); hypre_ParVectorInitialize(resn_l[i]); en_l[i] = hypre_ParVectorCreate(hypre_ParCSRMatrixComm(Ann_l[i]), hypre_ParCSRMatrixGlobalNumRows(Ann_l[i]), hypre_ParCSRMatrixRowStarts(Ann_l[i])); hypre_ParVectorInitialize(en_l[i]); nVtemp_l[i] = hypre_ParVectorCreate(hypre_ParCSRMatrixComm(Ann_l[i]), hypre_ParCSRMatrixGlobalNumRows(Ann_l[i]), hypre_ParCSRMatrixRowStarts(Ann_l[i])); hypre_ParVectorInitialize(nVtemp_l[i]); nVtemp2_l[i] = hypre_ParVectorCreate(hypre_ParCSRMatrixComm(Ann_l[i]), hypre_ParCSRMatrixGlobalNumRows(Ann_l[i]), hypre_ParCSRMatrixRowStarts(Ann_l[i])); hypre_ParVectorInitialize(nVtemp2_l[i]); if (hypre_ParAMGDataCFMarkerArray(amg_data)[i]) { nCF_marker_l[i] = hypre_IntArrayData(hypre_ParAMGDataCFMarkerArray(amg_data)[i]); } else { nCF_marker_l[i] = NULL; } nrelax_weight[i] = hypre_ParAMGDataRelaxWeight(amg_data)[i]; nomega[i] = hypre_ParAMGDataOmega(amg_data)[i]; } } (maxwell_TV_data -> Ann_stencils) = Ann_stencils; (maxwell_TV_data -> T_transpose) = T_transpose; (maxwell_TV_data -> Ann) = Ann; (maxwell_TV_data -> Aen) = Aen; (maxwell_TV_data -> bn) = bn; (maxwell_TV_data -> xn) = xn; (maxwell_TV_data -> amg_vdata) = amg_vdata; (maxwell_TV_data -> Ann_l) = Ann_l; (maxwell_TV_data -> Pn_l) = Pn_l; (maxwell_TV_data -> RnT_l) = RnT_l; (maxwell_TV_data -> bn_l) = bn_l; (maxwell_TV_data -> xn_l) = xn_l; (maxwell_TV_data -> resn_l) = resn_l; (maxwell_TV_data -> en_l) = en_l; (maxwell_TV_data -> nVtemp_l) = nVtemp_l; (maxwell_TV_data -> nVtemp2_l) = nVtemp2_l; (maxwell_TV_data -> nCF_marker_l) = nCF_marker_l; (maxwell_TV_data -> nrelax_weight) = nrelax_weight; (maxwell_TV_data -> nomega) = nomega; (maxwell_TV_data -> nrelax_type) = nrelax_type; (maxwell_TV_data -> node_numlevels) = node_numlevels; /* coarsen the edge matrix. Will coarsen uniformly since we have no * scheme to semi-coarsen. That is, coarsen wrt to rfactor, with * rfactor[i] > 1 for i < ndim. * Determine the number of levels for the edge problem */ cboxes = hypre_BoxArrayCreate(0, ndim); coarsen = hypre_CTAlloc(HYPRE_Int, nparts, HYPRE_MEMORY_HOST); edge_maxlevels = 0; for (part = 0; part < nparts; part++) { pgrid = hypre_SStructGridPGrid(grid, part); sgrid = hypre_SStructPGridCellSGrid(pgrid); box = hypre_BoxDuplicate(hypre_StructGridBoundingBox(sgrid)); hypre_AppendBox(box, cboxes); /* since rfactor[i]>1, the following i will be an upper bound of the number of levels. */ i = hypre_Log2(hypre_BoxSizeD(box, 0)) + 2 + hypre_Log2(hypre_BoxSizeD(box, 1)) + 2 + hypre_Log2(hypre_BoxSizeD(box, 2)) + 2; hypre_BoxDestroy(box); /* the following allows some of the parts to have volume zero grids */ edge_maxlevels = hypre_max(edge_maxlevels, i); coarsen[part] = trueV; } if ((maxwell_TV_data-> edge_maxlevels) > 0) { edge_maxlevels = hypre_min(edge_maxlevels, (maxwell_TV_data -> edge_maxlevels)); } (maxwell_TV_data -> edge_maxlevels) = edge_maxlevels; /* form the edge grids: coarsen the cell grid on each part and then set the boxes of these grids to be the boxes of the sstruct_grid. */ egrid_l = hypre_TAlloc(hypre_SStructGrid *, edge_maxlevels, HYPRE_MEMORY_HOST); hypre_SStructGridRef(grid, &egrid_l[0]); /* form the topological grids for the topological matrices. */ /* Assuming same variable ordering on all parts */ pgrid = hypre_SStructGridPGrid(grid, 0); HYPRE_SStructGridCreate(comm, ndim, nparts, &edge_grid); vartype_edges = hypre_CTAlloc(HYPRE_SStructVariable, ndim, HYPRE_MEMORY_HOST); if (ndim > 2) { HYPRE_SStructGridCreate(comm, ndim, nparts, &face_grid); vartype_faces = hypre_CTAlloc(HYPRE_SStructVariable, ndim, HYPRE_MEMORY_HOST); for (i = 0; i < 3; i++) { vartype_edges[2] = hypre_SStructPGridVarType(pgrid, i); j = vartype_edges[2]; switch (j) { case 5: { vartype_edges[i] = HYPRE_SSTRUCT_VARIABLE_XEDGE; vartype_faces[i] = HYPRE_SSTRUCT_VARIABLE_XFACE; break; } case 6: { vartype_edges[i] = HYPRE_SSTRUCT_VARIABLE_YEDGE; vartype_faces[i] = HYPRE_SSTRUCT_VARIABLE_YFACE; break; } case 7: { vartype_edges[i] = HYPRE_SSTRUCT_VARIABLE_ZEDGE; vartype_faces[i] = HYPRE_SSTRUCT_VARIABLE_ZFACE; break; } } /* switch(j) */ } /* for (i= 0; i< 3; i++) */ } else { for (i = 0; i < 2; i++) { vartype_edges[1] = hypre_SStructPGridVarType(pgrid, i); j = vartype_edges[1]; switch (j) { case 2: { vartype_edges[i] = HYPRE_SSTRUCT_VARIABLE_XFACE; break; } case 3: { vartype_edges[i] = HYPRE_SSTRUCT_VARIABLE_YFACE; break; } } /* switch(j) */ } /* for (i= 0; i< 3; i++) */ } HYPRE_SStructGridCreate(comm, ndim, nparts, &cell_grid); vartype_cell = hypre_CTAlloc(HYPRE_SStructVariable, 1, HYPRE_MEMORY_HOST); vartype_cell[0] = HYPRE_SSTRUCT_VARIABLE_CELL; for (i = 0; i < nparts; i++) { pgrid = hypre_SStructPMatrixPGrid(hypre_SStructMatrixPMatrix(Aee_in, i)); sgrid = hypre_SStructPGridCellSGrid(pgrid); boxes = hypre_StructGridBoxes(sgrid); hypre_ForBoxI(j, boxes) { box = hypre_BoxArrayBox(boxes, j); HYPRE_SStructGridSetExtents(edge_grid, i, hypre_BoxIMin(box), hypre_BoxIMax(box)); HYPRE_SStructGridSetExtents(cell_grid, i, hypre_BoxIMin(box), hypre_BoxIMax(box)); if (ndim > 2) { HYPRE_SStructGridSetExtents(face_grid, i, hypre_BoxIMin(box), hypre_BoxIMax(box)); } } HYPRE_SStructGridSetVariables(edge_grid, i, ndim, vartype_edges); HYPRE_SStructGridSetVariables(cell_grid, i, 1, vartype_cell); if (ndim > 2) { HYPRE_SStructGridSetVariables(face_grid, i, ndim, vartype_faces); } } HYPRE_SStructGridAssemble(edge_grid); topological_edge = hypre_TAlloc(hypre_SStructGrid *, edge_maxlevels, HYPRE_MEMORY_HOST); topological_edge[0] = edge_grid; HYPRE_SStructGridAssemble(cell_grid); topological_cell = hypre_TAlloc(hypre_SStructGrid *, edge_maxlevels, HYPRE_MEMORY_HOST); topological_cell[0] = cell_grid; if (ndim > 2) { HYPRE_SStructGridAssemble(face_grid); topological_face = hypre_TAlloc(hypre_SStructGrid *, edge_maxlevels, HYPRE_MEMORY_HOST); topological_face[0] = face_grid; } /*-------------------------------------------------------------------------- * to determine when to stop coarsening, we check the cell bounding boxes * of the level egrid. After each coarsening, the bounding boxes are * replaced by the generated coarse egrid cell bounding boxes. *--------------------------------------------------------------------------*/ hypre_SetIndex3(cindex, 0, 0, 0); j = 0; /* j tracks the number of parts that have been coarsened away */ edge_numlevels = 1; for (l = 0; ; l++) { HYPRE_SStructGridCreate(comm, ndim, nparts, &egrid_l[l + 1]); HYPRE_SStructGridCreate(comm, ndim, nparts, &topological_edge[l + 1]); HYPRE_SStructGridCreate(comm, ndim, nparts, &topological_cell[l + 1]); if (ndim > 2) { HYPRE_SStructGridCreate(comm, ndim, nparts, &topological_face[l + 1]); } /* coarsen the non-zero bounding boxes only if we have some. */ nboxes = 0; if (j < nparts) { for (part = 0; part < nparts; part++) { pgrid = hypre_SStructGridPGrid(egrid_l[l], part); sgrid = hypre_SStructPGridCellSGrid(pgrid); if (coarsen[part]) { box = hypre_BoxArrayBox(cboxes, part); m = trueV; for (i = 0; i < ndim; i++) { if ( hypre_BoxIMaxD(box, i) < hypre_BoxIMinD(box, i) ) { m = falseV; break; } } if (m) { /* MAY NEED TO CHECK THE FOLLOWING MORE CAREFULLY: */ /* should we decrease this bounding box so that we get the correct coarse bounding box? Recall that we will decrease each box of the cell_grid so that exact rfactor divisibility is attained. Project does not automatically perform this. E.g., consider a grid with only one box whose width does not divide by rfactor, but it contains beginning and ending indices that are divisible by rfactor. Then an extra coarse grid layer is given by project. */ contract_box = hypre_BoxContraction(box, sgrid, rfactor); hypre_CopyBox(contract_box, box); hypre_BoxDestroy(contract_box); hypre_ProjectBox(box, cindex, rfactor); hypre_StructMapFineToCoarse(hypre_BoxIMin(box), cindex, rfactor, hypre_BoxIMin(box)); hypre_StructMapFineToCoarse(hypre_BoxIMax(box), cindex, rfactor, hypre_BoxIMax(box)); /* build the coarse edge grids. Only fill up box extents. The boxes of the grid may be contracted. Note that the box projection may not perform the contraction. */ k = 0; hypre_CoarsenPGrid(egrid_l[l], cindex, rfactor, part, egrid_l[l + 1], &k); /* build the topological grids */ hypre_CoarsenPGrid(topological_edge[l], cindex, rfactor, part, topological_edge[l + 1], &i); hypre_CoarsenPGrid(topological_cell[l], cindex, rfactor, part, topological_cell[l + 1], &i); if (ndim > 2) { hypre_CoarsenPGrid(topological_face[l], cindex, rfactor, part, topological_face[l + 1], &i); } nboxes += k; } else { /* record empty, coarsened-away part */ coarsen[part] = falseV; /* set up a dummy box so this grid can be destroyed */ HYPRE_SStructGridSetExtents(egrid_l[l + 1], part, hypre_BoxIMin(box), hypre_BoxIMin(box)); HYPRE_SStructGridSetExtents(topological_edge[l + 1], part, hypre_BoxIMin(box), hypre_BoxIMin(box)); HYPRE_SStructGridSetExtents(topological_cell[l + 1], part, hypre_BoxIMin(box), hypre_BoxIMin(box)); if (ndim > 2) { HYPRE_SStructGridSetExtents(topological_face[l + 1], part, hypre_BoxIMin(box), hypre_BoxIMin(box)); } j++; } } /* if (coarsen[part]) */ vartypes = hypre_SStructPGridVarTypes( hypre_SStructGridPGrid(egrid_l[l], part)); HYPRE_SStructGridSetVariables(egrid_l[l + 1], part, ndim, vartypes); HYPRE_SStructGridSetVariables(topological_edge[l + 1], part, ndim, vartype_edges); HYPRE_SStructGridSetVariables(topological_cell[l + 1], part, 1, vartype_cell); if (ndim > 2) { HYPRE_SStructGridSetVariables(topological_face[l + 1], part, ndim, vartype_faces); } } /* for (part= 0; part< nparts; part++) */ } /* if (j < nparts) */ HYPRE_SStructGridAssemble(egrid_l[l + 1]); HYPRE_SStructGridAssemble(topological_edge[l + 1]); HYPRE_SStructGridAssemble(topological_cell[l + 1]); if (ndim > 2) { HYPRE_SStructGridAssemble(topological_face[l + 1]); } lev_nboxes = 0; hypre_MPI_Allreduce(&nboxes, &lev_nboxes, 1, HYPRE_MPI_INT, hypre_MPI_SUM, hypre_SStructGridComm(egrid_l[l + 1])); if (lev_nboxes) /* there were coarsen boxes */ { edge_numlevels++; } else { /* no coarse boxes. Trigger coarsening completed and destroy the cgrids corresponding to this level. */ j = nparts; } /* extract the cell bounding boxes */ if (j < nparts) { for (part = 0; part < nparts; part++) { if (coarsen[part]) { pgrid = hypre_SStructGridPGrid(egrid_l[l + 1], part); sgrid = hypre_SStructPGridCellSGrid(pgrid); box = hypre_BoxDuplicate(hypre_StructGridBoundingBox(sgrid)); hypre_CopyBox(box, hypre_BoxArrayBox(cboxes, part)); hypre_BoxDestroy(box); } } } else { HYPRE_SStructGridDestroy(egrid_l[l + 1]); HYPRE_SStructGridDestroy(topological_edge[l + 1]); HYPRE_SStructGridDestroy(topological_cell[l + 1]); if (ndim > 2) { HYPRE_SStructGridDestroy(topological_face[l + 1]); } break; } } (maxwell_TV_data -> egrid_l) = egrid_l; hypre_Maxwell_PhysBdy(egrid_l, edge_numlevels, rfactor, &BdryRanks_l, &BdryRanksCnts_l); (maxwell_TV_data -> BdryRanks_l) = BdryRanks_l; (maxwell_TV_data -> BdryRanksCnts_l) = BdryRanksCnts_l; hypre_BoxArrayDestroy(cboxes); hypre_TFree(coarsen, HYPRE_MEMORY_HOST); /* okay to de-allocate vartypes now */ hypre_TFree(vartype_edges, HYPRE_MEMORY_HOST); hypre_TFree(vartype_cell, HYPRE_MEMORY_HOST); if (ndim > 2) { hypre_TFree(vartype_faces, HYPRE_MEMORY_HOST); } /* Aen matrices are defined for min(edge_numlevels, node_numlevels). */ en_numlevels = hypre_min(edge_numlevels, node_numlevels); (maxwell_TV_data -> en_numlevels) = en_numlevels; (maxwell_TV_data -> edge_numlevels) = edge_numlevels; Aee_l = hypre_TAlloc(hypre_ParCSRMatrix *, edge_numlevels, HYPRE_MEMORY_HOST); Aen_l = hypre_TAlloc(hypre_ParCSRMatrix *, en_numlevels, HYPRE_MEMORY_HOST); /* Pe_l are defined to be IJ matrices rather than directly parcsr. This was done so that in the topological formation, some of the ij matrix routines can be used. */ Pe_l = hypre_TAlloc(hypre_IJMatrix *, edge_numlevels - 1, HYPRE_MEMORY_HOST); ReT_l = hypre_TAlloc(hypre_IJMatrix *, edge_numlevels - 1, HYPRE_MEMORY_HOST); be_l = hypre_TAlloc(hypre_ParVector *, edge_numlevels, HYPRE_MEMORY_HOST); xe_l = hypre_TAlloc(hypre_ParVector *, edge_numlevels, HYPRE_MEMORY_HOST); rese_l = hypre_TAlloc(hypre_ParVector *, edge_numlevels, HYPRE_MEMORY_HOST); ee_l = hypre_TAlloc(hypre_ParVector *, edge_numlevels, HYPRE_MEMORY_HOST); eVtemp_l = hypre_TAlloc(hypre_ParVector *, edge_numlevels, HYPRE_MEMORY_HOST); eVtemp2_l = hypre_TAlloc(hypre_ParVector *, edge_numlevels, HYPRE_MEMORY_HOST); Aee_l[0] = hypre_SStructMatrixParCSRMatrix(Aee_in); Aen_l[0] = (hypre_ParCSRMatrix *) hypre_IJMatrixObject(Aen), be_l[0] = hypre_SStructVectorParVector(b_in); xe_l[0] = hypre_SStructVectorParVector(x_in); rese_l[0] = hypre_ParVectorCreate(hypre_ParCSRMatrixComm(Aee_l[0]), hypre_ParCSRMatrixGlobalNumRows(Aee_l[0]), hypre_ParCSRMatrixRowStarts(Aee_l[0])); hypre_ParVectorInitialize(rese_l[0]); ee_l[0] = hypre_ParVectorCreate(hypre_ParCSRMatrixComm(Aee_l[0]), hypre_ParCSRMatrixGlobalNumRows(Aee_l[0]), hypre_ParCSRMatrixRowStarts(Aee_l[0])); hypre_ParVectorInitialize(ee_l[0]); eVtemp_l[0] = hypre_ParVectorCreate(hypre_ParCSRMatrixComm(Aee_l[0]), hypre_ParCSRMatrixGlobalNumRows(Aee_l[0]), hypre_ParCSRMatrixRowStarts(Aee_l[0])); hypre_ParVectorInitialize(eVtemp_l[0]); eVtemp2_l[0] = hypre_ParVectorCreate(hypre_ParCSRMatrixComm(Aee_l[0]), hypre_ParCSRMatrixGlobalNumRows(Aee_l[0]), hypre_ParCSRMatrixRowStarts(Aee_l[0])); hypre_ParVectorInitialize(eVtemp2_l[0]); for (l = 0; l < (en_numlevels - 1); l++) { if (l < edge_numlevels) /* create edge operators */ { if (!constant_coef) { void *PTopology_vdata; hypre_PTopology *PTopology; hypre_CreatePTopology(&PTopology_vdata); if (ndim > 2) { Pe_l[l] = hypre_Maxwell_PTopology(topological_edge[l], topological_edge[l + 1], topological_face[l], topological_face[l + 1], topological_cell[l], topological_cell[l + 1], Aee_l[l], rfactor, PTopology_vdata); } else { /* two-dim case: edges= faces but stored in edge grid */ Pe_l[l] = hypre_Maxwell_PTopology(topological_edge[l], topological_edge[l + 1], topological_edge[l], topological_edge[l + 1], topological_cell[l], topological_cell[l + 1], Aee_l[l], rfactor, PTopology_vdata); } PTopology = (hypre_PTopology*)PTopology_vdata; /* extract off-processors rows of Pe_l[l]. Needed for amge.*/ hypre_SStructSharedDOF_ParcsrMatRowsComm(egrid_l[l], (hypre_ParCSRMatrix *) hypre_IJMatrixObject(Pe_l[l]), &num_OffProcRows, &OffProcRows); if (ndim == 3) { hypre_ND1AMGeInterpolation(Aee_l[l], (hypre_ParCSRMatrix *) hypre_IJMatrixObject(PTopology -> Element_iedge), (hypre_ParCSRMatrix *) hypre_IJMatrixObject(PTopology -> Face_iedge), (hypre_ParCSRMatrix *) hypre_IJMatrixObject(PTopology -> Edge_iedge), (hypre_ParCSRMatrix *) hypre_IJMatrixObject(PTopology -> Element_Face), (hypre_ParCSRMatrix *) hypre_IJMatrixObject(PTopology -> Element_Edge), num_OffProcRows, OffProcRows, Pe_l[l]); } else { hypre_ND1AMGeInterpolation(Aee_l[l], (hypre_ParCSRMatrix *) hypre_IJMatrixObject(PTopology -> Element_iedge), (hypre_ParCSRMatrix *) hypre_IJMatrixObject(PTopology -> Edge_iedge), (hypre_ParCSRMatrix *) hypre_IJMatrixObject(PTopology -> Edge_iedge), (hypre_ParCSRMatrix *) hypre_IJMatrixObject(PTopology -> Element_Edge), (hypre_ParCSRMatrix *) hypre_IJMatrixObject(PTopology -> Element_Edge), num_OffProcRows, OffProcRows, Pe_l[l]); } hypre_DestroyPTopology(PTopology_vdata); for (i = 0; i < num_OffProcRows; i++) { hypre_MaxwellOffProcRowDestroy((void *) OffProcRows[i]); } hypre_TFree(OffProcRows, HYPRE_MEMORY_HOST); } else { Pe_l[l] = hypre_Maxwell_PNedelec(topological_edge[l], topological_edge[l + 1], rfactor); } #if DEBUG #endif ReT_l[l] = Pe_l[l]; hypre_BoomerAMGBuildCoarseOperator( (hypre_ParCSRMatrix *) hypre_IJMatrixObject(Pe_l[l]), Aee_l[l], (hypre_ParCSRMatrix *) hypre_IJMatrixObject(Pe_l[l]), &Aee_l[l + 1]); /* zero off boundary points */ hypre_ParCSRMatrixEliminateRowsCols(Aee_l[l + 1], BdryRanksCnts_l[l + 1], BdryRanks_l[l + 1]); hypre_ParCSRMatrixTranspose( (hypre_ParCSRMatrix *) hypre_IJMatrixObject(Pe_l[l]), &transpose, 1); parcsr_mat = hypre_ParMatmul(transpose, Aen_l[l]); Aen_l[l + 1] = hypre_ParMatmul(parcsr_mat, Pn_l[l]); hypre_ParCSRMatrixDestroy(parcsr_mat); hypre_ParCSRMatrixDestroy(transpose); xe_l[l + 1] = hypre_ParVectorCreate(hypre_ParCSRMatrixComm(Aee_l[l + 1]), hypre_ParCSRMatrixGlobalNumRows(Aee_l[l + 1]), hypre_ParCSRMatrixRowStarts(Aee_l[l + 1])); hypre_ParVectorInitialize(xe_l[l + 1]); be_l[l + 1] = hypre_ParVectorCreate(hypre_ParCSRMatrixComm(Aee_l[l + 1]), hypre_ParCSRMatrixGlobalNumRows(Aee_l[l + 1]), hypre_ParCSRMatrixRowStarts(Aee_l[l + 1])); hypre_ParVectorInitialize(be_l[l + 1]); rese_l[l + 1] = hypre_ParVectorCreate(hypre_ParCSRMatrixComm(Aee_l[l + 1]), hypre_ParCSRMatrixGlobalNumRows(Aee_l[l + 1]), hypre_ParCSRMatrixRowStarts(Aee_l[l + 1])); hypre_ParVectorInitialize(rese_l[l + 1]); ee_l[l + 1] = hypre_ParVectorCreate(hypre_ParCSRMatrixComm(Aee_l[l + 1]), hypre_ParCSRMatrixGlobalNumRows(Aee_l[l + 1]), hypre_ParCSRMatrixRowStarts(Aee_l[l + 1])); hypre_ParVectorInitialize(ee_l[l + 1]); eVtemp_l[l + 1] = hypre_ParVectorCreate(hypre_ParCSRMatrixComm(Aee_l[l + 1]), hypre_ParCSRMatrixGlobalNumRows(Aee_l[l + 1]), hypre_ParCSRMatrixRowStarts(Aee_l[l + 1])); hypre_ParVectorInitialize(eVtemp_l[l + 1]); eVtemp2_l[l + 1] = hypre_ParVectorCreate(hypre_ParCSRMatrixComm(Aee_l[l + 1]), hypre_ParCSRMatrixGlobalNumRows(Aee_l[l + 1]), hypre_ParCSRMatrixRowStarts(Aee_l[l + 1])); hypre_ParVectorInitialize(eVtemp2_l[l + 1]); } /* if (l < edge_numlevels) */ } /* for (l = 0; l < (en_numlevels - 1); l++) */ /* possible to have more edge levels */ for (l = (en_numlevels - 1); l < (edge_numlevels - 1); l++) { if (!constant_coef) { void *PTopology_vdata; hypre_PTopology *PTopology; hypre_CreatePTopology(&PTopology_vdata); if (ndim > 2) { Pe_l[l] = hypre_Maxwell_PTopology(topological_edge[l], topological_edge[l + 1], topological_face[l], topological_face[l + 1], topological_cell[l], topological_cell[l + 1], Aee_l[l], rfactor, PTopology_vdata); } else { Pe_l[l] = hypre_Maxwell_PTopology(topological_edge[l], topological_edge[l + 1], topological_edge[l], topological_edge[l + 1], topological_cell[l], topological_cell[l + 1], Aee_l[l], rfactor, PTopology_vdata); } PTopology = (hypre_PTopology*)PTopology_vdata; /* extract off-processors rows of Pe_l[l]. Needed for amge.*/ hypre_SStructSharedDOF_ParcsrMatRowsComm(egrid_l[l], (hypre_ParCSRMatrix *) hypre_IJMatrixObject(Pe_l[l]), &num_OffProcRows, &OffProcRows); if (ndim == 3) { hypre_ND1AMGeInterpolation(Aee_l[l], (hypre_ParCSRMatrix *) hypre_IJMatrixObject(PTopology -> Element_iedge), (hypre_ParCSRMatrix *) hypre_IJMatrixObject(PTopology -> Face_iedge), (hypre_ParCSRMatrix *) hypre_IJMatrixObject(PTopology -> Edge_iedge), (hypre_ParCSRMatrix *) hypre_IJMatrixObject(PTopology -> Element_Face), (hypre_ParCSRMatrix *) hypre_IJMatrixObject(PTopology -> Element_Edge), num_OffProcRows, OffProcRows, Pe_l[l]); } else { hypre_ND1AMGeInterpolation(Aee_l[l], (hypre_ParCSRMatrix *) hypre_IJMatrixObject(PTopology -> Element_iedge), (hypre_ParCSRMatrix *) hypre_IJMatrixObject(PTopology -> Edge_iedge), (hypre_ParCSRMatrix *) hypre_IJMatrixObject(PTopology -> Edge_iedge), (hypre_ParCSRMatrix *) hypre_IJMatrixObject(PTopology -> Element_Edge), (hypre_ParCSRMatrix *) hypre_IJMatrixObject(PTopology -> Element_Edge), num_OffProcRows, OffProcRows, Pe_l[l]); } hypre_DestroyPTopology(PTopology_vdata); for (i = 0; i < num_OffProcRows; i++) { hypre_MaxwellOffProcRowDestroy((void *) OffProcRows[i]); } hypre_TFree(OffProcRows, HYPRE_MEMORY_HOST); } else { Pe_l[l] = hypre_Maxwell_PNedelec(topological_edge[l], topological_edge[l + 1], rfactor); } ReT_l[l] = Pe_l[l]; hypre_BoomerAMGBuildCoarseOperator( (hypre_ParCSRMatrix *) hypre_IJMatrixObject(Pe_l[l]), Aee_l[l], (hypre_ParCSRMatrix *) hypre_IJMatrixObject(Pe_l[l]), &Aee_l[l + 1]); /* zero off boundary points */ hypre_ParCSRMatrixEliminateRowsCols(Aee_l[l + 1], BdryRanksCnts_l[l + 1], BdryRanks_l[l + 1]); xe_l[l + 1] = hypre_ParVectorCreate(hypre_ParCSRMatrixComm(Aee_l[l + 1]), hypre_ParCSRMatrixGlobalNumRows(Aee_l[l + 1]), hypre_ParCSRMatrixRowStarts(Aee_l[l + 1])); hypre_ParVectorInitialize(xe_l[l + 1]); be_l[l + 1] = hypre_ParVectorCreate(hypre_ParCSRMatrixComm(Aee_l[l + 1]), hypre_ParCSRMatrixGlobalNumRows(Aee_l[l + 1]), hypre_ParCSRMatrixRowStarts(Aee_l[l + 1])); hypre_ParVectorInitialize(be_l[l + 1]); ee_l[l + 1] = hypre_ParVectorCreate(hypre_ParCSRMatrixComm(Aee_l[l + 1]), hypre_ParCSRMatrixGlobalNumRows(Aee_l[l + 1]), hypre_ParCSRMatrixRowStarts(Aee_l[l + 1])); hypre_ParVectorInitialize(ee_l[l + 1]); rese_l[l + 1] = hypre_ParVectorCreate(hypre_ParCSRMatrixComm(Aee_l[l + 1]), hypre_ParCSRMatrixGlobalNumRows(Aee_l[l + 1]), hypre_ParCSRMatrixRowStarts(Aee_l[l + 1])); hypre_ParVectorInitialize(rese_l[l + 1]); eVtemp_l[l + 1] = hypre_ParVectorCreate(hypre_ParCSRMatrixComm(Aee_l[l + 1]), hypre_ParCSRMatrixGlobalNumRows(Aee_l[l + 1]), hypre_ParCSRMatrixRowStarts(Aee_l[l + 1])); hypre_ParVectorInitialize(eVtemp_l[l + 1]); eVtemp2_l[l + 1] = hypre_ParVectorCreate(hypre_ParCSRMatrixComm(Aee_l[l + 1]), hypre_ParCSRMatrixGlobalNumRows(Aee_l[l + 1]), hypre_ParCSRMatrixRowStarts(Aee_l[l + 1])); hypre_ParVectorInitialize(eVtemp2_l[l + 1]); } /* Can delete all topological grids. Not even referenced in IJMatrices. */ for (l = 0; l < edge_numlevels; l++) { HYPRE_SStructGridDestroy(topological_edge[l]); HYPRE_SStructGridDestroy(topological_cell[l]); if (ndim > 2) { HYPRE_SStructGridDestroy(topological_face[l]); } } hypre_TFree(topological_edge, HYPRE_MEMORY_HOST); hypre_TFree(topological_cell, HYPRE_MEMORY_HOST); if (ndim > 2) { hypre_TFree(topological_face, HYPRE_MEMORY_HOST); } #if DEBUG #endif (maxwell_TV_data -> Aee_l) = Aee_l; (maxwell_TV_data -> Aen_l) = Aen_l; (maxwell_TV_data -> Pe_l) = Pe_l; (maxwell_TV_data -> ReT_l) = ReT_l; (maxwell_TV_data -> xe_l) = xe_l; (maxwell_TV_data -> be_l) = be_l; (maxwell_TV_data -> ee_l) = ee_l; (maxwell_TV_data -> rese_l) = rese_l; (maxwell_TV_data -> eVtemp_l) = eVtemp_l; (maxwell_TV_data -> eVtemp2_l) = eVtemp2_l; /*----------------------------------------------------- * Determine relaxation parameters for edge problems. * Needed for quick parallel over/under-relaxation. *-----------------------------------------------------*/ erelax_type = 2; erelax_weight = hypre_TAlloc(HYPRE_Real, edge_numlevels, HYPRE_MEMORY_HOST); eomega = hypre_TAlloc(HYPRE_Real, edge_numlevels, HYPRE_MEMORY_HOST); eCF_marker_l = hypre_TAlloc(HYPRE_Int *, edge_numlevels, HYPRE_MEMORY_HOST); #if 0 relax_type = 6; /* SSOR */ for (l = 0; l < 1; l++) { erelax_weight[l] = 1.0; eCF_marker_l[l] = NULL; e_amg_vdata = (void *) hypre_BoomerAMGCreate(); e_amgData = e_amg_vdata; relax_types = hypre_CTAlloc(HYPRE_Int, 2, HYPRE_MEMORY_HOST); relax_types[1] = relax_type; amg_CF_marker = hypre_TAlloc(HYPRE_Int *, 1, HYPRE_MEMORY_HOST); A_array = hypre_TAlloc(hypre_ParCSRMatrix *, 1, HYPRE_MEMORY_HOST); amg_CF_marker[0] = NULL; A_array[0] = Aee_l[l]; (e_amgData -> CF_marker_array) = amg_CF_marker; (e_amgData -> A_array) = A_array; (e_amgData -> Vtemp ) = eVtemp_l[l]; (e_amgData -> grid_relax_type) = relax_types; (e_amgData -> smooth_num_levels) = 0; (e_amgData -> smooth_type) = 0; hypre_BoomerAMGCGRelaxWt((void *) e_amgData, 0, numCGSweeps, &eomega[l]); hypre_TFree((e_amgData -> A_array), HYPRE_MEMORY_HOST); hypre_TFree((e_amgData -> CF_marker_array), HYPRE_MEMORY_HOST); hypre_TFree((e_amgData -> grid_relax_type), HYPRE_MEMORY_HOST); (e_amgData -> A_array) = NULL; (e_amgData -> Vtemp ) = NULL; (e_amgData -> CF_marker_array) = NULL; (e_amgData -> grid_relax_type) = NULL; hypre_TFree(e_amg_vdata, HYPRE_MEMORY_HOST); eomega[l] = 1.0; } #endif for (l = 0; l < edge_numlevels; l++) { erelax_weight[l] = 1.0; eomega[l] = 1.0; eCF_marker_l[l] = NULL; } (maxwell_TV_data -> erelax_type) = erelax_type; (maxwell_TV_data -> erelax_weight) = erelax_weight; (maxwell_TV_data -> eomega) = eomega; (maxwell_TV_data -> eCF_marker_l) = eCF_marker_l; /*----------------------------------------------------- * Allocate space for log info *-----------------------------------------------------*/ if ((maxwell_TV_data -> logging) > 0) { i = (maxwell_TV_data -> max_iter); (maxwell_TV_data -> norms) = hypre_TAlloc(HYPRE_Real, i, HYPRE_MEMORY_HOST); (maxwell_TV_data -> rel_norms) = hypre_TAlloc(HYPRE_Real, i, HYPRE_MEMORY_HOST); } return ierr; } HYPRE_Int hypre_CoarsenPGrid( hypre_SStructGrid *fgrid, hypre_Index index, hypre_Index stride, HYPRE_Int part, hypre_SStructGrid *cgrid, HYPRE_Int *nboxes) { HYPRE_Int ierr = 0; hypre_SStructPGrid *pgrid = hypre_SStructGridPGrid(fgrid, part); hypre_StructGrid *sgrid = hypre_SStructPGridCellSGrid(pgrid); hypre_BoxArray *boxes; hypre_Box *box, *contract_box; HYPRE_Int i; /*----------------------------------------- * Set the coarse sgrid *-----------------------------------------*/ boxes = hypre_BoxArrayDuplicate(hypre_StructGridBoxes(sgrid)); for (i = 0; i < hypre_BoxArraySize(boxes); i++) { box = hypre_BoxArrayBox(boxes, i); /* contract box so that divisible by stride */ contract_box = hypre_BoxContraction(box, sgrid, stride); hypre_ProjectBox(contract_box, index, stride); hypre_StructMapFineToCoarse(hypre_BoxIMin(contract_box), index, stride, hypre_BoxIMin(contract_box)); hypre_StructMapFineToCoarse(hypre_BoxIMax(contract_box), index, stride, hypre_BoxIMax(contract_box)); /* set box even if zero volume but don't count it */ HYPRE_SStructGridSetExtents(cgrid, part, hypre_BoxIMin(contract_box), hypre_BoxIMax(contract_box)); if ( hypre_BoxVolume(contract_box) ) { *nboxes = *nboxes + 1; } hypre_BoxDestroy(contract_box); } hypre_BoxArrayDestroy(boxes); return ierr; } /*-------------------------------------------------------------------------- * Contracts a box so that the resulting box divides evenly into rfactor. * Contraction is done in the (+) or (-) direction that does not have * neighbor boxes, or if both directions have neighbor boxes, the (-) side * is contracted. * Modified to use box manager AHB 11/06 *--------------------------------------------------------------------------*/ hypre_Box * hypre_BoxContraction( hypre_Box *box, hypre_StructGrid *sgrid, hypre_Index rfactor ) { hypre_BoxManager *boxman = hypre_StructGridBoxMan(sgrid); hypre_BoxArray *neighbor_boxes = NULL; hypre_Box *nbox; hypre_Box *contracted_box; hypre_Box *shifted_box; hypre_Box intersect_box; HYPRE_Int ndim = hypre_StructGridNDim(sgrid); hypre_Index remainder, box_width; HYPRE_Int i, j, k, p; HYPRE_Int npos, nneg; /* get the boxes out of the box manager - use these as the neighbor boxes */ neighbor_boxes = hypre_BoxArrayCreate(0, ndim); hypre_BoxManGetAllEntriesBoxes( boxman, neighbor_boxes); hypre_BoxInit(&intersect_box, ndim); contracted_box = hypre_BoxCreate(ndim); hypre_ClearIndex(remainder); p = 0; for (i = 0; i < ndim; i++) { j = hypre_BoxIMax(box)[i] - hypre_BoxIMin(box)[i] + 1; box_width[i] = j; k = j % rfactor[i]; if (k) { remainder[i] = k; p++; } } hypre_CopyBox(box, contracted_box); if (p) { shifted_box = hypre_BoxCreate(ndim); for (i = 0; i < ndim; i++) { if (remainder[i]) /* non-divisible in the i'th direction */ { /* shift box in + & - directions to determine which side to contract. */ hypre_CopyBox(box, shifted_box); hypre_BoxIMax(shifted_box)[i] += box_width[i]; hypre_BoxIMin(shifted_box)[i] += box_width[i]; npos = 0; hypre_ForBoxI(k, neighbor_boxes) { nbox = hypre_BoxArrayBox(neighbor_boxes, k); hypre_IntersectBoxes(shifted_box, nbox, &intersect_box); if (hypre_BoxVolume(&intersect_box)) { npos++; } } hypre_CopyBox(box, shifted_box); hypre_BoxIMax(shifted_box)[i] -= box_width[i]; hypre_BoxIMin(shifted_box)[i] -= box_width[i]; nneg = 0; hypre_ForBoxI(k, neighbor_boxes) { nbox = hypre_BoxArrayBox(neighbor_boxes, k); hypre_IntersectBoxes(shifted_box, nbox, &intersect_box); if (hypre_BoxVolume(&intersect_box)) { nneg++; } } if ( (npos) || ( (!npos) && (!nneg) ) ) { /* contract - direction */ hypre_BoxIMin(contracted_box)[i] += remainder[i]; } else { if (nneg) { /* contract + direction */ hypre_BoxIMax(contracted_box)[i] -= remainder[i]; } } } /* if (remainder[i]) */ } /* for (i= 0; i< ndim; i++) */ hypre_BoxDestroy(shifted_box); } /* if (p) */ hypre_BoxArrayDestroy(neighbor_boxes); return contracted_box; } hypre-2.33.0/src/sstruct_ls/maxwell_grad.c000066400000000000000000000701721477326011500205510ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * OpenMP Problems * * Need to fix the way these variables are set and incremented in loops: * i, nrows (only where they are listed at the end of SMP_PRIVATE) * * Are private static arrays a problem? * ******************************************************************************/ #include "_hypre_sstruct_ls.h" /*-------------------------------------------------------------------------- * hypre_Maxwell_Grad.c * Forms a node-to-edge gradient operator. Looping over the * edge grid so that each processor fills up only its own rows. Each * processor will have its processor interface nodal ranks. * Loops over two types of boxes, interior of grid boxes and boundary * of boxes. Algo: * find all nodal and edge physical boundary points and set * the appropriate flag to be 0 at a boundary dof. * set -1's in value array * for each edge box, * for interior * { * connect edge ijk (row) to nodes (col) connected to this edge * and change -1 to 1 if needed; * } * for boundary layers * { * if edge not on the physical boundary connect only the nodes * that are not on the physical boundary * } * set parcsr matrix with values; * * Note that the nodes that are on the processor interface can be * on the physical boundary. But the off-proc edges connected to this * type of node will be a physical boundary edge. * *--------------------------------------------------------------------------*/ hypre_ParCSRMatrix * hypre_Maxwell_Grad(hypre_SStructGrid *grid) { MPI_Comm comm = (grid -> comm); HYPRE_IJMatrix T_grad; hypre_ParCSRMatrix *parcsr_grad; HYPRE_Int matrix_type = HYPRE_PARCSR; hypre_SStructGrid *node_grid, *edge_grid; hypre_SStructPGrid *pgrid; hypre_StructGrid *var_grid; hypre_BoxArray *boxes, *tmp_box_array1, *tmp_box_array2; hypre_BoxArray *edge_boxes, *cell_boxes; hypre_Box *box, *cell_box; hypre_Box layer, interior_box; hypre_Box *box_piece; hypre_BoxManager *boxman; hypre_BoxManEntry *entry; HYPRE_BigInt *inode, *jedge; HYPRE_Int nrows, nnodes, *nflag, *eflag, *ncols; HYPRE_Real *vals; hypre_Index index; hypre_Index loop_size, start, lindex; hypre_Index shift, shift2; hypre_Index *offsets, *varoffsets; HYPRE_Int nparts = hypre_SStructGridNParts(grid); HYPRE_Int ndim = hypre_SStructGridNDim(grid); HYPRE_SStructVariable vartype_node, *vartype_edges; HYPRE_SStructVariable *vartypes; HYPRE_Int nvars, part; HYPRE_BigInt m; HYPRE_Int i, j, k, n, d; HYPRE_Int *direction, ndirection; HYPRE_BigInt ilower, iupper; HYPRE_BigInt jlower, jupper; HYPRE_BigInt start_rank1, start_rank2, rank; HYPRE_Int myproc; HYPRE_MemoryLocation memory_location; hypre_BoxInit(&layer, ndim); hypre_BoxInit(&interior_box, ndim); hypre_MPI_Comm_rank(comm, &myproc); hypre_ClearIndex(shift); hypre_SetIndex(shift, -1); hypre_SetIndex(lindex, 0); /* To get the correct ranks, separate node & edge grids must be formed. Note that the edge vars must be ordered the same way as is in grid.*/ HYPRE_SStructGridCreate(comm, ndim, nparts, &node_grid); HYPRE_SStructGridCreate(comm, ndim, nparts, &edge_grid); vartype_node = HYPRE_SSTRUCT_VARIABLE_NODE; vartype_edges = hypre_TAlloc(HYPRE_SStructVariable, ndim, HYPRE_MEMORY_HOST); /* Assuming the same edge variable types on all parts */ pgrid = hypre_SStructGridPGrid(grid, 0); vartypes = hypre_SStructPGridVarTypes(pgrid); nvars = hypre_SStructPGridNVars(pgrid); k = 0; for (i = 0; i < nvars; i++) { j = vartypes[i]; switch (j) { case 2: { vartype_edges[k] = HYPRE_SSTRUCT_VARIABLE_XFACE; k++; break; } case 3: { vartype_edges[k] = HYPRE_SSTRUCT_VARIABLE_YFACE; k++; break; } case 5: { vartype_edges[k] = HYPRE_SSTRUCT_VARIABLE_XEDGE; k++; break; } case 6: { vartype_edges[k] = HYPRE_SSTRUCT_VARIABLE_YEDGE; k++; break; } case 7: { vartype_edges[k] = HYPRE_SSTRUCT_VARIABLE_ZEDGE; k++; break; } } /* switch(j) */ } /* for (i= 0; i< nvars; i++) */ for (part = 0; part < nparts; part++) { pgrid = hypre_SStructGridPGrid(grid, part); var_grid = hypre_SStructPGridCellSGrid(pgrid) ; boxes = hypre_StructGridBoxes(var_grid); hypre_ForBoxI(j, boxes) { box = hypre_BoxArrayBox(boxes, j); HYPRE_SStructGridSetExtents(node_grid, part, hypre_BoxIMin(box), hypre_BoxIMax(box)); HYPRE_SStructGridSetExtents(edge_grid, part, hypre_BoxIMin(box), hypre_BoxIMax(box)); } HYPRE_SStructGridSetVariables(node_grid, part, 1, &vartype_node); HYPRE_SStructGridSetVariables(edge_grid, part, ndim, vartype_edges); } HYPRE_SStructGridAssemble(node_grid); HYPRE_SStructGridAssemble(edge_grid); /* CREATE IJ_MATRICES- need to find the size of each one. Notice that the row and col ranks of these matrices can be created using only grid information. Grab the first part, first variable, first box, and lower index (lower rank); Grab the last part, last variable, last box, and upper index (upper rank). */ /* Grad: node(col) -> edge(row). Same for 2-d and 3-d */ /* lower rank */ part = 0; i = 0; hypre_SStructGridBoxProcFindBoxManEntry(edge_grid, part, 0, i, myproc, &entry); pgrid = hypre_SStructGridPGrid(edge_grid, part); var_grid = hypre_SStructPGridSGrid(pgrid, 0); boxes = hypre_StructGridBoxes(var_grid); box = hypre_BoxArrayBox(boxes, 0); hypre_SStructBoxManEntryGetGlobalCSRank(entry, hypre_BoxIMin(box), &ilower); hypre_SStructGridBoxProcFindBoxManEntry(node_grid, part, 0, i, myproc, &entry); pgrid = hypre_SStructGridPGrid(node_grid, part); var_grid = hypre_SStructPGridSGrid(pgrid, 0); boxes = hypre_StructGridBoxes(var_grid); box = hypre_BoxArrayBox(boxes, 0); hypre_SStructBoxManEntryGetGlobalCSRank(entry, hypre_BoxIMin(box), &jlower); /* upper rank */ part = nparts - 1; pgrid = hypre_SStructGridPGrid(edge_grid, part); nvars = hypre_SStructPGridNVars(pgrid); var_grid = hypre_SStructPGridSGrid(pgrid, nvars - 1); boxes = hypre_StructGridBoxes(var_grid); box = hypre_BoxArrayBox(boxes, hypre_BoxArraySize(boxes) - 1); hypre_SStructGridBoxProcFindBoxManEntry(edge_grid, part, nvars - 1, hypre_BoxArraySize(boxes) - 1, myproc, &entry); hypre_SStructBoxManEntryGetGlobalCSRank(entry, hypre_BoxIMax(box), &iupper); pgrid = hypre_SStructGridPGrid(node_grid, part); nvars = hypre_SStructPGridNVars(pgrid); var_grid = hypre_SStructPGridSGrid(pgrid, nvars - 1); boxes = hypre_StructGridBoxes(var_grid); box = hypre_BoxArrayBox(boxes, hypre_BoxArraySize(boxes) - 1); hypre_SStructGridBoxProcFindBoxManEntry(node_grid, part, nvars - 1, hypre_BoxArraySize(boxes) - 1, myproc, &entry); hypre_SStructBoxManEntryGetGlobalCSRank(entry, hypre_BoxIMax(box), &jupper); HYPRE_IJMatrixCreate(comm, ilower, iupper, jlower, jupper, &T_grad); HYPRE_IJMatrixSetObjectType(T_grad, HYPRE_PARCSR); HYPRE_IJMatrixInitialize(T_grad); memory_location = hypre_IJMatrixMemoryLocation(T_grad); /*------------------------------------------------------------------------------ * fill up the parcsr matrix. *------------------------------------------------------------------------------*/ /* count the no. of rows. Make sure repeated nodes along the boundaries are counted.*/ nrows = 0; nnodes = 0; for (part = 0; part < nparts; part++) { pgrid = hypre_SStructGridPGrid(edge_grid, part); nvars = hypre_SStructPGridNVars(pgrid); for (m = 0; m < nvars; m++) { var_grid = hypre_SStructPGridSGrid(pgrid, m); boxes = hypre_StructGridBoxes(var_grid); hypre_ForBoxI(j, boxes) { box = hypre_BoxArrayBox(boxes, j); /* make slightly bigger to handle any shared nodes */ hypre_CopyBox(box, &layer); hypre_AddIndexes(hypre_BoxIMin(&layer), shift, 3, hypre_BoxIMin(&layer)); hypre_SubtractIndexes(hypre_BoxIMax(&layer), shift, 3, hypre_BoxIMax(&layer)); nrows += hypre_BoxVolume(&layer); } } pgrid = hypre_SStructGridPGrid(node_grid, part); var_grid = hypre_SStructPGridSGrid(pgrid, 0); /* only one variable grid */ boxes = hypre_StructGridBoxes(var_grid); hypre_ForBoxI(j, boxes) { box = hypre_BoxArrayBox(boxes, j); /* make slightly bigger to handle any shared nodes */ hypre_CopyBox(box, &layer); hypre_AddIndexes(hypre_BoxIMin(&layer), shift, 3, hypre_BoxIMin(&layer)); hypre_SubtractIndexes(hypre_BoxIMax(&layer), shift, 3, hypre_BoxIMax(&layer)); nnodes += hypre_BoxVolume(&layer); } } eflag = hypre_CTAlloc(HYPRE_Int, nrows, HYPRE_MEMORY_HOST); nflag = hypre_CTAlloc(HYPRE_Int, nnodes, HYPRE_MEMORY_HOST); /* Set eflag to have the number of nodes connected to an edge (2) and nflag to have the number of edges connect to a node. */ for (i = 0; i < nrows; i++) { eflag[i] = 2; } j = 2 * ndim; for (i = 0; i < nnodes; i++) { nflag[i] = j; } /* Determine physical boundary points. Get the rank and set flag[rank]= 0. This will boundary dof, i.e., flag[rank]= 0 will flag a boundary dof. */ start_rank1 = hypre_SStructGridStartRank(node_grid); start_rank2 = hypre_SStructGridStartRank(edge_grid); for (part = 0; part < nparts; part++) { /* node flag */ pgrid = hypre_SStructGridPGrid(node_grid, part); var_grid = hypre_SStructPGridSGrid(pgrid, 0); boxes = hypre_StructGridBoxes(var_grid); boxman = hypre_SStructGridBoxManager(node_grid, part, 0); hypre_ForBoxI(j, boxes) { box = hypre_BoxArrayBox(boxes, j); hypre_BoxManGetEntry(boxman, myproc, j, &entry); i = hypre_BoxVolume(box); tmp_box_array1 = hypre_BoxArrayCreate(0, ndim); hypre_BoxBoundaryG(box, var_grid, tmp_box_array1); for (m = 0; m < hypre_BoxArraySize(tmp_box_array1); m++) { box_piece = hypre_BoxArrayBox(tmp_box_array1, m); if (hypre_BoxVolume(box_piece) < i) { hypre_BoxGetSize(box_piece, loop_size); hypre_CopyIndex(hypre_BoxIMin(box_piece), start); hypre_SerialBoxLoop0Begin(ndim, loop_size); { zypre_BoxLoopGetIndex(lindex); hypre_SetIndex3(index, lindex[0], lindex[1], lindex[2]); hypre_AddIndexes(index, start, 3, index); hypre_SStructBoxManEntryGetGlobalRank(entry, index, &rank, matrix_type); nflag[rank - start_rank1] = 0; } hypre_SerialBoxLoop0End(); } /* if (hypre_BoxVolume(box_piece) < i) */ } /* for (m= 0; m< hypre_BoxArraySize(tmp_box_array1); m++) */ hypre_BoxArrayDestroy(tmp_box_array1); } /* hypre_ForBoxI(j, boxes) */ /*----------------------------------------------------------------- * edge flag. Since we want only the edges that completely lie * on a boundary, whereas the boundary extraction routines mark * edges that touch the boundary, we need to call the boundary * routines in appropriate directions: * 2-d horizontal edges (y faces)- search in j directions * 2-d vertical edges (x faces) - search in i directions * 3-d x edges - search in j,k directions * 3-d y edges - search in i,k directions * 3-d z edges - search in i,j directions *-----------------------------------------------------------------*/ pgrid = hypre_SStructGridPGrid(edge_grid, part); nvars = hypre_SStructPGridNVars(pgrid); direction = hypre_TAlloc(HYPRE_Int, 2, HYPRE_MEMORY_HOST); /* only two directions at most */ for (m = 0; m < nvars; m++) { var_grid = hypre_SStructPGridSGrid(pgrid, m); boxes = hypre_StructGridBoxes(var_grid); boxman = hypre_SStructGridBoxManager(edge_grid, part, m); j = vartype_edges[m]; switch (j) { case 2: /* x faces, 2d */ { ndirection = 1; direction[0] = 0; break; } case 3: /* y faces, 2d */ { ndirection = 1; direction[0] = 1; break; } case 5: /* x edges, 3d */ { ndirection = 2; direction[0] = 1; direction[1] = 2; break; } case 6: /* y edges, 3d */ { ndirection = 2; direction[0] = 0; direction[1] = 2; break; } case 7: /* z edges, 3d */ { ndirection = 2; direction[0] = 0; direction[1] = 1; break; } default: { ndirection = 0; } } /* switch(j) */ hypre_ForBoxI(j, boxes) { box = hypre_BoxArrayBox(boxes, j); hypre_BoxManGetEntry(boxman, myproc, j, &entry); i = hypre_BoxVolume(box); for (d = 0; d < ndirection; d++) { tmp_box_array1 = hypre_BoxArrayCreate(0, ndim); tmp_box_array2 = hypre_BoxArrayCreate(0, ndim); hypre_BoxBoundaryDG(box, var_grid, tmp_box_array1, tmp_box_array2, direction[d]); for (k = 0; k < hypre_BoxArraySize(tmp_box_array1); k++) { box_piece = hypre_BoxArrayBox(tmp_box_array1, k); if (hypre_BoxVolume(box_piece) < i) { hypre_BoxGetSize(box_piece, loop_size); hypre_CopyIndex(hypre_BoxIMin(box_piece), start); hypre_SerialBoxLoop0Begin(ndim, loop_size); { zypre_BoxLoopGetIndex(lindex); hypre_SetIndex3(index, lindex[0], lindex[1], lindex[2]); hypre_AddIndexes(index, start, 3, index); hypre_SStructBoxManEntryGetGlobalRank(entry, index, &rank, matrix_type); eflag[rank - start_rank2] = 0; } hypre_SerialBoxLoop0End(); } /* if (hypre_BoxVolume(box_piece) < i) */ } /* for (k= 0; k< hypre_BoxArraySize(tmp_box_array1); k++) */ hypre_BoxArrayDestroy(tmp_box_array1); for (k = 0; k < hypre_BoxArraySize(tmp_box_array2); k++) { box_piece = hypre_BoxArrayBox(tmp_box_array2, k); if (hypre_BoxVolume(box_piece) < i) { hypre_BoxGetSize(box_piece, loop_size); hypre_CopyIndex(hypre_BoxIMin(box_piece), start); hypre_SerialBoxLoop0Begin(ndim, loop_size); { zypre_BoxLoopGetIndex(lindex); hypre_SetIndex3(index, lindex[0], lindex[1], lindex[2]); hypre_AddIndexes(index, start, 3, index); hypre_SStructBoxManEntryGetGlobalRank(entry, index, &rank, matrix_type); eflag[rank - start_rank2] = 0; } hypre_SerialBoxLoop0End(); } /* if (hypre_BoxVolume(box_piece) < i) */ } /* for (k= 0; k< hypre_BoxArraySize(tmp_box_array2); k++) */ hypre_BoxArrayDestroy(tmp_box_array2); } /* for (d= 0; d< ndirection; d++) */ } /* hypre_ForBoxI(j, boxes) */ } /* for (m= 0; m< nvars; m++) */ hypre_TFree(direction, HYPRE_MEMORY_HOST); } /* for (part= 0; part< nparts; part++) */ /* set vals. Will have more memory than is needed- extra allotted for repeated nodes. */ inode = hypre_CTAlloc(HYPRE_BigInt, nrows, memory_location); ncols = hypre_CTAlloc(HYPRE_Int, nrows, memory_location); /* each row can have at most two columns */ k = 2 * nrows; jedge = hypre_CTAlloc(HYPRE_BigInt, k, memory_location); vals = hypre_TAlloc(HYPRE_Real, k, memory_location); for (i = 0; i < k; i++) { vals[i] = -1.0; } /* to get the correct col connection to each node, we need to offset index ijk. Determine these. Assuming the same var ordering for each part. Note that these are not the variable offsets. */ offsets = hypre_TAlloc(hypre_Index, ndim, HYPRE_MEMORY_HOST); varoffsets = hypre_TAlloc(hypre_Index, ndim, HYPRE_MEMORY_HOST); for (i = 0; i < ndim; i++) { j = vartype_edges[i]; hypre_SStructVariableGetOffset(vartype_edges[i], ndim, varoffsets[i]); switch (j) { case 2: { hypre_SetIndex3(offsets[i], 0, 1, 0); break; } case 3: { hypre_SetIndex3(offsets[i], 1, 0, 0); break; } case 5: { hypre_SetIndex3(offsets[i], 1, 0, 0); break; } case 6: { hypre_SetIndex3(offsets[i], 0, 1, 0); break; } case 7: { hypre_SetIndex3(offsets[i], 0, 0, 1); break; } } /* switch(j) */ } /* for (i= 0; i< ndim; i++) */ nrows = 0; i = 0; for (part = 0; part < nparts; part++) { /* grab boxarray for node rank extracting later */ pgrid = hypre_SStructGridPGrid(node_grid, part); var_grid = hypre_SStructPGridSGrid(pgrid, 0); /* grab edge structures */ pgrid = hypre_SStructGridPGrid(edge_grid, part); /* the cell-centred reference box is used to get the correct interior edge box. For parallel distribution of the edge grid, simple contraction of the edge box does not get the correct interior edge box. Need to contract the cell box. */ var_grid = hypre_SStructPGridCellSGrid(pgrid); cell_boxes = hypre_StructGridBoxes(var_grid); nvars = hypre_SStructPGridNVars(pgrid); for (n = 0; n < nvars; n++) { var_grid = hypre_SStructPGridSGrid(pgrid, n); edge_boxes = hypre_StructGridBoxes(var_grid); hypre_ForBoxI(j, edge_boxes) { box = hypre_BoxArrayBox(edge_boxes, j); cell_box = hypre_BoxArrayBox(cell_boxes, j); hypre_CopyBox(cell_box, &interior_box); /* shrink the cell_box to get the interior cell_box. All edges in the interior box should be on this proc. */ hypre_SubtractIndexes(hypre_BoxIMin(&interior_box), shift, 3, hypre_BoxIMin(&interior_box)); hypre_AddIndexes(hypre_BoxIMax(&interior_box), shift, 3, hypre_BoxIMax(&interior_box)); /* offset this to the variable interior box */ hypre_CopyBox(&interior_box, &layer); hypre_SubtractIndexes(hypre_BoxIMin(&layer), varoffsets[n], 3, hypre_BoxIMin(&layer)); hypre_BoxGetSize(&layer, loop_size); hypre_CopyIndex(hypre_BoxIMin(&layer), start); /* Interior box- loop over each edge and find the row rank and then the column ranks for the connected nodes. Change the appropriate values to 1. */ hypre_SerialBoxLoop0Begin(ndim, loop_size); { zypre_BoxLoopGetIndex(lindex); hypre_SetIndex3(index, lindex[0], lindex[1], lindex[2]); hypre_AddIndexes(index, start, 3, index); /* edge ijk connected to nodes ijk & ijk-offsets. Interior edges and so no boundary edges to consider. */ hypre_SStructGridFindBoxManEntry(edge_grid, part, index, n, &entry); hypre_SStructBoxManEntryGetGlobalRank(entry, index, &m, matrix_type); inode[nrows] = m; hypre_SStructGridFindBoxManEntry(node_grid, part, index, 0, &entry); hypre_SStructBoxManEntryGetGlobalRank(entry, index, &m, matrix_type); jedge[i] = m; vals[i] = 1.0; /* change only this connection */ i++; hypre_SubtractIndexes(index, offsets[n], 3, index); hypre_SStructGridFindBoxManEntry(node_grid, part, index, 0, &entry); hypre_SStructBoxManEntryGetGlobalRank(entry, index, &m, matrix_type); jedge[i] = m; i++; ncols[nrows] = 2; nrows++; } hypre_SerialBoxLoop0End(); /* now the boundary layers. To cases to consider: is the edge totally on the boundary or is the edge connected to the boundary. Need to check eflag & nflag. */ for (d = 0; d < ndim; d++) { /*shift the layer box in the correct direction and distance. distance= hypre_BoxIMax(box)[d]-hypre_BoxIMin(box)[d]+1-1 = hypre_BoxIMax(box)[d]-hypre_BoxIMin(box)[d] */ hypre_ClearIndex(shift2); shift2[d] = hypre_BoxIMax(box)[d] - hypre_BoxIMin(box)[d]; /* ndirection= 0 negative; ndirection= 1 positive */ for (ndirection = 0; ndirection < 2; ndirection++) { hypre_CopyBox(box, &layer); if (ndirection) { hypre_BoxShiftPos(&layer, shift2); } else { hypre_BoxShiftNeg(&layer, shift2); } hypre_IntersectBoxes(box, &layer, &layer); hypre_BoxGetSize(&layer, loop_size); hypre_CopyIndex(hypre_BoxIMin(&layer), start); hypre_SerialBoxLoop0Begin(ndim, loop_size); { zypre_BoxLoopGetIndex(lindex); hypre_SetIndex3(index, lindex[0], lindex[1], lindex[2]); hypre_AddIndexes(index, start, 3, index); /* edge ijk connects to nodes ijk & ijk+offsets. */ hypre_SStructGridFindBoxManEntry(edge_grid, part, index, n, &entry); hypre_SStructBoxManEntryGetGlobalRank(entry, index, &m, matrix_type); /* check if the edge lies on the boundary & if not check if the connecting node is on the boundary. */ if (eflag[m - start_rank2]) { inode[nrows] = m; /* edge not completely on the boundary. One connecting node must be in the interior. */ hypre_SStructGridFindBoxManEntry(node_grid, part, index, 0, &entry); hypre_SStructBoxManEntryGetGlobalRank(entry, index, &m, matrix_type); /* check if node on my processor. If not, the node must be in the interior (draw a diagram to see this). */ if (m >= start_rank1 && m <= jupper) { /* node on proc. Now check if on the boundary. */ if (nflag[m - start_rank1]) /* interior node */ { jedge[i] = m; vals[i] = 1.0; i++; ncols[nrows]++; } } else /* node off-proc */ { jedge[i] = m; vals[i] = 1.0; i++; ncols[nrows]++; } /* ijk+offsets */ hypre_SubtractIndexes(index, offsets[n], 3, index); hypre_SStructGridFindBoxManEntry(node_grid, part, index, 0, &entry); hypre_SStructBoxManEntryGetGlobalRank(entry, index, &m, matrix_type); /* boundary checks again */ if (m >= start_rank1 && m <= jupper) { /* node on proc. Now check if on the boundary. */ if (nflag[m - start_rank1]) /* interior node */ { jedge[i] = m; i++; ncols[nrows]++; } } else /* node off-proc */ { jedge[i] = m; i++; ncols[nrows]++; } nrows++; /* must have at least one node connection */ } /* if (eflag[m-start_rank2]) */ } hypre_SerialBoxLoop0End(); } /* for (ndirection= 0; ndirection< 2; ndirection++) */ } /* for (d= 0; d< ndim; d++) */ } /* hypre_ForBoxI(j, boxes) */ } /* for (n= 0; n< nvars; n++) */ } /* for (part= 0; part< nparts; part++) */ hypre_TFree(offsets, HYPRE_MEMORY_HOST); hypre_TFree(varoffsets, HYPRE_MEMORY_HOST); hypre_TFree(vartype_edges, HYPRE_MEMORY_HOST); HYPRE_SStructGridDestroy(node_grid); HYPRE_SStructGridDestroy(edge_grid); HYPRE_IJMatrixSetValues(T_grad, nrows, ncols, (const HYPRE_BigInt*) inode, (const HYPRE_BigInt*) jedge, (const HYPRE_Real*) vals); HYPRE_IJMatrixAssemble(T_grad); hypre_TFree(eflag, HYPRE_MEMORY_HOST); hypre_TFree(nflag, HYPRE_MEMORY_HOST); hypre_TFree(ncols, memory_location); hypre_TFree(inode, memory_location); hypre_TFree(jedge, memory_location); hypre_TFree(vals, memory_location); parcsr_grad = (hypre_ParCSRMatrix *) hypre_IJMatrixObject(T_grad); HYPRE_IJMatrixSetObjectType(T_grad, -1); HYPRE_IJMatrixDestroy(T_grad); return parcsr_grad; } hypre-2.33.0/src/sstruct_ls/maxwell_physbdy.c000066400000000000000000001104471477326011500213160ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * OpenMP Problems * * Need to fix the way these variables are set and incremented in loops: * cnt * ******************************************************************************/ #include "_hypre_sstruct_ls.h" /*-------------------------------------------------------------------------- * Finds the physical boundary boxes for all levels. Since the coarse grid's * boundary may not be on the physical bdry, we need to compare the coarse * grid to the finest level boundary boxes. All boxes of the coarse grids * must be checked, not just the bounding box. * Algo: * 1) obtain boundary boxes for the finest grid * i) mark the fboxes that have boundary elements. * 2) loop over coarse levels * i) for a cbox that maps to a fbox that has boundary layers * a) refine the cbox * b) intersect with the cell boundary layers of the fbox * c) coarsen the intersection * ii) determine the var boxes * iii) mark the coarse box * * Concerns: Checking an individual pgrid may give artificial physical * boundaries. Need to check if any other pgrid is adjacent to it. * We omit this case and assume only one part for now. *--------------------------------------------------------------------------*/ HYPRE_Int hypre_Maxwell_PhysBdy( hypre_SStructGrid **grid_l, HYPRE_Int num_levels, hypre_Index rfactors, HYPRE_Int ***BdryRanksl_ptr, HYPRE_Int **BdryRanksCntsl_ptr ) { MPI_Comm comm = (grid_l[0]-> comm); HYPRE_Int **BdryRanks_l; HYPRE_Int *BdryRanksCnts_l; HYPRE_Int *npts; HYPRE_BigInt *ranks, *upper_rank, *lower_rank; hypre_BoxManEntry *boxman_entry; hypre_SStructGrid *grid; hypre_SStructPGrid *pgrid; hypre_StructGrid *cell_fgrid, *cell_cgrid, *sgrid; hypre_BoxArrayArray ****bdry; hypre_BoxArrayArray *fbdry; hypre_BoxArrayArray *cbdry; hypre_BoxArray *box_array; hypre_BoxArray *fboxes, *cboxes; hypre_Box *fbox, *cbox; hypre_Box *box, *contract_fbox, rbox; hypre_Box intersect; HYPRE_Int **cbox_mapping = NULL, **fbox_mapping = NULL; HYPRE_Int **boxes_with_bdry; HYPRE_Int ndim, nvars; HYPRE_Int nboxes, nfboxes; HYPRE_Int boxi; hypre_Index zero_shift, upper_shift, lower_shift; hypre_Index loop_size, start, index, lindex; HYPRE_Int i, j, k, l, m, n, p; HYPRE_Int d; HYPRE_Int cnt; HYPRE_Int part = 0; /* NOTE, ASSUMING ONE PART */ HYPRE_Int matrix_type = HYPRE_PARCSR; HYPRE_Int myproc; HYPRE_Int ierr = 0; hypre_MPI_Comm_rank(comm, &myproc); ndim = hypre_SStructGridNDim(grid_l[0]); hypre_SetIndex(zero_shift, 0); hypre_SetIndex(lindex, 0); hypre_BoxInit(&intersect, ndim); /* bounding global ranks of this processor & allocate boundary box markers. */ upper_rank = hypre_CTAlloc(HYPRE_BigInt, num_levels, HYPRE_MEMORY_HOST); lower_rank = hypre_CTAlloc(HYPRE_BigInt, num_levels, HYPRE_MEMORY_HOST); boxes_with_bdry = hypre_TAlloc(HYPRE_Int *, num_levels, HYPRE_MEMORY_HOST); for (i = 0; i < num_levels; i++) { grid = grid_l[i]; lower_rank[i] = hypre_SStructGridStartRank(grid); /* note we are assuming only one part */ pgrid = hypre_SStructGridPGrid(grid, part); nvars = hypre_SStructPGridNVars(pgrid); sgrid = hypre_SStructPGridSGrid(pgrid, nvars - 1); box_array = hypre_StructGridBoxes(sgrid); box = hypre_BoxArrayBox(box_array, hypre_BoxArraySize(box_array) - 1); hypre_SStructGridBoxProcFindBoxManEntry(grid, part, nvars - 1, hypre_BoxArraySize(box_array) - 1, myproc, &boxman_entry); hypre_SStructBoxManEntryGetGlobalCSRank(boxman_entry, hypre_BoxIMax(box), &upper_rank[i]); sgrid = hypre_SStructPGridCellSGrid(pgrid); box_array = hypre_StructGridBoxes(sgrid); boxes_with_bdry[i] = hypre_CTAlloc(HYPRE_Int, hypre_BoxArraySize(box_array), HYPRE_MEMORY_HOST); } /*----------------------------------------------------------------------------- * construct box_number mapping between levels, and offset strides because of * projection coarsening. Note: from the way the coarse boxes are created and * numbered, to determine the coarse box that matches the fbox, we need to * only check the tail end of the list of cboxes. In fact, given fbox_i, * if it's coarsened extents do not interesect with the first coarse box of the * tail end, then this fbox vanishes in the coarsening. * c/fbox_mapping gives the fine/coarse box mapping between two consecutive levels * of the multilevel hierarchy. *-----------------------------------------------------------------------------*/ if (num_levels > 1) { cbox_mapping = hypre_CTAlloc(HYPRE_Int *, num_levels, HYPRE_MEMORY_HOST); fbox_mapping = hypre_CTAlloc(HYPRE_Int *, num_levels, HYPRE_MEMORY_HOST); } for (i = 0; i < (num_levels - 1); i++) { grid = grid_l[i]; pgrid = hypre_SStructGridPGrid(grid, 0); /* assuming one part */ cell_fgrid = hypre_SStructPGridCellSGrid(pgrid); fboxes = hypre_StructGridBoxes(cell_fgrid); nfboxes = hypre_BoxArraySize(hypre_StructGridBoxes(cell_fgrid)); fbox_mapping[i] = hypre_CTAlloc(HYPRE_Int, nfboxes, HYPRE_MEMORY_HOST); grid = grid_l[i + 1]; pgrid = hypre_SStructGridPGrid(grid, 0); /* assuming one part */ cell_cgrid = hypre_SStructPGridCellSGrid(pgrid); cboxes = hypre_StructGridBoxes(cell_cgrid); nboxes = hypre_BoxArraySize(hypre_StructGridBoxes(cell_cgrid)); cbox_mapping[i + 1] = hypre_CTAlloc(HYPRE_Int, nboxes, HYPRE_MEMORY_HOST); /* assuming if i1 > i2 and (box j1) is coarsened from (box i1) and (box j2) from (box i2), then j1 > j2. */ k = 0; hypre_ForBoxI(j, fboxes) { fbox = hypre_BoxArrayBox(fboxes, j); hypre_CopyBox(fbox, &rbox); hypre_ProjectBox(&rbox, zero_shift, rfactors); hypre_StructMapFineToCoarse(hypre_BoxIMin(&rbox), zero_shift, rfactors, hypre_BoxIMin(&rbox)); hypre_StructMapFineToCoarse(hypre_BoxIMax(&rbox), zero_shift, rfactors, hypre_BoxIMax(&rbox)); /* since the ordering of the cboxes was determined by the fbox ordering, we only have to check if the first cbox in the list intersects with rbox. If not, this fbox vanished in the coarsening. */ cbox = hypre_BoxArrayBox(cboxes, k); hypre_IntersectBoxes(&rbox, cbox, &rbox); if (hypre_BoxVolume(&rbox)) { cbox_mapping[i + 1][k] = j; fbox_mapping[i][j] = k; k++; } /* if (hypre_BoxVolume(&rbox)) */ } /* hypre_ForBoxI(j, fboxes) */ } /* for (i= 0; i< (num_levels-1); i++) */ bdry = hypre_TAlloc(hypre_BoxArrayArray ***, num_levels, HYPRE_MEMORY_HOST); npts = hypre_CTAlloc(HYPRE_Int, num_levels, HYPRE_MEMORY_HOST); /* finest level boundary determination */ grid = grid_l[0]; pgrid = hypre_SStructGridPGrid(grid, 0); /* assuming one part */ nvars = hypre_SStructPGridNVars(pgrid); cell_fgrid = hypre_SStructPGridCellSGrid(pgrid); nboxes = hypre_BoxArraySize(hypre_StructGridBoxes(cell_fgrid)); hypre_Maxwell_PNedelec_Bdy(cell_fgrid, pgrid, &bdry[0]); for (i = 0; i < nboxes; i++) { if (bdry[0][i]) /* boundary layers on box[i] */ { for (j = 0; j < nvars; j++) { fbdry = bdry[0][i][j + 1]; /*(j+1) since j= 0 stores cell-centred boxes*/ hypre_ForBoxArrayI(k, fbdry) { box_array = hypre_BoxArrayArrayBoxArray(fbdry, k); hypre_ForBoxI(p, box_array) { box = hypre_BoxArrayBox(box_array, p); npts[0] += hypre_BoxVolume(box); } } } /* for (j= 0; j< nvars; j++) */ boxes_with_bdry[0][i] = 1; /* mark this box as containing boundary layers */ } /* if (bdry[0][i]) */ } nfboxes = nboxes; /* coarser levels */ for (i = 1; i < num_levels; i++) { grid = grid_l[i - 1]; pgrid = hypre_SStructGridPGrid(grid, 0); /* assuming one part */ cell_fgrid = hypre_SStructPGridCellSGrid(pgrid); fboxes = hypre_StructGridBoxes(cell_fgrid); grid = grid_l[i]; pgrid = hypre_SStructGridPGrid(grid, 0); /* assuming one part */ cell_cgrid = hypre_SStructPGridCellSGrid(pgrid); nvars = hypre_SStructPGridNVars(pgrid); cboxes = hypre_StructGridBoxes(cell_cgrid); nboxes = hypre_BoxArraySize(hypre_StructGridBoxes(cell_cgrid)); bdry[i] = hypre_TAlloc(hypre_BoxArrayArray **, nboxes, HYPRE_MEMORY_HOST); p = 2 * (ndim - 1); for (j = 0; j < nboxes; j++) { bdry[i][j] = hypre_TAlloc(hypre_BoxArrayArray *, nvars + 1, HYPRE_MEMORY_HOST); /* cell grid boxarrayarray */ bdry[i][j][0] = hypre_BoxArrayArrayCreate(2 * ndim, ndim); /* var grid boxarrayarrays */ for (k = 0; k < nvars; k++) { bdry[i][j][k + 1] = hypre_BoxArrayArrayCreate(p, ndim); } } /* check if there are boundary points from the previous level */ for (j = 0; j < nfboxes; j++) { /* see if the j box of level (i-1) has any boundary layers */ if (boxes_with_bdry[i - 1][j]) { boxi = fbox_mapping[i - 1][j]; cbox = hypre_BoxArrayBox(cboxes, boxi); fbox = hypre_BoxArrayBox(fboxes, j); /* contract the fbox so that divisible in rfactor */ contract_fbox = hypre_BoxContraction(fbox, cell_fgrid, rfactors); /* refine the cbox. Expand the refined cbox so that the complete chunk of the fine box that coarsened to it is included. This requires some offsets */ hypre_ClearIndex(upper_shift); hypre_ClearIndex(lower_shift); for (k = 0; k < ndim; k++) { m = hypre_BoxIMin(contract_fbox)[k]; p = m % rfactors[k]; if (p > 0 && m > 0) { upper_shift[k] = p - 1; lower_shift[k] = p - rfactors[k]; } else { upper_shift[k] = rfactors[k] - p - 1; lower_shift[k] = -p; } } hypre_BoxDestroy(contract_fbox); hypre_CopyBox(cbox, &rbox); hypre_StructMapCoarseToFine(hypre_BoxIMin(&rbox), zero_shift, rfactors, hypre_BoxIMin(&rbox)); hypre_StructMapCoarseToFine(hypre_BoxIMax(&rbox), zero_shift, rfactors, hypre_BoxIMax(&rbox)); hypre_AddIndexes(lower_shift, hypre_BoxIMin(&rbox), 3, hypre_BoxIMin(&rbox)); hypre_AddIndexes(upper_shift, hypre_BoxIMax(&rbox), 3, hypre_BoxIMax(&rbox)); /* Determine, if any, boundary layers for this rbox. Since the boundaries of the coarser levels may not be physical, we cannot use hypre_BoxBoundaryDG. But accomplished through intersecting with the finer level boundary boxes. */ fbdry = bdry[i - 1][j][0]; /* cell-centred boundary layers of level (i-1) */ cbdry = bdry[i][boxi][0]; /* cell-centred boundary layers of level i */ /* fbdry is the cell-centred box_arrayarray. Contains an array of (2*ndim) boxarrays, one for each direction. */ cnt = 0; hypre_ForBoxArrayI(l, fbdry) { /* determine which boundary side we are doing. Depending on the boundary, when we coarsen the refined boundary layer, the extents may need to be changed, e.g., index[lower,j,k]= index[upper,j,k]. */ switch (l) { case 0: /* lower x direction, x_upper= x_lower */ { n = 1; /* n flags whether upper or lower to be replaced */ d = 0; /* x component */ break; } case 1: /* upper x direction, x_lower= x_upper */ { n = 0; /* n flags whether upper or lower to be replaced */ d = 0; /* x component */ break; } case 2: /* lower y direction, y_upper= y_lower */ { n = 1; /* n flags whether upper or lower to be replaced */ d = 1; /* y component */ break; } case 3: /* upper y direction, y_lower= y_upper */ { n = 0; /* n flags whether upper or lower to be replaced */ d = 1; /* y component */ break; } case 4: /* lower z direction, z_lower= z_upper */ { n = 1; /* n flags whether upper or lower to be replaced */ d = 2; /* z component */ break; } case 5: /* upper z direction, z_upper= z_lower */ { n = 0; /* n flags whether upper or lower to be replaced */ d = 2; /* z component */ break; } } box_array = hypre_BoxArrayArrayBoxArray(fbdry, l); hypre_ForBoxI(p, box_array) { hypre_IntersectBoxes(hypre_BoxArrayBox(box_array, p), &rbox, &intersect); if (hypre_BoxVolume(&intersect)) { /* coarsen the refined boundary box and append it to boxarray hypre_BoxArrayArrayBoxArray(cbdry, l) */ hypre_ProjectBox(&intersect, zero_shift, rfactors); hypre_StructMapFineToCoarse(hypre_BoxIMin(&intersect), zero_shift, rfactors, hypre_BoxIMin(&intersect)); hypre_StructMapFineToCoarse(hypre_BoxIMax(&intersect), zero_shift, rfactors, hypre_BoxIMax(&intersect)); /* the coarsened intersect box may be incorrect because of the box projecting formulas. */ if (n) /* replace upper by lower */ { hypre_BoxIMax(&intersect)[d] = hypre_BoxIMin(&intersect)[d]; } else /* replace lower by upper */ { hypre_BoxIMin(&intersect)[d] = hypre_BoxIMax(&intersect)[d]; } hypre_AppendBox(&intersect, hypre_BoxArrayArrayBoxArray(cbdry, l)); cnt++; /* counter to signal boundary layers for cbox boxi */ } /* if (hypre_BoxVolume(&intersect)) */ } /* hypre_ForBoxI(p, box_array) */ } /* hypre_ForBoxArrayI(l, fbdry) */ /* All the boundary box_arrayarrays have been checked for coarse boxi. Now get the variable boundary layers if any, count the number of boundary points, and appropriately mark boxi. */ if (cnt) { hypre_Maxwell_VarBdy(pgrid, bdry[i][boxi]); for (p = 0; p < nvars; p++) { cbdry = bdry[i][boxi][p + 1]; hypre_ForBoxArrayI(l, cbdry) { box_array = hypre_BoxArrayArrayBoxArray(cbdry, l); hypre_ForBoxI(m, box_array) { cbox = hypre_BoxArrayBox(box_array, m); npts[i] += hypre_BoxVolume(cbox); } } } boxes_with_bdry[i][boxi] = 1; /* mark as containing boundary */ } } /* if (boxes_with_bdry[i-1][j]) */ } /* for (j= 0; j< nfboxes; j++) */ nfboxes = nboxes; } /* for (i= 1; i< num_levels; i++) */ /* de-allocate objects that are not needed anymore */ for (i = 0; i < (num_levels - 1); i++) { if (fbox_mapping[i]) { hypre_TFree(fbox_mapping[i], HYPRE_MEMORY_HOST); } if (cbox_mapping[i + 1]) { hypre_TFree(cbox_mapping[i + 1], HYPRE_MEMORY_HOST); } grid = grid_l[i + 1]; pgrid = hypre_SStructGridPGrid(grid, 0); /* assuming one part */ cell_cgrid = hypre_SStructPGridCellSGrid(pgrid); cboxes = hypre_StructGridBoxes(cell_cgrid); nboxes = hypre_BoxArraySize(hypre_StructGridBoxes(cell_cgrid)); } if (num_levels > 1) { hypre_TFree(fbox_mapping, HYPRE_MEMORY_HOST); hypre_TFree(cbox_mapping, HYPRE_MEMORY_HOST); } /* find the ranks for the boundary points */ BdryRanks_l = hypre_TAlloc(HYPRE_Int *, num_levels, HYPRE_MEMORY_HOST); BdryRanksCnts_l = hypre_TAlloc(HYPRE_Int, num_levels, HYPRE_MEMORY_HOST); /* loop over levels and extract boundary ranks. Only extract unique ranks */ for (i = 0; i < num_levels; i++) { grid = grid_l[i]; pgrid = hypre_SStructGridPGrid(grid, 0); /* assuming one part */ cell_cgrid = hypre_SStructPGridCellSGrid(pgrid); nvars = hypre_SStructPGridNVars(pgrid); cboxes = hypre_StructGridBoxes(cell_cgrid); nboxes = hypre_BoxArraySize(hypre_StructGridBoxes(cell_cgrid)); ranks = hypre_TAlloc(HYPRE_BigInt, npts[i], HYPRE_MEMORY_HOST); cnt = 0; for (j = 0; j < nboxes; j++) { if (boxes_with_bdry[i][j]) { for (k = 0; k < nvars; k++) { fbdry = bdry[i][j][k + 1]; hypre_ForBoxArrayI(m, fbdry) { box_array = hypre_BoxArrayArrayBoxArray(fbdry, m); hypre_ForBoxI(p, box_array) { box = hypre_BoxArrayBox(box_array, p); hypre_BoxGetSize(box, loop_size); hypre_CopyIndex(hypre_BoxIMin(box), start); hypre_SerialBoxLoop0Begin(ndim, loop_size); { zypre_BoxLoopGetIndex(lindex); hypre_SetIndex3(index, lindex[0], lindex[1], lindex[2]); hypre_AddIndexes(index, start, 3, index); hypre_SStructGridFindBoxManEntry(grid, part, index, k, &boxman_entry); hypre_SStructBoxManEntryGetGlobalRank(boxman_entry, index, &ranks[cnt], matrix_type); cnt++; } hypre_SerialBoxLoop0End(); } /* hypre_ForBoxI(p, box_array) */ } /* hypre_ForBoxArrayI(m, fbdry) */ } /* for (k= 0; k< nvars; k++) */ } /* if (boxes_with_bdry[i][j]) */ for (k = 0; k < nvars; k++) { hypre_BoxArrayArrayDestroy(bdry[i][j][k + 1]); } hypre_BoxArrayArrayDestroy(bdry[i][j][0]); hypre_TFree(bdry[i][j], HYPRE_MEMORY_HOST); } /* for (j= 0; j< nboxes; j++) */ hypre_TFree(bdry[i], HYPRE_MEMORY_HOST); /* mark all ranks that are outside this processor to -1 */ for (j = 0; j < cnt; j++) { if ( (ranks[j] < lower_rank[i]) || (ranks[j] > upper_rank[i]) ) { ranks[j] = -1; } } /* sort the ranks & extract the unique ones */ if (cnt) /* recall that some may not have bdry pts */ { hypre_BigQsort0(ranks, 0, cnt - 1); k = 0; if (ranks[0] < 0) /* remove the off-processor markers */ { for (j = 1; j < cnt; j++) { if (ranks[j] > -1) { k = j; break; } } } l = 1; for (j = k + 1; j < cnt; j++) { if (ranks[j] != ranks[j - 1]) { l++; } } BdryRanks_l[i] = hypre_TAlloc(HYPRE_Int, l, HYPRE_MEMORY_HOST); BdryRanksCnts_l[i] = l; l = 0; BdryRanks_l[i][l] = ranks[k] - lower_rank[i]; for (j = k + 1; j < cnt; j++) { if (ranks[j] != ranks[j - 1]) { l++; BdryRanks_l[i][l] = ranks[j] - lower_rank[i]; /* store local ranks */ } } } else /* set BdryRanks_l[i] to be null */ { BdryRanks_l[i] = NULL; BdryRanksCnts_l[i] = 0; } hypre_TFree(ranks, HYPRE_MEMORY_HOST); hypre_TFree(boxes_with_bdry[i], HYPRE_MEMORY_HOST); } /* for (i= 0; i< num_levels; i++) */ hypre_TFree(boxes_with_bdry, HYPRE_MEMORY_HOST); hypre_TFree(lower_rank, HYPRE_MEMORY_HOST); hypre_TFree(upper_rank, HYPRE_MEMORY_HOST); hypre_TFree(bdry, HYPRE_MEMORY_HOST); hypre_TFree(npts, HYPRE_MEMORY_HOST); *BdryRanksl_ptr = BdryRanks_l; *BdryRanksCntsl_ptr = BdryRanksCnts_l; return ierr; } /*----------------------------------------------------------------------------- * Determine the variable boundary layers using the cell-centred boundary * layers. The cell-centred boundary layers are located in bdry[0], a * hypre_BoxArrayArray of size 2*ndim, one array for the upper side and one * for the lower side, for each direction. *-----------------------------------------------------------------------------*/ HYPRE_Int hypre_Maxwell_VarBdy( hypre_SStructPGrid *pgrid, hypre_BoxArrayArray **bdry ) { HYPRE_Int ierr = 0; HYPRE_Int nvars = hypre_SStructPGridNVars(pgrid); hypre_BoxArrayArray *cell_bdry = bdry[0]; hypre_BoxArray *box_array, *box_array2; hypre_Box *bdy_box, *shifted_box; HYPRE_SStructVariable *vartypes = hypre_SStructPGridVarTypes(pgrid); hypre_Index varoffset, ishift, jshift, kshift; hypre_Index lower, upper; HYPRE_Int ndim = hypre_SStructPGridNDim(pgrid); HYPRE_Int i, k, t; hypre_SetIndex3(ishift, 1, 0, 0); hypre_SetIndex3(jshift, 0, 1, 0); hypre_SetIndex3(kshift, 0, 0, 1); shifted_box = hypre_BoxCreate(ndim); for (i = 0; i < nvars; i++) { t = vartypes[i]; hypre_SStructVariableGetOffset(vartypes[i], ndim, varoffset); switch (t) { case 2: /* xface, boundary i= lower, upper */ { /* boundary i= lower */ box_array = hypre_BoxArrayArrayBoxArray(cell_bdry, 0); if (hypre_BoxArraySize(box_array)) { box_array2 = hypre_BoxArrayArrayBoxArray(bdry[i + 1], 0); hypre_ForBoxI(k, box_array) { bdy_box = hypre_BoxArrayBox(box_array, k); /* bdry boxes */ hypre_CopyIndex(hypre_BoxIMin(bdy_box), lower); hypre_CopyIndex(hypre_BoxIMax(bdy_box), upper); hypre_SubtractIndexes(lower, varoffset, 3, lower); hypre_SubtractIndexes(upper, varoffset, 3, upper); hypre_BoxSetExtents(shifted_box, lower, upper); hypre_AppendBox(shifted_box, box_array2); } } /* boundary i= upper */ box_array = hypre_BoxArrayArrayBoxArray(cell_bdry, 1); if (hypre_BoxArraySize(box_array)) { box_array2 = hypre_BoxArrayArrayBoxArray(bdry[i + 1], 1); hypre_ForBoxI(k, box_array) { bdy_box = hypre_BoxArrayBox(box_array, k); /* bdry boxes */ hypre_CopyIndex(hypre_BoxIMin(bdy_box), lower); hypre_CopyIndex(hypre_BoxIMax(bdy_box), upper); hypre_BoxSetExtents(shifted_box, lower, upper); hypre_AppendBox(shifted_box, box_array2); } } break; } case 3: /* yface, boundary j= lower, upper */ { box_array = hypre_BoxArrayArrayBoxArray(cell_bdry, 2); if (hypre_BoxArraySize(box_array)) { box_array2 = hypre_BoxArrayArrayBoxArray(bdry[i + 1], 0); hypre_ForBoxI(k, box_array) { bdy_box = hypre_BoxArrayBox(box_array, k); /* bdry boxes */ hypre_CopyIndex(hypre_BoxIMin(bdy_box), lower); hypre_CopyIndex(hypre_BoxIMax(bdy_box), upper); hypre_SubtractIndexes(lower, varoffset, 3, lower); hypre_SubtractIndexes(upper, varoffset, 3, upper); hypre_BoxSetExtents(shifted_box, lower, upper); hypre_AppendBox(shifted_box, box_array2); } } box_array = hypre_BoxArrayArrayBoxArray(cell_bdry, 3); if (hypre_BoxArraySize(box_array)) { box_array2 = hypre_BoxArrayArrayBoxArray(bdry[i + 1], 1); hypre_ForBoxI(k, box_array) { bdy_box = hypre_BoxArrayBox(box_array, k); /* bdry boxes */ hypre_CopyIndex(hypre_BoxIMin(bdy_box), lower); hypre_CopyIndex(hypre_BoxIMax(bdy_box), upper); hypre_BoxSetExtents(shifted_box, lower, upper); hypre_AppendBox(shifted_box, box_array2); } } break; } case 5: /* xedge, boundary z_faces & y_faces */ { /* boundary k= lower zface*/ box_array = hypre_BoxArrayArrayBoxArray(cell_bdry, 4); if (hypre_BoxArraySize(box_array)) { box_array2 = hypre_BoxArrayArrayBoxArray(bdry[i + 1], 0); hypre_ForBoxI(k, box_array) { bdy_box = hypre_BoxArrayBox(box_array, k); /* bdry boxes */ hypre_CopyIndex(hypre_BoxIMin(bdy_box), lower); hypre_CopyIndex(hypre_BoxIMax(bdy_box), upper); hypre_SubtractIndexes(lower, varoffset, 3, lower); hypre_SubtractIndexes(upper, kshift, 3, upper); hypre_BoxSetExtents(shifted_box, lower, upper); hypre_AppendBox(shifted_box, box_array2); } } /* boundary k= upper zface*/ box_array = hypre_BoxArrayArrayBoxArray(cell_bdry, 5); if (hypre_BoxArraySize(box_array)) { box_array2 = hypre_BoxArrayArrayBoxArray(bdry[i + 1], 1); hypre_ForBoxI(k, box_array) { bdy_box = hypre_BoxArrayBox(box_array, k); /* bdry boxes */ hypre_CopyIndex(hypre_BoxIMin(bdy_box), lower); hypre_CopyIndex(hypre_BoxIMax(bdy_box), upper); hypre_SubtractIndexes(lower, jshift, 3, lower); hypre_BoxSetExtents(shifted_box, lower, upper); hypre_AppendBox(shifted_box, box_array2); } } /* boundary j= lower yface*/ box_array = hypre_BoxArrayArrayBoxArray(cell_bdry, 2); if (hypre_BoxArraySize(box_array)) { box_array2 = hypre_BoxArrayArrayBoxArray(bdry[i + 1], 2); hypre_ForBoxI(k, box_array) { bdy_box = hypre_BoxArrayBox(box_array, k); /* bdry boxes */ hypre_CopyIndex(hypre_BoxIMin(bdy_box), lower); hypre_CopyIndex(hypre_BoxIMax(bdy_box), upper); hypre_SubtractIndexes(lower, varoffset, 3, lower); hypre_SubtractIndexes(upper, jshift, 3, upper); hypre_BoxSetExtents(shifted_box, lower, upper); hypre_AppendBox(shifted_box, box_array2); } } /* boundary j= upper yface*/ box_array = hypre_BoxArrayArrayBoxArray(cell_bdry, 3); if (hypre_BoxArraySize(box_array)) { box_array2 = hypre_BoxArrayArrayBoxArray(bdry[i + 1], 3); hypre_ForBoxI(k, box_array) { bdy_box = hypre_BoxArrayBox(box_array, k); /* bdry boxes */ hypre_CopyIndex(hypre_BoxIMin(bdy_box), lower); hypre_CopyIndex(hypre_BoxIMax(bdy_box), upper); hypre_SubtractIndexes(lower, kshift, 3, lower); hypre_BoxSetExtents(shifted_box, lower, upper); hypre_AppendBox(shifted_box, box_array2); } } break; } case 6: /* yedge, boundary z_faces & x_faces */ { /* boundary k= lower zface*/ box_array = hypre_BoxArrayArrayBoxArray(cell_bdry, 4); if (hypre_BoxArraySize(box_array)) { box_array2 = hypre_BoxArrayArrayBoxArray(bdry[i + 1], 0); hypre_ForBoxI(k, box_array) { bdy_box = hypre_BoxArrayBox(box_array, k); /* bdry boxes */ hypre_CopyIndex(hypre_BoxIMin(bdy_box), lower); hypre_CopyIndex(hypre_BoxIMax(bdy_box), upper); hypre_SubtractIndexes(lower, varoffset, 3, lower); hypre_SubtractIndexes(upper, kshift, 3, upper); hypre_BoxSetExtents(shifted_box, lower, upper); hypre_AppendBox(shifted_box, box_array2); } } /* boundary k= upper zface*/ box_array = hypre_BoxArrayArrayBoxArray(cell_bdry, 5); if (hypre_BoxArraySize(box_array)) { box_array2 = hypre_BoxArrayArrayBoxArray(bdry[i + 1], 1); hypre_ForBoxI(k, box_array) { bdy_box = hypre_BoxArrayBox(box_array, k); /* bdry boxes */ hypre_CopyIndex(hypre_BoxIMin(bdy_box), lower); hypre_CopyIndex(hypre_BoxIMax(bdy_box), upper); hypre_SubtractIndexes(lower, ishift, 3, lower); hypre_BoxSetExtents(shifted_box, lower, upper); hypre_AppendBox(shifted_box, box_array2); } } /* boundary i= lower xface*/ box_array = hypre_BoxArrayArrayBoxArray(cell_bdry, 0); if (hypre_BoxArraySize(box_array)) { box_array2 = hypre_BoxArrayArrayBoxArray(bdry[i + 1], 2); hypre_ForBoxI(k, box_array) { bdy_box = hypre_BoxArrayBox(box_array, k); /* bdry boxes */ hypre_CopyIndex(hypre_BoxIMin(bdy_box), lower); hypre_CopyIndex(hypre_BoxIMax(bdy_box), upper); hypre_SubtractIndexes(lower, varoffset, 3, lower); hypre_SubtractIndexes(upper, ishift, 3, upper); hypre_BoxSetExtents(shifted_box, lower, upper); hypre_AppendBox(shifted_box, box_array2); } } /* boundary i= upper xface*/ box_array = hypre_BoxArrayArrayBoxArray(cell_bdry, 1); if (hypre_BoxArraySize(box_array)) { box_array2 = hypre_BoxArrayArrayBoxArray(bdry[i + 1], 3); hypre_ForBoxI(k, box_array) { bdy_box = hypre_BoxArrayBox(box_array, k); /* bdry boxes */ hypre_CopyIndex(hypre_BoxIMin(bdy_box), lower); hypre_CopyIndex(hypre_BoxIMax(bdy_box), upper); hypre_SubtractIndexes(lower, kshift, 3, lower); hypre_BoxSetExtents(shifted_box, lower, upper); hypre_AppendBox(shifted_box, box_array2); } } break; } case 7: /* zedge, boundary y_faces & x_faces */ { /* boundary j= lower yface*/ box_array = hypre_BoxArrayArrayBoxArray(cell_bdry, 2); if (hypre_BoxArraySize(box_array)) { box_array2 = hypre_BoxArrayArrayBoxArray(bdry[i + 1], 0); hypre_ForBoxI(k, box_array) { bdy_box = hypre_BoxArrayBox(box_array, k); /* bdry boxes */ hypre_CopyIndex(hypre_BoxIMin(bdy_box), lower); hypre_CopyIndex(hypre_BoxIMax(bdy_box), upper); hypre_SubtractIndexes(lower, varoffset, 3, lower); hypre_SubtractIndexes(upper, jshift, 3, upper); hypre_BoxSetExtents(shifted_box, lower, upper); hypre_AppendBox(shifted_box, box_array2); } } /* boundary j= upper yface*/ box_array = hypre_BoxArrayArrayBoxArray(cell_bdry, 3); if (hypre_BoxArraySize(box_array)) { box_array2 = hypre_BoxArrayArrayBoxArray(bdry[i + 1], 1); hypre_ForBoxI(k, box_array) { bdy_box = hypre_BoxArrayBox(box_array, k); /* bdry boxes */ hypre_CopyIndex(hypre_BoxIMin(bdy_box), lower); hypre_CopyIndex(hypre_BoxIMax(bdy_box), upper); hypre_SubtractIndexes(lower, ishift, 3, lower); hypre_BoxSetExtents(shifted_box, lower, upper); hypre_AppendBox(shifted_box, box_array2); } } /* boundary i= lower xface*/ box_array = hypre_BoxArrayArrayBoxArray(cell_bdry, 0); if (hypre_BoxArraySize(box_array)) { box_array2 = hypre_BoxArrayArrayBoxArray(bdry[i + 1], 2); hypre_ForBoxI(k, box_array) { bdy_box = hypre_BoxArrayBox(box_array, k); /* bdry boxes */ hypre_CopyIndex(hypre_BoxIMin(bdy_box), lower); hypre_CopyIndex(hypre_BoxIMax(bdy_box), upper); hypre_SubtractIndexes(lower, varoffset, 3, lower); hypre_SubtractIndexes(upper, ishift, 3, upper); hypre_BoxSetExtents(shifted_box, lower, upper); hypre_AppendBox(shifted_box, box_array2); } } /* boundary i= upper xface*/ box_array = hypre_BoxArrayArrayBoxArray(cell_bdry, 1); if (hypre_BoxArraySize(box_array)) { box_array2 = hypre_BoxArrayArrayBoxArray(bdry[i + 1], 3); hypre_ForBoxI(k, box_array) { bdy_box = hypre_BoxArrayBox(box_array, k); /* bdry boxes */ hypre_CopyIndex(hypre_BoxIMin(bdy_box), lower); hypre_CopyIndex(hypre_BoxIMax(bdy_box), upper); hypre_SubtractIndexes(lower, jshift, 3, lower); hypre_BoxSetExtents(shifted_box, lower, upper); hypre_AppendBox(shifted_box, box_array2); } } break; } } /* switch(t) */ } /* for (i= 0; i< nvars; i++) */ hypre_BoxDestroy(shifted_box); return ierr; } hypre-2.33.0/src/sstruct_ls/maxwell_semi_interp.c000066400000000000000000007562371477326011500221670ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * OpenMP Problems * * Need to fix the way these variables are set and incremented in loops: * nElements, nElements_iedges, nFaces, nFaces_iedges, nEdges, nEdges_iedges, * nElements_Faces, nElements_Edges, * j, l, k (these three only where they are listed at the end of SMP_PRIVATE) * ******************************************************************************/ #include "_hypre_sstruct_ls.h" /*-------------------------------------------------------------------------- * hypre_Maxwell_Interp.c *--------------------------------------------------------------------------*/ HYPRE_Int hypre_CreatePTopology(void **PTopology_vdata_ptr) { hypre_PTopology *PTopology; HYPRE_Int ierr = 0; PTopology = hypre_CTAlloc(hypre_PTopology, 1, HYPRE_MEMORY_HOST); (PTopology -> Face_iedge) = NULL; (PTopology -> Element_iedge) = NULL; (PTopology -> Edge_iedge) = NULL; (PTopology -> Element_Face) = NULL; (PTopology -> Element_Edge) = NULL; *PTopology_vdata_ptr = (void *) PTopology; return ierr; } HYPRE_Int hypre_DestroyPTopology(void *PTopology_vdata) { hypre_PTopology *PTopology = (hypre_PTopology *)PTopology_vdata; HYPRE_Int ierr = 0; if (PTopology) { if ( (PTopology -> Face_iedge) != NULL) { HYPRE_IJMatrixDestroy(PTopology -> Face_iedge); } HYPRE_IJMatrixDestroy(PTopology -> Element_iedge); HYPRE_IJMatrixDestroy(PTopology -> Edge_iedge); if ( (PTopology -> Element_Face) != NULL) { HYPRE_IJMatrixDestroy(PTopology -> Element_Face); } HYPRE_IJMatrixDestroy(PTopology -> Element_Edge); } hypre_TFree(PTopology, HYPRE_MEMORY_HOST); return ierr; } hypre_IJMatrix * hypre_Maxwell_PTopology( hypre_SStructGrid *fgrid_edge, hypre_SStructGrid *cgrid_edge, hypre_SStructGrid *fgrid_face, hypre_SStructGrid *cgrid_face, hypre_SStructGrid *fgrid_element, hypre_SStructGrid *cgrid_element, hypre_ParCSRMatrix *Aee, hypre_Index rfactor, void *PTopology_vdata) { MPI_Comm comm = (fgrid_element -> comm); hypre_PTopology *PTopology = (hypre_PTopology *) PTopology_vdata; hypre_IJMatrix *Face_iedge; hypre_IJMatrix *Element_iedge; hypre_IJMatrix *Edge_iedge; hypre_IJMatrix *Element_Face; hypre_IJMatrix *Element_Edge; hypre_IJMatrix *edge_Edge; hypre_SStructPGrid *p_cgrid, *p_fgrid; hypre_StructGrid *var_cgrid, *var_fgrid; hypre_BoxArray *cboxes, *fboxes, *box_array; hypre_Box *cbox, *fbox, *cellbox, *vbox, copy_box; hypre_BoxArray **contract_fedgeBoxes; hypre_Index **Edge_cstarts, **upper_shifts, **lower_shifts; HYPRE_Int **cfbox_mapping, **fcbox_mapping; hypre_BoxManEntry *entry; HYPRE_BigInt rank, rank2; HYPRE_BigInt start_rank1; HYPRE_Int nFaces, nEdges, nElements, nedges; HYPRE_Int nxFaces, nyFaces, nzFaces; /* HYPRE_Int nxEdges, nyEdges, nzEdges; */ HYPRE_Int n_xFace_iedges, n_yFace_iedges, n_zFace_iedges; HYPRE_Int n_Cell_iedges; HYPRE_Int nElements_iedges, nFaces_iedges, nEdges_iedges; HYPRE_Int nElements_Faces, nElements_Edges; HYPRE_BigInt *iFace = NULL, *iEdge; HYPRE_BigInt *jFace_edge; HYPRE_BigInt *jEdge_iedge; HYPRE_BigInt *jElement_Face = NULL, *jedge_Edge; HYPRE_BigInt *iElement, *jElement_Edge, *iedgeEdge, *jElement_edge; HYPRE_Real *vals_ElementEdge, *vals_ElementFace = NULL; HYPRE_Real *vals_edgeEdge, *vals_Faceedge; HYPRE_Real *vals_Elementedge, *vals_Edgeiedge; HYPRE_Int *ncols_Elementedge, *ncols_Edgeiedge; HYPRE_Int *ncols_edgeEdge, *ncols_Faceedge; HYPRE_Int *ncols_ElementFace = NULL, *ncols_ElementEdge; HYPRE_Int *bdryedge_location; HYPRE_Real fCedge_ratio; HYPRE_Real *stencil_vals, *upper, *lower, *diag, *face_w1, *face_w2; HYPRE_Int *off_proc_flag; hypre_Index cindex; hypre_Index findex; hypre_Index var_index, cell_index, *boxoffset, *suboffset; hypre_Index loop_size, start, cstart, stride, low_index, hi_index; hypre_Index ishift, jshift, kshift, zero_index, one_index; hypre_Index lindex; HYPRE_Int n_boxoffsets; HYPRE_Int nparts = hypre_SStructGridNParts(fgrid_element); HYPRE_Int ndim = hypre_SStructGridNDim(fgrid_element); HYPRE_SStructVariable *vartypes, *Face_vartypes, *Edge_vartypes = NULL; hypre_Index *varoffsets; HYPRE_Int *vartype_map; HYPRE_Int matrix_type = HYPRE_PARCSR; HYPRE_Int nvars, Face_nvars, part, var, box, fboxi; HYPRE_Int Edge_nvars = 0; HYPRE_Int tot_vars = 8; HYPRE_Int t, i, j, k, l, m, n, p; HYPRE_BigInt ilower, iupper; HYPRE_BigInt jlower, jupper; HYPRE_BigInt **flower_ranks, **fupper_ranks; HYPRE_BigInt **clower_ranks, **cupper_ranks; HYPRE_Int ***n_CtoVbox, ****CtoVboxnums; HYPRE_Int *num_vboxes, **vboxnums; HYPRE_Int size1; HYPRE_Int trueV = 1; HYPRE_Int falseV = 0; HYPRE_Int row_in; HYPRE_Int myproc; HYPRE_MemoryLocation memory_location = hypre_ParCSRMatrixMemoryLocation(Aee); hypre_BoxInit(©_box, ndim); hypre_MPI_Comm_rank(comm, &myproc); hypre_SetIndex3(ishift, 1, 0, 0); hypre_SetIndex3(jshift, 0, 1, 0); hypre_SetIndex3(kshift, 0, 0, 1); hypre_ClearIndex(zero_index); hypre_ClearIndex(one_index); hypre_SetIndex(one_index, 1); hypre_SetIndex(lindex, 1); /* set rfactor[2]= 1 if ndim=2. */ if (ndim == 2) { rfactor[2] = 1; } /*------------------------------------------------------------------- * Find the coarse-fine connection pattern, i.e., the topology * needed to create the interpolation operators. * Face_iedge, Edge_iedge, Element_iedge, Element_Face, Element_Edge, * and edge_Edge connections are defined in terms of parcsr_matrices. * These connections are determined using the cell-centred grids. * Note that we are assuming the variable type enumeration * given in hypre_SStructVariable_enum. * * We consider both 2-d and 3-d cases. In 2-d, the edges are faces. * We will continue to call them edges, but use the face variable * enumeration. *-------------------------------------------------------------------*/ varoffsets = hypre_CTAlloc(hypre_Index, tot_vars, HYPRE_MEMORY_HOST); /* total of 8 variable types. Create a mapping between user enumeration to hypre enumeration. Only need for face and edge grids. */ vartype_map = hypre_CTAlloc(HYPRE_Int, 8, HYPRE_MEMORY_HOST); part = 0; p_cgrid = hypre_SStructGridPGrid(cgrid_face, part); /* face cgrid */ nvars = hypre_SStructPGridNVars(p_cgrid); vartypes = hypre_SStructPGridVarTypes(p_cgrid); for (i = 0; i < nvars; i++) { t = vartypes[i]; switch (t) { case 2: { vartype_map[2] = i; break; } case 3: { vartype_map[3] = i; break; } case 4: { vartype_map[4] = i; break; } } } if (ndim == 3) { p_cgrid = hypre_SStructGridPGrid(cgrid_edge, part); /* edge cgrid */ nvars = hypre_SStructPGridNVars(p_cgrid); vartypes = hypre_SStructPGridVarTypes(p_cgrid); for (i = 0; i < nvars; i++) { t = vartypes[i]; switch (t) { case 5: { vartype_map[5] = i; break; } case 6: { vartype_map[6] = i; break; } case 7: { vartype_map[7] = i; break; } } } } /* local sizes */ nFaces = 0; nEdges = 0; nElements = 0; nedges = 0; nxFaces = 0; nyFaces = 0; nzFaces = 0; /* nxEdges = 0; */ /* nyEdges = 0; */ /* nzEdges = 0; */ for (part = 0; part < nparts; part++) { p_cgrid = hypre_SStructGridPGrid(cgrid_element, part); /* cell cgrid */ var_cgrid = hypre_SStructPGridCellSGrid(p_cgrid) ; nElements += hypre_StructGridLocalSize(var_cgrid); t = 0; hypre_SStructVariableGetOffset((hypre_SStructVariable) t, ndim, varoffsets[0]); p_cgrid = hypre_SStructGridPGrid(cgrid_face, part); /* face cgrid */ nvars = hypre_SStructPGridNVars(p_cgrid); vartypes = hypre_SStructPGridVarTypes(p_cgrid); for (var = 0; var < nvars; var++) { var_cgrid = hypre_SStructPGridSGrid(p_cgrid, var); t = vartypes[var]; nFaces += hypre_StructGridLocalSize(var_cgrid); switch (t) { case 2: nxFaces += hypre_StructGridLocalSize(var_cgrid); break; case 3: nyFaces += hypre_StructGridLocalSize(var_cgrid); break; case 4: nzFaces += hypre_StructGridLocalSize(var_cgrid); break; } hypre_SStructVariableGetOffset((hypre_SStructVariable) t, ndim, varoffsets[t]); } /* 2-d vs 3-d case */ if (ndim < 3) { nEdges = nFaces; /* nxEdges = nxFaces; */ /* nyEdges = nyFaces; */ /* nzEdges = 0; */ } else { p_cgrid = hypre_SStructGridPGrid(cgrid_edge, part); /* edge cgrid */ nvars = hypre_SStructPGridNVars(p_cgrid); vartypes = hypre_SStructPGridVarTypes(p_cgrid); for (var = 0; var < nvars; var++) { var_cgrid = hypre_SStructPGridSGrid(p_cgrid, var); t = vartypes[var]; nEdges += hypre_StructGridLocalSize(var_cgrid); /* switch (t) */ /* { */ /* case 5: */ /* nxEdges += hypre_StructGridLocalSize(var_cgrid); */ /* break; */ /* case 6: */ /* nyEdges += hypre_StructGridLocalSize(var_cgrid); */ /* break; */ /* case 7: */ /* nzEdges += hypre_StructGridLocalSize(var_cgrid); */ /* break; */ /* } */ hypre_SStructVariableGetOffset((hypre_SStructVariable) t, ndim, varoffsets[t]); } } /* same for 2-d & 3-d, assuming that fgrid_edge= fgrid_face in input */ p_fgrid = hypre_SStructGridPGrid(fgrid_edge, part); /* edge fgrid */ nvars = hypre_SStructPGridNVars(p_fgrid); vartypes = hypre_SStructPGridVarTypes(p_fgrid); for (var = 0; var < nvars; var++) { var_fgrid = hypre_SStructPGridSGrid(p_fgrid, var); nedges += hypre_StructGridLocalSize(var_fgrid); } } /*-------------------------------------------------------------------------- * Form mappings between the c & f box numbers. Note that a cbox * can land inside only one fbox since the latter was contracted. Without * the extraction, a cbox can land in more than 1 fboxes (e.g., cbox * boundary extending into other fboxes). These mappings are for the * cell-centred boxes. * Check: Other variable boxes should follow this mapping, by * property of the variable-shifted indices? Can the cell-centred boundary * indices of a box be non-cell-centred indices for another box? * * Also determine contracted cell-centred fboxes. *--------------------------------------------------------------------------*/ cfbox_mapping = hypre_TAlloc(HYPRE_Int *, nparts, HYPRE_MEMORY_HOST); fcbox_mapping = hypre_TAlloc(HYPRE_Int *, nparts, HYPRE_MEMORY_HOST); contract_fedgeBoxes = hypre_TAlloc(hypre_BoxArray *, nparts, HYPRE_MEMORY_HOST); Edge_cstarts = hypre_TAlloc(hypre_Index *, nparts, HYPRE_MEMORY_HOST); upper_shifts = hypre_TAlloc(hypre_Index *, nparts, HYPRE_MEMORY_HOST); lower_shifts = hypre_TAlloc(hypre_Index *, nparts, HYPRE_MEMORY_HOST); for (i = 0; i < nparts; i++) { p_fgrid = hypre_SStructGridPGrid(fgrid_element, i); var_fgrid = hypre_SStructPGridCellSGrid(p_fgrid); fboxes = hypre_StructGridBoxes(var_fgrid); j = hypre_BoxArraySize(fboxes); fcbox_mapping[i] = hypre_CTAlloc(HYPRE_Int, j, HYPRE_MEMORY_HOST); p_cgrid = hypre_SStructGridPGrid(cgrid_element, i); var_cgrid = hypre_SStructPGridCellSGrid(p_cgrid); cboxes = hypre_StructGridBoxes(var_cgrid); j = hypre_BoxArraySize(fboxes); cfbox_mapping[i] = hypre_CTAlloc(HYPRE_Int, j, HYPRE_MEMORY_HOST); /* assuming if i1 > i2 and (box j1) is coarsened from (box i1) and (box j2) from (box i2), then j1 > j2. */ k = 0; hypre_ForBoxI(j, fboxes) { fbox = hypre_BoxArrayBox(fboxes, j); hypre_CopyBox(fbox, ©_box); hypre_ProjectBox(©_box, zero_index, rfactor); hypre_StructMapFineToCoarse(hypre_BoxIMin(©_box), zero_index, rfactor, hypre_BoxIMin(©_box)); hypre_StructMapFineToCoarse(hypre_BoxIMax(©_box), zero_index, rfactor, hypre_BoxIMax(©_box)); /* since the ordering of the cboxes was determined by the fbox ordering, we only have to check if the first cbox in the list intersects with copy_box. If not, this fbox vanished in the coarsening. Note that this gives you the correct interior cbox. */ cbox = hypre_BoxArrayBox(cboxes, k); hypre_IntersectBoxes(©_box, cbox, ©_box); if (hypre_BoxVolume(©_box)) { cfbox_mapping[i][k] = j; fcbox_mapping[i][j] = k; k++; } /* if (hypre_BoxVolume(©_box)) */ } /* hypre_ForBoxI(j, fboxes) */ /* fill up the contracted box_array */ contract_fedgeBoxes[i] = hypre_BoxArrayCreate(0, ndim); Edge_cstarts[i] = hypre_TAlloc(hypre_Index, hypre_BoxArraySize(fboxes), HYPRE_MEMORY_HOST); upper_shifts[i] = hypre_TAlloc(hypre_Index, hypre_BoxArraySize(fboxes), HYPRE_MEMORY_HOST); lower_shifts[i] = hypre_TAlloc(hypre_Index, hypre_BoxArraySize(fboxes), HYPRE_MEMORY_HOST); hypre_ForBoxI(j, fboxes) { fbox = hypre_BoxArrayBox(fboxes, j); /* contract the fbox to correspond to the correct cbox */ cbox = hypre_BoxContraction(fbox, var_fgrid, rfactor); hypre_AppendBox(cbox, contract_fedgeBoxes[i]); /* record the offset mapping between the coarse cell index and the fine cell index */ hypre_ClearIndex(upper_shifts[i][j]); hypre_ClearIndex(lower_shifts[i][j]); for (l = 0; l < ndim; l++) { m = hypre_BoxIMin(cbox)[l]; p = m % rfactor[l]; if (p > 0 && m > 0) { upper_shifts[i][j][l] = p - 1; lower_shifts[i][j][l] = p - rfactor[l]; } else { upper_shifts[i][j][l] = rfactor[l] - p - 1; lower_shifts[i][j][l] = -p; } } /* record the cstarts of the cbox */ hypre_ProjectBox(cbox, zero_index, rfactor); hypre_CopyIndex(hypre_BoxIMin(cbox), Edge_cstarts[i][j]); hypre_StructMapFineToCoarse(Edge_cstarts[i][j], zero_index, rfactor, Edge_cstarts[i][j]); hypre_BoxDestroy(cbox); } } /* for (i= 0; i< nparts; i++) */ /* variable rank bounds for this processor */ n_CtoVbox = hypre_TAlloc(HYPRE_Int **, nparts, HYPRE_MEMORY_HOST); CtoVboxnums = hypre_TAlloc(HYPRE_Int ***, nparts, HYPRE_MEMORY_HOST); for (part = 0; part < nparts; part++) { hypre_SStructCellGridBoxNumMap(fgrid_edge, part, &n_CtoVbox[part], &CtoVboxnums[part]); } /* variable rank bounds for this processor */ flower_ranks = hypre_TAlloc(HYPRE_BigInt *, nparts, HYPRE_MEMORY_HOST); fupper_ranks = hypre_TAlloc(HYPRE_BigInt *, nparts, HYPRE_MEMORY_HOST); clower_ranks = hypre_TAlloc(HYPRE_BigInt *, nparts, HYPRE_MEMORY_HOST); cupper_ranks = hypre_TAlloc(HYPRE_BigInt *, nparts, HYPRE_MEMORY_HOST); for (part = 0; part < nparts; part++) { flower_ranks[part] = hypre_CTAlloc(HYPRE_BigInt, tot_vars, HYPRE_MEMORY_HOST); fupper_ranks[part] = hypre_CTAlloc(HYPRE_BigInt, tot_vars, HYPRE_MEMORY_HOST); /* cell grid ranks */ p_fgrid = hypre_SStructGridPGrid(fgrid_element, part); var_fgrid = hypre_SStructPGridSGrid(p_fgrid, 0); box_array = hypre_StructGridBoxes(var_fgrid); fbox = hypre_BoxArrayBox(box_array, 0); hypre_CopyIndex(hypre_BoxIMin(fbox), findex); hypre_SStructGridFindBoxManEntry(fgrid_element, part, findex, 0, &entry); hypre_SStructBoxManEntryGetGlobalRank(entry, findex, &flower_ranks[part][0], matrix_type); fbox = hypre_BoxArrayBox(box_array, hypre_BoxArraySize(box_array) - 1); hypre_CopyIndex(hypre_BoxIMax(fbox), findex); hypre_SStructGridFindBoxManEntry(fgrid_edge, part, findex, 0, &entry); hypre_SStructBoxManEntryGetGlobalRank(entry, findex, &fupper_ranks[part][0], matrix_type); clower_ranks[part] = hypre_CTAlloc(HYPRE_BigInt, tot_vars, HYPRE_MEMORY_HOST); cupper_ranks[part] = hypre_CTAlloc(HYPRE_BigInt, tot_vars, HYPRE_MEMORY_HOST); p_cgrid = hypre_SStructGridPGrid(cgrid_element, part); var_cgrid = hypre_SStructPGridSGrid(p_cgrid, 0); box_array = hypre_StructGridBoxes(var_cgrid); cbox = hypre_BoxArrayBox(box_array, 0); hypre_CopyIndex(hypre_BoxIMin(cbox), cindex); hypre_SStructGridFindBoxManEntry(cgrid_element, part, cindex, 0, &entry); hypre_SStructBoxManEntryGetGlobalRank(entry, cindex, &clower_ranks[part][0], matrix_type); cbox = hypre_BoxArrayBox(box_array, hypre_BoxArraySize(box_array) - 1); hypre_CopyIndex(hypre_BoxIMax(cbox), cindex); hypre_SStructGridFindBoxManEntry(cgrid_edge, part, cindex, 0, &entry); hypre_SStructBoxManEntryGetGlobalRank(entry, cindex, &cupper_ranks[part][0], matrix_type); /* face grid ranks */ p_fgrid = hypre_SStructGridPGrid(fgrid_face, part); p_cgrid = hypre_SStructGridPGrid(cgrid_face, part); nvars = hypre_SStructPGridNVars(p_fgrid); vartypes = hypre_SStructPGridVarTypes(p_cgrid); for (i = 0; i < nvars; i++) { t = vartypes[i]; var_fgrid = hypre_SStructPGridSGrid(p_fgrid, i); box_array = hypre_StructGridBoxes(var_fgrid); fbox = hypre_BoxArrayBox(box_array, 0); hypre_CopyIndex(hypre_BoxIMin(fbox), findex); hypre_SStructGridFindBoxManEntry(fgrid_face, part, findex, i, &entry); hypre_SStructBoxManEntryGetGlobalRank(entry, findex, &flower_ranks[part][t], matrix_type); fbox = hypre_BoxArrayBox(box_array, hypre_BoxArraySize(box_array) - 1); hypre_CopyIndex(hypre_BoxIMax(fbox), findex); hypre_SStructGridFindBoxManEntry(fgrid_face, part, findex, i, &entry); hypre_SStructBoxManEntryGetGlobalRank(entry, findex, &fupper_ranks[part][t], matrix_type); var_cgrid = hypre_SStructPGridSGrid(p_cgrid, i); box_array = hypre_StructGridBoxes(var_cgrid); cbox = hypre_BoxArrayBox(box_array, 0); hypre_CopyIndex(hypre_BoxIMin(cbox), cindex); hypre_SStructGridFindBoxManEntry(cgrid_face, part, cindex, i, &entry); hypre_SStructBoxManEntryGetGlobalRank(entry, cindex, &clower_ranks[part][t], matrix_type); cbox = hypre_BoxArrayBox(box_array, hypre_BoxArraySize(box_array) - 1); hypre_CopyIndex(hypre_BoxIMax(cbox), cindex); hypre_SStructGridFindBoxManEntry(cgrid_face, part, cindex, i, &entry); hypre_SStructBoxManEntryGetGlobalRank(entry, cindex, &cupper_ranks[part][t], matrix_type); } /* edge grid ranks */ p_fgrid = hypre_SStructGridPGrid(fgrid_edge, part); p_cgrid = hypre_SStructGridPGrid(cgrid_edge, part); nvars = hypre_SStructPGridNVars(p_fgrid); vartypes = hypre_SStructPGridVarTypes(p_cgrid); for (i = 0; i < nvars; i++) { t = vartypes[i]; var_fgrid = hypre_SStructPGridSGrid(p_fgrid, i); box_array = hypre_StructGridBoxes(var_fgrid); fbox = hypre_BoxArrayBox(box_array, 0); hypre_CopyIndex(hypre_BoxIMin(fbox), findex); hypre_SStructGridFindBoxManEntry(fgrid_edge, part, findex, i, &entry); hypre_SStructBoxManEntryGetGlobalRank(entry, findex, &flower_ranks[part][t], matrix_type); fbox = hypre_BoxArrayBox(box_array, hypre_BoxArraySize(box_array) - 1); hypre_CopyIndex(hypre_BoxIMax(fbox), findex); hypre_SStructGridFindBoxManEntry(fgrid_edge, part, findex, i, &entry); hypre_SStructBoxManEntryGetGlobalRank(entry, findex, &fupper_ranks[part][t], matrix_type); var_cgrid = hypre_SStructPGridSGrid(p_cgrid, i); box_array = hypre_StructGridBoxes(var_cgrid); cbox = hypre_BoxArrayBox(box_array, 0); hypre_CopyIndex(hypre_BoxIMin(cbox), cindex); hypre_SStructGridFindBoxManEntry(cgrid_edge, part, cindex, i, &entry); hypre_SStructBoxManEntryGetGlobalRank(entry, cindex, &clower_ranks[part][t], matrix_type); cbox = hypre_BoxArrayBox(box_array, hypre_BoxArraySize(box_array) - 1); hypre_CopyIndex(hypre_BoxIMax(cbox), cindex); hypre_SStructGridFindBoxManEntry(cgrid_edge, part, cindex, i, &entry); hypre_SStructBoxManEntryGetGlobalRank(entry, cindex, &cupper_ranks[part][t], matrix_type); } } /* CREATE IJ_MATRICES- need to find the size of each one. Notice that the row and col ranks of these matrices can be created using only grid information. Grab the first part, first variable, first box, and lower index (lower rank); Grab the last part, last variable, last box, and upper index (upper rank). */ /* Element_iedge- same for 2-d and 3-d */ /* lower rank */ part = 0; box = 0; hypre_SStructGridBoxProcFindBoxManEntry(cgrid_element, part, 0, box, myproc, &entry); p_cgrid = hypre_SStructGridPGrid(cgrid_element, part); var_cgrid = hypre_SStructPGridCellSGrid(p_cgrid) ; cboxes = hypre_StructGridBoxes(var_cgrid); cbox = hypre_BoxArrayBox(cboxes, 0); hypre_SStructBoxManEntryGetGlobalCSRank(entry, hypre_BoxIMin(cbox), &ilower); p_fgrid = hypre_SStructGridPGrid(fgrid_edge, part); hypre_SStructGridBoxProcFindBoxManEntry(fgrid_edge, part, 0, box, myproc, &entry); var_fgrid = hypre_SStructPGridSGrid(p_fgrid, 0); fboxes = hypre_StructGridBoxes(var_fgrid); fbox = hypre_BoxArrayBox(fboxes, 0); hypre_SStructBoxManEntryGetGlobalCSRank(entry, hypre_BoxIMin(fbox), &jlower); /* upper rank */ part = nparts - 1; p_cgrid = hypre_SStructGridPGrid(cgrid_element, part); var_cgrid = hypre_SStructPGridCellSGrid(p_cgrid) ; cboxes = hypre_StructGridBoxes(var_cgrid); cbox = hypre_BoxArrayBox(cboxes, hypre_BoxArraySize(cboxes) - 1); hypre_SStructGridBoxProcFindBoxManEntry(cgrid_element, part, 0, hypre_BoxArraySize(cboxes) - 1, myproc, &entry); hypre_SStructBoxManEntryGetGlobalCSRank(entry, hypre_BoxIMax(cbox), &iupper); p_fgrid = hypre_SStructGridPGrid(fgrid_edge, part); nvars = hypre_SStructPGridNVars(p_fgrid); var_fgrid = hypre_SStructPGridSGrid(p_fgrid, nvars - 1); fboxes = hypre_StructGridBoxes(var_fgrid); fbox = hypre_BoxArrayBox(fboxes, hypre_BoxArraySize(fboxes) - 1); hypre_SStructGridBoxProcFindBoxManEntry(fgrid_edge, part, nvars - 1, hypre_BoxArraySize(fboxes) - 1, myproc, &entry); hypre_SStructBoxManEntryGetGlobalCSRank(entry, hypre_BoxIMax(fbox), &jupper); HYPRE_IJMatrixCreate(comm, ilower, iupper, jlower, jupper, &Element_iedge); HYPRE_IJMatrixSetObjectType(Element_iedge, HYPRE_PARCSR); HYPRE_IJMatrixInitialize(Element_iedge); /* Edge_iedge. Note that even though not all the iedges are involved (e.g., * truncated edges are not), we use the ranks determined by the Edge/edge grids. * Same for 2-d and 3-d. */ /* lower rank */ part = 0; box = 0; hypre_SStructGridBoxProcFindBoxManEntry(cgrid_edge, part, 0, box, myproc, &entry); p_cgrid = hypre_SStructGridPGrid(cgrid_edge, part); var_cgrid = hypre_SStructPGridSGrid(p_cgrid, 0); cboxes = hypre_StructGridBoxes(var_cgrid); cbox = hypre_BoxArrayBox(cboxes, 0); hypre_SStructBoxManEntryGetGlobalCSRank(entry, hypre_BoxIMin(cbox), &ilower); hypre_SStructGridBoxProcFindBoxManEntry(fgrid_edge, part, 0, box, myproc, &entry); p_fgrid = hypre_SStructGridPGrid(fgrid_edge, part); var_fgrid = hypre_SStructPGridSGrid(p_fgrid, 0); fboxes = hypre_StructGridBoxes(var_fgrid); fbox = hypre_BoxArrayBox(fboxes, 0); hypre_SStructBoxManEntryGetGlobalCSRank(entry, hypre_BoxIMin(fbox), &jlower); /* upper rank */ part = nparts - 1; p_cgrid = hypre_SStructGridPGrid(cgrid_edge, part); nvars = hypre_SStructPGridNVars(p_cgrid); var_cgrid = hypre_SStructPGridSGrid(p_cgrid, nvars - 1); cboxes = hypre_StructGridBoxes(var_cgrid); cbox = hypre_BoxArrayBox(cboxes, hypre_BoxArraySize(cboxes) - 1); hypre_SStructGridBoxProcFindBoxManEntry(cgrid_edge, part, nvars - 1, hypre_BoxArraySize(cboxes) - 1, myproc, &entry); hypre_SStructBoxManEntryGetGlobalCSRank(entry, hypre_BoxIMax(cbox), &iupper); p_fgrid = hypre_SStructGridPGrid(fgrid_edge, part); nvars = hypre_SStructPGridNVars(p_fgrid); var_fgrid = hypre_SStructPGridSGrid(p_fgrid, nvars - 1); fboxes = hypre_StructGridBoxes(var_fgrid); fbox = hypre_BoxArrayBox(fboxes, hypre_BoxArraySize(fboxes) - 1); hypre_SStructGridBoxProcFindBoxManEntry(fgrid_edge, part, nvars - 1, hypre_BoxArraySize(fboxes) - 1, myproc, &entry); hypre_SStructBoxManEntryGetGlobalCSRank(entry, hypre_BoxIMax(fbox), &jupper); HYPRE_IJMatrixCreate(comm, ilower, iupper, jlower, jupper, &Edge_iedge); HYPRE_IJMatrixSetObjectType(Edge_iedge, HYPRE_PARCSR); HYPRE_IJMatrixInitialize(Edge_iedge); /* edge_Edge. Same for 2-d and 3-d. */ /* lower rank */ part = 0; box = 0; hypre_SStructGridBoxProcFindBoxManEntry(fgrid_edge, part, 0, box, myproc, &entry); p_fgrid = hypre_SStructGridPGrid(fgrid_edge, part); var_fgrid = hypre_SStructPGridSGrid(p_fgrid, 0); fboxes = hypre_StructGridBoxes(var_fgrid); fbox = hypre_BoxArrayBox(fboxes, 0); hypre_SStructBoxManEntryGetGlobalCSRank(entry, hypre_BoxIMin(fbox), &ilower); hypre_SStructGridBoxProcFindBoxManEntry(cgrid_edge, part, 0, box, myproc, &entry); p_cgrid = hypre_SStructGridPGrid(cgrid_edge, part); var_cgrid = hypre_SStructPGridSGrid(p_cgrid, 0); cboxes = hypre_StructGridBoxes(var_cgrid); cbox = hypre_BoxArrayBox(cboxes, 0); hypre_SStructBoxManEntryGetGlobalCSRank(entry, hypre_BoxIMin(cbox), &jlower); /* upper rank */ part = nparts - 1; p_fgrid = hypre_SStructGridPGrid(fgrid_edge, part); nvars = hypre_SStructPGridNVars(p_fgrid); var_fgrid = hypre_SStructPGridSGrid(p_fgrid, nvars - 1); fboxes = hypre_StructGridBoxes(var_fgrid); fbox = hypre_BoxArrayBox(fboxes, hypre_BoxArraySize(fboxes) - 1); hypre_SStructGridBoxProcFindBoxManEntry(fgrid_edge, part, nvars - 1, hypre_BoxArraySize(fboxes) - 1, myproc, &entry); hypre_SStructBoxManEntryGetGlobalCSRank(entry, hypre_BoxIMax(fbox), &iupper); p_cgrid = hypre_SStructGridPGrid(cgrid_edge, part); nvars = hypre_SStructPGridNVars(p_cgrid); var_cgrid = hypre_SStructPGridSGrid(p_cgrid, nvars - 1); cboxes = hypre_StructGridBoxes(var_cgrid); cbox = hypre_BoxArrayBox(cboxes, hypre_BoxArraySize(cboxes) - 1); hypre_SStructGridBoxProcFindBoxManEntry(cgrid_edge, part, nvars - 1, hypre_BoxArraySize(cboxes) - 1, myproc, &entry); hypre_SStructBoxManEntryGetGlobalCSRank(entry, hypre_BoxIMax(cbox), &jupper); HYPRE_IJMatrixCreate(comm, ilower, iupper, jlower, jupper, &edge_Edge); HYPRE_IJMatrixSetObjectType(edge_Edge, HYPRE_PARCSR); HYPRE_IJMatrixInitialize(edge_Edge); /* Face_iedge. Only needed in 3-d. */ if (ndim == 3) { /* lower rank */ part = 0; box = 0; hypre_SStructGridBoxProcFindBoxManEntry(cgrid_face, part, 0, box, myproc, &entry); p_cgrid = hypre_SStructGridPGrid(cgrid_face, part); var_cgrid = hypre_SStructPGridSGrid(p_cgrid, 0); cboxes = hypre_StructGridBoxes(var_cgrid); cbox = hypre_BoxArrayBox(cboxes, 0); hypre_SStructBoxManEntryGetGlobalCSRank(entry, hypre_BoxIMin(cbox), &ilower); hypre_SStructGridBoxProcFindBoxManEntry(fgrid_edge, part, 0, box, myproc, &entry); p_fgrid = hypre_SStructGridPGrid(fgrid_edge, part); var_fgrid = hypre_SStructPGridSGrid(p_fgrid, 0); fboxes = hypre_StructGridBoxes(var_fgrid); fbox = hypre_BoxArrayBox(fboxes, 0); hypre_SStructBoxManEntryGetGlobalCSRank(entry, hypre_BoxIMin(fbox), &jlower); /* upper rank */ part = nparts - 1; p_cgrid = hypre_SStructGridPGrid(cgrid_face, part); nvars = hypre_SStructPGridNVars(p_cgrid); var_cgrid = hypre_SStructPGridSGrid(p_cgrid, nvars - 1); cboxes = hypre_StructGridBoxes(var_cgrid); cbox = hypre_BoxArrayBox(cboxes, hypre_BoxArraySize(cboxes) - 1); hypre_SStructGridBoxProcFindBoxManEntry(cgrid_face, part, nvars - 1, hypre_BoxArraySize(cboxes) - 1, myproc, &entry); hypre_SStructBoxManEntryGetGlobalCSRank(entry, hypre_BoxIMax(cbox), &iupper); p_fgrid = hypre_SStructGridPGrid(fgrid_edge, part); nvars = hypre_SStructPGridNVars(p_fgrid); var_fgrid = hypre_SStructPGridSGrid(p_fgrid, nvars - 1); fboxes = hypre_StructGridBoxes(var_fgrid); fbox = hypre_BoxArrayBox(fboxes, hypre_BoxArraySize(fboxes) - 1); hypre_SStructGridBoxProcFindBoxManEntry(fgrid_edge, part, nvars - 1, hypre_BoxArraySize(fboxes) - 1, myproc, &entry); hypre_SStructBoxManEntryGetGlobalCSRank(entry, hypre_BoxIMax(fbox), &jupper); HYPRE_IJMatrixCreate(comm, ilower, iupper, jlower, jupper, &Face_iedge); HYPRE_IJMatrixSetObjectType(Face_iedge, HYPRE_PARCSR); HYPRE_IJMatrixInitialize(Face_iedge); } /* Element_Face. Only for 3-d since Element_Edge= Element_Face in 2-d. */ /* lower rank */ if (ndim == 3) { part = 0; box = 0; hypre_SStructGridBoxProcFindBoxManEntry(cgrid_element, part, 0, box, myproc, &entry); p_cgrid = hypre_SStructGridPGrid(cgrid_element, part); var_cgrid = hypre_SStructPGridSGrid(p_cgrid, 0); cboxes = hypre_StructGridBoxes(var_cgrid); cbox = hypre_BoxArrayBox(cboxes, 0); hypre_SStructBoxManEntryGetGlobalCSRank(entry, hypre_BoxIMin(cbox), &ilower); hypre_SStructGridBoxProcFindBoxManEntry(cgrid_face, part, 0, box, myproc, &entry); p_cgrid = hypre_SStructGridPGrid(cgrid_face, part); var_cgrid = hypre_SStructPGridSGrid(p_cgrid, 0); cboxes = hypre_StructGridBoxes(var_cgrid); cbox = hypre_BoxArrayBox(cboxes, 0); hypre_SStructBoxManEntryGetGlobalCSRank(entry, hypre_BoxIMin(cbox), &jlower); /* upper rank */ part = nparts - 1; p_cgrid = hypre_SStructGridPGrid(cgrid_element, part); nvars = hypre_SStructPGridNVars(p_cgrid); var_cgrid = hypre_SStructPGridSGrid(p_cgrid, nvars - 1); cboxes = hypre_StructGridBoxes(var_cgrid); cbox = hypre_BoxArrayBox(cboxes, hypre_BoxArraySize(cboxes) - 1); hypre_SStructGridBoxProcFindBoxManEntry(cgrid_element, part, nvars - 1, hypre_BoxArraySize(cboxes) - 1, myproc, &entry); hypre_SStructBoxManEntryGetGlobalCSRank(entry, hypre_BoxIMax(cbox), &iupper); p_cgrid = hypre_SStructGridPGrid(cgrid_face, part); nvars = hypre_SStructPGridNVars(p_cgrid); var_cgrid = hypre_SStructPGridSGrid(p_cgrid, nvars - 1); cboxes = hypre_StructGridBoxes(var_cgrid); cbox = hypre_BoxArrayBox(cboxes, hypre_BoxArraySize(cboxes) - 1); hypre_SStructGridBoxProcFindBoxManEntry(cgrid_face, part, nvars - 1, hypre_BoxArraySize(cboxes) - 1, myproc, &entry); hypre_SStructBoxManEntryGetGlobalCSRank(entry, hypre_BoxIMax(cbox), &jupper); HYPRE_IJMatrixCreate(comm, ilower, iupper, jlower, jupper, &Element_Face); HYPRE_IJMatrixSetObjectType(Element_Face, HYPRE_PARCSR); HYPRE_IJMatrixInitialize(Element_Face); } /* Element_Edge. Same for 2-d and 3-d. */ /* lower rank */ part = 0; box = 0; hypre_SStructGridBoxProcFindBoxManEntry(cgrid_element, part, 0, box, myproc, &entry); p_cgrid = hypre_SStructGridPGrid(cgrid_element, part); var_cgrid = hypre_SStructPGridSGrid(p_cgrid, 0); cboxes = hypre_StructGridBoxes(var_cgrid); cbox = hypre_BoxArrayBox(cboxes, 0); hypre_SStructBoxManEntryGetGlobalCSRank(entry, hypre_BoxIMin(cbox), &ilower); hypre_SStructGridBoxProcFindBoxManEntry(cgrid_edge, part, 0, box, myproc, &entry); p_cgrid = hypre_SStructGridPGrid(cgrid_edge, part); var_cgrid = hypre_SStructPGridSGrid(p_cgrid, 0); cboxes = hypre_StructGridBoxes(var_cgrid); cbox = hypre_BoxArrayBox(cboxes, 0); hypre_SStructBoxManEntryGetGlobalCSRank(entry, hypre_BoxIMin(cbox), &jlower); /* upper rank */ part = nparts - 1; p_cgrid = hypre_SStructGridPGrid(cgrid_element, part); nvars = hypre_SStructPGridNVars(p_cgrid); var_cgrid = hypre_SStructPGridSGrid(p_cgrid, nvars - 1); cboxes = hypre_StructGridBoxes(var_cgrid); cbox = hypre_BoxArrayBox(cboxes, hypre_BoxArraySize(cboxes) - 1); hypre_SStructGridBoxProcFindBoxManEntry(cgrid_element, part, nvars - 1, hypre_BoxArraySize(cboxes) - 1, myproc, &entry); hypre_SStructBoxManEntryGetGlobalCSRank(entry, hypre_BoxIMax(cbox), &iupper); p_cgrid = hypre_SStructGridPGrid(cgrid_edge, part); nvars = hypre_SStructPGridNVars(p_cgrid); var_cgrid = hypre_SStructPGridSGrid(p_cgrid, nvars - 1); cboxes = hypre_StructGridBoxes(var_cgrid); cbox = hypre_BoxArrayBox(cboxes, hypre_BoxArraySize(cboxes) - 1); hypre_SStructGridBoxProcFindBoxManEntry(cgrid_edge, part, nvars - 1, hypre_BoxArraySize(cboxes) - 1, myproc, &entry); hypre_SStructBoxManEntryGetGlobalCSRank(entry, hypre_BoxIMax(cbox), &jupper); HYPRE_IJMatrixCreate(comm, ilower, iupper, jlower, jupper, &Element_Edge); HYPRE_IJMatrixSetObjectType(Element_Edge, HYPRE_PARCSR); HYPRE_IJMatrixInitialize(Element_Edge); /*------------------------------------------------------------------------------ * fill up the parcsr matrices. *------------------------------------------------------------------------------*/ /* count the number of connections, i.e., the columns * no. of interior edges per face, or no. of interior edges per cell. * Need to distinguish between 2 and 3-d. */ if (ndim == 3) { n_xFace_iedges = (rfactor[1] - 1) * rfactor[2] + (rfactor[2] - 1) * rfactor[1]; n_yFace_iedges = (rfactor[0] - 1) * rfactor[2] + (rfactor[2] - 1) * rfactor[0]; n_zFace_iedges = (rfactor[1] - 1) * rfactor[0] + (rfactor[0] - 1) * rfactor[1]; n_Cell_iedges = (rfactor[2] - 1) * n_zFace_iedges + rfactor[2] * (rfactor[0] - 1) * (rfactor[1] - 1); nFaces_iedges = nxFaces * n_xFace_iedges + nyFaces * n_yFace_iedges + nzFaces * n_zFace_iedges; nElements_iedges = nElements * n_Cell_iedges; } else { n_Cell_iedges = (rfactor[0] - 1) * rfactor[1] + (rfactor[1] - 1) * rfactor[0]; nElements_iedges = nElements * n_Cell_iedges; } if (ndim == 3) { iFace = hypre_CTAlloc(HYPRE_BigInt, nFaces, memory_location); } iEdge = hypre_CTAlloc(HYPRE_BigInt, nEdges, memory_location); iElement = hypre_CTAlloc(HYPRE_BigInt, nElements, memory_location); /* array structures needed for forming ij_matrices */ /* Element_edge. Same for 2-d and 3-d. */ ncols_Elementedge = hypre_CTAlloc(HYPRE_Int, nElements, memory_location); for (i = 0; i < nElements; i++) { ncols_Elementedge[i] = n_Cell_iedges; } jElement_edge = hypre_CTAlloc(HYPRE_BigInt, nElements_iedges, memory_location); vals_Elementedge = hypre_CTAlloc(HYPRE_Real, nElements_iedges, memory_location); /*--------------------------------------------------------------------------- * Fill up the row/column ranks of Element_edge. Will need to distinguish * between 2-d and 3-d. * Loop over the coarse element grid * a) Refine the coarse cell and grab the fine cells that will contain * the fine edges. * To obtain the correct coarse-to-fine cell index mapping, we * map lindex to the fine cell grid and then adjust * so that the final mapped fine cell is the one on the upper * corner of the agglomerate. Will need to determine the fine box * corresponding to the coarse box. * b) loop map these fine cells and find the ranks of the fine edges. *---------------------------------------------------------------------------*/ nElements = 0; nElements_iedges = 0; for (part = 0; part < nparts; part++) { if (ndim == 3) { p_cgrid = hypre_SStructGridPGrid(cgrid_edge, part); /* Edge grid */ Edge_nvars = hypre_SStructPGridNVars(p_cgrid); Edge_vartypes = hypre_SStructPGridVarTypes(p_cgrid); } else if (ndim == 2) /* edge is a face in 2-d*/ { p_cgrid = hypre_SStructGridPGrid(cgrid_face, part); /* Face grid */ Face_nvars = hypre_SStructPGridNVars(p_cgrid); Face_vartypes = hypre_SStructPGridVarTypes(p_cgrid); } p_cgrid = hypre_SStructGridPGrid(cgrid_element, part); /* ccell grid */ var_cgrid = hypre_SStructPGridCellSGrid(p_cgrid); cboxes = hypre_StructGridBoxes(var_cgrid); p_fgrid = hypre_SStructGridPGrid(fgrid_element, part); /* fcell grid */ var_fgrid = hypre_SStructPGridCellSGrid(p_fgrid); fboxes = hypre_StructGridBoxes(var_fgrid); hypre_ForBoxI(i, cboxes) { cbox = hypre_BoxArrayBox(cboxes, i); hypre_BoxGetSize(cbox, loop_size); hypre_CopyIndex(hypre_BoxIMin(cbox), cstart); /* determine which fine box cbox has coarsened from. Obtained from cfbox_mapping. */ fboxi = cfbox_mapping[part][i]; fbox = hypre_BoxArrayBox(fboxes, fboxi); /********************************************************************** * determine the shift to get the correct c-to-f cell index map: * d= hypre_BoxIMin(fbox)[j]%rfactor[j]*sign(hypre_BoxIMin(fbox)[j]) * stride[j]= d-1 if d>0 * stride[j]= rfactor[j]-1+d if d<=0. * This is upper_shifts[part][fboxi]. **********************************************************************/ hypre_ClearIndex(stride); hypre_CopyIndex(upper_shifts[part][fboxi], stride); /* loop over each cell and find the row rank of Element_edge and then the column ranks of the connected fine edges. */ hypre_SerialBoxLoop0Begin(ndim, loop_size); { zypre_BoxLoopGetIndex(lindex); hypre_SetIndex3(cindex, lindex[0], lindex[1], lindex[2]); hypre_AddIndexes(cindex, cstart, 3, cindex); /* refined cindex to get the correct upper fine index */ hypre_StructMapCoarseToFine(cindex, zero_index, rfactor, findex); hypre_AddIndexes(findex, stride, 3, findex); /* Element(i,j,k) rank */ hypre_SStructGridFindBoxManEntry(cgrid_element, part, cindex, 0, &entry); hypre_SStructBoxManEntryGetGlobalRank(entry, cindex, &rank, matrix_type); iElement[nElements] = rank; nElements++; /* Element_iedge columns: 3-d, x_edges, y_edges, and z_edges. */ if (ndim == 3) { hypre_SetIndex3(low_index, findex[0] - rfactor[0] + 1, findex[1] - rfactor[1] + 1, findex[2] - rfactor[2] + 1); for (t = 0; t < Edge_nvars; t++) { hypre_CopyIndex(findex, hi_index); var = Edge_vartypes[t]; /* c & f edges enumerated the same */ /* determine looping extents over the refined cells that will have fine edges. */ switch (var) { case 5: /* x_edges */ { hi_index[1] -= 1; hi_index[2] -= 1; break; } case 6: /* y_edges */ { hi_index[0] -= 1; hi_index[2] -= 1; break; } case 7: /* z_edges */ { hi_index[0] -= 1; hi_index[1] -= 1; break; } } /* switch (var) */ /* column ranks. */ for (m = low_index[2]; m <= hi_index[2]; m++) { for (k = low_index[1]; k <= hi_index[1]; k++) { for (j = low_index[0]; j <= hi_index[0]; j++) { hypre_SetIndex3(var_index, j, k, m); hypre_SStructGridFindBoxManEntry(fgrid_edge, part, var_index, t, &entry); hypre_SStructBoxManEntryGetGlobalRank(entry, var_index, &rank, matrix_type); jElement_edge[nElements_iedges] = rank; nElements_iedges++; } /* for (j= findex[0]; j<= hi_index[0]; j++) */ } /* for (k= findex[1]; k<= hi_index[1]; k++) */ } /* for (m= findex[2]; m<= hi_index[2]; m++) */ } /* for (t= 0; t< Edge_nvars; t++) */ } /* if (ndim == 3) */ else if (ndim == 2) /* only x & y faces */ { hypre_SetIndex3(low_index, findex[0] - rfactor[0] + 1, findex[1] - rfactor[1] + 1, findex[2]); for (t = 0; t < Face_nvars; t++) { hypre_CopyIndex(findex, hi_index); var = Face_vartypes[t]; /* c & f faces enumerated the same */ switch (var) /* note: hi_index computed differently in 2-d */ { case 2: /* x_faces */ { hi_index[0] -= 1; break; } case 3: /* y_edges */ { hi_index[1] -= 1; break; } } /* switch (var) */ /* column ranks. */ for (k = low_index[1]; k <= hi_index[1]; k++) { for (j = low_index[0]; j <= hi_index[0]; j++) { hypre_SetIndex3(var_index, j, k, findex[2]); hypre_SStructGridFindBoxManEntry(fgrid_edge, part, var_index, t, &entry); hypre_SStructBoxManEntryGetGlobalRank(entry, var_index, &rank, matrix_type); jElement_edge[nElements_iedges] = rank; nElements_iedges++; } /* for (j= findex[0]; j<= hi_index[0]; j++) */ } /* for (k= findex[1]; k<= hi_index[1]; k++) */ } /* for (t= 0; t< Face_nvars; t++) */ } /* if (ndim == 2) */ } hypre_SerialBoxLoop0End(); } /* hypre_ForBoxI(i, cboxes) */ } /* for (part= 0; part< nparts; part++) */ HYPRE_IJMatrixSetValues(Element_iedge, nElements, ncols_Elementedge, (const HYPRE_BigInt*) iElement, (const HYPRE_BigInt*) jElement_edge, (const HYPRE_Real*) vals_Elementedge); HYPRE_IJMatrixAssemble((HYPRE_IJMatrix) Element_iedge); hypre_TFree(ncols_Elementedge, memory_location); hypre_TFree(jElement_edge, memory_location); hypre_TFree(vals_Elementedge, memory_location); /* Face_edge */ /*------------------------------------------------------------------------------ * Fill out Face_edge a row at a time. Since we have different Face types * so that the size of the cols change depending on what type the Face * is, we need to loop over the grids and take a count of the col elements. * Loop over the coarse face grids and add up the number of interior edges. * Will compute only for 3-d. In 2-d, these structures are obtained for * Edge_edge. *------------------------------------------------------------------------------*/ if (ndim == 3) { ncols_Faceedge = hypre_CTAlloc(HYPRE_Int, nFaces, memory_location); nFaces = 0; j = 0; for (part = 0; part < nparts; part++) { p_cgrid = hypre_SStructGridPGrid(cgrid_face, part); /* Face grid */ Face_nvars = hypre_SStructPGridNVars(p_cgrid); Face_vartypes = hypre_SStructPGridVarTypes(p_cgrid); p_fgrid = hypre_SStructGridPGrid(fgrid_edge, part); var_fgrid = hypre_SStructPGridCellSGrid(p_fgrid); fboxes = hypre_StructGridBoxes(var_fgrid); for (t = 0; t < Face_nvars; t++) { var = Face_vartypes[t]; var_cgrid = hypre_SStructPGridSGrid(p_cgrid, t); k = hypre_StructGridLocalSize(var_cgrid); switch (var) { case 2: /* x_Faces (i,j,k) then (i-1,j,k), contain y,z edges */ { for (i = 0; i < k; i++) { /* y_iedge connections to x_Face */ ncols_Faceedge[nFaces] = (rfactor[2] - 1) * rfactor[1]; /* z_iedge connections to x_Face */ ncols_Faceedge[nFaces] += rfactor[2] * (rfactor[1] - 1); j += ncols_Faceedge[nFaces]; nFaces++; } break; } /* case 2 */ case 3: /* y_Faces (i,j,k) then (i,j-1,k), contain x,z edges */ { for (i = 0; i < k; i++) { /* x_iedge connections to y_Face */ ncols_Faceedge[nFaces] = (rfactor[2] - 1) * rfactor[0]; /* z_iedge connections to y_Face */ ncols_Faceedge[nFaces] += rfactor[2] * (rfactor[0] - 1); j += ncols_Faceedge[nFaces]; nFaces++; } break; } /* case 3 */ case 4: /* z_Faces (i,j,k) then (i,j,k-1), contain x,y edges */ { for (i = 0; i < k; i++) { /* x_iedge connections to z_Face */ ncols_Faceedge[nFaces] = (rfactor[1] - 1) * rfactor[0]; /* y_iedge connections to z_Face */ ncols_Faceedge[nFaces] += rfactor[1] * (rfactor[0] - 1); j += ncols_Faceedge[nFaces]; nFaces++; } break; } /* case 4 */ } /* switch(var) */ } /* for (t= 0; t< Face_nvars; t++) */ } /* for (part= 0; part< nparts; part++) */ jFace_edge = hypre_CTAlloc(HYPRE_BigInt, j, memory_location); vals_Faceedge = hypre_CTAlloc(HYPRE_Real, j, memory_location); for (i = 0; i < j; i++) { vals_Faceedge[i] = 1.0; } /*--------------------------------------------------------------------------- * Fill up the row/column ranks of Face_edge. * Loop over the coarse Cell grid * a) for each Cell box, stretch to a Face box * b) for each coarse face, if it is on the proc, map it to a * coarse cell (add the variable offset). * c) refine the coarse cell and grab the fine cells that will contain * the fine edges. Refining requires a shifting dependent on the * begining index of the fine box. * d) map these fine cells to the fine edges. *---------------------------------------------------------------------------*/ nFaces = 0; nFaces_iedges = 0; for (part = 0; part < nparts; part++) { p_cgrid = hypre_SStructGridPGrid(cgrid_face, part); /* Face grid */ Face_nvars = hypre_SStructPGridNVars(p_cgrid); Face_vartypes = hypre_SStructPGridVarTypes(p_cgrid); for (t = 0; t < Face_nvars; t++) { var = Face_vartypes[t]; var_cgrid = hypre_SStructPGridCellSGrid(p_cgrid); cboxes = hypre_StructGridBoxes(var_cgrid); /* to eliminate comparisons, take the switch outside of the loop. */ switch (var) { case 2: /* x_Faces-> y_iedges, z_iedges */ { hypre_ForBoxI(i, cboxes) { cbox = hypre_BoxArrayBox(cboxes, i); hypre_CopyBox(cbox, ©_box); hypre_SubtractIndexes(hypre_BoxIMin(©_box), varoffsets[var], 3, hypre_BoxIMin(©_box)); hypre_BoxGetSize(©_box, loop_size); hypre_CopyIndex(hypre_BoxIMin(©_box), start); /* determine which fine box cbox has coarsened from */ fboxi = cfbox_mapping[part][i]; fbox = hypre_BoxArrayBox(fboxes, fboxi); /********************************************************** * determine the shift to get the correct c-to-f cell * index map. This is upper_shifts[part][fboxi]. **********************************************************/ hypre_ClearIndex(stride); hypre_CopyIndex(upper_shifts[part][fboxi], stride); hypre_SerialBoxLoop0Begin(ndim, loop_size); { zypre_BoxLoopGetIndex(lindex); hypre_SetIndex3(cindex, lindex[0], lindex[1], lindex[2]); hypre_AddIndexes(cindex, start, 3, cindex); hypre_SStructGridFindBoxManEntry(cgrid_face, part, cindex, t, &entry); hypre_SStructBoxManEntryGetGlobalRank(entry, cindex, &rank, matrix_type); /* check if rank on proc before continuing */ if ((rank <= cupper_ranks[part][var]) && (rank >= clower_ranks[part][var])) { iFace[nFaces] = rank; nFaces++; /* transform face index to cell index */ hypre_AddIndexes(cindex, varoffsets[var], 3, cell_index); /* Refine the coarse cell to the upper fine index. The face will be on the "lower end" fine cells, i.e., the slab box starting with fine index cell_index. The fine edges will be on the lower x of the fine cell, e.g., with fine cell (i,j,k), y_iedge (i-1,j,k) & z_iedge (i-1,j,k). */ hypre_StructMapCoarseToFine(cell_index, zero_index, rfactor, findex); hypre_AddIndexes(findex, stride, 3, findex); /* cell_index was refined to the upper fine index. Shift back to the lower end, subtract (rfactor-1). */ for (j = 0; j < ndim; j++) { findex[j] -= rfactor[j] - 1; } /* y_iedges */ ilower = findex[0] - 1; for (k = 0; k < rfactor[2] - 1; k++) { for (j = 0; j < rfactor[1]; j++) { hypre_SetIndex3(var_index, ilower, j + findex[1], k + findex[2]); hypre_SStructGridFindBoxManEntry(fgrid_edge, part, var_index, vartype_map[6], &entry); hypre_SStructBoxManEntryGetGlobalRank(entry, var_index, &rank, matrix_type); jFace_edge[nFaces_iedges] = rank; nFaces_iedges++; } } /* z_iedges */ for (k = 0; k < rfactor[2]; k++) { for (j = 0; j < rfactor[1] - 1; j++) { hypre_SetIndex3(var_index, ilower, j + findex[1], k + findex[2]); hypre_SStructGridFindBoxManEntry(fgrid_edge, part, var_index, vartype_map[7], &entry); hypre_SStructBoxManEntryGetGlobalRank(entry, var_index, &rank, matrix_type); jFace_edge[nFaces_iedges] = rank; nFaces_iedges++; } } } /* if ((rank <= cupper_ranks[part][var]) && (rank >= clower_ranks[part][var])) */ } hypre_SerialBoxLoop0End(); } /* hypre_ForBoxI(i, cboxes) */ break; } /* case 2: x_Faces-> y_iedges, z_iedges */ case 3: /* y_Faces-> x_iedges, z_iedges */ { hypre_ForBoxI(i, cboxes) { cbox = hypre_BoxArrayBox(cboxes, i); hypre_CopyBox(cbox, ©_box); hypre_SubtractIndexes(hypre_BoxIMin(©_box), varoffsets[var], 3, hypre_BoxIMin(©_box)); hypre_BoxGetSize(©_box, loop_size); hypre_CopyIndex(hypre_BoxIMin(©_box), start); /* determine which fine box cbox has coarsened from */ fboxi = cfbox_mapping[part][i]; fbox = hypre_BoxArrayBox(fboxes, fboxi); /********************************************************** * determine the shift to get the correct c-to-f cell * index map. This is upper_shifts[part][fboxi]. **********************************************************/ hypre_ClearIndex(stride); hypre_CopyIndex(upper_shifts[part][fboxi], stride); hypre_SerialBoxLoop0Begin(ndim, loop_size); { zypre_BoxLoopGetIndex(lindex); hypre_SetIndex3(cindex, lindex[0], lindex[1], lindex[2]); hypre_AddIndexes(cindex, start, 3, cindex); hypre_SStructGridFindBoxManEntry(cgrid_face, part, cindex, t, &entry); hypre_SStructBoxManEntryGetGlobalRank(entry, cindex, &rank, matrix_type); /* check if rank on proc before continuing */ if ((rank <= cupper_ranks[part][var]) && (rank >= clower_ranks[part][var])) { iFace[nFaces] = rank; nFaces++; /* transform face index to cell index */ hypre_AddIndexes(cindex, varoffsets[var], 3, cell_index); /* Refine the coarse cell to the upper fine index. The face will be on the "lower end" fine cells, i.e., the slab box starting with fine index cell_index. The fine edges will be on the lower x of the fine cell, e.g., with fine cell (i,j,k), y_iedge (i-1,j,k) & z_iedge (i-1,j,k). */ hypre_StructMapCoarseToFine(cell_index, zero_index, rfactor, findex); hypre_AddIndexes(findex, stride, 3, findex); /* cell_index is refined to the upper fine index. Shift back to the lower end, subtract (rfactor-1). */ for (j = 0; j < ndim; j++) { findex[j] -= rfactor[j] - 1; } /* x_iedges */ ilower = findex[1] - 1; for (k = 0; k < rfactor[2] - 1; k++) { for (j = 0; j < rfactor[0]; j++) { hypre_SetIndex3(var_index, j + findex[0], ilower, k + findex[2]); hypre_SStructGridFindBoxManEntry(fgrid_edge, part, var_index, vartype_map[5], &entry); hypre_SStructBoxManEntryGetGlobalRank(entry, var_index, &rank, matrix_type); jFace_edge[nFaces_iedges] = rank; nFaces_iedges++; } } /* z_iedges */ for (k = 0; k < rfactor[2]; k++) { for (j = 0; j < rfactor[0] - 1; j++) { hypre_SetIndex3(var_index, j + findex[0], ilower, k + findex[2]); hypre_SStructGridFindBoxManEntry(fgrid_edge, part, var_index, vartype_map[7], &entry); hypre_SStructBoxManEntryGetGlobalRank(entry, var_index, &rank, matrix_type); jFace_edge[nFaces_iedges] = rank; nFaces_iedges++; } } } /* if ((rank <= cupper_ranks[part][var]) && (rank >= clower_ranks[part][var])) */ } hypre_SerialBoxLoop0End(); } /* hypre_ForBoxI(i, cboxes) */ break; } /* case 3: y_Faces-> x_iedges, z_iedges */ case 4: /* z_Faces-> x_iedges, y_iedges */ { hypre_ForBoxI(i, cboxes) { cbox = hypre_BoxArrayBox(cboxes, i); hypre_CopyBox(cbox, ©_box); hypre_SubtractIndexes(hypre_BoxIMin(©_box), varoffsets[var], 3, hypre_BoxIMin(©_box)); hypre_BoxGetSize(©_box, loop_size); hypre_CopyIndex(hypre_BoxIMin(©_box), start); /* determine which fine box cbox has coarsened from */ fboxi = cfbox_mapping[part][i]; fbox = hypre_BoxArrayBox(fboxes, fboxi); /********************************************************** * determine the shift to get the correct c-to-f cell * index map. This is upper_shifts[part][fboxi]. **********************************************************/ hypre_ClearIndex(stride); hypre_CopyIndex(upper_shifts[part][fboxi], stride); hypre_SerialBoxLoop0Begin(ndim, loop_size); { zypre_BoxLoopGetIndex(lindex); hypre_SetIndex3(cindex, lindex[0], lindex[1], lindex[2]); hypre_AddIndexes(cindex, start, 3, cindex); hypre_SStructGridFindBoxManEntry(cgrid_face, part, cindex, t, &entry); hypre_SStructBoxManEntryGetGlobalRank(entry, cindex, &rank, matrix_type); /* check if rank on proc before continuing */ if ((rank <= cupper_ranks[part][var]) && (rank >= clower_ranks[part][var])) { iFace[nFaces] = rank; nFaces++; /* transform face index to cell index */ hypre_AddIndexes(cindex, varoffsets[var], 3, cell_index); /* Refine the coarse cell to the upper fine index. The face will be on the "lower end" fine cells, i.e., the slab box starting with fine index cell_index. The fine edges will be on the lower x of the fine cell, e.g., with fine cell (i,j,k), y_iedge (i-1,j,k) & z_iedge (i-1,j,k). */ hypre_StructMapCoarseToFine(cell_index, zero_index, rfactor, findex); hypre_AddIndexes(findex, stride, 3, findex); /* cell_index is refined to the upper fine index. Shift back to the lower end, subtract (rfactor-1). */ for (j = 0; j < ndim; j++) { findex[j] -= rfactor[j] - 1; } /* x_iedges */ ilower = findex[2] - 1; for (k = 0; k < rfactor[1] - 1; k++) { for (j = 0; j < rfactor[0]; j++) { hypre_SetIndex3(var_index, j + findex[0], k + findex[1], ilower); hypre_SStructGridFindBoxManEntry(fgrid_edge, part, var_index, vartype_map[5], &entry); hypre_SStructBoxManEntryGetGlobalRank(entry, var_index, &rank, matrix_type); jFace_edge[nFaces_iedges] = rank; nFaces_iedges++; } } /* y_iedges */ for (k = 0; k < rfactor[1]; k++) { for (j = 0; j < rfactor[0] - 1; j++) { hypre_SetIndex3(var_index, j + findex[0], k + findex[1], ilower); hypre_SStructGridFindBoxManEntry(fgrid_edge, part, var_index, vartype_map[6], &entry); hypre_SStructBoxManEntryGetGlobalRank(entry, var_index, &rank, matrix_type); jFace_edge[nFaces_iedges] = rank; nFaces_iedges++; } } } /* if ((rank <= cupper_ranks[part][var]) && (rank >= clower_ranks[part][var])) */ } hypre_SerialBoxLoop0End(); } /* hypre_ForBoxI(i, cboxes) */ break; } /* case 4: z_Faces-> x_iedges, y_iedges */ } /* switch(var) */ } /* for (t= 0; t< Face_nvars; t++) */ } /* for (part= 0; part< nparts; part++) */ HYPRE_IJMatrixSetValues(Face_iedge, nFaces, ncols_Faceedge, (const HYPRE_BigInt*) iFace, (const HYPRE_BigInt*) jFace_edge, (const HYPRE_Real*) vals_Faceedge); HYPRE_IJMatrixAssemble((HYPRE_IJMatrix) Face_iedge); hypre_TFree(ncols_Faceedge, memory_location); hypre_TFree(iFace, memory_location); hypre_TFree(jFace_edge, memory_location); hypre_TFree(vals_Faceedge, memory_location); } /* if (ndim == 3) */ /* Edge_edge */ /*------------------------------------------------------------------------------ * Count the Edge_edge connections. Will need to distinguish 2-d and 3-d. *------------------------------------------------------------------------------*/ /* nEdges should be correct for 2-d & 3-d */ ncols_Edgeiedge = hypre_CTAlloc(HYPRE_Int, nEdges, memory_location); nEdges = 0; k = 0; for (part = 0; part < nparts; part++) { /* Edge grid. In 2-d this will be the face grid, which is assumed to be in cgrid_edge. */ p_cgrid = hypre_SStructGridPGrid(cgrid_edge, part); Edge_vartypes = hypre_SStructPGridVarTypes(p_cgrid); Edge_nvars = hypre_SStructPGridNVars(p_cgrid); for (t = 0; t < Edge_nvars; t++) { var = Edge_vartypes[t]; var_cgrid = hypre_SStructPGridSGrid(p_cgrid, t); j = hypre_StructGridLocalSize(var_cgrid); switch (var) { case 2: /* 2-d, x_Face */ { m = rfactor[1]; break; } case 3: /* 2-d, y_Face */ { m = rfactor[0]; break; } case 5: /* 3-d, x_Edge */ { m = rfactor[0]; break; } case 6: /* 3-d, y_Edge */ { m = rfactor[1]; break; } case 7: /* 3-d, z_Edge */ { m = rfactor[2]; break; } default: { m = 0; } } for (i = nEdges; i < nEdges + j; i++) /*fill in the column size for Edge */ { ncols_Edgeiedge[i] = m; k += m; } nEdges += j; } /* for (t= 0; t< Edge_nvars; t++) */ } /* for (part= 0; part< nparts; part++) */ jEdge_iedge = hypre_CTAlloc(HYPRE_BigInt, k, memory_location); vals_Edgeiedge = hypre_CTAlloc(HYPRE_Real, k, memory_location); for (i = 0; i < k; i++) { vals_Edgeiedge[i] = 1.0; } /*--------------------------------------------------------------------------- * Fill up the row/column ranks of Edge_edge. Since a refinement of the * coarse edge index does not get the correct fine edge index, we need to * map it to the cell grid. Recall, all variable grids are gotten by coarsening * a cell centred grid. * Loop over the coarse Cell grid * a) for each Cell box, map to an Edge box * b) for each coarse Edge on my proc , map it to a coarse cell * (add the variable offset). * c) refine the coarse cell and grab the fine cells that will contain * the fine edges. * d) map these fine cells to the fine edges. *---------------------------------------------------------------------------*/ nEdges = 0; nEdges_iedges = 0; for (part = 0; part < nparts; part++) { p_cgrid = hypre_SStructGridPGrid(cgrid_edge, part); Edge_vartypes = hypre_SStructPGridVarTypes(p_cgrid); Edge_nvars = hypre_SStructPGridNVars(p_cgrid); p_fgrid = hypre_SStructGridPGrid(fgrid_edge, part); var_fgrid = hypre_SStructPGridCellSGrid(p_fgrid); fboxes = hypre_StructGridBoxes(var_fgrid); for (t = 0; t < Edge_nvars; t++) { var = Edge_vartypes[t]; var_cgrid = hypre_SStructPGridCellSGrid(p_cgrid); cboxes = hypre_StructGridBoxes(var_cgrid); hypre_ForBoxI(i, cboxes) { cbox = hypre_BoxArrayBox(cboxes, i); /*------------------------------------------------------------------- * extract the variable box by offsetting with var_offset. Note that * this may lead to a bigger variable domain than is on this proc. * Off-proc Edges will be checked to eliminate this problem. *-------------------------------------------------------------------*/ hypre_CopyBox(cbox, ©_box); hypre_SubtractIndexes(hypre_BoxIMin(©_box), varoffsets[var], 3, hypre_BoxIMin(©_box)); hypre_BoxGetSize(©_box, loop_size); hypre_CopyIndex(hypre_BoxIMin(©_box), start); /* determine which fine box cbox has coarsened from */ fboxi = cfbox_mapping[part][i]; fbox = hypre_BoxArrayBox(fboxes, fboxi); /********************************************************** * determine the shift to get the correct c-to-f cell * index map. This is upper_shifts[part][fboxi]. **********************************************************/ hypre_ClearIndex(stride); hypre_CopyIndex(upper_shifts[part][fboxi], stride); hypre_SerialBoxLoop0Begin(ndim, loop_size); { zypre_BoxLoopGetIndex(lindex); hypre_SetIndex3(cindex, lindex[0], lindex[1], lindex[2]); hypre_AddIndexes(cindex, start, 3, cindex); /* row rank */ hypre_SStructGridFindBoxManEntry(cgrid_edge, part, cindex, t, &entry); hypre_SStructBoxManEntryGetGlobalRank(entry, cindex, &rank, matrix_type); /* check if rank on proc before continuing */ if ((rank <= cupper_ranks[part][var]) && (rank >= clower_ranks[part][var])) { iEdge[nEdges] = rank; nEdges++; hypre_AddIndexes(cindex, varoffsets[var], 3, cell_index); /* refine cindex and then map back to variable index */ hypre_StructMapCoarseToFine(cell_index, zero_index, rfactor, findex); hypre_AddIndexes(findex, stride, 3, findex); /* cell_index is refined to the upper fine index. Shift back to the lower end, subtract (rfactor-1). */ for (j = 0; j < ndim; j++) { findex[j] -= rfactor[j] - 1; } hypre_SubtractIndexes(findex, varoffsets[var], 3, var_index); switch (var) { case 2: /* 2-d, x_face */ { for (m = 0; m < rfactor[1]; m++) { hypre_SStructGridFindBoxManEntry(fgrid_edge, part, var_index, t, &entry); hypre_SStructBoxManEntryGetGlobalRank(entry, var_index, &rank, matrix_type); jEdge_iedge[nEdges_iedges] = rank; nEdges_iedges++; /* increment the x component to get the next one in the refinement cell. */ var_index[1]++; } break; } case 3: /* 2-d, y_face */ { for (m = 0; m < rfactor[0]; m++) { hypre_SStructGridFindBoxManEntry(fgrid_edge, part, var_index, t, &entry); hypre_SStructBoxManEntryGetGlobalRank(entry, var_index, &rank, matrix_type); jEdge_iedge[nEdges_iedges] = rank; nEdges_iedges++; /* increment the y component to get the next one in the refinement cell. */ var_index[0]++; } break; } case 5: /* 3-d, x_edge */ { for (m = 0; m < rfactor[0]; m++) { hypre_SStructGridFindBoxManEntry(fgrid_edge, part, var_index, t, &entry); hypre_SStructBoxManEntryGetGlobalRank(entry, var_index, &rank, matrix_type); jEdge_iedge[nEdges_iedges] = rank; nEdges_iedges++; /* increment the x component to get the next one in the refinement cell. */ var_index[0]++; } break; } case 6: /* 3-d, y_edge */ { for (m = 0; m < rfactor[1]; m++) { hypre_SStructGridFindBoxManEntry(fgrid_edge, part, var_index, t, &entry); hypre_SStructBoxManEntryGetGlobalRank(entry, var_index, &rank, matrix_type); jEdge_iedge[nEdges_iedges] = rank; nEdges_iedges++; /* increment the y component to get the next one in the refinement cell. */ var_index[1]++; } break; } case 7: /* 3-d, z_edge */ { for (m = 0; m < rfactor[2]; m++) { hypre_SStructGridFindBoxManEntry(fgrid_edge, part, var_index, t, &entry); hypre_SStructBoxManEntryGetGlobalRank(entry, var_index, &rank, matrix_type); jEdge_iedge[nEdges_iedges] = rank; nEdges_iedges++; /* increment the z component to get the next one in the refinement cell. */ var_index[2]++; } break; } } /* switch(var) */ } /* if ((rank <= cupper_ranks[part][var]) && (rank >= clower_ranks[part][var])) */ } hypre_SerialBoxLoop0End(); } /* hypre_ForBoxI(i, cboxes) */ } /* for (t= 0; t< Edge_nvars; t++) */ } /* for (part= 0; part< nparts; part++) */ HYPRE_IJMatrixSetValues(Edge_iedge, nEdges, ncols_Edgeiedge, (const HYPRE_BigInt*) iEdge, (const HYPRE_BigInt*) jEdge_iedge, (const HYPRE_Real*) vals_Edgeiedge); HYPRE_IJMatrixAssemble((HYPRE_IJMatrix) Edge_iedge); hypre_TFree(ncols_Edgeiedge, memory_location); hypre_TFree(iEdge, memory_location); hypre_TFree(jEdge_iedge, memory_location); hypre_TFree(vals_Edgeiedge, memory_location); /* Element_Face & Element_Edge. Element_Face only for 3-d. */ if (ndim == 3) { ncols_ElementFace = hypre_CTAlloc(HYPRE_Int, nElements, memory_location); j = 2 * ndim; for (i = 0; i < nElements; i++) { ncols_ElementFace[i] = j; /* 3-dim -> 6 */ } j *= nElements; jElement_Face = hypre_CTAlloc(HYPRE_BigInt, j, memory_location); vals_ElementFace = hypre_CTAlloc(HYPRE_Real, j, memory_location); for (i = 0; i < j; i++) { vals_ElementFace[i] = 1.0; } } ncols_ElementEdge = hypre_CTAlloc(HYPRE_Int, nElements, memory_location); j = 2 * ndim; k = (ndim - 1) * j; for (i = 0; i < nElements; i++) { ncols_ElementEdge[i] = k; /* 2-dim -> 4; 3-dim -> 12 */ } k *= nElements; jElement_Edge = hypre_CTAlloc(HYPRE_BigInt, k, memory_location); vals_ElementEdge = hypre_CTAlloc(HYPRE_Real, k, memory_location); for (i = 0; i < k; i++) { vals_ElementEdge[i] = 1.0; } /*--------------------------------------------------------------------------- * Fill up the column ranks of ELement_Face and Element_Edge. Note that the * iElement has alrady been formed when filling Element_edge. *---------------------------------------------------------------------------*/ nElements_Faces = 0; nElements_Edges = 0; for (part = 0; part < nparts; part++) { /* grab the nvars & vartypes for the face and edge variables */ if (ndim == 3) { p_cgrid = hypre_SStructGridPGrid(cgrid_face, part); Face_nvars = hypre_SStructPGridNVars(p_cgrid); Face_vartypes = hypre_SStructPGridVarTypes(p_cgrid); } p_cgrid = hypre_SStructGridPGrid(cgrid_edge, part); /* Edge grid */ Edge_nvars = hypre_SStructPGridNVars(p_cgrid); Edge_vartypes = hypre_SStructPGridVarTypes(p_cgrid); p_cgrid = hypre_SStructGridPGrid(cgrid_element, part); /* cell grid */ var_cgrid = hypre_SStructPGridCellSGrid(p_cgrid); cboxes = hypre_StructGridBoxes(var_cgrid); if (ndim == 3) { hypre_ForBoxI(i, cboxes) { cbox = hypre_BoxArrayBox(cboxes, i); hypre_BoxGetSize(cbox, loop_size); hypre_CopyIndex(hypre_BoxIMin(cbox), start); hypre_SerialBoxLoop0Begin(ndim, loop_size); { zypre_BoxLoopGetIndex(lindex); hypre_SetIndex3(cindex, lindex[0], lindex[1], lindex[2]); hypre_AddIndexes(cindex, start, 3, cindex); /*------------------------------------------------------------- * jElement_Face: (i,j,k) then (i-1,j,k), (i,j-1,k), (i,j,k-1). *-------------------------------------------------------------*/ for (t = 0; t < Face_nvars; t++) { var = Face_vartypes[t]; hypre_SStructGridFindBoxManEntry(cgrid_face, part, cindex, t, &entry); hypre_SStructBoxManEntryGetGlobalRank(entry, cindex, &rank, matrix_type); jElement_Face[nElements_Faces] = rank; nElements_Faces++; hypre_SubtractIndexes(cindex, varoffsets[var], 3, var_index); hypre_SStructGridFindBoxManEntry(cgrid_face, part, var_index, t, &entry); hypre_SStructBoxManEntryGetGlobalRank(entry, var_index, &rank, matrix_type); jElement_Face[nElements_Faces] = rank; nElements_Faces++; } } hypre_SerialBoxLoop0End(); } /* hypre_ForBoxI(i, cboxes) */ } /* if (ndim == 3) */ /*------------------------------------------------------------------- * jElement_Edge: * 3-dim * x_Edge: (i,j,k) then (i,j-1,k), (i,j-1,k-1), (i,j,k-1) * y_Edge: (i,j,k) then (i-1,j,k), (i-1,j,k-1), (i,j,k-1) * z_Edge: (i,j,k) then (i,j-1,k), (i-1,j-1,k), (i-1,j,k) * * 2-dim * x_Edge or x_Face: (i,j) then (i-1,j) * y_Edge or y_Face: (i,j) then (i,j-1) *-------------------------------------------------------------------*/ hypre_ForBoxI(i, cboxes) { cbox = hypre_BoxArrayBox(cboxes, i); hypre_BoxGetSize(cbox, loop_size); hypre_CopyIndex(hypre_BoxIMin(cbox), start); hypre_SerialBoxLoop0Begin(ndim, loop_size); { zypre_BoxLoopGetIndex(lindex); hypre_SetIndex3(cindex, lindex[0], lindex[1], lindex[2]); hypre_AddIndexes(cindex, start, 3, cindex); for (t = 0; t < Edge_nvars; t++) { /* Edge (i,j,k) */ var = Edge_vartypes[t]; switch (var) { case 2: /* x_Face= {(i,j), (i-1,j)} */ { hypre_SStructGridFindBoxManEntry(cgrid_edge, part, cindex, t, &entry); hypre_SStructBoxManEntryGetGlobalRank(entry, cindex, &rank, matrix_type); jElement_Edge[nElements_Edges] = rank; nElements_Edges++; hypre_SubtractIndexes(cindex, ishift, 3, var_index); hypre_SStructGridFindBoxManEntry(cgrid_edge, part, var_index, t, &entry); hypre_SStructBoxManEntryGetGlobalRank(entry, var_index, &rank, matrix_type); jElement_Edge[nElements_Edges] = rank; nElements_Edges++; break; } case 3: /* y_Face= {(i,j), (i,j-1)} */ { hypre_SStructGridFindBoxManEntry(cgrid_edge, part, cindex, t, &entry); hypre_SStructBoxManEntryGetGlobalRank(entry, cindex, &rank, matrix_type); jElement_Edge[nElements_Edges] = rank; nElements_Edges++; hypre_SubtractIndexes(cindex, jshift, 3, var_index); hypre_SStructGridFindBoxManEntry(cgrid_edge, part, var_index, t, &entry); hypre_SStructBoxManEntryGetGlobalRank(entry, var_index, &rank, matrix_type); jElement_Edge[nElements_Edges] = rank; nElements_Edges++; break; } case 5: /* "/" x_Edge={(i,j,k),(i,j-1,k),(i,j-1,k-1),(i,j,k-1)} */ { hypre_SStructGridFindBoxManEntry(cgrid_edge, part, cindex, t, &entry); hypre_SStructBoxManEntryGetGlobalRank(entry, cindex, &rank, matrix_type); jElement_Edge[nElements_Edges] = rank; nElements_Edges++; hypre_SubtractIndexes(cindex, jshift, 3, var_index); hypre_SStructGridFindBoxManEntry(cgrid_edge, part, var_index, t, &entry); hypre_SStructBoxManEntryGetGlobalRank(entry, var_index, &rank, matrix_type); jElement_Edge[nElements_Edges] = rank; nElements_Edges++; hypre_SubtractIndexes(var_index, kshift, 3, var_index); hypre_SStructGridFindBoxManEntry(cgrid_edge, part, var_index, t, &entry); hypre_SStructBoxManEntryGetGlobalRank(entry, var_index, &rank, matrix_type); jElement_Edge[nElements_Edges] = rank; nElements_Edges++; hypre_AddIndexes(var_index, jshift, 3, var_index); hypre_SStructGridFindBoxManEntry(cgrid_edge, part, var_index, t, &entry); hypre_SStructBoxManEntryGetGlobalRank(entry, var_index, &rank, matrix_type); jElement_Edge[nElements_Edges] = rank; nElements_Edges++; break; } case 6: /* "-" y_Edge={(i,j,k),(i-1,j,k),(i-1,j,k-1),(i,j,k-1)}*/ { hypre_SStructGridFindBoxManEntry(cgrid_edge, part, cindex, t, &entry); hypre_SStructBoxManEntryGetGlobalRank(entry, cindex, &rank, matrix_type); jElement_Edge[nElements_Edges] = rank; nElements_Edges++; hypre_SubtractIndexes(cindex, ishift, 3, var_index); hypre_SStructGridFindBoxManEntry(cgrid_edge, part, var_index, t, &entry); hypre_SStructBoxManEntryGetGlobalRank(entry, var_index, &rank, matrix_type); jElement_Edge[nElements_Edges] = rank; nElements_Edges++; hypre_SubtractIndexes(var_index, kshift, 3, var_index); hypre_SStructGridFindBoxManEntry(cgrid_edge, part, var_index, t, &entry); hypre_SStructBoxManEntryGetGlobalRank(entry, var_index, &rank, matrix_type); jElement_Edge[nElements_Edges] = rank; nElements_Edges++; hypre_AddIndexes(var_index, ishift, 3, var_index); hypre_SStructGridFindBoxManEntry(cgrid_edge, part, var_index, t, &entry); hypre_SStructBoxManEntryGetGlobalRank(entry, var_index, &rank, matrix_type); jElement_Edge[nElements_Edges] = rank; nElements_Edges++; break; } case 7: /* "|" z_Edge={(i,j,k),(i,j-1,k),(i-1,j-1,k),(i-1,j,k)}*/ { hypre_SStructGridFindBoxManEntry(cgrid_edge, part, cindex, t, &entry); hypre_SStructBoxManEntryGetGlobalRank(entry, cindex, &rank, matrix_type); jElement_Edge[nElements_Edges] = rank; nElements_Edges++; hypre_SubtractIndexes(cindex, jshift, 3, var_index); hypre_SStructGridFindBoxManEntry(cgrid_edge, part, var_index, t, &entry); hypre_SStructBoxManEntryGetGlobalRank(entry, var_index, &rank, matrix_type); jElement_Edge[nElements_Edges] = rank; nElements_Edges++; hypre_SubtractIndexes(var_index, ishift, 3, var_index); hypre_SStructGridFindBoxManEntry(cgrid_edge, part, var_index, t, &entry); hypre_SStructBoxManEntryGetGlobalRank(entry, var_index, &rank, matrix_type); jElement_Edge[nElements_Edges] = rank; nElements_Edges++; hypre_AddIndexes(var_index, jshift, 3, var_index); hypre_SStructGridFindBoxManEntry(cgrid_edge, part, var_index, t, &entry); hypre_SStructBoxManEntryGetGlobalRank(entry, var_index, &rank, matrix_type); jElement_Edge[nElements_Edges] = rank; nElements_Edges++; break; } } /* switch (var) */ } /* for (t= 0; t< Edge_nvars; t++) */ } hypre_SerialBoxLoop0End(); } /* hypre_ForBoxI(i, cboxes) */ } /* for (part= 0; part< nparts; part++) */ if (ndim == 3) { HYPRE_IJMatrixSetValues(Element_Face, nElements, ncols_ElementFace, (const HYPRE_BigInt*) iElement, (const HYPRE_BigInt*) jElement_Face, (const HYPRE_Real*) vals_ElementFace); HYPRE_IJMatrixAssemble((HYPRE_IJMatrix) Element_Face); hypre_TFree(ncols_ElementFace, memory_location); hypre_TFree(jElement_Face, memory_location); hypre_TFree(vals_ElementFace, memory_location); } /* if (ndim == 3) */ HYPRE_IJMatrixSetValues(Element_Edge, nElements, ncols_ElementEdge, (const HYPRE_BigInt*) iElement, (const HYPRE_BigInt*) jElement_Edge, (const HYPRE_Real*) vals_ElementEdge); HYPRE_IJMatrixAssemble((HYPRE_IJMatrix) Element_Edge); hypre_TFree(ncols_ElementEdge, memory_location); hypre_TFree(iElement, memory_location); hypre_TFree(jElement_Edge, memory_location); hypre_TFree(vals_ElementEdge, memory_location); /*----------------------------------------------------------------------- * edge_Edge, the actual interpolation matrix. * For each fine edge row, we need to know if it is a edge, * boundary edge, or face edge. Knowing this allows us to determine the * structure and weights of the interpolation matrix. * * Scheme:A.Loop over contracted boxes of fine edge grid. * For each fine edge ijk, * 1) map it to a fine cell with the fine edge at the lower end * of the box,e.g. x_edge[ijk] -> cell[i,j+1,k+1]. * 2) coarsen the fine cell to obtain a coarse cell. Determine the * location of the fine edge with respect to the coarse edges * of this cell. Coarsening needed only when determining the * column rank. * * Need to distinguish between 2-d and 3-d. *-----------------------------------------------------------------------*/ /* count the row/col connections */ iedgeEdge = hypre_CTAlloc(HYPRE_BigInt, nedges, memory_location); ncols_edgeEdge = hypre_CTAlloc(HYPRE_Int, nedges, memory_location); /*----------------------------------------------------------------------- * loop first over the fedges aligning with the agglomerate coarse edges. * Will loop over the face & interior edges separately also. * Since the weights for these edges will be used to determine the * weights along the face edges, we need to retrieve these computed * weights from vals_edgeEdge. Done by keeping a pointer of size nedges * that points to the location of the weight: * pointer[rank of edge]= index location where weight resides. *-----------------------------------------------------------------------*/ j = 0; start_rank1 = hypre_SStructGridStartRank(fgrid_edge); bdryedge_location = hypre_CTAlloc(HYPRE_Int, nedges, HYPRE_MEMORY_HOST); for (part = 0; part < nparts; part++) { p_fgrid = hypre_SStructGridPGrid(fgrid_edge, part); /* edge grid */ Edge_nvars = hypre_SStructPGridNVars(p_fgrid); Edge_vartypes = hypre_SStructPGridVarTypes(p_fgrid); /* note that fboxes are the contracted CELL boxes. Will get the correct variable grid extents. */ fboxes = contract_fedgeBoxes[part]; for (t = 0; t < Edge_nvars; t++) { var = Edge_vartypes[t]; var_fgrid = hypre_SStructPGridVTSGrid(p_fgrid, var); box_array = hypre_StructGridBoxes(var_fgrid); n_boxoffsets = ndim - 1; boxoffset = hypre_CTAlloc(hypre_Index, n_boxoffsets, HYPRE_MEMORY_HOST); suboffset = hypre_CTAlloc(hypre_Index, n_boxoffsets, HYPRE_MEMORY_HOST); switch (var) { case 2: /* 2-d: x_face (vertical edges), stride=[rfactor[0],1,1] */ { hypre_SetIndex3(stride, rfactor[0], 1, 1); hypre_CopyIndex(varoffsets[2], var_index); /* boxoffset shrink in the i direction */ hypre_SetIndex3(boxoffset[0], rfactor[0] - 1, 0, 0); hypre_SetIndex3(suboffset[0], 1, 0, 0); /* extend loop_size by one in the stride direction */ hypre_SetIndex3(hi_index, 1, 0, 0); break; } case 3: /* 2-d: y_face (horizontal edges), stride=[1,rfactor[1],1] */ { hypre_SetIndex3(stride, 1, rfactor[1], 1); hypre_CopyIndex(varoffsets[3], var_index); /* boxoffset shrink in the j direction */ hypre_SetIndex3(boxoffset[0], 0, rfactor[1] - 1, 0); hypre_SetIndex3(suboffset[0], 0, 1, 0); /* extend loop_size by one in the stride direction */ hypre_SetIndex3(hi_index, 0, 1, 0); break; } case 5: /* 3-d: x_edge, stride=[1,rfactor[1],rfactor[2]] */ { hypre_SetIndex3(stride, 1, rfactor[1], rfactor[2]); hypre_CopyIndex(varoffsets[5], var_index); /* boxoffset shrink in the j & k directions */ hypre_SetIndex3(boxoffset[0], 0, rfactor[1] - 1, 0); hypre_SetIndex3(boxoffset[1], 0, 0, rfactor[2] - 1); hypre_SetIndex3(suboffset[0], 0, 1, 0); hypre_SetIndex3(suboffset[1], 0, 0, 1); /* extend loop_size by one in the stride direction */ hypre_SetIndex3(hi_index, 0, 1, 1); break; } case 6: /* 3-d: y_edge, stride=[rfactor[0],1,rfactor[2]] */ { hypre_SetIndex3(stride, rfactor[0], 1, rfactor[2]); hypre_CopyIndex(varoffsets[6], var_index); /* boxoffset shrink in the i & k directions */ hypre_SetIndex3(boxoffset[0], rfactor[0] - 1, 0, 0); hypre_SetIndex3(boxoffset[1], 0, 0, rfactor[2] - 1); hypre_SetIndex3(suboffset[0], 1, 0, 0); hypre_SetIndex3(suboffset[1], 0, 0, 1); /* extend loop_size by one in the stride direction */ hypre_SetIndex3(hi_index, 1, 0, 1); break; } case 7: /* 3-d: z_edge, stride=[rfactor[0],rfactor[1],1] */ { hypre_SetIndex3(stride, rfactor[0], rfactor[1], 1); hypre_CopyIndex(varoffsets[7], var_index); /* boxoffset shrink in the i & j directions */ hypre_SetIndex3(boxoffset[0], rfactor[0] - 1, 0, 0); hypre_SetIndex3(boxoffset[1], 0, rfactor[1] - 1, 0); hypre_SetIndex3(suboffset[0], 1, 0, 0); hypre_SetIndex3(suboffset[1], 0, 1, 0); /* extend loop_size by one in the stride direction */ hypre_SetIndex3(hi_index, 1, 1, 0); break; } } hypre_ForBoxI(i, fboxes) { cellbox = hypre_BoxArrayBox(fboxes, i); /* vboxes inside the i'th cellbox */ num_vboxes = n_CtoVbox[part][i]; vboxnums = CtoVboxnums[part][i]; /* adjust the project cellbox to the variable box */ hypre_CopyBox(cellbox, ©_box); /* the adjusted variable box may be bigger than the actually variable box- variables that are shared may lead to smaller variable boxes than the SubtractIndex produces. If the box has to be decreased, then we decrease it by (rfactor[j]-1) in the appropriate direction. Check the location of the shifted lower box index. */ for (k = 0; k < n_boxoffsets; k++) { hypre_SubtractIndexes(hypre_BoxIMin(©_box), suboffset[k], 3, findex); row_in = falseV; for (p = 0; p < num_vboxes[t]; p++) { vbox = hypre_BoxArrayBox(box_array, vboxnums[t][p]); if (hypre_IndexInBox(findex, vbox)) { hypre_CopyIndex(findex, hypre_BoxIMin(©_box)); row_in = trueV; break; } } /* not in any vbox */ if (!row_in) { hypre_AddIndexes(hypre_BoxIMin(©_box), boxoffset[k], 3, hypre_BoxIMin(©_box)); } } hypre_BoxGetSize(©_box, loop_size); hypre_StructMapFineToCoarse(loop_size, zero_index, stride, loop_size); /* extend the loop_size so that upper boundary of the box are reached. */ hypre_AddIndexes(loop_size, hi_index, 3, loop_size); hypre_CopyIndex(hypre_BoxIMin(©_box), start); hypre_SerialBoxLoop1Begin(ndim, loop_size, ©_box, start, stride, m); { zypre_BoxLoopGetIndex(lindex); hypre_SetIndex3(findex, lindex[0], lindex[1], lindex[2]); for (k = 0; k < 3; k++) { findex[k] *= stride[k]; } hypre_AddIndexes(findex, start, 3, findex); hypre_SStructGridFindBoxManEntry(fgrid_edge, part, findex, t, &entry); hypre_SStructBoxManEntryGetGlobalRank(entry, findex, &rank, matrix_type); /* still row p may be outside the processor- check to make sure in */ if ((rank <= fupper_ranks[part][var]) && (rank >= flower_ranks[part][var])) { iedgeEdge[j] = rank; ncols_edgeEdge[j] = 1; bdryedge_location[rank - start_rank1] = j; j++; } } hypre_SerialBoxLoop1End(m); } /* hypre_ForBoxI */ hypre_TFree(boxoffset, HYPRE_MEMORY_HOST); hypre_TFree(suboffset, HYPRE_MEMORY_HOST); } /* for (t= 0; t< nvars; t++) */ } /* for (part= 0; part< nparts; part++) */ /*----------------------------------------------------------------------- * Record the row ranks for the face edges. Only for 3-d. * * Loop over the face edges. * Since the weights for these edges will be used to determine the * weights along the face edges, we need to retrieve these computed * weights form vals_edgeEdge. Done by keeping a pointer of size nedges * that points to the location of the weight: * pointer[rank of edge]= index location where weight resides. *-----------------------------------------------------------------------*/ if (ndim == 3) { l = j; for (part = 0; part < nparts; part++) { p_fgrid = hypre_SStructGridPGrid(fgrid_edge, part); /* edge grid */ Edge_nvars = hypre_SStructPGridNVars(p_fgrid); Edge_vartypes = hypre_SStructPGridVarTypes(p_fgrid); /* note that fboxes are the contracted CELL boxes. Will get the correct variable grid extents. */ fboxes = contract_fedgeBoxes[part]; /* may need to shrink a given box in some boxoffset directions */ boxoffset = hypre_TAlloc(hypre_Index, ndim, HYPRE_MEMORY_HOST); for (t = 0; t < ndim; t++) { hypre_ClearIndex(boxoffset[t]); hypre_IndexD(boxoffset[t], t) = rfactor[t] - 1; } for (t = 0; t < Edge_nvars; t++) { var = Edge_vartypes[t]; var_fgrid = hypre_SStructPGridVTSGrid(p_fgrid, var); box_array = hypre_StructGridBoxes(var_fgrid); /* to reduce comparison, take the switch outside of the loop */ switch (var) { case 5: { /* 3-d x_edge, can be Y or Z_Face */ hypre_ForBoxI(i, fboxes) { cellbox = hypre_BoxArrayBox(fboxes, i); /* vboxes inside the i'th cellbox */ num_vboxes = n_CtoVbox[part][i]; vboxnums = CtoVboxnums[part][i]; /* adjust the contracted cellbox to the variable box */ hypre_CopyBox(cellbox, ©_box); /****************************************************** * Check the location of the shifted lower box index: * x_edge-> Z_Face & Y_Face: * Z_Face- contract in the z direction only if the * processor interface is in the z direction * Y_Face- contract in the y direction if the processor * interface is in the y direction. ******************************************************/ hypre_SubtractIndexes(hypre_BoxIMin(©_box), kshift, 3, findex); /* loop over all the vboxes to see if findex is inside */ row_in = falseV; for (p = 0; p < num_vboxes[t]; p++) { vbox = hypre_BoxArrayBox(box_array, vboxnums[t][p]); if (hypre_IndexInBox(findex, vbox)) { hypre_CopyIndex(findex, hypre_BoxIMin(©_box)); row_in = trueV; break; } } /* not in any vbox */ if (!row_in) { hypre_AddIndexes(hypre_BoxIMin(©_box), boxoffset[2], 3, hypre_BoxIMin(©_box)); } hypre_SubtractIndexes(hypre_BoxIMin(©_box), jshift, 3, hypre_BoxIMin(©_box)); hypre_BoxGetSize(©_box, loop_size); hypre_StructMapFineToCoarse(loop_size, zero_index, rfactor, loop_size); hypre_CopyIndex(hypre_BoxIMin(©_box), start); /* increase the loop_size by one in the Z plane direction */ loop_size[2]++; hypre_SerialBoxLoop1Begin(ndim, loop_size, ©_box, start, rfactor, m); { zypre_BoxLoopGetIndex(lindex); hypre_SetIndex3(findex, lindex[0], lindex[1], lindex[2]); for (k = 0; k < 3; k++) { findex[k] *= rfactor[k]; } hypre_AddIndexes(findex, start, 3, findex); /************************************************************ * Loop over the Z_Face x_edges. ************************************************************/ for (p = 0; p < rfactor[0]; p++) { hypre_CopyIndex(findex, var_index); var_index[0] += p; for (n = 1; n < rfactor[1]; n++) { var_index[1]++; hypre_SStructGridFindBoxManEntry(fgrid_edge, part, var_index, t, &entry); hypre_SStructBoxManEntryGetGlobalRank(entry, var_index, &rank, matrix_type); /* still row rank may be outside the processor */ if ((rank <= fupper_ranks[part][var]) && (rank >= flower_ranks[part][var])) { iedgeEdge[j] = rank; /* Z_Face. Two coarse Edge connections. */ ncols_edgeEdge[j] = 2; j++; /* record index location */ bdryedge_location[rank - start_rank1] = l; l += 2; /* two weight values */ } } /* for (n= 1; n< rfactor[1]; n++) */ } /* for (p= 0; p< rfactor[0]; p++) */ } hypre_SerialBoxLoop1End(m); /* Y_Face */ hypre_CopyBox(cellbox, ©_box); hypre_SubtractIndexes(hypre_BoxIMin(©_box), jshift, 3, findex); /* loop over all the vboxes to see if findex is inside */ row_in = falseV; for (p = 0; p < num_vboxes[t]; p++) { vbox = hypre_BoxArrayBox(box_array, vboxnums[t][p]); if (hypre_IndexInBox(findex, vbox)) { hypre_CopyIndex(findex, hypre_BoxIMin(©_box)); row_in = trueV; break; } } /* not in any vbox */ if (!row_in) { hypre_AddIndexes(hypre_BoxIMin(©_box), boxoffset[1], 3, hypre_BoxIMin(©_box)); } hypre_SubtractIndexes(hypre_BoxIMin(©_box), kshift, 3, hypre_BoxIMin(©_box)); hypre_BoxGetSize(©_box, loop_size); hypre_StructMapFineToCoarse(loop_size, zero_index, rfactor, loop_size); hypre_CopyIndex(hypre_BoxIMin(©_box), start); loop_size[1]++; hypre_SerialBoxLoop1Begin(ndim, loop_size, ©_box, start, rfactor, m); { zypre_BoxLoopGetIndex(lindex); hypre_SetIndex3(findex, lindex[0], lindex[1], lindex[2]); for (k = 0; k < 3; k++) { findex[k] *= rfactor[k]; } hypre_AddIndexes(findex, start, 3, findex); /************************************************************ * Loop over the Y_Face x_edges. ************************************************************/ for (p = 0; p < rfactor[0]; p++) { hypre_CopyIndex(findex, var_index); var_index[0] += p; for (n = 1; n < rfactor[2]; n++) { var_index[2]++; hypre_SStructGridFindBoxManEntry(fgrid_edge, part, var_index, t, &entry); hypre_SStructBoxManEntryGetGlobalRank(entry, var_index, &rank, matrix_type); if ((rank <= fupper_ranks[part][var]) && (rank >= flower_ranks[part][var])) { iedgeEdge[j] = rank; /* Y_Face. Two coarse Edge connections. */ ncols_edgeEdge[j] = 2; j++; /* record index location */ bdryedge_location[rank - start_rank1] = l; l += 2; } } /* for (n= 1; n< rfactor[2]; n++) */ } /* for (p= 0; p< rfactor[0]; p++) */ } hypre_SerialBoxLoop1End(m); } /* hypre_ForBoxI(i, fboxes) */ break; } case 6: { /* 3-d y_edge, can be X or Z_Face */ hypre_ForBoxI(i, fboxes) { cellbox = hypre_BoxArrayBox(fboxes, i); /* vboxes inside the i'th cellbox */ num_vboxes = n_CtoVbox[part][i]; vboxnums = CtoVboxnums[part][i]; /* adjust the project cellbox to the variable box */ hypre_CopyBox(cellbox, ©_box); /****************************************************** * Check the location of the shifted lower box index: * y_edge-> X_Face & Z_Face: * Z_Face- contract in the z direction only if the * processor interface is in the z direction * X_Face- contract in the x direction if the processor * interface is in the x direction. ******************************************************/ hypre_SubtractIndexes(hypre_BoxIMin(©_box), kshift, 3, findex); /* loop over all the vboxes to see if findex is inside */ row_in = falseV; for (p = 0; p < num_vboxes[t]; p++) { vbox = hypre_BoxArrayBox(box_array, vboxnums[t][p]); if (hypre_IndexInBox(findex, vbox)) { hypre_CopyIndex(findex, hypre_BoxIMin(©_box)); row_in = trueV; break; } } /* not in any vbox */ if (!row_in) { hypre_AddIndexes(hypre_BoxIMin(©_box), boxoffset[2], 3, hypre_BoxIMin(©_box)); } hypre_SubtractIndexes(hypre_BoxIMin(©_box), ishift, 3, hypre_BoxIMin(©_box)); hypre_BoxGetSize(©_box, loop_size); hypre_StructMapFineToCoarse(loop_size, zero_index, rfactor, loop_size); hypre_CopyIndex(hypre_BoxIMin(©_box), start); /* reset and then increase the loop_size by one in the Z_Face direction */ loop_size[2]++; hypre_SerialBoxLoop1Begin(ndim, loop_size, ©_box, start, rfactor, m); { zypre_BoxLoopGetIndex(lindex); hypre_SetIndex3(findex, lindex[0], lindex[1], lindex[2]); for (k = 0; k < 3; k++) { findex[k] *= rfactor[k]; } hypre_AddIndexes(findex, start, 3, findex); /* Z_Face */ for (p = 0; p < rfactor[1]; p++) { hypre_CopyIndex(findex, var_index); var_index[1] += p; for (n = 1; n < rfactor[0]; n++) { var_index[0]++; hypre_SStructGridFindBoxManEntry(fgrid_edge, part, var_index, t, &entry); hypre_SStructBoxManEntryGetGlobalRank(entry, var_index, &rank, matrix_type); if ((rank <= fupper_ranks[part][var]) && (rank >= flower_ranks[part][var])) { iedgeEdge[j] = rank; /* Z_Face. Two coarse Edge connections. */ ncols_edgeEdge[j] = 2; j++; /* record index location */ bdryedge_location[rank - start_rank1] = l; l += 2; } } /* for (n= 1; n< rfactor[0]; n++) */ } /* for (p= 0; p< rfactor[1]; p++) */ } hypre_SerialBoxLoop1End(m); /* X_Face */ hypre_CopyBox(cellbox, ©_box); hypre_SubtractIndexes(hypre_BoxIMin(©_box), ishift, 3, findex); /* loop over all the vboxes to see if findex is inside */ row_in = falseV; for (p = 0; p < num_vboxes[t]; p++) { vbox = hypre_BoxArrayBox(box_array, vboxnums[t][p]); if (hypre_IndexInBox(findex, vbox)) { hypre_CopyIndex(findex, hypre_BoxIMin(©_box)); row_in = trueV; break; } } /* not in any vbox */ if (!row_in) { hypre_AddIndexes(hypre_BoxIMin(©_box), boxoffset[0], 3, hypre_BoxIMin(©_box)); } hypre_SubtractIndexes(hypre_BoxIMin(©_box), kshift, 3, hypre_BoxIMin(©_box)); hypre_BoxGetSize(©_box, loop_size); hypre_StructMapFineToCoarse(loop_size, zero_index, rfactor, loop_size); hypre_CopyIndex(hypre_BoxIMin(©_box), start); loop_size[0]++; hypre_SerialBoxLoop1Begin(ndim, loop_size, ©_box, start, rfactor, m); { zypre_BoxLoopGetIndex(lindex); hypre_SetIndex3(findex, lindex[0], lindex[1], lindex[2]); for (k = 0; k < 3; k++) { findex[k] *= rfactor[k]; } hypre_AddIndexes(findex, start, 3, findex); /***************************************************** * Loop over the X_Face y_edges. *****************************************************/ for (p = 0; p < rfactor[1]; p++) { hypre_CopyIndex(findex, var_index); var_index[1] += p; for (n = 1; n < rfactor[2]; n++) { var_index[2]++; hypre_SStructGridFindBoxManEntry(fgrid_edge, part, var_index, t, &entry); hypre_SStructBoxManEntryGetGlobalRank(entry, var_index, &rank, matrix_type); if ((rank <= fupper_ranks[part][var]) && (rank >= flower_ranks[part][var])) { iedgeEdge[j] = rank; /* X_Face. Two coarse Edge connections. */ ncols_edgeEdge[j] = 2; j++; /* record index location */ bdryedge_location[rank - start_rank1] = l; l += 2; } } /* for (n= 1; n< rfactor[2]; n++) */ } /* for (p= 0; p< rfactor[1]; p++) */ } hypre_SerialBoxLoop1End(m); } /* hypre_ForBoxI(i, fboxes) */ break; } case 7: { /* 3-d z_edge, can be interior, X or Y_Face, or Z_Edge */ hypre_ForBoxI(i, fboxes) { cellbox = hypre_BoxArrayBox(fboxes, i); /* vboxes inside the i'th cellbox */ num_vboxes = n_CtoVbox[part][i]; vboxnums = CtoVboxnums[part][i]; /* adjust the project cellbox to the variable box */ hypre_CopyBox(cellbox, ©_box); /****************************************************** * Check the location of the shifted lower box index: * z_edge-> X_Face & Y_Face: * X_Face- contract in the x direction if the processor * interface is in the x direction. * Y_Face- contract in the y direction if the processor * interface is in the y direction. ******************************************************/ hypre_SubtractIndexes(hypre_BoxIMin(©_box), ishift, 3, findex); /* loop over all the vboxes to see if findex is inside */ row_in = falseV; for (p = 0; p < num_vboxes[t]; p++) { vbox = hypre_BoxArrayBox(box_array, vboxnums[t][p]); if (hypre_IndexInBox(findex, vbox)) { hypre_CopyIndex(findex, hypre_BoxIMin(©_box)); row_in = trueV; break; } } /* not in any vbox */ if (!row_in) { hypre_AddIndexes(hypre_BoxIMin(©_box), boxoffset[0], 3, hypre_BoxIMin(©_box)); } hypre_SubtractIndexes(hypre_BoxIMin(©_box), jshift, 3, hypre_BoxIMin(©_box)); hypre_BoxGetSize(©_box, loop_size); hypre_StructMapFineToCoarse(loop_size, zero_index, rfactor, loop_size); hypre_CopyIndex(hypre_BoxIMin(©_box), start); /* increase the loop_size by one in the X_Face direction */ loop_size[0]++; hypre_SerialBoxLoop1Begin(ndim, loop_size, ©_box, start, rfactor, m); { zypre_BoxLoopGetIndex(lindex); hypre_SetIndex3(findex, lindex[0], lindex[1], lindex[2]); for (k = 0; k < 3; k++) { findex[k] *= rfactor[k]; } hypre_AddIndexes(findex, start, 3, findex); /****************************************************** * Loop over the X_Face z_edges. ******************************************************/ for (p = 0; p < rfactor[2]; p++) { hypre_CopyIndex(findex, var_index); var_index[2] += p; for (n = 1; n < rfactor[1]; n++) { var_index[1]++; hypre_SStructGridFindBoxManEntry(fgrid_edge, part, var_index, t, &entry); hypre_SStructBoxManEntryGetGlobalRank(entry, var_index, &rank, matrix_type); if ((rank <= fupper_ranks[part][var]) && (rank >= flower_ranks[part][var])) { iedgeEdge[j] = rank; /* X_Face. Two coarse Edge connections. */ ncols_edgeEdge[j] = 2; j++; /* record index location */ bdryedge_location[rank - start_rank1] = l; l += 2; } } /* for (n= 1; n< rfactor[1]; n++) */ } /* for (p= 0; p< rfactor[2]; p++) */ } hypre_SerialBoxLoop1End(m); /* Y_Face */ hypre_CopyBox(cellbox, ©_box); hypre_SubtractIndexes(hypre_BoxIMin(©_box), jshift, 3, findex); /* loop over all the vboxes to see if findex is inside */ row_in = falseV; for (p = 0; p < num_vboxes[t]; p++) { vbox = hypre_BoxArrayBox(box_array, vboxnums[t][p]); if (hypre_IndexInBox(findex, vbox)) { hypre_CopyIndex(findex, hypre_BoxIMin(©_box)); row_in = trueV; break; } } /* not in any vbox */ if (!row_in) { hypre_AddIndexes(hypre_BoxIMin(©_box), boxoffset[1], 3, hypre_BoxIMin(©_box)); } hypre_SubtractIndexes(hypre_BoxIMin(©_box), ishift, 3, hypre_BoxIMin(©_box)); hypre_BoxGetSize(©_box, loop_size); hypre_StructMapFineToCoarse(loop_size, zero_index, rfactor, loop_size); hypre_CopyIndex(hypre_BoxIMin(©_box), start); loop_size[1]++; hypre_SerialBoxLoop1Begin(ndim, loop_size, ©_box, start, rfactor, m); { zypre_BoxLoopGetIndex(lindex); hypre_SetIndex3(findex, lindex[0], lindex[1], lindex[2]); for (k = 0; k < 3; k++) { findex[k] *= rfactor[k]; } hypre_AddIndexes(findex, start, 3, findex); /**************************************************** * Loop over the Y_Face z_edges. ****************************************************/ for (p = 0; p < rfactor[2]; p++) { hypre_CopyIndex(findex, var_index); var_index[2] += p; for (n = 1; n < rfactor[0]; n++) { var_index[0]++; hypre_SStructGridFindBoxManEntry(fgrid_edge, part, var_index, t, &entry); hypre_SStructBoxManEntryGetGlobalRank(entry, var_index, &rank, matrix_type); if ((rank <= fupper_ranks[part][var]) && (rank >= flower_ranks[part][var])) { iedgeEdge[j] = rank; /* Y_Face. Two coarse Edge connections. */ ncols_edgeEdge[j] = 2; j++; /* record index location */ bdryedge_location[rank - start_rank1] = l; l += 2; } } /* for (n= 1; n< rfactor[0]; n++) */ } /* for (p= 0; p< rfactor[2]; p++) */ } hypre_SerialBoxLoop1End(m); } /* hypre_ForBoxI(i, fboxes) */ break; } } /* switch */ } /* for (t= 0; t< Edge_nvars; t++) */ hypre_TFree(boxoffset, HYPRE_MEMORY_HOST); } /* for (part= 0; part< nparts; part++) */ } /* if (ndim == 3) */ for (part = 0; part < nparts; part++) { p_fgrid = hypre_SStructGridPGrid(fgrid_edge, part); /* edge grid */ Edge_nvars = hypre_SStructPGridNVars(p_fgrid); Edge_vartypes = hypre_SStructPGridVarTypes(p_fgrid); /* note that fboxes are the contracted CELL boxes. Will get the correct variable grid extents. */ fboxes = contract_fedgeBoxes[part]; for (t = 0; t < Edge_nvars; t++) { var = Edge_vartypes[t]; var_fgrid = hypre_SStructPGridVTSGrid(p_fgrid, var); box_array = hypre_StructGridBoxes(var_fgrid); /* to reduce comparison, take the switch outside of the loop */ switch (var) { case 2: { /* 2-d x_face = x_edge, can be interior */ hypre_ForBoxI(i, fboxes) { cellbox = hypre_BoxArrayBox(fboxes, i); vbox = hypre_BoxArrayBox(box_array, i); /* adjust the contracted cellbox to the variable box */ hypre_CopyBox(cellbox, ©_box); hypre_SubtractIndexes(hypre_BoxIMin(©_box), varoffsets[var], 3, hypre_BoxIMin(©_box)); hypre_BoxGetSize(©_box, loop_size); hypre_StructMapFineToCoarse(loop_size, zero_index, rfactor, loop_size); hypre_CopyIndex(hypre_BoxIMin(©_box), start); hypre_SerialBoxLoop1Begin(ndim, loop_size, ©_box, start, rfactor, m); { zypre_BoxLoopGetIndex(lindex); hypre_SetIndex3(findex, lindex[0], lindex[1], lindex[2]); for (k = 0; k < 3; k++) { findex[k] *= rfactor[k]; } hypre_AddIndexes(findex, start, 3, findex); /* get interior edges */ for (p = 1; p < rfactor[0]; p++) { hypre_CopyIndex(findex, var_index); var_index[0] += p; for (n = 0; n < rfactor[1]; n++) { hypre_SStructGridFindBoxManEntry(fgrid_edge, part, var_index, t, &entry); hypre_SStructBoxManEntryGetGlobalRank(entry, var_index, &rank, matrix_type); iedgeEdge[j] = rank; /* lies interior of Face. Four coarse Edge connection. */ ncols_edgeEdge[j] = 4; j++; var_index[1]++; } /* for (n= 0; n< rfactor[1]; n++) */ } /* for (p= 1; p< rfactor[0]; p++) */ } hypre_SerialBoxLoop1End(m); } /* hypre_ForBoxI(i, fboxes) */ break; } case 3: { /* 2-d y_face = y_edge, can be interior */ hypre_ForBoxI(i, fboxes) { cellbox = hypre_BoxArrayBox(fboxes, i); vbox = hypre_BoxArrayBox(box_array, i); /* adjust the project cellbox to the variable box */ hypre_CopyBox(cellbox, ©_box); hypre_SubtractIndexes(hypre_BoxIMin(©_box), varoffsets[var], 3, hypre_BoxIMin(©_box)); hypre_BoxGetSize(©_box, loop_size); hypre_StructMapFineToCoarse(loop_size, zero_index, rfactor, loop_size); hypre_CopyIndex(hypre_BoxIMin(©_box), start); hypre_SerialBoxLoop1Begin(ndim, loop_size, ©_box, start, rfactor, m); { zypre_BoxLoopGetIndex(lindex); hypre_SetIndex3(findex, lindex[0], lindex[1], lindex[2]); for (k = 0; k < 3; k++) { findex[k] *= rfactor[k]; } hypre_AddIndexes(findex, start, 3, findex); /* get interior edges */ for (p = 1; p < rfactor[1]; p++) { hypre_CopyIndex(findex, var_index); var_index[1] += p; for (n = 0; n < rfactor[0]; n++) { hypre_SStructGridFindBoxManEntry(fgrid_edge, part, var_index, t, &entry); hypre_SStructBoxManEntryGetGlobalRank(entry, var_index, &rank, matrix_type); iedgeEdge[j] = rank; /* lies interior of Face. Four coarse Edge connection. */ ncols_edgeEdge[j] = 4; j++; var_index[0]++; } /* for (n= 0; n< rfactor[0]; n++) */ } /* for (p= 1; p< rfactor[1]; p++) */ } hypre_SerialBoxLoop1End(m); } /* hypre_ForBoxI(i, fboxes) */ break; } case 5: { /* 3-d x_edge, can be only interior */ hypre_ForBoxI(i, fboxes) { cellbox = hypre_BoxArrayBox(fboxes, i); vbox = hypre_BoxArrayBox(box_array, i); /* adjust the project cellbox to the variable box */ hypre_CopyBox(cellbox, ©_box); hypre_SubtractIndexes(hypre_BoxIMin(©_box), varoffsets[var], 3, hypre_BoxIMin(©_box)); hypre_BoxGetSize(©_box, loop_size); hypre_StructMapFineToCoarse(loop_size, zero_index, rfactor, loop_size); hypre_CopyIndex(hypre_BoxIMin(©_box), start); hypre_SerialBoxLoop1Begin(ndim, loop_size, ©_box, start, rfactor, m); { zypre_BoxLoopGetIndex(lindex); hypre_SetIndex3(findex, lindex[0], lindex[1], lindex[2]); for (k = 0; k < 3; k++) { findex[k] *= rfactor[k]; } hypre_AddIndexes(findex, start, 3, findex); /* get interior edges */ for (p = 1; p < rfactor[2]; p++) { hypre_CopyIndex(findex, var_index); var_index[2] += p; for (n = 1; n < rfactor[1]; n++) { var_index[1]++; for (k = 0; k < rfactor[0]; k++) { hypre_SStructGridFindBoxManEntry(fgrid_edge, part, var_index, t, &entry); hypre_SStructBoxManEntryGetGlobalRank(entry, var_index, &rank, matrix_type); iedgeEdge[j] = rank; /* Interior. Twelve coarse Edge connections. */ ncols_edgeEdge[j] = 12; j++; var_index[0]++; } /* for (k= 0; k< rfactor[0]; k++) */ /* reset var_index[0] to the initial index for next k loop */ var_index[0] -= rfactor[0]; } /* for (n= 1; n< rfactor[1]; n++) */ /* reset var_index[1] to the initial index for next n loop */ var_index[1] -= (rfactor[1] - 1); } /* for (p= 1; p< rfactor[2]; p++) */ } hypre_SerialBoxLoop1End(m); } /* hypre_ForBoxI(i, fboxes) */ break; } case 6: { /* 3-d y_edge, can be only interior */ hypre_ForBoxI(i, fboxes) { cellbox = hypre_BoxArrayBox(fboxes, i); vbox = hypre_BoxArrayBox(box_array, i); /* adjust the contract cellbox to the variable box */ hypre_CopyBox(cellbox, ©_box); hypre_SubtractIndexes(hypre_BoxIMin(©_box), varoffsets[var], 3, hypre_BoxIMin(©_box)); hypre_BoxGetSize(©_box, loop_size); hypre_StructMapFineToCoarse(loop_size, zero_index, rfactor, loop_size); hypre_CopyIndex(hypre_BoxIMin(©_box), start); hypre_SerialBoxLoop1Begin(ndim, loop_size, ©_box, start, rfactor, m); { zypre_BoxLoopGetIndex(lindex); hypre_SetIndex3(findex, lindex[0], lindex[1], lindex[2]); for (k = 0; k < 3; k++) { findex[k] *= rfactor[k]; } hypre_AddIndexes(findex, start, 3, findex); /* get interior edges */ for (p = 1; p < rfactor[2]; p++) { hypre_CopyIndex(findex, var_index); var_index[2] += p; for (n = 1; n < rfactor[0]; n++) { var_index[0]++; for (k = 0; k < rfactor[1]; k++) { hypre_SStructGridFindBoxManEntry(fgrid_edge, part, var_index, t, &entry); hypre_SStructBoxManEntryGetGlobalRank(entry, var_index, &rank, matrix_type); iedgeEdge[j] = rank; /* Interior. Twelve coarse Edge connections. */ ncols_edgeEdge[j] = 12; j++; var_index[1]++; } /* for (k= 0; k< rfactor[1]; k++) */ /* reset var_index[1] to the initial index for next k loop */ var_index[1] -= rfactor[1]; } /* for (n= 1; n< rfactor[0]; n++) */ /* reset var_index[0] to the initial index for next n loop */ var_index[0] -= (rfactor[0] - 1); } /* for (p= 1; p< rfactor[2]; p++) */ } hypre_SerialBoxLoop1End(m); } /* hypre_ForBoxI(i, fboxes) */ break; } case 7: { /* 3-d z_edge, can be only interior */ hypre_ForBoxI(i, fboxes) { cellbox = hypre_BoxArrayBox(fboxes, i); vbox = hypre_BoxArrayBox(box_array, i); /* adjust the contracted cellbox to the variable box */ hypre_CopyBox(cellbox, ©_box); hypre_SubtractIndexes(hypre_BoxIMin(©_box), varoffsets[var], 3, hypre_BoxIMin(©_box)); hypre_BoxGetSize(©_box, loop_size); hypre_StructMapFineToCoarse(loop_size, zero_index, rfactor, loop_size); hypre_CopyIndex(hypre_BoxIMin(©_box), start); hypre_SerialBoxLoop1Begin(ndim, loop_size, ©_box, start, rfactor, m); { zypre_BoxLoopGetIndex(lindex); hypre_SetIndex3(findex, lindex[0], lindex[1], lindex[2]); for (k = 0; k < 3; k++) { findex[k] *= rfactor[k]; } hypre_AddIndexes(findex, start, 3, findex); /* get interior edges */ for (p = 1; p < rfactor[1]; p++) { hypre_CopyIndex(findex, var_index); var_index[1] += p; for (n = 1; n < rfactor[0]; n++) { var_index[0]++; for (k = 0; k < rfactor[2]; k++) { hypre_SStructGridFindBoxManEntry(fgrid_edge, part, var_index, t, &entry); hypre_SStructBoxManEntryGetGlobalRank(entry, var_index, &rank, matrix_type); iedgeEdge[j] = rank; /* Interior. Twelve coarse Edge connections. */ ncols_edgeEdge[j] = 12; j++; var_index[2]++; } /* for (k= 0; k< rfactor[2]; k++) */ /* reset var_index[2] to the initial index for next k loop */ var_index[2] -= rfactor[2]; } /* for (n= 1; n< rfactor[0]; n++) */ /* reset var_index[0] to the initial index for next n loop */ var_index[0] -= (rfactor[0] - 1); } /* for (p= 1; p< rfactor[1]; p++) */ } hypre_SerialBoxLoop1End(m); } /* hypre_ForBoxI(i, fboxes) */ break; } } /* switch */ } /* for (t= 0; t< Edge_nvars; t++) */ } /* for (part= 0; part< nparts; part++) */ k = 0; j = 0; for (i = 0; i < nedges; i++) { if (ncols_edgeEdge[i]) { k += ncols_edgeEdge[i]; j++; } } vals_edgeEdge = hypre_CTAlloc(HYPRE_Real, k, memory_location); jedge_Edge = hypre_CTAlloc(HYPRE_BigInt, k, memory_location); size1 = j; /********************************************************************* * Fill up the edge_Edge interpolation matrix. Interpolation weights * are determined differently for each type of fine edges. * * fedge_on_CEdge: use geometric interpolation, i.e., length of * edge ratio. * * fedge_on_agglomerate_face: box mg approach. Collapse the like * variable stencil connections of the given face. Weighted linear * interpolation of the fedge_on_CEdge values. * * fedge_in_agglomerate_interior: amge. *********************************************************************/ /* loop over fedges aligning with the agglomerate coarse edges first. */ k = 0; for (part = 0; part < nparts; part++) { p_fgrid = hypre_SStructGridPGrid(fgrid_edge, part); /* edge grid */ Edge_nvars = hypre_SStructPGridNVars(p_fgrid); Edge_vartypes = hypre_SStructPGridVarTypes(p_fgrid); p_cgrid = hypre_SStructGridPGrid(cgrid_edge, part); /* Edge grid */ /* note that fboxes are the contracted CELL boxes. Will get the correct variable grid extents. */ fboxes = contract_fedgeBoxes[part]; for (t = 0; t < Edge_nvars; t++) { var = Edge_vartypes[t]; var_fgrid = hypre_SStructPGridVTSGrid(p_fgrid, var); box_array = hypre_StructGridBoxes(var_fgrid); n_boxoffsets = ndim - 1; boxoffset = hypre_CTAlloc(hypre_Index, n_boxoffsets, HYPRE_MEMORY_HOST); suboffset = hypre_CTAlloc(hypre_Index, n_boxoffsets, HYPRE_MEMORY_HOST); switch (var) { case 2: /* 2-d: x_face (vertical edges), stride=[rfactor[0],1,1] fCedge_ratio= 1.0/rfactor[1] */ { hypre_SetIndex3(stride, rfactor[0], 1, 1); fCedge_ratio = 1.0 / rfactor[1]; /* boxoffset shrink in the i direction */ hypre_SetIndex3(boxoffset[0], rfactor[0] - 1, 0, 0); hypre_SetIndex3(suboffset[0], 1, 0, 0); /* extend loop_size by one in the stride direction */ hypre_SetIndex3(hi_index, 1, 0, 0); break; } case 3: /* 2-d: y_face (horizontal edges), stride=[1,rfactor[1],1] fCedge_ratio= 1.0/rfactor[0] */ { hypre_SetIndex3(stride, 1, rfactor[1], 1); fCedge_ratio = 1.0 / rfactor[0]; /* boxoffset shrink in the j direction */ hypre_SetIndex3(boxoffset[0], 0, rfactor[1] - 1, 0); hypre_SetIndex3(suboffset[0], 0, 1, 0); /* extend loop_size by one in the stride direction */ hypre_SetIndex3(hi_index, 0, 1, 0); break; } case 5: /* 3-d: x_edge, stride=[1,rfactor[1],rfactor[2]] fCedge_ratio= 1.0/rfactor[0] */ { hypre_SetIndex3(stride, 1, rfactor[1], rfactor[2]); fCedge_ratio = 1.0 / rfactor[0]; /* boxoffset shrink in the j & k directions */ hypre_SetIndex3(boxoffset[0], 0, rfactor[1] - 1, 0); hypre_SetIndex3(boxoffset[1], 0, 0, rfactor[2] - 1); hypre_SetIndex3(suboffset[0], 0, 1, 0); hypre_SetIndex3(suboffset[1], 0, 0, 1); /* extend loop_size by one in the stride direction */ hypre_SetIndex3(hi_index, 0, 1, 1); break; } case 6: /* 3-d: y_edge, stride=[rfactor[0],1,rfactor[2]] fCedge_ratio= 1.0/rfactor[1] */ { hypre_SetIndex3(stride, rfactor[0], 1, rfactor[2]); fCedge_ratio = 1.0 / rfactor[1]; /* boxoffset shrink in the i & k directions */ hypre_SetIndex3(boxoffset[0], rfactor[0] - 1, 0, 0); hypre_SetIndex3(boxoffset[1], 0, 0, rfactor[2] - 1); hypre_SetIndex3(suboffset[0], 1, 0, 0); hypre_SetIndex3(suboffset[1], 0, 0, 1); /* extend loop_size by one in the stride direction */ hypre_SetIndex3(hi_index, 1, 0, 1); break; } case 7: /* 3-d: z_edge, stride=[rfactor[0],rfactor[1],1] fCedge_ratio= 1.0/rfactor[2] */ { hypre_SetIndex3(stride, rfactor[0], rfactor[1], 1); fCedge_ratio = 1.0 / rfactor[2]; /* boxoffset shrink in the i & j directions */ hypre_SetIndex3(boxoffset[0], rfactor[0] - 1, 0, 0); hypre_SetIndex3(boxoffset[1], 0, rfactor[1] - 1, 0); hypre_SetIndex3(suboffset[0], 1, 0, 0); hypre_SetIndex3(suboffset[1], 0, 1, 0); /* extend loop_size by one in the stride direction */ hypre_SetIndex3(hi_index, 1, 1, 0); break; } default: { fCedge_ratio = 1.0; } } hypre_ForBoxI(i, fboxes) { cellbox = hypre_BoxArrayBox(fboxes, i); /* vboxes inside the i'th cellbox */ num_vboxes = n_CtoVbox[part][i]; vboxnums = CtoVboxnums[part][i]; hypre_CopyIndex(Edge_cstarts[part][i], cstart); /* adjust the contracted cellbox to the variable box. Note that some of the fboxes may be skipped because they vanish. */ hypre_CopyBox(cellbox, ©_box); for (j = 0; j < n_boxoffsets; j++) { hypre_SubtractIndexes(hypre_BoxIMin(©_box), suboffset[j], 3, findex); row_in = falseV; for (p = 0; p < num_vboxes[t]; p++) { vbox = hypre_BoxArrayBox(box_array, vboxnums[t][p]); if (hypre_IndexInBox(findex, vbox)) { hypre_CopyIndex(findex, hypre_BoxIMin(©_box)); row_in = trueV; break; } } /* not in any vbox */ if (!row_in) { hypre_AddIndexes(hypre_BoxIMin(©_box), boxoffset[j], 3, hypre_BoxIMin(©_box)); /* also modify cstart */ hypre_AddIndexes(boxoffset[j], one_index, 3, boxoffset[j]); hypre_StructMapFineToCoarse(boxoffset[j], zero_index, rfactor, boxoffset[j]); hypre_AddIndexes(cstart, boxoffset[j], 3, cstart); } } hypre_BoxGetSize(©_box, loop_size); hypre_StructMapFineToCoarse(loop_size, zero_index, stride, loop_size); /* extend the loop_size so that upper boundary of the box are reached. */ hypre_AddIndexes(loop_size, hi_index, 3, loop_size); hypre_CopyIndex(hypre_BoxIMin(©_box), start); /* note that the correct cbox corresponding to this non-vanishing fbox is used. */ hypre_SerialBoxLoop1Begin(ndim, loop_size, ©_box, start, stride, m); { HYPRE_BigInt big_j; zypre_BoxLoopGetIndex(lindex); hypre_SetIndex3(findex, lindex[0], lindex[1], lindex[2]); for (j = 0; j < 3; j++) { findex[j] *= stride[j]; } hypre_AddIndexes(findex, start, 3, findex); hypre_SStructGridFindBoxManEntry(fgrid_edge, part, findex, t, &entry); hypre_SStructBoxManEntryGetGlobalRank(entry, findex, &big_j, matrix_type); /* still row p may be outside the processor- check to make sure in */ if ((big_j <= fupper_ranks[part][var]) && (big_j >= flower_ranks[part][var])) { hypre_SubtractIndexes(findex, start, 3, findex); /* determine where the edge lies- coarsening required. */ hypre_StructMapFineToCoarse(findex, zero_index, rfactor, cindex); hypre_AddIndexes(cindex, cstart, 3, cindex); hypre_AddIndexes(findex, start, 3, findex); /* lies on coarse Edge. Coarse Edge connection: var_index= cindex - subtract_index.*/ hypre_SubtractIndexes(cindex, varoffsets[var], 3, var_index); hypre_SStructGridFindBoxManEntry(cgrid_edge, part, var_index, t, &entry); hypre_SStructBoxManEntryGetGlobalRank(entry, var_index, &rank, matrix_type); jedge_Edge[k] = rank; vals_edgeEdge[k] = fCedge_ratio; k++; } } hypre_SerialBoxLoop1End(m); } /* hypre_ForBoxI */ hypre_TFree(boxoffset, HYPRE_MEMORY_HOST); hypre_TFree(suboffset, HYPRE_MEMORY_HOST); } /* for (t= 0; t< nvars; t++) */ } /* for (part= 0; part< nparts; part++) */ /* generate the face interpolation weights/info. Only for 3-d */ if (ndim == 3) { /* Allocate memory to arrays for the tridiagonal system & solutions. Take the maximum size needed. */ i = rfactor[0] - 1; for (j = 1; j < ndim; j++) { if (i < (rfactor[j] - 1)) { i = rfactor[j] - 1; } } upper = hypre_CTAlloc(HYPRE_Real, i, HYPRE_MEMORY_HOST); lower = hypre_CTAlloc(HYPRE_Real, i, HYPRE_MEMORY_HOST); diag = hypre_CTAlloc(HYPRE_Real, i, HYPRE_MEMORY_HOST); face_w1 = hypre_CTAlloc(HYPRE_Real, i, HYPRE_MEMORY_HOST); face_w2 = hypre_CTAlloc(HYPRE_Real, i, HYPRE_MEMORY_HOST); off_proc_flag = hypre_CTAlloc(HYPRE_Int, i + 1, HYPRE_MEMORY_HOST); for (part = 0; part < nparts; part++) { p_fgrid = hypre_SStructGridPGrid(fgrid_edge, part); /* edge grid */ Edge_nvars = hypre_SStructPGridNVars(p_fgrid); Edge_vartypes = hypre_SStructPGridVarTypes(p_fgrid); p_cgrid = hypre_SStructGridPGrid(cgrid_edge, part); /* Edge grid */ /* note that fboxes are the contracted CELL boxes. Will get the correct variable grid extents. */ fboxes = contract_fedgeBoxes[part]; /* may need to shrink a given box in some boxoffset directions */ boxoffset = hypre_TAlloc(hypre_Index, ndim, HYPRE_MEMORY_HOST); for (t = 0; t < ndim; t++) { hypre_ClearIndex(boxoffset[t]); hypre_IndexD(boxoffset[t], t) = rfactor[t] - 1; } for (t = 0; t < Edge_nvars; t++) { var = Edge_vartypes[t]; var_fgrid = hypre_SStructPGridVTSGrid(p_fgrid, var); box_array = hypre_StructGridBoxes(var_fgrid); switch (var) { case 5: { /* 3-d x_edge, can be Y or Z_Face */ fCedge_ratio = 1.0 / rfactor[0]; hypre_ForBoxI(i, fboxes) { cellbox = hypre_BoxArrayBox(fboxes, i); /* vboxes inside the i'th cellbox */ num_vboxes = n_CtoVbox[part][i]; vboxnums = CtoVboxnums[part][i]; hypre_CopyIndex(Edge_cstarts[part][i], cstart); /* adjust the project cellbox to the variable box */ hypre_CopyBox(cellbox, ©_box); /****************************************************** * Check the location of the shifted lower box index: * x_edge-> Z_Face & Y_Face: * Z_Face- contract in the z direction only if the * processor interface is in the z direction * Y_Face- contract in the y direction if the processor * interface is in the y direction. ******************************************************/ hypre_SubtractIndexes(hypre_BoxIMin(©_box), kshift, 3, findex); /* loop over all the vboxes to see if findex is inside */ row_in = falseV; for (p = 0; p < num_vboxes[t]; p++) { vbox = hypre_BoxArrayBox(box_array, vboxnums[t][p]); if (hypre_IndexInBox(findex, vbox)) { hypre_CopyIndex(findex, hypre_BoxIMin(©_box)); row_in = trueV; break; } } /* not in any vbox */ if (!row_in) { hypre_AddIndexes(hypre_BoxIMin(©_box), boxoffset[2], 3, hypre_BoxIMin(©_box)); /* modify cstart */ hypre_AddIndexes(cstart, kshift, 3, cstart); } hypre_SubtractIndexes(hypre_BoxIMin(©_box), jshift, 3, hypre_BoxIMin(©_box)); hypre_BoxGetSize(©_box, loop_size); hypre_StructMapFineToCoarse(loop_size, zero_index, rfactor, loop_size); hypre_CopyIndex(hypre_BoxIMin(©_box), start); /* increase the loop_size by one in the Z plane direction */ loop_size[2]++; hypre_SerialBoxLoop1Begin(ndim, loop_size, ©_box, start, rfactor, m); { zypre_BoxLoopGetIndex(lindex); hypre_SetIndex3(findex, lindex[0], lindex[1], lindex[2]); /* because of rfactor striding, cindex= findex. But adjust by cstart to get actually coarse edge. */ hypre_CopyIndex(findex, cindex); hypre_AddIndexes(cindex, cstart, 3, cindex); /* Will need the actual fine indices. */ for (l = 0; l < ndim; l++) { findex[l] *= rfactor[l]; } hypre_AddIndexes(findex, start, 3, findex); hypre_SubtractIndexes(cindex, kshift, 3, var_index); hypre_SStructGridFindBoxManEntry(cgrid_edge, part, var_index, t, &entry); hypre_SStructBoxManEntryGetGlobalRank(entry, var_index, &rank2, matrix_type); hypre_SubtractIndexes(var_index, jshift, 3, var_index); hypre_SStructGridFindBoxManEntry(cgrid_edge, part, var_index, t, &entry); hypre_SStructBoxManEntryGetGlobalRank(entry, var_index, &rank, matrix_type); /* loop over the strips of x_edges making up the Z_Face and create the tridiagonal systems by collapsing the stencils. */ for (p = 0; p < rfactor[0]; p++) { /* create the rhs's for the tridiagonal system. Require find the ranks at the endpt's of the strip. */ for (n = 0; n < rfactor[1] - 1; n++) { face_w1[n] = 0.0; face_w2[n] = 0.0; } /****************************************************** * grab the already computed lower-end edge weight. * These are bdry agglomerate wgts that are pre-determined * so that no communication is needed. ******************************************************/ /* lower-end and upper-end edge weights */ face_w1[0] = fCedge_ratio; face_w2[rfactor[1] - 2] = fCedge_ratio; /****************************************************** * create tridiagonal matrix. * x_edge for Z_Face: collapse_dir= 2, stencil_dir= 1 ******************************************************/ hypre_CopyIndex(findex, var_index); var_index[0] += p; for (n = 1; n < rfactor[1]; n++) { var_index[1]++; off_proc_flag[n] = hypre_CollapseStencilToStencil(Aee, fgrid_edge, part, t, var_index, 2, 1, &stencil_vals); /* put extracted stencil_vals into tridiagonal matrix */ lower[n - 1] = stencil_vals[0]; diag[n - 1] = stencil_vals[1]; upper[n - 1] = stencil_vals[2]; hypre_TFree(stencil_vals, HYPRE_MEMORY_HOST); } /* solve systems to get weights. Must adjust face_w's so that the stencil entry contributes. */ face_w1[0] *= -lower[0]; face_w2[rfactor[1] - 2] *= -upper[rfactor[1] - 2]; hypre_TriDiagSolve(diag, upper, lower, face_w1, rfactor[1] - 1); hypre_TriDiagSolve(diag, upper, lower, face_w2, rfactor[1] - 1); /* place weights into vals_edgeEdge */ for (n = 1; n < rfactor[1]; n++) { if (!off_proc_flag[n]) /* off_proc_flag= 1 if offproc */ { jedge_Edge[k] = rank; vals_edgeEdge[k] = face_w1[n - 1]; /* lower end connection */ k++; jedge_Edge[k] = rank2; vals_edgeEdge[k] = face_w2[n - 1]; /* upper end connection */ k++; } } } /* for (p= 0; p< rfactor[0]; p++) */ } hypre_SerialBoxLoop1End(m); /* Y_Face */ hypre_CopyIndex(Edge_cstarts[part][i], cstart); hypre_CopyBox(cellbox, ©_box); hypre_SubtractIndexes(hypre_BoxIMin(©_box), jshift, 3, findex); /* loop over all the vboxes to see if findex is inside */ row_in = falseV; for (p = 0; p < num_vboxes[t]; p++) { vbox = hypre_BoxArrayBox(box_array, vboxnums[t][p]); if (hypre_IndexInBox(findex, vbox)) { hypre_CopyIndex(findex, hypre_BoxIMin(©_box)); row_in = trueV; break; } } /* not in any vbox */ if (!row_in) { hypre_AddIndexes(hypre_BoxIMin(©_box), boxoffset[1], 3, hypre_BoxIMin(©_box)); /* modify cstart */ hypre_AddIndexes(cstart, jshift, 3, cstart); } hypre_SubtractIndexes(hypre_BoxIMin(©_box), kshift, 3, hypre_BoxIMin(©_box)); hypre_BoxGetSize(©_box, loop_size); hypre_StructMapFineToCoarse(loop_size, zero_index, rfactor, loop_size); hypre_CopyIndex(hypre_BoxIMin(©_box), start); loop_size[1]++; hypre_SerialBoxLoop1Begin(ndim, loop_size, ©_box, start, rfactor, m); { zypre_BoxLoopGetIndex(lindex); hypre_SetIndex3(findex, lindex[0], lindex[1], lindex[2]); /* because of rfactor striding, cindex= findex. But adjust by cstart to get actually coarse edge. */ hypre_CopyIndex(findex, cindex); hypre_AddIndexes(cindex, cstart, 3, cindex); /* Will need the actual fine indices. */ for (l = 0; l < ndim; l++) { findex[l] *= rfactor[l]; } hypre_AddIndexes(findex, start, 3, findex); /****************************************************** * Y_Face. Two coarse Edge connections. * x_Edge (i,j-1,k), (i,j-1,k-1) ******************************************************/ hypre_SubtractIndexes(cindex, jshift, 3, var_index); hypre_SStructGridFindBoxManEntry(cgrid_edge, part, var_index, t, &entry); hypre_SStructBoxManEntryGetGlobalRank(entry, var_index, &rank2, matrix_type); hypre_SubtractIndexes(var_index, kshift, 3, var_index); hypre_SStructGridFindBoxManEntry(cgrid_edge, part, var_index, t, &entry); hypre_SStructBoxManEntryGetGlobalRank(entry, var_index, &rank, matrix_type); /* loop over the strips of x_edges making up the Y_Face and create the tridiagonal systems by collapsing the stencils. */ for (p = 0; p < rfactor[0]; p++) { /* create the rhs's for the tridiagonal system. Require find the ranks at the endpt's of the strip. */ for (n = 0; n < rfactor[2] - 1; n++) { face_w1[n] = 0.0; face_w2[n] = 0.0; } /* lower-end and upper-end edge weights */ face_w1[0] = fCedge_ratio; face_w2[rfactor[2] - 2] = fCedge_ratio; /****************************************************** * create tridiagonal matrix. * x_edge for Y_Face: collapse_dir= 1, stencil_dir= 2 ******************************************************/ hypre_CopyIndex(findex, var_index); var_index[0] += p; for (n = 1; n < rfactor[2]; n++) { var_index[2]++; off_proc_flag[n] = hypre_CollapseStencilToStencil(Aee, fgrid_edge, part, t, var_index, 1, 2, &stencil_vals); /* put extracted stencil_vals into tridiagonal matrix */ lower[n - 1] = stencil_vals[0]; diag[n - 1] = stencil_vals[1]; upper[n - 1] = stencil_vals[2]; hypre_TFree(stencil_vals, HYPRE_MEMORY_HOST); } /* solve systems to get weights. Must adjust face_w's so that the stencil entry contributes. */ face_w1[0] *= -lower[0]; face_w2[rfactor[2] - 2] *= -upper[rfactor[2] - 2]; hypre_TriDiagSolve(diag, upper, lower, face_w1, rfactor[2] - 1); hypre_TriDiagSolve(diag, upper, lower, face_w2, rfactor[2] - 1); /* place weights into vals_edgeEdge */ for (n = 1; n < rfactor[2]; n++) { if (!off_proc_flag[n]) /* off_proc_flag= 1 if offproc */ { jedge_Edge[k] = rank; vals_edgeEdge[k] = face_w1[n - 1]; /* lower end connection */ k++; jedge_Edge[k] = rank2; vals_edgeEdge[k] = face_w2[n - 1]; /* upper end connection */ k++; } } } /* for (p= 0; p< rfactor[0]; p++) */ } hypre_SerialBoxLoop1End(m); } /* hypre_ForBoxI(i, fboxes) */ break; } case 6: { /* 3-d y_edge, can be X or Z_Face */ fCedge_ratio = 1.0 / rfactor[1]; hypre_ForBoxI(i, fboxes) { cellbox = hypre_BoxArrayBox(fboxes, i); /* vboxes inside the i'th cellbox */ num_vboxes = n_CtoVbox[part][i]; vboxnums = CtoVboxnums[part][i]; hypre_CopyIndex(Edge_cstarts[part][i], cstart); /* adjust the project cellbox to the variable box */ hypre_CopyBox(cellbox, ©_box); /****************************************************** * Check the location of the shifted lower box index: * y_edge-> X_Face & Z_Face: * Z_Face- contract in the z direction only if the * processor interface is in the z direction * X_Face- contract in the x direction if the processor * interface is in the x direction. ******************************************************/ /* Z_Face */ hypre_SubtractIndexes(hypre_BoxIMin(©_box), kshift, 3, findex); /* loop over all the vboxes to see if findex is inside */ row_in = falseV; for (p = 0; p < num_vboxes[t]; p++) { vbox = hypre_BoxArrayBox(box_array, vboxnums[t][p]); if (hypre_IndexInBox(findex, vbox)) { hypre_CopyIndex(findex, hypre_BoxIMin(©_box)); row_in = trueV; break; } } /* not in any vbox */ if (!row_in) { hypre_AddIndexes(hypre_BoxIMin(©_box), boxoffset[2], 3, hypre_BoxIMin(©_box)); /* modify cstart */ hypre_AddIndexes(cstart, kshift, 3, cstart); } hypre_SubtractIndexes(hypre_BoxIMin(©_box), ishift, 3, hypre_BoxIMin(©_box)); hypre_BoxGetSize(©_box, loop_size); hypre_StructMapFineToCoarse(loop_size, zero_index, rfactor, loop_size); hypre_CopyIndex(hypre_BoxIMin(©_box), start); /* increase the loop_size by one in the Z plane direction */ loop_size[2]++; hypre_SerialBoxLoop1Begin(ndim, loop_size, ©_box, start, rfactor, m); { zypre_BoxLoopGetIndex(lindex); hypre_SetIndex3(findex, lindex[0], lindex[1], lindex[2]); /* because of rfactor striding, cindex= findex. But adjust by cstart to get actually coarse edge. */ hypre_CopyIndex(findex, cindex); hypre_AddIndexes(cindex, cstart, 3, cindex); /* Will need the actual fine indices. */ for (l = 0; l < ndim; l++) { findex[l] *= rfactor[l]; } hypre_AddIndexes(findex, start, 3, findex); hypre_SubtractIndexes(cindex, kshift, 3, var_index); hypre_SStructGridFindBoxManEntry(cgrid_edge, part, var_index, t, &entry); hypre_SStructBoxManEntryGetGlobalRank(entry, var_index, &rank2, matrix_type); hypre_SubtractIndexes(var_index, ishift, 3, var_index); hypre_SStructGridFindBoxManEntry(cgrid_edge, part, var_index, t, &entry); hypre_SStructBoxManEntryGetGlobalRank(entry, var_index, &rank, matrix_type); /* loop over the strips of y_edges making up the Z_Face and create the tridiagonal systems by collapsing the stencils. */ for (p = 0; p < rfactor[1]; p++) { /* create the rhs's for the tridiagonal system. Require find the ranks at the endpt's of the strip. */ for (n = 0; n < rfactor[0] - 1; n++) { face_w1[n] = 0.0; face_w2[n] = 0.0; } /* lower-end and upper-end edge weights */ face_w1[0] = fCedge_ratio; face_w2[rfactor[0] - 2] = fCedge_ratio; /****************************************************** * create tridiagonal matrix. * y_edge for Z_Face: collapse_dir= 2, stencil_dir= 0 ******************************************************/ hypre_CopyIndex(findex, var_index); var_index[1] += p; for (n = 1; n < rfactor[0]; n++) { var_index[0]++; off_proc_flag[n] = hypre_CollapseStencilToStencil(Aee, fgrid_edge, part, t, var_index, 2, 0, &stencil_vals); /* put extracted stencil_vals into tridiagonal matrix */ lower[n - 1] = stencil_vals[0]; diag[n - 1] = stencil_vals[1]; upper[n - 1] = stencil_vals[2]; hypre_TFree(stencil_vals, HYPRE_MEMORY_HOST); } /* solve systems to get weights. Must adjust face_w's so that the stencil entry contributes. */ face_w1[0] *= -lower[0]; face_w2[rfactor[0] - 2] *= -upper[rfactor[0] - 2]; hypre_TriDiagSolve(diag, upper, lower, face_w1, rfactor[0] - 1); hypre_TriDiagSolve(diag, upper, lower, face_w2, rfactor[0] - 1); /* place weights into vals_edgeEdge */ for (n = 1; n < rfactor[0]; n++) { if (!off_proc_flag[n]) /* off_proc_flag= 1 if offproc */ { jedge_Edge[k] = rank; vals_edgeEdge[k] = face_w1[n - 1]; /* lower end connection */ k++; jedge_Edge[k] = rank2; vals_edgeEdge[k] = face_w2[n - 1]; /* upper end connection */ k++; } } } /* for (p= 0; p< rfactor[1]; p++) */ } hypre_SerialBoxLoop1End(m); /* X_Face */ hypre_CopyBox(cellbox, ©_box); hypre_CopyIndex(Edge_cstarts[part][i], cstart); hypre_SubtractIndexes(hypre_BoxIMin(©_box), ishift, 3, findex); /* loop over all the vboxes to see if findex is inside */ row_in = falseV; for (p = 0; p < num_vboxes[t]; p++) { vbox = hypre_BoxArrayBox(box_array, vboxnums[t][p]); if (hypre_IndexInBox(findex, vbox)) { hypre_CopyIndex(findex, hypre_BoxIMin(©_box)); row_in = trueV; break; } } /* not in any vbox */ if (!row_in) { hypre_AddIndexes(hypre_BoxIMin(©_box), boxoffset[0], 3, hypre_BoxIMin(©_box)); /* modify cstart */ hypre_AddIndexes(cstart, ishift, 3, cstart); } hypre_SubtractIndexes(hypre_BoxIMin(©_box), kshift, 3, hypre_BoxIMin(©_box)); hypre_BoxGetSize(©_box, loop_size); hypre_StructMapFineToCoarse(loop_size, zero_index, rfactor, loop_size); hypre_CopyIndex(hypre_BoxIMin(©_box), start); loop_size[0]++; hypre_SerialBoxLoop1Begin(ndim, loop_size, ©_box, start, rfactor, m); { zypre_BoxLoopGetIndex(lindex); hypre_SetIndex3(findex, lindex[0], lindex[1], lindex[2]); /* because of rfactor striding, cindex= findex. But adjust by cstart to get actually coarse edge. */ hypre_CopyIndex(findex, cindex); hypre_AddIndexes(cindex, cstart, 3, cindex); /* Will need the actual fine indices. */ for (l = 0; l < ndim; l++) { findex[l] *= rfactor[l]; } hypre_AddIndexes(findex, start, 3, findex); /****************************************************** * X_Face. Two coarse Edge connections. * y_Edge (i-1,j,k), (i-1,j,k-1) ******************************************************/ hypre_SubtractIndexes(cindex, ishift, 3, var_index); hypre_SStructGridFindBoxManEntry(cgrid_edge, part, var_index, t, &entry); hypre_SStructBoxManEntryGetGlobalRank(entry, var_index, &rank2, matrix_type); hypre_SubtractIndexes(var_index, kshift, 3, var_index); hypre_SStructGridFindBoxManEntry(cgrid_edge, part, var_index, t, &entry); hypre_SStructBoxManEntryGetGlobalRank(entry, var_index, &rank, matrix_type); /* loop over the strips of y_edges making up the X_Face and create the tridiagonal systems by collapsing the stencils. */ for (p = 0; p < rfactor[1]; p++) { /* create the rhs's for the tridiagonal system. Require find the ranks at the endpt's of the strip. */ for (n = 0; n < rfactor[2] - 1; n++) { face_w1[n] = 0.0; face_w2[n] = 0.0; } /* lower-end and upper-end edge weights */ face_w1[0] = fCedge_ratio; face_w2[rfactor[0] - 2] = fCedge_ratio; /****************************************************** * create tridiagonal matrix. * y_edge for X_Face: collapse_dir= 0, stencil_dir= 2 ******************************************************/ hypre_CopyIndex(findex, var_index); var_index[1] += p; for (n = 1; n < rfactor[2]; n++) { var_index[2]++; off_proc_flag[n] = hypre_CollapseStencilToStencil(Aee, fgrid_edge, part, t, var_index, 0, 2, &stencil_vals); /* put extracted stencil_vals into tridiagonal matrix */ lower[n - 1] = stencil_vals[0]; diag[n - 1] = stencil_vals[1]; upper[n - 1] = stencil_vals[2]; hypre_TFree(stencil_vals, HYPRE_MEMORY_HOST); } /* solve systems to get weights. Must adjust face_w's so that the stencil entry contributes. */ face_w1[0] *= -lower[0]; face_w2[rfactor[2] - 2] *= -upper[rfactor[2] - 2]; hypre_TriDiagSolve(diag, upper, lower, face_w1, rfactor[2] - 1); hypre_TriDiagSolve(diag, upper, lower, face_w2, rfactor[2] - 1); /* place weights into vals_edgeEdge */ for (n = 1; n < rfactor[2]; n++) { if (!off_proc_flag[n]) /* off_proc_flag= 1 if offproc */ { jedge_Edge[k] = rank; vals_edgeEdge[k] = face_w1[n - 1]; /* lower end connection */ k++; jedge_Edge[k] = rank2; vals_edgeEdge[k] = face_w2[n - 1]; /* upper end connection */ k++; } } } /* for (p= 0; p< rfactor[1]; p++) */ } hypre_SerialBoxLoop1End(m); } /* hypre_ForBoxI(i, fboxes) */ break; } case 7: { /* 3-d z_edge, can be X or Y_Face */ fCedge_ratio = 1.0 / rfactor[2]; hypre_ForBoxI(i, fboxes) { cellbox = hypre_BoxArrayBox(fboxes, i); /* vboxes inside the i'th cellbox */ num_vboxes = n_CtoVbox[part][i]; vboxnums = CtoVboxnums[part][i]; hypre_CopyIndex(Edge_cstarts[part][i], cstart); /* adjust the project cellbox to the variable box */ hypre_CopyBox(cellbox, ©_box); /****************************************************** * Check the location of the shifted lower box index: * z_edge-> X_Face & Y_Face: * X_Face- contract in the x direction if the processor * interface is in the x direction. * Y_Face- contract in the y direction if the processor * interface is in the y direction. ******************************************************/ hypre_SubtractIndexes(hypre_BoxIMin(©_box), ishift, 3, findex); /* loop over all the vboxes to see if findex is inside */ row_in = falseV; for (p = 0; p < num_vboxes[t]; p++) { vbox = hypre_BoxArrayBox(box_array, vboxnums[t][p]); if (hypre_IndexInBox(findex, vbox)) { hypre_CopyIndex(findex, hypre_BoxIMin(©_box)); row_in = trueV; break; } } /* not in any vbox */ if (!row_in) { hypre_AddIndexes(hypre_BoxIMin(©_box), boxoffset[0], 3, hypre_BoxIMin(©_box)); /* modify cstart */ hypre_AddIndexes(cstart, ishift, 3, cstart); } hypre_SubtractIndexes(hypre_BoxIMin(©_box), jshift, 3, hypre_BoxIMin(©_box)); hypre_BoxGetSize(©_box, loop_size); hypre_StructMapFineToCoarse(loop_size, zero_index, rfactor, loop_size); hypre_CopyIndex(hypre_BoxIMin(©_box), start); /* increase the loop_size by one in the X plane direction */ loop_size[0]++; hypre_SerialBoxLoop1Begin(ndim, loop_size, ©_box, start, rfactor, m); { zypre_BoxLoopGetIndex(lindex); hypre_SetIndex3(findex, lindex[0], lindex[1], lindex[2]); /* because of rfactor striding, cindex= findex. But adjust by cstart to get actually coarse edge. */ hypre_CopyIndex(findex, cindex); hypre_AddIndexes(cindex, cstart, 3, cindex); /* Will need the actual fine indices. */ for (l = 0; l < ndim; l++) { findex[l] *= rfactor[l]; } hypre_AddIndexes(findex, start, 3, findex); hypre_SubtractIndexes(cindex, ishift, 3, var_index); hypre_SStructGridFindBoxManEntry(cgrid_edge, part, var_index, t, &entry); hypre_SStructBoxManEntryGetGlobalRank(entry, var_index, &rank2, matrix_type); hypre_SubtractIndexes(var_index, jshift, 3, var_index); hypre_SStructGridFindBoxManEntry(cgrid_edge, part, var_index, t, &entry); hypre_SStructBoxManEntryGetGlobalRank(entry, var_index, &rank, matrix_type); /* loop over the strips of z_edges making up the X_Face and create the tridiagonal systems by collapsing the stencils. */ for (p = 0; p < rfactor[2]; p++) { /* create the rhs's for the tridiagonal system. Require find the ranks at the endpt's of the strip. */ for (n = 0; n < rfactor[1] - 1; n++) { face_w1[n] = 0.0; face_w2[n] = 0.0; } /* lower-end and upper-end edge weights */ face_w1[0] = fCedge_ratio; face_w2[rfactor[1] - 2] = fCedge_ratio; /****************************************************** * create tridiagonal matrix. * z_edge for X_Face: collapse_dir= 0, stencil_dir= 1 ******************************************************/ hypre_CopyIndex(findex, var_index); var_index[2] += p; for (n = 1; n < rfactor[1]; n++) { var_index[1]++; off_proc_flag[n] = hypre_CollapseStencilToStencil(Aee, fgrid_edge, part, t, var_index, 0, 1, &stencil_vals); /* put extracted stencil_vals into tridiagonal matrix */ lower[n - 1] = stencil_vals[0]; diag[n - 1] = stencil_vals[1]; upper[n - 1] = stencil_vals[2]; hypre_TFree(stencil_vals, HYPRE_MEMORY_HOST); } /* solve systems to get weights. Must adjust face_w's so that the stencil entry contributes. */ face_w1[0] *= -lower[0]; face_w2[rfactor[1] - 2] *= -upper[rfactor[1] - 2]; hypre_TriDiagSolve(diag, upper, lower, face_w1, rfactor[1] - 1); hypre_TriDiagSolve(diag, upper, lower, face_w2, rfactor[1] - 1); /* place weights into vals_edgeEdge */ for (n = 1; n < rfactor[1]; n++) { if (!off_proc_flag[n]) /* off_proc_flag= 1 if offproc */ { jedge_Edge[k] = rank; vals_edgeEdge[k] = face_w1[n - 1]; /* lower end connection */ k++; jedge_Edge[k] = rank2; vals_edgeEdge[k] = face_w2[n - 1]; /* upper end connection */ k++; } } } /* for (p= 0; p< rfactor[2]; p++) */ } hypre_SerialBoxLoop1End(m); /* Y_Face */ hypre_CopyBox(cellbox, ©_box); hypre_CopyIndex(Edge_cstarts[part][i], cstart); hypre_SubtractIndexes(hypre_BoxIMin(©_box), jshift, 3, findex); /* loop over all the vboxes to see if findex is inside */ row_in = falseV; for (p = 0; p < num_vboxes[t]; p++) { vbox = hypre_BoxArrayBox(box_array, vboxnums[t][p]); if (hypre_IndexInBox(findex, vbox)) { hypre_CopyIndex(findex, hypre_BoxIMin(©_box)); row_in = trueV; break; } } /* not in any vbox */ if (!row_in) { hypre_AddIndexes(hypre_BoxIMin(©_box), boxoffset[1], 3, hypre_BoxIMin(©_box)); /* modify cstart */ hypre_AddIndexes(cstart, jshift, 3, cstart); } hypre_SubtractIndexes(hypre_BoxIMin(©_box), ishift, 3, hypre_BoxIMin(©_box)); hypre_BoxGetSize(©_box, loop_size); hypre_StructMapFineToCoarse(loop_size, zero_index, rfactor, loop_size); hypre_CopyIndex(hypre_BoxIMin(©_box), start); loop_size[1]++; hypre_SerialBoxLoop1Begin(ndim, loop_size, ©_box, start, rfactor, m); { zypre_BoxLoopGetIndex(lindex); hypre_SetIndex3(findex, lindex[0], lindex[1], lindex[2]); /* because of rfactor striding, cindex= findex. But adjust by cstart to get actually coarse edge. */ hypre_CopyIndex(findex, cindex); hypre_AddIndexes(cindex, cstart, 3, cindex); /* Will need the actual fine indices. */ for (l = 0; l < ndim; l++) { findex[l] *= rfactor[l]; } hypre_AddIndexes(findex, start, 3, findex); /********************************************************** * Y_Face (i,j-1,k). Two like-var coarse Edge connections. * z_Edge (i,j-1,k), (i-1,j-1,k) **********************************************************/ hypre_SubtractIndexes(cindex, jshift, 3, var_index); hypre_SStructGridFindBoxManEntry(cgrid_edge, part, var_index, t, &entry); hypre_SStructBoxManEntryGetGlobalRank(entry, var_index, &rank2, matrix_type); hypre_SubtractIndexes(var_index, ishift, 3, var_index); hypre_SStructGridFindBoxManEntry(cgrid_edge, part, var_index, t, &entry); hypre_SStructBoxManEntryGetGlobalRank(entry, var_index, &rank, matrix_type); /* loop over the strips of y_edges making up the Y_Face and create the tridiagonal systems by collapsing the stencils. */ for (p = 0; p < rfactor[2]; p++) { /* create the rhs's for the tridiagonal system. Require find the ranks at the endpt's of the strip. */ for (n = 0; n < rfactor[0] - 1; n++) { face_w1[n] = 0.0; face_w2[n] = 0.0; } /* lower-end and upper-end edge weights */ face_w1[0] = fCedge_ratio; face_w2[rfactor[0] - 2] = fCedge_ratio; /****************************************************** * create tridiagonal matrix. * z_edge for Y_Face: collapse_dir= 1, stencil_dir= 0 ******************************************************/ hypre_CopyIndex(findex, var_index); var_index[2] += p; for (n = 1; n < rfactor[0]; n++) { var_index[0]++; off_proc_flag[n] = hypre_CollapseStencilToStencil(Aee, fgrid_edge, part, t, var_index, 1, 0, &stencil_vals); /* put extracted stencil_vals into tridiagonal matrix */ lower[n - 1] = stencil_vals[0]; diag[n - 1] = stencil_vals[1]; upper[n - 1] = stencil_vals[2]; hypre_TFree(stencil_vals, HYPRE_MEMORY_HOST); } /* solve systems to get weights. Must adjust face_w's so that the stencil entry contributes. */ face_w1[0] *= -lower[0]; face_w2[rfactor[0] - 2] *= -upper[rfactor[0] - 2]; hypre_TriDiagSolve(diag, upper, lower, face_w1, rfactor[0] - 1); hypre_TriDiagSolve(diag, upper, lower, face_w2, rfactor[0] - 1); /* place weights into vals_edgeEdge */ for (n = 1; n < rfactor[0]; n++) { if (!off_proc_flag[n]) /* off_proc_flag= 1 if offproc */ { jedge_Edge[k] = rank; vals_edgeEdge[k] = face_w1[n - 1]; /* lower end connection */ k++; jedge_Edge[k] = rank2; vals_edgeEdge[k] = face_w2[n - 1]; /* upper end connection */ k++; } } } /* for (p= 0; p< rfactor[2]; p++) */ } hypre_SerialBoxLoop1End(m); } /* hypre_ForBoxI(i, fboxes) */ break; } default: { fCedge_ratio = 1.0; } } /* switch */ } /* for (t= 0; t< Edge_nvars; t++) */ hypre_TFree(boxoffset, HYPRE_MEMORY_HOST); } /* for (part= 0; part< nparts; part++) */ hypre_TFree(upper, HYPRE_MEMORY_HOST); hypre_TFree(lower, HYPRE_MEMORY_HOST); hypre_TFree(diag, HYPRE_MEMORY_HOST); hypre_TFree(face_w1, HYPRE_MEMORY_HOST); hypre_TFree(face_w2, HYPRE_MEMORY_HOST); hypre_TFree(off_proc_flag, HYPRE_MEMORY_HOST); } /* if (ndim == 3) */ /* generate the interior interpolation weights/info */ for (part = 0; part < nparts; part++) { p_fgrid = hypre_SStructGridPGrid(fgrid_edge, part); /* edge grid */ Edge_nvars = hypre_SStructPGridNVars(p_fgrid); Edge_vartypes = hypre_SStructPGridVarTypes(p_fgrid); p_cgrid = hypre_SStructGridPGrid(cgrid_edge, part); /* Edge grid */ /* note that fboxes are the contracted CELL boxes. Will get the correct variable grid extents. */ fboxes = contract_fedgeBoxes[part]; for (t = 0; t < Edge_nvars; t++) { var = Edge_vartypes[t]; var_fgrid = hypre_SStructPGridVTSGrid(p_fgrid, var); box_array = hypre_StructGridBoxes(var_fgrid); switch (var) { case 2: { /* 2-d x_face = x_edge, can be interior or on X_Edge */ hypre_ForBoxI(i, fboxes) { cellbox = hypre_BoxArrayBox(fboxes, i); vbox = hypre_BoxArrayBox(box_array, i); hypre_CopyIndex(Edge_cstarts[part][i], cstart); /* adjust the project cellbox to the variable box */ hypre_CopyBox(cellbox, ©_box); hypre_SubtractIndexes(hypre_BoxIMin(©_box), varoffsets[var], 3, hypre_BoxIMin(©_box)); hypre_BoxGetSize(©_box, loop_size); hypre_StructMapFineToCoarse(loop_size, zero_index, rfactor, loop_size); hypre_CopyIndex(hypre_BoxIMin(©_box), start); hypre_SerialBoxLoop1Begin(ndim, loop_size, ©_box, start, rfactor, r); { zypre_BoxLoopGetIndex(lindex); hypre_SetIndex3(findex, lindex[0], lindex[1], lindex[2]); /***************************************************** * Where the fine edge lies wrt the coarse edge: * Since we stride by rfactor, lindex is * the coarse index. No coarsening needed, i.e., * cindex= findex. * * Loop over the interior fine edges in an agglomerate. *****************************************************/ for (p = 1; p < rfactor[0]; p++) { for (n = 0; n < rfactor[1]; n++) { hypre_CopyIndex(findex, cindex); hypre_AddIndexes(cindex, cstart, 3, cindex); /*interior of Face. Extract the four coarse Edge (x_Edge ijk & (i-1,j,k) and y_Edge ijk & (i,j-1,k) column ranks. No weights determined. */ hypre_SStructGridFindBoxManEntry(cgrid_edge, part, cindex, t, &entry); hypre_SStructBoxManEntryGetGlobalRank(entry, cindex, &rank, matrix_type); jedge_Edge[k] = rank; k++; hypre_SubtractIndexes(cindex, ishift, 3, var_index); hypre_SStructGridFindBoxManEntry(cgrid_edge, part, var_index, t, &entry); hypre_SStructBoxManEntryGetGlobalRank(entry, var_index, &rank, matrix_type); jedge_Edge[k] = rank; k++; /* y_Edges */ hypre_SStructGridFindBoxManEntry(cgrid_edge, part, cindex, vartype_map[3], &entry); hypre_SStructBoxManEntryGetGlobalRank(entry, cindex, &rank, matrix_type); jedge_Edge[k] = rank; k++; hypre_SubtractIndexes(cindex, jshift, 3, var_index); hypre_SStructGridFindBoxManEntry(cgrid_edge, part, var_index, vartype_map[3], &entry); hypre_SStructBoxManEntryGetGlobalRank(entry, var_index, &rank, matrix_type); jedge_Edge[k] = rank; k++; } /* for (n= 0; n< rfactor[1]; n++) */ } /* for (p= 1; p< rfactor[0]; p++) */ } hypre_SerialBoxLoop1End(r); } /* hypre_ForBoxI(i, fboxes) */ break; } case 3: { /* 2-d y_face = y_edge, can be interior or on Y_Edge */ hypre_ForBoxI(i, fboxes) { cellbox = hypre_BoxArrayBox(fboxes, i); vbox = hypre_BoxArrayBox(box_array, i); hypre_CopyIndex(Edge_cstarts[part][i], cstart); /* adjust the project cellbox to the variable box */ hypre_CopyBox(cellbox, ©_box); hypre_SubtractIndexes(hypre_BoxIMin(©_box), varoffsets[var], 3, hypre_BoxIMin(©_box)); hypre_BoxGetSize(©_box, loop_size); hypre_StructMapFineToCoarse(loop_size, zero_index, rfactor, loop_size); hypre_CopyIndex(hypre_BoxIMin(©_box), start); hypre_SerialBoxLoop1Begin(ndim, loop_size, ©_box, start, rfactor, r); { zypre_BoxLoopGetIndex(lindex); hypre_SetIndex3(findex, lindex[0], lindex[1], lindex[2]); /***************************************************** * Where the fine edge lies wrt the coarse edge: * Since we stride by rfactor, lindex is * the coarse index. No coarsening needed, i.e., * cindex= findex. * * Loop over the interior fine edges in an agglomerate. *****************************************************/ for (p = 1; p < rfactor[1]; p++) { for (n = 0; n < rfactor[0]; n++) { hypre_CopyIndex(findex, cindex); hypre_AddIndexes(cindex, cstart, 3, cindex); /*lies interior of Face. Extract the four coarse Edge (y_Edge ijk & (i,j-1,k) and x_Edge ijk & (i-1,j,k) column ranks. No weights determined. */ hypre_SStructGridFindBoxManEntry(cgrid_edge, part, cindex, t, &entry); hypre_SStructBoxManEntryGetGlobalRank(entry, cindex, &rank, matrix_type); jedge_Edge[k] = rank; k++; hypre_SubtractIndexes(cindex, jshift, 3, var_index); hypre_SStructGridFindBoxManEntry(cgrid_edge, part, var_index, t, &entry); hypre_SStructBoxManEntryGetGlobalRank(entry, var_index, &rank, matrix_type); jedge_Edge[k] = rank; k++; /* x_Edges */ hypre_SStructGridFindBoxManEntry(cgrid_edge, part, cindex, vartype_map[2], &entry); hypre_SStructBoxManEntryGetGlobalRank(entry, cindex, &rank, matrix_type); jedge_Edge[k] = rank; k++; hypre_SubtractIndexes(cindex, ishift, 3, var_index); hypre_SStructGridFindBoxManEntry(cgrid_edge, part, var_index, vartype_map[2], &entry); hypre_SStructBoxManEntryGetGlobalRank(entry, var_index, &rank, matrix_type); jedge_Edge[k] = rank; k++; } /* for (n= 0; n< rfactor[0]; n++) */ } /* for (p= 1; p< rfactor[1]; p++) */ } hypre_SerialBoxLoop1End(r); } /* hypre_ForBoxI(i, fboxes) */ break; } case 5: { /* 3-d x_edge, must be interior */ hypre_ForBoxI(i, fboxes) { cellbox = hypre_BoxArrayBox(fboxes, i); vbox = hypre_BoxArrayBox(box_array, i); hypre_CopyIndex(Edge_cstarts[part][i], cstart); /* adjust the project cellbox to the variable box */ hypre_CopyBox(cellbox, ©_box); hypre_SubtractIndexes(hypre_BoxIMin(©_box), varoffsets[var], 3, hypre_BoxIMin(©_box)); hypre_BoxGetSize(©_box, loop_size); hypre_StructMapFineToCoarse(loop_size, zero_index, rfactor, loop_size); hypre_CopyIndex(hypre_BoxIMin(©_box), start); hypre_SerialBoxLoop1Begin(ndim, loop_size, ©_box, start, rfactor, r); { zypre_BoxLoopGetIndex(lindex); hypre_SetIndex3(findex, lindex[0], lindex[1], lindex[2]); /***************************************************** * Where the fine edge lies wrt the coarse edge: * Since we stride by rfactor, lindex is * the coarse index. No coarsening needed, i.e., * cindex= findex. * * Loop over the interior fine edges in an agglomerate. *****************************************************/ for (p = 1; p < rfactor[2]; p++) { for (n = 1; n < rfactor[1]; n++) { for (m = 0; m < rfactor[0]; m++) { hypre_CopyIndex(findex, cindex); hypre_AddIndexes(cindex, cstart, 3, cindex); /*********************************************** * Interior. * x_Edge ijk, (i,j-1,k), (i,j-1,k-1), (i,j,k-1) * y_Edge ijk, (i-1,j,k), (i-1,j,k-1), (i,j,k-1) * z_Edge ijk, (i-1,j,k), (i-1,j-1,k), (i,j-1,k) * * vals_edgeEdge's are not set. ***********************************************/ hypre_SStructGridFindBoxManEntry(cgrid_edge, part, cindex, t, &entry); hypre_SStructBoxManEntryGetGlobalRank(entry, cindex, &rank, matrix_type); jedge_Edge[k] = rank; k++; hypre_SubtractIndexes(cindex, jshift, 3, var_index); hypre_SStructGridFindBoxManEntry(cgrid_edge, part, var_index, t, &entry); hypre_SStructBoxManEntryGetGlobalRank(entry, var_index, &rank, matrix_type); jedge_Edge[k] = rank; k++; hypre_SubtractIndexes(var_index, kshift, 3, var_index); hypre_SStructGridFindBoxManEntry(cgrid_edge, part, var_index, t, &entry); hypre_SStructBoxManEntryGetGlobalRank(entry, var_index, &rank, matrix_type); jedge_Edge[k] = rank; k++; hypre_AddIndexes(var_index, jshift, 3, var_index); hypre_SStructGridFindBoxManEntry(cgrid_edge, part, var_index, t, &entry); hypre_SStructBoxManEntryGetGlobalRank(entry, var_index, &rank, matrix_type); jedge_Edge[k] = rank; k++; /* y_Edge */ hypre_SStructGridFindBoxManEntry(cgrid_edge, part, cindex, vartype_map[6], &entry); hypre_SStructBoxManEntryGetGlobalRank(entry, cindex, &rank, matrix_type); jedge_Edge[k] = rank; k++; hypre_SubtractIndexes(cindex, ishift, 3, var_index); hypre_SStructGridFindBoxManEntry(cgrid_edge, part, var_index, vartype_map[6], &entry); hypre_SStructBoxManEntryGetGlobalRank(entry, var_index, &rank, matrix_type); jedge_Edge[k] = rank; k++; hypre_SubtractIndexes(var_index, kshift, 3, var_index); hypre_SStructGridFindBoxManEntry(cgrid_edge, part, var_index, vartype_map[6], &entry); hypre_SStructBoxManEntryGetGlobalRank(entry, var_index, &rank, matrix_type); jedge_Edge[k] = rank; k++; hypre_AddIndexes(var_index, ishift, 3, var_index); hypre_SStructGridFindBoxManEntry(cgrid_edge, part, var_index, vartype_map[6], &entry); hypre_SStructBoxManEntryGetGlobalRank(entry, var_index, &rank, matrix_type); jedge_Edge[k] = rank; k++; /* z_Edge */ hypre_SStructGridFindBoxManEntry(cgrid_edge, part, cindex, vartype_map[7], &entry); hypre_SStructBoxManEntryGetGlobalRank(entry, cindex, &rank, matrix_type); jedge_Edge[k] = rank; k++; hypre_SubtractIndexes(cindex, ishift, 3, var_index); hypre_SStructGridFindBoxManEntry(cgrid_edge, part, var_index, vartype_map[7], &entry); hypre_SStructBoxManEntryGetGlobalRank(entry, var_index, &rank, matrix_type); jedge_Edge[k] = rank; k++; hypre_SubtractIndexes(var_index, jshift, 3, var_index); hypre_SStructGridFindBoxManEntry(cgrid_edge, part, var_index, vartype_map[7], &entry); hypre_SStructBoxManEntryGetGlobalRank(entry, var_index, &rank, matrix_type); jedge_Edge[k] = rank; k++; hypre_AddIndexes(var_index, ishift, 3, var_index); hypre_SStructGridFindBoxManEntry(cgrid_edge, part, var_index, vartype_map[7], &entry); hypre_SStructBoxManEntryGetGlobalRank(entry, var_index, &rank, matrix_type); jedge_Edge[k] = rank; k++; } /* for (m= 0; m< rfactor[0]; m++) */ } /* for (n= 1; n< rfactor[1]; n++) */ } /* for (p= 1; p< rfactor[2]; p++) */ } hypre_SerialBoxLoop1End(r); } /* hypre_ForBoxI(i, fboxes) */ break; } case 6: { /* 3-d y_edge, must be interior */ hypre_ForBoxI(i, fboxes) { cellbox = hypre_BoxArrayBox(fboxes, i); vbox = hypre_BoxArrayBox(box_array, i); hypre_CopyIndex(Edge_cstarts[part][i], cstart); /* adjust the project cellbox to the variable box */ hypre_CopyBox(cellbox, ©_box); hypre_SubtractIndexes(hypre_BoxIMin(©_box), varoffsets[var], 3, hypre_BoxIMin(©_box)); hypre_BoxGetSize(©_box, loop_size); hypre_StructMapFineToCoarse(loop_size, zero_index, rfactor, loop_size); hypre_CopyIndex(hypre_BoxIMin(©_box), start); hypre_SerialBoxLoop1Begin(ndim, loop_size, ©_box, start, rfactor, r); { zypre_BoxLoopGetIndex(lindex); hypre_SetIndex3(findex, lindex[0], lindex[1], lindex[2]); /***************************************************** * Where the fine edge lies wrt the coarse edge: * Since we stride by rfactor, lindex is * the coarse index. No coarsening needed, i.e., * cindex= findex. * * Loop over the interior fine edges in an agglomerate. *****************************************************/ for (p = 1; p < rfactor[2]; p++) { for (n = 1; n < rfactor[0]; n++) { for (m = 0; m < rfactor[1]; m++) { hypre_CopyIndex(findex, cindex); hypre_AddIndexes(cindex, cstart, 3, cindex); /*********************************************** * Interior. * y_Edge ijk, (i-1,j,k), (i-1,j,k-1), (i,j,k-1) * z_Edge ijk, (i-1,j,k), (i-1,j-1,k), (i,j-1,k) * x_Edge ijk, (i,j-1,k), (i,j-1,k-1), (i,j,k-1) * * vals_edgeEdge's are not set. ***********************************************/ hypre_SStructGridFindBoxManEntry(cgrid_edge, part, cindex, t, &entry); hypre_SStructBoxManEntryGetGlobalRank(entry, cindex, &rank, matrix_type); jedge_Edge[k] = rank; k++; hypre_SubtractIndexes(cindex, ishift, 3, var_index); hypre_SStructGridFindBoxManEntry(cgrid_edge, part, var_index, t, &entry); hypre_SStructBoxManEntryGetGlobalRank(entry, var_index, &rank, matrix_type); jedge_Edge[k] = rank; k++; hypre_SubtractIndexes(var_index, kshift, 3, var_index); hypre_SStructGridFindBoxManEntry(cgrid_edge, part, var_index, t, &entry); hypre_SStructBoxManEntryGetGlobalRank(entry, var_index, &rank, matrix_type); jedge_Edge[k] = rank; k++; hypre_AddIndexes(var_index, ishift, 3, var_index); hypre_SStructGridFindBoxManEntry(cgrid_edge, part, var_index, t, &entry); hypre_SStructBoxManEntryGetGlobalRank(entry, var_index, &rank, matrix_type); jedge_Edge[k] = rank; k++; /* z_Edge */ hypre_SStructGridFindBoxManEntry(cgrid_edge, part, cindex, vartype_map[7], &entry); hypre_SStructBoxManEntryGetGlobalRank(entry, cindex, &rank, matrix_type); jedge_Edge[k] = rank; k++; hypre_SubtractIndexes(cindex, ishift, 3, var_index); hypre_SStructGridFindBoxManEntry(cgrid_edge, part, var_index, vartype_map[7], &entry); hypre_SStructBoxManEntryGetGlobalRank(entry, var_index, &rank, matrix_type); jedge_Edge[k] = rank; k++; hypre_SubtractIndexes(var_index, jshift, 3, var_index); hypre_SStructGridFindBoxManEntry(cgrid_edge, part, var_index, vartype_map[7], &entry); hypre_SStructBoxManEntryGetGlobalRank(entry, var_index, &rank, matrix_type); jedge_Edge[k] = rank; k++; hypre_AddIndexes(var_index, ishift, 3, var_index); hypre_SStructGridFindBoxManEntry(cgrid_edge, part, var_index, vartype_map[7], &entry); hypre_SStructBoxManEntryGetGlobalRank(entry, var_index, &rank, matrix_type); jedge_Edge[k] = rank; k++; /* x_Edge */ hypre_SStructGridFindBoxManEntry(cgrid_edge, part, cindex, vartype_map[5], &entry); hypre_SStructBoxManEntryGetGlobalRank(entry, cindex, &rank, matrix_type); jedge_Edge[k] = rank; k++; hypre_SubtractIndexes(cindex, jshift, 3, var_index); hypre_SStructGridFindBoxManEntry(cgrid_edge, part, var_index, vartype_map[5], &entry); hypre_SStructBoxManEntryGetGlobalRank(entry, var_index, &rank, matrix_type); jedge_Edge[k] = rank; k++; hypre_SubtractIndexes(var_index, kshift, 3, var_index); hypre_SStructGridFindBoxManEntry(cgrid_edge, part, var_index, vartype_map[5], &entry); hypre_SStructBoxManEntryGetGlobalRank(entry, var_index, &rank, matrix_type); jedge_Edge[k] = rank; k++; hypre_AddIndexes(var_index, jshift, 3, var_index); hypre_SStructGridFindBoxManEntry(cgrid_edge, part, var_index, vartype_map[5], &entry); hypre_SStructBoxManEntryGetGlobalRank(entry, var_index, &rank, matrix_type); jedge_Edge[k] = rank; k++; } /* for (m= 0; m< rfactor[1]; m++) */ } /* for (n= 1; n< rfactor[0]; n++) */ } /* for (p= 1; p< rfactor[2]; p++) */ } hypre_SerialBoxLoop1End(r); } /* hypre_ForBoxI(i, fboxes) */ break; } case 7: { /* 3-d z_edge, only the interior */ hypre_ForBoxI(i, fboxes) { cellbox = hypre_BoxArrayBox(fboxes, i); vbox = hypre_BoxArrayBox(box_array, i); hypre_CopyIndex(Edge_cstarts[part][i], cstart); /* adjust the project cellbox to the variable box */ hypre_CopyBox(cellbox, ©_box); hypre_SubtractIndexes(hypre_BoxIMin(©_box), varoffsets[var], 3, hypre_BoxIMin(©_box)); hypre_BoxGetSize(©_box, loop_size); hypre_StructMapFineToCoarse(loop_size, zero_index, rfactor, loop_size); hypre_CopyIndex(hypre_BoxIMin(©_box), start); hypre_SerialBoxLoop1Begin(ndim, loop_size, ©_box, start, rfactor, r); { zypre_BoxLoopGetIndex(lindex); hypre_SetIndex3(findex, lindex[0], lindex[1], lindex[2]); /***************************************************** * Where the fine edge lies wrt the coarse edge: * Since we stride by rfactor, lindex is * the coarse index. No coarsening needed, i.e., * cindex= findex. * * Loop over the interior fine edges in an agglomerate. *****************************************************/ for (p = 1; p < rfactor[1]; p++) { for (n = 1; n < rfactor[0]; n++) { for (m = 0; m < rfactor[2]; m++) { hypre_CopyIndex(findex, cindex); hypre_AddIndexes(cindex, cstart, 3, cindex); /************************************************* * Interior. * z_Edge ijk, (i-1,j,k), (i-1,j-1,k), (i,j-1,k) * x_Edge ijk, (i,j-1,k), (i,j-1,k-1), (i,j,k-1) * y_Edge ijk, (i-1,j,k), (i-1,j,k-1), (i,j,k-1) * * vals_edgeEdge's are not set. *************************************************/ hypre_SStructGridFindBoxManEntry(cgrid_edge, part, cindex, t, &entry); hypre_SStructBoxManEntryGetGlobalRank(entry, cindex, &rank, matrix_type); jedge_Edge[k] = rank; k++; hypre_SubtractIndexes(cindex, ishift, 3, var_index); hypre_SStructGridFindBoxManEntry(cgrid_edge, part, var_index, t, &entry); hypre_SStructBoxManEntryGetGlobalRank(entry, var_index, &rank, matrix_type); jedge_Edge[k] = rank; k++; hypre_SubtractIndexes(var_index, jshift, 3, var_index); hypre_SStructGridFindBoxManEntry(cgrid_edge, part, var_index, t, &entry); hypre_SStructBoxManEntryGetGlobalRank(entry, var_index, &rank, matrix_type); jedge_Edge[k] = rank; k++; hypre_AddIndexes(var_index, ishift, 3, var_index); hypre_SStructGridFindBoxManEntry(cgrid_edge, part, var_index, t, &entry); hypre_SStructBoxManEntryGetGlobalRank(entry, var_index, &rank, matrix_type); jedge_Edge[k] = rank; k++; /* x_Edge */ hypre_SStructGridFindBoxManEntry(cgrid_edge, part, cindex, vartype_map[5], &entry); hypre_SStructBoxManEntryGetGlobalRank(entry, cindex, &rank, matrix_type); jedge_Edge[k] = rank; k++; hypre_SubtractIndexes(cindex, jshift, 3, var_index); hypre_SStructGridFindBoxManEntry(cgrid_edge, part, var_index, vartype_map[5], &entry); hypre_SStructBoxManEntryGetGlobalRank(entry, var_index, &rank, matrix_type); jedge_Edge[k] = rank; k++; hypre_SubtractIndexes(var_index, kshift, 3, var_index); hypre_SStructGridFindBoxManEntry(cgrid_edge, part, var_index, vartype_map[5], &entry); hypre_SStructBoxManEntryGetGlobalRank(entry, var_index, &rank, matrix_type); jedge_Edge[k] = rank; k++; hypre_AddIndexes(var_index, jshift, 3, var_index); hypre_SStructGridFindBoxManEntry(cgrid_edge, part, var_index, vartype_map[5], &entry); hypre_SStructBoxManEntryGetGlobalRank(entry, var_index, &rank, matrix_type); jedge_Edge[k] = rank; k++; /* y_Edge */ hypre_SStructGridFindBoxManEntry(cgrid_edge, part, cindex, vartype_map[6], &entry); hypre_SStructBoxManEntryGetGlobalRank(entry, cindex, &rank, matrix_type); jedge_Edge[k] = rank; k++; hypre_SubtractIndexes(cindex, ishift, 3, var_index); hypre_SStructGridFindBoxManEntry(cgrid_edge, part, var_index, vartype_map[6], &entry); hypre_SStructBoxManEntryGetGlobalRank(entry, var_index, &rank, matrix_type); jedge_Edge[k] = rank; k++; hypre_SubtractIndexes(var_index, kshift, 3, var_index); hypre_SStructGridFindBoxManEntry(cgrid_edge, part, var_index, vartype_map[6], &entry); hypre_SStructBoxManEntryGetGlobalRank(entry, var_index, &rank, matrix_type); jedge_Edge[k] = rank; k++; hypre_AddIndexes(var_index, ishift, 3, var_index); hypre_SStructGridFindBoxManEntry(cgrid_edge, part, var_index, vartype_map[6], &entry); hypre_SStructBoxManEntryGetGlobalRank(entry, var_index, &rank, matrix_type); jedge_Edge[k] = rank; k++; } /* for (m= 0; m< rfactor[2]; m++) */ } /* for (n= 1; n< rfactor[0]; n++) */ } /* for (p= 1; p< rfactor[1]; p++) */ } hypre_SerialBoxLoop1End(r); } /* hypre_ForBoxI(i, fboxes) */ break; } } /* switch */ } /* for (t= 0; t< Edge_nvars; t++) */ } /* for (part= 0; part< nparts; part++) */ hypre_TFree(bdryedge_location, HYPRE_MEMORY_HOST); HYPRE_IJMatrixSetValues(edge_Edge, size1, ncols_edgeEdge, (const HYPRE_BigInt*) iedgeEdge, (const HYPRE_BigInt*) jedge_Edge, (const HYPRE_Real*) vals_edgeEdge); HYPRE_IJMatrixAssemble((HYPRE_IJMatrix) edge_Edge); hypre_TFree(ncols_edgeEdge, memory_location); hypre_TFree(iedgeEdge, memory_location); hypre_TFree(jedge_Edge, memory_location); hypre_TFree(vals_edgeEdge, memory_location); /* n_CtoVbox[part][cellboxi][var] & CtoVboxnums[part][cellboxi][var][nvboxes] */ for (part = 0; part < nparts; part++) { p_fgrid = hypre_SStructGridPGrid(fgrid_edge, part); Edge_nvars = hypre_SStructPGridNVars(p_fgrid); var_fgrid = hypre_SStructPGridCellSGrid(p_fgrid); fboxes = hypre_StructGridBoxes(var_fgrid); hypre_ForBoxI(j, fboxes) { for (t = 0; t < Edge_nvars; t++) { hypre_TFree(CtoVboxnums[part][j][t], HYPRE_MEMORY_HOST); } hypre_TFree(n_CtoVbox[part][j], HYPRE_MEMORY_HOST); hypre_TFree(CtoVboxnums[part][j], HYPRE_MEMORY_HOST); } hypre_TFree(n_CtoVbox[part], HYPRE_MEMORY_HOST); hypre_TFree(CtoVboxnums[part], HYPRE_MEMORY_HOST); } hypre_TFree(n_CtoVbox, HYPRE_MEMORY_HOST); hypre_TFree(CtoVboxnums, HYPRE_MEMORY_HOST); for (part = 0; part < nparts; part++) { p_fgrid = hypre_SStructGridPGrid(fgrid_edge, part); var_fgrid = hypre_SStructPGridCellSGrid(p_fgrid); fboxes = hypre_StructGridBoxes(var_fgrid); hypre_BoxArrayDestroy(contract_fedgeBoxes[part]); hypre_TFree(Edge_cstarts[part], HYPRE_MEMORY_HOST); hypre_TFree(upper_shifts[part], HYPRE_MEMORY_HOST); hypre_TFree(lower_shifts[part], HYPRE_MEMORY_HOST); hypre_TFree(cfbox_mapping[part], HYPRE_MEMORY_HOST); hypre_TFree(fcbox_mapping[part], HYPRE_MEMORY_HOST); hypre_TFree(fupper_ranks[part], HYPRE_MEMORY_HOST); hypre_TFree(flower_ranks[part], HYPRE_MEMORY_HOST); hypre_TFree(cupper_ranks[part], HYPRE_MEMORY_HOST); hypre_TFree(clower_ranks[part], HYPRE_MEMORY_HOST); } hypre_TFree(contract_fedgeBoxes, HYPRE_MEMORY_HOST); hypre_TFree(Edge_cstarts, HYPRE_MEMORY_HOST); hypre_TFree(upper_shifts, HYPRE_MEMORY_HOST); hypre_TFree(lower_shifts, HYPRE_MEMORY_HOST); hypre_TFree(cfbox_mapping, HYPRE_MEMORY_HOST); hypre_TFree(fcbox_mapping, HYPRE_MEMORY_HOST); hypre_TFree(fupper_ranks, HYPRE_MEMORY_HOST); hypre_TFree(flower_ranks, HYPRE_MEMORY_HOST); hypre_TFree(cupper_ranks, HYPRE_MEMORY_HOST); hypre_TFree(clower_ranks, HYPRE_MEMORY_HOST); hypre_TFree(varoffsets, HYPRE_MEMORY_HOST); hypre_TFree(vartype_map, HYPRE_MEMORY_HOST); if (ndim > 2) { (PTopology -> Face_iedge) = Face_iedge; (PTopology -> Element_Face) = Element_Face; } (PTopology -> Element_iedge) = Element_iedge; (PTopology -> Edge_iedge) = Edge_iedge; (PTopology -> Element_Edge) = Element_Edge; return edge_Edge; } /*-------------------------------------------------------------------------- * hypre_CollapseStencilToStencil: Collapses 3d stencil shape & values to * a 2d 3-point stencil: collapsed_vals= [ldiag diag udiag]. * Algo: * 1) Given the collapsing direction & the collapsed stencil pattern, * group the ranks into three collapsed sets: diag_ranks, ldiag_ranks, * udiag_ranks. * 2) concatenate these sets, marking the set location * 3) qsort the concatenated set and the col_inds * 4) search compare the two sorted arrays to compute the collapsed vals. * * Example, suppose collapsing to y_edges. Then the new_stencil pattern * is [n c s]^t and we need to collapse in the x direction to get this * 3-pt stencil: collapse_dir= 0 & new_stencil_dir= 1. *--------------------------------------------------------------------------*/ HYPRE_Int hypre_CollapseStencilToStencil(hypre_ParCSRMatrix *Aee, hypre_SStructGrid *grid, HYPRE_Int part, HYPRE_Int var, hypre_Index pt_location, HYPRE_Int collapse_dir, HYPRE_Int new_stencil_dir, HYPRE_Real **collapsed_vals_ptr) { HYPRE_Int ierr = 0; HYPRE_Int matrix_type = HYPRE_PARCSR; HYPRE_BigInt start_rank = hypre_ParCSRMatrixFirstRowIndex(Aee); HYPRE_BigInt end_rank = hypre_ParCSRMatrixLastRowIndex(Aee); hypre_BoxManEntry *entry; HYPRE_BigInt *ranks; HYPRE_Int *marker; /* marker to record the rank groups */ HYPRE_Int max_ranksize = 9; HYPRE_Real *collapsed_vals; hypre_Index index1, index2; HYPRE_Int size; HYPRE_BigInt *col_inds, *col_inds2; HYPRE_Real *values; HYPRE_BigInt rank, row_rank; HYPRE_Int *swap_inds; HYPRE_Int i, j, m, centre, found; HYPRE_Int getrow_ierr; HYPRE_Int cnt; /* create the collapsed stencil coefficients. Three components. */ collapsed_vals = hypre_CTAlloc(HYPRE_Real, 3, HYPRE_MEMORY_HOST); /* check if the row corresponding to pt_location is on this proc. If not, return an identity row. THIS SHOULD BE CORRECTED IN THE FUTURE TO GIVE SOMETHING MORE REASONABLE. */ hypre_SStructGridFindBoxManEntry(grid, part, pt_location, var, &entry); hypre_SStructBoxManEntryGetGlobalRank(entry, pt_location, &rank, matrix_type); if (rank < start_rank || rank > end_rank) { collapsed_vals[1] = 1.0; *collapsed_vals_ptr = collapsed_vals; ierr = 1; return ierr; } /* Extract the ranks of the collapsed stencil pattern. Since only like-var collapsing, we assume that max stencil size is 9. This agrees with the assumed pattern surrounding pt_location. Concatenating done. */ ranks = hypre_TAlloc(HYPRE_BigInt, max_ranksize, HYPRE_MEMORY_HOST); marker = hypre_TAlloc(HYPRE_Int, max_ranksize, HYPRE_MEMORY_HOST); cnt = 0; centre = 0; for (j = -1; j <= 1; j++) { hypre_CopyIndex(pt_location, index1); index1[new_stencil_dir] += j; for (i = -1; i <= 1; i++) { hypre_CopyIndex(index1, index2); index2[collapse_dir] += i; hypre_SStructGridFindBoxManEntry(grid, part, index2, var, &entry); if (entry) { hypre_SStructBoxManEntryGetGlobalRank(entry, index2, &rank, matrix_type); ranks[cnt] = rank; marker[cnt] = j + 1; /* mark centre component- entry!=NULL always */ if ( (!i) && (!j) ) { centre = cnt; } cnt++; } } } /* Grab the row corresponding to index pt_location. rank located in location centre of ranks, i.e., rank for index2= pt_location. Mark location of values, which will record the original location of values after the sorting. */ row_rank = ranks[centre]; getrow_ierr = HYPRE_ParCSRMatrixGetRow((HYPRE_ParCSRMatrix) Aee, row_rank, &size, &col_inds, &values); if (getrow_ierr < 0) { hypre_printf("offproc collapsing problem"); } swap_inds = hypre_TAlloc(HYPRE_Int, size, HYPRE_MEMORY_HOST); col_inds2 = hypre_TAlloc(HYPRE_BigInt, size, HYPRE_MEMORY_HOST); for (i = 0; i < size; i++) { swap_inds[i] = i; col_inds2[i] = col_inds[i]; } /* qsort ranks & col_inds */ hypre_BigQsortbi(ranks, marker, 0, cnt - 1); hypre_BigQsortbi(col_inds2, swap_inds, 0, size - 1); /* search for values to collapse */ m = 0; for (i = 0; i < cnt; i++) { found = 0; while (!found) { if (ranks[i] != col_inds2[m]) { m++; } else { collapsed_vals[marker[i]] += values[swap_inds[m]]; m++; break; /* break out of while loop */ } } /* while (!found) */ } /* for (i= 0; i< cnt; i++) */ HYPRE_ParCSRMatrixRestoreRow((HYPRE_ParCSRMatrix) Aee, row_rank, &size, &col_inds, &values); hypre_TFree(col_inds2, HYPRE_MEMORY_HOST); hypre_TFree(ranks, HYPRE_MEMORY_HOST); hypre_TFree(marker, HYPRE_MEMORY_HOST); hypre_TFree(swap_inds, HYPRE_MEMORY_HOST); *collapsed_vals_ptr = collapsed_vals; return ierr; } /*-------------------------------------------------------------------------- * hypre_TriDiagSolve: Direct tridiagonal solve *------------------------------------------------------------------------*/ HYPRE_Int hypre_TriDiagSolve(HYPRE_Real *diag, HYPRE_Real *upper, HYPRE_Real *lower, HYPRE_Real *rhs, HYPRE_Int size) { HYPRE_Int ierr = 0; HYPRE_Int i, size1; HYPRE_Real *copy_diag; HYPRE_Real multiplier; size1 = size - 1; /* copy diag so that the matrix is not modified */ copy_diag = hypre_TAlloc(HYPRE_Real, size, HYPRE_MEMORY_HOST); for (i = 0; i < size; i++) { copy_diag[i] = diag[i]; } /* forward substitution */ for (i = 1; i < size; i++) { multiplier = -lower[i] / copy_diag[i - 1]; copy_diag[i] += multiplier * upper[i - 1]; rhs[i] += multiplier * rhs[i - 1]; } /* backward substitution */ rhs[size1] /= copy_diag[size1]; for (i = size1 - 1; i >= 0; i--) { rhs[i] = (rhs[i] - upper[i] * rhs[i + 1]) / copy_diag[i]; } hypre_TFree(copy_diag, HYPRE_MEMORY_HOST); return ierr; } hypre-2.33.0/src/sstruct_ls/maxwell_solve.c000066400000000000000000001004531477326011500207600ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "_hypre_sstruct_ls.h" /*-------------------------------------------------------------------------- * hypre_MaxwellSolve- note that there is no input operator Aee. We assume * that maxwell_vdata has the exact operators. This prevents the need to * to recompute Ann in the solve phase. However, we do allow the f_edge & * u_edge to change per call. *--------------------------------------------------------------------------*/ HYPRE_Int hypre_MaxwellSolve( void *maxwell_vdata, hypre_SStructMatrix *A_in, hypre_SStructVector *f, hypre_SStructVector *u ) { HYPRE_UNUSED_VAR(A_in); hypre_MaxwellData *maxwell_data = (hypre_MaxwellData *) maxwell_vdata; hypre_ParVector *f_edge; hypre_ParVector *u_edge; HYPRE_Int max_iter = maxwell_data-> max_iter; HYPRE_Real tol = maxwell_data-> tol; HYPRE_Int rel_change = maxwell_data-> rel_change; HYPRE_Int zero_guess = maxwell_data-> zero_guess; HYPRE_Int npre_relax = maxwell_data-> num_pre_relax; HYPRE_Int npost_relax = maxwell_data-> num_post_relax; hypre_ParCSRMatrix **Ann_l = maxwell_data-> Ann_l; hypre_ParCSRMatrix **Pn_l = maxwell_data-> Pn_l; hypre_ParCSRMatrix **RnT_l = maxwell_data-> RnT_l; hypre_ParVector **bn_l = maxwell_data-> bn_l; hypre_ParVector **xn_l = maxwell_data-> xn_l; hypre_ParVector **resn_l = maxwell_data-> resn_l; hypre_ParVector **en_l = maxwell_data-> en_l; hypre_ParVector **nVtemp_l = maxwell_data-> nVtemp_l; hypre_ParVector **nVtemp2_l = maxwell_data-> nVtemp2_l; HYPRE_Int **nCF_marker_l = maxwell_data-> nCF_marker_l; HYPRE_Real *nrelax_weight = maxwell_data-> nrelax_weight; HYPRE_Real *nomega = maxwell_data-> nomega; HYPRE_Int nrelax_type = maxwell_data-> nrelax_type; HYPRE_Int node_numlevs = maxwell_data-> node_numlevels; hypre_ParCSRMatrix *Tgrad = maxwell_data-> Tgrad; hypre_ParCSRMatrix *T_transpose = maxwell_data-> T_transpose; hypre_ParCSRMatrix **Aen_l = maxwell_data-> Aen_l; HYPRE_Int en_numlevs = maxwell_data-> en_numlevels; hypre_ParCSRMatrix **Aee_l = maxwell_data-> Aee_l; hypre_IJMatrix **Pe_l = maxwell_data-> Pe_l; hypre_IJMatrix **ReT_l = maxwell_data-> ReT_l; hypre_ParVector **be_l = maxwell_data-> be_l; hypre_ParVector **xe_l = maxwell_data-> xe_l; hypre_ParVector **rese_l = maxwell_data-> rese_l; hypre_ParVector **ee_l = maxwell_data-> ee_l; hypre_ParVector **eVtemp_l = maxwell_data-> eVtemp_l; hypre_ParVector **eVtemp2_l = maxwell_data-> eVtemp2_l; HYPRE_Int **eCF_marker_l = maxwell_data-> eCF_marker_l; HYPRE_Real *erelax_weight = maxwell_data-> erelax_weight; HYPRE_Real *eomega = maxwell_data-> eomega; HYPRE_Int erelax_type = maxwell_data-> erelax_type; HYPRE_Int edge_numlevs = maxwell_data-> edge_numlevels; HYPRE_Int **BdryRanks_l = maxwell_data-> BdryRanks_l; HYPRE_Int *BdryRanksCnts_l = maxwell_data-> BdryRanksCnts_l; HYPRE_Int logging = maxwell_data-> logging; HYPRE_Real *norms = maxwell_data-> norms; HYPRE_Real *rel_norms = maxwell_data-> rel_norms; HYPRE_Int relax_local, cycle_param; HYPRE_Real b_dot_b = 0, r_dot_r, eps = 0; HYPRE_Real e_dot_e = 0, x_dot_x = 1; HYPRE_Int i, j; HYPRE_Int level; /* added for the relaxation routines */ hypre_ParVector *ze = NULL; #if !defined(HYPRE_USING_CUDA) && !defined(HYPRE_USING_HIP) &&!defined(HYPRE_USING_SYCL) /* GPU impl. needs ze */ if (hypre_NumThreads() > 1) #endif { /* Aee is always bigger than Ann */ ze = hypre_ParVectorCreate(hypre_ParCSRMatrixComm(Aee_l[0]), hypre_ParCSRMatrixGlobalNumRows(Aee_l[0]), hypre_ParCSRMatrixRowStarts(Aee_l[0])); hypre_ParVectorInitialize(ze); } hypre_BeginTiming(maxwell_data-> time_index); hypre_SStructVectorConvert(f, &f_edge); hypre_SStructVectorConvert(u, &u_edge); hypre_ParVectorZeroBCValues(f_edge, BdryRanks_l[0], BdryRanksCnts_l[0]); hypre_ParVectorZeroBCValues(u_edge, BdryRanks_l[0], BdryRanksCnts_l[0]); be_l[0] = f_edge; xe_l[0] = u_edge; /* the nodal fine vectors: bn= T'*be, xn= 0. */ hypre_ParCSRMatrixMatvec(1.0, T_transpose, f_edge, 0.0, bn_l[0]); hypre_ParVectorSetConstantValues(xn_l[0], 0.0); relax_local = 0; cycle_param = 0; (maxwell_data-> num_iterations) = 0; /* if max_iter is zero, return */ if (max_iter == 0) { /* if using a zero initial guess, return zero */ if (zero_guess) { hypre_ParVectorSetConstantValues(xe_l[0], 0.0); } hypre_EndTiming(maxwell_data -> time_index); return hypre_error_flag; } /* part of convergence check */ if (tol > 0.0) { /* eps = (tol^2) */ b_dot_b = hypre_ParVectorInnerProd(be_l[0], be_l[0]); eps = tol * tol; /* if rhs is zero, return a zero solution */ if (b_dot_b == 0.0) { hypre_ParVectorSetConstantValues(xe_l[0], 0.0); if (logging > 0) { norms[0] = 0.0; rel_norms[0] = 0.0; } hypre_EndTiming(maxwell_data -> time_index); return hypre_error_flag; } } /*----------------------------------------------------- * Do V-cycles: * For each index l, "fine" = (l-1), "coarse" = l * down cycle: * a) smooth nodes (Ann) * b) update edge residual (Ane) * c) smooth edges (Aee) * d) restrict updated node and edge residuals * up cycle: * a) interpolate node and edges separately * a) smooth nodes * b) update edge residual * c) smooth edges * * solution update: * edge_sol= edge_sol + T*node_sol *-----------------------------------------------------*/ for (i = 0; i < max_iter; i++) { /* fine grid pre_relaxation */ for (j = 0; j < npre_relax; j++) { hypre_ParVectorCopy(bn_l[0], nVtemp_l[0]); hypre_ParCSRMatrixMatvecT(-1.0, Aen_l[0], xe_l[0], 1.0, nVtemp_l[0]); hypre_BoomerAMGRelaxIF(Ann_l[0], nVtemp_l[0], nCF_marker_l[0], nrelax_type, relax_local, cycle_param, nrelax_weight[0], nomega[0], NULL, xn_l[0], nVtemp2_l[0], ze); /* update edge right-hand fe_l= fe_l-Aen_l*xn_l[0] */ hypre_ParVectorCopy(be_l[0], eVtemp_l[0]); hypre_ParCSRMatrixMatvec(-1.0, Aen_l[0], xn_l[0], 1.0, eVtemp_l[0]); hypre_ParVectorZeroBCValues(eVtemp_l[0], BdryRanks_l[0], BdryRanksCnts_l[0]); hypre_BoomerAMGRelaxIF(Aee_l[0], eVtemp_l[0], eCF_marker_l[0], erelax_type, relax_local, cycle_param, erelax_weight[0], eomega[0], NULL, xe_l[0], eVtemp2_l[0], ze); } /* for (j = 0; j < npre_relax; j++) */ /* compute fine grid residual. Note the edge residual of the block system is the residual of the actual edge equations itself. */ hypre_ParVectorCopy(bn_l[0], resn_l[0]); hypre_ParCSRMatrixMatvec(-1.0, Ann_l[0], xn_l[0], 1.0, resn_l[0]); hypre_ParCSRMatrixMatvecT(-1.0, Aen_l[0], xe_l[0], 1.0, resn_l[0]); hypre_ParVectorCopy(be_l[0], rese_l[0]); hypre_ParCSRMatrixMatvec(-1.0, Aee_l[0], xe_l[0], 1.0, rese_l[0]); hypre_ParCSRMatrixMatvec(-1.0, Aen_l[0], xn_l[0], 1.0, rese_l[0]); hypre_ParVectorZeroBCValues(rese_l[0], BdryRanks_l[0], BdryRanksCnts_l[0]); /* convergence check */ if (tol > 0.0) { r_dot_r = hypre_ParVectorInnerProd(rese_l[0], rese_l[0]); if (logging > 0) { norms[i] = hypre_sqrt(r_dot_r); if (b_dot_b > 0) { rel_norms[i] = hypre_sqrt(r_dot_r / b_dot_b); } else { rel_norms[i] = 0.0; } } /* always do at least 1 V-cycle */ if ((r_dot_r / b_dot_b < eps) && (i > 0)) { if (rel_change) { if ((e_dot_e / x_dot_x) < eps) { break; } } else { break; } } } if (en_numlevs > 1) { hypre_ParCSRMatrixMatvecT(1.0, RnT_l[0], resn_l[0], 0.0, bn_l[1]); hypre_ParCSRMatrixMatvecT(1.0, (hypre_ParCSRMatrix *) hypre_IJMatrixObject(ReT_l[0]), rese_l[0], 0.0, be_l[1]); hypre_ParVectorZeroBCValues(be_l[1], BdryRanks_l[1], BdryRanksCnts_l[1]); /* zero off initial guess for the next level */ hypre_ParVectorSetConstantValues(xn_l[1], 0.0); hypre_ParVectorSetConstantValues(xe_l[1], 0.0); } /* if (en_numlevs > 1) */ for (level = 1; level <= en_numlevs - 2; level++) { /*----------------------------------------------- * Down cycle *-----------------------------------------------*/ for (j = 0; j < npre_relax; j++) { hypre_ParVectorCopy(bn_l[level], nVtemp_l[level]); if (j) { hypre_ParCSRMatrixMatvecT(-1.0, Aen_l[level], xe_l[level], 1.0, nVtemp_l[level]); } hypre_BoomerAMGRelaxIF(Ann_l[level], nVtemp_l[level], nCF_marker_l[level], nrelax_type, relax_local, cycle_param, nrelax_weight[level], nomega[level], NULL, xn_l[level], nVtemp2_l[level], ze); /* update edge right-hand fe_l= fe_l-Aen_l*xn_l[level] */ hypre_ParVectorCopy(be_l[level], eVtemp_l[level]); hypre_ParCSRMatrixMatvec(-1.0, Aen_l[level], xn_l[level], 1.0, eVtemp_l[level]); hypre_ParVectorZeroBCValues(eVtemp_l[level], BdryRanks_l[level], BdryRanksCnts_l[level]); hypre_BoomerAMGRelaxIF(Aee_l[level], eVtemp_l[level], eCF_marker_l[level], erelax_type, relax_local, cycle_param, erelax_weight[level], eomega[level], NULL, xe_l[level], eVtemp2_l[level], ze); } /*for (j = 0; j < npre_relax; j++) */ /* compute residuals */ hypre_ParVectorCopy(bn_l[level], resn_l[level]); hypre_ParCSRMatrixMatvec(-1.0, Ann_l[level], xn_l[level], 1.0, resn_l[level]); hypre_ParCSRMatrixMatvecT(-1.0, Aen_l[level], xe_l[level], 1.0, resn_l[level]); hypre_ParVectorCopy(be_l[level], rese_l[level]); hypre_ParCSRMatrixMatvec(-1.0, Aee_l[level], xe_l[level], 1.0, rese_l[level]); hypre_ParCSRMatrixMatvec(-1.0, Aen_l[level], xn_l[level], 1.0, rese_l[level]); hypre_ParVectorZeroBCValues(rese_l[level], BdryRanks_l[level], BdryRanksCnts_l[level]); /* restrict residuals */ hypre_ParCSRMatrixMatvecT(1.0, RnT_l[level], resn_l[level], 0.0, bn_l[level + 1]); hypre_ParCSRMatrixMatvecT(1.0, (hypre_ParCSRMatrix *) hypre_IJMatrixObject(ReT_l[level]), rese_l[level], 0.0, be_l[level + 1]); hypre_ParVectorZeroBCValues(be_l[level + 1], BdryRanks_l[level + 1], BdryRanksCnts_l[level + 1]); /* zero off initial guess for the next level */ hypre_ParVectorSetConstantValues(xn_l[level + 1], 0.0); hypre_ParVectorSetConstantValues(xe_l[level + 1], 0.0); } /* for (level = 0; level<= en_numlevels-2; level++) */ /*---------------------------------------------------------------- * For the lowest edge-node level, solve using relaxation or * cycling down if there are more than en_numlevels levels for * one of the node or edge dofs. *----------------------------------------------------------------*/ level = en_numlevs - 1; /* npre_relax if not the coarsest level. Otherwise, relax once.*/ if ( (en_numlevs != edge_numlevs) || (en_numlevs != node_numlevs) ) { for (j = 0; j < npre_relax; j++) { hypre_ParVectorCopy(bn_l[level], nVtemp_l[level]); if (j) { hypre_ParCSRMatrixMatvecT(-1.0, Aen_l[level], xe_l[level], 1.0, nVtemp_l[level]); } hypre_BoomerAMGRelaxIF(Ann_l[level], nVtemp_l[level], nCF_marker_l[level], nrelax_type, relax_local, cycle_param, nrelax_weight[level], nomega[level], NULL, xn_l[level], nVtemp2_l[level], ze); /* update edge right-hand fe_l= fe_l-Aen_l*xn_l[level] */ hypre_ParVectorCopy(be_l[level], eVtemp_l[level]); hypre_ParCSRMatrixMatvec(-1.0, Aen_l[level], xn_l[level], 1.0, eVtemp_l[level]); hypre_ParVectorZeroBCValues(eVtemp_l[level], BdryRanks_l[level], BdryRanksCnts_l[level]); hypre_BoomerAMGRelaxIF(Aee_l[level], eVtemp_l[level], eCF_marker_l[level], erelax_type, relax_local, cycle_param, erelax_weight[level], eomega[level], NULL, xe_l[level], eVtemp2_l[level], ze); } /*for (j = 0; j < npre_relax; j++) */ } /* if ( (en_numlevs != edge_numlevs) */ else { hypre_BoomerAMGRelaxIF(Ann_l[level], bn_l[level], nCF_marker_l[level], nrelax_type, relax_local, cycle_param, nrelax_weight[level], nomega[level], NULL, xn_l[level], nVtemp2_l[level], ze); hypre_ParVectorCopy(be_l[level], eVtemp_l[level]); hypre_ParCSRMatrixMatvec(-1.0, Aen_l[level], xn_l[level], 1.0, eVtemp_l[level]); hypre_ParVectorZeroBCValues(eVtemp_l[level], BdryRanks_l[level], BdryRanksCnts_l[level]); hypre_BoomerAMGRelaxIF(Aee_l[level], eVtemp_l[level], eCF_marker_l[level], erelax_type, relax_local, cycle_param, erelax_weight[level], eomega[level], NULL, xe_l[level], eVtemp2_l[level], ze); } /* Continue down the edge hierarchy if more edge levels. */ if (edge_numlevs > en_numlevs) { hypre_ParVectorCopy(be_l[level], rese_l[level]); hypre_ParCSRMatrixMatvec(-1.0, Aee_l[level], xe_l[level], 1.0, rese_l[level]); hypre_ParCSRMatrixMatvecT(1.0, (hypre_ParCSRMatrix *) hypre_IJMatrixObject(ReT_l[level]), rese_l[level], 0.0, be_l[level + 1]); hypre_ParVectorZeroBCValues(be_l[level + 1], BdryRanks_l[level + 1], BdryRanksCnts_l[level + 1]); hypre_ParVectorSetConstantValues(xe_l[level + 1], 0.0); for (level = en_numlevs; level <= edge_numlevs - 2; level++) { for (j = 0; j < npre_relax; j++) { hypre_BoomerAMGRelaxIF(Aee_l[level], be_l[level], eCF_marker_l[level], erelax_type, relax_local, cycle_param, erelax_weight[level], eomega[level], NULL, xe_l[level], eVtemp2_l[level], ze); } /* compute residuals and restrict */ hypre_ParVectorCopy(be_l[level], rese_l[level]); hypre_ParCSRMatrixMatvec(-1.0, Aee_l[level], xe_l[level], 1.0, rese_l[level]); hypre_ParCSRMatrixMatvecT(1.0, (hypre_ParCSRMatrix *) hypre_IJMatrixObject(ReT_l[level]), rese_l[level], 0.0, be_l[level + 1]); hypre_ParVectorZeroBCValues(be_l[level + 1], BdryRanks_l[level + 1], BdryRanksCnts_l[level + 1]); hypre_ParVectorSetConstantValues(xe_l[level + 1], 0.0); } /* for (level = en_numlevs; level< edge_numlevs-2; level++) */ /* coarsest relaxation */ level = edge_numlevs - 1; hypre_BoomerAMGRelaxIF(Aee_l[level], be_l[level], eCF_marker_l[level], erelax_type, relax_local, cycle_param, erelax_weight[level], eomega[level], NULL, xe_l[level], eVtemp2_l[level], ze); } /* if (edge_numlevs > en_numlevs) */ /*----------------------------------------------------------- * node hierarchy has more levels than the edge hierarchy: * continue to march down the node hierarchy *-----------------------------------------------------------*/ else if (node_numlevs > en_numlevs) { hypre_ParVectorCopy(bn_l[level], resn_l[level]); hypre_ParCSRMatrixMatvec(-1.0, Ann_l[level], xn_l[level], 1.0, resn_l[level]); hypre_ParCSRMatrixMatvecT(1.0, (hypre_ParCSRMatrix *) RnT_l[level], resn_l[level], 0.0, bn_l[level + 1]); hypre_ParVectorSetConstantValues(xn_l[level + 1], 0.0); for (level = en_numlevs; level <= node_numlevs - 2; level++) { for (j = 0; j < npre_relax; j++) { hypre_BoomerAMGRelaxIF(Ann_l[level], bn_l[level], nCF_marker_l[level], nrelax_type, relax_local, cycle_param, nrelax_weight[level], nomega[level], NULL, xn_l[level], nVtemp2_l[level], ze); } /* compute residuals and restrict */ hypre_ParVectorCopy(bn_l[level], resn_l[level]); hypre_ParCSRMatrixMatvec(-1.0, Ann_l[level], xn_l[level], 1.0, resn_l[level]); hypre_ParCSRMatrixMatvecT(1.0, RnT_l[level], resn_l[level], 0.0, bn_l[level + 1]); hypre_ParVectorSetConstantValues(xn_l[level + 1], 0.0); } /* for (level = en_numlevs; level<= node_numlevs-2; level++) */ /* coarsest relaxation */ level = node_numlevs - 1; hypre_BoomerAMGRelaxIF(Ann_l[level], bn_l[level], nCF_marker_l[level], nrelax_type, relax_local, cycle_param, nrelax_weight[level], nomega[level], NULL, xn_l[level], nVtemp2_l[level], ze); } /* else if (node_numlevs > en_numlevs) */ /*--------------------------------------------------------------------- * Up cycle. First the extra hierarchy levels. Notice we relax on * the coarsest en_numlevel. *---------------------------------------------------------------------*/ if (edge_numlevs > en_numlevs) { for (level = (edge_numlevs - 2); level >= en_numlevs - 1; level--) { hypre_ParCSRMatrixMatvec(1.0, (hypre_ParCSRMatrix *) hypre_IJMatrixObject(Pe_l[level]), xe_l[level + 1], 0.0, ee_l[level]); hypre_ParVectorZeroBCValues(ee_l[level], BdryRanks_l[level], BdryRanksCnts_l[level]); hypre_ParVectorAxpy(1.0, ee_l[level], xe_l[level]); /* post smooth */ for (j = 0; j < npost_relax; j++) { hypre_BoomerAMGRelaxIF(Aee_l[level], be_l[level], eCF_marker_l[level], erelax_type, relax_local, cycle_param, erelax_weight[level], eomega[level], NULL, xe_l[level], eVtemp2_l[level], ze); } } /* for (level = (edge_numlevs - 2); level>= en_numlevs; level--) */ } /* if (edge_numlevs > en_numlevs) */ else if (node_numlevs > en_numlevs) { for (level = (node_numlevs - 2); level >= en_numlevs - 1; level--) { hypre_ParCSRMatrixMatvec(1.0, Pn_l[level], xn_l[level + 1], 0.0, en_l[level]); hypre_ParVectorAxpy(1.0, en_l[level], xn_l[level]); /* post smooth */ for (j = 0; j < npost_relax; j++) { hypre_BoomerAMGRelaxIF(Ann_l[level], bn_l[level], nCF_marker_l[level], nrelax_type, relax_local, cycle_param, nrelax_weight[level], nomega[level], NULL, xn_l[level], nVtemp2_l[level], ze); } } /* for (level = (node_numlevs - 2); level>= en_numlevs; level--) */ } /* else if (node_numlevs > en_numlevs) */ /*--------------------------------------------------------------------- * Cycle up the common levels. *---------------------------------------------------------------------*/ for (level = (en_numlevs - 2); level >= 1; level--) { hypre_ParCSRMatrixMatvec(1.0, Pn_l[level], xn_l[level + 1], 0.0, en_l[level]); hypre_ParVectorAxpy(1.0, en_l[level], xn_l[level]); hypre_ParCSRMatrixMatvec(1.0, (hypre_ParCSRMatrix *) hypre_IJMatrixObject(Pe_l[level]), xe_l[level + 1], 0.0, ee_l[level]); hypre_ParVectorZeroBCValues(ee_l[level], BdryRanks_l[level], BdryRanksCnts_l[level]); hypre_ParVectorAxpy(1.0, ee_l[level], xe_l[level]); /* post smooth */ for (j = 0; j < npost_relax; j++) { hypre_ParVectorCopy(bn_l[level], nVtemp_l[level]); hypre_ParCSRMatrixMatvecT(-1.0, Aen_l[level], xe_l[level], 1.0, nVtemp_l[level]); hypre_BoomerAMGRelaxIF(Ann_l[level], nVtemp_l[level], nCF_marker_l[level], nrelax_type, relax_local, cycle_param, nrelax_weight[level], nomega[level], NULL, xn_l[level], nVtemp_l[level], ze); hypre_ParVectorCopy(be_l[level], eVtemp_l[level]); hypre_ParCSRMatrixMatvec(-1.0, Aen_l[level], xn_l[level], 1.0, eVtemp_l[level]); hypre_ParVectorZeroBCValues(eVtemp_l[level], BdryRanks_l[level], BdryRanksCnts_l[level]); hypre_BoomerAMGRelaxIF(Aee_l[level], eVtemp_l[level], eCF_marker_l[level], erelax_type, relax_local, cycle_param, erelax_weight[level], eomega[level], NULL, xe_l[level], eVtemp2_l[level], ze); } } /* for (level = (en_numlevs - 2); level>= 1; level--) */ /* interpolate error and correct on finest grids */ hypre_ParCSRMatrixMatvec(1.0, Pn_l[0], xn_l[1], 0.0, en_l[0]); hypre_ParVectorAxpy(1.0, en_l[0], xn_l[0]); hypre_ParCSRMatrixMatvec(1.0, (hypre_ParCSRMatrix *) hypre_IJMatrixObject(Pe_l[0]), xe_l[1], 0.0, ee_l[0]); hypre_ParVectorZeroBCValues(ee_l[0], BdryRanks_l[0], BdryRanksCnts_l[0]); hypre_ParVectorAxpy(1.0, ee_l[0], xe_l[0]); /* part of convergence check. Will assume that if en_numlevels= 1, then so would edge_numlevels and node_numlevels. Otherwise, we measure the error of xe_l[0] + T*xn_l[0]. */ if ((tol > 0.0) && (rel_change)) { if (en_numlevs > 1) { hypre_ParCSRMatrixMatvec(1.0, Tgrad, en_l[0], 1.0, ee_l[0]); hypre_ParVectorZeroBCValues(ee_l[0], BdryRanks_l[0], BdryRanksCnts_l[0]); e_dot_e = hypre_ParVectorInnerProd(ee_l[0], ee_l[0]); hypre_ParVectorCopy(xe_l[0], eVtemp_l[0]); hypre_ParCSRMatrixMatvec(1.0, Tgrad, xn_l[0], 1.0, eVtemp_l[0]); hypre_ParVectorZeroBCValues(eVtemp_l[0], BdryRanks_l[0], BdryRanksCnts_l[0]); x_dot_x = hypre_ParVectorInnerProd(eVtemp_l[0], eVtemp_l[0]); } else { e_dot_e = 0.0; x_dot_x = 1.0; } } /* check nodal convergence */ for (j = 0; j < npost_relax; j++) { hypre_ParVectorCopy(bn_l[0], nVtemp_l[0]); hypre_ParCSRMatrixMatvecT(-1.0, Aen_l[0], xe_l[0], 1.0, nVtemp_l[0]); hypre_BoomerAMGRelaxIF(Ann_l[0], nVtemp_l[0], nCF_marker_l[0], nrelax_type, relax_local, cycle_param, nrelax_weight[0], nomega[0], NULL, xn_l[0], nVtemp2_l[0], ze); hypre_ParVectorCopy(be_l[0], eVtemp_l[0]); hypre_ParCSRMatrixMatvec(-1.0, Aen_l[0], xn_l[0], 1.0, eVtemp_l[0]); hypre_ParVectorZeroBCValues(eVtemp_l[0], BdryRanks_l[0], BdryRanksCnts_l[0]); hypre_BoomerAMGRelaxIF(Aee_l[0], eVtemp_l[0], eCF_marker_l[0], erelax_type, relax_local, cycle_param, erelax_weight[0], eomega[0], NULL, xe_l[0], eVtemp2_l[0], ze); } /* for (j = 0; j < npost_relax; j++) */ (maxwell_data -> num_iterations) = (i + 1); } /* add the gradient solution component to u_edge */ hypre_ParCSRMatrixMatvec(1.0, Tgrad, xn_l[0], 1.0, u_edge); hypre_ParVectorZeroBCValues(u_edge, BdryRanks_l[0], BdryRanksCnts_l[0]); hypre_EndTiming(maxwell_data -> time_index); hypre_ParVectorDestroy(ze); return hypre_error_flag; } hypre-2.33.0/src/sstruct_ls/maxwell_solve2.c000066400000000000000000000412051477326011500210410ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "_hypre_sstruct_ls.h" /*-------------------------------------------------------------------------- * hypre_MaxwellSolve- note that there is no input operator Aee. We assume * that maxwell_vdata has the exact operators. This prevents the need to * to recompute Ann in the solve phase. However, we do allow the f_edge & * u_edge to change per call. *--------------------------------------------------------------------------*/ HYPRE_Int hypre_MaxwellSolve2( void *maxwell_vdata, hypre_SStructMatrix *A_in, hypre_SStructVector *f, hypre_SStructVector *u ) { HYPRE_UNUSED_VAR(A_in); hypre_MaxwellData *maxwell_data = (hypre_MaxwellData *)maxwell_vdata; hypre_ParVector *f_edge; hypre_ParVector *u_edge; HYPRE_Int max_iter = maxwell_data-> max_iter; HYPRE_Real tol = maxwell_data-> tol; HYPRE_Int rel_change = maxwell_data-> rel_change; HYPRE_Int zero_guess = maxwell_data-> zero_guess; HYPRE_Int npre_relax = maxwell_data-> num_pre_relax; HYPRE_Int npost_relax = maxwell_data-> num_post_relax; hypre_ParCSRMatrix **Ann_l = maxwell_data-> Ann_l; hypre_ParCSRMatrix **Pn_l = maxwell_data-> Pn_l; hypre_ParCSRMatrix **RnT_l = maxwell_data-> RnT_l; hypre_ParVector **bn_l = maxwell_data-> bn_l; hypre_ParVector **xn_l = maxwell_data-> xn_l; hypre_ParVector **resn_l = maxwell_data-> resn_l; hypre_ParVector **en_l = maxwell_data-> en_l; hypre_ParVector **nVtemp2_l = maxwell_data-> nVtemp2_l; HYPRE_Int **nCF_marker_l = maxwell_data-> nCF_marker_l; HYPRE_Real *nrelax_weight = maxwell_data-> nrelax_weight; HYPRE_Real *nomega = maxwell_data-> nomega; HYPRE_Int nrelax_type = maxwell_data-> nrelax_type; HYPRE_Int node_numlevs = maxwell_data-> node_numlevels; hypre_ParCSRMatrix *Tgrad = maxwell_data-> Tgrad; hypre_ParCSRMatrix *T_transpose = maxwell_data-> T_transpose; hypre_ParCSRMatrix **Aee_l = maxwell_data-> Aee_l; hypre_IJMatrix **Pe_l = maxwell_data-> Pe_l; hypre_IJMatrix **ReT_l = maxwell_data-> ReT_l; hypre_ParVector **be_l = maxwell_data-> be_l; hypre_ParVector **xe_l = maxwell_data-> xe_l; hypre_ParVector **rese_l = maxwell_data-> rese_l; hypre_ParVector **ee_l = maxwell_data-> ee_l; hypre_ParVector **eVtemp2_l = maxwell_data-> eVtemp2_l; HYPRE_Int **eCF_marker_l = maxwell_data-> eCF_marker_l; HYPRE_Real *erelax_weight = maxwell_data-> erelax_weight; HYPRE_Real *eomega = maxwell_data-> eomega; HYPRE_Int erelax_type = maxwell_data-> erelax_type; HYPRE_Int edge_numlevs = maxwell_data-> edge_numlevels; HYPRE_Int **BdryRanks_l = maxwell_data-> BdryRanks_l; HYPRE_Int *BdryRanksCnts_l = maxwell_data-> BdryRanksCnts_l; HYPRE_Int logging = maxwell_data-> logging; HYPRE_Real *norms = maxwell_data-> norms; HYPRE_Real *rel_norms = maxwell_data-> rel_norms; HYPRE_Int relax_local, cycle_param; HYPRE_Real b_dot_b = 0, r_dot_r, eps = 0; HYPRE_Real e_dot_e = 1.0, x_dot_x = 1.0; HYPRE_Int i, j; HYPRE_Int level; /* added for the relaxation routines */ hypre_ParVector *ze = NULL; if (hypre_NumThreads() > 1) { /* Aee is always bigger than Ann */ ze = hypre_ParVectorCreate(hypre_ParCSRMatrixComm(Aee_l[0]), hypre_ParCSRMatrixGlobalNumRows(Aee_l[0]), hypre_ParCSRMatrixRowStarts(Aee_l[0])); hypre_ParVectorInitialize(ze); } hypre_BeginTiming(maxwell_data-> time_index); hypre_SStructVectorConvert(f, &f_edge); hypre_SStructVectorConvert(u, &u_edge); hypre_ParVectorZeroBCValues(f_edge, BdryRanks_l[0], BdryRanksCnts_l[0]); hypre_ParVectorZeroBCValues(u_edge, BdryRanks_l[0], BdryRanksCnts_l[0]); be_l[0] = f_edge; xe_l[0] = u_edge; /* the nodal fine vectors: xn= 0. bn= T'*(be- Aee*xe) is updated in the cycle. */ hypre_ParVectorSetConstantValues(xn_l[0], 0.0); relax_local = 0; cycle_param = 0; (maxwell_data-> num_iterations) = 0; /* if max_iter is zero, return */ if (max_iter == 0) { /* if using a zero initial guess, return zero */ if (zero_guess) { hypre_ParVectorSetConstantValues(xe_l[0], 0.0); } hypre_EndTiming(maxwell_data -> time_index); return hypre_error_flag; } /* part of convergence check */ if (tol > 0.0) { /* eps = (tol^2) */ b_dot_b = hypre_ParVectorInnerProd(be_l[0], be_l[0]); eps = tol * tol; /* if rhs is zero, return a zero solution */ if (b_dot_b == 0.0) { hypre_ParVectorSetConstantValues(xe_l[0], 0.0); if (logging > 0) { norms[0] = 0.0; rel_norms[0] = 0.0; } hypre_EndTiming(maxwell_data -> time_index); return hypre_error_flag; } } /*----------------------------------------------------- * Do V-cycles: * For each index l, "fine" = l, "coarse" = (l-1) * * solution update: * edge_sol= edge_sol + T*node_sol *-----------------------------------------------------*/ for (i = 0; i < max_iter; i++) { /* compute fine grid residual & nodal rhs. */ hypre_ParVectorCopy(be_l[0], rese_l[0]); hypre_ParCSRMatrixMatvec(-1.0, Aee_l[0], xe_l[0], 1.0, rese_l[0]); hypre_ParVectorZeroBCValues(rese_l[0], BdryRanks_l[0], BdryRanksCnts_l[0]); hypre_ParCSRMatrixMatvec(1.0, T_transpose, rese_l[0], 0.0, bn_l[0]); /* convergence check */ if (tol > 0.0) { r_dot_r = hypre_ParVectorInnerProd(rese_l[0], rese_l[0]); if (logging > 0) { norms[i] = hypre_sqrt(r_dot_r); if (b_dot_b > 0) { rel_norms[i] = hypre_sqrt(r_dot_r / b_dot_b); } else { rel_norms[i] = 0.0; } } /* always do at least 1 V-cycle */ if ((r_dot_r / b_dot_b < eps) && (i > 0)) { if (rel_change) { if ((e_dot_e / x_dot_x) < eps) { break; } } else { break; } } } hypre_ParVectorCopy(bn_l[0], resn_l[0]); hypre_ParCSRMatrixMatvec(-1.0, Ann_l[0], xn_l[0], 1.0, resn_l[0]); r_dot_r = hypre_ParVectorInnerProd(resn_l[0], resn_l[0]); for (level = 0; level <= node_numlevs - 2; level++) { /*----------------------------------------------- * Down cycle *-----------------------------------------------*/ for (j = 0; j < npre_relax; j++) { hypre_BoomerAMGRelaxIF(Ann_l[level], bn_l[level], nCF_marker_l[level], nrelax_type, relax_local, cycle_param, nrelax_weight[level], nomega[level], NULL, xn_l[level], nVtemp2_l[level], ze); } /*for (j = 0; j < npre_relax; j++) */ /* compute residuals */ hypre_ParVectorCopy(bn_l[level], resn_l[level]); hypre_ParCSRMatrixMatvec(-1.0, Ann_l[level], xn_l[level], 1.0, resn_l[level]); /* restrict residuals */ hypre_ParCSRMatrixMatvecT(1.0, RnT_l[level], resn_l[level], 0.0, bn_l[level + 1]); /* zero off initial guess for the next level */ hypre_ParVectorSetConstantValues(xn_l[level + 1], 0.0); } /* for (level = 0; level<= node_numlevs-2; level++) */ /* coarsest node solve */ level = node_numlevs - 1; hypre_BoomerAMGRelaxIF(Ann_l[level], bn_l[level], nCF_marker_l[level], nrelax_type, relax_local, cycle_param, nrelax_weight[level], nomega[level], NULL, xn_l[level], nVtemp2_l[level], ze); /*--------------------------------------------------------------------- * Cycle up the levels. *---------------------------------------------------------------------*/ for (level = (node_numlevs - 2); level >= 1; level--) { hypre_ParCSRMatrixMatvec(1.0, Pn_l[level], xn_l[level + 1], 0.0, en_l[level]); hypre_ParVectorAxpy(1.0, en_l[level], xn_l[level]); /* post smooth */ for (j = 0; j < npost_relax; j++) { hypre_BoomerAMGRelaxIF(Ann_l[level], bn_l[level], nCF_marker_l[level], nrelax_type, relax_local, cycle_param, nrelax_weight[level], nomega[level], NULL, xn_l[level], nVtemp2_l[level], ze); } } /* for (level = (en_numlevs - 2); level>= 1; level--) */ /* interpolate error and correct on finest grids */ hypre_ParCSRMatrixMatvec(1.0, Pn_l[0], xn_l[1], 0.0, en_l[0]); hypre_ParVectorAxpy(1.0, en_l[0], xn_l[0]); for (j = 0; j < npost_relax; j++) { hypre_BoomerAMGRelaxIF(Ann_l[0], bn_l[0], nCF_marker_l[0], nrelax_type, relax_local, cycle_param, nrelax_weight[0], nomega[0], NULL, xn_l[0], nVtemp2_l[0], ze); } /* for (j = 0; j < npost_relax; j++) */ hypre_ParVectorCopy(bn_l[0], resn_l[0]); hypre_ParCSRMatrixMatvec(-1.0, Ann_l[0], xn_l[0], 1.0, resn_l[0]); /* add the gradient solution component to xe_l[0] */ hypre_ParCSRMatrixMatvec(1.0, Tgrad, xn_l[0], 1.0, xe_l[0]); hypre_ParVectorCopy(be_l[0], rese_l[0]); hypre_ParCSRMatrixMatvec(-1.0, Aee_l[0], xe_l[0], 1.0, rese_l[0]); r_dot_r = hypre_ParVectorInnerProd(rese_l[0], rese_l[0]); for (level = 0; level <= edge_numlevs - 2; level++) { /*----------------------------------------------- * Down cycle *-----------------------------------------------*/ for (j = 0; j < npre_relax; j++) { hypre_BoomerAMGRelaxIF(Aee_l[level], be_l[level], eCF_marker_l[level], erelax_type, relax_local, cycle_param, erelax_weight[level], eomega[level], NULL, xe_l[level], eVtemp2_l[level], ze); } /*for (j = 0; j < npre_relax; j++) */ /* compute residuals */ hypre_ParVectorCopy(be_l[level], rese_l[level]); hypre_ParCSRMatrixMatvec(-1.0, Aee_l[level], xe_l[level], 1.0, rese_l[level]); /* restrict residuals */ hypre_ParCSRMatrixMatvecT(1.0, (hypre_ParCSRMatrix *) hypre_IJMatrixObject(ReT_l[level]), rese_l[level], 0.0, be_l[level + 1]); hypre_ParVectorZeroBCValues(be_l[level + 1], BdryRanks_l[level + 1], BdryRanksCnts_l[level + 1]); /* zero off initial guess for the next level */ hypre_ParVectorSetConstantValues(xe_l[level + 1], 0.0); } /* for (level = 1; level<= edge_numlevels-2; level++) */ /* coarsest edge solve */ level = edge_numlevs - 1; for (j = 0; j < npre_relax; j++) { hypre_BoomerAMGRelaxIF(Aee_l[level], be_l[level], eCF_marker_l[level], erelax_type, relax_local, cycle_param, erelax_weight[level], eomega[level], NULL, xe_l[level], eVtemp2_l[level], ze); } /*--------------------------------------------------------------------- * Up cycle. *---------------------------------------------------------------------*/ for (level = (edge_numlevs - 2); level >= 1; level--) { hypre_ParCSRMatrixMatvec(1.0, (hypre_ParCSRMatrix *) hypre_IJMatrixObject(Pe_l[level]), xe_l[level + 1], 0.0, ee_l[level]); hypre_ParVectorZeroBCValues(ee_l[level], BdryRanks_l[level], BdryRanksCnts_l[level]); hypre_ParVectorAxpy(1.0, ee_l[level], xe_l[level]); /* post smooth */ for (j = 0; j < npost_relax; j++) { hypre_BoomerAMGRelaxIF(Aee_l[level], be_l[level], eCF_marker_l[level], erelax_type, relax_local, cycle_param, erelax_weight[level], eomega[level], NULL, xe_l[level], eVtemp2_l[level], ze); } } /* for (level = (edge_numlevs - 2); level>= 1; level--) */ /* interpolate error and correct on finest grids */ hypre_ParCSRMatrixMatvec(1.0, (hypre_ParCSRMatrix *) hypre_IJMatrixObject(Pe_l[0]), xe_l[1], 0.0, ee_l[0]); hypre_ParVectorZeroBCValues(ee_l[0], BdryRanks_l[0], BdryRanksCnts_l[0]); hypre_ParVectorAxpy(1.0, ee_l[0], xe_l[0]); for (j = 0; j < npost_relax; j++) { hypre_BoomerAMGRelaxIF(Aee_l[0], be_l[0], eCF_marker_l[0], erelax_type, relax_local, cycle_param, erelax_weight[0], eomega[0], NULL, xe_l[0], eVtemp2_l[0], ze); } /* for (j = 0; j < npost_relax; j++) */ e_dot_e = hypre_ParVectorInnerProd(ee_l[0], ee_l[0]); x_dot_x = hypre_ParVectorInnerProd(xe_l[0], xe_l[0]); hypre_ParVectorCopy(be_l[0], rese_l[0]); hypre_ParCSRMatrixMatvec(-1.0, Aee_l[0], xe_l[0], 1.0, rese_l[0]); (maxwell_data -> num_iterations) = (i + 1); } hypre_EndTiming(maxwell_data -> time_index); hypre_ParVectorDestroy(ze); return hypre_error_flag; } hypre-2.33.0/src/sstruct_ls/maxwell_zeroBC.c000066400000000000000000000022141477326011500210100ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "_hypre_sstruct_ls.h" HYPRE_Int hypre_ParVectorZeroBCValues(hypre_ParVector *v, HYPRE_Int *rows, HYPRE_Int nrows) { HYPRE_Int ierr = 0; hypre_Vector *v_local = hypre_ParVectorLocalVector(v); hypre_SeqVectorZeroBCValues(v_local, rows, nrows); return ierr; } HYPRE_Int hypre_SeqVectorZeroBCValues(hypre_Vector *v, HYPRE_Int *rows, HYPRE_Int nrows) { HYPRE_Real *vector_data = hypre_VectorData(v); HYPRE_Int i; HYPRE_Int ierr = 0; #if defined(HYPRE_USING_OPENMP) #pragma omp parallel for private(i) HYPRE_SMP_SCHEDULE #endif for (i = 0; i < nrows; i++) { vector_data[rows[i]] = 0.0; } return ierr; } hypre-2.33.0/src/sstruct_ls/nd1_amge_interpolation.c000066400000000000000000000411021477326011500225140ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "_hypre_IJ_mv.h" #include "_hypre_sstruct_ls.h" #include "nd1_amge_interpolation.h" /* Assume that we are given a fine and coarse topology and the coarse degrees of freedom (DOFs) have been chosen. Assume also, that the global interpolation matrix dof_DOF has a prescribed nonzero pattern. Then, the fine degrees of freedom can be split into 4 groups (here "i" stands for "interior"): NODEidof - dofs which are interpolated only from the DOF in one coarse vertex EDGEidof - dofs which are interpolated only from the DOFs in one coarse edge FACEidof - dofs which are interpolated only from the DOFs in one coarse face ELEMidof - dofs which are interpolated only from the DOFs in one coarse element The interpolation operator dof_DOF can be build in 4 steps, by consequently filling-in the rows corresponding to the above groups. The code below uses harmonic extension to extend the interpolation from one group to the next. */ HYPRE_Int hypre_ND1AMGeInterpolation (hypre_ParCSRMatrix * Aee, hypre_ParCSRMatrix * ELEM_idof, hypre_ParCSRMatrix * FACE_idof, hypre_ParCSRMatrix * EDGE_idof, hypre_ParCSRMatrix * ELEM_FACE, hypre_ParCSRMatrix * ELEM_EDGE, HYPRE_Int num_OffProcRows, hypre_MaxwellOffProcRow ** OffProcRows, hypre_IJMatrix * IJ_dof_DOF) { HYPRE_Int ierr = 0; HYPRE_Int i, j; HYPRE_BigInt big_k; HYPRE_BigInt *offproc_rnums; HYPRE_Int *swap = NULL; hypre_ParCSRMatrix * dof_DOF = (hypre_ParCSRMatrix *)hypre_IJMatrixObject(IJ_dof_DOF); hypre_ParCSRMatrix * ELEM_DOF = ELEM_EDGE; hypre_ParCSRMatrix * ELEM_FACEidof; hypre_ParCSRMatrix * ELEM_EDGEidof; hypre_CSRMatrix *A, *P; HYPRE_Int numELEM = hypre_CSRMatrixNumRows(hypre_ParCSRMatrixDiag(ELEM_EDGE)); HYPRE_Int getrow_ierr; HYPRE_Int three_dimensional_problem; MPI_Comm comm = hypre_ParCSRMatrixComm(Aee); HYPRE_Int myproc; hypre_MPI_Comm_rank(comm, &myproc); #if 0 hypre_IJMatrix * ij_dof_DOF = hypre_CTAlloc(hypre_IJMatrix, 1, HYPRE_MEMORY_HOST); /* Convert dof_DOF to IJ matrix, so we can use AddToValues */ hypre_IJMatrixComm(ij_dof_DOF) = hypre_ParCSRMatrixComm(dof_DOF); hypre_IJMatrixRowPartitioning(ij_dof_DOF) = hypre_ParCSRMatrixRowStarts(dof_DOF); hypre_IJMatrixColPartitioning(ij_dof_DOF) = hypre_ParCSRMatrixColStarts(dof_DOF); hypre_IJMatrixObject(ij_dof_DOF) = dof_DOF; hypre_IJMatrixAssembleFlag(ij_dof_DOF) = 1; #endif /* sort the offproc rows to get quicker comparison for later */ if (num_OffProcRows) { offproc_rnums = hypre_TAlloc(HYPRE_BigInt, num_OffProcRows, HYPRE_MEMORY_HOST); swap = hypre_TAlloc(HYPRE_Int, num_OffProcRows, HYPRE_MEMORY_HOST); for (i = 0; i < num_OffProcRows; i++) { offproc_rnums[i] = (OffProcRows[i] -> row); swap[i] = i; } } if (num_OffProcRows > 1) { hypre_BigQsortbi(offproc_rnums, swap, 0, num_OffProcRows - 1); } if (FACE_idof == EDGE_idof) { three_dimensional_problem = 0; } else { three_dimensional_problem = 1; } /* ELEM_FACEidof = ELEM_FACE x FACE_idof */ if (three_dimensional_problem) { ELEM_FACEidof = hypre_ParMatmul(ELEM_FACE, FACE_idof); } /* ELEM_EDGEidof = ELEM_EDGE x EDGE_idof */ ELEM_EDGEidof = hypre_ParMatmul(ELEM_EDGE, EDGE_idof); /* Loop over local coarse elements */ big_k = hypre_ParCSRMatrixFirstRowIndex(ELEM_EDGE); for (i = 0; i < numELEM; i++, big_k++) { HYPRE_Int size1, size2; HYPRE_BigInt *col_ind0, *col_ind1, *col_ind2; HYPRE_BigInt *DOF0, *DOF; HYPRE_Int num_DOF; HYPRE_Int num_idof; HYPRE_BigInt *idof0, *idof, *bdof; HYPRE_Int num_bdof; HYPRE_Real *boolean_data; /* Determine the coarse DOFs */ hypre_ParCSRMatrixGetRow (ELEM_DOF, big_k, &num_DOF, &DOF0, &boolean_data); DOF = hypre_TAlloc(HYPRE_BigInt, num_DOF, HYPRE_MEMORY_HOST); for (j = 0; j < num_DOF; j++) { DOF[j] = DOF0[j]; } hypre_ParCSRMatrixRestoreRow (ELEM_DOF, big_k, &num_DOF, &DOF0, &boolean_data); hypre_BigQsort0(DOF, 0, num_DOF - 1); /* Find the fine dofs interior for the current coarse element */ hypre_ParCSRMatrixGetRow (ELEM_idof, big_k, &num_idof, &idof0, &boolean_data); idof = hypre_TAlloc(HYPRE_BigInt, num_idof, HYPRE_MEMORY_HOST); for (j = 0; j < num_idof; j++) { idof[j] = idof0[j]; } hypre_ParCSRMatrixRestoreRow (ELEM_idof, big_k, &num_idof, &idof0, &boolean_data); /* Sort the interior dofs according to their global number */ hypre_BigQsort0(idof, 0, num_idof - 1); /* Find the fine dofs on the boundary of the current coarse element */ if (three_dimensional_problem) { hypre_ParCSRMatrixGetRow (ELEM_FACEidof, big_k, &size1, &col_ind0, &boolean_data); col_ind1 = hypre_TAlloc(HYPRE_BigInt, size1, HYPRE_MEMORY_HOST); for (j = 0; j < size1; j++) { col_ind1[j] = col_ind0[j]; } hypre_ParCSRMatrixRestoreRow (ELEM_FACEidof, big_k, &size1, &col_ind0, &boolean_data); } else { col_ind1 = NULL; size1 = 0; } hypre_ParCSRMatrixGetRow (ELEM_EDGEidof, big_k, &size2, &col_ind0, &boolean_data); col_ind2 = hypre_TAlloc(HYPRE_BigInt, size2, HYPRE_MEMORY_HOST); for (j = 0; j < size2; j++) { col_ind2[j] = col_ind0[j]; } hypre_ParCSRMatrixRestoreRow (ELEM_EDGEidof, big_k, &size2, &col_ind0, &boolean_data); /* Merge and sort the boundary dofs according to their global number */ num_bdof = size1 + size2; bdof = hypre_CTAlloc(HYPRE_BigInt, num_bdof, HYPRE_MEMORY_HOST); if (three_dimensional_problem) { hypre_TMemcpy(bdof, col_ind1, HYPRE_BigInt, size1, HYPRE_MEMORY_HOST, HYPRE_MEMORY_HOST); } hypre_TMemcpy(bdof + size1, col_ind2, HYPRE_BigInt, size2, HYPRE_MEMORY_HOST, HYPRE_MEMORY_HOST); hypre_BigQsort0(bdof, 0, num_bdof - 1); /* A = extract_rows(Aee, idof) */ A = hypre_CSRMatrixCreate (num_idof, num_idof + num_bdof, num_idof * (num_idof + num_bdof)); hypre_CSRMatrixBigInitialize(A); { HYPRE_Int *I = hypre_CSRMatrixI(A); HYPRE_BigInt *J = hypre_CSRMatrixBigJ(A); HYPRE_Real *data = hypre_CSRMatrixData(A); HYPRE_BigInt *tmp_J; HYPRE_Real *tmp_data; HYPRE_MemoryLocation memory_location_A = hypre_CSRMatrixMemoryLocation(A); HYPRE_MemoryLocation memory_location_Aee = hypre_ParCSRMatrixMemoryLocation(Aee); I[0] = 0; for (j = 0; j < num_idof; j++) { getrow_ierr = hypre_ParCSRMatrixGetRow (Aee, idof[j], &size1, &tmp_J, &tmp_data); if (getrow_ierr < 0) { hypre_printf("getrow Aee off proc[%d] = \n", myproc); } hypre_TMemcpy(J, tmp_J, HYPRE_BigInt, size1, memory_location_A, memory_location_Aee); hypre_TMemcpy(data, tmp_data, HYPRE_Real, size1, memory_location_A, memory_location_Aee); J += size1; data += size1; hypre_ParCSRMatrixRestoreRow (Aee, idof[j], &size1, &tmp_J, &tmp_data); I[j + 1] = size1 + I[j]; } } /* P = extract_rows(dof_DOF, idof+bdof) */ P = hypre_CSRMatrixCreate (num_idof + num_bdof, num_DOF, (num_idof + num_bdof) * num_DOF); hypre_CSRMatrixBigInitialize(P); { HYPRE_Int *I = hypre_CSRMatrixI(P); HYPRE_BigInt *J = hypre_CSRMatrixBigJ(P); HYPRE_Real *data = hypre_CSRMatrixData(P); HYPRE_Int m; HYPRE_BigInt *tmp_J; HYPRE_Real *tmp_data; HYPRE_MemoryLocation memory_location_P = hypre_CSRMatrixMemoryLocation(P); HYPRE_MemoryLocation memory_location_d = hypre_ParCSRMatrixMemoryLocation(dof_DOF); I[0] = 0; for (j = 0; j < num_idof; j++) { getrow_ierr = hypre_ParCSRMatrixGetRow (dof_DOF, idof[j], &size1, &tmp_J, &tmp_data); if (getrow_ierr >= 0) { hypre_TMemcpy(J, tmp_J, HYPRE_BigInt, size1, memory_location_P, memory_location_d); hypre_TMemcpy(data, tmp_data, HYPRE_Real, size1, memory_location_P, memory_location_d); J += size1; data += size1; hypre_ParCSRMatrixRestoreRow (dof_DOF, idof[j], &size1, &tmp_J, &tmp_data); I[j + 1] = size1 + I[j]; } else /* row offproc */ { hypre_ParCSRMatrixRestoreRow (dof_DOF, idof[j], &size1, &tmp_J, &tmp_data); /* search for OffProcRows */ m = 0; while (m < num_OffProcRows) { if (offproc_rnums[m] == idof[j]) { break; } else { m++; } } size1 = (OffProcRows[swap[m]] -> ncols); tmp_J = (OffProcRows[swap[m]] -> cols); tmp_data = (OffProcRows[swap[m]] -> data); hypre_TMemcpy(J, tmp_J, HYPRE_BigInt, size1, memory_location_P, HYPRE_MEMORY_HOST); hypre_TMemcpy(data, tmp_data, HYPRE_Real, size1, memory_location_P, HYPRE_MEMORY_HOST); J += size1; data += size1; I[j + 1] = size1 + I[j]; } } for ( ; j < num_idof + num_bdof; j++) { getrow_ierr = hypre_ParCSRMatrixGetRow (dof_DOF, bdof[j - num_idof], &size1, &tmp_J, &tmp_data); if (getrow_ierr >= 0) { hypre_TMemcpy(J, tmp_J, HYPRE_BigInt, size1, memory_location_P, memory_location_d); hypre_TMemcpy(data, tmp_data, HYPRE_Real, size1, memory_location_P, memory_location_d); J += size1; data += size1; hypre_ParCSRMatrixRestoreRow (dof_DOF, bdof[j - num_idof], &size1, &tmp_J, &tmp_data); I[j + 1] = size1 + I[j]; } else /* row offproc */ { hypre_ParCSRMatrixRestoreRow (dof_DOF, bdof[j - num_idof], &size1, &tmp_J, &tmp_data); /* search for OffProcRows */ m = 0; while (m < num_OffProcRows) { if (offproc_rnums[m] == bdof[j - num_idof]) { break; } else { m++; } } if (m >= num_OffProcRows) { hypre_printf("here the mistake\n"); } size1 = (OffProcRows[swap[m]] -> ncols); tmp_J = (OffProcRows[swap[m]] -> cols); tmp_data = (OffProcRows[swap[m]] -> data); hypre_TMemcpy(J, tmp_J, HYPRE_BigInt, size1, memory_location_P, HYPRE_MEMORY_HOST); hypre_TMemcpy(data, tmp_data, HYPRE_Real, size1, memory_location_P, HYPRE_MEMORY_HOST); J += size1; data += size1; I[j + 1] = size1 + I[j]; } } } /* Pi = Aii^{-1} Aib Pb */ hypre_HarmonicExtension (A, P, num_DOF, DOF, num_idof, idof, num_bdof, bdof); /* Insert Pi in dof_DOF */ { HYPRE_Int * ncols = hypre_CTAlloc(HYPRE_Int, num_idof, HYPRE_MEMORY_HOST); HYPRE_Int * idof_indexes = hypre_CTAlloc(HYPRE_Int, num_idof, HYPRE_MEMORY_HOST); for (j = 0; j < num_idof; j++) { ncols[j] = num_DOF; idof_indexes[j] = j * num_DOF; } hypre_IJMatrixAddToValuesParCSR (IJ_dof_DOF, num_idof, ncols, idof, idof_indexes, hypre_CSRMatrixBigJ(P), hypre_CSRMatrixData(P)); hypre_TFree(ncols, HYPRE_MEMORY_HOST); hypre_TFree(idof_indexes, HYPRE_MEMORY_HOST); } hypre_TFree(DOF, HYPRE_MEMORY_HOST); hypre_TFree(idof, HYPRE_MEMORY_HOST); if (three_dimensional_problem) { hypre_TFree(col_ind1, HYPRE_MEMORY_HOST); } hypre_TFree(col_ind2, HYPRE_MEMORY_HOST); hypre_TFree(bdof, HYPRE_MEMORY_HOST); hypre_CSRMatrixDestroy(A); hypre_CSRMatrixDestroy(P); } #if 0 hypre_TFree(ij_dof_DOF, HYPRE_MEMORY_HOST); #endif if (three_dimensional_problem) { hypre_ParCSRMatrixDestroy(ELEM_FACEidof); } hypre_ParCSRMatrixDestroy(ELEM_EDGEidof); if (num_OffProcRows) { hypre_TFree(offproc_rnums, HYPRE_MEMORY_HOST); hypre_TFree(swap, HYPRE_MEMORY_HOST); } return ierr; } HYPRE_Int hypre_HarmonicExtension (hypre_CSRMatrix *A, hypre_CSRMatrix *P, HYPRE_Int num_DOF, HYPRE_BigInt *DOF, HYPRE_Int num_idof, HYPRE_BigInt *idof, HYPRE_Int num_bdof, HYPRE_BigInt *bdof) { HYPRE_Int ierr = 0; HYPRE_Int i, j, k, l, m; HYPRE_Real factor; HYPRE_Int *IA = hypre_CSRMatrixI(A); HYPRE_BigInt *JA = hypre_CSRMatrixBigJ(A); HYPRE_Real *dataA = hypre_CSRMatrixData(A); HYPRE_Int *IP = hypre_CSRMatrixI(P); HYPRE_BigInt *JP = hypre_CSRMatrixBigJ(P); HYPRE_Real *dataP = hypre_CSRMatrixData(P); HYPRE_Real * Aii = hypre_CTAlloc(HYPRE_Real, num_idof * num_idof, HYPRE_MEMORY_HOST); HYPRE_Real * Pi = hypre_CTAlloc(HYPRE_Real, num_idof * num_DOF, HYPRE_MEMORY_HOST); /* Loop over the rows of A */ for (i = 0; i < num_idof; i++) for (j = IA[i]; j < IA[i + 1]; j++) { /* Global to local*/ k = hypre_BigBinarySearch(idof, JA[j], num_idof); /* If a column is a bdof, compute its participation in Pi = Aib x Pb */ if (k == -1) { k = hypre_BigBinarySearch(bdof, JA[j], num_bdof); if (k > -1) { for (l = IP[k + num_idof]; l < IP[k + num_idof + 1]; l++) { m = hypre_BigBinarySearch(DOF, JP[l], num_DOF); if (m > -1) { m += i * num_DOF; /* Pi[i*num_DOF+m] += dataA[j] * dataP[l];*/ Pi[m] += dataA[j] * dataP[l]; } } } } /* If a column is an idof, put it in Aii */ else { Aii[i * num_idof + k] = dataA[j]; } } /* Perform Gaussian elimination in [Aii, Pi] */ for (j = 0; j < num_idof - 1; j++) if (Aii[j * num_idof + j] != 0.0) for (i = j + 1; i < num_idof; i++) if (Aii[i * num_idof + j] != 0.0) { factor = Aii[i * num_idof + j] / Aii[j * num_idof + j]; for (m = j + 1; m < num_idof; m++) { Aii[i * num_idof + m] -= factor * Aii[j * num_idof + m]; } for (m = 0; m < num_DOF; m++) { Pi[i * num_DOF + m] -= factor * Pi[j * num_DOF + m]; } } /* Back Substitution */ for (i = num_idof - 1; i >= 0; i--) { for (j = i + 1; j < num_idof; j++) if (Aii[i * num_idof + j] != 0.0) for (m = 0; m < num_DOF; m++) { Pi[i * num_DOF + m] -= Aii[i * num_idof + j] * Pi[j * num_DOF + m]; } for (m = 0; m < num_DOF; m++) { Pi[i * num_DOF + m] /= Aii[i * num_idof + i]; } } /* Put -Pi back in P. We assume that each idof depends on _all_ DOFs */ for (i = 0; i < num_idof; i++, JP += num_DOF, dataP += num_DOF) for (j = 0; j < num_DOF; j++) { JP[j] = DOF[j]; dataP[j] = -Pi[i * num_DOF + j]; } hypre_TFree(Aii, HYPRE_MEMORY_HOST); hypre_TFree(Pi, HYPRE_MEMORY_HOST); return ierr; } hypre-2.33.0/src/sstruct_ls/nd1_amge_interpolation.h000066400000000000000000000053341477326011500225300ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #ifndef hypre_ND1_AMGE_INTERPOLATION #define hypre_ND1_AMGE_INTERPOLATION /* Function: hypre_ND1AMGeInterpolation Defines an operator-dependent (AMGe) interpolation for the fine interior edges, given the (e.g. geometric) interpolation for the fine edges on the boundaries of coarse elements. The parameters are: Aee [input] The stiffness matrix for lowest order Nedelec elements on the fine level. ELEM_iedge, FACE_iedge, EDGE_iedge [input] coarse grid elements, faces and edges. ELEM_FACE, ELEM_EDGE [input] edge_EDGE [input/output] The interpolation from coarse to fine edges. This is a partially filled matrix, with set (and fixed) nonzero pattern. We assume that the rows corresponding to fine edges on the boundary of a coarse element are given and complete the construction by computing the rest of the entries. Note: If FACE_iedge == EDGE_iedge the input should describe a 2D problem. */ HYPRE_Int hypre_ND1AMGeInterpolation (hypre_ParCSRMatrix * Aee, hypre_ParCSRMatrix * ELEM_iedge, hypre_ParCSRMatrix * FACE_iedge, hypre_ParCSRMatrix * EDGE_iedge, hypre_ParCSRMatrix * ELEM_FACE, hypre_ParCSRMatrix * ELEM_EDGE, HYPRE_Int num_OffProcRows, hypre_MaxwellOffProcRow ** OffProcRows, hypre_IJMatrix * edge_EDGE); /* Function: hypre_HarmonicExtension Defines the interpolation operator Pi:DOF->idof by harmonically extending Pb:DOF->bdof based on the operator A. Specifically, A = [Aii,Aib] is idof x (idof+bdof) P = [-Pi;Pb] is (idof+bdof) x DOF and the function computes Pi = Aii^{-1} Aib Pb. The columns in A and P use global numbering, while the rows are numbered according to the arrays idof and bdof. The only output parameter is Pi. */ HYPRE_Int hypre_HarmonicExtension (hypre_CSRMatrix *A, hypre_CSRMatrix *P, HYPRE_Int num_DOF, HYPRE_BigInt *DOF, HYPRE_Int num_idof, HYPRE_BigInt *idof, HYPRE_Int num_bdof, HYPRE_BigInt *bdof); #endif hypre-2.33.0/src/sstruct_ls/node_relax.c000066400000000000000000001233001477326011500202130ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "_hypre_sstruct_ls.h" #include "_hypre_parcsr_ls.h" #include "_hypre_struct_mv.hpp" #include "gselim.h" /* TODO consider adding it to semistruct header files */ #define HYPRE_MAXVARS 4 /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ typedef struct { MPI_Comm comm; HYPRE_Real tol; /* not yet used */ HYPRE_Int max_iter; HYPRE_Int rel_change; /* not yet used */ HYPRE_Int zero_guess; HYPRE_Real weight; HYPRE_Int num_nodesets; HYPRE_Int *nodeset_sizes; HYPRE_Int *nodeset_ranks; hypre_Index *nodeset_strides; hypre_Index **nodeset_indices; hypre_SStructPMatrix *A; hypre_SStructPVector *b; hypre_SStructPVector *x; hypre_SStructPVector *t; HYPRE_Int **diag_rank; /* defines sends and recieves for each struct_vector */ hypre_ComputePkg ***svec_compute_pkgs; hypre_CommHandle **comm_handle; /* defines independent and dependent boxes for computations */ hypre_ComputePkg **compute_pkgs; /* pointers to local storage used to invert diagonal blocks */ /* HYPRE_Real *A_loc; HYPRE_Real *x_loc; */ /* pointers for vector and matrix data */ HYPRE_MemoryLocation memory_location; HYPRE_Real **Ap; HYPRE_Real **bp; HYPRE_Real **xp; HYPRE_Real **tp; /* log info (always logged) */ HYPRE_Int num_iterations; HYPRE_Int time_index; HYPRE_Int flops; } hypre_NodeRelaxData; /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ void * hypre_NodeRelaxCreate( MPI_Comm comm ) { hypre_NodeRelaxData *relax_data; hypre_Index stride; hypre_Index indices[1]; relax_data = hypre_CTAlloc(hypre_NodeRelaxData, 1, HYPRE_MEMORY_HOST); (relax_data -> comm) = comm; (relax_data -> time_index) = hypre_InitializeTiming("NodeRelax"); /* set defaults */ (relax_data -> tol) = 1.0e-06; (relax_data -> max_iter) = 1000; (relax_data -> rel_change) = 0; (relax_data -> zero_guess) = 0; (relax_data -> weight) = 1.0; (relax_data -> num_nodesets) = 0; (relax_data -> nodeset_sizes) = NULL; (relax_data -> nodeset_ranks) = NULL; (relax_data -> nodeset_strides) = NULL; (relax_data -> nodeset_indices) = NULL; (relax_data -> diag_rank) = NULL; (relax_data -> t) = NULL; /* (relax_data -> A_loc) = NULL; (relax_data -> x_loc) = NULL; */ (relax_data -> Ap) = NULL; (relax_data -> bp) = NULL; (relax_data -> xp) = NULL; (relax_data -> tp) = NULL; (relax_data -> comm_handle) = NULL; (relax_data -> svec_compute_pkgs) = NULL; (relax_data -> compute_pkgs) = NULL; hypre_SetIndex3(stride, 1, 1, 1); hypre_SetIndex3(indices[0], 0, 0, 0); hypre_NodeRelaxSetNumNodesets((void *) relax_data, 1); hypre_NodeRelaxSetNodeset((void *) relax_data, 0, 1, stride, indices); return (void *) relax_data; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_NodeRelaxDestroy( void *relax_vdata ) { hypre_NodeRelaxData *relax_data = (hypre_NodeRelaxData *)relax_vdata; HYPRE_Int i, vi; HYPRE_Int nvars; if (relax_data) { HYPRE_MemoryLocation memory_location = relax_data -> memory_location; nvars = hypre_SStructPMatrixNVars(relax_data -> A); for (i = 0; i < (relax_data -> num_nodesets); i++) { hypre_TFree(relax_data -> nodeset_indices[i], HYPRE_MEMORY_HOST); for (vi = 0; vi < nvars; vi++) { hypre_ComputePkgDestroy(relax_data -> svec_compute_pkgs[i][vi]); } hypre_TFree(relax_data -> svec_compute_pkgs[i], HYPRE_MEMORY_HOST); hypre_ComputePkgDestroy(relax_data -> compute_pkgs[i]); } hypre_TFree(relax_data -> nodeset_sizes, HYPRE_MEMORY_HOST); hypre_TFree(relax_data -> nodeset_ranks, HYPRE_MEMORY_HOST); hypre_TFree(relax_data -> nodeset_strides, HYPRE_MEMORY_HOST); hypre_TFree(relax_data -> nodeset_indices, HYPRE_MEMORY_HOST); hypre_SStructPMatrixDestroy(relax_data -> A); hypre_SStructPVectorDestroy(relax_data -> b); hypre_SStructPVectorDestroy(relax_data -> x); hypre_TFree(relax_data -> svec_compute_pkgs, HYPRE_MEMORY_HOST); hypre_TFree(relax_data -> comm_handle, HYPRE_MEMORY_HOST); hypre_TFree(relax_data -> compute_pkgs, HYPRE_MEMORY_HOST); hypre_SStructPVectorDestroy(relax_data -> t); /* hypre_TFree(relax_data -> x_loc, memory_location); hypre_TFree(relax_data -> A_loc, memory_location); */ hypre_TFree(relax_data -> bp, memory_location); hypre_TFree(relax_data -> xp, memory_location); hypre_TFree(relax_data -> tp, memory_location); hypre_TFree(relax_data -> Ap, memory_location); for (vi = 0; vi < nvars; vi++) { hypre_TFree((relax_data -> diag_rank)[vi], HYPRE_MEMORY_HOST); } hypre_TFree(relax_data -> diag_rank, HYPRE_MEMORY_HOST); hypre_FinalizeTiming(relax_data -> time_index); hypre_TFree(relax_data, HYPRE_MEMORY_HOST); } return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_NodeRelaxSetup( void *relax_vdata, hypre_SStructPMatrix *A, hypre_SStructPVector *b, hypre_SStructPVector *x ) { hypre_NodeRelaxData *relax_data = (hypre_NodeRelaxData *)relax_vdata; HYPRE_Int num_nodesets = (relax_data -> num_nodesets); HYPRE_Int *nodeset_sizes = (relax_data -> nodeset_sizes); hypre_Index *nodeset_strides = (relax_data -> nodeset_strides); hypre_Index **nodeset_indices = (relax_data -> nodeset_indices); HYPRE_Int ndim = hypre_SStructPMatrixNDim(A); hypre_SStructPVector *t; HYPRE_Int **diag_rank; /* HYPRE_Real *A_loc; HYPRE_Real *x_loc; */ HYPRE_Real **Ap; HYPRE_Real **bp; HYPRE_Real **xp; HYPRE_Real **tp; hypre_ComputeInfo *compute_info; hypre_ComputePkg **compute_pkgs; hypre_ComputePkg ***svec_compute_pkgs; hypre_CommHandle **comm_handle; hypre_Index diag_index; hypre_IndexRef stride; hypre_IndexRef index; hypre_StructGrid *sgrid; hypre_StructStencil *sstencil; hypre_Index *sstencil_shape; HYPRE_Int sstencil_size; hypre_StructStencil *sstencil_union; hypre_Index *sstencil_union_shape; HYPRE_Int sstencil_union_count; hypre_BoxArrayArray *orig_indt_boxes; hypre_BoxArrayArray *orig_dept_boxes; hypre_BoxArrayArray *box_aa; hypre_BoxArray *box_a; hypre_Box *box; HYPRE_Int box_aa_size; HYPRE_Int box_a_size; hypre_BoxArrayArray *new_box_aa; hypre_BoxArray *new_box_a; hypre_Box *new_box; HYPRE_Real scale; HYPRE_Int frac; HYPRE_Int i, j, k, p, m, s, compute_i; HYPRE_Int vi, vj; HYPRE_Int nvars; HYPRE_Int dim; HYPRE_MemoryLocation memory_location; /*---------------------------------------------------------- * Set up the temp vector *----------------------------------------------------------*/ if ((relax_data -> t) == NULL) { hypre_SStructPVectorCreate(hypre_SStructPVectorComm(b), hypre_SStructPVectorPGrid(b), &t); hypre_SStructPVectorInitialize(t); hypre_SStructPVectorAssemble(t); (relax_data -> t) = t; } /*---------------------------------------------------------- * Find the matrix diagonals, use diag_rank[vi][vj] = -1 to * mark that the coresponding StructMatrix is NULL. *----------------------------------------------------------*/ nvars = hypre_SStructPMatrixNVars(A); hypre_assert(nvars <= HYPRE_MAXVARS); diag_rank = hypre_CTAlloc(HYPRE_Int *, nvars, HYPRE_MEMORY_HOST); for (vi = 0; vi < nvars; vi++) { diag_rank[vi] = hypre_CTAlloc(HYPRE_Int, nvars, HYPRE_MEMORY_HOST); for (vj = 0; vj < nvars; vj++) { if (hypre_SStructPMatrixSMatrix(A, vi, vj) != NULL) { sstencil = hypre_SStructPMatrixSStencil(A, vi, vj); hypre_SetIndex3(diag_index, 0, 0, 0); diag_rank[vi][vj] = hypre_StructStencilElementRank(sstencil, diag_index); } else { diag_rank[vi][vj] = -1; } } } memory_location = hypre_StructMatrixMemoryLocation(hypre_SStructPMatrixSMatrix(A, 0, 0)); /*---------------------------------------------------------- * Allocate storage used to invert local diagonal blocks *----------------------------------------------------------*/ /* i = hypre_NumThreads(); x_loc = hypre_TAlloc(HYPRE_Real , i*nvars, memory_location); A_loc = hypre_TAlloc(HYPRE_Real , i*nvars*nvars, memory_location); */ /* Allocate pointers for vector and matrix */ bp = hypre_TAlloc(HYPRE_Real *, nvars, memory_location); xp = hypre_TAlloc(HYPRE_Real *, nvars, memory_location); tp = hypre_TAlloc(HYPRE_Real *, nvars, memory_location); Ap = hypre_TAlloc(HYPRE_Real *, nvars * nvars, memory_location); /*---------------------------------------------------------- * Set up the compute packages for each nodeset *----------------------------------------------------------*/ sgrid = hypre_StructMatrixGrid(hypre_SStructPMatrixSMatrix(A, 0, 0)); dim = hypre_StructStencilNDim(hypre_SStructPMatrixSStencil(A, 0, 0)); compute_pkgs = hypre_CTAlloc(hypre_ComputePkg *, num_nodesets, HYPRE_MEMORY_HOST); svec_compute_pkgs = hypre_CTAlloc(hypre_ComputePkg **, num_nodesets, HYPRE_MEMORY_HOST); comm_handle = hypre_CTAlloc(hypre_CommHandle *, nvars, HYPRE_MEMORY_HOST); for (p = 0; p < num_nodesets; p++) { /*---------------------------------------------------------- * Set up the compute packages to define sends and recieves * for each struct_vector (svec_compute_pkgs) and the compute * package to define independent and dependent computations * (compute_pkgs). *----------------------------------------------------------*/ svec_compute_pkgs[p] = hypre_CTAlloc(hypre_ComputePkg *, nvars, HYPRE_MEMORY_HOST); for (vi = -1; vi < nvars; vi++) { /*---------------------------------------------------------- * The first execution (vi=-1) sets up the stencil to * define independent and dependent computations. The * stencil is the "union" over i,j of all stencils for * for struct_matrix A_ij. * * Other executions (vi > -1) set up the stencil to * define sends and recieves for the struct_vector vi. * The stencil for vector i is the "union" over j of all * stencils for struct_matrix A_ji. *----------------------------------------------------------*/ sstencil_union_count = 0; if (vi == -1) { for (i = 0; i < nvars; i++) { for (vj = 0; vj < nvars; vj++) { if (hypre_SStructPMatrixSMatrix(A, vj, i) != NULL) { sstencil = hypre_SStructPMatrixSStencil(A, vj, i); sstencil_union_count += hypre_StructStencilSize(sstencil); } } } } else { for (vj = 0; vj < nvars; vj++) { if (hypre_SStructPMatrixSMatrix(A, vj, vi) != NULL) { sstencil = hypre_SStructPMatrixSStencil(A, vj, vi); sstencil_union_count += hypre_StructStencilSize(sstencil); } } } sstencil_union_shape = hypre_CTAlloc(hypre_Index, sstencil_union_count, HYPRE_MEMORY_HOST); sstencil_union_count = 0; if (vi == -1) { for (i = 0; i < nvars; i++) { for (vj = 0; vj < nvars; vj++) { if (hypre_SStructPMatrixSMatrix(A, vj, i) != NULL) { sstencil = hypre_SStructPMatrixSStencil(A, vj, i); sstencil_size = hypre_StructStencilSize(sstencil); sstencil_shape = hypre_StructStencilShape(sstencil); for (s = 0; s < sstencil_size; s++) { hypre_CopyIndex(sstencil_shape[s], sstencil_union_shape[sstencil_union_count]); sstencil_union_count++; } } } } } else { for (vj = 0; vj < nvars; vj++) { if (hypre_SStructPMatrixSMatrix(A, vj, vi) != NULL) { sstencil = hypre_SStructPMatrixSStencil(A, vj, vi); sstencil_size = hypre_StructStencilSize(sstencil); sstencil_shape = hypre_StructStencilShape(sstencil); for (s = 0; s < sstencil_size; s++) { hypre_CopyIndex(sstencil_shape[s], sstencil_union_shape[sstencil_union_count]); sstencil_union_count++; } } } } sstencil_union = hypre_StructStencilCreate(dim, sstencil_union_count, sstencil_union_shape); hypre_CreateComputeInfo(sgrid, sstencil_union, &compute_info); orig_indt_boxes = hypre_ComputeInfoIndtBoxes(compute_info); orig_dept_boxes = hypre_ComputeInfoDeptBoxes(compute_info); stride = nodeset_strides[p]; for (compute_i = 0; compute_i < 2; compute_i++) { switch (compute_i) { case 0: box_aa = orig_indt_boxes; break; case 1: box_aa = orig_dept_boxes; break; } box_aa_size = hypre_BoxArrayArraySize(box_aa); new_box_aa = hypre_BoxArrayArrayCreate(box_aa_size, ndim); for (i = 0; i < box_aa_size; i++) { box_a = hypre_BoxArrayArrayBoxArray(box_aa, i); box_a_size = hypre_BoxArraySize(box_a); new_box_a = hypre_BoxArrayArrayBoxArray(new_box_aa, i); hypre_BoxArraySetSize(new_box_a, box_a_size * nodeset_sizes[p]); k = 0; for (m = 0; m < nodeset_sizes[p]; m++) { index = nodeset_indices[p][m]; for (j = 0; j < box_a_size; j++) { box = hypre_BoxArrayBox(box_a, j); new_box = hypre_BoxArrayBox(new_box_a, k); hypre_CopyBox(box, new_box); hypre_ProjectBox(new_box, index, stride); k++; } } } switch (compute_i) { case 0: hypre_ComputeInfoIndtBoxes(compute_info) = new_box_aa; break; case 1: hypre_ComputeInfoDeptBoxes(compute_info) = new_box_aa; break; } } hypre_CopyIndex(stride, hypre_ComputeInfoStride(compute_info)); if (vi == -1) { hypre_ComputePkgCreate(compute_info, hypre_StructVectorDataSpace( hypre_SStructPVectorSVector(x, 0)), 1, sgrid, &compute_pkgs[p]); } else { hypre_ComputePkgCreate(compute_info, hypre_StructVectorDataSpace( hypre_SStructPVectorSVector(x, vi)), 1, sgrid, &svec_compute_pkgs[p][vi]); } hypre_BoxArrayArrayDestroy(orig_indt_boxes); hypre_BoxArrayArrayDestroy(orig_dept_boxes); hypre_StructStencilDestroy(sstencil_union); } } /*---------------------------------------------------------- * Set up the relax data structure *----------------------------------------------------------*/ hypre_SStructPMatrixRef(A, &(relax_data -> A)); hypre_SStructPVectorRef(x, &(relax_data -> x)); hypre_SStructPVectorRef(b, &(relax_data -> b)); (relax_data -> diag_rank) = diag_rank; /* (relax_data -> A_loc) = A_loc; (relax_data -> x_loc) = x_loc; */ (relax_data -> Ap) = Ap; (relax_data -> bp) = bp; (relax_data -> tp) = tp; (relax_data -> xp) = xp; (relax_data -> memory_location) = memory_location; (relax_data -> compute_pkgs) = compute_pkgs; (relax_data -> svec_compute_pkgs) = svec_compute_pkgs; (relax_data -> comm_handle) = comm_handle; /*----------------------------------------------------- * Compute flops *-----------------------------------------------------*/ scale = 0.0; for (p = 0; p < num_nodesets; p++) { stride = nodeset_strides[p]; frac = hypre_IndexX(stride); frac *= hypre_IndexY(stride); frac *= hypre_IndexZ(stride); scale += (nodeset_sizes[p] / frac); } /* REALLY Rough Estimate = num_nodes * nvar^3 */ (relax_data -> flops) = (HYPRE_Int)(scale * nvars * nvars * nvars * hypre_StructVectorGlobalSize( hypre_SStructPVectorSVector(x, 0) ) ); return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_NodeRelax( void *relax_vdata, hypre_SStructPMatrix *A, hypre_SStructPVector *b, hypre_SStructPVector *x ) { hypre_NodeRelaxData *relax_data = (hypre_NodeRelaxData *)relax_vdata; HYPRE_Int max_iter = (relax_data -> max_iter); HYPRE_Int zero_guess = (relax_data -> zero_guess); HYPRE_Real weight = (relax_data -> weight); HYPRE_Int num_nodesets = (relax_data -> num_nodesets); HYPRE_Int *nodeset_ranks = (relax_data -> nodeset_ranks); hypre_Index *nodeset_strides = (relax_data -> nodeset_strides); hypre_SStructPVector *t = (relax_data -> t); HYPRE_Int **diag_rank = (relax_data -> diag_rank); hypre_ComputePkg **compute_pkgs = (relax_data -> compute_pkgs); hypre_ComputePkg ***svec_compute_pkgs = (relax_data ->svec_compute_pkgs); hypre_CommHandle **comm_handle = (relax_data -> comm_handle); hypre_ComputePkg *compute_pkg; hypre_ComputePkg *svec_compute_pkg; hypre_BoxArrayArray *compute_box_aa; hypre_BoxArray *compute_box_a; hypre_Box *compute_box; hypre_Box *A_data_box; hypre_Box *b_data_box; hypre_Box *x_data_box; hypre_Box *t_data_box; /* HYPRE_Real *tA_loc = (relax_data -> A_loc); HYPRE_Real *tx_loc = (relax_data -> x_loc); */ HYPRE_Real **Ap = (relax_data -> Ap); HYPRE_Real **bp = (relax_data -> bp); HYPRE_Real **xp = (relax_data -> xp); HYPRE_Real **tp = (relax_data -> tp); HYPRE_Real *_h_Ap[HYPRE_MAXVARS * HYPRE_MAXVARS]; HYPRE_Real *_h_bp[HYPRE_MAXVARS]; HYPRE_Real *_h_xp[HYPRE_MAXVARS]; HYPRE_Real *_h_tp[HYPRE_MAXVARS]; HYPRE_Real **h_Ap; HYPRE_Real **h_bp; HYPRE_Real **h_xp; HYPRE_Real **h_tp; HYPRE_MemoryLocation memory_location = relax_data -> memory_location; /* Ap, bp, xp, tp are device pointers */ if (hypre_GetExecPolicy1(memory_location) == HYPRE_EXEC_DEVICE) { h_Ap = _h_Ap; h_bp = _h_bp; h_xp = _h_xp; h_tp = _h_tp; } else { h_Ap = Ap; h_bp = bp; h_xp = xp; h_tp = tp; } hypre_StructMatrix *A_block; hypre_StructVector *x_block; hypre_IndexRef stride; hypre_IndexRef start; hypre_Index loop_size; hypre_StructStencil *stencil; hypre_Index *stencil_shape; HYPRE_Int stencil_size; HYPRE_Int iter, p, compute_i, i, j, si; HYPRE_Int nodeset; HYPRE_Int nvars, ndim; HYPRE_Int vi, vj; /*---------------------------------------------------------- * Initialize some things and deal with special cases *----------------------------------------------------------*/ hypre_BeginTiming(relax_data -> time_index); hypre_SStructPMatrixDestroy(relax_data -> A); hypre_SStructPVectorDestroy(relax_data -> b); hypre_SStructPVectorDestroy(relax_data -> x); hypre_SStructPMatrixRef(A, &(relax_data -> A)); hypre_SStructPVectorRef(x, &(relax_data -> x)); hypre_SStructPVectorRef(b, &(relax_data -> b)); (relax_data -> num_iterations) = 0; /* if max_iter is zero, return */ if (max_iter == 0) { /* if using a zero initial guess, return zero */ if (zero_guess) { hypre_SStructPVectorSetConstantValues(x, 0.0); } hypre_EndTiming(relax_data -> time_index); return hypre_error_flag; } /*---------------------------------------------------------- * Do zero_guess iteration *----------------------------------------------------------*/ p = 0; iter = 0; nvars = hypre_SStructPMatrixNVars(relax_data -> A); ndim = hypre_SStructPMatrixNDim(relax_data -> A); if (zero_guess) { if (num_nodesets > 1) { hypre_SStructPVectorSetConstantValues(x, 0.0); } nodeset = nodeset_ranks[p]; compute_pkg = compute_pkgs[nodeset]; stride = nodeset_strides[nodeset]; for (compute_i = 0; compute_i < 2; compute_i++) { switch (compute_i) { case 0: { compute_box_aa = hypre_ComputePkgIndtBoxes(compute_pkg); } break; case 1: { compute_box_aa = hypre_ComputePkgDeptBoxes(compute_pkg); } break; } hypre_ForBoxArrayI(i, compute_box_aa) { compute_box_a = hypre_BoxArrayArrayBoxArray(compute_box_aa, i); A_data_box = hypre_BoxArrayBox(hypre_StructMatrixDataSpace( hypre_SStructPMatrixSMatrix(A, 0, 0)), i); b_data_box = hypre_BoxArrayBox(hypre_StructVectorDataSpace( hypre_SStructPVectorSVector(b, 0)), i); x_data_box = hypre_BoxArrayBox(hypre_StructVectorDataSpace( hypre_SStructPVectorSVector(x, 0)), i); for (vi = 0; vi < nvars; vi++) { for (vj = 0; vj < nvars; vj++) { if (hypre_SStructPMatrixSMatrix(A, vi, vj) != NULL) { h_Ap[vi * nvars + vj] = hypre_StructMatrixBoxData( hypre_SStructPMatrixSMatrix(A, vi, vj), i, diag_rank[vi][vj] ); } else { h_Ap[vi * nvars + vj] = NULL; } } h_bp[vi] = hypre_StructVectorBoxData( hypre_SStructPVectorSVector(b, vi), i ); h_xp[vi] = hypre_StructVectorBoxData( hypre_SStructPVectorSVector(x, vi), i ); } if (hypre_GetExecPolicy1(memory_location) == HYPRE_EXEC_DEVICE) { hypre_TMemcpy(Ap, h_Ap, HYPRE_Real *, nvars * nvars, memory_location, HYPRE_MEMORY_HOST); hypre_TMemcpy(bp, h_bp, HYPRE_Real *, nvars, memory_location, HYPRE_MEMORY_HOST); hypre_TMemcpy(xp, h_xp, HYPRE_Real *, nvars, memory_location, HYPRE_MEMORY_HOST); } hypre_ForBoxI(j, compute_box_a) { compute_box = hypre_BoxArrayBox(compute_box_a, j); start = hypre_BoxIMin(compute_box); hypre_BoxGetStrideSize(compute_box, stride, loop_size); #define DEVICE_VAR is_device_ptr(bp,Ap,xp) hypre_BoxLoop3Begin(ndim, loop_size, A_data_box, start, stride, Ai, b_data_box, start, stride, bi, x_data_box, start, stride, xi); { HYPRE_Int vi, vj, err; //HYPRE_Real *A_loc = tA_loc + hypre_BoxLoopBlock() * nvars * nvars; //HYPRE_Real *x_loc = tx_loc + hypre_BoxLoopBlock() * nvars; HYPRE_Real A_loc[HYPRE_MAXVARS * HYPRE_MAXVARS] = {0}; HYPRE_Real x_loc[HYPRE_MAXVARS] = {0}; /*------------------------------------------------ * Copy rhs and matrix for diagonal coupling * (intra-nodal) into local storage. *----------------------------------------------*/ for (vi = 0; vi < nvars; vi++) { HYPRE_Real *bpi = bp[vi]; x_loc[vi] = bpi[bi]; for (vj = 0; vj < nvars; vj++) { HYPRE_Real *Apij = Ap[vi * nvars + vj]; A_loc[vi * nvars + vj] = Apij ? Apij[Ai] : 0.0; } } /*------------------------------------------------ * Invert intra-nodal coupling *----------------------------------------------*/ hypre_gselim(A_loc, x_loc, nvars, err); (void) err; /* TODO (VPM): need a way to check error codes on device */ /*------------------------------------------------ * Copy solution from local storage. *----------------------------------------------*/ for (vi = 0; vi < nvars; vi++) { HYPRE_Real *xpi = xp[vi]; xpi[xi] = x_loc[vi]; } } hypre_BoxLoop3End(Ai, bi, xi); #undef DEVICE_VAR } } } if (weight != 1.0) { hypre_SStructPScale(weight, x); } p = (p + 1) % num_nodesets; iter = iter + (p == 0); } /*---------------------------------------------------------- * Do regular iterations *----------------------------------------------------------*/ while (iter < max_iter) { nodeset = nodeset_ranks[p]; compute_pkg = compute_pkgs[nodeset]; stride = nodeset_strides[nodeset]; hypre_SStructPCopy(x, t); for (compute_i = 0; compute_i < 2; compute_i++) { switch (compute_i) { case 0: { for (vi = 0; vi < nvars; vi++) { x_block = hypre_SStructPVectorSVector(x, vi); h_xp[vi] = hypre_StructVectorData(x_block); svec_compute_pkg = svec_compute_pkgs[nodeset][vi]; hypre_InitializeIndtComputations(svec_compute_pkg, h_xp[vi], &comm_handle[vi]); } compute_box_aa = hypre_ComputePkgIndtBoxes(compute_pkg); } break; case 1: { for (vi = 0; vi < nvars; vi++) { hypre_FinalizeIndtComputations(comm_handle[vi]); } compute_box_aa = hypre_ComputePkgDeptBoxes(compute_pkg); } break; } hypre_ForBoxArrayI(i, compute_box_aa) { compute_box_a = hypre_BoxArrayArrayBoxArray(compute_box_aa, i); A_data_box = hypre_BoxArrayBox( hypre_StructMatrixDataSpace( hypre_SStructPMatrixSMatrix(A, 0, 0)), i ); b_data_box = hypre_BoxArrayBox( hypre_StructVectorDataSpace( hypre_SStructPVectorSVector(b, 0)), i ); x_data_box = hypre_BoxArrayBox( hypre_StructVectorDataSpace( hypre_SStructPVectorSVector(x, 0)), i ); t_data_box = hypre_BoxArrayBox( hypre_StructVectorDataSpace( hypre_SStructPVectorSVector(t, 0)), i ); for (vi = 0; vi < nvars; vi++) { h_bp[vi] = hypre_StructVectorBoxData( hypre_SStructPVectorSVector(b, vi), i ); h_tp[vi] = hypre_StructVectorBoxData( hypre_SStructPVectorSVector(t, vi), i ); } if (hypre_GetExecPolicy1(memory_location) == HYPRE_EXEC_DEVICE) { hypre_TMemcpy(bp, h_bp, HYPRE_Real *, nvars, memory_location, HYPRE_MEMORY_HOST); hypre_TMemcpy(tp, h_tp, HYPRE_Real *, nvars, memory_location, HYPRE_MEMORY_HOST); } hypre_ForBoxI(j, compute_box_a) { compute_box = hypre_BoxArrayBox(compute_box_a, j); start = hypre_BoxIMin(compute_box); hypre_BoxGetStrideSize(compute_box, stride, loop_size); #define DEVICE_VAR is_device_ptr(tp,bp) hypre_BoxLoop2Begin(ndim, loop_size, b_data_box, start, stride, bi, t_data_box, start, stride, ti); { HYPRE_Int vi; /* Copy rhs into temp vector */ for (vi = 0; vi < nvars; vi++) { HYPRE_Real *tpi = tp[vi]; HYPRE_Real *bpi = bp[vi]; tpi[ti] = bpi[bi]; } } hypre_BoxLoop2End(bi, ti); #undef DEVICE_VAR for (vi = 0; vi < nvars; vi++) { for (vj = 0; vj < nvars; vj++) { if (hypre_SStructPMatrixSMatrix(A, vi, vj) != NULL) { A_block = hypre_SStructPMatrixSMatrix(A, vi, vj); x_block = hypre_SStructPVectorSVector(x, vj); stencil = hypre_StructMatrixStencil(A_block); stencil_shape = hypre_StructStencilShape(stencil); stencil_size = hypre_StructStencilSize(stencil); for (si = 0; si < stencil_size; si++) { if (si != diag_rank[vi][vj]) { HYPRE_Real *Apij = hypre_StructMatrixBoxData(A_block, i, si); HYPRE_Real *xpj = hypre_StructVectorBoxData(x_block, i) + hypre_BoxOffsetDistance(x_data_box, stencil_shape[si]); HYPRE_Real *tpi = h_tp[vi]; #define DEVICE_VAR is_device_ptr(tpi,Apij,xpj) hypre_BoxLoop3Begin(ndim, loop_size, A_data_box, start, stride, Ai, x_data_box, start, stride, xi, t_data_box, start, stride, ti); { tpi[ti] -= Apij[Ai] * xpj[xi]; } hypre_BoxLoop3End(Ai, xi, ti); #undef DEVICE_VAR } } } } } for (vi = 0; vi < nvars; vi++) { for (vj = 0; vj < nvars; vj++) { if (hypre_SStructPMatrixSMatrix(A, vi, vj) != NULL) { h_Ap[vi * nvars + vj] = hypre_StructMatrixBoxData( hypre_SStructPMatrixSMatrix(A, vi, vj), i, diag_rank[vi][vj]); } else { h_Ap[vi * nvars + vj] = NULL; } } } if (hypre_GetExecPolicy1(memory_location) == HYPRE_EXEC_DEVICE) { hypre_TMemcpy(Ap, h_Ap, HYPRE_Real *, nvars * nvars, memory_location, HYPRE_MEMORY_HOST); } #define DEVICE_VAR is_device_ptr(tp,Ap) hypre_BoxLoop2Begin(ndim, loop_size, A_data_box, start, stride, Ai, t_data_box, start, stride, ti); { HYPRE_Int vi, vj, err; /* HYPRE_Real *A_loc = tA_loc + hypre_BoxLoopBlock() * nvars * nvars; HYPRE_Real *x_loc = tx_loc + hypre_BoxLoopBlock() * nvars; */ HYPRE_Real A_loc[HYPRE_MAXVARS * HYPRE_MAXVARS] = {0}; HYPRE_Real x_loc[HYPRE_MAXVARS] = {0}; /*------------------------------------------------ * Copy rhs and matrix for diagonal coupling * (intra-nodal) into local storage. *----------------------------------------------*/ for (vi = 0; vi < nvars; vi++) { HYPRE_Real *tpi = tp[vi]; x_loc[vi] = tpi[ti]; for (vj = 0; vj < nvars; vj++) { HYPRE_Real *Apij = Ap[vi * nvars + vj]; A_loc[vi * nvars + vj] = Apij ? Apij[Ai] : 0.0; } } /*------------------------------------------------ * Invert intra-nodal coupling *----------------------------------------------*/ hypre_gselim(A_loc, x_loc, nvars, err); (void) err; /*------------------------------------------------ * Copy solution from local storage. *----------------------------------------------*/ for (vi = 0; vi < nvars; vi++) { HYPRE_Real *tpi = tp[vi]; tpi[ti] = x_loc[vi]; } } hypre_BoxLoop2End(Ai, ti); #undef DEVICE_VAR } } } if (weight != 1.0) { hypre_SStructPScale((1.0 - weight), x); hypre_SStructPAxpy(weight, t, x); } else { hypre_SStructPCopy(t, x); } p = (p + 1) % num_nodesets; iter = iter + (p == 0); } (relax_data -> num_iterations) = iter; /*----------------------------------------------------------------------- * Return *-----------------------------------------------------------------------*/ hypre_IncFLOPCount(relax_data -> flops); hypre_EndTiming(relax_data -> time_index); return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_NodeRelaxSetTol( void *relax_vdata, HYPRE_Real tol ) { hypre_NodeRelaxData *relax_data = (hypre_NodeRelaxData *)relax_vdata; (relax_data -> tol) = tol; return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_NodeRelaxSetMaxIter( void *relax_vdata, HYPRE_Int max_iter ) { hypre_NodeRelaxData *relax_data = (hypre_NodeRelaxData *)relax_vdata; (relax_data -> max_iter) = max_iter; return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_NodeRelaxSetZeroGuess( void *relax_vdata, HYPRE_Int zero_guess ) { hypre_NodeRelaxData *relax_data = (hypre_NodeRelaxData *)relax_vdata; (relax_data -> zero_guess) = zero_guess; return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_NodeRelaxSetWeight( void *relax_vdata, HYPRE_Real weight ) { hypre_NodeRelaxData *relax_data = (hypre_NodeRelaxData *)relax_vdata; (relax_data -> weight) = weight; return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_NodeRelaxSetNumNodesets( void *relax_vdata, HYPRE_Int num_nodesets ) { hypre_NodeRelaxData *relax_data = (hypre_NodeRelaxData *)relax_vdata; HYPRE_Int i; /* free up old nodeset memory */ for (i = 0; i < (relax_data -> num_nodesets); i++) { hypre_TFree(relax_data -> nodeset_indices[i], HYPRE_MEMORY_HOST); } hypre_TFree(relax_data -> nodeset_sizes, HYPRE_MEMORY_HOST); hypre_TFree(relax_data -> nodeset_ranks, HYPRE_MEMORY_HOST); hypre_TFree(relax_data -> nodeset_strides, HYPRE_MEMORY_HOST); hypre_TFree(relax_data -> nodeset_indices, HYPRE_MEMORY_HOST); /* alloc new nodeset memory */ (relax_data -> num_nodesets) = num_nodesets; (relax_data -> nodeset_sizes) = hypre_TAlloc(HYPRE_Int, num_nodesets, HYPRE_MEMORY_HOST); (relax_data -> nodeset_ranks) = hypre_TAlloc(HYPRE_Int, num_nodesets, HYPRE_MEMORY_HOST); (relax_data -> nodeset_strides) = hypre_TAlloc(hypre_Index, num_nodesets, HYPRE_MEMORY_HOST); (relax_data -> nodeset_indices) = hypre_TAlloc(hypre_Index *, num_nodesets, HYPRE_MEMORY_HOST); for (i = 0; i < num_nodesets; i++) { (relax_data -> nodeset_sizes[i]) = 0; (relax_data -> nodeset_ranks[i]) = i; (relax_data -> nodeset_indices[i]) = NULL; } return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_NodeRelaxSetNodeset( void *relax_vdata, HYPRE_Int nodeset, HYPRE_Int nodeset_size, hypre_Index nodeset_stride, hypre_Index *nodeset_indices ) { hypre_NodeRelaxData *relax_data = (hypre_NodeRelaxData *)relax_vdata; HYPRE_Int i; /* free up old nodeset memory */ hypre_TFree(relax_data -> nodeset_indices[nodeset], HYPRE_MEMORY_HOST); /* alloc new nodeset memory */ (relax_data -> nodeset_indices[nodeset]) = hypre_TAlloc(hypre_Index, nodeset_size, HYPRE_MEMORY_HOST); (relax_data -> nodeset_sizes[nodeset]) = nodeset_size; hypre_CopyIndex(nodeset_stride, (relax_data -> nodeset_strides[nodeset])); for (i = 0; i < nodeset_size; i++) { hypre_CopyIndex(nodeset_indices[i], (relax_data -> nodeset_indices[nodeset][i])); } return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_NodeRelaxSetNodesetRank( void *relax_vdata, HYPRE_Int nodeset, HYPRE_Int nodeset_rank ) { hypre_NodeRelaxData *relax_data = (hypre_NodeRelaxData *)relax_vdata; (relax_data -> nodeset_ranks[nodeset]) = nodeset_rank; return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_NodeRelaxSetTempVec( void *relax_vdata, hypre_SStructPVector *t ) { hypre_NodeRelaxData *relax_data = (hypre_NodeRelaxData *)relax_vdata; hypre_SStructPVectorDestroy(relax_data -> t); hypre_SStructPVectorRef(t, &(relax_data -> t)); return hypre_error_flag; } hypre-2.33.0/src/sstruct_ls/sstruct_amr_intercommunication.c000066400000000000000000000100701477326011500244270ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "_hypre_sstruct_ls.h" /*-------------------------------------------------------------------------- * hypre_SStructAMRInterCommunication: Given the sendinfo, recvinfo, etc., * a communication pkg is formed. This pkg may be used for amr inter_level * communication. *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SStructAMRInterCommunication( hypre_SStructSendInfoData *sendinfo, hypre_SStructRecvInfoData *recvinfo, hypre_BoxArray *send_data_space, hypre_BoxArray *recv_data_space, HYPRE_Int num_values, MPI_Comm comm, hypre_CommPkg **comm_pkg_ptr ) { hypre_CommInfo *comm_info; hypre_CommPkg *comm_pkg; hypre_BoxArrayArray *sendboxes; HYPRE_Int **sprocesses; hypre_BoxArrayArray *send_rboxes; HYPRE_Int **send_rboxnums; hypre_BoxArrayArray *recvboxes; HYPRE_Int **rprocesses; hypre_BoxArrayArray *recv_rboxes; HYPRE_Int **recv_rboxnums; hypre_BoxArray *boxarray; HYPRE_Int i, j; HYPRE_Int ierr = 0; /*------------------------------------------------------------------------ * The communication info is copied from sendinfo & recvinfo. *------------------------------------------------------------------------*/ sendboxes = hypre_BoxArrayArrayDuplicate(sendinfo -> send_boxes); send_rboxes = hypre_BoxArrayArrayDuplicate(sendinfo -> send_boxes); sprocesses = hypre_CTAlloc(HYPRE_Int *, hypre_BoxArrayArraySize(send_rboxes), HYPRE_MEMORY_HOST); send_rboxnums = hypre_CTAlloc(HYPRE_Int *, hypre_BoxArrayArraySize(send_rboxes), HYPRE_MEMORY_HOST); hypre_ForBoxArrayI(i, sendboxes) { boxarray = hypre_BoxArrayArrayBoxArray(sendboxes, i); sprocesses[i] = hypre_CTAlloc(HYPRE_Int, hypre_BoxArraySize(boxarray), HYPRE_MEMORY_HOST); send_rboxnums[i] = hypre_CTAlloc(HYPRE_Int, hypre_BoxArraySize(boxarray), HYPRE_MEMORY_HOST); hypre_ForBoxI(j, boxarray) { sprocesses[i][j] = (sendinfo -> send_procs)[i][j]; send_rboxnums[i][j] = (sendinfo -> send_remote_boxnums)[i][j]; } } recvboxes = hypre_BoxArrayArrayDuplicate(recvinfo -> recv_boxes); recv_rboxes = hypre_BoxArrayArrayDuplicate(recvinfo -> recv_boxes); rprocesses = hypre_CTAlloc(HYPRE_Int *, hypre_BoxArrayArraySize(recvboxes), HYPRE_MEMORY_HOST); /* dummy pointer for CommInfoCreate */ recv_rboxnums = hypre_CTAlloc(HYPRE_Int *, hypre_BoxArrayArraySize(recvboxes), HYPRE_MEMORY_HOST); hypre_ForBoxArrayI(i, recvboxes) { boxarray = hypre_BoxArrayArrayBoxArray(recvboxes, i); rprocesses[i] = hypre_CTAlloc(HYPRE_Int, hypre_BoxArraySize(boxarray), HYPRE_MEMORY_HOST); recv_rboxnums[i] = hypre_CTAlloc(HYPRE_Int, hypre_BoxArraySize(boxarray), HYPRE_MEMORY_HOST); hypre_ForBoxI(j, boxarray) { rprocesses[i][j] = (recvinfo -> recv_procs)[i][j]; } } hypre_CommInfoCreate(sendboxes, recvboxes, sprocesses, rprocesses, send_rboxnums, recv_rboxnums, send_rboxes, recv_rboxes, 1, &comm_info); hypre_CommPkgCreate(comm_info, send_data_space, recv_data_space, num_values, NULL, 0, comm, &comm_pkg); hypre_CommInfoDestroy(comm_info); *comm_pkg_ptr = comm_pkg; return ierr; } hypre-2.33.0/src/sstruct_ls/sstruct_owninfo.c000066400000000000000000000232411477326011500213440ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "_hypre_sstruct_ls.h" HYPRE_Int hypre_SStructIndexScaleF_C( hypre_Index findex, hypre_Index index, hypre_Index stride, hypre_Index cindex ) { hypre_IndexX(cindex) = (hypre_IndexX(findex) - hypre_IndexX(index)) / hypre_IndexX(stride); hypre_IndexY(cindex) = (hypre_IndexY(findex) - hypre_IndexY(index)) / hypre_IndexY(stride); hypre_IndexZ(cindex) = (hypre_IndexZ(findex) - hypre_IndexZ(index)) / hypre_IndexZ(stride); return 0; } HYPRE_Int hypre_SStructIndexScaleC_F( hypre_Index cindex, hypre_Index index, hypre_Index stride, hypre_Index findex ) { hypre_IndexX(findex) = hypre_IndexX(cindex) * hypre_IndexX(stride) + hypre_IndexX(index); hypre_IndexY(findex) = hypre_IndexY(cindex) * hypre_IndexY(stride) + hypre_IndexY(index); hypre_IndexZ(findex) = hypre_IndexZ(cindex) * hypre_IndexZ(stride) + hypre_IndexZ(index); return 0; } /*-------------------------------------------------------------------------- * hypre_SStructOwnInfo: Given a fgrid, coarsen each fbox and find the * coarsened boxes that belong on my current processor. These are my own_boxes. *--------------------------------------------------------------------------*/ hypre_SStructOwnInfoData * hypre_SStructOwnInfo( hypre_StructGrid *fgrid, hypre_StructGrid *cgrid, hypre_BoxManager *cboxman, hypre_BoxManager *fboxman, hypre_Index rfactor ) { hypre_SStructOwnInfoData *owninfo_data; MPI_Comm comm = hypre_SStructVectorComm(fgrid); HYPRE_Int ndim = hypre_StructGridNDim(fgrid); hypre_BoxArray *grid_boxes; hypre_BoxArray *intersect_boxes; hypre_BoxArray *tmp_boxarray; hypre_Box *grid_box, scaled_box; hypre_Box boxman_entry_box; hypre_BoxManEntry **boxman_entries; HYPRE_Int nboxman_entries; hypre_BoxArrayArray *own_boxes; HYPRE_Int **own_cboxnums; hypre_BoxArrayArray *own_composite_cboxes; hypre_Index ilower, iupper, index; HYPRE_Int myproc, proc; HYPRE_Int cnt; HYPRE_Int i, j, k, mod; hypre_BoxInit(&scaled_box, ndim); hypre_BoxInit(&boxman_entry_box, ndim); hypre_ClearIndex(index); hypre_MPI_Comm_rank(comm, &myproc); owninfo_data = hypre_CTAlloc(hypre_SStructOwnInfoData, 1, HYPRE_MEMORY_HOST); /*------------------------------------------------------------------------ * Create the structured ownbox patterns. * * own_boxes are obtained by intersecting this proc's fgrid boxes * with cgrid's box_man. Intersecting BoxManEntries on this proc * will give the own_boxes. *------------------------------------------------------------------------*/ grid_boxes = hypre_StructGridBoxes(fgrid); own_boxes = hypre_BoxArrayArrayCreate(hypre_BoxArraySize(grid_boxes), ndim); own_cboxnums = hypre_CTAlloc(HYPRE_Int *, hypre_BoxArraySize(grid_boxes), HYPRE_MEMORY_HOST); hypre_ForBoxI(i, grid_boxes) { grid_box = hypre_BoxArrayBox(grid_boxes, i); /*--------------------------------------------------------------------- * Find the boxarray that is owned. BoxManIntersect returns * the full extents of the boxes that intersect with the given box. * We further need to intersect each box in the list with the given * box to determine the actual box that is owned. *---------------------------------------------------------------------*/ hypre_SStructIndexScaleF_C(hypre_BoxIMin(grid_box), index, rfactor, hypre_BoxIMin(&scaled_box)); hypre_SStructIndexScaleF_C(hypre_BoxIMax(grid_box), index, rfactor, hypre_BoxIMax(&scaled_box)); hypre_BoxManIntersect(cboxman, hypre_BoxIMin(&scaled_box), hypre_BoxIMax(&scaled_box), &boxman_entries, &nboxman_entries); cnt = 0; for (j = 0; j < nboxman_entries; j++) { hypre_SStructBoxManEntryGetProcess(boxman_entries[j], &proc); if (proc == myproc) { cnt++; } } own_cboxnums[i] = hypre_CTAlloc(HYPRE_Int, cnt, HYPRE_MEMORY_HOST); cnt = 0; for (j = 0; j < nboxman_entries; j++) { hypre_SStructBoxManEntryGetProcess(boxman_entries[j], &proc); /* determine the chunk of the boxman_entries[j] box that is needed */ hypre_BoxManEntryGetExtents(boxman_entries[j], ilower, iupper); hypre_BoxSetExtents(&boxman_entry_box, ilower, iupper); hypre_IntersectBoxes(&boxman_entry_box, &scaled_box, &boxman_entry_box); if (proc == myproc) { hypre_SStructBoxManEntryGetBoxnum(boxman_entries[j], &own_cboxnums[i][cnt]); hypre_AppendBox(&boxman_entry_box, hypre_BoxArrayArrayBoxArray(own_boxes, i)); cnt++; } } hypre_TFree(boxman_entries, HYPRE_MEMORY_HOST); } /* hypre_ForBoxI(i, grid_boxes) */ (owninfo_data -> size) = hypre_BoxArraySize(grid_boxes); (owninfo_data -> own_boxes) = own_boxes; (owninfo_data -> own_cboxnums) = own_cboxnums; /*------------------------------------------------------------------------ * own_composite_cboxes are obtained by intersecting this proc's cgrid * boxes with fgrid's box_man. For each cbox, subtracting all the * intersecting boxes from all processors will give the * own_composite_cboxes. *------------------------------------------------------------------------*/ grid_boxes = hypre_StructGridBoxes(cgrid); own_composite_cboxes = hypre_BoxArrayArrayCreate(hypre_BoxArraySize(grid_boxes), ndim); (owninfo_data -> own_composite_size) = hypre_BoxArraySize(grid_boxes); tmp_boxarray = hypre_BoxArrayCreate(0, ndim); hypre_ForBoxI(i, grid_boxes) { grid_box = hypre_BoxArrayBox(grid_boxes, i); hypre_AppendBox(grid_box, hypre_BoxArrayArrayBoxArray(own_composite_cboxes, i)); hypre_ClearIndex(index); hypre_SStructIndexScaleC_F(hypre_BoxIMin(grid_box), index, rfactor, hypre_BoxIMin(&scaled_box)); hypre_SetIndex3(index, rfactor[0] - 1, rfactor[1] - 1, rfactor[2] - 1); hypre_SStructIndexScaleC_F(hypre_BoxIMax(grid_box), index, rfactor, hypre_BoxIMax(&scaled_box)); hypre_BoxManIntersect(fboxman, hypre_BoxIMin(&scaled_box), hypre_BoxIMax(&scaled_box), &boxman_entries, &nboxman_entries); hypre_ClearIndex(index); intersect_boxes = hypre_BoxArrayCreate(0, ndim); for (j = 0; j < nboxman_entries; j++) { hypre_BoxManEntryGetExtents(boxman_entries[j], ilower, iupper); hypre_BoxSetExtents(&boxman_entry_box, ilower, iupper); hypre_IntersectBoxes(&boxman_entry_box, &scaled_box, &boxman_entry_box); /* contract the intersection box so that only the cnodes in the intersection box are included. */ for (k = 0; k < ndim; k++) { mod = hypre_BoxIMin(&boxman_entry_box)[k] % rfactor[k]; if (mod) { hypre_BoxIMin(&boxman_entry_box)[k] += rfactor[k] - mod; } } hypre_SStructIndexScaleF_C(hypre_BoxIMin(&boxman_entry_box), index, rfactor, hypre_BoxIMin(&boxman_entry_box)); hypre_SStructIndexScaleF_C(hypre_BoxIMax(&boxman_entry_box), index, rfactor, hypre_BoxIMax(&boxman_entry_box)); hypre_AppendBox(&boxman_entry_box, intersect_boxes); } hypre_SubtractBoxArrays(hypre_BoxArrayArrayBoxArray(own_composite_cboxes, i), intersect_boxes, tmp_boxarray); hypre_MinUnionBoxes(hypre_BoxArrayArrayBoxArray(own_composite_cboxes, i)); hypre_TFree(boxman_entries, HYPRE_MEMORY_HOST); hypre_BoxArrayDestroy(intersect_boxes); } hypre_BoxArrayDestroy(tmp_boxarray); (owninfo_data -> own_composite_cboxes) = own_composite_cboxes; return owninfo_data; } /*-------------------------------------------------------------------------- * hypre_SStructOwnInfoDataDestroy *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SStructOwnInfoDataDestroy(hypre_SStructOwnInfoData *owninfo_data) { HYPRE_Int ierr = 0; HYPRE_Int i; if (owninfo_data) { if (owninfo_data -> own_boxes) { hypre_BoxArrayArrayDestroy( (owninfo_data -> own_boxes) ); } for (i = 0; i < (owninfo_data -> size); i++) { if (owninfo_data -> own_cboxnums[i]) { hypre_TFree(owninfo_data -> own_cboxnums[i], HYPRE_MEMORY_HOST); } } hypre_TFree(owninfo_data -> own_cboxnums, HYPRE_MEMORY_HOST); if (owninfo_data -> own_composite_cboxes) { hypre_BoxArrayArrayDestroy( (owninfo_data -> own_composite_cboxes) ); } } hypre_TFree(owninfo_data, HYPRE_MEMORY_HOST); return ierr; } hypre-2.33.0/src/sstruct_ls/sstruct_owninfo.h000066400000000000000000000035351477326011500213550ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /*-------------------------------------------------------------------------- * hypre_SStructOwnInfo data structure * This structure is for the coarsen fboxes that are on this processor, * and the cboxes of cgrid/(all coarsened fboxes) on this processor (i.e., * the coarse boxes of the composite cgrid (no underlying) on this processor). *--------------------------------------------------------------------------*/ #ifndef hypre_OWNINFODATA_HEADER #define hypre_OWNINFODATA_HEADER typedef struct { HYPRE_Int size; hypre_BoxArrayArray *own_boxes; /* size of fgrid */ HYPRE_Int **own_cboxnums; /* local cbox number- each fbox leads to an array of cboxes */ hypre_BoxArrayArray *own_composite_cboxes; /* size of cgrid */ HYPRE_Int own_composite_size; } hypre_SStructOwnInfoData; /*-------------------------------------------------------------------------- * Accessor macros: hypre_SStructOwnInfoData; *--------------------------------------------------------------------------*/ #define hypre_SStructOwnInfoDataSize(own_data) ((own_data) -> size) #define hypre_SStructOwnInfoDataOwnBoxes(own_data) ((own_data) -> own_boxes) #define hypre_SStructOwnInfoDataOwnBoxNums(own_data) \ ((own_data) -> own_cboxnums) #define hypre_SStructOwnInfoDataCompositeCBoxes(own_data) \ ((own_data) -> own_composite_cboxes) #define hypre_SStructOwnInfoDataCompositeSize(own_data) \ ((own_data) -> own_composite_size) #endif hypre-2.33.0/src/sstruct_ls/sstruct_recvinfo.c000066400000000000000000000131701477326011500215000ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "_hypre_sstruct_ls.h" /*-------------------------------------------------------------------------- * hypre_SStructRecvInfo: For each processor, for each cbox of its cgrid, * refine it and find out which processors owe this cbox. Coarsen these * fine recv boxes and store them. *--------------------------------------------------------------------------*/ hypre_SStructRecvInfoData * hypre_SStructRecvInfo( hypre_StructGrid *cgrid, hypre_BoxManager *fboxman, hypre_Index rfactor ) { hypre_SStructRecvInfoData *recvinfo_data; MPI_Comm comm = hypre_StructGridComm(cgrid); HYPRE_Int ndim = hypre_StructGridNDim(cgrid); hypre_BoxArray *grid_boxes; hypre_Box *grid_box, fbox; hypre_Box *intersect_box, boxman_entry_box; hypre_BoxManEntry **boxman_entries; HYPRE_Int nboxman_entries; hypre_BoxArrayArray *recv_boxes; HYPRE_Int **recv_processes; hypre_Index ilower, iupper, index1, index2; HYPRE_Int myproc, proc; HYPRE_Int cnt; HYPRE_Int i, j; hypre_BoxInit(&fbox, ndim); hypre_BoxInit(&boxman_entry_box, ndim); hypre_ClearIndex(index1); hypre_SetIndex3(index2, rfactor[0] - 1, rfactor[1] - 1, rfactor[2] - 1); hypre_MPI_Comm_rank(comm, &myproc); recvinfo_data = hypre_CTAlloc(hypre_SStructRecvInfoData, 1, HYPRE_MEMORY_HOST); /*------------------------------------------------------------------------ * Create the structured recvbox patterns. * recv_boxes are obtained by intersecting this proc's cgrid boxes * with the fine fboxman. Intersecting BoxManEntries not on this proc * will give the boxes that we will be receiving some data from. To * get the exact receiving box extents, we need to take an intersection. * Since only coarse data is communicated, these intersection boxes * must be coarsened. *------------------------------------------------------------------------*/ intersect_box = hypre_BoxCreate(ndim); grid_boxes = hypre_StructGridBoxes(cgrid); recv_boxes = hypre_BoxArrayArrayCreate(hypre_BoxArraySize(grid_boxes), ndim); recv_processes = hypre_CTAlloc(HYPRE_Int *, hypre_BoxArraySize(grid_boxes), HYPRE_MEMORY_HOST); hypre_ForBoxI(i, grid_boxes) { grid_box = hypre_BoxArrayBox(grid_boxes, i); hypre_SStructIndexScaleC_F(hypre_BoxIMin(grid_box), index1, rfactor, hypre_BoxIMin(&fbox)); hypre_SStructIndexScaleC_F(hypre_BoxIMax(grid_box), index2, rfactor, hypre_BoxIMax(&fbox)); hypre_BoxManIntersect(fboxman, hypre_BoxIMin(&fbox), hypre_BoxIMax(&fbox), &boxman_entries, &nboxman_entries); cnt = 0; for (j = 0; j < nboxman_entries; j++) { hypre_SStructBoxManEntryGetProcess(boxman_entries[j], &proc); if (proc != myproc) { cnt++; } } recv_processes[i] = hypre_CTAlloc(HYPRE_Int, cnt, HYPRE_MEMORY_HOST); cnt = 0; for (j = 0; j < nboxman_entries; j++) { hypre_SStructBoxManEntryGetProcess(boxman_entries[j], &proc); /* determine the chunk of the boxman_entries[j] box that is needed */ hypre_BoxManEntryGetExtents(boxman_entries[j], ilower, iupper); hypre_BoxSetExtents(&boxman_entry_box, ilower, iupper); hypre_IntersectBoxes(&boxman_entry_box, &fbox, &boxman_entry_box); if (proc != myproc) { recv_processes[i][cnt] = proc; hypre_SStructIndexScaleF_C(hypre_BoxIMin(&boxman_entry_box), index1, rfactor, hypre_BoxIMin(&boxman_entry_box)); hypre_SStructIndexScaleF_C(hypre_BoxIMax(&boxman_entry_box), index1, rfactor, hypre_BoxIMax(&boxman_entry_box)); hypre_AppendBox(&boxman_entry_box, hypre_BoxArrayArrayBoxArray(recv_boxes, i)); cnt++; } } hypre_TFree(boxman_entries, HYPRE_MEMORY_HOST); } /* hypre_ForBoxI(i, grid_boxes) */ hypre_BoxDestroy(intersect_box); (recvinfo_data -> size) = hypre_BoxArraySize(grid_boxes); (recvinfo_data -> recv_boxes) = recv_boxes; (recvinfo_data -> recv_procs) = recv_processes; return recvinfo_data; } /*-------------------------------------------------------------------------- * hypre_SStructRecvInfoDataDestroy *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SStructRecvInfoDataDestroy(hypre_SStructRecvInfoData *recvinfo_data) { HYPRE_Int ierr = 0; HYPRE_Int i; if (recvinfo_data) { if (recvinfo_data -> recv_boxes) { hypre_BoxArrayArrayDestroy( (recvinfo_data -> recv_boxes) ); } for (i = 0; i < (recvinfo_data -> size); i++) { if (recvinfo_data -> recv_procs[i]) { hypre_TFree(recvinfo_data -> recv_procs[i], HYPRE_MEMORY_HOST); } } hypre_TFree(recvinfo_data -> recv_procs, HYPRE_MEMORY_HOST); } hypre_TFree(recvinfo_data, HYPRE_MEMORY_HOST); return ierr; } hypre-2.33.0/src/sstruct_ls/sstruct_recvinfo.h000066400000000000000000000014251477326011500215050ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /*-------------------------------------------------------------------------- * hypre_SStructRecvInfo data structure *--------------------------------------------------------------------------*/ #ifndef hypre_RECVINFODATA_HEADER #define hypre_RECVINFODATA_HEADER typedef struct { HYPRE_Int size; hypre_BoxArrayArray *recv_boxes; HYPRE_Int **recv_procs; } hypre_SStructRecvInfoData; #endif hypre-2.33.0/src/sstruct_ls/sstruct_sendinfo.c000066400000000000000000000144661477326011500215030ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "_hypre_sstruct_ls.h" /*-------------------------------------------------------------------------- * hypre_SStructSendInfo: Given a fgrid, coarsen each fbox and find the * coarsened boxes that must be sent, the procs that they must be sent to, * and the remote boxnums of these sendboxes. *--------------------------------------------------------------------------*/ hypre_SStructSendInfoData * hypre_SStructSendInfo( hypre_StructGrid *fgrid, hypre_BoxManager *cboxman, hypre_Index rfactor ) { hypre_SStructSendInfoData *sendinfo_data; MPI_Comm comm = hypre_StructGridComm(fgrid); HYPRE_Int ndim = hypre_StructGridNDim(fgrid); hypre_BoxArray *grid_boxes; hypre_Box *grid_box, cbox; hypre_Box *intersect_box, boxman_entry_box; hypre_BoxManEntry **boxman_entries; HYPRE_Int nboxman_entries; hypre_BoxArrayArray *send_boxes; HYPRE_Int **send_processes; HYPRE_Int **send_remote_boxnums; hypre_Index ilower, iupper, index; HYPRE_Int myproc, proc; HYPRE_Int cnt; HYPRE_Int i, j; hypre_BoxInit(&cbox, ndim); hypre_BoxInit(&boxman_entry_box, ndim); hypre_ClearIndex(index); hypre_MPI_Comm_rank(comm, &myproc); sendinfo_data = hypre_CTAlloc(hypre_SStructSendInfoData, 1, HYPRE_MEMORY_HOST); /*------------------------------------------------------------------------ * Create the structured sendbox patterns. * * send_boxes are obtained by intersecting this proc's fgrid boxes * with cgrid's box_man. Intersecting BoxManEntries not on this proc * will give boxes that we will need to send data to- i.e., we scan * through the boxes of grid and find the processors that own a chunk * of it. *------------------------------------------------------------------------*/ intersect_box = hypre_BoxCreate(ndim); grid_boxes = hypre_StructGridBoxes(fgrid); send_boxes = hypre_BoxArrayArrayCreate(hypre_BoxArraySize(grid_boxes), ndim); send_processes = hypre_CTAlloc(HYPRE_Int *, hypre_BoxArraySize(grid_boxes), HYPRE_MEMORY_HOST); send_remote_boxnums = hypre_CTAlloc(HYPRE_Int *, hypre_BoxArraySize(grid_boxes), HYPRE_MEMORY_HOST); hypre_ForBoxI(i, grid_boxes) { grid_box = hypre_BoxArrayBox(grid_boxes, i); /*--------------------------------------------------------------------- * Find the boxarray that must be sent. BoxManIntersect returns * the full extents of the boxes that intersect with the given box. * We further need to intersect each box in the list with the given * box to determine the actual box that needs to be sent. *---------------------------------------------------------------------*/ hypre_SStructIndexScaleF_C(hypre_BoxIMin(grid_box), index, rfactor, hypre_BoxIMin(&cbox)); hypre_SStructIndexScaleF_C(hypre_BoxIMax(grid_box), index, rfactor, hypre_BoxIMax(&cbox)); hypre_BoxManIntersect(cboxman, hypre_BoxIMin(&cbox), hypre_BoxIMax(&cbox), &boxman_entries, &nboxman_entries); cnt = 0; for (j = 0; j < nboxman_entries; j++) { hypre_SStructBoxManEntryGetProcess(boxman_entries[j], &proc); if (proc != myproc) { cnt++; } } send_processes[i] = hypre_CTAlloc(HYPRE_Int, cnt, HYPRE_MEMORY_HOST); send_remote_boxnums[i] = hypre_CTAlloc(HYPRE_Int, cnt, HYPRE_MEMORY_HOST); cnt = 0; for (j = 0; j < nboxman_entries; j++) { hypre_SStructBoxManEntryGetProcess(boxman_entries[j], &proc); /* determine the chunk of the boxman_entries[j] box that is needed */ hypre_BoxManEntryGetExtents(boxman_entries[j], ilower, iupper); hypre_BoxSetExtents(&boxman_entry_box, ilower, iupper); hypre_IntersectBoxes(&boxman_entry_box, &cbox, &boxman_entry_box); if (proc != myproc) { send_processes[i][cnt] = proc; hypre_SStructBoxManEntryGetBoxnum(boxman_entries[j], &send_remote_boxnums[i][cnt]); hypre_AppendBox(&boxman_entry_box, hypre_BoxArrayArrayBoxArray(send_boxes, i)); cnt++; } } hypre_TFree(boxman_entries, HYPRE_MEMORY_HOST); } /* hypre_ForBoxI(i, grid_boxes) */ hypre_BoxDestroy(intersect_box); (sendinfo_data -> size) = hypre_BoxArraySize(grid_boxes); (sendinfo_data -> send_boxes) = send_boxes; (sendinfo_data -> send_procs) = send_processes; (sendinfo_data -> send_remote_boxnums) = send_remote_boxnums; return sendinfo_data; } /*-------------------------------------------------------------------------- * hypre_SStructSendInfoDataDestroy *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SStructSendInfoDataDestroy(hypre_SStructSendInfoData *sendinfo_data) { HYPRE_Int ierr = 0; HYPRE_Int i; if (sendinfo_data) { if (sendinfo_data -> send_boxes) { hypre_BoxArrayArrayDestroy( (sendinfo_data -> send_boxes) ); } for (i = 0; i < (sendinfo_data -> size); i++) { if (sendinfo_data -> send_procs[i]) { hypre_TFree(sendinfo_data -> send_procs[i], HYPRE_MEMORY_HOST); } if (sendinfo_data -> send_remote_boxnums[i]) { hypre_TFree(sendinfo_data -> send_remote_boxnums[i], HYPRE_MEMORY_HOST); } } hypre_TFree(sendinfo_data -> send_procs, HYPRE_MEMORY_HOST); hypre_TFree(sendinfo_data -> send_remote_boxnums, HYPRE_MEMORY_HOST); } hypre_TFree(sendinfo_data, HYPRE_MEMORY_HOST); return ierr; } hypre-2.33.0/src/sstruct_ls/sstruct_sendinfo.h000066400000000000000000000015031477326011500214740ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /*-------------------------------------------------------------------------- * hypre_SStructSendInfo data structure *--------------------------------------------------------------------------*/ #ifndef hypre_SENDINFODATA_HEADER #define hypre_SENDINFODATA_HEADER typedef struct { HYPRE_Int size; hypre_BoxArrayArray *send_boxes; HYPRE_Int **send_procs; HYPRE_Int **send_remote_boxnums; } hypre_SStructSendInfoData; #endif hypre-2.33.0/src/sstruct_ls/sstruct_sharedDOFComm.c000066400000000000000000001076051477326011500223070ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * OpenMP Problems * * Need to fix the way these variables are set and incremented in loops: * tot_nsendRowsNcols, send_ColsData_alloc, tot_sendColsData * ******************************************************************************/ #include "_hypre_sstruct_ls.h" /*-------------------------------------------------------------------------- * hypre_MaxwellOffProcRowCreate *--------------------------------------------------------------------------*/ hypre_MaxwellOffProcRow * hypre_MaxwellOffProcRowCreate(HYPRE_Int ncols) { hypre_MaxwellOffProcRow *OffProcRow; HYPRE_BigInt *cols; HYPRE_Real *data; OffProcRow = hypre_CTAlloc(hypre_MaxwellOffProcRow, 1, HYPRE_MEMORY_HOST); (OffProcRow -> ncols) = ncols; cols = hypre_TAlloc(HYPRE_BigInt, ncols, HYPRE_MEMORY_HOST); data = hypre_TAlloc(HYPRE_Real, ncols, HYPRE_MEMORY_HOST); (OffProcRow -> cols) = cols; (OffProcRow -> data) = data; return OffProcRow; } /*-------------------------------------------------------------------------- * hypre_MaxwellOffProcRowDestroy *--------------------------------------------------------------------------*/ HYPRE_Int hypre_MaxwellOffProcRowDestroy(void *OffProcRow_vdata) { hypre_MaxwellOffProcRow *OffProcRow = (hypre_MaxwellOffProcRow *)OffProcRow_vdata; HYPRE_Int ierr = 0; if (OffProcRow) { hypre_TFree(OffProcRow -> cols, HYPRE_MEMORY_HOST); hypre_TFree(OffProcRow -> data, HYPRE_MEMORY_HOST); } hypre_TFree(OffProcRow, HYPRE_MEMORY_HOST); return ierr; } /*-------------------------------------------------------------------------- * hypre_SStructSharedDOF_ParcsrMatRowsComm * Given a sstruct_grid & parcsr matrix with rows corresponding to the * sstruct_grid, determine and extract the rows that must be communicated. * These rows are for shared dof that geometrically lie on processor * boundaries but internally are stored on one processor. * Algo: * for each cellbox * RECVs: * i) stretch the cellbox to the variable box * ii) in the appropriate (dof-dependent) direction, take the * boundary and boxman_intersect to extract boxmanentries * that contain these boundary edges. * iii)loop over the boxmanentries and see if they belong * on this proc or another proc * a) if belong on another proc, these are the recvs: * count and prepare the communication buffers and * values. * * SENDs: * i) form layer of cells that is one layer off cellbox * (stretches in the appropriate direction) * ii) boxman_intersect with the cellgrid boxman * iii)loop over the boxmanentries and see if they belong * on this proc or another proc * a) if belong on another proc, these are the sends: * count and prepare the communication buffers and * values. * * Note: For the recv data, the dof can come from only one processor. * For the send data, the dof can go to more than one processor * (the same dof is on the boundary of several cells). *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SStructSharedDOF_ParcsrMatRowsComm( hypre_SStructGrid *grid, hypre_ParCSRMatrix *A, HYPRE_Int *num_offprocrows_ptr, hypre_MaxwellOffProcRow ***OffProcRows_ptr) { MPI_Comm A_comm = hypre_ParCSRMatrixComm(A); MPI_Comm grid_comm = hypre_SStructGridComm(grid); HYPRE_Int matrix_type = HYPRE_PARCSR; HYPRE_Int nparts = hypre_SStructGridNParts(grid); HYPRE_Int ndim = hypre_SStructGridNDim(grid); hypre_SStructGrid *cell_ssgrid; hypre_SStructPGrid *pgrid; hypre_StructGrid *cellgrid; hypre_BoxArray *cellboxes; hypre_Box *box, *cellbox, vbox, boxman_entry_box; hypre_Index loop_size, start, lindex; HYPRE_BigInt start_rank, end_rank, rank; HYPRE_Int i, j, k, m, n, t, part, var, nvars; HYPRE_SStructVariable *vartypes; HYPRE_Int nbdry_slabs = 0; hypre_BoxArray *recv_slabs = NULL, *send_slabs = NULL; hypre_Index varoffset; hypre_BoxManager **boxmans, *cell_boxman; hypre_BoxManEntry **boxman_entries, *entry; HYPRE_Int nboxman_entries; hypre_Index ilower, iupper, index; HYPRE_Int proc, nprocs, myproc; HYPRE_Int *SendToProcs, *RecvFromProcs; HYPRE_Int **send_RowsNcols; /* buffer for rows & ncols */ HYPRE_Int *send_RowsNcols_alloc; HYPRE_Int *send_ColsData_alloc; HYPRE_Int *tot_nsendRowsNcols, *tot_sendColsData; HYPRE_Real **vals; /* buffer for cols & data */ HYPRE_BigInt *col_inds; HYPRE_Real *values; hypre_MPI_Request *requests; hypre_MPI_Status *status; HYPRE_Int **rbuffer_RowsNcols; HYPRE_Real **rbuffer_ColsData; HYPRE_Int num_sends, num_recvs; hypre_MaxwellOffProcRow **OffProcRows; HYPRE_Int *starts; HYPRE_Int ierr = 0; hypre_BoxInit(&vbox, ndim); hypre_BoxInit(&boxman_entry_box, ndim); hypre_SetIndex(lindex, 0); hypre_MPI_Comm_rank(A_comm, &myproc); hypre_MPI_Comm_size(grid_comm, &nprocs); start_rank = hypre_ParCSRMatrixFirstRowIndex(A); end_rank = hypre_ParCSRMatrixLastRowIndex(A); /* need a cellgrid boxman to determine the send boxes -> only the cell dofs are unique so a boxman intersect can be used to get the edges that must be sent. */ HYPRE_SStructGridCreate(grid_comm, ndim, nparts, &cell_ssgrid); vartypes = hypre_CTAlloc(HYPRE_SStructVariable, 1, HYPRE_MEMORY_HOST); vartypes[0] = HYPRE_SSTRUCT_VARIABLE_CELL; for (i = 0; i < nparts; i++) { pgrid = hypre_SStructGridPGrid(grid, i); cellgrid = hypre_SStructPGridCellSGrid(pgrid); cellboxes = hypre_StructGridBoxes(cellgrid); hypre_ForBoxI(j, cellboxes) { box = hypre_BoxArrayBox(cellboxes, j); HYPRE_SStructGridSetExtents(cell_ssgrid, i, hypre_BoxIMin(box), hypre_BoxIMax(box)); } HYPRE_SStructGridSetVariables(cell_ssgrid, i, 1, vartypes); } HYPRE_SStructGridAssemble(cell_ssgrid); hypre_TFree(vartypes, HYPRE_MEMORY_HOST); /* box algebra to determine communication */ SendToProcs = hypre_CTAlloc(HYPRE_Int, nprocs, HYPRE_MEMORY_HOST); RecvFromProcs = hypre_CTAlloc(HYPRE_Int, nprocs, HYPRE_MEMORY_HOST); send_RowsNcols = hypre_TAlloc(HYPRE_Int *, nprocs, HYPRE_MEMORY_HOST); send_RowsNcols_alloc = hypre_TAlloc(HYPRE_Int, nprocs, HYPRE_MEMORY_HOST); send_ColsData_alloc = hypre_TAlloc(HYPRE_Int, nprocs, HYPRE_MEMORY_HOST); vals = hypre_TAlloc(HYPRE_Real *, nprocs, HYPRE_MEMORY_HOST); tot_nsendRowsNcols = hypre_CTAlloc(HYPRE_Int, nprocs, HYPRE_MEMORY_HOST); tot_sendColsData = hypre_CTAlloc(HYPRE_Int, nprocs, HYPRE_MEMORY_HOST); for (i = 0; i < nprocs; i++) { send_RowsNcols[i] = hypre_TAlloc(HYPRE_Int, 1000, HYPRE_MEMORY_HOST); /* initial allocation */ send_RowsNcols_alloc[i] = 1000; vals[i] = hypre_TAlloc(HYPRE_Real, 2000, HYPRE_MEMORY_HOST); /* initial allocation */ send_ColsData_alloc[i] = 2000; } for (part = 0; part < nparts; part++) { pgrid = hypre_SStructGridPGrid(grid, part); nvars = hypre_SStructPGridNVars(pgrid); vartypes = hypre_SStructPGridVarTypes(pgrid); cellgrid = hypre_SStructPGridCellSGrid(pgrid); cellboxes = hypre_StructGridBoxes(cellgrid); boxmans = hypre_TAlloc(hypre_BoxManager *, nvars, HYPRE_MEMORY_HOST); for (t = 0; t < nvars; t++) { boxmans[t] = hypre_SStructGridBoxManager(grid, part, t); } cell_boxman = hypre_SStructGridBoxManager(cell_ssgrid, part, 0); hypre_ForBoxI(j, cellboxes) { cellbox = hypre_BoxArrayBox(cellboxes, j); for (t = 0; t < nvars; t++) { var = vartypes[t]; hypre_SStructVariableGetOffset((hypre_SStructVariable) var, ndim, varoffset); /* form the variable cellbox */ hypre_CopyBox(cellbox, &vbox); hypre_SubtractIndexes(hypre_BoxIMin(&vbox), varoffset, 3, hypre_BoxIMin(&vbox)); /* boundary layer box depends on variable type */ switch (var) { case 1: /* node based */ { nbdry_slabs = 6; recv_slabs = hypre_BoxArrayCreate(nbdry_slabs, ndim); /* slab in the +/- i,j,k directions */ box = hypre_BoxArrayBox(recv_slabs, 0); hypre_CopyBox(&vbox, box); hypre_BoxIMin(box)[0] = hypre_BoxIMax(box)[0]; box = hypre_BoxArrayBox(recv_slabs, 1); hypre_CopyBox(&vbox, box); hypre_BoxIMax(box)[0] = hypre_BoxIMin(box)[0]; /* need to contract the slab in the i direction to avoid repeated counting of some nodes. */ box = hypre_BoxArrayBox(recv_slabs, 2); hypre_CopyBox(&vbox, box); hypre_BoxIMin(box)[1] = hypre_BoxIMax(box)[1]; hypre_BoxIMin(box)[0]++; /* contract */ hypre_BoxIMax(box)[0]--; /* contract */ box = hypre_BoxArrayBox(recv_slabs, 3); hypre_CopyBox(&vbox, box); hypre_BoxIMax(box)[1] = hypre_BoxIMin(box)[1]; hypre_BoxIMin(box)[0]++; /* contract */ hypre_BoxIMax(box)[0]--; /* contract */ /* need to contract the slab in the i & j directions to avoid repeated counting of some nodes. */ box = hypre_BoxArrayBox(recv_slabs, 4); hypre_CopyBox(&vbox, box); hypre_BoxIMin(box)[2] = hypre_BoxIMax(box)[2]; hypre_BoxIMin(box)[0]++; /* contract */ hypre_BoxIMax(box)[0]--; /* contract */ hypre_BoxIMin(box)[1]++; /* contract */ hypre_BoxIMax(box)[1]--; /* contract */ box = hypre_BoxArrayBox(recv_slabs, 5); hypre_CopyBox(&vbox, box); hypre_BoxIMax(box)[2] = hypre_BoxIMin(box)[2]; hypre_BoxIMin(box)[0]++; /* contract */ hypre_BoxIMax(box)[0]--; /* contract */ hypre_BoxIMin(box)[1]++; /* contract */ hypre_BoxIMax(box)[1]--; /* contract */ /* send boxes are cell-based stretching out of cellbox - i.e., cells that have these edges as boundary */ send_slabs = hypre_BoxArrayCreate(nbdry_slabs, ndim); box = hypre_BoxArrayBox(send_slabs, 0); hypre_CopyBox(cellbox, box); hypre_BoxIMax(box)[0]++; hypre_BoxIMin(box)[0] = hypre_BoxIMax(box)[0]; hypre_BoxIMax(box)[2]++; /* stretch one layer +/- k*/ hypre_BoxIMin(box)[2]--; hypre_BoxIMax(box)[1]++; /* stretch one layer +/- j*/ hypre_BoxIMin(box)[1]--; box = hypre_BoxArrayBox(send_slabs, 1); hypre_CopyBox(cellbox, box); hypre_BoxIMin(box)[0]--; hypre_BoxIMax(box)[0] = hypre_BoxIMin(box)[0]; hypre_BoxIMax(box)[2]++; /* stretch one layer +/- k*/ hypre_BoxIMin(box)[2]--; hypre_BoxIMax(box)[1]++; /* stretch one layer +/- j*/ hypre_BoxIMin(box)[1]--; box = hypre_BoxArrayBox(send_slabs, 2); hypre_CopyBox(cellbox, box); hypre_BoxIMax(box)[1]++; hypre_BoxIMin(box)[1] = hypre_BoxIMax(box)[1]; hypre_BoxIMax(box)[2]++; /* stretch one layer +/- k*/ hypre_BoxIMin(box)[2]--; box = hypre_BoxArrayBox(send_slabs, 3); hypre_CopyBox(cellbox, box); hypre_BoxIMin(box)[1]--; hypre_BoxIMax(box)[1] = hypre_BoxIMin(box)[1]; hypre_BoxIMax(box)[2]++; /* stretch one layer +/- k*/ hypre_BoxIMin(box)[2]--; box = hypre_BoxArrayBox(send_slabs, 4); hypre_CopyBox(cellbox, box); hypre_BoxIMax(box)[2]++; hypre_BoxIMin(box)[2] = hypre_BoxIMax(box)[2]; box = hypre_BoxArrayBox(send_slabs, 5); hypre_CopyBox(cellbox, box); hypre_BoxIMin(box)[2]--; hypre_BoxIMax(box)[2] = hypre_BoxIMin(box)[2]; break; } case 2: /* x-face based */ { nbdry_slabs = 2; recv_slabs = hypre_BoxArrayCreate(nbdry_slabs, ndim); /* slab in the +/- i direction */ box = hypre_BoxArrayBox(recv_slabs, 0); hypre_CopyBox(&vbox, box); hypre_BoxIMin(box)[0] = hypre_BoxIMax(box)[0]; box = hypre_BoxArrayBox(recv_slabs, 1); hypre_CopyBox(&vbox, box); hypre_BoxIMax(box)[0] = hypre_BoxIMin(box)[0]; /* send boxes are cell-based stretching out of cellbox - i.e., cells that have these edges as boundary */ send_slabs = hypre_BoxArrayCreate(nbdry_slabs, ndim); box = hypre_BoxArrayBox(send_slabs, 0); hypre_CopyBox(cellbox, box); hypre_BoxIMax(box)[0]++; hypre_BoxIMin(box)[0] = hypre_BoxIMax(box)[0]; box = hypre_BoxArrayBox(send_slabs, 1); hypre_CopyBox(cellbox, box); hypre_BoxIMin(box)[0]--; hypre_BoxIMax(box)[0] = hypre_BoxIMin(box)[0]; break; } case 3: /* y-face based */ { nbdry_slabs = 2; recv_slabs = hypre_BoxArrayCreate(nbdry_slabs, ndim); /* slab in the +/- j direction */ box = hypre_BoxArrayBox(recv_slabs, 0); hypre_CopyBox(&vbox, box); hypre_BoxIMin(box)[1] = hypre_BoxIMax(box)[1]; box = hypre_BoxArrayBox(recv_slabs, 1); hypre_CopyBox(&vbox, box); hypre_BoxIMax(box)[1] = hypre_BoxIMin(box)[1]; /* send boxes are cell-based stretching out of cellbox - i.e., cells that have these edges as boundary */ send_slabs = hypre_BoxArrayCreate(nbdry_slabs, ndim); box = hypre_BoxArrayBox(send_slabs, 0); hypre_CopyBox(cellbox, box); hypre_BoxIMax(box)[1]++; hypre_BoxIMin(box)[1] = hypre_BoxIMax(box)[1]; box = hypre_BoxArrayBox(send_slabs, 1); hypre_CopyBox(cellbox, box); hypre_BoxIMin(box)[1]--; hypre_BoxIMax(box)[1] = hypre_BoxIMin(box)[1]; break; } case 4: /* z-face based */ { nbdry_slabs = 2; recv_slabs = hypre_BoxArrayCreate(nbdry_slabs, ndim); /* slab in the +/- k direction */ box = hypre_BoxArrayBox(recv_slabs, 0); hypre_CopyBox(&vbox, box); hypre_BoxIMin(box)[2] = hypre_BoxIMax(box)[2]; box = hypre_BoxArrayBox(recv_slabs, 1); hypre_CopyBox(&vbox, box); hypre_BoxIMax(box)[2] = hypre_BoxIMin(box)[2]; /* send boxes are cell-based stretching out of cellbox - i.e., cells that have these edges as boundary */ send_slabs = hypre_BoxArrayCreate(nbdry_slabs, ndim); box = hypre_BoxArrayBox(send_slabs, 0); hypre_CopyBox(cellbox, box); hypre_BoxIMax(box)[2]++; hypre_BoxIMin(box)[2] = hypre_BoxIMax(box)[2]; box = hypre_BoxArrayBox(send_slabs, 1); hypre_CopyBox(cellbox, box); hypre_BoxIMin(box)[2]--; hypre_BoxIMax(box)[2] = hypre_BoxIMin(box)[2]; break; } case 5: /* x-edge based */ { nbdry_slabs = 4; recv_slabs = hypre_BoxArrayCreate(nbdry_slabs, ndim); /* slab in the +/- j & k direction */ box = hypre_BoxArrayBox(recv_slabs, 0); hypre_CopyBox(&vbox, box); hypre_BoxIMin(box)[1] = hypre_BoxIMax(box)[1]; box = hypre_BoxArrayBox(recv_slabs, 1); hypre_CopyBox(&vbox, box); hypre_BoxIMax(box)[1] = hypre_BoxIMin(box)[1]; /* need to contract the slab in the j direction to avoid repeated counting of some x-edges. */ box = hypre_BoxArrayBox(recv_slabs, 2); hypre_CopyBox(&vbox, box); hypre_BoxIMin(box)[2] = hypre_BoxIMax(box)[2]; hypre_BoxIMin(box)[1]++; /* contract */ hypre_BoxIMax(box)[1]--; /* contract */ box = hypre_BoxArrayBox(recv_slabs, 3); hypre_CopyBox(&vbox, box); hypre_BoxIMax(box)[2] = hypre_BoxIMin(box)[2]; hypre_BoxIMin(box)[1]++; /* contract */ hypre_BoxIMax(box)[1]--; /* contract */ /* send boxes are cell-based stretching out of cellbox - i.e., cells that have these edges as boundary */ send_slabs = hypre_BoxArrayCreate(nbdry_slabs, ndim); box = hypre_BoxArrayBox(send_slabs, 0); hypre_CopyBox(cellbox, box); hypre_BoxIMax(box)[1]++; hypre_BoxIMin(box)[1] = hypre_BoxIMax(box)[1]; hypre_BoxIMax(box)[2]++; /* stretch one layer +/- k*/ hypre_BoxIMin(box)[2]--; box = hypre_BoxArrayBox(send_slabs, 1); hypre_CopyBox(cellbox, box); hypre_BoxIMin(box)[1]--; hypre_BoxIMax(box)[1] = hypre_BoxIMin(box)[1]; hypre_BoxIMax(box)[2]++; /* stretch one layer +/- k*/ hypre_BoxIMin(box)[2]--; box = hypre_BoxArrayBox(send_slabs, 2); hypre_CopyBox(cellbox, box); hypre_BoxIMax(box)[2]++; hypre_BoxIMin(box)[2] = hypre_BoxIMax(box)[2]; box = hypre_BoxArrayBox(send_slabs, 3); hypre_CopyBox(cellbox, box); hypre_BoxIMin(box)[2]--; hypre_BoxIMax(box)[2] = hypre_BoxIMin(box)[2]; break; } case 6: /* y-edge based */ { nbdry_slabs = 4; recv_slabs = hypre_BoxArrayCreate(nbdry_slabs, ndim); /* slab in the +/- i & k direction */ box = hypre_BoxArrayBox(recv_slabs, 0); hypre_CopyBox(&vbox, box); hypre_BoxIMin(box)[0] = hypre_BoxIMax(box)[0]; box = hypre_BoxArrayBox(recv_slabs, 1); hypre_CopyBox(&vbox, box); hypre_BoxIMax(box)[0] = hypre_BoxIMin(box)[0]; /* need to contract the slab in the i direction to avoid repeated counting of some y-edges. */ box = hypre_BoxArrayBox(recv_slabs, 2); hypre_CopyBox(&vbox, box); hypre_BoxIMin(box)[2] = hypre_BoxIMax(box)[2]; hypre_BoxIMin(box)[0]++; /* contract */ hypre_BoxIMax(box)[0]--; /* contract */ box = hypre_BoxArrayBox(recv_slabs, 3); hypre_CopyBox(&vbox, box); hypre_BoxIMax(box)[2] = hypre_BoxIMin(box)[2]; hypre_BoxIMin(box)[0]++; /* contract */ hypre_BoxIMax(box)[0]--; /* contract */ /* send boxes are cell-based stretching out of cellbox - i.e., cells that have these edges as boundary */ send_slabs = hypre_BoxArrayCreate(nbdry_slabs, ndim); box = hypre_BoxArrayBox(send_slabs, 0); hypre_CopyBox(cellbox, box); hypre_BoxIMax(box)[0]++; hypre_BoxIMin(box)[0] = hypre_BoxIMax(box)[0]; hypre_BoxIMax(box)[2]++; /* stretch one layer +/- k*/ hypre_BoxIMin(box)[2]--; box = hypre_BoxArrayBox(send_slabs, 1); hypre_CopyBox(cellbox, box); hypre_BoxIMin(box)[0]--; hypre_BoxIMax(box)[0] = hypre_BoxIMin(box)[0]; hypre_BoxIMax(box)[2]++; /* stretch one layer +/- k*/ hypre_BoxIMin(box)[2]--; box = hypre_BoxArrayBox(send_slabs, 2); hypre_CopyBox(cellbox, box); hypre_BoxIMax(box)[2]++; hypre_BoxIMin(box)[2] = hypre_BoxIMax(box)[2]; box = hypre_BoxArrayBox(send_slabs, 3); hypre_CopyBox(cellbox, box); hypre_BoxIMin(box)[2]--; hypre_BoxIMax(box)[2] = hypre_BoxIMin(box)[2]; break; } case 7: /* z-edge based */ { nbdry_slabs = 4; recv_slabs = hypre_BoxArrayCreate(nbdry_slabs, ndim); /* slab in the +/- i & j direction */ box = hypre_BoxArrayBox(recv_slabs, 0); hypre_CopyBox(&vbox, box); hypre_BoxIMin(box)[0] = hypre_BoxIMax(box)[0]; box = hypre_BoxArrayBox(recv_slabs, 1); hypre_CopyBox(&vbox, box); hypre_BoxIMax(box)[0] = hypre_BoxIMin(box)[0]; /* need to contract the slab in the i direction to avoid repeated counting of some z-edges. */ box = hypre_BoxArrayBox(recv_slabs, 2); hypre_CopyBox(&vbox, box); hypre_BoxIMin(box)[1] = hypre_BoxIMax(box)[1]; hypre_BoxIMin(box)[0]++; /* contract */ hypre_BoxIMax(box)[0]--; /* contract */ box = hypre_BoxArrayBox(recv_slabs, 3); hypre_CopyBox(&vbox, box); hypre_BoxIMax(box)[1] = hypre_BoxIMin(box)[1]; hypre_BoxIMin(box)[0]++; /* contract */ hypre_BoxIMax(box)[0]--; /* contract */ /* send boxes are cell-based stretching out of cellbox - i.e., cells that have these edges as boundary */ send_slabs = hypre_BoxArrayCreate(nbdry_slabs, ndim); box = hypre_BoxArrayBox(send_slabs, 0); hypre_CopyBox(cellbox, box); hypre_BoxIMax(box)[1]++; hypre_BoxIMin(box)[1] = hypre_BoxIMax(box)[1]; hypre_BoxIMax(box)[0]++; /* stretch one layer +/- i*/ hypre_BoxIMin(box)[0]--; box = hypre_BoxArrayBox(send_slabs, 1); hypre_CopyBox(cellbox, box); hypre_BoxIMin(box)[1]--; hypre_BoxIMax(box)[1] = hypre_BoxIMin(box)[1]; hypre_BoxIMax(box)[0]++; /* stretch one layer +/- i*/ hypre_BoxIMin(box)[0]--; box = hypre_BoxArrayBox(send_slabs, 2); hypre_CopyBox(cellbox, box); hypre_BoxIMax(box)[0]++; hypre_BoxIMin(box)[0] = hypre_BoxIMax(box)[0]; box = hypre_BoxArrayBox(send_slabs, 3); hypre_CopyBox(cellbox, box); hypre_BoxIMin(box)[0]--; hypre_BoxIMax(box)[0] = hypre_BoxIMin(box)[0]; break; } } /* switch(var) */ /* determine no. of recv rows */ for (i = 0; i < nbdry_slabs; i++) { box = hypre_BoxArrayBox(recv_slabs, i); hypre_BoxManIntersect(boxmans[t], hypre_BoxIMin(box), hypre_BoxIMax(box), &boxman_entries, &nboxman_entries); for (m = 0; m < nboxman_entries; m++) { hypre_SStructBoxManEntryGetProcess(boxman_entries[m], &proc); if (proc != myproc) { hypre_BoxManEntryGetExtents(boxman_entries[m], ilower, iupper); hypre_BoxSetExtents(&boxman_entry_box, ilower, iupper); hypre_IntersectBoxes(&boxman_entry_box, box, &boxman_entry_box); RecvFromProcs[proc] += hypre_BoxVolume(&boxman_entry_box); } } hypre_TFree(boxman_entries, HYPRE_MEMORY_HOST); /* determine send rows. Note the cell_boxman */ box = hypre_BoxArrayBox(send_slabs, i); hypre_BoxManIntersect(cell_boxman, hypre_BoxIMin(box), hypre_BoxIMax(box), &boxman_entries, &nboxman_entries); for (m = 0; m < nboxman_entries; m++) { hypre_SStructBoxManEntryGetProcess(boxman_entries[m], &proc); if (proc != myproc) { hypre_BoxManEntryGetExtents(boxman_entries[m], ilower, iupper); hypre_BoxSetExtents(&boxman_entry_box, ilower, iupper); hypre_IntersectBoxes(&boxman_entry_box, box, &boxman_entry_box); /* not correct box piece right now. Need to determine the correct var box - extend to var_box and then intersect with vbox */ hypre_SubtractIndexes(hypre_BoxIMin(&boxman_entry_box), varoffset, 3, hypre_BoxIMin(&boxman_entry_box)); hypre_IntersectBoxes(&boxman_entry_box, &vbox, &boxman_entry_box); SendToProcs[proc] += 2 * hypre_BoxVolume(&boxman_entry_box); /* check to see if sufficient memory allocation for send_rows */ if (SendToProcs[proc] > send_RowsNcols_alloc[proc]) { send_RowsNcols_alloc[proc] = SendToProcs[proc]; send_RowsNcols[proc] = hypre_TReAlloc(send_RowsNcols[proc], HYPRE_Int, send_RowsNcols_alloc[proc], HYPRE_MEMORY_HOST); } hypre_BoxGetSize(&boxman_entry_box, loop_size); hypre_CopyIndex(hypre_BoxIMin(&boxman_entry_box), start); hypre_SerialBoxLoop0Begin(ndim, loop_size); { zypre_BoxLoopGetIndex(lindex); hypre_SetIndex3(index, lindex[0], lindex[1], lindex[2]); hypre_AddIndexes(index, start, 3, index); hypre_SStructGridFindBoxManEntry(grid, part, index, t, &entry); if (entry) { hypre_SStructBoxManEntryGetGlobalRank(entry, index, &rank, matrix_type); /* index may still be off myproc because vbox was formed by expanding the cellbox to the variable box without checking (difficult) the whole expanded box is on myproc */ if (rank <= end_rank && rank >= start_rank) { send_RowsNcols[proc][tot_nsendRowsNcols[proc]] = rank; tot_nsendRowsNcols[proc]++; HYPRE_ParCSRMatrixGetRow((HYPRE_ParCSRMatrix) A, rank, &n, &col_inds, &values); send_RowsNcols[proc][tot_nsendRowsNcols[proc]] = n; tot_nsendRowsNcols[proc]++; /* check if sufficient memory allocation in the data arrays */ if ( (tot_sendColsData[proc] + 2 * n) > send_ColsData_alloc[proc] ) { send_ColsData_alloc[proc] += 2000; vals[proc] = hypre_TReAlloc(vals[proc], HYPRE_Real, send_ColsData_alloc[proc], HYPRE_MEMORY_HOST); } for (k = 0; k < n; k++) { vals[proc][tot_sendColsData[proc]] = (HYPRE_Real) col_inds[k]; tot_sendColsData[proc]++; vals[proc][tot_sendColsData[proc]] = values[k]; tot_sendColsData[proc]++; } HYPRE_ParCSRMatrixRestoreRow((HYPRE_ParCSRMatrix) A, rank, &n, &col_inds, &values); } /* if (rank <= end_rank && rank >= start_rank) */ } /* if (entry) */ } hypre_SerialBoxLoop0End(); } /* if (proc != myproc) */ } /* for (m= 0; m< nboxman_entries; m++) */ hypre_TFree(boxman_entries, HYPRE_MEMORY_HOST); } /* for (i= 0; i< nbdry_slabs; i++) */ hypre_BoxArrayDestroy(send_slabs); hypre_BoxArrayDestroy(recv_slabs); } /* for (t= 0; t< nvars; t++) */ } /* hypre_ForBoxI(j, cellboxes) */ hypre_TFree(boxmans, HYPRE_MEMORY_HOST); } /* for (part= 0; part< nparts; part++) */ HYPRE_SStructGridDestroy(cell_ssgrid); num_sends = 0; num_recvs = 0; k = 0; starts = hypre_CTAlloc(HYPRE_Int, nprocs + 1, HYPRE_MEMORY_HOST); for (i = 0; i < nprocs; i++) { starts[i + 1] = starts[i] + RecvFromProcs[i]; if (RecvFromProcs[i]) { num_recvs++; k += RecvFromProcs[i]; } if (tot_sendColsData[i]) { num_sends++; } } OffProcRows = hypre_TAlloc(hypre_MaxwellOffProcRow *, k, HYPRE_MEMORY_HOST); *num_offprocrows_ptr = k; requests = hypre_CTAlloc(hypre_MPI_Request, num_sends + num_recvs, HYPRE_MEMORY_HOST); status = hypre_CTAlloc(hypre_MPI_Status, num_sends + num_recvs, HYPRE_MEMORY_HOST); /* send row size data */ j = 0; rbuffer_RowsNcols = hypre_TAlloc(HYPRE_Int *, nprocs, HYPRE_MEMORY_HOST); rbuffer_ColsData = hypre_TAlloc(HYPRE_Real *, nprocs, HYPRE_MEMORY_HOST); for (proc = 0; proc < nprocs; proc++) { if (RecvFromProcs[proc]) { rbuffer_RowsNcols[proc] = hypre_TAlloc(HYPRE_Int, 2 * RecvFromProcs[proc], HYPRE_MEMORY_HOST); hypre_MPI_Irecv(rbuffer_RowsNcols[proc], 2 * RecvFromProcs[proc], HYPRE_MPI_INT, proc, 0, grid_comm, &requests[j++]); } /* if (RecvFromProcs[proc]) */ } /* for (proc= 0; proc< nprocs; proc++) */ for (proc = 0; proc < nprocs; proc++) { if (tot_nsendRowsNcols[proc]) { hypre_MPI_Isend(send_RowsNcols[proc], tot_nsendRowsNcols[proc], HYPRE_MPI_INT, proc, 0, grid_comm, &requests[j++]); } } hypre_MPI_Waitall(j, requests, status); /* unpack data */ for (proc = 0; proc < nprocs; proc++) { send_RowsNcols_alloc[proc] = 0; if (RecvFromProcs[proc]) { m = 0; ; for (i = 0; i < RecvFromProcs[proc]; i++) { /* rbuffer_RowsNcols[m] has the row & rbuffer_RowsNcols[m+1] the col size */ OffProcRows[starts[proc] + i] = hypre_MaxwellOffProcRowCreate(rbuffer_RowsNcols[proc][m + 1]); (OffProcRows[starts[proc] + i] -> row) = rbuffer_RowsNcols[proc][m]; (OffProcRows[starts[proc] + i] -> ncols) = rbuffer_RowsNcols[proc][m + 1]; send_RowsNcols_alloc[proc] += rbuffer_RowsNcols[proc][m + 1]; m += 2; } rbuffer_ColsData[proc] = hypre_TAlloc(HYPRE_Real, 2 * send_RowsNcols_alloc[proc], HYPRE_MEMORY_HOST); hypre_TFree(rbuffer_RowsNcols[proc], HYPRE_MEMORY_HOST); } } hypre_TFree(rbuffer_RowsNcols, HYPRE_MEMORY_HOST); hypre_TFree(requests, HYPRE_MEMORY_HOST); hypre_TFree(status, HYPRE_MEMORY_HOST); requests = hypre_CTAlloc(hypre_MPI_Request, num_sends + num_recvs, HYPRE_MEMORY_HOST); status = hypre_CTAlloc(hypre_MPI_Status, num_sends + num_recvs, HYPRE_MEMORY_HOST); /* send row data */ j = 0; for (proc = 0; proc < nprocs; proc++) { if (RecvFromProcs[proc]) { hypre_MPI_Irecv(rbuffer_ColsData[proc], 2 * send_RowsNcols_alloc[proc], HYPRE_MPI_REAL, proc, 1, grid_comm, &requests[j++]); } /* if (RecvFromProcs[proc]) */ } /* for (proc= 0; proc< nprocs; proc++) */ for (proc = 0; proc < nprocs; proc++) { if (tot_sendColsData[proc]) { hypre_MPI_Isend(vals[proc], tot_sendColsData[proc], HYPRE_MPI_REAL, proc, 1, grid_comm, &requests[j++]); } } hypre_MPI_Waitall(j, requests, status); /* unpack data */ for (proc = 0; proc < nprocs; proc++) { if (RecvFromProcs[proc]) { k = 0; for (i = 0; i < RecvFromProcs[proc]; i++) { col_inds = (OffProcRows[starts[proc] + i] -> cols); values = (OffProcRows[starts[proc] + i] -> data); m = (OffProcRows[starts[proc] + i] -> ncols); for (t = 0; t < m; t++) { col_inds[t] = (HYPRE_Int) rbuffer_ColsData[proc][k++]; values[t] = rbuffer_ColsData[proc][k++]; } } hypre_TFree(rbuffer_ColsData[proc], HYPRE_MEMORY_HOST); } /* if (RecvFromProcs[proc]) */ } /* for (proc= 0; proc< nprocs; proc++) */ hypre_TFree(rbuffer_ColsData, HYPRE_MEMORY_HOST); hypre_TFree(requests, HYPRE_MEMORY_HOST); hypre_TFree(status, HYPRE_MEMORY_HOST); for (proc = 0; proc < nprocs; proc++) { hypre_TFree(send_RowsNcols[proc], HYPRE_MEMORY_HOST); hypre_TFree(vals[proc], HYPRE_MEMORY_HOST); } hypre_TFree(send_RowsNcols, HYPRE_MEMORY_HOST); hypre_TFree(vals, HYPRE_MEMORY_HOST); hypre_TFree(tot_sendColsData, HYPRE_MEMORY_HOST); hypre_TFree(tot_nsendRowsNcols, HYPRE_MEMORY_HOST); hypre_TFree(send_ColsData_alloc, HYPRE_MEMORY_HOST); hypre_TFree(send_RowsNcols_alloc, HYPRE_MEMORY_HOST); hypre_TFree(SendToProcs, HYPRE_MEMORY_HOST); hypre_TFree(RecvFromProcs, HYPRE_MEMORY_HOST); hypre_TFree(starts, HYPRE_MEMORY_HOST); *OffProcRows_ptr = OffProcRows; return ierr; } hypre-2.33.0/src/sstruct_ls/sstruct_sharedDOFComm.h000066400000000000000000000007651477326011500223130ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ typedef struct { HYPRE_BigInt row; HYPRE_Int ncols; HYPRE_BigInt *cols; HYPRE_Real *data; } hypre_MaxwellOffProcRow; hypre-2.33.0/src/sstruct_ls/sys_pfmg.c000066400000000000000000000304541477326011500177310ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "_hypre_sstruct_ls.h" #include "sys_pfmg.h" /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ void * hypre_SysPFMGCreate( MPI_Comm comm ) { hypre_SysPFMGData *sys_pfmg_data; sys_pfmg_data = hypre_CTAlloc(hypre_SysPFMGData, 1, HYPRE_MEMORY_HOST); (sys_pfmg_data -> comm) = comm; (sys_pfmg_data -> time_index) = hypre_InitializeTiming("SYS_PFMG"); /* set defaults */ (sys_pfmg_data -> tol) = 1.0e-06; (sys_pfmg_data -> max_iter ) = 200; (sys_pfmg_data -> rel_change) = 0; (sys_pfmg_data -> zero_guess) = 0; (sys_pfmg_data -> max_levels) = 0; (sys_pfmg_data -> dxyz)[0] = 0.0; (sys_pfmg_data -> dxyz)[1] = 0.0; (sys_pfmg_data -> dxyz)[2] = 0.0; (sys_pfmg_data -> relax_type) = 1; /* weighted Jacobi */ (sys_pfmg_data -> jacobi_weight) = 0.0; (sys_pfmg_data -> usr_jacobi_weight) = 0; (sys_pfmg_data -> num_pre_relax) = 1; (sys_pfmg_data -> num_post_relax) = 1; (sys_pfmg_data -> skip_relax) = 1; (sys_pfmg_data -> logging) = 0; (sys_pfmg_data -> print_level) = 0; /* initialize */ (sys_pfmg_data -> num_levels) = -1; return (void *) sys_pfmg_data; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SysPFMGDestroy( void *sys_pfmg_vdata ) { hypre_SysPFMGData *sys_pfmg_data = (hypre_SysPFMGData *)sys_pfmg_vdata; HYPRE_Int l; if (sys_pfmg_data) { if ((sys_pfmg_data -> logging) > 0) { hypre_TFree(sys_pfmg_data -> norms, HYPRE_MEMORY_HOST); hypre_TFree(sys_pfmg_data -> rel_norms, HYPRE_MEMORY_HOST); } if ((sys_pfmg_data -> num_levels) > -1) { for (l = 0; l < (sys_pfmg_data -> num_levels); l++) { hypre_SysPFMGRelaxDestroy(sys_pfmg_data -> relax_data_l[l]); hypre_SStructPMatvecDestroy(sys_pfmg_data -> matvec_data_l[l]); } for (l = 0; l < ((sys_pfmg_data -> num_levels) - 1); l++) { hypre_SysSemiRestrictDestroy(sys_pfmg_data -> restrict_data_l[l]); hypre_SysSemiInterpDestroy(sys_pfmg_data -> interp_data_l[l]); } hypre_TFree(sys_pfmg_data -> relax_data_l, HYPRE_MEMORY_HOST); hypre_TFree(sys_pfmg_data -> matvec_data_l, HYPRE_MEMORY_HOST); hypre_TFree(sys_pfmg_data -> restrict_data_l, HYPRE_MEMORY_HOST); hypre_TFree(sys_pfmg_data -> interp_data_l, HYPRE_MEMORY_HOST); hypre_SStructPVectorDestroy(sys_pfmg_data -> tx_l[0]); /*hypre_SStructPGridDestroy(sys_pfmg_data -> grid_l[0]);*/ hypre_SStructPMatrixDestroy(sys_pfmg_data -> A_l[0]); hypre_SStructPVectorDestroy(sys_pfmg_data -> b_l[0]); hypre_SStructPVectorDestroy(sys_pfmg_data -> x_l[0]); for (l = 0; l < ((sys_pfmg_data -> num_levels) - 1); l++) { hypre_SStructPGridDestroy(sys_pfmg_data -> grid_l[l + 1]); hypre_SStructPGridDestroy(sys_pfmg_data -> P_grid_l[l + 1]); hypre_SStructPMatrixDestroy(sys_pfmg_data -> A_l[l + 1]); hypre_SStructPMatrixDestroy(sys_pfmg_data -> P_l[l]); hypre_SStructPVectorDestroy(sys_pfmg_data -> b_l[l + 1]); hypre_SStructPVectorDestroy(sys_pfmg_data -> x_l[l + 1]); hypre_SStructPVectorDestroy(sys_pfmg_data -> tx_l[l + 1]); } hypre_TFree(sys_pfmg_data -> data, HYPRE_MEMORY_HOST); hypre_TFree(sys_pfmg_data -> cdir_l, HYPRE_MEMORY_HOST); hypre_TFree(sys_pfmg_data -> active_l, HYPRE_MEMORY_HOST); hypre_TFree(sys_pfmg_data -> grid_l, HYPRE_MEMORY_HOST); hypre_TFree(sys_pfmg_data -> P_grid_l, HYPRE_MEMORY_HOST); hypre_TFree(sys_pfmg_data -> A_l, HYPRE_MEMORY_HOST); hypre_TFree(sys_pfmg_data -> P_l, HYPRE_MEMORY_HOST); hypre_TFree(sys_pfmg_data -> RT_l, HYPRE_MEMORY_HOST); hypre_TFree(sys_pfmg_data -> b_l, HYPRE_MEMORY_HOST); hypre_TFree(sys_pfmg_data -> x_l, HYPRE_MEMORY_HOST); hypre_TFree(sys_pfmg_data -> tx_l, HYPRE_MEMORY_HOST); } hypre_FinalizeTiming(sys_pfmg_data -> time_index); hypre_TFree(sys_pfmg_data, HYPRE_MEMORY_HOST); } return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SysPFMGSetTol( void *sys_pfmg_vdata, HYPRE_Real tol ) { hypre_SysPFMGData *sys_pfmg_data = (hypre_SysPFMGData *)sys_pfmg_vdata; (sys_pfmg_data -> tol) = tol; return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SysPFMGSetMaxIter( void *sys_pfmg_vdata, HYPRE_Int max_iter ) { hypre_SysPFMGData *sys_pfmg_data = (hypre_SysPFMGData *)sys_pfmg_vdata; (sys_pfmg_data -> max_iter) = max_iter; return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SysPFMGSetRelChange( void *sys_pfmg_vdata, HYPRE_Int rel_change ) { hypre_SysPFMGData *sys_pfmg_data = (hypre_SysPFMGData *)sys_pfmg_vdata; (sys_pfmg_data -> rel_change) = rel_change; return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SysPFMGSetZeroGuess( void *sys_pfmg_vdata, HYPRE_Int zero_guess ) { hypre_SysPFMGData *sys_pfmg_data = (hypre_SysPFMGData *)sys_pfmg_vdata; (sys_pfmg_data -> zero_guess) = zero_guess; return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SysPFMGSetRelaxType( void *sys_pfmg_vdata, HYPRE_Int relax_type ) { hypre_SysPFMGData *sys_pfmg_data = (hypre_SysPFMGData *)sys_pfmg_vdata; (sys_pfmg_data -> relax_type) = relax_type; return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SysPFMGSetJacobiWeight( void *sys_pfmg_vdata, HYPRE_Real weight ) { hypre_SysPFMGData *sys_pfmg_data = (hypre_SysPFMGData *)sys_pfmg_vdata; (sys_pfmg_data -> jacobi_weight) = weight; (sys_pfmg_data -> usr_jacobi_weight) = 1; return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SysPFMGSetNumPreRelax( void *sys_pfmg_vdata, HYPRE_Int num_pre_relax ) { hypre_SysPFMGData *sys_pfmg_data = (hypre_SysPFMGData *)sys_pfmg_vdata; (sys_pfmg_data -> num_pre_relax) = num_pre_relax; return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SysPFMGSetNumPostRelax( void *sys_pfmg_vdata, HYPRE_Int num_post_relax ) { hypre_SysPFMGData *sys_pfmg_data = (hypre_SysPFMGData *)sys_pfmg_vdata; (sys_pfmg_data -> num_post_relax) = num_post_relax; return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SysPFMGSetSkipRelax( void *sys_pfmg_vdata, HYPRE_Int skip_relax ) { hypre_SysPFMGData *sys_pfmg_data = (hypre_SysPFMGData *)sys_pfmg_vdata; (sys_pfmg_data -> skip_relax) = skip_relax; return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SysPFMGSetDxyz( void *sys_pfmg_vdata, HYPRE_Real *dxyz ) { hypre_SysPFMGData *sys_pfmg_data = (hypre_SysPFMGData *)sys_pfmg_vdata; (sys_pfmg_data -> dxyz[0]) = dxyz[0]; (sys_pfmg_data -> dxyz[1]) = dxyz[1]; (sys_pfmg_data -> dxyz[2]) = dxyz[2]; return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SysPFMGSetLogging( void *sys_pfmg_vdata, HYPRE_Int logging) { hypre_SysPFMGData *sys_pfmg_data = (hypre_SysPFMGData *)sys_pfmg_vdata; (sys_pfmg_data -> logging) = logging; return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SysPFMGSetPrintLevel( void *sys_pfmg_vdata, HYPRE_Int print_level) { hypre_SysPFMGData *sys_pfmg_data = (hypre_SysPFMGData *)sys_pfmg_vdata; (sys_pfmg_data -> print_level) = print_level; return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SysPFMGGetNumIterations( void *sys_pfmg_vdata, HYPRE_Int *num_iterations ) { hypre_SysPFMGData *sys_pfmg_data = (hypre_SysPFMGData *)sys_pfmg_vdata; *num_iterations = (sys_pfmg_data -> num_iterations); return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SysPFMGPrintLogging( void *sys_pfmg_vdata, HYPRE_Int myid) { hypre_SysPFMGData *sys_pfmg_data = (hypre_SysPFMGData *)sys_pfmg_vdata; HYPRE_Int i; HYPRE_Int num_iterations = (sys_pfmg_data -> num_iterations); HYPRE_Int logging = (sys_pfmg_data -> logging); HYPRE_Int print_level = (sys_pfmg_data -> print_level); HYPRE_Real *norms = (sys_pfmg_data -> norms); HYPRE_Real *rel_norms = (sys_pfmg_data -> rel_norms); if (myid == 0) { if (print_level > 0 ) { if (logging > 0) { for (i = 0; i < num_iterations; i++) { hypre_printf("Residual norm[%d] = %e ", i, norms[i]); hypre_printf("Relative residual norm[%d] = %e\n", i, rel_norms[i]); } } } } return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SysPFMGGetFinalRelativeResidualNorm( void *sys_pfmg_vdata, HYPRE_Real *relative_residual_norm ) { hypre_SysPFMGData *sys_pfmg_data = (hypre_SysPFMGData *)sys_pfmg_vdata; HYPRE_Int max_iter = (sys_pfmg_data -> max_iter); HYPRE_Int num_iterations = (sys_pfmg_data -> num_iterations); HYPRE_Int logging = (sys_pfmg_data -> logging); HYPRE_Real *rel_norms = (sys_pfmg_data -> rel_norms); if (logging > 0) { if (max_iter == 0) { hypre_error_in_arg(1); } else if (num_iterations == max_iter) { *relative_residual_norm = rel_norms[num_iterations - 1]; } else { *relative_residual_norm = rel_norms[num_iterations]; } } return hypre_error_flag; } hypre-2.33.0/src/sstruct_ls/sys_pfmg.h000066400000000000000000000051551477326011500177360ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * Header info for the PFMG solver * *****************************************************************************/ #ifndef hypre_SYS_PFMG_HEADER #define hypre_SYS_PFMG_HEADER /*-------------------------------------------------------------------------- * hypre_SysPFMGData: *--------------------------------------------------------------------------*/ typedef struct { MPI_Comm comm; HYPRE_Real tol; HYPRE_Int max_iter; HYPRE_Int rel_change; HYPRE_Int zero_guess; HYPRE_Int max_levels; /* max_level <= 0 means no limit */ HYPRE_Int relax_type; /* type of relaxation to use */ HYPRE_Real jacobi_weight; /* weighted jacobi weight */ HYPRE_Int usr_jacobi_weight; /* indicator flag for user weight */ HYPRE_Int num_pre_relax; /* number of pre relaxation sweeps */ HYPRE_Int num_post_relax; /* number of post relaxation sweeps */ HYPRE_Int skip_relax; /* flag to allow skipping relaxation */ HYPRE_Real dxyz[3]; /* parameters used to determine cdir */ HYPRE_Int num_levels; HYPRE_Int *cdir_l; /* coarsening directions */ HYPRE_Int *active_l; /* flags to relax on level l*/ hypre_SStructPGrid **grid_l; hypre_SStructPGrid **P_grid_l; HYPRE_Real *data; hypre_SStructPMatrix **A_l; hypre_SStructPMatrix **P_l; hypre_SStructPMatrix **RT_l; hypre_SStructPVector **b_l; hypre_SStructPVector **x_l; /* temp vectors */ hypre_SStructPVector **tx_l; hypre_SStructPVector **r_l; hypre_SStructPVector **e_l; void **relax_data_l; void **matvec_data_l; void **restrict_data_l; void **interp_data_l; /* log info (always logged) */ HYPRE_Int num_iterations; HYPRE_Int time_index; HYPRE_Int print_level; /* additional log info (logged when `logging' > 0) */ HYPRE_Int logging; HYPRE_Real *norms; HYPRE_Real *rel_norms; } hypre_SysPFMGData; #endif hypre-2.33.0/src/sstruct_ls/sys_pfmg_relax.c000066400000000000000000000217631477326011500211270ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "_hypre_sstruct_ls.h" /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ typedef struct { void *relax_data; HYPRE_Int relax_type; HYPRE_Real jacobi_weight; } hypre_SysPFMGRelaxData; /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ void * hypre_SysPFMGRelaxCreate( MPI_Comm comm ) { hypre_SysPFMGRelaxData *sys_pfmg_relax_data; sys_pfmg_relax_data = hypre_CTAlloc(hypre_SysPFMGRelaxData, 1, HYPRE_MEMORY_HOST); (sys_pfmg_relax_data -> relax_data) = hypre_NodeRelaxCreate(comm); (sys_pfmg_relax_data -> relax_type) = 0; /* Weighted Jacobi */ return (void *) sys_pfmg_relax_data; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SysPFMGRelaxDestroy( void *sys_pfmg_relax_vdata ) { hypre_SysPFMGRelaxData *sys_pfmg_relax_data = (hypre_SysPFMGRelaxData *)sys_pfmg_relax_vdata; if (sys_pfmg_relax_data) { hypre_NodeRelaxDestroy(sys_pfmg_relax_data -> relax_data); hypre_TFree(sys_pfmg_relax_data, HYPRE_MEMORY_HOST); } return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SysPFMGRelax( void *sys_pfmg_relax_vdata, hypre_SStructPMatrix *A, hypre_SStructPVector *b, hypre_SStructPVector *x ) { hypre_SysPFMGRelaxData *sys_pfmg_relax_data = (hypre_SysPFMGRelaxData *)sys_pfmg_relax_vdata; hypre_NodeRelax((sys_pfmg_relax_data -> relax_data), A, b, x); return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SysPFMGRelaxSetup( void *sys_pfmg_relax_vdata, hypre_SStructPMatrix *A, hypre_SStructPVector *b, hypre_SStructPVector *x ) { hypre_SysPFMGRelaxData *sys_pfmg_relax_data = (hypre_SysPFMGRelaxData *)sys_pfmg_relax_vdata; void *relax_data = (sys_pfmg_relax_data -> relax_data); HYPRE_Int relax_type = (sys_pfmg_relax_data -> relax_type); HYPRE_Real jacobi_weight = (sys_pfmg_relax_data -> jacobi_weight); if (relax_type == 1) { hypre_NodeRelaxSetWeight(relax_data, jacobi_weight); } hypre_NodeRelaxSetup((sys_pfmg_relax_data -> relax_data), A, b, x); return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SysPFMGRelaxSetType( void *sys_pfmg_relax_vdata, HYPRE_Int relax_type ) { hypre_SysPFMGRelaxData *sys_pfmg_relax_data = (hypre_SysPFMGRelaxData *)sys_pfmg_relax_vdata; void *relax_data = (sys_pfmg_relax_data -> relax_data); (sys_pfmg_relax_data -> relax_type) = relax_type; switch (relax_type) { case 0: /* Jacobi */ { hypre_Index stride; hypre_Index indices[1]; hypre_NodeRelaxSetWeight(relax_data, 1.0); hypre_NodeRelaxSetNumNodesets(relax_data, 1); hypre_SetIndex3(stride, 1, 1, 1); hypre_SetIndex3(indices[0], 0, 0, 0); hypre_NodeRelaxSetNodeset(relax_data, 0, 1, stride, indices); } break; case 2: /* Red-Black Gauss-Seidel */ { hypre_Index stride; hypre_Index indices[4]; hypre_NodeRelaxSetNumNodesets(relax_data, 2); hypre_SetIndex3(stride, 2, 2, 2); /* define red points (point set 0) */ hypre_SetIndex3(indices[0], 1, 0, 0); hypre_SetIndex3(indices[1], 0, 1, 0); hypre_SetIndex3(indices[2], 0, 0, 1); hypre_SetIndex3(indices[3], 1, 1, 1); hypre_NodeRelaxSetNodeset(relax_data, 0, 4, stride, indices); /* define black points (point set 1) */ hypre_SetIndex3(indices[0], 0, 0, 0); hypre_SetIndex3(indices[1], 1, 1, 0); hypre_SetIndex3(indices[2], 1, 0, 1); hypre_SetIndex3(indices[3], 0, 1, 1); hypre_NodeRelaxSetNodeset(relax_data, 1, 4, stride, indices); } break; } return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SysPFMGRelaxSetJacobiWeight(void *sys_pfmg_relax_vdata, HYPRE_Real weight) { hypre_SysPFMGRelaxData *sys_pfmg_relax_data = (hypre_SysPFMGRelaxData *)sys_pfmg_relax_vdata; (sys_pfmg_relax_data -> jacobi_weight) = weight; return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SysPFMGRelaxSetPreRelax( void *sys_pfmg_relax_vdata ) { hypre_SysPFMGRelaxData *sys_pfmg_relax_data = (hypre_SysPFMGRelaxData *)sys_pfmg_relax_vdata; void *relax_data = (sys_pfmg_relax_data -> relax_data); HYPRE_Int relax_type = (sys_pfmg_relax_data -> relax_type); switch (relax_type) { case 1: /* Weighted Jacobi */ case 0: /* Jacobi */ break; case 2: /* Red-Black Gauss-Seidel */ { hypre_NodeRelaxSetNodesetRank(relax_data, 0, 0); hypre_NodeRelaxSetNodesetRank(relax_data, 1, 1); } break; } return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SysPFMGRelaxSetPostRelax( void *sys_pfmg_relax_vdata ) { hypre_SysPFMGRelaxData *sys_pfmg_relax_data = (hypre_SysPFMGRelaxData *)sys_pfmg_relax_vdata; void *relax_data = (sys_pfmg_relax_data -> relax_data); HYPRE_Int relax_type = (sys_pfmg_relax_data -> relax_type); switch (relax_type) { case 1: /* Weighted Jacobi */ case 0: /* Jacobi */ break; case 2: /* Red-Black Gauss-Seidel */ { hypre_NodeRelaxSetNodesetRank(relax_data, 0, 1); hypre_NodeRelaxSetNodesetRank(relax_data, 1, 0); } break; } return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SysPFMGRelaxSetTol( void *sys_pfmg_relax_vdata, HYPRE_Real tol ) { hypre_SysPFMGRelaxData *sys_pfmg_relax_data = (hypre_SysPFMGRelaxData *)sys_pfmg_relax_vdata; hypre_NodeRelaxSetTol((sys_pfmg_relax_data -> relax_data), tol); return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SysPFMGRelaxSetMaxIter( void *sys_pfmg_relax_vdata, HYPRE_Int max_iter ) { hypre_SysPFMGRelaxData *sys_pfmg_relax_data = (hypre_SysPFMGRelaxData *)sys_pfmg_relax_vdata; hypre_NodeRelaxSetMaxIter((sys_pfmg_relax_data -> relax_data), max_iter); return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SysPFMGRelaxSetZeroGuess( void *sys_pfmg_relax_vdata, HYPRE_Int zero_guess ) { hypre_SysPFMGRelaxData *sys_pfmg_relax_data = (hypre_SysPFMGRelaxData *)sys_pfmg_relax_vdata; hypre_NodeRelaxSetZeroGuess((sys_pfmg_relax_data -> relax_data), zero_guess); return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SysPFMGRelaxSetTempVec( void *sys_pfmg_relax_vdata, hypre_SStructPVector *t ) { hypre_SysPFMGRelaxData *sys_pfmg_relax_data = (hypre_SysPFMGRelaxData *)sys_pfmg_relax_vdata; hypre_NodeRelaxSetTempVec((sys_pfmg_relax_data -> relax_data), t); return hypre_error_flag; } hypre-2.33.0/src/sstruct_ls/sys_pfmg_setup.c000066400000000000000000000504161477326011500211510ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "_hypre_sstruct_ls.h" #include "sys_pfmg.h" #define DEBUG 0 #define hypre_PFMGSetCIndex(cdir, cindex) \ { \ hypre_SetIndex3(cindex, 0, 0, 0); \ hypre_IndexD(cindex, cdir) = 0; \ } #define hypre_PFMGSetFIndex(cdir, findex) \ { \ hypre_SetIndex3(findex, 0, 0, 0); \ hypre_IndexD(findex, cdir) = 1; \ } #define hypre_PFMGSetStride(cdir, stride) \ { \ hypre_SetIndex3(stride, 1, 1, 1); \ hypre_IndexD(stride, cdir) = 2; \ } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SysPFMGSetup( void *sys_pfmg_vdata, hypre_SStructMatrix *A_in, hypre_SStructVector *b_in, hypre_SStructVector *x_in ) { hypre_SysPFMGData *sys_pfmg_data = (hypre_SysPFMGData *)sys_pfmg_vdata; MPI_Comm comm = (sys_pfmg_data -> comm); hypre_SStructPMatrix *A; hypre_SStructPVector *b; hypre_SStructPVector *x; HYPRE_Int relax_type = (sys_pfmg_data -> relax_type); HYPRE_Int usr_jacobi_weight = (sys_pfmg_data -> usr_jacobi_weight); HYPRE_Real jacobi_weight = (sys_pfmg_data -> jacobi_weight); HYPRE_Int skip_relax = (sys_pfmg_data -> skip_relax); HYPRE_Real *dxyz = (sys_pfmg_data -> dxyz); HYPRE_Int max_iter; HYPRE_Int max_levels; HYPRE_Int num_levels; hypre_Index cindex; hypre_Index findex; hypre_Index stride; hypre_Index coarsen; HYPRE_Int *cdir_l; HYPRE_Int *active_l; hypre_SStructPGrid **grid_l; hypre_SStructPGrid **P_grid_l; hypre_SStructPMatrix **A_l; hypre_SStructPMatrix **P_l; hypre_SStructPMatrix **RT_l; hypre_SStructPVector **b_l; hypre_SStructPVector **x_l; /* temp vectors */ hypre_SStructPVector **tx_l; hypre_SStructPVector **r_l; hypre_SStructPVector **e_l; void **relax_data_l; void **matvec_data_l; void **restrict_data_l; void **interp_data_l; hypre_SStructPGrid *grid; hypre_StructGrid *sgrid; HYPRE_Int dim; HYPRE_Int full_periodic; hypre_Box *cbox; HYPRE_Real *relax_weights; HYPRE_Real *mean, *deviation; HYPRE_Real alpha, beta; HYPRE_Int dxyz_flag; HYPRE_Real min_dxyz; HYPRE_Int cdir, periodic, cmaxsize; HYPRE_Int d, l; HYPRE_Int i; HYPRE_Real** sys_dxyz; HYPRE_Int nvars; #if DEBUG char filename[255]; #endif /*----------------------------------------------------- * Refs to A,x,b (the PMatrix & PVectors within * the input SStructMatrix & SStructVectors) *-----------------------------------------------------*/ hypre_SStructPMatrixRef(hypre_SStructMatrixPMatrix(A_in, 0), &A); hypre_SStructPVectorRef(hypre_SStructVectorPVector(b_in, 0), &b); hypre_SStructPVectorRef(hypre_SStructVectorPVector(x_in, 0), &x); /*-------------------------------------------------------- * Allocate arrays for mesh sizes for each diagonal block *--------------------------------------------------------*/ nvars = hypre_SStructPMatrixNVars(A); sys_dxyz = hypre_TAlloc(HYPRE_Real *, nvars, HYPRE_MEMORY_HOST); for ( i = 0; i < nvars; i++) { sys_dxyz[i] = hypre_TAlloc(HYPRE_Real, 3, HYPRE_MEMORY_HOST); } /*----------------------------------------------------- * Set up coarse grids *-----------------------------------------------------*/ grid = hypre_SStructPMatrixPGrid(A); sgrid = hypre_SStructPGridSGrid(grid, 0); dim = hypre_StructGridNDim(sgrid); /* Compute a new max_levels value based on the grid */ cbox = hypre_BoxDuplicate(hypre_StructGridBoundingBox(sgrid)); max_levels = hypre_Log2(hypre_BoxSizeD(cbox, 0)) + 2 + hypre_Log2(hypre_BoxSizeD(cbox, 1)) + 2 + hypre_Log2(hypre_BoxSizeD(cbox, 2)) + 2; if ((sys_pfmg_data -> max_levels) > 0) { max_levels = hypre_min(max_levels, (sys_pfmg_data -> max_levels)); } (sys_pfmg_data -> max_levels) = max_levels; /* compute dxyz */ dxyz_flag = 0; if ((dxyz[0] == 0) || (dxyz[1] == 0) || (dxyz[2] == 0)) { mean = hypre_CTAlloc(HYPRE_Real, 3, HYPRE_MEMORY_HOST); deviation = hypre_CTAlloc(HYPRE_Real, 3, HYPRE_MEMORY_HOST); dxyz_flag = 0; for (i = 0; i < nvars; i++) { hypre_PFMGComputeDxyz(hypre_SStructPMatrixSMatrix(A, i, i), sys_dxyz[i], mean, deviation); /* signal flag if any of the flag has a large (square) coeff. of * variation */ if (!dxyz_flag) { for (d = 0; d < dim; d++) { deviation[d] -= mean[d] * mean[d]; /* square of coeff. of variation */ if (deviation[d] / (mean[d]*mean[d]) > .1) { dxyz_flag = 1; break; } } } for (d = 0; d < 3; d++) { dxyz[d] += sys_dxyz[i][d]; } } hypre_TFree(mean, HYPRE_MEMORY_HOST); hypre_TFree(deviation, HYPRE_MEMORY_HOST); } grid_l = hypre_TAlloc(hypre_SStructPGrid *, max_levels, HYPRE_MEMORY_HOST); grid_l[0] = grid; P_grid_l = hypre_TAlloc(hypre_SStructPGrid *, max_levels, HYPRE_MEMORY_HOST); P_grid_l[0] = NULL; cdir_l = hypre_TAlloc(HYPRE_Int, max_levels, HYPRE_MEMORY_HOST); active_l = hypre_TAlloc(HYPRE_Int, max_levels, HYPRE_MEMORY_HOST); relax_weights = hypre_CTAlloc(HYPRE_Real, max_levels, HYPRE_MEMORY_HOST); hypre_SetIndex3(coarsen, 1, 1, 1); /* forces relaxation on finest grid */ for (l = 0; ; l++) { /* determine cdir */ min_dxyz = dxyz[0] + dxyz[1] + dxyz[2] + 1; cdir = -1; alpha = 0.0; for (d = 0; d < dim; d++) { if ((hypre_BoxIMaxD(cbox, d) > hypre_BoxIMinD(cbox, d)) && (dxyz[d] < min_dxyz)) { min_dxyz = dxyz[d]; cdir = d; } alpha += 1.0 / (dxyz[d] * dxyz[d]); } relax_weights[l] = 2.0 / 3.0; /* If it's possible to coarsen, change relax_weights */ beta = 0.0; if (cdir != -1) { if (dxyz_flag) { relax_weights[l] = 2.0 / 3.0; } else { for (d = 0; d < dim; d++) { if (d != cdir) { beta += 1.0 / (dxyz[d] * dxyz[d]); } } if (beta == alpha) { alpha = 0.0; } else { alpha = beta / alpha; } /* determine level Jacobi weights */ if (dim > 1) { relax_weights[l] = 2.0 / (3.0 - alpha); } else { relax_weights[l] = 2.0 / 3.0; /* always 2/3 for 1-d */ } } } if (cdir != -1) { /* don't coarsen if a periodic direction and not divisible by 2 */ periodic = hypre_IndexD(hypre_StructGridPeriodic(grid_l[l]), cdir); if ((periodic) && (periodic % 2)) { cdir = -1; } /* don't coarsen if we've reached max_levels */ if (l == (max_levels - 1)) { cdir = -1; } } /* stop coarsening */ if (cdir == -1) { active_l[l] = 1; /* forces relaxation on coarsest grid */ cmaxsize = 0; for (d = 0; d < dim; d++) { cmaxsize = hypre_max(cmaxsize, hypre_BoxSizeD(cbox, d)); } break; } cdir_l[l] = cdir; if (hypre_IndexD(coarsen, cdir) != 0) { /* coarsened previously in this direction, relax level l */ active_l[l] = 1; hypre_SetIndex3(coarsen, 0, 0, 0); hypre_IndexD(coarsen, cdir) = 1; } else { active_l[l] = 0; hypre_IndexD(coarsen, cdir) = 1; } /* set cindex, findex, and stride */ hypre_PFMGSetCIndex(cdir, cindex); hypre_PFMGSetFIndex(cdir, findex); hypre_PFMGSetStride(cdir, stride); /* update dxyz and coarsen cbox*/ dxyz[cdir] *= 2; hypre_ProjectBox(cbox, cindex, stride); hypre_StructMapFineToCoarse(hypre_BoxIMin(cbox), cindex, stride, hypre_BoxIMin(cbox)); hypre_StructMapFineToCoarse(hypre_BoxIMax(cbox), cindex, stride, hypre_BoxIMax(cbox)); /* build the interpolation grid */ hypre_SysStructCoarsen(grid_l[l], findex, stride, 0, &P_grid_l[l + 1]); /* build the coarse grid */ hypre_SysStructCoarsen(grid_l[l], cindex, stride, 1, &grid_l[l + 1]); } num_levels = l + 1; /*----------------------------------------------------- * For fully periodic problems, the coarsest grid * problem (a single node) can have zero diagonal * blocks. This causes problems with the gselim * routine (which doesn't do pivoting). We avoid * this by skipping relaxation. *-----------------------------------------------------*/ full_periodic = 1; for (d = 0; d < dim; d++) { full_periodic *= hypre_IndexD(hypre_SStructPGridPeriodic(grid), d); } if ( full_periodic != 0) { hypre_SStructPGridDestroy(grid_l[num_levels - 1]); hypre_SStructPGridDestroy(P_grid_l[num_levels - 1]); num_levels -= 1; } /* free up some things */ hypre_BoxDestroy(cbox); for ( i = 0; i < nvars; i++) { hypre_TFree(sys_dxyz[i], HYPRE_MEMORY_HOST); } hypre_TFree(sys_dxyz, HYPRE_MEMORY_HOST); /* set all levels active if skip_relax = 0 */ if (!skip_relax) { for (l = 0; l < num_levels; l++) { active_l[l] = 1; } } (sys_pfmg_data -> num_levels) = num_levels; (sys_pfmg_data -> cdir_l) = cdir_l; (sys_pfmg_data -> active_l) = active_l; (sys_pfmg_data -> grid_l) = grid_l; (sys_pfmg_data -> P_grid_l) = P_grid_l; /*----------------------------------------------------- * Set up matrix and vector structures *-----------------------------------------------------*/ A_l = hypre_TAlloc(hypre_SStructPMatrix *, num_levels, HYPRE_MEMORY_HOST); P_l = hypre_TAlloc(hypre_SStructPMatrix *, num_levels - 1, HYPRE_MEMORY_HOST); RT_l = hypre_TAlloc(hypre_SStructPMatrix *, num_levels - 1, HYPRE_MEMORY_HOST); b_l = hypre_TAlloc(hypre_SStructPVector *, num_levels, HYPRE_MEMORY_HOST); x_l = hypre_TAlloc(hypre_SStructPVector *, num_levels, HYPRE_MEMORY_HOST); tx_l = hypre_TAlloc(hypre_SStructPVector *, num_levels, HYPRE_MEMORY_HOST); r_l = tx_l; e_l = tx_l; hypre_SStructPMatrixRef(A, &A_l[0]); hypre_SStructPVectorRef(b, &b_l[0]); hypre_SStructPVectorRef(x, &x_l[0]); hypre_SStructPVectorCreate(comm, grid_l[0], &tx_l[0]); hypre_SStructPVectorInitialize(tx_l[0]); for (l = 0; l < (num_levels - 1); l++) { cdir = cdir_l[l]; P_l[l] = hypre_SysPFMGCreateInterpOp(A_l[l], P_grid_l[l + 1], cdir); hypre_SStructPMatrixInitialize(P_l[l]); RT_l[l] = P_l[l]; A_l[l + 1] = hypre_SysPFMGCreateRAPOp(RT_l[l], A_l[l], P_l[l], grid_l[l + 1], cdir); hypre_SStructPMatrixInitialize(A_l[l + 1]); hypre_SStructPVectorCreate(comm, grid_l[l + 1], &b_l[l + 1]); hypre_SStructPVectorInitialize(b_l[l + 1]); hypre_SStructPVectorCreate(comm, grid_l[l + 1], &x_l[l + 1]); hypre_SStructPVectorInitialize(x_l[l + 1]); hypre_SStructPVectorCreate(comm, grid_l[l + 1], &tx_l[l + 1]); hypre_SStructPVectorInitialize(tx_l[l + 1]); } hypre_SStructPVectorAssemble(tx_l[0]); for (l = 0; l < (num_levels - 1); l++) { hypre_SStructPVectorAssemble(b_l[l + 1]); hypre_SStructPVectorAssemble(x_l[l + 1]); hypre_SStructPVectorAssemble(tx_l[l + 1]); } (sys_pfmg_data -> A_l) = A_l; (sys_pfmg_data -> P_l) = P_l; (sys_pfmg_data -> RT_l) = RT_l; (sys_pfmg_data -> b_l) = b_l; (sys_pfmg_data -> x_l) = x_l; (sys_pfmg_data -> tx_l) = tx_l; (sys_pfmg_data -> r_l) = r_l; (sys_pfmg_data -> e_l) = e_l; /*----------------------------------------------------- * Set up multigrid operators and call setup routines *-----------------------------------------------------*/ relax_data_l = hypre_TAlloc(void *, num_levels, HYPRE_MEMORY_HOST); matvec_data_l = hypre_TAlloc(void *, num_levels, HYPRE_MEMORY_HOST); restrict_data_l = hypre_TAlloc(void *, num_levels, HYPRE_MEMORY_HOST); interp_data_l = hypre_TAlloc(void *, num_levels, HYPRE_MEMORY_HOST); for (l = 0; l < (num_levels - 1); l++) { cdir = cdir_l[l]; hypre_PFMGSetCIndex(cdir, cindex); hypre_PFMGSetFIndex(cdir, findex); hypre_PFMGSetStride(cdir, stride); /* set up interpolation operator */ hypre_SysPFMGSetupInterpOp(A_l[l], cdir, findex, stride, P_l[l]); /* set up the coarse grid operator */ hypre_SysPFMGSetupRAPOp(RT_l[l], A_l[l], P_l[l], cdir, cindex, stride, A_l[l + 1]); /* set up the interpolation routine */ hypre_SysSemiInterpCreate(&interp_data_l[l]); hypre_SysSemiInterpSetup(interp_data_l[l], P_l[l], 0, x_l[l + 1], e_l[l], cindex, findex, stride); /* set up the restriction routine */ hypre_SysSemiRestrictCreate(&restrict_data_l[l]); hypre_SysSemiRestrictSetup(restrict_data_l[l], RT_l[l], 1, r_l[l], b_l[l + 1], cindex, findex, stride); } /* set up fine grid relaxation */ relax_data_l[0] = hypre_SysPFMGRelaxCreate(comm); hypre_SysPFMGRelaxSetTol(relax_data_l[0], 0.0); if (usr_jacobi_weight) { hypre_SysPFMGRelaxSetJacobiWeight(relax_data_l[0], jacobi_weight); } else { hypre_SysPFMGRelaxSetJacobiWeight(relax_data_l[0], relax_weights[0]); } hypre_SysPFMGRelaxSetType(relax_data_l[0], relax_type); hypre_SysPFMGRelaxSetTempVec(relax_data_l[0], tx_l[0]); hypre_SysPFMGRelaxSetup(relax_data_l[0], A_l[0], b_l[0], x_l[0]); if (num_levels > 1) { for (l = 1; l < num_levels; l++) { /* set relaxation parameters */ relax_data_l[l] = hypre_SysPFMGRelaxCreate(comm); hypre_SysPFMGRelaxSetTol(relax_data_l[l], 0.0); if (usr_jacobi_weight) { hypre_SysPFMGRelaxSetJacobiWeight(relax_data_l[l], jacobi_weight); } else { hypre_SysPFMGRelaxSetJacobiWeight(relax_data_l[l], relax_weights[l]); } hypre_SysPFMGRelaxSetType(relax_data_l[l], relax_type); hypre_SysPFMGRelaxSetTempVec(relax_data_l[l], tx_l[l]); } /* change coarsest grid relaxation parameters */ l = num_levels - 1; { HYPRE_Int maxwork, maxiter; hypre_SysPFMGRelaxSetType(relax_data_l[l], 0); /* do no more work on the coarsest grid than the cost of a V-cycle * (estimating roughly 4 communications per V-cycle level) */ maxwork = 4 * num_levels; /* do sweeps proportional to the coarsest grid size */ maxiter = hypre_min(maxwork, cmaxsize); #if 0 hypre_printf("maxwork = %d, cmaxsize = %d, maxiter = %d\n", maxwork, cmaxsize, maxiter); #endif hypre_SysPFMGRelaxSetMaxIter(relax_data_l[l], maxiter); } /* call relax setup */ for (l = 1; l < num_levels; l++) { hypre_SysPFMGRelaxSetup(relax_data_l[l], A_l[l], b_l[l], x_l[l]); } } hypre_TFree(relax_weights, HYPRE_MEMORY_HOST); for (l = 0; l < num_levels; l++) { /* set up the residual routine */ hypre_SStructPMatvecCreate(&matvec_data_l[l]); hypre_SStructPMatvecSetup(matvec_data_l[l], A_l[l], x_l[l]); } (sys_pfmg_data -> relax_data_l) = relax_data_l; (sys_pfmg_data -> matvec_data_l) = matvec_data_l; (sys_pfmg_data -> restrict_data_l) = restrict_data_l; (sys_pfmg_data -> interp_data_l) = interp_data_l; /*----------------------------------------------------- * Allocate space for log info *-----------------------------------------------------*/ if ((sys_pfmg_data -> logging) > 0) { max_iter = (sys_pfmg_data -> max_iter); (sys_pfmg_data -> norms) = hypre_TAlloc(HYPRE_Real, max_iter, HYPRE_MEMORY_HOST); (sys_pfmg_data -> rel_norms) = hypre_TAlloc(HYPRE_Real, max_iter, HYPRE_MEMORY_HOST); } #if DEBUG for (l = 0; l < (num_levels - 1); l++) { hypre_sprintf(filename, "zout_A.%02d", l); hypre_SStructPMatrixPrint(filename, A_l[l], 0); hypre_sprintf(filename, "zout_P.%02d", l); hypre_SStructPMatrixPrint(filename, P_l[l], 0); } hypre_sprintf(filename, "zout_A.%02d", l); hypre_SStructPMatrixPrint(filename, A_l[l], 0); #endif /*----------------------------------------------------- * Destroy Refs to A,x,b (the PMatrix & PVectors within * the input SStructMatrix & SStructVectors). *-----------------------------------------------------*/ hypre_SStructPMatrixDestroy(A); hypre_SStructPVectorDestroy(x); hypre_SStructPVectorDestroy(b); return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SysStructCoarsen( hypre_SStructPGrid *fgrid, hypre_Index index, hypre_Index stride, HYPRE_Int prune, hypre_SStructPGrid **cgrid_ptr ) { hypre_SStructPGrid *cgrid; hypre_StructGrid *sfgrid; hypre_StructGrid *scgrid; MPI_Comm comm; HYPRE_Int ndim; HYPRE_Int nvars; hypre_SStructVariable *vartypes; hypre_SStructVariable *new_vartypes; HYPRE_Int i; HYPRE_Int t; /*----------------------------------------- * Copy information from fine grid *-----------------------------------------*/ comm = hypre_SStructPGridComm(fgrid); ndim = hypre_SStructPGridNDim(fgrid); nvars = hypre_SStructPGridNVars(fgrid); vartypes = hypre_SStructPGridVarTypes(fgrid); cgrid = hypre_TAlloc(hypre_SStructPGrid, 1, HYPRE_MEMORY_HOST); hypre_SStructPGridComm(cgrid) = comm; hypre_SStructPGridNDim(cgrid) = ndim; hypre_SStructPGridNVars(cgrid) = nvars; new_vartypes = hypre_TAlloc(hypre_SStructVariable, nvars, HYPRE_MEMORY_HOST); for (i = 0; i < nvars; i++) { new_vartypes[i] = vartypes[i]; } hypre_SStructPGridVarTypes(cgrid) = new_vartypes; for (t = 0; t < 8; t++) { hypre_SStructPGridVTSGrid(cgrid, t) = NULL; hypre_SStructPGridVTIBoxArray(cgrid, t) = NULL; } /*----------------------------------------- * Set the coarse sgrid *-----------------------------------------*/ sfgrid = hypre_SStructPGridCellSGrid(fgrid); hypre_StructCoarsen(sfgrid, index, stride, prune, &scgrid); hypre_CopyIndex(hypre_StructGridPeriodic(scgrid), hypre_SStructPGridPeriodic(cgrid)); hypre_SStructPGridSetCellSGrid(cgrid, scgrid); hypre_SStructPGridPNeighbors(cgrid) = hypre_BoxArrayCreate(0, ndim); hypre_SStructPGridPNborOffsets(cgrid) = NULL; hypre_SStructPGridLocalSize(cgrid) = 0; hypre_SStructPGridGlobalSize(cgrid) = 0; hypre_SStructPGridGhlocalSize(cgrid) = 0; hypre_SStructPGridAssemble(cgrid); *cgrid_ptr = cgrid; return hypre_error_flag; } hypre-2.33.0/src/sstruct_ls/sys_pfmg_setup_interp.c000066400000000000000000000055411477326011500225310ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "_hypre_sstruct_ls.h" /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ hypre_SStructPMatrix * hypre_SysPFMGCreateInterpOp( hypre_SStructPMatrix *A, hypre_SStructPGrid *cgrid, HYPRE_Int cdir ) { hypre_SStructPMatrix *P; hypre_Index *stencil_shape; HYPRE_Int stencil_size; HYPRE_Int ndim; HYPRE_Int nvars; hypre_SStructStencil **P_stencils; HYPRE_Int i, s; /* set up stencil_shape */ stencil_size = 2; stencil_shape = hypre_CTAlloc(hypre_Index, stencil_size, HYPRE_MEMORY_HOST); for (i = 0; i < stencil_size; i++) { hypre_SetIndex3(stencil_shape[i], 0, 0, 0); } hypre_IndexD(stencil_shape[0], cdir) = -1; hypre_IndexD(stencil_shape[1], cdir) = 1; /* set up P_stencils */ ndim = hypre_StructStencilNDim(hypre_SStructPMatrixSStencil(A, 0, 0)); nvars = hypre_SStructPMatrixNVars(A); P_stencils = hypre_CTAlloc(hypre_SStructStencil *, nvars, HYPRE_MEMORY_HOST); for (s = 0; s < nvars; s++) { HYPRE_SStructStencilCreate(ndim, stencil_size, &P_stencils[s]); for (i = 0; i < stencil_size; i++) { HYPRE_SStructStencilSetEntry(P_stencils[s], i, stencil_shape[i], s); } } /* create interpolation matrix */ hypre_SStructPMatrixCreate(hypre_SStructPMatrixComm(A), cgrid, P_stencils, &P); hypre_TFree(stencil_shape, HYPRE_MEMORY_HOST); return P; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SysPFMGSetupInterpOp( hypre_SStructPMatrix *A, HYPRE_Int cdir, hypre_Index findex, hypre_Index stride, hypre_SStructPMatrix *P ) { HYPRE_Int nvars; hypre_StructMatrix *A_s; hypre_StructMatrix *P_s; HYPRE_Int vi; nvars = hypre_SStructPMatrixNVars(A); for (vi = 0; vi < nvars; vi++) { A_s = hypre_SStructPMatrixSMatrix(A, vi, vi); P_s = hypre_SStructPMatrixSMatrix(P, vi, vi); hypre_PFMGSetupInterpOp(A_s, cdir, findex, stride, P_s, 0); } return hypre_error_flag; } hypre-2.33.0/src/sstruct_ls/sys_pfmg_setup_rap.c000066400000000000000000000135141477326011500220110ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "_hypre_sstruct_ls.h" /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ hypre_SStructPMatrix * hypre_SysPFMGCreateRAPOp( hypre_SStructPMatrix *R, hypre_SStructPMatrix *A, hypre_SStructPMatrix *P, hypre_SStructPGrid *coarse_grid, HYPRE_Int cdir ) { hypre_SStructPMatrix *RAP; HYPRE_Int ndim; HYPRE_Int nvars; hypre_SStructVariable vartype; hypre_SStructStencil **RAP_stencils; hypre_StructMatrix *RAP_s; hypre_StructMatrix *R_s; hypre_StructMatrix *A_s; hypre_StructMatrix *P_s; hypre_Index **RAP_shapes; hypre_StructStencil *sstencil; hypre_Index *shape; HYPRE_Int s; HYPRE_Int *sstencil_sizes; HYPRE_Int stencil_size; hypre_StructGrid *cgrid; HYPRE_Int vi, vj; HYPRE_Int sten_cntr; HYPRE_Int P_stored_as_transpose = 0; ndim = hypre_StructStencilNDim(hypre_SStructPMatrixSStencil(A, 0, 0)); nvars = hypre_SStructPMatrixNVars(A); vartype = hypre_SStructPGridVarType(coarse_grid, 0); cgrid = hypre_SStructPGridVTSGrid(coarse_grid, vartype); RAP_stencils = hypre_CTAlloc(hypre_SStructStencil *, nvars, HYPRE_MEMORY_HOST); RAP_shapes = hypre_CTAlloc(hypre_Index *, nvars, HYPRE_MEMORY_HOST); sstencil_sizes = hypre_CTAlloc(HYPRE_Int, nvars, HYPRE_MEMORY_HOST); /*-------------------------------------------------------------------------- * Symmetry within a block is exploited, but not symmetry of the form * A_{vi,vj} = A_{vj,vi}^T. *--------------------------------------------------------------------------*/ for (vi = 0; vi < nvars; vi++) { R_s = hypre_SStructPMatrixSMatrix(R, vi, vi); stencil_size = 0; for (vj = 0; vj < nvars; vj++) { A_s = hypre_SStructPMatrixSMatrix(A, vi, vj); P_s = hypre_SStructPMatrixSMatrix(P, vj, vj); sstencil_sizes[vj] = 0; if (A_s != NULL) { RAP_s = hypre_SemiCreateRAPOp(R_s, A_s, P_s, cgrid, cdir, P_stored_as_transpose); /* Just want stencil for RAP */ hypre_StructMatrixInitializeShell(RAP_s); sstencil = hypre_StructMatrixStencil(RAP_s); shape = hypre_StructStencilShape(sstencil); sstencil_sizes[vj] = hypre_StructStencilSize(sstencil); stencil_size += sstencil_sizes[vj]; RAP_shapes[vj] = hypre_CTAlloc(hypre_Index, sstencil_sizes[vj], HYPRE_MEMORY_HOST); for (s = 0; s < sstencil_sizes[vj]; s++) { hypre_CopyIndex(shape[s], RAP_shapes[vj][s]); } hypre_StructMatrixDestroy(RAP_s); } } HYPRE_SStructStencilCreate(ndim, stencil_size, &RAP_stencils[vi]); sten_cntr = 0; for (vj = 0; vj < nvars; vj++) { if (sstencil_sizes[vj] > 0) { for (s = 0; s < sstencil_sizes[vj]; s++) { HYPRE_SStructStencilSetEntry(RAP_stencils[vi], sten_cntr, RAP_shapes[vj][s], vj); sten_cntr++; } hypre_TFree(RAP_shapes[vj], HYPRE_MEMORY_HOST); } } } /* create RAP Pmatrix */ hypre_SStructPMatrixCreate(hypre_SStructPMatrixComm(A), coarse_grid, RAP_stencils, &RAP); hypre_TFree(RAP_shapes, HYPRE_MEMORY_HOST); hypre_TFree(sstencil_sizes, HYPRE_MEMORY_HOST); return RAP; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SysPFMGSetupRAPOp( hypre_SStructPMatrix *R, hypre_SStructPMatrix *A, hypre_SStructPMatrix *P, HYPRE_Int cdir, hypre_Index cindex, hypre_Index cstride, hypre_SStructPMatrix *Ac ) { HYPRE_Int nvars; HYPRE_Int vi, vj; hypre_StructMatrix *R_s; hypre_StructMatrix *A_s; hypre_StructMatrix *P_s; hypre_StructMatrix *Ac_s; HYPRE_Int P_stored_as_transpose = 0; nvars = hypre_SStructPMatrixNVars(A); /*-------------------------------------------------------------------------- * Symmetry within a block is exploited, but not symmetry of the form * A_{vi,vj} = A_{vj,vi}^T. *--------------------------------------------------------------------------*/ for (vi = 0; vi < nvars; vi++) { R_s = hypre_SStructPMatrixSMatrix(R, vi, vi); for (vj = 0; vj < nvars; vj++) { A_s = hypre_SStructPMatrixSMatrix(A, vi, vj); Ac_s = hypre_SStructPMatrixSMatrix(Ac, vi, vj); P_s = hypre_SStructPMatrixSMatrix(P, vj, vj); if (A_s != NULL) { hypre_SemiBuildRAP(A_s, P_s, R_s, cdir, cindex, cstride, P_stored_as_transpose, Ac_s); /* Assemble here? */ hypre_StructMatrixAssemble(Ac_s); } } } return hypre_error_flag; } hypre-2.33.0/src/sstruct_ls/sys_pfmg_solve.c000066400000000000000000000266601477326011500211450ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "_hypre_sstruct_ls.h" #include "sys_pfmg.h" #define DEBUG 0 /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SysPFMGSolve( void *sys_pfmg_vdata, hypre_SStructMatrix *A_in, hypre_SStructVector *b_in, hypre_SStructVector *x_in ) { hypre_SysPFMGData *sys_pfmg_data = (hypre_SysPFMGData*)sys_pfmg_vdata; hypre_SStructPMatrix *A; hypre_SStructPVector *b; hypre_SStructPVector *x; HYPRE_Real tol = (sys_pfmg_data -> tol); HYPRE_Int max_iter = (sys_pfmg_data -> max_iter); HYPRE_Int rel_change = (sys_pfmg_data -> rel_change); HYPRE_Int zero_guess = (sys_pfmg_data -> zero_guess); HYPRE_Int num_pre_relax = (sys_pfmg_data -> num_pre_relax); HYPRE_Int num_post_relax = (sys_pfmg_data -> num_post_relax); HYPRE_Int num_levels = (sys_pfmg_data -> num_levels); hypre_SStructPMatrix **A_l = (sys_pfmg_data -> A_l); hypre_SStructPMatrix **P_l = (sys_pfmg_data -> P_l); hypre_SStructPMatrix **RT_l = (sys_pfmg_data -> RT_l); hypre_SStructPVector **b_l = (sys_pfmg_data -> b_l); hypre_SStructPVector **x_l = (sys_pfmg_data -> x_l); hypre_SStructPVector **r_l = (sys_pfmg_data -> r_l); hypre_SStructPVector **e_l = (sys_pfmg_data -> e_l); void **relax_data_l = (sys_pfmg_data -> relax_data_l); void **matvec_data_l = (sys_pfmg_data -> matvec_data_l); void **restrict_data_l = (sys_pfmg_data -> restrict_data_l); void **interp_data_l = (sys_pfmg_data -> interp_data_l); HYPRE_Int logging = (sys_pfmg_data -> logging); HYPRE_Real *norms = (sys_pfmg_data -> norms); HYPRE_Real *rel_norms = (sys_pfmg_data -> rel_norms); HYPRE_Int *active_l = (sys_pfmg_data -> active_l); HYPRE_Real b_dot_b, r_dot_r, eps = 0; HYPRE_Real e_dot_e = 0, x_dot_x = 1; HYPRE_Int i, l; #if DEBUG char filename[255]; #endif /*----------------------------------------------------- * Initialize some things and deal with special cases *-----------------------------------------------------*/ HYPRE_ANNOTATE_FUNC_BEGIN; hypre_BeginTiming(sys_pfmg_data -> time_index); /*----------------------------------------------------- * Refs to A,x,b (the PMatrix & PVectors within * the input SStructMatrix & SStructVectors) *-----------------------------------------------------*/ hypre_SStructPMatrixRef(hypre_SStructMatrixPMatrix(A_in, 0), &A); hypre_SStructPVectorRef(hypre_SStructVectorPVector(b_in, 0), &b); hypre_SStructPVectorRef(hypre_SStructVectorPVector(x_in, 0), &x); hypre_SStructPMatrixDestroy(A_l[0]); hypre_SStructPVectorDestroy(b_l[0]); hypre_SStructPVectorDestroy(x_l[0]); hypre_SStructPMatrixRef(A, &A_l[0]); hypre_SStructPVectorRef(b, &b_l[0]); hypre_SStructPVectorRef(x, &x_l[0]); (sys_pfmg_data -> num_iterations) = 0; /* if max_iter is zero, return */ if (max_iter == 0) { /* if using a zero initial guess, return zero */ if (zero_guess) { hypre_SStructPVectorSetConstantValues(x, 0.0); } hypre_EndTiming(sys_pfmg_data -> time_index); HYPRE_ANNOTATE_FUNC_END; return hypre_error_flag; } /* part of convergence check */ if (tol > 0.0) { /* eps = (tol^2) */ hypre_SStructPInnerProd(b_l[0], b_l[0], &b_dot_b); eps = tol * tol; /* if rhs is zero, return a zero solution */ if (b_dot_b == 0.0) { hypre_SStructPVectorSetConstantValues(x, 0.0); if (logging > 0) { norms[0] = 0.0; rel_norms[0] = 0.0; } hypre_EndTiming(sys_pfmg_data -> time_index); HYPRE_ANNOTATE_FUNC_END; return hypre_error_flag; } } /*----------------------------------------------------- * Do V-cycles: * For each index l, "fine" = l, "coarse" = (l+1) *-----------------------------------------------------*/ for (i = 0; i < max_iter; i++) { /*-------------------------------------------------- * Down cycle *--------------------------------------------------*/ HYPRE_ANNOTATE_MGLEVEL_BEGIN(0); /* fine grid pre-relaxation */ hypre_SysPFMGRelaxSetPreRelax(relax_data_l[0]); hypre_SysPFMGRelaxSetMaxIter(relax_data_l[0], num_pre_relax); hypre_SysPFMGRelaxSetZeroGuess(relax_data_l[0], zero_guess); hypre_SysPFMGRelax(relax_data_l[0], A_l[0], b_l[0], x_l[0]); zero_guess = 0; /* compute fine grid residual (b - Ax) */ hypre_SStructPCopy(b_l[0], r_l[0]); hypre_SStructPMatvecCompute(matvec_data_l[0], -1.0, A_l[0], x_l[0], 1.0, r_l[0]); /* convergence check */ if (tol > 0.0) { hypre_SStructPInnerProd(r_l[0], r_l[0], &r_dot_r); if (logging > 0) { norms[i] = hypre_sqrt(r_dot_r); if (b_dot_b > 0) { rel_norms[i] = hypre_sqrt(r_dot_r / b_dot_b); } else { rel_norms[i] = 0.0; } } /* always do at least 1 V-cycle */ if ((r_dot_r / b_dot_b < eps) && (i > 0)) { if ( ((rel_change) && (e_dot_e / x_dot_x) < eps) || (!rel_change) ) { HYPRE_ANNOTATE_MGLEVEL_END(0); break; } } } if (num_levels > 1) { /* restrict fine grid residual */ hypre_SysSemiRestrict(restrict_data_l[0], RT_l[0], r_l[0], b_l[1]); #if DEBUG hypre_sprintf(filename, "zout_xdown.%02d", 0); hypre_SStructPVectorPrint(filename, x_l[0], 0); hypre_sprintf(filename, "zout_rdown.%02d", 0); hypre_SStructPVectorPrint(filename, r_l[0], 0); hypre_sprintf(filename, "zout_b.%02d", 1); hypre_SStructPVectorPrint(filename, b_l[1], 0); #endif HYPRE_ANNOTATE_MGLEVEL_END(0); for (l = 1; l <= (num_levels - 2); l++) { if (active_l[l]) { HYPRE_ANNOTATE_MGLEVEL_BEGIN(l); /* pre-relaxation */ hypre_SysPFMGRelaxSetPreRelax(relax_data_l[l]); hypre_SysPFMGRelaxSetMaxIter(relax_data_l[l], num_pre_relax); hypre_SysPFMGRelaxSetZeroGuess(relax_data_l[l], 1); hypre_SysPFMGRelax(relax_data_l[l], A_l[l], b_l[l], x_l[l]); /* compute residual (b - Ax) */ hypre_SStructPCopy(b_l[l], r_l[l]); hypre_SStructPMatvecCompute(matvec_data_l[l], -1.0, A_l[l], x_l[l], 1.0, r_l[l]); } else { /* inactive level, set x=0, so r=(b-Ax)=b */ hypre_SStructPVectorSetConstantValues(x_l[l], 0.0); hypre_SStructPCopy(b_l[l], r_l[l]); } /* restrict residual */ hypre_SysSemiRestrict(restrict_data_l[l], RT_l[l], r_l[l], b_l[l + 1]); #if DEBUG hypre_sprintf(filename, "zout_xdown.%02d", l); hypre_SStructPVectorPrint(filename, x_l[l], 0); hypre_sprintf(filename, "zout_rdown.%02d", l); hypre_SStructPVectorPrint(filename, r_l[l], 0); hypre_sprintf(filename, "zout_RT.%02d", l); hypre_SStructPMatrixPrint(filename, RT_l[l], 0); hypre_sprintf(filename, "zout_b.%02d", l + 1); hypre_SStructPVectorPrint(filename, b_l[l + 1], 0); #endif HYPRE_ANNOTATE_MGLEVEL_END(l); } /*-------------------------------------------------- * Bottom *--------------------------------------------------*/ HYPRE_ANNOTATE_MGLEVEL_BEGIN(num_levels - 1); hypre_SysPFMGRelaxSetZeroGuess(relax_data_l[l], 1); hypre_SysPFMGRelax(relax_data_l[l], A_l[l], b_l[l], x_l[l]); #if DEBUG hypre_sprintf(filename, "zout_xbottom.%02d", l); hypre_SStructPVectorPrint(filename, x_l[l], 0); #endif /*-------------------------------------------------- * Up cycle *--------------------------------------------------*/ for (l = (num_levels - 2); l >= 1; l--) { /* interpolate error and correct (x = x + Pe_c) */ hypre_SysSemiInterp(interp_data_l[l], P_l[l], x_l[l + 1], e_l[l]); hypre_SStructPAxpy(1.0, e_l[l], x_l[l]); HYPRE_ANNOTATE_MGLEVEL_END(l + 1); #if DEBUG hypre_sprintf(filename, "zout_eup.%02d", l); hypre_SStructPVectorPrint(filename, e_l[l], 0); hypre_sprintf(filename, "zout_xup.%02d", l); hypre_SStructPVectorPrint(filename, x_l[l], 0); #endif HYPRE_ANNOTATE_MGLEVEL_BEGIN(l); if (active_l[l]) { /* post-relaxation */ hypre_SysPFMGRelaxSetPostRelax(relax_data_l[l]); hypre_SysPFMGRelaxSetMaxIter(relax_data_l[l], num_post_relax); hypre_SysPFMGRelaxSetZeroGuess(relax_data_l[l], 0); hypre_SysPFMGRelax(relax_data_l[l], A_l[l], b_l[l], x_l[l]); } } /* interpolate error and correct on fine grid (x = x + Pe_c) */ hypre_SysSemiInterp(interp_data_l[0], P_l[0], x_l[1], e_l[0]); hypre_SStructPAxpy(1.0, e_l[0], x_l[0]); HYPRE_ANNOTATE_MGLEVEL_END(1); #if DEBUG hypre_sprintf(filename, "zout_eup.%02d", 0); hypre_SStructPVectorPrint(filename, e_l[0], 0); hypre_sprintf(filename, "zout_xup.%02d", 0); hypre_SStructPVectorPrint(filename, x_l[0], 0); #endif HYPRE_ANNOTATE_MGLEVEL_BEGIN(0); } /* part of convergence check */ if ((tol > 0.0) && (rel_change)) { if (num_levels > 1) { hypre_SStructPInnerProd(e_l[0], e_l[0], &e_dot_e); hypre_SStructPInnerProd(x_l[0], x_l[0], &x_dot_x); } } /* fine grid post-relaxation */ hypre_SysPFMGRelaxSetPostRelax(relax_data_l[0]); hypre_SysPFMGRelaxSetMaxIter(relax_data_l[0], num_post_relax); hypre_SysPFMGRelaxSetZeroGuess(relax_data_l[0], 0); hypre_SysPFMGRelax(relax_data_l[0], A_l[0], b_l[0], x_l[0]); (sys_pfmg_data -> num_iterations) = (i + 1); HYPRE_ANNOTATE_MGLEVEL_END(0); } /*----------------------------------------------------- * Destroy Refs to A,x,b (the PMatrix & PVectors within * the input SStructMatrix & SStructVectors). *-----------------------------------------------------*/ hypre_SStructPMatrixDestroy(A); hypre_SStructPVectorDestroy(x); hypre_SStructPVectorDestroy(b); hypre_EndTiming(sys_pfmg_data -> time_index); HYPRE_ANNOTATE_FUNC_END; return hypre_error_flag; } hypre-2.33.0/src/sstruct_ls/sys_semi_interp.c000066400000000000000000000110451477326011500213110ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "_hypre_sstruct_ls.h" /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ typedef struct { HYPRE_Int nvars; void **sinterp_data; } hypre_SysSemiInterpData; /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SysSemiInterpCreate( void **sys_interp_vdata_ptr ) { hypre_SysSemiInterpData *sys_interp_data; sys_interp_data = hypre_CTAlloc(hypre_SysSemiInterpData, 1, HYPRE_MEMORY_HOST); *sys_interp_vdata_ptr = (void *) sys_interp_data; return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SysSemiInterpSetup( void *sys_interp_vdata, hypre_SStructPMatrix *P, HYPRE_Int P_stored_as_transpose, hypre_SStructPVector *xc, hypre_SStructPVector *e, hypre_Index cindex, hypre_Index findex, hypre_Index stride ) { hypre_SysSemiInterpData *sys_interp_data = (hypre_SysSemiInterpData *)sys_interp_vdata; void **sinterp_data; HYPRE_Int nvars; hypre_StructMatrix *P_s; hypre_StructVector *xc_s; hypre_StructVector *e_s; HYPRE_Int vi; nvars = hypre_SStructPMatrixNVars(P); sinterp_data = hypre_CTAlloc(void *, nvars, HYPRE_MEMORY_HOST); for (vi = 0; vi < nvars; vi++) { P_s = hypre_SStructPMatrixSMatrix(P, vi, vi); xc_s = hypre_SStructPVectorSVector(xc, vi); e_s = hypre_SStructPVectorSVector(e, vi); sinterp_data[vi] = hypre_SemiInterpCreate( ); hypre_SemiInterpSetup( sinterp_data[vi], P_s, P_stored_as_transpose, xc_s, e_s, cindex, findex, stride); } (sys_interp_data -> nvars) = nvars; (sys_interp_data -> sinterp_data) = sinterp_data; return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SysSemiInterp( void *sys_interp_vdata, hypre_SStructPMatrix *P, hypre_SStructPVector *xc, hypre_SStructPVector *e ) { hypre_SysSemiInterpData *sys_interp_data = (hypre_SysSemiInterpData *)sys_interp_vdata; void **sinterp_data = (sys_interp_data -> sinterp_data); HYPRE_Int nvars = (sys_interp_data -> nvars); void *sdata; hypre_StructMatrix *P_s; hypre_StructVector *xc_s; hypre_StructVector *e_s; HYPRE_Int vi; for (vi = 0; vi < nvars; vi++) { sdata = sinterp_data[vi]; P_s = hypre_SStructPMatrixSMatrix(P, vi, vi); xc_s = hypre_SStructPVectorSVector(xc, vi); e_s = hypre_SStructPVectorSVector(e, vi); hypre_SemiInterp(sdata, P_s, xc_s, e_s); } return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SysSemiInterpDestroy( void *sys_interp_vdata ) { hypre_SysSemiInterpData *sys_interp_data = (hypre_SysSemiInterpData *)sys_interp_vdata; HYPRE_Int nvars; void **sinterp_data; HYPRE_Int vi; if (sys_interp_data) { nvars = (sys_interp_data -> nvars); sinterp_data = (sys_interp_data -> sinterp_data); for (vi = 0; vi < nvars; vi++) { if (sinterp_data[vi] != NULL) { hypre_SemiInterpDestroy(sinterp_data[vi]); } } hypre_TFree(sinterp_data, HYPRE_MEMORY_HOST); hypre_TFree(sys_interp_data, HYPRE_MEMORY_HOST); } return hypre_error_flag; } hypre-2.33.0/src/sstruct_ls/sys_semi_restrict.c000066400000000000000000000113271477326011500216520ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "_hypre_sstruct_ls.h" /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ typedef struct { HYPRE_Int nvars; void **srestrict_data; } hypre_SysSemiRestrictData; /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SysSemiRestrictCreate( void **sys_restrict_vdata_ptr) { hypre_SysSemiRestrictData *sys_restrict_data; sys_restrict_data = hypre_CTAlloc(hypre_SysSemiRestrictData, 1, HYPRE_MEMORY_HOST); *sys_restrict_vdata_ptr = (void *) sys_restrict_data; return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SysSemiRestrictSetup( void *sys_restrict_vdata, hypre_SStructPMatrix *R, HYPRE_Int R_stored_as_transpose, hypre_SStructPVector *r, hypre_SStructPVector *rc, hypre_Index cindex, hypre_Index findex, hypre_Index stride ) { hypre_SysSemiRestrictData *sys_restrict_data = (hypre_SysSemiRestrictData *)sys_restrict_vdata; void **srestrict_data; HYPRE_Int nvars; hypre_StructMatrix *R_s; hypre_StructVector *rc_s; hypre_StructVector *r_s; HYPRE_Int vi; nvars = hypre_SStructPMatrixNVars(R); srestrict_data = hypre_CTAlloc(void *, nvars, HYPRE_MEMORY_HOST); for (vi = 0; vi < nvars; vi++) { R_s = hypre_SStructPMatrixSMatrix(R, vi, vi); rc_s = hypre_SStructPVectorSVector(rc, vi); r_s = hypre_SStructPVectorSVector(r, vi); srestrict_data[vi] = hypre_SemiRestrictCreate( ); hypre_SemiRestrictSetup( srestrict_data[vi], R_s, R_stored_as_transpose, r_s, rc_s, cindex, findex, stride); } (sys_restrict_data -> nvars) = nvars; (sys_restrict_data -> srestrict_data) = srestrict_data; return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SysSemiRestrict( void *sys_restrict_vdata, hypre_SStructPMatrix *R, hypre_SStructPVector *r, hypre_SStructPVector *rc ) { hypre_SysSemiRestrictData *sys_restrict_data = (hypre_SysSemiRestrictData *)sys_restrict_vdata; void **srestrict_data = (sys_restrict_data -> srestrict_data); HYPRE_Int nvars = (sys_restrict_data -> nvars); void *sdata; hypre_StructMatrix *R_s; hypre_StructVector *rc_s; hypre_StructVector *r_s; HYPRE_Int vi; for (vi = 0; vi < nvars; vi++) { sdata = srestrict_data[vi]; R_s = hypre_SStructPMatrixSMatrix(R, vi, vi); rc_s = hypre_SStructPVectorSVector(rc, vi); r_s = hypre_SStructPVectorSVector(r, vi); hypre_SemiRestrict(sdata, R_s, r_s, rc_s); } return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SysSemiRestrictDestroy( void *sys_restrict_vdata ) { hypre_SysSemiRestrictData *sys_restrict_data = (hypre_SysSemiRestrictData *)sys_restrict_vdata; HYPRE_Int nvars; void **srestrict_data; HYPRE_Int vi; if (sys_restrict_data) { nvars = (sys_restrict_data -> nvars); srestrict_data = (sys_restrict_data -> srestrict_data); for (vi = 0; vi < nvars; vi++) { if (srestrict_data[vi] != NULL) { hypre_SemiRestrictDestroy(srestrict_data[vi]); } } hypre_TFree(srestrict_data, HYPRE_MEMORY_HOST); hypre_TFree(sys_restrict_data, HYPRE_MEMORY_HOST); } return hypre_error_flag; } hypre-2.33.0/src/sstruct_mv/000077500000000000000000000000001477326011500157345ustar00rootroot00000000000000hypre-2.33.0/src/sstruct_mv/CMakeLists.txt000066400000000000000000000021001477326011500204650ustar00rootroot00000000000000# Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) set(HDRS HYPRE_sstruct_mv.h _hypre_sstruct_mv.h ) set(SRCS F90_HYPRE_sstruct_graph.c F90_HYPRE_sstruct_grid.c F90_HYPRE_sstruct_matrix.c F90_HYPRE_sstruct_stencil.c F90_HYPRE_sstruct_vector.c HYPRE_sstruct_graph.c HYPRE_sstruct_grid.c HYPRE_sstruct_matrix.c HYPRE_sstruct_stencil.c HYPRE_sstruct_vector.c sstruct_axpy.c sstruct_copy.c sstruct_graph.c sstruct_grid.c sstruct_innerprod.c sstruct_matrix.c sstruct_matvec.c sstruct_scale.c sstruct_stencil.c sstruct_vector.c ) target_sources(${PROJECT_NAME} PRIVATE ${SRCS} ${HDRS} ) if (HYPRE_USING_GPU) set(GPU_SRCS sstruct_matrix.c sstruct_vector.c ) convert_filenames_to_full_paths(GPU_SRCS) set(HYPRE_GPU_SOURCES ${HYPRE_GPU_SOURCES} ${GPU_SRCS} PARENT_SCOPE) endif () convert_filenames_to_full_paths(HDRS) set(HYPRE_HEADERS ${HYPRE_HEADERS} ${HDRS} PARENT_SCOPE) hypre-2.33.0/src/sstruct_mv/F90_HYPRE_sstruct_graph.c000066400000000000000000000136251477326011500223640ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * HYPRE_SStructGraph interface * *****************************************************************************/ #include "_hypre_sstruct_mv.h" #include "fortran.h" #ifdef __cplusplus extern "C" { #endif /*-------------------------------------------------------------------------- * HYPRE_SStructGraphCreate *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_sstructgraphcreate, HYPRE_SSTRUCTGRAPHCREATE) (hypre_F90_Comm *comm, hypre_F90_Obj *grid, hypre_F90_Obj *graph_ptr, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) (HYPRE_SStructGraphCreate( hypre_F90_PassComm (comm), hypre_F90_PassObj (HYPRE_SStructGrid, grid), hypre_F90_PassObjRef (HYPRE_SStructGraph, graph_ptr) ) ); } /*-------------------------------------------------------------------------- * HYPRE_SStructGraphDestroy *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_sstructgraphdestroy, HYPRE_SSTRUCTGRAPHDESTROY) (hypre_F90_Obj *graph, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) (HYPRE_SStructGraphDestroy( hypre_F90_PassObj (HYPRE_SStructGraph, graph) ) ); } /*-------------------------------------------------------------------------- * HYPRE_SStructGraphSetDomainGrid *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_sstructgraphsetdomaingrid, HYPRE_SSTRUCTGRAPHSETDOMAINGRID) (hypre_F90_Obj *graph, hypre_F90_Obj *domain_grid, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) (HYPRE_SStructGraphSetDomainGrid( hypre_F90_PassObj (HYPRE_SStructGraph, graph), hypre_F90_PassObj (HYPRE_SStructGrid, domain_grid) ) ); } /*-------------------------------------------------------------------------- * HYPRE_SStructGraphSetStencil *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_sstructgraphsetstencil, HYPRE_SSTRUCTGRAPHSETSTENCIL) (hypre_F90_Obj *graph, hypre_F90_Int *part, hypre_F90_Int *var, hypre_F90_Obj *stencil, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) (HYPRE_SStructGraphSetStencil( hypre_F90_PassObj (HYPRE_SStructGraph, graph), hypre_F90_PassInt (part), hypre_F90_PassInt (var), hypre_F90_PassObj (HYPRE_SStructStencil, stencil) ) ); } /*-------------------------------------------------------------------------- * HYPRE_SStructGraphSetFEM *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_sstructgraphsetfem, HYPRE_SSTRUCTGRAPHSETFEM) (hypre_F90_Obj *graph, hypre_F90_Int *part, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) (HYPRE_SStructGraphSetFEM( hypre_F90_PassObj (HYPRE_SStructGraph, graph), hypre_F90_PassInt (part) ) ); } /*-------------------------------------------------------------------------- * HYPRE_SStructGraphSetFEMSparsity *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_sstructgraphsetfemsparsity, HYPRE_SSTRUCTGRAPHSETFEMSPARSITY) (hypre_F90_Obj *graph, hypre_F90_Int *part, hypre_F90_Int *nsparse, hypre_F90_IntArray *sparsity, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) (HYPRE_SStructGraphSetFEMSparsity( hypre_F90_PassObj (HYPRE_SStructGraph, graph), hypre_F90_PassInt (part), hypre_F90_PassInt (nsparse), hypre_F90_PassIntArray (sparsity) ) ); } /*-------------------------------------------------------------------------- * HYPRE_SStructGraphAddEntries- * THIS IS FOR A NON-OVERLAPPING GRID GRAPH. *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_sstructgraphaddentries, HYPRE_SSTRUCTGRAPHADDENTRIES) (hypre_F90_Obj *graph, hypre_F90_Int *part, hypre_F90_IntArray *index, hypre_F90_Int *var, hypre_F90_Int *to_part, hypre_F90_IntArray *to_index, hypre_F90_Int *to_var, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) (HYPRE_SStructGraphAddEntries( hypre_F90_PassObj (HYPRE_SStructGraph, graph), hypre_F90_PassInt (part), hypre_F90_PassIntArray (index), hypre_F90_PassInt (var), hypre_F90_PassInt (to_part), hypre_F90_PassIntArray (to_index), hypre_F90_PassInt (to_var) ) ); } /*-------------------------------------------------------------------------- * HYPRE_SStructGraphAssemble *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_sstructgraphassemble, HYPRE_SSTRUCTGRAPHASSEMBLE) (hypre_F90_Obj *graph, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) (HYPRE_SStructGraphAssemble( hypre_F90_PassObj (HYPRE_SStructGraph, graph) ) ); } /*-------------------------------------------------------------------------- * HYPRE_SStructGraphSetObjectType *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_sstructgraphsetobjecttype, HYPRE_SSTRUCTGRAPHSETOBJECTTYPE) (hypre_F90_Obj *graph, hypre_F90_Int *type, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) (HYPRE_SStructGraphSetObjectType( hypre_F90_PassObj (HYPRE_SStructGraph, graph), hypre_F90_PassInt (type) ) ); } #ifdef __cplusplus } #endif hypre-2.33.0/src/sstruct_mv/F90_HYPRE_sstruct_grid.c000066400000000000000000000215211477326011500222020ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * HYPRE_SStructGrid interface * *****************************************************************************/ #include "_hypre_sstruct_mv.h" #include "fortran.h" #ifdef __cplusplus extern "C" { #endif /*-------------------------------------------------------------------------- * HYPRE_SStructGridCreate *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_sstructgridcreate, HYPRE_SSTRUCTGRIDCREATE) (hypre_F90_Comm *comm, hypre_F90_Int *ndim, hypre_F90_Int *nparts, hypre_F90_ObjRef *grid_ptr, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) HYPRE_SStructGridCreate( hypre_F90_PassComm (comm), hypre_F90_PassInt (ndim), hypre_F90_PassInt (nparts), hypre_F90_PassObjRef (HYPRE_SStructGrid, grid_ptr) ); } /*-------------------------------------------------------------------------- * HYPRE_SStructGridDestroy *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_sstructgriddestroy, HYPRE_SSTRUCTGRIDDESTROY) (hypre_F90_Obj *grid, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) HYPRE_SStructGridDestroy( hypre_F90_PassObj (HYPRE_SStructGrid, grid) ); } /*-------------------------------------------------------------------------- * HYPRE_SStructGridSetExtents *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_sstructgridsetextents, HYPRE_SSTRUCTGRIDSETEXTENTS) (hypre_F90_Obj *grid, hypre_F90_Int *part, hypre_F90_IntArray *ilower, hypre_F90_IntArray *iupper, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) HYPRE_SStructGridSetExtents( hypre_F90_PassObj (HYPRE_SStructGrid, grid), hypre_F90_PassInt (part), hypre_F90_PassIntArray (ilower), hypre_F90_PassIntArray (iupper) ); } /*-------------------------------------------------------------------------- * HYPRE_SStructGridSetVariables *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_sstructgridsetvariables, HYPRE_SSTRUCTGRIDSETVARIABLES) (hypre_F90_Obj *grid, hypre_F90_Int *part, hypre_F90_Int *nvars, hypre_F90_IntArray *vartypes, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) HYPRE_SStructGridSetVariables( hypre_F90_PassObj (HYPRE_SStructGrid, grid), hypre_F90_PassInt (part), hypre_F90_PassInt (nvars), hypre_F90_PassIntArray (vartypes) ); } /*-------------------------------------------------------------------------- * HYPRE_SStructGridAddVariables *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_sstructgridaddvariables, HYPRE_SSTRUCTGRIDADDVARIABLES) (hypre_F90_Obj *grid, hypre_F90_Int *part, hypre_F90_IntArray *index, hypre_F90_Int *nvars, hypre_F90_IntArray *vartypes, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) HYPRE_SStructGridAddVariables( hypre_F90_PassObj(HYPRE_SStructGrid, grid), hypre_F90_PassInt(part), hypre_F90_PassIntArray(index), hypre_F90_PassInt(nvars), hypre_F90_PassIntArray(vartypes)); } /*-------------------------------------------------------------------------- * HYPRE_SStructGridSetFEMOrdering *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_sstructgridsetfemordering, HYPRE_SSTRUCTGRIDSETFEMORDERING) (hypre_F90_Obj *grid, hypre_F90_Int *part, hypre_F90_IntArray *ordering, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) HYPRE_SStructGridSetFEMOrdering( hypre_F90_PassObj (HYPRE_SStructGrid, grid), hypre_F90_PassInt (part), hypre_F90_PassIntArray (ordering) ); } /*-------------------------------------------------------------------------- * HYPRE_SStructGridSetNeighborPart *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_sstructgridsetneighborpart, HYPRE_SSTRUCTGRIDSETNEIGHBORPART) (hypre_F90_Obj *grid, hypre_F90_Int *part, hypre_F90_IntArray *ilower, hypre_F90_IntArray *iupper, hypre_F90_Int *nbor_part, hypre_F90_IntArray *nbor_ilower, hypre_F90_IntArray *nbor_iupper, hypre_F90_IntArray *index_map, hypre_F90_IntArray *index_dir, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) HYPRE_SStructGridSetNeighborPart( hypre_F90_PassObj (HYPRE_SStructGrid, grid), hypre_F90_PassInt (part), hypre_F90_PassIntArray (ilower), hypre_F90_PassIntArray (iupper), hypre_F90_PassInt (nbor_part), hypre_F90_PassIntArray (nbor_ilower), hypre_F90_PassIntArray (nbor_iupper), hypre_F90_PassIntArray (index_map), hypre_F90_PassIntArray (index_dir) ); } /*-------------------------------------------------------------------------- * HYPRE_SStructGridSetSharedPart *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_sstructgridsetsharedpart, HYPRE_SSTRUCTGRIDSETSHAREDPART) (hypre_F90_Obj *grid, hypre_F90_Int *part, hypre_F90_IntArray *ilower, hypre_F90_IntArray *iupper, hypre_F90_IntArray *offset, hypre_F90_Int *shared_part, hypre_F90_IntArray *shared_ilower, hypre_F90_IntArray *shared_iupper, hypre_F90_IntArray *shared_offset, hypre_F90_IntArray *index_map, hypre_F90_IntArray *index_dir, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) HYPRE_SStructGridSetSharedPart( hypre_F90_PassObj (HYPRE_SStructGrid, grid), hypre_F90_PassInt (part), hypre_F90_PassIntArray (ilower), hypre_F90_PassIntArray (iupper), hypre_F90_PassIntArray (offset), hypre_F90_PassInt (shared_part), hypre_F90_PassIntArray (shared_ilower), hypre_F90_PassIntArray (shared_iupper), hypre_F90_PassIntArray (shared_offset), hypre_F90_PassIntArray (index_map), hypre_F90_PassIntArray (index_dir) ); } /*-------------------------------------------------------------------------- * *** placeholder *** * HYPRE_SStructGridAddUnstructuredPart *--------------------------------------------------------------------------*/ #if 0 void hypre_F90_IFACE(hypre_sstructgridaddunstructure, HYPRE_SSTRUCTGRIDADDUNSTRUCTURE) (hypre_F90_Obj *grid, hypre_F90_Int *ilower, hypre_F90_Int *iupper, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) HYPRE_SStructGridAddUnstructuredPart( hypre_F90_PassObj (HYPRE_SStructGrid, grid), hypre_F90_PassInt (ilower), hypre_F90_PassInt (iupper) ); } #endif /*-------------------------------------------------------------------------- * HYPRE_SStructGridAssemble *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_sstructgridassemble, HYPRE_SSTRUCTGRIDASSEMBLE) (hypre_F90_Obj *grid, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) HYPRE_SStructGridAssemble( hypre_F90_PassObj (HYPRE_SStructGrid, grid) ); } /*-------------------------------------------------------------------------- * HYPRE_SStructGridSetPeriodic *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_sstructgridsetperiodic, HYPRE_SSTRUCTGRIDSETPERIODIC) (hypre_F90_Obj *grid, hypre_F90_Int *part, hypre_F90_IntArray *periodic, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) HYPRE_SStructGridSetPeriodic( hypre_F90_PassObj (HYPRE_SStructGrid, grid), hypre_F90_PassInt (part), hypre_F90_PassIntArray (periodic) ); } /*-------------------------------------------------------------------------- * HYPRE_SStructGridSetNumGhost *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_sstructgridsetnumghost, HYPRE_SSTRUCTGRIDSETNUMGHOST) (hypre_F90_Obj *grid, hypre_F90_IntArray *num_ghost, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) HYPRE_SStructGridSetNumGhost( hypre_F90_PassObj (HYPRE_SStructGrid, grid), hypre_F90_PassIntArray (num_ghost) ); } #ifdef __cplusplus } #endif hypre-2.33.0/src/sstruct_mv/F90_HYPRE_sstruct_matrix.c000066400000000000000000000305311477326011500225620ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * HYPRE_SStructMatrix interface * *****************************************************************************/ #include "_hypre_sstruct_mv.h" #include "fortran.h" #ifdef __cplusplus extern "C" { #endif /*-------------------------------------------------------------------------- * HYPRE_SStructMatrixCreate *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_sstructmatrixcreate, HYPRE_SSTRUCTMATRIXCREATE) (hypre_F90_Comm *comm, hypre_F90_Obj *graph, hypre_F90_Obj *matrix_ptr, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) (HYPRE_SStructMatrixCreate( hypre_F90_PassComm (comm), hypre_F90_PassObj (HYPRE_SStructGraph, graph), hypre_F90_PassObjRef (HYPRE_SStructMatrix, matrix_ptr) ) ); } /*-------------------------------------------------------------------------- * HYPRE_SStructMatrixDestroy *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_sstructmatrixdestroy, HYPRE_SSTRUCTMATRIXDESTROY) (hypre_F90_Obj *matrix, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) (HYPRE_SStructMatrixDestroy( hypre_F90_PassObj (HYPRE_SStructMatrix, matrix) )); } /*-------------------------------------------------------------------------- * HYPRE_SStructMatrixInitialize *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_sstructmatrixinitialize, HYPRE_SSTRUCTMATRIXINITIALIZE) (hypre_F90_Obj *matrix, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) (HYPRE_SStructMatrixInitialize( hypre_F90_PassObj (HYPRE_SStructMatrix, matrix) )); } /*-------------------------------------------------------------------------- * HYPRE_SStructMatrixSetValues *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_sstructmatrixsetvalues, HYPRE_SSTRUCTMATRIXSETVALUES) (hypre_F90_Obj *matrix, hypre_F90_Int *part, hypre_F90_IntArray *index, hypre_F90_Int *var, hypre_F90_Int *nentries, hypre_F90_IntArray *entries, hypre_F90_ComplexArray *values, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) (HYPRE_SStructMatrixSetValues( hypre_F90_PassObj (HYPRE_SStructMatrix, matrix), hypre_F90_PassInt (part), hypre_F90_PassIntArray (index), hypre_F90_PassInt (var), hypre_F90_PassInt (nentries), hypre_F90_PassIntArray (entries), hypre_F90_PassComplexArray (values) )); } /*-------------------------------------------------------------------------- * HYPRE_SStructMatrixAddToValues *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_sstructmatrixaddtovalues, HYPRE_SSTRUCTMATRIXADDTOVALUES) (hypre_F90_Obj *matrix, hypre_F90_Int *part, hypre_F90_IntArray *index, hypre_F90_Int *var, hypre_F90_Int *nentries, hypre_F90_IntArray *entries, hypre_F90_ComplexArray *values, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) (HYPRE_SStructMatrixAddToValues( hypre_F90_PassObj (HYPRE_SStructMatrix, matrix), hypre_F90_PassInt (part), hypre_F90_PassIntArray (index), hypre_F90_PassInt (var), hypre_F90_PassInt (nentries), hypre_F90_PassIntArray (entries), hypre_F90_PassComplexArray (values)) ); } /*-------------------------------------------------------------------------- * HYPRE_SStructMatrixAddFEMValues *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_sstructmatrixaddfemvalues, HYPRE_SSTRUCTMATRIXADDFEMVALUES) (hypre_F90_Obj *matrix, hypre_F90_Int *part, hypre_F90_IntArray *index, hypre_F90_ComplexArray *values, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) (HYPRE_SStructMatrixAddFEMValues( hypre_F90_PassObj (HYPRE_SStructMatrix, matrix), hypre_F90_PassInt (part), hypre_F90_PassIntArray (index), hypre_F90_PassComplexArray (values)) ); } /*-------------------------------------------------------------------------- * HYPRE_SStructMatrixGetValues *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_sstructmatrixgetvalues, HYPRE_SSTRUCTMATRIXGETVALUES) (hypre_F90_Obj *matrix, hypre_F90_Int *part, hypre_F90_IntArray *index, hypre_F90_Int *var, hypre_F90_Int *nentries, hypre_F90_IntArray *entries, hypre_F90_ComplexArray *values, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) (HYPRE_SStructMatrixGetValues( hypre_F90_PassObj (HYPRE_SStructMatrix, matrix), hypre_F90_PassInt (part), hypre_F90_PassIntArray (index), hypre_F90_PassInt (var), hypre_F90_PassInt (nentries), hypre_F90_PassIntArray (entries), hypre_F90_PassComplexArray (values)) ); } /*-------------------------------------------------------------------------- * HYPRE_SStructMatrixSetBoxValues *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_sstructmatrixsetboxvalues, HYPRE_SSTRUCTMATRIXSETBOXVALUES) (hypre_F90_Obj *matrix, hypre_F90_Int *part, hypre_F90_IntArray *ilower, hypre_F90_IntArray *iupper, hypre_F90_Int *var, hypre_F90_Int *nentries, hypre_F90_IntArray *entries, hypre_F90_ComplexArray *values, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) (HYPRE_SStructMatrixSetBoxValues( hypre_F90_PassObj (HYPRE_SStructMatrix, matrix), hypre_F90_PassInt (part), hypre_F90_PassIntArray (ilower), hypre_F90_PassIntArray (iupper), hypre_F90_PassInt (var), hypre_F90_PassInt (nentries), hypre_F90_PassIntArray (entries), hypre_F90_PassComplexArray (values))); } /*-------------------------------------------------------------------------- * HYPRE_SStructMatrixAddToBoxValues *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_sstructmatrixaddtoboxvalu, HYPRE_SSTRUCTMATRIXADDTOBOXVALU) (hypre_F90_Obj *matrix, hypre_F90_Int *part, hypre_F90_IntArray *ilower, hypre_F90_IntArray *iupper, hypre_F90_Int *var, hypre_F90_Int *nentries, hypre_F90_IntArray *entries, hypre_F90_ComplexArray *values, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) (HYPRE_SStructMatrixAddToBoxValues( hypre_F90_PassObj (HYPRE_SStructMatrix, matrix), hypre_F90_PassInt (part), hypre_F90_PassIntArray (ilower), hypre_F90_PassIntArray (iupper), hypre_F90_PassInt (var), hypre_F90_PassInt (nentries), hypre_F90_PassIntArray (entries), hypre_F90_PassComplexArray (values) ) ); } /*-------------------------------------------------------------------------- * HYPRE_SStructMatrixGetBoxValues *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_sstructmatrixgetboxvalues, HYPRE_SSTRUCTMATRIXGETBOXVALUES) (hypre_F90_Obj *matrix, hypre_F90_Int *part, hypre_F90_IntArray *ilower, hypre_F90_IntArray *iupper, hypre_F90_Int *var, hypre_F90_Int *nentries, hypre_F90_IntArray *entries, hypre_F90_ComplexArray *values, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) (HYPRE_SStructMatrixGetBoxValues( hypre_F90_PassObj (HYPRE_SStructMatrix, matrix), hypre_F90_PassInt (part), hypre_F90_PassIntArray (ilower), hypre_F90_PassIntArray (iupper), hypre_F90_PassInt (var), hypre_F90_PassInt (nentries), hypre_F90_PassIntArray (entries), hypre_F90_PassComplexArray (values))); } /*-------------------------------------------------------------------------- * HYPRE_SStructMatrixAssemble *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_sstructmatrixassemble, HYPRE_SSTRUCTMATRIXASSEMBLE) (hypre_F90_Obj *matrix, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) (HYPRE_SStructMatrixAssemble( hypre_F90_PassObj (HYPRE_SStructMatrix, matrix) )); } /*-------------------------------------------------------------------------- * HYPRE_SStructMatrixSetSymmetric *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_sstructmatrixsetsymmetric, HYPRE_SSTRUCTMATRIXSETSYMMETRIC) (hypre_F90_Obj *matrix, hypre_F90_Int *part, hypre_F90_Int *var, hypre_F90_Int *to_var, hypre_F90_Int *symmetric, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) (HYPRE_SStructMatrixSetSymmetric( hypre_F90_PassObj (HYPRE_SStructMatrix, matrix), hypre_F90_PassInt (part), hypre_F90_PassInt (var), hypre_F90_PassInt (to_var), hypre_F90_PassInt (symmetric) )); } /*-------------------------------------------------------------------------- * HYPRE_SStructMatrixSetNSSymmetric *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_sstructmatrixsetnssymmetr, HYPRE_SSTRUCTMATRIXSETNSSYMMETR) (hypre_F90_Obj *matrix, hypre_F90_Int *symmetric, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) (HYPRE_SStructMatrixSetNSSymmetric( hypre_F90_PassObj (HYPRE_SStructMatrix, matrix), hypre_F90_PassInt (symmetric) )); } /*-------------------------------------------------------------------------- * HYPRE_SStructMatrixSetObjectType *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_sstructmatrixsetobjecttyp, HYPRE_SSTRUCTMATRIXSETOBJECTTYP) (hypre_F90_Obj *matrix, hypre_F90_Int *type, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) (HYPRE_SStructMatrixSetObjectType( hypre_F90_PassObj (HYPRE_SStructMatrix, matrix), hypre_F90_PassInt (type) )); } /*-------------------------------------------------------------------------- * HYPRE_SStructMatrixGetObject *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_sstructmatrixgetobject, HYPRE_SSTRUCTMATRIXGETOBJECT) (hypre_F90_Obj *matrix, hypre_F90_Obj *object, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) (HYPRE_SStructMatrixGetObject( hypre_F90_PassObj (HYPRE_SStructMatrix, matrix), (void **) object )) ; } /*-------------------------------------------------------------------------- * HYPRE_SStructMatrixPrint *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_sstructmatrixprint, HYPRE_SSTRUCTMATRIXPRINT) (char *filename, hypre_F90_Obj *matrix, hypre_F90_Int *all, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) (HYPRE_SStructMatrixPrint( (char *) filename, hypre_F90_PassObj (HYPRE_SStructMatrix, matrix), hypre_F90_PassInt (all) ) ); } /*-------------------------------------------------------------------------- * HYPRE_SStructMatrixMatvec *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_sstructmatrixmatvec, HYPRE_SSTRUCTMATRIXMATVEC) (hypre_F90_Complex *alpha, hypre_F90_Obj *A, hypre_F90_Obj *x, hypre_F90_Complex *beta, hypre_F90_Obj *y, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) (HYPRE_SStructMatrixMatvec( hypre_F90_PassComplex (alpha), hypre_F90_PassObj (HYPRE_SStructMatrix, A), hypre_F90_PassObj (HYPRE_SStructVector, x), hypre_F90_PassComplex (beta), hypre_F90_PassObj (HYPRE_SStructVector, y) )) ; } #ifdef __cplusplus } #endif hypre-2.33.0/src/sstruct_mv/F90_HYPRE_sstruct_stencil.c000066400000000000000000000045331477326011500227220ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * HYPRE_SStructStencil interface * *****************************************************************************/ #include "_hypre_sstruct_mv.h" #include "fortran.h" #ifdef __cplusplus extern "C" { #endif /*-------------------------------------------------------------------------- * HYPRE_SStructStencilCreate *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_sstructstencilcreate, HYPRE_SSTRUCTSTENCILCREATE) (hypre_F90_Int *ndim, hypre_F90_Int *size, hypre_F90_Obj *stencil_ptr, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) (HYPRE_SStructStencilCreate( hypre_F90_PassInt (ndim), hypre_F90_PassInt (size), hypre_F90_PassObjRef (HYPRE_SStructStencil, stencil_ptr) ) ); } /*-------------------------------------------------------------------------- * HYPRE_SStructStencilDestroy *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_sstructstencildestroy, HYPRE_SSTRUCTSTENCILDESTROY) (hypre_F90_Obj *stencil, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) (HYPRE_SStructStencilDestroy( hypre_F90_PassObj (HYPRE_SStructStencil, stencil) ) ); } /*-------------------------------------------------------------------------- * HYPRE_SStructStencilSetEntry *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_sstructstencilsetentry, HYPRE_SSTRUCTSTENCILSETENTRY) (hypre_F90_Obj *stencil, hypre_F90_Int *entry, hypre_F90_IntArray *offset, hypre_F90_Int *var, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) (HYPRE_SStructStencilSetEntry( hypre_F90_PassObj (HYPRE_SStructStencil, stencil), hypre_F90_PassInt (entry), hypre_F90_PassIntArray (offset), hypre_F90_PassInt (var) ) ); } #ifdef __cplusplus } #endif hypre-2.33.0/src/sstruct_mv/F90_HYPRE_sstruct_vector.c000066400000000000000000000274761477326011500225760ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * HYPRE_SStructVector interface * *****************************************************************************/ #include "_hypre_sstruct_mv.h" #include "fortran.h" #ifdef __cplusplus extern "C" { #endif /*-------------------------------------------------------------------------- * HYPRE_SStructVectorCreate *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_sstructvectorcreate, HYPRE_SSTRUCTVECTORCREATE) (hypre_F90_Comm *comm, hypre_F90_Obj *grid, hypre_F90_Obj *vector_ptr, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) (HYPRE_SStructVectorCreate( hypre_F90_PassComm (comm), hypre_F90_PassObj (HYPRE_SStructGrid, grid), hypre_F90_PassObjRef (HYPRE_SStructVector, vector_ptr) ) ); } /*-------------------------------------------------------------------------- HYPRE_SStructVectorDestroy *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_sstructvectordestroy, HYPRE_SSTRUCTVECTORDESTROY) (hypre_F90_Obj *vector, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) (HYPRE_SStructVectorDestroy( hypre_F90_PassObj (HYPRE_SStructVector, vector) ) ); } /*--------------------------------------------------------- HYPRE_SStructVectorInitialize * ----------------------------------------------------------*/ void hypre_F90_IFACE(hypre_sstructvectorinitialize, HYPRE_SSTRUCTVECTORINITIALIZE) (hypre_F90_Obj *vector, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) (HYPRE_SStructVectorInitialize( hypre_F90_PassObj (HYPRE_SStructVector, vector) )); } /*-------------------------------------------------------------------------- * HYPRE_SStructVectorSetValues *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_sstructvectorsetvalues, HYPRE_SSTRUCTVECTORSETVALUES) (hypre_F90_Obj *vector, hypre_F90_Int *part, hypre_F90_IntArray *index, hypre_F90_Int *var, hypre_F90_Complex *value, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) (HYPRE_SStructVectorSetValues( hypre_F90_PassObj (HYPRE_SStructVector, vector), hypre_F90_PassInt (part), hypre_F90_PassIntArray (index), hypre_F90_PassInt (var), hypre_F90_PassComplexRef (value) ) ); } /*-------------------------------------------------------------------------- * HYPRE_SStructVectorAddToValues *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_sstructvectoraddtovalues, HYPRE_SSTRUCTVECTORADDTOVALUES) (hypre_F90_Obj *vector, hypre_F90_Int *part, hypre_F90_IntArray *index, hypre_F90_Int *var, hypre_F90_Complex *value, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) (HYPRE_SStructVectorAddToValues( hypre_F90_PassObj (HYPRE_SStructVector, vector), hypre_F90_PassInt (part), hypre_F90_PassIntArray (index), hypre_F90_PassInt (var), hypre_F90_PassComplexRef (value) ) ); } /*-------------------------------------------------------------------------- * HYPRE_SStructVectorGetValues *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_sstructvectorgetvalues, HYPRE_SSTRUCTVECTORGETVALUES) (hypre_F90_Obj *vector, hypre_F90_Int *part, hypre_F90_IntArray *index, hypre_F90_Int *var, hypre_F90_Complex *value, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) (HYPRE_SStructVectorGetValues( hypre_F90_PassObj (HYPRE_SStructVector, vector), hypre_F90_PassInt (part), hypre_F90_PassIntArray (index), hypre_F90_PassInt (var), hypre_F90_PassComplexRef (value) )); } /*-------------------------------------------------------------------------- * HYPRE_SStructVectorSetBoxValues *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_sstructvectorsetboxvalues, HYPRE_SSTRUCTVECTORSETBOXVALUES) (hypre_F90_Obj *vector, hypre_F90_Int *part, hypre_F90_IntArray *ilower, hypre_F90_IntArray *iupper, hypre_F90_Int *var, hypre_F90_ComplexArray *values, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) (HYPRE_SStructVectorSetBoxValues( hypre_F90_PassObj (HYPRE_SStructVector, vector), hypre_F90_PassInt (part), hypre_F90_PassIntArray (ilower), hypre_F90_PassIntArray (iupper), hypre_F90_PassInt (var), hypre_F90_PassComplexArray (values) ) ); } /*-------------------------------------------------------------------------- * HYPRE_SStructVectorAddToBoxValues *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_sstructvectoraddtoboxvalu, HYPRE_SSTRUCTVECTORADDTOBOXVALU) (hypre_F90_Obj *vector, hypre_F90_Int *part, hypre_F90_IntArray *ilower, hypre_F90_IntArray *iupper, hypre_F90_Int *var, hypre_F90_ComplexArray *values, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) (HYPRE_SStructVectorAddToBoxValues( hypre_F90_PassObj (HYPRE_SStructVector, vector), hypre_F90_PassInt (part), hypre_F90_PassIntArray (ilower), hypre_F90_PassIntArray (iupper), hypre_F90_PassInt (var), hypre_F90_PassComplexArray (values) ) ); } /*-------------------------------------------------------------------------- * HYPRE_SStructVectorGetBoxValues *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_sstructvectorgetboxvalues, HYPRE_SSTRUCTVECTORGETBOXVALUES) (hypre_F90_Obj *vector, hypre_F90_Int *part, hypre_F90_IntArray *ilower, hypre_F90_IntArray *iupper, hypre_F90_Int *var, hypre_F90_ComplexArray *values, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) (HYPRE_SStructVectorGetBoxValues( (HYPRE_SStructVector ) * vector, hypre_F90_PassInt (part), hypre_F90_PassIntArray (ilower), hypre_F90_PassIntArray (iupper), hypre_F90_PassInt (var), hypre_F90_PassComplexArray (values) ) ); } /*-------------------------------------------------------------------------- * HYPRE_SStructVectorAssemble *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_sstructvectorassemble, HYPRE_SSTRUCTVECTORASSEMBLE) (hypre_F90_Obj *vector, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) (HYPRE_SStructVectorAssemble( hypre_F90_PassObj (HYPRE_SStructVector, vector) )); } /*-------------------------------------------------------------------------- * HYPRE_SStructVectorGather *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_sstructvectorgather, HYPRE_SSTRUCTVECTORGATHER) (hypre_F90_Obj *vector, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) (HYPRE_SStructVectorGather( hypre_F90_PassObj (HYPRE_SStructVector, vector) )); } /*-------------------------------------------------------------------------- * HYPRE_SStructVectorSetConstantValues *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_sstructvectorsetconstantv, HYPRE_SSTRUCTVECTORSETCONSTANTV) (hypre_F90_Obj *vector, hypre_F90_Complex *value, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) (HYPRE_SStructVectorSetConstantValues( hypre_F90_PassObj (HYPRE_SStructVector, vector), hypre_F90_PassComplex (value))); } /*-------------------------------------------------------------------------- * HYPRE_SStructVectorSetObjectType *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_sstructvectorsetobjecttyp, HYPRE_SSTRUCTVECTORSETOBJECTTYP) (hypre_F90_Obj *vector, hypre_F90_Int *type, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) (HYPRE_SStructVectorSetObjectType( hypre_F90_PassObj (HYPRE_SStructVector, vector), hypre_F90_PassInt (type) )); } /*-------------------------------------------------------------------------- * HYPRE_SStructVectorGetObject *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_sstructvectorgetobject, HYPRE_SSTRUCTVECTORGETOBJECT) (hypre_F90_Obj *vector, hypre_F90_Obj *object, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) (HYPRE_SStructVectorGetObject( hypre_F90_PassObj (HYPRE_SStructVector, vector), (void **) object )); } /*-------------------------------------------------------------------------- * HYPRE_SStructVectorPrint *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_sstructvectorprint, HYPRE_SSTRUCTVECTORPRINT) (char *filename, hypre_F90_Obj *vector, hypre_F90_Int *all, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) (HYPRE_SStructVectorPrint( (char * ) filename, hypre_F90_PassObj (HYPRE_SStructVector, vector), hypre_F90_PassInt (all) ) ); } /*-------------------------------------------------------------------------- * HYPRE_SStructVectorCopy *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_sstructvectorcopy, HYPRE_SSTRUCTVECTORCOPY) (hypre_F90_Obj *x, hypre_F90_Obj *y, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) (HYPRE_SStructVectorCopy( hypre_F90_PassObj (HYPRE_SStructVector, x), hypre_F90_PassObj (HYPRE_SStructVector, y) ) ); } /*-------------------------------------------------------------------------- * HYPRE_SStructVectorScale *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_sstructvectorscale, HYPRE_SSTRUCTVECTORSCALE) (hypre_F90_Complex *alpha, hypre_F90_Obj *y, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) (HYPRE_SStructVectorScale( hypre_F90_PassComplex (alpha), hypre_F90_PassObj (HYPRE_SStructVector, y) ) ); } /*-------------------------------------------------------------------------- * HYPRE_SStructInnerProd *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_sstructinnerprod, HYPRE_SSTRUCTINNERPROD) (hypre_F90_Obj *x, hypre_F90_Obj *y, hypre_F90_Complex *result, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) (HYPRE_SStructInnerProd( hypre_F90_PassObj (HYPRE_SStructVector, x), hypre_F90_PassObj (HYPRE_SStructVector, y), hypre_F90_PassComplexRef (result) ) ); } /*-------------------------------------------------------------------------- * HYPRE_SStructAxpy *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_sstructaxpy, HYPRE_SSTRUCTAXPY) (hypre_F90_Complex *alpha, hypre_F90_Obj *x, hypre_F90_Obj *y, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) (HYPRE_SStructAxpy( hypre_F90_PassComplex (alpha), hypre_F90_PassObj (HYPRE_SStructVector, x), hypre_F90_PassObj (HYPRE_SStructVector, y) ) ); } #ifdef __cplusplus } #endif hypre-2.33.0/src/sstruct_mv/HYPRE_sstruct_graph.c000066400000000000000000001063671477326011500217540ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * HYPRE_SStructGraph interface * *****************************************************************************/ #include "_hypre_sstruct_mv.h" /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_SStructGraphCreate( MPI_Comm comm, HYPRE_SStructGrid grid, HYPRE_SStructGraph *graph_ptr ) { hypre_SStructGraph *graph; HYPRE_Int nparts; hypre_SStructStencil ***stencils; hypre_SStructPGrid **pgrids; HYPRE_Int *fem_nsparse; HYPRE_Int **fem_sparse_i; HYPRE_Int **fem_sparse_j; HYPRE_Int **fem_entries; HYPRE_Int nvars; HYPRE_Int part, var; graph = hypre_TAlloc(hypre_SStructGraph, 1, HYPRE_MEMORY_HOST); hypre_SStructGraphComm(graph) = comm; hypre_SStructGraphNDim(graph) = hypre_SStructGridNDim(grid); hypre_SStructGridRef(grid, &hypre_SStructGraphGrid(graph)); hypre_SStructGridRef(grid, &hypre_SStructGraphDomainGrid(graph)); nparts = hypre_SStructGridNParts(grid); hypre_SStructGraphNParts(graph) = nparts; pgrids = hypre_SStructGridPGrids(grid); stencils = hypre_TAlloc(hypre_SStructStencil **, nparts, HYPRE_MEMORY_HOST); fem_nsparse = hypre_TAlloc(HYPRE_Int, nparts, HYPRE_MEMORY_HOST); fem_sparse_i = hypre_TAlloc(HYPRE_Int *, nparts, HYPRE_MEMORY_HOST); fem_sparse_j = hypre_TAlloc(HYPRE_Int *, nparts, HYPRE_MEMORY_HOST); fem_entries = hypre_TAlloc(HYPRE_Int *, nparts, HYPRE_MEMORY_HOST); for (part = 0; part < nparts; part++) { nvars = hypre_SStructPGridNVars(pgrids[part]); stencils[part] = hypre_TAlloc(hypre_SStructStencil *, nvars, HYPRE_MEMORY_HOST); fem_nsparse[part] = 0; fem_sparse_i[part] = NULL; fem_sparse_j[part] = NULL; fem_entries[part] = NULL; for (var = 0; var < nvars; var++) { stencils[part][var] = NULL; } } hypre_SStructGraphStencils(graph) = stencils; hypre_SStructGraphFEMNSparse(graph) = fem_nsparse; hypre_SStructGraphFEMSparseJ(graph) = fem_sparse_i; hypre_SStructGraphFEMSparseI(graph) = fem_sparse_j; hypre_SStructGraphFEMEntries(graph) = fem_entries; hypre_SStructGraphNUVEntries(graph) = 0; hypre_SStructGraphIUVEntries(graph) = NULL; hypre_SStructGraphUVEntries(graph) = NULL; hypre_SStructGraphUVESize(graph) = 0; hypre_SStructGraphUEMaxSize(graph) = 0; hypre_SStructGraphUVEOffsets(graph) = NULL; hypre_SStructGraphRefCount(graph) = 1; hypre_SStructGraphObjectType(graph) = HYPRE_SSTRUCT; hypre_SStructGraphEntries(graph) = NULL; hypre_SStructNGraphEntries(graph) = 0; hypre_SStructAGraphEntries(graph) = 0; *graph_ptr = graph; return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_SStructGraphDestroy( HYPRE_SStructGraph graph ) { HYPRE_Int nparts; hypre_SStructPGrid **pgrids; hypre_SStructStencil ***stencils; HYPRE_Int *fem_nsparse; HYPRE_Int **fem_sparse_i; HYPRE_Int **fem_sparse_j; HYPRE_Int **fem_entries; HYPRE_Int nUventries; HYPRE_Int *iUventries; hypre_SStructUVEntry **Uventries; hypre_SStructUVEntry *Uventry; HYPRE_BigInt **Uveoffsets; hypre_SStructGraphEntry **graph_entries; HYPRE_Int nvars; HYPRE_Int part, var, i; if (graph) { hypre_SStructGraphRefCount(graph) --; if (hypre_SStructGraphRefCount(graph) == 0) { nparts = hypre_SStructGraphNParts(graph); pgrids = hypre_SStructGraphPGrids(graph); stencils = hypre_SStructGraphStencils(graph); fem_nsparse = hypre_SStructGraphFEMNSparse(graph); fem_sparse_i = hypre_SStructGraphFEMSparseJ(graph); fem_sparse_j = hypre_SStructGraphFEMSparseI(graph); fem_entries = hypre_SStructGraphFEMEntries(graph); nUventries = hypre_SStructGraphNUVEntries(graph); iUventries = hypre_SStructGraphIUVEntries(graph); Uventries = hypre_SStructGraphUVEntries(graph); Uveoffsets = hypre_SStructGraphUVEOffsets(graph); for (part = 0; part < nparts; part++) { nvars = hypre_SStructPGridNVars(pgrids[part]); for (var = 0; var < nvars; var++) { HYPRE_SStructStencilDestroy(stencils[part][var]); } hypre_TFree(stencils[part], HYPRE_MEMORY_HOST); hypre_TFree(fem_sparse_i[part], HYPRE_MEMORY_HOST); hypre_TFree(fem_sparse_j[part], HYPRE_MEMORY_HOST); hypre_TFree(fem_entries[part], HYPRE_MEMORY_HOST); hypre_TFree(Uveoffsets[part], HYPRE_MEMORY_HOST); } HYPRE_SStructGridDestroy(hypre_SStructGraphGrid(graph)); HYPRE_SStructGridDestroy(hypre_SStructGraphDomainGrid(graph)); hypre_TFree(stencils, HYPRE_MEMORY_HOST); hypre_TFree(fem_nsparse, HYPRE_MEMORY_HOST); hypre_TFree(fem_sparse_i, HYPRE_MEMORY_HOST); hypre_TFree(fem_sparse_j, HYPRE_MEMORY_HOST); hypre_TFree(fem_entries, HYPRE_MEMORY_HOST); /* RDF: THREAD? */ for (i = 0; i < nUventries; i++) { Uventry = Uventries[iUventries[i]]; if (Uventry) { hypre_TFree(hypre_SStructUVEntryUEntries(Uventry), HYPRE_MEMORY_HOST); hypre_TFree(Uventry, HYPRE_MEMORY_HOST); } Uventries[iUventries[i]] = NULL; } hypre_TFree(iUventries, HYPRE_MEMORY_HOST); hypre_TFree(Uventries, HYPRE_MEMORY_HOST); hypre_TFree(Uveoffsets, HYPRE_MEMORY_HOST); graph_entries = hypre_SStructGraphEntries(graph); for (i = 0; i < hypre_SStructNGraphEntries(graph); i++) { hypre_TFree(graph_entries[i], HYPRE_MEMORY_HOST); } hypre_TFree(graph_entries, HYPRE_MEMORY_HOST); hypre_TFree(graph, HYPRE_MEMORY_HOST); } } return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_SStructGraphSetDomainGrid( HYPRE_SStructGraph graph, HYPRE_SStructGrid domain_grid) { /* This should only decrement a reference counter */ HYPRE_SStructGridDestroy(hypre_SStructGraphDomainGrid(graph)); hypre_SStructGridRef(domain_grid, &hypre_SStructGraphDomainGrid(graph)); return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_SStructGraphSetStencil( HYPRE_SStructGraph graph, HYPRE_Int part, HYPRE_Int var, HYPRE_SStructStencil stencil ) { hypre_SStructStencilRef(stencil, &hypre_SStructGraphStencil(graph, part, var)); return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_SStructGraphSetFEM( HYPRE_SStructGraph graph, HYPRE_Int part ) { if (!hypre_SStructGraphFEMPNSparse(graph, part)) { hypre_SStructGraphFEMPNSparse(graph, part) = -1; } return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_SStructGraphSetFEMSparsity( HYPRE_SStructGraph graph, HYPRE_Int part, HYPRE_Int nsparse, HYPRE_Int *sparsity ) { HYPRE_Int *fem_sparse_i; HYPRE_Int *fem_sparse_j; HYPRE_Int s; hypre_SStructGraphFEMPNSparse(graph, part) = nsparse; fem_sparse_i = hypre_TAlloc(HYPRE_Int, nsparse, HYPRE_MEMORY_HOST); fem_sparse_j = hypre_TAlloc(HYPRE_Int, nsparse, HYPRE_MEMORY_HOST); for (s = 0; s < nsparse; s++) { fem_sparse_i[s] = sparsity[2 * s]; fem_sparse_j[s] = sparsity[2 * s + 1]; } hypre_SStructGraphFEMPSparseI(graph, part) = fem_sparse_i; hypre_SStructGraphFEMPSparseJ(graph, part) = fem_sparse_j; return hypre_error_flag; } /*-------------------------------------------------------------------------- * THIS IS FOR A NON-OVERLAPPING GRID GRAPH. * * Now we just keep track of calls to this function and do all the "work" * in the assemble. *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_SStructGraphAddEntries( HYPRE_SStructGraph graph, HYPRE_Int part, HYPRE_Int *index, HYPRE_Int var, HYPRE_Int to_part, HYPRE_Int *to_index, HYPRE_Int to_var ) { hypre_SStructGrid *grid = hypre_SStructGraphGrid(graph); HYPRE_Int ndim = hypre_SStructGridNDim(grid); hypre_SStructGraphEntry **entries = hypre_SStructGraphEntries(graph); hypre_SStructGraphEntry *new_entry; HYPRE_Int n_entries = hypre_SStructNGraphEntries(graph); HYPRE_Int a_entries = hypre_SStructAGraphEntries(graph); /* check storage */ if (!a_entries) { a_entries = 1000; entries = hypre_TAlloc(hypre_SStructGraphEntry *, a_entries, HYPRE_MEMORY_HOST); hypre_SStructAGraphEntries(graph) = a_entries; hypre_SStructGraphEntries(graph) = entries; } else if (n_entries >= a_entries) { a_entries += 1000; entries = hypre_TReAlloc(entries, hypre_SStructGraphEntry *, a_entries, HYPRE_MEMORY_HOST); hypre_SStructAGraphEntries(graph) = a_entries; hypre_SStructGraphEntries(graph) = entries; } /*save parameters to a new entry */ new_entry = hypre_TAlloc(hypre_SStructGraphEntry, 1, HYPRE_MEMORY_HOST); hypre_SStructGraphEntryPart(new_entry) = part; hypre_SStructGraphEntryToPart(new_entry) = to_part; hypre_SStructGraphEntryVar(new_entry) = var; hypre_SStructGraphEntryToVar(new_entry) = to_var; hypre_CopyToCleanIndex(index, ndim, hypre_SStructGraphEntryIndex(new_entry)); hypre_CopyToCleanIndex( to_index, ndim, hypre_SStructGraphEntryToIndex(new_entry)); entries[n_entries] = new_entry; /* update count */ n_entries++; hypre_SStructNGraphEntries(graph) = n_entries; return hypre_error_flag; } /*-------------------------------------------------------------------------- * This routine mainly computes the column numbers for the non-stencil * graph entries (i.e., those created by GraphAddEntries calls). *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_SStructGraphAssemble( HYPRE_SStructGraph graph ) { MPI_Comm comm = hypre_SStructGraphComm(graph); HYPRE_Int ndim = hypre_SStructGraphNDim(graph); hypre_SStructGrid *grid = hypre_SStructGraphGrid(graph); hypre_SStructGrid *dom_grid = hypre_SStructGraphDomainGrid(graph); HYPRE_Int nparts = hypre_SStructGraphNParts(graph); hypre_SStructStencil ***stencils = hypre_SStructGraphStencils(graph); HYPRE_Int nUventries; HYPRE_Int *iUventries; hypre_SStructUVEntry **Uventries; HYPRE_Int Uvesize; HYPRE_BigInt **Uveoffsets; HYPRE_Int type = hypre_SStructGraphObjectType(graph); hypre_SStructGraphEntry **add_entries = hypre_SStructGraphEntries(graph); HYPRE_Int n_add_entries = hypre_SStructNGraphEntries(graph); hypre_SStructPGrid *pgrid; hypre_StructGrid *sgrid; HYPRE_Int nvars; hypre_BoxArray *boxes; hypre_Box *box; HYPRE_Int vol, d; hypre_SStructGraphEntry *new_entry; hypre_SStructUVEntry *Uventry; HYPRE_Int nUentries; hypre_SStructUEntry *Uentries; HYPRE_Int to_part; hypre_IndexRef to_index; HYPRE_Int to_var; HYPRE_Int to_boxnum; HYPRE_Int to_proc; HYPRE_BigInt Uverank, rank; hypre_BoxManEntry *boxman_entry; HYPRE_Int nprocs, myproc; HYPRE_Int part, var; hypre_IndexRef index; HYPRE_Int i, j; /* may need to re-do box managers for the AP*/ hypre_BoxManager ***managers = hypre_SStructGridBoxManagers(grid); hypre_BoxManager ***new_managers = NULL; hypre_BoxManager *orig_boxman; hypre_BoxManager *new_boxman; HYPRE_Int global_n_add_entries; HYPRE_Int is_gather, k; hypre_BoxManEntry *all_entries, *entry; HYPRE_Int num_entries; void *info; hypre_Box *bbox, *new_box; hypre_Box ***new_gboxes, *new_gbox; HYPRE_Int *num_ghost; /*--------------------------------------------------------- * If AP, then may need to redo the box managers * * Currently using bounding boxes based on the indexes in add_entries to * determine which boxes to gather in the box managers. We refer to these * bounding boxes as "gather boxes" here (new_gboxes). This should work * well in most cases, but it does have the potential to cause lots of grid * boxes to be gathered (hence lots of communication). * * A better algorithm would use more care in computing gather boxes that * aren't "too big", while not computing "too many" either (which can also * be slow). One approach might be to compute an octree with leaves that * have the same volume as the maximum grid box volume. The leaves would * then serve as the gather boxes. The number of gather boxes would then be * on the order of the number of local grid boxes (assuming the add_entries * are local, which is generally how they should be used). *---------------------------------------------------------*/ new_box = hypre_BoxCreate(ndim); /* if any processor has added entries, then all need to participate */ hypre_MPI_Allreduce(&n_add_entries, &global_n_add_entries, 1, HYPRE_MPI_INT, hypre_MPI_SUM, comm); if (global_n_add_entries > 0 ) { /* create new managers */ new_managers = hypre_TAlloc(hypre_BoxManager **, nparts, HYPRE_MEMORY_HOST); new_gboxes = hypre_TAlloc(hypre_Box **, nparts, HYPRE_MEMORY_HOST); for (part = 0; part < nparts; part++) { pgrid = hypre_SStructGridPGrid(grid, part); nvars = hypre_SStructPGridNVars(pgrid); new_managers[part] = hypre_TAlloc(hypre_BoxManager *, nvars, HYPRE_MEMORY_HOST); new_gboxes[part] = hypre_TAlloc(hypre_Box *, nvars, HYPRE_MEMORY_HOST); for (var = 0; var < nvars; var++) { sgrid = hypre_SStructPGridSGrid(pgrid, var); orig_boxman = managers[part][var]; bbox = hypre_BoxManBoundingBox(orig_boxman); hypre_BoxManCreate(hypre_BoxManNEntries(orig_boxman), hypre_BoxManEntryInfoSize(orig_boxman), hypre_StructGridNDim(sgrid), bbox, hypre_StructGridComm(sgrid), &new_managers[part][var]); /* create gather box with flipped bounding box extents */ new_gboxes[part][var] = hypre_BoxCreate(ndim); hypre_BoxSetExtents(new_gboxes[part][var], hypre_BoxIMax(bbox), hypre_BoxIMin(bbox)); /* need to set the num ghost for new manager also */ num_ghost = hypre_StructGridNumGhost(sgrid); hypre_BoxManSetNumGhost(new_managers[part][var], num_ghost); } } /* end loop over parts */ /* now go through the local add entries */ for (j = 0; j < n_add_entries; j++) { new_entry = add_entries[j]; /* check part, var, index, to_part, to_var, to_index */ for (k = 0; k < 2; k++) { switch (k) { case 0: part = hypre_SStructGraphEntryPart(new_entry); var = hypre_SStructGraphEntryVar(new_entry); index = hypre_SStructGraphEntryIndex(new_entry); break; case 1: part = hypre_SStructGraphEntryToPart(new_entry) ; var = hypre_SStructGraphEntryToVar(new_entry); index = hypre_SStructGraphEntryToIndex(new_entry); break; } /* if the index is not within the bounds of the struct grid bounding box (which has been set in the box manager) then there should not be a coupling here (doesn't make sense) */ new_boxman = new_managers[part][var]; new_gbox = new_gboxes[part][var]; bbox = hypre_BoxManBoundingBox(new_boxman); if (hypre_IndexInBox(index, bbox) != 0) { /* compute new gather box extents based on index */ for (d = 0; d < ndim; d++) { hypre_BoxIMinD(new_gbox, d) = hypre_min(hypre_BoxIMinD(new_gbox, d), hypre_IndexD(index, d)); hypre_BoxIMaxD(new_gbox, d) = hypre_max(hypre_BoxIMaxD(new_gbox, d), hypre_IndexD(index, d)); } } } } /* Now go through the managers and if gather has been called (on any processor) then populate the new manager with the entries from the old manager and then assemble and delete the old manager. */ for (part = 0; part < nparts; part++) { pgrid = hypre_SStructGridPGrid(grid, part); nvars = hypre_SStructPGridNVars(pgrid); for (var = 0; var < nvars; var++) { new_boxman = new_managers[part][var]; new_gbox = new_gboxes[part][var]; /* call gather if non-empty gather box */ if (hypre_BoxVolume(new_gbox) > 0) { hypre_BoxManGatherEntries( new_boxman, hypre_BoxIMin(new_gbox), hypre_BoxIMax(new_gbox)); } /* check to see if gather was called by some processor */ hypre_BoxManGetGlobalIsGatherCalled(new_boxman, comm, &is_gather); if (is_gather) { /* copy orig boxman information to the new boxman*/ orig_boxman = managers[part][var]; hypre_BoxManGetAllEntries(orig_boxman, &num_entries, &all_entries); for (j = 0; j < num_entries; j++) { entry = &all_entries[j]; hypre_BoxManEntryGetInfo(entry, &info); hypre_BoxManAddEntry(new_boxman, hypre_BoxManEntryIMin(entry), hypre_BoxManEntryIMax(entry), hypre_BoxManEntryProc(entry), hypre_BoxManEntryId(entry), info); } /* call assemble for new boxmanager*/ hypre_BoxManAssemble(new_boxman); /* TEMP for testing if (hypre_BoxManNEntries(new_boxman) != num_entries) { hypre_MPI_Comm_rank(comm, &myproc); hypre_printf("myid = %d, new_entries = %d, old entries = %d\n", myproc, hypre_BoxManNEntries(new_boxman), num_entries); } */ /* destroy old manager */ hypre_BoxManDestroy (managers[part][var]); } else /* no gather called */ { /*leave the old manager (so destroy the new one) */ hypre_BoxManDestroy(new_boxman); /*copy the old to the new */ new_managers[part][var] = managers[part][var]; } hypre_BoxDestroy(new_gboxes[part][var]); } /* end of var loop */ hypre_TFree(managers[part], HYPRE_MEMORY_HOST); hypre_TFree(new_gboxes[part], HYPRE_MEMORY_HOST); } /* end of part loop */ hypre_TFree(managers, HYPRE_MEMORY_HOST); hypre_TFree(new_gboxes, HYPRE_MEMORY_HOST); /* assign the new ones */ hypre_SStructGridBoxManagers(grid) = new_managers; } /* clean up */ hypre_BoxDestroy(new_box); /* end of AP stuff */ hypre_MPI_Comm_size(comm, &nprocs); hypre_MPI_Comm_rank(comm, &myproc); /*--------------------------------------------------------- * Set up UVEntries and iUventries *---------------------------------------------------------*/ /* first set up Uvesize and Uveoffsets */ Uvesize = 0; Uveoffsets = hypre_TAlloc(HYPRE_BigInt *, nparts, HYPRE_MEMORY_HOST); for (part = 0; part < nparts; part++) { pgrid = hypre_SStructGridPGrid(grid, part); nvars = hypre_SStructPGridNVars(pgrid); Uveoffsets[part] = hypre_TAlloc(HYPRE_BigInt, nvars, HYPRE_MEMORY_HOST); for (var = 0; var < nvars; var++) { Uveoffsets[part][var] = Uvesize; sgrid = hypre_SStructPGridSGrid(pgrid, var); boxes = hypre_StructGridBoxes(sgrid); hypre_ForBoxI(i, boxes) { box = hypre_BoxArrayBox(boxes, i); vol = 1; for (d = 0; d < ndim; d++) { vol *= (hypre_BoxSizeD(box, d) + 2); } Uvesize += vol; } } } hypre_SStructGraphUVESize(graph) = Uvesize; hypre_SStructGraphUVEOffsets(graph) = Uveoffsets; /* now set up nUventries, iUventries, and Uventries */ iUventries = hypre_TAlloc(HYPRE_Int, n_add_entries, HYPRE_MEMORY_HOST); Uventries = hypre_CTAlloc(hypre_SStructUVEntry *, Uvesize, HYPRE_MEMORY_HOST); hypre_SStructGraphIUVEntries(graph) = iUventries; hypre_SStructGraphUVEntries(graph) = Uventries; nUventries = 0; /* go through each entry that was added */ for (j = 0; j < n_add_entries; j++) { new_entry = add_entries[j]; part = hypre_SStructGraphEntryPart(new_entry); var = hypre_SStructGraphEntryVar(new_entry); index = hypre_SStructGraphEntryIndex(new_entry); to_part = hypre_SStructGraphEntryToPart(new_entry) ; to_var = hypre_SStructGraphEntryToVar(new_entry); to_index = hypre_SStructGraphEntryToIndex(new_entry); /* compute location (rank) for Uventry */ hypre_SStructGraphGetUVEntryRank(graph, part, var, index, &Uverank); if (Uverank > -1) { iUventries[nUventries] = Uverank; if (Uventries[Uverank] == NULL) { Uventry = hypre_TAlloc(hypre_SStructUVEntry, 1, HYPRE_MEMORY_HOST); hypre_SStructUVEntryPart(Uventry) = part; hypre_CopyIndex(index, hypre_SStructUVEntryIndex(Uventry)); hypre_SStructUVEntryVar(Uventry) = var; hypre_SStructGridFindBoxManEntry(grid, part, index, var, &boxman_entry); hypre_SStructBoxManEntryGetGlobalRank(boxman_entry, index, &rank, type); hypre_SStructUVEntryRank(Uventry) = rank; nUentries = 1; Uentries = hypre_TAlloc(hypre_SStructUEntry, nUentries, HYPRE_MEMORY_HOST); } else { Uventry = Uventries[Uverank]; nUentries = hypre_SStructUVEntryNUEntries(Uventry) + 1; Uentries = hypre_SStructUVEntryUEntries(Uventry); Uentries = hypre_TReAlloc(Uentries, hypre_SStructUEntry, nUentries, HYPRE_MEMORY_HOST); } hypre_SStructUVEntryNUEntries(Uventry) = nUentries; hypre_SStructUVEntryUEntries(Uventry) = Uentries; hypre_SStructGraphUEMaxSize(graph) = hypre_max(hypre_SStructGraphUEMaxSize(graph), nUentries); i = nUentries - 1; hypre_SStructUVEntryToPart(Uventry, i) = to_part; hypre_CopyIndex(to_index, hypre_SStructUVEntryToIndex(Uventry, i)); hypre_SStructUVEntryToVar(Uventry, i) = to_var; hypre_SStructGridFindBoxManEntry( dom_grid, to_part, to_index, to_var, &boxman_entry); hypre_SStructBoxManEntryGetBoxnum(boxman_entry, &to_boxnum); hypre_SStructUVEntryToBoxnum(Uventry, i) = to_boxnum; hypre_SStructBoxManEntryGetProcess(boxman_entry, &to_proc); hypre_SStructUVEntryToProc(Uventry, i) = to_proc; hypre_SStructBoxManEntryGetGlobalRank( boxman_entry, to_index, &rank, type); hypre_SStructUVEntryToRank(Uventry, i) = rank; Uventries[Uverank] = Uventry; nUventries++; hypre_SStructGraphNUVEntries(graph) = nUventries; hypre_SStructGraphUVEntries(graph) = Uventries; } } /* end of loop through add entries */ /*--------------------------------------------------------- * Set up the FEM stencil information *---------------------------------------------------------*/ for (part = 0; part < nparts; part++) { /* only do this if SetFEM was called */ if (hypre_SStructGraphFEMPNSparse(graph, part)) { HYPRE_Int fem_nsparse = hypre_SStructGraphFEMPNSparse(graph, part); HYPRE_Int *fem_sparse_i = hypre_SStructGraphFEMPSparseI(graph, part); HYPRE_Int *fem_sparse_j = hypre_SStructGraphFEMPSparseJ(graph, part); HYPRE_Int *fem_entries = hypre_SStructGraphFEMPEntries(graph, part); HYPRE_Int fem_nvars = hypre_SStructGridFEMPNVars(grid, part); HYPRE_Int *fem_vars = hypre_SStructGridFEMPVars(grid, part); hypre_Index *fem_offsets = hypre_SStructGridFEMPOffsets(grid, part); hypre_Index offset; HYPRE_Int s, iv, jv, d, nvars, entry; HYPRE_Int *stencil_sizes; hypre_Index **stencil_offsets; HYPRE_Int **stencil_vars; nvars = hypre_SStructPGridNVars(hypre_SStructGridPGrid(grid, part)); /* build default full sparsity pattern if nothing set by user */ if (fem_nsparse < 0) { fem_nsparse = fem_nvars * fem_nvars; fem_sparse_i = hypre_TAlloc(HYPRE_Int, fem_nsparse, HYPRE_MEMORY_HOST); fem_sparse_j = hypre_TAlloc(HYPRE_Int, fem_nsparse, HYPRE_MEMORY_HOST); s = 0; for (i = 0; i < fem_nvars; i++) { for (j = 0; j < fem_nvars; j++) { fem_sparse_i[s] = i; fem_sparse_j[s] = j; s++; } } hypre_SStructGraphFEMPNSparse(graph, part) = fem_nsparse; hypre_SStructGraphFEMPSparseI(graph, part) = fem_sparse_i; hypre_SStructGraphFEMPSparseJ(graph, part) = fem_sparse_j; } fem_entries = hypre_CTAlloc(HYPRE_Int, fem_nsparse, HYPRE_MEMORY_HOST); hypre_SStructGraphFEMPEntries(graph, part) = fem_entries; stencil_sizes = hypre_CTAlloc(HYPRE_Int, nvars, HYPRE_MEMORY_HOST); stencil_offsets = hypre_CTAlloc(hypre_Index *, nvars, HYPRE_MEMORY_HOST); stencil_vars = hypre_CTAlloc(HYPRE_Int *, nvars, HYPRE_MEMORY_HOST); for (iv = 0; iv < nvars; iv++) { stencil_offsets[iv] = hypre_CTAlloc(hypre_Index, fem_nvars * fem_nvars, HYPRE_MEMORY_HOST); stencil_vars[iv] = hypre_CTAlloc(HYPRE_Int, fem_nvars * fem_nvars, HYPRE_MEMORY_HOST); } for (s = 0; s < fem_nsparse; s++) { i = fem_sparse_i[s]; j = fem_sparse_j[s]; iv = fem_vars[i]; jv = fem_vars[j]; /* shift off-diagonal offset by diagonal */ for (d = 0; d < ndim; d++) { offset[d] = fem_offsets[j][d] - fem_offsets[i][d]; } /* search stencil_offsets */ for (entry = 0; entry < stencil_sizes[iv]; entry++) { /* if offset is already in the stencil, break */ if ( hypre_IndexesEqual(offset, stencil_offsets[iv][entry], ndim) && (jv == stencil_vars[iv][entry]) ) { break; } } /* if this is a new stencil offset, add it to the stencil */ if (entry == stencil_sizes[iv]) { for (d = 0; d < ndim; d++) { stencil_offsets[iv][entry][d] = offset[d]; } stencil_vars[iv][entry] = jv; stencil_sizes[iv]++; } fem_entries[s] = entry; } /* set up the stencils */ for (iv = 0; iv < nvars; iv++) { HYPRE_SStructStencilDestroy(stencils[part][iv]); HYPRE_SStructStencilCreate(ndim, stencil_sizes[iv], &stencils[part][iv]); for (entry = 0; entry < stencil_sizes[iv]; entry++) { HYPRE_SStructStencilSetEntry(stencils[part][iv], entry, stencil_offsets[iv][entry], stencil_vars[iv][entry]); } } /* free up temporary stuff */ for (iv = 0; iv < nvars; iv++) { hypre_TFree(stencil_offsets[iv], HYPRE_MEMORY_HOST); hypre_TFree(stencil_vars[iv], HYPRE_MEMORY_HOST); } hypre_TFree(stencil_sizes, HYPRE_MEMORY_HOST); hypre_TFree(stencil_offsets, HYPRE_MEMORY_HOST); hypre_TFree(stencil_vars, HYPRE_MEMORY_HOST); } } /*--------------------------------------------------------- * Sort the iUventries array and eliminate duplicates. *---------------------------------------------------------*/ if (nUventries > 1) { hypre_qsort0(iUventries, 0, nUventries - 1); j = 1; for (i = 1; i < nUventries; i++) { if (iUventries[i] > iUventries[i - 1]) { iUventries[j] = iUventries[i]; j++; } } nUventries = j; hypre_SStructGraphNUVEntries(graph) = nUventries; } return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_SStructGraphSetObjectType( HYPRE_SStructGraph graph, HYPRE_Int type ) { hypre_SStructGraphObjectType(graph) = type; return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_SStructGraphPrint( FILE *file, HYPRE_SStructGraph graph ) { HYPRE_Int type = hypre_SStructGraphObjectType(graph); HYPRE_Int ndim = hypre_SStructGraphNDim(graph); HYPRE_Int nentries = hypre_SStructNGraphEntries(graph); hypre_SStructGraphEntry **entries = hypre_SStructGraphEntries(graph); HYPRE_Int part, to_part; HYPRE_Int var, to_var; hypre_IndexRef index, to_index; HYPRE_Int i; /* Print auxiliary info */ hypre_fprintf(file, "GraphSetObjectType: %d\n", type); /* Print SStructGraphEntry info */ hypre_fprintf(file, "GraphNumEntries: %d", nentries); for (i = 0; i < nentries; i++) { part = hypre_SStructGraphEntryPart(entries[i]); var = hypre_SStructGraphEntryVar(entries[i]); index = hypre_SStructGraphEntryIndex(entries[i]); to_part = hypre_SStructGraphEntryToPart(entries[i]); to_var = hypre_SStructGraphEntryToVar(entries[i]); to_index = hypre_SStructGraphEntryToIndex(entries[i]); hypre_fprintf(file, "\nGraphAddEntries: %d %d ", part, var); hypre_IndexPrint(file, ndim, index); hypre_fprintf(file, " %d %d ", to_part, to_var); hypre_IndexPrint(file, ndim, to_index); } hypre_fprintf(file, "\n"); return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_SStructGraphRead( FILE *file, HYPRE_SStructGrid grid, HYPRE_SStructStencil **stencils, HYPRE_SStructGraph *graph_ptr ) { MPI_Comm comm = hypre_SStructGridComm(grid); HYPRE_Int nparts = hypre_SStructGridNParts(grid); HYPRE_Int ndim = hypre_SStructGridNDim(grid); HYPRE_SStructGraph graph; hypre_SStructGraphEntry **entries; hypre_SStructPGrid *pgrid; HYPRE_Int nentries; HYPRE_Int a_entries; HYPRE_Int part, to_part; HYPRE_Int var, to_var; hypre_Index index, to_index; HYPRE_Int type; HYPRE_Int nvars; HYPRE_Int i; /* Create graph */ HYPRE_SStructGraphCreate(comm, grid, &graph); /* Read auxiliary info */ hypre_fscanf(file, "GraphSetObjectType: %d\n", &type); HYPRE_SStructGraphSetObjectType(graph, type); /* Set stencils */ for (part = 0; part < nparts; part++) { pgrid = hypre_SStructGridPGrid(grid, part); nvars = hypre_SStructPGridNVars(pgrid); for (var = 0; var < nvars; var++) { HYPRE_SStructGraphSetStencil(graph, part, var, stencils[part][var]); } } /* TODO: HYPRE_SStructGraphSetFEM */ /* TODO: HYPRE_SStructGraphSetFEMSparsity */ /* Read SStructGraphEntry info */ hypre_fscanf(file, "GraphNumEntries: %d", &nentries); a_entries = nentries + 1; hypre_SStructAGraphEntries(graph) = a_entries; entries = hypre_CTAlloc(hypre_SStructGraphEntry *, a_entries, HYPRE_MEMORY_HOST); hypre_SStructGraphEntries(graph) = entries; for (i = 0; i < nentries; i++) { hypre_fscanf(file, "\nGraphAddEntries: %d %d ", &part, &var); hypre_IndexRead(file, ndim, index); hypre_fscanf(file, " %d %d ", &to_part, &to_var); hypre_IndexRead(file, ndim, to_index); HYPRE_SStructGraphAddEntries(graph, part, index, var, to_part, to_index, to_var); } hypre_fscanf(file, "\n"); *graph_ptr = graph; return hypre_error_flag; } hypre-2.33.0/src/sstruct_mv/HYPRE_sstruct_grid.c000066400000000000000000001017371477326011500215740ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /* 9/09 AB - modified all functions to use the box manager */ /****************************************************************************** * * HYPRE_SStructGrid interface * *****************************************************************************/ #include "_hypre_sstruct_mv.h" /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_SStructGridCreate( MPI_Comm comm, HYPRE_Int ndim, HYPRE_Int nparts, HYPRE_SStructGrid *grid_ptr ) { hypre_SStructGrid *grid; hypre_SStructPGrid **pgrids; hypre_SStructPGrid *pgrid; HYPRE_Int *nneighbors; hypre_SStructNeighbor **neighbors; hypre_Index **nbor_offsets; HYPRE_Int *fem_nvars; HYPRE_Int **fem_vars; hypre_Index **fem_offsets; HYPRE_Int num_ghost[2 * HYPRE_MAXDIM]; HYPRE_Int i; grid = hypre_TAlloc(hypre_SStructGrid, 1, HYPRE_MEMORY_HOST); hypre_SStructGridComm(grid) = comm; hypre_SStructGridNDim(grid) = ndim; hypre_SStructGridNParts(grid) = nparts; pgrids = hypre_TAlloc(hypre_SStructPGrid *, nparts, HYPRE_MEMORY_HOST); nneighbors = hypre_TAlloc(HYPRE_Int, nparts, HYPRE_MEMORY_HOST); neighbors = hypre_TAlloc(hypre_SStructNeighbor *, nparts, HYPRE_MEMORY_HOST); nbor_offsets = hypre_TAlloc(hypre_Index *, nparts, HYPRE_MEMORY_HOST); fem_nvars = hypre_TAlloc(HYPRE_Int, nparts, HYPRE_MEMORY_HOST); fem_vars = hypre_TAlloc(HYPRE_Int *, nparts, HYPRE_MEMORY_HOST); fem_offsets = hypre_TAlloc(hypre_Index *, nparts, HYPRE_MEMORY_HOST); for (i = 0; i < nparts; i++) { hypre_SStructPGridCreate(comm, ndim, &pgrid); pgrids[i] = pgrid; nneighbors[i] = 0; neighbors[i] = NULL; nbor_offsets[i] = NULL; fem_nvars[i] = 0; fem_vars[i] = NULL; fem_offsets[i] = NULL; } hypre_SStructGridPGrids(grid) = pgrids; hypre_SStructGridNNeighbors(grid) = nneighbors; hypre_SStructGridNeighbors(grid) = neighbors; hypre_SStructGridNborOffsets(grid) = nbor_offsets; hypre_SStructGridNUCVars(grid) = 0; hypre_SStructGridUCVars(grid) = NULL; hypre_SStructGridFEMNVars(grid) = fem_nvars; hypre_SStructGridFEMVars(grid) = fem_vars; hypre_SStructGridFEMOffsets(grid) = fem_offsets; hypre_SStructGridBoxManagers(grid) = NULL; hypre_SStructGridNborBoxManagers(grid) = NULL; /* miscellaneous */ hypre_SStructGridLocalSize(grid) = 0; hypre_SStructGridGlobalSize(grid) = 0; hypre_SStructGridRefCount(grid) = 1; /* GEC0902 ghost addition to the grid */ hypre_SStructGridGhlocalSize(grid) = 0; /* Initialize num ghost */ for (i = 0; i < 2 * ndim; i++) { num_ghost[i] = 1; } hypre_SStructGridSetNumGhost(grid, num_ghost); *grid_ptr = grid; return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_SStructGridDestroy( HYPRE_SStructGrid grid ) { HYPRE_Int nparts; hypre_SStructPGrid **pgrids; HYPRE_Int *nneighbors; hypre_SStructNeighbor **neighbors; hypre_Index **nbor_offsets; HYPRE_Int **nvneighbors; hypre_SStructNeighbor ***vneighbors; hypre_SStructCommInfo **vnbor_comm_info; HYPRE_Int vnbor_ncomms; HYPRE_Int *fem_nvars; HYPRE_Int **fem_vars; hypre_Index **fem_offsets; hypre_BoxManager ***managers; hypre_BoxManager ***nbor_managers; HYPRE_Int nvars; HYPRE_Int part, var, i; if (grid) { hypre_SStructGridRefCount(grid) --; if (hypre_SStructGridRefCount(grid) == 0) { nparts = hypre_SStructGridNParts(grid); pgrids = hypre_SStructGridPGrids(grid); nneighbors = hypre_SStructGridNNeighbors(grid); neighbors = hypre_SStructGridNeighbors(grid); nbor_offsets = hypre_SStructGridNborOffsets(grid); nvneighbors = hypre_SStructGridNVNeighbors(grid); vneighbors = hypre_SStructGridVNeighbors(grid); vnbor_comm_info = hypre_SStructGridVNborCommInfo(grid); vnbor_ncomms = hypre_SStructGridVNborNComms(grid); fem_nvars = hypre_SStructGridFEMNVars(grid); fem_vars = hypre_SStructGridFEMVars(grid); fem_offsets = hypre_SStructGridFEMOffsets(grid); managers = hypre_SStructGridBoxManagers(grid); nbor_managers = hypre_SStructGridNborBoxManagers(grid); for (part = 0; part < nparts; part++) { nvars = hypre_SStructPGridNVars(pgrids[part]); for (var = 0; var < nvars; var++) { hypre_TFree(vneighbors[part][var], HYPRE_MEMORY_HOST); hypre_BoxManDestroy(managers[part][var]); hypre_BoxManDestroy(nbor_managers[part][var]); } hypre_TFree(neighbors[part], HYPRE_MEMORY_HOST); hypre_TFree(nbor_offsets[part], HYPRE_MEMORY_HOST); hypre_TFree(nvneighbors[part], HYPRE_MEMORY_HOST); hypre_TFree(vneighbors[part], HYPRE_MEMORY_HOST); hypre_SStructPGridDestroy(pgrids[part]); hypre_TFree(fem_vars[part], HYPRE_MEMORY_HOST); hypre_TFree(fem_offsets[part], HYPRE_MEMORY_HOST); hypre_TFree(managers[part], HYPRE_MEMORY_HOST); hypre_TFree(nbor_managers[part], HYPRE_MEMORY_HOST); } for (i = 0; i < vnbor_ncomms; i++) { hypre_CommInfoDestroy( hypre_SStructCommInfoCommInfo(vnbor_comm_info[i])); hypre_TFree(vnbor_comm_info[i], HYPRE_MEMORY_HOST); } hypre_TFree(vnbor_comm_info, HYPRE_MEMORY_HOST); hypre_TFree(pgrids, HYPRE_MEMORY_HOST); hypre_TFree(nneighbors, HYPRE_MEMORY_HOST); hypre_TFree(neighbors, HYPRE_MEMORY_HOST); hypre_TFree(nbor_offsets, HYPRE_MEMORY_HOST); hypre_TFree(fem_nvars, HYPRE_MEMORY_HOST); hypre_TFree(fem_vars, HYPRE_MEMORY_HOST); hypre_TFree(fem_offsets, HYPRE_MEMORY_HOST); hypre_TFree(nvneighbors, HYPRE_MEMORY_HOST); hypre_TFree(vneighbors, HYPRE_MEMORY_HOST); hypre_TFree(vnbor_comm_info, HYPRE_MEMORY_HOST); hypre_TFree(managers, HYPRE_MEMORY_HOST); hypre_TFree(nbor_managers, HYPRE_MEMORY_HOST); hypre_TFree(grid, HYPRE_MEMORY_HOST); } } return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_SStructGridSetExtents( HYPRE_SStructGrid grid, HYPRE_Int part, HYPRE_Int *ilower, HYPRE_Int *iupper ) { HYPRE_Int ndim = hypre_SStructGridNDim(grid); hypre_SStructPGrid *pgrid = hypre_SStructGridPGrid(grid, part); hypre_Index cilower; hypre_Index ciupper; hypre_CopyToCleanIndex(ilower, ndim, cilower); hypre_CopyToCleanIndex(iupper, ndim, ciupper); hypre_SStructPGridSetExtents(pgrid, cilower, ciupper); return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_SStructGridSetVariables( HYPRE_SStructGrid grid, HYPRE_Int part, HYPRE_Int nvars, HYPRE_SStructVariable *vartypes ) { hypre_SStructPGrid *pgrid = hypre_SStructGridPGrid(grid, part); hypre_SStructPGridSetVariables(pgrid, nvars, vartypes); return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_SStructGridAddVariables( HYPRE_SStructGrid grid, HYPRE_Int part, HYPRE_Int *index, HYPRE_Int nvars, HYPRE_SStructVariable *vartypes ) { HYPRE_Int ndim = hypre_SStructGridNDim(grid); HYPRE_Int nucvars = hypre_SStructGridNUCVars(grid); hypre_SStructUCVar **ucvars = hypre_SStructGridUCVars(grid); hypre_SStructUCVar *ucvar; HYPRE_Int memchunk = 1000; HYPRE_Int i; /* allocate more space if necessary */ if ((nucvars % memchunk) == 0) { ucvars = hypre_TReAlloc(ucvars, hypre_SStructUCVar *, (nucvars + memchunk), HYPRE_MEMORY_HOST); } ucvar = hypre_TAlloc(hypre_SStructUCVar, 1, HYPRE_MEMORY_HOST); hypre_SStructUCVarUVars(ucvar) = hypre_TAlloc(hypre_SStructUVar, nvars, HYPRE_MEMORY_HOST); hypre_SStructUCVarPart(ucvar) = part; hypre_CopyToCleanIndex(index, ndim, hypre_SStructUCVarCell(ucvar)); hypre_SStructUCVarNUVars(ucvar) = nvars; for (i = 0; i < nvars; i++) { hypre_SStructUCVarType(ucvar, i) = vartypes[i]; hypre_SStructUCVarRank(ucvar, i) = -1; /* don't know, yet */ hypre_SStructUCVarProc(ucvar, i) = -1; /* don't know, yet */ } ucvars[nucvars] = ucvar; nucvars++; hypre_SStructGridNUCVars(grid) = nucvars; hypre_SStructGridUCVars(grid) = ucvars; return hypre_error_flag; } /*-------------------------------------------------------------------------- * If ordering == NULL, use a default ordering. This feature is mainly for * internal implementation reasons. *--------------------------------------------------------------------------*/ /* ONLY3D */ HYPRE_Int HYPRE_SStructGridSetFEMOrdering( HYPRE_SStructGrid grid, HYPRE_Int part, HYPRE_Int *ordering ) { HYPRE_Int ndim = hypre_SStructGridNDim(grid); hypre_SStructPGrid *pgrid = hypre_SStructGridPGrid(grid, part); HYPRE_Int nvars = hypre_SStructPGridNVars(pgrid); HYPRE_SStructVariable *vartypes = hypre_SStructPGridVarTypes(pgrid); HYPRE_Int fem_nvars; HYPRE_Int *fem_vars; hypre_Index *fem_offsets; hypre_Index varoffset; HYPRE_Int i, j, d, nv, *block, off[3], loop[3]; HYPRE_Int clean = 0; /* compute fem_nvars */ fem_nvars = 0; for (i = 0; i < nvars; i++) { nv = 1; hypre_SStructVariableGetOffset(vartypes[i], ndim, varoffset); for (d = 0; d < ndim; d++) { if (varoffset[d]) { nv *= 2; } } fem_nvars += nv; } /* set default ordering */ if (ordering == NULL) { clean = 1; ordering = hypre_TAlloc(HYPRE_Int, (1 + ndim) * fem_nvars, HYPRE_MEMORY_HOST); j = 0; for (i = 0; i < nvars; i++) { hypre_SStructVariableGetOffset(vartypes[i], ndim, varoffset); for (d = 0; d < 3; d++) { loop[d] = 0; if ((d < ndim) && (varoffset[d] != 0)) { loop[d] = 1; } } for (off[2] = -loop[2]; off[2] <= loop[2]; off[2] += 2) { for (off[1] = -loop[1]; off[1] <= loop[1]; off[1] += 2) { for (off[0] = -loop[0]; off[0] <= loop[0]; off[0] += 2) { block = &ordering[(1 + ndim) * j]; block[0] = i; for (d = 0; d < ndim; d++) { block[1 + d] = off[d]; } j++; } } } } } fem_vars = hypre_TReAlloc(hypre_SStructGridFEMPVars(grid, part), HYPRE_Int, fem_nvars, HYPRE_MEMORY_HOST); fem_offsets = hypre_TReAlloc(hypre_SStructGridFEMPOffsets(grid, part), hypre_Index, fem_nvars, HYPRE_MEMORY_HOST); for (i = 0; i < fem_nvars; i++) { block = &ordering[(1 + ndim) * i]; fem_vars[i] = block[0]; hypre_SetIndex(fem_offsets[i], 0); for (d = 0; d < ndim; d++) { /* modify the user offsets to contain only 0's and -1's */ if (block[1 + d] < 0) { hypre_IndexD(fem_offsets[i], d) = -1; } } } hypre_SStructGridFEMPNVars(grid, part) = fem_nvars; hypre_SStructGridFEMPVars(grid, part) = fem_vars; hypre_SStructGridFEMPOffsets(grid, part) = fem_offsets; if (clean) { hypre_TFree(ordering, HYPRE_MEMORY_HOST); } return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_SStructGridSetNeighborPart( HYPRE_SStructGrid grid, HYPRE_Int part, HYPRE_Int *ilower, HYPRE_Int *iupper, HYPRE_Int nbor_part, HYPRE_Int *nbor_ilower, HYPRE_Int *nbor_iupper, HYPRE_Int *index_map, HYPRE_Int *index_dir ) { HYPRE_Int ndim = hypre_SStructGridNDim(grid); HYPRE_Int *nneighbors = hypre_SStructGridNNeighbors(grid); hypre_SStructNeighbor **neighbors = hypre_SStructGridNeighbors(grid); hypre_Index **nbor_offsets = hypre_SStructGridNborOffsets(grid); hypre_SStructNeighbor *neighbor; hypre_IndexRef nbor_offset; hypre_Box *box; hypre_Index cilower; hypre_Index ciupper; hypre_IndexRef coord, dir, ilower_mapped; HYPRE_Int memchunk = 10; HYPRE_Int d, dd, tdir; /* allocate more memory if needed */ if ((nneighbors[part] % memchunk) == 0) { neighbors[part] = hypre_TReAlloc(neighbors[part], hypre_SStructNeighbor, (nneighbors[part] + memchunk), HYPRE_MEMORY_HOST); nbor_offsets[part] = hypre_TReAlloc(nbor_offsets[part], hypre_Index, (nneighbors[part] + memchunk), HYPRE_MEMORY_HOST); } neighbor = &neighbors[part][nneighbors[part]]; nbor_offset = nbor_offsets[part][nneighbors[part]]; box = hypre_SStructNeighborBox(neighbor); hypre_CopyToCleanIndex(ilower, ndim, cilower); hypre_CopyToCleanIndex(iupper, ndim, ciupper); hypre_BoxInit(box, ndim); hypre_BoxSetExtents(box, cilower, ciupper); hypre_SetIndex(nbor_offset, 0); /* If the neighbor box is empty, return */ if ( !(hypre_BoxVolume(box) > 0) ) { return hypre_error_flag; } hypre_SStructNeighborPart(neighbor) = nbor_part; coord = hypre_SStructNeighborCoord(neighbor); dir = hypre_SStructNeighborDir(neighbor); ilower_mapped = hypre_SStructNeighborILower(neighbor); hypre_CopyIndex(index_map, coord); hypre_CopyIndex(index_dir, dir); for (d = 0; d < ndim; d++) { dd = coord[d]; tdir = dir[d]; /* this effectively sorts nbor_ilower and nbor_iupper */ if (hypre_IndexD(nbor_ilower, dd) > hypre_IndexD(nbor_iupper, dd)) { tdir = -tdir; } if (tdir > 0) { hypre_IndexD(ilower_mapped, dd) = hypre_IndexD(nbor_ilower, dd); } else { hypre_IndexD(ilower_mapped, dd) = hypre_IndexD(nbor_iupper, dd); } } for (d = ndim; d < ndim; d++) { hypre_IndexD(coord, d) = d; hypre_IndexD(dir, d) = 1; hypre_IndexD(ilower_mapped, d) = 0; } nneighbors[part]++; return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_SStructGridSetSharedPart( HYPRE_SStructGrid grid, HYPRE_Int part, HYPRE_Int *ilower, HYPRE_Int *iupper, HYPRE_Int *offset, HYPRE_Int shared_part, HYPRE_Int *shared_ilower, HYPRE_Int *shared_iupper, HYPRE_Int *shared_offset, HYPRE_Int *index_map, HYPRE_Int *index_dir ) { HYPRE_Int ndim = hypre_SStructGridNDim(grid); HYPRE_Int *nneighbors = hypre_SStructGridNNeighbors(grid); hypre_SStructNeighbor **neighbors = hypre_SStructGridNeighbors(grid); hypre_Index **nbor_offsets = hypre_SStructGridNborOffsets(grid); hypre_SStructNeighbor *neighbor; hypre_IndexRef nbor_offset; hypre_Box *box; hypre_Index cilower; hypre_Index ciupper; hypre_IndexRef coord, dir, ilower_mapped; HYPRE_Int offset_mapped[HYPRE_MAXDIM]; HYPRE_Int memchunk = 10; HYPRE_Int d, dd, tdir; /* allocate more memory if needed */ if ((nneighbors[part] % memchunk) == 0) { neighbors[part] = hypre_TReAlloc(neighbors[part], hypre_SStructNeighbor, (nneighbors[part] + memchunk), HYPRE_MEMORY_HOST); nbor_offsets[part] = hypre_TReAlloc(nbor_offsets[part], hypre_Index, (nneighbors[part] + memchunk), HYPRE_MEMORY_HOST); } neighbor = &neighbors[part][nneighbors[part]]; nbor_offset = nbor_offsets[part][nneighbors[part]]; box = hypre_SStructNeighborBox(neighbor); hypre_CopyToCleanIndex(ilower, ndim, cilower); hypre_CopyToCleanIndex(iupper, ndim, ciupper); hypre_BoxInit(box, ndim); hypre_BoxSetExtents(box, cilower, ciupper); hypre_CopyToCleanIndex(offset, ndim, nbor_offset); /* If the neighbor box is empty, return */ if ( !(hypre_BoxVolume(box) > 0) ) { return hypre_error_flag; } hypre_SStructNeighborPart(neighbor) = shared_part; coord = hypre_SStructNeighborCoord(neighbor); dir = hypre_SStructNeighborDir(neighbor); ilower_mapped = hypre_SStructNeighborILower(neighbor); hypre_CopyIndex(index_map, coord); hypre_CopyIndex(index_dir, dir); for (d = 0; d < ndim; d++) { dd = coord[d]; tdir = dir[d]; /* this effectively sorts shared_ilower and shared_iupper */ if (hypre_IndexD(shared_ilower, dd) > hypre_IndexD(shared_iupper, dd)) { tdir = -tdir; } if (tdir > 0) { hypre_IndexD(ilower_mapped, dd) = hypre_IndexD(shared_ilower, dd); } else { hypre_IndexD(ilower_mapped, dd) = hypre_IndexD(shared_iupper, dd); } /* Map the offset to the neighbor part and adjust ilower_mapped so that * NeighborILower is a direct mapping of NeighborBoxIMin. This allows us * to eliminate shared_offset. */ offset_mapped[dd] = offset[d] * dir[d]; if (offset_mapped[dd] != shared_offset[dd]) { hypre_IndexD(ilower_mapped, dd) -= offset_mapped[dd]; } } for (d = ndim; d < HYPRE_MAXDIM; d++) { hypre_IndexD(coord, d) = d; hypre_IndexD(dir, d) = 1; hypre_IndexD(ilower_mapped, d) = 0; } nneighbors[part]++; return hypre_error_flag; } /*-------------------------------------------------------------------------- * *** placeholder *** *--------------------------------------------------------------------------*/ #if 0 HYPRE_Int HYPRE_SStructGridAddUnstructuredPart( HYPRE_SStructGrid grid, HYPRE_Int ilower, HYPRE_Int iupper ) { hypre_SStructGridAssemble(grid); return hypre_error_flag; } #endif /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_SStructGridAssemble( HYPRE_SStructGrid grid ) { HYPRE_Int ndim = hypre_SStructGridNDim(grid); HYPRE_Int nparts = hypre_SStructGridNParts(grid); hypre_SStructPGrid **pgrids = hypre_SStructGridPGrids(grid); HYPRE_Int *nneighbors = hypre_SStructGridNNeighbors(grid); hypre_SStructNeighbor **neighbors = hypre_SStructGridNeighbors(grid); hypre_Index **nbor_offsets = hypre_SStructGridNborOffsets(grid); HYPRE_Int **nvneighbors = hypre_SStructGridNVNeighbors(grid); hypre_SStructNeighbor ***vneighbors = hypre_SStructGridVNeighbors(grid); hypre_SStructNeighbor *neighbor; hypre_IndexRef nbor_offset; hypre_SStructNeighbor *vneighbor; HYPRE_Int *coord, *dir; hypre_Index *fr_roots, *to_roots; hypre_BoxArrayArray *nbor_boxes; hypre_BoxArray *nbor_boxa; hypre_BoxArray *sub_boxa; hypre_BoxArray *tmp_boxa; hypre_Box *nbor_box, *box; hypre_SStructPGrid *pgrid; HYPRE_SStructVariable *vartypes; hypre_Index varoffset; HYPRE_Int nvars; HYPRE_Int part, var, b, vb, d, i, valid; HYPRE_Int nbor_part, sub_part; /*------------------------------------------------------------- * if I own no data on some part, prune that part's neighbor info *-------------------------------------------------------------*/ for (part = 0; part < nparts; part++) { pgrid = hypre_SStructGridPGrid(grid, part); if (hypre_StructGridNumBoxes(hypre_SStructPGridCellSGrid(pgrid)) == 0) { nneighbors[part] = 0; hypre_TFree(neighbors[part], HYPRE_MEMORY_HOST); hypre_TFree(nbor_offsets[part], HYPRE_MEMORY_HOST); } } /*------------------------------------------------------------- * set pneighbors for each pgrid info to crop pgrids *-------------------------------------------------------------*/ /* * ZTODO: Note that if neighbor boxes are not first intersected with * the global grid, then local pgrid info may be incorrectly cropped. * This would occur if users pass in neighbor extents that do not * actually live anywhere on the global grid. * * This is not an issue for cell-centered variables. */ for (part = 0; part < nparts; part++) { pgrid = hypre_SStructGridPGrid(grid, part); for (b = 0; b < nneighbors[part]; b++) { neighbor = &neighbors[part][b]; nbor_offset = nbor_offsets[part][b]; /* if this part is not the owner of the shared data */ if ( part > hypre_SStructNeighborPart(neighbor) ) { hypre_SStructPGridSetPNeighbor( pgrid, hypre_SStructNeighborBox(neighbor), nbor_offset); } } } /*------------------------------------------------------------- * assemble the pgrids *-------------------------------------------------------------*/ for (part = 0; part < nparts; part++) { hypre_SStructPGridAssemble(pgrids[part]); } /*------------------------------------------------------------- * re-organize u-variables to reference via local cell rank *-------------------------------------------------------------*/ /* TODO */ /*------------------------------------------------------------- * determine a unique u-variable data distribution *-------------------------------------------------------------*/ /* TODO */ /*------------------------------------------------------------- * set up the size info * GEC0902 calculation of the local ghost size for grid *-------------------------------------------------------------*/ for (part = 0; part < nparts; part++) { pgrid = hypre_SStructGridPGrid(grid, part); hypre_SStructGridLocalSize(grid) += hypre_SStructPGridLocalSize(pgrid); hypre_SStructGridGlobalSize(grid) += hypre_SStructPGridGlobalSize(pgrid); hypre_SStructGridGhlocalSize(grid) += hypre_SStructPGridGhlocalSize(pgrid); } /*------------------------------------------------- * Set up the FEM ordering information *-------------------------------------------------*/ for (part = 0; part < nparts; part++) { if (hypre_SStructGridFEMPNVars(grid, part) == 0) { /* use the default ordering */ HYPRE_SStructGridSetFEMOrdering(grid, part, NULL); } } /*------------------------------------------------- * Set up vneighbor info *-------------------------------------------------*/ box = hypre_BoxCreate(ndim); tmp_boxa = hypre_BoxArrayCreate(0, ndim); nvneighbors = hypre_TAlloc(HYPRE_Int *, nparts, HYPRE_MEMORY_HOST); vneighbors = hypre_TAlloc(hypre_SStructNeighbor **, nparts, HYPRE_MEMORY_HOST); for (part = 0; part < nparts; part++) { pgrid = hypre_SStructGridPGrid(grid, part); nvars = hypre_SStructPGridNVars(pgrid); vartypes = hypre_SStructPGridVarTypes(pgrid); nvneighbors[part] = hypre_TAlloc(HYPRE_Int, nvars, HYPRE_MEMORY_HOST); vneighbors[part] = hypre_TAlloc(hypre_SStructNeighbor *, nvars, HYPRE_MEMORY_HOST); for (var = 0; var < nvars; var++) { /* Put each new vneighbor box into a BoxArrayArray so we can remove overlap */ nbor_boxes = hypre_BoxArrayArrayCreate(nneighbors[part], ndim); fr_roots = hypre_TAlloc(hypre_Index, nneighbors[part], HYPRE_MEMORY_HOST); to_roots = hypre_TAlloc(hypre_Index, nneighbors[part], HYPRE_MEMORY_HOST); hypre_SStructVariableGetOffset((hypre_SStructVariable) vartypes[var], ndim, varoffset); nvneighbors[part][var] = 0; for (b = 0; b < nneighbors[part]; b++) { neighbor = &neighbors[part][b]; nbor_offset = nbor_offsets[part][b]; /* Create var-centered vneighbor box from cell-centered neighbor box */ hypre_CopyBox(hypre_SStructNeighborBox(neighbor), box); hypre_SStructCellBoxToVarBox(box, nbor_offset, varoffset, &valid); /* Sometimes we can't construct vneighbor boxes (valid = false). * For example, if only faces are shared (see SetSharedPart), then * there should be no vneighbor boxes for cell variables. Note that * we ensure nonempty neighbor boxes when they are set up. */ if (!valid) { continue; } /* Save root mapping information for later */ hypre_CopyIndex(hypre_BoxIMin(box), fr_roots[b]); hypre_CopyIndex(hypre_SStructNeighborILower(neighbor), to_roots[b]); /* It's important to adjust to_root (ilower) */ coord = hypre_SStructNeighborCoord(neighbor); dir = hypre_SStructNeighborDir(neighbor); for (d = 0; d < ndim; d++) { /* Compare the imin of the neighbor cell box ('i') to its imin * value after being converted to a variable box ('IMin(box,d)'). * If the coordinates in the two parts move in the same direction * (i.e., dir[d] > 0) and the local imin changed, then also * change the corresponding neighbor ilower. If the coordinates * in the two parts move in opposite directions and the local * imin did not change, then change the corresponding neighbor * ilower based on the value of 'varoffset'. */ i = hypre_BoxIMinD(hypre_SStructNeighborBox(neighbor), d); if (((dir[d] > 0) && (hypre_BoxIMinD(box, d) != i)) || ((dir[d] < 0) && (hypre_BoxIMinD(box, d) == i))) { hypre_IndexD(to_roots[b], coord[d]) -= hypre_IndexD(varoffset, d); } } /* Add box to the nbor_boxes */ nbor_boxa = hypre_BoxArrayArrayBoxArray(nbor_boxes, b); hypre_AppendBox(box, nbor_boxa); /* Make sure that the nbor_boxes don't overlap */ nbor_part = hypre_SStructNeighborPart(neighbor); for (i = 0; i < b; i++) { neighbor = &neighbors[part][i]; sub_part = hypre_SStructNeighborPart(neighbor); /* Only subtract boxes on the same neighbor part */ if (nbor_part == sub_part) { sub_boxa = hypre_BoxArrayArrayBoxArray(nbor_boxes, i); /* nbor_boxa -= sub_boxa */ hypre_SubtractBoxArrays(nbor_boxa, sub_boxa, tmp_boxa); } } nvneighbors[part][var] += hypre_BoxArraySize(nbor_boxa); } /* Set up vneighbors for this (part, var) */ vneighbors[part][var] = hypre_TAlloc(hypre_SStructNeighbor, nvneighbors[part][var], HYPRE_MEMORY_HOST); vb = 0; for (b = 0; b < nneighbors[part]; b++) { neighbor = &neighbors[part][b]; nbor_boxa = hypre_BoxArrayArrayBoxArray(nbor_boxes, b); nbor_part = hypre_SStructNeighborPart(neighbor); coord = hypre_SStructNeighborCoord(neighbor); dir = hypre_SStructNeighborDir(neighbor); hypre_ForBoxI(i, nbor_boxa) { vneighbor = &vneighbors[part][var][vb]; nbor_box = hypre_BoxArrayBox(nbor_boxa, i); hypre_CopyBox(nbor_box, hypre_SStructNeighborBox(vneighbor)); hypre_SStructNeighborPart(vneighbor) = nbor_part; hypre_SStructIndexToNborIndex(hypre_BoxIMin(nbor_box), fr_roots[b], to_roots[b], coord, dir, ndim, hypre_SStructNeighborILower(vneighbor)); hypre_CopyIndex(coord, hypre_SStructNeighborCoord(vneighbor)); hypre_CopyIndex(dir, hypre_SStructNeighborDir(vneighbor)); vb++; } } /* end of vneighbor box loop */ hypre_BoxArrayArrayDestroy(nbor_boxes); hypre_TFree(fr_roots, HYPRE_MEMORY_HOST); hypre_TFree(to_roots, HYPRE_MEMORY_HOST); } /* end of variables loop */ } /* end of part loop */ hypre_SStructGridNVNeighbors(grid) = nvneighbors; hypre_SStructGridVNeighbors(grid) = vneighbors; hypre_BoxArrayDestroy(tmp_boxa); hypre_BoxDestroy(box); /*------------------------------------------------- * Assemble the box manager info *-------------------------------------------------*/ hypre_SStructGridAssembleBoxManagers(grid); /*------------------------------------------------- * Assemble the neighbor box manager info *-------------------------------------------------*/ hypre_SStructGridAssembleNborBoxManagers(grid); /*------------------------------------------------- * Compute the CommInfo component of the grid *-------------------------------------------------*/ hypre_SStructGridCreateCommInfo(grid); return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_SStructGridSetPeriodic( HYPRE_SStructGrid grid, HYPRE_Int part, HYPRE_Int *periodic ) { hypre_SStructPGrid *pgrid = hypre_SStructGridPGrid(grid, part); hypre_IndexRef pgrid_periodic = hypre_SStructPGridPeriodic(pgrid); HYPRE_Int d; for (d = 0; d < hypre_SStructGridNDim(grid); d++) { hypre_IndexD(pgrid_periodic, d) = periodic[d]; } return hypre_error_flag; } /*-------------------------------------------------------------------------- * GEC0902 a placeholder for a internal function that will set ghosts in each * of the sgrids of the grid *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_SStructGridSetNumGhost( HYPRE_SStructGrid grid, HYPRE_Int *num_ghost) { hypre_SStructGridSetNumGhost(grid, num_ghost); return hypre_error_flag; } hypre-2.33.0/src/sstruct_mv/HYPRE_sstruct_matrix.c000066400000000000000000001401001477326011500221360ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * HYPRE_SStructMatrix interface * *****************************************************************************/ #include "_hypre_sstruct_mv.h" /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_SStructMatrixCreate( MPI_Comm comm, HYPRE_SStructGraph graph, HYPRE_SStructMatrix *matrix_ptr ) { hypre_SStructStencil ***stencils = hypre_SStructGraphStencils(graph); hypre_SStructMatrix *matrix; HYPRE_Int ***splits; HYPRE_Int nparts; hypre_SStructPMatrix **pmatrices; HYPRE_Int ***symmetric; hypre_SStructPGrid *pgrid; HYPRE_Int nvars; HYPRE_Int stencil_size; HYPRE_Int *stencil_vars; HYPRE_Int pstencil_size; HYPRE_SStructVariable vitype, vjtype; HYPRE_Int part, vi, vj, i; HYPRE_Int size, rectangular; matrix = hypre_TAlloc(hypre_SStructMatrix, 1, HYPRE_MEMORY_HOST); hypre_SStructMatrixComm(matrix) = comm; hypre_SStructMatrixNDim(matrix) = hypre_SStructGraphNDim(graph); hypre_SStructGraphRef(graph, &hypre_SStructMatrixGraph(matrix)); /* compute S/U-matrix split */ nparts = hypre_SStructGraphNParts(graph); hypre_SStructMatrixNParts(matrix) = nparts; splits = hypre_TAlloc(HYPRE_Int **, nparts, HYPRE_MEMORY_HOST); hypre_SStructMatrixSplits(matrix) = splits; pmatrices = hypre_TAlloc(hypre_SStructPMatrix *, nparts, HYPRE_MEMORY_HOST); hypre_SStructMatrixPMatrices(matrix) = pmatrices; symmetric = hypre_TAlloc(HYPRE_Int **, nparts, HYPRE_MEMORY_HOST); hypre_SStructMatrixSymmetric(matrix) = symmetric; /* is this a rectangular matrix? */ rectangular = 0; if (hypre_SStructGraphGrid(graph) != hypre_SStructGraphDomainGrid(graph)) { rectangular = 1; } for (part = 0; part < nparts; part++) { pgrid = hypre_SStructGraphPGrid(graph, part); nvars = hypre_SStructPGridNVars(pgrid); splits[part] = hypre_TAlloc(HYPRE_Int *, nvars, HYPRE_MEMORY_HOST); symmetric[part] = hypre_TAlloc(HYPRE_Int *, nvars, HYPRE_MEMORY_HOST); for (vi = 0; vi < nvars; vi++) { stencil_size = hypre_SStructStencilSize(stencils[part][vi]); stencil_vars = hypre_SStructStencilVars(stencils[part][vi]); pstencil_size = 0; splits[part][vi] = hypre_TAlloc(HYPRE_Int, stencil_size, HYPRE_MEMORY_HOST); symmetric[part][vi] = hypre_TAlloc(HYPRE_Int, nvars, HYPRE_MEMORY_HOST); for (i = 0; i < stencil_size; i++) { /* for rectangular matrices, put all coefficients in U-matrix */ if (rectangular) { splits[part][vi][i] = -1; } else { vj = stencil_vars[i]; vitype = hypre_SStructPGridVarType(pgrid, vi); vjtype = hypre_SStructPGridVarType(pgrid, vj); if (vjtype == vitype) { splits[part][vi][i] = pstencil_size; pstencil_size++; } else { splits[part][vi][i] = -1; } } } for (vj = 0; vj < nvars; vj++) { symmetric[part][vi][vj] = 0; } } } /* GEC0902 move the IJ creation to the initialization phase * ilower = hypre_SStructGridGhstartRank(grid); * iupper = ilower + hypre_SStructGridGhlocalSize(grid) - 1; * HYPRE_IJMatrixCreate(comm, ilower, iupper, ilower, iupper, * &hypre_SStructMatrixIJMatrix(matrix)); */ hypre_SStructMatrixIJMatrix(matrix) = NULL; hypre_SStructMatrixParCSRMatrix(matrix) = NULL; size = 0; for (part = 0; part < nparts; part++) { pgrid = hypre_SStructGraphPGrid(graph, part); nvars = hypre_SStructPGridNVars(pgrid); for (vi = 0; vi < nvars; vi++) { size = hypre_max(size, hypre_SStructStencilSize(stencils[part][vi])); } } hypre_SStructMatrixSEntries(matrix) = hypre_TAlloc(HYPRE_Int, size, HYPRE_MEMORY_HOST); size += hypre_SStructGraphUEMaxSize(graph); hypre_SStructMatrixUEntries(matrix) = hypre_TAlloc(HYPRE_Int, size, HYPRE_MEMORY_HOST); hypre_SStructMatrixEntriesSize(matrix) = size; hypre_SStructMatrixTmpRowCoords(matrix) = NULL; hypre_SStructMatrixTmpColCoords(matrix) = NULL; hypre_SStructMatrixTmpCoeffs(matrix) = NULL; hypre_SStructMatrixTmpRowCoordsDevice(matrix) = NULL; hypre_SStructMatrixTmpColCoordsDevice(matrix) = NULL; hypre_SStructMatrixTmpCoeffsDevice(matrix) = NULL; hypre_SStructMatrixNSSymmetric(matrix) = 0; hypre_SStructMatrixGlobalSize(matrix) = 0; hypre_SStructMatrixRefCount(matrix) = 1; /* GEC0902 setting the default of the object_type to HYPRE_SSTRUCT */ hypre_SStructMatrixObjectType(matrix) = HYPRE_SSTRUCT; *matrix_ptr = matrix; return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_SStructMatrixDestroy( HYPRE_SStructMatrix matrix ) { hypre_SStructGraph *graph; HYPRE_Int ***splits; HYPRE_Int nparts; hypre_SStructPMatrix **pmatrices; HYPRE_Int ***symmetric; hypre_SStructPGrid *pgrid; HYPRE_Int nvars; HYPRE_Int part, var; HYPRE_MemoryLocation memory_location; if (matrix) { memory_location = hypre_SStructMatrixMemoryLocation(matrix); hypre_SStructMatrixRefCount(matrix) --; if (hypre_SStructMatrixRefCount(matrix) == 0) { graph = hypre_SStructMatrixGraph(matrix); splits = hypre_SStructMatrixSplits(matrix); nparts = hypre_SStructMatrixNParts(matrix); pmatrices = hypre_SStructMatrixPMatrices(matrix); symmetric = hypre_SStructMatrixSymmetric(matrix); for (part = 0; part < nparts; part++) { pgrid = hypre_SStructGraphPGrid(graph, part); nvars = hypre_SStructPGridNVars(pgrid); for (var = 0; var < nvars; var++) { hypre_TFree(splits[part][var], HYPRE_MEMORY_HOST); hypre_TFree(symmetric[part][var], HYPRE_MEMORY_HOST); } hypre_TFree(splits[part], HYPRE_MEMORY_HOST); hypre_TFree(symmetric[part], HYPRE_MEMORY_HOST); hypre_SStructPMatrixDestroy(pmatrices[part]); } HYPRE_SStructGraphDestroy(graph); hypre_TFree(splits, HYPRE_MEMORY_HOST); hypre_TFree(pmatrices, HYPRE_MEMORY_HOST); hypre_TFree(symmetric, HYPRE_MEMORY_HOST); HYPRE_IJMatrixDestroy(hypre_SStructMatrixIJMatrix(matrix)); hypre_TFree(hypre_SStructMatrixSEntries(matrix), HYPRE_MEMORY_HOST); hypre_TFree(hypre_SStructMatrixUEntries(matrix), HYPRE_MEMORY_HOST); hypre_TFree(hypre_SStructMatrixTmpRowCoords(matrix), HYPRE_MEMORY_HOST); hypre_TFree(hypre_SStructMatrixTmpColCoords(matrix), HYPRE_MEMORY_HOST); hypre_TFree(hypre_SStructMatrixTmpCoeffs(matrix), HYPRE_MEMORY_HOST); hypre_TFree(hypre_SStructMatrixTmpRowCoordsDevice(matrix), memory_location); hypre_TFree(hypre_SStructMatrixTmpColCoordsDevice(matrix), memory_location); hypre_TFree(hypre_SStructMatrixTmpCoeffsDevice(matrix), memory_location); hypre_TFree(matrix, HYPRE_MEMORY_HOST); } } return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_SStructMatrixInitialize( HYPRE_SStructMatrix matrix ) { HYPRE_Int nparts = hypre_SStructMatrixNParts(matrix); hypre_SStructGraph *graph = hypre_SStructMatrixGraph(matrix); hypre_SStructPMatrix **pmatrices = hypre_SStructMatrixPMatrices(matrix); HYPRE_Int ***symmetric = hypre_SStructMatrixSymmetric(matrix); hypre_SStructStencil ***stencils = hypre_SStructGraphStencils(graph); HYPRE_Int *split; MPI_Comm pcomm; hypre_SStructPGrid *pgrid; hypre_SStructStencil **pstencils; HYPRE_Int nvars; HYPRE_Int stencil_size; hypre_Index *stencil_shape; HYPRE_Int *stencil_vars; HYPRE_Int pstencil_ndim; HYPRE_Int pstencil_size; HYPRE_Int part, var, i; /* GEC0902 addition of variables for ilower and iupper */ MPI_Comm comm; hypre_SStructGrid *grid, *domain_grid; HYPRE_BigInt ilower, iupper, jlower, jupper; HYPRE_Int matrix_type = hypre_SStructMatrixObjectType(matrix); /* S-matrix */ for (part = 0; part < nparts; part++) { pgrid = hypre_SStructGraphPGrid(graph, part); nvars = hypre_SStructPGridNVars(pgrid); pstencils = hypre_TAlloc(hypre_SStructStencil *, nvars, HYPRE_MEMORY_HOST); for (var = 0; var < nvars; var++) { split = hypre_SStructMatrixSplit(matrix, part, var); stencil_size = hypre_SStructStencilSize(stencils[part][var]); stencil_shape = hypre_SStructStencilShape(stencils[part][var]); stencil_vars = hypre_SStructStencilVars(stencils[part][var]); pstencil_ndim = hypre_SStructStencilNDim(stencils[part][var]); pstencil_size = 0; for (i = 0; i < stencil_size; i++) { if (split[i] > -1) { pstencil_size++; } } HYPRE_SStructStencilCreate(pstencil_ndim, pstencil_size, &pstencils[var]); for (i = 0; i < stencil_size; i++) { if (split[i] > -1) { HYPRE_SStructStencilSetEntry(pstencils[var], split[i], stencil_shape[i], stencil_vars[i]); } } } pcomm = hypre_SStructPGridComm(pgrid); hypre_SStructPMatrixCreate(pcomm, pgrid, pstencils, &pmatrices[part]); for (var = 0; var < nvars; var++) { for (i = 0; i < nvars; i++) { hypre_SStructPMatrixSetSymmetric(pmatrices[part], var, i, symmetric[part][var][i]); } } hypre_SStructPMatrixInitialize(pmatrices[part]); } /* U-matrix */ /* GEC0902 knowing the kind of matrix we can create the IJMATRIX with the * the right dimension (HYPRE_PARCSR without ghosts) */ grid = hypre_SStructGraphGrid(graph); domain_grid = hypre_SStructGraphDomainGrid(graph); comm = hypre_SStructMatrixComm(matrix); if (matrix_type == HYPRE_PARCSR) { ilower = hypre_SStructGridStartRank(grid); iupper = ilower + hypre_SStructGridLocalSize(grid) - 1; jlower = hypre_SStructGridStartRank(domain_grid); jupper = jlower + hypre_SStructGridLocalSize(domain_grid) - 1; } else if (matrix_type == HYPRE_SSTRUCT || matrix_type == HYPRE_STRUCT) { ilower = hypre_SStructGridGhstartRank(grid); iupper = ilower + hypre_SStructGridGhlocalSize(grid) - 1; jlower = hypre_SStructGridGhstartRank(domain_grid); jupper = jlower + hypre_SStructGridGhlocalSize(domain_grid) - 1; } else { hypre_error_w_msg(HYPRE_ERROR_GENERIC, "Invalid matrix type!\n"); return hypre_error_flag; } HYPRE_IJMatrixCreate(comm, ilower, iupper, jlower, jupper, &hypre_SStructMatrixIJMatrix(matrix)); hypre_SStructUMatrixInitialize(matrix); return hypre_error_flag; } HYPRE_Int HYPRE_SStructMatrixSetEarlyAssemble( HYPRE_SStructMatrix matrix, HYPRE_Int early_assemble ) { HYPRE_IJMatrix ijmatrix = hypre_SStructMatrixIJMatrix(matrix); if (ijmatrix) { HYPRE_IJMatrixSetEarlyAssemble(ijmatrix, early_assemble); } return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_SStructMatrixSetValues( HYPRE_SStructMatrix matrix, HYPRE_Int part, HYPRE_Int *index, HYPRE_Int var, HYPRE_Int nentries, HYPRE_Int *entries, HYPRE_Complex *values ) { hypre_SStructMatrixSetValues(matrix, part, index, var, nentries, entries, values, 0); return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_SStructMatrixAddToValues( HYPRE_SStructMatrix matrix, HYPRE_Int part, HYPRE_Int *index, HYPRE_Int var, HYPRE_Int nentries, HYPRE_Int *entries, HYPRE_Complex *values ) { hypre_SStructMatrixSetValues(matrix, part, index, var, nentries, entries, values, 1); return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ /* ONLY3D - RDF: Why? */ HYPRE_Int HYPRE_SStructMatrixAddFEMValues( HYPRE_SStructMatrix matrix, HYPRE_Int part, HYPRE_Int *index, HYPRE_Complex *values ) { HYPRE_Int ndim = hypre_SStructMatrixNDim(matrix); hypre_SStructGraph *graph = hypre_SStructMatrixGraph(matrix); hypre_SStructGrid *grid = hypre_SStructGraphGrid(graph); HYPRE_Int fem_nsparse = hypre_SStructGraphFEMPNSparse(graph, part); HYPRE_Int *fem_sparse_i = hypre_SStructGraphFEMPSparseI(graph, part); HYPRE_Int *fem_entries = hypre_SStructGraphFEMPEntries(graph, part); HYPRE_Int *fem_vars = hypre_SStructGridFEMPVars(grid, part); hypre_Index *fem_offsets = hypre_SStructGridFEMPOffsets(grid, part); HYPRE_Int s, i, d, vindex[HYPRE_MAXDIM]; /* Set one coefficient at a time */ for (s = 0; s < fem_nsparse; s++) { i = fem_sparse_i[s]; for (d = 0; d < ndim; d++) { /* note: these offsets are different from what the user passes in */ vindex[d] = index[d] + hypre_IndexD(fem_offsets[i], d); } HYPRE_SStructMatrixAddToValues( matrix, part, vindex, fem_vars[i], 1, &fem_entries[s], &values[s]); } return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_SStructMatrixGetValues( HYPRE_SStructMatrix matrix, HYPRE_Int part, HYPRE_Int *index, HYPRE_Int var, HYPRE_Int nentries, HYPRE_Int *entries, HYPRE_Complex *values ) { hypre_SStructMatrixSetValues(matrix, part, index, var, nentries, entries, values, -1); return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ /* ONLY3D - RDF: Why? */ HYPRE_Int HYPRE_SStructMatrixGetFEMValues( HYPRE_SStructMatrix matrix, HYPRE_Int part, HYPRE_Int *index, HYPRE_Complex *values ) { HYPRE_Int ndim = hypre_SStructMatrixNDim(matrix); hypre_SStructGraph *graph = hypre_SStructMatrixGraph(matrix); hypre_SStructGrid *grid = hypre_SStructGraphGrid(graph); HYPRE_Int fem_nsparse = hypre_SStructGraphFEMPNSparse(graph, part); HYPRE_Int *fem_sparse_i = hypre_SStructGraphFEMPSparseI(graph, part); HYPRE_Int *fem_entries = hypre_SStructGraphFEMPEntries(graph, part); HYPRE_Int *fem_vars = hypre_SStructGridFEMPVars(grid, part); hypre_Index *fem_offsets = hypre_SStructGridFEMPOffsets(grid, part); HYPRE_Int s, i, d, vindex[HYPRE_MAXDIM]; for (s = 0; s < fem_nsparse; s++) { i = fem_sparse_i[s]; for (d = 0; d < ndim; d++) { /* note: these offsets are different from what the user passes in */ vindex[d] = index[d] + hypre_IndexD(fem_offsets[i], d); } hypre_SStructMatrixSetValues( matrix, part, vindex, fem_vars[i], 1, &fem_entries[s], &values[s], -1); } return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_SStructMatrixSetBoxValues( HYPRE_SStructMatrix matrix, HYPRE_Int part, HYPRE_Int *ilower, HYPRE_Int *iupper, HYPRE_Int var, HYPRE_Int nentries, HYPRE_Int *entries, HYPRE_Complex *values ) { HYPRE_SStructMatrixSetBoxValues2(matrix, part, ilower, iupper, var, nentries, entries, ilower, iupper, values); return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_SStructMatrixAddToBoxValues( HYPRE_SStructMatrix matrix, HYPRE_Int part, HYPRE_Int *ilower, HYPRE_Int *iupper, HYPRE_Int var, HYPRE_Int nentries, HYPRE_Int *entries, HYPRE_Complex *values ) { HYPRE_SStructMatrixAddToBoxValues2(matrix, part, ilower, iupper, var, nentries, entries, ilower, iupper, values); return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_SStructMatrixGetBoxValues( HYPRE_SStructMatrix matrix, HYPRE_Int part, HYPRE_Int *ilower, HYPRE_Int *iupper, HYPRE_Int var, HYPRE_Int nentries, HYPRE_Int *entries, HYPRE_Complex *values ) { HYPRE_SStructMatrixGetBoxValues2(matrix, part, ilower, iupper, var, nentries, entries, ilower, iupper, values); return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_SStructMatrixSetBoxValues2( HYPRE_SStructMatrix matrix, HYPRE_Int part, HYPRE_Int *ilower, HYPRE_Int *iupper, HYPRE_Int var, HYPRE_Int nentries, HYPRE_Int *entries, HYPRE_Int *vilower, HYPRE_Int *viupper, HYPRE_Complex *values ) { hypre_Box *set_box, *value_box; HYPRE_Int d, ndim = hypre_SStructMatrixNDim(matrix); /* This creates boxes with zeroed-out extents */ set_box = hypre_BoxCreate(ndim); value_box = hypre_BoxCreate(ndim); for (d = 0; d < ndim; d++) { hypre_BoxIMinD(set_box, d) = ilower[d]; hypre_BoxIMaxD(set_box, d) = iupper[d]; hypre_BoxIMinD(value_box, d) = vilower[d]; hypre_BoxIMaxD(value_box, d) = viupper[d]; } hypre_SStructMatrixSetBoxValues(matrix, part, set_box, var, nentries, entries, value_box, values, 0); hypre_BoxDestroy(set_box); hypre_BoxDestroy(value_box); return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_SStructMatrixAddToBoxValues2( HYPRE_SStructMatrix matrix, HYPRE_Int part, HYPRE_Int *ilower, HYPRE_Int *iupper, HYPRE_Int var, HYPRE_Int nentries, HYPRE_Int *entries, HYPRE_Int *vilower, HYPRE_Int *viupper, HYPRE_Complex *values ) { hypre_Box *set_box, *value_box; HYPRE_Int d, ndim = hypre_SStructMatrixNDim(matrix); /* This creates boxes with zeroed-out extents */ set_box = hypre_BoxCreate(ndim); value_box = hypre_BoxCreate(ndim); for (d = 0; d < ndim; d++) { hypre_BoxIMinD(set_box, d) = ilower[d]; hypre_BoxIMaxD(set_box, d) = iupper[d]; hypre_BoxIMinD(value_box, d) = vilower[d]; hypre_BoxIMaxD(value_box, d) = viupper[d]; } hypre_SStructMatrixSetBoxValues(matrix, part, set_box, var, nentries, entries, value_box, values, 1); hypre_BoxDestroy(set_box); hypre_BoxDestroy(value_box); return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_SStructMatrixGetBoxValues2( HYPRE_SStructMatrix matrix, HYPRE_Int part, HYPRE_Int *ilower, HYPRE_Int *iupper, HYPRE_Int var, HYPRE_Int nentries, HYPRE_Int *entries, HYPRE_Int *vilower, HYPRE_Int *viupper, HYPRE_Complex *values ) { hypre_Box *set_box, *value_box; HYPRE_Int d, ndim = hypre_SStructMatrixNDim(matrix); /* This creates boxes with zeroed-out extents */ set_box = hypre_BoxCreate(ndim); value_box = hypre_BoxCreate(ndim); for (d = 0; d < ndim; d++) { hypre_BoxIMinD(set_box, d) = ilower[d]; hypre_BoxIMaxD(set_box, d) = iupper[d]; hypre_BoxIMinD(value_box, d) = vilower[d]; hypre_BoxIMaxD(value_box, d) = viupper[d]; } hypre_SStructMatrixSetBoxValues(matrix, part, set_box, var, nentries, entries, value_box, values, -1); hypre_BoxDestroy(set_box); hypre_BoxDestroy(value_box); return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_SStructMatrixAddFEMBoxValues(HYPRE_SStructMatrix matrix, HYPRE_Int part, HYPRE_Int *ilower, HYPRE_Int *iupper, HYPRE_Complex *values) { HYPRE_Int ndim = hypre_SStructMatrixNDim(matrix); hypre_SStructGraph *graph = hypre_SStructMatrixGraph(matrix); hypre_SStructGrid *grid = hypre_SStructGraphGrid(graph); HYPRE_MemoryLocation memory_location = hypre_SStructMatrixMemoryLocation(matrix); HYPRE_Int fem_nsparse = hypre_SStructGraphFEMPNSparse(graph, part); HYPRE_Int *fem_sparse_i = hypre_SStructGraphFEMPSparseI(graph, part); HYPRE_Int *fem_entries = hypre_SStructGraphFEMPEntries(graph, part); HYPRE_Int *fem_vars = hypre_SStructGridFEMPVars(grid, part); hypre_Index *fem_offsets = hypre_SStructGridFEMPOffsets(grid, part); HYPRE_Complex *tvalues; hypre_Box *box; HYPRE_Int s, i, d, vilower[HYPRE_MAXDIM], viupper[HYPRE_MAXDIM]; HYPRE_Int ei, vi, nelts; /* Set one coefficient at a time */ box = hypre_BoxCreate(ndim); hypre_BoxSetExtents(box, ilower, iupper); nelts = hypre_BoxVolume(box); tvalues = hypre_TAlloc(HYPRE_Complex, nelts, memory_location); for (s = 0; s < fem_nsparse; s++) { i = fem_sparse_i[s]; for (d = 0; d < ndim; d++) { /* note: these offsets are different from what the user passes in */ vilower[d] = ilower[d] + hypre_IndexD(fem_offsets[i], d); viupper[d] = iupper[d] + hypre_IndexD(fem_offsets[i], d); } #if defined(HYPRE_USING_GPU) if (hypre_GetExecPolicy1(memory_location) == HYPRE_EXEC_DEVICE) { hypreDevice_ComplexStridedCopy(nelts, fem_nsparse, values + s, tvalues); } else #endif { for (ei = 0, vi = s; ei < nelts; ei ++, vi += fem_nsparse) { tvalues[ei] = values[vi]; } } HYPRE_SStructMatrixAddToBoxValues(matrix, part, vilower, viupper, fem_vars[i], 1, &fem_entries[s], tvalues); } /* Free memory */ hypre_TFree(tvalues, memory_location); hypre_BoxDestroy(box); return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_SStructMatrixAssemble( HYPRE_SStructMatrix matrix ) { HYPRE_Int ndim = hypre_SStructMatrixNDim(matrix); hypre_SStructGraph *graph = hypre_SStructMatrixGraph(matrix); HYPRE_Int nparts = hypre_SStructMatrixNParts(matrix); hypre_SStructPMatrix **pmatrices = hypre_SStructMatrixPMatrices(matrix); hypre_SStructGrid *grid = hypre_SStructGraphGrid(graph); hypre_SStructCommInfo **vnbor_comm_info = hypre_SStructGridVNborCommInfo(grid); HYPRE_Int vnbor_ncomms = hypre_SStructGridVNborNComms(grid); HYPRE_Int part; hypre_CommInfo *comm_info; HYPRE_Int send_part, recv_part; HYPRE_Int send_var, recv_var; hypre_StructMatrix *send_matrix, *recv_matrix; hypre_CommPkg *comm_pkg; hypre_CommHandle *comm_handle; HYPRE_Int ci; /*------------------------------------------------------ * NOTE: Inter-part couplings were taken care of earlier. *------------------------------------------------------*/ /*------------------------------------------------------ * Communicate and accumulate within parts *------------------------------------------------------*/ for (part = 0; part < nparts; part++) { hypre_SStructPMatrixAccumulate(pmatrices[part]); } /*------------------------------------------------------ * Communicate and accumulate between parts *------------------------------------------------------*/ for (ci = 0; ci < vnbor_ncomms; ci++) { comm_info = hypre_SStructCommInfoCommInfo(vnbor_comm_info[ci]); send_part = hypre_SStructCommInfoSendPart(vnbor_comm_info[ci]); recv_part = hypre_SStructCommInfoRecvPart(vnbor_comm_info[ci]); send_var = hypre_SStructCommInfoSendVar(vnbor_comm_info[ci]); recv_var = hypre_SStructCommInfoRecvVar(vnbor_comm_info[ci]); send_matrix = hypre_SStructPMatrixSMatrix( hypre_SStructMatrixPMatrix(matrix, send_part), send_var, send_var); recv_matrix = hypre_SStructPMatrixSMatrix( hypre_SStructMatrixPMatrix(matrix, recv_part), recv_var, recv_var); if ((send_matrix != NULL) && (recv_matrix != NULL)) { hypre_StructStencil *send_stencil = hypre_StructMatrixStencil(send_matrix); hypre_StructStencil *recv_stencil = hypre_StructMatrixStencil(recv_matrix); HYPRE_Int num_values, stencil_size, num_transforms; HYPRE_Int *symm; HYPRE_Int *v_to_s, *s_to_v; hypre_Index *coords, *dirs; HYPRE_Int **orders, *order; hypre_IndexRef sentry0; hypre_Index sentry1; HYPRE_Int ti, si, i, j; /* to compute 'orders', remember that we are doing reverse communication */ num_values = hypre_StructMatrixNumValues(recv_matrix); symm = hypre_StructMatrixSymmElements(recv_matrix); stencil_size = hypre_StructStencilSize(recv_stencil); v_to_s = hypre_TAlloc(HYPRE_Int, num_values, HYPRE_MEMORY_HOST); s_to_v = hypre_TAlloc(HYPRE_Int, stencil_size, HYPRE_MEMORY_HOST); for (si = 0, i = 0; si < stencil_size; si++) { s_to_v[si] = -1; if (symm[si] < 0) /* this is a stored coefficient */ { v_to_s[i] = si; s_to_v[si] = i; i++; } } hypre_CommInfoGetTransforms(comm_info, &num_transforms, &coords, &dirs); orders = hypre_TAlloc(HYPRE_Int *, num_transforms, HYPRE_MEMORY_HOST); order = hypre_TAlloc(HYPRE_Int, num_values, HYPRE_MEMORY_HOST); for (ti = 0; ti < num_transforms; ti++) { for (i = 0; i < num_values; i++) { si = v_to_s[i]; sentry0 = hypre_StructStencilElement(recv_stencil, si); for (j = 0; j < ndim; j++) { hypre_IndexD(sentry1, hypre_IndexD(coords[ti], j)) = hypre_IndexD(sentry0, j) * hypre_IndexD(dirs[ti], j); } order[i] = hypre_StructStencilElementRank(send_stencil, sentry1); /* currently, both send and recv transforms are parsed */ if (order[i] > -1) { order[i] = s_to_v[order[i]]; } } /* want order to indicate the natural order on the remote process */ orders[ti] = hypre_TAlloc(HYPRE_Int, num_values, HYPRE_MEMORY_HOST); for (i = 0; i < num_values; i++) { orders[ti][i] = -1; } for (i = 0; i < num_values; i++) { if (order[i] > -1) { orders[ti][order[i]] = i; } } } hypre_TFree(v_to_s, HYPRE_MEMORY_HOST); hypre_TFree(s_to_v, HYPRE_MEMORY_HOST); hypre_TFree(order, HYPRE_MEMORY_HOST); /* want to communicate and add ghost data to real data */ hypre_CommPkgCreate(comm_info, hypre_StructMatrixDataSpace(send_matrix), hypre_StructMatrixDataSpace(recv_matrix), num_values, orders, 1, hypre_StructMatrixComm(send_matrix), &comm_pkg); /* note reversal of send/recv data here */ hypre_InitializeCommunication(comm_pkg, hypre_StructMatrixData(recv_matrix), hypre_StructMatrixData(send_matrix), 1, 0, &comm_handle); hypre_FinalizeCommunication(comm_handle); hypre_CommPkgDestroy(comm_pkg); for (ti = 0; ti < num_transforms; ti++) { hypre_TFree(orders[ti], HYPRE_MEMORY_HOST); } hypre_TFree(orders, HYPRE_MEMORY_HOST); } } /*------------------------------------------------------ * Assemble P and U matrices *------------------------------------------------------*/ for (part = 0; part < nparts; part++) { hypre_SStructPMatrixAssemble(pmatrices[part]); } /* U-matrix */ hypre_SStructUMatrixAssemble(matrix); return hypre_error_flag; } /*-------------------------------------------------------------------------- * NOTE: Should set things up so that this information can be passed * immediately to the PMatrix. Unfortunately, the PMatrix is * currently not created until the SStructMatrix is initialized. *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_SStructMatrixSetSymmetric( HYPRE_SStructMatrix matrix, HYPRE_Int part, HYPRE_Int var, HYPRE_Int to_var, HYPRE_Int symmetric ) { HYPRE_Int ***msymmetric = hypre_SStructMatrixSymmetric(matrix); hypre_SStructGraph *graph = hypre_SStructMatrixGraph(matrix); hypre_SStructPGrid *pgrid; HYPRE_Int pstart = part; HYPRE_Int psize = 1; HYPRE_Int vstart = var; HYPRE_Int vsize = 1; HYPRE_Int tstart = to_var; HYPRE_Int tsize = 1; HYPRE_Int p, v, t; if (part == -1) { pstart = 0; psize = hypre_SStructMatrixNParts(matrix); } for (p = pstart; p < psize; p++) { pgrid = hypre_SStructGraphPGrid(graph, p); if (var == -1) { vstart = 0; vsize = hypre_SStructPGridNVars(pgrid); } if (to_var == -1) { tstart = 0; tsize = hypre_SStructPGridNVars(pgrid); } for (v = vstart; v < vsize; v++) { for (t = tstart; t < tsize; t++) { msymmetric[p][v][t] = symmetric; } } } return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_SStructMatrixSetNSSymmetric( HYPRE_SStructMatrix matrix, HYPRE_Int symmetric ) { hypre_SStructMatrixNSSymmetric(matrix) = symmetric; return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_SStructMatrixSetObjectType( HYPRE_SStructMatrix matrix, HYPRE_Int type ) { hypre_SStructGraph *graph = hypre_SStructMatrixGraph(matrix); HYPRE_Int ***splits = hypre_SStructMatrixSplits(matrix); HYPRE_Int nparts = hypre_SStructMatrixNParts(matrix); hypre_SStructStencil ***stencils = hypre_SStructGraphStencils(graph); hypre_SStructPGrid *pgrid; HYPRE_Int nvars; HYPRE_Int stencil_size; HYPRE_Int part, var, i; hypre_SStructMatrixObjectType(matrix) = type ; /* RDF: This and all other modifications to 'split' really belong * in the Initialize routine */ if (type != HYPRE_SSTRUCT && type != HYPRE_STRUCT) { for (part = 0; part < nparts; part++) { pgrid = hypre_SStructGraphPGrid(graph, part); nvars = hypre_SStructPGridNVars(pgrid); for (var = 0; var < nvars; var++) { stencil_size = hypre_SStructStencilSize(stencils[part][var]); for (i = 0; i < stencil_size; i++) { splits[part][var][i] = -1; } } } } return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_SStructMatrixGetObject( HYPRE_SStructMatrix matrix, void **object ) { HYPRE_Int type = hypre_SStructMatrixObjectType(matrix); hypre_SStructPMatrix *pmatrix; hypre_StructMatrix *smatrix; HYPRE_Int part, var; if (type == HYPRE_SSTRUCT) { *object = matrix; } else if (type == HYPRE_PARCSR) { *object = hypre_SStructMatrixParCSRMatrix(matrix); } else if (type == HYPRE_STRUCT) { /* only one part & one variable */ part = 0; var = 0; pmatrix = hypre_SStructMatrixPMatrix(matrix, part); smatrix = hypre_SStructPMatrixSMatrix(pmatrix, var, var); *object = smatrix; } return hypre_error_flag; } /*-------------------------------------------------------------------------- * HYPRE_SStructMatrixPrint * * This function prints a SStructMatrix to file. Assumptions: * * 1) All StructMatrices have the same number of ghost layers. * 2) Range and domain num_ghosts are equal. * * TODO: Add GPU support *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_SStructMatrixPrint( const char *filename, HYPRE_SStructMatrix matrix, HYPRE_Int all ) { /* Matrix variables */ MPI_Comm comm = hypre_SStructMatrixComm(matrix); HYPRE_Int nparts = hypre_SStructMatrixNParts(matrix); hypre_SStructGraph *graph = hypre_SStructMatrixGraph(matrix); hypre_SStructGrid *grid = hypre_SStructGraphGrid(graph); hypre_SStructStencil ***stencils = hypre_SStructGraphStencils(graph); hypre_SStructPMatrix *pmatrix; hypre_StructMatrix *smatrix; HYPRE_Int data_size; /* Local variables */ FILE *file; HYPRE_Int myid; HYPRE_Int part; HYPRE_Int var, vi, vj, nvars; HYPRE_Int num_symm_calls; char new_filename[255]; /* Sanity check */ hypre_assert(nparts > 0); /* Print auxiliary info */ hypre_MPI_Comm_rank(comm, &myid); hypre_sprintf(new_filename, "%s.SMatrix.%05d", filename, myid); if ((file = fopen(new_filename, "w")) == NULL) { hypre_printf("Error: can't open output file %s\n", new_filename); hypre_error_in_arg(1); return hypre_error_flag; } /* Print grid info */ hypre_fprintf(file, "SStructMatrix\n"); hypre_SStructGridPrint(file, grid); /* Print stencil info */ for (part = 0; part < nparts; part++) { pmatrix = hypre_SStructMatrixPMatrix(matrix, part); nvars = hypre_SStructPMatrixNVars(pmatrix); for (var = 0; var < nvars; var++) { hypre_fprintf(file, "\nStencil - (Part %d, Var %d):\n", part, var); HYPRE_SStructStencilPrint(file, stencils[part][var]); } } hypre_fprintf(file, "\n"); /* Print graph info */ HYPRE_SStructGraphPrint(file, graph); /* Print symmetric info */ num_symm_calls = 0; for (part = 0; part < nparts; part++) { pmatrix = hypre_SStructMatrixPMatrix(matrix, part); nvars = hypre_SStructPMatrixNVars(pmatrix); for (vi = 0; vi < nvars; vi++) { for (vj = 0; vj < nvars; vj++) { smatrix = hypre_SStructPMatrixSMatrix(pmatrix, vi, vj); if (smatrix) { num_symm_calls++; } } } } hypre_fprintf(file, "\nMatrixNumSetSymmetric: %d", num_symm_calls); for (part = 0; part < nparts; part++) { pmatrix = hypre_SStructMatrixPMatrix(matrix, part); nvars = hypre_SStructPMatrixNVars(pmatrix); for (vi = 0; vi < nvars; vi++) { for (vj = 0; vj < nvars; vj++) { smatrix = hypre_SStructPMatrixSMatrix(pmatrix, vi, vj); if (smatrix) { hypre_fprintf(file, "\nMatrixSetSymmetric: %d %d %d %d", part, vi, vj, hypre_StructMatrixSymmetric(smatrix)); } } } } hypre_fprintf(file, "\n"); /* Print data */ for (part = 0; part < nparts; part++) { pmatrix = hypre_SStructMatrixPMatrix(matrix, part); nvars = hypre_SStructPMatrixNVars(pmatrix); for (vi = 0; vi < nvars; vi++) { for (vj = 0; vj < nvars; vj++) { smatrix = hypre_SStructPMatrixSMatrix(pmatrix, vi, vj); data_size = (smatrix) ? hypre_StructMatrixDataSize(smatrix) : 0; hypre_fprintf(file, "\nData - (Part %d, Vi %d, Vj %d): %d\n", part, vi, vj, data_size); if (smatrix) { hypre_StructMatrixPrintData(file, smatrix, all); } } } } fclose(file); /* Print unstructured matrix (U-Matrix) */ hypre_sprintf(new_filename, "%s.UMatrix", filename); HYPRE_IJMatrixPrint(hypre_SStructMatrixIJMatrix(matrix), new_filename); return hypre_error_flag; } /*-------------------------------------------------------------------------- * HYPRE_SStructMatrixRead *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_SStructMatrixRead( MPI_Comm comm, const char *filename, HYPRE_SStructMatrix *matrix_ptr ) { /* Matrix variables */ HYPRE_SStructMatrix matrix; hypre_SStructPMatrix *pmatrix; hypre_StructMatrix *smatrix; HYPRE_SStructGrid grid; hypre_SStructPGrid *pgrid; HYPRE_SStructGraph graph; HYPRE_SStructStencil **stencils; HYPRE_Int nparts; HYPRE_Int nvars; HYPRE_Int data_size; HYPRE_IJMatrix umatrix; HYPRE_IJMatrix h_umatrix; hypre_ParCSRMatrix *h_parmatrix; hypre_ParCSRMatrix *parmatrix = NULL; /* Local variables */ FILE *file; HYPRE_Int myid; HYPRE_Int part, var; HYPRE_Int p, v, i, j, vi, vj; HYPRE_Int symmetric; HYPRE_Int num_symm_calls; char new_filename[255]; HYPRE_MemoryLocation memory_location = hypre_HandleMemoryLocation(hypre_handle()); hypre_MPI_Comm_rank(comm, &myid); /*----------------------------------------------------------- * Read S-Matrix *-----------------------------------------------------------*/ hypre_sprintf(new_filename, "%s.SMatrix.%05d", filename, myid); if ((file = fopen(new_filename, "r")) == NULL) { hypre_printf("Error: can't open input file %s\n", new_filename); hypre_error_in_arg(2); return hypre_error_flag; } /* Read grid info */ hypre_fscanf(file, "SStructMatrix\n"); hypre_SStructGridRead(comm, file, &grid); nparts = hypre_SStructGridNParts(grid); /* Read stencil info */ stencils = hypre_TAlloc(HYPRE_SStructStencil *, nparts, HYPRE_MEMORY_HOST); for (p = 0; p < nparts; p++) { pgrid = hypre_SStructGridPGrid(grid, p); nvars = hypre_SStructPGridNVars(pgrid); stencils[p] = hypre_TAlloc(HYPRE_SStructStencil, nvars, HYPRE_MEMORY_HOST); for (v = 0; v < nvars; v++) { hypre_fscanf(file, "\nStencil - (Part %d, Var %d):\n", &part, &var); HYPRE_SStructStencilRead(file, &stencils[part][var]); } } hypre_fscanf(file, "\n"); /* Read graph info */ HYPRE_SStructGraphRead(file, grid, stencils, &graph); /* Free memory */ for (part = 0; part < nparts; part++) { pgrid = hypre_SStructGridPGrid(grid, part); nvars = hypre_SStructPGridNVars(pgrid); for (var = 0; var < nvars; var++) { HYPRE_SStructStencilDestroy(stencils[part][var]); } hypre_TFree(stencils[part], HYPRE_MEMORY_HOST); } hypre_TFree(stencils, HYPRE_MEMORY_HOST); /* Assemble graph */ HYPRE_SStructGraphAssemble(graph); /* Create matrix */ HYPRE_SStructMatrixCreate(comm, graph, &matrix); /* Read symmetric info */ hypre_fscanf(file, "\nMatrixNumSetSymmetric: %d", &num_symm_calls); for (i = 0; i < num_symm_calls; i++) { hypre_fscanf(file, "\nMatrixSetSymmetric: %d %d %d %d", &part, &vi, &vj, &symmetric); HYPRE_SStructMatrixSetSymmetric(matrix, part, vi, vj, symmetric); } hypre_fscanf(file, "\n"); /* Initialize matrix */ HYPRE_SStructMatrixInitialize(matrix); /* Read data */ for (p = 0; p < nparts; p++) { pmatrix = hypre_SStructMatrixPMatrix(matrix, p); nvars = hypre_SStructPMatrixNVars(pmatrix); for (i = 0; i < nvars; i++) { for (j = 0; j < nvars; j++) { hypre_fscanf(file, "\nData - (Part %d, Vi %d, Vj %d): %d\n", &part, &vi, &vj, &data_size); pmatrix = hypre_SStructMatrixPMatrix(matrix, part); smatrix = hypre_SStructPMatrixSMatrix(pmatrix, vi, vj); if (data_size > 0) { hypre_StructMatrixReadData(file, smatrix); } } } } fclose(file); /*----------------------------------------------------------- * Read U-Matrix *-----------------------------------------------------------*/ /* Read unstructured matrix from file using host memory */ hypre_sprintf(new_filename, "%s.UMatrix", filename); HYPRE_IJMatrixRead(new_filename, comm, HYPRE_PARCSR, &h_umatrix); h_parmatrix = (hypre_ParCSRMatrix*) hypre_IJMatrixObject(h_umatrix); /* Move ParCSRMatrix to device memory if necessary */ if (hypre_GetActualMemLocation(memory_location) != hypre_MEMORY_HOST) { parmatrix = hypre_ParCSRMatrixClone_v2(h_parmatrix, 1, memory_location); } else { parmatrix = h_parmatrix; hypre_IJMatrixObject(h_umatrix) = NULL; } /* Free memory */ HYPRE_IJMatrixDestroy(h_umatrix); /* Update the umatrix with contents read from file, which now live on the correct memory location */ umatrix = hypre_SStructMatrixIJMatrix(matrix); hypre_IJMatrixDestroyParCSR(umatrix); hypre_IJMatrixObject(umatrix) = (void*) parmatrix; hypre_SStructMatrixParCSRMatrix(matrix) = (hypre_ParCSRMatrix*) parmatrix; hypre_IJMatrixAssembleFlag(umatrix) = 1; /* Assemble SStructMatrix */ HYPRE_SStructMatrixAssemble(matrix); /* Decrease ref counters */ HYPRE_SStructGraphDestroy(graph); HYPRE_SStructGridDestroy(grid); *matrix_ptr = matrix; return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_SStructMatrixMatvec( HYPRE_Complex alpha, HYPRE_SStructMatrix A, HYPRE_SStructVector x, HYPRE_Complex beta, HYPRE_SStructVector y ) { hypre_SStructMatvec(alpha, A, x, beta, y); return hypre_error_flag; } hypre-2.33.0/src/sstruct_mv/HYPRE_sstruct_mv.h000066400000000000000000001300511477326011500212650ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #ifndef HYPRE_SSTRUCT_MV_HEADER #define HYPRE_SSTRUCT_MV_HEADER #include "HYPRE_utilities.h" #include "HYPRE.h" #include "HYPRE_struct_mv.h" #include "HYPRE_IJ_mv.h" #ifdef __cplusplus extern "C" { #endif /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ /** * @defgroup SStructSystemInterface SStruct System Interface * * A semi-structured-grid conceptual interface. This interface represents a * semi-structured-grid conceptual view of a linear system. * * @{ **/ /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ /** * @name SStruct Grids * * @{ **/ struct hypre_SStructGrid_struct; /** * A grid object is constructed out of several structured "parts" and an * optional unstructured "part". Each structured part has its own abstract * index space. **/ typedef struct hypre_SStructGrid_struct *HYPRE_SStructGrid; /** * An enumerated type that supports cell centered, node centered, face centered, * and edge centered variables. Face centered variables are split into x-face, * y-face, and z-face variables, and edge centered variables are split into * x-edge, y-edge, and z-edge variables. The edge centered variable types are * only used in 3D. In 2D, edge centered variables are handled by the face * centered types. * * Variables are referenced relative to an abstract (cell centered) index in the * following way: * - cell centered variables are aligned with the index; * - node centered variables are aligned with the cell corner * at relative index (1/2, 1/2, 1/2); * - x-face, y-face, and z-face centered variables are aligned * with the faces at relative indexes (1/2, 0, 0), (0, 1/2, 0), * and (0, 0, 1/2), respectively; * - x-edge, y-edge, and z-edge centered variables are aligned * with the edges at relative indexes (0, 1/2, 1/2), (1/2, 0, 1/2), * and (1/2, 1/2, 0), respectively. * * The supported identifiers are: * - \c HYPRE_SSTRUCT_VARIABLE_CELL * - \c HYPRE_SSTRUCT_VARIABLE_NODE * - \c HYPRE_SSTRUCT_VARIABLE_XFACE * - \c HYPRE_SSTRUCT_VARIABLE_YFACE * - \c HYPRE_SSTRUCT_VARIABLE_ZFACE * - \c HYPRE_SSTRUCT_VARIABLE_XEDGE * - \c HYPRE_SSTRUCT_VARIABLE_YEDGE * - \c HYPRE_SSTRUCT_VARIABLE_ZEDGE * * NOTE: Although variables are referenced relative to a unique abstract * cell-centered index, some variables are associated with multiple grid cells. * For example, node centered variables in 3D are associated with 8 cells (away * from boundaries). Although grid cells are distributed uniquely to different * processes, variables may be owned by multiple processes because they may be * associated with multiple cells. **/ typedef HYPRE_Int HYPRE_SStructVariable; #define HYPRE_SSTRUCT_VARIABLE_UNDEFINED -1 #define HYPRE_SSTRUCT_VARIABLE_CELL 0 #define HYPRE_SSTRUCT_VARIABLE_NODE 1 #define HYPRE_SSTRUCT_VARIABLE_XFACE 2 #define HYPRE_SSTRUCT_VARIABLE_YFACE 3 #define HYPRE_SSTRUCT_VARIABLE_ZFACE 4 #define HYPRE_SSTRUCT_VARIABLE_XEDGE 5 #define HYPRE_SSTRUCT_VARIABLE_YEDGE 6 #define HYPRE_SSTRUCT_VARIABLE_ZEDGE 7 /** * Create an ndim-dimensional grid object with \e nparts structured * parts. **/ HYPRE_Int HYPRE_SStructGridCreate(MPI_Comm comm, HYPRE_Int ndim, HYPRE_Int nparts, HYPRE_SStructGrid *grid); /** * Destroy a grid object. An object should be explicitly destroyed using this * destructor when the user's code no longer needs direct access to it. Once * destroyed, the object must not be referenced again. Note that the object may * not be deallocated at the completion of this call, since there may be * internal package references to the object. The object will then be destroyed * when all internal reference counts go to zero. **/ HYPRE_Int HYPRE_SStructGridDestroy(HYPRE_SStructGrid grid); /** * Set the extents for a box on a structured part of the grid. **/ HYPRE_Int HYPRE_SStructGridSetExtents(HYPRE_SStructGrid grid, HYPRE_Int part, HYPRE_Int *ilower, HYPRE_Int *iupper); /** * Describe the variables that live on a structured part of the grid. **/ HYPRE_Int HYPRE_SStructGridSetVariables(HYPRE_SStructGrid grid, HYPRE_Int part, HYPRE_Int nvars, HYPRE_SStructVariable *vartypes); /** * Describe additional variables that live at a particular index. These * variables are appended to the array of variables set in * \ref HYPRE_SStructGridSetVariables, and are referenced as such. * * NOTE: This routine is not yet supported. **/ HYPRE_Int HYPRE_SStructGridAddVariables(HYPRE_SStructGrid grid, HYPRE_Int part, HYPRE_Int *index, HYPRE_Int nvars, HYPRE_SStructVariable *vartypes); /** * Set the ordering of variables in a finite element problem. This overrides * the default ordering described below. * * Array \e ordering is composed of blocks of size (1 + \e ndim). Each * block indicates a specific variable in the element and the ordering of the * blocks defines the ordering of the variables. A block contains a variable * number followed by an offset direction relative to the element's center. For * example, a block containing (2, 1, -1, 0) means variable 2 on the edge * located in the (1, -1, 0) direction from the center of the element. Note * that here variable 2 must be of type \c ZEDGE for this to make sense. The * \e ordering array must account for all variables in the element. This * routine can only be called after \ref HYPRE_SStructGridSetVariables. * * The default ordering for element variables (var, i, j, k) varies fastest in * index i, followed by j, then k, then var. For example, if var 0, var 1, and * var 2 are declared to be XFACE, YFACE, and NODE variables, respectively, then * the default ordering (in 2D) would first list the two XFACE variables, then * the two YFACE variables, then the four NODE variables as follows: * * (0,-1,0), (0,1,0), (1,0,-1), (1,0,1), (2,-1,-1), (2,1,-1), (2,-1,1), (2,1,1) **/ HYPRE_Int HYPRE_SStructGridSetFEMOrdering(HYPRE_SStructGrid grid, HYPRE_Int part, HYPRE_Int *ordering); /** * Describe how regions just outside of a part relate to other parts. This is * done a box at a time. * * Parts \e part and \e nbor_part must be different, except in the case * where only cell-centered data is used. * * Indexes should increase from \e ilower to \e iupper. It is not * necessary that indexes increase from \e nbor_ilower to \e * nbor_iupper. * * The \e index_map describes the mapping of indexes 0, 1, and 2 on part * \e part to the corresponding indexes on part \e nbor_part. For * example, triple (1, 2, 0) means that indexes 0, 1, and 2 on part \e part * map to indexes 1, 2, and 0 on part \e nbor_part, respectively. * * The \e index_dir describes the direction of the mapping in \e * index_map. For example, triple (1, 1, -1) means that for indexes 0 and 1, * increasing values map to increasing values on \e nbor_part, while for * index 2, decreasing values map to increasing values. * * NOTE: All parts related to each other via this routine must have an identical * list of variables and variable types. For example, if part 0 has only two * variables on it, a cell centered variable and a node centered variable, and * we declare part 1 to be a neighbor of part 0, then part 1 must also have only * two variables on it, and they must be of type cell and node. In addition, * variables associated with FACEs or EDGEs must be grouped together and listed * in X, Y, Z order. This is to enable the code to correctly associate * variables on one part with variables on its neighbor part when a coordinate * transformation is specified. For example, an XFACE variable on one part may * correspond to a YFACE variable on a neighbor part under a particular * tranformation, and the code determines this association by assuming that the * variable lists are as noted here. **/ HYPRE_Int HYPRE_SStructGridSetNeighborPart(HYPRE_SStructGrid grid, HYPRE_Int part, HYPRE_Int *ilower, HYPRE_Int *iupper, HYPRE_Int nbor_part, HYPRE_Int *nbor_ilower, HYPRE_Int *nbor_iupper, HYPRE_Int *index_map, HYPRE_Int *index_dir); /** * Describe how regions inside a part are shared with regions in other parts. * * Parts \e part and \e shared_part must be different. * * Indexes should increase from \e ilower to \e iupper. It is not necessary * that indexes increase from \e shared_ilower to \e shared_iupper. This is * to maintain consistency with the \c SetNeighborPart function, which is also * able to describe shared regions but in a more limited fashion. * * The \e offset is a triple (in 3D) used to indicate the dimensionality of * the shared set of data and its position with respect to the box extents \e * ilower and \e iupper on part \e part. The dimensionality is given by * the number of 0's in the triple, and the position is given by plus or minus * 1's. For example: (0, 0, 0) indicates sharing of all data in the given box; * (1, 0, 0) indicates sharing of data on the faces in the (1, 0, 0) direction; * (1, 0, -1) indicates sharing of data on the edges in the (1, 0, -1) * direction; and (1, -1, 1) indicates sharing of data on the nodes in the (1, * -1, 1) direction. To ensure the dimensionality, it is required that for * every nonzero entry, the corresponding extents of the box are the same. For * example, if \e offset is (0, 1, 0), then (2, 1, 3) and (10, 1, 15) are * valid box extents, whereas (2, 1, 3) and (10, 7, 15) are invalid (because 1 * and 7 are not the same). * * The \e shared_offset is used in the same way as \e offset, but with * respect to the box extents \e shared_ilower and \e shared_iupper on * part \e shared_part. * * The \e index_map describes the mapping of indexes 0, 1, and 2 on part * \e part to the corresponding indexes on part \e shared_part. For * example, triple (1, 2, 0) means that indexes 0, 1, and 2 on part \e part * map to indexes 1, 2, and 0 on part \e shared_part, respectively. * * The \e index_dir describes the direction of the mapping in \e * index_map. For example, triple (1, 1, -1) means that for indexes 0 and 1, * increasing values map to increasing values on \e shared_part, while for * index 2, decreasing values map to increasing values. * * NOTE: All parts related to each other via this routine must have an identical * list of variables and variable types. For example, if part 0 has only two * variables on it, a cell centered variable and a node centered variable, and * we declare part 1 to have shared regions with part 0, then part 1 must also * have only two variables on it, and they must be of type cell and node. In * addition, variables associated with FACEs or EDGEs must be grouped together * and listed in X, Y, Z order. This is to enable the code to correctly * associate variables on one part with variables on a shared part when a * coordinate transformation is specified. For example, an XFACE variable on * one part may correspond to a YFACE variable on a shared part under a * particular tranformation, and the code determines this association by * assuming that the variable lists are as noted here. **/ HYPRE_Int HYPRE_SStructGridSetSharedPart(HYPRE_SStructGrid grid, HYPRE_Int part, HYPRE_Int *ilower, HYPRE_Int *iupper, HYPRE_Int *offset, HYPRE_Int shared_part, HYPRE_Int *shared_ilower, HYPRE_Int *shared_iupper, HYPRE_Int *shared_offset, HYPRE_Int *index_map, HYPRE_Int *index_dir); /** * Add an unstructured part to the grid. The variables in the unstructured part * of the grid are referenced by a global rank between 0 and the total number of * unstructured variables minus one. Each process owns some unique consecutive * range of variables, defined by \e ilower and \e iupper. * * NOTE: This is just a placeholder. This part of the interface is not finished. **/ HYPRE_Int HYPRE_SStructGridAddUnstructuredPart(HYPRE_SStructGrid grid, HYPRE_Int ilower, HYPRE_Int iupper); /** * Finalize the construction of the grid before using. **/ HYPRE_Int HYPRE_SStructGridAssemble(HYPRE_SStructGrid grid); /** * Set the periodicity on a particular part. * * The argument \e periodic is an \e ndim-dimensional integer array that * contains the periodicity for each dimension. A zero value for a dimension * means non-periodic, while a nonzero value means periodic and contains the * actual period. For example, periodicity in the first and third dimensions * for a 10x11x12 part is indicated by the array [10,0,12]. * * NOTE: Some of the solvers in hypre have power-of-two restrictions on the size * of the periodic dimensions. **/ HYPRE_Int HYPRE_SStructGridSetPeriodic(HYPRE_SStructGrid grid, HYPRE_Int part, HYPRE_Int *periodic); /** * Setting ghost in the sgrids. **/ HYPRE_Int HYPRE_SStructGridSetNumGhost(HYPRE_SStructGrid grid, HYPRE_Int *num_ghost); /**@}*/ /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ /** * @name SStruct Stencils * * @{ **/ struct hypre_SStructStencil_struct; /** * The stencil object. **/ typedef struct hypre_SStructStencil_struct *HYPRE_SStructStencil; /** * Create a stencil object for the specified number of spatial dimensions and * stencil entries. **/ HYPRE_Int HYPRE_SStructStencilCreate(HYPRE_Int ndim, HYPRE_Int size, HYPRE_SStructStencil *stencil); /** * Destroy a stencil object. **/ HYPRE_Int HYPRE_SStructStencilDestroy(HYPRE_SStructStencil stencil); /** * Set a stencil entry. **/ HYPRE_Int HYPRE_SStructStencilSetEntry(HYPRE_SStructStencil stencil, HYPRE_Int entry, HYPRE_Int *offset, HYPRE_Int var); /**@}*/ /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ /** * @name SStruct Graphs * * @{ **/ struct hypre_SStructGraph_struct; /** * The graph object is used to describe the nonzero structure of a matrix. **/ typedef struct hypre_SStructGraph_struct *HYPRE_SStructGraph; /** * Create a graph object. **/ HYPRE_Int HYPRE_SStructGraphCreate(MPI_Comm comm, HYPRE_SStructGrid grid, HYPRE_SStructGraph *graph); /** * Destroy a graph object. **/ HYPRE_Int HYPRE_SStructGraphDestroy(HYPRE_SStructGraph graph); /** * Set the domain grid. **/ HYPRE_Int HYPRE_SStructGraphSetDomainGrid(HYPRE_SStructGraph graph, HYPRE_SStructGrid domain_grid); /** * Set the stencil for a variable on a structured part of the grid. **/ HYPRE_Int HYPRE_SStructGraphSetStencil(HYPRE_SStructGraph graph, HYPRE_Int part, HYPRE_Int var, HYPRE_SStructStencil stencil); /** * Indicate that an FEM approach will be used to set matrix values on this part. **/ HYPRE_Int HYPRE_SStructGraphSetFEM(HYPRE_SStructGraph graph, HYPRE_Int part); /** * Set the finite element stiffness matrix sparsity. This overrides the default * full sparsity pattern described below. * * Array \e sparsity contains \e nsparse row/column tuples (I,J) that * indicate the nonzeroes of the local stiffness matrix. The layout of the * values passed into the routine \ref HYPRE_SStructMatrixAddFEMValues is * determined here. * * The default sparsity is full (each variable is coupled to all others), and * the values passed into the routine \ref HYPRE_SStructMatrixAddFEMValues are * assumed to be by rows (that is, column indices vary fastest). **/ HYPRE_Int HYPRE_SStructGraphSetFEMSparsity(HYPRE_SStructGraph graph, HYPRE_Int part, HYPRE_Int nsparse, HYPRE_Int *sparsity); /** * Add a non-stencil graph entry at a particular index. This graph entry is * appended to the existing graph entries, and is referenced as such. * * NOTE: Users are required to set graph entries on all processes that own the * associated variables. This means that some data will be multiply defined. **/ HYPRE_Int HYPRE_SStructGraphAddEntries(HYPRE_SStructGraph graph, HYPRE_Int part, HYPRE_Int *index, HYPRE_Int var, HYPRE_Int to_part, HYPRE_Int *to_index, HYPRE_Int to_var); /** * Finalize the construction of the graph before using. **/ HYPRE_Int HYPRE_SStructGraphAssemble(HYPRE_SStructGraph graph); /** * Set the storage type of the associated matrix object. It is used before * AddEntries and Assemble to compute the right ranks in the graph. * * NOTE: This routine is only necessary for implementation reasons, and will * eventually be removed. * * @see HYPRE_SStructMatrixSetObjectType **/ HYPRE_Int HYPRE_SStructGraphSetObjectType(HYPRE_SStructGraph graph, HYPRE_Int type); /**@}*/ /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ /** * @name SStruct Matrices * * @{ **/ struct hypre_SStructMatrix_struct; /** * The matrix object. **/ typedef struct hypre_SStructMatrix_struct *HYPRE_SStructMatrix; /** * Create a matrix object. **/ HYPRE_Int HYPRE_SStructMatrixCreate(MPI_Comm comm, HYPRE_SStructGraph graph, HYPRE_SStructMatrix *matrix); /** * Destroy a matrix object. **/ HYPRE_Int HYPRE_SStructMatrixDestroy(HYPRE_SStructMatrix matrix); /** * Prepare a matrix object for setting coefficient values. **/ HYPRE_Int HYPRE_SStructMatrixInitialize(HYPRE_SStructMatrix matrix); /** * (Optional, GPU only) Sets if the matrix assemble routine does reductions * of the IJ part before calling HYPRE_SStructMatrixAssemble. * See also the comments of HYPRE_IJMatrixSetEarlyAssemble. * This early assemble feature may save the peak memory usage but requires * extra work. **/ HYPRE_Int HYPRE_SStructMatrixSetEarlyAssemble( HYPRE_SStructMatrix matrix, HYPRE_Int early_assemble ); /** * Set matrix coefficients index by index. The \e values array is of length * \e nentries. * * NOTE: For better efficiency, use \ref HYPRE_SStructMatrixSetBoxValues to set * coefficients a box at a time. * * NOTE: Users are required to set values on all processes that own the * associated variables. This means that some data will be multiply defined. * * NOTE: The entries in this routine must all be of the same type: either * stencil or non-stencil, but not both. Also, if they are stencil entries, * they must all represent couplings to the same variable type (there are no * such restrictions for non-stencil entries). **/ HYPRE_Int HYPRE_SStructMatrixSetValues(HYPRE_SStructMatrix matrix, HYPRE_Int part, HYPRE_Int *index, HYPRE_Int var, HYPRE_Int nentries, HYPRE_Int *entries, HYPRE_Complex *values); /** * Add to matrix coefficients index by index. The \e values array is of * length \e nentries. * * NOTE: For better efficiency, use \ref HYPRE_SStructMatrixAddToBoxValues to * set coefficients a box at a time. * * NOTE: Users are required to set values on all processes that own the * associated variables. This means that some data will be multiply defined. * * NOTE: The entries in this routine must all be of the same type: either * stencil or non-stencil, but not both. Also, if they are stencil entries, * they must all represent couplings to the same variable type. **/ HYPRE_Int HYPRE_SStructMatrixAddToValues(HYPRE_SStructMatrix matrix, HYPRE_Int part, HYPRE_Int *index, HYPRE_Int var, HYPRE_Int nentries, HYPRE_Int *entries, HYPRE_Complex *values); /** * Add finite element stiffness matrix coefficients index by index. The layout * of the data in \e values is determined by the routines \ref * HYPRE_SStructGridSetFEMOrdering and \ref HYPRE_SStructGraphSetFEMSparsity. * * NOTE: For better efficiency, use \ref HYPRE_SStructMatrixAddFEMBoxValues to * set coefficients a box at a time. **/ HYPRE_Int HYPRE_SStructMatrixAddFEMValues(HYPRE_SStructMatrix matrix, HYPRE_Int part, HYPRE_Int *index, HYPRE_Complex *values); /** * Get matrix coefficients index by index. The \e values array is of length * \e nentries. * * NOTE: For better efficiency, use \ref HYPRE_SStructMatrixGetBoxValues to get * coefficients a box at a time. * * NOTE: Users may get values on any process that owns the associated variables. * * NOTE: The entries in this routine must all be of the same type: either * stencil or non-stencil, but not both. Also, if they are stencil entries, * they must all represent couplings to the same variable type (there are no * such restrictions for non-stencil entries). **/ HYPRE_Int HYPRE_SStructMatrixGetValues(HYPRE_SStructMatrix matrix, HYPRE_Int part, HYPRE_Int *index, HYPRE_Int var, HYPRE_Int nentries, HYPRE_Int *entries, HYPRE_Complex *values); /** * Get finite element stiffness matrix coefficients index by index. The layout * of the data in \e values is determined by the routines * \ref HYPRE_SStructGridSetFEMOrdering and * \ref HYPRE_SStructGraphSetFEMSparsity. **/ HYPRE_Int HYPRE_SStructMatrixGetFEMValues(HYPRE_SStructMatrix matrix, HYPRE_Int part, HYPRE_Int *index, HYPRE_Complex *values); /** * Set matrix coefficients a box at a time. The data in \e values is ordered * as follows: * \verbatim m = 0; for (k = ilower[2]; k <= iupper[2]; k++) for (j = ilower[1]; j <= iupper[1]; j++) for (i = ilower[0]; i <= iupper[0]; i++) for (entry = 0; entry < nentries; entry++) { values[m] = ...; m++; } \endverbatim * * NOTE: Users are required to set values on all processes that own the * associated variables. This means that some data will be multiply defined. * * NOTE: The entries in this routine must all be of the same type: either * stencil or non-stencil, but not both. Also, if they are stencil entries, * they must all represent couplings to the same variable type (there are no * such restrictions for non-stencil entries). **/ HYPRE_Int HYPRE_SStructMatrixSetBoxValues(HYPRE_SStructMatrix matrix, HYPRE_Int part, HYPRE_Int *ilower, HYPRE_Int *iupper, HYPRE_Int var, HYPRE_Int nentries, HYPRE_Int *entries, HYPRE_Complex *values); /** * Add to matrix coefficients a box at a time. The data in \e values is * ordered as in \ref HYPRE_SStructMatrixSetBoxValues. * * NOTE: Users are required to set values on all processes that own the * associated variables. This means that some data will be multiply defined. * * NOTE: The entries in this routine must all be of stencil type. Also, they * must all represent couplings to the same variable type. **/ HYPRE_Int HYPRE_SStructMatrixAddToBoxValues(HYPRE_SStructMatrix matrix, HYPRE_Int part, HYPRE_Int *ilower, HYPRE_Int *iupper, HYPRE_Int var, HYPRE_Int nentries, HYPRE_Int *entries, HYPRE_Complex *values); /** * Set matrix coefficients a box at a time. The \e values array is logically * box shaped with value-box extents \e vilower and \e viupper that must * contain the set-box extents \e ilower and \e iupper . The data in the * \e values array is ordered as in \ref HYPRE_SStructMatrixSetBoxValues, * but based on the value-box extents. **/ HYPRE_Int HYPRE_SStructMatrixSetBoxValues2(HYPRE_SStructMatrix matrix, HYPRE_Int part, HYPRE_Int *ilower, HYPRE_Int *iupper, HYPRE_Int var, HYPRE_Int nentries, HYPRE_Int *entries, HYPRE_Int *vilower, HYPRE_Int *viupper, HYPRE_Complex *values); /** * Add to matrix coefficients a box at a time. The data in \e values is * ordered as in \ref HYPRE_SStructMatrixSetBoxValues2. **/ HYPRE_Int HYPRE_SStructMatrixAddToBoxValues2(HYPRE_SStructMatrix matrix, HYPRE_Int part, HYPRE_Int *ilower, HYPRE_Int *iupper, HYPRE_Int var, HYPRE_Int nentries, HYPRE_Int *entries, HYPRE_Int *vilower, HYPRE_Int *viupper, HYPRE_Complex *values); /** * Add finite element stiffness matrix coefficients a box at a time. The data * in \e values is organized as an array of element matrices ordered as in \ref * HYPRE_SStructMatrixSetBoxValues. The layout of the data entries of each * element matrix is determined by the routines \ref * HYPRE_SStructGridSetFEMOrdering and \ref HYPRE_SStructGraphSetFEMSparsity. **/ HYPRE_Int HYPRE_SStructMatrixAddFEMBoxValues(HYPRE_SStructMatrix matrix, HYPRE_Int part, HYPRE_Int *ilower, HYPRE_Int *iupper, HYPRE_Complex *values); /** * Finalize the construction of the matrix before using. **/ HYPRE_Int HYPRE_SStructMatrixAssemble(HYPRE_SStructMatrix matrix); /** * Get matrix coefficients a box at a time. The data in \e values is * ordered as in \ref HYPRE_SStructMatrixSetBoxValues. * * NOTE: Users may get values on any process that owns the associated variables. * * NOTE: The entries in this routine must all be of stencil type. Also, they * must all represent couplings to the same variable type. **/ HYPRE_Int HYPRE_SStructMatrixGetBoxValues(HYPRE_SStructMatrix matrix, HYPRE_Int part, HYPRE_Int *ilower, HYPRE_Int *iupper, HYPRE_Int var, HYPRE_Int nentries, HYPRE_Int *entries, HYPRE_Complex *values); /** * Get matrix coefficients a box at a time. The data in \e values is * ordered as in \ref HYPRE_SStructMatrixSetBoxValues2. **/ HYPRE_Int HYPRE_SStructMatrixGetBoxValues2(HYPRE_SStructMatrix matrix, HYPRE_Int part, HYPRE_Int *ilower, HYPRE_Int *iupper, HYPRE_Int var, HYPRE_Int nentries, HYPRE_Int *entries, HYPRE_Int *vilower, HYPRE_Int *viupper, HYPRE_Complex *values); /** * Does this even make sense to implement? */ HYPRE_Int HYPRE_SStructMatrixGetFEMBoxValues(HYPRE_SStructMatrix matrix, HYPRE_Int part, HYPRE_Int *ilower, HYPRE_Int *iupper, HYPRE_Complex *values); /** * Define symmetry properties for the stencil entries in the matrix. The * boolean argument \e symmetric is applied to stencil entries on part \e * part that couple variable \e var to variable \e to_var. A value of * -1 may be used for \e part, \e var, or \e to_var to specify * "all". For example, if \e part and \e to_var are set to -1, then * the boolean is applied to stencil entries on all parts that couple variable * \e var to all other variables. * * By default, matrices are assumed to be nonsymmetric. Significant * storage savings can be made if the matrix is symmetric. **/ HYPRE_Int HYPRE_SStructMatrixSetSymmetric(HYPRE_SStructMatrix matrix, HYPRE_Int part, HYPRE_Int var, HYPRE_Int to_var, HYPRE_Int symmetric); /** * Define symmetry properties for all non-stencil matrix entries. **/ HYPRE_Int HYPRE_SStructMatrixSetNSSymmetric(HYPRE_SStructMatrix matrix, HYPRE_Int symmetric); /** * Set the storage type of the matrix object to be constructed. Currently, \e * type can be either \c HYPRE_SSTRUCT (the default), \c HYPRE_STRUCT, * or \c HYPRE_PARCSR. * * @see HYPRE_SStructMatrixGetObject **/ HYPRE_Int HYPRE_SStructMatrixSetObjectType(HYPRE_SStructMatrix matrix, HYPRE_Int type); /** * Get a reference to the constructed matrix object. * * @see HYPRE_SStructMatrixSetObjectType **/ HYPRE_Int HYPRE_SStructMatrixGetObject(HYPRE_SStructMatrix matrix, void **object); /** * Print the matrix to file. This is mainly for debugging purposes. **/ HYPRE_Int HYPRE_SStructMatrixPrint(const char *filename, HYPRE_SStructMatrix matrix, HYPRE_Int all); /** * Read the matrix from file. This is mainly for debugging purposes. **/ HYPRE_Int HYPRE_SStructMatrixRead( MPI_Comm comm, const char *filename, HYPRE_SStructMatrix *matrix_ptr ); /**@}*/ /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ /** * @name SStruct Vectors * * @{ **/ struct hypre_SStructVector_struct; /** * The vector object. **/ typedef struct hypre_SStructVector_struct *HYPRE_SStructVector; /** * Create a vector object. **/ HYPRE_Int HYPRE_SStructVectorCreate(MPI_Comm comm, HYPRE_SStructGrid grid, HYPRE_SStructVector *vector); /** * Destroy a vector object. **/ HYPRE_Int HYPRE_SStructVectorDestroy(HYPRE_SStructVector vector); /** * Prepare a vector object for setting coefficient values. **/ HYPRE_Int HYPRE_SStructVectorInitialize(HYPRE_SStructVector vector); /** * Set vector coefficients index by index. * * NOTE: For better efficiency, use \ref HYPRE_SStructVectorSetBoxValues to set * coefficients a box at a time. * * NOTE: Users are required to set values on all processes that own the * associated variables. This means that some data will be multiply defined. **/ HYPRE_Int HYPRE_SStructVectorSetValues(HYPRE_SStructVector vector, HYPRE_Int part, HYPRE_Int *index, HYPRE_Int var, HYPRE_Complex *value); /** * Add to vector coefficients index by index. * * NOTE: For better efficiency, use \ref HYPRE_SStructVectorAddToBoxValues to * set coefficients a box at a time. * * NOTE: Users are required to set values on all processes that own the * associated variables. This means that some data will be multiply defined. **/ HYPRE_Int HYPRE_SStructVectorAddToValues(HYPRE_SStructVector vector, HYPRE_Int part, HYPRE_Int *index, HYPRE_Int var, HYPRE_Complex *value); /** * Add finite element vector coefficients index by index. The layout of the * data in \e values is determined by the routine * \ref HYPRE_SStructGridSetFEMOrdering. * * NOTE: For better efficiency, use \ref HYPRE_SStructVectorAddFEMBoxValues to * set coefficients a box at a time. **/ HYPRE_Int HYPRE_SStructVectorAddFEMValues(HYPRE_SStructVector vector, HYPRE_Int part, HYPRE_Int *index, HYPRE_Complex *values); /** * Get vector coefficients index by index. Users must first call the routine * \ref HYPRE_SStructVectorGather to ensure that data owned by multiple * processes is correct. * * NOTE: For better efficiency, use \ref HYPRE_SStructVectorGetBoxValues to get * coefficients a box at a time. * * NOTE: Users may only get values on processes that own the associated * variables. **/ HYPRE_Int HYPRE_SStructVectorGetValues(HYPRE_SStructVector vector, HYPRE_Int part, HYPRE_Int *index, HYPRE_Int var, HYPRE_Complex *value); /** * Get finite element vector coefficients index by index. The layout of the * data in \e values is determined by the routine * \ref HYPRE_SStructGridSetFEMOrdering. Users must first call the routine * \ref HYPRE_SStructVectorGather to ensure that data owned by multiple * processes is correct. **/ HYPRE_Int HYPRE_SStructVectorGetFEMValues(HYPRE_SStructVector vector, HYPRE_Int part, HYPRE_Int *index, HYPRE_Complex *values); /** * Set vector coefficients a box at a time. The data in \e values is ordered * as follows: * \verbatim m = 0; for (k = ilower[2]; k <= iupper[2]; k++) for (j = ilower[1]; j <= iupper[1]; j++) for (i = ilower[0]; i <= iupper[0]; i++) { values[m] = ...; m++; } \endverbatim * * NOTE: Users are required to set values on all processes that own the * associated variables. This means that some data will be multiply defined. **/ HYPRE_Int HYPRE_SStructVectorSetBoxValues(HYPRE_SStructVector vector, HYPRE_Int part, HYPRE_Int *ilower, HYPRE_Int *iupper, HYPRE_Int var, HYPRE_Complex *values); /** * Add to vector coefficients a box at a time. The data in \e values is * ordered as in \ref HYPRE_SStructVectorSetBoxValues. * * NOTE: Users are required to set values on all processes that own the * associated variables. This means that some data will be multiply defined. **/ HYPRE_Int HYPRE_SStructVectorAddToBoxValues(HYPRE_SStructVector vector, HYPRE_Int part, HYPRE_Int *ilower, HYPRE_Int *iupper, HYPRE_Int var, HYPRE_Complex *values); /** * Set vector coefficients a box at a time. The \e values array is logically * box shaped with value-box extents \e vilower and \e viupper that must * contain the set-box extents \e ilower and \e iupper . The data in the * \e values array is ordered as in \ref HYPRE_SStructVectorSetBoxValues, * but based on the value-box extents. **/ HYPRE_Int HYPRE_SStructVectorSetBoxValues2(HYPRE_SStructVector vector, HYPRE_Int part, HYPRE_Int *ilower, HYPRE_Int *iupper, HYPRE_Int var, HYPRE_Int *vilower, HYPRE_Int *viupper, HYPRE_Complex *values); /** * Add to vector coefficients a box at a time. The data in \e values is * ordered as in \ref HYPRE_SStructVectorSetBoxValues2. **/ HYPRE_Int HYPRE_SStructVectorAddToBoxValues2(HYPRE_SStructVector vector, HYPRE_Int part, HYPRE_Int *ilower, HYPRE_Int *iupper, HYPRE_Int var, HYPRE_Int *vilower, HYPRE_Int *viupper, HYPRE_Complex *values); /** * Add finite element vector coefficients a box at a time. The data in \e * values is organized as an array of element vectors ordered as in \ref * HYPRE_SStructVectorSetBoxValues. The layout of the data entries of each * element vector is determined by the routine \ref * HYPRE_SStructGridSetFEMOrdering. **/ HYPRE_Int HYPRE_SStructVectorAddFEMBoxValues(HYPRE_SStructVector vector, HYPRE_Int part, HYPRE_Int *ilower, HYPRE_Int *iupper, HYPRE_Complex *values); /** * Finalize the construction of the vector before using. **/ HYPRE_Int HYPRE_SStructVectorAssemble(HYPRE_SStructVector vector); /** * Get vector coefficients a box at a time. The data in \e values is ordered * as in \ref HYPRE_SStructVectorSetBoxValues. Users must first call the * routine \ref HYPRE_SStructVectorGather to ensure that data owned by multiple * processes is correct. * * NOTE: Users may only get values on processes that own the associated * variables. **/ HYPRE_Int HYPRE_SStructVectorGetBoxValues(HYPRE_SStructVector vector, HYPRE_Int part, HYPRE_Int *ilower, HYPRE_Int *iupper, HYPRE_Int var, HYPRE_Complex *values); /** * Get vector coefficients a box at a time. The data in \e values is ordered * as in \ref HYPRE_SStructVectorSetBoxValues2. **/ HYPRE_Int HYPRE_SStructVectorGetBoxValues2(HYPRE_SStructVector vector, HYPRE_Int part, HYPRE_Int *ilower, HYPRE_Int *iupper, HYPRE_Int var, HYPRE_Int *vilower, HYPRE_Int *viupper, HYPRE_Complex *values); /** * Does this even make sense to implement? */ HYPRE_Int HYPRE_SStructVectorGetFEMBoxValues(HYPRE_SStructVector vector, HYPRE_Int part, HYPRE_Int *ilower, HYPRE_Int *iupper, HYPRE_Complex *values); /** * Gather vector data so that efficient \c GetValues can be done. This * routine must be called prior to calling \c GetValues to ensure that * correct and consistent values are returned, especially for non cell-centered * data that is shared between more than one processor. **/ HYPRE_Int HYPRE_SStructVectorGather(HYPRE_SStructVector vector); /** * Set the storage type of the vector object to be constructed. Currently, \e * type can be either \c HYPRE_SSTRUCT (the default), \c HYPRE_STRUCT, * or \c HYPRE_PARCSR. * * @see HYPRE_SStructVectorGetObject **/ HYPRE_Int HYPRE_SStructVectorSetObjectType(HYPRE_SStructVector vector, HYPRE_Int type); /** * Get a reference to the constructed vector object. * * @see HYPRE_SStructVectorSetObjectType **/ HYPRE_Int HYPRE_SStructVectorGetObject(HYPRE_SStructVector vector, void **object); /** * Print the vector to file. This is mainly for debugging purposes. **/ HYPRE_Int HYPRE_SStructVectorPrint(const char *filename, HYPRE_SStructVector vector, HYPRE_Int all); /** * Read the vector from file. This is mainly for debugging purposes. **/ HYPRE_Int HYPRE_SStructVectorRead( MPI_Comm comm, const char *filename, HYPRE_SStructVector *vector_ptr ); /**@}*/ /**@}*/ /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ #ifdef __cplusplus } #endif #endif hypre-2.33.0/src/sstruct_mv/HYPRE_sstruct_stencil.c000066400000000000000000000103331477326011500222770ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * HYPRE_SStructStencil interface * *****************************************************************************/ #include "_hypre_sstruct_mv.h" /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_SStructStencilCreate( HYPRE_Int ndim, HYPRE_Int size, HYPRE_SStructStencil *stencil_ptr ) { hypre_SStructStencil *stencil; hypre_StructStencil *sstencil; HYPRE_Int *vars; stencil = hypre_TAlloc(hypre_SStructStencil, 1, HYPRE_MEMORY_HOST); HYPRE_StructStencilCreate(ndim, size, &sstencil); vars = hypre_CTAlloc(HYPRE_Int, hypre_StructStencilSize(sstencil), HYPRE_MEMORY_HOST); hypre_SStructStencilSStencil(stencil) = sstencil; hypre_SStructStencilVars(stencil) = vars; hypre_SStructStencilRefCount(stencil) = 1; *stencil_ptr = stencil; return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_SStructStencilDestroy( HYPRE_SStructStencil stencil ) { if (stencil) { hypre_SStructStencilRefCount(stencil) --; if (hypre_SStructStencilRefCount(stencil) == 0) { HYPRE_StructStencilDestroy(hypre_SStructStencilSStencil(stencil)); hypre_TFree(hypre_SStructStencilVars(stencil), HYPRE_MEMORY_HOST); hypre_TFree(stencil, HYPRE_MEMORY_HOST); } } return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_SStructStencilSetEntry( HYPRE_SStructStencil stencil, HYPRE_Int entry, HYPRE_Int *offset, HYPRE_Int var ) { hypre_StructStencil *sstencil = hypre_SStructStencilSStencil(stencil); HYPRE_StructStencilSetElement(sstencil, entry, offset); hypre_SStructStencilVar(stencil, entry) = var; return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_SStructStencilPrint( FILE *file, HYPRE_SStructStencil stencil ) { HYPRE_Int ndim = hypre_SStructStencilNDim(stencil); HYPRE_Int *vars = hypre_SStructStencilVars(stencil); hypre_Index *shape = hypre_SStructStencilShape(stencil); HYPRE_Int size = hypre_SStructStencilSize(stencil); HYPRE_Int i; hypre_fprintf(file, "StencilCreate: %d %d", ndim, size); for (i = 0; i < size; i++) { hypre_fprintf(file, "\nStencilSetEntry: %d %d ", i, vars[i]); hypre_IndexPrint(file, ndim, shape[i]); } hypre_fprintf(file, "\n"); return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_SStructStencilRead( FILE *file, HYPRE_SStructStencil *stencil_ptr ) { HYPRE_SStructStencil stencil; HYPRE_Int var; hypre_Index shape; HYPRE_Int i, ndim; HYPRE_Int entry, size; hypre_fscanf(file, "StencilCreate: %d %d", &ndim, &size); HYPRE_SStructStencilCreate(ndim, size, &stencil); for (i = 0; i < size; i++) { hypre_fscanf(file, "\nStencilSetEntry: %d %d ", &entry, &var); hypre_IndexRead(file, ndim, shape); HYPRE_SStructStencilSetEntry(stencil, entry, shape, var); } hypre_fscanf(file, "\n"); *stencil_ptr = stencil; return hypre_error_flag; } hypre-2.33.0/src/sstruct_mv/HYPRE_sstruct_vector.c000066400000000000000000001116651477326011500221520ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * HYPRE_SStructVector interface * *****************************************************************************/ #include "_hypre_sstruct_mv.h" /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_SStructVectorCreate( MPI_Comm comm, HYPRE_SStructGrid grid, HYPRE_SStructVector *vector_ptr ) { hypre_SStructVector *vector; HYPRE_Int nparts; hypre_SStructPVector **pvectors; MPI_Comm pcomm; hypre_SStructPGrid *pgrid; HYPRE_Int part; vector = hypre_TAlloc(hypre_SStructVector, 1, HYPRE_MEMORY_HOST); hypre_SStructVectorComm(vector) = comm; hypre_SStructVectorNDim(vector) = hypre_SStructGridNDim(grid); hypre_SStructGridRef(grid, &hypre_SStructVectorGrid(vector)); hypre_SStructVectorObjectType(vector) = HYPRE_SSTRUCT; nparts = hypre_SStructGridNParts(grid); hypre_SStructVectorNParts(vector) = nparts; pvectors = hypre_TAlloc(hypre_SStructPVector *, nparts, HYPRE_MEMORY_HOST); for (part = 0; part < nparts; part++) { pgrid = hypre_SStructGridPGrid(grid, part); pcomm = hypre_SStructPGridComm(pgrid); hypre_SStructPVectorCreate(pcomm, pgrid, &pvectors[part]); } hypre_SStructVectorPVectors(vector) = pvectors; hypre_SStructVectorIJVector(vector) = NULL; /* GEC1002 initializing to NULL */ hypre_SStructVectorDataIndices(vector) = NULL; hypre_SStructVectorData(vector) = NULL; /* GEC1002 moving the creation of the ijvector the the initialize part * ilower = hypre_SStructGridStartRank(grid); * iupper = ilower + hypre_SStructGridLocalSize(grid) - 1; * HYPRE_IJVectorCreate(comm, ilowergh, iuppergh, * &hypre_SStructVectorIJVector(vector)); */ hypre_SStructVectorIJVector(vector) = NULL; hypre_SStructVectorParVector(vector) = NULL; hypre_SStructVectorGlobalSize(vector) = 0; hypre_SStructVectorRefCount(vector) = 1; hypre_SStructVectorDataSize(vector) = 0; hypre_SStructVectorObjectType(vector) = HYPRE_SSTRUCT; *vector_ptr = vector; return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_SStructVectorDestroy( HYPRE_SStructVector vector ) { HYPRE_Int nparts; hypre_SStructPVector **pvectors; HYPRE_Int part; HYPRE_Int vector_type; HYPRE_MemoryLocation memory_location; /* GEC1002 destroying data indices and data in vector */ if (vector) { memory_location = hypre_SStructVectorMemoryLocation(vector); vector_type = hypre_SStructVectorObjectType(vector); hypre_SStructVectorRefCount(vector) --; if (hypre_SStructVectorRefCount(vector) == 0) { HYPRE_SStructGridDestroy(hypre_SStructVectorGrid(vector)); nparts = hypre_SStructVectorNParts(vector); pvectors = hypre_SStructVectorPVectors(vector); for (part = 0; part < nparts; part++) { hypre_SStructPVectorDestroy(pvectors[part]); } hypre_TFree(pvectors, HYPRE_MEMORY_HOST); HYPRE_IJVectorDestroy(hypre_SStructVectorIJVector(vector)); /* GEC1002 the ijdestroy takes care of the data when the * vector is type HYPRE_SSTRUCT. This is a result that the * ijvector does not use the owndata flag in the data structure * unlike the struct vector */ /* GEC if data has been allocated then free the pointer */ hypre_TFree(hypre_SStructVectorDataIndices(vector), HYPRE_MEMORY_HOST); if (hypre_SStructVectorData(vector) && (vector_type == HYPRE_PARCSR)) { hypre_TFree(hypre_SStructVectorData(vector), memory_location); } hypre_TFree(vector, HYPRE_MEMORY_HOST); } } return hypre_error_flag; } /*-------------------------------------------------------------------------- * GEC1002 changes to initialize the vector with a data chunk * that includes all the part,var pieces instead of just svector-var * pieces. In case of pure unstruct-variables (ucvar), which are at the * end of each part, we might need to modify initialize shell vector *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_SStructVectorInitialize( HYPRE_SStructVector vector ) { HYPRE_Int datasize; HYPRE_Int nvars ; HYPRE_Int nparts = hypre_SStructVectorNParts(vector) ; HYPRE_Int var, part ; HYPRE_Complex *data ; HYPRE_Complex *pdata ; HYPRE_Complex *sdata ; hypre_SStructPVector *pvector; hypre_StructVector *svector; HYPRE_Int *dataindices; HYPRE_Int *pdataindices; HYPRE_Int vector_type = hypre_SStructVectorObjectType(vector); hypre_SStructGrid *grid = hypre_SStructVectorGrid(vector); MPI_Comm comm = hypre_SStructVectorComm(vector); HYPRE_IJVector ijvector; hypre_SStructPGrid *pgrid; HYPRE_SStructVariable *vartypes; HYPRE_MemoryLocation memory_location = hypre_HandleMemoryLocation(hypre_handle()); /* GEC0902 addition of variables for ilower and iupper */ HYPRE_BigInt ilower, iupper; hypre_ParVector *par_vector; hypre_Vector *parlocal_vector; /* GEC0902 getting the datasizes and indices we need */ hypre_SStructVectorInitializeShell(vector); datasize = hypre_SStructVectorDataSize(vector); data = hypre_CTAlloc(HYPRE_Complex, datasize, memory_location); dataindices = hypre_SStructVectorDataIndices(vector); hypre_SStructVectorData(vector) = data; for (part = 0; part < nparts; part++) { pvector = hypre_SStructVectorPVector(vector, part); pdataindices = hypre_SStructPVectorDataIndices(pvector); /* shift-num = dataindices[part]; */ pdata = data + dataindices[part]; nvars = hypre_SStructPVectorNVars(pvector); pgrid = hypre_SStructPVectorPGrid(pvector); vartypes = hypre_SStructPGridVarTypes(pgrid); for (var = 0; var < nvars; var++) { svector = hypre_SStructPVectorSVector(pvector, var); /* shift-pnum = pdataindices[var]; */ sdata = pdata + pdataindices[var]; /* GEC1002 initialization of inside data pointer of a svector * because no data is alloced, we make sure the flag is zero. This * affects the destroy */ hypre_StructVectorInitializeData(svector, sdata); hypre_StructVectorDataAlloced(svector) = 0; if (vartypes[var] > 0) { /* needed to get AddTo accumulation correct between processors */ hypre_StructVectorClearGhostValues(svector); } } } /* GEC1002 this is now the creation of the ijmatrix and the initialization * by checking the type of the vector */ if (vector_type == HYPRE_PARCSR ) { ilower = hypre_SStructGridStartRank(grid); iupper = ilower + hypre_SStructGridLocalSize(grid) - 1; } else if (vector_type == HYPRE_SSTRUCT || vector_type == HYPRE_STRUCT) { ilower = hypre_SStructGridGhstartRank(grid); iupper = ilower + hypre_SStructGridGhlocalSize(grid) - 1; } else { hypre_error_w_msg(HYPRE_ERROR_GENERIC, "Invalid vector type!\n"); return hypre_error_flag; } HYPRE_IJVectorCreate(comm, ilower, iupper, &hypre_SStructVectorIJVector(vector)); /* GEC1002, once the partitioning is done, it is time for the actual * initialization */ /* u-vector: the type is for the parvector inside the ijvector */ ijvector = hypre_SStructVectorIJVector(vector); HYPRE_IJVectorSetObjectType(ijvector, HYPRE_PARCSR); HYPRE_IJVectorInitialize(ijvector); HYPRE_IJVectorGetObject(ijvector, (void **) &hypre_SStructVectorParVector(vector)); /* GEC1002 for HYPRE_SSTRUCT type of vector, we do not need data allocated * inside the parvector piece of the structure. We make that pointer within * the localvector to point to the outside "data". Before redirecting the * local pointer to point to the true data chunk for HYPRE_SSTRUCT: we * destroy and assign. We now have two entries of the data structure * pointing to the same chunk if we have a HYPRE_SSTRUCT vector We do not * need the IJVectorInitializePar, we have to undoit for the SStruct case in * a sense it is a desinitializepar */ if (vector_type == HYPRE_SSTRUCT || vector_type == HYPRE_STRUCT) { par_vector = (hypre_ParVector *) hypre_IJVectorObject(ijvector); parlocal_vector = hypre_ParVectorLocalVector(par_vector); hypre_TFree(hypre_VectorData(parlocal_vector), hypre_VectorMemoryLocation(parlocal_vector)); hypre_VectorData(parlocal_vector) = data ; } return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_SStructVectorSetValues( HYPRE_SStructVector vector, HYPRE_Int part, HYPRE_Int *index, HYPRE_Int var, HYPRE_Complex *value ) { HYPRE_Int ndim = hypre_SStructVectorNDim(vector); hypre_SStructPVector *pvector = hypre_SStructVectorPVector(vector, part); hypre_Index cindex; hypre_CopyToCleanIndex(index, ndim, cindex); if (var < hypre_SStructPVectorNVars(pvector)) { hypre_SStructPVectorSetValues(pvector, cindex, var, value, 0); } else { /* TODO */ } return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_SStructVectorAddToValues( HYPRE_SStructVector vector, HYPRE_Int part, HYPRE_Int *index, HYPRE_Int var, HYPRE_Complex *value ) { HYPRE_Int ndim = hypre_SStructVectorNDim(vector); hypre_SStructPVector *pvector = hypre_SStructVectorPVector(vector, part); hypre_Index cindex; hypre_CopyToCleanIndex(index, ndim, cindex); if (var < hypre_SStructPVectorNVars(pvector)) { hypre_SStructPVectorSetValues(pvector, cindex, var, value, 1); } else { /* TODO */ } return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ /* ONLY3D - RDF: Why? */ HYPRE_Int HYPRE_SStructVectorAddFEMValues( HYPRE_SStructVector vector, HYPRE_Int part, HYPRE_Int *index, HYPRE_Complex *values ) { HYPRE_Int ndim = hypre_SStructVectorNDim(vector); hypre_SStructGrid *grid = hypre_SStructVectorGrid(vector); HYPRE_Int fem_nvars = hypre_SStructGridFEMPNVars(grid, part); HYPRE_Int *fem_vars = hypre_SStructGridFEMPVars(grid, part); hypre_Index *fem_offsets = hypre_SStructGridFEMPOffsets(grid, part); HYPRE_Int i, d, vindex[HYPRE_MAXDIM]; /* Set one variable at a time */ for (i = 0; i < fem_nvars; i++) { for (d = 0; d < ndim; d++) { /* note: these offsets are different from what the user passes in */ vindex[d] = index[d] + hypre_IndexD(fem_offsets[i], d); } HYPRE_SStructVectorAddToValues( vector, part, vindex, fem_vars[i], &values[i]); } return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_SStructVectorGetValues( HYPRE_SStructVector vector, HYPRE_Int part, HYPRE_Int *index, HYPRE_Int var, HYPRE_Complex *value ) { HYPRE_Int ndim = hypre_SStructVectorNDim(vector); hypre_SStructPVector *pvector = hypre_SStructVectorPVector(vector, part); hypre_Index cindex; hypre_CopyToCleanIndex(index, ndim, cindex); if (var < hypre_SStructPVectorNVars(pvector)) { hypre_SStructPVectorGetValues(pvector, cindex, var, value); } else { /* TODO */ } return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ /* ONLY3D - RDF: Why? */ HYPRE_Int HYPRE_SStructVectorGetFEMValues( HYPRE_SStructVector vector, HYPRE_Int part, HYPRE_Int *index, HYPRE_Complex *values ) { HYPRE_Int ndim = hypre_SStructVectorNDim(vector); hypre_SStructGrid *grid = hypre_SStructVectorGrid(vector); hypre_SStructPVector *pvector = hypre_SStructVectorPVector(vector, part); HYPRE_Int fem_nvars = hypre_SStructGridFEMPNVars(grid, part); HYPRE_Int *fem_vars = hypre_SStructGridFEMPVars(grid, part); hypre_Index *fem_offsets = hypre_SStructGridFEMPOffsets(grid, part); HYPRE_Int i, d, vindex[HYPRE_MAXDIM]; hypre_SetIndex(vindex, 0); for (i = 0; i < fem_nvars; i++) { for (d = 0; d < ndim; d++) { /* note: these offsets are different from what the user passes in */ vindex[d] = index[d] + hypre_IndexD(fem_offsets[i], d); } hypre_SStructPVectorGetValues(pvector, vindex, fem_vars[i], &values[i]); } return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_SStructVectorSetBoxValues( HYPRE_SStructVector vector, HYPRE_Int part, HYPRE_Int *ilower, HYPRE_Int *iupper, HYPRE_Int var, HYPRE_Complex *values ) { HYPRE_SStructVectorSetBoxValues2(vector, part, ilower, iupper, var, ilower, iupper, values); return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_SStructVectorAddToBoxValues( HYPRE_SStructVector vector, HYPRE_Int part, HYPRE_Int *ilower, HYPRE_Int *iupper, HYPRE_Int var, HYPRE_Complex *values ) { HYPRE_SStructVectorAddToBoxValues2(vector, part, ilower, iupper, var, ilower, iupper, values); return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_SStructVectorGetBoxValues(HYPRE_SStructVector vector, HYPRE_Int part, HYPRE_Int *ilower, HYPRE_Int *iupper, HYPRE_Int var, HYPRE_Complex *values ) { HYPRE_SStructVectorGetBoxValues2(vector, part, ilower, iupper, var, ilower, iupper, values); return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_SStructVectorSetBoxValues2( HYPRE_SStructVector vector, HYPRE_Int part, HYPRE_Int *ilower, HYPRE_Int *iupper, HYPRE_Int var, HYPRE_Int *vilower, HYPRE_Int *viupper, HYPRE_Complex *values ) { hypre_SStructPVector *pvector = hypre_SStructVectorPVector(vector, part); hypre_Box *set_box, *value_box; HYPRE_Int d, ndim = hypre_SStructVectorNDim(vector); /* This creates boxes with zeroed-out extents */ set_box = hypre_BoxCreate(ndim); value_box = hypre_BoxCreate(ndim); for (d = 0; d < ndim; d++) { hypre_BoxIMinD(set_box, d) = ilower[d]; hypre_BoxIMaxD(set_box, d) = iupper[d]; hypre_BoxIMinD(value_box, d) = vilower[d]; hypre_BoxIMaxD(value_box, d) = viupper[d]; } hypre_SStructPVectorSetBoxValues(pvector, set_box, var, value_box, values, 0); hypre_BoxDestroy(set_box); hypre_BoxDestroy(value_box); return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_SStructVectorAddToBoxValues2( HYPRE_SStructVector vector, HYPRE_Int part, HYPRE_Int *ilower, HYPRE_Int *iupper, HYPRE_Int var, HYPRE_Int *vilower, HYPRE_Int *viupper, HYPRE_Complex *values ) { hypre_SStructPVector *pvector = hypre_SStructVectorPVector(vector, part); hypre_Box *set_box, *value_box; HYPRE_Int d, ndim = hypre_SStructVectorNDim(vector); /* This creates boxes with zeroed-out extents */ set_box = hypre_BoxCreate(ndim); value_box = hypre_BoxCreate(ndim); for (d = 0; d < ndim; d++) { hypre_BoxIMinD(set_box, d) = ilower[d]; hypre_BoxIMaxD(set_box, d) = iupper[d]; hypre_BoxIMinD(value_box, d) = vilower[d]; hypre_BoxIMaxD(value_box, d) = viupper[d]; } hypre_SStructPVectorSetBoxValues(pvector, set_box, var, value_box, values, 1); hypre_BoxDestroy(set_box); hypre_BoxDestroy(value_box); return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_SStructVectorGetBoxValues2(HYPRE_SStructVector vector, HYPRE_Int part, HYPRE_Int *ilower, HYPRE_Int *iupper, HYPRE_Int var, HYPRE_Int *vilower, HYPRE_Int *viupper, HYPRE_Complex *values ) { hypre_SStructPVector *pvector = hypre_SStructVectorPVector(vector, part); hypre_Box *set_box, *value_box; HYPRE_Int d, ndim = hypre_SStructVectorNDim(vector); /* This creates boxes with zeroed-out extents */ set_box = hypre_BoxCreate(ndim); value_box = hypre_BoxCreate(ndim); for (d = 0; d < ndim; d++) { hypre_BoxIMinD(set_box, d) = ilower[d]; hypre_BoxIMaxD(set_box, d) = iupper[d]; hypre_BoxIMinD(value_box, d) = vilower[d]; hypre_BoxIMaxD(value_box, d) = viupper[d]; } hypre_SStructPVectorGetBoxValues(pvector, set_box, var, value_box, values); hypre_BoxDestroy(set_box); hypre_BoxDestroy(value_box); return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_SStructVectorAddFEMBoxValues(HYPRE_SStructVector vector, HYPRE_Int part, HYPRE_Int *ilower, HYPRE_Int *iupper, HYPRE_Complex *values) { HYPRE_Int ndim = hypre_SStructVectorNDim(vector); hypre_SStructGrid *grid = hypre_SStructVectorGrid(vector); HYPRE_MemoryLocation memory_location = hypre_SStructVectorMemoryLocation(vector); HYPRE_Int fem_nvars = hypre_SStructGridFEMPNVars(grid, part); HYPRE_Int *fem_vars = hypre_SStructGridFEMPVars(grid, part); hypre_Index *fem_offsets = hypre_SStructGridFEMPOffsets(grid, part); HYPRE_Complex *tvalues; hypre_Box *box; HYPRE_Int i, d, vilower[HYPRE_MAXDIM], viupper[HYPRE_MAXDIM]; HYPRE_Int ei, vi, nelts; /* Set one variable at a time */ box = hypre_BoxCreate(ndim); hypre_BoxSetExtents(box, ilower, iupper); nelts = hypre_BoxVolume(box); tvalues = hypre_TAlloc(HYPRE_Complex, nelts, memory_location); for (i = 0; i < fem_nvars; i++) { for (d = 0; d < ndim; d++) { /* note: these offsets are different from what the user passes in */ vilower[d] = ilower[d] + hypre_IndexD(fem_offsets[i], d); viupper[d] = iupper[d] + hypre_IndexD(fem_offsets[i], d); } #if defined(HYPRE_USING_GPU) if (hypre_GetExecPolicy1(memory_location) == HYPRE_EXEC_DEVICE) { hypreDevice_ComplexStridedCopy(nelts, fem_nvars, values + i, tvalues); } else #endif { for (ei = 0, vi = i; ei < nelts; ei ++, vi += fem_nvars) { tvalues[ei] = values[vi]; } } HYPRE_SStructVectorAddToBoxValues(vector, part, vilower, viupper, fem_vars[i], tvalues); } /* Free memory */ hypre_TFree(tvalues, memory_location); hypre_BoxDestroy(box); return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_SStructVectorAssemble( HYPRE_SStructVector vector ) { hypre_SStructGrid *grid = hypre_SStructVectorGrid(vector); HYPRE_Int nparts = hypre_SStructVectorNParts(vector); HYPRE_IJVector ijvector = hypre_SStructVectorIJVector(vector); hypre_SStructCommInfo **vnbor_comm_info = hypre_SStructGridVNborCommInfo(grid); HYPRE_Int vnbor_ncomms = hypre_SStructGridVNborNComms(grid); HYPRE_Int part; hypre_CommInfo *comm_info; HYPRE_Int send_part, recv_part; HYPRE_Int send_var, recv_var; hypre_StructVector *send_vector, *recv_vector; hypre_CommPkg *comm_pkg; hypre_CommHandle *comm_handle; HYPRE_Int ci; /*------------------------------------------------------ * Communicate and accumulate within parts *------------------------------------------------------*/ for (part = 0; part < nparts; part++) { hypre_SStructPVectorAccumulate(hypre_SStructVectorPVector(vector, part)); } /*------------------------------------------------------ * Communicate and accumulate between parts *------------------------------------------------------*/ for (ci = 0; ci < vnbor_ncomms; ci++) { comm_info = hypre_SStructCommInfoCommInfo(vnbor_comm_info[ci]); send_part = hypre_SStructCommInfoSendPart(vnbor_comm_info[ci]); recv_part = hypre_SStructCommInfoRecvPart(vnbor_comm_info[ci]); send_var = hypre_SStructCommInfoSendVar(vnbor_comm_info[ci]); recv_var = hypre_SStructCommInfoRecvVar(vnbor_comm_info[ci]); send_vector = hypre_SStructPVectorSVector( hypre_SStructVectorPVector(vector, send_part), send_var); recv_vector = hypre_SStructPVectorSVector( hypre_SStructVectorPVector(vector, recv_part), recv_var); /* want to communicate and add ghost data to real data */ hypre_CommPkgCreate(comm_info, hypre_StructVectorDataSpace(send_vector), hypre_StructVectorDataSpace(recv_vector), 1, NULL, 1, hypre_StructVectorComm(send_vector), &comm_pkg); /* note reversal of send/recv data here */ hypre_InitializeCommunication(comm_pkg, hypre_StructVectorData(recv_vector), hypre_StructVectorData(send_vector), 1, 0, &comm_handle); hypre_FinalizeCommunication(comm_handle); hypre_CommPkgDestroy(comm_pkg); } /*------------------------------------------------------ * Assemble P and U vectors *------------------------------------------------------*/ for (part = 0; part < nparts; part++) { hypre_SStructPVectorAssemble(hypre_SStructVectorPVector(vector, part)); } /* u-vector */ HYPRE_IJVectorAssemble(ijvector); /*------------------------------------------------------ *------------------------------------------------------*/ /* if the object type is parcsr, then convert the sstruct vector which has ghost layers to a parcsr vector without ghostlayers. */ if (hypre_SStructVectorObjectType(vector) == HYPRE_PARCSR) { hypre_SStructVectorParConvert(vector, &hypre_SStructVectorParVector(vector)); } return hypre_error_flag; } /*-------------------------------------------------------------------------- * RDF: I don't think this will work correctly in the case where a processor's * data is shared entirely with other processors. The code in PGridAssemble * ensures that data is uniquely distributed, so the data box for this processor * would be empty and there would be no ghost zones to fill in Gather. *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_SStructVectorGather( HYPRE_SStructVector vector ) { hypre_SStructGrid *grid = hypre_SStructVectorGrid(vector); HYPRE_Int nparts = hypre_SStructVectorNParts(vector); hypre_SStructCommInfo **vnbor_comm_info = hypre_SStructGridVNborCommInfo(grid); HYPRE_Int vnbor_ncomms = hypre_SStructGridVNborNComms(grid); HYPRE_Int part; hypre_CommInfo *comm_info; HYPRE_Int send_part, recv_part; HYPRE_Int send_var, recv_var; hypre_StructVector *send_vector, *recv_vector; hypre_CommPkg *comm_pkg; hypre_CommHandle *comm_handle; HYPRE_Int ci; /* GEC1102 we change the name of the restore-->parrestore */ if (hypre_SStructVectorObjectType(vector) == HYPRE_PARCSR) { hypre_SStructVectorParRestore(vector, hypre_SStructVectorParVector(vector)); } for (part = 0; part < nparts; part++) { hypre_SStructPVectorGather(hypre_SStructVectorPVector(vector, part)); } /* gather shared data from other parts */ for (ci = 0; ci < vnbor_ncomms; ci++) { comm_info = hypre_SStructCommInfoCommInfo(vnbor_comm_info[ci]); send_part = hypre_SStructCommInfoSendPart(vnbor_comm_info[ci]); recv_part = hypre_SStructCommInfoRecvPart(vnbor_comm_info[ci]); send_var = hypre_SStructCommInfoSendVar(vnbor_comm_info[ci]); recv_var = hypre_SStructCommInfoRecvVar(vnbor_comm_info[ci]); send_vector = hypre_SStructPVectorSVector( hypre_SStructVectorPVector(vector, send_part), send_var); recv_vector = hypre_SStructPVectorSVector( hypre_SStructVectorPVector(vector, recv_part), recv_var); /* want to communicate real data to ghost data */ hypre_CommPkgCreate(comm_info, hypre_StructVectorDataSpace(send_vector), hypre_StructVectorDataSpace(recv_vector), 1, NULL, 0, hypre_StructVectorComm(send_vector), &comm_pkg); hypre_InitializeCommunication(comm_pkg, hypre_StructVectorData(send_vector), hypre_StructVectorData(recv_vector), 0, 0, &comm_handle); hypre_FinalizeCommunication(comm_handle); hypre_CommPkgDestroy(comm_pkg); /* boundary ghost values may not be clear */ hypre_StructVectorBGhostNotClear(recv_vector) = 1; } return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_SStructVectorSetConstantValues( HYPRE_SStructVector vector, HYPRE_Complex value ) { hypre_SStructPVector *pvector; HYPRE_Int part; HYPRE_Int nparts = hypre_SStructVectorNParts(vector); for ( part = 0; part < nparts; part++ ) { pvector = hypre_SStructVectorPVector( vector, part ); hypre_SStructPVectorSetConstantValues( pvector, value ); } return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_SStructVectorSetObjectType( HYPRE_SStructVector vector, HYPRE_Int type ) { /* this implements only HYPRE_PARCSR, which is always available */ hypre_SStructVectorObjectType(vector) = type; return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_SStructVectorGetObject( HYPRE_SStructVector vector, void **object ) { HYPRE_Int type = hypre_SStructVectorObjectType(vector); hypre_SStructPVector *pvector; hypre_StructVector *svector; HYPRE_Int part, var; if (type == HYPRE_SSTRUCT) { *object = vector; } else if (type == HYPRE_PARCSR) { *object = hypre_SStructVectorParVector(vector); } else if (type == HYPRE_STRUCT) { /* only one part & one variable */ part = 0; var = 0; pvector = hypre_SStructVectorPVector(vector, part); svector = hypre_SStructPVectorSVector(pvector, var); *object = svector; } return hypre_error_flag; } /*-------------------------------------------------------------------------- * HYPRE_SStructVectorPrint * * This function prints a SStructVector to file. For the assumptions used * here, see HYPRE_SStructMatrixPrint. *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_SStructVectorPrint( const char *filename, HYPRE_SStructVector vector, HYPRE_Int all ) { /* Vector variables */ MPI_Comm comm = hypre_SStructVectorComm(vector); HYPRE_Int nparts = hypre_SStructVectorNParts(vector); hypre_SStructGrid *grid = hypre_SStructVectorGrid(vector); /* Local variables */ hypre_SStructPVector *pvector; hypre_StructVector *svector; FILE *file; HYPRE_Int myid; HYPRE_Int part, var, nvars; char new_filename[255]; /* Print auxiliary data */ hypre_MPI_Comm_rank(comm, &myid); hypre_sprintf(new_filename, "%s.%05d", filename, myid); if ((file = fopen(new_filename, "w")) == NULL) { hypre_printf("Error: can't open output file %s\n", new_filename); hypre_error_in_arg(1); return hypre_error_flag; } hypre_fprintf(file, "SStructVector\n"); hypre_SStructGridPrint(file, grid); /* Print (part, var) vectors */ for (part = 0; part < nparts; part++) { pvector = hypre_SStructVectorPVector(vector, part); nvars = hypre_SStructPVectorNVars(pvector); for (var = 0; var < nvars; var++) { svector = hypre_SStructPVectorSVector(pvector, var); hypre_fprintf(file, "\nData - (Part %d, Var %d):\n", part, var); hypre_StructVectorPrintData(file, svector, all); } } fclose(file); return hypre_error_flag; } /*-------------------------------------------------------------------------- * HYPRE_SStructVectorRead *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_SStructVectorRead( MPI_Comm comm, const char *filename, HYPRE_SStructVector *vector_ptr ) { /* Vector variables */ HYPRE_SStructVector vector; hypre_SStructPVector *pvector; hypre_StructVector *svector; hypre_SStructGrid *grid; HYPRE_Int nparts; HYPRE_Int nvars; /* Local variables */ FILE *file; char new_filename[255]; HYPRE_Int p, v, part, var; HYPRE_Int myid; /* Read auxiliary data */ hypre_MPI_Comm_rank(comm, &myid); hypre_sprintf(new_filename, "%s.%05d", filename, myid); if ((file = fopen(new_filename, "r")) == NULL) { hypre_printf("Error: can't open input file %s\n", new_filename); hypre_error_in_arg(2); return hypre_error_flag; } hypre_fscanf(file, "SStructVector\n"); hypre_SStructGridRead(comm, file, &grid); /* Create and initialize vector */ HYPRE_SStructVectorCreate(comm, grid, &vector); HYPRE_SStructVectorInitialize(vector); /* Read values from file */ nparts = hypre_SStructVectorNParts(vector); for (p = 0; p < nparts; p++) { pvector = hypre_SStructVectorPVector(vector, p); nvars = hypre_SStructPVectorNVars(pvector); for (v = 0; v < nvars; v++) { hypre_fscanf(file, "\nData - (Part %d, Var %d):\n", &part, &var); pvector = hypre_SStructVectorPVector(vector, part); svector = hypre_SStructPVectorSVector(pvector, var); hypre_StructVectorReadData(file, svector); } } fclose(file); /* Assemble vector */ HYPRE_SStructVectorAssemble(vector); /* Decrease ref counters */ HYPRE_SStructGridDestroy(grid); *vector_ptr = vector; return hypre_error_flag; } /*-------------------------------------------------------------------------- * copy x to y, y should already exist and be the same size *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_SStructVectorCopy( HYPRE_SStructVector x, HYPRE_SStructVector y ) { hypre_SStructCopy(x, y); return hypre_error_flag; } /*-------------------------------------------------------------------------- * y = a*y, for vector y and scalar a *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_SStructVectorScale( HYPRE_Complex alpha, HYPRE_SStructVector y ) { hypre_SStructScale( alpha, (hypre_SStructVector *)y ); return hypre_error_flag; } /*-------------------------------------------------------------------------- * inner or dot product, result = < x, y > *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_SStructInnerProd( HYPRE_SStructVector x, HYPRE_SStructVector y, HYPRE_Real *result ) { hypre_SStructInnerProd(x, y, result); return hypre_error_flag; } /*-------------------------------------------------------------------------- * y = y + alpha*x for vectors y, x and scalar alpha *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_SStructAxpy( HYPRE_Complex alpha, HYPRE_SStructVector x, HYPRE_SStructVector y ) { hypre_SStructAxpy(alpha, x, y); return hypre_error_flag; } hypre-2.33.0/src/sstruct_mv/Makefile000066400000000000000000000044451477326011500174030ustar00rootroot00000000000000# Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) include ../config/Makefile.config CINCLUDES = ${INCLUDES} ${MPIINCLUDE} C_COMPILE_FLAGS = \ -I..\ -I$(srcdir)\ -I$(srcdir)/..\ -I$(srcdir)/../utilities\ -I$(srcdir)/../struct_mv\ -I$(srcdir)/../seq_mv\ -I$(srcdir)/../seq_block_mv\ -I$(srcdir)/../parcsr_mv\ -I$(srcdir)/../IJ_mv\ ${CINCLUDES} HEADERS =\ HYPRE_sstruct_mv.h\ _hypre_sstruct_mv.h\ sstruct_graph.h\ sstruct_grid.h\ sstruct_matrix.h\ sstruct_stencil.h\ sstruct_vector.h FILES =\ F90_HYPRE_sstruct_graph.c\ F90_HYPRE_sstruct_grid.c\ F90_HYPRE_sstruct_matrix.c\ F90_HYPRE_sstruct_stencil.c\ F90_HYPRE_sstruct_vector.c\ HYPRE_sstruct_graph.c\ HYPRE_sstruct_grid.c\ HYPRE_sstruct_matrix.c\ HYPRE_sstruct_stencil.c\ HYPRE_sstruct_vector.c\ sstruct_axpy.c\ sstruct_copy.c\ sstruct_graph.c\ sstruct_grid.c\ sstruct_innerprod.c\ sstruct_matvec.c\ sstruct_scale.c\ sstruct_stencil.c CUFILES =\ sstruct_matrix.c\ sstruct_vector.c COBJS = ${FILES:.c=.o} CUOBJS = ${CUFILES:.c=.obj} OBJS = ${COBJS} ${CUOBJS} SONAME = libHYPRE_sstruct_mv-${HYPRE_RELEASE_VERSION}${HYPRE_LIB_SUFFIX} ################################################################## # Targets ################################################################## all: libHYPRE_sstruct_mv${HYPRE_LIB_SUFFIX} cp -fR $(srcdir)/HYPRE_*.h $(HYPRE_BUILD_DIR)/include cp -fR $(srcdir)/_hypre_sstruct_mv.h $(HYPRE_BUILD_DIR)/include # cp -fR libHYPRE* $(HYPRE_BUILD_DIR)/lib install: libHYPRE_sstruct_mv${HYPRE_LIB_SUFFIX} cp -fR $(srcdir)/HYPRE_*.h $(HYPRE_INC_INSTALL) cp -fR $(srcdir)/_hypre_sstruct_mv.h $(HYPRE_INC_INSTALL) # cp -fR libHYPRE* $(HYPRE_LIB_INSTALL) clean: rm -f *.o *.obj libHYPRE* rm -rf pchdir tca.map *inslog* distclean: clean ################################################################## # Rules ################################################################## libHYPRE_sstruct_mv.a: ${OBJS} @echo "Building $@ ... " ${AR} $@ ${OBJS} ${RANLIB} $@ libHYPRE_sstruct_mv.so libHYPRE_sstruct_mv.dylib: ${OBJS} @echo "Building $@ ... " ${BUILD_CC_SHARED} -o ${SONAME} ${OBJS} ${SHARED_SET_SONAME}${SONAME} ln -s -f ${SONAME} $@ ${OBJS}: ${HEADERS} hypre-2.33.0/src/sstruct_mv/_hypre_sstruct_mv.h000066400000000000000000001653731477326011500217030ustar00rootroot00000000000000 /*** DO NOT EDIT THIS FILE DIRECTLY (use 'headers' to generate) ***/ #ifndef hypre_SSTRUCT_MV_HEADER #define hypre_SSTRUCT_MV_HEADER #include #include #include #include "HYPRE_sstruct_mv.h" #include "_hypre_utilities.h" #include "_hypre_struct_mv.h" #include "_hypre_IJ_mv.h" #ifdef __cplusplus extern "C" { #endif /****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * Header info for the hypre_SStructGrid structures * *****************************************************************************/ #ifndef hypre_SSTRUCT_GRID_HEADER #define hypre_SSTRUCT_GRID_HEADER /*-------------------------------------------------------------------------- * hypre_SStructGrid: * * NOTE: Since variables may be replicated across different processes, * a separate set of "interface grids" is retained so that data can be * migrated onto and off of the internal (non-replicated) grids. *--------------------------------------------------------------------------*/ typedef HYPRE_Int hypre_SStructVariable; typedef struct { HYPRE_SStructVariable type; HYPRE_Int rank; /* local rank */ HYPRE_Int proc; } hypre_SStructUVar; typedef struct { HYPRE_Int part; hypre_Index cell; HYPRE_Int nuvars; hypre_SStructUVar *uvars; } hypre_SStructUCVar; typedef struct { MPI_Comm comm; /* TODO: use different comms */ HYPRE_Int ndim; HYPRE_Int nvars; /* number of variables */ HYPRE_SStructVariable *vartypes; /* types of variables */ hypre_StructGrid *sgrids[8]; /* struct grids for each vartype */ hypre_BoxArray *iboxarrays[8]; /* interface boxes */ hypre_BoxArray *pneighbors; hypre_Index *pnbor_offsets; HYPRE_Int local_size; /* Number of variables locally */ HYPRE_BigInt global_size; /* Total number of variables */ hypre_Index periodic; /* Indicates if pgrid is periodic */ /* GEC0902 additions for ghost expansion of boxes */ HYPRE_Int ghlocal_size; /* Number of vars including ghosts */ HYPRE_Int cell_sgrid_done; /* =1 implies cell grid already assembled */ } hypre_SStructPGrid; typedef struct { hypre_Box box; HYPRE_Int part; hypre_Index ilower; /* box ilower, but on the neighbor index-space */ hypre_Index coord; /* lives on local index-space */ hypre_Index dir; /* lives on local index-space */ } hypre_SStructNeighbor; enum hypre_SStructBoxManInfoType { hypre_SSTRUCT_BOXMAN_INFO_DEFAULT = 0, hypre_SSTRUCT_BOXMAN_INFO_NEIGHBOR = 1 }; typedef struct { HYPRE_Int type; HYPRE_BigInt offset; HYPRE_BigInt ghoffset; } hypre_SStructBoxManInfo; typedef struct { HYPRE_Int type; HYPRE_BigInt offset; /* minimum offset for this box */ HYPRE_BigInt ghoffset; /* minimum offset ghost for this box */ HYPRE_Int proc; /* redundant with the proc in the entry, but makes some coding easier */ HYPRE_Int boxnum; /* this is different from the entry id */ HYPRE_Int part; /* part the box lives on */ hypre_Index ilower; /* box ilower, but on the neighbor index-space */ hypre_Index coord; /* lives on local index-space */ hypre_Index dir; /* lives on local index-space */ hypre_Index stride; /* lives on local index-space */ hypre_Index ghstride; /* the ghost equivalent of strides */ } hypre_SStructBoxManNborInfo; typedef struct { hypre_CommInfo *comm_info; HYPRE_Int send_part; HYPRE_Int recv_part; HYPRE_Int send_var; HYPRE_Int recv_var; } hypre_SStructCommInfo; typedef struct hypre_SStructGrid_struct { MPI_Comm comm; HYPRE_Int ndim; HYPRE_Int nparts; /* s-variable info */ hypre_SStructPGrid **pgrids; /* neighbor info */ HYPRE_Int *nneighbors; hypre_SStructNeighbor **neighbors; hypre_Index **nbor_offsets; HYPRE_Int **nvneighbors; hypre_SStructNeighbor ***vneighbors; hypre_SStructCommInfo **vnbor_comm_info; /* for updating shared data */ HYPRE_Int vnbor_ncomms; /* u-variables info: During construction, array entries are consecutive. * After 'Assemble', entries are referenced via local cell rank. */ HYPRE_Int nucvars; hypre_SStructUCVar **ucvars; /* info for fem-based user input (for each part) */ HYPRE_Int *fem_nvars; HYPRE_Int **fem_vars; hypre_Index **fem_offsets; /* info for mapping (part, index, var) --> rank */ hypre_BoxManager ***boxmans; /* manager for each part, var */ hypre_BoxManager ***nbor_boxmans; /* manager for each part, var */ HYPRE_BigInt start_rank; HYPRE_Int local_size; /* Number of variables locally */ HYPRE_BigInt global_size; /* Total number of variables */ HYPRE_Int ref_count; /* GEC0902 additions for ghost expansion of boxes */ HYPRE_Int ghlocal_size; /* GEC0902 Number of vars including ghosts */ HYPRE_BigInt ghstart_rank; /* GEC0902 start rank including ghosts */ HYPRE_Int num_ghost[2 * HYPRE_MAXDIM]; /* ghost layer size */ } hypre_SStructGrid; /*-------------------------------------------------------------------------- * Accessor macros: hypre_SStructGrid *--------------------------------------------------------------------------*/ #define hypre_SStructGridComm(grid) ((grid) -> comm) #define hypre_SStructGridNDim(grid) ((grid) -> ndim) #define hypre_SStructGridNParts(grid) ((grid) -> nparts) #define hypre_SStructGridPGrids(grid) ((grid) -> pgrids) #define hypre_SStructGridPGrid(grid, part) ((grid) -> pgrids[part]) #define hypre_SStructGridNNeighbors(grid) ((grid) -> nneighbors) #define hypre_SStructGridNeighbors(grid) ((grid) -> neighbors) #define hypre_SStructGridNborOffsets(grid) ((grid) -> nbor_offsets) #define hypre_SStructGridNVNeighbors(grid) ((grid) -> nvneighbors) #define hypre_SStructGridVNeighbors(grid) ((grid) -> vneighbors) #define hypre_SStructGridVNborCommInfo(grid) ((grid) -> vnbor_comm_info) #define hypre_SStructGridVNborNComms(grid) ((grid) -> vnbor_ncomms) #define hypre_SStructGridNUCVars(grid) ((grid) -> nucvars) #define hypre_SStructGridUCVars(grid) ((grid) -> ucvars) #define hypre_SStructGridUCVar(grid, i) ((grid) -> ucvars[i]) #define hypre_SStructGridFEMNVars(grid) ((grid) -> fem_nvars) #define hypre_SStructGridFEMVars(grid) ((grid) -> fem_vars) #define hypre_SStructGridFEMOffsets(grid) ((grid) -> fem_offsets) #define hypre_SStructGridFEMPNVars(grid, part) ((grid) -> fem_nvars[part]) #define hypre_SStructGridFEMPVars(grid, part) ((grid) -> fem_vars[part]) #define hypre_SStructGridFEMPOffsets(grid, part) ((grid) -> fem_offsets[part]) #define hypre_SStructGridBoxManagers(grid) ((grid) -> boxmans) #define hypre_SStructGridBoxManager(grid, part, var) ((grid) -> boxmans[part][var]) #define hypre_SStructGridNborBoxManagers(grid) ((grid) -> nbor_boxmans) #define hypre_SStructGridNborBoxManager(grid, part, var) ((grid) -> nbor_boxmans[part][var]) #define hypre_SStructGridStartRank(grid) ((grid) -> start_rank) #define hypre_SStructGridLocalSize(grid) ((grid) -> local_size) #define hypre_SStructGridGlobalSize(grid) ((grid) -> global_size) #define hypre_SStructGridRefCount(grid) ((grid) -> ref_count) #define hypre_SStructGridGhlocalSize(grid) ((grid) -> ghlocal_size) #define hypre_SStructGridGhstartRank(grid) ((grid) -> ghstart_rank) #define hypre_SStructGridNumGhost(grid) ((grid) -> num_ghost) /*-------------------------------------------------------------------------- * Accessor macros: hypre_SStructPGrid *--------------------------------------------------------------------------*/ #define hypre_SStructPGridComm(pgrid) ((pgrid) -> comm) #define hypre_SStructPGridNDim(pgrid) ((pgrid) -> ndim) #define hypre_SStructPGridNVars(pgrid) ((pgrid) -> nvars) #define hypre_SStructPGridVarTypes(pgrid) ((pgrid) -> vartypes) #define hypre_SStructPGridVarType(pgrid, var) ((pgrid) -> vartypes[var]) #define hypre_SStructPGridCellSGridDone(pgrid) ((pgrid) -> cell_sgrid_done) #define hypre_SStructPGridSGrids(pgrid) ((pgrid) -> sgrids) #define hypre_SStructPGridSGrid(pgrid, var) \ ((pgrid) -> sgrids[hypre_SStructPGridVarType(pgrid, var)]) #define hypre_SStructPGridCellSGrid(pgrid) \ ((pgrid) -> sgrids[HYPRE_SSTRUCT_VARIABLE_CELL]) #define hypre_SStructPGridVTSGrid(pgrid, vartype) ((pgrid) -> sgrids[vartype]) #define hypre_SStructPGridIBoxArrays(pgrid) ((pgrid) -> iboxarrays) #define hypre_SStructPGridIBoxArray(pgrid, var) \ ((pgrid) -> iboxarrays[hypre_SStructPGridVarType(pgrid, var)]) #define hypre_SStructPGridCellIBoxArray(pgrid) \ ((pgrid) -> iboxarrays[HYPRE_SSTRUCT_VARIABLE_CELL]) #define hypre_SStructPGridVTIBoxArray(pgrid, vartype) \ ((pgrid) -> iboxarrays[vartype]) #define hypre_SStructPGridPNeighbors(pgrid) ((pgrid) -> pneighbors) #define hypre_SStructPGridPNborOffsets(pgrid) ((pgrid) -> pnbor_offsets) #define hypre_SStructPGridLocalSize(pgrid) ((pgrid) -> local_size) #define hypre_SStructPGridGlobalSize(pgrid) ((pgrid) -> global_size) #define hypre_SStructPGridPeriodic(pgrid) ((pgrid) -> periodic) #define hypre_SStructPGridGhlocalSize(pgrid) ((pgrid) -> ghlocal_size) /*-------------------------------------------------------------------------- * Accessor macros: hypre_SStructBoxManInfo *--------------------------------------------------------------------------*/ #define hypre_SStructBoxManInfoType(info) ((info) -> type) #define hypre_SStructBoxManInfoOffset(info) ((info) -> offset) #define hypre_SStructBoxManInfoGhoffset(info) ((info) -> ghoffset) /*-------------------------------------------------------------------------- * Accessor macros: hypre_SStructBoxManInfo *--------------------------------------------------------------------------*/ /* Use the MapInfo macros to access the first three structure components */ #define hypre_SStructBoxManNborInfoProc(info) ((info) -> proc) #define hypre_SStructBoxManNborInfoBoxnum(info) ((info) -> boxnum) #define hypre_SStructBoxManNborInfoPart(info) ((info) -> part) #define hypre_SStructBoxManNborInfoILower(info) ((info) -> ilower) #define hypre_SStructBoxManNborInfoCoord(info) ((info) -> coord) #define hypre_SStructBoxManNborInfoDir(info) ((info) -> dir) #define hypre_SStructBoxManNborInfoStride(info) ((info) -> stride) #define hypre_SStructBoxManNborInfoGhstride(info) ((info) -> ghstride) /*-------------------------------------------------------------------------- * Accessor macros: hypre_SStructNeighbor *--------------------------------------------------------------------------*/ #define hypre_SStructNeighborBox(neighbor) &((neighbor) -> box) #define hypre_SStructNeighborPart(neighbor) ((neighbor) -> part) #define hypre_SStructNeighborILower(neighbor) ((neighbor) -> ilower) #define hypre_SStructNeighborCoord(neighbor) ((neighbor) -> coord) #define hypre_SStructNeighborDir(neighbor) ((neighbor) -> dir) /*-------------------------------------------------------------------------- * Accessor macros: hypre_SStructCommInfo *--------------------------------------------------------------------------*/ #define hypre_SStructCommInfoCommInfo(cinfo) ((cinfo) -> comm_info) #define hypre_SStructCommInfoSendPart(cinfo) ((cinfo) -> send_part) #define hypre_SStructCommInfoRecvPart(cinfo) ((cinfo) -> recv_part) #define hypre_SStructCommInfoSendVar(cinfo) ((cinfo) -> send_var) #define hypre_SStructCommInfoRecvVar(cinfo) ((cinfo) -> recv_var) /*-------------------------------------------------------------------------- * Accessor macros: hypre_SStructUCVar *--------------------------------------------------------------------------*/ #define hypre_SStructUCVarPart(uc) ((uc) -> part) #define hypre_SStructUCVarCell(uc) ((uc) -> cell) #define hypre_SStructUCVarNUVars(uc) ((uc) -> nuvars) #define hypre_SStructUCVarUVars(uc) ((uc) -> uvars) #define hypre_SStructUCVarType(uc, i) ((uc) -> uvars[i].type) #define hypre_SStructUCVarRank(uc, i) ((uc) -> uvars[i].rank) #define hypre_SStructUCVarProc(uc, i) ((uc) -> uvars[i].proc) #endif /****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * Header info for hypre_SStructStencil data structures * *****************************************************************************/ #ifndef hypre_SSTRUCT_STENCIL_HEADER #define hypre_SSTRUCT_STENCIL_HEADER /*-------------------------------------------------------------------------- * hypre_SStructStencil *--------------------------------------------------------------------------*/ typedef struct hypre_SStructStencil_struct { hypre_StructStencil *sstencil; HYPRE_Int *vars; HYPRE_Int ref_count; } hypre_SStructStencil; /*-------------------------------------------------------------------------- * Accessor functions for the hypre_SStructStencil structure *--------------------------------------------------------------------------*/ #define hypre_SStructStencilSStencil(stencil) ((stencil) -> sstencil) #define hypre_SStructStencilVars(stencil) ((stencil) -> vars) #define hypre_SStructStencilVar(stencil, i) ((stencil) -> vars[i]) #define hypre_SStructStencilRefCount(stencil) ((stencil) -> ref_count) #define hypre_SStructStencilShape(stencil) \ hypre_StructStencilShape( hypre_SStructStencilSStencil(stencil) ) #define hypre_SStructStencilSize(stencil) \ hypre_StructStencilSize( hypre_SStructStencilSStencil(stencil) ) #define hypre_SStructStencilNDim(stencil) \ hypre_StructStencilNDim( hypre_SStructStencilSStencil(stencil) ) #define hypre_SStructStencilEntry(stencil, i) \ hypre_StructStencilElement( hypre_SStructStencilSStencil(stencil), i ) #endif /****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * Header info for the hypre_SStructGraph structures * *****************************************************************************/ #ifndef hypre_SSTRUCT_GRAPH_HEADER #define hypre_SSTRUCT_GRAPH_HEADER /*-------------------------------------------------------------------------- * hypre_SStructGraph: *--------------------------------------------------------------------------*/ typedef struct { HYPRE_Int part; hypre_Index index; HYPRE_Int var; HYPRE_Int to_part; hypre_Index to_index; HYPRE_Int to_var; } hypre_SStructGraphEntry; typedef struct { HYPRE_Int to_part; hypre_Index to_index; HYPRE_Int to_var; HYPRE_Int to_boxnum; /* local box number */ HYPRE_Int to_proc; HYPRE_Int to_rank; } hypre_SStructUEntry; typedef struct { HYPRE_Int part; hypre_Index index; HYPRE_Int var; HYPRE_Int rank; HYPRE_Int nUentries; hypre_SStructUEntry *Uentries; } hypre_SStructUVEntry; typedef struct hypre_SStructGraph_struct { MPI_Comm comm; HYPRE_Int ndim; hypre_SStructGrid *grid; hypre_SStructGrid *domain_grid; /* same as grid by default */ HYPRE_Int nparts; hypre_SStructPGrid **pgrids; hypre_SStructStencil ***stencils; /* each (part, var) has a stencil */ /* info for fem-based user input */ HYPRE_Int *fem_nsparse; HYPRE_Int **fem_sparse_i; HYPRE_Int **fem_sparse_j; HYPRE_Int **fem_entries; /* U-graph info: Entries are referenced via a local rank that comes from an * ordering of the local grid boxes with ghost zones added. */ HYPRE_Int nUventries; /* number of Uventries */ HYPRE_Int *iUventries; /* rank indexes into Uventries */ hypre_SStructUVEntry **Uventries; HYPRE_Int Uvesize; /* size of Uventries array */ HYPRE_Int Uemaxsize; /* max size of Uentries */ HYPRE_BigInt **Uveoffsets; /* offsets for computing rank indexes */ HYPRE_Int ref_count; HYPRE_Int type; /* GEC0203 */ /* These are created in GraphAddEntries() then deleted in GraphAssemble() */ hypre_SStructGraphEntry **graph_entries; HYPRE_Int n_graph_entries; /* number graph entries */ HYPRE_Int a_graph_entries; /* alloced graph entries */ } hypre_SStructGraph; /*-------------------------------------------------------------------------- * Accessor macros: hypre_SStructGraph *--------------------------------------------------------------------------*/ #define hypre_SStructGraphComm(graph) ((graph) -> comm) #define hypre_SStructGraphNDim(graph) ((graph) -> ndim) #define hypre_SStructGraphGrid(graph) ((graph) -> grid) #define hypre_SStructGraphDomainGrid(graph) ((graph) -> domain_grid) #define hypre_SStructGraphNParts(graph) ((graph) -> nparts) #define hypre_SStructGraphPGrids(graph) \ hypre_SStructGridPGrids(hypre_SStructGraphGrid(graph)) #define hypre_SStructGraphPGrid(graph, p) \ hypre_SStructGridPGrid(hypre_SStructGraphGrid(graph), p) #define hypre_SStructGraphStencils(graph) ((graph) -> stencils) #define hypre_SStructGraphStencil(graph, p, v) ((graph) -> stencils[p][v]) #define hypre_SStructGraphFEMNSparse(graph) ((graph) -> fem_nsparse) #define hypre_SStructGraphFEMSparseI(graph) ((graph) -> fem_sparse_i) #define hypre_SStructGraphFEMSparseJ(graph) ((graph) -> fem_sparse_j) #define hypre_SStructGraphFEMEntries(graph) ((graph) -> fem_entries) #define hypre_SStructGraphFEMPNSparse(graph, p) ((graph) -> fem_nsparse[p]) #define hypre_SStructGraphFEMPSparseI(graph, p) ((graph) -> fem_sparse_i[p]) #define hypre_SStructGraphFEMPSparseJ(graph, p) ((graph) -> fem_sparse_j[p]) #define hypre_SStructGraphFEMPEntries(graph, p) ((graph) -> fem_entries[p]) #define hypre_SStructGraphNUVEntries(graph) ((graph) -> nUventries) #define hypre_SStructGraphIUVEntries(graph) ((graph) -> iUventries) #define hypre_SStructGraphIUVEntry(graph, i) ((graph) -> iUventries[i]) #define hypre_SStructGraphUVEntries(graph) ((graph) -> Uventries) #define hypre_SStructGraphUVEntry(graph, i) ((graph) -> Uventries[i]) #define hypre_SStructGraphUVESize(graph) ((graph) -> Uvesize) #define hypre_SStructGraphUEMaxSize(graph) ((graph) -> Uemaxsize) #define hypre_SStructGraphUVEOffsets(graph) ((graph) -> Uveoffsets) #define hypre_SStructGraphUVEOffset(graph, p, v)((graph) -> Uveoffsets[p][v]) #define hypre_SStructGraphRefCount(graph) ((graph) -> ref_count) #define hypre_SStructGraphObjectType(graph) ((graph) -> type) #define hypre_SStructGraphEntries(graph) ((graph) -> graph_entries) #define hypre_SStructNGraphEntries(graph) ((graph) -> n_graph_entries) #define hypre_SStructAGraphEntries(graph) ((graph) -> a_graph_entries) /*-------------------------------------------------------------------------- * Accessor macros: hypre_SStructUVEntry *--------------------------------------------------------------------------*/ #define hypre_SStructUVEntryPart(Uv) ((Uv) -> part) #define hypre_SStructUVEntryIndex(Uv) ((Uv) -> index) #define hypre_SStructUVEntryVar(Uv) ((Uv) -> var) #define hypre_SStructUVEntryRank(Uv) ((Uv) -> rank) #define hypre_SStructUVEntryNUEntries(Uv) ((Uv) -> nUentries) #define hypre_SStructUVEntryUEntries(Uv) ((Uv) -> Uentries) #define hypre_SStructUVEntryUEntry(Uv, i) &((Uv) -> Uentries[i]) #define hypre_SStructUVEntryToPart(Uv, i) ((Uv) -> Uentries[i].to_part) #define hypre_SStructUVEntryToIndex(Uv, i) ((Uv) -> Uentries[i].to_index) #define hypre_SStructUVEntryToVar(Uv, i) ((Uv) -> Uentries[i].to_var) #define hypre_SStructUVEntryToBoxnum(Uv, i) ((Uv) -> Uentries[i].to_boxnum) #define hypre_SStructUVEntryToProc(Uv, i) ((Uv) -> Uentries[i].to_proc) #define hypre_SStructUVEntryToRank(Uv, i) ((Uv) -> Uentries[i].to_rank) /*-------------------------------------------------------------------------- * Accessor macros: hypre_SStructUEntry *--------------------------------------------------------------------------*/ #define hypre_SStructUEntryToPart(U) ((U) -> to_part) #define hypre_SStructUEntryToIndex(U) ((U) -> to_index) #define hypre_SStructUEntryToVar(U) ((U) -> to_var) #define hypre_SStructUEntryToBoxnum(U) ((U) -> to_boxnum) #define hypre_SStructUEntryToProc(U) ((U) -> to_proc) #define hypre_SStructUEntryToRank(U) ((U) -> to_rank) /*-------------------------------------------------------------------------- * Accessor macros: hypre_SStructGraphEntry *--------------------------------------------------------------------------*/ #define hypre_SStructGraphEntryPart(g) ((g) -> part) #define hypre_SStructGraphEntryIndex(g) ((g) -> index) #define hypre_SStructGraphEntryVar(g) ((g) -> var) #define hypre_SStructGraphEntryToPart(g) ((g) -> to_part) #define hypre_SStructGraphEntryToIndex(g) ((g) -> to_index) #define hypre_SStructGraphEntryToVar(g) ((g) -> to_var) #endif /****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * Header info for the hypre_SStructMatrix structures * *****************************************************************************/ #ifndef hypre_SSTRUCT_MATRIX_HEADER #define hypre_SSTRUCT_MATRIX_HEADER /*-------------------------------------------------------------------------- * hypre_SStructMatrix: *--------------------------------------------------------------------------*/ typedef struct { MPI_Comm comm; hypre_SStructPGrid *pgrid; hypre_SStructStencil **stencils; /* nvar array of stencils */ HYPRE_Int nvars; HYPRE_Int **smaps; hypre_StructStencil ***sstencils; /* nvar x nvar array of sstencils */ hypre_StructMatrix ***smatrices; /* nvar x nvar array of smatrices */ HYPRE_Int **symmetric; /* Stencil entries symmetric? * (nvar x nvar array) */ /* temporary storage for SetValues routines */ HYPRE_Int sentries_size; HYPRE_Int *sentries; HYPRE_Int accumulated; /* AddTo values accumulated? */ HYPRE_Int ref_count; } hypre_SStructPMatrix; typedef struct hypre_SStructMatrix_struct { MPI_Comm comm; HYPRE_Int ndim; hypre_SStructGraph *graph; HYPRE_Int ***splits; /* S/U-matrix split for each stencil */ /* S-matrix info */ HYPRE_Int nparts; hypre_SStructPMatrix **pmatrices; HYPRE_Int ***symmetric; /* Stencil entries symmetric? * (nparts x nvar x nvar array) */ /* U-matrix info */ HYPRE_IJMatrix ijmatrix; hypre_ParCSRMatrix *parcsrmatrix; /* temporary storage for SetValues routines */ HYPRE_Int entries_size; HYPRE_Int *Sentries; HYPRE_Int *Uentries; HYPRE_Int tmp_size; /* size of the following 3 */ HYPRE_BigInt *tmp_row_coords; HYPRE_BigInt *tmp_col_coords; HYPRE_Complex *tmp_coeffs; HYPRE_BigInt *d_tmp_row_coords; HYPRE_BigInt *d_tmp_col_coords; HYPRE_Complex *d_tmp_coeffs; HYPRE_Int ns_symmetric; /* Non-stencil entries symmetric? */ HYPRE_Int global_size; /* Total number of nonzero coeffs */ HYPRE_Int ref_count; /* GEC0902 adding an object type to the matrix */ HYPRE_Int object_type; } hypre_SStructMatrix; /*-------------------------------------------------------------------------- * Accessor macros: hypre_SStructMatrix *--------------------------------------------------------------------------*/ #define hypre_SStructMatrixComm(mat) ((mat) -> comm) #define hypre_SStructMatrixNDim(mat) ((mat) -> ndim) #define hypre_SStructMatrixGraph(mat) ((mat) -> graph) #define hypre_SStructMatrixSplits(mat) ((mat) -> splits) #define hypre_SStructMatrixSplit(mat, p, v) ((mat) -> splits[p][v]) #define hypre_SStructMatrixNParts(mat) ((mat) -> nparts) #define hypre_SStructMatrixPMatrices(mat) ((mat) -> pmatrices) #define hypre_SStructMatrixPMatrix(mat, part) ((mat) -> pmatrices[part]) #define hypre_SStructMatrixSymmetric(mat) ((mat) -> symmetric) #define hypre_SStructMatrixIJMatrix(mat) ((mat) -> ijmatrix) #define hypre_SStructMatrixParCSRMatrix(mat) ((mat) -> parcsrmatrix) #define hypre_SStructMatrixEntriesSize(mat) ((mat) -> entries_size) #define hypre_SStructMatrixSEntries(mat) ((mat) -> Sentries) #define hypre_SStructMatrixUEntries(mat) ((mat) -> Uentries) #define hypre_SStructMatrixTmpSize(mat) ((mat) -> tmp_size) #define hypre_SStructMatrixTmpRowCoords(mat) ((mat) -> tmp_row_coords) #define hypre_SStructMatrixTmpColCoords(mat) ((mat) -> tmp_col_coords) #define hypre_SStructMatrixTmpCoeffs(mat) ((mat) -> tmp_coeffs) #define hypre_SStructMatrixTmpRowCoordsDevice(mat) ((mat) -> d_tmp_row_coords) #define hypre_SStructMatrixTmpColCoordsDevice(mat) ((mat) -> d_tmp_col_coords) #define hypre_SStructMatrixTmpCoeffsDevice(mat) ((mat) -> d_tmp_coeffs) #define hypre_SStructMatrixNSSymmetric(mat) ((mat) -> ns_symmetric) #define hypre_SStructMatrixGlobalSize(mat) ((mat) -> global_size) #define hypre_SStructMatrixRefCount(mat) ((mat) -> ref_count) #define hypre_SStructMatrixObjectType(mat) ((mat) -> object_type) /*-------------------------------------------------------------------------- * Accessor macros: hypre_SStructPMatrix *--------------------------------------------------------------------------*/ #define hypre_SStructPMatrixComm(pmat) ((pmat) -> comm) #define hypre_SStructPMatrixPGrid(pmat) ((pmat) -> pgrid) #define hypre_SStructPMatrixNDim(pmat) \ hypre_SStructPGridNDim(hypre_SStructPMatrixPGrid(pmat)) #define hypre_SStructPMatrixStencils(pmat) ((pmat) -> stencils) #define hypre_SStructPMatrixNVars(pmat) ((pmat) -> nvars) #define hypre_SStructPMatrixStencil(pmat, var) ((pmat) -> stencils[var]) #define hypre_SStructPMatrixSMaps(pmat) ((pmat) -> smaps) #define hypre_SStructPMatrixSMap(pmat, var) ((pmat) -> smaps[var]) #define hypre_SStructPMatrixSStencils(pmat) ((pmat) -> sstencils) #define hypre_SStructPMatrixSStencil(pmat, vi, vj) \ ((pmat) -> sstencils[vi][vj]) #define hypre_SStructPMatrixSMatrices(pmat) ((pmat) -> smatrices) #define hypre_SStructPMatrixSMatrix(pmat, vi, vj) \ ((pmat) -> smatrices[vi][vj]) #define hypre_SStructPMatrixSymmetric(pmat) ((pmat) -> symmetric) #define hypre_SStructPMatrixSEntriesSize(pmat) ((pmat) -> sentries_size) #define hypre_SStructPMatrixSEntries(pmat) ((pmat) -> sentries) #define hypre_SStructPMatrixAccumulated(pmat) ((pmat) -> accumulated) #define hypre_SStructPMatrixRefCount(pmat) ((pmat) -> ref_count) #endif /****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * Header info for the hypre_SStructVector structures * *****************************************************************************/ #ifndef hypre_SSTRUCT_VECTOR_HEADER #define hypre_SSTRUCT_VECTOR_HEADER /*-------------------------------------------------------------------------- * hypre_SStructVector: *--------------------------------------------------------------------------*/ typedef struct { MPI_Comm comm; hypre_SStructPGrid *pgrid; HYPRE_Int nvars; hypre_StructVector **svectors; /* nvar array of svectors */ hypre_CommPkg **comm_pkgs; /* nvar array of comm pkgs */ HYPRE_Int accumulated; /* AddTo values accumulated? */ HYPRE_Int ref_count; HYPRE_Int *dataindices; /* GEC1002 array for starting index of the svector. pdataindices[varx] */ HYPRE_Int datasize; /* Size of the pvector = sums size of svectors */ } hypre_SStructPVector; typedef struct hypre_SStructVector_struct { MPI_Comm comm; HYPRE_Int ndim; hypre_SStructGrid *grid; HYPRE_Int object_type; /* s-vector info */ HYPRE_Int nparts; hypre_SStructPVector **pvectors; hypre_CommPkg ***comm_pkgs; /* nvar array of comm pkgs */ /* u-vector info */ HYPRE_IJVector ijvector; hypre_ParVector *parvector; /* inter-part communication info */ HYPRE_Int nbor_ncomms; /* num comm_pkgs with neighbor parts */ /* GEC10020902 pointer to big chunk of memory and auxiliary information */ HYPRE_Complex *data; /* GEC1002 pointer to chunk data */ HYPRE_Int *dataindices; /* GEC1002 dataindices[partx] is the starting index of vector data for the part=partx */ HYPRE_Int datasize; /* GEC1002 size of all data = ghlocalsize */ HYPRE_Int global_size; /* Total number coefficients */ HYPRE_Int ref_count; } hypre_SStructVector; /*-------------------------------------------------------------------------- * Accessor macros: hypre_SStructVector *--------------------------------------------------------------------------*/ #define hypre_SStructVectorComm(vec) ((vec) -> comm) #define hypre_SStructVectorNDim(vec) ((vec) -> ndim) #define hypre_SStructVectorGrid(vec) ((vec) -> grid) #define hypre_SStructVectorObjectType(vec) ((vec) -> object_type) #define hypre_SStructVectorNParts(vec) ((vec) -> nparts) #define hypre_SStructVectorPVectors(vec) ((vec) -> pvectors) #define hypre_SStructVectorPVector(vec, part) ((vec) -> pvectors[part]) #define hypre_SStructVectorIJVector(vec) ((vec) -> ijvector) #define hypre_SStructVectorParVector(vec) ((vec) -> parvector) #define hypre_SStructVectorNborNComms(vec) ((vec) -> nbor_ncomms) #define hypre_SStructVectorGlobalSize(vec) ((vec) -> global_size) #define hypre_SStructVectorRefCount(vec) ((vec) -> ref_count) #define hypre_SStructVectorData(vec) ((vec) -> data ) #define hypre_SStructVectorDataIndices(vec) ((vec) -> dataindices) #define hypre_SStructVectorDataSize(vec) ((vec) -> datasize) /*-------------------------------------------------------------------------- * Accessor macros: hypre_SStructPVector *--------------------------------------------------------------------------*/ #define hypre_SStructPVectorComm(pvec) ((pvec) -> comm) #define hypre_SStructPVectorPGrid(pvec) ((pvec) -> pgrid) #define hypre_SStructPVectorNVars(pvec) ((pvec) -> nvars) #define hypre_SStructPVectorSVectors(pvec) ((pvec) -> svectors) #define hypre_SStructPVectorSVector(pvec, v) ((pvec) -> svectors[v]) #define hypre_SStructPVectorCommPkgs(pvec) ((pvec) -> comm_pkgs) #define hypre_SStructPVectorCommPkg(pvec, v) ((pvec) -> comm_pkgs[v]) #define hypre_SStructPVectorAccumulated(pvec) ((pvec) -> accumulated) #define hypre_SStructPVectorRefCount(pvec) ((pvec) -> ref_count) #define hypre_SStructPVectorDataIndices(pvec) ((pvec) -> dataindices ) #define hypre_SStructPVectorDataSize(pvec) ((pvec) -> datasize ) #endif /****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /* HYPRE_sstruct_graph.c */ HYPRE_Int HYPRE_SStructGraphCreate ( MPI_Comm comm, HYPRE_SStructGrid grid, HYPRE_SStructGraph *graph_ptr ); HYPRE_Int HYPRE_SStructGraphDestroy ( HYPRE_SStructGraph graph ); HYPRE_Int HYPRE_SStructGraphSetDomainGrid ( HYPRE_SStructGraph graph, HYPRE_SStructGrid domain_grid ); HYPRE_Int HYPRE_SStructGraphSetStencil ( HYPRE_SStructGraph graph, HYPRE_Int part, HYPRE_Int var, HYPRE_SStructStencil stencil ); HYPRE_Int HYPRE_SStructGraphSetFEM ( HYPRE_SStructGraph graph, HYPRE_Int part ); HYPRE_Int HYPRE_SStructGraphSetFEMSparsity ( HYPRE_SStructGraph graph, HYPRE_Int part, HYPRE_Int nsparse, HYPRE_Int *sparsity ); HYPRE_Int HYPRE_SStructGraphAddEntries ( HYPRE_SStructGraph graph, HYPRE_Int part, HYPRE_Int *index, HYPRE_Int var, HYPRE_Int to_part, HYPRE_Int *to_index, HYPRE_Int to_var ); HYPRE_Int HYPRE_SStructGraphAssemble ( HYPRE_SStructGraph graph ); HYPRE_Int HYPRE_SStructGraphSetObjectType ( HYPRE_SStructGraph graph, HYPRE_Int type ); HYPRE_Int HYPRE_SStructGraphPrint ( FILE *file, HYPRE_SStructGraph graph ); HYPRE_Int HYPRE_SStructGraphRead ( FILE *file, HYPRE_SStructGrid grid, HYPRE_SStructStencil **stencils, HYPRE_SStructGraph *graph_ptr ); /* HYPRE_sstruct_grid.c */ HYPRE_Int HYPRE_SStructGridCreate ( MPI_Comm comm, HYPRE_Int ndim, HYPRE_Int nparts, HYPRE_SStructGrid *grid_ptr ); HYPRE_Int HYPRE_SStructGridDestroy ( HYPRE_SStructGrid grid ); HYPRE_Int HYPRE_SStructGridSetExtents ( HYPRE_SStructGrid grid, HYPRE_Int part, HYPRE_Int *ilower, HYPRE_Int *iupper ); HYPRE_Int HYPRE_SStructGridSetVariables ( HYPRE_SStructGrid grid, HYPRE_Int part, HYPRE_Int nvars, HYPRE_SStructVariable *vartypes ); HYPRE_Int HYPRE_SStructGridAddVariables ( HYPRE_SStructGrid grid, HYPRE_Int part, HYPRE_Int *index, HYPRE_Int nvars, HYPRE_SStructVariable *vartypes ); HYPRE_Int HYPRE_SStructGridSetFEMOrdering ( HYPRE_SStructGrid grid, HYPRE_Int part, HYPRE_Int *ordering ); HYPRE_Int HYPRE_SStructGridSetNeighborPart ( HYPRE_SStructGrid grid, HYPRE_Int part, HYPRE_Int *ilower, HYPRE_Int *iupper, HYPRE_Int nbor_part, HYPRE_Int *nbor_ilower, HYPRE_Int *nbor_iupper, HYPRE_Int *index_map, HYPRE_Int *index_dir ); HYPRE_Int HYPRE_SStructGridSetSharedPart ( HYPRE_SStructGrid grid, HYPRE_Int part, HYPRE_Int *ilower, HYPRE_Int *iupper, HYPRE_Int *offset, HYPRE_Int shared_part, HYPRE_Int *shared_ilower, HYPRE_Int *shared_iupper, HYPRE_Int *shared_offset, HYPRE_Int *index_map, HYPRE_Int *index_dir ); HYPRE_Int HYPRE_SStructGridAddUnstructuredPart ( HYPRE_SStructGrid grid, HYPRE_Int ilower, HYPRE_Int iupper ); HYPRE_Int HYPRE_SStructGridAssemble ( HYPRE_SStructGrid grid ); HYPRE_Int HYPRE_SStructGridSetPeriodic ( HYPRE_SStructGrid grid, HYPRE_Int part, HYPRE_Int *periodic ); HYPRE_Int HYPRE_SStructGridSetNumGhost ( HYPRE_SStructGrid grid, HYPRE_Int *num_ghost ); /* HYPRE_sstruct_matrix.c */ HYPRE_Int HYPRE_SStructMatrixCreate ( MPI_Comm comm, HYPRE_SStructGraph graph, HYPRE_SStructMatrix *matrix_ptr ); HYPRE_Int HYPRE_SStructMatrixDestroy ( HYPRE_SStructMatrix matrix ); HYPRE_Int HYPRE_SStructMatrixInitialize ( HYPRE_SStructMatrix matrix ); HYPRE_Int HYPRE_SStructMatrixSetValues ( HYPRE_SStructMatrix matrix, HYPRE_Int part, HYPRE_Int *index, HYPRE_Int var, HYPRE_Int nentries, HYPRE_Int *entries, HYPRE_Complex *values ); HYPRE_Int HYPRE_SStructMatrixAddToValues ( HYPRE_SStructMatrix matrix, HYPRE_Int part, HYPRE_Int *index, HYPRE_Int var, HYPRE_Int nentries, HYPRE_Int *entries, HYPRE_Complex *values ); HYPRE_Int HYPRE_SStructMatrixAddFEMValues ( HYPRE_SStructMatrix matrix, HYPRE_Int part, HYPRE_Int *index, HYPRE_Complex *values ); HYPRE_Int HYPRE_SStructMatrixGetValues ( HYPRE_SStructMatrix matrix, HYPRE_Int part, HYPRE_Int *index, HYPRE_Int var, HYPRE_Int nentries, HYPRE_Int *entries, HYPRE_Complex *values ); HYPRE_Int HYPRE_SStructMatrixGetFEMValues ( HYPRE_SStructMatrix matrix, HYPRE_Int part, HYPRE_Int *index, HYPRE_Complex *values ); HYPRE_Int HYPRE_SStructMatrixSetBoxValues ( HYPRE_SStructMatrix matrix, HYPRE_Int part, HYPRE_Int *ilower, HYPRE_Int *iupper, HYPRE_Int var, HYPRE_Int nentries, HYPRE_Int *entries, HYPRE_Complex *values ); HYPRE_Int HYPRE_SStructMatrixAddToBoxValues ( HYPRE_SStructMatrix matrix, HYPRE_Int part, HYPRE_Int *ilower, HYPRE_Int *iupper, HYPRE_Int var, HYPRE_Int nentries, HYPRE_Int *entries, HYPRE_Complex *values ); HYPRE_Int HYPRE_SStructMatrixGetBoxValues ( HYPRE_SStructMatrix matrix, HYPRE_Int part, HYPRE_Int *ilower, HYPRE_Int *iupper, HYPRE_Int var, HYPRE_Int nentries, HYPRE_Int *entries, HYPRE_Complex *values ); HYPRE_Int HYPRE_SStructMatrixAssemble ( HYPRE_SStructMatrix matrix ); HYPRE_Int HYPRE_SStructMatrixSetSymmetric ( HYPRE_SStructMatrix matrix, HYPRE_Int part, HYPRE_Int var, HYPRE_Int to_var, HYPRE_Int symmetric ); HYPRE_Int HYPRE_SStructMatrixSetNSSymmetric ( HYPRE_SStructMatrix matrix, HYPRE_Int symmetric ); HYPRE_Int HYPRE_SStructMatrixSetObjectType ( HYPRE_SStructMatrix matrix, HYPRE_Int type ); HYPRE_Int HYPRE_SStructMatrixGetObject ( HYPRE_SStructMatrix matrix, void **object ); HYPRE_Int HYPRE_SStructMatrixPrint ( const char *filename, HYPRE_SStructMatrix matrix, HYPRE_Int all ); HYPRE_Int HYPRE_SStructMatrixRead ( MPI_Comm comm, const char *filename, HYPRE_SStructMatrix *matrix_ptr ); HYPRE_Int HYPRE_SStructMatrixMatvec ( HYPRE_Complex alpha, HYPRE_SStructMatrix A, HYPRE_SStructVector x, HYPRE_Complex beta, HYPRE_SStructVector y ); /* HYPRE_sstruct_stencil.c */ HYPRE_Int HYPRE_SStructStencilCreate ( HYPRE_Int ndim, HYPRE_Int size, HYPRE_SStructStencil *stencil_ptr ); HYPRE_Int HYPRE_SStructStencilDestroy ( HYPRE_SStructStencil stencil ); HYPRE_Int HYPRE_SStructStencilSetEntry ( HYPRE_SStructStencil stencil, HYPRE_Int entry, HYPRE_Int *offset, HYPRE_Int var ); HYPRE_Int HYPRE_SStructStencilPrint ( FILE *file, HYPRE_SStructStencil stencil ); HYPRE_Int HYPRE_SStructStencilRead ( FILE *file, HYPRE_SStructStencil *stencil_ptr ); /* HYPRE_sstruct_vector.c */ HYPRE_Int HYPRE_SStructVectorCreate ( MPI_Comm comm, HYPRE_SStructGrid grid, HYPRE_SStructVector *vector_ptr ); HYPRE_Int HYPRE_SStructVectorDestroy ( HYPRE_SStructVector vector ); HYPRE_Int HYPRE_SStructVectorInitialize ( HYPRE_SStructVector vector ); HYPRE_Int HYPRE_SStructVectorSetValues ( HYPRE_SStructVector vector, HYPRE_Int part, HYPRE_Int *index, HYPRE_Int var, HYPRE_Complex *value ); HYPRE_Int HYPRE_SStructVectorAddToValues ( HYPRE_SStructVector vector, HYPRE_Int part, HYPRE_Int *index, HYPRE_Int var, HYPRE_Complex *value ); HYPRE_Int HYPRE_SStructVectorAddFEMValues ( HYPRE_SStructVector vector, HYPRE_Int part, HYPRE_Int *index, HYPRE_Complex *values ); HYPRE_Int HYPRE_SStructVectorGetValues ( HYPRE_SStructVector vector, HYPRE_Int part, HYPRE_Int *index, HYPRE_Int var, HYPRE_Complex *value ); HYPRE_Int HYPRE_SStructVectorGetFEMValues ( HYPRE_SStructVector vector, HYPRE_Int part, HYPRE_Int *index, HYPRE_Complex *values ); HYPRE_Int HYPRE_SStructVectorSetBoxValues ( HYPRE_SStructVector vector, HYPRE_Int part, HYPRE_Int *ilower, HYPRE_Int *iupper, HYPRE_Int var, HYPRE_Complex *values ); HYPRE_Int HYPRE_SStructVectorAddToBoxValues ( HYPRE_SStructVector vector, HYPRE_Int part, HYPRE_Int *ilower, HYPRE_Int *iupper, HYPRE_Int var, HYPRE_Complex *values ); HYPRE_Int HYPRE_SStructVectorGetBoxValues ( HYPRE_SStructVector vector, HYPRE_Int part, HYPRE_Int *ilower, HYPRE_Int *iupper, HYPRE_Int var, HYPRE_Complex *values ); HYPRE_Int HYPRE_SStructVectorAssemble ( HYPRE_SStructVector vector ); HYPRE_Int HYPRE_SStructVectorGather ( HYPRE_SStructVector vector ); HYPRE_Int HYPRE_SStructVectorSetConstantValues ( HYPRE_SStructVector vector, HYPRE_Complex value ); HYPRE_Int HYPRE_SStructVectorSetObjectType ( HYPRE_SStructVector vector, HYPRE_Int type ); HYPRE_Int HYPRE_SStructVectorGetObject ( HYPRE_SStructVector vector, void **object ); HYPRE_Int HYPRE_SStructVectorPrint ( const char *filename, HYPRE_SStructVector vector, HYPRE_Int all ); HYPRE_Int HYPRE_SStructVectorRead ( MPI_Comm comm, const char *filename, HYPRE_SStructVector *vector ); HYPRE_Int HYPRE_SStructVectorCopy ( HYPRE_SStructVector x, HYPRE_SStructVector y ); HYPRE_Int HYPRE_SStructVectorScale ( HYPRE_Complex alpha, HYPRE_SStructVector y ); HYPRE_Int HYPRE_SStructInnerProd ( HYPRE_SStructVector x, HYPRE_SStructVector y, HYPRE_Real *result ); HYPRE_Int HYPRE_SStructAxpy ( HYPRE_Complex alpha, HYPRE_SStructVector x, HYPRE_SStructVector y ); /* sstruct_axpy.c */ HYPRE_Int hypre_SStructPAxpy ( HYPRE_Complex alpha, hypre_SStructPVector *px, hypre_SStructPVector *py ); HYPRE_Int hypre_SStructAxpy ( HYPRE_Complex alpha, hypre_SStructVector *x, hypre_SStructVector *y ); /* sstruct_copy.c */ HYPRE_Int hypre_SStructPCopy ( hypre_SStructPVector *px, hypre_SStructPVector *py ); HYPRE_Int hypre_SStructPartialPCopy ( hypre_SStructPVector *px, hypre_SStructPVector *py, hypre_BoxArrayArray **array_boxes ); HYPRE_Int hypre_SStructCopy ( hypre_SStructVector *x, hypre_SStructVector *y ); /* sstruct_graph.c */ HYPRE_Int hypre_SStructGraphRef ( hypre_SStructGraph *graph, hypre_SStructGraph **graph_ref ); HYPRE_Int hypre_SStructGraphGetUVEntryRank( hypre_SStructGraph *graph, HYPRE_Int part, HYPRE_Int var, hypre_Index index, HYPRE_BigInt *rank ); HYPRE_Int hypre_SStructGraphFindBoxEndpt ( hypre_SStructGraph *graph, HYPRE_Int part, HYPRE_Int var, HYPRE_Int proc, HYPRE_Int endpt, HYPRE_Int boxi ); HYPRE_Int hypre_SStructGraphFindSGridEndpts ( hypre_SStructGraph *graph, HYPRE_Int part, HYPRE_Int var, HYPRE_Int proc, HYPRE_Int endpt, HYPRE_Int *endpts ); /* sstruct_grid.c */ HYPRE_Int hypre_SStructVariableGetOffset ( HYPRE_SStructVariable vartype, HYPRE_Int ndim, hypre_Index varoffset ); HYPRE_Int hypre_SStructPGridCreate ( MPI_Comm comm, HYPRE_Int ndim, hypre_SStructPGrid **pgrid_ptr ); HYPRE_Int hypre_SStructPGridDestroy ( hypre_SStructPGrid *pgrid ); HYPRE_Int hypre_SStructPGridSetExtents ( hypre_SStructPGrid *pgrid, hypre_Index ilower, hypre_Index iupper ); HYPRE_Int hypre_SStructPGridSetCellSGrid ( hypre_SStructPGrid *pgrid, hypre_StructGrid *cell_sgrid ); HYPRE_Int hypre_SStructPGridSetVariables ( hypre_SStructPGrid *pgrid, HYPRE_Int nvars, HYPRE_SStructVariable *vartypes ); HYPRE_Int hypre_SStructPGridSetPNeighbor ( hypre_SStructPGrid *pgrid, hypre_Box *pneighbor_box, hypre_Index pnbor_offset ); HYPRE_Int hypre_SStructPGridAssemble ( hypre_SStructPGrid *pgrid ); HYPRE_Int hypre_SStructPGridGetMaxBoxSize ( hypre_SStructPGrid *pgrid ); HYPRE_Int hypre_SStructGridRef ( hypre_SStructGrid *grid, hypre_SStructGrid **grid_ref ); HYPRE_Int hypre_SStructGridAssembleBoxManagers ( hypre_SStructGrid *grid ); HYPRE_Int hypre_SStructGridAssembleNborBoxManagers ( hypre_SStructGrid *grid ); HYPRE_Int hypre_SStructGridCreateCommInfo ( hypre_SStructGrid *grid ); HYPRE_Int hypre_SStructGridFindBoxManEntry ( hypre_SStructGrid *grid, HYPRE_Int part, hypre_Index index, HYPRE_Int var, hypre_BoxManEntry **entry_ptr ); HYPRE_Int hypre_SStructGridFindNborBoxManEntry ( hypre_SStructGrid *grid, HYPRE_Int part, hypre_Index index, HYPRE_Int var, hypre_BoxManEntry **entry_ptr ); HYPRE_Int hypre_SStructGridBoxProcFindBoxManEntry ( hypre_SStructGrid *grid, HYPRE_Int part, HYPRE_Int var, HYPRE_Int box, HYPRE_Int proc, hypre_BoxManEntry **entry_ptr ); HYPRE_Int hypre_SStructBoxManEntryGetCSRstrides ( hypre_BoxManEntry *entry, hypre_Index strides ); HYPRE_Int hypre_SStructBoxManEntryGetGhstrides ( hypre_BoxManEntry *entry, hypre_Index strides ); HYPRE_Int hypre_SStructBoxManEntryGetGlobalCSRank ( hypre_BoxManEntry *entry, hypre_Index index, HYPRE_BigInt *rank_ptr ); HYPRE_Int hypre_SStructBoxManEntryGetGlobalGhrank ( hypre_BoxManEntry *entry, hypre_Index index, HYPRE_BigInt *rank_ptr ); HYPRE_Int hypre_SStructBoxManEntryGetProcess ( hypre_BoxManEntry *entry, HYPRE_Int *proc_ptr ); HYPRE_Int hypre_SStructBoxManEntryGetBoxnum ( hypre_BoxManEntry *entry, HYPRE_Int *id_ptr ); HYPRE_Int hypre_SStructBoxManEntryGetPart ( hypre_BoxManEntry *entry, HYPRE_Int part, HYPRE_Int *part_ptr ); HYPRE_Int hypre_SStructIndexToNborIndex( hypre_Index index, hypre_Index root, hypre_Index nbor_root, hypre_Index coord, hypre_Index dir, HYPRE_Int ndim, hypre_Index nbor_index ); HYPRE_Int hypre_SStructBoxToNborBox ( hypre_Box *box, hypre_Index root, hypre_Index nbor_root, hypre_Index coord, hypre_Index dir ); HYPRE_Int hypre_SStructNborIndexToIndex( hypre_Index nbor_index, hypre_Index root, hypre_Index nbor_root, hypre_Index coord, hypre_Index dir, HYPRE_Int ndim, hypre_Index index ); HYPRE_Int hypre_SStructNborBoxToBox ( hypre_Box *nbor_box, hypre_Index root, hypre_Index nbor_root, hypre_Index coord, hypre_Index dir ); HYPRE_Int hypre_SStructVarToNborVar ( hypre_SStructGrid *grid, HYPRE_Int part, HYPRE_Int var, HYPRE_Int *coord, HYPRE_Int *nbor_var_ptr ); HYPRE_Int hypre_SStructGridSetNumGhost ( hypre_SStructGrid *grid, HYPRE_Int *num_ghost ); HYPRE_Int hypre_SStructBoxManEntryGetGlobalRank ( hypre_BoxManEntry *entry, hypre_Index index, HYPRE_BigInt *rank_ptr, HYPRE_Int type ); HYPRE_Int hypre_SStructBoxManEntryGetStrides ( hypre_BoxManEntry *entry, hypre_Index strides, HYPRE_Int type ); HYPRE_Int hypre_SStructBoxNumMap ( hypre_SStructGrid *grid, HYPRE_Int part, HYPRE_Int boxnum, HYPRE_Int **num_varboxes_ptr, HYPRE_Int ***map_ptr ); HYPRE_Int hypre_SStructCellGridBoxNumMap ( hypre_SStructGrid *grid, HYPRE_Int part, HYPRE_Int ***num_varboxes_ptr, HYPRE_Int ****map_ptr ); HYPRE_Int hypre_SStructCellBoxToVarBox ( hypre_Box *box, hypre_Index offset, hypre_Index varoffset, HYPRE_Int *valid ); HYPRE_Int hypre_SStructGridIntersect ( hypre_SStructGrid *grid, HYPRE_Int part, HYPRE_Int var, hypre_Box *box, HYPRE_Int action, hypre_BoxManEntry ***entries_ptr, HYPRE_Int *nentries_ptr ); HYPRE_Int hypre_SStructGridGetMaxBoxSize ( hypre_SStructGrid *grid ); HYPRE_Int hypre_SStructGridPrint ( FILE *file, hypre_SStructGrid *grid ); HYPRE_Int hypre_SStructGridRead ( MPI_Comm comm, FILE *file, hypre_SStructGrid **grid_ptr ); /* sstruct_innerprod.c */ HYPRE_Int hypre_SStructPInnerProd ( hypre_SStructPVector *px, hypre_SStructPVector *py, HYPRE_Real *presult_ptr ); HYPRE_Int hypre_SStructInnerProd ( hypre_SStructVector *x, hypre_SStructVector *y, HYPRE_Real *result_ptr ); /* sstruct_matrix.c */ HYPRE_Int hypre_SStructPMatrixRef ( hypre_SStructPMatrix *matrix, hypre_SStructPMatrix **matrix_ref ); HYPRE_Int hypre_SStructPMatrixCreate ( MPI_Comm comm, hypre_SStructPGrid *pgrid, hypre_SStructStencil **stencils, hypre_SStructPMatrix **pmatrix_ptr ); HYPRE_Int hypre_SStructPMatrixDestroy ( hypre_SStructPMatrix *pmatrix ); HYPRE_Int hypre_SStructPMatrixInitialize ( hypre_SStructPMatrix *pmatrix ); HYPRE_Int hypre_SStructPMatrixSetValues ( hypre_SStructPMatrix *pmatrix, hypre_Index index, HYPRE_Int var, HYPRE_Int nentries, HYPRE_Int *entries, HYPRE_Complex *values, HYPRE_Int action ); HYPRE_Int hypre_SStructPMatrixSetBoxValues( hypre_SStructPMatrix *pmatrix, hypre_Box *set_box, HYPRE_Int var, HYPRE_Int nentries, HYPRE_Int *entries, hypre_Box *value_box, HYPRE_Complex *values, HYPRE_Int action ); HYPRE_Int hypre_SStructPMatrixAccumulate ( hypre_SStructPMatrix *pmatrix ); HYPRE_Int hypre_SStructPMatrixAssemble ( hypre_SStructPMatrix *pmatrix ); HYPRE_Int hypre_SStructPMatrixSetSymmetric ( hypre_SStructPMatrix *pmatrix, HYPRE_Int var, HYPRE_Int to_var, HYPRE_Int symmetric ); HYPRE_Int hypre_SStructPMatrixPrint ( const char *filename, hypre_SStructPMatrix *pmatrix, HYPRE_Int all ); HYPRE_Int hypre_SStructUMatrixInitialize ( hypre_SStructMatrix *matrix ); HYPRE_Int hypre_SStructUMatrixSetValues ( hypre_SStructMatrix *matrix, HYPRE_Int part, hypre_Index index, HYPRE_Int var, HYPRE_Int nentries, HYPRE_Int *entries, HYPRE_Complex *values, HYPRE_Int action ); HYPRE_Int hypre_SStructUMatrixSetBoxValues( hypre_SStructMatrix *matrix, HYPRE_Int part, hypre_Box *set_box, HYPRE_Int var, HYPRE_Int nentries, HYPRE_Int *entries, hypre_Box *value_box, HYPRE_Complex *values, HYPRE_Int action ); HYPRE_Int hypre_SStructUMatrixAssemble ( hypre_SStructMatrix *matrix ); HYPRE_Int hypre_SStructMatrixRef ( hypre_SStructMatrix *matrix, hypre_SStructMatrix **matrix_ref ); HYPRE_Int hypre_SStructMatrixSplitEntries ( hypre_SStructMatrix *matrix, HYPRE_Int part, HYPRE_Int var, HYPRE_Int nentries, HYPRE_Int *entries, HYPRE_Int *nSentries_ptr, HYPRE_Int **Sentries_ptr, HYPRE_Int *nUentries_ptr, HYPRE_Int **Uentries_ptr ); HYPRE_Int hypre_SStructMatrixSetValues ( HYPRE_SStructMatrix matrix, HYPRE_Int part, HYPRE_Int *index, HYPRE_Int var, HYPRE_Int nentries, HYPRE_Int *entries, HYPRE_Complex *values, HYPRE_Int action ); HYPRE_Int hypre_SStructMatrixSetBoxValues( HYPRE_SStructMatrix matrix, HYPRE_Int part, hypre_Box *set_box, HYPRE_Int var, HYPRE_Int nentries, HYPRE_Int *entries, hypre_Box *value_box, HYPRE_Complex *values, HYPRE_Int action ); HYPRE_Int hypre_SStructMatrixSetInterPartValues( HYPRE_SStructMatrix matrix, HYPRE_Int part, hypre_Box *set_box, HYPRE_Int var, HYPRE_Int nentries, HYPRE_Int *entries, hypre_Box *value_box, HYPRE_Complex *values, HYPRE_Int action ); HYPRE_MemoryLocation hypre_SStructMatrixMemoryLocation(hypre_SStructMatrix *matrix); /* sstruct_matvec.c */ HYPRE_Int hypre_SStructPMatvecCreate ( void **pmatvec_vdata_ptr ); HYPRE_Int hypre_SStructPMatvecSetup ( void *pmatvec_vdata, hypre_SStructPMatrix *pA, hypre_SStructPVector *px ); HYPRE_Int hypre_SStructPMatvecCompute ( void *pmatvec_vdata, HYPRE_Complex alpha, hypre_SStructPMatrix *pA, hypre_SStructPVector *px, HYPRE_Complex beta, hypre_SStructPVector *py ); HYPRE_Int hypre_SStructPMatvecDestroy ( void *pmatvec_vdata ); HYPRE_Int hypre_SStructPMatvec ( HYPRE_Complex alpha, hypre_SStructPMatrix *pA, hypre_SStructPVector *px, HYPRE_Complex beta, hypre_SStructPVector *py ); HYPRE_Int hypre_SStructMatvecCreate ( void **matvec_vdata_ptr ); HYPRE_Int hypre_SStructMatvecSetup ( void *matvec_vdata, hypre_SStructMatrix *A, hypre_SStructVector *x ); HYPRE_Int hypre_SStructMatvecCompute ( void *matvec_vdata, HYPRE_Complex alpha, hypre_SStructMatrix *A, hypre_SStructVector *x, HYPRE_Complex beta, hypre_SStructVector *y ); HYPRE_Int hypre_SStructMatvecDestroy ( void *matvec_vdata ); HYPRE_Int hypre_SStructMatvec ( HYPRE_Complex alpha, hypre_SStructMatrix *A, hypre_SStructVector *x, HYPRE_Complex beta, hypre_SStructVector *y ); /* sstruct_scale.c */ HYPRE_Int hypre_SStructPScale ( HYPRE_Complex alpha, hypre_SStructPVector *py ); HYPRE_Int hypre_SStructScale ( HYPRE_Complex alpha, hypre_SStructVector *y ); /* sstruct_stencil.c */ HYPRE_Int hypre_SStructStencilRef ( hypre_SStructStencil *stencil, hypre_SStructStencil **stencil_ref ); /* sstruct_vector.c */ HYPRE_Int hypre_SStructPVectorRef ( hypre_SStructPVector *vector, hypre_SStructPVector **vector_ref ); HYPRE_Int hypre_SStructPVectorCreate ( MPI_Comm comm, hypre_SStructPGrid *pgrid, hypre_SStructPVector **pvector_ptr ); HYPRE_Int hypre_SStructPVectorDestroy ( hypre_SStructPVector *pvector ); HYPRE_Int hypre_SStructPVectorInitialize ( hypre_SStructPVector *pvector ); HYPRE_Int hypre_SStructPVectorSetValues ( hypre_SStructPVector *pvector, hypre_Index index, HYPRE_Int var, HYPRE_Complex *value, HYPRE_Int action ); HYPRE_Int hypre_SStructPVectorSetBoxValues( hypre_SStructPVector *pvector, hypre_Box *set_box, HYPRE_Int var, hypre_Box *value_box, HYPRE_Complex *values, HYPRE_Int action ); HYPRE_Int hypre_SStructPVectorAccumulate ( hypre_SStructPVector *pvector ); HYPRE_Int hypre_SStructPVectorAssemble ( hypre_SStructPVector *pvector ); HYPRE_Int hypre_SStructPVectorGather ( hypre_SStructPVector *pvector ); HYPRE_Int hypre_SStructPVectorGetValues ( hypre_SStructPVector *pvector, hypre_Index index, HYPRE_Int var, HYPRE_Complex *value ); HYPRE_Int hypre_SStructPVectorGetBoxValues( hypre_SStructPVector *pvector, hypre_Box *set_box, HYPRE_Int var, hypre_Box *value_box, HYPRE_Complex *values ); HYPRE_Int hypre_SStructPVectorSetConstantValues ( hypre_SStructPVector *pvector, HYPRE_Complex value ); HYPRE_Int hypre_SStructPVectorPrint ( const char *filename, hypre_SStructPVector *pvector, HYPRE_Int all ); HYPRE_Int hypre_SStructVectorRef ( hypre_SStructVector *vector, hypre_SStructVector **vector_ref ); HYPRE_Int hypre_SStructVectorSetConstantValues ( hypre_SStructVector *vector, HYPRE_Complex value ); HYPRE_Int hypre_SStructVectorConvert ( hypre_SStructVector *vector, hypre_ParVector **parvector_ptr ); HYPRE_Int hypre_SStructVectorParConvert ( hypre_SStructVector *vector, hypre_ParVector **parvector_ptr ); HYPRE_Int hypre_SStructVectorRestore ( hypre_SStructVector *vector, hypre_ParVector *parvector ); HYPRE_Int hypre_SStructVectorParRestore ( hypre_SStructVector *vector, hypre_ParVector *parvector ); HYPRE_Int hypre_SStructPVectorInitializeShell ( hypre_SStructPVector *pvector ); HYPRE_Int hypre_SStructVectorInitializeShell ( hypre_SStructVector *vector ); HYPRE_Int hypre_SStructVectorClearGhostValues ( hypre_SStructVector *vector ); HYPRE_MemoryLocation hypre_SStructVectorMemoryLocation(hypre_SStructVector *vector); #ifdef __cplusplus } #endif #endif hypre-2.33.0/src/sstruct_mv/headers000077500000000000000000000027671477326011500173110ustar00rootroot00000000000000#!/bin/bash # Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) INTERNAL_HEADER=_hypre_sstruct_mv.h #=========================================================================== # Include guards and other includes #=========================================================================== cat > $INTERNAL_HEADER <<@ /*** DO NOT EDIT THIS FILE DIRECTLY (use 'headers' to generate) ***/ #ifndef hypre_SSTRUCT_MV_HEADER #define hypre_SSTRUCT_MV_HEADER #include #include #include #include "HYPRE_sstruct_mv.h" #include "_hypre_utilities.h" #include "_hypre_struct_mv.h" #include "_hypre_IJ_mv.h" #ifdef __cplusplus extern "C" { #endif @ #=========================================================================== # Structures and prototypes #=========================================================================== cat sstruct_grid.h >> $INTERNAL_HEADER cat sstruct_stencil.h >> $INTERNAL_HEADER cat sstruct_graph.h >> $INTERNAL_HEADER cat sstruct_matrix.h >> $INTERNAL_HEADER cat sstruct_vector.h >> $INTERNAL_HEADER cat protos.h >> $INTERNAL_HEADER #=========================================================================== # Include guards #=========================================================================== cat >> $INTERNAL_HEADER <<@ #ifdef __cplusplus } #endif #endif @ hypre-2.33.0/src/sstruct_mv/protos.h000066400000000000000000000625371477326011500174500ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /* HYPRE_sstruct_graph.c */ HYPRE_Int HYPRE_SStructGraphCreate ( MPI_Comm comm, HYPRE_SStructGrid grid, HYPRE_SStructGraph *graph_ptr ); HYPRE_Int HYPRE_SStructGraphDestroy ( HYPRE_SStructGraph graph ); HYPRE_Int HYPRE_SStructGraphSetDomainGrid ( HYPRE_SStructGraph graph, HYPRE_SStructGrid domain_grid ); HYPRE_Int HYPRE_SStructGraphSetStencil ( HYPRE_SStructGraph graph, HYPRE_Int part, HYPRE_Int var, HYPRE_SStructStencil stencil ); HYPRE_Int HYPRE_SStructGraphSetFEM ( HYPRE_SStructGraph graph, HYPRE_Int part ); HYPRE_Int HYPRE_SStructGraphSetFEMSparsity ( HYPRE_SStructGraph graph, HYPRE_Int part, HYPRE_Int nsparse, HYPRE_Int *sparsity ); HYPRE_Int HYPRE_SStructGraphAddEntries ( HYPRE_SStructGraph graph, HYPRE_Int part, HYPRE_Int *index, HYPRE_Int var, HYPRE_Int to_part, HYPRE_Int *to_index, HYPRE_Int to_var ); HYPRE_Int HYPRE_SStructGraphAssemble ( HYPRE_SStructGraph graph ); HYPRE_Int HYPRE_SStructGraphSetObjectType ( HYPRE_SStructGraph graph, HYPRE_Int type ); HYPRE_Int HYPRE_SStructGraphPrint ( FILE *file, HYPRE_SStructGraph graph ); HYPRE_Int HYPRE_SStructGraphRead ( FILE *file, HYPRE_SStructGrid grid, HYPRE_SStructStencil **stencils, HYPRE_SStructGraph *graph_ptr ); /* HYPRE_sstruct_grid.c */ HYPRE_Int HYPRE_SStructGridCreate ( MPI_Comm comm, HYPRE_Int ndim, HYPRE_Int nparts, HYPRE_SStructGrid *grid_ptr ); HYPRE_Int HYPRE_SStructGridDestroy ( HYPRE_SStructGrid grid ); HYPRE_Int HYPRE_SStructGridSetExtents ( HYPRE_SStructGrid grid, HYPRE_Int part, HYPRE_Int *ilower, HYPRE_Int *iupper ); HYPRE_Int HYPRE_SStructGridSetVariables ( HYPRE_SStructGrid grid, HYPRE_Int part, HYPRE_Int nvars, HYPRE_SStructVariable *vartypes ); HYPRE_Int HYPRE_SStructGridAddVariables ( HYPRE_SStructGrid grid, HYPRE_Int part, HYPRE_Int *index, HYPRE_Int nvars, HYPRE_SStructVariable *vartypes ); HYPRE_Int HYPRE_SStructGridSetFEMOrdering ( HYPRE_SStructGrid grid, HYPRE_Int part, HYPRE_Int *ordering ); HYPRE_Int HYPRE_SStructGridSetNeighborPart ( HYPRE_SStructGrid grid, HYPRE_Int part, HYPRE_Int *ilower, HYPRE_Int *iupper, HYPRE_Int nbor_part, HYPRE_Int *nbor_ilower, HYPRE_Int *nbor_iupper, HYPRE_Int *index_map, HYPRE_Int *index_dir ); HYPRE_Int HYPRE_SStructGridSetSharedPart ( HYPRE_SStructGrid grid, HYPRE_Int part, HYPRE_Int *ilower, HYPRE_Int *iupper, HYPRE_Int *offset, HYPRE_Int shared_part, HYPRE_Int *shared_ilower, HYPRE_Int *shared_iupper, HYPRE_Int *shared_offset, HYPRE_Int *index_map, HYPRE_Int *index_dir ); HYPRE_Int HYPRE_SStructGridAddUnstructuredPart ( HYPRE_SStructGrid grid, HYPRE_Int ilower, HYPRE_Int iupper ); HYPRE_Int HYPRE_SStructGridAssemble ( HYPRE_SStructGrid grid ); HYPRE_Int HYPRE_SStructGridSetPeriodic ( HYPRE_SStructGrid grid, HYPRE_Int part, HYPRE_Int *periodic ); HYPRE_Int HYPRE_SStructGridSetNumGhost ( HYPRE_SStructGrid grid, HYPRE_Int *num_ghost ); /* HYPRE_sstruct_matrix.c */ HYPRE_Int HYPRE_SStructMatrixCreate ( MPI_Comm comm, HYPRE_SStructGraph graph, HYPRE_SStructMatrix *matrix_ptr ); HYPRE_Int HYPRE_SStructMatrixDestroy ( HYPRE_SStructMatrix matrix ); HYPRE_Int HYPRE_SStructMatrixInitialize ( HYPRE_SStructMatrix matrix ); HYPRE_Int HYPRE_SStructMatrixSetValues ( HYPRE_SStructMatrix matrix, HYPRE_Int part, HYPRE_Int *index, HYPRE_Int var, HYPRE_Int nentries, HYPRE_Int *entries, HYPRE_Complex *values ); HYPRE_Int HYPRE_SStructMatrixAddToValues ( HYPRE_SStructMatrix matrix, HYPRE_Int part, HYPRE_Int *index, HYPRE_Int var, HYPRE_Int nentries, HYPRE_Int *entries, HYPRE_Complex *values ); HYPRE_Int HYPRE_SStructMatrixAddFEMValues ( HYPRE_SStructMatrix matrix, HYPRE_Int part, HYPRE_Int *index, HYPRE_Complex *values ); HYPRE_Int HYPRE_SStructMatrixGetValues ( HYPRE_SStructMatrix matrix, HYPRE_Int part, HYPRE_Int *index, HYPRE_Int var, HYPRE_Int nentries, HYPRE_Int *entries, HYPRE_Complex *values ); HYPRE_Int HYPRE_SStructMatrixGetFEMValues ( HYPRE_SStructMatrix matrix, HYPRE_Int part, HYPRE_Int *index, HYPRE_Complex *values ); HYPRE_Int HYPRE_SStructMatrixSetBoxValues ( HYPRE_SStructMatrix matrix, HYPRE_Int part, HYPRE_Int *ilower, HYPRE_Int *iupper, HYPRE_Int var, HYPRE_Int nentries, HYPRE_Int *entries, HYPRE_Complex *values ); HYPRE_Int HYPRE_SStructMatrixAddToBoxValues ( HYPRE_SStructMatrix matrix, HYPRE_Int part, HYPRE_Int *ilower, HYPRE_Int *iupper, HYPRE_Int var, HYPRE_Int nentries, HYPRE_Int *entries, HYPRE_Complex *values ); HYPRE_Int HYPRE_SStructMatrixGetBoxValues ( HYPRE_SStructMatrix matrix, HYPRE_Int part, HYPRE_Int *ilower, HYPRE_Int *iupper, HYPRE_Int var, HYPRE_Int nentries, HYPRE_Int *entries, HYPRE_Complex *values ); HYPRE_Int HYPRE_SStructMatrixAssemble ( HYPRE_SStructMatrix matrix ); HYPRE_Int HYPRE_SStructMatrixSetSymmetric ( HYPRE_SStructMatrix matrix, HYPRE_Int part, HYPRE_Int var, HYPRE_Int to_var, HYPRE_Int symmetric ); HYPRE_Int HYPRE_SStructMatrixSetNSSymmetric ( HYPRE_SStructMatrix matrix, HYPRE_Int symmetric ); HYPRE_Int HYPRE_SStructMatrixSetObjectType ( HYPRE_SStructMatrix matrix, HYPRE_Int type ); HYPRE_Int HYPRE_SStructMatrixGetObject ( HYPRE_SStructMatrix matrix, void **object ); HYPRE_Int HYPRE_SStructMatrixPrint ( const char *filename, HYPRE_SStructMatrix matrix, HYPRE_Int all ); HYPRE_Int HYPRE_SStructMatrixRead ( MPI_Comm comm, const char *filename, HYPRE_SStructMatrix *matrix_ptr ); HYPRE_Int HYPRE_SStructMatrixMatvec ( HYPRE_Complex alpha, HYPRE_SStructMatrix A, HYPRE_SStructVector x, HYPRE_Complex beta, HYPRE_SStructVector y ); /* HYPRE_sstruct_stencil.c */ HYPRE_Int HYPRE_SStructStencilCreate ( HYPRE_Int ndim, HYPRE_Int size, HYPRE_SStructStencil *stencil_ptr ); HYPRE_Int HYPRE_SStructStencilDestroy ( HYPRE_SStructStencil stencil ); HYPRE_Int HYPRE_SStructStencilSetEntry ( HYPRE_SStructStencil stencil, HYPRE_Int entry, HYPRE_Int *offset, HYPRE_Int var ); HYPRE_Int HYPRE_SStructStencilPrint ( FILE *file, HYPRE_SStructStencil stencil ); HYPRE_Int HYPRE_SStructStencilRead ( FILE *file, HYPRE_SStructStencil *stencil_ptr ); /* HYPRE_sstruct_vector.c */ HYPRE_Int HYPRE_SStructVectorCreate ( MPI_Comm comm, HYPRE_SStructGrid grid, HYPRE_SStructVector *vector_ptr ); HYPRE_Int HYPRE_SStructVectorDestroy ( HYPRE_SStructVector vector ); HYPRE_Int HYPRE_SStructVectorInitialize ( HYPRE_SStructVector vector ); HYPRE_Int HYPRE_SStructVectorSetValues ( HYPRE_SStructVector vector, HYPRE_Int part, HYPRE_Int *index, HYPRE_Int var, HYPRE_Complex *value ); HYPRE_Int HYPRE_SStructVectorAddToValues ( HYPRE_SStructVector vector, HYPRE_Int part, HYPRE_Int *index, HYPRE_Int var, HYPRE_Complex *value ); HYPRE_Int HYPRE_SStructVectorAddFEMValues ( HYPRE_SStructVector vector, HYPRE_Int part, HYPRE_Int *index, HYPRE_Complex *values ); HYPRE_Int HYPRE_SStructVectorGetValues ( HYPRE_SStructVector vector, HYPRE_Int part, HYPRE_Int *index, HYPRE_Int var, HYPRE_Complex *value ); HYPRE_Int HYPRE_SStructVectorGetFEMValues ( HYPRE_SStructVector vector, HYPRE_Int part, HYPRE_Int *index, HYPRE_Complex *values ); HYPRE_Int HYPRE_SStructVectorSetBoxValues ( HYPRE_SStructVector vector, HYPRE_Int part, HYPRE_Int *ilower, HYPRE_Int *iupper, HYPRE_Int var, HYPRE_Complex *values ); HYPRE_Int HYPRE_SStructVectorAddToBoxValues ( HYPRE_SStructVector vector, HYPRE_Int part, HYPRE_Int *ilower, HYPRE_Int *iupper, HYPRE_Int var, HYPRE_Complex *values ); HYPRE_Int HYPRE_SStructVectorGetBoxValues ( HYPRE_SStructVector vector, HYPRE_Int part, HYPRE_Int *ilower, HYPRE_Int *iupper, HYPRE_Int var, HYPRE_Complex *values ); HYPRE_Int HYPRE_SStructVectorAssemble ( HYPRE_SStructVector vector ); HYPRE_Int HYPRE_SStructVectorGather ( HYPRE_SStructVector vector ); HYPRE_Int HYPRE_SStructVectorSetConstantValues ( HYPRE_SStructVector vector, HYPRE_Complex value ); HYPRE_Int HYPRE_SStructVectorSetObjectType ( HYPRE_SStructVector vector, HYPRE_Int type ); HYPRE_Int HYPRE_SStructVectorGetObject ( HYPRE_SStructVector vector, void **object ); HYPRE_Int HYPRE_SStructVectorPrint ( const char *filename, HYPRE_SStructVector vector, HYPRE_Int all ); HYPRE_Int HYPRE_SStructVectorRead ( MPI_Comm comm, const char *filename, HYPRE_SStructVector *vector ); HYPRE_Int HYPRE_SStructVectorCopy ( HYPRE_SStructVector x, HYPRE_SStructVector y ); HYPRE_Int HYPRE_SStructVectorScale ( HYPRE_Complex alpha, HYPRE_SStructVector y ); HYPRE_Int HYPRE_SStructInnerProd ( HYPRE_SStructVector x, HYPRE_SStructVector y, HYPRE_Real *result ); HYPRE_Int HYPRE_SStructAxpy ( HYPRE_Complex alpha, HYPRE_SStructVector x, HYPRE_SStructVector y ); /* sstruct_axpy.c */ HYPRE_Int hypre_SStructPAxpy ( HYPRE_Complex alpha, hypre_SStructPVector *px, hypre_SStructPVector *py ); HYPRE_Int hypre_SStructAxpy ( HYPRE_Complex alpha, hypre_SStructVector *x, hypre_SStructVector *y ); /* sstruct_copy.c */ HYPRE_Int hypre_SStructPCopy ( hypre_SStructPVector *px, hypre_SStructPVector *py ); HYPRE_Int hypre_SStructPartialPCopy ( hypre_SStructPVector *px, hypre_SStructPVector *py, hypre_BoxArrayArray **array_boxes ); HYPRE_Int hypre_SStructCopy ( hypre_SStructVector *x, hypre_SStructVector *y ); /* sstruct_graph.c */ HYPRE_Int hypre_SStructGraphRef ( hypre_SStructGraph *graph, hypre_SStructGraph **graph_ref ); HYPRE_Int hypre_SStructGraphGetUVEntryRank( hypre_SStructGraph *graph, HYPRE_Int part, HYPRE_Int var, hypre_Index index, HYPRE_BigInt *rank ); HYPRE_Int hypre_SStructGraphFindBoxEndpt ( hypre_SStructGraph *graph, HYPRE_Int part, HYPRE_Int var, HYPRE_Int proc, HYPRE_Int endpt, HYPRE_Int boxi ); HYPRE_Int hypre_SStructGraphFindSGridEndpts ( hypre_SStructGraph *graph, HYPRE_Int part, HYPRE_Int var, HYPRE_Int proc, HYPRE_Int endpt, HYPRE_Int *endpts ); /* sstruct_grid.c */ HYPRE_Int hypre_SStructVariableGetOffset ( HYPRE_SStructVariable vartype, HYPRE_Int ndim, hypre_Index varoffset ); HYPRE_Int hypre_SStructPGridCreate ( MPI_Comm comm, HYPRE_Int ndim, hypre_SStructPGrid **pgrid_ptr ); HYPRE_Int hypre_SStructPGridDestroy ( hypre_SStructPGrid *pgrid ); HYPRE_Int hypre_SStructPGridSetExtents ( hypre_SStructPGrid *pgrid, hypre_Index ilower, hypre_Index iupper ); HYPRE_Int hypre_SStructPGridSetCellSGrid ( hypre_SStructPGrid *pgrid, hypre_StructGrid *cell_sgrid ); HYPRE_Int hypre_SStructPGridSetVariables ( hypre_SStructPGrid *pgrid, HYPRE_Int nvars, HYPRE_SStructVariable *vartypes ); HYPRE_Int hypre_SStructPGridSetPNeighbor ( hypre_SStructPGrid *pgrid, hypre_Box *pneighbor_box, hypre_Index pnbor_offset ); HYPRE_Int hypre_SStructPGridAssemble ( hypre_SStructPGrid *pgrid ); HYPRE_Int hypre_SStructPGridGetMaxBoxSize ( hypre_SStructPGrid *pgrid ); HYPRE_Int hypre_SStructGridRef ( hypre_SStructGrid *grid, hypre_SStructGrid **grid_ref ); HYPRE_Int hypre_SStructGridAssembleBoxManagers ( hypre_SStructGrid *grid ); HYPRE_Int hypre_SStructGridAssembleNborBoxManagers ( hypre_SStructGrid *grid ); HYPRE_Int hypre_SStructGridCreateCommInfo ( hypre_SStructGrid *grid ); HYPRE_Int hypre_SStructGridFindBoxManEntry ( hypre_SStructGrid *grid, HYPRE_Int part, hypre_Index index, HYPRE_Int var, hypre_BoxManEntry **entry_ptr ); HYPRE_Int hypre_SStructGridFindNborBoxManEntry ( hypre_SStructGrid *grid, HYPRE_Int part, hypre_Index index, HYPRE_Int var, hypre_BoxManEntry **entry_ptr ); HYPRE_Int hypre_SStructGridBoxProcFindBoxManEntry ( hypre_SStructGrid *grid, HYPRE_Int part, HYPRE_Int var, HYPRE_Int box, HYPRE_Int proc, hypre_BoxManEntry **entry_ptr ); HYPRE_Int hypre_SStructBoxManEntryGetCSRstrides ( hypre_BoxManEntry *entry, hypre_Index strides ); HYPRE_Int hypre_SStructBoxManEntryGetGhstrides ( hypre_BoxManEntry *entry, hypre_Index strides ); HYPRE_Int hypre_SStructBoxManEntryGetGlobalCSRank ( hypre_BoxManEntry *entry, hypre_Index index, HYPRE_BigInt *rank_ptr ); HYPRE_Int hypre_SStructBoxManEntryGetGlobalGhrank ( hypre_BoxManEntry *entry, hypre_Index index, HYPRE_BigInt *rank_ptr ); HYPRE_Int hypre_SStructBoxManEntryGetProcess ( hypre_BoxManEntry *entry, HYPRE_Int *proc_ptr ); HYPRE_Int hypre_SStructBoxManEntryGetBoxnum ( hypre_BoxManEntry *entry, HYPRE_Int *id_ptr ); HYPRE_Int hypre_SStructBoxManEntryGetPart ( hypre_BoxManEntry *entry, HYPRE_Int part, HYPRE_Int *part_ptr ); HYPRE_Int hypre_SStructIndexToNborIndex( hypre_Index index, hypre_Index root, hypre_Index nbor_root, hypre_Index coord, hypre_Index dir, HYPRE_Int ndim, hypre_Index nbor_index ); HYPRE_Int hypre_SStructBoxToNborBox ( hypre_Box *box, hypre_Index root, hypre_Index nbor_root, hypre_Index coord, hypre_Index dir ); HYPRE_Int hypre_SStructNborIndexToIndex( hypre_Index nbor_index, hypre_Index root, hypre_Index nbor_root, hypre_Index coord, hypre_Index dir, HYPRE_Int ndim, hypre_Index index ); HYPRE_Int hypre_SStructNborBoxToBox ( hypre_Box *nbor_box, hypre_Index root, hypre_Index nbor_root, hypre_Index coord, hypre_Index dir ); HYPRE_Int hypre_SStructVarToNborVar ( hypre_SStructGrid *grid, HYPRE_Int part, HYPRE_Int var, HYPRE_Int *coord, HYPRE_Int *nbor_var_ptr ); HYPRE_Int hypre_SStructGridSetNumGhost ( hypre_SStructGrid *grid, HYPRE_Int *num_ghost ); HYPRE_Int hypre_SStructBoxManEntryGetGlobalRank ( hypre_BoxManEntry *entry, hypre_Index index, HYPRE_BigInt *rank_ptr, HYPRE_Int type ); HYPRE_Int hypre_SStructBoxManEntryGetStrides ( hypre_BoxManEntry *entry, hypre_Index strides, HYPRE_Int type ); HYPRE_Int hypre_SStructBoxNumMap ( hypre_SStructGrid *grid, HYPRE_Int part, HYPRE_Int boxnum, HYPRE_Int **num_varboxes_ptr, HYPRE_Int ***map_ptr ); HYPRE_Int hypre_SStructCellGridBoxNumMap ( hypre_SStructGrid *grid, HYPRE_Int part, HYPRE_Int ***num_varboxes_ptr, HYPRE_Int ****map_ptr ); HYPRE_Int hypre_SStructCellBoxToVarBox ( hypre_Box *box, hypre_Index offset, hypre_Index varoffset, HYPRE_Int *valid ); HYPRE_Int hypre_SStructGridIntersect ( hypre_SStructGrid *grid, HYPRE_Int part, HYPRE_Int var, hypre_Box *box, HYPRE_Int action, hypre_BoxManEntry ***entries_ptr, HYPRE_Int *nentries_ptr ); HYPRE_Int hypre_SStructGridGetMaxBoxSize ( hypre_SStructGrid *grid ); HYPRE_Int hypre_SStructGridPrint ( FILE *file, hypre_SStructGrid *grid ); HYPRE_Int hypre_SStructGridRead ( MPI_Comm comm, FILE *file, hypre_SStructGrid **grid_ptr ); /* sstruct_innerprod.c */ HYPRE_Int hypre_SStructPInnerProd ( hypre_SStructPVector *px, hypre_SStructPVector *py, HYPRE_Real *presult_ptr ); HYPRE_Int hypre_SStructInnerProd ( hypre_SStructVector *x, hypre_SStructVector *y, HYPRE_Real *result_ptr ); /* sstruct_matrix.c */ HYPRE_Int hypre_SStructPMatrixRef ( hypre_SStructPMatrix *matrix, hypre_SStructPMatrix **matrix_ref ); HYPRE_Int hypre_SStructPMatrixCreate ( MPI_Comm comm, hypre_SStructPGrid *pgrid, hypre_SStructStencil **stencils, hypre_SStructPMatrix **pmatrix_ptr ); HYPRE_Int hypre_SStructPMatrixDestroy ( hypre_SStructPMatrix *pmatrix ); HYPRE_Int hypre_SStructPMatrixInitialize ( hypre_SStructPMatrix *pmatrix ); HYPRE_Int hypre_SStructPMatrixSetValues ( hypre_SStructPMatrix *pmatrix, hypre_Index index, HYPRE_Int var, HYPRE_Int nentries, HYPRE_Int *entries, HYPRE_Complex *values, HYPRE_Int action ); HYPRE_Int hypre_SStructPMatrixSetBoxValues( hypre_SStructPMatrix *pmatrix, hypre_Box *set_box, HYPRE_Int var, HYPRE_Int nentries, HYPRE_Int *entries, hypre_Box *value_box, HYPRE_Complex *values, HYPRE_Int action ); HYPRE_Int hypre_SStructPMatrixAccumulate ( hypre_SStructPMatrix *pmatrix ); HYPRE_Int hypre_SStructPMatrixAssemble ( hypre_SStructPMatrix *pmatrix ); HYPRE_Int hypre_SStructPMatrixSetSymmetric ( hypre_SStructPMatrix *pmatrix, HYPRE_Int var, HYPRE_Int to_var, HYPRE_Int symmetric ); HYPRE_Int hypre_SStructPMatrixPrint ( const char *filename, hypre_SStructPMatrix *pmatrix, HYPRE_Int all ); HYPRE_Int hypre_SStructUMatrixInitialize ( hypre_SStructMatrix *matrix ); HYPRE_Int hypre_SStructUMatrixSetValues ( hypre_SStructMatrix *matrix, HYPRE_Int part, hypre_Index index, HYPRE_Int var, HYPRE_Int nentries, HYPRE_Int *entries, HYPRE_Complex *values, HYPRE_Int action ); HYPRE_Int hypre_SStructUMatrixSetBoxValues( hypre_SStructMatrix *matrix, HYPRE_Int part, hypre_Box *set_box, HYPRE_Int var, HYPRE_Int nentries, HYPRE_Int *entries, hypre_Box *value_box, HYPRE_Complex *values, HYPRE_Int action ); HYPRE_Int hypre_SStructUMatrixAssemble ( hypre_SStructMatrix *matrix ); HYPRE_Int hypre_SStructMatrixRef ( hypre_SStructMatrix *matrix, hypre_SStructMatrix **matrix_ref ); HYPRE_Int hypre_SStructMatrixSplitEntries ( hypre_SStructMatrix *matrix, HYPRE_Int part, HYPRE_Int var, HYPRE_Int nentries, HYPRE_Int *entries, HYPRE_Int *nSentries_ptr, HYPRE_Int **Sentries_ptr, HYPRE_Int *nUentries_ptr, HYPRE_Int **Uentries_ptr ); HYPRE_Int hypre_SStructMatrixSetValues ( HYPRE_SStructMatrix matrix, HYPRE_Int part, HYPRE_Int *index, HYPRE_Int var, HYPRE_Int nentries, HYPRE_Int *entries, HYPRE_Complex *values, HYPRE_Int action ); HYPRE_Int hypre_SStructMatrixSetBoxValues( HYPRE_SStructMatrix matrix, HYPRE_Int part, hypre_Box *set_box, HYPRE_Int var, HYPRE_Int nentries, HYPRE_Int *entries, hypre_Box *value_box, HYPRE_Complex *values, HYPRE_Int action ); HYPRE_Int hypre_SStructMatrixSetInterPartValues( HYPRE_SStructMatrix matrix, HYPRE_Int part, hypre_Box *set_box, HYPRE_Int var, HYPRE_Int nentries, HYPRE_Int *entries, hypre_Box *value_box, HYPRE_Complex *values, HYPRE_Int action ); HYPRE_MemoryLocation hypre_SStructMatrixMemoryLocation(hypre_SStructMatrix *matrix); /* sstruct_matvec.c */ HYPRE_Int hypre_SStructPMatvecCreate ( void **pmatvec_vdata_ptr ); HYPRE_Int hypre_SStructPMatvecSetup ( void *pmatvec_vdata, hypre_SStructPMatrix *pA, hypre_SStructPVector *px ); HYPRE_Int hypre_SStructPMatvecCompute ( void *pmatvec_vdata, HYPRE_Complex alpha, hypre_SStructPMatrix *pA, hypre_SStructPVector *px, HYPRE_Complex beta, hypre_SStructPVector *py ); HYPRE_Int hypre_SStructPMatvecDestroy ( void *pmatvec_vdata ); HYPRE_Int hypre_SStructPMatvec ( HYPRE_Complex alpha, hypre_SStructPMatrix *pA, hypre_SStructPVector *px, HYPRE_Complex beta, hypre_SStructPVector *py ); HYPRE_Int hypre_SStructMatvecCreate ( void **matvec_vdata_ptr ); HYPRE_Int hypre_SStructMatvecSetup ( void *matvec_vdata, hypre_SStructMatrix *A, hypre_SStructVector *x ); HYPRE_Int hypre_SStructMatvecCompute ( void *matvec_vdata, HYPRE_Complex alpha, hypre_SStructMatrix *A, hypre_SStructVector *x, HYPRE_Complex beta, hypre_SStructVector *y ); HYPRE_Int hypre_SStructMatvecDestroy ( void *matvec_vdata ); HYPRE_Int hypre_SStructMatvec ( HYPRE_Complex alpha, hypre_SStructMatrix *A, hypre_SStructVector *x, HYPRE_Complex beta, hypre_SStructVector *y ); /* sstruct_scale.c */ HYPRE_Int hypre_SStructPScale ( HYPRE_Complex alpha, hypre_SStructPVector *py ); HYPRE_Int hypre_SStructScale ( HYPRE_Complex alpha, hypre_SStructVector *y ); /* sstruct_stencil.c */ HYPRE_Int hypre_SStructStencilRef ( hypre_SStructStencil *stencil, hypre_SStructStencil **stencil_ref ); /* sstruct_vector.c */ HYPRE_Int hypre_SStructPVectorRef ( hypre_SStructPVector *vector, hypre_SStructPVector **vector_ref ); HYPRE_Int hypre_SStructPVectorCreate ( MPI_Comm comm, hypre_SStructPGrid *pgrid, hypre_SStructPVector **pvector_ptr ); HYPRE_Int hypre_SStructPVectorDestroy ( hypre_SStructPVector *pvector ); HYPRE_Int hypre_SStructPVectorInitialize ( hypre_SStructPVector *pvector ); HYPRE_Int hypre_SStructPVectorSetValues ( hypre_SStructPVector *pvector, hypre_Index index, HYPRE_Int var, HYPRE_Complex *value, HYPRE_Int action ); HYPRE_Int hypre_SStructPVectorSetBoxValues( hypre_SStructPVector *pvector, hypre_Box *set_box, HYPRE_Int var, hypre_Box *value_box, HYPRE_Complex *values, HYPRE_Int action ); HYPRE_Int hypre_SStructPVectorAccumulate ( hypre_SStructPVector *pvector ); HYPRE_Int hypre_SStructPVectorAssemble ( hypre_SStructPVector *pvector ); HYPRE_Int hypre_SStructPVectorGather ( hypre_SStructPVector *pvector ); HYPRE_Int hypre_SStructPVectorGetValues ( hypre_SStructPVector *pvector, hypre_Index index, HYPRE_Int var, HYPRE_Complex *value ); HYPRE_Int hypre_SStructPVectorGetBoxValues( hypre_SStructPVector *pvector, hypre_Box *set_box, HYPRE_Int var, hypre_Box *value_box, HYPRE_Complex *values ); HYPRE_Int hypre_SStructPVectorSetConstantValues ( hypre_SStructPVector *pvector, HYPRE_Complex value ); HYPRE_Int hypre_SStructPVectorPrint ( const char *filename, hypre_SStructPVector *pvector, HYPRE_Int all ); HYPRE_Int hypre_SStructVectorRef ( hypre_SStructVector *vector, hypre_SStructVector **vector_ref ); HYPRE_Int hypre_SStructVectorSetConstantValues ( hypre_SStructVector *vector, HYPRE_Complex value ); HYPRE_Int hypre_SStructVectorConvert ( hypre_SStructVector *vector, hypre_ParVector **parvector_ptr ); HYPRE_Int hypre_SStructVectorParConvert ( hypre_SStructVector *vector, hypre_ParVector **parvector_ptr ); HYPRE_Int hypre_SStructVectorRestore ( hypre_SStructVector *vector, hypre_ParVector *parvector ); HYPRE_Int hypre_SStructVectorParRestore ( hypre_SStructVector *vector, hypre_ParVector *parvector ); HYPRE_Int hypre_SStructPVectorInitializeShell ( hypre_SStructPVector *pvector ); HYPRE_Int hypre_SStructVectorInitializeShell ( hypre_SStructVector *vector ); HYPRE_Int hypre_SStructVectorClearGhostValues ( hypre_SStructVector *vector ); HYPRE_MemoryLocation hypre_SStructVectorMemoryLocation(hypre_SStructVector *vector); hypre-2.33.0/src/sstruct_mv/sstruct_axpy.c000066400000000000000000000046231477326011500206550ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * SStruct axpy routine * *****************************************************************************/ #include "_hypre_sstruct_mv.h" /*-------------------------------------------------------------------------- * hypre_SStructPAxpy *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SStructPAxpy( HYPRE_Complex alpha, hypre_SStructPVector *px, hypre_SStructPVector *py ) { HYPRE_Int nvars = hypre_SStructPVectorNVars(px); HYPRE_Int var; for (var = 0; var < nvars; var++) { hypre_StructAxpy(alpha, hypre_SStructPVectorSVector(px, var), hypre_SStructPVectorSVector(py, var)); } return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_SStructAxpy *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SStructAxpy( HYPRE_Complex alpha, hypre_SStructVector *x, hypre_SStructVector *y ) { HYPRE_Int nparts = hypre_SStructVectorNParts(x); HYPRE_Int part; HYPRE_Int x_object_type = hypre_SStructVectorObjectType(x); HYPRE_Int y_object_type = hypre_SStructVectorObjectType(y); if (x_object_type != y_object_type) { hypre_error_in_arg(2); hypre_error_in_arg(3); return hypre_error_flag; } if (x_object_type == HYPRE_SSTRUCT) { for (part = 0; part < nparts; part++) { hypre_SStructPAxpy(alpha, hypre_SStructVectorPVector(x, part), hypre_SStructVectorPVector(y, part)); } } else if (x_object_type == HYPRE_PARCSR) { hypre_ParVector *x_par; hypre_ParVector *y_par; hypre_SStructVectorConvert(x, &x_par); hypre_SStructVectorConvert(y, &y_par); hypre_ParVectorAxpy(alpha, x_par, y_par); } return hypre_error_flag; } hypre-2.33.0/src/sstruct_mv/sstruct_copy.c000066400000000000000000000061131477326011500206420ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * SStruct copy routine * *****************************************************************************/ #include "_hypre_sstruct_mv.h" /*-------------------------------------------------------------------------- * hypre_SStructPCopy *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SStructPCopy( hypre_SStructPVector *px, hypre_SStructPVector *py ) { HYPRE_Int nvars = hypre_SStructPVectorNVars(px); HYPRE_Int var; for (var = 0; var < nvars; var++) { hypre_StructCopy(hypre_SStructPVectorSVector(px, var), hypre_SStructPVectorSVector(py, var)); } return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_SStructPartialPCopy: Copy the components on only a subset of the * pgrid. For each box of an sgrid, an array of subboxes are copied. *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SStructPartialPCopy( hypre_SStructPVector *px, hypre_SStructPVector *py, hypre_BoxArrayArray **array_boxes ) { HYPRE_Int nvars = hypre_SStructPVectorNVars(px); hypre_BoxArrayArray *boxes; HYPRE_Int var; for (var = 0; var < nvars; var++) { boxes = array_boxes[var]; hypre_StructPartialCopy(hypre_SStructPVectorSVector(px, var), hypre_SStructPVectorSVector(py, var), boxes); } return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_SStructCopy *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SStructCopy( hypre_SStructVector *x, hypre_SStructVector *y ) { HYPRE_Int nparts = hypre_SStructVectorNParts(x); HYPRE_Int part; HYPRE_Int x_object_type = hypre_SStructVectorObjectType(x); HYPRE_Int y_object_type = hypre_SStructVectorObjectType(y); if (x_object_type != y_object_type) { hypre_error_in_arg(2); hypre_error_in_arg(3); return hypre_error_flag; } if (x_object_type == HYPRE_SSTRUCT) { for (part = 0; part < nparts; part++) { hypre_SStructPCopy(hypre_SStructVectorPVector(x, part), hypre_SStructVectorPVector(y, part)); } } else if (x_object_type == HYPRE_PARCSR) { hypre_ParVector *x_par; hypre_ParVector *y_par; hypre_SStructVectorConvert(x, &x_par); hypre_SStructVectorConvert(y, &y_par); hypre_ParVectorCopy(x_par, y_par); } return hypre_error_flag; } hypre-2.33.0/src/sstruct_mv/sstruct_graph.c000066400000000000000000000144051477326011500207740ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * Member functions for hypre_SStructGraph class. * *****************************************************************************/ #include "_hypre_sstruct_mv.h" /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SStructGraphRef( hypre_SStructGraph *graph, hypre_SStructGraph **graph_ref ) { hypre_SStructGraphRefCount(graph) ++; *graph_ref = graph; return hypre_error_flag; } /*-------------------------------------------------------------------------- * Uventries are stored in an array indexed via a local rank that comes from an * ordering of the local grid boxes with ghost zones added. Since a grid index * may intersect multiple grid boxes, the box with the smallest boxnum is used. * * RDF: Consider using another "local" BoxManager to optimize. *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SStructGraphGetUVEntryRank( hypre_SStructGraph *graph, HYPRE_Int part, HYPRE_Int var, hypre_Index index, HYPRE_BigInt *rank ) { HYPRE_Int ndim = hypre_SStructGraphNDim(graph); hypre_SStructGrid *grid = hypre_SStructGraphGrid(graph); hypre_SStructPGrid *pgrid = hypre_SStructGridPGrid(grid, part); hypre_StructGrid *sgrid = hypre_SStructPGridSGrid(pgrid, var); hypre_BoxArray *boxes = hypre_StructGridBoxes(sgrid); hypre_Box *box; HYPRE_Int i, d, vol, found; *rank = hypre_SStructGraphUVEOffset(graph, part, var); hypre_ForBoxI(i, boxes) { box = hypre_BoxArrayBox(boxes, i); found = 1; for (d = 0; d < ndim; d++) { if ( (hypre_IndexD(index, d) < (hypre_BoxIMinD(box, d) - 1)) || (hypre_IndexD(index, d) > (hypre_BoxIMaxD(box, d) + 1)) ) { /* not in this box */ found = 0; break; } } if (found) { vol = 0; for (d = (ndim - 1); d > -1; d--) { vol = vol * (hypre_BoxSizeD(box, d) + 2) + (hypre_IndexD(index, d) - hypre_BoxIMinD(box, d) + 1); } *rank += (HYPRE_BigInt)vol; return hypre_error_flag; } else { vol = 1; for (d = 0; d < ndim; d++) { vol *= (hypre_BoxSizeD(box, d) + 2); } *rank += (HYPRE_BigInt)vol; } } /* a value of -1 indicates that the index was not found */ *rank = -1; return hypre_error_flag; } /*-------------------------------------------------------------------------- * Computes the local Uventries index for the endpt of a box. This index * can be used to localize a search for Uventries of a box. * endpt= 0 start of boxes * endpt= 1 end of boxes * 9/09 AB - modified to use the box manager *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SStructGraphFindBoxEndpt(hypre_SStructGraph *graph, HYPRE_Int part, HYPRE_Int var, HYPRE_Int proc, HYPRE_Int endpt, HYPRE_Int boxi) { hypre_SStructGrid *grid = hypre_SStructGraphGrid(graph); HYPRE_Int type = hypre_SStructGraphObjectType(graph); hypre_BoxManager *boxman; hypre_BoxManEntry *boxman_entry; hypre_StructGrid *sgrid; hypre_Box *box; HYPRE_BigInt rank; /* Should we be checking the neighbor box manager also ?*/ boxman = hypre_SStructGridBoxManager(grid, part, var); hypre_BoxManGetEntry(boxman, proc, boxi, &boxman_entry); sgrid = hypre_SStructPGridSGrid(hypre_SStructGridPGrid(grid, part), var); box = hypre_StructGridBox(sgrid, boxi); /* get the global rank of the endpt corner of box boxi */ if (endpt < 1) { hypre_SStructBoxManEntryGetGlobalRank( boxman_entry, hypre_BoxIMin(box), &rank, type); } else { hypre_SStructBoxManEntryGetGlobalRank( boxman_entry, hypre_BoxIMax(box), &rank, type); } if (type == HYPRE_SSTRUCT || type == HYPRE_STRUCT) { rank -= hypre_SStructGridGhstartRank(grid); } if (type == HYPRE_PARCSR) { rank -= hypre_SStructGridStartRank(grid); } return rank; } /*-------------------------------------------------------------------------- * Computes the local Uventries index for the start or end of each box of * a given sgrid. * endpt= 0 start of boxes * endpt= 1 end of boxes *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SStructGraphFindSGridEndpts(hypre_SStructGraph *graph, HYPRE_Int part, HYPRE_Int var, HYPRE_Int proc, HYPRE_Int endpt, HYPRE_Int *endpts) { hypre_SStructGrid *grid = hypre_SStructGraphGrid(graph); hypre_StructGrid *sgrid; hypre_BoxArray *boxes; HYPRE_Int i; sgrid = hypre_SStructPGridSGrid(hypre_SStructGridPGrid(grid, part), var); boxes = hypre_StructGridBoxes(sgrid); /* get the endpts using hypre_SStructGraphFindBoxEndpt */ for (i = 0; i < hypre_BoxArraySize(boxes); i++) { endpts[i] = hypre_SStructGraphFindBoxEndpt(graph, part, var, proc, endpt, i); } return hypre_error_flag; } hypre-2.33.0/src/sstruct_mv/sstruct_graph.h000066400000000000000000000167321477326011500210060ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * Header info for the hypre_SStructGraph structures * *****************************************************************************/ #ifndef hypre_SSTRUCT_GRAPH_HEADER #define hypre_SSTRUCT_GRAPH_HEADER /*-------------------------------------------------------------------------- * hypre_SStructGraph: *--------------------------------------------------------------------------*/ typedef struct { HYPRE_Int part; hypre_Index index; HYPRE_Int var; HYPRE_Int to_part; hypre_Index to_index; HYPRE_Int to_var; } hypre_SStructGraphEntry; typedef struct { HYPRE_Int to_part; hypre_Index to_index; HYPRE_Int to_var; HYPRE_Int to_boxnum; /* local box number */ HYPRE_Int to_proc; HYPRE_Int to_rank; } hypre_SStructUEntry; typedef struct { HYPRE_Int part; hypre_Index index; HYPRE_Int var; HYPRE_Int rank; HYPRE_Int nUentries; hypre_SStructUEntry *Uentries; } hypre_SStructUVEntry; typedef struct hypre_SStructGraph_struct { MPI_Comm comm; HYPRE_Int ndim; hypre_SStructGrid *grid; hypre_SStructGrid *domain_grid; /* same as grid by default */ HYPRE_Int nparts; hypre_SStructPGrid **pgrids; hypre_SStructStencil ***stencils; /* each (part, var) has a stencil */ /* info for fem-based user input */ HYPRE_Int *fem_nsparse; HYPRE_Int **fem_sparse_i; HYPRE_Int **fem_sparse_j; HYPRE_Int **fem_entries; /* U-graph info: Entries are referenced via a local rank that comes from an * ordering of the local grid boxes with ghost zones added. */ HYPRE_Int nUventries; /* number of Uventries */ HYPRE_Int *iUventries; /* rank indexes into Uventries */ hypre_SStructUVEntry **Uventries; HYPRE_Int Uvesize; /* size of Uventries array */ HYPRE_Int Uemaxsize; /* max size of Uentries */ HYPRE_BigInt **Uveoffsets; /* offsets for computing rank indexes */ HYPRE_Int ref_count; HYPRE_Int type; /* GEC0203 */ /* These are created in GraphAddEntries() then deleted in GraphAssemble() */ hypre_SStructGraphEntry **graph_entries; HYPRE_Int n_graph_entries; /* number graph entries */ HYPRE_Int a_graph_entries; /* alloced graph entries */ } hypre_SStructGraph; /*-------------------------------------------------------------------------- * Accessor macros: hypre_SStructGraph *--------------------------------------------------------------------------*/ #define hypre_SStructGraphComm(graph) ((graph) -> comm) #define hypre_SStructGraphNDim(graph) ((graph) -> ndim) #define hypre_SStructGraphGrid(graph) ((graph) -> grid) #define hypre_SStructGraphDomainGrid(graph) ((graph) -> domain_grid) #define hypre_SStructGraphNParts(graph) ((graph) -> nparts) #define hypre_SStructGraphPGrids(graph) \ hypre_SStructGridPGrids(hypre_SStructGraphGrid(graph)) #define hypre_SStructGraphPGrid(graph, p) \ hypre_SStructGridPGrid(hypre_SStructGraphGrid(graph), p) #define hypre_SStructGraphStencils(graph) ((graph) -> stencils) #define hypre_SStructGraphStencil(graph, p, v) ((graph) -> stencils[p][v]) #define hypre_SStructGraphFEMNSparse(graph) ((graph) -> fem_nsparse) #define hypre_SStructGraphFEMSparseI(graph) ((graph) -> fem_sparse_i) #define hypre_SStructGraphFEMSparseJ(graph) ((graph) -> fem_sparse_j) #define hypre_SStructGraphFEMEntries(graph) ((graph) -> fem_entries) #define hypre_SStructGraphFEMPNSparse(graph, p) ((graph) -> fem_nsparse[p]) #define hypre_SStructGraphFEMPSparseI(graph, p) ((graph) -> fem_sparse_i[p]) #define hypre_SStructGraphFEMPSparseJ(graph, p) ((graph) -> fem_sparse_j[p]) #define hypre_SStructGraphFEMPEntries(graph, p) ((graph) -> fem_entries[p]) #define hypre_SStructGraphNUVEntries(graph) ((graph) -> nUventries) #define hypre_SStructGraphIUVEntries(graph) ((graph) -> iUventries) #define hypre_SStructGraphIUVEntry(graph, i) ((graph) -> iUventries[i]) #define hypre_SStructGraphUVEntries(graph) ((graph) -> Uventries) #define hypre_SStructGraphUVEntry(graph, i) ((graph) -> Uventries[i]) #define hypre_SStructGraphUVESize(graph) ((graph) -> Uvesize) #define hypre_SStructGraphUEMaxSize(graph) ((graph) -> Uemaxsize) #define hypre_SStructGraphUVEOffsets(graph) ((graph) -> Uveoffsets) #define hypre_SStructGraphUVEOffset(graph, p, v)((graph) -> Uveoffsets[p][v]) #define hypre_SStructGraphRefCount(graph) ((graph) -> ref_count) #define hypre_SStructGraphObjectType(graph) ((graph) -> type) #define hypre_SStructGraphEntries(graph) ((graph) -> graph_entries) #define hypre_SStructNGraphEntries(graph) ((graph) -> n_graph_entries) #define hypre_SStructAGraphEntries(graph) ((graph) -> a_graph_entries) /*-------------------------------------------------------------------------- * Accessor macros: hypre_SStructUVEntry *--------------------------------------------------------------------------*/ #define hypre_SStructUVEntryPart(Uv) ((Uv) -> part) #define hypre_SStructUVEntryIndex(Uv) ((Uv) -> index) #define hypre_SStructUVEntryVar(Uv) ((Uv) -> var) #define hypre_SStructUVEntryRank(Uv) ((Uv) -> rank) #define hypre_SStructUVEntryNUEntries(Uv) ((Uv) -> nUentries) #define hypre_SStructUVEntryUEntries(Uv) ((Uv) -> Uentries) #define hypre_SStructUVEntryUEntry(Uv, i) &((Uv) -> Uentries[i]) #define hypre_SStructUVEntryToPart(Uv, i) ((Uv) -> Uentries[i].to_part) #define hypre_SStructUVEntryToIndex(Uv, i) ((Uv) -> Uentries[i].to_index) #define hypre_SStructUVEntryToVar(Uv, i) ((Uv) -> Uentries[i].to_var) #define hypre_SStructUVEntryToBoxnum(Uv, i) ((Uv) -> Uentries[i].to_boxnum) #define hypre_SStructUVEntryToProc(Uv, i) ((Uv) -> Uentries[i].to_proc) #define hypre_SStructUVEntryToRank(Uv, i) ((Uv) -> Uentries[i].to_rank) /*-------------------------------------------------------------------------- * Accessor macros: hypre_SStructUEntry *--------------------------------------------------------------------------*/ #define hypre_SStructUEntryToPart(U) ((U) -> to_part) #define hypre_SStructUEntryToIndex(U) ((U) -> to_index) #define hypre_SStructUEntryToVar(U) ((U) -> to_var) #define hypre_SStructUEntryToBoxnum(U) ((U) -> to_boxnum) #define hypre_SStructUEntryToProc(U) ((U) -> to_proc) #define hypre_SStructUEntryToRank(U) ((U) -> to_rank) /*-------------------------------------------------------------------------- * Accessor macros: hypre_SStructGraphEntry *--------------------------------------------------------------------------*/ #define hypre_SStructGraphEntryPart(g) ((g) -> part) #define hypre_SStructGraphEntryIndex(g) ((g) -> index) #define hypre_SStructGraphEntryVar(g) ((g) -> var) #define hypre_SStructGraphEntryToPart(g) ((g) -> to_part) #define hypre_SStructGraphEntryToIndex(g) ((g) -> to_index) #define hypre_SStructGraphEntryToVar(g) ((g) -> to_var) #endif hypre-2.33.0/src/sstruct_mv/sstruct_grid.c000066400000000000000000002674201477326011500206270ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * Member functions for hypre_SStructGrid class. * *****************************************************************************/ #include "_hypre_sstruct_mv.h" /*========================================================================== * SStructVariable routines *==========================================================================*/ /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ /* ONLY3D for non-cell and non-node variable types */ HYPRE_Int hypre_SStructVariableGetOffset( HYPRE_SStructVariable vartype, HYPRE_Int ndim, hypre_Index varoffset ) { HYPRE_Int d; switch (vartype) { case HYPRE_SSTRUCT_VARIABLE_CELL: hypre_SetIndex(varoffset, 0); break; case HYPRE_SSTRUCT_VARIABLE_NODE: hypre_SetIndex(varoffset, 1); break; case HYPRE_SSTRUCT_VARIABLE_XFACE: hypre_SetIndex3(varoffset, 1, 0, 0); break; case HYPRE_SSTRUCT_VARIABLE_YFACE: hypre_SetIndex3(varoffset, 0, 1, 0); break; case HYPRE_SSTRUCT_VARIABLE_ZFACE: hypre_SetIndex3(varoffset, 0, 0, 1); break; case HYPRE_SSTRUCT_VARIABLE_XEDGE: hypre_SetIndex3(varoffset, 0, 1, 1); break; case HYPRE_SSTRUCT_VARIABLE_YEDGE: hypre_SetIndex3(varoffset, 1, 0, 1); break; case HYPRE_SSTRUCT_VARIABLE_ZEDGE: hypre_SetIndex3(varoffset, 1, 1, 0); break; case HYPRE_SSTRUCT_VARIABLE_UNDEFINED: break; } for (d = ndim; d < HYPRE_MAXDIM; d++) { hypre_IndexD(varoffset, d) = 0; } return hypre_error_flag; } /*========================================================================== * SStructPGrid routines *==========================================================================*/ /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SStructPGridCreate( MPI_Comm comm, HYPRE_Int ndim, hypre_SStructPGrid **pgrid_ptr ) { hypre_SStructPGrid *pgrid; hypre_StructGrid *sgrid; HYPRE_Int t; pgrid = hypre_TAlloc(hypre_SStructPGrid, 1, HYPRE_MEMORY_HOST); hypre_SStructPGridComm(pgrid) = comm; hypre_SStructPGridNDim(pgrid) = ndim; hypre_SStructPGridNVars(pgrid) = 0; hypre_SStructPGridCellSGridDone(pgrid) = 0; hypre_SStructPGridVarTypes(pgrid) = NULL; for (t = 0; t < 8; t++) { hypre_SStructPGridVTSGrid(pgrid, t) = NULL; hypre_SStructPGridVTIBoxArray(pgrid, t) = NULL; } HYPRE_StructGridCreate(comm, ndim, &sgrid); hypre_SStructPGridCellSGrid(pgrid) = sgrid; hypre_SStructPGridPNeighbors(pgrid) = hypre_BoxArrayCreate(0, ndim); hypre_SStructPGridPNborOffsets(pgrid) = NULL; hypre_SStructPGridLocalSize(pgrid) = 0; hypre_SStructPGridGlobalSize(pgrid) = 0; /* GEC0902 ghost addition to the grid */ hypre_SStructPGridGhlocalSize(pgrid) = 0; hypre_SetIndex(hypre_SStructPGridPeriodic(pgrid), 0); *pgrid_ptr = pgrid; return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SStructPGridDestroy( hypre_SStructPGrid *pgrid ) { hypre_StructGrid **sgrids; hypre_BoxArray **iboxarrays; HYPRE_Int t; if (pgrid) { sgrids = hypre_SStructPGridSGrids(pgrid); iboxarrays = hypre_SStructPGridIBoxArrays(pgrid); hypre_TFree(hypre_SStructPGridVarTypes(pgrid), HYPRE_MEMORY_HOST); for (t = 0; t < 8; t++) { HYPRE_StructGridDestroy(sgrids[t]); hypre_BoxArrayDestroy(iboxarrays[t]); } hypre_BoxArrayDestroy(hypre_SStructPGridPNeighbors(pgrid)); hypre_TFree(hypre_SStructPGridPNborOffsets(pgrid), HYPRE_MEMORY_HOST); hypre_TFree(pgrid, HYPRE_MEMORY_HOST); } return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SStructPGridSetExtents( hypre_SStructPGrid *pgrid, hypre_Index ilower, hypre_Index iupper ) { hypre_StructGrid *sgrid = hypre_SStructPGridCellSGrid(pgrid); HYPRE_StructGridSetExtents(sgrid, ilower, iupper); return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SStructPGridSetCellSGrid( hypre_SStructPGrid *pgrid, hypre_StructGrid *cell_sgrid ) { hypre_SStructPGridCellSGrid(pgrid) = cell_sgrid; hypre_SStructPGridCellSGridDone(pgrid) = 1; return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SStructPGridSetVariables( hypre_SStructPGrid *pgrid, HYPRE_Int nvars, HYPRE_SStructVariable *vartypes ) { hypre_SStructVariable *new_vartypes; HYPRE_Int i; hypre_TFree(hypre_SStructPGridVarTypes(pgrid), HYPRE_MEMORY_HOST); new_vartypes = hypre_TAlloc(hypre_SStructVariable, nvars, HYPRE_MEMORY_HOST); for (i = 0; i < nvars; i++) { new_vartypes[i] = vartypes[i]; } hypre_SStructPGridNVars(pgrid) = nvars; hypre_SStructPGridVarTypes(pgrid) = new_vartypes; return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SStructPGridSetPNeighbor( hypre_SStructPGrid *pgrid, hypre_Box *pneighbor_box, hypre_Index pnbor_offset ) { hypre_BoxArray *pneighbors = hypre_SStructPGridPNeighbors(pgrid); hypre_Index *pnbor_offsets = hypre_SStructPGridPNborOffsets(pgrid); HYPRE_Int size = hypre_BoxArraySize(pneighbors); HYPRE_Int memchunk = 10; hypre_AppendBox(pneighbor_box, pneighbors); if ((size % memchunk) == 0) { pnbor_offsets = hypre_TReAlloc(pnbor_offsets, hypre_Index, (size + memchunk), HYPRE_MEMORY_HOST); hypre_SStructPGridPNborOffsets(pgrid) = pnbor_offsets; } hypre_CopyIndex(pnbor_offset, pnbor_offsets[size]); return hypre_error_flag; } /*-------------------------------------------------------------------------- * 11/06 AHB - modified to use the box manager *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SStructPGridAssemble( hypre_SStructPGrid *pgrid ) { MPI_Comm comm = hypre_SStructPGridComm(pgrid); HYPRE_Int ndim = hypre_SStructPGridNDim(pgrid); HYPRE_Int nvars = hypre_SStructPGridNVars(pgrid); HYPRE_SStructVariable *vartypes = hypre_SStructPGridVarTypes(pgrid); hypre_StructGrid **sgrids = hypre_SStructPGridSGrids(pgrid); hypre_BoxArray **iboxarrays = hypre_SStructPGridIBoxArrays(pgrid); hypre_BoxArray *pneighbors = hypre_SStructPGridPNeighbors(pgrid); hypre_Index *pnbor_offsets = hypre_SStructPGridPNborOffsets(pgrid); hypre_IndexRef periodic = hypre_SStructPGridPeriodic(pgrid); hypre_StructGrid *cell_sgrid; hypre_IndexRef cell_imax; hypre_StructGrid *sgrid; hypre_BoxArray *iboxarray; hypre_BoxManager *boxman; hypre_BoxArray *hood_boxes; HYPRE_Int hood_first_local; HYPRE_Int hood_num_local; hypre_BoxArray *nbor_boxes; hypre_BoxArray *diff_boxes; hypre_BoxArray *tmp_boxes; hypre_BoxArray *boxes; hypre_Box *box; hypre_Index varoffset; HYPRE_Int pneighbors_size, vneighbors_size; HYPRE_Int t, var, i, j, d, valid; /*------------------------------------------------------------- * set up the uniquely distributed sgrids for each vartype *-------------------------------------------------------------*/ cell_sgrid = hypre_SStructPGridCellSGrid(pgrid); HYPRE_StructGridSetPeriodic(cell_sgrid, periodic); if (!hypre_SStructPGridCellSGridDone(pgrid)) { HYPRE_StructGridAssemble(cell_sgrid); } /* this is used to truncate boxes when periodicity is on */ cell_imax = hypre_BoxIMax(hypre_StructGridBoundingBox(cell_sgrid)); /* get neighbor info from the struct grid box manager */ boxman = hypre_StructGridBoxMan(cell_sgrid); hood_boxes = hypre_BoxArrayCreate(0, ndim); hypre_BoxManGetAllEntriesBoxes(boxman, hood_boxes); hood_first_local = hypre_BoxManFirstLocal(boxman); hood_num_local = hypre_BoxManNumMyEntries(boxman); pneighbors_size = hypre_BoxArraySize(pneighbors); /* Add one since hood_first_local can be -1 */ nbor_boxes = hypre_BoxArrayCreate( pneighbors_size + hood_first_local + hood_num_local + 1, ndim); diff_boxes = hypre_BoxArrayCreate(0, ndim); tmp_boxes = hypre_BoxArrayCreate(0, ndim); for (var = 0; var < nvars; var++) { t = vartypes[var]; if ((t > 0) && (sgrids[t] == NULL)) { HYPRE_StructGridCreate(comm, ndim, &sgrid); hypre_StructGridSetNumGhost(sgrid, hypre_StructGridNumGhost(cell_sgrid)); boxes = hypre_BoxArrayCreate(0, ndim); hypre_SStructVariableGetOffset((hypre_SStructVariable) t, ndim, varoffset); /* create nbor_boxes for this variable type */ vneighbors_size = 0; for (i = 0; i < pneighbors_size; i++) { box = hypre_BoxArrayBox(nbor_boxes, vneighbors_size); hypre_CopyBox(hypre_BoxArrayBox(pneighbors, i), box); hypre_SStructCellBoxToVarBox(box, pnbor_offsets[i], varoffset, &valid); /* only add pneighbor boxes for valid variable types*/ if (valid) { vneighbors_size++; } } for (i = 0; i < (hood_first_local + hood_num_local); i++) { box = hypre_BoxArrayBox(nbor_boxes, vneighbors_size + i); hypre_CopyBox(hypre_BoxArrayBox(hood_boxes, i), box); hypre_SubtractIndexes(hypre_BoxIMin(box), varoffset, hypre_BoxNDim(box), hypre_BoxIMin(box)); } /* boxes = (local boxes - neighbors with smaller ID - vneighbors) */ for (i = 0; i < hood_num_local; i++) { j = vneighbors_size + hood_first_local + i; hypre_BoxArraySetSize(diff_boxes, 1); hypre_CopyBox(hypre_BoxArrayBox(nbor_boxes, j), hypre_BoxArrayBox(diff_boxes, 0)); hypre_BoxArraySetSize(nbor_boxes, j); hypre_SubtractBoxArrays(diff_boxes, nbor_boxes, tmp_boxes); hypre_AppendBoxArray(diff_boxes, boxes); } /* truncate if necessary when periodic */ for (d = 0; d < ndim; d++) { if (hypre_IndexD(periodic, d) && hypre_IndexD(varoffset, d)) { hypre_ForBoxI(i, boxes) { box = hypre_BoxArrayBox(boxes, i); if (hypre_BoxIMaxD(box, d) == hypre_IndexD(cell_imax, d)) { hypre_BoxIMaxD(box, d) --; } } } } HYPRE_StructGridSetPeriodic(sgrid, periodic); hypre_StructGridSetBoxes(sgrid, boxes); HYPRE_StructGridAssemble(sgrid); sgrids[t] = sgrid; } } hypre_BoxArrayDestroy(hood_boxes); hypre_BoxArrayDestroy(nbor_boxes); hypre_BoxArrayDestroy(diff_boxes); hypre_BoxArrayDestroy(tmp_boxes); /*------------------------------------------------------------- * compute iboxarrays *-------------------------------------------------------------*/ for (t = 0; t < 8; t++) { sgrid = sgrids[t]; if (sgrid != NULL) { iboxarray = hypre_BoxArrayDuplicate(hypre_StructGridBoxes(sgrid)); hypre_SStructVariableGetOffset((hypre_SStructVariable) t, ndim, varoffset); hypre_ForBoxI(i, iboxarray) { /* grow the boxes */ box = hypre_BoxArrayBox(iboxarray, i); hypre_BoxGrowByIndex(box, varoffset); } iboxarrays[t] = iboxarray; } } /*------------------------------------------------------------- * set up the size info * GEC0902 addition of the local ghost size for pgrid.At first pgridghlocalsize=0 *-------------------------------------------------------------*/ for (var = 0; var < nvars; var++) { sgrid = hypre_SStructPGridSGrid(pgrid, var); hypre_SStructPGridLocalSize(pgrid) += hypre_StructGridLocalSize(sgrid); hypre_SStructPGridGlobalSize(pgrid) += hypre_StructGridGlobalSize(sgrid); hypre_SStructPGridGhlocalSize(pgrid) += hypre_StructGridGhlocalSize(sgrid); } return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SStructPGridGetMaxBoxSize( hypre_SStructPGrid *pgrid ) { HYPRE_Int nvars = hypre_SStructPGridNVars(pgrid); HYPRE_Int var; hypre_StructGrid *sgrid; HYPRE_Int max_box_size = 0; for (var = 0; var < nvars; var++) { sgrid = hypre_SStructPGridSGrid(pgrid, var); max_box_size = hypre_max(max_box_size, hypre_StructGridGetMaxBoxSize(sgrid)); } return max_box_size; } /*========================================================================== * SStructGrid routines *==========================================================================*/ /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SStructGridRef( hypre_SStructGrid *grid, hypre_SStructGrid **grid_ref) { hypre_SStructGridRefCount(grid) ++; *grid_ref = grid; return hypre_error_flag; } /*-------------------------------------------------------------------------- * This replaces hypre_SStructGridAssembleMaps *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SStructGridAssembleBoxManagers( hypre_SStructGrid *grid ) { MPI_Comm comm = hypre_SStructGridComm(grid); HYPRE_Int ndim = hypre_SStructGridNDim(grid); HYPRE_Int nparts = hypre_SStructGridNParts(grid); HYPRE_BigInt local_size = (HYPRE_BigInt) hypre_SStructGridLocalSize(grid); hypre_BoxManager ***managers; hypre_SStructBoxManInfo info_obj; hypre_SStructPGrid *pgrid; HYPRE_Int nvars; hypre_StructGrid *sgrid; hypre_Box *bounding_box; HYPRE_BigInt offsets[2]; hypre_SStructBoxManInfo *entry_info; hypre_BoxManEntry *all_entries, *entry; HYPRE_Int num_entries; hypre_IndexRef entry_imin; hypre_IndexRef entry_imax; HYPRE_Int nprocs, myproc, proc; HYPRE_Int part, var, b, local_ct; hypre_Box *ghostbox, *box; HYPRE_Int * num_ghost; HYPRE_BigInt ghoffsets[2]; HYPRE_BigInt ghlocal_size = (HYPRE_BigInt) hypre_SStructGridGhlocalSize(grid); HYPRE_Int info_size; HYPRE_BigInt box_offset, ghbox_offset; /*------------------------------------------------------ * Build box manager info for grid boxes *------------------------------------------------------*/ hypre_MPI_Comm_size(comm, &nprocs); hypre_MPI_Comm_rank(comm, &myproc); /*find offset and ghost offsets */ { HYPRE_BigInt scan_recv; /* offsets */ hypre_MPI_Scan( &local_size, &scan_recv, 1, HYPRE_MPI_BIG_INT, hypre_MPI_SUM, comm); /* first point in my range */ offsets[0] = scan_recv - local_size; /* first point in next proc's range */ offsets[1] = scan_recv; hypre_SStructGridStartRank(grid) = offsets[0]; /* ghost offsets */ hypre_MPI_Scan( &ghlocal_size, &scan_recv, 1, HYPRE_MPI_BIG_INT, hypre_MPI_SUM, comm); /* first point in my range */ ghoffsets[0] = scan_recv - ghlocal_size; /* first point in next proc's range */ ghoffsets[1] = scan_recv; hypre_SStructGridGhstartRank(grid) = ghoffsets[0]; } /* allocate a box manager for each part and variable - copy the local box info from the underlying sgrid boxmanager*/ managers = hypre_TAlloc(hypre_BoxManager **, nparts, HYPRE_MEMORY_HOST); /* first offsets */ box_offset = offsets[0]; ghbox_offset = ghoffsets[0]; info_size = sizeof(hypre_SStructBoxManInfo); /* storage for the entry info is allocated and kept in the box manager - so here we just write over the info_obj and then it is copied in AddEntry */ entry_info = &info_obj; /* this is the same for all the info objects */ hypre_SStructBoxManInfoType(entry_info) = hypre_SSTRUCT_BOXMAN_INFO_DEFAULT; box = hypre_BoxCreate(ndim); ghostbox = hypre_BoxCreate(ndim); for (part = 0; part < nparts; part++) { pgrid = hypre_SStructGridPGrid(grid, part); nvars = hypre_SStructPGridNVars(pgrid); managers[part] = hypre_TAlloc(hypre_BoxManager *, nvars, HYPRE_MEMORY_HOST); for (var = 0; var < nvars; var++) { sgrid = hypre_SStructPGridSGrid(pgrid, var); /* get all the entires from the sgrid. for the local boxes, we will * calculate the info and add to the box manager - the rest we will * gather (because we cannot calculate the info for them) */ hypre_BoxManGetAllEntries(hypre_StructGridBoxMan(sgrid), &num_entries, &all_entries); bounding_box = hypre_StructGridBoundingBox(sgrid); /* need to create a box manager and then later give it the bounding box for gather entries call */ hypre_BoxManCreate( hypre_BoxManNumMyEntries(hypre_StructGridBoxMan(sgrid)), info_size, hypre_StructGridNDim(sgrid), bounding_box, hypre_StructGridComm(sgrid), &managers[part][var]); /* each sgrid has num_ghost */ num_ghost = hypre_StructGridNumGhost(sgrid); hypre_BoxManSetNumGhost(managers[part][var], num_ghost); /* loop through the all of the entries - for the local boxes * populate the info object and add to Box Manager- recall * that all of the boxes array belong to the calling proc */ local_ct = 0; for (b = 0; b < num_entries; b++) { entry = &all_entries[b]; proc = hypre_BoxManEntryProc(entry); entry_imin = hypre_BoxManEntryIMin(entry); entry_imax = hypre_BoxManEntryIMax(entry); hypre_BoxSetExtents( box, entry_imin, entry_imax ); if (proc == myproc) { hypre_SStructBoxManInfoOffset(entry_info) = box_offset; hypre_SStructBoxManInfoGhoffset(entry_info) = ghbox_offset; hypre_BoxManAddEntry(managers[part][var], entry_imin, entry_imax, myproc, local_ct, entry_info); /* update offset */ box_offset += hypre_BoxVolume(box); /* grow box to compute volume with ghost */ hypre_CopyBox(box, ghostbox); hypre_BoxGrowByArray(ghostbox, num_ghost); /* update offset */ ghbox_offset += hypre_BoxVolume(ghostbox); local_ct++; } else /* not a local box */ { hypre_BoxManGatherEntries(managers[part][var], entry_imin, entry_imax); } } /* call the assemble later */ } /* end of variable loop */ } /* end of part loop */ { /* need to do a gather entries on neighbor information so that we have what we need for the NborBoxManagers function */ /* these neighbor boxes are much larger than the data that we care about, so first we need to intersect them with the grid and just pass the intersected box into the Box Manager */ hypre_SStructNeighbor *vneighbor; HYPRE_Int b, i; hypre_Box *vbox; HYPRE_Int **nvneighbors = hypre_SStructGridNVNeighbors(grid); hypre_SStructNeighbor ***vneighbors = hypre_SStructGridVNeighbors(grid); HYPRE_Int *coord, *dir; hypre_Index imin0, imin1; HYPRE_Int nbor_part, nbor_var; hypre_IndexRef max_distance; hypre_Box *grow_box; hypre_Box *int_box; hypre_Box *nbor_box; hypre_BoxManager *box_man; hypre_BoxArray *local_boxes; grow_box = hypre_BoxCreate(ndim); int_box = hypre_BoxCreate(ndim); nbor_box = hypre_BoxCreate(ndim); local_boxes = hypre_BoxArrayCreate(0, ndim); for (part = 0; part < nparts; part++) { pgrid = hypre_SStructGridPGrid(grid, part); nvars = hypre_SStructPGridNVars(pgrid); for (var = 0; var < nvars; var++) { sgrid = hypre_SStructPGridSGrid(pgrid, var); max_distance = hypre_StructGridMaxDistance(sgrid); /* now loop through my boxes, grow them, and intersect with all of * the neighbors */ box_man = hypre_StructGridBoxMan(sgrid); hypre_BoxManGetLocalEntriesBoxes(box_man, local_boxes); hypre_ForBoxI(i, local_boxes) { hypre_CopyBox(hypre_BoxArrayBox(local_boxes, i), grow_box); hypre_BoxGrowByIndex(grow_box, max_distance); /* loop through neighbors */ for (b = 0; b < nvneighbors[part][var]; b++) { vneighbor = &vneighbors[part][var][b]; vbox = hypre_SStructNeighborBox(vneighbor); /* grow neighbor box by 1 to account for shared parts */ hypre_CopyBox(vbox, nbor_box); hypre_BoxGrowByValue(nbor_box, 1); nbor_part = hypre_SStructNeighborPart(vneighbor); coord = hypre_SStructNeighborCoord(vneighbor); dir = hypre_SStructNeighborDir(vneighbor); /* find intersection of neighbor and my local box */ hypre_IntersectBoxes(grow_box, nbor_box, int_box); if (hypre_BoxVolume(int_box) > 0) { hypre_CopyIndex(hypre_BoxIMin(vbox), imin0); hypre_CopyIndex(hypre_SStructNeighborILower(vneighbor), imin1); /* map int_box to neighbor part index space */ hypre_SStructBoxToNborBox(int_box, imin0, imin1, coord, dir); hypre_SStructVarToNborVar(grid, part, var, coord, &nbor_var); hypre_BoxManGatherEntries( managers[nbor_part][nbor_var], hypre_BoxIMin(int_box), hypre_BoxIMax(int_box)); } } /* end neighbor loop */ } /* end local box loop */ } } hypre_BoxDestroy(grow_box); hypre_BoxDestroy(int_box); hypre_BoxDestroy(nbor_box); hypre_BoxArrayDestroy(local_boxes); } /* now call the assembles */ for (part = 0; part < nparts; part++) { pgrid = hypre_SStructGridPGrid(grid, part); nvars = hypre_SStructPGridNVars(pgrid); for (var = 0; var < nvars; var++) { hypre_BoxManAssemble(managers[part][var]); } } hypre_BoxDestroy(ghostbox); hypre_BoxDestroy(box); hypre_SStructGridBoxManagers(grid) = managers; return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SStructGridAssembleNborBoxManagers( hypre_SStructGrid *grid ) { HYPRE_Int ndim = hypre_SStructGridNDim(grid); HYPRE_Int nparts = hypre_SStructGridNParts(grid); HYPRE_Int **nvneighbors = hypre_SStructGridNVNeighbors(grid); hypre_SStructNeighbor ***vneighbors = hypre_SStructGridVNeighbors(grid); hypre_SStructNeighbor *vneighbor; hypre_SStructPGrid *pgrid; HYPRE_Int nvars; hypre_StructGrid *sgrid; hypre_BoxManager ***nbor_managers; hypre_SStructBoxManNborInfo *nbor_info, *peri_info; hypre_SStructBoxManInfo *entry_info; hypre_BoxManEntry **entries, *all_entries, *entry; HYPRE_Int nentries; hypre_Box *nbor_box, *box, *int_box, *ghbox; HYPRE_Int *coord, *dir; hypre_Index imin0, imin1; HYPRE_BigInt nbor_offset, nbor_ghoffset; HYPRE_Int nbor_proc, nbor_boxnum, nbor_part, nbor_var; hypre_IndexRef pshift; HYPRE_Int num_periods, k; HYPRE_Int proc; hypre_Index nbor_ilower; HYPRE_Int c[HYPRE_MAXDIM], *num_ghost, *stride, *ghstride; HYPRE_Int part, var, b, i, d, info_size; hypre_Box *bounding_box; /*------------------------------------------------------ * Create a box manager for the neighbor boxes *------------------------------------------------------*/ bounding_box = hypre_BoxCreate(ndim); nbor_box = hypre_BoxCreate(ndim); box = hypre_BoxCreate(ndim); int_box = hypre_BoxCreate(ndim); ghbox = hypre_BoxCreate(ndim); /* nbor_info is copied into the box manager */ nbor_info = hypre_TAlloc(hypre_SStructBoxManNborInfo, 1, HYPRE_MEMORY_HOST); peri_info = hypre_CTAlloc(hypre_SStructBoxManNborInfo, 1, HYPRE_MEMORY_HOST); nbor_managers = hypre_TAlloc(hypre_BoxManager **, nparts, HYPRE_MEMORY_HOST); info_size = sizeof(hypre_SStructBoxManNborInfo); for (part = 0; part < nparts; part++) { pgrid = hypre_SStructGridPGrid(grid, part); nvars = hypre_SStructPGridNVars(pgrid); nbor_managers[part] = hypre_TAlloc(hypre_BoxManager *, nvars, HYPRE_MEMORY_HOST); for (var = 0; var < nvars; var++) { sgrid = hypre_SStructPGridSGrid(pgrid, var); hypre_CopyBox( hypre_StructGridBoundingBox(sgrid), bounding_box); /* The bounding_box is only needed if BoxManGatherEntries() is called, * but we don't gather anything currently for the neighbor boxman, so * the next bit of code is not needed right now. */ #if 0 { MPI_Comm comm = hypre_SStructGridComm(grid); hypre_Box *vbox; hypre_Index min_index, max_index; HYPRE_Int d; HYPRE_Int sendbuf6[2 * HYPRE_MAXDIM], recvbuf6[2 * HYPRE_MAXDIM]; hypre_CopyToCleanIndex( hypre_BoxIMin(bounding_box), ndim, min_index); hypre_CopyToCleanIndex( hypre_BoxIMax(bounding_box), ndim, max_index); for (b = 0; b < nvneighbors[part][var]; b++) { vneighbor = &vneighbors[part][var][b]; vbox = hypre_SStructNeighborBox(vneighbor); /* find min and max box extents */ for (d = 0; d < ndim; d++) { hypre_IndexD(min_index, d) = hypre_min(hypre_IndexD(min_index, d), hypre_BoxIMinD(vbox, d)); hypre_IndexD(max_index, d) = hypre_max(hypre_IndexD(max_index, d), hypre_BoxIMaxD(vbox, d)); } } /* this is based on local info - all procs need to have * the same bounding box! */ hypre_BoxSetExtents( bounding_box, min_index, max_index); /* communication needed for the bounding box */ /* pack buffer */ for (d = 0; d < ndim; d++) { sendbuf6[d] = hypre_BoxIMinD(bounding_box, d); sendbuf6[d + ndim] = -hypre_BoxIMaxD(bounding_box, d); } hypre_MPI_Allreduce( sendbuf6, recvbuf6, 2 * ndim, HYPRE_MPI_INT, hypre_MPI_MIN, comm); /* unpack buffer */ for (d = 0; d < ndim; d++) { hypre_BoxIMinD(bounding_box, d) = recvbuf6[d]; hypre_BoxIMaxD(bounding_box, d) = -recvbuf6[d + ndim]; } } #endif /* Here we want to create a new manager for the neighbor information * (instead of adding to the current and reassembling). This uses a * lower bound for the actual box manager size. */ hypre_BoxManCreate(nvneighbors[part][var], info_size, ndim, hypre_StructGridBoundingBox(sgrid), hypre_StructGridComm(sgrid), &nbor_managers[part][var]); /* Compute entries and add to the neighbor box manager */ for (b = 0; b < nvneighbors[part][var]; b++) { vneighbor = &vneighbors[part][var][b]; hypre_CopyBox(hypre_SStructNeighborBox(vneighbor), nbor_box); nbor_part = hypre_SStructNeighborPart(vneighbor); hypre_CopyIndex(hypre_BoxIMin(hypre_SStructNeighborBox(vneighbor)), imin0); hypre_CopyIndex(hypre_SStructNeighborILower(vneighbor), imin1); coord = hypre_SStructNeighborCoord(vneighbor); dir = hypre_SStructNeighborDir(vneighbor); /* Intersect neighbor boxes with appropriate PGrid */ /* map to neighbor part index space */ hypre_SStructBoxToNborBox(nbor_box, imin0, imin1, coord, dir); hypre_SStructVarToNborVar(grid, part, var, coord, &nbor_var); hypre_SStructGridIntersect(grid, nbor_part, nbor_var, nbor_box, 0, &entries, &nentries); for (i = 0; i < nentries; i++) { hypre_BoxManEntryGetExtents(entries[i], hypre_BoxIMin(box), hypre_BoxIMax(box)); hypre_IntersectBoxes(nbor_box, box, int_box); /* map back from neighbor part index space */ hypre_SStructNborBoxToBox(int_box, imin0, imin1, coord, dir); hypre_SStructIndexToNborIndex( hypre_BoxIMin(int_box), imin0, imin1, coord, dir, ndim, nbor_ilower); hypre_SStructBoxManEntryGetProcess(entries[i], &nbor_proc); hypre_SStructBoxManEntryGetBoxnum(entries[i], &nbor_boxnum); hypre_SStructBoxManEntryGetGlobalCSRank(entries[i], nbor_ilower, &nbor_offset); hypre_SStructBoxManEntryGetGlobalGhrank(entries[i], nbor_ilower, &nbor_ghoffset); num_ghost = hypre_BoxManEntryNumGhost(entries[i]); /* Set up the neighbor info. */ hypre_SStructBoxManInfoType(nbor_info) = hypre_SSTRUCT_BOXMAN_INFO_NEIGHBOR; hypre_SStructBoxManInfoOffset(nbor_info) = nbor_offset; hypre_SStructBoxManInfoGhoffset(nbor_info) = nbor_ghoffset; hypre_SStructBoxManNborInfoProc(nbor_info) = nbor_proc; hypre_SStructBoxManNborInfoBoxnum(nbor_info) = nbor_boxnum; hypre_SStructBoxManNborInfoPart(nbor_info) = nbor_part; hypre_CopyIndex(nbor_ilower, hypre_SStructBoxManNborInfoILower(nbor_info)); hypre_CopyIndex(coord, hypre_SStructBoxManNborInfoCoord(nbor_info)); hypre_CopyIndex(dir, hypre_SStructBoxManNborInfoDir(nbor_info)); /* This computes strides in the local index-space, so they * may be negative. Want `c' to map from the neighbor * index-space back. */ for (d = 0; d < ndim; d++) { c[coord[d]] = d; } hypre_CopyBox(box, ghbox); hypre_BoxGrowByArray(ghbox, num_ghost); stride = hypre_SStructBoxManNborInfoStride(nbor_info); ghstride = hypre_SStructBoxManNborInfoGhstride(nbor_info); stride[c[0]] = 1; ghstride[c[0]] = 1; for (d = 1; d < ndim; d++) { stride[c[d]] = hypre_BoxSizeD(box, d - 1) * stride[c[d - 1]]; ghstride[c[d]] = hypre_BoxSizeD(ghbox, d - 1) * ghstride[c[d - 1]]; } for (d = 0; d < ndim; d++) { stride[c[d]] *= dir[c[d]]; ghstride[c[d]] *= dir[c[d]]; } /* Here the ids need to be unique. Cannot use the boxnum. A negative number lets the box manager assign the id. */ hypre_BoxManAddEntry(nbor_managers[part][var], hypre_BoxIMin(int_box), hypre_BoxIMax(int_box), nbor_proc, -1, nbor_info); } /* end of entries loop */ hypre_TFree(entries, HYPRE_MEMORY_HOST); } /* end of vneighbor box loop */ /* RDF: Add periodic boxes to the neighbor box managers. * * Compute a local bounding box and grow by max_distance, shift the * boxman boxes (local and non-local to allow for periodicity of a box * with itself) and intersect them with the grown local bounding box. * If there is a nonzero intersection, add the shifted box to the * neighbor boxman. The only reason for doing the intersect is to * reduce the number of boxes that we add. */ num_periods = hypre_StructGridNumPeriods(sgrid); if ((num_periods > 1) && (hypre_StructGridNumBoxes(sgrid))) { hypre_BoxArray *boxes = hypre_StructGridBoxes(sgrid); /* Compute a local bounding box */ hypre_CopyBox(hypre_BoxArrayBox(boxes, 0), bounding_box); hypre_ForBoxI(i, boxes) { for (d = 0; d < hypre_StructGridNDim(sgrid); d++) { hypre_BoxIMinD(bounding_box, d) = hypre_min(hypre_BoxIMinD(bounding_box, d), hypre_BoxIMinD(hypre_BoxArrayBox(boxes, i), d)); hypre_BoxIMaxD(bounding_box, d) = hypre_max(hypre_BoxIMaxD(bounding_box, d), hypre_BoxIMaxD(hypre_BoxArrayBox(boxes, i), d)); } } /* Grow the bounding box by max_distance */ hypre_BoxGrowByIndex(bounding_box, hypre_StructGridMaxDistance(sgrid)); hypre_BoxManGetAllEntries(hypre_SStructGridBoxManager(grid, part, var), &nentries, &all_entries); for (b = 0; b < nentries; b++) { entry = &all_entries[b]; proc = hypre_BoxManEntryProc(entry); hypre_BoxManEntryGetInfo(entry, (void **) &entry_info); hypre_SStructBoxManInfoType(peri_info) = hypre_SStructBoxManInfoType(entry_info); hypre_SStructBoxManInfoOffset(peri_info) = hypre_SStructBoxManInfoOffset(entry_info); hypre_SStructBoxManInfoGhoffset(peri_info) = hypre_SStructBoxManInfoGhoffset(entry_info); for (k = 1; k < num_periods; k++) /* k = 0 is original box */ { pshift = hypre_StructGridPShift(sgrid, k); hypre_BoxSetExtents(box, hypre_BoxManEntryIMin(entry), hypre_BoxManEntryIMax(entry)); hypre_BoxShiftPos(box, pshift); hypre_IntersectBoxes(box, bounding_box, int_box); if (hypre_BoxVolume(int_box) > 0) { hypre_BoxManAddEntry(nbor_managers[part][var], hypre_BoxIMin(box), hypre_BoxIMax(box), proc, -1, peri_info); } } } } hypre_BoxManAssemble(nbor_managers[part][var]); } /* end of variables loop */ } /* end of part loop */ hypre_SStructGridNborBoxManagers(grid) = nbor_managers; hypre_TFree(nbor_info, HYPRE_MEMORY_HOST); hypre_TFree(peri_info, HYPRE_MEMORY_HOST); hypre_BoxDestroy(nbor_box); hypre_BoxDestroy(box); hypre_BoxDestroy(int_box); hypre_BoxDestroy(ghbox); hypre_BoxDestroy(bounding_box); return hypre_error_flag; } /*-------------------------------------------------------------------------- * This routine computes the inter-part communication information for updating * shared variable data. * * It grows each local box according to vartype and intersects with the BoxManager * to get map entries. Then, for each of the neighbor-type entries, it grows * either the local box or the neighbor box based on which one is the "owner" * (the part number determines this). * * NEW Approach * * Loop over the vneighbor boxes. Let pi = my part and pj = vneighbor part. * The part with the smaller ID owns the data, so (pi < pj) means that shared * vneighbor data overlaps with pi's data and pj's ghost, and (pi > pj) means * that shared vneighbor data overlaps with pj's data and pi's ghost. * * Intersect each vneighbor box with the BoxManager for the owner part (either * pi or pj) and intersect a grown vneighbor box with the BoxManager for the * non-owner part. This produces two lists of boxes on the two different parts * that share data. The remainder of the routine loops over these two lists, * intersecting the boxes appropriately with the vneighbor box to determine send * and receive communication info. For convenience, the information is put into * a 4D "matrix" based on pi, pj, vi (variable on part pi), and vj. The upper * "triangle" (given by pi < pj) stores the send information and the lower * triangle stores the receive information. * *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SStructGridCreateCommInfo( hypre_SStructGrid *grid ) { HYPRE_Int ndim = hypre_SStructGridNDim(grid); HYPRE_Int nparts = hypre_SStructGridNParts(grid); hypre_SStructPGrid **pgrids = hypre_SStructGridPGrids(grid); HYPRE_Int **nvneighbors = hypre_SStructGridNVNeighbors(grid); hypre_SStructNeighbor ***vneighbors = hypre_SStructGridVNeighbors(grid); hypre_SStructNeighbor *vneighbor; hypre_SStructCommInfo **vnbor_comm_info; HYPRE_Int vnbor_ncomms; hypre_SStructCommInfo *comm_info; HYPRE_SStructVariable *vartypes; hypre_Index varoffset; typedef struct { hypre_BoxArrayArray *boxes; hypre_BoxArrayArray *rboxes; HYPRE_Int **procs; HYPRE_Int **rboxnums; HYPRE_Int **transforms; HYPRE_Int *num_transforms; /* reference to num transforms */ hypre_Index *coords; hypre_Index *dirs; } CInfo; hypre_IndexRef coord, dir; CInfo **cinfo_a; /* array of size (nparts^2)(maxvars^2) */ CInfo *cinfo, *send_cinfo, *recv_cinfo; HYPRE_Int cinfoi, cinfoj, maxvars; hypre_BoxArray *cbox_a; hypre_BoxArray *crbox_a; HYPRE_Int *cproc_a; HYPRE_Int *crboxnum_a; HYPRE_Int *ctransform_a; HYPRE_Int *cnum_transforms; hypre_Index *ccoords; hypre_Index *cdirs; hypre_SStructPGrid *pgrid; hypre_BoxManEntry **pi_entries, **pj_entries; hypre_BoxManEntry *pi_entry, *pj_entry; HYPRE_Int npi_entries, npj_entries; hypre_Box *vn_box, *pi_box, *pj_box, *int_box, *int_rbox; hypre_Index imin0, imin1; HYPRE_Int nvars, size, pi_proc, myproc; HYPRE_Int pi, pj, vi, vj, ei, ej, ni, bi, ti; hypre_MPI_Comm_rank(hypre_SStructGridComm(grid), &myproc); vn_box = hypre_BoxCreate(ndim); pi_box = hypre_BoxCreate(ndim); pj_box = hypre_BoxCreate(ndim); int_box = hypre_BoxCreate(ndim); int_rbox = hypre_BoxCreate(ndim); /* initialize cinfo_a array */ maxvars = 0; for (pi = 0; pi < nparts; pi++) { nvars = hypre_SStructPGridNVars(pgrids[pi]); if ( maxvars < nvars ) { maxvars = nvars; } } cinfo_a = hypre_CTAlloc(CInfo *, nparts * nparts * maxvars * maxvars, HYPRE_MEMORY_HOST); /* loop over local boxes and compute send/recv CommInfo */ vnbor_ncomms = 0; /* for each part */ for (pi = 0; pi < nparts; pi++) { pgrid = pgrids[pi]; nvars = hypre_SStructPGridNVars(pgrid); vartypes = hypre_SStructPGridVarTypes(pgrid); /* for each variable */ for (vi = 0; vi < nvars; vi++) { hypre_SStructVariableGetOffset(vartypes[vi], ndim, varoffset); /* for each vneighbor box */ for (ni = 0; ni < nvneighbors[pi][vi]; ni++) { vneighbor = &vneighbors[pi][vi][ni]; hypre_CopyIndex(hypre_BoxIMin(hypre_SStructNeighborBox(vneighbor)), imin0); hypre_CopyIndex(hypre_SStructNeighborILower(vneighbor), imin1); coord = hypre_SStructNeighborCoord(vneighbor); dir = hypre_SStructNeighborDir(vneighbor); pj = hypre_SStructNeighborPart(vneighbor); hypre_SStructVarToNborVar(grid, pi, vi, coord, &vj); /* intersect with grid for part pi */ hypre_CopyBox(hypre_SStructNeighborBox(vneighbor), vn_box); /* always grow the vneighbor box */ hypre_BoxGrowByIndex(vn_box, varoffset); hypre_SStructGridIntersect(grid, pi, vi, vn_box, 0, &pi_entries, &npi_entries); /* intersect with grid for part pj */ hypre_CopyBox(hypre_SStructNeighborBox(vneighbor), vn_box); /* always grow the vneighbor box */ hypre_BoxGrowByIndex(vn_box, varoffset); /* map vneighbor box to part pj index space */ hypre_SStructBoxToNborBox(vn_box, imin0, imin1, coord, dir); hypre_SStructGridIntersect(grid, pj, vj, vn_box, 0, &pj_entries, &npj_entries); /* loop over pi and pj entries */ for (ei = 0; ei < npi_entries; ei++) { pi_entry = pi_entries[ei]; /* only concerned with pi boxes on my processor */ hypre_SStructBoxManEntryGetProcess(pi_entry, &pi_proc); if (pi_proc != myproc) { continue; } hypre_BoxManEntryGetExtents( pi_entry, hypre_BoxIMin(pi_box), hypre_BoxIMax(pi_box)); /* if pi is not the owner, grow pi_box to compute recv boxes */ if (pi > pj) { hypre_BoxGrowByIndex(pi_box, varoffset); } for (ej = 0; ej < npj_entries; ej++) { pj_entry = pj_entries[ej]; hypre_BoxManEntryGetExtents( pj_entry, hypre_BoxIMin(pj_box), hypre_BoxIMax(pj_box)); /* map pj_box to part pi index space */ hypre_SStructNborBoxToBox(pj_box, imin0, imin1, coord, dir); /* if pj is not the owner, grow pj_box to compute send boxes */ if (pj > pi) { hypre_BoxGrowByIndex(pj_box, varoffset); } /* intersect the pi and pj boxes */ hypre_IntersectBoxes(pi_box, pj_box, int_box); /* if there is an intersection, compute communication info */ if (hypre_BoxVolume(int_box)) { cinfoi = (((pi) * maxvars + vi) * nparts + pj) * maxvars + vj; cinfoj = (((pj) * maxvars + vj) * nparts + pi) * maxvars + vi; /* allocate CommInfo arguments if needed */ if (cinfo_a[cinfoi] == NULL) { HYPRE_Int i_num_boxes = hypre_StructGridNumBoxes( hypre_SStructPGridSGrid(pgrids[pi], vi)); HYPRE_Int j_num_boxes = hypre_StructGridNumBoxes( hypre_SStructPGridSGrid(pgrids[pj], vj)); cnum_transforms = hypre_CTAlloc(HYPRE_Int, 1, HYPRE_MEMORY_HOST); ccoords = hypre_CTAlloc(hypre_Index, nvneighbors[pi][vi], HYPRE_MEMORY_HOST); cdirs = hypre_CTAlloc(hypre_Index, nvneighbors[pi][vi], HYPRE_MEMORY_HOST); cinfo = hypre_TAlloc(CInfo, 1, HYPRE_MEMORY_HOST); (cinfo->boxes) = hypre_BoxArrayArrayCreate(i_num_boxes, ndim); (cinfo->rboxes) = hypre_BoxArrayArrayCreate(i_num_boxes, ndim); (cinfo->procs) = hypre_CTAlloc(HYPRE_Int *, i_num_boxes, HYPRE_MEMORY_HOST); (cinfo->rboxnums) = hypre_CTAlloc(HYPRE_Int *, i_num_boxes, HYPRE_MEMORY_HOST); (cinfo->transforms) = hypre_CTAlloc(HYPRE_Int *, i_num_boxes, HYPRE_MEMORY_HOST); (cinfo->num_transforms) = cnum_transforms; (cinfo->coords) = ccoords; (cinfo->dirs) = cdirs; cinfo_a[cinfoi] = cinfo; cinfo = hypre_TAlloc(CInfo, 1, HYPRE_MEMORY_HOST); (cinfo->boxes) = hypre_BoxArrayArrayCreate(j_num_boxes, ndim); (cinfo->rboxes) = hypre_BoxArrayArrayCreate(j_num_boxes, ndim); (cinfo->procs) = hypre_CTAlloc(HYPRE_Int *, j_num_boxes, HYPRE_MEMORY_HOST); (cinfo->rboxnums) = hypre_CTAlloc(HYPRE_Int *, j_num_boxes, HYPRE_MEMORY_HOST); (cinfo->transforms) = hypre_CTAlloc(HYPRE_Int *, j_num_boxes, HYPRE_MEMORY_HOST); (cinfo->num_transforms) = cnum_transforms; (cinfo->coords) = ccoords; (cinfo->dirs) = cdirs; cinfo_a[cinfoj] = cinfo; vnbor_ncomms++; } cinfo = cinfo_a[cinfoi]; hypre_SStructBoxManEntryGetBoxnum(pi_entry, &bi); cbox_a = hypre_BoxArrayArrayBoxArray((cinfo->boxes), bi); crbox_a = hypre_BoxArrayArrayBoxArray((cinfo->rboxes), bi); /* Since cinfo is unique for each (pi,vi,pj,vj), we can use * the remote (proc, boxnum) to determine duplicates */ { HYPRE_Int j, proc, boxnum, duplicate = 0; hypre_SStructBoxManEntryGetProcess(pj_entry, &proc); hypre_SStructBoxManEntryGetBoxnum(pj_entry, &boxnum); cproc_a = (cinfo->procs[bi]); crboxnum_a = (cinfo->rboxnums[bi]); hypre_ForBoxI(j, cbox_a) { if ( (proc == cproc_a[j]) && (boxnum == crboxnum_a[j]) ) { duplicate = 1; } } if (duplicate) { continue; } } size = hypre_BoxArraySize(cbox_a); /* Allocate in chunks of 10 ('size' grows by 1) */ if (size % 10 == 0) { (cinfo->procs[bi]) = hypre_TReAlloc((cinfo->procs[bi]), HYPRE_Int, size + 10, HYPRE_MEMORY_HOST); (cinfo->rboxnums[bi]) = hypre_TReAlloc((cinfo->rboxnums[bi]), HYPRE_Int, size + 10, HYPRE_MEMORY_HOST); (cinfo->transforms[bi]) = hypre_TReAlloc((cinfo->transforms[bi]), HYPRE_Int, size + 10, HYPRE_MEMORY_HOST); } cproc_a = (cinfo->procs[bi]); crboxnum_a = (cinfo->rboxnums[bi]); ctransform_a = (cinfo->transforms[bi]); cnum_transforms = (cinfo->num_transforms); ccoords = (cinfo->coords); cdirs = (cinfo->dirs); /* map intersection box to part pj index space */ hypre_CopyBox(int_box, int_rbox); hypre_SStructBoxToNborBox(int_rbox, imin0, imin1, coord, dir); hypre_AppendBox(int_box, cbox_a); hypre_AppendBox(int_rbox, crbox_a); hypre_SStructBoxManEntryGetProcess(pj_entry, &cproc_a[size]); hypre_SStructBoxManEntryGetBoxnum(pj_entry, &crboxnum_a[size]); /* search for transform */ for (ti = 0; ti < *cnum_transforms; ti++) { if ( hypre_IndexesEqual(coord, ccoords[ti], ndim) && hypre_IndexesEqual(dir, cdirs[ti], ndim) ) { break; } } /* set transform */ if (ti >= *cnum_transforms) { hypre_CopyIndex(coord, ccoords[ti]); hypre_CopyIndex(dir, cdirs[ti]); (*cnum_transforms)++; } ctransform_a[size] = ti; } /* end of if intersection box */ } /* end of ej entries loop */ } /* end of ei entries loop */ hypre_TFree(pj_entries, HYPRE_MEMORY_HOST); hypre_TFree(pi_entries, HYPRE_MEMORY_HOST); } /* end of ni vneighbor box loop */ } /* end of vi variable loop */ } /* end of pi part loop */ /* loop through the upper triangle and create vnbor_comm_info */ vnbor_comm_info = hypre_TAlloc(hypre_SStructCommInfo *, vnbor_ncomms, HYPRE_MEMORY_HOST); vnbor_ncomms = 0; for (pi = 0; pi < nparts; pi++) { for (vi = 0; vi < maxvars; vi++) { for (pj = (pi + 1); pj < nparts; pj++) { for (vj = 0; vj < maxvars; vj++) { cinfoi = (((pi) * maxvars + vi) * nparts + pj) * maxvars + vj; if (cinfo_a[cinfoi] != NULL) { comm_info = hypre_TAlloc(hypre_SStructCommInfo, 1, HYPRE_MEMORY_HOST); cinfoj = (((pj) * maxvars + vj) * nparts + pi) * maxvars + vi; send_cinfo = cinfo_a[cinfoi]; recv_cinfo = cinfo_a[cinfoj]; /* send/recv boxes may not match (2nd to last argument) */ hypre_CommInfoCreate( (send_cinfo->boxes), (recv_cinfo->boxes), (send_cinfo->procs), (recv_cinfo->procs), (send_cinfo->rboxnums), (recv_cinfo->rboxnums), (send_cinfo->rboxes), (recv_cinfo->rboxes), 0, &hypre_SStructCommInfoCommInfo(comm_info)); hypre_CommInfoSetTransforms( hypre_SStructCommInfoCommInfo(comm_info), *(send_cinfo->num_transforms), (send_cinfo->coords), (send_cinfo->dirs), (send_cinfo->transforms), (recv_cinfo->transforms)); hypre_TFree(send_cinfo->num_transforms, HYPRE_MEMORY_HOST); hypre_SStructCommInfoSendPart(comm_info) = pi; hypre_SStructCommInfoRecvPart(comm_info) = pj; hypre_SStructCommInfoSendVar(comm_info) = vi; hypre_SStructCommInfoRecvVar(comm_info) = vj; vnbor_comm_info[vnbor_ncomms] = comm_info; #if 0 { /* debugging print */ hypre_BoxArrayArray *boxaa; hypre_BoxArray *boxa; hypre_Box *box; HYPRE_Int i, j, d, **procs, **rboxs; boxaa = (comm_info->comm_info->send_boxes); procs = (comm_info->comm_info->send_processes); rboxs = (comm_info->comm_info->send_rboxnums); hypre_ForBoxArrayI(i, boxaa) { hypre_printf("%d: (pi,vi:pj,vj) = (%d,%d:%d,%d), ncomm = %d, send box = %d, (proc,rbox: ...) =", myproc, pi, vi, pj, vj, vnbor_ncomms, i); boxa = hypre_BoxArrayArrayBoxArray(boxaa, i); hypre_ForBoxI(j, boxa) { box = hypre_BoxArrayBox(boxa, j); hypre_printf(" (%d,%d: ", procs[i][j], rboxs[i][j]); for (d = 0; d < ndim; d++) { hypre_printf(" %d", hypre_BoxIMinD(box, d)); } hypre_printf(" x"); for (d = 0; d < ndim; d++) { hypre_printf(" %d", hypre_BoxIMaxD(box, d)); } hypre_printf(")"); } hypre_printf("\n"); } boxaa = (comm_info->comm_info->recv_boxes); procs = (comm_info->comm_info->recv_processes); rboxs = (comm_info->comm_info->recv_rboxnums); hypre_ForBoxArrayI(i, boxaa) { hypre_printf("%d: (pi,vi:pj,vj) = (%d,%d:%d,%d), ncomm = %d, recv box = %d, (proc,rbox: ...) =", myproc, pi, vi, pj, vj, vnbor_ncomms, i); boxa = hypre_BoxArrayArrayBoxArray(boxaa, i); hypre_ForBoxI(j, boxa) { box = hypre_BoxArrayBox(boxa, j); hypre_printf(" (%d,%d: ", procs[i][j], rboxs[i][j]); for (d = 0; d < ndim; d++) { hypre_printf(" %d", hypre_BoxIMinD(box, d)); } hypre_printf(" x"); for (d = 0; d < ndim; d++) { hypre_printf(" %d", hypre_BoxIMaxD(box, d)); } hypre_printf(")"); } hypre_printf("\n"); } fflush(stdout); } #endif vnbor_ncomms++; } } } } } hypre_SStructGridVNborCommInfo(grid) = vnbor_comm_info; hypre_SStructGridVNborNComms(grid) = vnbor_ncomms; size = nparts * nparts * maxvars * maxvars; for (cinfoi = 0; cinfoi < size; cinfoi++) { hypre_TFree(cinfo_a[cinfoi], HYPRE_MEMORY_HOST); } hypre_TFree(cinfo_a, HYPRE_MEMORY_HOST); hypre_BoxDestroy(vn_box); hypre_BoxDestroy(pi_box); hypre_BoxDestroy(pj_box); hypre_BoxDestroy(int_box); hypre_BoxDestroy(int_rbox); return hypre_error_flag; } /*-------------------------------------------------------------------------- * This routine returns a NULL 'entry_ptr' if an entry is not found *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SStructGridFindBoxManEntry( hypre_SStructGrid *grid, HYPRE_Int part, hypre_Index index, HYPRE_Int var, hypre_BoxManEntry **entry_ptr ) { HYPRE_Int nentries; hypre_BoxManEntry **entries; hypre_BoxManIntersect ( hypre_SStructGridBoxManager(grid, part, var), index, index, &entries, &nentries); /* we should only get a single entry returned */ if (nentries > 1) { hypre_error(HYPRE_ERROR_GENERIC); *entry_ptr = NULL; } else if (nentries == 0) { *entry_ptr = NULL; } else { *entry_ptr = entries[0]; } /* remove the entries array (NULL or allocated in the intersect routine) */ hypre_TFree(entries, HYPRE_MEMORY_HOST); return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SStructGridFindNborBoxManEntry( hypre_SStructGrid *grid, HYPRE_Int part, hypre_Index index, HYPRE_Int var, hypre_BoxManEntry **entry_ptr ) { HYPRE_Int nentries; hypre_BoxManEntry **entries; hypre_BoxManIntersect ( hypre_SStructGridNborBoxManager(grid, part, var), index, index, &entries, &nentries); /* we should only get a single entry returned */ if (nentries > 1) { hypre_error(HYPRE_ERROR_GENERIC); *entry_ptr = NULL; } else if (nentries == 0) { *entry_ptr = NULL; } else { *entry_ptr = entries[0]; } /* remove the entries array (NULL or allocated in the intersect routine) */ hypre_TFree(entries, HYPRE_MEMORY_HOST); return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SStructGridBoxProcFindBoxManEntry( hypre_SStructGrid *grid, HYPRE_Int part, HYPRE_Int var, HYPRE_Int box, HYPRE_Int proc, hypre_BoxManEntry **entry_ptr ) { hypre_BoxManGetEntry(hypre_SStructGridBoxManager(grid, part, var), proc, box, entry_ptr); return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SStructBoxManEntryGetCSRstrides( hypre_BoxManEntry *entry, hypre_Index strides ) { hypre_SStructBoxManInfo *entry_info; hypre_BoxManEntryGetInfo(entry, (void **) &entry_info); if (hypre_SStructBoxManInfoType(entry_info) == hypre_SSTRUCT_BOXMAN_INFO_DEFAULT) { HYPRE_Int d, ndim = hypre_BoxManEntryNDim(entry); hypre_Index imin; hypre_Index imax; hypre_BoxManEntryGetExtents(entry, imin, imax); strides[0] = 1; for (d = 1; d < ndim; d++) { strides[d] = hypre_IndexD(imax, d - 1) - hypre_IndexD(imin, d - 1) + 1; strides[d] *= strides[d - 1]; } } else { hypre_SStructBoxManNborInfo *entry_ninfo; entry_ninfo = (hypre_SStructBoxManNborInfo *) entry_info; hypre_CopyIndex(hypre_SStructBoxManNborInfoStride(entry_ninfo), strides); } return hypre_error_flag; } /*-------------------------------------------------------------------------- * GEC1002 addition for a ghost stride calculation * same function except that you modify imin, imax with the ghost and * when the info is type nmapinfo you pull the ghoststrides. *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SStructBoxManEntryGetGhstrides( hypre_BoxManEntry *entry, hypre_Index strides ) { hypre_SStructBoxManInfo *entry_info; HYPRE_Int *numghost; hypre_BoxManEntryGetInfo(entry, (void **) &entry_info); if (hypre_SStructBoxManInfoType(entry_info) == hypre_SSTRUCT_BOXMAN_INFO_DEFAULT) { HYPRE_Int d, ndim = hypre_BoxManEntryNDim(entry); hypre_Index imin; hypre_Index imax; hypre_BoxManEntryGetExtents(entry, imin, imax); /* getting the ghost from the mapentry to modify imin, imax */ numghost = hypre_BoxManEntryNumGhost(entry); for (d = 0; d < ndim; d++) { imax[d] += numghost[2 * d + 1]; imin[d] -= numghost[2 * d]; } /* imin, imax modified now and calculation identical. */ strides[0] = 1; for (d = 1; d < ndim; d++) { strides[d] = hypre_IndexD(imax, d - 1) - hypre_IndexD(imin, d - 1) + 1; strides[d] *= strides[d - 1]; } } else { hypre_SStructBoxManNborInfo *entry_ninfo; /* now get the ghost strides using the macro */ entry_ninfo = (hypre_SStructBoxManNborInfo *) entry_info; hypre_CopyIndex(hypre_SStructBoxManNborInfoGhstride(entry_ninfo), strides); } return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SStructBoxManEntryGetGlobalCSRank( hypre_BoxManEntry *entry, hypre_Index index, HYPRE_BigInt *rank_ptr ) { HYPRE_Int ndim = hypre_BoxManEntryNDim(entry); hypre_SStructBoxManInfo *entry_info; hypre_Index imin; hypre_Index imax; hypre_Index strides; HYPRE_BigInt offset; HYPRE_Int d; hypre_BoxManEntryGetInfo(entry, (void **) &entry_info); hypre_BoxManEntryGetExtents(entry, imin, imax); offset = hypre_SStructBoxManInfoOffset(entry_info); hypre_SStructBoxManEntryGetCSRstrides(entry, strides); *rank_ptr = offset; for (d = 0; d < ndim; d++) { *rank_ptr += (HYPRE_BigInt)((hypre_IndexD(index, d) - hypre_IndexD(imin, d)) * strides[d]); } return hypre_error_flag; } /*-------------------------------------------------------------------------- * GEC1002 a way to get the rank when you are in the presence of ghosts * It could have been a function pointer but this is safer. It computes * the ghost rank by using ghoffset, ghstrides and imin is modified *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SStructBoxManEntryGetGlobalGhrank( hypre_BoxManEntry *entry, hypre_Index index, HYPRE_BigInt *rank_ptr ) { HYPRE_Int ndim = hypre_BoxManEntryNDim(entry); hypre_SStructBoxManInfo *entry_info; hypre_Index imin; hypre_Index imax; hypre_Index ghstrides; HYPRE_BigInt ghoffset; HYPRE_Int *numghost = hypre_BoxManEntryNumGhost(entry); HYPRE_Int d; HYPRE_Int info_type; hypre_BoxManEntryGetInfo(entry, (void **) &entry_info); hypre_BoxManEntryGetExtents(entry, imin, imax); ghoffset = hypre_SStructBoxManInfoGhoffset(entry_info); info_type = hypre_SStructBoxManInfoType(entry_info); hypre_SStructBoxManEntryGetGhstrides(entry, ghstrides); /* GEC shifting the imin according to the ghosts when you have a default info * When you have a neighbor info, you do not need to shift the imin since * the ghoffset for neighbor info has factored in the ghost presence during * the neighbor info assemble phase */ if (info_type == hypre_SSTRUCT_BOXMAN_INFO_DEFAULT) { for (d = 0; d < ndim; d++) { imin[d] -= numghost[2 * d]; } } *rank_ptr = ghoffset; for (d = 0; d < ndim; d++) { *rank_ptr += (HYPRE_BigInt)((hypre_IndexD(index, d) - hypre_IndexD(imin, d)) * ghstrides[d]); } return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SStructBoxManEntryGetProcess( hypre_BoxManEntry *entry, HYPRE_Int *proc_ptr ) { *proc_ptr = hypre_BoxManEntryProc(entry); return hypre_error_flag; } /*-------------------------------------------------------------------------- * For neighbors, the boxnum is in the info, otherwise it is the same * as the id. *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SStructBoxManEntryGetBoxnum( hypre_BoxManEntry *entry, HYPRE_Int *id_ptr ) { hypre_SStructBoxManNborInfo *info; hypre_BoxManEntryGetInfo(entry, (void **) &info); if (hypre_SStructBoxManInfoType(info) == hypre_SSTRUCT_BOXMAN_INFO_NEIGHBOR) /* get from the info object */ { *id_ptr = hypre_SStructBoxManNborInfoBoxnum(info); } else /* use id from the entry */ { *id_ptr = hypre_BoxManEntryId(entry); } return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SStructBoxManEntryGetPart( hypre_BoxManEntry *entry, HYPRE_Int part, HYPRE_Int *part_ptr ) { hypre_SStructBoxManNborInfo *info; hypre_BoxManEntryGetInfo(entry, (void **) &info); if (hypre_SStructBoxManInfoType(info) == hypre_SSTRUCT_BOXMAN_INFO_NEIGHBOR) { *part_ptr = hypre_SStructBoxManNborInfoPart(info); } else { *part_ptr = part; } return hypre_error_flag; } /*-------------------------------------------------------------------------- * Mapping Notes: * * coord maps Box index-space to NborBox index-space. That is, `coord[d]' is * the dimension in the NborBox index-space, and `d' is the dimension in the * Box index-space. * * dir also works on the Box index-space. That is, `dir[d]' is the direction * (positive or negative) of dimension `coord[d]' in the NborBox index-space, * relative to the positive direction of dimension `d' in the Box index-space. * *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SStructIndexToNborIndex( hypre_Index index, hypre_Index root, hypre_Index nbor_root, hypre_Index coord, hypre_Index dir, HYPRE_Int ndim, hypre_Index nbor_index ) { HYPRE_Int d, nd; for (d = 0; d < ndim; d++) { nd = coord[d]; nbor_index[nd] = nbor_root[nd] + (index[d] - root[d]) * dir[d]; } return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SStructBoxToNborBox( hypre_Box *box, hypre_Index root, hypre_Index nbor_root, hypre_Index coord, hypre_Index dir ) { HYPRE_Int *imin = hypre_BoxIMin(box); HYPRE_Int *imax = hypre_BoxIMax(box); HYPRE_Int ndim = hypre_BoxNDim(box); hypre_Index nbor_imin, nbor_imax; HYPRE_Int d; hypre_SStructIndexToNborIndex(imin, root, nbor_root, coord, dir, ndim, nbor_imin); hypre_SStructIndexToNborIndex(imax, root, nbor_root, coord, dir, ndim, nbor_imax); for (d = 0; d < ndim; d++) { imin[d] = hypre_min(nbor_imin[d], nbor_imax[d]); imax[d] = hypre_max(nbor_imin[d], nbor_imax[d]); } return hypre_error_flag; } /*-------------------------------------------------------------------------- * See "Mapping Notes" in comment for `hypre_SStructBoxToNborBox'. *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SStructNborIndexToIndex( hypre_Index nbor_index, hypre_Index root, hypre_Index nbor_root, hypre_Index coord, hypre_Index dir, HYPRE_Int ndim, hypre_Index index ) { HYPRE_Int d, nd; for (d = 0; d < ndim; d++) { nd = coord[d]; index[d] = root[d] + (nbor_index[nd] - nbor_root[nd]) * dir[d]; } return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SStructNborBoxToBox( hypre_Box *nbor_box, hypre_Index root, hypre_Index nbor_root, hypre_Index coord, hypre_Index dir ) { HYPRE_Int *nbor_imin = hypre_BoxIMin(nbor_box); HYPRE_Int *nbor_imax = hypre_BoxIMax(nbor_box); HYPRE_Int ndim = hypre_BoxNDim(nbor_box); hypre_Index imin, imax; HYPRE_Int d; hypre_SStructNborIndexToIndex(nbor_imin, root, nbor_root, coord, dir, ndim, imin); hypre_SStructNborIndexToIndex(nbor_imax, root, nbor_root, coord, dir, ndim, imax); for (d = 0; d < ndim; d++) { nbor_imin[d] = hypre_min(imin[d], imax[d]); nbor_imax[d] = hypre_max(imin[d], imax[d]); } return hypre_error_flag; } /*-------------------------------------------------------------------------- * * Assumptions: * * 1. Variables and variable types are the same on neighboring parts * 2. Variable types are listed in order as follows: * Face - XFACE, YFACE, ZFACE * Edge - XEDGE, YEDGE, ZEDGE * 3. If the coordinate transformation is not the identity, then all ndim * variable types must exist on the grid. * *--------------------------------------------------------------------------*/ /* ONLY3D for non-cell and non-node variable types */ HYPRE_Int hypre_SStructVarToNborVar( hypre_SStructGrid *grid, HYPRE_Int part, HYPRE_Int var, HYPRE_Int *coord, HYPRE_Int *nbor_var_ptr) { hypre_SStructPGrid *pgrid = hypre_SStructGridPGrid(grid, part); HYPRE_SStructVariable vartype = hypre_SStructPGridVarType(pgrid, var); switch (vartype) { case HYPRE_SSTRUCT_VARIABLE_XFACE: case HYPRE_SSTRUCT_VARIABLE_XEDGE: *nbor_var_ptr = var + (coord[0] ); break; case HYPRE_SSTRUCT_VARIABLE_YFACE: case HYPRE_SSTRUCT_VARIABLE_YEDGE: *nbor_var_ptr = var + (coord[1] - 1); break; case HYPRE_SSTRUCT_VARIABLE_ZFACE: case HYPRE_SSTRUCT_VARIABLE_ZEDGE: *nbor_var_ptr = var + (coord[2] - 2); break; default: *nbor_var_ptr = var; break; } return hypre_error_flag; } /*-------------------------------------------------------------------------- * GEC0902 a function that will set the ghost in each of the sgrids *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SStructGridSetNumGhost( hypre_SStructGrid *grid, HYPRE_Int *num_ghost ) { HYPRE_Int ndim = hypre_SStructGridNDim(grid); HYPRE_Int nparts = hypre_SStructGridNParts(grid); HYPRE_Int part, i, t; hypre_SStructPGrid *pgrid; hypre_StructGrid *sgrid; for (i = 0; i < 2 * ndim; i++) { hypre_SStructGridNumGhost(grid)[i] = num_ghost[i]; } for (part = 0; part < nparts; part++) { pgrid = hypre_SStructGridPGrid(grid, part); for (t = 0; t < 8; t++) { sgrid = hypre_SStructPGridVTSGrid(pgrid, t); if (sgrid != NULL) { hypre_StructGridSetNumGhost(sgrid, num_ghost); } } } return hypre_error_flag; } /*-------------------------------------------------------------------------- * GEC1002 a function that will select the right way to calculate the rank * depending on the matrix type. It is an extension to the usual GetGlobalRank *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SStructBoxManEntryGetGlobalRank( hypre_BoxManEntry *entry, hypre_Index index, HYPRE_BigInt *rank_ptr, HYPRE_Int type) { if (type == HYPRE_PARCSR) { hypre_SStructBoxManEntryGetGlobalCSRank(entry, index, rank_ptr); } if (type == HYPRE_SSTRUCT || type == HYPRE_STRUCT) { hypre_SStructBoxManEntryGetGlobalGhrank(entry, index, rank_ptr); } return hypre_error_flag; } /*-------------------------------------------------------------------------- * GEC1002 a function that will select the right way to calculate the strides * depending on the matrix type. It is an extension to the usual strides *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SStructBoxManEntryGetStrides(hypre_BoxManEntry *entry, hypre_Index strides, HYPRE_Int type) { if (type == HYPRE_PARCSR) { hypre_SStructBoxManEntryGetCSRstrides(entry, strides); } if (type == HYPRE_SSTRUCT || type == HYPRE_STRUCT) { hypre_SStructBoxManEntryGetGhstrides(entry, strides); } return hypre_error_flag; } /*-------------------------------------------------------------------------- * A function to determine the local variable box numbers that underlie * a cellbox with local box number boxnum. Only returns local box numbers * of myproc. *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SStructBoxNumMap(hypre_SStructGrid *grid, HYPRE_Int part, HYPRE_Int boxnum, HYPRE_Int **num_varboxes_ptr, HYPRE_Int ***map_ptr) { hypre_SStructPGrid *pgrid = hypre_SStructGridPGrid(grid, part); hypre_StructGrid *cellgrid = hypre_SStructPGridCellSGrid(pgrid); hypre_StructGrid *vargrid; hypre_BoxArray *boxes; hypre_Box *cellbox, vbox, *box, intersect_box; HYPRE_SStructVariable *vartypes = hypre_SStructPGridVarTypes(pgrid); HYPRE_Int ndim = hypre_SStructGridNDim(grid); HYPRE_Int nvars = hypre_SStructPGridNVars(pgrid); hypre_Index varoffset; HYPRE_Int *num_boxes; HYPRE_Int **var_boxnums; HYPRE_Int *temp; HYPRE_Int i, j, k, var; hypre_BoxInit(&vbox, ndim); hypre_BoxInit(&intersect_box, ndim); cellbox = hypre_StructGridBox(cellgrid, boxnum); /* ptrs to store var_box map info */ num_boxes = hypre_CTAlloc(HYPRE_Int, nvars, HYPRE_MEMORY_HOST); var_boxnums = hypre_TAlloc(HYPRE_Int *, nvars, HYPRE_MEMORY_HOST); /* intersect the cellbox with the var_boxes */ for (var = 0; var < nvars; var++) { vargrid = hypre_SStructPGridSGrid(pgrid, var); boxes = hypre_StructGridBoxes(vargrid); temp = hypre_CTAlloc(HYPRE_Int, hypre_BoxArraySize(boxes), HYPRE_MEMORY_HOST); /* map cellbox to a variable box */ hypre_CopyBox(cellbox, &vbox); i = vartypes[var]; hypre_SStructVariableGetOffset((hypre_SStructVariable) i, ndim, varoffset); hypre_SubtractIndexes(hypre_BoxIMin(&vbox), varoffset, ndim, hypre_BoxIMin(&vbox)); /* loop over boxes to see if they intersect with vbox */ hypre_ForBoxI(i, boxes) { box = hypre_BoxArrayBox(boxes, i); hypre_IntersectBoxes(&vbox, box, &intersect_box); if (hypre_BoxVolume(&intersect_box)) { temp[i]++; num_boxes[var]++; } } /* record local var box numbers */ if (num_boxes[var]) { var_boxnums[var] = hypre_TAlloc(HYPRE_Int, num_boxes[var], HYPRE_MEMORY_HOST); } else { var_boxnums[var] = NULL; } j = 0; k = hypre_BoxArraySize(boxes); for (i = 0; i < k; i++) { if (temp[i]) { var_boxnums[var][j] = i; j++; } } hypre_TFree(temp, HYPRE_MEMORY_HOST); } /* for (var= 0; var< nvars; var++) */ *num_varboxes_ptr = num_boxes; *map_ptr = var_boxnums; return hypre_error_flag; } /*-------------------------------------------------------------------------- * A function to extract all the local var box numbers underlying the * cellgrid boxes. *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SStructCellGridBoxNumMap(hypre_SStructGrid *grid, HYPRE_Int part, HYPRE_Int ***num_varboxes_ptr, HYPRE_Int ****map_ptr) { hypre_SStructPGrid *pgrid = hypre_SStructGridPGrid(grid, part); hypre_StructGrid *cellgrid = hypre_SStructPGridCellSGrid(pgrid); hypre_BoxArray *cellboxes = hypre_StructGridBoxes(cellgrid); HYPRE_Int **num_boxes; HYPRE_Int ***var_boxnums; HYPRE_Int i, ncellboxes; ncellboxes = hypre_BoxArraySize(cellboxes); num_boxes = hypre_TAlloc(HYPRE_Int *, ncellboxes, HYPRE_MEMORY_HOST); var_boxnums = hypre_TAlloc(HYPRE_Int **, ncellboxes, HYPRE_MEMORY_HOST); hypre_ForBoxI(i, cellboxes) { hypre_SStructBoxNumMap(grid, part, i, &num_boxes[i], &var_boxnums[i]); } *num_varboxes_ptr = num_boxes; *map_ptr = var_boxnums; return hypre_error_flag; } /*-------------------------------------------------------------------------- * Converts a cell-based box with offset to a variable-based box. The argument * valid is a boolean that specifies the status of the conversion. *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SStructCellBoxToVarBox( hypre_Box *box, hypre_Index offset, hypre_Index varoffset, HYPRE_Int *valid ) { hypre_IndexRef imin = hypre_BoxIMin(box); hypre_IndexRef imax = hypre_BoxIMax(box); HYPRE_Int ndim = hypre_BoxNDim(box); HYPRE_Int d, off; *valid = 1; for (d = 0; d < ndim; d++) { off = hypre_IndexD(offset, d); if ( (hypre_IndexD(varoffset, d) == 0) && (off != 0) ) { *valid = 0; break; } if (off < 0) { hypre_IndexD(imin, d) -= 1; hypre_IndexD(imax, d) -= 1; } else if (off == 0) { hypre_IndexD(imin, d) -= hypre_IndexD(varoffset, d); } } return hypre_error_flag; } /*-------------------------------------------------------------------------- * Intersects with either the grid's boxman or neighbor boxman. * * action = 0 intersect only with my box manager * action = 1 intersect only with my neighbor box manager * action < 0 intersect with both box managers *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SStructGridIntersect( hypre_SStructGrid *grid, HYPRE_Int part, HYPRE_Int var, hypre_Box *box, HYPRE_Int action, hypre_BoxManEntry ***entries_ptr, HYPRE_Int *nentries_ptr ) { hypre_BoxManEntry **entries, **tentries; HYPRE_Int nentries, ntentries, i; hypre_BoxManager *boxman; if (action < 0) { boxman = hypre_SStructGridBoxManager(grid, part, var); hypre_BoxManIntersect(boxman, hypre_BoxIMin(box), hypre_BoxIMax(box), &entries, &nentries); boxman = hypre_SStructGridNborBoxManager(grid, part, var); hypre_BoxManIntersect(boxman, hypre_BoxIMin(box), hypre_BoxIMax(box), &tentries, &ntentries); entries = hypre_TReAlloc(entries, hypre_BoxManEntry *, (nentries + ntentries), HYPRE_MEMORY_HOST); for (i = 0; i < ntentries; i++) { entries[nentries + i] = tentries[i]; } nentries += ntentries; hypre_TFree(tentries, HYPRE_MEMORY_HOST); } else { if (action == 0) { boxman = hypre_SStructGridBoxManager(grid, part, var); } else { boxman = hypre_SStructGridNborBoxManager(grid, part, var); } hypre_BoxManIntersect(boxman, hypre_BoxIMin(box), hypre_BoxIMax(box), &entries, &nentries); } *entries_ptr = entries; *nentries_ptr = nentries; return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SStructGridGetMaxBoxSize( hypre_SStructGrid *grid ) { HYPRE_Int nparts = hypre_SStructGridNParts(grid); HYPRE_Int part; hypre_SStructPGrid *pgrid; HYPRE_Int max_box_size = 0; for (part = 0; part < nparts; part++) { pgrid = hypre_SStructGridPGrid(grid, part); max_box_size = hypre_max(max_box_size, hypre_SStructPGridGetMaxBoxSize(pgrid)); } return max_box_size; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SStructGridPrint( FILE *file, hypre_SStructGrid *grid ) { /* Grid variables */ HYPRE_Int ndim = hypre_SStructGridNDim(grid); HYPRE_Int nparts = hypre_SStructGridNParts(grid); HYPRE_Int *nneighbors = hypre_SStructGridNNeighbors(grid); hypre_SStructNeighbor **neighbors = hypre_SStructGridNeighbors(grid); hypre_Index **nbor_offsets = hypre_SStructGridNborOffsets(grid); hypre_IndexRef nbor_offset; hypre_IndexRef coord, dir, ilomap; HYPRE_Int npart; hypre_SStructNeighbor *neighbor; hypre_SStructPGrid *pgrid; hypre_StructGrid *sgrid; hypre_BoxArray *boxes; hypre_Box *box; HYPRE_SStructVariable *vartypes; HYPRE_Int *num_ghost; hypre_IndexRef periodic; /* Local variables */ HYPRE_Int i; HYPRE_Int part, var; HYPRE_Int nvars; HYPRE_Int nboxes; /* Print basic info */ hypre_fprintf(file, "\nGridCreate: %d %d\n\n", ndim, nparts); /* Print number of boxes per part */ for (part = 0; part < nparts; part++) { pgrid = hypre_SStructGridPGrid(grid, part); sgrid = hypre_SStructPGridCellSGrid(pgrid); boxes = hypre_StructGridBoxes(sgrid); nboxes = hypre_BoxArraySize(boxes); hypre_fprintf(file, "GridNumBoxes: %d %d\n", part, nboxes); } /* Print boxes per part */ for (part = 0; part < nparts; part++) { pgrid = hypre_SStructGridPGrid(grid, part); sgrid = hypre_SStructPGridCellSGrid(pgrid); boxes = hypre_StructGridBoxes(sgrid); hypre_ForBoxI(i, boxes) { box = hypre_BoxArrayBox(boxes, i); hypre_fprintf(file, "\nGridSetExtents: (%d, %d): ", part, i); hypre_BoxPrint(file, box); } } hypre_fprintf(file, "\n\n"); /* Print variable info per part */ for (part = 0; part < nparts; part++) { pgrid = hypre_SStructGridPGrid(grid, part); nvars = hypre_SStructPGridNVars(pgrid); vartypes = hypre_SStructPGridVarTypes(pgrid); hypre_fprintf(file, "GridSetVariables: %d %d ", part, nvars); hypre_fprintf(file, "[%d", vartypes[0]); for (var = 1; var < nvars; var++) { hypre_fprintf(file, " %d", vartypes[var]); } hypre_fprintf(file, "]\n"); } hypre_fprintf(file, "\n"); /* Print ghost info */ num_ghost = hypre_SStructGridNumGhost(grid); hypre_fprintf(file, "GridSetNumGhost:"); for (i = 0; i < 2 * ndim; i++) { hypre_fprintf(file, " %d", num_ghost[i]); } hypre_fprintf(file, "\n"); /* Print periodic data per part */ for (part = 0; part < nparts; part++) { pgrid = hypre_SStructGridPGrid(grid, part); periodic = hypre_SStructPGridPeriodic(pgrid); hypre_fprintf(file, "\nGridSetPeriodic: %d ", part); hypre_IndexPrint(file, ndim, periodic); } hypre_fprintf(file, "\n\n"); /* GridSetFEMOrdering */ /* GridSetSharedPart and GridSetNeighborPart data */ for (part = 0; part < nparts; part++) { hypre_fprintf(file, "GridNumNeighbors: %d %d\n", part, nneighbors[part]); for (i = 0; i < nneighbors[part]; i++) { neighbor = &neighbors[part][i]; nbor_offset = nbor_offsets[part][i]; box = hypre_SStructNeighborBox(neighbor); npart = hypre_SStructNeighborPart(neighbor); coord = hypre_SStructNeighborCoord(neighbor); dir = hypre_SStructNeighborDir(neighbor); ilomap = hypre_SStructNeighborILower(neighbor); /* Print SStructNeighbor info */ hypre_fprintf(file, "GridNeighborInfo: "); hypre_BoxPrint(file, box); hypre_fprintf(file, " "); hypre_IndexPrint(file, ndim, nbor_offset); hypre_fprintf(file, " %d ", npart); hypre_IndexPrint(file, ndim, coord); hypre_fprintf(file, " "); hypre_IndexPrint(file, ndim, dir); hypre_fprintf(file, " "); hypre_IndexPrint(file, ndim, ilomap); hypre_fprintf(file, "\n"); } } return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_SStructGridRead * * This function reads a semi-structured grid from file. This is used mainly * for debugging purposes. *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SStructGridRead( MPI_Comm comm, FILE *file, hypre_SStructGrid **grid_ptr ) { /* Grid variables */ HYPRE_SStructGrid grid; HYPRE_SStructVariable *vartypes; HYPRE_Int num_ghost[2 * HYPRE_MAXDIM]; hypre_Index **nbor_offsets; HYPRE_Int *nneighbors; hypre_SStructNeighbor **neighbors; hypre_SStructNeighbor *neighbor; hypre_Index periodic; /* Local variables */ HYPRE_Int ndim; HYPRE_Int b, d, i, j; HYPRE_Int part; HYPRE_Int nparts, nvars; HYPRE_Int nboxes; HYPRE_Int *nboxes_array; hypre_Box *box; hypre_fscanf(file, "\nGridCreate: %d %d\n\n", &ndim, &nparts); HYPRE_SStructGridCreate(comm, ndim, nparts, &grid); /* Allocate memory */ nboxes_array = hypre_CTAlloc(HYPRE_Int, nparts, HYPRE_MEMORY_HOST); box = hypre_BoxCreate(ndim); /* Read number of boxes per part */ for (i = 0; i < nparts; i++) { hypre_fscanf(file, "GridNumBoxes: %d %d\n", &part, &nboxes); nboxes_array[part] = nboxes; } hypre_fscanf(file, "\n"); /* Read boxes per part */ for (i = 0; i < nparts; i++) { for (j = 0; j < nboxes_array[i]; j++) { hypre_fscanf(file, "\nGridSetExtents: (%d, %d): ", &part, &b); hypre_BoxRead(file, ndim, &box); HYPRE_SStructGridSetExtents(grid, part, hypre_BoxIMin(box), hypre_BoxIMax(box)); } } hypre_fscanf(file, "\n\n"); /* Read variable info per part */ for (i = 0; i < nparts; i++) { hypre_fscanf(file, "GridSetVariables: %d %d ", &part, &nvars); vartypes = hypre_CTAlloc(hypre_SStructVariable, nvars, HYPRE_MEMORY_HOST); hypre_fscanf(file, "[%d", &vartypes[0]); for (j = 1; j < nvars; j++) { hypre_fscanf(file, " %d", &vartypes[j]); } hypre_fscanf(file, "]\n"); HYPRE_SStructGridSetVariables(grid, part, nvars, vartypes); hypre_TFree(vartypes, HYPRE_MEMORY_HOST); } hypre_fscanf(file, "\n"); /* Read ghost info */ hypre_fscanf(file, "GridSetNumGhost:"); for (i = 0; i < 2 * ndim; i++) { hypre_fscanf(file, " %d", &num_ghost[i]); } hypre_fscanf(file, "\n"); /* Read periodic data per part */ for (i = 0; i < nparts; i++) { hypre_fscanf(file, "\nGridSetPeriodic: %d ", &part); hypre_IndexRead(file, ndim, periodic); HYPRE_SStructGridSetPeriodic(grid, part, periodic); } hypre_fscanf(file, "\n\n"); /* GridSetFEMOrdering */ /* GridSetSharedPart and GridSetNeighborPart data */ nneighbors = hypre_SStructGridNNeighbors(grid); neighbors = hypre_SStructGridNeighbors(grid); nbor_offsets = hypre_SStructGridNborOffsets(grid); for (part = 0; part < nparts; part++) { hypre_fscanf(file, "GridNumNeighbors: %d %d\n", &part, &nneighbors[part]); neighbors[part] = hypre_TAlloc(hypre_SStructNeighbor, nneighbors[part], HYPRE_MEMORY_HOST); nbor_offsets[part] = hypre_TAlloc(hypre_Index, nneighbors[part], HYPRE_MEMORY_HOST); for (i = 0; i < nneighbors[part]; i++) { neighbor = &neighbors[part][i]; /* Read SStructNeighbor info */ hypre_fscanf(file, "GridNeighborInfo: "); hypre_BoxRead(file, ndim, &box); hypre_CopyBox(box, hypre_SStructNeighborBox(neighbor)); hypre_fscanf(file, " "); hypre_IndexRead(file, ndim, nbor_offsets[part][i]); hypre_fscanf(file, " %d ", &hypre_SStructNeighborPart(neighbor)); hypre_IndexRead(file, ndim, hypre_SStructNeighborCoord(neighbor)); hypre_fscanf(file, " "); hypre_IndexRead(file, ndim, hypre_SStructNeighborDir(neighbor)); hypre_fscanf(file, " "); hypre_IndexRead(file, ndim, hypre_SStructNeighborILower(neighbor)); hypre_fscanf(file, "\n"); for (d = ndim; d < HYPRE_MAXDIM; d++) { hypre_IndexD(hypre_SStructNeighborCoord(neighbor), d) = d; hypre_IndexD(hypre_SStructNeighborDir(neighbor), d) = 1; } } } /* Assemble grid */ HYPRE_SStructGridAssemble(grid); /* Free memory */ hypre_TFree(nboxes_array, HYPRE_MEMORY_HOST); hypre_BoxDestroy(box); *grid_ptr = grid; return hypre_error_flag; } hypre-2.33.0/src/sstruct_mv/sstruct_grid.h000066400000000000000000000310641477326011500206250ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * Header info for the hypre_SStructGrid structures * *****************************************************************************/ #ifndef hypre_SSTRUCT_GRID_HEADER #define hypre_SSTRUCT_GRID_HEADER /*-------------------------------------------------------------------------- * hypre_SStructGrid: * * NOTE: Since variables may be replicated across different processes, * a separate set of "interface grids" is retained so that data can be * migrated onto and off of the internal (non-replicated) grids. *--------------------------------------------------------------------------*/ typedef HYPRE_Int hypre_SStructVariable; typedef struct { HYPRE_SStructVariable type; HYPRE_Int rank; /* local rank */ HYPRE_Int proc; } hypre_SStructUVar; typedef struct { HYPRE_Int part; hypre_Index cell; HYPRE_Int nuvars; hypre_SStructUVar *uvars; } hypre_SStructUCVar; typedef struct { MPI_Comm comm; /* TODO: use different comms */ HYPRE_Int ndim; HYPRE_Int nvars; /* number of variables */ HYPRE_SStructVariable *vartypes; /* types of variables */ hypre_StructGrid *sgrids[8]; /* struct grids for each vartype */ hypre_BoxArray *iboxarrays[8]; /* interface boxes */ hypre_BoxArray *pneighbors; hypre_Index *pnbor_offsets; HYPRE_Int local_size; /* Number of variables locally */ HYPRE_BigInt global_size; /* Total number of variables */ hypre_Index periodic; /* Indicates if pgrid is periodic */ /* GEC0902 additions for ghost expansion of boxes */ HYPRE_Int ghlocal_size; /* Number of vars including ghosts */ HYPRE_Int cell_sgrid_done; /* =1 implies cell grid already assembled */ } hypre_SStructPGrid; typedef struct { hypre_Box box; HYPRE_Int part; hypre_Index ilower; /* box ilower, but on the neighbor index-space */ hypre_Index coord; /* lives on local index-space */ hypre_Index dir; /* lives on local index-space */ } hypre_SStructNeighbor; enum hypre_SStructBoxManInfoType { hypre_SSTRUCT_BOXMAN_INFO_DEFAULT = 0, hypre_SSTRUCT_BOXMAN_INFO_NEIGHBOR = 1 }; typedef struct { HYPRE_Int type; HYPRE_BigInt offset; HYPRE_BigInt ghoffset; } hypre_SStructBoxManInfo; typedef struct { HYPRE_Int type; HYPRE_BigInt offset; /* minimum offset for this box */ HYPRE_BigInt ghoffset; /* minimum offset ghost for this box */ HYPRE_Int proc; /* redundant with the proc in the entry, but makes some coding easier */ HYPRE_Int boxnum; /* this is different from the entry id */ HYPRE_Int part; /* part the box lives on */ hypre_Index ilower; /* box ilower, but on the neighbor index-space */ hypre_Index coord; /* lives on local index-space */ hypre_Index dir; /* lives on local index-space */ hypre_Index stride; /* lives on local index-space */ hypre_Index ghstride; /* the ghost equivalent of strides */ } hypre_SStructBoxManNborInfo; typedef struct { hypre_CommInfo *comm_info; HYPRE_Int send_part; HYPRE_Int recv_part; HYPRE_Int send_var; HYPRE_Int recv_var; } hypre_SStructCommInfo; typedef struct hypre_SStructGrid_struct { MPI_Comm comm; HYPRE_Int ndim; HYPRE_Int nparts; /* s-variable info */ hypre_SStructPGrid **pgrids; /* neighbor info */ HYPRE_Int *nneighbors; hypre_SStructNeighbor **neighbors; hypre_Index **nbor_offsets; HYPRE_Int **nvneighbors; hypre_SStructNeighbor ***vneighbors; hypre_SStructCommInfo **vnbor_comm_info; /* for updating shared data */ HYPRE_Int vnbor_ncomms; /* u-variables info: During construction, array entries are consecutive. * After 'Assemble', entries are referenced via local cell rank. */ HYPRE_Int nucvars; hypre_SStructUCVar **ucvars; /* info for fem-based user input (for each part) */ HYPRE_Int *fem_nvars; HYPRE_Int **fem_vars; hypre_Index **fem_offsets; /* info for mapping (part, index, var) --> rank */ hypre_BoxManager ***boxmans; /* manager for each part, var */ hypre_BoxManager ***nbor_boxmans; /* manager for each part, var */ HYPRE_BigInt start_rank; HYPRE_Int local_size; /* Number of variables locally */ HYPRE_BigInt global_size; /* Total number of variables */ HYPRE_Int ref_count; /* GEC0902 additions for ghost expansion of boxes */ HYPRE_Int ghlocal_size; /* GEC0902 Number of vars including ghosts */ HYPRE_BigInt ghstart_rank; /* GEC0902 start rank including ghosts */ HYPRE_Int num_ghost[2 * HYPRE_MAXDIM]; /* ghost layer size */ } hypre_SStructGrid; /*-------------------------------------------------------------------------- * Accessor macros: hypre_SStructGrid *--------------------------------------------------------------------------*/ #define hypre_SStructGridComm(grid) ((grid) -> comm) #define hypre_SStructGridNDim(grid) ((grid) -> ndim) #define hypre_SStructGridNParts(grid) ((grid) -> nparts) #define hypre_SStructGridPGrids(grid) ((grid) -> pgrids) #define hypre_SStructGridPGrid(grid, part) ((grid) -> pgrids[part]) #define hypre_SStructGridNNeighbors(grid) ((grid) -> nneighbors) #define hypre_SStructGridNeighbors(grid) ((grid) -> neighbors) #define hypre_SStructGridNborOffsets(grid) ((grid) -> nbor_offsets) #define hypre_SStructGridNVNeighbors(grid) ((grid) -> nvneighbors) #define hypre_SStructGridVNeighbors(grid) ((grid) -> vneighbors) #define hypre_SStructGridVNborCommInfo(grid) ((grid) -> vnbor_comm_info) #define hypre_SStructGridVNborNComms(grid) ((grid) -> vnbor_ncomms) #define hypre_SStructGridNUCVars(grid) ((grid) -> nucvars) #define hypre_SStructGridUCVars(grid) ((grid) -> ucvars) #define hypre_SStructGridUCVar(grid, i) ((grid) -> ucvars[i]) #define hypre_SStructGridFEMNVars(grid) ((grid) -> fem_nvars) #define hypre_SStructGridFEMVars(grid) ((grid) -> fem_vars) #define hypre_SStructGridFEMOffsets(grid) ((grid) -> fem_offsets) #define hypre_SStructGridFEMPNVars(grid, part) ((grid) -> fem_nvars[part]) #define hypre_SStructGridFEMPVars(grid, part) ((grid) -> fem_vars[part]) #define hypre_SStructGridFEMPOffsets(grid, part) ((grid) -> fem_offsets[part]) #define hypre_SStructGridBoxManagers(grid) ((grid) -> boxmans) #define hypre_SStructGridBoxManager(grid, part, var) ((grid) -> boxmans[part][var]) #define hypre_SStructGridNborBoxManagers(grid) ((grid) -> nbor_boxmans) #define hypre_SStructGridNborBoxManager(grid, part, var) ((grid) -> nbor_boxmans[part][var]) #define hypre_SStructGridStartRank(grid) ((grid) -> start_rank) #define hypre_SStructGridLocalSize(grid) ((grid) -> local_size) #define hypre_SStructGridGlobalSize(grid) ((grid) -> global_size) #define hypre_SStructGridRefCount(grid) ((grid) -> ref_count) #define hypre_SStructGridGhlocalSize(grid) ((grid) -> ghlocal_size) #define hypre_SStructGridGhstartRank(grid) ((grid) -> ghstart_rank) #define hypre_SStructGridNumGhost(grid) ((grid) -> num_ghost) /*-------------------------------------------------------------------------- * Accessor macros: hypre_SStructPGrid *--------------------------------------------------------------------------*/ #define hypre_SStructPGridComm(pgrid) ((pgrid) -> comm) #define hypre_SStructPGridNDim(pgrid) ((pgrid) -> ndim) #define hypre_SStructPGridNVars(pgrid) ((pgrid) -> nvars) #define hypre_SStructPGridVarTypes(pgrid) ((pgrid) -> vartypes) #define hypre_SStructPGridVarType(pgrid, var) ((pgrid) -> vartypes[var]) #define hypre_SStructPGridCellSGridDone(pgrid) ((pgrid) -> cell_sgrid_done) #define hypre_SStructPGridSGrids(pgrid) ((pgrid) -> sgrids) #define hypre_SStructPGridSGrid(pgrid, var) \ ((pgrid) -> sgrids[hypre_SStructPGridVarType(pgrid, var)]) #define hypre_SStructPGridCellSGrid(pgrid) \ ((pgrid) -> sgrids[HYPRE_SSTRUCT_VARIABLE_CELL]) #define hypre_SStructPGridVTSGrid(pgrid, vartype) ((pgrid) -> sgrids[vartype]) #define hypre_SStructPGridIBoxArrays(pgrid) ((pgrid) -> iboxarrays) #define hypre_SStructPGridIBoxArray(pgrid, var) \ ((pgrid) -> iboxarrays[hypre_SStructPGridVarType(pgrid, var)]) #define hypre_SStructPGridCellIBoxArray(pgrid) \ ((pgrid) -> iboxarrays[HYPRE_SSTRUCT_VARIABLE_CELL]) #define hypre_SStructPGridVTIBoxArray(pgrid, vartype) \ ((pgrid) -> iboxarrays[vartype]) #define hypre_SStructPGridPNeighbors(pgrid) ((pgrid) -> pneighbors) #define hypre_SStructPGridPNborOffsets(pgrid) ((pgrid) -> pnbor_offsets) #define hypre_SStructPGridLocalSize(pgrid) ((pgrid) -> local_size) #define hypre_SStructPGridGlobalSize(pgrid) ((pgrid) -> global_size) #define hypre_SStructPGridPeriodic(pgrid) ((pgrid) -> periodic) #define hypre_SStructPGridGhlocalSize(pgrid) ((pgrid) -> ghlocal_size) /*-------------------------------------------------------------------------- * Accessor macros: hypre_SStructBoxManInfo *--------------------------------------------------------------------------*/ #define hypre_SStructBoxManInfoType(info) ((info) -> type) #define hypre_SStructBoxManInfoOffset(info) ((info) -> offset) #define hypre_SStructBoxManInfoGhoffset(info) ((info) -> ghoffset) /*-------------------------------------------------------------------------- * Accessor macros: hypre_SStructBoxManInfo *--------------------------------------------------------------------------*/ /* Use the MapInfo macros to access the first three structure components */ #define hypre_SStructBoxManNborInfoProc(info) ((info) -> proc) #define hypre_SStructBoxManNborInfoBoxnum(info) ((info) -> boxnum) #define hypre_SStructBoxManNborInfoPart(info) ((info) -> part) #define hypre_SStructBoxManNborInfoILower(info) ((info) -> ilower) #define hypre_SStructBoxManNborInfoCoord(info) ((info) -> coord) #define hypre_SStructBoxManNborInfoDir(info) ((info) -> dir) #define hypre_SStructBoxManNborInfoStride(info) ((info) -> stride) #define hypre_SStructBoxManNborInfoGhstride(info) ((info) -> ghstride) /*-------------------------------------------------------------------------- * Accessor macros: hypre_SStructNeighbor *--------------------------------------------------------------------------*/ #define hypre_SStructNeighborBox(neighbor) &((neighbor) -> box) #define hypre_SStructNeighborPart(neighbor) ((neighbor) -> part) #define hypre_SStructNeighborILower(neighbor) ((neighbor) -> ilower) #define hypre_SStructNeighborCoord(neighbor) ((neighbor) -> coord) #define hypre_SStructNeighborDir(neighbor) ((neighbor) -> dir) /*-------------------------------------------------------------------------- * Accessor macros: hypre_SStructCommInfo *--------------------------------------------------------------------------*/ #define hypre_SStructCommInfoCommInfo(cinfo) ((cinfo) -> comm_info) #define hypre_SStructCommInfoSendPart(cinfo) ((cinfo) -> send_part) #define hypre_SStructCommInfoRecvPart(cinfo) ((cinfo) -> recv_part) #define hypre_SStructCommInfoSendVar(cinfo) ((cinfo) -> send_var) #define hypre_SStructCommInfoRecvVar(cinfo) ((cinfo) -> recv_var) /*-------------------------------------------------------------------------- * Accessor macros: hypre_SStructUCVar *--------------------------------------------------------------------------*/ #define hypre_SStructUCVarPart(uc) ((uc) -> part) #define hypre_SStructUCVarCell(uc) ((uc) -> cell) #define hypre_SStructUCVarNUVars(uc) ((uc) -> nuvars) #define hypre_SStructUCVarUVars(uc) ((uc) -> uvars) #define hypre_SStructUCVarType(uc, i) ((uc) -> uvars[i].type) #define hypre_SStructUCVarRank(uc, i) ((uc) -> uvars[i].rank) #define hypre_SStructUCVarProc(uc, i) ((uc) -> uvars[i].proc) #endif hypre-2.33.0/src/sstruct_mv/sstruct_innerprod.c000066400000000000000000000053551477326011500216770ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * SStruct inner product routine * *****************************************************************************/ #include "_hypre_sstruct_mv.h" /*-------------------------------------------------------------------------- * hypre_SStructPInnerProd *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SStructPInnerProd( hypre_SStructPVector *px, hypre_SStructPVector *py, HYPRE_Real *presult_ptr ) { HYPRE_Int nvars = hypre_SStructPVectorNVars(px); HYPRE_Real presult; HYPRE_Real sresult; HYPRE_Int var; presult = 0.0; for (var = 0; var < nvars; var++) { sresult = hypre_StructInnerProd(hypre_SStructPVectorSVector(px, var), hypre_SStructPVectorSVector(py, var)); presult += sresult; } *presult_ptr = presult; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_SStructInnerProd *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SStructInnerProd( hypre_SStructVector *x, hypre_SStructVector *y, HYPRE_Real *result_ptr ) { HYPRE_Int nparts = hypre_SStructVectorNParts(x); HYPRE_Real result; HYPRE_Real presult; HYPRE_Int part; HYPRE_Int x_object_type = hypre_SStructVectorObjectType(x); HYPRE_Int y_object_type = hypre_SStructVectorObjectType(y); if (x_object_type != y_object_type) { hypre_error_in_arg(2); hypre_error_in_arg(3); return hypre_error_flag; } result = 0.0; if ( (x_object_type == HYPRE_SSTRUCT) || (x_object_type == HYPRE_STRUCT) ) { for (part = 0; part < nparts; part++) { hypre_SStructPInnerProd(hypre_SStructVectorPVector(x, part), hypre_SStructVectorPVector(y, part), &presult); result += presult; } } else if (x_object_type == HYPRE_PARCSR) { hypre_ParVector *x_par; hypre_ParVector *y_par; hypre_SStructVectorConvert(x, &x_par); hypre_SStructVectorConvert(y, &y_par); result = hypre_ParVectorInnerProd(x_par, y_par); } *result_ptr = result; return hypre_error_flag; } hypre-2.33.0/src/sstruct_mv/sstruct_matrix.c000066400000000000000000001733001477326011500211770ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * Member functions for hypre_SStructPMatrix class. * *****************************************************************************/ #include "_hypre_sstruct_mv.h" #include "_hypre_struct_mv.hpp" /*========================================================================== * SStructPMatrix routines *==========================================================================*/ /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SStructPMatrixRef( hypre_SStructPMatrix *matrix, hypre_SStructPMatrix **matrix_ref ) { hypre_SStructPMatrixRefCount(matrix) ++; *matrix_ref = matrix; return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SStructPMatrixCreate( MPI_Comm comm, hypre_SStructPGrid *pgrid, hypre_SStructStencil **stencils, hypre_SStructPMatrix **pmatrix_ptr ) { hypre_SStructPMatrix *pmatrix; HYPRE_Int nvars; HYPRE_Int **smaps; hypre_StructStencil ***sstencils; hypre_StructMatrix ***smatrices; HYPRE_Int **symmetric; hypre_StructStencil *sstencil; HYPRE_Int *vars; hypre_Index *sstencil_shape; HYPRE_Int sstencil_size; HYPRE_Int new_dim; HYPRE_Int *new_sizes; hypre_Index **new_shapes; HYPRE_Int size; hypre_StructGrid *sgrid; HYPRE_Int vi, vj; HYPRE_Int i, j, k; pmatrix = hypre_TAlloc(hypre_SStructPMatrix, 1, HYPRE_MEMORY_HOST); hypre_SStructPMatrixComm(pmatrix) = comm; hypre_SStructPMatrixPGrid(pmatrix) = pgrid; hypre_SStructPMatrixStencils(pmatrix) = stencils; nvars = hypre_SStructPGridNVars(pgrid); hypre_SStructPMatrixNVars(pmatrix) = nvars; /* create sstencils */ smaps = hypre_TAlloc(HYPRE_Int *, nvars, HYPRE_MEMORY_HOST); sstencils = hypre_TAlloc(hypre_StructStencil **, nvars, HYPRE_MEMORY_HOST); new_sizes = hypre_TAlloc(HYPRE_Int, nvars, HYPRE_MEMORY_HOST); new_shapes = hypre_TAlloc(hypre_Index *, nvars, HYPRE_MEMORY_HOST); size = 0; for (vi = 0; vi < nvars; vi++) { sstencils[vi] = hypre_TAlloc(hypre_StructStencil *, nvars, HYPRE_MEMORY_HOST); for (vj = 0; vj < nvars; vj++) { sstencils[vi][vj] = NULL; new_sizes[vj] = 0; } sstencil = hypre_SStructStencilSStencil(stencils[vi]); vars = hypre_SStructStencilVars(stencils[vi]); sstencil_shape = hypre_StructStencilShape(sstencil); sstencil_size = hypre_StructStencilSize(sstencil); smaps[vi] = hypre_TAlloc(HYPRE_Int, sstencil_size, HYPRE_MEMORY_HOST); for (i = 0; i < sstencil_size; i++) { j = vars[i]; new_sizes[j]++; } for (vj = 0; vj < nvars; vj++) { if (new_sizes[vj]) { new_shapes[vj] = hypre_TAlloc(hypre_Index, new_sizes[vj], HYPRE_MEMORY_HOST); new_sizes[vj] = 0; } } for (i = 0; i < sstencil_size; i++) { j = vars[i]; k = new_sizes[j]; hypre_CopyIndex(sstencil_shape[i], new_shapes[j][k]); smaps[vi][i] = k; new_sizes[j]++; } new_dim = hypre_StructStencilNDim(sstencil); for (vj = 0; vj < nvars; vj++) { if (new_sizes[vj]) { sstencils[vi][vj] = hypre_StructStencilCreate(new_dim, new_sizes[vj], new_shapes[vj]); } size = hypre_max(size, new_sizes[vj]); } } hypre_SStructPMatrixSMaps(pmatrix) = smaps; hypre_SStructPMatrixSStencils(pmatrix) = sstencils; hypre_TFree(new_sizes, HYPRE_MEMORY_HOST); hypre_TFree(new_shapes, HYPRE_MEMORY_HOST); /* create smatrices */ smatrices = hypre_TAlloc(hypre_StructMatrix **, nvars, HYPRE_MEMORY_HOST); for (vi = 0; vi < nvars; vi++) { smatrices[vi] = hypre_TAlloc(hypre_StructMatrix *, nvars, HYPRE_MEMORY_HOST); for (vj = 0; vj < nvars; vj++) { smatrices[vi][vj] = NULL; if (sstencils[vi][vj] != NULL) { sgrid = hypre_SStructPGridSGrid(pgrid, vi); smatrices[vi][vj] = hypre_StructMatrixCreate(comm, sgrid, sstencils[vi][vj]); } } } hypre_SStructPMatrixSMatrices(pmatrix) = smatrices; /* create symmetric */ symmetric = hypre_TAlloc(HYPRE_Int *, nvars, HYPRE_MEMORY_HOST); for (vi = 0; vi < nvars; vi++) { symmetric[vi] = hypre_TAlloc(HYPRE_Int, nvars, HYPRE_MEMORY_HOST); for (vj = 0; vj < nvars; vj++) { symmetric[vi][vj] = 0; } } hypre_SStructPMatrixSymmetric(pmatrix) = symmetric; hypre_SStructPMatrixSEntriesSize(pmatrix) = size; hypre_SStructPMatrixSEntries(pmatrix) = hypre_TAlloc(HYPRE_Int, size, HYPRE_MEMORY_HOST); hypre_SStructPMatrixRefCount(pmatrix) = 1; *pmatrix_ptr = pmatrix; return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SStructPMatrixDestroy( hypre_SStructPMatrix *pmatrix ) { hypre_SStructStencil **stencils; HYPRE_Int nvars; HYPRE_Int **smaps; hypre_StructStencil ***sstencils; hypre_StructMatrix ***smatrices; HYPRE_Int **symmetric; HYPRE_Int vi, vj; if (pmatrix) { hypre_SStructPMatrixRefCount(pmatrix) --; if (hypre_SStructPMatrixRefCount(pmatrix) == 0) { stencils = hypre_SStructPMatrixStencils(pmatrix); nvars = hypre_SStructPMatrixNVars(pmatrix); smaps = hypre_SStructPMatrixSMaps(pmatrix); sstencils = hypre_SStructPMatrixSStencils(pmatrix); smatrices = hypre_SStructPMatrixSMatrices(pmatrix); symmetric = hypre_SStructPMatrixSymmetric(pmatrix); for (vi = 0; vi < nvars; vi++) { HYPRE_SStructStencilDestroy(stencils[vi]); hypre_TFree(smaps[vi], HYPRE_MEMORY_HOST); for (vj = 0; vj < nvars; vj++) { hypre_StructStencilDestroy(sstencils[vi][vj]); hypre_StructMatrixDestroy(smatrices[vi][vj]); } hypre_TFree(sstencils[vi], HYPRE_MEMORY_HOST); hypre_TFree(smatrices[vi], HYPRE_MEMORY_HOST); hypre_TFree(symmetric[vi], HYPRE_MEMORY_HOST); } hypre_TFree(stencils, HYPRE_MEMORY_HOST); hypre_TFree(smaps, HYPRE_MEMORY_HOST); hypre_TFree(sstencils, HYPRE_MEMORY_HOST); hypre_TFree(smatrices, HYPRE_MEMORY_HOST); hypre_TFree(symmetric, HYPRE_MEMORY_HOST); hypre_TFree(hypre_SStructPMatrixSEntries(pmatrix), HYPRE_MEMORY_HOST); hypre_TFree(pmatrix, HYPRE_MEMORY_HOST); } } return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SStructPMatrixInitialize( hypre_SStructPMatrix *pmatrix ) { HYPRE_Int nvars = hypre_SStructPMatrixNVars(pmatrix); HYPRE_Int **symmetric = hypre_SStructPMatrixSymmetric(pmatrix); hypre_StructMatrix *smatrix; HYPRE_Int vi, vj; /* HYPRE_Int num_ghost[2*HYPRE_MAXDIM]; */ /* HYPRE_Int vi, vj, d, ndim; */ #if 0 ndim = hypre_SStructPMatrixNDim(pmatrix); /* RDF: Why are the ghosts being reset to one? Maybe it needs to be at least * one to set shared coefficients correctly, but not exactly one? */ for (d = 0; d < ndim; d++) { num_ghost[2 * d] = num_ghost[2 * d + 1] = 1; } #endif for (vi = 0; vi < nvars; vi++) { for (vj = 0; vj < nvars; vj++) { smatrix = hypre_SStructPMatrixSMatrix(pmatrix, vi, vj); if (smatrix != NULL) { HYPRE_StructMatrixSetSymmetric(smatrix, symmetric[vi][vj]); /* hypre_StructMatrixSetNumGhost(smatrix, num_ghost); */ hypre_StructMatrixInitialize(smatrix); /* needed to get AddTo accumulation correct between processors */ hypre_StructMatrixClearGhostValues(smatrix); } } } hypre_SStructPMatrixAccumulated(pmatrix) = 0; return hypre_error_flag; } /*-------------------------------------------------------------------------- * (action > 0): add-to values * (action = 0): set values * (action < 0): get values *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SStructPMatrixSetValues( hypre_SStructPMatrix *pmatrix, hypre_Index index, HYPRE_Int var, HYPRE_Int nentries, HYPRE_Int *entries, HYPRE_Complex *values, HYPRE_Int action ) { hypre_SStructStencil *stencil = hypre_SStructPMatrixStencil(pmatrix, var); HYPRE_Int *smap = hypre_SStructPMatrixSMap(pmatrix, var); HYPRE_Int *vars = hypre_SStructStencilVars(stencil); hypre_StructMatrix *smatrix; hypre_BoxArray *grid_boxes; hypre_Box *box, *grow_box; HYPRE_Int *sentries; HYPRE_Int i; smatrix = hypre_SStructPMatrixSMatrix(pmatrix, var, vars[entries[0]]); sentries = hypre_SStructPMatrixSEntries(pmatrix); for (i = 0; i < nentries; i++) { sentries[i] = smap[entries[i]]; } /* set values inside the grid */ hypre_StructMatrixSetValues(smatrix, index, nentries, sentries, values, action, -1, 0); /* set (AddTo/Get) or clear (Set) values outside the grid in ghost zones */ if (action != 0) { /* AddTo/Get */ hypre_SStructPGrid *pgrid = hypre_SStructPMatrixPGrid(pmatrix); hypre_Index varoffset; HYPRE_Int done = 0; grid_boxes = hypre_StructGridBoxes(hypre_StructMatrixGrid(smatrix)); hypre_ForBoxI(i, grid_boxes) { box = hypre_BoxArrayBox(grid_boxes, i); if (hypre_IndexInBox(index, box)) { done = 1; break; } } if (!done) { grow_box = hypre_BoxCreate(hypre_BoxArrayNDim(grid_boxes)); hypre_SStructVariableGetOffset(hypre_SStructPGridVarType(pgrid, var), hypre_SStructPGridNDim(pgrid), varoffset); hypre_ForBoxI(i, grid_boxes) { box = hypre_BoxArrayBox(grid_boxes, i); hypre_CopyBox(box, grow_box); hypre_BoxGrowByIndex(grow_box, varoffset); if (hypre_IndexInBox(index, grow_box)) { hypre_StructMatrixSetValues(smatrix, index, nentries, sentries, values, action, i, 1); break; } } hypre_BoxDestroy(grow_box); } } else { /* Set */ grid_boxes = hypre_StructGridBoxes(hypre_StructMatrixGrid(smatrix)); hypre_ForBoxI(i, grid_boxes) { box = hypre_BoxArrayBox(grid_boxes, i); if (!hypre_IndexInBox(index, box)) { hypre_StructMatrixClearValues(smatrix, index, nentries, sentries, i, 1); } } } return hypre_error_flag; } /*-------------------------------------------------------------------------- * (action > 0): add-to values * (action = 0): set values * (action < 0): get values * (action =-2): get values and zero out *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SStructPMatrixSetBoxValues( hypre_SStructPMatrix *pmatrix, hypre_Box *set_box, HYPRE_Int var, HYPRE_Int nentries, HYPRE_Int *entries, hypre_Box *value_box, HYPRE_Complex *values, HYPRE_Int action ) { HYPRE_Int ndim = hypre_SStructPMatrixNDim(pmatrix); hypre_SStructStencil *stencil = hypre_SStructPMatrixStencil(pmatrix, var); HYPRE_Int *smap = hypre_SStructPMatrixSMap(pmatrix, var); HYPRE_Int *vars = hypre_SStructStencilVars(stencil); hypre_StructMatrix *smatrix; hypre_BoxArray *grid_boxes; HYPRE_Int *sentries; HYPRE_Int i, j; smatrix = hypre_SStructPMatrixSMatrix(pmatrix, var, vars[entries[0]]); sentries = hypre_SStructPMatrixSEntries(pmatrix); for (i = 0; i < nentries; i++) { sentries[i] = smap[entries[i]]; } /* set values inside the grid */ hypre_StructMatrixSetBoxValues(smatrix, set_box, value_box, nentries, sentries, values, action, -1, 0); /* TODO: Why need DeviceSync? */ #if defined(HYPRE_USING_GPU) hypre_SyncDevice(); #endif /* set (AddTo/Get) or clear (Set) values outside the grid in ghost zones */ if (action != 0) { /* AddTo/Get */ hypre_SStructPGrid *pgrid = hypre_SStructPMatrixPGrid(pmatrix); hypre_Index varoffset; hypre_BoxArray *left_boxes, *done_boxes, *temp_boxes; hypre_Box *left_box, *done_box, *int_box; hypre_SStructVariableGetOffset(hypre_SStructPGridVarType(pgrid, var), hypre_SStructPGridNDim(pgrid), varoffset); grid_boxes = hypre_StructGridBoxes(hypre_StructMatrixGrid(smatrix)); left_boxes = hypre_BoxArrayCreate(1, ndim); done_boxes = hypre_BoxArrayCreate(2, ndim); temp_boxes = hypre_BoxArrayCreate(0, ndim); /* done_box always points to the first box in done_boxes */ done_box = hypre_BoxArrayBox(done_boxes, 0); /* int_box always points to the second box in done_boxes */ int_box = hypre_BoxArrayBox(done_boxes, 1); hypre_CopyBox(set_box, hypre_BoxArrayBox(left_boxes, 0)); hypre_BoxArraySetSize(left_boxes, 1); hypre_SubtractBoxArrays(left_boxes, grid_boxes, temp_boxes); hypre_BoxArraySetSize(done_boxes, 0); hypre_ForBoxI(i, grid_boxes) { hypre_SubtractBoxArrays(left_boxes, done_boxes, temp_boxes); hypre_BoxArraySetSize(done_boxes, 1); hypre_CopyBox(hypre_BoxArrayBox(grid_boxes, i), done_box); hypre_BoxGrowByIndex(done_box, varoffset); hypre_ForBoxI(j, left_boxes) { left_box = hypre_BoxArrayBox(left_boxes, j); hypre_IntersectBoxes(left_box, done_box, int_box); hypre_StructMatrixSetBoxValues(smatrix, int_box, value_box, nentries, sentries, values, action, i, 1); } } hypre_BoxArrayDestroy(left_boxes); hypre_BoxArrayDestroy(done_boxes); hypre_BoxArrayDestroy(temp_boxes); } else { /* Set */ hypre_BoxArray *diff_boxes; hypre_Box *grid_box, *diff_box; grid_boxes = hypre_StructGridBoxes(hypre_StructMatrixGrid(smatrix)); diff_boxes = hypre_BoxArrayCreate(0, ndim); hypre_ForBoxI(i, grid_boxes) { grid_box = hypre_BoxArrayBox(grid_boxes, i); hypre_BoxArraySetSize(diff_boxes, 0); hypre_SubtractBoxes(set_box, grid_box, diff_boxes); hypre_ForBoxI(j, diff_boxes) { diff_box = hypre_BoxArrayBox(diff_boxes, j); hypre_StructMatrixClearBoxValues(smatrix, diff_box, nentries, sentries, i, 1); } } hypre_BoxArrayDestroy(diff_boxes); } return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SStructPMatrixAccumulate( hypre_SStructPMatrix *pmatrix ) { hypre_SStructPGrid *pgrid = hypre_SStructPMatrixPGrid(pmatrix); HYPRE_Int nvars = hypre_SStructPMatrixNVars(pmatrix); HYPRE_Int ndim = hypre_SStructPGridNDim(pgrid); HYPRE_SStructVariable *vartypes = hypre_SStructPGridVarTypes(pgrid); hypre_StructMatrix *smatrix; hypre_Index varoffset; HYPRE_Int num_ghost[2 * HYPRE_MAXDIM]; hypre_StructGrid *sgrid; HYPRE_Int vi, vj, d; hypre_CommInfo *comm_info; hypre_CommPkg *comm_pkg; hypre_CommHandle *comm_handle; /* if values already accumulated, just return */ if (hypre_SStructPMatrixAccumulated(pmatrix)) { return hypre_error_flag; } for (vi = 0; vi < nvars; vi++) { for (vj = 0; vj < nvars; vj++) { smatrix = hypre_SStructPMatrixSMatrix(pmatrix, vi, vj); if (smatrix != NULL) { sgrid = hypre_StructMatrixGrid(smatrix); /* assumes vi and vj vartypes are the same */ hypre_SStructVariableGetOffset(vartypes[vi], ndim, varoffset); for (d = 0; d < ndim; d++) { num_ghost[2 * d] = num_ghost[2 * d + 1] = hypre_IndexD(varoffset, d); } /* accumulate values from AddTo */ hypre_CreateCommInfoFromNumGhost(sgrid, num_ghost, &comm_info); hypre_CommPkgCreate(comm_info, hypre_StructMatrixDataSpace(smatrix), hypre_StructMatrixDataSpace(smatrix), hypre_StructMatrixNumValues(smatrix), NULL, 1, hypre_StructMatrixComm(smatrix), &comm_pkg); hypre_InitializeCommunication(comm_pkg, hypre_StructMatrixData(smatrix), hypre_StructMatrixData(smatrix), 1, 0, &comm_handle); hypre_FinalizeCommunication(comm_handle); hypre_CommInfoDestroy(comm_info); hypre_CommPkgDestroy(comm_pkg); } } } hypre_SStructPMatrixAccumulated(pmatrix) = 1; return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SStructPMatrixAssemble( hypre_SStructPMatrix *pmatrix ) { HYPRE_Int nvars = hypre_SStructPMatrixNVars(pmatrix); hypre_StructMatrix *smatrix; HYPRE_Int vi, vj; hypre_SStructPMatrixAccumulate(pmatrix); for (vi = 0; vi < nvars; vi++) { for (vj = 0; vj < nvars; vj++) { smatrix = hypre_SStructPMatrixSMatrix(pmatrix, vi, vj); if (smatrix != NULL) { hypre_StructMatrixClearGhostValues(smatrix); hypre_StructMatrixAssemble(smatrix); } } } return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SStructPMatrixSetSymmetric( hypre_SStructPMatrix *pmatrix, HYPRE_Int var, HYPRE_Int to_var, HYPRE_Int symmetric ) { HYPRE_Int **pmsymmetric = hypre_SStructPMatrixSymmetric(pmatrix); HYPRE_Int vstart = var; HYPRE_Int vsize = 1; HYPRE_Int tstart = to_var; HYPRE_Int tsize = 1; HYPRE_Int v, t; if (var == -1) { vstart = 0; vsize = hypre_SStructPMatrixNVars(pmatrix); } if (to_var == -1) { tstart = 0; tsize = hypre_SStructPMatrixNVars(pmatrix); } for (v = vstart; v < vsize; v++) { for (t = tstart; t < tsize; t++) { pmsymmetric[v][t] = symmetric; } } return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SStructPMatrixPrint( const char *filename, hypre_SStructPMatrix *pmatrix, HYPRE_Int all ) { HYPRE_Int nvars = hypre_SStructPMatrixNVars(pmatrix); hypre_StructMatrix *smatrix; HYPRE_Int vi, vj; char new_filename[255]; for (vi = 0; vi < nvars; vi++) { for (vj = 0; vj < nvars; vj++) { smatrix = hypre_SStructPMatrixSMatrix(pmatrix, vi, vj); if (smatrix != NULL) { hypre_sprintf(new_filename, "%s.%02d.%02d", filename, vi, vj); hypre_StructMatrixPrint(new_filename, smatrix, all); } } } return hypre_error_flag; } /*========================================================================== * SStructUMatrix routines *==========================================================================*/ /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SStructUMatrixInitialize( hypre_SStructMatrix *matrix ) { HYPRE_Int ndim = hypre_SStructMatrixNDim(matrix); HYPRE_IJMatrix ijmatrix = hypre_SStructMatrixIJMatrix(matrix); HYPRE_Int matrix_type = hypre_SStructMatrixObjectType(matrix); hypre_SStructGraph *graph = hypre_SStructMatrixGraph(matrix); hypre_SStructGrid *grid = hypre_SStructGraphGrid(graph); HYPRE_Int nparts = hypre_SStructGraphNParts(graph); hypre_SStructPGrid **pgrids = hypre_SStructGraphPGrids(graph); hypre_SStructStencil ***stencils = hypre_SStructGraphStencils(graph); HYPRE_Int nUventries = hypre_SStructGraphNUVEntries(graph); HYPRE_Int *iUventries = hypre_SStructGraphIUVEntries(graph); hypre_SStructUVEntry **Uventries = hypre_SStructGraphUVEntries(graph); HYPRE_Int **nvneighbors = hypre_SStructGridNVNeighbors(grid); hypre_StructGrid *sgrid; hypre_SStructStencil *stencil; HYPRE_Int *split; HYPRE_Int nvars; HYPRE_Int nrows, nnzs ; HYPRE_BigInt rowstart; HYPRE_Int part, var, entry, b, m, mi; HYPRE_Int *row_sizes; HYPRE_Int max_row_size; hypre_BoxArray *boxes; hypre_Box *box; hypre_Box *ghost_box; hypre_IndexRef start; hypre_Index loop_size, stride; HYPRE_IJMatrixSetObjectType(ijmatrix, HYPRE_PARCSR); #ifdef HYPRE_USING_OPENMP HYPRE_IJMatrixSetOMPFlag(ijmatrix, 1); /* Use OpenMP */ #endif if (matrix_type == HYPRE_SSTRUCT || matrix_type == HYPRE_STRUCT) { rowstart = hypre_SStructGridGhstartRank(grid); nrows = hypre_SStructGridGhlocalSize(grid) ; } else /* matrix_type == HYPRE_PARCSR */ { rowstart = hypre_SStructGridStartRank(grid); nrows = hypre_SStructGridLocalSize(grid); } /* set row sizes */ m = 0; max_row_size = 0; ghost_box = hypre_BoxCreate(ndim); row_sizes = hypre_CTAlloc(HYPRE_Int, nrows, HYPRE_MEMORY_HOST); hypre_SetIndex(stride, 1); for (part = 0; part < nparts; part++) { nvars = hypre_SStructPGridNVars(pgrids[part]); for (var = 0; var < nvars; var++) { sgrid = hypre_SStructPGridSGrid(pgrids[part], var); stencil = stencils[part][var]; split = hypre_SStructMatrixSplit(matrix, part, var); nnzs = 0; for (entry = 0; entry < hypre_SStructStencilSize(stencil); entry++) { if (split[entry] == -1) { nnzs++; } } #if 0 /* TODO: For now, assume stencil is full/complete */ if (hypre_SStructMatrixSymmetric(matrix)) { nnzs = 2 * nnzs - 1; } #endif boxes = hypre_StructGridBoxes(sgrid); hypre_ForBoxI(b, boxes) { box = hypre_BoxArrayBox(boxes, b); hypre_CopyBox(box, ghost_box); if (matrix_type == HYPRE_SSTRUCT || matrix_type == HYPRE_STRUCT) { hypre_BoxGrowByArray(ghost_box, hypre_StructGridNumGhost(sgrid)); } start = hypre_BoxIMin(box); hypre_BoxGetSize(box, loop_size); zypre_BoxLoop1Begin(hypre_SStructMatrixNDim(matrix), loop_size, ghost_box, start, stride, mi); { row_sizes[m + mi] = nnzs; } zypre_BoxLoop1End(mi); m += hypre_BoxVolume(ghost_box); } max_row_size = hypre_max(max_row_size, nnzs); if (nvneighbors[part][var]) { max_row_size = hypre_max(max_row_size, hypre_SStructStencilSize(stencil)); } } } hypre_BoxDestroy(ghost_box); /* GEC0902 essentially for each UVentry we figure out how many extra columns * we need to add to the rowsizes */ /* RDF: THREAD? */ for (entry = 0; entry < nUventries; entry++) { mi = iUventries[entry]; m = hypre_SStructUVEntryRank(Uventries[mi]) - rowstart; if ((m > -1) && (m < nrows)) { row_sizes[m] += hypre_SStructUVEntryNUEntries(Uventries[mi]); max_row_size = hypre_max(max_row_size, row_sizes[m]); } } /* ZTODO: Update row_sizes based on neighbor off-part couplings */ HYPRE_IJMatrixSetRowSizes (ijmatrix, (const HYPRE_Int *) row_sizes); hypre_TFree(row_sizes, HYPRE_MEMORY_HOST); hypre_SStructMatrixTmpSize(matrix) = max_row_size; hypre_SStructMatrixTmpRowCoords(matrix) = hypre_CTAlloc(HYPRE_BigInt, max_row_size, HYPRE_MEMORY_HOST); hypre_SStructMatrixTmpColCoords(matrix) = hypre_CTAlloc(HYPRE_BigInt, max_row_size, HYPRE_MEMORY_HOST); hypre_SStructMatrixTmpCoeffs(matrix) = hypre_CTAlloc(HYPRE_Complex, max_row_size, HYPRE_MEMORY_HOST); HYPRE_IJMatrixInitialize(ijmatrix); HYPRE_IJMatrixGetObject(ijmatrix, (void **) &hypre_SStructMatrixParCSRMatrix(matrix)); return hypre_error_flag; } /*-------------------------------------------------------------------------- * (action > 0): add-to values * (action = 0): set values * (action < 0): get values * * 9/09 - AB: modified to use the box manager - here we need to check the * neighbor box manager also *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SStructUMatrixSetValues( hypre_SStructMatrix *matrix, HYPRE_Int part, hypre_Index index, HYPRE_Int var, HYPRE_Int nentries, HYPRE_Int *entries, HYPRE_Complex *values, HYPRE_Int action ) { HYPRE_Int ndim = hypre_SStructMatrixNDim(matrix); HYPRE_IJMatrix ijmatrix = hypre_SStructMatrixIJMatrix(matrix); hypre_SStructGraph *graph = hypre_SStructMatrixGraph(matrix); hypre_SStructGrid *grid = hypre_SStructGraphGrid(graph); hypre_SStructGrid *dom_grid = hypre_SStructGraphDomainGrid(graph); hypre_SStructStencil *stencil = hypre_SStructGraphStencil(graph, part, var); HYPRE_Int *vars = hypre_SStructStencilVars(stencil); hypre_Index *shape = hypre_SStructStencilShape(stencil); HYPRE_Int size = hypre_SStructStencilSize(stencil); hypre_IndexRef offset; hypre_Index to_index; hypre_SStructUVEntry *Uventry; hypre_BoxManEntry *boxman_entry; hypre_SStructBoxManInfo *entry_info; HYPRE_BigInt row_coord; HYPRE_BigInt *col_coords; HYPRE_Int ncoeffs; HYPRE_Complex *coeffs; HYPRE_Int i, entry; HYPRE_BigInt Uverank; HYPRE_Int matrix_type = hypre_SStructMatrixObjectType(matrix); HYPRE_Complex *h_values; HYPRE_MemoryLocation memory_location = hypre_IJMatrixMemoryLocation(ijmatrix); hypre_SStructGridFindBoxManEntry(grid, part, index, var, &boxman_entry); /* if not local, check neighbors */ if (boxman_entry == NULL) { hypre_SStructGridFindNborBoxManEntry(grid, part, index, var, &boxman_entry); } if (boxman_entry == NULL) { hypre_error_in_arg(1); hypre_error_in_arg(2); hypre_error_in_arg(3); return hypre_error_flag; } else { hypre_BoxManEntryGetInfo(boxman_entry, (void **) &entry_info); } hypre_SStructBoxManEntryGetGlobalRank(boxman_entry, index, &row_coord, matrix_type); col_coords = hypre_SStructMatrixTmpColCoords(matrix); coeffs = hypre_SStructMatrixTmpCoeffs(matrix); if ( hypre_GetExecPolicy1(memory_location) == HYPRE_EXEC_DEVICE ) { h_values = hypre_TAlloc(HYPRE_Complex, nentries, HYPRE_MEMORY_HOST); hypre_TMemcpy(h_values, values, HYPRE_Complex, nentries, HYPRE_MEMORY_HOST, memory_location); } else { h_values = values; } /* RL: TODO Port it to GPU? */ ncoeffs = 0; for (i = 0; i < nentries; i++) { entry = entries[i]; if (entry < size) { /* stencil entries */ offset = shape[entry]; hypre_AddIndexes(index, offset, ndim, to_index); hypre_SStructGridFindBoxManEntry(dom_grid, part, to_index, vars[entry], &boxman_entry); /* if not local, check neighbors */ if (boxman_entry == NULL) { hypre_SStructGridFindNborBoxManEntry(dom_grid, part, to_index, vars[entry], &boxman_entry); } if (boxman_entry != NULL) { hypre_SStructBoxManEntryGetGlobalRank(boxman_entry, to_index, &col_coords[ncoeffs], matrix_type); coeffs[ncoeffs] = h_values[i]; ncoeffs++; } } else { /* non-stencil entries */ entry -= size; hypre_SStructGraphGetUVEntryRank(graph, part, var, index, &Uverank); if (Uverank > -1) { Uventry = hypre_SStructGraphUVEntry(graph, Uverank); col_coords[ncoeffs] = hypre_SStructUVEntryToRank(Uventry, entry); coeffs[ncoeffs] = h_values[i]; ncoeffs++; } } } #if defined(HYPRE_USING_GPU) if ( hypre_GetExecPolicy1(memory_location) == HYPRE_EXEC_DEVICE ) { if (!hypre_SStructMatrixTmpRowCoordsDevice(matrix)) { hypre_SStructMatrixTmpRowCoordsDevice(matrix) = hypre_CTAlloc(HYPRE_BigInt, hypre_SStructMatrixTmpSize(matrix), memory_location); } if (!hypre_SStructMatrixTmpColCoordsDevice(matrix)) { hypre_SStructMatrixTmpColCoordsDevice(matrix) = hypre_CTAlloc(HYPRE_BigInt, hypre_SStructMatrixTmpSize(matrix), memory_location); } if (!hypre_SStructMatrixTmpCoeffsDevice(matrix)) { hypre_SStructMatrixTmpCoeffsDevice(matrix) = hypre_CTAlloc(HYPRE_Complex, hypre_SStructMatrixTmpSize(matrix), memory_location); } hypreDevice_BigIntFilln(hypre_SStructMatrixTmpRowCoordsDevice(matrix), ncoeffs, row_coord); hypre_TMemcpy(hypre_SStructMatrixTmpColCoordsDevice(matrix), col_coords, HYPRE_BigInt, ncoeffs, memory_location, HYPRE_MEMORY_HOST); hypre_TMemcpy(hypre_SStructMatrixTmpCoeffsDevice(matrix), coeffs, HYPRE_Complex, ncoeffs, memory_location, HYPRE_MEMORY_HOST); if (action > 0) { HYPRE_IJMatrixAddToValues(ijmatrix, ncoeffs, NULL, hypre_SStructMatrixTmpRowCoordsDevice(matrix), (const HYPRE_BigInt *) hypre_SStructMatrixTmpColCoordsDevice(matrix), (const HYPRE_Complex *) hypre_SStructMatrixTmpCoeffsDevice(matrix)); } else if (action > -1) { HYPRE_IJMatrixSetValues(ijmatrix, ncoeffs, NULL, hypre_SStructMatrixTmpRowCoordsDevice(matrix), (const HYPRE_BigInt *) hypre_SStructMatrixTmpColCoordsDevice(matrix), (const HYPRE_Complex *) hypre_SStructMatrixTmpCoeffsDevice(matrix)); } else { // RL:TODO HYPRE_IJMatrixGetValues(ijmatrix, 1, &ncoeffs, &row_coord, col_coords, values); } } else #endif { if (action > 0) { HYPRE_IJMatrixAddToValues(ijmatrix, 1, &ncoeffs, &row_coord, (const HYPRE_BigInt *) col_coords, (const HYPRE_Complex *) coeffs); } else if (action > -1) { HYPRE_IJMatrixSetValues(ijmatrix, 1, &ncoeffs, &row_coord, (const HYPRE_BigInt *) col_coords, (const HYPRE_Complex *) coeffs); } else { HYPRE_IJMatrixGetValues(ijmatrix, 1, &ncoeffs, &row_coord, col_coords, values); } } if (h_values != values) { hypre_TFree(h_values, HYPRE_MEMORY_HOST); } return hypre_error_flag; } /*-------------------------------------------------------------------------- * Note: Entries must all be of type stencil or non-stencil, but not both. * * (action > 0): add-to values * (action = 0): set values * (action < 0): get values * * 9/09 - AB: modified to use the box manager- here we need to check the * neighbor box manager also * * To illustrate what is computed below before calling IJSetValues2(), consider * the following example of a 5-pt stencil (c,w,e,s,n) on a 3x2 grid (the 'x' in * arrays 'cols' and 'ijvalues' indicates "no data"): * * nrows = 6 * ncols = 3 4 3 3 4 3 * rows = 0 1 2 3 4 5 * row_indexes = 0 5 10 15 20 25 * cols = . . . x x . . . . x . . . x x . . . x x . . . . x . . . x x * ijvalues = . . . x x . . . . x . . . x x . . . x x . . . . x . . . x x * entry = c e n c w e n c w n c e s c w e s c w s *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SStructUMatrixSetBoxValues( hypre_SStructMatrix *matrix, HYPRE_Int part, hypre_Box *set_box, HYPRE_Int var, HYPRE_Int nentries, HYPRE_Int *entries, hypre_Box *value_box, HYPRE_Complex *values, HYPRE_Int action ) { HYPRE_Int ndim = hypre_SStructMatrixNDim(matrix); HYPRE_IJMatrix ijmatrix = hypre_SStructMatrixIJMatrix(matrix); hypre_SStructGraph *graph = hypre_SStructMatrixGraph(matrix); hypre_SStructGrid *grid = hypre_SStructGraphGrid(graph); hypre_SStructGrid *dom_grid = hypre_SStructGraphDomainGrid(graph); hypre_SStructStencil *stencil = hypre_SStructGraphStencil(graph, part, var); HYPRE_Int *vars = hypre_SStructStencilVars(stencil); hypre_Index *shape = hypre_SStructStencilShape(stencil); HYPRE_Int size = hypre_SStructStencilSize(stencil); hypre_IndexRef offset; hypre_BoxManEntry **boxman_entries; HYPRE_Int nboxman_entries; hypre_BoxManEntry **boxman_to_entries; HYPRE_Int nboxman_to_entries; HYPRE_Int nrows; HYPRE_Int *ncols, *row_indexes;; HYPRE_BigInt *rows, *cols; HYPRE_Complex *ijvalues; hypre_Box *box = hypre_BoxCreate(ndim); hypre_Box *to_box; hypre_Box *map_box; hypre_Box *int_box; hypre_Index index, stride, loop_size; hypre_IndexRef start; hypre_Index rs, cs; HYPRE_BigInt row_base, col_base; HYPRE_Int ei, entry, ii, jj; HYPRE_Int matrix_type = hypre_SStructMatrixObjectType(matrix); HYPRE_MemoryLocation memory_location = hypre_IJMatrixMemoryLocation(ijmatrix); /*------------------------------------------ * all stencil entries *------------------------------------------*/ if (entries[0] < size) { to_box = hypre_BoxCreate(ndim); map_box = hypre_BoxCreate(ndim); int_box = hypre_BoxCreate(ndim); nrows = hypre_BoxVolume(set_box); ncols = hypre_CTAlloc(HYPRE_Int, nrows, memory_location); rows = hypre_CTAlloc(HYPRE_BigInt, nrows, memory_location); row_indexes = hypre_CTAlloc(HYPRE_Int, nrows, memory_location); cols = hypre_CTAlloc(HYPRE_BigInt, nrows * nentries, memory_location); ijvalues = hypre_CTAlloc(HYPRE_Complex, nrows * nentries, memory_location); hypre_SetIndex(stride, 1); hypre_SStructGridIntersect(grid, part, var, set_box, -1, &boxman_entries, &nboxman_entries); for (ii = 0; ii < nboxman_entries; ii++) { hypre_SStructBoxManEntryGetStrides(boxman_entries[ii], rs, matrix_type); hypre_CopyBox(set_box, box); hypre_BoxManEntryGetExtents(boxman_entries[ii], hypre_BoxIMin(map_box), hypre_BoxIMax(map_box)); hypre_IntersectBoxes(box, map_box, int_box); hypre_CopyBox(int_box, box); /* For each index in 'box', compute a row of length <= nentries and * insert it into an nentries-length segment of 'cols' and 'ijvalues'. * This may result in gaps, but IJSetValues2() is designed for that. */ nrows = hypre_BoxVolume(box); #undef DEVICE_VAR #define DEVICE_VAR is_device_ptr(ncols,row_indexes) hypre_LoopBegin(nrows, i) { ncols[i] = 0; row_indexes[i] = i * nentries; } hypre_LoopEnd() #undef DEVICE_VAR #define DEVICE_VAR for (ei = 0; ei < nentries; ei++) { entry = entries[ei]; hypre_CopyBox(box, to_box); offset = shape[entry]; hypre_BoxShiftPos(to_box, offset); hypre_SStructGridIntersect(dom_grid, part, vars[entry], to_box, -1, &boxman_to_entries, &nboxman_to_entries); for (jj = 0; jj < nboxman_to_entries; jj++) { hypre_SStructBoxManEntryGetStrides(boxman_to_entries[jj], cs, matrix_type); hypre_BoxManEntryGetExtents(boxman_to_entries[jj], hypre_BoxIMin(map_box), hypre_BoxIMax(map_box)); hypre_IntersectBoxes(to_box, map_box, int_box); hypre_CopyIndex(hypre_BoxIMin(int_box), index); hypre_SStructBoxManEntryGetGlobalRank(boxman_to_entries[jj], index, &col_base, matrix_type); hypre_BoxShiftNeg(int_box, offset); hypre_CopyIndex(hypre_BoxIMin(int_box), index); hypre_SStructBoxManEntryGetGlobalRank(boxman_entries[ii], index, &row_base, matrix_type); start = hypre_BoxIMin(int_box); hypre_BoxGetSize(int_box, loop_size); #if defined(HYPRE_USING_GPU) { hypre_assert(ndim <= 3); HYPRE_Int rs_0, rs_1, rs_2; HYPRE_Int cs_0, cs_1, cs_2; if (ndim > 0) { rs_0 = rs[0]; cs_0 = cs[0]; } if (ndim > 1) { rs_1 = rs[1]; cs_1 = cs[1]; } if (ndim > 2) { rs_2 = rs[2]; cs_2 = cs[2]; } #undef DEVICE_VAR #define DEVICE_VAR is_device_ptr(ncols,rows,cols,ijvalues,values) hypre_BoxLoop2Begin(ndim, loop_size, box, start, stride, mi, value_box, start, stride, vi); { hypre_Index index; HYPRE_Int ci; hypre_BoxLoopGetIndex(index); ci = mi * nentries + ncols[mi]; rows[mi] = row_base; cols[ci] = col_base; if (ndim > 0) { rows[mi] += index[0] * rs_0; cols[ci] += index[0] * cs_0; } if (ndim > 1) { rows[mi] += index[1] * rs_1; cols[ci] += index[1] * cs_1; } if (ndim > 2) { rows[mi] += index[2] * rs_2; cols[ci] += index[2] * cs_2; } ijvalues[ci] = values[ei + vi * nentries]; ncols[mi]++; } hypre_BoxLoop2End(mi, vi); #undef DEVICE_VAR #define DEVICE_VAR } #else { hypre_BoxLoop2Begin(ndim, loop_size, box, start, stride, mi, value_box, start, stride, vi); { hypre_Index index; HYPRE_Int ci; hypre_BoxLoopGetIndex(index); ci = mi * nentries + ncols[mi]; rows[mi] = row_base; cols[ci] = col_base; HYPRE_Int d; for (d = 0; d < ndim; d++) { rows[mi] += index[d] * rs[d]; cols[ci] += index[d] * cs[d]; } ijvalues[ci] = values[ei + vi * nentries]; ncols[mi]++; } hypre_BoxLoop2End(mi, vi); } #endif } /* end loop through boxman to entries */ hypre_TFree(boxman_to_entries, HYPRE_MEMORY_HOST); } /* end of ei nentries loop */ if (action > 0) { HYPRE_IJMatrixAddToValues2(ijmatrix, nrows, ncols, (const HYPRE_BigInt *) rows, (const HYPRE_Int *) row_indexes, (const HYPRE_BigInt *) cols, (const HYPRE_Complex *) ijvalues); } else if (action > -1) { HYPRE_IJMatrixSetValues2(ijmatrix, nrows, ncols, (const HYPRE_BigInt *) rows, (const HYPRE_Int *) row_indexes, (const HYPRE_BigInt *) cols, (const HYPRE_Complex *) ijvalues); } else { HYPRE_IJMatrixGetValues(ijmatrix, nrows, ncols, rows, cols, values); } } /* end loop through boxman entries */ hypre_TFree(boxman_entries, HYPRE_MEMORY_HOST); hypre_TFree(ncols, memory_location); hypre_TFree(rows, memory_location); hypre_TFree(row_indexes, memory_location); hypre_TFree(cols, memory_location); hypre_TFree(ijvalues, memory_location); hypre_BoxDestroy(to_box); hypre_BoxDestroy(map_box); hypre_BoxDestroy(int_box); } /*------------------------------------------ * non-stencil entries *------------------------------------------*/ else { /* RDF: THREAD (Check safety on UMatrixSetValues call) */ hypre_BoxGetSize(set_box, loop_size); hypre_SerialBoxLoop0Begin(ndim, loop_size); { zypre_BoxLoopGetIndex(index); hypre_AddIndexes(index, hypre_BoxIMin(set_box), ndim, index); hypre_SStructUMatrixSetValues(matrix, part, index, var, nentries, entries, values, action); values += nentries; } hypre_SerialBoxLoop0End(); } hypre_BoxDestroy(box); return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SStructUMatrixAssemble( hypre_SStructMatrix *matrix ) { HYPRE_IJMatrix ijmatrix = hypre_SStructMatrixIJMatrix(matrix); HYPRE_IJMatrixAssemble(ijmatrix); return hypre_error_flag; } /*========================================================================== * SStructMatrix routines *==========================================================================*/ /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SStructMatrixRef( hypre_SStructMatrix *matrix, hypre_SStructMatrix **matrix_ref ) { hypre_SStructMatrixRefCount(matrix) ++; *matrix_ref = matrix; return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SStructMatrixSplitEntries( hypre_SStructMatrix *matrix, HYPRE_Int part, HYPRE_Int var, HYPRE_Int nentries, HYPRE_Int *entries, HYPRE_Int *nSentries_ptr, HYPRE_Int **Sentries_ptr, HYPRE_Int *nUentries_ptr, HYPRE_Int **Uentries_ptr ) { hypre_SStructGraph *graph = hypre_SStructMatrixGraph(matrix); HYPRE_Int *split = hypre_SStructMatrixSplit(matrix, part, var); hypre_SStructStencil *stencil = hypre_SStructGraphStencil(graph, part, var); HYPRE_Int entry; HYPRE_Int i; HYPRE_Int nSentries = 0; HYPRE_Int *Sentries = hypre_SStructMatrixSEntries(matrix); HYPRE_Int nUentries = 0; HYPRE_Int *Uentries = hypre_SStructMatrixUEntries(matrix); for (i = 0; i < nentries; i++) { entry = entries[i]; if (entry < hypre_SStructStencilSize(stencil)) { /* stencil entries */ if (split[entry] > -1) { Sentries[nSentries] = split[entry]; nSentries++; } else { Uentries[nUentries] = entry; nUentries++; } } else { /* non-stencil entries */ Uentries[nUentries] = entry; nUentries++; } } *nSentries_ptr = nSentries; *Sentries_ptr = Sentries; *nUentries_ptr = nUentries; *Uentries_ptr = Uentries; return hypre_error_flag; } /*-------------------------------------------------------------------------- * (action > 0): add-to values * (action = 0): set values * (action < 0): get values * (action =-2): get values and zero out *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SStructMatrixSetValues( HYPRE_SStructMatrix matrix, HYPRE_Int part, HYPRE_Int *index, HYPRE_Int var, HYPRE_Int nentries, HYPRE_Int *entries, HYPRE_Complex *values, HYPRE_Int action ) { HYPRE_Int ndim = hypre_SStructMatrixNDim(matrix); hypre_SStructGraph *graph = hypre_SStructMatrixGraph(matrix); hypre_SStructGrid *grid = hypre_SStructGraphGrid(graph); HYPRE_Int **nvneighbors = hypre_SStructGridNVNeighbors(grid); HYPRE_Int *Sentries; HYPRE_Int *Uentries; HYPRE_Int nSentries; HYPRE_Int nUentries; hypre_SStructPMatrix *pmatrix; hypre_Index cindex; hypre_SStructMatrixSplitEntries(matrix, part, var, nentries, entries, &nSentries, &Sentries, &nUentries, &Uentries); hypre_CopyToCleanIndex(index, ndim, cindex); /* S-matrix */ if (nSentries > 0) { pmatrix = hypre_SStructMatrixPMatrix(matrix, part); hypre_SStructPMatrixSetValues(pmatrix, cindex, var, nSentries, Sentries, values, action); /* put inter-part couplings in UMatrix and zero them out in PMatrix * (possibly in ghost zones) */ if (nvneighbors[part][var] > 0) { hypre_Box *set_box; HYPRE_Int d; /* This creates boxes with zeroed-out extents */ set_box = hypre_BoxCreate(ndim); for (d = 0; d < ndim; d++) { hypre_BoxIMinD(set_box, d) = cindex[d]; hypre_BoxIMaxD(set_box, d) = cindex[d]; } hypre_SStructMatrixSetInterPartValues(matrix, part, set_box, var, nSentries, entries, set_box, values, action); hypre_BoxDestroy(set_box); } } /* U-matrix */ if (nUentries > 0) { hypre_SStructUMatrixSetValues(matrix, part, cindex, var, nUentries, Uentries, values, action); } return hypre_error_flag; } /*-------------------------------------------------------------------------- * (action > 0): add-to values * (action = 0): set values * (action < 0): get values * (action =-2): get values and zero out *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SStructMatrixSetBoxValues( HYPRE_SStructMatrix matrix, HYPRE_Int part, hypre_Box *set_box, HYPRE_Int var, HYPRE_Int nentries, HYPRE_Int *entries, hypre_Box *value_box, HYPRE_Complex *values, HYPRE_Int action ) { hypre_SStructGraph *graph = hypre_SStructMatrixGraph(matrix); hypre_SStructGrid *grid = hypre_SStructGraphGrid(graph); HYPRE_Int **nvneighbors = hypre_SStructGridNVNeighbors(grid); HYPRE_Int *Sentries; HYPRE_Int *Uentries; HYPRE_Int nSentries; HYPRE_Int nUentries; hypre_SStructPMatrix *pmatrix; hypre_SStructMatrixSplitEntries(matrix, part, var, nentries, entries, &nSentries, &Sentries, &nUentries, &Uentries); /* S-matrix */ if (nSentries > 0) { pmatrix = hypre_SStructMatrixPMatrix(matrix, part); hypre_SStructPMatrixSetBoxValues(pmatrix, set_box, var, nSentries, Sentries, value_box, values, action); /* put inter-part couplings in UMatrix and zero them out in PMatrix * (possibly in ghost zones) */ if (nvneighbors[part][var] > 0) { hypre_SStructMatrixSetInterPartValues(matrix, part, set_box, var, nSentries, entries, value_box, values, action); } } /* U-matrix */ if (nUentries > 0) { hypre_SStructUMatrixSetBoxValues(matrix, part, set_box, var, nUentries, Uentries, value_box, values, action); } return hypre_error_flag; } /*-------------------------------------------------------------------------- * Put inter-part couplings in UMatrix and zero them out in PMatrix (possibly in * ghost zones). Assumes that all entries are stencil entries. *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SStructMatrixSetInterPartValues( HYPRE_SStructMatrix matrix, HYPRE_Int part, hypre_Box *set_box, HYPRE_Int var, HYPRE_Int nentries, HYPRE_Int *entries, hypre_Box *value_box, HYPRE_Complex *values, HYPRE_Int action ) { HYPRE_Int ndim = hypre_SStructMatrixNDim(matrix); hypre_SStructGraph *graph = hypre_SStructMatrixGraph(matrix); hypre_SStructGrid *grid = hypre_SStructGraphGrid(graph); hypre_SStructPMatrix *pmatrix; hypre_SStructPGrid *pgrid; hypre_SStructStencil *stencil; hypre_Index *shape; HYPRE_Int *smap; HYPRE_Int *vars, frvartype, tovartype; hypre_StructMatrix *smatrix; hypre_Box *box, *ibox0, *ibox1, *tobox, *frbox; hypre_Index stride, loop_size; hypre_IndexRef offset, start; hypre_BoxManEntry **frentries, **toentries; hypre_SStructBoxManInfo *frinfo, *toinfo; HYPRE_Complex *tvalues = NULL; HYPRE_Int tvalues_size = 0; HYPRE_Int nfrentries, ntoentries, frpart, topart; HYPRE_Int entry, sentry, ei, fri, toi; HYPRE_MemoryLocation memory_location = hypre_IJMatrixMemoryLocation(hypre_SStructMatrixIJMatrix( matrix)); pmatrix = hypre_SStructMatrixPMatrix(matrix, part); pgrid = hypre_SStructPMatrixPGrid(pmatrix); frvartype = hypre_SStructPGridVarType(pgrid, var); box = hypre_BoxCreate(ndim); ibox0 = hypre_BoxCreate(ndim); ibox1 = hypre_BoxCreate(ndim); tobox = hypre_BoxCreate(ndim); frbox = hypre_BoxCreate(ndim); stencil = hypre_SStructPMatrixStencil(pmatrix, var); smap = hypre_SStructPMatrixSMap(pmatrix, var); shape = hypre_SStructStencilShape(stencil); vars = hypre_SStructStencilVars(stencil); hypre_SetIndex(stride, 1); for (ei = 0; ei < nentries; ei++) { entry = entries[ei]; sentry = smap[entry]; offset = shape[entry]; smatrix = hypre_SStructPMatrixSMatrix(pmatrix, var, vars[entry]); tovartype = hypre_SStructPGridVarType(pgrid, vars[entry]); /* shift box in the stencil offset direction */ hypre_CopyBox(set_box, box); hypre_AddIndexes(hypre_BoxIMin(box), offset, ndim, hypre_BoxIMin(box)); hypre_AddIndexes(hypre_BoxIMax(box), offset, ndim, hypre_BoxIMax(box)); /* get "to" entries */ hypre_SStructGridIntersect(grid, part, vars[entry], box, -1, &toentries, &ntoentries); for (toi = 0; toi < ntoentries; toi++) { hypre_BoxManEntryGetExtents( toentries[toi], hypre_BoxIMin(tobox), hypre_BoxIMax(tobox)); hypre_IntersectBoxes(box, tobox, ibox0); if (hypre_BoxVolume(ibox0)) { hypre_SStructBoxManEntryGetPart(toentries[toi], part, &topart); /* shift ibox0 back */ hypre_SubtractIndexes(hypre_BoxIMin(ibox0), offset, ndim, hypre_BoxIMin(ibox0)); hypre_SubtractIndexes(hypre_BoxIMax(ibox0), offset, ndim, hypre_BoxIMax(ibox0)); /* get "from" entries */ hypre_SStructGridIntersect(grid, part, var, ibox0, -1, &frentries, &nfrentries); for (fri = 0; fri < nfrentries; fri++) { /* don't set couplings within the same part unless possibly for * cell data (to simplify periodic conditions for users) */ hypre_SStructBoxManEntryGetPart(frentries[fri], part, &frpart); if (topart == frpart) { if ( (frvartype != HYPRE_SSTRUCT_VARIABLE_CELL) || (tovartype != HYPRE_SSTRUCT_VARIABLE_CELL) ) { continue; } hypre_BoxManEntryGetInfo(frentries[fri], (void **) &frinfo); hypre_BoxManEntryGetInfo(toentries[toi], (void **) &toinfo); if ( hypre_SStructBoxManInfoType(frinfo) == hypre_SStructBoxManInfoType(toinfo) ) { continue; } } hypre_BoxManEntryGetExtents( frentries[fri], hypre_BoxIMin(frbox), hypre_BoxIMax(frbox)); hypre_IntersectBoxes(ibox0, frbox, ibox1); if (hypre_BoxVolume(ibox1)) { HYPRE_Int tvalues_new_size = hypre_BoxVolume(ibox1); tvalues = hypre_TReAlloc_v2(tvalues, HYPRE_Complex, tvalues_size, HYPRE_Complex, tvalues_new_size, memory_location); tvalues_size = tvalues_new_size; if (action >= 0) { /* set or add */ /* copy values into tvalues */ start = hypre_BoxIMin(ibox1); hypre_BoxGetSize(ibox1, loop_size); #undef DEVICE_VAR #define DEVICE_VAR is_device_ptr(tvalues,values) hypre_BoxLoop2Begin(ndim, loop_size, ibox1, start, stride, mi, value_box, start, stride, vi); { tvalues[mi] = values[ei + vi * nentries]; } hypre_BoxLoop2End(mi, vi); #undef DEVICE_VAR #define DEVICE_VAR /* put values into UMatrix */ hypre_SStructUMatrixSetBoxValues( matrix, part, ibox1, var, 1, &entry, ibox1, tvalues, action); /* zero out values in PMatrix (possibly in ghost) */ hypre_StructMatrixClearBoxValues( smatrix, ibox1, 1, &sentry, -1, 1); } else { /* get */ /* get values from UMatrix */ hypre_SStructUMatrixSetBoxValues( matrix, part, ibox1, var, 1, &entry, ibox1, tvalues, action); /* copy tvalues into values */ start = hypre_BoxIMin(ibox1); hypre_BoxGetSize(ibox1, loop_size); #undef DEVICE_VAR #define DEVICE_VAR is_device_ptr(tvalues,values) hypre_BoxLoop2Begin(ndim, loop_size, ibox1, start, stride, mi, value_box, start, stride, vi); { values[ei + vi * nentries] = tvalues[mi]; } hypre_BoxLoop2End(mi, vi); #undef DEVICE_VAR #define DEVICE_VAR } /* end if action */ } /* end if nonzero ibox1 */ } /* end of "from" boxman entries loop */ hypre_TFree(frentries, HYPRE_MEMORY_HOST); } /* end if nonzero ibox0 */ } /* end of "to" boxman entries loop */ hypre_TFree(toentries, HYPRE_MEMORY_HOST); } /* end of entries loop */ hypre_BoxDestroy(box); hypre_BoxDestroy(ibox0); hypre_BoxDestroy(ibox1); hypre_BoxDestroy(tobox); hypre_BoxDestroy(frbox); hypre_TFree(tvalues, memory_location); return hypre_error_flag; } HYPRE_MemoryLocation hypre_SStructMatrixMemoryLocation(hypre_SStructMatrix *matrix) { HYPRE_Int type = hypre_SStructMatrixObjectType(matrix); if (type == HYPRE_SSTRUCT) { return hypre_ParCSRMatrixMemoryLocation(hypre_SStructMatrixParCSRMatrix(matrix)); } void *object; HYPRE_SStructMatrixGetObject(matrix, &object); if (type == HYPRE_PARCSR) { return hypre_ParCSRMatrixMemoryLocation((hypre_ParCSRMatrix *) object); } if (type == HYPRE_STRUCT) { return hypre_StructMatrixMemoryLocation((hypre_StructMatrix *) object); } return HYPRE_MEMORY_UNDEFINED; } hypre-2.33.0/src/sstruct_mv/sstruct_matrix.h000066400000000000000000000146551477326011500212130ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * Header info for the hypre_SStructMatrix structures * *****************************************************************************/ #ifndef hypre_SSTRUCT_MATRIX_HEADER #define hypre_SSTRUCT_MATRIX_HEADER /*-------------------------------------------------------------------------- * hypre_SStructMatrix: *--------------------------------------------------------------------------*/ typedef struct { MPI_Comm comm; hypre_SStructPGrid *pgrid; hypre_SStructStencil **stencils; /* nvar array of stencils */ HYPRE_Int nvars; HYPRE_Int **smaps; hypre_StructStencil ***sstencils; /* nvar x nvar array of sstencils */ hypre_StructMatrix ***smatrices; /* nvar x nvar array of smatrices */ HYPRE_Int **symmetric; /* Stencil entries symmetric? * (nvar x nvar array) */ /* temporary storage for SetValues routines */ HYPRE_Int sentries_size; HYPRE_Int *sentries; HYPRE_Int accumulated; /* AddTo values accumulated? */ HYPRE_Int ref_count; } hypre_SStructPMatrix; typedef struct hypre_SStructMatrix_struct { MPI_Comm comm; HYPRE_Int ndim; hypre_SStructGraph *graph; HYPRE_Int ***splits; /* S/U-matrix split for each stencil */ /* S-matrix info */ HYPRE_Int nparts; hypre_SStructPMatrix **pmatrices; HYPRE_Int ***symmetric; /* Stencil entries symmetric? * (nparts x nvar x nvar array) */ /* U-matrix info */ HYPRE_IJMatrix ijmatrix; hypre_ParCSRMatrix *parcsrmatrix; /* temporary storage for SetValues routines */ HYPRE_Int entries_size; HYPRE_Int *Sentries; HYPRE_Int *Uentries; HYPRE_Int tmp_size; /* size of the following 3 */ HYPRE_BigInt *tmp_row_coords; HYPRE_BigInt *tmp_col_coords; HYPRE_Complex *tmp_coeffs; HYPRE_BigInt *d_tmp_row_coords; HYPRE_BigInt *d_tmp_col_coords; HYPRE_Complex *d_tmp_coeffs; HYPRE_Int ns_symmetric; /* Non-stencil entries symmetric? */ HYPRE_Int global_size; /* Total number of nonzero coeffs */ HYPRE_Int ref_count; /* GEC0902 adding an object type to the matrix */ HYPRE_Int object_type; } hypre_SStructMatrix; /*-------------------------------------------------------------------------- * Accessor macros: hypre_SStructMatrix *--------------------------------------------------------------------------*/ #define hypre_SStructMatrixComm(mat) ((mat) -> comm) #define hypre_SStructMatrixNDim(mat) ((mat) -> ndim) #define hypre_SStructMatrixGraph(mat) ((mat) -> graph) #define hypre_SStructMatrixSplits(mat) ((mat) -> splits) #define hypre_SStructMatrixSplit(mat, p, v) ((mat) -> splits[p][v]) #define hypre_SStructMatrixNParts(mat) ((mat) -> nparts) #define hypre_SStructMatrixPMatrices(mat) ((mat) -> pmatrices) #define hypre_SStructMatrixPMatrix(mat, part) ((mat) -> pmatrices[part]) #define hypre_SStructMatrixSymmetric(mat) ((mat) -> symmetric) #define hypre_SStructMatrixIJMatrix(mat) ((mat) -> ijmatrix) #define hypre_SStructMatrixParCSRMatrix(mat) ((mat) -> parcsrmatrix) #define hypre_SStructMatrixEntriesSize(mat) ((mat) -> entries_size) #define hypre_SStructMatrixSEntries(mat) ((mat) -> Sentries) #define hypre_SStructMatrixUEntries(mat) ((mat) -> Uentries) #define hypre_SStructMatrixTmpSize(mat) ((mat) -> tmp_size) #define hypre_SStructMatrixTmpRowCoords(mat) ((mat) -> tmp_row_coords) #define hypre_SStructMatrixTmpColCoords(mat) ((mat) -> tmp_col_coords) #define hypre_SStructMatrixTmpCoeffs(mat) ((mat) -> tmp_coeffs) #define hypre_SStructMatrixTmpRowCoordsDevice(mat) ((mat) -> d_tmp_row_coords) #define hypre_SStructMatrixTmpColCoordsDevice(mat) ((mat) -> d_tmp_col_coords) #define hypre_SStructMatrixTmpCoeffsDevice(mat) ((mat) -> d_tmp_coeffs) #define hypre_SStructMatrixNSSymmetric(mat) ((mat) -> ns_symmetric) #define hypre_SStructMatrixGlobalSize(mat) ((mat) -> global_size) #define hypre_SStructMatrixRefCount(mat) ((mat) -> ref_count) #define hypre_SStructMatrixObjectType(mat) ((mat) -> object_type) /*-------------------------------------------------------------------------- * Accessor macros: hypre_SStructPMatrix *--------------------------------------------------------------------------*/ #define hypre_SStructPMatrixComm(pmat) ((pmat) -> comm) #define hypre_SStructPMatrixPGrid(pmat) ((pmat) -> pgrid) #define hypre_SStructPMatrixNDim(pmat) \ hypre_SStructPGridNDim(hypre_SStructPMatrixPGrid(pmat)) #define hypre_SStructPMatrixStencils(pmat) ((pmat) -> stencils) #define hypre_SStructPMatrixNVars(pmat) ((pmat) -> nvars) #define hypre_SStructPMatrixStencil(pmat, var) ((pmat) -> stencils[var]) #define hypre_SStructPMatrixSMaps(pmat) ((pmat) -> smaps) #define hypre_SStructPMatrixSMap(pmat, var) ((pmat) -> smaps[var]) #define hypre_SStructPMatrixSStencils(pmat) ((pmat) -> sstencils) #define hypre_SStructPMatrixSStencil(pmat, vi, vj) \ ((pmat) -> sstencils[vi][vj]) #define hypre_SStructPMatrixSMatrices(pmat) ((pmat) -> smatrices) #define hypre_SStructPMatrixSMatrix(pmat, vi, vj) \ ((pmat) -> smatrices[vi][vj]) #define hypre_SStructPMatrixSymmetric(pmat) ((pmat) -> symmetric) #define hypre_SStructPMatrixSEntriesSize(pmat) ((pmat) -> sentries_size) #define hypre_SStructPMatrixSEntries(pmat) ((pmat) -> sentries) #define hypre_SStructPMatrixAccumulated(pmat) ((pmat) -> accumulated) #define hypre_SStructPMatrixRefCount(pmat) ((pmat) -> ref_count) #endif hypre-2.33.0/src/sstruct_mv/sstruct_matvec.c000066400000000000000000000313601477326011500211510ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * SStruct matrix-vector multiply routine * *****************************************************************************/ #include "_hypre_sstruct_mv.h" /*========================================================================== * PMatvec routines *==========================================================================*/ /*-------------------------------------------------------------------------- * hypre_SStructPMatvecData data structure *--------------------------------------------------------------------------*/ typedef struct { HYPRE_Int nvars; void ***smatvec_data; } hypre_SStructPMatvecData; /*-------------------------------------------------------------------------- * hypre_SStructPMatvecCreate *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SStructPMatvecCreate( void **pmatvec_vdata_ptr ) { hypre_SStructPMatvecData *pmatvec_data; pmatvec_data = hypre_CTAlloc(hypre_SStructPMatvecData, 1, HYPRE_MEMORY_HOST); *pmatvec_vdata_ptr = (void *) pmatvec_data; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_SStructPMatvecSetup *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SStructPMatvecSetup( void *pmatvec_vdata, hypre_SStructPMatrix *pA, hypre_SStructPVector *px ) { hypre_SStructPMatvecData *pmatvec_data = (hypre_SStructPMatvecData *)pmatvec_vdata; HYPRE_Int nvars; void ***smatvec_data; hypre_StructMatrix *sA; hypre_StructVector *sx; HYPRE_Int vi, vj; nvars = hypre_SStructPMatrixNVars(pA); smatvec_data = hypre_TAlloc(void **, nvars, HYPRE_MEMORY_HOST); for (vi = 0; vi < nvars; vi++) { smatvec_data[vi] = hypre_TAlloc(void *, nvars, HYPRE_MEMORY_HOST); for (vj = 0; vj < nvars; vj++) { sA = hypre_SStructPMatrixSMatrix(pA, vi, vj); sx = hypre_SStructPVectorSVector(px, vj); smatvec_data[vi][vj] = NULL; if (sA != NULL) { smatvec_data[vi][vj] = hypre_StructMatvecCreate(); hypre_StructMatvecSetup(smatvec_data[vi][vj], sA, sx); } } } (pmatvec_data -> nvars) = nvars; (pmatvec_data -> smatvec_data) = smatvec_data; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_SStructPMatvecCompute *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SStructPMatvecCompute( void *pmatvec_vdata, HYPRE_Complex alpha, hypre_SStructPMatrix *pA, hypre_SStructPVector *px, HYPRE_Complex beta, hypre_SStructPVector *py ) { hypre_SStructPMatvecData *pmatvec_data = (hypre_SStructPMatvecData *)pmatvec_vdata; HYPRE_Int nvars = (pmatvec_data -> nvars); void ***smatvec_data = (pmatvec_data -> smatvec_data); void *sdata; hypre_StructMatrix *sA; hypre_StructVector *sx; hypre_StructVector *sy; HYPRE_Int vi, vj; for (vi = 0; vi < nvars; vi++) { sy = hypre_SStructPVectorSVector(py, vi); /* diagonal block computation */ if (smatvec_data[vi][vi] != NULL) { sdata = smatvec_data[vi][vi]; sA = hypre_SStructPMatrixSMatrix(pA, vi, vi); sx = hypre_SStructPVectorSVector(px, vi); hypre_StructMatvecCompute(sdata, alpha, sA, sx, beta, sy); } else { hypre_StructScale(beta, sy); } /* off-diagonal block computation */ for (vj = 0; vj < nvars; vj++) { if ((smatvec_data[vi][vj] != NULL) && (vj != vi)) { sdata = smatvec_data[vi][vj]; sA = hypre_SStructPMatrixSMatrix(pA, vi, vj); sx = hypre_SStructPVectorSVector(px, vj); hypre_StructMatvecCompute(sdata, alpha, sA, sx, 1.0, sy); } } } return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_SStructPMatvecDestroy *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SStructPMatvecDestroy( void *pmatvec_vdata ) { hypre_SStructPMatvecData *pmatvec_data = (hypre_SStructPMatvecData *)pmatvec_vdata; HYPRE_Int nvars; void ***smatvec_data; HYPRE_Int vi, vj; if (pmatvec_data) { nvars = (pmatvec_data -> nvars); smatvec_data = (pmatvec_data -> smatvec_data); for (vi = 0; vi < nvars; vi++) { for (vj = 0; vj < nvars; vj++) { if (smatvec_data[vi][vj] != NULL) { hypre_StructMatvecDestroy(smatvec_data[vi][vj]); } } hypre_TFree(smatvec_data[vi], HYPRE_MEMORY_HOST); } hypre_TFree(smatvec_data, HYPRE_MEMORY_HOST); hypre_TFree(pmatvec_data, HYPRE_MEMORY_HOST); } return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_SStructPMatvec *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SStructPMatvec( HYPRE_Complex alpha, hypre_SStructPMatrix *pA, hypre_SStructPVector *px, HYPRE_Complex beta, hypre_SStructPVector *py ) { void *pmatvec_data; hypre_SStructPMatvecCreate(&pmatvec_data); hypre_SStructPMatvecSetup(pmatvec_data, pA, px); hypre_SStructPMatvecCompute(pmatvec_data, alpha, pA, px, beta, py); hypre_SStructPMatvecDestroy(pmatvec_data); return hypre_error_flag; } /*========================================================================== * Matvec routines *==========================================================================*/ /*-------------------------------------------------------------------------- * hypre_SStructMatvecData data structure *--------------------------------------------------------------------------*/ typedef struct { HYPRE_Int nparts; void **pmatvec_data; } hypre_SStructMatvecData; /*-------------------------------------------------------------------------- * hypre_SStructMatvecCreate *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SStructMatvecCreate( void **matvec_vdata_ptr ) { hypre_SStructMatvecData *matvec_data; matvec_data = hypre_CTAlloc(hypre_SStructMatvecData, 1, HYPRE_MEMORY_HOST); *matvec_vdata_ptr = (void *) matvec_data; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_SStructMatvecSetup *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SStructMatvecSetup( void *matvec_vdata, hypre_SStructMatrix *A, hypre_SStructVector *x ) { hypre_SStructMatvecData *matvec_data = (hypre_SStructMatvecData *)matvec_vdata; HYPRE_Int nparts; void **pmatvec_data; hypre_SStructPMatrix *pA; hypre_SStructPVector *px; HYPRE_Int part; nparts = hypre_SStructMatrixNParts(A); pmatvec_data = hypre_TAlloc(void *, nparts, HYPRE_MEMORY_HOST); for (part = 0; part < nparts; part++) { hypre_SStructPMatvecCreate(&pmatvec_data[part]); pA = hypre_SStructMatrixPMatrix(A, part); px = hypre_SStructVectorPVector(x, part); hypre_SStructPMatvecSetup(pmatvec_data[part], pA, px); } (matvec_data -> nparts) = nparts; (matvec_data -> pmatvec_data) = pmatvec_data; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_SStructMatvecCompute *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SStructMatvecCompute( void *matvec_vdata, HYPRE_Complex alpha, hypre_SStructMatrix *A, hypre_SStructVector *x, HYPRE_Complex beta, hypre_SStructVector *y ) { hypre_SStructMatvecData *matvec_data = (hypre_SStructMatvecData *)matvec_vdata; HYPRE_Int nparts = (matvec_data -> nparts); void **pmatvec_data = (matvec_data -> pmatvec_data); void *pdata; hypre_SStructPMatrix *pA; hypre_SStructPVector *px; hypre_SStructPVector *py; hypre_ParCSRMatrix *parcsrA = hypre_SStructMatrixParCSRMatrix(A); hypre_ParVector *parx; hypre_ParVector *pary; HYPRE_Int part; HYPRE_Int x_object_type = hypre_SStructVectorObjectType(x); HYPRE_Int A_object_type = hypre_SStructMatrixObjectType(A); if (x_object_type != A_object_type) { hypre_error_in_arg(2); hypre_error_in_arg(3); return hypre_error_flag; } if ( (x_object_type == HYPRE_SSTRUCT) || (x_object_type == HYPRE_STRUCT) ) { /* do S-matrix computations */ for (part = 0; part < nparts; part++) { pdata = pmatvec_data[part]; pA = hypre_SStructMatrixPMatrix(A, part); px = hypre_SStructVectorPVector(x, part); py = hypre_SStructVectorPVector(y, part); hypre_SStructPMatvecCompute(pdata, alpha, pA, px, beta, py); } if (x_object_type == HYPRE_SSTRUCT) { /* do U-matrix computations */ /* GEC1002 the data chunk pointed by the local-parvectors * inside the semistruct vectors x and y is now identical to the * data chunk of the structure vectors x and y. The role of the function * convert is to pass the addresses of the data chunk * to the parx and pary. */ hypre_SStructVectorConvert(x, &parx); hypre_SStructVectorConvert(y, &pary); hypre_ParCSRMatrixMatvec(alpha, parcsrA, parx, 1.0, pary); /* dummy functions since there is nothing to restore */ hypre_SStructVectorRestore(x, NULL); hypre_SStructVectorRestore(y, pary); parx = NULL; } } else if (x_object_type == HYPRE_PARCSR) { hypre_SStructVectorConvert(x, &parx); hypre_SStructVectorConvert(y, &pary); hypre_ParCSRMatrixMatvec(alpha, parcsrA, parx, beta, pary); hypre_SStructVectorRestore(x, NULL); hypre_SStructVectorRestore(y, pary); parx = NULL; } return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_SStructMatvecDestroy *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SStructMatvecDestroy( void *matvec_vdata ) { hypre_SStructMatvecData *matvec_data = (hypre_SStructMatvecData *)matvec_vdata; HYPRE_Int nparts; void **pmatvec_data; HYPRE_Int part; if (matvec_data) { nparts = (matvec_data -> nparts); pmatvec_data = (matvec_data -> pmatvec_data); for (part = 0; part < nparts; part++) { hypre_SStructPMatvecDestroy(pmatvec_data[part]); } hypre_TFree(pmatvec_data, HYPRE_MEMORY_HOST); hypre_TFree(matvec_data, HYPRE_MEMORY_HOST); } return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_SStructMatvec *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SStructMatvec( HYPRE_Complex alpha, hypre_SStructMatrix *A, hypre_SStructVector *x, HYPRE_Complex beta, hypre_SStructVector *y ) { void *matvec_data; hypre_SStructMatvecCreate(&matvec_data); hypre_SStructMatvecSetup(matvec_data, A, x); hypre_SStructMatvecCompute(matvec_data, alpha, A, x, beta, y); hypre_SStructMatvecDestroy(matvec_data); return hypre_error_flag; } hypre-2.33.0/src/sstruct_mv/sstruct_scale.c000066400000000000000000000035011477326011500207550ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * SStruct scale routine * *****************************************************************************/ #include "_hypre_sstruct_mv.h" /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SStructPScale( HYPRE_Complex alpha, hypre_SStructPVector *py ) { HYPRE_Int nvars = hypre_SStructPVectorNVars(py); HYPRE_Int var; for (var = 0; var < nvars; var++) { hypre_StructScale(alpha, hypre_SStructPVectorSVector(py, var)); } return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SStructScale( HYPRE_Complex alpha, hypre_SStructVector *y ) { HYPRE_Int nparts = hypre_SStructVectorNParts(y); HYPRE_Int part; HYPRE_Int y_object_type = hypre_SStructVectorObjectType(y); if (y_object_type == HYPRE_SSTRUCT) { for (part = 0; part < nparts; part++) { hypre_SStructPScale(alpha, hypre_SStructVectorPVector(y, part)); } } else if (y_object_type == HYPRE_PARCSR) { hypre_ParVector *y_par; hypre_SStructVectorConvert(y, &y_par); hypre_ParVectorScale(alpha, y_par); } return hypre_error_flag; } hypre-2.33.0/src/sstruct_mv/sstruct_stencil.c000066400000000000000000000014541477326011500213340ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "_hypre_sstruct_mv.h" /*-------------------------------------------------------------------------- * hypre_SStructStencilRef *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SStructStencilRef( hypre_SStructStencil *stencil, hypre_SStructStencil **stencil_ref ) { hypre_SStructStencilRefCount(stencil) ++; *stencil_ref = stencil; return hypre_error_flag; } hypre-2.33.0/src/sstruct_mv/sstruct_stencil.h000066400000000000000000000036761477326011500213510ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * Header info for hypre_SStructStencil data structures * *****************************************************************************/ #ifndef hypre_SSTRUCT_STENCIL_HEADER #define hypre_SSTRUCT_STENCIL_HEADER /*-------------------------------------------------------------------------- * hypre_SStructStencil *--------------------------------------------------------------------------*/ typedef struct hypre_SStructStencil_struct { hypre_StructStencil *sstencil; HYPRE_Int *vars; HYPRE_Int ref_count; } hypre_SStructStencil; /*-------------------------------------------------------------------------- * Accessor functions for the hypre_SStructStencil structure *--------------------------------------------------------------------------*/ #define hypre_SStructStencilSStencil(stencil) ((stencil) -> sstencil) #define hypre_SStructStencilVars(stencil) ((stencil) -> vars) #define hypre_SStructStencilVar(stencil, i) ((stencil) -> vars[i]) #define hypre_SStructStencilRefCount(stencil) ((stencil) -> ref_count) #define hypre_SStructStencilShape(stencil) \ hypre_StructStencilShape( hypre_SStructStencilSStencil(stencil) ) #define hypre_SStructStencilSize(stencil) \ hypre_StructStencilSize( hypre_SStructStencilSStencil(stencil) ) #define hypre_SStructStencilNDim(stencil) \ hypre_StructStencilNDim( hypre_SStructStencilSStencil(stencil) ) #define hypre_SStructStencilEntry(stencil, i) \ hypre_StructStencilElement( hypre_SStructStencilSStencil(stencil), i ) #endif hypre-2.33.0/src/sstruct_mv/sstruct_vector.c000066400000000000000000000724221477326011500212000ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * Member functions for hypre_SStructVector class. * *****************************************************************************/ #include "_hypre_sstruct_mv.h" #include "_hypre_struct_mv.hpp" /*========================================================================== * SStructPVector routines *==========================================================================*/ /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SStructPVectorRef( hypre_SStructPVector *vector, hypre_SStructPVector **vector_ref ) { hypre_SStructPVectorRefCount(vector) ++; *vector_ref = vector; return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SStructPVectorCreate( MPI_Comm comm, hypre_SStructPGrid *pgrid, hypre_SStructPVector **pvector_ptr) { hypre_SStructPVector *pvector; HYPRE_Int nvars; hypre_StructVector **svectors; hypre_CommPkg **comm_pkgs; hypre_StructGrid *sgrid; HYPRE_Int var; pvector = hypre_TAlloc(hypre_SStructPVector, 1, HYPRE_MEMORY_HOST); hypre_SStructPVectorComm(pvector) = comm; hypre_SStructPVectorPGrid(pvector) = pgrid; nvars = hypre_SStructPGridNVars(pgrid); hypre_SStructPVectorNVars(pvector) = nvars; svectors = hypre_TAlloc(hypre_StructVector *, nvars, HYPRE_MEMORY_HOST); for (var = 0; var < nvars; var++) { sgrid = hypre_SStructPGridSGrid(pgrid, var); svectors[var] = hypre_StructVectorCreate(comm, sgrid); } hypre_SStructPVectorSVectors(pvector) = svectors; comm_pkgs = hypre_TAlloc(hypre_CommPkg *, nvars, HYPRE_MEMORY_HOST); for (var = 0; var < nvars; var++) { comm_pkgs[var] = NULL; } hypre_SStructPVectorCommPkgs(pvector) = comm_pkgs; hypre_SStructPVectorRefCount(pvector) = 1; /* GEC inclusion of dataindices */ hypre_SStructPVectorDataIndices(pvector) = NULL ; *pvector_ptr = pvector; return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SStructPVectorDestroy( hypre_SStructPVector *pvector ) { HYPRE_Int nvars; hypre_StructVector **svectors; hypre_CommPkg **comm_pkgs; HYPRE_Int var; /* GEC destroying dataindices and data in pvector */ HYPRE_Int *dataindices; if (pvector) { hypre_SStructPVectorRefCount(pvector) --; if (hypre_SStructPVectorRefCount(pvector) == 0) { nvars = hypre_SStructPVectorNVars(pvector); svectors = hypre_SStructPVectorSVectors(pvector); comm_pkgs = hypre_SStructPVectorCommPkgs(pvector); dataindices = hypre_SStructPVectorDataIndices(pvector); for (var = 0; var < nvars; var++) { hypre_StructVectorDestroy(svectors[var]); hypre_CommPkgDestroy(comm_pkgs[var]); } hypre_TFree(dataindices, HYPRE_MEMORY_HOST); hypre_TFree(svectors, HYPRE_MEMORY_HOST); hypre_TFree(comm_pkgs, HYPRE_MEMORY_HOST); hypre_TFree(pvector, HYPRE_MEMORY_HOST); } } return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SStructPVectorInitialize( hypre_SStructPVector *pvector ) { hypre_SStructPGrid *pgrid = hypre_SStructPVectorPGrid(pvector); HYPRE_Int nvars = hypre_SStructPVectorNVars(pvector); HYPRE_SStructVariable *vartypes = hypre_SStructPGridVarTypes(pgrid); hypre_StructVector *svector; HYPRE_Int var; for (var = 0; var < nvars; var++) { svector = hypre_SStructPVectorSVector(pvector, var); hypre_StructVectorInitialize(svector); if (vartypes[var] > 0) { /* needed to get AddTo accumulation correct between processors */ hypre_StructVectorClearGhostValues(svector); } } hypre_SStructPVectorAccumulated(pvector) = 0; return hypre_error_flag; } /*-------------------------------------------------------------------------- * (action > 0): add-to values * (action = 0): set values * (action < 0): get values *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SStructPVectorSetValues( hypre_SStructPVector *pvector, hypre_Index index, HYPRE_Int var, HYPRE_Complex *value, HYPRE_Int action ) { hypre_StructVector *svector = hypre_SStructPVectorSVector(pvector, var); HYPRE_Int ndim = hypre_StructVectorNDim(svector); hypre_BoxArray *grid_boxes; hypre_Box *box, *grow_box; HYPRE_Int i; /* set values inside the grid */ hypre_StructVectorSetValues(svector, index, value, action, -1, 0); /* set (AddTo/Get) or clear (Set) values outside the grid in ghost zones */ if (action != 0) { /* AddTo/Get */ hypre_SStructPGrid *pgrid = hypre_SStructPVectorPGrid(pvector); hypre_Index varoffset; HYPRE_Int done = 0; grid_boxes = hypre_StructGridBoxes(hypre_StructVectorGrid(svector)); hypre_ForBoxI(i, grid_boxes) { box = hypre_BoxArrayBox(grid_boxes, i); if (hypre_IndexInBox(index, box)) { done = 1; break; } } if (!done) { grow_box = hypre_BoxCreate(ndim); hypre_SStructVariableGetOffset( hypre_SStructPGridVarType(pgrid, var), ndim, varoffset); hypre_ForBoxI(i, grid_boxes) { box = hypre_BoxArrayBox(grid_boxes, i); hypre_CopyBox(box, grow_box); hypre_BoxGrowByIndex(grow_box, varoffset); if (hypre_IndexInBox(index, grow_box)) { hypre_StructVectorSetValues(svector, index, value, action, i, 1); break; } } hypre_BoxDestroy(grow_box); } } else { /* Set */ grid_boxes = hypre_StructGridBoxes(hypre_StructVectorGrid(svector)); hypre_ForBoxI(i, grid_boxes) { box = hypre_BoxArrayBox(grid_boxes, i); if (!hypre_IndexInBox(index, box)) { hypre_StructVectorClearValues(svector, index, i, 1); } } } return hypre_error_flag; } /*-------------------------------------------------------------------------- * (action > 0): add-to values * (action = 0): set values * (action < 0): get values *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SStructPVectorSetBoxValues( hypre_SStructPVector *pvector, hypre_Box *set_box, HYPRE_Int var, hypre_Box *value_box, HYPRE_Complex *values, HYPRE_Int action ) { hypre_StructVector *svector = hypre_SStructPVectorSVector(pvector, var); HYPRE_Int ndim = hypre_StructVectorNDim(svector); hypre_BoxArray *grid_boxes; HYPRE_Int i, j; /* set values inside the grid */ hypre_StructVectorSetBoxValues(svector, set_box, value_box, values, action, -1, 0); /* TODO: Why need DeviceSync? */ #if defined(HYPRE_USING_GPU) hypre_SyncDevice(); #endif /* set (AddTo/Get) or clear (Set) values outside the grid in ghost zones */ if (action != 0) { /* AddTo/Get */ hypre_SStructPGrid *pgrid = hypre_SStructPVectorPGrid(pvector); hypre_Index varoffset; hypre_BoxArray *left_boxes, *done_boxes, *temp_boxes; hypre_Box *left_box, *done_box, *int_box; hypre_SStructVariableGetOffset( hypre_SStructPGridVarType(pgrid, var), ndim, varoffset); grid_boxes = hypre_StructGridBoxes(hypre_StructVectorGrid(svector)); left_boxes = hypre_BoxArrayCreate(1, ndim); done_boxes = hypre_BoxArrayCreate(2, ndim); temp_boxes = hypre_BoxArrayCreate(0, ndim); /* done_box always points to the first box in done_boxes */ done_box = hypre_BoxArrayBox(done_boxes, 0); /* int_box always points to the second box in done_boxes */ int_box = hypre_BoxArrayBox(done_boxes, 1); hypre_CopyBox(set_box, hypre_BoxArrayBox(left_boxes, 0)); hypre_BoxArraySetSize(left_boxes, 1); hypre_SubtractBoxArrays(left_boxes, grid_boxes, temp_boxes); hypre_BoxArraySetSize(done_boxes, 0); hypre_ForBoxI(i, grid_boxes) { hypre_SubtractBoxArrays(left_boxes, done_boxes, temp_boxes); hypre_BoxArraySetSize(done_boxes, 1); hypre_CopyBox(hypre_BoxArrayBox(grid_boxes, i), done_box); hypre_BoxGrowByIndex(done_box, varoffset); hypre_ForBoxI(j, left_boxes) { left_box = hypre_BoxArrayBox(left_boxes, j); hypre_IntersectBoxes(left_box, done_box, int_box); hypre_StructVectorSetBoxValues(svector, int_box, value_box, values, action, i, 1); } } hypre_BoxArrayDestroy(left_boxes); hypre_BoxArrayDestroy(done_boxes); hypre_BoxArrayDestroy(temp_boxes); } else { /* Set */ hypre_BoxArray *diff_boxes; hypre_Box *grid_box, *diff_box; grid_boxes = hypre_StructGridBoxes(hypre_StructVectorGrid(svector)); diff_boxes = hypre_BoxArrayCreate(0, ndim); hypre_ForBoxI(i, grid_boxes) { grid_box = hypre_BoxArrayBox(grid_boxes, i); hypre_BoxArraySetSize(diff_boxes, 0); hypre_SubtractBoxes(set_box, grid_box, diff_boxes); hypre_ForBoxI(j, diff_boxes) { diff_box = hypre_BoxArrayBox(diff_boxes, j); hypre_StructVectorClearBoxValues(svector, diff_box, i, 1); } } hypre_BoxArrayDestroy(diff_boxes); } return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SStructPVectorAccumulate( hypre_SStructPVector *pvector ) { hypre_SStructPGrid *pgrid = hypre_SStructPVectorPGrid(pvector); HYPRE_Int nvars = hypre_SStructPVectorNVars(pvector); hypre_StructVector **svectors = hypre_SStructPVectorSVectors(pvector); hypre_CommPkg **comm_pkgs = hypre_SStructPVectorCommPkgs(pvector); hypre_CommInfo *comm_info; hypre_CommPkg *comm_pkg; hypre_CommHandle *comm_handle; HYPRE_Int ndim = hypre_SStructPGridNDim(pgrid); HYPRE_SStructVariable *vartypes = hypre_SStructPGridVarTypes(pgrid); hypre_Index varoffset; HYPRE_Int num_ghost[2 * HYPRE_MAXDIM]; hypre_StructGrid *sgrid; HYPRE_Int var, d; /* if values already accumulated, just return */ if (hypre_SStructPVectorAccumulated(pvector)) { return hypre_error_flag; } for (var = 0; var < nvars; var++) { if (vartypes[var] > 0) { sgrid = hypre_StructVectorGrid(svectors[var]); hypre_SStructVariableGetOffset(vartypes[var], ndim, varoffset); for (d = 0; d < ndim; d++) { num_ghost[2 * d] = num_ghost[2 * d + 1] = hypre_IndexD(varoffset, d); } hypre_CreateCommInfoFromNumGhost(sgrid, num_ghost, &comm_info); hypre_CommPkgDestroy(comm_pkgs[var]); hypre_CommPkgCreate(comm_info, hypre_StructVectorDataSpace(svectors[var]), hypre_StructVectorDataSpace(svectors[var]), 1, NULL, 0, hypre_StructVectorComm(svectors[var]), &comm_pkgs[var]); /* accumulate values from AddTo */ hypre_CommPkgCreate(comm_info, hypre_StructVectorDataSpace(svectors[var]), hypre_StructVectorDataSpace(svectors[var]), 1, NULL, 1, hypre_StructVectorComm(svectors[var]), &comm_pkg); hypre_InitializeCommunication(comm_pkg, hypre_StructVectorData(svectors[var]), hypre_StructVectorData(svectors[var]), 1, 0, &comm_handle); hypre_FinalizeCommunication(comm_handle); hypre_CommInfoDestroy(comm_info); hypre_CommPkgDestroy(comm_pkg); } } hypre_SStructPVectorAccumulated(pvector) = 1; return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SStructPVectorAssemble( hypre_SStructPVector *pvector ) { HYPRE_Int nvars = hypre_SStructPVectorNVars(pvector); hypre_StructVector **svectors = hypre_SStructPVectorSVectors(pvector); HYPRE_Int var; hypre_SStructPVectorAccumulate(pvector); for (var = 0; var < nvars; var++) { hypre_StructVectorClearGhostValues(svectors[var]); hypre_StructVectorAssemble(svectors[var]); } return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SStructPVectorGather( hypre_SStructPVector *pvector ) { HYPRE_Int nvars = hypre_SStructPVectorNVars(pvector); hypre_StructVector **svectors = hypre_SStructPVectorSVectors(pvector); hypre_CommPkg **comm_pkgs = hypre_SStructPVectorCommPkgs(pvector); hypre_CommHandle *comm_handle; HYPRE_Int var; for (var = 0; var < nvars; var++) { if (comm_pkgs[var] != NULL) { hypre_InitializeCommunication(comm_pkgs[var], hypre_StructVectorData(svectors[var]), hypre_StructVectorData(svectors[var]), 0, 0, &comm_handle); hypre_FinalizeCommunication(comm_handle); } } return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SStructPVectorGetValues( hypre_SStructPVector *pvector, hypre_Index index, HYPRE_Int var, HYPRE_Complex *value ) { hypre_SStructPGrid *pgrid = hypre_SStructPVectorPGrid(pvector); hypre_StructVector *svector = hypre_SStructPVectorSVector(pvector, var); hypre_StructGrid *sgrid = hypre_StructVectorGrid(svector); hypre_BoxArray *iboxarray = hypre_SStructPGridIBoxArray(pgrid, var); hypre_BoxArray *tboxarray; /* temporarily swap out sgrid boxes in order to get boundary data */ tboxarray = hypre_StructGridBoxes(sgrid); hypre_StructGridBoxes(sgrid) = iboxarray; hypre_StructVectorSetValues(svector, index, value, -1, -1, 0); hypre_StructGridBoxes(sgrid) = tboxarray; return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SStructPVectorGetBoxValues( hypre_SStructPVector *pvector, hypre_Box *set_box, HYPRE_Int var, hypre_Box *value_box, HYPRE_Complex *values ) { hypre_SStructPGrid *pgrid = hypre_SStructPVectorPGrid(pvector); hypre_StructVector *svector = hypre_SStructPVectorSVector(pvector, var); hypre_StructGrid *sgrid = hypre_StructVectorGrid(svector); hypre_BoxArray *iboxarray = hypre_SStructPGridIBoxArray(pgrid, var); hypre_BoxArray *tboxarray; /* temporarily swap out sgrid boxes in order to get boundary data */ tboxarray = hypre_StructGridBoxes(sgrid); hypre_StructGridBoxes(sgrid) = iboxarray; hypre_StructVectorSetBoxValues(svector, set_box, value_box, values, -1, -1, 0); hypre_StructGridBoxes(sgrid) = tboxarray; return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SStructPVectorSetConstantValues( hypre_SStructPVector *pvector, HYPRE_Complex value ) { HYPRE_Int nvars = hypre_SStructPVectorNVars(pvector); hypre_StructVector *svector; HYPRE_Int var; for (var = 0; var < nvars; var++) { svector = hypre_SStructPVectorSVector(pvector, var); hypre_StructVectorSetConstantValues(svector, value); } return hypre_error_flag; } /*-------------------------------------------------------------------------- * For now, just print multiple files *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SStructPVectorPrint( const char *filename, hypre_SStructPVector *pvector, HYPRE_Int all ) { HYPRE_Int nvars = hypre_SStructPVectorNVars(pvector); HYPRE_Int var; char new_filename[255]; for (var = 0; var < nvars; var++) { hypre_sprintf(new_filename, "%s.%02d", filename, var); hypre_StructVectorPrint(new_filename, hypre_SStructPVectorSVector(pvector, var), all); } return hypre_error_flag; } /*========================================================================== * SStructVector routines *==========================================================================*/ /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SStructVectorRef( hypre_SStructVector *vector, hypre_SStructVector **vector_ref ) { hypre_SStructVectorRefCount(vector) ++; *vector_ref = vector; return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SStructVectorSetConstantValues( hypre_SStructVector *vector, HYPRE_Complex value ) { HYPRE_Int nparts = hypre_SStructVectorNParts(vector); hypre_SStructPVector *pvector; HYPRE_Int part; for (part = 0; part < nparts; part++) { pvector = hypre_SStructVectorPVector(vector, part); hypre_SStructPVectorSetConstantValues(pvector, value); } return hypre_error_flag; } /*-------------------------------------------------------------------------- * Here the address of the parvector inside the semistructured vector * is provided to the "outside". It assumes that the vector type * is HYPRE_SSTRUCT *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SStructVectorConvert( hypre_SStructVector *vector, hypre_ParVector **parvector_ptr ) { *parvector_ptr = hypre_SStructVectorParVector(vector); return hypre_error_flag; } /*-------------------------------------------------------------------------- * Copy values from vector to parvector and provide the address *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SStructVectorParConvert( hypre_SStructVector *vector, hypre_ParVector **parvector_ptr ) { hypre_ParVector *parvector; HYPRE_Complex *pardata; HYPRE_Int pari; hypre_SStructPVector *pvector; hypre_StructVector *y; hypre_Box *y_data_box; HYPRE_Complex *yp; hypre_BoxArray *boxes; hypre_Box *box; hypre_Index loop_size; hypre_IndexRef start; hypre_Index stride; HYPRE_Int nparts, nvars; HYPRE_Int part, var, i; hypre_SetIndex(stride, 1); parvector = hypre_SStructVectorParVector(vector); pardata = hypre_VectorData(hypre_ParVectorLocalVector(parvector)); pari = 0; nparts = hypre_SStructVectorNParts(vector); for (part = 0; part < nparts; part++) { pvector = hypre_SStructVectorPVector(vector, part); nvars = hypre_SStructPVectorNVars(pvector); for (var = 0; var < nvars; var++) { y = hypre_SStructPVectorSVector(pvector, var); boxes = hypre_StructGridBoxes(hypre_StructVectorGrid(y)); hypre_ForBoxI(i, boxes) { box = hypre_BoxArrayBox(boxes, i); start = hypre_BoxIMin(box); y_data_box = hypre_BoxArrayBox(hypre_StructVectorDataSpace(y), i); yp = hypre_StructVectorBoxData(y, i); hypre_BoxGetSize(box, loop_size); #undef DEVICE_VAR #define DEVICE_VAR is_device_ptr(pardata,yp) hypre_BoxLoop2Begin(hypre_SStructVectorNDim(vector), loop_size, y_data_box, start, stride, yi, box, start, stride, bi); { pardata[pari + bi] = yp[yi]; } hypre_BoxLoop2End(yi, bi); #undef DEVICE_VAR #define DEVICE_VAR pari += hypre_BoxVolume(box); } } } *parvector_ptr = hypre_SStructVectorParVector(vector); return hypre_error_flag; } /*-------------------------------------------------------------------------- * Used for HYPRE_SSTRUCT type semi structured vectors. * A dummy function to indicate that the struct vector part will be used. *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SStructVectorRestore( hypre_SStructVector *vector, hypre_ParVector *parvector ) { HYPRE_UNUSED_VAR(vector); HYPRE_UNUSED_VAR(parvector); return hypre_error_flag; } /*-------------------------------------------------------------------------- * Copy values from parvector to vector *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SStructVectorParRestore( hypre_SStructVector *vector, hypre_ParVector *parvector ) { HYPRE_Complex *pardata; HYPRE_Int pari; hypre_SStructPVector *pvector; hypre_StructVector *y; hypre_Box *y_data_box; HYPRE_Complex *yp; hypre_BoxArray *boxes; hypre_Box *box; hypre_Index loop_size; hypre_IndexRef start; hypre_Index stride; HYPRE_Int nparts, nvars; HYPRE_Int part, var, i; if (parvector != NULL) { hypre_SetIndex(stride, 1); parvector = hypre_SStructVectorParVector(vector); pardata = hypre_VectorData(hypre_ParVectorLocalVector(parvector)); pari = 0; nparts = hypre_SStructVectorNParts(vector); for (part = 0; part < nparts; part++) { pvector = hypre_SStructVectorPVector(vector, part); nvars = hypre_SStructPVectorNVars(pvector); for (var = 0; var < nvars; var++) { y = hypre_SStructPVectorSVector(pvector, var); boxes = hypre_StructGridBoxes(hypre_StructVectorGrid(y)); hypre_ForBoxI(i, boxes) { box = hypre_BoxArrayBox(boxes, i); start = hypre_BoxIMin(box); y_data_box = hypre_BoxArrayBox(hypre_StructVectorDataSpace(y), i); yp = hypre_StructVectorBoxData(y, i); hypre_BoxGetSize(box, loop_size); #undef DEVICE_VAR #define DEVICE_VAR is_device_ptr(yp,pardata) hypre_BoxLoop2Begin(hypre_SStructVectorNDim(vector), loop_size, y_data_box, start, stride, yi, box, start, stride, bi); { yp[yi] = pardata[pari + bi]; } hypre_BoxLoop2End(yi, bi); #undef DEVICE_VAR #define DEVICE_VAR pari += hypre_BoxVolume(box); } } } } return hypre_error_flag; } /*------------------------------------------------------------------ * GEC1002 shell initialization of a pvector * if the pvector exists. This function will set the dataindices * and datasize of the pvector. Datasize is the sum of the sizes * of each svector and dataindices is defined as * dataindices[var]= aggregated initial size of the pvector[var] * When ucvars are present we need to modify adding nucvars. *----------------------------------------------------------------*/ HYPRE_Int hypre_SStructPVectorInitializeShell( hypre_SStructPVector *pvector) { HYPRE_Int nvars = hypre_SStructPVectorNVars(pvector); HYPRE_Int var; HYPRE_Int pdatasize; HYPRE_Int svectdatasize; HYPRE_Int *pdataindices; HYPRE_Int nucvars = 0; hypre_StructVector *svector; pdatasize = 0; pdataindices = hypre_CTAlloc(HYPRE_Int, nvars, HYPRE_MEMORY_HOST); for (var = 0; var < nvars; var++) { svector = hypre_SStructPVectorSVector(pvector, var); hypre_StructVectorInitializeShell(svector); pdataindices[var] = pdatasize ; svectdatasize = hypre_StructVectorDataSize(svector); pdatasize += svectdatasize; } /* GEC1002 assuming that the ucvars are located at the end, after the * the size of the vars has been included we add the number of uvar * for this part */ hypre_SStructPVectorDataIndices(pvector) = pdataindices; hypre_SStructPVectorDataSize(pvector) = pdatasize + nucvars ; hypre_SStructPVectorAccumulated(pvector) = 0; return hypre_error_flag; } /*------------------------------------------------------------------ * GEC1002 shell initialization of a sstructvector * if the vector exists. This function will set the * dataindices and datasize of the vector. When ucvars * are present at the end of all the parts we need to modify adding pieces * for ucvars. *----------------------------------------------------------------*/ HYPRE_Int hypre_SStructVectorInitializeShell( hypre_SStructVector *vector) { HYPRE_Int part ; HYPRE_Int datasize; HYPRE_Int pdatasize; HYPRE_Int nparts = hypre_SStructVectorNParts(vector); hypre_SStructPVector *pvector; HYPRE_Int *dataindices; datasize = 0; dataindices = hypre_CTAlloc(HYPRE_Int, nparts, HYPRE_MEMORY_HOST); for (part = 0; part < nparts; part++) { pvector = hypre_SStructVectorPVector(vector, part) ; hypre_SStructPVectorInitializeShell(pvector); pdatasize = hypre_SStructPVectorDataSize(pvector); dataindices[part] = datasize ; datasize += pdatasize ; } hypre_SStructVectorDataIndices(vector) = dataindices; hypre_SStructVectorDataSize(vector) = datasize ; return hypre_error_flag; } HYPRE_Int hypre_SStructVectorClearGhostValues(hypre_SStructVector *vector) { HYPRE_Int nparts = hypre_SStructVectorNParts(vector); hypre_SStructPVector *pvector; hypre_StructVector *svector; HYPRE_Int part; HYPRE_Int nvars, var; for (part = 0; part < nparts; part++) { pvector = hypre_SStructVectorPVector(vector, part); nvars = hypre_SStructPVectorNVars(pvector); for (var = 0; var < nvars; var++) { svector = hypre_SStructPVectorSVector(pvector, var); hypre_StructVectorClearGhostValues(svector); } } return hypre_error_flag; } HYPRE_MemoryLocation hypre_SStructVectorMemoryLocation(hypre_SStructVector *vector) { HYPRE_Int type = hypre_SStructVectorObjectType(vector); if (type == HYPRE_SSTRUCT) { hypre_ParVector *parvector; hypre_SStructVectorConvert(vector, &parvector); return hypre_ParVectorMemoryLocation(parvector); } void *object; HYPRE_SStructVectorGetObject(vector, &object); if (type == HYPRE_PARCSR) { return hypre_ParVectorMemoryLocation((hypre_ParVector *) object); } if (type == HYPRE_STRUCT) { return hypre_StructVectorMemoryLocation((hypre_StructVector *) object); } return HYPRE_MEMORY_UNDEFINED; } hypre-2.33.0/src/sstruct_mv/sstruct_vector.h000066400000000000000000000112351477326011500212000ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * Header info for the hypre_SStructVector structures * *****************************************************************************/ #ifndef hypre_SSTRUCT_VECTOR_HEADER #define hypre_SSTRUCT_VECTOR_HEADER /*-------------------------------------------------------------------------- * hypre_SStructVector: *--------------------------------------------------------------------------*/ typedef struct { MPI_Comm comm; hypre_SStructPGrid *pgrid; HYPRE_Int nvars; hypre_StructVector **svectors; /* nvar array of svectors */ hypre_CommPkg **comm_pkgs; /* nvar array of comm pkgs */ HYPRE_Int accumulated; /* AddTo values accumulated? */ HYPRE_Int ref_count; HYPRE_Int *dataindices; /* GEC1002 array for starting index of the svector. pdataindices[varx] */ HYPRE_Int datasize; /* Size of the pvector = sums size of svectors */ } hypre_SStructPVector; typedef struct hypre_SStructVector_struct { MPI_Comm comm; HYPRE_Int ndim; hypre_SStructGrid *grid; HYPRE_Int object_type; /* s-vector info */ HYPRE_Int nparts; hypre_SStructPVector **pvectors; hypre_CommPkg ***comm_pkgs; /* nvar array of comm pkgs */ /* u-vector info */ HYPRE_IJVector ijvector; hypre_ParVector *parvector; /* inter-part communication info */ HYPRE_Int nbor_ncomms; /* num comm_pkgs with neighbor parts */ /* GEC10020902 pointer to big chunk of memory and auxiliary information */ HYPRE_Complex *data; /* GEC1002 pointer to chunk data */ HYPRE_Int *dataindices; /* GEC1002 dataindices[partx] is the starting index of vector data for the part=partx */ HYPRE_Int datasize; /* GEC1002 size of all data = ghlocalsize */ HYPRE_Int global_size; /* Total number coefficients */ HYPRE_Int ref_count; } hypre_SStructVector; /*-------------------------------------------------------------------------- * Accessor macros: hypre_SStructVector *--------------------------------------------------------------------------*/ #define hypre_SStructVectorComm(vec) ((vec) -> comm) #define hypre_SStructVectorNDim(vec) ((vec) -> ndim) #define hypre_SStructVectorGrid(vec) ((vec) -> grid) #define hypre_SStructVectorObjectType(vec) ((vec) -> object_type) #define hypre_SStructVectorNParts(vec) ((vec) -> nparts) #define hypre_SStructVectorPVectors(vec) ((vec) -> pvectors) #define hypre_SStructVectorPVector(vec, part) ((vec) -> pvectors[part]) #define hypre_SStructVectorIJVector(vec) ((vec) -> ijvector) #define hypre_SStructVectorParVector(vec) ((vec) -> parvector) #define hypre_SStructVectorNborNComms(vec) ((vec) -> nbor_ncomms) #define hypre_SStructVectorGlobalSize(vec) ((vec) -> global_size) #define hypre_SStructVectorRefCount(vec) ((vec) -> ref_count) #define hypre_SStructVectorData(vec) ((vec) -> data ) #define hypre_SStructVectorDataIndices(vec) ((vec) -> dataindices) #define hypre_SStructVectorDataSize(vec) ((vec) -> datasize) /*-------------------------------------------------------------------------- * Accessor macros: hypre_SStructPVector *--------------------------------------------------------------------------*/ #define hypre_SStructPVectorComm(pvec) ((pvec) -> comm) #define hypre_SStructPVectorPGrid(pvec) ((pvec) -> pgrid) #define hypre_SStructPVectorNVars(pvec) ((pvec) -> nvars) #define hypre_SStructPVectorSVectors(pvec) ((pvec) -> svectors) #define hypre_SStructPVectorSVector(pvec, v) ((pvec) -> svectors[v]) #define hypre_SStructPVectorCommPkgs(pvec) ((pvec) -> comm_pkgs) #define hypre_SStructPVectorCommPkg(pvec, v) ((pvec) -> comm_pkgs[v]) #define hypre_SStructPVectorAccumulated(pvec) ((pvec) -> accumulated) #define hypre_SStructPVectorRefCount(pvec) ((pvec) -> ref_count) #define hypre_SStructPVectorDataIndices(pvec) ((pvec) -> dataindices ) #define hypre_SStructPVectorDataSize(pvec) ((pvec) -> datasize ) #endif hypre-2.33.0/src/struct_ls/000077500000000000000000000000001477326011500155455ustar00rootroot00000000000000hypre-2.33.0/src/struct_ls/CMakeLists.txt000066400000000000000000000047361477326011500203170ustar00rootroot00000000000000# Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) set(HDRS HYPRE_struct_ls.h _hypre_struct_ls.h ) set(SRCS coarsen.c cyclic_reduction.c F90_HYPRE_struct_bicgstab.c F90_HYPRE_struct_cycred.c F90_HYPRE_struct_gmres.c F90_HYPRE_struct_hybrid.c F90_HYPRE_struct_int.c F90_HYPRE_struct_jacobi.c F90_HYPRE_struct_pcg.c F90_HYPRE_struct_pfmg.c F90_HYPRE_struct_smg.c F90_HYPRE_struct_sparse_msg.c hybrid.c HYPRE_struct_bicgstab.c HYPRE_struct_cycred.c HYPRE_struct_hybrid.c HYPRE_struct_int.c HYPRE_struct_jacobi.c HYPRE_struct_pfmg.c HYPRE_struct_smg.c HYPRE_struct_sparse_msg.c HYPRE_struct_pcg.c HYPRE_struct_gmres.c HYPRE_struct_flexgmres.c HYPRE_struct_lgmres.c jacobi.c pcg_struct.c pfmg2_setup_rap.c pfmg3_setup_rap.c pfmg.c pfmg_relax.c pfmg_setup.c pfmg_setup_interp.c pfmg_setup_rap5.c pfmg_setup_rap7.c pfmg_setup_rap.c pfmg_solve.c point_relax.c red_black_constantcoef_gs.c red_black_gs.c semi.c semi_interp.c semi_restrict.c semi_setup_rap.c smg2_setup_rap.c smg3_setup_rap.c smg_axpy.c smg.c smg_relax.c smg_residual.c smg_setup.c smg_setup_interp.c smg_setup_rap.c smg_setup_restrict.c smg_solve.c sparse_msg2_setup_rap.c sparse_msg3_setup_rap.c sparse_msg.c sparse_msg_filter.c sparse_msg_interp.c sparse_msg_restrict.c sparse_msg_setup.c sparse_msg_setup_rap.c sparse_msg_solve.c F90_HYPRE_struct_flexgmres.c F90_HYPRE_struct_lgmres.c ) target_sources(${PROJECT_NAME} PRIVATE ${SRCS} ${HDRS} ) if (HYPRE_USING_GPU) set(GPU_SRCS cyclic_reduction.c HYPRE_struct_int.c HYPRE_struct_pcg.c pfmg2_setup_rap.c pfmg3_setup_rap.c pfmg_setup.c pfmg_setup_interp.c pfmg_setup_rap5.c pfmg_setup_rap7.c point_relax.c red_black_constantcoef_gs.c red_black_gs.c semi_interp.c semi_restrict.c semi_setup_rap.c smg2_setup_rap.c smg3_setup_rap.c smg.c smg_axpy.c smg_residual.c smg_setup_interp.c sparse_msg2_setup_rap.c sparse_msg3_setup_rap.c sparse_msg_filter.c sparse_msg_interp.c sparse_msg_restrict.c ) convert_filenames_to_full_paths(GPU_SRCS) set(HYPRE_GPU_SOURCES ${HYPRE_GPU_SOURCES} ${GPU_SRCS} PARENT_SCOPE) endif () convert_filenames_to_full_paths(HDRS) set(HYPRE_HEADERS ${HYPRE_HEADERS} ${HDRS} PARENT_SCOPE) hypre-2.33.0/src/struct_ls/F90_HYPRE_struct_bicgstab.c000066400000000000000000000215251477326011500224650ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "_hypre_struct_ls.h" #include "fortran.h" #ifdef __cplusplus extern "C" { #endif /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_structbicgstabcreate, HYPRE_STRUCTBICGSTABCREATE) ( hypre_F90_Comm *comm, hypre_F90_Obj *solver, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_StructBiCGSTABCreate( hypre_F90_PassComm (comm), hypre_F90_PassObjRef (HYPRE_StructSolver, solver) ) ); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_structbicgstabdestroy, HYPRE_STRUCTBICGSTABDESTROY) ( hypre_F90_Obj *solver, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_StructBiCGSTABDestroy( hypre_F90_PassObj (HYPRE_StructSolver, solver) ) ); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_structbicgstabsetup, HYPRE_STRUCTBICGSTABSETUP) ( hypre_F90_Obj *solver, hypre_F90_Obj *A, hypre_F90_Obj *b, hypre_F90_Obj *x, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_StructBiCGSTABSetup( hypre_F90_PassObj (HYPRE_StructSolver, solver), hypre_F90_PassObj (HYPRE_StructMatrix, A), hypre_F90_PassObj (HYPRE_StructVector, b), hypre_F90_PassObj (HYPRE_StructVector, x) ) ); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_structbicgstabsolve, HYPRE_STRUCTBICGSTABSOLVE) ( hypre_F90_Obj *solver, hypre_F90_Obj *A, hypre_F90_Obj *b, hypre_F90_Obj *x, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_StructBiCGSTABSolve( hypre_F90_PassObj (HYPRE_StructSolver, solver), hypre_F90_PassObj (HYPRE_StructMatrix, A), hypre_F90_PassObj (HYPRE_StructVector, b), hypre_F90_PassObj (HYPRE_StructVector, x) ) ); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_structbicgstabsettol, HYPRE_STRUCTBICGSTABSETTOL) ( hypre_F90_Obj *solver, hypre_F90_Real *tol, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_StructBiCGSTABSetTol( hypre_F90_PassObj (HYPRE_StructSolver, solver), hypre_F90_PassReal (tol) ) ); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_structbicgstabsetabstol, HYPRE_STRUCTBICGSTABSETABSTOL) ( hypre_F90_Obj *solver, hypre_F90_Real *tol, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_StructBiCGSTABSetAbsoluteTol( hypre_F90_PassObj (HYPRE_StructSolver, solver), hypre_F90_PassReal (tol) ) ); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_structbicgstabsetmaxiter, HYPRE_STRUCTBICGSTABSETMAXITER) ( hypre_F90_Obj *solver, hypre_F90_Int *max_iter, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_StructBiCGSTABSetMaxIter( hypre_F90_PassObj (HYPRE_StructSolver, solver), hypre_F90_PassInt (max_iter) ) ); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_structbicgstabsetprecond, HYPRE_STRUCTBICGSTABSETPRECOND) ( hypre_F90_Obj *solver, hypre_F90_Int *precond_id, hypre_F90_Obj *precond_solver, hypre_F90_Int *ierr ) { /*------------------------------------------------------------ * The precond_id flags mean : * 0 - setup a smg preconditioner * 1 - setup a pfmg preconditioner * 7 - setup a jacobi preconditioner * 8 - setup a ds preconditioner * 9 - dont setup a preconditioner *------------------------------------------------------------*/ if (*precond_id == 0) { *ierr = (hypre_F90_Int) ( HYPRE_StructBiCGSTABSetPrecond( hypre_F90_PassObj (HYPRE_StructSolver, solver), HYPRE_StructSMGSolve, HYPRE_StructSMGSetup, hypre_F90_PassObj (HYPRE_StructSolver, precond_solver)) ); } else if (*precond_id == 1) { *ierr = (hypre_F90_Int) ( HYPRE_StructBiCGSTABSetPrecond( hypre_F90_PassObj (HYPRE_StructSolver, solver), HYPRE_StructPFMGSolve, HYPRE_StructPFMGSetup, hypre_F90_PassObj (HYPRE_StructSolver, precond_solver)) ); } else if (*precond_id == 7) { *ierr = (hypre_F90_Int) ( HYPRE_StructBiCGSTABSetPrecond( hypre_F90_PassObj (HYPRE_StructSolver, solver), HYPRE_StructJacobiSolve, HYPRE_StructJacobiSetup, hypre_F90_PassObj (HYPRE_StructSolver, precond_solver)) ); } else if (*precond_id == 8) { *ierr = (hypre_F90_Int) ( HYPRE_StructBiCGSTABSetPrecond( hypre_F90_PassObj (HYPRE_StructSolver, solver), HYPRE_StructDiagScale, HYPRE_StructDiagScaleSetup, hypre_F90_PassObj (HYPRE_StructSolver, precond_solver)) ); } else if (*precond_id == 9) { *ierr = 0; } else { *ierr = -1; } } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_structbicgstabsetlogging, HYPRE_STRUCTBICGSTABSETLOGGING) ( hypre_F90_Obj *solver, hypre_F90_Int *logging, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_StructBiCGSTABSetLogging( hypre_F90_PassObj (HYPRE_StructSolver, solver), hypre_F90_PassInt (logging) ) ); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_structbicgstabsetprintlev, HYPRE_STRUCTBICGSTABSETPRINTLEV) ( hypre_F90_Obj *solver, hypre_F90_Int *print_level, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_StructBiCGSTABSetPrintLevel( hypre_F90_PassObj (HYPRE_StructSolver, solver), hypre_F90_PassInt (print_level) ) ); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_structbicgstabgetnumitera, HYPRE_STRUCTBICGSTABGETNUMITERA) ( hypre_F90_Obj *solver, hypre_F90_Int *num_iterations, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_StructBiCGSTABGetNumIterations( hypre_F90_PassObj (HYPRE_StructSolver, solver), hypre_F90_PassIntRef (num_iterations) ) ); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_structbicgstabgetresidual, HYPRE_STRUCTBICGSTABGETRESIDUAL) ( hypre_F90_Obj *solver, void *residual, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_StructBiCGSTABGetResidual( hypre_F90_PassObj (HYPRE_StructSolver, solver), (void **) residual ) ); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_structbicgstabgetfinalrel, HYPRE_STRUCTBICGSTABGETFINALREL) ( hypre_F90_Obj *solver, hypre_F90_Real *norm, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_StructBiCGSTABGetFinalRelativeResidualNorm( hypre_F90_PassObj (HYPRE_StructSolver, solver), hypre_F90_PassRealRef (norm) ) ); } #ifdef __cplusplus } #endif hypre-2.33.0/src/struct_ls/F90_HYPRE_struct_cycred.c000066400000000000000000000074371477326011500221660ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "_hypre_struct_ls.h" #include "fortran.h" #ifdef __cplusplus extern "C" { #endif /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_structcycredcreate, HYPRE_STRUCTCYCREDCREATE) ( hypre_F90_Comm *comm, hypre_F90_Obj *solver, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_StructCycRedCreate( hypre_F90_PassComm (comm), hypre_F90_PassObjRef (HYPRE_StructSolver, solver) ) ); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_structcycreddestroy, HYPRE_STRUCTCYCREDDESTROY) ( hypre_F90_Obj *solver, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_StructCycRedDestroy( hypre_F90_PassObj (HYPRE_StructSolver, solver) ) ); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_structcycredsetup, HYPRE_STRUCTCYCREDSETUP) ( hypre_F90_Obj *solver, hypre_F90_Obj *A, hypre_F90_Obj *b, hypre_F90_Obj *x, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_StructCycRedSetup( hypre_F90_PassObj (HYPRE_StructSolver, solver), hypre_F90_PassObj (HYPRE_StructMatrix, A), hypre_F90_PassObj (HYPRE_StructVector, b), hypre_F90_PassObj (HYPRE_StructVector, x) ) ); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_structcycredsolve, HYPRE_STRUCTCYCREDSOLVE) ( hypre_F90_Obj *solver, hypre_F90_Obj *A, hypre_F90_Obj *b, hypre_F90_Obj *x, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_StructCycRedSolve( hypre_F90_PassObj (HYPRE_StructSolver, solver), hypre_F90_PassObj (HYPRE_StructMatrix, A), hypre_F90_PassObj (HYPRE_StructVector, b), hypre_F90_PassObj (HYPRE_StructVector, x) ) ); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_structcycredsettdim, HYPRE_STRUCTCYCREDSETTDIM) ( hypre_F90_Obj *solver, hypre_F90_Int *tdim, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_StructCycRedSetTDim( hypre_F90_PassObj (HYPRE_StructSolver, solver), hypre_F90_PassInt (tdim) ) ); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_structcycredsetbase, HYPRE_STRUCTCYCREDSETBASE) ( hypre_F90_Obj *solver, hypre_F90_Int *ndim, hypre_F90_IntArray *base_index, hypre_F90_IntArray *base_stride, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_StructCycRedSetBase( hypre_F90_PassObj (HYPRE_StructSolver, solver), hypre_F90_PassInt (ndim), hypre_F90_PassIntArray (base_index), hypre_F90_PassIntArray (base_stride) ) ); } #ifdef __cplusplus } #endif hypre-2.33.0/src/struct_ls/F90_HYPRE_struct_flexgmres.c000066400000000000000000000214411477326011500227000ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "_hypre_struct_ls.h" #include "fortran.h" #ifdef __cplusplus extern "C" { #endif /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_structfgmrescreate, HYPRE_STRUCTFGMRESCREATE) ( hypre_F90_Comm *comm, hypre_F90_Obj *solver, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_StructFlexGMRESCreate( hypre_F90_PassComm (comm), hypre_F90_PassObjRef (HYPRE_StructSolver, solver) ) ); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_structfgmresdestroy, HYPRE_STRUCTFGMRESDESTROY) ( hypre_F90_Obj *solver, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_StructFlexGMRESDestroy( hypre_F90_PassObj (HYPRE_StructSolver, solver) ) ); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_structfgmressetup, HYPRE_STRUCTFGMRESSETUP) ( hypre_F90_Obj *solver, hypre_F90_Obj *A, hypre_F90_Obj *b, hypre_F90_Obj *x, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_StructFlexGMRESSetup( hypre_F90_PassObj (HYPRE_StructSolver, solver), hypre_F90_PassObj (HYPRE_StructMatrix, A), hypre_F90_PassObj (HYPRE_StructVector, b), hypre_F90_PassObj (HYPRE_StructVector, x) ) ); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_structfgmressolve, HYPRE_STRUCTFGMRESSOLVE) ( hypre_F90_Obj *solver, hypre_F90_Obj *A, hypre_F90_Obj *b, hypre_F90_Obj *x, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_StructFlexGMRESSolve( hypre_F90_PassObj (HYPRE_StructSolver, solver), hypre_F90_PassObj (HYPRE_StructMatrix, A), hypre_F90_PassObj (HYPRE_StructVector, b), hypre_F90_PassObj (HYPRE_StructVector, x) ) ); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_structfgmressettol, HYPRE_STRUCTFGMRESSETTOL) ( hypre_F90_Obj *solver, hypre_F90_Real *tol, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_StructFlexGMRESSetTol( hypre_F90_PassObj (HYPRE_StructSolver, solver), hypre_F90_PassReal (tol) ) ); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_structfgmressetabstol, HYPRE_STRUCTFGMRESSETABSTOL) ( hypre_F90_Obj *solver, hypre_F90_Real *tol, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_StructFlexGMRESSetAbsoluteTol( hypre_F90_PassObj (HYPRE_StructSolver, solver), hypre_F90_PassReal (tol) ) ); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_structfgmressetmaxiter, HYPRE_STRUCTFGMRESSETMAXITER) ( hypre_F90_Obj *solver, hypre_F90_Int *max_iter, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_StructFlexGMRESSetMaxIter( hypre_F90_PassObj (HYPRE_StructSolver, solver), hypre_F90_PassInt (max_iter) ) ); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_structfgmressetkdim, HYPRE_STRUCTFGMRESSETKDIM) (hypre_F90_Obj *solver, hypre_F90_Int *k_dim, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) (HYPRE_StructFlexGMRESSetKDim( hypre_F90_PassObj (HYPRE_StructSolver, solver), hypre_F90_PassInt (k_dim) )); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_structfgmressetprecond, HYPRE_STRUCTFGMRESSETPRECOND) ( hypre_F90_Obj *solver, hypre_F90_Int *precond_id, hypre_F90_Obj *precond_solver, hypre_F90_Int *ierr ) { /*------------------------------------------------------------ * The precond_id flags mean : * 0 - setup a smg preconditioner * 1 - setup a pfmg preconditioner * 6 - setup a jacobi preconditioner * 8 - setup a ds preconditioner * 9 - dont setup a preconditioner *------------------------------------------------------------*/ if (*precond_id == 0) { *ierr = (hypre_F90_Int) ( HYPRE_StructFlexGMRESSetPrecond( hypre_F90_PassObj (HYPRE_StructSolver, solver), HYPRE_StructSMGSolve, HYPRE_StructSMGSetup, hypre_F90_PassObj (HYPRE_StructSolver, precond_solver)) ); } else if (*precond_id == 1) { *ierr = (hypre_F90_Int) ( HYPRE_StructFlexGMRESSetPrecond( hypre_F90_PassObj (HYPRE_StructSolver, solver), HYPRE_StructPFMGSolve, HYPRE_StructPFMGSetup, hypre_F90_PassObj (HYPRE_StructSolver, precond_solver)) ); } else if (*precond_id == 6) { *ierr = (hypre_F90_Int) ( HYPRE_StructFlexGMRESSetPrecond( hypre_F90_PassObj (HYPRE_StructSolver, solver), HYPRE_StructJacobiSolve, HYPRE_StructJacobiSetup, hypre_F90_PassObj (HYPRE_StructSolver, precond_solver)) ); } else if (*precond_id == 8) { *ierr = (hypre_F90_Int) ( HYPRE_StructFlexGMRESSetPrecond( hypre_F90_PassObj (HYPRE_StructSolver, solver), HYPRE_StructDiagScale, HYPRE_StructDiagScaleSetup, hypre_F90_PassObj (HYPRE_StructSolver, precond_solver)) ); } else if (*precond_id == 9) { *ierr = 0; } else { *ierr = -1; } } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_structfgmressetlogging, HYPRE_STRUCTFGMRESSETLOGGING) ( hypre_F90_Obj *solver, hypre_F90_Int *logging, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_StructFlexGMRESSetLogging( hypre_F90_PassObj (HYPRE_StructSolver, solver), hypre_F90_PassInt (logging) ) ); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_structfgmressetprintlevel, HYPRE_STRUCTFGMRESSETPRINTLEVEL) ( hypre_F90_Obj *solver, hypre_F90_Int *print_level, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_StructFlexGMRESSetPrintLevel( hypre_F90_PassObj (HYPRE_StructSolver, solver), hypre_F90_PassInt (print_level) ) ); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_structfgmresgetnumiter, HYPRE_STRUCTFGMRESGETNUMITER) ( hypre_F90_Obj *solver, hypre_F90_Int *num_iterations, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_StructFlexGMRESGetNumIterations( hypre_F90_PassObj (HYPRE_StructSolver, solver), hypre_F90_PassIntRef (num_iterations) ) ); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_structfgmresgetfinalrel, HYPRE_STRUCTFGMRESGETFINALREL) ( hypre_F90_Obj *solver, hypre_F90_Real *norm, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_StructFlexGMRESGetFinalRelativeResidualNorm( hypre_F90_PassObj (HYPRE_StructSolver, solver), hypre_F90_PassRealRef (norm) ) ); } #ifdef __cplusplus } #endif hypre-2.33.0/src/struct_ls/F90_HYPRE_struct_gmres.c000066400000000000000000000213251477326011500220220ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "_hypre_struct_ls.h" #include "fortran.h" #ifdef __cplusplus extern "C" { #endif /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_structgmrescreate, HYPRE_STRUCTGMRESCREATE) ( hypre_F90_Comm *comm, hypre_F90_Obj *solver, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_StructGMRESCreate( hypre_F90_PassComm (comm), hypre_F90_PassObjRef (HYPRE_StructSolver, solver) ) ); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_structgmresdestroy, HYPRE_STRUCTGMRESDESTROY) ( hypre_F90_Obj *solver, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_StructGMRESDestroy( hypre_F90_PassObj (HYPRE_StructSolver, solver) ) ); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_structgmressetup, HYPRE_STRUCTGMRESSETUP) ( hypre_F90_Obj *solver, hypre_F90_Obj *A, hypre_F90_Obj *b, hypre_F90_Obj *x, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_StructGMRESSetup( hypre_F90_PassObj (HYPRE_StructSolver, solver), hypre_F90_PassObj (HYPRE_StructMatrix, A), hypre_F90_PassObj (HYPRE_StructVector, b), hypre_F90_PassObj (HYPRE_StructVector, x) ) ); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_structgmressolve, HYPRE_STRUCTGMRESSOLVE) ( hypre_F90_Obj *solver, hypre_F90_Obj *A, hypre_F90_Obj *b, hypre_F90_Obj *x, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_StructGMRESSolve( hypre_F90_PassObj (HYPRE_StructSolver, solver), hypre_F90_PassObj (HYPRE_StructMatrix, A), hypre_F90_PassObj (HYPRE_StructVector, b), hypre_F90_PassObj (HYPRE_StructVector, x) ) ); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_structgmressettol, HYPRE_STRUCTGMRESSETTOL) ( hypre_F90_Obj *solver, hypre_F90_Real *tol, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_StructGMRESSetTol( hypre_F90_PassObj (HYPRE_StructSolver, solver), hypre_F90_PassReal (tol) ) ); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_structgmressetabstol, HYPRE_STRUCTGMRESSETABSTOL) ( hypre_F90_Obj *solver, hypre_F90_Real *tol, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_StructGMRESSetAbsoluteTol( hypre_F90_PassObj (HYPRE_StructSolver, solver), hypre_F90_PassReal (tol) ) ); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_structgmressetmaxiter, HYPRE_STRUCTGMRESSETMAXITER) ( hypre_F90_Obj *solver, hypre_F90_Int *max_iter, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_StructGMRESSetMaxIter( hypre_F90_PassObj (HYPRE_StructSolver, solver), hypre_F90_PassInt (max_iter) ) ); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_structgmressetkdim, HYPRE_STRUCTGMRESSETKDIM) (hypre_F90_Obj *solver, hypre_F90_Int *k_dim, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) (HYPRE_StructGMRESSetKDim( hypre_F90_PassObj (HYPRE_StructSolver, solver), hypre_F90_PassInt (k_dim) )); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_structgmressetprecond, HYPRE_STRUCTGMRESSETPRECOND) ( hypre_F90_Obj *solver, hypre_F90_Int *precond_id, hypre_F90_Obj *precond_solver, hypre_F90_Int *ierr ) { /*------------------------------------------------------------ * The precond_id flags mean : * 0 - setup a smg preconditioner * 1 - setup a pfmg preconditioner * 6 - setup a jacobi preconditioner * 8 - setup a ds preconditioner * 9 - dont setup a preconditioner *------------------------------------------------------------*/ if (*precond_id == 0) { *ierr = (hypre_F90_Int) ( HYPRE_StructGMRESSetPrecond( hypre_F90_PassObj (HYPRE_StructSolver, solver), HYPRE_StructSMGSolve, HYPRE_StructSMGSetup, hypre_F90_PassObj (HYPRE_StructSolver, precond_solver)) ); } else if (*precond_id == 1) { *ierr = (hypre_F90_Int) ( HYPRE_StructGMRESSetPrecond( hypre_F90_PassObj (HYPRE_StructSolver, solver), HYPRE_StructPFMGSolve, HYPRE_StructPFMGSetup, hypre_F90_PassObj (HYPRE_StructSolver, precond_solver)) ); } else if (*precond_id == 6) { *ierr = (hypre_F90_Int) ( HYPRE_StructGMRESSetPrecond( hypre_F90_PassObj (HYPRE_StructSolver, solver), HYPRE_StructJacobiSolve, HYPRE_StructJacobiSetup, hypre_F90_PassObj (HYPRE_StructSolver, precond_solver)) ); } else if (*precond_id == 8) { *ierr = (hypre_F90_Int) ( HYPRE_StructGMRESSetPrecond( hypre_F90_PassObj (HYPRE_StructSolver, solver), HYPRE_StructDiagScale, HYPRE_StructDiagScaleSetup, hypre_F90_PassObj (HYPRE_StructSolver, precond_solver)) ); } else if (*precond_id == 9) { *ierr = 0; } else { *ierr = -1; } } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_structgmressetlogging, HYPRE_STRUCTGMRESSETLOGGING) ( hypre_F90_Obj *solver, hypre_F90_Int *logging, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_StructGMRESSetLogging( hypre_F90_PassObj (HYPRE_StructSolver, solver), hypre_F90_PassInt (logging) ) ); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_structgmressetprintlevel, HYPRE_STRUCTGMRESSETPRINTLEVEL) ( hypre_F90_Obj *solver, hypre_F90_Int *print_level, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_StructGMRESSetPrintLevel( hypre_F90_PassObj (HYPRE_StructSolver, solver), hypre_F90_PassInt (print_level) ) ); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_structgmresgetnumiteratio, HYPRE_STRUCTGMRESGETNUMITERATIO) ( hypre_F90_Obj *solver, hypre_F90_Int *num_iterations, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_StructGMRESGetNumIterations( hypre_F90_PassObj (HYPRE_StructSolver, solver), hypre_F90_PassIntRef (num_iterations) ) ); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_structgmresgetfinalrelati, HYPRE_STRUCTGMRESGETFINALRELATI) ( hypre_F90_Obj *solver, hypre_F90_Real *norm, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_StructGMRESGetFinalRelativeResidualNorm( hypre_F90_PassObj (HYPRE_StructSolver, solver), hypre_F90_PassRealRef (norm) ) ); } #ifdef __cplusplus } #endif hypre-2.33.0/src/struct_ls/F90_HYPRE_struct_hybrid.c000066400000000000000000000330211477326011500221620ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "_hypre_struct_ls.h" #include "fortran.h" #ifdef __cplusplus extern "C" { #endif /*-------------------------------------------------------------------------- * HYPRE_StructHybridCreate *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_structhybridcreate, HYPRE_STRUCTHYBRIDCREATE) ( hypre_F90_Comm *comm, hypre_F90_Obj *solver, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_StructHybridCreate( hypre_F90_PassComm (comm), hypre_F90_PassObjRef (HYPRE_StructSolver, solver) ) ); } /*-------------------------------------------------------------------------- * HYPRE_StructHybridDestroy *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_structhybriddestroy, HYPRE_STRUCTHYBRIDDESTROY) ( hypre_F90_Obj *solver, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_StructHybridDestroy( hypre_F90_PassObj (HYPRE_StructSolver, solver) ) ); } /*-------------------------------------------------------------------------- * HYPRE_StructHybridSetup *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_structhybridsetup, HYPRE_STRUCTHYBRIDSETUP) ( hypre_F90_Obj *solver, hypre_F90_Obj *A, hypre_F90_Obj *b, hypre_F90_Obj *x, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_StructHybridSetup( hypre_F90_PassObj (HYPRE_StructSolver, solver), hypre_F90_PassObj (HYPRE_StructMatrix, A), hypre_F90_PassObj (HYPRE_StructVector, b), hypre_F90_PassObj (HYPRE_StructVector, x) ) ); } /*-------------------------------------------------------------------------- * HYPRE_StructHybridSolve *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_structhybridsolve, HYPRE_STRUCTHYBRIDSOLVE) ( hypre_F90_Obj *solver, hypre_F90_Obj *A, hypre_F90_Obj *b, hypre_F90_Obj *x, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_StructHybridSolve( hypre_F90_PassObj (HYPRE_StructSolver, solver), hypre_F90_PassObj (HYPRE_StructMatrix, A), hypre_F90_PassObj (HYPRE_StructVector, b), hypre_F90_PassObj (HYPRE_StructVector, x) ) ); } /*-------------------------------------------------------------------------- * HYPRE_StructHybridSetTol *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_structhybridsettol, HYPRE_STRUCTHYBRIDSETTOL) ( hypre_F90_Obj *solver, hypre_F90_Real *tol, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_StructHybridSetTol( hypre_F90_PassObj (HYPRE_StructSolver, solver), hypre_F90_PassReal (tol) ) ); } /*-------------------------------------------------------------------------- * HYPRE_StructHybridSetConvergenceTol *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_structhybridsetconvergenc, HYPRE_STRUCTHYBRIDSETCONVERGENC) ( hypre_F90_Obj *solver, hypre_F90_Real *cf_tol, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_StructHybridSetConvergenceTol( hypre_F90_PassObj (HYPRE_StructSolver, solver), hypre_F90_PassReal (cf_tol) ) ); } /*-------------------------------------------------------------------------- * HYPRE_StructHybridSetDSCGMaxIter *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_structhybridsetdscgmaxite, HYPRE_STRUCTHYBRIDSETDSCGMAXITE) ( hypre_F90_Obj *solver, hypre_F90_Int *dscg_max_its, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_StructHybridSetDSCGMaxIter( hypre_F90_PassObj (HYPRE_StructSolver, solver), hypre_F90_PassInt (dscg_max_its) ) ); } /*-------------------------------------------------------------------------- * HYPRE_StructHybridSetPCGMaxIter *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_structhybridsetpcgmaxiter, HYPRE_STRUCTHYBRIDSETPCGMAXITER) ( hypre_F90_Obj *solver, hypre_F90_Int *pcg_max_its, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_StructHybridSetPCGMaxIter( hypre_F90_PassObj (HYPRE_StructSolver, solver), hypre_F90_PassInt (pcg_max_its) ) ); } /*-------------------------------------------------------------------------- * HYPRE_StructHybridSetPCGAbsoluteTolFactor *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_structhybridsetpcgabsolut, HYPRE_STRUCTHYBRIDSETPCGABSOLUT) ( hypre_F90_Obj *solver, hypre_F90_Real *pcg_atolf, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_StructHybridSetPCGAbsoluteTolFactor( hypre_F90_PassObj (HYPRE_StructSolver, solver), hypre_F90_PassReal (pcg_atolf) ) ); } /*-------------------------------------------------------------------------- * HYPRE_StructHybridSetTwoNorm *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_structhybridsettwonorm, HYPRE_STRUCTHYBRIDSETTWONORM) ( hypre_F90_Obj *solver, hypre_F90_Int *two_norm, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_StructHybridSetTwoNorm( hypre_F90_PassObj (HYPRE_StructSolver, solver), hypre_F90_PassInt (two_norm) ) ); } /*-------------------------------------------------------------------------- * HYPRE_StructHybridSetStopCrit *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_structhybridsetstopcrit, HYPRE_STRUCTHYBRIDSETSTOPCRIT) ( hypre_F90_Obj *solver, hypre_F90_Int *stop_crit, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_StructHybridSetStopCrit( hypre_F90_PassObj (HYPRE_StructSolver, solver), hypre_F90_PassInt (stop_crit) ) ); } /*-------------------------------------------------------------------------- * HYPRE_StructHybridSetRelChange *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_structhybridsetrelchange, HYPRE_STRUCTHYBRIDSETRELCHANGE) ( hypre_F90_Obj *solver, hypre_F90_Int *rel_change, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_StructHybridSetRelChange( hypre_F90_PassObj (HYPRE_StructSolver, solver), hypre_F90_PassInt (rel_change) ) ); } /*-------------------------------------------------------------------------- * HYPRE_StructHybridSetSolverType *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_structhybridsetsolvertype, HYPRE_STRUCTHYBRIDSETSOLVERTYPE) ( hypre_F90_Obj *solver, hypre_F90_Int *solver_type, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_StructHybridSetSolverType( hypre_F90_PassObj (HYPRE_StructSolver, solver), hypre_F90_PassInt (solver_type) ) ); } /*-------------------------------------------------------------------------- * HYPRE_StructHybridSetKDim *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_structhybridsetkdim, HYPRE_STRUCTHYBRIDSETKDIM) ( hypre_F90_Obj *solver, hypre_F90_Int *k_dim, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) (HYPRE_StructHybridSetKDim( hypre_F90_PassObj (HYPRE_StructSolver, solver), hypre_F90_PassInt (k_dim) ) ); } /*-------------------------------------------------------------------------- * HYPRE_StructHybridSetPrecond *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_structhybridsetprecond, HYPRE_STRUCTHYBRIDSETPRECOND) ( hypre_F90_Obj *solver, hypre_F90_Int *precond_id, hypre_F90_Obj *precond_solver, hypre_F90_Int *ierr ) { /*------------------------------------------------------------ * The precond_id flags mean : * 0 - setup a smg preconditioner * 1 - setup a pfmg preconditioner * 7 - setup a jacobi preconditioner * 8 - setup a ds preconditioner *------------------------------------------------------------*/ if (*precond_id == 0) { *ierr = (hypre_F90_Int) ( HYPRE_StructHybridSetPrecond( hypre_F90_PassObj (HYPRE_StructSolver, solver), HYPRE_StructSMGSolve, HYPRE_StructSMGSetup, hypre_F90_PassObj (HYPRE_StructSolver, precond_solver)) ); } else if (*precond_id == 1) { *ierr = (hypre_F90_Int) ( HYPRE_StructHybridSetPrecond( hypre_F90_PassObj (HYPRE_StructSolver, solver), HYPRE_StructPFMGSolve, HYPRE_StructPFMGSetup, hypre_F90_PassObj (HYPRE_StructSolver, precond_solver)) ); } else if (*precond_id == 7) { *ierr = (hypre_F90_Int) ( HYPRE_StructHybridSetPrecond( hypre_F90_PassObj (HYPRE_StructSolver, solver), HYPRE_StructJacobiSolve, HYPRE_StructJacobiSetup, hypre_F90_PassObj (HYPRE_StructSolver, precond_solver)) ); } else if (*precond_id == 8) { *ierr = (hypre_F90_Int) ( HYPRE_StructHybridSetPrecond( hypre_F90_PassObj (HYPRE_StructSolver, solver), HYPRE_StructDiagScale, HYPRE_StructDiagScaleSetup, hypre_F90_PassObj (HYPRE_StructSolver, precond_solver)) ); } else { *ierr = -1; } } /*-------------------------------------------------------------------------- * HYPRE_StructHybridSetLogging *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_structhybridsetlogging, HYPRE_STRUCTHYBRIDSETLOGGING) ( hypre_F90_Obj *solver, hypre_F90_Int *logging, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_StructHybridSetLogging( hypre_F90_PassObj (HYPRE_StructSolver, solver), hypre_F90_PassInt (logging) ) ); } /*-------------------------------------------------------------------------- * HYPRE_StructHybridSetPrintLevel *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_structhybridsetprintlevel, HYPRE_STRUCTHYBRIDSETPRINTLEVEL) ( hypre_F90_Obj *solver, hypre_F90_Int *print_level, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_StructHybridSetPrintLevel( hypre_F90_PassObj (HYPRE_StructSolver, solver), hypre_F90_PassInt (print_level) ) ); } /*-------------------------------------------------------------------------- * HYPRE_StructHybridGetNumIterations *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_structhybridgetnumiterati, HYPRE_STRUCTHYBRIDGETNUMITERATI) ( hypre_F90_Obj *solver, hypre_F90_Int *num_its, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_StructHybridGetNumIterations( hypre_F90_PassObj (HYPRE_StructSolver, solver), hypre_F90_PassIntRef (num_its) ) ); } /*-------------------------------------------------------------------------- * HYPRE_StructHybridGetDSCGNumIterations *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_structhybridgetdscgnumite, HYPRE_STRUCTHYBRIDGETDSCGNUMITE) ( hypre_F90_Obj *solver, hypre_F90_Int *dscg_num_its, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_StructHybridGetDSCGNumIterations( hypre_F90_PassObj (HYPRE_StructSolver, solver), hypre_F90_PassIntRef (dscg_num_its) ) ); } /*-------------------------------------------------------------------------- * HYPRE_StructHybridGetPCGNumIterations *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_structhybridgetpcgnumiter, HYPRE_STRUCTHYBRIDGETPCGNUMITER) ( hypre_F90_Obj *solver, hypre_F90_Int *pcg_num_its, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_StructHybridGetPCGNumIterations( hypre_F90_PassObj (HYPRE_StructSolver, solver), hypre_F90_PassIntRef (pcg_num_its) ) ); } /*-------------------------------------------------------------------------- * HYPRE_StructHybridGetFinalRelativeResidualNorm *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_structhybridgetfinalrelat, HYPRE_STRUCTHYBRIDGETFINALRELAT) ( hypre_F90_Obj *solver, hypre_F90_Real *norm, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_StructHybridGetFinalRelativeResidualNorm( hypre_F90_PassObj (HYPRE_StructSolver, solver), hypre_F90_PassRealRef (norm) ) ); } #ifdef __cplusplus } #endif hypre-2.33.0/src/struct_ls/F90_HYPRE_struct_int.c000066400000000000000000000045101477326011500214740ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "_hypre_struct_ls.h" #include "fortran.h" #ifdef __cplusplus extern "C" { #endif /*-------------------------------------------------------------------------- * HYPRE_StructVectorSetRandomValues *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_structvectorsetrandomvalu, HYPRE_STRUCTVECTORSETRANDOMVALU) (hypre_F90_Obj *vector, hypre_F90_Int *seed, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) ( hypre_StructVectorSetRandomValues( (hypre_StructVector *) vector, hypre_F90_PassInt (seed) )); } /*-------------------------------------------------------------------------- * HYPRE_StructSetRandomValues *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_structsetrandomvalues, HYPRE_STRUCTSETRANDOMVALUES) (hypre_F90_Obj *vector, hypre_F90_Int *seed, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) ( hypre_StructSetRandomValues( (hypre_StructVector *) vector, hypre_F90_PassInt (seed) )); } /*-------------------------------------------------------------------------- * HYPRE_StructSetupInterpreter *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_structsetupinterpreter, HYPRE_STRUCTSETUPINTERPRETER) (hypre_F90_Obj *i, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) ( HYPRE_StructSetupInterpreter( (mv_InterfaceInterpreter *) i )); } /*-------------------------------------------------------------------------- * HYPRE_StructSetupMatvec *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_structsetupmatvec, HYPRE_STRUCTSETUPMATVEC) (hypre_F90_Obj *mv, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) ( HYPRE_StructSetupMatvec( hypre_F90_PassObjRef (HYPRE_MatvecFunctions, mv))); } #ifdef __cplusplus } #endif hypre-2.33.0/src/struct_ls/F90_HYPRE_struct_jacobi.c000066400000000000000000000166401477326011500221400ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "_hypre_struct_ls.h" #include "fortran.h" #ifdef __cplusplus extern "C" { #endif /*-------------------------------------------------------------------------- * HYPRE_StructJacobiCreate *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_structjacobicreate, HYPRE_STRUCTJACOBICREATE) ( hypre_F90_Comm *comm, hypre_F90_Obj *solver, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_StructJacobiCreate( hypre_F90_PassComm (comm), hypre_F90_PassObjRef (HYPRE_StructSolver, solver) ) ); } /*-------------------------------------------------------------------------- * HYPRE_StructJacobiDestroy *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_structjacobidestroy, HYPRE_STRUCTJACOBIDESTROY) ( hypre_F90_Obj *solver, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_StructJacobiDestroy( hypre_F90_PassObj (HYPRE_StructSolver, solver) ) ); } /*-------------------------------------------------------------------------- * HYPRE_StructJacobiSetup *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_structjacobisetup, HYPRE_STRUCTJACOBISETUP) ( hypre_F90_Obj *solver, hypre_F90_Obj *A, hypre_F90_Obj *b, hypre_F90_Obj *x, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_StructJacobiSetup( hypre_F90_PassObj (HYPRE_StructSolver, solver), hypre_F90_PassObj (HYPRE_StructMatrix, A), hypre_F90_PassObj (HYPRE_StructVector, b), hypre_F90_PassObj (HYPRE_StructVector, x) ) ); } /*-------------------------------------------------------------------------- * HYPRE_StructJacobiSolve *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_structjacobisolve, HYPRE_STRUCTJACOBISOLVE) ( hypre_F90_Obj *solver, hypre_F90_Obj *A, hypre_F90_Obj *b, hypre_F90_Obj *x, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_StructJacobiSolve( hypre_F90_PassObj (HYPRE_StructSolver, solver), hypre_F90_PassObj (HYPRE_StructMatrix, A), hypre_F90_PassObj (HYPRE_StructVector, b), hypre_F90_PassObj (HYPRE_StructVector, x) ) ); } /*-------------------------------------------------------------------------- * HYPRE_StructJacobiSetTol *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_structjacobisettol, HYPRE_STRUCTJACOBISETTOL) ( hypre_F90_Obj *solver, hypre_F90_Real *tol, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_StructJacobiSetTol( hypre_F90_PassObj (HYPRE_StructSolver, solver), hypre_F90_PassReal (tol) ) ); } /*-------------------------------------------------------------------------- * HYPRE_StructJacobiGetTol *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_structjacobigettol, HYPRE_STRUCTJACOBIGETTOL) ( hypre_F90_Obj *solver, hypre_F90_Real *tol, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_StructJacobiGetTol( hypre_F90_PassObj (HYPRE_StructSolver, solver), hypre_F90_PassRealRef (tol) ) ); } /*-------------------------------------------------------------------------- * HYPRE_StructJacobiSetMaxIter *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_structjacobisetmaxiter, HYPRE_STRUCTJACOBISETMAXITER) ( hypre_F90_Obj *solver, hypre_F90_Int *max_iter, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_StructJacobiSetMaxIter( hypre_F90_PassObj (HYPRE_StructSolver, solver), hypre_F90_PassInt (max_iter) ) ); } /*-------------------------------------------------------------------------- * HYPRE_StructJacobiGetMaxIter *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_structjacobigetmaxiter, HYPRE_STRUCTJACOBIGETMAXITER) ( hypre_F90_Obj *solver, hypre_F90_Int *max_iter, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_StructJacobiGetMaxIter( hypre_F90_PassObj (HYPRE_StructSolver, solver), hypre_F90_PassIntRef (max_iter) ) ); } /*-------------------------------------------------------------------------- * HYPRE_StructJacobiSetZeroGuess *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_structjacobisetzeroguess, HYPRE_STRUCTJACOBISETZEROGUESS) ( hypre_F90_Obj *solver, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_StructJacobiSetZeroGuess( hypre_F90_PassObj (HYPRE_StructSolver, solver) ) ); } /*-------------------------------------------------------------------------- * HYPRE_StructJacobiGetZeroGuess *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_structjacobigetzeroguess, HYPRE_STRUCTJACOBIGETZEROGUESS) ( hypre_F90_Obj *solver, hypre_F90_Int *zeroguess, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_StructJacobiGetZeroGuess( hypre_F90_PassObj (HYPRE_StructSolver, solver), hypre_F90_PassIntRef (zeroguess) ) ); } /*-------------------------------------------------------------------------- * HYPRE_StructJacobiSetNonZeroGuess *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_structjacobisetnonzerogue, HYPRE_STRUCTJACOBISETNONZEROGUE) ( hypre_F90_Obj *solver, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_StructJacobiSetNonZeroGuess( hypre_F90_PassObj (HYPRE_StructSolver, solver) ) ); } /*-------------------------------------------------------------------------- * HYPRE_StructJacobiGetNumIterations *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_structjacobigetnumiterati, HYPRE_STRUCTJACOBIGETNUMITERATI) ( hypre_F90_Obj *solver, hypre_F90_Int *num_iterations, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_StructJacobiGetNumIterations( hypre_F90_PassObj (HYPRE_StructSolver, solver), hypre_F90_PassIntRef (num_iterations) ) ); } /*-------------------------------------------------------------------------- * HYPRE_StructJacobiGetFinalRelativeResidualNorm *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_structjacobigetfinalrelat, HYPRE_STRUCTJACOBIGETFINALRELAT) ( hypre_F90_Obj *solver, hypre_F90_Real *norm, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_StructJacobiGetFinalRelativeResidualNorm( hypre_F90_PassObj (HYPRE_StructSolver, solver), hypre_F90_PassRealRef (norm) ) ); } #ifdef __cplusplus } #endif hypre-2.33.0/src/struct_ls/F90_HYPRE_struct_lgmres.c000066400000000000000000000223331477326011500221760ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "_hypre_struct_ls.h" #include "fortran.h" #ifdef __cplusplus extern "C" { #endif /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_structlgmrescreate, HYPRE_STRUCTLGMRESCREATE) ( hypre_F90_Comm *comm, hypre_F90_Obj *solver, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_StructLGMRESCreate( hypre_F90_PassComm (comm), hypre_F90_PassObjRef (HYPRE_StructSolver, solver) ) ); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_structlgmresdestroy, HYPRE_STRUCTLGMRESDESTROY) ( hypre_F90_Obj *solver, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_StructLGMRESDestroy( hypre_F90_PassObj (HYPRE_StructSolver, solver) ) ); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_structlgmressetup, HYPRE_STRUCTLGMRESSETUP) ( hypre_F90_Obj *solver, hypre_F90_Obj *A, hypre_F90_Obj *b, hypre_F90_Obj *x, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_StructLGMRESSetup( hypre_F90_PassObj (HYPRE_StructSolver, solver), hypre_F90_PassObj (HYPRE_StructMatrix, A), hypre_F90_PassObj (HYPRE_StructVector, b), hypre_F90_PassObj (HYPRE_StructVector, x) ) ); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_structlgmressolve, HYPRE_STRUCTLGMRESSOLVE) ( hypre_F90_Obj *solver, hypre_F90_Obj *A, hypre_F90_Obj *b, hypre_F90_Obj *x, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_StructLGMRESSolve( hypre_F90_PassObj (HYPRE_StructSolver, solver), hypre_F90_PassObj (HYPRE_StructMatrix, A), hypre_F90_PassObj (HYPRE_StructVector, b), hypre_F90_PassObj (HYPRE_StructVector, x) ) ); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_structlgmressettol, HYPRE_STRUCTLGMRESSETTOL) ( hypre_F90_Obj *solver, hypre_F90_Real *tol, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_StructLGMRESSetTol( hypre_F90_PassObj (HYPRE_StructSolver, solver), hypre_F90_PassReal (tol) ) ); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_structlgmressetabstol, HYPRE_STRUCTLGMRESSETABSTOL) ( hypre_F90_Obj *solver, hypre_F90_Real *tol, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_StructLGMRESSetAbsoluteTol( hypre_F90_PassObj (HYPRE_StructSolver, solver), hypre_F90_PassReal (tol) ) ); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_structlgmressetmaxiter, HYPRE_STRUCTLGMRESSETMAXITER) ( hypre_F90_Obj *solver, hypre_F90_Int *max_iter, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_StructLGMRESSetMaxIter( hypre_F90_PassObj (HYPRE_StructSolver, solver), hypre_F90_PassInt (max_iter) ) ); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_structlgmressetkdim, HYPRE_STRUCTLGMRESSETKDIM) (hypre_F90_Obj *solver, hypre_F90_Int *k_dim, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) (HYPRE_StructLGMRESSetKDim( hypre_F90_PassObj (HYPRE_StructSolver, solver), hypre_F90_PassInt (k_dim) )); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_structlgmressetaugdim, HYPRE_STRUCTLGMRESSETAUGDIM) (hypre_F90_Obj *solver, hypre_F90_Int *aug_dim, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) (HYPRE_StructLGMRESSetAugDim( hypre_F90_PassObj (HYPRE_StructSolver, solver), hypre_F90_PassInt (aug_dim) )); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_structlgmressetprecond, HYPRE_STRUCTLGMRESSETPRECOND) ( hypre_F90_Obj *solver, hypre_F90_Int *precond_id, hypre_F90_Obj *precond_solver, hypre_F90_Int *ierr ) { /*------------------------------------------------------------ * The precond_id flags mean : * 0 - setup a smg preconditioner * 1 - setup a pfmg preconditioner * 6 - setup a jacobi preconditioner * 8 - setup a ds preconditioner * 9 - dont setup a preconditioner *------------------------------------------------------------*/ if (*precond_id == 0) { *ierr = (hypre_F90_Int) ( HYPRE_StructLGMRESSetPrecond( hypre_F90_PassObj (HYPRE_StructSolver, solver), HYPRE_StructSMGSolve, HYPRE_StructSMGSetup, hypre_F90_PassObj (HYPRE_StructSolver, precond_solver)) ); } else if (*precond_id == 1) { *ierr = (hypre_F90_Int) ( HYPRE_StructLGMRESSetPrecond( hypre_F90_PassObj (HYPRE_StructSolver, solver), HYPRE_StructPFMGSolve, HYPRE_StructPFMGSetup, hypre_F90_PassObj (HYPRE_StructSolver, precond_solver)) ); } else if (*precond_id == 6) { *ierr = (hypre_F90_Int) ( HYPRE_StructLGMRESSetPrecond( hypre_F90_PassObj (HYPRE_StructSolver, solver), HYPRE_StructJacobiSolve, HYPRE_StructJacobiSetup, hypre_F90_PassObj (HYPRE_StructSolver, precond_solver)) ); } else if (*precond_id == 8) { *ierr = (hypre_F90_Int) ( HYPRE_StructLGMRESSetPrecond( hypre_F90_PassObj (HYPRE_StructSolver, solver), HYPRE_StructDiagScale, HYPRE_StructDiagScaleSetup, hypre_F90_PassObj (HYPRE_StructSolver, precond_solver)) ); } else if (*precond_id == 9) { *ierr = 0; } else { *ierr = -1; } } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_structlgmressetlogging, HYPRE_STRUCTLGMRESSETLOGGING) ( hypre_F90_Obj *solver, hypre_F90_Int *logging, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_StructLGMRESSetLogging( hypre_F90_PassObj (HYPRE_StructSolver, solver), hypre_F90_PassInt (logging) ) ); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_structlgmressetprintlevel, HYPRE_STRUCTLGMRESSETPRINTLEVEL) ( hypre_F90_Obj *solver, hypre_F90_Int *print_level, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_StructLGMRESSetPrintLevel( hypre_F90_PassObj (HYPRE_StructSolver, solver), hypre_F90_PassInt (print_level) ) ); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_structlgmresgetnumiter, HYPRE_STRUCTLGMRESGETNUMITER) ( hypre_F90_Obj *solver, hypre_F90_Int *num_iterations, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_StructLGMRESGetNumIterations( hypre_F90_PassObj (HYPRE_StructSolver, solver), hypre_F90_PassIntRef (num_iterations) ) ); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_structlgmresgetfinalrel, HYPRE_STRUCTLGMRESGETFINALREL) ( hypre_F90_Obj *solver, hypre_F90_Real *norm, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_StructLGMRESGetFinalRelativeResidualNorm( hypre_F90_PassObj (HYPRE_StructSolver, solver), hypre_F90_PassRealRef (norm) ) ); } #ifdef __cplusplus } #endif hypre-2.33.0/src/struct_ls/F90_HYPRE_struct_pcg.c000066400000000000000000000247171477326011500214660ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "_hypre_struct_ls.h" #include "fortran.h" #ifdef __cplusplus extern "C" { #endif /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_structpcgcreate, HYPRE_STRUCTPCGCREATE) ( hypre_F90_Comm *comm, hypre_F90_Obj *solver, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_StructPCGCreate( hypre_F90_PassComm (comm), hypre_F90_PassObjRef (HYPRE_StructSolver, solver) ) ); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_structpcgdestroy, HYPRE_STRUCTPCGDESTROY) ( hypre_F90_Obj *solver, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_StructPCGDestroy( hypre_F90_PassObj (HYPRE_StructSolver, solver) ) ); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_structpcgsetup, HYPRE_STRUCTPCGSETUP) ( hypre_F90_Obj *solver, hypre_F90_Obj *A, hypre_F90_Obj *b, hypre_F90_Obj *x, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_StructPCGSetup( hypre_F90_PassObj (HYPRE_StructSolver, solver), hypre_F90_PassObj (HYPRE_StructMatrix, A), hypre_F90_PassObj (HYPRE_StructVector, b), hypre_F90_PassObj (HYPRE_StructVector, x) ) ); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_structpcgsolve, HYPRE_STRUCTPCGSOLVE) ( hypre_F90_Obj *solver, hypre_F90_Obj *A, hypre_F90_Obj *b, hypre_F90_Obj *x, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_StructPCGSolve( hypre_F90_PassObj (HYPRE_StructSolver, solver), hypre_F90_PassObj (HYPRE_StructMatrix, A), hypre_F90_PassObj (HYPRE_StructVector, b), hypre_F90_PassObj (HYPRE_StructVector, x) ) ); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_structpcgsettol, HYPRE_STRUCTPCGSETTOL) ( hypre_F90_Obj *solver, hypre_F90_Real *tol, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_StructPCGSetTol( hypre_F90_PassObj (HYPRE_StructSolver, solver), hypre_F90_PassReal (tol) ) ); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_structpcgsetabstol, HYPRE_STRUCTPCGSETABSTOL) ( hypre_F90_Obj *solver, hypre_F90_Real *tol, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_StructPCGSetAbsoluteTol( hypre_F90_PassObj (HYPRE_StructSolver, solver), hypre_F90_PassReal (tol) ) ); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_structpcgsetmaxiter, HYPRE_STRUCTPCGSETMAXITER) ( hypre_F90_Obj *solver, hypre_F90_Int *max_iter, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_StructPCGSetMaxIter( hypre_F90_PassObj (HYPRE_StructSolver, solver), hypre_F90_PassInt (max_iter) ) ); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_structpcgsettwonorm, HYPRE_STRUCTPCGSETTWONORM) ( hypre_F90_Obj *solver, hypre_F90_Int *two_norm, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_StructPCGSetTwoNorm( hypre_F90_PassObj (HYPRE_StructSolver, solver), hypre_F90_PassInt (two_norm) ) ); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_structpcgsetrelchange, HYPRE_STRUCTPCGSETRELCHANGE) ( hypre_F90_Obj *solver, hypre_F90_Int *rel_change, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_StructPCGSetRelChange( hypre_F90_PassObj (HYPRE_StructSolver, solver), hypre_F90_PassInt (rel_change) ) ); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_structpcgsetprecond, HYPRE_STRUCTPCGSETPRECOND) ( hypre_F90_Obj *solver, hypre_F90_Int *precond_id, hypre_F90_Obj *precond_solver, hypre_F90_Int *ierr ) { /*------------------------------------------------------------ * The precond_id flags mean : * 0 - setup a smg preconditioner * 1 - setup a pfmg preconditioner * 7 - setup a jacobi preconditioner * 8 - setup a ds preconditioner * 9 - dont setup a preconditioner *------------------------------------------------------------*/ if (*precond_id == 0) { *ierr = (hypre_F90_Int) ( HYPRE_StructPCGSetPrecond( hypre_F90_PassObj (HYPRE_StructSolver, solver), HYPRE_StructSMGSolve, HYPRE_StructSMGSetup, hypre_F90_PassObj (HYPRE_StructSolver, precond_solver)) ); } else if (*precond_id == 1) { *ierr = (hypre_F90_Int) ( HYPRE_StructPCGSetPrecond( hypre_F90_PassObj (HYPRE_StructSolver, solver), HYPRE_StructPFMGSolve, HYPRE_StructPFMGSetup, hypre_F90_PassObj (HYPRE_StructSolver, precond_solver)) ); } else if (*precond_id == 7) { *ierr = (hypre_F90_Int) ( HYPRE_StructPCGSetPrecond( hypre_F90_PassObj (HYPRE_StructSolver, solver), HYPRE_StructJacobiSolve, HYPRE_StructJacobiSetup, hypre_F90_PassObj (HYPRE_StructSolver, precond_solver)) ); } else if (*precond_id == 8) { *ierr = (hypre_F90_Int) ( HYPRE_StructPCGSetPrecond( hypre_F90_PassObj (HYPRE_StructSolver, solver), HYPRE_StructDiagScale, HYPRE_StructDiagScaleSetup, hypre_F90_PassObj (HYPRE_StructSolver, precond_solver)) ); } else if (*precond_id == 9) { *ierr = 0; } else { *ierr = -1; } } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_structpcgsetlogging, HYPRE_STRUCTPCGSETLOGGING) ( hypre_F90_Obj *solver, hypre_F90_Int *logging, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_StructPCGSetLogging( hypre_F90_PassObj (HYPRE_StructSolver, solver), hypre_F90_PassInt (logging) ) ); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_structpcgsetprintlevel, HYPRE_STRUCTPCGSETPRINTLEVEL) ( hypre_F90_Obj *solver, hypre_F90_Int *print_level, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_StructPCGSetPrintLevel( hypre_F90_PassObj (HYPRE_StructSolver, solver), hypre_F90_PassInt (print_level) ) ); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_structpcggetnumiterations, HYPRE_STRUCTPCGGETNUMITERATIONS) ( hypre_F90_Obj *solver, hypre_F90_Int *num_iterations, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_StructPCGGetNumIterations( hypre_F90_PassObj (HYPRE_StructSolver, solver), hypre_F90_PassIntRef (num_iterations) ) ); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_structpcggetfinalrelative, HYPRE_STRUCTPCGGETFINALRELATIVE) ( hypre_F90_Obj *solver, hypre_F90_Real *norm, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_StructPCGGetFinalRelativeResidualNorm( hypre_F90_PassObj (HYPRE_StructSolver, solver), hypre_F90_PassRealRef (norm) ) ); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_structdiagscalesetup, HYPRE_STRUCTDIAGSCALESETUP) ( hypre_F90_Obj *solver, hypre_F90_Obj *A, hypre_F90_Obj *y, hypre_F90_Obj *x, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_StructDiagScaleSetup( hypre_F90_PassObj (HYPRE_StructSolver, solver), hypre_F90_PassObj (HYPRE_StructMatrix, A), hypre_F90_PassObj (HYPRE_StructVector, y), hypre_F90_PassObj (HYPRE_StructVector, x) ) ); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_structdiagscale, HYPRE_STRUCTDIAGSCALE) ( hypre_F90_Obj *solver, hypre_F90_Obj *HA, hypre_F90_Obj *Hy, hypre_F90_Obj *Hx, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_StructDiagScale( hypre_F90_PassObj (HYPRE_StructSolver, solver), hypre_F90_PassObj (HYPRE_StructMatrix, HA), hypre_F90_PassObj (HYPRE_StructVector, Hy), hypre_F90_PassObj (HYPRE_StructVector, Hx) ) ); } #ifdef __cplusplus } #endif hypre-2.33.0/src/struct_ls/F90_HYPRE_struct_pfmg.c000066400000000000000000000402251477326011500216360ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "_hypre_struct_ls.h" #include "fortran.h" #ifdef __cplusplus extern "C" { #endif /*-------------------------------------------------------------------------- * HYPRE_StructPFMGCreate *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_structpfmgcreate, HYPRE_STRUCTPFMGCREATE) ( hypre_F90_Comm *comm, hypre_F90_Obj *solver, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_StructPFMGCreate( hypre_F90_PassComm (comm), hypre_F90_PassObjRef (HYPRE_StructSolver, solver) ) ); } /*-------------------------------------------------------------------------- * HYPRE_StructPFMGDestroy *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_structpfmgdestroy, HYPRE_STRUCTPFMGDESTROY) ( hypre_F90_Obj *solver, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_StructPFMGDestroy( hypre_F90_PassObj (HYPRE_StructSolver, solver) ) ); } /*-------------------------------------------------------------------------- * HYPRE_StructPFMGSetup *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_structpfmgsetup, HYPRE_STRUCTPFMGSETUP) ( hypre_F90_Obj *solver, hypre_F90_Obj *A, hypre_F90_Obj *b, hypre_F90_Obj *x, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_StructPFMGSetup( hypre_F90_PassObj (HYPRE_StructSolver, solver), hypre_F90_PassObj (HYPRE_StructMatrix, A), hypre_F90_PassObj (HYPRE_StructVector, b), hypre_F90_PassObj (HYPRE_StructVector, x) ) ); } /*-------------------------------------------------------------------------- * HYPRE_StructPFMGSolve *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_structpfmgsolve, HYPRE_STRUCTPFMGSOLVE) ( hypre_F90_Obj *solver, hypre_F90_Obj *A, hypre_F90_Obj *b, hypre_F90_Obj *x, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_StructPFMGSolve( hypre_F90_PassObj (HYPRE_StructSolver, solver), hypre_F90_PassObj (HYPRE_StructMatrix, A), hypre_F90_PassObj (HYPRE_StructVector, b), hypre_F90_PassObj (HYPRE_StructVector, x) ) ); } /*-------------------------------------------------------------------------- * HYPRE_StructPFMGSetTol, HYPRE_StructPFMGGetTol *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_structpfmgsettol, HYPRE_STRUCTPFMGSETTOL) ( hypre_F90_Obj *solver, hypre_F90_Real *tol, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_StructPFMGSetTol( hypre_F90_PassObj (HYPRE_StructSolver, solver), hypre_F90_PassReal (tol) ) ); } void hypre_F90_IFACE(hypre_structpfmggettol, HYPRE_STRUCTPFMGGETTOL) ( hypre_F90_Obj *solver, hypre_F90_Real *tol, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_StructPFMGGetTol( hypre_F90_PassObj (HYPRE_StructSolver, solver), hypre_F90_PassRealRef (tol) ) ); } /*-------------------------------------------------------------------------- * HYPRE_StructPFMGSetMaxIter, HYPRE_StructPFMGGetMaxIter *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_structpfmgsetmaxiter, HYPRE_STRUCTPFMGSETMAXITER) ( hypre_F90_Obj *solver, hypre_F90_Int *max_iter, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_StructPFMGSetMaxIter( hypre_F90_PassObj (HYPRE_StructSolver, solver), hypre_F90_PassInt (max_iter) ) ); } void hypre_F90_IFACE(hypre_structpfmggetmaxiter, HYPRE_STRUCTPFMGGETMAXITER) ( hypre_F90_Obj *solver, hypre_F90_Int *max_iter, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_StructPFMGGetMaxIter( hypre_F90_PassObj (HYPRE_StructSolver, solver), hypre_F90_PassIntRef (max_iter) ) ); } /*-------------------------------------------------------------------------- * HYPRE_StructPFMGSetMaxLevels, HYPRE_StructPFMGGetMaxLevels *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_structpfmgsetmaxlevels, HYPRE_STRUCTPFMGSETMAXLEVELS) ( hypre_F90_Obj *solver, hypre_F90_Int *max_levels, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_StructPFMGSetMaxLevels( hypre_F90_PassObj (HYPRE_StructSolver, solver), hypre_F90_PassInt (max_levels) ) ); } void hypre_F90_IFACE(hypre_structpfmggetmaxlevels, HYPRE_STRUCTPFMGGETMAXLEVELS) ( hypre_F90_Obj *solver, hypre_F90_Int *max_levels, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_StructPFMGGetMaxLevels( hypre_F90_PassObj (HYPRE_StructSolver, solver), hypre_F90_PassIntRef (max_levels) ) ); } /*-------------------------------------------------------------------------- * HYPRE_StructPFMGSetRelChange, HYPRE_StructPFMGGetRelChange *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_structpfmgsetrelchange, HYPRE_STRUCTPFMGSETRELCHANGE) ( hypre_F90_Obj *solver, hypre_F90_Int *rel_change, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_StructPFMGSetRelChange( hypre_F90_PassObj (HYPRE_StructSolver, solver), hypre_F90_PassInt (rel_change) ) ); } void hypre_F90_IFACE(hypre_structpfmggetrelchange, HYPRE_STRUCTPFMGGETRELCHANGE) ( hypre_F90_Obj *solver, hypre_F90_Int *rel_change, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_StructPFMGGetRelChange( hypre_F90_PassObj (HYPRE_StructSolver, solver), hypre_F90_PassIntRef (rel_change) ) ); } /*-------------------------------------------------------------------------- * HYPRE_StructPFMGSetZeroGuess, HYPRE_StructPFMGGetZeroGuess *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_structpfmgsetzeroguess, HYPRE_STRUCTPFMGSETZEROGUESS) ( hypre_F90_Obj *solver, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_StructPFMGSetZeroGuess( hypre_F90_PassObj (HYPRE_StructSolver, solver) ) ); } void hypre_F90_IFACE(hypre_structpfmggetzeroguess, HYPRE_STRUCTPFMGGETZEROGUESS) ( hypre_F90_Obj *solver, hypre_F90_Int *zeroguess, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_StructPFMGGetZeroGuess( hypre_F90_PassObj (HYPRE_StructSolver, solver), hypre_F90_PassIntRef (zeroguess) ) ); } /*-------------------------------------------------------------------------- * HYPRE_StructPFMGSetNonZeroGuess *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_structpfmgsetnonzeroguess, HYPRE_STRUCTPFMGSETNONZEROGUESS) ( hypre_F90_Obj *solver, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_StructPFMGSetNonZeroGuess( hypre_F90_PassObj (HYPRE_StructSolver, solver) ) ); } /*-------------------------------------------------------------------------- * HYPRE_StructPFMGSetRelaxType, HYPRE_StructPFMGGetRelaxType *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_structpfmgsetrelaxtype, HYPRE_STRUCTPFMGSETRELAXTYPE) ( hypre_F90_Obj *solver, hypre_F90_Int *relax_type, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_StructPFMGSetRelaxType( hypre_F90_PassObj (HYPRE_StructSolver, solver), hypre_F90_PassInt (relax_type) ) ); } void hypre_F90_IFACE(hypre_structpfmggetrelaxtype, HYPRE_STRUCTPFMGGETRELAXTYPE) ( hypre_F90_Obj *solver, hypre_F90_Int *relax_type, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_StructPFMGGetRelaxType( hypre_F90_PassObj (HYPRE_StructSolver, solver), hypre_F90_PassIntRef (relax_type) ) ); } /*-------------------------------------------------------------------------- * HYPRE_StructPFMGSetJacobiWeight *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_structpfmgsetjacobiweigh, HYPRE_STRUCTPFMGSETJACOBIWEIGH) (hypre_F90_Obj *solver, hypre_F90_Real *weight, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) (HYPRE_StructPFMGSetJacobiWeight( hypre_F90_PassObj (HYPRE_StructSolver, solver), hypre_F90_PassReal (weight) ) ); } /*-------------------------------------------------------------------------- * HYPRE_StructPFMGSetRAPType, HYPRE_StructPFMGSetRapType *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_structpfmgsetraptype, HYPRE_STRUCTPFMGSETRAPTYPE) ( hypre_F90_Obj *solver, hypre_F90_Int *rap_type, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_StructPFMGSetRAPType( hypre_F90_PassObj (HYPRE_StructSolver, solver), hypre_F90_PassInt (rap_type) ) ); } void hypre_F90_IFACE(hypre_structpfmggetraptype, HYPRE_STRUCTPFMGGETRAPTYPE) ( hypre_F90_Obj *solver, hypre_F90_Int *rap_type, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_StructPFMGGetRAPType( hypre_F90_PassObj (HYPRE_StructSolver, solver), hypre_F90_PassIntRef (rap_type) ) ); } /*-------------------------------------------------------------------------- * HYPRE_StructPFMGSetNumPreRelax, HYPRE_StructPFMGGetNumPreRelax *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_structpfmgsetnumprerelax, HYPRE_STRUCTPFMGSETNUMPRERELAX) ( hypre_F90_Obj *solver, hypre_F90_Int *num_pre_relax, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_StructPFMGSetNumPreRelax( hypre_F90_PassObj (HYPRE_StructSolver, solver), hypre_F90_PassInt (num_pre_relax) ) ); } void hypre_F90_IFACE(hypre_structpfmggetnumprerelax, HYPRE_STRUCTPFMGGETNUMPRERELAX) ( hypre_F90_Obj *solver, hypre_F90_Int *num_pre_relax, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_StructPFMGGetNumPreRelax( hypre_F90_PassObj (HYPRE_StructSolver, solver), hypre_F90_PassIntRef (num_pre_relax) ) ); } /*-------------------------------------------------------------------------- * HYPRE_StructPFMGSetNumPostRelax, HYPRE_StructPFMGGetNumPostRelax *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_structpfmgsetnumpostrelax, HYPRE_STRUCTPFMGSETNUMPOSTRELAX) ( hypre_F90_Obj *solver, hypre_F90_Int *num_post_relax, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_StructPFMGSetNumPostRelax( hypre_F90_PassObj (HYPRE_StructSolver, solver), hypre_F90_PassInt (num_post_relax) ) ); } void hypre_F90_IFACE(hypre_structpfmggetnumpostrelax, HYPRE_STRUCTPFMGGETNUMPOSTRELAX) ( hypre_F90_Obj *solver, hypre_F90_Int *num_post_relax, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_StructPFMGGetNumPostRelax( hypre_F90_PassObj (HYPRE_StructSolver, solver), hypre_F90_PassIntRef (num_post_relax) ) ); } /*-------------------------------------------------------------------------- * HYPRE_StructPFMGSetSkipRelax, HYPRE_StructPFMGGetSkipRelax *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_structpfmgsetskiprelax, HYPRE_STRUCTPFMGSETSKIPRELAX) ( hypre_F90_Obj *solver, hypre_F90_Int *skip_relax, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_StructPFMGSetSkipRelax( hypre_F90_PassObj (HYPRE_StructSolver, solver), hypre_F90_PassInt (skip_relax) ) ); } void hypre_F90_IFACE(hypre_structpfmggetskiprelax, HYPRE_STRUCTPFMGGETSKIPRELAX) ( hypre_F90_Obj *solver, hypre_F90_Int *skip_relax, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_StructPFMGGetSkipRelax( hypre_F90_PassObj (HYPRE_StructSolver, solver), hypre_F90_PassIntRef (skip_relax) ) ); } /*-------------------------------------------------------------------------- * HYPRE_StructPFMGSetDxyz *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_structpfmgsetdxyz, HYPRE_STRUCTPFMGSETDXYZ) ( hypre_F90_Obj *solver, hypre_F90_RealArray *dxyz, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_StructPFMGSetDxyz( hypre_F90_PassObj (HYPRE_StructSolver, solver), hypre_F90_PassRealArray (dxyz) ) ); } /*-------------------------------------------------------------------------- * HYPRE_StructPFMGSetLogging, HYPRE_StructPFMGGetLogging *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_structpfmgsetlogging, HYPRE_STRUCTPFMGSETLOGGING) ( hypre_F90_Obj *solver, hypre_F90_Int *logging, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_StructPFMGSetLogging( hypre_F90_PassObj (HYPRE_StructSolver, solver), hypre_F90_PassInt (logging) ) ); } void hypre_F90_IFACE(hypre_structpfmggetlogging, HYPRE_STRUCTPFMGGETLOGGING) ( hypre_F90_Obj *solver, hypre_F90_Int *logging, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_StructPFMGGetLogging( hypre_F90_PassObj (HYPRE_StructSolver, solver), hypre_F90_PassIntRef (logging) ) ); } /*-------------------------------------------------------------------------- * HYPRE_StructPFMGSetPrintLevel, HYPRE_StructPFMGGetPrintLevel *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_structpfmgsetprintlevel, HYPRE_STRUCTPFMGSETPRINTLEVEL) ( hypre_F90_Obj *solver, hypre_F90_Int *print_level, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_StructPFMGSetPrintLevel( hypre_F90_PassObj (HYPRE_StructSolver, solver), hypre_F90_PassInt (print_level) ) ); } void hypre_F90_IFACE(hypre_structpfmggetprintlevel, HYPRE_STRUCTPFMGGETPRINTLEVEL) ( hypre_F90_Obj *solver, hypre_F90_Int *print_level, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_StructPFMGGetPrintLevel( hypre_F90_PassObj (HYPRE_StructSolver, solver), hypre_F90_PassIntRef (print_level) ) ); } /*-------------------------------------------------------------------------- * HYPRE_StructPFMGGetNumIterations *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_structpfmggetnumiteration, HYPRE_STRUCTPFMGGETNUMITERATION) ( hypre_F90_Obj *solver, hypre_F90_Int *num_iterations, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_StructPFMGGetNumIterations( hypre_F90_PassObj (HYPRE_StructSolver, solver), hypre_F90_PassIntRef (num_iterations) ) ); } /*-------------------------------------------------------------------------- * HYPRE_StructPFMGGetFinalRelativeResidualNorm *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_structpfmggetfinalrelativ, HYPRE_STRUCTPFMGGETFINALRELATIV) ( hypre_F90_Obj *solver, hypre_F90_Real *norm, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_StructPFMGGetFinalRelativeResidualNorm( hypre_F90_PassObj (HYPRE_StructSolver, solver), hypre_F90_PassRealRef (norm) ) ); } #ifdef __cplusplus } #endif hypre-2.33.0/src/struct_ls/F90_HYPRE_struct_smg.c000066400000000000000000000310261477326011500214720ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * HYPRE_StructSMG Fortran interface * *****************************************************************************/ #include "_hypre_struct_ls.h" #include "fortran.h" #ifdef __cplusplus extern "C" { #endif /*-------------------------------------------------------------------------- * HYPRE_StructSMGCreate *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_structsmgcreate, HYPRE_STRUCTSMGCREATE) ( hypre_F90_Comm *comm, hypre_F90_Obj *solver, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_StructSMGCreate( hypre_F90_PassComm (comm), hypre_F90_PassObjRef (HYPRE_StructSolver, solver) ) ); } /*-------------------------------------------------------------------------- * HYPRE_StructSMGDestroy *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_structsmgdestroy, HYPRE_STRUCTSMGDESTROY) ( hypre_F90_Obj *solver, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_StructSMGDestroy( hypre_F90_PassObj (HYPRE_StructSolver, solver) ) ); } /*-------------------------------------------------------------------------- * HYPRE_StructSMGSetup *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_structsmgsetup, HYPRE_STRUCTSMGSETUP) ( hypre_F90_Obj *solver, hypre_F90_Obj *A, hypre_F90_Obj *b, hypre_F90_Obj *x, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_StructSMGSetup( hypre_F90_PassObj (HYPRE_StructSolver, solver), hypre_F90_PassObj (HYPRE_StructMatrix, A), hypre_F90_PassObj (HYPRE_StructVector, b), hypre_F90_PassObj (HYPRE_StructVector, x) ) ); } /*-------------------------------------------------------------------------- * HYPRE_StructSMGSolve *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_structsmgsolve, HYPRE_STRUCTSMGSOLVE) ( hypre_F90_Obj *solver, hypre_F90_Obj *A, hypre_F90_Obj *b, hypre_F90_Obj *x, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_StructSMGSolve( hypre_F90_PassObj (HYPRE_StructSolver, solver), hypre_F90_PassObj (HYPRE_StructMatrix, A), hypre_F90_PassObj (HYPRE_StructVector, b), hypre_F90_PassObj (HYPRE_StructVector, x) ) ); } /*-------------------------------------------------------------------------- * HYPRE_StructSMGSetMemoryUse, HYPRE_StructSMGGetMemoryUse *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_structsmgsetmemoryuse, HYPRE_STRUCTSMGSETMEMORYUSE) ( hypre_F90_Obj *solver, hypre_F90_Int *memory_use, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_StructSMGSetMemoryUse( hypre_F90_PassObj (HYPRE_StructSolver, solver), hypre_F90_PassInt (memory_use) ) ); } void hypre_F90_IFACE(hypre_structsmggetmemoryuse, HYPRE_STRUCTSMGGETMEMORYUSE) ( hypre_F90_Obj *solver, hypre_F90_Int *memory_use, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_StructSMGGetMemoryUse( hypre_F90_PassObj (HYPRE_StructSolver, solver), hypre_F90_PassIntRef (memory_use) ) ); } /*-------------------------------------------------------------------------- * HYPRE_StructSMGSetTol, HYPRE_StructSMGGetTol *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_structsmgsettol, HYPRE_STRUCTSMGSETTOL) ( hypre_F90_Obj *solver, hypre_F90_Real *tol, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_StructSMGSetTol( hypre_F90_PassObj (HYPRE_StructSolver, solver), hypre_F90_PassReal (tol) ) ); } void hypre_F90_IFACE(hypre_structsmggettol, HYPRE_STRUCTSMGGETTOL) ( hypre_F90_Obj *solver, hypre_F90_Real *tol, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_StructSMGGetTol( hypre_F90_PassObj (HYPRE_StructSolver, solver), hypre_F90_PassRealRef (tol) ) ); } /*-------------------------------------------------------------------------- * HYPRE_StructSMGSetMaxIter, HYPRE_StructSMGGetMaxIter *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_structsmgsetmaxiter, HYPRE_STRUCTSMGSETMAXITER) ( hypre_F90_Obj *solver, hypre_F90_Int *max_iter, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_StructSMGSetMaxIter( hypre_F90_PassObj (HYPRE_StructSolver, solver), hypre_F90_PassInt (max_iter) ) ); } void hypre_F90_IFACE(hypre_structsmggetmaxiter, HYPRE_STRUCTSMGGETMAXITER) ( hypre_F90_Obj *solver, hypre_F90_Int *max_iter, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_StructSMGGetMaxIter( hypre_F90_PassObj (HYPRE_StructSolver, solver), hypre_F90_PassIntRef (max_iter) ) ); } /*-------------------------------------------------------------------------- * HYPRE_StructSMGSetRelChange, HYPRE_StructSMGGetRelChange *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_structsmgsetrelchange, HYPRE_STRUCTSMGSETRELCHANGE) ( hypre_F90_Obj *solver, hypre_F90_Int *rel_change, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_StructSMGSetRelChange( hypre_F90_PassObj (HYPRE_StructSolver, solver), hypre_F90_PassInt (rel_change) ) ); } void hypre_F90_IFACE(hypre_structsmggetrelchange, HYPRE_STRUCTSMGGETRELCHANGE) ( hypre_F90_Obj *solver, hypre_F90_Int *rel_change, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_StructSMGGetRelChange( hypre_F90_PassObj (HYPRE_StructSolver, solver), hypre_F90_PassIntRef (rel_change) ) ); } /*-------------------------------------------------------------------------- * HYPRE_StructSMGSetZeroGuess, HYPRE_StructSMGGetZeroGuess *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_structsmgsetzeroguess, HYPRE_STRUCTSMGSETZEROGUESS) ( hypre_F90_Obj *solver, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_StructSMGSetZeroGuess( hypre_F90_PassObj (HYPRE_StructSolver, solver) ) ); } void hypre_F90_IFACE(hypre_structsmggetzeroguess, HYPRE_STRUCTSMGGETZEROGUESS) ( hypre_F90_Obj *solver, hypre_F90_Int *zeroguess, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_StructSMGGetZeroGuess( hypre_F90_PassObj (HYPRE_StructSolver, solver), hypre_F90_PassIntRef (zeroguess) ) ); } /*-------------------------------------------------------------------------- * HYPRE_StructSMGSetNonZeroGuess *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_structsmgsetnonzeroguess, HYPRE_STRUCTSMGSETNONZEROGUESS) ( hypre_F90_Obj *solver, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_StructSMGSetNonZeroGuess( hypre_F90_PassObj (HYPRE_StructSolver, solver) ) ); } /*-------------------------------------------------------------------------- * HYPRE_StructSMGSetNumPreRelax, HYPRE_StructSMGGetNumPreRelax * * Note that we require at least 1 pre-relax sweep. *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_structsmgsetnumprerelax, HYPRE_STRUCTSMGSETNUMPRERELAX) ( hypre_F90_Obj *solver, hypre_F90_Int *num_pre_relax, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_StructSMGSetNumPreRelax( hypre_F90_PassObj (HYPRE_StructSolver, solver), hypre_F90_PassInt (num_pre_relax)) ); } void hypre_F90_IFACE(hypre_structsmggetnumprerelax, HYPRE_STRUCTSMGGETNUMPRERELAX) ( hypre_F90_Obj *solver, hypre_F90_Int *num_pre_relax, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_StructSMGGetNumPreRelax( hypre_F90_PassObj (HYPRE_StructSolver, solver), hypre_F90_PassIntRef (num_pre_relax)) ); } /*-------------------------------------------------------------------------- * HYPRE_StructSMGSetNumPostRelax, HYPRE_StructSMGGetNumPostRelax *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_structsmgsetnumpostrelax, HYPRE_STRUCTSMGSETNUMPOSTRELAX) ( hypre_F90_Obj *solver, hypre_F90_Int *num_post_relax, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_StructSMGSetNumPostRelax( hypre_F90_PassObj (HYPRE_StructSolver, solver), hypre_F90_PassInt (num_post_relax)) ); } void hypre_F90_IFACE(hypre_structsmggetnumpostrelax, HYPRE_STRUCTSMGGETNUMPOSTRELAX) ( hypre_F90_Obj *solver, hypre_F90_Int *num_post_relax, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_StructSMGGetNumPostRelax( hypre_F90_PassObj (HYPRE_StructSolver, solver), hypre_F90_PassIntRef (num_post_relax)) ); } /*-------------------------------------------------------------------------- * HYPRE_StructSMGSetLogging, HYPRE_StructSMGGetLogging *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_structsmgsetlogging, HYPRE_STRUCTSMGSETLOGGING) ( hypre_F90_Obj *solver, hypre_F90_Int *logging, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_StructSMGSetLogging( hypre_F90_PassObj (HYPRE_StructSolver, solver), hypre_F90_PassInt (logging)) ); } void hypre_F90_IFACE(hypre_structsmggetlogging, HYPRE_STRUCTSMGGETLOGGING) ( hypre_F90_Obj *solver, hypre_F90_Int *logging, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_StructSMGGetLogging( hypre_F90_PassObj (HYPRE_StructSolver, solver), hypre_F90_PassIntRef (logging)) ); } /*-------------------------------------------------------------------------- * HYPRE_StructSMGSetPrintLevel, HYPRE_StructSMGGetPrintLevel *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_structsmgsetprintlevel, HYPRE_STRUCTSMGSETPRINTLEVEL) ( hypre_F90_Obj *solver, hypre_F90_Int *print_level, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_StructSMGSetPrintLevel( hypre_F90_PassObj (HYPRE_StructSolver, solver), hypre_F90_PassInt (print_level)) ); } void hypre_F90_IFACE(hypre_structsmggetprintlevel, HYPRE_STRUCTSMGGETPRINTLEVEL) ( hypre_F90_Obj *solver, hypre_F90_Int *print_level, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_StructSMGGetPrintLevel( hypre_F90_PassObj (HYPRE_StructSolver, solver), hypre_F90_PassIntRef (print_level)) ); } /*-------------------------------------------------------------------------- * HYPRE_StructSMGGetNumIterations *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_structsmggetnumiterations, HYPRE_STRUCTSMGGETNUMITERATIONS) ( hypre_F90_Obj *solver, hypre_F90_Int *num_iterations, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_StructSMGGetNumIterations( hypre_F90_PassObj (HYPRE_StructSolver, solver), hypre_F90_PassIntRef (num_iterations) ) ); } /*-------------------------------------------------------------------------- * HYPRE_StructSMGGetFinalRelativeResidualNorm *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_structsmggetfinalrelative, HYPRE_STRUCTSMGGETFINALRELATIVE) ( hypre_F90_Obj *solver, hypre_F90_Real *norm, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_StructSMGGetFinalRelativeResidualNorm( hypre_F90_PassObj (HYPRE_StructSolver, solver), hypre_F90_PassRealRef (norm) ) ); } #ifdef __cplusplus } #endif hypre-2.33.0/src/struct_ls/F90_HYPRE_struct_sparse_msg.c000066400000000000000000000255451477326011500230600ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "_hypre_struct_ls.h" #include "fortran.h" #ifdef __cplusplus extern "C" { #endif /*-------------------------------------------------------------------------- * HYPRE_StructSparseMSGCreate *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_structsparsemsgcreate, HYPRE_STRUCTSPARSEMSGCREATE) ( hypre_F90_Comm *comm, hypre_F90_Obj *solver, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_StructSparseMSGCreate( hypre_F90_PassComm (comm), hypre_F90_PassObjRef (HYPRE_StructSolver, solver) ) ); } /*-------------------------------------------------------------------------- * HYPRE_StructSparseMSGDestroy *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_structsparsemsgdestroy, HYPRE_STRUCTSPARSEMSGDESTROY) ( hypre_F90_Obj *solver, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_StructSparseMSGDestroy( hypre_F90_PassObj (HYPRE_StructSolver, solver) ) ); } /*-------------------------------------------------------------------------- * HYPRE_StructSparseMSGSetup *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_structsparsemsgsetup, HYPRE_STRUCTSPARSEMSGSETUP) ( hypre_F90_Obj *solver, hypre_F90_Obj *A, hypre_F90_Obj *b, hypre_F90_Obj *x, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_StructSparseMSGSetup( hypre_F90_PassObj (HYPRE_StructSolver, solver), hypre_F90_PassObj (HYPRE_StructMatrix, A), hypre_F90_PassObj (HYPRE_StructVector, b), hypre_F90_PassObj (HYPRE_StructVector, x) ) ); } /*-------------------------------------------------------------------------- * HYPRE_StructSparseMSGSolve *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_structsparsemsgsolve, HYPRE_STRUCTSPARSEMSGSOLVE) ( hypre_F90_Obj *solver, hypre_F90_Obj *A, hypre_F90_Obj *b, hypre_F90_Obj *x, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_StructSparseMSGSolve( hypre_F90_PassObj (HYPRE_StructSolver, solver), hypre_F90_PassObj (HYPRE_StructMatrix, A), hypre_F90_PassObj (HYPRE_StructVector, b), hypre_F90_PassObj (HYPRE_StructVector, x) ) ); } /*-------------------------------------------------------------------------- * HYPRE_StructSparseMSGSetTol *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_structsparsemsgsettol, HYPRE_STRUCTSPARSEMSGSETTOL) ( hypre_F90_Obj *solver, hypre_F90_Real *tol, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_StructSparseMSGSetTol( hypre_F90_PassObj (HYPRE_StructSolver, solver), hypre_F90_PassReal (tol) ) ); } /*-------------------------------------------------------------------------- * HYPRE_StructSparseMSGSetMaxIter *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_structsparsemsgsetmaxiter, HYPRE_STRUCTSPARSEMSGSETMAXITER) ( hypre_F90_Obj *solver, hypre_F90_Int *max_iter, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_StructSparseMSGSetMaxIter( hypre_F90_PassObj (HYPRE_StructSolver, solver), hypre_F90_PassInt (max_iter) ) ); } /*-------------------------------------------------------------------------- * HYPRE_StructSparseMSGSetJump *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_structsparsemsgsetjump, HYPRE_STRUCTSPARSEMSGSETJUMP) ( hypre_F90_Obj *solver, hypre_F90_Int *jump, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_StructSparseMSGSetJump( hypre_F90_PassObj (HYPRE_StructSolver, solver), hypre_F90_PassInt (jump) ) ); } /*-------------------------------------------------------------------------- * HYPRE_StructSparseMSGSetRelChange *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_structsparsemsgsetrelchan, HYPRE_STRUCTSPARSEMSGSETRELCHAN) ( hypre_F90_Obj *solver, hypre_F90_Int *rel_change, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_StructSparseMSGSetRelChange( hypre_F90_PassObj (HYPRE_StructSolver, solver), hypre_F90_PassInt (rel_change) ) ); } /*-------------------------------------------------------------------------- * HYPRE_StructSparseMSGSetZeroGuess *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_structsparsemsgsetzerogue, HYPRE_STRUCTSPARSEMSGSETZEROGUE) ( hypre_F90_Obj *solver, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_StructSparseMSGSetZeroGuess( hypre_F90_PassObj (HYPRE_StructSolver, solver) ) ); } /*-------------------------------------------------------------------------- * HYPRE_StructSparseMSGSetNonZeroGuess *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_structsparsemsgsetnonzero, HYPRE_STRUCTSPARSEMSGSETNONZERO) ( hypre_F90_Obj *solver, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_StructSparseMSGSetNonZeroGuess( hypre_F90_PassObj (HYPRE_StructSolver, solver) ) ); } /*-------------------------------------------------------------------------- * HYPRE_StructSparseMSGSetRelaxType *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_structsparsemsgsetrelaxty, HYPRE_STRUCTSPARSEMSGSETRELAXTY) ( hypre_F90_Obj *solver, hypre_F90_Int *relax_type, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_StructSparseMSGSetRelaxType( hypre_F90_PassObj (HYPRE_StructSolver, solver), hypre_F90_PassInt (relax_type) ) ); } /*-------------------------------------------------------------------------- * HYPRE_StructSparseMSGSetJacobiWeight *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_structsparsemsgsetjacobiweigh, HYPRE_STRUCTSPARSEMSGSETJACOBIWEIGH) (hypre_F90_Obj *solver, hypre_F90_Real *weight, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) (HYPRE_StructSparseMSGSetJacobiWeight( hypre_F90_PassObj (HYPRE_StructSolver, solver), hypre_F90_PassReal (weight) ) ); } /*-------------------------------------------------------------------------- * HYPRE_StructSparseMSGSetNumPreRelax *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_structsparsemsgsetnumprer, HYPRE_STRUCTSPARSEMSGSETNUMPRER) ( hypre_F90_Obj *solver, hypre_F90_Int *num_pre_relax, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_StructSparseMSGSetNumPreRelax( hypre_F90_PassObj (HYPRE_StructSolver, solver), hypre_F90_PassInt (num_pre_relax) ) ); } /*-------------------------------------------------------------------------- * HYPRE_StructSparseMSGSetNumPostRelax *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_structsparsemsgsetnumpost, HYPRE_STRUCTSPARSEMSGSETNUMPOST) ( hypre_F90_Obj *solver, hypre_F90_Int *num_post_relax, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_StructSparseMSGSetNumPostRelax( hypre_F90_PassObj (HYPRE_StructSolver, solver), hypre_F90_PassInt (num_post_relax) ) ); } /*-------------------------------------------------------------------------- * HYPRE_StructSparseMSGSetNumFineRelax *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_structsparsemsgsetnumfine, HYPRE_STRUCTSPARSEMSGSETNUMFINE) ( hypre_F90_Obj *solver, hypre_F90_Int *num_fine_relax, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_StructSparseMSGSetNumFineRelax( hypre_F90_PassObj (HYPRE_StructSolver, solver), hypre_F90_PassInt (num_fine_relax) ) ); } /*-------------------------------------------------------------------------- * HYPRE_StructSparseMSGSetLogging *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_structsparsemsgsetlogging, HYPRE_STRUCTSPARSEMSGSETLOGGING) ( hypre_F90_Obj *solver, hypre_F90_Int *logging, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_StructSparseMSGSetLogging( hypre_F90_PassObj (HYPRE_StructSolver, solver), hypre_F90_PassInt (logging) ) ); } /*-------------------------------------------------------------------------- * HYPRE_StructSparseMSGSetPrintLevel *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_structsparsemsgsetprintle, HYPRE_STRUCTSPARSEMSGSETPRINTLE) ( hypre_F90_Obj *solver, hypre_F90_Int *print_level, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_StructSparseMSGSetPrintLevel( hypre_F90_PassObj (HYPRE_StructSolver, solver), hypre_F90_PassInt (print_level) ) ); } /*-------------------------------------------------------------------------- * HYPRE_StructSparseMSGGetNumIterations *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_structsparsemsggetnumiter, HYPRE_STRUCTSPARSEMSGGETNUMITER) ( hypre_F90_Obj *solver, hypre_F90_Int *num_iterations, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_StructSparseMSGGetNumIterations( hypre_F90_PassObj (HYPRE_StructSolver, solver), hypre_F90_PassIntRef (num_iterations) ) ); } /*-------------------------------------------------------------------------- * HYPRE_StructSparseMSGGetFinalRelativeResidualNorm *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_structsparsemsggetfinalre, HYPRE_STRUCTSPARSEMSGGETFINALRE) ( hypre_F90_Obj *solver, hypre_F90_Real *norm, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_StructSparseMSGGetFinalRelativeResidualNorm( hypre_F90_PassObj (HYPRE_StructSolver, solver), hypre_F90_PassRealRef (norm) ) ); } #ifdef __cplusplus } #endif hypre-2.33.0/src/struct_ls/HYPRE_struct_bicgstab.c000066400000000000000000000127741477326011500220550ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "_hypre_struct_ls.h" /*==========================================================================*/ HYPRE_Int HYPRE_StructBiCGSTABCreate( MPI_Comm comm, HYPRE_StructSolver *solver ) { HYPRE_UNUSED_VAR(comm); hypre_BiCGSTABFunctions * bicgstab_functions = hypre_BiCGSTABFunctionsCreate( hypre_StructKrylovCreateVector, hypre_StructKrylovDestroyVector, hypre_StructKrylovMatvecCreate, hypre_StructKrylovMatvec, hypre_StructKrylovMatvecDestroy, hypre_StructKrylovInnerProd, hypre_StructKrylovCopyVector, hypre_StructKrylovClearVector, hypre_StructKrylovScaleVector, hypre_StructKrylovAxpy, hypre_StructKrylovCommInfo, hypre_StructKrylovIdentitySetup, hypre_StructKrylovIdentity ); *solver = ( (HYPRE_StructSolver) hypre_BiCGSTABCreate( bicgstab_functions ) ); return hypre_error_flag; } /*==========================================================================*/ HYPRE_Int HYPRE_StructBiCGSTABDestroy( HYPRE_StructSolver solver ) { return ( hypre_BiCGSTABDestroy( (void *) solver ) ); } /*==========================================================================*/ HYPRE_Int HYPRE_StructBiCGSTABSetup( HYPRE_StructSolver solver, HYPRE_StructMatrix A, HYPRE_StructVector b, HYPRE_StructVector x ) { return ( HYPRE_BiCGSTABSetup( (HYPRE_Solver) solver, (HYPRE_Matrix) A, (HYPRE_Vector) b, (HYPRE_Vector) x ) ); } /*==========================================================================*/ HYPRE_Int HYPRE_StructBiCGSTABSolve( HYPRE_StructSolver solver, HYPRE_StructMatrix A, HYPRE_StructVector b, HYPRE_StructVector x ) { return ( HYPRE_BiCGSTABSolve( (HYPRE_Solver) solver, (HYPRE_Matrix) A, (HYPRE_Vector) b, (HYPRE_Vector) x ) ); } /*==========================================================================*/ HYPRE_Int HYPRE_StructBiCGSTABSetTol( HYPRE_StructSolver solver, HYPRE_Real tol ) { return ( HYPRE_BiCGSTABSetTol( (HYPRE_Solver) solver, tol ) ); } /*==========================================================================*/ HYPRE_Int HYPRE_StructBiCGSTABSetAbsoluteTol( HYPRE_StructSolver solver, HYPRE_Real tol ) { return ( HYPRE_BiCGSTABSetAbsoluteTol( (HYPRE_Solver) solver, tol ) ); } /*==========================================================================*/ HYPRE_Int HYPRE_StructBiCGSTABSetMaxIter( HYPRE_StructSolver solver, HYPRE_Int max_iter ) { return ( HYPRE_BiCGSTABSetMaxIter( (HYPRE_Solver) solver, max_iter ) ); } /*==========================================================================*/ HYPRE_Int HYPRE_StructBiCGSTABSetPrecond( HYPRE_StructSolver solver, HYPRE_PtrToStructSolverFcn precond, HYPRE_PtrToStructSolverFcn precond_setup, HYPRE_StructSolver precond_solver ) { return ( HYPRE_BiCGSTABSetPrecond( (HYPRE_Solver) solver, (HYPRE_PtrToSolverFcn) precond, (HYPRE_PtrToSolverFcn) precond_setup, (HYPRE_Solver) precond_solver ) ); } /*==========================================================================*/ HYPRE_Int HYPRE_StructBiCGSTABSetLogging( HYPRE_StructSolver solver, HYPRE_Int logging ) { return ( HYPRE_BiCGSTABSetLogging( (HYPRE_Solver) solver, logging ) ); } /*==========================================================================*/ HYPRE_Int HYPRE_StructBiCGSTABSetPrintLevel( HYPRE_StructSolver solver, HYPRE_Int level) { return ( HYPRE_BiCGSTABSetPrintLevel( (HYPRE_Solver) solver, level ) ); } /*==========================================================================*/ HYPRE_Int HYPRE_StructBiCGSTABGetNumIterations( HYPRE_StructSolver solver, HYPRE_Int *num_iterations ) { return ( HYPRE_BiCGSTABGetNumIterations( (HYPRE_Solver) solver, num_iterations ) ); } /*==========================================================================*/ HYPRE_Int HYPRE_StructBiCGSTABGetFinalRelativeResidualNorm( HYPRE_StructSolver solver, HYPRE_Real *norm ) { return ( HYPRE_BiCGSTABGetFinalRelativeResidualNorm( (HYPRE_Solver) solver, norm ) ); } /*==========================================================================*/ HYPRE_Int HYPRE_StructBiCGSTABGetResidual( HYPRE_StructSolver solver, void **residual) { return ( HYPRE_BiCGSTABGetResidual( (HYPRE_Solver) solver, residual ) ); } hypre-2.33.0/src/struct_ls/HYPRE_struct_cycred.c000066400000000000000000000066141477326011500215440ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "_hypre_struct_ls.h" /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_StructCycRedCreate( MPI_Comm comm, HYPRE_StructSolver *solver ) { *solver = ( (HYPRE_StructSolver) hypre_CyclicReductionCreate( comm ) ); return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_StructCycRedDestroy( HYPRE_StructSolver solver ) { return ( hypre_CyclicReductionDestroy( (void *) solver ) ); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_StructCycRedSetup( HYPRE_StructSolver solver, HYPRE_StructMatrix A, HYPRE_StructVector b, HYPRE_StructVector x ) { return ( hypre_CyclicReductionSetup( (void *) solver, (hypre_StructMatrix *) A, (hypre_StructVector *) b, (hypre_StructVector *) x ) ); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_StructCycRedSolve( HYPRE_StructSolver solver, HYPRE_StructMatrix A, HYPRE_StructVector b, HYPRE_StructVector x ) { return ( hypre_CyclicReduction( (void *) solver, (hypre_StructMatrix *) A, (hypre_StructVector *) b, (hypre_StructVector *) x ) ); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_StructCycRedSetTDim( HYPRE_StructSolver solver, HYPRE_Int tdim ) { return ( hypre_CyclicReductionSetCDir( (void *) solver, tdim ) ); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_StructCycRedSetBase( HYPRE_StructSolver solver, HYPRE_Int ndim, HYPRE_Int *base_index, HYPRE_Int *base_stride ) { hypre_Index new_base_index; hypre_Index new_base_stride; HYPRE_Int d; hypre_SetIndex(new_base_index, 0); hypre_SetIndex(new_base_stride, 1); for (d = 0; d < ndim; d++) { hypre_IndexD(new_base_index, d) = base_index[d]; hypre_IndexD(new_base_stride, d) = base_stride[d]; } return ( hypre_CyclicReductionSetBase( (void *) solver, new_base_index, new_base_stride ) ); } hypre-2.33.0/src/struct_ls/HYPRE_struct_flexgmres.c000066400000000000000000000140411477326011500222600ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "_hypre_struct_ls.h" /*==========================================================================*/ HYPRE_Int HYPRE_StructFlexGMRESCreate( MPI_Comm comm, HYPRE_StructSolver *solver ) { HYPRE_UNUSED_VAR(comm); hypre_FlexGMRESFunctions * fgmres_functions = hypre_FlexGMRESFunctionsCreate( hypre_StructKrylovCAlloc, hypre_StructKrylovFree, hypre_StructKrylovCommInfo, hypre_StructKrylovCreateVector, hypre_StructKrylovCreateVectorArray, hypre_StructKrylovDestroyVector, hypre_StructKrylovMatvecCreate, hypre_StructKrylovMatvec, hypre_StructKrylovMatvecDestroy, hypre_StructKrylovInnerProd, hypre_StructKrylovCopyVector, hypre_StructKrylovClearVector, hypre_StructKrylovScaleVector, hypre_StructKrylovAxpy, hypre_StructKrylovIdentitySetup, hypre_StructKrylovIdentity ); *solver = ( (HYPRE_StructSolver) hypre_FlexGMRESCreate( fgmres_functions ) ); return hypre_error_flag; } /*==========================================================================*/ HYPRE_Int HYPRE_StructFlexGMRESDestroy( HYPRE_StructSolver solver ) { return ( hypre_FlexGMRESDestroy( (void *) solver ) ); } /*==========================================================================*/ HYPRE_Int HYPRE_StructFlexGMRESSetup( HYPRE_StructSolver solver, HYPRE_StructMatrix A, HYPRE_StructVector b, HYPRE_StructVector x ) { return ( HYPRE_FlexGMRESSetup( (HYPRE_Solver) solver, (HYPRE_Matrix) A, (HYPRE_Vector) b, (HYPRE_Vector) x ) ); } /*==========================================================================*/ HYPRE_Int HYPRE_StructFlexGMRESSolve( HYPRE_StructSolver solver, HYPRE_StructMatrix A, HYPRE_StructVector b, HYPRE_StructVector x ) { return ( HYPRE_FlexGMRESSolve( (HYPRE_Solver) solver, (HYPRE_Matrix) A, (HYPRE_Vector) b, (HYPRE_Vector) x ) ); } /*==========================================================================*/ HYPRE_Int HYPRE_StructFlexGMRESSetTol( HYPRE_StructSolver solver, HYPRE_Real tol ) { return ( HYPRE_FlexGMRESSetTol( (HYPRE_Solver) solver, tol ) ); } /*==========================================================================*/ HYPRE_Int HYPRE_StructFlexGMRESSetAbsoluteTol( HYPRE_StructSolver solver, HYPRE_Real atol ) { return ( HYPRE_FlexGMRESSetAbsoluteTol( (HYPRE_Solver) solver, atol ) ); } /*==========================================================================*/ HYPRE_Int HYPRE_StructFlexGMRESSetMaxIter( HYPRE_StructSolver solver, HYPRE_Int max_iter ) { return ( HYPRE_FlexGMRESSetMaxIter( (HYPRE_Solver) solver, max_iter ) ); } /*==========================================================================*/ HYPRE_Int HYPRE_StructFlexGMRESSetKDim( HYPRE_StructSolver solver, HYPRE_Int k_dim ) { return ( HYPRE_FlexGMRESSetKDim( (HYPRE_Solver) solver, k_dim ) ); } /*==========================================================================*/ HYPRE_Int HYPRE_StructFlexGMRESSetPrecond( HYPRE_StructSolver solver, HYPRE_PtrToStructSolverFcn precond, HYPRE_PtrToStructSolverFcn precond_setup, HYPRE_StructSolver precond_solver ) { return ( HYPRE_FlexGMRESSetPrecond( (HYPRE_Solver) solver, (HYPRE_PtrToSolverFcn) precond, (HYPRE_PtrToSolverFcn) precond_setup, (HYPRE_Solver) precond_solver ) ); } /*==========================================================================*/ HYPRE_Int HYPRE_StructFlexGMRESSetLogging( HYPRE_StructSolver solver, HYPRE_Int logging ) { return ( HYPRE_FlexGMRESSetLogging( (HYPRE_Solver) solver, logging ) ); } /*==========================================================================*/ HYPRE_Int HYPRE_StructFlexGMRESSetPrintLevel( HYPRE_StructSolver solver, HYPRE_Int print_level ) { return ( HYPRE_FlexGMRESSetPrintLevel( (HYPRE_Solver) solver, print_level ) ); } /*==========================================================================*/ HYPRE_Int HYPRE_StructFlexGMRESGetNumIterations( HYPRE_StructSolver solver, HYPRE_Int *num_iterations ) { return ( HYPRE_FlexGMRESGetNumIterations( (HYPRE_Solver) solver, num_iterations ) ); } /*==========================================================================*/ HYPRE_Int HYPRE_StructFlexGMRESGetFinalRelativeResidualNorm( HYPRE_StructSolver solver, HYPRE_Real *norm ) { return ( HYPRE_FlexGMRESGetFinalRelativeResidualNorm( (HYPRE_Solver) solver, norm ) ); } /*==========================================================================*/ HYPRE_Int HYPRE_StructFlexGMRESSetModifyPC( HYPRE_StructSolver solver, HYPRE_PtrToModifyPCFcn modify_pc) { return ( HYPRE_FlexGMRESSetModifyPC( (HYPRE_Solver) solver, (HYPRE_PtrToModifyPCFcn) modify_pc)); } hypre-2.33.0/src/struct_ls/HYPRE_struct_gmres.c000066400000000000000000000125511477326011500214050ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "_hypre_struct_ls.h" /*==========================================================================*/ HYPRE_Int HYPRE_StructGMRESCreate( MPI_Comm comm, HYPRE_StructSolver *solver ) { HYPRE_UNUSED_VAR(comm); hypre_GMRESFunctions * gmres_functions = hypre_GMRESFunctionsCreate( hypre_StructKrylovCAlloc, hypre_StructKrylovFree, hypre_StructKrylovCommInfo, hypre_StructKrylovCreateVector, hypre_StructKrylovCreateVectorArray, hypre_StructKrylovDestroyVector, hypre_StructKrylovMatvecCreate, hypre_StructKrylovMatvec, hypre_StructKrylovMatvecDestroy, hypre_StructKrylovInnerProd, hypre_StructKrylovCopyVector, hypre_StructKrylovClearVector, hypre_StructKrylovScaleVector, hypre_StructKrylovAxpy, hypre_StructKrylovIdentitySetup, hypre_StructKrylovIdentity ); *solver = ( (HYPRE_StructSolver) hypre_GMRESCreate( gmres_functions ) ); return hypre_error_flag; } /*==========================================================================*/ HYPRE_Int HYPRE_StructGMRESDestroy( HYPRE_StructSolver solver ) { return ( hypre_GMRESDestroy( (void *) solver ) ); } /*==========================================================================*/ HYPRE_Int HYPRE_StructGMRESSetup( HYPRE_StructSolver solver, HYPRE_StructMatrix A, HYPRE_StructVector b, HYPRE_StructVector x ) { return ( HYPRE_GMRESSetup( (HYPRE_Solver) solver, (HYPRE_Matrix) A, (HYPRE_Vector) b, (HYPRE_Vector) x ) ); } /*==========================================================================*/ HYPRE_Int HYPRE_StructGMRESSolve( HYPRE_StructSolver solver, HYPRE_StructMatrix A, HYPRE_StructVector b, HYPRE_StructVector x ) { return ( HYPRE_GMRESSolve( (HYPRE_Solver) solver, (HYPRE_Matrix) A, (HYPRE_Vector) b, (HYPRE_Vector) x ) ); } /*==========================================================================*/ HYPRE_Int HYPRE_StructGMRESSetTol( HYPRE_StructSolver solver, HYPRE_Real tol ) { return ( HYPRE_GMRESSetTol( (HYPRE_Solver) solver, tol ) ); } /*==========================================================================*/ HYPRE_Int HYPRE_StructGMRESSetAbsoluteTol( HYPRE_StructSolver solver, HYPRE_Real atol ) { return ( HYPRE_GMRESSetAbsoluteTol( (HYPRE_Solver) solver, atol ) ); } /*==========================================================================*/ HYPRE_Int HYPRE_StructGMRESSetMaxIter( HYPRE_StructSolver solver, HYPRE_Int max_iter ) { return ( HYPRE_GMRESSetMaxIter( (HYPRE_Solver) solver, max_iter ) ); } /*==========================================================================*/ HYPRE_Int HYPRE_StructGMRESSetKDim( HYPRE_StructSolver solver, HYPRE_Int k_dim ) { return ( HYPRE_GMRESSetKDim( (HYPRE_Solver) solver, k_dim ) ); } /*==========================================================================*/ HYPRE_Int HYPRE_StructGMRESSetPrecond( HYPRE_StructSolver solver, HYPRE_PtrToStructSolverFcn precond, HYPRE_PtrToStructSolverFcn precond_setup, HYPRE_StructSolver precond_solver ) { return ( HYPRE_GMRESSetPrecond( (HYPRE_Solver) solver, (HYPRE_PtrToSolverFcn) precond, (HYPRE_PtrToSolverFcn) precond_setup, (HYPRE_Solver) precond_solver ) ); } /*==========================================================================*/ HYPRE_Int HYPRE_StructGMRESSetLogging( HYPRE_StructSolver solver, HYPRE_Int logging ) { return ( HYPRE_GMRESSetLogging( (HYPRE_Solver) solver, logging ) ); } /*==========================================================================*/ HYPRE_Int HYPRE_StructGMRESSetPrintLevel( HYPRE_StructSolver solver, HYPRE_Int print_level ) { return ( HYPRE_GMRESSetPrintLevel( (HYPRE_Solver) solver, print_level ) ); } /*==========================================================================*/ HYPRE_Int HYPRE_StructGMRESGetNumIterations( HYPRE_StructSolver solver, HYPRE_Int *num_iterations ) { return ( HYPRE_GMRESGetNumIterations( (HYPRE_Solver) solver, num_iterations ) ); } /*==========================================================================*/ HYPRE_Int HYPRE_StructGMRESGetFinalRelativeResidualNorm( HYPRE_StructSolver solver, HYPRE_Real *norm ) { return ( HYPRE_GMRESGetFinalRelativeResidualNorm( (HYPRE_Solver) solver, norm ) ); } hypre-2.33.0/src/struct_ls/HYPRE_struct_hybrid.c000066400000000000000000000237741477326011500215620ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "_hypre_struct_ls.h" /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_StructHybridCreate( MPI_Comm comm, HYPRE_StructSolver *solver ) { *solver = ( (HYPRE_StructSolver) hypre_HybridCreate( comm ) ); return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_StructHybridDestroy( HYPRE_StructSolver solver ) { return ( hypre_HybridDestroy( (void *) solver ) ); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_StructHybridSetup( HYPRE_StructSolver solver, HYPRE_StructMatrix A, HYPRE_StructVector b, HYPRE_StructVector x ) { return ( hypre_HybridSetup( (void *) solver, (hypre_StructMatrix *) A, (hypre_StructVector *) b, (hypre_StructVector *) x ) ); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_StructHybridSolve( HYPRE_StructSolver solver, HYPRE_StructMatrix A, HYPRE_StructVector b, HYPRE_StructVector x ) { return ( hypre_HybridSolve( (void *) solver, (hypre_StructMatrix *) A, (hypre_StructVector *) b, (hypre_StructVector *) x ) ); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_StructHybridSetTol( HYPRE_StructSolver solver, HYPRE_Real tol ) { return ( hypre_HybridSetTol( (void *) solver, tol ) ); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_StructHybridSetConvergenceTol( HYPRE_StructSolver solver, HYPRE_Real cf_tol ) { return ( hypre_HybridSetConvergenceTol( (void *) solver, cf_tol ) ); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_StructHybridSetDSCGMaxIter( HYPRE_StructSolver solver, HYPRE_Int dscg_max_its ) { return ( hypre_HybridSetDSCGMaxIter( (void *) solver, dscg_max_its ) ); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_StructHybridSetPCGMaxIter( HYPRE_StructSolver solver, HYPRE_Int pcg_max_its ) { return ( hypre_HybridSetPCGMaxIter( (void *) solver, pcg_max_its ) ); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_StructHybridSetPCGAbsoluteTolFactor( HYPRE_StructSolver solver, HYPRE_Real pcg_atolf ) { return ( hypre_HybridSetPCGAbsoluteTolFactor( (void *) solver, pcg_atolf ) ); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_StructHybridSetTwoNorm( HYPRE_StructSolver solver, HYPRE_Int two_norm ) { return ( hypre_HybridSetTwoNorm( (void *) solver, two_norm ) ); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_StructHybridSetStopCrit( HYPRE_StructSolver solver, HYPRE_Int stop_crit ) { return ( hypre_HybridSetStopCrit( (void *) solver, stop_crit ) ); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_StructHybridSetRelChange( HYPRE_StructSolver solver, HYPRE_Int rel_change ) { return ( hypre_HybridSetRelChange( (void *) solver, rel_change ) ); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_StructHybridSetSolverType( HYPRE_StructSolver solver, HYPRE_Int solver_type ) { return ( hypre_HybridSetSolverType( (void *) solver, solver_type ) ); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_StructHybridSetRecomputeResidual( HYPRE_StructSolver solver, HYPRE_Int recompute_residual ) { return ( hypre_HybridSetRecomputeResidual( (void *) solver, recompute_residual ) ); } HYPRE_Int HYPRE_StructHybridGetRecomputeResidual( HYPRE_StructSolver solver, HYPRE_Int *recompute_residual ) { return ( hypre_HybridGetRecomputeResidual( (void *) solver, recompute_residual ) ); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_StructHybridSetRecomputeResidualP( HYPRE_StructSolver solver, HYPRE_Int recompute_residual_p ) { return ( hypre_HybridSetRecomputeResidualP( (void *) solver, recompute_residual_p ) ); } HYPRE_Int HYPRE_StructHybridGetRecomputeResidualP( HYPRE_StructSolver solver, HYPRE_Int *recompute_residual_p ) { return ( hypre_HybridGetRecomputeResidualP( (void *) solver, recompute_residual_p ) ); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_StructHybridSetKDim( HYPRE_StructSolver solver, HYPRE_Int k_dim ) { return ( hypre_HybridSetKDim( (void *) solver, k_dim ) ); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_StructHybridSetPrecond( HYPRE_StructSolver solver, HYPRE_PtrToStructSolverFcn precond, HYPRE_PtrToStructSolverFcn precond_setup, HYPRE_StructSolver precond_solver ) { return ( hypre_HybridSetPrecond( (void *) solver, (HYPRE_Int (*)(void*, void*, void*, void*)) precond, (HYPRE_Int (*)(void*, void*, void*, void*)) precond_setup, (void *) precond_solver ) ); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_StructHybridSetLogging( HYPRE_StructSolver solver, HYPRE_Int logging ) { return ( hypre_HybridSetLogging( (void *) solver, logging ) ); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_StructHybridSetPrintLevel( HYPRE_StructSolver solver, HYPRE_Int print_level ) { return ( hypre_HybridSetPrintLevel( (void *) solver, print_level ) ); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_StructHybridGetNumIterations( HYPRE_StructSolver solver, HYPRE_Int *num_its ) { return ( hypre_HybridGetNumIterations( (void *) solver, num_its ) ); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_StructHybridGetDSCGNumIterations( HYPRE_StructSolver solver, HYPRE_Int *dscg_num_its ) { return ( hypre_HybridGetDSCGNumIterations( (void *) solver, dscg_num_its ) ); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_StructHybridGetPCGNumIterations( HYPRE_StructSolver solver, HYPRE_Int *pcg_num_its ) { return ( hypre_HybridGetPCGNumIterations( (void *) solver, pcg_num_its ) ); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_StructHybridGetFinalRelativeResidualNorm( HYPRE_StructSolver solver, HYPRE_Real *norm ) { return ( hypre_HybridGetFinalRelativeResidualNorm( (void *) solver, norm ) ); } hypre-2.33.0/src/struct_ls/HYPRE_struct_int.c000066400000000000000000000102401477326011500210530ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "_hypre_struct_ls.h" #include "temp_multivector.h" #include "_hypre_struct_mv.hpp" HYPRE_Int hypre_StructVectorSetRandomValues( hypre_StructVector *vector, HYPRE_Int seed ) { hypre_Box *v_data_box; HYPRE_Real *vp; hypre_BoxArray *boxes; hypre_Box *box; hypre_Index loop_size; hypre_IndexRef start; hypre_Index unit_stride; HYPRE_Int i; HYPRE_Complex *data = hypre_StructVectorData(vector); HYPRE_Complex *data_host = NULL; HYPRE_Int data_size = hypre_StructVectorDataSize(vector); HYPRE_MemoryLocation memory_location = hypre_StructVectorMemoryLocation(vector); /*----------------------------------------------------------------------- * Set the vector coefficients *-----------------------------------------------------------------------*/ // srand( seed ); hypre_SeedRand(seed); hypre_SetIndex3(unit_stride, 1, 1, 1); boxes = hypre_StructGridBoxes(hypre_StructVectorGrid(vector)); if (hypre_GetExecPolicy1(memory_location) == HYPRE_EXEC_DEVICE) { data_host = hypre_CTAlloc(HYPRE_Complex, data_size, HYPRE_MEMORY_HOST); hypre_StructVectorData(vector) = data_host; } hypre_ForBoxI(i, boxes) { box = hypre_BoxArrayBox(boxes, i); start = hypre_BoxIMin(box); v_data_box = hypre_BoxArrayBox(hypre_StructVectorDataSpace(vector), i); vp = hypre_StructVectorBoxData(vector, i); hypre_BoxGetSize(box, loop_size); hypre_SerialBoxLoop1Begin(hypre_StructVectorNDim(vector), loop_size, v_data_box, start, unit_stride, vi); { vp[vi] = 2.0 * hypre_Rand() - 1.0; } hypre_SerialBoxLoop1End(vi); } if (data_host) { hypre_TMemcpy(data, data_host, HYPRE_Complex, data_size, memory_location, HYPRE_MEMORY_HOST); hypre_StructVectorData(vector) = data; hypre_TFree(data_host, HYPRE_MEMORY_HOST); } return hypre_error_flag; } HYPRE_Int hypre_StructSetRandomValues( void* v, HYPRE_Int seed ) { return hypre_StructVectorSetRandomValues( (hypre_StructVector*)v, seed ); } HYPRE_Int HYPRE_StructSetupInterpreter( mv_InterfaceInterpreter *i ) { i->CreateVector = hypre_StructKrylovCreateVector; i->DestroyVector = hypre_StructKrylovDestroyVector; i->InnerProd = hypre_StructKrylovInnerProd; i->CopyVector = hypre_StructKrylovCopyVector; i->ClearVector = hypre_StructKrylovClearVector; i->SetRandomValues = hypre_StructSetRandomValues; i->ScaleVector = hypre_StructKrylovScaleVector; i->Axpy = hypre_StructKrylovAxpy; i->CreateMultiVector = mv_TempMultiVectorCreateFromSampleVector; i->CopyCreateMultiVector = mv_TempMultiVectorCreateCopy; i->DestroyMultiVector = mv_TempMultiVectorDestroy; i->Width = mv_TempMultiVectorWidth; i->Height = mv_TempMultiVectorHeight; i->SetMask = mv_TempMultiVectorSetMask; i->CopyMultiVector = mv_TempMultiVectorCopy; i->ClearMultiVector = mv_TempMultiVectorClear; i->SetRandomVectors = mv_TempMultiVectorSetRandom; i->MultiInnerProd = mv_TempMultiVectorByMultiVector; i->MultiInnerProdDiag = mv_TempMultiVectorByMultiVectorDiag; i->MultiVecMat = mv_TempMultiVectorByMatrix; i->MultiVecMatDiag = mv_TempMultiVectorByDiagonal; i->MultiAxpy = mv_TempMultiVectorAxpy; i->MultiXapy = mv_TempMultiVectorXapy; i->Eval = mv_TempMultiVectorEval; return hypre_error_flag; } HYPRE_Int HYPRE_StructSetupMatvec(HYPRE_MatvecFunctions * mv) { mv->MatvecCreate = hypre_StructKrylovMatvecCreate; mv->Matvec = hypre_StructKrylovMatvec; mv->MatvecDestroy = hypre_StructKrylovMatvecDestroy; mv->MatMultiVecCreate = NULL; mv->MatMultiVec = NULL; mv->MatMultiVecDestroy = NULL; return hypre_error_flag; } hypre-2.33.0/src/struct_ls/HYPRE_struct_jacobi.c000066400000000000000000000124211477326011500215130ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "_hypre_struct_ls.h" /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_StructJacobiCreate( MPI_Comm comm, HYPRE_StructSolver *solver ) { *solver = ( (HYPRE_StructSolver) hypre_JacobiCreate( comm ) ); return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_StructJacobiDestroy( HYPRE_StructSolver solver ) { return ( hypre_JacobiDestroy( (void *) solver ) ); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_StructJacobiSetup( HYPRE_StructSolver solver, HYPRE_StructMatrix A, HYPRE_StructVector b, HYPRE_StructVector x ) { return ( hypre_JacobiSetup( (void *) solver, (hypre_StructMatrix *) A, (hypre_StructVector *) b, (hypre_StructVector *) x ) ); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_StructJacobiSolve( HYPRE_StructSolver solver, HYPRE_StructMatrix A, HYPRE_StructVector b, HYPRE_StructVector x ) { return ( hypre_JacobiSolve( (void *) solver, (hypre_StructMatrix *) A, (hypre_StructVector *) b, (hypre_StructVector *) x ) ); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_StructJacobiSetTol( HYPRE_StructSolver solver, HYPRE_Real tol ) { return ( hypre_JacobiSetTol( (void *) solver, tol ) ); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_StructJacobiGetTol( HYPRE_StructSolver solver, HYPRE_Real * tol ) { return ( hypre_JacobiGetTol( (void *) solver, tol ) ); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_StructJacobiSetMaxIter( HYPRE_StructSolver solver, HYPRE_Int max_iter ) { return ( hypre_JacobiSetMaxIter( (void *) solver, max_iter ) ); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_StructJacobiGetMaxIter( HYPRE_StructSolver solver, HYPRE_Int * max_iter ) { return ( hypre_JacobiGetMaxIter( (void *) solver, max_iter ) ); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_StructJacobiSetZeroGuess( HYPRE_StructSolver solver ) { return ( hypre_JacobiSetZeroGuess( (void *) solver, 1 ) ); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_StructJacobiGetZeroGuess( HYPRE_StructSolver solver, HYPRE_Int * zeroguess ) { return ( hypre_JacobiGetZeroGuess( (void *) solver, zeroguess ) ); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_StructJacobiSetNonZeroGuess( HYPRE_StructSolver solver ) { return ( hypre_JacobiSetZeroGuess( (void *) solver, 0 ) ); } /* NOT YET IMPLEMENTED */ /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_StructJacobiGetNumIterations( HYPRE_StructSolver solver, HYPRE_Int *num_iterations ) { return ( hypre_JacobiGetNumIterations( (void *) solver, num_iterations ) ); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_StructJacobiGetFinalRelativeResidualNorm( HYPRE_StructSolver solver, HYPRE_Real *norm ) { return ( hypre_JacobiGetFinalRelativeResidualNorm( (void *) solver, norm ) ); } hypre-2.33.0/src/struct_ls/HYPRE_struct_lgmres.c000066400000000000000000000133561477326011500215650ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "_hypre_struct_ls.h" /*==========================================================================*/ HYPRE_Int HYPRE_StructLGMRESCreate( MPI_Comm comm, HYPRE_StructSolver *solver ) { HYPRE_UNUSED_VAR(comm); hypre_LGMRESFunctions * lgmres_functions = hypre_LGMRESFunctionsCreate( hypre_StructKrylovCAlloc, hypre_StructKrylovFree, hypre_StructKrylovCommInfo, hypre_StructKrylovCreateVector, hypre_StructKrylovCreateVectorArray, hypre_StructKrylovDestroyVector, hypre_StructKrylovMatvecCreate, hypre_StructKrylovMatvec, hypre_StructKrylovMatvecDestroy, hypre_StructKrylovInnerProd, hypre_StructKrylovCopyVector, hypre_StructKrylovClearVector, hypre_StructKrylovScaleVector, hypre_StructKrylovAxpy, hypre_StructKrylovIdentitySetup, hypre_StructKrylovIdentity ); *solver = ( (HYPRE_StructSolver) hypre_LGMRESCreate( lgmres_functions ) ); return hypre_error_flag; } /*==========================================================================*/ HYPRE_Int HYPRE_StructLGMRESDestroy( HYPRE_StructSolver solver ) { return ( hypre_LGMRESDestroy( (void *) solver ) ); } /*==========================================================================*/ HYPRE_Int HYPRE_StructLGMRESSetup( HYPRE_StructSolver solver, HYPRE_StructMatrix A, HYPRE_StructVector b, HYPRE_StructVector x ) { return ( HYPRE_LGMRESSetup( (HYPRE_Solver) solver, (HYPRE_Matrix) A, (HYPRE_Vector) b, (HYPRE_Vector) x ) ); } /*==========================================================================*/ HYPRE_Int HYPRE_StructLGMRESSolve( HYPRE_StructSolver solver, HYPRE_StructMatrix A, HYPRE_StructVector b, HYPRE_StructVector x ) { return ( HYPRE_LGMRESSolve( (HYPRE_Solver) solver, (HYPRE_Matrix) A, (HYPRE_Vector) b, (HYPRE_Vector) x ) ); } /*==========================================================================*/ HYPRE_Int HYPRE_StructLGMRESSetTol( HYPRE_StructSolver solver, HYPRE_Real tol ) { return ( HYPRE_LGMRESSetTol( (HYPRE_Solver) solver, tol ) ); } /*==========================================================================*/ HYPRE_Int HYPRE_StructLGMRESSetAbsoluteTol( HYPRE_StructSolver solver, HYPRE_Real tol ) { return ( HYPRE_LGMRESSetAbsoluteTol( (HYPRE_Solver) solver, tol ) ); } /*==========================================================================*/ HYPRE_Int HYPRE_StructLGMRESSetMaxIter( HYPRE_StructSolver solver, HYPRE_Int max_iter ) { return ( HYPRE_LGMRESSetMaxIter( (HYPRE_Solver) solver, max_iter ) ); } /*==========================================================================*/ HYPRE_Int HYPRE_StructLGMRESSetKDim( HYPRE_StructSolver solver, HYPRE_Int k_dim ) { return ( HYPRE_LGMRESSetKDim( (HYPRE_Solver) solver, k_dim ) ); } /*==========================================================================*/ HYPRE_Int HYPRE_StructLGMRESSetAugDim( HYPRE_StructSolver solver, HYPRE_Int aug_dim ) { return ( HYPRE_LGMRESSetAugDim( (HYPRE_Solver) solver, aug_dim ) ); } /*==========================================================================*/ HYPRE_Int HYPRE_StructLGMRESSetPrecond( HYPRE_StructSolver solver, HYPRE_PtrToStructSolverFcn precond, HYPRE_PtrToStructSolverFcn precond_setup, HYPRE_StructSolver precond_solver ) { return ( HYPRE_LGMRESSetPrecond( (HYPRE_Solver) solver, (HYPRE_PtrToSolverFcn) precond, (HYPRE_PtrToSolverFcn) precond_setup, (HYPRE_Solver) precond_solver ) ); } /*==========================================================================*/ HYPRE_Int HYPRE_StructLGMRESSetLogging( HYPRE_StructSolver solver, HYPRE_Int logging ) { return ( HYPRE_LGMRESSetLogging( (HYPRE_Solver) solver, logging ) ); } /*==========================================================================*/ HYPRE_Int HYPRE_StructLGMRESSetPrintLevel( HYPRE_StructSolver solver, HYPRE_Int print_level ) { return ( HYPRE_LGMRESSetPrintLevel( (HYPRE_Solver) solver, print_level ) ); } /*==========================================================================*/ HYPRE_Int HYPRE_StructLGMRESGetNumIterations( HYPRE_StructSolver solver, HYPRE_Int *num_iterations ) { return ( HYPRE_LGMRESGetNumIterations( (HYPRE_Solver) solver, num_iterations ) ); } /*==========================================================================*/ HYPRE_Int HYPRE_StructLGMRESGetFinalRelativeResidualNorm( HYPRE_StructSolver solver, HYPRE_Real *norm ) { return ( HYPRE_LGMRESGetFinalRelativeResidualNorm( (HYPRE_Solver) solver, norm ) ); } hypre-2.33.0/src/struct_ls/HYPRE_struct_ls.h000066400000000000000000001262301477326011500207130ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #ifndef HYPRE_STRUCT_LS_HEADER #define HYPRE_STRUCT_LS_HEADER #include "HYPRE_utilities.h" #include "HYPRE_struct_mv.h" #include "HYPRE_lobpcg.h" #ifdef __cplusplus extern "C" { #endif /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ /** * @defgroup StructSolvers Struct Solvers * * Linear solvers for structured grids. These solvers use matrix/vector storage * schemes that are tailored to structured grid problems. * * @{ **/ /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ /** * @name Struct Solvers * * @{ **/ struct hypre_StructSolver_struct; /** * The solver object. **/ typedef struct hypre_StructSolver_struct *HYPRE_StructSolver; typedef HYPRE_Int (*HYPRE_PtrToStructSolverFcn)(HYPRE_StructSolver, HYPRE_StructMatrix, HYPRE_StructVector, HYPRE_StructVector); #ifndef HYPRE_MODIFYPC #define HYPRE_MODIFYPC /* if pc not defined, then may need HYPRE_SOLVER also */ typedef HYPRE_Int (*HYPRE_PtrToModifyPCFcn)(HYPRE_Solver, HYPRE_Int, HYPRE_Real); #endif /**@}*/ /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ /** * @name Struct Jacobi Solver * * @{ **/ /** * Create a solver object. **/ HYPRE_Int HYPRE_StructJacobiCreate(MPI_Comm comm, HYPRE_StructSolver *solver); /** * Destroy a solver object. An object should be explicitly destroyed * using this destructor when the user's code no longer needs direct * access to it. Once destroyed, the object must not be referenced * again. Note that the object may not be deallocated at the * completion of this call, since there may be internal package * references to the object. The object will then be destroyed when * all internal reference counts go to zero. **/ HYPRE_Int HYPRE_StructJacobiDestroy(HYPRE_StructSolver solver); /** * Prepare to solve the system. The coefficient data in \e b and \e x is * ignored here, but information about the layout of the data may be used. **/ HYPRE_Int HYPRE_StructJacobiSetup(HYPRE_StructSolver solver, HYPRE_StructMatrix A, HYPRE_StructVector b, HYPRE_StructVector x); /** * Solve the system. **/ HYPRE_Int HYPRE_StructJacobiSolve(HYPRE_StructSolver solver, HYPRE_StructMatrix A, HYPRE_StructVector b, HYPRE_StructVector x); /** * (Optional) Set the convergence tolerance. **/ HYPRE_Int HYPRE_StructJacobiSetTol(HYPRE_StructSolver solver, HYPRE_Real tol); HYPRE_Int HYPRE_StructJacobiGetTol(HYPRE_StructSolver solver, HYPRE_Real *tol ); /** * (Optional) Set maximum number of iterations. **/ HYPRE_Int HYPRE_StructJacobiSetMaxIter(HYPRE_StructSolver solver, HYPRE_Int max_iter); HYPRE_Int HYPRE_StructJacobiGetMaxIter(HYPRE_StructSolver solver, HYPRE_Int *max_iter ); /** * (Optional) Use a zero initial guess. This allows the solver to cut corners * in the case where a zero initial guess is needed (e.g., for preconditioning) * to reduce compuational cost. **/ HYPRE_Int HYPRE_StructJacobiSetZeroGuess(HYPRE_StructSolver solver); HYPRE_Int HYPRE_StructJacobiGetZeroGuess(HYPRE_StructSolver solver, HYPRE_Int *zeroguess ); /** * (Optional) Use a nonzero initial guess. This is the default behavior, but * this routine allows the user to switch back after using \e SetZeroGuess. **/ HYPRE_Int HYPRE_StructJacobiSetNonZeroGuess(HYPRE_StructSolver solver); /** * Return the number of iterations taken. **/ HYPRE_Int HYPRE_StructJacobiGetNumIterations(HYPRE_StructSolver solver, HYPRE_Int *num_iterations); /** * Return the norm of the final relative residual. **/ HYPRE_Int HYPRE_StructJacobiGetFinalRelativeResidualNorm(HYPRE_StructSolver solver, HYPRE_Real *norm); /**@}*/ /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ /** * @name Struct PFMG Solver * * PFMG is a semicoarsening multigrid solver that uses pointwise relaxation. * For periodic problems, users should try to set the grid size in periodic * dimensions to be as close to a power-of-two as possible. That is, if the * grid size in a periodic dimension is given by \f$N = 2^m * M\f$ where \f$M\f$ * is not a power-of-two, then \f$M\f$ should be as small as possible. Large * values of \f$M\f$ will generally result in slower convergence rates. * * @{ **/ /** * Create a solver object. **/ HYPRE_Int HYPRE_StructPFMGCreate(MPI_Comm comm, HYPRE_StructSolver *solver); /** * Destroy a solver object. **/ HYPRE_Int HYPRE_StructPFMGDestroy(HYPRE_StructSolver solver); /** * Prepare to solve the system. The coefficient data in \e b and \e x is * ignored here, but information about the layout of the data may be used. **/ HYPRE_Int HYPRE_StructPFMGSetup(HYPRE_StructSolver solver, HYPRE_StructMatrix A, HYPRE_StructVector b, HYPRE_StructVector x); /** * Solve the system. **/ HYPRE_Int HYPRE_StructPFMGSolve(HYPRE_StructSolver solver, HYPRE_StructMatrix A, HYPRE_StructVector b, HYPRE_StructVector x); /** * (Optional) Set the convergence tolerance. **/ HYPRE_Int HYPRE_StructPFMGSetTol(HYPRE_StructSolver solver, HYPRE_Real tol); HYPRE_Int HYPRE_StructPFMGGetTol (HYPRE_StructSolver solver, HYPRE_Real *tol); /** * (Optional) Set maximum number of iterations. **/ HYPRE_Int HYPRE_StructPFMGSetMaxIter(HYPRE_StructSolver solver, HYPRE_Int max_iter); HYPRE_Int HYPRE_StructPFMGGetMaxIter(HYPRE_StructSolver solver, HYPRE_Int *max_iter); /** * (Optional) Set maximum number of multigrid grid levels. **/ HYPRE_Int HYPRE_StructPFMGSetMaxLevels(HYPRE_StructSolver solver, HYPRE_Int max_levels); HYPRE_Int HYPRE_StructPFMGGetMaxLevels (HYPRE_StructSolver solver, HYPRE_Int *max_levels ); /** * (Optional) Additionally require that the relative difference in * successive iterates be small. **/ HYPRE_Int HYPRE_StructPFMGSetRelChange(HYPRE_StructSolver solver, HYPRE_Int rel_change); HYPRE_Int HYPRE_StructPFMGGetRelChange (HYPRE_StructSolver solver, HYPRE_Int *rel_change); /** * (Optional) Use a zero initial guess. This allows the solver to cut corners * in the case where a zero initial guess is needed (e.g., for preconditioning) * to reduce compuational cost. **/ HYPRE_Int HYPRE_StructPFMGSetZeroGuess(HYPRE_StructSolver solver); HYPRE_Int HYPRE_StructPFMGGetZeroGuess(HYPRE_StructSolver solver, HYPRE_Int *zeroguess); /** * (Optional) Use a nonzero initial guess. This is the default behavior, but * this routine allows the user to switch back after using \e SetZeroGuess. **/ HYPRE_Int HYPRE_StructPFMGSetNonZeroGuess(HYPRE_StructSolver solver); /** * (Optional) Set relaxation type. * * Current relaxation methods set by \e relax_type are: * * - 0 : Jacobi * - 1 : Weighted Jacobi (default) * - 2 : Red/Black Gauss-Seidel (symmetric: RB pre-relaxation, BR post-relaxation) * - 3 : Red/Black Gauss-Seidel (nonsymmetric: RB pre- and post-relaxation) **/ HYPRE_Int HYPRE_StructPFMGSetRelaxType(HYPRE_StructSolver solver, HYPRE_Int relax_type); HYPRE_Int HYPRE_StructPFMGGetRelaxType(HYPRE_StructSolver solver, HYPRE_Int *relax_type); /* * (Optional) Set Jacobi weight (this is purposely not documented) */ HYPRE_Int HYPRE_StructPFMGSetJacobiWeight(HYPRE_StructSolver solver, HYPRE_Real weight); HYPRE_Int HYPRE_StructPFMGGetJacobiWeight(HYPRE_StructSolver solver, HYPRE_Real *weight); /** * (Optional) Set type of coarse-grid operator to use. * * Current operators set by \e rap_type are: * * - 0 : Galerkin (default) * - 1 : non-Galerkin 5-pt or 7-pt stencils * * Both operators are constructed algebraically. The non-Galerkin option * maintains a 5-pt stencil in 2D and a 7-pt stencil in 3D on all grid levels. * The stencil coefficients are computed by averaging techniques. **/ HYPRE_Int HYPRE_StructPFMGSetRAPType(HYPRE_StructSolver solver, HYPRE_Int rap_type); HYPRE_Int HYPRE_StructPFMGGetRAPType(HYPRE_StructSolver solver, HYPRE_Int *rap_type ); /** * (Optional) Set number of relaxation sweeps before coarse-grid correction. **/ HYPRE_Int HYPRE_StructPFMGSetNumPreRelax(HYPRE_StructSolver solver, HYPRE_Int num_pre_relax); HYPRE_Int HYPRE_StructPFMGGetNumPreRelax(HYPRE_StructSolver solver, HYPRE_Int *num_pre_relax); /** * (Optional) Set number of relaxation sweeps after coarse-grid correction. **/ HYPRE_Int HYPRE_StructPFMGSetNumPostRelax(HYPRE_StructSolver solver, HYPRE_Int num_post_relax); HYPRE_Int HYPRE_StructPFMGGetNumPostRelax(HYPRE_StructSolver solver, HYPRE_Int *num_post_relax); /** * (Optional) Skip relaxation on certain grids for isotropic problems. This can * greatly improve efficiency by eliminating unnecessary relaxations when the * underlying problem is isotropic. **/ HYPRE_Int HYPRE_StructPFMGSetSkipRelax(HYPRE_StructSolver solver, HYPRE_Int skip_relax); HYPRE_Int HYPRE_StructPFMGGetSkipRelax(HYPRE_StructSolver solver, HYPRE_Int *skip_relax); /* * RE-VISIT **/ HYPRE_Int HYPRE_StructPFMGSetDxyz(HYPRE_StructSolver solver, HYPRE_Real *dxyz); /** * (Optional) Set the amount of logging to do. **/ HYPRE_Int HYPRE_StructPFMGSetLogging(HYPRE_StructSolver solver, HYPRE_Int logging); HYPRE_Int HYPRE_StructPFMGGetLogging(HYPRE_StructSolver solver, HYPRE_Int *logging); /** * (Optional) Set the amount of printing to do to the screen. **/ HYPRE_Int HYPRE_StructPFMGSetPrintLevel(HYPRE_StructSolver solver, HYPRE_Int print_level); HYPRE_Int HYPRE_StructPFMGGetPrintLevel(HYPRE_StructSolver solver, HYPRE_Int *print_level); /** * Return the number of iterations taken. **/ HYPRE_Int HYPRE_StructPFMGGetNumIterations(HYPRE_StructSolver solver, HYPRE_Int *num_iterations); /** * Return the norm of the final relative residual. **/ HYPRE_Int HYPRE_StructPFMGGetFinalRelativeResidualNorm(HYPRE_StructSolver solver, HYPRE_Real *norm); #if 0 //defined(HYPRE_USING_CUDA) || defined(HYPRE_USING_HIP) HYPRE_Int HYPRE_StructPFMGSetDeviceLevel( HYPRE_StructSolver solver, HYPRE_Int device_level ); #endif /**@}*/ /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ /** * @name Struct SMG Solver * * SMG is a semicoarsening multigrid solver that uses plane smoothing (in 3D). * The plane smoother calls a 2D SMG algorithm with line smoothing, and the line * smoother is cyclic reduction (1D SMG). For periodic problems, the grid size * in periodic dimensions currently must be a power-of-two. * * @{ **/ /** * Create a solver object. **/ HYPRE_Int HYPRE_StructSMGCreate(MPI_Comm comm, HYPRE_StructSolver *solver); /** * Destroy a solver object. **/ HYPRE_Int HYPRE_StructSMGDestroy(HYPRE_StructSolver solver); /** * Prepare to solve the system. The coefficient data in \e b and \e x is * ignored here, but information about the layout of the data may be used. **/ HYPRE_Int HYPRE_StructSMGSetup(HYPRE_StructSolver solver, HYPRE_StructMatrix A, HYPRE_StructVector b, HYPRE_StructVector x); /** * Solve the system. **/ HYPRE_Int HYPRE_StructSMGSolve(HYPRE_StructSolver solver, HYPRE_StructMatrix A, HYPRE_StructVector b, HYPRE_StructVector x); /* * RE-VISIT **/ HYPRE_Int HYPRE_StructSMGSetMemoryUse(HYPRE_StructSolver solver, HYPRE_Int memory_use); HYPRE_Int HYPRE_StructSMGGetMemoryUse(HYPRE_StructSolver solver, HYPRE_Int *memory_use); /** * (Optional) Set the convergence tolerance. **/ HYPRE_Int HYPRE_StructSMGSetTol(HYPRE_StructSolver solver, HYPRE_Real tol); HYPRE_Int HYPRE_StructSMGGetTol(HYPRE_StructSolver solver, HYPRE_Real *tol); /** * (Optional) Set maximum number of iterations. **/ HYPRE_Int HYPRE_StructSMGSetMaxIter(HYPRE_StructSolver solver, HYPRE_Int max_iter); HYPRE_Int HYPRE_StructSMGGetMaxIter(HYPRE_StructSolver solver, HYPRE_Int *max_iter); /** * (Optional) Additionally require that the relative difference in * successive iterates be small. **/ HYPRE_Int HYPRE_StructSMGSetRelChange(HYPRE_StructSolver solver, HYPRE_Int rel_change); HYPRE_Int HYPRE_StructSMGGetRelChange(HYPRE_StructSolver solver, HYPRE_Int *rel_change); /** * (Optional) Use a zero initial guess. This allows the solver to cut corners * in the case where a zero initial guess is needed (e.g., for preconditioning) * to reduce compuational cost. **/ HYPRE_Int HYPRE_StructSMGSetZeroGuess(HYPRE_StructSolver solver); HYPRE_Int HYPRE_StructSMGGetZeroGuess(HYPRE_StructSolver solver, HYPRE_Int *zeroguess); /** * (Optional) Use a nonzero initial guess. This is the default behavior, but * this routine allows the user to switch back after using \e SetZeroGuess. **/ HYPRE_Int HYPRE_StructSMGSetNonZeroGuess(HYPRE_StructSolver solver); /** * (Optional) Set number of relaxation sweeps before coarse-grid correction. **/ HYPRE_Int HYPRE_StructSMGSetNumPreRelax(HYPRE_StructSolver solver, HYPRE_Int num_pre_relax); HYPRE_Int HYPRE_StructSMGGetNumPreRelax(HYPRE_StructSolver solver, HYPRE_Int *num_pre_relax); /** * (Optional) Set number of relaxation sweeps after coarse-grid correction. **/ HYPRE_Int HYPRE_StructSMGSetNumPostRelax(HYPRE_StructSolver solver, HYPRE_Int num_post_relax); HYPRE_Int HYPRE_StructSMGGetNumPostRelax(HYPRE_StructSolver solver, HYPRE_Int *num_post_relax); /** * (Optional) Set the amount of logging to do. **/ HYPRE_Int HYPRE_StructSMGSetLogging(HYPRE_StructSolver solver, HYPRE_Int logging); HYPRE_Int HYPRE_StructSMGGetLogging(HYPRE_StructSolver solver, HYPRE_Int *logging); /** * (Optional) Set the amount of printing to do to the screen. **/ HYPRE_Int HYPRE_StructSMGSetPrintLevel(HYPRE_StructSolver solver, HYPRE_Int print_level); HYPRE_Int HYPRE_StructSMGGetPrintLevel(HYPRE_StructSolver solver, HYPRE_Int *print_level); /** * Return the number of iterations taken. **/ HYPRE_Int HYPRE_StructSMGGetNumIterations(HYPRE_StructSolver solver, HYPRE_Int *num_iterations); /** * Return the norm of the final relative residual. **/ HYPRE_Int HYPRE_StructSMGGetFinalRelativeResidualNorm(HYPRE_StructSolver solver, HYPRE_Real *norm); #if 0 //defined(HYPRE_USING_CUDA) || defined(HYPRE_USING_HIP) HYPRE_Int HYPRE_StructSMGSetDeviceLevel( HYPRE_StructSolver solver, HYPRE_Int device_level ); #endif /**@}*/ /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ /** * @name Struct CycRed Solver * * CycRed is a cyclic reduction solver that simultaneously solves a collection * of 1D tridiagonal systems embedded in a d-dimensional grid. * * @{ **/ /** * Create a solver object. **/ HYPRE_Int HYPRE_StructCycRedCreate(MPI_Comm comm, HYPRE_StructSolver *solver); /** * Destroy a solver object. **/ HYPRE_Int HYPRE_StructCycRedDestroy(HYPRE_StructSolver solver); /** * Prepare to solve the system. The coefficient data in \e b and \e x is * ignored here, but information about the layout of the data may be used. **/ HYPRE_Int HYPRE_StructCycRedSetup(HYPRE_StructSolver solver, HYPRE_StructMatrix A, HYPRE_StructVector b, HYPRE_StructVector x); /** * Solve the system. **/ HYPRE_Int HYPRE_StructCycRedSolve(HYPRE_StructSolver solver, HYPRE_StructMatrix A, HYPRE_StructVector b, HYPRE_StructVector x); /** * * (Optional) Set the dimension number for the embedded 1D tridiagonal systems. * The default is \e tdim = 0. **/ HYPRE_Int HYPRE_StructCycRedSetTDim(HYPRE_StructSolver solver, HYPRE_Int tdim); /** * (Optional) Set the base index and stride for the embedded 1D systems. The * stride must be equal one in the dimension corresponding to the 1D systems * (see \ref HYPRE_StructCycRedSetTDim). **/ HYPRE_Int HYPRE_StructCycRedSetBase(HYPRE_StructSolver solver, HYPRE_Int ndim, HYPRE_Int *base_index, HYPRE_Int *base_stride); /**@}*/ /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ /** * @name Struct PCG Solver * * These routines should be used in conjunction with the generic interface in * \ref KrylovSolvers. * * @{ **/ /** * Create a solver object. **/ HYPRE_Int HYPRE_StructPCGCreate(MPI_Comm comm, HYPRE_StructSolver *solver); /** * Destroy a solver object. **/ HYPRE_Int HYPRE_StructPCGDestroy(HYPRE_StructSolver solver); HYPRE_Int HYPRE_StructPCGSetup(HYPRE_StructSolver solver, HYPRE_StructMatrix A, HYPRE_StructVector b, HYPRE_StructVector x); HYPRE_Int HYPRE_StructPCGSolve(HYPRE_StructSolver solver, HYPRE_StructMatrix A, HYPRE_StructVector b, HYPRE_StructVector x); HYPRE_Int HYPRE_StructPCGSetTol(HYPRE_StructSolver solver, HYPRE_Real tol); HYPRE_Int HYPRE_StructPCGSetAbsoluteTol(HYPRE_StructSolver solver, HYPRE_Real tol); HYPRE_Int HYPRE_StructPCGSetMaxIter(HYPRE_StructSolver solver, HYPRE_Int max_iter); HYPRE_Int HYPRE_StructPCGSetTwoNorm(HYPRE_StructSolver solver, HYPRE_Int two_norm); HYPRE_Int HYPRE_StructPCGSetRelChange(HYPRE_StructSolver solver, HYPRE_Int rel_change); HYPRE_Int HYPRE_StructPCGSetPrecond(HYPRE_StructSolver solver, HYPRE_PtrToStructSolverFcn precond, HYPRE_PtrToStructSolverFcn precond_setup, HYPRE_StructSolver precond_solver); HYPRE_Int HYPRE_StructPCGSetLogging(HYPRE_StructSolver solver, HYPRE_Int logging); HYPRE_Int HYPRE_StructPCGSetPrintLevel(HYPRE_StructSolver solver, HYPRE_Int level); HYPRE_Int HYPRE_StructPCGGetNumIterations(HYPRE_StructSolver solver, HYPRE_Int *num_iterations); HYPRE_Int HYPRE_StructPCGGetFinalRelativeResidualNorm(HYPRE_StructSolver solver, HYPRE_Real *norm); HYPRE_Int HYPRE_StructPCGGetResidual(HYPRE_StructSolver solver, void **residual); /** * Setup routine for diagonal preconditioning. **/ HYPRE_Int HYPRE_StructDiagScaleSetup(HYPRE_StructSolver solver, HYPRE_StructMatrix A, HYPRE_StructVector y, HYPRE_StructVector x); /** * Solve routine for diagonal preconditioning. **/ HYPRE_Int HYPRE_StructDiagScale(HYPRE_StructSolver solver, HYPRE_StructMatrix HA, HYPRE_StructVector Hy, HYPRE_StructVector Hx); /**@}*/ /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ /** * @name Struct GMRES Solver * * These routines should be used in conjunction with the generic interface in * \ref KrylovSolvers. * * @{ **/ /** * Create a solver object. **/ HYPRE_Int HYPRE_StructGMRESCreate(MPI_Comm comm, HYPRE_StructSolver *solver); /** * Destroy a solver object. **/ HYPRE_Int HYPRE_StructGMRESDestroy(HYPRE_StructSolver solver); HYPRE_Int HYPRE_StructGMRESSetup(HYPRE_StructSolver solver, HYPRE_StructMatrix A, HYPRE_StructVector b, HYPRE_StructVector x); HYPRE_Int HYPRE_StructGMRESSolve(HYPRE_StructSolver solver, HYPRE_StructMatrix A, HYPRE_StructVector b, HYPRE_StructVector x); HYPRE_Int HYPRE_StructGMRESSetTol(HYPRE_StructSolver solver, HYPRE_Real tol); HYPRE_Int HYPRE_StructGMRESSetAbsoluteTol(HYPRE_StructSolver solver, HYPRE_Real tol); HYPRE_Int HYPRE_StructGMRESSetMaxIter(HYPRE_StructSolver solver, HYPRE_Int max_iter); HYPRE_Int HYPRE_StructGMRESSetKDim(HYPRE_StructSolver solver, HYPRE_Int k_dim); HYPRE_Int HYPRE_StructGMRESSetPrecond(HYPRE_StructSolver solver, HYPRE_PtrToStructSolverFcn precond, HYPRE_PtrToStructSolverFcn precond_setup, HYPRE_StructSolver precond_solver); HYPRE_Int HYPRE_StructGMRESSetLogging(HYPRE_StructSolver solver, HYPRE_Int logging); HYPRE_Int HYPRE_StructGMRESSetPrintLevel(HYPRE_StructSolver solver, HYPRE_Int level); HYPRE_Int HYPRE_StructGMRESGetNumIterations(HYPRE_StructSolver solver, HYPRE_Int *num_iterations); HYPRE_Int HYPRE_StructGMRESGetFinalRelativeResidualNorm(HYPRE_StructSolver solver, HYPRE_Real *norm); HYPRE_Int HYPRE_StructGMRESGetResidual(HYPRE_StructSolver solver, void **residual); /**@}*/ /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ /** * @name Struct FlexGMRES Solver * * These routines should be used in conjunction with the generic interface in * \ref KrylovSolvers. * * @{ **/ /** * Create a solver object. **/ HYPRE_Int HYPRE_StructFlexGMRESCreate(MPI_Comm comm, HYPRE_StructSolver *solver); /** * Destroy a solver object. **/ HYPRE_Int HYPRE_StructFlexGMRESDestroy(HYPRE_StructSolver solver); HYPRE_Int HYPRE_StructFlexGMRESSetup(HYPRE_StructSolver solver, HYPRE_StructMatrix A, HYPRE_StructVector b, HYPRE_StructVector x); HYPRE_Int HYPRE_StructFlexGMRESSolve(HYPRE_StructSolver solver, HYPRE_StructMatrix A, HYPRE_StructVector b, HYPRE_StructVector x); HYPRE_Int HYPRE_StructFlexGMRESSetTol(HYPRE_StructSolver solver, HYPRE_Real tol); HYPRE_Int HYPRE_StructFlexGMRESSetAbsoluteTol(HYPRE_StructSolver solver, HYPRE_Real tol); HYPRE_Int HYPRE_StructFlexGMRESSetMaxIter(HYPRE_StructSolver solver, HYPRE_Int max_iter); HYPRE_Int HYPRE_StructFlexGMRESSetKDim(HYPRE_StructSolver solver, HYPRE_Int k_dim); HYPRE_Int HYPRE_StructFlexGMRESSetPrecond(HYPRE_StructSolver solver, HYPRE_PtrToStructSolverFcn precond, HYPRE_PtrToStructSolverFcn precond_setup, HYPRE_StructSolver precond_solver); HYPRE_Int HYPRE_StructFlexGMRESSetLogging(HYPRE_StructSolver solver, HYPRE_Int logging); HYPRE_Int HYPRE_StructFlexGMRESSetPrintLevel(HYPRE_StructSolver solver, HYPRE_Int level); HYPRE_Int HYPRE_StructFlexGMRESGetNumIterations(HYPRE_StructSolver solver, HYPRE_Int *num_iterations); HYPRE_Int HYPRE_StructFlexGMRESGetFinalRelativeResidualNorm(HYPRE_StructSolver solver, HYPRE_Real *norm); HYPRE_Int HYPRE_StructFlexGMRESGetResidual(HYPRE_StructSolver solver, void **residual); HYPRE_Int HYPRE_StructFlexGMRESSetModifyPC(HYPRE_StructSolver solver, HYPRE_PtrToModifyPCFcn modify_pc); /**@}*/ /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ /** * @name Struct LGMRES Solver * * These routines should be used in conjunction with the generic interface in * \ref KrylovSolvers. * * @{ **/ /** * Create a solver object. **/ HYPRE_Int HYPRE_StructLGMRESCreate(MPI_Comm comm, HYPRE_StructSolver *solver); /** * Destroy a solver object. **/ HYPRE_Int HYPRE_StructLGMRESDestroy(HYPRE_StructSolver solver); HYPRE_Int HYPRE_StructLGMRESSetup(HYPRE_StructSolver solver, HYPRE_StructMatrix A, HYPRE_StructVector b, HYPRE_StructVector x); HYPRE_Int HYPRE_StructLGMRESSolve(HYPRE_StructSolver solver, HYPRE_StructMatrix A, HYPRE_StructVector b, HYPRE_StructVector x); HYPRE_Int HYPRE_StructLGMRESSetTol(HYPRE_StructSolver solver, HYPRE_Real tol); HYPRE_Int HYPRE_StructLGMRESSetAbsoluteTol(HYPRE_StructSolver solver, HYPRE_Real tol); HYPRE_Int HYPRE_StructLGMRESSetMaxIter(HYPRE_StructSolver solver, HYPRE_Int max_iter); HYPRE_Int HYPRE_StructLGMRESSetKDim(HYPRE_StructSolver solver, HYPRE_Int k_dim); HYPRE_Int HYPRE_StructLGMRESSetAugDim(HYPRE_StructSolver solver, HYPRE_Int aug_dim); HYPRE_Int HYPRE_StructLGMRESSetPrecond(HYPRE_StructSolver solver, HYPRE_PtrToStructSolverFcn precond, HYPRE_PtrToStructSolverFcn precond_setup, HYPRE_StructSolver precond_solver); HYPRE_Int HYPRE_StructLGMRESSetLogging(HYPRE_StructSolver solver, HYPRE_Int logging); HYPRE_Int HYPRE_StructLGMRESSetPrintLevel(HYPRE_StructSolver solver, HYPRE_Int level); HYPRE_Int HYPRE_StructLGMRESGetNumIterations(HYPRE_StructSolver solver, HYPRE_Int *num_iterations); HYPRE_Int HYPRE_StructLGMRESGetFinalRelativeResidualNorm(HYPRE_StructSolver solver, HYPRE_Real *norm); HYPRE_Int HYPRE_StructLGMRESGetResidual(HYPRE_StructSolver solver, void **residual); /**@}*/ /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ /** * @name Struct BiCGSTAB Solver * * These routines should be used in conjunction with the generic interface in * \ref KrylovSolvers. * * @{ **/ /** * Create a solver object. **/ HYPRE_Int HYPRE_StructBiCGSTABCreate(MPI_Comm comm, HYPRE_StructSolver *solver); /** * Destroy a solver object. **/ HYPRE_Int HYPRE_StructBiCGSTABDestroy(HYPRE_StructSolver solver); HYPRE_Int HYPRE_StructBiCGSTABSetup(HYPRE_StructSolver solver, HYPRE_StructMatrix A, HYPRE_StructVector b, HYPRE_StructVector x); HYPRE_Int HYPRE_StructBiCGSTABSolve(HYPRE_StructSolver solver, HYPRE_StructMatrix A, HYPRE_StructVector b, HYPRE_StructVector x); HYPRE_Int HYPRE_StructBiCGSTABSetTol(HYPRE_StructSolver solver, HYPRE_Real tol); HYPRE_Int HYPRE_StructBiCGSTABSetAbsoluteTol(HYPRE_StructSolver solver, HYPRE_Real tol); HYPRE_Int HYPRE_StructBiCGSTABSetMaxIter(HYPRE_StructSolver solver, HYPRE_Int max_iter); HYPRE_Int HYPRE_StructBiCGSTABSetPrecond(HYPRE_StructSolver solver, HYPRE_PtrToStructSolverFcn precond, HYPRE_PtrToStructSolverFcn precond_setup, HYPRE_StructSolver precond_solver); HYPRE_Int HYPRE_StructBiCGSTABSetLogging(HYPRE_StructSolver solver, HYPRE_Int logging); HYPRE_Int HYPRE_StructBiCGSTABSetPrintLevel(HYPRE_StructSolver solver, HYPRE_Int level); HYPRE_Int HYPRE_StructBiCGSTABGetNumIterations(HYPRE_StructSolver solver, HYPRE_Int *num_iterations); HYPRE_Int HYPRE_StructBiCGSTABGetFinalRelativeResidualNorm(HYPRE_StructSolver solver, HYPRE_Real *norm); HYPRE_Int HYPRE_StructBiCGSTABGetResidual( HYPRE_StructSolver solver, void **residual); /**@}*/ /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ /** * @name Struct Hybrid Solver * * @{ **/ /** * Create a solver object. **/ HYPRE_Int HYPRE_StructHybridCreate(MPI_Comm comm, HYPRE_StructSolver *solver); /** * Destroy a solver object. **/ HYPRE_Int HYPRE_StructHybridDestroy(HYPRE_StructSolver solver); /** * Prepare to solve the system. The coefficient data in \e b and \e x is * ignored here, but information about the layout of the data may be used. **/ HYPRE_Int HYPRE_StructHybridSetup(HYPRE_StructSolver solver, HYPRE_StructMatrix A, HYPRE_StructVector b, HYPRE_StructVector x); /** * Solve the system. **/ HYPRE_Int HYPRE_StructHybridSolve(HYPRE_StructSolver solver, HYPRE_StructMatrix A, HYPRE_StructVector b, HYPRE_StructVector x); /** * (Optional) Set the convergence tolerance. **/ HYPRE_Int HYPRE_StructHybridSetTol(HYPRE_StructSolver solver, HYPRE_Real tol); /** * (Optional) Set an accepted convergence tolerance for diagonal scaling (DS). * The solver will switch preconditioners if the convergence of DS is slower * than \e cf_tol. **/ HYPRE_Int HYPRE_StructHybridSetConvergenceTol(HYPRE_StructSolver solver, HYPRE_Real cf_tol); /** * (Optional) Set maximum number of iterations for diagonal scaling (DS). The * solver will switch preconditioners if DS reaches \e ds_max_its. **/ HYPRE_Int HYPRE_StructHybridSetDSCGMaxIter(HYPRE_StructSolver solver, HYPRE_Int ds_max_its); /** * (Optional) Set maximum number of iterations for general preconditioner (PRE). * The solver will stop if PRE reaches \e pre_max_its. **/ HYPRE_Int HYPRE_StructHybridSetPCGMaxIter(HYPRE_StructSolver solver, HYPRE_Int pre_max_its); /** * (Optional) Use the two-norm in stopping criteria. **/ HYPRE_Int HYPRE_StructHybridSetTwoNorm(HYPRE_StructSolver solver, HYPRE_Int two_norm); HYPRE_Int HYPRE_StructHybridSetStopCrit(HYPRE_StructSolver solver, HYPRE_Int stop_crit); /** * (Optional) Additionally require that the relative difference in * successive iterates be small. **/ HYPRE_Int HYPRE_StructHybridSetRelChange(HYPRE_StructSolver solver, HYPRE_Int rel_change); /** * (Optional) Set the type of Krylov solver to use. * * Current krylov methods set by \e solver_type are: * * - 0 : PCG (default) * - 1 : GMRES * - 2 : BiCGSTAB **/ HYPRE_Int HYPRE_StructHybridSetSolverType(HYPRE_StructSolver solver, HYPRE_Int solver_type); /** * (Optional) Set recompute residual (don't rely on 3-term recurrence). **/ HYPRE_Int HYPRE_StructHybridSetRecomputeResidual( HYPRE_StructSolver solver, HYPRE_Int recompute_residual ); /** * (Optional) Get recompute residual option. **/ HYPRE_Int HYPRE_StructHybridGetRecomputeResidual( HYPRE_StructSolver solver, HYPRE_Int *recompute_residual ); /** * (Optional) Set recompute residual period (don't rely on 3-term recurrence). * * Recomputes residual after every specified number of iterations. **/ HYPRE_Int HYPRE_StructHybridSetRecomputeResidualP( HYPRE_StructSolver solver, HYPRE_Int recompute_residual_p ); /** * (Optional) Get recompute residual period option. **/ HYPRE_Int HYPRE_StructHybridGetRecomputeResidualP( HYPRE_StructSolver solver, HYPRE_Int *recompute_residual_p ); /** * (Optional) Set the maximum size of the Krylov space when using GMRES. **/ HYPRE_Int HYPRE_StructHybridSetKDim(HYPRE_StructSolver solver, HYPRE_Int k_dim); /** * (Optional) Set the preconditioner to use. **/ HYPRE_Int HYPRE_StructHybridSetPrecond(HYPRE_StructSolver solver, HYPRE_PtrToStructSolverFcn precond, HYPRE_PtrToStructSolverFcn precond_setup, HYPRE_StructSolver precond_solver); /** * (Optional) Set the amount of logging to do. **/ HYPRE_Int HYPRE_StructHybridSetLogging(HYPRE_StructSolver solver, HYPRE_Int logging); /** * (Optional) Set the amount of printing to do to the screen. **/ HYPRE_Int HYPRE_StructHybridSetPrintLevel(HYPRE_StructSolver solver, HYPRE_Int print_level); /** * Return the number of iterations taken. **/ HYPRE_Int HYPRE_StructHybridGetNumIterations(HYPRE_StructSolver solver, HYPRE_Int *num_its); /** * Return the number of diagonal scaling iterations taken. **/ HYPRE_Int HYPRE_StructHybridGetDSCGNumIterations(HYPRE_StructSolver solver, HYPRE_Int *ds_num_its); /** * Return the number of general preconditioning iterations taken. **/ HYPRE_Int HYPRE_StructHybridGetPCGNumIterations(HYPRE_StructSolver solver, HYPRE_Int *pre_num_its); /** * Return the norm of the final relative residual. **/ HYPRE_Int HYPRE_StructHybridGetFinalRelativeResidualNorm(HYPRE_StructSolver solver, HYPRE_Real *norm); HYPRE_Int HYPRE_StructHybridSetPCGAbsoluteTolFactor(HYPRE_StructSolver solver, HYPRE_Real pcg_atolf ); /**@}*/ /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ /* * @name Struct SparseMSG Solver **/ HYPRE_Int HYPRE_StructSparseMSGCreate(MPI_Comm comm, HYPRE_StructSolver *solver); HYPRE_Int HYPRE_StructSparseMSGDestroy(HYPRE_StructSolver solver); HYPRE_Int HYPRE_StructSparseMSGSetup(HYPRE_StructSolver solver, HYPRE_StructMatrix A, HYPRE_StructVector b, HYPRE_StructVector x); HYPRE_Int HYPRE_StructSparseMSGSolve(HYPRE_StructSolver solver, HYPRE_StructMatrix A, HYPRE_StructVector b, HYPRE_StructVector x); HYPRE_Int HYPRE_StructSparseMSGSetTol(HYPRE_StructSolver solver, HYPRE_Real tol); HYPRE_Int HYPRE_StructSparseMSGSetMaxIter(HYPRE_StructSolver solver, HYPRE_Int max_iter); HYPRE_Int HYPRE_StructSparseMSGSetJump(HYPRE_StructSolver solver, HYPRE_Int jump); HYPRE_Int HYPRE_StructSparseMSGSetRelChange(HYPRE_StructSolver solver, HYPRE_Int rel_change); HYPRE_Int HYPRE_StructSparseMSGSetZeroGuess(HYPRE_StructSolver solver); HYPRE_Int HYPRE_StructSparseMSGSetNonZeroGuess(HYPRE_StructSolver solver); HYPRE_Int HYPRE_StructSparseMSGSetRelaxType(HYPRE_StructSolver solver, HYPRE_Int relax_type); HYPRE_Int HYPRE_StructSparseMSGSetJacobiWeight(HYPRE_StructSolver solver, HYPRE_Real weight); HYPRE_Int HYPRE_StructSparseMSGSetNumPreRelax(HYPRE_StructSolver solver, HYPRE_Int num_pre_relax); HYPRE_Int HYPRE_StructSparseMSGSetNumPostRelax(HYPRE_StructSolver solver, HYPRE_Int num_post_relax); HYPRE_Int HYPRE_StructSparseMSGSetNumFineRelax(HYPRE_StructSolver solver, HYPRE_Int num_fine_relax); HYPRE_Int HYPRE_StructSparseMSGSetLogging(HYPRE_StructSolver solver, HYPRE_Int logging); HYPRE_Int HYPRE_StructSparseMSGSetPrintLevel(HYPRE_StructSolver solver, HYPRE_Int print_level); HYPRE_Int HYPRE_StructSparseMSGGetNumIterations(HYPRE_StructSolver solver, HYPRE_Int *num_iterations); HYPRE_Int HYPRE_StructSparseMSGGetFinalRelativeResidualNorm(HYPRE_StructSolver solver, HYPRE_Real *norm); /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ /** * @name Struct LOBPCG Eigensolver * * These routines should be used in conjunction with the generic interface in * \ref Eigensolvers. * * @{ **/ /** * Load interface interpreter. Vector part loaded with hypre_StructKrylov * functions and multivector part loaded with mv_TempMultiVector functions. **/ HYPRE_Int HYPRE_StructSetupInterpreter(mv_InterfaceInterpreter *i); /** * Load Matvec interpreter with hypre_StructKrylov functions. **/ HYPRE_Int HYPRE_StructSetupMatvec(HYPRE_MatvecFunctions *mv); /**@}*/ /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ /**@}*/ #ifdef __cplusplus } #endif #endif hypre-2.33.0/src/struct_ls/HYPRE_struct_pcg.c000066400000000000000000000203041477326011500210340ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "_hypre_struct_ls.h" #include "_hypre_struct_mv.hpp" /*==========================================================================*/ HYPRE_Int HYPRE_StructPCGCreate( MPI_Comm comm, HYPRE_StructSolver *solver ) { HYPRE_UNUSED_VAR(comm); /* The function names with a PCG in them are in struct_ls/pcg_struct.c . These functions do rather little - e.g., cast to the correct type - before calling something else. These names should be called, e.g., hypre_struct_Free, to reduce the chance of name conflicts. */ hypre_PCGFunctions * pcg_functions = hypre_PCGFunctionsCreate( hypre_StructKrylovCAlloc, hypre_StructKrylovFree, hypre_StructKrylovCommInfo, hypre_StructKrylovCreateVector, hypre_StructKrylovDestroyVector, hypre_StructKrylovMatvecCreate, hypre_StructKrylovMatvec, hypre_StructKrylovMatvecDestroy, hypre_StructKrylovInnerProd, hypre_StructKrylovCopyVector, hypre_StructKrylovClearVector, hypre_StructKrylovScaleVector, hypre_StructKrylovAxpy, hypre_StructKrylovIdentitySetup, hypre_StructKrylovIdentity ); *solver = ( (HYPRE_StructSolver) hypre_PCGCreate( pcg_functions ) ); return hypre_error_flag; } /*==========================================================================*/ HYPRE_Int HYPRE_StructPCGDestroy( HYPRE_StructSolver solver ) { return ( hypre_PCGDestroy( (void *) solver ) ); } /*==========================================================================*/ HYPRE_Int HYPRE_StructPCGSetup( HYPRE_StructSolver solver, HYPRE_StructMatrix A, HYPRE_StructVector b, HYPRE_StructVector x ) { return ( HYPRE_PCGSetup( (HYPRE_Solver) solver, (HYPRE_Matrix) A, (HYPRE_Vector) b, (HYPRE_Vector) x ) ); } /*==========================================================================*/ HYPRE_Int HYPRE_StructPCGSolve( HYPRE_StructSolver solver, HYPRE_StructMatrix A, HYPRE_StructVector b, HYPRE_StructVector x ) { return ( HYPRE_PCGSolve( (HYPRE_Solver) solver, (HYPRE_Matrix) A, (HYPRE_Vector) b, (HYPRE_Vector) x ) ); } /*==========================================================================*/ HYPRE_Int HYPRE_StructPCGSetTol( HYPRE_StructSolver solver, HYPRE_Real tol ) { return ( HYPRE_PCGSetTol( (HYPRE_Solver) solver, tol ) ); } /*==========================================================================*/ HYPRE_Int HYPRE_StructPCGSetAbsoluteTol( HYPRE_StructSolver solver, HYPRE_Real tol ) { return ( HYPRE_PCGSetAbsoluteTol( (HYPRE_Solver) solver, tol ) ); } /*==========================================================================*/ HYPRE_Int HYPRE_StructPCGSetMaxIter( HYPRE_StructSolver solver, HYPRE_Int max_iter ) { return ( HYPRE_PCGSetMaxIter( (HYPRE_Solver) solver, max_iter ) ); } /*==========================================================================*/ HYPRE_Int HYPRE_StructPCGSetTwoNorm( HYPRE_StructSolver solver, HYPRE_Int two_norm ) { return ( HYPRE_PCGSetTwoNorm( (HYPRE_Solver) solver, two_norm ) ); } /*==========================================================================*/ HYPRE_Int HYPRE_StructPCGSetRelChange( HYPRE_StructSolver solver, HYPRE_Int rel_change ) { return ( HYPRE_PCGSetRelChange( (HYPRE_Solver) solver, rel_change ) ); } /*==========================================================================*/ HYPRE_Int HYPRE_StructPCGSetPrecond( HYPRE_StructSolver solver, HYPRE_PtrToStructSolverFcn precond, HYPRE_PtrToStructSolverFcn precond_setup, HYPRE_StructSolver precond_solver ) { return ( HYPRE_PCGSetPrecond( (HYPRE_Solver) solver, (HYPRE_PtrToSolverFcn) precond, (HYPRE_PtrToSolverFcn) precond_setup, (HYPRE_Solver) precond_solver ) ); } /*==========================================================================*/ HYPRE_Int HYPRE_StructPCGSetLogging( HYPRE_StructSolver solver, HYPRE_Int logging ) { return ( HYPRE_PCGSetLogging( (HYPRE_Solver) solver, logging ) ); } /*==========================================================================*/ HYPRE_Int HYPRE_StructPCGSetPrintLevel( HYPRE_StructSolver solver, HYPRE_Int print_level ) { return ( HYPRE_PCGSetPrintLevel( (HYPRE_Solver) solver, print_level ) ); } /*==========================================================================*/ HYPRE_Int HYPRE_StructPCGGetNumIterations( HYPRE_StructSolver solver, HYPRE_Int *num_iterations ) { return ( HYPRE_PCGGetNumIterations( (HYPRE_Solver) solver, num_iterations ) ); } /*==========================================================================*/ HYPRE_Int HYPRE_StructPCGGetFinalRelativeResidualNorm( HYPRE_StructSolver solver, HYPRE_Real *norm ) { return ( HYPRE_PCGGetFinalRelativeResidualNorm( (HYPRE_Solver) solver, norm ) ); } /*==========================================================================*/ HYPRE_Int HYPRE_StructDiagScaleSetup( HYPRE_StructSolver solver, HYPRE_StructMatrix A, HYPRE_StructVector y, HYPRE_StructVector x ) { HYPRE_UNUSED_VAR(solver); HYPRE_UNUSED_VAR(A); HYPRE_UNUSED_VAR(y); HYPRE_UNUSED_VAR(x); return hypre_error_flag; } /*==========================================================================*/ HYPRE_Int HYPRE_StructDiagScale( HYPRE_StructSolver solver, HYPRE_StructMatrix HA, HYPRE_StructVector Hy, HYPRE_StructVector Hx ) { HYPRE_UNUSED_VAR(solver); hypre_StructMatrix *A = (hypre_StructMatrix *) HA; hypre_StructVector *y = (hypre_StructVector *) Hy; hypre_StructVector *x = (hypre_StructVector *) Hx; hypre_BoxArray *boxes; hypre_Box *box; hypre_Box *A_data_box; hypre_Box *y_data_box; hypre_Box *x_data_box; HYPRE_Real *Ap; HYPRE_Real *yp; HYPRE_Real *xp; hypre_Index index; hypre_IndexRef start; hypre_Index stride; hypre_Index loop_size; HYPRE_Int i; /* x = D^{-1} y */ hypre_SetIndex(stride, 1); boxes = hypre_StructGridBoxes(hypre_StructMatrixGrid(A)); hypre_ForBoxI(i, boxes) { box = hypre_BoxArrayBox(boxes, i); A_data_box = hypre_BoxArrayBox(hypre_StructMatrixDataSpace(A), i); x_data_box = hypre_BoxArrayBox(hypre_StructVectorDataSpace(x), i); y_data_box = hypre_BoxArrayBox(hypre_StructVectorDataSpace(y), i); hypre_SetIndex(index, 0); Ap = hypre_StructMatrixExtractPointerByIndex(A, i, index); xp = hypre_StructVectorBoxData(x, i); yp = hypre_StructVectorBoxData(y, i); start = hypre_BoxIMin(box); hypre_BoxGetSize(box, loop_size); #define DEVICE_VAR is_device_ptr(xp,yp,Ap) hypre_BoxLoop3Begin(hypre_StructVectorNDim(Hx), loop_size, A_data_box, start, stride, Ai, x_data_box, start, stride, xi, y_data_box, start, stride, yi); { xp[xi] = yp[yi] / Ap[Ai]; } hypre_BoxLoop3End(Ai, xi, yi); #undef DEVICE_VAR } return hypre_error_flag; } hypre-2.33.0/src/struct_ls/HYPRE_struct_pfmg.c000066400000000000000000000252631477326011500212250ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "_hypre_struct_ls.h" /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_StructPFMGCreate( MPI_Comm comm, HYPRE_StructSolver *solver ) { *solver = ( (HYPRE_StructSolver) hypre_PFMGCreate( comm ) ); return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_StructPFMGDestroy( HYPRE_StructSolver solver ) { return ( hypre_PFMGDestroy( (void *) solver ) ); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_StructPFMGSetup( HYPRE_StructSolver solver, HYPRE_StructMatrix A, HYPRE_StructVector b, HYPRE_StructVector x ) { return ( hypre_PFMGSetup( (void *) solver, (hypre_StructMatrix *) A, (hypre_StructVector *) b, (hypre_StructVector *) x ) ); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_StructPFMGSolve( HYPRE_StructSolver solver, HYPRE_StructMatrix A, HYPRE_StructVector b, HYPRE_StructVector x ) { return ( hypre_PFMGSolve( (void *) solver, (hypre_StructMatrix *) A, (hypre_StructVector *) b, (hypre_StructVector *) x ) ); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_StructPFMGSetTol( HYPRE_StructSolver solver, HYPRE_Real tol ) { return ( hypre_PFMGSetTol( (void *) solver, tol ) ); } HYPRE_Int HYPRE_StructPFMGGetTol( HYPRE_StructSolver solver, HYPRE_Real * tol ) { return ( hypre_PFMGGetTol( (void *) solver, tol ) ); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_StructPFMGSetMaxIter( HYPRE_StructSolver solver, HYPRE_Int max_iter ) { return ( hypre_PFMGSetMaxIter( (void *) solver, max_iter ) ); } HYPRE_Int HYPRE_StructPFMGGetMaxIter( HYPRE_StructSolver solver, HYPRE_Int * max_iter ) { return ( hypre_PFMGGetMaxIter( (void *) solver, max_iter ) ); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_StructPFMGSetMaxLevels( HYPRE_StructSolver solver, HYPRE_Int max_levels ) { return ( hypre_PFMGSetMaxLevels( (void *) solver, max_levels ) ); } HYPRE_Int HYPRE_StructPFMGGetMaxLevels( HYPRE_StructSolver solver, HYPRE_Int * max_levels ) { return ( hypre_PFMGGetMaxLevels( (void *) solver, max_levels ) ); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_StructPFMGSetRelChange( HYPRE_StructSolver solver, HYPRE_Int rel_change ) { return ( hypre_PFMGSetRelChange( (void *) solver, rel_change ) ); } HYPRE_Int HYPRE_StructPFMGGetRelChange( HYPRE_StructSolver solver, HYPRE_Int * rel_change ) { return ( hypre_PFMGGetRelChange( (void *) solver, rel_change ) ); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_StructPFMGSetZeroGuess( HYPRE_StructSolver solver ) { return ( hypre_PFMGSetZeroGuess( (void *) solver, 1 ) ); } HYPRE_Int HYPRE_StructPFMGGetZeroGuess( HYPRE_StructSolver solver, HYPRE_Int * zeroguess ) { return ( hypre_PFMGGetZeroGuess( (void *) solver, zeroguess ) ); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_StructPFMGSetNonZeroGuess( HYPRE_StructSolver solver ) { return ( hypre_PFMGSetZeroGuess( (void *) solver, 0 ) ); } /*-------------------------------------------------------------------------- * GetJacobiWeight will not return the actual weight * if SetJacobiWeight has not been called. *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_StructPFMGSetRelaxType( HYPRE_StructSolver solver, HYPRE_Int relax_type ) { return ( hypre_PFMGSetRelaxType( (void *) solver, relax_type) ); } HYPRE_Int HYPRE_StructPFMGGetRelaxType( HYPRE_StructSolver solver, HYPRE_Int * relax_type ) { return ( hypre_PFMGGetRelaxType( (void *) solver, relax_type) ); } HYPRE_Int HYPRE_StructPFMGSetJacobiWeight(HYPRE_StructSolver solver, HYPRE_Real weight) { return ( hypre_PFMGSetJacobiWeight( (void *) solver, weight) ); } HYPRE_Int HYPRE_StructPFMGGetJacobiWeight(HYPRE_StructSolver solver, HYPRE_Real *weight) { return ( hypre_PFMGGetJacobiWeight( (void *) solver, weight) ); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_StructPFMGSetRAPType( HYPRE_StructSolver solver, HYPRE_Int rap_type ) { return ( hypre_PFMGSetRAPType( (void *) solver, rap_type) ); } HYPRE_Int HYPRE_StructPFMGGetRAPType( HYPRE_StructSolver solver, HYPRE_Int * rap_type ) { return ( hypre_PFMGGetRAPType( (void *) solver, rap_type) ); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_StructPFMGSetNumPreRelax( HYPRE_StructSolver solver, HYPRE_Int num_pre_relax ) { return ( hypre_PFMGSetNumPreRelax( (void *) solver, num_pre_relax) ); } HYPRE_Int HYPRE_StructPFMGGetNumPreRelax( HYPRE_StructSolver solver, HYPRE_Int * num_pre_relax ) { return ( hypre_PFMGGetNumPreRelax( (void *) solver, num_pre_relax) ); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_StructPFMGSetNumPostRelax( HYPRE_StructSolver solver, HYPRE_Int num_post_relax ) { return ( hypre_PFMGSetNumPostRelax( (void *) solver, num_post_relax) ); } HYPRE_Int HYPRE_StructPFMGGetNumPostRelax( HYPRE_StructSolver solver, HYPRE_Int * num_post_relax ) { return ( hypre_PFMGGetNumPostRelax( (void *) solver, num_post_relax) ); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_StructPFMGSetSkipRelax( HYPRE_StructSolver solver, HYPRE_Int skip_relax ) { return ( hypre_PFMGSetSkipRelax( (void *) solver, skip_relax) ); } HYPRE_Int HYPRE_StructPFMGGetSkipRelax( HYPRE_StructSolver solver, HYPRE_Int * skip_relax ) { return ( hypre_PFMGGetSkipRelax( (void *) solver, skip_relax) ); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_StructPFMGSetDxyz( HYPRE_StructSolver solver, HYPRE_Real *dxyz ) { return ( hypre_PFMGSetDxyz( (void *) solver, dxyz) ); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_StructPFMGSetLogging( HYPRE_StructSolver solver, HYPRE_Int logging ) { return ( hypre_PFMGSetLogging( (void *) solver, logging) ); } HYPRE_Int HYPRE_StructPFMGGetLogging( HYPRE_StructSolver solver, HYPRE_Int * logging ) { return ( hypre_PFMGGetLogging( (void *) solver, logging) ); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_StructPFMGSetPrintLevel( HYPRE_StructSolver solver, HYPRE_Int print_level ) { return ( hypre_PFMGSetPrintLevel( (void *) solver, print_level) ); } HYPRE_Int HYPRE_StructPFMGGetPrintLevel( HYPRE_StructSolver solver, HYPRE_Int * print_level ) { return ( hypre_PFMGGetPrintLevel( (void *) solver, print_level) ); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_StructPFMGGetNumIterations( HYPRE_StructSolver solver, HYPRE_Int *num_iterations ) { return ( hypre_PFMGGetNumIterations( (void *) solver, num_iterations ) ); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_StructPFMGGetFinalRelativeResidualNorm( HYPRE_StructSolver solver, HYPRE_Real *norm ) { return ( hypre_PFMGGetFinalRelativeResidualNorm( (void *) solver, norm ) ); } #if 0 //defined(HYPRE_USING_GPU) HYPRE_Int HYPRE_StructPFMGSetDeviceLevel( HYPRE_StructSolver solver, HYPRE_Int device_level ) { return ( hypre_PFMGSetDeviceLevel( (void *) solver, device_level ) ); } #endif hypre-2.33.0/src/struct_ls/HYPRE_struct_smg.c000066400000000000000000000203461477326011500210570ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "_hypre_struct_ls.h" /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_StructSMGCreate( MPI_Comm comm, HYPRE_StructSolver *solver ) { *solver = ( (HYPRE_StructSolver) hypre_SMGCreate( comm ) ); return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_StructSMGDestroy( HYPRE_StructSolver solver ) { return ( hypre_SMGDestroy( (void *) solver ) ); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_StructSMGSetup( HYPRE_StructSolver solver, HYPRE_StructMatrix A, HYPRE_StructVector b, HYPRE_StructVector x ) { return ( hypre_SMGSetup( (void *) solver, (hypre_StructMatrix *) A, (hypre_StructVector *) b, (hypre_StructVector *) x ) ); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_StructSMGSolve( HYPRE_StructSolver solver, HYPRE_StructMatrix A, HYPRE_StructVector b, HYPRE_StructVector x ) { return ( hypre_SMGSolve( (void *) solver, (hypre_StructMatrix *) A, (hypre_StructVector *) b, (hypre_StructVector *) x ) ); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_StructSMGSetMemoryUse( HYPRE_StructSolver solver, HYPRE_Int memory_use ) { return ( hypre_SMGSetMemoryUse( (void *) solver, memory_use ) ); } HYPRE_Int HYPRE_StructSMGGetMemoryUse( HYPRE_StructSolver solver, HYPRE_Int * memory_use ) { return ( hypre_SMGGetMemoryUse( (void *) solver, memory_use ) ); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_StructSMGSetTol( HYPRE_StructSolver solver, HYPRE_Real tol ) { return ( hypre_SMGSetTol( (void *) solver, tol ) ); } HYPRE_Int HYPRE_StructSMGGetTol( HYPRE_StructSolver solver, HYPRE_Real * tol ) { return ( hypre_SMGGetTol( (void *) solver, tol ) ); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_StructSMGSetMaxIter( HYPRE_StructSolver solver, HYPRE_Int max_iter ) { return ( hypre_SMGSetMaxIter( (void *) solver, max_iter ) ); } HYPRE_Int HYPRE_StructSMGGetMaxIter( HYPRE_StructSolver solver, HYPRE_Int * max_iter ) { return ( hypre_SMGGetMaxIter( (void *) solver, max_iter ) ); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_StructSMGSetRelChange( HYPRE_StructSolver solver, HYPRE_Int rel_change ) { return ( hypre_SMGSetRelChange( (void *) solver, rel_change ) ); } HYPRE_Int HYPRE_StructSMGGetRelChange( HYPRE_StructSolver solver, HYPRE_Int * rel_change ) { return ( hypre_SMGGetRelChange( (void *) solver, rel_change ) ); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_StructSMGSetZeroGuess( HYPRE_StructSolver solver ) { return ( hypre_SMGSetZeroGuess( (void *) solver, 1 ) ); } HYPRE_Int HYPRE_StructSMGGetZeroGuess( HYPRE_StructSolver solver, HYPRE_Int * zeroguess ) { return ( hypre_SMGGetZeroGuess( (void *) solver, zeroguess ) ); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_StructSMGSetNonZeroGuess( HYPRE_StructSolver solver ) { return ( hypre_SMGSetZeroGuess( (void *) solver, 0 ) ); } /*-------------------------------------------------------------------------- * Note that we require at least 1 pre-relax sweep. *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_StructSMGSetNumPreRelax( HYPRE_StructSolver solver, HYPRE_Int num_pre_relax ) { return ( hypre_SMGSetNumPreRelax( (void *) solver, num_pre_relax) ); } HYPRE_Int HYPRE_StructSMGGetNumPreRelax( HYPRE_StructSolver solver, HYPRE_Int * num_pre_relax ) { return ( hypre_SMGGetNumPreRelax( (void *) solver, num_pre_relax) ); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_StructSMGSetNumPostRelax( HYPRE_StructSolver solver, HYPRE_Int num_post_relax ) { return ( hypre_SMGSetNumPostRelax( (void *) solver, num_post_relax) ); } HYPRE_Int HYPRE_StructSMGGetNumPostRelax( HYPRE_StructSolver solver, HYPRE_Int * num_post_relax ) { return ( hypre_SMGGetNumPostRelax( (void *) solver, num_post_relax) ); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_StructSMGSetLogging( HYPRE_StructSolver solver, HYPRE_Int logging ) { return ( hypre_SMGSetLogging( (void *) solver, logging) ); } HYPRE_Int HYPRE_StructSMGGetLogging( HYPRE_StructSolver solver, HYPRE_Int * logging ) { return ( hypre_SMGGetLogging( (void *) solver, logging) ); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_StructSMGSetPrintLevel( HYPRE_StructSolver solver, HYPRE_Int print_level ) { return ( hypre_SMGSetPrintLevel( (void *) solver, print_level) ); } HYPRE_Int HYPRE_StructSMGGetPrintLevel( HYPRE_StructSolver solver, HYPRE_Int * print_level ) { return ( hypre_SMGGetPrintLevel( (void *) solver, print_level) ); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_StructSMGGetNumIterations( HYPRE_StructSolver solver, HYPRE_Int *num_iterations ) { return ( hypre_SMGGetNumIterations( (void *) solver, num_iterations ) ); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_StructSMGGetFinalRelativeResidualNorm( HYPRE_StructSolver solver, HYPRE_Real *norm ) { return ( hypre_SMGGetFinalRelativeResidualNorm( (void *) solver, norm ) ); } #if 0 //defined(HYPRE_USING_CUDA) || defined(HYPRE_USING_HIP) HYPRE_Int HYPRE_StructSMGSetDeviceLevel( HYPRE_StructSolver solver, HYPRE_Int device_level ) { return (hypre_StructSMGSetDeviceLevel( (void *) solver, device_level )); } #endif hypre-2.33.0/src/struct_ls/HYPRE_struct_sparse_msg.c000066400000000000000000000207141477326011500224330ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * HYPRE_StructSparseMSG interface * *****************************************************************************/ #include "_hypre_struct_ls.h" /*-------------------------------------------------------------------------- * HYPRE_StructSparseMSGCreate *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_StructSparseMSGCreate( MPI_Comm comm, HYPRE_StructSolver *solver ) { *solver = ( (HYPRE_StructSolver) hypre_SparseMSGCreate( comm ) ); return 0; } /*-------------------------------------------------------------------------- * HYPRE_StructSparseMSGDestroy *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_StructSparseMSGDestroy( HYPRE_StructSolver solver ) { return ( hypre_SparseMSGDestroy( (void *) solver ) ); } /*-------------------------------------------------------------------------- * HYPRE_StructSparseMSGSetup *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_StructSparseMSGSetup( HYPRE_StructSolver solver, HYPRE_StructMatrix A, HYPRE_StructVector b, HYPRE_StructVector x ) { return ( hypre_SparseMSGSetup( (void *) solver, (hypre_StructMatrix *) A, (hypre_StructVector *) b, (hypre_StructVector *) x ) ); } /*-------------------------------------------------------------------------- * HYPRE_StructSparseMSGSolve *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_StructSparseMSGSolve( HYPRE_StructSolver solver, HYPRE_StructMatrix A, HYPRE_StructVector b, HYPRE_StructVector x ) { return ( hypre_SparseMSGSolve( (void *) solver, (hypre_StructMatrix *) A, (hypre_StructVector *) b, (hypre_StructVector *) x ) ); } /*-------------------------------------------------------------------------- * HYPRE_StructSparseMSGSetTol *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_StructSparseMSGSetTol( HYPRE_StructSolver solver, HYPRE_Real tol ) { return ( hypre_SparseMSGSetTol( (void *) solver, tol ) ); } /*-------------------------------------------------------------------------- * HYPRE_StructSparseMSGSetMaxIter *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_StructSparseMSGSetMaxIter( HYPRE_StructSolver solver, HYPRE_Int max_iter ) { return ( hypre_SparseMSGSetMaxIter( (void *) solver, max_iter ) ); } /*-------------------------------------------------------------------------- * HYPRE_StructSparseMSGSetJump *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_StructSparseMSGSetJump( HYPRE_StructSolver solver, HYPRE_Int jump ) { return ( hypre_SparseMSGSetJump( (void *) solver, jump ) ); } /*-------------------------------------------------------------------------- * HYPRE_StructSparseMSGSetRelChange *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_StructSparseMSGSetRelChange( HYPRE_StructSolver solver, HYPRE_Int rel_change ) { return ( hypre_SparseMSGSetRelChange( (void *) solver, rel_change ) ); } /*-------------------------------------------------------------------------- * HYPRE_StructSparseMSGSetZeroGuess *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_StructSparseMSGSetZeroGuess( HYPRE_StructSolver solver ) { return ( hypre_SparseMSGSetZeroGuess( (void *) solver, 1 ) ); } /*-------------------------------------------------------------------------- * HYPRE_StructSparseMSGSetNonZeroGuess *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_StructSparseMSGSetNonZeroGuess( HYPRE_StructSolver solver ) { return ( hypre_SparseMSGSetZeroGuess( (void *) solver, 0 ) ); } /*-------------------------------------------------------------------------- * HYPRE_StructSparseMSGSetRelaxType *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_StructSparseMSGSetRelaxType( HYPRE_StructSolver solver, HYPRE_Int relax_type ) { return ( hypre_SparseMSGSetRelaxType( (void *) solver, relax_type) ); } /*-------------------------------------------------------------------------- * HYPRE_StructSparseMSGSetJacobiWeight *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_StructSparseMSGSetJacobiWeight(HYPRE_StructSolver solver, HYPRE_Real weight) { return ( hypre_SparseMSGSetJacobiWeight( (void *) solver, weight) ); } /*-------------------------------------------------------------------------- * HYPRE_StructSparseMSGSetNumPreRelax *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_StructSparseMSGSetNumPreRelax( HYPRE_StructSolver solver, HYPRE_Int num_pre_relax ) { return ( hypre_SparseMSGSetNumPreRelax( (void *) solver, num_pre_relax) ); } /*-------------------------------------------------------------------------- * HYPRE_StructSparseMSGSetNumPostRelax *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_StructSparseMSGSetNumPostRelax( HYPRE_StructSolver solver, HYPRE_Int num_post_relax ) { return ( hypre_SparseMSGSetNumPostRelax( (void *) solver, num_post_relax) ); } /*-------------------------------------------------------------------------- * HYPRE_StructSparseMSGSetNumFineRelax *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_StructSparseMSGSetNumFineRelax( HYPRE_StructSolver solver, HYPRE_Int num_fine_relax ) { return ( hypre_SparseMSGSetNumFineRelax( (void *) solver, num_fine_relax) ); } /*-------------------------------------------------------------------------- * HYPRE_StructSparseMSGSetLogging *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_StructSparseMSGSetLogging( HYPRE_StructSolver solver, HYPRE_Int logging ) { return ( hypre_SparseMSGSetLogging( (void *) solver, logging) ); } /*-------------------------------------------------------------------------- * HYPRE_StructSparseMSGSetPrintLevel *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_StructSparseMSGSetPrintLevel( HYPRE_StructSolver solver, HYPRE_Int print_level ) { return ( hypre_SparseMSGSetPrintLevel( (void *) solver, print_level) ); } /*-------------------------------------------------------------------------- * HYPRE_StructSparseMSGGetNumIterations *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_StructSparseMSGGetNumIterations( HYPRE_StructSolver solver, HYPRE_Int *num_iterations ) { return ( hypre_SparseMSGGetNumIterations( (void *) solver, num_iterations ) ); } /*-------------------------------------------------------------------------- * HYPRE_StructSparseMSGGetFinalRelativeResidualNorm *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_StructSparseMSGGetFinalRelativeResidualNorm( HYPRE_StructSolver solver, HYPRE_Real *norm ) { return ( hypre_SparseMSGGetFinalRelativeResidualNorm( (void *) solver, norm ) ); } hypre-2.33.0/src/struct_ls/Makefile000066400000000000000000000061221477326011500172060ustar00rootroot00000000000000# Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) include ../config/Makefile.config CINCLUDES = ${INCLUDES} ${MPIINCLUDE} C_COMPILE_FLAGS = \ -I..\ -I$(srcdir)\ -I$(srcdir)/..\ -I$(srcdir)/../multivector\ -I$(srcdir)/../utilities\ -I$(srcdir)/../krylov\ -I$(srcdir)/../struct_mv\ ${CINCLUDES} HEADERS =\ HYPRE_struct_ls.h\ _hypre_struct_ls.h\ pfmg.h\ red_black_gs.h\ smg.h\ sparse_msg.h FILES =\ coarsen.c\ F90_HYPRE_struct_bicgstab.c\ F90_HYPRE_struct_cycred.c\ F90_HYPRE_struct_flexgmres.c\ F90_HYPRE_struct_gmres.c\ F90_HYPRE_struct_lgmres.c\ F90_HYPRE_struct_hybrid.c\ F90_HYPRE_struct_int.c\ F90_HYPRE_struct_jacobi.c\ F90_HYPRE_struct_pcg.c\ F90_HYPRE_struct_pfmg.c\ F90_HYPRE_struct_smg.c\ F90_HYPRE_struct_sparse_msg.c\ hybrid.c\ HYPRE_struct_bicgstab.c\ HYPRE_struct_cycred.c\ HYPRE_struct_flexgmres.c\ HYPRE_struct_gmres.c\ HYPRE_struct_hybrid.c\ HYPRE_struct_jacobi.c\ HYPRE_struct_lgmres.c\ HYPRE_struct_pfmg.c\ HYPRE_struct_smg.c\ HYPRE_struct_sparse_msg.c\ jacobi.c\ pcg_struct.c\ pfmg.c\ pfmg_relax.c\ pfmg_setup_rap.c\ pfmg_solve.c\ semi.c\ smg_relax.c\ smg_setup.c\ smg_setup_rap.c\ smg_setup_restrict.c\ smg_solve.c\ sparse_msg.c\ sparse_msg_setup.c\ sparse_msg_setup_rap.c\ sparse_msg_solve.c CUFILES =\ cyclic_reduction.c\ HYPRE_struct_int.c\ HYPRE_struct_pcg.c\ pfmg2_setup_rap.c\ pfmg3_setup_rap.c\ pfmg_setup.c\ pfmg_setup_interp.c\ pfmg_setup_rap5.c\ pfmg_setup_rap7.c\ point_relax.c\ red_black_constantcoef_gs.c\ red_black_gs.c\ semi_interp.c\ semi_restrict.c\ semi_setup_rap.c\ smg2_setup_rap.c\ smg3_setup_rap.c\ smg.c\ smg_axpy.c\ smg_residual.c\ smg_setup_interp.c\ sparse_msg2_setup_rap.c\ sparse_msg3_setup_rap.c\ sparse_msg_filter.c\ sparse_msg_interp.c\ sparse_msg_restrict.c COBJS = ${FILES:.c=.o} CUOBJS = ${CUFILES:.c=.obj} OBJS = ${COBJS} ${CUOBJS} SONAME = libHYPRE_struct_ls-${HYPRE_RELEASE_VERSION}${HYPRE_LIB_SUFFIX} ################################################################## # Targets ################################################################## all: libHYPRE_struct_ls${HYPRE_LIB_SUFFIX} cp -fR $(srcdir)/HYPRE_*.h $(HYPRE_BUILD_DIR)/include cp -fR $(srcdir)/_hypre_struct_ls.h $(HYPRE_BUILD_DIR)/include # cp -fR libHYPRE* $(HYPRE_BUILD_DIR)/lib install: libHYPRE_struct_ls${HYPRE_LIB_SUFFIX} cp -fR $(srcdir)/HYPRE_*.h $(HYPRE_INC_INSTALL) cp -fR $(srcdir)/_hypre_struct_ls.h $(HYPRE_INC_INSTALL) # cp -fR libHYPRE* $(HYPRE_LIB_INSTALL) clean: rm -f *.o *.obj libHYPRE* rm -rf pchdir tca.map *inslog* distclean: clean ################################################################## # Rules ################################################################## libHYPRE_struct_ls.a: ${OBJS} @echo "Building $@ ... " ${AR} $@ ${OBJS} ${RANLIB} $@ libHYPRE_struct_ls.so libHYPRE_struct_ls.dylib: ${OBJS} @echo "Building $@ ... " ${BUILD_CC_SHARED} -o ${SONAME} ${OBJS} ${SHARED_SET_SONAME}${SONAME} ln -s -f ${SONAME} $@ ${OBJS}: ${HEADERS} hypre-2.33.0/src/struct_ls/_hypre_struct_ls.h000066400000000000000000001412521477326011500213130ustar00rootroot00000000000000 /*** DO NOT EDIT THIS FILE DIRECTLY (use 'headers' to generate) ***/ #ifndef hypre_STRUCT_LS_HEADER #define hypre_STRUCT_LS_HEADER #include "_hypre_utilities.h" #include "HYPRE_struct_ls.h" #include "_hypre_struct_mv.h" #include "krylov.h" #include "temp_multivector.h" /* ... needed to make sense of functions in HYPRE_parcsr_int.c */ #include "HYPRE_MatvecFunctions.h" /* ... needed to make sense of functions in HYPRE_parcsr_int.c */ #ifdef __cplusplus extern "C" { #endif /****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /* coarsen.c */ HYPRE_Int hypre_StructMapFineToCoarse ( hypre_Index findex, hypre_Index index, hypre_Index stride, hypre_Index cindex ); HYPRE_Int hypre_StructMapCoarseToFine ( hypre_Index cindex, hypre_Index index, hypre_Index stride, hypre_Index findex ); HYPRE_Int hypre_StructCoarsen ( hypre_StructGrid *fgrid, hypre_Index index, hypre_Index stride, HYPRE_Int prune, hypre_StructGrid **cgrid_ptr ); /* cyclic_reduction.c */ void *hypre_CyclicReductionCreate ( MPI_Comm comm ); hypre_StructMatrix *hypre_CycRedCreateCoarseOp ( hypre_StructMatrix *A, hypre_StructGrid *coarse_grid, HYPRE_Int cdir ); HYPRE_Int hypre_CycRedSetupCoarseOp ( hypre_StructMatrix *A, hypre_StructMatrix *Ac, hypre_Index cindex, hypre_Index cstride, HYPRE_Int cdir ); HYPRE_Int hypre_CyclicReductionSetup ( void *cyc_red_vdata, hypre_StructMatrix *A, hypre_StructVector *b, hypre_StructVector *x ); HYPRE_Int hypre_CyclicReduction ( void *cyc_red_vdata, hypre_StructMatrix *A, hypre_StructVector *b, hypre_StructVector *x ); HYPRE_Int hypre_CyclicReductionSetCDir ( void *cyc_red_vdata, HYPRE_Int cdir ); HYPRE_Int hypre_CyclicReductionSetBase ( void *cyc_red_vdata, hypre_Index base_index, hypre_Index base_stride ); HYPRE_Int hypre_CyclicReductionDestroy ( void *cyc_red_vdata ); HYPRE_Int hypre_CyclicReductionSetMaxLevel( void *cyc_red_vdata, HYPRE_Int max_level ); /* general.c */ HYPRE_Int hypre_Log2 ( HYPRE_Int p ); /* hybrid.c */ void *hypre_HybridCreate ( MPI_Comm comm ); HYPRE_Int hypre_HybridDestroy ( void *hybrid_vdata ); HYPRE_Int hypre_HybridSetTol ( void *hybrid_vdata, HYPRE_Real tol ); HYPRE_Int hypre_HybridSetConvergenceTol ( void *hybrid_vdata, HYPRE_Real cf_tol ); HYPRE_Int hypre_HybridSetDSCGMaxIter ( void *hybrid_vdata, HYPRE_Int dscg_max_its ); HYPRE_Int hypre_HybridSetPCGMaxIter ( void *hybrid_vdata, HYPRE_Int pcg_max_its ); HYPRE_Int hypre_HybridSetPCGAbsoluteTolFactor ( void *hybrid_vdata, HYPRE_Real pcg_atolf ); HYPRE_Int hypre_HybridSetTwoNorm ( void *hybrid_vdata, HYPRE_Int two_norm ); HYPRE_Int hypre_HybridSetStopCrit ( void *hybrid_vdata, HYPRE_Int stop_crit ); HYPRE_Int hypre_HybridSetRelChange ( void *hybrid_vdata, HYPRE_Int rel_change ); HYPRE_Int hypre_HybridSetSolverType ( void *hybrid_vdata, HYPRE_Int solver_type ); HYPRE_Int hypre_HybridSetRecomputeResidual( void *hybrid_vdata, HYPRE_Int recompute_residual ); HYPRE_Int hypre_HybridGetRecomputeResidual( void *hybrid_vdata, HYPRE_Int *recompute_residual ); HYPRE_Int hypre_HybridSetRecomputeResidualP( void *hybrid_vdata, HYPRE_Int recompute_residual_p ); HYPRE_Int hypre_HybridGetRecomputeResidualP( void *hybrid_vdata, HYPRE_Int *recompute_residual_p ); HYPRE_Int hypre_HybridSetKDim ( void *hybrid_vdata, HYPRE_Int k_dim ); HYPRE_Int hypre_HybridSetPrecond ( void *pcg_vdata, HYPRE_Int (*pcg_precond_solve )(void*, void*, void*, void*), HYPRE_Int (*pcg_precond_setup )(void*, void*, void*, void*), void *pcg_precond ); HYPRE_Int hypre_HybridSetLogging ( void *hybrid_vdata, HYPRE_Int logging ); HYPRE_Int hypre_HybridSetPrintLevel ( void *hybrid_vdata, HYPRE_Int print_level ); HYPRE_Int hypre_HybridGetNumIterations ( void *hybrid_vdata, HYPRE_Int *num_its ); HYPRE_Int hypre_HybridGetDSCGNumIterations ( void *hybrid_vdata, HYPRE_Int *dscg_num_its ); HYPRE_Int hypre_HybridGetPCGNumIterations ( void *hybrid_vdata, HYPRE_Int *pcg_num_its ); HYPRE_Int hypre_HybridGetFinalRelativeResidualNorm ( void *hybrid_vdata, HYPRE_Real *final_rel_res_norm ); HYPRE_Int hypre_HybridSetup ( void *hybrid_vdata, hypre_StructMatrix *A, hypre_StructVector *b, hypre_StructVector *x ); HYPRE_Int hypre_HybridSolve ( void *hybrid_vdata, hypre_StructMatrix *A, hypre_StructVector *b, hypre_StructVector *x ); /* HYPRE_struct_int.c */ HYPRE_Int hypre_StructVectorSetRandomValues ( hypre_StructVector *vector, HYPRE_Int seed ); HYPRE_Int hypre_StructSetRandomValues ( void *v, HYPRE_Int seed ); /* HYPRE_struct_pfmg.c */ HYPRE_Int hypre_PFMGSetDeviceLevel( void *pfmg_vdata, HYPRE_Int device_level ); /* jacobi.c */ void *hypre_JacobiCreate ( MPI_Comm comm ); HYPRE_Int hypre_JacobiDestroy ( void *jacobi_vdata ); HYPRE_Int hypre_JacobiSetup ( void *jacobi_vdata, hypre_StructMatrix *A, hypre_StructVector *b, hypre_StructVector *x ); HYPRE_Int hypre_JacobiSolve ( void *jacobi_vdata, hypre_StructMatrix *A, hypre_StructVector *b, hypre_StructVector *x ); HYPRE_Int hypre_JacobiSetTol ( void *jacobi_vdata, HYPRE_Real tol ); HYPRE_Int hypre_JacobiGetTol ( void *jacobi_vdata, HYPRE_Real *tol ); HYPRE_Int hypre_JacobiSetMaxIter ( void *jacobi_vdata, HYPRE_Int max_iter ); HYPRE_Int hypre_JacobiGetMaxIter ( void *jacobi_vdata, HYPRE_Int *max_iter ); HYPRE_Int hypre_JacobiSetZeroGuess ( void *jacobi_vdata, HYPRE_Int zero_guess ); HYPRE_Int hypre_JacobiGetZeroGuess ( void *jacobi_vdata, HYPRE_Int *zero_guess ); HYPRE_Int hypre_JacobiGetNumIterations ( void *jacobi_vdata, HYPRE_Int *num_iterations ); HYPRE_Int hypre_JacobiSetTempVec ( void *jacobi_vdata, hypre_StructVector *t ); HYPRE_Int hypre_JacobiGetFinalRelativeResidualNorm ( void *jacobi_vdata, HYPRE_Real *norm ); /* pcg_struct.c */ void *hypre_StructKrylovCAlloc ( size_t count, size_t elt_size, HYPRE_MemoryLocation location ); HYPRE_Int hypre_StructKrylovFree ( void *ptr ); void *hypre_StructKrylovCreateVector ( void *vvector ); void *hypre_StructKrylovCreateVectorArray ( HYPRE_Int n, void *vvector ); HYPRE_Int hypre_StructKrylovDestroyVector ( void *vvector ); void *hypre_StructKrylovMatvecCreate ( void *A, void *x ); HYPRE_Int hypre_StructKrylovMatvec ( void *matvec_data, HYPRE_Complex alpha, void *A, void *x, HYPRE_Complex beta, void *y ); HYPRE_Int hypre_StructKrylovMatvecDestroy ( void *matvec_data ); HYPRE_Real hypre_StructKrylovInnerProd ( void *x, void *y ); HYPRE_Int hypre_StructKrylovCopyVector ( void *x, void *y ); HYPRE_Int hypre_StructKrylovClearVector ( void *x ); HYPRE_Int hypre_StructKrylovScaleVector ( HYPRE_Complex alpha, void *x ); HYPRE_Int hypre_StructKrylovAxpy ( HYPRE_Complex alpha, void *x, void *y ); HYPRE_Int hypre_StructKrylovIdentitySetup ( void *vdata, void *A, void *b, void *x ); HYPRE_Int hypre_StructKrylovIdentity ( void *vdata, void *A, void *b, void *x ); HYPRE_Int hypre_StructKrylovCommInfo ( void *A, HYPRE_Int *my_id, HYPRE_Int *num_procs ); /* pfmg2_setup_rap.c */ hypre_StructMatrix *hypre_PFMG2CreateRAPOp ( hypre_StructMatrix *R, hypre_StructMatrix *A, hypre_StructMatrix *P, hypre_StructGrid *coarse_grid, HYPRE_Int cdir ); HYPRE_Int hypre_PFMG2BuildRAPSym ( hypre_StructMatrix *A, hypre_StructMatrix *P, hypre_StructMatrix *R, HYPRE_Int cdir, hypre_Index cindex, hypre_Index cstride, hypre_StructMatrix *RAP ); HYPRE_Int hypre_PFMG2BuildRAPSym_onebox_FSS5_CC0 ( HYPRE_Int ci, HYPRE_Int fi, hypre_StructMatrix *A, hypre_StructMatrix *P, hypre_StructMatrix *R, HYPRE_Int cdir, hypre_Index cindex, hypre_Index cstride, hypre_StructMatrix *RAP ); HYPRE_Int hypre_PFMG2BuildRAPSym_onebox_FSS5_CC1 ( HYPRE_Int ci, HYPRE_Int fi, hypre_StructMatrix *A, hypre_StructMatrix *P, hypre_StructMatrix *R, HYPRE_Int cdir, hypre_Index cindex, hypre_Index cstride, hypre_StructMatrix *RAP ); HYPRE_Int hypre_PFMG2BuildRAPSym_onebox_FSS9_CC0 ( HYPRE_Int ci, HYPRE_Int fi, hypre_StructMatrix *A, hypre_StructMatrix *P, hypre_StructMatrix *R, HYPRE_Int cdir, hypre_Index cindex, hypre_Index cstride, hypre_StructMatrix *RAP ); HYPRE_Int hypre_PFMG2BuildRAPSym_onebox_FSS9_CC1 ( HYPRE_Int ci, HYPRE_Int fi, hypre_StructMatrix *A, hypre_StructMatrix *P, hypre_StructMatrix *R, HYPRE_Int cdir, hypre_Index cindex, hypre_Index cstride, hypre_StructMatrix *RAP ); HYPRE_Int hypre_PFMG2BuildRAPNoSym ( hypre_StructMatrix *A, hypre_StructMatrix *P, hypre_StructMatrix *R, HYPRE_Int cdir, hypre_Index cindex, hypre_Index cstride, hypre_StructMatrix *RAP ); HYPRE_Int hypre_PFMG2BuildRAPNoSym_onebox_FSS5_CC0 ( HYPRE_Int ci, HYPRE_Int fi, hypre_StructMatrix *A, hypre_StructMatrix *P, hypre_StructMatrix *R, HYPRE_Int cdir, hypre_Index cindex, hypre_Index cstride, hypre_StructMatrix *RAP ); HYPRE_Int hypre_PFMG2BuildRAPNoSym_onebox_FSS5_CC1 ( HYPRE_Int ci, HYPRE_Int fi, hypre_StructMatrix *A, hypre_StructMatrix *P, hypre_StructMatrix *R, HYPRE_Int cdir, hypre_Index cindex, hypre_Index cstride, hypre_StructMatrix *RAP ); HYPRE_Int hypre_PFMG2BuildRAPNoSym_onebox_FSS9_CC0 ( HYPRE_Int ci, HYPRE_Int fi, hypre_StructMatrix *A, hypre_StructMatrix *P, hypre_StructMatrix *R, HYPRE_Int cdir, hypre_Index cindex, hypre_Index cstride, hypre_StructMatrix *RAP ); HYPRE_Int hypre_PFMG2BuildRAPNoSym_onebox_FSS9_CC1 ( HYPRE_Int ci, HYPRE_Int fi, hypre_StructMatrix *A, hypre_StructMatrix *P, hypre_StructMatrix *R, HYPRE_Int cdir, hypre_Index cindex, hypre_Index cstride, hypre_StructMatrix *RAP ); /* pfmg3_setup_rap.c */ hypre_StructMatrix *hypre_PFMG3CreateRAPOp ( hypre_StructMatrix *R, hypre_StructMatrix *A, hypre_StructMatrix *P, hypre_StructGrid *coarse_grid, HYPRE_Int cdir ); HYPRE_Int hypre_PFMG3BuildRAPSym ( hypre_StructMatrix *A, hypre_StructMatrix *P, hypre_StructMatrix *R, HYPRE_Int cdir, hypre_Index cindex, hypre_Index cstride, hypre_StructMatrix *RAP ); HYPRE_Int hypre_PFMG3BuildRAPSym_onebox_FSS07_CC0 ( HYPRE_Int ci, HYPRE_Int fi, hypre_StructMatrix *A, hypre_StructMatrix *P, hypre_StructMatrix *R, HYPRE_Int cdir, hypre_Index cindex, hypre_Index cstride, hypre_StructMatrix *RAP ); HYPRE_Int hypre_PFMG3BuildRAPSym_onebox_FSS07_CC1 ( HYPRE_Int ci, HYPRE_Int fi, hypre_StructMatrix *A, hypre_StructMatrix *P, hypre_StructMatrix *R, HYPRE_Int cdir, hypre_Index cindex, hypre_Index cstride, hypre_StructMatrix *RAP ); HYPRE_Int hypre_PFMG3BuildRAPSym_onebox_FSS19_CC0 ( HYPRE_Int ci, HYPRE_Int fi, hypre_StructMatrix *A, hypre_StructMatrix *P, hypre_StructMatrix *R, HYPRE_Int cdir, hypre_Index cindex, hypre_Index cstride, hypre_StructMatrix *RAP ); HYPRE_Int hypre_PFMG3BuildRAPSym_onebox_FSS19_CC1 ( HYPRE_Int ci, HYPRE_Int fi, hypre_StructMatrix *A, hypre_StructMatrix *P, hypre_StructMatrix *R, HYPRE_Int cdir, hypre_Index cindex, hypre_Index cstride, hypre_StructMatrix *RAP ); HYPRE_Int hypre_PFMG3BuildRAPSym_onebox_FSS27_CC0 ( HYPRE_Int ci, HYPRE_Int fi, hypre_StructMatrix *A, hypre_StructMatrix *P, hypre_StructMatrix *R, HYPRE_Int cdir, hypre_Index cindex, hypre_Index cstride, hypre_StructMatrix *RAP ); HYPRE_Int hypre_PFMG3BuildRAPSym_onebox_FSS27_CC1 ( HYPRE_Int ci, HYPRE_Int fi, hypre_StructMatrix *A, hypre_StructMatrix *P, hypre_StructMatrix *R, HYPRE_Int cdir, hypre_Index cindex, hypre_Index cstride, hypre_StructMatrix *RAP ); HYPRE_Int hypre_PFMG3BuildRAPNoSym ( hypre_StructMatrix *A, hypre_StructMatrix *P, hypre_StructMatrix *R, HYPRE_Int cdir, hypre_Index cindex, hypre_Index cstride, hypre_StructMatrix *RAP ); HYPRE_Int hypre_PFMG3BuildRAPNoSym_onebox_FSS07_CC0 ( HYPRE_Int ci, HYPRE_Int fi, hypre_StructMatrix *A, hypre_StructMatrix *P, hypre_StructMatrix *R, HYPRE_Int cdir, hypre_Index cindex, hypre_Index cstride, hypre_StructMatrix *RAP ); HYPRE_Int hypre_PFMG3BuildRAPNoSym_onebox_FSS07_CC1 ( HYPRE_Int ci, HYPRE_Int fi, hypre_StructMatrix *A, hypre_StructMatrix *P, hypre_StructMatrix *R, HYPRE_Int cdir, hypre_Index cindex, hypre_Index cstride, hypre_StructMatrix *RAP ); HYPRE_Int hypre_PFMG3BuildRAPNoSym_onebox_FSS19_CC0 ( HYPRE_Int ci, HYPRE_Int fi, hypre_StructMatrix *A, hypre_StructMatrix *P, hypre_StructMatrix *R, HYPRE_Int cdir, hypre_Index cindex, hypre_Index cstride, hypre_StructMatrix *RAP ); HYPRE_Int hypre_PFMG3BuildRAPNoSym_onebox_FSS19_CC1 ( HYPRE_Int ci, HYPRE_Int fi, hypre_StructMatrix *A, hypre_StructMatrix *P, hypre_StructMatrix *R, HYPRE_Int cdir, hypre_Index cindex, hypre_Index cstride, hypre_StructMatrix *RAP ); HYPRE_Int hypre_PFMG3BuildRAPNoSym_onebox_FSS27_CC0 ( HYPRE_Int ci, HYPRE_Int fi, hypre_StructMatrix *A, hypre_StructMatrix *P, hypre_StructMatrix *R, HYPRE_Int cdir, hypre_Index cindex, hypre_Index cstride, hypre_StructMatrix *RAP ); HYPRE_Int hypre_PFMG3BuildRAPNoSym_onebox_FSS27_CC1 ( HYPRE_Int ci, HYPRE_Int fi, hypre_StructMatrix *A, hypre_StructMatrix *P, hypre_StructMatrix *R, HYPRE_Int cdir, hypre_Index cindex, hypre_Index cstride, hypre_StructMatrix *RAP ); /* pfmg.c */ void *hypre_PFMGCreate ( MPI_Comm comm ); HYPRE_Int hypre_PFMGDestroy ( void *pfmg_vdata ); HYPRE_Int hypre_PFMGSetTol ( void *pfmg_vdata, HYPRE_Real tol ); HYPRE_Int hypre_PFMGGetTol ( void *pfmg_vdata, HYPRE_Real *tol ); HYPRE_Int hypre_PFMGSetMaxIter ( void *pfmg_vdata, HYPRE_Int max_iter ); HYPRE_Int hypre_PFMGGetMaxIter ( void *pfmg_vdata, HYPRE_Int *max_iter ); HYPRE_Int hypre_PFMGSetMaxLevels ( void *pfmg_vdata, HYPRE_Int max_levels ); HYPRE_Int hypre_PFMGGetMaxLevels ( void *pfmg_vdata, HYPRE_Int *max_levels ); HYPRE_Int hypre_PFMGSetRelChange ( void *pfmg_vdata, HYPRE_Int rel_change ); HYPRE_Int hypre_PFMGGetRelChange ( void *pfmg_vdata, HYPRE_Int *rel_change ); HYPRE_Int hypre_PFMGSetZeroGuess ( void *pfmg_vdata, HYPRE_Int zero_guess ); HYPRE_Int hypre_PFMGGetZeroGuess ( void *pfmg_vdata, HYPRE_Int *zero_guess ); HYPRE_Int hypre_PFMGSetRelaxType ( void *pfmg_vdata, HYPRE_Int relax_type ); HYPRE_Int hypre_PFMGGetRelaxType ( void *pfmg_vdata, HYPRE_Int *relax_type ); HYPRE_Int hypre_PFMGSetJacobiWeight ( void *pfmg_vdata, HYPRE_Real weight ); HYPRE_Int hypre_PFMGGetJacobiWeight ( void *pfmg_vdata, HYPRE_Real *weight ); HYPRE_Int hypre_PFMGSetRAPType ( void *pfmg_vdata, HYPRE_Int rap_type ); HYPRE_Int hypre_PFMGGetRAPType ( void *pfmg_vdata, HYPRE_Int *rap_type ); HYPRE_Int hypre_PFMGSetNumPreRelax ( void *pfmg_vdata, HYPRE_Int num_pre_relax ); HYPRE_Int hypre_PFMGGetNumPreRelax ( void *pfmg_vdata, HYPRE_Int *num_pre_relax ); HYPRE_Int hypre_PFMGSetNumPostRelax ( void *pfmg_vdata, HYPRE_Int num_post_relax ); HYPRE_Int hypre_PFMGGetNumPostRelax ( void *pfmg_vdata, HYPRE_Int *num_post_relax ); HYPRE_Int hypre_PFMGSetSkipRelax ( void *pfmg_vdata, HYPRE_Int skip_relax ); HYPRE_Int hypre_PFMGGetSkipRelax ( void *pfmg_vdata, HYPRE_Int *skip_relax ); HYPRE_Int hypre_PFMGSetDxyz ( void *pfmg_vdata, HYPRE_Real *dxyz ); HYPRE_Int hypre_PFMGSetLogging ( void *pfmg_vdata, HYPRE_Int logging ); HYPRE_Int hypre_PFMGGetLogging ( void *pfmg_vdata, HYPRE_Int *logging ); HYPRE_Int hypre_PFMGSetPrintLevel ( void *pfmg_vdata, HYPRE_Int print_level ); HYPRE_Int hypre_PFMGGetPrintLevel ( void *pfmg_vdata, HYPRE_Int *print_level ); HYPRE_Int hypre_PFMGGetNumIterations ( void *pfmg_vdata, HYPRE_Int *num_iterations ); HYPRE_Int hypre_PFMGPrintLogging ( void *pfmg_vdata, HYPRE_Int myid ); HYPRE_Int hypre_PFMGGetFinalRelativeResidualNorm ( void *pfmg_vdata, HYPRE_Real *relative_residual_norm ); /* pfmg_relax.c */ void *hypre_PFMGRelaxCreate ( MPI_Comm comm ); HYPRE_Int hypre_PFMGRelaxDestroy ( void *pfmg_relax_vdata ); HYPRE_Int hypre_PFMGRelax ( void *pfmg_relax_vdata, hypre_StructMatrix *A, hypre_StructVector *b, hypre_StructVector *x ); HYPRE_Int hypre_PFMGRelaxSetup ( void *pfmg_relax_vdata, hypre_StructMatrix *A, hypre_StructVector *b, hypre_StructVector *x ); HYPRE_Int hypre_PFMGRelaxSetType ( void *pfmg_relax_vdata, HYPRE_Int relax_type ); HYPRE_Int hypre_PFMGRelaxSetJacobiWeight ( void *pfmg_relax_vdata, HYPRE_Real weight ); HYPRE_Int hypre_PFMGRelaxSetPreRelax ( void *pfmg_relax_vdata ); HYPRE_Int hypre_PFMGRelaxSetPostRelax ( void *pfmg_relax_vdata ); HYPRE_Int hypre_PFMGRelaxSetTol ( void *pfmg_relax_vdata, HYPRE_Real tol ); HYPRE_Int hypre_PFMGRelaxSetMaxIter ( void *pfmg_relax_vdata, HYPRE_Int max_iter ); HYPRE_Int hypre_PFMGRelaxSetZeroGuess ( void *pfmg_relax_vdata, HYPRE_Int zero_guess ); HYPRE_Int hypre_PFMGRelaxSetTempVec ( void *pfmg_relax_vdata, hypre_StructVector *t ); /* pfmg_setup.c */ HYPRE_Int hypre_PFMGSetup ( void *pfmg_vdata, hypre_StructMatrix *A, hypre_StructVector *b, hypre_StructVector *x ); HYPRE_Int hypre_PFMGComputeDxyz ( hypre_StructMatrix *A, HYPRE_Real *dxyz, HYPRE_Real *mean, HYPRE_Real *deviation); HYPRE_Int hypre_PFMGComputeDxyz_CS ( HYPRE_Int bi, hypre_StructMatrix *A, HYPRE_Real *cxyz, HYPRE_Real *sqcxyz); HYPRE_Int hypre_PFMGComputeDxyz_SS5 ( HYPRE_Int bi, hypre_StructMatrix *A, HYPRE_Real *cxyz, HYPRE_Real *sqcxyz); HYPRE_Int hypre_PFMGComputeDxyz_SS9 ( HYPRE_Int bi, hypre_StructMatrix *A, HYPRE_Real *cxyz, HYPRE_Real *sqcxyz); HYPRE_Int hypre_PFMGComputeDxyz_SS7 ( HYPRE_Int bi, hypre_StructMatrix *A, HYPRE_Real *cxyz, HYPRE_Real *sqcxyz); HYPRE_Int hypre_PFMGComputeDxyz_SS19( HYPRE_Int bi, hypre_StructMatrix *A, HYPRE_Real *cxyz, HYPRE_Real *sqcxyz); HYPRE_Int hypre_PFMGComputeDxyz_SS27( HYPRE_Int bi, hypre_StructMatrix *A, HYPRE_Real *cxyz, HYPRE_Real *sqcxyz); HYPRE_Int hypre_ZeroDiagonal ( hypre_StructMatrix *A ); /* pfmg_setup_interp.c */ hypre_StructMatrix *hypre_PFMGCreateInterpOp ( hypre_StructMatrix *A, hypre_StructGrid *cgrid, HYPRE_Int cdir, HYPRE_Int rap_type ); HYPRE_Int hypre_PFMGSetupInterpOp ( hypre_StructMatrix *A, HYPRE_Int cdir, hypre_Index findex, hypre_Index stride, hypre_StructMatrix *P, HYPRE_Int rap_type ); HYPRE_Int hypre_PFMGSetupInterpOp_CC0 ( HYPRE_Int i, hypre_StructMatrix *A, hypre_Box *A_dbox, HYPRE_Int cdir, hypre_Index stride, hypre_Index stridec, hypre_Index start, hypre_IndexRef startc, hypre_Index loop_size, hypre_Box *P_dbox, HYPRE_Int Pstenc0, HYPRE_Int Pstenc1, HYPRE_Real *Pp0, HYPRE_Real *Pp1, HYPRE_Int rap_type, HYPRE_Int si0, HYPRE_Int si1 ); HYPRE_Int hypre_PFMGSetupInterpOp_CC1 ( HYPRE_Int i, hypre_StructMatrix *A, hypre_Box *A_dbox, HYPRE_Int cdir, hypre_Index stride, hypre_Index stridec, hypre_Index start, hypre_IndexRef startc, hypre_Index loop_size, hypre_Box *P_dbox, HYPRE_Int Pstenc0, HYPRE_Int Pstenc1, HYPRE_Real *Pp0, HYPRE_Real *Pp1, HYPRE_Int rap_type, HYPRE_Int si0, HYPRE_Int si1 ); HYPRE_Int hypre_PFMGSetupInterpOp_CC2 ( HYPRE_Int i, hypre_StructMatrix *A, hypre_Box *A_dbox, HYPRE_Int cdir, hypre_Index stride, hypre_Index stridec, hypre_Index start, hypre_IndexRef startc, hypre_Index loop_size, hypre_Box *P_dbox, HYPRE_Int Pstenc0, HYPRE_Int Pstenc1, HYPRE_Real *Pp0, HYPRE_Real *Pp1, HYPRE_Int rap_type, HYPRE_Int si0, HYPRE_Int si1 ); HYPRE_Int hypre_PFMGSetupInterpOp_CC0_SS5 ( HYPRE_Int i, hypre_StructMatrix *A, hypre_Box *A_dbox, HYPRE_Int cdir, hypre_Index stride, hypre_Index stridec, hypre_Index start, hypre_IndexRef startc, hypre_Index loop_size, hypre_Box *P_dbox, HYPRE_Int Pstenc0, HYPRE_Int Pstenc1, HYPRE_Real *Pp0, HYPRE_Real *Pp1, HYPRE_Int rap_type, hypre_Index *P_stencil_shape ); HYPRE_Int hypre_PFMGSetupInterpOp_CC0_SS9 ( HYPRE_Int i, hypre_StructMatrix *A, hypre_Box *A_dbox, HYPRE_Int cdir, hypre_Index stride, hypre_Index stridec, hypre_Index start, hypre_IndexRef startc, hypre_Index loop_size, hypre_Box *P_dbox, HYPRE_Int Pstenc0, HYPRE_Int Pstenc1, HYPRE_Real *Pp0, HYPRE_Real *Pp1, HYPRE_Int rap_type, hypre_Index *P_stencil_shape ); HYPRE_Int hypre_PFMGSetupInterpOp_CC0_SS7 ( HYPRE_Int i, hypre_StructMatrix *A, hypre_Box *A_dbox, HYPRE_Int cdir, hypre_Index stride, hypre_Index stridec, hypre_Index start, hypre_IndexRef startc, hypre_Index loop_size, hypre_Box *P_dbox, HYPRE_Int Pstenc0, HYPRE_Int Pstenc1, HYPRE_Real *Pp0, HYPRE_Real *Pp1, HYPRE_Int rap_type, hypre_Index *P_stencil_shape ); HYPRE_Int hypre_PFMGSetupInterpOp_CC0_SS15 ( HYPRE_Int i, hypre_StructMatrix *A, hypre_Box *A_dbox, HYPRE_Int cdir, hypre_Index stride, hypre_Index stridec, hypre_Index start, hypre_IndexRef startc, hypre_Index loop_size, hypre_Box *P_dbox, HYPRE_Int Pstenc0, HYPRE_Int Pstenc1, HYPRE_Real *Pp0, HYPRE_Real *Pp1, HYPRE_Int rap_type, hypre_Index *P_stencil_shape ); HYPRE_Int hypre_PFMGSetupInterpOp_CC0_SS19 ( HYPRE_Int i, hypre_StructMatrix *A, hypre_Box *A_dbox, HYPRE_Int cdir, hypre_Index stride, hypre_Index stridec, hypre_Index start, hypre_IndexRef startc, hypre_Index loop_size, hypre_Box *P_dbox, HYPRE_Int Pstenc0, HYPRE_Int Pstenc1, HYPRE_Real *Pp0, HYPRE_Real *Pp1, HYPRE_Int rap_type, hypre_Index *P_stencil_shape ); HYPRE_Int hypre_PFMGSetupInterpOp_CC0_SS27 ( HYPRE_Int i, hypre_StructMatrix *A, hypre_Box *A_dbox, HYPRE_Int cdir, hypre_Index stride, hypre_Index stridec, hypre_Index start, hypre_IndexRef startc, hypre_Index loop_size, hypre_Box *P_dbox, HYPRE_Int Pstenc0, HYPRE_Int Pstenc1, HYPRE_Real *Pp0, HYPRE_Real *Pp1, HYPRE_Int rap_type, hypre_Index *P_stencil_shape ); /* pfmg_setup_rap5.c */ hypre_StructMatrix *hypre_PFMGCreateCoarseOp5 ( hypre_StructMatrix *R, hypre_StructMatrix *A, hypre_StructMatrix *P, hypre_StructGrid *coarse_grid, HYPRE_Int cdir ); HYPRE_Int hypre_PFMGBuildCoarseOp5 ( hypre_StructMatrix *A, hypre_StructMatrix *P, hypre_StructMatrix *R, HYPRE_Int cdir, hypre_Index cindex, hypre_Index cstride, hypre_StructMatrix *RAP ); HYPRE_Int hypre_PFMGBuildCoarseOp5_onebox_CC0 ( HYPRE_Int fi, HYPRE_Int ci, hypre_StructMatrix *A, hypre_StructMatrix *P, hypre_StructMatrix *R, HYPRE_Int cdir, hypre_Index cindex, hypre_Index cstride, hypre_StructMatrix *RAP ); HYPRE_Int hypre_PFMGBuildCoarseOp5_onebox_CC1 ( HYPRE_Int fi, HYPRE_Int ci, hypre_StructMatrix *A, hypre_StructMatrix *P, hypre_StructMatrix *R, HYPRE_Int cdir, hypre_Index cindex, hypre_Index cstride, hypre_StructMatrix *RAP ); HYPRE_Int hypre_PFMGBuildCoarseOp5_onebox_CC2 ( HYPRE_Int fi, HYPRE_Int ci, hypre_StructMatrix *A, hypre_StructMatrix *P, hypre_StructMatrix *R, HYPRE_Int cdir, hypre_Index cindex, hypre_Index cstride, hypre_StructMatrix *RAP ); /* pfmg_setup_rap7.c */ hypre_StructMatrix *hypre_PFMGCreateCoarseOp7 ( hypre_StructMatrix *R, hypre_StructMatrix *A, hypre_StructMatrix *P, hypre_StructGrid *coarse_grid, HYPRE_Int cdir ); HYPRE_Int hypre_PFMGBuildCoarseOp7 ( hypre_StructMatrix *A, hypre_StructMatrix *P, hypre_StructMatrix *R, HYPRE_Int cdir, hypre_Index cindex, hypre_Index cstride, hypre_StructMatrix *RAP ); /* pfmg_setup_rap.c */ hypre_StructMatrix *hypre_PFMGCreateRAPOp ( hypre_StructMatrix *R, hypre_StructMatrix *A, hypre_StructMatrix *P, hypre_StructGrid *coarse_grid, HYPRE_Int cdir, HYPRE_Int rap_type ); HYPRE_Int hypre_PFMGSetupRAPOp ( hypre_StructMatrix *R, hypre_StructMatrix *A, hypre_StructMatrix *P, HYPRE_Int cdir, hypre_Index cindex, hypre_Index cstride, HYPRE_Int rap_type, hypre_StructMatrix *Ac ); /* pfmg_solve.c */ HYPRE_Int hypre_PFMGSolve ( void *pfmg_vdata, hypre_StructMatrix *A, hypre_StructVector *b, hypre_StructVector *x ); /* point_relax.c */ void *hypre_PointRelaxCreate ( MPI_Comm comm ); HYPRE_Int hypre_PointRelaxDestroy ( void *relax_vdata ); HYPRE_Int hypre_PointRelaxSetup ( void *relax_vdata, hypre_StructMatrix *A, hypre_StructVector *b, hypre_StructVector *x ); HYPRE_Int hypre_PointRelax ( void *relax_vdata, hypre_StructMatrix *A, hypre_StructVector *b, hypre_StructVector *x ); HYPRE_Int hypre_PointRelax_core0 ( void *relax_vdata, hypre_StructMatrix *A, HYPRE_Int constant_coefficient, hypre_Box *compute_box, HYPRE_Real *bp, HYPRE_Real *xp, HYPRE_Real *tp, HYPRE_Int boxarray_id, hypre_Box *A_data_box, hypre_Box *b_data_box, hypre_Box *x_data_box, hypre_Box *t_data_box, hypre_IndexRef stride ); HYPRE_Int hypre_PointRelax_core12 ( void *relax_vdata, hypre_StructMatrix *A, HYPRE_Int constant_coefficient, hypre_Box *compute_box, HYPRE_Real *bp, HYPRE_Real *xp, HYPRE_Real *tp, HYPRE_Int boxarray_id, hypre_Box *A_data_box, hypre_Box *b_data_box, hypre_Box *x_data_box, hypre_Box *t_data_box, hypre_IndexRef stride ); HYPRE_Int hypre_PointRelaxSetTol ( void *relax_vdata, HYPRE_Real tol ); HYPRE_Int hypre_PointRelaxGetTol ( void *relax_vdata, HYPRE_Real *tol ); HYPRE_Int hypre_PointRelaxSetMaxIter ( void *relax_vdata, HYPRE_Int max_iter ); HYPRE_Int hypre_PointRelaxGetMaxIter ( void *relax_vdata, HYPRE_Int *max_iter ); HYPRE_Int hypre_PointRelaxSetZeroGuess ( void *relax_vdata, HYPRE_Int zero_guess ); HYPRE_Int hypre_PointRelaxGetZeroGuess ( void *relax_vdata, HYPRE_Int *zero_guess ); HYPRE_Int hypre_PointRelaxGetNumIterations ( void *relax_vdata, HYPRE_Int *num_iterations ); HYPRE_Int hypre_PointRelaxSetWeight ( void *relax_vdata, HYPRE_Real weight ); HYPRE_Int hypre_PointRelaxSetNumPointsets ( void *relax_vdata, HYPRE_Int num_pointsets ); HYPRE_Int hypre_PointRelaxSetPointset ( void *relax_vdata, HYPRE_Int pointset, HYPRE_Int pointset_size, hypre_Index pointset_stride, hypre_Index *pointset_indices ); HYPRE_Int hypre_PointRelaxSetPointsetRank ( void *relax_vdata, HYPRE_Int pointset, HYPRE_Int pointset_rank ); HYPRE_Int hypre_PointRelaxSetTempVec ( void *relax_vdata, hypre_StructVector *t ); HYPRE_Int hypre_PointRelaxGetFinalRelativeResidualNorm ( void *relax_vdata, HYPRE_Real *norm ); HYPRE_Int hypre_relax_wtx ( void *relax_vdata, HYPRE_Int pointset, hypre_StructVector *t, hypre_StructVector *x ); HYPRE_Int hypre_relax_copy ( void *relax_vdata, HYPRE_Int pointset, hypre_StructVector *t, hypre_StructVector *x ); /* red_black_constantcoef_gs.c */ HYPRE_Int hypre_RedBlackConstantCoefGS ( void *relax_vdata, hypre_StructMatrix *A, hypre_StructVector *b, hypre_StructVector *x ); /* red_black_gs.c */ void *hypre_RedBlackGSCreate ( MPI_Comm comm ); HYPRE_Int hypre_RedBlackGSDestroy ( void *relax_vdata ); HYPRE_Int hypre_RedBlackGSSetup ( void *relax_vdata, hypre_StructMatrix *A, hypre_StructVector *b, hypre_StructVector *x ); HYPRE_Int hypre_RedBlackGS ( void *relax_vdata, hypre_StructMatrix *A, hypre_StructVector *b, hypre_StructVector *x ); HYPRE_Int hypre_RedBlackGSSetTol ( void *relax_vdata, HYPRE_Real tol ); HYPRE_Int hypre_RedBlackGSSetMaxIter ( void *relax_vdata, HYPRE_Int max_iter ); HYPRE_Int hypre_RedBlackGSSetZeroGuess ( void *relax_vdata, HYPRE_Int zero_guess ); HYPRE_Int hypre_RedBlackGSSetStartRed ( void *relax_vdata ); HYPRE_Int hypre_RedBlackGSSetStartBlack ( void *relax_vdata ); /* semi.c */ HYPRE_Int hypre_StructInterpAssemble ( hypre_StructMatrix *A, hypre_StructMatrix *P, HYPRE_Int P_stored_as_transpose, HYPRE_Int cdir, hypre_Index index, hypre_Index stride ); /* semi_interp.c */ void *hypre_SemiInterpCreate ( void ); HYPRE_Int hypre_SemiInterpSetup ( void *interp_vdata, hypre_StructMatrix *P, HYPRE_Int P_stored_as_transpose, hypre_StructVector *xc, hypre_StructVector *e, hypre_Index cindex, hypre_Index findex, hypre_Index stride ); HYPRE_Int hypre_SemiInterp ( void *interp_vdata, hypre_StructMatrix *P, hypre_StructVector *xc, hypre_StructVector *e ); HYPRE_Int hypre_SemiInterpDestroy ( void *interp_vdata ); /* semi_restrict.c */ void *hypre_SemiRestrictCreate ( void ); HYPRE_Int hypre_SemiRestrictSetup ( void *restrict_vdata, hypre_StructMatrix *R, HYPRE_Int R_stored_as_transpose, hypre_StructVector *r, hypre_StructVector *rc, hypre_Index cindex, hypre_Index findex, hypre_Index stride ); HYPRE_Int hypre_SemiRestrict ( void *restrict_vdata, hypre_StructMatrix *R, hypre_StructVector *r, hypre_StructVector *rc ); HYPRE_Int hypre_SemiRestrictDestroy ( void *restrict_vdata ); /* semi_setup_rap.c */ hypre_StructMatrix *hypre_SemiCreateRAPOp ( hypre_StructMatrix *R, hypre_StructMatrix *A, hypre_StructMatrix *P, hypre_StructGrid *coarse_grid, HYPRE_Int cdir, HYPRE_Int P_stored_as_transpose ); HYPRE_Int hypre_SemiBuildRAP ( hypre_StructMatrix *A, hypre_StructMatrix *P, hypre_StructMatrix *R, HYPRE_Int cdir, hypre_Index cindex, hypre_Index cstride, HYPRE_Int P_stored_as_transpose, hypre_StructMatrix *RAP ); /* smg2_setup_rap.c */ hypre_StructMatrix *hypre_SMG2CreateRAPOp ( hypre_StructMatrix *R, hypre_StructMatrix *A, hypre_StructMatrix *PT, hypre_StructGrid *coarse_grid ); HYPRE_Int hypre_SMG2BuildRAPSym ( hypre_StructMatrix *A, hypre_StructMatrix *PT, hypre_StructMatrix *R, hypre_StructMatrix *RAP, hypre_Index cindex, hypre_Index cstride ); HYPRE_Int hypre_SMG2BuildRAPNoSym ( hypre_StructMatrix *A, hypre_StructMatrix *PT, hypre_StructMatrix *R, hypre_StructMatrix *RAP, hypre_Index cindex, hypre_Index cstride ); HYPRE_Int hypre_SMG2RAPPeriodicSym ( hypre_StructMatrix *RAP, hypre_Index cindex, hypre_Index cstride ); HYPRE_Int hypre_SMG2RAPPeriodicNoSym ( hypre_StructMatrix *RAP, hypre_Index cindex, hypre_Index cstride ); /* smg3_setup_rap.c */ hypre_StructMatrix *hypre_SMG3CreateRAPOp ( hypre_StructMatrix *R, hypre_StructMatrix *A, hypre_StructMatrix *PT, hypre_StructGrid *coarse_grid ); HYPRE_Int hypre_SMG3BuildRAPSym ( hypre_StructMatrix *A, hypre_StructMatrix *PT, hypre_StructMatrix *R, hypre_StructMatrix *RAP, hypre_Index cindex, hypre_Index cstride ); HYPRE_Int hypre_SMG3BuildRAPNoSym ( hypre_StructMatrix *A, hypre_StructMatrix *PT, hypre_StructMatrix *R, hypre_StructMatrix *RAP, hypre_Index cindex, hypre_Index cstride ); HYPRE_Int hypre_SMG3RAPPeriodicSym ( hypre_StructMatrix *RAP, hypre_Index cindex, hypre_Index cstride ); HYPRE_Int hypre_SMG3RAPPeriodicNoSym ( hypre_StructMatrix *RAP, hypre_Index cindex, hypre_Index cstride ); /* smg_axpy.c */ HYPRE_Int hypre_SMGAxpy ( HYPRE_Real alpha, hypre_StructVector *x, hypre_StructVector *y, hypre_Index base_index, hypre_Index base_stride ); /* smg.c */ void *hypre_SMGCreate ( MPI_Comm comm ); HYPRE_Int hypre_SMGDestroy ( void *smg_vdata ); HYPRE_Int hypre_SMGSetMemoryUse ( void *smg_vdata, HYPRE_Int memory_use ); HYPRE_Int hypre_SMGGetMemoryUse ( void *smg_vdata, HYPRE_Int *memory_use ); HYPRE_Int hypre_SMGSetTol ( void *smg_vdata, HYPRE_Real tol ); HYPRE_Int hypre_SMGGetTol ( void *smg_vdata, HYPRE_Real *tol ); HYPRE_Int hypre_SMGSetMaxIter ( void *smg_vdata, HYPRE_Int max_iter ); HYPRE_Int hypre_SMGGetMaxIter ( void *smg_vdata, HYPRE_Int *max_iter ); HYPRE_Int hypre_SMGSetRelChange ( void *smg_vdata, HYPRE_Int rel_change ); HYPRE_Int hypre_SMGGetRelChange ( void *smg_vdata, HYPRE_Int *rel_change ); HYPRE_Int hypre_SMGSetZeroGuess ( void *smg_vdata, HYPRE_Int zero_guess ); HYPRE_Int hypre_SMGGetZeroGuess ( void *smg_vdata, HYPRE_Int *zero_guess ); HYPRE_Int hypre_SMGSetNumPreRelax ( void *smg_vdata, HYPRE_Int num_pre_relax ); HYPRE_Int hypre_SMGGetNumPreRelax ( void *smg_vdata, HYPRE_Int *num_pre_relax ); HYPRE_Int hypre_SMGSetNumPostRelax ( void *smg_vdata, HYPRE_Int num_post_relax ); HYPRE_Int hypre_SMGGetNumPostRelax ( void *smg_vdata, HYPRE_Int *num_post_relax ); HYPRE_Int hypre_SMGSetBase ( void *smg_vdata, hypre_Index base_index, hypre_Index base_stride ); HYPRE_Int hypre_SMGSetLogging ( void *smg_vdata, HYPRE_Int logging ); HYPRE_Int hypre_SMGGetLogging ( void *smg_vdata, HYPRE_Int *logging ); HYPRE_Int hypre_SMGSetPrintLevel ( void *smg_vdata, HYPRE_Int print_level ); HYPRE_Int hypre_SMGGetPrintLevel ( void *smg_vdata, HYPRE_Int *print_level ); HYPRE_Int hypre_SMGGetNumIterations ( void *smg_vdata, HYPRE_Int *num_iterations ); HYPRE_Int hypre_SMGPrintLogging ( void *smg_vdata, HYPRE_Int myid ); HYPRE_Int hypre_SMGGetFinalRelativeResidualNorm ( void *smg_vdata, HYPRE_Real *relative_residual_norm ); HYPRE_Int hypre_SMGSetStructVectorConstantValues ( hypre_StructVector *vector, HYPRE_Real values, hypre_BoxArray *box_array, hypre_Index stride ); HYPRE_Int hypre_StructSMGSetMaxLevel( void *smg_vdata, HYPRE_Int max_level ); /* smg_relax.c */ void *hypre_SMGRelaxCreate ( MPI_Comm comm ); HYPRE_Int hypre_SMGRelaxDestroyTempVec ( void *relax_vdata ); HYPRE_Int hypre_SMGRelaxDestroyARem ( void *relax_vdata ); HYPRE_Int hypre_SMGRelaxDestroyASol ( void *relax_vdata ); HYPRE_Int hypre_SMGRelaxDestroy ( void *relax_vdata ); HYPRE_Int hypre_SMGRelax ( void *relax_vdata, hypre_StructMatrix *A, hypre_StructVector *b, hypre_StructVector *x ); HYPRE_Int hypre_SMGRelaxSetup ( void *relax_vdata, hypre_StructMatrix *A, hypre_StructVector *b, hypre_StructVector *x ); HYPRE_Int hypre_SMGRelaxSetupTempVec ( void *relax_vdata, hypre_StructMatrix *A, hypre_StructVector *b, hypre_StructVector *x ); HYPRE_Int hypre_SMGRelaxSetupARem ( void *relax_vdata, hypre_StructMatrix *A, hypre_StructVector *b, hypre_StructVector *x ); HYPRE_Int hypre_SMGRelaxSetupASol ( void *relax_vdata, hypre_StructMatrix *A, hypre_StructVector *b, hypre_StructVector *x ); HYPRE_Int hypre_SMGRelaxSetTempVec ( void *relax_vdata, hypre_StructVector *temp_vec ); HYPRE_Int hypre_SMGRelaxSetMemoryUse ( void *relax_vdata, HYPRE_Int memory_use ); HYPRE_Int hypre_SMGRelaxSetTol ( void *relax_vdata, HYPRE_Real tol ); HYPRE_Int hypre_SMGRelaxSetMaxIter ( void *relax_vdata, HYPRE_Int max_iter ); HYPRE_Int hypre_SMGRelaxSetZeroGuess ( void *relax_vdata, HYPRE_Int zero_guess ); HYPRE_Int hypre_SMGRelaxSetNumSpaces ( void *relax_vdata, HYPRE_Int num_spaces ); HYPRE_Int hypre_SMGRelaxSetNumPreSpaces ( void *relax_vdata, HYPRE_Int num_pre_spaces ); HYPRE_Int hypre_SMGRelaxSetNumRegSpaces ( void *relax_vdata, HYPRE_Int num_reg_spaces ); HYPRE_Int hypre_SMGRelaxSetSpace ( void *relax_vdata, HYPRE_Int i, HYPRE_Int space_index, HYPRE_Int space_stride ); HYPRE_Int hypre_SMGRelaxSetRegSpaceRank ( void *relax_vdata, HYPRE_Int i, HYPRE_Int reg_space_rank ); HYPRE_Int hypre_SMGRelaxSetPreSpaceRank ( void *relax_vdata, HYPRE_Int i, HYPRE_Int pre_space_rank ); HYPRE_Int hypre_SMGRelaxSetBase ( void *relax_vdata, hypre_Index base_index, hypre_Index base_stride ); HYPRE_Int hypre_SMGRelaxSetNumPreRelax ( void *relax_vdata, HYPRE_Int num_pre_relax ); HYPRE_Int hypre_SMGRelaxSetNumPostRelax ( void *relax_vdata, HYPRE_Int num_post_relax ); HYPRE_Int hypre_SMGRelaxSetNewMatrixStencil ( void *relax_vdata, hypre_StructStencil *diff_stencil ); HYPRE_Int hypre_SMGRelaxSetupBaseBoxArray ( void *relax_vdata, hypre_StructMatrix *A, hypre_StructVector *b, hypre_StructVector *x ); HYPRE_Int hypre_SMGRelaxSetMaxLevel( void *relax_vdata, HYPRE_Int num_max_level ); /* smg_residual.c */ void *hypre_SMGResidualCreate ( void ); HYPRE_Int hypre_SMGResidualSetup ( void *residual_vdata, hypre_StructMatrix *A, hypre_StructVector *x, hypre_StructVector *b, hypre_StructVector *r ); HYPRE_Int hypre_SMGResidual ( void *residual_vdata, hypre_StructMatrix *A, hypre_StructVector *x, hypre_StructVector *b, hypre_StructVector *r ); HYPRE_Int hypre_SMGResidualSetBase ( void *residual_vdata, hypre_Index base_index, hypre_Index base_stride ); HYPRE_Int hypre_SMGResidualDestroy ( void *residual_vdata ); /* smg_residual_unrolled.c */ void *hypre_SMGResidualCreate ( void ); HYPRE_Int hypre_SMGResidualSetup ( void *residual_vdata, hypre_StructMatrix *A, hypre_StructVector *x, hypre_StructVector *b, hypre_StructVector *r ); HYPRE_Int hypre_SMGResidual ( void *residual_vdata, hypre_StructMatrix *A, hypre_StructVector *x, hypre_StructVector *b, hypre_StructVector *r ); HYPRE_Int hypre_SMGResidualSetBase ( void *residual_vdata, hypre_Index base_index, hypre_Index base_stride ); HYPRE_Int hypre_SMGResidualDestroy ( void *residual_vdata ); /* smg_setup.c */ HYPRE_Int hypre_SMGSetup ( void *smg_vdata, hypre_StructMatrix *A, hypre_StructVector *b, hypre_StructVector *x ); /* smg_setup_interp.c */ hypre_StructMatrix *hypre_SMGCreateInterpOp ( hypre_StructMatrix *A, hypre_StructGrid *cgrid, HYPRE_Int cdir ); HYPRE_Int hypre_SMGSetupInterpOp ( void *relax_data, hypre_StructMatrix *A, hypre_StructVector *b, hypre_StructVector *x, hypre_StructMatrix *PT, HYPRE_Int cdir, hypre_Index cindex, hypre_Index findex, hypre_Index stride ); /* smg_setup_rap.c */ hypre_StructMatrix *hypre_SMGCreateRAPOp ( hypre_StructMatrix *R, hypre_StructMatrix *A, hypre_StructMatrix *PT, hypre_StructGrid *coarse_grid ); HYPRE_Int hypre_SMGSetupRAPOp ( hypre_StructMatrix *R, hypre_StructMatrix *A, hypre_StructMatrix *PT, hypre_StructMatrix *Ac, hypre_Index cindex, hypre_Index cstride ); /* smg_setup_restrict.c */ hypre_StructMatrix *hypre_SMGCreateRestrictOp ( hypre_StructMatrix *A, hypre_StructGrid *cgrid, HYPRE_Int cdir ); HYPRE_Int hypre_SMGSetupRestrictOp ( hypre_StructMatrix *A, hypre_StructMatrix *R, hypre_StructVector *temp_vec, HYPRE_Int cdir, hypre_Index cindex, hypre_Index cstride ); /* smg_solve.c */ HYPRE_Int hypre_SMGSolve ( void *smg_vdata, hypre_StructMatrix *A, hypre_StructVector *b, hypre_StructVector *x ); /* sparse_msg2_setup_rap.c */ hypre_StructMatrix *hypre_SparseMSG2CreateRAPOp ( hypre_StructMatrix *R, hypre_StructMatrix *A, hypre_StructMatrix *P, hypre_StructGrid *coarse_grid, HYPRE_Int cdir ); HYPRE_Int hypre_SparseMSG2BuildRAPSym ( hypre_StructMatrix *A, hypre_StructMatrix *P, hypre_StructMatrix *R, HYPRE_Int cdir, hypre_Index cindex, hypre_Index cstride, hypre_Index stridePR, hypre_StructMatrix *RAP ); HYPRE_Int hypre_SparseMSG2BuildRAPNoSym ( hypre_StructMatrix *A, hypre_StructMatrix *P, hypre_StructMatrix *R, HYPRE_Int cdir, hypre_Index cindex, hypre_Index cstride, hypre_Index stridePR, hypre_StructMatrix *RAP ); /* sparse_msg3_setup_rap.c */ hypre_StructMatrix *hypre_SparseMSG3CreateRAPOp ( hypre_StructMatrix *R, hypre_StructMatrix *A, hypre_StructMatrix *P, hypre_StructGrid *coarse_grid, HYPRE_Int cdir ); HYPRE_Int hypre_SparseMSG3BuildRAPSym ( hypre_StructMatrix *A, hypre_StructMatrix *P, hypre_StructMatrix *R, HYPRE_Int cdir, hypre_Index cindex, hypre_Index cstride, hypre_Index stridePR, hypre_StructMatrix *RAP ); HYPRE_Int hypre_SparseMSG3BuildRAPNoSym ( hypre_StructMatrix *A, hypre_StructMatrix *P, hypre_StructMatrix *R, HYPRE_Int cdir, hypre_Index cindex, hypre_Index cstride, hypre_Index stridePR, hypre_StructMatrix *RAP ); /* sparse_msg.c */ void *hypre_SparseMSGCreate ( MPI_Comm comm ); HYPRE_Int hypre_SparseMSGDestroy ( void *smsg_vdata ); HYPRE_Int hypre_SparseMSGSetTol ( void *smsg_vdata, HYPRE_Real tol ); HYPRE_Int hypre_SparseMSGSetMaxIter ( void *smsg_vdata, HYPRE_Int max_iter ); HYPRE_Int hypre_SparseMSGSetJump ( void *smsg_vdata, HYPRE_Int jump ); HYPRE_Int hypre_SparseMSGSetRelChange ( void *smsg_vdata, HYPRE_Int rel_change ); HYPRE_Int hypre_SparseMSGSetZeroGuess ( void *smsg_vdata, HYPRE_Int zero_guess ); HYPRE_Int hypre_SparseMSGSetRelaxType ( void *smsg_vdata, HYPRE_Int relax_type ); HYPRE_Int hypre_SparseMSGSetJacobiWeight ( void *smsg_vdata, HYPRE_Real weight ); HYPRE_Int hypre_SparseMSGSetNumPreRelax ( void *smsg_vdata, HYPRE_Int num_pre_relax ); HYPRE_Int hypre_SparseMSGSetNumPostRelax ( void *smsg_vdata, HYPRE_Int num_post_relax ); HYPRE_Int hypre_SparseMSGSetNumFineRelax ( void *smsg_vdata, HYPRE_Int num_fine_relax ); HYPRE_Int hypre_SparseMSGSetLogging ( void *smsg_vdata, HYPRE_Int logging ); HYPRE_Int hypre_SparseMSGSetPrintLevel ( void *smsg_vdata, HYPRE_Int print_level ); HYPRE_Int hypre_SparseMSGGetNumIterations ( void *smsg_vdata, HYPRE_Int *num_iterations ); HYPRE_Int hypre_SparseMSGPrintLogging ( void *smsg_vdata, HYPRE_Int myid ); HYPRE_Int hypre_SparseMSGGetFinalRelativeResidualNorm ( void *smsg_vdata, HYPRE_Real *relative_residual_norm ); /* sparse_msg_filter.c */ HYPRE_Int hypre_SparseMSGFilterSetup ( hypre_StructMatrix *A, HYPRE_Int *num_grids, HYPRE_Int lx, HYPRE_Int ly, HYPRE_Int lz, HYPRE_Int jump, hypre_StructVector *visitx, hypre_StructVector *visity, hypre_StructVector *visitz ); HYPRE_Int hypre_SparseMSGFilter ( hypre_StructVector *visit, hypre_StructVector *e, HYPRE_Int lx, HYPRE_Int ly, HYPRE_Int lz, HYPRE_Int jump ); /* sparse_msg_interp.c */ void *hypre_SparseMSGInterpCreate ( void ); HYPRE_Int hypre_SparseMSGInterpSetup ( void *interp_vdata, hypre_StructMatrix *P, hypre_StructVector *xc, hypre_StructVector *e, hypre_Index cindex, hypre_Index findex, hypre_Index stride, hypre_Index strideP ); HYPRE_Int hypre_SparseMSGInterp ( void *interp_vdata, hypre_StructMatrix *P, hypre_StructVector *xc, hypre_StructVector *e ); HYPRE_Int hypre_SparseMSGInterpDestroy ( void *interp_vdata ); /* sparse_msg_restrict.c */ void *hypre_SparseMSGRestrictCreate ( void ); HYPRE_Int hypre_SparseMSGRestrictSetup ( void *restrict_vdata, hypre_StructMatrix *R, hypre_StructVector *r, hypre_StructVector *rc, hypre_Index cindex, hypre_Index findex, hypre_Index stride, hypre_Index strideR ); HYPRE_Int hypre_SparseMSGRestrict ( void *restrict_vdata, hypre_StructMatrix *R, hypre_StructVector *r, hypre_StructVector *rc ); HYPRE_Int hypre_SparseMSGRestrictDestroy ( void *restrict_vdata ); /* sparse_msg_setup.c */ HYPRE_Int hypre_SparseMSGSetup ( void *smsg_vdata, hypre_StructMatrix *A, hypre_StructVector *b, hypre_StructVector *x ); /* sparse_msg_setup_rap.c */ hypre_StructMatrix *hypre_SparseMSGCreateRAPOp ( hypre_StructMatrix *R, hypre_StructMatrix *A, hypre_StructMatrix *P, hypre_StructGrid *coarse_grid, HYPRE_Int cdir ); HYPRE_Int hypre_SparseMSGSetupRAPOp ( hypre_StructMatrix *R, hypre_StructMatrix *A, hypre_StructMatrix *P, HYPRE_Int cdir, hypre_Index cindex, hypre_Index cstride, hypre_Index stridePR, hypre_StructMatrix *Ac ); /* sparse_msg_solve.c */ HYPRE_Int hypre_SparseMSGSolve ( void *smsg_vdata, hypre_StructMatrix *A, hypre_StructVector *b, hypre_StructVector *x ); #ifdef __cplusplus } #endif #endif hypre-2.33.0/src/struct_ls/coarsen.c000066400000000000000000000275771477326011500173650ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #define TIME_DEBUG 0 #if TIME_DEBUG static HYPRE_Int s_coarsen_num = 0; #endif #include "_hypre_struct_ls.h" #define DEBUG 0 #if DEBUG char filename[255]; FILE *file; static HYPRE_Int debug_count = 0; #endif /*-------------------------------------------------------------------------- * hypre_StructMapFineToCoarse * * NOTE: findex and cindex are indexes on the fine and coarse index space, and * do not stand for "F-pt index" and "C-pt index". *--------------------------------------------------------------------------*/ HYPRE_Int hypre_StructMapFineToCoarse( hypre_Index findex, hypre_Index index, hypre_Index stride, hypre_Index cindex ) { hypre_IndexX(cindex) = (hypre_IndexX(findex) - hypre_IndexX(index)) / hypre_IndexX(stride); hypre_IndexY(cindex) = (hypre_IndexY(findex) - hypre_IndexY(index)) / hypre_IndexY(stride); hypre_IndexZ(cindex) = (hypre_IndexZ(findex) - hypre_IndexZ(index)) / hypre_IndexZ(stride); return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_StructMapCoarseToFine * * NOTE: findex and cindex are indexes on the fine and coarse index space, and * do not stand for "F-pt index" and "C-pt index". *--------------------------------------------------------------------------*/ HYPRE_Int hypre_StructMapCoarseToFine( hypre_Index cindex, hypre_Index index, hypre_Index stride, hypre_Index findex ) { hypre_IndexX(findex) = hypre_IndexX(cindex) * hypre_IndexX(stride) + hypre_IndexX(index); hypre_IndexY(findex) = hypre_IndexY(cindex) * hypre_IndexY(stride) + hypre_IndexY(index); hypre_IndexZ(findex) = hypre_IndexZ(cindex) * hypre_IndexZ(stride) + hypre_IndexZ(index); return hypre_error_flag; } #define hypre_StructCoarsenBox(box, index, stride) \ hypre_ProjectBox(box, index, stride); \ hypre_StructMapFineToCoarse(hypre_BoxIMin(box), index, stride, \ hypre_BoxIMin(box)); \ hypre_StructMapFineToCoarse(hypre_BoxIMax(box), index, stride, \ hypre_BoxIMax(box)) /*-------------------------------------------------------------------------- * New version of hypre_StructCoarsen that uses the BoxManager (AHB 12/06) * * This routine coarsens the grid, 'fgrid', by the coarsening factor, 'stride', * using the index mapping in 'hypre_StructMapFineToCoarse'. * * 1. A coarse grid is created with boxes that result from coarsening the fine * grid boxes, bounding box, and periodicity information. * * 2. If "sufficient" neighbor information exists in the fine grid to be * transferred to the coarse grid, then the coarse grid box manager can be * created by simply coarsening all of the entries in the fine grid manager. * ("Sufficient" is determined by checking max_distance in the fine grid.) * * 3. Otherwise, neighbor information will be collected during the * StructGridAssemble according to the choosen value of max_distance for the * coarse grid. * * 4. We do not need a separate version for the assumed partition case * *--------------------------------------------------------------------------*/ HYPRE_Int hypre_StructCoarsen( hypre_StructGrid *fgrid, hypre_Index index, hypre_Index stride, HYPRE_Int prune, hypre_StructGrid **cgrid_ptr ) { hypre_StructGrid *cgrid; MPI_Comm comm; HYPRE_Int ndim; hypre_BoxArray *my_boxes; hypre_Index periodic; hypre_Index ilower, iupper; hypre_Box *box; hypre_Box *new_box; hypre_Box *bounding_box; HYPRE_Int i, j, myid, count; HYPRE_Int info_size, max_nentries; HYPRE_Int num_entries; HYPRE_Int *fids, *cids; hypre_Index new_dist; hypre_IndexRef max_distance; HYPRE_Int proc, id; HYPRE_Int coarsen_factor, known; HYPRE_Int num, last_proc; #if 0 hypre_StructAssumedPart *fap = NULL, *cap = NULL; #endif hypre_BoxManager *fboxman, *cboxman; hypre_BoxManEntry *entries; hypre_BoxManEntry *entry; void *entry_info = NULL; #if TIME_DEBUG HYPRE_Int tindex; char new_title[80]; hypre_sprintf(new_title, "Coarsen.%d", s_coarsen_num); tindex = hypre_InitializeTiming(new_title); s_coarsen_num++; hypre_BeginTiming(tindex); #endif hypre_SetIndex(ilower, 0); hypre_SetIndex(iupper, 0); /* get relevant information from the fine grid */ fids = hypre_StructGridIDs(fgrid); fboxman = hypre_StructGridBoxMan(fgrid); comm = hypre_StructGridComm(fgrid); ndim = hypre_StructGridNDim(fgrid); max_distance = hypre_StructGridMaxDistance(fgrid); /* initial */ hypre_MPI_Comm_rank(comm, &myid ); /* create new coarse grid */ hypre_StructGridCreate(comm, ndim, &cgrid); /* coarsen my boxes and create the coarse grid ids (same as fgrid) */ my_boxes = hypre_BoxArrayDuplicate(hypre_StructGridBoxes(fgrid)); cids = hypre_TAlloc(HYPRE_Int, hypre_BoxArraySize(my_boxes), HYPRE_MEMORY_HOST); for (i = 0; i < hypre_BoxArraySize(my_boxes); i++) { box = hypre_BoxArrayBox(my_boxes, i); hypre_StructCoarsenBox(box, index, stride); cids[i] = fids[i]; } /* prune? */ /* zero volume boxes are needed when forming P and P^T */ if (prune) { count = 0; hypre_ForBoxI(i, my_boxes) { box = hypre_BoxArrayBox(my_boxes, i); if (hypre_BoxVolume(box)) { hypre_CopyBox(box, hypre_BoxArrayBox(my_boxes, count)); cids[count] = cids[i]; count++; } } hypre_BoxArraySetSize(my_boxes, count); } /* set coarse grid boxes */ hypre_StructGridSetBoxes(cgrid, my_boxes); /* set coarse grid ids */ hypre_StructGridSetIDs(cgrid, cids); /* adjust periodicity and set for the coarse grid */ hypre_CopyIndex(hypre_StructGridPeriodic(fgrid), periodic); for (i = 0; i < ndim; i++) { hypre_IndexD(periodic, i) /= hypre_IndexD(stride, i); } hypre_StructGridSetPeriodic(cgrid, periodic); /* Check the max_distance value of the fine grid to determine whether we will need to re-gather information in the assemble. If we need to re-gather, then the max_distance will be set to (0,0,0). Either way, we will create and populate the box manager with the information from the fine grid. Note: if all global info is already known for a grid, the we do not need to re-gather regardless of the max_distance values. */ for (i = 0; i < ndim; i++) { coarsen_factor = hypre_IndexD(stride, i); hypre_IndexD(new_dist, i) = hypre_IndexD(max_distance, i) / coarsen_factor; } for (i = ndim; i < 3; i++) { hypre_IndexD(new_dist, i) = 2; } hypre_BoxManGetAllGlobalKnown (fboxman, &known ); /* large enough - don't need to re-gather */ if ( (hypre_IndexMin(new_dist, ndim) > 1) || known ) { /* update new max distance value */ if (!known) /* only need to change if global info is not known */ { hypre_StructGridSetMaxDistance(cgrid, new_dist); } } else /* not large enough - set max_distance to 0 - neighbor info will be collected during the assemble */ { hypre_SetIndex(new_dist, 0); hypre_StructGridSetMaxDistance(cgrid, new_dist); } /* update the new bounding box */ bounding_box = hypre_BoxDuplicate(hypre_StructGridBoundingBox(fgrid)); hypre_StructCoarsenBox(bounding_box, index, stride); hypre_StructGridSetBoundingBox(cgrid, bounding_box); /* create a box manager for the coarse grid */ info_size = hypre_BoxManEntryInfoSize(fboxman); max_nentries = hypre_BoxManMaxNEntries(fboxman); hypre_BoxManCreate(max_nentries, info_size, ndim, bounding_box, comm, &cboxman); hypre_BoxDestroy(bounding_box); /* update all global known */ hypre_BoxManSetAllGlobalKnown(cboxman, known ); /* now get the entries from the fgrid box manager, coarsen, and add to the coarse grid box manager (note: my boxes have already been coarsened) */ hypre_BoxManGetAllEntries( fboxman, &num_entries, &entries); new_box = hypre_BoxCreate(ndim); num = 0; last_proc = -1; /* entries are sorted by (proc, id) pairs - may not have entries for all processors, but for each processor represented, we do have all of its boxes. We will keep them sorted in the new box manager - to avoid re-sorting */ for (i = 0; i < num_entries; i++) { entry = &entries[i]; proc = hypre_BoxManEntryProc(entry); if (proc != myid) /* not my boxes */ { hypre_BoxManEntryGetExtents(entry, ilower, iupper); hypre_BoxSetExtents(new_box, ilower, iupper); hypre_StructCoarsenBox(new_box, index, stride); id = hypre_BoxManEntryId(entry); /* if there is pruning we need to adjust the ids if any boxes drop out (we want these ids sequential - no gaps) - and zero boxes are not kept in the box manager */ if (prune) { if (proc != last_proc) { num = 0; last_proc = proc; } if (hypre_BoxVolume(new_box)) { hypre_BoxManAddEntry( cboxman, hypre_BoxIMin(new_box), hypre_BoxIMax(new_box), proc, num, entry_info); num++; } } else /* no pruning - just use id (note that size zero boxes will not be saved in the box manager, so we will have gaps in the box numbers) */ { hypre_BoxManAddEntry( cboxman, hypre_BoxIMin(new_box), hypre_BoxIMax(new_box), proc, id, entry_info); } } else /* my boxes */ /* add my coarse grid boxes to the coarse grid box manager (have already been pruned if necessary) - re-number the entry ids to be sequential (this is the box number, really) */ { if (proc != last_proc) /* just do this once (the first myid) */ { hypre_ForBoxI(j, my_boxes) { box = hypre_BoxArrayBox(my_boxes, j); hypre_BoxManAddEntry( cboxman, hypre_BoxIMin(box), hypre_BoxIMax(box), myid, j, entry_info ); } last_proc = proc; } } } /* loop through entries */ /* these entries are sorted */ hypre_BoxManSetIsEntriesSort(cboxman, 1 ); hypre_BoxDestroy(new_box); #if 0 /* if there is an assumed partition in the fg, then coarsen those boxes as well and add to cg */ hypre_BoxManGetAssumedPartition ( fboxman, &fap); if (fap) { /* coarsen fap to get cap */ /* set cap */ hypre_BoxManSetAssumedPartition (cboxman, cap); } #endif /* assign new box manager */ hypre_StructGridSetBoxManager(cgrid, cboxman); /* finally... assemble the new coarse grid */ hypre_StructGridAssemble(cgrid); /* return the coarse grid */ *cgrid_ptr = cgrid; #if TIME_DEBUG hypre_EndTiming(tindex); #endif return hypre_error_flag; } #undef hypre_StructCoarsenBox hypre-2.33.0/src/struct_ls/cyclic_reduction.c000066400000000000000000001300401477326011500212310ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * Cyclic reduction algorithm (coded as if it were a 1D MG method) * *****************************************************************************/ #include "_hypre_struct_ls.h" #include "_hypre_struct_mv.hpp" #define DEBUG 0 /*-------------------------------------------------------------------------- * Macros *--------------------------------------------------------------------------*/ #define hypre_CycRedSetCIndex(base_index, base_stride, level, cdir, cindex) \ { \ if (level > 0) \ hypre_SetIndex3(cindex, 0, 0, 0); \ else \ hypre_CopyIndex(base_index, cindex); \ hypre_IndexD(cindex, cdir) += 0; \ } #define hypre_CycRedSetFIndex(base_index, base_stride, level, cdir, findex) \ { \ if (level > 0) \ hypre_SetIndex3(findex, 0, 0, 0); \ else \ hypre_CopyIndex(base_index, findex); \ hypre_IndexD(findex, cdir) += 1; \ } #define hypre_CycRedSetStride(base_index, base_stride, level, cdir, stride) \ { \ if (level > 0) \ hypre_SetIndex3(stride, 1, 1, 1); \ else \ hypre_CopyIndex(base_stride, stride); \ hypre_IndexD(stride, cdir) *= 2; \ } /*-------------------------------------------------------------------------- * hypre_CyclicReductionData data structure *--------------------------------------------------------------------------*/ typedef struct { MPI_Comm comm; HYPRE_Int num_levels; HYPRE_Int ndim; HYPRE_Int cdir; /* coarsening direction */ hypre_Index base_index; hypre_Index base_stride; hypre_StructGrid **grid_l; hypre_BoxArray *base_points; hypre_BoxArray **fine_points_l; HYPRE_MemoryLocation memory_location; /* memory location of data */ HYPRE_Real *data; HYPRE_Real *data_const; hypre_StructMatrix **A_l; hypre_StructVector **x_l; hypre_ComputePkg **down_compute_pkg_l; hypre_ComputePkg **up_compute_pkg_l; HYPRE_Int time_index; HYPRE_BigInt solve_flops; HYPRE_Int max_levels; } hypre_CyclicReductionData; /*-------------------------------------------------------------------------- * hypre_CyclicReductionCreate *--------------------------------------------------------------------------*/ void * hypre_CyclicReductionCreate( MPI_Comm comm ) { hypre_CyclicReductionData *cyc_red_data; cyc_red_data = hypre_CTAlloc(hypre_CyclicReductionData, 1, HYPRE_MEMORY_HOST); (cyc_red_data -> comm) = comm; (cyc_red_data -> ndim) = 3; (cyc_red_data -> cdir) = 0; (cyc_red_data -> time_index) = hypre_InitializeTiming("CyclicReduction"); (cyc_red_data -> max_levels) = -1; /* set defaults */ hypre_SetIndex3((cyc_red_data -> base_index), 0, 0, 0); hypre_SetIndex3((cyc_red_data -> base_stride), 1, 1, 1); (cyc_red_data -> memory_location) = hypre_HandleMemoryLocation(hypre_handle()); return (void *) cyc_red_data; } /*-------------------------------------------------------------------------- * hypre_CycRedCreateCoarseOp * * NOTE: This routine assumes that domain boundary ghost zones (i.e., ghost * zones that do not intersect the grid) have the identity equation in them. * This is currently insured by the MatrixAssemble routine. *--------------------------------------------------------------------------*/ hypre_StructMatrix * hypre_CycRedCreateCoarseOp( hypre_StructMatrix *A, hypre_StructGrid *coarse_grid, HYPRE_Int cdir ) { HYPRE_Int ndim = hypre_StructMatrixNDim(A); hypre_StructMatrix *Ac; hypre_Index *Ac_stencil_shape; hypre_StructStencil *Ac_stencil; HYPRE_Int Ac_stencil_size; HYPRE_Int Ac_num_ghost[] = {0, 0, 0, 0, 0, 0}; HYPRE_Int i; HYPRE_Int stencil_rank; /*----------------------------------------------- * Define Ac_stencil *-----------------------------------------------*/ stencil_rank = 0; /*----------------------------------------------- * non-symmetric case: * * 3 point fine grid stencil produces 3 point Ac *-----------------------------------------------*/ if (!hypre_StructMatrixSymmetric(A)) { Ac_stencil_size = 3; Ac_stencil_shape = hypre_CTAlloc(hypre_Index, Ac_stencil_size, HYPRE_MEMORY_HOST); for (i = -1; i < 2; i++) { /* Storage for 3 elements (c,w,e) */ hypre_SetIndex3(Ac_stencil_shape[stencil_rank], 0, 0, 0); hypre_IndexD(Ac_stencil_shape[stencil_rank], cdir) = i; stencil_rank++; } } /*----------------------------------------------- * symmetric case: * * 3 point fine grid stencil produces 3 point Ac * * Only store the lower triangular part + diagonal = 2 entries, * lower triangular means the lower triangular part on the matrix * in the standard lexicalgraphic ordering. *-----------------------------------------------*/ else { Ac_stencil_size = 2; Ac_stencil_shape = hypre_CTAlloc(hypre_Index, Ac_stencil_size, HYPRE_MEMORY_HOST); for (i = -1; i < 1; i++) { /* Storage for 2 elements in (c,w) */ hypre_SetIndex3(Ac_stencil_shape[stencil_rank], 0, 0, 0); hypre_IndexD(Ac_stencil_shape[stencil_rank], cdir) = i; stencil_rank++; } } Ac_stencil = hypre_StructStencilCreate(ndim, Ac_stencil_size, Ac_stencil_shape); Ac = hypre_StructMatrixCreate(hypre_StructMatrixComm(A), coarse_grid, Ac_stencil); hypre_StructStencilDestroy(Ac_stencil); /*----------------------------------------------- * Coarse operator in symmetric iff fine operator is *-----------------------------------------------*/ hypre_StructMatrixSymmetric(Ac) = hypre_StructMatrixSymmetric(A); /*----------------------------------------------- * Set number of ghost points *-----------------------------------------------*/ Ac_num_ghost[2 * cdir] = 1; if (!hypre_StructMatrixSymmetric(A)) { Ac_num_ghost[2 * cdir + 1] = 1; } hypre_StructMatrixSetNumGhost(Ac, Ac_num_ghost); hypre_StructMatrixInitializeShell(Ac); return Ac; } /*-------------------------------------------------------------------------- * hypre_CycRedSetupCoarseOp *--------------------------------------------------------------------------*/ HYPRE_Int hypre_CycRedSetupCoarseOp( hypre_StructMatrix *A, hypre_StructMatrix *Ac, hypre_Index cindex, hypre_Index cstride, HYPRE_Int cdir ) { hypre_Index index; hypre_StructGrid *fgrid; HYPRE_Int *fgrid_ids; hypre_StructGrid *cgrid; hypre_BoxArray *cgrid_boxes; HYPRE_Int *cgrid_ids; hypre_Box *cgrid_box; hypre_IndexRef cstart; hypre_Index stridec; hypre_Index fstart; hypre_IndexRef stridef; hypre_Index loop_size; HYPRE_Int fi, ci; hypre_Box *A_dbox; hypre_Box *Ac_dbox; HYPRE_Real *a_cc, *a_cw, *a_ce; HYPRE_Real *ac_cc, *ac_cw, *ac_ce = NULL; HYPRE_Int offsetA; stridef = cstride; hypre_SetIndex3(stridec, 1, 1, 1); fgrid = hypre_StructMatrixGrid(A); fgrid_ids = hypre_StructGridIDs(fgrid); cgrid = hypre_StructMatrixGrid(Ac); cgrid_boxes = hypre_StructGridBoxes(cgrid); cgrid_ids = hypre_StructGridIDs(cgrid); fi = 0; hypre_ForBoxI(ci, cgrid_boxes) { while (fgrid_ids[fi] != cgrid_ids[ci]) { fi++; } cgrid_box = hypre_BoxArrayBox(cgrid_boxes, ci); cstart = hypre_BoxIMin(cgrid_box); hypre_StructMapCoarseToFine(cstart, cindex, cstride, fstart); A_dbox = hypre_BoxArrayBox(hypre_StructMatrixDataSpace(A), fi); Ac_dbox = hypre_BoxArrayBox(hypre_StructMatrixDataSpace(Ac), ci); /*----------------------------------------------- * Extract pointers for 3-point fine grid operator: * * a_cc is pointer for center coefficient * a_cw is pointer for west coefficient * a_ce is pointer for east coefficient *-----------------------------------------------*/ hypre_SetIndex3(index, 0, 0, 0); a_cc = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_IndexD(index, cdir) = -1; a_cw = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_IndexD(index, cdir) = 1; a_ce = hypre_StructMatrixExtractPointerByIndex(A, fi, index); /*----------------------------------------------- * Extract pointers for coarse grid operator - always 3-point: * * If A is symmetric so is Ac. We build only the * lower triangular part (plus diagonal). * * ac_cc is pointer for center coefficient (etc.) *-----------------------------------------------*/ hypre_SetIndex3(index, 0, 0, 0); ac_cc = hypre_StructMatrixExtractPointerByIndex(Ac, ci, index); hypre_IndexD(index, cdir) = -1; ac_cw = hypre_StructMatrixExtractPointerByIndex(Ac, ci, index); if (!hypre_StructMatrixSymmetric(A)) { hypre_IndexD(index, cdir) = 1; ac_ce = hypre_StructMatrixExtractPointerByIndex(Ac, ci, index); } /*----------------------------------------------- * Define offsets for fine grid stencil and interpolation * * In the BoxLoop below I assume iA and iP refer * to data associated with the point which we are * building the stencil for. The below offsets * are used in refering to data associated with * other points. *-----------------------------------------------*/ hypre_SetIndex3(index, 0, 0, 0); hypre_IndexD(index, cdir) = 1; offsetA = hypre_BoxOffsetDistance(A_dbox, index); /*----------------------------------------------- * non-symmetric case *-----------------------------------------------*/ if (!hypre_StructMatrixSymmetric(A)) { hypre_BoxGetSize(cgrid_box, loop_size); #define DEVICE_VAR is_device_ptr(ac_cw,a_cw,a_cc,ac_cc,a_ce,ac_ce) hypre_BoxLoop2Begin(hypre_StructMatrixNDim(A), loop_size, A_dbox, fstart, stridef, iA, Ac_dbox, cstart, stridec, iAc); { HYPRE_Int iAm1 = iA - offsetA; HYPRE_Int iAp1 = iA + offsetA; ac_cw[iAc] = -a_cw[iA] * a_cw[iAm1] / a_cc[iAm1]; ac_cc[iAc] = a_cc[iA] - a_cw[iA] * a_ce[iAm1] / a_cc[iAm1] - a_ce[iA] * a_cw[iAp1] / a_cc[iAp1]; ac_ce[iAc] = -a_ce[iA] * a_ce[iAp1] / a_cc[iAp1]; } hypre_BoxLoop2End(iA, iAc); #undef DEVICE_VAR } /*----------------------------------------------- * symmetric case *-----------------------------------------------*/ else { hypre_BoxGetSize(cgrid_box, loop_size); #define DEVICE_VAR is_device_ptr(ac_cw,a_cw,a_cc,ac_cc,a_ce) hypre_BoxLoop2Begin(hypre_StructMatrixNDim(A), loop_size, A_dbox, fstart, stridef, iA, Ac_dbox, cstart, stridec, iAc); { HYPRE_Int iAm1 = iA - offsetA; HYPRE_Int iAp1 = iA + offsetA; ac_cw[iAc] = -a_cw[iA] * a_cw[iAm1] / a_cc[iAm1]; ac_cc[iAc] = a_cc[iA] - a_cw[iA] * a_ce[iAm1] / a_cc[iAm1] - a_ce[iA] * a_cw[iAp1] / a_cc[iAp1]; } hypre_BoxLoop2End(iA, iAc); #undef DEVICE_VAR } } /* end ForBoxI */ hypre_StructMatrixAssemble(Ac); /*----------------------------------------------------------------------- * Collapse stencil in periodic direction on coarsest grid. *-----------------------------------------------------------------------*/ if (hypre_IndexD(hypre_StructGridPeriodic(cgrid), cdir) == 1) { hypre_ForBoxI(ci, cgrid_boxes) { cgrid_box = hypre_BoxArrayBox(cgrid_boxes, ci); cstart = hypre_BoxIMin(cgrid_box); Ac_dbox = hypre_BoxArrayBox(hypre_StructMatrixDataSpace(Ac), ci); /*----------------------------------------------- * Extract pointers for coarse grid operator - always 3-point: * * If A is symmetric so is Ac. We build only the * lower triangular part (plus diagonal). * * ac_cc is pointer for center coefficient (etc.) *-----------------------------------------------*/ hypre_SetIndex3(index, 0, 0, 0); ac_cc = hypre_StructMatrixExtractPointerByIndex(Ac, ci, index); hypre_IndexD(index, cdir) = -1; ac_cw = hypre_StructMatrixExtractPointerByIndex(Ac, ci, index); if (!hypre_StructMatrixSymmetric(A)) { hypre_IndexD(index, cdir) = 1; ac_ce = hypre_StructMatrixExtractPointerByIndex(Ac, ci, index); } /*----------------------------------------------- * non-symmetric case *-----------------------------------------------*/ if (!hypre_StructMatrixSymmetric(A)) { hypre_BoxGetSize(cgrid_box, loop_size); #define DEVICE_VAR is_device_ptr(ac_cc,ac_cw,ac_ce) hypre_BoxLoop1Begin(hypre_StructMatrixNDim(A), loop_size, Ac_dbox, cstart, stridec, iAc); { ac_cc[iAc] += (ac_cw[iAc] + ac_ce[iAc]); ac_cw[iAc] = 0.0; ac_ce[iAc] = 0.0; } hypre_BoxLoop1End(iAc); #undef DEVICE_VAR } /*----------------------------------------------- * symmetric case *-----------------------------------------------*/ else { hypre_BoxGetSize(cgrid_box, loop_size); #define DEVICE_VAR is_device_ptr(ac_cc,ac_cw) hypre_BoxLoop1Begin(hypre_StructMatrixNDim(A), loop_size, Ac_dbox, cstart, stridec, iAc); { ac_cc[iAc] += (2.0 * ac_cw[iAc]); ac_cw[iAc] = 0.0; } hypre_BoxLoop1End(iAc); #undef DEVICE_VAR } } /* end ForBoxI */ } hypre_StructMatrixAssemble(Ac); return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_CyclicReductionSetup *--------------------------------------------------------------------------*/ HYPRE_Int hypre_CyclicReductionSetup( void *cyc_red_vdata, hypre_StructMatrix *A, hypre_StructVector *b, hypre_StructVector *x ) { HYPRE_UNUSED_VAR(b); hypre_CyclicReductionData *cyc_red_data = (hypre_CyclicReductionData *) cyc_red_vdata; MPI_Comm comm = (cyc_red_data -> comm); HYPRE_Int cdir = (cyc_red_data -> cdir); hypre_IndexRef base_index = (cyc_red_data -> base_index); hypre_IndexRef base_stride = (cyc_red_data -> base_stride); HYPRE_Int num_levels; HYPRE_Int max_levels = -1; hypre_StructGrid **grid_l; hypre_BoxArray *base_points; hypre_BoxArray **fine_points_l; HYPRE_Real *data; HYPRE_Real *data_const; HYPRE_Int data_size = 0; HYPRE_Int data_size_const = 0; hypre_StructMatrix **A_l; hypre_StructVector **x_l; hypre_ComputePkg **down_compute_pkg_l; hypre_ComputePkg **up_compute_pkg_l; hypre_ComputeInfo *compute_info; hypre_Index cindex; hypre_Index findex; hypre_Index stride; hypre_StructGrid *grid; hypre_Box *cbox; HYPRE_Int l; HYPRE_Int flop_divisor; HYPRE_Int x_num_ghost[] = {0, 0, 0, 0, 0, 0}; HYPRE_MemoryLocation memory_location = hypre_StructMatrixMemoryLocation(A); /*----------------------------------------------------- * Set up coarse grids *-----------------------------------------------------*/ grid = hypre_StructMatrixGrid(A); /* Compute a preliminary num_levels value based on the grid */ cbox = hypre_BoxDuplicate(hypre_StructGridBoundingBox(grid)); num_levels = hypre_Log2(hypre_BoxSizeD(cbox, cdir)) + 2; if (cyc_red_data -> max_levels > 0) { max_levels = (cyc_red_data -> max_levels); } grid_l = hypre_TAlloc(hypre_StructGrid *, num_levels, HYPRE_MEMORY_HOST); hypre_StructGridRef(grid, &grid_l[0]); #if 0 //defined(HYPRE_USING_CUDA) || defined(HYPRE_USING_HIP) data_location = hypre_StructGridDataLocation(grid); #endif for (l = 0; ; l++) { /* set cindex and stride */ hypre_CycRedSetCIndex(base_index, base_stride, l, cdir, cindex); hypre_CycRedSetStride(base_index, base_stride, l, cdir, stride); /* check to see if we should coarsen */ if ( hypre_BoxIMinD(cbox, cdir) == hypre_BoxIMaxD(cbox, cdir) || (l == (max_levels - 1))) { /* stop coarsening */ break; } /* coarsen cbox */ hypre_ProjectBox(cbox, cindex, stride); hypre_StructMapFineToCoarse(hypre_BoxIMin(cbox), cindex, stride, hypre_BoxIMin(cbox)); hypre_StructMapFineToCoarse(hypre_BoxIMax(cbox), cindex, stride, hypre_BoxIMax(cbox)); /* coarsen the grid */ hypre_StructCoarsen(grid_l[l], cindex, stride, 1, &grid_l[l + 1]); #if 0 //defined(HYPRE_USING_CUDA) || defined(HYPRE_USING_HIP) hypre_StructGridDataLocation(grid_l[l + 1]) = data_location; #endif } num_levels = l + 1; /* free up some things */ hypre_BoxDestroy(cbox); (cyc_red_data -> ndim) = hypre_StructGridNDim(grid); (cyc_red_data -> num_levels) = num_levels; (cyc_red_data -> grid_l) = grid_l; /*----------------------------------------------------- * Set up base points *-----------------------------------------------------*/ base_points = hypre_BoxArrayDuplicate(hypre_StructGridBoxes(grid_l[0])); hypre_ProjectBoxArray(base_points, base_index, base_stride); (cyc_red_data -> base_points) = base_points; /*----------------------------------------------------- * Set up fine points *-----------------------------------------------------*/ fine_points_l = hypre_TAlloc(hypre_BoxArray *, num_levels, HYPRE_MEMORY_HOST); for (l = 0; l < (num_levels - 1); l++) { hypre_CycRedSetCIndex(base_index, base_stride, l, cdir, cindex); hypre_CycRedSetFIndex(base_index, base_stride, l, cdir, findex); hypre_CycRedSetStride(base_index, base_stride, l, cdir, stride); fine_points_l[l] = hypre_BoxArrayDuplicate(hypre_StructGridBoxes(grid_l[l])); hypre_ProjectBoxArray(fine_points_l[l], findex, stride); } fine_points_l[l] = hypre_BoxArrayDuplicate(hypre_StructGridBoxes(grid_l[l])); if (num_levels == 1) { hypre_ProjectBoxArray(fine_points_l[l], base_index, base_stride); } (cyc_red_data -> fine_points_l) = fine_points_l; /*----------------------------------------------------- * Set up matrix and vector structures *-----------------------------------------------------*/ A_l = hypre_TAlloc(hypre_StructMatrix *, num_levels, HYPRE_MEMORY_HOST); x_l = hypre_TAlloc(hypre_StructVector *, num_levels, HYPRE_MEMORY_HOST); A_l[0] = hypre_StructMatrixRef(A); x_l[0] = hypre_StructVectorRef(x); x_num_ghost[2 * cdir] = 1; x_num_ghost[2 * cdir + 1] = 1; for (l = 0; l < (num_levels - 1); l++) { A_l[l + 1] = hypre_CycRedCreateCoarseOp(A_l[l], grid_l[l + 1], cdir); //hypre_StructMatrixInitializeShell(A_l[l+1]); data_size += hypre_StructMatrixDataSize(A_l[l + 1]); data_size_const += hypre_StructMatrixDataConstSize(A_l[l + 1]); x_l[l + 1] = hypre_StructVectorCreate(comm, grid_l[l + 1]); hypre_StructVectorSetNumGhost(x_l[l + 1], x_num_ghost); hypre_StructVectorInitializeShell(x_l[l + 1]); hypre_StructVectorSetDataSize(x_l[l + 1], &data_size, &data_size_const); } data = hypre_CTAlloc(HYPRE_Real, data_size, memory_location); data_const = hypre_CTAlloc(HYPRE_Real, data_size_const, HYPRE_MEMORY_HOST); (cyc_red_data -> memory_location) = memory_location; (cyc_red_data -> data) = data; (cyc_red_data -> data_const) = data_const; for (l = 0; l < (num_levels - 1); l++) { hypre_StructMatrixInitializeData(A_l[l + 1], data, data_const); data += hypre_StructMatrixDataSize(A_l[l + 1]); data_const += hypre_StructMatrixDataConstSize(A_l[l + 1]); #if 0 //defined(HYPRE_USING_CUDA) || defined(HYPRE_USING_HIP) if (data_location != HYPRE_MEMORY_HOST) { hypre_StructVectorInitializeData(x_l[l + 1], data); hypre_StructVectorAssemble(x_l[l + 1]); data += hypre_StructVectorDataSize(x_l[l + 1]); } else { hypre_StructVectorInitializeData(x_l[l + 1], data_const); hypre_StructVectorAssemble(x_l[l + 1]); data_const += hypre_StructVectorDataSize(x_l[l + 1]); } #else hypre_StructVectorInitializeData(x_l[l + 1], data); hypre_StructVectorAssemble(x_l[l + 1]); data += hypre_StructVectorDataSize(x_l[l + 1]); #endif } (cyc_red_data -> A_l) = A_l; (cyc_red_data -> x_l) = x_l; /*----------------------------------------------------- * Set up coarse grid operators *-----------------------------------------------------*/ for (l = 0; l < (num_levels - 1); l++) { hypre_CycRedSetCIndex(base_index, base_stride, l, cdir, cindex); hypre_CycRedSetStride(base_index, base_stride, l, cdir, stride); hypre_CycRedSetupCoarseOp(A_l[l], A_l[l + 1], cindex, stride, cdir); } /*---------------------------------------------------------- * Set up compute packages *----------------------------------------------------------*/ down_compute_pkg_l = hypre_TAlloc(hypre_ComputePkg *, (num_levels - 1), HYPRE_MEMORY_HOST); up_compute_pkg_l = hypre_TAlloc(hypre_ComputePkg *, (num_levels - 1), HYPRE_MEMORY_HOST); for (l = 0; l < (num_levels - 1); l++) { hypre_CycRedSetCIndex(base_index, base_stride, l, cdir, cindex); hypre_CycRedSetFIndex(base_index, base_stride, l, cdir, findex); hypre_CycRedSetStride(base_index, base_stride, l, cdir, stride); /* down-cycle */ hypre_CreateComputeInfo(grid_l[l], hypre_StructMatrixStencil(A_l[l]), &compute_info); hypre_ComputeInfoProjectSend(compute_info, findex, stride); hypre_ComputeInfoProjectRecv(compute_info, findex, stride); hypre_ComputeInfoProjectComp(compute_info, cindex, stride); hypre_ComputePkgCreate(compute_info, hypre_StructVectorDataSpace(x_l[l]), 1, grid_l[l], &down_compute_pkg_l[l]); /* up-cycle */ hypre_CreateComputeInfo(grid_l[l], hypre_StructMatrixStencil(A_l[l]), &compute_info); hypre_ComputeInfoProjectSend(compute_info, cindex, stride); hypre_ComputeInfoProjectRecv(compute_info, cindex, stride); hypre_ComputeInfoProjectComp(compute_info, findex, stride); hypre_ComputePkgCreate(compute_info, hypre_StructVectorDataSpace(x_l[l]), 1, grid_l[l], &up_compute_pkg_l[l]); } (cyc_red_data -> down_compute_pkg_l) = down_compute_pkg_l; (cyc_red_data -> up_compute_pkg_l) = up_compute_pkg_l; /*----------------------------------------------------- * Compute solve flops *-----------------------------------------------------*/ flop_divisor = (hypre_IndexX(base_stride) * hypre_IndexY(base_stride) * hypre_IndexZ(base_stride) ); (cyc_red_data -> solve_flops) = hypre_StructVectorGlobalSize(x_l[0]) / 2 / (HYPRE_BigInt)flop_divisor; (cyc_red_data -> solve_flops) += 5 * hypre_StructVectorGlobalSize(x_l[0]) / 2 / (HYPRE_BigInt)flop_divisor; for (l = 1; l < (num_levels - 1); l++) { (cyc_red_data -> solve_flops) += 10 * hypre_StructVectorGlobalSize(x_l[l]) / 2; } if (num_levels > 1) { (cyc_red_data -> solve_flops) += hypre_StructVectorGlobalSize(x_l[l]) / 2; } /*----------------------------------------------------- * Finalize some things *-----------------------------------------------------*/ #if DEBUG { char filename[255]; /* debugging stuff */ for (l = 0; l < num_levels; l++) { hypre_sprintf(filename, "yout_A.%02d", l); hypre_StructMatrixPrint(filename, A_l[l], 0); } } #endif return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_CyclicReduction * * The solution vectors on each level are also used to store the * right-hand-side data. We can do this because of the red-black * nature of the algorithm and the fact that the method is exact, * allowing one to assume initial guesses of zero on all grid levels. *--------------------------------------------------------------------------*/ HYPRE_Int hypre_CyclicReduction( void *cyc_red_vdata, hypre_StructMatrix *A, hypre_StructVector *b, hypre_StructVector *x ) { hypre_CyclicReductionData *cyc_red_data = (hypre_CyclicReductionData *)cyc_red_vdata; HYPRE_Int num_levels = (cyc_red_data -> num_levels); HYPRE_Int cdir = (cyc_red_data -> cdir); hypre_IndexRef base_index = (cyc_red_data -> base_index); hypre_IndexRef base_stride = (cyc_red_data -> base_stride); hypre_BoxArray *base_points = (cyc_red_data -> base_points); hypre_BoxArray **fine_points_l = (cyc_red_data -> fine_points_l); hypre_StructMatrix **A_l = (cyc_red_data -> A_l); hypre_StructVector **x_l = (cyc_red_data -> x_l); hypre_ComputePkg **down_compute_pkg_l = (cyc_red_data -> down_compute_pkg_l); hypre_ComputePkg **up_compute_pkg_l = (cyc_red_data -> up_compute_pkg_l); hypre_StructGrid *fgrid; HYPRE_Int *fgrid_ids; hypre_StructGrid *cgrid; hypre_BoxArray *cgrid_boxes; HYPRE_Int *cgrid_ids; hypre_CommHandle *comm_handle; hypre_BoxArrayArray *compute_box_aa; hypre_BoxArray *compute_box_a; hypre_Box *compute_box; hypre_Box *A_dbox; hypre_Box *x_dbox; hypre_Box *b_dbox; hypre_Box *xc_dbox; HYPRE_Real *Ap, *Awp, *Aep; HYPRE_Real *xp, *xwp, *xep; HYPRE_Real *bp; HYPRE_Real *xcp; hypre_Index cindex; hypre_Index stride; hypre_Index index; hypre_Index loop_size; hypre_Index start; hypre_Index startc; hypre_Index stridec; HYPRE_Int compute_i, fi, ci, j, l; hypre_BeginTiming(cyc_red_data -> time_index); /*-------------------------------------------------- * Initialize some things *--------------------------------------------------*/ hypre_SetIndex3(stridec, 1, 1, 1); hypre_StructMatrixDestroy(A_l[0]); hypre_StructVectorDestroy(x_l[0]); A_l[0] = hypre_StructMatrixRef(A); x_l[0] = hypre_StructVectorRef(x); /*-------------------------------------------------- * Copy b into x *--------------------------------------------------*/ compute_box_a = base_points; hypre_ForBoxI(fi, compute_box_a) { compute_box = hypre_BoxArrayBox(compute_box_a, fi); x_dbox = hypre_BoxArrayBox(hypre_StructVectorDataSpace(x), fi); b_dbox = hypre_BoxArrayBox(hypre_StructVectorDataSpace(b), fi); xp = hypre_StructVectorBoxData(x, fi); bp = hypre_StructVectorBoxData(b, fi); hypre_CopyIndex(hypre_BoxIMin(compute_box), start); hypre_BoxGetStrideSize(compute_box, base_stride, loop_size); #define DEVICE_VAR is_device_ptr(xp,bp) hypre_BoxLoop2Begin(hypre_StructVectorNDim(x), loop_size, x_dbox, start, base_stride, xi, b_dbox, start, base_stride, bi); { xp[xi] = bp[bi]; } hypre_BoxLoop2End(xi, bi); #undef DEVICE_VAR } /*-------------------------------------------------- * Down cycle: * * 1) Do an F-relaxation sweep with zero initial guess * 2) Compute and inject residual at C-points * - computations are at C-points * - communications are at F-points * * Notes: * - Before these two steps are executed, the * fine-grid solution vector contains the right-hand-side. * - After these two steps are executed, the fine-grid * solution vector contains the right-hand side at * C-points and the current solution approximation at * F-points. The coarse-grid solution vector contains * the restricted (injected) fine-grid residual. *--------------------------------------------------*/ for (l = 0; l < num_levels - 1 ; l++) { /* set cindex and stride */ hypre_CycRedSetCIndex(base_index, base_stride, l, cdir, cindex); hypre_CycRedSetStride(base_index, base_stride, l, cdir, stride); /* Step 1 */ compute_box_a = fine_points_l[l]; hypre_ForBoxI(fi, compute_box_a) { compute_box = hypre_BoxArrayBox(compute_box_a, fi); A_dbox = hypre_BoxArrayBox(hypre_StructMatrixDataSpace(A_l[l]), fi); x_dbox = hypre_BoxArrayBox(hypre_StructVectorDataSpace(x_l[l]), fi); hypre_SetIndex3(index, 0, 0, 0); Ap = hypre_StructMatrixExtractPointerByIndex(A_l[l], fi, index); xp = hypre_StructVectorBoxData(x_l[l], fi); hypre_CopyIndex(hypre_BoxIMin(compute_box), start); hypre_BoxGetStrideSize(compute_box, stride, loop_size); #define DEVICE_VAR is_device_ptr(xp,Ap) hypre_BoxLoop2Begin(hypre_StructVectorNDim(x), loop_size, A_dbox, start, stride, Ai, x_dbox, start, stride, xi); { xp[xi] /= Ap[Ai]; } hypre_BoxLoop2End(Ai, xi); #undef DEVICE_VAR } /* Step 2 */ fgrid = hypre_StructVectorGrid(x_l[l]); fgrid_ids = hypre_StructGridIDs(fgrid); cgrid = hypre_StructVectorGrid(x_l[l + 1]); cgrid_boxes = hypre_StructGridBoxes(cgrid); cgrid_ids = hypre_StructGridIDs(cgrid); for (compute_i = 0; compute_i < 2; compute_i++) { switch (compute_i) { case 0: { xp = hypre_StructVectorData(x_l[l]); hypre_InitializeIndtComputations(down_compute_pkg_l[l], xp, &comm_handle); compute_box_aa = hypre_ComputePkgIndtBoxes(down_compute_pkg_l[l]); } break; case 1: { hypre_FinalizeIndtComputations(comm_handle); compute_box_aa = hypre_ComputePkgDeptBoxes(down_compute_pkg_l[l]); } break; } fi = 0; hypre_ForBoxI(ci, cgrid_boxes) { while (fgrid_ids[fi] != cgrid_ids[ci]) { fi++; } compute_box_a = hypre_BoxArrayArrayBoxArray(compute_box_aa, fi); A_dbox = hypre_BoxArrayBox(hypre_StructMatrixDataSpace(A_l[l]), fi); x_dbox = hypre_BoxArrayBox(hypre_StructVectorDataSpace(x_l[l]), fi); xc_dbox = hypre_BoxArrayBox(hypre_StructVectorDataSpace(x_l[l + 1]), ci); xp = hypre_StructVectorBoxData(x_l[l], fi); xcp = hypre_StructVectorBoxData(x_l[l + 1], ci); hypre_SetIndex3(index, 0, 0, 0); hypre_IndexD(index, cdir) = -1; Awp = hypre_StructMatrixExtractPointerByIndex(A_l[l], fi, index); xwp = hypre_StructVectorBoxData(x_l[l], fi); //RL:PTR_OFFSET HYPRE_Int xwp_offset = hypre_BoxOffsetDistance(x_dbox, index); hypre_SetIndex3(index, 0, 0, 0); hypre_IndexD(index, cdir) = 1; Aep = hypre_StructMatrixExtractPointerByIndex(A_l[l], fi, index); xep = hypre_StructVectorBoxData(x_l[l], fi); HYPRE_Int xep_offset = hypre_BoxOffsetDistance(x_dbox, index); hypre_ForBoxI(j, compute_box_a) { compute_box = hypre_BoxArrayBox(compute_box_a, j); hypre_CopyIndex(hypre_BoxIMin(compute_box), start); hypre_StructMapFineToCoarse(start, cindex, stride, startc); hypre_BoxGetStrideSize(compute_box, stride, loop_size); #define DEVICE_VAR is_device_ptr(xcp,xp,Awp,xwp,Aep,xep) hypre_BoxLoop3Begin(hypre_StructVectorNDim(x), loop_size, A_dbox, start, stride, Ai, x_dbox, start, stride, xi, xc_dbox, startc, stridec, xci); { xcp[xci] = xp[xi] - Awp[Ai] * xwp[xi + xwp_offset] - Aep[Ai] * xep[xi + xep_offset]; } hypre_BoxLoop3End(Ai, xi, xci); #undef DEVICE_VAR } } } } /*-------------------------------------------------- * Coarsest grid: * * Do an F-relaxation sweep with zero initial guess * * This is the same as step 1 in above, but is * broken out as a sepecial case to add a check * for zero diagonal that can occur for singlar * problems like the full Neumann problem. *--------------------------------------------------*/ /* set cindex and stride */ hypre_CycRedSetCIndex(base_index, base_stride, l, cdir, cindex); hypre_CycRedSetStride(base_index, base_stride, l, cdir, stride); compute_box_a = fine_points_l[l]; hypre_ForBoxI(fi, compute_box_a) { compute_box = hypre_BoxArrayBox(compute_box_a, fi); A_dbox = hypre_BoxArrayBox(hypre_StructMatrixDataSpace(A_l[l]), fi); x_dbox = hypre_BoxArrayBox(hypre_StructVectorDataSpace(x_l[l]), fi); hypre_SetIndex3(index, 0, 0, 0); Ap = hypre_StructMatrixExtractPointerByIndex(A_l[l], fi, index); xp = hypre_StructVectorBoxData(x_l[l], fi); hypre_CopyIndex(hypre_BoxIMin(compute_box), start); hypre_BoxGetStrideSize(compute_box, stride, loop_size); #define DEVICE_VAR is_device_ptr(xp,Ap) hypre_BoxLoop2Begin(hypre_StructVectorNDim(x), loop_size, A_dbox, start, stride, Ai, x_dbox, start, stride, xi); { if (Ap[Ai] != 0.0) { xp[xi] /= Ap[Ai]; } } hypre_BoxLoop2End(Ai, xi); #undef DEVICE_VAR } /*-------------------------------------------------- * Up cycle: * * 1) Inject coarse error into fine-grid solution * vector (this is the solution at the C-points) * 2) Do an F-relaxation sweep on Ax = 0 and update * solution at F-points * - computations are at F-points * - communications are at C-points *--------------------------------------------------*/ for (l = (num_levels - 2); l >= 0; l--) { /* set cindex and stride */ hypre_CycRedSetCIndex(base_index, base_stride, l, cdir, cindex); hypre_CycRedSetStride(base_index, base_stride, l, cdir, stride); /* Step 1 */ fgrid = hypre_StructVectorGrid(x_l[l]); fgrid_ids = hypre_StructGridIDs(fgrid); cgrid = hypre_StructVectorGrid(x_l[l + 1]); cgrid_boxes = hypre_StructGridBoxes(cgrid); cgrid_ids = hypre_StructGridIDs(cgrid); fi = 0; hypre_ForBoxI(ci, cgrid_boxes) { while (fgrid_ids[fi] != cgrid_ids[ci]) { fi++; } compute_box = hypre_BoxArrayBox(cgrid_boxes, ci); hypre_CopyIndex(hypre_BoxIMin(compute_box), startc); hypre_StructMapCoarseToFine(startc, cindex, stride, start); x_dbox = hypre_BoxArrayBox(hypre_StructVectorDataSpace(x_l[l]), fi); xc_dbox = hypre_BoxArrayBox(hypre_StructVectorDataSpace(x_l[l + 1]), ci); xp = hypre_StructVectorBoxData(x_l[l], fi); xcp = hypre_StructVectorBoxData(x_l[l + 1], ci); hypre_BoxGetSize(compute_box, loop_size); #define DEVICE_VAR is_device_ptr(xp,xcp) hypre_BoxLoop2Begin(hypre_StructVectorNDim(x), loop_size, x_dbox, start, stride, xi, xc_dbox, startc, stridec, xci); { xp[xi] = xcp[xci]; } hypre_BoxLoop2End(xi, xci); #undef DEVICE_VAR } /* Step 2 */ for (compute_i = 0; compute_i < 2; compute_i++) { switch (compute_i) { case 0: { xp = hypre_StructVectorData(x_l[l]); hypre_InitializeIndtComputations(up_compute_pkg_l[l], xp, &comm_handle); compute_box_aa = hypre_ComputePkgIndtBoxes(up_compute_pkg_l[l]); } break; case 1: { hypre_FinalizeIndtComputations(comm_handle); compute_box_aa = hypre_ComputePkgDeptBoxes(up_compute_pkg_l[l]); } break; } hypre_ForBoxArrayI(fi, compute_box_aa) { compute_box_a = hypre_BoxArrayArrayBoxArray(compute_box_aa, fi); A_dbox = hypre_BoxArrayBox(hypre_StructMatrixDataSpace(A_l[l]), fi); x_dbox = hypre_BoxArrayBox(hypre_StructVectorDataSpace(x_l[l]), fi); hypre_SetIndex3(index, 0, 0, 0); Ap = hypre_StructMatrixExtractPointerByIndex(A_l[l], fi, index); xp = hypre_StructVectorBoxData(x_l[l], fi); hypre_SetIndex3(index, 0, 0, 0); hypre_IndexD(index, cdir) = -1; Awp = hypre_StructMatrixExtractPointerByIndex(A_l[l], fi, index); //RL PTROFFSET xwp = hypre_StructVectorBoxData(x_l[l], fi); HYPRE_Int xwp_offset = hypre_BoxOffsetDistance(x_dbox, index); hypre_SetIndex3(index, 0, 0, 0); hypre_IndexD(index, cdir) = 1; Aep = hypre_StructMatrixExtractPointerByIndex(A_l[l], fi, index); xep = hypre_StructVectorBoxData(x_l[l], fi); HYPRE_Int xep_offset = hypre_BoxOffsetDistance(x_dbox, index); hypre_ForBoxI(j, compute_box_a) { compute_box = hypre_BoxArrayBox(compute_box_a, j); hypre_CopyIndex(hypre_BoxIMin(compute_box), start); hypre_BoxGetStrideSize(compute_box, stride, loop_size); #define DEVICE_VAR is_device_ptr(xp,Awp,Aep,Ap) hypre_BoxLoop2Begin(hypre_StructVectorNDim(x), loop_size, A_dbox, start, stride, Ai, x_dbox, start, stride, xi); { xp[xi] -= (Awp[Ai] * xp[xi + xwp_offset] + Aep[Ai] * xp[xi + xep_offset]) / Ap[Ai]; } hypre_BoxLoop2End(Ai, xi); #undef DEVICE_VAR } } } } /*----------------------------------------------------- * Finalize some things *-----------------------------------------------------*/ hypre_IncFLOPCount(cyc_red_data -> solve_flops); hypre_EndTiming(cyc_red_data -> time_index); return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_CyclicReductionSetBase *--------------------------------------------------------------------------*/ HYPRE_Int hypre_CyclicReductionSetBase( void *cyc_red_vdata, hypre_Index base_index, hypre_Index base_stride ) { hypre_CyclicReductionData *cyc_red_data = (hypre_CyclicReductionData *)cyc_red_vdata; HYPRE_Int d; for (d = 0; d < 3; d++) { hypre_IndexD((cyc_red_data -> base_index), d) = hypre_IndexD(base_index, d); hypre_IndexD((cyc_red_data -> base_stride), d) = hypre_IndexD(base_stride, d); } return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_CyclicReductionSetCDir *--------------------------------------------------------------------------*/ HYPRE_Int hypre_CyclicReductionSetCDir( void *cyc_red_vdata, HYPRE_Int cdir ) { hypre_CyclicReductionData *cyc_red_data = (hypre_CyclicReductionData *)cyc_red_vdata; (cyc_red_data -> cdir) = cdir; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_CyclicReductionDestroy *--------------------------------------------------------------------------*/ HYPRE_Int hypre_CyclicReductionDestroy( void *cyc_red_vdata ) { hypre_CyclicReductionData *cyc_red_data = (hypre_CyclicReductionData *)cyc_red_vdata; HYPRE_Int l; if (cyc_red_data) { HYPRE_MemoryLocation memory_location = cyc_red_data -> memory_location; hypre_BoxArrayDestroy(cyc_red_data -> base_points); hypre_StructGridDestroy(cyc_red_data -> grid_l[0]); hypre_StructMatrixDestroy(cyc_red_data -> A_l[0]); hypre_StructVectorDestroy(cyc_red_data -> x_l[0]); for (l = 0; l < ((cyc_red_data -> num_levels) - 1); l++) { hypre_StructGridDestroy(cyc_red_data -> grid_l[l + 1]); hypre_BoxArrayDestroy(cyc_red_data -> fine_points_l[l]); hypre_StructMatrixDestroy(cyc_red_data -> A_l[l + 1]); hypre_StructVectorDestroy(cyc_red_data -> x_l[l + 1]); hypre_ComputePkgDestroy(cyc_red_data -> down_compute_pkg_l[l]); hypre_ComputePkgDestroy(cyc_red_data -> up_compute_pkg_l[l]); } hypre_BoxArrayDestroy(cyc_red_data -> fine_points_l[l]); hypre_TFree(cyc_red_data -> data, memory_location); hypre_TFree(cyc_red_data -> grid_l, HYPRE_MEMORY_HOST); hypre_TFree(cyc_red_data -> fine_points_l, HYPRE_MEMORY_HOST); hypre_TFree(cyc_red_data -> A_l, HYPRE_MEMORY_HOST); hypre_TFree(cyc_red_data -> x_l, HYPRE_MEMORY_HOST); hypre_TFree(cyc_red_data -> down_compute_pkg_l, HYPRE_MEMORY_HOST); hypre_TFree(cyc_red_data -> up_compute_pkg_l, HYPRE_MEMORY_HOST); hypre_FinalizeTiming(cyc_red_data -> time_index); hypre_TFree(cyc_red_data, HYPRE_MEMORY_HOST); } return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_CyclicReductionDestroy *--------------------------------------------------------------------------*/ HYPRE_Int hypre_CyclicReductionSetMaxLevel( void *cyc_red_vdata, HYPRE_Int max_level ) { hypre_CyclicReductionData *cyc_red_data = (hypre_CyclicReductionData *)cyc_red_vdata; (cyc_red_data -> max_levels) = max_level; return hypre_error_flag; } hypre-2.33.0/src/struct_ls/headers000077500000000000000000000027001477326011500171050ustar00rootroot00000000000000#!/bin/bash # Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) INTERNAL_HEADER=_hypre_struct_ls.h #=========================================================================== # Include guards and other includes #=========================================================================== cat > $INTERNAL_HEADER <<@ /*** DO NOT EDIT THIS FILE DIRECTLY (use 'headers' to generate) ***/ #ifndef hypre_STRUCT_LS_HEADER #define hypre_STRUCT_LS_HEADER #include "_hypre_utilities.h" #include "HYPRE_struct_ls.h" #include "_hypre_struct_mv.h" #include "krylov.h" #include "temp_multivector.h" /* ... needed to make sense of functions in HYPRE_parcsr_int.c */ #include "HYPRE_MatvecFunctions.h" /* ... needed to make sense of functions in HYPRE_parcsr_int.c */ #ifdef __cplusplus extern "C" { #endif @ #=========================================================================== # Structures and prototypes #=========================================================================== #../utilities/protos [!F]*.c >> $INTERNAL_HEADER cat protos.h >> $INTERNAL_HEADER #=========================================================================== # Include guards #=========================================================================== cat >> $INTERNAL_HEADER <<@ #ifdef __cplusplus } #endif #endif @ hypre-2.33.0/src/struct_ls/hybrid.c000066400000000000000000000750411477326011500172010ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "_hypre_struct_ls.h" /*-------------------------------------------------------------------------- * hypre_HybridData: *--------------------------------------------------------------------------*/ typedef struct { MPI_Comm comm; HYPRE_Real tol; HYPRE_Real cf_tol; HYPRE_Real pcg_atolf; HYPRE_Int dscg_max_its; HYPRE_Int krylov_max_its; HYPRE_Int two_norm; HYPRE_Int stop_crit; HYPRE_Int rel_change; HYPRE_Int recompute_residual; HYPRE_Int recompute_residual_p; HYPRE_Int k_dim; HYPRE_Int solver_type; HYPRE_Int krylov_default; /* boolean */ HYPRE_Int (*krylov_precond_solve)(void*, void*, void*, void*); HYPRE_Int (*krylov_precond_setup)(void*, void*, void*, void*); void *krylov_precond; /* log info (always logged) */ HYPRE_Int dscg_num_its; HYPRE_Int krylov_num_its; HYPRE_Real final_rel_res_norm; HYPRE_Int time_index; HYPRE_Int print_level; /* additional information (place-holder currently used to print norms) */ HYPRE_Int logging; } hypre_HybridData; /*-------------------------------------------------------------------------- * hypre_HybridCreate *--------------------------------------------------------------------------*/ void * hypre_HybridCreate( MPI_Comm comm ) { hypre_HybridData *hybrid_data; hybrid_data = hypre_CTAlloc(hypre_HybridData, 1, HYPRE_MEMORY_HOST); (hybrid_data -> comm) = comm; (hybrid_data -> time_index) = hypre_InitializeTiming("Hybrid"); /* set defaults */ (hybrid_data -> tol) = 1.0e-06; (hybrid_data -> cf_tol) = 0.90; (hybrid_data -> pcg_atolf) = 0.0; (hybrid_data -> dscg_max_its) = 1000; (hybrid_data -> krylov_max_its) = 200; (hybrid_data -> two_norm) = 0; (hybrid_data -> stop_crit) = 0; (hybrid_data -> rel_change) = 0; (hybrid_data -> solver_type) = 1; (hybrid_data -> k_dim) = 5; (hybrid_data -> krylov_default) = 1; (hybrid_data -> krylov_precond_solve) = NULL; (hybrid_data -> krylov_precond_setup) = NULL; (hybrid_data -> krylov_precond) = NULL; /* initialize */ (hybrid_data -> dscg_num_its) = 0; (hybrid_data -> krylov_num_its) = 0; (hybrid_data -> logging) = 0; (hybrid_data -> print_level) = 0; return (void *) hybrid_data; } /*-------------------------------------------------------------------------- * hypre_HybridDestroy *--------------------------------------------------------------------------*/ HYPRE_Int hypre_HybridDestroy( void *hybrid_vdata ) { hypre_HybridData *hybrid_data = (hypre_HybridData *) hybrid_vdata; if (hybrid_data) { hypre_TFree(hybrid_data, HYPRE_MEMORY_HOST); } return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_HybridSetTol *--------------------------------------------------------------------------*/ HYPRE_Int hypre_HybridSetTol( void *hybrid_vdata, HYPRE_Real tol ) { hypre_HybridData *hybrid_data = (hypre_HybridData *)hybrid_vdata; (hybrid_data -> tol) = tol; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_HybridSetConvergenceTol *--------------------------------------------------------------------------*/ HYPRE_Int hypre_HybridSetConvergenceTol( void *hybrid_vdata, HYPRE_Real cf_tol ) { hypre_HybridData *hybrid_data = (hypre_HybridData *)hybrid_vdata; (hybrid_data -> cf_tol) = cf_tol; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_HybridSetDSCGMaxIter *--------------------------------------------------------------------------*/ HYPRE_Int hypre_HybridSetDSCGMaxIter( void *hybrid_vdata, HYPRE_Int dscg_max_its ) { hypre_HybridData *hybrid_data = (hypre_HybridData *)hybrid_vdata; (hybrid_data -> dscg_max_its) = dscg_max_its; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_HybridSetPCGMaxIter *--------------------------------------------------------------------------*/ HYPRE_Int hypre_HybridSetPCGMaxIter( void *hybrid_vdata, HYPRE_Int krylov_max_its ) { hypre_HybridData *hybrid_data = (hypre_HybridData *)hybrid_vdata; (hybrid_data -> krylov_max_its) = krylov_max_its; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_HybridSetPCGAbsoluteTolFactor *--------------------------------------------------------------------------*/ HYPRE_Int hypre_HybridSetPCGAbsoluteTolFactor( void *hybrid_vdata, HYPRE_Real pcg_atolf ) { hypre_HybridData *hybrid_data = (hypre_HybridData *)hybrid_vdata; (hybrid_data -> pcg_atolf) = pcg_atolf; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_HybridSetTwoNorm *--------------------------------------------------------------------------*/ HYPRE_Int hypre_HybridSetTwoNorm( void *hybrid_vdata, HYPRE_Int two_norm ) { hypre_HybridData *hybrid_data = ( hypre_HybridData *)hybrid_vdata; (hybrid_data -> two_norm) = two_norm; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_HybridSetStopCrit *--------------------------------------------------------------------------*/ HYPRE_Int hypre_HybridSetStopCrit( void *hybrid_vdata, HYPRE_Int stop_crit ) { hypre_HybridData *hybrid_data = ( hypre_HybridData *)hybrid_vdata; (hybrid_data -> stop_crit) = stop_crit; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_HybridSetRelChange *--------------------------------------------------------------------------*/ HYPRE_Int hypre_HybridSetRelChange( void *hybrid_vdata, HYPRE_Int rel_change ) { hypre_HybridData *hybrid_data = (hypre_HybridData *)hybrid_vdata; (hybrid_data -> rel_change) = rel_change; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_HybridSetSolverType *--------------------------------------------------------------------------*/ HYPRE_Int hypre_HybridSetSolverType( void *hybrid_vdata, HYPRE_Int solver_type ) { hypre_HybridData *hybrid_data = (hypre_HybridData *)hybrid_vdata; (hybrid_data -> solver_type) = solver_type; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_HybridSetRecomputeResidual *--------------------------------------------------------------------------*/ HYPRE_Int hypre_HybridSetRecomputeResidual( void *hybrid_vdata, HYPRE_Int recompute_residual ) { hypre_HybridData *hybrid_data = (hypre_HybridData *)hybrid_vdata; (hybrid_data -> recompute_residual) = recompute_residual; return hypre_error_flag; } HYPRE_Int hypre_HybridGetRecomputeResidual( void *hybrid_vdata, HYPRE_Int *recompute_residual ) { hypre_HybridData *hybrid_data = (hypre_HybridData *)hybrid_vdata; *recompute_residual = (hybrid_data -> recompute_residual); return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_HybridSetRecomputeResidualP *--------------------------------------------------------------------------*/ HYPRE_Int hypre_HybridSetRecomputeResidualP( void *hybrid_vdata, HYPRE_Int recompute_residual_p ) { hypre_HybridData *hybrid_data = (hypre_HybridData *)hybrid_vdata; (hybrid_data -> recompute_residual_p) = recompute_residual_p; return hypre_error_flag; } HYPRE_Int hypre_HybridGetRecomputeResidualP( void *hybrid_vdata, HYPRE_Int *recompute_residual_p ) { hypre_HybridData *hybrid_data = (hypre_HybridData *)hybrid_vdata; *recompute_residual_p = (hybrid_data -> recompute_residual_p); return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_HybridSetKDim *--------------------------------------------------------------------------*/ HYPRE_Int hypre_HybridSetKDim( void *hybrid_vdata, HYPRE_Int k_dim ) { hypre_HybridData *hybrid_data = (hypre_HybridData *)hybrid_vdata; (hybrid_data -> k_dim) = k_dim; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_HybridSetPrecond *--------------------------------------------------------------------------*/ HYPRE_Int hypre_HybridSetPrecond( void *krylov_vdata, HYPRE_Int (*krylov_precond_solve)(void*, void*, void*, void*), HYPRE_Int (*krylov_precond_setup)(void*, void*, void*, void*), void *krylov_precond ) { hypre_HybridData *krylov_data = (hypre_HybridData *)krylov_vdata; (krylov_data -> krylov_default) = 0; (krylov_data -> krylov_precond_solve) = krylov_precond_solve; (krylov_data -> krylov_precond_setup) = krylov_precond_setup; (krylov_data -> krylov_precond) = krylov_precond; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_HybridSetLogging *--------------------------------------------------------------------------*/ HYPRE_Int hypre_HybridSetLogging( void *hybrid_vdata, HYPRE_Int logging ) { hypre_HybridData *hybrid_data = (hypre_HybridData *)hybrid_vdata; (hybrid_data -> logging) = logging; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_HybridSetPrintLevel *--------------------------------------------------------------------------*/ HYPRE_Int hypre_HybridSetPrintLevel( void *hybrid_vdata, HYPRE_Int print_level ) { hypre_HybridData *hybrid_data = (hypre_HybridData *)hybrid_vdata; (hybrid_data -> print_level) = print_level; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_HybridGetNumIterations *--------------------------------------------------------------------------*/ HYPRE_Int hypre_HybridGetNumIterations( void *hybrid_vdata, HYPRE_Int *num_its ) { hypre_HybridData *hybrid_data = (hypre_HybridData *)hybrid_vdata; *num_its = (hybrid_data -> dscg_num_its) + (hybrid_data -> krylov_num_its); return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_HybridGetDSCGNumIterations *--------------------------------------------------------------------------*/ HYPRE_Int hypre_HybridGetDSCGNumIterations( void *hybrid_vdata, HYPRE_Int *dscg_num_its ) { hypre_HybridData *hybrid_data = (hypre_HybridData *)hybrid_vdata; *dscg_num_its = (hybrid_data -> dscg_num_its); return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_HybridGetPCGNumIterations *--------------------------------------------------------------------------*/ HYPRE_Int hypre_HybridGetPCGNumIterations( void *hybrid_vdata, HYPRE_Int *krylov_num_its ) { hypre_HybridData *hybrid_data = (hypre_HybridData *)hybrid_vdata; *krylov_num_its = (hybrid_data -> krylov_num_its); return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_HybridGetFinalRelativeResidualNorm *--------------------------------------------------------------------------*/ HYPRE_Int hypre_HybridGetFinalRelativeResidualNorm( void *hybrid_vdata, HYPRE_Real *final_rel_res_norm ) { hypre_HybridData *hybrid_data = (hypre_HybridData *)hybrid_vdata; *final_rel_res_norm = (hybrid_data -> final_rel_res_norm); return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_HybridSetup *--------------------------------------------------------------------------*/ HYPRE_Int hypre_HybridSetup( void *hybrid_vdata, hypre_StructMatrix *A, hypre_StructVector *b, hypre_StructVector *x ) { HYPRE_UNUSED_VAR(hybrid_vdata); HYPRE_UNUSED_VAR(A); HYPRE_UNUSED_VAR(b); HYPRE_UNUSED_VAR(x); return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_HybridSolve *-------------------------------------------------------------------------- * * This solver is designed to solve Ax=b using a hybrid algorithm. First * the solver uses diagonally scaled conjugate gradients. If sufficient * progress is not made, the algorithm switches to preconditioned * conjugate gradients with user-specified preconditioner. * *--------------------------------------------------------------------------*/ /* Local helper function for creating default PCG solver */ void * hypre_HybridSolveUsePCG( hypre_HybridData *hybrid_data ) { void *krylov_solver; HYPRE_Real tol = (hybrid_data -> tol); HYPRE_Real pcg_atolf = (hybrid_data -> pcg_atolf); HYPRE_Int two_norm = (hybrid_data -> two_norm); HYPRE_Int stop_crit = (hybrid_data -> stop_crit); HYPRE_Int rel_change = (hybrid_data -> rel_change); HYPRE_Int recompute_residual = (hybrid_data -> recompute_residual); HYPRE_Int recompute_residual_p = (hybrid_data -> recompute_residual_p); HYPRE_Int logging = (hybrid_data -> logging); HYPRE_Int print_level = (hybrid_data -> print_level); hypre_PCGFunctions *pcg_functions = hypre_PCGFunctionsCreate( hypre_StructKrylovCAlloc, hypre_StructKrylovFree, hypre_StructKrylovCommInfo, hypre_StructKrylovCreateVector, hypre_StructKrylovDestroyVector, hypre_StructKrylovMatvecCreate, hypre_StructKrylovMatvec, hypre_StructKrylovMatvecDestroy, hypre_StructKrylovInnerProd, hypre_StructKrylovCopyVector, hypre_StructKrylovClearVector, hypre_StructKrylovScaleVector, hypre_StructKrylovAxpy, hypre_StructKrylovIdentitySetup, hypre_StructKrylovIdentity ); krylov_solver = hypre_PCGCreate( pcg_functions ); hypre_PCGSetTol(krylov_solver, tol); hypre_PCGSetAbsoluteTolFactor(krylov_solver, pcg_atolf); hypre_PCGSetTwoNorm(krylov_solver, two_norm); hypre_PCGSetStopCrit(krylov_solver, stop_crit); hypre_PCGSetRelChange(krylov_solver, rel_change); hypre_PCGSetRecomputeResidual(krylov_solver, recompute_residual); hypre_PCGSetRecomputeResidualP(krylov_solver, recompute_residual_p); hypre_PCGSetPrintLevel(krylov_solver, print_level); hypre_PCGSetLogging(krylov_solver, logging); return krylov_solver; } /* Local helper function for setting up GMRES */ void * hypre_HybridSolveUseGMRES( hypre_HybridData *hybrid_data ) { void *krylov_solver; HYPRE_Real tol = (hybrid_data -> tol); HYPRE_Int stop_crit = (hybrid_data -> stop_crit); HYPRE_Int rel_change = (hybrid_data -> rel_change); HYPRE_Int logging = (hybrid_data -> logging); HYPRE_Int print_level = (hybrid_data -> print_level); HYPRE_Int k_dim = (hybrid_data -> k_dim); hypre_GMRESFunctions *gmres_functions = hypre_GMRESFunctionsCreate( hypre_StructKrylovCAlloc, hypre_StructKrylovFree, hypre_StructKrylovCommInfo, hypre_StructKrylovCreateVector, hypre_StructKrylovCreateVectorArray, hypre_StructKrylovDestroyVector, hypre_StructKrylovMatvecCreate, hypre_StructKrylovMatvec, hypre_StructKrylovMatvecDestroy, hypre_StructKrylovInnerProd, hypre_StructKrylovCopyVector, hypre_StructKrylovClearVector, hypre_StructKrylovScaleVector, hypre_StructKrylovAxpy, hypre_StructKrylovIdentitySetup, hypre_StructKrylovIdentity ); krylov_solver = hypre_GMRESCreate( gmres_functions ); hypre_GMRESSetTol(krylov_solver, tol); hypre_GMRESSetKDim(krylov_solver, k_dim); hypre_GMRESSetStopCrit(krylov_solver, stop_crit); hypre_GMRESSetRelChange(krylov_solver, rel_change); hypre_GMRESSetPrintLevel(krylov_solver, print_level); hypre_GMRESSetLogging(krylov_solver, logging); return krylov_solver; } /* Local helper function for setting up BiCGSTAB */ void * hypre_HybridSolveUseBiCGSTAB( hypre_HybridData *hybrid_data ) { void *krylov_solver; HYPRE_Real tol = (hybrid_data -> tol); HYPRE_Int stop_crit = (hybrid_data -> stop_crit); HYPRE_Int logging = (hybrid_data -> logging); HYPRE_Int print_level = (hybrid_data -> print_level); hypre_BiCGSTABFunctions *bicgstab_functions = hypre_BiCGSTABFunctionsCreate( hypre_StructKrylovCreateVector, hypre_StructKrylovDestroyVector, hypre_StructKrylovMatvecCreate, hypre_StructKrylovMatvec, hypre_StructKrylovMatvecDestroy, hypre_StructKrylovInnerProd, hypre_StructKrylovCopyVector, hypre_StructKrylovClearVector, hypre_StructKrylovScaleVector, hypre_StructKrylovAxpy, hypre_StructKrylovCommInfo, hypre_StructKrylovIdentitySetup, hypre_StructKrylovIdentity ); krylov_solver = hypre_BiCGSTABCreate( bicgstab_functions ); hypre_BiCGSTABSetTol(krylov_solver, tol); hypre_BiCGSTABSetStopCrit(krylov_solver, stop_crit); hypre_BiCGSTABSetPrintLevel(krylov_solver, print_level); hypre_BiCGSTABSetLogging(krylov_solver, logging); return krylov_solver; } HYPRE_Int hypre_HybridSolve( void *hybrid_vdata, hypre_StructMatrix *A, hypre_StructVector *b, hypre_StructVector *x ) { hypre_HybridData *hybrid_data = (hypre_HybridData *)hybrid_vdata; MPI_Comm comm = (hybrid_data -> comm); HYPRE_Real cf_tol = (hybrid_data -> cf_tol); HYPRE_Int dscg_max_its = (hybrid_data -> dscg_max_its); HYPRE_Int krylov_max_its = (hybrid_data -> krylov_max_its); HYPRE_Int logging = (hybrid_data -> logging); HYPRE_Int solver_type = (hybrid_data -> solver_type); HYPRE_Int krylov_default = (hybrid_data -> krylov_default); HYPRE_Int (*krylov_precond_solve)(void*, void*, void*, void*); HYPRE_Int (*krylov_precond_setup)(void*, void*, void*, void*); void *krylov_precond; void *krylov_solver; HYPRE_Int dscg_num_its; HYPRE_Int krylov_num_its; HYPRE_Int converged; HYPRE_Real res_norm; HYPRE_Int myid; if (solver_type == 1) { /*-------------------------------------------------------------------- * Setup DSCG. *--------------------------------------------------------------------*/ krylov_solver = hypre_HybridSolveUsePCG(hybrid_data); hypre_PCGSetMaxIter(krylov_solver, dscg_max_its); hypre_PCGSetConvergenceFactorTol(krylov_solver, cf_tol); krylov_precond = NULL; hypre_PCGSetPrecond((void*) krylov_solver, (HYPRE_Int (*)(void*, void*, void*, void*)) HYPRE_StructDiagScale, (HYPRE_Int (*)(void*, void*, void*, void*)) HYPRE_StructDiagScaleSetup, (void*) krylov_precond); hypre_PCGSetup(krylov_solver, (void*) A, (void*) b, (void*) x); /*-------------------------------------------------------------------- * Solve with DSCG. *--------------------------------------------------------------------*/ hypre_PCGSolve(krylov_solver, (void*) A, (void*) b, (void*) x); /*-------------------------------------------------------------------- * Get information for DSCG. *--------------------------------------------------------------------*/ hypre_PCGGetNumIterations(krylov_solver, &dscg_num_its); (hybrid_data -> dscg_num_its) = dscg_num_its; hypre_PCGGetFinalRelativeResidualNorm(krylov_solver, &res_norm); /*-------------------------------------------------------------------- * Get additional information from PCG if logging on for hybrid solver. * Currently used as debugging flag to print norms. *--------------------------------------------------------------------*/ if ( logging > 1 ) { hypre_MPI_Comm_rank(comm, &myid ); hypre_PCGPrintLogging(krylov_solver, myid); } /*-------------------------------------------------------------------- * check if converged. *--------------------------------------------------------------------*/ hypre_PCGGetConverged(krylov_solver, &converged); } else if (solver_type == 2) { /*-------------------------------------------------------------------- * Setup GMRES *--------------------------------------------------------------------*/ krylov_solver = hypre_HybridSolveUseGMRES(hybrid_data); hypre_GMRESSetMaxIter(krylov_solver, dscg_max_its); hypre_GMRESSetConvergenceFactorTol(krylov_solver, cf_tol); krylov_precond = NULL; hypre_GMRESSetPrecond((void*) krylov_solver, (HYPRE_Int (*)(void*, void*, void*, void*))HYPRE_StructDiagScale, (HYPRE_Int (*)(void*, void*, void*, void*))HYPRE_StructDiagScaleSetup, (void*) krylov_precond); hypre_GMRESSetup(krylov_solver, (void*) A, (void*) b, (void*) x); /*-------------------------------------------------------------------- * Solve with GMRES *--------------------------------------------------------------------*/ hypre_GMRESSolve(krylov_solver, (void*) A, (void*) b, (void*) x); /*-------------------------------------------------------------------- * Get information for GMRES *--------------------------------------------------------------------*/ hypre_GMRESGetNumIterations(krylov_solver, &dscg_num_its); (hybrid_data -> dscg_num_its) = dscg_num_its; hypre_GMRESGetFinalRelativeResidualNorm(krylov_solver, &res_norm); /*-------------------------------------------------------------------- * check if converged. *--------------------------------------------------------------------*/ hypre_GMRESGetConverged(krylov_solver, &converged); } else { /*-------------------------------------------------------------------- * Setup BiCGSTAB *--------------------------------------------------------------------*/ krylov_solver = hypre_HybridSolveUseBiCGSTAB(hybrid_data); hypre_BiCGSTABSetMaxIter(krylov_solver, dscg_max_its); hypre_BiCGSTABSetConvergenceFactorTol(krylov_solver, cf_tol); krylov_precond = NULL; hypre_BiCGSTABSetPrecond((void*) krylov_solver, (HYPRE_Int (*)(void*, void*, void*, void*)) HYPRE_StructDiagScale, (HYPRE_Int (*)(void*, void*, void*, void*)) HYPRE_StructDiagScaleSetup, (void*) krylov_precond); hypre_BiCGSTABSetup(krylov_solver, (void*) A, (void*) b, (void*) x); /*-------------------------------------------------------------------- * Solve with BiCGSTAB *--------------------------------------------------------------------*/ hypre_BiCGSTABSolve(krylov_solver, (void*) A, (void*) b, (void*) x); /*-------------------------------------------------------------------- * Get information for BiCGSTAB *--------------------------------------------------------------------*/ hypre_BiCGSTABGetNumIterations(krylov_solver, &dscg_num_its); (hybrid_data -> dscg_num_its) = dscg_num_its; hypre_BiCGSTABGetFinalRelativeResidualNorm(krylov_solver, &res_norm); /*-------------------------------------------------------------------- * check if converged. *--------------------------------------------------------------------*/ hypre_BiCGSTABGetConverged(krylov_solver, &converged); } /*----------------------------------------------------------------------- * if converged, done... *-----------------------------------------------------------------------*/ if ( converged ) { (hybrid_data -> final_rel_res_norm) = res_norm; if (solver_type == 1) { hypre_PCGDestroy(krylov_solver); } else if (solver_type == 2) { hypre_GMRESDestroy(krylov_solver); } else { hypre_BiCGSTABDestroy(krylov_solver); } } /*----------------------------------------------------------------------- * ... otherwise, use solver+precond *-----------------------------------------------------------------------*/ else { /*-------------------------------------------------------------------- * Free up previous PCG solver structure and set up a new one. *--------------------------------------------------------------------*/ if (solver_type == 1) { hypre_PCGDestroy(krylov_solver); krylov_solver = hypre_HybridSolveUsePCG(hybrid_data); hypre_PCGSetMaxIter(krylov_solver, krylov_max_its); hypre_PCGSetConvergenceFactorTol(krylov_solver, 0.0); } else if (solver_type == 2) { hypre_GMRESDestroy(krylov_solver); krylov_solver = hypre_HybridSolveUseGMRES(hybrid_data); hypre_GMRESSetMaxIter(krylov_solver, krylov_max_its); hypre_GMRESSetConvergenceFactorTol(krylov_solver, 0.0); } else { hypre_BiCGSTABDestroy(krylov_solver); krylov_solver = hypre_HybridSolveUseBiCGSTAB(hybrid_data); hypre_BiCGSTABSetMaxIter(krylov_solver, krylov_max_its); hypre_BiCGSTABSetConvergenceFactorTol(krylov_solver, 0.0); } /* Setup preconditioner */ if (krylov_default) { krylov_precond = hypre_SMGCreate(comm); hypre_SMGSetMaxIter(krylov_precond, 1); hypre_SMGSetTol(krylov_precond, 0.0); hypre_SMGSetNumPreRelax(krylov_precond, 1); hypre_SMGSetNumPostRelax(krylov_precond, 1); hypre_SMGSetLogging(krylov_precond, 0); krylov_precond_solve = (HYPRE_Int (*)(void*, void*, void*, void*))hypre_SMGSolve; krylov_precond_setup = (HYPRE_Int (*)(void*, void*, void*, void*))hypre_SMGSetup; } else { krylov_precond = (hybrid_data -> krylov_precond); krylov_precond_solve = (hybrid_data -> krylov_precond_solve); krylov_precond_setup = (hybrid_data -> krylov_precond_setup); } /* Complete setup of solver+precond */ if (solver_type == 1) { hypre_PCGSetPrecond((void*) krylov_solver, (HYPRE_Int (*)(void*, void*, void*, void*)) krylov_precond_solve, (HYPRE_Int (*)(void*, void*, void*, void*)) krylov_precond_setup, (void*) krylov_precond); hypre_PCGSetup(krylov_solver, (void*) A, (void*) b, (void*) x); /* Solve */ hypre_PCGSolve(krylov_solver, (void*) A, (void*) b, (void*) x); /* Get information from PCG that is always logged in hybrid solver*/ hypre_PCGGetNumIterations(krylov_solver, &krylov_num_its); (hybrid_data -> krylov_num_its) = krylov_num_its; hypre_PCGGetFinalRelativeResidualNorm(krylov_solver, &res_norm); (hybrid_data -> final_rel_res_norm) = res_norm; /*----------------------------------------------------------------- * Get additional information from PCG if logging on for hybrid solver. * Currently used as debugging flag to print norms. *-----------------------------------------------------------------*/ if ( logging > 1 ) { hypre_MPI_Comm_rank(comm, &myid ); hypre_PCGPrintLogging(krylov_solver, myid); } /* Free PCG and preconditioner */ hypre_PCGDestroy(krylov_solver); } else if (solver_type == 2) { hypre_GMRESSetPrecond(krylov_solver, krylov_precond_solve, krylov_precond_setup, krylov_precond); hypre_GMRESSetup(krylov_solver, (void*) A, (void*) b, (void*) x); /* Solve */ hypre_GMRESSolve(krylov_solver, (void*) A, (void*) b, (void*) x); /* Get information from GMRES that is always logged in hybrid solver*/ hypre_GMRESGetNumIterations(krylov_solver, &krylov_num_its); (hybrid_data -> krylov_num_its) = krylov_num_its; hypre_GMRESGetFinalRelativeResidualNorm(krylov_solver, &res_norm); (hybrid_data -> final_rel_res_norm) = res_norm; /* Free GMRES and preconditioner */ hypre_GMRESDestroy(krylov_solver); } else { hypre_BiCGSTABSetPrecond(krylov_solver, krylov_precond_solve, krylov_precond_setup, krylov_precond); hypre_BiCGSTABSetup(krylov_solver, (void*) A, (void*) b, (void*) x); /* Solve */ hypre_BiCGSTABSolve(krylov_solver, (void*) A, (void*) b, (void*) x); /* Get information from BiCGSTAB that is always logged in hybrid solver*/ hypre_BiCGSTABGetNumIterations(krylov_solver, &krylov_num_its); (hybrid_data -> krylov_num_its) = krylov_num_its; hypre_BiCGSTABGetFinalRelativeResidualNorm(krylov_solver, &res_norm); (hybrid_data -> final_rel_res_norm) = res_norm; /* Free BiCGSTAB and preconditioner */ hypre_BiCGSTABDestroy(krylov_solver); } if (krylov_default) { hypre_SMGDestroy(krylov_precond); } } return hypre_error_flag; } hypre-2.33.0/src/struct_ls/jacobi.c000066400000000000000000000151501477326011500171420ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "_hypre_struct_ls.h" typedef struct { void *relax_data; } hypre_JacobiData; /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ void * hypre_JacobiCreate( MPI_Comm comm ) { hypre_JacobiData *jacobi_data; void *relax_data; hypre_Index stride; hypre_Index indices[1]; jacobi_data = hypre_CTAlloc(hypre_JacobiData, 1, HYPRE_MEMORY_HOST); relax_data = hypre_PointRelaxCreate(comm); hypre_PointRelaxSetNumPointsets(relax_data, 1); hypre_SetIndex3(stride, 1, 1, 1); hypre_SetIndex3(indices[0], 0, 0, 0); hypre_PointRelaxSetPointset(relax_data, 0, 1, stride, indices); hypre_PointRelaxSetTol(relax_data, 1.0e-6); (jacobi_data -> relax_data) = relax_data; return (void *) jacobi_data; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_JacobiDestroy( void *jacobi_vdata ) { hypre_JacobiData *jacobi_data = (hypre_JacobiData *)jacobi_vdata; if (jacobi_data) { hypre_PointRelaxDestroy(jacobi_data -> relax_data); hypre_TFree(jacobi_data, HYPRE_MEMORY_HOST); } return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_JacobiSetup( void *jacobi_vdata, hypre_StructMatrix *A, hypre_StructVector *b, hypre_StructVector *x ) { hypre_JacobiData *jacobi_data = (hypre_JacobiData *)jacobi_vdata; hypre_PointRelaxSetup((jacobi_data -> relax_data), A, b, x); return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_JacobiSolve( void *jacobi_vdata, hypre_StructMatrix *A, hypre_StructVector *b, hypre_StructVector *x ) { hypre_JacobiData *jacobi_data = (hypre_JacobiData *)jacobi_vdata; hypre_PointRelax((jacobi_data -> relax_data), A, b, x); return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_JacobiSetTol( void *jacobi_vdata, HYPRE_Real tol ) { hypre_JacobiData *jacobi_data = (hypre_JacobiData *)jacobi_vdata; hypre_PointRelaxSetTol((jacobi_data -> relax_data), tol); return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_JacobiGetTol( void *jacobi_vdata, HYPRE_Real *tol ) { hypre_JacobiData *jacobi_data = (hypre_JacobiData *)jacobi_vdata; hypre_PointRelaxGetTol((jacobi_data -> relax_data), tol); return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_JacobiSetMaxIter( void *jacobi_vdata, HYPRE_Int max_iter ) { hypre_JacobiData *jacobi_data = (hypre_JacobiData *)jacobi_vdata; hypre_PointRelaxSetMaxIter((jacobi_data -> relax_data), max_iter); return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_JacobiGetMaxIter( void *jacobi_vdata, HYPRE_Int * max_iter ) { hypre_JacobiData *jacobi_data = (hypre_JacobiData *)jacobi_vdata; hypre_PointRelaxGetMaxIter((jacobi_data -> relax_data), max_iter); return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_JacobiSetZeroGuess( void *jacobi_vdata, HYPRE_Int zero_guess ) { hypre_JacobiData *jacobi_data = (hypre_JacobiData *)jacobi_vdata; hypre_PointRelaxSetZeroGuess((jacobi_data -> relax_data), zero_guess); return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_JacobiGetZeroGuess( void *jacobi_vdata, HYPRE_Int * zero_guess ) { hypre_JacobiData *jacobi_data = (hypre_JacobiData *)jacobi_vdata; hypre_PointRelaxGetZeroGuess((jacobi_data -> relax_data), zero_guess); return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_JacobiGetNumIterations( void *jacobi_vdata, HYPRE_Int * num_iterations ) { hypre_JacobiData *jacobi_data = (hypre_JacobiData *)jacobi_vdata; hypre_PointRelaxGetNumIterations((jacobi_data -> relax_data), num_iterations ); return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_JacobiSetTempVec( void *jacobi_vdata, hypre_StructVector *t ) { hypre_JacobiData *jacobi_data = (hypre_JacobiData *)jacobi_vdata; hypre_PointRelaxSetTempVec((jacobi_data -> relax_data), t); return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_JacobiGetFinalRelativeResidualNorm( void * jacobi_vdata, HYPRE_Real * norm ) { hypre_JacobiData *jacobi_data = (hypre_JacobiData *)jacobi_vdata; void *relax_data = jacobi_data -> relax_data; return hypre_PointRelaxGetFinalRelativeResidualNorm( relax_data, norm ); } hypre-2.33.0/src/struct_ls/pcg_struct.c000066400000000000000000000172461477326011500201000ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "_hypre_struct_ls.h" /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ void * hypre_StructKrylovCAlloc( size_t count, size_t elt_size, HYPRE_MemoryLocation location) { return ( (void*) hypre_CTAlloc(char, count * elt_size, location) ); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_StructKrylovFree( void *ptr ) { hypre_TFree( ptr, HYPRE_MEMORY_HOST); return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ void * hypre_StructKrylovCreateVector( void *vvector ) { hypre_StructVector *vector = (hypre_StructVector *)vvector; hypre_StructVector *new_vector; HYPRE_Int *num_ghost = hypre_StructVectorNumGhost(vector); new_vector = hypre_StructVectorCreate( hypre_StructVectorComm(vector), hypre_StructVectorGrid(vector) ); hypre_StructVectorSetNumGhost(new_vector, num_ghost); hypre_StructVectorInitialize(new_vector); hypre_StructVectorAssemble(new_vector); return ( (void *) new_vector ); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ void * hypre_StructKrylovCreateVectorArray(HYPRE_Int n, void *vvector ) { hypre_StructVector *vector = (hypre_StructVector *)vvector; hypre_StructVector **new_vector; HYPRE_Int *num_ghost = hypre_StructVectorNumGhost(vector); HYPRE_Int i; new_vector = hypre_CTAlloc(hypre_StructVector*, n, HYPRE_MEMORY_HOST); for (i = 0; i < n; i++) { HYPRE_StructVectorCreate(hypre_StructVectorComm(vector), hypre_StructVectorGrid(vector), (HYPRE_StructVector *) &new_vector[i] ); hypre_StructVectorSetNumGhost(new_vector[i], num_ghost); HYPRE_StructVectorInitialize((HYPRE_StructVector) new_vector[i]); HYPRE_StructVectorAssemble((HYPRE_StructVector) new_vector[i]); } return ( (void *) new_vector ); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_StructKrylovDestroyVector( void *vvector ) { hypre_StructVector *vector = (hypre_StructVector *)vvector; return ( hypre_StructVectorDestroy( vector ) ); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ void * hypre_StructKrylovMatvecCreate( void *A, void *x ) { void *matvec_data; matvec_data = hypre_StructMatvecCreate(); hypre_StructMatvecSetup(matvec_data, (hypre_StructMatrix *)A, (hypre_StructVector *)x); return ( matvec_data ); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_StructKrylovMatvec( void *matvec_data, HYPRE_Complex alpha, void *A, void *x, HYPRE_Complex beta, void *y ) { return ( hypre_StructMatvecCompute( matvec_data, alpha, (hypre_StructMatrix *) A, (hypre_StructVector *) x, beta, (hypre_StructVector *) y ) ); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_StructKrylovMatvecDestroy( void *matvec_data ) { return ( hypre_StructMatvecDestroy( matvec_data ) ); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Real hypre_StructKrylovInnerProd( void *x, void *y ) { return ( hypre_StructInnerProd( (hypre_StructVector *) x, (hypre_StructVector *) y ) ); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_StructKrylovCopyVector( void *x, void *y ) { return ( hypre_StructCopy( (hypre_StructVector *) x, (hypre_StructVector *) y ) ); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_StructKrylovClearVector( void *x ) { return ( hypre_StructVectorSetConstantValues( (hypre_StructVector *) x, 0.0 ) ); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_StructKrylovScaleVector( HYPRE_Complex alpha, void *x ) { return ( hypre_StructScale( alpha, (hypre_StructVector *) x ) ); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_StructKrylovAxpy( HYPRE_Complex alpha, void *x, void *y ) { return ( hypre_StructAxpy( alpha, (hypre_StructVector *) x, (hypre_StructVector *) y ) ); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_StructKrylovIdentitySetup( void *vdata, void *A, void *b, void *x ) { HYPRE_UNUSED_VAR(vdata); HYPRE_UNUSED_VAR(A); HYPRE_UNUSED_VAR(b); HYPRE_UNUSED_VAR(x); return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_StructKrylovIdentity( void *vdata, void *A, void *b, void *x ) { HYPRE_UNUSED_VAR(vdata); HYPRE_UNUSED_VAR(A); return ( hypre_StructKrylovCopyVector( b, x ) ); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_StructKrylovCommInfo( void *A, HYPRE_Int *my_id, HYPRE_Int *num_procs ) { MPI_Comm comm = hypre_StructMatrixComm((hypre_StructMatrix *) A); hypre_MPI_Comm_size(comm, num_procs); hypre_MPI_Comm_rank(comm, my_id); return hypre_error_flag; } hypre-2.33.0/src/struct_ls/pfmg.c000066400000000000000000000400511477326011500166420ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "_hypre_struct_ls.h" #include "pfmg.h" /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ void * hypre_PFMGCreate( MPI_Comm comm ) { hypre_PFMGData *pfmg_data; pfmg_data = hypre_CTAlloc(hypre_PFMGData, 1, HYPRE_MEMORY_HOST); (pfmg_data -> comm) = comm; (pfmg_data -> time_index) = hypre_InitializeTiming("PFMG"); /* set defaults */ (pfmg_data -> tol) = 1.0e-06; (pfmg_data -> max_iter) = 200; (pfmg_data -> rel_change) = 0; (pfmg_data -> zero_guess) = 0; (pfmg_data -> max_levels) = 0; (pfmg_data -> dxyz)[0] = 0.0; (pfmg_data -> dxyz)[1] = 0.0; (pfmg_data -> dxyz)[2] = 0.0; (pfmg_data -> relax_type) = 1; /* weighted Jacobi */ (pfmg_data -> jacobi_weight) = 0.0; (pfmg_data -> usr_jacobi_weight) = 0; /* no user Jacobi weight */ (pfmg_data -> rap_type) = 0; (pfmg_data -> num_pre_relax) = 1; (pfmg_data -> num_post_relax) = 1; (pfmg_data -> skip_relax) = 1; (pfmg_data -> logging) = 0; (pfmg_data -> print_level) = 0; (pfmg_data -> memory_location) = hypre_HandleMemoryLocation(hypre_handle()); /* initialize */ (pfmg_data -> num_levels) = -1; return (void *) pfmg_data; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_PFMGDestroy( void *pfmg_vdata ) { hypre_PFMGData *pfmg_data = (hypre_PFMGData *)pfmg_vdata; HYPRE_Int l; HYPRE_ANNOTATE_FUNC_BEGIN; if (pfmg_data) { if ((pfmg_data -> logging) > 0) { hypre_TFree(pfmg_data -> norms, HYPRE_MEMORY_HOST); hypre_TFree(pfmg_data -> rel_norms, HYPRE_MEMORY_HOST); } HYPRE_MemoryLocation memory_location = pfmg_data -> memory_location; if ((pfmg_data -> num_levels) > -1) { for (l = 0; l < (pfmg_data -> num_levels); l++) { if (pfmg_data -> active_l[l]) { hypre_PFMGRelaxDestroy(pfmg_data -> relax_data_l[l]); } hypre_StructMatvecDestroy(pfmg_data -> matvec_data_l[l]); } for (l = 0; l < ((pfmg_data -> num_levels) - 1); l++) { hypre_SemiRestrictDestroy(pfmg_data -> restrict_data_l[l]); hypre_SemiInterpDestroy(pfmg_data -> interp_data_l[l]); } hypre_TFree(pfmg_data -> relax_data_l, HYPRE_MEMORY_HOST); hypre_TFree(pfmg_data -> matvec_data_l, HYPRE_MEMORY_HOST); hypre_TFree(pfmg_data -> restrict_data_l, HYPRE_MEMORY_HOST); hypre_TFree(pfmg_data -> interp_data_l, HYPRE_MEMORY_HOST); hypre_StructVectorDestroy(pfmg_data -> tx_l[0]); hypre_StructGridDestroy(pfmg_data -> grid_l[0]); hypre_StructMatrixDestroy(pfmg_data -> A_l[0]); hypre_StructVectorDestroy(pfmg_data -> b_l[0]); hypre_StructVectorDestroy(pfmg_data -> x_l[0]); for (l = 0; l < ((pfmg_data -> num_levels) - 1); l++) { hypre_StructGridDestroy(pfmg_data -> grid_l[l + 1]); hypre_StructGridDestroy(pfmg_data -> P_grid_l[l + 1]); hypre_StructMatrixDestroy(pfmg_data -> A_l[l + 1]); hypre_StructMatrixDestroy(pfmg_data -> P_l[l]); hypre_StructVectorDestroy(pfmg_data -> b_l[l + 1]); hypre_StructVectorDestroy(pfmg_data -> x_l[l + 1]); hypre_StructVectorDestroy(pfmg_data -> tx_l[l + 1]); } hypre_TFree(pfmg_data -> data, memory_location); hypre_TFree(pfmg_data -> data_const, HYPRE_MEMORY_HOST); hypre_TFree(pfmg_data -> cdir_l, HYPRE_MEMORY_HOST); hypre_TFree(pfmg_data -> active_l, HYPRE_MEMORY_HOST); hypre_TFree(pfmg_data -> grid_l, HYPRE_MEMORY_HOST); hypre_TFree(pfmg_data -> P_grid_l, HYPRE_MEMORY_HOST); hypre_TFree(pfmg_data -> A_l, HYPRE_MEMORY_HOST); hypre_TFree(pfmg_data -> P_l, HYPRE_MEMORY_HOST); hypre_TFree(pfmg_data -> RT_l, HYPRE_MEMORY_HOST); hypre_TFree(pfmg_data -> b_l, HYPRE_MEMORY_HOST); hypre_TFree(pfmg_data -> x_l, HYPRE_MEMORY_HOST); hypre_TFree(pfmg_data -> tx_l, HYPRE_MEMORY_HOST); } hypre_FinalizeTiming(pfmg_data -> time_index); hypre_TFree(pfmg_data, HYPRE_MEMORY_HOST); } HYPRE_ANNOTATE_FUNC_END; return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_PFMGSetTol( void *pfmg_vdata, HYPRE_Real tol ) { hypre_PFMGData *pfmg_data = (hypre_PFMGData *)pfmg_vdata; (pfmg_data -> tol) = tol; return hypre_error_flag; } HYPRE_Int hypre_PFMGGetTol( void *pfmg_vdata, HYPRE_Real *tol ) { hypre_PFMGData *pfmg_data = (hypre_PFMGData *)pfmg_vdata; *tol = (pfmg_data -> tol); return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_PFMGSetMaxIter( void *pfmg_vdata, HYPRE_Int max_iter ) { hypre_PFMGData *pfmg_data = (hypre_PFMGData *)pfmg_vdata; (pfmg_data -> max_iter) = max_iter; return hypre_error_flag; } HYPRE_Int hypre_PFMGGetMaxIter( void *pfmg_vdata, HYPRE_Int * max_iter ) { hypre_PFMGData *pfmg_data = (hypre_PFMGData *)pfmg_vdata; *max_iter = (pfmg_data -> max_iter); return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_PFMGSetMaxLevels( void *pfmg_vdata, HYPRE_Int max_levels ) { hypre_PFMGData *pfmg_data = (hypre_PFMGData *)pfmg_vdata; (pfmg_data -> max_levels) = max_levels; return hypre_error_flag; } HYPRE_Int hypre_PFMGGetMaxLevels( void *pfmg_vdata, HYPRE_Int * max_levels ) { hypre_PFMGData *pfmg_data = (hypre_PFMGData *)pfmg_vdata; *max_levels = (pfmg_data -> max_levels); return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_PFMGSetRelChange( void *pfmg_vdata, HYPRE_Int rel_change ) { hypre_PFMGData *pfmg_data = (hypre_PFMGData *)pfmg_vdata; (pfmg_data -> rel_change) = rel_change; return hypre_error_flag; } HYPRE_Int hypre_PFMGGetRelChange( void *pfmg_vdata, HYPRE_Int * rel_change ) { hypre_PFMGData *pfmg_data = (hypre_PFMGData *)pfmg_vdata; *rel_change = (pfmg_data -> rel_change); return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_PFMGSetZeroGuess( void *pfmg_vdata, HYPRE_Int zero_guess ) { hypre_PFMGData *pfmg_data = (hypre_PFMGData *)pfmg_vdata; (pfmg_data -> zero_guess) = zero_guess; return hypre_error_flag; } HYPRE_Int hypre_PFMGGetZeroGuess( void *pfmg_vdata, HYPRE_Int * zero_guess ) { hypre_PFMGData *pfmg_data = (hypre_PFMGData *)pfmg_vdata; *zero_guess = (pfmg_data -> zero_guess); return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_PFMGSetRelaxType( void *pfmg_vdata, HYPRE_Int relax_type ) { hypre_PFMGData *pfmg_data = (hypre_PFMGData *)pfmg_vdata; (pfmg_data -> relax_type) = relax_type; return hypre_error_flag; } HYPRE_Int hypre_PFMGGetRelaxType( void *pfmg_vdata, HYPRE_Int * relax_type ) { hypre_PFMGData *pfmg_data = (hypre_PFMGData *)pfmg_vdata; *relax_type = (pfmg_data -> relax_type); return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_PFMGSetJacobiWeight( void *pfmg_vdata, HYPRE_Real weight ) { hypre_PFMGData *pfmg_data = (hypre_PFMGData *)pfmg_vdata; (pfmg_data -> jacobi_weight) = weight; (pfmg_data -> usr_jacobi_weight) = 1; return hypre_error_flag; } HYPRE_Int hypre_PFMGGetJacobiWeight( void *pfmg_vdata, HYPRE_Real *weight ) { hypre_PFMGData *pfmg_data = (hypre_PFMGData *)pfmg_vdata; *weight = (pfmg_data -> jacobi_weight); return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_PFMGSetRAPType( void *pfmg_vdata, HYPRE_Int rap_type ) { hypre_PFMGData *pfmg_data = (hypre_PFMGData *)pfmg_vdata; (pfmg_data -> rap_type) = rap_type; return hypre_error_flag; } HYPRE_Int hypre_PFMGGetRAPType( void *pfmg_vdata, HYPRE_Int * rap_type ) { hypre_PFMGData *pfmg_data = (hypre_PFMGData *)pfmg_vdata; *rap_type = (pfmg_data -> rap_type); return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_PFMGSetNumPreRelax( void *pfmg_vdata, HYPRE_Int num_pre_relax ) { hypre_PFMGData *pfmg_data = (hypre_PFMGData *)pfmg_vdata; (pfmg_data -> num_pre_relax) = num_pre_relax; return hypre_error_flag; } HYPRE_Int hypre_PFMGGetNumPreRelax( void *pfmg_vdata, HYPRE_Int * num_pre_relax ) { hypre_PFMGData *pfmg_data = (hypre_PFMGData *)pfmg_vdata; *num_pre_relax = (pfmg_data -> num_pre_relax); return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_PFMGSetNumPostRelax( void *pfmg_vdata, HYPRE_Int num_post_relax ) { hypre_PFMGData *pfmg_data = (hypre_PFMGData *)pfmg_vdata; (pfmg_data -> num_post_relax) = num_post_relax; return hypre_error_flag; } HYPRE_Int hypre_PFMGGetNumPostRelax( void *pfmg_vdata, HYPRE_Int * num_post_relax ) { hypre_PFMGData *pfmg_data = (hypre_PFMGData *)pfmg_vdata; *num_post_relax = (pfmg_data -> num_post_relax); return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_PFMGSetSkipRelax( void *pfmg_vdata, HYPRE_Int skip_relax ) { hypre_PFMGData *pfmg_data = (hypre_PFMGData *)pfmg_vdata; (pfmg_data -> skip_relax) = skip_relax; return hypre_error_flag; } HYPRE_Int hypre_PFMGGetSkipRelax( void *pfmg_vdata, HYPRE_Int *skip_relax ) { hypre_PFMGData *pfmg_data = (hypre_PFMGData *)pfmg_vdata; *skip_relax = (pfmg_data -> skip_relax); return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_PFMGSetDxyz( void *pfmg_vdata, HYPRE_Real *dxyz ) { hypre_PFMGData *pfmg_data = (hypre_PFMGData *)pfmg_vdata; (pfmg_data -> dxyz[0]) = dxyz[0]; (pfmg_data -> dxyz[1]) = dxyz[1]; (pfmg_data -> dxyz[2]) = dxyz[2]; return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_PFMGSetLogging( void *pfmg_vdata, HYPRE_Int logging) { hypre_PFMGData *pfmg_data = (hypre_PFMGData *)pfmg_vdata; (pfmg_data -> logging) = logging; return hypre_error_flag; } HYPRE_Int hypre_PFMGGetLogging( void *pfmg_vdata, HYPRE_Int * logging) { hypre_PFMGData *pfmg_data = (hypre_PFMGData *)pfmg_vdata; *logging = (pfmg_data -> logging); return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_PFMGSetPrintLevel( void *pfmg_vdata, HYPRE_Int print_level) { hypre_PFMGData *pfmg_data = (hypre_PFMGData *)pfmg_vdata; (pfmg_data -> print_level) = print_level; return hypre_error_flag; } HYPRE_Int hypre_PFMGGetPrintLevel( void *pfmg_vdata, HYPRE_Int * print_level) { hypre_PFMGData *pfmg_data = (hypre_PFMGData *)pfmg_vdata; *print_level = (pfmg_data -> print_level); return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_PFMGGetNumIterations( void *pfmg_vdata, HYPRE_Int *num_iterations ) { hypre_PFMGData *pfmg_data = (hypre_PFMGData *)pfmg_vdata; *num_iterations = (pfmg_data -> num_iterations); return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_PFMGPrintLogging( void *pfmg_vdata, HYPRE_Int myid) { hypre_PFMGData *pfmg_data = (hypre_PFMGData *)pfmg_vdata; HYPRE_Int i; HYPRE_Int num_iterations = (pfmg_data -> num_iterations); HYPRE_Int logging = (pfmg_data -> logging); HYPRE_Int print_level = (pfmg_data -> print_level); HYPRE_Real *norms = (pfmg_data -> norms); HYPRE_Real *rel_norms = (pfmg_data -> rel_norms); if (myid == 0) { if (print_level > 0) { if (logging > 0) { for (i = 0; i < num_iterations; i++) { hypre_printf("Residual norm[%d] = %e ", i, norms[i]); hypre_printf("Relative residual norm[%d] = %e\n", i, rel_norms[i]); } } } } return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_PFMGGetFinalRelativeResidualNorm( void *pfmg_vdata, HYPRE_Real *relative_residual_norm ) { hypre_PFMGData *pfmg_data = (hypre_PFMGData *)pfmg_vdata; HYPRE_Int max_iter = (pfmg_data -> max_iter); HYPRE_Int num_iterations = (pfmg_data -> num_iterations); HYPRE_Int logging = (pfmg_data -> logging); HYPRE_Real *rel_norms = (pfmg_data -> rel_norms); if (logging > 0) { if (max_iter == 0) { hypre_error_in_arg(1); } else if (num_iterations == max_iter) { *relative_residual_norm = rel_norms[num_iterations - 1]; } else { *relative_residual_norm = rel_norms[num_iterations]; } } return hypre_error_flag; } #if 0 //defined(HYPRE_USING_CUDA) || defined(HYPRE_USING_HIP) HYPRE_Int hypre_PFMGSetDeviceLevel( void *pfmg_vdata, HYPRE_Int device_level ) { hypre_PFMGData *pfmg_data = (hypre_PFMGData *)pfmg_vdata; (pfmg_data -> devicelevel) = device_level; return hypre_error_flag; } #endif hypre-2.33.0/src/struct_ls/pfmg.h000066400000000000000000000056241477326011500166560ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * Header info for the PFMG solver * *****************************************************************************/ #ifndef hypre_PFMG_HEADER #define hypre_PFMG_HEADER /*-------------------------------------------------------------------------- * hypre_PFMGData: *--------------------------------------------------------------------------*/ typedef struct { MPI_Comm comm; HYPRE_Real tol; HYPRE_Int max_iter; HYPRE_Int rel_change; HYPRE_Int zero_guess; HYPRE_Int max_levels; /* max_level <= 0 means no limit */ HYPRE_Int relax_type; /* type of relaxation to use */ HYPRE_Real jacobi_weight; /* weighted jacobi weight */ HYPRE_Int usr_jacobi_weight; /* indicator flag for user weight */ HYPRE_Int rap_type; /* controls choice of RAP codes */ HYPRE_Int num_pre_relax; /* number of pre relaxation sweeps */ HYPRE_Int num_post_relax; /* number of post relaxation sweeps */ HYPRE_Int skip_relax; /* flag to allow skipping relaxation */ HYPRE_Real relax_weight; HYPRE_Real dxyz[3]; /* parameters used to determine cdir */ HYPRE_Int num_levels; HYPRE_Int *cdir_l; /* coarsening directions */ HYPRE_Int *active_l; /* flags to relax on level l*/ hypre_StructGrid **grid_l; hypre_StructGrid **P_grid_l; HYPRE_MemoryLocation memory_location; /* memory location of data */ HYPRE_Real *data; HYPRE_Real *data_const; hypre_StructMatrix **A_l; hypre_StructMatrix **P_l; hypre_StructMatrix **RT_l; hypre_StructVector **b_l; hypre_StructVector **x_l; /* temp vectors */ hypre_StructVector **tx_l; hypre_StructVector **r_l; hypre_StructVector **e_l; void **relax_data_l; void **matvec_data_l; void **restrict_data_l; void **interp_data_l; /* log info (always logged) */ HYPRE_Int num_iterations; HYPRE_Int time_index; HYPRE_Int print_level; /* additional log info (logged when `logging' > 0) */ HYPRE_Int logging; HYPRE_Real *norms; HYPRE_Real *rel_norms; #if 0 //defined(HYPRE_USING_CUDA) || defined(HYPRE_USING_HIP) HYPRE_Int devicelevel; #endif } hypre_PFMGData; #endif hypre-2.33.0/src/struct_ls/pfmg2_setup_rap.c000066400000000000000000002613371477326011500210220ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "_hypre_struct_ls.h" #include "_hypre_struct_mv.hpp" #include "pfmg.h" /*-------------------------------------------------------------------------- * Macro to "change coordinates". This routine is written as though * coarsening is being done in the y-direction. This macro is used to * allow for coarsening to be done in the x-direction also. *--------------------------------------------------------------------------*/ #define MapIndex(in_index, cdir, out_index) \ hypre_IndexD(out_index, 2) = hypre_IndexD(in_index, 2); \ hypre_IndexD(out_index, cdir) = hypre_IndexD(in_index, 1); \ cdir = (cdir + 1) % 2; \ hypre_IndexD(out_index, cdir) = hypre_IndexD(in_index, 0); \ cdir = (cdir + 1) % 2; /*-------------------------------------------------------------------------- * Sets up new coarse grid operator stucture. *--------------------------------------------------------------------------*/ hypre_StructMatrix * hypre_PFMG2CreateRAPOp( hypre_StructMatrix *R, hypre_StructMatrix *A, hypre_StructMatrix *P, hypre_StructGrid *coarse_grid, HYPRE_Int cdir ) { HYPRE_UNUSED_VAR(R); HYPRE_UNUSED_VAR(P); hypre_StructMatrix *RAP; hypre_Index *RAP_stencil_shape; hypre_StructStencil *RAP_stencil; HYPRE_Int RAP_stencil_size; HYPRE_Int RAP_stencil_dim; HYPRE_Int RAP_num_ghost[] = {1, 1, 1, 1, 1, 1}; hypre_Index index_temp; HYPRE_Int j, i; HYPRE_Int stencil_rank; RAP_stencil_dim = 2; /*----------------------------------------------------------------------- * Define RAP_stencil *-----------------------------------------------------------------------*/ stencil_rank = 0; /*----------------------------------------------------------------------- * non-symmetric case *-----------------------------------------------------------------------*/ if (!hypre_StructMatrixSymmetric(A)) { /*-------------------------------------------------------------------- * 5 or 9 point fine grid stencil produces 9 point RAP *--------------------------------------------------------------------*/ RAP_stencil_size = 9; RAP_stencil_shape = hypre_CTAlloc(hypre_Index, RAP_stencil_size, HYPRE_MEMORY_HOST); for (j = -1; j < 2; j++) { for (i = -1; i < 2; i++) { /*-------------------------------------------------------------- * Storage for 9 elements (c,w,e,n,s,sw,se,nw,se) *--------------------------------------------------------------*/ hypre_SetIndex3(index_temp, i, j, 0); MapIndex(index_temp, cdir, RAP_stencil_shape[stencil_rank]); stencil_rank++; } } } /*----------------------------------------------------------------------- * symmetric case *-----------------------------------------------------------------------*/ else { /*-------------------------------------------------------------------- * 5 or 9 point fine grid stencil produces 9 point RAP * Only store the lower triangular part + diagonal = 5 entries, * lower triangular means the lower triangular part on the matrix * in the standard lexicographic ordering. *--------------------------------------------------------------------*/ RAP_stencil_size = 5; RAP_stencil_shape = hypre_CTAlloc(hypre_Index, RAP_stencil_size, HYPRE_MEMORY_HOST); for (j = -1; j < 1; j++) { for (i = -1; i < 2; i++) { /*-------------------------------------------------------------- * Store 5 elements in (c,w,s,sw,se) *--------------------------------------------------------------*/ if ( i + j <= 0 ) { hypre_SetIndex3(index_temp, i, j, 0); MapIndex(index_temp, cdir, RAP_stencil_shape[stencil_rank]); stencil_rank++; } } } } RAP_stencil = hypre_StructStencilCreate(RAP_stencil_dim, RAP_stencil_size, RAP_stencil_shape); RAP = hypre_StructMatrixCreate(hypre_StructMatrixComm(A), coarse_grid, RAP_stencil); hypre_StructStencilDestroy(RAP_stencil); /*----------------------------------------------------------------------- * Coarse operator in symmetric iff fine operator is *-----------------------------------------------------------------------*/ hypre_StructMatrixSymmetric(RAP) = hypre_StructMatrixSymmetric(A); /*----------------------------------------------------------------------- * Set number of ghost points - one one each boundary *-----------------------------------------------------------------------*/ hypre_StructMatrixSetNumGhost(RAP, RAP_num_ghost); return RAP; } /*-------------------------------------------------------------------------- * Routines to build RAP. These routines are fairly general * 1) No assumptions about symmetry of A * 2) No assumption that R = transpose(P) * 3) 5 or 9-point fine grid A * * I am, however, assuming that the c-to-c interpolation is the identity. * * I've written two routines - hypre_PFMG2BuildRAPSym to build the * lower triangular part of RAP (including the diagonal) and * hypre_PFMG2BuildRAPNoSym to build the upper triangular part of RAP * (excluding the diagonal). So using symmetric storage, only the * first routine would be called. With full storage both would need to * be called. * *--------------------------------------------------------------------------*/ HYPRE_Int hypre_PFMG2BuildRAPSym( hypre_StructMatrix *A, hypre_StructMatrix *P, hypre_StructMatrix *R, HYPRE_Int cdir, hypre_Index cindex, hypre_Index cstride, hypre_StructMatrix *RAP ) { hypre_StructStencil *fine_stencil; HYPRE_Int fine_stencil_size; hypre_StructGrid *fgrid; HYPRE_Int *fgrid_ids; hypre_StructGrid *cgrid; hypre_BoxArray *cgrid_boxes; HYPRE_Int *cgrid_ids; HYPRE_Int constant_coefficient; HYPRE_Int constant_coefficient_A; HYPRE_Int fi, ci; fine_stencil = hypre_StructMatrixStencil(A); fine_stencil_size = hypre_StructStencilSize(fine_stencil); fgrid = hypre_StructMatrixGrid(A); fgrid_ids = hypre_StructGridIDs(fgrid); cgrid = hypre_StructMatrixGrid(RAP); cgrid_boxes = hypre_StructGridBoxes(cgrid); cgrid_ids = hypre_StructGridIDs(cgrid); constant_coefficient = hypre_StructMatrixConstantCoefficient(RAP); constant_coefficient_A = hypre_StructMatrixConstantCoefficient(A); hypre_assert( constant_coefficient == 0 || constant_coefficient == 1 ); hypre_assert( hypre_StructMatrixConstantCoefficient(R) == constant_coefficient ); hypre_assert( hypre_StructMatrixConstantCoefficient(P) == constant_coefficient ); if (constant_coefficient == 1 ) { hypre_assert( constant_coefficient_A == 1 ); } else { hypre_assert( constant_coefficient_A == 0 || constant_coefficient_A == 2 ); } fi = 0; hypre_ForBoxI(ci, cgrid_boxes) { while (fgrid_ids[fi] != cgrid_ids[ci]) { fi++; } /*----------------------------------------------------------------- * Switch statement to direct control to apropriate BoxLoop depending * on stencil size. Default is full 9-point. *-----------------------------------------------------------------*/ switch (fine_stencil_size) { /*-------------------------------------------------------------- * Loop for symmetric 5-point fine grid operator; produces a * symmetric 9-point coarse grid operator. We calculate only the * lower triangular stencil entries: (southwest, south, southeast, * west, and center). *--------------------------------------------------------------*/ case 5: if ( constant_coefficient == 1 ) { hypre_PFMG2BuildRAPSym_onebox_FSS5_CC1( ci, fi, A, P, R, cdir, cindex, cstride, RAP ); } else { hypre_PFMG2BuildRAPSym_onebox_FSS5_CC0( ci, fi, A, P, R, cdir, cindex, cstride, RAP ); } break; /*-------------------------------------------------------------- * Loop for symmetric 9-point fine grid operator; produces a * symmetric 9-point coarse grid operator. We calculate only the * lower triangular stencil entries: (southwest, south, southeast, * west, and center). *--------------------------------------------------------------*/ default: if ( constant_coefficient == 1 ) { hypre_PFMG2BuildRAPSym_onebox_FSS9_CC1( ci, fi, A, P, R, cdir, cindex, cstride, RAP ); } else { hypre_PFMG2BuildRAPSym_onebox_FSS9_CC0( ci, fi, A, P, R, cdir, cindex, cstride, RAP ); } break; } /* end switch statement */ } /* end ForBoxI */ return hypre_error_flag; } /* for fine stencil size 5, constant coefficient 0 */ HYPRE_Int hypre_PFMG2BuildRAPSym_onebox_FSS5_CC0( HYPRE_Int ci, HYPRE_Int fi, hypre_StructMatrix *A, hypre_StructMatrix *P, hypre_StructMatrix *R, HYPRE_Int cdir, hypre_Index cindex, hypre_Index cstride, hypre_StructMatrix *RAP ) { hypre_Index index; hypre_Index index_temp; hypre_StructGrid *cgrid; hypre_BoxArray *cgrid_boxes; hypre_IndexRef cstart; hypre_Index stridec; hypre_Index fstart; hypre_IndexRef stridef; hypre_Index loop_size; HYPRE_Int constant_coefficient_A; hypre_Box *A_dbox; hypre_Box *P_dbox; hypre_Box *R_dbox; hypre_Box *RAP_dbox; hypre_Box *cgrid_box; HYPRE_Real *pa, *pb; HYPRE_Real *ra, *rb; HYPRE_Real *a_cc, *a_cw, *a_ce, *a_cs, *a_cn; HYPRE_Real a_cw_offd, a_cw_offdm1, a_cw_offdp1, a_ce_offdm1; HYPRE_Real a_cs_offd, a_cs_offdm1, a_cs_offdp1, a_cn_offd, a_cn_offdm1; HYPRE_Real *rap_cc, *rap_cw, *rap_cs; HYPRE_Real *rap_csw, *rap_cse; HYPRE_Int iA_offd, iA_offdm1, iA_offdp1; HYPRE_Int yOffsetA, yOffsetA_diag, yOffsetA_offd; HYPRE_Int xOffsetP; HYPRE_Int yOffsetP; stridef = cstride; hypre_SetIndex3(stridec, 1, 1, 1); cgrid = hypre_StructMatrixGrid(RAP); cgrid_boxes = hypre_StructGridBoxes(cgrid); constant_coefficient_A = hypre_StructMatrixConstantCoefficient(A); cgrid_box = hypre_BoxArrayBox(cgrid_boxes, ci); cstart = hypre_BoxIMin(cgrid_box); hypre_StructMapCoarseToFine(cstart, cindex, cstride, fstart); A_dbox = hypre_BoxArrayBox(hypre_StructMatrixDataSpace(A), fi); P_dbox = hypre_BoxArrayBox(hypre_StructMatrixDataSpace(P), fi); R_dbox = hypre_BoxArrayBox(hypre_StructMatrixDataSpace(R), fi); RAP_dbox = hypre_BoxArrayBox(hypre_StructMatrixDataSpace(RAP), ci); /*----------------------------------------------------------------- * Extract pointers for interpolation operator: * pa is pointer for weight for f-point above c-point * pb is pointer for weight for f-point below c-point *-----------------------------------------------------------------*/ hypre_SetIndex3(index_temp, 0, -1, 0); MapIndex(index_temp, cdir, index); pa = hypre_StructMatrixExtractPointerByIndex(P, fi, index); hypre_SetIndex3(index_temp, 0, 1, 0); MapIndex(index_temp, cdir, index); pb = hypre_StructMatrixExtractPointerByIndex(P, fi, index); //RL PTROFFSET HYPRE_Int pbOffset = hypre_BoxOffsetDistance(P_dbox, index); /*----------------------------------------------------------------- * Extract pointers for restriction operator: * ra is pointer for weight for f-point above c-point * rb is pointer for weight for f-point below c-point *-----------------------------------------------------------------*/ hypre_SetIndex3(index_temp, 0, -1, 0); MapIndex(index_temp, cdir, index); ra = hypre_StructMatrixExtractPointerByIndex(R, fi, index); hypre_SetIndex3(index_temp, 0, 1, 0); MapIndex(index_temp, cdir, index); rb = hypre_StructMatrixExtractPointerByIndex(R, fi, index); //RL PTROFFSET HYPRE_Int rbOffset = hypre_BoxOffsetDistance(R_dbox, index); /*----------------------------------------------------------------- * Extract pointers for 5-point fine grid operator: * * a_cc is pointer for center coefficient * a_cw is pointer for west coefficient * a_ce is pointer for east coefficient * a_cs is pointer for south coefficient * a_cn is pointer for north coefficient *-----------------------------------------------------------------*/ hypre_SetIndex3(index_temp, 0, 0, 0); MapIndex(index_temp, cdir, index); a_cc = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index_temp, -1, 0, 0); MapIndex(index_temp, cdir, index); a_cw = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index_temp, 1, 0, 0); MapIndex(index_temp, cdir, index); a_ce = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index_temp, 0, -1, 0); MapIndex(index_temp, cdir, index); a_cs = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index_temp, 0, 1, 0); MapIndex(index_temp, cdir, index); a_cn = hypre_StructMatrixExtractPointerByIndex(A, fi, index); /*----------------------------------------------------------------- * Extract pointers for coarse grid operator - always 9-point: * * We build only the lower triangular part (plus diagonal). * * rap_cc is pointer for center coefficient (etc.) *-----------------------------------------------------------------*/ hypre_SetIndex3(index_temp, 0, 0, 0); MapIndex(index_temp, cdir, index); rap_cc = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index_temp, -1, 0, 0); MapIndex(index_temp, cdir, index); rap_cw = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index_temp, 0, -1, 0); MapIndex(index_temp, cdir, index); rap_cs = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index_temp, -1, -1, 0); MapIndex(index_temp, cdir, index); rap_csw = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index_temp, 1, -1, 0); MapIndex(index_temp, cdir, index); rap_cse = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); /*----------------------------------------------------------------- * Define offsets for fine grid stencil and interpolation * * In the BoxLoop below I assume iA and iP refer to data associated * with the point which we are building the stencil for. The below * Offsets are used in refering to data associated with other points. *-----------------------------------------------------------------*/ hypre_SetIndex3(index_temp, 0, 1, 0); MapIndex(index_temp, cdir, index); yOffsetP = hypre_BoxOffsetDistance(P_dbox, index); if ( constant_coefficient_A == 0 ) { yOffsetA = hypre_BoxOffsetDistance(A_dbox, index); } else { yOffsetA_offd = 0; yOffsetA_diag = hypre_BoxOffsetDistance(A_dbox, index); } hypre_SetIndex3(index_temp, 1, 0, 0); MapIndex(index_temp, cdir, index); xOffsetP = hypre_BoxOffsetDistance(P_dbox, index); /*-------------------------------------------------------------- * Loop for symmetric 5-point fine grid operator; produces a * symmetric 9-point coarse grid operator. We calculate only the * lower triangular stencil entries: (southwest, south, southeast, * west, and center). *--------------------------------------------------------------*/ hypre_BoxGetSize(cgrid_box, loop_size); if ( constant_coefficient_A == 0 ) { #define DEVICE_VAR is_device_ptr(rap_csw,rb,a_cw,pa,rap_cs,a_cc,a_cs,rap_cse,a_ce,rap_cw,pb,ra,rap_cc,a_cn) hypre_BoxLoop4Begin(hypre_StructMatrixNDim(A), loop_size, P_dbox, cstart, stridec, iP, R_dbox, cstart, stridec, iR, A_dbox, fstart, stridef, iA, RAP_dbox, cstart, stridec, iAc); { HYPRE_Int iAm1 = iA - yOffsetA; HYPRE_Int iAp1 = iA + yOffsetA; HYPRE_Int iP1 = iP - yOffsetP - xOffsetP; rap_csw[iAc] = rb[iR - rbOffset] * a_cw[iAm1] * pa[iP1]; iP1 = iP - yOffsetP; rap_cs[iAc] = rb[iR - rbOffset] * a_cc[iAm1] * pa[iP1] + rb[iR - rbOffset] * a_cs[iAm1] + a_cs[iA] * pa[iP1]; iP1 = iP - yOffsetP + xOffsetP; rap_cse[iAc] = rb[iR - rbOffset] * a_ce[iAm1] * pa[iP1]; iP1 = iP - xOffsetP; rap_cw[iAc] = a_cw[iA] + rb[iR - rbOffset] * a_cw[iAm1] * pb[iP1 - pbOffset] + ra[iR] * a_cw[iAp1] * pa[iP1]; rap_cc[iAc] = a_cc[iA] + rb[iR - rbOffset] * a_cc[iAm1] * pb[iP - pbOffset] + ra[iR] * a_cc[iAp1] * pa[iP] + rb[iR - rbOffset] * a_cn[iAm1] + ra[iR] * a_cs[iAp1] + a_cs[iA] * pb[iP - pbOffset] + a_cn[iA] * pa[iP]; } hypre_BoxLoop4End(iP, iR, iA, iAc); #undef DEVICE_VAR } else { iA_offd = 0; iA_offdm1 = iA_offd - yOffsetA_offd; iA_offdp1 = iA_offd + yOffsetA_offd; a_cn_offd = a_cn[iA_offd]; a_cn_offdm1 = a_cn[iA_offdm1]; a_cs_offd = a_cs[iA_offd]; a_cs_offdm1 = a_cs[iA_offdm1]; a_cs_offdp1 = a_cs[iA_offdp1]; a_cw_offd = a_cw[iA_offd]; a_cw_offdp1 = a_cw[iA_offdp1]; a_cw_offdm1 = a_cw[iA_offdm1]; a_ce_offdm1 = a_ce[iA_offdm1]; #define DEVICE_VAR is_device_ptr(rap_csw,rb,pa,rap_cs,a_cc,rap_cse,rap_cw,pb,ra,rap_cc) hypre_BoxLoop4Begin(hypre_StructMatrixNDim(A), loop_size, P_dbox, cstart, stridec, iP, R_dbox, cstart, stridec, iR, A_dbox, fstart, stridef, iA, RAP_dbox, cstart, stridec, iAc); { HYPRE_Int iAm1 = iA - yOffsetA_diag; HYPRE_Int iAp1 = iA + yOffsetA_diag; HYPRE_Int iP1 = iP - yOffsetP - xOffsetP; rap_csw[iAc] = rb[iR - rbOffset] * a_cw_offdm1 * pa[iP1]; iP1 = iP - yOffsetP; rap_cs[iAc] = rb[iR - rbOffset] * a_cc[iAm1] * pa[iP1] + rb[iR - rbOffset] * a_cs_offdm1 + a_cs_offd * pa[iP1]; iP1 = iP - yOffsetP + xOffsetP; rap_cse[iAc] = rb[iR - rbOffset] * a_ce_offdm1 * pa[iP1]; iP1 = iP - xOffsetP; rap_cw[iAc] = a_cw_offd + rb[iR - rbOffset] * a_cw_offdm1 * pb[iP1 - pbOffset] + ra[iR] * a_cw_offdp1 * pa[iP1]; rap_cc[iAc] = a_cc[iA] + rb[iR - rbOffset] * a_cc[iAm1] * pb[iP - pbOffset] + ra[iR] * a_cc[iAp1] * pa[iP] + rb[iR - rbOffset] * a_cn_offdm1 + ra[iR] * a_cs_offdp1 + a_cs_offd * pb[iP - pbOffset] + a_cn_offd * pa[iP]; } hypre_BoxLoop4End(iP, iR, iA, iAc); #undef DEVICE_VAR } /* } *//* end ForBoxI */ return hypre_error_flag; } /* for fine stencil size 5, constant coefficient 1 */ HYPRE_Int hypre_PFMG2BuildRAPSym_onebox_FSS5_CC1( HYPRE_Int ci, HYPRE_Int fi, hypre_StructMatrix *A, hypre_StructMatrix *P, hypre_StructMatrix *R, HYPRE_Int cdir, hypre_Index cindex, hypre_Index cstride, hypre_StructMatrix *RAP ) { hypre_Index index; hypre_Index index_temp; hypre_StructGrid *cgrid; hypre_BoxArray *cgrid_boxes; hypre_Box *cgrid_box; hypre_IndexRef cstart; hypre_Index fstart; HYPRE_Real *pa, *pb; HYPRE_Real *ra, *rb; HYPRE_Real *a_cc, *a_cw, *a_ce, *a_cs, *a_cn; HYPRE_Real *rap_cc, *rap_cw, *rap_cs; HYPRE_Real *rap_csw, *rap_cse; HYPRE_Int iA, iAm1, iAp1; HYPRE_Int iAc; HYPRE_Int iP, iP1; HYPRE_Int iR; HYPRE_Int yOffsetA; HYPRE_Int xOffsetP; HYPRE_Int yOffsetP; cgrid = hypre_StructMatrixGrid(RAP); cgrid_boxes = hypre_StructGridBoxes(cgrid); cgrid_box = hypre_BoxArrayBox(cgrid_boxes, ci); cstart = hypre_BoxIMin(cgrid_box); hypre_StructMapCoarseToFine(cstart, cindex, cstride, fstart); /*----------------------------------------------------------------- * Extract pointers for interpolation operator: * pa is pointer for weight for f-point above c-point * pb is pointer for weight for f-point below c-point *-----------------------------------------------------------------*/ hypre_SetIndex3(index_temp, 0, -1, 0); MapIndex(index_temp, cdir, index); pa = hypre_StructMatrixExtractPointerByIndex(P, fi, index); hypre_SetIndex3(index_temp, 0, 1, 0); MapIndex(index_temp, cdir, index); pb = hypre_StructMatrixExtractPointerByIndex(P, fi, index); /*----------------------------------------------------------------- * Extract pointers for restriction operator: * ra is pointer for weight for f-point above c-point * rb is pointer for weight for f-point below c-point *-----------------------------------------------------------------*/ hypre_SetIndex3(index_temp, 0, -1, 0); MapIndex(index_temp, cdir, index); ra = hypre_StructMatrixExtractPointerByIndex(R, fi, index); hypre_SetIndex3(index_temp, 0, 1, 0); MapIndex(index_temp, cdir, index); rb = hypre_StructMatrixExtractPointerByIndex(R, fi, index); /*----------------------------------------------------------------- * Extract pointers for 5-point fine grid operator: * * a_cc is pointer for center coefficient * a_cw is pointer for west coefficient * a_ce is pointer for east coefficient * a_cs is pointer for south coefficient * a_cn is pointer for north coefficient *-----------------------------------------------------------------*/ hypre_SetIndex3(index_temp, 0, 0, 0); MapIndex(index_temp, cdir, index); a_cc = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index_temp, -1, 0, 0); MapIndex(index_temp, cdir, index); a_cw = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index_temp, 1, 0, 0); MapIndex(index_temp, cdir, index); a_ce = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index_temp, 0, -1, 0); MapIndex(index_temp, cdir, index); a_cs = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index_temp, 0, 1, 0); MapIndex(index_temp, cdir, index); a_cn = hypre_StructMatrixExtractPointerByIndex(A, fi, index); /*----------------------------------------------------------------- * Extract pointers for coarse grid operator - always 9-point: * * We build only the lower triangular part (plus diagonal). * * rap_cc is pointer for center coefficient (etc.) *-----------------------------------------------------------------*/ hypre_SetIndex3(index_temp, 0, 0, 0); MapIndex(index_temp, cdir, index); rap_cc = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index_temp, -1, 0, 0); MapIndex(index_temp, cdir, index); rap_cw = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index_temp, 0, -1, 0); MapIndex(index_temp, cdir, index); rap_cs = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index_temp, -1, -1, 0); MapIndex(index_temp, cdir, index); rap_csw = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index_temp, 1, -1, 0); MapIndex(index_temp, cdir, index); rap_cse = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); /*----------------------------------------------------------------- * Define offsets for fine grid stencil and interpolation * * In the BoxLoop below I assume iA and iP refer to data associated * with the point which we are building the stencil for. The below * Offsets are used in refering to data associated with other points. *-----------------------------------------------------------------*/ hypre_SetIndex3(index_temp, 0, 1, 0); MapIndex(index_temp, cdir, index); yOffsetA = 0; yOffsetP = 0; hypre_SetIndex3(index_temp, 1, 0, 0); MapIndex(index_temp, cdir, index); xOffsetP = 0; /*----------------------------------------------------------------- * Switch statement to direct control to apropriate BoxLoop depending * on stencil size. Default is full 9-point. *-----------------------------------------------------------------*/ /*-------------------------------------------------------------- * Loop for symmetric 5-point fine grid operator; produces a * symmetric 9-point coarse grid operator. We calculate only the * lower triangular stencil entries: (southwest, south, southeast, * west, and center). *--------------------------------------------------------------*/ iP = 0; iR = 0; iA = 0; iAc = 0; iAm1 = iA - yOffsetA; iAp1 = iA + yOffsetA; iP1 = iP - yOffsetP - xOffsetP; rap_csw[iAc] = rb[iR] * a_cw[iAm1] * pa[iP1]; iP1 = iP - yOffsetP; rap_cs[iAc] = rb[iR] * a_cc[iAm1] * pa[iP1] + rb[iR] * a_cs[iAm1] + a_cs[iA] * pa[iP1]; iP1 = iP - yOffsetP + xOffsetP; rap_cse[iAc] = rb[iR] * a_ce[iAm1] * pa[iP1]; iP1 = iP - xOffsetP; rap_cw[iAc] = a_cw[iA] + rb[iR] * a_cw[iAm1] * pb[iP1] + ra[iR] * a_cw[iAp1] * pa[iP1]; rap_cc[iAc] = a_cc[iA] + rb[iR] * a_cc[iAm1] * pb[iP] + ra[iR] * a_cc[iAp1] * pa[iP] + rb[iR] * a_cn[iAm1] + ra[iR] * a_cs[iAp1] + a_cs[iA] * pb[iP] + a_cn[iA] * pa[iP]; /* } *//* end ForBoxI */ return hypre_error_flag; } /* for fine stencil size 9, constant coefficient 0 */ HYPRE_Int hypre_PFMG2BuildRAPSym_onebox_FSS9_CC0( HYPRE_Int ci, HYPRE_Int fi, hypre_StructMatrix *A, hypre_StructMatrix *P, hypre_StructMatrix *R, HYPRE_Int cdir, hypre_Index cindex, hypre_Index cstride, hypre_StructMatrix *RAP ) { hypre_Index index; hypre_Index index_temp; hypre_StructGrid *cgrid; hypre_BoxArray *cgrid_boxes; hypre_Box *cgrid_box; hypre_IndexRef cstart; hypre_Index stridec; hypre_Index fstart; hypre_IndexRef stridef; hypre_Index loop_size; HYPRE_Int constant_coefficient_A; hypre_Box *A_dbox; hypre_Box *P_dbox; hypre_Box *R_dbox; hypre_Box *RAP_dbox; HYPRE_Real *pa, *pb; HYPRE_Real *ra, *rb; HYPRE_Real *a_cc, *a_cw, *a_ce, *a_cs, *a_cn; HYPRE_Real *a_csw, *a_cse, *a_cnw; HYPRE_Real a_cw_offd, a_cw_offdm1, a_cw_offdp1, a_ce_offdm1; HYPRE_Real a_cs_offd, a_cs_offdm1, a_cs_offdp1, a_cn_offd, a_cn_offdm1; HYPRE_Real a_csw_offd, a_csw_offdm1, a_csw_offdp1, a_cse_offd, a_cse_offdm1; HYPRE_Real a_cnw_offd, a_cnw_offdm1; HYPRE_Real *rap_cc, *rap_cw, *rap_cs; HYPRE_Real *rap_csw, *rap_cse; HYPRE_Int iA_offd, iA_offdm1, iA_offdp1; HYPRE_Int yOffsetA, yOffsetA_diag, yOffsetA_offd; HYPRE_Int xOffsetP; HYPRE_Int yOffsetP; stridef = cstride; hypre_SetIndex3(stridec, 1, 1, 1); cgrid = hypre_StructMatrixGrid(RAP); cgrid_boxes = hypre_StructGridBoxes(cgrid); constant_coefficient_A = hypre_StructMatrixConstantCoefficient(A); cgrid_box = hypre_BoxArrayBox(cgrid_boxes, ci); cstart = hypre_BoxIMin(cgrid_box); hypre_StructMapCoarseToFine(cstart, cindex, cstride, fstart); A_dbox = hypre_BoxArrayBox(hypre_StructMatrixDataSpace(A), fi); P_dbox = hypre_BoxArrayBox(hypre_StructMatrixDataSpace(P), fi); R_dbox = hypre_BoxArrayBox(hypre_StructMatrixDataSpace(R), fi); RAP_dbox = hypre_BoxArrayBox(hypre_StructMatrixDataSpace(RAP), ci); /*----------------------------------------------------------------- * Extract pointers for interpolation operator: * pa is pointer for weight for f-point above c-point * pb is pointer for weight for f-point below c-point *-----------------------------------------------------------------*/ hypre_SetIndex3(index_temp, 0, -1, 0); MapIndex(index_temp, cdir, index); pa = hypre_StructMatrixExtractPointerByIndex(P, fi, index); hypre_SetIndex3(index_temp, 0, 1, 0); MapIndex(index_temp, cdir, index); pb = hypre_StructMatrixExtractPointerByIndex(P, fi, index); //RL PTROFFSET HYPRE_Int pbOffset = hypre_BoxOffsetDistance(P_dbox, index); /*----------------------------------------------------------------- * Extract pointers for restriction operator: * ra is pointer for weight for f-point above c-point * rb is pointer for weight for f-point below c-point *-----------------------------------------------------------------*/ hypre_SetIndex3(index_temp, 0, -1, 0); MapIndex(index_temp, cdir, index); ra = hypre_StructMatrixExtractPointerByIndex(R, fi, index); hypre_SetIndex3(index_temp, 0, 1, 0); MapIndex(index_temp, cdir, index); rb = hypre_StructMatrixExtractPointerByIndex(R, fi, index); HYPRE_Int rbOffset = hypre_BoxOffsetDistance(R_dbox, index); /*----------------------------------------------------------------- * Extract pointers for 5-point fine grid operator: * * a_cc is pointer for center coefficient * a_cw is pointer for west coefficient * a_ce is pointer for east coefficient * a_cs is pointer for south coefficient * a_cn is pointer for north coefficient *-----------------------------------------------------------------*/ hypre_SetIndex3(index_temp, 0, 0, 0); MapIndex(index_temp, cdir, index); a_cc = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index_temp, -1, 0, 0); MapIndex(index_temp, cdir, index); a_cw = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index_temp, 1, 0, 0); MapIndex(index_temp, cdir, index); a_ce = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index_temp, 0, -1, 0); MapIndex(index_temp, cdir, index); a_cs = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index_temp, 0, 1, 0); MapIndex(index_temp, cdir, index); a_cn = hypre_StructMatrixExtractPointerByIndex(A, fi, index); /*----------------------------------------------------------------- * Extract additional pointers for 9-point fine grid operator: * * a_csw is pointer for southwest coefficient * a_cse is pointer for southeast coefficient * a_cnw is pointer for northwest coefficient * a_cne is pointer for northeast coefficient *-----------------------------------------------------------------*/ hypre_SetIndex3(index_temp, -1, -1, 0); MapIndex(index_temp, cdir, index); a_csw = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index_temp, 1, -1, 0); MapIndex(index_temp, cdir, index); a_cse = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index_temp, -1, 1, 0); MapIndex(index_temp, cdir, index); a_cnw = hypre_StructMatrixExtractPointerByIndex(A, fi, index); /*----------------------------------------------------------------- * Extract pointers for coarse grid operator - always 9-point: * * We build only the lower triangular part (plus diagonal). * * rap_cc is pointer for center coefficient (etc.) *-----------------------------------------------------------------*/ hypre_SetIndex3(index_temp, 0, 0, 0); MapIndex(index_temp, cdir, index); rap_cc = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index_temp, -1, 0, 0); MapIndex(index_temp, cdir, index); rap_cw = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index_temp, 0, -1, 0); MapIndex(index_temp, cdir, index); rap_cs = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index_temp, -1, -1, 0); MapIndex(index_temp, cdir, index); rap_csw = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index_temp, 1, -1, 0); MapIndex(index_temp, cdir, index); rap_cse = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); /*----------------------------------------------------------------- * Define offsets for fine grid stencil and interpolation * * In the BoxLoop below I assume iA and iP refer to data associated * with the point which we are building the stencil for. The below * Offsets are used in refering to data associated with other points. *-----------------------------------------------------------------*/ hypre_SetIndex3(index_temp, 0, 1, 0); MapIndex(index_temp, cdir, index); yOffsetP = hypre_BoxOffsetDistance(P_dbox, index); if ( constant_coefficient_A == 0 ) { yOffsetA = hypre_BoxOffsetDistance(A_dbox, index); } else { yOffsetA_offd = 0; yOffsetA_diag = 0; } hypre_SetIndex3(index_temp, 1, 0, 0); MapIndex(index_temp, cdir, index); xOffsetP = hypre_BoxOffsetDistance(P_dbox, index); /*-------------------------------------------------------------- * Loop for symmetric 9-point fine grid operator; produces a * symmetric 9-point coarse grid operator. We calculate only the * lower triangular stencil entries: (southwest, south, southeast, * west, and center). *--------------------------------------------------------------*/ hypre_BoxGetSize(cgrid_box, loop_size); if ( constant_coefficient_A == 0 ) { #define DEVICE_VAR is_device_ptr(rap_csw,rb,a_cw,pa,a_csw,rap_cs,a_cc,a_cs,rap_cse,a_ce,a_cse,rap_cw,pb,ra,a_cnw,rap_cc,a_cn) hypre_BoxLoop4Begin(hypre_StructMatrixNDim(A), loop_size, P_dbox, cstart, stridec, iP, R_dbox, cstart, stridec, iR, A_dbox, fstart, stridef, iA, RAP_dbox, cstart, stridec, iAc); { HYPRE_Int iAm1 = iA - yOffsetA; HYPRE_Int iAp1 = iA + yOffsetA; HYPRE_Int iP1 = iP - yOffsetP - xOffsetP; rap_csw[iAc] = rb[iR - rbOffset] * a_cw[iAm1] * pa[iP1] + rb[iR - rbOffset] * a_csw[iAm1] + a_csw[iA] * pa[iP1]; iP1 = iP - yOffsetP; rap_cs[iAc] = rb[iR - rbOffset] * a_cc[iAm1] * pa[iP1] + rb[iR - rbOffset] * a_cs[iAm1] + a_cs[iA] * pa[iP1]; iP1 = iP - yOffsetP + xOffsetP; rap_cse[iAc] = rb[iR - rbOffset] * a_ce[iAm1] * pa[iP1] + rb[iR - rbOffset] * a_cse[iAm1] + a_cse[iA] * pa[iP1]; iP1 = iP - xOffsetP; rap_cw[iAc] = a_cw[iA] + rb[iR - rbOffset] * a_cw[iAm1] * pb[iP1 - pbOffset] + ra[iR] * a_cw[iAp1] * pa[iP1] + rb[iR - rbOffset] * a_cnw[iAm1] + ra[iR] * a_csw[iAp1] + a_csw[iA] * pb[iP1 - pbOffset] + a_cnw[iA] * pa[iP1]; rap_cc[iAc] = a_cc[iA] + rb[iR - rbOffset] * a_cc[iAm1] * pb[iP - pbOffset] + ra[iR] * a_cc[iAp1] * pa[iP] + rb[iR - rbOffset] * a_cn[iAm1] + ra[iR] * a_cs[iAp1] + a_cs[iA] * pb[iP - pbOffset] + a_cn[iA] * pa[iP]; } hypre_BoxLoop4End(iP, iR, iA, iAc); #undef DEVICE_VAR } else { iA_offd = 0; iA_offdm1 = iA_offd - yOffsetA_offd; iA_offdp1 = iA_offd + yOffsetA_offd; a_cn_offd = a_cn[iA_offd]; a_cn_offdm1 = a_cn[iA_offdm1]; a_cs_offd = a_cs[iA_offd]; a_cs_offdm1 = a_cs[iA_offdm1]; a_cs_offdp1 = a_cs[iA_offdp1]; a_cw_offd = a_cw[iA_offd]; a_cw_offdp1 = a_cw[iA_offdp1]; a_cw_offdm1 = a_cw[iA_offdm1]; a_ce_offdm1 = a_ce[iA_offdm1]; a_csw_offd = a_csw[iA_offd]; a_csw_offdm1 = a_csw[iA_offdm1]; a_csw_offdp1 = a_csw[iA_offdp1]; a_cse_offd = a_cse[iA_offd]; a_cse_offdm1 = a_cse[iA_offdm1]; a_cnw_offd = a_cnw[iA_offd]; a_cnw_offdm1 = a_cnw[iA_offdm1]; #define DEVICE_VAR is_device_ptr(rap_csw,rb,pa,rap_cs,a_cc,rap_cse,rap_cw,pb,ra,rap_cc) hypre_BoxLoop4Begin(hypre_StructMatrixNDim(A), loop_size, P_dbox, cstart, stridec, iP, R_dbox, cstart, stridec, iR, A_dbox, fstart, stridef, iA, RAP_dbox, cstart, stridec, iAc); { HYPRE_Int iAm1 = iA - yOffsetA_diag; HYPRE_Int iAp1 = iA + yOffsetA_diag; HYPRE_Int iP1 = iP - yOffsetP - xOffsetP; rap_csw[iAc] = rb[iR - rbOffset] * a_cw_offdm1 * pa[iP1] + rb[iR - rbOffset] * a_csw_offdm1 + a_csw_offd * pa[iP1]; iP1 = iP - yOffsetP; rap_cs[iAc] = rb[iR - rbOffset] * a_cc[iAm1] * pa[iP1] + rb[iR - rbOffset] * a_cs_offdm1 + a_cs_offd * pa[iP1]; iP1 = iP - yOffsetP + xOffsetP; rap_cse[iAc] = rb[iR - rbOffset] * a_ce_offdm1 * pa[iP1] + rb[iR - rbOffset] * a_cse_offdm1 + a_cse_offd * pa[iP1]; iP1 = iP - xOffsetP; rap_cw[iAc] = a_cw_offd + rb[iR - rbOffset] * a_cw_offdm1 * pb[iP1 - pbOffset] + ra[iR] * a_cw_offdp1 * pa[iP1] + rb[iR - rbOffset] * a_cnw_offdm1 + ra[iR] * a_csw_offdp1 + a_csw_offd * pb[iP1 - pbOffset] + a_cnw_offd * pa[iP1]; rap_cc[iAc] = a_cc[iA] + rb[iR - rbOffset] * a_cc[iAm1] * pb[iP - pbOffset] + ra[iR] * a_cc[iAp1] * pa[iP] + rb[iR - rbOffset] * a_cn_offdm1 + ra[iR] * a_cs_offdp1 + a_cs_offd * pb[iP - pbOffset] + a_cn_offd * pa[iP]; } hypre_BoxLoop4End(iP, iR, iA, iAc); #undef DEVICE_VAR } /* }*/ /* end ForBoxI */ return hypre_error_flag; } /* for fine stencil size 9, constant coefficient 1 */ HYPRE_Int hypre_PFMG2BuildRAPSym_onebox_FSS9_CC1( HYPRE_Int ci, HYPRE_Int fi, hypre_StructMatrix *A, hypre_StructMatrix *P, hypre_StructMatrix *R, HYPRE_Int cdir, hypre_Index cindex, hypre_Index cstride, hypre_StructMatrix *RAP ) { hypre_Index index; hypre_Index index_temp; hypre_StructGrid *cgrid; hypre_BoxArray *cgrid_boxes; hypre_Box *cgrid_box; hypre_IndexRef cstart; hypre_Index fstart; HYPRE_Real *pa, *pb; HYPRE_Real *ra, *rb; HYPRE_Real *a_cc, *a_cw, *a_ce, *a_cs, *a_cn; HYPRE_Real *a_csw, *a_cse, *a_cnw; HYPRE_Real *rap_cc, *rap_cw, *rap_cs; HYPRE_Real *rap_csw, *rap_cse; HYPRE_Int iA, iAm1, iAp1; HYPRE_Int iAc; HYPRE_Int iP, iP1; HYPRE_Int iR; HYPRE_Int yOffsetA; HYPRE_Int xOffsetP; HYPRE_Int yOffsetP; cgrid = hypre_StructMatrixGrid(RAP); cgrid_boxes = hypre_StructGridBoxes(cgrid); cgrid_box = hypre_BoxArrayBox(cgrid_boxes, ci); cstart = hypre_BoxIMin(cgrid_box); hypre_StructMapCoarseToFine(cstart, cindex, cstride, fstart); /*----------------------------------------------------------------- * Extract pointers for interpolation operator: * pa is pointer for weight for f-point above c-point * pb is pointer for weight for f-point below c-point *-----------------------------------------------------------------*/ hypre_SetIndex3(index_temp, 0, -1, 0); MapIndex(index_temp, cdir, index); pa = hypre_StructMatrixExtractPointerByIndex(P, fi, index); hypre_SetIndex3(index_temp, 0, 1, 0); MapIndex(index_temp, cdir, index); pb = hypre_StructMatrixExtractPointerByIndex(P, fi, index); /*----------------------------------------------------------------- * Extract pointers for restriction operator: * ra is pointer for weight for f-point above c-point * rb is pointer for weight for f-point below c-point *-----------------------------------------------------------------*/ hypre_SetIndex3(index_temp, 0, -1, 0); MapIndex(index_temp, cdir, index); ra = hypre_StructMatrixExtractPointerByIndex(R, fi, index); hypre_SetIndex3(index_temp, 0, 1, 0); MapIndex(index_temp, cdir, index); rb = hypre_StructMatrixExtractPointerByIndex(R, fi, index); /*----------------------------------------------------------------- * Extract pointers for 5-point fine grid operator: * * a_cc is pointer for center coefficient * a_cw is pointer for west coefficient * a_ce is pointer for east coefficient * a_cs is pointer for south coefficient * a_cn is pointer for north coefficient *-----------------------------------------------------------------*/ hypre_SetIndex3(index_temp, 0, 0, 0); MapIndex(index_temp, cdir, index); a_cc = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index_temp, -1, 0, 0); MapIndex(index_temp, cdir, index); a_cw = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index_temp, 1, 0, 0); MapIndex(index_temp, cdir, index); a_ce = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index_temp, 0, -1, 0); MapIndex(index_temp, cdir, index); a_cs = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index_temp, 0, 1, 0); MapIndex(index_temp, cdir, index); a_cn = hypre_StructMatrixExtractPointerByIndex(A, fi, index); /*----------------------------------------------------------------- * Extract additional pointers for 9-point fine grid operator: * * a_csw is pointer for southwest coefficient * a_cse is pointer for southeast coefficient * a_cnw is pointer for northwest coefficient * a_cne is pointer for northeast coefficient *-----------------------------------------------------------------*/ hypre_SetIndex3(index_temp, -1, -1, 0); MapIndex(index_temp, cdir, index); a_csw = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index_temp, 1, -1, 0); MapIndex(index_temp, cdir, index); a_cse = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index_temp, -1, 1, 0); MapIndex(index_temp, cdir, index); a_cnw = hypre_StructMatrixExtractPointerByIndex(A, fi, index); /*----------------------------------------------------------------- * Extract pointers for coarse grid operator - always 9-point: * * We build only the lower triangular part (plus diagonal). * * rap_cc is pointer for center coefficient (etc.) *-----------------------------------------------------------------*/ hypre_SetIndex3(index_temp, 0, 0, 0); MapIndex(index_temp, cdir, index); rap_cc = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index_temp, -1, 0, 0); MapIndex(index_temp, cdir, index); rap_cw = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index_temp, 0, -1, 0); MapIndex(index_temp, cdir, index); rap_cs = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index_temp, -1, -1, 0); MapIndex(index_temp, cdir, index); rap_csw = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index_temp, 1, -1, 0); MapIndex(index_temp, cdir, index); rap_cse = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); /*----------------------------------------------------------------- * Define offsets for fine grid stencil and interpolation * * In the BoxLoop below I assume iA and iP refer to data associated * with the point which we are building the stencil for. The below * Offsets are used in refering to data associated with other points. *-----------------------------------------------------------------*/ hypre_SetIndex3(index_temp, 0, 1, 0); MapIndex(index_temp, cdir, index); yOffsetA = 0; yOffsetP = 0; hypre_SetIndex3(index_temp, 1, 0, 0); MapIndex(index_temp, cdir, index); xOffsetP = 0; /*----------------------------------------------------------------- * Switch statement to direct control to apropriate BoxLoop depending * on stencil size. Default is full 9-point. *-----------------------------------------------------------------*/ /*-------------------------------------------------------------- * Loop for symmetric 9-point fine grid operator; produces a * symmetric 9-point coarse grid operator. We calculate only the * lower triangular stencil entries: (southwest, south, southeast, * west, and center). *--------------------------------------------------------------*/ iP = 0; iR = 0; iA = 0; iAc = 0; iAm1 = iA - yOffsetA; iAp1 = iA + yOffsetA; iP1 = iP - yOffsetP - xOffsetP; rap_csw[iAc] = rb[iR] * a_cw[iAm1] * pa[iP1] + rb[iR] * a_csw[iAm1] + a_csw[iA] * pa[iP1]; iP1 = iP - yOffsetP; rap_cs[iAc] = rb[iR] * a_cc[iAm1] * pa[iP1] + rb[iR] * a_cs[iAm1] + a_cs[iA] * pa[iP1]; iP1 = iP - yOffsetP + xOffsetP; rap_cse[iAc] = rb[iR] * a_ce[iAm1] * pa[iP1] + rb[iR] * a_cse[iAm1] + a_cse[iA] * pa[iP1]; iP1 = iP - xOffsetP; rap_cw[iAc] = a_cw[iA] + rb[iR] * a_cw[iAm1] * pb[iP1] + ra[iR] * a_cw[iAp1] * pa[iP1] + rb[iR] * a_cnw[iAm1] + ra[iR] * a_csw[iAp1] + a_csw[iA] * pb[iP1] + a_cnw[iA] * pa[iP1]; rap_cc[iAc] = a_cc[iA] + rb[iR] * a_cc[iAm1] * pb[iP] + ra[iR] * a_cc[iAp1] * pa[iP] + rb[iR] * a_cn[iAm1] + ra[iR] * a_cs[iAp1] + a_cs[iA] * pb[iP] + a_cn[iA] * pa[iP]; /* }*/ /* end ForBoxI */ return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_PFMG2BuildRAPNoSym( hypre_StructMatrix *A, hypre_StructMatrix *P, hypre_StructMatrix *R, HYPRE_Int cdir, hypre_Index cindex, hypre_Index cstride, hypre_StructMatrix *RAP ) { hypre_StructStencil *fine_stencil; HYPRE_Int fine_stencil_size; hypre_StructGrid *fgrid; HYPRE_Int *fgrid_ids; hypre_StructGrid *cgrid; hypre_BoxArray *cgrid_boxes; HYPRE_Int *cgrid_ids; HYPRE_Int fi, ci; HYPRE_Int constant_coefficient; fine_stencil = hypre_StructMatrixStencil(A); fine_stencil_size = hypre_StructStencilSize(fine_stencil); fgrid = hypre_StructMatrixGrid(A); fgrid_ids = hypre_StructGridIDs(fgrid); cgrid = hypre_StructMatrixGrid(RAP); cgrid_boxes = hypre_StructGridBoxes(cgrid); cgrid_ids = hypre_StructGridIDs(cgrid); constant_coefficient = hypre_StructMatrixConstantCoefficient(RAP); if (constant_coefficient) { hypre_assert( hypre_StructMatrixConstantCoefficient(R) ); hypre_assert( hypre_StructMatrixConstantCoefficient(A) ); hypre_assert( hypre_StructMatrixConstantCoefficient(P) ); } else { /* hypre_assert( hypre_StructMatrixConstantCoefficient(R)==0 ); hypre_assert( hypre_StructMatrixConstantCoefficient(A)==0 ); hypre_assert( hypre_StructMatrixConstantCoefficient(P)==0 ); */ } fi = 0; hypre_ForBoxI(ci, cgrid_boxes) { while (fgrid_ids[fi] != cgrid_ids[ci]) { fi++; } /*----------------------------------------------------------------- * Switch statement to direct control to appropriate BoxLoop depending * on stencil size. Default is full 27-point. *-----------------------------------------------------------------*/ switch (fine_stencil_size) { /*-------------------------------------------------------------- * Loop for 5-point fine grid operator; produces upper triangular * part of 9-point coarse grid operator - excludes diagonal. * stencil entries: (northeast, north, northwest, and east) *--------------------------------------------------------------*/ case 5: if ( constant_coefficient == 1 ) { hypre_PFMG2BuildRAPNoSym_onebox_FSS5_CC1( ci, fi, A, P, R, cdir, cindex, cstride, RAP ); } else { hypre_PFMG2BuildRAPNoSym_onebox_FSS5_CC0( ci, fi, A, P, R, cdir, cindex, cstride, RAP ); } break; /*-------------------------------------------------------------- * Loop for 9-point fine grid operator; produces upper triangular * part of 9-point coarse grid operator - excludes diagonal. * stencil entries: (northeast, north, northwest, and east) *--------------------------------------------------------------*/ default: if ( constant_coefficient == 1 ) { hypre_PFMG2BuildRAPNoSym_onebox_FSS9_CC1( ci, fi, A, P, R, cdir, cindex, cstride, RAP ); } else { hypre_PFMG2BuildRAPNoSym_onebox_FSS9_CC0( ci, fi, A, P, R, cdir, cindex, cstride, RAP ); } break; } /* end switch statement */ } /* end ForBoxI */ return hypre_error_flag; } /* for fine stencil size 5, constant coefficient 0 */ HYPRE_Int hypre_PFMG2BuildRAPNoSym_onebox_FSS5_CC0( HYPRE_Int ci, HYPRE_Int fi, hypre_StructMatrix *A, hypre_StructMatrix *P, hypre_StructMatrix *R, HYPRE_Int cdir, hypre_Index cindex, hypre_Index cstride, hypre_StructMatrix *RAP ) { hypre_Index index; hypre_Index index_temp; hypre_StructGrid *cgrid; hypre_BoxArray *cgrid_boxes; hypre_Box *cgrid_box; hypre_IndexRef cstart; hypre_Index stridec; hypre_Index fstart; hypre_IndexRef stridef; hypre_Index loop_size; HYPRE_Int constant_coefficient_A; hypre_Box *A_dbox; hypre_Box *P_dbox; hypre_Box *R_dbox; hypre_Box *RAP_dbox; HYPRE_Real *pa, *pb; HYPRE_Real *ra, *rb; HYPRE_Real *a_cc, *a_cw, *a_ce, *a_cn; HYPRE_Real a_cn_offd, a_cn_offdp1, a_cw_offdp1; HYPRE_Real a_ce_offd, a_ce_offdm1, a_ce_offdp1; HYPRE_Real *rap_ce, *rap_cn; HYPRE_Real *rap_cnw, *rap_cne; HYPRE_Int iA_offd, iA_offdm1, iA_offdp1; HYPRE_Int yOffsetA, yOffsetA_diag, yOffsetA_offd; HYPRE_Int xOffsetP; HYPRE_Int yOffsetP; /*hypre_printf("nosym 5.0\n");*/ stridef = cstride; hypre_SetIndex3(stridec, 1, 1, 1); cgrid = hypre_StructMatrixGrid(RAP); cgrid_boxes = hypre_StructGridBoxes(cgrid); constant_coefficient_A = hypre_StructMatrixConstantCoefficient(A); /* fi = 0; hypre_ForBoxI(ci, cgrid_boxes) { while (fgrid_ids[fi] != cgrid_ids[ci]) { fi++; } */ cgrid_box = hypre_BoxArrayBox(cgrid_boxes, ci); cstart = hypre_BoxIMin(cgrid_box); hypre_StructMapCoarseToFine(cstart, cindex, cstride, fstart); A_dbox = hypre_BoxArrayBox(hypre_StructMatrixDataSpace(A), fi); P_dbox = hypre_BoxArrayBox(hypre_StructMatrixDataSpace(P), fi); R_dbox = hypre_BoxArrayBox(hypre_StructMatrixDataSpace(R), fi); RAP_dbox = hypre_BoxArrayBox(hypre_StructMatrixDataSpace(RAP), ci); /*----------------------------------------------------------------- * Extract pointers for interpolation operator: * pa is pointer for weight for f-point above c-point * pb is pointer for weight for f-point below c-point *-----------------------------------------------------------------*/ hypre_SetIndex3(index_temp, 0, -1, 0); MapIndex(index_temp, cdir, index); pa = hypre_StructMatrixExtractPointerByIndex(P, fi, index); hypre_SetIndex3(index_temp, 0, 1, 0); MapIndex(index_temp, cdir, index); pb = hypre_StructMatrixExtractPointerByIndex(P, fi, index); //RL PTROFFSET HYPRE_Int pbOffset = hypre_BoxOffsetDistance(P_dbox, index); /*----------------------------------------------------------------- * Extract pointers for restriction operator: * ra is pointer for weight for f-point above c-point * rb is pointer for weight for f-point below c-point *-----------------------------------------------------------------*/ hypre_SetIndex3(index_temp, 0, -1, 0); MapIndex(index_temp, cdir, index); ra = hypre_StructMatrixExtractPointerByIndex(R, fi, index); hypre_SetIndex3(index_temp, 0, 1, 0); MapIndex(index_temp, cdir, index); rb = hypre_StructMatrixExtractPointerByIndex(R, fi, index); //RL PTROFFSET HYPRE_Int rbOffset = hypre_BoxOffsetDistance(R_dbox, index); /*----------------------------------------------------------------- * Extract pointers for 5-point fine grid operator: * * a_cc is pointer for center coefficient * a_cw is pointer for west coefficient * a_ce is pointer for east coefficient * a_cs is pointer for south coefficient * a_cn is pointer for north coefficient *-----------------------------------------------------------------*/ hypre_SetIndex3(index_temp, 0, 0, 0); MapIndex(index_temp, cdir, index); a_cc = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index_temp, -1, 0, 0); MapIndex(index_temp, cdir, index); a_cw = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index_temp, 1, 0, 0); MapIndex(index_temp, cdir, index); a_ce = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index_temp, 0, 1, 0); MapIndex(index_temp, cdir, index); a_cn = hypre_StructMatrixExtractPointerByIndex(A, fi, index); /*----------------------------------------------------------------- * Extract pointers for coarse grid operator - always 9-point: * * We build only the upper triangular part. * * rap_ce is pointer for east coefficient (etc.) *-----------------------------------------------------------------*/ hypre_SetIndex3(index_temp, 1, 0, 0); MapIndex(index_temp, cdir, index); rap_ce = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index_temp, 0, 1, 0); MapIndex(index_temp, cdir, index); rap_cn = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index_temp, 1, 1, 0); MapIndex(index_temp, cdir, index); rap_cne = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index_temp, -1, 1, 0); MapIndex(index_temp, cdir, index); rap_cnw = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); /*----------------------------------------------------------------- * Define offsets for fine grid stencil and interpolation * * In the BoxLoop below I assume iA and iP refer to data associated * with the point which we are building the stencil for. The below * Offsets are used in refering to data associated with other points. *-----------------------------------------------------------------*/ hypre_SetIndex3(index_temp, 0, 1, 0); MapIndex(index_temp, cdir, index); yOffsetP = hypre_BoxOffsetDistance(P_dbox, index); if ( constant_coefficient_A == 0 ) { yOffsetA = hypre_BoxOffsetDistance(A_dbox, index); } else { hypre_assert( constant_coefficient_A == 2 ); yOffsetA_diag = hypre_BoxOffsetDistance(A_dbox, index); yOffsetA_offd = 0; } hypre_SetIndex3(index_temp, 1, 0, 0); MapIndex(index_temp, cdir, index); xOffsetP = hypre_BoxOffsetDistance(P_dbox, index); /*-------------------------------------------------------------- * Loop for 5-point fine grid operator; produces upper triangular * part of 9-point coarse grid operator - excludes diagonal. * stencil entries: (northeast, north, northwest, and east) *--------------------------------------------------------------*/ hypre_BoxGetSize(cgrid_box, loop_size); if ( constant_coefficient_A == 0 ) { /*hypre_printf("nosym 5.0.0\n");*/ #define DEVICE_VAR is_device_ptr(rap_cne,ra,a_ce,pb,rap_cn,a_cc,a_cn,rap_cnw,a_cw,rap_ce,rb,pa) hypre_BoxLoop4Begin(hypre_StructMatrixNDim(A), loop_size, P_dbox, cstart, stridec, iP, R_dbox, cstart, stridec, iR, A_dbox, fstart, stridef, iA, RAP_dbox, cstart, stridec, iAc); { HYPRE_Int iAm1 = iA - yOffsetA; HYPRE_Int iAp1 = iA + yOffsetA; HYPRE_Int iP1 = iP + yOffsetP + xOffsetP; rap_cne[iAc] = ra[iR] * a_ce[iAp1] * pb[iP1 - pbOffset]; iP1 = iP + yOffsetP; rap_cn[iAc] = ra[iR] * a_cc[iAp1] * pb[iP1 - pbOffset] + ra[iR] * a_cn[iAp1] + a_cn[iA] * pb[iP1 - pbOffset]; iP1 = iP + yOffsetP - xOffsetP; rap_cnw[iAc] = ra[iR] * a_cw[iAp1] * pb[iP1 - pbOffset]; iP1 = iP + xOffsetP; rap_ce[iAc] = a_ce[iA] + rb[iR - rbOffset] * a_ce[iAm1] * pb[iP1 - pbOffset] + ra[iR] * a_ce[iAp1] * pa[iP1]; } hypre_BoxLoop4End(iP, iR, iA, iAc); #undef DEVICE_VAR } else { hypre_assert( constant_coefficient_A == 2 ); /*hypre_printf("nosym 5.0.2\n"); */ iA_offd = 0; iA_offdm1 = iA_offd - yOffsetA_offd; iA_offdp1 = iA_offd + yOffsetA_offd; a_cn_offd = a_cn[iA_offd]; a_cn_offdp1 = a_cn[iA_offdp1]; a_cw_offdp1 = a_cw[iA_offdp1]; a_ce_offd = a_ce[iA_offd]; a_ce_offdm1 = a_ce[iA_offdm1]; a_ce_offdp1 = a_ce[iA_offdp1]; #define DEVICE_VAR is_device_ptr(rap_cne,ra,pb,rap_cn,a_cc,rap_cnw,rap_ce,rb,pa) hypre_BoxLoop4Begin(hypre_StructMatrixNDim(A), loop_size, P_dbox, cstart, stridec, iP, R_dbox, cstart, stridec, iR, A_dbox, fstart, stridef, iA, RAP_dbox, cstart, stridec, iAc); { HYPRE_Int iAp1 = iA + yOffsetA_diag; HYPRE_Int iP1 = iP + yOffsetP + xOffsetP; rap_cne[iAc] = ra[iR] * a_ce_offdp1 * pb[iP1 - pbOffset]; iP1 = iP + yOffsetP; rap_cn[iAc] = ra[iR] * a_cc[iAp1] * pb[iP1 - pbOffset] + ra[iR] * a_cn_offdp1 + a_cn_offd * pb[iP1 - pbOffset]; iP1 = iP + yOffsetP - xOffsetP; rap_cnw[iAc] = ra[iR] * a_cw_offdp1 * pb[iP1 - pbOffset]; iP1 = iP + xOffsetP; rap_ce[iAc] = a_ce_offd + rb[iR - rbOffset] * a_ce_offdm1 * pb[iP1 - pbOffset] + ra[iR] * a_ce_offdp1 * pa[iP1]; } hypre_BoxLoop4End(iP, iR, iA, iAc); #undef DEVICE_VAR } /* }*/ /* end ForBoxI */ return hypre_error_flag; } /* for fine stencil size 5, constant coefficient 1 */ HYPRE_Int hypre_PFMG2BuildRAPNoSym_onebox_FSS5_CC1( HYPRE_Int ci, HYPRE_Int fi, hypre_StructMatrix *A, hypre_StructMatrix *P, hypre_StructMatrix *R, HYPRE_Int cdir, hypre_Index cindex, hypre_Index cstride, hypre_StructMatrix *RAP ) { hypre_Index index; hypre_Index index_temp; hypre_StructGrid *cgrid; hypre_BoxArray *cgrid_boxes; hypre_Box *cgrid_box; hypre_IndexRef cstart; hypre_Index fstart; HYPRE_Real *pa, *pb; HYPRE_Real *ra, *rb; HYPRE_Real *a_cc, *a_cw, *a_ce, *a_cn; HYPRE_Real *rap_ce, *rap_cn; HYPRE_Real *rap_cnw, *rap_cne; HYPRE_Int iA, iAm1, iAp1; HYPRE_Int iAc; HYPRE_Int iP, iP1; HYPRE_Int iR; HYPRE_Int yOffsetA; HYPRE_Int xOffsetP; HYPRE_Int yOffsetP; /* hypre_printf("nosym 5.1\n");*/ cgrid = hypre_StructMatrixGrid(RAP); cgrid_boxes = hypre_StructGridBoxes(cgrid); cgrid_box = hypre_BoxArrayBox(cgrid_boxes, ci); cstart = hypre_BoxIMin(cgrid_box); hypre_StructMapCoarseToFine(cstart, cindex, cstride, fstart); /*----------------------------------------------------------------- * Extract pointers for interpolation operator: * pa is pointer for weight for f-point above c-point * pb is pointer for weight for f-point below c-point *-----------------------------------------------------------------*/ hypre_SetIndex3(index_temp, 0, -1, 0); MapIndex(index_temp, cdir, index); pa = hypre_StructMatrixExtractPointerByIndex(P, fi, index); hypre_SetIndex3(index_temp, 0, 1, 0); MapIndex(index_temp, cdir, index); pb = hypre_StructMatrixExtractPointerByIndex(P, fi, index); /*----------------------------------------------------------------- * Extract pointers for restriction operator: * ra is pointer for weight for f-point above c-point * rb is pointer for weight for f-point below c-point *-----------------------------------------------------------------*/ hypre_SetIndex3(index_temp, 0, -1, 0); MapIndex(index_temp, cdir, index); ra = hypre_StructMatrixExtractPointerByIndex(R, fi, index); hypre_SetIndex3(index_temp, 0, 1, 0); MapIndex(index_temp, cdir, index); rb = hypre_StructMatrixExtractPointerByIndex(R, fi, index); /*----------------------------------------------------------------- * Extract pointers for 5-point fine grid operator: * * a_cc is pointer for center coefficient * a_cw is pointer for west coefficient * a_ce is pointer for east coefficient * a_cs is pointer for south coefficient * a_cn is pointer for north coefficient *-----------------------------------------------------------------*/ hypre_SetIndex3(index_temp, 0, 0, 0); MapIndex(index_temp, cdir, index); a_cc = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index_temp, -1, 0, 0); MapIndex(index_temp, cdir, index); a_cw = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index_temp, 1, 0, 0); MapIndex(index_temp, cdir, index); a_ce = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index_temp, 0, 1, 0); MapIndex(index_temp, cdir, index); a_cn = hypre_StructMatrixExtractPointerByIndex(A, fi, index); /*----------------------------------------------------------------- * Extract pointers for coarse grid operator - always 9-point: * * We build only the upper triangular part. * * rap_ce is pointer for east coefficient (etc.) *-----------------------------------------------------------------*/ hypre_SetIndex3(index_temp, 1, 0, 0); MapIndex(index_temp, cdir, index); rap_ce = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index_temp, 0, 1, 0); MapIndex(index_temp, cdir, index); rap_cn = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index_temp, 1, 1, 0); MapIndex(index_temp, cdir, index); rap_cne = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index_temp, -1, 1, 0); MapIndex(index_temp, cdir, index); rap_cnw = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); /*----------------------------------------------------------------- * Define offsets for fine grid stencil and interpolation * * In the BoxLoop below I assume iA and iP refer to data associated * with the point which we are building the stencil for. The below * Offsets are used in refering to data associated with other points. *-----------------------------------------------------------------*/ hypre_SetIndex3(index_temp, 0, 1, 0); MapIndex(index_temp, cdir, index); yOffsetA = 0; yOffsetP = 0; hypre_SetIndex3(index_temp, 1, 0, 0); MapIndex(index_temp, cdir, index); xOffsetP = 0; /*----------------------------------------------------------------- * Switch statement to direct control to appropriate BoxLoop depending * on stencil size. Default is full 27-point. *-----------------------------------------------------------------*/ /*-------------------------------------------------------------- * Loop for 5-point fine grid operator; produces upper triangular * part of 9-point coarse grid operator - excludes diagonal. * stencil entries: (northeast, north, northwest, and east) *--------------------------------------------------------------*/ iP = 0; iR = 0; iA = 0; iAc = 0; iAm1 = iA - yOffsetA; iAp1 = iA + yOffsetA; iP1 = iP + yOffsetP + xOffsetP; rap_cne[iAc] = ra[iR] * a_ce[iAp1] * pb[iP1]; iP1 = iP + yOffsetP; rap_cn[iAc] = ra[iR] * a_cc[iAp1] * pb[iP1] + ra[iR] * a_cn[iAp1] + a_cn[iA] * pb[iP1]; iP1 = iP + yOffsetP - xOffsetP; rap_cnw[iAc] = ra[iR] * a_cw[iAp1] * pb[iP1]; iP1 = iP + xOffsetP; rap_ce[iAc] = a_ce[iA] + rb[iR] * a_ce[iAm1] * pb[iP1] + ra[iR] * a_ce[iAp1] * pa[iP1]; /* }*/ /* end ForBoxI */ return hypre_error_flag; } /* for fine stencil size 9, constant coefficient 0 */ HYPRE_Int hypre_PFMG2BuildRAPNoSym_onebox_FSS9_CC0( HYPRE_Int ci, HYPRE_Int fi, hypre_StructMatrix *A, hypre_StructMatrix *P, hypre_StructMatrix *R, HYPRE_Int cdir, hypre_Index cindex, hypre_Index cstride, hypre_StructMatrix *RAP ) { hypre_Index index; hypre_Index index_temp; hypre_StructGrid *cgrid; hypre_BoxArray *cgrid_boxes; hypre_Box *cgrid_box; hypre_IndexRef cstart; hypre_Index stridec; hypre_Index fstart; hypre_IndexRef stridef; hypre_Index loop_size; HYPRE_Int constant_coefficient_A; hypre_Box *A_dbox; hypre_Box *P_dbox; hypre_Box *R_dbox; hypre_Box *RAP_dbox; HYPRE_Real *pa, *pb; HYPRE_Real *ra, *rb; HYPRE_Real *a_cc, *a_cw, *a_ce, *a_cn; HYPRE_Real *a_cse, *a_cnw, *a_cne; HYPRE_Real a_cn_offd, a_cn_offdp1, a_cw_offdp1; HYPRE_Real a_ce_offd, a_ce_offdm1, a_ce_offdp1; HYPRE_Real a_cne_offd, a_cne_offdm1, a_cne_offdp1; HYPRE_Real a_cse_offd, a_cse_offdp1, a_cnw_offd, a_cnw_offdp1; HYPRE_Real *rap_ce, *rap_cn; HYPRE_Real *rap_cnw, *rap_cne; HYPRE_Int iA_offd, iA_offdm1, iA_offdp1; HYPRE_Int yOffsetA, yOffsetA_diag, yOffsetA_offd; HYPRE_Int xOffsetP; HYPRE_Int yOffsetP; /*hypre_printf("nosym 9.0\n");*/ stridef = cstride; hypre_SetIndex3(stridec, 1, 1, 1); cgrid = hypre_StructMatrixGrid(RAP); cgrid_boxes = hypre_StructGridBoxes(cgrid); constant_coefficient_A = hypre_StructMatrixConstantCoefficient(A); /* fi = 0; hypre_ForBoxI(ci, cgrid_boxes) { while (fgrid_ids[fi] != cgrid_ids[ci]) { fi++; } */ cgrid_box = hypre_BoxArrayBox(cgrid_boxes, ci); cstart = hypre_BoxIMin(cgrid_box); hypre_StructMapCoarseToFine(cstart, cindex, cstride, fstart); A_dbox = hypre_BoxArrayBox(hypre_StructMatrixDataSpace(A), fi); P_dbox = hypre_BoxArrayBox(hypre_StructMatrixDataSpace(P), fi); R_dbox = hypre_BoxArrayBox(hypre_StructMatrixDataSpace(R), fi); RAP_dbox = hypre_BoxArrayBox(hypre_StructMatrixDataSpace(RAP), ci); /*----------------------------------------------------------------- * Extract pointers for interpolation operator: * pa is pointer for weight for f-point above c-point * pb is pointer for weight for f-point below c-point *-----------------------------------------------------------------*/ hypre_SetIndex3(index_temp, 0, -1, 0); MapIndex(index_temp, cdir, index); pa = hypre_StructMatrixExtractPointerByIndex(P, fi, index); hypre_SetIndex3(index_temp, 0, 1, 0); MapIndex(index_temp, cdir, index); pb = hypre_StructMatrixExtractPointerByIndex(P, fi, index); //RL PTROFFSET HYPRE_Int pbOffset = hypre_BoxOffsetDistance(P_dbox, index); /*----------------------------------------------------------------- * Extract pointers for restriction operator: * ra is pointer for weight for f-point above c-point * rb is pointer for weight for f-point below c-point *-----------------------------------------------------------------*/ hypre_SetIndex3(index_temp, 0, -1, 0); MapIndex(index_temp, cdir, index); ra = hypre_StructMatrixExtractPointerByIndex(R, fi, index); hypre_SetIndex3(index_temp, 0, 1, 0); MapIndex(index_temp, cdir, index); rb = hypre_StructMatrixExtractPointerByIndex(R, fi, index); //RL PTROFFSET HYPRE_Int rbOffset = hypre_BoxOffsetDistance(R_dbox, index); /*----------------------------------------------------------------- * Extract pointers for 5-point fine grid operator: * * a_cc is pointer for center coefficient * a_cw is pointer for west coefficient * a_ce is pointer for east coefficient * a_cs is pointer for south coefficient * a_cn is pointer for north coefficient *-----------------------------------------------------------------*/ hypre_SetIndex3(index_temp, 0, 0, 0); MapIndex(index_temp, cdir, index); a_cc = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index_temp, -1, 0, 0); MapIndex(index_temp, cdir, index); a_cw = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index_temp, 1, 0, 0); MapIndex(index_temp, cdir, index); a_ce = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index_temp, 0, 1, 0); MapIndex(index_temp, cdir, index); a_cn = hypre_StructMatrixExtractPointerByIndex(A, fi, index); /*----------------------------------------------------------------- * Extract additional pointers for 9-point fine grid operator: * * a_csw is pointer for southwest coefficient * a_cse is pointer for southeast coefficient * a_cnw is pointer for northwest coefficient * a_cne is pointer for northeast coefficient *-----------------------------------------------------------------*/ hypre_SetIndex3(index_temp, 1, -1, 0); MapIndex(index_temp, cdir, index); a_cse = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index_temp, -1, 1, 0); MapIndex(index_temp, cdir, index); a_cnw = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index_temp, 1, 1, 0); MapIndex(index_temp, cdir, index); a_cne = hypre_StructMatrixExtractPointerByIndex(A, fi, index); /*----------------------------------------------------------------- * Extract pointers for coarse grid operator - always 9-point: * * We build only the upper triangular part. * * rap_ce is pointer for east coefficient (etc.) *-----------------------------------------------------------------*/ hypre_SetIndex3(index_temp, 1, 0, 0); MapIndex(index_temp, cdir, index); rap_ce = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index_temp, 0, 1, 0); MapIndex(index_temp, cdir, index); rap_cn = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index_temp, 1, 1, 0); MapIndex(index_temp, cdir, index); rap_cne = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index_temp, -1, 1, 0); MapIndex(index_temp, cdir, index); rap_cnw = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); /*----------------------------------------------------------------- * Define offsets for fine grid stencil and interpolation * * In the BoxLoop below I assume iA and iP refer to data associated * with the point which we are building the stencil for. The below * Offsets are used in refering to data associated with other points. *-----------------------------------------------------------------*/ hypre_SetIndex3(index_temp, 0, 1, 0); MapIndex(index_temp, cdir, index); yOffsetP = hypre_BoxOffsetDistance(P_dbox, index); if ( constant_coefficient_A == 0 ) { yOffsetA = hypre_BoxOffsetDistance(A_dbox, index); } else { hypre_assert( constant_coefficient_A == 2 ); yOffsetA_diag = hypre_BoxOffsetDistance(A_dbox, index); yOffsetA_offd = 0; } hypre_SetIndex3(index_temp, 1, 0, 0); MapIndex(index_temp, cdir, index); xOffsetP = hypre_BoxOffsetDistance(P_dbox, index); /*----------------------------------------------------------------- * Switch statement to direct control to appropriate BoxLoop depending * on stencil size. Default is full 27-point. *-----------------------------------------------------------------*/ /*-------------------------------------------------------------- * Loop for 9-point fine grid operator; produces upper triangular * part of 9-point coarse grid operator - excludes diagonal. * stencil entries: (northeast, north, northwest, and east) *--------------------------------------------------------------*/ hypre_BoxGetSize(cgrid_box, loop_size); if ( constant_coefficient_A == 0 ) { /*hypre_printf("nosym 9.0.0\n");*/ #define DEVICE_VAR is_device_ptr(rap_cne,ra,a_ce,pb,a_cne,rap_cn,a_cc,a_cn,rap_cnw,a_cw,a_cnw,rap_ce,rb,pa,a_cse) hypre_BoxLoop4Begin(hypre_StructMatrixNDim(A), loop_size, P_dbox, cstart, stridec, iP, R_dbox, cstart, stridec, iR, A_dbox, fstart, stridef, iA, RAP_dbox, cstart, stridec, iAc); { HYPRE_Int iAm1 = iA - yOffsetA; HYPRE_Int iAp1 = iA + yOffsetA; HYPRE_Int iP1 = iP + yOffsetP + xOffsetP; rap_cne[iAc] = ra[iR] * a_ce[iAp1] * pb[iP1 - pbOffset] + ra[iR] * a_cne[iAp1] + a_cne[iA] * pb[iP1 - pbOffset]; iP1 = iP + yOffsetP; rap_cn[iAc] = ra[iR] * a_cc[iAp1] * pb[iP1 - pbOffset] + ra[iR] * a_cn[iAp1] + a_cn[iA] * pb[iP1 - pbOffset]; iP1 = iP + yOffsetP - xOffsetP; rap_cnw[iAc] = ra[iR] * a_cw[iAp1] * pb[iP1 - pbOffset] + ra[iR] * a_cnw[iAp1] + a_cnw[iA] * pb[iP1 - pbOffset]; iP1 = iP + xOffsetP; rap_ce[iAc] = a_ce[iA] + rb[iR - rbOffset] * a_ce[iAm1] * pb[iP1 - pbOffset] + ra[iR] * a_ce[iAp1] * pa[iP1] + rb[iR - rbOffset] * a_cne[iAm1] + ra[iR] * a_cse[iAp1] + a_cse[iA] * pb[iP1 - pbOffset] + a_cne[iA] * pa[iP1]; } hypre_BoxLoop4End(iP, iR, iA, iAc); #undef DEVICE_VAR } else { /*hypre_printf("nosym 9.0.2\n");*/ hypre_assert( constant_coefficient_A == 2 ); iA_offd = 0; iA_offdm1 = iA_offd - yOffsetA_offd; iA_offdp1 = iA_offd + yOffsetA_offd; a_cn_offd = a_cn[iA_offd]; a_cn_offdp1 = a_cn[iA_offdp1]; a_cw_offdp1 = a_cw[iA_offdp1]; a_ce_offd = a_ce[iA_offd]; a_ce_offdm1 = a_ce[iA_offdm1]; a_ce_offdp1 = a_ce[iA_offdp1]; a_cne_offd = a_cne[iA_offd]; a_cne_offdm1 = a_cne[iA_offdm1]; a_cne_offdp1 = a_cne[iA_offdp1]; a_cse_offd = a_cse[iA_offd]; a_cse_offdp1 = a_cse[iA_offdp1]; a_cnw_offd = a_cnw[iA_offd]; a_cnw_offdp1 = a_cnw[iA_offdp1]; #define DEVICE_VAR is_device_ptr(rap_cne,ra,pb,rap_cn,a_cc,rap_cnw,rap_ce,rb,pa) hypre_BoxLoop4Begin(hypre_StructMatrixNDim(A), loop_size, P_dbox, cstart, stridec, iP, R_dbox, cstart, stridec, iR, A_dbox, fstart, stridef, iA, RAP_dbox, cstart, stridec, iAc); { HYPRE_Int iAp1 = iA + yOffsetA_diag; HYPRE_Int iP1 = iP + yOffsetP + xOffsetP; rap_cne[iAc] = ra[iR] * a_ce_offdp1 * pb[iP1 - pbOffset] + ra[iR] * a_cne_offdp1 + a_cne_offd * pb[iP1 - pbOffset]; iP1 = iP + yOffsetP; rap_cn[iAc] = ra[iR] * a_cc[iAp1] * pb[iP1 - pbOffset] + ra[iR] * a_cn_offdp1 + a_cn_offd * pb[iP1 - pbOffset]; iP1 = iP + yOffsetP - xOffsetP; rap_cnw[iAc] = ra[iR] * a_cw_offdp1 * pb[iP1 - pbOffset] + ra[iR] * a_cnw_offdp1 + a_cnw_offd * pb[iP1 - pbOffset]; iP1 = iP + xOffsetP; rap_ce[iAc] = a_ce_offd + rb[iR - rbOffset] * a_ce_offdm1 * pb[iP1 - pbOffset] + ra[iR] * a_ce_offdp1 * pa[iP1] + rb[iR - rbOffset] * a_cne_offdm1 + ra[iR] * a_cse_offdp1 + a_cse_offd * pb[iP1 - pbOffset] + a_cne_offd * pa[iP1]; } hypre_BoxLoop4End(iP, iR, iA, iAc); #undef DEVICE_VAR } /* }*/ /* end ForBoxI */ return hypre_error_flag; } /* for fine stencil size 9, constant coefficient 1 */ HYPRE_Int hypre_PFMG2BuildRAPNoSym_onebox_FSS9_CC1( HYPRE_Int ci, HYPRE_Int fi, hypre_StructMatrix *A, hypre_StructMatrix *P, hypre_StructMatrix *R, HYPRE_Int cdir, hypre_Index cindex, hypre_Index cstride, hypre_StructMatrix *RAP ) { hypre_Index index; hypre_Index index_temp; hypre_StructGrid *cgrid; hypre_BoxArray *cgrid_boxes; hypre_Box *cgrid_box; hypre_IndexRef cstart; hypre_Index fstart; HYPRE_Real *pa, *pb; HYPRE_Real *ra, *rb; HYPRE_Real *a_cc, *a_cw, *a_ce, *a_cn; HYPRE_Real *a_cse, *a_cnw, *a_cne; HYPRE_Real *rap_ce, *rap_cn; HYPRE_Real *rap_cnw, *rap_cne; HYPRE_Int iA, iAm1, iAp1; HYPRE_Int iAc; HYPRE_Int iP, iP1; HYPRE_Int iR; HYPRE_Int yOffsetA; HYPRE_Int xOffsetP; HYPRE_Int yOffsetP; /*hypre_printf("nosym 9.1\n");*/ cgrid = hypre_StructMatrixGrid(RAP); cgrid_boxes = hypre_StructGridBoxes(cgrid); cgrid_box = hypre_BoxArrayBox(cgrid_boxes, ci); cstart = hypre_BoxIMin(cgrid_box); hypre_StructMapCoarseToFine(cstart, cindex, cstride, fstart); /*----------------------------------------------------------------- * Extract pointers for interpolation operator: * pa is pointer for weight for f-point above c-point * pb is pointer for weight for f-point below c-point *-----------------------------------------------------------------*/ hypre_SetIndex3(index_temp, 0, -1, 0); MapIndex(index_temp, cdir, index); pa = hypre_StructMatrixExtractPointerByIndex(P, fi, index); hypre_SetIndex3(index_temp, 0, 1, 0); MapIndex(index_temp, cdir, index); pb = hypre_StructMatrixExtractPointerByIndex(P, fi, index); /*----------------------------------------------------------------- * Extract pointers for restriction operator: * ra is pointer for weight for f-point above c-point * rb is pointer for weight for f-point below c-point *-----------------------------------------------------------------*/ hypre_SetIndex3(index_temp, 0, -1, 0); MapIndex(index_temp, cdir, index); ra = hypre_StructMatrixExtractPointerByIndex(R, fi, index); hypre_SetIndex3(index_temp, 0, 1, 0); MapIndex(index_temp, cdir, index); rb = hypre_StructMatrixExtractPointerByIndex(R, fi, index); /*----------------------------------------------------------------- * Extract pointers for 5-point fine grid operator: * * a_cc is pointer for center coefficient * a_cw is pointer for west coefficient * a_ce is pointer for east coefficient * a_cs is pointer for south coefficient * a_cn is pointer for north coefficient *-----------------------------------------------------------------*/ hypre_SetIndex3(index_temp, 0, 0, 0); MapIndex(index_temp, cdir, index); a_cc = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index_temp, -1, 0, 0); MapIndex(index_temp, cdir, index); a_cw = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index_temp, 1, 0, 0); MapIndex(index_temp, cdir, index); a_ce = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index_temp, 0, 1, 0); MapIndex(index_temp, cdir, index); a_cn = hypre_StructMatrixExtractPointerByIndex(A, fi, index); /*----------------------------------------------------------------- * Extract additional pointers for 9-point fine grid operator: * * a_csw is pointer for southwest coefficient * a_cse is pointer for southeast coefficient * a_cnw is pointer for northwest coefficient * a_cne is pointer for northeast coefficient *-----------------------------------------------------------------*/ hypre_SetIndex3(index_temp, 1, -1, 0); MapIndex(index_temp, cdir, index); a_cse = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index_temp, -1, 1, 0); MapIndex(index_temp, cdir, index); a_cnw = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index_temp, 1, 1, 0); MapIndex(index_temp, cdir, index); a_cne = hypre_StructMatrixExtractPointerByIndex(A, fi, index); /*----------------------------------------------------------------- * Extract pointers for coarse grid operator - always 9-point: * * We build only the upper triangular part. * * rap_ce is pointer for east coefficient (etc.) *-----------------------------------------------------------------*/ hypre_SetIndex3(index_temp, 1, 0, 0); MapIndex(index_temp, cdir, index); rap_ce = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index_temp, 0, 1, 0); MapIndex(index_temp, cdir, index); rap_cn = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index_temp, 1, 1, 0); MapIndex(index_temp, cdir, index); rap_cne = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index_temp, -1, 1, 0); MapIndex(index_temp, cdir, index); rap_cnw = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); /*----------------------------------------------------------------- * Define offsets for fine grid stencil and interpolation * * In the BoxLoop below I assume iA and iP refer to data associated * with the point which we are building the stencil for. The below * Offsets are used in refering to data associated with other points. *-----------------------------------------------------------------*/ hypre_SetIndex3(index_temp, 0, 1, 0); MapIndex(index_temp, cdir, index); yOffsetA = 0; yOffsetP = 0; hypre_SetIndex3(index_temp, 1, 0, 0); MapIndex(index_temp, cdir, index); xOffsetP = 0; /*----------------------------------------------------------------- * Switch statement to direct control to appropriate BoxLoop depending * on stencil size. Default is full 27-point. *-----------------------------------------------------------------*/ /*-------------------------------------------------------------- * Loop for 9-point fine grid operator; produces upper triangular * part of 9-point coarse grid operator - excludes diagonal. * stencil entries: (northeast, north, northwest, and east) *--------------------------------------------------------------*/ iP = 0; iR = 0; iA = 0; iAc = 0; iAm1 = iA - yOffsetA; iAp1 = iA + yOffsetA; iP1 = iP + yOffsetP + xOffsetP; rap_cne[iAc] = ra[iR] * a_ce[iAp1] * pb[iP1] + ra[iR] * a_cne[iAp1] + a_cne[iA] * pb[iP1]; iP1 = iP + yOffsetP; rap_cn[iAc] = ra[iR] * a_cc[iAp1] * pb[iP1] + ra[iR] * a_cn[iAp1] + a_cn[iA] * pb[iP1]; iP1 = iP + yOffsetP - xOffsetP; rap_cnw[iAc] = ra[iR] * a_cw[iAp1] * pb[iP1] + ra[iR] * a_cnw[iAp1] + a_cnw[iA] * pb[iP1]; iP1 = iP + xOffsetP; rap_ce[iAc] = a_ce[iA] + rb[iR] * a_ce[iAm1] * pb[iP1] + ra[iR] * a_ce[iAp1] * pa[iP1] + rb[iR] * a_cne[iAm1] + ra[iR] * a_cse[iAp1] + a_cse[iA] * pb[iP1] + a_cne[iA] * pa[iP1]; /* }*/ /* end ForBoxI */ return hypre_error_flag; } hypre-2.33.0/src/struct_ls/pfmg3_setup_rap.c000066400000000000000000006715571477326011500210340ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "_hypre_struct_ls.h" #include "_hypre_struct_mv.hpp" #include "pfmg.h" /*-------------------------------------------------------------------------- * Macro to "change coordinates". This routine is written as though * coarsening is being done in the z-direction. This macro is used to * allow for coarsening to be done in the x- and y-directions also. *--------------------------------------------------------------------------*/ #define MapIndex(in_index, cdir, out_index) \ hypre_IndexD(out_index, cdir) = hypre_IndexD(in_index, 2); \ cdir = (cdir + 1) % 3; \ hypre_IndexD(out_index, cdir) = hypre_IndexD(in_index, 0); \ cdir = (cdir + 1) % 3; \ hypre_IndexD(out_index, cdir) = hypre_IndexD(in_index, 1); \ cdir = (cdir + 1) % 3; /*-------------------------------------------------------------------------- * Sets up new coarse grid operator stucture. *--------------------------------------------------------------------------*/ hypre_StructMatrix * hypre_PFMG3CreateRAPOp( hypre_StructMatrix *R, hypre_StructMatrix *A, hypre_StructMatrix *P, hypre_StructGrid *coarse_grid, HYPRE_Int cdir ) { HYPRE_UNUSED_VAR(R); HYPRE_UNUSED_VAR(P); hypre_StructMatrix *RAP; hypre_Index *RAP_stencil_shape; hypre_StructStencil *RAP_stencil; HYPRE_Int RAP_stencil_size; HYPRE_Int RAP_stencil_dim; HYPRE_Int RAP_num_ghost[] = {1, 1, 1, 1, 1, 1}; hypre_StructStencil *A_stencil; HYPRE_Int A_stencil_size; hypre_Index index_temp; HYPRE_Int k, j, i; HYPRE_Int stencil_rank; RAP_stencil_dim = 3; A_stencil = hypre_StructMatrixStencil(A); A_stencil_size = hypre_StructStencilSize(A_stencil); /*----------------------------------------------------------------------- * Define RAP_stencil *-----------------------------------------------------------------------*/ stencil_rank = 0; /*----------------------------------------------------------------------- * non-symmetric case *-----------------------------------------------------------------------*/ /*----------------------------------------------------------------------- * 7-point fine grid stencil produces 19 point RAP * * Store all 27 elements except for the corners. * * For symmetric A, only store the lower triangular part, where * lower triangular means the lower triangular part on the matrix * in the standard lexicographic ordering. *-----------------------------------------------------------------------*/ if ( A_stencil_size == 7) { RAP_stencil_size = 19; if (hypre_StructMatrixSymmetric(A)) { RAP_stencil_size = (RAP_stencil_size + 1) / 2; } RAP_stencil_shape = hypre_CTAlloc(hypre_Index, RAP_stencil_size, HYPRE_MEMORY_HOST); for (k = -1; k < 2; k++) { for (j = -1; j < 2; j++) { for (i = -1; i < 2; i++) { if ((i * j * k == 0) && (stencil_rank < RAP_stencil_size)) { hypre_SetIndex3(index_temp, i, j, k); MapIndex(index_temp, cdir, RAP_stencil_shape[stencil_rank]); stencil_rank++; } } } } } /*----------------------------------------------------------------------- * 19 or 27 point fine grid stencil produces 27 point RAP * * Store all 27 elements * * For symmetric A, only store the lower triangular part, where * lower triangular means the lower triangular part on the matrix * in the standard lexicographic ordering. *-----------------------------------------------------------------------*/ else { RAP_stencil_size = 27; if (hypre_StructMatrixSymmetric(A)) { RAP_stencil_size = (RAP_stencil_size + 1) / 2; } RAP_stencil_shape = hypre_CTAlloc(hypre_Index, RAP_stencil_size, HYPRE_MEMORY_HOST); for (k = -1; k < 2; k++) { for (j = -1; j < 2; j++) { for (i = -1; i < 2; i++) { if (stencil_rank < RAP_stencil_size) { hypre_SetIndex3(index_temp, i, j, k); MapIndex(index_temp, cdir, RAP_stencil_shape[stencil_rank]); stencil_rank++; } } } } } RAP_stencil = hypre_StructStencilCreate(RAP_stencil_dim, RAP_stencil_size, RAP_stencil_shape); RAP = hypre_StructMatrixCreate(hypre_StructMatrixComm(A), coarse_grid, RAP_stencil); hypre_StructStencilDestroy(RAP_stencil); /*----------------------------------------------------------------------- * Coarse operator in symmetric iff fine operator is *-----------------------------------------------------------------------*/ hypre_StructMatrixSymmetric(RAP) = hypre_StructMatrixSymmetric(A); /*----------------------------------------------------------------------- * Set number of ghost points - one one each boundary *-----------------------------------------------------------------------*/ hypre_StructMatrixSetNumGhost(RAP, RAP_num_ghost); return RAP; } /*-------------------------------------------------------------------------- * Routines to build RAP. These routines are fairly general * 1) No assumptions about symmetry of A * 2) No assumption that R = transpose(P) * 3) 7, 19 or 27-point fine grid A * * I am, however, assuming that the c-to-c interpolation is the identity. * * I've written a two routines - hypre_PFMG3BuildRAPSym to build the lower * triangular part of RAP (including the diagonal) and * hypre_PFMG3BuildRAPNoSym to build the upper triangular part of RAP * (excluding the diagonal). So using symmetric storage, only the first * routine would be called. With full storage both would need to be called. * *--------------------------------------------------------------------------*/ HYPRE_Int hypre_PFMG3BuildRAPSym( hypre_StructMatrix *A, hypre_StructMatrix *P, hypre_StructMatrix *R, HYPRE_Int cdir, hypre_Index cindex, hypre_Index cstride, hypre_StructMatrix *RAP ) { hypre_StructStencil *fine_stencil; HYPRE_Int fine_stencil_size; hypre_StructGrid *fgrid; HYPRE_Int *fgrid_ids; hypre_StructGrid *cgrid; hypre_BoxArray *cgrid_boxes; HYPRE_Int *cgrid_ids; HYPRE_Int fi, ci; HYPRE_Int constant_coefficient; HYPRE_Int constant_coefficient_A; fine_stencil = hypre_StructMatrixStencil(A); fine_stencil_size = hypre_StructStencilSize(fine_stencil); fgrid = hypre_StructMatrixGrid(A); fgrid_ids = hypre_StructGridIDs(fgrid); cgrid = hypre_StructMatrixGrid(RAP); cgrid_boxes = hypre_StructGridBoxes(cgrid); cgrid_ids = hypre_StructGridIDs(cgrid); constant_coefficient = hypre_StructMatrixConstantCoefficient(RAP); constant_coefficient_A = hypre_StructMatrixConstantCoefficient(A); hypre_assert( constant_coefficient == 0 || constant_coefficient == 1 ); hypre_assert( hypre_StructMatrixConstantCoefficient(R) == constant_coefficient ); hypre_assert( hypre_StructMatrixConstantCoefficient(P) == constant_coefficient ); if (constant_coefficient == 1 ) { hypre_assert( constant_coefficient_A == 1 ); } else { hypre_assert( constant_coefficient_A == 0 || constant_coefficient_A == 2 ); } fi = 0; hypre_ForBoxI(ci, cgrid_boxes) { while (fgrid_ids[fi] != cgrid_ids[ci]) { fi++; } /*-------------------------------------------------------------------- * Switch statement to direct control to apropriate BoxLoop depending * on stencil size. Default is full 27-point. *-----------------------------------------------------------------*/ switch (fine_stencil_size) { /*-------------------------------------------------------------- * Loop for symmetric 7-point fine grid operator; produces a * symmetric 19-point coarse grid operator. We calculate only the * lower triangular stencil entries: (below-south, below-west, * below-center, below-east, below-north, center-south, * center-west, and center-center). *--------------------------------------------------------------*/ case 7: if ( constant_coefficient == 1 ) { hypre_PFMG3BuildRAPSym_onebox_FSS07_CC1( ci, fi, A, P, R, cdir, cindex, cstride, RAP ); } else { hypre_PFMG3BuildRAPSym_onebox_FSS07_CC0( ci, fi, A, P, R, cdir, cindex, cstride, RAP ); } break; /*-------------------------------------------------------------- * Loop for symmetric 19-point fine grid operator; produces a * symmetric 27-point coarse grid operator. We calculate only the * lower triangular stencil entries: (below-southwest, below-south, * below-southeast, below-west, below-center, below-east, * below-northwest, below-north, below-northeast, center-southwest, * center-south, center-southeast, center-west, and center-center). *--------------------------------------------------------------*/ case 19: if ( constant_coefficient == 1 ) { hypre_PFMG3BuildRAPSym_onebox_FSS19_CC1( ci, fi, A, P, R, cdir, cindex, cstride, RAP ); } else { hypre_PFMG3BuildRAPSym_onebox_FSS19_CC0( ci, fi, A, P, R, cdir, cindex, cstride, RAP ); } break; /*-------------------------------------------------------------- * Loop for symmetric 27-point fine grid operator; produces a * symmetric 27-point coarse grid operator. We calculate only the * lower triangular stencil entries: (below-southwest, below-south, * below-southeast, below-west, below-center, below-east, * below-northwest, below-north, below-northeast, center-southwest, * center-south, center-southeast, center-west, and center-center). *--------------------------------------------------------------*/ default: if ( constant_coefficient == 1 ) { hypre_PFMG3BuildRAPSym_onebox_FSS27_CC1( ci, fi, A, P, R, cdir, cindex, cstride, RAP ); } else { hypre_PFMG3BuildRAPSym_onebox_FSS27_CC0( ci, fi, A, P, R, cdir, cindex, cstride, RAP ); } break; } /* end switch statement */ } /* end ForBoxI */ return hypre_error_flag; } /* core part of hypre_PFMG3BuildRAPSym, for one box, one value of fine_stencil_size (7) and one value of constant_coefficient (0). Within this function there is a test on constant_coefficient_A as well. */ HYPRE_Int hypre_PFMG3BuildRAPSym_onebox_FSS07_CC0( HYPRE_Int ci, HYPRE_Int fi, hypre_StructMatrix *A, hypre_StructMatrix *P, hypre_StructMatrix *R, HYPRE_Int cdir, hypre_Index cindex, hypre_Index cstride, hypre_StructMatrix *RAP ) { hypre_Index index; hypre_Index index_temp; hypre_StructGrid *cgrid; hypre_BoxArray *cgrid_boxes; hypre_Box *cgrid_box; hypre_IndexRef cstart; hypre_Index stridec; hypre_Index fstart; hypre_IndexRef stridef; hypre_Index loop_size; HYPRE_Int constant_coefficient_A; hypre_Box *A_dbox; hypre_Box *P_dbox; hypre_Box *R_dbox; hypre_Box *RAP_dbox; HYPRE_Real *pa, *pb; HYPRE_Real *ra, *rb; HYPRE_Real *a_cc, *a_cw, *a_ce, *a_cs, *a_cn; HYPRE_Real *a_ac; HYPRE_Real *a_bc; HYPRE_Real a_cs_offd, a_cs_offdm1, a_cs_offdp1; HYPRE_Real a_cn_offdm1; HYPRE_Real a_cw_offd, a_cw_offdm1, a_cw_offdp1; HYPRE_Real a_ce_offdm1; HYPRE_Real a_ac_offd, a_ac_offdm1; HYPRE_Real a_bc_offd, a_bc_offdm1, a_bc_offdp1; HYPRE_Real *rap_cc, *rap_cw, *rap_cs; HYPRE_Real *rap_bc, *rap_bw, *rap_be, *rap_bs, *rap_bn; HYPRE_Real *rap_csw, *rap_cse; HYPRE_Int iA_offd, iA_offdm1, iA_offdp1; HYPRE_Int zOffsetA; HYPRE_Int zOffsetA_diag; HYPRE_Int zOffsetA_offd; HYPRE_Int xOffsetP; HYPRE_Int yOffsetP; HYPRE_Int zOffsetP; stridef = cstride; hypre_SetIndex3(stridec, 1, 1, 1); cgrid = hypre_StructMatrixGrid(RAP); cgrid_boxes = hypre_StructGridBoxes(cgrid); constant_coefficient_A = hypre_StructMatrixConstantCoefficient(A); cgrid_box = hypre_BoxArrayBox(cgrid_boxes, ci); cstart = hypre_BoxIMin(cgrid_box); hypre_StructMapCoarseToFine(cstart, cindex, cstride, fstart); A_dbox = hypre_BoxArrayBox(hypre_StructMatrixDataSpace(A), fi); P_dbox = hypre_BoxArrayBox(hypre_StructMatrixDataSpace(P), fi); R_dbox = hypre_BoxArrayBox(hypre_StructMatrixDataSpace(R), fi); RAP_dbox = hypre_BoxArrayBox(hypre_StructMatrixDataSpace(RAP), ci); /*----------------------------------------------------------------- * Extract pointers for interpolation operator: * pa is pointer for weight for f-point above c-point * pb is pointer for weight for f-point below c-point *-----------------------------------------------------------------*/ hypre_SetIndex3(index_temp, 0, 0, -1); MapIndex(index_temp, cdir, index); pa = hypre_StructMatrixExtractPointerByIndex(P, fi, index); hypre_SetIndex3(index_temp, 0, 0, 1); MapIndex(index_temp, cdir, index); pb = hypre_StructMatrixExtractPointerByIndex(P, fi, index); //RL PTROFFSET HYPRE_Int pbOffset = hypre_BoxOffsetDistance(P_dbox, index); /*----------------------------------------------------------------- * Extract pointers for restriction operator: * ra is pointer for weight for f-point above c-point * rb is pointer for weight for f-point below c-point *-----------------------------------------------------------------*/ hypre_SetIndex3(index_temp, 0, 0, -1); MapIndex(index_temp, cdir, index); ra = hypre_StructMatrixExtractPointerByIndex(R, fi, index); hypre_SetIndex3(index_temp, 0, 0, 1); MapIndex(index_temp, cdir, index); rb = hypre_StructMatrixExtractPointerByIndex(R, fi, index); //RL PTROFFSET HYPRE_Int rbOffset = hypre_BoxOffsetDistance(R_dbox, index); /*----------------------------------------------------------------- * Extract pointers for 7-point fine grid operator: * * a_cc is pointer for center coefficient * a_cw is pointer for west coefficient in same plane * a_ce is pointer for east coefficient in same plane * a_cs is pointer for south coefficient in same plane * a_cn is pointer for north coefficient in same plane * a_ac is pointer for center coefficient in plane above * a_bc is pointer for center coefficient in plane below *-----------------------------------------------------------------*/ hypre_SetIndex3(index_temp, 0, 0, 0); MapIndex(index_temp, cdir, index); a_cc = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index_temp, -1, 0, 0); MapIndex(index_temp, cdir, index); a_cw = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index_temp, 1, 0, 0); MapIndex(index_temp, cdir, index); a_ce = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index_temp, 0, -1, 0); MapIndex(index_temp, cdir, index); a_cs = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index_temp, 0, 1, 0); MapIndex(index_temp, cdir, index); a_cn = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index_temp, 0, 0, 1); MapIndex(index_temp, cdir, index); a_ac = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index_temp, 0, 0, -1); MapIndex(index_temp, cdir, index); a_bc = hypre_StructMatrixExtractPointerByIndex(A, fi, index); /*----------------------------------------------------------------- * Extract pointers for 19-point coarse grid operator: * * We build only the lower triangular part (plus diagonal). * * rap_cc is pointer for center coefficient (etc.) *-----------------------------------------------------------------*/ hypre_SetIndex3(index_temp, 0, 0, 0); MapIndex(index_temp, cdir, index); rap_cc = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index_temp, -1, 0, 0); MapIndex(index_temp, cdir, index); rap_cw = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index_temp, 0, -1, 0); MapIndex(index_temp, cdir, index); rap_cs = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index_temp, 0, 0, -1); MapIndex(index_temp, cdir, index); rap_bc = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index_temp, -1, 0, -1); MapIndex(index_temp, cdir, index); rap_bw = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index_temp, 1, 0, -1); MapIndex(index_temp, cdir, index); rap_be = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index_temp, 0, -1, -1); MapIndex(index_temp, cdir, index); rap_bs = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index_temp, 0, 1, -1); MapIndex(index_temp, cdir, index); rap_bn = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index_temp, -1, -1, 0); MapIndex(index_temp, cdir, index); rap_csw = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index_temp, 1, -1, 0); MapIndex(index_temp, cdir, index); rap_cse = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); /*----------------------------------------------------------------- * Define offsets for fine grid stencil and interpolation * * In the BoxLoop below I assume iA and iP refer to data associated * with the point which we are building the stencil for. The below * Offsets are used in refering to data associated with other points. *-----------------------------------------------------------------*/ hypre_SetIndex3(index_temp, 0, 0, 1); MapIndex(index_temp, cdir, index); zOffsetP = hypre_BoxOffsetDistance(P_dbox, index); if ( constant_coefficient_A == 0 ) { zOffsetA = hypre_BoxOffsetDistance(A_dbox, index); } else { zOffsetA_diag = hypre_BoxOffsetDistance(A_dbox, index); zOffsetA_offd = 0; } hypre_SetIndex3(index_temp, 0, 1, 0); MapIndex(index_temp, cdir, index); yOffsetP = hypre_BoxOffsetDistance(P_dbox, index); hypre_SetIndex3(index_temp, 1, 0, 0); MapIndex(index_temp, cdir, index); xOffsetP = hypre_BoxOffsetDistance(P_dbox, index); /*-------------------------------------------------------------------- * Switch statement to direct control to apropriate BoxLoop depending * on stencil size. Default is full 27-point. *-----------------------------------------------------------------*/ /*-------------------------------------------------------------- * Loop for symmetric 7-point fine grid operator; produces a * symmetric 19-point coarse grid operator. We calculate only the * lower triangular stencil entries: (below-south, below-west, * below-center, below-east, below-north, center-south, * center-west, and center-center). *--------------------------------------------------------------*/ hypre_BoxGetSize(cgrid_box, loop_size); if ( constant_coefficient_A == 0 ) { #define DEVICE_VAR is_device_ptr(rap_bs,rb,a_cs,pa,rap_bw,a_cw,rap_bc,a_bc,a_cc,rap_be,a_ce,rap_bn,a_cn,rap_cs,pb,ra,rap_cw,rap_csw,rap_cse,rap_cc,a_ac) hypre_BoxLoop4Begin(hypre_StructMatrixNDim(A), loop_size, P_dbox, cstart, stridec, iP, R_dbox, cstart, stridec, iR, A_dbox, fstart, stridef, iA, RAP_dbox, cstart, stridec, iAc) { HYPRE_Int iAm1 = iA - zOffsetA; HYPRE_Int iAp1 = iA + zOffsetA; HYPRE_Int iP1 = iP - zOffsetP - yOffsetP; rap_bs[iAc] = rb[iR - rbOffset] * a_cs[iAm1] * pa[iP1]; iP1 = iP - zOffsetP - xOffsetP; rap_bw[iAc] = rb[iR - rbOffset] * a_cw[iAm1] * pa[iP1]; iP1 = iP - zOffsetP; rap_bc[iAc] = a_bc[iA] * pa[iP1] + rb[iR - rbOffset] * a_cc[iAm1] * pa[iP1] + rb[iR - rbOffset] * a_bc[iAm1]; iP1 = iP - zOffsetP + xOffsetP; rap_be[iAc] = rb[iR - rbOffset] * a_ce[iAm1] * pa[iP1]; iP1 = iP - zOffsetP + yOffsetP; rap_bn[iAc] = rb[iR - rbOffset] * a_cn[iAm1] * pa[iP1]; iP1 = iP - yOffsetP; rap_cs[iAc] = a_cs[iA] + rb[iR - rbOffset] * a_cs[iAm1] * pb[iP1 - pbOffset] + ra[iR] * a_cs[iAp1] * pa[iP1]; iP1 = iP - xOffsetP; rap_cw[iAc] = a_cw[iA] + rb[iR - rbOffset] * a_cw[iAm1] * pb[iP1 - pbOffset] + ra[iR] * a_cw[iAp1] * pa[iP1]; rap_csw[iAc] = 0.0; rap_cse[iAc] = 0.0; rap_cc[iAc] = a_cc[iA] + rb[iR - rbOffset] * a_cc[iAm1] * pb[iP - pbOffset] + ra[iR] * a_cc[iAp1] * pa[iP] + rb[iR - rbOffset] * a_ac[iAm1] + ra[iR] * a_bc[iAp1] + a_bc[iA] * pb[iP - pbOffset] + a_ac[iA] * pa[iP]; } hypre_BoxLoop4End(iP, iR, iA, iAc); #undef DEVICE_VAR } else { iA_offd = 0; iA_offdm1 = iA_offd - zOffsetA_offd; iA_offdp1 = iA_offd + zOffsetA_offd; a_cs_offd = a_cs[iA_offd]; a_cs_offdm1 = a_cs[iA_offdm1]; a_cs_offdp1 = a_cs[iA_offdp1]; a_cw_offd = a_cw[iA_offd]; a_cw_offdm1 = a_cw[iA_offdm1]; a_cw_offdp1 = a_cw[iA_offdp1]; a_ce_offdm1 = a_ce[iA_offdm1]; a_cn_offdm1 = a_cn[iA_offdm1]; a_bc_offd = a_bc[iA_offd]; a_bc_offdm1 = a_bc[iA_offdm1]; a_bc_offdp1 = a_bc[iA_offdp1]; a_ac_offd = a_ac[iA_offd]; a_ac_offdm1 = a_ac[iA_offdm1]; #define DEVICE_VAR is_device_ptr(rap_bs,rb,pa,rap_bw,rap_bc,a_cc,rap_be,rap_bn,rap_cs,pb,ra,rap_cw,rap_csw,rap_cse,rap_cc) hypre_BoxLoop4Begin(hypre_StructMatrixNDim(A), loop_size, P_dbox, cstart, stridec, iP, R_dbox, cstart, stridec, iR, A_dbox, fstart, stridef, iA, RAP_dbox, cstart, stridec, iAc); { HYPRE_Int iAm1 = iA - zOffsetA_diag; HYPRE_Int iAp1 = iA + zOffsetA_diag; HYPRE_Int iP1 = iP - zOffsetP - yOffsetP; rap_bs[iAc] = rb[iR - rbOffset] * a_cs_offdm1 * pa[iP1]; iP1 = iP - zOffsetP - xOffsetP; rap_bw[iAc] = rb[iR - rbOffset] * a_cw_offdm1 * pa[iP1]; iP1 = iP - zOffsetP; rap_bc[iAc] = a_bc_offd * pa[iP1] + rb[iR - rbOffset] * a_cc[iAm1] * pa[iP1] + rb[iR - rbOffset] * a_bc_offdm1; iP1 = iP - zOffsetP + xOffsetP; rap_be[iAc] = rb[iR - rbOffset] * a_ce_offdm1 * pa[iP1]; iP1 = iP - zOffsetP + yOffsetP; rap_bn[iAc] = rb[iR - rbOffset] * a_cn_offdm1 * pa[iP1]; iP1 = iP - yOffsetP; rap_cs[iAc] = a_cs_offd + rb[iR - rbOffset] * a_cs_offdm1 * pb[iP1 - pbOffset] + ra[iR] * a_cs_offdp1 * pa[iP1]; iP1 = iP - xOffsetP; rap_cw[iAc] = a_cw_offd + rb[iR - rbOffset] * a_cw_offdm1 * pb[iP1 - pbOffset] + ra[iR] * a_cw_offdp1 * pa[iP1]; rap_csw[iAc] = 0.0; rap_cse[iAc] = 0.0; rap_cc[iAc] = a_cc[iA] + rb[iR - rbOffset] * a_cc[iAm1] * pb[iP - pbOffset] + ra[iR] * a_cc[iAp1] * pa[iP] + rb[iR - rbOffset] * a_ac_offdm1 + ra[iR] * a_bc_offdp1 + a_bc_offd * pb[iP - pbOffset] + a_ac_offd * pa[iP]; } hypre_BoxLoop4End(iP, iR, iA, iAc); #undef DEVICE_VAR } /* }*/ /* end ForBoxI */ return hypre_error_flag; } /* core part of hypre_PFMG3BuildRAPSym, for one box, one value of fine_stencil_size (7) and one value of constant_coefficient (1). */ HYPRE_Int hypre_PFMG3BuildRAPSym_onebox_FSS07_CC1( HYPRE_Int ci, HYPRE_Int fi, hypre_StructMatrix *A, hypre_StructMatrix *P, hypre_StructMatrix *R, HYPRE_Int cdir, hypre_Index cindex, hypre_Index cstride, hypre_StructMatrix *RAP ) { hypre_Index index; hypre_Index index_temp; hypre_StructGrid *cgrid; hypre_BoxArray *cgrid_boxes; hypre_Box *cgrid_box; hypre_IndexRef cstart; hypre_Index fstart; HYPRE_Real *pa, *pb; HYPRE_Real *ra, *rb; HYPRE_Real *a_cc, *a_cw, *a_ce, *a_cs, *a_cn; HYPRE_Real *a_ac; HYPRE_Real *a_bc; HYPRE_Real *rap_cc, *rap_cw, *rap_cs; HYPRE_Real *rap_bc, *rap_bw, *rap_be, *rap_bs, *rap_bn; HYPRE_Real *rap_csw, *rap_cse; HYPRE_Int iA, iAm1, iAp1; HYPRE_Int iAc; HYPRE_Int iP, iP1; HYPRE_Int iR; HYPRE_Int zOffsetA; HYPRE_Int xOffsetP; HYPRE_Int yOffsetP; HYPRE_Int zOffsetP; cgrid = hypre_StructMatrixGrid(RAP); cgrid_boxes = hypre_StructGridBoxes(cgrid); cgrid_box = hypre_BoxArrayBox(cgrid_boxes, ci); cstart = hypre_BoxIMin(cgrid_box); hypre_StructMapCoarseToFine(cstart, cindex, cstride, fstart); /*----------------------------------------------------------------- * Extract pointers for interpolation operator: * pa is pointer for weight for f-point above c-point * pb is pointer for weight for f-point below c-point *-----------------------------------------------------------------*/ hypre_SetIndex3(index_temp, 0, 0, -1); MapIndex(index_temp, cdir, index); pa = hypre_StructMatrixExtractPointerByIndex(P, fi, index); hypre_SetIndex3(index_temp, 0, 0, 1); MapIndex(index_temp, cdir, index); pb = hypre_StructMatrixExtractPointerByIndex(P, fi, index); /*----------------------------------------------------------------- * Extract pointers for restriction operator: * ra is pointer for weight for f-point above c-point * rb is pointer for weight for f-point below c-point *-----------------------------------------------------------------*/ hypre_SetIndex3(index_temp, 0, 0, -1); MapIndex(index_temp, cdir, index); ra = hypre_StructMatrixExtractPointerByIndex(R, fi, index); hypre_SetIndex3(index_temp, 0, 0, 1); MapIndex(index_temp, cdir, index); rb = hypre_StructMatrixExtractPointerByIndex(R, fi, index); /*----------------------------------------------------------------- * Extract pointers for 7-point fine grid operator: * * a_cc is pointer for center coefficient * a_cw is pointer for west coefficient in same plane * a_ce is pointer for east coefficient in same plane * a_cs is pointer for south coefficient in same plane * a_cn is pointer for north coefficient in same plane * a_ac is pointer for center coefficient in plane above * a_bc is pointer for center coefficient in plane below *-----------------------------------------------------------------*/ hypre_SetIndex3(index_temp, 0, 0, 0); MapIndex(index_temp, cdir, index); a_cc = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index_temp, -1, 0, 0); MapIndex(index_temp, cdir, index); a_cw = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index_temp, 1, 0, 0); MapIndex(index_temp, cdir, index); a_ce = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index_temp, 0, -1, 0); MapIndex(index_temp, cdir, index); a_cs = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index_temp, 0, 1, 0); MapIndex(index_temp, cdir, index); a_cn = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index_temp, 0, 0, 1); MapIndex(index_temp, cdir, index); a_ac = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index_temp, 0, 0, -1); MapIndex(index_temp, cdir, index); a_bc = hypre_StructMatrixExtractPointerByIndex(A, fi, index); /*----------------------------------------------------------------- * Extract pointers for 19-point coarse grid operator: * * We build only the lower triangular part (plus diagonal). * * rap_cc is pointer for center coefficient (etc.) *-----------------------------------------------------------------*/ hypre_SetIndex3(index_temp, 0, 0, 0); MapIndex(index_temp, cdir, index); rap_cc = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index_temp, -1, 0, 0); MapIndex(index_temp, cdir, index); rap_cw = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index_temp, 0, -1, 0); MapIndex(index_temp, cdir, index); rap_cs = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index_temp, 0, 0, -1); MapIndex(index_temp, cdir, index); rap_bc = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index_temp, -1, 0, -1); MapIndex(index_temp, cdir, index); rap_bw = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index_temp, 1, 0, -1); MapIndex(index_temp, cdir, index); rap_be = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index_temp, 0, -1, -1); MapIndex(index_temp, cdir, index); rap_bs = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index_temp, 0, 1, -1); MapIndex(index_temp, cdir, index); rap_bn = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index_temp, -1, -1, 0); MapIndex(index_temp, cdir, index); rap_csw = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index_temp, 1, -1, 0); MapIndex(index_temp, cdir, index); rap_cse = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); /*----------------------------------------------------------------- * Define offsets for fine grid stencil and interpolation * * In the BoxLoop below I assume iA and iP refer to data associated * with the point which we are building the stencil for. The below * Offsets are used in refering to data associated with other points. *-----------------------------------------------------------------*/ hypre_SetIndex3(index_temp, 0, 0, 1); MapIndex(index_temp, cdir, index); zOffsetA = 0; zOffsetP = 0; hypre_SetIndex3(index_temp, 0, 1, 0); MapIndex(index_temp, cdir, index); yOffsetP = 0; hypre_SetIndex3(index_temp, 1, 0, 0); MapIndex(index_temp, cdir, index); xOffsetP = 0; /*-------------------------------------------------------------------- * Switch statement to direct control to apropriate BoxLoop depending * on stencil size. Default is full 27-point. *-----------------------------------------------------------------*/ /*-------------------------------------------------------------- * Loop for symmetric 7-point fine grid operator; produces a * symmetric 19-point coarse grid operator. We calculate only the * lower triangular stencil entries: (below-south, below-west, * below-center, below-east, below-north, center-south, * center-west, and center-center). *--------------------------------------------------------------*/ iP = 0; iR = 0; iA = 0; iAc = 0; iAm1 = iA - zOffsetA; iAp1 = iA + zOffsetA; iP1 = iP - zOffsetP - yOffsetP; rap_bs[iAc] = rb[iR] * a_cs[iAm1] * pa[iP1]; iP1 = iP - zOffsetP - xOffsetP; rap_bw[iAc] = rb[iR] * a_cw[iAm1] * pa[iP1]; iP1 = iP - zOffsetP; rap_bc[iAc] = a_bc[iA] * pa[iP1] + rb[iR] * a_cc[iAm1] * pa[iP1] + rb[iR] * a_bc[iAm1]; iP1 = iP - zOffsetP + xOffsetP; rap_be[iAc] = rb[iR] * a_ce[iAm1] * pa[iP1]; iP1 = iP - zOffsetP + yOffsetP; rap_bn[iAc] = rb[iR] * a_cn[iAm1] * pa[iP1]; iP1 = iP - yOffsetP; rap_cs[iAc] = a_cs[iA] + rb[iR] * a_cs[iAm1] * pb[iP1] + ra[iR] * a_cs[iAp1] * pa[iP1]; iP1 = iP - xOffsetP; rap_cw[iAc] = a_cw[iA] + rb[iR] * a_cw[iAm1] * pb[iP1] + ra[iR] * a_cw[iAp1] * pa[iP1]; rap_csw[iAc] = 0.0; rap_cse[iAc] = 0.0; rap_cc[iAc] = a_cc[iA] + rb[iR] * a_cc[iAm1] * pb[iP] + ra[iR] * a_cc[iAp1] * pa[iP] + rb[iR] * a_ac[iAm1] + ra[iR] * a_bc[iAp1] + a_bc[iA] * pb[iP] + a_ac[iA] * pa[iP]; /* }*/ /* end ForBoxI */ return hypre_error_flag; } /* core part of hypre_PFMG3BuildRAPSym, for one box, one value of fine_stencil_size (19) and one value of constant_coefficient (0). Within this functions there is a test on constant_coefficient_A as well. */ HYPRE_Int hypre_PFMG3BuildRAPSym_onebox_FSS19_CC0( HYPRE_Int ci, HYPRE_Int fi, hypre_StructMatrix *A, hypre_StructMatrix *P, hypre_StructMatrix *R, HYPRE_Int cdir, hypre_Index cindex, hypre_Index cstride, hypre_StructMatrix *RAP ) { hypre_Index index; hypre_Index index_temp; hypre_StructGrid *cgrid; hypre_BoxArray *cgrid_boxes; hypre_Box *cgrid_box; hypre_IndexRef cstart; hypre_Index stridec; hypre_Index fstart; hypre_IndexRef stridef; hypre_Index loop_size; HYPRE_Int constant_coefficient_A; hypre_Box *A_dbox; hypre_Box *P_dbox; hypre_Box *R_dbox; hypre_Box *RAP_dbox; HYPRE_Real *pa, *pb; HYPRE_Real *ra, *rb; HYPRE_Real *a_cc, *a_cw, *a_ce, *a_cs, *a_cn; HYPRE_Real *a_ac, *a_aw, *a_as; HYPRE_Real *a_bc, *a_bw, *a_be, *a_bs, *a_bn; HYPRE_Real *a_csw, *a_cse, *a_cnw, *a_cne; HYPRE_Real a_cs_offd, a_cs_offdm1, a_cs_offdp1; HYPRE_Real a_csw_offd, a_csw_offdm1, a_csw_offdp1; HYPRE_Real a_cse_offd, a_cse_offdm1, a_cse_offdp1; HYPRE_Real a_cn_offdm1, a_cne_offdm1, a_cnw_offdm1; HYPRE_Real a_cw_offd, a_cw_offdm1, a_cw_offdp1; HYPRE_Real a_ce_offdm1; HYPRE_Real a_ac_offd, a_ac_offdm1; HYPRE_Real a_aw_offd, a_aw_offdm1; HYPRE_Real a_as_offd, a_as_offdm1; HYPRE_Real a_bc_offd, a_bc_offdm1, a_bc_offdp1; HYPRE_Real a_be_offd, a_be_offdm1; HYPRE_Real a_bn_offd, a_bn_offdm1; HYPRE_Real a_bw_offd, a_bw_offdm1, a_bw_offdp1; HYPRE_Real a_bs_offd, a_bs_offdm1, a_bs_offdp1; HYPRE_Real *rap_cc, *rap_cw, *rap_cs; HYPRE_Real *rap_bc, *rap_bw, *rap_be, *rap_bs, *rap_bn; HYPRE_Real *rap_csw, *rap_cse; HYPRE_Real *rap_bsw, *rap_bse, *rap_bnw, *rap_bne; HYPRE_Int iA_offd, iA_offdm1, iA_offdp1; HYPRE_Int zOffsetA; HYPRE_Int zOffsetA_diag; HYPRE_Int zOffsetA_offd; HYPRE_Int xOffsetP; HYPRE_Int yOffsetP; HYPRE_Int zOffsetP; stridef = cstride; hypre_SetIndex3(stridec, 1, 1, 1); cgrid = hypre_StructMatrixGrid(RAP); cgrid_boxes = hypre_StructGridBoxes(cgrid); constant_coefficient_A = hypre_StructMatrixConstantCoefficient(A); cgrid_box = hypre_BoxArrayBox(cgrid_boxes, ci); cstart = hypre_BoxIMin(cgrid_box); hypre_StructMapCoarseToFine(cstart, cindex, cstride, fstart); A_dbox = hypre_BoxArrayBox(hypre_StructMatrixDataSpace(A), fi); P_dbox = hypre_BoxArrayBox(hypre_StructMatrixDataSpace(P), fi); R_dbox = hypre_BoxArrayBox(hypre_StructMatrixDataSpace(R), fi); RAP_dbox = hypre_BoxArrayBox(hypre_StructMatrixDataSpace(RAP), ci); /*----------------------------------------------------------------- * Extract pointers for interpolation operator: * pa is pointer for weight for f-point above c-point * pb is pointer for weight for f-point below c-point *-----------------------------------------------------------------*/ hypre_SetIndex3(index_temp, 0, 0, -1); MapIndex(index_temp, cdir, index); pa = hypre_StructMatrixExtractPointerByIndex(P, fi, index); hypre_SetIndex3(index_temp, 0, 0, 1); MapIndex(index_temp, cdir, index); pb = hypre_StructMatrixExtractPointerByIndex(P, fi, index); //RL PTROFFSET HYPRE_Int pbOffset = hypre_BoxOffsetDistance(P_dbox, index); /*----------------------------------------------------------------- * Extract pointers for restriction operator: * ra is pointer for weight for f-point above c-point * rb is pointer for weight for f-point below c-point *-----------------------------------------------------------------*/ hypre_SetIndex3(index_temp, 0, 0, -1); MapIndex(index_temp, cdir, index); ra = hypre_StructMatrixExtractPointerByIndex(R, fi, index); hypre_SetIndex3(index_temp, 0, 0, 1); MapIndex(index_temp, cdir, index); rb = hypre_StructMatrixExtractPointerByIndex(R, fi, index); //RL PTROFFSET HYPRE_Int rbOffset = hypre_BoxOffsetDistance(R_dbox, index); /*----------------------------------------------------------------- * Extract pointers for 7-point fine grid operator: * * a_cc is pointer for center coefficient * a_cw is pointer for west coefficient in same plane * a_ce is pointer for east coefficient in same plane * a_cs is pointer for south coefficient in same plane * a_cn is pointer for north coefficient in same plane * a_ac is pointer for center coefficient in plane above * a_bc is pointer for center coefficient in plane below *-----------------------------------------------------------------*/ hypre_SetIndex3(index_temp, 0, 0, 0); MapIndex(index_temp, cdir, index); a_cc = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index_temp, -1, 0, 0); MapIndex(index_temp, cdir, index); a_cw = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index_temp, 1, 0, 0); MapIndex(index_temp, cdir, index); a_ce = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index_temp, 0, -1, 0); MapIndex(index_temp, cdir, index); a_cs = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index_temp, 0, 1, 0); MapIndex(index_temp, cdir, index); a_cn = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index_temp, 0, 0, 1); MapIndex(index_temp, cdir, index); a_ac = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index_temp, 0, 0, -1); MapIndex(index_temp, cdir, index); a_bc = hypre_StructMatrixExtractPointerByIndex(A, fi, index); /*----------------------------------------------------------------- * Extract additional pointers for 19-point fine grid operator: * * a_aw is pointer for west coefficient in plane above * a_ae is pointer for east coefficient in plane above * a_as is pointer for south coefficient in plane above * a_an is pointer for north coefficient in plane above * a_bw is pointer for west coefficient in plane below * a_be is pointer for east coefficient in plane below * a_bs is pointer for south coefficient in plane below * a_bn is pointer for north coefficient in plane below * a_csw is pointer for southwest coefficient in same plane * a_cse is pointer for southeast coefficient in same plane * a_cnw is pointer for northwest coefficient in same plane * a_cne is pointer for northeast coefficient in same plane *-----------------------------------------------------------------*/ hypre_SetIndex3(index_temp, -1, 0, 1); MapIndex(index_temp, cdir, index); a_aw = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index_temp, 0, -1, 1); MapIndex(index_temp, cdir, index); a_as = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index_temp, -1, 0, -1); MapIndex(index_temp, cdir, index); a_bw = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index_temp, 1, 0, -1); MapIndex(index_temp, cdir, index); a_be = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index_temp, 0, -1, -1); MapIndex(index_temp, cdir, index); a_bs = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index_temp, 0, 1, -1); MapIndex(index_temp, cdir, index); a_bn = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index_temp, -1, -1, 0); MapIndex(index_temp, cdir, index); a_csw = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index_temp, 1, -1, 0); MapIndex(index_temp, cdir, index); a_cse = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index_temp, -1, 1, 0); MapIndex(index_temp, cdir, index); a_cnw = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index_temp, 1, 1, 0); MapIndex(index_temp, cdir, index); a_cne = hypre_StructMatrixExtractPointerByIndex(A, fi, index); /*----------------------------------------------------------------- * Extract pointers for 19-point coarse grid operator: * * We build only the lower triangular part (plus diagonal). * * rap_cc is pointer for center coefficient (etc.) *-----------------------------------------------------------------*/ hypre_SetIndex3(index_temp, 0, 0, 0); MapIndex(index_temp, cdir, index); rap_cc = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index_temp, -1, 0, 0); MapIndex(index_temp, cdir, index); rap_cw = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index_temp, 0, -1, 0); MapIndex(index_temp, cdir, index); rap_cs = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index_temp, 0, 0, -1); MapIndex(index_temp, cdir, index); rap_bc = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index_temp, -1, 0, -1); MapIndex(index_temp, cdir, index); rap_bw = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index_temp, 1, 0, -1); MapIndex(index_temp, cdir, index); rap_be = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index_temp, 0, -1, -1); MapIndex(index_temp, cdir, index); rap_bs = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index_temp, 0, 1, -1); MapIndex(index_temp, cdir, index); rap_bn = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index_temp, -1, -1, 0); MapIndex(index_temp, cdir, index); rap_csw = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index_temp, 1, -1, 0); MapIndex(index_temp, cdir, index); rap_cse = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); /*----------------------------------------------------------------- * Extract additional pointers for 27-point coarse grid operator: * * A 27-point coarse grid operator is produced when the fine grid * stencil is 19 or 27 point. * * We build only the lower triangular part. * * rap_csw is pointer for southwest coefficient in same plane (etc.) *-----------------------------------------------------------------*/ hypre_SetIndex3(index_temp, -1, -1, -1); MapIndex(index_temp, cdir, index); rap_bsw = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index_temp, 1, -1, -1); MapIndex(index_temp, cdir, index); rap_bse = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index_temp, -1, 1, -1); MapIndex(index_temp, cdir, index); rap_bnw = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index_temp, 1, 1, -1); MapIndex(index_temp, cdir, index); rap_bne = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); /*----------------------------------------------------------------- * Define offsets for fine grid stencil and interpolation * * In the BoxLoop below I assume iA and iP refer to data associated * with the point which we are building the stencil for. The below * Offsets are used in refering to data associated with other points. *-----------------------------------------------------------------*/ hypre_SetIndex3(index_temp, 0, 0, 1); MapIndex(index_temp, cdir, index); zOffsetP = hypre_BoxOffsetDistance(P_dbox, index); if ( constant_coefficient_A == 0 ) { zOffsetA = hypre_BoxOffsetDistance(A_dbox, index); } else { zOffsetA_diag = hypre_BoxOffsetDistance(A_dbox, index); zOffsetA_offd = 0; } hypre_SetIndex3(index_temp, 0, 1, 0); MapIndex(index_temp, cdir, index); yOffsetP = hypre_BoxOffsetDistance(P_dbox, index); hypre_SetIndex3(index_temp, 1, 0, 0); MapIndex(index_temp, cdir, index); xOffsetP = hypre_BoxOffsetDistance(P_dbox, index); /*-------------------------------------------------------------------- * Switch statement to direct control to apropriate BoxLoop depending * on stencil size. Default is full 27-point. *-----------------------------------------------------------------*/ /*-------------------------------------------------------------- * Loop for symmetric 19-point fine grid operator; produces a * symmetric 27-point coarse grid operator. We calculate only the * lower triangular stencil entries: (below-southwest, below-south, * below-southeast, below-west, below-center, below-east, * below-northwest, below-north, below-northeast, center-southwest, * center-south, center-southeast, center-west, and center-center). *--------------------------------------------------------------*/ hypre_BoxGetSize(cgrid_box, loop_size); if ( constant_coefficient_A == 0 ) { #define DEVICE_VAR is_device_ptr(rap_bsw,rb,a_csw,pa,rap_bs,a_cs,a_bs,rap_bse,a_cse,rap_bw,a_cw,a_bw,rap_bc,a_bc,a_cc,rap_be,a_ce,a_be,rap_bnw,a_cnw,rap_bn,a_cn,a_bn,rap_bne,a_cne,rap_csw,pb,ra,rap_cs,a_as,rap_cse,rap_cw,a_aw,rap_cc,a_ac) hypre_BoxLoop4Begin(hypre_StructMatrixNDim(A), loop_size, P_dbox, cstart, stridec, iP, R_dbox, cstart, stridec, iR, A_dbox, fstart, stridef, iA, RAP_dbox, cstart, stridec, iAc); { HYPRE_Int iAm1 = iA - zOffsetA; HYPRE_Int iAp1 = iA + zOffsetA; HYPRE_Int iP1 = iP - zOffsetP - yOffsetP - xOffsetP; rap_bsw[iAc] = rb[iR - rbOffset] * a_csw[iAm1] * pa[iP1]; iP1 = iP - zOffsetP - yOffsetP; rap_bs[iAc] = rb[iR - rbOffset] * a_cs[iAm1] * pa[iP1] + rb[iR - rbOffset] * a_bs[iAm1] + a_bs[iA] * pa[iP1]; iP1 = iP - zOffsetP - yOffsetP + xOffsetP; rap_bse[iAc] = rb[iR - rbOffset] * a_cse[iAm1] * pa[iP1]; iP1 = iP - zOffsetP - xOffsetP; rap_bw[iAc] = rb[iR - rbOffset] * a_cw[iAm1] * pa[iP1] + rb[iR - rbOffset] * a_bw[iAm1] + a_bw[iA] * pa[iP1]; iP1 = iP - zOffsetP; rap_bc[iAc] = a_bc[iA] * pa[iP1] + rb[iR - rbOffset] * a_cc[iAm1] * pa[iP1] + rb[iR - rbOffset] * a_bc[iAm1]; iP1 = iP - zOffsetP + xOffsetP; rap_be[iAc] = rb[iR - rbOffset] * a_ce[iAm1] * pa[iP1] + rb[iR - rbOffset] * a_be[iAm1] + a_be[iA] * pa[iP1]; iP1 = iP - zOffsetP + yOffsetP - xOffsetP; rap_bnw[iAc] = rb[iR - rbOffset] * a_cnw[iAm1] * pa[iP1]; iP1 = iP - zOffsetP + yOffsetP; rap_bn[iAc] = rb[iR - rbOffset] * a_cn[iAm1] * pa[iP1] + rb[iR - rbOffset] * a_bn[iAm1] + a_bn[iA] * pa[iP1]; iP1 = iP - zOffsetP + yOffsetP + xOffsetP; rap_bne[iAc] = rb[iR - rbOffset] * a_cne[iAm1] * pa[iP1]; iP1 = iP - yOffsetP - xOffsetP; rap_csw[iAc] = a_csw[iA] + rb[iR - rbOffset] * a_csw[iAm1] * pb[iP1 - pbOffset] + ra[iR] * a_csw[iAp1] * pa[iP1]; iP1 = iP - yOffsetP; rap_cs[iAc] = a_cs[iA] + rb[iR - rbOffset] * a_cs[iAm1] * pb[iP1 - pbOffset] + ra[iR] * a_cs[iAp1] * pa[iP1] + a_bs[iA] * pb[iP1 - pbOffset] + a_as[iA] * pa[iP1] + rb[iR - rbOffset] * a_as[iAm1] + ra[iR] * a_bs[iAp1]; iP1 = iP - yOffsetP + xOffsetP; rap_cse[iAc] = a_cse[iA] + rb[iR - rbOffset] * a_cse[iAm1] * pb[iP1 - pbOffset] + ra[iR] * a_cse[iAp1] * pa[iP1]; iP1 = iP - xOffsetP; rap_cw[iAc] = a_cw[iA] + rb[iR - rbOffset] * a_cw[iAm1] * pb[iP1 - pbOffset] + ra[iR] * a_cw[iAp1] * pa[iP1] + a_bw[iA] * pb[iP1 - pbOffset] + a_aw[iA] * pa[iP1] + rb[iR - rbOffset] * a_aw[iAm1] + ra[iR] * a_bw[iAp1]; rap_cc[iAc] = a_cc[iA] + rb[iR - rbOffset] * a_cc[iAm1] * pb[iP - pbOffset] + ra[iR] * a_cc[iAp1] * pa[iP] + rb[iR - rbOffset] * a_ac[iAm1] + ra[iR] * a_bc[iAp1] + a_bc[iA] * pb[iP - pbOffset] + a_ac[iA] * pa[iP]; } hypre_BoxLoop4End(iP, iR, iA, iAc); #undef DEVICE_VAR } else { iA_offd = 0; iA_offdm1 = iA_offd - zOffsetA_offd; iA_offdp1 = iA_offd + zOffsetA_offd; a_cs_offd = a_cs[iA_offd]; a_cs_offdm1 = a_cs[iA_offdm1]; a_cs_offdp1 = a_cs[iA_offdp1]; a_cw_offd = a_cw[iA_offd]; a_cw_offdm1 = a_cw[iA_offdm1]; a_cw_offdp1 = a_cw[iA_offdp1]; a_ce_offdm1 = a_ce[iA_offdm1]; a_csw_offd = a_csw[iA_offd]; a_csw_offdm1 = a_csw[iA_offdm1]; a_csw_offdp1 = a_csw[iA_offdp1]; a_cse_offd = a_cse[iA_offd]; a_cse_offdm1 = a_cse[iA_offdm1]; a_cse_offdp1 = a_cse[iA_offdp1]; a_cn_offdm1 = a_cn[iA_offdm1]; a_cne_offdm1 = a_cne[iA_offdm1]; a_cnw_offdm1 = a_cnw[iA_offdm1]; a_ac_offd = a_ac[iA_offd]; a_ac_offdm1 = a_ac[iA_offdm1]; a_aw_offd = a_aw[iA_offd]; a_aw_offdm1 = a_aw[iA_offdm1]; a_as_offd = a_as[iA_offd]; a_as_offdm1 = a_as[iA_offdm1]; a_bc_offd = a_bc[iA_offd]; a_bc_offdm1 = a_bc[iA_offdm1]; a_bc_offdp1 = a_bc[iA_offdp1]; a_be_offd = a_be[iA_offd]; a_be_offdm1 = a_be[iA_offdm1]; a_bn_offd = a_bn[iA_offd]; a_bn_offdm1 = a_bn[iA_offdm1]; a_bw_offd = a_bw[iA_offd]; a_bw_offdm1 = a_bw[iA_offdm1]; a_bw_offdp1 = a_bw[iA_offdp1]; a_bs_offd = a_bs[iA_offd]; a_bs_offdm1 = a_bs[iA_offdm1]; a_bs_offdp1 = a_bs[iA_offdp1]; #define DEVICE_VAR is_device_ptr(rap_bsw,rb,pa,rap_bs,rap_bse,rap_bw,rap_bc,a_cc,rap_be,rap_bnw,rap_bn,rap_bne,rap_csw,pb,ra,rap_cs,rap_cse,rap_cw,rap_cc) hypre_BoxLoop4Begin(hypre_StructMatrixNDim(A), loop_size, P_dbox, cstart, stridec, iP, R_dbox, cstart, stridec, iR, A_dbox, fstart, stridef, iA, RAP_dbox, cstart, stridec, iAc); { HYPRE_Int iAm1 = iA - zOffsetA_diag; HYPRE_Int iAp1 = iA + zOffsetA_diag; HYPRE_Int iP1 = iP - zOffsetP - yOffsetP - xOffsetP; rap_bsw[iAc] = rb[iR - rbOffset] * a_csw_offdm1 * pa[iP1]; iP1 = iP - zOffsetP - yOffsetP; rap_bs[iAc] = rb[iR - rbOffset] * a_cs_offdm1 * pa[iP1] + rb[iR - rbOffset] * a_bs_offdm1 + a_bs_offd * pa[iP1]; iP1 = iP - zOffsetP - yOffsetP + xOffsetP; rap_bse[iAc] = rb[iR - rbOffset] * a_cse_offdm1 * pa[iP1]; iP1 = iP - zOffsetP - xOffsetP; rap_bw[iAc] = rb[iR - rbOffset] * a_cw_offdm1 * pa[iP1] + rb[iR - rbOffset] * a_bw_offdm1 + a_bw_offd * pa[iP1]; iP1 = iP - zOffsetP; rap_bc[iAc] = a_bc_offd * pa[iP1] + rb[iR - rbOffset] * a_cc[iAm1] * pa[iP1] + rb[iR - rbOffset] * a_bc_offdm1; iP1 = iP - zOffsetP + xOffsetP; rap_be[iAc] = rb[iR - rbOffset] * a_ce_offdm1 * pa[iP1] + rb[iR - rbOffset] * a_be_offdm1 + a_be_offd * pa[iP1]; iP1 = iP - zOffsetP + yOffsetP - xOffsetP; rap_bnw[iAc] = rb[iR - rbOffset] * a_cnw_offdm1 * pa[iP1]; iP1 = iP - zOffsetP + yOffsetP; rap_bn[iAc] = rb[iR - rbOffset] * a_cn_offdm1 * pa[iP1] + rb[iR - rbOffset] * a_bn_offdm1 + a_bn_offd * pa[iP1]; iP1 = iP - zOffsetP + yOffsetP + xOffsetP; rap_bne[iAc] = rb[iR - rbOffset] * a_cne_offdm1 * pa[iP1]; iP1 = iP - yOffsetP - xOffsetP; rap_csw[iAc] = a_csw_offd + rb[iR - rbOffset] * a_csw_offdm1 * pb[iP1 - pbOffset] + ra[iR] * a_csw_offdp1 * pa[iP1 - pbOffset]; iP1 = iP - yOffsetP; rap_cs[iAc] = a_cs_offd + rb[iR - rbOffset] * a_cs_offdm1 * pb[iP1 - pbOffset] + ra[iR] * a_cs_offdp1 * pa[iP1] + a_bs_offd * pb[iP1 - pbOffset] + a_as_offd * pa[iP1] + rb[iR - rbOffset] * a_as_offdm1 + ra[iR] * a_bs_offdp1; iP1 = iP - yOffsetP + xOffsetP; rap_cse[iAc] = a_cse_offd + rb[iR - rbOffset] * a_cse_offdm1 * pb[iP1 - pbOffset] + ra[iR] * a_cse_offdp1 * pa[iP1]; iP1 = iP - xOffsetP; rap_cw[iAc] = a_cw_offd + rb[iR - rbOffset] * a_cw_offdm1 * pb[iP1 - pbOffset] + ra[iR] * a_cw_offdp1 * pa[iP1] + a_bw_offd * pb[iP1 - pbOffset] + a_aw_offd * pa[iP1] + rb[iR - rbOffset] * a_aw_offdm1 + ra[iR] * a_bw_offdp1; rap_cc[iAc] = a_cc[iA] + rb[iR - rbOffset] * a_cc[iAm1] * pb[iP - pbOffset] + ra[iR] * a_cc[iAp1] * pa[iP] + rb[iR - rbOffset] * a_ac_offdm1 + ra[iR] * a_bc_offdp1 + a_bc_offd * pb[iP - pbOffset] + a_ac_offd * pa[iP]; } hypre_BoxLoop4End(iP, iR, iA, iAc); #undef DEVICE_VAR } /* }*/ /* end ForBoxI */ return hypre_error_flag; } /* core part of hypre_PFMG3BuildRAPSym, for one box, one value of fine_stencil_size (19) and one value of constant_coefficient (1). */ HYPRE_Int hypre_PFMG3BuildRAPSym_onebox_FSS19_CC1( HYPRE_Int ci, HYPRE_Int fi, hypre_StructMatrix *A, hypre_StructMatrix *P, hypre_StructMatrix *R, HYPRE_Int cdir, hypre_Index cindex, hypre_Index cstride, hypre_StructMatrix *RAP ) { hypre_Index index; hypre_Index index_temp; hypre_StructGrid *cgrid; hypre_BoxArray *cgrid_boxes; hypre_Box *cgrid_box; hypre_IndexRef cstart; hypre_Index fstart; HYPRE_Real *pa, *pb; HYPRE_Real *ra, *rb; HYPRE_Real *a_cc, *a_cw, *a_ce, *a_cs, *a_cn; HYPRE_Real *a_ac, *a_aw, *a_as; HYPRE_Real *a_bc, *a_bw, *a_be, *a_bs, *a_bn; HYPRE_Real *a_csw, *a_cse, *a_cnw, *a_cne; HYPRE_Real *rap_cc, *rap_cw, *rap_cs; HYPRE_Real *rap_bc, *rap_bw, *rap_be, *rap_bs, *rap_bn; HYPRE_Real *rap_csw, *rap_cse; HYPRE_Real *rap_bsw, *rap_bse, *rap_bnw, *rap_bne; HYPRE_Int iA, iAm1, iAp1; HYPRE_Int iAc; HYPRE_Int iP, iP1; HYPRE_Int iR; HYPRE_Int zOffsetA; HYPRE_Int xOffsetP; HYPRE_Int yOffsetP; HYPRE_Int zOffsetP; cgrid = hypre_StructMatrixGrid(RAP); cgrid_boxes = hypre_StructGridBoxes(cgrid); cgrid_box = hypre_BoxArrayBox(cgrid_boxes, ci); cstart = hypre_BoxIMin(cgrid_box); hypre_StructMapCoarseToFine(cstart, cindex, cstride, fstart); /*----------------------------------------------------------------- * Extract pointers for interpolation operator: * pa is pointer for weight for f-point above c-point * pb is pointer for weight for f-point below c-point *-----------------------------------------------------------------*/ hypre_SetIndex3(index_temp, 0, 0, -1); MapIndex(index_temp, cdir, index); pa = hypre_StructMatrixExtractPointerByIndex(P, fi, index); hypre_SetIndex3(index_temp, 0, 0, 1); MapIndex(index_temp, cdir, index); pb = hypre_StructMatrixExtractPointerByIndex(P, fi, index); /*----------------------------------------------------------------- * Extract pointers for restriction operator: * ra is pointer for weight for f-point above c-point * rb is pointer for weight for f-point below c-point *-----------------------------------------------------------------*/ hypre_SetIndex3(index_temp, 0, 0, -1); MapIndex(index_temp, cdir, index); ra = hypre_StructMatrixExtractPointerByIndex(R, fi, index); hypre_SetIndex3(index_temp, 0, 0, 1); MapIndex(index_temp, cdir, index); rb = hypre_StructMatrixExtractPointerByIndex(R, fi, index); /*----------------------------------------------------------------- * Extract pointers for 7-point fine grid operator: * * a_cc is pointer for center coefficient * a_cw is pointer for west coefficient in same plane * a_ce is pointer for east coefficient in same plane * a_cs is pointer for south coefficient in same plane * a_cn is pointer for north coefficient in same plane * a_ac is pointer for center coefficient in plane above * a_bc is pointer for center coefficient in plane below *-----------------------------------------------------------------*/ hypre_SetIndex3(index_temp, 0, 0, 0); MapIndex(index_temp, cdir, index); a_cc = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index_temp, -1, 0, 0); MapIndex(index_temp, cdir, index); a_cw = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index_temp, 1, 0, 0); MapIndex(index_temp, cdir, index); a_ce = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index_temp, 0, -1, 0); MapIndex(index_temp, cdir, index); a_cs = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index_temp, 0, 1, 0); MapIndex(index_temp, cdir, index); a_cn = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index_temp, 0, 0, 1); MapIndex(index_temp, cdir, index); a_ac = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index_temp, 0, 0, -1); MapIndex(index_temp, cdir, index); a_bc = hypre_StructMatrixExtractPointerByIndex(A, fi, index); /*----------------------------------------------------------------- * Extract additional pointers for 19-point fine grid operator: * * a_aw is pointer for west coefficient in plane above * a_ae is pointer for east coefficient in plane above * a_as is pointer for south coefficient in plane above * a_an is pointer for north coefficient in plane above * a_bw is pointer for west coefficient in plane below * a_be is pointer for east coefficient in plane below * a_bs is pointer for south coefficient in plane below * a_bn is pointer for north coefficient in plane below * a_csw is pointer for southwest coefficient in same plane * a_cse is pointer for southeast coefficient in same plane * a_cnw is pointer for northwest coefficient in same plane * a_cne is pointer for northeast coefficient in same plane *-----------------------------------------------------------------*/ hypre_SetIndex3(index_temp, -1, 0, 1); MapIndex(index_temp, cdir, index); a_aw = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index_temp, 0, -1, 1); MapIndex(index_temp, cdir, index); a_as = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index_temp, -1, 0, -1); MapIndex(index_temp, cdir, index); a_bw = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index_temp, 1, 0, -1); MapIndex(index_temp, cdir, index); a_be = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index_temp, 0, -1, -1); MapIndex(index_temp, cdir, index); a_bs = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index_temp, 0, 1, -1); MapIndex(index_temp, cdir, index); a_bn = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index_temp, -1, -1, 0); MapIndex(index_temp, cdir, index); a_csw = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index_temp, 1, -1, 0); MapIndex(index_temp, cdir, index); a_cse = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index_temp, -1, 1, 0); MapIndex(index_temp, cdir, index); a_cnw = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index_temp, 1, 1, 0); MapIndex(index_temp, cdir, index); a_cne = hypre_StructMatrixExtractPointerByIndex(A, fi, index); /*----------------------------------------------------------------- * Extract pointers for 19-point coarse grid operator: * * We build only the lower triangular part (plus diagonal). * * rap_cc is pointer for center coefficient (etc.) *-----------------------------------------------------------------*/ hypre_SetIndex3(index_temp, 0, 0, 0); MapIndex(index_temp, cdir, index); rap_cc = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index_temp, -1, 0, 0); MapIndex(index_temp, cdir, index); rap_cw = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index_temp, 0, -1, 0); MapIndex(index_temp, cdir, index); rap_cs = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index_temp, 0, 0, -1); MapIndex(index_temp, cdir, index); rap_bc = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index_temp, -1, 0, -1); MapIndex(index_temp, cdir, index); rap_bw = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index_temp, 1, 0, -1); MapIndex(index_temp, cdir, index); rap_be = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index_temp, 0, -1, -1); MapIndex(index_temp, cdir, index); rap_bs = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index_temp, 0, 1, -1); MapIndex(index_temp, cdir, index); rap_bn = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index_temp, -1, -1, 0); MapIndex(index_temp, cdir, index); rap_csw = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index_temp, 1, -1, 0); MapIndex(index_temp, cdir, index); rap_cse = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); /*----------------------------------------------------------------- * Extract additional pointers for 27-point coarse grid operator: * * A 27-point coarse grid operator is produced when the fine grid * stencil is 19 or 27 point. * * We build only the lower triangular part. * * rap_csw is pointer for southwest coefficient in same plane (etc.) *-----------------------------------------------------------------*/ hypre_SetIndex3(index_temp, -1, -1, -1); MapIndex(index_temp, cdir, index); rap_bsw = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index_temp, 1, -1, -1); MapIndex(index_temp, cdir, index); rap_bse = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index_temp, -1, 1, -1); MapIndex(index_temp, cdir, index); rap_bnw = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index_temp, 1, 1, -1); MapIndex(index_temp, cdir, index); rap_bne = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); /*----------------------------------------------------------------- * Define offsets for fine grid stencil and interpolation * * In the BoxLoop below I assume iA and iP refer to data associated * with the point which we are building the stencil for. The below * Offsets are used in refering to data associated with other points. *-----------------------------------------------------------------*/ hypre_SetIndex3(index_temp, 0, 0, 1); MapIndex(index_temp, cdir, index); zOffsetA = 0; zOffsetP = 0; hypre_SetIndex3(index_temp, 0, 1, 0); MapIndex(index_temp, cdir, index); yOffsetP = 0; hypre_SetIndex3(index_temp, 1, 0, 0); MapIndex(index_temp, cdir, index); xOffsetP = 0; /*-------------------------------------------------------------------- * Switch statement to direct control to apropriate BoxLoop depending * on stencil size. Default is full 27-point. *-----------------------------------------------------------------*/ /*-------------------------------------------------------------- * Loop for symmetric 19-point fine grid operator; produces a * symmetric 27-point coarse grid operator. We calculate only the * lower triangular stencil entries: (below-southwest, below-south, * below-southeast, below-west, below-center, below-east, * below-northwest, below-north, below-northeast, center-southwest, * center-south, center-southeast, center-west, and center-center). *--------------------------------------------------------------*/ iP = 0; iR = 0; iA = 0; iAc = 0; iAm1 = iA - zOffsetA; iAp1 = iA + zOffsetA; iP1 = iP - zOffsetP - yOffsetP - xOffsetP; rap_bsw[iAc] = rb[iR] * a_csw[iAm1] * pa[iP1]; iP1 = iP - zOffsetP - yOffsetP; rap_bs[iAc] = rb[iR] * a_cs[iAm1] * pa[iP1] + rb[iR] * a_bs[iAm1] + a_bs[iA] * pa[iP1]; iP1 = iP - zOffsetP - yOffsetP + xOffsetP; rap_bse[iAc] = rb[iR] * a_cse[iAm1] * pa[iP1]; iP1 = iP - zOffsetP - xOffsetP; rap_bw[iAc] = rb[iR] * a_cw[iAm1] * pa[iP1] + rb[iR] * a_bw[iAm1] + a_bw[iA] * pa[iP1]; iP1 = iP - zOffsetP; rap_bc[iAc] = a_bc[iA] * pa[iP1] + rb[iR] * a_cc[iAm1] * pa[iP1] + rb[iR] * a_bc[iAm1]; iP1 = iP - zOffsetP + xOffsetP; rap_be[iAc] = rb[iR] * a_ce[iAm1] * pa[iP1] + rb[iR] * a_be[iAm1] + a_be[iA] * pa[iP1]; iP1 = iP - zOffsetP + yOffsetP - xOffsetP; rap_bnw[iAc] = rb[iR] * a_cnw[iAm1] * pa[iP1]; iP1 = iP - zOffsetP + yOffsetP; rap_bn[iAc] = rb[iR] * a_cn[iAm1] * pa[iP1] + rb[iR] * a_bn[iAm1] + a_bn[iA] * pa[iP1]; iP1 = iP - zOffsetP + yOffsetP + xOffsetP; rap_bne[iAc] = rb[iR] * a_cne[iAm1] * pa[iP1]; iP1 = iP - yOffsetP - xOffsetP; rap_csw[iAc] = a_csw[iA] + rb[iR] * a_csw[iAm1] * pb[iP1] + ra[iR] * a_csw[iAp1] * pa[iP1]; iP1 = iP - yOffsetP; rap_cs[iAc] = a_cs[iA] + rb[iR] * a_cs[iAm1] * pb[iP1] + ra[iR] * a_cs[iAp1] * pa[iP1] + a_bs[iA] * pb[iP1] + a_as[iA] * pa[iP1] + rb[iR] * a_as[iAm1] + ra[iR] * a_bs[iAp1]; iP1 = iP - yOffsetP + xOffsetP; rap_cse[iAc] = a_cse[iA] + rb[iR] * a_cse[iAm1] * pb[iP1] + ra[iR] * a_cse[iAp1] * pa[iP1]; iP1 = iP - xOffsetP; rap_cw[iAc] = a_cw[iA] + rb[iR] * a_cw[iAm1] * pb[iP1] + ra[iR] * a_cw[iAp1] * pa[iP1] + a_bw[iA] * pb[iP1] + a_aw[iA] * pa[iP1] + rb[iR] * a_aw[iAm1] + ra[iR] * a_bw[iAp1]; rap_cc[iAc] = a_cc[iA] + rb[iR] * a_cc[iAm1] * pb[iP] + ra[iR] * a_cc[iAp1] * pa[iP] + rb[iR] * a_ac[iAm1] + ra[iR] * a_bc[iAp1] + a_bc[iA] * pb[iP] + a_ac[iA] * pa[iP]; /* }*/ /* end ForBoxI */ return hypre_error_flag; } /* core part of hypre_PFMG3BuildRAPSym, for one box, one value of fine_stencil_size (27) and one value of constant_coefficient (0). Within this functions there is a test on constant_coefficient_A as well. */ HYPRE_Int hypre_PFMG3BuildRAPSym_onebox_FSS27_CC0( HYPRE_Int ci, HYPRE_Int fi, hypre_StructMatrix *A, hypre_StructMatrix *P, hypre_StructMatrix *R, HYPRE_Int cdir, hypre_Index cindex, hypre_Index cstride, hypre_StructMatrix *RAP ) { hypre_Index index; hypre_Index index_temp; hypre_StructGrid *cgrid; hypre_BoxArray *cgrid_boxes; hypre_Box *cgrid_box; hypre_IndexRef cstart; hypre_Index stridec; hypre_Index fstart; hypre_IndexRef stridef; hypre_Index loop_size; HYPRE_Int constant_coefficient_A; hypre_Box *A_dbox; hypre_Box *P_dbox; hypre_Box *R_dbox; hypre_Box *RAP_dbox; HYPRE_Real *pa, *pb; HYPRE_Real *ra, *rb; HYPRE_Real *a_cc, *a_cw, *a_ce, *a_cs, *a_cn; HYPRE_Real *a_ac, *a_aw, *a_as; HYPRE_Real *a_bc, *a_bw, *a_be, *a_bs, *a_bn; HYPRE_Real *a_csw, *a_cse, *a_cnw, *a_cne; HYPRE_Real *a_asw, *a_ase; HYPRE_Real *a_bsw, *a_bse, *a_bnw, *a_bne; HYPRE_Real a_cs_offd, a_cs_offdm1, a_cs_offdp1; HYPRE_Real a_csw_offd, a_csw_offdm1, a_csw_offdp1; HYPRE_Real a_cse_offd, a_cse_offdm1, a_cse_offdp1; HYPRE_Real a_cn_offdm1, a_cne_offdm1, a_cnw_offdm1; HYPRE_Real a_cw_offd, a_cw_offdm1, a_cw_offdp1; HYPRE_Real a_ce_offdm1; HYPRE_Real a_ac_offd, a_ac_offdm1; HYPRE_Real a_aw_offd, a_aw_offdm1; HYPRE_Real a_as_offd, a_as_offdm1; HYPRE_Real a_asw_offd, a_asw_offdm1; HYPRE_Real a_ase_offd, a_ase_offdm1; HYPRE_Real a_bc_offd, a_bc_offdm1, a_bc_offdp1; HYPRE_Real a_be_offd, a_be_offdm1; HYPRE_Real a_bn_offd, a_bn_offdm1; HYPRE_Real a_bw_offd, a_bw_offdm1, a_bw_offdp1; HYPRE_Real a_bs_offd, a_bs_offdm1, a_bs_offdp1; HYPRE_Real a_bsw_offd, a_bsw_offdm1, a_bsw_offdp1; HYPRE_Real a_bse_offd, a_bse_offdm1, a_bse_offdp1; HYPRE_Real a_bnw_offd, a_bnw_offdm1; HYPRE_Real a_bne_offd, a_bne_offdm1; HYPRE_Real *rap_cc, *rap_cw, *rap_cs; HYPRE_Real *rap_bc, *rap_bw, *rap_be, *rap_bs, *rap_bn; HYPRE_Real *rap_csw, *rap_cse; HYPRE_Real *rap_bsw, *rap_bse, *rap_bnw, *rap_bne; HYPRE_Int iA_offd, iA_offdm1, iA_offdp1; HYPRE_Int zOffsetA; HYPRE_Int zOffsetA_diag; HYPRE_Int zOffsetA_offd; HYPRE_Int xOffsetP; HYPRE_Int yOffsetP; HYPRE_Int zOffsetP; stridef = cstride; hypre_SetIndex3(stridec, 1, 1, 1); cgrid = hypre_StructMatrixGrid(RAP); cgrid_boxes = hypre_StructGridBoxes(cgrid); constant_coefficient_A = hypre_StructMatrixConstantCoefficient(A); cgrid_box = hypre_BoxArrayBox(cgrid_boxes, ci); cstart = hypre_BoxIMin(cgrid_box); hypre_StructMapCoarseToFine(cstart, cindex, cstride, fstart); A_dbox = hypre_BoxArrayBox(hypre_StructMatrixDataSpace(A), fi); P_dbox = hypre_BoxArrayBox(hypre_StructMatrixDataSpace(P), fi); R_dbox = hypre_BoxArrayBox(hypre_StructMatrixDataSpace(R), fi); RAP_dbox = hypre_BoxArrayBox(hypre_StructMatrixDataSpace(RAP), ci); /*----------------------------------------------------------------- * Extract pointers for interpolation operator: * pa is pointer for weight for f-point above c-point * pb is pointer for weight for f-point below c-point *-----------------------------------------------------------------*/ hypre_SetIndex3(index_temp, 0, 0, -1); MapIndex(index_temp, cdir, index); pa = hypre_StructMatrixExtractPointerByIndex(P, fi, index); hypre_SetIndex3(index_temp, 0, 0, 1); MapIndex(index_temp, cdir, index); pb = hypre_StructMatrixExtractPointerByIndex(P, fi, index); //RL PTROFFSET: HYPRE_Int pbOffset = hypre_BoxOffsetDistance(P_dbox, index); /*----------------------------------------------------------------- * Extract pointers for restriction operator: * ra is pointer for weight for f-point above c-point * rb is pointer for weight for f-point below c-point *-----------------------------------------------------------------*/ hypre_SetIndex3(index_temp, 0, 0, -1); MapIndex(index_temp, cdir, index); ra = hypre_StructMatrixExtractPointerByIndex(R, fi, index); hypre_SetIndex3(index_temp, 0, 0, 1); MapIndex(index_temp, cdir, index); rb = hypre_StructMatrixExtractPointerByIndex(R, fi, index); //RL PTROFFSET: HYPRE_Int rbOffset = hypre_BoxOffsetDistance(R_dbox, index); /*----------------------------------------------------------------- * Extract pointers for 7-point fine grid operator: * * a_cc is pointer for center coefficient * a_cw is pointer for west coefficient in same plane * a_ce is pointer for east coefficient in same plane * a_cs is pointer for south coefficient in same plane * a_cn is pointer for north coefficient in same plane * a_ac is pointer for center coefficient in plane above * a_bc is pointer for center coefficient in plane below *-----------------------------------------------------------------*/ hypre_SetIndex3(index_temp, 0, 0, 0); MapIndex(index_temp, cdir, index); a_cc = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index_temp, -1, 0, 0); MapIndex(index_temp, cdir, index); a_cw = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index_temp, 1, 0, 0); MapIndex(index_temp, cdir, index); a_ce = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index_temp, 0, -1, 0); MapIndex(index_temp, cdir, index); a_cs = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index_temp, 0, 1, 0); MapIndex(index_temp, cdir, index); a_cn = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index_temp, 0, 0, 1); MapIndex(index_temp, cdir, index); a_ac = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index_temp, 0, 0, -1); MapIndex(index_temp, cdir, index); a_bc = hypre_StructMatrixExtractPointerByIndex(A, fi, index); /*----------------------------------------------------------------- * Extract additional pointers for 19-point fine grid operator: * * a_aw is pointer for west coefficient in plane above * a_ae is pointer for east coefficient in plane above * a_as is pointer for south coefficient in plane above * a_an is pointer for north coefficient in plane above * a_bw is pointer for west coefficient in plane below * a_be is pointer for east coefficient in plane below * a_bs is pointer for south coefficient in plane below * a_bn is pointer for north coefficient in plane below * a_csw is pointer for southwest coefficient in same plane * a_cse is pointer for southeast coefficient in same plane * a_cnw is pointer for northwest coefficient in same plane * a_cne is pointer for northeast coefficient in same plane *-----------------------------------------------------------------*/ hypre_SetIndex3(index_temp, -1, 0, 1); MapIndex(index_temp, cdir, index); a_aw = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index_temp, 0, -1, 1); MapIndex(index_temp, cdir, index); a_as = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index_temp, -1, 0, -1); MapIndex(index_temp, cdir, index); a_bw = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index_temp, 1, 0, -1); MapIndex(index_temp, cdir, index); a_be = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index_temp, 0, -1, -1); MapIndex(index_temp, cdir, index); a_bs = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index_temp, 0, 1, -1); MapIndex(index_temp, cdir, index); a_bn = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index_temp, -1, -1, 0); MapIndex(index_temp, cdir, index); a_csw = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index_temp, 1, -1, 0); MapIndex(index_temp, cdir, index); a_cse = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index_temp, -1, 1, 0); MapIndex(index_temp, cdir, index); a_cnw = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index_temp, 1, 1, 0); MapIndex(index_temp, cdir, index); a_cne = hypre_StructMatrixExtractPointerByIndex(A, fi, index); /*----------------------------------------------------------------- * Extract additional pointers for 27-point fine grid operator: * * a_asw is pointer for southwest coefficient in plane above * a_ase is pointer for southeast coefficient in plane above * a_anw is pointer for northwest coefficient in plane above * a_ane is pointer for northeast coefficient in plane above * a_bsw is pointer for southwest coefficient in plane below * a_bse is pointer for southeast coefficient in plane below * a_bnw is pointer for northwest coefficient in plane below * a_bne is pointer for northeast coefficient in plane below *-----------------------------------------------------------------*/ hypre_SetIndex3(index_temp, -1, -1, 1); MapIndex(index_temp, cdir, index); a_asw = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index_temp, 1, -1, 1); MapIndex(index_temp, cdir, index); a_ase = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index_temp, -1, -1, -1); MapIndex(index_temp, cdir, index); a_bsw = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index_temp, 1, -1, -1); MapIndex(index_temp, cdir, index); a_bse = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index_temp, -1, 1, -1); MapIndex(index_temp, cdir, index); a_bnw = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index_temp, 1, 1, -1); MapIndex(index_temp, cdir, index); a_bne = hypre_StructMatrixExtractPointerByIndex(A, fi, index); /*----------------------------------------------------------------- * Extract pointers for 19-point coarse grid operator: * * We build only the lower triangular part (plus diagonal). * * rap_cc is pointer for center coefficient (etc.) *-----------------------------------------------------------------*/ hypre_SetIndex3(index_temp, 0, 0, 0); MapIndex(index_temp, cdir, index); rap_cc = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index_temp, -1, 0, 0); MapIndex(index_temp, cdir, index); rap_cw = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index_temp, 0, -1, 0); MapIndex(index_temp, cdir, index); rap_cs = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index_temp, 0, 0, -1); MapIndex(index_temp, cdir, index); rap_bc = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index_temp, -1, 0, -1); MapIndex(index_temp, cdir, index); rap_bw = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index_temp, 1, 0, -1); MapIndex(index_temp, cdir, index); rap_be = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index_temp, 0, -1, -1); MapIndex(index_temp, cdir, index); rap_bs = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index_temp, 0, 1, -1); MapIndex(index_temp, cdir, index); rap_bn = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index_temp, -1, -1, 0); MapIndex(index_temp, cdir, index); rap_csw = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index_temp, 1, -1, 0); MapIndex(index_temp, cdir, index); rap_cse = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); /*----------------------------------------------------------------- * Extract additional pointers for 27-point coarse grid operator: * * A 27-point coarse grid operator is produced when the fine grid * stencil is 19 or 27 point. * * We build only the lower triangular part. * * rap_csw is pointer for southwest coefficient in same plane (etc.) *-----------------------------------------------------------------*/ hypre_SetIndex3(index_temp, -1, -1, -1); MapIndex(index_temp, cdir, index); rap_bsw = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index_temp, 1, -1, -1); MapIndex(index_temp, cdir, index); rap_bse = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index_temp, -1, 1, -1); MapIndex(index_temp, cdir, index); rap_bnw = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index_temp, 1, 1, -1); MapIndex(index_temp, cdir, index); rap_bne = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); /*----------------------------------------------------------------- * Define offsets for fine grid stencil and interpolation * * In the BoxLoop below I assume iA and iP refer to data associated * with the point which we are building the stencil for. The below * Offsets are used in refering to data associated with other points. *-----------------------------------------------------------------*/ hypre_SetIndex3(index_temp, 0, 0, 1); MapIndex(index_temp, cdir, index); zOffsetP = hypre_BoxOffsetDistance(P_dbox, index); if ( constant_coefficient_A == 0 ) { zOffsetA = hypre_BoxOffsetDistance(A_dbox, index); } else { zOffsetA_diag = hypre_BoxOffsetDistance(A_dbox, index); zOffsetA_offd = 0; } hypre_SetIndex3(index_temp, 0, 1, 0); MapIndex(index_temp, cdir, index); yOffsetP = hypre_BoxOffsetDistance(P_dbox, index); hypre_SetIndex3(index_temp, 1, 0, 0); MapIndex(index_temp, cdir, index); xOffsetP = hypre_BoxOffsetDistance(P_dbox, index); /*-------------------------------------------------------------------- * Switch statement to direct control to apropriate BoxLoop depending * on stencil size. Default is full 27-point. *-----------------------------------------------------------------*/ /*-------------------------------------------------------------- * Loop for symmetric 27-point fine grid operator; produces a * symmetric 27-point coarse grid operator. We calculate only the * lower triangular stencil entries: (below-southwest, below-south, * below-southeast, below-west, below-center, below-east, * below-northwest, below-north, below-northeast, center-southwest, * center-south, center-southeast, center-west, and center-center). *--------------------------------------------------------------*/ hypre_BoxGetSize(cgrid_box, loop_size); if ( constant_coefficient_A == 0 ) { #define DEVICE_VAR is_device_ptr(rap_bsw,rb,a_csw,pa,a_bsw,rap_bs,a_cs,a_bs,rap_bse,a_cse,a_bse,rap_bw,a_cw,a_bw,rap_bc,a_bc,a_cc,rap_be,a_ce,a_be,rap_bnw,a_cnw,a_bnw,rap_bn,a_cn,a_bn,rap_bne,a_cne,a_bne,rap_csw,pb,ra,a_asw,rap_cs,a_as,rap_cse,a_ase,rap_cw,a_aw,rap_cc,a_ac) hypre_BoxLoop4Begin(hypre_StructMatrixNDim(A), loop_size, P_dbox, cstart, stridec, iP, R_dbox, cstart, stridec, iR, A_dbox, fstart, stridef, iA, RAP_dbox, cstart, stridec, iAc); { HYPRE_Int iAm1 = iA - zOffsetA; HYPRE_Int iAp1 = iA + zOffsetA; HYPRE_Int iP1 = iP - zOffsetP - yOffsetP - xOffsetP; rap_bsw[iAc] = rb[iR - rbOffset] * a_csw[iAm1] * pa[iP1] + rb[iR - rbOffset] * a_bsw[iAm1] + a_bsw[iA] * pa[iP1]; iP1 = iP - zOffsetP - yOffsetP; rap_bs[iAc] = rb[iR - rbOffset] * a_cs[iAm1] * pa[iP1] + rb[iR - rbOffset] * a_bs[iAm1] + a_bs[iA] * pa[iP1]; iP1 = iP - zOffsetP - yOffsetP + xOffsetP; rap_bse[iAc] = rb[iR - rbOffset] * a_cse[iAm1] * pa[iP1] + rb[iR - rbOffset] * a_bse[iAm1] + a_bse[iA] * pa[iP1]; iP1 = iP - zOffsetP - xOffsetP; rap_bw[iAc] = rb[iR - rbOffset] * a_cw[iAm1] * pa[iP1] + rb[iR - rbOffset] * a_bw[iAm1] + a_bw[iA] * pa[iP1]; iP1 = iP - zOffsetP; rap_bc[iAc] = a_bc[iA] * pa[iP1] + rb[iR - rbOffset] * a_cc[iAm1] * pa[iP1] + rb[iR - rbOffset] * a_bc[iAm1]; iP1 = iP - zOffsetP + xOffsetP; rap_be[iAc] = rb[iR - rbOffset] * a_ce[iAm1] * pa[iP1] + rb[iR - rbOffset] * a_be[iAm1] + a_be[iA] * pa[iP1]; iP1 = iP - zOffsetP + yOffsetP - xOffsetP; rap_bnw[iAc] = rb[iR - rbOffset] * a_cnw[iAm1] * pa[iP1] + rb[iR - rbOffset] * a_bnw[iAm1] + a_bnw[iA] * pa[iP1]; iP1 = iP - zOffsetP + yOffsetP; rap_bn[iAc] = rb[iR - rbOffset] * a_cn[iAm1] * pa[iP1] + rb[iR - rbOffset] * a_bn[iAm1] + a_bn[iA] * pa[iP1]; iP1 = iP - zOffsetP + yOffsetP + xOffsetP; rap_bne[iAc] = rb[iR - rbOffset] * a_cne[iAm1] * pa[iP1] + rb[iR - rbOffset] * a_bne[iAm1] + a_bne[iA] * pa[iP1]; iP1 = iP - yOffsetP - xOffsetP; rap_csw[iAc] = a_csw[iA] + rb[iR - rbOffset] * a_csw[iAm1] * pb[iP1 - pbOffset] + ra[iR] * a_csw[iAp1] * pa[iP1] + a_bsw[iA] * pb[iP1 - pbOffset] + a_asw[iA] * pa[iP1] + rb[iR - rbOffset] * a_asw[iAm1] + ra[iR] * a_bsw[iAp1]; iP1 = iP - yOffsetP; rap_cs[iAc] = a_cs[iA] + rb[iR - rbOffset] * a_cs[iAm1] * pb[iP1 - pbOffset] + ra[iR] * a_cs[iAp1] * pa[iP1] + a_bs[iA] * pb[iP1 - pbOffset] + a_as[iA] * pa[iP1] + rb[iR - rbOffset] * a_as[iAm1] + ra[iR] * a_bs[iAp1]; iP1 = iP - yOffsetP + xOffsetP; rap_cse[iAc] = a_cse[iA] + rb[iR - rbOffset] * a_cse[iAm1] * pb[iP1 - pbOffset] + ra[iR] * a_cse[iAp1] * pa[iP1] + a_bse[iA] * pb[iP1 - pbOffset] + a_ase[iA] * pa[iP1] + rb[iR - rbOffset] * a_ase[iAm1] + ra[iR] * a_bse[iAp1]; iP1 = iP - xOffsetP; rap_cw[iAc] = a_cw[iA] + rb[iR - rbOffset] * a_cw[iAm1] * pb[iP1 - pbOffset] + ra[iR] * a_cw[iAp1] * pa[iP1] + a_bw[iA] * pb[iP1 - pbOffset] + a_aw[iA] * pa[iP1] + rb[iR - rbOffset] * a_aw[iAm1] + ra[iR] * a_bw[iAp1]; rap_cc[iAc] = a_cc[iA] + rb[iR - rbOffset] * a_cc[iAm1] * pb[iP - pbOffset] + ra[iR] * a_cc[iAp1] * pa[iP] + rb[iR - rbOffset] * a_ac[iAm1] + ra[iR] * a_bc[iAp1] + a_bc[iA] * pb[iP - pbOffset] + a_ac[iA] * pa[iP]; } hypre_BoxLoop4End(iP, iR, iA, iAc); #undef DEVICE_VAR } else { iA_offd = 0; iA_offdm1 = iA_offd - zOffsetA_offd; iA_offdp1 = iA_offd + zOffsetA_offd; a_cs_offd = a_cs[iA_offd]; a_cs_offdm1 = a_cs[iA_offdm1]; a_cs_offdp1 = a_cs[iA_offdp1]; a_cse_offd = a_cse[iA_offd]; a_cse_offdm1 = a_cse[iA_offdm1]; a_cse_offdp1 = a_cse[iA_offdp1]; a_csw_offd = a_csw[iA_offd]; a_csw_offdm1 = a_csw[iA_offdm1]; a_csw_offdp1 = a_csw[iA_offdp1]; a_cw_offd = a_cw[iA_offd]; a_cw_offdm1 = a_cw[iA_offdm1]; a_cw_offdp1 = a_cw[iA_offdp1]; a_cn_offdm1 = a_cn[iA_offdm1]; a_cne_offdm1 = a_cne[iA_offdm1]; a_cnw_offdm1 = a_cnw[iA_offdm1]; a_ce_offdm1 = a_ce[iA_offdm1]; a_ac_offd = a_ac[iA_offd]; a_ac_offdm1 = a_ac[iA_offdm1]; a_as_offd = a_as[iA_offd]; a_as_offdm1 = a_as[iA_offdm1]; a_aw_offd = a_aw[iA_offd]; a_aw_offdm1 = a_aw[iA_offdm1]; a_asw_offd = a_asw[iA_offd]; a_asw_offdm1 = a_asw[iA_offdm1]; a_ase_offd = a_ase[iA_offd]; a_ase_offdm1 = a_ase[iA_offdm1]; a_bc_offd = a_bc[iA_offd]; a_bc_offdm1 = a_bc[iA_offdm1]; a_bc_offdp1 = a_bc[iA_offdp1]; a_bs_offd = a_bs[iA_offd]; a_bs_offdm1 = a_bs[iA_offdm1]; a_bs_offdp1 = a_bs[iA_offdp1]; a_bsw_offd = a_bsw[iA_offd]; a_bsw_offdm1 = a_bsw[iA_offdm1]; a_bsw_offdp1 = a_bsw[iA_offdp1]; a_bse_offd = a_bse[iA_offd]; a_bse_offdm1 = a_bse[iA_offdm1]; a_bse_offdp1 = a_bse[iA_offdp1]; a_be_offd = a_be[iA_offd]; a_be_offdm1 = a_be[iA_offdm1]; a_bw_offd = a_bw[iA_offd]; a_bw_offdm1 = a_bw[iA_offdm1]; a_bw_offdp1 = a_bw[iA_offdp1]; a_bn_offd = a_bn[iA_offd]; a_bn_offdm1 = a_bn[iA_offdm1]; a_bnw_offd = a_bnw[iA_offd]; a_bnw_offdm1 = a_bnw[iA_offdm1]; a_bne_offd = a_bne[iA_offd]; a_bne_offdm1 = a_bne[iA_offdm1]; #define DEVICE_VAR is_device_ptr(rap_bsw,rb,pa,rap_bs,rap_bse,rap_bw,rap_bc,a_cc,rap_be,rap_bnw,rap_bn,rap_bne,rap_csw,pb,ra,rap_cs,rap_cse,rap_cw,rap_cc) hypre_BoxLoop4Begin(hypre_StructMatrixNDim(A), loop_size, P_dbox, cstart, stridec, iP, R_dbox, cstart, stridec, iR, A_dbox, fstart, stridef, iA, RAP_dbox, cstart, stridec, iAc); { HYPRE_Int iAm1 = iA - zOffsetA_diag; HYPRE_Int iAp1 = iA + zOffsetA_diag; HYPRE_Int iP1 = iP - zOffsetP - yOffsetP - xOffsetP; rap_bsw[iAc] = rb[iR - rbOffset] * a_csw_offdm1 * pa[iP1] + rb[iR - rbOffset] * a_bsw_offdm1 + a_bsw_offd * pa[iP1]; iP1 = iP - zOffsetP - yOffsetP; rap_bs[iAc] = rb[iR - rbOffset] * a_cs_offdm1 * pa[iP1] + rb[iR - rbOffset] * a_bs_offdm1 + a_bs_offd * pa[iP1]; iP1 = iP - zOffsetP - yOffsetP + xOffsetP; rap_bse[iAc] = rb[iR - rbOffset] * a_cse_offdm1 * pa[iP1] + rb[iR - rbOffset] * a_bse_offdm1 + a_bse_offd * pa[iP1]; iP1 = iP - zOffsetP - xOffsetP; rap_bw[iAc] = rb[iR - rbOffset] * a_cw_offdm1 * pa[iP1] + rb[iR - rbOffset] * a_bw_offdm1 + a_bw_offd * pa[iP1]; iP1 = iP - zOffsetP; rap_bc[iAc] = a_bc_offd * pa[iP1] + rb[iR - rbOffset] * a_cc[iAm1] * pa[iP1] + rb[iR - rbOffset] * a_bc_offdm1; iP1 = iP - zOffsetP + xOffsetP; rap_be[iAc] = rb[iR - rbOffset] * a_ce_offdm1 * pa[iP1] + rb[iR - rbOffset] * a_be_offdm1 + a_be_offd * pa[iP1]; iP1 = iP - zOffsetP + yOffsetP - xOffsetP; rap_bnw[iAc] = rb[iR - rbOffset] * a_cnw_offdm1 * pa[iP1] + rb[iR - rbOffset] * a_bnw_offdm1 + a_bnw_offd * pa[iP1]; iP1 = iP - zOffsetP + yOffsetP; rap_bn[iAc] = rb[iR - rbOffset] * a_cn_offdm1 * pa[iP1] + rb[iR - rbOffset] * a_bn_offdm1 + a_bn_offd * pa[iP1]; iP1 = iP - zOffsetP + yOffsetP + xOffsetP; rap_bne[iAc] = rb[iR - rbOffset] * a_cne_offdm1 * pa[iP1] + rb[iR - rbOffset] * a_bne_offdm1 + a_bne_offd * pa[iP1]; iP1 = iP - yOffsetP - xOffsetP; rap_csw[iAc] = a_csw_offd + rb[iR - rbOffset] * a_csw_offdm1 * pb[iP1 - pbOffset] + ra[iR] * a_csw_offdp1 * pa[iP1] + a_bsw_offd * pb[iP1 - pbOffset] + a_asw_offd * pa[iP1] + rb[iR - rbOffset] * a_asw_offdm1 + ra[iR] * a_bsw_offdp1; iP1 = iP - yOffsetP; rap_cs[iAc] = a_cs_offd + rb[iR - rbOffset] * a_cs_offdm1 * pb[iP1 - pbOffset] + ra[iR] * a_cs_offdp1 * pa[iP1] + a_bs_offd * pb[iP1 - pbOffset] + a_as_offd * pa[iP1] + rb[iR - rbOffset] * a_as_offdm1 + ra[iR] * a_bs_offdp1; iP1 = iP - yOffsetP + xOffsetP; rap_cse[iAc] = a_cse_offd + rb[iR - rbOffset] * a_cse_offdm1 * pb[iP1 - pbOffset] + ra[iR] * a_cse_offdp1 * pa[iP1] + a_bse_offd * pb[iP1 - pbOffset] + a_ase_offd * pa[iP1] + rb[iR - rbOffset] * a_ase_offdm1 + ra[iR] * a_bse_offdp1; iP1 = iP - xOffsetP; rap_cw[iAc] = a_cw_offd + rb[iR - rbOffset] * a_cw_offdm1 * pb[iP1 - pbOffset] + ra[iR] * a_cw_offdp1 * pa[iP1] + a_bw_offd * pb[iP1 - pbOffset] + a_aw_offd * pa[iP1] + rb[iR - rbOffset] * a_aw_offdm1 + ra[iR] * a_bw_offdp1; rap_cc[iAc] = a_cc[iA] + rb[iR - rbOffset] * a_cc[iAm1] * pb[iP - pbOffset] + ra[iR] * a_cc[iAp1] * pa[iP] + rb[iR - rbOffset] * a_ac_offdm1 + ra[iR] * a_bc_offdp1 + a_bc_offd * pb[iP - pbOffset] + a_ac_offd * pa[iP]; } hypre_BoxLoop4End(iP, iR, iA, iAc); #undef DEVICE_VAR } /* }*/ /* end ForBoxI */ return hypre_error_flag; } /* core part of hypre_PFMG3BuildRAPSym, for one box, one value of fine_stencil_size (27) and one value of constant_coefficient (1). */ HYPRE_Int hypre_PFMG3BuildRAPSym_onebox_FSS27_CC1( HYPRE_Int ci, HYPRE_Int fi, hypre_StructMatrix *A, hypre_StructMatrix *P, hypre_StructMatrix *R, HYPRE_Int cdir, hypre_Index cindex, hypre_Index cstride, hypre_StructMatrix *RAP ) { hypre_Index index; hypre_Index index_temp; hypre_StructGrid *cgrid; hypre_BoxArray *cgrid_boxes; hypre_Box *cgrid_box; hypre_IndexRef cstart; hypre_Index fstart; HYPRE_Real *pa, *pb; HYPRE_Real *ra, *rb; HYPRE_Real *a_cc, *a_cw, *a_ce, *a_cs, *a_cn; HYPRE_Real *a_ac, *a_aw, *a_as; HYPRE_Real *a_bc, *a_bw, *a_be, *a_bs, *a_bn; HYPRE_Real *a_csw, *a_cse, *a_cnw, *a_cne; HYPRE_Real *a_asw, *a_ase; HYPRE_Real *a_bsw, *a_bse, *a_bnw, *a_bne; HYPRE_Real *rap_cc, *rap_cw, *rap_cs; HYPRE_Real *rap_bc, *rap_bw, *rap_be, *rap_bs, *rap_bn; HYPRE_Real *rap_csw, *rap_cse; HYPRE_Real *rap_bsw, *rap_bse, *rap_bnw, *rap_bne; HYPRE_Int iA, iAm1, iAp1; HYPRE_Int iAc; HYPRE_Int iP, iP1; HYPRE_Int iR; HYPRE_Int zOffsetA; HYPRE_Int xOffsetP; HYPRE_Int yOffsetP; HYPRE_Int zOffsetP; cgrid = hypre_StructMatrixGrid(RAP); cgrid_boxes = hypre_StructGridBoxes(cgrid); cgrid_box = hypre_BoxArrayBox(cgrid_boxes, ci); cstart = hypre_BoxIMin(cgrid_box); hypre_StructMapCoarseToFine(cstart, cindex, cstride, fstart); /*----------------------------------------------------------------- * Extract pointers for interpolation operator: * pa is pointer for weight for f-point above c-point * pb is pointer for weight for f-point below c-point *-----------------------------------------------------------------*/ hypre_SetIndex3(index_temp, 0, 0, -1); MapIndex(index_temp, cdir, index); pa = hypre_StructMatrixExtractPointerByIndex(P, fi, index); hypre_SetIndex3(index_temp, 0, 0, 1); MapIndex(index_temp, cdir, index); pb = hypre_StructMatrixExtractPointerByIndex(P, fi, index); /*----------------------------------------------------------------- * Extract pointers for restriction operator: * ra is pointer for weight for f-point above c-point * rb is pointer for weight for f-point below c-point *-----------------------------------------------------------------*/ hypre_SetIndex3(index_temp, 0, 0, -1); MapIndex(index_temp, cdir, index); ra = hypre_StructMatrixExtractPointerByIndex(R, fi, index); hypre_SetIndex3(index_temp, 0, 0, 1); MapIndex(index_temp, cdir, index); rb = hypre_StructMatrixExtractPointerByIndex(R, fi, index); /*----------------------------------------------------------------- * Extract pointers for 7-point fine grid operator: * * a_cc is pointer for center coefficient * a_cw is pointer for west coefficient in same plane * a_ce is pointer for east coefficient in same plane * a_cs is pointer for south coefficient in same plane * a_cn is pointer for north coefficient in same plane * a_ac is pointer for center coefficient in plane above * a_bc is pointer for center coefficient in plane below *-----------------------------------------------------------------*/ hypre_SetIndex3(index_temp, 0, 0, 0); MapIndex(index_temp, cdir, index); a_cc = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index_temp, -1, 0, 0); MapIndex(index_temp, cdir, index); a_cw = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index_temp, 1, 0, 0); MapIndex(index_temp, cdir, index); a_ce = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index_temp, 0, -1, 0); MapIndex(index_temp, cdir, index); a_cs = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index_temp, 0, 1, 0); MapIndex(index_temp, cdir, index); a_cn = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index_temp, 0, 0, 1); MapIndex(index_temp, cdir, index); a_ac = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index_temp, 0, 0, -1); MapIndex(index_temp, cdir, index); a_bc = hypre_StructMatrixExtractPointerByIndex(A, fi, index); /*----------------------------------------------------------------- * Extract additional pointers for 19-point fine grid operator: * * a_aw is pointer for west coefficient in plane above * a_ae is pointer for east coefficient in plane above * a_as is pointer for south coefficient in plane above * a_an is pointer for north coefficient in plane above * a_bw is pointer for west coefficient in plane below * a_be is pointer for east coefficient in plane below * a_bs is pointer for south coefficient in plane below * a_bn is pointer for north coefficient in plane below * a_csw is pointer for southwest coefficient in same plane * a_cse is pointer for southeast coefficient in same plane * a_cnw is pointer for northwest coefficient in same plane * a_cne is pointer for northeast coefficient in same plane *-----------------------------------------------------------------*/ hypre_SetIndex3(index_temp, -1, 0, 1); MapIndex(index_temp, cdir, index); a_aw = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index_temp, 0, -1, 1); MapIndex(index_temp, cdir, index); a_as = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index_temp, -1, 0, -1); MapIndex(index_temp, cdir, index); a_bw = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index_temp, 1, 0, -1); MapIndex(index_temp, cdir, index); a_be = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index_temp, 0, -1, -1); MapIndex(index_temp, cdir, index); a_bs = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index_temp, 0, 1, -1); MapIndex(index_temp, cdir, index); a_bn = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index_temp, -1, -1, 0); MapIndex(index_temp, cdir, index); a_csw = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index_temp, 1, -1, 0); MapIndex(index_temp, cdir, index); a_cse = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index_temp, -1, 1, 0); MapIndex(index_temp, cdir, index); a_cnw = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index_temp, 1, 1, 0); MapIndex(index_temp, cdir, index); a_cne = hypre_StructMatrixExtractPointerByIndex(A, fi, index); /*----------------------------------------------------------------- * Extract additional pointers for 27-point fine grid operator: * * a_asw is pointer for southwest coefficient in plane above * a_ase is pointer for southeast coefficient in plane above * a_anw is pointer for northwest coefficient in plane above * a_ane is pointer for northeast coefficient in plane above * a_bsw is pointer for southwest coefficient in plane below * a_bse is pointer for southeast coefficient in plane below * a_bnw is pointer for northwest coefficient in plane below * a_bne is pointer for northeast coefficient in plane below *-----------------------------------------------------------------*/ hypre_SetIndex3(index_temp, -1, -1, 1); MapIndex(index_temp, cdir, index); a_asw = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index_temp, 1, -1, 1); MapIndex(index_temp, cdir, index); a_ase = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index_temp, -1, -1, -1); MapIndex(index_temp, cdir, index); a_bsw = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index_temp, 1, -1, -1); MapIndex(index_temp, cdir, index); a_bse = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index_temp, -1, 1, -1); MapIndex(index_temp, cdir, index); a_bnw = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index_temp, 1, 1, -1); MapIndex(index_temp, cdir, index); a_bne = hypre_StructMatrixExtractPointerByIndex(A, fi, index); /*----------------------------------------------------------------- * Extract pointers for 19-point coarse grid operator: * * We build only the lower triangular part (plus diagonal). * * rap_cc is pointer for center coefficient (etc.) *-----------------------------------------------------------------*/ hypre_SetIndex3(index_temp, 0, 0, 0); MapIndex(index_temp, cdir, index); rap_cc = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index_temp, -1, 0, 0); MapIndex(index_temp, cdir, index); rap_cw = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index_temp, 0, -1, 0); MapIndex(index_temp, cdir, index); rap_cs = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index_temp, 0, 0, -1); MapIndex(index_temp, cdir, index); rap_bc = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index_temp, -1, 0, -1); MapIndex(index_temp, cdir, index); rap_bw = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index_temp, 1, 0, -1); MapIndex(index_temp, cdir, index); rap_be = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index_temp, 0, -1, -1); MapIndex(index_temp, cdir, index); rap_bs = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index_temp, 0, 1, -1); MapIndex(index_temp, cdir, index); rap_bn = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index_temp, -1, -1, 0); MapIndex(index_temp, cdir, index); rap_csw = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index_temp, 1, -1, 0); MapIndex(index_temp, cdir, index); rap_cse = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); /*----------------------------------------------------------------- * Extract additional pointers for 27-point coarse grid operator: * * A 27-point coarse grid operator is produced when the fine grid * stencil is 19 or 27 point. * * We build only the lower triangular part. * * rap_csw is pointer for southwest coefficient in same plane (etc.) *-----------------------------------------------------------------*/ hypre_SetIndex3(index_temp, -1, -1, -1); MapIndex(index_temp, cdir, index); rap_bsw = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index_temp, 1, -1, -1); MapIndex(index_temp, cdir, index); rap_bse = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index_temp, -1, 1, -1); MapIndex(index_temp, cdir, index); rap_bnw = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index_temp, 1, 1, -1); MapIndex(index_temp, cdir, index); rap_bne = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); /*----------------------------------------------------------------- * Define offsets for fine grid stencil and interpolation * * In the BoxLoop below I assume iA and iP refer to data associated * with the point which we are building the stencil for. The below * Offsets are used in refering to data associated with other points. *-----------------------------------------------------------------*/ hypre_SetIndex3(index_temp, 0, 0, 1); MapIndex(index_temp, cdir, index); zOffsetA = 0; zOffsetP = 0; hypre_SetIndex3(index_temp, 0, 1, 0); MapIndex(index_temp, cdir, index); yOffsetP = 0; hypre_SetIndex3(index_temp, 1, 0, 0); MapIndex(index_temp, cdir, index); xOffsetP = 0; /*-------------------------------------------------------------------- * Switch statement to direct control to apropriate BoxLoop depending * on stencil size. Default is full 27-point. *-----------------------------------------------------------------*/ /*-------------------------------------------------------------- * Loop for symmetric 27-point fine grid operator; produces a * symmetric 27-point coarse grid operator. We calculate only the * lower triangular stencil entries: (below-southwest, below-south, * below-southeast, below-west, below-center, below-east, * below-northwest, below-north, below-northeast, center-southwest, * center-south, center-southeast, center-west, and center-center). *--------------------------------------------------------------*/ iP = 0; iR = 0; iA = 0; iAc = 0; iAm1 = iA - zOffsetA; iAp1 = iA + zOffsetA; iP1 = iP - zOffsetP - yOffsetP - xOffsetP; rap_bsw[iAc] = rb[iR] * a_csw[iAm1] * pa[iP1] + rb[iR] * a_bsw[iAm1] + a_bsw[iA] * pa[iP1]; iP1 = iP - zOffsetP - yOffsetP; rap_bs[iAc] = rb[iR] * a_cs[iAm1] * pa[iP1] + rb[iR] * a_bs[iAm1] + a_bs[iA] * pa[iP1]; iP1 = iP - zOffsetP - yOffsetP + xOffsetP; rap_bse[iAc] = rb[iR] * a_cse[iAm1] * pa[iP1] + rb[iR] * a_bse[iAm1] + a_bse[iA] * pa[iP1]; iP1 = iP - zOffsetP - xOffsetP; rap_bw[iAc] = rb[iR] * a_cw[iAm1] * pa[iP1] + rb[iR] * a_bw[iAm1] + a_bw[iA] * pa[iP1]; iP1 = iP - zOffsetP; rap_bc[iAc] = a_bc[iA] * pa[iP1] + rb[iR] * a_cc[iAm1] * pa[iP1] + rb[iR] * a_bc[iAm1]; iP1 = iP - zOffsetP + xOffsetP; rap_be[iAc] = rb[iR] * a_ce[iAm1] * pa[iP1] + rb[iR] * a_be[iAm1] + a_be[iA] * pa[iP1]; iP1 = iP - zOffsetP + yOffsetP - xOffsetP; rap_bnw[iAc] = rb[iR] * a_cnw[iAm1] * pa[iP1] + rb[iR] * a_bnw[iAm1] + a_bnw[iA] * pa[iP1]; iP1 = iP - zOffsetP + yOffsetP; rap_bn[iAc] = rb[iR] * a_cn[iAm1] * pa[iP1] + rb[iR] * a_bn[iAm1] + a_bn[iA] * pa[iP1]; iP1 = iP - zOffsetP + yOffsetP + xOffsetP; rap_bne[iAc] = rb[iR] * a_cne[iAm1] * pa[iP1] + rb[iR] * a_bne[iAm1] + a_bne[iA] * pa[iP1]; iP1 = iP - yOffsetP - xOffsetP; rap_csw[iAc] = a_csw[iA] + rb[iR] * a_csw[iAm1] * pb[iP1] + ra[iR] * a_csw[iAp1] * pa[iP1] + a_bsw[iA] * pb[iP1] + a_asw[iA] * pa[iP1] + rb[iR] * a_asw[iAm1] + ra[iR] * a_bsw[iAp1]; iP1 = iP - yOffsetP; rap_cs[iAc] = a_cs[iA] + rb[iR] * a_cs[iAm1] * pb[iP1] + ra[iR] * a_cs[iAp1] * pa[iP1] + a_bs[iA] * pb[iP1] + a_as[iA] * pa[iP1] + rb[iR] * a_as[iAm1] + ra[iR] * a_bs[iAp1]; iP1 = iP - yOffsetP + xOffsetP; rap_cse[iAc] = a_cse[iA] + rb[iR] * a_cse[iAm1] * pb[iP1] + ra[iR] * a_cse[iAp1] * pa[iP1] + a_bse[iA] * pb[iP1] + a_ase[iA] * pa[iP1] + rb[iR] * a_ase[iAm1] + ra[iR] * a_bse[iAp1]; iP1 = iP - xOffsetP; rap_cw[iAc] = a_cw[iA] + rb[iR] * a_cw[iAm1] * pb[iP1] + ra[iR] * a_cw[iAp1] * pa[iP1] + a_bw[iA] * pb[iP1] + a_aw[iA] * pa[iP1] + rb[iR] * a_aw[iAm1] + ra[iR] * a_bw[iAp1]; rap_cc[iAc] = a_cc[iA] + rb[iR] * a_cc[iAm1] * pb[iP] + ra[iR] * a_cc[iAp1] * pa[iP] + rb[iR] * a_ac[iAm1] + ra[iR] * a_bc[iAp1] + a_bc[iA] * pb[iP] + a_ac[iA] * pa[iP]; /* }*/ /* end ForBoxI */ return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_PFMG3BuildRAPNoSym( hypre_StructMatrix *A, hypre_StructMatrix *P, hypre_StructMatrix *R, HYPRE_Int cdir, hypre_Index cindex, hypre_Index cstride, hypre_StructMatrix *RAP ) { hypre_StructStencil *fine_stencil; HYPRE_Int fine_stencil_size; hypre_StructGrid *fgrid; HYPRE_Int *fgrid_ids; hypre_StructGrid *cgrid; hypre_BoxArray *cgrid_boxes; HYPRE_Int *cgrid_ids; HYPRE_Int fi, ci; HYPRE_Int constant_coefficient; HYPRE_Int constant_coefficient_A; fine_stencil = hypre_StructMatrixStencil(A); fine_stencil_size = hypre_StructStencilSize(fine_stencil); fgrid = hypre_StructMatrixGrid(A); fgrid_ids = hypre_StructGridIDs(fgrid); cgrid = hypre_StructMatrixGrid(RAP); cgrid_boxes = hypre_StructGridBoxes(cgrid); cgrid_ids = hypre_StructGridIDs(cgrid); constant_coefficient = hypre_StructMatrixConstantCoefficient(RAP); constant_coefficient_A = hypre_StructMatrixConstantCoefficient(A); hypre_assert( constant_coefficient == 0 || constant_coefficient == 1 ); hypre_assert( hypre_StructMatrixConstantCoefficient(R) == constant_coefficient ); hypre_assert( hypre_StructMatrixConstantCoefficient(P) == constant_coefficient ); if (constant_coefficient == 1 ) { hypre_assert( constant_coefficient_A == 1 ); } else { hypre_assert( constant_coefficient_A == 0 || constant_coefficient_A == 2 ); } fi = 0; hypre_ForBoxI(ci, cgrid_boxes) { while (fgrid_ids[fi] != cgrid_ids[ci]) { fi++; } switch (fine_stencil_size) { /*-------------------------------------------------------------- * Loop for 7-point fine grid operator; produces upper triangular * part of 19-point coarse grid operator. stencil entries: * (above-north, above-east, above-center, above-west, * above-south, center-north, and center-east). *--------------------------------------------------------------*/ case 7: if ( constant_coefficient == 1 ) { hypre_PFMG3BuildRAPNoSym_onebox_FSS07_CC1( ci, fi, A, P, R, cdir, cindex, cstride, RAP ); } else { hypre_PFMG3BuildRAPNoSym_onebox_FSS07_CC0( ci, fi, A, P, R, cdir, cindex, cstride, RAP ); } break; /*-------------------------------------------------------------- * Loop for 19-point fine grid operator; produces upper triangular * part of 27-point coarse grid operator. stencil entries: * (above-northeast, above-north, above-northwest, above-east, * above-center, above-west, above-southeast, above-south, * above-southwest, center-northeast, center-north, * center-northwest, and center-east). *--------------------------------------------------------------*/ case 19: if ( constant_coefficient == 1 ) { hypre_PFMG3BuildRAPNoSym_onebox_FSS19_CC1( ci, fi, A, P, R, cdir, cindex, cstride, RAP ); } else { hypre_PFMG3BuildRAPNoSym_onebox_FSS19_CC0( ci, fi, A, P, R, cdir, cindex, cstride, RAP ); } break; /*-------------------------------------------------------------- * Loop for 27-point fine grid operator; produces upper triangular * part of 27-point coarse grid operator. stencil entries: * (above-northeast, above-north, above-northwest, above-east, * above-center, above-west, above-southeast, above-south, * above-southwest, center-northeast, center-north, * center-northwest, and center-east). *--------------------------------------------------------------*/ default: if ( constant_coefficient == 1 ) { hypre_PFMG3BuildRAPNoSym_onebox_FSS27_CC1( ci, fi, A, P, R, cdir, cindex, cstride, RAP ); } else { hypre_PFMG3BuildRAPNoSym_onebox_FSS27_CC0( ci, fi, A, P, R, cdir, cindex, cstride, RAP ); } break; } /* end switch statement */ } /* end ForBoxI */ return hypre_error_flag; } /* core part of hypre_PFMG3BuildRAPNoSym, for one box, one value of fine_stencil_size (07) and one value of constant_coefficient (0). */ HYPRE_Int hypre_PFMG3BuildRAPNoSym_onebox_FSS07_CC0( HYPRE_Int ci, HYPRE_Int fi, hypre_StructMatrix *A, hypre_StructMatrix *P, hypre_StructMatrix *R, HYPRE_Int cdir, hypre_Index cindex, hypre_Index cstride, hypre_StructMatrix *RAP ) { hypre_Index index; hypre_Index index_temp; hypre_StructGrid *cgrid; hypre_BoxArray *cgrid_boxes; hypre_Box *cgrid_box; hypre_IndexRef cstart; hypre_Index stridec; hypre_Index fstart; hypre_IndexRef stridef; hypre_Index loop_size; HYPRE_Int constant_coefficient_A; hypre_Box *A_dbox; hypre_Box *P_dbox; hypre_Box *R_dbox; hypre_Box *RAP_dbox; HYPRE_Real *pa, *pb; HYPRE_Real *ra, *rb; HYPRE_Real *a_cc, *a_cw, *a_ce, *a_cs, *a_cn; HYPRE_Real *a_ac; HYPRE_Real a_cn_offd, a_cn_offdm1, a_cn_offdp1; HYPRE_Real a_ce_offd, a_ce_offdm1, a_ce_offdp1; HYPRE_Real a_cs_offdp1, a_cw_offdp1; HYPRE_Real a_ac_offd, a_ac_offdp1; HYPRE_Real *rap_ce, *rap_cn; HYPRE_Real *rap_ac, *rap_aw, *rap_ae, *rap_as, *rap_an; HYPRE_Real *rap_cnw, *rap_cne; HYPRE_Int iA_offd, iA_offdm1, iA_offdp1; HYPRE_Int zOffsetA; HYPRE_Int zOffsetA_diag; HYPRE_Int zOffsetA_offd; HYPRE_Int xOffsetP; HYPRE_Int yOffsetP; HYPRE_Int zOffsetP; stridef = cstride; hypre_SetIndex3(stridec, 1, 1, 1); cgrid = hypre_StructMatrixGrid(RAP); cgrid_boxes = hypre_StructGridBoxes(cgrid); constant_coefficient_A = hypre_StructMatrixConstantCoefficient(A); /* fi = 0; hypre_ForBoxI(ci, cgrid_boxes) { while (fgrid_ids[fi] != cgrid_ids[ci]) { fi++; } */ cgrid_box = hypre_BoxArrayBox(cgrid_boxes, ci); cstart = hypre_BoxIMin(cgrid_box); hypre_StructMapCoarseToFine(cstart, cindex, cstride, fstart); A_dbox = hypre_BoxArrayBox(hypre_StructMatrixDataSpace(A), fi); P_dbox = hypre_BoxArrayBox(hypre_StructMatrixDataSpace(P), fi); R_dbox = hypre_BoxArrayBox(hypre_StructMatrixDataSpace(R), fi); RAP_dbox = hypre_BoxArrayBox(hypre_StructMatrixDataSpace(RAP), ci); /*----------------------------------------------------------------- * Extract pointers for interpolation operator: * pa is pointer for weight for f-point above c-point * pb is pointer for weight for f-point below c-point *-----------------------------------------------------------------*/ hypre_SetIndex3(index_temp, 0, 0, -1); MapIndex(index_temp, cdir, index); pa = hypre_StructMatrixExtractPointerByIndex(P, fi, index); hypre_SetIndex3(index_temp, 0, 0, 1); MapIndex(index_temp, cdir, index); pb = hypre_StructMatrixExtractPointerByIndex(P, fi, index); //RL PTROFFSET HYPRE_Int pbOffset = hypre_BoxOffsetDistance(P_dbox, index); /*----------------------------------------------------------------- * Extract pointers for restriction operator: * ra is pointer for weight for f-point above c-point * rb is pointer for weight for f-point below c-point *-----------------------------------------------------------------*/ hypre_SetIndex3(index_temp, 0, 0, -1); MapIndex(index_temp, cdir, index); ra = hypre_StructMatrixExtractPointerByIndex(R, fi, index); hypre_SetIndex3(index_temp, 0, 0, 1); MapIndex(index_temp, cdir, index); rb = hypre_StructMatrixExtractPointerByIndex(R, fi, index); //RL PTROFFSET HYPRE_Int rbOffset = hypre_BoxOffsetDistance(R_dbox, index); /*----------------------------------------------------------------- * Extract pointers for 7-point fine grid operator: * * a_cc is pointer for center coefficient * a_cw is pointer for west coefficient in same plane * a_ce is pointer for east coefficient in same plane * a_cs is pointer for south coefficient in same plane * a_cn is pointer for north coefficient in same plane * a_ac is pointer for center coefficient in plane above * a_bc is pointer for center coefficient in plane below *-----------------------------------------------------------------*/ hypre_SetIndex3(index_temp, 0, 0, 0); MapIndex(index_temp, cdir, index); a_cc = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index_temp, -1, 0, 0); MapIndex(index_temp, cdir, index); a_cw = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index_temp, 1, 0, 0); MapIndex(index_temp, cdir, index); a_ce = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index_temp, 0, -1, 0); MapIndex(index_temp, cdir, index); a_cs = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index_temp, 0, 1, 0); MapIndex(index_temp, cdir, index); a_cn = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index_temp, 0, 0, 1); MapIndex(index_temp, cdir, index); a_ac = hypre_StructMatrixExtractPointerByIndex(A, fi, index); /*----------------------------------------------------------------- * Extract pointers for 19-point coarse grid operator: * * We build only the upper triangular part (excluding diagonal). * * rap_ce is pointer for east coefficient in same plane (etc.) *-----------------------------------------------------------------*/ hypre_SetIndex3(index_temp, 1, 0, 0); MapIndex(index_temp, cdir, index); rap_ce = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index_temp, 0, 1, 0); MapIndex(index_temp, cdir, index); rap_cn = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index_temp, 0, 0, 1); MapIndex(index_temp, cdir, index); rap_ac = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index_temp, -1, 0, 1); MapIndex(index_temp, cdir, index); rap_aw = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index_temp, 1, 0, 1); MapIndex(index_temp, cdir, index); rap_ae = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index_temp, 0, -1, 1); MapIndex(index_temp, cdir, index); rap_as = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index_temp, 0, 1, 1); MapIndex(index_temp, cdir, index); rap_an = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index_temp, -1, 1, 0); MapIndex(index_temp, cdir, index); rap_cnw = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index_temp, 1, 1, 0); MapIndex(index_temp, cdir, index); rap_cne = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); /*----------------------------------------------------------------- * Define offsets for fine grid stencil and interpolation * * In the BoxLoop below I assume iA and iP refer to data associated * with the point which we are building the stencil for. The below * Offsets are used in refering to data associated with other points. *-----------------------------------------------------------------*/ hypre_SetIndex3(index_temp, 0, 0, 1); MapIndex(index_temp, cdir, index); zOffsetP = hypre_BoxOffsetDistance(P_dbox, index); if ( constant_coefficient_A == 0 ) { zOffsetA = hypre_BoxOffsetDistance(A_dbox, index); } else { zOffsetA_diag = hypre_BoxOffsetDistance(A_dbox, index); zOffsetA_offd = 0; } hypre_SetIndex3(index_temp, 0, 1, 0); MapIndex(index_temp, cdir, index); yOffsetP = hypre_BoxOffsetDistance(P_dbox, index); hypre_SetIndex3(index_temp, 1, 0, 0); MapIndex(index_temp, cdir, index); xOffsetP = hypre_BoxOffsetDistance(P_dbox, index); /*----------------------------------------------------------------- * Switch statement to direct control to apropriate BoxLoop depending * on stencil size. Default is full 27-point. *-----------------------------------------------------------------*/ /*-------------------------------------------------------------- * Loop for 7-point fine grid operator; produces upper triangular * part of 19-point coarse grid operator. stencil entries: * (above-north, above-east, above-center, above-west, * above-south, center-north, and center-east). *--------------------------------------------------------------*/ hypre_BoxGetSize(cgrid_box, loop_size); if ( constant_coefficient_A == 0 ) { #define DEVICE_VAR is_device_ptr(rap_an,ra,a_cn,pb,rap_ae,a_ce,rap_ac,a_ac,a_cc,rap_aw,a_cw,rap_as,a_cs,rap_cn,rb,pa,rap_ce,rap_cnw,rap_cne) hypre_BoxLoop4Begin(hypre_StructMatrixNDim(A), loop_size, P_dbox, cstart, stridec, iP, R_dbox, cstart, stridec, iR, A_dbox, fstart, stridef, iA, RAP_dbox, cstart, stridec, iAc); { HYPRE_Int iAm1 = iA - zOffsetA; HYPRE_Int iAp1 = iA + zOffsetA; HYPRE_Int iP1 = iP + zOffsetP + yOffsetP; rap_an[iAc] = ra[iR] * a_cn[iAp1] * pb[iP1 - pbOffset]; iP1 = iP + zOffsetP + xOffsetP; rap_ae[iAc] = ra[iR] * a_ce[iAp1] * pb[iP1 - pbOffset]; iP1 = iP + zOffsetP; rap_ac[iAc] = a_ac[iA] * pb[iP1 - pbOffset] + ra[iR] * a_cc[iAp1] * pb[iP1 - pbOffset] + ra[iR] * a_ac[iAp1]; iP1 = iP + zOffsetP - xOffsetP; rap_aw[iAc] = ra[iR] * a_cw[iAp1] * pb[iP1 - pbOffset]; iP1 = iP + zOffsetP - yOffsetP; rap_as[iAc] = ra[iR] * a_cs[iAp1] * pb[iP1 - pbOffset]; iP1 = iP + yOffsetP; rap_cn[iAc] = a_cn[iA] + rb[iR - rbOffset] * a_cn[iAm1] * pb[iP1 - pbOffset] + ra[iR] * a_cn[iAp1] * pa[iP1]; iP1 = iP + xOffsetP; rap_ce[iAc] = a_ce[iA] + rb[iR - rbOffset] * a_ce[iAm1] * pb[iP1 - pbOffset] + ra[iR] * a_ce[iAp1] * pa[iP1]; rap_cnw[iAc] = 0.0; rap_cne[iAc] = 0.0; } hypre_BoxLoop4End(iP, iR, iA, iAc); #undef DEVICE_VAR } else { iA_offd = 0; iA_offdm1 = iA_offd - zOffsetA_offd; iA_offdp1 = iA_offd + zOffsetA_offd; a_cn_offd = a_cn[iA_offd]; a_cn_offdm1 = a_cn[iA_offdm1]; a_cn_offdp1 = a_cn[iA_offdp1]; a_ce_offd = a_ce[iA_offd]; a_ce_offdm1 = a_ce[iA_offdm1]; a_ce_offdp1 = a_ce[iA_offdp1]; a_cs_offdp1 = a_cs[iA_offdp1]; a_cw_offdp1 = a_cw[iA_offdp1]; a_ac_offd = a_ac[iA_offd]; a_ac_offdp1 = a_ac[iA_offdp1]; #define DEVICE_VAR is_device_ptr(rap_an,ra,pb,rap_ae,rap_ac,a_cc,rap_aw,rap_as,rap_cn,rb,pa,rap_ce,rap_cnw,rap_cne) hypre_BoxLoop4Begin(hypre_StructMatrixNDim(A), loop_size, P_dbox, cstart, stridec, iP, R_dbox, cstart, stridec, iR, A_dbox, fstart, stridef, iA, RAP_dbox, cstart, stridec, iAc); { //HYPRE_Int iAm1 = iA - zOffsetA_diag; HYPRE_Int iAp1 = iA + zOffsetA_diag; HYPRE_Int iP1 = iP + zOffsetP + yOffsetP; rap_an[iAc] = ra[iR] * a_cn_offdp1 * pb[iP1 - pbOffset]; iP1 = iP + zOffsetP + xOffsetP; rap_ae[iAc] = ra[iR] * a_ce_offdp1 * pb[iP1 - pbOffset]; iP1 = iP + zOffsetP; rap_ac[iAc] = a_ac_offd * pb[iP1 - pbOffset] + ra[iR] * a_cc[iAp1] * pb[iP1 - pbOffset] + ra[iR] * a_ac_offdp1; iP1 = iP + zOffsetP - xOffsetP; rap_aw[iAc] = ra[iR] * a_cw_offdp1 * pb[iP1 - pbOffset]; iP1 = iP + zOffsetP - yOffsetP; rap_as[iAc] = ra[iR] * a_cs_offdp1 * pb[iP1 - pbOffset]; iP1 = iP + yOffsetP; rap_cn[iAc] = a_cn_offd + rb[iR - rbOffset] * a_cn_offdm1 * pb[iP1 - pbOffset] + ra[iR] * a_cn_offdp1 * pa[iP1]; iP1 = iP + xOffsetP; rap_ce[iAc] = a_ce_offd + rb[iR - rbOffset] * a_ce_offdm1 * pb[iP1 - pbOffset] + ra[iR] * a_ce_offdp1 * pa[iP1]; rap_cnw[iAc] = 0.0; rap_cne[iAc] = 0.0; } hypre_BoxLoop4End(iP, iR, iA, iAc); #undef DEVICE_VAR } /* }*/ /* end ForBoxI */ return hypre_error_flag; } /* core part of hypre_PFMG3BuildRAPNoSym, for one box, one value of fine_stencil_size (07) and one value of constant_coefficient (1). */ HYPRE_Int hypre_PFMG3BuildRAPNoSym_onebox_FSS07_CC1( HYPRE_Int ci, HYPRE_Int fi, hypre_StructMatrix *A, hypre_StructMatrix *P, hypre_StructMatrix *R, HYPRE_Int cdir, hypre_Index cindex, hypre_Index cstride, hypre_StructMatrix *RAP ) { hypre_Index index; hypre_Index index_temp; hypre_StructGrid *cgrid; hypre_BoxArray *cgrid_boxes; hypre_Box *cgrid_box; hypre_IndexRef cstart; hypre_Index fstart; HYPRE_Real *pa, *pb; HYPRE_Real *ra, *rb; HYPRE_Real *a_cc, *a_cw, *a_ce, *a_cs, *a_cn; HYPRE_Real *a_ac; HYPRE_Real *rap_ce, *rap_cn; HYPRE_Real *rap_ac, *rap_aw, *rap_ae, *rap_as, *rap_an; HYPRE_Real *rap_cnw, *rap_cne; HYPRE_Int iA, iAm1, iAp1; HYPRE_Int iAc; HYPRE_Int iP, iP1; HYPRE_Int iR; HYPRE_Int zOffsetA; HYPRE_Int xOffsetP; HYPRE_Int yOffsetP; HYPRE_Int zOffsetP; cgrid = hypre_StructMatrixGrid(RAP); cgrid_boxes = hypre_StructGridBoxes(cgrid); cgrid_box = hypre_BoxArrayBox(cgrid_boxes, ci); cstart = hypre_BoxIMin(cgrid_box); hypre_StructMapCoarseToFine(cstart, cindex, cstride, fstart); /*----------------------------------------------------------------- * Extract pointers for interpolation operator: * pa is pointer for weight for f-point above c-point * pb is pointer for weight for f-point below c-point *-----------------------------------------------------------------*/ hypre_SetIndex3(index_temp, 0, 0, -1); MapIndex(index_temp, cdir, index); pa = hypre_StructMatrixExtractPointerByIndex(P, fi, index); hypre_SetIndex3(index_temp, 0, 0, 1); MapIndex(index_temp, cdir, index); pb = hypre_StructMatrixExtractPointerByIndex(P, fi, index); /*----------------------------------------------------------------- * Extract pointers for restriction operator: * ra is pointer for weight for f-point above c-point * rb is pointer for weight for f-point below c-point *-----------------------------------------------------------------*/ hypre_SetIndex3(index_temp, 0, 0, -1); MapIndex(index_temp, cdir, index); ra = hypre_StructMatrixExtractPointerByIndex(R, fi, index); hypre_SetIndex3(index_temp, 0, 0, 1); MapIndex(index_temp, cdir, index); rb = hypre_StructMatrixExtractPointerByIndex(R, fi, index); /*----------------------------------------------------------------- * Extract pointers for 7-point fine grid operator: * * a_cc is pointer for center coefficient * a_cw is pointer for west coefficient in same plane * a_ce is pointer for east coefficient in same plane * a_cs is pointer for south coefficient in same plane * a_cn is pointer for north coefficient in same plane * a_ac is pointer for center coefficient in plane above * a_bc is pointer for center coefficient in plane below *-----------------------------------------------------------------*/ hypre_SetIndex3(index_temp, 0, 0, 0); MapIndex(index_temp, cdir, index); a_cc = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index_temp, -1, 0, 0); MapIndex(index_temp, cdir, index); a_cw = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index_temp, 1, 0, 0); MapIndex(index_temp, cdir, index); a_ce = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index_temp, 0, -1, 0); MapIndex(index_temp, cdir, index); a_cs = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index_temp, 0, 1, 0); MapIndex(index_temp, cdir, index); a_cn = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index_temp, 0, 0, 1); MapIndex(index_temp, cdir, index); a_ac = hypre_StructMatrixExtractPointerByIndex(A, fi, index); /*----------------------------------------------------------------- * Extract pointers for 19-point coarse grid operator: * * We build only the upper triangular part (excluding diagonal). * * rap_ce is pointer for east coefficient in same plane (etc.) *-----------------------------------------------------------------*/ hypre_SetIndex3(index_temp, 1, 0, 0); MapIndex(index_temp, cdir, index); rap_ce = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index_temp, 0, 1, 0); MapIndex(index_temp, cdir, index); rap_cn = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index_temp, 0, 0, 1); MapIndex(index_temp, cdir, index); rap_ac = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index_temp, -1, 0, 1); MapIndex(index_temp, cdir, index); rap_aw = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index_temp, 1, 0, 1); MapIndex(index_temp, cdir, index); rap_ae = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index_temp, 0, -1, 1); MapIndex(index_temp, cdir, index); rap_as = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index_temp, 0, 1, 1); MapIndex(index_temp, cdir, index); rap_an = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index_temp, -1, 1, 0); MapIndex(index_temp, cdir, index); rap_cnw = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index_temp, 1, 1, 0); MapIndex(index_temp, cdir, index); rap_cne = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); /*----------------------------------------------------------------- * Define offsets for fine grid stencil and interpolation * * In the BoxLoop below I assume iA and iP refer to data associated * with the point which we are building the stencil for. The below * Offsets are used in refering to data associated with other points. *-----------------------------------------------------------------*/ hypre_SetIndex3(index_temp, 0, 0, 1); MapIndex(index_temp, cdir, index); zOffsetA = 0; zOffsetP = 0; hypre_SetIndex3(index_temp, 0, 1, 0); MapIndex(index_temp, cdir, index); yOffsetP = 0; hypre_SetIndex3(index_temp, 1, 0, 0); MapIndex(index_temp, cdir, index); xOffsetP = 0; /*----------------------------------------------------------------- * Switch statement to direct control to apropriate BoxLoop depending * on stencil size. Default is full 27-point. *-----------------------------------------------------------------*/ /*-------------------------------------------------------------- * Loop for 7-point fine grid operator; produces upper triangular * part of 19-point coarse grid operator. stencil entries: * (above-north, above-east, above-center, above-west, * above-south, center-north, and center-east). *--------------------------------------------------------------*/ iP = 0; iR = 0; iA = 0; iAc = 0; iAm1 = iA - zOffsetA; iAp1 = iA + zOffsetA; iP1 = iP + zOffsetP + yOffsetP; rap_an[iAc] = ra[iR] * a_cn[iAp1] * pb[iP1]; iP1 = iP + zOffsetP + xOffsetP; rap_ae[iAc] = ra[iR] * a_ce[iAp1] * pb[iP1]; iP1 = iP + zOffsetP; rap_ac[iAc] = a_ac[iA] * pb[iP1] + ra[iR] * a_cc[iAp1] * pb[iP1] + ra[iR] * a_ac[iAp1]; iP1 = iP + zOffsetP - xOffsetP; rap_aw[iAc] = ra[iR] * a_cw[iAp1] * pb[iP1]; iP1 = iP + zOffsetP - yOffsetP; rap_as[iAc] = ra[iR] * a_cs[iAp1] * pb[iP1]; iP1 = iP + yOffsetP; rap_cn[iAc] = a_cn[iA] + rb[iR] * a_cn[iAm1] * pb[iP1] + ra[iR] * a_cn[iAp1] * pa[iP1]; iP1 = iP + xOffsetP; rap_ce[iAc] = a_ce[iA] + rb[iR] * a_ce[iAm1] * pb[iP1] + ra[iR] * a_ce[iAp1] * pa[iP1]; rap_cnw[iAc] = 0.0; rap_cne[iAc] = 0.0; /* }*/ /* end ForBoxI */ return hypre_error_flag; } /* core part of hypre_PFMG3BuildRAPNoSym, for one box, one value of fine_stencil_size (19) and one value of constant_coefficient (0). */ HYPRE_Int hypre_PFMG3BuildRAPNoSym_onebox_FSS19_CC0( HYPRE_Int ci, HYPRE_Int fi, hypre_StructMatrix *A, hypre_StructMatrix *P, hypre_StructMatrix *R, HYPRE_Int cdir, hypre_Index cindex, hypre_Index cstride, hypre_StructMatrix *RAP ) { hypre_Index index; hypre_Index index_temp; hypre_StructGrid *cgrid; hypre_BoxArray *cgrid_boxes; hypre_Box *cgrid_box; hypre_IndexRef cstart; hypre_Index stridec; hypre_Index fstart; hypre_IndexRef stridef; hypre_Index loop_size; HYPRE_Int constant_coefficient_A; hypre_Box *A_dbox; hypre_Box *P_dbox; hypre_Box *R_dbox; hypre_Box *RAP_dbox; HYPRE_Real *pa, *pb; HYPRE_Real *ra, *rb; HYPRE_Real *a_cc, *a_cw, *a_ce, *a_cs, *a_cn; HYPRE_Real *a_ac, *a_aw, *a_ae, *a_as, *a_an; HYPRE_Real *a_be, *a_bn; HYPRE_Real *a_csw, *a_cse, *a_cnw, *a_cne; HYPRE_Real a_cn_offd, a_cn_offdm1, a_cn_offdp1; HYPRE_Real a_ce_offd, a_ce_offdm1, a_ce_offdp1; HYPRE_Real a_cs_offdp1, a_cw_offdp1, a_cse_offdp1, a_csw_offdp1; HYPRE_Real a_cne_offd, a_cne_offdm1, a_cne_offdp1; HYPRE_Real a_cnw_offd, a_cnw_offdm1, a_cnw_offdp1; HYPRE_Real a_ac_offd, a_ac_offdp1; HYPRE_Real a_an_offd, a_an_offdm1, a_an_offdp1; HYPRE_Real a_as_offd, a_as_offdp1; HYPRE_Real a_aw_offd, a_aw_offdp1; HYPRE_Real a_ae_offd, a_ae_offdm1, a_ae_offdp1; HYPRE_Real a_be_offd, a_be_offdp1; HYPRE_Real a_bn_offd, a_bn_offdp1; HYPRE_Real *rap_ce, *rap_cn; HYPRE_Real *rap_ac, *rap_aw, *rap_ae, *rap_as, *rap_an; HYPRE_Real *rap_cnw, *rap_cne; HYPRE_Real *rap_asw, *rap_ase, *rap_anw, *rap_ane; HYPRE_Int iA_offd, iA_offdm1, iA_offdp1; HYPRE_Int zOffsetA; HYPRE_Int zOffsetA_diag; HYPRE_Int zOffsetA_offd; HYPRE_Int xOffsetP; HYPRE_Int yOffsetP; HYPRE_Int zOffsetP; stridef = cstride; hypre_SetIndex3(stridec, 1, 1, 1); cgrid = hypre_StructMatrixGrid(RAP); cgrid_boxes = hypre_StructGridBoxes(cgrid); constant_coefficient_A = hypre_StructMatrixConstantCoefficient(A); /* fi = 0; hypre_ForBoxI(ci, cgrid_boxes) { while (fgrid_ids[fi] != cgrid_ids[ci]) { fi++; } */ cgrid_box = hypre_BoxArrayBox(cgrid_boxes, ci); cstart = hypre_BoxIMin(cgrid_box); hypre_StructMapCoarseToFine(cstart, cindex, cstride, fstart); A_dbox = hypre_BoxArrayBox(hypre_StructMatrixDataSpace(A), fi); P_dbox = hypre_BoxArrayBox(hypre_StructMatrixDataSpace(P), fi); R_dbox = hypre_BoxArrayBox(hypre_StructMatrixDataSpace(R), fi); RAP_dbox = hypre_BoxArrayBox(hypre_StructMatrixDataSpace(RAP), ci); /*----------------------------------------------------------------- * Extract pointers for interpolation operator: * pa is pointer for weight for f-point above c-point * pb is pointer for weight for f-point below c-point *-----------------------------------------------------------------*/ hypre_SetIndex3(index_temp, 0, 0, -1); MapIndex(index_temp, cdir, index); pa = hypre_StructMatrixExtractPointerByIndex(P, fi, index); hypre_SetIndex3(index_temp, 0, 0, 1); MapIndex(index_temp, cdir, index); pb = hypre_StructMatrixExtractPointerByIndex(P, fi, index); //RL PTROFFSET HYPRE_Int pbOffset = hypre_BoxOffsetDistance(P_dbox, index); /*----------------------------------------------------------------- * Extract pointers for restriction operator: * ra is pointer for weight for f-point above c-point * rb is pointer for weight for f-point below c-point *-----------------------------------------------------------------*/ hypre_SetIndex3(index_temp, 0, 0, -1); MapIndex(index_temp, cdir, index); ra = hypre_StructMatrixExtractPointerByIndex(R, fi, index); hypre_SetIndex3(index_temp, 0, 0, 1); MapIndex(index_temp, cdir, index); rb = hypre_StructMatrixExtractPointerByIndex(R, fi, index); //RL PTROFFSET HYPRE_Int rbOffset = hypre_BoxOffsetDistance(R_dbox, index); /*----------------------------------------------------------------- * Extract pointers for 7-point fine grid operator: * * a_cc is pointer for center coefficient * a_cw is pointer for west coefficient in same plane * a_ce is pointer for east coefficient in same plane * a_cs is pointer for south coefficient in same plane * a_cn is pointer for north coefficient in same plane * a_ac is pointer for center coefficient in plane above * a_bc is pointer for center coefficient in plane below *-----------------------------------------------------------------*/ hypre_SetIndex3(index_temp, 0, 0, 0); MapIndex(index_temp, cdir, index); a_cc = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index_temp, -1, 0, 0); MapIndex(index_temp, cdir, index); a_cw = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index_temp, 1, 0, 0); MapIndex(index_temp, cdir, index); a_ce = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index_temp, 0, -1, 0); MapIndex(index_temp, cdir, index); a_cs = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index_temp, 0, 1, 0); MapIndex(index_temp, cdir, index); a_cn = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index_temp, 0, 0, 1); MapIndex(index_temp, cdir, index); a_ac = hypre_StructMatrixExtractPointerByIndex(A, fi, index); /*----------------------------------------------------------------- * Extract additional pointers for 19-point fine grid operator: * * a_aw is pointer for west coefficient in plane above * a_ae is pointer for east coefficient in plane above * a_as is pointer for south coefficient in plane above * a_an is pointer for north coefficient in plane above * a_bw is pointer for west coefficient in plane below * a_be is pointer for east coefficient in plane below * a_bs is pointer for south coefficient in plane below * a_bn is pointer for north coefficient in plane below * a_csw is pointer for southwest coefficient in same plane * a_cse is pointer for southeast coefficient in same plane * a_cnw is pointer for northwest coefficient in same plane * a_cne is pointer for northeast coefficient in same plane *-----------------------------------------------------------------*/ hypre_SetIndex3(index_temp, -1, 0, 1); MapIndex(index_temp, cdir, index); a_aw = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index_temp, 1, 0, 1); MapIndex(index_temp, cdir, index); a_ae = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index_temp, 0, -1, 1); MapIndex(index_temp, cdir, index); a_as = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index_temp, 0, 1, 1); MapIndex(index_temp, cdir, index); a_an = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index_temp, 1, 0, -1); MapIndex(index_temp, cdir, index); a_be = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index_temp, 0, 1, -1); MapIndex(index_temp, cdir, index); a_bn = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index_temp, -1, -1, 0); MapIndex(index_temp, cdir, index); a_csw = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index_temp, 1, -1, 0); MapIndex(index_temp, cdir, index); a_cse = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index_temp, -1, 1, 0); MapIndex(index_temp, cdir, index); a_cnw = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index_temp, 1, 1, 0); MapIndex(index_temp, cdir, index); a_cne = hypre_StructMatrixExtractPointerByIndex(A, fi, index); /*----------------------------------------------------------------- * Extract pointers for 19-point coarse grid operator: * * We build only the upper triangular part (excluding diagonal). * * rap_ce is pointer for east coefficient in same plane (etc.) *-----------------------------------------------------------------*/ hypre_SetIndex3(index_temp, 1, 0, 0); MapIndex(index_temp, cdir, index); rap_ce = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index_temp, 0, 1, 0); MapIndex(index_temp, cdir, index); rap_cn = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index_temp, 0, 0, 1); MapIndex(index_temp, cdir, index); rap_ac = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index_temp, -1, 0, 1); MapIndex(index_temp, cdir, index); rap_aw = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index_temp, 1, 0, 1); MapIndex(index_temp, cdir, index); rap_ae = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index_temp, 0, -1, 1); MapIndex(index_temp, cdir, index); rap_as = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index_temp, 0, 1, 1); MapIndex(index_temp, cdir, index); rap_an = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index_temp, -1, 1, 0); MapIndex(index_temp, cdir, index); rap_cnw = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index_temp, 1, 1, 0); MapIndex(index_temp, cdir, index); rap_cne = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); /*----------------------------------------------------------------- * Extract additional pointers for 27-point coarse grid operator: * * A 27-point coarse grid operator is produced when the fine grid * stencil is 19 or 27 point. * * We build only the upper triangular part. * * rap_cnw is pointer for northwest coefficient in same plane (etc.) *-----------------------------------------------------------------*/ hypre_SetIndex3(index_temp, -1, -1, 1); MapIndex(index_temp, cdir, index); rap_asw = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index_temp, 1, -1, 1); MapIndex(index_temp, cdir, index); rap_ase = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index_temp, -1, 1, 1); MapIndex(index_temp, cdir, index); rap_anw = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index_temp, 1, 1, 1); MapIndex(index_temp, cdir, index); rap_ane = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); /*----------------------------------------------------------------- * Define offsets for fine grid stencil and interpolation * * In the BoxLoop below I assume iA and iP refer to data associated * with the point which we are building the stencil for. The below * Offsets are used in refering to data associated with other points. *-----------------------------------------------------------------*/ hypre_SetIndex3(index_temp, 0, 0, 1); MapIndex(index_temp, cdir, index); zOffsetP = hypre_BoxOffsetDistance(P_dbox, index); if ( constant_coefficient_A == 0 ) { zOffsetA = hypre_BoxOffsetDistance(A_dbox, index); } else { zOffsetA_diag = hypre_BoxOffsetDistance(A_dbox, index); zOffsetA_offd = 0; } hypre_SetIndex3(index_temp, 0, 1, 0); MapIndex(index_temp, cdir, index); yOffsetP = hypre_BoxOffsetDistance(P_dbox, index); hypre_SetIndex3(index_temp, 1, 0, 0); MapIndex(index_temp, cdir, index); xOffsetP = hypre_BoxOffsetDistance(P_dbox, index); /*----------------------------------------------------------------- * Switch statement to direct control to apropriate BoxLoop depending * on stencil size. Default is full 27-point. *-----------------------------------------------------------------*/ /*-------------------------------------------------------------- * Loop for 19-point fine grid operator; produces upper triangular * part of 27-point coarse grid operator. stencil entries: * (above-northeast, above-north, above-northwest, above-east, * above-center, above-west, above-southeast, above-south, * above-southwest, center-northeast, center-north, * center-northwest, and center-east). *--------------------------------------------------------------*/ hypre_BoxGetSize(cgrid_box, loop_size); if ( constant_coefficient_A == 0 ) { #define DEVICE_VAR is_device_ptr(rap_ane,ra,a_cne,pb,rap_an,a_cn,a_an,rap_anw,a_cnw,rap_ae,a_ce,a_ae,rap_ac,a_ac,a_cc,rap_aw,a_cw,a_aw,rap_ase,a_cse,rap_as,a_cs,a_as,rap_asw,a_csw,rap_cne,rb,pa,rap_cn,a_bn,rap_cnw,rap_ce,a_be) hypre_BoxLoop4Begin(hypre_StructMatrixNDim(A), loop_size, P_dbox, cstart, stridec, iP, R_dbox, cstart, stridec, iR, A_dbox, fstart, stridef, iA, RAP_dbox, cstart, stridec, iAc); { HYPRE_Int iAm1 = iA - zOffsetA; HYPRE_Int iAp1 = iA + zOffsetA; HYPRE_Int iP1 = iP + zOffsetP + yOffsetP + xOffsetP; rap_ane[iAc] = ra[iR] * a_cne[iAp1] * pb[iP1 - pbOffset]; iP1 = iP + zOffsetP + yOffsetP; rap_an[iAc] = ra[iR] * a_cn[iAp1] * pb[iP1 - pbOffset] + ra[iR] * a_an[iAp1] + a_an[iA] * pb[iP1 - pbOffset]; iP1 = iP + zOffsetP + yOffsetP - xOffsetP; rap_anw[iAc] = ra[iR] * a_cnw[iAp1] * pb[iP1 - pbOffset]; iP1 = iP + zOffsetP + xOffsetP; rap_ae[iAc] = ra[iR] * a_ce[iAp1] * pb[iP1 - pbOffset] + ra[iR] * a_ae[iAp1] + a_ae[iA] * pb[iP1 - pbOffset]; iP1 = iP + zOffsetP; rap_ac[iAc] = a_ac[iA] * pb[iP1 - pbOffset] + ra[iR] * a_cc[iAp1] * pb[iP1 - pbOffset] + ra[iR] * a_ac[iAp1]; iP1 = iP + zOffsetP - xOffsetP; rap_aw[iAc] = ra[iR] * a_cw[iAp1] * pb[iP1 - pbOffset] + ra[iR] * a_aw[iAp1] + a_aw[iA] * pb[iP1 - pbOffset]; iP1 = iP + zOffsetP - yOffsetP + xOffsetP; rap_ase[iAc] = ra[iR] * a_cse[iAp1] * pb[iP1 - pbOffset]; iP1 = iP + zOffsetP - yOffsetP; rap_as[iAc] = ra[iR] * a_cs[iAp1] * pb[iP1 - pbOffset] + ra[iR] * a_as[iAp1] + a_as[iA] * pb[iP1 - pbOffset]; iP1 = iP + zOffsetP - yOffsetP - xOffsetP; rap_asw[iAc] = ra[iR] * a_csw[iAp1] * pb[iP1 - pbOffset]; iP1 = iP + yOffsetP + xOffsetP; rap_cne[iAc] = a_cne[iA] + rb[iR - rbOffset] * a_cne[iAm1] * pb[iP1 - pbOffset] + ra[iR] * a_cne[iAp1] * pa[iP1]; iP1 = iP + yOffsetP; rap_cn[iAc] = a_cn[iA] + rb[iR - rbOffset] * a_cn[iAm1] * pb[iP1 - pbOffset] + ra[iR] * a_cn[iAp1] * pa[iP1] + a_bn[iA] * pb[iP1 - pbOffset] + a_an[iA] * pa[iP1] + rb[iR - rbOffset] * a_an[iAm1] + ra[iR] * a_bn[iAp1]; iP1 = iP + yOffsetP - xOffsetP; rap_cnw[iAc] = a_cnw[iA] + rb[iR - rbOffset] * a_cnw[iAm1] * pb[iP1 - pbOffset] + ra[iR] * a_cnw[iAp1] * pa[iP1]; iP1 = iP + xOffsetP; rap_ce[iAc] = a_ce[iA] + rb[iR - rbOffset] * a_ce[iAm1] * pb[iP1 - pbOffset] + ra[iR] * a_ce[iAp1] * pa[iP1] + a_be[iA] * pb[iP1 - pbOffset] + a_ae[iA] * pa[iP1] + rb[iR - rbOffset] * a_ae[iAm1] + ra[iR] * a_be[iAp1]; } hypre_BoxLoop4End(iP, iR, iA, iAc); #undef DEVICE_VAR } else { iA_offd = 0; iA_offdm1 = iA_offd - zOffsetA_offd; iA_offdp1 = iA_offd + zOffsetA_offd; a_cn_offd = a_cn[iA_offd]; a_cn_offdm1 = a_cn[iA_offdm1]; a_cn_offdp1 = a_cn[iA_offdp1]; a_cne_offd = a_cne[iA_offd]; a_cne_offdm1 = a_cne[iA_offdm1]; a_cne_offdp1 = a_cne[iA_offdp1]; a_cnw_offd = a_cnw[iA_offd]; a_cnw_offdm1 = a_cnw[iA_offdm1]; a_cnw_offdp1 = a_cnw[iA_offdp1]; a_ce_offd = a_ce[iA_offd]; a_ce_offdm1 = a_ce[iA_offdm1]; a_ce_offdp1 = a_ce[iA_offdp1]; a_cw_offdp1 = a_cw[iA_offdp1]; a_cs_offdp1 = a_cs[iA_offdp1]; a_cse_offdp1 = a_cse[iA_offdp1]; a_csw_offdp1 = a_csw[iA_offdp1]; a_ac_offd = a_ac[iA_offd]; a_ac_offdp1 = a_ac[iA_offdp1]; a_an_offd = a_an[iA_offd]; a_an_offdm1 = a_an[iA_offdm1]; a_an_offdp1 = a_an[iA_offdp1]; a_as_offd = a_as[iA_offd]; a_as_offdp1 = a_as[iA_offdp1]; a_aw_offd = a_aw[iA_offd]; a_aw_offdp1 = a_aw[iA_offdp1]; a_ae_offd = a_ae[iA_offd]; a_ae_offdm1 = a_ae[iA_offdm1]; a_ae_offdp1 = a_ae[iA_offdp1]; a_be_offd = a_be[iA_offd]; a_be_offdp1 = a_be[iA_offdp1]; a_bn_offd = a_bn[iA_offd]; a_bn_offdp1 = a_bn[iA_offdp1]; #define DEVICE_VAR is_device_ptr(rap_ane,ra,pb,rap_an,rap_anw,rap_ae,rap_ac,a_cc,rap_aw,rap_ase,rap_as,rap_asw,rap_cne,rb,pa,rap_cn,rap_cnw,rap_ce) hypre_BoxLoop4Begin(hypre_StructMatrixNDim(A), loop_size, P_dbox, cstart, stridec, iP, R_dbox, cstart, stridec, iR, A_dbox, fstart, stridef, iA, RAP_dbox, cstart, stridec, iAc); { HYPRE_Int iAp1 = iA + zOffsetA_diag; HYPRE_Int iP1 = iP + zOffsetP + yOffsetP + xOffsetP; rap_ane[iAc] = ra[iR] * a_cne_offdp1 * pb[iP1 - pbOffset]; iP1 = iP + zOffsetP + yOffsetP; rap_an[iAc] = ra[iR] * a_cn_offdp1 * pb[iP1 - pbOffset] + ra[iR] * a_an_offdp1 + a_an_offd * pb[iP1 - pbOffset]; iP1 = iP + zOffsetP + yOffsetP - xOffsetP; rap_anw[iAc] = ra[iR] * a_cnw_offdp1 * pb[iP1 - pbOffset]; iP1 = iP + zOffsetP + xOffsetP; rap_ae[iAc] = ra[iR] * a_ce_offdp1 * pb[iP1 - pbOffset] + ra[iR] * a_ae_offdp1 + a_ae_offd * pb[iP1 - pbOffset]; iP1 = iP + zOffsetP; rap_ac[iAc] = a_ac_offd * pb[iP1 - pbOffset] + ra[iR] * a_cc[iAp1] * pb[iP1 - pbOffset] + ra[iR] * a_ac_offdp1; iP1 = iP + zOffsetP - xOffsetP; rap_aw[iAc] = ra[iR] * a_cw_offdp1 * pb[iP1 - pbOffset] + ra[iR] * a_aw_offdp1 + a_aw_offd * pb[iP1 - pbOffset]; iP1 = iP + zOffsetP - yOffsetP + xOffsetP; rap_ase[iAc] = ra[iR] * a_cse_offdp1 * pb[iP1 - pbOffset]; iP1 = iP + zOffsetP - yOffsetP; rap_as[iAc] = ra[iR] * a_cs_offdp1 * pb[iP1 - pbOffset] + ra[iR] * a_as_offdp1 + a_as_offd * pb[iP1 - pbOffset]; iP1 = iP + zOffsetP - yOffsetP - xOffsetP; rap_asw[iAc] = ra[iR] * a_csw_offdp1 * pb[iP1 - pbOffset]; iP1 = iP + yOffsetP + xOffsetP; rap_cne[iAc] = a_cne_offd + rb[iR - rbOffset] * a_cne_offdm1 * pb[iP1 - pbOffset] + ra[iR] * a_cne_offdp1 * pa[iP1]; iP1 = iP + yOffsetP; rap_cn[iAc] = a_cn_offd + rb[iR - rbOffset] * a_cn_offdm1 * pb[iP1 - pbOffset] + ra[iR] * a_cn_offdp1 * pa[iP1] + a_bn_offd * pb[iP1 - pbOffset] + a_an_offd * pa[iP1] + rb[iR - rbOffset] * a_an_offdm1 + ra[iR] * a_bn_offdp1; iP1 = iP + yOffsetP - xOffsetP; rap_cnw[iAc] = a_cnw_offd + rb[iR - rbOffset] * a_cnw_offdm1 * pb[iP1 - pbOffset] + ra[iR] * a_cnw_offdp1 * pa[iP1]; iP1 = iP + xOffsetP; rap_ce[iAc] = a_ce_offd + rb[iR - rbOffset] * a_ce_offdm1 * pb[iP1 - pbOffset] + ra[iR] * a_ce_offdp1 * pa[iP1] + a_be_offd * pb[iP1 - pbOffset] + a_ae_offd * pa[iP1] + rb[iR - rbOffset] * a_ae_offdm1 + ra[iR] * a_be_offdp1; } hypre_BoxLoop4End(iP, iR, iA, iAc); #undef DEVICE_VAR } /* }*/ /* end ForBoxI */ return hypre_error_flag; } /* core part of hypre_PFMG3BuildRAPNoSym, for one box, one value of fine_stencil_size (19) and one value of constant_coefficient (1). */ HYPRE_Int hypre_PFMG3BuildRAPNoSym_onebox_FSS19_CC1( HYPRE_Int ci, HYPRE_Int fi, hypre_StructMatrix *A, hypre_StructMatrix *P, hypre_StructMatrix *R, HYPRE_Int cdir, hypre_Index cindex, hypre_Index cstride, hypre_StructMatrix *RAP ) { hypre_Index index; hypre_Index index_temp; hypre_StructGrid *cgrid; hypre_BoxArray *cgrid_boxes; hypre_Box *cgrid_box; hypre_IndexRef cstart; hypre_Index fstart; HYPRE_Real *pa, *pb; HYPRE_Real *ra, *rb; HYPRE_Real *a_cc, *a_cw, *a_ce, *a_cs, *a_cn; HYPRE_Real *a_ac, *a_aw, *a_ae, *a_as, *a_an; HYPRE_Real *a_be, *a_bn; HYPRE_Real *a_csw, *a_cse, *a_cnw, *a_cne; HYPRE_Real *rap_ce, *rap_cn; HYPRE_Real *rap_ac, *rap_aw, *rap_ae, *rap_as, *rap_an; HYPRE_Real *rap_cnw, *rap_cne; HYPRE_Real *rap_asw, *rap_ase, *rap_anw, *rap_ane; HYPRE_Int iA, iAm1, iAp1; HYPRE_Int iAc; HYPRE_Int iP, iP1; HYPRE_Int iR; HYPRE_Int zOffsetA; HYPRE_Int xOffsetP; HYPRE_Int yOffsetP; HYPRE_Int zOffsetP; cgrid = hypre_StructMatrixGrid(RAP); cgrid_boxes = hypre_StructGridBoxes(cgrid); cgrid_box = hypre_BoxArrayBox(cgrid_boxes, ci); cstart = hypre_BoxIMin(cgrid_box); hypre_StructMapCoarseToFine(cstart, cindex, cstride, fstart); /*----------------------------------------------------------------- * Extract pointers for interpolation operator: * pa is pointer for weight for f-point above c-point * pb is pointer for weight for f-point below c-point *-----------------------------------------------------------------*/ hypre_SetIndex3(index_temp, 0, 0, -1); MapIndex(index_temp, cdir, index); pa = hypre_StructMatrixExtractPointerByIndex(P, fi, index); hypre_SetIndex3(index_temp, 0, 0, 1); MapIndex(index_temp, cdir, index); pb = hypre_StructMatrixExtractPointerByIndex(P, fi, index); /*----------------------------------------------------------------- * Extract pointers for restriction operator: * ra is pointer for weight for f-point above c-point * rb is pointer for weight for f-point below c-point *-----------------------------------------------------------------*/ hypre_SetIndex3(index_temp, 0, 0, -1); MapIndex(index_temp, cdir, index); ra = hypre_StructMatrixExtractPointerByIndex(R, fi, index); hypre_SetIndex3(index_temp, 0, 0, 1); MapIndex(index_temp, cdir, index); rb = hypre_StructMatrixExtractPointerByIndex(R, fi, index); /*----------------------------------------------------------------- * Extract pointers for 7-point fine grid operator: * * a_cc is pointer for center coefficient * a_cw is pointer for west coefficient in same plane * a_ce is pointer for east coefficient in same plane * a_cs is pointer for south coefficient in same plane * a_cn is pointer for north coefficient in same plane * a_ac is pointer for center coefficient in plane above * a_bc is pointer for center coefficient in plane below *-----------------------------------------------------------------*/ hypre_SetIndex3(index_temp, 0, 0, 0); MapIndex(index_temp, cdir, index); a_cc = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index_temp, -1, 0, 0); MapIndex(index_temp, cdir, index); a_cw = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index_temp, 1, 0, 0); MapIndex(index_temp, cdir, index); a_ce = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index_temp, 0, -1, 0); MapIndex(index_temp, cdir, index); a_cs = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index_temp, 0, 1, 0); MapIndex(index_temp, cdir, index); a_cn = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index_temp, 0, 0, 1); MapIndex(index_temp, cdir, index); a_ac = hypre_StructMatrixExtractPointerByIndex(A, fi, index); /*----------------------------------------------------------------- * Extract additional pointers for 19-point fine grid operator: * * a_aw is pointer for west coefficient in plane above * a_ae is pointer for east coefficient in plane above * a_as is pointer for south coefficient in plane above * a_an is pointer for north coefficient in plane above * a_bw is pointer for west coefficient in plane below * a_be is pointer for east coefficient in plane below * a_bs is pointer for south coefficient in plane below * a_bn is pointer for north coefficient in plane below * a_csw is pointer for southwest coefficient in same plane * a_cse is pointer for southeast coefficient in same plane * a_cnw is pointer for northwest coefficient in same plane * a_cne is pointer for northeast coefficient in same plane *-----------------------------------------------------------------*/ hypre_SetIndex3(index_temp, -1, 0, 1); MapIndex(index_temp, cdir, index); a_aw = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index_temp, 1, 0, 1); MapIndex(index_temp, cdir, index); a_ae = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index_temp, 0, -1, 1); MapIndex(index_temp, cdir, index); a_as = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index_temp, 0, 1, 1); MapIndex(index_temp, cdir, index); a_an = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index_temp, 1, 0, -1); MapIndex(index_temp, cdir, index); a_be = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index_temp, 0, 1, -1); MapIndex(index_temp, cdir, index); a_bn = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index_temp, -1, -1, 0); MapIndex(index_temp, cdir, index); a_csw = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index_temp, 1, -1, 0); MapIndex(index_temp, cdir, index); a_cse = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index_temp, -1, 1, 0); MapIndex(index_temp, cdir, index); a_cnw = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index_temp, 1, 1, 0); MapIndex(index_temp, cdir, index); a_cne = hypre_StructMatrixExtractPointerByIndex(A, fi, index); /*----------------------------------------------------------------- * Extract pointers for 19-point coarse grid operator: * * We build only the upper triangular part (excluding diagonal). * * rap_ce is pointer for east coefficient in same plane (etc.) *-----------------------------------------------------------------*/ hypre_SetIndex3(index_temp, 1, 0, 0); MapIndex(index_temp, cdir, index); rap_ce = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index_temp, 0, 1, 0); MapIndex(index_temp, cdir, index); rap_cn = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index_temp, 0, 0, 1); MapIndex(index_temp, cdir, index); rap_ac = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index_temp, -1, 0, 1); MapIndex(index_temp, cdir, index); rap_aw = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index_temp, 1, 0, 1); MapIndex(index_temp, cdir, index); rap_ae = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index_temp, 0, -1, 1); MapIndex(index_temp, cdir, index); rap_as = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index_temp, 0, 1, 1); MapIndex(index_temp, cdir, index); rap_an = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index_temp, -1, 1, 0); MapIndex(index_temp, cdir, index); rap_cnw = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index_temp, 1, 1, 0); MapIndex(index_temp, cdir, index); rap_cne = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); /*----------------------------------------------------------------- * Extract additional pointers for 27-point coarse grid operator: * * A 27-point coarse grid operator is produced when the fine grid * stencil is 19 or 27 point. * * We build only the upper triangular part. * * rap_cnw is pointer for northwest coefficient in same plane (etc.) *-----------------------------------------------------------------*/ hypre_SetIndex3(index_temp, -1, -1, 1); MapIndex(index_temp, cdir, index); rap_asw = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index_temp, 1, -1, 1); MapIndex(index_temp, cdir, index); rap_ase = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index_temp, -1, 1, 1); MapIndex(index_temp, cdir, index); rap_anw = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index_temp, 1, 1, 1); MapIndex(index_temp, cdir, index); rap_ane = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); /*----------------------------------------------------------------- * Define offsets for fine grid stencil and interpolation * * In the BoxLoop below I assume iA and iP refer to data associated * with the point which we are building the stencil for. The below * Offsets are used in refering to data associated with other points. *-----------------------------------------------------------------*/ hypre_SetIndex3(index_temp, 0, 0, 1); MapIndex(index_temp, cdir, index); zOffsetA = 0; zOffsetP = 0; hypre_SetIndex3(index_temp, 0, 1, 0); MapIndex(index_temp, cdir, index); yOffsetP = 0; hypre_SetIndex3(index_temp, 1, 0, 0); MapIndex(index_temp, cdir, index); xOffsetP = 0; /*----------------------------------------------------------------- * Switch statement to direct control to apropriate BoxLoop depending * on stencil size. Default is full 27-point. *-----------------------------------------------------------------*/ /*-------------------------------------------------------------- * Loop for 19-point fine grid operator; produces upper triangular * part of 27-point coarse grid operator. stencil entries: * (above-northeast, above-north, above-northwest, above-east, * above-center, above-west, above-southeast, above-south, * above-southwest, center-northeast, center-north, * center-northwest, and center-east). *--------------------------------------------------------------*/ iP = 0; iR = 0; iA = 0; iAc = 0; iAm1 = iA - zOffsetA; iAp1 = iA + zOffsetA; iP1 = iP + zOffsetP + yOffsetP + xOffsetP; rap_ane[iAc] = ra[iR] * a_cne[iAp1] * pb[iP1]; iP1 = iP + zOffsetP + yOffsetP; rap_an[iAc] = ra[iR] * a_cn[iAp1] * pb[iP1] + ra[iR] * a_an[iAp1] + a_an[iA] * pb[iP1]; iP1 = iP + zOffsetP + yOffsetP - xOffsetP; rap_anw[iAc] = ra[iR] * a_cnw[iAp1] * pb[iP1]; iP1 = iP + zOffsetP + xOffsetP; rap_ae[iAc] = ra[iR] * a_ce[iAp1] * pb[iP1] + ra[iR] * a_ae[iAp1] + a_ae[iA] * pb[iP1]; iP1 = iP + zOffsetP; rap_ac[iAc] = a_ac[iA] * pb[iP1] + ra[iR] * a_cc[iAp1] * pb[iP1] + ra[iR] * a_ac[iAp1]; iP1 = iP + zOffsetP - xOffsetP; rap_aw[iAc] = ra[iR] * a_cw[iAp1] * pb[iP1] + ra[iR] * a_aw[iAp1] + a_aw[iA] * pb[iP1]; iP1 = iP + zOffsetP - yOffsetP + xOffsetP; rap_ase[iAc] = ra[iR] * a_cse[iAp1] * pb[iP1]; iP1 = iP + zOffsetP - yOffsetP; rap_as[iAc] = ra[iR] * a_cs[iAp1] * pb[iP1] + ra[iR] * a_as[iAp1] + a_as[iA] * pb[iP1]; iP1 = iP + zOffsetP - yOffsetP - xOffsetP; rap_asw[iAc] = ra[iR] * a_csw[iAp1] * pb[iP1]; iP1 = iP + yOffsetP + xOffsetP; rap_cne[iAc] = a_cne[iA] + rb[iR] * a_cne[iAm1] * pb[iP1] + ra[iR] * a_cne[iAp1] * pa[iP1]; iP1 = iP + yOffsetP; rap_cn[iAc] = a_cn[iA] + rb[iR] * a_cn[iAm1] * pb[iP1] + ra[iR] * a_cn[iAp1] * pa[iP1] + a_bn[iA] * pb[iP1] + a_an[iA] * pa[iP1] + rb[iR] * a_an[iAm1] + ra[iR] * a_bn[iAp1]; iP1 = iP + yOffsetP - xOffsetP; rap_cnw[iAc] = a_cnw[iA] + rb[iR] * a_cnw[iAm1] * pb[iP1] + ra[iR] * a_cnw[iAp1] * pa[iP1]; iP1 = iP + xOffsetP; rap_ce[iAc] = a_ce[iA] + rb[iR] * a_ce[iAm1] * pb[iP1] + ra[iR] * a_ce[iAp1] * pa[iP1] + a_be[iA] * pb[iP1] + a_ae[iA] * pa[iP1] + rb[iR] * a_ae[iAm1] + ra[iR] * a_be[iAp1]; /* }*/ /* end ForBoxI */ return hypre_error_flag; } /* core part of hypre_PFMG3BuildRAPNoSym, for one box, one value of fine_stencil_size (27) and one value of constant_coefficient (0). */ HYPRE_Int hypre_PFMG3BuildRAPNoSym_onebox_FSS27_CC0( HYPRE_Int ci, HYPRE_Int fi, hypre_StructMatrix *A, hypre_StructMatrix *P, hypre_StructMatrix *R, HYPRE_Int cdir, hypre_Index cindex, hypre_Index cstride, hypre_StructMatrix *RAP ) { hypre_Index index; hypre_Index index_temp; hypre_StructGrid *cgrid; hypre_BoxArray *cgrid_boxes; hypre_Box *cgrid_box; hypre_IndexRef cstart; hypre_Index stridec; hypre_Index fstart; hypre_IndexRef stridef; hypre_Index loop_size; HYPRE_Int constant_coefficient_A; hypre_Box *A_dbox; hypre_Box *P_dbox; hypre_Box *R_dbox; hypre_Box *RAP_dbox; HYPRE_Real *pa, *pb; HYPRE_Real *ra, *rb; HYPRE_Real *a_cc, *a_cw, *a_ce, *a_cs, *a_cn; HYPRE_Real *a_ac, *a_aw, *a_ae, *a_as, *a_an; HYPRE_Real *a_be, *a_bn; HYPRE_Real *a_csw, *a_cse, *a_cnw, *a_cne; HYPRE_Real *a_asw, *a_ase, *a_anw, *a_ane; HYPRE_Real *a_bnw, *a_bne; HYPRE_Real a_cn_offd, a_cn_offdm1, a_cn_offdp1; HYPRE_Real a_ce_offd, a_ce_offdm1, a_ce_offdp1; HYPRE_Real a_cs_offdp1, a_cw_offdp1, a_cse_offdp1, a_csw_offdp1; HYPRE_Real a_cne_offd, a_cne_offdm1, a_cne_offdp1; HYPRE_Real a_cnw_offd, a_cnw_offdm1, a_cnw_offdp1; HYPRE_Real a_ac_offd, a_ac_offdp1; HYPRE_Real a_an_offd, a_an_offdm1, a_an_offdp1; HYPRE_Real a_ane_offd, a_ane_offdm1, a_ane_offdp1; HYPRE_Real a_anw_offd, a_anw_offdm1, a_anw_offdp1; HYPRE_Real a_as_offd, a_as_offdp1; HYPRE_Real a_ase_offd, a_ase_offdp1, a_asw_offd, a_asw_offdp1; HYPRE_Real a_aw_offd, a_aw_offdp1; HYPRE_Real a_ae_offd, a_ae_offdm1, a_ae_offdp1; HYPRE_Real a_be_offd, a_be_offdp1; HYPRE_Real a_bn_offd, a_bn_offdp1; HYPRE_Real a_bne_offd, a_bne_offdp1, a_bnw_offd, a_bnw_offdp1; HYPRE_Real *rap_ce, *rap_cn; HYPRE_Real *rap_ac, *rap_aw, *rap_ae, *rap_as, *rap_an; HYPRE_Real *rap_cnw, *rap_cne; HYPRE_Real *rap_asw, *rap_ase, *rap_anw, *rap_ane; HYPRE_Int iA_offd, iA_offdm1, iA_offdp1; HYPRE_Int zOffsetA; HYPRE_Int zOffsetA_diag; HYPRE_Int zOffsetA_offd; HYPRE_Int xOffsetP; HYPRE_Int yOffsetP; HYPRE_Int zOffsetP; stridef = cstride; hypre_SetIndex3(stridec, 1, 1, 1); cgrid = hypre_StructMatrixGrid(RAP); cgrid_boxes = hypre_StructGridBoxes(cgrid); constant_coefficient_A = hypre_StructMatrixConstantCoefficient(A); /* fi = 0; hypre_ForBoxI(ci, cgrid_boxes) { while (fgrid_ids[fi] != cgrid_ids[ci]) { fi++; } */ cgrid_box = hypre_BoxArrayBox(cgrid_boxes, ci); cstart = hypre_BoxIMin(cgrid_box); hypre_StructMapCoarseToFine(cstart, cindex, cstride, fstart); A_dbox = hypre_BoxArrayBox(hypre_StructMatrixDataSpace(A), fi); P_dbox = hypre_BoxArrayBox(hypre_StructMatrixDataSpace(P), fi); R_dbox = hypre_BoxArrayBox(hypre_StructMatrixDataSpace(R), fi); RAP_dbox = hypre_BoxArrayBox(hypre_StructMatrixDataSpace(RAP), ci); /*----------------------------------------------------------------- * Extract pointers for interpolation operator: * pa is pointer for weight for f-point above c-point * pb is pointer for weight for f-point below c-point *-----------------------------------------------------------------*/ hypre_SetIndex3(index_temp, 0, 0, -1); MapIndex(index_temp, cdir, index); pa = hypre_StructMatrixExtractPointerByIndex(P, fi, index); hypre_SetIndex3(index_temp, 0, 0, 1); MapIndex(index_temp, cdir, index); pb = hypre_StructMatrixExtractPointerByIndex(P, fi, index); //RL PTROFFSET HYPRE_Int pbOffset = hypre_BoxOffsetDistance(P_dbox, index); /*----------------------------------------------------------------- * Extract pointers for restriction operator: * ra is pointer for weight for f-point above c-point * rb is pointer for weight for f-point below c-point *-----------------------------------------------------------------*/ hypre_SetIndex3(index_temp, 0, 0, -1); MapIndex(index_temp, cdir, index); ra = hypre_StructMatrixExtractPointerByIndex(R, fi, index); hypre_SetIndex3(index_temp, 0, 0, 1); MapIndex(index_temp, cdir, index); rb = hypre_StructMatrixExtractPointerByIndex(R, fi, index); //RL PTROFFSET HYPRE_Int rbOffset = hypre_BoxOffsetDistance(R_dbox, index); /*----------------------------------------------------------------- * Extract pointers for 7-point fine grid operator: * * a_cc is pointer for center coefficient * a_cw is pointer for west coefficient in same plane * a_ce is pointer for east coefficient in same plane * a_cs is pointer for south coefficient in same plane * a_cn is pointer for north coefficient in same plane * a_ac is pointer for center coefficient in plane above * a_bc is pointer for center coefficient in plane below *-----------------------------------------------------------------*/ hypre_SetIndex3(index_temp, 0, 0, 0); MapIndex(index_temp, cdir, index); a_cc = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index_temp, -1, 0, 0); MapIndex(index_temp, cdir, index); a_cw = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index_temp, 1, 0, 0); MapIndex(index_temp, cdir, index); a_ce = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index_temp, 0, -1, 0); MapIndex(index_temp, cdir, index); a_cs = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index_temp, 0, 1, 0); MapIndex(index_temp, cdir, index); a_cn = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index_temp, 0, 0, 1); MapIndex(index_temp, cdir, index); a_ac = hypre_StructMatrixExtractPointerByIndex(A, fi, index); /*----------------------------------------------------------------- * Extract additional pointers for 19-point fine grid operator: * * a_aw is pointer for west coefficient in plane above * a_ae is pointer for east coefficient in plane above * a_as is pointer for south coefficient in plane above * a_an is pointer for north coefficient in plane above * a_bw is pointer for west coefficient in plane below * a_be is pointer for east coefficient in plane below * a_bs is pointer for south coefficient in plane below * a_bn is pointer for north coefficient in plane below * a_csw is pointer for southwest coefficient in same plane * a_cse is pointer for southeast coefficient in same plane * a_cnw is pointer for northwest coefficient in same plane * a_cne is pointer for northeast coefficient in same plane *-----------------------------------------------------------------*/ hypre_SetIndex3(index_temp, -1, 0, 1); MapIndex(index_temp, cdir, index); a_aw = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index_temp, 1, 0, 1); MapIndex(index_temp, cdir, index); a_ae = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index_temp, 0, -1, 1); MapIndex(index_temp, cdir, index); a_as = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index_temp, 0, 1, 1); MapIndex(index_temp, cdir, index); a_an = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index_temp, 1, 0, -1); MapIndex(index_temp, cdir, index); a_be = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index_temp, 0, 1, -1); MapIndex(index_temp, cdir, index); a_bn = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index_temp, -1, -1, 0); MapIndex(index_temp, cdir, index); a_csw = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index_temp, 1, -1, 0); MapIndex(index_temp, cdir, index); a_cse = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index_temp, -1, 1, 0); MapIndex(index_temp, cdir, index); a_cnw = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index_temp, 1, 1, 0); MapIndex(index_temp, cdir, index); a_cne = hypre_StructMatrixExtractPointerByIndex(A, fi, index); /*----------------------------------------------------------------- * Extract additional pointers for 27-point fine grid operator: * * a_asw is pointer for southwest coefficient in plane above * a_ase is pointer for southeast coefficient in plane above * a_anw is pointer for northwest coefficient in plane above * a_ane is pointer for northeast coefficient in plane above * a_bsw is pointer for southwest coefficient in plane below * a_bse is pointer for southeast coefficient in plane below * a_bnw is pointer for northwest coefficient in plane below * a_bne is pointer for northeast coefficient in plane below *-----------------------------------------------------------------*/ hypre_SetIndex3(index_temp, -1, -1, 1); MapIndex(index_temp, cdir, index); a_asw = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index_temp, 1, -1, 1); MapIndex(index_temp, cdir, index); a_ase = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index_temp, -1, 1, 1); MapIndex(index_temp, cdir, index); a_anw = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index_temp, 1, 1, 1); MapIndex(index_temp, cdir, index); a_ane = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index_temp, -1, 1, -1); MapIndex(index_temp, cdir, index); a_bnw = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index_temp, 1, 1, -1); MapIndex(index_temp, cdir, index); a_bne = hypre_StructMatrixExtractPointerByIndex(A, fi, index); /*----------------------------------------------------------------- * Extract pointers for 19-point coarse grid operator: * * We build only the upper triangular part (excluding diagonal). * * rap_ce is pointer for east coefficient in same plane (etc.) *-----------------------------------------------------------------*/ hypre_SetIndex3(index_temp, 1, 0, 0); MapIndex(index_temp, cdir, index); rap_ce = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index_temp, 0, 1, 0); MapIndex(index_temp, cdir, index); rap_cn = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index_temp, 0, 0, 1); MapIndex(index_temp, cdir, index); rap_ac = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index_temp, -1, 0, 1); MapIndex(index_temp, cdir, index); rap_aw = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index_temp, 1, 0, 1); MapIndex(index_temp, cdir, index); rap_ae = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index_temp, 0, -1, 1); MapIndex(index_temp, cdir, index); rap_as = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index_temp, 0, 1, 1); MapIndex(index_temp, cdir, index); rap_an = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index_temp, -1, 1, 0); MapIndex(index_temp, cdir, index); rap_cnw = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index_temp, 1, 1, 0); MapIndex(index_temp, cdir, index); rap_cne = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); /*----------------------------------------------------------------- * Extract additional pointers for 27-point coarse grid operator: * * A 27-point coarse grid operator is produced when the fine grid * stencil is 19 or 27 point. * * We build only the upper triangular part. * * rap_cnw is pointer for northwest coefficient in same plane (etc.) *-----------------------------------------------------------------*/ hypre_SetIndex3(index_temp, -1, -1, 1); MapIndex(index_temp, cdir, index); rap_asw = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index_temp, 1, -1, 1); MapIndex(index_temp, cdir, index); rap_ase = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index_temp, -1, 1, 1); MapIndex(index_temp, cdir, index); rap_anw = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index_temp, 1, 1, 1); MapIndex(index_temp, cdir, index); rap_ane = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); /*----------------------------------------------------------------- * Define offsets for fine grid stencil and interpolation * * In the BoxLoop below I assume iA and iP refer to data associated * with the point which we are building the stencil for. The below * Offsets are used in refering to data associated with other points. *-----------------------------------------------------------------*/ hypre_SetIndex3(index_temp, 0, 0, 1); MapIndex(index_temp, cdir, index); zOffsetP = hypre_BoxOffsetDistance(P_dbox, index); if ( constant_coefficient_A == 0 ) { zOffsetA = hypre_BoxOffsetDistance(A_dbox, index); } else { zOffsetA_diag = hypre_BoxOffsetDistance(A_dbox, index); zOffsetA_offd = 0; } hypre_SetIndex3(index_temp, 0, 1, 0); MapIndex(index_temp, cdir, index); yOffsetP = hypre_BoxOffsetDistance(P_dbox, index); hypre_SetIndex3(index_temp, 1, 0, 0); MapIndex(index_temp, cdir, index); xOffsetP = hypre_BoxOffsetDistance(P_dbox, index); /*----------------------------------------------------------------- * Switch statement to direct control to apropriate BoxLoop depending * on stencil size. Default is full 27-point. *-----------------------------------------------------------------*/ /*-------------------------------------------------------------- * Loop for 27-point fine grid operator; produces upper triangular * part of 27-point coarse grid operator. stencil entries: * (above-northeast, above-north, above-northwest, above-east, * above-center, above-west, above-southeast, above-south, * above-southwest, center-northeast, center-north, * center-northwest, and center-east). *--------------------------------------------------------------*/ hypre_BoxGetSize(cgrid_box, loop_size); if ( constant_coefficient_A == 0 ) { #define DEVICE_VAR is_device_ptr(rap_ane,ra,a_cne,pb,a_ane,rap_an,a_cn,a_an,rap_anw,a_cnw,a_anw,rap_ae,a_ce,a_ae,rap_ac,a_ac,a_cc,rap_aw,a_cw,a_aw,rap_ase,a_cse,a_ase,rap_as,a_cs,a_as,rap_asw,a_csw,a_asw,rap_cne,rb,pa,a_bne,rap_cn,a_bn,rap_cnw,a_bnw,rap_ce,a_be) hypre_BoxLoop4Begin(hypre_StructMatrixNDim(A), loop_size, P_dbox, cstart, stridec, iP, R_dbox, cstart, stridec, iR, A_dbox, fstart, stridef, iA, RAP_dbox, cstart, stridec, iAc); { HYPRE_Int iAm1 = iA - zOffsetA; HYPRE_Int iAp1 = iA + zOffsetA; HYPRE_Int iP1 = iP + zOffsetP + yOffsetP + xOffsetP; rap_ane[iAc] = ra[iR] * a_cne[iAp1] * pb[iP1 - pbOffset] + ra[iR] * a_ane[iAp1] + a_ane[iA] * pb[iP1 - pbOffset]; iP1 = iP + zOffsetP + yOffsetP; rap_an[iAc] = ra[iR] * a_cn[iAp1] * pb[iP1 - pbOffset] + ra[iR] * a_an[iAp1] + a_an[iA] * pb[iP1 - pbOffset]; iP1 = iP + zOffsetP + yOffsetP - xOffsetP; rap_anw[iAc] = ra[iR] * a_cnw[iAp1] * pb[iP1 - pbOffset] + ra[iR] * a_anw[iAp1] + a_anw[iA] * pb[iP1 - pbOffset]; iP1 = iP + zOffsetP + xOffsetP; rap_ae[iAc] = ra[iR] * a_ce[iAp1] * pb[iP1 - pbOffset] + ra[iR] * a_ae[iAp1] + a_ae[iA] * pb[iP1 - pbOffset]; iP1 = iP + zOffsetP; rap_ac[iAc] = a_ac[iA] * pb[iP1 - pbOffset] + ra[iR] * a_cc[iAp1] * pb[iP1 - pbOffset] + ra[iR] * a_ac[iAp1]; iP1 = iP + zOffsetP - xOffsetP; rap_aw[iAc] = ra[iR] * a_cw[iAp1] * pb[iP1 - pbOffset] + ra[iR] * a_aw[iAp1] + a_aw[iA] * pb[iP1 - pbOffset]; iP1 = iP + zOffsetP - yOffsetP + xOffsetP; rap_ase[iAc] = ra[iR] * a_cse[iAp1] * pb[iP1 - pbOffset] + ra[iR] * a_ase[iAp1] + a_ase[iA] * pb[iP1 - pbOffset]; iP1 = iP + zOffsetP - yOffsetP; rap_as[iAc] = ra[iR] * a_cs[iAp1] * pb[iP1 - pbOffset] + ra[iR] * a_as[iAp1] + a_as[iA] * pb[iP1 - pbOffset]; iP1 = iP + zOffsetP - yOffsetP - xOffsetP; rap_asw[iAc] = ra[iR] * a_csw[iAp1] * pb[iP1 - pbOffset] + ra[iR] * a_asw[iAp1] + a_asw[iA] * pb[iP1 - pbOffset]; iP1 = iP + yOffsetP + xOffsetP; rap_cne[iAc] = a_cne[iA] + rb[iR - rbOffset] * a_cne[iAm1] * pb[iP1 - pbOffset] + ra[iR] * a_cne[iAp1] * pa[iP1] + a_bne[iA] * pb[iP1 - pbOffset] + a_ane[iA] * pa[iP1] + rb[iR - rbOffset] * a_ane[iAm1] + ra[iR] * a_bne[iAp1]; iP1 = iP + yOffsetP; rap_cn[iAc] = a_cn[iA] + rb[iR - rbOffset] * a_cn[iAm1] * pb[iP1 - pbOffset] + ra[iR] * a_cn[iAp1] * pa[iP1] + a_bn[iA] * pb[iP1 - pbOffset] + a_an[iA] * pa[iP1] + rb[iR - rbOffset] * a_an[iAm1] + ra[iR] * a_bn[iAp1]; iP1 = iP + yOffsetP - xOffsetP; rap_cnw[iAc] = a_cnw[iA] + rb[iR - rbOffset] * a_cnw[iAm1] * pb[iP1 - pbOffset] + ra[iR] * a_cnw[iAp1] * pa[iP1] + a_bnw[iA] * pb[iP1 - pbOffset] + a_anw[iA] * pa[iP1] + rb[iR - rbOffset] * a_anw[iAm1] + ra[iR] * a_bnw[iAp1]; iP1 = iP + xOffsetP; rap_ce[iAc] = a_ce[iA] + rb[iR - rbOffset] * a_ce[iAm1] * pb[iP1 - pbOffset] + ra[iR] * a_ce[iAp1] * pa[iP1] + a_be[iA] * pb[iP1 - pbOffset] + a_ae[iA] * pa[iP1] + rb[iR - rbOffset] * a_ae[iAm1] + ra[iR] * a_be[iAp1]; } hypre_BoxLoop4End(iP, iR, iA, iAc); #undef DEVICE_VAR } else { iA_offd = 0; iA_offdm1 = iA_offd - zOffsetA_offd; iA_offdp1 = iA_offd + zOffsetA_offd; a_cn_offd = a_cn[iA_offd]; a_cn_offdm1 = a_cn[iA_offdm1]; a_cn_offdp1 = a_cn[iA_offdp1]; a_cne_offd = a_cne[iA_offd]; a_cne_offdm1 = a_cne[iA_offdm1]; a_cne_offdp1 = a_cne[iA_offdp1]; a_cnw_offd = a_cnw[iA_offd]; a_cnw_offdm1 = a_cnw[iA_offdm1]; a_cnw_offdp1 = a_cnw[iA_offdp1]; a_ce_offd = a_ce[iA_offd]; a_ce_offdm1 = a_ce[iA_offdm1]; a_ce_offdp1 = a_ce[iA_offdp1]; a_cs_offdp1 = a_cs[iA_offdp1]; a_cse_offdp1 = a_cse[iA_offdp1]; a_csw_offdp1 = a_csw[iA_offdp1]; a_cw_offdp1 = a_cw[iA_offdp1]; a_ac_offd = a_ac[iA_offd]; a_ac_offdp1 = a_ac[iA_offdp1]; a_an_offd = a_an[iA_offd]; a_an_offdm1 = a_an[iA_offdm1]; a_an_offdp1 = a_an[iA_offdp1]; a_ane_offd = a_ane[iA_offd]; a_ane_offdm1 = a_ane[iA_offdm1]; a_ane_offdp1 = a_ane[iA_offdp1]; a_anw_offd = a_anw[iA_offd]; a_anw_offdm1 = a_anw[iA_offdm1]; a_anw_offdp1 = a_anw[iA_offdp1]; a_ae_offd = a_ae[iA_offd]; a_ae_offdm1 = a_ae[iA_offdm1]; a_ae_offdp1 = a_ae[iA_offdp1]; a_aw_offd = a_aw[iA_offd]; a_aw_offdp1 = a_aw[iA_offdp1]; a_as_offd = a_as[iA_offd]; a_as_offdp1 = a_as[iA_offdp1]; a_ase_offd = a_ase[iA_offd]; a_ase_offdp1 = a_ase[iA_offdp1]; a_asw_offd = a_asw[iA_offd]; a_asw_offdp1 = a_asw[iA_offdp1]; a_bn_offd = a_bn[iA_offd]; a_bn_offdp1 = a_bn[iA_offdp1]; a_bne_offd = a_bne[iA_offd]; a_bne_offdp1 = a_bne[iA_offdp1]; a_bnw_offd = a_bnw[iA_offd]; a_bnw_offdp1 = a_bnw[iA_offdp1]; a_be_offd = a_be[iA_offd]; a_be_offdp1 = a_be[iA_offdp1]; #define DEVICE_VAR is_device_ptr(rap_ane,ra,pb,rap_an,rap_anw,rap_ae,rap_ac,a_cc,rap_aw,rap_ase,rap_as,rap_asw,rap_cne,rb,pa,rap_cn,rap_cnw,rap_ce) hypre_BoxLoop4Begin(hypre_StructMatrixNDim(A), loop_size, P_dbox, cstart, stridec, iP, R_dbox, cstart, stridec, iR, A_dbox, fstart, stridef, iA, RAP_dbox, cstart, stridec, iAc); { HYPRE_Int iAp1 = iA + zOffsetA_diag; HYPRE_Int iP1 = iP + zOffsetP + yOffsetP + xOffsetP; rap_ane[iAc] = ra[iR] * a_cne_offdp1 * pb[iP1 - pbOffset] + ra[iR] * a_ane_offdp1 + a_ane_offd * pb[iP1 - pbOffset]; iP1 = iP + zOffsetP + yOffsetP; rap_an[iAc] = ra[iR] * a_cn_offdp1 * pb[iP1 - pbOffset] + ra[iR] * a_an_offdp1 + a_an_offd * pb[iP1 - pbOffset]; iP1 = iP + zOffsetP + yOffsetP - xOffsetP; rap_anw[iAc] = ra[iR] * a_cnw_offdp1 * pb[iP1 - pbOffset] + ra[iR] * a_anw_offdp1 + a_anw_offd * pb[iP1 - pbOffset]; iP1 = iP + zOffsetP + xOffsetP; rap_ae[iAc] = ra[iR] * a_ce_offdp1 * pb[iP1 - pbOffset] + ra[iR] * a_ae_offdp1 + a_ae_offd * pb[iP1 - pbOffset]; iP1 = iP + zOffsetP; rap_ac[iAc] = a_ac_offd * pb[iP1 - pbOffset] + ra[iR] * a_cc[iAp1] * pb[iP1 - pbOffset] + ra[iR] * a_ac_offdp1; iP1 = iP + zOffsetP - xOffsetP; rap_aw[iAc] = ra[iR] * a_cw_offdp1 * pb[iP1 - pbOffset] + ra[iR] * a_aw_offdp1 + a_aw_offd * pb[iP1 - pbOffset]; iP1 = iP + zOffsetP - yOffsetP + xOffsetP; rap_ase[iAc] = ra[iR] * a_cse_offdp1 * pb[iP1 - pbOffset] + ra[iR] * a_ase_offdp1 + a_ase_offd * pb[iP1 - pbOffset]; iP1 = iP + zOffsetP - yOffsetP; rap_as[iAc] = ra[iR] * a_cs_offdp1 * pb[iP1 - pbOffset] + ra[iR] * a_as_offdp1 + a_as_offd * pb[iP1 - pbOffset]; iP1 = iP + zOffsetP - yOffsetP - xOffsetP; rap_asw[iAc] = ra[iR] * a_csw_offdp1 * pb[iP1 - pbOffset] + ra[iR] * a_asw_offdp1 + a_asw_offd * pb[iP1 - pbOffset]; iP1 = iP + yOffsetP + xOffsetP; rap_cne[iAc] = a_cne_offd + rb[iR - rbOffset] * a_cne_offdm1 * pb[iP1 - pbOffset] + ra[iR] * a_cne_offdp1 * pa[iP1] + a_bne_offd * pb[iP1 - pbOffset] + a_ane_offd * pa[iP1] + rb[iR - rbOffset] * a_ane_offdm1 + ra[iR] * a_bne_offdp1; iP1 = iP + yOffsetP; rap_cn[iAc] = a_cn_offd + rb[iR - rbOffset] * a_cn_offdm1 * pb[iP1 - pbOffset] + ra[iR] * a_cn_offdp1 * pa[iP1] + a_bn_offd * pb[iP1 - pbOffset] + a_an_offd * pa[iP1] + rb[iR - rbOffset] * a_an_offdm1 + ra[iR] * a_bn_offdp1; iP1 = iP + yOffsetP - xOffsetP; rap_cnw[iAc] = a_cnw_offd + rb[iR - rbOffset] * a_cnw_offdm1 * pb[iP1 - pbOffset] + ra[iR] * a_cnw_offdp1 * pa[iP1] + a_bnw_offd * pb[iP1 - pbOffset] + a_anw_offd * pa[iP1] + rb[iR - rbOffset] * a_anw_offdm1 + ra[iR] * a_bnw_offdp1; iP1 = iP + xOffsetP; rap_ce[iAc] = a_ce_offd + rb[iR - rbOffset] * a_ce_offdm1 * pb[iP1 - pbOffset] + ra[iR] * a_ce_offdp1 * pa[iP1] + a_be_offd * pb[iP1 - pbOffset] + a_ae_offd * pa[iP1] + rb[iR - rbOffset] * a_ae_offdm1 + ra[iR] * a_be_offdp1; } hypre_BoxLoop4End(iP, iR, iA, iAc); #undef DEVICE_VAR } /* }*/ /* end ForBoxI */ return hypre_error_flag; } /* core part of hypre_PFMG3BuildRAPNoSym, for one box, one value of fine_stencil_size (27) and one value of constant_coefficient (1). */ HYPRE_Int hypre_PFMG3BuildRAPNoSym_onebox_FSS27_CC1( HYPRE_Int ci, HYPRE_Int fi, hypre_StructMatrix *A, hypre_StructMatrix *P, hypre_StructMatrix *R, HYPRE_Int cdir, hypre_Index cindex, hypre_Index cstride, hypre_StructMatrix *RAP ) { hypre_Index index; hypre_Index index_temp; hypre_StructGrid *cgrid; hypre_BoxArray *cgrid_boxes; hypre_Box *cgrid_box; hypre_IndexRef cstart; hypre_Index fstart; HYPRE_Real *pa, *pb; HYPRE_Real *ra, *rb; HYPRE_Real *a_cc, *a_cw, *a_ce, *a_cs, *a_cn; HYPRE_Real *a_ac, *a_aw, *a_ae, *a_as, *a_an; HYPRE_Real *a_be, *a_bn; HYPRE_Real *a_csw, *a_cse, *a_cnw, *a_cne; HYPRE_Real *a_asw, *a_ase, *a_anw, *a_ane; HYPRE_Real *a_bnw, *a_bne; HYPRE_Real *rap_ce, *rap_cn; HYPRE_Real *rap_ac, *rap_aw, *rap_ae, *rap_as, *rap_an; HYPRE_Real *rap_cnw, *rap_cne; HYPRE_Real *rap_asw, *rap_ase, *rap_anw, *rap_ane; HYPRE_Int iA, iAm1, iAp1; HYPRE_Int iAc; HYPRE_Int iP, iP1; HYPRE_Int iR; HYPRE_Int zOffsetA; HYPRE_Int xOffsetP; HYPRE_Int yOffsetP; HYPRE_Int zOffsetP; cgrid = hypre_StructMatrixGrid(RAP); cgrid_boxes = hypre_StructGridBoxes(cgrid); cgrid_box = hypre_BoxArrayBox(cgrid_boxes, ci); cstart = hypre_BoxIMin(cgrid_box); hypre_StructMapCoarseToFine(cstart, cindex, cstride, fstart); /*----------------------------------------------------------------- * Extract pointers for interpolation operator: * pa is pointer for weight for f-point above c-point * pb is pointer for weight for f-point below c-point *-----------------------------------------------------------------*/ hypre_SetIndex3(index_temp, 0, 0, -1); MapIndex(index_temp, cdir, index); pa = hypre_StructMatrixExtractPointerByIndex(P, fi, index); hypre_SetIndex3(index_temp, 0, 0, 1); MapIndex(index_temp, cdir, index); pb = hypre_StructMatrixExtractPointerByIndex(P, fi, index); /*----------------------------------------------------------------- * Extract pointers for restriction operator: * ra is pointer for weight for f-point above c-point * rb is pointer for weight for f-point below c-point *-----------------------------------------------------------------*/ hypre_SetIndex3(index_temp, 0, 0, -1); MapIndex(index_temp, cdir, index); ra = hypre_StructMatrixExtractPointerByIndex(R, fi, index); hypre_SetIndex3(index_temp, 0, 0, 1); MapIndex(index_temp, cdir, index); rb = hypre_StructMatrixExtractPointerByIndex(R, fi, index); /*----------------------------------------------------------------- * Extract pointers for 7-point fine grid operator: * * a_cc is pointer for center coefficient * a_cw is pointer for west coefficient in same plane * a_ce is pointer for east coefficient in same plane * a_cs is pointer for south coefficient in same plane * a_cn is pointer for north coefficient in same plane * a_ac is pointer for center coefficient in plane above * a_bc is pointer for center coefficient in plane below *-----------------------------------------------------------------*/ hypre_SetIndex3(index_temp, 0, 0, 0); MapIndex(index_temp, cdir, index); a_cc = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index_temp, -1, 0, 0); MapIndex(index_temp, cdir, index); a_cw = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index_temp, 1, 0, 0); MapIndex(index_temp, cdir, index); a_ce = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index_temp, 0, -1, 0); MapIndex(index_temp, cdir, index); a_cs = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index_temp, 0, 1, 0); MapIndex(index_temp, cdir, index); a_cn = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index_temp, 0, 0, 1); MapIndex(index_temp, cdir, index); a_ac = hypre_StructMatrixExtractPointerByIndex(A, fi, index); /*----------------------------------------------------------------- * Extract additional pointers for 19-point fine grid operator: * * a_aw is pointer for west coefficient in plane above * a_ae is pointer for east coefficient in plane above * a_as is pointer for south coefficient in plane above * a_an is pointer for north coefficient in plane above * a_bw is pointer for west coefficient in plane below * a_be is pointer for east coefficient in plane below * a_bs is pointer for south coefficient in plane below * a_bn is pointer for north coefficient in plane below * a_csw is pointer for southwest coefficient in same plane * a_cse is pointer for southeast coefficient in same plane * a_cnw is pointer for northwest coefficient in same plane * a_cne is pointer for northeast coefficient in same plane *-----------------------------------------------------------------*/ hypre_SetIndex3(index_temp, -1, 0, 1); MapIndex(index_temp, cdir, index); a_aw = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index_temp, 1, 0, 1); MapIndex(index_temp, cdir, index); a_ae = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index_temp, 0, -1, 1); MapIndex(index_temp, cdir, index); a_as = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index_temp, 0, 1, 1); MapIndex(index_temp, cdir, index); a_an = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index_temp, 1, 0, -1); MapIndex(index_temp, cdir, index); a_be = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index_temp, 0, 1, -1); MapIndex(index_temp, cdir, index); a_bn = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index_temp, -1, -1, 0); MapIndex(index_temp, cdir, index); a_csw = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index_temp, 1, -1, 0); MapIndex(index_temp, cdir, index); a_cse = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index_temp, -1, 1, 0); MapIndex(index_temp, cdir, index); a_cnw = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index_temp, 1, 1, 0); MapIndex(index_temp, cdir, index); a_cne = hypre_StructMatrixExtractPointerByIndex(A, fi, index); /*----------------------------------------------------------------- * Extract additional pointers for 27-point fine grid operator: * * a_asw is pointer for southwest coefficient in plane above * a_ase is pointer for southeast coefficient in plane above * a_anw is pointer for northwest coefficient in plane above * a_ane is pointer for northeast coefficient in plane above * a_bsw is pointer for southwest coefficient in plane below * a_bse is pointer for southeast coefficient in plane below * a_bnw is pointer for northwest coefficient in plane below * a_bne is pointer for northeast coefficient in plane below *-----------------------------------------------------------------*/ hypre_SetIndex3(index_temp, -1, -1, 1); MapIndex(index_temp, cdir, index); a_asw = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index_temp, 1, -1, 1); MapIndex(index_temp, cdir, index); a_ase = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index_temp, -1, 1, 1); MapIndex(index_temp, cdir, index); a_anw = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index_temp, 1, 1, 1); MapIndex(index_temp, cdir, index); a_ane = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index_temp, -1, 1, -1); MapIndex(index_temp, cdir, index); a_bnw = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index_temp, 1, 1, -1); MapIndex(index_temp, cdir, index); a_bne = hypre_StructMatrixExtractPointerByIndex(A, fi, index); /*----------------------------------------------------------------- * Extract pointers for 19-point coarse grid operator: * * We build only the upper triangular part (excluding diagonal). * * rap_ce is pointer for east coefficient in same plane (etc.) *-----------------------------------------------------------------*/ hypre_SetIndex3(index_temp, 1, 0, 0); MapIndex(index_temp, cdir, index); rap_ce = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index_temp, 0, 1, 0); MapIndex(index_temp, cdir, index); rap_cn = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index_temp, 0, 0, 1); MapIndex(index_temp, cdir, index); rap_ac = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index_temp, -1, 0, 1); MapIndex(index_temp, cdir, index); rap_aw = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index_temp, 1, 0, 1); MapIndex(index_temp, cdir, index); rap_ae = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index_temp, 0, -1, 1); MapIndex(index_temp, cdir, index); rap_as = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index_temp, 0, 1, 1); MapIndex(index_temp, cdir, index); rap_an = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index_temp, -1, 1, 0); MapIndex(index_temp, cdir, index); rap_cnw = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index_temp, 1, 1, 0); MapIndex(index_temp, cdir, index); rap_cne = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); /*----------------------------------------------------------------- * Extract additional pointers for 27-point coarse grid operator: * * A 27-point coarse grid operator is produced when the fine grid * stencil is 19 or 27 point. * * We build only the upper triangular part. * * rap_cnw is pointer for northwest coefficient in same plane (etc.) *-----------------------------------------------------------------*/ hypre_SetIndex3(index_temp, -1, -1, 1); MapIndex(index_temp, cdir, index); rap_asw = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index_temp, 1, -1, 1); MapIndex(index_temp, cdir, index); rap_ase = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index_temp, -1, 1, 1); MapIndex(index_temp, cdir, index); rap_anw = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index_temp, 1, 1, 1); MapIndex(index_temp, cdir, index); rap_ane = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); /*----------------------------------------------------------------- * Define offsets for fine grid stencil and interpolation * * In the BoxLoop below I assume iA and iP refer to data associated * with the point which we are building the stencil for. The below * Offsets are used in refering to data associated with other points. *-----------------------------------------------------------------*/ hypre_SetIndex3(index_temp, 0, 0, 1); MapIndex(index_temp, cdir, index); zOffsetA = 0; zOffsetP = 0; hypre_SetIndex3(index_temp, 0, 1, 0); MapIndex(index_temp, cdir, index); yOffsetP = 0; hypre_SetIndex3(index_temp, 1, 0, 0); MapIndex(index_temp, cdir, index); xOffsetP = 0; /*----------------------------------------------------------------- * Switch statement to direct control to apropriate BoxLoop depending * on stencil size. Default is full 27-point. *-----------------------------------------------------------------*/ /*-------------------------------------------------------------- * Loop for 27-point fine grid operator; produces upper triangular * part of 27-point coarse grid operator. stencil entries: * (above-northeast, above-north, above-northwest, above-east, * above-center, above-west, above-southeast, above-south, * above-southwest, center-northeast, center-north, * center-northwest, and center-east). *--------------------------------------------------------------*/ iP = 0; iR = 0; iA = 0; iAc = 0; iAm1 = iA - zOffsetA; iAp1 = iA + zOffsetA; iP1 = iP + zOffsetP + yOffsetP + xOffsetP; rap_ane[iAc] = ra[iR] * a_cne[iAp1] * pb[iP1] + ra[iR] * a_ane[iAp1] + a_ane[iA] * pb[iP1]; iP1 = iP + zOffsetP + yOffsetP; rap_an[iAc] = ra[iR] * a_cn[iAp1] * pb[iP1] + ra[iR] * a_an[iAp1] + a_an[iA] * pb[iP1]; iP1 = iP + zOffsetP + yOffsetP - xOffsetP; rap_anw[iAc] = ra[iR] * a_cnw[iAp1] * pb[iP1] + ra[iR] * a_anw[iAp1] + a_anw[iA] * pb[iP1]; iP1 = iP + zOffsetP + xOffsetP; rap_ae[iAc] = ra[iR] * a_ce[iAp1] * pb[iP1] + ra[iR] * a_ae[iAp1] + a_ae[iA] * pb[iP1]; iP1 = iP + zOffsetP; rap_ac[iAc] = a_ac[iA] * pb[iP1] + ra[iR] * a_cc[iAp1] * pb[iP1] + ra[iR] * a_ac[iAp1]; iP1 = iP + zOffsetP - xOffsetP; rap_aw[iAc] = ra[iR] * a_cw[iAp1] * pb[iP1] + ra[iR] * a_aw[iAp1] + a_aw[iA] * pb[iP1]; iP1 = iP + zOffsetP - yOffsetP + xOffsetP; rap_ase[iAc] = ra[iR] * a_cse[iAp1] * pb[iP1] + ra[iR] * a_ase[iAp1] + a_ase[iA] * pb[iP1]; iP1 = iP + zOffsetP - yOffsetP; rap_as[iAc] = ra[iR] * a_cs[iAp1] * pb[iP1] + ra[iR] * a_as[iAp1] + a_as[iA] * pb[iP1]; iP1 = iP + zOffsetP - yOffsetP - xOffsetP; rap_asw[iAc] = ra[iR] * a_csw[iAp1] * pb[iP1] + ra[iR] * a_asw[iAp1] + a_asw[iA] * pb[iP1]; iP1 = iP + yOffsetP + xOffsetP; rap_cne[iAc] = a_cne[iA] + rb[iR] * a_cne[iAm1] * pb[iP1] + ra[iR] * a_cne[iAp1] * pa[iP1] + a_bne[iA] * pb[iP1] + a_ane[iA] * pa[iP1] + rb[iR] * a_ane[iAm1] + ra[iR] * a_bne[iAp1]; iP1 = iP + yOffsetP; rap_cn[iAc] = a_cn[iA] + rb[iR] * a_cn[iAm1] * pb[iP1] + ra[iR] * a_cn[iAp1] * pa[iP1] + a_bn[iA] * pb[iP1] + a_an[iA] * pa[iP1] + rb[iR] * a_an[iAm1] + ra[iR] * a_bn[iAp1]; iP1 = iP + yOffsetP - xOffsetP; rap_cnw[iAc] = a_cnw[iA] + rb[iR] * a_cnw[iAm1] * pb[iP1] + ra[iR] * a_cnw[iAp1] * pa[iP1] + a_bnw[iA] * pb[iP1] + a_anw[iA] * pa[iP1] + rb[iR] * a_anw[iAm1] + ra[iR] * a_bnw[iAp1]; iP1 = iP + xOffsetP; rap_ce[iAc] = a_ce[iA] + rb[iR] * a_ce[iAm1] * pb[iP1] + ra[iR] * a_ce[iAp1] * pa[iP1] + a_be[iA] * pb[iP1] + a_ae[iA] * pa[iP1] + rb[iR] * a_ae[iAm1] + ra[iR] * a_be[iAp1]; /* }*/ /* end ForBoxI */ return hypre_error_flag; } hypre-2.33.0/src/struct_ls/pfmg_relax.c000066400000000000000000000221111477326011500200320ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "_hypre_struct_ls.h" /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ typedef struct { void *relax_data; void *rb_relax_data; HYPRE_Int relax_type; HYPRE_Real jacobi_weight; } hypre_PFMGRelaxData; /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ void * hypre_PFMGRelaxCreate( MPI_Comm comm ) { hypre_PFMGRelaxData *pfmg_relax_data; pfmg_relax_data = hypre_CTAlloc(hypre_PFMGRelaxData, 1, HYPRE_MEMORY_HOST); (pfmg_relax_data -> relax_data) = hypre_PointRelaxCreate(comm); (pfmg_relax_data -> rb_relax_data) = hypre_RedBlackGSCreate(comm); (pfmg_relax_data -> relax_type) = 0; /* Weighted Jacobi */ (pfmg_relax_data -> jacobi_weight) = 0.0; return (void *) pfmg_relax_data; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_PFMGRelaxDestroy( void *pfmg_relax_vdata ) { hypre_PFMGRelaxData *pfmg_relax_data = (hypre_PFMGRelaxData *)pfmg_relax_vdata; if (pfmg_relax_data) { hypre_PointRelaxDestroy(pfmg_relax_data -> relax_data); hypre_RedBlackGSDestroy(pfmg_relax_data -> rb_relax_data); hypre_TFree(pfmg_relax_data, HYPRE_MEMORY_HOST); } return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_PFMGRelax( void *pfmg_relax_vdata, hypre_StructMatrix *A, hypre_StructVector *b, hypre_StructVector *x ) { hypre_PFMGRelaxData *pfmg_relax_data = (hypre_PFMGRelaxData *)pfmg_relax_vdata; HYPRE_Int relax_type = (pfmg_relax_data -> relax_type); HYPRE_Int constant_coefficient = hypre_StructMatrixConstantCoefficient(A); switch (relax_type) { case 0: case 1: hypre_PointRelax((pfmg_relax_data -> relax_data), A, b, x); break; case 2: case 3: if (constant_coefficient) { hypre_RedBlackConstantCoefGS((pfmg_relax_data -> rb_relax_data), A, b, x); } else { hypre_RedBlackGS((pfmg_relax_data -> rb_relax_data), A, b, x); } break; } return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_PFMGRelaxSetup( void *pfmg_relax_vdata, hypre_StructMatrix *A, hypre_StructVector *b, hypre_StructVector *x ) { hypre_PFMGRelaxData *pfmg_relax_data = (hypre_PFMGRelaxData *)pfmg_relax_vdata; HYPRE_Int relax_type = (pfmg_relax_data -> relax_type); HYPRE_Real jacobi_weight = (pfmg_relax_data -> jacobi_weight); switch (relax_type) { case 0: case 1: hypre_PointRelaxSetup((pfmg_relax_data -> relax_data), A, b, x); break; case 2: case 3: hypre_RedBlackGSSetup((pfmg_relax_data -> rb_relax_data), A, b, x); break; } if (relax_type == 1) { hypre_PointRelaxSetWeight(pfmg_relax_data -> relax_data, jacobi_weight); } return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_PFMGRelaxSetType( void *pfmg_relax_vdata, HYPRE_Int relax_type ) { hypre_PFMGRelaxData *pfmg_relax_data = (hypre_PFMGRelaxData *)pfmg_relax_vdata; void *relax_data = (pfmg_relax_data -> relax_data); (pfmg_relax_data -> relax_type) = relax_type; switch (relax_type) { case 0: /* Jacobi */ { hypre_Index stride; hypre_Index indices[1]; hypre_PointRelaxSetWeight(relax_data, 1.0); hypre_PointRelaxSetNumPointsets(relax_data, 1); hypre_SetIndex3(stride, 1, 1, 1); hypre_SetIndex3(indices[0], 0, 0, 0); hypre_PointRelaxSetPointset(relax_data, 0, 1, stride, indices); } break; case 2: /* Red-Black Gauss-Seidel */ case 3: /* Red-Black Gauss-Seidel (non-symmetric) */ break; } return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_PFMGRelaxSetJacobiWeight(void *pfmg_relax_vdata, HYPRE_Real weight) { hypre_PFMGRelaxData *pfmg_relax_data = (hypre_PFMGRelaxData *)pfmg_relax_vdata; (pfmg_relax_data -> jacobi_weight) = weight; return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_PFMGRelaxSetPreRelax( void *pfmg_relax_vdata ) { hypre_PFMGRelaxData *pfmg_relax_data = (hypre_PFMGRelaxData *)pfmg_relax_vdata; HYPRE_Int relax_type = (pfmg_relax_data -> relax_type); switch (relax_type) { case 1: /* Weighted Jacobi */ case 0: /* Jacobi */ break; case 2: /* Red-Black Gauss-Seidel */ hypre_RedBlackGSSetStartRed((pfmg_relax_data -> rb_relax_data)); break; case 3: /* Red-Black Gauss-Seidel (non-symmetric) */ hypre_RedBlackGSSetStartRed((pfmg_relax_data -> rb_relax_data)); break; } return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_PFMGRelaxSetPostRelax( void *pfmg_relax_vdata ) { hypre_PFMGRelaxData *pfmg_relax_data = (hypre_PFMGRelaxData *)pfmg_relax_vdata; HYPRE_Int relax_type = (pfmg_relax_data -> relax_type); switch (relax_type) { case 1: /* Weighted Jacobi */ case 0: /* Jacobi */ break; case 2: /* Red-Black Gauss-Seidel */ hypre_RedBlackGSSetStartBlack((pfmg_relax_data -> rb_relax_data)); break; case 3: /* Red-Black Gauss-Seidel (non-symmetric) */ hypre_RedBlackGSSetStartRed((pfmg_relax_data -> rb_relax_data)); break; } return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_PFMGRelaxSetTol( void *pfmg_relax_vdata, HYPRE_Real tol ) { hypre_PFMGRelaxData *pfmg_relax_data = (hypre_PFMGRelaxData *)pfmg_relax_vdata; hypre_PointRelaxSetTol((pfmg_relax_data -> relax_data), tol); hypre_RedBlackGSSetTol((pfmg_relax_data -> rb_relax_data), tol); return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_PFMGRelaxSetMaxIter( void *pfmg_relax_vdata, HYPRE_Int max_iter ) { hypre_PFMGRelaxData *pfmg_relax_data = (hypre_PFMGRelaxData *)pfmg_relax_vdata; hypre_PointRelaxSetMaxIter((pfmg_relax_data -> relax_data), max_iter); hypre_RedBlackGSSetMaxIter((pfmg_relax_data -> rb_relax_data), max_iter); return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_PFMGRelaxSetZeroGuess( void *pfmg_relax_vdata, HYPRE_Int zero_guess ) { hypre_PFMGRelaxData *pfmg_relax_data = (hypre_PFMGRelaxData *)pfmg_relax_vdata; hypre_PointRelaxSetZeroGuess((pfmg_relax_data -> relax_data), zero_guess); hypre_RedBlackGSSetZeroGuess((pfmg_relax_data -> rb_relax_data), zero_guess); return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_PFMGRelaxSetTempVec( void *pfmg_relax_vdata, hypre_StructVector *t ) { hypre_PFMGRelaxData *pfmg_relax_data = (hypre_PFMGRelaxData *)pfmg_relax_vdata; hypre_PointRelaxSetTempVec((pfmg_relax_data -> relax_data), t); return hypre_error_flag; } hypre-2.33.0/src/struct_ls/pfmg_setup.c000066400000000000000000002310601477326011500200640ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "_hypre_struct_ls.h" #include "_hypre_struct_mv.hpp" #include "pfmg.h" #include #define DEBUG 0 #define hypre_PFMGSetCIndex(cdir, cindex) \ { \ hypre_SetIndex3(cindex, 0, 0, 0); \ hypre_IndexD(cindex, cdir) = 0; \ } #define hypre_PFMGSetFIndex(cdir, findex) \ { \ hypre_SetIndex3(findex, 0, 0, 0); \ hypre_IndexD(findex, cdir) = 1; \ } #define hypre_PFMGSetStride(cdir, stride) \ { \ hypre_SetIndex3(stride, 1, 1, 1); \ hypre_IndexD(stride, cdir) = 2; \ } #ifdef MAX_DEPTH #undef MAX_DEPTH #endif #define MAX_DEPTH 7 HYPRE_Int hypre_StructGetNonzeroDirection(hypre_Index shape) { HYPRE_Int Astenc = 0; /* x-direction */ if (hypre_IndexD(shape, 0)) { Astenc += 1; } /* y-direction */ else if (hypre_IndexD(shape, 1)) { Astenc += 10; } /* z-direction */ else if (hypre_IndexD(shape, 2)) { Astenc += 100; } return Astenc; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_PFMGSetup( void *pfmg_vdata, hypre_StructMatrix *A, hypre_StructVector *b, hypre_StructVector *x ) { hypre_PFMGData *pfmg_data = (hypre_PFMGData *) pfmg_vdata; MPI_Comm comm = (pfmg_data -> comm); HYPRE_Int relax_type = (pfmg_data -> relax_type); HYPRE_Int usr_jacobi_weight = (pfmg_data -> usr_jacobi_weight); HYPRE_Real jacobi_weight = (pfmg_data -> jacobi_weight); HYPRE_Int skip_relax = (pfmg_data -> skip_relax); HYPRE_Real *dxyz = (pfmg_data -> dxyz); HYPRE_Int rap_type; HYPRE_Int max_iter; HYPRE_Int max_levels; HYPRE_Int num_levels; hypre_Index cindex; hypre_Index findex; hypre_Index stride; hypre_Index coarsen; HYPRE_Int *cdir_l; HYPRE_Int *active_l; hypre_StructGrid **grid_l; hypre_StructGrid **P_grid_l; HYPRE_Real *data; HYPRE_Real *data_const; HYPRE_Int data_size = 0; HYPRE_Int data_size_const = 0; HYPRE_Real *relax_weights; HYPRE_Real *mean, *deviation; HYPRE_Real alpha, beta; hypre_StructMatrix **A_l; hypre_StructMatrix **P_l; hypre_StructMatrix **RT_l; hypre_StructVector **b_l; hypre_StructVector **x_l; /* temp vectors */ hypre_StructVector **tx_l; hypre_StructVector **r_l; hypre_StructVector **e_l; void **relax_data_l; void **matvec_data_l; void **restrict_data_l; void **interp_data_l; hypre_StructGrid *grid; HYPRE_Int ndim; hypre_Box *cbox; HYPRE_Real min_dxyz; HYPRE_Int cdir, periodic, cmaxsize; HYPRE_Int d, l; HYPRE_Int dxyz_flag; HYPRE_Int b_num_ghost[] = {0, 0, 0, 0, 0, 0}; HYPRE_Int x_num_ghost[] = {1, 1, 1, 1, 1, 1}; #if DEBUG char filename[255]; #endif HYPRE_MemoryLocation memory_location = hypre_StructMatrixMemoryLocation(A); HYPRE_ANNOTATE_FUNC_BEGIN; /*----------------------------------------------------- * Set up coarse grids *-----------------------------------------------------*/ grid = hypre_StructMatrixGrid(A); ndim = hypre_StructGridNDim(grid); /* Compute a new max_levels value based on the grid */ cbox = hypre_BoxDuplicate(hypre_StructGridBoundingBox(grid)); max_levels = 1; for (d = 0; d < ndim; d++) { max_levels += hypre_Log2(hypre_BoxSizeD(cbox, d)) + 2; } if ((pfmg_data -> max_levels) > 0) { max_levels = hypre_min(max_levels, (pfmg_data -> max_levels)); } (pfmg_data -> max_levels) = max_levels; /* compute dxyz */ dxyz_flag = 0; if ((dxyz[0] == 0) || (dxyz[1] == 0) || (dxyz[2] == 0)) { mean = hypre_CTAlloc(HYPRE_Real, 3, HYPRE_MEMORY_HOST); deviation = hypre_CTAlloc(HYPRE_Real, 3, HYPRE_MEMORY_HOST); hypre_PFMGComputeDxyz(A, dxyz, mean, deviation); for (d = 0; d < ndim; d++) { /* Set 'dxyz_flag' if the matrix-coefficient variation is "too large". * This is used later to set relaxation weights for Jacobi. * * Use the "square of the coefficient of variation" = (sigma/mu)^2, * where sigma is the standard deviation and mu is the mean. This is * equivalent to computing (d - mu^2)/mu^2 where d is the average of * the squares of the coefficients stored in 'deviation'. Care is * taken to avoid dividing by zero when the mean is zero. */ deviation[d] -= mean[d] * mean[d]; if ( deviation[d] > 0.1 * (mean[d]*mean[d]) ) { dxyz_flag = 1; break; } } hypre_TFree(mean, HYPRE_MEMORY_HOST); hypre_TFree(deviation, HYPRE_MEMORY_HOST); } grid_l = hypre_TAlloc(hypre_StructGrid *, max_levels, HYPRE_MEMORY_HOST); hypre_StructGridRef(grid, &grid_l[0]); P_grid_l = hypre_TAlloc(hypre_StructGrid *, max_levels, HYPRE_MEMORY_HOST); P_grid_l[0] = NULL; cdir_l = hypre_TAlloc(HYPRE_Int, max_levels, HYPRE_MEMORY_HOST); active_l = hypre_TAlloc(HYPRE_Int, max_levels, HYPRE_MEMORY_HOST); relax_weights = hypre_CTAlloc(HYPRE_Real, max_levels, HYPRE_MEMORY_HOST); hypre_SetIndex3(coarsen, 1, 1, 1); /* forces relaxation on finest grid */ #if 0 //defined(HYPRE_USING_CUDA) || defined(HYPRE_USING_HIP) data_location = hypre_StructGridDataLocation(grid); if (data_location != HYPRE_MEMORY_HOST) { num_level_GPU = max_levels; } else { num_level_GPU = 0; device_level = 0; } #endif for (l = 0; ; l++) { /* determine cdir */ min_dxyz = dxyz[0] + dxyz[1] + dxyz[2] + 1; cdir = -1; alpha = 0.0; for (d = 0; d < ndim; d++) { if ((hypre_BoxIMaxD(cbox, d) > hypre_BoxIMinD(cbox, d)) && (dxyz[d] < min_dxyz)) { min_dxyz = dxyz[d]; cdir = d; } alpha += 1.0 / (dxyz[d] * dxyz[d]); } relax_weights[l] = 1.0; /* If it's possible to coarsen, change relax_weights */ beta = 0.0; if (cdir != -1) { if (dxyz_flag) { relax_weights[l] = 2.0 / 3.0; } else { for (d = 0; d < ndim; d++) { if (d != cdir) { beta += 1.0 / (dxyz[d] * dxyz[d]); } } if (beta == alpha) { alpha = 0.0; } else { alpha = beta / alpha; } /* determine level Jacobi weights */ if (ndim > 1) { relax_weights[l] = 2.0 / (3.0 - alpha); } else { relax_weights[l] = 2.0 / 3.0; /* always 2/3 for 1-d */ } } } if (cdir != -1) { /* don't coarsen if a periodic direction and not divisible by 2 */ periodic = hypre_IndexD(hypre_StructGridPeriodic(grid_l[l]), cdir); if ((periodic) && (periodic % 2)) { cdir = -1; } /* don't coarsen if we've reached max_levels */ if (l == (max_levels - 1)) { cdir = -1; } } /* stop coarsening */ if (cdir == -1) { active_l[l] = 1; /* forces relaxation on coarsest grid */ cmaxsize = 0; for (d = 0; d < ndim; d++) { cmaxsize = hypre_max(cmaxsize, hypre_BoxSizeD(cbox, d)); } break; } cdir_l[l] = cdir; if (hypre_IndexD(coarsen, cdir) != 0) { /* coarsened previously in this direction, relax level l */ active_l[l] = 1; hypre_SetIndex3(coarsen, 0, 0, 0); hypre_IndexD(coarsen, cdir) = 1; } else { active_l[l] = 0; hypre_IndexD(coarsen, cdir) = 1; } /* set cindex, findex, and stride */ hypre_PFMGSetCIndex(cdir, cindex); hypre_PFMGSetFIndex(cdir, findex); hypre_PFMGSetStride(cdir, stride); /* update dxyz and coarsen cbox*/ dxyz[cdir] *= 2; hypre_ProjectBox(cbox, cindex, stride); hypre_StructMapFineToCoarse(hypre_BoxIMin(cbox), cindex, stride, hypre_BoxIMin(cbox)); hypre_StructMapFineToCoarse(hypre_BoxIMax(cbox), cindex, stride, hypre_BoxIMax(cbox)); /* build the interpolation grid */ hypre_StructCoarsen(grid_l[l], findex, stride, 0, &P_grid_l[l + 1]); /* build the coarse grid */ hypre_StructCoarsen(grid_l[l], cindex, stride, 1, &grid_l[l + 1]); #if 0 //defined(HYPRE_USING_CUDA) || defined(HYPRE_USING_HIP) hypre_StructGridDataLocation(P_grid_l[l + 1]) = data_location; if (device_level == -1 && num_level_GPU > 0) { max_box_size = hypre_StructGridGetMaxBoxSize(grid_l[l + 1]); if (max_box_size < HYPRE_MIN_GPU_SIZE) { num_level_GPU = l + 1; data_location = HYPRE_MEMORY_HOST; device_level = num_level_GPU; //printf("num_level_GPU = %d,device_level = %d / %d\n",num_level_GPU,device_level,num_levels); } } else if (l + 1 == device_level) { num_level_GPU = l + 1; data_location = HYPRE_MEMORY_HOST; } hypre_StructGridDataLocation(grid_l[l + 1]) = data_location; #endif } num_levels = l + 1; /* free up some things */ hypre_BoxDestroy(cbox); /* set all levels active if skip_relax = 0 */ if (!skip_relax) { for (l = 0; l < num_levels; l++) { active_l[l] = 1; } } (pfmg_data -> num_levels) = num_levels; (pfmg_data -> cdir_l) = cdir_l; (pfmg_data -> grid_l) = grid_l; (pfmg_data -> P_grid_l) = P_grid_l; /*----------------------------------------------------- * Set up matrix and vector structures *-----------------------------------------------------*/ /*----------------------------------------------------- * Modify the rap_type if red-black Gauss-Seidel is * used. Red-black gs is used only in the non-Galerkin * case. *-----------------------------------------------------*/ if (relax_type == 2 || relax_type == 3) /* red-black gs */ { (pfmg_data -> rap_type) = 1; } rap_type = (pfmg_data -> rap_type); A_l = hypre_TAlloc(hypre_StructMatrix *, num_levels, HYPRE_MEMORY_HOST); P_l = hypre_TAlloc(hypre_StructMatrix *, num_levels - 1, HYPRE_MEMORY_HOST); RT_l = hypre_TAlloc(hypre_StructMatrix *, num_levels - 1, HYPRE_MEMORY_HOST); b_l = hypre_TAlloc(hypre_StructVector *, num_levels, HYPRE_MEMORY_HOST); x_l = hypre_TAlloc(hypre_StructVector *, num_levels, HYPRE_MEMORY_HOST); tx_l = hypre_TAlloc(hypre_StructVector *, num_levels, HYPRE_MEMORY_HOST); r_l = tx_l; e_l = tx_l; A_l[0] = hypre_StructMatrixRef(A); b_l[0] = hypre_StructVectorRef(b); x_l[0] = hypre_StructVectorRef(x); tx_l[0] = hypre_StructVectorCreate(comm, grid_l[0]); hypre_StructVectorSetNumGhost(tx_l[0], x_num_ghost); hypre_StructVectorInitializeShell(tx_l[0]); hypre_StructVectorSetDataSize(tx_l[0], &data_size, &data_size_const); for (l = 0; l < (num_levels - 1); l++) { cdir = cdir_l[l]; P_l[l] = hypre_PFMGCreateInterpOp(A_l[l], P_grid_l[l + 1], cdir, rap_type); hypre_StructMatrixInitializeShell(P_l[l]); data_size += hypre_StructMatrixDataSize(P_l[l]); data_size_const += hypre_StructMatrixDataConstSize(P_l[l]); if (hypre_StructMatrixSymmetric(A)) { RT_l[l] = P_l[l]; } else { RT_l[l] = P_l[l]; #if 0 /* Allow RT != P for non symmetric case */ /* NOTE: Need to create a non-pruned grid for this to work */ RT_l[l] = hypre_PFMGCreateRestrictOp(A_l[l], grid_l[l + 1], cdir); hypre_StructMatrixInitializeShell(RT_l[l]); data_size += hypre_StructMatrixDataSize(RT_l[l]); data_size_const += hypre_StructMatrixDataConstSize(RT_l[l]); #endif } A_l[l + 1] = hypre_PFMGCreateRAPOp(RT_l[l], A_l[l], P_l[l], grid_l[l + 1], cdir, rap_type); hypre_StructMatrixInitializeShell(A_l[l + 1]); data_size += hypre_StructMatrixDataSize(A_l[l + 1]); data_size_const += hypre_StructMatrixDataConstSize(A_l[l + 1]); b_l[l + 1] = hypre_StructVectorCreate(comm, grid_l[l + 1]); hypre_StructVectorSetNumGhost(b_l[l + 1], b_num_ghost); hypre_StructVectorInitializeShell(b_l[l + 1]); hypre_StructVectorSetDataSize(b_l[l + 1], &data_size, &data_size_const); x_l[l + 1] = hypre_StructVectorCreate(comm, grid_l[l + 1]); hypre_StructVectorSetNumGhost(x_l[l + 1], x_num_ghost); hypre_StructVectorInitializeShell(x_l[l + 1]); hypre_StructVectorSetDataSize(x_l[l + 1], &data_size, &data_size_const); tx_l[l + 1] = hypre_StructVectorCreate(comm, grid_l[l + 1]); hypre_StructVectorSetNumGhost(tx_l[l + 1], x_num_ghost); hypre_StructVectorInitializeShell(tx_l[l + 1]); #if 0 //defined(HYPRE_USING_CUDA) || defined(HYPRE_USING_HIP) if (l + 1 == num_level_GPU) { hypre_StructVectorSetDataSize(tx_l[l + 1], &data_size, &data_size_const); } #endif } data = hypre_CTAlloc(HYPRE_Real, data_size, memory_location); data_const = hypre_CTAlloc(HYPRE_Real, data_size_const, HYPRE_MEMORY_HOST); #if 0 //defined(HYPRE_USING_CUDA) || defined(HYPRE_USING_HIP) //hypre_printf("num_level_GPU = %d,device_level = %d / %d\n",num_level_GPU,device_level,num_levels); #endif (pfmg_data -> memory_location) = memory_location; (pfmg_data -> data) = data; (pfmg_data -> data_const) = data_const; #if 0 //defined(HYPRE_USING_CUDA) || defined(HYPRE_USING_HIP) data_location = hypre_StructGridDataLocation(grid_l[0]); if (data_location != HYPRE_MEMORY_HOST) { hypre_StructVectorInitializeData(tx_l[0], data); hypre_StructVectorAssemble(tx_l[0]); data += hypre_StructVectorDataSize(tx_l[0]); } else { hypre_StructVectorInitializeData(tx_l[0], data_const); hypre_StructVectorAssemble(tx_l[0]); data_const += hypre_StructVectorDataSize(tx_l[0]); } #else hypre_StructVectorInitializeData(tx_l[0], data); hypre_StructVectorAssemble(tx_l[0]); data += hypre_StructVectorDataSize(tx_l[0]); #endif for (l = 0; l < (num_levels - 1); l++) { hypre_StructMatrixInitializeData(P_l[l], data, data_const); data += hypre_StructMatrixDataSize(P_l[l]); data_const += hypre_StructMatrixDataConstSize(P_l[l]); #if 0 /* Allow R != PT for non symmetric case */ if (!hypre_StructMatrixSymmetric(A)) { hypre_StructMatrixInitializeData(RT_l[l], data, data_const); data += hypre_StructMatrixDataSize(RT_l[l]); data_const += hypre_StructMatrixDataConstSize(RT_l[l]); } #endif #if 0 //defined(HYPRE_USING_CUDA) || defined(HYPRE_USING_HIP) if (l + 1 == num_level_GPU) { data_location = HYPRE_MEMORY_HOST; } #endif hypre_StructMatrixInitializeData(A_l[l + 1], data, data_const); data += hypre_StructMatrixDataSize(A_l[l + 1]); data_const += hypre_StructMatrixDataConstSize(A_l[l + 1]); #if 0 //defined(HYPRE_USING_CUDA) || defined(HYPRE_USING_HIP) if (data_location != HYPRE_MEMORY_HOST) { hypre_StructVectorInitializeData(b_l[l + 1], data); hypre_StructVectorAssemble(b_l[l + 1]); data += hypre_StructVectorDataSize(b_l[l + 1]); hypre_StructVectorInitializeData(x_l[l + 1], data); hypre_StructVectorAssemble(x_l[l + 1]); data += hypre_StructVectorDataSize(x_l[l + 1]); hypre_StructVectorInitializeData(tx_l[l + 1], hypre_StructVectorData(tx_l[0])); hypre_StructVectorAssemble(tx_l[l + 1]); } else { hypre_StructVectorInitializeData(b_l[l + 1], data_const); hypre_StructVectorAssemble(b_l[l + 1]); data_const += hypre_StructVectorDataSize(b_l[l + 1]); hypre_StructVectorInitializeData(x_l[l + 1], data_const); hypre_StructVectorAssemble(x_l[l + 1]); data_const += hypre_StructVectorDataSize(x_l[l + 1]); if (l + 1 == num_level_GPU) { hypre_StructVectorInitializeData(tx_l[l + 1], data_const); hypre_StructVectorAssemble(tx_l[l + 1]); data_const += hypre_StructVectorDataSize(tx_l[l + 1]); } hypre_StructVectorInitializeData(tx_l[l + 1], hypre_StructVectorData(tx_l[num_level_GPU])); hypre_StructVectorAssemble(tx_l[l + 1]); } #else hypre_StructVectorInitializeData(b_l[l + 1], data); hypre_StructVectorAssemble(b_l[l + 1]); data += hypre_StructVectorDataSize(b_l[l + 1]); hypre_StructVectorInitializeData(x_l[l + 1], data); hypre_StructVectorAssemble(x_l[l + 1]); data += hypre_StructVectorDataSize(x_l[l + 1]); hypre_StructVectorInitializeData(tx_l[l + 1], hypre_StructVectorData(tx_l[0])); hypre_StructVectorAssemble(tx_l[l + 1]); #endif } (pfmg_data -> A_l) = A_l; (pfmg_data -> P_l) = P_l; (pfmg_data -> RT_l) = RT_l; (pfmg_data -> b_l) = b_l; (pfmg_data -> x_l) = x_l; (pfmg_data -> tx_l) = tx_l; (pfmg_data -> r_l) = r_l; (pfmg_data -> e_l) = e_l; /*----------------------------------------------------- * Set up multigrid operators and call setup routines *-----------------------------------------------------*/ relax_data_l = hypre_TAlloc(void *, num_levels, HYPRE_MEMORY_HOST); matvec_data_l = hypre_TAlloc(void *, num_levels, HYPRE_MEMORY_HOST); restrict_data_l = hypre_TAlloc(void *, num_levels, HYPRE_MEMORY_HOST); interp_data_l = hypre_TAlloc(void *, num_levels, HYPRE_MEMORY_HOST); for (l = 0; l < (num_levels - 1); l++) { HYPRE_ANNOTATE_MGLEVEL_BEGIN(l); #if 0 //defined(HYPRE_USING_CUDA) || defined(HYPRE_USING_HIP) if (l == num_level_GPU) { hypre_SetDeviceOff(); } #endif cdir = cdir_l[l]; hypre_PFMGSetCIndex(cdir, cindex); hypre_PFMGSetFIndex(cdir, findex); hypre_PFMGSetStride(cdir, stride); /* set up interpolation operator */ hypre_PFMGSetupInterpOp(A_l[l], cdir, findex, stride, P_l[l], rap_type); /* set up the restriction operator */ #if 0 /* Allow R != PT for non symmetric case */ if (!hypre_StructMatrixSymmetric(A)) hypre_PFMGSetupRestrictOp(A_l[l], tx_l[l], cdir, cindex, stride, RT_l[l]); #endif /* set up the coarse grid operator */ hypre_PFMGSetupRAPOp(RT_l[l], A_l[l], P_l[l], cdir, cindex, stride, rap_type, A_l[l + 1]); /* set up the interpolation routine */ interp_data_l[l] = hypre_SemiInterpCreate(); hypre_SemiInterpSetup(interp_data_l[l], P_l[l], 0, x_l[l + 1], e_l[l], cindex, findex, stride); /* set up the restriction routine */ restrict_data_l[l] = hypre_SemiRestrictCreate(); hypre_SemiRestrictSetup(restrict_data_l[l], RT_l[l], 1, r_l[l], b_l[l + 1], cindex, findex, stride); HYPRE_ANNOTATE_MGLEVEL_END(l); } #if 0 //defined(HYPRE_USING_CUDA) || defined(HYPRE_USING_HIP) if (l == num_level_GPU) { hypre_SetDeviceOff(); } #endif /*----------------------------------------------------- * Check for zero diagonal on coarsest grid, occurs with * singular problems like full Neumann or full periodic. * Note that a processor with zero diagonal will set * active_l =0, other processors will not. This is OK * as we only want to avoid the division by zero on the * one processor which owns the single coarse grid * point. *-----------------------------------------------------*/ if ( hypre_ZeroDiagonal(A_l[l])) { active_l[l] = 0; } #if 0 //defined(HYPRE_USING_CUDA) || defined(HYPRE_USING_HIP) if (hypre_StructGridDataLocation(grid) != HYPRE_MEMORY_HOST) { hypre_SetDeviceOn(); } #endif /* set up fine grid relaxation */ relax_data_l[0] = hypre_PFMGRelaxCreate(comm); hypre_PFMGRelaxSetTol(relax_data_l[0], 0.0); if (usr_jacobi_weight) { hypre_PFMGRelaxSetJacobiWeight(relax_data_l[0], jacobi_weight); } else { hypre_PFMGRelaxSetJacobiWeight(relax_data_l[0], relax_weights[0]); } hypre_PFMGRelaxSetType(relax_data_l[0], relax_type); hypre_PFMGRelaxSetTempVec(relax_data_l[0], tx_l[0]); hypre_PFMGRelaxSetup(relax_data_l[0], A_l[0], b_l[0], x_l[0]); if (num_levels > 1) { for (l = 1; l < num_levels; l++) { /* set relaxation parameters */ if (active_l[l]) { relax_data_l[l] = hypre_PFMGRelaxCreate(comm); hypre_PFMGRelaxSetTol(relax_data_l[l], 0.0); if (usr_jacobi_weight) { hypre_PFMGRelaxSetJacobiWeight(relax_data_l[l], jacobi_weight); } else { hypre_PFMGRelaxSetJacobiWeight(relax_data_l[l], relax_weights[l]); } hypre_PFMGRelaxSetType(relax_data_l[l], relax_type); hypre_PFMGRelaxSetTempVec(relax_data_l[l], tx_l[l]); } } /* change coarsest grid relaxation parameters */ l = num_levels - 1; if (active_l[l]) { HYPRE_Int maxwork, maxiter; hypre_PFMGRelaxSetType(relax_data_l[l], 0); /* do no more work on the coarsest grid than the cost of a V-cycle * (estimating roughly 4 communications per V-cycle level) */ maxwork = 4 * num_levels; /* do sweeps proportional to the coarsest grid size */ maxiter = hypre_min(maxwork, cmaxsize); #if 0 hypre_printf("maxwork = %d, cmaxsize = %d, maxiter = %d\n", maxwork, cmaxsize, maxiter); #endif hypre_PFMGRelaxSetMaxIter(relax_data_l[l], maxiter); } /* call relax setup */ for (l = 1; l < num_levels; l++) { if (active_l[l]) { hypre_PFMGRelaxSetup(relax_data_l[l], A_l[l], b_l[l], x_l[l]); } } } hypre_TFree(relax_weights, HYPRE_MEMORY_HOST); for (l = 0; l < num_levels; l++) { /* set up the residual routine */ matvec_data_l[l] = hypre_StructMatvecCreate(); hypre_StructMatvecSetup(matvec_data_l[l], A_l[l], x_l[l]); } (pfmg_data -> active_l) = active_l; (pfmg_data -> relax_data_l) = relax_data_l; (pfmg_data -> matvec_data_l) = matvec_data_l; (pfmg_data -> restrict_data_l) = restrict_data_l; (pfmg_data -> interp_data_l) = interp_data_l; /*----------------------------------------------------- * Allocate space for log info *-----------------------------------------------------*/ if ((pfmg_data -> logging) > 0) { max_iter = (pfmg_data -> max_iter); (pfmg_data -> norms) = hypre_TAlloc(HYPRE_Real, max_iter, HYPRE_MEMORY_HOST); (pfmg_data -> rel_norms) = hypre_TAlloc(HYPRE_Real, max_iter, HYPRE_MEMORY_HOST); } #if DEBUG for (l = 0; l < (num_levels - 1); l++) { hypre_sprintf(filename, "zout_A.%02d", l); hypre_StructMatrixPrint(filename, A_l[l], 0); hypre_sprintf(filename, "zout_P.%02d", l); hypre_StructMatrixPrint(filename, P_l[l], 0); } hypre_sprintf(filename, "zout_A.%02d", l); hypre_StructMatrixPrint(filename, A_l[l], 0); #endif HYPRE_ANNOTATE_FUNC_END; return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_PFMGComputeDxyz( hypre_StructMatrix *A, HYPRE_Real *dxyz, HYPRE_Real *mean, HYPRE_Real *deviation) { hypre_BoxArray *compute_boxes; HYPRE_Real cxyz[3], sqcxyz[3], tcxyz[3]; HYPRE_Real cxyz_max; HYPRE_Int tot_size; hypre_StructStencil *stencil; //hypre_Index *stencil_shape; HYPRE_Int stencil_size; HYPRE_Int constant_coefficient; HYPRE_Int i, d; /*---------------------------------------------------------- * Initialize some things *----------------------------------------------------------*/ stencil = hypre_StructMatrixStencil(A); //stencil_shape = hypre_StructStencilShape(stencil); stencil_size = hypre_StructStencilSize(stencil); /*---------------------------------------------------------- * Compute cxyz (use arithmetic mean) *----------------------------------------------------------*/ cxyz[0] = cxyz[1] = cxyz[2] = 0.0; sqcxyz[0] = sqcxyz[1] = sqcxyz[2] = 0.0; constant_coefficient = hypre_StructMatrixConstantCoefficient(A); compute_boxes = hypre_StructGridBoxes(hypre_StructMatrixGrid(A)); tot_size = hypre_StructGridGlobalSize(hypre_StructMatrixGrid(A)); hypre_ForBoxI(i, compute_boxes) { /* all coefficients constant or variable diagonal */ if ( constant_coefficient ) { hypre_PFMGComputeDxyz_CS(i, A, cxyz, sqcxyz); } /* constant_coefficient==0, all coefficients vary with space */ else { switch (stencil_size) { case 5: hypre_PFMGComputeDxyz_SS5 (i, A, cxyz, sqcxyz); break; case 9: hypre_PFMGComputeDxyz_SS9 (i, A, cxyz, sqcxyz); break; case 7: hypre_PFMGComputeDxyz_SS7 (i, A, cxyz, sqcxyz); break; case 19: hypre_PFMGComputeDxyz_SS19(i, A, cxyz, sqcxyz); break; case 27: hypre_PFMGComputeDxyz_SS27(i, A, cxyz, sqcxyz); break; default: hypre_printf("hypre error: unsupported stencil size %d\n", stencil_size); hypre_MPI_Abort(hypre_MPI_COMM_WORLD, 1); } } } /*---------------------------------------------------------- * Compute dxyz *----------------------------------------------------------*/ /* all coefficients constant or variable diagonal */ if ( constant_coefficient ) { for (d = 0; d < 3; d++) { mean[d] = cxyz[d]; deviation[d] = sqcxyz[d]; } } /* constant_coefficient==0, all coefficients vary with space */ else { tcxyz[0] = cxyz[0]; tcxyz[1] = cxyz[1]; tcxyz[2] = cxyz[2]; hypre_MPI_Allreduce(tcxyz, cxyz, 3, HYPRE_MPI_REAL, hypre_MPI_SUM, hypre_StructMatrixComm(A)); tcxyz[0] = sqcxyz[0]; tcxyz[1] = sqcxyz[1]; tcxyz[2] = sqcxyz[2]; hypre_MPI_Allreduce(tcxyz, sqcxyz, 3, HYPRE_MPI_REAL, hypre_MPI_SUM, hypre_StructMatrixComm(A)); for (d = 0; d < 3; d++) { mean[d] = cxyz[d] / tot_size; deviation[d] = sqcxyz[d] / tot_size; } } cxyz_max = 0.0; for (d = 0; d < 3; d++) { cxyz_max = hypre_max(cxyz_max, cxyz[d]); } if (cxyz_max == 0.0) { /* Do isotropic coarsening */ for (d = 0; d < 3; d++) { cxyz[d] = 1.0; } cxyz_max = 1.0; } /* Set dxyz values that are scaled appropriately for the coarsening routine */ for (d = 0; d < 3; d++) { HYPRE_Real max_anisotropy = HYPRE_REAL_MAX / 1000; if (cxyz[d] > (cxyz_max / max_anisotropy)) { cxyz[d] /= cxyz_max; dxyz[d] = hypre_sqrt(1.0 / cxyz[d]); } else { dxyz[d] = hypre_sqrt(max_anisotropy); } } return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_PFMGComputeDxyz_CS( HYPRE_Int i, hypre_StructMatrix *A, HYPRE_Real *cxyz, HYPRE_Real *sqcxyz) { hypre_StructStencil *stencil; hypre_Index *stencil_shape; HYPRE_Int stencil_size; HYPRE_Int Ai; HYPRE_Real *Ap; HYPRE_Int constant_coefficient; HYPRE_Real tcx, tcy, tcz; HYPRE_Real Adiag = 0, diag; HYPRE_Int Astenc, sdiag = 0; HYPRE_Int si; HYPRE_MemoryLocation memory_location = hypre_StructMatrixMemoryLocation(A); stencil = hypre_StructMatrixStencil(A); stencil_shape = hypre_StructStencilShape(stencil); stencil_size = hypre_StructStencilSize(stencil); Ai = hypre_CCBoxIndexRank( A_dbox, start ); constant_coefficient = hypre_StructMatrixConstantCoefficient(A); /* find diagonal stencil entry */ for (si = 0; si < stencil_size; si++) { if ((hypre_IndexD(stencil_shape[si], 0) == 0) && (hypre_IndexD(stencil_shape[si], 1) == 0) && (hypre_IndexD(stencil_shape[si], 2) == 0)) { sdiag = si; break; } } tcx = cxyz[0]; tcy = cxyz[1]; tcz = cxyz[2]; /* get sign of diagonal */ Ap = hypre_StructMatrixBoxData(A, i, sdiag); if (constant_coefficient == 1) { Adiag = Ap[Ai]; } else if (constant_coefficient == 2) { hypre_TMemcpy(&Adiag, &Ap[Ai], HYPRE_Real, 1, HYPRE_MEMORY_HOST, memory_location); } diag = 1.0; if (Adiag < 0) { diag = -1.0; } for (si = 0; si < stencil_size; si++) { Ap = hypre_StructMatrixBoxData(A, i, si); /* x-direction */ Astenc = hypre_IndexD(stencil_shape[si], 0); if (Astenc) { tcx -= Ap[Ai] * diag; } /* y-direction */ Astenc = hypre_IndexD(stencil_shape[si], 1); if (Astenc) { tcy -= Ap[Ai] * diag; } /* z-direction */ Astenc = hypre_IndexD(stencil_shape[si], 2); if (Astenc) { tcz -= Ap[Ai] * diag; } } cxyz[0] += tcx; cxyz[1] += tcy; cxyz[2] += tcz; sqcxyz[0] += tcx * tcx; sqcxyz[1] += tcy * tcy; sqcxyz[2] += tcz * tcz; return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_PFMGComputeDxyz_SS5( HYPRE_Int bi, hypre_StructMatrix *A, HYPRE_Real *cxyz, HYPRE_Real *sqcxyz) { hypre_BoxArray *compute_boxes; hypre_Box *compute_box; hypre_Box *A_dbox; hypre_Index loop_size; hypre_IndexRef start; hypre_Index stride; hypre_Index index; HYPRE_Real *a_cc, *a_cw, *a_ce, *a_cs, *a_cn; #if 0 //defined(HYPRE_USING_CUDA) || defined(HYPRE_USING_HIP) HYPRE_Int data_location = hypre_StructGridDataLocation( hypre_StructMatrixGrid(A) ); #endif hypre_SetIndex3(stride, 1, 1, 1); compute_boxes = hypre_StructGridBoxes(hypre_StructMatrixGrid(A)); compute_box = hypre_BoxArrayBox(compute_boxes, bi); A_dbox = hypre_BoxArrayBox(hypre_StructMatrixDataSpace(A), bi); start = hypre_BoxIMin(compute_box); hypre_BoxGetStrideSize(compute_box, stride, loop_size); /*----------------------------------------------------------------- * Extract pointers for 5-point fine grid operator: * * a_cc is pointer for center coefficient (diag) * a_cw is pointer for west coefficient * a_ce is pointer for east coefficient * a_cs is pointer for south coefficient * a_cn is pointer for north coefficient *-----------------------------------------------------------------*/ hypre_SetIndex3(index, 0, 0, 0); a_cc = hypre_StructMatrixExtractPointerByIndex(A, bi, index); hypre_SetIndex3(index, -1, 0, 0); a_cw = hypre_StructMatrixExtractPointerByIndex(A, bi, index); hypre_SetIndex3(index, 1, 0, 0); a_ce = hypre_StructMatrixExtractPointerByIndex(A, bi, index); hypre_SetIndex3(index, 0, -1, 0); a_cs = hypre_StructMatrixExtractPointerByIndex(A, bi, index); hypre_SetIndex3(index, 0, 1, 0); a_cn = hypre_StructMatrixExtractPointerByIndex(A, bi, index); // FIXME TODO HOW TO DO KOKKOS (WM: and SYCL) IN ONE BOXLOOP ? #if defined(HYPRE_USING_KOKKOS) || defined(HYPRE_USING_SYCL) HYPRE_Real cxb = cxyz[0]; hypre_BoxLoop1ReductionBegin(hypre_StructMatrixNDim(A), loop_size, A_dbox, start, stride, Ai, cxb) { HYPRE_Real diag = a_cc[Ai] < 0.0 ? -1.0 : 1.0; HYPRE_Real tcx = -diag * (a_cw[Ai] + a_ce[Ai]); cxb += tcx; } hypre_BoxLoop1ReductionEnd(Ai, cxb) HYPRE_Real cyb = cxyz[1]; hypre_BoxLoop1ReductionBegin(hypre_StructMatrixNDim(A), loop_size, A_dbox, start, stride, Ai, cyb) { HYPRE_Real diag = a_cc[Ai] < 0.0 ? -1.0 : 1.0; HYPRE_Real tcy = -diag * (a_cn[Ai] + a_cs[Ai]); cyb += tcy; } hypre_BoxLoop1ReductionEnd(Ai, cyb) HYPRE_Real sqcxb = sqcxyz[0]; hypre_BoxLoop1ReductionBegin(hypre_StructMatrixNDim(A), loop_size, A_dbox, start, stride, Ai, sqcxb) { HYPRE_Real diag = a_cc[Ai] < 0.0 ? -1.0 : 1.0; HYPRE_Real tcx = -diag * (a_cw[Ai] + a_ce[Ai]); sqcxb += tcx * tcx; } hypre_BoxLoop1ReductionEnd(Ai, sqcxb) HYPRE_Real sqcyb = sqcxyz[1]; hypre_BoxLoop1ReductionBegin(hypre_StructMatrixNDim(A), loop_size, A_dbox, start, stride, Ai, sqcyb) { HYPRE_Real diag = a_cc[Ai] < 0.0 ? -1.0 : 1.0; HYPRE_Real tcy = -diag * (a_cn[Ai] + a_cs[Ai]); sqcyb += tcy * tcy; } hypre_BoxLoop1ReductionEnd(Ai, sqcyb) #else // #if defined(HYPRE_USING_KOKKOS) || defined(HYPRE_USING_SYCL) #if defined(HYPRE_USING_RAJA) ReduceSum cxb(cxyz[0]), cyb(cxyz[1]), sqcxb(sqcxyz[0]), sqcyb(sqcxyz[1]); #elif defined(HYPRE_USING_CUDA) || defined(HYPRE_USING_HIP) HYPRE_double4 d4(cxyz[0], cxyz[1], sqcxyz[0], sqcxyz[1]); ReduceSum sum4(d4); #else HYPRE_Real cxb, cyb, sqcxb, sqcyb; cxb = cxyz[0]; cyb = cxyz[1]; sqcxb = sqcxyz[0]; sqcyb = sqcxyz[1]; #endif #ifdef HYPRE_BOX_REDUCTION #undef HYPRE_BOX_REDUCTION #endif #ifdef HYPRE_USING_DEVICE_OPENMP #define HYPRE_BOX_REDUCTION map(tofrom:cxb,cyb,sqcxb,sqcyb) reduction(+:cxb,cyb,sqcxb,sqcyb) #else #define HYPRE_BOX_REDUCTION reduction(+:cxb,cyb,sqcxb,sqcyb) #endif #define DEVICE_VAR is_device_ptr(a_cc,a_cw,a_ce,a_cn,a_cs) hypre_BoxLoop1ReductionBegin(hypre_StructMatrixNDim(A), loop_size, A_dbox, start, stride, Ai, sum4); { HYPRE_Real tcx, tcy; HYPRE_Real diag = a_cc[Ai] < 0.0 ? -1.0 : 1.0; tcx = -diag * (a_cw[Ai] + a_ce[Ai]); tcy = -diag * (a_cn[Ai] + a_cs[Ai]); #if !defined(HYPRE_USING_RAJA) && (defined(HYPRE_USING_CUDA) || defined(HYPRE_USING_HIP)) HYPRE_double4 tmp(tcx, tcy, tcx * tcx, tcy * tcy); sum4 += tmp; #else cxb += tcx; cyb += tcy; sqcxb += tcx * tcx; sqcyb += tcy * tcy; #endif } hypre_BoxLoop1ReductionEnd(Ai, sum4) #undef DEVICE_VAR #endif /* kokkos */ #if !defined(HYPRE_USING_RAJA) && !defined(HYPRE_USING_KOKKOS) && (defined(HYPRE_USING_CUDA) || defined(HYPRE_USING_HIP)) HYPRE_double4 tmp = (HYPRE_double4) sum4; cxyz[0] = tmp.x; cxyz[1] = tmp.y; sqcxyz[0] = tmp.z; sqcxyz[1] = tmp.w; //printf("1: %e %e %e %e\n", cxyz[0], cxyz[1], sqcxyz[0], sqcxyz[1]); #else cxyz[0] = (HYPRE_Real) cxb; cxyz[1] = (HYPRE_Real) cyb; sqcxyz[0] = (HYPRE_Real) sqcxb; sqcxyz[1] = (HYPRE_Real) sqcyb; #endif cxyz[2] = 0; sqcxyz[2] = 0; return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_PFMGComputeDxyz_SS9( HYPRE_Int bi, hypre_StructMatrix *A, HYPRE_Real *cxyz, HYPRE_Real *sqcxyz) { hypre_BoxArray *compute_boxes; hypre_Box *compute_box; hypre_Box *A_dbox; hypre_Index loop_size; hypre_IndexRef start; hypre_Index stride; hypre_Index index; HYPRE_Real *a_cc, *a_cw, *a_ce, *a_cs, *a_cn; HYPRE_Real *a_csw, *a_cse, *a_cne, *a_cnw; #if 0 //defined(HYPRE_USING_CUDA) || defined(HYPRE_USING_HIP) HYPRE_Int data_location = hypre_StructGridDataLocation( hypre_StructMatrixGrid(A) ); #endif hypre_SetIndex3(stride, 1, 1, 1); compute_boxes = hypre_StructGridBoxes(hypre_StructMatrixGrid(A)); compute_box = hypre_BoxArrayBox(compute_boxes, bi); A_dbox = hypre_BoxArrayBox(hypre_StructMatrixDataSpace(A), bi); start = hypre_BoxIMin(compute_box); hypre_BoxGetStrideSize(compute_box, stride, loop_size); /*----------------------------------------------------------------- * Extract pointers for 5-point grid operator: * * a_cc is pointer for center coefficient * a_cw is pointer for west coefficient * a_ce is pointer for east coefficient * a_cs is pointer for south coefficient * a_cn is pointer for north coefficient *-----------------------------------------------------------------*/ hypre_SetIndex3(index, 0, 0, 0); a_cc = hypre_StructMatrixExtractPointerByIndex(A, bi, index); hypre_SetIndex3(index, -1, 0, 0); a_cw = hypre_StructMatrixExtractPointerByIndex(A, bi, index); hypre_SetIndex3(index, 1, 0, 0); a_ce = hypre_StructMatrixExtractPointerByIndex(A, bi, index); hypre_SetIndex3(index, 0, -1, 0); a_cs = hypre_StructMatrixExtractPointerByIndex(A, bi, index); hypre_SetIndex3(index, 0, 1, 0); a_cn = hypre_StructMatrixExtractPointerByIndex(A, bi, index); /*----------------------------------------------------------------- * Extract additional pointers for 9-point grid operator: * * a_csw is pointer for southwest coefficient * a_cse is pointer for southeast coefficient * a_cnw is pointer for northwest coefficient * a_cne is pointer for northeast coefficient *-----------------------------------------------------------------*/ hypre_SetIndex3(index, -1, -1, 0); a_csw = hypre_StructMatrixExtractPointerByIndex(A, bi, index); hypre_SetIndex3(index, 1, -1, 0); a_cse = hypre_StructMatrixExtractPointerByIndex(A, bi, index); hypre_SetIndex3(index, -1, 1, 0); a_cnw = hypre_StructMatrixExtractPointerByIndex(A, bi, index); hypre_SetIndex3(index, 1, 1, 0); a_cne = hypre_StructMatrixExtractPointerByIndex(A, bi, index); // FIXME TODO HOW TO DO KOKKOS IN ONE BOXLOOP ? #if defined(HYPRE_USING_KOKKOS) || defined(HYPRE_USING_SYCL) HYPRE_Real cxb = cxyz[0]; hypre_BoxLoop1ReductionBegin(hypre_StructMatrixNDim(A), loop_size, A_dbox, start, stride, Ai, cxb) { HYPRE_Real diag = a_cc[Ai] < 0.0 ? -1.0 : 1.0; HYPRE_Real tcx = -diag * (a_cw[Ai] + a_ce[Ai] + a_csw[Ai] + a_cse[Ai] + a_cnw[Ai] + a_cne[Ai]); cxb += tcx; } hypre_BoxLoop1ReductionEnd(Ai, cxb) HYPRE_Real cyb = cxyz[1]; hypre_BoxLoop1ReductionBegin(hypre_StructMatrixNDim(A), loop_size, A_dbox, start, stride, Ai, cyb) { HYPRE_Real diag = a_cc[Ai] < 0.0 ? -1.0 : 1.0; HYPRE_Real tcy = -diag * (a_cs[Ai] + a_cn[Ai] + a_csw[Ai] + a_cse[Ai] + a_cnw[Ai] + a_cne[Ai]); cyb += tcy; } hypre_BoxLoop1ReductionEnd(Ai, cyb) HYPRE_Real sqcxb = sqcxyz[0]; hypre_BoxLoop1ReductionBegin(hypre_StructMatrixNDim(A), loop_size, A_dbox, start, stride, Ai, sqcxb) { HYPRE_Real diag = a_cc[Ai] < 0.0 ? -1.0 : 1.0; HYPRE_Real tcx = -diag * (a_cw[Ai] + a_ce[Ai] + a_csw[Ai] + a_cse[Ai] + a_cnw[Ai] + a_cne[Ai]); sqcxb += tcx * tcx; } hypre_BoxLoop1ReductionEnd(Ai, sqcxb) HYPRE_Real sqcyb = sqcxyz[1]; hypre_BoxLoop1ReductionBegin(hypre_StructMatrixNDim(A), loop_size, A_dbox, start, stride, Ai, sqcyb) { HYPRE_Real diag = a_cc[Ai] < 0.0 ? -1.0 : 1.0; HYPRE_Real tcy = -diag * (a_cs[Ai] + a_cn[Ai] + a_csw[Ai] + a_cse[Ai] + a_cnw[Ai] + a_cne[Ai]); sqcyb += tcy * tcy; } hypre_BoxLoop1ReductionEnd(Ai, sqcyb) #else /* kokkos */ #if defined(HYPRE_USING_RAJA) ReduceSum cxb(cxyz[0]), cyb(cxyz[1]), sqcxb(sqcxyz[0]), sqcyb(sqcxyz[1]); #elif defined(HYPRE_USING_CUDA) || defined(HYPRE_USING_HIP) HYPRE_double4 d4(cxyz[0], cxyz[1], sqcxyz[0], sqcxyz[1]); ReduceSum sum4(d4); #else HYPRE_Real cxb, cyb, sqcxb, sqcyb; cxb = cxyz[0]; cyb = cxyz[1]; sqcxb = sqcxyz[0]; sqcyb = sqcxyz[1]; #ifdef HYPRE_BOX_REDUCTION #undef HYPRE_BOX_REDUCTION #endif #ifdef HYPRE_USING_DEVICE_OPENMP #define HYPRE_BOX_REDUCTION map(tofrom:cxb,cyb,sqcxb,sqcyb) reduction(+:cxb,cyb,sqcxb,sqcyb) #else #define HYPRE_BOX_REDUCTION reduction(+:cxb,cyb,sqcxb,sqcyb) #endif #endif #define DEVICE_VAR is_device_ptr(a_cc,a_cw,a_ce,a_csw,a_cse,a_cnw,a_cne,a_cs,a_cn) hypre_BoxLoop1ReductionBegin(hypre_StructMatrixNDim(A), loop_size, A_dbox, start, stride, Ai, sum4) { HYPRE_Real tcx, tcy; HYPRE_Real diag = a_cc[Ai] < 0.0 ? -1.0 : 1.0; tcx = -diag * (a_cw[Ai] + a_ce[Ai] + a_csw[Ai] + a_cse[Ai] + a_cnw[Ai] + a_cne[Ai]); tcy = -diag * (a_cs[Ai] + a_cn[Ai] + a_csw[Ai] + a_cse[Ai] + a_cnw[Ai] + a_cne[Ai]); #if !defined(HYPRE_USING_RAJA) && (defined(HYPRE_USING_CUDA) || defined(HYPRE_USING_HIP)) HYPRE_double4 tmp(tcx, tcy, tcx * tcx, tcy * tcy); sum4 += tmp; #else cxb += tcx; cyb += tcy; sqcxb += tcx * tcx; sqcyb += tcy * tcy; #endif } hypre_BoxLoop1ReductionEnd(Ai, sum4) #undef DEVICE_VAR #endif /* kokkos */ #if !defined(HYPRE_USING_RAJA) && !defined(HYPRE_USING_KOKKOS) && (defined(HYPRE_USING_CUDA) || defined(HYPRE_USING_HIP)) HYPRE_double4 tmp = (HYPRE_double4) sum4; cxyz[0] = tmp.x; cxyz[1] = tmp.y; sqcxyz[0] = tmp.z; sqcxyz[1] = tmp.w; #else cxyz[0] = (HYPRE_Real) cxb; cxyz[1] = (HYPRE_Real) cyb; sqcxyz[0] = (HYPRE_Real) sqcxb; sqcxyz[1] = (HYPRE_Real) sqcyb; #endif cxyz[2] = 0; sqcxyz[2] = 0; return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_PFMGComputeDxyz_SS7( HYPRE_Int bi, hypre_StructMatrix *A, HYPRE_Real *cxyz, HYPRE_Real *sqcxyz) { hypre_BoxArray *compute_boxes; hypre_Box *compute_box; hypre_Box *A_dbox; hypre_Index loop_size; hypre_IndexRef start; hypre_Index stride; hypre_Index index; HYPRE_Real *a_cc, *a_cw, *a_ce, *a_cs, *a_cn, *a_ac, *a_bc; #if 0 //defined(HYPRE_USING_CUDA) || defined(HYPRE_USING_HIP) HYPRE_Int data_location = hypre_StructGridDataLocation( hypre_StructMatrixGrid(A) ); #endif hypre_SetIndex3(stride, 1, 1, 1); compute_boxes = hypre_StructGridBoxes(hypre_StructMatrixGrid(A)); compute_box = hypre_BoxArrayBox(compute_boxes, bi); A_dbox = hypre_BoxArrayBox(hypre_StructMatrixDataSpace(A), bi); start = hypre_BoxIMin(compute_box); hypre_BoxGetStrideSize(compute_box, stride, loop_size); /*----------------------------------------------------------------- * Extract pointers for 7-point grid operator: * * a_cc is pointer for center coefficient * a_cw is pointer for west coefficient in same plane * a_ce is pointer for east coefficient in same plane * a_cs is pointer for south coefficient in same plane * a_cn is pointer for north coefficient in same plane * a_ac is pointer for center coefficient in plane above * a_bc is pointer for center coefficient in plane below *-----------------------------------------------------------------*/ hypre_SetIndex3(index, 0, 0, 0); a_cc = hypre_StructMatrixExtractPointerByIndex(A, bi, index); hypre_SetIndex3(index, -1, 0, 0); a_cw = hypre_StructMatrixExtractPointerByIndex(A, bi, index); hypre_SetIndex3(index, 1, 0, 0); a_ce = hypre_StructMatrixExtractPointerByIndex(A, bi, index); hypre_SetIndex3(index, 0, -1, 0); a_cs = hypre_StructMatrixExtractPointerByIndex(A, bi, index); hypre_SetIndex3(index, 0, 1, 0); a_cn = hypre_StructMatrixExtractPointerByIndex(A, bi, index); hypre_SetIndex3(index, 0, 0, 1); a_ac = hypre_StructMatrixExtractPointerByIndex(A, bi, index); hypre_SetIndex3(index, 0, 0, -1); a_bc = hypre_StructMatrixExtractPointerByIndex(A, bi, index); // FIXME TODO HOW TO DO KOKKOS IN ONE BOXLOOP ? #if defined(HYPRE_USING_KOKKOS) || defined(HYPRE_USING_SYCL) HYPRE_Real cxb = cxyz[0]; hypre_BoxLoop1ReductionBegin(hypre_StructMatrixNDim(A), loop_size, A_dbox, start, stride, Ai, cxb) { HYPRE_Real diag = a_cc[Ai] < 0.0 ? -1.0 : 1.0; HYPRE_Real tcx = -diag * (a_cw[Ai] + a_ce[Ai]); cxb += tcx; } hypre_BoxLoop1ReductionEnd(Ai, cxb) HYPRE_Real cyb = cxyz[1]; hypre_BoxLoop1ReductionBegin(hypre_StructMatrixNDim(A), loop_size, A_dbox, start, stride, Ai, cyb) { HYPRE_Real diag = a_cc[Ai] < 0.0 ? -1.0 : 1.0; HYPRE_Real tcy = -diag * (a_cs[Ai] + a_cn[Ai]); cyb += tcy; } hypre_BoxLoop1ReductionEnd(Ai, cyb) HYPRE_Real czb = cxyz[2]; hypre_BoxLoop1ReductionBegin(hypre_StructMatrixNDim(A), loop_size, A_dbox, start, stride, Ai, czb) { HYPRE_Real diag = a_cc[Ai] < 0.0 ? -1.0 : 1.0; HYPRE_Real tcz = -diag * (a_ac[Ai] + a_bc[Ai]); czb += tcz; } hypre_BoxLoop1ReductionEnd(Ai, czb) HYPRE_Real sqcxb = sqcxyz[0]; hypre_BoxLoop1ReductionBegin(hypre_StructMatrixNDim(A), loop_size, A_dbox, start, stride, Ai, sqcxb) { HYPRE_Real diag = a_cc[Ai] < 0.0 ? -1.0 : 1.0; HYPRE_Real tcx = -diag * (a_cw[Ai] + a_ce[Ai]); sqcxb += tcx * tcx; } hypre_BoxLoop1ReductionEnd(Ai, sqcxb) HYPRE_Real sqcyb = sqcxyz[1]; hypre_BoxLoop1ReductionBegin(hypre_StructMatrixNDim(A), loop_size, A_dbox, start, stride, Ai, sqcyb) { HYPRE_Real diag = a_cc[Ai] < 0.0 ? -1.0 : 1.0; HYPRE_Real tcy = -diag * (a_cs[Ai] + a_cn[Ai]); sqcyb += tcy * tcy; } hypre_BoxLoop1ReductionEnd(Ai, sqcyb) HYPRE_Real sqczb = sqcxyz[2]; hypre_BoxLoop1ReductionBegin(hypre_StructMatrixNDim(A), loop_size, A_dbox, start, stride, Ai, sqczb) { HYPRE_Real diag = a_cc[Ai] < 0.0 ? -1.0 : 1.0; HYPRE_Real tcz = -diag * (a_ac[Ai] + a_bc[Ai]); sqczb += tcz * tcz; } hypre_BoxLoop1ReductionEnd(Ai, sqczb) #else /* kokkos */ #if defined(HYPRE_USING_RAJA) ReduceSum cxb(cxyz[0]), cyb(cxyz[1]), czb(cxyz[2]), sqcxb(sqcxyz[0]), sqcyb(sqcxyz[1]), sqczb(sqcxyz[2]); #elif defined(HYPRE_USING_CUDA) || defined(HYPRE_USING_HIP) HYPRE_double6 d6(cxyz[0], cxyz[1], cxyz[2], sqcxyz[0], sqcxyz[1], sqcxyz[2]); ReduceSum sum6(d6); #else HYPRE_Real cxb, cyb, czb, sqcxb, sqcyb, sqczb; cxb = cxyz[0]; cyb = cxyz[1]; czb = cxyz[2]; sqcxb = sqcxyz[0]; sqcyb = sqcxyz[1]; sqczb = sqcxyz[2]; #ifdef HYPRE_BOX_REDUCTION #undef HYPRE_BOX_REDUCTION #endif #ifdef HYPRE_USING_DEVICE_OPENMP #define HYPRE_BOX_REDUCTION map(tofrom:cxb,cyb,czb,sqcxb,sqcyb,sqczb) reduction(+:cxb,cyb,czb,sqcxb,sqcyb,sqczb) #else #define HYPRE_BOX_REDUCTION reduction(+:cxb,cyb,czb,sqcxb,sqcyb,sqczb) #endif #endif #define DEVICE_VAR is_device_ptr(a_cc,a_cw,a_ce,a_cs,a_cn,a_ac,a_bc) hypre_BoxLoop1ReductionBegin(hypre_StructMatrixNDim(A), loop_size, A_dbox, start, stride, Ai, sum6) { HYPRE_Real tcx, tcy, tcz; HYPRE_Real diag = a_cc[Ai] < 0.0 ? -1.0 : 1.0; tcx = -diag * (a_cw[Ai] + a_ce[Ai]); tcy = -diag * (a_cs[Ai] + a_cn[Ai]); tcz = -diag * (a_ac[Ai] + a_bc[Ai]); #if !defined(HYPRE_USING_RAJA) && (defined(HYPRE_USING_CUDA) || defined(HYPRE_USING_HIP)) HYPRE_double6 tmp(tcx, tcy, tcz, tcx * tcx, tcy * tcy, tcz * tcz); sum6 += tmp; #else cxb += tcx; cyb += tcy; czb += tcz; sqcxb += tcx * tcx; sqcyb += tcy * tcy; sqczb += tcz * tcz; #endif } hypre_BoxLoop1ReductionEnd(Ai, sum6) #undef DEVICE_VAR #endif /* kokkos */ #if !defined(HYPRE_USING_RAJA) && !defined(HYPRE_USING_KOKKOS) && (defined(HYPRE_USING_CUDA) || defined(HYPRE_USING_HIP)) HYPRE_double6 tmp = (HYPRE_double6) sum6; cxyz[0] = tmp.x; cxyz[1] = tmp.y; cxyz[2] = tmp.z; sqcxyz[0] = tmp.w; sqcxyz[1] = tmp.u; sqcxyz[2] = tmp.v; #else cxyz[0] = (HYPRE_Real) cxb; cxyz[1] = (HYPRE_Real) cyb; cxyz[2] = (HYPRE_Real) czb; sqcxyz[0] = (HYPRE_Real) sqcxb; sqcxyz[1] = (HYPRE_Real) sqcyb; sqcxyz[2] = (HYPRE_Real) sqczb; #endif return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_PFMGComputeDxyz_SS19( HYPRE_Int bi, hypre_StructMatrix *A, HYPRE_Real *cxyz, HYPRE_Real *sqcxyz) { hypre_BoxArray *compute_boxes; hypre_Box *compute_box; hypre_Box *A_dbox; hypre_Index loop_size; hypre_IndexRef start; hypre_Index stride; hypre_Index index; HYPRE_Real *a_cc, *a_cw, *a_ce, *a_cs, *a_cn, *a_ac, *a_bc; HYPRE_Real *a_csw, *a_cse, *a_cne, *a_cnw; HYPRE_Real *a_aw, *a_ae, *a_as, *a_an, *a_bw, *a_be, *a_bs, *a_bn; #if 0 //defined(HYPRE_USING_CUDA) || defined(HYPRE_USING_HIP) HYPRE_Int data_location = hypre_StructGridDataLocation( hypre_StructMatrixGrid(A) ); #endif hypre_SetIndex3(stride, 1, 1, 1); compute_boxes = hypre_StructGridBoxes(hypre_StructMatrixGrid(A)); compute_box = hypre_BoxArrayBox(compute_boxes, bi); A_dbox = hypre_BoxArrayBox(hypre_StructMatrixDataSpace(A), bi); start = hypre_BoxIMin(compute_box); hypre_BoxGetStrideSize(compute_box, stride, loop_size); /*----------------------------------------------------------------- * Extract pointers for 7-point grid operator: * * a_cc is pointer for center coefficient * a_cw is pointer for west coefficient in same plane * a_ce is pointer for east coefficient in same plane * a_cs is pointer for south coefficient in same plane * a_cn is pointer for north coefficient in same plane * a_ac is pointer for center coefficient in plane above * a_bc is pointer for center coefficient in plane below *-----------------------------------------------------------------*/ hypre_SetIndex3(index, 0, 0, 0); a_cc = hypre_StructMatrixExtractPointerByIndex(A, bi, index); hypre_SetIndex3(index, -1, 0, 0); a_cw = hypre_StructMatrixExtractPointerByIndex(A, bi, index); hypre_SetIndex3(index, 1, 0, 0); a_ce = hypre_StructMatrixExtractPointerByIndex(A, bi, index); hypre_SetIndex3(index, 0, -1, 0); a_cs = hypre_StructMatrixExtractPointerByIndex(A, bi, index); hypre_SetIndex3(index, 0, 1, 0); a_cn = hypre_StructMatrixExtractPointerByIndex(A, bi, index); hypre_SetIndex3(index, 0, 0, 1); a_ac = hypre_StructMatrixExtractPointerByIndex(A, bi, index); hypre_SetIndex3(index, 0, 0, -1); a_bc = hypre_StructMatrixExtractPointerByIndex(A, bi, index); /*----------------------------------------------------------------- * Extract additional pointers for 19-point fine grid operator: * * a_aw is pointer for west coefficient in plane above * a_ae is pointer for east coefficient in plane above * a_as is pointer for south coefficient in plane above * a_an is pointer for north coefficient in plane above * a_bw is pointer for west coefficient in plane below * a_be is pointer for east coefficient in plane below * a_bs is pointer for south coefficient in plane below * a_bn is pointer for north coefficient in plane below * a_csw is pointer for southwest coefficient in same plane * a_cse is pointer for southeast coefficient in same plane * a_cnw is pointer for northwest coefficient in same plane * a_cne is pointer for northeast coefficient in same plane *-----------------------------------------------------------------*/ hypre_SetIndex3(index, -1, 0, 1); a_aw = hypre_StructMatrixExtractPointerByIndex(A, bi, index); hypre_SetIndex3(index, 1, 0, 1); a_ae = hypre_StructMatrixExtractPointerByIndex(A, bi, index); hypre_SetIndex3(index, 0, -1, 1); a_as = hypre_StructMatrixExtractPointerByIndex(A, bi, index); hypre_SetIndex3(index, 0, 1, 1); a_an = hypre_StructMatrixExtractPointerByIndex(A, bi, index); hypre_SetIndex3(index, -1, 0, -1); a_bw = hypre_StructMatrixExtractPointerByIndex(A, bi, index); hypre_SetIndex3(index, 1, 0, -1); a_be = hypre_StructMatrixExtractPointerByIndex(A, bi, index); hypre_SetIndex3(index, 0, -1, -1); a_bs = hypre_StructMatrixExtractPointerByIndex(A, bi, index); hypre_SetIndex3(index, 0, 1, -1); a_bn = hypre_StructMatrixExtractPointerByIndex(A, bi, index); hypre_SetIndex3(index, -1, -1, 0); a_csw = hypre_StructMatrixExtractPointerByIndex(A, bi, index); hypre_SetIndex3(index, 1, -1, 0); a_cse = hypre_StructMatrixExtractPointerByIndex(A, bi, index); hypre_SetIndex3(index, -1, 1, 0); a_cnw = hypre_StructMatrixExtractPointerByIndex(A, bi, index); hypre_SetIndex3(index, 1, 1, 0); a_cne = hypre_StructMatrixExtractPointerByIndex(A, bi, index); // FIXME TODO HOW TO DO KOKKOS IN ONE BOXLOOP ? #if defined(HYPRE_USING_KOKKOS) || defined(HYPRE_USING_SYCL) HYPRE_Real cxb = cxyz[0]; hypre_BoxLoop1ReductionBegin(hypre_StructMatrixNDim(A), loop_size, A_dbox, start, stride, Ai, cxb) { HYPRE_Real diag = a_cc[Ai] < 0.0 ? -1.0 : 1.0; HYPRE_Real tcx = -diag * (a_cw[Ai] + a_ce[Ai] + a_aw[Ai] + a_ae[Ai] + a_bw[Ai] + a_be[Ai] + a_csw[Ai] + a_cse[Ai] + a_cnw[Ai] + a_cne[Ai]); cxb += tcx; } hypre_BoxLoop1ReductionEnd(Ai, cxb) HYPRE_Real cyb = cxyz[1]; hypre_BoxLoop1ReductionBegin(hypre_StructMatrixNDim(A), loop_size, A_dbox, start, stride, Ai, cyb) { HYPRE_Real diag = a_cc[Ai] < 0.0 ? -1.0 : 1.0; HYPRE_Real tcy = -diag * (a_cs[Ai] + a_cn[Ai] + a_an[Ai] + a_as[Ai] + a_bn[Ai] + a_bs[Ai] + a_csw[Ai] + a_cse[Ai] + a_cnw[Ai] + a_cne[Ai]); cyb += tcy; } hypre_BoxLoop1ReductionEnd(Ai, cyb) HYPRE_Real czb = cxyz[2]; hypre_BoxLoop1ReductionBegin(hypre_StructMatrixNDim(A), loop_size, A_dbox, start, stride, Ai, czb) { HYPRE_Real diag = a_cc[Ai] < 0.0 ? -1.0 : 1.0; HYPRE_Real tcz = -diag * (a_ac[Ai] + a_bc[Ai] + a_aw[Ai] + a_ae[Ai] + a_an[Ai] + a_as[Ai] + a_bw[Ai] + a_be[Ai] + a_bn[Ai] + a_bs[Ai]); czb += tcz; } hypre_BoxLoop1ReductionEnd(Ai, czb) HYPRE_Real sqcxb = sqcxyz[0]; hypre_BoxLoop1ReductionBegin(hypre_StructMatrixNDim(A), loop_size, A_dbox, start, stride, Ai, sqcxb) { HYPRE_Real diag = a_cc[Ai] < 0.0 ? -1.0 : 1.0; HYPRE_Real tcx = -diag * (a_cw[Ai] + a_ce[Ai] + a_aw[Ai] + a_ae[Ai] + a_bw[Ai] + a_be[Ai] + a_csw[Ai] + a_cse[Ai] + a_cnw[Ai] + a_cne[Ai]); sqcxb += tcx * tcx; } hypre_BoxLoop1ReductionEnd(Ai, sqcxb) HYPRE_Real sqcyb = sqcxyz[1]; hypre_BoxLoop1ReductionBegin(hypre_StructMatrixNDim(A), loop_size, A_dbox, start, stride, Ai, sqcyb) { HYPRE_Real diag = a_cc[Ai] < 0.0 ? -1.0 : 1.0; HYPRE_Real tcy = -diag * (a_cs[Ai] + a_cn[Ai] + a_an[Ai] + a_as[Ai] + a_bn[Ai] + a_bs[Ai] + a_csw[Ai] + a_cse[Ai] + a_cnw[Ai] + a_cne[Ai]); sqcyb += tcy * tcy; } hypre_BoxLoop1ReductionEnd(Ai, sqcyb) HYPRE_Real sqczb = sqcxyz[2]; hypre_BoxLoop1ReductionBegin(hypre_StructMatrixNDim(A), loop_size, A_dbox, start, stride, Ai, sqczb) { HYPRE_Real diag = a_cc[Ai] < 0.0 ? -1.0 : 1.0; HYPRE_Real tcz = -diag * (a_ac[Ai] + a_bc[Ai] + a_aw[Ai] + a_ae[Ai] + a_an[Ai] + a_as[Ai] + a_bw[Ai] + a_be[Ai] + a_bn[Ai] + a_bs[Ai]); sqczb += tcz * tcz; } hypre_BoxLoop1ReductionEnd(Ai, sqczb) #else /* kokkos */ #if defined(HYPRE_USING_RAJA) ReduceSum cxb(cxyz[0]), cyb(cxyz[1]), czb(cxyz[2]), sqcxb(sqcxyz[0]), sqcyb(sqcxyz[1]), sqczb(sqcxyz[2]); #elif defined(HYPRE_USING_CUDA) || defined(HYPRE_USING_HIP) HYPRE_double6 d6(cxyz[0], cxyz[1], cxyz[2], sqcxyz[0], sqcxyz[1], sqcxyz[2]); ReduceSum sum6(d6); #else HYPRE_Real cxb, cyb, czb, sqcxb, sqcyb, sqczb; cxb = cxyz[0]; cyb = cxyz[1]; czb = cxyz[2]; sqcxb = sqcxyz[0]; sqcyb = sqcxyz[1]; sqczb = sqcxyz[2]; #ifdef HYPRE_BOX_REDUCTION #undef HYPRE_BOX_REDUCTION #endif #ifdef HYPRE_USING_DEVICE_OPENMP #define HYPRE_BOX_REDUCTION map(tofrom:cxb,cyb,czb,sqcxb,sqcyb,sqczb) reduction(+:cxb,cyb,czb,sqcxb,sqcyb,sqczb) #else #define HYPRE_BOX_REDUCTION reduction(+:cxb,cyb,czb,sqcxb,sqcyb,sqczb) #endif #endif #define DEVICE_VAR is_device_ptr(a_cc,a_cw,a_ce,a_aw,a_ae,a_bw,a_be,a_csw,a_cse,a_cnw,a_cne,a_cs,a_cn,a_an,a_as,a_bn,a_bs,a_ac,a_bc) hypre_BoxLoop1ReductionBegin(hypre_StructMatrixNDim(A), loop_size, A_dbox, start, stride, Ai, sum6) { HYPRE_Real tcx, tcy, tcz; HYPRE_Real diag = a_cc[Ai] < 0.0 ? -1.0 : 1.0; tcx = -diag * (a_cw[Ai] + a_ce[Ai] + a_aw[Ai] + a_ae[Ai] + a_bw[Ai] + a_be[Ai] + a_csw[Ai] + a_cse[Ai] + a_cnw[Ai] + a_cne[Ai]); tcy = -diag * (a_cs[Ai] + a_cn[Ai] + a_an[Ai] + a_as[Ai] + a_bn[Ai] + a_bs[Ai] + a_csw[Ai] + a_cse[Ai] + a_cnw[Ai] + a_cne[Ai]); tcz = -diag * (a_ac[Ai] + a_bc[Ai] + a_aw[Ai] + a_ae[Ai] + a_an[Ai] + a_as[Ai] + a_bw[Ai] + a_be[Ai] + a_bn[Ai] + a_bs[Ai]); #if !defined(HYPRE_USING_RAJA) && (defined(HYPRE_USING_CUDA) || defined(HYPRE_USING_HIP)) HYPRE_double6 tmp(tcx, tcy, tcz, tcx * tcx, tcy * tcy, tcz * tcz); sum6 += tmp; #else cxb += tcx; cyb += tcy; czb += tcz; sqcxb += tcx * tcx; sqcyb += tcy * tcy; sqczb += tcz * tcz; #endif } hypre_BoxLoop1ReductionEnd(Ai, sum6) #undef DEVICE_VAR #endif /* kokkos */ #if !defined(HYPRE_USING_RAJA) && !defined(HYPRE_USING_KOKKOS) && (defined(HYPRE_USING_CUDA) || defined(HYPRE_USING_HIP)) HYPRE_double6 tmp = (HYPRE_double6) sum6; cxyz[0] = tmp.x; cxyz[1] = tmp.y; cxyz[2] = tmp.z; sqcxyz[0] = tmp.w; sqcxyz[1] = tmp.u; sqcxyz[2] = tmp.v; #else cxyz[0] = (HYPRE_Real) cxb; cxyz[1] = (HYPRE_Real) cyb; cxyz[2] = (HYPRE_Real) czb; sqcxyz[0] = (HYPRE_Real) sqcxb; sqcxyz[1] = (HYPRE_Real) sqcyb; sqcxyz[2] = (HYPRE_Real) sqczb; #endif return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_PFMGComputeDxyz_SS27( HYPRE_Int bi, hypre_StructMatrix *A, HYPRE_Real *cxyz, HYPRE_Real *sqcxyz) { hypre_BoxArray *compute_boxes; hypre_Box *compute_box; hypre_Box *A_dbox; hypre_Index loop_size; hypre_IndexRef start; hypre_Index stride; hypre_Index index; HYPRE_Real *a_cc, *a_cw, *a_ce, *a_cs, *a_cn, *a_ac, *a_bc; HYPRE_Real *a_csw, *a_cse, *a_cne, *a_cnw; HYPRE_Real *a_aw, *a_ae, *a_as, *a_an, *a_bw, *a_be, *a_bs, *a_bn; HYPRE_Real *a_asw, *a_ase, *a_ane, *a_anw, *a_bsw, *a_bse, *a_bne, *a_bnw; #if 0 //defined(HYPRE_USING_CUDA) || defined(HYPRE_USING_HIP) HYPRE_Int data_location = hypre_StructGridDataLocation( hypre_StructMatrixGrid(A) ); #endif hypre_SetIndex3(stride, 1, 1, 1); compute_boxes = hypre_StructGridBoxes(hypre_StructMatrixGrid(A)); compute_box = hypre_BoxArrayBox(compute_boxes, bi); A_dbox = hypre_BoxArrayBox(hypre_StructMatrixDataSpace(A), bi); start = hypre_BoxIMin(compute_box); hypre_BoxGetStrideSize(compute_box, stride, loop_size); /*----------------------------------------------------------------- * Extract pointers for 7-point grid operator: * * a_cc is pointer for center coefficient * a_cw is pointer for west coefficient in same plane * a_ce is pointer for east coefficient in same plane * a_cs is pointer for south coefficient in same plane * a_cn is pointer for north coefficient in same plane * a_ac is pointer for center coefficient in plane above * a_bc is pointer for center coefficient in plane below *-----------------------------------------------------------------*/ hypre_SetIndex3(index, 0, 0, 0); a_cc = hypre_StructMatrixExtractPointerByIndex(A, bi, index); hypre_SetIndex3(index, -1, 0, 0); a_cw = hypre_StructMatrixExtractPointerByIndex(A, bi, index); hypre_SetIndex3(index, 1, 0, 0); a_ce = hypre_StructMatrixExtractPointerByIndex(A, bi, index); hypre_SetIndex3(index, 0, -1, 0); a_cs = hypre_StructMatrixExtractPointerByIndex(A, bi, index); hypre_SetIndex3(index, 0, 1, 0); a_cn = hypre_StructMatrixExtractPointerByIndex(A, bi, index); hypre_SetIndex3(index, 0, 0, 1); a_ac = hypre_StructMatrixExtractPointerByIndex(A, bi, index); hypre_SetIndex3(index, 0, 0, -1); a_bc = hypre_StructMatrixExtractPointerByIndex(A, bi, index); /*----------------------------------------------------------------- * Extract additional pointers for 19-point grid operator: * * a_aw is pointer for west coefficient in plane above * a_ae is pointer for east coefficient in plane above * a_as is pointer for south coefficient in plane above * a_an is pointer for north coefficient in plane above * a_bw is pointer for west coefficient in plane below * a_be is pointer for east coefficient in plane below * a_bs is pointer for south coefficient in plane below * a_bn is pointer for north coefficient in plane below * a_csw is pointer for southwest coefficient in same plane * a_cse is pointer for southeast coefficient in same plane * a_cnw is pointer for northwest coefficient in same plane * a_cne is pointer for northeast coefficient in same plane *-----------------------------------------------------------------*/ hypre_SetIndex3(index, -1, 0, 1); a_aw = hypre_StructMatrixExtractPointerByIndex(A, bi, index); hypre_SetIndex3(index, 1, 0, 1); a_ae = hypre_StructMatrixExtractPointerByIndex(A, bi, index); hypre_SetIndex3(index, 0, -1, 1); a_as = hypre_StructMatrixExtractPointerByIndex(A, bi, index); hypre_SetIndex3(index, 0, 1, 1); a_an = hypre_StructMatrixExtractPointerByIndex(A, bi, index); hypre_SetIndex3(index, -1, 0, -1); a_bw = hypre_StructMatrixExtractPointerByIndex(A, bi, index); hypre_SetIndex3(index, 1, 0, -1); a_be = hypre_StructMatrixExtractPointerByIndex(A, bi, index); hypre_SetIndex3(index, 0, -1, -1); a_bs = hypre_StructMatrixExtractPointerByIndex(A, bi, index); hypre_SetIndex3(index, 0, 1, -1); a_bn = hypre_StructMatrixExtractPointerByIndex(A, bi, index); hypre_SetIndex3(index, -1, -1, 0); a_csw = hypre_StructMatrixExtractPointerByIndex(A, bi, index); hypre_SetIndex3(index, 1, -1, 0); a_cse = hypre_StructMatrixExtractPointerByIndex(A, bi, index); hypre_SetIndex3(index, -1, 1, 0); a_cnw = hypre_StructMatrixExtractPointerByIndex(A, bi, index); hypre_SetIndex3(index, 1, 1, 0); a_cne = hypre_StructMatrixExtractPointerByIndex(A, bi, index); /*----------------------------------------------------------------- * Extract additional pointers for 27-point fine grid operator: * * a_asw is pointer for southwest coefficient in plane above * a_ase is pointer for southeast coefficient in plane above * a_anw is pointer for northwest coefficient in plane above * a_ane is pointer for northeast coefficient in plane above * a_bsw is pointer for southwest coefficient in plane below * a_bse is pointer for southeast coefficient in plane below * a_bnw is pointer for northwest coefficient in plane below * a_bne is pointer for northeast coefficient in plane below *-----------------------------------------------------------------*/ hypre_SetIndex3(index, -1, -1, 1); a_asw = hypre_StructMatrixExtractPointerByIndex(A, bi, index); hypre_SetIndex3(index, 1, -1, 1); a_ase = hypre_StructMatrixExtractPointerByIndex(A, bi, index); hypre_SetIndex3(index, -1, 1, 1); a_anw = hypre_StructMatrixExtractPointerByIndex(A, bi, index); hypre_SetIndex3(index, 1, 1, 1); a_ane = hypre_StructMatrixExtractPointerByIndex(A, bi, index); hypre_SetIndex3(index, -1, -1, -1); a_bsw = hypre_StructMatrixExtractPointerByIndex(A, bi, index); hypre_SetIndex3(index, 1, -1, -1); a_bse = hypre_StructMatrixExtractPointerByIndex(A, bi, index); hypre_SetIndex3(index, -1, 1, -1); a_bnw = hypre_StructMatrixExtractPointerByIndex(A, bi, index); hypre_SetIndex3(index, 1, 1, -1); a_bne = hypre_StructMatrixExtractPointerByIndex(A, bi, index); // FIXME TODO HOW TO DO KOKKOS IN ONE BOXLOOP ? #if defined(HYPRE_USING_KOKKOS) || defined(HYPRE_USING_SYCL) HYPRE_Real cxb = cxyz[0]; hypre_BoxLoop1ReductionBegin(hypre_StructMatrixNDim(A), loop_size, A_dbox, start, stride, Ai, cxb) { HYPRE_Real tcx = 0.0; HYPRE_Real diag = a_cc[Ai] < 0.0 ? -1.0 : 1.0; tcx -= diag * (a_cw[Ai] + a_ce[Ai] + a_aw[Ai] + a_ae[Ai] + a_bw[Ai] + a_be[Ai] + a_csw[Ai] + a_cse[Ai] + a_cnw[Ai] + a_cne[Ai]); tcx -= diag * (a_asw[Ai] + a_ase[Ai] + a_anw[Ai] + a_ane[Ai] + a_bsw[Ai] + a_bse[Ai] + a_bnw[Ai] + a_bne[Ai]); cxb += tcx; } hypre_BoxLoop1ReductionEnd(Ai, cxb) HYPRE_Real cyb = cxyz[1]; hypre_BoxLoop1ReductionBegin(hypre_StructMatrixNDim(A), loop_size, A_dbox, start, stride, Ai, cyb) { HYPRE_Real tcy = 0.0; HYPRE_Real diag = a_cc[Ai] < 0.0 ? -1.0 : 1.0; tcy -= diag * (a_cs[Ai] + a_cn[Ai] + a_an[Ai] + a_as[Ai] + a_bn[Ai] + a_bs[Ai] + a_csw[Ai] + a_cse[Ai] + a_cnw[Ai] + a_cne[Ai]); tcy -= diag * (a_asw[Ai] + a_ase[Ai] + a_anw[Ai] + a_ane[Ai] + a_bsw[Ai] + a_bse[Ai] + a_bnw[Ai] + a_bne[Ai]); cyb += tcy; } hypre_BoxLoop1ReductionEnd(Ai, cyb) HYPRE_Real czb = cxyz[2]; hypre_BoxLoop1ReductionBegin(hypre_StructMatrixNDim(A), loop_size, A_dbox, start, stride, Ai, czb) { HYPRE_Real tcz = 0.0; HYPRE_Real diag = a_cc[Ai] < 0.0 ? -1.0 : 1.0; tcz -= diag * (a_ac[Ai] + a_bc[Ai] + a_aw[Ai] + a_ae[Ai] + a_an[Ai] + a_as[Ai] + a_bw[Ai] + a_be[Ai] + a_bn[Ai] + a_bs[Ai]); tcz -= diag * (a_asw[Ai] + a_ase[Ai] + a_anw[Ai] + a_ane[Ai] + a_bsw[Ai] + a_bse[Ai] + a_bnw[Ai] + a_bne[Ai]); czb += tcz; } hypre_BoxLoop1ReductionEnd(Ai, czb) HYPRE_Real sqcxb = sqcxyz[0]; hypre_BoxLoop1ReductionBegin(hypre_StructMatrixNDim(A), loop_size, A_dbox, start, stride, Ai, sqcxb) { HYPRE_Real tcx = 0.0; HYPRE_Real diag = a_cc[Ai] < 0.0 ? -1.0 : 1.0; tcx -= diag * (a_cw[Ai] + a_ce[Ai] + a_aw[Ai] + a_ae[Ai] + a_bw[Ai] + a_be[Ai] + a_csw[Ai] + a_cse[Ai] + a_cnw[Ai] + a_cne[Ai]); tcx -= diag * (a_asw[Ai] + a_ase[Ai] + a_anw[Ai] + a_ane[Ai] + a_bsw[Ai] + a_bse[Ai] + a_bnw[Ai] + a_bne[Ai]); sqcxb += tcx * tcx; } hypre_BoxLoop1ReductionEnd(Ai, sqcxb) HYPRE_Real sqcyb = sqcxyz[1]; hypre_BoxLoop1ReductionBegin(hypre_StructMatrixNDim(A), loop_size, A_dbox, start, stride, Ai, sqcyb); { HYPRE_Real tcy = 0.0; HYPRE_Real diag = a_cc[Ai] < 0.0 ? -1.0 : 1.0; tcy -= diag * (a_cs[Ai] + a_cn[Ai] + a_an[Ai] + a_as[Ai] + a_bn[Ai] + a_bs[Ai] + a_csw[Ai] + a_cse[Ai] + a_cnw[Ai] + a_cne[Ai]); tcy -= diag * (a_asw[Ai] + a_ase[Ai] + a_anw[Ai] + a_ane[Ai] + a_bsw[Ai] + a_bse[Ai] + a_bnw[Ai] + a_bne[Ai]); sqcyb += tcy * tcy; } hypre_BoxLoop1ReductionEnd(Ai, sqcyb); HYPRE_Real sqczb = sqcxyz[2]; hypre_BoxLoop1ReductionBegin(hypre_StructMatrixNDim(A), loop_size, A_dbox, start, stride, Ai, sqczb) { HYPRE_Real tcz = 0.0; HYPRE_Real diag = a_cc[Ai] < 0.0 ? -1.0 : 1.0; tcz -= diag * (a_ac[Ai] + a_bc[Ai] + a_aw[Ai] + a_ae[Ai] + a_an[Ai] + a_as[Ai] + a_bw[Ai] + a_be[Ai] + a_bn[Ai] + a_bs[Ai]); tcz -= diag * (a_asw[Ai] + a_ase[Ai] + a_anw[Ai] + a_ane[Ai] + a_bsw[Ai] + a_bse[Ai] + a_bnw[Ai] + a_bne[Ai]); sqczb += tcz * tcz; } hypre_BoxLoop1ReductionEnd(Ai, sqczb) #else /* kokkos */ #if defined(HYPRE_USING_RAJA) ReduceSum cxb(cxyz[0]), cyb(cxyz[1]), czb(cxyz[2]), sqcxb(sqcxyz[0]), sqcyb(sqcxyz[1]), sqczb(sqcxyz[2]); #elif defined(HYPRE_USING_CUDA) || defined(HYPRE_USING_HIP) HYPRE_double6 d6(cxyz[0], cxyz[1], cxyz[2], sqcxyz[0], sqcxyz[1], sqcxyz[2]); ReduceSum sum6(d6); #else HYPRE_Real cxb, cyb, czb, sqcxb, sqcyb, sqczb; cxb = cxyz[0]; cyb = cxyz[1]; czb = cxyz[2]; sqcxb = sqcxyz[0]; sqcyb = sqcxyz[1]; sqczb = sqcxyz[2]; #ifdef HYPRE_BOX_REDUCTION #undef HYPRE_BOX_REDUCTION #endif #ifdef HYPRE_USING_DEVICE_OPENMP #define HYPRE_BOX_REDUCTION map(tofrom:cxb,cyb,czb,sqcxb,sqcyb,sqczb) reduction(+:cxb,cyb,czb,sqcxb,sqcyb,sqczb) #else #define HYPRE_BOX_REDUCTION reduction(+:cxb,cyb,czb,sqcxb,sqcyb,sqczb) #endif #endif #define DEVICE_VAR is_device_ptr(a_cc,a_cw,a_ce,a_aw,a_ae,a_bw,a_be,a_csw,a_cse,a_cnw,a_cne,a_asw,a_ase,a_anw,a_ane,a_bsw,a_bse,a_bnw,a_bne,a_cs,a_cn,a_an,a_as,a_bn,a_bs,a_ac,a_bc) hypre_BoxLoop1ReductionBegin(hypre_StructMatrixNDim(A), loop_size, A_dbox, start, stride, Ai, sum6) { HYPRE_Real tcx = 0.0, tcy = 0.0, tcz = 0.0; HYPRE_Real diag = a_cc[Ai] < 0.0 ? -1.0 : 1.0; tcx -= diag * (a_cw[Ai] + a_ce[Ai] + a_aw[Ai] + a_ae[Ai] + a_bw[Ai] + a_be[Ai] + a_csw[Ai] + a_cse[Ai] + a_cnw[Ai] + a_cne[Ai]); tcx -= diag * (a_asw[Ai] + a_ase[Ai] + a_anw[Ai] + a_ane[Ai] + a_bsw[Ai] + a_bse[Ai] + a_bnw[Ai] + a_bne[Ai]); tcy -= diag * (a_cs[Ai] + a_cn[Ai] + a_an[Ai] + a_as[Ai] + a_bn[Ai] + a_bs[Ai] + a_csw[Ai] + a_cse[Ai] + a_cnw[Ai] + a_cne[Ai]); tcy -= diag * (a_asw[Ai] + a_ase[Ai] + a_anw[Ai] + a_ane[Ai] + a_bsw[Ai] + a_bse[Ai] + a_bnw[Ai] + a_bne[Ai]); tcz -= diag * (a_ac[Ai] + a_bc[Ai] + a_aw[Ai] + a_ae[Ai] + a_an[Ai] + a_as[Ai] + a_bw[Ai] + a_be[Ai] + a_bn[Ai] + a_bs[Ai]); tcz -= diag * (a_asw[Ai] + a_ase[Ai] + a_anw[Ai] + a_ane[Ai] + a_bsw[Ai] + a_bse[Ai] + a_bnw[Ai] + a_bne[Ai]); #if !defined(HYPRE_USING_RAJA) && (defined(HYPRE_USING_CUDA) || defined(HYPRE_USING_HIP)) HYPRE_double6 tmp(tcx, tcy, tcz, tcx * tcx, tcy * tcy, tcz * tcz); sum6 += tmp; #else cxb += tcx; cyb += tcy; czb += tcz; sqcxb += tcx * tcx; sqcyb += tcy * tcy; sqczb += tcz * tcz; #endif } hypre_BoxLoop1ReductionEnd(Ai, sum6) #undef DEVICE_VAR #endif /* kokkos */ #if !defined(HYPRE_USING_RAJA) && !defined(HYPRE_USING_KOKKOS) && (defined(HYPRE_USING_CUDA) || defined(HYPRE_USING_HIP)) HYPRE_double6 tmp = (HYPRE_double6) sum6; cxyz[0] = tmp.x; cxyz[1] = tmp.y; cxyz[2] = tmp.z; sqcxyz[0] = tmp.w; sqcxyz[1] = tmp.u; sqcxyz[2] = tmp.v; #else cxyz[0] = (HYPRE_Real) cxb; cxyz[1] = (HYPRE_Real) cyb; cxyz[2] = (HYPRE_Real) czb; sqcxyz[0] = (HYPRE_Real) sqcxb; sqcxyz[1] = (HYPRE_Real) sqcyb; sqcxyz[2] = (HYPRE_Real) sqczb; #endif return hypre_error_flag; } /*-------------------------------------------------------------------------- * Returns 1 if there is a diagonal coefficient that is zero, * otherwise returns 0. *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ZeroDiagonal( hypre_StructMatrix *A ) { hypre_BoxArray *compute_boxes; hypre_Box *compute_box; hypre_Index loop_size; hypre_IndexRef start; hypre_Index stride; HYPRE_Real *Ap; hypre_Box *A_dbox; HYPRE_Int Ai; HYPRE_Int i; hypre_Index diag_index; HYPRE_Real diag_product = 0.0; HYPRE_Int zero_diag = 0; HYPRE_Int constant_coefficient; #if 0 //defined(HYPRE_USING_CUDA) || defined(HYPRE_USING_HIP) HYPRE_Int data_location = hypre_StructGridDataLocation(hypre_StructMatrixGrid(A)); #endif /*---------------------------------------------------------- * Initialize some things *----------------------------------------------------------*/ hypre_SetIndex3(stride, 1, 1, 1); hypre_SetIndex3(diag_index, 0, 0, 0); /* Need to modify here */ constant_coefficient = hypre_StructMatrixConstantCoefficient(A); compute_boxes = hypre_StructGridBoxes(hypre_StructMatrixGrid(A)); hypre_ForBoxI(i, compute_boxes) { compute_box = hypre_BoxArrayBox(compute_boxes, i); start = hypre_BoxIMin(compute_box); A_dbox = hypre_BoxArrayBox(hypre_StructMatrixDataSpace(A), i); Ap = hypre_StructMatrixExtractPointerByIndex(A, i, diag_index); hypre_BoxGetStrideSize(compute_box, stride, loop_size); if ( constant_coefficient == 1 ) { Ai = hypre_CCBoxIndexRank( A_dbox, start ); diag_product += Ap[Ai] == 0 ? 1 : 0; } else { #if defined(HYPRE_USING_KOKKOS) || defined(HYPRE_USING_SYCL) HYPRE_Real diag_product_local = diag_product; #elif defined(HYPRE_USING_RAJA) ReduceSum diag_product_local(diag_product); #elif defined(HYPRE_USING_CUDA) || defined(HYPRE_USING_HIP) ReduceSum diag_product_local(diag_product); #else HYPRE_Real diag_product_local = diag_product; #endif #ifdef HYPRE_BOX_REDUCTION #undef HYPRE_BOX_REDUCTION #endif #if defined(HYPRE_USING_DEVICE_OPENMP) #define HYPRE_BOX_REDUCTION map(tofrom:diag_product_local) reduction(+:diag_product_local) #else #define HYPRE_BOX_REDUCTION reduction(+:diag_product_local) #endif #define DEVICE_VAR is_device_ptr(Ap) hypre_BoxLoop1ReductionBegin(hypre_StructMatrixNDim(A), loop_size, A_dbox, start, stride, Ai, diag_product_local); { HYPRE_Real one = 1.0; HYPRE_Real zero = 0.0; if (Ap[Ai] == 0.0) { diag_product_local += one; } else { diag_product_local += zero; } } hypre_BoxLoop1ReductionEnd(Ai, diag_product_local); diag_product += (HYPRE_Real) diag_product_local; } } if (diag_product > 0) { zero_diag = 1; } return zero_diag; } hypre-2.33.0/src/struct_ls/pfmg_setup_interp.c000066400000000000000000001753711477326011500214610ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "_hypre_struct_ls.h" #include "_hypre_struct_mv.hpp" #include "pfmg.h" #ifdef MAX_DEPTH #undef MAX_DEPTH #endif #define MAX_DEPTH 7 /* 2: the most explicit implementation, a function for each stencil size */ #define CC0_IMPLEMENTATION 2 /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ hypre_StructMatrix * hypre_PFMGCreateInterpOp( hypre_StructMatrix *A, hypre_StructGrid *cgrid, HYPRE_Int cdir, HYPRE_Int rap_type ) { hypre_StructMatrix *P; hypre_StructStencil *stencil; hypre_Index *stencil_shape; HYPRE_Int stencil_size; HYPRE_Int stencil_dim; HYPRE_Int num_ghost[] = {1, 1, 1, 1, 1, 1}; HYPRE_Int i; HYPRE_Int constant_coefficient; /* set up stencil */ stencil_size = 2; stencil_dim = hypre_StructStencilNDim(hypre_StructMatrixStencil(A)); stencil_shape = hypre_CTAlloc(hypre_Index, stencil_size, HYPRE_MEMORY_HOST); for (i = 0; i < stencil_size; i++) { hypre_SetIndex3(stencil_shape[i], 0, 0, 0); } hypre_IndexD(stencil_shape[0], cdir) = -1; hypre_IndexD(stencil_shape[1], cdir) = 1; stencil = hypre_StructStencilCreate(stencil_dim, stencil_size, stencil_shape); /* set up matrix */ P = hypre_StructMatrixCreate(hypre_StructMatrixComm(A), cgrid, stencil); hypre_StructMatrixSetNumGhost(P, num_ghost); constant_coefficient = hypre_StructMatrixConstantCoefficient(A); if ( constant_coefficient == 2 ) { if ( rap_type == 0 ) /* A has variable diagonal, which will force all P coefficients to be variable */ { hypre_StructMatrixSetConstantCoefficient(P, 0 ); } else { /* We will force P to be 0.5's everywhere, ignoring A. */ hypre_StructMatrixSetConstantCoefficient(P, 1); } } else { /* constant_coefficient = 0 or 1: A is entirely constant or entirely variable coefficient */ hypre_StructMatrixSetConstantCoefficient( P, constant_coefficient ); } hypre_StructStencilDestroy(stencil); return P; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_PFMGSetupInterpOp( hypre_StructMatrix *A, HYPRE_Int cdir, hypre_Index findex, hypre_Index stride, hypre_StructMatrix *P, HYPRE_Int rap_type ) { hypre_BoxArray *compute_boxes; hypre_Box *compute_box; hypre_Box *A_dbox; hypre_Box *P_dbox; HYPRE_Real *Pp0, *Pp1; HYPRE_Int constant_coefficient; hypre_StructStencil *stencil; hypre_Index *stencil_shape; HYPRE_Int stencil_size; hypre_StructStencil *P_stencil; hypre_Index *P_stencil_shape; HYPRE_Int Pstenc0, Pstenc1; hypre_Index loop_size; hypre_Index start; hypre_IndexRef startc; hypre_Index stridec; HYPRE_Int i, si; HYPRE_Int si0, si1; HYPRE_Int mrk0, mrk1; HYPRE_Int d; /*---------------------------------------------------------- * Initialize some things *----------------------------------------------------------*/ HYPRE_ANNOTATE_FUNC_BEGIN; stencil = hypre_StructMatrixStencil(A); stencil_shape = hypre_StructStencilShape(stencil); stencil_size = hypre_StructStencilSize(stencil); P_stencil = hypre_StructMatrixStencil(P); P_stencil_shape = hypre_StructStencilShape(P_stencil); constant_coefficient = hypre_StructMatrixConstantCoefficient(A); /*---------------------------------------------------------- * Find stencil enties in A corresponding to P *----------------------------------------------------------*/ si0 = -1; si1 = -1; for (si = 0; si < stencil_size; si++) { mrk0 = 0; mrk1 = 0; for (d = 0; d < hypre_StructStencilNDim(stencil); d++) { if (hypre_IndexD(stencil_shape[si], d) == hypre_IndexD(P_stencil_shape[0], d)) { mrk0++; } if (hypre_IndexD(stencil_shape[si], d) == hypre_IndexD(P_stencil_shape[1], d)) { mrk1++; } } if (mrk0 == hypre_StructStencilNDim(stencil)) { si0 = si; } if (mrk1 == hypre_StructStencilNDim(stencil)) { si1 = si; } } hypre_SetIndex3(stridec, 1, 1, 1); /*---------------------------------------------------------- * Compute P *----------------------------------------------------------*/ compute_boxes = hypre_StructGridBoxes(hypre_StructMatrixGrid(P)); hypre_ForBoxI(i, compute_boxes) { compute_box = hypre_BoxArrayBox(compute_boxes, i); A_dbox = hypre_BoxArrayBox(hypre_StructMatrixDataSpace(A), i); P_dbox = hypre_BoxArrayBox(hypre_StructMatrixDataSpace(P), i); Pp0 = hypre_StructMatrixBoxData(P, i, 0); Pp1 = hypre_StructMatrixBoxData(P, i, 1); Pstenc0 = hypre_IndexD(P_stencil_shape[0], cdir); Pstenc1 = hypre_IndexD(P_stencil_shape[1], cdir); startc = hypre_BoxIMin(compute_box); hypre_StructMapCoarseToFine(startc, findex, stride, start); hypre_BoxGetStrideSize(compute_box, stridec, loop_size); if ( constant_coefficient == 1 ) /* all coefficients are constant */ { hypre_PFMGSetupInterpOp_CC1 ( i, A, A_dbox, cdir, stride, stridec, start, startc, loop_size, P_dbox, Pstenc0, Pstenc1, Pp0, Pp1, rap_type, si0, si1 ); } else if ( constant_coefficient == 2 ) /* all coefficients are constant except the diagonal is variable */ { hypre_PFMGSetupInterpOp_CC2 ( i, A, A_dbox, cdir, stride, stridec, start, startc, loop_size, P_dbox, Pstenc0, Pstenc1, Pp0, Pp1, rap_type, si0, si1 ); } else /* constant_coefficient == 0 , all coefficients in A vary */ { #if CC0_IMPLEMENTATION <= 1 hypre_PFMGSetupInterpOp_CC0 ( i, A, A_dbox, cdir, stride, stridec, start, startc, loop_size, P_dbox, Pstenc0, Pstenc1, Pp0, Pp1, rap_type, si0, si1 ); #else switch (stencil_size) { case 5: hypre_PFMGSetupInterpOp_CC0_SS5 ( i, A, A_dbox, cdir, stride, stridec, start, startc, loop_size, P_dbox, Pstenc0, Pstenc1, Pp0, Pp1, rap_type, P_stencil_shape ); break; case 9: hypre_PFMGSetupInterpOp_CC0_SS9 ( i, A, A_dbox, cdir, stride, stridec, start, startc, loop_size, P_dbox, Pstenc0, Pstenc1, Pp0, Pp1, rap_type, P_stencil_shape ); break; case 7: hypre_PFMGSetupInterpOp_CC0_SS7 ( i, A, A_dbox, cdir, stride, stridec, start, startc, loop_size, P_dbox, Pstenc0, Pstenc1, Pp0, Pp1, rap_type, P_stencil_shape ); break; case 15: hypre_PFMGSetupInterpOp_CC0_SS15 ( i, A, A_dbox, cdir, stride, stridec, start, startc, loop_size, P_dbox, Pstenc0, Pstenc1, Pp0, Pp1, rap_type, P_stencil_shape ); break; case 19: hypre_PFMGSetupInterpOp_CC0_SS19 ( i, A, A_dbox, cdir, stride, stridec, start, startc, loop_size, P_dbox, Pstenc0, Pstenc1, Pp0, Pp1, rap_type, P_stencil_shape ); break; case 27: hypre_PFMGSetupInterpOp_CC0_SS27 ( i, A, A_dbox, cdir, stride, stridec, start, startc, loop_size, P_dbox, Pstenc0, Pstenc1, Pp0, Pp1, rap_type, P_stencil_shape ); break; default: /* hypre_PFMGSetupInterpOp_CC0 ( i, A, A_dbox, cdir, stride, stridec, start, startc, loop_size, P_dbox, Pstenc0, Pstenc1, Pp0, Pp1, rap_type, si0, si1 ); */ hypre_printf("hypre error: unsupported stencil size %d\n", stencil_size); hypre_MPI_Abort(hypre_MPI_COMM_WORLD, 1); } #endif } } #if 0 hypre_StructMatrixAssemble(P); #else hypre_StructInterpAssemble(A, P, 0, cdir, findex, stride); #endif HYPRE_ANNOTATE_FUNC_END; return hypre_error_flag; } #if CC0_IMPLEMENTATION == 0 HYPRE_Int hypre_PFMGSetupInterpOp_CC0 ( HYPRE_Int i, /* box index */ hypre_StructMatrix *A, hypre_Box *A_dbox, HYPRE_Int cdir, hypre_Index stride, hypre_Index stridec, hypre_Index start, hypre_IndexRef startc, hypre_Index loop_size, hypre_Box *P_dbox, HYPRE_Int Pstenc0, HYPRE_Int Pstenc1, HYPRE_Real *Pp0, HYPRE_Real *Pp1, HYPRE_Int rap_type, HYPRE_Int si0, HYPRE_Int si1 ) { hypre_StructStencil *stencil = hypre_StructMatrixStencil(A); hypre_Index *stencil_shape = hypre_StructStencilShape(stencil); HYPRE_Int stencil_size = hypre_StructStencilSize(stencil); HYPRE_Int warning_cnt = 0; HYPRE_Int data_location = hypre_StructGridDataLocation(hypre_StructMatrixGrid(A)); HYPRE_Int **data_indices = hypre_StructMatrixDataIndices(A); HYPRE_Complex *matrixA_data = hypre_StructMatrixData(A); HYPRE_Int *data_indices_boxi_d; hypre_Index *stencil_shape_d; HYPRE_MemoryLocation memory_location = hypre_StructMatrixMemoryLocation(A); if (hypre_GetExecPolicy1(memory_location) == HYPRE_EXEC_DEVICE) { data_indices_boxi_d = hypre_TAlloc(HYPRE_Int, stencil_size, memory_location); stencil_shape_d = hypre_TAlloc(hypre_Index, stencil_size, memory_location); hypre_TMemcpy(data_indices_boxi_d, data_indices[i], HYPRE_Int, stencil_size, memory_location, HYPRE_MEMORY_HOST); hypre_TMemcpy(stencil_shape_d, stencil_shape, hypre_Index, stencil_size, memory_location, HYPRE_MEMORY_HOST); } else { data_indices_boxi_d = data_indices[i]; stencil_shape_d = stencil_shape; } #define DEVICE_VAR is_device_ptr(Pp0,Pp1,matrixA_data,stencil_shape_d,data_indices_boxi_d) hypre_BoxLoop2Begin(hypre_StructMatrixNDim(A), loop_size, A_dbox, start, stride, Ai, P_dbox, startc, stridec, Pi); { HYPRE_Int si, mrk0, mrk1, Astenc; HYPRE_Real center; HYPRE_Real *Ap; center = 0.0; Pp0[Pi] = 0.0; Pp1[Pi] = 0.0; mrk0 = 0; mrk1 = 0; for (si = 0; si < stencil_size; si++) { #if 0 //defined(HYPRE_USING_CUDA) || defined(HYPRE_USING_HIP) if (data_location != HYPRE_MEMORY_HOST) { Ap = matrixA_data + data_indices_boxi_d[si]; Astenc = hypre_IndexD(stencil_shape_d[si], cdir); } else { Ap = hypre_StructMatrixBoxData(A, i, si); Astenc = hypre_IndexD(stencil_shape[si], cdir); } #else Ap = matrixA_data + data_indices_boxi_d[si]; Astenc = hypre_IndexD(stencil_shape_d[si], cdir); #endif if (Astenc == 0) { center += Ap[Ai]; } else if (Astenc == Pstenc0) { Pp0[Pi] -= Ap[Ai]; } else if (Astenc == Pstenc1) { Pp1[Pi] -= Ap[Ai]; } if (si == si0 && Ap[Ai] == 0.0) { mrk0++; } if (si == si1 && Ap[Ai] == 0.0) { mrk1++; } } if (!center) { //warning_cnt++; Pp0[Pi] = 0.0; Pp1[Pi] = 0.0; } else { Pp0[Pi] /= center; Pp1[Pi] /= center; } /*---------------------------------------------- * Set interpolation weight to zero, if stencil * entry in same direction is zero. Prevents * interpolation and operator stencils reaching * outside domain. *----------------------------------------------*/ if (mrk0 != 0) { Pp0[Pi] = 0.0; } if (mrk1 != 0) { Pp1[Pi] = 0.0; } } hypre_BoxLoop2End(Ai, Pi); #undef DEVICE_VAR if (warning_cnt) { hypre_error_w_msg(HYPRE_ERROR_GENERIC, "Warning 0 center in interpolation. Setting interp = 0."); } if (hypre_GetExecPolicy1(memory_location) == HYPRE_EXEC_DEVICE) { hypre_TFree(data_indices_boxi_d, memory_location); hypre_TFree(stencil_shape_d, memory_location); } return hypre_error_flag; } #endif #if CC0_IMPLEMENTATION == 1 HYPRE_Int hypre_PFMGSetupInterpOp_CC0 ( HYPRE_Int i, /* box index */ hypre_StructMatrix *A, hypre_Box *A_dbox, HYPRE_Int cdir, hypre_Index stride, hypre_Index stridec, hypre_Index start, hypre_IndexRef startc, hypre_Index loop_size, hypre_Box *P_dbox, HYPRE_Int Pstenc0, HYPRE_Int Pstenc1, HYPRE_Real *Pp0, HYPRE_Real *Pp1, HYPRE_Int rap_type, HYPRE_Int si0, HYPRE_Int si1 ) { hypre_StructStencil *stencil = hypre_StructMatrixStencil(A); hypre_Index *stencil_shape = hypre_StructStencilShape(stencil); HYPRE_Int stencil_size = hypre_StructStencilSize(stencil); HYPRE_Int warning_cnt = 0; HYPRE_Int dim, si, loop_length = 1, Astenc; HYPRE_Real *Ap, *center, *Ap0, *Ap1; HYPRE_MemoryLocation memory_location = hypre_StructMatrixMemoryLocation(A); for (dim = 0; dim < hypre_StructMatrixNDim(A); dim++) { loop_length *= loop_size[dim]; } center = hypre_CTAlloc(HYPRE_Real, loop_length, memory_location); for (si = 0; si < stencil_size; si++) { Ap = hypre_StructMatrixBoxData(A, i, si); Astenc = hypre_IndexD(stencil_shape[si], cdir); if (Astenc == 0) { #define DEVICE_VAR is_device_ptr(center, Ap) hypre_BoxLoop2Begin(hypre_StructMatrixNDim(A), loop_size, A_dbox, start, stride, Ai, P_dbox, startc, stridec, Pi) center[idx] += Ap[Ai]; hypre_BoxLoop2End(Ai, Pi) #undef DEVICE_VAR } else if (Astenc == Pstenc0) { #define DEVICE_VAR is_device_ptr(Pp0, Ap) hypre_BoxLoop2Begin(hypre_StructMatrixNDim(A), loop_size, A_dbox, start, stride, Ai, P_dbox, startc, stridec, Pi) Pp0[Pi] -= Ap[Ai]; hypre_BoxLoop2End(Ai, Pi) #undef DEVICE_VAR } else if (Astenc == Pstenc1) { #define DEVICE_VAR is_device_ptr(Pp1, Ap) hypre_BoxLoop2Begin(hypre_StructMatrixNDim(A), loop_size, A_dbox, start, stride, Ai, P_dbox, startc, stridec, Pi) Pp1[Pi] -= Ap[Ai]; hypre_BoxLoop2End(Ai, Pi) #undef DEVICE_VAR } } Ap0 = hypre_StructMatrixBoxData(A, i, si0); Ap1 = hypre_StructMatrixBoxData(A, i, si1); #define DEVICE_VAR is_device_ptr(center, Pp0, Pp1, Ap0, Ap1) hypre_BoxLoop2Begin(hypre_StructMatrixNDim(A), loop_size, A_dbox, start, stride, Ai, P_dbox, startc, stridec, Pi) HYPRE_Real cval = center[idx]; if (Ap0[Ai] == 0.0 || cval == 0.0) { Pp0[Pi] = 0.0; } else { Pp0[Pi] /= cval; } if (Ap1[Ai] == 0.0 || cval == 0.0) { Pp1[Pi] = 0.0; } else { Pp1[Pi] /= cval; } hypre_BoxLoop2End(Ai, Pi) #undef DEVICE_VAR if (warning_cnt) { hypre_error_w_msg(HYPRE_ERROR_GENERIC, "Warning 0 center in interpolation. Setting interp = 0."); } hypre_TFree(center, memory_location); return hypre_error_flag; } #endif HYPRE_Int hypre_PFMGSetupInterpOp_CC1 ( HYPRE_Int i, /* box index, doesn't matter */ hypre_StructMatrix *A, hypre_Box *A_dbox, HYPRE_Int cdir, hypre_Index stride, hypre_Index stridec, hypre_Index start, hypre_IndexRef startc, hypre_Index loop_size, hypre_Box *P_dbox, HYPRE_Int Pstenc0, HYPRE_Int Pstenc1, HYPRE_Real *Pp0, HYPRE_Real *Pp1, HYPRE_Int rap_type, HYPRE_Int si0, HYPRE_Int si1 ) { HYPRE_UNUSED_VAR(A_dbox); HYPRE_UNUSED_VAR(stride); HYPRE_UNUSED_VAR(stridec); HYPRE_UNUSED_VAR(start); HYPRE_UNUSED_VAR(startc); HYPRE_UNUSED_VAR(loop_size); HYPRE_UNUSED_VAR(P_dbox); HYPRE_UNUSED_VAR(rap_type); HYPRE_Int si; HYPRE_Int Ai, Pi; HYPRE_Real *Ap; HYPRE_Real center; HYPRE_Int Astenc; HYPRE_Int mrk0, mrk1; hypre_StructStencil *stencil = hypre_StructMatrixStencil(A); hypre_Index *stencil_shape = hypre_StructStencilShape(stencil); HYPRE_Int stencil_size = hypre_StructStencilSize(stencil); HYPRE_Int warning_cnt = 0; Ai = hypre_CCBoxIndexRank(A_dbox, start ); Pi = hypre_CCBoxIndexRank(P_dbox, startc); center = 0.0; Pp0[Pi] = 0.0; Pp1[Pi] = 0.0; mrk0 = 0; mrk1 = 0; for (si = 0; si < stencil_size; si++) { Ap = hypre_StructMatrixBoxData(A, i, si); Astenc = hypre_IndexD(stencil_shape[si], cdir); if (Astenc == 0) { center += Ap[Ai]; } else if (Astenc == Pstenc0) { Pp0[Pi] -= Ap[Ai]; } else if (Astenc == Pstenc1) { Pp1[Pi] -= Ap[Ai]; } if (si == si0 && Ap[Ai] == 0.0) { mrk0++; } if (si == si1 && Ap[Ai] == 0.0) { mrk1++; } } if (!center) { warning_cnt++; Pp0[Pi] = 0.0; Pp1[Pi] = 0.0; } else { Pp0[Pi] /= center; Pp1[Pi] /= center; } /*---------------------------------------------- * Set interpolation weight to zero, if stencil * entry in same direction is zero. * For variable coefficients, this was meant to prevent * interpolation and operator stencils from reaching * outside the domain. * For constant coefficients it will hardly ever happen * (means the stencil point shouldn't have been defined there) * but it's possible and then it would still make sense to * do this. *----------------------------------------------*/ if (mrk0 != 0) { Pp0[Pi] = 0.0; } if (mrk1 != 0) { Pp1[Pi] = 0.0; } if (warning_cnt) { hypre_error_w_msg( HYPRE_ERROR_GENERIC, "Warning 0 center in interpolation. Setting interp = 0."); } return hypre_error_flag; } HYPRE_Int hypre_PFMGSetupInterpOp_CC2 ( HYPRE_Int i, /* box index */ hypre_StructMatrix *A, hypre_Box *A_dbox, HYPRE_Int cdir, hypre_Index stride, hypre_Index stridec, hypre_Index start, hypre_IndexRef startc, hypre_Index loop_size, hypre_Box *P_dbox, HYPRE_Int Pstenc0, HYPRE_Int Pstenc1, HYPRE_Real *Pp0, HYPRE_Real *Pp1, HYPRE_Int rap_type, HYPRE_Int si0, HYPRE_Int si1 ) { HYPRE_Int si; HYPRE_Int Ai; HYPRE_Int Pi; HYPRE_Real *Ap; HYPRE_Real P0, P1; HYPRE_Real center_offd; HYPRE_Int Astenc; HYPRE_Int mrk0_offd, mrk1_offd; hypre_StructStencil *stencil = hypre_StructMatrixStencil(A); hypre_Index *stencil_shape = hypre_StructStencilShape(stencil); HYPRE_Int stencil_size = hypre_StructStencilSize(stencil); hypre_Index diag_index; HYPRE_Int diag_rank; HYPRE_Int warning_cnt = 0; hypre_SetIndex3(diag_index, 0, 0, 0); diag_rank = hypre_StructStencilElementRank(stencil, diag_index); if ( rap_type != 0 ) { /* simply force P to be constant coefficient, all 0.5's */ Pi = hypre_CCBoxIndexRank(P_dbox, startc); Pp0[Pi] = 0.5; Pp1[Pi] = 0.5; } else { /* Most coeffients of A go into P like for constant_coefficient=1. But P is entirely variable coefficient, because the diagonal of A is variable, and hence "center" below is variable. So we use the constant coefficient calculation to initialize the diagonal's variable coefficient calculation (which is like constant_coefficient=0). */ Ai = hypre_CCBoxIndexRank(A_dbox, start ); center_offd = 0.0; P0 = 0.0; P1 = 0.0; mrk0_offd = 0; mrk1_offd = 0; for (si = 0; si < stencil_size; si++) { if ( si != diag_rank ) { Ap = hypre_StructMatrixBoxData(A, i, si); Astenc = hypre_IndexD(stencil_shape[si], cdir); if (Astenc == 0) { center_offd += Ap[Ai]; } else if (Astenc == Pstenc0) { P0 -= Ap[Ai]; } else if (Astenc == Pstenc1) { P1 -= Ap[Ai]; } if (si == si0 && Ap[Ai] == 0.0) { mrk0_offd++; } if (si == si1 && Ap[Ai] == 0.0) { mrk1_offd++; } } } si = diag_rank; HYPRE_Real *Ap = hypre_StructMatrixBoxData(A, i, si); #define DEVICE_VAR is_device_ptr(Pp0,Pp1,Ap) hypre_BoxLoop2Begin(hypre_StructMatrixNDim(A), loop_size, A_dbox, start, stride, Ai, P_dbox, startc, stridec, Pi); { HYPRE_Int mrk0, mrk1; HYPRE_Real center; HYPRE_Real p0val, p1val; p0val = P0; p1val = P1; center = center_offd; mrk0 = mrk0_offd; mrk1 = mrk1_offd; /* RL: Astenc is only needed for assertion, comment out Astenc = hypre_IndexD(stencil_shape[si], cdir); hypre_assert( Astenc==0 ); */ center += Ap[Ai]; //if (si == si0 && Ap[Ai] == 0.0) // mrk0++; //if (si == si1 && Ap[Ai] == 0.0) // mrk1++; if (!center) { //warning_cnt++; p0val = 0.0; p1val = 0.0; } else { p0val /= center; p1val /= center; } /*---------------------------------------------- * Set interpolation weight to zero, if stencil * entry in same direction is zero. Prevents * interpolation and operator stencils reaching * outside domain. *----------------------------------------------*/ if (mrk0 != 0) { p0val = 0.0; } if (mrk1 != 0) { p1val = 0.0; } Pp0[Pi] = p0val; Pp1[Pi] = p1val; } hypre_BoxLoop2End(Ai, Pi); #undef DEVICE_VAR } if (warning_cnt) { hypre_error_w_msg(HYPRE_ERROR_GENERIC, "Warning 0 center in interpolation. Setting interp = 0."); } return hypre_error_flag; } #if CC0_IMPLEMENTATION > 1 HYPRE_Int hypre_PFMGSetupInterpOp_CC0_SS5 ( HYPRE_Int i, /* box index */ hypre_StructMatrix *A, hypre_Box *A_dbox, HYPRE_Int cdir, hypre_Index stride, hypre_Index stridec, hypre_Index start, hypre_IndexRef startc, hypre_Index loop_size, hypre_Box *P_dbox, HYPRE_Int Pstenc0, HYPRE_Int Pstenc1, HYPRE_Real *Pp0, HYPRE_Real *Pp1, HYPRE_Int rap_type, hypre_Index *P_stencil_shape ) { HYPRE_UNUSED_VAR(rap_type); HYPRE_UNUSED_VAR(Pstenc1); //hypre_StructStencil *stencil = hypre_StructMatrixStencil(A); //hypre_Index *stencil_shape = hypre_StructStencilShape(stencil); //HYPRE_Int stencil_size = hypre_StructStencilSize(stencil); //HYPRE_Int warning_cnt= 0; hypre_Index index; HYPRE_Real *a_cc, *a_cw, *a_ce, *a_cs, *a_cn; HYPRE_Real *p0, *p1; p0 = hypre_StructMatrixExtractPointerByIndex(A, i, P_stencil_shape[0]); p1 = hypre_StructMatrixExtractPointerByIndex(A, i, P_stencil_shape[1]); /*----------------------------------------------------------------- * Extract pointers for 5-point fine grid operator: * * a_cc is pointer for center coefficient * a_cw is pointer for west coefficient * a_ce is pointer for east coefficient * a_cs is pointer for south coefficient * a_cn is pointer for north coefficient *-----------------------------------------------------------------*/ hypre_SetIndex3(index, 0, 0, 0); a_cc = hypre_StructMatrixExtractPointerByIndex(A, i, index); hypre_SetIndex3(index, -1, 0, 0); a_cw = hypre_StructMatrixExtractPointerByIndex(A, i, index); hypre_SetIndex3(index, 1, 0, 0); a_ce = hypre_StructMatrixExtractPointerByIndex(A, i, index); hypre_SetIndex3(index, 0, -1, 0); a_cs = hypre_StructMatrixExtractPointerByIndex(A, i, index); hypre_SetIndex3(index, 0, 1, 0); a_cn = hypre_StructMatrixExtractPointerByIndex(A, i, index); #define DEVICE_VAR is_device_ptr(a_cc,a_cs,a_cn,a_cw,a_ce,Pp0,Pp1,p0,p1) hypre_BoxLoop2Begin(hypre_StructMatrixNDim(A), loop_size, A_dbox, start, stride, Ai, P_dbox, startc, stridec, Pi); { HYPRE_Real center, left, right; switch (cdir) { case 0: center = a_cc[Ai] + a_cs[Ai] + a_cn[Ai]; left = -a_cw[Ai]; right = -a_ce[Ai]; break; case 1: default: center = a_cc[Ai] + a_cw[Ai] + a_ce[Ai]; left = -a_cs[Ai]; right = -a_cn[Ai]; break; } if (!center) { //warning_cnt++; Pp0[Pi] = 0.0; Pp1[Pi] = 0.0; } else { switch (Pstenc0) { case -1: Pp0[Pi] = left / center; break; case 1: Pp0[Pi] = right / center; break; } switch (Pstenc1) { case -1: Pp1[Pi] = left / center; break; case 1: Pp1[Pi] = right / center; break; } } if (p0[Ai] == 0.0) { Pp0[Pi] = 0.0; } if (p1[Ai] == 0.0) { Pp1[Pi] = 0.0; } /*---------------------------------------------- * Set interpolation weight to zero, if stencil * entry in same direction is zero. Prevents * interpolation and operator stencils reaching * outside domain. *----------------------------------------------*/ //if (mrk0 != 0) // Pp0[Pi] = 0.0; //if (mrk1 != 0) // Pp1[Pi] = 0.0; } hypre_BoxLoop2End(Ai, Pi); #undef DEVICE_VAR return hypre_error_flag; } HYPRE_Int hypre_PFMGSetupInterpOp_CC0_SS9 ( HYPRE_Int i, /* box index */ hypre_StructMatrix *A, hypre_Box *A_dbox, HYPRE_Int cdir, hypre_Index stride, hypre_Index stridec, hypre_Index start, hypre_IndexRef startc, hypre_Index loop_size, hypre_Box *P_dbox, HYPRE_Int Pstenc0, HYPRE_Int Pstenc1, HYPRE_Real *Pp0, HYPRE_Real *Pp1, HYPRE_Int rap_type, hypre_Index *P_stencil_shape ) { HYPRE_UNUSED_VAR(rap_type); HYPRE_UNUSED_VAR(Pstenc1); //hypre_StructStencil *stencil = hypre_StructMatrixStencil(A); //hypre_Index *stencil_shape = hypre_StructStencilShape(stencil); //HYPRE_Int stencil_size = hypre_StructStencilSize(stencil); //HYPRE_Int warning_cnt= 0; hypre_Index index; HYPRE_Real *a_cc, *a_cw, *a_ce, *a_cs, *a_cn; HYPRE_Real *a_csw, *a_cse, *a_cne, *a_cnw; HYPRE_Real *p0, *p1; p0 = hypre_StructMatrixExtractPointerByIndex(A, i, P_stencil_shape[0]); p1 = hypre_StructMatrixExtractPointerByIndex(A, i, P_stencil_shape[1]); /*----------------------------------------------------------------- * Extract pointers for 5-point grid operator: * * a_cc is pointer for center coefficient * a_cw is pointer for west coefficient * a_ce is pointer for east coefficient * a_cs is pointer for south coefficient * a_cn is pointer for north coefficient *-----------------------------------------------------------------*/ hypre_SetIndex3(index, 0, 0, 0); a_cc = hypre_StructMatrixExtractPointerByIndex(A, i, index); hypre_SetIndex3(index, -1, 0, 0); a_cw = hypre_StructMatrixExtractPointerByIndex(A, i, index); hypre_SetIndex3(index, 1, 0, 0); a_ce = hypre_StructMatrixExtractPointerByIndex(A, i, index); hypre_SetIndex3(index, 0, -1, 0); a_cs = hypre_StructMatrixExtractPointerByIndex(A, i, index); hypre_SetIndex3(index, 0, 1, 0); a_cn = hypre_StructMatrixExtractPointerByIndex(A, i, index); /*----------------------------------------------------------------- * Extract additional pointers for 9-point grid operator: * * a_csw is pointer for southwest coefficient * a_cse is pointer for southeast coefficient * a_cnw is pointer for northwest coefficient * a_cne is pointer for northeast coefficient *-----------------------------------------------------------------*/ hypre_SetIndex3(index, -1, -1, 0); a_csw = hypre_StructMatrixExtractPointerByIndex(A, i, index); hypre_SetIndex3(index, 1, -1, 0); a_cse = hypre_StructMatrixExtractPointerByIndex(A, i, index); hypre_SetIndex3(index, -1, 1, 0); a_cnw = hypre_StructMatrixExtractPointerByIndex(A, i, index); hypre_SetIndex3(index, 1, 1, 0); a_cne = hypre_StructMatrixExtractPointerByIndex(A, i, index); #define DEVICE_VAR is_device_ptr(a_cc,a_cs,a_cn,a_cw,a_csw,a_cnw,a_ce,a_cse,a_cne,Pp0,Pp1,p0,p1) hypre_BoxLoop2Begin(hypre_StructMatrixNDim(A), loop_size, A_dbox, start, stride, Ai, P_dbox, startc, stridec, Pi); { HYPRE_Real center, left, right; switch (cdir) { case 0: center = a_cc[Ai] + a_cs[Ai] + a_cn[Ai]; left = -a_cw[Ai] - a_csw[Ai] - a_cnw[Ai]; right = -a_ce[Ai] - a_cse[Ai] - a_cne[Ai]; break; case 1: default: center = a_cc[Ai] + a_cw[Ai] + a_ce[Ai]; left = -a_cs[Ai] - a_csw[Ai] - a_cse[Ai]; right = -a_cn[Ai] - a_cnw[Ai] - a_cne[Ai]; break; }; if (!center) { //warning_cnt++; Pp0[Pi] = 0.0; Pp1[Pi] = 0.0; } else { switch (Pstenc0) { case -1: Pp0[Pi] = left / center; Pp1[Pi] = right / center; break; case 1: Pp0[Pi] = right / center; Pp1[Pi] = left / center; break; }; /* switch (Pstenc1) { case -1: Pp1[Pi] = left/center;break; case 1: Pp1[Pi] = right/center;break; }; */ } if (p0[Ai] == 0.0) { Pp0[Pi] = 0.0; } if (p1[Ai] == 0.0) { Pp1[Pi] = 0.0; } } hypre_BoxLoop2End(Ai, Pi); #undef DEVICE_VAR return hypre_error_flag; } HYPRE_Int hypre_PFMGSetupInterpOp_CC0_SS7 ( HYPRE_Int i, /* box index */ hypre_StructMatrix *A, hypre_Box *A_dbox, HYPRE_Int cdir, hypre_Index stride, hypre_Index stridec, hypre_Index start, hypre_IndexRef startc, hypre_Index loop_size, hypre_Box *P_dbox, HYPRE_Int Pstenc0, HYPRE_Int Pstenc1, HYPRE_Real *Pp0, HYPRE_Real *Pp1, HYPRE_Int rap_type, hypre_Index *P_stencil_shape ) { HYPRE_UNUSED_VAR(rap_type); HYPRE_UNUSED_VAR(Pstenc1); //hypre_StructStencil *stencil = hypre_StructMatrixStencil(A); //hypre_Index *stencil_shape = hypre_StructStencilShape(stencil); //HYPRE_Int stencil_size = hypre_StructStencilSize(stencil); //HYPRE_Int warning_cnt= 0; hypre_Index index; HYPRE_Real *a_cc, *a_cw, *a_ce, *a_cs, *a_cn, *a_ac, *a_bc; HYPRE_Real *p0, *p1; p0 = hypre_StructMatrixExtractPointerByIndex(A, i, P_stencil_shape[0]); p1 = hypre_StructMatrixExtractPointerByIndex(A, i, P_stencil_shape[1]); /*----------------------------------------------------------------- * Extract pointers for 7-point grid operator: * * a_cc is pointer for center coefficient * a_cw is pointer for west coefficient in same plane * a_ce is pointer for east coefficient in same plane * a_cs is pointer for south coefficient in same plane * a_cn is pointer for north coefficient in same plane * a_ac is pointer for center coefficient in plane above * a_bc is pointer for center coefficient in plane below *-----------------------------------------------------------------*/ hypre_SetIndex3(index, 0, 0, 0); a_cc = hypre_StructMatrixExtractPointerByIndex(A, i, index); hypre_SetIndex3(index, -1, 0, 0); a_cw = hypre_StructMatrixExtractPointerByIndex(A, i, index); hypre_SetIndex3(index, 1, 0, 0); a_ce = hypre_StructMatrixExtractPointerByIndex(A, i, index); hypre_SetIndex3(index, 0, -1, 0); a_cs = hypre_StructMatrixExtractPointerByIndex(A, i, index); hypre_SetIndex3(index, 0, 1, 0); a_cn = hypre_StructMatrixExtractPointerByIndex(A, i, index); hypre_SetIndex3(index, 0, 0, 1); a_ac = hypre_StructMatrixExtractPointerByIndex(A, i, index); hypre_SetIndex3(index, 0, 0, -1); a_bc = hypre_StructMatrixExtractPointerByIndex(A, i, index); #define DEVICE_VAR is_device_ptr(a_cc,a_cs,a_cn,a_ac,a_bc,a_cw,a_ce,Pp0,Pp1,p0,p1) hypre_BoxLoop2Begin(hypre_StructMatrixNDim(A), loop_size, A_dbox, start, stride, Ai, P_dbox, startc, stridec, Pi); { HYPRE_Real center, left, right; switch (cdir) { case 0: center = a_cc[Ai] + a_cs[Ai] + a_cn[Ai] + a_ac[Ai] + a_bc[Ai]; left = -a_cw[Ai]; right = -a_ce[Ai]; break; case 1: center = a_cc[Ai] + a_cw[Ai] + a_ce[Ai] + a_ac[Ai] + a_bc[Ai] ; left = -a_cs[Ai]; right = -a_cn[Ai]; break; case 2: default: center = a_cc[Ai] + a_cw[Ai] + a_ce[Ai] + a_cs[Ai] + a_cn[Ai] ; left = -a_bc[Ai]; right = -a_ac[Ai]; break; }; if (!center) { Pp0[Pi] = 0.0; Pp1[Pi] = 0.0; } else { switch (Pstenc0) { case -1: Pp0[Pi] = left / center; Pp1[Pi] = right / center; break; case 1: Pp0[Pi] = right / center; Pp1[Pi] = left / center; break; }; /* switch (Pstenc1) { case -1: Pp1[Pi] = left/center;break; case 1: Pp1[Pi] = right/center;break; }; */ } if (p0[Ai] == 0.0) { Pp0[Pi] = 0.0; } if (p1[Ai] == 0.0) { Pp1[Pi] = 0.0; } //printf("%d: %d, Pp0[%d] = %e, Pp1 = %e, %e, %e, %e, cc=%e, cw=%e, ce=%e, cs=%e, cn=%e, bc=%e, ac=%e \n",Ai,cdir, Pi,Pp0[Pi],Pp1[Pi],center, left, right, // a_cc[Ai],a_cw[Ai],a_ce[Ai],a_cs[Ai],a_cn[Ai],a_bc[Ai],a_ac[Ai]); } hypre_BoxLoop2End(Ai, Pi); #undef DEVICE_VAR return hypre_error_flag; } HYPRE_Int hypre_PFMGSetupInterpOp_CC0_SS15 ( HYPRE_Int i, /* box index */ hypre_StructMatrix *A, hypre_Box *A_dbox, HYPRE_Int cdir, hypre_Index stride, hypre_Index stridec, hypre_Index start, hypre_IndexRef startc, hypre_Index loop_size, hypre_Box *P_dbox, HYPRE_Int Pstenc0, HYPRE_Int Pstenc1, HYPRE_Real *Pp0, HYPRE_Real *Pp1, HYPRE_Int rap_type, hypre_Index *P_stencil_shape ) { HYPRE_UNUSED_VAR(rap_type); HYPRE_UNUSED_VAR(Pstenc1); hypre_Index index; HYPRE_Int stencil_type15; HYPRE_Real *a_cc, *a_cw, *a_ce, *a_cs, *a_cn, *a_ac, *a_bc; HYPRE_Real *a_aw, *a_ae, *a_as, *a_an, *a_bw, *a_be, *a_bs, *a_bn; HYPRE_Real *a_csw, *a_cse, *a_cnw, *a_cne; HYPRE_Real *p0, *p1; p0 = hypre_StructMatrixExtractPointerByIndex(A, i, P_stencil_shape[0]); p1 = hypre_StructMatrixExtractPointerByIndex(A, i, P_stencil_shape[1]); /*----------------------------------------------------------------- * Extract pointers for 7-point grid operator: * * a_cc is pointer for center coefficient * a_cw is pointer for west coefficient in same plane * a_ce is pointer for east coefficient in same plane * a_cs is pointer for south coefficient in same plane * a_cn is pointer for north coefficient in same plane * a_ac is pointer for center coefficient in plane above * a_bc is pointer for center coefficient in plane below *-----------------------------------------------------------------*/ hypre_SetIndex3(index, 0, 0, 0); a_cc = hypre_StructMatrixExtractPointerByIndex(A, i, index); hypre_SetIndex3(index, -1, 0, 0); a_cw = hypre_StructMatrixExtractPointerByIndex(A, i, index); hypre_SetIndex3(index, 1, 0, 0); a_ce = hypre_StructMatrixExtractPointerByIndex(A, i, index); hypre_SetIndex3(index, 0, -1, 0); a_cs = hypre_StructMatrixExtractPointerByIndex(A, i, index); hypre_SetIndex3(index, 0, 1, 0); a_cn = hypre_StructMatrixExtractPointerByIndex(A, i, index); hypre_SetIndex3(index, 0, 0, 1); a_ac = hypre_StructMatrixExtractPointerByIndex(A, i, index); hypre_SetIndex3(index, 0, 0, -1); a_bc = hypre_StructMatrixExtractPointerByIndex(A, i, index); /*----------------------------------------------------------------- * Extract additional pointers for 15-point fine grid operator: * * a_aw is pointer for west coefficient in plane above * a_ae is pointer for east coefficient in plane above * a_as is pointer for south coefficient in plane above * a_an is pointer for north coefficient in plane above * a_bw is pointer for west coefficient in plane below * a_be is pointer for east coefficient in plane below * a_bs is pointer for south coefficient in plane below * a_bn is pointer for north coefficient in plane below * a_csw is pointer for southwest coefficient in same plane * a_cse is pointer for southeast coefficient in same plane * a_cnw is pointer for northwest coefficient in same plane * a_cne is pointer for northeast coefficient in same plane *-----------------------------------------------------------------*/ hypre_SetIndex3(index, -1, 0, 1); a_aw = hypre_StructMatrixExtractPointerByIndex(A, i, index); hypre_SetIndex3(index, 1, 0, 1); a_ae = hypre_StructMatrixExtractPointerByIndex(A, i, index); hypre_SetIndex3(index, 0, -1, 1); a_as = hypre_StructMatrixExtractPointerByIndex(A, i, index); hypre_SetIndex3(index, 0, 1, 1); a_an = hypre_StructMatrixExtractPointerByIndex(A, i, index); hypre_SetIndex3(index, -1, 0, -1); a_bw = hypre_StructMatrixExtractPointerByIndex(A, i, index); hypre_SetIndex3(index, 1, 0, -1); a_be = hypre_StructMatrixExtractPointerByIndex(A, i, index); hypre_SetIndex3(index, 0, -1, -1); a_bs = hypre_StructMatrixExtractPointerByIndex(A, i, index); hypre_SetIndex3(index, 0, 1, -1); a_bn = hypre_StructMatrixExtractPointerByIndex(A, i, index); hypre_SetIndex3(index, -1, -1, 0); a_csw = hypre_StructMatrixExtractPointerByIndex(A, i, index); hypre_SetIndex3(index, 1, -1, 0); a_cse = hypre_StructMatrixExtractPointerByIndex(A, i, index); hypre_SetIndex3(index, -1, 1, 0); a_cnw = hypre_StructMatrixExtractPointerByIndex(A, i, index); hypre_SetIndex3(index, 1, 1, 0); a_cne = hypre_StructMatrixExtractPointerByIndex(A, i, index); if (a_csw) { if (a_as) { stencil_type15 = 1; } else { stencil_type15 = 0; } } else { stencil_type15 = 2; } //printf("loop_size %d %d %d, cdir %d, %p %p %p %p %p %p %p %p %p %p %p %p %p %p %p\n", loop_size[0], loop_size[1], loop_size[2], cdir, a_cc, a_cw, a_ce, a_ac, a_bc, a_cs, a_as, a_bs, a_csw, a_cse, a_cn, a_an, a_bn, a_cnw, a_cne); #define DEVICE_VAR is_device_ptr(a_cc,a_cs,a_cn,a_ac,a_bc,a_as,a_an,a_bs,a_bn,a_cw,a_aw,a_bw,a_ce,a_ae,a_be,a_cnw,a_cne,a_csw,a_cse,Pp0,Pp1,p0,p1) if (stencil_type15 == 0) { hypre_BoxLoop2Begin(hypre_StructMatrixNDim(A), loop_size, A_dbox, start, stride, Ai, P_dbox, startc, stridec, Pi); { HYPRE_Real center, left, right; switch (cdir) { case 0: center = a_cc[Ai] + a_cs[Ai] + a_cn[Ai] + a_ac[Ai] + a_bc[Ai]; left = -a_cw[Ai] - a_aw[Ai] - a_bw[Ai] - a_csw[Ai] - a_cnw[Ai]; right = -a_ce[Ai] - a_ae[Ai] - a_be[Ai] - a_cse[Ai] - a_cne[Ai]; break; case 1: center = a_cc[Ai] + a_cw[Ai] + a_ce[Ai] + a_ac[Ai] + a_aw[Ai] + a_ae[Ai] + a_bc[Ai] + a_bw[Ai] + a_be[Ai]; left = -a_cs[Ai] - a_csw[Ai] - a_cse[Ai]; /* front */ right = -a_cn[Ai] - a_cnw[Ai] - a_cne[Ai]; /* back */ break; case 2: default: center = a_cc[Ai] + a_cw[Ai] + a_ce[Ai] + a_cs[Ai] + a_cn[Ai] + a_csw[Ai] + a_cse[Ai] + a_cnw[Ai] - a_cne[Ai]; left = -a_bc[Ai] - a_bw[Ai] - a_be[Ai]; /* below */ right = -a_ac[Ai] - a_aw[Ai] - a_ae[Ai]; /* above */ break; } if (!center) { Pp0[Pi] = 0.0; Pp1[Pi] = 0.0; } else { switch (Pstenc0) { case -1: Pp0[Pi] = left / center; Pp1[Pi] = right / center; break; case 1: Pp0[Pi] = right / center; Pp1[Pi] = left / center; break; } } if (p0[Ai] == 0.0) { Pp0[Pi] = 0.0; } if (p1[Ai] == 0.0) { Pp1[Pi] = 0.0; } } hypre_BoxLoop2End(Ai, Pi); } else if (stencil_type15 == 1) { hypre_BoxLoop2Begin(hypre_StructMatrixNDim(A), loop_size, A_dbox, start, stride, Ai, P_dbox, startc, stridec, Pi); { HYPRE_Real center, left, right; switch (cdir) { case 0: center = a_cc[Ai] + a_cs[Ai] + a_cn[Ai] + a_ac[Ai] + a_as[Ai] + a_an[Ai] + a_bc[Ai] + a_bs[Ai] + a_bn[Ai]; left = -a_cw[Ai] - a_csw[Ai] - a_cnw[Ai]; right = -a_ce[Ai] - a_cse[Ai] - a_cne[Ai]; break; case 1: center = a_cc[Ai] + a_cw[Ai] + a_ce[Ai] + a_ac[Ai] + a_bc[Ai]; left = -a_cs[Ai] - a_as[Ai] - a_bs[Ai] - a_csw[Ai] - a_cse[Ai]; /* front */ right = -a_cn[Ai] - a_an[Ai] - a_bn[Ai] - a_cnw[Ai] - a_cne[Ai]; /* back */ break; case 2: default: center = a_cc[Ai] + a_cw[Ai] + a_ce[Ai] + a_cs[Ai] + a_cn[Ai] + a_csw[Ai] + a_cse[Ai] + a_cnw[Ai] + a_cne[Ai]; left = -a_bc[Ai] - a_bs[Ai] - a_bn[Ai]; /* below */ right = -a_ac[Ai] - a_as[Ai] - a_an[Ai]; /* above */ break; } if (!center) { Pp0[Pi] = 0.0; Pp1[Pi] = 0.0; } else { switch (Pstenc0) { case -1: Pp0[Pi] = left / center; Pp1[Pi] = right / center; break; case 1: Pp0[Pi] = right / center; Pp1[Pi] = left / center; break; } } if (p0[Ai] == 0.0) { Pp0[Pi] = 0.0; } if (p1[Ai] == 0.0) { Pp1[Pi] = 0.0; } } hypre_BoxLoop2End(Ai, Pi); } else { hypre_BoxLoop2Begin(hypre_StructMatrixNDim(A), loop_size, A_dbox, start, stride, Ai, P_dbox, startc, stridec, Pi); { HYPRE_Real center, left, right; switch (cdir) { case 0: center = a_cc[Ai] + a_cs[Ai] + a_cn[Ai] + a_ac[Ai] + a_as[Ai] + a_an[Ai] + a_bc[Ai] + a_bs[Ai] + a_bn[Ai]; left = -a_cw[Ai] - a_aw[Ai] - a_bw[Ai]; right = -a_ce[Ai] - a_ae[Ai] - a_be[Ai]; break; case 1: center = a_cc[Ai] + a_cw[Ai] + a_ce[Ai] + a_ac[Ai] + a_aw[Ai] + a_ae[Ai] + a_bc[Ai] + a_bw[Ai] + a_be[Ai]; left = -a_cs[Ai] - a_as[Ai] - a_bs[Ai]; /* front */ right = -a_cn[Ai] - a_an[Ai] - a_bn[Ai]; /* back */ break; case 2: default: center = a_cc[Ai] + a_cw[Ai] + a_ce[Ai] + a_cs[Ai] + a_cn[Ai]; left = -a_bc[Ai] - a_bw[Ai] - a_be[Ai] - a_bs[Ai] - a_bn[Ai]; /* below */ right = -a_ac[Ai] - a_aw[Ai] - a_ae[Ai] - a_as[Ai] - a_an[Ai]; /* above */ break; } if (!center) { Pp0[Pi] = 0.0; Pp1[Pi] = 0.0; } else { switch (Pstenc0) { case -1: Pp0[Pi] = left / center; Pp1[Pi] = right / center; break; case 1: Pp0[Pi] = right / center; Pp1[Pi] = left / center; break; } } if (p0[Ai] == 0.0) { Pp0[Pi] = 0.0; } if (p1[Ai] == 0.0) { Pp1[Pi] = 0.0; } } hypre_BoxLoop2End(Ai, Pi); } #undef DEVICE_VAR return hypre_error_flag; } HYPRE_Int hypre_PFMGSetupInterpOp_CC0_SS19 ( HYPRE_Int i, /* box index */ hypre_StructMatrix *A, hypre_Box *A_dbox, HYPRE_Int cdir, hypre_Index stride, hypre_Index stridec, hypre_Index start, hypre_IndexRef startc, hypre_Index loop_size, hypre_Box *P_dbox, HYPRE_Int Pstenc0, HYPRE_Int Pstenc1, HYPRE_Real *Pp0, HYPRE_Real *Pp1, HYPRE_Int rap_type, hypre_Index *P_stencil_shape ) { HYPRE_UNUSED_VAR(Pstenc1); HYPRE_UNUSED_VAR(rap_type); //hypre_StructStencil *stencil = hypre_StructMatrixStencil(A); // hypre_Index *stencil_shape = hypre_StructStencilShape(stencil); //HYPRE_Int stencil_size = hypre_StructStencilSize(stencil); //HYPRE_Int warning_cnt= 0; hypre_Index index; HYPRE_Real *a_cc, *a_cw, *a_ce, *a_cs, *a_cn, *a_ac, *a_bc; HYPRE_Real *a_csw, *a_cse, *a_cne, *a_cnw; HYPRE_Real *a_aw, *a_ae, *a_as, *a_an, *a_bw, *a_be, *a_bs, *a_bn; HYPRE_Real *p0, *p1; p0 = hypre_StructMatrixExtractPointerByIndex(A, i, P_stencil_shape[0]); p1 = hypre_StructMatrixExtractPointerByIndex(A, i, P_stencil_shape[1]); /*----------------------------------------------------------------- * Extract pointers for 7-point grid operator: * * a_cc is pointer for center coefficient * a_cw is pointer for west coefficient in same plane * a_ce is pointer for east coefficient in same plane * a_cs is pointer for south coefficient in same plane * a_cn is pointer for north coefficient in same plane * a_ac is pointer for center coefficient in plane above * a_bc is pointer for center coefficient in plane below *-----------------------------------------------------------------*/ hypre_SetIndex3(index, 0, 0, 0); a_cc = hypre_StructMatrixExtractPointerByIndex(A, i, index); hypre_SetIndex3(index, -1, 0, 0); a_cw = hypre_StructMatrixExtractPointerByIndex(A, i, index); hypre_SetIndex3(index, 1, 0, 0); a_ce = hypre_StructMatrixExtractPointerByIndex(A, i, index); hypre_SetIndex3(index, 0, -1, 0); a_cs = hypre_StructMatrixExtractPointerByIndex(A, i, index); hypre_SetIndex3(index, 0, 1, 0); a_cn = hypre_StructMatrixExtractPointerByIndex(A, i, index); hypre_SetIndex3(index, 0, 0, 1); a_ac = hypre_StructMatrixExtractPointerByIndex(A, i, index); hypre_SetIndex3(index, 0, 0, -1); a_bc = hypre_StructMatrixExtractPointerByIndex(A, i, index); /*----------------------------------------------------------------- * Extract additional pointers for 19-point fine grid operator: * * a_aw is pointer for west coefficient in plane above * a_ae is pointer for east coefficient in plane above * a_as is pointer for south coefficient in plane above * a_an is pointer for north coefficient in plane above * a_bw is pointer for west coefficient in plane below * a_be is pointer for east coefficient in plane below * a_bs is pointer for south coefficient in plane below * a_bn is pointer for north coefficient in plane below * a_csw is pointer for southwest coefficient in same plane * a_cse is pointer for southeast coefficient in same plane * a_cnw is pointer for northwest coefficient in same plane * a_cne is pointer for northeast coefficient in same plane *-----------------------------------------------------------------*/ hypre_SetIndex3(index, -1, 0, 1); a_aw = hypre_StructMatrixExtractPointerByIndex(A, i, index); hypre_SetIndex3(index, 1, 0, 1); a_ae = hypre_StructMatrixExtractPointerByIndex(A, i, index); hypre_SetIndex3(index, 0, -1, 1); a_as = hypre_StructMatrixExtractPointerByIndex(A, i, index); hypre_SetIndex3(index, 0, 1, 1); a_an = hypre_StructMatrixExtractPointerByIndex(A, i, index); hypre_SetIndex3(index, -1, 0, -1); a_bw = hypre_StructMatrixExtractPointerByIndex(A, i, index); hypre_SetIndex3(index, 1, 0, -1); a_be = hypre_StructMatrixExtractPointerByIndex(A, i, index); hypre_SetIndex3(index, 0, -1, -1); a_bs = hypre_StructMatrixExtractPointerByIndex(A, i, index); hypre_SetIndex3(index, 0, 1, -1); a_bn = hypre_StructMatrixExtractPointerByIndex(A, i, index); hypre_SetIndex3(index, -1, -1, 0); a_csw = hypre_StructMatrixExtractPointerByIndex(A, i, index); hypre_SetIndex3(index, 1, -1, 0); a_cse = hypre_StructMatrixExtractPointerByIndex(A, i, index); hypre_SetIndex3(index, -1, 1, 0); a_cnw = hypre_StructMatrixExtractPointerByIndex(A, i, index); hypre_SetIndex3(index, 1, 1, 0); a_cne = hypre_StructMatrixExtractPointerByIndex(A, i, index); #define DEVICE_VAR is_device_ptr(a_cc,a_cs,a_cn,a_ac,a_bc,a_as,a_an,a_bs,a_bn,a_cw,a_aw,a_bw,a_csw,a_cnw,a_ce,a_ae,a_be,a_cse,a_cne,Pp0,Pp1,p0,p1) hypre_BoxLoop2Begin(hypre_StructMatrixNDim(A), loop_size, A_dbox, start, stride, Ai, P_dbox, startc, stridec, Pi); { HYPRE_Real center, left, right; switch (cdir) { case 0: center = a_cc[Ai] + a_cs[Ai] + a_cn[Ai] + a_ac[Ai] + a_bc[Ai] + a_as[Ai] + a_an[Ai] + a_bs[Ai] + a_bn[Ai]; left = -a_cw[Ai] - a_aw[Ai] - a_bw[Ai] - a_csw[Ai] - a_cnw[Ai]; right = -a_ce[Ai] - a_ae[Ai] - a_be[Ai] - a_cse[Ai] - a_cne[Ai]; break; case 1: center = a_cc[Ai] + a_cw[Ai] + a_ce[Ai] + a_ac[Ai] + a_bc[Ai] + a_aw[Ai] + a_ae[Ai] + a_bw[Ai] + a_be[Ai]; left = -a_cs[Ai] - a_as[Ai] - a_bs[Ai] - a_csw[Ai] - a_cse[Ai]; right = -a_cn[Ai] - a_an[Ai] - a_bn[Ai] - a_cnw[Ai] - a_cne[Ai]; break; case 2: default: center = a_cc[Ai] + a_cw[Ai] + a_ce[Ai] + a_cs[Ai] + a_cn[Ai] + a_csw[Ai] + a_cse[Ai] + a_cnw[Ai] + a_cne[Ai]; left = -a_bc[Ai] - a_bw[Ai] - a_be[Ai] - a_bs[Ai] - a_bn[Ai]; right = -a_ac[Ai] - a_aw[Ai] - a_ae[Ai] - a_as[Ai] - a_an[Ai]; break; }; if (!center) { Pp0[Pi] = 0.0; Pp1[Pi] = 0.0; } else { switch (Pstenc0) { case -1: Pp0[Pi] = left / center; Pp1[Pi] = right / center; break; case 1: Pp0[Pi] = right / center; Pp1[Pi] = left / center; break; }; /* switch (Pstenc1) { case -1: Pp1[Pi] = left/center;break; case 1: Pp1[Pi] = right/center;break; }; */ } if (p0[Ai] == 0.0) { Pp0[Pi] = 0.0; } if (p1[Ai] == 0.0) { Pp1[Pi] = 0.0; } //printf("Pp0[%d] = %e, Pp1 = %e\n",Pi,Pp0[Pi],Pp1[Pi]); } hypre_BoxLoop2End(Ai, Pi); #undef DEVICE_VAR return hypre_error_flag; } HYPRE_Int hypre_PFMGSetupInterpOp_CC0_SS27 ( HYPRE_Int i, /* box index */ hypre_StructMatrix *A, hypre_Box *A_dbox, HYPRE_Int cdir, hypre_Index stride, hypre_Index stridec, hypre_Index start, hypre_IndexRef startc, hypre_Index loop_size, hypre_Box *P_dbox, HYPRE_Int Pstenc0, HYPRE_Int Pstenc1, HYPRE_Real *Pp0, HYPRE_Real *Pp1, HYPRE_Int rap_type, hypre_Index *P_stencil_shape ) { HYPRE_UNUSED_VAR(rap_type); HYPRE_UNUSED_VAR(Pstenc1); //hypre_StructStencil *stencil = hypre_StructMatrixStencil(A); //hypre_Index *stencil_shape = hypre_StructStencilShape(stencil); //HYPRE_Int stencil_size = hypre_StructStencilSize(stencil); //HYPRE_Int warning_cnt= 0; hypre_Index index; HYPRE_Real *a_cc, *a_cw, *a_ce, *a_cs, *a_cn, *a_ac, *a_bc; HYPRE_Real *a_csw, *a_cse, *a_cne, *a_cnw; HYPRE_Real *a_aw, *a_ae, *a_as, *a_an, *a_bw, *a_be, *a_bs, *a_bn; HYPRE_Real *a_asw, *a_ase, *a_ane, *a_anw, *a_bsw, *a_bse, *a_bne, *a_bnw; HYPRE_Real *p0, *p1; p0 = hypre_StructMatrixExtractPointerByIndex(A, i, P_stencil_shape[0]); p1 = hypre_StructMatrixExtractPointerByIndex(A, i, P_stencil_shape[1]); /*----------------------------------------------------------------- * Extract pointers for 7-point grid operator: * * a_cc is pointer for center coefficient * a_cw is pointer for west coefficient in same plane * a_ce is pointer for east coefficient in same plane * a_cs is pointer for south coefficient in same plane * a_cn is pointer for north coefficient in same plane * a_ac is pointer for center coefficient in plane above * a_bc is pointer for center coefficient in plane below *-----------------------------------------------------------------*/ hypre_SetIndex3(index, 0, 0, 0); a_cc = hypre_StructMatrixExtractPointerByIndex(A, i, index); hypre_SetIndex3(index, -1, 0, 0); a_cw = hypre_StructMatrixExtractPointerByIndex(A, i, index); hypre_SetIndex3(index, 1, 0, 0); a_ce = hypre_StructMatrixExtractPointerByIndex(A, i, index); hypre_SetIndex3(index, 0, -1, 0); a_cs = hypre_StructMatrixExtractPointerByIndex(A, i, index); hypre_SetIndex3(index, 0, 1, 0); a_cn = hypre_StructMatrixExtractPointerByIndex(A, i, index); hypre_SetIndex3(index, 0, 0, 1); a_ac = hypre_StructMatrixExtractPointerByIndex(A, i, index); hypre_SetIndex3(index, 0, 0, -1); a_bc = hypre_StructMatrixExtractPointerByIndex(A, i, index); /*----------------------------------------------------------------- * Extract additional pointers for 19-point fine grid operator: * * a_aw is pointer for west coefficient in plane above * a_ae is pointer for east coefficient in plane above * a_as is pointer for south coefficient in plane above * a_an is pointer for north coefficient in plane above * a_bw is pointer for west coefficient in plane below * a_be is pointer for east coefficient in plane below * a_bs is pointer for south coefficient in plane below * a_bn is pointer for north coefficient in plane below * a_csw is pointer for southwest coefficient in same plane * a_cse is pointer for southeast coefficient in same plane * a_cnw is pointer for northwest coefficient in same plane * a_cne is pointer for northeast coefficient in same plane *-----------------------------------------------------------------*/ hypre_SetIndex3(index, -1, 0, 1); a_aw = hypre_StructMatrixExtractPointerByIndex(A, i, index); hypre_SetIndex3(index, 1, 0, 1); a_ae = hypre_StructMatrixExtractPointerByIndex(A, i, index); hypre_SetIndex3(index, 0, -1, 1); a_as = hypre_StructMatrixExtractPointerByIndex(A, i, index); hypre_SetIndex3(index, 0, 1, 1); a_an = hypre_StructMatrixExtractPointerByIndex(A, i, index); hypre_SetIndex3(index, -1, 0, -1); a_bw = hypre_StructMatrixExtractPointerByIndex(A, i, index); hypre_SetIndex3(index, 1, 0, -1); a_be = hypre_StructMatrixExtractPointerByIndex(A, i, index); hypre_SetIndex3(index, 0, -1, -1); a_bs = hypre_StructMatrixExtractPointerByIndex(A, i, index); hypre_SetIndex3(index, 0, 1, -1); a_bn = hypre_StructMatrixExtractPointerByIndex(A, i, index); hypre_SetIndex3(index, -1, -1, 0); a_csw = hypre_StructMatrixExtractPointerByIndex(A, i, index); hypre_SetIndex3(index, 1, -1, 0); a_cse = hypre_StructMatrixExtractPointerByIndex(A, i, index); hypre_SetIndex3(index, -1, 1, 0); a_cnw = hypre_StructMatrixExtractPointerByIndex(A, i, index); hypre_SetIndex3(index, 1, 1, 0); a_cne = hypre_StructMatrixExtractPointerByIndex(A, i, index); /*----------------------------------------------------------------- * Extract additional pointers for 27-point fine grid operator: * * a_asw is pointer for southwest coefficient in plane above * a_ase is pointer for southeast coefficient in plane above * a_anw is pointer for northwest coefficient in plane above * a_ane is pointer for northeast coefficient in plane above * a_bsw is pointer for southwest coefficient in plane below * a_bse is pointer for southeast coefficient in plane below * a_bnw is pointer for northwest coefficient in plane below * a_bne is pointer for northeast coefficient in plane below *-----------------------------------------------------------------*/ hypre_SetIndex3(index, -1, -1, 1); a_asw = hypre_StructMatrixExtractPointerByIndex(A, i, index); hypre_SetIndex3(index, 1, -1, 1); a_ase = hypre_StructMatrixExtractPointerByIndex(A, i, index); hypre_SetIndex3(index, -1, 1, 1); a_anw = hypre_StructMatrixExtractPointerByIndex(A, i, index); hypre_SetIndex3(index, 1, 1, 1); a_ane = hypre_StructMatrixExtractPointerByIndex(A, i, index); hypre_SetIndex3(index, -1, -1, -1); a_bsw = hypre_StructMatrixExtractPointerByIndex(A, i, index); hypre_SetIndex3(index, 1, -1, -1); a_bse = hypre_StructMatrixExtractPointerByIndex(A, i, index); hypre_SetIndex3(index, -1, 1, -1); a_bnw = hypre_StructMatrixExtractPointerByIndex(A, i, index); hypre_SetIndex3(index, 1, 1, -1); a_bne = hypre_StructMatrixExtractPointerByIndex(A, i, index); #define DEVICE_VAR is_device_ptr(a_cc,a_cs,a_cn,a_ac,a_bc,a_as,a_an,a_bs,a_bn,a_cw,a_aw,a_bw,a_csw,a_cnw,a_asw,a_anw,a_bsw,a_bnw,a_ce,a_ae,a_be,a_cse,a_cne,a_ase,a_ane,a_bse,a_bne,Pp0,Pp1,p0,p1) hypre_BoxLoop2Begin(hypre_StructMatrixNDim(A), loop_size, A_dbox, start, stride, Ai, P_dbox, startc, stridec, Pi); { HYPRE_Real center, left, right; switch (cdir) { case 0: center = a_cc[Ai] + a_cs[Ai] + a_cn[Ai] + a_ac[Ai] + a_bc[Ai] + a_as[Ai] + a_an[Ai] + a_bs[Ai] + a_bn[Ai]; left = -a_cw[Ai] - a_aw[Ai] - a_bw[Ai] - a_csw[Ai] - a_cnw[Ai] - a_asw[Ai] - a_anw[Ai] - a_bsw[Ai] - a_bnw[Ai]; right = -a_ce[Ai] - a_ae[Ai] - a_be[Ai] - a_cse[Ai] - a_cne[Ai] - a_ase[Ai] - a_ane[Ai] - a_bse[Ai] - a_bne[Ai]; break; case 1: center = a_cc[Ai] + a_cw[Ai] + a_ce[Ai] + a_ac[Ai] + a_bc[Ai] + a_aw[Ai] + a_ae[Ai] + a_bw[Ai] + a_be[Ai]; left = -a_cs[Ai] - a_as[Ai] - a_bs[Ai] - a_csw[Ai] - a_cse[Ai] - a_asw[Ai] - a_ase[Ai] - a_bsw[Ai] - a_bse[Ai]; right = -a_cn[Ai] - a_an[Ai] - a_bn[Ai] - a_cnw[Ai] - a_cne[Ai] - a_anw[Ai] - a_ane[Ai] - a_bnw[Ai] - a_bne[Ai]; break; case 2: default: center = a_cc[Ai] + a_cw[Ai] + a_ce[Ai] + a_cs[Ai] + a_cn[Ai] + a_csw[Ai] + a_cse[Ai] + a_cnw[Ai] + a_cne[Ai]; left = -a_bc[Ai] - a_bw[Ai] - a_be[Ai] - a_bs[Ai] - a_bn[Ai] - a_bsw[Ai] - a_bse[Ai] - a_bnw[Ai] - a_bne[Ai]; right = -a_ac[Ai] - a_aw[Ai] - a_ae[Ai] - a_as[Ai] - a_an[Ai] - a_asw[Ai] - a_ase[Ai] - a_anw[Ai] - a_ane[Ai]; break; }; if (!center) { //warning_cnt++; Pp0[Pi] = 0.0; Pp1[Pi] = 0.0; } else { switch (Pstenc0) { case -1: Pp0[Pi] = left / center; Pp1[Pi] = right / center; break; case 1: Pp0[Pi] = right / center; Pp1[Pi] = left / center; break; }; /* switch (Pstenc1) { case -1: Pp1[Pi] = left/center;break; case 1: Pp1[Pi] = right/center;break; }; */ } if (p0[Ai] == 0.0) { Pp0[Pi] = 0.0; } if (p1[Ai] == 0.0) { Pp1[Pi] = 0.0; } //printf("Pp0[%d] = %e, Pp1 = %e\n",Pi,Pp0[Pi],Pp1[Pi]); } hypre_BoxLoop2End(Ai, Pi); #undef DEVICE_VAR return hypre_error_flag; } #endif hypre-2.33.0/src/struct_ls/pfmg_setup_rap.c000066400000000000000000000220251477326011500207250ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "_hypre_struct_ls.h" #include "pfmg.h" /*-------------------------------------------------------------------------- * hypre_PFMGCreateRAPOp * * Wrapper for 2 and 3d CreateRAPOp routines which set up new coarse * grid structures. * * The parameter rap_type controls which lower level routines are * used. * rap_type = 0 Use optimized code for computing Galerkin operators * for special, common stencil patterns: 5 & 9 pt in * 2d and 7, 19 & 27 in 3d. * rap_type = 1 Use PARFLOW formula for coarse grid operator. Used * only with 5pt in 2d and 7pt in 3d. * rap_type = 2 General purpose Galerkin code. *--------------------------------------------------------------------------*/ hypre_StructMatrix * hypre_PFMGCreateRAPOp( hypre_StructMatrix *R, hypre_StructMatrix *A, hypre_StructMatrix *P, hypre_StructGrid *coarse_grid, HYPRE_Int cdir, HYPRE_Int rap_type ) { hypre_StructMatrix *RAP = NULL; hypre_StructStencil *stencil; HYPRE_Int P_stored_as_transpose = 0; HYPRE_Int constant_coefficient; stencil = hypre_StructMatrixStencil(A); if (rap_type == 0) { switch (hypre_StructStencilNDim(stencil)) { case 2: RAP = hypre_PFMG2CreateRAPOp(R, A, P, coarse_grid, cdir); break; case 3: RAP = hypre_PFMG3CreateRAPOp(R, A, P, coarse_grid, cdir); break; } } else if (rap_type == 1) { switch (hypre_StructStencilNDim(stencil)) { case 2: RAP = hypre_PFMGCreateCoarseOp5(R, A, P, coarse_grid, cdir); break; case 3: RAP = hypre_PFMGCreateCoarseOp7(R, A, P, coarse_grid, cdir); break; } } else if (rap_type == 2) { RAP = hypre_SemiCreateRAPOp(R, A, P, coarse_grid, cdir, P_stored_as_transpose); } constant_coefficient = hypre_StructMatrixConstantCoefficient(A); if ( constant_coefficient == 2 && rap_type == 0 ) { /* A has variable diagonal, so, in the Galerkin case, P (and R) is entirely variable coefficient. Thus RAP will be variable coefficient */ hypre_StructMatrixSetConstantCoefficient( RAP, 0 ); } else { hypre_StructMatrixSetConstantCoefficient( RAP, constant_coefficient ); } return RAP; } /*-------------------------------------------------------------------------- * hypre_PFMGSetupRAPOp * * Wrapper for 2 and 3d, symmetric and non-symmetric routines to calculate * entries in RAP. Incomplete error handling at the moment. * * The parameter rap_type controls which lower level routines are * used. * rap_type = 0 Use optimized code for computing Galerkin operators * for special, common stencil patterns: 5 & 9 pt in * 2d and 7, 19 & 27 in 3d. * rap_type = 1 Use PARFLOW formula for coarse grid operator. Used * only with 5pt in 2d and 7pt in 3d. * rap_type = 2 General purpose Galerkin code. *--------------------------------------------------------------------------*/ HYPRE_Int hypre_PFMGSetupRAPOp( hypre_StructMatrix *R, hypre_StructMatrix *A, hypre_StructMatrix *P, HYPRE_Int cdir, hypre_Index cindex, hypre_Index cstride, HYPRE_Int rap_type, hypre_StructMatrix *Ac ) { HYPRE_Int P_stored_as_transpose = 0; hypre_StructStencil *stencil; hypre_StructMatrix *Ac_tmp; #if 0 //defined(HYPRE_USING_CUDA) || defined(HYPRE_USING_HIP) HYPRE_MemoryLocation data_location_A = hypre_StructGridDataLocation(hypre_StructMatrixGrid(A)); HYPRE_MemoryLocation data_location_Ac = hypre_StructGridDataLocation(hypre_StructMatrixGrid(Ac)); HYPRE_Int constant_coefficient = hypre_StructMatrixConstantCoefficient(Ac); if ( data_location_A != data_location_Ac ) { Ac_tmp = hypre_PFMGCreateRAPOp(R, A, P, hypre_StructMatrixGrid(Ac), cdir, rap_type); hypre_StructMatrixSymmetric(Ac_tmp) = hypre_StructMatrixSymmetric(Ac); hypre_StructMatrixConstantCoefficient(Ac_tmp) = hypre_StructMatrixConstantCoefficient(Ac); hypre_StructGridDataLocation(hypre_StructMatrixGrid(Ac)) = data_location_A; HYPRE_StructMatrixInitialize(Ac_tmp); } else { Ac_tmp = Ac; } #else Ac_tmp = Ac; #endif stencil = hypre_StructMatrixStencil(A); HYPRE_ANNOTATE_FUNC_BEGIN; if (rap_type == 0) { switch (hypre_StructStencilNDim(stencil)) { case 2: /*-------------------------------------------------------------------- * Set lower triangular (+ diagonal) coefficients *--------------------------------------------------------------------*/ hypre_PFMG2BuildRAPSym(A, P, R, cdir, cindex, cstride, Ac_tmp); /*-------------------------------------------------------------------- * For non-symmetric A, set upper triangular coefficients as well *--------------------------------------------------------------------*/ if (!hypre_StructMatrixSymmetric(A)) { hypre_PFMG2BuildRAPNoSym(A, P, R, cdir, cindex, cstride, Ac_tmp); } break; case 3: /*-------------------------------------------------------------------- * Set lower triangular (+ diagonal) coefficients *--------------------------------------------------------------------*/ hypre_PFMG3BuildRAPSym(A, P, R, cdir, cindex, cstride, Ac_tmp); /*-------------------------------------------------------------------- * For non-symmetric A, set upper triangular coefficients as well *--------------------------------------------------------------------*/ if (!hypre_StructMatrixSymmetric(A)) { hypre_PFMG3BuildRAPNoSym(A, P, R, cdir, cindex, cstride, Ac_tmp); } break; } } else if (rap_type == 1) { switch (hypre_StructStencilNDim(stencil)) { case 2: hypre_PFMGBuildCoarseOp5(A, P, R, cdir, cindex, cstride, Ac_tmp); break; case 3: hypre_PFMGBuildCoarseOp7(A, P, R, cdir, cindex, cstride, Ac_tmp); break; } } else if (rap_type == 2) { hypre_SemiBuildRAP(A, P, R, cdir, cindex, cstride, P_stored_as_transpose, Ac_tmp); } hypre_StructMatrixAssemble(Ac_tmp); #if 0 //defined(HYPRE_USING_CUDA) || defined(HYPRE_USING_HIP) if ( data_location_A != data_location_Ac ) { if (constant_coefficient == 0) { hypre_TMemcpy(hypre_StructMatrixDataConst(Ac), hypre_StructMatrixData(Ac_tmp), HYPRE_Complex, hypre_StructMatrixDataSize(Ac_tmp), HYPRE_MEMORY_HOST, HYPRE_MEMORY_DEVICE); } else if (constant_coefficient == 1) { hypre_TMemcpy(hypre_StructMatrixDataConst(Ac), hypre_StructMatrixDataConst(Ac_tmp), HYPRE_Complex, hypre_StructMatrixDataConstSize(Ac_tmp), HYPRE_MEMORY_HOST, HYPRE_MEMORY_HOST); } else if (constant_coefficient == 2) { hypre_TMemcpy(hypre_StructMatrixDataConst(Ac), hypre_StructMatrixDataConst(Ac_tmp), HYPRE_Complex, hypre_StructMatrixDataConstSize(Ac_tmp), HYPRE_MEMORY_HOST, HYPRE_MEMORY_HOST); hypre_StructStencil *stencil_c = hypre_StructMatrixStencil(Ac); HYPRE_Int stencil_size = hypre_StructStencilSize(stencil_c); HYPRE_Complex *Acdiag = hypre_StructMatrixDataConst(Ac) + stencil_size; hypre_TMemcpy(Acdiag, hypre_StructMatrixData(Ac_tmp), HYPRE_Complex, hypre_StructMatrixDataSize(Ac_tmp), HYPRE_MEMORY_HOST, HYPRE_MEMORY_DEVICE); } hypre_HandleStructExecPolicy(hypre_handle()) = data_location_Ac == HYPRE_MEMORY_DEVICE ? HYPRE_EXEC_DEVICE : HYPRE_EXEC_HOST; hypre_StructGridDataLocation(hypre_StructMatrixGrid(Ac)) = data_location_Ac; hypre_StructMatrixAssemble(Ac); hypre_HandleStructExecPolicy(hypre_handle()) = data_location_A == HYPRE_MEMORY_DEVICE ? HYPRE_EXEC_DEVICE : HYPRE_EXEC_HOST; hypre_StructMatrixDestroy(Ac_tmp); } #endif HYPRE_ANNOTATE_FUNC_END; return hypre_error_flag; } hypre-2.33.0/src/struct_ls/pfmg_setup_rap5.c000066400000000000000000000413671477326011500210240ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "_hypre_struct_ls.h" #include "_hypre_struct_mv.hpp" #include "pfmg.h" /*-------------------------------------------------------------------------- * Macro to "change coordinates". This routine is written as though * coarsening is being done in the y-direction. This macro is used to * allow for coarsening to be done in the x-direction also. *--------------------------------------------------------------------------*/ #define MapIndex(in_index, cdir, out_index) \ hypre_IndexD(out_index, 2) = hypre_IndexD(in_index, 2); \ hypre_IndexD(out_index, cdir) = hypre_IndexD(in_index, 1); \ cdir = (cdir + 1) % 2; \ hypre_IndexD(out_index, cdir) = hypre_IndexD(in_index, 0); \ cdir = (cdir + 1) % 2; /*-------------------------------------------------------------------------- * hypre_PFMGCreateCoarseOp5 * Sets up new coarse grid operator stucture. Fine grid * operator is 5pt and so is coarse, i.e. non-Galerkin. *--------------------------------------------------------------------------*/ hypre_StructMatrix * hypre_PFMGCreateCoarseOp5( hypre_StructMatrix *R, hypre_StructMatrix *A, hypre_StructMatrix *P, hypre_StructGrid *coarse_grid, HYPRE_Int cdir ) { HYPRE_UNUSED_VAR(R); HYPRE_UNUSED_VAR(P); hypre_StructMatrix *RAP; hypre_Index *RAP_stencil_shape; hypre_StructStencil *RAP_stencil; HYPRE_Int RAP_stencil_size; HYPRE_Int RAP_stencil_dim; HYPRE_Int RAP_num_ghost[] = {1, 1, 1, 1, 1, 1}; hypre_Index index_temp; HYPRE_Int j, i; HYPRE_Int stencil_rank; RAP_stencil_dim = 2; /*----------------------------------------------------------------------- * Define RAP_stencil *-----------------------------------------------------------------------*/ stencil_rank = 0; /*----------------------------------------------------------------------- * non-symmetric case *-----------------------------------------------------------------------*/ if (!hypre_StructMatrixSymmetric(A)) { /*-------------------------------------------------------------------- * 5 point coarse grid stencil *--------------------------------------------------------------------*/ RAP_stencil_size = 5; RAP_stencil_shape = hypre_CTAlloc(hypre_Index, RAP_stencil_size, HYPRE_MEMORY_HOST); for (j = -1; j < 2; j++) { for (i = -1; i < 2; i++) { /*-------------------------------------------------------------- * Storage for 5 elements (c,w,e,n,s) *--------------------------------------------------------------*/ if (i * j == 0) { hypre_SetIndex3(index_temp, i, j, 0); MapIndex(index_temp, cdir, RAP_stencil_shape[stencil_rank]); stencil_rank++; } } } } /*----------------------------------------------------------------------- * symmetric case *-----------------------------------------------------------------------*/ else { /*-------------------------------------------------------------------- * 5 point coarse grid stencil * Only store the lower triangular part + diagonal = 3 entries, * lower triangular means the lower triangular part on the matrix * in the standard lexicographic ordering. *--------------------------------------------------------------------*/ RAP_stencil_size = 3; RAP_stencil_shape = hypre_CTAlloc(hypre_Index, RAP_stencil_size, HYPRE_MEMORY_HOST); for (j = -1; j < 1; j++) { for (i = -1; i < 1; i++) { /*-------------------------------------------------------------- * Store 3 elements in (c,w,s) *--------------------------------------------------------------*/ if ( i * j == 0 ) { hypre_SetIndex3(index_temp, i, j, 0); MapIndex(index_temp, cdir, RAP_stencil_shape[stencil_rank]); stencil_rank++; } } } } RAP_stencil = hypre_StructStencilCreate(RAP_stencil_dim, RAP_stencil_size, RAP_stencil_shape); RAP = hypre_StructMatrixCreate(hypre_StructMatrixComm(A), coarse_grid, RAP_stencil); hypre_StructStencilDestroy(RAP_stencil); /*----------------------------------------------------------------------- * Coarse operator in symmetric iff fine operator is *-----------------------------------------------------------------------*/ hypre_StructMatrixSymmetric(RAP) = hypre_StructMatrixSymmetric(A); /*----------------------------------------------------------------------- * Set number of ghost points - one one each boundary *-----------------------------------------------------------------------*/ hypre_StructMatrixSetNumGhost(RAP, RAP_num_ghost); return RAP; } /*-------------------------------------------------------------------------- * hypre_PFMGBuildCoarseOp5 * Sets up new coarse grid operator stucture. Fine grid operator is 5pt and * so is coarse, i.e. non-Galerkin. * * Uses the non-Galerkin strategy from Ashby & Falgout's original ParFlow * algorithm. For constant_coefficient==2, see [issue663]. *--------------------------------------------------------------------------*/ HYPRE_Int hypre_PFMGBuildCoarseOp5( hypre_StructMatrix *A, hypre_StructMatrix *P, hypre_StructMatrix *R, HYPRE_Int cdir, hypre_Index cindex, hypre_Index cstride, hypre_StructMatrix *RAP ) { HYPRE_Int ndim = hypre_StructMatrixNDim(A); hypre_Index index; hypre_Index index_temp; hypre_StructGrid *fgrid; hypre_BoxArray *fgrid_boxes; hypre_Box *fgrid_box; HYPRE_Int *fgrid_ids; hypre_StructGrid *cgrid; hypre_BoxArray *cgrid_boxes; hypre_Box *cgrid_box; HYPRE_Int *cgrid_ids; hypre_IndexRef cstart, bfstart, stridef; hypre_Index fstart, bcstart, stridec; hypre_Index loop_size; HYPRE_Int constant_coefficient; HYPRE_Int fi, ci, fbi; hypre_Box *A_dbox; hypre_Box *P_dbox; hypre_Box *RAP_dbox; hypre_BoxArray *bdy_boxes, *tmp_boxes; hypre_Box *bdy_box, *fcbox; HYPRE_Real *pb, *pa; HYPRE_Real *a_cc, *a_cw, *a_ce, *a_cb, *a_ca; HYPRE_Real *rap_cc, *rap_cw, *rap_ce; HYPRE_Real *rap_cb, *rap_ca; HYPRE_Real center_int, center_bdy; HYPRE_Int OffsetA; HYPRE_Int OffsetP; stridef = cstride; hypre_SetIndex3(stridec, 1, 1, 1); fgrid = hypre_StructMatrixGrid(A); fgrid_boxes = hypre_StructGridBoxes(fgrid); fgrid_ids = hypre_StructGridIDs(fgrid); cgrid = hypre_StructMatrixGrid(RAP); cgrid_boxes = hypre_StructGridBoxes(cgrid); cgrid_ids = hypre_StructGridIDs(cgrid); constant_coefficient = hypre_StructMatrixConstantCoefficient(RAP); hypre_assert( hypre_StructMatrixConstantCoefficient(A) == constant_coefficient ); if ( constant_coefficient == 0 ) { hypre_assert( hypre_StructMatrixConstantCoefficient(R) == 0 ); hypre_assert( hypre_StructMatrixConstantCoefficient(P) == 0 ); } else /* 1 or 2 */ { hypre_assert( hypre_StructMatrixConstantCoefficient(R) == 1 ); hypre_assert( hypre_StructMatrixConstantCoefficient(P) == 1 ); } fcbox = hypre_BoxCreate(ndim); bdy_boxes = hypre_BoxArrayCreate(0, ndim); tmp_boxes = hypre_BoxArrayCreate(0, ndim); fi = 0; hypre_ForBoxI(ci, cgrid_boxes) { while (fgrid_ids[fi] != cgrid_ids[ci]) { fi++; } cgrid_box = hypre_BoxArrayBox(cgrid_boxes, ci); fgrid_box = hypre_BoxArrayBox(fgrid_boxes, fi); cstart = hypre_BoxIMin(cgrid_box); hypre_StructMapCoarseToFine(cstart, cindex, cstride, fstart); A_dbox = hypre_BoxArrayBox(hypre_StructMatrixDataSpace(A), fi); P_dbox = hypre_BoxArrayBox(hypre_StructMatrixDataSpace(P), fi); RAP_dbox = hypre_BoxArrayBox(hypre_StructMatrixDataSpace(RAP), ci); /*----------------------------------------------------------------- * Extract pointers for interpolation operator: * pb is pointer for weight for f-point below c-point * pa is pointer for weight for f-point above c-point *-----------------------------------------------------------------*/ hypre_SetIndex3(index_temp, 0, -1, 0); MapIndex(index_temp, cdir, index); pa = hypre_StructMatrixExtractPointerByIndex(P, fi, index); hypre_SetIndex3(index_temp, 0, 1, 0); MapIndex(index_temp, cdir, index); pb = hypre_StructMatrixExtractPointerByIndex(P, fi, index); //RL PTROFFSET HYPRE_Int pbOffset = hypre_BoxOffsetDistance(P_dbox, index); /*----------------------------------------------------------------- * Extract pointers for 5-point fine grid operator: * * a_cc is pointer for center coefficient * a_cw is pointer for west coefficient * a_ce is pointer for east coefficient * a_cb is pointer for below coefficient * a_ca is pointer for above coefficient *-----------------------------------------------------------------*/ hypre_SetIndex3(index_temp, 0, 0, 0); MapIndex(index_temp, cdir, index); a_cc = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index_temp, -1, 0, 0); MapIndex(index_temp, cdir, index); a_cw = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index_temp, 1, 0, 0); MapIndex(index_temp, cdir, index); a_ce = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index_temp, 0, -1, 0); MapIndex(index_temp, cdir, index); a_cb = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index_temp, 0, 1, 0); MapIndex(index_temp, cdir, index); a_ca = hypre_StructMatrixExtractPointerByIndex(A, fi, index); /*----------------------------------------------------------------- * Extract pointers for coarse grid operator * rap_cc is pointer for center coefficient (etc.) *-----------------------------------------------------------------*/ hypre_SetIndex3(index_temp, 0, 0, 0); MapIndex(index_temp, cdir, index); rap_cc = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index_temp, -1, 0, 0); MapIndex(index_temp, cdir, index); rap_cw = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index_temp, 1, 0, 0); MapIndex(index_temp, cdir, index); rap_ce = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index_temp, 0, -1, 0); MapIndex(index_temp, cdir, index); rap_cb = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index_temp, 0, 1, 0); MapIndex(index_temp, cdir, index); rap_ca = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); /*----------------------------------------------------------------- * Define offsets for fine grid stencil and interpolation * * In the BoxLoop below I assume iA and iP refer to data associated * with the point which we are building the stencil for. The below * Offsets are used in refering to data associated with other points. *-----------------------------------------------------------------*/ hypre_SetIndex3(index_temp, 0, 1, 0); MapIndex(index_temp, cdir, index); OffsetP = hypre_BoxOffsetDistance(P_dbox, index); OffsetA = hypre_BoxOffsetDistance(A_dbox, index); /*-------------------------------------------------------------- * Loop for symmetric 5-point fine grid operator; produces a * symmetric 5-point coarse grid operator. *--------------------------------------------------------------*/ if ( constant_coefficient == 0 ) { hypre_BoxGetSize(cgrid_box, loop_size); #define DEVICE_VAR is_device_ptr(rap_cb,a_cb,pa,rap_ca,a_ca,pb,a_cw,a_ce,rap_cw,rap_ce,rap_cc,a_cc) hypre_BoxLoop3Begin(hypre_StructMatrixNDim(A), loop_size, P_dbox, cstart, stridec, iP, A_dbox, fstart, stridef, iA, RAP_dbox, cstart, stridec, iAc); { HYPRE_Int iAm1, iAp1, iPm1, iPp1; HYPRE_Real west, east; iAm1 = iA - OffsetA; iAp1 = iA + OffsetA; iPm1 = iP - OffsetP; iPp1 = iP + OffsetP; rap_cb[iAc] = a_cb[iA] * pa[iPm1]; rap_ca[iAc] = a_ca[iA] * pb[iPp1 - pbOffset]; west = a_cw[iA] + 0.5 * a_cw[iAm1] + 0.5 * a_cw[iAp1]; east = a_ce[iA] + 0.5 * a_ce[iAm1] + 0.5 * a_ce[iAp1]; /*----------------------------------------------------- * Prevent non-zero entries reaching off grid *-----------------------------------------------------*/ if (a_cw[iA] == 0.0) { west = 0.0; } if (a_ce[iA] == 0.0) { east = 0.0; } rap_cw[iAc] = west; rap_ce[iAc] = east; rap_cc[iAc] = a_cc[iA] + a_cw[iA] + a_ce[iA] + a_cb[iA] * pb[iP - pbOffset] + a_ca[iA] * pa[iP] - west - east; } hypre_BoxLoop3End(iP, iA, iAc); #undef DEVICE_VAR } else if ( constant_coefficient == 1 ) { rap_cb[0] = rap_ca[0] = a_cb[0] * pa[0]; rap_cw[0] = rap_ce[0] = 2.0 * a_cw[0]; rap_cc[0] = a_cc[0] - 2.0 * ( a_cw[0] - rap_cb[0] ); } else if ( constant_coefficient == 2 ) { /* NOTE: This does not reduce to either of the above operators unless * the row sum is zero and the interpolation weights are 1/2 */ rap_cb[0] = rap_ca[0] = 0.5 * a_cb[0]; rap_cw[0] = rap_ce[0] = 2.0 * a_cw[0]; center_int = 3.0 * a_cb[0]; center_bdy = 0.5 * a_cb[0] + (a_cw[0] + a_cb[0]); hypre_BoxGetSize(cgrid_box, loop_size); #define DEVICE_VAR is_device_ptr(rap_cc,a_cc) hypre_BoxLoop2Begin(hypre_StructMatrixNDim(A), loop_size, A_dbox, fstart, stridef, iA, RAP_dbox, cstart, stridec, iAc); { rap_cc[iAc] = 2.0 * a_cc[iA] + center_int; } hypre_BoxLoop2End(iA, iAc); #undef DEVICE_VAR hypre_CopyBox(cgrid_box, fcbox); hypre_StructMapCoarseToFine(hypre_BoxIMin(fcbox), cindex, cstride, hypre_BoxIMin(fcbox)); hypre_StructMapCoarseToFine(hypre_BoxIMax(fcbox), cindex, cstride, hypre_BoxIMax(fcbox)); hypre_BoxArraySetSize(bdy_boxes, 0); if (hypre_BoxIMinD(fcbox, cdir) == hypre_BoxIMinD(fgrid_box, cdir)) { hypre_BoxBoundaryIntersect(fcbox, fgrid, cdir, -1, bdy_boxes); } if (hypre_BoxIMaxD(fcbox, cdir) == hypre_BoxIMaxD(fgrid_box, cdir)) { hypre_BoxBoundaryIntersect(fcbox, fgrid, cdir, 1, tmp_boxes); hypre_AppendBoxArray(tmp_boxes, bdy_boxes); } hypre_ForBoxI(fbi, bdy_boxes) { bdy_box = hypre_BoxArrayBox(bdy_boxes, fbi); hypre_BoxGetSize(bdy_box, loop_size); bfstart = hypre_BoxIMin(bdy_box); hypre_StructMapFineToCoarse(bfstart, cindex, cstride, bcstart); #define DEVICE_VAR is_device_ptr(rap_cc,a_cc) hypre_BoxLoop2Begin(hypre_StructMatrixNDim(A), loop_size, A_dbox, bfstart, stridef, iA, RAP_dbox, bcstart, stridec, iAc); { rap_cc[iAc] -= 0.5 * a_cc[iA] + center_bdy; } hypre_BoxLoop2End(iA, iAc); #undef DEVICE_VAR } } } /* end ForBoxI */ hypre_BoxDestroy(fcbox); hypre_BoxArrayDestroy(bdy_boxes); hypre_BoxArrayDestroy(tmp_boxes); return hypre_error_flag; } hypre-2.33.0/src/struct_ls/pfmg_setup_rap7.c000066400000000000000000000444571477326011500210310ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "_hypre_struct_ls.h" #include "_hypre_struct_mv.hpp" #include "pfmg.h" /*-------------------------------------------------------------------------- * Macro to "change coordinates". This routine is written as though * coarsening is being done in the z-direction. This macro is used to * allow for coarsening to be done in the x- and y-directions also. *--------------------------------------------------------------------------*/ #define MapIndex(in_index, cdir, out_index) \ hypre_IndexD(out_index, cdir) = hypre_IndexD(in_index, 2); \ cdir = (cdir + 1) % 3; \ hypre_IndexD(out_index, cdir) = hypre_IndexD(in_index, 0); \ cdir = (cdir + 1) % 3; \ hypre_IndexD(out_index, cdir) = hypre_IndexD(in_index, 1); \ cdir = (cdir + 1) % 3; /*-------------------------------------------------------------------------- * hypre_PFMGCreateCoarseOp7 * Sets up new coarse grid operator stucture. Fine grid * operator is 7pt and so is coarse, i.e. non-Galerkin. *--------------------------------------------------------------------------*/ hypre_StructMatrix * hypre_PFMGCreateCoarseOp7( hypre_StructMatrix *R, hypre_StructMatrix *A, hypre_StructMatrix *P, hypre_StructGrid *coarse_grid, HYPRE_Int cdir ) { HYPRE_UNUSED_VAR(R); HYPRE_UNUSED_VAR(P); hypre_StructMatrix *RAP; hypre_Index *RAP_stencil_shape; hypre_StructStencil *RAP_stencil; HYPRE_Int RAP_stencil_size; HYPRE_Int RAP_stencil_dim; HYPRE_Int RAP_num_ghost[] = {1, 1, 1, 1, 1, 1}; hypre_Index index_temp; HYPRE_Int k, j, i; HYPRE_Int stencil_rank; RAP_stencil_dim = 3; /*----------------------------------------------------------------------- * Define RAP_stencil *-----------------------------------------------------------------------*/ stencil_rank = 0; /*----------------------------------------------------------------------- * non-symmetric case *-----------------------------------------------------------------------*/ if (!hypre_StructMatrixSymmetric(A)) { /*-------------------------------------------------------------------- * 7 point coarse grid stencil *--------------------------------------------------------------------*/ RAP_stencil_size = 7; RAP_stencil_shape = hypre_CTAlloc(hypre_Index, RAP_stencil_size, HYPRE_MEMORY_HOST); for (k = -1; k < 2; k++) { for (j = -1; j < 2; j++) { for (i = -1; i < 2; i++) { /*-------------------------------------------------------------- * Storage for 7 elements (c,w,e,n,s,a,b) *--------------------------------------------------------------*/ if (i * j == 0 && i * k == 0 && j * k == 0) { hypre_SetIndex3(index_temp, i, j, k); MapIndex(index_temp, cdir, RAP_stencil_shape[stencil_rank]); stencil_rank++; } } } } } /*----------------------------------------------------------------------- * symmetric case *-----------------------------------------------------------------------*/ else { /*-------------------------------------------------------------------- * 7 point coarse grid stencil * Only store the lower triangular part + diagonal = 4 entries, * lower triangular means the lower triangular part on the matrix * in the standard lexicographic ordering. *--------------------------------------------------------------------*/ RAP_stencil_size = 4; RAP_stencil_shape = hypre_CTAlloc(hypre_Index, RAP_stencil_size, HYPRE_MEMORY_HOST); for (k = -1; k < 1; k++) { for (j = -1; j < 1; j++) { for (i = -1; i < 1; i++) { /*-------------------------------------------------------------- * Store 4 elements in (c,w,s,b) *--------------------------------------------------------------*/ if (i * j == 0 && i * k == 0 && j * k == 0) { hypre_SetIndex3(index_temp, i, j, k); MapIndex(index_temp, cdir, RAP_stencil_shape[stencil_rank]); stencil_rank++; } } } } } RAP_stencil = hypre_StructStencilCreate(RAP_stencil_dim, RAP_stencil_size, RAP_stencil_shape); RAP = hypre_StructMatrixCreate(hypre_StructMatrixComm(A), coarse_grid, RAP_stencil); hypre_StructStencilDestroy(RAP_stencil); /*----------------------------------------------------------------------- * Coarse operator in symmetric iff fine operator is *-----------------------------------------------------------------------*/ hypre_StructMatrixSymmetric(RAP) = hypre_StructMatrixSymmetric(A); /*----------------------------------------------------------------------- * Set number of ghost points - one one each boundary *-----------------------------------------------------------------------*/ hypre_StructMatrixSetNumGhost(RAP, RAP_num_ghost); return RAP; } /*-------------------------------------------------------------------------- * hypre_PFMGBuildCoarseOp7 * Sets up new coarse grid operator stucture. Fine grid operator is 7pt and * so is coarse, i.e. non-Galerkin. * * Uses the non-Galerkin strategy from Ashby & Falgout's original ParFlow * algorithm. For constant_coefficient==2, see [issue663]. *--------------------------------------------------------------------------*/ HYPRE_Int hypre_PFMGBuildCoarseOp7( hypre_StructMatrix *A, hypre_StructMatrix *P, hypre_StructMatrix *R, HYPRE_Int cdir, hypre_Index cindex, hypre_Index cstride, hypre_StructMatrix *RAP ) { HYPRE_Int ndim = hypre_StructMatrixNDim(A); hypre_Index index; hypre_Index index_temp; hypre_StructGrid *fgrid; hypre_BoxArray *fgrid_boxes; hypre_Box *fgrid_box; HYPRE_Int *fgrid_ids; hypre_StructGrid *cgrid; hypre_BoxArray *cgrid_boxes; hypre_Box *cgrid_box; HYPRE_Int *cgrid_ids; hypre_IndexRef cstart, bfstart, stridef; hypre_Index fstart, bcstart, stridec; hypre_Index loop_size; HYPRE_Int constant_coefficient; HYPRE_Int fi, ci, fbi; hypre_Box *A_dbox; hypre_Box *P_dbox; hypre_Box *RAP_dbox; hypre_BoxArray *bdy_boxes, *tmp_boxes; hypre_Box *bdy_box, *fcbox; HYPRE_Real *pb, *pa; HYPRE_Real *a_cc, *a_cw, *a_ce, *a_cs, *a_cn, *a_cb, *a_ca; HYPRE_Real *rap_cc, *rap_cw, *rap_ce, *rap_cs, *rap_cn; HYPRE_Real *rap_cb, *rap_ca; HYPRE_Real center_int, center_bdy; HYPRE_Int OffsetA; HYPRE_Int OffsetP; stridef = cstride; hypre_SetIndex3(stridec, 1, 1, 1); fgrid = hypre_StructMatrixGrid(A); fgrid_boxes = hypre_StructGridBoxes(fgrid); fgrid_ids = hypre_StructGridIDs(fgrid); cgrid = hypre_StructMatrixGrid(RAP); cgrid_boxes = hypre_StructGridBoxes(cgrid); cgrid_ids = hypre_StructGridIDs(cgrid); constant_coefficient = hypre_StructMatrixConstantCoefficient(RAP); hypre_assert( hypre_StructMatrixConstantCoefficient(A) == constant_coefficient ); if ( constant_coefficient == 0 ) { hypre_assert( hypre_StructMatrixConstantCoefficient(R) == 0 ); hypre_assert( hypre_StructMatrixConstantCoefficient(P) == 0 ); } else /* 1 or 2 */ { hypre_assert( hypre_StructMatrixConstantCoefficient(R) == 1 ); hypre_assert( hypre_StructMatrixConstantCoefficient(P) == 1 ); } fcbox = hypre_BoxCreate(ndim); bdy_boxes = hypre_BoxArrayCreate(0, ndim); tmp_boxes = hypre_BoxArrayCreate(0, ndim); fi = 0; hypre_ForBoxI(ci, cgrid_boxes) { while (fgrid_ids[fi] != cgrid_ids[ci]) { fi++; } cgrid_box = hypre_BoxArrayBox(cgrid_boxes, ci); fgrid_box = hypre_BoxArrayBox(fgrid_boxes, fi); cstart = hypre_BoxIMin(cgrid_box); hypre_StructMapCoarseToFine(cstart, cindex, cstride, fstart); A_dbox = hypre_BoxArrayBox(hypre_StructMatrixDataSpace(A), fi); P_dbox = hypre_BoxArrayBox(hypre_StructMatrixDataSpace(P), fi); RAP_dbox = hypre_BoxArrayBox(hypre_StructMatrixDataSpace(RAP), ci); /*----------------------------------------------------------------- * Extract pointers for interpolation operator: * pb is pointer for weight for f-point below c-point * pa is pointer for weight for f-point above c-point *-----------------------------------------------------------------*/ hypre_SetIndex3(index_temp, 0, 0, -1); MapIndex(index_temp, cdir, index); pa = hypre_StructMatrixExtractPointerByIndex(P, fi, index); hypre_SetIndex3(index_temp, 0, 0, 1); MapIndex(index_temp, cdir, index); pb = hypre_StructMatrixExtractPointerByIndex(P, fi, index); //RL PTROFFSET HYPRE_Int pbOffset = hypre_BoxOffsetDistance(P_dbox, index); /*----------------------------------------------------------------- * Extract pointers for 7-point fine grid operator: * * a_cc is pointer for center coefficient * a_cw is pointer for west coefficient * a_ce is pointer for east coefficient * a_cs is pointer for south coefficient * a_cn is pointer for north coefficient * a_cb is pointer for below coefficient * a_ca is pointer for above coefficient *-----------------------------------------------------------------*/ hypre_SetIndex3(index_temp, 0, 0, 0); MapIndex(index_temp, cdir, index); a_cc = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index_temp, -1, 0, 0); MapIndex(index_temp, cdir, index); a_cw = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index_temp, 1, 0, 0); MapIndex(index_temp, cdir, index); a_ce = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index_temp, 0, -1, 0); MapIndex(index_temp, cdir, index); a_cs = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index_temp, 0, 1, 0); MapIndex(index_temp, cdir, index); a_cn = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index_temp, 0, 0, -1); MapIndex(index_temp, cdir, index); a_cb = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index_temp, 0, 0, 1); MapIndex(index_temp, cdir, index); a_ca = hypre_StructMatrixExtractPointerByIndex(A, fi, index); /*----------------------------------------------------------------- * Extract pointers for coarse grid operator * rap_cc is pointer for center coefficient (etc.) *-----------------------------------------------------------------*/ hypre_SetIndex3(index_temp, 0, 0, 0); MapIndex(index_temp, cdir, index); rap_cc = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index_temp, -1, 0, 0); MapIndex(index_temp, cdir, index); rap_cw = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index_temp, 1, 0, 0); MapIndex(index_temp, cdir, index); rap_ce = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index_temp, 0, -1, 0); MapIndex(index_temp, cdir, index); rap_cs = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index_temp, 0, 1, 0); MapIndex(index_temp, cdir, index); rap_cn = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index_temp, 0, 0, -1); MapIndex(index_temp, cdir, index); rap_cb = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index_temp, 0, 0, 1); MapIndex(index_temp, cdir, index); rap_ca = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); /*----------------------------------------------------------------- * Define offsets for fine grid stencil and interpolation * * In the BoxLoop below I assume iA and iP refer to data associated * with the point which we are building the stencil for. The below * Offsets are used in refering to data associated with other points. *-----------------------------------------------------------------*/ hypre_SetIndex3(index_temp, 0, 0, 1); MapIndex(index_temp, cdir, index); OffsetP = hypre_BoxOffsetDistance(P_dbox, index); OffsetA = hypre_BoxOffsetDistance(A_dbox, index); /*-------------------------------------------------------------- * Loop for symmetric 7-point fine grid operator; produces a * symmetric 7-point coarse grid operator. *--------------------------------------------------------------*/ if ( constant_coefficient == 0 ) { hypre_BoxGetSize(cgrid_box, loop_size); #define DEVICE_VAR is_device_ptr(rap_cb,a_cb,pa,rap_ca,a_ca,pb,a_cw,a_ce,a_cs,a_cn,rap_cw,rap_ce,rap_cs,rap_cn,rap_cc,a_cc) hypre_BoxLoop3Begin(hypre_StructMatrixNDim(A), loop_size, P_dbox, cstart, stridec, iP, A_dbox, fstart, stridef, iA, RAP_dbox, cstart, stridec, iAc); { HYPRE_Int iAm1, iAp1, iPm1, iPp1; HYPRE_Real west, east, south, north; iAm1 = iA - OffsetA; iAp1 = iA + OffsetA; iPm1 = iP - OffsetP; iPp1 = iP + OffsetP; rap_cb[iAc] = a_cb[iA] * pa[iPm1]; rap_ca[iAc] = a_ca[iA] * pb[iPp1 - pbOffset]; west = a_cw[iA] + 0.5 * a_cw[iAm1] + 0.5 * a_cw[iAp1]; east = a_ce[iA] + 0.5 * a_ce[iAm1] + 0.5 * a_ce[iAp1]; south = a_cs[iA] + 0.5 * a_cs[iAm1] + 0.5 * a_cs[iAp1]; north = a_cn[iA] + 0.5 * a_cn[iAm1] + 0.5 * a_cn[iAp1]; /*----------------------------------------------------- * Prevent non-zero entries reaching off grid *-----------------------------------------------------*/ if (a_cw[iA] == 0.0) { west = 0.0; } if (a_ce[iA] == 0.0) { east = 0.0; } if (a_cs[iA] == 0.0) { south = 0.0; } if (a_cn[iA] == 0.0) { north = 0.0; } rap_cw[iAc] = west; rap_ce[iAc] = east; rap_cs[iAc] = south; rap_cn[iAc] = north; rap_cc[iAc] = a_cc[iA] + a_cw[iA] + a_ce[iA] + a_cs[iA] + a_cn[iA] + a_cb[iA] * pb[iP - pbOffset] + a_ca[iA] * pa[iP] - west - east - south - north; } hypre_BoxLoop3End(iP, iA, iAc); #undef DEVICE_VAR } else if ( constant_coefficient == 1 ) { rap_cb[0] = rap_ca[0] = a_cb[0] * pa[0]; rap_cw[0] = rap_ce[0] = 2.0 * a_cw[0]; rap_cs[0] = rap_cn[0] = 2.0 * a_cs[0]; rap_cc[0] = a_cc[0] - 2.0 * ( a_cw[0] + a_cs[0] - rap_cb[0] ); } else if ( constant_coefficient == 2 ) { /* NOTE: This does not reduce to either of the above operators unless * the row sum is zero and the interpolation weights are 1/2 */ rap_cb[0] = rap_ca[0] = 0.5 * a_cb[0]; rap_cw[0] = rap_ce[0] = 2.0 * a_cw[0]; rap_cs[0] = rap_cn[0] = 2.0 * a_cs[0]; center_int = 3.0 * a_cb[0]; center_bdy = 0.5 * a_cb[0] + (a_cw[0] + a_cs[0] + a_cb[0]); hypre_BoxGetSize(cgrid_box, loop_size); #define DEVICE_VAR is_device_ptr(rap_cc,a_cc) hypre_BoxLoop2Begin(hypre_StructMatrixNDim(A), loop_size, A_dbox, fstart, stridef, iA, RAP_dbox, cstart, stridec, iAc); { rap_cc[iAc] = 2.0 * a_cc[iA] + center_int; } hypre_BoxLoop2End(iA, iAc); #undef DEVICE_VAR hypre_CopyBox(cgrid_box, fcbox); hypre_StructMapCoarseToFine(hypre_BoxIMin(fcbox), cindex, cstride, hypre_BoxIMin(fcbox)); hypre_StructMapCoarseToFine(hypre_BoxIMax(fcbox), cindex, cstride, hypre_BoxIMax(fcbox)); hypre_BoxArraySetSize(bdy_boxes, 0); if (hypre_BoxIMinD(fcbox, cdir) == hypre_BoxIMinD(fgrid_box, cdir)) { hypre_BoxBoundaryIntersect(fcbox, fgrid, cdir, -1, bdy_boxes); } if (hypre_BoxIMaxD(fcbox, cdir) == hypre_BoxIMaxD(fgrid_box, cdir)) { hypre_BoxBoundaryIntersect(fcbox, fgrid, cdir, 1, tmp_boxes); hypre_AppendBoxArray(tmp_boxes, bdy_boxes); } hypre_ForBoxI(fbi, bdy_boxes) { bdy_box = hypre_BoxArrayBox(bdy_boxes, fbi); hypre_BoxGetSize(bdy_box, loop_size); bfstart = hypre_BoxIMin(bdy_box); hypre_StructMapFineToCoarse(bfstart, cindex, cstride, bcstart); #define DEVICE_VAR is_device_ptr(rap_cc,a_cc) hypre_BoxLoop2Begin(hypre_StructMatrixNDim(A), loop_size, A_dbox, bfstart, stridef, iA, RAP_dbox, bcstart, stridec, iAc); { rap_cc[iAc] -= 0.5 * a_cc[iA] + center_bdy; } hypre_BoxLoop2End(iA, iAc); #undef DEVICE_VAR } } } /* end ForBoxI */ hypre_BoxDestroy(fcbox); hypre_BoxArrayDestroy(bdy_boxes); hypre_BoxArrayDestroy(tmp_boxes); return hypre_error_flag; } hypre-2.33.0/src/struct_ls/pfmg_solve.c000066400000000000000000000327751477326011500200700ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "_hypre_struct_ls.h" #include "pfmg.h" #define DEBUG 0 /*-------------------------------------------------------------------------- * hypre_PFMGSolve * * NOTE regarding hypre_StructVectorClearAllValues: * * Since r_l and e_l point to the same temporary data, the boundary ghost values * are not guaranteed to stay clear as needed in the constant coefficient case. * In addition, for the Galerkin case, the interpolation operator is set to be a * variable coefficient operator. However, interpolation values that reach * outside of the boundary are currently not always computed to be zero in this * case, so we can't rewrite SemiRestrict and SemiInterp to faithfully zero out * boundary ghost values only when needed because there isn't enough context. * So, below we clear the values of r_l and e_l before computing the residual * and calling interpolation. * *--------------------------------------------------------------------------*/ HYPRE_Int hypre_PFMGSolve( void *pfmg_vdata, hypre_StructMatrix *A, hypre_StructVector *b, hypre_StructVector *x ) { hypre_PFMGData *pfmg_data = (hypre_PFMGData *)pfmg_vdata; HYPRE_Real tol = (pfmg_data -> tol); HYPRE_Int max_iter = (pfmg_data -> max_iter); HYPRE_Int rel_change = (pfmg_data -> rel_change); HYPRE_Int zero_guess = (pfmg_data -> zero_guess); HYPRE_Int num_pre_relax = (pfmg_data -> num_pre_relax); HYPRE_Int num_post_relax = (pfmg_data -> num_post_relax); HYPRE_Int num_levels = (pfmg_data -> num_levels); hypre_StructMatrix **A_l = (pfmg_data -> A_l); hypre_StructMatrix **P_l = (pfmg_data -> P_l); hypre_StructMatrix **RT_l = (pfmg_data -> RT_l); hypre_StructVector **b_l = (pfmg_data -> b_l); hypre_StructVector **x_l = (pfmg_data -> x_l); hypre_StructVector **r_l = (pfmg_data -> r_l); hypre_StructVector **e_l = (pfmg_data -> e_l); void **relax_data_l = (pfmg_data -> relax_data_l); void **matvec_data_l = (pfmg_data -> matvec_data_l); void **restrict_data_l = (pfmg_data -> restrict_data_l); void **interp_data_l = (pfmg_data -> interp_data_l); HYPRE_Int logging = (pfmg_data -> logging); HYPRE_Real *norms = (pfmg_data -> norms); HYPRE_Real *rel_norms = (pfmg_data -> rel_norms); HYPRE_Int *active_l = (pfmg_data -> active_l); HYPRE_Real b_dot_b = 0, r_dot_r, eps = 0; HYPRE_Real e_dot_e = 0.0, x_dot_x = 1.0; HYPRE_Int i, l; HYPRE_Int constant_coefficient; #if DEBUG char filename[255]; #endif /*----------------------------------------------------- * Initialize some things and deal with special cases *-----------------------------------------------------*/ HYPRE_ANNOTATE_FUNC_BEGIN; hypre_BeginTiming(pfmg_data -> time_index); constant_coefficient = hypre_StructMatrixConstantCoefficient(A); hypre_StructMatrixDestroy(A_l[0]); hypre_StructVectorDestroy(b_l[0]); hypre_StructVectorDestroy(x_l[0]); A_l[0] = hypre_StructMatrixRef(A); b_l[0] = hypre_StructVectorRef(b); x_l[0] = hypre_StructVectorRef(x); (pfmg_data -> num_iterations) = 0; /* if max_iter is zero, return */ if (max_iter == 0) { /* if using a zero initial guess, return zero */ if (zero_guess) { hypre_StructVectorSetConstantValues(x, 0.0); } hypre_EndTiming(pfmg_data -> time_index); HYPRE_ANNOTATE_FUNC_END; return hypre_error_flag; } /* part of convergence check */ if (tol > 0.0) { /* eps = (tol^2) */ b_dot_b = hypre_StructInnerProd(b_l[0], b_l[0]); eps = tol * tol; /* if rhs is zero, return a zero solution */ if (b_dot_b == 0.0) { hypre_StructVectorSetConstantValues(x, 0.0); if (logging > 0) { norms[0] = 0.0; rel_norms[0] = 0.0; } hypre_EndTiming(pfmg_data -> time_index); HYPRE_ANNOTATE_FUNC_END; return hypre_error_flag; } } /*----------------------------------------------------- * Do V-cycles: * For each index l, "fine" = l, "coarse" = (l+1) *-----------------------------------------------------*/ for (i = 0; i < max_iter; i++) { /*-------------------------------------------------- * Down cycle *--------------------------------------------------*/ HYPRE_ANNOTATE_MGLEVEL_BEGIN(0); if (constant_coefficient) { hypre_StructVectorClearAllValues(r_l[0]); } /* fine grid pre-relaxation */ HYPRE_ANNOTATE_REGION_BEGIN("%s", "Relaxation"); hypre_PFMGRelaxSetPreRelax(relax_data_l[0]); hypre_PFMGRelaxSetMaxIter(relax_data_l[0], num_pre_relax); hypre_PFMGRelaxSetZeroGuess(relax_data_l[0], zero_guess); hypre_PFMGRelax(relax_data_l[0], A_l[0], b_l[0], x_l[0]); zero_guess = 0; HYPRE_ANNOTATE_REGION_END("%s", "Relaxation"); /* compute fine grid residual (b - Ax) */ HYPRE_ANNOTATE_REGION_BEGIN("%s", "Residual"); hypre_StructCopy(b_l[0], r_l[0]); hypre_StructMatvecCompute(matvec_data_l[0], -1.0, A_l[0], x_l[0], 1.0, r_l[0]); HYPRE_ANNOTATE_REGION_END("%s", "Residual"); /* convergence check */ if (tol > 0.0) { r_dot_r = hypre_StructInnerProd(r_l[0], r_l[0]); if (logging > 0) { norms[i] = hypre_sqrt(r_dot_r); if (b_dot_b > 0) { rel_norms[i] = hypre_sqrt(r_dot_r / b_dot_b); } else { rel_norms[i] = 0.0; } } /* always do at least 1 V-cycle */ if ((r_dot_r / b_dot_b < eps) && (i > 0)) { if ( ((rel_change) && (e_dot_e / x_dot_x) < eps) || (!rel_change) ) { HYPRE_ANNOTATE_MGLEVEL_END(0); break; } } } if (num_levels > 1) { /* restrict fine grid residual */ hypre_SemiRestrict(restrict_data_l[0], RT_l[0], r_l[0], b_l[1]); #if DEBUG hypre_sprintf(filename, "zout_xdown.%02d", 0); hypre_StructVectorPrint(filename, x_l[0], 0); hypre_sprintf(filename, "zout_rdown.%02d", 0); hypre_StructVectorPrint(filename, r_l[0], 0); hypre_sprintf(filename, "zout_b.%02d", 1); hypre_StructVectorPrint(filename, b_l[1], 0); #endif HYPRE_ANNOTATE_MGLEVEL_END(0); for (l = 1; l <= (num_levels - 2); l++) { HYPRE_ANNOTATE_MGLEVEL_BEGIN(l); #if 0 //defined(HYPRE_USING_CUDA) || defined(HYPRE_USING_HIP) if (hypre_StructGridDataLocation(hypre_StructVectorGrid(r_l[l])) == HYPRE_MEMORY_HOST) { hypre_SetDeviceOff(); } #endif if (constant_coefficient) { hypre_StructVectorClearAllValues(r_l[l]); } if (active_l[l]) { /* pre-relaxation */ HYPRE_ANNOTATE_REGION_BEGIN("%s", "Relaxation"); hypre_PFMGRelaxSetPreRelax(relax_data_l[l]); hypre_PFMGRelaxSetMaxIter(relax_data_l[l], num_pre_relax); hypre_PFMGRelaxSetZeroGuess(relax_data_l[l], 1); hypre_PFMGRelax(relax_data_l[l], A_l[l], b_l[l], x_l[l]); HYPRE_ANNOTATE_REGION_END("%s", "Relaxation"); /* compute residual (b - Ax) */ HYPRE_ANNOTATE_REGION_BEGIN("%s", "Residual"); hypre_StructCopy(b_l[l], r_l[l]); hypre_StructMatvecCompute(matvec_data_l[l], -1.0, A_l[l], x_l[l], 1.0, r_l[l]); HYPRE_ANNOTATE_REGION_END("%s", "Residual"); } else { /* inactive level, set x=0, so r=(b-Ax)=b */ hypre_StructVectorSetConstantValues(x_l[l], 0.0); hypre_StructCopy(b_l[l], r_l[l]); } /* restrict residual */ hypre_SemiRestrict(restrict_data_l[l], RT_l[l], r_l[l], b_l[l + 1]); #if DEBUG hypre_printf("Level %d: b_l = %.30e\n", l + 1, hypre_StructInnerProd(b_l[l + 1], b_l[l + 1])); hypre_sprintf(filename, "zout_xdown.%02d", l); hypre_StructVectorPrint(filename, x_l[l], 0); hypre_sprintf(filename, "zout_rdown.%02d", l); hypre_StructVectorPrint(filename, r_l[l], 0); hypre_sprintf(filename, "zout_b.%02d", l + 1); hypre_StructVectorPrint(filename, b_l[l + 1], 0); #endif HYPRE_ANNOTATE_MGLEVEL_END(l); } /*-------------------------------------------------- * Bottom *--------------------------------------------------*/ HYPRE_ANNOTATE_MGLEVEL_BEGIN(num_levels - 1); if (active_l[l]) { HYPRE_ANNOTATE_REGION_BEGIN("%s", "Relaxation"); hypre_PFMGRelaxSetZeroGuess(relax_data_l[l], 1); hypre_PFMGRelax(relax_data_l[l], A_l[l], b_l[l], x_l[l]); HYPRE_ANNOTATE_REGION_END("%s", "Relaxation"); } else { hypre_StructVectorSetConstantValues(x_l[l], 0.0); } #if DEBUG hypre_sprintf(filename, "zout_xbottom.%02d", l); hypre_StructVectorPrint(filename, x_l[l], 0); hypre_printf("Level %d: x_l = %.30e\n", l, hypre_StructInnerProd(x_l[l], x_l[l])); #endif /*-------------------------------------------------- * Up cycle *--------------------------------------------------*/ for (l = (num_levels - 2); l >= 1; l--) { #if 0 //defined(HYPRE_USING_CUDA) || defined(HYPRE_USING_HIP) if (hypre_StructGridDataLocation(hypre_StructVectorGrid(e_l[l])) == HYPRE_MEMORY_DEVICE) { hypre_SetDeviceOn(); } #endif if (constant_coefficient) { hypre_StructVectorClearAllValues(e_l[l]); } /* interpolate error and correct (x = x + Pe_c) */ hypre_SemiInterp(interp_data_l[l], P_l[l], x_l[l + 1], e_l[l]); hypre_StructAxpy(1.0, e_l[l], x_l[l]); HYPRE_ANNOTATE_MGLEVEL_END(l + 1); #if DEBUG hypre_sprintf(filename, "zout_eup.%02d", l); hypre_StructVectorPrint(filename, e_l[l], 0); hypre_sprintf(filename, "zout_xup.%02d", l); hypre_StructVectorPrint(filename, x_l[l], 0); hypre_printf("Level %d: x_l = %.15e\n", l, hypre_StructInnerProd(x_l[l], x_l[l])); #endif HYPRE_ANNOTATE_MGLEVEL_BEGIN(l); if (active_l[l]) { /* post-relaxation */ HYPRE_ANNOTATE_REGION_BEGIN("%s", "Relaxation"); hypre_PFMGRelaxSetPostRelax(relax_data_l[l]); hypre_PFMGRelaxSetMaxIter(relax_data_l[l], num_post_relax); hypre_PFMGRelaxSetZeroGuess(relax_data_l[l], 0); hypre_PFMGRelax(relax_data_l[l], A_l[l], b_l[l], x_l[l]); HYPRE_ANNOTATE_REGION_END("%s", "Relaxation"); } } #if 0 //defined(HYPRE_USING_CUDA) || defined(HYPRE_USING_HIP) if (hypre_StructGridDataLocation(hypre_StructVectorGrid(e_l[0])) == HYPRE_MEMORY_DEVICE) { hypre_SetDeviceOn(); } #endif if (constant_coefficient) { hypre_StructVectorClearAllValues(e_l[0]); } /* interpolate error and correct on fine grid (x = x + Pe_c) */ hypre_SemiInterp(interp_data_l[0], P_l[0], x_l[1], e_l[0]); hypre_StructAxpy(1.0, e_l[0], x_l[0]); HYPRE_ANNOTATE_MGLEVEL_END(1); #if DEBUG hypre_printf("Level 0: x_l = %.15e\n", hypre_StructInnerProd(x_l[0], x_l[0])); hypre_sprintf(filename, "zout_eup.%02d", 0); hypre_StructVectorPrint(filename, e_l[0], 0); hypre_sprintf(filename, "zout_xup.%02d", 0); hypre_StructVectorPrint(filename, x_l[0], 0); #endif HYPRE_ANNOTATE_MGLEVEL_BEGIN(0); } /* part of convergence check */ if ((tol > 0.0) && (rel_change)) { if (num_levels > 1) { e_dot_e = hypre_StructInnerProd(e_l[0], e_l[0]); x_dot_x = hypre_StructInnerProd(x_l[0], x_l[0]); } else { e_dot_e = 0.0; x_dot_x = 1.0; } } HYPRE_ANNOTATE_REGION_BEGIN("%s", "Relaxation"); hypre_PFMGRelaxSetPostRelax(relax_data_l[0]); hypre_PFMGRelaxSetMaxIter(relax_data_l[0], num_post_relax); hypre_PFMGRelaxSetZeroGuess(relax_data_l[0], 0); hypre_PFMGRelax(relax_data_l[0], A_l[0], b_l[0], x_l[0]); HYPRE_ANNOTATE_REGION_END("%s", "Relaxation"); (pfmg_data -> num_iterations) = (i + 1); HYPRE_ANNOTATE_MGLEVEL_END(0); } hypre_EndTiming(pfmg_data -> time_index); HYPRE_ANNOTATE_FUNC_END; return hypre_error_flag; } hypre-2.33.0/src/struct_ls/point_relax.c000066400000000000000000001515061477326011500202450ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "_hypre_struct_ls.h" #include "_hypre_struct_mv.hpp" /* this currently cannot be greater than 7 */ #ifdef MAX_DEPTH #undef MAX_DEPTH #endif #define MAX_DEPTH 7 /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ typedef struct { MPI_Comm comm; HYPRE_Real tol; /* tolerance, set =0 for no convergence testing */ HYPRE_Real rresnorm; /* relative residual norm, computed only if tol>0.0 */ HYPRE_Int max_iter; HYPRE_Int rel_change; /* not yet used */ HYPRE_Int zero_guess; HYPRE_Real weight; HYPRE_Int num_pointsets; HYPRE_Int *pointset_sizes; HYPRE_Int *pointset_ranks; hypre_Index *pointset_strides; hypre_Index **pointset_indices; hypre_StructMatrix *A; hypre_StructVector *b; hypre_StructVector *x; hypre_StructVector *t; HYPRE_Int diag_rank; hypre_ComputePkg **compute_pkgs; /* log info (always logged) */ HYPRE_Int num_iterations; HYPRE_Int time_index; HYPRE_BigInt flops; } hypre_PointRelaxData; /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ void * hypre_PointRelaxCreate( MPI_Comm comm ) { hypre_PointRelaxData *relax_data; hypre_Index stride; hypre_Index indices[1]; relax_data = hypre_CTAlloc(hypre_PointRelaxData, 1, HYPRE_MEMORY_HOST); (relax_data -> comm) = comm; (relax_data -> time_index) = hypre_InitializeTiming("PointRelax"); /* set defaults */ (relax_data -> tol) = 0.0; /* tol=0 means no convergence testing */ (relax_data -> rresnorm) = 0.0; (relax_data -> max_iter) = 1000; (relax_data -> rel_change) = 0; (relax_data -> zero_guess) = 0; (relax_data -> weight) = 1.0; (relax_data -> num_pointsets) = 0; (relax_data -> pointset_sizes) = NULL; (relax_data -> pointset_ranks) = NULL; (relax_data -> pointset_strides) = NULL; (relax_data -> pointset_indices) = NULL; (relax_data -> A) = NULL; (relax_data -> b) = NULL; (relax_data -> x) = NULL; (relax_data -> t) = NULL; (relax_data -> compute_pkgs) = NULL; hypre_SetIndex3(stride, 1, 1, 1); hypre_SetIndex3(indices[0], 0, 0, 0); hypre_PointRelaxSetNumPointsets((void *) relax_data, 1); hypre_PointRelaxSetPointset((void *) relax_data, 0, 1, stride, indices); return (void *) relax_data; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_PointRelaxDestroy( void *relax_vdata ) { hypre_PointRelaxData *relax_data = (hypre_PointRelaxData *)relax_vdata; HYPRE_Int i; if (relax_data) { for (i = 0; i < (relax_data -> num_pointsets); i++) { hypre_TFree(relax_data -> pointset_indices[i], HYPRE_MEMORY_HOST); } if (relax_data -> compute_pkgs) { for (i = 0; i < (relax_data -> num_pointsets); i++) { hypre_ComputePkgDestroy(relax_data -> compute_pkgs[i]); } } hypre_TFree(relax_data -> pointset_sizes, HYPRE_MEMORY_HOST); hypre_TFree(relax_data -> pointset_ranks, HYPRE_MEMORY_HOST); hypre_TFree(relax_data -> pointset_strides, HYPRE_MEMORY_HOST); hypre_TFree(relax_data -> pointset_indices, HYPRE_MEMORY_HOST); hypre_StructMatrixDestroy(relax_data -> A); hypre_StructVectorDestroy(relax_data -> b); hypre_StructVectorDestroy(relax_data -> x); hypre_StructVectorDestroy(relax_data -> t); hypre_TFree(relax_data -> compute_pkgs, HYPRE_MEMORY_HOST); hypre_FinalizeTiming(relax_data -> time_index); hypre_TFree(relax_data, HYPRE_MEMORY_HOST); } return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_PointRelaxSetup( void *relax_vdata, hypre_StructMatrix *A, hypre_StructVector *b, hypre_StructVector *x ) { hypre_PointRelaxData *relax_data = (hypre_PointRelaxData *)relax_vdata; HYPRE_Int num_pointsets = (relax_data -> num_pointsets); HYPRE_Int *pointset_sizes = (relax_data -> pointset_sizes); hypre_Index *pointset_strides = (relax_data -> pointset_strides); hypre_Index **pointset_indices = (relax_data -> pointset_indices); HYPRE_Int ndim = hypre_StructMatrixNDim(A); hypre_StructVector *t; HYPRE_Int diag_rank; hypre_ComputeInfo *compute_info; hypre_ComputePkg **compute_pkgs; hypre_Index diag_index; hypre_IndexRef stride; hypre_IndexRef index; hypre_StructGrid *grid; hypre_StructStencil *stencil; hypre_BoxArrayArray *orig_indt_boxes; hypre_BoxArrayArray *orig_dept_boxes; hypre_BoxArrayArray *box_aa; hypre_BoxArray *box_a; hypre_Box *box; HYPRE_Int box_aa_size; HYPRE_Int box_a_size; hypre_BoxArrayArray *new_box_aa; hypre_BoxArray *new_box_a; hypre_Box *new_box; HYPRE_Real scale; HYPRE_Int frac; HYPRE_Int i, j, k, p, m, compute_i; /*---------------------------------------------------------- * Set up the temp vector *----------------------------------------------------------*/ if ((relax_data -> t) == NULL) { t = hypre_StructVectorCreate(hypre_StructVectorComm(b), hypre_StructVectorGrid(b)); hypre_StructVectorSetNumGhost(t, hypre_StructVectorNumGhost(b)); hypre_StructVectorInitialize(t); hypre_StructVectorAssemble(t); (relax_data -> t) = t; } /*---------------------------------------------------------- * Find the matrix diagonal *----------------------------------------------------------*/ grid = hypre_StructMatrixGrid(A); stencil = hypre_StructMatrixStencil(A); hypre_SetIndex3(diag_index, 0, 0, 0); diag_rank = hypre_StructStencilElementRank(stencil, diag_index); /*---------------------------------------------------------- * Set up the compute packages *----------------------------------------------------------*/ compute_pkgs = hypre_CTAlloc(hypre_ComputePkg *, num_pointsets, HYPRE_MEMORY_HOST); for (p = 0; p < num_pointsets; p++) { hypre_CreateComputeInfo(grid, stencil, &compute_info); orig_indt_boxes = hypre_ComputeInfoIndtBoxes(compute_info); orig_dept_boxes = hypre_ComputeInfoDeptBoxes(compute_info); stride = pointset_strides[p]; for (compute_i = 0; compute_i < 2; compute_i++) { switch (compute_i) { case 0: box_aa = orig_indt_boxes; break; case 1: box_aa = orig_dept_boxes; break; } box_aa_size = hypre_BoxArrayArraySize(box_aa); new_box_aa = hypre_BoxArrayArrayCreate(box_aa_size, ndim); for (i = 0; i < box_aa_size; i++) { box_a = hypre_BoxArrayArrayBoxArray(box_aa, i); box_a_size = hypre_BoxArraySize(box_a); new_box_a = hypre_BoxArrayArrayBoxArray(new_box_aa, i); hypre_BoxArraySetSize(new_box_a, box_a_size * pointset_sizes[p]); k = 0; for (m = 0; m < pointset_sizes[p]; m++) { index = pointset_indices[p][m]; for (j = 0; j < box_a_size; j++) { box = hypre_BoxArrayBox(box_a, j); new_box = hypre_BoxArrayBox(new_box_a, k); hypre_CopyBox(box, new_box); hypre_ProjectBox(new_box, index, stride); k++; } } } switch (compute_i) { case 0: hypre_ComputeInfoIndtBoxes(compute_info) = new_box_aa; break; case 1: hypre_ComputeInfoDeptBoxes(compute_info) = new_box_aa; break; } } hypre_CopyIndex(stride, hypre_ComputeInfoStride(compute_info)); hypre_ComputePkgCreate(compute_info, hypre_StructVectorDataSpace(x), 1, grid, &compute_pkgs[p]); hypre_BoxArrayArrayDestroy(orig_indt_boxes); hypre_BoxArrayArrayDestroy(orig_dept_boxes); } /*---------------------------------------------------------- * Set up the relax data structure *----------------------------------------------------------*/ (relax_data -> A) = hypre_StructMatrixRef(A); (relax_data -> x) = hypre_StructVectorRef(x); (relax_data -> b) = hypre_StructVectorRef(b); (relax_data -> diag_rank) = diag_rank; (relax_data -> compute_pkgs) = compute_pkgs; /*----------------------------------------------------- * Compute flops *-----------------------------------------------------*/ scale = 0.0; for (p = 0; p < num_pointsets; p++) { stride = pointset_strides[p]; frac = hypre_IndexX(stride); frac *= hypre_IndexY(stride); frac *= hypre_IndexZ(stride); scale += (pointset_sizes[p] / frac); } (relax_data -> flops) = (HYPRE_BigInt)scale * (hypre_StructMatrixGlobalSize(A) + hypre_StructVectorGlobalSize(x)); return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_PointRelax( void *relax_vdata, hypre_StructMatrix *A, hypre_StructVector *b, hypre_StructVector *x ) { hypre_PointRelaxData *relax_data = (hypre_PointRelaxData *)relax_vdata; HYPRE_Int max_iter = (relax_data -> max_iter); HYPRE_Int zero_guess = (relax_data -> zero_guess); HYPRE_Real weight = (relax_data -> weight); HYPRE_Int num_pointsets = (relax_data -> num_pointsets); HYPRE_Int *pointset_ranks = (relax_data -> pointset_ranks); hypre_Index *pointset_strides = (relax_data -> pointset_strides); hypre_StructVector *t = (relax_data -> t); HYPRE_Int diag_rank = (relax_data -> diag_rank); hypre_ComputePkg **compute_pkgs = (relax_data -> compute_pkgs); HYPRE_Real tol = (relax_data -> tol); HYPRE_Real tol2 = tol * tol; hypre_ComputePkg *compute_pkg; hypre_CommHandle *comm_handle; hypre_BoxArrayArray *compute_box_aa; hypre_BoxArray *compute_box_a; hypre_Box *compute_box; hypre_Box *A_data_box; hypre_Box *b_data_box; hypre_Box *x_data_box; hypre_Box *t_data_box; HYPRE_Real *Ap; HYPRE_Real AAp0; HYPRE_Real *bp; HYPRE_Real *xp; HYPRE_Real *tp; void *matvec_data = NULL; HYPRE_Int Ai; hypre_IndexRef stride; hypre_IndexRef start; hypre_Index loop_size; HYPRE_Int constant_coefficient; HYPRE_Int iter, p, compute_i, i, j; HYPRE_Int pointset; HYPRE_Real bsumsq = 1.0, rsumsq; /*---------------------------------------------------------- * Initialize some things and deal with special cases *----------------------------------------------------------*/ hypre_BeginTiming(relax_data -> time_index); hypre_StructMatrixDestroy(relax_data -> A); hypre_StructVectorDestroy(relax_data -> b); hypre_StructVectorDestroy(relax_data -> x); (relax_data -> A) = hypre_StructMatrixRef(A); (relax_data -> x) = hypre_StructVectorRef(x); (relax_data -> b) = hypre_StructVectorRef(b); (relax_data -> num_iterations) = 0; /* if max_iter is zero, return */ if (max_iter == 0) { /* if using a zero initial guess, return zero */ if (zero_guess) { hypre_StructVectorSetConstantValues(x, 0.0); } hypre_EndTiming(relax_data -> time_index); return hypre_error_flag; } constant_coefficient = hypre_StructMatrixConstantCoefficient(A); if (constant_coefficient) { hypre_StructVectorClearBoundGhostValues(x, 0); } rsumsq = 0.0; if ( tol > 0.0 ) { bsumsq = hypre_StructInnerProd( b, b ); } /*---------------------------------------------------------- * Do zero_guess iteration *----------------------------------------------------------*/ p = 0; iter = 0; if ( tol > 0.0) { matvec_data = hypre_StructMatvecCreate(); hypre_StructMatvecSetup( matvec_data, A, x ); } if (zero_guess) { if ( p == 0 ) { rsumsq = 0.0; } if (num_pointsets > 1) { hypre_StructVectorSetConstantValues(x, 0.0); } pointset = pointset_ranks[p]; compute_pkg = compute_pkgs[pointset]; stride = pointset_strides[pointset]; for (compute_i = 0; compute_i < 2; compute_i++) { switch (compute_i) { case 0: { compute_box_aa = hypre_ComputePkgIndtBoxes(compute_pkg); } break; case 1: { compute_box_aa = hypre_ComputePkgDeptBoxes(compute_pkg); } break; } hypre_ForBoxArrayI(i, compute_box_aa) { compute_box_a = hypre_BoxArrayArrayBoxArray(compute_box_aa, i); A_data_box = hypre_BoxArrayBox(hypre_StructMatrixDataSpace(A), i); b_data_box = hypre_BoxArrayBox(hypre_StructVectorDataSpace(b), i); x_data_box = hypre_BoxArrayBox(hypre_StructVectorDataSpace(x), i); Ap = hypre_StructMatrixBoxData(A, i, diag_rank); bp = hypre_StructVectorBoxData(b, i); xp = hypre_StructVectorBoxData(x, i); hypre_ForBoxI(j, compute_box_a) { compute_box = hypre_BoxArrayBox(compute_box_a, j); start = hypre_BoxIMin(compute_box); hypre_BoxGetStrideSize(compute_box, stride, loop_size); /* all matrix coefficients are constant */ if ( constant_coefficient == 1 ) { Ai = hypre_CCBoxIndexRank( A_data_box, start ); AAp0 = 1 / Ap[Ai]; #define DEVICE_VAR is_device_ptr(xp,bp) hypre_BoxLoop2Begin(hypre_StructVectorNDim(x), loop_size, b_data_box, start, stride, bi, x_data_box, start, stride, xi); { xp[xi] = bp[bi] * AAp0; } hypre_BoxLoop2End(bi, xi); #undef DEVICE_VAR } /* constant_coefficent 0 (variable) or 2 (variable diagonal only) are the same for the diagonal */ else { #define DEVICE_VAR is_device_ptr(xp,bp,Ap) hypre_BoxLoop3Begin(hypre_StructVectorNDim(x), loop_size, A_data_box, start, stride, Ai, b_data_box, start, stride, bi, x_data_box, start, stride, xi); { xp[xi] = bp[bi] / Ap[Ai]; } hypre_BoxLoop3End(Ai, bi, xi); #undef DEVICE_VAR } } } } if (weight != 1.0) { hypre_StructScale(weight, x); } p = (p + 1) % num_pointsets; iter = iter + (p == 0); if ( tol > 0.0 && p == 0 ) /* ... p==0 here means we've finished going through all the pointsets, i.e. this iteration is complete. tol>0.0 means to do a convergence test, using tol. The test is simply ||r||/||b|| */ if ( rsumsq / bsumsq < tol2 ) { max_iter = iter; } /* converged; reset max_iter to prevent more iterations */ } } /*---------------------------------------------------------- * Do regular iterations *----------------------------------------------------------*/ while (iter < max_iter) { if ( p == 0 ) { rsumsq = 0.0; } pointset = pointset_ranks[p]; compute_pkg = compute_pkgs[pointset]; stride = pointset_strides[pointset]; /*hypre_StructCopy(x, t); ... not needed as long as the copy at the end of the loop is restricted to the current pointset (hypre_relax_copy, hypre_relax_wtx */ for (compute_i = 0; compute_i < 2; compute_i++) { switch (compute_i) { case 0: { xp = hypre_StructVectorData(x); hypre_InitializeIndtComputations(compute_pkg, xp, &comm_handle); compute_box_aa = hypre_ComputePkgIndtBoxes(compute_pkg); } break; case 1: { hypre_FinalizeIndtComputations(comm_handle); compute_box_aa = hypre_ComputePkgDeptBoxes(compute_pkg); } break; } hypre_ForBoxArrayI(i, compute_box_aa) { compute_box_a = hypre_BoxArrayArrayBoxArray(compute_box_aa, i); A_data_box = hypre_BoxArrayBox(hypre_StructMatrixDataSpace(A), i); b_data_box = hypre_BoxArrayBox(hypre_StructVectorDataSpace(b), i); x_data_box = hypre_BoxArrayBox(hypre_StructVectorDataSpace(x), i); t_data_box = hypre_BoxArrayBox(hypre_StructVectorDataSpace(t), i); bp = hypre_StructVectorBoxData(b, i); xp = hypre_StructVectorBoxData(x, i); tp = hypre_StructVectorBoxData(t, i); hypre_ForBoxI(j, compute_box_a) { compute_box = hypre_BoxArrayBox(compute_box_a, j); if ( constant_coefficient == 1 || constant_coefficient == 2 ) { hypre_PointRelax_core12( relax_vdata, A, constant_coefficient, compute_box, bp, xp, tp, i, A_data_box, b_data_box, x_data_box, t_data_box, stride ); } else { hypre_PointRelax_core0( relax_vdata, A, constant_coefficient, compute_box, bp, xp, tp, i, A_data_box, b_data_box, x_data_box, t_data_box, stride ); } Ap = hypre_StructMatrixBoxData(A, i, diag_rank); if ( constant_coefficient == 0 || constant_coefficient == 2 ) /* divide by the variable diagonal */ { start = hypre_BoxIMin(compute_box); hypre_BoxGetStrideSize(compute_box, stride, loop_size); #define DEVICE_VAR is_device_ptr(tp,Ap) hypre_BoxLoop2Begin(hypre_StructVectorNDim(x), loop_size, A_data_box, start, stride, Ai, t_data_box, start, stride, ti); { tp[ti] /= Ap[Ai]; } hypre_BoxLoop2End(Ai, ti); #undef DEVICE_VAR } } } } if (weight != 1.0) { /* hypre_StructScale((1.0 - weight), x); hypre_StructAxpy(weight, t, x);*/ hypre_relax_wtx( relax_data, pointset, t, x ); /* x=w*t+(1-w)*x on pointset */ } else { hypre_relax_copy( relax_data, pointset, t, x ); /* x=t on pointset */ /* hypre_StructCopy(t, x);*/ } p = (p + 1) % num_pointsets; iter = iter + (p == 0); if ( tol > 0.0 && p == 0 ) /* ... p==0 here means we've finished going through all the pointsets, i.e. this iteration is complete. tol>0.0 means to do a convergence test, using tol. The test is simply ||r||/||b|| */ if ( rsumsq / bsumsq < tol2 ) { break; } } } if ( tol > 0.0 ) { hypre_StructMatvecDestroy( matvec_data ); } if ( tol > 0.0 ) { (relax_data -> rresnorm) = hypre_sqrt( rsumsq / bsumsq ); } (relax_data -> num_iterations) = iter; /*----------------------------------------------------------------------- * Return *-----------------------------------------------------------------------*/ hypre_IncFLOPCount(relax_data -> flops); hypre_EndTiming(relax_data -> time_index); return hypre_error_flag; } /* for constant_coefficient==0, all coefficients may vary ...*/ HYPRE_Int hypre_PointRelax_core0( void *relax_vdata, hypre_StructMatrix *A, HYPRE_Int constant_coefficient, hypre_Box *compute_box, HYPRE_Real *bp, HYPRE_Real *xp, HYPRE_Real *tp, HYPRE_Int boxarray_id, hypre_Box *A_data_box, hypre_Box *b_data_box, hypre_Box *x_data_box, hypre_Box *t_data_box, hypre_IndexRef stride ) { HYPRE_UNUSED_VAR(constant_coefficient); hypre_PointRelaxData *relax_data = (hypre_PointRelaxData *)relax_vdata; HYPRE_Real *Ap0; HYPRE_Real *Ap1; HYPRE_Real *Ap2; HYPRE_Real *Ap3; HYPRE_Real *Ap4; HYPRE_Real *Ap5; HYPRE_Real *Ap6; HYPRE_Int xoff0; HYPRE_Int xoff1; HYPRE_Int xoff2; HYPRE_Int xoff3; HYPRE_Int xoff4; HYPRE_Int xoff5; HYPRE_Int xoff6; hypre_StructStencil *stencil; hypre_Index *stencil_shape; HYPRE_Int stencil_size; HYPRE_Int diag_rank = (relax_data -> diag_rank); hypre_IndexRef start; hypre_Index loop_size; HYPRE_Int si, sk, ssi[MAX_DEPTH], depth, k; stencil = hypre_StructMatrixStencil(A); stencil_shape = hypre_StructStencilShape(stencil); stencil_size = hypre_StructStencilSize(stencil); start = hypre_BoxIMin(compute_box); hypre_BoxGetStrideSize(compute_box, stride, loop_size); #define DEVICE_VAR is_device_ptr(tp,bp) hypre_BoxLoop2Begin(hypre_StructMatrixNDim(A), loop_size, b_data_box, start, stride, bi, t_data_box, start, stride, ti); { tp[ti] = bp[bi]; } hypre_BoxLoop2End(bi, ti); #undef DEVICE_VAR /* unroll up to depth MAX_DEPTH */ for (si = 0; si < stencil_size; si += MAX_DEPTH) { depth = hypre_min(MAX_DEPTH, (stencil_size - si)); for (k = 0, sk = si; k < depth; sk++) { if (sk == diag_rank) { depth--; } else { ssi[k] = sk; k++; } } switch (depth) { case 7: Ap6 = hypre_StructMatrixBoxData(A, boxarray_id, ssi[6]); xoff6 = hypre_BoxOffsetDistance(x_data_box, stencil_shape[ssi[6]]); /* fall through */ case 6: Ap5 = hypre_StructMatrixBoxData(A, boxarray_id, ssi[5]); xoff5 = hypre_BoxOffsetDistance(x_data_box, stencil_shape[ssi[5]]); /* fall through */ case 5: Ap4 = hypre_StructMatrixBoxData(A, boxarray_id, ssi[4]); xoff4 = hypre_BoxOffsetDistance(x_data_box, stencil_shape[ssi[4]]); /* fall through */ case 4: Ap3 = hypre_StructMatrixBoxData(A, boxarray_id, ssi[3]); xoff3 = hypre_BoxOffsetDistance(x_data_box, stencil_shape[ssi[3]]); /* fall through */ case 3: Ap2 = hypre_StructMatrixBoxData(A, boxarray_id, ssi[2]); xoff2 = hypre_BoxOffsetDistance(x_data_box, stencil_shape[ssi[2]]); /* fall through */ case 2: Ap1 = hypre_StructMatrixBoxData(A, boxarray_id, ssi[1]); xoff1 = hypre_BoxOffsetDistance(x_data_box, stencil_shape[ssi[1]]); /* fall through */ case 1: Ap0 = hypre_StructMatrixBoxData(A, boxarray_id, ssi[0]); xoff0 = hypre_BoxOffsetDistance(x_data_box, stencil_shape[ssi[0]]); /* fall through */ case 0: break; } switch (depth) { case 7: #define DEVICE_VAR is_device_ptr(tp,Ap0,Ap1,Ap2,Ap3,Ap4,Ap5,Ap6,xp) hypre_BoxLoop3Begin(hypre_StructMatrixNDim(A), loop_size, A_data_box, start, stride, Ai, x_data_box, start, stride, xi, t_data_box, start, stride, ti); { tp[ti] -= Ap0[Ai] * xp[xi + xoff0] + Ap1[Ai] * xp[xi + xoff1] + Ap2[Ai] * xp[xi + xoff2] + Ap3[Ai] * xp[xi + xoff3] + Ap4[Ai] * xp[xi + xoff4] + Ap5[Ai] * xp[xi + xoff5] + Ap6[Ai] * xp[xi + xoff6]; } hypre_BoxLoop3End(Ai, xi, ti); #undef DEVICE_VAR break; case 6: #define DEVICE_VAR is_device_ptr(tp,Ap0,Ap1,Ap2,Ap3,Ap4,Ap5,xp) hypre_BoxLoop3Begin(hypre_StructMatrixNDim(A), loop_size, A_data_box, start, stride, Ai, x_data_box, start, stride, xi, t_data_box, start, stride, ti); { tp[ti] -= Ap0[Ai] * xp[xi + xoff0] + Ap1[Ai] * xp[xi + xoff1] + Ap2[Ai] * xp[xi + xoff2] + Ap3[Ai] * xp[xi + xoff3] + Ap4[Ai] * xp[xi + xoff4] + Ap5[Ai] * xp[xi + xoff5]; } hypre_BoxLoop3End(Ai, xi, ti); #undef DEVICE_VAR break; case 5: #define DEVICE_VAR is_device_ptr(tp,Ap0,Ap1,Ap2,Ap3,Ap4,xp) hypre_BoxLoop3Begin(hypre_StructMatrixNDim(A), loop_size, A_data_box, start, stride, Ai, x_data_box, start, stride, xi, t_data_box, start, stride, ti); { tp[ti] -= Ap0[Ai] * xp[xi + xoff0] + Ap1[Ai] * xp[xi + xoff1] + Ap2[Ai] * xp[xi + xoff2] + Ap3[Ai] * xp[xi + xoff3] + Ap4[Ai] * xp[xi + xoff4]; } hypre_BoxLoop3End(Ai, xi, ti); #undef DEVICE_VAR break; case 4: #define DEVICE_VAR is_device_ptr(tp,Ap0,Ap1,Ap2,Ap3,xp) hypre_BoxLoop3Begin(hypre_StructMatrixNDim(A), loop_size, A_data_box, start, stride, Ai, x_data_box, start, stride, xi, t_data_box, start, stride, ti); { tp[ti] -= Ap0[Ai] * xp[xi + xoff0] + Ap1[Ai] * xp[xi + xoff1] + Ap2[Ai] * xp[xi + xoff2] + Ap3[Ai] * xp[xi + xoff3]; } hypre_BoxLoop3End(Ai, xi, ti); #undef DEVICE_VAR break; case 3: #define DEVICE_VAR is_device_ptr(tp,Ap0,Ap1,Ap2,xp) hypre_BoxLoop3Begin(hypre_StructMatrixNDim(A), loop_size, A_data_box, start, stride, Ai, x_data_box, start, stride, xi, t_data_box, start, stride, ti); { tp[ti] -= Ap0[Ai] * xp[xi + xoff0] + Ap1[Ai] * xp[xi + xoff1] + Ap2[Ai] * xp[xi + xoff2]; } hypre_BoxLoop3End(Ai, xi, ti); #undef DEVICE_VAR break; case 2: #define DEVICE_VAR is_device_ptr(tp,Ap0,Ap1,xp) hypre_BoxLoop3Begin(hypre_StructMatrixNDim(A), loop_size, A_data_box, start, stride, Ai, x_data_box, start, stride, xi, t_data_box, start, stride, ti); { tp[ti] -= Ap0[Ai] * xp[xi + xoff0] + Ap1[Ai] * xp[xi + xoff1]; } hypre_BoxLoop3End(Ai, xi, ti); #undef DEVICE_VAR break; case 1: #define DEVICE_VAR is_device_ptr(tp,Ap0,xp) hypre_BoxLoop3Begin(hypre_StructMatrixNDim(A), loop_size, A_data_box, start, stride, Ai, x_data_box, start, stride, xi, t_data_box, start, stride, ti); { tp[ti] -= Ap0[Ai] * xp[xi + xoff0]; } hypre_BoxLoop3End(Ai, xi, ti); #undef DEVICE_VAR break; case 0: break; } } return hypre_error_flag; } /* for constant_coefficient==1 or 2, all offdiagonal coefficients constant over space ...*/ HYPRE_Int hypre_PointRelax_core12( void *relax_vdata, hypre_StructMatrix *A, HYPRE_Int constant_coefficient, hypre_Box *compute_box, HYPRE_Real *bp, HYPRE_Real *xp, HYPRE_Real *tp, HYPRE_Int boxarray_id, hypre_Box *A_data_box, hypre_Box *b_data_box, hypre_Box *x_data_box, hypre_Box *t_data_box, hypre_IndexRef stride ) { HYPRE_UNUSED_VAR(A_data_box); hypre_PointRelaxData *relax_data = (hypre_PointRelaxData *)relax_vdata; HYPRE_Real *Apd; HYPRE_Real *Ap0; HYPRE_Real *Ap1; HYPRE_Real *Ap2; HYPRE_Real *Ap3; HYPRE_Real *Ap4; HYPRE_Real *Ap5; HYPRE_Real *Ap6; HYPRE_Real AAp0; HYPRE_Real AAp1; HYPRE_Real AAp2; HYPRE_Real AAp3; HYPRE_Real AAp4; HYPRE_Real AAp5; HYPRE_Real AAp6; HYPRE_Real AApd; HYPRE_Int xoff0; HYPRE_Int xoff1; HYPRE_Int xoff2; HYPRE_Int xoff3; HYPRE_Int xoff4; HYPRE_Int xoff5; HYPRE_Int xoff6; hypre_StructStencil *stencil; hypre_Index *stencil_shape; HYPRE_Int stencil_size; HYPRE_Int diag_rank = (relax_data -> diag_rank); hypre_IndexRef start; hypre_Index loop_size; HYPRE_Int si, sk, ssi[MAX_DEPTH], depth, k; HYPRE_Int Ai; stencil = hypre_StructMatrixStencil(A); stencil_shape = hypre_StructStencilShape(stencil); stencil_size = hypre_StructStencilSize(stencil); start = hypre_BoxIMin(compute_box); hypre_BoxGetStrideSize(compute_box, stride, loop_size); /* The standard (variable coefficient) algorithm initializes tp=bp. Do it here, but for constant diagonal, also divide by the diagonal (and set up AApd for other division-equivalents. For a variable diagonal, this diagonal division is done at the end of the computation. */ Ai = hypre_CCBoxIndexRank( A_data_box, start ); #define DEVICE_VAR is_device_ptr(tp,bp) if ( constant_coefficient == 1 ) /* constant diagonal */ { Apd = hypre_StructMatrixBoxData(A, boxarray_id, diag_rank); AApd = 1 / Apd[Ai]; hypre_BoxLoop2Begin(hypre_StructMatrixNDim(A), loop_size, b_data_box, start, stride, bi, t_data_box, start, stride, ti); { tp[ti] = AApd * bp[bi]; } hypre_BoxLoop2End(bi, ti); } else /* constant_coefficient==2, variable diagonal */ { AApd = 1; hypre_BoxLoop2Begin(hypre_StructMatrixNDim(A), loop_size, b_data_box, start, stride, bi, t_data_box, start, stride, ti); { tp[ti] = bp[bi]; } hypre_BoxLoop2End(bi, ti); } #undef DEVICE_VAR /* unroll up to depth MAX_DEPTH */ for (si = 0; si < stencil_size; si += MAX_DEPTH) { depth = hypre_min(MAX_DEPTH, (stencil_size - si)); for (k = 0, sk = si; k < depth; sk++) { if (sk == diag_rank) { depth--; } else { ssi[k] = sk; k++; } } switch (depth) { case 7: Ap6 = hypre_StructMatrixBoxData(A, boxarray_id, ssi[6]); xoff6 = hypre_BoxOffsetDistance(x_data_box, stencil_shape[ssi[6]]); /* fall through */ case 6: Ap5 = hypre_StructMatrixBoxData(A, boxarray_id, ssi[5]); xoff5 = hypre_BoxOffsetDistance(x_data_box, stencil_shape[ssi[5]]); /* fall through */ case 5: Ap4 = hypre_StructMatrixBoxData(A, boxarray_id, ssi[4]); xoff4 = hypre_BoxOffsetDistance(x_data_box, stencil_shape[ssi[4]]); /* fall through */ case 4: Ap3 = hypre_StructMatrixBoxData(A, boxarray_id, ssi[3]); xoff3 = hypre_BoxOffsetDistance(x_data_box, stencil_shape[ssi[3]]); /* fall through */ case 3: Ap2 = hypre_StructMatrixBoxData(A, boxarray_id, ssi[2]); xoff2 = hypre_BoxOffsetDistance(x_data_box, stencil_shape[ssi[2]]); /* fall through */ case 2: Ap1 = hypre_StructMatrixBoxData(A, boxarray_id, ssi[1]); xoff1 = hypre_BoxOffsetDistance(x_data_box, stencil_shape[ssi[1]]); /* fall through */ case 1: Ap0 = hypre_StructMatrixBoxData(A, boxarray_id, ssi[0]); xoff0 = hypre_BoxOffsetDistance(x_data_box, stencil_shape[ssi[0]]); /* fall through */ case 0: break; } #define DEVICE_VAR is_device_ptr(tp,xp) switch (depth) { case 7: AAp0 = Ap0[Ai] * AApd; AAp1 = Ap1[Ai] * AApd; AAp2 = Ap2[Ai] * AApd; AAp3 = Ap3[Ai] * AApd; AAp4 = Ap4[Ai] * AApd; AAp5 = Ap5[Ai] * AApd; AAp6 = Ap6[Ai] * AApd; hypre_BoxLoop2Begin(hypre_StructMatrixNDim(A), loop_size, x_data_box, start, stride, xi, t_data_box, start, stride, ti); { tp[ti] -= AAp0 * xp[xi + xoff0] + AAp1 * xp[xi + xoff1] + AAp2 * xp[xi + xoff2] + AAp3 * xp[xi + xoff3] + AAp4 * xp[xi + xoff4] + AAp5 * xp[xi + xoff5] + AAp6 * xp[xi + xoff6]; } hypre_BoxLoop2End(xi, ti); break; case 6: AAp0 = Ap0[Ai] * AApd; AAp1 = Ap1[Ai] * AApd; AAp2 = Ap2[Ai] * AApd; AAp3 = Ap3[Ai] * AApd; AAp4 = Ap4[Ai] * AApd; AAp5 = Ap5[Ai] * AApd; hypre_BoxLoop2Begin(hypre_StructMatrixNDim(A), loop_size, x_data_box, start, stride, xi, t_data_box, start, stride, ti); { tp[ti] -= AAp0 * xp[xi + xoff0] + AAp1 * xp[xi + xoff1] + AAp2 * xp[xi + xoff2] + AAp3 * xp[xi + xoff3] + AAp4 * xp[xi + xoff4] + AAp5 * xp[xi + xoff5]; } hypre_BoxLoop2End(xi, ti); break; case 5: AAp0 = Ap0[Ai] * AApd; AAp1 = Ap1[Ai] * AApd; AAp2 = Ap2[Ai] * AApd; AAp3 = Ap3[Ai] * AApd; AAp4 = Ap4[Ai] * AApd; hypre_BoxLoop2Begin(hypre_StructMatrixNDim(A), loop_size, x_data_box, start, stride, xi, t_data_box, start, stride, ti); { tp[ti] -= AAp0 * xp[xi + xoff0] + AAp1 * xp[xi + xoff1] + AAp2 * xp[xi + xoff2] + AAp3 * xp[xi + xoff3] + AAp4 * xp[xi + xoff4]; } hypre_BoxLoop2End(xi, ti); break; case 4: AAp0 = Ap0[Ai] * AApd; AAp1 = Ap1[Ai] * AApd; AAp2 = Ap2[Ai] * AApd; AAp3 = Ap3[Ai] * AApd; hypre_BoxLoop2Begin(hypre_StructMatrixNDim(A), loop_size, x_data_box, start, stride, xi, t_data_box, start, stride, ti); { tp[ti] -= AAp0 * xp[xi + xoff0] + AAp1 * xp[xi + xoff1] + AAp2 * xp[xi + xoff2] + AAp3 * xp[xi + xoff3]; } hypre_BoxLoop2End(xi, ti); break; case 3: AAp0 = Ap0[Ai] * AApd; AAp1 = Ap1[Ai] * AApd; AAp2 = Ap2[Ai] * AApd; hypre_BoxLoop2Begin(hypre_StructMatrixNDim(A), loop_size, x_data_box, start, stride, xi, t_data_box, start, stride, ti); { tp[ti] -= AAp0 * xp[xi + xoff0] + AAp1 * xp[xi + xoff1] + AAp2 * xp[xi + xoff2]; } hypre_BoxLoop2End(xi, ti); break; case 2: AAp0 = Ap0[Ai] * AApd; AAp1 = Ap1[Ai] * AApd; hypre_BoxLoop2Begin(hypre_StructMatrixNDim(A), loop_size, x_data_box, start, stride, xi, t_data_box, start, stride, ti); { tp[ti] -= AAp0 * xp[xi + xoff0] + AAp1 * xp[xi + xoff1]; } hypre_BoxLoop2End(xi, ti); break; case 1: AAp0 = Ap0[Ai] * AApd; hypre_BoxLoop2Begin(hypre_StructMatrixNDim(A), loop_size, x_data_box, start, stride, xi, t_data_box, start, stride, ti); { tp[ti] -= AAp0 * xp[xi + xoff0]; } hypre_BoxLoop2End(xi, ti); break; case 0: break; } #undef DEVICE_VAR } return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_PointRelaxSetTol( void *relax_vdata, HYPRE_Real tol ) { hypre_PointRelaxData *relax_data = (hypre_PointRelaxData *)relax_vdata; (relax_data -> tol) = tol; return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_PointRelaxGetTol( void *relax_vdata, HYPRE_Real *tol ) { hypre_PointRelaxData *relax_data = (hypre_PointRelaxData *)relax_vdata; *tol = (relax_data -> tol); return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_PointRelaxSetMaxIter( void *relax_vdata, HYPRE_Int max_iter ) { hypre_PointRelaxData *relax_data = (hypre_PointRelaxData *)relax_vdata; (relax_data -> max_iter) = max_iter; return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_PointRelaxGetMaxIter( void *relax_vdata, HYPRE_Int * max_iter ) { hypre_PointRelaxData *relax_data = (hypre_PointRelaxData *)relax_vdata; *max_iter = (relax_data -> max_iter); return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_PointRelaxSetZeroGuess( void *relax_vdata, HYPRE_Int zero_guess ) { hypre_PointRelaxData *relax_data = (hypre_PointRelaxData *)relax_vdata; (relax_data -> zero_guess) = zero_guess; return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_PointRelaxGetZeroGuess( void *relax_vdata, HYPRE_Int * zero_guess ) { hypre_PointRelaxData *relax_data = (hypre_PointRelaxData *)relax_vdata; *zero_guess = (relax_data -> zero_guess); return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_PointRelaxGetNumIterations( void *relax_vdata, HYPRE_Int * num_iterations ) { hypre_PointRelaxData *relax_data = (hypre_PointRelaxData *)relax_vdata; *num_iterations = (relax_data -> num_iterations); return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_PointRelaxSetWeight( void *relax_vdata, HYPRE_Real weight ) { hypre_PointRelaxData *relax_data = (hypre_PointRelaxData *)relax_vdata; (relax_data -> weight) = weight; return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_PointRelaxSetNumPointsets( void *relax_vdata, HYPRE_Int num_pointsets ) { hypre_PointRelaxData *relax_data = (hypre_PointRelaxData *)relax_vdata; HYPRE_Int i; /* free up old pointset memory */ for (i = 0; i < (relax_data -> num_pointsets); i++) { hypre_TFree(relax_data -> pointset_indices[i], HYPRE_MEMORY_HOST); } hypre_TFree(relax_data -> pointset_sizes, HYPRE_MEMORY_HOST); hypre_TFree(relax_data -> pointset_ranks, HYPRE_MEMORY_HOST); hypre_TFree(relax_data -> pointset_strides, HYPRE_MEMORY_HOST); hypre_TFree(relax_data -> pointset_indices, HYPRE_MEMORY_HOST); /* alloc new pointset memory */ (relax_data -> num_pointsets) = num_pointsets; (relax_data -> pointset_sizes) = hypre_TAlloc(HYPRE_Int, num_pointsets, HYPRE_MEMORY_HOST); (relax_data -> pointset_ranks) = hypre_TAlloc(HYPRE_Int, num_pointsets, HYPRE_MEMORY_HOST); (relax_data -> pointset_strides) = hypre_TAlloc(hypre_Index, num_pointsets, HYPRE_MEMORY_HOST); (relax_data -> pointset_indices) = hypre_TAlloc(hypre_Index *, num_pointsets, HYPRE_MEMORY_HOST); for (i = 0; i < num_pointsets; i++) { (relax_data -> pointset_sizes[i]) = 0; (relax_data -> pointset_ranks[i]) = i; (relax_data -> pointset_indices[i]) = NULL; } return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_PointRelaxSetPointset( void *relax_vdata, HYPRE_Int pointset, HYPRE_Int pointset_size, hypre_Index pointset_stride, hypre_Index *pointset_indices ) { hypre_PointRelaxData *relax_data = (hypre_PointRelaxData *)relax_vdata; HYPRE_Int i; /* free up old pointset memory */ hypre_TFree(relax_data -> pointset_indices[pointset], HYPRE_MEMORY_HOST); /* alloc new pointset memory */ (relax_data -> pointset_indices[pointset]) = hypre_TAlloc(hypre_Index, pointset_size, HYPRE_MEMORY_HOST); (relax_data -> pointset_sizes[pointset]) = pointset_size; hypre_CopyIndex(pointset_stride, (relax_data -> pointset_strides[pointset])); for (i = 0; i < pointset_size; i++) { hypre_CopyIndex(pointset_indices[i], (relax_data -> pointset_indices[pointset][i])); } return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_PointRelaxSetPointsetRank( void *relax_vdata, HYPRE_Int pointset, HYPRE_Int pointset_rank ) { hypre_PointRelaxData *relax_data = (hypre_PointRelaxData *)relax_vdata; (relax_data -> pointset_ranks[pointset]) = pointset_rank; return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_PointRelaxSetTempVec( void *relax_vdata, hypre_StructVector *t ) { hypre_PointRelaxData *relax_data = (hypre_PointRelaxData *)relax_vdata; hypre_StructVectorDestroy(relax_data -> t); (relax_data -> t) = hypre_StructVectorRef(t); return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_PointRelaxGetFinalRelativeResidualNorm( void * relax_vdata, HYPRE_Real * norm ) { hypre_PointRelaxData *relax_data = (hypre_PointRelaxData *)relax_vdata; *norm = relax_data -> rresnorm; return 0; } /*-------------------------------------------------------------------------- * Special vector operation for use in hypre_PointRelax - * convex combination of vectors on specified pointsets. *--------------------------------------------------------------------------*/ HYPRE_Int hypre_relax_wtx( void *relax_vdata, HYPRE_Int pointset, hypre_StructVector *t, hypre_StructVector *x ) /* Sets x to a convex combination of x and t, x = weight * t + (1-weight) * x, but only in the specified pointset */ { hypre_PointRelaxData *relax_data = (hypre_PointRelaxData *)relax_vdata; HYPRE_Real weight = (relax_data -> weight); hypre_Index *pointset_strides = (relax_data -> pointset_strides); hypre_ComputePkg **compute_pkgs = (relax_data -> compute_pkgs); hypre_ComputePkg *compute_pkg; hypre_IndexRef stride; hypre_IndexRef start; hypre_Index loop_size; HYPRE_Real weightc = 1 - weight; HYPRE_Real *xp, *tp; HYPRE_Int compute_i, i, j; hypre_BoxArrayArray *compute_box_aa; hypre_BoxArray *compute_box_a; hypre_Box *compute_box; hypre_Box *x_data_box; hypre_Box *t_data_box; compute_pkg = compute_pkgs[pointset]; stride = pointset_strides[pointset]; for (compute_i = 0; compute_i < 2; compute_i++) { switch (compute_i) { case 0: { compute_box_aa = hypre_ComputePkgIndtBoxes(compute_pkg); } break; case 1: { compute_box_aa = hypre_ComputePkgDeptBoxes(compute_pkg); } break; } hypre_ForBoxArrayI(i, compute_box_aa) { compute_box_a = hypre_BoxArrayArrayBoxArray(compute_box_aa, i); x_data_box = hypre_BoxArrayBox(hypre_StructVectorDataSpace(x), i); t_data_box = hypre_BoxArrayBox(hypre_StructVectorDataSpace(t), i); xp = hypre_StructVectorBoxData(x, i); tp = hypre_StructVectorBoxData(t, i); hypre_ForBoxI(j, compute_box_a) { compute_box = hypre_BoxArrayBox(compute_box_a, j); start = hypre_BoxIMin(compute_box); hypre_BoxGetStrideSize(compute_box, stride, loop_size); #define DEVICE_VAR is_device_ptr(xp,tp) hypre_BoxLoop2Begin(hypre_StructVectorNDim(x), loop_size, x_data_box, start, stride, xi, t_data_box, start, stride, ti); { xp[xi] = weight * tp[ti] + weightc * xp[xi]; } hypre_BoxLoop2End(xi, ti); #undef DEVICE_VAR } } } return hypre_error_flag; } /*-------------------------------------------------------------------------- * Special vector operation for use in hypre_PointRelax - * vector copy on specified pointsets. *--------------------------------------------------------------------------*/ HYPRE_Int hypre_relax_copy( void *relax_vdata, HYPRE_Int pointset, hypre_StructVector *t, hypre_StructVector *x ) /* Sets x to t, x=t, but only in the specified pointset. */ { hypre_PointRelaxData *relax_data = (hypre_PointRelaxData *)relax_vdata; hypre_Index *pointset_strides = (relax_data -> pointset_strides); hypre_ComputePkg **compute_pkgs = (relax_data -> compute_pkgs); hypre_ComputePkg *compute_pkg; hypre_IndexRef stride; hypre_IndexRef start; hypre_Index loop_size; HYPRE_Real *xp, *tp; HYPRE_Int compute_i, i, j; hypre_BoxArrayArray *compute_box_aa; hypre_BoxArray *compute_box_a; hypre_Box *compute_box; hypre_Box *x_data_box; hypre_Box *t_data_box; compute_pkg = compute_pkgs[pointset]; stride = pointset_strides[pointset]; for (compute_i = 0; compute_i < 2; compute_i++) { switch (compute_i) { case 0: { compute_box_aa = hypre_ComputePkgIndtBoxes(compute_pkg); } break; case 1: { compute_box_aa = hypre_ComputePkgDeptBoxes(compute_pkg); } break; } hypre_ForBoxArrayI(i, compute_box_aa) { compute_box_a = hypre_BoxArrayArrayBoxArray(compute_box_aa, i); x_data_box = hypre_BoxArrayBox(hypre_StructVectorDataSpace(x), i); t_data_box = hypre_BoxArrayBox(hypre_StructVectorDataSpace(t), i); xp = hypre_StructVectorBoxData(x, i); tp = hypre_StructVectorBoxData(t, i); hypre_ForBoxI(j, compute_box_a) { compute_box = hypre_BoxArrayBox(compute_box_a, j); start = hypre_BoxIMin(compute_box); hypre_BoxGetStrideSize(compute_box, stride, loop_size); #define DEVICE_VAR is_device_ptr(xp,tp) hypre_BoxLoop2Begin(hypre_StructVectorNDim(x), loop_size, x_data_box, start, stride, xi, t_data_box, start, stride, ti); { xp[xi] = tp[ti]; } hypre_BoxLoop2End(xi, ti); #undef DEVICE_VAR } } } return hypre_error_flag; } hypre-2.33.0/src/struct_ls/protos.h000066400000000000000000001402401477326011500172450ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /* coarsen.c */ HYPRE_Int hypre_StructMapFineToCoarse ( hypre_Index findex, hypre_Index index, hypre_Index stride, hypre_Index cindex ); HYPRE_Int hypre_StructMapCoarseToFine ( hypre_Index cindex, hypre_Index index, hypre_Index stride, hypre_Index findex ); HYPRE_Int hypre_StructCoarsen ( hypre_StructGrid *fgrid, hypre_Index index, hypre_Index stride, HYPRE_Int prune, hypre_StructGrid **cgrid_ptr ); /* cyclic_reduction.c */ void *hypre_CyclicReductionCreate ( MPI_Comm comm ); hypre_StructMatrix *hypre_CycRedCreateCoarseOp ( hypre_StructMatrix *A, hypre_StructGrid *coarse_grid, HYPRE_Int cdir ); HYPRE_Int hypre_CycRedSetupCoarseOp ( hypre_StructMatrix *A, hypre_StructMatrix *Ac, hypre_Index cindex, hypre_Index cstride, HYPRE_Int cdir ); HYPRE_Int hypre_CyclicReductionSetup ( void *cyc_red_vdata, hypre_StructMatrix *A, hypre_StructVector *b, hypre_StructVector *x ); HYPRE_Int hypre_CyclicReduction ( void *cyc_red_vdata, hypre_StructMatrix *A, hypre_StructVector *b, hypre_StructVector *x ); HYPRE_Int hypre_CyclicReductionSetCDir ( void *cyc_red_vdata, HYPRE_Int cdir ); HYPRE_Int hypre_CyclicReductionSetBase ( void *cyc_red_vdata, hypre_Index base_index, hypre_Index base_stride ); HYPRE_Int hypre_CyclicReductionDestroy ( void *cyc_red_vdata ); HYPRE_Int hypre_CyclicReductionSetMaxLevel( void *cyc_red_vdata, HYPRE_Int max_level ); /* general.c */ HYPRE_Int hypre_Log2 ( HYPRE_Int p ); /* hybrid.c */ void *hypre_HybridCreate ( MPI_Comm comm ); HYPRE_Int hypre_HybridDestroy ( void *hybrid_vdata ); HYPRE_Int hypre_HybridSetTol ( void *hybrid_vdata, HYPRE_Real tol ); HYPRE_Int hypre_HybridSetConvergenceTol ( void *hybrid_vdata, HYPRE_Real cf_tol ); HYPRE_Int hypre_HybridSetDSCGMaxIter ( void *hybrid_vdata, HYPRE_Int dscg_max_its ); HYPRE_Int hypre_HybridSetPCGMaxIter ( void *hybrid_vdata, HYPRE_Int pcg_max_its ); HYPRE_Int hypre_HybridSetPCGAbsoluteTolFactor ( void *hybrid_vdata, HYPRE_Real pcg_atolf ); HYPRE_Int hypre_HybridSetTwoNorm ( void *hybrid_vdata, HYPRE_Int two_norm ); HYPRE_Int hypre_HybridSetStopCrit ( void *hybrid_vdata, HYPRE_Int stop_crit ); HYPRE_Int hypre_HybridSetRelChange ( void *hybrid_vdata, HYPRE_Int rel_change ); HYPRE_Int hypre_HybridSetSolverType ( void *hybrid_vdata, HYPRE_Int solver_type ); HYPRE_Int hypre_HybridSetRecomputeResidual( void *hybrid_vdata, HYPRE_Int recompute_residual ); HYPRE_Int hypre_HybridGetRecomputeResidual( void *hybrid_vdata, HYPRE_Int *recompute_residual ); HYPRE_Int hypre_HybridSetRecomputeResidualP( void *hybrid_vdata, HYPRE_Int recompute_residual_p ); HYPRE_Int hypre_HybridGetRecomputeResidualP( void *hybrid_vdata, HYPRE_Int *recompute_residual_p ); HYPRE_Int hypre_HybridSetKDim ( void *hybrid_vdata, HYPRE_Int k_dim ); HYPRE_Int hypre_HybridSetPrecond ( void *pcg_vdata, HYPRE_Int (*pcg_precond_solve )(void*, void*, void*, void*), HYPRE_Int (*pcg_precond_setup )(void*, void*, void*, void*), void *pcg_precond ); HYPRE_Int hypre_HybridSetLogging ( void *hybrid_vdata, HYPRE_Int logging ); HYPRE_Int hypre_HybridSetPrintLevel ( void *hybrid_vdata, HYPRE_Int print_level ); HYPRE_Int hypre_HybridGetNumIterations ( void *hybrid_vdata, HYPRE_Int *num_its ); HYPRE_Int hypre_HybridGetDSCGNumIterations ( void *hybrid_vdata, HYPRE_Int *dscg_num_its ); HYPRE_Int hypre_HybridGetPCGNumIterations ( void *hybrid_vdata, HYPRE_Int *pcg_num_its ); HYPRE_Int hypre_HybridGetFinalRelativeResidualNorm ( void *hybrid_vdata, HYPRE_Real *final_rel_res_norm ); HYPRE_Int hypre_HybridSetup ( void *hybrid_vdata, hypre_StructMatrix *A, hypre_StructVector *b, hypre_StructVector *x ); HYPRE_Int hypre_HybridSolve ( void *hybrid_vdata, hypre_StructMatrix *A, hypre_StructVector *b, hypre_StructVector *x ); /* HYPRE_struct_int.c */ HYPRE_Int hypre_StructVectorSetRandomValues ( hypre_StructVector *vector, HYPRE_Int seed ); HYPRE_Int hypre_StructSetRandomValues ( void *v, HYPRE_Int seed ); /* HYPRE_struct_pfmg.c */ HYPRE_Int hypre_PFMGSetDeviceLevel( void *pfmg_vdata, HYPRE_Int device_level ); /* jacobi.c */ void *hypre_JacobiCreate ( MPI_Comm comm ); HYPRE_Int hypre_JacobiDestroy ( void *jacobi_vdata ); HYPRE_Int hypre_JacobiSetup ( void *jacobi_vdata, hypre_StructMatrix *A, hypre_StructVector *b, hypre_StructVector *x ); HYPRE_Int hypre_JacobiSolve ( void *jacobi_vdata, hypre_StructMatrix *A, hypre_StructVector *b, hypre_StructVector *x ); HYPRE_Int hypre_JacobiSetTol ( void *jacobi_vdata, HYPRE_Real tol ); HYPRE_Int hypre_JacobiGetTol ( void *jacobi_vdata, HYPRE_Real *tol ); HYPRE_Int hypre_JacobiSetMaxIter ( void *jacobi_vdata, HYPRE_Int max_iter ); HYPRE_Int hypre_JacobiGetMaxIter ( void *jacobi_vdata, HYPRE_Int *max_iter ); HYPRE_Int hypre_JacobiSetZeroGuess ( void *jacobi_vdata, HYPRE_Int zero_guess ); HYPRE_Int hypre_JacobiGetZeroGuess ( void *jacobi_vdata, HYPRE_Int *zero_guess ); HYPRE_Int hypre_JacobiGetNumIterations ( void *jacobi_vdata, HYPRE_Int *num_iterations ); HYPRE_Int hypre_JacobiSetTempVec ( void *jacobi_vdata, hypre_StructVector *t ); HYPRE_Int hypre_JacobiGetFinalRelativeResidualNorm ( void *jacobi_vdata, HYPRE_Real *norm ); /* pcg_struct.c */ void *hypre_StructKrylovCAlloc ( size_t count, size_t elt_size, HYPRE_MemoryLocation location ); HYPRE_Int hypre_StructKrylovFree ( void *ptr ); void *hypre_StructKrylovCreateVector ( void *vvector ); void *hypre_StructKrylovCreateVectorArray ( HYPRE_Int n, void *vvector ); HYPRE_Int hypre_StructKrylovDestroyVector ( void *vvector ); void *hypre_StructKrylovMatvecCreate ( void *A, void *x ); HYPRE_Int hypre_StructKrylovMatvec ( void *matvec_data, HYPRE_Complex alpha, void *A, void *x, HYPRE_Complex beta, void *y ); HYPRE_Int hypre_StructKrylovMatvecDestroy ( void *matvec_data ); HYPRE_Real hypre_StructKrylovInnerProd ( void *x, void *y ); HYPRE_Int hypre_StructKrylovCopyVector ( void *x, void *y ); HYPRE_Int hypre_StructKrylovClearVector ( void *x ); HYPRE_Int hypre_StructKrylovScaleVector ( HYPRE_Complex alpha, void *x ); HYPRE_Int hypre_StructKrylovAxpy ( HYPRE_Complex alpha, void *x, void *y ); HYPRE_Int hypre_StructKrylovIdentitySetup ( void *vdata, void *A, void *b, void *x ); HYPRE_Int hypre_StructKrylovIdentity ( void *vdata, void *A, void *b, void *x ); HYPRE_Int hypre_StructKrylovCommInfo ( void *A, HYPRE_Int *my_id, HYPRE_Int *num_procs ); /* pfmg2_setup_rap.c */ hypre_StructMatrix *hypre_PFMG2CreateRAPOp ( hypre_StructMatrix *R, hypre_StructMatrix *A, hypre_StructMatrix *P, hypre_StructGrid *coarse_grid, HYPRE_Int cdir ); HYPRE_Int hypre_PFMG2BuildRAPSym ( hypre_StructMatrix *A, hypre_StructMatrix *P, hypre_StructMatrix *R, HYPRE_Int cdir, hypre_Index cindex, hypre_Index cstride, hypre_StructMatrix *RAP ); HYPRE_Int hypre_PFMG2BuildRAPSym_onebox_FSS5_CC0 ( HYPRE_Int ci, HYPRE_Int fi, hypre_StructMatrix *A, hypre_StructMatrix *P, hypre_StructMatrix *R, HYPRE_Int cdir, hypre_Index cindex, hypre_Index cstride, hypre_StructMatrix *RAP ); HYPRE_Int hypre_PFMG2BuildRAPSym_onebox_FSS5_CC1 ( HYPRE_Int ci, HYPRE_Int fi, hypre_StructMatrix *A, hypre_StructMatrix *P, hypre_StructMatrix *R, HYPRE_Int cdir, hypre_Index cindex, hypre_Index cstride, hypre_StructMatrix *RAP ); HYPRE_Int hypre_PFMG2BuildRAPSym_onebox_FSS9_CC0 ( HYPRE_Int ci, HYPRE_Int fi, hypre_StructMatrix *A, hypre_StructMatrix *P, hypre_StructMatrix *R, HYPRE_Int cdir, hypre_Index cindex, hypre_Index cstride, hypre_StructMatrix *RAP ); HYPRE_Int hypre_PFMG2BuildRAPSym_onebox_FSS9_CC1 ( HYPRE_Int ci, HYPRE_Int fi, hypre_StructMatrix *A, hypre_StructMatrix *P, hypre_StructMatrix *R, HYPRE_Int cdir, hypre_Index cindex, hypre_Index cstride, hypre_StructMatrix *RAP ); HYPRE_Int hypre_PFMG2BuildRAPNoSym ( hypre_StructMatrix *A, hypre_StructMatrix *P, hypre_StructMatrix *R, HYPRE_Int cdir, hypre_Index cindex, hypre_Index cstride, hypre_StructMatrix *RAP ); HYPRE_Int hypre_PFMG2BuildRAPNoSym_onebox_FSS5_CC0 ( HYPRE_Int ci, HYPRE_Int fi, hypre_StructMatrix *A, hypre_StructMatrix *P, hypre_StructMatrix *R, HYPRE_Int cdir, hypre_Index cindex, hypre_Index cstride, hypre_StructMatrix *RAP ); HYPRE_Int hypre_PFMG2BuildRAPNoSym_onebox_FSS5_CC1 ( HYPRE_Int ci, HYPRE_Int fi, hypre_StructMatrix *A, hypre_StructMatrix *P, hypre_StructMatrix *R, HYPRE_Int cdir, hypre_Index cindex, hypre_Index cstride, hypre_StructMatrix *RAP ); HYPRE_Int hypre_PFMG2BuildRAPNoSym_onebox_FSS9_CC0 ( HYPRE_Int ci, HYPRE_Int fi, hypre_StructMatrix *A, hypre_StructMatrix *P, hypre_StructMatrix *R, HYPRE_Int cdir, hypre_Index cindex, hypre_Index cstride, hypre_StructMatrix *RAP ); HYPRE_Int hypre_PFMG2BuildRAPNoSym_onebox_FSS9_CC1 ( HYPRE_Int ci, HYPRE_Int fi, hypre_StructMatrix *A, hypre_StructMatrix *P, hypre_StructMatrix *R, HYPRE_Int cdir, hypre_Index cindex, hypre_Index cstride, hypre_StructMatrix *RAP ); /* pfmg3_setup_rap.c */ hypre_StructMatrix *hypre_PFMG3CreateRAPOp ( hypre_StructMatrix *R, hypre_StructMatrix *A, hypre_StructMatrix *P, hypre_StructGrid *coarse_grid, HYPRE_Int cdir ); HYPRE_Int hypre_PFMG3BuildRAPSym ( hypre_StructMatrix *A, hypre_StructMatrix *P, hypre_StructMatrix *R, HYPRE_Int cdir, hypre_Index cindex, hypre_Index cstride, hypre_StructMatrix *RAP ); HYPRE_Int hypre_PFMG3BuildRAPSym_onebox_FSS07_CC0 ( HYPRE_Int ci, HYPRE_Int fi, hypre_StructMatrix *A, hypre_StructMatrix *P, hypre_StructMatrix *R, HYPRE_Int cdir, hypre_Index cindex, hypre_Index cstride, hypre_StructMatrix *RAP ); HYPRE_Int hypre_PFMG3BuildRAPSym_onebox_FSS07_CC1 ( HYPRE_Int ci, HYPRE_Int fi, hypre_StructMatrix *A, hypre_StructMatrix *P, hypre_StructMatrix *R, HYPRE_Int cdir, hypre_Index cindex, hypre_Index cstride, hypre_StructMatrix *RAP ); HYPRE_Int hypre_PFMG3BuildRAPSym_onebox_FSS19_CC0 ( HYPRE_Int ci, HYPRE_Int fi, hypre_StructMatrix *A, hypre_StructMatrix *P, hypre_StructMatrix *R, HYPRE_Int cdir, hypre_Index cindex, hypre_Index cstride, hypre_StructMatrix *RAP ); HYPRE_Int hypre_PFMG3BuildRAPSym_onebox_FSS19_CC1 ( HYPRE_Int ci, HYPRE_Int fi, hypre_StructMatrix *A, hypre_StructMatrix *P, hypre_StructMatrix *R, HYPRE_Int cdir, hypre_Index cindex, hypre_Index cstride, hypre_StructMatrix *RAP ); HYPRE_Int hypre_PFMG3BuildRAPSym_onebox_FSS27_CC0 ( HYPRE_Int ci, HYPRE_Int fi, hypre_StructMatrix *A, hypre_StructMatrix *P, hypre_StructMatrix *R, HYPRE_Int cdir, hypre_Index cindex, hypre_Index cstride, hypre_StructMatrix *RAP ); HYPRE_Int hypre_PFMG3BuildRAPSym_onebox_FSS27_CC1 ( HYPRE_Int ci, HYPRE_Int fi, hypre_StructMatrix *A, hypre_StructMatrix *P, hypre_StructMatrix *R, HYPRE_Int cdir, hypre_Index cindex, hypre_Index cstride, hypre_StructMatrix *RAP ); HYPRE_Int hypre_PFMG3BuildRAPNoSym ( hypre_StructMatrix *A, hypre_StructMatrix *P, hypre_StructMatrix *R, HYPRE_Int cdir, hypre_Index cindex, hypre_Index cstride, hypre_StructMatrix *RAP ); HYPRE_Int hypre_PFMG3BuildRAPNoSym_onebox_FSS07_CC0 ( HYPRE_Int ci, HYPRE_Int fi, hypre_StructMatrix *A, hypre_StructMatrix *P, hypre_StructMatrix *R, HYPRE_Int cdir, hypre_Index cindex, hypre_Index cstride, hypre_StructMatrix *RAP ); HYPRE_Int hypre_PFMG3BuildRAPNoSym_onebox_FSS07_CC1 ( HYPRE_Int ci, HYPRE_Int fi, hypre_StructMatrix *A, hypre_StructMatrix *P, hypre_StructMatrix *R, HYPRE_Int cdir, hypre_Index cindex, hypre_Index cstride, hypre_StructMatrix *RAP ); HYPRE_Int hypre_PFMG3BuildRAPNoSym_onebox_FSS19_CC0 ( HYPRE_Int ci, HYPRE_Int fi, hypre_StructMatrix *A, hypre_StructMatrix *P, hypre_StructMatrix *R, HYPRE_Int cdir, hypre_Index cindex, hypre_Index cstride, hypre_StructMatrix *RAP ); HYPRE_Int hypre_PFMG3BuildRAPNoSym_onebox_FSS19_CC1 ( HYPRE_Int ci, HYPRE_Int fi, hypre_StructMatrix *A, hypre_StructMatrix *P, hypre_StructMatrix *R, HYPRE_Int cdir, hypre_Index cindex, hypre_Index cstride, hypre_StructMatrix *RAP ); HYPRE_Int hypre_PFMG3BuildRAPNoSym_onebox_FSS27_CC0 ( HYPRE_Int ci, HYPRE_Int fi, hypre_StructMatrix *A, hypre_StructMatrix *P, hypre_StructMatrix *R, HYPRE_Int cdir, hypre_Index cindex, hypre_Index cstride, hypre_StructMatrix *RAP ); HYPRE_Int hypre_PFMG3BuildRAPNoSym_onebox_FSS27_CC1 ( HYPRE_Int ci, HYPRE_Int fi, hypre_StructMatrix *A, hypre_StructMatrix *P, hypre_StructMatrix *R, HYPRE_Int cdir, hypre_Index cindex, hypre_Index cstride, hypre_StructMatrix *RAP ); /* pfmg.c */ void *hypre_PFMGCreate ( MPI_Comm comm ); HYPRE_Int hypre_PFMGDestroy ( void *pfmg_vdata ); HYPRE_Int hypre_PFMGSetTol ( void *pfmg_vdata, HYPRE_Real tol ); HYPRE_Int hypre_PFMGGetTol ( void *pfmg_vdata, HYPRE_Real *tol ); HYPRE_Int hypre_PFMGSetMaxIter ( void *pfmg_vdata, HYPRE_Int max_iter ); HYPRE_Int hypre_PFMGGetMaxIter ( void *pfmg_vdata, HYPRE_Int *max_iter ); HYPRE_Int hypre_PFMGSetMaxLevels ( void *pfmg_vdata, HYPRE_Int max_levels ); HYPRE_Int hypre_PFMGGetMaxLevels ( void *pfmg_vdata, HYPRE_Int *max_levels ); HYPRE_Int hypre_PFMGSetRelChange ( void *pfmg_vdata, HYPRE_Int rel_change ); HYPRE_Int hypre_PFMGGetRelChange ( void *pfmg_vdata, HYPRE_Int *rel_change ); HYPRE_Int hypre_PFMGSetZeroGuess ( void *pfmg_vdata, HYPRE_Int zero_guess ); HYPRE_Int hypre_PFMGGetZeroGuess ( void *pfmg_vdata, HYPRE_Int *zero_guess ); HYPRE_Int hypre_PFMGSetRelaxType ( void *pfmg_vdata, HYPRE_Int relax_type ); HYPRE_Int hypre_PFMGGetRelaxType ( void *pfmg_vdata, HYPRE_Int *relax_type ); HYPRE_Int hypre_PFMGSetJacobiWeight ( void *pfmg_vdata, HYPRE_Real weight ); HYPRE_Int hypre_PFMGGetJacobiWeight ( void *pfmg_vdata, HYPRE_Real *weight ); HYPRE_Int hypre_PFMGSetRAPType ( void *pfmg_vdata, HYPRE_Int rap_type ); HYPRE_Int hypre_PFMGGetRAPType ( void *pfmg_vdata, HYPRE_Int *rap_type ); HYPRE_Int hypre_PFMGSetNumPreRelax ( void *pfmg_vdata, HYPRE_Int num_pre_relax ); HYPRE_Int hypre_PFMGGetNumPreRelax ( void *pfmg_vdata, HYPRE_Int *num_pre_relax ); HYPRE_Int hypre_PFMGSetNumPostRelax ( void *pfmg_vdata, HYPRE_Int num_post_relax ); HYPRE_Int hypre_PFMGGetNumPostRelax ( void *pfmg_vdata, HYPRE_Int *num_post_relax ); HYPRE_Int hypre_PFMGSetSkipRelax ( void *pfmg_vdata, HYPRE_Int skip_relax ); HYPRE_Int hypre_PFMGGetSkipRelax ( void *pfmg_vdata, HYPRE_Int *skip_relax ); HYPRE_Int hypre_PFMGSetDxyz ( void *pfmg_vdata, HYPRE_Real *dxyz ); HYPRE_Int hypre_PFMGSetLogging ( void *pfmg_vdata, HYPRE_Int logging ); HYPRE_Int hypre_PFMGGetLogging ( void *pfmg_vdata, HYPRE_Int *logging ); HYPRE_Int hypre_PFMGSetPrintLevel ( void *pfmg_vdata, HYPRE_Int print_level ); HYPRE_Int hypre_PFMGGetPrintLevel ( void *pfmg_vdata, HYPRE_Int *print_level ); HYPRE_Int hypre_PFMGGetNumIterations ( void *pfmg_vdata, HYPRE_Int *num_iterations ); HYPRE_Int hypre_PFMGPrintLogging ( void *pfmg_vdata, HYPRE_Int myid ); HYPRE_Int hypre_PFMGGetFinalRelativeResidualNorm ( void *pfmg_vdata, HYPRE_Real *relative_residual_norm ); /* pfmg_relax.c */ void *hypre_PFMGRelaxCreate ( MPI_Comm comm ); HYPRE_Int hypre_PFMGRelaxDestroy ( void *pfmg_relax_vdata ); HYPRE_Int hypre_PFMGRelax ( void *pfmg_relax_vdata, hypre_StructMatrix *A, hypre_StructVector *b, hypre_StructVector *x ); HYPRE_Int hypre_PFMGRelaxSetup ( void *pfmg_relax_vdata, hypre_StructMatrix *A, hypre_StructVector *b, hypre_StructVector *x ); HYPRE_Int hypre_PFMGRelaxSetType ( void *pfmg_relax_vdata, HYPRE_Int relax_type ); HYPRE_Int hypre_PFMGRelaxSetJacobiWeight ( void *pfmg_relax_vdata, HYPRE_Real weight ); HYPRE_Int hypre_PFMGRelaxSetPreRelax ( void *pfmg_relax_vdata ); HYPRE_Int hypre_PFMGRelaxSetPostRelax ( void *pfmg_relax_vdata ); HYPRE_Int hypre_PFMGRelaxSetTol ( void *pfmg_relax_vdata, HYPRE_Real tol ); HYPRE_Int hypre_PFMGRelaxSetMaxIter ( void *pfmg_relax_vdata, HYPRE_Int max_iter ); HYPRE_Int hypre_PFMGRelaxSetZeroGuess ( void *pfmg_relax_vdata, HYPRE_Int zero_guess ); HYPRE_Int hypre_PFMGRelaxSetTempVec ( void *pfmg_relax_vdata, hypre_StructVector *t ); /* pfmg_setup.c */ HYPRE_Int hypre_PFMGSetup ( void *pfmg_vdata, hypre_StructMatrix *A, hypre_StructVector *b, hypre_StructVector *x ); HYPRE_Int hypre_PFMGComputeDxyz ( hypre_StructMatrix *A, HYPRE_Real *dxyz, HYPRE_Real *mean, HYPRE_Real *deviation); HYPRE_Int hypre_PFMGComputeDxyz_CS ( HYPRE_Int bi, hypre_StructMatrix *A, HYPRE_Real *cxyz, HYPRE_Real *sqcxyz); HYPRE_Int hypre_PFMGComputeDxyz_SS5 ( HYPRE_Int bi, hypre_StructMatrix *A, HYPRE_Real *cxyz, HYPRE_Real *sqcxyz); HYPRE_Int hypre_PFMGComputeDxyz_SS9 ( HYPRE_Int bi, hypre_StructMatrix *A, HYPRE_Real *cxyz, HYPRE_Real *sqcxyz); HYPRE_Int hypre_PFMGComputeDxyz_SS7 ( HYPRE_Int bi, hypre_StructMatrix *A, HYPRE_Real *cxyz, HYPRE_Real *sqcxyz); HYPRE_Int hypre_PFMGComputeDxyz_SS19( HYPRE_Int bi, hypre_StructMatrix *A, HYPRE_Real *cxyz, HYPRE_Real *sqcxyz); HYPRE_Int hypre_PFMGComputeDxyz_SS27( HYPRE_Int bi, hypre_StructMatrix *A, HYPRE_Real *cxyz, HYPRE_Real *sqcxyz); HYPRE_Int hypre_ZeroDiagonal ( hypre_StructMatrix *A ); /* pfmg_setup_interp.c */ hypre_StructMatrix *hypre_PFMGCreateInterpOp ( hypre_StructMatrix *A, hypre_StructGrid *cgrid, HYPRE_Int cdir, HYPRE_Int rap_type ); HYPRE_Int hypre_PFMGSetupInterpOp ( hypre_StructMatrix *A, HYPRE_Int cdir, hypre_Index findex, hypre_Index stride, hypre_StructMatrix *P, HYPRE_Int rap_type ); HYPRE_Int hypre_PFMGSetupInterpOp_CC0 ( HYPRE_Int i, hypre_StructMatrix *A, hypre_Box *A_dbox, HYPRE_Int cdir, hypre_Index stride, hypre_Index stridec, hypre_Index start, hypre_IndexRef startc, hypre_Index loop_size, hypre_Box *P_dbox, HYPRE_Int Pstenc0, HYPRE_Int Pstenc1, HYPRE_Real *Pp0, HYPRE_Real *Pp1, HYPRE_Int rap_type, HYPRE_Int si0, HYPRE_Int si1 ); HYPRE_Int hypre_PFMGSetupInterpOp_CC1 ( HYPRE_Int i, hypre_StructMatrix *A, hypre_Box *A_dbox, HYPRE_Int cdir, hypre_Index stride, hypre_Index stridec, hypre_Index start, hypre_IndexRef startc, hypre_Index loop_size, hypre_Box *P_dbox, HYPRE_Int Pstenc0, HYPRE_Int Pstenc1, HYPRE_Real *Pp0, HYPRE_Real *Pp1, HYPRE_Int rap_type, HYPRE_Int si0, HYPRE_Int si1 ); HYPRE_Int hypre_PFMGSetupInterpOp_CC2 ( HYPRE_Int i, hypre_StructMatrix *A, hypre_Box *A_dbox, HYPRE_Int cdir, hypre_Index stride, hypre_Index stridec, hypre_Index start, hypre_IndexRef startc, hypre_Index loop_size, hypre_Box *P_dbox, HYPRE_Int Pstenc0, HYPRE_Int Pstenc1, HYPRE_Real *Pp0, HYPRE_Real *Pp1, HYPRE_Int rap_type, HYPRE_Int si0, HYPRE_Int si1 ); HYPRE_Int hypre_PFMGSetupInterpOp_CC0_SS5 ( HYPRE_Int i, hypre_StructMatrix *A, hypre_Box *A_dbox, HYPRE_Int cdir, hypre_Index stride, hypre_Index stridec, hypre_Index start, hypre_IndexRef startc, hypre_Index loop_size, hypre_Box *P_dbox, HYPRE_Int Pstenc0, HYPRE_Int Pstenc1, HYPRE_Real *Pp0, HYPRE_Real *Pp1, HYPRE_Int rap_type, hypre_Index *P_stencil_shape ); HYPRE_Int hypre_PFMGSetupInterpOp_CC0_SS9 ( HYPRE_Int i, hypre_StructMatrix *A, hypre_Box *A_dbox, HYPRE_Int cdir, hypre_Index stride, hypre_Index stridec, hypre_Index start, hypre_IndexRef startc, hypre_Index loop_size, hypre_Box *P_dbox, HYPRE_Int Pstenc0, HYPRE_Int Pstenc1, HYPRE_Real *Pp0, HYPRE_Real *Pp1, HYPRE_Int rap_type, hypre_Index *P_stencil_shape ); HYPRE_Int hypre_PFMGSetupInterpOp_CC0_SS7 ( HYPRE_Int i, hypre_StructMatrix *A, hypre_Box *A_dbox, HYPRE_Int cdir, hypre_Index stride, hypre_Index stridec, hypre_Index start, hypre_IndexRef startc, hypre_Index loop_size, hypre_Box *P_dbox, HYPRE_Int Pstenc0, HYPRE_Int Pstenc1, HYPRE_Real *Pp0, HYPRE_Real *Pp1, HYPRE_Int rap_type, hypre_Index *P_stencil_shape ); HYPRE_Int hypre_PFMGSetupInterpOp_CC0_SS15 ( HYPRE_Int i, hypre_StructMatrix *A, hypre_Box *A_dbox, HYPRE_Int cdir, hypre_Index stride, hypre_Index stridec, hypre_Index start, hypre_IndexRef startc, hypre_Index loop_size, hypre_Box *P_dbox, HYPRE_Int Pstenc0, HYPRE_Int Pstenc1, HYPRE_Real *Pp0, HYPRE_Real *Pp1, HYPRE_Int rap_type, hypre_Index *P_stencil_shape ); HYPRE_Int hypre_PFMGSetupInterpOp_CC0_SS19 ( HYPRE_Int i, hypre_StructMatrix *A, hypre_Box *A_dbox, HYPRE_Int cdir, hypre_Index stride, hypre_Index stridec, hypre_Index start, hypre_IndexRef startc, hypre_Index loop_size, hypre_Box *P_dbox, HYPRE_Int Pstenc0, HYPRE_Int Pstenc1, HYPRE_Real *Pp0, HYPRE_Real *Pp1, HYPRE_Int rap_type, hypre_Index *P_stencil_shape ); HYPRE_Int hypre_PFMGSetupInterpOp_CC0_SS27 ( HYPRE_Int i, hypre_StructMatrix *A, hypre_Box *A_dbox, HYPRE_Int cdir, hypre_Index stride, hypre_Index stridec, hypre_Index start, hypre_IndexRef startc, hypre_Index loop_size, hypre_Box *P_dbox, HYPRE_Int Pstenc0, HYPRE_Int Pstenc1, HYPRE_Real *Pp0, HYPRE_Real *Pp1, HYPRE_Int rap_type, hypre_Index *P_stencil_shape ); /* pfmg_setup_rap5.c */ hypre_StructMatrix *hypre_PFMGCreateCoarseOp5 ( hypre_StructMatrix *R, hypre_StructMatrix *A, hypre_StructMatrix *P, hypre_StructGrid *coarse_grid, HYPRE_Int cdir ); HYPRE_Int hypre_PFMGBuildCoarseOp5 ( hypre_StructMatrix *A, hypre_StructMatrix *P, hypre_StructMatrix *R, HYPRE_Int cdir, hypre_Index cindex, hypre_Index cstride, hypre_StructMatrix *RAP ); HYPRE_Int hypre_PFMGBuildCoarseOp5_onebox_CC0 ( HYPRE_Int fi, HYPRE_Int ci, hypre_StructMatrix *A, hypre_StructMatrix *P, hypre_StructMatrix *R, HYPRE_Int cdir, hypre_Index cindex, hypre_Index cstride, hypre_StructMatrix *RAP ); HYPRE_Int hypre_PFMGBuildCoarseOp5_onebox_CC1 ( HYPRE_Int fi, HYPRE_Int ci, hypre_StructMatrix *A, hypre_StructMatrix *P, hypre_StructMatrix *R, HYPRE_Int cdir, hypre_Index cindex, hypre_Index cstride, hypre_StructMatrix *RAP ); HYPRE_Int hypre_PFMGBuildCoarseOp5_onebox_CC2 ( HYPRE_Int fi, HYPRE_Int ci, hypre_StructMatrix *A, hypre_StructMatrix *P, hypre_StructMatrix *R, HYPRE_Int cdir, hypre_Index cindex, hypre_Index cstride, hypre_StructMatrix *RAP ); /* pfmg_setup_rap7.c */ hypre_StructMatrix *hypre_PFMGCreateCoarseOp7 ( hypre_StructMatrix *R, hypre_StructMatrix *A, hypre_StructMatrix *P, hypre_StructGrid *coarse_grid, HYPRE_Int cdir ); HYPRE_Int hypre_PFMGBuildCoarseOp7 ( hypre_StructMatrix *A, hypre_StructMatrix *P, hypre_StructMatrix *R, HYPRE_Int cdir, hypre_Index cindex, hypre_Index cstride, hypre_StructMatrix *RAP ); /* pfmg_setup_rap.c */ hypre_StructMatrix *hypre_PFMGCreateRAPOp ( hypre_StructMatrix *R, hypre_StructMatrix *A, hypre_StructMatrix *P, hypre_StructGrid *coarse_grid, HYPRE_Int cdir, HYPRE_Int rap_type ); HYPRE_Int hypre_PFMGSetupRAPOp ( hypre_StructMatrix *R, hypre_StructMatrix *A, hypre_StructMatrix *P, HYPRE_Int cdir, hypre_Index cindex, hypre_Index cstride, HYPRE_Int rap_type, hypre_StructMatrix *Ac ); /* pfmg_solve.c */ HYPRE_Int hypre_PFMGSolve ( void *pfmg_vdata, hypre_StructMatrix *A, hypre_StructVector *b, hypre_StructVector *x ); /* point_relax.c */ void *hypre_PointRelaxCreate ( MPI_Comm comm ); HYPRE_Int hypre_PointRelaxDestroy ( void *relax_vdata ); HYPRE_Int hypre_PointRelaxSetup ( void *relax_vdata, hypre_StructMatrix *A, hypre_StructVector *b, hypre_StructVector *x ); HYPRE_Int hypre_PointRelax ( void *relax_vdata, hypre_StructMatrix *A, hypre_StructVector *b, hypre_StructVector *x ); HYPRE_Int hypre_PointRelax_core0 ( void *relax_vdata, hypre_StructMatrix *A, HYPRE_Int constant_coefficient, hypre_Box *compute_box, HYPRE_Real *bp, HYPRE_Real *xp, HYPRE_Real *tp, HYPRE_Int boxarray_id, hypre_Box *A_data_box, hypre_Box *b_data_box, hypre_Box *x_data_box, hypre_Box *t_data_box, hypre_IndexRef stride ); HYPRE_Int hypre_PointRelax_core12 ( void *relax_vdata, hypre_StructMatrix *A, HYPRE_Int constant_coefficient, hypre_Box *compute_box, HYPRE_Real *bp, HYPRE_Real *xp, HYPRE_Real *tp, HYPRE_Int boxarray_id, hypre_Box *A_data_box, hypre_Box *b_data_box, hypre_Box *x_data_box, hypre_Box *t_data_box, hypre_IndexRef stride ); HYPRE_Int hypre_PointRelaxSetTol ( void *relax_vdata, HYPRE_Real tol ); HYPRE_Int hypre_PointRelaxGetTol ( void *relax_vdata, HYPRE_Real *tol ); HYPRE_Int hypre_PointRelaxSetMaxIter ( void *relax_vdata, HYPRE_Int max_iter ); HYPRE_Int hypre_PointRelaxGetMaxIter ( void *relax_vdata, HYPRE_Int *max_iter ); HYPRE_Int hypre_PointRelaxSetZeroGuess ( void *relax_vdata, HYPRE_Int zero_guess ); HYPRE_Int hypre_PointRelaxGetZeroGuess ( void *relax_vdata, HYPRE_Int *zero_guess ); HYPRE_Int hypre_PointRelaxGetNumIterations ( void *relax_vdata, HYPRE_Int *num_iterations ); HYPRE_Int hypre_PointRelaxSetWeight ( void *relax_vdata, HYPRE_Real weight ); HYPRE_Int hypre_PointRelaxSetNumPointsets ( void *relax_vdata, HYPRE_Int num_pointsets ); HYPRE_Int hypre_PointRelaxSetPointset ( void *relax_vdata, HYPRE_Int pointset, HYPRE_Int pointset_size, hypre_Index pointset_stride, hypre_Index *pointset_indices ); HYPRE_Int hypre_PointRelaxSetPointsetRank ( void *relax_vdata, HYPRE_Int pointset, HYPRE_Int pointset_rank ); HYPRE_Int hypre_PointRelaxSetTempVec ( void *relax_vdata, hypre_StructVector *t ); HYPRE_Int hypre_PointRelaxGetFinalRelativeResidualNorm ( void *relax_vdata, HYPRE_Real *norm ); HYPRE_Int hypre_relax_wtx ( void *relax_vdata, HYPRE_Int pointset, hypre_StructVector *t, hypre_StructVector *x ); HYPRE_Int hypre_relax_copy ( void *relax_vdata, HYPRE_Int pointset, hypre_StructVector *t, hypre_StructVector *x ); /* red_black_constantcoef_gs.c */ HYPRE_Int hypre_RedBlackConstantCoefGS ( void *relax_vdata, hypre_StructMatrix *A, hypre_StructVector *b, hypre_StructVector *x ); /* red_black_gs.c */ void *hypre_RedBlackGSCreate ( MPI_Comm comm ); HYPRE_Int hypre_RedBlackGSDestroy ( void *relax_vdata ); HYPRE_Int hypre_RedBlackGSSetup ( void *relax_vdata, hypre_StructMatrix *A, hypre_StructVector *b, hypre_StructVector *x ); HYPRE_Int hypre_RedBlackGS ( void *relax_vdata, hypre_StructMatrix *A, hypre_StructVector *b, hypre_StructVector *x ); HYPRE_Int hypre_RedBlackGSSetTol ( void *relax_vdata, HYPRE_Real tol ); HYPRE_Int hypre_RedBlackGSSetMaxIter ( void *relax_vdata, HYPRE_Int max_iter ); HYPRE_Int hypre_RedBlackGSSetZeroGuess ( void *relax_vdata, HYPRE_Int zero_guess ); HYPRE_Int hypre_RedBlackGSSetStartRed ( void *relax_vdata ); HYPRE_Int hypre_RedBlackGSSetStartBlack ( void *relax_vdata ); /* semi.c */ HYPRE_Int hypre_StructInterpAssemble ( hypre_StructMatrix *A, hypre_StructMatrix *P, HYPRE_Int P_stored_as_transpose, HYPRE_Int cdir, hypre_Index index, hypre_Index stride ); /* semi_interp.c */ void *hypre_SemiInterpCreate ( void ); HYPRE_Int hypre_SemiInterpSetup ( void *interp_vdata, hypre_StructMatrix *P, HYPRE_Int P_stored_as_transpose, hypre_StructVector *xc, hypre_StructVector *e, hypre_Index cindex, hypre_Index findex, hypre_Index stride ); HYPRE_Int hypre_SemiInterp ( void *interp_vdata, hypre_StructMatrix *P, hypre_StructVector *xc, hypre_StructVector *e ); HYPRE_Int hypre_SemiInterpDestroy ( void *interp_vdata ); /* semi_restrict.c */ void *hypre_SemiRestrictCreate ( void ); HYPRE_Int hypre_SemiRestrictSetup ( void *restrict_vdata, hypre_StructMatrix *R, HYPRE_Int R_stored_as_transpose, hypre_StructVector *r, hypre_StructVector *rc, hypre_Index cindex, hypre_Index findex, hypre_Index stride ); HYPRE_Int hypre_SemiRestrict ( void *restrict_vdata, hypre_StructMatrix *R, hypre_StructVector *r, hypre_StructVector *rc ); HYPRE_Int hypre_SemiRestrictDestroy ( void *restrict_vdata ); /* semi_setup_rap.c */ hypre_StructMatrix *hypre_SemiCreateRAPOp ( hypre_StructMatrix *R, hypre_StructMatrix *A, hypre_StructMatrix *P, hypre_StructGrid *coarse_grid, HYPRE_Int cdir, HYPRE_Int P_stored_as_transpose ); HYPRE_Int hypre_SemiBuildRAP ( hypre_StructMatrix *A, hypre_StructMatrix *P, hypre_StructMatrix *R, HYPRE_Int cdir, hypre_Index cindex, hypre_Index cstride, HYPRE_Int P_stored_as_transpose, hypre_StructMatrix *RAP ); /* smg2_setup_rap.c */ hypre_StructMatrix *hypre_SMG2CreateRAPOp ( hypre_StructMatrix *R, hypre_StructMatrix *A, hypre_StructMatrix *PT, hypre_StructGrid *coarse_grid ); HYPRE_Int hypre_SMG2BuildRAPSym ( hypre_StructMatrix *A, hypre_StructMatrix *PT, hypre_StructMatrix *R, hypre_StructMatrix *RAP, hypre_Index cindex, hypre_Index cstride ); HYPRE_Int hypre_SMG2BuildRAPNoSym ( hypre_StructMatrix *A, hypre_StructMatrix *PT, hypre_StructMatrix *R, hypre_StructMatrix *RAP, hypre_Index cindex, hypre_Index cstride ); HYPRE_Int hypre_SMG2RAPPeriodicSym ( hypre_StructMatrix *RAP, hypre_Index cindex, hypre_Index cstride ); HYPRE_Int hypre_SMG2RAPPeriodicNoSym ( hypre_StructMatrix *RAP, hypre_Index cindex, hypre_Index cstride ); /* smg3_setup_rap.c */ hypre_StructMatrix *hypre_SMG3CreateRAPOp ( hypre_StructMatrix *R, hypre_StructMatrix *A, hypre_StructMatrix *PT, hypre_StructGrid *coarse_grid ); HYPRE_Int hypre_SMG3BuildRAPSym ( hypre_StructMatrix *A, hypre_StructMatrix *PT, hypre_StructMatrix *R, hypre_StructMatrix *RAP, hypre_Index cindex, hypre_Index cstride ); HYPRE_Int hypre_SMG3BuildRAPNoSym ( hypre_StructMatrix *A, hypre_StructMatrix *PT, hypre_StructMatrix *R, hypre_StructMatrix *RAP, hypre_Index cindex, hypre_Index cstride ); HYPRE_Int hypre_SMG3RAPPeriodicSym ( hypre_StructMatrix *RAP, hypre_Index cindex, hypre_Index cstride ); HYPRE_Int hypre_SMG3RAPPeriodicNoSym ( hypre_StructMatrix *RAP, hypre_Index cindex, hypre_Index cstride ); /* smg_axpy.c */ HYPRE_Int hypre_SMGAxpy ( HYPRE_Real alpha, hypre_StructVector *x, hypre_StructVector *y, hypre_Index base_index, hypre_Index base_stride ); /* smg.c */ void *hypre_SMGCreate ( MPI_Comm comm ); HYPRE_Int hypre_SMGDestroy ( void *smg_vdata ); HYPRE_Int hypre_SMGSetMemoryUse ( void *smg_vdata, HYPRE_Int memory_use ); HYPRE_Int hypre_SMGGetMemoryUse ( void *smg_vdata, HYPRE_Int *memory_use ); HYPRE_Int hypre_SMGSetTol ( void *smg_vdata, HYPRE_Real tol ); HYPRE_Int hypre_SMGGetTol ( void *smg_vdata, HYPRE_Real *tol ); HYPRE_Int hypre_SMGSetMaxIter ( void *smg_vdata, HYPRE_Int max_iter ); HYPRE_Int hypre_SMGGetMaxIter ( void *smg_vdata, HYPRE_Int *max_iter ); HYPRE_Int hypre_SMGSetRelChange ( void *smg_vdata, HYPRE_Int rel_change ); HYPRE_Int hypre_SMGGetRelChange ( void *smg_vdata, HYPRE_Int *rel_change ); HYPRE_Int hypre_SMGSetZeroGuess ( void *smg_vdata, HYPRE_Int zero_guess ); HYPRE_Int hypre_SMGGetZeroGuess ( void *smg_vdata, HYPRE_Int *zero_guess ); HYPRE_Int hypre_SMGSetNumPreRelax ( void *smg_vdata, HYPRE_Int num_pre_relax ); HYPRE_Int hypre_SMGGetNumPreRelax ( void *smg_vdata, HYPRE_Int *num_pre_relax ); HYPRE_Int hypre_SMGSetNumPostRelax ( void *smg_vdata, HYPRE_Int num_post_relax ); HYPRE_Int hypre_SMGGetNumPostRelax ( void *smg_vdata, HYPRE_Int *num_post_relax ); HYPRE_Int hypre_SMGSetBase ( void *smg_vdata, hypre_Index base_index, hypre_Index base_stride ); HYPRE_Int hypre_SMGSetLogging ( void *smg_vdata, HYPRE_Int logging ); HYPRE_Int hypre_SMGGetLogging ( void *smg_vdata, HYPRE_Int *logging ); HYPRE_Int hypre_SMGSetPrintLevel ( void *smg_vdata, HYPRE_Int print_level ); HYPRE_Int hypre_SMGGetPrintLevel ( void *smg_vdata, HYPRE_Int *print_level ); HYPRE_Int hypre_SMGGetNumIterations ( void *smg_vdata, HYPRE_Int *num_iterations ); HYPRE_Int hypre_SMGPrintLogging ( void *smg_vdata, HYPRE_Int myid ); HYPRE_Int hypre_SMGGetFinalRelativeResidualNorm ( void *smg_vdata, HYPRE_Real *relative_residual_norm ); HYPRE_Int hypre_SMGSetStructVectorConstantValues ( hypre_StructVector *vector, HYPRE_Real values, hypre_BoxArray *box_array, hypre_Index stride ); HYPRE_Int hypre_StructSMGSetMaxLevel( void *smg_vdata, HYPRE_Int max_level ); /* smg_relax.c */ void *hypre_SMGRelaxCreate ( MPI_Comm comm ); HYPRE_Int hypre_SMGRelaxDestroyTempVec ( void *relax_vdata ); HYPRE_Int hypre_SMGRelaxDestroyARem ( void *relax_vdata ); HYPRE_Int hypre_SMGRelaxDestroyASol ( void *relax_vdata ); HYPRE_Int hypre_SMGRelaxDestroy ( void *relax_vdata ); HYPRE_Int hypre_SMGRelax ( void *relax_vdata, hypre_StructMatrix *A, hypre_StructVector *b, hypre_StructVector *x ); HYPRE_Int hypre_SMGRelaxSetup ( void *relax_vdata, hypre_StructMatrix *A, hypre_StructVector *b, hypre_StructVector *x ); HYPRE_Int hypre_SMGRelaxSetupTempVec ( void *relax_vdata, hypre_StructMatrix *A, hypre_StructVector *b, hypre_StructVector *x ); HYPRE_Int hypre_SMGRelaxSetupARem ( void *relax_vdata, hypre_StructMatrix *A, hypre_StructVector *b, hypre_StructVector *x ); HYPRE_Int hypre_SMGRelaxSetupASol ( void *relax_vdata, hypre_StructMatrix *A, hypre_StructVector *b, hypre_StructVector *x ); HYPRE_Int hypre_SMGRelaxSetTempVec ( void *relax_vdata, hypre_StructVector *temp_vec ); HYPRE_Int hypre_SMGRelaxSetMemoryUse ( void *relax_vdata, HYPRE_Int memory_use ); HYPRE_Int hypre_SMGRelaxSetTol ( void *relax_vdata, HYPRE_Real tol ); HYPRE_Int hypre_SMGRelaxSetMaxIter ( void *relax_vdata, HYPRE_Int max_iter ); HYPRE_Int hypre_SMGRelaxSetZeroGuess ( void *relax_vdata, HYPRE_Int zero_guess ); HYPRE_Int hypre_SMGRelaxSetNumSpaces ( void *relax_vdata, HYPRE_Int num_spaces ); HYPRE_Int hypre_SMGRelaxSetNumPreSpaces ( void *relax_vdata, HYPRE_Int num_pre_spaces ); HYPRE_Int hypre_SMGRelaxSetNumRegSpaces ( void *relax_vdata, HYPRE_Int num_reg_spaces ); HYPRE_Int hypre_SMGRelaxSetSpace ( void *relax_vdata, HYPRE_Int i, HYPRE_Int space_index, HYPRE_Int space_stride ); HYPRE_Int hypre_SMGRelaxSetRegSpaceRank ( void *relax_vdata, HYPRE_Int i, HYPRE_Int reg_space_rank ); HYPRE_Int hypre_SMGRelaxSetPreSpaceRank ( void *relax_vdata, HYPRE_Int i, HYPRE_Int pre_space_rank ); HYPRE_Int hypre_SMGRelaxSetBase ( void *relax_vdata, hypre_Index base_index, hypre_Index base_stride ); HYPRE_Int hypre_SMGRelaxSetNumPreRelax ( void *relax_vdata, HYPRE_Int num_pre_relax ); HYPRE_Int hypre_SMGRelaxSetNumPostRelax ( void *relax_vdata, HYPRE_Int num_post_relax ); HYPRE_Int hypre_SMGRelaxSetNewMatrixStencil ( void *relax_vdata, hypre_StructStencil *diff_stencil ); HYPRE_Int hypre_SMGRelaxSetupBaseBoxArray ( void *relax_vdata, hypre_StructMatrix *A, hypre_StructVector *b, hypre_StructVector *x ); HYPRE_Int hypre_SMGRelaxSetMaxLevel( void *relax_vdata, HYPRE_Int num_max_level ); /* smg_residual.c */ void *hypre_SMGResidualCreate ( void ); HYPRE_Int hypre_SMGResidualSetup ( void *residual_vdata, hypre_StructMatrix *A, hypre_StructVector *x, hypre_StructVector *b, hypre_StructVector *r ); HYPRE_Int hypre_SMGResidual ( void *residual_vdata, hypre_StructMatrix *A, hypre_StructVector *x, hypre_StructVector *b, hypre_StructVector *r ); HYPRE_Int hypre_SMGResidualSetBase ( void *residual_vdata, hypre_Index base_index, hypre_Index base_stride ); HYPRE_Int hypre_SMGResidualDestroy ( void *residual_vdata ); /* smg_residual_unrolled.c */ void *hypre_SMGResidualCreate ( void ); HYPRE_Int hypre_SMGResidualSetup ( void *residual_vdata, hypre_StructMatrix *A, hypre_StructVector *x, hypre_StructVector *b, hypre_StructVector *r ); HYPRE_Int hypre_SMGResidual ( void *residual_vdata, hypre_StructMatrix *A, hypre_StructVector *x, hypre_StructVector *b, hypre_StructVector *r ); HYPRE_Int hypre_SMGResidualSetBase ( void *residual_vdata, hypre_Index base_index, hypre_Index base_stride ); HYPRE_Int hypre_SMGResidualDestroy ( void *residual_vdata ); /* smg_setup.c */ HYPRE_Int hypre_SMGSetup ( void *smg_vdata, hypre_StructMatrix *A, hypre_StructVector *b, hypre_StructVector *x ); /* smg_setup_interp.c */ hypre_StructMatrix *hypre_SMGCreateInterpOp ( hypre_StructMatrix *A, hypre_StructGrid *cgrid, HYPRE_Int cdir ); HYPRE_Int hypre_SMGSetupInterpOp ( void *relax_data, hypre_StructMatrix *A, hypre_StructVector *b, hypre_StructVector *x, hypre_StructMatrix *PT, HYPRE_Int cdir, hypre_Index cindex, hypre_Index findex, hypre_Index stride ); /* smg_setup_rap.c */ hypre_StructMatrix *hypre_SMGCreateRAPOp ( hypre_StructMatrix *R, hypre_StructMatrix *A, hypre_StructMatrix *PT, hypre_StructGrid *coarse_grid ); HYPRE_Int hypre_SMGSetupRAPOp ( hypre_StructMatrix *R, hypre_StructMatrix *A, hypre_StructMatrix *PT, hypre_StructMatrix *Ac, hypre_Index cindex, hypre_Index cstride ); /* smg_setup_restrict.c */ hypre_StructMatrix *hypre_SMGCreateRestrictOp ( hypre_StructMatrix *A, hypre_StructGrid *cgrid, HYPRE_Int cdir ); HYPRE_Int hypre_SMGSetupRestrictOp ( hypre_StructMatrix *A, hypre_StructMatrix *R, hypre_StructVector *temp_vec, HYPRE_Int cdir, hypre_Index cindex, hypre_Index cstride ); /* smg_solve.c */ HYPRE_Int hypre_SMGSolve ( void *smg_vdata, hypre_StructMatrix *A, hypre_StructVector *b, hypre_StructVector *x ); /* sparse_msg2_setup_rap.c */ hypre_StructMatrix *hypre_SparseMSG2CreateRAPOp ( hypre_StructMatrix *R, hypre_StructMatrix *A, hypre_StructMatrix *P, hypre_StructGrid *coarse_grid, HYPRE_Int cdir ); HYPRE_Int hypre_SparseMSG2BuildRAPSym ( hypre_StructMatrix *A, hypre_StructMatrix *P, hypre_StructMatrix *R, HYPRE_Int cdir, hypre_Index cindex, hypre_Index cstride, hypre_Index stridePR, hypre_StructMatrix *RAP ); HYPRE_Int hypre_SparseMSG2BuildRAPNoSym ( hypre_StructMatrix *A, hypre_StructMatrix *P, hypre_StructMatrix *R, HYPRE_Int cdir, hypre_Index cindex, hypre_Index cstride, hypre_Index stridePR, hypre_StructMatrix *RAP ); /* sparse_msg3_setup_rap.c */ hypre_StructMatrix *hypre_SparseMSG3CreateRAPOp ( hypre_StructMatrix *R, hypre_StructMatrix *A, hypre_StructMatrix *P, hypre_StructGrid *coarse_grid, HYPRE_Int cdir ); HYPRE_Int hypre_SparseMSG3BuildRAPSym ( hypre_StructMatrix *A, hypre_StructMatrix *P, hypre_StructMatrix *R, HYPRE_Int cdir, hypre_Index cindex, hypre_Index cstride, hypre_Index stridePR, hypre_StructMatrix *RAP ); HYPRE_Int hypre_SparseMSG3BuildRAPNoSym ( hypre_StructMatrix *A, hypre_StructMatrix *P, hypre_StructMatrix *R, HYPRE_Int cdir, hypre_Index cindex, hypre_Index cstride, hypre_Index stridePR, hypre_StructMatrix *RAP ); /* sparse_msg.c */ void *hypre_SparseMSGCreate ( MPI_Comm comm ); HYPRE_Int hypre_SparseMSGDestroy ( void *smsg_vdata ); HYPRE_Int hypre_SparseMSGSetTol ( void *smsg_vdata, HYPRE_Real tol ); HYPRE_Int hypre_SparseMSGSetMaxIter ( void *smsg_vdata, HYPRE_Int max_iter ); HYPRE_Int hypre_SparseMSGSetJump ( void *smsg_vdata, HYPRE_Int jump ); HYPRE_Int hypre_SparseMSGSetRelChange ( void *smsg_vdata, HYPRE_Int rel_change ); HYPRE_Int hypre_SparseMSGSetZeroGuess ( void *smsg_vdata, HYPRE_Int zero_guess ); HYPRE_Int hypre_SparseMSGSetRelaxType ( void *smsg_vdata, HYPRE_Int relax_type ); HYPRE_Int hypre_SparseMSGSetJacobiWeight ( void *smsg_vdata, HYPRE_Real weight ); HYPRE_Int hypre_SparseMSGSetNumPreRelax ( void *smsg_vdata, HYPRE_Int num_pre_relax ); HYPRE_Int hypre_SparseMSGSetNumPostRelax ( void *smsg_vdata, HYPRE_Int num_post_relax ); HYPRE_Int hypre_SparseMSGSetNumFineRelax ( void *smsg_vdata, HYPRE_Int num_fine_relax ); HYPRE_Int hypre_SparseMSGSetLogging ( void *smsg_vdata, HYPRE_Int logging ); HYPRE_Int hypre_SparseMSGSetPrintLevel ( void *smsg_vdata, HYPRE_Int print_level ); HYPRE_Int hypre_SparseMSGGetNumIterations ( void *smsg_vdata, HYPRE_Int *num_iterations ); HYPRE_Int hypre_SparseMSGPrintLogging ( void *smsg_vdata, HYPRE_Int myid ); HYPRE_Int hypre_SparseMSGGetFinalRelativeResidualNorm ( void *smsg_vdata, HYPRE_Real *relative_residual_norm ); /* sparse_msg_filter.c */ HYPRE_Int hypre_SparseMSGFilterSetup ( hypre_StructMatrix *A, HYPRE_Int *num_grids, HYPRE_Int lx, HYPRE_Int ly, HYPRE_Int lz, HYPRE_Int jump, hypre_StructVector *visitx, hypre_StructVector *visity, hypre_StructVector *visitz ); HYPRE_Int hypre_SparseMSGFilter ( hypre_StructVector *visit, hypre_StructVector *e, HYPRE_Int lx, HYPRE_Int ly, HYPRE_Int lz, HYPRE_Int jump ); /* sparse_msg_interp.c */ void *hypre_SparseMSGInterpCreate ( void ); HYPRE_Int hypre_SparseMSGInterpSetup ( void *interp_vdata, hypre_StructMatrix *P, hypre_StructVector *xc, hypre_StructVector *e, hypre_Index cindex, hypre_Index findex, hypre_Index stride, hypre_Index strideP ); HYPRE_Int hypre_SparseMSGInterp ( void *interp_vdata, hypre_StructMatrix *P, hypre_StructVector *xc, hypre_StructVector *e ); HYPRE_Int hypre_SparseMSGInterpDestroy ( void *interp_vdata ); /* sparse_msg_restrict.c */ void *hypre_SparseMSGRestrictCreate ( void ); HYPRE_Int hypre_SparseMSGRestrictSetup ( void *restrict_vdata, hypre_StructMatrix *R, hypre_StructVector *r, hypre_StructVector *rc, hypre_Index cindex, hypre_Index findex, hypre_Index stride, hypre_Index strideR ); HYPRE_Int hypre_SparseMSGRestrict ( void *restrict_vdata, hypre_StructMatrix *R, hypre_StructVector *r, hypre_StructVector *rc ); HYPRE_Int hypre_SparseMSGRestrictDestroy ( void *restrict_vdata ); /* sparse_msg_setup.c */ HYPRE_Int hypre_SparseMSGSetup ( void *smsg_vdata, hypre_StructMatrix *A, hypre_StructVector *b, hypre_StructVector *x ); /* sparse_msg_setup_rap.c */ hypre_StructMatrix *hypre_SparseMSGCreateRAPOp ( hypre_StructMatrix *R, hypre_StructMatrix *A, hypre_StructMatrix *P, hypre_StructGrid *coarse_grid, HYPRE_Int cdir ); HYPRE_Int hypre_SparseMSGSetupRAPOp ( hypre_StructMatrix *R, hypre_StructMatrix *A, hypre_StructMatrix *P, HYPRE_Int cdir, hypre_Index cindex, hypre_Index cstride, hypre_Index stridePR, hypre_StructMatrix *Ac ); /* sparse_msg_solve.c */ HYPRE_Int hypre_SparseMSGSolve ( void *smsg_vdata, hypre_StructMatrix *A, hypre_StructVector *b, hypre_StructVector *x ); hypre-2.33.0/src/struct_ls/red_black_constantcoef_gs.c000066400000000000000000000426761477326011500230750ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "_hypre_struct_ls.h" #include "_hypre_struct_mv.hpp" #include "red_black_gs.h" #ifndef hypre_abs #define hypre_abs(a) (((a)>0) ? (a) : -(a)) #endif /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_RedBlackConstantCoefGS( void *relax_vdata, hypre_StructMatrix *A, hypre_StructVector *b, hypre_StructVector *x ) { hypre_RedBlackGSData *relax_data = (hypre_RedBlackGSData *)relax_vdata; HYPRE_Int max_iter = (relax_data -> max_iter); HYPRE_Int zero_guess = (relax_data -> zero_guess); HYPRE_Int rb_start = (relax_data -> rb_start); HYPRE_Int diag_rank = (relax_data -> diag_rank); hypre_ComputePkg *compute_pkg = (relax_data -> compute_pkg); HYPRE_Int ndim = hypre_StructMatrixNDim(A); hypre_CommHandle *comm_handle; hypre_BoxArrayArray *compute_box_aa; hypre_BoxArray *compute_box_a; hypre_Box *compute_box; hypre_Box *A_dbox; hypre_Box *b_dbox; hypre_Box *x_dbox; HYPRE_Int Ai, Astart, Ani, Anj; HYPRE_Int bstart, bni, bnj; HYPRE_Int xstart, xni, xnj; HYPRE_Int xoff0 = 0, xoff1 = 0, xoff2 = 0; HYPRE_Int xoff3 = 0, xoff4 = 0, xoff5 = 0; HYPRE_Real *Ap; HYPRE_Real *App; HYPRE_Real *bp; HYPRE_Real *xp; /* constant coefficient */ HYPRE_Int constant_coeff = hypre_StructMatrixConstantCoefficient(A); HYPRE_Real App0 = 1.0, App1 = 1.0, App2 = 1.0; HYPRE_Real App3 = 1.0, App4 = 1.0, App5 = 1.0, AApd = 1.0; hypre_IndexRef start; hypre_Index loop_size; hypre_StructStencil *stencil; hypre_Index *stencil_shape; HYPRE_Int stencil_size; HYPRE_Int offd[6]; HYPRE_Int iter, rb, redblack, d; HYPRE_Int compute_i, i, j; HYPRE_Int ni, nj, nk; /*---------------------------------------------------------- * Initialize some things and deal with special cases *----------------------------------------------------------*/ hypre_BeginTiming(relax_data -> time_index); hypre_StructMatrixDestroy(relax_data -> A); hypre_StructVectorDestroy(relax_data -> b); hypre_StructVectorDestroy(relax_data -> x); (relax_data -> A) = hypre_StructMatrixRef(A); (relax_data -> x) = hypre_StructVectorRef(x); (relax_data -> b) = hypre_StructVectorRef(b); (relax_data -> num_iterations) = 0; /* if max_iter is zero, return */ if (max_iter == 0) { /* if using a zero initial guess, return zero */ if (zero_guess) { hypre_StructVectorSetConstantValues(x, 0.0); } hypre_EndTiming(relax_data -> time_index); return hypre_error_flag; } else { stencil = hypre_StructMatrixStencil(A); stencil_shape = hypre_StructStencilShape(stencil); stencil_size = hypre_StructStencilSize(stencil); /* get off-diag entry ranks ready */ i = 0; for (j = 0; j < stencil_size; j++) { if (j != diag_rank) { offd[i] = j; i++; } } } hypre_StructVectorClearBoundGhostValues(x, 0); /*---------------------------------------------------------- * Do zero_guess iteration *----------------------------------------------------------*/ rb = rb_start; iter = 0; if (zero_guess) { for (compute_i = 0; compute_i < 2; compute_i++) { switch (compute_i) { case 0: { compute_box_aa = hypre_ComputePkgIndtBoxes(compute_pkg); } break; case 1: { compute_box_aa = hypre_ComputePkgDeptBoxes(compute_pkg); } break; } hypre_ForBoxArrayI(i, compute_box_aa) { compute_box_a = hypre_BoxArrayArrayBoxArray(compute_box_aa, i); A_dbox = hypre_BoxArrayBox(hypre_StructMatrixDataSpace(A), i); b_dbox = hypre_BoxArrayBox(hypre_StructVectorDataSpace(b), i); x_dbox = hypre_BoxArrayBox(hypre_StructVectorDataSpace(x), i); Ap = hypre_StructMatrixBoxData(A, i, diag_rank); bp = hypre_StructVectorBoxData(b, i); xp = hypre_StructVectorBoxData(x, i); hypre_ForBoxI(j, compute_box_a) { compute_box = hypre_BoxArrayBox(compute_box_a, j); start = hypre_BoxIMin(compute_box); hypre_BoxGetSize(compute_box, loop_size); /* Are we relaxing index start or start+(1,0,0)? */ redblack = rb; for (d = 0; d < ndim; d++) { redblack += hypre_IndexD(start, d); } redblack = hypre_abs(redblack) % 2; bstart = hypre_BoxIndexRank(b_dbox, start); xstart = hypre_BoxIndexRank(x_dbox, start); ni = hypre_IndexX(loop_size); nj = hypre_IndexY(loop_size); nk = hypre_IndexZ(loop_size); bni = hypre_BoxSizeX(b_dbox); xni = hypre_BoxSizeX(x_dbox); bnj = hypre_BoxSizeY(b_dbox); xnj = hypre_BoxSizeY(x_dbox); if (ndim < 3) { nk = 1; if (ndim < 2) { nj = 1; } } if (constant_coeff == 1) { Ai = hypre_CCBoxIndexRank(A_dbox, start); AApd = 1.0 / Ap[Ai]; hypre_RedBlackLoopInit(); #define DEVICE_VAR is_device_ptr(xp,bp) hypre_RedBlackConstantcoefLoopBegin(ni, nj, nk, redblack, bstart, bni, bnj, bi, xstart, xni, xnj, xi); { xp[xi] = bp[bi] * AApd; } hypre_RedBlackConstantcoefLoopEnd(); #undef DEVICE_VAR } else /* variable coefficient diag */ { Astart = hypre_BoxIndexRank(A_dbox, start); Ani = hypre_BoxSizeX(A_dbox); Anj = hypre_BoxSizeY(A_dbox); hypre_RedBlackLoopInit(); #define DEVICE_VAR is_device_ptr(xp,bp,Ap) hypre_RedBlackLoopBegin(ni, nj, nk, redblack, Astart, Ani, Anj, Ai, bstart, bni, bnj, bi, xstart, xni, xnj, xi); { xp[xi] = bp[bi] / Ap[Ai]; } hypre_RedBlackLoopEnd(); #undef DEVICE_VAR } } } } rb = (rb + 1) % 2; iter++; } /*---------------------------------------------------------- * Do regular iterations *----------------------------------------------------------*/ while (iter < 2 * max_iter) { for (compute_i = 0; compute_i < 2; compute_i++) { switch (compute_i) { case 0: { xp = hypre_StructVectorData(x); hypre_InitializeIndtComputations(compute_pkg, xp, &comm_handle); compute_box_aa = hypre_ComputePkgIndtBoxes(compute_pkg); } break; case 1: { hypre_FinalizeIndtComputations(comm_handle); compute_box_aa = hypre_ComputePkgDeptBoxes(compute_pkg); } break; } hypre_ForBoxArrayI(i, compute_box_aa) { compute_box_a = hypre_BoxArrayArrayBoxArray(compute_box_aa, i); A_dbox = hypre_BoxArrayBox(hypre_StructMatrixDataSpace(A), i); b_dbox = hypre_BoxArrayBox(hypre_StructVectorDataSpace(b), i); x_dbox = hypre_BoxArrayBox(hypre_StructVectorDataSpace(x), i); Ap = hypre_StructMatrixBoxData(A, i, diag_rank); bp = hypre_StructVectorBoxData(b, i); xp = hypre_StructVectorBoxData(x, i); hypre_ForBoxI(j, compute_box_a) { compute_box = hypre_BoxArrayBox(compute_box_a, j); start = hypre_BoxIMin(compute_box); hypre_BoxGetSize(compute_box, loop_size); /* Are we relaxing index start or start+(1,0,0)? */ redblack = rb; for (d = 0; d < ndim; d++) { redblack += hypre_IndexD(start, d); } redblack = hypre_abs(redblack) % 2; bstart = hypre_BoxIndexRank(b_dbox, start); xstart = hypre_BoxIndexRank(x_dbox, start); ni = hypre_IndexX(loop_size); nj = hypre_IndexY(loop_size); nk = hypre_IndexZ(loop_size); bni = hypre_BoxSizeX(b_dbox); xni = hypre_BoxSizeX(x_dbox); bnj = hypre_BoxSizeY(b_dbox); xnj = hypre_BoxSizeY(x_dbox); Ai = hypre_CCBoxIndexRank(A_dbox, start); if (ndim < 3) { nk = 1; if (ndim < 2) { nj = 1; } } switch (stencil_size) { case 7: App = hypre_StructMatrixBoxData(A, i, offd[5]); App5 = App[Ai]; App = hypre_StructMatrixBoxData(A, i, offd[4]); App4 = App[Ai]; xoff5 = hypre_BoxOffsetDistance( x_dbox, stencil_shape[offd[5]]); xoff4 = hypre_BoxOffsetDistance( x_dbox, stencil_shape[offd[4]]); /* fall through */ case 5: App = hypre_StructMatrixBoxData(A, i, offd[3]); App3 = App[Ai]; App = hypre_StructMatrixBoxData(A, i, offd[2]); App2 = App[Ai]; xoff3 = hypre_BoxOffsetDistance( x_dbox, stencil_shape[offd[3]]); xoff2 = hypre_BoxOffsetDistance( x_dbox, stencil_shape[offd[2]]); /* fall through */ case 3: App = hypre_StructMatrixBoxData(A, i, offd[1]); App1 = App[Ai]; App = hypre_StructMatrixBoxData(A, i, offd[0]); App0 = App[Ai]; xoff1 = hypre_BoxOffsetDistance( x_dbox, stencil_shape[offd[1]]); xoff0 = hypre_BoxOffsetDistance( x_dbox, stencil_shape[offd[0]]); break; } if (constant_coeff == 1) { AApd = 1 / Ap[Ai]; switch (stencil_size) { case 7: hypre_RedBlackLoopInit(); #define DEVICE_VAR is_device_ptr(xp,bp) hypre_RedBlackConstantcoefLoopBegin(ni, nj, nk, redblack, bstart, bni, bnj, bi, xstart, xni, xnj, xi); { xp[xi] = (bp[bi] - App0 * xp[xi + xoff0] - App1 * xp[xi + xoff1] - App2 * xp[xi + xoff2] - App3 * xp[xi + xoff3] - App4 * xp[xi + xoff4] - App5 * xp[xi + xoff5]) * AApd; } hypre_RedBlackConstantcoefLoopEnd(); #undef DEVICE_VAR break; case 5: hypre_RedBlackLoopInit(); #define DEVICE_VAR is_device_ptr(xp,bp) hypre_RedBlackConstantcoefLoopBegin(ni, nj, nk, redblack, bstart, bni, bnj, bi, xstart, xni, xnj, xi); { xp[xi] = (bp[bi] - App0 * xp[xi + xoff0] - App1 * xp[xi + xoff1] - App2 * xp[xi + xoff2] - App3 * xp[xi + xoff3]) * AApd; } hypre_RedBlackConstantcoefLoopEnd(); #undef DEVICE_VAR break; case 3: hypre_RedBlackLoopInit(); #define DEVICE_VAR is_device_ptr(xp,bp) hypre_RedBlackConstantcoefLoopBegin(ni, nj, nk, redblack, bstart, bni, bnj, bi, xstart, xni, xnj, xi); { xp[xi] = (bp[bi] - App0 * xp[xi + xoff0] - App1 * xp[xi + xoff1]) * AApd; } hypre_RedBlackConstantcoefLoopEnd(); #undef DEVICE_VAR break; } } /* if (constant_coeff == 1) */ else /* variable diagonal */ { Astart = hypre_BoxIndexRank(A_dbox, start); Ani = hypre_BoxSizeX(A_dbox); Anj = hypre_BoxSizeY(A_dbox); switch (stencil_size) { case 7: hypre_RedBlackLoopInit(); #define DEVICE_VAR is_device_ptr(xp,bp,Ap) hypre_RedBlackLoopBegin(ni, nj, nk, redblack, Astart, Ani, Anj, Ai, bstart, bni, bnj, bi, xstart, xni, xnj, xi); { xp[xi] = (bp[bi] - App0 * xp[xi + xoff0] - App1 * xp[xi + xoff1] - App2 * xp[xi + xoff2] - App3 * xp[xi + xoff3] - App4 * xp[xi + xoff4] - App5 * xp[xi + xoff5]) / Ap[Ai]; } hypre_RedBlackLoopEnd(); #undef DEVICE_VAR break; case 5: hypre_RedBlackLoopInit(); #define DEVICE_VAR is_device_ptr(xp,bp,Ap) hypre_RedBlackLoopBegin(ni, nj, nk, redblack, Astart, Ani, Anj, Ai, bstart, bni, bnj, bi, xstart, xni, xnj, xi); { xp[xi] = (bp[bi] - App0 * xp[xi + xoff0] - App1 * xp[xi + xoff1] - App2 * xp[xi + xoff2] - App3 * xp[xi + xoff3]) / Ap[Ai]; } hypre_RedBlackLoopEnd(); #undef DEVICE_VAR break; case 3: hypre_RedBlackLoopInit(); #define DEVICE_VAR is_device_ptr(xp,bp,Ap) hypre_RedBlackLoopBegin(ni, nj, nk, redblack, Astart, Ani, Anj, Ai, bstart, bni, bnj, bi, xstart, xni, xnj, xi); { xp[xi] = (bp[bi] - App0 * xp[xi + xoff0] - App1 * xp[xi + xoff1]) / Ap[Ai]; } hypre_RedBlackLoopEnd(); #undef DEVICE_VAR break; } /* switch(stencil_size) */ } /* else */ } } } rb = (rb + 1) % 2; iter++; } (relax_data -> num_iterations) = iter / 2; /*----------------------------------------------------------------------- * Return *-----------------------------------------------------------------------*/ hypre_IncFLOPCount(relax_data -> flops); hypre_EndTiming(relax_data -> time_index); return hypre_error_flag; } hypre-2.33.0/src/struct_ls/red_black_gs.c000066400000000000000000000445001477326011500203130ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * This routine assumes a 3-pt (1D), 5-pt (2D), or 7-pt (3D) stencil. * *****************************************************************************/ #include "_hypre_struct_ls.h" #include "_hypre_struct_mv.hpp" #include "red_black_gs.h" /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ void * hypre_RedBlackGSCreate( MPI_Comm comm ) { hypre_RedBlackGSData *relax_data; relax_data = hypre_CTAlloc(hypre_RedBlackGSData, 1, HYPRE_MEMORY_HOST); (relax_data -> comm) = comm; (relax_data -> time_index) = hypre_InitializeTiming("RedBlackGS"); /* set defaults */ (relax_data -> tol) = 1.0e-06; (relax_data -> max_iter) = 1000; (relax_data -> rel_change) = 0; (relax_data -> zero_guess) = 0; (relax_data -> rb_start) = 1; (relax_data -> flops) = 0; (relax_data -> A) = NULL; (relax_data -> b) = NULL; (relax_data -> x) = NULL; (relax_data -> compute_pkg) = NULL; return (void *) relax_data; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_RedBlackGSDestroy( void *relax_vdata ) { hypre_RedBlackGSData *relax_data = (hypre_RedBlackGSData *)relax_vdata; if (relax_data) { hypre_StructMatrixDestroy(relax_data -> A); hypre_StructVectorDestroy(relax_data -> b); hypre_StructVectorDestroy(relax_data -> x); hypre_ComputePkgDestroy(relax_data -> compute_pkg); hypre_FinalizeTiming(relax_data -> time_index); hypre_TFree(relax_data, HYPRE_MEMORY_HOST); } return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_RedBlackGSSetup( void *relax_vdata, hypre_StructMatrix *A, hypre_StructVector *b, hypre_StructVector *x ) { hypre_RedBlackGSData *relax_data = (hypre_RedBlackGSData *)relax_vdata; HYPRE_Int diag_rank; hypre_ComputePkg *compute_pkg; hypre_StructGrid *grid; hypre_StructStencil *stencil; hypre_Index diag_index; hypre_ComputeInfo *compute_info; /*---------------------------------------------------------- * Find the matrix diagonal *----------------------------------------------------------*/ grid = hypre_StructMatrixGrid(A); stencil = hypre_StructMatrixStencil(A); hypre_SetIndex3(diag_index, 0, 0, 0); diag_rank = hypre_StructStencilElementRank(stencil, diag_index); /*---------------------------------------------------------- * Set up the compute packages *----------------------------------------------------------*/ hypre_CreateComputeInfo(grid, stencil, &compute_info); hypre_ComputePkgCreate(compute_info, hypre_StructVectorDataSpace(x), 1, grid, &compute_pkg); /*---------------------------------------------------------- * Set up the relax data structure *----------------------------------------------------------*/ (relax_data -> A) = hypre_StructMatrixRef(A); (relax_data -> x) = hypre_StructVectorRef(x); (relax_data -> b) = hypre_StructVectorRef(b); (relax_data -> diag_rank) = diag_rank; (relax_data -> compute_pkg) = compute_pkg; return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_RedBlackGS( void *relax_vdata, hypre_StructMatrix *A, hypre_StructVector *b, hypre_StructVector *x ) { hypre_RedBlackGSData *relax_data = (hypre_RedBlackGSData *)relax_vdata; HYPRE_Int max_iter = (relax_data -> max_iter); HYPRE_Int zero_guess = (relax_data -> zero_guess); HYPRE_Int rb_start = (relax_data -> rb_start); HYPRE_Int diag_rank = (relax_data -> diag_rank); hypre_ComputePkg *compute_pkg = (relax_data -> compute_pkg); HYPRE_Int ndim = hypre_StructMatrixNDim(A); hypre_CommHandle *comm_handle; hypre_BoxArrayArray *compute_box_aa; hypre_BoxArray *compute_box_a; hypre_Box *compute_box; hypre_Box *A_dbox; hypre_Box *b_dbox; hypre_Box *x_dbox; HYPRE_Int Astart, Ani, Anj; HYPRE_Int bstart, bni, bnj; HYPRE_Int xstart, xni, xnj; HYPRE_Int xoff0, xoff1, xoff2, xoff3, xoff4, xoff5; HYPRE_Real *Ap; HYPRE_Real *Ap0, *Ap1, *Ap2, *Ap3, *Ap4, *Ap5; HYPRE_Real *bp; HYPRE_Real *xp; hypre_IndexRef start; hypre_Index loop_size; hypre_StructStencil *stencil; hypre_Index *stencil_shape; HYPRE_Int stencil_size; HYPRE_Int offd[6]; HYPRE_Int iter, rb, redblack, d; HYPRE_Int compute_i, i, j; HYPRE_Int ni, nj, nk; /*---------------------------------------------------------- * Initialize some things and deal with special cases *----------------------------------------------------------*/ hypre_BeginTiming(relax_data -> time_index); hypre_StructMatrixDestroy(relax_data -> A); hypre_StructVectorDestroy(relax_data -> b); hypre_StructVectorDestroy(relax_data -> x); (relax_data -> A) = hypre_StructMatrixRef(A); (relax_data -> x) = hypre_StructVectorRef(x); (relax_data -> b) = hypre_StructVectorRef(b); (relax_data -> num_iterations) = 0; /* if max_iter is zero, return */ if (max_iter == 0) { /* if using a zero initial guess, return zero */ if (zero_guess) { hypre_StructVectorSetConstantValues(x, 0.0); } hypre_EndTiming(relax_data -> time_index); return hypre_error_flag; } else { stencil = hypre_StructMatrixStencil(A); stencil_shape = hypre_StructStencilShape(stencil); stencil_size = hypre_StructStencilSize(stencil); /* get off-diag entry ranks ready */ i = 0; for (j = 0; j < stencil_size; j++) { if (j != diag_rank) { offd[i] = j; i++; } } } /*---------------------------------------------------------- * Do zero_guess iteration *----------------------------------------------------------*/ rb = rb_start; iter = 0; if (zero_guess) { for (compute_i = 0; compute_i < 2; compute_i++) { switch (compute_i) { case 0: { compute_box_aa = hypre_ComputePkgIndtBoxes(compute_pkg); } break; case 1: { compute_box_aa = hypre_ComputePkgDeptBoxes(compute_pkg); } break; } hypre_ForBoxArrayI(i, compute_box_aa) { compute_box_a = hypre_BoxArrayArrayBoxArray(compute_box_aa, i); A_dbox = hypre_BoxArrayBox(hypre_StructMatrixDataSpace(A), i); b_dbox = hypre_BoxArrayBox(hypre_StructVectorDataSpace(b), i); x_dbox = hypre_BoxArrayBox(hypre_StructVectorDataSpace(x), i); Ap = hypre_StructMatrixBoxData(A, i, diag_rank); bp = hypre_StructVectorBoxData(b, i); xp = hypre_StructVectorBoxData(x, i); hypre_ForBoxI(j, compute_box_a) { compute_box = hypre_BoxArrayBox(compute_box_a, j); start = hypre_BoxIMin(compute_box); hypre_BoxGetSize(compute_box, loop_size); /* Are we relaxing index start or start+(1,0,0)? */ redblack = rb; for (d = 0; d < ndim; d++) { redblack += hypre_IndexD(start, d); } redblack = hypre_abs(redblack) % 2; Astart = hypre_BoxIndexRank(A_dbox, start); bstart = hypre_BoxIndexRank(b_dbox, start); xstart = hypre_BoxIndexRank(x_dbox, start); ni = hypre_IndexX(loop_size); nj = hypre_IndexY(loop_size); nk = hypre_IndexZ(loop_size); Ani = hypre_BoxSizeX(A_dbox); bni = hypre_BoxSizeX(b_dbox); xni = hypre_BoxSizeX(x_dbox); Anj = hypre_BoxSizeY(A_dbox); bnj = hypre_BoxSizeY(b_dbox); xnj = hypre_BoxSizeY(x_dbox); if (ndim < 3) { nk = 1; if (ndim < 2) { nj = 1; } } hypre_RedBlackLoopInit(); #define DEVICE_VAR is_device_ptr(xp,bp,Ap) hypre_RedBlackLoopBegin(ni, nj, nk, redblack, Astart, Ani, Anj, Ai, bstart, bni, bnj, bi, xstart, xni, xnj, xi); { xp[xi] = bp[bi] / Ap[Ai]; } hypre_RedBlackLoopEnd(); #undef DEVICE_VAR } } } rb = (rb + 1) % 2; iter++; } /*---------------------------------------------------------- * Do regular iterations *----------------------------------------------------------*/ while (iter < 2 * max_iter) { for (compute_i = 0; compute_i < 2; compute_i++) { switch (compute_i) { case 0: { xp = hypre_StructVectorData(x); hypre_InitializeIndtComputations(compute_pkg, xp, &comm_handle); compute_box_aa = hypre_ComputePkgIndtBoxes(compute_pkg); } break; case 1: { hypre_FinalizeIndtComputations(comm_handle); compute_box_aa = hypre_ComputePkgDeptBoxes(compute_pkg); } break; } hypre_ForBoxArrayI(i, compute_box_aa) { compute_box_a = hypre_BoxArrayArrayBoxArray(compute_box_aa, i); A_dbox = hypre_BoxArrayBox(hypre_StructMatrixDataSpace(A), i); b_dbox = hypre_BoxArrayBox(hypre_StructVectorDataSpace(b), i); x_dbox = hypre_BoxArrayBox(hypre_StructVectorDataSpace(x), i); Ap = hypre_StructMatrixBoxData(A, i, diag_rank); bp = hypre_StructVectorBoxData(b, i); xp = hypre_StructVectorBoxData(x, i); hypre_ForBoxI(j, compute_box_a) { compute_box = hypre_BoxArrayBox(compute_box_a, j); start = hypre_BoxIMin(compute_box); hypre_BoxGetSize(compute_box, loop_size); /* Are we relaxing index start or start+(1,0,0)? */ redblack = rb; for (d = 0; d < ndim; d++) { redblack += hypre_IndexD(start, d); } redblack = hypre_abs(redblack) % 2; Astart = hypre_BoxIndexRank(A_dbox, start); bstart = hypre_BoxIndexRank(b_dbox, start); xstart = hypre_BoxIndexRank(x_dbox, start); ni = hypre_IndexX(loop_size); nj = hypre_IndexY(loop_size); nk = hypre_IndexZ(loop_size); Ani = hypre_BoxSizeX(A_dbox); bni = hypre_BoxSizeX(b_dbox); xni = hypre_BoxSizeX(x_dbox); Anj = hypre_BoxSizeY(A_dbox); bnj = hypre_BoxSizeY(b_dbox); xnj = hypre_BoxSizeY(x_dbox); if (ndim < 3) { nk = 1; if (ndim < 2) { nj = 1; } } switch (stencil_size) { case 7: Ap5 = hypre_StructMatrixBoxData(A, i, offd[5]); Ap4 = hypre_StructMatrixBoxData(A, i, offd[4]); xoff5 = hypre_BoxOffsetDistance(x_dbox, stencil_shape[offd[5]]); xoff4 = hypre_BoxOffsetDistance(x_dbox, stencil_shape[offd[4]]); // fall through case 5: Ap3 = hypre_StructMatrixBoxData(A, i, offd[3]); Ap2 = hypre_StructMatrixBoxData(A, i, offd[2]); xoff3 = hypre_BoxOffsetDistance(x_dbox, stencil_shape[offd[3]]); xoff2 = hypre_BoxOffsetDistance(x_dbox, stencil_shape[offd[2]]); // fall through case 3: Ap1 = hypre_StructMatrixBoxData(A, i, offd[1]); Ap0 = hypre_StructMatrixBoxData(A, i, offd[0]); xoff1 = hypre_BoxOffsetDistance(x_dbox, stencil_shape[offd[1]]); xoff0 = hypre_BoxOffsetDistance(x_dbox, stencil_shape[offd[0]]); break; } switch (stencil_size) { case 7: hypre_RedBlackLoopInit(); #define DEVICE_VAR is_device_ptr(xp,bp,Ap0,Ap1,Ap2,Ap3,Ap4,Ap5,Ap) hypre_RedBlackLoopBegin(ni, nj, nk, redblack, Astart, Ani, Anj, Ai, bstart, bni, bnj, bi, xstart, xni, xnj, xi); { xp[xi] = (bp[bi] - Ap0[Ai] * xp[xi + xoff0] - Ap1[Ai] * xp[xi + xoff1] - Ap2[Ai] * xp[xi + xoff2] - Ap3[Ai] * xp[xi + xoff3] - Ap4[Ai] * xp[xi + xoff4] - Ap5[Ai] * xp[xi + xoff5]) / Ap[Ai]; } hypre_RedBlackLoopEnd(); #undef DEVICE_VAR break; case 5: hypre_RedBlackLoopInit(); #define DEVICE_VAR is_device_ptr(xp,bp,Ap0,Ap1,Ap2,Ap3,Ap) hypre_RedBlackLoopBegin(ni, nj, nk, redblack, Astart, Ani, Anj, Ai, bstart, bni, bnj, bi, xstart, xni, xnj, xi); { xp[xi] = (bp[bi] - Ap0[Ai] * xp[xi + xoff0] - Ap1[Ai] * xp[xi + xoff1] - Ap2[Ai] * xp[xi + xoff2] - Ap3[Ai] * xp[xi + xoff3]) / Ap[Ai]; } hypre_RedBlackLoopEnd(); #undef DEVICE_VAR break; case 3: hypre_RedBlackLoopInit(); #define DEVICE_VAR is_device_ptr(xp,bp,Ap0,Ap1,Ap) hypre_RedBlackLoopBegin(ni, nj, nk, redblack, Astart, Ani, Anj, Ai, bstart, bni, bnj, bi, xstart, xni, xnj, xi); { xp[xi] = (bp[bi] - Ap0[Ai] * xp[xi + xoff0] - Ap1[Ai] * xp[xi + xoff1]) / Ap[Ai]; } hypre_RedBlackLoopEnd(); #undef DEVICE_VAR break; } } } } rb = (rb + 1) % 2; iter++; } (relax_data -> num_iterations) = iter / 2; /*----------------------------------------------------------------------- * Return *-----------------------------------------------------------------------*/ hypre_IncFLOPCount(relax_data -> flops); hypre_EndTiming(relax_data -> time_index); return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_RedBlackGSSetTol( void *relax_vdata, HYPRE_Real tol ) { hypre_RedBlackGSData *relax_data = (hypre_RedBlackGSData *)relax_vdata; (relax_data -> tol) = tol; return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_RedBlackGSSetMaxIter( void *relax_vdata, HYPRE_Int max_iter ) { hypre_RedBlackGSData *relax_data = (hypre_RedBlackGSData *)relax_vdata; (relax_data -> max_iter) = max_iter; return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_RedBlackGSSetZeroGuess( void *relax_vdata, HYPRE_Int zero_guess ) { hypre_RedBlackGSData *relax_data = (hypre_RedBlackGSData *)relax_vdata; (relax_data -> zero_guess) = zero_guess; return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_RedBlackGSSetStartRed( void *relax_vdata ) { hypre_RedBlackGSData *relax_data = (hypre_RedBlackGSData *)relax_vdata; (relax_data -> rb_start) = 1; return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_RedBlackGSSetStartBlack( void *relax_vdata ) { hypre_RedBlackGSData *relax_data = (hypre_RedBlackGSData *)relax_vdata; (relax_data -> rb_start) = 0; return hypre_error_flag; } hypre-2.33.0/src/struct_ls/red_black_gs.h000066400000000000000000000511301477326011500203150ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /*-------------------------------------------------------------------------- * hypre_RedBlackGSData data structure *--------------------------------------------------------------------------*/ typedef struct { MPI_Comm comm; HYPRE_Real tol; /* not yet used */ HYPRE_Int max_iter; HYPRE_Int rel_change; /* not yet used */ HYPRE_Int zero_guess; HYPRE_Int rb_start; hypre_StructMatrix *A; hypre_StructVector *b; hypre_StructVector *x; HYPRE_Int diag_rank; hypre_ComputePkg *compute_pkg; /* log info (always logged) */ HYPRE_Int num_iterations; HYPRE_Int time_index; HYPRE_Int flops; } hypre_RedBlackGSData; #ifdef HYPRE_USING_RAJA #define hypre_RedBlackLoopInit() #define hypre_RedBlackLoopBegin(ni,nj,nk,redblack, \ Astart,Ani,Anj,Ai, \ bstart,bni,bnj,bi, \ xstart,xni,xnj,xi) \ { \ HYPRE_Int hypre__tot = nk*nj*((ni+1)/2); \ forall< hypre_raja_exec_policy >(RangeSegment(0, hypre__tot), [=] hypre_RAJA_DEVICE (HYPRE_Int idx) \ { \ HYPRE_Int idx_local = idx; \ HYPRE_Int ii,jj,kk,Ai,bi,xi; \ HYPRE_Int local_ii; \ kk = idx_local % nk; \ idx_local = idx_local / nk; \ jj = idx_local % nj; \ idx_local = idx_local / nj; \ local_ii = (kk + jj + redblack) % 2; \ ii = 2*idx_local + local_ii; \ if (ii < ni) \ { \ Ai = Astart + kk*Anj*Ani + jj*Ani + ii; \ bi = bstart + kk*bnj*bni + jj*bni + ii; \ xi = xstart + kk*xnj*xni + jj*xni + ii; \ #define hypre_RedBlackLoopEnd() \ } \ }); \ hypre_fence(); \ } #define hypre_RedBlackConstantcoefLoopBegin(ni,nj,nk,redblack, \ bstart,bni,bnj,bi, \ xstart,xni,xnj,xi) \ { \ HYPRE_Int hypre__tot = nk*nj*((ni+1)/2); \ forall< hypre_raja_exec_policy >(RangeSegment(0, hypre__tot), [=] hypre_RAJA_DEVICE (HYPRE_Int idx) \ { \ HYPRE_Int idx_local = idx; \ HYPRE_Int ii,jj,kk,bi,xi; \ HYPRE_Int local_ii; \ kk = idx_local % nk; \ idx_local = idx_local / nk; \ jj = idx_local % nj; \ idx_local = idx_local / nj; \ local_ii = (kk + jj + redblack) % 2; \ ii = 2*idx_local + local_ii; \ if (ii < ni) \ { \ bi = bstart + kk*bnj*bni + jj*bni + ii; \ xi = xstart + kk*xnj*xni + jj*xni + ii; \ #define hypre_RedBlackConstantcoefLoopEnd() \ } \ }); \ hypre_fence(); \ } #elif defined(HYPRE_USING_KOKKOS) #define hypre_RedBlackLoopInit() #define hypre_RedBlackLoopBegin(ni,nj,nk,redblack, \ Astart,Ani,Anj,Ai, \ bstart,bni,bnj,bi, \ xstart,xni,xnj,xi) \ { \ HYPRE_Int hypre__tot = nk*nj*((ni+1)/2); \ Kokkos::parallel_for (hypre__tot, KOKKOS_LAMBDA (HYPRE_Int idx) \ { \ HYPRE_Int idx_local = idx; \ HYPRE_Int ii,jj,kk,Ai,bi,xi; \ HYPRE_Int local_ii; \ kk = idx_local % nk; \ idx_local = idx_local / nk; \ jj = idx_local % nj; \ idx_local = idx_local / nj; \ local_ii = (kk + jj + redblack) % 2; \ ii = 2*idx_local + local_ii; \ if (ii < ni) \ { \ Ai = Astart + kk*Anj*Ani + jj*Ani + ii; \ bi = bstart + kk*bnj*bni + jj*bni + ii; \ xi = xstart + kk*xnj*xni + jj*xni + ii; \ #define hypre_RedBlackLoopEnd() \ } \ }); \ hypre_fence(); \ } #define hypre_RedBlackConstantcoefLoopBegin(ni,nj,nk,redblack, \ bstart,bni,bnj,bi, \ xstart,xni,xnj,xi) \ { \ HYPRE_Int hypre__tot = nk*nj*((ni+1)/2); \ Kokkos::parallel_for (hypre__tot, KOKKOS_LAMBDA (HYPRE_Int idx) \ { \ HYPRE_Int idx_local = idx; \ HYPRE_Int ii,jj,kk,bi,xi; \ HYPRE_Int local_ii; \ kk = idx_local % nk; \ idx_local = idx_local / nk; \ jj = idx_local % nj; \ idx_local = idx_local / nj; \ local_ii = (kk + jj + redblack) % 2; \ ii = 2*idx_local + local_ii; \ if (ii < ni) \ { \ bi = bstart + kk*bnj*bni + jj*bni + ii; \ xi = xstart + kk*xnj*xni + jj*xni + ii; \ #define hypre_RedBlackConstantcoefLoopEnd() \ } \ }); \ hypre_fence(); \ } #elif defined(HYPRE_USING_CUDA) || defined(HYPRE_USING_HIP) #define hypre_RedBlackLoopInit() #define hypre_RedBlackLoopBegin(ni,nj,nk,redblack, \ Astart,Ani,Anj,Ai, \ bstart,bni,bnj,bi, \ xstart,xni,xnj,xi) \ { \ HYPRE_Int hypre__tot = nk*nj*((ni+1)/2); \ BoxLoopforall(hypre__tot, HYPRE_LAMBDA (HYPRE_Int idx) \ { \ HYPRE_Int idx_local = idx; \ HYPRE_Int ii,jj,kk,Ai,bi,xi; \ HYPRE_Int local_ii; \ kk = idx_local % nk; \ idx_local = idx_local / nk; \ jj = idx_local % nj; \ idx_local = idx_local / nj; \ local_ii = (kk + jj + redblack) % 2; \ ii = 2*idx_local + local_ii; \ if (ii < ni) \ { \ Ai = Astart + kk*Anj*Ani + jj*Ani + ii; \ bi = bstart + kk*bnj*bni + jj*bni + ii; \ xi = xstart + kk*xnj*xni + jj*xni + ii; \ #define hypre_RedBlackLoopEnd() \ } \ }); \ } #define hypre_RedBlackConstantcoefLoopBegin(ni,nj,nk,redblack, \ bstart,bni,bnj,bi, \ xstart,xni,xnj,xi) \ { \ HYPRE_Int hypre__tot = nk*nj*((ni+1)/2); \ BoxLoopforall(hypre__tot, HYPRE_LAMBDA (HYPRE_Int idx) \ { \ HYPRE_Int idx_local = idx; \ HYPRE_Int ii,jj,kk,bi,xi; \ HYPRE_Int local_ii; \ kk = idx_local % nk; \ idx_local = idx_local / nk; \ jj = idx_local % nj; \ idx_local = idx_local / nj; \ local_ii = (kk + jj + redblack) % 2; \ ii = 2*idx_local + local_ii; \ if (ii < ni) \ { \ bi = bstart + kk*bnj*bni + jj*bni + ii; \ xi = xstart + kk*xnj*xni + jj*xni + ii; \ #define hypre_RedBlackConstantcoefLoopEnd() \ } \ }); \ } #elif defined(HYPRE_USING_SYCL) #define hypre_RedBlackLoopInit() #define hypre_RedBlackLoopBegin(ni,nj,nk,redblack, \ Astart,Ani,Anj,Ai, \ bstart,bni,bnj,bi, \ xstart,xni,xnj,xi) \ { \ HYPRE_Int hypre__tot = nk*nj*((ni+1)/2); \ BoxLoopforall(hypre__tot, [=] (sycl::nd_item<3> item) \ { \ HYPRE_Int idx = (HYPRE_Int) item.get_global_linear_id(); \ HYPRE_Int idx_local = idx; \ HYPRE_Int ii,jj,kk,Ai,bi,xi; \ HYPRE_Int local_ii; \ kk = idx_local % nk; \ idx_local = idx_local / nk; \ jj = idx_local % nj; \ idx_local = idx_local / nj; \ local_ii = (kk + jj + redblack) % 2; \ ii = 2*idx_local + local_ii; \ if (ii < ni) \ { \ Ai = Astart + kk*Anj*Ani + jj*Ani + ii; \ bi = bstart + kk*bnj*bni + jj*bni + ii; \ xi = xstart + kk*xnj*xni + jj*xni + ii; \ #define hypre_RedBlackLoopEnd() \ } \ }); \ } #define hypre_RedBlackConstantcoefLoopBegin(ni,nj,nk,redblack, \ bstart,bni,bnj,bi, \ xstart,xni,xnj,xi) \ { \ HYPRE_Int hypre__tot = nk*nj*((ni+1)/2); \ BoxLoopforall(hypre__tot, [=] (sycl::nd_item<3> item) \ { \ HYPRE_Int idx = (HYPRE_Int) item.get_global_linear_id(); \ HYPRE_Int idx_local = idx; \ HYPRE_Int ii,jj,kk,bi,xi; \ HYPRE_Int local_ii; \ kk = idx_local % nk; \ idx_local = idx_local / nk; \ jj = idx_local % nj; \ idx_local = idx_local / nj; \ local_ii = (kk + jj + redblack) % 2; \ ii = 2*idx_local + local_ii; \ if (ii < ni) \ { \ bi = bstart + kk*bnj*bni + jj*bni + ii; \ xi = xstart + kk*xnj*xni + jj*xni + ii; \ #define hypre_RedBlackConstantcoefLoopEnd() \ } \ }); \ } #elif defined(HYPRE_USING_DEVICE_OPENMP) /* BEGIN OF OMP 4.5 */ /* #define IF_CLAUSE if (hypre__global_offload) */ /* stringification: * _Pragma(string-literal), so we need to cast argument to a string * The three dots as last argument of the macro tells compiler that this is a variadic macro. * I.e. this is a macro that receives variable number of arguments. */ //#define HYPRE_STR(s...) #s //#define HYPRE_XSTR(s...) HYPRE_STR(s) #define hypre_RedBlackLoopInit() #define hypre_RedBlackLoopBegin(ni,nj,nk,redblack, \ Astart,Ani,Anj,Ai, \ bstart,bni,bnj,bi, \ xstart,xni,xnj,xi) \ { \ HYPRE_Int hypre__thread, hypre__tot = nk*nj*((ni+1)/2); \ HYPRE_BOXLOOP_ENTRY_PRINT \ /* device code: */ \ _Pragma (HYPRE_XSTR(omp target teams distribute parallel for IF_CLAUSE IS_DEVICE_CLAUSE)) \ for (hypre__thread=0; hypre__thread <----x----> <----x stencil coeffs needed for P^T * <----x----> <----x----> stencil coeffs needed for P * <----x<--->x<--->x----> stencil coeffs needed for A * * :-----:-----|-----:-----: fine grid * :-----------|-----------: coarse grid * * <----------x----------> stencil coeffs to be computed for RAP * * The issue is with the grid for P, which is empty on process p. Previously, * we added ghost zones to get the appropriate neighbor data, and we did this * even for zero boxes. Unfortunately, dealing with zero boxes is a major pain, * so the below routine eliminates the need for handling zero boxes when * computing communication information. * *--------------------------------------------------------------------------*/ HYPRE_Int hypre_StructInterpAssemble( hypre_StructMatrix *A, hypre_StructMatrix *P, HYPRE_Int P_stored_as_transpose, HYPRE_Int cdir, hypre_Index index, hypre_Index stride ) { hypre_StructGrid *grid = hypre_StructMatrixGrid(A); hypre_BoxArrayArray *box_aa; hypre_BoxArray *box_a; hypre_Box *box; hypre_CommInfo *comm_info; hypre_CommPkg *comm_pkg; hypre_CommHandle *comm_handle; HYPRE_Int num_ghost[] = {0, 0, 0, 0, 0, 0}; HYPRE_Int i, j, s, dim; if (hypre_StructMatrixConstantCoefficient(P) != 0) { return hypre_error_flag; } /* set num_ghost */ dim = hypre_StructGridNDim(grid); for (j = 0; j < dim; j++) { num_ghost[2 * j] = 1; num_ghost[2 * j + 1] = 1; } if (P_stored_as_transpose) { num_ghost[2 * cdir] = 2; num_ghost[2 * cdir + 1] = 2; } /* comm_info <-- From fine grid grown by num_ghost */ hypre_CreateCommInfoFromNumGhost(grid, num_ghost, &comm_info); /* Project and map comm_info onto coarsened index space */ hypre_CommInfoProjectSend(comm_info, index, stride); hypre_CommInfoProjectRecv(comm_info, index, stride); for (s = 0; s < 4; s++) { switch (s) { case 0: box_aa = hypre_CommInfoSendBoxes(comm_info); hypre_SetIndex3(hypre_CommInfoSendStride(comm_info), 1, 1, 1); break; case 1: box_aa = hypre_CommInfoRecvBoxes(comm_info); hypre_SetIndex3(hypre_CommInfoRecvStride(comm_info), 1, 1, 1); break; case 2: box_aa = hypre_CommInfoSendRBoxes(comm_info); break; case 3: box_aa = hypre_CommInfoRecvRBoxes(comm_info); break; } hypre_ForBoxArrayI(j, box_aa) { box_a = hypre_BoxArrayArrayBoxArray(box_aa, j); hypre_ForBoxI(i, box_a) { box = hypre_BoxArrayBox(box_a, i); hypre_StructMapFineToCoarse(hypre_BoxIMin(box), index, stride, hypre_BoxIMin(box)); hypre_StructMapFineToCoarse(hypre_BoxIMax(box), index, stride, hypre_BoxIMax(box)); } } } comm_pkg = hypre_StructMatrixCommPkg(P); if (comm_pkg) { hypre_CommPkgDestroy(comm_pkg); } hypre_CommPkgCreate(comm_info, hypre_StructMatrixDataSpace(P), hypre_StructMatrixDataSpace(P), hypre_StructMatrixNumValues(P), NULL, 0, hypre_StructMatrixComm(P), &comm_pkg); hypre_CommInfoDestroy(comm_info); hypre_StructMatrixCommPkg(P) = comm_pkg; hypre_InitializeCommunication(comm_pkg, hypre_StructMatrixStencilData(P)[0],//hypre_StructMatrixData(P), hypre_StructMatrixStencilData(P)[0],//hypre_StructMatrixData(P), 0, 0, &comm_handle); hypre_FinalizeCommunication(comm_handle); return hypre_error_flag; } hypre-2.33.0/src/struct_ls/semi_interp.c000066400000000000000000000306371477326011500202400ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "_hypre_struct_ls.h" #include "_hypre_struct_mv.hpp" /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ typedef struct { hypre_StructMatrix *P; HYPRE_Int P_stored_as_transpose; hypre_ComputePkg *compute_pkg; hypre_Index cindex; hypre_Index findex; hypre_Index stride; HYPRE_Int time_index; } hypre_SemiInterpData; /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ void * hypre_SemiInterpCreate( void ) { hypre_SemiInterpData *interp_data; interp_data = hypre_CTAlloc(hypre_SemiInterpData, 1, HYPRE_MEMORY_HOST); (interp_data -> time_index) = hypre_InitializeTiming("SemiInterp"); return (void *) interp_data; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SemiInterpSetup( void *interp_vdata, hypre_StructMatrix *P, HYPRE_Int P_stored_as_transpose, hypre_StructVector *xc, hypre_StructVector *e, hypre_Index cindex, hypre_Index findex, hypre_Index stride ) { HYPRE_UNUSED_VAR(xc); hypre_SemiInterpData *interp_data = (hypre_SemiInterpData *)interp_vdata; hypre_StructGrid *grid; hypre_StructStencil *stencil; hypre_ComputeInfo *compute_info; hypre_ComputePkg *compute_pkg; /*---------------------------------------------------------- * Set up the compute package *----------------------------------------------------------*/ HYPRE_ANNOTATE_FUNC_BEGIN; grid = hypre_StructVectorGrid(e); stencil = hypre_StructMatrixStencil(P); hypre_CreateComputeInfo(grid, stencil, &compute_info); hypre_ComputeInfoProjectSend(compute_info, cindex, stride); hypre_ComputeInfoProjectRecv(compute_info, cindex, stride); hypre_ComputeInfoProjectComp(compute_info, findex, stride); hypre_ComputePkgCreate(compute_info, hypre_StructVectorDataSpace(e), 1, grid, &compute_pkg); /*---------------------------------------------------------- * Set up the interp data structure *----------------------------------------------------------*/ (interp_data -> P) = hypre_StructMatrixRef(P); (interp_data -> P_stored_as_transpose) = P_stored_as_transpose; (interp_data -> compute_pkg) = compute_pkg; hypre_CopyIndex(cindex, (interp_data -> cindex)); hypre_CopyIndex(findex, (interp_data -> findex)); hypre_CopyIndex(stride, (interp_data -> stride)); HYPRE_ANNOTATE_FUNC_END; return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SemiInterp( void *interp_vdata, hypre_StructMatrix *P, hypre_StructVector *xc, hypre_StructVector *e ) { hypre_SemiInterpData *interp_data = (hypre_SemiInterpData *)interp_vdata; HYPRE_Int P_stored_as_transpose; hypre_ComputePkg *compute_pkg; hypre_IndexRef cindex; hypre_IndexRef findex; hypre_IndexRef stride; hypre_StructGrid *fgrid; HYPRE_Int *fgrid_ids; hypre_StructGrid *cgrid; hypre_BoxArray *cgrid_boxes; HYPRE_Int *cgrid_ids; hypre_CommHandle *comm_handle; hypre_BoxArrayArray *compute_box_aa; hypre_BoxArray *compute_box_a; hypre_Box *compute_box; hypre_Box *P_dbox; hypre_Box *xc_dbox; hypre_Box *e_dbox; HYPRE_Int Pi; HYPRE_Int constant_coefficient; HYPRE_Real *Pp0, *Pp1; HYPRE_Real *xcp; HYPRE_Real *ep; hypre_Index loop_size; hypre_Index start; hypre_Index startc; hypre_Index stridec; hypre_StructStencil *stencil; hypre_Index *stencil_shape; HYPRE_Int compute_i, fi, ci, j; hypre_StructVector *xc_tmp; /*----------------------------------------------------------------------- * Initialize some things *-----------------------------------------------------------------------*/ HYPRE_ANNOTATE_FUNC_BEGIN; hypre_BeginTiming(interp_data -> time_index); P_stored_as_transpose = (interp_data -> P_stored_as_transpose); compute_pkg = (interp_data -> compute_pkg); cindex = (interp_data -> cindex); findex = (interp_data -> findex); stride = (interp_data -> stride); stencil = hypre_StructMatrixStencil(P); stencil_shape = hypre_StructStencilShape(stencil); constant_coefficient = hypre_StructMatrixConstantCoefficient(P); hypre_assert( constant_coefficient == 0 || constant_coefficient == 1 ); /* ... constant_coefficient==2 for P shouldn't happen, see hypre_PFMGCreateInterpOp in pfmg_setup_interp.c */ if (constant_coefficient) { hypre_StructVectorClearBoundGhostValues(e, 0); } hypre_SetIndex3(stridec, 1, 1, 1); /*----------------------------------------------------------------------- * Compute e at coarse points (injection) *-----------------------------------------------------------------------*/ fgrid = hypre_StructVectorGrid(e); fgrid_ids = hypre_StructGridIDs(fgrid); cgrid = hypre_StructVectorGrid(xc); cgrid_boxes = hypre_StructGridBoxes(cgrid); cgrid_ids = hypre_StructGridIDs(cgrid); #if 0 //defined(HYPRE_USING_CUDA) || defined(HYPRE_USING_HIP) HYPRE_MemoryLocation data_location_f = hypre_StructGridDataLocation(fgrid); HYPRE_MemoryLocation data_location_c = hypre_StructGridDataLocation(cgrid); if (data_location_f != data_location_c) { xc_tmp = hypre_StructVectorCreate(hypre_MPI_COMM_WORLD, cgrid); hypre_StructVectorSetNumGhost(xc_tmp, hypre_StructVectorNumGhost(xc)); hypre_StructGridDataLocation(cgrid) = data_location_f; hypre_StructVectorInitialize(xc_tmp); hypre_StructVectorAssemble(xc_tmp); hypre_TMemcpy(hypre_StructVectorData(xc_tmp), hypre_StructVectorData(xc), HYPRE_Complex, hypre_StructVectorDataSize(xc), HYPRE_MEMORY_DEVICE, HYPRE_MEMORY_HOST); } else { xc_tmp = xc; } #else xc_tmp = xc; #endif fi = 0; hypre_ForBoxI(ci, cgrid_boxes) { while (fgrid_ids[fi] != cgrid_ids[ci]) { fi++; } compute_box = hypre_BoxArrayBox(cgrid_boxes, ci); hypre_CopyIndex(hypre_BoxIMin(compute_box), startc); hypre_StructMapCoarseToFine(startc, cindex, stride, start); e_dbox = hypre_BoxArrayBox(hypre_StructVectorDataSpace(e), fi); xc_dbox = hypre_BoxArrayBox(hypre_StructVectorDataSpace(xc), ci); ep = hypre_StructVectorBoxData(e, fi); xcp = hypre_StructVectorBoxData(xc_tmp, ci); hypre_BoxGetSize(compute_box, loop_size); #define DEVICE_VAR is_device_ptr(ep,xcp) hypre_BoxLoop2Begin(hypre_StructMatrixNDim(P), loop_size, e_dbox, start, stride, ei, xc_dbox, startc, stridec, xci); { ep[ei] = xcp[xci]; } hypre_BoxLoop2End(ei, xci); #undef DEVICE_VAR } /*----------------------------------------------------------------------- * Compute e at fine points *-----------------------------------------------------------------------*/ for (compute_i = 0; compute_i < 2; compute_i++) { switch (compute_i) { case 0: { ep = hypre_StructVectorData(e); hypre_InitializeIndtComputations(compute_pkg, ep, &comm_handle); compute_box_aa = hypre_ComputePkgIndtBoxes(compute_pkg); } break; case 1: { hypre_FinalizeIndtComputations(comm_handle); compute_box_aa = hypre_ComputePkgDeptBoxes(compute_pkg); } break; } hypre_ForBoxArrayI(fi, compute_box_aa) { compute_box_a = hypre_BoxArrayArrayBoxArray(compute_box_aa, fi); P_dbox = hypre_BoxArrayBox(hypre_StructMatrixDataSpace(P), fi); e_dbox = hypre_BoxArrayBox(hypre_StructVectorDataSpace(e), fi); //RL:PTROFFSET HYPRE_Int Pp1_offset = 0, ep0_offset, ep1_offset; if (P_stored_as_transpose) { if ( constant_coefficient ) { Pp0 = hypre_StructMatrixBoxData(P, fi, 1); Pp1 = hypre_StructMatrixBoxData(P, fi, 0); Pp1_offset = -hypre_CCBoxOffsetDistance(P_dbox, stencil_shape[0]); } else { Pp0 = hypre_StructMatrixBoxData(P, fi, 1); Pp1 = hypre_StructMatrixBoxData(P, fi, 0); Pp1_offset = -hypre_BoxOffsetDistance(P_dbox, stencil_shape[0]); } } else { Pp0 = hypre_StructMatrixBoxData(P, fi, 0); Pp1 = hypre_StructMatrixBoxData(P, fi, 1); } ep = hypre_StructVectorBoxData(e, fi); ep0_offset = hypre_BoxOffsetDistance(e_dbox, stencil_shape[0]); ep1_offset = hypre_BoxOffsetDistance(e_dbox, stencil_shape[1]); hypre_ForBoxI(j, compute_box_a) { compute_box = hypre_BoxArrayBox(compute_box_a, j); hypre_CopyIndex(hypre_BoxIMin(compute_box), start); hypre_StructMapFineToCoarse(start, findex, stride, startc); hypre_BoxGetStrideSize(compute_box, stride, loop_size); if ( constant_coefficient ) { HYPRE_Complex Pp0val, Pp1val; Pi = hypre_CCBoxIndexRank( P_dbox, startc ); Pp0val = Pp0[Pi]; Pp1val = Pp1[Pi + Pp1_offset]; #define DEVICE_VAR is_device_ptr(ep) hypre_BoxLoop1Begin(hypre_StructMatrixNDim(P), loop_size, e_dbox, start, stride, ei); { ep[ei] = (Pp0val * ep[ei + ep0_offset] + Pp1val * ep[ei + ep1_offset]); } hypre_BoxLoop1End(ei); #undef DEVICE_VAR } else { #define DEVICE_VAR is_device_ptr(ep,Pp0,Pp1) hypre_BoxLoop2Begin(hypre_StructMatrixNDim(P), loop_size, P_dbox, startc, stridec, Pi, e_dbox, start, stride, ei); { ep[ei] = (Pp0[Pi] * ep[ei + ep0_offset] + Pp1[Pi + Pp1_offset] * ep[ei + ep1_offset]); } hypre_BoxLoop2End(Pi, ei); #undef DEVICE_VAR } } } } #if 0 //defined(HYPRE_USING_CUDA) || defined(HYPRE_USING_HIP) if (data_location_f != data_location_c) { hypre_StructVectorDestroy(xc_tmp); hypre_StructGridDataLocation(cgrid) = data_location_c; } #endif /*----------------------------------------------------------------------- * Return *-----------------------------------------------------------------------*/ hypre_IncFLOPCount(3 * hypre_StructVectorGlobalSize(xc)); hypre_EndTiming(interp_data -> time_index); HYPRE_ANNOTATE_FUNC_END; return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SemiInterpDestroy( void *interp_vdata ) { hypre_SemiInterpData *interp_data = (hypre_SemiInterpData *)interp_vdata; if (interp_data) { hypre_StructMatrixDestroy(interp_data -> P); hypre_ComputePkgDestroy(interp_data -> compute_pkg); hypre_FinalizeTiming(interp_data -> time_index); hypre_TFree(interp_data, HYPRE_MEMORY_HOST); } return hypre_error_flag; } hypre-2.33.0/src/struct_ls/semi_restrict.c000066400000000000000000000271701477326011500205740ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "_hypre_struct_ls.h" #include "_hypre_struct_mv.hpp" /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ typedef struct { hypre_StructMatrix *R; HYPRE_Int R_stored_as_transpose; hypre_ComputePkg *compute_pkg; hypre_Index cindex; hypre_Index stride; HYPRE_Int time_index; } hypre_SemiRestrictData; /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ void * hypre_SemiRestrictCreate( void ) { hypre_SemiRestrictData *restrict_data; restrict_data = hypre_CTAlloc(hypre_SemiRestrictData, 1, HYPRE_MEMORY_HOST); (restrict_data -> time_index) = hypre_InitializeTiming("SemiRestrict"); return (void *) restrict_data; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SemiRestrictSetup( void *restrict_vdata, hypre_StructMatrix *R, HYPRE_Int R_stored_as_transpose, hypre_StructVector *r, hypre_StructVector *rc, hypre_Index cindex, hypre_Index findex, hypre_Index stride ) { HYPRE_UNUSED_VAR(rc); hypre_SemiRestrictData *restrict_data = (hypre_SemiRestrictData *)restrict_vdata; hypre_StructGrid *grid; hypre_StructStencil *stencil; hypre_ComputeInfo *compute_info; hypre_ComputePkg *compute_pkg; /*---------------------------------------------------------- * Set up the compute package *----------------------------------------------------------*/ HYPRE_ANNOTATE_FUNC_BEGIN; grid = hypre_StructVectorGrid(r); stencil = hypre_StructMatrixStencil(R); hypre_CreateComputeInfo(grid, stencil, &compute_info); hypre_ComputeInfoProjectSend(compute_info, findex, stride); hypre_ComputeInfoProjectRecv(compute_info, findex, stride); hypre_ComputeInfoProjectComp(compute_info, cindex, stride); hypre_ComputePkgCreate(compute_info, hypre_StructVectorDataSpace(r), 1, grid, &compute_pkg); /*---------------------------------------------------------- * Set up the restrict data structure *----------------------------------------------------------*/ (restrict_data -> R) = hypre_StructMatrixRef(R); (restrict_data -> R_stored_as_transpose) = R_stored_as_transpose; (restrict_data -> compute_pkg) = compute_pkg; hypre_CopyIndex(cindex, (restrict_data -> cindex)); hypre_CopyIndex(stride, (restrict_data -> stride)); HYPRE_ANNOTATE_FUNC_END; return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SemiRestrict( void *restrict_vdata, hypre_StructMatrix *R, hypre_StructVector *r, hypre_StructVector *rc ) { hypre_SemiRestrictData *restrict_data = (hypre_SemiRestrictData *)restrict_vdata; HYPRE_Int R_stored_as_transpose; hypre_ComputePkg *compute_pkg; hypre_IndexRef cindex; hypre_IndexRef stride; hypre_StructGrid *fgrid; HYPRE_Int *fgrid_ids; hypre_StructGrid *cgrid; hypre_BoxArray *cgrid_boxes; HYPRE_Int *cgrid_ids; hypre_CommHandle *comm_handle; hypre_BoxArrayArray *compute_box_aa; hypre_BoxArray *compute_box_a; hypre_Box *compute_box; hypre_Box *R_dbox; hypre_Box *r_dbox; hypre_Box *rc_dbox; HYPRE_Int Ri; HYPRE_Int constant_coefficient; HYPRE_Real *Rp0, *Rp1; HYPRE_Real *rp; HYPRE_Real *rcp; hypre_Index loop_size; hypre_IndexRef start; hypre_Index startc; hypre_Index stridec; hypre_StructStencil *stencil; hypre_Index *stencil_shape; HYPRE_Int compute_i, fi, ci, j; hypre_StructVector *rc_tmp; /*----------------------------------------------------------------------- * Initialize some things. *-----------------------------------------------------------------------*/ HYPRE_ANNOTATE_FUNC_BEGIN; hypre_BeginTiming(restrict_data -> time_index); R_stored_as_transpose = (restrict_data -> R_stored_as_transpose); compute_pkg = (restrict_data -> compute_pkg); cindex = (restrict_data -> cindex); stride = (restrict_data -> stride); stencil = hypre_StructMatrixStencil(R); stencil_shape = hypre_StructStencilShape(stencil); constant_coefficient = hypre_StructMatrixConstantCoefficient(R); hypre_assert( constant_coefficient == 0 || constant_coefficient == 1 ); /* ... if A has constant_coefficient==2, R has constant_coefficient==0 */ if (constant_coefficient) { hypre_StructVectorClearBoundGhostValues(r, 0); } hypre_SetIndex3(stridec, 1, 1, 1); /*-------------------------------------------------------------------- * Restrict the residual. *--------------------------------------------------------------------*/ fgrid = hypre_StructVectorGrid(r); fgrid_ids = hypre_StructGridIDs(fgrid); cgrid = hypre_StructVectorGrid(rc); cgrid_boxes = hypre_StructGridBoxes(cgrid); cgrid_ids = hypre_StructGridIDs(cgrid); #if 0 //defined(HYPRE_USING_CUDA) || defined(HYPRE_USING_HIP) HYPRE_MemoryLocation data_location_f = hypre_StructGridDataLocation(fgrid); HYPRE_MemoryLocation data_location_c = hypre_StructGridDataLocation(cgrid); if (data_location_f != data_location_c) { rc_tmp = hypre_StructVectorCreate(hypre_MPI_COMM_WORLD, cgrid); hypre_StructVectorSetNumGhost(rc_tmp, hypre_StructVectorNumGhost(rc)); hypre_StructGridDataLocation(cgrid) = data_location_f; hypre_StructVectorInitialize(rc_tmp); hypre_StructVectorAssemble(rc_tmp); } else { rc_tmp = rc; } #else rc_tmp = rc; #endif for (compute_i = 0; compute_i < 2; compute_i++) { switch (compute_i) { case 0: { rp = hypre_StructVectorData(r); hypre_InitializeIndtComputations(compute_pkg, rp, &comm_handle); compute_box_aa = hypre_ComputePkgIndtBoxes(compute_pkg); } break; case 1: { hypre_FinalizeIndtComputations(comm_handle); compute_box_aa = hypre_ComputePkgDeptBoxes(compute_pkg); } break; } fi = 0; hypre_ForBoxI(ci, cgrid_boxes) { while (fgrid_ids[fi] != cgrid_ids[ci]) { fi++; } compute_box_a = hypre_BoxArrayArrayBoxArray(compute_box_aa, fi); R_dbox = hypre_BoxArrayBox(hypre_StructMatrixDataSpace(R), fi); r_dbox = hypre_BoxArrayBox(hypre_StructVectorDataSpace(r), fi); rc_dbox = hypre_BoxArrayBox(hypre_StructVectorDataSpace(rc), ci); // RL: PTROFFSET HYPRE_Int Rp0_offset = 0, rp0_offset, rp1_offset; if (R_stored_as_transpose) { if ( constant_coefficient ) { Rp0 = hypre_StructMatrixBoxData(R, fi, 1); Rp1 = hypre_StructMatrixBoxData(R, fi, 0); Rp0_offset = -hypre_CCBoxOffsetDistance(R_dbox, stencil_shape[1]); } else { Rp0 = hypre_StructMatrixBoxData(R, fi, 1); Rp1 = hypre_StructMatrixBoxData(R, fi, 0); Rp0_offset = -hypre_BoxOffsetDistance(R_dbox, stencil_shape[1]); } } else { Rp0 = hypre_StructMatrixBoxData(R, fi, 0); Rp1 = hypre_StructMatrixBoxData(R, fi, 1); } rp = hypre_StructVectorBoxData(r, fi); rp0_offset = hypre_BoxOffsetDistance(r_dbox, stencil_shape[0]); rp1_offset = hypre_BoxOffsetDistance(r_dbox, stencil_shape[1]); rcp = hypre_StructVectorBoxData(rc_tmp, ci); hypre_ForBoxI(j, compute_box_a) { compute_box = hypre_BoxArrayBox(compute_box_a, j); start = hypre_BoxIMin(compute_box); hypre_StructMapFineToCoarse(start, cindex, stride, startc); hypre_BoxGetStrideSize(compute_box, stride, loop_size); if ( constant_coefficient ) { HYPRE_Complex Rp0val, Rp1val; Ri = hypre_CCBoxIndexRank( R_dbox, startc ); Rp0val = Rp0[Ri + Rp0_offset]; Rp1val = Rp1[Ri]; #define DEVICE_VAR is_device_ptr(rcp,rp) hypre_BoxLoop2Begin(hypre_StructMatrixNDim(R), loop_size, r_dbox, start, stride, ri, rc_dbox, startc, stridec, rci); { rcp[rci] = rp[ri] + (Rp0val * rp[ri + rp0_offset] + Rp1val * rp[ri + rp1_offset]); } hypre_BoxLoop2End(ri, rci); #undef DEVICE_VAR } else { #define DEVICE_VAR is_device_ptr(rcp,rp,Rp0,Rp1) hypre_BoxLoop3Begin(hypre_StructMatrixNDim(R), loop_size, R_dbox, startc, stridec, Ri, r_dbox, start, stride, ri, rc_dbox, startc, stridec, rci); { rcp[rci] = rp[ri] + (Rp0[Ri + Rp0_offset] * rp[ri + rp0_offset] + Rp1[Ri] * rp[ri + rp1_offset]); } hypre_BoxLoop3End(Ri, ri, rci); #undef DEVICE_VAR } } } } #if 0 //defined(HYPRE_USING_CUDA) || defined(HYPRE_USING_HIP) if (data_location_f != data_location_c) { hypre_TMemcpy(hypre_StructVectorData(rc), hypre_StructVectorData(rc_tmp), HYPRE_Complex, hypre_StructVectorDataSize(rc_tmp), HYPRE_MEMORY_HOST, HYPRE_MEMORY_DEVICE); hypre_StructVectorDestroy(rc_tmp); hypre_StructGridDataLocation(cgrid) = data_location_c; } #endif /*----------------------------------------------------------------------- * Return *-----------------------------------------------------------------------*/ hypre_IncFLOPCount(4 * hypre_StructVectorGlobalSize(rc)); hypre_EndTiming(restrict_data -> time_index); HYPRE_ANNOTATE_FUNC_END; return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SemiRestrictDestroy( void *restrict_vdata ) { hypre_SemiRestrictData *restrict_data = (hypre_SemiRestrictData *)restrict_vdata; if (restrict_data) { hypre_StructMatrixDestroy(restrict_data -> R); hypre_ComputePkgDestroy(restrict_data -> compute_pkg); hypre_FinalizeTiming(restrict_data -> time_index); hypre_TFree(restrict_data, HYPRE_MEMORY_HOST); } return hypre_error_flag; } hypre-2.33.0/src/struct_ls/semi_setup_rap.c000066400000000000000000001050041477326011500207300ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "_hypre_struct_ls.h" #include "_hypre_struct_mv.hpp" #include "pfmg.h" #define hypre_MapRAPMarker(indexRAP, rank) \ { \ HYPRE_Int imacro,jmacro,kmacro; \ imacro = hypre_IndexX(indexRAP); \ jmacro = hypre_IndexY(indexRAP); \ kmacro = hypre_IndexZ(indexRAP); \ if (imacro==-1) imacro=2; \ if (jmacro==-1) jmacro=2; \ if (kmacro==-1) kmacro=2; \ rank = imacro + 3*jmacro + 9*kmacro; \ } #define hypre_InverseMapRAPMarker(rank, indexRAP) \ { \ HYPRE_Int imacro,ijmacro,jmacro,kmacro; \ ijmacro = (rank%9); \ imacro = (ijmacro%3); \ jmacro = (ijmacro-imacro)/3; \ kmacro = (rank-3*jmacro-imacro)/9; \ if (imacro==2) imacro=-1; \ if (jmacro==2) jmacro=-1; \ if (kmacro==2) kmacro=-1; \ hypre_SetIndex3(indexRAP,imacro,jmacro,kmacro); \ } /*-------------------------------------------------------------------------- * Sets up new coarse grid operator stucture. *--------------------------------------------------------------------------*/ hypre_StructMatrix * hypre_SemiCreateRAPOp( hypre_StructMatrix *R, hypre_StructMatrix *A, hypre_StructMatrix *P, hypre_StructGrid *coarse_grid, HYPRE_Int cdir, HYPRE_Int P_stored_as_transpose ) { HYPRE_UNUSED_VAR(R); HYPRE_UNUSED_VAR(P); HYPRE_UNUSED_VAR(P_stored_as_transpose); hypre_StructMatrix *RAP; hypre_Index *RAP_stencil_shape; hypre_StructStencil *RAP_stencil; HYPRE_Int RAP_stencil_size; HYPRE_Int dim; HYPRE_Int RAP_num_ghost[] = {1, 1, 1, 1, 1, 1}; HYPRE_Int *not_cdirs = NULL; hypre_StructStencil *A_stencil; HYPRE_Int A_stencil_size; hypre_Index *A_stencil_shape; hypre_Index indexR; hypre_Index indexRA; hypre_Index indexRAP; HYPRE_Int Rloop, Aloop; HYPRE_Int j, i; HYPRE_Int d; HYPRE_Int stencil_rank; HYPRE_Int *RAP_marker; HYPRE_Int RAP_marker_size; HYPRE_Int RAP_marker_rank; A_stencil = hypre_StructMatrixStencil(A); dim = hypre_StructStencilNDim(A_stencil); A_stencil_size = hypre_StructStencilSize(A_stencil); A_stencil_shape = hypre_StructStencilShape(A_stencil); /*----------------------------------------------------------------------- * Allocate RAP_marker array used to deternine which offsets are * present in RAP. Initialized to zero indicating no offsets present. *-----------------------------------------------------------------------*/ RAP_marker_size = 1; for (i = 0; i < dim; i++) { RAP_marker_size *= 3; } RAP_marker = hypre_CTAlloc(HYPRE_Int, RAP_marker_size, HYPRE_MEMORY_HOST); /*----------------------------------------------------------------------- * Define RAP_stencil *-----------------------------------------------------------------------*/ hypre_SetIndex(indexR, 0); hypre_SetIndex(indexRA, 0); hypre_SetIndex(indexRAP, 0); stencil_rank = 0; /*----------------------------------------------------------------------- * Calculate RAP stencil by symbolic computation of triple matrix * product RAP. We keep track of index to update RAP_marker. *-----------------------------------------------------------------------*/ for (Rloop = -1; Rloop < 2; Rloop++) { hypre_IndexD(indexR, cdir) = Rloop; for (Aloop = 0; Aloop < A_stencil_size; Aloop++) { for (d = 0; d < dim; d++) { hypre_IndexD(indexRA, d) = hypre_IndexD(indexR, d) + hypre_IndexD(A_stencil_shape[Aloop], d); } /*----------------------------------------------------------------- * If RA part of the path lands on C point, then P part of path * stays at the C point. Divide by 2 to yield to coarse index. *-----------------------------------------------------------------*/ if ((hypre_IndexD(indexRA, cdir) % 2) == 0) { hypre_CopyIndex(indexRA, indexRAP); hypre_IndexD(indexRAP, cdir) /= 2; hypre_MapRAPMarker(indexRAP, RAP_marker_rank); RAP_marker[RAP_marker_rank]++; } /*----------------------------------------------------------------- * If RA part of the path lands on F point, then P part of path * move +1 and -1 in cdir. Divide by 2 to yield to coarse index. *-----------------------------------------------------------------*/ else { hypre_CopyIndex(indexRA, indexRAP); hypre_IndexD(indexRAP, cdir) += 1; hypre_IndexD(indexRAP, cdir) /= 2; hypre_MapRAPMarker(indexRAP, RAP_marker_rank); RAP_marker[RAP_marker_rank]++; hypre_CopyIndex(indexRA, indexRAP); hypre_IndexD(indexRAP, cdir) -= 1; hypre_IndexD(indexRAP, cdir) /= 2; hypre_MapRAPMarker(indexRAP, RAP_marker_rank); RAP_marker[RAP_marker_rank]++; } } } /*----------------------------------------------------------------------- * For symmetric A, we zero out some entries of RAP_marker to yield * the stencil with the proper stored entries. * The set S of stored off diagonal entries are such that paths in * RAP resulting in a contribution to a entry of S arise only from * diagonal entries of A or entries contined in S. * * In 1d * ===== * cdir = 0 * (i) in S if * i<0. * * In 2d * ===== * cdir = 1 cdir = 0 * (i,j) in S if (i,j) in S if * i<0, j<0, * or i=0 & j<0. or j=0 & i<0. * * In 3d * ===== * cdir = 2 cdir = 1 cdir = 0 * (i,j,k) in S if (i,j,k) in S if (i,j,k) in S if * i<0, k<0, j<0, * or i=0 & j<0, or k=0 & i<0, j=0 & k<0, * or i=j=0 & k<0. or k=i=0 & j<0. j=k=0 & i<0. *-----------------------------------------------------------------------*/ if (hypre_StructMatrixSymmetric(A)) { if (dim > 1) { not_cdirs = hypre_CTAlloc(HYPRE_Int, dim - 1, HYPRE_MEMORY_HOST); } for (d = 1; d < dim; d++) { not_cdirs[d - 1] = (dim + cdir - d) % dim; } hypre_SetIndex(indexRAP, 0); hypre_IndexD(indexRAP, cdir) = 1; hypre_MapRAPMarker(indexRAP, RAP_marker_rank); RAP_marker[RAP_marker_rank] = 0; if (dim > 1) { hypre_SetIndex(indexRAP, 0); hypre_IndexD(indexRAP, not_cdirs[0]) = 1; for (i = -1; i < 2; i++) { hypre_IndexD(indexRAP, cdir) = i; hypre_MapRAPMarker(indexRAP, RAP_marker_rank); RAP_marker[RAP_marker_rank] = 0; } } if (dim > 2) { hypre_SetIndex(indexRAP, 0); hypre_IndexD(indexRAP, not_cdirs[1]) = 1; for (i = -1; i < 2; i++) { hypre_IndexD(indexRAP, not_cdirs[0]) = i; for (j = -1; j < 2; j++) { hypre_IndexD(indexRAP, cdir) = j; hypre_MapRAPMarker(indexRAP, RAP_marker_rank); RAP_marker[RAP_marker_rank] = 0; } } } if (dim > 1) { hypre_TFree(not_cdirs, HYPRE_MEMORY_HOST); } } RAP_stencil_size = 0; for (i = 0; i < RAP_marker_size; i++) { if ( RAP_marker[i] != 0 ) { RAP_stencil_size++; } } RAP_stencil_shape = hypre_CTAlloc(hypre_Index, RAP_stencil_size, HYPRE_MEMORY_HOST); stencil_rank = 0; for (i = 0; i < RAP_marker_size; i++) { if ( RAP_marker[i] != 0 ) { hypre_InverseMapRAPMarker(i, RAP_stencil_shape[stencil_rank]); stencil_rank++; } } RAP_stencil = hypre_StructStencilCreate(dim, RAP_stencil_size, RAP_stencil_shape); RAP = hypre_StructMatrixCreate(hypre_StructMatrixComm(A), coarse_grid, RAP_stencil); hypre_StructStencilDestroy(RAP_stencil); /*----------------------------------------------------------------------- * Coarse operator in symmetric iff fine operator is *-----------------------------------------------------------------------*/ hypre_StructMatrixSymmetric(RAP) = hypre_StructMatrixSymmetric(A); /*----------------------------------------------------------------------- * Set number of ghost points - one one each boundary *-----------------------------------------------------------------------*/ hypre_StructMatrixSetNumGhost(RAP, RAP_num_ghost); hypre_TFree(RAP_marker, HYPRE_MEMORY_HOST); return RAP; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SemiBuildRAP( hypre_StructMatrix *A, hypre_StructMatrix *P, hypre_StructMatrix *R, HYPRE_Int cdir, hypre_Index cindex, hypre_Index cstride, HYPRE_Int P_stored_as_transpose, hypre_StructMatrix *RAP ) { hypre_Index index; hypre_StructStencil *coarse_stencil; HYPRE_Int coarse_stencil_size; hypre_Index *coarse_stencil_shape; HYPRE_Int *coarse_symm_elements; hypre_StructGrid *fgrid; HYPRE_Int *fgrid_ids; hypre_StructGrid *cgrid; hypre_BoxArray *cgrid_boxes; HYPRE_Int *cgrid_ids; hypre_Box *cgrid_box; hypre_IndexRef cstart; hypre_Index stridec; hypre_Index fstart; hypre_IndexRef stridef; hypre_Index loop_size; HYPRE_Int fi, ci; hypre_Box *A_dbox; hypre_Box *P_dbox; hypre_Box *R_dbox; hypre_Box *RAP_dbox; HYPRE_Real *pa, *pb; HYPRE_Real *ra, *rb; HYPRE_Real *a_ptr; HYPRE_Real *rap_ptrS, *rap_ptrU, *rap_ptrD; HYPRE_Int symm_path_multiplier; HYPRE_Int COffsetA; HYPRE_Int COffsetP; HYPRE_Int AOffsetP; HYPRE_Int RAPloop; HYPRE_Int diag; HYPRE_Int dim; HYPRE_Int d; HYPRE_Real zero = 0.0; coarse_stencil = hypre_StructMatrixStencil(RAP); coarse_stencil_size = hypre_StructStencilSize(coarse_stencil); coarse_symm_elements = hypre_StructMatrixSymmElements(RAP); coarse_stencil_shape = hypre_StructStencilShape(coarse_stencil); dim = hypre_StructStencilNDim(coarse_stencil); stridef = cstride; hypre_SetIndex3(stridec, 1, 1, 1); fgrid = hypre_StructMatrixGrid(A); fgrid_ids = hypre_StructGridIDs(fgrid); cgrid = hypre_StructMatrixGrid(RAP); cgrid_boxes = hypre_StructGridBoxes(cgrid); cgrid_ids = hypre_StructGridIDs(cgrid); /*----------------------------------------------------------------- * Loop over boxes to compute entries of RAP *-----------------------------------------------------------------*/ fi = 0; hypre_ForBoxI(ci, cgrid_boxes) { while (fgrid_ids[fi] != cgrid_ids[ci]) { fi++; } cgrid_box = hypre_BoxArrayBox(cgrid_boxes, ci); cstart = hypre_BoxIMin(cgrid_box); hypre_StructMapCoarseToFine(cstart, cindex, cstride, fstart); hypre_BoxGetSize(cgrid_box, loop_size); A_dbox = hypre_BoxArrayBox(hypre_StructMatrixDataSpace(A), fi); P_dbox = hypre_BoxArrayBox(hypre_StructMatrixDataSpace(P), fi); R_dbox = hypre_BoxArrayBox(hypre_StructMatrixDataSpace(R), fi); RAP_dbox = hypre_BoxArrayBox(hypre_StructMatrixDataSpace(RAP), ci); /*----------------------------------------------------------------- * Extract pointers for interpolation operator: * pa is pointer for weight for f-point above c-point * pb is pointer for weight for f-point below c-point * * pa "down" pb "up" * * C * * | * v * * F F * * ^ * | * * C * *-----------------------------------------------------------------*/ hypre_SetIndex(index, 0); //RL:PTROFFSET HYPRE_Int pb_offset = 0; if (P_stored_as_transpose) { hypre_IndexD(index, cdir) = 1; pa = hypre_StructMatrixExtractPointerByIndex(P, fi, index); hypre_IndexD(index, cdir) = -1; pb = hypre_StructMatrixExtractPointerByIndex(P, fi, index); } else { hypre_IndexD(index, cdir) = -1; pa = hypre_StructMatrixExtractPointerByIndex(P, fi, index); hypre_IndexD(index, cdir) = 1; pb = hypre_StructMatrixExtractPointerByIndex(P, fi, index); pb_offset = -hypre_BoxOffsetDistance(P_dbox, index); } /*----------------------------------------------------------------- * Extract pointers for restriction operator: * ra is pointer for weight for f-point above c-point * rb is pointer for weight for f-point below c-point * * rb "down" ra "up" * * F * * | * v * * C C * * ^ * | * * F * *-----------------------------------------------------------------*/ hypre_SetIndex(index, 0); HYPRE_Int rb_offset = 0; if (P_stored_as_transpose) { hypre_IndexD(index, cdir) = 1; ra = hypre_StructMatrixExtractPointerByIndex(R, fi, index); hypre_IndexD(index, cdir) = -1; rb = hypre_StructMatrixExtractPointerByIndex(R, fi, index); } else { hypre_IndexD(index, cdir) = -1; ra = hypre_StructMatrixExtractPointerByIndex(R, fi, index); hypre_IndexD(index, cdir) = 1; rb = hypre_StructMatrixExtractPointerByIndex(R, fi, index); rb_offset = -hypre_BoxOffsetDistance(P_dbox, index); } /*----------------------------------------------------------------- * Define offsets for fine grid stencil and interpolation * * In the BoxLoops below I assume iA and iP refer to data associated * with the point which we are building the stencil for. The below * Offsets (and those defined later in the switch statement) are * used in refering to data associated with other points. *-----------------------------------------------------------------*/ hypre_SetIndex(index, 0); hypre_IndexD(index, cdir) = 1; COffsetA = hypre_BoxOffsetDistance(A_dbox, index); COffsetP = hypre_BoxOffsetDistance(P_dbox, index); /*----------------------------------------------------------------- * Entries in RAP are calculated by accumulation, must first * zero out entries. *-----------------------------------------------------------------*/ for (RAPloop = 0; RAPloop < coarse_stencil_size; RAPloop++) { if (coarse_symm_elements[RAPloop] == -1) { rap_ptrS = hypre_StructMatrixBoxData(RAP, ci, RAPloop); #define DEVICE_VAR is_device_ptr(rap_ptrS) hypre_BoxLoop1Begin(hypre_StructMatrixNDim(A), loop_size, RAP_dbox, cstart, stridec, iAc); { rap_ptrS[iAc] = zero; } hypre_BoxLoop1End(iAc); #undef DEVICE_VAR } } /*----------------------------------------------------------------- * Computational loop. Written as a loop over stored entries of * RAP. We then get the pointer (a_ptr) for the same index in A. * If it exists, we then calculate all RAP paths involving this * entry of A. *-----------------------------------------------------------------*/ for (RAPloop = 0; RAPloop < coarse_stencil_size; RAPloop++) { if (coarse_symm_elements[RAPloop] == -1) { /*------------------------------------------------------------- * Get pointer for A that corresponds to the current RAP index. * If pointer is non-null, i.e. there is a corresponding entry * in A, compute paths. *-------------------------------------------------------------*/ hypre_CopyIndex(coarse_stencil_shape[RAPloop], index); a_ptr = hypre_StructMatrixExtractPointerByIndex(A, fi, index); if (a_ptr != NULL) { switch (hypre_IndexD(index, cdir)) { /*----------------------------------------------------- * If A stencil index is 0 in coarsened direction, need * to calculate (r,p) pairs (stay,stay) (up,up) (up,down) * (down,up) and (down,down). Paths 1,3 & 4 {(s,s),(u,d), * (d,u)} yield contributions to RAP with the same stencil * index as A. Path 2 (u,u) contributes to RAP with * index +1 in coarsened direction. Path 5 (d,d) * contributes to RAP with index -1 in coarsened * direction. *-----------------------------------------------------*/ case 0: hypre_IndexD(index, cdir) = 1; rap_ptrU = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_IndexD(index, cdir) = -1; rap_ptrD = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_IndexD(index, cdir) = 0; AOffsetP = hypre_BoxOffsetDistance(P_dbox, index); rap_ptrS = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); diag = 0; for (d = 0; d < dim; d++) { diag += hypre_IndexD(index, d) * hypre_IndexD(index, d); } if (diag == 0 && hypre_StructMatrixSymmetric(RAP)) { /*-------------------------------------------------- * If A stencil index is (0,0,0) and RAP is symmetric, * must not calculate (up,up) path. It's symmetric * to the (down,down) path and calculating both paths * incorrectly doubles the contribution. Additionally * the (up,up) path contributes to a non-stored entry * in RAP. *--------------------------------------------------*/ #define DEVICE_VAR is_device_ptr(rap_ptrS,a_ptr,ra,pa,rb,pb,rap_ptrD) hypre_BoxLoop4Begin(hypre_StructMatrixNDim(A), loop_size, P_dbox, cstart, stridec, iP, R_dbox, cstart, stridec, iR, A_dbox, fstart, stridef, iA, RAP_dbox, cstart, stridec, iAc); { HYPRE_Int iAp, iPp; /* path 1 : (stay,stay) */ rap_ptrS[iAc] += a_ptr[iA] ; /* path 2 : (up,up) */ /* path 3 : (up,down) */ iAp = iA + COffsetA; iPp = iP + AOffsetP; rap_ptrS[iAc] += ra[iR] * a_ptr[iAp] * pa[iPp]; /* path 4 : (down,up) */ iAp = iA - COffsetA; rap_ptrS[iAc] += rb[iR + rb_offset] * a_ptr[iAp] * pb[iPp + pb_offset]; /* path 5 : (down,down) */ iPp = iP - COffsetP + AOffsetP; rap_ptrD[iAc] += rb[iR + rb_offset] * a_ptr[iAp] * pa[iPp]; } hypre_BoxLoop4End(iP, iR, iA, iAc); #undef DEVICE_VAR } else { /*-------------------------------------------------- * If A stencil index is not (0,0,0) or RAP is * nonsymmetric, all 5 paths are calculated. *--------------------------------------------------*/ #define DEVICE_VAR is_device_ptr(rap_ptrS,a_ptr,rap_ptrU,ra,pb,pa,rb,rap_ptrD) hypre_BoxLoop4Begin(hypre_StructMatrixNDim(A), loop_size, P_dbox, cstart, stridec, iP, R_dbox, cstart, stridec, iR, A_dbox, fstart, stridef, iA, RAP_dbox, cstart, stridec, iAc); { HYPRE_Int iAp, iPp; /* path 1 : (stay,stay) */ rap_ptrS[iAc] += a_ptr[iA] ; /* path 2 : (up,up) */ iAp = iA + COffsetA; iPp = iP + COffsetP + AOffsetP; rap_ptrU[iAc] += ra[iR] * a_ptr[iAp] * pb[iPp + pb_offset]; /* path 3 : (up,down) */ iPp = iP + AOffsetP; rap_ptrS[iAc] += ra[iR] * a_ptr[iAp] * pa[iPp]; /* path 4 : (down,up) */ iAp = iA - COffsetA; rap_ptrS[iAc] += rb[iR + rb_offset] * a_ptr[iAp] * pb[iPp + pb_offset]; /* path 5 : (down,down) */ iPp = iP - COffsetP + AOffsetP; rap_ptrD[iAc] += rb[iR + rb_offset] * a_ptr[iAp] * pa[iPp]; } hypre_BoxLoop4End(iP, iR, iA, iAc); #undef DEVICE_VAR } break; /*----------------------------------------------------- * If A stencil index is -1 in coarsened direction, need * to calculate (r,p) pairs (stay,up) (stay,down) (up,stay) * and (down,stay). Paths 2 & 4 {(s,d),(d,s)} contribute * to RAP with same stencil index as A. Paths 1 & 3 * {(s,u),(u,s)} contribute to RAP with index 0 in * coarsened direction. *-----------------------------------------------------*/ case -1: rap_ptrD = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_IndexD(index, cdir) = 0; AOffsetP = hypre_BoxOffsetDistance(P_dbox, index); rap_ptrS = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); /*-------------------------------------------------- * If A stencil index is zero except in coarsened * dirction and RAP is symmetric, must calculate * symmetric paths for (stay,up) and (up,stay). * These contribute to the diagonal entry of RAP. * These additional paths have the same numerical * contribution as the calculated path. We multiply * by two to account for them. *--------------------------------------------------*/ symm_path_multiplier = 1; diag = 0; for (d = 0; d < dim; d++) { diag += hypre_IndexD(index, d) * hypre_IndexD(index, d); } if (diag == 0 && hypre_StructMatrixSymmetric(RAP)) { symm_path_multiplier = 2; } #define DEVICE_VAR is_device_ptr(rap_ptrS,a_ptr,pb,rap_ptrD,pa,ra,rb) hypre_BoxLoop4Begin(hypre_StructMatrixNDim(A), loop_size, P_dbox, cstart, stridec, iP, R_dbox, cstart, stridec, iR, A_dbox, fstart, stridef, iA, RAP_dbox, cstart, stridec, iAc); { HYPRE_Int iAp, iPp; /* Path 1 : (stay,up) & symmetric path */ iPp = iP + AOffsetP; rap_ptrS[iAc] += symm_path_multiplier * (a_ptr[iA] * pb[iPp + pb_offset]); /* Path 2 : (stay,down) */ iPp = iP - COffsetP + AOffsetP; rap_ptrD[iAc] += a_ptr[iA] * pa[iPp]; /* Path 3 : (up,stay) */ iAp = iA + COffsetA; rap_ptrS[iAc] += symm_path_multiplier * (ra[iR] * a_ptr[iAp] ); /* Path 4 : (down,stay) */ iAp = iA - COffsetA; rap_ptrD[iAc] += rb[iR + rb_offset] * a_ptr[iAp] ; } hypre_BoxLoop4End(iP, iR, iA, iAc); #undef DEVICE_VAR break; /*----------------------------------------------------- * If A stencil index is +1 in coarsened direction, need * to calculate (r,p) pairs (stay,up) (stay,down) (up,stay) * and (down,stay). Paths 1 & 3 {(s,u),(u,s)} contribute * to RAP with same stencil index as A. Paths 2 & 4 * {(s,d),(d,s)} contribute to RAP with index 0 in * coarsened direction. *-----------------------------------------------------*/ case 1: rap_ptrU = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_IndexD(index, cdir) = 0; AOffsetP = hypre_BoxOffsetDistance(P_dbox, index); rap_ptrS = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); /*-------------------------------------------------- * If A stencil index is zero except in coarsened * dirction and RAP is symmetric, must calculate * symmetric paths for (stay,down) and (down,stay). * These contribute to the diagonal entry of RAP. * These additional paths have the same numerical * contribution as the calculated path. We multiply * by two to account for them. *--------------------------------------------------*/ symm_path_multiplier = 1; diag = 0; for (d = 0; d < dim; d++) { diag += hypre_IndexD(index, d) * hypre_IndexD(index, d); } if (diag == 0 && hypre_StructMatrixSymmetric(RAP)) { symm_path_multiplier = 2; } #define DEVICE_VAR is_device_ptr(rap_ptrU,a_ptr,pb,rap_ptrS,pa,ra,rb) hypre_BoxLoop4Begin(hypre_StructMatrixNDim(A), loop_size, P_dbox, cstart, stridec, iP, R_dbox, cstart, stridec, iR, A_dbox, fstart, stridef, iA, RAP_dbox, cstart, stridec, iAc); { HYPRE_Int iAp, iPp; /* Path 1 : (stay,up) */ iPp = iP + COffsetP + AOffsetP; rap_ptrU[iAc] += a_ptr[iA] * pb[iPp + pb_offset]; /* Path 2 : (stay,down) */ iPp = iP + AOffsetP; rap_ptrS[iAc] += symm_path_multiplier * (a_ptr[iA] * pa[iPp]); /* Path 3 : (up,stay) */ iAp = iA + COffsetA; rap_ptrU[iAc] += ra[iR] * a_ptr[iAp] ; /* Path 4 : (down,stay) */ iAp = iA - COffsetA; rap_ptrS[iAc] += symm_path_multiplier * (rb[iR + rb_offset] * a_ptr[iAp] ); } hypre_BoxLoop4End(iP, iR, iA, iAc); #undef DEVICE_VAR break; } /* end of switch */ } /* end of if a_ptr != NULL */ } /* end if coarse_symm_element == -1 */ } /* end of RAPloop */ } /* end ForBoxI */ /*----------------------------------------------------------------- * Loop over boxes to collapse entries of RAP when period = 1 in * the coarsened direction. *-----------------------------------------------------------------*/ if (hypre_IndexD(hypre_StructGridPeriodic(cgrid), cdir) == 1) { hypre_ForBoxI(ci, cgrid_boxes) { cgrid_box = hypre_BoxArrayBox(cgrid_boxes, ci); cstart = hypre_BoxIMin(cgrid_box); hypre_BoxGetSize(cgrid_box, loop_size); RAP_dbox = hypre_BoxArrayBox(hypre_StructMatrixDataSpace(RAP), ci); /*-------------------------------------------------------------- * Computational loop. A loop over stored entries of RAP. *-------------------------------------------------------------*/ for (RAPloop = 0; RAPloop < coarse_stencil_size; RAPloop++) { if (coarse_symm_elements[RAPloop] == -1) { hypre_CopyIndex(coarse_stencil_shape[RAPloop], index); switch (hypre_IndexD(index, cdir)) { /*----------------------------------------------------- * If RAP stencil index is 0 in coarsened direction, * leave entry unchanged. *-----------------------------------------------------*/ case 0: break; /*----------------------------------------------------- * If RAP stencil index is +/-1 in coarsened direction, * to add entry to cooresponding entry with 0 in the * coarsened direction. Also zero out current index. *-----------------------------------------------------*/ default: /*--------------------------------------------------------- * Get pointer to the current RAP index (rap_ptrD) * and cooresponding index with 0 in the coarsened * direction (rap_ptrS). *---------------------------------------------------------*/ rap_ptrD = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_IndexD(index, cdir) = 0; rap_ptrS = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); /*-------------------------------------------------- * If RAP stencil index is zero except in coarsened * direction and RAP is symmetric, must * HYPRE_Real entry when modifying the diagonal. *--------------------------------------------------*/ symm_path_multiplier = 1; diag = 0; for (d = 0; d < dim; d++) { diag += hypre_IndexD(index, d) * hypre_IndexD(index, d); } if (diag == 0 && hypre_StructMatrixSymmetric(RAP)) { symm_path_multiplier = 2; } #define DEVICE_VAR is_device_ptr(rap_ptrS,rap_ptrD) hypre_BoxLoop1Begin(hypre_StructMatrixNDim(A), loop_size, RAP_dbox, cstart, stridec, iAc); { rap_ptrS[iAc] += symm_path_multiplier * (rap_ptrD[iAc]); rap_ptrD[iAc] = zero; } hypre_BoxLoop1End(iAc); #undef DEVICE_VAR break; } /* end of switch */ } /* end if coarse_symm_element == -1 */ } /* end of RAPloop */ } /* end ForBoxI */ } /* if periodic */ return hypre_error_flag; } hypre-2.33.0/src/struct_ls/smg.c000066400000000000000000000363541477326011500165120ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "_hypre_struct_ls.h" #include "_hypre_struct_mv.hpp" #include "smg.h" /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ void * hypre_SMGCreate( MPI_Comm comm ) { hypre_SMGData *smg_data; smg_data = hypre_CTAlloc(hypre_SMGData, 1, HYPRE_MEMORY_HOST); (smg_data -> comm) = comm; (smg_data -> time_index) = hypre_InitializeTiming("SMG"); /* set defaults */ (smg_data -> memory_use) = 0; (smg_data -> tol) = 1.0e-06; (smg_data -> max_iter) = 200; (smg_data -> rel_change) = 0; (smg_data -> zero_guess) = 0; (smg_data -> max_levels) = 0; (smg_data -> num_pre_relax) = 1; (smg_data -> num_post_relax) = 1; (smg_data -> cdir) = 2; hypre_SetIndex3((smg_data -> base_index), 0, 0, 0); hypre_SetIndex3((smg_data -> base_stride), 1, 1, 1); (smg_data -> logging) = 0; (smg_data -> print_level) = 0; (smg_data -> memory_location) = hypre_HandleMemoryLocation(hypre_handle()); /* initialize */ (smg_data -> num_levels) = -1; return (void *) smg_data; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SMGDestroy( void *smg_vdata ) { hypre_SMGData *smg_data = (hypre_SMGData *)smg_vdata; HYPRE_Int l; HYPRE_ANNOTATE_FUNC_BEGIN; if (smg_data) { if ((smg_data -> logging) > 0) { hypre_TFree(smg_data -> norms, HYPRE_MEMORY_HOST); hypre_TFree(smg_data -> rel_norms, HYPRE_MEMORY_HOST); } HYPRE_MemoryLocation memory_location = smg_data -> memory_location; if ((smg_data -> num_levels) > -1) { for (l = 0; l < ((smg_data -> num_levels) - 1); l++) { hypre_SMGRelaxDestroy(smg_data -> relax_data_l[l]); hypre_SMGResidualDestroy(smg_data -> residual_data_l[l]); hypre_SemiRestrictDestroy(smg_data -> restrict_data_l[l]); hypre_SemiInterpDestroy(smg_data -> interp_data_l[l]); } hypre_SMGRelaxDestroy(smg_data -> relax_data_l[l]); if (l == 0) { hypre_SMGResidualDestroy(smg_data -> residual_data_l[l]); } hypre_TFree(smg_data -> relax_data_l, HYPRE_MEMORY_HOST); hypre_TFree(smg_data -> residual_data_l, HYPRE_MEMORY_HOST); hypre_TFree(smg_data -> restrict_data_l, HYPRE_MEMORY_HOST); hypre_TFree(smg_data -> interp_data_l, HYPRE_MEMORY_HOST); hypre_StructVectorDestroy(smg_data -> tb_l[0]); hypre_StructVectorDestroy(smg_data -> tx_l[0]); hypre_StructGridDestroy(smg_data -> grid_l[0]); hypre_StructMatrixDestroy(smg_data -> A_l[0]); hypre_StructVectorDestroy(smg_data -> b_l[0]); hypre_StructVectorDestroy(smg_data -> x_l[0]); for (l = 0; l < ((smg_data -> num_levels) - 1); l++) { hypre_StructGridDestroy(smg_data -> grid_l[l + 1]); hypre_StructGridDestroy(smg_data -> PT_grid_l[l + 1]); hypre_StructMatrixDestroy(smg_data -> A_l[l + 1]); if (smg_data -> PT_l[l] == smg_data -> R_l[l]) { hypre_StructMatrixDestroy(smg_data -> PT_l[l]); } else { hypre_StructMatrixDestroy(smg_data -> PT_l[l]); hypre_StructMatrixDestroy(smg_data -> R_l[l]); } hypre_StructVectorDestroy(smg_data -> b_l[l + 1]); hypre_StructVectorDestroy(smg_data -> x_l[l + 1]); hypre_StructVectorDestroy(smg_data -> tb_l[l + 1]); hypre_StructVectorDestroy(smg_data -> tx_l[l + 1]); } hypre_TFree(smg_data -> data, memory_location); hypre_TFree(smg_data -> grid_l, HYPRE_MEMORY_HOST); hypre_TFree(smg_data -> PT_grid_l, HYPRE_MEMORY_HOST); hypre_TFree(smg_data -> A_l, HYPRE_MEMORY_HOST); hypre_TFree(smg_data -> PT_l, HYPRE_MEMORY_HOST); hypre_TFree(smg_data -> R_l, HYPRE_MEMORY_HOST); hypre_TFree(smg_data -> b_l, HYPRE_MEMORY_HOST); hypre_TFree(smg_data -> x_l, HYPRE_MEMORY_HOST); hypre_TFree(smg_data -> tb_l, HYPRE_MEMORY_HOST); hypre_TFree(smg_data -> tx_l, HYPRE_MEMORY_HOST); } hypre_FinalizeTiming(smg_data -> time_index); hypre_TFree(smg_data, HYPRE_MEMORY_HOST); } HYPRE_ANNOTATE_FUNC_END; return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SMGSetMemoryUse( void *smg_vdata, HYPRE_Int memory_use ) { hypre_SMGData *smg_data = (hypre_SMGData *)smg_vdata; (smg_data -> memory_use) = memory_use; return hypre_error_flag; } HYPRE_Int hypre_SMGGetMemoryUse( void *smg_vdata, HYPRE_Int * memory_use ) { hypre_SMGData *smg_data = (hypre_SMGData *)smg_vdata; *memory_use = (smg_data -> memory_use); return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SMGSetTol( void *smg_vdata, HYPRE_Real tol ) { hypre_SMGData *smg_data = (hypre_SMGData *)smg_vdata; (smg_data -> tol) = tol; return hypre_error_flag; } HYPRE_Int hypre_SMGGetTol( void *smg_vdata, HYPRE_Real *tol ) { hypre_SMGData *smg_data = (hypre_SMGData *)smg_vdata; *tol = (smg_data -> tol); return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SMGSetMaxIter( void *smg_vdata, HYPRE_Int max_iter ) { hypre_SMGData *smg_data = (hypre_SMGData *)smg_vdata; (smg_data -> max_iter) = max_iter; return hypre_error_flag; } HYPRE_Int hypre_SMGGetMaxIter( void *smg_vdata, HYPRE_Int * max_iter ) { hypre_SMGData *smg_data = (hypre_SMGData *)smg_vdata; *max_iter = (smg_data -> max_iter); return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SMGSetRelChange( void *smg_vdata, HYPRE_Int rel_change ) { hypre_SMGData *smg_data = (hypre_SMGData *)smg_vdata; (smg_data -> rel_change) = rel_change; return hypre_error_flag; } HYPRE_Int hypre_SMGGetRelChange( void *smg_vdata, HYPRE_Int * rel_change ) { hypre_SMGData *smg_data = (hypre_SMGData *)smg_vdata; *rel_change = (smg_data -> rel_change); return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SMGSetZeroGuess( void *smg_vdata, HYPRE_Int zero_guess ) { hypre_SMGData *smg_data = (hypre_SMGData *)smg_vdata; (smg_data -> zero_guess) = zero_guess; return hypre_error_flag; } HYPRE_Int hypre_SMGGetZeroGuess( void *smg_vdata, HYPRE_Int * zero_guess ) { hypre_SMGData *smg_data = (hypre_SMGData *)smg_vdata; *zero_guess = (smg_data -> zero_guess); return hypre_error_flag; } /*-------------------------------------------------------------------------- * Note that we require at least 1 pre-relax sweep. *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SMGSetNumPreRelax( void *smg_vdata, HYPRE_Int num_pre_relax ) { hypre_SMGData *smg_data = (hypre_SMGData *)smg_vdata; (smg_data -> num_pre_relax) = hypre_max(num_pre_relax, 1); return hypre_error_flag; } HYPRE_Int hypre_SMGGetNumPreRelax( void *smg_vdata, HYPRE_Int * num_pre_relax ) { hypre_SMGData *smg_data = (hypre_SMGData *)smg_vdata; *num_pre_relax = (smg_data -> num_pre_relax); return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SMGSetNumPostRelax( void *smg_vdata, HYPRE_Int num_post_relax ) { hypre_SMGData *smg_data = (hypre_SMGData *)smg_vdata; (smg_data -> num_post_relax) = num_post_relax; return hypre_error_flag; } HYPRE_Int hypre_SMGGetNumPostRelax( void *smg_vdata, HYPRE_Int * num_post_relax ) { hypre_SMGData *smg_data = (hypre_SMGData *)smg_vdata; *num_post_relax = (smg_data -> num_post_relax); return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SMGSetBase( void *smg_vdata, hypre_Index base_index, hypre_Index base_stride ) { hypre_SMGData *smg_data = (hypre_SMGData *)smg_vdata; HYPRE_Int d; for (d = 0; d < 3; d++) { hypre_IndexD((smg_data -> base_index), d) = hypre_IndexD(base_index, d); hypre_IndexD((smg_data -> base_stride), d) = hypre_IndexD(base_stride, d); } return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SMGSetLogging( void *smg_vdata, HYPRE_Int logging) { hypre_SMGData *smg_data = (hypre_SMGData *)smg_vdata; (smg_data -> logging) = logging; return hypre_error_flag; } HYPRE_Int hypre_SMGGetLogging( void *smg_vdata, HYPRE_Int * logging) { hypre_SMGData *smg_data = (hypre_SMGData *)smg_vdata; *logging = (smg_data -> logging); return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SMGSetPrintLevel( void *smg_vdata, HYPRE_Int print_level) { hypre_SMGData *smg_data = (hypre_SMGData *)smg_vdata; (smg_data -> print_level) = print_level; return hypre_error_flag; } HYPRE_Int hypre_SMGGetPrintLevel( void *smg_vdata, HYPRE_Int * print_level) { hypre_SMGData *smg_data = (hypre_SMGData *)smg_vdata; *print_level = (smg_data -> print_level); return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SMGGetNumIterations( void *smg_vdata, HYPRE_Int *num_iterations ) { hypre_SMGData *smg_data = (hypre_SMGData *)smg_vdata; *num_iterations = (smg_data -> num_iterations); return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SMGPrintLogging( void *smg_vdata, HYPRE_Int myid) { hypre_SMGData *smg_data = (hypre_SMGData *)smg_vdata; HYPRE_Int i; HYPRE_Int num_iterations = (smg_data -> num_iterations); HYPRE_Int logging = (smg_data -> logging); HYPRE_Int print_level = (smg_data -> print_level); HYPRE_Real *norms = (smg_data -> norms); HYPRE_Real *rel_norms = (smg_data -> rel_norms); if (myid == 0) { if (print_level > 0) { if (logging > 0) { for (i = 0; i < num_iterations; i++) { hypre_printf("Residual norm[%d] = %e ", i, norms[i]); hypre_printf("Relative residual norm[%d] = %e\n", i, rel_norms[i]); } } } } return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SMGGetFinalRelativeResidualNorm( void *smg_vdata, HYPRE_Real *relative_residual_norm ) { hypre_SMGData *smg_data = (hypre_SMGData *)smg_vdata; HYPRE_Int max_iter = (smg_data -> max_iter); HYPRE_Int num_iterations = (smg_data -> num_iterations); HYPRE_Int logging = (smg_data -> logging); HYPRE_Real *rel_norms = (smg_data -> rel_norms); if (logging > 0) { if (num_iterations == max_iter) { *relative_residual_norm = rel_norms[num_iterations - 1]; } else { *relative_residual_norm = rel_norms[num_iterations]; } } return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SMGSetStructVectorConstantValues( hypre_StructVector *vector, HYPRE_Real values, hypre_BoxArray *box_array, hypre_Index stride ) { hypre_Box *v_data_box; HYPRE_Real *vp; hypre_Box *box; hypre_Index loop_size; hypre_IndexRef start; HYPRE_Int i; /*----------------------------------------------------------------------- * Set the vector coefficients *-----------------------------------------------------------------------*/ hypre_ForBoxI(i, box_array) { box = hypre_BoxArrayBox(box_array, i); start = hypre_BoxIMin(box); v_data_box = hypre_BoxArrayBox(hypre_StructVectorDataSpace(vector), i); vp = hypre_StructVectorBoxData(vector, i); hypre_BoxGetStrideSize(box, stride, loop_size); #define DEVICE_VAR is_device_ptr(vp) hypre_BoxLoop1Begin(hypre_StructVectorNDim(vector), loop_size, v_data_box, start, stride, vi); { vp[vi] = values; } hypre_BoxLoop1End(vi); #undef DEVICE_VAR } return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_StructSMGSetMaxLevel( void *smg_vdata, HYPRE_Int max_level ) { hypre_SMGData *smg_data = (hypre_SMGData *)smg_vdata; (smg_data -> max_levels) = max_level; return hypre_error_flag; } #if 0 //defined(HYPRE_USING_CUDA) || defined(HYPRE_USING_HIP) HYPRE_Int hypre_StructSMGSetDeviceLevel( void *smg_vdata, HYPRE_Int device_level ) { hypre_SMGData *smg_data = (hypre_SMGData *)smg_vdata; (smg_data -> devicelevel) = device_level; return hypre_error_flag; } #endif hypre-2.33.0/src/struct_ls/smg.h000066400000000000000000000067571477326011500165230ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * Header info for the SMG solver * *****************************************************************************/ #ifndef hypre_SMG_HEADER #define hypre_SMG_HEADER /*-------------------------------------------------------------------------- * hypre_SMGData: *--------------------------------------------------------------------------*/ typedef struct { MPI_Comm comm; HYPRE_Int memory_use; HYPRE_Real tol; HYPRE_Int max_iter; HYPRE_Int rel_change; HYPRE_Int zero_guess; HYPRE_Int max_levels; /* max_level <= 0 means no limit */ HYPRE_Int num_levels; HYPRE_Int num_pre_relax; /* number of pre relaxation sweeps */ HYPRE_Int num_post_relax; /* number of post relaxation sweeps */ HYPRE_Int cdir; /* coarsening direction */ /* base index space info */ hypre_Index base_index; hypre_Index base_stride; hypre_StructGrid **grid_l; hypre_StructGrid **PT_grid_l; HYPRE_MemoryLocation memory_location; /* memory location of data */ HYPRE_Real *data; HYPRE_Real *data_const; hypre_StructMatrix **A_l; hypre_StructMatrix **PT_l; hypre_StructMatrix **R_l; hypre_StructVector **b_l; hypre_StructVector **x_l; /* temp vectors */ hypre_StructVector **tb_l; hypre_StructVector **tx_l; hypre_StructVector **r_l; hypre_StructVector **e_l; void **relax_data_l; void **residual_data_l; void **restrict_data_l; void **interp_data_l; /* log info (always logged) */ HYPRE_Int num_iterations; HYPRE_Int time_index; HYPRE_Int print_level; /* additional log info (logged when `logging' > 0) */ HYPRE_Int logging; HYPRE_Real *norms; HYPRE_Real *rel_norms; } hypre_SMGData; /*-------------------------------------------------------------------------- * Utility routines: *--------------------------------------------------------------------------*/ #define hypre_SMGSetBIndex(base_index, base_stride, level, bindex) \ {\ if (level > 0)\ hypre_SetIndex3(bindex, 0, 0, 0);\ else\ hypre_CopyIndex(base_index, bindex);\ } #define hypre_SMGSetBStride(base_index, base_stride, level, bstride) \ {\ if (level > 0)\ hypre_SetIndex3(bstride, 1, 1, 1);\ else\ hypre_CopyIndex(base_stride, bstride);\ } #define hypre_SMGSetCIndex(base_index, base_stride, level, cdir, cindex) \ {\ hypre_SMGSetBIndex(base_index, base_stride, level, cindex);\ hypre_IndexD(cindex, cdir) += 0;\ } #define hypre_SMGSetFIndex(base_index, base_stride, level, cdir, findex) \ {\ hypre_SMGSetBIndex(base_index, base_stride, level, findex);\ hypre_IndexD(findex, cdir) += 1;\ } #define hypre_SMGSetStride(base_index, base_stride, level, cdir, stride) \ {\ hypre_SMGSetBStride(base_index, base_stride, level, stride);\ hypre_IndexD(stride, cdir) *= 2;\ } #endif hypre-2.33.0/src/struct_ls/smg2_setup_rap.c000066400000000000000000001061451477326011500206520ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "_hypre_struct_ls.h" #include "_hypre_struct_mv.hpp" #include "smg.h" /*-------------------------------------------------------------------------- * Sets up new coarse grid operator stucture. *--------------------------------------------------------------------------*/ hypre_StructMatrix * hypre_SMG2CreateRAPOp( hypre_StructMatrix *R, hypre_StructMatrix *A, hypre_StructMatrix *PT, hypre_StructGrid *coarse_grid ) { HYPRE_UNUSED_VAR(R); HYPRE_UNUSED_VAR(PT); hypre_StructMatrix *RAP; hypre_Index *RAP_stencil_shape; hypre_StructStencil *RAP_stencil; HYPRE_Int RAP_stencil_size; HYPRE_Int RAP_stencil_dim; HYPRE_Int RAP_num_ghost[] = {1, 1, 1, 1, 0, 0}; HYPRE_Int j, i; HYPRE_Int stencil_rank; RAP_stencil_dim = 2; /*----------------------------------------------------------------------- * Define RAP_stencil *-----------------------------------------------------------------------*/ stencil_rank = 0; /*----------------------------------------------------------------------- * non-symmetric case *-----------------------------------------------------------------------*/ if (!hypre_StructMatrixSymmetric(A)) { /*-------------------------------------------------------------------- * 5 or 9 point fine grid stencil produces 9 point RAP *--------------------------------------------------------------------*/ RAP_stencil_size = 9; RAP_stencil_shape = hypre_CTAlloc(hypre_Index, RAP_stencil_size, HYPRE_MEMORY_HOST); for (j = -1; j < 2; j++) { for (i = -1; i < 2; i++) { /*-------------------------------------------------------------- * Storage for 9 elements (c,w,e,n,s,sw,se,nw,se) *--------------------------------------------------------------*/ hypre_SetIndex3(RAP_stencil_shape[stencil_rank], i, j, 0); stencil_rank++; } } } /*----------------------------------------------------------------------- * symmetric case *-----------------------------------------------------------------------*/ else { /*-------------------------------------------------------------------- * 5 or 9 point fine grid stencil produces 9 point RAP * Only store the lower triangular part + diagonal = 5 entries, * lower triangular means the lower triangular part on the matrix * in the standard lexicalgraphic ordering. *--------------------------------------------------------------------*/ RAP_stencil_size = 5; RAP_stencil_shape = hypre_CTAlloc(hypre_Index, RAP_stencil_size, HYPRE_MEMORY_HOST); for (j = -1; j < 1; j++) { for (i = -1; i < 2; i++) { /*-------------------------------------------------------------- * Store 5 elements in (c,w,s,sw,se) *--------------------------------------------------------------*/ if ( i + j <= 0 ) { hypre_SetIndex3(RAP_stencil_shape[stencil_rank], i, j, 0); stencil_rank++; } } } } RAP_stencil = hypre_StructStencilCreate(RAP_stencil_dim, RAP_stencil_size, RAP_stencil_shape); RAP = hypre_StructMatrixCreate(hypre_StructMatrixComm(A), coarse_grid, RAP_stencil); hypre_StructStencilDestroy(RAP_stencil); /*----------------------------------------------------------------------- * Coarse operator in symmetric iff fine operator is *-----------------------------------------------------------------------*/ hypre_StructMatrixSymmetric(RAP) = hypre_StructMatrixSymmetric(A); /*----------------------------------------------------------------------- * Set number of ghost points *-----------------------------------------------------------------------*/ if (hypre_StructMatrixSymmetric(A)) { RAP_num_ghost[1] = 0; RAP_num_ghost[3] = 0; } hypre_StructMatrixSetNumGhost(RAP, RAP_num_ghost); return RAP; } /*-------------------------------------------------------------------------- * Routines to build RAP. These routines are fairly general * 1) No assumptions about symmetry of A * 2) No assumption that R = transpose(P) * 3) 5 or 9-point fine grid A * * I am, however, assuming that the c-to-c interpolation is the identity. * * I've written two routines - hypre_SMG2BuildRAPSym to build the * lower triangular part of RAP (including the diagonal) and * hypre_SMG2BuildRAPNoSym to build the upper triangular part of RAP * (excluding the diagonal). So using symmetric storage, only the * first routine would be called. With full storage both would need to * be called. * *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SMG2BuildRAPSym( hypre_StructMatrix *A, hypre_StructMatrix *PT, hypre_StructMatrix *R, hypre_StructMatrix *RAP, hypre_Index cindex, hypre_Index cstride ) { hypre_Index index; hypre_StructStencil *fine_stencil; HYPRE_Int fine_stencil_size; hypre_StructGrid *fgrid; HYPRE_Int *fgrid_ids; hypre_StructGrid *cgrid; hypre_BoxArray *cgrid_boxes; HYPRE_Int *cgrid_ids; hypre_Box *cgrid_box; hypre_IndexRef cstart; hypre_Index stridec; hypre_Index fstart; hypre_IndexRef stridef; hypre_Index loop_size; HYPRE_Int fi, ci; hypre_Box *A_dbox; hypre_Box *PT_dbox; hypre_Box *R_dbox; hypre_Box *RAP_dbox; HYPRE_Real *pa, *pb; HYPRE_Real *ra, *rb; HYPRE_Real *a_cc, *a_cw, *a_ce, *a_cs, *a_cn; HYPRE_Real *a_csw = NULL, *a_cse = NULL, *a_cnw = NULL; HYPRE_Real *rap_cc, *rap_cw, *rap_cs; HYPRE_Real *rap_csw, *rap_cse; HYPRE_Int yOffsetA; HYPRE_Int xOffsetP; HYPRE_Int yOffsetP; fine_stencil = hypre_StructMatrixStencil(A); fine_stencil_size = hypre_StructStencilSize(fine_stencil); stridef = cstride; hypre_SetIndex3(stridec, 1, 1, 1); fgrid = hypre_StructMatrixGrid(A); fgrid_ids = hypre_StructGridIDs(fgrid); cgrid = hypre_StructMatrixGrid(RAP); cgrid_boxes = hypre_StructGridBoxes(cgrid); cgrid_ids = hypre_StructGridIDs(cgrid); fi = 0; hypre_ForBoxI(ci, cgrid_boxes) { while (fgrid_ids[fi] != cgrid_ids[ci]) { fi++; } cgrid_box = hypre_BoxArrayBox(cgrid_boxes, ci); cstart = hypre_BoxIMin(cgrid_box); hypre_StructMapCoarseToFine(cstart, cindex, cstride, fstart); A_dbox = hypre_BoxArrayBox(hypre_StructMatrixDataSpace(A), fi); PT_dbox = hypre_BoxArrayBox(hypre_StructMatrixDataSpace(PT), fi); R_dbox = hypre_BoxArrayBox(hypre_StructMatrixDataSpace(R), fi); RAP_dbox = hypre_BoxArrayBox(hypre_StructMatrixDataSpace(RAP), ci); /*----------------------------------------------------------------- * Extract pointers for interpolation operator: * pa is pointer for weight for f-point above c-point * pb is pointer for weight for f-point below c-point *-----------------------------------------------------------------*/ hypre_SetIndex3(index, 0, 1, 0); pa = hypre_StructMatrixExtractPointerByIndex(PT, fi, index); hypre_SetIndex3(index, 0, -1, 0); pb = hypre_StructMatrixExtractPointerByIndex(PT, fi, index); /*----------------------------------------------------------------- * Extract pointers for restriction operator: * ra is pointer for weight for f-point above c-point * rb is pointer for weight for f-point below c-point *-----------------------------------------------------------------*/ hypre_SetIndex3(index, 0, 1, 0); ra = hypre_StructMatrixExtractPointerByIndex(R, fi, index); hypre_SetIndex3(index, 0, -1, 0); rb = hypre_StructMatrixExtractPointerByIndex(R, fi, index); /*----------------------------------------------------------------- * Extract pointers for 5-point fine grid operator: * * a_cc is pointer for center coefficient * a_cw is pointer for west coefficient * a_ce is pointer for east coefficient * a_cs is pointer for south coefficient * a_cn is pointer for north coefficient *-----------------------------------------------------------------*/ hypre_SetIndex3(index, 0, 0, 0); a_cc = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index, -1, 0, 0); a_cw = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index, 1, 0, 0); a_ce = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index, 0, -1, 0); a_cs = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index, 0, 1, 0); a_cn = hypre_StructMatrixExtractPointerByIndex(A, fi, index); /*----------------------------------------------------------------- * Extract additional pointers for 9-point fine grid operator: * * a_csw is pointer for southwest coefficient * a_cse is pointer for southeast coefficient * a_cnw is pointer for northwest coefficient * a_cne is pointer for northeast coefficient *-----------------------------------------------------------------*/ if (fine_stencil_size > 5) { hypre_SetIndex3(index, -1, -1, 0); a_csw = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index, 1, -1, 0); a_cse = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index, -1, 1, 0); a_cnw = hypre_StructMatrixExtractPointerByIndex(A, fi, index); } /*----------------------------------------------------------------- * Extract pointers for coarse grid operator - always 9-point: * * We build only the lower triangular part (plus diagonal). * * rap_cc is pointer for center coefficient (etc.) *-----------------------------------------------------------------*/ hypre_SetIndex3(index, 0, 0, 0); rap_cc = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index, -1, 0, 0); rap_cw = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index, 0, -1, 0); rap_cs = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index, -1, -1, 0); rap_csw = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index, 1, -1, 0); rap_cse = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); /*----------------------------------------------------------------- * Define offsets for fine grid stencil and interpolation * * In the BoxLoop below I assume iA and iP refer to data associated * with the point which we are building the stencil for. The below * Offsets are used in refering to data associated with other points. *-----------------------------------------------------------------*/ hypre_SetIndex3(index, 0, 1, 0); yOffsetA = hypre_BoxOffsetDistance(A_dbox, index); yOffsetP = hypre_BoxOffsetDistance(PT_dbox, index); hypre_SetIndex3(index, 1, 0, 0); xOffsetP = hypre_BoxOffsetDistance(PT_dbox, index); /*----------------------------------------------------------------- * Switch statement to direct control to apropriate BoxLoop depending * on stencil size. Default is full 9-point. *-----------------------------------------------------------------*/ switch (fine_stencil_size) { /*-------------------------------------------------------------- * Loop for symmetric 5-point fine grid operator; produces a * symmetric 9-point coarse grid operator. We calculate only the * lower triangular stencil entries: (southwest, south, southeast, * west, and center). *--------------------------------------------------------------*/ case 5: hypre_BoxGetSize(cgrid_box, loop_size); #define DEVICE_VAR is_device_ptr(rap_csw,rb,a_cw,pa,rap_cs,a_cc,a_cs,rap_cse,a_ce,rap_cw,pb,ra,rap_cc,a_cn) hypre_BoxLoop4Begin(hypre_StructMatrixNDim(A), loop_size, PT_dbox, cstart, stridec, iP, R_dbox, cstart, stridec, iR, A_dbox, fstart, stridef, iA, RAP_dbox, cstart, stridec, iAc); { HYPRE_Int iAm1 = iA - yOffsetA; HYPRE_Int iAp1 = iA + yOffsetA; HYPRE_Int iP1 = iP - yOffsetP - xOffsetP; rap_csw[iAc] = rb[iR] * a_cw[iAm1] * pa[iP1]; iP1 = iP - yOffsetP; rap_cs[iAc] = rb[iR] * a_cc[iAm1] * pa[iP1] + rb[iR] * a_cs[iAm1] + a_cs[iA] * pa[iP1]; iP1 = iP - yOffsetP + xOffsetP; rap_cse[iAc] = rb[iR] * a_ce[iAm1] * pa[iP1]; iP1 = iP - xOffsetP; rap_cw[iAc] = a_cw[iA] + rb[iR] * a_cw[iAm1] * pb[iP1] + ra[iR] * a_cw[iAp1] * pa[iP1]; rap_cc[iAc] = a_cc[iA] + rb[iR] * a_cc[iAm1] * pb[iP] + ra[iR] * a_cc[iAp1] * pa[iP] + rb[iR] * a_cn[iAm1] + ra[iR] * a_cs[iAp1] + a_cs[iA] * pb[iP] + a_cn[iA] * pa[iP]; } hypre_BoxLoop4End(iP, iR, iA, iAc); #undef DEVICE_VAR break; /*-------------------------------------------------------------- * Loop for symmetric 9-point fine grid operator; produces a * symmetric 9-point coarse grid operator. We calculate only the * lower triangular stencil entries: (southwest, south, southeast, * west, and center). *--------------------------------------------------------------*/ default: hypre_BoxGetSize(cgrid_box, loop_size); #define DEVICE_VAR is_device_ptr(rap_csw,rb,a_cw,pa,a_csw,rap_cs,a_cc,a_cs,rap_cse,a_ce,a_cse,rap_cw,pb,ra,a_cnw,rap_cc,a_cn) hypre_BoxLoop4Begin(hypre_StructMatrixNDim(A), loop_size, PT_dbox, cstart, stridec, iP, R_dbox, cstart, stridec, iR, A_dbox, fstart, stridef, iA, RAP_dbox, cstart, stridec, iAc); { HYPRE_Int iAm1 = iA - yOffsetA; HYPRE_Int iAp1 = iA + yOffsetA; HYPRE_Int iP1 = iP - yOffsetP - xOffsetP; rap_csw[iAc] = rb[iR] * a_cw[iAm1] * pa[iP1] + rb[iR] * a_csw[iAm1] + a_csw[iA] * pa[iP1]; iP1 = iP - yOffsetP; rap_cs[iAc] = rb[iR] * a_cc[iAm1] * pa[iP1] + rb[iR] * a_cs[iAm1] + a_cs[iA] * pa[iP1]; iP1 = iP - yOffsetP + xOffsetP; rap_cse[iAc] = rb[iR] * a_ce[iAm1] * pa[iP1] + rb[iR] * a_cse[iAm1] + a_cse[iA] * pa[iP1]; iP1 = iP - xOffsetP; rap_cw[iAc] = a_cw[iA] + rb[iR] * a_cw[iAm1] * pb[iP1] + ra[iR] * a_cw[iAp1] * pa[iP1] + rb[iR] * a_cnw[iAm1] + ra[iR] * a_csw[iAp1] + a_csw[iA] * pb[iP1] + a_cnw[iA] * pa[iP1]; rap_cc[iAc] = a_cc[iA] + rb[iR] * a_cc[iAm1] * pb[iP] + ra[iR] * a_cc[iAp1] * pa[iP] + rb[iR] * a_cn[iAm1] + ra[iR] * a_cs[iAp1] + a_cs[iA] * pb[iP] + a_cn[iA] * pa[iP]; } hypre_BoxLoop4End(iP, iR, iA, iAc); #undef DEVICE_VAR break; } /* end switch statement */ } /* end ForBoxI */ return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SMG2BuildRAPNoSym( hypre_StructMatrix *A, hypre_StructMatrix *PT, hypre_StructMatrix *R, hypre_StructMatrix *RAP, hypre_Index cindex, hypre_Index cstride ) { hypre_Index index; hypre_StructStencil *fine_stencil; HYPRE_Int fine_stencil_size; hypre_StructGrid *fgrid; HYPRE_Int *fgrid_ids; hypre_StructGrid *cgrid; hypre_BoxArray *cgrid_boxes; HYPRE_Int *cgrid_ids; hypre_Box *cgrid_box; hypre_IndexRef cstart; hypre_Index stridec; hypre_Index fstart; hypre_IndexRef stridef; hypre_Index loop_size; HYPRE_Int fi, ci; hypre_Box *A_dbox; hypre_Box *PT_dbox; hypre_Box *R_dbox; hypre_Box *RAP_dbox; HYPRE_Real *pa, *pb; HYPRE_Real *ra, *rb; HYPRE_Real *a_cc, *a_cw, *a_ce, *a_cn; HYPRE_Real *a_cse = NULL, *a_cnw = NULL, *a_cne = NULL; HYPRE_Real *rap_ce, *rap_cn; HYPRE_Real *rap_cnw, *rap_cne; HYPRE_Int yOffsetA; HYPRE_Int xOffsetP; HYPRE_Int yOffsetP; fine_stencil = hypre_StructMatrixStencil(A); fine_stencil_size = hypre_StructStencilSize(fine_stencil); stridef = cstride; hypre_SetIndex3(stridec, 1, 1, 1); fgrid = hypre_StructMatrixGrid(A); fgrid_ids = hypre_StructGridIDs(fgrid); cgrid = hypre_StructMatrixGrid(RAP); cgrid_boxes = hypre_StructGridBoxes(cgrid); cgrid_ids = hypre_StructGridIDs(cgrid); fi = 0; hypre_ForBoxI(ci, cgrid_boxes) { while (fgrid_ids[fi] != cgrid_ids[ci]) { fi++; } cgrid_box = hypre_BoxArrayBox(cgrid_boxes, ci); cstart = hypre_BoxIMin(cgrid_box); hypre_StructMapCoarseToFine(cstart, cindex, cstride, fstart); A_dbox = hypre_BoxArrayBox(hypre_StructMatrixDataSpace(A), fi); PT_dbox = hypre_BoxArrayBox(hypre_StructMatrixDataSpace(PT), fi); R_dbox = hypre_BoxArrayBox(hypre_StructMatrixDataSpace(R), fi); RAP_dbox = hypre_BoxArrayBox(hypre_StructMatrixDataSpace(RAP), ci); /*----------------------------------------------------------------- * Extract pointers for interpolation operator: * pa is pointer for weight for f-point above c-point * pb is pointer for weight for f-point below c-point *-----------------------------------------------------------------*/ hypre_SetIndex3(index, 0, 1, 0); pa = hypre_StructMatrixExtractPointerByIndex(PT, fi, index); hypre_SetIndex3(index, 0, -1, 0); pb = hypre_StructMatrixExtractPointerByIndex(PT, fi, index); /*----------------------------------------------------------------- * Extract pointers for restriction operator: * ra is pointer for weight for f-point above c-point * rb is pointer for weight for f-point below c-point *-----------------------------------------------------------------*/ hypre_SetIndex3(index, 0, 1, 0); ra = hypre_StructMatrixExtractPointerByIndex(R, fi, index); hypre_SetIndex3(index, 0, -1, 0); rb = hypre_StructMatrixExtractPointerByIndex(R, fi, index); /*----------------------------------------------------------------- * Extract pointers for 5-point fine grid operator: * * a_cc is pointer for center coefficient * a_cw is pointer for west coefficient * a_ce is pointer for east coefficient * a_cs is pointer for south coefficient * a_cn is pointer for north coefficient *-----------------------------------------------------------------*/ hypre_SetIndex3(index, 0, 0, 0); a_cc = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index, -1, 0, 0); a_cw = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index, 1, 0, 0); a_ce = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index, 0, 1, 0); a_cn = hypre_StructMatrixExtractPointerByIndex(A, fi, index); /*----------------------------------------------------------------- * Extract additional pointers for 9-point fine grid operator: * * a_csw is pointer for southwest coefficient * a_cse is pointer for southeast coefficient * a_cnw is pointer for northwest coefficient * a_cne is pointer for northeast coefficient *-----------------------------------------------------------------*/ if (fine_stencil_size > 5) { hypre_SetIndex3(index, 1, -1, 0); a_cse = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index, -1, 1, 0); a_cnw = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index, 1, 1, 0); a_cne = hypre_StructMatrixExtractPointerByIndex(A, fi, index); } /*----------------------------------------------------------------- * Extract pointers for coarse grid operator - always 9-point: * * We build only the upper triangular part. * * rap_ce is pointer for east coefficient (etc.) *-----------------------------------------------------------------*/ hypre_SetIndex3(index, 1, 0, 0); rap_ce = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index, 0, 1, 0); rap_cn = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index, 1, 1, 0); rap_cne = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index, -1, 1, 0); rap_cnw = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); /*----------------------------------------------------------------- * Define offsets for fine grid stencil and interpolation * * In the BoxLoop below I assume iA and iP refer to data associated * with the point which we are building the stencil for. The below * Offsets are used in refering to data associated with other points. *-----------------------------------------------------------------*/ hypre_SetIndex3(index, 0, 1, 0); yOffsetA = hypre_BoxOffsetDistance(A_dbox, index); yOffsetP = hypre_BoxOffsetDistance(PT_dbox, index); hypre_SetIndex3(index, 1, 0, 0); xOffsetP = hypre_BoxOffsetDistance(PT_dbox, index); /*----------------------------------------------------------------- * Switch statement to direct control to apropriate BoxLoop depending * on stencil size. Default is full 27-point. *-----------------------------------------------------------------*/ switch (fine_stencil_size) { /*-------------------------------------------------------------- * Loop for 5-point fine grid operator; produces upper triangular * part of 9-point coarse grid operator - excludes diagonal. * stencil entries: (northeast, north, northwest, and east) *--------------------------------------------------------------*/ case 5: hypre_BoxGetSize(cgrid_box, loop_size); #define DEVICE_VAR is_device_ptr(rap_cne,ra,a_ce,pb,rap_cn,a_cc,a_cn,rap_cnw,a_cw,rap_ce,rb,pa) hypre_BoxLoop4Begin(hypre_StructMatrixNDim(A), loop_size, PT_dbox, cstart, stridec, iP, R_dbox, cstart, stridec, iR, A_dbox, fstart, stridef, iA, RAP_dbox, cstart, stridec, iAc); { HYPRE_Int iAm1 = iA - yOffsetA; HYPRE_Int iAp1 = iA + yOffsetA; HYPRE_Int iP1 = iP + yOffsetP + xOffsetP; rap_cne[iAc] = ra[iR] * a_ce[iAp1] * pb[iP1]; iP1 = iP + yOffsetP; rap_cn[iAc] = ra[iR] * a_cc[iAp1] * pb[iP1] + ra[iR] * a_cn[iAp1] + a_cn[iA] * pb[iP1]; iP1 = iP + yOffsetP - xOffsetP; rap_cnw[iAc] = ra[iR] * a_cw[iAp1] * pb[iP1]; iP1 = iP + xOffsetP; rap_ce[iAc] = a_ce[iA] + rb[iR] * a_ce[iAm1] * pb[iP1] + ra[iR] * a_ce[iAp1] * pa[iP1]; } hypre_BoxLoop4End(iP, iR, iA, iAc); #undef DEVICE_VAR break; /*-------------------------------------------------------------- * Loop for 9-point fine grid operator; produces upper triangular * part of 9-point coarse grid operator - excludes diagonal. * stencil entries: (northeast, north, northwest, and east) *--------------------------------------------------------------*/ default: hypre_BoxGetSize(cgrid_box, loop_size); #define DEVICE_VAR is_device_ptr(rap_cne,ra,a_ce,pb,a_cne,rap_cn,a_cc,a_cn,rap_cnw,a_cw,a_cnw,rap_ce,rb,pa,a_cse) hypre_BoxLoop4Begin(hypre_StructMatrixNDim(A), loop_size, PT_dbox, cstart, stridec, iP, R_dbox, cstart, stridec, iR, A_dbox, fstart, stridef, iA, RAP_dbox, cstart, stridec, iAc); { HYPRE_Int iAm1 = iA - yOffsetA; HYPRE_Int iAp1 = iA + yOffsetA; HYPRE_Int iP1 = iP + yOffsetP + xOffsetP; rap_cne[iAc] = ra[iR] * a_ce[iAp1] * pb[iP1] + ra[iR] * a_cne[iAp1] + a_cne[iA] * pb[iP1]; iP1 = iP + yOffsetP; rap_cn[iAc] = ra[iR] * a_cc[iAp1] * pb[iP1] + ra[iR] * a_cn[iAp1] + a_cn[iA] * pb[iP1]; iP1 = iP + yOffsetP - xOffsetP; rap_cnw[iAc] = ra[iR] * a_cw[iAp1] * pb[iP1] + ra[iR] * a_cnw[iAp1] + a_cnw[iA] * pb[iP1]; iP1 = iP + xOffsetP; rap_ce[iAc] = a_ce[iA] + rb[iR] * a_ce[iAm1] * pb[iP1] + ra[iR] * a_ce[iAp1] * pa[iP1] + rb[iR] * a_cne[iAm1] + ra[iR] * a_cse[iAp1] + a_cse[iA] * pb[iP1] + a_cne[iA] * pa[iP1]; } hypre_BoxLoop4End(iP, iR, iA, iAc); #undef DEVICE_VAR break; } /* end switch statement */ } /* end ForBoxI */ return hypre_error_flag; } /*-------------------------------------------------------------------------- * Collapses stencil in periodic direction on coarsest grid. *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SMG2RAPPeriodicSym( hypre_StructMatrix *RAP, hypre_Index cindex, hypre_Index cstride ) { HYPRE_UNUSED_VAR(cindex); HYPRE_UNUSED_VAR(cstride); hypre_Index index; hypre_StructGrid *cgrid; hypre_BoxArray *cgrid_boxes; hypre_Box *cgrid_box; hypre_IndexRef cstart; hypre_Index stridec; hypre_Index loop_size; HYPRE_Int ci; hypre_Box *RAP_dbox; HYPRE_Real *rap_cc, *rap_cw, *rap_cs; HYPRE_Real *rap_csw, *rap_cse; HYPRE_Int xOffset; HYPRE_Real zero = 0.0; hypre_SetIndex3(stridec, 1, 1, 1); cgrid = hypre_StructMatrixGrid(RAP); cgrid_boxes = hypre_StructGridBoxes(cgrid); if (hypre_IndexY(hypre_StructGridPeriodic(cgrid)) == 1) { hypre_StructMatrixAssemble(RAP); hypre_ForBoxI(ci, cgrid_boxes) { cgrid_box = hypre_BoxArrayBox(cgrid_boxes, ci); cstart = hypre_BoxIMin(cgrid_box); RAP_dbox = hypre_BoxArrayBox(hypre_StructMatrixDataSpace(RAP), ci); hypre_SetIndex3(index, 1, 0, 0); xOffset = hypre_BoxOffsetDistance(RAP_dbox, index); /*----------------------------------------------------------------- * Extract pointers for coarse grid operator - always 9-point: *-----------------------------------------------------------------*/ hypre_SetIndex3(index, 0, 0, 0); rap_cc = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index, -1, 0, 0); rap_cw = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index, 0, -1, 0); rap_cs = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index, -1, -1, 0); rap_csw = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index, 1, -1, 0); rap_cse = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_BoxGetSize(cgrid_box, loop_size); #define DEVICE_VAR is_device_ptr(rap_cw,rap_cse,rap_csw,rap_cc,rap_cs) hypre_BoxLoop1Begin(hypre_StructMatrixNDim(RAP), loop_size, RAP_dbox, cstart, stridec, iAc); { HYPRE_Int iAcm1 = iAc - xOffset; rap_cw[iAc] += (rap_cse[iAcm1] + rap_csw[iAc]); rap_cc[iAc] += (2.0 * rap_cs[iAc]); } hypre_BoxLoop1End(iAc); #undef DEVICE_VAR #define DEVICE_VAR is_device_ptr(rap_csw,rap_cs,rap_cse) hypre_BoxLoop1Begin(hypre_StructMatrixNDim(RAP), loop_size, RAP_dbox, cstart, stridec, iAc); { rap_csw[iAc] = zero; rap_cs[iAc] = zero; rap_cse[iAc] = zero; } hypre_BoxLoop1End(iAc); #undef DEVICE_VAR } /* end ForBoxI */ } return hypre_error_flag; } /*-------------------------------------------------------------------------- * Collapses stencil in periodic direction on coarsest grid. *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SMG2RAPPeriodicNoSym( hypre_StructMatrix *RAP, hypre_Index cindex, hypre_Index cstride ) { HYPRE_UNUSED_VAR(cindex); HYPRE_UNUSED_VAR(cstride); hypre_Index index; hypre_StructGrid *cgrid; hypre_BoxArray *cgrid_boxes; hypre_Box *cgrid_box; hypre_IndexRef cstart; hypre_Index stridec; hypre_Index loop_size; HYPRE_Int ci; hypre_Box *RAP_dbox; HYPRE_Real *rap_cc, *rap_cw, *rap_cs; HYPRE_Real *rap_csw, *rap_cse; HYPRE_Real *rap_ce, *rap_cn; HYPRE_Real *rap_cnw, *rap_cne; HYPRE_Real zero = 0.0; hypre_SetIndex3(stridec, 1, 1, 1); cgrid = hypre_StructMatrixGrid(RAP); cgrid_boxes = hypre_StructGridBoxes(cgrid); if (hypre_IndexY(hypre_StructGridPeriodic(cgrid)) == 1) { hypre_ForBoxI(ci, cgrid_boxes) { cgrid_box = hypre_BoxArrayBox(cgrid_boxes, ci); cstart = hypre_BoxIMin(cgrid_box); RAP_dbox = hypre_BoxArrayBox(hypre_StructMatrixDataSpace(RAP), ci); /*----------------------------------------------------------------- * Extract pointers for coarse grid operator - always 9-point: *-----------------------------------------------------------------*/ hypre_SetIndex3(index, 0, 0, 0); rap_cc = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index, -1, 0, 0); rap_cw = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index, 0, -1, 0); rap_cs = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index, -1, -1, 0); rap_csw = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index, 1, -1, 0); rap_cse = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index, 1, 0, 0); rap_ce = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index, 0, 1, 0); rap_cn = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index, 1, 1, 0); rap_cne = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index, -1, 1, 0); rap_cnw = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_BoxGetSize(cgrid_box, loop_size); #define DEVICE_VAR is_device_ptr(rap_cw,rap_cnw,rap_csw,rap_cc,rap_cn,rap_cs,rap_ce,rap_cne,rap_cse) hypre_BoxLoop1Begin(hypre_StructMatrixNDim(RAP), loop_size, RAP_dbox, cstart, stridec, iAc); { rap_cw[iAc] += (rap_cnw[iAc] + rap_csw[iAc]); rap_cnw[iAc] = zero; rap_csw[iAc] = zero; rap_cc[iAc] += (rap_cn[iAc] + rap_cs[iAc]); rap_cn[iAc] = zero; rap_cs[iAc] = zero; rap_ce[iAc] += (rap_cne[iAc] + rap_cse[iAc]); rap_cne[iAc] = zero; rap_cse[iAc] = zero; } hypre_BoxLoop1End(iAc); #undef DEVICE_VAR } /* end ForBoxI */ } return hypre_error_flag; } hypre-2.33.0/src/struct_ls/smg3_setup_rap.c000066400000000000000000002450471477326011500206600ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "_hypre_struct_ls.h" #include "_hypre_struct_mv.hpp" #include "smg.h" /*-------------------------------------------------------------------------- * Sets up new coarse grid operator stucture. *--------------------------------------------------------------------------*/ hypre_StructMatrix * hypre_SMG3CreateRAPOp( hypre_StructMatrix *R, hypre_StructMatrix *A, hypre_StructMatrix *PT, hypre_StructGrid *coarse_grid ) { HYPRE_UNUSED_VAR(R); HYPRE_UNUSED_VAR(PT); hypre_StructMatrix *RAP; hypre_Index *RAP_stencil_shape; hypre_StructStencil *RAP_stencil; HYPRE_Int RAP_stencil_size; HYPRE_Int RAP_stencil_dim; HYPRE_Int RAP_num_ghost[] = {1, 1, 1, 1, 1, 1}; hypre_StructStencil *A_stencil; HYPRE_Int A_stencil_size; HYPRE_Int k, j, i; HYPRE_Int stencil_rank; RAP_stencil_dim = 3; A_stencil = hypre_StructMatrixStencil(A); A_stencil_size = hypre_StructStencilSize(A_stencil); /*----------------------------------------------------------------------- * Define RAP_stencil *-----------------------------------------------------------------------*/ stencil_rank = 0; /*----------------------------------------------------------------------- * non-symmetric case *-----------------------------------------------------------------------*/ if (!hypre_StructMatrixSymmetric(A)) { /*-------------------------------------------------------------------- * 7 or 15 point fine grid stencil produces 15 point RAP *--------------------------------------------------------------------*/ if ( A_stencil_size <= 15) { RAP_stencil_size = 15; RAP_stencil_shape = hypre_CTAlloc(hypre_Index, RAP_stencil_size, HYPRE_MEMORY_HOST); for (k = -1; k < 2; k++) { for (j = -1; j < 2; j++) { for (i = -1; i < 2; i++) { /*-------------------------------------------------------- * Storage for c,w,e,n,s elements in each plane *--------------------------------------------------------*/ if ( i * j == 0 ) { hypre_SetIndex3(RAP_stencil_shape[stencil_rank], i, j, k); stencil_rank++; } } } } } /*-------------------------------------------------------------------- * 19 or 27 point fine grid stencil produces 27 point RAP *--------------------------------------------------------------------*/ else { RAP_stencil_size = 27; RAP_stencil_shape = hypre_CTAlloc(hypre_Index, RAP_stencil_size, HYPRE_MEMORY_HOST); for (k = -1; k < 2; k++) { for (j = -1; j < 2; j++) { for (i = -1; i < 2; i++) { /*-------------------------------------------------------- * Storage for 9 elements (c,w,e,n,s,sw,se,nw,se) in * each plane *--------------------------------------------------------*/ hypre_SetIndex3(RAP_stencil_shape[stencil_rank], i, j, k); stencil_rank++; } } } } } /*----------------------------------------------------------------------- * symmetric case *-----------------------------------------------------------------------*/ else { /*-------------------------------------------------------------------- * 7 or 15 point fine grid stencil produces 15 point RAP * Only store the lower triangular part + diagonal = 8 entries, * lower triangular means the lower triangular part on the matrix * in the standard lexicalgraphic ordering. *--------------------------------------------------------------------*/ if ( A_stencil_size <= 15) { RAP_stencil_size = 8; RAP_stencil_shape = hypre_CTAlloc(hypre_Index, RAP_stencil_size, HYPRE_MEMORY_HOST); for (k = -1; k < 1; k++) { for (j = -1; j < 2; j++) { for (i = -1; i < 2; i++) { /*-------------------------------------------------------- * Store 5 elements in lower plane (c,w,e,s,n) * and 3 elements in same plane (c,w,s) *--------------------------------------------------------*/ if ( i * j == 0 && i + j + k <= 0) { hypre_SetIndex3(RAP_stencil_shape[stencil_rank], i, j, k); stencil_rank++; } } } } } /*-------------------------------------------------------------------- * 19 or 27 point fine grid stencil produces 27 point RAP * Only store the lower triangular part + diagonal = 14 entries, * lower triangular means the lower triangular part on the matrix * in the standard lexicalgraphic ordering. *--------------------------------------------------------------------*/ else { RAP_stencil_size = 14; RAP_stencil_shape = hypre_CTAlloc(hypre_Index, RAP_stencil_size, HYPRE_MEMORY_HOST); for (k = -1; k < 1; k++) { for (j = -1; j < 2; j++) { for (i = -1; i < 2; i++) { /*-------------------------------------------------------- * Store 9 elements in lower plane (c,w,e,s,n,sw,se,nw,ne) * and 5 elements in same plane (c,w,s,sw,se) *--------------------------------------------------------*/ if ( k < 0 || (i + j + k <= 0 && j < 1) ) { hypre_SetIndex3(RAP_stencil_shape[stencil_rank], i, j, k); stencil_rank++; } } } } } } RAP_stencil = hypre_StructStencilCreate(RAP_stencil_dim, RAP_stencil_size, RAP_stencil_shape); RAP = hypre_StructMatrixCreate(hypre_StructMatrixComm(A), coarse_grid, RAP_stencil); hypre_StructStencilDestroy(RAP_stencil); /*----------------------------------------------------------------------- * Coarse operator in symmetric iff fine operator is *-----------------------------------------------------------------------*/ hypre_StructMatrixSymmetric(RAP) = hypre_StructMatrixSymmetric(A); /*----------------------------------------------------------------------- * Set number of ghost points *-----------------------------------------------------------------------*/ if (hypre_StructMatrixSymmetric(A)) { RAP_num_ghost[1] = 0; RAP_num_ghost[3] = 0; RAP_num_ghost[5] = 0; } hypre_StructMatrixSetNumGhost(RAP, RAP_num_ghost); return RAP; } /*-------------------------------------------------------------------------- * Routines to build RAP. These routines are fairly general * 1) No assumptions about symmetry of A * 2) No assumption that R = transpose(P) * 3) 7,15,19 or 27-point fine grid A * * I am, however, assuming that the c-to-c interpolation is the identity. * * I've written a two routines - hypre_SMG3BuildRAPSym to build the lower * triangular part of RAP (including the diagonal) and * hypre_SMG3BuildRAPNoSym to build the upper triangular part of RAP * (excluding the diagonal). So using symmetric storage, only the first * routine would be called. With full storage both would need to be called. * *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SMG3BuildRAPSym( hypre_StructMatrix *A, hypre_StructMatrix *PT, hypre_StructMatrix *R, hypre_StructMatrix *RAP, hypre_Index cindex, hypre_Index cstride ) { hypre_Index index; hypre_StructStencil *fine_stencil; HYPRE_Int fine_stencil_size; hypre_StructGrid *fgrid; HYPRE_Int *fgrid_ids; hypre_StructGrid *cgrid; hypre_BoxArray *cgrid_boxes; HYPRE_Int *cgrid_ids; hypre_Box *cgrid_box; hypre_IndexRef cstart; hypre_Index stridec; hypre_Index fstart; hypre_IndexRef stridef; hypre_Index loop_size; HYPRE_Int fi, ci; hypre_Box *A_dbox; hypre_Box *PT_dbox; hypre_Box *R_dbox; hypre_Box *RAP_dbox; HYPRE_Real *pa, *pb; HYPRE_Real *ra, *rb; HYPRE_Real *a_cc, *a_cw, *a_ce, *a_cs, *a_cn; HYPRE_Real *a_ac, *a_bc; HYPRE_Real *a_aw = NULL, *a_as = NULL; HYPRE_Real *a_bw = NULL, *a_be = NULL; HYPRE_Real *a_bs = NULL, *a_bn = NULL; HYPRE_Real *a_csw = NULL, *a_cse = NULL; HYPRE_Real *a_cnw = NULL, *a_cne = NULL; HYPRE_Real *a_asw = NULL, *a_ase = NULL; HYPRE_Real *a_bsw = NULL, *a_bse = NULL; HYPRE_Real *a_bnw = NULL, *a_bne = NULL; HYPRE_Real *rap_cc, *rap_cw, *rap_cs; HYPRE_Real *rap_bc, *rap_bw, *rap_be, *rap_bs, *rap_bn; HYPRE_Real *rap_csw = NULL, *rap_cse = NULL; HYPRE_Real *rap_bsw = NULL, *rap_bse = NULL; HYPRE_Real *rap_bnw = NULL, *rap_bne = NULL; HYPRE_Int zOffsetA; HYPRE_Int xOffsetP; HYPRE_Int yOffsetP; HYPRE_Int zOffsetP; fine_stencil = hypre_StructMatrixStencil(A); fine_stencil_size = hypre_StructStencilSize(fine_stencil); stridef = cstride; hypre_SetIndex3(stridec, 1, 1, 1); fgrid = hypre_StructMatrixGrid(A); fgrid_ids = hypre_StructGridIDs(fgrid); cgrid = hypre_StructMatrixGrid(RAP); cgrid_boxes = hypre_StructGridBoxes(cgrid); cgrid_ids = hypre_StructGridIDs(cgrid); fi = 0; hypre_ForBoxI(ci, cgrid_boxes) { while (fgrid_ids[fi] != cgrid_ids[ci]) { fi++; } cgrid_box = hypre_BoxArrayBox(cgrid_boxes, ci); cstart = hypre_BoxIMin(cgrid_box); hypre_StructMapCoarseToFine(cstart, cindex, cstride, fstart); A_dbox = hypre_BoxArrayBox(hypre_StructMatrixDataSpace(A), fi); PT_dbox = hypre_BoxArrayBox(hypre_StructMatrixDataSpace(PT), fi); R_dbox = hypre_BoxArrayBox(hypre_StructMatrixDataSpace(R), fi); RAP_dbox = hypre_BoxArrayBox(hypre_StructMatrixDataSpace(RAP), ci); /*----------------------------------------------------------------- * Extract pointers for interpolation operator: * pa is pointer for weight for f-point above c-point * pb is pointer for weight for f-point below c-point *-----------------------------------------------------------------*/ hypre_SetIndex3(index, 0, 0, 1); pa = hypre_StructMatrixExtractPointerByIndex(PT, fi, index); hypre_SetIndex3(index, 0, 0, -1); pb = hypre_StructMatrixExtractPointerByIndex(PT, fi, index); /*----------------------------------------------------------------- * Extract pointers for restriction operator: * ra is pointer for weight for f-point above c-point * rb is pointer for weight for f-point below c-point *-----------------------------------------------------------------*/ hypre_SetIndex3(index, 0, 0, 1); ra = hypre_StructMatrixExtractPointerByIndex(R, fi, index); hypre_SetIndex3(index, 0, 0, -1); rb = hypre_StructMatrixExtractPointerByIndex(R, fi, index); /*----------------------------------------------------------------- * Extract pointers for 7-point fine grid operator: * * a_cc is pointer for center coefficient * a_cw is pointer for west coefficient in same plane * a_ce is pointer for east coefficient in same plane * a_cs is pointer for south coefficient in same plane * a_cn is pointer for north coefficient in same plane * a_ac is pointer for center coefficient in plane above * a_bc is pointer for center coefficient in plane below *-----------------------------------------------------------------*/ hypre_SetIndex3(index, 0, 0, 0); a_cc = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index, -1, 0, 0); a_cw = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index, 1, 0, 0); a_ce = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index, 0, -1, 0); a_cs = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index, 0, 1, 0); a_cn = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index, 0, 0, 1); a_ac = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index, 0, 0, -1); a_bc = hypre_StructMatrixExtractPointerByIndex(A, fi, index); /*----------------------------------------------------------------- * Extract additional pointers for 15-point fine grid operator: * * a_aw is pointer for west coefficient in plane above * a_ae is pointer for east coefficient in plane above * a_as is pointer for south coefficient in plane above * a_an is pointer for north coefficient in plane above * a_bw is pointer for west coefficient in plane below * a_be is pointer for east coefficient in plane below * a_bs is pointer for south coefficient in plane below * a_bn is pointer for north coefficient in plane below *-----------------------------------------------------------------*/ if (fine_stencil_size > 7) { hypre_SetIndex3(index, -1, 0, 1); a_aw = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index, 0, -1, 1); a_as = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index, -1, 0, -1); a_bw = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index, 1, 0, -1); a_be = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index, 0, -1, -1); a_bs = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index, 0, 1, -1); a_bn = hypre_StructMatrixExtractPointerByIndex(A, fi, index); } /*----------------------------------------------------------------- * Extract additional pointers for 19-point fine grid operator: * * a_csw is pointer for southwest coefficient in same plane * a_cse is pointer for southeast coefficient in same plane * a_cnw is pointer for northwest coefficient in same plane * a_cne is pointer for northeast coefficient in same plane *-----------------------------------------------------------------*/ if (fine_stencil_size > 15) { hypre_SetIndex3(index, -1, -1, 0); a_csw = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index, 1, -1, 0); a_cse = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index, -1, 1, 0); a_cnw = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index, 1, 1, 0); a_cne = hypre_StructMatrixExtractPointerByIndex(A, fi, index); } /*----------------------------------------------------------------- * Extract additional pointers for 27-point fine grid operator: * * a_asw is pointer for southwest coefficient in plane above * a_ase is pointer for southeast coefficient in plane above * a_anw is pointer for northwest coefficient in plane above * a_ane is pointer for northeast coefficient in plane above * a_bsw is pointer for southwest coefficient in plane below * a_bse is pointer for southeast coefficient in plane below * a_bnw is pointer for northwest coefficient in plane below * a_bne is pointer for northeast coefficient in plane below *-----------------------------------------------------------------*/ if (fine_stencil_size > 19) { hypre_SetIndex3(index, -1, -1, 1); a_asw = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index, 1, -1, 1); a_ase = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index, -1, -1, -1); a_bsw = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index, 1, -1, -1); a_bse = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index, -1, 1, -1); a_bnw = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index, 1, 1, -1); a_bne = hypre_StructMatrixExtractPointerByIndex(A, fi, index); } /*----------------------------------------------------------------- * Extract pointers for 15-point coarse grid operator: * * We build only the lower triangular part (plus diagonal). * * rap_cc is pointer for center coefficient (etc.) *-----------------------------------------------------------------*/ hypre_SetIndex3(index, 0, 0, 0); rap_cc = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index, -1, 0, 0); rap_cw = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index, 0, -1, 0); rap_cs = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index, 0, 0, -1); rap_bc = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index, -1, 0, -1); rap_bw = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index, 1, 0, -1); rap_be = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index, 0, -1, -1); rap_bs = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index, 0, 1, -1); rap_bn = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); /*----------------------------------------------------------------- * Extract additional pointers for 27-point coarse grid operator: * * A 27-point coarse grid operator is produced when the fine grid * stencil is 19 or 27 point. * * We build only the lower triangular part. * * rap_csw is pointer for southwest coefficient in same plane (etc.) *-----------------------------------------------------------------*/ if (fine_stencil_size > 15) { hypre_SetIndex3(index, -1, -1, 0); rap_csw = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index, 1, -1, 0); rap_cse = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index, -1, -1, -1); rap_bsw = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index, 1, -1, -1); rap_bse = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index, -1, 1, -1); rap_bnw = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index, 1, 1, -1); rap_bne = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); } /*----------------------------------------------------------------- * Define offsets for fine grid stencil and interpolation * * In the BoxLoop below I assume iA and iP refer to data associated * with the point which we are building the stencil for. The below * Offsets are used in refering to data associated with other points. *-----------------------------------------------------------------*/ hypre_SetIndex3(index, 0, 0, 1); zOffsetA = hypre_BoxOffsetDistance(A_dbox, index); zOffsetP = hypre_BoxOffsetDistance(PT_dbox, index); hypre_SetIndex3(index, 0, 1, 0); yOffsetP = hypre_BoxOffsetDistance(PT_dbox, index); hypre_SetIndex3(index, 1, 0, 0); xOffsetP = hypre_BoxOffsetDistance(PT_dbox, index); /*-------------------------------------------------------------------- * Switch statement to direct control to apropriate BoxLoop depending * on stencil size. Default is full 27-point. *-----------------------------------------------------------------*/ switch (fine_stencil_size) { /*-------------------------------------------------------------- * Loop for symmetric 7-point fine grid operator; produces a * symmetric 15-point coarse grid operator. We calculate only the * lower triangular stencil entries: (below-south, below-west, * below-center, below-east, below-north, center-south, * center-west, and center-center). *--------------------------------------------------------------*/ case 7: hypre_BoxGetSize(cgrid_box, loop_size); #define DEVICE_VAR is_device_ptr(rap_bs,rb,a_cs,pa,rap_bw,a_cw,rap_bc,a_bc,a_cc,rap_be,a_ce,rap_bn,a_cn,rap_cs,pb,ra,rap_cw,rap_cc,a_ac) hypre_BoxLoop4Begin(hypre_StructMatrixNDim(A), loop_size, PT_dbox, cstart, stridec, iP, R_dbox, cstart, stridec, iR, A_dbox, fstart, stridef, iA, RAP_dbox, cstart, stridec, iAc); { HYPRE_Int iAm1 = iA - zOffsetA; HYPRE_Int iAp1 = iA + zOffsetA; HYPRE_Int iP1 = iP - zOffsetP - yOffsetP; rap_bs[iAc] = rb[iR] * a_cs[iAm1] * pa[iP1]; iP1 = iP - zOffsetP - xOffsetP; rap_bw[iAc] = rb[iR] * a_cw[iAm1] * pa[iP1]; iP1 = iP - zOffsetP; rap_bc[iAc] = a_bc[iA] * pa[iP1] + rb[iR] * a_cc[iAm1] * pa[iP1] + rb[iR] * a_bc[iAm1]; iP1 = iP - zOffsetP + xOffsetP; rap_be[iAc] = rb[iR] * a_ce[iAm1] * pa[iP1]; iP1 = iP - zOffsetP + yOffsetP; rap_bn[iAc] = rb[iR] * a_cn[iAm1] * pa[iP1]; iP1 = iP - yOffsetP; rap_cs[iAc] = a_cs[iA] + rb[iR] * a_cs[iAm1] * pb[iP1] + ra[iR] * a_cs[iAp1] * pa[iP1]; iP1 = iP - xOffsetP; rap_cw[iAc] = a_cw[iA] + rb[iR] * a_cw[iAm1] * pb[iP1] + ra[iR] * a_cw[iAp1] * pa[iP1]; rap_cc[iAc] = a_cc[iA] + rb[iR] * a_cc[iAm1] * pb[iP] + ra[iR] * a_cc[iAp1] * pa[iP] + rb[iR] * a_ac[iAm1] + ra[iR] * a_bc[iAp1] + a_bc[iA] * pb[iP] + a_ac[iA] * pa[iP]; } hypre_BoxLoop4End(iP, iR, iA, iAc); #undef DEVICE_VAR break; /*-------------------------------------------------------------- * Loop for symmetric 15-point fine grid operator; produces a * symmetric 15-point coarse grid operator. We calculate only the * lower triangular stencil entries: (below-south, below-west, * below-center, below-east, below-north, center-south, * center-west, and center-center). *--------------------------------------------------------------*/ case 15: hypre_BoxGetSize(cgrid_box, loop_size); #define DEVICE_VAR is_device_ptr(rap_bs,rb,a_cs,pa,a_bs,rap_bw,a_cw,a_bw,rap_bc,a_bc,a_cc,rap_be,a_ce,a_be,rap_bn,a_cn,a_bn,rap_cs,pb,ra,a_as,rap_cw,a_aw,rap_cc,a_ac) hypre_BoxLoop4Begin(hypre_StructMatrixNDim(A), loop_size, PT_dbox, cstart, stridec, iP, R_dbox, cstart, stridec, iR, A_dbox, fstart, stridef, iA, RAP_dbox, cstart, stridec, iAc); { HYPRE_Int iAm1 = iA - zOffsetA; HYPRE_Int iAp1 = iA + zOffsetA; HYPRE_Int iP1 = iP - zOffsetP - yOffsetP; rap_bs[iAc] = rb[iR] * a_cs[iAm1] * pa[iP1] + rb[iR] * a_bs[iAm1] + a_bs[iA] * pa[iP1]; iP1 = iP - zOffsetP - xOffsetP; rap_bw[iAc] = rb[iR] * a_cw[iAm1] * pa[iP1] + rb[iR] * a_bw[iAm1] + a_bw[iA] * pa[iP1]; iP1 = iP - zOffsetP; rap_bc[iAc] = a_bc[iA] * pa[iP1] + rb[iR] * a_cc[iAm1] * pa[iP1] + rb[iR] * a_bc[iAm1]; iP1 = iP - zOffsetP + xOffsetP; rap_be[iAc] = rb[iR] * a_ce[iAm1] * pa[iP1] + rb[iR] * a_be[iAm1] + a_be[iA] * pa[iP1]; iP1 = iP - zOffsetP + yOffsetP; rap_bn[iAc] = rb[iR] * a_cn[iAm1] * pa[iP1] + rb[iR] * a_bn[iAm1] + a_bn[iA] * pa[iP1]; iP1 = iP - yOffsetP; rap_cs[iAc] = a_cs[iA] + rb[iR] * a_cs[iAm1] * pb[iP1] + ra[iR] * a_cs[iAp1] * pa[iP1] + a_bs[iA] * pb[iP1] + a_as[iA] * pa[iP1] + rb[iR] * a_as[iAm1] + ra[iR] * a_bs[iAp1]; iP1 = iP - xOffsetP; rap_cw[iAc] = a_cw[iA] + rb[iR] * a_cw[iAm1] * pb[iP1] + ra[iR] * a_cw[iAp1] * pa[iP1] + a_bw[iA] * pb[iP1] + a_aw[iA] * pa[iP1] + rb[iR] * a_aw[iAm1] + ra[iR] * a_bw[iAp1]; rap_cc[iAc] = a_cc[iA] + rb[iR] * a_cc[iAm1] * pb[iP] + ra[iR] * a_cc[iAp1] * pa[iP] + rb[iR] * a_ac[iAm1] + ra[iR] * a_bc[iAp1] + a_bc[iA] * pb[iP] + a_ac[iA] * pa[iP]; } hypre_BoxLoop4End(iP, iR, iA, iAc); #undef DEVICE_VAR break; /*-------------------------------------------------------------- * Loop for symmetric 19-point fine grid operator; produces a * symmetric 27-point coarse grid operator. We calculate only the * lower triangular stencil entries: (below-southwest, below-south, * below-southeast, below-west, below-center, below-east, * below-northwest, below-north, below-northeast, center-southwest, * center-south, center-southeast, center-west, and center-center). *--------------------------------------------------------------*/ case 19: hypre_BoxGetSize(cgrid_box, loop_size); #define DEVICE_VAR is_device_ptr(rap_bsw,rb,a_csw,pa,rap_bs,a_cs,a_bs,rap_bse,a_cse,rap_bw,a_cw,a_bw,rap_bc,a_bc,a_cc,rap_be,a_ce,a_be,rap_bnw,a_cnw,rap_bn,a_cn,a_bn,rap_bne,a_cne,rap_csw,pb,ra,rap_cs,a_as,rap_cse,rap_cw,a_aw,rap_cc,a_ac) hypre_BoxLoop4Begin(hypre_StructMatrixNDim(A), loop_size, PT_dbox, cstart, stridec, iP, R_dbox, cstart, stridec, iR, A_dbox, fstart, stridef, iA, RAP_dbox, cstart, stridec, iAc); { HYPRE_Int iAm1 = iA - zOffsetA; HYPRE_Int iAp1 = iA + zOffsetA; HYPRE_Int iP1 = iP - zOffsetP - yOffsetP - xOffsetP; rap_bsw[iAc] = rb[iR] * a_csw[iAm1] * pa[iP1]; iP1 = iP - zOffsetP - yOffsetP; rap_bs[iAc] = rb[iR] * a_cs[iAm1] * pa[iP1] + rb[iR] * a_bs[iAm1] + a_bs[iA] * pa[iP1]; iP1 = iP - zOffsetP - yOffsetP + xOffsetP; rap_bse[iAc] = rb[iR] * a_cse[iAm1] * pa[iP1]; iP1 = iP - zOffsetP - xOffsetP; rap_bw[iAc] = rb[iR] * a_cw[iAm1] * pa[iP1] + rb[iR] * a_bw[iAm1] + a_bw[iA] * pa[iP1]; iP1 = iP - zOffsetP; rap_bc[iAc] = a_bc[iA] * pa[iP1] + rb[iR] * a_cc[iAm1] * pa[iP1] + rb[iR] * a_bc[iAm1]; iP1 = iP - zOffsetP + xOffsetP; rap_be[iAc] = rb[iR] * a_ce[iAm1] * pa[iP1] + rb[iR] * a_be[iAm1] + a_be[iA] * pa[iP1]; iP1 = iP - zOffsetP + yOffsetP - xOffsetP; rap_bnw[iAc] = rb[iR] * a_cnw[iAm1] * pa[iP1]; iP1 = iP - zOffsetP + yOffsetP; rap_bn[iAc] = rb[iR] * a_cn[iAm1] * pa[iP1] + rb[iR] * a_bn[iAm1] + a_bn[iA] * pa[iP1]; iP1 = iP - zOffsetP + yOffsetP + xOffsetP; rap_bne[iAc] = rb[iR] * a_cne[iAm1] * pa[iP1]; iP1 = iP - yOffsetP - xOffsetP; rap_csw[iAc] = a_csw[iA] + rb[iR] * a_csw[iAm1] * pb[iP1] + ra[iR] * a_csw[iAp1] * pa[iP1]; iP1 = iP - yOffsetP; rap_cs[iAc] = a_cs[iA] + rb[iR] * a_cs[iAm1] * pb[iP1] + ra[iR] * a_cs[iAp1] * pa[iP1] + a_bs[iA] * pb[iP1] + a_as[iA] * pa[iP1] + rb[iR] * a_as[iAm1] + ra[iR] * a_bs[iAp1]; iP1 = iP - yOffsetP + xOffsetP; rap_cse[iAc] = a_cse[iA] + rb[iR] * a_cse[iAm1] * pb[iP1] + ra[iR] * a_cse[iAp1] * pa[iP1]; iP1 = iP - xOffsetP; rap_cw[iAc] = a_cw[iA] + rb[iR] * a_cw[iAm1] * pb[iP1] + ra[iR] * a_cw[iAp1] * pa[iP1] + a_bw[iA] * pb[iP1] + a_aw[iA] * pa[iP1] + rb[iR] * a_aw[iAm1] + ra[iR] * a_bw[iAp1]; rap_cc[iAc] = a_cc[iA] + rb[iR] * a_cc[iAm1] * pb[iP] + ra[iR] * a_cc[iAp1] * pa[iP] + rb[iR] * a_ac[iAm1] + ra[iR] * a_bc[iAp1] + a_bc[iA] * pb[iP] + a_ac[iA] * pa[iP]; } hypre_BoxLoop4End(iP, iR, iA, iAc); #undef DEVICE_VAR break; /*-------------------------------------------------------------- * Loop for symmetric 27-point fine grid operator; produces a * symmetric 27-point coarse grid operator. We calculate only the * lower triangular stencil entries: (below-southwest, below-south, * below-southeast, below-west, below-center, below-east, * below-northwest, below-north, below-northeast, center-southwest, * center-south, center-southeast, center-west, and center-center). *--------------------------------------------------------------*/ default: hypre_BoxGetSize(cgrid_box, loop_size); #define DEVICE_VAR is_device_ptr(rap_bsw,rb,a_csw,pa,a_bsw,rap_bs,a_cs,a_bs,rap_bse,a_cse,a_bse,rap_bw,a_cw,a_bw,rap_bc,a_bc,a_cc,rap_be,a_ce,a_be,rap_bnw,a_cnw,a_bnw,rap_bn,a_cn,a_bn,rap_bne,a_cne,a_bne,rap_csw,pb,ra,a_asw,rap_cs,a_as,rap_cse,a_ase,rap_cw,a_aw,rap_cc,a_ac) hypre_BoxLoop4Begin(hypre_StructMatrixNDim(A), loop_size, PT_dbox, cstart, stridec, iP, R_dbox, cstart, stridec, iR, A_dbox, fstart, stridef, iA, RAP_dbox, cstart, stridec, iAc); { HYPRE_Int iAm1 = iA - zOffsetA; HYPRE_Int iAp1 = iA + zOffsetA; HYPRE_Int iP1 = iP - zOffsetP - yOffsetP - xOffsetP; rap_bsw[iAc] = rb[iR] * a_csw[iAm1] * pa[iP1] + rb[iR] * a_bsw[iAm1] + a_bsw[iA] * pa[iP1]; iP1 = iP - zOffsetP - yOffsetP; rap_bs[iAc] = rb[iR] * a_cs[iAm1] * pa[iP1] + rb[iR] * a_bs[iAm1] + a_bs[iA] * pa[iP1]; iP1 = iP - zOffsetP - yOffsetP + xOffsetP; rap_bse[iAc] = rb[iR] * a_cse[iAm1] * pa[iP1] + rb[iR] * a_bse[iAm1] + a_bse[iA] * pa[iP1]; iP1 = iP - zOffsetP - xOffsetP; rap_bw[iAc] = rb[iR] * a_cw[iAm1] * pa[iP1] + rb[iR] * a_bw[iAm1] + a_bw[iA] * pa[iP1]; iP1 = iP - zOffsetP; rap_bc[iAc] = a_bc[iA] * pa[iP1] + rb[iR] * a_cc[iAm1] * pa[iP1] + rb[iR] * a_bc[iAm1]; iP1 = iP - zOffsetP + xOffsetP; rap_be[iAc] = rb[iR] * a_ce[iAm1] * pa[iP1] + rb[iR] * a_be[iAm1] + a_be[iA] * pa[iP1]; iP1 = iP - zOffsetP + yOffsetP - xOffsetP; rap_bnw[iAc] = rb[iR] * a_cnw[iAm1] * pa[iP1] + rb[iR] * a_bnw[iAm1] + a_bnw[iA] * pa[iP1]; iP1 = iP - zOffsetP + yOffsetP; rap_bn[iAc] = rb[iR] * a_cn[iAm1] * pa[iP1] + rb[iR] * a_bn[iAm1] + a_bn[iA] * pa[iP1]; iP1 = iP - zOffsetP + yOffsetP + xOffsetP; rap_bne[iAc] = rb[iR] * a_cne[iAm1] * pa[iP1] + rb[iR] * a_bne[iAm1] + a_bne[iA] * pa[iP1]; iP1 = iP - yOffsetP - xOffsetP; rap_csw[iAc] = a_csw[iA] + rb[iR] * a_csw[iAm1] * pb[iP1] + ra[iR] * a_csw[iAp1] * pa[iP1] + a_bsw[iA] * pb[iP1] + a_asw[iA] * pa[iP1] + rb[iR] * a_asw[iAm1] + ra[iR] * a_bsw[iAp1]; iP1 = iP - yOffsetP; rap_cs[iAc] = a_cs[iA] + rb[iR] * a_cs[iAm1] * pb[iP1] + ra[iR] * a_cs[iAp1] * pa[iP1] + a_bs[iA] * pb[iP1] + a_as[iA] * pa[iP1] + rb[iR] * a_as[iAm1] + ra[iR] * a_bs[iAp1]; iP1 = iP - yOffsetP + xOffsetP; rap_cse[iAc] = a_cse[iA] + rb[iR] * a_cse[iAm1] * pb[iP1] + ra[iR] * a_cse[iAp1] * pa[iP1] + a_bse[iA] * pb[iP1] + a_ase[iA] * pa[iP1] + rb[iR] * a_ase[iAm1] + ra[iR] * a_bse[iAp1]; iP1 = iP - xOffsetP; rap_cw[iAc] = a_cw[iA] + rb[iR] * a_cw[iAm1] * pb[iP1] + ra[iR] * a_cw[iAp1] * pa[iP1] + a_bw[iA] * pb[iP1] + a_aw[iA] * pa[iP1] + rb[iR] * a_aw[iAm1] + ra[iR] * a_bw[iAp1]; rap_cc[iAc] = a_cc[iA] + rb[iR] * a_cc[iAm1] * pb[iP] + ra[iR] * a_cc[iAp1] * pa[iP] + rb[iR] * a_ac[iAm1] + ra[iR] * a_bc[iAp1] + a_bc[iA] * pb[iP] + a_ac[iA] * pa[iP]; } hypre_BoxLoop4End(iP, iR, iA, iAc); #undef DEVICE_VAR break; } /* end switch statement */ } /* end ForBoxI */ return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SMG3BuildRAPNoSym( hypre_StructMatrix *A, hypre_StructMatrix *PT, hypre_StructMatrix *R, hypre_StructMatrix *RAP, hypre_Index cindex, hypre_Index cstride ) { hypre_Index index; hypre_StructStencil *fine_stencil; HYPRE_Int fine_stencil_size; hypre_StructGrid *fgrid; HYPRE_Int *fgrid_ids; hypre_StructGrid *cgrid; hypre_BoxArray *cgrid_boxes; HYPRE_Int *cgrid_ids; hypre_Box *cgrid_box; hypre_IndexRef cstart; hypre_Index stridec; hypre_Index fstart; hypre_IndexRef stridef; hypre_Index loop_size; HYPRE_Int fi, ci; hypre_Box *A_dbox; hypre_Box *PT_dbox; hypre_Box *R_dbox; hypre_Box *RAP_dbox; HYPRE_Real *pa, *pb; HYPRE_Real *ra, *rb; HYPRE_Real *a_cc, *a_cw, *a_ce, *a_cs, *a_cn; HYPRE_Real *a_ac, *a_aw = NULL, *a_ae = NULL; HYPRE_Real *a_as = NULL, *a_an = NULL; HYPRE_Real *a_be = NULL, *a_bn = NULL; HYPRE_Real *a_csw = NULL, *a_cse = NULL; HYPRE_Real *a_cnw = NULL, *a_cne = NULL; HYPRE_Real *a_asw = NULL, *a_ase = NULL; HYPRE_Real *a_anw = NULL, *a_ane = NULL; HYPRE_Real *a_bnw = NULL, *a_bne = NULL; HYPRE_Real *rap_ce, *rap_cn; HYPRE_Real *rap_ac, *rap_aw, *rap_ae, *rap_as, *rap_an; HYPRE_Real *rap_cnw = NULL, *rap_cne = NULL; HYPRE_Real *rap_asw = NULL, *rap_ase = NULL; HYPRE_Real *rap_anw = NULL, *rap_ane = NULL; HYPRE_Int zOffsetA; HYPRE_Int xOffsetP; HYPRE_Int yOffsetP; HYPRE_Int zOffsetP; fine_stencil = hypre_StructMatrixStencil(A); fine_stencil_size = hypre_StructStencilSize(fine_stencil); stridef = cstride; hypre_SetIndex3(stridec, 1, 1, 1); fgrid = hypre_StructMatrixGrid(A); fgrid_ids = hypre_StructGridIDs(fgrid); cgrid = hypre_StructMatrixGrid(RAP); cgrid_boxes = hypre_StructGridBoxes(cgrid); cgrid_ids = hypre_StructGridIDs(cgrid); fi = 0; hypre_ForBoxI(ci, cgrid_boxes) { while (fgrid_ids[fi] != cgrid_ids[ci]) { fi++; } cgrid_box = hypre_BoxArrayBox(cgrid_boxes, ci); cstart = hypre_BoxIMin(cgrid_box); hypre_StructMapCoarseToFine(cstart, cindex, cstride, fstart); A_dbox = hypre_BoxArrayBox(hypre_StructMatrixDataSpace(A), fi); PT_dbox = hypre_BoxArrayBox(hypre_StructMatrixDataSpace(PT), fi); R_dbox = hypre_BoxArrayBox(hypre_StructMatrixDataSpace(R), fi); RAP_dbox = hypre_BoxArrayBox(hypre_StructMatrixDataSpace(RAP), ci); /*----------------------------------------------------------------- * Extract pointers for interpolation operator: * pa is pointer for weight for f-point above c-point * pb is pointer for weight for f-point below c-point *-----------------------------------------------------------------*/ hypre_SetIndex3(index, 0, 0, 1); pa = hypre_StructMatrixExtractPointerByIndex(PT, fi, index); hypre_SetIndex3(index, 0, 0, -1); pb = hypre_StructMatrixExtractPointerByIndex(PT, fi, index); /*----------------------------------------------------------------- * Extract pointers for restriction operator: * ra is pointer for weight for f-point above c-point * rb is pointer for weight for f-point below c-point *-----------------------------------------------------------------*/ hypre_SetIndex3(index, 0, 0, 1); ra = hypre_StructMatrixExtractPointerByIndex(R, fi, index); hypre_SetIndex3(index, 0, 0, -1); rb = hypre_StructMatrixExtractPointerByIndex(R, fi, index); /*----------------------------------------------------------------- * Extract pointers for 7-point fine grid operator: * * a_cc is pointer for center coefficient * a_cw is pointer for west coefficient in same plane * a_ce is pointer for east coefficient in same plane * a_cs is pointer for south coefficient in same plane * a_cn is pointer for north coefficient in same plane * a_ac is pointer for center coefficient in plane above * a_bc is pointer for center coefficient in plane below *-----------------------------------------------------------------*/ hypre_SetIndex3(index, 0, 0, 0); a_cc = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index, -1, 0, 0); a_cw = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index, 1, 0, 0); a_ce = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index, 0, -1, 0); a_cs = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index, 0, 1, 0); a_cn = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index, 0, 0, 1); a_ac = hypre_StructMatrixExtractPointerByIndex(A, fi, index); /*----------------------------------------------------------------- * Extract additional pointers for 15-point fine grid operator: * * a_aw is pointer for west coefficient in plane above * a_ae is pointer for east coefficient in plane above * a_as is pointer for south coefficient in plane above * a_an is pointer for north coefficient in plane above * a_bw is pointer for west coefficient in plane below * a_be is pointer for east coefficient in plane below * a_bs is pointer for south coefficient in plane below * a_bn is pointer for north coefficient in plane below *-----------------------------------------------------------------*/ if (fine_stencil_size > 7) { hypre_SetIndex3(index, -1, 0, 1); a_aw = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index, 1, 0, 1); a_ae = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index, 0, -1, 1); a_as = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index, 0, 1, 1); a_an = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index, 1, 0, -1); a_be = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index, 0, 1, -1); a_bn = hypre_StructMatrixExtractPointerByIndex(A, fi, index); } /*----------------------------------------------------------------- * Extract additional pointers for 19-point fine grid operator: * * a_csw is pointer for southwest coefficient in same plane * a_cse is pointer for southeast coefficient in same plane * a_cnw is pointer for northwest coefficient in same plane * a_cne is pointer for northeast coefficient in same plane *-----------------------------------------------------------------*/ if (fine_stencil_size > 15) { hypre_SetIndex3(index, -1, -1, 0); a_csw = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index, 1, -1, 0); a_cse = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index, -1, 1, 0); a_cnw = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index, 1, 1, 0); a_cne = hypre_StructMatrixExtractPointerByIndex(A, fi, index); } /*----------------------------------------------------------------- * Extract additional pointers for 27-point fine grid operator: * * a_asw is pointer for southwest coefficient in plane above * a_ase is pointer for southeast coefficient in plane above * a_anw is pointer for northwest coefficient in plane above * a_ane is pointer for northeast coefficient in plane above * a_bsw is pointer for southwest coefficient in plane below * a_bse is pointer for southeast coefficient in plane below * a_bnw is pointer for northwest coefficient in plane below * a_bne is pointer for northeast coefficient in plane below *-----------------------------------------------------------------*/ if (fine_stencil_size > 19) { hypre_SetIndex3(index, -1, -1, 1); a_asw = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index, 1, -1, 1); a_ase = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index, -1, 1, 1); a_anw = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index, 1, 1, 1); a_ane = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index, -1, 1, -1); a_bnw = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index, 1, 1, -1); a_bne = hypre_StructMatrixExtractPointerByIndex(A, fi, index); } /*----------------------------------------------------------------- * Extract pointers for 15-point coarse grid operator: * * We build only the upper triangular part (excluding diagonal). * * rap_ce is pointer for east coefficient in same plane (etc.) *-----------------------------------------------------------------*/ hypre_SetIndex3(index, 1, 0, 0); rap_ce = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index, 0, 1, 0); rap_cn = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index, 0, 0, 1); rap_ac = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index, -1, 0, 1); rap_aw = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index, 1, 0, 1); rap_ae = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index, 0, -1, 1); rap_as = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index, 0, 1, 1); rap_an = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); /*----------------------------------------------------------------- * Extract additional pointers for 27-point coarse grid operator: * * A 27-point coarse grid operator is produced when the fine grid * stencil is 19 or 27 point. * * We build only the upper triangular part. * * rap_cnw is pointer for northwest coefficient in same plane (etc.) *-----------------------------------------------------------------*/ if (fine_stencil_size > 15) { hypre_SetIndex3(index, -1, 1, 0); rap_cnw = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index, 1, 1, 0); rap_cne = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index, -1, -1, 1); rap_asw = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index, 1, -1, 1); rap_ase = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index, -1, 1, 1); rap_anw = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index, 1, 1, 1); rap_ane = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); } /*----------------------------------------------------------------- * Define offsets for fine grid stencil and interpolation * * In the BoxLoop below I assume iA and iP refer to data associated * with the point which we are building the stencil for. The below * Offsets are used in refering to data associated with other points. *-----------------------------------------------------------------*/ hypre_SetIndex3(index, 0, 0, 1); zOffsetA = hypre_BoxOffsetDistance(A_dbox, index); zOffsetP = hypre_BoxOffsetDistance(PT_dbox, index); hypre_SetIndex3(index, 0, 1, 0); yOffsetP = hypre_BoxOffsetDistance(PT_dbox, index); hypre_SetIndex3(index, 1, 0, 0); xOffsetP = hypre_BoxOffsetDistance(PT_dbox, index); /*----------------------------------------------------------------- * Switch statement to direct control to apropriate BoxLoop depending * on stencil size. Default is full 27-point. *-----------------------------------------------------------------*/ switch (fine_stencil_size) { /*-------------------------------------------------------------- * Loop for 7-point fine grid operator; produces upper triangular * part of 15-point coarse grid operator. stencil entries: * (above-north, above-east, above-center, above-west, * above-south, center-north, and center-east). *--------------------------------------------------------------*/ case 7: hypre_BoxGetSize(cgrid_box, loop_size); #define DEVICE_VAR is_device_ptr(rap_an,ra,a_cn,pb,rap_ae,a_ce,rap_ac,a_ac,a_cc,rap_aw,a_cw,rap_as,a_cs,rap_cn,rb,pa,rap_ce) hypre_BoxLoop4Begin(hypre_StructMatrixNDim(A), loop_size, PT_dbox, cstart, stridec, iP, R_dbox, cstart, stridec, iR, A_dbox, fstart, stridef, iA, RAP_dbox, cstart, stridec, iAc); { HYPRE_Int iAm1 = iA - zOffsetA; HYPRE_Int iAp1 = iA + zOffsetA; HYPRE_Int iP1 = iP + zOffsetP + yOffsetP; rap_an[iAc] = ra[iR] * a_cn[iAp1] * pb[iP1]; iP1 = iP + zOffsetP + xOffsetP; rap_ae[iAc] = ra[iR] * a_ce[iAp1] * pb[iP1]; iP1 = iP + zOffsetP; rap_ac[iAc] = a_ac[iA] * pb[iP1] + ra[iR] * a_cc[iAp1] * pb[iP1] + ra[iR] * a_ac[iAp1]; iP1 = iP + zOffsetP - xOffsetP; rap_aw[iAc] = ra[iR] * a_cw[iAp1] * pb[iP1]; iP1 = iP + zOffsetP - yOffsetP; rap_as[iAc] = ra[iR] * a_cs[iAp1] * pb[iP1]; iP1 = iP + yOffsetP; rap_cn[iAc] = a_cn[iA] + rb[iR] * a_cn[iAm1] * pb[iP1] + ra[iR] * a_cn[iAp1] * pa[iP1]; iP1 = iP + xOffsetP; rap_ce[iAc] = a_ce[iA] + rb[iR] * a_ce[iAm1] * pb[iP1] + ra[iR] * a_ce[iAp1] * pa[iP1]; } hypre_BoxLoop4End(iP, iR, iA, iAc); #undef DEVICE_VAR break; /*-------------------------------------------------------------- * Loop for 15-point fine grid operator; produces upper triangular * part of 15-point coarse grid operator. stencil entries: * (above-north, above-east, above-center, above-west, * above-south, center-north, and center-east). *--------------------------------------------------------------*/ case 15: hypre_BoxGetSize(cgrid_box, loop_size); #define DEVICE_VAR is_device_ptr(rap_an,ra,a_cn,pb,a_an,rap_ae,a_ce,a_ae,rap_ac,a_ac,a_cc,rap_aw,a_cw,a_aw,rap_as,a_cs,a_as,rap_cn,rb,pa,a_bn,rap_ce,a_be) hypre_BoxLoop4Begin(hypre_StructMatrixNDim(A), loop_size, PT_dbox, cstart, stridec, iP, R_dbox, cstart, stridec, iR, A_dbox, fstart, stridef, iA, RAP_dbox, cstart, stridec, iAc); { HYPRE_Int iAm1 = iA - zOffsetA; HYPRE_Int iAp1 = iA + zOffsetA; HYPRE_Int iP1 = iP + zOffsetP + yOffsetP; rap_an[iAc] = ra[iR] * a_cn[iAp1] * pb[iP1] + ra[iR] * a_an[iAp1] + a_an[iA] * pb[iP1]; iP1 = iP + zOffsetP + xOffsetP; rap_ae[iAc] = ra[iR] * a_ce[iAp1] * pb[iP1] + ra[iR] * a_ae[iAp1] + a_ae[iA] * pb[iP1]; iP1 = iP + zOffsetP; rap_ac[iAc] = a_ac[iA] * pb[iP1] + ra[iR] * a_cc[iAp1] * pb[iP1] + ra[iR] * a_ac[iAp1]; iP1 = iP + zOffsetP - xOffsetP; rap_aw[iAc] = ra[iR] * a_cw[iAp1] * pb[iP1] + ra[iR] * a_aw[iAp1] + a_aw[iA] * pb[iP1]; iP1 = iP + zOffsetP - yOffsetP; rap_as[iAc] = ra[iR] * a_cs[iAp1] * pb[iP1] + ra[iR] * a_as[iAp1] + a_as[iA] * pb[iP1]; iP1 = iP + yOffsetP; rap_cn[iAc] = a_cn[iA] + rb[iR] * a_cn[iAm1] * pb[iP1] + ra[iR] * a_cn[iAp1] * pa[iP1] + a_bn[iA] * pb[iP1] + a_an[iA] * pa[iP1] + rb[iR] * a_an[iAm1] + ra[iR] * a_bn[iAp1]; iP1 = iP + xOffsetP; rap_ce[iAc] = a_ce[iA] + rb[iR] * a_ce[iAm1] * pb[iP1] + ra[iR] * a_ce[iAp1] * pa[iP1] + a_be[iA] * pb[iP1] + a_ae[iA] * pa[iP1] + rb[iR] * a_ae[iAm1] + ra[iR] * a_be[iAp1]; } hypre_BoxLoop4End(iP, iR, iA, iAc); #undef DEVICE_VAR break; /*-------------------------------------------------------------- * Loop for 19-point fine grid operator; produces upper triangular * part of 27-point coarse grid operator. stencil entries: * (above-northeast, above-north, above-northwest, above-east, * above-center, above-west, above-southeast, above-south, * above-southwest, center-northeast, center-north, * center-northwest, and center-east). *--------------------------------------------------------------*/ case 19: hypre_BoxGetSize(cgrid_box, loop_size); #define DEVICE_VAR is_device_ptr(rap_ane,ra,a_cne,pb,rap_an,a_cn,a_an,rap_anw,a_cnw,rap_ae,a_ce,a_ae,rap_ac,a_ac,a_cc,rap_aw,a_cw,a_aw,rap_ase,a_cse,rap_as,a_cs,a_as,rap_asw,a_csw,rap_cne,rb,pa,rap_cn,a_bn,rap_cnw,rap_ce,a_be) hypre_BoxLoop4Begin(hypre_StructMatrixNDim(A), loop_size, PT_dbox, cstart, stridec, iP, R_dbox, cstart, stridec, iR, A_dbox, fstart, stridef, iA, RAP_dbox, cstart, stridec, iAc); { HYPRE_Int iAm1 = iA - zOffsetA; HYPRE_Int iAp1 = iA + zOffsetA; HYPRE_Int iP1 = iP + zOffsetP + yOffsetP + xOffsetP; rap_ane[iAc] = ra[iR] * a_cne[iAp1] * pb[iP1]; iP1 = iP + zOffsetP + yOffsetP; rap_an[iAc] = ra[iR] * a_cn[iAp1] * pb[iP1] + ra[iR] * a_an[iAp1] + a_an[iA] * pb[iP1]; iP1 = iP + zOffsetP + yOffsetP - xOffsetP; rap_anw[iAc] = ra[iR] * a_cnw[iAp1] * pb[iP1]; iP1 = iP + zOffsetP + xOffsetP; rap_ae[iAc] = ra[iR] * a_ce[iAp1] * pb[iP1] + ra[iR] * a_ae[iAp1] + a_ae[iA] * pb[iP1]; iP1 = iP + zOffsetP; rap_ac[iAc] = a_ac[iA] * pb[iP1] + ra[iR] * a_cc[iAp1] * pb[iP1] + ra[iR] * a_ac[iAp1]; iP1 = iP + zOffsetP - xOffsetP; rap_aw[iAc] = ra[iR] * a_cw[iAp1] * pb[iP1] + ra[iR] * a_aw[iAp1] + a_aw[iA] * pb[iP1]; iP1 = iP + zOffsetP - yOffsetP + xOffsetP; rap_ase[iAc] = ra[iR] * a_cse[iAp1] * pb[iP1]; iP1 = iP + zOffsetP - yOffsetP; rap_as[iAc] = ra[iR] * a_cs[iAp1] * pb[iP1] + ra[iR] * a_as[iAp1] + a_as[iA] * pb[iP1]; iP1 = iP + zOffsetP - yOffsetP - xOffsetP; rap_asw[iAc] = ra[iR] * a_csw[iAp1] * pb[iP1]; iP1 = iP + yOffsetP + xOffsetP; rap_cne[iAc] = a_cne[iA] + rb[iR] * a_cne[iAm1] * pb[iP1] + ra[iR] * a_cne[iAp1] * pa[iP1]; iP1 = iP + yOffsetP; rap_cn[iAc] = a_cn[iA] + rb[iR] * a_cn[iAm1] * pb[iP1] + ra[iR] * a_cn[iAp1] * pa[iP1] + a_bn[iA] * pb[iP1] + a_an[iA] * pa[iP1] + rb[iR] * a_an[iAm1] + ra[iR] * a_bn[iAp1]; iP1 = iP + yOffsetP - xOffsetP; rap_cnw[iAc] = a_cnw[iA] + rb[iR] * a_cnw[iAm1] * pb[iP1] + ra[iR] * a_cnw[iAp1] * pa[iP1]; iP1 = iP + xOffsetP; rap_ce[iAc] = a_ce[iA] + rb[iR] * a_ce[iAm1] * pb[iP1] + ra[iR] * a_ce[iAp1] * pa[iP1] + a_be[iA] * pb[iP1] + a_ae[iA] * pa[iP1] + rb[iR] * a_ae[iAm1] + ra[iR] * a_be[iAp1]; } hypre_BoxLoop4End(iP, iR, iA, iAc); #undef DEVICE_VAR break; /*-------------------------------------------------------------- * Loop for 27-point fine grid operator; produces upper triangular * part of 27-point coarse grid operator. stencil entries: * (above-northeast, above-north, above-northwest, above-east, * above-center, above-west, above-southeast, above-south, * above-southwest, center-northeast, center-north, * center-northwest, and center-east). *--------------------------------------------------------------*/ default: hypre_BoxGetSize(cgrid_box, loop_size); #define DEVICE_VAR is_device_ptr(rap_ane,ra,a_cne,pb,a_ane,rap_an,a_cn,a_an,rap_anw,a_cnw,a_anw,rap_ae,a_ce,a_ae,rap_ac,a_ac,a_cc,rap_aw,a_cw,a_aw,rap_ase,a_cse,a_ase,rap_as,a_cs,a_as,rap_asw,a_csw,a_asw,rap_cne,rb,pa,a_bne,rap_cn,a_bn,rap_cnw,a_bnw,rap_ce,a_be) hypre_BoxLoop4Begin(hypre_StructMatrixNDim(A), loop_size, PT_dbox, cstart, stridec, iP, R_dbox, cstart, stridec, iR, A_dbox, fstart, stridef, iA, RAP_dbox, cstart, stridec, iAc); { HYPRE_Int iAm1 = iA - zOffsetA; HYPRE_Int iAp1 = iA + zOffsetA; HYPRE_Int iP1 = iP + zOffsetP + yOffsetP + xOffsetP; rap_ane[iAc] = ra[iR] * a_cne[iAp1] * pb[iP1] + ra[iR] * a_ane[iAp1] + a_ane[iA] * pb[iP1]; iP1 = iP + zOffsetP + yOffsetP; rap_an[iAc] = ra[iR] * a_cn[iAp1] * pb[iP1] + ra[iR] * a_an[iAp1] + a_an[iA] * pb[iP1]; iP1 = iP + zOffsetP + yOffsetP - xOffsetP; rap_anw[iAc] = ra[iR] * a_cnw[iAp1] * pb[iP1] + ra[iR] * a_anw[iAp1] + a_anw[iA] * pb[iP1]; iP1 = iP + zOffsetP + xOffsetP; rap_ae[iAc] = ra[iR] * a_ce[iAp1] * pb[iP1] + ra[iR] * a_ae[iAp1] + a_ae[iA] * pb[iP1]; iP1 = iP + zOffsetP; rap_ac[iAc] = a_ac[iA] * pb[iP1] + ra[iR] * a_cc[iAp1] * pb[iP1] + ra[iR] * a_ac[iAp1]; iP1 = iP + zOffsetP - xOffsetP; rap_aw[iAc] = ra[iR] * a_cw[iAp1] * pb[iP1] + ra[iR] * a_aw[iAp1] + a_aw[iA] * pb[iP1]; iP1 = iP + zOffsetP - yOffsetP + xOffsetP; rap_ase[iAc] = ra[iR] * a_cse[iAp1] * pb[iP1] + ra[iR] * a_ase[iAp1] + a_ase[iA] * pb[iP1]; iP1 = iP + zOffsetP - yOffsetP; rap_as[iAc] = ra[iR] * a_cs[iAp1] * pb[iP1] + ra[iR] * a_as[iAp1] + a_as[iA] * pb[iP1]; iP1 = iP + zOffsetP - yOffsetP - xOffsetP; rap_asw[iAc] = ra[iR] * a_csw[iAp1] * pb[iP1] + ra[iR] * a_asw[iAp1] + a_asw[iA] * pb[iP1]; iP1 = iP + yOffsetP + xOffsetP; rap_cne[iAc] = a_cne[iA] + rb[iR] * a_cne[iAm1] * pb[iP1] + ra[iR] * a_cne[iAp1] * pa[iP1] + a_bne[iA] * pb[iP1] + a_ane[iA] * pa[iP1] + rb[iR] * a_ane[iAm1] + ra[iR] * a_bne[iAp1]; iP1 = iP + yOffsetP; rap_cn[iAc] = a_cn[iA] + rb[iR] * a_cn[iAm1] * pb[iP1] + ra[iR] * a_cn[iAp1] * pa[iP1] + a_bn[iA] * pb[iP1] + a_an[iA] * pa[iP1] + rb[iR] * a_an[iAm1] + ra[iR] * a_bn[iAp1]; iP1 = iP + yOffsetP - xOffsetP; rap_cnw[iAc] = a_cnw[iA] + rb[iR] * a_cnw[iAm1] * pb[iP1] + ra[iR] * a_cnw[iAp1] * pa[iP1] + a_bnw[iA] * pb[iP1] + a_anw[iA] * pa[iP1] + rb[iR] * a_anw[iAm1] + ra[iR] * a_bnw[iAp1]; iP1 = iP + xOffsetP; rap_ce[iAc] = a_ce[iA] + rb[iR] * a_ce[iAm1] * pb[iP1] + ra[iR] * a_ce[iAp1] * pa[iP1] + a_be[iA] * pb[iP1] + a_ae[iA] * pa[iP1] + rb[iR] * a_ae[iAm1] + ra[iR] * a_be[iAp1]; } hypre_BoxLoop4End(iP, iR, iA, iAc); #undef DEVICE_VAR break; } /* end switch statement */ } /* end ForBoxI */ return hypre_error_flag; } /*-------------------------------------------------------------------------- * Collapses stencil in periodic direction on coarsest grid. *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SMG3RAPPeriodicSym( hypre_StructMatrix *RAP, hypre_Index cindex, hypre_Index cstride ) { HYPRE_UNUSED_VAR(cindex); HYPRE_UNUSED_VAR(cstride); hypre_Index index; hypre_StructGrid *cgrid; hypre_BoxArray *cgrid_boxes; hypre_Box *cgrid_box; hypre_IndexRef cstart; hypre_Index stridec; hypre_Index loop_size; HYPRE_Int ci; hypre_Box *RAP_dbox; HYPRE_Real *rap_bc, *rap_bw, *rap_be, *rap_bs, *rap_bn; HYPRE_Real *rap_cc, *rap_cw, *rap_cs; HYPRE_Real *rap_bsw = NULL, *rap_bse = NULL; HYPRE_Real *rap_bnw = NULL, *rap_bne = NULL; HYPRE_Real *rap_csw = NULL, *rap_cse = NULL; HYPRE_Int xOffset; HYPRE_Int yOffset; HYPRE_Real zero = 0.0; hypre_StructStencil *stencil; HYPRE_Int stencil_size; stencil = hypre_StructMatrixStencil(RAP); stencil_size = hypre_StructStencilSize(stencil); hypre_SetIndex3(stridec, 1, 1, 1); cgrid = hypre_StructMatrixGrid(RAP); cgrid_boxes = hypre_StructGridBoxes(cgrid); if (hypre_IndexZ(hypre_StructGridPeriodic(cgrid)) == 1) { hypre_StructMatrixAssemble(RAP); hypre_ForBoxI(ci, cgrid_boxes) { cgrid_box = hypre_BoxArrayBox(cgrid_boxes, ci); cstart = hypre_BoxIMin(cgrid_box); RAP_dbox = hypre_BoxArrayBox(hypre_StructMatrixDataSpace(RAP), ci); hypre_SetIndex3(index, 1, 0, 0); xOffset = hypre_BoxOffsetDistance(RAP_dbox, index); hypre_SetIndex3(index, 0, 1, 0); yOffset = hypre_BoxOffsetDistance(RAP_dbox, index); /*----------------------------------------------------------------- * Extract pointers for 15-point coarse grid operator: *-----------------------------------------------------------------*/ hypre_SetIndex3(index, 0, 0, -1); rap_bc = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index, -1, 0, -1); rap_bw = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index, 1, 0, -1); rap_be = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index, 0, -1, -1); rap_bs = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index, 0, 1, -1); rap_bn = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index, 0, 0, 0); rap_cc = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index, -1, 0, 0); rap_cw = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index, 0, -1, 0); rap_cs = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); /*----------------------------------------------------------------- * Extract additional pointers for 27-point coarse grid operator: *-----------------------------------------------------------------*/ if (stencil_size == 27) { hypre_SetIndex3(index, -1, -1, -1); rap_bsw = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index, 1, -1, -1); rap_bse = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index, -1, 1, -1); rap_bnw = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index, 1, 1, -1); rap_bne = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index, -1, -1, 0); rap_csw = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index, 1, -1, 0); rap_cse = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); } /*----------------------------------------------------------------- * Collapse 15 point operator. *-----------------------------------------------------------------*/ hypre_BoxGetSize(cgrid_box, loop_size); #define DEVICE_VAR is_device_ptr(rap_cc,rap_bc,rap_cw,rap_bw,rap_be,rap_cs,rap_bs,rap_bn) hypre_BoxLoop1Begin(hypre_StructMatrixNDim(RAP), loop_size, RAP_dbox, cstart, stridec, iAc); { HYPRE_Int iAcmx = iAc - xOffset; HYPRE_Int iAcmy = iAc - yOffset; rap_cc[iAc] += (2.0 * rap_bc[iAc]); rap_cw[iAc] += (rap_bw[iAc] + rap_be[iAcmx]); rap_cs[iAc] += (rap_bs[iAc] + rap_bn[iAcmy]); } hypre_BoxLoop1End(iAc); #undef DEVICE_VAR #define DEVICE_VAR is_device_ptr(rap_bc,rap_bw,rap_be,rap_bs,rap_bn) hypre_BoxLoop1Begin(hypre_StructMatrixNDim(RAP), loop_size, RAP_dbox, cstart, stridec, iAc); { rap_bc[iAc] = zero; rap_bw[iAc] = zero; rap_be[iAc] = zero; rap_bs[iAc] = zero; rap_bn[iAc] = zero; } hypre_BoxLoop1End(iAc); #undef DEVICE_VAR /*----------------------------------------------------------------- * Collapse additional entries for 27 point operator. *-----------------------------------------------------------------*/ if (stencil_size == 27) { hypre_BoxGetSize(cgrid_box, loop_size); #define DEVICE_VAR is_device_ptr(rap_csw,rap_bsw,rap_bne,rap_cse,rap_bse,rap_bnw) hypre_BoxLoop1Begin(hypre_StructMatrixNDim(RAP), loop_size, RAP_dbox, cstart, stridec, iAc); { HYPRE_Int iAcmxmy = iAc - xOffset - yOffset; HYPRE_Int iAcpxmy = iAc + xOffset - yOffset; rap_csw[iAc] += (rap_bsw[iAc] + rap_bne[iAcmxmy]); rap_cse[iAc] += (rap_bse[iAc] + rap_bnw[iAcpxmy]); } hypre_BoxLoop1End(iAc); #undef DEVICE_VAR #define DEVICE_VAR is_device_ptr(rap_bsw,rap_bse,rap_bnw,rap_bne) hypre_BoxLoop1Begin(hypre_StructMatrixNDim(RAP), loop_size, RAP_dbox, cstart, stridec, iAc); { rap_bsw[iAc] = zero; rap_bse[iAc] = zero; rap_bnw[iAc] = zero; rap_bne[iAc] = zero; } hypre_BoxLoop1End(iAc); #undef DEVICE_VAR } } /* end ForBoxI */ } return hypre_error_flag; } /*-------------------------------------------------------------------------- * Collapses stencil in periodic direction on coarsest grid. *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SMG3RAPPeriodicNoSym( hypre_StructMatrix *RAP, hypre_Index cindex, hypre_Index cstride ) { HYPRE_UNUSED_VAR(cindex); HYPRE_UNUSED_VAR(cstride); hypre_Index index; hypre_StructGrid *cgrid; hypre_BoxArray *cgrid_boxes; hypre_Box *cgrid_box; hypre_IndexRef cstart; hypre_Index stridec; hypre_Index loop_size; HYPRE_Int ci; hypre_Box *RAP_dbox; HYPRE_Real *rap_bc, *rap_bw, *rap_be, *rap_bs, *rap_bn; HYPRE_Real *rap_cc, *rap_cw, *rap_ce, *rap_cs, *rap_cn; HYPRE_Real *rap_ac, *rap_aw, *rap_ae, *rap_as, *rap_an; HYPRE_Real *rap_bsw, *rap_bse, *rap_bnw, *rap_bne; HYPRE_Real *rap_csw, *rap_cse, *rap_cnw, *rap_cne; HYPRE_Real *rap_asw, *rap_ase, *rap_anw, *rap_ane; HYPRE_Real zero = 0.0; hypre_StructStencil *stencil; HYPRE_Int stencil_size; stencil = hypre_StructMatrixStencil(RAP); stencil_size = hypre_StructStencilSize(stencil); hypre_SetIndex3(stridec, 1, 1, 1); cgrid = hypre_StructMatrixGrid(RAP); cgrid_boxes = hypre_StructGridBoxes(cgrid); if (hypre_IndexZ(hypre_StructGridPeriodic(cgrid)) == 1) { hypre_ForBoxI(ci, cgrid_boxes) { cgrid_box = hypre_BoxArrayBox(cgrid_boxes, ci); cstart = hypre_BoxIMin(cgrid_box); RAP_dbox = hypre_BoxArrayBox(hypre_StructMatrixDataSpace(RAP), ci); /*----------------------------------------------------------------- * Extract pointers for 15-point coarse grid operator: *-----------------------------------------------------------------*/ hypre_SetIndex3(index, 0, 0, -1); rap_bc = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index, -1, 0, -1); rap_bw = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index, 1, 0, -1); rap_be = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index, 0, -1, -1); rap_bs = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index, 0, 1, -1); rap_bn = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index, 0, 0, 0); rap_cc = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index, -1, 0, 0); rap_cw = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index, 1, 0, 0); rap_ce = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index, 0, -1, 0); rap_cs = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index, 0, 1, 0); rap_cn = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index, 0, 0, 1); rap_ac = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index, -1, 0, 1); rap_aw = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index, 1, 0, 1); rap_ae = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index, 0, -1, 1); rap_as = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index, 0, 1, 1); rap_an = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); /*----------------------------------------------------------------- * Extract additional pointers for 27-point coarse grid operator: *-----------------------------------------------------------------*/ if (stencil_size == 27) { hypre_SetIndex3(index, -1, -1, -1); rap_bsw = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index, 1, -1, -1); rap_bse = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index, -1, 1, -1); rap_bnw = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index, 1, 1, -1); rap_bne = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index, -1, -1, 0); rap_csw = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index, 1, -1, 0); rap_cse = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index, -1, 1, 0); rap_cnw = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index, 1, 1, 0); rap_cne = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index, -1, -1, 1); rap_asw = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index, 1, -1, 1); rap_ase = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index, -1, 1, 1); rap_anw = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index, 1, 1, 1); rap_ane = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); } /*----------------------------------------------------------------- * Collapse 15 point operator. *-----------------------------------------------------------------*/ hypre_BoxGetSize(cgrid_box, loop_size); #define DEVICE_VAR is_device_ptr(rap_cc,rap_bc,rap_ac,rap_cw,rap_bw,rap_aw,rap_ce,rap_be,rap_ae,rap_cs,rap_bs,rap_as,rap_cn,rap_bn,rap_an) hypre_BoxLoop1Begin(hypre_StructMatrixNDim(RAP), loop_size, RAP_dbox, cstart, stridec, iAc); { rap_cc[iAc] += (rap_bc[iAc] + rap_ac[iAc]); rap_bc[iAc] = zero; rap_ac[iAc] = zero; rap_cw[iAc] += (rap_bw[iAc] + rap_aw[iAc]); rap_bw[iAc] = zero; rap_aw[iAc] = zero; rap_ce[iAc] += (rap_be[iAc] + rap_ae[iAc]); rap_be[iAc] = zero; rap_ae[iAc] = zero; rap_cs[iAc] += (rap_bs[iAc] + rap_as[iAc]); rap_bs[iAc] = zero; rap_as[iAc] = zero; rap_cn[iAc] += (rap_bn[iAc] + rap_an[iAc]); rap_bn[iAc] = zero; rap_an[iAc] = zero; } hypre_BoxLoop1End(iAc); #undef DEVICE_VAR /*----------------------------------------------------------------- * Collapse additional entries for 27 point operator. *-----------------------------------------------------------------*/ if (stencil_size == 27) { hypre_BoxGetSize(cgrid_box, loop_size); #define DEVICE_VAR is_device_ptr(rap_csw,rap_bsw,rap_asw,rap_cse,rap_bse,rap_ase,rap_cnw,rap_bnw,rap_anw,rap_cne,rap_bne,rap_ane) hypre_BoxLoop1Begin(hypre_StructMatrixNDim(RAP), loop_size, RAP_dbox, cstart, stridec, iAc); { rap_csw[iAc] += (rap_bsw[iAc] + rap_asw[iAc]); rap_bsw[iAc] = zero; rap_asw[iAc] = zero; rap_cse[iAc] += (rap_bse[iAc] + rap_ase[iAc]); rap_bse[iAc] = zero; rap_ase[iAc] = zero; rap_cnw[iAc] += (rap_bnw[iAc] + rap_anw[iAc]); rap_bnw[iAc] = zero; rap_anw[iAc] = zero; rap_cne[iAc] += (rap_bne[iAc] + rap_ane[iAc]); rap_bne[iAc] = zero; rap_ane[iAc] = zero; } hypre_BoxLoop1End(iAc); #undef DEVICE_VAR } } /* end ForBoxI */ } return hypre_error_flag; } hypre-2.33.0/src/struct_ls/smg_axpy.c000066400000000000000000000040371477326011500175440ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "_hypre_struct_ls.h" #include "_hypre_struct_mv.hpp" /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SMGAxpy( HYPRE_Real alpha, hypre_StructVector *x, hypre_StructVector *y, hypre_Index base_index, hypre_Index base_stride ) { HYPRE_Int ndim = hypre_StructVectorNDim(x); hypre_Box *x_data_box; hypre_Box *y_data_box; HYPRE_Real *xp; HYPRE_Real *yp; hypre_BoxArray *boxes; hypre_Box *box; hypre_Index loop_size; hypre_IndexRef start; HYPRE_Int i; box = hypre_BoxCreate(ndim); boxes = hypre_StructGridBoxes(hypre_StructVectorGrid(y)); hypre_ForBoxI(i, boxes) { hypre_CopyBox(hypre_BoxArrayBox(boxes, i), box); hypre_ProjectBox(box, base_index, base_stride); start = hypre_BoxIMin(box); x_data_box = hypre_BoxArrayBox(hypre_StructVectorDataSpace(x), i); y_data_box = hypre_BoxArrayBox(hypre_StructVectorDataSpace(y), i); xp = hypre_StructVectorBoxData(x, i); yp = hypre_StructVectorBoxData(y, i); hypre_BoxGetStrideSize(box, base_stride, loop_size); #define DEVICE_VAR is_device_ptr(yp,xp) hypre_BoxLoop2Begin(hypre_StructVectorNDim(x), loop_size, x_data_box, start, base_stride, xi, y_data_box, start, base_stride, yi); { yp[yi] += alpha * xp[xi]; } hypre_BoxLoop2End(xi, yi); #undef DEVICE_VAR } hypre_BoxDestroy(box); return hypre_error_flag; } hypre-2.33.0/src/struct_ls/smg_relax.c000066400000000000000000000767771477326011500177220ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "_hypre_struct_ls.h" /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ typedef struct { HYPRE_Int setup_temp_vec; HYPRE_Int setup_a_rem; HYPRE_Int setup_a_sol; MPI_Comm comm; HYPRE_Int memory_use; HYPRE_Real tol; HYPRE_Int max_iter; HYPRE_Int zero_guess; HYPRE_Int num_spaces; HYPRE_Int *space_indices; HYPRE_Int *space_strides; HYPRE_Int num_pre_spaces; HYPRE_Int num_reg_spaces; HYPRE_Int *pre_space_ranks; HYPRE_Int *reg_space_ranks; hypre_Index base_index; hypre_Index base_stride; hypre_BoxArray *base_box_array; HYPRE_Int stencil_dim; hypre_StructMatrix *A; hypre_StructVector *b; hypre_StructVector *x; hypre_StructVector *temp_vec; hypre_StructMatrix *A_sol; /* Coefficients of A that make up the (sol)ve part of the relaxation */ hypre_StructMatrix *A_rem; /* Coefficients of A (rem)aining: A_rem = A - A_sol */ void **residual_data; /* Array of size `num_spaces' */ void **solve_data; /* Array of size `num_spaces' */ /* log info (always logged) */ HYPRE_Int num_iterations; HYPRE_Int time_index; HYPRE_Int num_pre_relax; HYPRE_Int num_post_relax; HYPRE_Int max_level; } hypre_SMGRelaxData; /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ void * hypre_SMGRelaxCreate( MPI_Comm comm ) { hypre_SMGRelaxData *relax_data; relax_data = hypre_CTAlloc(hypre_SMGRelaxData, 1, HYPRE_MEMORY_HOST); (relax_data -> setup_temp_vec) = 1; (relax_data -> setup_a_rem) = 1; (relax_data -> setup_a_sol) = 1; (relax_data -> comm) = comm; (relax_data -> base_box_array) = NULL; (relax_data -> time_index) = hypre_InitializeTiming("SMGRelax"); /* set defaults */ (relax_data -> memory_use) = 0; (relax_data -> tol) = 1.0e-06; (relax_data -> max_iter) = 1000; (relax_data -> zero_guess) = 0; (relax_data -> num_spaces) = 1; (relax_data -> space_indices) = hypre_TAlloc(HYPRE_Int, 1, HYPRE_MEMORY_HOST); (relax_data -> space_strides) = hypre_TAlloc(HYPRE_Int, 1, HYPRE_MEMORY_HOST); (relax_data -> space_indices[0]) = 0; (relax_data -> space_strides[0]) = 1; (relax_data -> num_pre_spaces) = 0; (relax_data -> num_reg_spaces) = 1; (relax_data -> pre_space_ranks) = NULL; (relax_data -> reg_space_ranks) = hypre_TAlloc(HYPRE_Int, 1, HYPRE_MEMORY_HOST); (relax_data -> reg_space_ranks[0]) = 0; hypre_SetIndex3((relax_data -> base_index), 0, 0, 0); hypre_SetIndex3((relax_data -> base_stride), 1, 1, 1); (relax_data -> A) = NULL; (relax_data -> b) = NULL; (relax_data -> x) = NULL; (relax_data -> temp_vec) = NULL; (relax_data -> num_pre_relax) = 1; (relax_data -> num_post_relax) = 1; (relax_data -> max_level) = -1; return (void *) relax_data; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SMGRelaxDestroyTempVec( void *relax_vdata ) { hypre_SMGRelaxData *relax_data = (hypre_SMGRelaxData *)relax_vdata; hypre_StructVectorDestroy(relax_data -> temp_vec); (relax_data -> setup_temp_vec) = 1; return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SMGRelaxDestroyARem( void *relax_vdata ) { hypre_SMGRelaxData *relax_data = (hypre_SMGRelaxData *)relax_vdata; HYPRE_Int i; if (relax_data -> A_rem) { for (i = 0; i < (relax_data -> num_spaces); i++) { hypre_SMGResidualDestroy(relax_data -> residual_data[i]); } hypre_TFree(relax_data -> residual_data, HYPRE_MEMORY_HOST); hypre_StructMatrixDestroy(relax_data -> A_rem); (relax_data -> A_rem) = NULL; } (relax_data -> setup_a_rem) = 1; return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SMGRelaxDestroyASol( void *relax_vdata ) { hypre_SMGRelaxData *relax_data = (hypre_SMGRelaxData *)relax_vdata; HYPRE_Int stencil_dim; HYPRE_Int i; if (relax_data -> A_sol) { stencil_dim = (relax_data -> stencil_dim); for (i = 0; i < (relax_data -> num_spaces); i++) { if (stencil_dim > 2) { hypre_SMGDestroy(relax_data -> solve_data[i]); } else { hypre_CyclicReductionDestroy(relax_data -> solve_data[i]); } } hypre_TFree(relax_data -> solve_data, HYPRE_MEMORY_HOST); hypre_StructMatrixDestroy(relax_data -> A_sol); (relax_data -> A_sol) = NULL; } (relax_data -> setup_a_sol) = 1; return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SMGRelaxDestroy( void *relax_vdata ) { hypre_SMGRelaxData *relax_data = (hypre_SMGRelaxData *)relax_vdata; if (relax_data) { hypre_TFree(relax_data -> space_indices, HYPRE_MEMORY_HOST); hypre_TFree(relax_data -> space_strides, HYPRE_MEMORY_HOST); hypre_TFree(relax_data -> pre_space_ranks, HYPRE_MEMORY_HOST); hypre_TFree(relax_data -> reg_space_ranks, HYPRE_MEMORY_HOST); hypre_BoxArrayDestroy(relax_data -> base_box_array); hypre_StructMatrixDestroy(relax_data -> A); hypre_StructVectorDestroy(relax_data -> b); hypre_StructVectorDestroy(relax_data -> x); hypre_SMGRelaxDestroyTempVec(relax_vdata); hypre_SMGRelaxDestroyARem(relax_vdata); hypre_SMGRelaxDestroyASol(relax_vdata); hypre_FinalizeTiming(relax_data -> time_index); hypre_TFree(relax_data, HYPRE_MEMORY_HOST); } return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SMGRelax( void *relax_vdata, hypre_StructMatrix *A, hypre_StructVector *b, hypre_StructVector *x ) { hypre_SMGRelaxData *relax_data = (hypre_SMGRelaxData *)relax_vdata; HYPRE_Int zero_guess; HYPRE_Int stencil_dim; hypre_StructVector *temp_vec; hypre_StructMatrix *A_sol; hypre_StructMatrix *A_rem; void **residual_data; void **solve_data; hypre_IndexRef base_stride; hypre_BoxArray *base_box_a; HYPRE_Real zero = 0.0; HYPRE_Int max_iter; HYPRE_Int num_spaces; HYPRE_Int *space_ranks; HYPRE_Int i, j, k, is; /*---------------------------------------------------------- * Note: The zero_guess stuff is not handled correctly * for general relaxation parameters. It is correct when * the spaces are independent sets in the direction of * relaxation. *----------------------------------------------------------*/ hypre_BeginTiming(relax_data -> time_index); /*---------------------------------------------------------- * Set up the solver *----------------------------------------------------------*/ /* insure that the solver memory gets fully set up */ if ((relax_data -> setup_a_sol) > 0) { (relax_data -> setup_a_sol) = 2; } hypre_SMGRelaxSetup(relax_vdata, A, b, x); zero_guess = (relax_data -> zero_guess); stencil_dim = (relax_data -> stencil_dim); temp_vec = (relax_data -> temp_vec); A_sol = (relax_data -> A_sol); A_rem = (relax_data -> A_rem); residual_data = (relax_data -> residual_data); solve_data = (relax_data -> solve_data); /*---------------------------------------------------------- * Set zero values *----------------------------------------------------------*/ if (zero_guess) { base_stride = (relax_data -> base_stride); base_box_a = (relax_data -> base_box_array); hypre_SMGSetStructVectorConstantValues(x, zero, base_box_a, base_stride); } /*---------------------------------------------------------- * Iterate *----------------------------------------------------------*/ for (k = 0; k < 2; k++) { switch (k) { /* Do pre-relaxation iterations */ case 0: max_iter = 1; num_spaces = (relax_data -> num_pre_spaces); space_ranks = (relax_data -> pre_space_ranks); break; /* Do regular relaxation iterations */ case 1: max_iter = (relax_data -> max_iter); num_spaces = (relax_data -> num_reg_spaces); space_ranks = (relax_data -> reg_space_ranks); break; } for (i = 0; i < max_iter; i++) { for (j = 0; j < num_spaces; j++) { is = space_ranks[j]; hypre_SMGResidual(residual_data[is], A_rem, x, b, temp_vec); if (stencil_dim > 2) { hypre_SMGSolve(solve_data[is], A_sol, temp_vec, x); } else { hypre_CyclicReduction(solve_data[is], A_sol, temp_vec, x); } } (relax_data -> num_iterations) = (i + 1); } } /*---------------------------------------------------------- * Free up memory according to memory_use parameter *----------------------------------------------------------*/ if ((stencil_dim - 1) <= (relax_data -> memory_use)) { hypre_SMGRelaxDestroyASol(relax_vdata); } hypre_EndTiming(relax_data -> time_index); return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SMGRelaxSetup( void *relax_vdata, hypre_StructMatrix *A, hypre_StructVector *b, hypre_StructVector *x ) { hypre_SMGRelaxData *relax_data = (hypre_SMGRelaxData *)relax_vdata; HYPRE_Int stencil_dim; HYPRE_Int a_sol_test; stencil_dim = hypre_StructStencilNDim(hypre_StructMatrixStencil(A)); (relax_data -> stencil_dim) = stencil_dim; hypre_StructMatrixDestroy(relax_data -> A); hypre_StructVectorDestroy(relax_data -> b); hypre_StructVectorDestroy(relax_data -> x); (relax_data -> A) = hypre_StructMatrixRef(A); (relax_data -> b) = hypre_StructVectorRef(b); (relax_data -> x) = hypre_StructVectorRef(x); /*---------------------------------------------------------- * Set up memory according to memory_use parameter. * * If a subset of the solver memory is not to be set up * until the solve is actually done, it's "setup" tag * should have a value greater than 1. *----------------------------------------------------------*/ if ((stencil_dim - 1) <= (relax_data -> memory_use)) { a_sol_test = 1; } else { a_sol_test = 0; } /*---------------------------------------------------------- * Set up the solver *----------------------------------------------------------*/ if ((relax_data -> setup_temp_vec) > 0) { hypre_SMGRelaxSetupTempVec(relax_vdata, A, b, x); } if ((relax_data -> setup_a_rem) > 0) { hypre_SMGRelaxSetupARem(relax_vdata, A, b, x); } if ((relax_data -> setup_a_sol) > a_sol_test) { hypre_SMGRelaxSetupASol(relax_vdata, A, b, x); } if ((relax_data -> base_box_array) == NULL) { hypre_SMGRelaxSetupBaseBoxArray(relax_vdata, A, b, x); } return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SMGRelaxSetupTempVec( void *relax_vdata, hypre_StructMatrix *A, hypre_StructVector *b, hypre_StructVector *x ) { HYPRE_UNUSED_VAR(A); HYPRE_UNUSED_VAR(x); hypre_SMGRelaxData *relax_data = (hypre_SMGRelaxData *)relax_vdata; hypre_StructVector *temp_vec = (relax_data -> temp_vec); /*---------------------------------------------------------- * Set up data *----------------------------------------------------------*/ if ((relax_data -> temp_vec) == NULL) { temp_vec = hypre_StructVectorCreate(hypre_StructVectorComm(b), hypre_StructVectorGrid(b)); hypre_StructVectorSetNumGhost(temp_vec, hypre_StructVectorNumGhost(b)); hypre_StructVectorInitialize(temp_vec); hypre_StructVectorAssemble(temp_vec); (relax_data -> temp_vec) = temp_vec; } (relax_data -> setup_temp_vec) = 0; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_SMGRelaxSetupARem *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SMGRelaxSetupARem( void *relax_vdata, hypre_StructMatrix *A, hypre_StructVector *b, hypre_StructVector *x ) { hypre_SMGRelaxData *relax_data = (hypre_SMGRelaxData *)relax_vdata; HYPRE_Int num_spaces = (relax_data -> num_spaces); HYPRE_Int *space_indices = (relax_data -> space_indices); HYPRE_Int *space_strides = (relax_data -> space_strides); hypre_StructVector *temp_vec = (relax_data -> temp_vec); hypre_StructStencil *stencil = hypre_StructMatrixStencil(A); hypre_Index *stencil_shape = hypre_StructStencilShape(stencil); HYPRE_Int stencil_size = hypre_StructStencilSize(stencil); HYPRE_Int stencil_dim = hypre_StructStencilNDim(stencil); hypre_StructMatrix *A_rem; void **residual_data; hypre_Index base_index; hypre_Index base_stride; HYPRE_Int num_stencil_indices; HYPRE_Int *stencil_indices; HYPRE_Int i; /*---------------------------------------------------------- * Free up old data before putting new data into structure *----------------------------------------------------------*/ hypre_SMGRelaxDestroyARem(relax_vdata); /*---------------------------------------------------------- * Set up data *----------------------------------------------------------*/ hypre_CopyIndex((relax_data -> base_index), base_index); hypre_CopyIndex((relax_data -> base_stride), base_stride); stencil_indices = hypre_TAlloc(HYPRE_Int, stencil_size, HYPRE_MEMORY_HOST); num_stencil_indices = 0; for (i = 0; i < stencil_size; i++) { if (hypre_IndexD(stencil_shape[i], (stencil_dim - 1)) != 0) { stencil_indices[num_stencil_indices] = i; num_stencil_indices++; } } A_rem = hypre_StructMatrixCreateMask(A, num_stencil_indices, stencil_indices); hypre_TFree(stencil_indices, HYPRE_MEMORY_HOST); /* Set up residual_data */ residual_data = hypre_TAlloc(void *, num_spaces, HYPRE_MEMORY_HOST); for (i = 0; i < num_spaces; i++) { hypre_IndexD(base_index, (stencil_dim - 1)) = space_indices[i]; hypre_IndexD(base_stride, (stencil_dim - 1)) = space_strides[i]; residual_data[i] = hypre_SMGResidualCreate(); hypre_SMGResidualSetBase(residual_data[i], base_index, base_stride); hypre_SMGResidualSetup(residual_data[i], A_rem, x, b, temp_vec); } (relax_data -> A_rem) = A_rem; (relax_data -> residual_data) = residual_data; (relax_data -> setup_a_rem) = 0; return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SMGRelaxSetupASol( void *relax_vdata, hypre_StructMatrix *A, hypre_StructVector *b, hypre_StructVector *x ) { HYPRE_UNUSED_VAR(b); hypre_SMGRelaxData *relax_data = (hypre_SMGRelaxData *)relax_vdata; HYPRE_Int num_spaces = (relax_data -> num_spaces); HYPRE_Int *space_indices = (relax_data -> space_indices); HYPRE_Int *space_strides = (relax_data -> space_strides); hypre_StructVector *temp_vec = (relax_data -> temp_vec); HYPRE_Int num_pre_relax = (relax_data -> num_pre_relax); HYPRE_Int num_post_relax = (relax_data -> num_post_relax); hypre_StructStencil *stencil = hypre_StructMatrixStencil(A); hypre_Index *stencil_shape = hypre_StructStencilShape(stencil); HYPRE_Int stencil_size = hypre_StructStencilSize(stencil); HYPRE_Int stencil_dim = hypre_StructStencilNDim(stencil); hypre_StructMatrix *A_sol; void **solve_data; hypre_Index base_index; hypre_Index base_stride; HYPRE_Int num_stencil_indices; HYPRE_Int *stencil_indices; HYPRE_Int i; /*---------------------------------------------------------- * Free up old data before putting new data into structure *----------------------------------------------------------*/ hypre_SMGRelaxDestroyASol(relax_vdata); /*---------------------------------------------------------- * Set up data *----------------------------------------------------------*/ hypre_CopyIndex((relax_data -> base_index), base_index); hypre_CopyIndex((relax_data -> base_stride), base_stride); stencil_indices = hypre_TAlloc(HYPRE_Int, stencil_size, HYPRE_MEMORY_HOST); num_stencil_indices = 0; for (i = 0; i < stencil_size; i++) { if (hypre_IndexD(stencil_shape[i], (stencil_dim - 1)) == 0) { stencil_indices[num_stencil_indices] = i; num_stencil_indices++; } } A_sol = hypre_StructMatrixCreateMask(A, num_stencil_indices, stencil_indices); hypre_StructStencilNDim(hypre_StructMatrixStencil(A_sol)) = stencil_dim - 1; hypre_TFree(stencil_indices, HYPRE_MEMORY_HOST); /* Set up solve_data */ solve_data = hypre_TAlloc(void *, num_spaces, HYPRE_MEMORY_HOST); for (i = 0; i < num_spaces; i++) { hypre_IndexD(base_index, (stencil_dim - 1)) = space_indices[i]; hypre_IndexD(base_stride, (stencil_dim - 1)) = space_strides[i]; if (stencil_dim > 2) { solve_data[i] = hypre_SMGCreate(relax_data -> comm); hypre_SMGSetNumPreRelax( solve_data[i], num_pre_relax); hypre_SMGSetNumPostRelax( solve_data[i], num_post_relax); hypre_SMGSetBase(solve_data[i], base_index, base_stride); hypre_SMGSetMemoryUse(solve_data[i], (relax_data -> memory_use)); hypre_SMGSetTol(solve_data[i], 0.0); hypre_SMGSetMaxIter(solve_data[i], 1); hypre_StructSMGSetMaxLevel(solve_data[i], (relax_data -> max_level)); hypre_SMGSetup(solve_data[i], A_sol, temp_vec, x); } else { solve_data[i] = hypre_CyclicReductionCreate(relax_data -> comm); hypre_CyclicReductionSetBase(solve_data[i], base_index, base_stride); //hypre_CyclicReductionSetMaxLevel(solve_data[i], -1);//(relax_data -> max_level)+10); hypre_CyclicReductionSetup(solve_data[i], A_sol, temp_vec, x); } } (relax_data -> A_sol) = A_sol; (relax_data -> solve_data) = solve_data; (relax_data -> setup_a_sol) = 0; return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SMGRelaxSetTempVec( void *relax_vdata, hypre_StructVector *temp_vec ) { hypre_SMGRelaxData *relax_data = (hypre_SMGRelaxData *)relax_vdata; hypre_SMGRelaxDestroyTempVec(relax_vdata); (relax_data -> temp_vec) = hypre_StructVectorRef(temp_vec); (relax_data -> setup_temp_vec) = 1; (relax_data -> setup_a_rem) = 1; (relax_data -> setup_a_sol) = 1; return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SMGRelaxSetMemoryUse( void *relax_vdata, HYPRE_Int memory_use ) { hypre_SMGRelaxData *relax_data = (hypre_SMGRelaxData *)relax_vdata; (relax_data -> memory_use) = memory_use; return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SMGRelaxSetTol( void *relax_vdata, HYPRE_Real tol ) { hypre_SMGRelaxData *relax_data = (hypre_SMGRelaxData *)relax_vdata; (relax_data -> tol) = tol; return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SMGRelaxSetMaxIter( void *relax_vdata, HYPRE_Int max_iter ) { hypre_SMGRelaxData *relax_data = (hypre_SMGRelaxData *)relax_vdata; (relax_data -> max_iter) = max_iter; return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SMGRelaxSetZeroGuess( void *relax_vdata, HYPRE_Int zero_guess ) { hypre_SMGRelaxData *relax_data = (hypre_SMGRelaxData *)relax_vdata; (relax_data -> zero_guess) = zero_guess; return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SMGRelaxSetNumSpaces( void *relax_vdata, HYPRE_Int num_spaces ) { hypre_SMGRelaxData *relax_data = (hypre_SMGRelaxData *)relax_vdata; HYPRE_Int i; (relax_data -> num_spaces) = num_spaces; hypre_TFree(relax_data -> space_indices, HYPRE_MEMORY_HOST); hypre_TFree(relax_data -> space_strides, HYPRE_MEMORY_HOST); hypre_TFree(relax_data -> pre_space_ranks, HYPRE_MEMORY_HOST); hypre_TFree(relax_data -> reg_space_ranks, HYPRE_MEMORY_HOST); (relax_data -> space_indices) = hypre_TAlloc(HYPRE_Int, num_spaces, HYPRE_MEMORY_HOST); (relax_data -> space_strides) = hypre_TAlloc(HYPRE_Int, num_spaces, HYPRE_MEMORY_HOST); (relax_data -> num_pre_spaces) = 0; (relax_data -> num_reg_spaces) = num_spaces; (relax_data -> pre_space_ranks) = NULL; (relax_data -> reg_space_ranks) = hypre_TAlloc(HYPRE_Int, num_spaces, HYPRE_MEMORY_HOST); for (i = 0; i < num_spaces; i++) { (relax_data -> space_indices[i]) = 0; (relax_data -> space_strides[i]) = 1; (relax_data -> reg_space_ranks[i]) = i; } (relax_data -> setup_temp_vec) = 1; (relax_data -> setup_a_rem) = 1; (relax_data -> setup_a_sol) = 1; return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SMGRelaxSetNumPreSpaces( void *relax_vdata, HYPRE_Int num_pre_spaces ) { hypre_SMGRelaxData *relax_data = (hypre_SMGRelaxData *)relax_vdata; HYPRE_Int i; (relax_data -> num_pre_spaces) = num_pre_spaces; hypre_TFree(relax_data -> pre_space_ranks, HYPRE_MEMORY_HOST); (relax_data -> pre_space_ranks) = hypre_TAlloc(HYPRE_Int, num_pre_spaces, HYPRE_MEMORY_HOST); for (i = 0; i < num_pre_spaces; i++) { (relax_data -> pre_space_ranks[i]) = 0; } return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SMGRelaxSetNumRegSpaces( void *relax_vdata, HYPRE_Int num_reg_spaces ) { hypre_SMGRelaxData *relax_data = (hypre_SMGRelaxData *)relax_vdata; HYPRE_Int i; (relax_data -> num_reg_spaces) = num_reg_spaces; hypre_TFree(relax_data -> reg_space_ranks, HYPRE_MEMORY_HOST); (relax_data -> reg_space_ranks) = hypre_TAlloc(HYPRE_Int, num_reg_spaces, HYPRE_MEMORY_HOST); for (i = 0; i < num_reg_spaces; i++) { (relax_data -> reg_space_ranks[i]) = 0; } return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SMGRelaxSetSpace( void *relax_vdata, HYPRE_Int i, HYPRE_Int space_index, HYPRE_Int space_stride ) { hypre_SMGRelaxData *relax_data = (hypre_SMGRelaxData *)relax_vdata; (relax_data -> space_indices[i]) = space_index; (relax_data -> space_strides[i]) = space_stride; (relax_data -> setup_temp_vec) = 1; (relax_data -> setup_a_rem) = 1; (relax_data -> setup_a_sol) = 1; return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SMGRelaxSetRegSpaceRank( void *relax_vdata, HYPRE_Int i, HYPRE_Int reg_space_rank ) { hypre_SMGRelaxData *relax_data = (hypre_SMGRelaxData *)relax_vdata; (relax_data -> reg_space_ranks[i]) = reg_space_rank; return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SMGRelaxSetPreSpaceRank( void *relax_vdata, HYPRE_Int i, HYPRE_Int pre_space_rank ) { hypre_SMGRelaxData *relax_data = (hypre_SMGRelaxData *)relax_vdata; (relax_data -> pre_space_ranks[i]) = pre_space_rank; return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SMGRelaxSetBase( void *relax_vdata, hypre_Index base_index, hypre_Index base_stride ) { hypre_SMGRelaxData *relax_data = (hypre_SMGRelaxData *)relax_vdata; HYPRE_Int d; for (d = 0; d < 3; d++) { hypre_IndexD((relax_data -> base_index), d) = hypre_IndexD(base_index, d); hypre_IndexD((relax_data -> base_stride), d) = hypre_IndexD(base_stride, d); } if ((relax_data -> base_box_array) != NULL) { hypre_BoxArrayDestroy((relax_data -> base_box_array)); (relax_data -> base_box_array) = NULL; } (relax_data -> setup_temp_vec) = 1; (relax_data -> setup_a_rem) = 1; (relax_data -> setup_a_sol) = 1; return hypre_error_flag; } /*-------------------------------------------------------------------------- * Note that we require at least 1 pre-relax sweep. *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SMGRelaxSetNumPreRelax( void *relax_vdata, HYPRE_Int num_pre_relax ) { hypre_SMGRelaxData *relax_data = (hypre_SMGRelaxData *)relax_vdata; (relax_data -> num_pre_relax) = hypre_max(num_pre_relax, 1); return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SMGRelaxSetNumPostRelax( void *relax_vdata, HYPRE_Int num_post_relax ) { hypre_SMGRelaxData *relax_data = (hypre_SMGRelaxData *)relax_vdata; (relax_data -> num_post_relax) = num_post_relax; return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SMGRelaxSetNewMatrixStencil( void *relax_vdata, hypre_StructStencil *diff_stencil ) { hypre_SMGRelaxData *relax_data = (hypre_SMGRelaxData *)relax_vdata; hypre_Index *stencil_shape = hypre_StructStencilShape(diff_stencil); HYPRE_Int stencil_size = hypre_StructStencilSize(diff_stencil); HYPRE_Int stencil_dim = hypre_StructStencilNDim(diff_stencil); HYPRE_Int i; for (i = 0; i < stencil_size; i++) { if (hypre_IndexD(stencil_shape[i], (stencil_dim - 1)) != 0) { (relax_data -> setup_a_rem) = 1; } else { (relax_data -> setup_a_sol) = 1; } } return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_SMGRelaxSetupBaseBoxArray *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SMGRelaxSetupBaseBoxArray( void *relax_vdata, hypre_StructMatrix *A, hypre_StructVector *b, hypre_StructVector *x ) { HYPRE_UNUSED_VAR(A); HYPRE_UNUSED_VAR(b); hypre_SMGRelaxData *relax_data = (hypre_SMGRelaxData *)relax_vdata; hypre_StructGrid *grid; hypre_BoxArray *boxes; hypre_BoxArray *base_box_array; grid = hypre_StructVectorGrid(x); boxes = hypre_StructGridBoxes(grid); base_box_array = hypre_BoxArrayDuplicate(boxes); hypre_ProjectBoxArray(base_box_array, (relax_data -> base_index), (relax_data -> base_stride)); (relax_data -> base_box_array) = base_box_array; return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SMGRelaxSetMaxLevel( void *relax_vdata, HYPRE_Int num_max_level ) { hypre_SMGRelaxData *relax_data = (hypre_SMGRelaxData *)relax_vdata; (relax_data -> max_level) = num_max_level; return hypre_error_flag; } hypre-2.33.0/src/struct_ls/smg_residual.c000066400000000000000000000250311477326011500203700ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "_hypre_struct_ls.h" #include "_hypre_struct_mv.hpp" /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ typedef struct { hypre_Index base_index; hypre_Index base_stride; hypre_StructMatrix *A; hypre_StructVector *x; hypre_StructVector *b; hypre_StructVector *r; hypre_BoxArray *base_points; hypre_ComputePkg *compute_pkg; HYPRE_Int time_index; HYPRE_BigInt flops; } hypre_SMGResidualData; /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ void * hypre_SMGResidualCreate( void ) { hypre_SMGResidualData *residual_data; residual_data = hypre_CTAlloc(hypre_SMGResidualData, 1, HYPRE_MEMORY_HOST); (residual_data -> time_index) = hypre_InitializeTiming("SMGResidual"); /* set defaults */ hypre_SetIndex3((residual_data -> base_index), 0, 0, 0); hypre_SetIndex3((residual_data -> base_stride), 1, 1, 1); return (void *) residual_data; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SMGResidualSetup( void *residual_vdata, hypre_StructMatrix *A, hypre_StructVector *x, hypre_StructVector *b, hypre_StructVector *r ) { hypre_SMGResidualData *residual_data = (hypre_SMGResidualData *)residual_vdata; hypre_IndexRef base_index = (residual_data -> base_index); hypre_IndexRef base_stride = (residual_data -> base_stride); hypre_StructGrid *grid; hypre_StructStencil *stencil; hypre_BoxArray *base_points; hypre_ComputeInfo *compute_info; hypre_ComputePkg *compute_pkg; /*---------------------------------------------------------- * Set up base points and the compute package *----------------------------------------------------------*/ grid = hypre_StructMatrixGrid(A); stencil = hypre_StructMatrixStencil(A); base_points = hypre_BoxArrayDuplicate(hypre_StructGridBoxes(grid)); hypre_ProjectBoxArray(base_points, base_index, base_stride); hypre_CreateComputeInfo(grid, stencil, &compute_info); hypre_ComputeInfoProjectComp(compute_info, base_index, base_stride); hypre_ComputePkgCreate(compute_info, hypre_StructVectorDataSpace(x), 1, grid, &compute_pkg); /*---------------------------------------------------------- * Set up the residual data structure *----------------------------------------------------------*/ (residual_data -> A) = hypre_StructMatrixRef(A); (residual_data -> x) = hypre_StructVectorRef(x); (residual_data -> b) = hypre_StructVectorRef(b); (residual_data -> r) = hypre_StructVectorRef(r); (residual_data -> base_points) = base_points; (residual_data -> compute_pkg) = compute_pkg; /*----------------------------------------------------- * Compute flops *-----------------------------------------------------*/ (residual_data -> flops) = (hypre_StructMatrixGlobalSize(A) + hypre_StructVectorGlobalSize(x)) / (HYPRE_BigInt)(hypre_IndexX(base_stride) * hypre_IndexY(base_stride) * hypre_IndexZ(base_stride) ); return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SMGResidual( void *residual_vdata, hypre_StructMatrix *A, hypre_StructVector *x, hypre_StructVector *b, hypre_StructVector *r ) { hypre_SMGResidualData *residual_data = (hypre_SMGResidualData *)residual_vdata; hypre_IndexRef base_stride = (residual_data -> base_stride); hypre_BoxArray *base_points = (residual_data -> base_points); hypre_ComputePkg *compute_pkg = (residual_data -> compute_pkg); hypre_CommHandle *comm_handle; hypre_BoxArrayArray *compute_box_aa; hypre_BoxArray *compute_box_a; hypre_Box *compute_box; hypre_Box *A_data_box; hypre_Box *x_data_box; hypre_Box *b_data_box; hypre_Box *r_data_box; HYPRE_Real *Ap; HYPRE_Real *xp; HYPRE_Real *bp; HYPRE_Real *rp; hypre_Index loop_size; hypre_IndexRef start; hypre_StructStencil *stencil; hypre_Index *stencil_shape; HYPRE_Int stencil_size; HYPRE_Int compute_i, i, j, si; hypre_BeginTiming(residual_data -> time_index); /*----------------------------------------------------------------------- * Compute residual r = b - Ax *-----------------------------------------------------------------------*/ stencil = hypre_StructMatrixStencil(A); stencil_shape = hypre_StructStencilShape(stencil); stencil_size = hypre_StructStencilSize(stencil); for (compute_i = 0; compute_i < 2; compute_i++) { switch (compute_i) { case 0: { xp = hypre_StructVectorData(x); hypre_InitializeIndtComputations(compute_pkg, xp, &comm_handle); compute_box_aa = hypre_ComputePkgIndtBoxes(compute_pkg); /*---------------------------------------- * Copy b into r *----------------------------------------*/ compute_box_a = base_points; hypre_ForBoxI(i, compute_box_a) { compute_box = hypre_BoxArrayBox(compute_box_a, i); start = hypre_BoxIMin(compute_box); b_data_box = hypre_BoxArrayBox(hypre_StructVectorDataSpace(b), i); r_data_box = hypre_BoxArrayBox(hypre_StructVectorDataSpace(r), i); bp = hypre_StructVectorBoxData(b, i); rp = hypre_StructVectorBoxData(r, i); hypre_BoxGetStrideSize(compute_box, base_stride, loop_size); #define DEVICE_VAR is_device_ptr(rp,bp) hypre_BoxLoop2Begin(hypre_StructMatrixNDim(A), loop_size, b_data_box, start, base_stride, bi, r_data_box, start, base_stride, ri); { rp[ri] = bp[bi]; } hypre_BoxLoop2End(bi, ri); #undef DEVICE_VAR } } break; case 1: { hypre_FinalizeIndtComputations(comm_handle); compute_box_aa = hypre_ComputePkgDeptBoxes(compute_pkg); } break; } /*-------------------------------------------------------------------- * Compute r -= A*x *--------------------------------------------------------------------*/ hypre_ForBoxArrayI(i, compute_box_aa) { compute_box_a = hypre_BoxArrayArrayBoxArray(compute_box_aa, i); A_data_box = hypre_BoxArrayBox(hypre_StructMatrixDataSpace(A), i); x_data_box = hypre_BoxArrayBox(hypre_StructVectorDataSpace(x), i); r_data_box = hypre_BoxArrayBox(hypre_StructVectorDataSpace(r), i); rp = hypre_StructVectorBoxData(r, i); hypre_ForBoxI(j, compute_box_a) { compute_box = hypre_BoxArrayBox(compute_box_a, j); start = hypre_BoxIMin(compute_box); for (si = 0; si < stencil_size; si++) { Ap = hypre_StructMatrixBoxData(A, i, si); xp = hypre_StructVectorBoxData(x, i); //RL:PTROFFSET HYPRE_Int xp_off = hypre_BoxOffsetDistance(x_data_box, stencil_shape[si]); hypre_BoxGetStrideSize(compute_box, base_stride, loop_size); #define DEVICE_VAR is_device_ptr(rp,Ap,xp) hypre_BoxLoop3Begin(hypre_StructMatrixNDim(A), loop_size, A_data_box, start, base_stride, Ai, x_data_box, start, base_stride, xi, r_data_box, start, base_stride, ri); { rp[ri] -= Ap[Ai] * xp[xi + xp_off]; } hypre_BoxLoop3End(Ai, xi, ri); #undef DEVICE_VAR } } } } hypre_IncFLOPCount(residual_data -> flops); hypre_EndTiming(residual_data -> time_index); return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SMGResidualSetBase( void *residual_vdata, hypre_Index base_index, hypre_Index base_stride ) { hypre_SMGResidualData *residual_data = (hypre_SMGResidualData *)residual_vdata; HYPRE_Int d; for (d = 0; d < 3; d++) { hypre_IndexD((residual_data -> base_index), d) = hypre_IndexD(base_index, d); hypre_IndexD((residual_data -> base_stride), d) = hypre_IndexD(base_stride, d); } return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SMGResidualDestroy( void *residual_vdata ) { hypre_SMGResidualData *residual_data = (hypre_SMGResidualData *)residual_vdata; if (residual_data) { hypre_StructMatrixDestroy(residual_data -> A); hypre_StructVectorDestroy(residual_data -> x); hypre_StructVectorDestroy(residual_data -> b); hypre_StructVectorDestroy(residual_data -> r); hypre_BoxArrayDestroy(residual_data -> base_points); hypre_ComputePkgDestroy(residual_data -> compute_pkg ); hypre_FinalizeTiming(residual_data -> time_index); hypre_TFree(residual_data, HYPRE_MEMORY_HOST); } return hypre_error_flag; } hypre-2.33.0/src/struct_ls/smg_residual_unrolled.c000066400000000000000000001147061477326011500223040ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "_hypre_struct_ls.h" /*-------------------------------------------------------------------------- * hypre_SMGResidualData data structure *--------------------------------------------------------------------------*/ typedef struct { hypre_Index base_index; hypre_Index base_stride; hypre_StructMatrix *A; hypre_StructVector *x; hypre_StructVector *b; hypre_StructVector *r; hypre_BoxArray *base_points; hypre_ComputePkg *compute_pkg; HYPRE_Int time_index; HYPRE_BigInt flops; } hypre_SMGResidualData; /*-------------------------------------------------------------------------- * hypre_SMGResidualCreate *--------------------------------------------------------------------------*/ void * hypre_SMGResidualCreate( ) { hypre_SMGResidualData *residual_data; residual_data = hypre_CTAlloc(hypre_SMGResidualData, 1, HYPRE_MEMORY_HOST); (residual_data -> time_index) = hypre_InitializeTiming("SMGResidual"); /* set defaults */ hypre_SetIndex3((residual_data -> base_index), 0, 0, 0); hypre_SetIndex3((residual_data -> base_stride), 1, 1, 1); return (void *) residual_data; } /*-------------------------------------------------------------------------- * hypre_SMGResidualSetup *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SMGResidualSetup( void *residual_vdata, hypre_StructMatrix *A, hypre_StructVector *x, hypre_StructVector *b, hypre_StructVector *r ) { HYPRE_Int ierr; hypre_SMGResidualData *residual_data = residual_vdata; hypre_IndexRef base_index = (residual_data -> base_index); hypre_IndexRef base_stride = (residual_data -> base_stride); hypre_Index unit_stride; hypre_StructGrid *grid; hypre_StructStencil *stencil; hypre_BoxArray *base_points; hypre_ComputeInfo *compute_info; hypre_ComputePkg *compute_pkg; /*---------------------------------------------------------- * Set up base points and the compute package *----------------------------------------------------------*/ grid = hypre_StructMatrixGrid(A); stencil = hypre_StructMatrixStencil(A); hypre_SetIndex3(unit_stride, 1, 1, 1); base_points = hypre_BoxArrayDuplicate(hypre_StructGridBoxes(grid)); hypre_ProjectBoxArray(base_points, base_index, base_stride); hypre_CreateComputeInfo(grid, stencil, &compute_info); hypre_ComputeInfoProjectComp(compute_info, base_index, base_stride); hypre_ComputePkgCreate(compute_info, hypre_StructVectorDataSpace(x), 1, grid, &compute_pkg); /*---------------------------------------------------------- * Set up the residual data structure *----------------------------------------------------------*/ (residual_data -> A) = hypre_StructMatrixRef(A); (residual_data -> x) = hypre_StructVectorRef(x); (residual_data -> b) = hypre_StructVectorRef(b); (residual_data -> r) = hypre_StructVectorRef(r); (residual_data -> base_points) = base_points; (residual_data -> compute_pkg) = compute_pkg; /*----------------------------------------------------- * Compute flops *-----------------------------------------------------*/ (residual_data -> flops) = (hypre_StructMatrixGlobalSize(A) + hypre_StructVectorGlobalSize(x)) / (HYPRE_BigInt)(hypre_IndexX(base_stride) * hypre_IndexY(base_stride) * hypre_IndexZ(base_stride) ); return ierr; } /*-------------------------------------------------------------------------- * hypre_SMGResidual *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SMGResidual( void *residual_vdata, hypre_StructMatrix *A, hypre_StructVector *x, hypre_StructVector *b, hypre_StructVector *r ) { HYPRE_Int ierr; hypre_SMGResidualData *residual_data = residual_vdata; hypre_IndexRef base_stride = (residual_data -> base_stride); hypre_BoxArray *base_points = (residual_data -> base_points); hypre_ComputePkg *compute_pkg = (residual_data -> compute_pkg); hypre_CommHandle *comm_handle; hypre_BoxArrayArray *compute_box_aa; hypre_BoxArray *compute_box_a; hypre_Box *compute_box; hypre_Box *A_data_box; hypre_Box *x_data_box; hypre_Box *b_data_box; hypre_Box *r_data_box; HYPRE_Int Ai; HYPRE_Int xi; HYPRE_Int bi; HYPRE_Int ri; HYPRE_Real *Ap0; HYPRE_Real *xp0; HYPRE_Real *bp; HYPRE_Real *rp; hypre_Index loop_size; hypre_IndexRef start; hypre_StructStencil *stencil; hypre_Index *stencil_shape; HYPRE_Int stencil_size; HYPRE_Int compute_i, i, j, si; HYPRE_Real *Ap1, *Ap2; HYPRE_Real *Ap3, *Ap4; HYPRE_Real *Ap5, *Ap6; HYPRE_Real *Ap7, *Ap8, *Ap9; HYPRE_Real *Ap10, *Ap11, *Ap12, *Ap13, *Ap14; HYPRE_Real *Ap15, *Ap16, *Ap17, *Ap18; HYPRE_Real *Ap19, *Ap20, *Ap21, *Ap22, *Ap23, *Ap24, *Ap25, *Ap26; HYPRE_Real *xp1, *xp2; HYPRE_Real *xp3, *xp4; HYPRE_Real *xp5, *xp6; HYPRE_Real *xp7, *xp8, *xp9; HYPRE_Real *xp10, *xp11, *xp12, *xp13, *xp14; HYPRE_Real *xp15, *xp16, *xp17, *xp18; HYPRE_Real *xp19, *xp20, *xp21, *xp22, *xp23, *xp24, *xp25, *xp26; hypre_BeginTiming(residual_data -> time_index); /*----------------------------------------------------------------------- * Compute residual r = b - Ax *-----------------------------------------------------------------------*/ stencil = hypre_StructMatrixStencil(A); stencil_shape = hypre_StructStencilShape(stencil); stencil_size = hypre_StructStencilSize(stencil); for (compute_i = 0; compute_i < 2; compute_i++) { switch (compute_i) { case 0: { xp0 = hypre_StructVectorData(x); hypre_InitializeIndtComputations(compute_pkg, xp0, &comm_handle); compute_box_aa = hypre_ComputePkgIndtBoxes(compute_pkg); /*---------------------------------------- * Copy b into r *----------------------------------------*/ compute_box_a = base_points; hypre_ForBoxI(i, compute_box_a) { compute_box = hypre_BoxArrayBox(compute_box_a, i); start = hypre_BoxIMin(compute_box); b_data_box = hypre_BoxArrayBox(hypre_StructVectorDataSpace(b), i); r_data_box = hypre_BoxArrayBox(hypre_StructVectorDataSpace(r), i); bp = hypre_StructVectorBoxData(b, i); rp = hypre_StructVectorBoxData(r, i); hypre_BoxGetStrideSize(compute_box, base_stride, loop_size); #define DEVICE_VAR is_device_ptr(rp,bp) hypre_BoxLoop2Begin(hypre_StructMatrixNDim(A), loop_size, b_data_box, start, base_stride, bi, r_data_box, start, base_stride, ri); { rp[ri] = bp[bi]; } hypre_BoxLoop2End(bi, ri); #undef DEVICE_VAR } } break; case 1: { hypre_FinalizeIndtComputations(comm_handle); compute_box_aa = hypre_ComputePkgDeptBoxes(compute_pkg); } break; } /*-------------------------------------------------------------------- * Compute r -= A*x *--------------------------------------------------------------------*/ hypre_ForBoxArrayI(i, compute_box_aa) { compute_box_a = hypre_BoxArrayArrayBoxArray(compute_box_aa, i); A_data_box = hypre_BoxArrayBox(hypre_StructMatrixDataSpace(A), i); x_data_box = hypre_BoxArrayBox(hypre_StructVectorDataSpace(x), i); r_data_box = hypre_BoxArrayBox(hypre_StructVectorDataSpace(r), i); rp = hypre_StructVectorBoxData(r, i); /*-------------------------------------------------------------- * Switch statement to direct control (based on stencil size) to * code to get pointers and offsets fo A and x. *--------------------------------------------------------------*/ switch (stencil_size) { case 1: Ap0 = hypre_StructMatrixBoxData(A, i, 0); xp0 = hypre_StructVectorBoxData(x, i) + hypre_BoxOffsetDistance(x_data_box, stencil_shape[0]); break; case 3: Ap0 = hypre_StructMatrixBoxData(A, i, 0); Ap1 = hypre_StructMatrixBoxData(A, i, 1); Ap2 = hypre_StructMatrixBoxData(A, i, 2); xp0 = hypre_StructVectorBoxData(x, i) + hypre_BoxOffsetDistance(x_data_box, stencil_shape[0]); xp1 = hypre_StructVectorBoxData(x, i) + hypre_BoxOffsetDistance(x_data_box, stencil_shape[1]); xp2 = hypre_StructVectorBoxData(x, i) + hypre_BoxOffsetDistance(x_data_box, stencil_shape[2]); break; case 5: Ap0 = hypre_StructMatrixBoxData(A, i, 0); Ap1 = hypre_StructMatrixBoxData(A, i, 1); Ap2 = hypre_StructMatrixBoxData(A, i, 2); Ap3 = hypre_StructMatrixBoxData(A, i, 3); Ap4 = hypre_StructMatrixBoxData(A, i, 4); xp0 = hypre_StructVectorBoxData(x, i) + hypre_BoxOffsetDistance(x_data_box, stencil_shape[0]); xp1 = hypre_StructVectorBoxData(x, i) + hypre_BoxOffsetDistance(x_data_box, stencil_shape[1]); xp2 = hypre_StructVectorBoxData(x, i) + hypre_BoxOffsetDistance(x_data_box, stencil_shape[2]); xp3 = hypre_StructVectorBoxData(x, i) + hypre_BoxOffsetDistance(x_data_box, stencil_shape[3]); xp4 = hypre_StructVectorBoxData(x, i) + hypre_BoxOffsetDistance(x_data_box, stencil_shape[4]); break; case 7: Ap0 = hypre_StructMatrixBoxData(A, i, 0); Ap1 = hypre_StructMatrixBoxData(A, i, 1); Ap2 = hypre_StructMatrixBoxData(A, i, 2); Ap3 = hypre_StructMatrixBoxData(A, i, 3); Ap4 = hypre_StructMatrixBoxData(A, i, 4); Ap5 = hypre_StructMatrixBoxData(A, i, 5); Ap6 = hypre_StructMatrixBoxData(A, i, 6); xp0 = hypre_StructVectorBoxData(x, i) + hypre_BoxOffsetDistance(x_data_box, stencil_shape[0]); xp1 = hypre_StructVectorBoxData(x, i) + hypre_BoxOffsetDistance(x_data_box, stencil_shape[1]); xp2 = hypre_StructVectorBoxData(x, i) + hypre_BoxOffsetDistance(x_data_box, stencil_shape[2]); xp3 = hypre_StructVectorBoxData(x, i) + hypre_BoxOffsetDistance(x_data_box, stencil_shape[3]); xp4 = hypre_StructVectorBoxData(x, i) + hypre_BoxOffsetDistance(x_data_box, stencil_shape[4]); xp5 = hypre_StructVectorBoxData(x, i) + hypre_BoxOffsetDistance(x_data_box, stencil_shape[5]); xp6 = hypre_StructVectorBoxData(x, i) + hypre_BoxOffsetDistance(x_data_box, stencil_shape[6]); break; case 9: Ap0 = hypre_StructMatrixBoxData(A, i, 0); Ap1 = hypre_StructMatrixBoxData(A, i, 1); Ap2 = hypre_StructMatrixBoxData(A, i, 2); Ap3 = hypre_StructMatrixBoxData(A, i, 3); Ap4 = hypre_StructMatrixBoxData(A, i, 4); Ap5 = hypre_StructMatrixBoxData(A, i, 5); Ap6 = hypre_StructMatrixBoxData(A, i, 6); Ap7 = hypre_StructMatrixBoxData(A, i, 7); Ap8 = hypre_StructMatrixBoxData(A, i, 8); xp0 = hypre_StructVectorBoxData(x, i) + hypre_BoxOffsetDistance(x_data_box, stencil_shape[0]); xp1 = hypre_StructVectorBoxData(x, i) + hypre_BoxOffsetDistance(x_data_box, stencil_shape[1]); xp2 = hypre_StructVectorBoxData(x, i) + hypre_BoxOffsetDistance(x_data_box, stencil_shape[2]); xp3 = hypre_StructVectorBoxData(x, i) + hypre_BoxOffsetDistance(x_data_box, stencil_shape[3]); xp4 = hypre_StructVectorBoxData(x, i) + hypre_BoxOffsetDistance(x_data_box, stencil_shape[4]); xp5 = hypre_StructVectorBoxData(x, i) + hypre_BoxOffsetDistance(x_data_box, stencil_shape[5]); xp6 = hypre_StructVectorBoxData(x, i) + hypre_BoxOffsetDistance(x_data_box, stencil_shape[6]); xp7 = hypre_StructVectorBoxData(x, i) + hypre_BoxOffsetDistance(x_data_box, stencil_shape[7]); xp8 = hypre_StructVectorBoxData(x, i) + hypre_BoxOffsetDistance(x_data_box, stencil_shape[8]); break; case 15: Ap0 = hypre_StructMatrixBoxData(A, i, 0); Ap1 = hypre_StructMatrixBoxData(A, i, 1); Ap2 = hypre_StructMatrixBoxData(A, i, 2); Ap3 = hypre_StructMatrixBoxData(A, i, 3); Ap4 = hypre_StructMatrixBoxData(A, i, 4); Ap5 = hypre_StructMatrixBoxData(A, i, 5); Ap6 = hypre_StructMatrixBoxData(A, i, 6); Ap7 = hypre_StructMatrixBoxData(A, i, 7); Ap8 = hypre_StructMatrixBoxData(A, i, 8); Ap9 = hypre_StructMatrixBoxData(A, i, 9); Ap10 = hypre_StructMatrixBoxData(A, i, 10); Ap11 = hypre_StructMatrixBoxData(A, i, 11); Ap12 = hypre_StructMatrixBoxData(A, i, 12); Ap13 = hypre_StructMatrixBoxData(A, i, 13); Ap14 = hypre_StructMatrixBoxData(A, i, 14); xp0 = hypre_StructVectorBoxData(x, i) + hypre_BoxOffsetDistance(x_data_box, stencil_shape[0]); xp1 = hypre_StructVectorBoxData(x, i) + hypre_BoxOffsetDistance(x_data_box, stencil_shape[1]); xp2 = hypre_StructVectorBoxData(x, i) + hypre_BoxOffsetDistance(x_data_box, stencil_shape[2]); xp3 = hypre_StructVectorBoxData(x, i) + hypre_BoxOffsetDistance(x_data_box, stencil_shape[3]); xp4 = hypre_StructVectorBoxData(x, i) + hypre_BoxOffsetDistance(x_data_box, stencil_shape[4]); xp5 = hypre_StructVectorBoxData(x, i) + hypre_BoxOffsetDistance(x_data_box, stencil_shape[5]); xp6 = hypre_StructVectorBoxData(x, i) + hypre_BoxOffsetDistance(x_data_box, stencil_shape[6]); xp7 = hypre_StructVectorBoxData(x, i) + hypre_BoxOffsetDistance(x_data_box, stencil_shape[7]); xp8 = hypre_StructVectorBoxData(x, i) + hypre_BoxOffsetDistance(x_data_box, stencil_shape[8]); xp9 = hypre_StructVectorBoxData(x, i) + hypre_BoxOffsetDistance(x_data_box, stencil_shape[9]); xp10 = hypre_StructVectorBoxData(x, i) + hypre_BoxOffsetDistance(x_data_box, stencil_shape[10]); xp11 = hypre_StructVectorBoxData(x, i) + hypre_BoxOffsetDistance(x_data_box, stencil_shape[11]); xp12 = hypre_StructVectorBoxData(x, i) + hypre_BoxOffsetDistance(x_data_box, stencil_shape[12]); xp13 = hypre_StructVectorBoxData(x, i) + hypre_BoxOffsetDistance(x_data_box, stencil_shape[13]); xp14 = hypre_StructVectorBoxData(x, i) + hypre_BoxOffsetDistance(x_data_box, stencil_shape[14]); break; case 19: Ap0 = hypre_StructMatrixBoxData(A, i, 0); Ap1 = hypre_StructMatrixBoxData(A, i, 1); Ap2 = hypre_StructMatrixBoxData(A, i, 2); Ap3 = hypre_StructMatrixBoxData(A, i, 3); Ap4 = hypre_StructMatrixBoxData(A, i, 4); Ap5 = hypre_StructMatrixBoxData(A, i, 5); Ap6 = hypre_StructMatrixBoxData(A, i, 6); Ap7 = hypre_StructMatrixBoxData(A, i, 7); Ap8 = hypre_StructMatrixBoxData(A, i, 8); Ap9 = hypre_StructMatrixBoxData(A, i, 9); Ap10 = hypre_StructMatrixBoxData(A, i, 10); Ap11 = hypre_StructMatrixBoxData(A, i, 11); Ap12 = hypre_StructMatrixBoxData(A, i, 12); Ap13 = hypre_StructMatrixBoxData(A, i, 13); Ap14 = hypre_StructMatrixBoxData(A, i, 14); Ap15 = hypre_StructMatrixBoxData(A, i, 15); Ap16 = hypre_StructMatrixBoxData(A, i, 16); Ap17 = hypre_StructMatrixBoxData(A, i, 17); Ap18 = hypre_StructMatrixBoxData(A, i, 18); xp0 = hypre_StructVectorBoxData(x, i) + hypre_BoxOffsetDistance(x_data_box, stencil_shape[0]); xp1 = hypre_StructVectorBoxData(x, i) + hypre_BoxOffsetDistance(x_data_box, stencil_shape[1]); xp2 = hypre_StructVectorBoxData(x, i) + hypre_BoxOffsetDistance(x_data_box, stencil_shape[2]); xp3 = hypre_StructVectorBoxData(x, i) + hypre_BoxOffsetDistance(x_data_box, stencil_shape[3]); xp4 = hypre_StructVectorBoxData(x, i) + hypre_BoxOffsetDistance(x_data_box, stencil_shape[4]); xp5 = hypre_StructVectorBoxData(x, i) + hypre_BoxOffsetDistance(x_data_box, stencil_shape[5]); xp6 = hypre_StructVectorBoxData(x, i) + hypre_BoxOffsetDistance(x_data_box, stencil_shape[6]); xp7 = hypre_StructVectorBoxData(x, i) + hypre_BoxOffsetDistance(x_data_box, stencil_shape[7]); xp8 = hypre_StructVectorBoxData(x, i) + hypre_BoxOffsetDistance(x_data_box, stencil_shape[8]); xp9 = hypre_StructVectorBoxData(x, i) + hypre_BoxOffsetDistance(x_data_box, stencil_shape[9]); xp10 = hypre_StructVectorBoxData(x, i) + hypre_BoxOffsetDistance(x_data_box, stencil_shape[10]); xp11 = hypre_StructVectorBoxData(x, i) + hypre_BoxOffsetDistance(x_data_box, stencil_shape[11]); xp12 = hypre_StructVectorBoxData(x, i) + hypre_BoxOffsetDistance(x_data_box, stencil_shape[12]); xp13 = hypre_StructVectorBoxData(x, i) + hypre_BoxOffsetDistance(x_data_box, stencil_shape[13]); xp14 = hypre_StructVectorBoxData(x, i) + hypre_BoxOffsetDistance(x_data_box, stencil_shape[14]); xp15 = hypre_StructVectorBoxData(x, i) + hypre_BoxOffsetDistance(x_data_box, stencil_shape[15]); xp16 = hypre_StructVectorBoxData(x, i) + hypre_BoxOffsetDistance(x_data_box, stencil_shape[16]); xp17 = hypre_StructVectorBoxData(x, i) + hypre_BoxOffsetDistance(x_data_box, stencil_shape[17]); xp18 = hypre_StructVectorBoxData(x, i) + hypre_BoxOffsetDistance(x_data_box, stencil_shape[18]); break; case 27: Ap0 = hypre_StructMatrixBoxData(A, i, 0); Ap1 = hypre_StructMatrixBoxData(A, i, 1); Ap2 = hypre_StructMatrixBoxData(A, i, 2); Ap3 = hypre_StructMatrixBoxData(A, i, 3); Ap4 = hypre_StructMatrixBoxData(A, i, 4); Ap5 = hypre_StructMatrixBoxData(A, i, 5); Ap6 = hypre_StructMatrixBoxData(A, i, 6); Ap7 = hypre_StructMatrixBoxData(A, i, 7); Ap8 = hypre_StructMatrixBoxData(A, i, 8); Ap9 = hypre_StructMatrixBoxData(A, i, 9); Ap10 = hypre_StructMatrixBoxData(A, i, 10); Ap11 = hypre_StructMatrixBoxData(A, i, 11); Ap12 = hypre_StructMatrixBoxData(A, i, 12); Ap13 = hypre_StructMatrixBoxData(A, i, 13); Ap14 = hypre_StructMatrixBoxData(A, i, 14); Ap15 = hypre_StructMatrixBoxData(A, i, 15); Ap16 = hypre_StructMatrixBoxData(A, i, 16); Ap17 = hypre_StructMatrixBoxData(A, i, 17); Ap18 = hypre_StructMatrixBoxData(A, i, 18); Ap19 = hypre_StructMatrixBoxData(A, i, 19); Ap20 = hypre_StructMatrixBoxData(A, i, 20); Ap21 = hypre_StructMatrixBoxData(A, i, 21); Ap22 = hypre_StructMatrixBoxData(A, i, 22); Ap23 = hypre_StructMatrixBoxData(A, i, 23); Ap24 = hypre_StructMatrixBoxData(A, i, 24); Ap25 = hypre_StructMatrixBoxData(A, i, 25); Ap26 = hypre_StructMatrixBoxData(A, i, 26); xp0 = hypre_StructVectorBoxData(x, i) + hypre_BoxOffsetDistance(x_data_box, stencil_shape[0]); xp1 = hypre_StructVectorBoxData(x, i) + hypre_BoxOffsetDistance(x_data_box, stencil_shape[1]); xp2 = hypre_StructVectorBoxData(x, i) + hypre_BoxOffsetDistance(x_data_box, stencil_shape[2]); xp3 = hypre_StructVectorBoxData(x, i) + hypre_BoxOffsetDistance(x_data_box, stencil_shape[3]); xp4 = hypre_StructVectorBoxData(x, i) + hypre_BoxOffsetDistance(x_data_box, stencil_shape[4]); xp5 = hypre_StructVectorBoxData(x, i) + hypre_BoxOffsetDistance(x_data_box, stencil_shape[5]); xp6 = hypre_StructVectorBoxData(x, i) + hypre_BoxOffsetDistance(x_data_box, stencil_shape[6]); xp7 = hypre_StructVectorBoxData(x, i) + hypre_BoxOffsetDistance(x_data_box, stencil_shape[7]); xp8 = hypre_StructVectorBoxData(x, i) + hypre_BoxOffsetDistance(x_data_box, stencil_shape[8]); xp9 = hypre_StructVectorBoxData(x, i) + hypre_BoxOffsetDistance(x_data_box, stencil_shape[9]); xp10 = hypre_StructVectorBoxData(x, i) + hypre_BoxOffsetDistance(x_data_box, stencil_shape[10]); xp11 = hypre_StructVectorBoxData(x, i) + hypre_BoxOffsetDistance(x_data_box, stencil_shape[11]); xp12 = hypre_StructVectorBoxData(x, i) + hypre_BoxOffsetDistance(x_data_box, stencil_shape[12]); xp13 = hypre_StructVectorBoxData(x, i) + hypre_BoxOffsetDistance(x_data_box, stencil_shape[13]); xp14 = hypre_StructVectorBoxData(x, i) + hypre_BoxOffsetDistance(x_data_box, stencil_shape[14]); xp15 = hypre_StructVectorBoxData(x, i) + hypre_BoxOffsetDistance(x_data_box, stencil_shape[15]); xp16 = hypre_StructVectorBoxData(x, i) + hypre_BoxOffsetDistance(x_data_box, stencil_shape[16]); xp17 = hypre_StructVectorBoxData(x, i) + hypre_BoxOffsetDistance(x_data_box, stencil_shape[17]); xp18 = hypre_StructVectorBoxData(x, i) + hypre_BoxOffsetDistance(x_data_box, stencil_shape[18]); xp19 = hypre_StructVectorBoxData(x, i) + hypre_BoxOffsetDistance(x_data_box, stencil_shape[19]); xp20 = hypre_StructVectorBoxData(x, i) + hypre_BoxOffsetDistance(x_data_box, stencil_shape[20]); xp21 = hypre_StructVectorBoxData(x, i) + hypre_BoxOffsetDistance(x_data_box, stencil_shape[21]); xp22 = hypre_StructVectorBoxData(x, i) + hypre_BoxOffsetDistance(x_data_box, stencil_shape[22]); xp23 = hypre_StructVectorBoxData(x, i) + hypre_BoxOffsetDistance(x_data_box, stencil_shape[23]); xp24 = hypre_StructVectorBoxData(x, i) + hypre_BoxOffsetDistance(x_data_box, stencil_shape[24]); xp25 = hypre_StructVectorBoxData(x, i) + hypre_BoxOffsetDistance(x_data_box, stencil_shape[25]); xp26 = hypre_StructVectorBoxData(x, i) + hypre_BoxOffsetDistance(x_data_box, stencil_shape[26]); break; default: ; } hypre_ForBoxI(j, compute_box_a) { compute_box = hypre_BoxArrayBox(compute_box_a, j); start = hypre_BoxIMin(compute_box); /*------------------------------------------------------ * Switch statement to direct control to appropriate * box loop depending on stencil size *------------------------------------------------------*/ switch (stencil_size) { case 1: hypre_BoxGetStrideSize(compute_box, base_stride, loop_size); #define DEVICE_VAR is_device_ptr(rp,Ap0,xp0) hypre_BoxLoop3Begin(hypre_StructMatrixNDim(A), loop_size, A_data_box, start, base_stride, Ai, x_data_box, start, base_stride, xi, r_data_box, start, base_stride, ri); { rp[ri] = rp[ri] - Ap0[Ai] * xp0[xi]; } hypre_BoxLoop3End(Ai, xi, ri); #undef DEVICE_VAR break; case 3: hypre_BoxGetStrideSize(compute_box, base_stride, loop_size); #define DEVICE_VAR is_device_ptr(rp,Ap0,xp0,Ap1,xp1,Ap2,xp2) hypre_BoxLoop3Begin(hypre_StructMatrixNDim(A), loop_size, A_data_box, start, base_stride, Ai, x_data_box, start, base_stride, xi, r_data_box, start, base_stride, ri); { rp[ri] = rp[ri] - Ap0[Ai] * xp0[xi] - Ap1[Ai] * xp1[xi] - Ap2[Ai] * xp2[xi]; } hypre_BoxLoop3End(Ai, xi, ri); #undef DEVICE_VAR break; case 5: hypre_BoxGetStrideSize(compute_box, base_stride, loop_size); #define DEVICE_VAR is_device_ptr(rp,Ap0,xp0,Ap1,xp1,Ap2,xp2,Ap3,xp3,Ap4,xp4) hypre_BoxLoop3Begin(hypre_StructMatrixNDim(A), loop_size, A_data_box, start, base_stride, Ai, x_data_box, start, base_stride, xi, r_data_box, start, base_stride, ri); { rp[ri] = rp[ri] - Ap0[Ai] * xp0[xi] - Ap1[Ai] * xp1[xi] - Ap2[Ai] * xp2[xi] - Ap3[Ai] * xp3[xi] - Ap4[Ai] * xp4[xi]; } hypre_BoxLoop3End(Ai, xi, ri); #undef DEVICE_VAR break; case 7: hypre_BoxGetStrideSize(compute_box, base_stride, loop_size); #define DEVICE_VAR is_device_ptr(rp,Ap0,xp0,Ap1,xp1,Ap2,xp2,Ap3,xp3,Ap4,xp4,Ap5,xp5,Ap6,xp6) hypre_BoxLoop3Begin(hypre_StructMatrixNDim(A), loop_size, A_data_box, start, base_stride, Ai, x_data_box, start, base_stride, xi, r_data_box, start, base_stride, ri); { rp[ri] = rp[ri] - Ap0[Ai] * xp0[xi] - Ap1[Ai] * xp1[xi] - Ap2[Ai] * xp2[xi] - Ap3[Ai] * xp3[xi] - Ap4[Ai] * xp4[xi] - Ap5[Ai] * xp5[xi] - Ap6[Ai] * xp6[xi]; } hypre_BoxLoop3End(Ai, xi, ri); #undef DEVICE_VAR break; case 9: hypre_BoxGetStrideSize(compute_box, base_stride, loop_size); #define DEVICE_VAR is_device_ptr(rp,Ap0,xp0,Ap1,xp1,Ap2,xp2,Ap3,xp3,Ap4,xp4,Ap5,xp5,Ap6,xp6,Ap7,xp7,Ap8,xp8) hypre_BoxLoop3Begin(hypre_StructMatrixNDim(A), loop_size, A_data_box, start, base_stride, Ai, x_data_box, start, base_stride, xi, r_data_box, start, base_stride, ri); { rp[ri] = rp[ri] - Ap0[Ai] * xp0[xi] - Ap1[Ai] * xp1[xi] - Ap2[Ai] * xp2[xi] - Ap3[Ai] * xp3[xi] - Ap4[Ai] * xp4[xi] - Ap5[Ai] * xp5[xi] - Ap6[Ai] * xp6[xi] - Ap7[Ai] * xp7[xi] - Ap8[Ai] * xp8[xi]; } hypre_BoxLoop3End(Ai, xi, ri); #undef DEVICE_VAR break; case 15: hypre_BoxGetStrideSize(compute_box, base_stride, loop_size); #define DEVICE_VAR is_device_ptr(rp,Ap0,xp0,Ap1,xp1,Ap2,xp2,Ap3,xp3,Ap4,xp4,Ap5,xp5,Ap6,xp6,Ap7,xp7,Ap8,xp8,Ap9,xp9,Ap10,xp10,Ap11,xp11,Ap12,xp12,Ap13,xp13,Ap14,xp14) hypre_BoxLoop3Begin(hypre_StructMatrixNDim(A), loop_size, A_data_box, start, base_stride, Ai, x_data_box, start, base_stride, xi, r_data_box, start, base_stride, ri); { rp[ri] = rp[ri] - Ap0[Ai] * xp0[xi] - Ap1[Ai] * xp1[xi] - Ap2[Ai] * xp2[xi] - Ap3[Ai] * xp3[xi] - Ap4[Ai] * xp4[xi] - Ap5[Ai] * xp5[xi] - Ap6[Ai] * xp6[xi] - Ap7[Ai] * xp7[xi] - Ap8[Ai] * xp8[xi] - Ap9[Ai] * xp9[xi] - Ap10[Ai] * xp10[xi] - Ap11[Ai] * xp11[xi] - Ap12[Ai] * xp12[xi] - Ap13[Ai] * xp13[xi] - Ap14[Ai] * xp14[xi]; } hypre_BoxLoop3End(Ai, xi, ri); #undef DEVICE_VAR break; case 19: hypre_BoxGetStrideSize(compute_box, base_stride, loop_size); #define DEVICE_VAR is_device_ptr(rp,Ap0,xp0,Ap1,xp1,Ap2,xp2,Ap3,xp3,Ap4,xp4,Ap5,xp5,Ap6,xp6,Ap7,xp7,Ap8,xp8,Ap9,xp9,Ap10,xp10,Ap11,xp11,Ap12,xp12,Ap13,xp13,Ap14,xp14,Ap15,xp15,Ap16,xp16,Ap17,xp17,Ap18,xp18) hypre_BoxLoop3Begin(hypre_StructMatrixNDim(A), loop_size, A_data_box, start, base_stride, Ai, x_data_box, start, base_stride, xi, r_data_box, start, base_stride, ri); { rp[ri] = rp[ri] - Ap0[Ai] * xp0[xi] - Ap1[Ai] * xp1[xi] - Ap2[Ai] * xp2[xi] - Ap3[Ai] * xp3[xi] - Ap4[Ai] * xp4[xi] - Ap5[Ai] * xp5[xi] - Ap6[Ai] * xp6[xi] - Ap7[Ai] * xp7[xi] - Ap8[Ai] * xp8[xi] - Ap9[Ai] * xp9[xi] - Ap10[Ai] * xp10[xi] - Ap11[Ai] * xp11[xi] - Ap12[Ai] * xp12[xi] - Ap13[Ai] * xp13[xi] - Ap14[Ai] * xp14[xi] - Ap15[Ai] * xp15[xi] - Ap16[Ai] * xp16[xi] - Ap17[Ai] * xp17[xi] - Ap18[Ai] * xp18[xi]; } hypre_BoxLoop3End(Ai, xi, ri); #undef DEVICE_VAR break; case 27: hypre_BoxGetStrideSize(compute_box, base_stride, loop_size); #define DEVICE_VAR is_device_ptr(rp,Ap0,xp0,Ap1,xp1,Ap2,xp2,Ap3,xp3,Ap4,xp4,Ap5,xp5,Ap6,xp6,Ap7,xp7,Ap8,xp8,Ap9,xp9,Ap10,xp10,Ap11,xp11,Ap12,xp12,Ap13,xp13,Ap14,xp14,Ap15,xp15,Ap16,xp16,Ap17,xp17,Ap18,xp18,Ap19,xp19,Ap20,xp20,Ap21,xp21,Ap22,xp22,Ap23,xp23,Ap24,xp24,Ap25,xp25,Ap26,xp26) hypre_BoxLoop3Begin(hypre_StructMatrixNDim(A), loop_size, A_data_box, start, base_stride, Ai, x_data_box, start, base_stride, xi, r_data_box, start, base_stride, ri); { rp[ri] = rp[ri] - Ap0[Ai] * xp0[xi] - Ap1[Ai] * xp1[xi] - Ap2[Ai] * xp2[xi] - Ap3[Ai] * xp3[xi] - Ap4[Ai] * xp4[xi] - Ap5[Ai] * xp5[xi] - Ap6[Ai] * xp6[xi] - Ap7[Ai] * xp7[xi] - Ap8[Ai] * xp8[xi] - Ap9[Ai] * xp9[xi] - Ap10[Ai] * xp10[xi] - Ap11[Ai] * xp11[xi] - Ap12[Ai] * xp12[xi] - Ap13[Ai] * xp13[xi] - Ap14[Ai] * xp14[xi] - Ap15[Ai] * xp15[xi] - Ap16[Ai] * xp16[xi] - Ap17[Ai] * xp17[xi] - Ap18[Ai] * xp18[xi] - Ap19[Ai] * xp19[xi] - Ap20[Ai] * xp20[xi] - Ap21[Ai] * xp21[xi] - Ap22[Ai] * xp22[xi] - Ap23[Ai] * xp23[xi] - Ap24[Ai] * xp24[xi] - Ap25[Ai] * xp25[xi] - Ap26[Ai] * xp26[xi]; } hypre_BoxLoop3End(Ai, xi, ri); #undef DEVICE_VAR break; default: for (si = 0; si < stencil_size; si++) { Ap0 = hypre_StructMatrixBoxData(A, i, si); xp0 = hypre_StructVectorBoxData(x, i) + hypre_BoxOffsetDistance(x_data_box, stencil_shape[si]); hypre_BoxGetStrideSize(compute_box, base_stride, loop_size); #define DEVICE_VAR is_device_ptr(rp,Ap0,xp0) hypre_BoxLoop3Begin(hypre_StructMatrixNDim(A), loop_size, A_data_box, start, base_stride, Ai, x_data_box, start, base_stride, xi, r_data_box, start, base_stride, ri); { rp[ri] -= Ap0[Ai] * xp0[xi]; } hypre_BoxLoop3End(Ai, xi, ri); #undef DEVICE_VAR } } } } } /*----------------------------------------------------------------------- * Return *-----------------------------------------------------------------------*/ hypre_IncFLOPCount(residual_data -> flops); hypre_EndTiming(residual_data -> time_index); return ierr; } /*-------------------------------------------------------------------------- * hypre_SMGResidualSetBase *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SMGResidualSetBase( void *residual_vdata, hypre_Index base_index, hypre_Index base_stride ) { hypre_SMGResidualData *residual_data = residual_vdata; HYPRE_Int d; HYPRE_Int ierr = 0; for (d = 0; d < 3; d++) { hypre_IndexD((residual_data -> base_index), d) = hypre_IndexD(base_index, d); hypre_IndexD((residual_data -> base_stride), d) = hypre_IndexD(base_stride, d); } return ierr; } /*-------------------------------------------------------------------------- * hypre_SMGResidualDestroy *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SMGResidualDestroy( void *residual_vdata ) { HYPRE_Int ierr; hypre_SMGResidualData *residual_data = residual_vdata; if (residual_data) { hypre_StructMatrixDestroy(residual_data -> A); hypre_StructVectorDestroy(residual_data -> x); hypre_StructVectorDestroy(residual_data -> b); hypre_StructVectorDestroy(residual_data -> r); hypre_BoxArrayDestroy(residual_data -> base_points); hypre_ComputePkgDestroy(residual_data -> compute_pkg ); hypre_FinalizeTiming(residual_data -> time_index); hypre_TFree(residual_data, HYPRE_MEMORY_HOST); } return ierr; } hypre-2.33.0/src/struct_ls/smg_setup.c000066400000000000000000000535161477326011500177310ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "_hypre_struct_ls.h" #include "smg.h" #define DEBUG 0 /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SMGSetup( void *smg_vdata, hypre_StructMatrix *A, hypre_StructVector *b, hypre_StructVector *x ) { hypre_SMGData *smg_data = (hypre_SMGData *) smg_vdata; MPI_Comm comm = (smg_data -> comm); hypre_IndexRef base_index = (smg_data -> base_index); hypre_IndexRef base_stride = (smg_data -> base_stride); HYPRE_Int n_pre = (smg_data -> num_pre_relax); HYPRE_Int n_post = (smg_data -> num_post_relax); HYPRE_Int max_iter; HYPRE_Int max_levels; HYPRE_Int num_levels; HYPRE_Int cdir; hypre_Index bindex; hypre_Index bstride; hypre_Index cindex; hypre_Index findex; hypre_Index stride; hypre_StructGrid **grid_l; hypre_StructGrid **PT_grid_l; HYPRE_Real *data; HYPRE_Real *data_const; HYPRE_Int data_size = 0; HYPRE_Int data_size_const = 0; hypre_StructMatrix **A_l; hypre_StructMatrix **PT_l; hypre_StructMatrix **R_l; hypre_StructVector **b_l; hypre_StructVector **x_l; /* temp vectors */ hypre_StructVector **tb_l; hypre_StructVector **tx_l; hypre_StructVector **r_l; hypre_StructVector **e_l; HYPRE_Real *b_data; HYPRE_Real *x_data; HYPRE_Int b_data_alloced; HYPRE_Int x_data_alloced; void **relax_data_l; void **residual_data_l; void **restrict_data_l; void **interp_data_l; hypre_StructGrid *grid; hypre_Box *cbox; HYPRE_Int i, l; HYPRE_Int b_num_ghost[] = {0, 0, 0, 0, 0, 0}; HYPRE_Int x_num_ghost[] = {0, 0, 0, 0, 0, 0}; #if DEBUG char filename[255]; #endif HYPRE_MemoryLocation memory_location = hypre_StructMatrixMemoryLocation(A); /*----------------------------------------------------- * Set up coarsening direction *-----------------------------------------------------*/ HYPRE_ANNOTATE_FUNC_BEGIN; cdir = hypre_StructStencilNDim(hypre_StructMatrixStencil(A)) - 1; (smg_data -> cdir) = cdir; /*----------------------------------------------------- * Set up coarse grids *-----------------------------------------------------*/ grid = hypre_StructMatrixGrid(A); /* Compute a new max_levels value based on the grid */ cbox = hypre_BoxDuplicate(hypre_StructGridBoundingBox(grid)); max_levels = hypre_Log2(hypre_BoxSizeD(cbox, cdir)) + 2; if ((smg_data -> max_levels) > 0) { max_levels = hypre_min(max_levels, (smg_data -> max_levels)); } (smg_data -> max_levels) = max_levels; grid_l = hypre_TAlloc(hypre_StructGrid *, max_levels, HYPRE_MEMORY_HOST); PT_grid_l = hypre_TAlloc(hypre_StructGrid *, max_levels, HYPRE_MEMORY_HOST); PT_grid_l[0] = NULL; hypre_StructGridRef(grid, &grid_l[0]); #if 0 //defined(HYPRE_USING_CUDA) || defined(HYPRE_USING_HIP) data_location = hypre_StructGridDataLocation(grid); if (data_location != HYPRE_MEMORY_HOST) { num_level_GPU = max_levels; } else { num_level_GPU = 0; device_level = 0; } if (hypre_StructGridNDim(grid) != hypre_StructStencilNDim(hypre_StructMatrixStencil(A))) { device_level = num_level_GPU; } #endif for (l = 0; ; l++) { /* set cindex and stride */ hypre_SMGSetCIndex(base_index, base_stride, l, cdir, cindex); hypre_SMGSetStride(base_index, base_stride, l, cdir, stride); /* check to see if we should coarsen */ if ( ( hypre_BoxIMinD(cbox, cdir) == hypre_BoxIMaxD(cbox, cdir) ) || (l == (max_levels - 1)) ) { /* stop coarsening */ break; } /* coarsen cbox */ hypre_ProjectBox(cbox, cindex, stride); hypre_StructMapFineToCoarse(hypre_BoxIMin(cbox), cindex, stride, hypre_BoxIMin(cbox)); hypre_StructMapFineToCoarse(hypre_BoxIMax(cbox), cindex, stride, hypre_BoxIMax(cbox)); /* build the interpolation grid */ hypre_StructCoarsen(grid_l[l], cindex, stride, 0, &PT_grid_l[l + 1]); /* build the coarse grid */ hypre_StructCoarsen(grid_l[l], cindex, stride, 1, &grid_l[l + 1]); #if 0 //defined(HYPRE_USING_CUDA) || defined(HYPRE_USING_HIP) hypre_StructGridDataLocation(PT_grid_l[l + 1]) = data_location; if (device_level == -1 && num_level_GPU > 0) { max_box_size = hypre_StructGridGetMaxBoxSize(grid_l[l + 1]); if (max_box_size < HYPRE_MIN_GPU_SIZE) { num_level_GPU = l + 1; data_location = HYPRE_MEMORY_HOST; device_level = num_level_GPU; //printf("num_level_GPU = %d,device_level = %d\n",num_level_GPU,device_level); } } else if (l + 1 == device_level) { num_level_GPU = l + 1; data_location = HYPRE_MEMORY_HOST; } hypre_StructGridDataLocation(grid_l[l + 1]) = data_location; #endif } num_levels = l + 1; /* free up some things */ hypre_BoxDestroy(cbox); (smg_data -> num_levels) = num_levels; (smg_data -> grid_l) = grid_l; (smg_data -> PT_grid_l) = PT_grid_l; /*----------------------------------------------------- * Set up matrix and vector structures *-----------------------------------------------------*/ A_l = hypre_TAlloc(hypre_StructMatrix *, num_levels, HYPRE_MEMORY_HOST); PT_l = hypre_TAlloc(hypre_StructMatrix *, num_levels - 1, HYPRE_MEMORY_HOST); R_l = hypre_TAlloc(hypre_StructMatrix *, num_levels - 1, HYPRE_MEMORY_HOST); b_l = hypre_TAlloc(hypre_StructVector *, num_levels, HYPRE_MEMORY_HOST); x_l = hypre_TAlloc(hypre_StructVector *, num_levels, HYPRE_MEMORY_HOST); tb_l = hypre_TAlloc(hypre_StructVector *, num_levels, HYPRE_MEMORY_HOST); tx_l = hypre_TAlloc(hypre_StructVector *, num_levels, HYPRE_MEMORY_HOST); r_l = tx_l; e_l = tx_l; A_l[0] = hypre_StructMatrixRef(A); b_l[0] = hypre_StructVectorRef(b); x_l[0] = hypre_StructVectorRef(x); for (i = 0; i <= cdir; i++) { x_num_ghost[2 * i] = 1; x_num_ghost[2 * i + 1] = 1; } tb_l[0] = hypre_StructVectorCreate(comm, grid_l[0]); hypre_StructVectorSetNumGhost(tb_l[0], hypre_StructVectorNumGhost(b)); hypre_StructVectorInitializeShell(tb_l[0]); hypre_StructVectorSetDataSize(tb_l[0], &data_size, &data_size_const); tx_l[0] = hypre_StructVectorCreate(comm, grid_l[0]); hypre_StructVectorSetNumGhost(tx_l[0], hypre_StructVectorNumGhost(x)); hypre_StructVectorInitializeShell(tx_l[0]); hypre_StructVectorSetDataSize(tx_l[0], &data_size, &data_size_const); for (l = 0; l < (num_levels - 1); l++) { PT_l[l] = hypre_SMGCreateInterpOp(A_l[l], PT_grid_l[l + 1], cdir); hypre_StructMatrixInitializeShell(PT_l[l]); data_size += hypre_StructMatrixDataSize(PT_l[l]); data_size_const += hypre_StructMatrixDataConstSize(PT_l[l]); if (hypre_StructMatrixSymmetric(A)) { R_l[l] = PT_l[l]; } else { R_l[l] = PT_l[l]; #if 0 /* Allow R != PT for non symmetric case */ /* NOTE: Need to create a non-pruned grid for this to work */ R_l[l] = hypre_SMGCreateRestrictOp(A_l[l], grid_l[l + 1], cdir); hypre_StructMatrixInitializeShell(R_l[l]); data_size += hypre_StructMatrixDataSize(R_l[l]); data_size_const += hypre_StructMatrixDataConstSize(R_l[l]); #endif } A_l[l + 1] = hypre_SMGCreateRAPOp(R_l[l], A_l[l], PT_l[l], grid_l[l + 1]); hypre_StructMatrixInitializeShell(A_l[l + 1]); data_size += hypre_StructMatrixDataSize(A_l[l + 1]); data_size_const += hypre_StructMatrixDataConstSize(A_l[l + 1]); b_l[l + 1] = hypre_StructVectorCreate(comm, grid_l[l + 1]); hypre_StructVectorSetNumGhost(b_l[l + 1], b_num_ghost); hypre_StructVectorInitializeShell(b_l[l + 1]); hypre_StructVectorSetDataSize(b_l[l + 1], &data_size, &data_size_const); x_l[l + 1] = hypre_StructVectorCreate(comm, grid_l[l + 1]); hypre_StructVectorSetNumGhost(x_l[l + 1], x_num_ghost); hypre_StructVectorInitializeShell(x_l[l + 1]); hypre_StructVectorSetDataSize(x_l[l + 1], &data_size, &data_size_const); tb_l[l + 1] = hypre_StructVectorCreate(comm, grid_l[l + 1]); hypre_StructVectorSetNumGhost(tb_l[l + 1], hypre_StructVectorNumGhost(b)); hypre_StructVectorInitializeShell(tb_l[l + 1]); tx_l[l + 1] = hypre_StructVectorCreate(comm, grid_l[l + 1]); hypre_StructVectorSetNumGhost(tx_l[l + 1], hypre_StructVectorNumGhost(x)); hypre_StructVectorInitializeShell(tx_l[l + 1]); #if 0 //defined(HYPRE_USING_CUDA) || defined(HYPRE_USING_HIP) if (l + 1 == num_level_GPU) { hypre_StructVectorSetDataSize(tb_l[l + 1], &data_size, &data_size_const); hypre_StructVectorSetDataSize(tx_l[l + 1], &data_size, &data_size_const); } #endif } data = hypre_CTAlloc(HYPRE_Real, data_size, memory_location); data_const = hypre_CTAlloc(HYPRE_Real, data_size_const, HYPRE_MEMORY_HOST); (smg_data -> memory_location) = memory_location; (smg_data -> data) = data; (smg_data -> data_const) = data_const; #if 0 //defined(HYPRE_USING_CUDA) || defined(HYPRE_USING_HIP) //if (hypre_StructGridNDim(grid) == hypre_StructStencilNDim(hypre_StructMatrixStencil(A))) // printf("num_level_GPU = %d,device_level = %d / %d\n",num_level_GPU,device_level,num_levels); data_location = hypre_StructGridDataLocation(grid_l[0]); if (data_location != HYPRE_MEMORY_HOST) { hypre_StructVectorInitializeData(tb_l[0], data); hypre_StructVectorAssemble(tb_l[0]); data += hypre_StructVectorDataSize(tb_l[0]); hypre_StructVectorInitializeData(tx_l[0], data); hypre_StructVectorAssemble(tx_l[0]); data += hypre_StructVectorDataSize(tx_l[0]); //printf("smg_setup: Alloc tx_l[0] on GPU\n"); } else { hypre_StructVectorInitializeData(tb_l[0], data_const); hypre_StructVectorAssemble(tb_l[0]); data_const += hypre_StructVectorDataSize(tb_l[0]); hypre_StructVectorInitializeData(tx_l[0], data_const); hypre_StructVectorAssemble(tx_l[0]); data_const += hypre_StructVectorDataSize(tx_l[0]); //printf("smg_setup: Alloc tx_l[0] on CPU\n"); } #else hypre_StructVectorInitializeData(tb_l[0], data); hypre_StructVectorAssemble(tb_l[0]); data += hypre_StructVectorDataSize(tb_l[0]); hypre_StructVectorInitializeData(tx_l[0], data); hypre_StructVectorAssemble(tx_l[0]); data += hypre_StructVectorDataSize(tx_l[0]); #endif for (l = 0; l < (num_levels - 1); l++) { hypre_StructMatrixInitializeData(PT_l[l], data, data_const); data += hypre_StructMatrixDataSize(PT_l[l]); data_const += hypre_StructMatrixDataConstSize(PT_l[l]); #if 0 /* Allow R != PT for non symmetric case */ if (!hypre_StructMatrixSymmetric(A)) { hypre_StructMatrixInitializeData(R_l[l], data, data_const); data += hypre_StructMatrixDataSize(R_l[l]); data_const += hypre_StructMatrixDataConstSize(R_l[l]); } #endif #if 0 //defined(HYPRE_USING_CUDA) || defined(HYPRE_USING_HIP) if (l + 1 == num_level_GPU) { data_location = HYPRE_MEMORY_HOST; } #endif hypre_StructMatrixInitializeData(A_l[l + 1], data, data_const); data += hypre_StructMatrixDataSize(A_l[l + 1]); data_const += hypre_StructMatrixDataConstSize(A_l[l + 1]); #if 0 //defined(HYPRE_USING_CUDA) || defined(HYPRE_USING_HIP) if (data_location != HYPRE_MEMORY_HOST) { hypre_StructVectorInitializeData(b_l[l + 1], data); hypre_StructVectorAssemble(b_l[l + 1]); data += hypre_StructVectorDataSize(b_l[l + 1]); hypre_StructVectorInitializeData(x_l[l + 1], data); hypre_StructVectorAssemble(x_l[l + 1]); data += hypre_StructVectorDataSize(x_l[l + 1]); hypre_StructVectorInitializeData(tb_l[l + 1], hypre_StructVectorData(tb_l[0])); hypre_StructVectorAssemble(tb_l[l + 1]); hypre_StructVectorInitializeData(tx_l[l + 1], hypre_StructVectorData(tx_l[0])); hypre_StructVectorAssemble(tx_l[l + 1]); //printf("\n Alloc x_l,b_l[%d] on GPU\n",l+1); } else { hypre_StructVectorInitializeData(b_l[l + 1], data_const); hypre_StructVectorAssemble(b_l[l + 1]); data_const += hypre_StructVectorDataSize(b_l[l + 1]); hypre_StructVectorInitializeData(x_l[l + 1], data_const); hypre_StructVectorAssemble(x_l[l + 1]); data_const += hypre_StructVectorDataSize(x_l[l + 1]); if (l + 1 == num_level_GPU) { hypre_StructVectorInitializeData(tb_l[l + 1], data_const); hypre_StructVectorAssemble(tb_l[l + 1]); data_const += hypre_StructVectorDataSize(tb_l[l + 1]); hypre_StructVectorInitializeData(tx_l[l + 1], data_const); hypre_StructVectorAssemble(tx_l[l + 1]); data_const += hypre_StructVectorDataSize(tx_l[l + 1]); } else { hypre_StructVectorInitializeData(tb_l[l + 1], hypre_StructVectorData(tb_l[num_level_GPU])); hypre_StructVectorAssemble(tb_l[l + 1]); hypre_StructVectorInitializeData(tx_l[l + 1], hypre_StructVectorData(tx_l[num_level_GPU])); hypre_StructVectorAssemble(tx_l[l + 1]); } //printf("\n Alloc x_l,b_l[%d] on CPU\n",l+1); } #else hypre_StructVectorInitializeData(b_l[l + 1], data); hypre_StructVectorAssemble(b_l[l + 1]); data += hypre_StructVectorDataSize(b_l[l + 1]); hypre_StructVectorInitializeData(x_l[l + 1], data); hypre_StructVectorAssemble(x_l[l + 1]); data += hypre_StructVectorDataSize(x_l[l + 1]); hypre_StructVectorInitializeData(tb_l[l + 1], hypre_StructVectorData(tb_l[0])); hypre_StructVectorAssemble(tb_l[l + 1]); hypre_StructVectorInitializeData(tx_l[l + 1], hypre_StructVectorData(tx_l[0])); hypre_StructVectorAssemble(tx_l[l + 1]); #endif } (smg_data -> A_l) = A_l; (smg_data -> PT_l) = PT_l; (smg_data -> R_l) = R_l; (smg_data -> b_l) = b_l; (smg_data -> x_l) = x_l; (smg_data -> tb_l) = tb_l; (smg_data -> tx_l) = tx_l; (smg_data -> r_l) = r_l; (smg_data -> e_l) = e_l; /*----------------------------------------------------- * Set up multigrid operators and call setup routines * * Note: The routine that sets up interpolation uses * the same relaxation routines used in the solve * phase of the algorithm. To do this, the data for * the fine-grid unknown and right-hand-side vectors * is temporarily changed to temporary data. *-----------------------------------------------------*/ relax_data_l = hypre_TAlloc(void *, num_levels, HYPRE_MEMORY_HOST); residual_data_l = hypre_TAlloc(void *, num_levels, HYPRE_MEMORY_HOST); restrict_data_l = hypre_TAlloc(void *, num_levels, HYPRE_MEMORY_HOST); interp_data_l = hypre_TAlloc(void *, num_levels, HYPRE_MEMORY_HOST); /* temporarily set the data for x_l[0] and b_l[0] to temp data */ b_data = hypre_StructVectorData(b_l[0]); b_data_alloced = hypre_StructVectorDataAlloced(b_l[0]); x_data = hypre_StructVectorData(x_l[0]); x_data_alloced = hypre_StructVectorDataAlloced(x_l[0]); hypre_StructVectorInitializeData(b_l[0], hypre_StructVectorData(tb_l[0])); hypre_StructVectorInitializeData(x_l[0], hypre_StructVectorData(tx_l[0])); hypre_StructVectorAssemble(b_l[0]); hypre_StructVectorAssemble(x_l[0]); for (l = 0; l < (num_levels - 1); l++) { #if 0 //defined(HYPRE_USING_CUDA) || defined(HYPRE_USING_HIP) if (l == num_level_GPU) { hypre_SetDeviceOff(); } #endif hypre_SMGSetBIndex(base_index, base_stride, l, bindex); hypre_SMGSetBStride(base_index, base_stride, l, bstride); hypre_SMGSetCIndex(base_index, base_stride, l, cdir, cindex); hypre_SMGSetFIndex(base_index, base_stride, l, cdir, findex); hypre_SMGSetStride(base_index, base_stride, l, cdir, stride); /* set up relaxation */ relax_data_l[l] = hypre_SMGRelaxCreate(comm); hypre_SMGRelaxSetBase(relax_data_l[l], bindex, bstride); hypre_SMGRelaxSetMemoryUse(relax_data_l[l], (smg_data -> memory_use)); hypre_SMGRelaxSetTol(relax_data_l[l], 0.0); hypre_SMGRelaxSetNumSpaces(relax_data_l[l], 2); hypre_SMGRelaxSetSpace(relax_data_l[l], 0, hypre_IndexD(cindex, cdir), hypre_IndexD(stride, cdir)); hypre_SMGRelaxSetSpace(relax_data_l[l], 1, hypre_IndexD(findex, cdir), hypre_IndexD(stride, cdir)); hypre_SMGRelaxSetTempVec(relax_data_l[l], tb_l[l]); hypre_SMGRelaxSetNumPreRelax( relax_data_l[l], n_pre); hypre_SMGRelaxSetNumPostRelax( relax_data_l[l], n_post); //hypre_SMGRelaxSetMaxLevel( relax_data_l[l], l+6); hypre_SMGRelaxSetup(relax_data_l[l], A_l[l], b_l[l], x_l[l]); hypre_SMGSetupInterpOp(relax_data_l[l], A_l[l], b_l[l], x_l[l], PT_l[l], cdir, cindex, findex, stride); /* (re)set relaxation parameters */ hypre_SMGRelaxSetNumPreSpaces(relax_data_l[l], 0); hypre_SMGRelaxSetNumRegSpaces(relax_data_l[l], 2); hypre_SMGRelaxSetup(relax_data_l[l], A_l[l], b_l[l], x_l[l]); /* set up the residual routine */ residual_data_l[l] = hypre_SMGResidualCreate(); hypre_SMGResidualSetBase(residual_data_l[l], bindex, bstride); hypre_SMGResidualSetup(residual_data_l[l], A_l[l], x_l[l], b_l[l], r_l[l]); /* set up the interpolation routine */ interp_data_l[l] = hypre_SemiInterpCreate(); hypre_SemiInterpSetup(interp_data_l[l], PT_l[l], 1, x_l[l + 1], e_l[l], cindex, findex, stride); /* set up the restriction operator */ #if 0 /* Allow R != PT for non symmetric case */ if (!hypre_StructMatrixSymmetric(A)) hypre_SMGSetupRestrictOp(A_l[l], R_l[l], tx_l[l], cdir, cindex, stride); #endif /* set up the restriction routine */ restrict_data_l[l] = hypre_SemiRestrictCreate(); hypre_SemiRestrictSetup(restrict_data_l[l], R_l[l], 0, r_l[l], b_l[l + 1], cindex, findex, stride); /* set up the coarse grid operator */ hypre_SMGSetupRAPOp(R_l[l], A_l[l], PT_l[l], A_l[l + 1], cindex, stride); } #if 0 //defined(HYPRE_USING_CUDA) || defined(HYPRE_USING_HIP) if (l == num_level_GPU) { hypre_SetDeviceOff(); } #endif hypre_SMGSetBIndex(base_index, base_stride, l, bindex); hypre_SMGSetBStride(base_index, base_stride, l, bstride); relax_data_l[l] = hypre_SMGRelaxCreate(comm); hypre_SMGRelaxSetBase(relax_data_l[l], bindex, bstride); hypre_SMGRelaxSetTol(relax_data_l[l], 0.0); hypre_SMGRelaxSetMaxIter(relax_data_l[l], 1); hypre_SMGRelaxSetTempVec(relax_data_l[l], tb_l[l]); hypre_SMGRelaxSetNumPreRelax( relax_data_l[l], n_pre); hypre_SMGRelaxSetNumPostRelax( relax_data_l[l], n_post); hypre_SMGRelaxSetup(relax_data_l[l], A_l[l], b_l[l], x_l[l]); /* set up the residual routine in case of a single grid level */ if ( l == 0 ) { residual_data_l[l] = hypre_SMGResidualCreate(); hypre_SMGResidualSetBase(residual_data_l[l], bindex, bstride); hypre_SMGResidualSetup(residual_data_l[l], A_l[l], x_l[l], b_l[l], r_l[l]); } /* set the data for x_l[0] and b_l[0] the way they were */ hypre_StructVectorInitializeData(b_l[0], b_data); hypre_StructVectorDataAlloced(b_l[0]) = b_data_alloced; hypre_StructVectorInitializeData(x_l[0], x_data); hypre_StructVectorDataAlloced(x_l[0]) = x_data_alloced; hypre_StructVectorAssemble(b_l[0]); hypre_StructVectorAssemble(x_l[0]); (smg_data -> relax_data_l) = relax_data_l; (smg_data -> residual_data_l) = residual_data_l; (smg_data -> restrict_data_l) = restrict_data_l; (smg_data -> interp_data_l) = interp_data_l; /*----------------------------------------------------- * Allocate space for log info *-----------------------------------------------------*/ if ((smg_data -> logging) > 0) { max_iter = (smg_data -> max_iter); (smg_data -> norms) = hypre_TAlloc(HYPRE_Real, max_iter, HYPRE_MEMORY_HOST); (smg_data -> rel_norms) = hypre_TAlloc(HYPRE_Real, max_iter, HYPRE_MEMORY_HOST); } #if DEBUG if (hypre_StructGridNDim(grid_l[0]) == 3) { for (l = 0; l < (num_levels - 1); l++) { hypre_sprintf(filename, "zout_A.%02d", l); hypre_StructMatrixPrint(filename, A_l[l], 0); hypre_sprintf(filename, "zout_PT.%02d", l); hypre_StructMatrixPrint(filename, PT_l[l], 0); } hypre_sprintf(filename, "zout_A.%02d", l); hypre_StructMatrixPrint(filename, A_l[l], 0); } #endif HYPRE_ANNOTATE_FUNC_END; return hypre_error_flag; } hypre-2.33.0/src/struct_ls/smg_setup_interp.c000066400000000000000000000245651477326011500213140ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "_hypre_struct_ls.h" #include "_hypre_struct_mv.hpp" #include "smg.h" /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ hypre_StructMatrix * hypre_SMGCreateInterpOp( hypre_StructMatrix *A, hypre_StructGrid *cgrid, HYPRE_Int cdir ) { hypre_StructMatrix *PT; hypre_StructStencil *stencil; hypre_Index *stencil_shape; HYPRE_Int stencil_size; HYPRE_Int stencil_dim; HYPRE_Int num_ghost[] = {1, 1, 1, 1, 1, 1}; HYPRE_Int i; /* set up stencil */ stencil_size = 2; stencil_dim = hypre_StructStencilNDim(hypre_StructMatrixStencil(A)); stencil_shape = hypre_CTAlloc(hypre_Index, stencil_size, HYPRE_MEMORY_HOST); for (i = 0; i < stencil_size; i++) { hypre_SetIndex3(stencil_shape[i], 0, 0, 0); } hypre_IndexD(stencil_shape[0], cdir) = -1; hypre_IndexD(stencil_shape[1], cdir) = 1; stencil = hypre_StructStencilCreate(stencil_dim, stencil_size, stencil_shape); /* set up matrix */ PT = hypre_StructMatrixCreate(hypre_StructMatrixComm(A), cgrid, stencil); hypre_StructMatrixSetNumGhost(PT, num_ghost); hypre_StructStencilDestroy(stencil); return PT; } /*-------------------------------------------------------------------------- * This routine uses SMGRelax to set up the interpolation operator. * * To illustrate how it proceeds, consider setting up the the {0, 0, -1} * stencil coefficient of P^T. This coefficient corresponds to the * {0, 0, 1} coefficient of P. Do one sweep of plane relaxation on the * fine grid points for the system, A_mask x = b, with initial guess * x_0 = all ones and right-hand-side b = all zeros. The A_mask matrix * contains all coefficients of A except for those in the same direction * as {0, 0, -1}. * * The relaxation data for the multigrid algorithm is passed in and used. * When this routine returns, the only modified relaxation parameters * are MaxIter, RegSpace and PreSpace info, the right-hand-side and * solution info. *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SMGSetupInterpOp( void *relax_data, hypre_StructMatrix *A, hypre_StructVector *b, hypre_StructVector *x, hypre_StructMatrix *PT, HYPRE_Int cdir, hypre_Index cindex, hypre_Index findex, hypre_Index stride ) { hypre_StructMatrix *A_mask; hypre_StructStencil *A_stencil; hypre_Index *A_stencil_shape; HYPRE_Int A_stencil_size; hypre_StructStencil *PT_stencil; hypre_Index *PT_stencil_shape; HYPRE_Int PT_stencil_size; HYPRE_Int *stencil_indices; HYPRE_Int num_stencil_indices; hypre_StructGrid *fgrid; hypre_StructStencil *compute_pkg_stencil; hypre_Index *compute_pkg_stencil_shape; HYPRE_Int compute_pkg_stencil_size = 1; HYPRE_Int compute_pkg_stencil_dim = 1; hypre_ComputePkg *compute_pkg; hypre_ComputeInfo *compute_info; hypre_CommHandle *comm_handle; hypre_BoxArrayArray *compute_box_aa; hypre_BoxArray *compute_box_a; hypre_Box *compute_box; hypre_Box *PT_data_box; hypre_Box *x_data_box; HYPRE_Real *PTp; HYPRE_Real *xp; hypre_Index loop_size; hypre_Index start; hypre_Index startc; hypre_Index stridec; HYPRE_Int si, sj, d; HYPRE_Int compute_i, i, j; /*-------------------------------------------------------- * Initialize some things *--------------------------------------------------------*/ hypre_SetIndex3(stridec, 1, 1, 1); fgrid = hypre_StructMatrixGrid(A); A_stencil = hypre_StructMatrixStencil(A); A_stencil_shape = hypre_StructStencilShape(A_stencil); A_stencil_size = hypre_StructStencilSize(A_stencil); PT_stencil = hypre_StructMatrixStencil(PT); PT_stencil_shape = hypre_StructStencilShape(PT_stencil); PT_stencil_size = hypre_StructStencilSize(PT_stencil); /* Set up relaxation parameters */ hypre_SMGRelaxSetMaxIter(relax_data, 1); hypre_SMGRelaxSetNumPreSpaces(relax_data, 0); hypre_SMGRelaxSetNumRegSpaces(relax_data, 1); hypre_SMGRelaxSetRegSpaceRank(relax_data, 0, 1); compute_pkg_stencil_shape = hypre_CTAlloc(hypre_Index, compute_pkg_stencil_size, HYPRE_MEMORY_HOST); compute_pkg_stencil = hypre_StructStencilCreate(compute_pkg_stencil_dim, compute_pkg_stencil_size, compute_pkg_stencil_shape); for (si = 0; si < PT_stencil_size; si++) { /*----------------------------------------------------- * Compute A_mask matrix: This matrix contains all * stencil coefficients of A except for the coefficients * in the opposite direction of the current P stencil * coefficient being computed (same direction for P^T). *-----------------------------------------------------*/ stencil_indices = hypre_TAlloc(HYPRE_Int, A_stencil_size, HYPRE_MEMORY_HOST); num_stencil_indices = 0; for (sj = 0; sj < A_stencil_size; sj++) { if (hypre_IndexD(A_stencil_shape[sj], cdir) != hypre_IndexD(PT_stencil_shape[si], cdir) ) { stencil_indices[num_stencil_indices] = sj; num_stencil_indices++; } } A_mask = hypre_StructMatrixCreateMask(A, num_stencil_indices, stencil_indices); hypre_TFree(stencil_indices, HYPRE_MEMORY_HOST); /*----------------------------------------------------- * Do relaxation sweep to compute coefficients *-----------------------------------------------------*/ hypre_StructVectorClearGhostValues(x); hypre_StructVectorSetConstantValues(x, 1.0); hypre_StructVectorSetConstantValues(b, 0.0); hypre_SMGRelaxSetNewMatrixStencil(relax_data, PT_stencil); hypre_SMGRelaxSetup(relax_data, A_mask, b, x); hypre_SMGRelax(relax_data, A_mask, b, x); /*----------------------------------------------------- * Free up A_mask matrix *-----------------------------------------------------*/ hypre_StructMatrixDestroy(A_mask); /*----------------------------------------------------- * Set up compute package for communication of * coefficients from fine to coarse across processor * boundaries. *-----------------------------------------------------*/ hypre_CopyIndex(PT_stencil_shape[si], compute_pkg_stencil_shape[0]); hypre_CreateComputeInfo(fgrid, compute_pkg_stencil, &compute_info); hypre_ComputeInfoProjectSend(compute_info, findex, stride); hypre_ComputeInfoProjectRecv(compute_info, findex, stride); hypre_ComputeInfoProjectComp(compute_info, cindex, stride); hypre_ComputePkgCreate(compute_info, hypre_StructVectorDataSpace(x), 1, fgrid, &compute_pkg); /*----------------------------------------------------- * Copy coefficients from x into P^T *-----------------------------------------------------*/ for (compute_i = 0; compute_i < 2; compute_i++) { switch (compute_i) { case 0: { xp = hypre_StructVectorData(x); hypre_InitializeIndtComputations(compute_pkg, xp, &comm_handle); compute_box_aa = hypre_ComputePkgIndtBoxes(compute_pkg); } break; case 1: { hypre_FinalizeIndtComputations(comm_handle); compute_box_aa = hypre_ComputePkgDeptBoxes(compute_pkg); } break; } hypre_ForBoxArrayI(i, compute_box_aa) { compute_box_a = hypre_BoxArrayArrayBoxArray(compute_box_aa, i); x_data_box = hypre_BoxArrayBox(hypre_StructVectorDataSpace(x), i); PT_data_box = hypre_BoxArrayBox(hypre_StructMatrixDataSpace(PT), i); xp = hypre_StructVectorBoxData(x, i); PTp = hypre_StructMatrixBoxData(PT, i, si); hypre_ForBoxI(j, compute_box_a) { compute_box = hypre_BoxArrayBox(compute_box_a, j); hypre_CopyIndex(hypre_BoxIMin(compute_box), start); hypre_StructMapFineToCoarse(start, cindex, stride, startc); /* shift start index to appropriate F-point */ for (d = 0; d < 3; d++) { hypre_IndexD(start, d) += hypre_IndexD(PT_stencil_shape[si], d); } hypre_BoxGetStrideSize(compute_box, stride, loop_size); #define DEVICE_VAR is_device_ptr(PTp,xp) hypre_BoxLoop2Begin(hypre_StructMatrixNDim(A), loop_size, x_data_box, start, stride, xi, PT_data_box, startc, stridec, PTi); { PTp[PTi] = xp[xi]; } hypre_BoxLoop2End(xi, PTi); #undef DEVICE_VAR } } } /*----------------------------------------------------- * Free up compute package info *-----------------------------------------------------*/ hypre_ComputePkgDestroy(compute_pkg); } /* Tell SMGRelax that the stencil has changed */ hypre_SMGRelaxSetNewMatrixStencil(relax_data, PT_stencil); hypre_StructStencilDestroy(compute_pkg_stencil); #if 0 hypre_StructMatrixAssemble(PT); #else hypre_StructInterpAssemble(A, PT, 1, cdir, cindex, stride); #endif return hypre_error_flag; } hypre-2.33.0/src/struct_ls/smg_setup_rap.c000066400000000000000000000160021477326011500205600ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "_hypre_struct_ls.h" #include "smg.h" #define OLDRAP 1 #define NEWRAP 0 /*-------------------------------------------------------------------------- * Wrapper for 2 and 3d CreateRAPOp routines which set up new coarse * grid structures. *--------------------------------------------------------------------------*/ hypre_StructMatrix * hypre_SMGCreateRAPOp( hypre_StructMatrix *R, hypre_StructMatrix *A, hypre_StructMatrix *PT, hypre_StructGrid *coarse_grid ) { hypre_StructMatrix *RAP = NULL; hypre_StructStencil *stencil; #if NEWRAP HYPRE_Int cdir; HYPRE_Int P_stored_as_transpose = 1; #endif stencil = hypre_StructMatrixStencil(A); #if OLDRAP switch (hypre_StructStencilNDim(stencil)) { case 2: RAP = hypre_SMG2CreateRAPOp(R, A, PT, coarse_grid); break; case 3: RAP = hypre_SMG3CreateRAPOp(R, A, PT, coarse_grid); break; } #endif #if NEWRAP switch (hypre_StructStencilNDim(stencil)) { case 2: cdir = 1; RAP = hypre_SemiCreateRAPOp(R, A, PT, coarse_grid, cdir, P_stored_as_transpose); break; case 3: cdir = 2; RAP = hypre_SemiCreateRAPOp(R, A, PT, coarse_grid, cdir, P_stored_as_transpose); break; } #endif return RAP; } /*-------------------------------------------------------------------------- * Wrapper for 2 and 3d, symmetric and non-symmetric routines to calculate * entries in RAP. Incomplete error handling at the moment. *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SMGSetupRAPOp( hypre_StructMatrix *R, hypre_StructMatrix *A, hypre_StructMatrix *PT, hypre_StructMatrix *Ac, hypre_Index cindex, hypre_Index cstride ) { #if NEWRAP HYPRE_Int cdir; HYPRE_Int P_stored_as_transpose = 1; #endif hypre_StructStencil *stencil; hypre_StructMatrix *Ac_tmp; #if 0 //defined(HYPRE_USING_CUDA) || defined(HYPRE_USING_HIP) HYPRE_MemoryLocation data_location_A = hypre_StructGridDataLocation(hypre_StructMatrixGrid(A)); HYPRE_MemoryLocation data_location_Ac = hypre_StructGridDataLocation(hypre_StructMatrixGrid(Ac)); if (data_location_A != data_location_Ac) { Ac_tmp = hypre_SMGCreateRAPOp(R, A, PT, hypre_StructMatrixGrid(Ac)); hypre_StructMatrixSymmetric(Ac_tmp) = hypre_StructMatrixSymmetric(Ac); hypre_StructMatrixConstantCoefficient(Ac_tmp) = hypre_StructMatrixConstantCoefficient(Ac); hypre_StructGridDataLocation(hypre_StructMatrixGrid(Ac)) = data_location_A; HYPRE_StructMatrixInitialize(Ac_tmp); } else { Ac_tmp = Ac; } #else Ac_tmp = Ac; #endif stencil = hypre_StructMatrixStencil(A); #if OLDRAP switch (hypre_StructStencilNDim(stencil)) { case 2: /*-------------------------------------------------------------------- * Set lower triangular (+ diagonal) coefficients *--------------------------------------------------------------------*/ hypre_SMG2BuildRAPSym(A, PT, R, Ac_tmp, cindex, cstride); /*-------------------------------------------------------------------- * For non-symmetric A, set upper triangular coefficients as well *--------------------------------------------------------------------*/ if (!hypre_StructMatrixSymmetric(A)) { hypre_SMG2BuildRAPNoSym(A, PT, R, Ac_tmp, cindex, cstride); /*----------------------------------------------------------------- * Collapse stencil for periodic probems on coarsest grid. *-----------------------------------------------------------------*/ hypre_SMG2RAPPeriodicNoSym(Ac_tmp, cindex, cstride); } else { /*----------------------------------------------------------------- * Collapse stencil for periodic problems on coarsest grid. *-----------------------------------------------------------------*/ hypre_SMG2RAPPeriodicSym(Ac_tmp, cindex, cstride); } break; case 3: /*-------------------------------------------------------------------- * Set lower triangular (+ diagonal) coefficients *--------------------------------------------------------------------*/ hypre_SMG3BuildRAPSym(A, PT, R, Ac_tmp, cindex, cstride); /*-------------------------------------------------------------------- * For non-symmetric A, set upper triangular coefficients as well *--------------------------------------------------------------------*/ if (!hypre_StructMatrixSymmetric(A)) { hypre_SMG3BuildRAPNoSym(A, PT, R, Ac_tmp, cindex, cstride); /*----------------------------------------------------------------- * Collapse stencil for periodic probems on coarsest grid. *-----------------------------------------------------------------*/ hypre_SMG3RAPPeriodicNoSym(Ac_tmp, cindex, cstride); } else { /*----------------------------------------------------------------- * Collapse stencil for periodic problems on coarsest grid. *-----------------------------------------------------------------*/ hypre_SMG3RAPPeriodicSym(Ac_tmp, cindex, cstride); } break; } #endif #if NEWRAP switch (hypre_StructStencilNDim(stencil)) { case 2: cdir = 1; hypre_SemiBuildRAP(A, PT, R, cdir, cindex, cstride, P_stored_as_transpose, Ac_tmp); break; case 3: cdir = 2; hypre_SemiBuildRAP(A, PT, R, cdir, cindex, cstride, P_stored_as_transpose, Ac_tmp); break; } #endif hypre_StructMatrixAssemble(Ac_tmp); #if 0 //defined(HYPRE_USING_CUDA) || defined(HYPRE_USING_HIP) if (data_location_A != data_location_Ac) { hypre_TMemcpy(hypre_StructMatrixDataConst(Ac), hypre_StructMatrixData(Ac_tmp), HYPRE_Complex, hypre_StructMatrixDataSize(Ac_tmp), HYPRE_MEMORY_HOST, HYPRE_MEMORY_DEVICE); hypre_SetDeviceOff(); hypre_StructGridDataLocation(hypre_StructMatrixGrid(Ac)) = data_location_Ac; hypre_StructMatrixAssemble(Ac); hypre_SetDeviceOn(); hypre_StructMatrixDestroy(Ac_tmp); } #endif return hypre_error_flag; } hypre-2.33.0/src/struct_ls/smg_setup_restrict.c000066400000000000000000000030311477326011500216330ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "_hypre_struct_ls.h" #include "smg.h" /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ hypre_StructMatrix * hypre_SMGCreateRestrictOp( hypre_StructMatrix *A, hypre_StructGrid *cgrid, HYPRE_Int cdir ) { HYPRE_UNUSED_VAR(A); HYPRE_UNUSED_VAR(cgrid); HYPRE_UNUSED_VAR(cdir); hypre_StructMatrix *R = NULL; return R; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SMGSetupRestrictOp( hypre_StructMatrix *A, hypre_StructMatrix *R, hypre_StructVector *temp_vec, HYPRE_Int cdir, hypre_Index cindex, hypre_Index cstride ) { HYPRE_UNUSED_VAR(A); HYPRE_UNUSED_VAR(R); HYPRE_UNUSED_VAR(temp_vec); HYPRE_UNUSED_VAR(cdir); HYPRE_UNUSED_VAR(cindex); HYPRE_UNUSED_VAR(cstride); return hypre_error_flag; } hypre-2.33.0/src/struct_ls/smg_solve.c000066400000000000000000000277471477326011500177300ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "_hypre_struct_ls.h" #include "smg.h" #define DEBUG 0 /*-------------------------------------------------------------------------- * This is the main solve routine for the Schaffer multigrid method. * This solver works for 1D, 2D, or 3D linear systems. The dimension * is determined by the hypre_StructStencilNDim argument of the matrix * stencil. The hypre_StructGridNDim argument of the matrix grid is * allowed to be larger than the dimension of the solver, and in fact, * this feature is used in the smaller-dimensional solves required * in the relaxation method for both the 2D and 3D algorithms. This * allows one to do multiple 2D or 1D solves in parallel (e.g., multiple * 2D solves, where the 2D problems are "stacked" planes in 3D). * The only additional requirement is that the linear system(s) data * be contiguous in memory. * * Notes: * - Iterations are counted as follows: 1 iteration consists of a * V-cycle plus an extra pre-relaxation. If the number of MG levels * is equal to 1, then only the extra pre-relaxation step is done at * each iteration. When the solver exits because the maximum number * of iterations is reached, the last extra pre-relaxation is not done. * This allows one to use the solver as a preconditioner for conjugate * gradient and insure symmetry. * - hypre_SMGRelax is the relaxation routine. There are different "data" * structures for each call to reflect different arguments and parameters. * One important parameter sets whether or not an initial guess of zero * is to be used in the relaxation. * - hypre_SMGResidual computes the residual, b - Ax. * - hypre_SemiRestrict restricts the residual to the coarse grid. * - hypre_SemiInterp interpolates the coarse error and adds it to the * fine grid solution. * *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SMGSolve( void *smg_vdata, hypre_StructMatrix *A, hypre_StructVector *b, hypre_StructVector *x ) { hypre_SMGData *smg_data = (hypre_SMGData *)smg_vdata; HYPRE_Real tol = (smg_data -> tol); HYPRE_Int max_iter = (smg_data -> max_iter); HYPRE_Int rel_change = (smg_data -> rel_change); HYPRE_Int zero_guess = (smg_data -> zero_guess); HYPRE_Int num_levels = (smg_data -> num_levels); HYPRE_Int num_pre_relax = (smg_data -> num_pre_relax); HYPRE_Int num_post_relax = (smg_data -> num_post_relax); hypre_IndexRef base_index = (smg_data -> base_index); hypre_IndexRef base_stride = (smg_data -> base_stride); hypre_StructMatrix **A_l = (smg_data -> A_l); hypre_StructMatrix **PT_l = (smg_data -> PT_l); hypre_StructMatrix **R_l = (smg_data -> R_l); hypre_StructVector **b_l = (smg_data -> b_l); hypre_StructVector **x_l = (smg_data -> x_l); hypre_StructVector **r_l = (smg_data -> r_l); hypre_StructVector **e_l = (smg_data -> e_l); void **relax_data_l = (smg_data -> relax_data_l); void **residual_data_l = (smg_data -> residual_data_l); void **restrict_data_l = (smg_data -> restrict_data_l); void **interp_data_l = (smg_data -> interp_data_l); HYPRE_Int logging = (smg_data -> logging); HYPRE_Real *norms = (smg_data -> norms); HYPRE_Real *rel_norms = (smg_data -> rel_norms); HYPRE_Real b_dot_b = 0, r_dot_r, eps = 0; HYPRE_Real e_dot_e = 0, x_dot_x = 1; HYPRE_Int i, l; #if DEBUG char filename[255]; #endif /*----------------------------------------------------- * Initialize some things and deal with special cases *-----------------------------------------------------*/ HYPRE_ANNOTATE_FUNC_BEGIN; hypre_BeginTiming(smg_data -> time_index); hypre_StructMatrixDestroy(A_l[0]); hypre_StructVectorDestroy(b_l[0]); hypre_StructVectorDestroy(x_l[0]); A_l[0] = hypre_StructMatrixRef(A); b_l[0] = hypre_StructVectorRef(b); x_l[0] = hypre_StructVectorRef(x); (smg_data -> num_iterations) = 0; /* if max_iter is zero, return */ if (max_iter == 0) { /* if using a zero initial guess, return zero */ if (zero_guess) { hypre_StructVectorSetConstantValues(x, 0.0); } hypre_EndTiming(smg_data -> time_index); HYPRE_ANNOTATE_FUNC_END; return hypre_error_flag; } /* part of convergence check */ if (tol > 0.0) { /* eps = (tol^2) */ b_dot_b = hypre_StructInnerProd(b_l[0], b_l[0]); eps = tol * tol; /* if rhs is zero, return a zero solution */ if (b_dot_b == 0.0) { hypre_StructVectorSetConstantValues(x, 0.0); if (logging > 0) { norms[0] = 0.0; rel_norms[0] = 0.0; } hypre_EndTiming(smg_data -> time_index); HYPRE_ANNOTATE_FUNC_END; return hypre_error_flag; } } /*----------------------------------------------------- * Do V-cycles: * For each index l, "fine" = l, "coarse" = (l+1) *-----------------------------------------------------*/ for (i = 0; i < max_iter; i++) { /*-------------------------------------------------- * Down cycle *--------------------------------------------------*/ /* fine grid pre-relaxation */ if (num_levels > 1) { hypre_SMGRelaxSetRegSpaceRank(relax_data_l[0], 0, 0); hypre_SMGRelaxSetRegSpaceRank(relax_data_l[0], 1, 1); } hypre_SMGRelaxSetMaxIter(relax_data_l[0], num_pre_relax); hypre_SMGRelaxSetZeroGuess(relax_data_l[0], zero_guess); hypre_SMGRelax(relax_data_l[0], A_l[0], b_l[0], x_l[0]); zero_guess = 0; /* compute fine grid residual (b - Ax) */ hypre_SMGResidual(residual_data_l[0], A_l[0], x_l[0], b_l[0], r_l[0]); /* convergence check */ if (tol > 0.0) { r_dot_r = hypre_StructInnerProd(r_l[0], r_l[0]); if (logging > 0) { norms[i] = hypre_sqrt(r_dot_r); if (b_dot_b > 0) { rel_norms[i] = hypre_sqrt(r_dot_r / b_dot_b); } else { rel_norms[i] = 0.0; } } /* always do at least 1 V-cycle */ if ((r_dot_r / b_dot_b < eps) && (i > 0)) { if (rel_change) { if ((e_dot_e / x_dot_x) < eps) { break; } } else { break; } } } if (num_levels > 1) { /* restrict fine grid residual */ hypre_SemiRestrict(restrict_data_l[0], R_l[0], r_l[0], b_l[1]); #if DEBUG if (hypre_StructStencilNDim(hypre_StructMatrixStencil(A)) == 3) { hypre_sprintf(filename, "zout_xdown.%02d", 0); hypre_StructVectorPrint(filename, x_l[0], 0); hypre_sprintf(filename, "zout_rdown.%02d", 0); hypre_StructVectorPrint(filename, r_l[0], 0); hypre_sprintf(filename, "zout_b.%02d", 1); hypre_StructVectorPrint(filename, b_l[1], 0); } #endif for (l = 1; l <= (num_levels - 2); l++) { /* pre-relaxation */ hypre_SMGRelaxSetRegSpaceRank(relax_data_l[l], 0, 0); hypre_SMGRelaxSetRegSpaceRank(relax_data_l[l], 1, 1); hypre_SMGRelaxSetMaxIter(relax_data_l[l], num_pre_relax); hypre_SMGRelaxSetZeroGuess(relax_data_l[l], 1); hypre_SMGRelax(relax_data_l[l], A_l[l], b_l[l], x_l[l]); /* compute residual (b - Ax) */ hypre_SMGResidual(residual_data_l[l], A_l[l], x_l[l], b_l[l], r_l[l]); /* restrict residual */ hypre_SemiRestrict(restrict_data_l[l], R_l[l], r_l[l], b_l[l + 1]); #if DEBUG if (hypre_StructStencilNDim(hypre_StructMatrixStencil(A)) == 3) { hypre_sprintf(filename, "zout_xdown.%02d", l); hypre_StructVectorPrint(filename, x_l[l], 0); hypre_sprintf(filename, "zout_rdown.%02d", l); hypre_StructVectorPrint(filename, r_l[l], 0); hypre_sprintf(filename, "zout_b.%02d", l + 1); hypre_StructVectorPrint(filename, b_l[l + 1], 0); } #endif } /*-------------------------------------------------- * Bottom *--------------------------------------------------*/ hypre_SMGRelaxSetZeroGuess(relax_data_l[l], 1); hypre_SMGRelax(relax_data_l[l], A_l[l], b_l[l], x_l[l]); #if DEBUG if (hypre_StructStencilNDim(hypre_StructMatrixStencil(A)) == 3) { hypre_sprintf(filename, "zout_xbottom.%02d", l); hypre_StructVectorPrint(filename, x_l[l], 0); } #endif /*-------------------------------------------------- * Up cycle *--------------------------------------------------*/ for (l = (num_levels - 2); l >= 1; l--) { /* interpolate error and correct (x = x + Pe_c) */ hypre_SemiInterp(interp_data_l[l], PT_l[l], x_l[l + 1], e_l[l]); hypre_StructAxpy(1.0, e_l[l], x_l[l]); #if DEBUG if (hypre_StructStencilNDim(hypre_StructMatrixStencil(A)) == 3) { hypre_sprintf(filename, "zout_eup.%02d", l); hypre_StructVectorPrint(filename, e_l[l], 0); hypre_sprintf(filename, "zout_xup.%02d", l); hypre_StructVectorPrint(filename, x_l[l], 0); } #endif /* post-relaxation */ hypre_SMGRelaxSetRegSpaceRank(relax_data_l[l], 0, 1); hypre_SMGRelaxSetRegSpaceRank(relax_data_l[l], 1, 0); hypre_SMGRelaxSetMaxIter(relax_data_l[l], num_post_relax); hypre_SMGRelaxSetZeroGuess(relax_data_l[l], 0); hypre_SMGRelax(relax_data_l[l], A_l[l], b_l[l], x_l[l]); } /* interpolate error and correct on fine grid (x = x + Pe_c) */ hypre_SemiInterp(interp_data_l[0], PT_l[0], x_l[1], e_l[0]); hypre_SMGAxpy(1.0, e_l[0], x_l[0], base_index, base_stride); #if DEBUG if (hypre_StructStencilNDim(hypre_StructMatrixStencil(A)) == 3) { hypre_sprintf(filename, "zout_eup.%02d", 0); hypre_StructVectorPrint(filename, e_l[0], 0); hypre_sprintf(filename, "zout_xup.%02d", 0); hypre_StructVectorPrint(filename, x_l[0], 0); } #endif } /* part of convergence check */ if ((tol > 0.0) && (rel_change)) { if (num_levels > 1) { e_dot_e = hypre_StructInnerProd(e_l[0], e_l[0]); x_dot_x = hypre_StructInnerProd(x_l[0], x_l[0]); } else { e_dot_e = 0.0; x_dot_x = 1.0; } } /* fine grid post-relaxation */ if (num_levels > 1) { hypre_SMGRelaxSetRegSpaceRank(relax_data_l[0], 0, 1); hypre_SMGRelaxSetRegSpaceRank(relax_data_l[0], 1, 0); } hypre_SMGRelaxSetMaxIter(relax_data_l[0], num_post_relax); hypre_SMGRelaxSetZeroGuess(relax_data_l[0], 0); hypre_SMGRelax(relax_data_l[0], A_l[0], b_l[0], x_l[0]); (smg_data -> num_iterations) = (i + 1); } hypre_EndTiming(smg_data -> time_index); HYPRE_ANNOTATE_FUNC_END; return hypre_error_flag; } hypre-2.33.0/src/struct_ls/sparse_msg.c000066400000000000000000000341241477326011500200600ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * *****************************************************************************/ #include "_hypre_struct_ls.h" #include "sparse_msg.h" /*-------------------------------------------------------------------------- * hypre_SparseMSGCreate *--------------------------------------------------------------------------*/ void * hypre_SparseMSGCreate( MPI_Comm comm ) { hypre_SparseMSGData *smsg_data; smsg_data = hypre_CTAlloc(hypre_SparseMSGData, 1, HYPRE_MEMORY_HOST); (smsg_data -> comm) = comm; (smsg_data -> time_index) = hypre_InitializeTiming("SparseMSG"); /* set defaults */ (smsg_data -> tol) = 1.0e-06; (smsg_data -> max_iter) = 200; (smsg_data -> rel_change) = 0; (smsg_data -> zero_guess) = 0; (smsg_data -> jump) = 0; (smsg_data -> relax_type) = 1; /* weighted Jacobi */ (smsg_data -> jacobi_weight) = 0.0; (smsg_data -> usr_jacobi_weight) = 0; /* no user Jacobi weight */ (smsg_data -> num_pre_relax) = 1; (smsg_data -> num_post_relax) = 1; (smsg_data -> num_fine_relax) = 1; (smsg_data -> logging) = 0; (smsg_data -> print_level) = 0; /* initialize */ (smsg_data -> num_grids[0]) = 1; (smsg_data -> num_grids[1]) = 1; (smsg_data -> num_grids[2]) = 1; (smsg_data -> memory_location) = hypre_HandleMemoryLocation(hypre_handle()); return (void *) smsg_data; } /*-------------------------------------------------------------------------- * hypre_SparseMSGDestroy *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SparseMSGDestroy( void *smsg_vdata ) { HYPRE_Int ierr = 0; /* RDF */ #if 0 hypre_SparseMSGData *smsg_data = smsg_vdata; HYPRE_Int fi, l; if (smsg_data) { if ((smsg_data -> logging) > 0) { hypre_TFree(smsg_data -> norms, HYPRE_MEMORY_HOST); hypre_TFree(smsg_data -> rel_norms, HYPRE_MEMORY_HOST); } if ((smsg_data -> num_levels) > 1) { for (fi = 0; fi < (smsg_data -> num_all_grids); fi++) { hypre_PFMGRelaxDestroy(smsg_data -> relax_array[fi]); hypre_StructMatvecDestroy(smsg_data -> matvec_array[fi]); hypre_SemiRestrictDestroy(smsg_data -> restrictx_array[fi]); hypre_SemiRestrictDestroy(smsg_data -> restricty_array[fi]); hypre_SemiRestrictDestroy(smsg_data -> restrictz_array[fi]); hypre_SemiInterpDestroy(smsg_data -> interpx_array[fi]); hypre_SemiInterpDestroy(smsg_data -> interpy_array[fi]); hypre_SemiInterpDestroy(smsg_data -> interpz_array[fi]); hypre_StructMatrixDestroy(smsg_data -> A_array[fi]); hypre_StructVectorDestroy(smsg_data -> b_array[fi]); hypre_StructVectorDestroy(smsg_data -> x_array[fi]); hypre_StructVectorDestroy(smsg_data -> t_array[fi]); hypre_StructVectorDestroy(smsg_data -> r_array[fi]); hypre_StructVectorDestroy(smsg_data -> visitx_array[fi]); hypre_StructVectorDestroy(smsg_data -> visity_array[fi]); hypre_StructVectorDestroy(smsg_data -> visitz_array[fi]); hypre_StructGridDestroy(smsg_data -> grid_array[fi]); } for (l = 0; l < (smsg_data -> num_grids[0]) - 1; l++) { hypre_StructMatrixDestroy(smsg_data -> Px_array[l]); hypre_StructGridDestroy(smsg_data -> Px_grid_array[l]); } for (l = 0; l < (smsg_data -> num_grids[1]) - 1; l++) { hypre_StructMatrixDestroy(smsg_data -> Py_array[l]); hypre_StructGridDestroy(smsg_data -> Py_grid_array[l]); } for (l = 0; l < (smsg_data -> num_grids[2]) - 1; l++) { hypre_StructMatrixDestroy(smsg_data -> Pz_array[l]); hypre_StructGridDestroy(smsg_data -> Pz_grid_array[l]); } hypre_TFree(smsg_data -> data, HYPRE_MEMORY_HOST); hypre_TFree(smsg_data -> relax_array, HYPRE_MEMORY_HOST); hypre_TFree(smsg_data -> matvec_array, HYPRE_MEMORY_HOST); hypre_TFree(smsg_data -> restrictx_array, HYPRE_MEMORY_HOST); hypre_TFree(smsg_data -> restricty_array, HYPRE_MEMORY_HOST); hypre_TFree(smsg_data -> restrictz_array, HYPRE_MEMORY_HOST); hypre_TFree(smsg_data -> interpx_array, HYPRE_MEMORY_HOST); hypre_TFree(smsg_data -> interpy_array, HYPRE_MEMORY_HOST); hypre_TFree(smsg_data -> interpz_array, HYPRE_MEMORY_HOST); hypre_TFree(smsg_data -> A_array, HYPRE_MEMORY_HOST); hypre_TFree(smsg_data -> Px_array, HYPRE_MEMORY_HOST); hypre_TFree(smsg_data -> Py_array, HYPRE_MEMORY_HOST); hypre_TFree(smsg_data -> Pz_array, HYPRE_MEMORY_HOST); hypre_TFree(smsg_data -> RTx_array, HYPRE_MEMORY_HOST); hypre_TFree(smsg_data -> RTy_array, HYPRE_MEMORY_HOST); hypre_TFree(smsg_data -> RTz_array, HYPRE_MEMORY_HOST); hypre_TFree(smsg_data -> b_array, HYPRE_MEMORY_HOST); hypre_TFree(smsg_data -> x_array, HYPRE_MEMORY_HOST); hypre_TFree(smsg_data -> t_array, HYPRE_MEMORY_HOST); hypre_TFree(smsg_data -> r_array, HYPRE_MEMORY_HOST); hypre_TFree(smsg_data -> grid_array, HYPRE_MEMORY_HOST); hypre_TFree(smsg_data -> Px_grid_array, HYPRE_MEMORY_HOST); hypre_TFree(smsg_data -> Py_grid_array, HYPRE_MEMORY_HOST); hypre_TFree(smsg_data -> Pz_grid_array, HYPRE_MEMORY_HOST); } hypre_FinalizeTiming(smsg_data -> time_index); hypre_TFree(smsg_data, HYPRE_MEMORY_HOST); } #else HYPRE_UNUSED_VAR(smsg_vdata); #endif /* RDF */ return ierr; } /*-------------------------------------------------------------------------- * hypre_SparseMSGSetTol *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SparseMSGSetTol( void *smsg_vdata, HYPRE_Real tol ) { hypre_SparseMSGData *smsg_data = (hypre_SparseMSGData *)smsg_vdata; HYPRE_Int ierr = 0; (smsg_data -> tol) = tol; return ierr; } /*-------------------------------------------------------------------------- * hypre_SparseMSGSetMaxIter *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SparseMSGSetMaxIter( void *smsg_vdata, HYPRE_Int max_iter ) { hypre_SparseMSGData *smsg_data = (hypre_SparseMSGData *)smsg_vdata; HYPRE_Int ierr = 0; (smsg_data -> max_iter) = max_iter; return ierr; } /*-------------------------------------------------------------------------- * hypre_SparseMSGSetJump *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SparseMSGSetJump( void *smsg_vdata, HYPRE_Int jump ) { hypre_SparseMSGData *smsg_data = (hypre_SparseMSGData *)smsg_vdata; HYPRE_Int ierr = 0; (smsg_data -> jump) = jump; return ierr; } /*-------------------------------------------------------------------------- * hypre_SparseMSGSetRelChange *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SparseMSGSetRelChange( void *smsg_vdata, HYPRE_Int rel_change ) { hypre_SparseMSGData *smsg_data = (hypre_SparseMSGData *)smsg_vdata; HYPRE_Int ierr = 0; (smsg_data -> rel_change) = rel_change; return ierr; } /*-------------------------------------------------------------------------- * hypre_SparseMSGSetZeroGuess *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SparseMSGSetZeroGuess( void *smsg_vdata, HYPRE_Int zero_guess ) { hypre_SparseMSGData *smsg_data = (hypre_SparseMSGData *)smsg_vdata; HYPRE_Int ierr = 0; (smsg_data -> zero_guess) = zero_guess; return ierr; } /*-------------------------------------------------------------------------- * hypre_SparseMSGSetRelaxType *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SparseMSGSetRelaxType( void *smsg_vdata, HYPRE_Int relax_type ) { hypre_SparseMSGData *smsg_data = (hypre_SparseMSGData *)smsg_vdata; HYPRE_Int ierr = 0; (smsg_data -> relax_type) = relax_type; return ierr; } /*-------------------------------------------------------------------------- * hypre_SparseMSGSetJacobiWeight *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SparseMSGSetJacobiWeight( void *smsg_vdata, HYPRE_Real weight ) { hypre_SparseMSGData *smsg_data = (hypre_SparseMSGData *)smsg_vdata; (smsg_data -> jacobi_weight) = weight; (smsg_data -> usr_jacobi_weight) = 1; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_SparseMSGSetNumPreRelax *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SparseMSGSetNumPreRelax( void *smsg_vdata, HYPRE_Int num_pre_relax ) { hypre_SparseMSGData *smsg_data = (hypre_SparseMSGData *)smsg_vdata; HYPRE_Int ierr = 0; (smsg_data -> num_pre_relax) = num_pre_relax; return ierr; } /*-------------------------------------------------------------------------- * hypre_SparseMSGSetNumPostRelax *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SparseMSGSetNumPostRelax( void *smsg_vdata, HYPRE_Int num_post_relax ) { hypre_SparseMSGData *smsg_data = (hypre_SparseMSGData *)smsg_vdata; HYPRE_Int ierr = 0; (smsg_data -> num_post_relax) = num_post_relax; return ierr; } /*-------------------------------------------------------------------------- * hypre_SparseMSGSetNumFineRelax *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SparseMSGSetNumFineRelax( void *smsg_vdata, HYPRE_Int num_fine_relax ) { hypre_SparseMSGData *smsg_data = (hypre_SparseMSGData *)smsg_vdata; HYPRE_Int ierr = 0; (smsg_data -> num_fine_relax) = num_fine_relax; return ierr; } /*-------------------------------------------------------------------------- * hypre_SparseMSGSetLogging *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SparseMSGSetLogging( void *smsg_vdata, HYPRE_Int logging ) { hypre_SparseMSGData *smsg_data = (hypre_SparseMSGData *)smsg_vdata; HYPRE_Int ierr = 0; (smsg_data -> logging) = logging; return ierr; } /*-------------------------------------------------------------------------- * hypre_SparseMSGSetPrintLevel *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SparseMSGSetPrintLevel( void *smsg_vdata, HYPRE_Int print_level ) { hypre_SparseMSGData *smsg_data = (hypre_SparseMSGData *)smsg_vdata; HYPRE_Int ierr = 0; (smsg_data -> print_level) = print_level; return ierr; } /*-------------------------------------------------------------------------- * hypre_SparseMSGGetNumIterations *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SparseMSGGetNumIterations( void *smsg_vdata, HYPRE_Int *num_iterations ) { hypre_SparseMSGData *smsg_data = (hypre_SparseMSGData *)smsg_vdata; HYPRE_Int ierr = 0; *num_iterations = (smsg_data -> num_iterations); return ierr; } /*-------------------------------------------------------------------------- * hypre_SparseMSGPrintLogging *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SparseMSGPrintLogging( void *smsg_vdata, HYPRE_Int myid ) { hypre_SparseMSGData *smsg_data = (hypre_SparseMSGData *)smsg_vdata; HYPRE_Int ierr = 0; HYPRE_Int i; HYPRE_Int num_iterations = (smsg_data -> num_iterations); HYPRE_Int logging = (smsg_data -> logging); HYPRE_Int print_level = (smsg_data -> print_level); HYPRE_Real *norms = (smsg_data -> norms); HYPRE_Real *rel_norms = (smsg_data -> rel_norms); if (myid == 0) { if (print_level > 0) { if (logging > 0) { for (i = 0; i < num_iterations; i++) { hypre_printf("Residual norm[%d] = %e ", i, norms[i]); hypre_printf("Relative residual norm[%d] = %e\n", i, rel_norms[i]); } } } } return ierr; } /*-------------------------------------------------------------------------- * hypre_SparseMSGGetFinalRelativeResidualNorm *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SparseMSGGetFinalRelativeResidualNorm( void *smsg_vdata, HYPRE_Real *relative_residual_norm ) { hypre_SparseMSGData *smsg_data = (hypre_SparseMSGData *)smsg_vdata; HYPRE_Int max_iter = (smsg_data -> max_iter); HYPRE_Int num_iterations = (smsg_data -> num_iterations); HYPRE_Int logging = (smsg_data -> logging); HYPRE_Real *rel_norms = (smsg_data -> rel_norms); HYPRE_Int ierr = 0; if (logging > 0) { if (max_iter == 0) { ierr = 1; } else if (num_iterations == max_iter) { *relative_residual_norm = rel_norms[num_iterations - 1]; } else { *relative_residual_norm = rel_norms[num_iterations]; } } return ierr; } hypre-2.33.0/src/struct_ls/sparse_msg.h000066400000000000000000000066001477326011500200630ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * Header info for the SparseMSG solver * *****************************************************************************/ #ifndef hypre_SparseMSG_HEADER #define hypre_SparseMSG_HEADER /*-------------------------------------------------------------------------- * hypre_SparseMSGData: *--------------------------------------------------------------------------*/ typedef struct { MPI_Comm comm; HYPRE_Real tol; HYPRE_Int max_iter; HYPRE_Int rel_change; HYPRE_Int zero_guess; HYPRE_Int jump; HYPRE_Int relax_type; /* type of relaxation to use */ HYPRE_Real jacobi_weight; /* weighted jacobi weight */ HYPRE_Int usr_jacobi_weight; /* indicator flag for user weight */ HYPRE_Int num_pre_relax; /* number of pre relaxation sweeps */ HYPRE_Int num_post_relax; /* number of post relaxation sweeps */ HYPRE_Int num_fine_relax; /* number of fine relaxation sweeps */ HYPRE_Int num_grids[3]; /* number of grids in each dim */ HYPRE_Int num_all_grids; HYPRE_Int num_levels; hypre_StructGrid **grid_array; hypre_StructGrid **Px_grid_array; hypre_StructGrid **Py_grid_array; hypre_StructGrid **Pz_grid_array; HYPRE_MemoryLocation memory_location; /* memory location of data */ HYPRE_Real *data; hypre_StructMatrix **A_array; hypre_StructMatrix **Px_array; hypre_StructMatrix **Py_array; hypre_StructMatrix **Pz_array; hypre_StructMatrix **RTx_array; hypre_StructMatrix **RTy_array; hypre_StructMatrix **RTz_array; hypre_StructVector **b_array; hypre_StructVector **x_array; /* temp vectors */ hypre_StructVector **t_array; hypre_StructVector **r_array; hypre_StructVector **e_array; hypre_StructVector **visitx_array; hypre_StructVector **visity_array; hypre_StructVector **visitz_array; HYPRE_Int *grid_on; void **relax_array; void **matvec_array; void **restrictx_array; void **restricty_array; void **restrictz_array; void **interpx_array; void **interpy_array; void **interpz_array; /* log info (always logged) */ HYPRE_Int num_iterations; HYPRE_Int time_index; HYPRE_Int print_level; /* additional log info (logged when `logging' > 0) */ HYPRE_Int logging; HYPRE_Real *norms; HYPRE_Real *rel_norms; } hypre_SparseMSGData; /*-------------------------------------------------------------------------- * Utility routines: *--------------------------------------------------------------------------*/ #define hypre_SparseMSGMapIndex(lx, ly, lz, nl, index) \ index = (lx) + ((ly) * nl[0]) + ((lz) * nl[0] * nl[1]) #endif hypre-2.33.0/src/struct_ls/sparse_msg2_setup_rap.c000066400000000000000000000775341477326011500222400ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "_hypre_struct_ls.h" #include "_hypre_struct_mv.hpp" /*-------------------------------------------------------------------------- * Macro to "change coordinates". This routine is written as though * coarsening is being done in the y-direction. This macro is used to * allow for coarsening to be done in the x-direction also. *--------------------------------------------------------------------------*/ #define MapIndex(in_index, cdir, out_index) \ hypre_IndexD(out_index, 2) = hypre_IndexD(in_index, 2); \ hypre_IndexD(out_index, cdir) = hypre_IndexD(in_index, 1); \ cdir = (cdir + 1) % 2; \ hypre_IndexD(out_index, cdir) = hypre_IndexD(in_index, 0); \ cdir = (cdir + 1) % 2; /*-------------------------------------------------------------------------- * hypre_SparseMSG2CreateRAPOp * Sets up new coarse grid operator stucture. *--------------------------------------------------------------------------*/ hypre_StructMatrix * hypre_SparseMSG2CreateRAPOp( hypre_StructMatrix *R, hypre_StructMatrix *A, hypre_StructMatrix *P, hypre_StructGrid *coarse_grid, HYPRE_Int cdir ) { HYPRE_UNUSED_VAR(R); HYPRE_UNUSED_VAR(P); hypre_StructMatrix *RAP; hypre_Index *RAP_stencil_shape; hypre_StructStencil *RAP_stencil; HYPRE_Int RAP_stencil_size; HYPRE_Int RAP_stencil_dim; HYPRE_Int RAP_num_ghost[] = {1, 1, 1, 1, 1, 1}; hypre_Index index_temp; HYPRE_Int j, i; HYPRE_Int stencil_rank; RAP_stencil_dim = 2; /*----------------------------------------------------------------------- * Define RAP_stencil *-----------------------------------------------------------------------*/ stencil_rank = 0; /*----------------------------------------------------------------------- * non-symmetric case *-----------------------------------------------------------------------*/ if (!hypre_StructMatrixSymmetric(A)) { /*-------------------------------------------------------------------- * 5 or 9 point fine grid stencil produces 9 point RAP *--------------------------------------------------------------------*/ RAP_stencil_size = 9; RAP_stencil_shape = hypre_CTAlloc(hypre_Index, RAP_stencil_size, HYPRE_MEMORY_HOST); for (j = -1; j < 2; j++) { for (i = -1; i < 2; i++) { /*-------------------------------------------------------------- * Storage for 9 elements (c,w,e,n,s,sw,se,nw,se) *--------------------------------------------------------------*/ hypre_SetIndex3(index_temp, i, j, 0); MapIndex(index_temp, cdir, RAP_stencil_shape[stencil_rank]); stencil_rank++; } } } /*----------------------------------------------------------------------- * symmetric case *-----------------------------------------------------------------------*/ else { /*-------------------------------------------------------------------- * 5 or 9 point fine grid stencil produces 9 point RAP * Only store the lower triangular part + diagonal = 5 entries, * lower triangular means the lower triangular part on the matrix * in the standard lexicographic ordering. *--------------------------------------------------------------------*/ RAP_stencil_size = 5; RAP_stencil_shape = hypre_CTAlloc(hypre_Index, RAP_stencil_size, HYPRE_MEMORY_HOST); for (j = -1; j < 1; j++) { for (i = -1; i < 2; i++) { /*-------------------------------------------------------------- * Store 5 elements in (c,w,s,sw,se) *--------------------------------------------------------------*/ if ( i + j <= 0 ) { hypre_SetIndex3(index_temp, i, j, 0); MapIndex(index_temp, cdir, RAP_stencil_shape[stencil_rank]); stencil_rank++; } } } } RAP_stencil = hypre_StructStencilCreate(RAP_stencil_dim, RAP_stencil_size, RAP_stencil_shape); RAP = hypre_StructMatrixCreate(hypre_StructMatrixComm(A), coarse_grid, RAP_stencil); hypre_StructStencilDestroy(RAP_stencil); /*----------------------------------------------------------------------- * Coarse operator in symmetric iff fine operator is *-----------------------------------------------------------------------*/ hypre_StructMatrixSymmetric(RAP) = hypre_StructMatrixSymmetric(A); /*----------------------------------------------------------------------- * Set number of ghost points - one one each boundary *-----------------------------------------------------------------------*/ hypre_StructMatrixSetNumGhost(RAP, RAP_num_ghost); return RAP; } /*-------------------------------------------------------------------------- * Routines to build RAP. These routines are fairly general * 1) No assumptions about symmetry of A * 2) No assumption that R = transpose(P) * 3) 5 or 9-point fine grid A * * I am, however, assuming that the c-to-c interpolation is the identity. * * I've written two routines - hypre_SparseMSG2BuildRAPSym to build the * lower triangular part of RAP (including the diagonal) and * hypre_SparseMSG2BuildRAPNoSym to build the upper triangular part of RAP * (excluding the diagonal). So using symmetric storage, only the * first routine would be called. With full storage both would need to * be called. * *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SparseMSG2BuildRAPSym( hypre_StructMatrix *A, hypre_StructMatrix *P, hypre_StructMatrix *R, HYPRE_Int cdir, hypre_Index cindex, hypre_Index cstride, hypre_Index stridePR, hypre_StructMatrix *RAP ) { hypre_Index index; hypre_Index index_temp; hypre_StructStencil *fine_stencil; HYPRE_Int fine_stencil_size; hypre_StructGrid *fgrid; HYPRE_Int *fgrid_ids; hypre_StructGrid *cgrid; hypre_BoxArray *cgrid_boxes; HYPRE_Int *cgrid_ids; hypre_Box *cgrid_box; hypre_IndexRef cstart; hypre_Index stridec; hypre_Index fstart; hypre_IndexRef stridef; hypre_Index Pstart; hypre_Index loop_size; HYPRE_Int fi, ci; hypre_Box *A_dbox; hypre_Box *P_dbox; hypre_Box *R_dbox; hypre_Box *RAP_dbox; HYPRE_Real *pa, *pb; HYPRE_Real *ra, *rb; HYPRE_Real *a_cc, *a_cw, *a_ce, *a_cs, *a_cn; HYPRE_Real *a_csw = NULL, *a_cse = NULL, *a_cnw = NULL; HYPRE_Real *rap_cc, *rap_cw, *rap_cs; HYPRE_Real *rap_csw, *rap_cse; HYPRE_Int yOffsetA; HYPRE_Int xOffsetP; HYPRE_Int yOffsetP; HYPRE_Int ierr = 0; fine_stencil = hypre_StructMatrixStencil(A); fine_stencil_size = hypre_StructStencilSize(fine_stencil); stridef = cstride; hypre_SetIndex3(stridec, 1, 1, 1); fgrid = hypre_StructMatrixGrid(A); fgrid_ids = hypre_StructGridIDs(fgrid); cgrid = hypre_StructMatrixGrid(RAP); cgrid_boxes = hypre_StructGridBoxes(cgrid); cgrid_ids = hypre_StructGridIDs(cgrid); fi = 0; hypre_ForBoxI(ci, cgrid_boxes) { while (fgrid_ids[fi] != cgrid_ids[ci]) { fi++; } cgrid_box = hypre_BoxArrayBox(cgrid_boxes, ci); cstart = hypre_BoxIMin(cgrid_box); hypre_StructMapCoarseToFine(cstart, cindex, cstride, fstart); hypre_StructMapCoarseToFine(cstart, cindex, stridePR, Pstart); A_dbox = hypre_BoxArrayBox(hypre_StructMatrixDataSpace(A), fi); P_dbox = hypre_BoxArrayBox(hypre_StructMatrixDataSpace(P), fi); R_dbox = hypre_BoxArrayBox(hypre_StructMatrixDataSpace(R), fi); RAP_dbox = hypre_BoxArrayBox(hypre_StructMatrixDataSpace(RAP), ci); /*----------------------------------------------------------------- * Extract pointers for interpolation operator: * pa is pointer for weight for f-point above c-point * pb is pointer for weight for f-point below c-point *-----------------------------------------------------------------*/ hypre_SetIndex3(index_temp, 0, -1, 0); MapIndex(index_temp, cdir, index); pa = hypre_StructMatrixExtractPointerByIndex(P, fi, index); hypre_SetIndex3(index_temp, 0, 1, 0); MapIndex(index_temp, cdir, index); pb = hypre_StructMatrixExtractPointerByIndex(P, fi, index) - hypre_BoxOffsetDistance(P_dbox, index); /*----------------------------------------------------------------- * Extract pointers for restriction operator: * ra is pointer for weight for f-point above c-point * rb is pointer for weight for f-point below c-point *-----------------------------------------------------------------*/ hypre_SetIndex3(index_temp, 0, -1, 0); MapIndex(index_temp, cdir, index); ra = hypre_StructMatrixExtractPointerByIndex(R, fi, index); hypre_SetIndex3(index_temp, 0, 1, 0); MapIndex(index_temp, cdir, index); rb = hypre_StructMatrixExtractPointerByIndex(R, fi, index) - hypre_BoxOffsetDistance(R_dbox, index); /*----------------------------------------------------------------- * Extract pointers for 5-point fine grid operator: * * a_cc is pointer for center coefficient * a_cw is pointer for west coefficient * a_ce is pointer for east coefficient * a_cs is pointer for south coefficient * a_cn is pointer for north coefficient *-----------------------------------------------------------------*/ hypre_SetIndex3(index_temp, 0, 0, 0); MapIndex(index_temp, cdir, index); a_cc = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index_temp, -1, 0, 0); MapIndex(index_temp, cdir, index); a_cw = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index_temp, 1, 0, 0); MapIndex(index_temp, cdir, index); a_ce = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index_temp, 0, -1, 0); MapIndex(index_temp, cdir, index); a_cs = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index_temp, 0, 1, 0); MapIndex(index_temp, cdir, index); a_cn = hypre_StructMatrixExtractPointerByIndex(A, fi, index); /*----------------------------------------------------------------- * Extract additional pointers for 9-point fine grid operator: * * a_csw is pointer for southwest coefficient * a_cse is pointer for southeast coefficient * a_cnw is pointer for northwest coefficient * a_cne is pointer for northeast coefficient *-----------------------------------------------------------------*/ if (fine_stencil_size > 5) { hypre_SetIndex3(index_temp, -1, -1, 0); MapIndex(index_temp, cdir, index); a_csw = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index_temp, 1, -1, 0); MapIndex(index_temp, cdir, index); a_cse = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index_temp, -1, 1, 0); MapIndex(index_temp, cdir, index); a_cnw = hypre_StructMatrixExtractPointerByIndex(A, fi, index); } /*----------------------------------------------------------------- * Extract pointers for coarse grid operator - always 9-point: * * We build only the lower triangular part (plus diagonal). * * rap_cc is pointer for center coefficient (etc.) *-----------------------------------------------------------------*/ hypre_SetIndex3(index_temp, 0, 0, 0); MapIndex(index_temp, cdir, index); rap_cc = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index_temp, -1, 0, 0); MapIndex(index_temp, cdir, index); rap_cw = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index_temp, 0, -1, 0); MapIndex(index_temp, cdir, index); rap_cs = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index_temp, -1, -1, 0); MapIndex(index_temp, cdir, index); rap_csw = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index_temp, 1, -1, 0); MapIndex(index_temp, cdir, index); rap_cse = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); /*----------------------------------------------------------------- * Define offsets for fine grid stencil and interpolation * * In the BoxLoop below I assume iA and iP refer to data associated * with the point which we are building the stencil for. The below * Offsets are used in refering to data associated with other points. *-----------------------------------------------------------------*/ hypre_SetIndex3(index_temp, 0, 1, 0); MapIndex(index_temp, cdir, index); yOffsetA = hypre_BoxOffsetDistance(A_dbox, index); yOffsetP = hypre_BoxOffsetDistance(P_dbox, index); hypre_SetIndex3(index_temp, 1, 0, 0); MapIndex(index_temp, cdir, index); xOffsetP = hypre_BoxOffsetDistance(P_dbox, index); /*----------------------------------------------------------------- * Switch statement to direct control to apropriate BoxLoop depending * on stencil size. Default is full 9-point. *-----------------------------------------------------------------*/ switch (fine_stencil_size) { /*-------------------------------------------------------------- * Loop for symmetric 5-point fine grid operator; produces a * symmetric 9-point coarse grid operator. We calculate only the * lower triangular stencil entries: (southwest, south, southeast, * west, and center). *--------------------------------------------------------------*/ case 5: hypre_BoxGetSize(cgrid_box, loop_size); #define DEVICE_VAR is_device_ptr(rap_csw,rb,a_cw,pa,rap_cs,a_cc,a_cs,rap_cse,a_ce,rap_cw,pb,ra,rap_cc,a_cn) hypre_BoxLoop4Begin(hypre_StructMatrixNDim(A), loop_size, P_dbox, Pstart, stridePR, iP, R_dbox, Pstart, stridePR, iR, A_dbox, fstart, stridef, iA, RAP_dbox, cstart, stridec, iAc); { HYPRE_Int iAm1 = iA - yOffsetA; HYPRE_Int iAp1 = iA + yOffsetA; HYPRE_Int iP1 = iP - yOffsetP - xOffsetP; rap_csw[iAc] = rb[iR] * a_cw[iAm1] * pa[iP1]; iP1 = iP - yOffsetP; rap_cs[iAc] = rb[iR] * a_cc[iAm1] * pa[iP1] + rb[iR] * a_cs[iAm1] + a_cs[iA] * pa[iP1]; iP1 = iP - yOffsetP + xOffsetP; rap_cse[iAc] = rb[iR] * a_ce[iAm1] * pa[iP1]; iP1 = iP - xOffsetP; rap_cw[iAc] = a_cw[iA] + rb[iR] * a_cw[iAm1] * pb[iP1] + ra[iR] * a_cw[iAp1] * pa[iP1]; rap_cc[iAc] = a_cc[iA] + rb[iR] * a_cc[iAm1] * pb[iP] + ra[iR] * a_cc[iAp1] * pa[iP] + rb[iR] * a_cn[iAm1] + ra[iR] * a_cs[iAp1] + a_cs[iA] * pb[iP] + a_cn[iA] * pa[iP]; } hypre_BoxLoop4End(iP, iR, iA, iAc); #undef DEVICE_VAR break; /*-------------------------------------------------------------- * Loop for symmetric 9-point fine grid operator; produces a * symmetric 9-point coarse grid operator. We calculate only the * lower triangular stencil entries: (southwest, south, southeast, * west, and center). *--------------------------------------------------------------*/ default: hypre_BoxGetSize(cgrid_box, loop_size); #define DEVICE_VAR is_device_ptr(rap_csw,rb,a_cw,pa,a_csw,rap_cs,a_cc,a_cs,rap_cse,a_ce,a_cse,rap_cw,pb,ra,a_cnw,rap_cc,a_cn) hypre_BoxLoop4Begin(hypre_StructMatrixNDim(A), loop_size, P_dbox, Pstart, stridePR, iP, R_dbox, Pstart, stridePR, iR, A_dbox, fstart, stridef, iA, RAP_dbox, cstart, stridec, iAc); { HYPRE_Int iAm1 = iA - yOffsetA; HYPRE_Int iAp1 = iA + yOffsetA; HYPRE_Int iP1 = iP - yOffsetP - xOffsetP; rap_csw[iAc] = rb[iR] * a_cw[iAm1] * pa[iP1] + rb[iR] * a_csw[iAm1] + a_csw[iA] * pa[iP1]; iP1 = iP - yOffsetP; rap_cs[iAc] = rb[iR] * a_cc[iAm1] * pa[iP1] + rb[iR] * a_cs[iAm1] + a_cs[iA] * pa[iP1]; iP1 = iP - yOffsetP + xOffsetP; rap_cse[iAc] = rb[iR] * a_ce[iAm1] * pa[iP1] + rb[iR] * a_cse[iAm1] + a_cse[iA] * pa[iP1]; iP1 = iP - xOffsetP; rap_cw[iAc] = a_cw[iA] + rb[iR] * a_cw[iAm1] * pb[iP1] + ra[iR] * a_cw[iAp1] * pa[iP1] + rb[iR] * a_cnw[iAm1] + ra[iR] * a_csw[iAp1] + a_csw[iA] * pb[iP1] + a_cnw[iA] * pa[iP1]; rap_cc[iAc] = a_cc[iA] + rb[iR] * a_cc[iAm1] * pb[iP] + ra[iR] * a_cc[iAp1] * pa[iP] + rb[iR] * a_cn[iAm1] + ra[iR] * a_cs[iAp1] + a_cs[iA] * pb[iP] + a_cn[iA] * pa[iP]; } hypre_BoxLoop4End(iP, iR, iA, iAc); #undef DEVICE_VAR break; } /* end switch statement */ } /* end ForBoxI */ return ierr; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SparseMSG2BuildRAPNoSym( hypre_StructMatrix *A, hypre_StructMatrix *P, hypre_StructMatrix *R, HYPRE_Int cdir, hypre_Index cindex, hypre_Index cstride, hypre_Index stridePR, hypre_StructMatrix *RAP ) { hypre_Index index; hypre_Index index_temp; hypre_StructStencil *fine_stencil; HYPRE_Int fine_stencil_size; hypre_StructGrid *fgrid; HYPRE_Int *fgrid_ids; hypre_StructGrid *cgrid; hypre_BoxArray *cgrid_boxes; HYPRE_Int *cgrid_ids; hypre_Box *cgrid_box; hypre_IndexRef cstart; hypre_Index stridec; hypre_Index fstart; hypre_IndexRef stridef; hypre_Index Pstart; hypre_Index loop_size; HYPRE_Int fi, ci; hypre_Box *A_dbox; hypre_Box *P_dbox; hypre_Box *R_dbox; hypre_Box *RAP_dbox; HYPRE_Real *pa, *pb; HYPRE_Real *ra, *rb; HYPRE_Real *a_cc = NULL, *a_cw = NULL, *a_ce = NULL, *a_cn = NULL; HYPRE_Real *a_cse = NULL, *a_cnw = NULL, *a_cne = NULL; HYPRE_Real *rap_ce, *rap_cn; HYPRE_Real *rap_cnw, *rap_cne; HYPRE_Int yOffsetA; HYPRE_Int xOffsetP; HYPRE_Int yOffsetP; HYPRE_Int ierr = 0; fine_stencil = hypre_StructMatrixStencil(A); fine_stencil_size = hypre_StructStencilSize(fine_stencil); stridef = cstride; hypre_SetIndex3(stridec, 1, 1, 1); fgrid = hypre_StructMatrixGrid(A); fgrid_ids = hypre_StructGridIDs(fgrid); cgrid = hypre_StructMatrixGrid(RAP); cgrid_boxes = hypre_StructGridBoxes(cgrid); cgrid_ids = hypre_StructGridIDs(cgrid); fi = 0; hypre_ForBoxI(ci, cgrid_boxes) { while (fgrid_ids[fi] != cgrid_ids[ci]) { fi++; } cgrid_box = hypre_BoxArrayBox(cgrid_boxes, ci); cstart = hypre_BoxIMin(cgrid_box); hypre_StructMapCoarseToFine(cstart, cindex, cstride, fstart); hypre_StructMapCoarseToFine(cstart, cindex, stridePR, Pstart); A_dbox = hypre_BoxArrayBox(hypre_StructMatrixDataSpace(A), fi); P_dbox = hypre_BoxArrayBox(hypre_StructMatrixDataSpace(P), fi); R_dbox = hypre_BoxArrayBox(hypre_StructMatrixDataSpace(R), fi); RAP_dbox = hypre_BoxArrayBox(hypre_StructMatrixDataSpace(RAP), ci); /*----------------------------------------------------------------- * Extract pointers for interpolation operator: * pa is pointer for weight for f-point above c-point * pb is pointer for weight for f-point below c-point *-----------------------------------------------------------------*/ hypre_SetIndex3(index_temp, 0, -1, 0); MapIndex(index_temp, cdir, index); pa = hypre_StructMatrixExtractPointerByIndex(P, fi, index); hypre_SetIndex3(index_temp, 0, 1, 0); MapIndex(index_temp, cdir, index); pb = hypre_StructMatrixExtractPointerByIndex(P, fi, index) - hypre_BoxOffsetDistance(P_dbox, index); /*----------------------------------------------------------------- * Extract pointers for restriction operator: * ra is pointer for weight for f-point above c-point * rb is pointer for weight for f-point below c-point *-----------------------------------------------------------------*/ hypre_SetIndex3(index_temp, 0, -1, 0); MapIndex(index_temp, cdir, index); ra = hypre_StructMatrixExtractPointerByIndex(R, fi, index); hypre_SetIndex3(index_temp, 0, 1, 0); MapIndex(index_temp, cdir, index); rb = hypre_StructMatrixExtractPointerByIndex(R, fi, index) - hypre_BoxOffsetDistance(R_dbox, index); /*----------------------------------------------------------------- * Extract pointers for 5-point fine grid operator: * * a_cc is pointer for center coefficient * a_cw is pointer for west coefficient * a_ce is pointer for east coefficient * a_cs is pointer for south coefficient * a_cn is pointer for north coefficient *-----------------------------------------------------------------*/ hypre_SetIndex3(index_temp, 0, 0, 0); MapIndex(index_temp, cdir, index); a_cc = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index_temp, -1, 0, 0); MapIndex(index_temp, cdir, index); a_cw = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index_temp, 1, 0, 0); MapIndex(index_temp, cdir, index); a_ce = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index_temp, 0, 1, 0); MapIndex(index_temp, cdir, index); a_cn = hypre_StructMatrixExtractPointerByIndex(A, fi, index); /*----------------------------------------------------------------- * Extract additional pointers for 9-point fine grid operator: * * a_csw is pointer for southwest coefficient * a_cse is pointer for southeast coefficient * a_cnw is pointer for northwest coefficient * a_cne is pointer for northeast coefficient *-----------------------------------------------------------------*/ if (fine_stencil_size > 5) { hypre_SetIndex3(index_temp, 1, -1, 0); MapIndex(index_temp, cdir, index); a_cse = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index_temp, -1, 1, 0); MapIndex(index_temp, cdir, index); a_cnw = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index_temp, 1, 1, 0); MapIndex(index_temp, cdir, index); a_cne = hypre_StructMatrixExtractPointerByIndex(A, fi, index); } /*----------------------------------------------------------------- * Extract pointers for coarse grid operator - always 9-point: * * We build only the upper triangular part. * * rap_ce is pointer for east coefficient (etc.) *-----------------------------------------------------------------*/ hypre_SetIndex3(index_temp, 1, 0, 0); MapIndex(index_temp, cdir, index); rap_ce = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index_temp, 0, 1, 0); MapIndex(index_temp, cdir, index); rap_cn = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index_temp, 1, 1, 0); MapIndex(index_temp, cdir, index); rap_cne = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index_temp, -1, 1, 0); MapIndex(index_temp, cdir, index); rap_cnw = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); /*----------------------------------------------------------------- * Define offsets for fine grid stencil and interpolation * * In the BoxLoop below I assume iA and iP refer to data associated * with the point which we are building the stencil for. The below * Offsets are used in refering to data associated with other points. *-----------------------------------------------------------------*/ hypre_SetIndex3(index_temp, 0, 1, 0); MapIndex(index_temp, cdir, index); yOffsetA = hypre_BoxOffsetDistance(A_dbox, index); yOffsetP = hypre_BoxOffsetDistance(P_dbox, index); hypre_SetIndex3(index_temp, 1, 0, 0); MapIndex(index_temp, cdir, index); xOffsetP = hypre_BoxOffsetDistance(P_dbox, index); /*----------------------------------------------------------------- * Switch statement to direct control to appropriate BoxLoop depending * on stencil size. Default is full 27-point. *-----------------------------------------------------------------*/ switch (fine_stencil_size) { /*-------------------------------------------------------------- * Loop for 5-point fine grid operator; produces upper triangular * part of 9-point coarse grid operator - excludes diagonal. * stencil entries: (northeast, north, northwest, and east) *--------------------------------------------------------------*/ case 5: hypre_BoxGetSize(cgrid_box, loop_size); #define DEVICE_VAR is_device_ptr(rap_cne,ra,a_ce,pb,rap_cn,a_cc,a_cn,rap_cnw,a_cw,rap_ce,rb,pa) hypre_BoxLoop4Begin(hypre_StructMatrixNDim(A), loop_size, P_dbox, Pstart, stridePR, iP, R_dbox, Pstart, stridePR, iR, A_dbox, fstart, stridef, iA, RAP_dbox, cstart, stridec, iAc); { HYPRE_Int iAm1 = iA - yOffsetA; HYPRE_Int iAp1 = iA + yOffsetA; HYPRE_Int iP1 = iP + yOffsetP + xOffsetP; rap_cne[iAc] = ra[iR] * a_ce[iAp1] * pb[iP1]; iP1 = iP + yOffsetP; rap_cn[iAc] = ra[iR] * a_cc[iAp1] * pb[iP1] + ra[iR] * a_cn[iAp1] + a_cn[iA] * pb[iP1]; iP1 = iP + yOffsetP - xOffsetP; rap_cnw[iAc] = ra[iR] * a_cw[iAp1] * pb[iP1]; iP1 = iP + xOffsetP; rap_ce[iAc] = a_ce[iA] + rb[iR] * a_ce[iAm1] * pb[iP1] + ra[iR] * a_ce[iAp1] * pa[iP1]; } hypre_BoxLoop4End(iP, iR, iA, iAc); #undef DEVICE_VAR break; /*-------------------------------------------------------------- * Loop for 9-point fine grid operator; produces upper triangular * part of 9-point coarse grid operator - excludes diagonal. * stencil entries: (northeast, north, northwest, and east) *--------------------------------------------------------------*/ default: hypre_BoxGetSize(cgrid_box, loop_size); #define DEVICE_VAR is_device_ptr(rap_cne,ra,a_ce,pb,a_cne,rap_cn,a_cc,a_cn,rap_cnw,a_cw,a_cnw,rap_ce,rb,pa,a_cse) hypre_BoxLoop4Begin(hypre_StructMatrixNDim(A), loop_size, P_dbox, Pstart, stridePR, iP, R_dbox, Pstart, stridePR, iR, A_dbox, fstart, stridef, iA, RAP_dbox, cstart, stridec, iAc); { HYPRE_Int iAm1 = iA - yOffsetA; HYPRE_Int iAp1 = iA + yOffsetA; HYPRE_Int iP1 = iP + yOffsetP + xOffsetP; rap_cne[iAc] = ra[iR] * a_ce[iAp1] * pb[iP1] + ra[iR] * a_cne[iAp1] + a_cne[iA] * pb[iP1]; iP1 = iP + yOffsetP; rap_cn[iAc] = ra[iR] * a_cc[iAp1] * pb[iP1] + ra[iR] * a_cn[iAp1] + a_cn[iA] * pb[iP1]; iP1 = iP + yOffsetP - xOffsetP; rap_cnw[iAc] = ra[iR] * a_cw[iAp1] * pb[iP1] + ra[iR] * a_cnw[iAp1] + a_cnw[iA] * pb[iP1]; iP1 = iP + xOffsetP; rap_ce[iAc] = a_ce[iA] + rb[iR] * a_ce[iAm1] * pb[iP1] + ra[iR] * a_ce[iAp1] * pa[iP1] + rb[iR] * a_cne[iAm1] + ra[iR] * a_cse[iAp1] + a_cse[iA] * pb[iP1] + a_cne[iA] * pa[iP1]; } hypre_BoxLoop4End(iP, iR, iA, iAc); #undef DEVICE_VAR break; } /* end switch statement */ } /* end ForBoxI */ return ierr; } hypre-2.33.0/src/struct_ls/sparse_msg3_setup_rap.c000066400000000000000000001765051477326011500222370ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "_hypre_struct_ls.h" #include "_hypre_struct_mv.hpp" /*-------------------------------------------------------------------------- * Macro to "change coordinates". This routine is written as though * coarsening is being done in the z-direction. This macro is used to * allow for coarsening to be done in the x- and y-directions also. *--------------------------------------------------------------------------*/ #define MapIndex(in_index, cdir, out_index) \ hypre_IndexD(out_index, cdir) = hypre_IndexD(in_index, 2); \ cdir = (cdir + 1) % 3; \ hypre_IndexD(out_index, cdir) = hypre_IndexD(in_index, 0); \ cdir = (cdir + 1) % 3; \ hypre_IndexD(out_index, cdir) = hypre_IndexD(in_index, 1); \ cdir = (cdir + 1) % 3; /*-------------------------------------------------------------------------- * hypre_SparseMSG3CreateRAPOp * Sets up new coarse grid operator stucture. *--------------------------------------------------------------------------*/ hypre_StructMatrix * hypre_SparseMSG3CreateRAPOp( hypre_StructMatrix *R, hypre_StructMatrix *A, hypre_StructMatrix *P, hypre_StructGrid *coarse_grid, HYPRE_Int cdir ) { HYPRE_UNUSED_VAR(R); HYPRE_UNUSED_VAR(P); hypre_StructMatrix *RAP; hypre_Index *RAP_stencil_shape; hypre_StructStencil *RAP_stencil; HYPRE_Int RAP_stencil_size; HYPRE_Int RAP_stencil_dim; HYPRE_Int RAP_num_ghost[] = {1, 1, 1, 1, 1, 1}; hypre_StructStencil *A_stencil; HYPRE_Int A_stencil_size; hypre_Index index_temp; HYPRE_Int k, j, i; HYPRE_Int stencil_rank; RAP_stencil_dim = 3; A_stencil = hypre_StructMatrixStencil(A); A_stencil_size = hypre_StructStencilSize(A_stencil); /*----------------------------------------------------------------------- * Define RAP_stencil *-----------------------------------------------------------------------*/ stencil_rank = 0; /*----------------------------------------------------------------------- * non-symmetric case *-----------------------------------------------------------------------*/ /*----------------------------------------------------------------------- * 7-point fine grid stencil produces 19 point RAP * * Store all 27 elements except for the corners. * * For symmetric A, only store the lower triangular part, where * lower triangular means the lower triangular part on the matrix * in the standard lexicographic ordering. *-----------------------------------------------------------------------*/ if ( A_stencil_size == 7) { RAP_stencil_size = 19; if (hypre_StructMatrixSymmetric(A)) { RAP_stencil_size = (RAP_stencil_size + 1) / 2; } RAP_stencil_shape = hypre_CTAlloc(hypre_Index, RAP_stencil_size, HYPRE_MEMORY_HOST); for (k = -1; k < 2; k++) { for (j = -1; j < 2; j++) { for (i = -1; i < 2; i++) { if ((i * j * k == 0) && (stencil_rank < RAP_stencil_size)) { hypre_SetIndex3(index_temp, i, j, k); MapIndex(index_temp, cdir, RAP_stencil_shape[stencil_rank]); stencil_rank++; } } } } } /*----------------------------------------------------------------------- * 19 or 27 point fine grid stencil produces 27 point RAP * * Store all 27 elements * * For symmetric A, only store the lower triangular part, where * lower triangular means the lower triangular part on the matrix * in the standard lexicographic ordering. *-----------------------------------------------------------------------*/ else { RAP_stencil_size = 27; if (hypre_StructMatrixSymmetric(A)) { RAP_stencil_size = (RAP_stencil_size + 1) / 2; } RAP_stencil_shape = hypre_CTAlloc(hypre_Index, RAP_stencil_size, HYPRE_MEMORY_HOST); for (k = -1; k < 2; k++) { for (j = -1; j < 2; j++) { for (i = -1; i < 2; i++) { if (stencil_rank < RAP_stencil_size) { hypre_SetIndex3(index_temp, i, j, k); MapIndex(index_temp, cdir, RAP_stencil_shape[stencil_rank]); stencil_rank++; } } } } } RAP_stencil = hypre_StructStencilCreate(RAP_stencil_dim, RAP_stencil_size, RAP_stencil_shape); RAP = hypre_StructMatrixCreate(hypre_StructMatrixComm(A), coarse_grid, RAP_stencil); hypre_StructStencilDestroy(RAP_stencil); /*----------------------------------------------------------------------- * Coarse operator in symmetric iff fine operator is *-----------------------------------------------------------------------*/ hypre_StructMatrixSymmetric(RAP) = hypre_StructMatrixSymmetric(A); /*----------------------------------------------------------------------- * Set number of ghost points - one one each boundary *-----------------------------------------------------------------------*/ hypre_StructMatrixSetNumGhost(RAP, RAP_num_ghost); return RAP; } /*-------------------------------------------------------------------------- * Routines to build RAP. These routines are fairly general * 1) No assumptions about symmetry of A * 2) No assumption that R = transpose(P) * 3) 7, 19 or 27-point fine grid A * * I am, however, assuming that the c-to-c interpolation is the identity. * * I've written a two routines - hypre_SparseMSG3BuildRAPSym to build the lower * triangular part of RAP (including the diagonal) and * hypre_SparseMSG3BuildRAPNoSym to build the upper triangular part of RAP * (excluding the diagonal). So using symmetric storage, only the first * routine would be called. With full storage both would need to be called. * *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SparseMSG3BuildRAPSym( hypre_StructMatrix *A, hypre_StructMatrix *P, hypre_StructMatrix *R, HYPRE_Int cdir, hypre_Index cindex, hypre_Index cstride, hypre_Index stridePR, hypre_StructMatrix *RAP ) { hypre_Index index; hypre_Index index_temp; hypre_StructStencil *fine_stencil; HYPRE_Int fine_stencil_size; hypre_StructGrid *fgrid; HYPRE_Int *fgrid_ids; hypre_StructGrid *cgrid; hypre_BoxArray *cgrid_boxes; HYPRE_Int *cgrid_ids; hypre_Box *cgrid_box; hypre_IndexRef cstart; hypre_Index stridec; hypre_Index fstart; hypre_IndexRef stridef; hypre_Index Pstart; hypre_Index loop_size; HYPRE_Int fi, ci; hypre_Box *A_dbox; hypre_Box *P_dbox; hypre_Box *R_dbox; hypre_Box *RAP_dbox; HYPRE_Real *pa, *pb; HYPRE_Real *ra, *rb; HYPRE_Real *a_cc = NULL, *a_cw = NULL, *a_ce = NULL, *a_cs = NULL, *a_cn = NULL; HYPRE_Real *a_ac = NULL, *a_aw = NULL, *a_as = NULL; HYPRE_Real *a_bc = NULL, *a_bw = NULL, *a_be = NULL, *a_bs = NULL, *a_bn = NULL; HYPRE_Real *a_csw = NULL, *a_cse = NULL, *a_cnw = NULL, *a_cne = NULL; HYPRE_Real *a_asw = NULL, *a_ase = NULL; HYPRE_Real *a_bsw = NULL, *a_bse = NULL, *a_bnw = NULL, *a_bne = NULL; HYPRE_Real *rap_cc = NULL, *rap_cw = NULL, *rap_cs = NULL; HYPRE_Real *rap_bc = NULL, *rap_bw = NULL, *rap_be = NULL; HYPRE_Real *rap_bs = NULL, *rap_bn = NULL; HYPRE_Real *rap_csw = NULL, *rap_cse = NULL; HYPRE_Real *rap_bsw = NULL, *rap_bse = NULL, *rap_bnw = NULL, *rap_bne = NULL; HYPRE_Int zOffsetA; HYPRE_Int xOffsetP; HYPRE_Int yOffsetP; HYPRE_Int zOffsetP; HYPRE_Int ierr = 0; fine_stencil = hypre_StructMatrixStencil(A); fine_stencil_size = hypre_StructStencilSize(fine_stencil); stridef = cstride; hypre_SetIndex3(stridec, 1, 1, 1); fgrid = hypre_StructMatrixGrid(A); fgrid_ids = hypre_StructGridIDs(fgrid); cgrid = hypre_StructMatrixGrid(RAP); cgrid_boxes = hypre_StructGridBoxes(cgrid); cgrid_ids = hypre_StructGridIDs(cgrid); fi = 0; hypre_ForBoxI(ci, cgrid_boxes) { while (fgrid_ids[fi] != cgrid_ids[ci]) { fi++; } cgrid_box = hypre_BoxArrayBox(cgrid_boxes, ci); cstart = hypre_BoxIMin(cgrid_box); hypre_StructMapCoarseToFine(cstart, cindex, cstride, fstart); hypre_StructMapCoarseToFine(cstart, cindex, stridePR, Pstart); A_dbox = hypre_BoxArrayBox(hypre_StructMatrixDataSpace(A), fi); P_dbox = hypre_BoxArrayBox(hypre_StructMatrixDataSpace(P), fi); R_dbox = hypre_BoxArrayBox(hypre_StructMatrixDataSpace(R), fi); RAP_dbox = hypre_BoxArrayBox(hypre_StructMatrixDataSpace(RAP), ci); /*----------------------------------------------------------------- * Extract pointers for interpolation operator: * pa is pointer for weight for f-point above c-point * pb is pointer for weight for f-point below c-point *-----------------------------------------------------------------*/ hypre_SetIndex3(index_temp, 0, 0, -1); MapIndex(index_temp, cdir, index); pa = hypre_StructMatrixExtractPointerByIndex(P, fi, index); hypre_SetIndex3(index_temp, 0, 0, 1); MapIndex(index_temp, cdir, index); pb = hypre_StructMatrixExtractPointerByIndex(P, fi, index) - hypre_BoxOffsetDistance(P_dbox, index); /*----------------------------------------------------------------- * Extract pointers for restriction operator: * ra is pointer for weight for f-point above c-point * rb is pointer for weight for f-point below c-point *-----------------------------------------------------------------*/ hypre_SetIndex3(index_temp, 0, 0, -1); MapIndex(index_temp, cdir, index); ra = hypre_StructMatrixExtractPointerByIndex(R, fi, index); hypre_SetIndex3(index_temp, 0, 0, 1); MapIndex(index_temp, cdir, index); rb = hypre_StructMatrixExtractPointerByIndex(R, fi, index) - hypre_BoxOffsetDistance(R_dbox, index); /*----------------------------------------------------------------- * Extract pointers for 7-point fine grid operator: * * a_cc is pointer for center coefficient * a_cw is pointer for west coefficient in same plane * a_ce is pointer for east coefficient in same plane * a_cs is pointer for south coefficient in same plane * a_cn is pointer for north coefficient in same plane * a_ac is pointer for center coefficient in plane above * a_bc is pointer for center coefficient in plane below *-----------------------------------------------------------------*/ hypre_SetIndex3(index_temp, 0, 0, 0); MapIndex(index_temp, cdir, index); a_cc = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index_temp, -1, 0, 0); MapIndex(index_temp, cdir, index); a_cw = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index_temp, 1, 0, 0); MapIndex(index_temp, cdir, index); a_ce = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index_temp, 0, -1, 0); MapIndex(index_temp, cdir, index); a_cs = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index_temp, 0, 1, 0); MapIndex(index_temp, cdir, index); a_cn = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index_temp, 0, 0, 1); MapIndex(index_temp, cdir, index); a_ac = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index_temp, 0, 0, -1); MapIndex(index_temp, cdir, index); a_bc = hypre_StructMatrixExtractPointerByIndex(A, fi, index); /*----------------------------------------------------------------- * Extract additional pointers for 19-point fine grid operator: * * a_aw is pointer for west coefficient in plane above * a_ae is pointer for east coefficient in plane above * a_as is pointer for south coefficient in plane above * a_an is pointer for north coefficient in plane above * a_bw is pointer for west coefficient in plane below * a_be is pointer for east coefficient in plane below * a_bs is pointer for south coefficient in plane below * a_bn is pointer for north coefficient in plane below * a_csw is pointer for southwest coefficient in same plane * a_cse is pointer for southeast coefficient in same plane * a_cnw is pointer for northwest coefficient in same plane * a_cne is pointer for northeast coefficient in same plane *-----------------------------------------------------------------*/ if (fine_stencil_size > 7) { hypre_SetIndex3(index_temp, -1, 0, 1); MapIndex(index_temp, cdir, index); a_aw = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index_temp, 0, -1, 1); MapIndex(index_temp, cdir, index); a_as = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index_temp, -1, 0, -1); MapIndex(index_temp, cdir, index); a_bw = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index_temp, 1, 0, -1); MapIndex(index_temp, cdir, index); a_be = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index_temp, 0, -1, -1); MapIndex(index_temp, cdir, index); a_bs = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index_temp, 0, 1, -1); MapIndex(index_temp, cdir, index); a_bn = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index_temp, -1, -1, 0); MapIndex(index_temp, cdir, index); a_csw = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index_temp, 1, -1, 0); MapIndex(index_temp, cdir, index); a_cse = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index_temp, -1, 1, 0); MapIndex(index_temp, cdir, index); a_cnw = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index_temp, 1, 1, 0); MapIndex(index_temp, cdir, index); a_cne = hypre_StructMatrixExtractPointerByIndex(A, fi, index); } /*----------------------------------------------------------------- * Extract additional pointers for 27-point fine grid operator: * * a_asw is pointer for southwest coefficient in plane above * a_ase is pointer for southeast coefficient in plane above * a_anw is pointer for northwest coefficient in plane above * a_ane is pointer for northeast coefficient in plane above * a_bsw is pointer for southwest coefficient in plane below * a_bse is pointer for southeast coefficient in plane below * a_bnw is pointer for northwest coefficient in plane below * a_bne is pointer for northeast coefficient in plane below *-----------------------------------------------------------------*/ if (fine_stencil_size > 19) { hypre_SetIndex3(index_temp, -1, -1, 1); MapIndex(index_temp, cdir, index); a_asw = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index_temp, 1, -1, 1); MapIndex(index_temp, cdir, index); a_ase = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index_temp, -1, -1, -1); MapIndex(index_temp, cdir, index); a_bsw = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index_temp, 1, -1, -1); MapIndex(index_temp, cdir, index); a_bse = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index_temp, -1, 1, -1); MapIndex(index_temp, cdir, index); a_bnw = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index_temp, 1, 1, -1); MapIndex(index_temp, cdir, index); a_bne = hypre_StructMatrixExtractPointerByIndex(A, fi, index); } /*----------------------------------------------------------------- * Extract pointers for 19-point coarse grid operator: * * We build only the lower triangular part (plus diagonal). * * rap_cc is pointer for center coefficient (etc.) *-----------------------------------------------------------------*/ hypre_SetIndex3(index_temp, 0, 0, 0); MapIndex(index_temp, cdir, index); rap_cc = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index_temp, -1, 0, 0); MapIndex(index_temp, cdir, index); rap_cw = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index_temp, 0, -1, 0); MapIndex(index_temp, cdir, index); rap_cs = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index_temp, 0, 0, -1); MapIndex(index_temp, cdir, index); rap_bc = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index_temp, -1, 0, -1); MapIndex(index_temp, cdir, index); rap_bw = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index_temp, 1, 0, -1); MapIndex(index_temp, cdir, index); rap_be = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index_temp, 0, -1, -1); MapIndex(index_temp, cdir, index); rap_bs = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index_temp, 0, 1, -1); MapIndex(index_temp, cdir, index); rap_bn = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index_temp, -1, -1, 0); MapIndex(index_temp, cdir, index); rap_csw = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index_temp, 1, -1, 0); MapIndex(index_temp, cdir, index); rap_cse = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); /*----------------------------------------------------------------- * Extract additional pointers for 27-point coarse grid operator: * * A 27-point coarse grid operator is produced when the fine grid * stencil is 19 or 27 point. * * We build only the lower triangular part. * * rap_csw is pointer for southwest coefficient in same plane (etc.) *-----------------------------------------------------------------*/ if (fine_stencil_size > 7) { hypre_SetIndex3(index_temp, -1, -1, -1); MapIndex(index_temp, cdir, index); rap_bsw = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index_temp, 1, -1, -1); MapIndex(index_temp, cdir, index); rap_bse = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index_temp, -1, 1, -1); MapIndex(index_temp, cdir, index); rap_bnw = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index_temp, 1, 1, -1); MapIndex(index_temp, cdir, index); rap_bne = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); } /*----------------------------------------------------------------- * Define offsets for fine grid stencil and interpolation * * In the BoxLoop below I assume iA and iP refer to data associated * with the point which we are building the stencil for. The below * Offsets are used in refering to data associated with other points. *-----------------------------------------------------------------*/ hypre_SetIndex3(index_temp, 0, 0, 1); MapIndex(index_temp, cdir, index); zOffsetA = hypre_BoxOffsetDistance(A_dbox, index); zOffsetP = hypre_BoxOffsetDistance(P_dbox, index); hypre_SetIndex3(index_temp, 0, 1, 0); MapIndex(index_temp, cdir, index); yOffsetP = hypre_BoxOffsetDistance(P_dbox, index); hypre_SetIndex3(index_temp, 1, 0, 0); MapIndex(index_temp, cdir, index); xOffsetP = hypre_BoxOffsetDistance(P_dbox, index); /*-------------------------------------------------------------------- * Switch statement to direct control to apropriate BoxLoop depending * on stencil size. Default is full 27-point. *-----------------------------------------------------------------*/ switch (fine_stencil_size) { /*-------------------------------------------------------------- * Loop for symmetric 7-point fine grid operator; produces a * symmetric 19-point coarse grid operator. We calculate only the * lower triangular stencil entries: (below-south, below-west, * below-center, below-east, below-north, center-south, * center-west, and center-center). *--------------------------------------------------------------*/ case 7: hypre_BoxGetSize(cgrid_box, loop_size); #define DEVICE_VAR is_device_ptr(rap_bs,rb,a_cs,pa,rap_bw,a_cw,rap_bc,a_bc,a_cc,rap_be,a_ce,rap_bn,a_cn,rap_cs,pb,ra,rap_cw,rap_csw,rap_cse,rap_cc,a_ac) hypre_BoxLoop4Begin(hypre_StructMatrixNDim(A), loop_size, P_dbox, Pstart, stridePR, iP, R_dbox, Pstart, stridePR, iR, A_dbox, fstart, stridef, iA, RAP_dbox, cstart, stridec, iAc); { HYPRE_Int iAm1 = iA - zOffsetA; HYPRE_Int iAp1 = iA + zOffsetA; HYPRE_Int iP1 = iP - zOffsetP - yOffsetP; rap_bs[iAc] = rb[iR] * a_cs[iAm1] * pa[iP1]; iP1 = iP - zOffsetP - xOffsetP; rap_bw[iAc] = rb[iR] * a_cw[iAm1] * pa[iP1]; iP1 = iP - zOffsetP; rap_bc[iAc] = a_bc[iA] * pa[iP1] + rb[iR] * a_cc[iAm1] * pa[iP1] + rb[iR] * a_bc[iAm1]; iP1 = iP - zOffsetP + xOffsetP; rap_be[iAc] = rb[iR] * a_ce[iAm1] * pa[iP1]; iP1 = iP - zOffsetP + yOffsetP; rap_bn[iAc] = rb[iR] * a_cn[iAm1] * pa[iP1]; iP1 = iP - yOffsetP; rap_cs[iAc] = a_cs[iA] + rb[iR] * a_cs[iAm1] * pb[iP1] + ra[iR] * a_cs[iAp1] * pa[iP1]; iP1 = iP - xOffsetP; rap_cw[iAc] = a_cw[iA] + rb[iR] * a_cw[iAm1] * pb[iP1] + ra[iR] * a_cw[iAp1] * pa[iP1]; rap_csw[iAc] = 0.0; rap_cse[iAc] = 0.0; rap_cc[iAc] = a_cc[iA] + rb[iR] * a_cc[iAm1] * pb[iP] + ra[iR] * a_cc[iAp1] * pa[iP] + rb[iR] * a_ac[iAm1] + ra[iR] * a_bc[iAp1] + a_bc[iA] * pb[iP] + a_ac[iA] * pa[iP]; } hypre_BoxLoop4End(iP, iR, iA, iAc); #undef DEVICE_VAR break; /*-------------------------------------------------------------- * Loop for symmetric 19-point fine grid operator; produces a * symmetric 27-point coarse grid operator. We calculate only the * lower triangular stencil entries: (below-southwest, below-south, * below-southeast, below-west, below-center, below-east, * below-northwest, below-north, below-northeast, center-southwest, * center-south, center-southeast, center-west, and center-center). *--------------------------------------------------------------*/ case 19: hypre_BoxGetSize(cgrid_box, loop_size); #define DEVICE_VAR is_device_ptr(rap_bsw,rb,a_csw,pa,rap_bs,a_cs,a_bs,rap_bse,a_cse,rap_bw,a_cw,a_bw,rap_bc,a_bc,a_cc,rap_be,a_ce,a_be,rap_bnw,a_cnw,rap_bn,a_cn,a_bn,rap_bne,a_cne,rap_csw,pb,ra,rap_cs,a_as,rap_cse,rap_cw,a_aw,rap_cc,a_ac) hypre_BoxLoop4Begin(hypre_StructMatrixNDim(A), loop_size, P_dbox, Pstart, stridePR, iP, R_dbox, Pstart, stridePR, iR, A_dbox, fstart, stridef, iA, RAP_dbox, cstart, stridec, iAc); { HYPRE_Int iAm1 = iA - zOffsetA; HYPRE_Int iAp1 = iA + zOffsetA; HYPRE_Int iP1 = iP - zOffsetP - yOffsetP - xOffsetP; rap_bsw[iAc] = rb[iR] * a_csw[iAm1] * pa[iP1]; iP1 = iP - zOffsetP - yOffsetP; rap_bs[iAc] = rb[iR] * a_cs[iAm1] * pa[iP1] + rb[iR] * a_bs[iAm1] + a_bs[iA] * pa[iP1]; iP1 = iP - zOffsetP - yOffsetP + xOffsetP; rap_bse[iAc] = rb[iR] * a_cse[iAm1] * pa[iP1]; iP1 = iP - zOffsetP - xOffsetP; rap_bw[iAc] = rb[iR] * a_cw[iAm1] * pa[iP1] + rb[iR] * a_bw[iAm1] + a_bw[iA] * pa[iP1]; iP1 = iP - zOffsetP; rap_bc[iAc] = a_bc[iA] * pa[iP1] + rb[iR] * a_cc[iAm1] * pa[iP1] + rb[iR] * a_bc[iAm1]; iP1 = iP - zOffsetP + xOffsetP; rap_be[iAc] = rb[iR] * a_ce[iAm1] * pa[iP1] + rb[iR] * a_be[iAm1] + a_be[iA] * pa[iP1]; iP1 = iP - zOffsetP + yOffsetP - xOffsetP; rap_bnw[iAc] = rb[iR] * a_cnw[iAm1] * pa[iP1]; iP1 = iP - zOffsetP + yOffsetP; rap_bn[iAc] = rb[iR] * a_cn[iAm1] * pa[iP1] + rb[iR] * a_bn[iAm1] + a_bn[iA] * pa[iP1]; iP1 = iP - zOffsetP + yOffsetP + xOffsetP; rap_bne[iAc] = rb[iR] * a_cne[iAm1] * pa[iP1]; iP1 = iP - yOffsetP - xOffsetP; rap_csw[iAc] = a_csw[iA] + rb[iR] * a_csw[iAm1] * pb[iP1] + ra[iR] * a_csw[iAp1] * pa[iP1]; iP1 = iP - yOffsetP; rap_cs[iAc] = a_cs[iA] + rb[iR] * a_cs[iAm1] * pb[iP1] + ra[iR] * a_cs[iAp1] * pa[iP1] + a_bs[iA] * pb[iP1] + a_as[iA] * pa[iP1] + rb[iR] * a_as[iAm1] + ra[iR] * a_bs[iAp1]; iP1 = iP - yOffsetP + xOffsetP; rap_cse[iAc] = a_cse[iA] + rb[iR] * a_cse[iAm1] * pb[iP1] + ra[iR] * a_cse[iAp1] * pa[iP1]; iP1 = iP - xOffsetP; rap_cw[iAc] = a_cw[iA] + rb[iR] * a_cw[iAm1] * pb[iP1] + ra[iR] * a_cw[iAp1] * pa[iP1] + a_bw[iA] * pb[iP1] + a_aw[iA] * pa[iP1] + rb[iR] * a_aw[iAm1] + ra[iR] * a_bw[iAp1]; rap_cc[iAc] = a_cc[iA] + rb[iR] * a_cc[iAm1] * pb[iP] + ra[iR] * a_cc[iAp1] * pa[iP] + rb[iR] * a_ac[iAm1] + ra[iR] * a_bc[iAp1] + a_bc[iA] * pb[iP] + a_ac[iA] * pa[iP]; } hypre_BoxLoop4End(iP, iR, iA, iAc); #undef DEVICE_VAR break; /*-------------------------------------------------------------- * Loop for symmetric 27-point fine grid operator; produces a * symmetric 27-point coarse grid operator. We calculate only the * lower triangular stencil entries: (below-southwest, below-south, * below-southeast, below-west, below-center, below-east, * below-northwest, below-north, below-northeast, center-southwest, * center-south, center-southeast, center-west, and center-center). *--------------------------------------------------------------*/ default: hypre_BoxGetSize(cgrid_box, loop_size); #define DEVICE_VAR is_device_ptr(rap_bsw,rb,a_csw,pa,a_bsw,rap_bs,a_cs,a_bs,rap_bse,a_cse,a_bse,rap_bw,a_cw,a_bw,rap_bc,a_bc,a_cc,rap_be,a_ce,a_be,rap_bnw,a_cnw,a_bnw,rap_bn,a_cn,a_bn,rap_bne,a_cne,a_bne,rap_csw,pb,ra,a_asw,rap_cs,a_as,rap_cse,a_ase,rap_cw,a_aw,rap_cc,a_ac) hypre_BoxLoop4Begin(hypre_StructMatrixNDim(A), loop_size, P_dbox, Pstart, stridePR, iP, R_dbox, Pstart, stridePR, iR, A_dbox, fstart, stridef, iA, RAP_dbox, cstart, stridec, iAc); { HYPRE_Int iAm1 = iA - zOffsetA; HYPRE_Int iAp1 = iA + zOffsetA; HYPRE_Int iP1 = iP - zOffsetP - yOffsetP - xOffsetP; rap_bsw[iAc] = rb[iR] * a_csw[iAm1] * pa[iP1] + rb[iR] * a_bsw[iAm1] + a_bsw[iA] * pa[iP1]; iP1 = iP - zOffsetP - yOffsetP; rap_bs[iAc] = rb[iR] * a_cs[iAm1] * pa[iP1] + rb[iR] * a_bs[iAm1] + a_bs[iA] * pa[iP1]; iP1 = iP - zOffsetP - yOffsetP + xOffsetP; rap_bse[iAc] = rb[iR] * a_cse[iAm1] * pa[iP1] + rb[iR] * a_bse[iAm1] + a_bse[iA] * pa[iP1]; iP1 = iP - zOffsetP - xOffsetP; rap_bw[iAc] = rb[iR] * a_cw[iAm1] * pa[iP1] + rb[iR] * a_bw[iAm1] + a_bw[iA] * pa[iP1]; iP1 = iP - zOffsetP; rap_bc[iAc] = a_bc[iA] * pa[iP1] + rb[iR] * a_cc[iAm1] * pa[iP1] + rb[iR] * a_bc[iAm1]; iP1 = iP - zOffsetP + xOffsetP; rap_be[iAc] = rb[iR] * a_ce[iAm1] * pa[iP1] + rb[iR] * a_be[iAm1] + a_be[iA] * pa[iP1]; iP1 = iP - zOffsetP + yOffsetP - xOffsetP; rap_bnw[iAc] = rb[iR] * a_cnw[iAm1] * pa[iP1] + rb[iR] * a_bnw[iAm1] + a_bnw[iA] * pa[iP1]; iP1 = iP - zOffsetP + yOffsetP; rap_bn[iAc] = rb[iR] * a_cn[iAm1] * pa[iP1] + rb[iR] * a_bn[iAm1] + a_bn[iA] * pa[iP1]; iP1 = iP - zOffsetP + yOffsetP + xOffsetP; rap_bne[iAc] = rb[iR] * a_cne[iAm1] * pa[iP1] + rb[iR] * a_bne[iAm1] + a_bne[iA] * pa[iP1]; iP1 = iP - yOffsetP - xOffsetP; rap_csw[iAc] = a_csw[iA] + rb[iR] * a_csw[iAm1] * pb[iP1] + ra[iR] * a_csw[iAp1] * pa[iP1] + a_bsw[iA] * pb[iP1] + a_asw[iA] * pa[iP1] + rb[iR] * a_asw[iAm1] + ra[iR] * a_bsw[iAp1]; iP1 = iP - yOffsetP; rap_cs[iAc] = a_cs[iA] + rb[iR] * a_cs[iAm1] * pb[iP1] + ra[iR] * a_cs[iAp1] * pa[iP1] + a_bs[iA] * pb[iP1] + a_as[iA] * pa[iP1] + rb[iR] * a_as[iAm1] + ra[iR] * a_bs[iAp1]; iP1 = iP - yOffsetP + xOffsetP; rap_cse[iAc] = a_cse[iA] + rb[iR] * a_cse[iAm1] * pb[iP1] + ra[iR] * a_cse[iAp1] * pa[iP1] + a_bse[iA] * pb[iP1] + a_ase[iA] * pa[iP1] + rb[iR] * a_ase[iAm1] + ra[iR] * a_bse[iAp1]; iP1 = iP - xOffsetP; rap_cw[iAc] = a_cw[iA] + rb[iR] * a_cw[iAm1] * pb[iP1] + ra[iR] * a_cw[iAp1] * pa[iP1] + a_bw[iA] * pb[iP1] + a_aw[iA] * pa[iP1] + rb[iR] * a_aw[iAm1] + ra[iR] * a_bw[iAp1]; rap_cc[iAc] = a_cc[iA] + rb[iR] * a_cc[iAm1] * pb[iP] + ra[iR] * a_cc[iAp1] * pa[iP] + rb[iR] * a_ac[iAm1] + ra[iR] * a_bc[iAp1] + a_bc[iA] * pb[iP] + a_ac[iA] * pa[iP]; } hypre_BoxLoop4End(iP, iR, iA, iAc); #undef DEVICE_VAR break; } /* end switch statement */ } /* end ForBoxI */ return ierr; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SparseMSG3BuildRAPNoSym( hypre_StructMatrix *A, hypre_StructMatrix *P, hypre_StructMatrix *R, HYPRE_Int cdir, hypre_Index cindex, hypre_Index cstride, hypre_Index stridePR, hypre_StructMatrix *RAP ) { hypre_Index index; hypre_Index index_temp; hypre_StructStencil *fine_stencil; HYPRE_Int fine_stencil_size; hypre_StructGrid *fgrid; HYPRE_Int *fgrid_ids; hypre_StructGrid *cgrid; hypre_BoxArray *cgrid_boxes; HYPRE_Int *cgrid_ids; hypre_Box *cgrid_box; hypre_IndexRef cstart; hypre_Index stridec; hypre_Index fstart; hypre_IndexRef stridef; hypre_Index Pstart; hypre_Index loop_size; HYPRE_Int fi, ci; hypre_Box *A_dbox; hypre_Box *P_dbox; hypre_Box *R_dbox; hypre_Box *RAP_dbox; HYPRE_Real *pa, *pb; HYPRE_Real *ra, *rb; HYPRE_Real *a_cc = NULL, *a_cw = NULL, *a_ce = NULL, *a_cs = NULL, *a_cn = NULL; HYPRE_Real *a_ac = NULL, *a_aw = NULL, *a_ae = NULL, *a_as = NULL, *a_an = NULL; HYPRE_Real *a_be = NULL, *a_bn = NULL; HYPRE_Real *a_csw = NULL, *a_cse = NULL, *a_cnw = NULL, *a_cne = NULL; HYPRE_Real *a_asw = NULL, *a_ase = NULL, *a_anw = NULL, *a_ane = NULL; HYPRE_Real *a_bnw = NULL, *a_bne = NULL; HYPRE_Real *rap_ce = NULL, *rap_cn = NULL; HYPRE_Real *rap_ac = NULL, *rap_aw = NULL, *rap_ae = NULL; HYPRE_Real *rap_as = NULL, *rap_an = NULL; HYPRE_Real *rap_cnw = NULL, *rap_cne = NULL; HYPRE_Real *rap_asw = NULL, *rap_ase = NULL, *rap_anw = NULL, *rap_ane = NULL; HYPRE_Int zOffsetA; HYPRE_Int xOffsetP; HYPRE_Int yOffsetP; HYPRE_Int zOffsetP; HYPRE_Int ierr = 0; fine_stencil = hypre_StructMatrixStencil(A); fine_stencil_size = hypre_StructStencilSize(fine_stencil); stridef = cstride; hypre_SetIndex3(stridec, 1, 1, 1); fgrid = hypre_StructMatrixGrid(A); fgrid_ids = hypre_StructGridIDs(fgrid); cgrid = hypre_StructMatrixGrid(RAP); cgrid_boxes = hypre_StructGridBoxes(cgrid); cgrid_ids = hypre_StructGridIDs(cgrid); fi = 0; hypre_ForBoxI(ci, cgrid_boxes) { while (fgrid_ids[fi] != cgrid_ids[ci]) { fi++; } cgrid_box = hypre_BoxArrayBox(cgrid_boxes, ci); cstart = hypre_BoxIMin(cgrid_box); hypre_StructMapCoarseToFine(cstart, cindex, cstride, fstart); hypre_StructMapCoarseToFine(cstart, cindex, stridePR, Pstart); A_dbox = hypre_BoxArrayBox(hypre_StructMatrixDataSpace(A), fi); P_dbox = hypre_BoxArrayBox(hypre_StructMatrixDataSpace(P), fi); R_dbox = hypre_BoxArrayBox(hypre_StructMatrixDataSpace(R), fi); RAP_dbox = hypre_BoxArrayBox(hypre_StructMatrixDataSpace(RAP), ci); /*----------------------------------------------------------------- * Extract pointers for interpolation operator: * pa is pointer for weight for f-point above c-point * pb is pointer for weight for f-point below c-point *-----------------------------------------------------------------*/ hypre_SetIndex3(index_temp, 0, 0, -1); MapIndex(index_temp, cdir, index); pa = hypre_StructMatrixExtractPointerByIndex(P, fi, index); hypre_SetIndex3(index_temp, 0, 0, 1); MapIndex(index_temp, cdir, index); pb = hypre_StructMatrixExtractPointerByIndex(P, fi, index) - hypre_BoxOffsetDistance(P_dbox, index); /*----------------------------------------------------------------- * Extract pointers for restriction operator: * ra is pointer for weight for f-point above c-point * rb is pointer for weight for f-point below c-point *-----------------------------------------------------------------*/ hypre_SetIndex3(index_temp, 0, 0, -1); MapIndex(index_temp, cdir, index); ra = hypre_StructMatrixExtractPointerByIndex(R, fi, index); hypre_SetIndex3(index_temp, 0, 0, 1); MapIndex(index_temp, cdir, index); rb = hypre_StructMatrixExtractPointerByIndex(R, fi, index) - hypre_BoxOffsetDistance(R_dbox, index); /*----------------------------------------------------------------- * Extract pointers for 7-point fine grid operator: * * a_cc is pointer for center coefficient * a_cw is pointer for west coefficient in same plane * a_ce is pointer for east coefficient in same plane * a_cs is pointer for south coefficient in same plane * a_cn is pointer for north coefficient in same plane * a_ac is pointer for center coefficient in plane above * a_bc is pointer for center coefficient in plane below *-----------------------------------------------------------------*/ hypre_SetIndex3(index_temp, 0, 0, 0); MapIndex(index_temp, cdir, index); a_cc = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index_temp, -1, 0, 0); MapIndex(index_temp, cdir, index); a_cw = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index_temp, 1, 0, 0); MapIndex(index_temp, cdir, index); a_ce = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index_temp, 0, -1, 0); MapIndex(index_temp, cdir, index); a_cs = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index_temp, 0, 1, 0); MapIndex(index_temp, cdir, index); a_cn = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index_temp, 0, 0, 1); MapIndex(index_temp, cdir, index); a_ac = hypre_StructMatrixExtractPointerByIndex(A, fi, index); /*----------------------------------------------------------------- * Extract additional pointers for 19-point fine grid operator: * * a_aw is pointer for west coefficient in plane above * a_ae is pointer for east coefficient in plane above * a_as is pointer for south coefficient in plane above * a_an is pointer for north coefficient in plane above * a_bw is pointer for west coefficient in plane below * a_be is pointer for east coefficient in plane below * a_bs is pointer for south coefficient in plane below * a_bn is pointer for north coefficient in plane below * a_csw is pointer for southwest coefficient in same plane * a_cse is pointer for southeast coefficient in same plane * a_cnw is pointer for northwest coefficient in same plane * a_cne is pointer for northeast coefficient in same plane *-----------------------------------------------------------------*/ if (fine_stencil_size > 7) { hypre_SetIndex3(index_temp, -1, 0, 1); MapIndex(index_temp, cdir, index); a_aw = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index_temp, 1, 0, 1); MapIndex(index_temp, cdir, index); a_ae = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index_temp, 0, -1, 1); MapIndex(index_temp, cdir, index); a_as = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index_temp, 0, 1, 1); MapIndex(index_temp, cdir, index); a_an = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index_temp, 1, 0, -1); MapIndex(index_temp, cdir, index); a_be = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index_temp, 0, 1, -1); MapIndex(index_temp, cdir, index); a_bn = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index_temp, -1, -1, 0); MapIndex(index_temp, cdir, index); a_csw = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index_temp, 1, -1, 0); MapIndex(index_temp, cdir, index); a_cse = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index_temp, -1, 1, 0); MapIndex(index_temp, cdir, index); a_cnw = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index_temp, 1, 1, 0); MapIndex(index_temp, cdir, index); a_cne = hypre_StructMatrixExtractPointerByIndex(A, fi, index); } /*----------------------------------------------------------------- * Extract additional pointers for 27-point fine grid operator: * * a_asw is pointer for southwest coefficient in plane above * a_ase is pointer for southeast coefficient in plane above * a_anw is pointer for northwest coefficient in plane above * a_ane is pointer for northeast coefficient in plane above * a_bsw is pointer for southwest coefficient in plane below * a_bse is pointer for southeast coefficient in plane below * a_bnw is pointer for northwest coefficient in plane below * a_bne is pointer for northeast coefficient in plane below *-----------------------------------------------------------------*/ if (fine_stencil_size > 19) { hypre_SetIndex3(index_temp, -1, -1, 1); MapIndex(index_temp, cdir, index); a_asw = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index_temp, 1, -1, 1); MapIndex(index_temp, cdir, index); a_ase = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index_temp, -1, 1, 1); MapIndex(index_temp, cdir, index); a_anw = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index_temp, 1, 1, 1); MapIndex(index_temp, cdir, index); a_ane = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index_temp, -1, 1, -1); MapIndex(index_temp, cdir, index); a_bnw = hypre_StructMatrixExtractPointerByIndex(A, fi, index); hypre_SetIndex3(index_temp, 1, 1, -1); MapIndex(index_temp, cdir, index); a_bne = hypre_StructMatrixExtractPointerByIndex(A, fi, index); } /*----------------------------------------------------------------- * Extract pointers for 19-point coarse grid operator: * * We build only the upper triangular part (excluding diagonal). * * rap_ce is pointer for east coefficient in same plane (etc.) *-----------------------------------------------------------------*/ hypre_SetIndex3(index_temp, 1, 0, 0); MapIndex(index_temp, cdir, index); rap_ce = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index_temp, 0, 1, 0); MapIndex(index_temp, cdir, index); rap_cn = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index_temp, 0, 0, 1); MapIndex(index_temp, cdir, index); rap_ac = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index_temp, -1, 0, 1); MapIndex(index_temp, cdir, index); rap_aw = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index_temp, 1, 0, 1); MapIndex(index_temp, cdir, index); rap_ae = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index_temp, 0, -1, 1); MapIndex(index_temp, cdir, index); rap_as = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index_temp, 0, 1, 1); MapIndex(index_temp, cdir, index); rap_an = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index_temp, -1, 1, 0); MapIndex(index_temp, cdir, index); rap_cnw = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index_temp, 1, 1, 0); MapIndex(index_temp, cdir, index); rap_cne = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); /*----------------------------------------------------------------- * Extract additional pointers for 27-point coarse grid operator: * * A 27-point coarse grid operator is produced when the fine grid * stencil is 19 or 27 point. * * We build only the upper triangular part. * * rap_cnw is pointer for northwest coefficient in same plane (etc.) *-----------------------------------------------------------------*/ if (fine_stencil_size > 7) { hypre_SetIndex3(index_temp, -1, -1, 1); MapIndex(index_temp, cdir, index); rap_asw = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index_temp, 1, -1, 1); MapIndex(index_temp, cdir, index); rap_ase = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index_temp, -1, 1, 1); MapIndex(index_temp, cdir, index); rap_anw = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); hypre_SetIndex3(index_temp, 1, 1, 1); MapIndex(index_temp, cdir, index); rap_ane = hypre_StructMatrixExtractPointerByIndex(RAP, ci, index); } /*----------------------------------------------------------------- * Define offsets for fine grid stencil and interpolation * * In the BoxLoop below I assume iA and iP refer to data associated * with the point which we are building the stencil for. The below * Offsets are used in refering to data associated with other points. *-----------------------------------------------------------------*/ hypre_SetIndex3(index_temp, 0, 0, 1); MapIndex(index_temp, cdir, index); zOffsetA = hypre_BoxOffsetDistance(A_dbox, index); zOffsetP = hypre_BoxOffsetDistance(P_dbox, index); hypre_SetIndex3(index_temp, 0, 1, 0); MapIndex(index_temp, cdir, index); yOffsetP = hypre_BoxOffsetDistance(P_dbox, index); hypre_SetIndex3(index_temp, 1, 0, 0); MapIndex(index_temp, cdir, index); xOffsetP = hypre_BoxOffsetDistance(P_dbox, index); /*----------------------------------------------------------------- * Switch statement to direct control to apropriate BoxLoop depending * on stencil size. Default is full 27-point. *-----------------------------------------------------------------*/ switch (fine_stencil_size) { /*-------------------------------------------------------------- * Loop for 7-point fine grid operator; produces upper triangular * part of 19-point coarse grid operator. stencil entries: * (above-north, above-east, above-center, above-west, * above-south, center-north, and center-east). *--------------------------------------------------------------*/ case 7: hypre_BoxGetSize(cgrid_box, loop_size); #define DEVICE_VAR is_device_ptr(rap_an,ra,a_cn,pb,rap_ae,a_ce,rap_ac,a_ac,a_cc,rap_aw,a_cw,rap_as,a_cs,rap_cn,rb,pa,rap_ce,rap_cnw,rap_cne) hypre_BoxLoop4Begin(hypre_StructMatrixNDim(A), loop_size, P_dbox, Pstart, stridePR, iP, R_dbox, Pstart, stridePR, iR, A_dbox, fstart, stridef, iA, RAP_dbox, cstart, stridec, iAc); { HYPRE_Int iAm1 = iA - zOffsetA; HYPRE_Int iAp1 = iA + zOffsetA; HYPRE_Int iP1 = iP + zOffsetP + yOffsetP; rap_an[iAc] = ra[iR] * a_cn[iAp1] * pb[iP1]; iP1 = iP + zOffsetP + xOffsetP; rap_ae[iAc] = ra[iR] * a_ce[iAp1] * pb[iP1]; iP1 = iP + zOffsetP; rap_ac[iAc] = a_ac[iA] * pb[iP1] + ra[iR] * a_cc[iAp1] * pb[iP1] + ra[iR] * a_ac[iAp1]; iP1 = iP + zOffsetP - xOffsetP; rap_aw[iAc] = ra[iR] * a_cw[iAp1] * pb[iP1]; iP1 = iP + zOffsetP - yOffsetP; rap_as[iAc] = ra[iR] * a_cs[iAp1] * pb[iP1]; iP1 = iP + yOffsetP; rap_cn[iAc] = a_cn[iA] + rb[iR] * a_cn[iAm1] * pb[iP1] + ra[iR] * a_cn[iAp1] * pa[iP1]; iP1 = iP + xOffsetP; rap_ce[iAc] = a_ce[iA] + rb[iR] * a_ce[iAm1] * pb[iP1] + ra[iR] * a_ce[iAp1] * pa[iP1]; rap_cnw[iAc] = 0.0; rap_cne[iAc] = 0.0; } hypre_BoxLoop4End(iP, iR, iA, iAc); #undef DEVICE_VAR break; /*-------------------------------------------------------------- * Loop for 19-point fine grid operator; produces upper triangular * part of 27-point coarse grid operator. stencil entries: * (above-northeast, above-north, above-northwest, above-east, * above-center, above-west, above-southeast, above-south, * above-southwest, center-northeast, center-north, * center-northwest, and center-east). *--------------------------------------------------------------*/ case 19: hypre_BoxGetSize(cgrid_box, loop_size); #define DEVICE_VAR is_device_ptr(rap_ane,ra,a_cne,pb,rap_an,a_cn,a_an,rap_anw,a_cnw,rap_ae,a_ce,a_ae,rap_ac,a_ac,a_cc,rap_aw,a_cw,a_aw,rap_ase,a_cse,rap_as,a_cs,a_as,rap_asw,a_csw,rap_cne,rb,pa,rap_cn,a_bn,rap_cnw,rap_ce,a_be) hypre_BoxLoop4Begin(hypre_StructMatrixNDim(A), loop_size, P_dbox, Pstart, stridePR, iP, R_dbox, Pstart, stridePR, iR, A_dbox, fstart, stridef, iA, RAP_dbox, cstart, stridec, iAc); { HYPRE_Int iAm1 = iA - zOffsetA; HYPRE_Int iAp1 = iA + zOffsetA; HYPRE_Int iP1 = iP + zOffsetP + yOffsetP + xOffsetP; rap_ane[iAc] = ra[iR] * a_cne[iAp1] * pb[iP1]; iP1 = iP + zOffsetP + yOffsetP; rap_an[iAc] = ra[iR] * a_cn[iAp1] * pb[iP1] + ra[iR] * a_an[iAp1] + a_an[iA] * pb[iP1]; iP1 = iP + zOffsetP + yOffsetP - xOffsetP; rap_anw[iAc] = ra[iR] * a_cnw[iAp1] * pb[iP1]; iP1 = iP + zOffsetP + xOffsetP; rap_ae[iAc] = ra[iR] * a_ce[iAp1] * pb[iP1] + ra[iR] * a_ae[iAp1] + a_ae[iA] * pb[iP1]; iP1 = iP + zOffsetP; rap_ac[iAc] = a_ac[iA] * pb[iP1] + ra[iR] * a_cc[iAp1] * pb[iP1] + ra[iR] * a_ac[iAp1]; iP1 = iP + zOffsetP - xOffsetP; rap_aw[iAc] = ra[iR] * a_cw[iAp1] * pb[iP1] + ra[iR] * a_aw[iAp1] + a_aw[iA] * pb[iP1]; iP1 = iP + zOffsetP - yOffsetP + xOffsetP; rap_ase[iAc] = ra[iR] * a_cse[iAp1] * pb[iP1]; iP1 = iP + zOffsetP - yOffsetP; rap_as[iAc] = ra[iR] * a_cs[iAp1] * pb[iP1] + ra[iR] * a_as[iAp1] + a_as[iA] * pb[iP1]; iP1 = iP + zOffsetP - yOffsetP - xOffsetP; rap_asw[iAc] = ra[iR] * a_csw[iAp1] * pb[iP1]; iP1 = iP + yOffsetP + xOffsetP; rap_cne[iAc] = a_cne[iA] + rb[iR] * a_cne[iAm1] * pb[iP1] + ra[iR] * a_cne[iAp1] * pa[iP1]; iP1 = iP + yOffsetP; rap_cn[iAc] = a_cn[iA] + rb[iR] * a_cn[iAm1] * pb[iP1] + ra[iR] * a_cn[iAp1] * pa[iP1] + a_bn[iA] * pb[iP1] + a_an[iA] * pa[iP1] + rb[iR] * a_an[iAm1] + ra[iR] * a_bn[iAp1]; iP1 = iP + yOffsetP - xOffsetP; rap_cnw[iAc] = a_cnw[iA] + rb[iR] * a_cnw[iAm1] * pb[iP1] + ra[iR] * a_cnw[iAp1] * pa[iP1]; iP1 = iP + xOffsetP; rap_ce[iAc] = a_ce[iA] + rb[iR] * a_ce[iAm1] * pb[iP1] + ra[iR] * a_ce[iAp1] * pa[iP1] + a_be[iA] * pb[iP1] + a_ae[iA] * pa[iP1] + rb[iR] * a_ae[iAm1] + ra[iR] * a_be[iAp1]; } hypre_BoxLoop4End(iP, iR, iA, iAc); #undef DEVICE_VAR break; /*-------------------------------------------------------------- * Loop for 27-point fine grid operator; produces upper triangular * part of 27-point coarse grid operator. stencil entries: * (above-northeast, above-north, above-northwest, above-east, * above-center, above-west, above-southeast, above-south, * above-southwest, center-northeast, center-north, * center-northwest, and center-east). *--------------------------------------------------------------*/ default: hypre_BoxGetSize(cgrid_box, loop_size); #define DEVICE_VAR is_device_ptr(rap_ane,ra,a_cne,pb,a_ane,rap_an,a_cn,a_an,rap_anw,a_cnw,a_anw,rap_ae,a_ce,a_ae,rap_ac,a_ac,a_cc,rap_aw,a_cw,a_aw,rap_ase,a_cse,a_ase,rap_as,a_cs,a_as,rap_asw,a_csw,a_asw,rap_cne,rb,pa,a_bne,rap_cn,a_bn,rap_cnw,a_bnw,rap_ce,a_be) hypre_BoxLoop4Begin(hypre_StructMatrixNDim(A), loop_size, P_dbox, Pstart, stridePR, iP, R_dbox, Pstart, stridePR, iR, A_dbox, fstart, stridef, iA, RAP_dbox, cstart, stridec, iAc); { HYPRE_Int iAm1 = iA - zOffsetA; HYPRE_Int iAp1 = iA + zOffsetA; HYPRE_Int iP1 = iP + zOffsetP + yOffsetP + xOffsetP; rap_ane[iAc] = ra[iR] * a_cne[iAp1] * pb[iP1] + ra[iR] * a_ane[iAp1] + a_ane[iA] * pb[iP1]; iP1 = iP + zOffsetP + yOffsetP; rap_an[iAc] = ra[iR] * a_cn[iAp1] * pb[iP1] + ra[iR] * a_an[iAp1] + a_an[iA] * pb[iP1]; iP1 = iP + zOffsetP + yOffsetP - xOffsetP; rap_anw[iAc] = ra[iR] * a_cnw[iAp1] * pb[iP1] + ra[iR] * a_anw[iAp1] + a_anw[iA] * pb[iP1]; iP1 = iP + zOffsetP + xOffsetP; rap_ae[iAc] = ra[iR] * a_ce[iAp1] * pb[iP1] + ra[iR] * a_ae[iAp1] + a_ae[iA] * pb[iP1]; iP1 = iP + zOffsetP; rap_ac[iAc] = a_ac[iA] * pb[iP1] + ra[iR] * a_cc[iAp1] * pb[iP1] + ra[iR] * a_ac[iAp1]; iP1 = iP + zOffsetP - xOffsetP; rap_aw[iAc] = ra[iR] * a_cw[iAp1] * pb[iP1] + ra[iR] * a_aw[iAp1] + a_aw[iA] * pb[iP1]; iP1 = iP + zOffsetP - yOffsetP + xOffsetP; rap_ase[iAc] = ra[iR] * a_cse[iAp1] * pb[iP1] + ra[iR] * a_ase[iAp1] + a_ase[iA] * pb[iP1]; iP1 = iP + zOffsetP - yOffsetP; rap_as[iAc] = ra[iR] * a_cs[iAp1] * pb[iP1] + ra[iR] * a_as[iAp1] + a_as[iA] * pb[iP1]; iP1 = iP + zOffsetP - yOffsetP - xOffsetP; rap_asw[iAc] = ra[iR] * a_csw[iAp1] * pb[iP1] + ra[iR] * a_asw[iAp1] + a_asw[iA] * pb[iP1]; iP1 = iP + yOffsetP + xOffsetP; rap_cne[iAc] = a_cne[iA] + rb[iR] * a_cne[iAm1] * pb[iP1] + ra[iR] * a_cne[iAp1] * pa[iP1] + a_bne[iA] * pb[iP1] + a_ane[iA] * pa[iP1] + rb[iR] * a_ane[iAm1] + ra[iR] * a_bne[iAp1]; iP1 = iP + yOffsetP; rap_cn[iAc] = a_cn[iA] + rb[iR] * a_cn[iAm1] * pb[iP1] + ra[iR] * a_cn[iAp1] * pa[iP1] + a_bn[iA] * pb[iP1] + a_an[iA] * pa[iP1] + rb[iR] * a_an[iAm1] + ra[iR] * a_bn[iAp1]; iP1 = iP + yOffsetP - xOffsetP; rap_cnw[iAc] = a_cnw[iA] + rb[iR] * a_cnw[iAm1] * pb[iP1] + ra[iR] * a_cnw[iAp1] * pa[iP1] + a_bnw[iA] * pb[iP1] + a_anw[iA] * pa[iP1] + rb[iR] * a_anw[iAm1] + ra[iR] * a_bnw[iAp1]; iP1 = iP + xOffsetP; rap_ce[iAc] = a_ce[iA] + rb[iR] * a_ce[iAm1] * pb[iP1] + ra[iR] * a_ce[iAp1] * pa[iP1] + a_be[iA] * pb[iP1] + a_ae[iA] * pa[iP1] + rb[iR] * a_ae[iAm1] + ra[iR] * a_be[iAp1]; } hypre_BoxLoop4End(iP, iR, iA, iAc); #undef DEVICE_VAR break; } /* end switch statement */ } /* end ForBoxI */ return ierr; } hypre-2.33.0/src/struct_ls/sparse_msg_filter.c000066400000000000000000000404361477326011500214300ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "_hypre_struct_ls.h" #include "_hypre_struct_mv.hpp" #if 0 /*-------------------------------------------------------------------------- * hypre_SparseMSGFilterSetup *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SparseMSGFilterSetup( hypre_StructMatrix *A, HYPRE_Int *num_grids, HYPRE_Int lx, HYPRE_Int ly, HYPRE_Int lz, HYPRE_Int jump, hypre_StructVector *visitx, hypre_StructVector *visity, hypre_StructVector *visitz ) { HYPRE_Int ierr = 0; hypre_BoxArray *compute_boxes; hypre_Box *compute_box; hypre_Box *A_dbox; hypre_Box *v_dbox; HYPRE_Int Ai; HYPRE_Int vi; HYPRE_Real *Ap; HYPRE_Real *vxp; HYPRE_Real *vyp; HYPRE_Real *vzp; HYPRE_Real lambdax; HYPRE_Real lambday; HYPRE_Real lambdaz; HYPRE_Real lambda_max; hypre_StructStencil *stencil; hypre_Index *stencil_shape; HYPRE_Int stencil_size; HYPRE_Int Astenc; hypre_Index loop_size; hypre_Index cindex; hypre_IndexRef start; hypre_Index startv; hypre_Index stride; hypre_Index stridev; HYPRE_Int i, si, dir, k, l; /*---------------------------------------------------------- * Initialize some things *----------------------------------------------------------*/ stencil = hypre_StructMatrixStencil(A); stencil_shape = hypre_StructStencilShape(stencil); stencil_size = hypre_StructStencilSize(stencil); /*----------------------------------------------------- * Compute encoding digit and strides *-----------------------------------------------------*/ hypre_SetIndex3(stride, 1, 1, 1); l = lx + ly + lz; if ((l >= 1) && (l <= jump)) { k = 1 >> l; hypre_SetIndex3(stridev, (1 >> lx), (1 >> ly), (1 >> lz)); } else { k = 1; hypre_SetIndex3(stridev, 1, 1, 1); hypre_StructVectorSetConstantValues(visitx, 0.0); hypre_StructVectorSetConstantValues(visity, 0.0); hypre_StructVectorSetConstantValues(visitz, 0.0); } /*----------------------------------------------------- * Compute visit vectors *-----------------------------------------------------*/ hypre_SetIndex3(cindex, 0, 0, 0); compute_boxes = hypre_StructGridBoxes(hypre_StructMatrixGrid(A)); hypre_ForBoxI(i, compute_boxes) { compute_box = hypre_BoxArrayBox(compute_boxes, i); A_dbox = hypre_BoxArrayBox(hypre_StructMatrixDataSpace(A), i); v_dbox = hypre_BoxArrayBox(hypre_StructVectorDataSpace(visitx), i); vxp = hypre_StructVectorBoxData(visitx, i); vyp = hypre_StructVectorBoxData(visity, i); vzp = hypre_StructVectorBoxData(visitz, i); start = hypre_BoxIMin(compute_box); hypre_StructMapCoarseToFine(start, cindex, stridev, startv); hypre_BoxGetSize(compute_box, loop_size); hypre_BoxLoop2Begin(hypre_StructMatrixNDim(A), loop_size, A_dbox, start, stride, Ai, v_dbox, startv, stridev, vi); { HYPRE_Real lambdax = 0.0; HYPRE_Real lambday = 0.0; HYPRE_Real lambdaz = 0.0; HYPRE_Int si, dir, Astenc; HYPRE_Real *Ap, lambda_max; for (si = 0; si < stencil_size; si++) { Ap = hypre_StructMatrixBoxData(A, i, si); /* compute lambdax */ Astenc = hypre_IndexD(stencil_shape[si], 0); if (Astenc == 0) { lambdax += Ap[Ai]; } else { lambdax -= Ap[Ai]; } /* compute lambday */ Astenc = hypre_IndexD(stencil_shape[si], 1); if (Astenc == 0) { lambday += Ap[Ai]; } else { lambday -= Ap[Ai]; } /* compute lambdaz */ Astenc = hypre_IndexD(stencil_shape[si], 2); if (Astenc == 0) { lambdaz += Ap[Ai]; } else { lambdaz -= Ap[Ai]; } } lambdax *= lambdax; lambday *= lambday; lambdaz *= lambdaz; lambda_max = 0; dir = -1; if ((lx < num_grids[0] - 1) && (lambdax > lambda_max)) { lambda_max = lambdax; dir = 0; } if ((ly < num_grids[1] - 1) && (lambday > lambda_max)) { lambda_max = lambday; dir = 1; } if ((lz < num_grids[2] - 1) && (lambdaz > lambda_max)) { lambda_max = lambdaz; dir = 2; } if (dir == 0) { vxp[vi] = (HYPRE_Real) ( ((HYPRE_Int) vxp[vi]) | k ); } else if (dir == 1) { vyp[vi] = (HYPRE_Real) ( ((HYPRE_Int) vyp[vi]) | k ); } else if (dir == 2) { vzp[vi] = (HYPRE_Real) ( ((HYPRE_Int) vzp[vi]) | k ); } } hypre_BoxLoop2End(Ai, vi); } return ierr; } /*-------------------------------------------------------------------------- * hypre_SparseMSGFilter *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SparseMSGFilter( hypre_StructVector *visit, hypre_StructVector *e, HYPRE_Int lx, HYPRE_Int ly, HYPRE_Int lz, HYPRE_Int jump ) { HYPRE_Int ierr = 0; hypre_BoxArray *compute_boxes; hypre_Box *compute_box; hypre_Box *e_dbox; hypre_Box *v_dbox; HYPRE_Int ei; HYPRE_Int vi; HYPRE_Real *ep; HYPRE_Real *vp; hypre_Index loop_size; hypre_Index cindex; hypre_IndexRef start; hypre_Index startv; hypre_Index stride; hypre_Index stridev; HYPRE_Int i, k, l; /*----------------------------------------------------- * Compute encoding digit and strides *-----------------------------------------------------*/ hypre_SetIndex3(stride, 1, 1, 1); l = lx + ly + lz; if ((l >= 1) && (l <= jump)) { k = 1 >> l; hypre_SetIndex3(stridev, (1 >> lx), (1 >> ly), (1 >> lz)); } else { k = 1; hypre_SetIndex3(stridev, 1, 1, 1); } /*----------------------------------------------------- * Filter interpolated error *-----------------------------------------------------*/ hypre_SetIndex3(cindex, 0, 0, 0); compute_boxes = hypre_StructGridBoxes(hypre_StructVectorGrid(e)); hypre_ForBoxI(i, compute_boxes) { compute_box = hypre_BoxArrayBox(compute_boxes, i); e_dbox = hypre_BoxArrayBox(hypre_StructVectorDataSpace(e), i); v_dbox = hypre_BoxArrayBox(hypre_StructVectorDataSpace(visit), i); ep = hypre_StructVectorBoxData(e, i); vp = hypre_StructVectorBoxData(visit, i); start = hypre_BoxIMin(compute_box); hypre_StructMapCoarseToFine(start, cindex, stridev, startv); hypre_BoxGetSize(compute_box, loop_size); hypre_BoxLoop2Begin(hypre_StructVectorNDim(e), loop_size, e_dbox, start, stride, ei, v_dbox, startv, stridev, vi); { if ( !(((HYPRE_Int) vp[vi]) & k) ) { ep[ei] = 0.0; } } hypre_BoxLoop2End(ei, vi); } return ierr; } #else /*-------------------------------------------------------------------------- * hypre_SparseMSGFilterSetup *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SparseMSGFilterSetup( hypre_StructMatrix *A, HYPRE_Int *num_grids, HYPRE_Int lx, HYPRE_Int ly, HYPRE_Int lz, HYPRE_Int jump, hypre_StructVector *visitx, hypre_StructVector *visity, hypre_StructVector *visitz ) { HYPRE_UNUSED_VAR(num_grids); HYPRE_UNUSED_VAR(jump); HYPRE_UNUSED_VAR(lx); HYPRE_UNUSED_VAR(ly); HYPRE_UNUSED_VAR(lz); HYPRE_Int ierr = 0; hypre_BoxArray *compute_boxes; hypre_Box *compute_box; hypre_Box *A_dbox; hypre_Box *v_dbox; HYPRE_Real *vxp; HYPRE_Real *vyp; HYPRE_Real *vzp; hypre_StructStencil *stencil; hypre_Index *stencil_shape; HYPRE_Int stencil_size; hypre_Index loop_size; hypre_Index cindex; hypre_IndexRef start; hypre_Index startv; hypre_Index stride; hypre_Index stridev; HYPRE_Int i; HYPRE_MemoryLocation memory_location = hypre_StructMatrixMemoryLocation(A); /*---------------------------------------------------------- * Initialize some things *----------------------------------------------------------*/ stencil = hypre_StructMatrixStencil(A); stencil_shape = hypre_StructStencilShape(stencil); stencil_size = hypre_StructStencilSize(stencil); /*----------------------------------------------------- * Compute encoding digit and strides *-----------------------------------------------------*/ hypre_SetIndex3(stride, 1, 1, 1); hypre_SetIndex3(stridev, 1, 1, 1); /*----------------------------------------------------- * Compute visit vectors *-----------------------------------------------------*/ hypre_SetIndex3(cindex, 0, 0, 0); compute_boxes = hypre_StructGridBoxes(hypre_StructMatrixGrid(A)); HYPRE_Int **data_indices = hypre_StructMatrixDataIndices(A); HYPRE_Complex *matrixA_data = hypre_StructMatrixData(A); HYPRE_Int *data_indices_d; /* On device */ hypre_Index *stencil_shape_d; if (hypre_GetExecPolicy1(memory_location) == HYPRE_EXEC_DEVICE) { HYPRE_Int nboxes = hypre_BoxArraySize(compute_boxes); data_indices_d = hypre_TAlloc(HYPRE_Int, stencil_size * nboxes, memory_location); stencil_shape_d = hypre_TAlloc(hypre_Index, stencil_size, memory_location); hypre_TMemcpy(data_indices_d, data_indices[0], HYPRE_Int, stencil_size * nboxes, memory_location, HYPRE_MEMORY_HOST); hypre_TMemcpy(stencil_shape_d, stencil_shape, hypre_Index, stencil_size, memory_location, HYPRE_MEMORY_HOST); } else { data_indices_d = data_indices[0]; stencil_shape_d = stencil_shape; } hypre_ForBoxI(i, compute_boxes) { compute_box = hypre_BoxArrayBox(compute_boxes, i); A_dbox = hypre_BoxArrayBox(hypre_StructMatrixDataSpace(A), i); v_dbox = hypre_BoxArrayBox(hypre_StructVectorDataSpace(visitx), i); vxp = hypre_StructVectorBoxData(visitx, i); vyp = hypre_StructVectorBoxData(visity, i); vzp = hypre_StructVectorBoxData(visitz, i); start = hypre_BoxIMin(compute_box); hypre_StructMapCoarseToFine(start, cindex, stridev, startv); hypre_BoxGetSize(compute_box, loop_size); #define DEVICE_VAR is_device_ptr(stencil_shape_d,vxp,vyp,vzp,data_indices_d,matrixA_data) hypre_BoxLoop2Begin(hypre_StructMatrixNDim(A), loop_size, A_dbox, start, stride, Ai, v_dbox, startv, stridev, vi); { HYPRE_Real lambdax, lambday, lambdaz; HYPRE_Real *Ap; HYPRE_Int si, Astenc; lambdax = 0.0; lambday = 0.0; lambdaz = 0.0; for (si = 0; si < stencil_size; si++) { Ap = matrixA_data + data_indices_d[i * stencil_size + si]; /* compute lambdax */ Astenc = hypre_IndexD(stencil_shape_d[si], 0); if (Astenc == 0) { lambdax += Ap[Ai]; } else { lambdax -= Ap[Ai]; } /* compute lambday */ Astenc = hypre_IndexD(stencil_shape_d[si], 1); if (Astenc == 0) { lambday += Ap[Ai]; } else { lambday -= Ap[Ai]; } /* compute lambdaz */ Astenc = hypre_IndexD(stencil_shape_d[si], 2); if (Astenc == 0) { lambdaz += Ap[Ai]; } else { lambdaz -= Ap[Ai]; } } lambdax *= lambdax; lambday *= lambday; lambdaz *= lambdaz; vxp[vi] = lambdax / (lambdax + lambday + lambdaz); vyp[vi] = lambday / (lambdax + lambday + lambdaz); vzp[vi] = lambdaz / (lambdax + lambday + lambdaz); } hypre_BoxLoop2End(Ai, vi); #undef DEVICE_VAR } if (hypre_GetExecPolicy1(memory_location) == HYPRE_EXEC_DEVICE) { hypre_TFree(data_indices_d, memory_location); hypre_TFree(stencil_shape_d, memory_location); } return ierr; } /*-------------------------------------------------------------------------- * hypre_SparseMSGFilter *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SparseMSGFilter( hypre_StructVector *visit, hypre_StructVector *e, HYPRE_Int lx, HYPRE_Int ly, HYPRE_Int lz, HYPRE_Int jump ) { HYPRE_UNUSED_VAR(jump); HYPRE_UNUSED_VAR(lx); HYPRE_UNUSED_VAR(ly); HYPRE_UNUSED_VAR(lz); HYPRE_Int ierr = 0; hypre_BoxArray *compute_boxes; hypre_Box *compute_box; hypre_Box *e_dbox; hypre_Box *v_dbox; HYPRE_Real *ep; HYPRE_Real *vp; hypre_Index loop_size; hypre_Index cindex; hypre_IndexRef start; hypre_Index startv; hypre_Index stride; hypre_Index stridev; HYPRE_Int i; /*----------------------------------------------------- * Compute encoding digit and strides *-----------------------------------------------------*/ hypre_SetIndex3(stride, 1, 1, 1); hypre_SetIndex3(stridev, 1, 1, 1); /*----------------------------------------------------- * Filter interpolated error *-----------------------------------------------------*/ hypre_SetIndex3(cindex, 0, 0, 0); compute_boxes = hypre_StructGridBoxes(hypre_StructVectorGrid(e)); hypre_ForBoxI(i, compute_boxes) { compute_box = hypre_BoxArrayBox(compute_boxes, i); e_dbox = hypre_BoxArrayBox(hypre_StructVectorDataSpace(e), i); v_dbox = hypre_BoxArrayBox(hypre_StructVectorDataSpace(visit), i); ep = hypre_StructVectorBoxData(e, i); vp = hypre_StructVectorBoxData(visit, i); start = hypre_BoxIMin(compute_box); hypre_StructMapCoarseToFine(start, cindex, stridev, startv); hypre_BoxGetSize(compute_box, loop_size); #define DEVICE_VAR is_device_ptr(ep,vp) hypre_BoxLoop2Begin(hypre_StructVectorNDim(e), loop_size, e_dbox, start, stride, ei, v_dbox, startv, stridev, vi); { ep[ei] *= vp[vi]; } hypre_BoxLoop2End(ei, vi); #undef DEVICE_VAR } return ierr; } #endif hypre-2.33.0/src/struct_ls/sparse_msg_interp.c000066400000000000000000000234451477326011500214450ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "_hypre_struct_ls.h" #include "_hypre_struct_mv.hpp" /*-------------------------------------------------------------------------- * hypre_SparseMSGInterpData data structure *--------------------------------------------------------------------------*/ typedef struct { hypre_StructMatrix *P; hypre_ComputePkg *compute_pkg; hypre_Index cindex; hypre_Index findex; hypre_Index stride; hypre_Index strideP; HYPRE_Int time_index; } hypre_SparseMSGInterpData; /*-------------------------------------------------------------------------- * hypre_SparseMSGInterpCreate *--------------------------------------------------------------------------*/ void * hypre_SparseMSGInterpCreate( void ) { hypre_SparseMSGInterpData *interp_data; interp_data = hypre_CTAlloc(hypre_SparseMSGInterpData, 1, HYPRE_MEMORY_HOST); (interp_data -> time_index) = hypre_InitializeTiming("SparseMSGInterp"); return (void *) interp_data; } /*-------------------------------------------------------------------------- * hypre_SparseMSGInterpSetup *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SparseMSGInterpSetup( void *interp_vdata, hypre_StructMatrix *P, hypre_StructVector *xc, hypre_StructVector *e, hypre_Index cindex, hypre_Index findex, hypre_Index stride, hypre_Index strideP ) { HYPRE_UNUSED_VAR(xc); hypre_SparseMSGInterpData *interp_data = (hypre_SparseMSGInterpData *)interp_vdata; hypre_StructGrid *grid; hypre_StructStencil *stencil; hypre_ComputeInfo *compute_info; hypre_ComputePkg *compute_pkg; HYPRE_Int ierr = 0; /*---------------------------------------------------------- * Set up the compute package *----------------------------------------------------------*/ grid = hypre_StructVectorGrid(e); stencil = hypre_StructMatrixStencil(P); hypre_CreateComputeInfo(grid, stencil, &compute_info); hypre_ComputeInfoProjectSend(compute_info, cindex, stride); hypre_ComputeInfoProjectRecv(compute_info, cindex, stride); hypre_ComputeInfoProjectComp(compute_info, findex, stride); hypre_ComputePkgCreate(compute_info, hypre_StructVectorDataSpace(e), 1, grid, &compute_pkg); /*---------------------------------------------------------- * Set up the interp data structure *----------------------------------------------------------*/ (interp_data -> P) = hypre_StructMatrixRef(P); (interp_data -> compute_pkg) = compute_pkg; hypre_CopyIndex(cindex, (interp_data -> cindex)); hypre_CopyIndex(findex, (interp_data -> findex)); hypre_CopyIndex(stride, (interp_data -> stride)); hypre_CopyIndex(strideP, (interp_data -> strideP)); return ierr; } /*-------------------------------------------------------------------------- * hypre_SparseMSGInterp: *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SparseMSGInterp( void *interp_vdata, hypre_StructMatrix *P, hypre_StructVector *xc, hypre_StructVector *e ) { HYPRE_Int ierr = 0; hypre_SparseMSGInterpData *interp_data = (hypre_SparseMSGInterpData *)interp_vdata; hypre_ComputePkg *compute_pkg; hypre_IndexRef cindex; hypre_IndexRef findex; hypre_IndexRef stride; hypre_IndexRef strideP; hypre_StructGrid *fgrid; HYPRE_Int *fgrid_ids; hypre_StructGrid *cgrid; hypre_BoxArray *cgrid_boxes; HYPRE_Int *cgrid_ids; hypre_CommHandle *comm_handle; hypre_BoxArrayArray *compute_box_aa; hypre_BoxArray *compute_box_a; hypre_Box *compute_box; hypre_Box *P_dbox; hypre_Box *xc_dbox; hypre_Box *e_dbox; HYPRE_Real *Pp0, *Pp1; HYPRE_Real *xcp; HYPRE_Real *ep, *ep0, *ep1; hypre_Index loop_size; hypre_Index start; hypre_Index startc; hypre_Index startP; hypre_Index stridec; hypre_StructStencil *stencil; hypre_Index *stencil_shape; HYPRE_Int compute_i, fi, ci, j; /*----------------------------------------------------------------------- * Initialize some things *-----------------------------------------------------------------------*/ hypre_BeginTiming(interp_data -> time_index); compute_pkg = (interp_data -> compute_pkg); cindex = (interp_data -> cindex); findex = (interp_data -> findex); stride = (interp_data -> stride); strideP = (interp_data -> strideP); stencil = hypre_StructMatrixStencil(P); stencil_shape = hypre_StructStencilShape(stencil); hypre_SetIndex3(stridec, 1, 1, 1); /*----------------------------------------------------------------------- * Compute e at coarse points (injection) *-----------------------------------------------------------------------*/ fgrid = hypre_StructVectorGrid(e); fgrid_ids = hypre_StructGridIDs(fgrid); cgrid = hypre_StructVectorGrid(xc); cgrid_boxes = hypre_StructGridBoxes(cgrid); cgrid_ids = hypre_StructGridIDs(cgrid); fi = 0; hypre_ForBoxI(ci, cgrid_boxes) { while (fgrid_ids[fi] != cgrid_ids[ci]) { fi++; } compute_box = hypre_BoxArrayBox(cgrid_boxes, ci); hypre_CopyIndex(hypre_BoxIMin(compute_box), startc); hypre_StructMapCoarseToFine(startc, cindex, stride, start); e_dbox = hypre_BoxArrayBox(hypre_StructVectorDataSpace(e), fi); xc_dbox = hypre_BoxArrayBox(hypre_StructVectorDataSpace(xc), ci); ep = hypre_StructVectorBoxData(e, fi); xcp = hypre_StructVectorBoxData(xc, ci); hypre_BoxGetSize(compute_box, loop_size); #define DEVICE_VAR is_device_ptr(ep,xcp) hypre_BoxLoop2Begin(hypre_StructMatrixNDim(P), loop_size, e_dbox, start, stride, ei, xc_dbox, startc, stridec, xci); { ep[ei] = xcp[xci]; } hypre_BoxLoop2End(ei, xci); #undef DEVICE_VAR } /*----------------------------------------------------------------------- * Compute e at fine points *-----------------------------------------------------------------------*/ for (compute_i = 0; compute_i < 2; compute_i++) { switch (compute_i) { case 0: { ep = hypre_StructVectorData(e); hypre_InitializeIndtComputations(compute_pkg, ep, &comm_handle); compute_box_aa = hypre_ComputePkgIndtBoxes(compute_pkg); } break; case 1: { hypre_FinalizeIndtComputations(comm_handle); compute_box_aa = hypre_ComputePkgDeptBoxes(compute_pkg); } break; } hypre_ForBoxArrayI(fi, compute_box_aa) { compute_box_a = hypre_BoxArrayArrayBoxArray(compute_box_aa, fi); P_dbox = hypre_BoxArrayBox(hypre_StructMatrixDataSpace(P), fi); e_dbox = hypre_BoxArrayBox(hypre_StructVectorDataSpace(e), fi); Pp0 = hypre_StructMatrixBoxData(P, fi, 0); Pp1 = hypre_StructMatrixBoxData(P, fi, 1); ep = hypre_StructVectorBoxData(e, fi); ep0 = ep + hypre_BoxOffsetDistance(e_dbox, stencil_shape[0]); ep1 = ep + hypre_BoxOffsetDistance(e_dbox, stencil_shape[1]); hypre_ForBoxI(j, compute_box_a) { compute_box = hypre_BoxArrayBox(compute_box_a, j); hypre_CopyIndex(hypre_BoxIMin(compute_box), start); hypre_StructMapFineToCoarse(start, findex, stride, startc); hypre_StructMapCoarseToFine(startc, cindex, strideP, startP); hypre_BoxGetStrideSize(compute_box, stride, loop_size); #define DEVICE_VAR is_device_ptr(ep,Pp0,ep0,Pp1,ep1) hypre_BoxLoop2Begin(hypre_StructMatrixNDim(P), loop_size, P_dbox, startP, strideP, Pi, e_dbox, start, stride, ei); { ep[ei] = (Pp0[Pi] * ep0[ei] + Pp1[Pi] * ep1[ei]); } hypre_BoxLoop2End(Pi, ei); #undef DEVICE_VAR } } } /*----------------------------------------------------------------------- * Return *-----------------------------------------------------------------------*/ hypre_IncFLOPCount(3 * hypre_StructVectorGlobalSize(xc)); hypre_EndTiming(interp_data -> time_index); return ierr; } /*-------------------------------------------------------------------------- * hypre_SparseMSGInterpDestroy *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SparseMSGInterpDestroy( void *interp_vdata ) { HYPRE_Int ierr = 0; hypre_SparseMSGInterpData *interp_data = (hypre_SparseMSGInterpData *)interp_vdata; if (interp_data) { hypre_StructMatrixDestroy(interp_data -> P); hypre_ComputePkgDestroy(interp_data -> compute_pkg); hypre_FinalizeTiming(interp_data -> time_index); hypre_TFree(interp_data, HYPRE_MEMORY_HOST); } return ierr; } hypre-2.33.0/src/struct_ls/sparse_msg_restrict.c000066400000000000000000000217741477326011500220060ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "_hypre_struct_ls.h" #include "_hypre_struct_mv.hpp" /*-------------------------------------------------------------------------- * hypre_SparseMSGRestrictData data structure *--------------------------------------------------------------------------*/ typedef struct { hypre_StructMatrix *R; hypre_ComputePkg *compute_pkg; hypre_Index cindex; hypre_Index stride; hypre_Index strideR; HYPRE_Int time_index; } hypre_SparseMSGRestrictData; /*-------------------------------------------------------------------------- * hypre_SparseMSGRestrictCreate *--------------------------------------------------------------------------*/ void * hypre_SparseMSGRestrictCreate( void ) { hypre_SparseMSGRestrictData *restrict_data; restrict_data = hypre_CTAlloc(hypre_SparseMSGRestrictData, 1, HYPRE_MEMORY_HOST); (restrict_data -> time_index) = hypre_InitializeTiming("SparseMSGRestrict"); return (void *) restrict_data; } /*-------------------------------------------------------------------------- * hypre_SparseMSGRestrictSetup *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SparseMSGRestrictSetup( void *restrict_vdata, hypre_StructMatrix *R, hypre_StructVector *r, hypre_StructVector *rc, hypre_Index cindex, hypre_Index findex, hypre_Index stride, hypre_Index strideR ) { HYPRE_UNUSED_VAR(rc); hypre_SparseMSGRestrictData *restrict_data = (hypre_SparseMSGRestrictData *)restrict_vdata; hypre_StructGrid *grid; hypre_StructStencil *stencil; hypre_ComputeInfo *compute_info; hypre_ComputePkg *compute_pkg; HYPRE_Int ierr = 0; /*---------------------------------------------------------- * Set up the compute package *----------------------------------------------------------*/ grid = hypre_StructVectorGrid(r); stencil = hypre_StructMatrixStencil(R); hypre_CreateComputeInfo(grid, stencil, &compute_info); hypre_ComputeInfoProjectSend(compute_info, findex, stride); hypre_ComputeInfoProjectRecv(compute_info, findex, stride); hypre_ComputeInfoProjectComp(compute_info, cindex, stride); hypre_ComputePkgCreate(compute_info, hypre_StructVectorDataSpace(r), 1, grid, &compute_pkg); /*---------------------------------------------------------- * Set up the restrict data structure *----------------------------------------------------------*/ (restrict_data -> R) = hypre_StructMatrixRef(R); (restrict_data -> compute_pkg) = compute_pkg; hypre_CopyIndex(cindex, (restrict_data -> cindex)); hypre_CopyIndex(stride, (restrict_data -> stride)); hypre_CopyIndex(strideR, (restrict_data -> strideR)); return ierr; } /*-------------------------------------------------------------------------- * hypre_SparseMSGRestrict: *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SparseMSGRestrict( void *restrict_vdata, hypre_StructMatrix *R, hypre_StructVector *r, hypre_StructVector *rc ) { HYPRE_Int ierr = 0; hypre_SparseMSGRestrictData *restrict_data = (hypre_SparseMSGRestrictData *)restrict_vdata; hypre_ComputePkg *compute_pkg; hypre_IndexRef cindex; hypre_IndexRef stride; hypre_IndexRef strideR; hypre_StructGrid *fgrid; HYPRE_Int *fgrid_ids; hypre_StructGrid *cgrid; hypre_BoxArray *cgrid_boxes; HYPRE_Int *cgrid_ids; hypre_CommHandle *comm_handle; hypre_BoxArrayArray *compute_box_aa; hypre_BoxArray *compute_box_a; hypre_Box *compute_box; hypre_Box *R_dbox; hypre_Box *r_dbox; hypre_Box *rc_dbox; HYPRE_Real *Rp0, *Rp1; HYPRE_Real *rp, *rp0, *rp1; HYPRE_Real *rcp; hypre_Index loop_size; hypre_IndexRef start; hypre_Index startc; hypre_Index startR; hypre_Index stridec; hypre_StructStencil *stencil; hypre_Index *stencil_shape; HYPRE_Int compute_i, fi, ci, j; /*----------------------------------------------------------------------- * Initialize some things. *-----------------------------------------------------------------------*/ hypre_BeginTiming(restrict_data -> time_index); compute_pkg = (restrict_data -> compute_pkg); cindex = (restrict_data -> cindex); stride = (restrict_data -> stride); strideR = (restrict_data -> strideR); stencil = hypre_StructMatrixStencil(R); stencil_shape = hypre_StructStencilShape(stencil); hypre_SetIndex3(stridec, 1, 1, 1); /*-------------------------------------------------------------------- * Restrict the residual. *--------------------------------------------------------------------*/ fgrid = hypre_StructVectorGrid(r); fgrid_ids = hypre_StructGridIDs(fgrid); cgrid = hypre_StructVectorGrid(rc); cgrid_boxes = hypre_StructGridBoxes(cgrid); cgrid_ids = hypre_StructGridIDs(cgrid); for (compute_i = 0; compute_i < 2; compute_i++) { switch (compute_i) { case 0: { rp = hypre_StructVectorData(r); hypre_InitializeIndtComputations(compute_pkg, rp, &comm_handle); compute_box_aa = hypre_ComputePkgIndtBoxes(compute_pkg); } break; case 1: { hypre_FinalizeIndtComputations(comm_handle); compute_box_aa = hypre_ComputePkgDeptBoxes(compute_pkg); } break; } fi = 0; hypre_ForBoxI(ci, cgrid_boxes) { while (fgrid_ids[fi] != cgrid_ids[ci]) { fi++; } compute_box_a = hypre_BoxArrayArrayBoxArray(compute_box_aa, fi); R_dbox = hypre_BoxArrayBox(hypre_StructMatrixDataSpace(R), fi); r_dbox = hypre_BoxArrayBox(hypre_StructVectorDataSpace(r), fi); rc_dbox = hypre_BoxArrayBox(hypre_StructVectorDataSpace(rc), ci); Rp0 = hypre_StructMatrixBoxData(R, fi, 1) - hypre_BoxOffsetDistance(R_dbox, stencil_shape[1]); Rp1 = hypre_StructMatrixBoxData(R, fi, 0); rp = hypre_StructVectorBoxData(r, fi); rp0 = rp + hypre_BoxOffsetDistance(r_dbox, stencil_shape[0]); rp1 = rp + hypre_BoxOffsetDistance(r_dbox, stencil_shape[1]); rcp = hypre_StructVectorBoxData(rc, ci); hypre_ForBoxI(j, compute_box_a) { compute_box = hypre_BoxArrayBox(compute_box_a, j); start = hypre_BoxIMin(compute_box); hypre_StructMapFineToCoarse(start, cindex, stride, startc); hypre_StructMapCoarseToFine(startc, cindex, strideR, startR); hypre_BoxGetStrideSize(compute_box, stride, loop_size); #define DEVICE_VAR is_device_ptr(rcp,rp,Rp0,rp0,Rp1,rp1) hypre_BoxLoop3Begin(hypre_StructMatrixNDim(R), loop_size, R_dbox, startR, strideR, Ri, r_dbox, start, stride, ri, rc_dbox, startc, stridec, rci); { rcp[rci] = rp[ri] + (Rp0[Ri] * rp0[ri] + Rp1[Ri] * rp1[ri]); } hypre_BoxLoop3End(Ri, ri, rci); #undef DEVICE_VAR } } } /*----------------------------------------------------------------------- * Return *-----------------------------------------------------------------------*/ hypre_IncFLOPCount(4 * hypre_StructVectorGlobalSize(rc)); hypre_EndTiming(restrict_data -> time_index); return ierr; } /*-------------------------------------------------------------------------- * hypre_SparseMSGRestrictDestroy *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SparseMSGRestrictDestroy( void *restrict_vdata ) { HYPRE_Int ierr = 0; hypre_SparseMSGRestrictData *restrict_data = (hypre_SparseMSGRestrictData *)restrict_vdata; if (restrict_data) { hypre_StructMatrixDestroy(restrict_data -> R); hypre_ComputePkgDestroy(restrict_data -> compute_pkg); hypre_FinalizeTiming(restrict_data -> time_index); hypre_TFree(restrict_data, HYPRE_MEMORY_HOST); } return ierr; } hypre-2.33.0/src/struct_ls/sparse_msg_setup.c000066400000000000000000000726671477326011500213160ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * *****************************************************************************/ #include "_hypre_struct_ls.h" #include "sparse_msg.h" #define DEBUG 0 #define GRID 0 #define hypre_SparseMSGSetCIndex(cdir, cindex) \ { \ hypre_SetIndex3(cindex, 0, 0, 0); \ hypre_IndexD(cindex, cdir) = 0; \ } #define hypre_SparseMSGSetFIndex(cdir, findex) \ { \ hypre_SetIndex3(findex, 0, 0, 0); \ hypre_IndexD(findex, cdir) = 1; \ } #define hypre_SparseMSGSetStride(cdir, stride) \ { \ hypre_SetIndex3(stride, 1, 1, 1); \ hypre_IndexD(stride, cdir) = 2; \ } /*-------------------------------------------------------------------------- * hypre_SparseMSGSetup *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SparseMSGSetup( void *smsg_vdata, hypre_StructMatrix *A, hypre_StructVector *b, hypre_StructVector *x ) { hypre_SparseMSGData *smsg_data = (hypre_SparseMSGData *) smsg_vdata; MPI_Comm comm = (smsg_data -> comm); HYPRE_Int max_iter; HYPRE_Int jump = (smsg_data -> jump); HYPRE_Int relax_type = (smsg_data -> relax_type); HYPRE_Int usr_jacobi_weight = (smsg_data -> usr_jacobi_weight); HYPRE_Real jacobi_weight = (smsg_data -> jacobi_weight); HYPRE_Int *num_grids = (smsg_data -> num_grids); HYPRE_Int num_all_grids; HYPRE_Int num_levels; hypre_StructGrid **grid_a; hypre_StructGrid **Px_grid_a; hypre_StructGrid **Py_grid_a; hypre_StructGrid **Pz_grid_a; HYPRE_Real *data; HYPRE_Real *tdata; HYPRE_Int data_size = 0; hypre_StructMatrix **A_a; hypre_StructMatrix **Px_a; hypre_StructMatrix **Py_a; hypre_StructMatrix **Pz_a; hypre_StructMatrix **RTx_a; hypre_StructMatrix **RTy_a; hypre_StructMatrix **RTz_a; hypre_StructVector **b_a; hypre_StructVector **x_a; /* temp vectors */ hypre_StructVector **t_a; hypre_StructVector **r_a; hypre_StructVector **e_a; hypre_StructVector **visitx_a; hypre_StructVector **visity_a; hypre_StructVector **visitz_a; HYPRE_Int *grid_on; void **relax_a; void **matvec_a; void **restrictx_a; void **restricty_a; void **restrictz_a; void **interpx_a; void **interpy_a; void **interpz_a; hypre_Index cindex; hypre_Index findex; hypre_Index stride; hypre_Index stridePR; hypre_StructGrid *grid; HYPRE_Int dim; hypre_Box *cbox; HYPRE_Int d, l, lx, ly, lz; HYPRE_Int fi, ci; HYPRE_Int b_num_ghost[] = {0, 0, 0, 0, 0, 0}; HYPRE_Int x_num_ghost[] = {1, 1, 1, 1, 1, 1}; HYPRE_Int ierr = 0; HYPRE_MemoryLocation memory_location = hypre_StructMatrixMemoryLocation(A); #if DEBUG char filename[255]; #endif /*----------------------------------------------------- * Set up coarse grids *-----------------------------------------------------*/ grid = hypre_StructMatrixGrid(A); dim = hypre_StructGridNDim(grid); /* Determine num_grids[] and num_levels */ num_levels = 1; cbox = hypre_BoxDuplicate(hypre_StructGridBoundingBox(grid)); for (d = 0; d < dim; d++) { while ( hypre_BoxIMaxD(cbox, d) > hypre_BoxIMinD(cbox, d) ) { /* set cindex, findex, and stride */ hypre_SparseMSGSetCIndex(d, cindex); hypre_SparseMSGSetFIndex(d, findex); hypre_SparseMSGSetStride(d, stride); /* coarsen cbox */ hypre_ProjectBox(cbox, cindex, stride); hypre_StructMapFineToCoarse(hypre_BoxIMin(cbox), cindex, stride, hypre_BoxIMin(cbox)); hypre_StructMapFineToCoarse(hypre_BoxIMax(cbox), cindex, stride, hypre_BoxIMax(cbox)); /* increment level counters */ num_grids[d]++; num_levels++; } } #if 0 /* Restrict the semicoarsening to a particular direction */ num_grids[1] = 1; num_grids[2] = 1; num_levels = num_grids[0]; #endif /* Compute the num_all_grids based on num_grids[] */ num_all_grids = num_grids[0] * num_grids[1] * num_grids[2]; /* Store some variables and clean up */ hypre_BoxDestroy(cbox); (smsg_data -> num_all_grids) = num_all_grids; (smsg_data -> num_levels) = num_levels; grid_a = hypre_TAlloc(hypre_StructGrid *, num_all_grids, HYPRE_MEMORY_HOST); hypre_StructGridRef(grid, &grid_a[0]); Px_grid_a = hypre_TAlloc(hypre_StructGrid *, num_grids[0], HYPRE_MEMORY_HOST); Py_grid_a = hypre_TAlloc(hypre_StructGrid *, num_grids[1], HYPRE_MEMORY_HOST); Pz_grid_a = hypre_TAlloc(hypre_StructGrid *, num_grids[2], HYPRE_MEMORY_HOST); Px_grid_a[0] = NULL; Py_grid_a[0] = NULL; Pz_grid_a[0] = NULL; /*----------------------------------------- * Compute coarse grids *-----------------------------------------*/ if (num_levels > 1) { /* coarsen in x direction */ hypre_SparseMSGSetCIndex(0, cindex); hypre_SparseMSGSetStride(0, stride); for (lx = 0; lx < num_grids[0] - 1; lx++) { hypre_SparseMSGMapIndex(lx, 0, 0, num_grids, fi); hypre_SparseMSGMapIndex(lx + 1, 0, 0, num_grids, ci); hypre_StructCoarsen(grid_a[fi], cindex, stride, 1, &grid_a[ci]); } /* coarsen in y direction */ hypre_SparseMSGSetCIndex(1, cindex); hypre_SparseMSGSetStride(1, stride); for (ly = 0; ly < num_grids[1] - 1; ly++) { for (lx = 0; lx < num_grids[0]; lx++) { hypre_SparseMSGMapIndex(lx, ly, 0, num_grids, fi); hypre_SparseMSGMapIndex(lx, ly + 1, 0, num_grids, ci); hypre_StructCoarsen(grid_a[fi], cindex, stride, 1, &grid_a[ci]); } } /* coarsen in z direction */ hypre_SparseMSGSetCIndex(2, cindex); hypre_SparseMSGSetStride(2, stride); for (lz = 0; lz < num_grids[2] - 1; lz++) { for (ly = 0; ly < num_grids[1]; ly++) { for (lx = 0; lx < num_grids[0]; lx++) { hypre_SparseMSGMapIndex(lx, ly, lz, num_grids, fi); hypre_SparseMSGMapIndex(lx, ly, lz + 1, num_grids, ci); hypre_StructCoarsen(grid_a[fi], cindex, stride, 1, &grid_a[ci]); } } } } /*----------------------------------------- * Compute interpolation grids *-----------------------------------------*/ if (num_levels > 1) { /* coarsen in x direction */ hypre_SparseMSGSetFIndex(0, findex); hypre_SparseMSGSetStride(0, stride); for (lx = 0; lx < num_grids[0] - 1; lx++) { hypre_SparseMSGMapIndex(lx, 0, 0, num_grids, fi); hypre_StructCoarsen(grid_a[fi], findex, stride, 1, &Px_grid_a[lx + 1]); } /* coarsen in y direction */ hypre_SparseMSGSetFIndex(1, findex); hypre_SparseMSGSetStride(1, stride); for (ly = 0; ly < num_grids[1] - 1; ly++) { hypre_SparseMSGMapIndex(0, ly, 0, num_grids, fi); hypre_StructCoarsen(grid_a[fi], findex, stride, 1, &Py_grid_a[ly + 1]); } /* coarsen in z direction */ hypre_SparseMSGSetFIndex(2, findex); hypre_SparseMSGSetStride(2, stride); for (lz = 0; lz < num_grids[2] - 1; lz++) { hypre_SparseMSGMapIndex(0, 0, lz, num_grids, fi); hypre_StructCoarsen(grid_a[fi], findex, stride, 1, &Pz_grid_a[lz + 1]); } } (smsg_data -> grid_array) = grid_a; (smsg_data -> Px_grid_array) = Px_grid_a; (smsg_data -> Py_grid_array) = Py_grid_a; (smsg_data -> Pz_grid_array) = Pz_grid_a; /*------------------------------------------------------ * Compute P, R, and A operators * Compute visit arrays and turn grids off if possible * * Note: this is ordered to conserve memory *-----------------------------------------------------*/ A_a = hypre_TAlloc(hypre_StructMatrix *, num_all_grids, HYPRE_MEMORY_HOST); Px_a = hypre_TAlloc(hypre_StructMatrix *, num_grids[0] - 1, HYPRE_MEMORY_HOST); Py_a = hypre_TAlloc(hypre_StructMatrix *, num_grids[1] - 1, HYPRE_MEMORY_HOST); Pz_a = hypre_TAlloc(hypre_StructMatrix *, num_grids[2] - 1, HYPRE_MEMORY_HOST); RTx_a = hypre_TAlloc(hypre_StructMatrix *, num_grids[0] - 1, HYPRE_MEMORY_HOST); RTy_a = hypre_TAlloc(hypre_StructMatrix *, num_grids[1] - 1, HYPRE_MEMORY_HOST); RTz_a = hypre_TAlloc(hypre_StructMatrix *, num_grids[2] - 1, HYPRE_MEMORY_HOST); visitx_a = hypre_CTAlloc(hypre_StructVector *, num_all_grids, HYPRE_MEMORY_HOST); visity_a = hypre_CTAlloc(hypre_StructVector *, num_all_grids, HYPRE_MEMORY_HOST); visitz_a = hypre_CTAlloc(hypre_StructVector *, num_all_grids, HYPRE_MEMORY_HOST); grid_on = hypre_CTAlloc(HYPRE_Int, num_all_grids, HYPRE_MEMORY_HOST); A_a[0] = hypre_StructMatrixRef(A); for (lz = 0; lz < num_grids[2]; lz++) { for (ly = 0; ly < num_grids[1]; ly++) { for (lx = 0; lx < num_grids[0]; lx++) { hypre_SparseMSGMapIndex(lx, ly, lz, num_grids, fi); /*------------------------------- * create visit arrays *-------------------------------*/ /* RDF */ #if 0 l = lx + ly + lz; if ((l >= 1) && (l <= jump)) { visitx_a[fi] = visitx_a[0]; visity_a[fi] = visity_a[0]; visitz_a[fi] = visitz_a[0]; } else #endif /* RDF */ { visitx_a[fi] = hypre_StructVectorCreate(comm, grid_a[fi]); visity_a[fi] = hypre_StructVectorCreate(comm, grid_a[fi]); visitz_a[fi] = hypre_StructVectorCreate(comm, grid_a[fi]); hypre_StructVectorSetNumGhost(visitx_a[fi], b_num_ghost); hypre_StructVectorSetNumGhost(visity_a[fi], b_num_ghost); hypre_StructVectorSetNumGhost(visitz_a[fi], b_num_ghost); hypre_StructVectorInitialize(visitx_a[fi]); hypre_StructVectorInitialize(visity_a[fi]); hypre_StructVectorInitialize(visitz_a[fi]); } hypre_SparseMSGFilterSetup(A_a[fi], num_grids, lx, ly, lz, jump, visitx_a[fi], visity_a[fi], visitz_a[fi]); #if GRID vx_dot_vx = hypre_StructInnerProd(visitx_a[fi], visitx_a[fi]); vy_dot_vy = hypre_StructInnerProd(visity_a[fi], visity_a[fi]); vz_dot_vz = hypre_StructInnerProd(visitz_a[fi], visitz_a[fi]); #else /* turn all grids on */ grid_on[fi] = 1; #endif /*------------------------------- * compute Px, RTx, and A *-------------------------------*/ if (lx < (num_grids[0] - 1)) { hypre_SparseMSGMapIndex(lx, ly, lz, num_grids, fi); hypre_SparseMSGMapIndex((lx + 1), ly, lz, num_grids, ci); hypre_SparseMSGSetCIndex(0, cindex); hypre_SparseMSGSetFIndex(0, findex); hypre_SparseMSGSetStride(0, stride); /* compute x-transfer operator */ if ((lz == 0) && (ly == 0)) { Px_a[lx] = hypre_PFMGCreateInterpOp(A_a[fi], Px_grid_a[lx + 1], 0, 0); hypre_StructMatrixInitialize(Px_a[lx]); hypre_PFMGSetupInterpOp(A_a[fi], 0, findex, stride, Px_a[lx], 0); RTx_a[lx] = Px_a[lx]; } /* compute coarse-operator with Px */ A_a[ci] = hypre_SparseMSGCreateRAPOp(RTx_a[lx], A_a[fi], Px_a[lx], grid_a[ci], 0); hypre_StructMatrixInitialize(A_a[ci]); hypre_SetIndex3(stridePR, 1, hypre_pow2(ly), hypre_pow2(lz)); hypre_SparseMSGSetupRAPOp(RTx_a[lx], A_a[fi], Px_a[lx], 0, cindex, stride, stridePR, A_a[ci]); } } /* RDF */ #if 0 /* free up some coarse-operators to conserve memory */ for (lx = 1; lx <= hypre_min((jump - ly - lz), (num_grids[0] - 1)); lx++) { hypre_SparseMSGMapIndex(lx, ly, lz, num_grids, fi); hypre_StructMatrixDestroy(A_a[fi]); A_a[fi] = NULL; } #endif /* RDF */ /*------------------------------- * compute Py, RTy, and A *-------------------------------*/ if (ly < (num_grids[1] - 1)) { hypre_SparseMSGMapIndex(0, ly, lz, num_grids, fi); hypre_SparseMSGMapIndex(0, (ly + 1), lz, num_grids, ci); hypre_SparseMSGSetCIndex(1, cindex); hypre_SparseMSGSetFIndex(1, findex); hypre_SparseMSGSetStride(1, stride); /* compute y-transfer operators */ if (lz == 0) { Py_a[ly] = hypre_PFMGCreateInterpOp(A_a[fi], Py_grid_a[ly + 1], 1, 0); hypre_StructMatrixInitialize(Py_a[ly]); hypre_PFMGSetupInterpOp(A_a[fi], 1, findex, stride, Py_a[ly], 0); RTy_a[ly] = Py_a[ly]; } /* compute coarse-operator with Py */ A_a[ci] = hypre_SparseMSGCreateRAPOp(RTy_a[ly], A_a[fi], Py_a[ly], grid_a[ci], 1); hypre_StructMatrixInitialize(A_a[ci]); hypre_SetIndex3(stridePR, 1, 1, hypre_pow2(lz)); hypre_SparseMSGSetupRAPOp(RTy_a[ly], A_a[fi], Py_a[ly], 1, cindex, stride, stridePR, A_a[ci]); } } /* RDF */ #if 0 /* free up some coarse-operators to conserve memory */ for (ly = 1; ly <= hypre_min((jump - lz), (num_grids[1] - 1)); ly++) { hypre_SparseMSGMapIndex(0, ly, lz, num_grids, fi); hypre_StructMatrixDestroy(A_a[fi]); A_a[fi] = NULL; } #endif /* RDF */ /*------------------------------- * compute Pz, RTz, and A *-------------------------------*/ if (lz < (num_grids[2] - 1)) { hypre_SparseMSGMapIndex(0, 0, lz, num_grids, fi); hypre_SparseMSGMapIndex(0, 0, (lz + 1), num_grids, ci); hypre_SparseMSGSetCIndex(2, cindex); hypre_SparseMSGSetFIndex(2, findex); hypre_SparseMSGSetStride(2, stride); /* compute z-transfer operators */ Pz_a[lz] = hypre_PFMGCreateInterpOp(A_a[fi], Pz_grid_a[lz + 1], 2, 0); hypre_StructMatrixInitialize(Pz_a[lz]); hypre_PFMGSetupInterpOp(A_a[fi], 2, findex, stride, Pz_a[lz], 0); RTz_a[lz] = Pz_a[lz]; /* compute coarse-operator with Pz */ A_a[ci] = hypre_SparseMSGCreateRAPOp(RTz_a[lz], A_a[fi], Pz_a[lz], grid_a[ci], 2); hypre_StructMatrixInitialize(A_a[ci]); hypre_SetIndex3(stridePR, 1, 1, 1); hypre_SparseMSGSetupRAPOp(RTz_a[lz], A_a[fi], Pz_a[lz], 2, cindex, stride, stridePR, A_a[ci]); } } /* RDF */ #if 0 /* free up some coarse-operators to conserve memory */ for (lz = 1; lz <= hypre_min((jump), (num_grids[2] - 1)); lz++) { hypre_SparseMSGMapIndex(0, 0, lz, num_grids, fi); hypre_StructMatrixDestroy(A_a[fi]); A_a[fi] = NULL; } #endif /* RDF */ (smsg_data -> A_array) = A_a; (smsg_data -> Px_array) = Px_a; (smsg_data -> Py_array) = Py_a; (smsg_data -> Pz_array) = Pz_a; (smsg_data -> RTx_array) = RTx_a; (smsg_data -> RTy_array) = RTy_a; (smsg_data -> RTz_array) = RTz_a; (smsg_data -> visitx_array) = visitx_a; (smsg_data -> visity_array) = visity_a; (smsg_data -> visitz_array) = visitz_a; (smsg_data -> grid_on) = grid_on; /*------------------------------------------------------ * Set up vector structures *-----------------------------------------------------*/ b_a = hypre_TAlloc(hypre_StructVector *, num_all_grids, HYPRE_MEMORY_HOST); x_a = hypre_TAlloc(hypre_StructVector *, num_all_grids, HYPRE_MEMORY_HOST); t_a = hypre_TAlloc(hypre_StructVector *, num_all_grids, HYPRE_MEMORY_HOST); r_a = hypre_TAlloc(hypre_StructVector *, num_all_grids, HYPRE_MEMORY_HOST); e_a = t_a; data_size = 0; b_a[0] = hypre_StructVectorRef(b); x_a[0] = hypre_StructVectorRef(x); t_a[0] = hypre_StructVectorCreate(comm, grid_a[0]); hypre_StructVectorSetNumGhost(t_a[0], x_num_ghost); hypre_StructVectorInitializeShell(t_a[0]); data_size += hypre_StructVectorDataSize(t_a[0]); r_a[0] = hypre_StructVectorCreate(comm, grid_a[0]); hypre_StructVectorSetNumGhost(r_a[0], x_num_ghost); hypre_StructVectorInitializeShell(r_a[0]); data_size += hypre_StructVectorDataSize(r_a[0]); for (lz = 0; lz < num_grids[2]; lz++) { for (ly = 0; ly < num_grids[1]; ly++) { for (lx = 0; lx < num_grids[0]; lx++) { l = lx + ly + lz; if (l >= 1) { hypre_SparseMSGMapIndex(lx, ly, lz, num_grids, fi); x_a[fi] = hypre_StructVectorCreate(comm, grid_a[fi]); hypre_StructVectorSetNumGhost(x_a[fi], x_num_ghost); hypre_StructVectorInitializeShell(x_a[fi]); data_size += hypre_StructVectorDataSize(x_a[fi]); t_a[fi] = hypre_StructVectorCreate(comm, grid_a[fi]); hypre_StructVectorSetNumGhost(t_a[fi], x_num_ghost); hypre_StructVectorInitializeShell(t_a[fi]); /* set vector structures in jump region */ if (l <= jump) { b_a[fi] = x_a[fi]; r_a[fi] = x_a[fi]; } /* set vector structures outside of jump region */ else { b_a[fi] = hypre_StructVectorCreate(comm, grid_a[fi]); hypre_StructVectorSetNumGhost(b_a[fi], b_num_ghost); hypre_StructVectorInitializeShell(b_a[fi]); data_size += hypre_StructVectorDataSize(b_a[fi]); r_a[fi] = hypre_StructVectorCreate(comm, grid_a[fi]); hypre_StructVectorSetNumGhost(r_a[fi], x_num_ghost); hypre_StructVectorInitializeShell(r_a[fi]); } } } } } data = hypre_CTAlloc(HYPRE_Real, data_size, memory_location); (smsg_data -> data) = data; (smsg_data -> memory_location) = memory_location; hypre_StructVectorInitializeData(t_a[0], data); hypre_StructVectorAssemble(t_a[0]); data += hypre_StructVectorDataSize(t_a[0]); hypre_StructVectorInitializeData(r_a[0], data); hypre_StructVectorAssemble(r_a[0]); data += hypre_StructVectorDataSize(r_a[0]); for (lz = 0; lz < num_grids[2]; lz++) { for (ly = 0; ly < num_grids[1]; ly++) { for (lx = 0; lx < num_grids[0]; lx++) { l = lx + ly + lz; if (l >= 1) { hypre_SparseMSGMapIndex(lx, ly, lz, num_grids, fi); hypre_StructVectorInitializeData(x_a[fi], data); hypre_StructVectorAssemble(x_a[fi]); data += hypre_StructVectorDataSize(x_a[fi]); tdata = hypre_StructVectorData(t_a[0]); hypre_StructVectorInitializeData(t_a[fi], tdata); /* set vector structures outside of jump region */ if (l > jump) { hypre_StructVectorInitializeData(b_a[fi], data); hypre_StructVectorAssemble(b_a[fi]); data += hypre_StructVectorDataSize(b_a[fi]); tdata = hypre_StructVectorData(r_a[0]); hypre_StructVectorInitializeData(r_a[fi], tdata); } } } } } (smsg_data -> b_array) = b_a; (smsg_data -> x_array) = x_a; (smsg_data -> t_array) = t_a; (smsg_data -> r_array) = r_a; (smsg_data -> e_array) = e_a; /*------------------------------------------------------ * Call setup routines *-----------------------------------------------------*/ relax_a = hypre_CTAlloc(void *, num_all_grids, HYPRE_MEMORY_HOST); matvec_a = hypre_CTAlloc(void *, num_all_grids, HYPRE_MEMORY_HOST); restrictx_a = hypre_CTAlloc(void *, num_all_grids, HYPRE_MEMORY_HOST); restricty_a = hypre_CTAlloc(void *, num_all_grids, HYPRE_MEMORY_HOST); restrictz_a = hypre_CTAlloc(void *, num_all_grids, HYPRE_MEMORY_HOST); interpx_a = hypre_CTAlloc(void *, num_all_grids, HYPRE_MEMORY_HOST); interpy_a = hypre_CTAlloc(void *, num_all_grids, HYPRE_MEMORY_HOST); interpz_a = hypre_CTAlloc(void *, num_all_grids, HYPRE_MEMORY_HOST); /* set up x-transfer routines */ for (lx = 0; lx < (num_grids[0] - 1); lx++) { hypre_SparseMSGSetCIndex(0, cindex); hypre_SparseMSGSetFIndex(0, findex); hypre_SparseMSGSetStride(0, stride); for (lz = 0; lz < num_grids[2]; lz++) { for (ly = 0; ly < num_grids[1]; ly++) { hypre_SparseMSGMapIndex(lx, ly, lz, num_grids, fi); hypre_SparseMSGMapIndex(lx + 1, ly, lz, num_grids, ci); hypre_SetIndex3(stridePR, 1, hypre_pow2(ly), hypre_pow2(lz)); interpx_a[fi] = hypre_SparseMSGInterpCreate(); hypre_SparseMSGInterpSetup(interpx_a[fi], Px_a[lx], x_a[ci], e_a[fi], cindex, findex, stride, stridePR); restrictx_a[fi] = hypre_SparseMSGRestrictCreate(); hypre_SparseMSGRestrictSetup(restrictx_a[fi], RTx_a[lx], r_a[fi], b_a[ci], cindex, findex, stride, stridePR); } } } /* set up y-transfer routines */ for (ly = 0; ly < (num_grids[1] - 1); ly++) { hypre_SparseMSGSetCIndex(1, cindex); hypre_SparseMSGSetFIndex(1, findex); hypre_SparseMSGSetStride(1, stride); for (lz = 0; lz < num_grids[2]; lz++) { for (lx = 0; lx < num_grids[0]; lx++) { hypre_SparseMSGMapIndex(lx, ly, lz, num_grids, fi); hypre_SparseMSGMapIndex(lx, ly + 1, lz, num_grids, ci); hypre_SetIndex3(stridePR, hypre_pow2(lx), 1, hypre_pow2(lz)); interpy_a[fi] = hypre_SparseMSGInterpCreate(); hypre_SparseMSGInterpSetup(interpy_a[fi], Py_a[ly], x_a[ci], e_a[fi], cindex, findex, stride, stridePR); restricty_a[fi] = hypre_SparseMSGRestrictCreate(); hypre_SparseMSGRestrictSetup(restricty_a[fi], RTy_a[ly], r_a[fi], b_a[ci], cindex, findex, stride, stridePR); } } } /* set up z-transfer routines */ for (lz = 0; lz < (num_grids[2] - 1); lz++) { hypre_SparseMSGSetCIndex(2, cindex); hypre_SparseMSGSetFIndex(2, findex); hypre_SparseMSGSetStride(2, stride); for (ly = 0; ly < num_grids[1]; ly++) { for (lx = 0; lx < num_grids[0]; lx++) { hypre_SparseMSGMapIndex(lx, ly, lz, num_grids, fi); hypre_SparseMSGMapIndex(lx, ly, lz + 1, num_grids, ci); hypre_SetIndex3(stridePR, hypre_pow2(lx), hypre_pow2(ly), 1); interpz_a[fi] = hypre_SparseMSGInterpCreate(); hypre_SparseMSGInterpSetup(interpz_a[fi], Pz_a[lz], x_a[ci], e_a[fi], cindex, findex, stride, stridePR); restrictz_a[fi] = hypre_SparseMSGRestrictCreate(); hypre_SparseMSGRestrictSetup(restrictz_a[fi], RTz_a[lz], r_a[fi], b_a[ci], cindex, findex, stride, stridePR); } } } /* set up fine grid relaxation */ relax_a[0] = hypre_PFMGRelaxCreate(comm); hypre_PFMGRelaxSetTol(relax_a[0], 0.0); hypre_PFMGRelaxSetType(relax_a[0], relax_type); if (usr_jacobi_weight) { hypre_PFMGRelaxSetJacobiWeight(relax_a[0], jacobi_weight); } hypre_PFMGRelaxSetTempVec(relax_a[0], t_a[0]); hypre_PFMGRelaxSetup(relax_a[0], A_a[0], b_a[0], x_a[0]); /* set up the fine grid residual routine */ matvec_a[0] = hypre_StructMatvecCreate(); hypre_StructMatvecSetup(matvec_a[0], A_a[0], x_a[0]); if (num_levels > 1) { for (lz = 0; lz < num_grids[2]; lz++) { for (ly = 0; ly < num_grids[1]; ly++) { for (lx = 0; lx < num_grids[0]; lx++) { l = lx + ly + lz; if ((l > jump) && (l < (num_levels - 1))) { hypre_SparseMSGMapIndex(lx, ly, lz, num_grids, fi); /* set up relaxation */ relax_a[fi] = hypre_PFMGRelaxCreate(comm); hypre_PFMGRelaxSetTol(relax_a[fi], 0.0); hypre_PFMGRelaxSetType(relax_a[fi], relax_type); if (usr_jacobi_weight) { hypre_PFMGRelaxSetJacobiWeight(relax_a[fi], jacobi_weight); } hypre_PFMGRelaxSetTempVec(relax_a[fi], t_a[fi]); hypre_PFMGRelaxSetup(relax_a[fi], A_a[fi], b_a[fi], x_a[fi]); /* set up the residual routine */ matvec_a[fi] = hypre_StructMatvecCreate(); hypre_StructMatvecSetup(matvec_a[fi], A_a[fi], x_a[fi]); } } } } /* set up coarsest grid relaxation */ fi = num_all_grids - 1; relax_a[fi] = hypre_PFMGRelaxCreate(comm); hypre_PFMGRelaxSetTol(relax_a[fi], 0.0); hypre_PFMGRelaxSetMaxIter(relax_a[fi], 1); hypre_PFMGRelaxSetType(relax_a[fi], 0); if (usr_jacobi_weight) { hypre_PFMGRelaxSetJacobiWeight(relax_a[fi], jacobi_weight); } hypre_PFMGRelaxSetTempVec(relax_a[fi], t_a[fi]); hypre_PFMGRelaxSetup(relax_a[fi], A_a[fi], b_a[fi], x_a[fi]); } (smsg_data -> relax_array) = relax_a; (smsg_data -> matvec_array) = matvec_a; (smsg_data -> restrictx_array) = restrictx_a; (smsg_data -> restricty_array) = restricty_a; (smsg_data -> restrictz_array) = restrictz_a; (smsg_data -> interpx_array) = interpx_a; (smsg_data -> interpy_array) = interpy_a; (smsg_data -> interpz_array) = interpz_a; /*----------------------------------------------------- * Allocate space for log info *-----------------------------------------------------*/ if ((smsg_data -> logging) > 0) { max_iter = (smsg_data -> max_iter); (smsg_data -> norms) = hypre_TAlloc(HYPRE_Real, max_iter, HYPRE_MEMORY_HOST); (smsg_data -> rel_norms) = hypre_TAlloc(HYPRE_Real, max_iter, HYPRE_MEMORY_HOST); } #if DEBUG for (lz = 0; lz < num_grids[2]; lz++) { for (ly = 0; ly < num_grids[1]; ly++) { for (lx = 0; lx < num_grids[0]; lx++) { l = lx + ly + lz; if ((l == 0) || (l > jump)) { hypre_SparseMSGMapIndex(lx, ly, lz, num_grids, fi); hypre_sprintf(filename, "zoutSMSG_A.%d.%d.%d", lx, ly, lz); hypre_StructMatrixPrint(filename, A_a[fi], 0); hypre_sprintf(filename, "zoutSMSG_visitx.%d.%d.%d", lx, ly, lz); hypre_StructVectorPrint(filename, visitx_a[fi], 0); hypre_sprintf(filename, "zoutSMSG_visity.%d.%d.%d", lx, ly, lz); hypre_StructVectorPrint(filename, visity_a[fi], 0); hypre_sprintf(filename, "zoutSMSG_visitz.%d.%d.%d", lx, ly, lz); hypre_StructVectorPrint(filename, visitz_a[fi], 0); } } } } for (lx = 0; lx < num_grids[0] - 1; lx++) { hypre_sprintf(filename, "zoutSMSG_Px.%d", lx); hypre_StructMatrixPrint(filename, Px_a[lx], 0); } for (ly = 0; ly < num_grids[1] - 1; ly++) { hypre_sprintf(filename, "zoutSMSG_Py.%d", ly); hypre_StructMatrixPrint(filename, Py_a[ly], 0); } for (lz = 0; lz < num_grids[2] - 1; lz++) { hypre_sprintf(filename, "zoutSMSG_Pz.%d", lz); hypre_StructMatrixPrint(filename, Pz_a[lz], 0); } #endif return ierr; } hypre-2.33.0/src/struct_ls/sparse_msg_setup_rap.c000066400000000000000000000101131477326011500221320ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * *****************************************************************************/ #include "_hypre_struct_ls.h" /*-------------------------------------------------------------------------- * hypre_SparseMSGCreateRAPOp * * Wrapper for 2 and 3d CreateRAPOp routines which set up new coarse * grid structures. *--------------------------------------------------------------------------*/ hypre_StructMatrix * hypre_SparseMSGCreateRAPOp( hypre_StructMatrix *R, hypre_StructMatrix *A, hypre_StructMatrix *P, hypre_StructGrid *coarse_grid, HYPRE_Int cdir ) { hypre_StructMatrix *RAP = NULL; hypre_StructStencil *stencil; stencil = hypre_StructMatrixStencil(A); switch (hypre_StructStencilNDim(stencil)) { case 2: RAP = hypre_SparseMSG2CreateRAPOp(R, A, P, coarse_grid, cdir); break; case 3: RAP = hypre_SparseMSG3CreateRAPOp(R, A, P, coarse_grid, cdir); break; } return RAP; } /*-------------------------------------------------------------------------- * hypre_SparseMSGSetupRAPOp * * Wrapper for 2 and 3d, symmetric and non-symmetric routines to calculate * entries in RAP. Incomplete error handling at the moment. *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SparseMSGSetupRAPOp( hypre_StructMatrix *R, hypre_StructMatrix *A, hypre_StructMatrix *P, HYPRE_Int cdir, hypre_Index cindex, hypre_Index cstride, hypre_Index stridePR, hypre_StructMatrix *Ac ) { HYPRE_Int ierr = 0; hypre_StructStencil *stencil; stencil = hypre_StructMatrixStencil(A); switch (hypre_StructStencilNDim(stencil)) { case 2: /*-------------------------------------------------------------------- * Set lower triangular (+ diagonal) coefficients *--------------------------------------------------------------------*/ ierr = hypre_SparseMSG2BuildRAPSym(A, P, R, cdir, cindex, cstride, stridePR, Ac); /*-------------------------------------------------------------------- * For non-symmetric A, set upper triangular coefficients as well *--------------------------------------------------------------------*/ if (!hypre_StructMatrixSymmetric(A)) ierr += hypre_SparseMSG2BuildRAPNoSym(A, P, R, cdir, cindex, cstride, stridePR, Ac); break; case 3: /*-------------------------------------------------------------------- * Set lower triangular (+ diagonal) coefficients *--------------------------------------------------------------------*/ ierr = hypre_SparseMSG3BuildRAPSym(A, P, R, cdir, cindex, cstride, stridePR, Ac); /*-------------------------------------------------------------------- * For non-symmetric A, set upper triangular coefficients as well *--------------------------------------------------------------------*/ if (!hypre_StructMatrixSymmetric(A)) ierr += hypre_SparseMSG3BuildRAPNoSym(A, P, R, cdir, cindex, cstride, stridePR, Ac); break; } hypre_StructMatrixAssemble(Ac); return ierr; } hypre-2.33.0/src/struct_ls/sparse_msg_solve.c000066400000000000000000000437441477326011500213000ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * *****************************************************************************/ #include "_hypre_struct_ls.h" #include "sparse_msg.h" #define DEBUG 0 /*-------------------------------------------------------------------------- * hypre_SparseMSGSolve *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SparseMSGSolve( void *smsg_vdata, hypre_StructMatrix *A, hypre_StructVector *b, hypre_StructVector *x ) { hypre_SparseMSGData *smsg_data = (hypre_SparseMSGData *)smsg_vdata; HYPRE_Real tol = (smsg_data -> tol); HYPRE_Int max_iter = (smsg_data -> max_iter); HYPRE_Int rel_change = (smsg_data -> rel_change); HYPRE_Int zero_guess = (smsg_data -> zero_guess); HYPRE_Int jump = (smsg_data -> jump); HYPRE_Int num_pre_relax = (smsg_data -> num_pre_relax); HYPRE_Int num_post_relax = (smsg_data -> num_post_relax); HYPRE_Int num_fine_relax = (smsg_data -> num_fine_relax); HYPRE_Int *num_grids = (smsg_data -> num_grids); HYPRE_Int num_all_grids = (smsg_data -> num_all_grids); HYPRE_Int num_levels = (smsg_data -> num_levels); hypre_StructMatrix **A_array = (smsg_data -> A_array); hypre_StructMatrix **Px_array = (smsg_data -> Px_array); hypre_StructMatrix **Py_array = (smsg_data -> Py_array); hypre_StructMatrix **Pz_array = (smsg_data -> Pz_array); hypre_StructMatrix **RTx_array = (smsg_data -> RTx_array); hypre_StructMatrix **RTy_array = (smsg_data -> RTy_array); hypre_StructMatrix **RTz_array = (smsg_data -> RTz_array); hypre_StructVector **b_array = (smsg_data -> b_array); hypre_StructVector **x_array = (smsg_data -> x_array); hypre_StructVector **t_array = (smsg_data -> t_array); hypre_StructVector **r_array = (smsg_data -> r_array); hypre_StructVector **e_array = (smsg_data -> e_array); hypre_StructVector **visitx_array = (smsg_data -> visitx_array); hypre_StructVector **visity_array = (smsg_data -> visity_array); hypre_StructVector **visitz_array = (smsg_data -> visitz_array); HYPRE_Int *grid_on = (smsg_data -> grid_on); void **relax_array = (smsg_data -> relax_array); void **matvec_array = (smsg_data -> matvec_array); void **restrictx_array = (smsg_data -> restrictx_array); void **restricty_array = (smsg_data -> restricty_array); void **restrictz_array = (smsg_data -> restrictz_array); void **interpx_array = (smsg_data -> interpx_array); void **interpy_array = (smsg_data -> interpy_array); void **interpz_array = (smsg_data -> interpz_array); HYPRE_Int logging = (smsg_data -> logging); HYPRE_Real *norms = (smsg_data -> norms); HYPRE_Real *rel_norms = (smsg_data -> rel_norms); HYPRE_Int *restrict_count; HYPRE_Real b_dot_b = 0.0, r_dot_r, eps = 0.0; HYPRE_Real e_dot_e = 1.0, x_dot_x = 1.0; HYPRE_Int i, l, lx, ly, lz; HYPRE_Int lymin, lymax, lzmin, lzmax; HYPRE_Int fi, ci; HYPRE_Int ierr = 0; #if DEBUG char filename[255]; #endif /*----------------------------------------------------- * Initialize some things and deal with special cases *-----------------------------------------------------*/ hypre_BeginTiming(smsg_data -> time_index); hypre_StructMatrixDestroy(A_array[0]); hypre_StructVectorDestroy(b_array[0]); hypre_StructVectorDestroy(x_array[0]); A_array[0] = hypre_StructMatrixRef(A); b_array[0] = hypre_StructVectorRef(b); x_array[0] = hypre_StructVectorRef(x); (smsg_data -> num_iterations) = 0; /* if max_iter is zero, return */ if (max_iter == 0) { /* if using a zero initial guess, return zero */ if (zero_guess) { hypre_StructVectorSetConstantValues(x, 0.0); } hypre_EndTiming(smsg_data -> time_index); return ierr; } /* part of convergence check */ if (tol > 0.0) { /* eps = (tol^2) */ b_dot_b = hypre_StructInnerProd(b_array[0], b_array[0]); eps = tol * tol; /* if rhs is zero, return a zero solution */ if (b_dot_b == 0.0) { hypre_StructVectorSetConstantValues(x, 0.0); if (logging > 0) { norms[0] = 0.0; rel_norms[0] = 0.0; } hypre_EndTiming(smsg_data -> time_index); return ierr; } } restrict_count = hypre_TAlloc(HYPRE_Int, num_all_grids, HYPRE_MEMORY_HOST); /*----------------------------------------------------- * Do V-cycles: * For each index l, "fine" = l, "coarse" = (l+1) *-----------------------------------------------------*/ for (i = 0; i < max_iter; i++) { /*-------------------------------------------------- * Down cycle: * Note that r = b = x through the jump region *--------------------------------------------------*/ /* fine grid pre-relaxation */ hypre_PFMGRelaxSetPreRelax(relax_array[0]); hypre_PFMGRelaxSetMaxIter(relax_array[0], num_fine_relax); hypre_PFMGRelaxSetZeroGuess(relax_array[0], zero_guess); hypre_PFMGRelax(relax_array[0], A_array[0], b_array[0], x_array[0]); zero_guess = 0; /* compute fine grid residual (b - Ax) */ hypre_StructCopy(b_array[0], r_array[0]); hypre_StructMatvecCompute(matvec_array[0], -1.0, A_array[0], x_array[0], 1.0, r_array[0]); /* convergence check */ if (tol > 0.0) { r_dot_r = hypre_StructInnerProd(r_array[0], r_array[0]); if (logging > 0) { norms[i] = hypre_sqrt(r_dot_r); if (b_dot_b > 0.0) { rel_norms[i] = hypre_sqrt(r_dot_r / b_dot_b); } else { rel_norms[i] = 0.0; } } /* RDF */ #if 0 hypre_printf("iter = %d, rel_norm = %e\n", i, rel_norms[i]); #endif /* always do at least 1 V-cycle */ if ((r_dot_r / b_dot_b < eps) && (i > 0)) { if (rel_change) { if ((e_dot_e / x_dot_x) < eps) { break; } } else { break; } } } if (num_levels > 1) { /* initialize restrict_count */ for (fi = 0; fi < num_all_grids; fi++) { restrict_count[fi] = 0; } for (l = 0; l <= (num_levels - 2); l++) { lzmin = hypre_max((l - num_grids[1] - num_grids[0] + 2), 0); lzmax = hypre_min((l), (num_grids[2] - 1)); for (lz = lzmin; lz <= lzmax; lz++) { lymin = hypre_max((l - lz - num_grids[0] + 1), 0); lymax = hypre_min((l - lz), (num_grids[1] - 1)); for (ly = lymin; ly <= lymax; ly++) { lx = l - lz - ly; hypre_SparseMSGMapIndex(lx, ly, lz, num_grids, fi); if (!grid_on[fi]) { break; } if (restrict_count[fi] > 1) { hypre_StructScale((1.0 / restrict_count[fi]), b_array[fi]); } if (l > jump) { /* pre-relaxation */ hypre_PFMGRelaxSetPreRelax(relax_array[fi]); hypre_PFMGRelaxSetMaxIter(relax_array[fi], num_pre_relax); hypre_PFMGRelaxSetZeroGuess(relax_array[fi], 1); hypre_PFMGRelax(relax_array[fi], A_array[fi], b_array[fi], x_array[fi]); /* compute residual (b - Ax) */ hypre_StructCopy(b_array[fi], r_array[fi]); hypre_StructMatvecCompute(matvec_array[fi], -1.0, A_array[fi], x_array[fi], 1.0, r_array[fi]); } if ((lx + 1) < num_grids[0]) { /* restrict to ((lx+1), ly, lz) */ hypre_SparseMSGMapIndex((lx + 1), ly, lz, num_grids, ci); if (grid_on[ci]) { if (restrict_count[ci]) { hypre_SparseMSGRestrict(restrictx_array[fi], RTx_array[lx], r_array[fi], t_array[ci]); hypre_StructAxpy(1.0, t_array[ci], b_array[ci]); } else { hypre_SparseMSGRestrict(restrictx_array[fi], RTx_array[lx], r_array[fi], b_array[ci]); } restrict_count[ci]++; } } if ((ly + 1) < num_grids[1]) { /* restrict to (lx, (ly+1), lz) */ hypre_SparseMSGMapIndex(lx, (ly + 1), lz, num_grids, ci); if (grid_on[ci]) { if (restrict_count[ci]) { hypre_SparseMSGRestrict(restricty_array[fi], RTy_array[ly], r_array[fi], t_array[ci]); hypre_StructAxpy(1.0, t_array[ci], b_array[ci]); } else { hypre_SparseMSGRestrict(restricty_array[fi], RTy_array[ly], r_array[fi], b_array[ci]); } restrict_count[ci]++; } } if ((lz + 1) < num_grids[2]) { /* restrict to (lx, ly, (lz+1)) */ hypre_SparseMSGMapIndex(lx, ly, (lz + 1), num_grids, ci); if (grid_on[ci]) { if (restrict_count[ci]) { hypre_SparseMSGRestrict(restrictz_array[fi], RTz_array[lz], r_array[fi], t_array[ci]); hypre_StructAxpy(1.0, t_array[ci], b_array[ci]); } else { hypre_SparseMSGRestrict(restrictz_array[fi], RTz_array[lz], r_array[fi], b_array[ci]); } restrict_count[ci]++; } } #if DEBUG hypre_sprintf(filename, "zoutSMSG_bdown.%d.%d.%d", lx, ly, lz); hypre_StructVectorPrint(filename, b_array[fi], 0); hypre_sprintf(filename, "zoutSMSG_xdown.%d.%d.%d", lx, ly, lz); hypre_StructVectorPrint(filename, x_array[fi], 0); hypre_sprintf(filename, "zoutSMSG_rdown.%d.%d.%d", lx, ly, lz); hypre_StructVectorPrint(filename, r_array[fi], 0); #endif } } } /*-------------------------------------------------- * Bottom *--------------------------------------------------*/ fi = num_all_grids - 1; if (restrict_count[fi] > 1) { hypre_StructScale((1.0 / restrict_count[fi]), b_array[fi]); } hypre_PFMGRelaxSetZeroGuess(relax_array[fi], 1); hypre_PFMGRelax(relax_array[fi], A_array[fi], b_array[fi], x_array[fi]); #if DEBUG hypre_sprintf(filename, "zoutSMSG_bbottom.%d.%d.%d", lx, ly, lz); hypre_StructVectorPrint(filename, b_array[fi], 0); hypre_sprintf(filename, "zoutSMSG_xbottom.%d.%d.%d", lx, ly, lz); hypre_StructVectorPrint(filename, x_array[fi], 0); #endif /*-------------------------------------------------- * Up cycle * Note that r = b = x through the jump region *--------------------------------------------------*/ for (l = (num_levels - 2); l >= 0; l--) { lzmin = hypre_max((l - num_grids[1] - num_grids[0] + 2), 0); lzmax = hypre_min((l), (num_grids[2] - 1)); for (lz = lzmax; lz >= lzmin; lz--) { lymin = hypre_max((l - lz - num_grids[0] + 1), 0); lymax = hypre_min((l - lz), (num_grids[1] - 1)); for (ly = lymax; ly >= lymin; ly--) { lx = l - lz - ly; hypre_SparseMSGMapIndex(lx, ly, lz, num_grids, fi); if (!grid_on[fi]) { break; } if ((l >= 1) && (l <= jump)) { hypre_StructVectorSetConstantValues(x_array[fi], 0.0); } if ((lx + 1) < num_grids[0]) { /* interpolate from ((lx+1), ly, lz) */ hypre_SparseMSGMapIndex((lx + 1), ly, lz, num_grids, ci); if (grid_on[ci]) { hypre_SparseMSGInterp(interpx_array[fi], Px_array[lx], x_array[ci], e_array[fi]); hypre_SparseMSGFilter(visitx_array[fi], e_array[fi], lx, ly, lz, jump); hypre_StructAxpy(1.0, e_array[fi], x_array[fi]); } } if ((ly + 1) < num_grids[1]) { /* interpolate from (lx, (ly+1), lz) */ hypre_SparseMSGMapIndex(lx, (ly + 1), lz, num_grids, ci); if (grid_on[ci]) { hypre_SparseMSGInterp(interpy_array[fi], Py_array[ly], x_array[ci], e_array[fi]); hypre_SparseMSGFilter(visity_array[fi], e_array[fi], lx, ly, lz, jump); hypre_StructAxpy(1.0, e_array[fi], x_array[fi]); } } if ((lz + 1) < num_grids[2]) { /* interpolate from (lx, ly, (lz+1)) */ hypre_SparseMSGMapIndex(lx, ly, (lz + 1), num_grids, ci); if (grid_on[ci]) { hypre_SparseMSGInterp(interpz_array[fi], Pz_array[lz], x_array[ci], e_array[fi]); hypre_SparseMSGFilter(visitz_array[fi], e_array[fi], lx, ly, lz, jump); hypre_StructAxpy(1.0, e_array[fi], x_array[fi]); } } #if DEBUG hypre_sprintf(filename, "zoutSMSG_xup.%d.%d.%d", lx, ly, lz); hypre_StructVectorPrint(filename, x_array[fi], 0); #endif if (l > jump) { /* post-relaxation */ hypre_PFMGRelaxSetPostRelax(relax_array[fi]); hypre_PFMGRelaxSetMaxIter(relax_array[fi], num_post_relax); hypre_PFMGRelaxSetZeroGuess(relax_array[fi], 0); hypre_PFMGRelax(relax_array[fi], A_array[fi], b_array[fi], x_array[fi]); } } } } } /* part of convergence check */ if ((tol > 0.0) && (rel_change)) { if (num_levels > 1) { e_dot_e = hypre_StructInnerProd(e_array[0], e_array[0]); x_dot_x = hypre_StructInnerProd(x_array[0], x_array[0]); } else { e_dot_e = 0.0; x_dot_x = 1.0; } } /* fine grid post-relaxation */ hypre_PFMGRelaxSetPostRelax(relax_array[0]); hypre_PFMGRelaxSetMaxIter(relax_array[0], num_fine_relax); hypre_PFMGRelaxSetZeroGuess(relax_array[0], 0); hypre_PFMGRelax(relax_array[0], A_array[0], b_array[0], x_array[0]); (smsg_data -> num_iterations) = (i + 1); } hypre_EndTiming(smsg_data -> time_index); return ierr; } hypre-2.33.0/src/struct_mv/000077500000000000000000000000001477326011500155515ustar00rootroot00000000000000hypre-2.33.0/src/struct_mv/CMakeLists.txt000066400000000000000000000024351477326011500203150ustar00rootroot00000000000000# Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) set(HDRS HYPRE_struct_mv.h _hypre_struct_mv.h ) set(SRCS assumed_part.c box_algebra.c box_boundary.c box.c box_manager.c communication_info.c computation.c F90_HYPRE_struct_grid.c F90_HYPRE_struct_matrix.c F90_HYPRE_struct_stencil.c F90_HYPRE_struct_vector.c HYPRE_struct_grid.c HYPRE_struct_matrix.c HYPRE_struct_stencil.c HYPRE_struct_vector.c project.c struct_axpy.c struct_communication.c struct_copy.c struct_grid.c struct_innerprod.c struct_io.c struct_matrix.c struct_matrix_mask.c struct_matvec.c struct_scale.c struct_stencil.c struct_vector.c ) target_sources(${PROJECT_NAME} PRIVATE ${SRCS} ${HDRS} ) if (HYPRE_USING_GPU) set(GPU_SRCS struct_axpy.c struct_communication.c struct_copy.c struct_innerprod.c struct_matrix.c struct_matvec.c struct_scale.c struct_vector.c ) convert_filenames_to_full_paths(GPU_SRCS) set(HYPRE_GPU_SOURCES ${HYPRE_GPU_SOURCES} ${GPU_SRCS} PARENT_SCOPE) endif () convert_filenames_to_full_paths(HDRS) set(HYPRE_HEADERS ${HYPRE_HEADERS} ${HDRS} PARENT_SCOPE) hypre-2.33.0/src/struct_mv/F90_HYPRE_struct_grid.c000066400000000000000000000073251477326011500216420ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * HYPRE_StructGrid interface * *****************************************************************************/ #include "_hypre_struct_mv.h" #include "fortran.h" #ifdef __cplusplus extern "C" { #endif /*-------------------------------------------------------------------------- * HYPRE_StructGridCreate *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_structgridcreate, HYPRE_STRUCTGRIDCREATE) ( hypre_F90_Comm *comm, hypre_F90_Int *dim, hypre_F90_Obj *grid, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_StructGridCreate( hypre_F90_PassComm (comm), hypre_F90_PassInt (dim), hypre_F90_PassObjRef (HYPRE_StructGrid, grid) ) ); } /*-------------------------------------------------------------------------- * HYPRE_StructGridDestroy *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_structgriddestroy, HYPRE_STRUCTGRIDDESTROY) ( hypre_F90_Obj *grid, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_StructGridDestroy( hypre_F90_PassObj (HYPRE_StructGrid, grid) ) ); } /*-------------------------------------------------------------------------- * HYPRE_StructGridSetExtents *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_structgridsetextents, HYPRE_STRUCTGRIDSETEXTENTS) ( hypre_F90_Obj *grid, hypre_F90_IntArray *ilower, hypre_F90_IntArray *iupper, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_StructGridSetExtents( hypre_F90_PassObj (HYPRE_StructGrid, grid), hypre_F90_PassIntArray (ilower), hypre_F90_PassIntArray (iupper) ) ); } /*-------------------------------------------------------------------------- * HYPRE_SetStructGridPeriodicity *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_structgridsetperiodic, HYPRE_STRUCTGRIDSETPERIODIC) ( hypre_F90_Obj *grid, hypre_F90_IntArray *periodic, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) ( HYPRE_StructGridSetPeriodic( hypre_F90_PassObj (HYPRE_StructGrid, grid), hypre_F90_PassIntArray (periodic)) ); } /*-------------------------------------------------------------------------- * HYPRE_StructGridAssemble *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_structgridassemble, HYPRE_STRUCTGRIDASSEMBLE) ( hypre_F90_Obj *grid, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_StructGridAssemble( hypre_F90_PassObj (HYPRE_StructGrid, grid)) ); } /*-------------------------------------------------------------------------- * HYPRE_StructGridSetNumGhost *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_structgridsetnumghost, HYPRE_STRUCTGRIDSETNUMGHOST) ( hypre_F90_Obj *grid, hypre_F90_IntArray *num_ghost, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_StructGridSetNumGhost( hypre_F90_PassObj (HYPRE_StructGrid, grid), hypre_F90_PassIntArray (num_ghost)) ); } #ifdef __cplusplus } #endif hypre-2.33.0/src/struct_mv/F90_HYPRE_struct_matrix.c000066400000000000000000000274011477326011500222160ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * HYPRE_StructMatrix interface * *****************************************************************************/ #include "_hypre_struct_mv.h" #include "fortran.h" #ifdef __cplusplus extern "C" { #endif /*-------------------------------------------------------------------------- * HYPRE_StructMatrixCreate *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_structmatrixcreate, HYPRE_STRUCTMATRIXCREATE) (hypre_F90_Comm *comm, hypre_F90_Obj *grid, hypre_F90_Obj *stencil, hypre_F90_Obj *matrix, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) HYPRE_StructMatrixCreate( hypre_F90_PassComm (comm), hypre_F90_PassObj (HYPRE_StructGrid, grid), hypre_F90_PassObj (HYPRE_StructStencil, stencil), hypre_F90_PassObjRef (HYPRE_StructMatrix, matrix) ); } /*-------------------------------------------------------------------------- * HYPRE_StructMatrixDestroy *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_structmatrixdestroy, HYPRE_STRUCTMATRIXDESTROY) ( hypre_F90_Obj *matrix, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) HYPRE_StructMatrixDestroy( hypre_F90_PassObj (HYPRE_StructMatrix, matrix) ); } /*-------------------------------------------------------------------------- * HYPRE_StructMatrixInitialize *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_structmatrixinitialize, HYPRE_STRUCTMATRIXINITIALIZE) ( hypre_F90_Obj *matrix, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) HYPRE_StructMatrixInitialize( hypre_F90_PassObj (HYPRE_StructMatrix, matrix) ); } /*-------------------------------------------------------------------------- * HYPRE_StructMatrixSetValues *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_structmatrixsetvalues, HYPRE_STRUCTMATRIXSETVALUES) ( hypre_F90_Obj *matrix, hypre_F90_IntArray *grid_index, hypre_F90_Int *num_stencil_indices, hypre_F90_IntArray *stencil_indices, hypre_F90_ComplexArray *values, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) HYPRE_StructMatrixSetValues( hypre_F90_PassObj (HYPRE_StructMatrix, matrix), hypre_F90_PassIntArray (grid_index), hypre_F90_PassInt (num_stencil_indices), hypre_F90_PassIntArray (stencil_indices), hypre_F90_PassComplexArray (values) ); } /*-------------------------------------------------------------------------- * HYPRE_StructMatrixSetBoxValues *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_structmatrixsetboxvalues, HYPRE_STRUCTMATRIXSETBOXVALUES) ( hypre_F90_Obj *matrix, hypre_F90_IntArray *ilower, hypre_F90_IntArray *iupper, hypre_F90_Int *num_stencil_indices, hypre_F90_IntArray *stencil_indices, hypre_F90_ComplexArray *values, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) HYPRE_StructMatrixSetBoxValues( hypre_F90_PassObj (HYPRE_StructMatrix, matrix), hypre_F90_PassIntArray (ilower), hypre_F90_PassIntArray (iupper), hypre_F90_PassInt (num_stencil_indices), hypre_F90_PassIntArray (stencil_indices), hypre_F90_PassComplexArray (values) ); } /*-------------------------------------------------------------------------- * HYPRE_StructMatrixGetBoxValues *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_structmatrixgetboxvalues, HYPRE_STRUCTMATRIXGETBOXVALUES) ( hypre_F90_Obj *matrix, hypre_F90_IntArray *ilower, hypre_F90_IntArray *iupper, hypre_F90_Int *num_stencil_indices, hypre_F90_IntArray *stencil_indices, hypre_F90_ComplexArray *values, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) HYPRE_StructMatrixGetBoxValues( hypre_F90_PassObj (HYPRE_StructMatrix, matrix), hypre_F90_PassIntArray (ilower), hypre_F90_PassIntArray (iupper), hypre_F90_PassInt (num_stencil_indices), hypre_F90_PassIntArray (stencil_indices), hypre_F90_PassComplexArray (values) ); } /*-------------------------------------------------------------------------- * HYPRE_StructMatrixSetConstantValues *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_structmatrixsetconstantva, HYPRE_STRUCTMATRIXSETCONSTANTVA) ( hypre_F90_Obj *matrix, hypre_F90_Int *num_stencil_indices, hypre_F90_IntArray *stencil_indices, hypre_F90_ComplexArray *values, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) HYPRE_StructMatrixSetConstantValues( hypre_F90_PassObj (HYPRE_StructMatrix, matrix), hypre_F90_PassInt (num_stencil_indices), hypre_F90_PassIntArray (stencil_indices), hypre_F90_PassComplexArray (values) ); } /*-------------------------------------------------------------------------- * HYPRE_StructMatrixAddToValues *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_structmatrixaddtovalues, HYPRE_STRUCTMATRIXADDTOVALUES) ( hypre_F90_Obj *matrix, hypre_F90_IntArray *grid_index, hypre_F90_Int *num_stencil_indices, hypre_F90_IntArray *stencil_indices, hypre_F90_ComplexArray *values, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) HYPRE_StructMatrixAddToValues( hypre_F90_PassObj (HYPRE_StructMatrix, matrix), hypre_F90_PassIntArray (grid_index), hypre_F90_PassInt (num_stencil_indices), hypre_F90_PassIntArray (stencil_indices), hypre_F90_PassComplexArray (values) ); } /*-------------------------------------------------------------------------- * HYPRE_StructMatrixAddToBoxValues *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_structmatrixaddtoboxvalues, HYPRE_STRUCTMATRIXADDTOBOXVALUES) ( hypre_F90_Obj *matrix, hypre_F90_IntArray *ilower, hypre_F90_IntArray *iupper, hypre_F90_Int *num_stencil_indices, hypre_F90_IntArray *stencil_indices, hypre_F90_ComplexArray *values, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) HYPRE_StructMatrixAddToBoxValues( hypre_F90_PassObj (HYPRE_StructMatrix, matrix), hypre_F90_PassIntArray (ilower), hypre_F90_PassIntArray (iupper), hypre_F90_PassInt (num_stencil_indices), hypre_F90_PassIntArray (stencil_indices), hypre_F90_PassComplexArray (values) ); } /*-------------------------------------------------------------------------- * HYPRE_StructMatrixAddToConstantValues *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_structmatrixaddtoconstant, HYPRE_STRUCTMATRIXADDTOCONSTANT) ( hypre_F90_Obj *matrix, hypre_F90_Int *num_stencil_indices, hypre_F90_IntArray *stencil_indices, hypre_F90_ComplexArray *values, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) HYPRE_StructMatrixSetConstantValues( hypre_F90_PassObj (HYPRE_StructMatrix, matrix), hypre_F90_PassInt (num_stencil_indices), hypre_F90_PassIntArray (stencil_indices), hypre_F90_PassComplexArray (values) ); } /*-------------------------------------------------------------------------- * HYPRE_StructMatrixAssemble *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_structmatrixassemble, HYPRE_STRUCTMATRIXASSEMBLE) ( hypre_F90_Obj *matrix, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) HYPRE_StructMatrixAssemble( hypre_F90_PassObj (HYPRE_StructMatrix, matrix) ); } /*-------------------------------------------------------------------------- * HYPRE_StructMatrixSetNumGhost *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_structmatrixsetnumghost, HYPRE_STRUCTMATRIXSETNUMGHOST) ( hypre_F90_Obj *matrix, hypre_F90_IntArray *num_ghost, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) HYPRE_StructMatrixSetNumGhost( hypre_F90_PassObj (HYPRE_StructMatrix, matrix), hypre_F90_PassIntArray (num_ghost) ); } /*-------------------------------------------------------------------------- * HYPRE_StructMatrixGetGrid *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_structmatrixgetgrid, HYPRE_STRUCTMATRIXGETGRID) ( hypre_F90_Obj *matrix, hypre_F90_Obj *grid, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) HYPRE_StructMatrixGetGrid( hypre_F90_PassObj (HYPRE_StructMatrix, matrix), hypre_F90_PassObjRef (HYPRE_StructGrid, grid) ); } /*-------------------------------------------------------------------------- * HYPRE_StructMatrixSetSymmetric *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_structmatrixsetsymmetric, HYPRE_STRUCTMATRIXSETSYMMETRIC) ( hypre_F90_Obj *matrix, hypre_F90_Int *symmetric, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) HYPRE_StructMatrixSetSymmetric( hypre_F90_PassObj (HYPRE_StructMatrix, matrix), hypre_F90_PassInt (symmetric) ); } /*-------------------------------------------------------------------------- * HYPRE_StructMatrixSetConstantEntries *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_structmatrixsetconstanten, HYPRE_STRUCTMATRIXSETCONSTANTEN) ( hypre_F90_Obj *matrix, hypre_F90_Int *nentries, hypre_F90_IntArray *entries, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) HYPRE_StructMatrixSetConstantEntries( hypre_F90_PassObj (HYPRE_StructMatrix, matrix), hypre_F90_PassInt (nentries), hypre_F90_PassIntArray (entries) ); } /*-------------------------------------------------------------------------- * HYPRE_StructMatrixPrint *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_structmatrixprint, HYPRE_STRUCTMATRIXPRINT) ( hypre_F90_Obj *matrix, hypre_F90_Int *all, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) HYPRE_StructMatrixPrint( "HYPRE_StructMatrix.out", hypre_F90_PassObj (HYPRE_StructMatrix, matrix), hypre_F90_PassInt (all)); } /*-------------------------------------------------------------------------- * HYPRE_StructMatrixMatvec *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_structmatrixmatvec, HYPRE_STRUCTMATRIXMATVEC) ( hypre_F90_Complex *alpha, hypre_F90_Obj *A, hypre_F90_Obj *x, hypre_F90_Complex *beta, hypre_F90_Obj *y, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) HYPRE_StructMatrixMatvec( hypre_F90_PassComplex (alpha), hypre_F90_PassObj (HYPRE_StructMatrix, A), hypre_F90_PassObj (HYPRE_StructVector, x), hypre_F90_PassComplex (beta), hypre_F90_PassObj (HYPRE_StructVector, y) ); } #ifdef __cplusplus } #endif hypre-2.33.0/src/struct_mv/F90_HYPRE_struct_stencil.c000066400000000000000000000044141477326011500223520ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * HYPRE_StructStencil interface * *****************************************************************************/ #include "_hypre_struct_mv.h" #include "fortran.h" #ifdef __cplusplus extern "C" { #endif /*-------------------------------------------------------------------------- * HYPRE_StructStencilCreate *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_structstencilcreate, HYPRE_STRUCTSTENCILCREATE) ( hypre_F90_Int *dim, hypre_F90_Int *size, hypre_F90_Obj *stencil, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) HYPRE_StructStencilCreate( hypre_F90_PassInt (dim), hypre_F90_PassInt (size), hypre_F90_PassObjRef (HYPRE_StructStencil, stencil) ); } /*-------------------------------------------------------------------------- * HYPRE_StructStencilSetElement *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_structstencilsetelement, HYPRE_STRUCTSTENCILSETELEMENT) ( hypre_F90_Obj *stencil, hypre_F90_Int *element_index, hypre_F90_IntArray *offset, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) HYPRE_StructStencilSetElement( hypre_F90_PassObj (HYPRE_StructStencil, stencil), hypre_F90_PassInt (element_index), hypre_F90_PassIntArray (offset) ); } /*-------------------------------------------------------------------------- * HYPRE_StructStencilDestroy *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_structstencildestroy, HYPRE_STRUCTSTENCILDESTROY) ( hypre_F90_Obj *stencil, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) HYPRE_StructStencilDestroy( hypre_F90_PassObj (HYPRE_StructStencil, stencil) ); } #ifdef __cplusplus } #endif hypre-2.33.0/src/struct_mv/F90_HYPRE_struct_vector.c000066400000000000000000000257311477326011500222200ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * HYPRE_StructVector interface * *****************************************************************************/ #include "_hypre_struct_mv.h" #include "fortran.h" #ifdef __cplusplus extern "C" { #endif /*-------------------------------------------------------------------------- * HYPRE_StructVectorCreate *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_structvectorcreate, HYPRE_STRUCTVECTORCREATE) ( hypre_F90_Comm *comm, hypre_F90_Obj *grid, hypre_F90_Obj *vector, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_StructVectorCreate( hypre_F90_PassComm (comm), hypre_F90_PassObj (HYPRE_StructGrid, grid), hypre_F90_PassObjRef (HYPRE_StructVector, vector) ) ); } /*-------------------------------------------------------------------------- * HYPRE_StructVectorDestroy *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_structvectordestroy, HYPRE_STRUCTVECTORDESTROY) ( hypre_F90_Obj *vector, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_StructVectorDestroy( hypre_F90_PassObj (HYPRE_StructVector, vector) ) ); } /*-------------------------------------------------------------------------- * HYPRE_StructVectorInitialize *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_structvectorinitialize, HYPRE_STRUCTVECTORINITIALIZE) ( hypre_F90_Obj *vector, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_StructVectorInitialize( hypre_F90_PassObj (HYPRE_StructVector, vector) ) ); } /*-------------------------------------------------------------------------- * HYPRE_StructVectorSetValues *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_structvectorsetvalues, HYPRE_STRUCTVECTORSETVALUES) ( hypre_F90_Obj *vector, hypre_F90_IntArray *grid_index, hypre_F90_Complex *values, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_StructVectorSetValues( hypre_F90_PassObj (HYPRE_StructVector, vector), hypre_F90_PassIntArray (grid_index), hypre_F90_PassComplex (values) ) ); } /*-------------------------------------------------------------------------- * HYPRE_StructVectorSetBoxValues *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_structvectorsetboxvalues, HYPRE_STRUCTVECTORSETBOXVALUES) ( hypre_F90_Obj *vector, hypre_F90_IntArray *ilower, hypre_F90_IntArray *iupper, hypre_F90_ComplexArray *values, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_StructVectorSetBoxValues( hypre_F90_PassObj (HYPRE_StructVector, vector), hypre_F90_PassIntArray (ilower), hypre_F90_PassIntArray (iupper), hypre_F90_PassComplexArray (values) ) ); } /*-------------------------------------------------------------------------- * HYPRE_StructVectorAddToValues *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_structvectoraddtovalues, HYPRE_STRUCTVECTORADDTOVALUES) ( hypre_F90_Obj *vector, hypre_F90_IntArray *grid_index, hypre_F90_Complex *values, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_StructVectorAddToValues( hypre_F90_PassObj (HYPRE_StructVector, vector), hypre_F90_PassIntArray (grid_index), hypre_F90_PassComplex (values) ) ); } /*-------------------------------------------------------------------------- * HYPRE_StructVectorAddToBoxValues *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_structvectoraddtoboxvalue, HYPRE_STRUCTVECTORADDTOBOXVALUE) ( hypre_F90_Obj *vector, hypre_F90_IntArray *ilower, hypre_F90_IntArray *iupper, hypre_F90_ComplexArray *values, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_StructVectorAddToBoxValues( hypre_F90_PassObj (HYPRE_StructVector, vector), hypre_F90_PassIntArray (ilower), hypre_F90_PassIntArray (iupper), hypre_F90_PassComplexArray (values) ) ); } /*-------------------------------------------------------------------------- * HYPRE_StructVectorScaleValues *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_structvectorscalevalues, HYPRE_STRUCTVECTORSCALEVALUES) ( hypre_F90_Obj *vector, hypre_F90_Complex *factor, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_StructVectorScaleValues( hypre_F90_PassObj (HYPRE_StructVector, vector), hypre_F90_PassComplex (factor) ) ); } /*-------------------------------------------------------------------------- * HYPRE_StructVectorGetValues *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_structvectorgetvalues, HYPRE_STRUCTVECTORGETVALUES) ( hypre_F90_Obj *vector, hypre_F90_IntArray *grid_index, hypre_F90_Complex *values_ptr, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_StructVectorGetValues( hypre_F90_PassObj (HYPRE_StructVector, vector), hypre_F90_PassIntArray (grid_index), hypre_F90_PassComplexRef (values_ptr) ) ); } /*-------------------------------------------------------------------------- * HYPRE_StructVectorGetBoxValues *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_structvectorgetboxvalues, HYPRE_STRUCTVECTORGETBOXVALUES) ( hypre_F90_Obj *vector, hypre_F90_IntArray *ilower, hypre_F90_IntArray *iupper, hypre_F90_ComplexArray *values, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_StructVectorGetBoxValues( hypre_F90_PassObj (HYPRE_StructVector, vector), hypre_F90_PassIntArray (ilower), hypre_F90_PassIntArray (iupper), hypre_F90_PassComplexArray (values) ) ); } /*-------------------------------------------------------------------------- * HYPRE_StructVectorAssemble *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_structvectorassemble, HYPRE_STRUCTVECTORASSEMBLE) ( hypre_F90_Obj *vector, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_StructVectorAssemble( hypre_F90_PassObj (HYPRE_StructVector, vector) ) ); } /*-------------------------------------------------------------------------- * HYPRE_StructVectorSetNumGhost *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_structvectorsetnumghost, HYPRE_STRUCTVECTORSETNUMGHOST) ( hypre_F90_Obj *vector, hypre_F90_IntArray *num_ghost, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_StructVectorSetNumGhost( hypre_F90_PassObj (HYPRE_StructVector, vector), hypre_F90_PassIntArray (num_ghost) ) ); } /*-------------------------------------------------------------------------- * HYPRE_StructVectorCopy *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_structvectorcopy, HYPRE_STRUCTVECTORCOPY) ( hypre_F90_Obj *x, hypre_F90_Obj *y, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_StructVectorCopy( hypre_F90_PassObj (HYPRE_StructVector, x), hypre_F90_PassObj (HYPRE_StructVector, y) ) ); } /*-------------------------------------------------------------------------- * HYPRE_StructVectorSetConstantValues *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_structvectorsetconstantva, HYPRE_STRUCTVECTORSETCONSTANTVA) ( hypre_F90_Obj *vector, hypre_F90_Complex *values, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_StructVectorSetConstantValues( hypre_F90_PassObj (HYPRE_StructVector, vector), hypre_F90_PassComplex (values) ) ); } /*-------------------------------------------------------------------------- * HYPRE_StructVectorGetMigrateCommPkg *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_structvectorgetmigratecom, HYPRE_STRUCTVECTORGETMIGRATECOM) ( hypre_F90_Obj *from_vector, hypre_F90_Obj *to_vector, hypre_F90_Obj *comm_pkg, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_StructVectorGetMigrateCommPkg( hypre_F90_PassObj (HYPRE_StructVector, from_vector), hypre_F90_PassObj (HYPRE_StructVector, to_vector), hypre_F90_PassObjRef (HYPRE_CommPkg, comm_pkg) ) ); } /*-------------------------------------------------------------------------- * HYPRE_StructVectorMigrate *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_structvectormigrate, HYPRE_STRUCTVECTORMIGRATE) ( hypre_F90_Obj *comm_pkg, hypre_F90_Obj *from_vector, hypre_F90_Obj *to_vector, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_StructVectorMigrate( hypre_F90_PassObj (HYPRE_CommPkg, comm_pkg), hypre_F90_PassObj (HYPRE_StructVector, from_vector), hypre_F90_PassObj (HYPRE_StructVector, to_vector) ) ); } /*-------------------------------------------------------------------------- * HYPRE_CommPkgDestroy *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_destroycommpkg, HYPRE_DESTROYCOMMPKG) ( hypre_F90_Obj *comm_pkg, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_CommPkgDestroy( hypre_F90_PassObj (HYPRE_CommPkg, comm_pkg) ) ); } /*-------------------------------------------------------------------------- * HYPRE_StructVectorPrint *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_structvectorprint, HYPRE_STRUCTVECTORPRINT) ( hypre_F90_Obj *vector, hypre_F90_Int *all, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_StructVectorPrint( "HYPRE_StructVector.out", hypre_F90_PassObj (HYPRE_StructVector, vector), hypre_F90_PassInt (all)) ); } #ifdef __cplusplus } #endif hypre-2.33.0/src/struct_mv/HYPRE_struct_grid.c000066400000000000000000000070701477326011500212210ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * HYPRE_StructGrid interface * *****************************************************************************/ #include "_hypre_struct_mv.h" /*-------------------------------------------------------------------------- * HYPRE_StructGridCreate *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_StructGridCreate( MPI_Comm comm, HYPRE_Int dim, HYPRE_StructGrid *grid ) { hypre_StructGridCreate(comm, dim, grid); return hypre_error_flag; } /*-------------------------------------------------------------------------- * HYPRE_StructGridDestroy *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_StructGridDestroy( HYPRE_StructGrid grid ) { return ( hypre_StructGridDestroy(grid) ); } /*-------------------------------------------------------------------------- * HYPRE_StructGridSetExtents *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_StructGridSetExtents( HYPRE_StructGrid grid, HYPRE_Int *ilower, HYPRE_Int *iupper ) { hypre_Index new_ilower; hypre_Index new_iupper; HYPRE_Int d; hypre_SetIndex(new_ilower, 0); hypre_SetIndex(new_iupper, 0); for (d = 0; d < hypre_StructGridNDim((hypre_StructGrid *) grid); d++) { hypre_IndexD(new_ilower, d) = ilower[d]; hypre_IndexD(new_iupper, d) = iupper[d]; } return ( hypre_StructGridSetExtents(grid, new_ilower, new_iupper) ); } /*-------------------------------------------------------------------------- * HYPRE_SetStructGridPeriodicity *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_StructGridSetPeriodic( HYPRE_StructGrid grid, HYPRE_Int *periodic ) { hypre_Index new_periodic; HYPRE_Int d; hypre_SetIndex(new_periodic, 0); for (d = 0; d < hypre_StructGridNDim(grid); d++) { hypre_IndexD(new_periodic, d) = periodic[d]; } return ( hypre_StructGridSetPeriodic(grid, new_periodic) ); } /*-------------------------------------------------------------------------- * HYPRE_StructGridAssemble *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_StructGridAssemble( HYPRE_StructGrid grid ) { return ( hypre_StructGridAssemble(grid) ); } /*--------------------------------------------------------------------------- * GEC0902 * HYPRE_StructGridSetNumGhost * to set the numghost array inside the struct_grid_struct using an internal * function. This is just a wrapper. *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_StructGridSetNumGhost( HYPRE_StructGrid grid, HYPRE_Int *num_ghost ) { return ( hypre_StructGridSetNumGhost(grid, num_ghost) ); } #if 0 //defined(HYPRE_USING_CUDA) || defined(HYPRE_USING_HIP) HYPRE_Int HYPRE_StructGridSetDataLocation( HYPRE_StructGrid grid, HYPRE_MemoryLocation data_location ) { return ( hypre_StructGridSetDataLocation(grid, data_location) ); } #endif hypre-2.33.0/src/struct_mv/HYPRE_struct_matrix.c000066400000000000000000000402771477326011500216060ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * HYPRE_StructMatrix interface * *****************************************************************************/ #include "_hypre_struct_mv.h" /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_StructMatrixCreate( MPI_Comm comm, HYPRE_StructGrid grid, HYPRE_StructStencil stencil, HYPRE_StructMatrix *matrix ) { *matrix = hypre_StructMatrixCreate(comm, grid, stencil); return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_StructMatrixDestroy( HYPRE_StructMatrix matrix ) { return ( hypre_StructMatrixDestroy(matrix) ); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_StructMatrixInitialize( HYPRE_StructMatrix matrix ) { return ( hypre_StructMatrixInitialize(matrix) ); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_StructMatrixSetValues( HYPRE_StructMatrix matrix, HYPRE_Int *grid_index, HYPRE_Int num_stencil_indices, HYPRE_Int *stencil_indices, HYPRE_Complex *values ) { hypre_Index new_grid_index; HYPRE_Int d; hypre_SetIndex(new_grid_index, 0); for (d = 0; d < hypre_StructGridNDim(hypre_StructMatrixGrid(matrix)); d++) { hypre_IndexD(new_grid_index, d) = grid_index[d]; } hypre_StructMatrixSetValues(matrix, new_grid_index, num_stencil_indices, stencil_indices, values, 0, -1, 0); return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_StructMatrixGetValues( HYPRE_StructMatrix matrix, HYPRE_Int *grid_index, HYPRE_Int num_stencil_indices, HYPRE_Int *stencil_indices, HYPRE_Complex *values ) { hypre_Index new_grid_index; HYPRE_Int d; hypre_SetIndex(new_grid_index, 0); for (d = 0; d < hypre_StructGridNDim(hypre_StructMatrixGrid(matrix)); d++) { hypre_IndexD(new_grid_index, d) = grid_index[d]; } hypre_StructMatrixSetValues(matrix, new_grid_index, num_stencil_indices, stencil_indices, values, -1, -1, 0); return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_StructMatrixSetBoxValues( HYPRE_StructMatrix matrix, HYPRE_Int *ilower, HYPRE_Int *iupper, HYPRE_Int num_stencil_indices, HYPRE_Int *stencil_indices, HYPRE_Complex *values ) { HYPRE_StructMatrixSetBoxValues2(matrix, ilower, iupper, num_stencil_indices, stencil_indices, ilower, iupper, values); return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_StructMatrixGetBoxValues( HYPRE_StructMatrix matrix, HYPRE_Int *ilower, HYPRE_Int *iupper, HYPRE_Int num_stencil_indices, HYPRE_Int *stencil_indices, HYPRE_Complex *values ) { HYPRE_StructMatrixGetBoxValues2(matrix, ilower, iupper, num_stencil_indices, stencil_indices, ilower, iupper, values); return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_StructMatrixSetBoxValues2( HYPRE_StructMatrix matrix, HYPRE_Int *ilower, HYPRE_Int *iupper, HYPRE_Int num_stencil_indices, HYPRE_Int *stencil_indices, HYPRE_Int *vilower, HYPRE_Int *viupper, HYPRE_Complex *values ) { hypre_Box *set_box, *value_box; HYPRE_Int d; /* This creates boxes with zeroed-out extents */ set_box = hypre_BoxCreate(hypre_StructMatrixNDim(matrix)); value_box = hypre_BoxCreate(hypre_StructMatrixNDim(matrix)); for (d = 0; d < hypre_StructMatrixNDim(matrix); d++) { hypre_BoxIMinD(set_box, d) = ilower[d]; hypre_BoxIMaxD(set_box, d) = iupper[d]; hypre_BoxIMinD(value_box, d) = vilower[d]; hypre_BoxIMaxD(value_box, d) = viupper[d]; } hypre_StructMatrixSetBoxValues(matrix, set_box, value_box, num_stencil_indices, stencil_indices, values, 0, -1, 0); hypre_BoxDestroy(set_box); hypre_BoxDestroy(value_box); return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_StructMatrixGetBoxValues2( HYPRE_StructMatrix matrix, HYPRE_Int *ilower, HYPRE_Int *iupper, HYPRE_Int num_stencil_indices, HYPRE_Int *stencil_indices, HYPRE_Int *vilower, HYPRE_Int *viupper, HYPRE_Complex *values ) { hypre_Box *set_box, *value_box; HYPRE_Int d; /* This creates boxes with zeroed-out extents */ set_box = hypre_BoxCreate(hypre_StructMatrixNDim(matrix)); value_box = hypre_BoxCreate(hypre_StructMatrixNDim(matrix)); for (d = 0; d < hypre_StructMatrixNDim(matrix); d++) { hypre_BoxIMinD(set_box, d) = ilower[d]; hypre_BoxIMaxD(set_box, d) = iupper[d]; hypre_BoxIMinD(value_box, d) = vilower[d]; hypre_BoxIMaxD(value_box, d) = viupper[d]; } hypre_StructMatrixSetBoxValues(matrix, set_box, value_box, num_stencil_indices, stencil_indices, values, -1, -1, 0); hypre_BoxDestroy(set_box); hypre_BoxDestroy(value_box); return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_StructMatrixSetConstantValues( HYPRE_StructMatrix matrix, HYPRE_Int num_stencil_indices, HYPRE_Int *stencil_indices, HYPRE_Complex *values ) { return hypre_StructMatrixSetConstantValues( matrix, num_stencil_indices, stencil_indices, values, 0 ); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_StructMatrixAddToValues( HYPRE_StructMatrix matrix, HYPRE_Int *grid_index, HYPRE_Int num_stencil_indices, HYPRE_Int *stencil_indices, HYPRE_Complex *values ) { hypre_Index new_grid_index; HYPRE_Int d; hypre_SetIndex(new_grid_index, 0); for (d = 0; d < hypre_StructGridNDim(hypre_StructMatrixGrid(matrix)); d++) { hypre_IndexD(new_grid_index, d) = grid_index[d]; } hypre_StructMatrixSetValues(matrix, new_grid_index, num_stencil_indices, stencil_indices, values, 1, -1, 0); return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_StructMatrixAddToBoxValues( HYPRE_StructMatrix matrix, HYPRE_Int *ilower, HYPRE_Int *iupper, HYPRE_Int num_stencil_indices, HYPRE_Int *stencil_indices, HYPRE_Complex *values ) { HYPRE_StructMatrixAddToBoxValues2(matrix, ilower, iupper, num_stencil_indices, stencil_indices, ilower, iupper, values); return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_StructMatrixAddToBoxValues2( HYPRE_StructMatrix matrix, HYPRE_Int *ilower, HYPRE_Int *iupper, HYPRE_Int num_stencil_indices, HYPRE_Int *stencil_indices, HYPRE_Int *vilower, HYPRE_Int *viupper, HYPRE_Complex *values ) { hypre_Box *set_box, *value_box; HYPRE_Int d; /* This creates boxes with zeroed-out extents */ set_box = hypre_BoxCreate(hypre_StructMatrixNDim(matrix)); value_box = hypre_BoxCreate(hypre_StructMatrixNDim(matrix)); for (d = 0; d < hypre_StructMatrixNDim(matrix); d++) { hypre_BoxIMinD(set_box, d) = ilower[d]; hypre_BoxIMaxD(set_box, d) = iupper[d]; hypre_BoxIMinD(value_box, d) = vilower[d]; hypre_BoxIMaxD(value_box, d) = viupper[d]; } hypre_StructMatrixSetBoxValues(matrix, set_box, value_box, num_stencil_indices, stencil_indices, values, 1, -1, 0); hypre_BoxDestroy(set_box); hypre_BoxDestroy(value_box); return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_StructMatrixAddToConstantValues( HYPRE_StructMatrix matrix, HYPRE_Int num_stencil_indices, HYPRE_Int *stencil_indices, HYPRE_Complex *values ) { return hypre_StructMatrixSetConstantValues( matrix, num_stencil_indices, stencil_indices, values, 1 ); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_StructMatrixAssemble( HYPRE_StructMatrix matrix ) { return ( hypre_StructMatrixAssemble(matrix) ); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_StructMatrixSetNumGhost( HYPRE_StructMatrix matrix, HYPRE_Int *num_ghost ) { return ( hypre_StructMatrixSetNumGhost(matrix, num_ghost) ); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_StructMatrixGetGrid( HYPRE_StructMatrix matrix, HYPRE_StructGrid *grid ) { *grid = hypre_StructMatrixGrid(matrix); return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_StructMatrixSetSymmetric( HYPRE_StructMatrix matrix, HYPRE_Int symmetric ) { hypre_StructMatrixSymmetric(matrix) = symmetric; return hypre_error_flag; } /*-------------------------------------------------------------------------- * Call this function to declare that certain stencil points are constant * throughout the mesh. * - nentries is the number of array entries * - Each HYPRE_Int entries[i] is an index into the shape array of the stencil of the * matrix. * In the present version, only three possibilites are recognized: * - no entries constant (constant_coefficient==0) * - all entries constant (constant_coefficient==1) * - all but the diagonal entry constant (constant_coefficient==2) * If something else is attempted, this function will return a nonzero error. * In the present version, if this function is called more than once, only * the last call will take effect. *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_StructMatrixSetConstantEntries( HYPRE_StructMatrix matrix, HYPRE_Int nentries, HYPRE_Int *entries ) { return hypre_StructMatrixSetConstantEntries( matrix, nentries, entries ); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_StructMatrixPrint( const char *filename, HYPRE_StructMatrix matrix, HYPRE_Int all ) { return ( hypre_StructMatrixPrint(filename, matrix, all) ); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_StructMatrixRead( MPI_Comm comm, const char *filename, HYPRE_Int *num_ghost, HYPRE_StructMatrix *matrix ) { if (!matrix) { hypre_error_in_arg(4); return hypre_error_flag; } *matrix = (HYPRE_StructMatrix) hypre_StructMatrixRead(comm, filename, num_ghost); return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_StructMatrixMatvec( HYPRE_Complex alpha, HYPRE_StructMatrix A, HYPRE_StructVector x, HYPRE_Complex beta, HYPRE_StructVector y ) { return ( hypre_StructMatvec( alpha, (hypre_StructMatrix *) A, (hypre_StructVector *) x, beta, (hypre_StructVector *) y) ); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_StructMatrixClearBoundary( HYPRE_StructMatrix matrix ) { return ( hypre_StructMatrixClearBoundary(matrix) ); } hypre-2.33.0/src/struct_mv/HYPRE_struct_mv.h000066400000000000000000000533371477326011500207320ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #ifndef HYPRE_STRUCT_MV_HEADER #define HYPRE_STRUCT_MV_HEADER #include "HYPRE_utilities.h" #ifdef __cplusplus extern "C" { #endif /* forward declarations */ #ifndef HYPRE_StructVector_defined #define HYPRE_StructVector_defined struct hypre_StructVector_struct; typedef struct hypre_StructVector_struct *HYPRE_StructVector; #endif /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ /** * @defgroup StructSystemInterface Struct System Interface * * A structured-grid conceptual interface. This interface represents a * structured-grid conceptual view of a linear system. * * @{ **/ /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ /** * @name Struct Grids * * @{ **/ struct hypre_StructGrid_struct; /** * A grid object is constructed out of several "boxes", defined on a global * abstract index space. **/ typedef struct hypre_StructGrid_struct *HYPRE_StructGrid; /** * Create an ndim-dimensional grid object. **/ HYPRE_Int HYPRE_StructGridCreate(MPI_Comm comm, HYPRE_Int ndim, HYPRE_StructGrid *grid); /** * Destroy a grid object. An object should be explicitly destroyed using this * destructor when the user's code no longer needs direct access to it. Once * destroyed, the object must not be referenced again. Note that the object may * not be deallocated at the completion of this call, since there may be * internal package references to the object. The object will then be destroyed * when all internal reference counts go to zero. **/ HYPRE_Int HYPRE_StructGridDestroy(HYPRE_StructGrid grid); /** * Set the extents for a box on the grid. **/ HYPRE_Int HYPRE_StructGridSetExtents(HYPRE_StructGrid grid, HYPRE_Int *ilower, HYPRE_Int *iupper); /** * Finalize the construction of the grid before using. **/ HYPRE_Int HYPRE_StructGridAssemble(HYPRE_StructGrid grid); /** * Set the periodicity for the grid. * * The argument \e periodic is an ndim-dimensional integer array that * contains the periodicity for each dimension. A zero value for a dimension * means non-periodic, while a nonzero value means periodic and contains the * actual period. For example, periodicity in the first and third dimensions * for a 10x11x12 grid is indicated by the array [10,0,12]. * * NOTE: Some of the solvers in hypre have power-of-two restrictions on the size * of the periodic dimensions. **/ HYPRE_Int HYPRE_StructGridSetPeriodic(HYPRE_StructGrid grid, HYPRE_Int *periodic); /** * Set the ghost layer in the grid object **/ HYPRE_Int HYPRE_StructGridSetNumGhost(HYPRE_StructGrid grid, HYPRE_Int *num_ghost); /**@}*/ /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ /** * @name Struct Stencils * * @{ **/ struct hypre_StructStencil_struct; /** * The stencil object. **/ typedef struct hypre_StructStencil_struct *HYPRE_StructStencil; /** * Create a stencil object for the specified number of spatial dimensions and * stencil entries. **/ HYPRE_Int HYPRE_StructStencilCreate(HYPRE_Int ndim, HYPRE_Int size, HYPRE_StructStencil *stencil); /** * Destroy a stencil object. **/ HYPRE_Int HYPRE_StructStencilDestroy(HYPRE_StructStencil stencil); /** * Set a stencil entry. * * NOTE: The name of this routine will eventually be changed to \e * HYPRE\_StructStencilSetEntry. **/ HYPRE_Int HYPRE_StructStencilSetElement(HYPRE_StructStencil stencil, HYPRE_Int entry, HYPRE_Int *offset); /**@}*/ /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ /** * @name Struct Matrices * * @{ **/ struct hypre_StructMatrix_struct; /** * The matrix object. **/ typedef struct hypre_StructMatrix_struct *HYPRE_StructMatrix; /** * Create a matrix object. **/ HYPRE_Int HYPRE_StructMatrixCreate(MPI_Comm comm, HYPRE_StructGrid grid, HYPRE_StructStencil stencil, HYPRE_StructMatrix *matrix); /** * Destroy a matrix object. **/ HYPRE_Int HYPRE_StructMatrixDestroy(HYPRE_StructMatrix matrix); /** * Prepare a matrix object for setting coefficient values. **/ HYPRE_Int HYPRE_StructMatrixInitialize(HYPRE_StructMatrix matrix); /** * Set matrix coefficients index by index. The \e values array is of length * \e nentries. * * NOTE: For better efficiency, use \ref HYPRE_StructMatrixSetBoxValues to set * coefficients a box at a time. **/ HYPRE_Int HYPRE_StructMatrixSetValues(HYPRE_StructMatrix matrix, HYPRE_Int *index, HYPRE_Int nentries, HYPRE_Int *entries, HYPRE_Complex *values); /** * Add to matrix coefficients index by index. The \e values array is of * length \e nentries. * * NOTE: For better efficiency, use \ref HYPRE_StructMatrixAddToBoxValues to * set coefficients a box at a time. **/ HYPRE_Int HYPRE_StructMatrixAddToValues(HYPRE_StructMatrix matrix, HYPRE_Int *index, HYPRE_Int nentries, HYPRE_Int *entries, HYPRE_Complex *values); /** * Set matrix coefficients which are constant over the grid. The \e values * array is of length \e nentries. **/ HYPRE_Int HYPRE_StructMatrixSetConstantValues(HYPRE_StructMatrix matrix, HYPRE_Int nentries, HYPRE_Int *entries, HYPRE_Complex *values); /** * Add to matrix coefficients which are constant over the grid. The \e * values array is of length \e nentries. **/ HYPRE_Int HYPRE_StructMatrixAddToConstantValues(HYPRE_StructMatrix matrix, HYPRE_Int nentries, HYPRE_Int *entries, HYPRE_Complex *values); /** * Set matrix coefficients a box at a time. The data in \e values is ordered * as follows: * \verbatim m = 0; for (k = ilower[2]; k <= iupper[2]; k++) for (j = ilower[1]; j <= iupper[1]; j++) for (i = ilower[0]; i <= iupper[0]; i++) for (entry = 0; entry < nentries; entry++) { values[m] = ...; m++; } \endverbatim **/ HYPRE_Int HYPRE_StructMatrixSetBoxValues(HYPRE_StructMatrix matrix, HYPRE_Int *ilower, HYPRE_Int *iupper, HYPRE_Int nentries, HYPRE_Int *entries, HYPRE_Complex *values); /** * Add to matrix coefficients a box at a time. The data in \e values is * ordered as in \ref HYPRE_StructMatrixSetBoxValues. **/ HYPRE_Int HYPRE_StructMatrixAddToBoxValues(HYPRE_StructMatrix matrix, HYPRE_Int *ilower, HYPRE_Int *iupper, HYPRE_Int nentries, HYPRE_Int *entries, HYPRE_Complex *values); /** * Set matrix coefficients a box at a time. The \e values array is logically * box shaped with value-box extents \e vilower and \e viupper that must * contain the set-box extents \e ilower and \e iupper . The data in the * \e values array is ordered as in \ref HYPRE_StructMatrixSetBoxValues, but * based on the value-box extents. **/ HYPRE_Int HYPRE_StructMatrixSetBoxValues2(HYPRE_StructMatrix matrix, HYPRE_Int *ilower, HYPRE_Int *iupper, HYPRE_Int nentries, HYPRE_Int *entries, HYPRE_Int *vilower, HYPRE_Int *viupper, HYPRE_Complex *values); /** * Add to matrix coefficients a box at a time. The data in \e values is * ordered as in \ref HYPRE_StructMatrixSetBoxValues2. **/ HYPRE_Int HYPRE_StructMatrixAddToBoxValues2(HYPRE_StructMatrix matrix, HYPRE_Int *ilower, HYPRE_Int *iupper, HYPRE_Int nentries, HYPRE_Int *entries, HYPRE_Int *vilower, HYPRE_Int *viupper, HYPRE_Complex *values); /** * Finalize the construction of the matrix before using. **/ HYPRE_Int HYPRE_StructMatrixAssemble(HYPRE_StructMatrix matrix); /** * Get matrix coefficients index by index. The \e values array is of length * \e nentries. * * NOTE: For better efficiency, use \ref HYPRE_StructMatrixGetBoxValues to get * coefficients a box at a time. **/ HYPRE_Int HYPRE_StructMatrixGetValues(HYPRE_StructMatrix matrix, HYPRE_Int *index, HYPRE_Int nentries, HYPRE_Int *entries, HYPRE_Complex *values); /** * Get matrix coefficients a box at a time. The data in \e values is * ordered as in \ref HYPRE_StructMatrixSetBoxValues. **/ HYPRE_Int HYPRE_StructMatrixGetBoxValues(HYPRE_StructMatrix matrix, HYPRE_Int *ilower, HYPRE_Int *iupper, HYPRE_Int nentries, HYPRE_Int *entries, HYPRE_Complex *values); /** * Get matrix coefficients a box at a time. The data in \e values is * ordered as in \ref HYPRE_StructMatrixSetBoxValues2. **/ HYPRE_Int HYPRE_StructMatrixGetBoxValues2(HYPRE_StructMatrix matrix, HYPRE_Int *ilower, HYPRE_Int *iupper, HYPRE_Int nentries, HYPRE_Int *entries, HYPRE_Int *vilower, HYPRE_Int *viupper, HYPRE_Complex *values); /** * Define symmetry properties of the matrix. By default, matrices are assumed * to be nonsymmetric. Significant storage savings can be made if the matrix is * symmetric. **/ HYPRE_Int HYPRE_StructMatrixSetSymmetric(HYPRE_StructMatrix matrix, HYPRE_Int symmetric); /** * Specify which stencil entries are constant over the grid. Declaring entries * to be "constant over the grid" yields significant memory savings because * the value for each declared entry will only be stored once. However, not all * solvers are able to utilize this feature. * * Presently supported: * - no entries constant (this function need not be called) * - all entries constant * - all but the diagonal entry constant **/ HYPRE_Int HYPRE_StructMatrixSetConstantEntries( HYPRE_StructMatrix matrix, HYPRE_Int nentries, HYPRE_Int *entries ); /** * Set the ghost layer in the matrix **/ HYPRE_Int HYPRE_StructMatrixSetNumGhost(HYPRE_StructMatrix matrix, HYPRE_Int *num_ghost); /** * Print the matrix to file. This is mainly for debugging purposes. **/ HYPRE_Int HYPRE_StructMatrixPrint(const char *filename, HYPRE_StructMatrix matrix, HYPRE_Int all); /** * Read the matrix from file. This is mainly for debugging purposes. **/ HYPRE_Int HYPRE_StructMatrixRead( MPI_Comm comm, const char *filename, HYPRE_Int *num_ghost, HYPRE_StructMatrix *matrix ); /** * Matvec operator. This operation is \f$y = \alpha A x + \beta y\f$ . * Note that you can do a simple matrix-vector multiply by setting * \f$\alpha=1\f$ and \f$\beta=0\f$. **/ HYPRE_Int HYPRE_StructMatrixMatvec ( HYPRE_Complex alpha, HYPRE_StructMatrix A, HYPRE_StructVector x, HYPRE_Complex beta, HYPRE_StructVector y ); /**@}*/ /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ /** * @name Struct Vectors * * @{ **/ struct hypre_StructVector_struct; /** * The vector object. **/ #ifndef HYPRE_StructVector_defined typedef struct hypre_StructVector_struct *HYPRE_StructVector; #endif /** * Create a vector object. **/ HYPRE_Int HYPRE_StructVectorCreate(MPI_Comm comm, HYPRE_StructGrid grid, HYPRE_StructVector *vector); /** * Destroy a vector object. **/ HYPRE_Int HYPRE_StructVectorDestroy(HYPRE_StructVector vector); /** * Prepare a vector object for setting coefficient values. **/ HYPRE_Int HYPRE_StructVectorInitialize(HYPRE_StructVector vector); /** * Set vector coefficients index by index. * * NOTE: For better efficiency, use \ref HYPRE_StructVectorSetBoxValues to set * coefficients a box at a time. **/ HYPRE_Int HYPRE_StructVectorSetValues(HYPRE_StructVector vector, HYPRE_Int *index, HYPRE_Complex value); /** * Add to vector coefficients index by index. * * NOTE: For better efficiency, use \ref HYPRE_StructVectorAddToBoxValues to * set coefficients a box at a time. **/ HYPRE_Int HYPRE_StructVectorAddToValues(HYPRE_StructVector vector, HYPRE_Int *index, HYPRE_Complex value); /** * Set vector coefficients a box at a time. The data in \e values is ordered * as follows: * \verbatim m = 0; for (k = ilower[2]; k <= iupper[2]; k++) for (j = ilower[1]; j <= iupper[1]; j++) for (i = ilower[0]; i <= iupper[0]; i++) { values[m] = ...; m++; } \endverbatim **/ HYPRE_Int HYPRE_StructVectorSetBoxValues(HYPRE_StructVector vector, HYPRE_Int *ilower, HYPRE_Int *iupper, HYPRE_Complex *values); /** * Add to vector coefficients a box at a time. The data in \e values is * ordered as in \ref HYPRE_StructVectorSetBoxValues. **/ HYPRE_Int HYPRE_StructVectorAddToBoxValues(HYPRE_StructVector vector, HYPRE_Int *ilower, HYPRE_Int *iupper, HYPRE_Complex *values); /** * Set vector coefficients a box at a time. The \e values array is logically * box shaped with value-box extents \e vilower and \e viupper that must * contain the set-box extents \e ilower and \e iupper . The data in the * \e values array is ordered as in \ref HYPRE_StructVectorSetBoxValues, but * based on the value-box extents. **/ HYPRE_Int HYPRE_StructVectorSetBoxValues2(HYPRE_StructVector vector, HYPRE_Int *ilower, HYPRE_Int *iupper, HYPRE_Int *vilower, HYPRE_Int *viupper, HYPRE_Complex *values); /** * Add to vector coefficients a box at a time. The data in \e values is * ordered as in \ref HYPRE_StructVectorSetBoxValues2. **/ HYPRE_Int HYPRE_StructVectorAddToBoxValues2(HYPRE_StructVector vector, HYPRE_Int *ilower, HYPRE_Int *iupper, HYPRE_Int *vilower, HYPRE_Int *viupper, HYPRE_Complex *values); /** * Finalize the construction of the vector before using. **/ HYPRE_Int HYPRE_StructVectorAssemble(HYPRE_StructVector vector); /** * Get vector coefficients index by index. * * NOTE: For better efficiency, use \ref HYPRE_StructVectorGetBoxValues to get * coefficients a box at a time. **/ HYPRE_Int HYPRE_StructVectorGetValues(HYPRE_StructVector vector, HYPRE_Int *index, HYPRE_Complex *value); /** * Get vector coefficients a box at a time. The data in \e values is ordered * as in \ref HYPRE_StructVectorSetBoxValues. **/ HYPRE_Int HYPRE_StructVectorGetBoxValues(HYPRE_StructVector vector, HYPRE_Int *ilower, HYPRE_Int *iupper, HYPRE_Complex *values); /** * Get vector coefficients a box at a time. The data in \e values is ordered * as in \ref HYPRE_StructVectorSetBoxValues2. **/ HYPRE_Int HYPRE_StructVectorGetBoxValues2(HYPRE_StructVector vector, HYPRE_Int *ilower, HYPRE_Int *iupper, HYPRE_Int *vilower, HYPRE_Int *viupper, HYPRE_Complex *values); /** * Print the vector to file. This is mainly for debugging purposes. **/ HYPRE_Int HYPRE_StructVectorPrint(const char *filename, HYPRE_StructVector vector, HYPRE_Int all); /** * Read the vector from file. This is mainly for debugging purposes. **/ HYPRE_Int HYPRE_StructVectorRead( MPI_Comm comm, const char *filename, HYPRE_Int *num_ghost, HYPRE_StructVector *vector ); /**@}*/ /**@}*/ /*-------------------------------------------------------------------------- * Miscellaneous: These probably do not belong in the interface. *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_StructMatrixGetGrid(HYPRE_StructMatrix matrix, HYPRE_StructGrid *grid); struct hypre_CommPkg_struct; typedef struct hypre_CommPkg_struct *HYPRE_CommPkg; HYPRE_Int HYPRE_StructVectorSetNumGhost(HYPRE_StructVector vector, HYPRE_Int *num_ghost); HYPRE_Int HYPRE_StructVectorSetConstantValues(HYPRE_StructVector vector, HYPRE_Complex values); HYPRE_Int HYPRE_StructVectorGetMigrateCommPkg(HYPRE_StructVector from_vector, HYPRE_StructVector to_vector, HYPRE_CommPkg *comm_pkg); HYPRE_Int HYPRE_StructVectorMigrate(HYPRE_CommPkg comm_pkg, HYPRE_StructVector from_vector, HYPRE_StructVector to_vector); HYPRE_Int HYPRE_CommPkgDestroy(HYPRE_CommPkg comm_pkg); /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ #if 0 //defined(HYPRE_USING_CUDA) || defined(HYPRE_USING_HIP) HYPRE_Int HYPRE_StructGridSetDataLocation( HYPRE_StructGrid grid, HYPRE_MemoryLocation data_location ); #endif #ifdef __cplusplus } #endif #endif hypre-2.33.0/src/struct_mv/HYPRE_struct_stencil.c000066400000000000000000000041241477326011500217320ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * HYPRE_StructStencil interface * *****************************************************************************/ #include "_hypre_struct_mv.h" /*-------------------------------------------------------------------------- * HYPRE_StructStencilCreate *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_StructStencilCreate( HYPRE_Int dim, HYPRE_Int size, HYPRE_StructStencil *stencil ) { hypre_Index *shape; shape = hypre_CTAlloc(hypre_Index, size, HYPRE_MEMORY_HOST); *stencil = hypre_StructStencilCreate(dim, size, shape); return hypre_error_flag; } /*-------------------------------------------------------------------------- * HYPRE_StructStencilSetElement *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_StructStencilSetElement( HYPRE_StructStencil stencil, HYPRE_Int element_index, HYPRE_Int *offset ) { hypre_Index *shape; HYPRE_Int d; shape = hypre_StructStencilShape(stencil); hypre_SetIndex(shape[element_index], 0); for (d = 0; d < hypre_StructStencilNDim(stencil); d++) { hypre_IndexD(shape[element_index], d) = offset[d]; } return hypre_error_flag; } /*-------------------------------------------------------------------------- * HYPRE_StructStencilDestroy *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_StructStencilDestroy( HYPRE_StructStencil stencil ) { return ( hypre_StructStencilDestroy(stencil) ); } hypre-2.33.0/src/struct_mv/HYPRE_struct_vector.c000066400000000000000000000326471477326011500216060ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * HYPRE_StructVector interface * *****************************************************************************/ #include "_hypre_struct_mv.h" /*-------------------------------------------------------------------------- * HYPRE_StructVectorCreate *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_StructVectorCreate( MPI_Comm comm, HYPRE_StructGrid grid, HYPRE_StructVector *vector ) { *vector = hypre_StructVectorCreate(comm, grid); return hypre_error_flag; } /*-------------------------------------------------------------------------- * HYPRE_StructVectorDestroy *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_StructVectorDestroy( HYPRE_StructVector struct_vector ) { return ( hypre_StructVectorDestroy(struct_vector) ); } /*-------------------------------------------------------------------------- * HYPRE_StructVectorInitialize *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_StructVectorInitialize( HYPRE_StructVector vector ) { return ( hypre_StructVectorInitialize(vector) ); } /*-------------------------------------------------------------------------- * HYPRE_StructVectorSetValues *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_StructVectorSetValues( HYPRE_StructVector vector, HYPRE_Int *grid_index, HYPRE_Complex values ) { hypre_Index new_grid_index; HYPRE_Int d; hypre_SetIndex(new_grid_index, 0); for (d = 0; d < hypre_StructVectorNDim(vector); d++) { hypre_IndexD(new_grid_index, d) = grid_index[d]; } hypre_StructVectorSetValues(vector, new_grid_index, &values, 0, -1, 0); return hypre_error_flag; } /*-------------------------------------------------------------------------- * HYPRE_StructVectorSetBoxValues *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_StructVectorSetBoxValues( HYPRE_StructVector vector, HYPRE_Int *ilower, HYPRE_Int *iupper, HYPRE_Complex *values ) { HYPRE_StructVectorSetBoxValues2(vector, ilower, iupper, ilower, iupper, values); return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_StructVectorSetBoxValues2( HYPRE_StructVector vector, HYPRE_Int *ilower, HYPRE_Int *iupper, HYPRE_Int *vilower, HYPRE_Int *viupper, HYPRE_Complex *values ) { hypre_Box *set_box, *value_box; HYPRE_Int d; /* This creates boxes with zeroed-out extents */ set_box = hypre_BoxCreate(hypre_StructVectorNDim(vector)); value_box = hypre_BoxCreate(hypre_StructVectorNDim(vector)); for (d = 0; d < hypre_StructVectorNDim(vector); d++) { hypre_BoxIMinD(set_box, d) = ilower[d]; hypre_BoxIMaxD(set_box, d) = iupper[d]; hypre_BoxIMinD(value_box, d) = vilower[d]; hypre_BoxIMaxD(value_box, d) = viupper[d]; } hypre_StructVectorSetBoxValues(vector, set_box, value_box, values, 0, -1, 0); hypre_BoxDestroy(set_box); hypre_BoxDestroy(value_box); return hypre_error_flag; } /*-------------------------------------------------------------------------- * HYPRE_StructVectorAddToValues *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_StructVectorAddToValues( HYPRE_StructVector vector, HYPRE_Int *grid_index, HYPRE_Complex values ) { hypre_Index new_grid_index; HYPRE_Int d; hypre_SetIndex(new_grid_index, 0); for (d = 0; d < hypre_StructVectorNDim(vector); d++) { hypre_IndexD(new_grid_index, d) = grid_index[d]; } hypre_StructVectorSetValues(vector, new_grid_index, &values, 1, -1, 0); return hypre_error_flag; } /*-------------------------------------------------------------------------- * HYPRE_StructVectorAddToBoxValues *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_StructVectorAddToBoxValues( HYPRE_StructVector vector, HYPRE_Int *ilower, HYPRE_Int *iupper, HYPRE_Complex *values ) { HYPRE_StructVectorAddToBoxValues2(vector, ilower, iupper, ilower, iupper, values); return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_StructVectorAddToBoxValues2( HYPRE_StructVector vector, HYPRE_Int *ilower, HYPRE_Int *iupper, HYPRE_Int *vilower, HYPRE_Int *viupper, HYPRE_Complex *values ) { hypre_Box *set_box, *value_box; HYPRE_Int d; /* This creates boxes with zeroed-out extents */ set_box = hypre_BoxCreate(hypre_StructVectorNDim(vector)); value_box = hypre_BoxCreate(hypre_StructVectorNDim(vector)); for (d = 0; d < hypre_StructVectorNDim(vector); d++) { hypre_BoxIMinD(set_box, d) = ilower[d]; hypre_BoxIMaxD(set_box, d) = iupper[d]; hypre_BoxIMinD(value_box, d) = vilower[d]; hypre_BoxIMaxD(value_box, d) = viupper[d]; } hypre_StructVectorSetBoxValues(vector, set_box, value_box, values, 1, -1, 0); hypre_BoxDestroy(set_box); hypre_BoxDestroy(value_box); return hypre_error_flag; } /*-------------------------------------------------------------------------- * HYPRE_StructVectorScaleValues *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_StructVectorScaleValues( HYPRE_StructVector vector, HYPRE_Complex factor ) { return hypre_StructVectorScaleValues( vector, factor ); } /*-------------------------------------------------------------------------- * HYPRE_StructVectorGetValues *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_StructVectorGetValues( HYPRE_StructVector vector, HYPRE_Int *grid_index, HYPRE_Complex *values ) { hypre_Index new_grid_index; HYPRE_Int d; hypre_SetIndex(new_grid_index, 0); for (d = 0; d < hypre_StructVectorNDim(vector); d++) { hypre_IndexD(new_grid_index, d) = grid_index[d]; } hypre_StructVectorSetValues(vector, new_grid_index, values, -1, -1, 0); return hypre_error_flag; } /*-------------------------------------------------------------------------- * HYPRE_StructVectorGetBoxValues *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_StructVectorGetBoxValues( HYPRE_StructVector vector, HYPRE_Int *ilower, HYPRE_Int *iupper, HYPRE_Complex *values ) { HYPRE_StructVectorGetBoxValues2(vector, ilower, iupper, ilower, iupper, values); return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_StructVectorGetBoxValues2( HYPRE_StructVector vector, HYPRE_Int *ilower, HYPRE_Int *iupper, HYPRE_Int *vilower, HYPRE_Int *viupper, HYPRE_Complex *values ) { hypre_Box *set_box, *value_box; HYPRE_Int d; /* This creates boxes with zeroed-out extents */ set_box = hypre_BoxCreate(hypre_StructVectorNDim(vector)); value_box = hypre_BoxCreate(hypre_StructVectorNDim(vector)); for (d = 0; d < hypre_StructVectorNDim(vector); d++) { hypre_BoxIMinD(set_box, d) = ilower[d]; hypre_BoxIMaxD(set_box, d) = iupper[d]; hypre_BoxIMinD(value_box, d) = vilower[d]; hypre_BoxIMaxD(value_box, d) = viupper[d]; } hypre_StructVectorSetBoxValues(vector, set_box, value_box, values, -1, -1, 0); hypre_BoxDestroy(set_box); hypre_BoxDestroy(value_box); return hypre_error_flag; } /*-------------------------------------------------------------------------- * HYPRE_StructVectorAssemble *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_StructVectorAssemble( HYPRE_StructVector vector ) { return ( hypre_StructVectorAssemble(vector) ); } /*-------------------------------------------------------------------------- * HYPRE_StructVectorPrint *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_StructVectorPrint( const char *filename, HYPRE_StructVector vector, HYPRE_Int all ) { return ( hypre_StructVectorPrint(filename, vector, all) ); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_StructVectorRead( MPI_Comm comm, const char *filename, HYPRE_Int *num_ghost, HYPRE_StructVector *vector ) { if (!vector) { hypre_error_in_arg(4); return hypre_error_flag; } *vector = (HYPRE_StructVector) hypre_StructVectorRead(comm, filename, num_ghost); return hypre_error_flag; } /*-------------------------------------------------------------------------- * HYPRE_StructVectorSetNumGhost *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_StructVectorSetNumGhost( HYPRE_StructVector vector, HYPRE_Int *num_ghost ) { return ( hypre_StructVectorSetNumGhost(vector, num_ghost) ); } /*-------------------------------------------------------------------------- * HYPRE_StructVectorCopy * copies data from x to y * y has its own data array, so this is a deep copy in that sense. * The grid and other size information are not copied - they are * assumed to be consistent already. *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_StructVectorCopy( HYPRE_StructVector x, HYPRE_StructVector y ) { return ( hypre_StructVectorCopy( x, y ) ); } /*-------------------------------------------------------------------------- * HYPRE_StructVectorSetConstantValues *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_StructVectorSetConstantValues( HYPRE_StructVector vector, HYPRE_Complex values ) { return ( hypre_StructVectorSetConstantValues(vector, values) ); } /*-------------------------------------------------------------------------- * HYPRE_StructVectorGetMigrateCommPkg *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_StructVectorGetMigrateCommPkg( HYPRE_StructVector from_vector, HYPRE_StructVector to_vector, HYPRE_CommPkg *comm_pkg ) { *comm_pkg = hypre_StructVectorGetMigrateCommPkg(from_vector, to_vector); return hypre_error_flag; } /*-------------------------------------------------------------------------- * HYPRE_StructVectorMigrate *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_StructVectorMigrate( HYPRE_CommPkg comm_pkg, HYPRE_StructVector from_vector, HYPRE_StructVector to_vector ) { return ( hypre_StructVectorMigrate( comm_pkg, from_vector, to_vector) ); } /*-------------------------------------------------------------------------- * HYPRE_CommPkgDestroy *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_CommPkgDestroy( HYPRE_CommPkg comm_pkg ) { return ( hypre_CommPkgDestroy(comm_pkg) ); } /*-------------------------------------------------------------------------- * HYPRE_StructVectorClone *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_StructVectorClone( HYPRE_StructVector x, HYPRE_StructVector *y_ptr ) { *y_ptr = hypre_StructVectorClone(x); return hypre_error_flag; } hypre-2.33.0/src/struct_mv/Makefile000066400000000000000000000046211477326011500172140ustar00rootroot00000000000000# Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) include ../config/Makefile.config CINCLUDES = ${INCLUDES} ${MPIINCLUDE} C_COMPILE_FLAGS = \ -I..\ -I$(srcdir)\ -I$(srcdir)/..\ -I$(srcdir)/../utilities\ ${CINCLUDES} HEADERS =\ HYPRE_struct_mv.h\ _hypre_struct_mv.h\ _hypre_struct_mv.hpp\ assumed_part.h\ box.h\ box_manager.h\ computation.h\ struct_communication.h\ struct_grid.h\ struct_matrix.h\ struct_stencil.h\ struct_vector.h FILES =\ assumed_part.c\ box_algebra.c\ box_boundary.c\ box.c\ box_manager.c\ communication_info.c\ computation.c\ F90_HYPRE_struct_grid.c\ F90_HYPRE_struct_matrix.c\ F90_HYPRE_struct_stencil.c\ F90_HYPRE_struct_vector.c\ HYPRE_struct_grid.c\ HYPRE_struct_matrix.c\ HYPRE_struct_stencil.c\ HYPRE_struct_vector.c\ project.c\ struct_grid.c\ struct_io.c\ struct_matrix_mask.c\ struct_stencil.c CUFILES =\ struct_axpy.c\ struct_communication.c\ struct_copy.c\ struct_innerprod.c\ struct_matrix.c\ struct_matvec.c\ struct_scale.c\ struct_vector.c COBJS = ${FILES:.c=.o} CUOBJS = ${CUFILES:.c=.obj} OBJS = ${COBJS} ${CUOBJS} SONAME = libHYPRE_struct_mv-${HYPRE_RELEASE_VERSION}${HYPRE_LIB_SUFFIX} ################################################################## # Targets ################################################################## all: libHYPRE_struct_mv${HYPRE_LIB_SUFFIX} cp -fR $(srcdir)/HYPRE_*.h $(HYPRE_BUILD_DIR)/include cp -fR $(srcdir)/_hypre_struct_mv.h $(HYPRE_BUILD_DIR)/include cp -fR $(srcdir)/_hypre_struct_mv.hpp $(HYPRE_BUILD_DIR)/include # cp -fR libHYPRE* $(HYPRE_BUILD_DIR)/lib install: libHYPRE_struct_mv${HYPRE_LIB_SUFFIX} cp -fR $(srcdir)/HYPRE_*.h $(HYPRE_INC_INSTALL) cp -fR $(srcdir)/_hypre_struct_mv.h $(HYPRE_INC_INSTALL) # cp -fR libHYPRE* $(HYPRE_LIB_INSTALL) clean: rm -f *.o *.obj libHYPRE* rm -rf pchdir tca.map *inslog* distclean: clean ################################################################## # Rules ################################################################## libHYPRE_struct_mv.a: ${OBJS} @echo "Building $@ ... " ${AR} $@ ${OBJS} ${RANLIB} $@ libHYPRE_struct_mv.so libHYPRE_struct_mv.dylib: ${OBJS} @echo "Building $@ ... " ${BUILD_CC_SHARED} -o ${SONAME} ${OBJS} ${SHARED_SET_SONAME}${SONAME} ln -s -f ${SONAME} $@ ${OBJS}: ${HEADERS} hypre-2.33.0/src/struct_mv/_hypre_struct_mv.h000066400000000000000000004226131477326011500213260ustar00rootroot00000000000000 /*** DO NOT EDIT THIS FILE DIRECTLY (use 'headers' to generate) ***/ #ifndef hypre_STRUCT_MV_HEADER #define hypre_STRUCT_MV_HEADER #include #include #include #include "HYPRE_struct_mv.h" #include "_hypre_utilities.h" #ifdef __cplusplus extern "C" { #endif /****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * Header info for the Box structures * *****************************************************************************/ #ifndef hypre_BOX_HEADER #define hypre_BOX_HEADER #ifndef HYPRE_MAXDIM #define HYPRE_MAXDIM 3 #endif /*-------------------------------------------------------------------------- * hypre_Index: * This is used to define indices in index space, or dimension * sizes of boxes. * * The spatial dimensions x, y, and z may be specified by the * integers 0, 1, and 2, respectively (see the hypre_IndexD macro below). * This simplifies the code in the hypre_Box class by reducing code * replication. *--------------------------------------------------------------------------*/ typedef HYPRE_Int hypre_Index[HYPRE_MAXDIM]; typedef HYPRE_Int *hypre_IndexRef; /*-------------------------------------------------------------------------- * hypre_Box: *--------------------------------------------------------------------------*/ typedef struct hypre_Box_struct { hypre_Index imin; /* min bounding indices */ hypre_Index imax; /* max bounding indices */ HYPRE_Int ndim; /* number of dimensions */ } hypre_Box; /*-------------------------------------------------------------------------- * hypre_BoxArray: * An array of boxes. * Since size can be zero, need to store ndim separately. *--------------------------------------------------------------------------*/ typedef struct hypre_BoxArray_struct { hypre_Box *boxes; /* Array of boxes */ HYPRE_Int size; /* Size of box array */ HYPRE_Int alloc_size; /* Size of currently alloced space */ HYPRE_Int ndim; /* number of dimensions */ } hypre_BoxArray; #define hypre_BoxArrayExcess 10 /*-------------------------------------------------------------------------- * hypre_BoxArrayArray: * An array of box arrays. * Since size can be zero, need to store ndim separately. *--------------------------------------------------------------------------*/ typedef struct hypre_BoxArrayArray_struct { hypre_BoxArray **box_arrays; /* Array of pointers to box arrays */ HYPRE_Int size; /* Size of box array array */ HYPRE_Int ndim; /* number of dimensions */ } hypre_BoxArrayArray; /*-------------------------------------------------------------------------- * Accessor macros: hypre_Index *--------------------------------------------------------------------------*/ #define hypre_IndexD(index, d) (index[d]) /* Avoid using these macros */ #define hypre_IndexX(index) hypre_IndexD(index, 0) #define hypre_IndexY(index) hypre_IndexD(index, 1) #define hypre_IndexZ(index) hypre_IndexD(index, 2) /*-------------------------------------------------------------------------- * Member functions: hypre_Index *--------------------------------------------------------------------------*/ /*----- Avoid using these Index macros -----*/ #define hypre_SetIndex3(index, ix, iy, iz) \ ( hypre_IndexD(index, 0) = ix,\ hypre_IndexD(index, 1) = iy,\ hypre_IndexD(index, 2) = iz ) #define hypre_ClearIndex(index) hypre_SetIndex(index, 0) /*-------------------------------------------------------------------------- * Accessor macros: hypre_Box *--------------------------------------------------------------------------*/ #define hypre_BoxIMin(box) ((box) -> imin) #define hypre_BoxIMax(box) ((box) -> imax) #define hypre_BoxNDim(box) ((box) -> ndim) #define hypre_BoxIMinD(box, d) (hypre_IndexD(hypre_BoxIMin(box), d)) #define hypre_BoxIMaxD(box, d) (hypre_IndexD(hypre_BoxIMax(box), d)) #define hypre_BoxSizeD(box, d) \ hypre_max(0, (hypre_BoxIMaxD(box, d) - hypre_BoxIMinD(box, d) + 1)) #define hypre_IndexDInBox(index, d, box) \ ( hypre_IndexD(index, d) >= hypre_BoxIMinD(box, d) && \ hypre_IndexD(index, d) <= hypre_BoxIMaxD(box, d) ) /* The first hypre_CCBoxIndexRank is better style because it is similar to hypre_BoxIndexRank. The second one sometimes avoids compiler warnings. */ #define hypre_CCBoxIndexRank(box, index) 0 #define hypre_CCBoxIndexRank_noargs() 0 #define hypre_CCBoxOffsetDistance(box, index) 0 /*----- Avoid using these Box macros -----*/ #define hypre_BoxSizeX(box) hypre_BoxSizeD(box, 0) #define hypre_BoxSizeY(box) hypre_BoxSizeD(box, 1) #define hypre_BoxSizeZ(box) hypre_BoxSizeD(box, 2) /*-------------------------------------------------------------------------- * Accessor macros: hypre_BoxArray *--------------------------------------------------------------------------*/ #define hypre_BoxArrayBoxes(box_array) ((box_array) -> boxes) #define hypre_BoxArrayBox(box_array, i) &((box_array) -> boxes[(i)]) #define hypre_BoxArraySize(box_array) ((box_array) -> size) #define hypre_BoxArrayAllocSize(box_array) ((box_array) -> alloc_size) #define hypre_BoxArrayNDim(box_array) ((box_array) -> ndim) /*-------------------------------------------------------------------------- * Accessor macros: hypre_BoxArrayArray *--------------------------------------------------------------------------*/ #define hypre_BoxArrayArrayBoxArrays(box_array_array) \ ((box_array_array) -> box_arrays) #define hypre_BoxArrayArrayBoxArray(box_array_array, i) \ ((box_array_array) -> box_arrays[(i)]) #define hypre_BoxArrayArraySize(box_array_array) \ ((box_array_array) -> size) #define hypre_BoxArrayArrayNDim(box_array_array) \ ((box_array_array) -> ndim) /*-------------------------------------------------------------------------- * Looping macros: *--------------------------------------------------------------------------*/ #define hypre_ForBoxI(i, box_array) \ for (i = 0; i < hypre_BoxArraySize(box_array); i++) #define hypre_ForBoxArrayI(i, box_array_array) \ for (i = 0; i < hypre_BoxArrayArraySize(box_array_array); i++) #define ZYPRE_BOX_PRIVATE hypre__IN,hypre__JN,hypre__I,hypre__J,hypre__d,hypre__i #define HYPRE_BOX_PRIVATE ZYPRE_BOX_PRIVATE #define zypre_BoxLoopDeclare() \ HYPRE_Int hypre__tot, hypre__div, hypre__mod;\ HYPRE_Int hypre__block, hypre__num_blocks;\ HYPRE_Int hypre__d, hypre__ndim;\ HYPRE_Int hypre__I, hypre__J, hypre__IN, hypre__JN;\ HYPRE_Int hypre__i[HYPRE_MAXDIM+1], hypre__n[HYPRE_MAXDIM+1] #define zypre_BoxLoopDeclareK(k) \ HYPRE_Int hypre__ikstart##k, hypre__i0inc##k;\ HYPRE_Int hypre__sk##k[HYPRE_MAXDIM], hypre__ikinc##k[HYPRE_MAXDIM+1] #define zypre_BoxLoopInit(ndim, loop_size) \ hypre__ndim = ndim;\ hypre__n[0] = loop_size[0];\ hypre__tot = 1;\ for (hypre__d = 1; hypre__d < hypre__ndim; hypre__d++)\ {\ hypre__n[hypre__d] = loop_size[hypre__d];\ hypre__tot *= hypre__n[hypre__d];\ }\ hypre__n[hypre__ndim] = 2;\ hypre__num_blocks = hypre_NumThreads();\ if (hypre__tot < hypre__num_blocks)\ {\ hypre__num_blocks = hypre__tot;\ }\ if (hypre__num_blocks > 0)\ {\ hypre__div = hypre__tot / hypre__num_blocks;\ hypre__mod = hypre__tot % hypre__num_blocks;\ }\ else\ {\ hypre__div = 0;\ hypre__mod = 0;\ } #define zypre_BoxLoopInitK(k, dboxk, startk, stridek, ik) \ hypre__sk##k[0] = stridek[0];\ hypre__ikinc##k[0] = 0;\ ik = hypre_BoxSizeD(dboxk, 0); /* temporarily use ik */\ for (hypre__d = 1; hypre__d < hypre__ndim; hypre__d++)\ {\ hypre__sk##k[hypre__d] = ik*stridek[hypre__d];\ hypre__ikinc##k[hypre__d] = hypre__ikinc##k[hypre__d-1] +\ hypre__sk##k[hypre__d] - hypre__n[hypre__d-1]*hypre__sk##k[hypre__d-1];\ ik *= hypre_BoxSizeD(dboxk, hypre__d);\ }\ hypre__i0inc##k = hypre__sk##k[0];\ hypre__ikinc##k[hypre__ndim] = 0;\ hypre__ikstart##k = hypre_BoxIndexRank(dboxk, startk) #define zypre_BoxLoopSet() \ hypre__IN = hypre__n[0];\ if (hypre__num_blocks > 1)/* in case user sets num_blocks to 1 */\ {\ hypre__JN = hypre__div + ((hypre__mod > hypre__block) ? 1 : 0);\ hypre__J = hypre__block * hypre__div + hypre_min(hypre__mod, hypre__block);\ for (hypre__d = 1; hypre__d < hypre__ndim; hypre__d++)\ {\ hypre__i[hypre__d] = hypre__J % hypre__n[hypre__d];\ hypre__J /= hypre__n[hypre__d];\ }\ }\ else\ {\ hypre__JN = hypre__tot;\ for (hypre__d = 1; hypre__d < hypre__ndim; hypre__d++)\ {\ hypre__i[hypre__d] = 0;\ }\ }\ hypre__i[hypre__ndim] = 0 #define zypre_BoxLoopSetK(k, ik) \ ik = hypre__ikstart##k;\ for (hypre__d = 1; hypre__d < hypre__ndim; hypre__d++)\ {\ ik += hypre__i[hypre__d]*hypre__sk##k[hypre__d];\ } #define zypre_BoxLoopInc1() \ hypre__d = 1;\ while ((hypre__i[hypre__d]+2) > hypre__n[hypre__d])\ {\ hypre__d++;\ } #define zypre_BoxLoopInc2() \ hypre__i[hypre__d]++;\ while (hypre__d > 1)\ {\ hypre__d--;\ hypre__i[hypre__d] = 0;\ } /* This returns the loop index (of type hypre_Index) for the current iteration, * where the numbering starts at 0. It works even when threading is turned on, * as long as 'index' is declared to be private. */ #define zypre_BoxLoopGetIndex(index) \ index[0] = hypre__I;\ for (hypre__d = 1; hypre__d < hypre__ndim; hypre__d++)\ {\ index[hypre__d] = hypre__i[hypre__d];\ } /* Use this before the For macros below to force only one block */ #define zypre_BoxLoopSetOneBlock() hypre__num_blocks = 1 /* Use this to get the block iteration inside a BoxLoop */ #define zypre_BoxLoopBlock() hypre__block #define zypre_BasicBoxLoopInitK(k, stridek) \ hypre__sk##k[0] = stridek[0];\ hypre__ikinc##k[0] = 0;\ for (hypre__d = 1; hypre__d < hypre__ndim; hypre__d++)\ {\ hypre__sk##k[hypre__d] = stridek[hypre__d];\ hypre__ikinc##k[hypre__d] = hypre__ikinc##k[hypre__d-1] +\ hypre__sk##k[hypre__d] - hypre__n[hypre__d-1]*hypre__sk##k[hypre__d-1];\ }\ hypre__i0inc##k = hypre__sk##k[0];\ hypre__ikinc##k[hypre__ndim] = 0;\ hypre__ikstart##k = 0 /*-------------------------------------------------------------------------- * NOTES - Keep these for reference here and elsewhere in the code *--------------------------------------------------------------------------*/ #if 0 #define hypre_BoxLoop2Begin(loop_size, dbox1, start1, stride1, i1, dbox2, start2, stride2, i2) { /* init hypre__i1start */ HYPRE_Int hypre__i1start = hypre_BoxIndexRank(dbox1, start1); HYPRE_Int hypre__i2start = hypre_BoxIndexRank(dbox2, start2); /* declare and set hypre__s1 */ hypre_BoxLoopDeclareS(dbox1, stride1, hypre__sx1, hypre__sy1, hypre__sz1); hypre_BoxLoopDeclareS(dbox2, stride2, hypre__sx2, hypre__sy2, hypre__sz2); /* declare and set hypre__n, hypre__m, hypre__dir, hypre__max, * hypre__div, hypre__mod, hypre__block, hypre__num_blocks */ hypre_BoxLoopDeclareN(loop_size); #define hypre_BoxLoop2For(i, j, k, i1, i2) for (hypre__block = 0; hypre__block < hypre__num_blocks; hypre__block++) { /* set i and hypre__n */ hypre_BoxLoopSet(i, j, k); /* set i1 */ i1 = hypre__i1start + i * hypre__sx1 + j * hypre__sy1 + k * hypre__sz1; i2 = hypre__i2start + i * hypre__sx2 + j * hypre__sy2 + k * hypre__sz2; for (k = 0; k < hypre__nz; k++) { for (j = 0; j < hypre__ny; j++) { for (i = 0; i < hypre__nx; i++) { #define hypre_BoxLoop2End(i1, i2) i1 += hypre__sx1; i2 += hypre__sx2; } i1 += hypre__sy1 - hypre__nx * hypre__sx1; i2 += hypre__sy2 - hypre__nx * hypre__sx2; } i1 += hypre__sz1 - hypre__ny * hypre__sy1; i2 += hypre__sz2 - hypre__ny * hypre__sy2; } } } /*---------------------------------------- * Idea 2: Simple version of Idea 3 below *----------------------------------------*/ N = 1; for (d = 0; d < ndim; d++) { N *= n[d]; i[d] = 0; n[d] -= 2; /* this produces a simpler comparison below */ } i[ndim] = 0; n[ndim] = 0; for (I = 0; I < N; I++) { /* loop body */ for (d = 0; i[d] > n[d]; d++) { i[d] = 0; } i[d]++; i1 += s1[d]; /* NOTE: These are different from hypre__sx1, etc. above */ i2 += s2[d]; /* The lengths of i, n, and s must be (ndim+1) */ } /*---------------------------------------- * Idea 3: Approach used in the box loops *----------------------------------------*/ N = 1; for (d = 1; d < ndim; d++) { N *= n[d]; i[d] = 0; n[d] -= 2; /* this produces a simpler comparison below */ } i[ndim] = 0; n[ndim] = 0; for (J = 0; J < N; J++) { for (I = 0; I < n[0]; I++) { /* loop body */ i1 += s1[0]; i2 += s2[0]; } for (d = 1; i[d] > n[d]; d++) { i[d] = 0; } i[d]++; i1 += s1[d]; /* NOTE: These are different from hypre__sx1, etc. above */ i2 += s2[d]; /* The lengths of i, n, and s must be (ndim+1) */ } #endif #endif /* #ifndef hypre_BOX_HEADER */ /****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * Header info for the struct assumed partition * *****************************************************************************/ #ifndef hypre_ASSUMED_PART_HEADER #define hypre_ASSUMED_PART_HEADER typedef struct { /* the entries will be the same for all procs */ HYPRE_Int ndim; /* number of dimensions */ hypre_BoxArray *regions; /* areas of the grid with boxes */ HYPRE_Int num_regions; /* how many regions */ HYPRE_Int *proc_partitions; /* proc ids assigned to each region (this is size num_regions +1) */ hypre_Index *divisions; /* number of proc divisions in each direction for each region */ /* these entries are specific to each proc */ hypre_BoxArray *my_partition; /* my portion of grid (at most 2) */ hypre_BoxArray *my_partition_boxes; /* boxes in my portion */ HYPRE_Int *my_partition_proc_ids; HYPRE_Int *my_partition_boxnums; HYPRE_Int my_partition_ids_size; HYPRE_Int my_partition_ids_alloc; HYPRE_Int my_partition_num_distinct_procs; } hypre_StructAssumedPart; /*Accessor macros */ #define hypre_StructAssumedPartNDim(apart) ((apart)->ndim) #define hypre_StructAssumedPartRegions(apart) ((apart)->regions) #define hypre_StructAssumedPartNumRegions(apart) ((apart)->num_regions) #define hypre_StructAssumedPartDivisions(apart) ((apart)->divisions) #define hypre_StructAssumedPartDivision(apart, i) ((apart)->divisions[i]) #define hypre_StructAssumedPartProcPartitions(apart) ((apart)->proc_partitions) #define hypre_StructAssumedPartProcPartition(apart, i) ((apart)->proc_partitions[i]) #define hypre_StructAssumedPartMyPartition(apart) ((apart)->my_partition) #define hypre_StructAssumedPartMyPartitionBoxes(apart) ((apart)->my_partition_boxes) #define hypre_StructAssumedPartMyPartitionProcIds(apart) ((apart)->my_partition_proc_ids) #define hypre_StructAssumedPartMyPartitionIdsSize(apart) ((apart)->my_partition_ids_size) #define hypre_StructAssumedPartMyPartitionIdsAlloc(apart) ((apart)->my_partition_ids_alloc) #define hypre_StructAssumedPartMyPartitionNumDistinctProcs(apart) ((apart)->my_partition_num_distinct_procs) #define hypre_StructAssumedPartMyPartitionBoxnums(apart) ((apart)->my_partition_boxnums) #define hypre_StructAssumedPartMyPartitionProcId(apart, i) ((apart)->my_partition_proc_ids[i]) #define hypre_StructAssumedPartMyPartitionBoxnum(apart, i) ((apart)->my_partition_boxnums[i]) #endif /****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #ifndef hypre_BOX_MANAGER_HEADER #define hypre_BOX_MANAGER_HEADER /*-------------------------------------------------------------------------- * BoxManEntry *--------------------------------------------------------------------------*/ typedef struct hypre_BoxManEntry_struct { hypre_Index imin; /* Extents of box */ hypre_Index imax; HYPRE_Int ndim; /* Number of dimensions */ HYPRE_Int proc; /* This is a two-part unique id: (proc, id) */ HYPRE_Int id; HYPRE_Int num_ghost[2 * HYPRE_MAXDIM]; HYPRE_Int position; /* This indicates the location of the entry in the the * box manager entries array and is used for pairing with * the info object (populated in addentry) */ void *boxman; /* The owning manager (populated in addentry) */ struct hypre_BoxManEntry_struct *next; } hypre_BoxManEntry; /*--------------------------------------------------------------------------- * Box Manager: organizes arbitrary information in a spatial way *----------------------------------------------------------------------------*/ typedef struct { MPI_Comm comm; HYPRE_Int max_nentries; /* storage allocated for entries */ HYPRE_Int is_gather_called; /* Boolean to indicate whether GatherEntries function has been called (prior to assemble) - may not want this (can tell by the size of gather_regions array) */ hypre_BoxArray *gather_regions; /* This is where we collect boxes input by calls to BoxManGatherEntries - to be gathered in the assemble. These are then deleted after the assemble */ HYPRE_Int all_global_known; /* Boolean to say that every processor already has all of the global data for this manager (this could be accessed by a coarsening routine, for example) */ HYPRE_Int is_entries_sort; /* Boolean to say that entries were added in sorted order (id, proc) (this could be accessed by a coarsening routine, for example) */ HYPRE_Int entry_info_size; /* In bytes, the (max) size of the info object for the entries */ HYPRE_Int is_assembled; /* Flag to indicate if the box manager has been assembled (used to control whether or not functions can be used prior to assemble) */ /* Storing the entries */ HYPRE_Int nentries; /* Number of entries stored */ hypre_BoxManEntry *entries; /* Actual box manager entries - sorted by (proc, id) at the end of the assemble) */ HYPRE_Int *procs_sort; /* The sorted procs corresponding to entries */ HYPRE_Int *ids_sort; /* Sorted ids corresponding to the entries */ HYPRE_Int num_procs_sort; /* Number of distinct procs in entries */ HYPRE_Int *procs_sort_offsets; /* Offsets for procs into the entry_sort array */ HYPRE_Int first_local; /* Position of local infomation in entries */ HYPRE_Int local_proc_offset; /* Position of local information in offsets */ /* Here is the table that organizes the entries spatially (by index) */ hypre_BoxManEntry **index_table; /* This points into 'entries' array and corresponds to the index arays */ HYPRE_Int *indexes[HYPRE_MAXDIM]; /* Indexes (ordered) for imin and imax of each box in the entries array */ HYPRE_Int size[HYPRE_MAXDIM]; /* How many indexes in each direction */ HYPRE_Int last_index[HYPRE_MAXDIM]; /* Last index used in the indexes map */ HYPRE_Int num_my_entries; /* Num entries with proc_id = myid */ HYPRE_Int *my_ids; /* Array of ids corresponding to my entries */ hypre_BoxManEntry **my_entries; /* Points into entries that are mine and corresponds to my_ids array. This is destroyed in the assemble. */ void *info_objects; /* Array of info objects (each of size entry_info_size), managed byte-wise */ hypre_StructAssumedPart *assumed_partition; /* The assumed partition object. For now this is only used during the assemble (where it is created). */ HYPRE_Int ndim; /* Problem dimension (known in the grid) */ hypre_Box *bounding_box; /* Bounding box from associated grid */ HYPRE_Int next_id; /* Counter to indicate the next id that would be unique (regardless of proc id) */ /* Ghost stuff */ HYPRE_Int num_ghost[2 * HYPRE_MAXDIM]; } hypre_BoxManager; /*-------------------------------------------------------------------------- * Accessor macros: hypre_BoxMan *--------------------------------------------------------------------------*/ #define hypre_BoxManComm(manager) ((manager) -> comm) #define hypre_BoxManMaxNEntries(manager) ((manager) -> max_nentries) #define hypre_BoxManIsGatherCalled(manager) ((manager) -> is_gather_called) #define hypre_BoxManIsEntriesSort(manager) ((manager) -> is_entries_sort) #define hypre_BoxManGatherRegions(manager) ((manager) -> gather_regions) #define hypre_BoxManAllGlobalKnown(manager) ((manager) -> all_global_known) #define hypre_BoxManEntryInfoSize(manager) ((manager) -> entry_info_size) #define hypre_BoxManNEntries(manager) ((manager) -> nentries) #define hypre_BoxManEntries(manager) ((manager) -> entries) #define hypre_BoxManInfoObjects(manager) ((manager) -> info_objects) #define hypre_BoxManIsAssembled(manager) ((manager) -> is_assembled) #define hypre_BoxManProcsSort(manager) ((manager) -> procs_sort) #define hypre_BoxManIdsSort(manager) ((manager) -> ids_sort) #define hypre_BoxManNumProcsSort(manager) ((manager) -> num_procs_sort) #define hypre_BoxManProcsSortOffsets(manager) ((manager) -> procs_sort_offsets) #define hypre_BoxManLocalProcOffset(manager) ((manager) -> local_proc_offset) #define hypre_BoxManFirstLocal(manager) ((manager) -> first_local) #define hypre_BoxManIndexTable(manager) ((manager) -> index_table) #define hypre_BoxManIndexes(manager) ((manager) -> indexes) #define hypre_BoxManSize(manager) ((manager) -> size) #define hypre_BoxManLastIndex(manager) ((manager) -> last_index) #define hypre_BoxManNumMyEntries(manager) ((manager) -> num_my_entries) #define hypre_BoxManMyIds(manager) ((manager) -> my_ids) #define hypre_BoxManMyEntries(manager) ((manager) -> my_entries) #define hypre_BoxManAssumedPartition(manager) ((manager) -> assumed_partition) #define hypre_BoxManNDim(manager) ((manager) -> ndim) #define hypre_BoxManBoundingBox(manager) ((manager) -> bounding_box) #define hypre_BoxManNextId(manager) ((manager) -> next_id) #define hypre_BoxManNumGhost(manager) ((manager) -> num_ghost) #define hypre_BoxManIndexesD(manager, d) hypre_BoxManIndexes(manager)[d] #define hypre_BoxManSizeD(manager, d) hypre_BoxManSize(manager)[d] #define hypre_BoxManLastIndexD(manager, d) hypre_BoxManLastIndex(manager)[d] #define hypre_BoxManInfoObject(manager, i) \ (void *) ((char *)hypre_BoxManInfoObjects(manager) + i* hypre_BoxManEntryInfoSize(manager)) /*-------------------------------------------------------------------------- * Accessor macros: hypre_BoxManEntry *--------------------------------------------------------------------------*/ #define hypre_BoxManEntryIMin(entry) ((entry) -> imin) #define hypre_BoxManEntryIMax(entry) ((entry) -> imax) #define hypre_BoxManEntryNDim(entry) ((entry) -> ndim) #define hypre_BoxManEntryProc(entry) ((entry) -> proc) #define hypre_BoxManEntryId(entry) ((entry) -> id) #define hypre_BoxManEntryPosition(entry) ((entry) -> position) #define hypre_BoxManEntryNumGhost(entry) ((entry) -> num_ghost) #define hypre_BoxManEntryNext(entry) ((entry) -> next) #define hypre_BoxManEntryBoxMan(entry) ((entry) -> boxman) #endif /****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * Header info for the hypre_StructGrid structures * *****************************************************************************/ #ifndef hypre_STRUCT_GRID_HEADER #define hypre_STRUCT_GRID_HEADER /*-------------------------------------------------------------------------- * hypre_StructGrid: *--------------------------------------------------------------------------*/ typedef struct hypre_StructGrid_struct { MPI_Comm comm; HYPRE_Int ndim; /* Number of grid dimensions */ hypre_BoxArray *boxes; /* Array of boxes in this process */ HYPRE_Int *ids; /* Unique IDs for boxes */ hypre_Index max_distance; /* Neighborhood size - in each dimension*/ hypre_Box *bounding_box; /* Bounding box around grid */ HYPRE_Int local_size; /* Number of grid points locally */ HYPRE_BigInt global_size; /* Total number of grid points */ hypre_Index periodic; /* Indicates if grid is periodic */ HYPRE_Int num_periods; /* number of box set periods */ hypre_Index *pshifts; /* shifts of periodicity */ HYPRE_Int ref_count; HYPRE_Int ghlocal_size; /* Number of vars in box including ghosts */ HYPRE_Int num_ghost[2 * HYPRE_MAXDIM]; /* ghost layer size */ hypre_BoxManager *boxman; } hypre_StructGrid; /*-------------------------------------------------------------------------- * Accessor macros: hypre_StructGrid *--------------------------------------------------------------------------*/ #define hypre_StructGridComm(grid) ((grid) -> comm) #define hypre_StructGridNDim(grid) ((grid) -> ndim) #define hypre_StructGridBoxes(grid) ((grid) -> boxes) #define hypre_StructGridIDs(grid) ((grid) -> ids) #define hypre_StructGridMaxDistance(grid) ((grid) -> max_distance) #define hypre_StructGridBoundingBox(grid) ((grid) -> bounding_box) #define hypre_StructGridLocalSize(grid) ((grid) -> local_size) #define hypre_StructGridGlobalSize(grid) ((grid) -> global_size) #define hypre_StructGridPeriodic(grid) ((grid) -> periodic) #define hypre_StructGridNumPeriods(grid) ((grid) -> num_periods) #define hypre_StructGridPShifts(grid) ((grid) -> pshifts) #define hypre_StructGridPShift(grid, i) ((grid) -> pshifts[i]) #define hypre_StructGridRefCount(grid) ((grid) -> ref_count) #define hypre_StructGridGhlocalSize(grid) ((grid) -> ghlocal_size) #define hypre_StructGridNumGhost(grid) ((grid) -> num_ghost) #define hypre_StructGridBoxMan(grid) ((grid) -> boxman) #define hypre_StructGridBox(grid, i) (hypre_BoxArrayBox(hypre_StructGridBoxes(grid), i)) #define hypre_StructGridNumBoxes(grid) (hypre_BoxArraySize(hypre_StructGridBoxes(grid))) #define hypre_StructGridIDPeriod(grid) hypre_BoxNeighborsIDPeriod(hypre_StructGridNeighbors(grid)) #if 0 //defined(HYPRE_USING_CUDA) || defined(HYPRE_USING_HIP) #define hypre_StructGridDataLocation(grid) ((grid) -> data_location) #endif /*-------------------------------------------------------------------------- * Looping macros: *--------------------------------------------------------------------------*/ #define hypre_ForStructGridBoxI(i, grid) hypre_ForBoxI(i, hypre_StructGridBoxes(grid)) #if 0 //defined(HYPRE_USING_CUDA) || defined(HYPRE_USING_HIP) #define HYPRE_MIN_GPU_SIZE (131072) #define hypre_SetDeviceOn() hypre_HandleStructExecPolicy(hypre_handle()) = HYPRE_EXEC_DEVICE #define hypre_SetDeviceOff() hypre_HandleStructExecPolicy(hypre_handle()) = HYPRE_EXEC_HOST #endif #endif /****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * Header info for hypre_StructStencil data structures * *****************************************************************************/ #ifndef hypre_STRUCT_STENCIL_HEADER #define hypre_STRUCT_STENCIL_HEADER /*-------------------------------------------------------------------------- * hypre_StructStencil *--------------------------------------------------------------------------*/ typedef struct hypre_StructStencil_struct { hypre_Index *shape; /* Description of a stencil's shape */ HYPRE_Int size; /* Number of stencil coefficients */ HYPRE_Int ndim; /* Number of dimensions */ HYPRE_Int ref_count; } hypre_StructStencil; /*-------------------------------------------------------------------------- * Accessor functions for the hypre_StructStencil structure *--------------------------------------------------------------------------*/ #define hypre_StructStencilShape(stencil) ((stencil) -> shape) #define hypre_StructStencilSize(stencil) ((stencil) -> size) #define hypre_StructStencilNDim(stencil) ((stencil) -> ndim) #define hypre_StructStencilRefCount(stencil) ((stencil) -> ref_count) #define hypre_StructStencilElement(stencil, i) hypre_StructStencilShape(stencil)[i] #endif /****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #ifndef hypre_COMMUNICATION_HEADER #define hypre_COMMUNICATION_HEADER /*-------------------------------------------------------------------------- * hypre_CommInfo: * * For "reverse" communication, send_transforms is not needed (may be NULL). * For "forward" communication, recv_transforms is not needed (may be NULL). *--------------------------------------------------------------------------*/ typedef struct hypre_CommInfo_struct { HYPRE_Int ndim; hypre_BoxArrayArray *send_boxes; hypre_Index send_stride; HYPRE_Int **send_processes; HYPRE_Int **send_rboxnums; hypre_BoxArrayArray *send_rboxes; /* send_boxes, some with periodic shift */ hypre_BoxArrayArray *recv_boxes; hypre_Index recv_stride; HYPRE_Int **recv_processes; HYPRE_Int **recv_rboxnums; hypre_BoxArrayArray *recv_rboxes; /* recv_boxes, some with periodic shift */ HYPRE_Int num_transforms; /* may be 0 = identity transform */ hypre_Index *coords; /* may be NULL = identity transform */ hypre_Index *dirs; /* may be NULL = identity transform */ HYPRE_Int **send_transforms; /* may be NULL = identity transform */ HYPRE_Int **recv_transforms; /* may be NULL = identity transform */ HYPRE_Int boxes_match; /* true (>0) if each send box has a * matching box on the recv processor */ } hypre_CommInfo; /*-------------------------------------------------------------------------- * hypre_CommEntryType: *--------------------------------------------------------------------------*/ typedef struct hypre_CommEntryType_struct { HYPRE_Int offset; /* offset for the data */ HYPRE_Int dim; /* dimension of the communication */ HYPRE_Int length_array[HYPRE_MAXDIM]; /* last dim has length num_values */ HYPRE_Int stride_array[HYPRE_MAXDIM + 1]; HYPRE_Int *order; /* order of last dim values */ } hypre_CommEntryType; /*-------------------------------------------------------------------------- * hypre_CommType: *--------------------------------------------------------------------------*/ typedef struct hypre_CommType_struct { HYPRE_Int proc; HYPRE_Int bufsize; /* message buffer size (in doubles) */ HYPRE_Int num_entries; hypre_CommEntryType *entries; /* this is only needed until first send buffer prefix is packed */ HYPRE_Int *rem_boxnums; /* entry remote box numbers */ hypre_Box *rem_boxes; /* entry remote boxes */ } hypre_CommType; /*-------------------------------------------------------------------------- * hypre_CommPkg: * Structure containing information for doing communications *--------------------------------------------------------------------------*/ typedef struct hypre_CommPkg_struct { MPI_Comm comm; /* is this the first communication? */ HYPRE_Int first_comm; HYPRE_Int ndim; HYPRE_Int num_values; hypre_Index send_stride; hypre_Index recv_stride; /* total send buffer size (in doubles) */ HYPRE_Int send_bufsize; /* total recv buffer size (in doubles) */ HYPRE_Int recv_bufsize; /* total send buffer size (in doubles) at the first comm. */ HYPRE_Int send_bufsize_first_comm; /* total recv buffer size (in doubles) at the first comm. */ HYPRE_Int recv_bufsize_first_comm; HYPRE_Int num_sends; HYPRE_Int num_recvs; hypre_CommType *send_types; hypre_CommType *recv_types; hypre_CommType *copy_from_type; hypre_CommType *copy_to_type; /* these pointers are just to help free up memory for send/from types */ hypre_CommEntryType *entries; HYPRE_Int *rem_boxnums; hypre_Box *rem_boxes; HYPRE_Int num_orders; /* num_orders x num_values */ HYPRE_Int **orders; /* offsets into recv data (by box) */ HYPRE_Int *recv_data_offsets; /* recv data dimensions (by box) */ hypre_BoxArray *recv_data_space; hypre_Index identity_coord; hypre_Index identity_dir; HYPRE_Int *identity_order; } hypre_CommPkg; /*-------------------------------------------------------------------------- * CommHandle: *--------------------------------------------------------------------------*/ typedef struct hypre_CommHandle_struct { hypre_CommPkg *comm_pkg; HYPRE_Complex *send_data; HYPRE_Complex *recv_data; HYPRE_Int num_requests; hypre_MPI_Request *requests; hypre_MPI_Status *status; HYPRE_Complex **send_buffers; HYPRE_Complex **recv_buffers; HYPRE_Complex **send_buffers_mpi; HYPRE_Complex **recv_buffers_mpi; /* set = 0, add = 1 */ HYPRE_Int action; } hypre_CommHandle; /*-------------------------------------------------------------------------- * Accessor macros: hypre_CommInto *--------------------------------------------------------------------------*/ #define hypre_CommInfoNDim(info) (info -> ndim) #define hypre_CommInfoSendBoxes(info) (info -> send_boxes) #define hypre_CommInfoSendStride(info) (info -> send_stride) #define hypre_CommInfoSendProcesses(info) (info -> send_processes) #define hypre_CommInfoSendRBoxnums(info) (info -> send_rboxnums) #define hypre_CommInfoSendRBoxes(info) (info -> send_rboxes) #define hypre_CommInfoRecvBoxes(info) (info -> recv_boxes) #define hypre_CommInfoRecvStride(info) (info -> recv_stride) #define hypre_CommInfoRecvProcesses(info) (info -> recv_processes) #define hypre_CommInfoRecvRBoxnums(info) (info -> recv_rboxnums) #define hypre_CommInfoRecvRBoxes(info) (info -> recv_rboxes) #define hypre_CommInfoNumTransforms(info) (info -> num_transforms) #define hypre_CommInfoCoords(info) (info -> coords) #define hypre_CommInfoDirs(info) (info -> dirs) #define hypre_CommInfoSendTransforms(info) (info -> send_transforms) #define hypre_CommInfoRecvTransforms(info) (info -> recv_transforms) #define hypre_CommInfoBoxesMatch(info) (info -> boxes_match) /*-------------------------------------------------------------------------- * Accessor macros: hypre_CommEntryType *--------------------------------------------------------------------------*/ #define hypre_CommEntryTypeOffset(entry) (entry -> offset) #define hypre_CommEntryTypeDim(entry) (entry -> dim) #define hypre_CommEntryTypeLengthArray(entry) (entry -> length_array) #define hypre_CommEntryTypeStrideArray(entry) (entry -> stride_array) #define hypre_CommEntryTypeOrder(entry) (entry -> order) /*-------------------------------------------------------------------------- * Accessor macros: hypre_CommType *--------------------------------------------------------------------------*/ #define hypre_CommTypeProc(type) (type -> proc) #define hypre_CommTypeBufsize(type) (type -> bufsize) #define hypre_CommTypeNumEntries(type) (type -> num_entries) #define hypre_CommTypeEntries(type) (type -> entries) #define hypre_CommTypeEntry(type, i) (&(type -> entries[i])) #define hypre_CommTypeRemBoxnums(type) (type -> rem_boxnums) #define hypre_CommTypeRemBoxnum(type, i) (type -> rem_boxnums[i]) #define hypre_CommTypeRemBoxes(type) (type -> rem_boxes) #define hypre_CommTypeRemBox(type, i) (&(type -> rem_boxes[i])) /*-------------------------------------------------------------------------- * Accessor macros: hypre_CommPkg *--------------------------------------------------------------------------*/ #define hypre_CommPkgComm(comm_pkg) (comm_pkg -> comm) #define hypre_CommPkgFirstComm(comm_pkg) (comm_pkg -> first_comm) #define hypre_CommPkgNDim(comm_pkg) (comm_pkg -> ndim) #define hypre_CommPkgNumValues(comm_pkg) (comm_pkg -> num_values) #define hypre_CommPkgSendStride(comm_pkg) (comm_pkg -> send_stride) #define hypre_CommPkgRecvStride(comm_pkg) (comm_pkg -> recv_stride) #define hypre_CommPkgSendBufsize(comm_pkg) (comm_pkg -> send_bufsize) #define hypre_CommPkgRecvBufsize(comm_pkg) (comm_pkg -> recv_bufsize) #define hypre_CommPkgSendBufsizeFirstComm(comm_pkg) (comm_pkg -> send_bufsize_first_comm) #define hypre_CommPkgRecvBufsizeFirstComm(comm_pkg) (comm_pkg -> recv_bufsize_first_comm) #define hypre_CommPkgNumSends(comm_pkg) (comm_pkg -> num_sends) #define hypre_CommPkgNumRecvs(comm_pkg) (comm_pkg -> num_recvs) #define hypre_CommPkgSendTypes(comm_pkg) (comm_pkg -> send_types) #define hypre_CommPkgSendType(comm_pkg, i) (&(comm_pkg -> send_types[i])) #define hypre_CommPkgRecvTypes(comm_pkg) (comm_pkg -> recv_types) #define hypre_CommPkgRecvType(comm_pkg, i) (&(comm_pkg -> recv_types[i])) #define hypre_CommPkgCopyFromType(comm_pkg) (comm_pkg -> copy_from_type) #define hypre_CommPkgCopyToType(comm_pkg) (comm_pkg -> copy_to_type) #define hypre_CommPkgEntries(comm_pkg) (comm_pkg -> entries) #define hypre_CommPkgRemBoxnums(comm_pkg) (comm_pkg -> rem_boxnums) #define hypre_CommPkgRemBoxes(comm_pkg) (comm_pkg -> rem_boxes) #define hypre_CommPkgNumOrders(comm_pkg) (comm_pkg -> num_orders) #define hypre_CommPkgOrders(comm_pkg) (comm_pkg -> orders) #define hypre_CommPkgRecvDataOffsets(comm_pkg) (comm_pkg -> recv_data_offsets) #define hypre_CommPkgRecvDataSpace(comm_pkg) (comm_pkg -> recv_data_space) #define hypre_CommPkgIdentityCoord(comm_pkg) (comm_pkg -> identity_coord) #define hypre_CommPkgIdentityDir(comm_pkg) (comm_pkg -> identity_dir) #define hypre_CommPkgIdentityOrder(comm_pkg) (comm_pkg -> identity_order) /*-------------------------------------------------------------------------- * Accessor macros: hypre_CommHandle *--------------------------------------------------------------------------*/ #define hypre_CommHandleCommPkg(comm_handle) (comm_handle -> comm_pkg) #define hypre_CommHandleSendData(comm_handle) (comm_handle -> send_data) #define hypre_CommHandleRecvData(comm_handle) (comm_handle -> recv_data) #define hypre_CommHandleNumRequests(comm_handle) (comm_handle -> num_requests) #define hypre_CommHandleRequests(comm_handle) (comm_handle -> requests) #define hypre_CommHandleStatus(comm_handle) (comm_handle -> status) #define hypre_CommHandleSendBuffers(comm_handle) (comm_handle -> send_buffers) #define hypre_CommHandleRecvBuffers(comm_handle) (comm_handle -> recv_buffers) #define hypre_CommHandleAction(comm_handle) (comm_handle -> action) #define hypre_CommHandleSendBuffersMPI(comm_handle) (comm_handle -> send_buffers_mpi) #define hypre_CommHandleRecvBuffersMPI(comm_handle) (comm_handle -> recv_buffers_mpi) #endif /****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * Header info for computation * *****************************************************************************/ #ifndef hypre_COMPUTATION_HEADER #define hypre_COMPUTATION_HEADER /*-------------------------------------------------------------------------- * hypre_ComputeInfo: *--------------------------------------------------------------------------*/ typedef struct hypre_ComputeInfo_struct { hypre_CommInfo *comm_info; hypre_BoxArrayArray *indt_boxes; hypre_BoxArrayArray *dept_boxes; hypre_Index stride; } hypre_ComputeInfo; /*-------------------------------------------------------------------------- * hypre_ComputePkg: * Structure containing information for doing computations. *--------------------------------------------------------------------------*/ typedef struct hypre_ComputePkg_struct { hypre_CommPkg *comm_pkg; hypre_BoxArrayArray *indt_boxes; hypre_BoxArrayArray *dept_boxes; hypre_Index stride; hypre_StructGrid *grid; hypre_BoxArray *data_space; HYPRE_Int num_values; } hypre_ComputePkg; /*-------------------------------------------------------------------------- * Accessor macros: hypre_ComputeInfo *--------------------------------------------------------------------------*/ #define hypre_ComputeInfoCommInfo(info) (info -> comm_info) #define hypre_ComputeInfoIndtBoxes(info) (info -> indt_boxes) #define hypre_ComputeInfoDeptBoxes(info) (info -> dept_boxes) #define hypre_ComputeInfoStride(info) (info -> stride) /*-------------------------------------------------------------------------- * Accessor macros: hypre_ComputePkg *--------------------------------------------------------------------------*/ #define hypre_ComputePkgCommPkg(compute_pkg) (compute_pkg -> comm_pkg) #define hypre_ComputePkgIndtBoxes(compute_pkg) (compute_pkg -> indt_boxes) #define hypre_ComputePkgDeptBoxes(compute_pkg) (compute_pkg -> dept_boxes) #define hypre_ComputePkgStride(compute_pkg) (compute_pkg -> stride) #define hypre_ComputePkgGrid(compute_pkg) (compute_pkg -> grid) #define hypre_ComputePkgDataSpace(compute_pkg) (compute_pkg -> data_space) #define hypre_ComputePkgNumValues(compute_pkg) (compute_pkg -> num_values) #endif /****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * Header info for the hypre_StructMatrix structures * *****************************************************************************/ #ifndef hypre_STRUCT_MATRIX_HEADER #define hypre_STRUCT_MATRIX_HEADER /*-------------------------------------------------------------------------- * hypre_StructMatrix: *--------------------------------------------------------------------------*/ typedef struct hypre_StructMatrix_struct { MPI_Comm comm; hypre_StructGrid *grid; hypre_StructStencil *user_stencil; hypre_StructStencil *stencil; HYPRE_Int num_values; /* Number of "stored" coefficients */ hypre_BoxArray *data_space; HYPRE_MemoryLocation memory_location; /* memory location of data */ HYPRE_Complex *data; /* Pointer to variable matrix data */ HYPRE_Complex *data_const; /* Pointer to constant matrix data */ HYPRE_Complex **stencil_data; /* Pointer for each stencil */ HYPRE_Int data_alloced; /* Boolean used for freeing data */ HYPRE_Int data_size; /* Size of variable matrix data */ HYPRE_Int data_const_size; /* Size of constant matrix data */ HYPRE_Int **data_indices; /* num-boxes by stencil-size array of indices into the data array. data_indices[b][s] is the starting index of matrix data corresponding to box b and stencil coefficient s */ HYPRE_Int constant_coefficient; /* normally 0; set to 1 for constant coefficient matrices or 2 for constant coefficient with variable diagonal */ HYPRE_Int symmetric; /* Is the matrix symmetric */ HYPRE_Int *symm_elements; /* Which elements are "symmetric" */ HYPRE_Int num_ghost[2 * HYPRE_MAXDIM]; /* Num ghost layers in each direction */ HYPRE_BigInt global_size; /* Total number of nonzero coeffs */ hypre_CommPkg *comm_pkg; /* Info on how to update ghost data */ HYPRE_Int ref_count; } hypre_StructMatrix; /*-------------------------------------------------------------------------- * Accessor macros: hypre_StructMatrix *--------------------------------------------------------------------------*/ #define hypre_StructMatrixComm(matrix) ((matrix) -> comm) #define hypre_StructMatrixGrid(matrix) ((matrix) -> grid) #define hypre_StructMatrixUserStencil(matrix) ((matrix) -> user_stencil) #define hypre_StructMatrixStencil(matrix) ((matrix) -> stencil) #define hypre_StructMatrixNumValues(matrix) ((matrix) -> num_values) #define hypre_StructMatrixDataSpace(matrix) ((matrix) -> data_space) #define hypre_StructMatrixMemoryLocation(matrix) ((matrix) -> memory_location) #define hypre_StructMatrixData(matrix) ((matrix) -> data) #define hypre_StructMatrixDataConst(matrix) ((matrix) -> data_const) #define hypre_StructMatrixStencilData(matrix) ((matrix) -> stencil_data) #define hypre_StructMatrixDataAlloced(matrix) ((matrix) -> data_alloced) #define hypre_StructMatrixDataSize(matrix) ((matrix) -> data_size) #define hypre_StructMatrixDataConstSize(matrix) ((matrix) -> data_const_size) #define hypre_StructMatrixDataIndices(matrix) ((matrix) -> data_indices) #define hypre_StructMatrixConstantCoefficient(matrix) ((matrix) -> constant_coefficient) #define hypre_StructMatrixSymmetric(matrix) ((matrix) -> symmetric) #define hypre_StructMatrixSymmElements(matrix) ((matrix) -> symm_elements) #define hypre_StructMatrixNumGhost(matrix) ((matrix) -> num_ghost) #define hypre_StructMatrixGlobalSize(matrix) ((matrix) -> global_size) #define hypre_StructMatrixCommPkg(matrix) ((matrix) -> comm_pkg) #define hypre_StructMatrixRefCount(matrix) ((matrix) -> ref_count) #define hypre_StructMatrixNDim(matrix) \ hypre_StructGridNDim(hypre_StructMatrixGrid(matrix)) #define hypre_StructMatrixBox(matrix, b) \ hypre_BoxArrayBox(hypre_StructMatrixDataSpace(matrix), b) #define hypre_StructMatrixBoxData(matrix, b, s) \ (hypre_StructMatrixStencilData(matrix)[s] + hypre_StructMatrixDataIndices(matrix)[b][s]) #define hypre_StructMatrixBoxDataValue(matrix, b, s, index) \ (hypre_StructMatrixBoxData(matrix, b, s) + \ hypre_BoxIndexRank(hypre_StructMatrixBox(matrix, b), index)) #define hypre_CCStructMatrixBoxDataValue(matrix, b, s, index) \ (hypre_StructMatrixBoxData(matrix, b, s) + \ hypre_CCBoxIndexRank(hypre_StructMatrixBox(matrix, b), index)) #endif /****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * Header info for the hypre_StructVector structures * *****************************************************************************/ #ifndef hypre_STRUCT_VECTOR_HEADER #define hypre_STRUCT_VECTOR_HEADER /*-------------------------------------------------------------------------- * hypre_StructVector: *--------------------------------------------------------------------------*/ typedef struct hypre_StructVector_struct { MPI_Comm comm; hypre_StructGrid *grid; hypre_BoxArray *data_space; HYPRE_MemoryLocation memory_location; /* memory location of data */ HYPRE_Complex *data; /* Pointer to vector data on device*/ HYPRE_Int data_alloced; /* Boolean used for freeing data */ HYPRE_Int data_size; /* Size of vector data */ HYPRE_Int *data_indices; /* num-boxes array of indices into the data array. data_indices[b] is the starting index of vector data corresponding to box b. */ HYPRE_Int num_ghost[2 * HYPRE_MAXDIM]; /* Num ghost layers in each * direction */ HYPRE_Int bghost_not_clear; /* Are boundary ghosts clear? */ HYPRE_BigInt global_size; /* Total number coefficients */ HYPRE_Int ref_count; } hypre_StructVector; /*-------------------------------------------------------------------------- * Accessor macros: hypre_StructVector *--------------------------------------------------------------------------*/ #define hypre_StructVectorComm(vector) ((vector) -> comm) #define hypre_StructVectorGrid(vector) ((vector) -> grid) #define hypre_StructVectorDataSpace(vector) ((vector) -> data_space) #define hypre_StructVectorMemoryLocation(vector) ((vector) -> memory_location) #define hypre_StructVectorData(vector) ((vector) -> data) #define hypre_StructVectorDataAlloced(vector) ((vector) -> data_alloced) #define hypre_StructVectorDataSize(vector) ((vector) -> data_size) #define hypre_StructVectorDataIndices(vector) ((vector) -> data_indices) #define hypre_StructVectorNumGhost(vector) ((vector) -> num_ghost) #define hypre_StructVectorBGhostNotClear(vector) ((vector) -> bghost_not_clear) #define hypre_StructVectorGlobalSize(vector) ((vector) -> global_size) #define hypre_StructVectorRefCount(vector) ((vector) -> ref_count) #define hypre_StructVectorNDim(vector) \ hypre_StructGridNDim(hypre_StructVectorGrid(vector)) #define hypre_StructVectorBox(vector, b) \ hypre_BoxArrayBox(hypre_StructVectorDataSpace(vector), b) #define hypre_StructVectorBoxData(vector, b) \ (hypre_StructVectorData(vector) + hypre_StructVectorDataIndices(vector)[b]) #define hypre_StructVectorBoxDataValue(vector, b, index) \ (hypre_StructVectorBoxData(vector, b) + \ hypre_BoxIndexRank(hypre_StructVectorBox(vector, b), index)) #endif /****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /* assumed_part.c */ HYPRE_Int hypre_APSubdivideRegion ( hypre_Box *region, HYPRE_Int dim, HYPRE_Int level, hypre_BoxArray *box_array, HYPRE_Int *num_new_boxes ); HYPRE_Int hypre_APFindMyBoxesInRegions ( hypre_BoxArray *region_array, hypre_BoxArray *my_box_array, HYPRE_Int **p_count_array, HYPRE_Real **p_vol_array ); HYPRE_Int hypre_APGetAllBoxesInRegions ( hypre_BoxArray *region_array, hypre_BoxArray *my_box_array, HYPRE_Int **p_count_array, HYPRE_Real **p_vol_array, MPI_Comm comm ); HYPRE_Int hypre_APShrinkRegions ( hypre_BoxArray *region_array, hypre_BoxArray *my_box_array, MPI_Comm comm ); HYPRE_Int hypre_APPruneRegions ( hypre_BoxArray *region_array, HYPRE_Int **p_count_array, HYPRE_Real **p_vol_array ); HYPRE_Int hypre_APRefineRegionsByVol ( hypre_BoxArray *region_array, HYPRE_Real *vol_array, HYPRE_Int max_regions, HYPRE_Real gamma, HYPRE_Int dim, HYPRE_Int *return_code, MPI_Comm comm ); HYPRE_Int hypre_StructAssumedPartitionCreate ( HYPRE_Int dim, hypre_Box *bounding_box, HYPRE_Real global_boxes_size, HYPRE_Int global_num_boxes, hypre_BoxArray *local_boxes, HYPRE_Int *local_boxnums, HYPRE_Int max_regions, HYPRE_Int max_refinements, HYPRE_Real gamma, MPI_Comm comm, hypre_StructAssumedPart **p_assumed_partition ); HYPRE_Int hypre_StructAssumedPartitionDestroy ( hypre_StructAssumedPart *assumed_part ); HYPRE_Int hypre_APFillResponseStructAssumedPart ( void *p_recv_contact_buf, HYPRE_Int contact_size, HYPRE_Int contact_proc, void *ro, MPI_Comm comm, void **p_send_response_buf, HYPRE_Int *response_message_size ); HYPRE_Int hypre_StructAssumedPartitionGetRegionsFromProc ( hypre_StructAssumedPart *assumed_part, HYPRE_Int proc_id, hypre_BoxArray *assumed_regions ); HYPRE_Int hypre_StructAssumedPartitionGetProcsFromBox ( hypre_StructAssumedPart *assumed_part, hypre_Box *box, HYPRE_Int *num_proc_array, HYPRE_Int *size_alloc_proc_array, HYPRE_Int **p_proc_array ); /* box_algebra.c */ HYPRE_Int hypre_IntersectBoxes ( hypre_Box *box1, hypre_Box *box2, hypre_Box *ibox ); HYPRE_Int hypre_SubtractBoxes ( hypre_Box *box1, hypre_Box *box2, hypre_BoxArray *box_array ); HYPRE_Int hypre_SubtractBoxArrays ( hypre_BoxArray *box_array1, hypre_BoxArray *box_array2, hypre_BoxArray *tmp_box_array ); HYPRE_Int hypre_UnionBoxes ( hypre_BoxArray *boxes ); HYPRE_Int hypre_MinUnionBoxes ( hypre_BoxArray *boxes ); /* box_boundary.c */ HYPRE_Int hypre_BoxBoundaryIntersect ( hypre_Box *box, hypre_StructGrid *grid, HYPRE_Int d, HYPRE_Int dir, hypre_BoxArray *boundary ); HYPRE_Int hypre_BoxBoundaryG ( hypre_Box *box, hypre_StructGrid *g, hypre_BoxArray *boundary ); HYPRE_Int hypre_BoxBoundaryDG ( hypre_Box *box, hypre_StructGrid *g, hypre_BoxArray *boundarym, hypre_BoxArray *boundaryp, HYPRE_Int d ); HYPRE_Int hypre_GeneralBoxBoundaryIntersect( hypre_Box *box, hypre_StructGrid *grid, hypre_Index stencil_element, hypre_BoxArray *boundary ); /* box.c */ HYPRE_Int hypre_SetIndex ( hypre_Index index, HYPRE_Int val ); HYPRE_Int hypre_CopyIndex( hypre_Index in_index, hypre_Index out_index ); HYPRE_Int hypre_CopyToCleanIndex( hypre_Index in_index, HYPRE_Int ndim, hypre_Index out_index ); HYPRE_Int hypre_IndexEqual ( hypre_Index index, HYPRE_Int val, HYPRE_Int ndim ); HYPRE_Int hypre_IndexMin( hypre_Index index, HYPRE_Int ndim ); HYPRE_Int hypre_IndexMax( hypre_Index index, HYPRE_Int ndim ); HYPRE_Int hypre_AddIndexes ( hypre_Index index1, hypre_Index index2, HYPRE_Int ndim, hypre_Index result ); HYPRE_Int hypre_SubtractIndexes ( hypre_Index index1, hypre_Index index2, HYPRE_Int ndim, hypre_Index result ); HYPRE_Int hypre_IndexesEqual ( hypre_Index index1, hypre_Index index2, HYPRE_Int ndim ); HYPRE_Int hypre_IndexPrint ( FILE *file, HYPRE_Int ndim, hypre_Index index ); HYPRE_Int hypre_IndexRead ( FILE *file, HYPRE_Int ndim, hypre_Index index ); hypre_Box *hypre_BoxCreate ( HYPRE_Int ndim ); HYPRE_Int hypre_BoxDestroy ( hypre_Box *box ); HYPRE_Int hypre_BoxInit( hypre_Box *box, HYPRE_Int ndim ); HYPRE_Int hypre_BoxSetExtents ( hypre_Box *box, hypre_Index imin, hypre_Index imax ); HYPRE_Int hypre_CopyBox( hypre_Box *box1, hypre_Box *box2 ); hypre_Box *hypre_BoxDuplicate ( hypre_Box *box ); HYPRE_Int hypre_BoxVolume( hypre_Box *box ); HYPRE_Real hypre_doubleBoxVolume( hypre_Box *box ); HYPRE_Int hypre_IndexInBox ( hypre_Index index, hypre_Box *box ); HYPRE_Int hypre_BoxGetSize ( hypre_Box *box, hypre_Index size ); HYPRE_Int hypre_BoxGetStrideSize ( hypre_Box *box, hypre_Index stride, hypre_Index size ); HYPRE_Int hypre_BoxGetStrideVolume ( hypre_Box *box, hypre_Index stride, HYPRE_Int *volume_ptr ); HYPRE_Int hypre_BoxIndexRank( hypre_Box *box, hypre_Index index ); HYPRE_Int hypre_BoxRankIndex( hypre_Box *box, HYPRE_Int rank, hypre_Index index ); HYPRE_Int hypre_BoxOffsetDistance( hypre_Box *box, hypre_Index index ); HYPRE_Int hypre_BoxShiftPos( hypre_Box *box, hypre_Index shift ); HYPRE_Int hypre_BoxShiftNeg( hypre_Box *box, hypre_Index shift ); HYPRE_Int hypre_BoxGrowByIndex( hypre_Box *box, hypre_Index index ); HYPRE_Int hypre_BoxGrowByValue( hypre_Box *box, HYPRE_Int val ); HYPRE_Int hypre_BoxGrowByArray ( hypre_Box *box, HYPRE_Int *array ); HYPRE_Int hypre_BoxPrint ( FILE *file, hypre_Box *box ); HYPRE_Int hypre_BoxRead ( FILE *file, HYPRE_Int ndim, hypre_Box **box_ptr ); hypre_BoxArray *hypre_BoxArrayCreate ( HYPRE_Int size, HYPRE_Int ndim ); HYPRE_Int hypre_BoxArrayDestroy ( hypre_BoxArray *box_array ); HYPRE_Int hypre_BoxArraySetSize ( hypre_BoxArray *box_array, HYPRE_Int size ); hypre_BoxArray *hypre_BoxArrayDuplicate ( hypre_BoxArray *box_array ); HYPRE_Int hypre_AppendBox ( hypre_Box *box, hypre_BoxArray *box_array ); HYPRE_Int hypre_DeleteBox ( hypre_BoxArray *box_array, HYPRE_Int index ); HYPRE_Int hypre_DeleteMultipleBoxes ( hypre_BoxArray *box_array, HYPRE_Int *indices, HYPRE_Int num ); HYPRE_Int hypre_AppendBoxArray ( hypre_BoxArray *box_array_0, hypre_BoxArray *box_array_1 ); hypre_BoxArrayArray *hypre_BoxArrayArrayCreate ( HYPRE_Int size, HYPRE_Int ndim ); HYPRE_Int hypre_BoxArrayArrayDestroy ( hypre_BoxArrayArray *box_array_array ); hypre_BoxArrayArray *hypre_BoxArrayArrayDuplicate ( hypre_BoxArrayArray *box_array_array ); /* box_manager.c */ HYPRE_Int hypre_BoxManEntryGetInfo ( hypre_BoxManEntry *entry, void **info_ptr ); HYPRE_Int hypre_BoxManEntryGetExtents ( hypre_BoxManEntry *entry, hypre_Index imin, hypre_Index imax ); HYPRE_Int hypre_BoxManEntryCopy ( hypre_BoxManEntry *fromentry, hypre_BoxManEntry *toentry ); HYPRE_Int hypre_BoxManSetAllGlobalKnown ( hypre_BoxManager *manager, HYPRE_Int known ); HYPRE_Int hypre_BoxManGetAllGlobalKnown ( hypre_BoxManager *manager, HYPRE_Int *known ); HYPRE_Int hypre_BoxManSetIsEntriesSort ( hypre_BoxManager *manager, HYPRE_Int is_sort ); HYPRE_Int hypre_BoxManGetIsEntriesSort ( hypre_BoxManager *manager, HYPRE_Int *is_sort ); HYPRE_Int hypre_BoxManGetGlobalIsGatherCalled ( hypre_BoxManager *manager, MPI_Comm comm, HYPRE_Int *is_gather ); HYPRE_Int hypre_BoxManGetAssumedPartition ( hypre_BoxManager *manager, hypre_StructAssumedPart **assumed_partition ); HYPRE_Int hypre_BoxManSetAssumedPartition ( hypre_BoxManager *manager, hypre_StructAssumedPart *assumed_partition ); HYPRE_Int hypre_BoxManSetBoundingBox ( hypre_BoxManager *manager, hypre_Box *bounding_box ); HYPRE_Int hypre_BoxManSetNumGhost ( hypre_BoxManager *manager, HYPRE_Int *num_ghost ); HYPRE_Int hypre_BoxManDeleteMultipleEntriesAndInfo ( hypre_BoxManager *manager, HYPRE_Int *indices, HYPRE_Int num ); HYPRE_Int hypre_BoxManCreate ( HYPRE_Int max_nentries, HYPRE_Int info_size, HYPRE_Int dim, hypre_Box *bounding_box, MPI_Comm comm, hypre_BoxManager **manager_ptr ); HYPRE_Int hypre_BoxManIncSize ( hypre_BoxManager *manager, HYPRE_Int inc_size ); HYPRE_Int hypre_BoxManDestroy ( hypre_BoxManager *manager ); HYPRE_Int hypre_BoxManAddEntry ( hypre_BoxManager *manager, hypre_Index imin, hypre_Index imax, HYPRE_Int proc_id, HYPRE_Int box_id, void *info ); HYPRE_Int hypre_BoxManGetEntry ( hypre_BoxManager *manager, HYPRE_Int proc, HYPRE_Int id, hypre_BoxManEntry **entry_ptr ); HYPRE_Int hypre_BoxManGetAllEntries ( hypre_BoxManager *manager, HYPRE_Int *num_entries, hypre_BoxManEntry **entries ); HYPRE_Int hypre_BoxManGetAllEntriesBoxes ( hypre_BoxManager *manager, hypre_BoxArray *boxes ); HYPRE_Int hypre_BoxManGetLocalEntriesBoxes ( hypre_BoxManager *manager, hypre_BoxArray *boxes ); HYPRE_Int hypre_BoxManGetAllEntriesBoxesProc ( hypre_BoxManager *manager, hypre_BoxArray *boxes, HYPRE_Int **procs_ptr ); HYPRE_Int hypre_BoxManGatherEntries ( hypre_BoxManager *manager, hypre_Index imin, hypre_Index imax ); HYPRE_Int hypre_BoxManAssemble ( hypre_BoxManager *manager ); HYPRE_Int hypre_BoxManIntersect ( hypre_BoxManager *manager, hypre_Index ilower, hypre_Index iupper, hypre_BoxManEntry ***entries_ptr, HYPRE_Int *nentries_ptr ); HYPRE_Int hypre_FillResponseBoxManAssemble1 ( void *p_recv_contact_buf, HYPRE_Int contact_size, HYPRE_Int contact_proc, void *ro, MPI_Comm comm, void **p_send_response_buf, HYPRE_Int *response_message_size ); HYPRE_Int hypre_FillResponseBoxManAssemble2 ( void *p_recv_contact_buf, HYPRE_Int contact_size, HYPRE_Int contact_proc, void *ro, MPI_Comm comm, void **p_send_response_buf, HYPRE_Int *response_message_size ); /* communication_info.c */ HYPRE_Int hypre_CommInfoCreate ( hypre_BoxArrayArray *send_boxes, hypre_BoxArrayArray *recv_boxes, HYPRE_Int **send_procs, HYPRE_Int **recv_procs, HYPRE_Int **send_rboxnums, HYPRE_Int **recv_rboxnums, hypre_BoxArrayArray *send_rboxes, hypre_BoxArrayArray *recv_rboxes, HYPRE_Int boxes_match, hypre_CommInfo **comm_info_ptr ); HYPRE_Int hypre_CommInfoSetTransforms ( hypre_CommInfo *comm_info, HYPRE_Int num_transforms, hypre_Index *coords, hypre_Index *dirs, HYPRE_Int **send_transforms, HYPRE_Int **recv_transforms ); HYPRE_Int hypre_CommInfoGetTransforms ( hypre_CommInfo *comm_info, HYPRE_Int *num_transforms, hypre_Index **coords, hypre_Index **dirs ); HYPRE_Int hypre_CommInfoProjectSend ( hypre_CommInfo *comm_info, hypre_Index index, hypre_Index stride ); HYPRE_Int hypre_CommInfoProjectRecv ( hypre_CommInfo *comm_info, hypre_Index index, hypre_Index stride ); HYPRE_Int hypre_CommInfoDestroy ( hypre_CommInfo *comm_info ); HYPRE_Int hypre_CreateCommInfoFromStencil ( hypre_StructGrid *grid, hypre_StructStencil *stencil, hypre_CommInfo **comm_info_ptr ); HYPRE_Int hypre_CreateCommInfoFromNumGhost ( hypre_StructGrid *grid, HYPRE_Int *num_ghost, hypre_CommInfo **comm_info_ptr ); HYPRE_Int hypre_CreateCommInfoFromGrids ( hypre_StructGrid *from_grid, hypre_StructGrid *to_grid, hypre_CommInfo **comm_info_ptr ); /* computation.c */ HYPRE_Int hypre_ComputeInfoCreate ( hypre_CommInfo *comm_info, hypre_BoxArrayArray *indt_boxes, hypre_BoxArrayArray *dept_boxes, hypre_ComputeInfo **compute_info_ptr ); HYPRE_Int hypre_ComputeInfoProjectSend ( hypre_ComputeInfo *compute_info, hypre_Index index, hypre_Index stride ); HYPRE_Int hypre_ComputeInfoProjectRecv ( hypre_ComputeInfo *compute_info, hypre_Index index, hypre_Index stride ); HYPRE_Int hypre_ComputeInfoProjectComp ( hypre_ComputeInfo *compute_info, hypre_Index index, hypre_Index stride ); HYPRE_Int hypre_ComputeInfoDestroy ( hypre_ComputeInfo *compute_info ); HYPRE_Int hypre_CreateComputeInfo ( hypre_StructGrid *grid, hypre_StructStencil *stencil, hypre_ComputeInfo **compute_info_ptr ); HYPRE_Int hypre_ComputePkgCreate ( hypre_ComputeInfo *compute_info, hypre_BoxArray *data_space, HYPRE_Int num_values, hypre_StructGrid *grid, hypre_ComputePkg **compute_pkg_ptr ); HYPRE_Int hypre_ComputePkgDestroy ( hypre_ComputePkg *compute_pkg ); HYPRE_Int hypre_InitializeIndtComputations ( hypre_ComputePkg *compute_pkg, HYPRE_Complex *data, hypre_CommHandle **comm_handle_ptr ); HYPRE_Int hypre_FinalizeIndtComputations ( hypre_CommHandle *comm_handle ); /* HYPRE_struct_grid.c */ HYPRE_Int HYPRE_StructGridCreate ( MPI_Comm comm, HYPRE_Int dim, HYPRE_StructGrid *grid ); HYPRE_Int HYPRE_StructGridDestroy ( HYPRE_StructGrid grid ); HYPRE_Int HYPRE_StructGridSetExtents ( HYPRE_StructGrid grid, HYPRE_Int *ilower, HYPRE_Int *iupper ); HYPRE_Int HYPRE_StructGridSetPeriodic ( HYPRE_StructGrid grid, HYPRE_Int *periodic ); HYPRE_Int HYPRE_StructGridAssemble ( HYPRE_StructGrid grid ); HYPRE_Int HYPRE_StructGridSetNumGhost ( HYPRE_StructGrid grid, HYPRE_Int *num_ghost ); /* HYPRE_struct_matrix.c */ HYPRE_Int HYPRE_StructMatrixCreate ( MPI_Comm comm, HYPRE_StructGrid grid, HYPRE_StructStencil stencil, HYPRE_StructMatrix *matrix ); HYPRE_Int HYPRE_StructMatrixDestroy ( HYPRE_StructMatrix matrix ); HYPRE_Int HYPRE_StructMatrixInitialize ( HYPRE_StructMatrix matrix ); HYPRE_Int HYPRE_StructMatrixSetValues ( HYPRE_StructMatrix matrix, HYPRE_Int *grid_index, HYPRE_Int num_stencil_indices, HYPRE_Int *stencil_indices, HYPRE_Complex *values ); HYPRE_Int HYPRE_StructMatrixGetValues ( HYPRE_StructMatrix matrix, HYPRE_Int *grid_index, HYPRE_Int num_stencil_indices, HYPRE_Int *stencil_indices, HYPRE_Complex *values ); HYPRE_Int HYPRE_StructMatrixSetBoxValues ( HYPRE_StructMatrix matrix, HYPRE_Int *ilower, HYPRE_Int *iupper, HYPRE_Int num_stencil_indices, HYPRE_Int *stencil_indices, HYPRE_Complex *values ); HYPRE_Int HYPRE_StructMatrixGetBoxValues ( HYPRE_StructMatrix matrix, HYPRE_Int *ilower, HYPRE_Int *iupper, HYPRE_Int num_stencil_indices, HYPRE_Int *stencil_indices, HYPRE_Complex *values ); HYPRE_Int HYPRE_StructMatrixSetConstantValues ( HYPRE_StructMatrix matrix, HYPRE_Int num_stencil_indices, HYPRE_Int *stencil_indices, HYPRE_Complex *values ); HYPRE_Int HYPRE_StructMatrixAddToValues ( HYPRE_StructMatrix matrix, HYPRE_Int *grid_index, HYPRE_Int num_stencil_indices, HYPRE_Int *stencil_indices, HYPRE_Complex *values ); HYPRE_Int HYPRE_StructMatrixAddToBoxValues ( HYPRE_StructMatrix matrix, HYPRE_Int *ilower, HYPRE_Int *iupper, HYPRE_Int num_stencil_indices, HYPRE_Int *stencil_indices, HYPRE_Complex *values ); HYPRE_Int HYPRE_StructMatrixAddToConstantValues ( HYPRE_StructMatrix matrix, HYPRE_Int num_stencil_indices, HYPRE_Int *stencil_indices, HYPRE_Complex *values ); HYPRE_Int HYPRE_StructMatrixAssemble ( HYPRE_StructMatrix matrix ); HYPRE_Int HYPRE_StructMatrixSetNumGhost ( HYPRE_StructMatrix matrix, HYPRE_Int *num_ghost ); HYPRE_Int HYPRE_StructMatrixGetGrid ( HYPRE_StructMatrix matrix, HYPRE_StructGrid *grid ); HYPRE_Int HYPRE_StructMatrixSetSymmetric ( HYPRE_StructMatrix matrix, HYPRE_Int symmetric ); HYPRE_Int HYPRE_StructMatrixSetConstantEntries ( HYPRE_StructMatrix matrix, HYPRE_Int nentries, HYPRE_Int *entries ); HYPRE_Int HYPRE_StructMatrixPrint ( const char *filename, HYPRE_StructMatrix matrix, HYPRE_Int all ); HYPRE_Int HYPRE_StructMatrixMatvec ( HYPRE_Complex alpha, HYPRE_StructMatrix A, HYPRE_StructVector x, HYPRE_Complex beta, HYPRE_StructVector y ); HYPRE_Int HYPRE_StructMatrixClearBoundary( HYPRE_StructMatrix matrix ); /* HYPRE_struct_stencil.c */ HYPRE_Int HYPRE_StructStencilCreate ( HYPRE_Int dim, HYPRE_Int size, HYPRE_StructStencil *stencil ); HYPRE_Int HYPRE_StructStencilSetElement ( HYPRE_StructStencil stencil, HYPRE_Int element_index, HYPRE_Int *offset ); HYPRE_Int HYPRE_StructStencilDestroy ( HYPRE_StructStencil stencil ); /* HYPRE_struct_vector.c */ HYPRE_Int HYPRE_StructVectorCreate ( MPI_Comm comm, HYPRE_StructGrid grid, HYPRE_StructVector *vector ); HYPRE_Int HYPRE_StructVectorDestroy ( HYPRE_StructVector struct_vector ); HYPRE_Int HYPRE_StructVectorInitialize ( HYPRE_StructVector vector ); HYPRE_Int HYPRE_StructVectorSetValues ( HYPRE_StructVector vector, HYPRE_Int *grid_index, HYPRE_Complex values ); HYPRE_Int HYPRE_StructVectorSetBoxValues ( HYPRE_StructVector vector, HYPRE_Int *ilower, HYPRE_Int *iupper, HYPRE_Complex *values ); HYPRE_Int HYPRE_StructVectorAddToValues ( HYPRE_StructVector vector, HYPRE_Int *grid_index, HYPRE_Complex values ); HYPRE_Int HYPRE_StructVectorAddToBoxValues ( HYPRE_StructVector vector, HYPRE_Int *ilower, HYPRE_Int *iupper, HYPRE_Complex *values ); HYPRE_Int HYPRE_StructVectorScaleValues ( HYPRE_StructVector vector, HYPRE_Complex factor ); HYPRE_Int HYPRE_StructVectorGetValues ( HYPRE_StructVector vector, HYPRE_Int *grid_index, HYPRE_Complex *values ); HYPRE_Int HYPRE_StructVectorGetBoxValues ( HYPRE_StructVector vector, HYPRE_Int *ilower, HYPRE_Int *iupper, HYPRE_Complex *values ); HYPRE_Int HYPRE_StructVectorAssemble ( HYPRE_StructVector vector ); HYPRE_Int hypre_StructVectorPrintData ( FILE *file, hypre_StructVector *vector, HYPRE_Int all ); HYPRE_Int hypre_StructVectorReadData ( FILE *file, hypre_StructVector *vector ); HYPRE_Int HYPRE_StructVectorPrint ( const char *filename, HYPRE_StructVector vector, HYPRE_Int all ); HYPRE_Int HYPRE_StructVectorRead ( MPI_Comm comm, const char *filename, HYPRE_Int *num_ghost, HYPRE_StructVector *vector ); HYPRE_Int HYPRE_StructVectorSetNumGhost ( HYPRE_StructVector vector, HYPRE_Int *num_ghost ); HYPRE_Int HYPRE_StructVectorCopy ( HYPRE_StructVector x, HYPRE_StructVector y ); HYPRE_Int HYPRE_StructVectorSetConstantValues ( HYPRE_StructVector vector, HYPRE_Complex values ); HYPRE_Int HYPRE_StructVectorGetMigrateCommPkg ( HYPRE_StructVector from_vector, HYPRE_StructVector to_vector, HYPRE_CommPkg *comm_pkg ); HYPRE_Int HYPRE_StructVectorMigrate ( HYPRE_CommPkg comm_pkg, HYPRE_StructVector from_vector, HYPRE_StructVector to_vector ); HYPRE_Int HYPRE_CommPkgDestroy ( HYPRE_CommPkg comm_pkg ); /* project.c */ HYPRE_Int hypre_ProjectBox ( hypre_Box *box, hypre_Index index, hypre_Index stride ); HYPRE_Int hypre_ProjectBoxArray ( hypre_BoxArray *box_array, hypre_Index index, hypre_Index stride ); HYPRE_Int hypre_ProjectBoxArrayArray ( hypre_BoxArrayArray *box_array_array, hypre_Index index, hypre_Index stride ); /* struct_axpy.c */ HYPRE_Int hypre_StructAxpy ( HYPRE_Complex alpha, hypre_StructVector *x, hypre_StructVector *y ); /* struct_communication.c */ HYPRE_Int hypre_CommPkgCreate ( hypre_CommInfo *comm_info, hypre_BoxArray *send_data_space, hypre_BoxArray *recv_data_space, HYPRE_Int num_values, HYPRE_Int **orders, HYPRE_Int reverse, MPI_Comm comm, hypre_CommPkg **comm_pkg_ptr ); HYPRE_Int hypre_CommTypeSetEntries ( hypre_CommType *comm_type, HYPRE_Int *boxnums, hypre_Box *boxes, hypre_Index stride, hypre_Index coord, hypre_Index dir, HYPRE_Int *order, hypre_BoxArray *data_space, HYPRE_Int *data_offsets ); HYPRE_Int hypre_CommTypeSetEntry ( hypre_Box *box, hypre_Index stride, hypre_Index coord, hypre_Index dir, HYPRE_Int *order, hypre_Box *data_box, HYPRE_Int data_box_offset, hypre_CommEntryType *comm_entry ); HYPRE_Int hypre_InitializeCommunication ( hypre_CommPkg *comm_pkg, HYPRE_Complex *send_data, HYPRE_Complex *recv_data, HYPRE_Int action, HYPRE_Int tag, hypre_CommHandle **comm_handle_ptr ); HYPRE_Int hypre_FinalizeCommunication ( hypre_CommHandle *comm_handle ); HYPRE_Int hypre_ExchangeLocalData ( hypre_CommPkg *comm_pkg, HYPRE_Complex *send_data, HYPRE_Complex *recv_data, HYPRE_Int action ); HYPRE_Int hypre_CommPkgDestroy ( hypre_CommPkg *comm_pkg ); /* struct_copy.c */ HYPRE_Int hypre_StructCopy ( hypre_StructVector *x, hypre_StructVector *y ); HYPRE_Int hypre_StructPartialCopy ( hypre_StructVector *x, hypre_StructVector *y, hypre_BoxArrayArray *array_boxes ); /* struct_grid.c */ HYPRE_Int hypre_StructGridCreate ( MPI_Comm comm, HYPRE_Int dim, hypre_StructGrid **grid_ptr ); HYPRE_Int hypre_StructGridRef ( hypre_StructGrid *grid, hypre_StructGrid **grid_ref ); HYPRE_Int hypre_StructGridDestroy ( hypre_StructGrid *grid ); HYPRE_Int hypre_StructGridSetPeriodic ( hypre_StructGrid *grid, hypre_Index periodic ); HYPRE_Int hypre_StructGridSetExtents ( hypre_StructGrid *grid, hypre_Index ilower, hypre_Index iupper ); HYPRE_Int hypre_StructGridSetBoxes ( hypre_StructGrid *grid, hypre_BoxArray *boxes ); HYPRE_Int hypre_StructGridSetBoundingBox ( hypre_StructGrid *grid, hypre_Box *new_bb ); HYPRE_Int hypre_StructGridSetIDs ( hypre_StructGrid *grid, HYPRE_Int *ids ); HYPRE_Int hypre_StructGridSetBoxManager ( hypre_StructGrid *grid, hypre_BoxManager *boxman ); HYPRE_Int hypre_StructGridSetMaxDistance ( hypre_StructGrid *grid, hypre_Index dist ); HYPRE_Int hypre_StructGridAssemble ( hypre_StructGrid *grid ); HYPRE_Int hypre_GatherAllBoxes ( MPI_Comm comm, hypre_BoxArray *boxes, HYPRE_Int dim, hypre_BoxArray **all_boxes_ptr, HYPRE_Int **all_procs_ptr, HYPRE_Int *first_local_ptr ); HYPRE_Int hypre_ComputeBoxnums ( hypre_BoxArray *boxes, HYPRE_Int *procs, HYPRE_Int **boxnums_ptr ); HYPRE_Int hypre_StructGridPrint ( FILE *file, hypre_StructGrid *grid ); HYPRE_Int hypre_StructGridRead ( MPI_Comm comm, FILE *file, hypre_StructGrid **grid_ptr ); HYPRE_Int hypre_StructGridSetNumGhost ( hypre_StructGrid *grid, HYPRE_Int *num_ghost ); HYPRE_Int hypre_StructGridGetMaxBoxSize ( hypre_StructGrid *grid ); #if defined(HYPRE_USING_CUDA) || defined(HYPRE_USING_HIP) HYPRE_Int hypre_StructGridSetDataLocation( HYPRE_StructGrid grid, HYPRE_MemoryLocation data_location ); #endif /* struct_innerprod.c */ HYPRE_Real hypre_StructInnerProd ( hypre_StructVector *x, hypre_StructVector *y ); /* struct_io.c */ HYPRE_Int hypre_PrintBoxArrayData ( FILE *file, hypre_BoxArray *box_array, hypre_BoxArray *data_space, HYPRE_Int num_values, HYPRE_Int dim, HYPRE_Complex *data ); HYPRE_Int hypre_PrintCCVDBoxArrayData ( FILE *file, hypre_BoxArray *box_array, hypre_BoxArray *data_space, HYPRE_Int num_values, HYPRE_Int center_rank, HYPRE_Int stencil_size, HYPRE_Int *symm_elements, HYPRE_Int dim, HYPRE_Complex *data ); HYPRE_Int hypre_PrintCCBoxArrayData ( FILE *file, hypre_BoxArray *box_array, hypre_BoxArray *data_space, HYPRE_Int num_values, HYPRE_Complex *data ); HYPRE_Int hypre_ReadBoxArrayData ( FILE *file, hypre_BoxArray *box_array, hypre_BoxArray *data_space, HYPRE_Int num_values, HYPRE_Int dim, HYPRE_Complex *data ); HYPRE_Int hypre_ReadBoxArrayData_CC ( FILE *file, hypre_BoxArray *box_array, hypre_BoxArray *data_space, HYPRE_Int stencil_size, HYPRE_Int real_stencil_size, HYPRE_Int constant_coefficient, HYPRE_Int dim, HYPRE_Complex *data ); /* struct_matrix.c */ HYPRE_Complex *hypre_StructMatrixExtractPointerByIndex ( hypre_StructMatrix *matrix, HYPRE_Int b, hypre_Index index ); hypre_StructMatrix *hypre_StructMatrixCreate ( MPI_Comm comm, hypre_StructGrid *grid, hypre_StructStencil *user_stencil ); hypre_StructMatrix *hypre_StructMatrixRef ( hypre_StructMatrix *matrix ); HYPRE_Int hypre_StructMatrixDestroy ( hypre_StructMatrix *matrix ); HYPRE_Int hypre_StructMatrixInitializeShell ( hypre_StructMatrix *matrix ); HYPRE_Int hypre_StructMatrixInitializeData ( hypre_StructMatrix *matrix, HYPRE_Complex *data, HYPRE_Complex *data_const); HYPRE_Int hypre_StructMatrixInitialize ( hypre_StructMatrix *matrix ); HYPRE_Int hypre_StructMatrixSetValues ( hypre_StructMatrix *matrix, hypre_Index grid_index, HYPRE_Int num_stencil_indices, HYPRE_Int *stencil_indices, HYPRE_Complex *values, HYPRE_Int action, HYPRE_Int boxnum, HYPRE_Int outside ); HYPRE_Int hypre_StructMatrixSetBoxValues ( hypre_StructMatrix *matrix, hypre_Box *set_box, hypre_Box *value_box, HYPRE_Int num_stencil_indices, HYPRE_Int *stencil_indices, HYPRE_Complex *values, HYPRE_Int action, HYPRE_Int boxnum, HYPRE_Int outside ); HYPRE_Int hypre_StructMatrixSetConstantValues ( hypre_StructMatrix *matrix, HYPRE_Int num_stencil_indices, HYPRE_Int *stencil_indices, HYPRE_Complex *values, HYPRE_Int action ); HYPRE_Int hypre_StructMatrixClearValues ( hypre_StructMatrix *matrix, hypre_Index grid_index, HYPRE_Int num_stencil_indices, HYPRE_Int *stencil_indices, HYPRE_Int boxnum, HYPRE_Int outside ); HYPRE_Int hypre_StructMatrixClearBoxValues ( hypre_StructMatrix *matrix, hypre_Box *clear_box, HYPRE_Int num_stencil_indices, HYPRE_Int *stencil_indices, HYPRE_Int boxnum, HYPRE_Int outside ); HYPRE_Int hypre_StructMatrixAssemble ( hypre_StructMatrix *matrix ); HYPRE_Int hypre_StructMatrixSetNumGhost ( hypre_StructMatrix *matrix, HYPRE_Int *num_ghost ); HYPRE_Int hypre_StructMatrixSetConstantCoefficient ( hypre_StructMatrix *matrix, HYPRE_Int constant_coefficient ); HYPRE_Int hypre_StructMatrixSetConstantEntries ( hypre_StructMatrix *matrix, HYPRE_Int nentries, HYPRE_Int *entries ); HYPRE_Int hypre_StructMatrixClearGhostValues ( hypre_StructMatrix *matrix ); HYPRE_Int hypre_StructMatrixPrintData ( FILE *file, hypre_StructMatrix *matrix, HYPRE_Int all ); HYPRE_Int hypre_StructMatrixReadData ( FILE *file, hypre_StructMatrix *matrix ); HYPRE_Int hypre_StructMatrixPrint ( const char *filename, hypre_StructMatrix *matrix, HYPRE_Int all ); hypre_StructMatrix *hypre_StructMatrixRead ( MPI_Comm comm, const char *filename, HYPRE_Int *num_ghost ); HYPRE_Int hypre_StructMatrixMigrate ( hypre_StructMatrix *from_matrix, hypre_StructMatrix *to_matrix ); HYPRE_Int hypre_StructMatrixClearBoundary( hypre_StructMatrix *matrix); /* struct_matrix_mask.c */ hypre_StructMatrix *hypre_StructMatrixCreateMask ( hypre_StructMatrix *matrix, HYPRE_Int num_stencil_indices, HYPRE_Int *stencil_indices ); /* struct_matvec.c */ void *hypre_StructMatvecCreate ( void ); HYPRE_Int hypre_StructMatvecSetup ( void *matvec_vdata, hypre_StructMatrix *A, hypre_StructVector *x ); HYPRE_Int hypre_StructMatvecCompute ( void *matvec_vdata, HYPRE_Complex alpha, hypre_StructMatrix *A, hypre_StructVector *x, HYPRE_Complex beta, hypre_StructVector *y ); HYPRE_Int hypre_StructMatvecCC0 ( HYPRE_Complex alpha, hypre_StructMatrix *A, hypre_StructVector *x, hypre_StructVector *y, hypre_BoxArrayArray *compute_box_aa, hypre_IndexRef stride ); HYPRE_Int hypre_StructMatvecCC1 ( HYPRE_Complex alpha, hypre_StructMatrix *A, hypre_StructVector *x, hypre_StructVector *y, hypre_BoxArrayArray *compute_box_aa, hypre_IndexRef stride ); HYPRE_Int hypre_StructMatvecCC2 ( HYPRE_Complex alpha, hypre_StructMatrix *A, hypre_StructVector *x, hypre_StructVector *y, hypre_BoxArrayArray *compute_box_aa, hypre_IndexRef stride ); HYPRE_Int hypre_StructMatvecDestroy ( void *matvec_vdata ); HYPRE_Int hypre_StructMatvec ( HYPRE_Complex alpha, hypre_StructMatrix *A, hypre_StructVector *x, HYPRE_Complex beta, hypre_StructVector *y ); /* struct_scale.c */ HYPRE_Int hypre_StructScale ( HYPRE_Complex alpha, hypre_StructVector *y ); /* struct_stencil.c */ hypre_StructStencil *hypre_StructStencilCreate ( HYPRE_Int dim, HYPRE_Int size, hypre_Index *shape ); hypre_StructStencil *hypre_StructStencilRef ( hypre_StructStencil *stencil ); HYPRE_Int hypre_StructStencilDestroy ( hypre_StructStencil *stencil ); HYPRE_Int hypre_StructStencilElementRank ( hypre_StructStencil *stencil, hypre_Index stencil_element ); HYPRE_Int hypre_StructStencilSymmetrize ( hypre_StructStencil *stencil, hypre_StructStencil **symm_stencil_ptr, HYPRE_Int **symm_elements_ptr ); /* struct_vector.c */ hypre_StructVector *hypre_StructVectorCreate ( MPI_Comm comm, hypre_StructGrid *grid ); hypre_StructVector *hypre_StructVectorRef ( hypre_StructVector *vector ); HYPRE_Int hypre_StructVectorDestroy ( hypre_StructVector *vector ); HYPRE_Int hypre_StructVectorInitializeShell ( hypre_StructVector *vector ); HYPRE_Int hypre_StructVectorInitializeData ( hypre_StructVector *vector, HYPRE_Complex *data); HYPRE_Int hypre_StructVectorInitialize ( hypre_StructVector *vector ); HYPRE_Int hypre_StructVectorSetValues ( hypre_StructVector *vector, hypre_Index grid_index, HYPRE_Complex *values, HYPRE_Int action, HYPRE_Int boxnum, HYPRE_Int outside ); HYPRE_Int hypre_StructVectorSetBoxValues ( hypre_StructVector *vector, hypre_Box *set_box, hypre_Box *value_box, HYPRE_Complex *values, HYPRE_Int action, HYPRE_Int boxnum, HYPRE_Int outside ); HYPRE_Int hypre_StructVectorClearValues ( hypre_StructVector *vector, hypre_Index grid_index, HYPRE_Int boxnum, HYPRE_Int outside ); HYPRE_Int hypre_StructVectorClearBoxValues ( hypre_StructVector *vector, hypre_Box *clear_box, HYPRE_Int boxnum, HYPRE_Int outside ); HYPRE_Int hypre_StructVectorClearAllValues ( hypre_StructVector *vector ); HYPRE_Int hypre_StructVectorSetNumGhost ( hypre_StructVector *vector, HYPRE_Int *num_ghost ); HYPRE_Int hypre_StructVectorSetDataSize(hypre_StructVector *vector, HYPRE_Int *data_size, HYPRE_Int *data_host_size); HYPRE_Int hypre_StructVectorAssemble ( hypre_StructVector *vector ); HYPRE_Int hypre_StructVectorCopy ( hypre_StructVector *x, hypre_StructVector *y ); HYPRE_Int hypre_StructVectorSetConstantValues ( hypre_StructVector *vector, HYPRE_Complex values ); HYPRE_Int hypre_StructVectorSetFunctionValues ( hypre_StructVector *vector, HYPRE_Complex (*fcn )( HYPRE_Int, HYPRE_Int, HYPRE_Int )); HYPRE_Int hypre_StructVectorClearGhostValues ( hypre_StructVector *vector ); HYPRE_Int hypre_StructVectorClearBoundGhostValues ( hypre_StructVector *vector, HYPRE_Int force ); HYPRE_Int hypre_StructVectorScaleValues ( hypre_StructVector *vector, HYPRE_Complex factor ); hypre_CommPkg *hypre_StructVectorGetMigrateCommPkg ( hypre_StructVector *from_vector, hypre_StructVector *to_vector ); HYPRE_Int hypre_StructVectorMigrate ( hypre_CommPkg *comm_pkg, hypre_StructVector *from_vector, hypre_StructVector *to_vector ); HYPRE_Int hypre_StructVectorPrint ( const char *filename, hypre_StructVector *vector, HYPRE_Int all ); hypre_StructVector *hypre_StructVectorRead ( MPI_Comm comm, const char *filename, HYPRE_Int *num_ghost ); hypre_StructVector *hypre_StructVectorClone ( hypre_StructVector *vector ); /****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * Header info for the BoxLoop * *****************************************************************************/ /*-------------------------------------------------------------------------- * BoxLoop macros: *--------------------------------------------------------------------------*/ #ifndef HYPRE_BOXLOOP_DEVICEOMP_HEADER #define HYPRE_BOXLOOP_DEVICEOMP_HEADER #if defined(HYPRE_USING_DEVICE_OPENMP) && !defined(HYPRE_USING_RAJA) && !defined(HYPRE_USING_KOKKOS) #include "omp.h" /* concatenation: */ #define HYPRE_CONCAT2(x, y) x ## _ ## y #define HYPRE_XCONCAT2(x, y) HYPRE_CONCAT2(x, y) #define HYPRE_CONCAT3(x, y, z) x ## _ ## y ## _ ## z #define HYPRE_XCONCAT3(x, y, z) HYPRE_CONCAT3(x, y, z) /* if use OMP 4.5 default team size and number of teams */ #define AUTO_OMP_TEAM #ifndef AUTO_OMP_TEAM /* omp team size (aka. gpu block size) */ #define hypre_gpu_block_size HYPRE_1D_BLOCK_SIZE /* the max number of omp teams */ #define hypre_max_num_blocks 1000000 #endif //#define HYPRE_BOXLOOP_ENTRY_PRINT hypre_printf("%s %s %d\n", __FILE__, __func__, __LINE__); #define HYPRE_BOXLOOP_ENTRY_PRINT /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - BOX LOOPS [TEAM DISTRIBUTE VERSION] !!! NOTE: THIS CODE ONLY WORKS FOR DIM <= 3 !!! * - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/ /* #define hypre_BoxLoop0For() #define hypre_BoxLoop1For(i1) #define hypre_BoxLoop2For(i1, i2) #define hypre_BoxLoop3For(i1, i2, i3) #define hypre_BoxLoop4For(i1, i2, i3, i4) */ #define hypre_BoxLoopBlock() 0 #define hypre_BoxLoop0Begin zypre_omp4_dist_BoxLoop0Begin #define hypre_BoxLoop0End zypre_omp4_dist_BoxLoopEnd #define hypre_BoxLoop1Begin zypre_omp4_dist_BoxLoop1Begin #define hypre_BoxLoop1End zypre_omp4_dist_BoxLoopEnd #define hypre_BasicBoxLoop2Begin zypre_omp4_dist_BoxLoop2_v2_Begin #define hypre_BoxLoop2Begin zypre_omp4_dist_BoxLoop2Begin #define hypre_BoxLoop2End zypre_omp4_dist_BoxLoopEnd #define hypre_BoxLoop3Begin zypre_omp4_dist_BoxLoop3Begin #if 0 #define hypre_BoxLoop3_SAME_STRIDE_Begin zypre_omp4_dist_BoxLoop3_SAME_STRIDE_Begin #endif #define hypre_BoxLoop3End zypre_omp4_dist_BoxLoopEnd #define hypre_BoxLoop4Begin zypre_omp4_dist_BoxLoop4Begin #define hypre_BoxLoop4End zypre_omp4_dist_BoxLoopEnd #define hypre_LoopBegin zypre_omp4_dist_LoopBegin #define hypre_LoopEnd zypre_omp4_dist_BoxLoopEnd /* Look for more in struct_ls/red_black_gs.h" */ #define zypre_omp4_dist_BoxLoopEnd(...) \ }\ /*cudaDeviceSynchronize();*/ \ } #define HYPRE_BOX_REDUCTION /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - * host code: declare variables used in the box loop * - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/ #define zypre_omp4_BoxLoopDeclareInit_0(ndim, loop_size) \ HYPRE_Int hypre__ndim = ndim, hypre__tot = 1; \ /* HYPRE_Int hypre__thread; */ \ /* loop size */ \ HYPRE_Int hypre__loop_size_0, hypre__loop_size_1, hypre__loop_size_2; \ if (hypre__ndim > 0) { hypre__loop_size_0 = loop_size[0]; hypre__tot *= hypre__loop_size_0; } \ if (hypre__ndim > 1) { hypre__loop_size_1 = loop_size[1]; hypre__tot *= hypre__loop_size_1; } \ if (hypre__ndim > 2) { hypre__loop_size_2 = loop_size[2]; hypre__tot *= hypre__loop_size_2; } #ifdef AUTO_OMP_TEAM #define TEAM_CLAUSE #define zypre_omp4_BoxLoopDeclareInit(ndim, loop_size) zypre_omp4_BoxLoopDeclareInit_0(ndim, loop_size) #else #define TEAM_CLAUSE num_teams(num_blocks) thread_limit(block_size) #define zypre_omp4_BoxLoopDeclareInit(ndim, loop_size) zypre_omp4_BoxLoopDeclareInit_0(ndim, loop_size) \ /* GPU block numbers and dimensions */ \ HYPRE_Int block_size = hypre_gpu_block_size; \ HYPRE_Int num_blocks = hypre_min(hypre_max_num_blocks, (hypre__tot + hypre_gpu_block_size - 1) / hypre_gpu_block_size); #endif /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - * host code: declare and initialize variables for box k * - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/ #define zypre_omp4_BoxKDeclareInitBody(j, k, startk, dboxk, stridek) \ HYPRE_XCONCAT3(hypre__stride,j,k) = stridek[j]; \ /* precompute some entities used in the parallel for loop */ \ HYPRE_XCONCAT3(hypre__box_start_imin,j,k) = startk[j] - dboxk->imin[j]; \ HYPRE_XCONCAT3(hypre__box_imax_imin,j,k) = dboxk->imax[j] - dboxk->imin[j] + 1; #define zypre_omp4_BoxKDeclareInit(k, startk, dboxk, stridek)\ /* start - imin */ \ HYPRE_Int HYPRE_XCONCAT3(hypre__box_start_imin,0,k), HYPRE_XCONCAT3(hypre__box_start_imin,1,k), HYPRE_XCONCAT3(hypre__box_start_imin,2,k); \ /* imax - imin + 1 */ \ HYPRE_Int HYPRE_XCONCAT3(hypre__box_imax_imin,0,k), HYPRE_XCONCAT3(hypre__box_imax_imin,1,k), HYPRE_XCONCAT3(hypre__box_imax_imin,2,k); \ /* stride */ \ HYPRE_Int HYPRE_XCONCAT3(hypre__stride,0,k), HYPRE_XCONCAT3(hypre__stride,1,k), HYPRE_XCONCAT3(hypre__stride,2,k); \ /*if (hypre__ndim > 0)*/ { zypre_omp4_BoxKDeclareInitBody(0, k, startk, dboxk, stridek) } \ if (hypre__ndim > 1) { zypre_omp4_BoxKDeclareInitBody(1, k, startk, dboxk, stridek) } \ if (hypre__ndim > 2) { zypre_omp4_BoxKDeclareInitBody(2, k, startk, dboxk, stridek) } \ /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - * map clause * - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/ #define MAP_CLAUSE0 #define MAP_CLAUSE1 #define MAP_CLAUSE2 #define MAP_CLAUSE3 #define MAP_CLAUSE4 /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - * if clause * - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/ #define IF_CLAUSE if (hypre__global_offload && hypre__tot > 0) //#define IF_CLAUSE /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - * is_device_ptr clause * - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/ #if defined(HYPRE_DEVICE_OPENMP_ALLOC) #define IS_DEVICE_CLAUSE DEVICE_VAR #else #define IS_DEVICE_CLAUSE #endif /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - * device code for BoxLoop 1, set i1 * - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/ #define zypre_omp4_BoxLoopSet1Body(j, i1) \ /* coord in dimension j */ \ hypre__i = hypre__J % HYPRE_XCONCAT2(hypre__loop_size,j); \ /* once */ \ hypre__i_1 = hypre__i * HYPRE_XCONCAT3(hypre__stride,j,1) + HYPRE_XCONCAT3(hypre__box_start_imin,j,1);\ /* once */ \ i1 += hypre__i_1 * hypre__I_1; \ /* once */ \ hypre__I_1 *= HYPRE_XCONCAT3(hypre__box_imax_imin,j,1); \ /* */ \ hypre__J /= HYPRE_XCONCAT2(hypre__loop_size,j); \ /* save the 3-D id */ \ HYPRE_XCONCAT2(hypre__id,j) = hypre__i; #define zypre_omp4_BoxLoopSet1(i1) \ HYPRE_Int hypre__I_1, hypre__i, hypre__i_1, hypre__J, i1, idx; \ HYPRE_Int hypre__id_0, hypre__id_1, hypre__id_2; \ hypre__I_1 = 1; idx = hypre__J = hypre__thread; i1 = 0; \ /*if (hypre__ndim > 0)*/ { zypre_omp4_BoxLoopSet1Body(0, i1) } \ if (hypre__ndim > 1) { zypre_omp4_BoxLoopSet1Body(1, i1) } \ if (hypre__ndim > 2) { zypre_omp4_BoxLoopSet1Body(2, i1) } /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - * device code for BoxLoop 2, set i1, i2 * - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/ #define zypre_omp4_BoxLoopSet2Body(j, i1, i2) \ /* */ \ hypre__i = hypre__J % HYPRE_XCONCAT2(hypre__loop_size,j); \ /* twice */ \ hypre__i_1 = hypre__i * HYPRE_XCONCAT3(hypre__stride,j,1) + HYPRE_XCONCAT3(hypre__box_start_imin,j,1);\ hypre__i_2 = hypre__i * HYPRE_XCONCAT3(hypre__stride,j,2) + HYPRE_XCONCAT3(hypre__box_start_imin,j,2);\ /* twice */ \ i1 += hypre__i_1 * hypre__I_1; \ i2 += hypre__i_2 * hypre__I_2; \ /* twice */ \ hypre__I_1 *= HYPRE_XCONCAT3(hypre__box_imax_imin,j,1); \ hypre__I_2 *= HYPRE_XCONCAT3(hypre__box_imax_imin,j,2); \ /* */ \ hypre__J /= HYPRE_XCONCAT2(hypre__loop_size,j); \ /* save the 3-D id */ \ HYPRE_XCONCAT2(hypre__id,j) = hypre__i; #define zypre_omp4_BoxLoopSet2(i1, i2) \ HYPRE_Int hypre__I_1, hypre__I_2, hypre__i, hypre__i_1, hypre__i_2, hypre__J, i1, i2; \ HYPRE_Int hypre__id_0, hypre__id_1, hypre__id_2; \ hypre__I_1 = hypre__I_2 = 1; hypre__J = hypre__thread; i1 = i2 = 0; \ /*if (hypre__ndim > 0)*/ { zypre_omp4_BoxLoopSet2Body(0, i1, i2) } \ if (hypre__ndim > 1) { zypre_omp4_BoxLoopSet2Body(1, i1, i2) } \ if (hypre__ndim > 2) { zypre_omp4_BoxLoopSet2Body(2, i1, i2) } /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - * device code for BoxLoop 3, set i1, i2, i3 * - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/ #define zypre_omp4_BoxLoopSet3Body(j, i1, i2, i3) \ /* */ \ hypre__i = hypre__J % HYPRE_XCONCAT2(hypre__loop_size,j); \ /* 3 times */ \ hypre__i_1 = hypre__i * HYPRE_XCONCAT3(hypre__stride,j,1) + HYPRE_XCONCAT3(hypre__box_start_imin,j,1);\ hypre__i_2 = hypre__i * HYPRE_XCONCAT3(hypre__stride,j,2) + HYPRE_XCONCAT3(hypre__box_start_imin,j,2);\ hypre__i_3 = hypre__i * HYPRE_XCONCAT3(hypre__stride,j,3) + HYPRE_XCONCAT3(hypre__box_start_imin,j,3);\ /* 3 times */ \ i1 += hypre__i_1 * hypre__I_1; \ i2 += hypre__i_2 * hypre__I_2; \ i3 += hypre__i_3 * hypre__I_3; \ /* 3 times */ \ hypre__I_1 *= HYPRE_XCONCAT3(hypre__box_imax_imin,j,1); \ hypre__I_2 *= HYPRE_XCONCAT3(hypre__box_imax_imin,j,2); \ hypre__I_3 *= HYPRE_XCONCAT3(hypre__box_imax_imin,j,3); \ /* */ \ hypre__J /= HYPRE_XCONCAT2(hypre__loop_size,j); \ /* save the 3-D id */ \ HYPRE_XCONCAT2(hypre__id,j) = hypre__i; #define zypre_omp4_BoxLoopSet3(i1, i2, i3) \ HYPRE_Int hypre__I_1, hypre__I_2, hypre__I_3, hypre__i, hypre__i_1, hypre__i_2, hypre__i_3, hypre__J, i1, i2, i3; \ HYPRE_Int hypre__id_0, hypre__id_1, hypre__id_2; \ hypre__I_1 = hypre__I_2 = hypre__I_3 = 1; hypre__J = hypre__thread; i1 = i2 = i3 = 0; \ /*if (hypre__ndim > 0)*/ { zypre_omp4_BoxLoopSet3Body(0, i1, i2, i3) } \ if (hypre__ndim > 1) { zypre_omp4_BoxLoopSet3Body(1, i1, i2, i3) } \ if (hypre__ndim > 2) { zypre_omp4_BoxLoopSet3Body(2, i1, i2, i3) } #if 0 /* - - - - - special Box 3: XXX */ #define zypre_omp4_BoxLoopSet3_SAME_STRIDE_Body(j, i1, i2, i3) \ /* */ \ hypre__i = (hypre__J % HYPRE_XCONCAT2(hypre__loop_size,j)) * HYPRE_XCONCAT3(hypre__stride,j,1); \ /* 3 times */ \ hypre__i_1 = hypre__i + HYPRE_XCONCAT3(hypre__box_start_imin,j,1);\ hypre__i_2 = hypre__i + HYPRE_XCONCAT3(hypre__box_start_imin,j,2);\ hypre__i_3 = hypre__i + HYPRE_XCONCAT3(hypre__box_start_imin,j,3);\ /* 3 times */ \ i1 += hypre__i_1 * hypre__I_1; \ i2 += hypre__i_2 * hypre__I_2; \ i3 += hypre__i_3 * hypre__I_3; \ /* 3 times */ \ hypre__I_1 *= HYPRE_XCONCAT3(hypre__box_imax_imin,j,1); \ hypre__I_2 *= HYPRE_XCONCAT3(hypre__box_imax_imin,j,2); \ hypre__I_3 *= HYPRE_XCONCAT3(hypre__box_imax_imin,j,3); \ /* */ \ hypre__J /= HYPRE_XCONCAT2(hypre__loop_size,j); #define zypre_omp4_BoxLoopSet3_SAME_STRIDE(i1, i2, o2, i3) \ HYPRE_Int hypre__I_1, hypre__I_2, hypre__I_3, hypre__i, hypre__i_1, hypre__i_2, hypre__i_3, hypre__J; \ hypre__I_1 = hypre__I_2 = hypre__I_3 = 1; hypre__J = hypre__thread; i1 = i3 = 0; i2 = o2;\ /*if (hypre__ndim > 0)*/ { zypre_omp4_BoxLoopSet3_SAME_STRIDE_Body(0, i1, i2, i3) } \ if (hypre__ndim > 1) { zypre_omp4_BoxLoopSet3_SAME_STRIDE_Body(1, i1, i2, i3) } \ if (hypre__ndim > 2) { zypre_omp4_BoxLoopSet3_SAME_STRIDE_Body(2, i1, i2, i3) } #endif /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - * device code for BoxLoop 4, set i1, i2, i3, i4 * - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/ #define zypre_omp4_BoxLoopSet4Body(j, i1, i2, i3, i4) \ /* */ \ hypre__i = hypre__J % HYPRE_XCONCAT2(hypre__loop_size,j); \ /* 4 times */ \ hypre__i_1 = hypre__i * HYPRE_XCONCAT3(hypre__stride,j,1) + HYPRE_XCONCAT3(hypre__box_start_imin,j,1);\ hypre__i_2 = hypre__i * HYPRE_XCONCAT3(hypre__stride,j,2) + HYPRE_XCONCAT3(hypre__box_start_imin,j,2);\ hypre__i_3 = hypre__i * HYPRE_XCONCAT3(hypre__stride,j,3) + HYPRE_XCONCAT3(hypre__box_start_imin,j,3);\ hypre__i_4 = hypre__i * HYPRE_XCONCAT3(hypre__stride,j,4) + HYPRE_XCONCAT3(hypre__box_start_imin,j,4);\ /* 4 times */ \ i1 += hypre__i_1 * hypre__I_1; \ i2 += hypre__i_2 * hypre__I_2; \ i3 += hypre__i_3 * hypre__I_3; \ i4 += hypre__i_4 * hypre__I_4; \ /* 4 times */ \ hypre__I_1 *= HYPRE_XCONCAT3(hypre__box_imax_imin,j,1); \ hypre__I_2 *= HYPRE_XCONCAT3(hypre__box_imax_imin,j,2); \ hypre__I_3 *= HYPRE_XCONCAT3(hypre__box_imax_imin,j,3); \ hypre__I_4 *= HYPRE_XCONCAT3(hypre__box_imax_imin,j,4); \ /* */ \ hypre__J /= HYPRE_XCONCAT2(hypre__loop_size,j); \ /* save the 3-D id */ \ HYPRE_XCONCAT2(hypre__id,j) = hypre__i; #define zypre_omp4_BoxLoopSet4(i1, i2, i3, i4) \ HYPRE_Int hypre__I_1, hypre__I_2, hypre__I_3, hypre__I_4, hypre__i, hypre__i_1, hypre__i_2, hypre__i_3, hypre__i_4, hypre__J, i1, i2, i3, i4; \ HYPRE_Int hypre__id_0, hypre__id_1, hypre__id_2; \ hypre__I_1 = hypre__I_2 = hypre__I_3 = hypre__I_4 = 1; hypre__J = hypre__thread; i1 = i2 = i3 = i4 = 0; \ /*if (hypre__ndim > 0)*/ { zypre_omp4_BoxLoopSet4Body(0, i1, i2, i3, i4) } \ if (hypre__ndim > 1) { zypre_omp4_BoxLoopSet4Body(1, i1, i2, i3, i4) } \ if (hypre__ndim > 2) { zypre_omp4_BoxLoopSet4Body(2, i1, i2, i3, i4) } /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - * BoxLoop 0 * - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/ #define zypre_omp4_dist_BoxLoop0Begin(ndim, loop_size) \ {\ /* host code: */ \ HYPRE_BOXLOOP_ENTRY_PRINT \ zypre_omp4_BoxLoopDeclareInit(ndim, loop_size) \ /* device code: */ \ _Pragma (HYPRE_XSTR(omp target teams distribute parallel for IF_CLAUSE MAP_CLAUSE0 IS_DEVICE_CLAUSE TEAM_CLAUSE)) \ for (HYPRE_Int hypre__thread = 0; hypre__thread < hypre__tot; hypre__thread++) \ {\ /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - * BoxLoop 1 * - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/ #define zypre_omp4_dist_BoxLoop1Begin(ndim, loop_size, dbox1, start1, stride1, i1) \ {\ /* host code: */ \ HYPRE_BOXLOOP_ENTRY_PRINT \ zypre_omp4_BoxLoopDeclareInit(ndim, loop_size) \ zypre_omp4_BoxKDeclareInit(1, start1, dbox1, stride1) \ /* device code: */ \ _Pragma (HYPRE_XSTR(omp target teams distribute parallel for IF_CLAUSE MAP_CLAUSE1 IS_DEVICE_CLAUSE HYPRE_BOX_REDUCTION TEAM_CLAUSE)) \ for (HYPRE_Int hypre__thread = 0; hypre__thread < hypre__tot; hypre__thread++) \ {\ zypre_omp4_BoxLoopSet1(i1) /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - * BoxLoop 2 * - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/ #define zypre_omp4_dist_BoxLoop2Begin(ndim, loop_size, dbox1, start1, stride1, i1, dbox2, start2, stride2, i2) \ {\ /* host code: */ \ HYPRE_BOXLOOP_ENTRY_PRINT \ zypre_omp4_BoxLoopDeclareInit(ndim, loop_size) \ zypre_omp4_BoxKDeclareInit(1, start1, dbox1, stride1) \ zypre_omp4_BoxKDeclareInit(2, start2, dbox2, stride2) \ /* device code: */ \ _Pragma (HYPRE_XSTR(omp target teams distribute parallel for IF_CLAUSE MAP_CLAUSE2 IS_DEVICE_CLAUSE HYPRE_BOX_REDUCTION TEAM_CLAUSE)) \ for (HYPRE_Int hypre__thread = 0; hypre__thread < hypre__tot; hypre__thread++) \ {\ zypre_omp4_BoxLoopSet2(i1, i2) /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - * BoxLoop 3 * - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/ #define zypre_omp4_dist_BoxLoop3Begin(ndim, loop_size, \ dbox1, start1, stride1, i1, \ dbox2, start2, stride2, i2, \ dbox3, start3, stride3, i3) \ {\ /* host code: */ \ HYPRE_BOXLOOP_ENTRY_PRINT \ zypre_omp4_BoxLoopDeclareInit(ndim, loop_size) \ zypre_omp4_BoxKDeclareInit(1, start1, dbox1, stride1) \ zypre_omp4_BoxKDeclareInit(2, start2, dbox2, stride2) \ zypre_omp4_BoxKDeclareInit(3, start3, dbox3, stride3) \ /* device code: */ \ _Pragma (HYPRE_XSTR(omp target teams distribute parallel for IF_CLAUSE MAP_CLAUSE3 IS_DEVICE_CLAUSE TEAM_CLAUSE)) \ for (HYPRE_Int hypre__thread = 0; hypre__thread < hypre__tot; hypre__thread++) \ {\ zypre_omp4_BoxLoopSet3(i1, i2, i3) #if 0 #define zypre_omp4_dist_BoxLoop3_SAME_STRIDE_Begin(ndim, loop_size, \ dbox1, start1, stride1, i1, \ dbox2, start2, stride2, i2, o2, \ dbox3, start3, stride3, i3) \ {\ /* host code: */ \ zypre_omp4_BoxLoopDeclareInit(ndim, loop_size) \ zypre_omp4_BoxKDeclareInit(1, start1, dbox1, stride1) \ zypre_omp4_BoxKDeclareInit(2, start2, dbox2, stride2) \ zypre_omp4_BoxKDeclareInit(3, start3, dbox3, stride3) \ /* device code: */ \ _Pragma (HYPRE_XSTR(omp target teams distribute parallel for IF_CLAUSE MAP_CLAUSE3 IS_DEVICE_CLAUSE TEAM_CLAUSE)) \ for (HYPRE_Int hypre__thread = 0; hypre__thread < hypre__tot; hypre__thread++) \ {\ zypre_omp4_BoxLoopSet3_SAME_STRIDE(i1, i2, o2, i3) #endif /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - * BoxLoop 4 * - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/ #define zypre_omp4_dist_BoxLoop4Begin(ndim, loop_size, \ dbox1, start1, stride1, i1, \ dbox2, start2, stride2, i2, \ dbox3, start3, stride3, i3, \ dbox4, start4, stride4, i4) \ {\ /* host code: */ \ HYPRE_BOXLOOP_ENTRY_PRINT \ zypre_omp4_BoxLoopDeclareInit(ndim, loop_size) \ zypre_omp4_BoxKDeclareInit(1, start1, dbox1, stride1) \ zypre_omp4_BoxKDeclareInit(2, start2, dbox2, stride2) \ zypre_omp4_BoxKDeclareInit(3, start3, dbox3, stride3) \ zypre_omp4_BoxKDeclareInit(4, start4, dbox4, stride4) \ /* device code: */ \ _Pragma (HYPRE_XSTR(omp target teams distribute parallel for IF_CLAUSE MAP_CLAUSE4 IS_DEVICE_CLAUSE TEAM_CLAUSE)) \ for (HYPRE_Int hypre__thread = 0; hypre__thread < hypre__tot; hypre__thread++) \ {\ zypre_omp4_BoxLoopSet4(i1, i2, i3, i4) #if 0 /* no longer needed, use the above BoxLoop's for reductions */ /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - * BoxLoop 1 reduction * - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/ #define zypre_omp4_dist_Red_BoxLoop1Begin(ndim, loop_size, dbox1, start1, stride1, i1, xsum) \ {\ /* host code: */ \ zypre_omp4_BoxLoopDeclareInit(ndim, loop_size) \ zypre_omp4_BoxKDeclareInit(1, start1, dbox1, stride1) \ /* device code: */ \ _Pragma (HYPRE_XSTR(omp target teams distribute parallel for IF_CLAUSE MAP_CLAUSE1 map(tofrom: xsum) reduction(+:xsum) TEAM_CLAUSE)) \ for (HYPRE_Int hypre__thread = 0; hypre__thread < hypre__tot; hypre__thread++) \ {\ zypre_omp4_BoxLoopSet1(i1) /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - * BoxLoop 2 reduction * - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/ #define zypre_omp4_dist_Red_BoxLoop2Begin(ndim, loop_size, dbox1, start1, stride1, i1, dbox2, start2, stride2, i2, xsum) \ {\ /* host code: */ \ zypre_omp4_BoxLoopDeclareInit(ndim, loop_size) \ zypre_omp4_BoxKDeclareInit(1, start1, dbox1, stride1) \ zypre_omp4_BoxKDeclareInit(2, start2, dbox2, stride2) \ /* device code: */ \ _Pragma (HYPRE_XSTR(omp target teams distribute parallel for IF_CLAUSE MAP_CLAUSE2 map(tofrom: xsum) reduction(+:xsum) TEAM_CLAUSE)) \ for (HYPRE_Int hypre__thread = 0; hypre__thread < hypre__tot; hypre__thread++) \ {\ zypre_omp4_BoxLoopSet2(i1, i2) #endif /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - * v2 * host code: declare and initialize variables for box k * - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/ #define zypre_omp4_BoxKDeclareInit_v2(k, stridek)\ /* stridek[0,1,2] */ \ HYPRE_Int HYPRE_XCONCAT3(hypre__stride,0,k), HYPRE_XCONCAT3(hypre__stride,1,k), HYPRE_XCONCAT3(hypre__stride,2,k); \ /*if (hypre__ndim > 0)*/ { HYPRE_XCONCAT3(hypre__stride,0,k) = stridek[0]; } \ if (hypre__ndim > 1) { HYPRE_XCONCAT3(hypre__stride,1,k) = stridek[1]; } \ if (hypre__ndim > 2) { HYPRE_XCONCAT3(hypre__stride,2,k) = stridek[2]; } \ /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - * v2 * device code for BoxLoop 1, set i1 * - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/ #define zypre_omp4_BoxLoopSet1Body_v2(j, i1) \ i1 += ( hypre__J % HYPRE_XCONCAT2(hypre__loop_size,j) ) * HYPRE_XCONCAT3(hypre__stride,j,1);\ hypre__J /= HYPRE_XCONCAT2(hypre__loop_size,j); #define zypre_omp4_BoxLoopSet1_v2(i1, idx) \ HYPRE_Int hypre__J, i1, idx; \ idx = hypre__J = hypre__thread; i1 = 0; \ /*if (hypre__ndim > 0)*/ { zypre_omp4_BoxLoopSet1Body_v2(0, i1) } \ if (hypre__ndim > 1) { zypre_omp4_BoxLoopSet1Body_v2(1, i1) } \ if (hypre__ndim > 2) { zypre_omp4_BoxLoopSet1Body_v2(2, i1) } /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - * v2: Basic * BoxLoop 1 * - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/ #define zypre_omp4_dist_BoxLoop1_v2_Begin(ndim, loop_size, stride1, i1, idx) \ {\ /* host code: */ \ HYPRE_BOXLOOP_ENTRY_PRINT \ zypre_omp4_BoxLoopDeclareInit(ndim, loop_size) \ zypre_omp4_BoxKDeclareInit_v2(1, stride1) \ /* device code: */ \ _Pragma (HYPRE_XSTR(omp target teams distribute parallel for IF_CLAUSE MAP_CLAUSE1 IS_DEVICE_CLAUSE TEAM_CLAUSE)) \ for (HYPRE_Int hypre__thread = 0; hypre__thread < hypre__tot; hypre__thread++) \ {\ zypre_omp4_BoxLoopSet1_v2(i1, idx) /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - * v2 * device code for BoxLoop 2, set i1, i2 * - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/ #define zypre_omp4_BoxLoopSet2Body_v2(j, i1, i2) \ hypre__i = hypre__J % HYPRE_XCONCAT2(hypre__loop_size,j); \ /* twice */ \ i1 += hypre__i * HYPRE_XCONCAT3(hypre__stride,j,1); \ i2 += hypre__i * HYPRE_XCONCAT3(hypre__stride,j,2); \ hypre__J /= HYPRE_XCONCAT2(hypre__loop_size,j); #define zypre_omp4_BoxLoopSet2_v2(i1, i2) \ HYPRE_Int hypre__i, hypre__J, i1, i2; \ hypre__J = hypre__thread; i1 = i2 = 0; \ /*if (hypre__ndim > 0)*/ { zypre_omp4_BoxLoopSet2Body_v2(0, i1, i2) } \ if (hypre__ndim > 1) { zypre_omp4_BoxLoopSet2Body_v2(1, i1, i2) } \ if (hypre__ndim > 2) { zypre_omp4_BoxLoopSet2Body_v2(2, i1, i2) } /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - * v2: Basic * BoxLoop 2 * - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/ #define zypre_omp4_dist_BoxLoop2_v2_Begin(ndim, loop_size, stride1, i1, stride2, i2) \ { \ /* host code: */ \ HYPRE_BOXLOOP_ENTRY_PRINT \ zypre_omp4_BoxLoopDeclareInit(ndim, loop_size) \ zypre_omp4_BoxKDeclareInit_v2(1, stride1) \ zypre_omp4_BoxKDeclareInit_v2(2, stride2) \ /* device code: */ \ _Pragma (HYPRE_XSTR(omp target teams distribute parallel for IF_CLAUSE MAP_CLAUSE2 IS_DEVICE_CLAUSE TEAM_CLAUSE)) \ for (HYPRE_Int hypre__thread = 0; hypre__thread < hypre__tot; hypre__thread++) \ { \ zypre_omp4_BoxLoopSet2_v2(i1, i2) /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - * Basic Loop * - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/ #define zypre_omp4_dist_LoopBegin(size, idx) \ { \ /* host code: */ \ /* HYPRE_Int idx = 0; */\ HYPRE_Int hypre__tot = size; \ HYPRE_BOXLOOP_ENTRY_PRINT \ /* device code: */ \ _Pragma (HYPRE_XSTR(omp target teams distribute parallel for IF_CLAUSE MAP_CLAUSE2 IS_DEVICE_CLAUSE TEAM_CLAUSE)) \ for (HYPRE_Int idx = 0; idx < hypre__tot; idx++) \ { #define hypre_BoxLoopGetIndex(index) \ index[0] = hypre__id_0; \ index[1] = hypre__id_1; \ index[2] = hypre__id_2; /* Reduction */ #define hypre_BoxLoop1ReductionBegin(ndim, loop_size, dbox1, start1, stride1, i1, reducesum) \ hypre_BoxLoop1Begin(ndim, loop_size, dbox1, start1, stride1, i1) #define hypre_BoxLoop1ReductionEnd(i1, reducesum) \ hypre_BoxLoop1End(i1) #define hypre_BoxLoop2ReductionBegin(ndim, loop_size, dbox1, start1, stride1, i1, \ dbox2, start2, stride2, i2, reducesum) \ hypre_BoxLoop2Begin(ndim, loop_size, dbox1, start1, stride1, i1, \ dbox2, start2, stride2, i2) #define hypre_BoxLoop2ReductionEnd(i1, i2, reducesum) \ hypre_BoxLoop2End(i1, i2) #endif #endif /* #ifndef HYPRE_BOXLOOP_DEVICEOMP_HEADER */ /****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * Header info for the BoxLoop * *****************************************************************************/ /*-------------------------------------------------------------------------- * BoxLoop macros: *--------------------------------------------------------------------------*/ #ifndef HYPRE_BOXLOOP_HOST_HEADER #define HYPRE_BOXLOOP_HOST_HEADER #if defined(HYPRE_USING_OPENMP) #define HYPRE_BOX_REDUCTION #define HYPRE_OMP_CLAUSE #if defined(WIN32) && defined(_MSC_VER) #define Pragma(x) __pragma(x) #else #define Pragma(x) _Pragma(HYPRE_XSTR(x)) #endif #define OMP0 Pragma(omp parallel for HYPRE_OMP_CLAUSE HYPRE_BOX_REDUCTION HYPRE_SMP_SCHEDULE) #define OMP1 Pragma(omp parallel for private(HYPRE_BOX_PRIVATE) HYPRE_OMP_CLAUSE HYPRE_BOX_REDUCTION HYPRE_SMP_SCHEDULE) #else /* #if defined(HYPRE_USING_OPENMP) */ #define OMP0 #define OMP1 #endif /* #if defined(HYPRE_USING_OPENMP) */ #define zypre_BoxLoop0Begin(ndim, loop_size) \ { \ zypre_BoxLoopDeclare(); \ zypre_BoxLoopInit(ndim, loop_size); \ OMP1 \ for (hypre__block = 0; hypre__block < hypre__num_blocks; hypre__block++) \ { \ zypre_BoxLoopSet(); \ for (hypre__J = 0; hypre__J < hypre__JN; hypre__J++) \ { \ for (hypre__I = 0; hypre__I < hypre__IN; hypre__I++) \ { #define zypre_BoxLoop0End() \ } \ zypre_BoxLoopInc1(); \ zypre_BoxLoopInc2(); \ } \ } \ } #define zypre_BoxLoop1Begin(ndim, loop_size, \ dbox1, start1, stride1, i1) \ { \ HYPRE_Int i1; \ zypre_BoxLoopDeclare(); \ zypre_BoxLoopDeclareK(1); \ zypre_BoxLoopInit(ndim, loop_size); \ zypre_BoxLoopInitK(1, dbox1, start1, stride1, i1); \ OMP1 \ for (hypre__block = 0; hypre__block < hypre__num_blocks; hypre__block++) \ { \ HYPRE_Int i1; \ zypre_BoxLoopSet(); \ zypre_BoxLoopSetK(1, i1); \ for (hypre__J = 0; hypre__J < hypre__JN; hypre__J++) \ { \ for (hypre__I = 0; hypre__I < hypre__IN; hypre__I++) \ { #define zypre_BoxLoop1End(i1) \ i1 += hypre__i0inc1; \ } \ zypre_BoxLoopInc1(); \ i1 += hypre__ikinc1[hypre__d]; \ zypre_BoxLoopInc2(); \ } \ } \ } #define zypre_BoxLoop2Begin(ndim, loop_size, \ dbox1, start1, stride1, i1, \ dbox2, start2, stride2, i2) \ { \ HYPRE_Int i1, i2; \ zypre_BoxLoopDeclare(); \ zypre_BoxLoopDeclareK(1); \ zypre_BoxLoopDeclareK(2); \ zypre_BoxLoopInit(ndim, loop_size); \ zypre_BoxLoopInitK(1, dbox1, start1, stride1, i1); \ zypre_BoxLoopInitK(2, dbox2, start2, stride2, i2); \ OMP1 \ for (hypre__block = 0; hypre__block < hypre__num_blocks; hypre__block++) \ { \ HYPRE_Int i1, i2; \ zypre_BoxLoopSet(); \ zypre_BoxLoopSetK(1, i1); \ zypre_BoxLoopSetK(2, i2); \ for (hypre__J = 0; hypre__J < hypre__JN; hypre__J++) \ { \ for (hypre__I = 0; hypre__I < hypre__IN; hypre__I++) \ { #define zypre_BoxLoop2End(i1, i2) \ i1 += hypre__i0inc1; \ i2 += hypre__i0inc2; \ } \ zypre_BoxLoopInc1(); \ i1 += hypre__ikinc1[hypre__d]; \ i2 += hypre__ikinc2[hypre__d]; \ zypre_BoxLoopInc2(); \ } \ } \ } #define zypre_BoxLoop3Begin(ndim, loop_size, \ dbox1, start1, stride1, i1, \ dbox2, start2, stride2, i2, \ dbox3, start3, stride3, i3) \ { \ HYPRE_Int i1, i2, i3; \ zypre_BoxLoopDeclare(); \ zypre_BoxLoopDeclareK(1); \ zypre_BoxLoopDeclareK(2); \ zypre_BoxLoopDeclareK(3); \ zypre_BoxLoopInit(ndim, loop_size); \ zypre_BoxLoopInitK(1, dbox1, start1, stride1, i1); \ zypre_BoxLoopInitK(2, dbox2, start2, stride2, i2); \ zypre_BoxLoopInitK(3, dbox3, start3, stride3, i3); \ OMP1 \ for (hypre__block = 0; hypre__block < hypre__num_blocks; hypre__block++) \ { \ HYPRE_Int i1, i2, i3; \ zypre_BoxLoopSet(); \ zypre_BoxLoopSetK(1, i1); \ zypre_BoxLoopSetK(2, i2); \ zypre_BoxLoopSetK(3, i3); \ for (hypre__J = 0; hypre__J < hypre__JN; hypre__J++) \ { \ for (hypre__I = 0; hypre__I < hypre__IN; hypre__I++) \ { #define zypre_BoxLoop3End(i1, i2, i3) \ i1 += hypre__i0inc1; \ i2 += hypre__i0inc2; \ i3 += hypre__i0inc3; \ } \ zypre_BoxLoopInc1(); \ i1 += hypre__ikinc1[hypre__d]; \ i2 += hypre__ikinc2[hypre__d]; \ i3 += hypre__ikinc3[hypre__d]; \ zypre_BoxLoopInc2(); \ } \ } \ } #define zypre_BoxLoop4Begin(ndim, loop_size, \ dbox1, start1, stride1, i1, \ dbox2, start2, stride2, i2, \ dbox3, start3, stride3, i3, \ dbox4, start4, stride4, i4) \ { \ HYPRE_Int i1, i2, i3, i4; \ zypre_BoxLoopDeclare(); \ zypre_BoxLoopDeclareK(1); \ zypre_BoxLoopDeclareK(2); \ zypre_BoxLoopDeclareK(3); \ zypre_BoxLoopDeclareK(4); \ zypre_BoxLoopInit(ndim, loop_size); \ zypre_BoxLoopInitK(1, dbox1, start1, stride1, i1); \ zypre_BoxLoopInitK(2, dbox2, start2, stride2, i2); \ zypre_BoxLoopInitK(3, dbox3, start3, stride3, i3); \ zypre_BoxLoopInitK(4, dbox4, start4, stride4, i4); \ OMP1 \ for (hypre__block = 0; hypre__block < hypre__num_blocks; hypre__block++) \ { \ HYPRE_Int i1, i2, i3, i4; \ zypre_BoxLoopSet(); \ zypre_BoxLoopSetK(1, i1); \ zypre_BoxLoopSetK(2, i2); \ zypre_BoxLoopSetK(3, i3); \ zypre_BoxLoopSetK(4, i4); \ for (hypre__J = 0; hypre__J < hypre__JN; hypre__J++) \ { \ for (hypre__I = 0; hypre__I < hypre__IN; hypre__I++) \ { #define zypre_BoxLoop4End(i1, i2, i3, i4) \ i1 += hypre__i0inc1; \ i2 += hypre__i0inc2; \ i3 += hypre__i0inc3; \ i4 += hypre__i0inc4; \ } \ zypre_BoxLoopInc1(); \ i1 += hypre__ikinc1[hypre__d]; \ i2 += hypre__ikinc2[hypre__d]; \ i3 += hypre__ikinc3[hypre__d]; \ i4 += hypre__ikinc4[hypre__d]; \ zypre_BoxLoopInc2(); \ } \ } \ } #define zypre_BasicBoxLoop1Begin(ndim, loop_size, \ stride1, i1) \ { \ zypre_BoxLoopDeclare(); \ zypre_BoxLoopDeclareK(1); \ zypre_BoxLoopInit(ndim, loop_size); \ zypre_BasicBoxLoopInitK(1, stride1); \ OMP1 \ for (hypre__block = 0; hypre__block < hypre__num_blocks; hypre__block++) \ { \ HYPRE_Int i1; \ zypre_BoxLoopSet(); \ zypre_BoxLoopSetK(1, i1); \ for (hypre__J = 0; hypre__J < hypre__JN; hypre__J++) \ { \ for (hypre__I = 0; hypre__I < hypre__IN; hypre__I++) \ { #define zypre_BasicBoxLoop2Begin(ndim, loop_size, \ stride1, i1, \ stride2, i2) \ { \ zypre_BoxLoopDeclare(); \ zypre_BoxLoopDeclareK(1); \ zypre_BoxLoopDeclareK(2); \ zypre_BoxLoopInit(ndim, loop_size); \ zypre_BasicBoxLoopInitK(1, stride1); \ zypre_BasicBoxLoopInitK(2, stride2); \ OMP1 \ for (hypre__block = 0; hypre__block < hypre__num_blocks; hypre__block++) \ { \ HYPRE_Int i1, i2; \ zypre_BoxLoopSet(); \ zypre_BoxLoopSetK(1, i1); \ zypre_BoxLoopSetK(2, i2); \ for (hypre__J = 0; hypre__J < hypre__JN; hypre__J++) \ { \ for (hypre__I = 0; hypre__I < hypre__IN; hypre__I++) \ { #define zypre_LoopBegin(size, idx) \ { \ HYPRE_Int idx; \ OMP0 \ for (idx = 0; idx < size; idx ++) \ { #define zypre_LoopEnd() \ } \ } /*-------------------------------------------------------------------------- * Serial BoxLoop macros: * [same as the ones above (without OMP and with SetOneBlock)] * TODO: combine them *--------------------------------------------------------------------------*/ #define hypre_SerialBoxLoop0Begin(ndim, loop_size) \ { \ zypre_BoxLoopDeclare(); \ zypre_BoxLoopInit(ndim, loop_size); \ zypre_BoxLoopSetOneBlock(); \ for (hypre__block = 0; hypre__block < hypre__num_blocks; hypre__block++) \ { \ zypre_BoxLoopSet(); \ for (hypre__J = 0; hypre__J < hypre__JN; hypre__J++) \ { \ for (hypre__I = 0; hypre__I < hypre__IN; hypre__I++) \ { #define hypre_SerialBoxLoop0End() \ } \ zypre_BoxLoopInc1(); \ zypre_BoxLoopInc2(); \ } \ } \ } #define hypre_SerialBoxLoop1Begin(ndim, loop_size, \ dbox1, start1, stride1, i1) \ { \ HYPRE_Int i1; \ zypre_BoxLoopDeclare(); \ zypre_BoxLoopDeclareK(1); \ zypre_BoxLoopInit(ndim, loop_size); \ zypre_BoxLoopInitK(1, dbox1, start1, stride1, i1); \ zypre_BoxLoopSetOneBlock(); \ for (hypre__block = 0; hypre__block < hypre__num_blocks; hypre__block++) \ { \ zypre_BoxLoopSet(); \ zypre_BoxLoopSetK(1, i1); \ for (hypre__J = 0; hypre__J < hypre__JN; hypre__J++) \ { \ for (hypre__I = 0; hypre__I < hypre__IN; hypre__I++) \ { #define hypre_SerialBoxLoop1End(i1) zypre_BoxLoop1End(i1) #define hypre_SerialBoxLoop2Begin(ndim, loop_size, \ dbox1, start1, stride1, i1, \ dbox2, start2, stride2, i2) \ { \ HYPRE_Int i1,i2; \ zypre_BoxLoopDeclare(); \ zypre_BoxLoopDeclareK(1); \ zypre_BoxLoopDeclareK(2); \ zypre_BoxLoopInit(ndim, loop_size); \ zypre_BoxLoopInitK(1, dbox1, start1, stride1, i1); \ zypre_BoxLoopInitK(2, dbox2, start2, stride2, i2); \ zypre_BoxLoopSetOneBlock(); \ for (hypre__block = 0; hypre__block < hypre__num_blocks; hypre__block++) \ { \ zypre_BoxLoopSet(); \ zypre_BoxLoopSetK(1, i1); \ zypre_BoxLoopSetK(2, i2); \ for (hypre__J = 0; hypre__J < hypre__JN; hypre__J++) \ { \ for (hypre__I = 0; hypre__I < hypre__IN; hypre__I++) \ { #define hypre_SerialBoxLoop2End(i1, i2) zypre_BoxLoop2End(i1, i2) /* Reduction BoxLoop1 */ #define zypre_BoxLoop1ReductionBegin(ndim, loop_size, dbox1, start1, stride1, i1, reducesum) \ zypre_BoxLoop1Begin(ndim, loop_size, dbox1, start1, stride1, i1) #define zypre_BoxLoop1ReductionEnd(i1, reducesum) zypre_BoxLoop1End(i1) /* Reduction BoxLoop2 */ #define zypre_BoxLoop2ReductionBegin(ndim, loop_size, dbox1, start1, stride1, i1, \ dbox2, start2, stride2, i2, reducesum) \ zypre_BoxLoop2Begin(ndim, loop_size, dbox1, start1, stride1, i1, \ dbox2, start2, stride2, i2) #define zypre_BoxLoop2ReductionEnd(i1, i2, reducesum) zypre_BoxLoop2End(i1, i2) /* Renaming */ #define hypre_BoxLoopGetIndexHost zypre_BoxLoopGetIndex #define hypre_BoxLoopBlockHost zypre_BoxLoopBlock #define hypre_BoxLoop0BeginHost zypre_BoxLoop0Begin #define hypre_BoxLoop0EndHost zypre_BoxLoop0End #define hypre_BoxLoop1BeginHost zypre_BoxLoop1Begin #define hypre_BoxLoop1EndHost zypre_BoxLoop1End #define hypre_BoxLoop2BeginHost zypre_BoxLoop2Begin #define hypre_BoxLoop2EndHost zypre_BoxLoop2End #define hypre_BoxLoop3BeginHost zypre_BoxLoop3Begin #define hypre_BoxLoop3EndHost zypre_BoxLoop3End #define hypre_BoxLoop4BeginHost zypre_BoxLoop4Begin #define hypre_BoxLoop4EndHost zypre_BoxLoop4End #define hypre_BasicBoxLoop1BeginHost zypre_BasicBoxLoop1Begin #define hypre_BasicBoxLoop2BeginHost zypre_BasicBoxLoop2Begin #define hypre_LoopBeginHost zypre_LoopBegin #define hypre_LoopEndHost zypre_LoopEnd #define hypre_BoxLoop1ReductionBeginHost zypre_BoxLoop1ReductionBegin #define hypre_BoxLoop1ReductionEndHost zypre_BoxLoop1ReductionEnd #define hypre_BoxLoop2ReductionBeginHost zypre_BoxLoop2ReductionBegin #define hypre_BoxLoop2ReductionEndHost zypre_BoxLoop2ReductionEnd //TODO TEMP FIX #if !defined(HYPRE_USING_RAJA) && !defined(HYPRE_USING_KOKKOS) && !defined(HYPRE_USING_CUDA) && !defined(HYPRE_USING_HIP) && !defined(HYPRE_USING_DEVICE_OPENMP) && !defined(HYPRE_USING_SYCL) #define hypre_BoxLoopGetIndex hypre_BoxLoopGetIndexHost #define hypre_BoxLoopBlock() 0 #define hypre_BoxLoop0Begin hypre_BoxLoop0BeginHost #define hypre_BoxLoop0End hypre_BoxLoop0EndHost #define hypre_BoxLoop1Begin hypre_BoxLoop1BeginHost #define hypre_BoxLoop1End hypre_BoxLoop1EndHost #define hypre_BoxLoop2Begin hypre_BoxLoop2BeginHost #define hypre_BoxLoop2End hypre_BoxLoop2EndHost #define hypre_BoxLoop3Begin hypre_BoxLoop3BeginHost #define hypre_BoxLoop3End hypre_BoxLoop3EndHost #define hypre_BoxLoop4Begin hypre_BoxLoop4BeginHost #define hypre_BoxLoop4End hypre_BoxLoop4EndHost #define hypre_BasicBoxLoop1Begin hypre_BasicBoxLoop1BeginHost #define hypre_BasicBoxLoop2Begin hypre_BasicBoxLoop2BeginHost #define hypre_LoopBegin hypre_LoopBeginHost #define hypre_LoopEnd hypre_LoopEndHost #define hypre_BoxLoop1ReductionBegin hypre_BoxLoop1ReductionBeginHost #define hypre_BoxLoop1ReductionEnd hypre_BoxLoop1ReductionEndHost #define hypre_BoxLoop2ReductionBegin hypre_BoxLoop2ReductionBeginHost #define hypre_BoxLoop2ReductionEnd hypre_BoxLoop2ReductionEndHost #endif #endif /* #ifndef HYPRE_BOXLOOP_HOST_HEADER */ #ifdef __cplusplus } #endif #endif hypre-2.33.0/src/struct_mv/_hypre_struct_mv.hpp000066400000000000000000002664111477326011500216700ustar00rootroot00000000000000 /*** DO NOT EDIT THIS FILE DIRECTLY (use 'headers' to generate) ***/ #ifndef hypre_STRUCT_MV_HPP #define hypre_STRUCT_MV_HPP #include "_hypre_utilities.hpp" #ifdef __cplusplus extern "C++" { #endif /****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * Header info for the BoxLoop * *****************************************************************************/ /*-------------------------------------------------------------------------- * BoxLoop macros: *--------------------------------------------------------------------------*/ #ifndef HYPRE_BOXLOOP_RAJA_HEADER #define HYPRE_BOXLOOP_RAJA_HEADER #if defined(HYPRE_USING_RAJA) #ifdef __cplusplus extern "C++" { #endif #include using namespace RAJA; #ifdef __cplusplus } #endif typedef struct hypre_Boxloop_struct { HYPRE_Int lsize0, lsize1, lsize2; HYPRE_Int strides0, strides1, strides2; HYPRE_Int bstart0, bstart1, bstart2; HYPRE_Int bsize0, bsize1, bsize2; } hypre_Boxloop; #if defined(HYPRE_USING_CUDA) /* RAJA with CUDA, running on device */ #define BLOCKSIZE HYPRE_1D_BLOCK_SIZE #define hypre_RAJA_DEVICE RAJA_DEVICE #define hypre_raja_exec_policy cuda_exec /* #define hypre_raja_reduce_policy cuda_reduce_atomic */ #define hypre_raja_reduce_policy cuda_reduce // #define hypre_fence() /* #define hypre_fence() \ cudaError err = cudaGetLastError();\ if ( cudaSuccess != err ) {\ printf("\n ERROR zypre_newBoxLoop: %s in %s(%d) function %s\n",cudaGetErrorString(err),__FILE__,__LINE__,__FUNCTION__); \ }\ hypre_CheckErrorDevice(cudaDeviceSynchronize()); */ #elif defined(HYPRE_USING_DEVICE_OPENMP) /* RAJA with OpenMP (>4.5), running on device */ #define hypre_RAJA_DEVICE #define hypre_raja_exec_policy omp_target_parallel_for_exec #define hypre_raja_reduce_policy omp_target_reduce #define hypre_fence() #elif defined(HYPRE_USING_OPENMP) /* RAJA with OpenMP, running on host (CPU) */ #define hypre_RAJA_DEVICE #define hypre_raja_exec_policy omp_for_exec #define hypre_raja_reduce_policy omp_reduce #define hypre_fence() #else /* RAJA, running on host (CPU) */ #define hypre_RAJA_DEVICE #define hypre_raja_exec_policy seq_exec #define hypre_raja_reduce_policy seq_reduce #define hypre_fence() #endif /* #if defined(HYPRE_USING_CUDA) */ #define zypre_BoxLoopIncK(k,box,hypre__i) \ HYPRE_Int hypre_boxD##k = 1; \ HYPRE_Int hypre__i = 0; \ hypre__i += (hypre_IndexD(local_idx, 0)*box.strides0 + box.bstart0) * hypre_boxD##k; \ hypre_boxD##k *= hypre_max(0, box.bsize0 + 1); \ hypre__i += (hypre_IndexD(local_idx, 1)*box.strides1 + box.bstart1) * hypre_boxD##k; \ hypre_boxD##k *= hypre_max(0, box.bsize1 + 1); \ hypre__i += (hypre_IndexD(local_idx, 2)*box.strides2 + box.bstart2) * hypre_boxD##k; \ hypre_boxD##k *= hypre_max(0, box.bsize2 + 1); \ #define zypre_newBoxLoopInit(ndim,loop_size) \ HYPRE_Int hypre__tot = 1; \ for (HYPRE_Int d = 0;d < ndim;d ++) \ hypre__tot *= loop_size[d]; #define zypre_newBoxLoopDeclare(box) \ hypre_Index local_idx; \ HYPRE_Int idx_local = idx; \ hypre_IndexD(local_idx, 0) = idx_local % box.lsize0; \ idx_local = idx_local / box.lsize0; \ hypre_IndexD(local_idx, 1) = idx_local % box.lsize1; \ idx_local = idx_local / box.lsize1; \ hypre_IndexD(local_idx, 2) = idx_local % box.lsize2; #define zypre_BoxLoopDataDeclareK(k,ndim,loop_size,dbox,start,stride) \ hypre_Boxloop databox##k; \ databox##k.lsize0 = loop_size[0]; \ databox##k.strides0 = stride[0]; \ databox##k.bstart0 = start[0] - dbox->imin[0]; \ databox##k.bsize0 = dbox->imax[0]-dbox->imin[0]; \ if (ndim > 1) \ { \ databox##k.lsize1 = loop_size[1]; \ databox##k.strides1 = stride[1]; \ databox##k.bstart1 = start[1] - dbox->imin[1]; \ databox##k.bsize1 = dbox->imax[1]-dbox->imin[1]; \ } \ else \ { \ databox##k.lsize1 = 1; \ databox##k.strides1 = 0; \ databox##k.bstart1 = 0; \ databox##k.bsize1 = 0; \ } \ if (ndim == 3) \ { \ databox##k.lsize2 = loop_size[2]; \ databox##k.strides2 = stride[2]; \ databox##k.bstart2 = start[2] - dbox->imin[2]; \ databox##k.bsize2 = dbox->imax[2]-dbox->imin[2]; \ } \ else \ { \ databox##k.lsize2 = 1; \ databox##k.strides2 = 0; \ databox##k.bstart2 = 0; \ databox##k.bsize2 = 0; \ } #define zypre_newBoxLoop0Begin(ndim, loop_size) \ { \ zypre_newBoxLoopInit(ndim,loop_size); \ forall< hypre_raja_exec_policy >(RangeSegment(0, hypre__tot), [=] hypre_RAJA_DEVICE (HYPRE_Int idx) \ { #define zypre_newBoxLoop0End() \ }); \ hypre_fence(); \ } #define zypre_newBoxLoop1Begin(ndim, loop_size, \ dbox1, start1, stride1, i1) \ { \ zypre_newBoxLoopInit(ndim,loop_size); \ zypre_BoxLoopDataDeclareK(1,ndim,loop_size,dbox1,start1,stride1); \ forall< hypre_raja_exec_policy >(RangeSegment(0, hypre__tot), [=] hypre_RAJA_DEVICE (HYPRE_Int idx) \ { \ zypre_newBoxLoopDeclare(databox1); \ zypre_BoxLoopIncK(1,databox1,i1); #define zypre_newBoxLoop1End(i1) \ }); \ hypre_fence(); \ } #define zypre_newBoxLoop2Begin(ndim, loop_size, \ dbox1, start1, stride1, i1, \ dbox2, start2, stride2, i2) \ { \ zypre_newBoxLoopInit(ndim,loop_size); \ zypre_BoxLoopDataDeclareK(1,ndim,loop_size,dbox1,start1,stride1); \ zypre_BoxLoopDataDeclareK(2,ndim,loop_size,dbox2,start2,stride2); \ forall< hypre_raja_exec_policy >(RangeSegment(0, hypre__tot), [=] hypre_RAJA_DEVICE (HYPRE_Int idx) \ { \ zypre_newBoxLoopDeclare(databox1); \ zypre_BoxLoopIncK(1,databox1,i1); \ zypre_BoxLoopIncK(2,databox2,i2); #define zypre_newBoxLoop2End(i1, i2) \ }); \ hypre_fence(); \ } #define zypre_newBoxLoop3Begin(ndim, loop_size, \ dbox1, start1, stride1, i1, \ dbox2, start2, stride2, i2, \ dbox3, start3, stride3, i3) \ { \ zypre_newBoxLoopInit(ndim,loop_size); \ zypre_BoxLoopDataDeclareK(1,ndim,loop_size,dbox1,start1,stride1); \ zypre_BoxLoopDataDeclareK(2,ndim,loop_size,dbox2,start2,stride2); \ zypre_BoxLoopDataDeclareK(3,ndim,loop_size,dbox3,start3,stride3); \ forall< hypre_raja_exec_policy >(RangeSegment(0, hypre__tot), [=] hypre_RAJA_DEVICE (HYPRE_Int idx) \ { \ zypre_newBoxLoopDeclare(databox1); \ zypre_BoxLoopIncK(1,databox1,i1); \ zypre_BoxLoopIncK(2,databox2,i2); \ zypre_BoxLoopIncK(3,databox3,i3); #define zypre_newBoxLoop3End(i1, i2, i3) \ }); \ hypre_fence(); \ } #define zypre_newBoxLoop4Begin(ndim, loop_size, \ dbox1, start1, stride1, i1, \ dbox2, start2, stride2, i2, \ dbox3, start3, stride3, i3, \ dbox4, start4, stride4, i4) \ { \ zypre_newBoxLoopInit(ndim,loop_size); \ zypre_BoxLoopDataDeclareK(1,ndim,loop_size,dbox1,start1,stride1); \ zypre_BoxLoopDataDeclareK(2,ndim,loop_size,dbox2,start2,stride2); \ zypre_BoxLoopDataDeclareK(3,ndim,loop_size,dbox3,start3,stride3); \ zypre_BoxLoopDataDeclareK(4,ndim,loop_size,dbox4,start4,stride4); \ forall< hypre_raja_exec_policy >(RangeSegment(0, hypre__tot), [=] hypre_RAJA_DEVICE (HYPRE_Int idx) \ { \ zypre_newBoxLoopDeclare(databox1); \ zypre_BoxLoopIncK(1,databox1,i1); \ zypre_BoxLoopIncK(2,databox2,i2); \ zypre_BoxLoopIncK(3,databox3,i3); \ zypre_BoxLoopIncK(4,databox4,i4); #define zypre_newBoxLoop4End(i1, i2, i3, i4) \ }); \ hypre_fence(); \ } #define zypre_BasicBoxLoopDataDeclareK(k,ndim,loop_size,stride) \ hypre_Boxloop databox##k; \ databox##k.lsize0 = loop_size[0]; \ databox##k.strides0 = stride[0]; \ databox##k.bstart0 = 0; \ databox##k.bsize0 = 0; \ if (ndim > 1) \ { \ databox##k.lsize1 = loop_size[1]; \ databox##k.strides1 = stride[1]; \ databox##k.bstart1 = 0; \ databox##k.bsize1 = 0; \ } \ else \ { \ databox##k.lsize1 = 1; \ databox##k.strides1 = 0; \ databox##k.bstart1 = 0; \ databox##k.bsize1 = 0; \ } \ if (ndim == 3) \ { \ databox##k.lsize2 = loop_size[2]; \ databox##k.strides2 = stride[2]; \ databox##k.bstart2 = 0; \ databox##k.bsize2 = 0; \ } \ else \ { \ databox##k.lsize2 = 1; \ databox##k.strides2 = 0; \ databox##k.bstart2 = 0; \ databox##k.bsize2 = 0; \ } #define zypre_newBasicBoxLoop2Begin(ndim, loop_size, \ stride1, i1, \ stride2, i2) \ { \ zypre_newBoxLoopInit(ndim,loop_size); \ zypre_BasicBoxLoopDataDeclareK(1,ndim,loop_size,stride1); \ zypre_BasicBoxLoopDataDeclareK(2,ndim,loop_size,stride2); \ forall< hypre_raja_exec_policy >(RangeSegment(0, hypre__tot), [=] hypre_RAJA_DEVICE (HYPRE_Int idx) \ { \ zypre_newBoxLoopDeclare(databox1); \ zypre_BoxLoopIncK(1,databox1,i1); \ zypre_BoxLoopIncK(2,databox2,i2); \ #define hypre_LoopBegin(size,idx) \ { \ forall< hypre_raja_exec_policy >(RangeSegment(0, size), [=] hypre_RAJA_DEVICE (HYPRE_Int idx) \ { #define hypre_LoopEnd() \ }); \ hypre_fence(); \ } #define hypre_BoxLoopGetIndex(index) \ index[0] = hypre_IndexD(local_idx, 0); \ index[1] = hypre_IndexD(local_idx, 1); \ index[2] = hypre_IndexD(local_idx, 2); #define hypre_BoxLoopBlock() 0 #define hypre_BoxLoop0Begin zypre_newBoxLoop0Begin #define hypre_BoxLoop0For zypre_newBoxLoop0For #define hypre_BoxLoop0End zypre_newBoxLoop0End #define hypre_BoxLoop1Begin zypre_newBoxLoop1Begin #define hypre_BoxLoop1For zypre_newBoxLoop1For #define hypre_BoxLoop1End zypre_newBoxLoop1End #define hypre_BoxLoop2Begin zypre_newBoxLoop2Begin #define hypre_BoxLoop2For zypre_newBoxLoop2For #define hypre_BoxLoop2End zypre_newBoxLoop2End #define hypre_BoxLoop3Begin zypre_newBoxLoop3Begin #define hypre_BoxLoop3For zypre_newBoxLoop3For #define hypre_BoxLoop3End zypre_newBoxLoop3End #define hypre_BoxLoop4Begin zypre_newBoxLoop4Begin #define hypre_BoxLoop4For zypre_newBoxLoop4For #define hypre_BoxLoop4End zypre_newBoxLoop4End #define hypre_newBoxLoopInit zypre_newBoxLoopInit #define hypre_BasicBoxLoop2Begin zypre_newBasicBoxLoop2Begin /* Reduction */ #define hypre_BoxLoop1ReductionBegin(ndim, loop_size, dbox1, start1, stride1, i1, reducesum) \ hypre_BoxLoop1Begin(ndim, loop_size, dbox1, start1, stride1, i1) #define hypre_BoxLoop1ReductionEnd(i1, reducesum) \ hypre_BoxLoop1End(i1) #define hypre_BoxLoop2ReductionBegin(ndim, loop_size, dbox1, start1, stride1, i1, \ dbox2, start2, stride2, i2, reducesum) \ hypre_BoxLoop2Begin(ndim, loop_size, dbox1, start1, stride1, i1, \ dbox2, start2, stride2, i2) #define hypre_BoxLoop2ReductionEnd(i1, i2, reducesum) \ hypre_BoxLoop2End(i1, i2) #endif #endif /* #ifndef HYPRE_BOXLOOP_RAJA_HEADER */ /****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * Header info for the BoxLoop * *****************************************************************************/ /*-------------------------------------------------------------------------- * BoxLoop macros: *--------------------------------------------------------------------------*/ #ifndef HYPRE_BOXLOOP_KOKKOS_HEADER #define HYPRE_BOXLOOP_KOKKOS_HEADER #if defined(HYPRE_USING_KOKKOS) #ifdef __cplusplus extern "C++" { #endif #include using namespace Kokkos; #ifdef __cplusplus } #endif #if defined( KOKKOS_HAVE_MPI ) #include #endif typedef struct hypre_Boxloop_struct { HYPRE_Int lsize0, lsize1, lsize2; HYPRE_Int strides0, strides1, strides2; HYPRE_Int bstart0, bstart1, bstart2; HYPRE_Int bsize0, bsize1, bsize2; } hypre_Boxloop; #define hypre_fence() /* #define hypre_fence() \ cudaError err = cudaGetLastError(); \ if ( cudaSuccess != err ) { \ printf("\n ERROR hypre_newBoxLoop: %s in %s(%d) function %s\n", cudaGetErrorString(err),__FILE__,__LINE__,__FUNCTION__); \ } \ hypre_CheckErrorDevice(cudaDeviceSynchronize()); */ #define hypre_newBoxLoopInit(ndim,loop_size) \ HYPRE_Int hypre__tot = 1; \ for (HYPRE_Int d = 0;d < ndim;d ++) \ hypre__tot *= loop_size[d]; #define hypre_BoxLoopIncK(k,box,hypre__i) \ HYPRE_Int hypre_boxD##k = 1; \ HYPRE_Int hypre__i = 0; \ hypre__i += (hypre_IndexD(local_idx, 0)*box.strides0 + box.bstart0) * hypre_boxD##k; \ hypre_boxD##k *= hypre_max(0, box.bsize0 + 1); \ hypre__i += (hypre_IndexD(local_idx, 1)*box.strides1 + box.bstart1) * hypre_boxD##k; \ hypre_boxD##k *= hypre_max(0, box.bsize1 + 1); \ hypre__i += (hypre_IndexD(local_idx, 2)*box.strides2 + box.bstart2) * hypre_boxD##k; \ hypre_boxD##k *= hypre_max(0, box.bsize2 + 1); \ #define hypre_newBoxLoopDeclare(box) \ hypre_Index local_idx; \ HYPRE_Int idx_local = idx; \ hypre_IndexD(local_idx, 0) = idx_local % box.lsize0; \ idx_local = idx_local / box.lsize0; \ hypre_IndexD(local_idx, 1) = idx_local % box.lsize1; \ idx_local = idx_local / box.lsize1; \ hypre_IndexD(local_idx, 2) = idx_local % box.lsize2; #define hypre_BoxLoopDataDeclareK(k,ndim,loop_size,dbox,start,stride) \ hypre_Boxloop databox##k; \ databox##k.lsize0 = loop_size[0]; \ databox##k.strides0 = stride[0]; \ databox##k.bstart0 = start[0] - dbox->imin[0]; \ databox##k.bsize0 = dbox->imax[0]-dbox->imin[0]; \ if (ndim > 1) \ { \ databox##k.lsize1 = loop_size[1]; \ databox##k.strides1 = stride[1]; \ databox##k.bstart1 = start[1] - dbox->imin[1]; \ databox##k.bsize1 = dbox->imax[1]-dbox->imin[1]; \ } \ else \ { \ databox##k.lsize1 = 1; \ databox##k.strides1 = 0; \ databox##k.bstart1 = 0; \ databox##k.bsize1 = 0; \ } \ if (ndim == 3) \ { \ databox##k.lsize2 = loop_size[2]; \ databox##k.strides2 = stride[2]; \ databox##k.bstart2 = start[2] - dbox->imin[2]; \ databox##k.bsize2 = dbox->imax[2]-dbox->imin[2]; \ } \ else \ { \ databox##k.lsize2 = 1; \ databox##k.strides2 = 0; \ databox##k.bstart2 = 0; \ databox##k.bsize2 = 0; \ } #define hypre_newBoxLoop0Begin(ndim, loop_size) \ { \ hypre_newBoxLoopInit(ndim,loop_size); \ Kokkos::parallel_for (hypre__tot, KOKKOS_LAMBDA (HYPRE_Int idx) \ { #define hypre_newBoxLoop0End(i1) \ }); \ hypre_fence(); \ } #define hypre_newBoxLoop1Begin(ndim, loop_size, \ dbox1, start1, stride1, i1) \ { \ hypre_newBoxLoopInit(ndim,loop_size) \ hypre_BoxLoopDataDeclareK(1,ndim,loop_size,dbox1,start1,stride1); \ Kokkos::parallel_for (hypre__tot, KOKKOS_LAMBDA (HYPRE_Int idx) \ { \ hypre_newBoxLoopDeclare(databox1); \ hypre_BoxLoopIncK(1,databox1,i1); #define hypre_newBoxLoop1End(i1) \ }); \ hypre_fence(); \ } #define hypre_newBoxLoop2Begin(ndim, loop_size, \ dbox1, start1, stride1, i1, \ dbox2, start2, stride2, i2) \ { \ hypre_newBoxLoopInit(ndim,loop_size); \ hypre_BoxLoopDataDeclareK(1,ndim,loop_size,dbox1,start1,stride1); \ hypre_BoxLoopDataDeclareK(2,ndim,loop_size,dbox2,start2,stride2); \ Kokkos::parallel_for (hypre__tot, KOKKOS_LAMBDA (HYPRE_Int idx) \ { \ hypre_newBoxLoopDeclare(databox1) \ hypre_BoxLoopIncK(1,databox1,i1); \ hypre_BoxLoopIncK(2,databox2,i2); #define hypre_newBoxLoop2End(i1, i2) \ }); \ hypre_fence(); \ } #define hypre_newBoxLoop3Begin(ndim, loop_size, \ dbox1, start1, stride1, i1, \ dbox2, start2, stride2, i2, \ dbox3, start3, stride3, i3) \ { \ hypre_newBoxLoopInit(ndim,loop_size); \ hypre_BoxLoopDataDeclareK(1,ndim,loop_size,dbox1,start1,stride1); \ hypre_BoxLoopDataDeclareK(2,ndim,loop_size,dbox2,start2,stride2); \ hypre_BoxLoopDataDeclareK(3,ndim,loop_size,dbox3,start3,stride3); \ Kokkos::parallel_for (hypre__tot, KOKKOS_LAMBDA (HYPRE_Int idx) \ { \ hypre_newBoxLoopDeclare(databox1); \ hypre_BoxLoopIncK(1,databox1,i1); \ hypre_BoxLoopIncK(2,databox2,i2); \ hypre_BoxLoopIncK(3,databox3,i3); #define hypre_newBoxLoop3End(i1, i2, i3) \ }); \ hypre_fence(); \ } #define hypre_newBoxLoop4Begin(ndim, loop_size, \ dbox1, start1, stride1, i1, \ dbox2, start2, stride2, i2, \ dbox3, start3, stride3, i3, \ dbox4, start4, stride4, i4) \ { \ hypre_newBoxLoopInit(ndim,loop_size); \ hypre_BoxLoopDataDeclareK(1,ndim,loop_size,dbox1,start1,stride1); \ hypre_BoxLoopDataDeclareK(2,ndim,loop_size,dbox2,start2,stride2); \ hypre_BoxLoopDataDeclareK(3,ndim,loop_size,dbox3,start3,stride3); \ hypre_BoxLoopDataDeclareK(4,ndim,loop_size,dbox4,start4,stride4); \ Kokkos::parallel_for (hypre__tot, KOKKOS_LAMBDA (HYPRE_Int idx) \ { \ hypre_newBoxLoopDeclare(databox1); \ hypre_BoxLoopIncK(1,databox1,i1); \ hypre_BoxLoopIncK(2,databox2,i2); \ hypre_BoxLoopIncK(3,databox3,i3); \ hypre_BoxLoopIncK(4,databox4,i4); #define hypre_newBoxLoop4End(i1, i2, i3, i4) \ }); \ hypre_fence(); \ } #define hypre_BasicBoxLoopDataDeclareK(k,ndim,loop_size,stride) \ hypre_Boxloop databox##k; \ databox##k.lsize0 = loop_size[0]; \ databox##k.strides0 = stride[0]; \ databox##k.bstart0 = 0; \ databox##k.bsize0 = 0; \ if (ndim > 1) \ { \ databox##k.lsize1 = loop_size[1]; \ databox##k.strides1 = stride[1]; \ databox##k.bstart1 = 0; \ databox##k.bsize1 = 0; \ } \ else \ { \ databox##k.lsize1 = 1; \ databox##k.strides1 = 0; \ databox##k.bstart1 = 0; \ databox##k.bsize1 = 0; \ } \ if (ndim == 3) \ { \ databox##k.lsize2 = loop_size[2]; \ databox##k.strides2 = stride[2]; \ databox##k.bstart2 = 0; \ databox##k.bsize2 = 0; \ } \ else \ { \ databox##k.lsize2 = 1; \ databox##k.strides2 = 0; \ databox##k.bstart2 = 0; \ databox##k.bsize2 = 0; \ } #define hypre_newBasicBoxLoop2Begin(ndim, loop_size, \ stride1, i1, \ stride2, i2) \ { \ hypre_newBoxLoopInit(ndim,loop_size); \ hypre_BasicBoxLoopDataDeclareK(1,ndim,loop_size,stride1); \ hypre_BasicBoxLoopDataDeclareK(2,ndim,loop_size,stride2); \ Kokkos::parallel_for (hypre__tot, KOKKOS_LAMBDA (HYPRE_Int idx) \ { \ hypre_newBoxLoopDeclare(databox1); \ hypre_BoxLoopIncK(1,databox1,i1); \ hypre_BoxLoopIncK(2,databox2,i2); \ #define hypre_BoxLoop1ReductionBegin(ndim, loop_size, \ dbox1, start1, stride1, i1, \ HYPRE_BOX_REDUCTION) \ { \ HYPRE_Real __hypre_sum_tmp = HYPRE_BOX_REDUCTION; \ HYPRE_BOX_REDUCTION = 0.0; \ hypre_newBoxLoopInit(ndim,loop_size); \ hypre_BoxLoopDataDeclareK(1,ndim,loop_size,dbox1,start1,stride1); \ Kokkos::parallel_reduce (hypre__tot, KOKKOS_LAMBDA (HYPRE_Int idx, \ HYPRE_Real &HYPRE_BOX_REDUCTION) \ { \ hypre_newBoxLoopDeclare(databox1); \ hypre_BoxLoopIncK(1,databox1,i1); \ #define hypre_BoxLoop1ReductionEnd(i1, HYPRE_BOX_REDUCTION) \ }, HYPRE_BOX_REDUCTION); \ hypre_fence(); \ HYPRE_BOX_REDUCTION += __hypre_sum_tmp; \ } #define hypre_BoxLoop2ReductionBegin(ndim, loop_size, \ dbox1, start1, stride1, i1, \ dbox2, start2, stride2, i2, \ HYPRE_BOX_REDUCTION) \ { \ HYPRE_Real __hypre_sum_tmp = HYPRE_BOX_REDUCTION; \ HYPRE_BOX_REDUCTION = 0.0; \ hypre_newBoxLoopInit(ndim,loop_size); \ hypre_BoxLoopDataDeclareK(1,ndim,loop_size,dbox1,start1,stride1); \ hypre_BoxLoopDataDeclareK(2,ndim,loop_size,dbox2,start2,stride2); \ Kokkos::parallel_reduce (hypre__tot, KOKKOS_LAMBDA (HYPRE_Int idx, \ HYPRE_Real &HYPRE_BOX_REDUCTION) \ { \ hypre_newBoxLoopDeclare(databox1); \ hypre_BoxLoopIncK(1,databox1,i1); \ hypre_BoxLoopIncK(2,databox2,i2); \ #define hypre_BoxLoop2ReductionEnd(i1, i2, HYPRE_BOX_REDUCTION) \ }, HYPRE_BOX_REDUCTION); \ hypre_fence(); \ HYPRE_BOX_REDUCTION += __hypre_sum_tmp; \ } #define hypre_LoopBegin(size,idx) \ { \ Kokkos::parallel_for(size, KOKKOS_LAMBDA (HYPRE_Int idx) \ { #define hypre_LoopEnd() \ }); \ hypre_fence(); \ } /* extern "C++" { struct ColumnSums { typedef HYPRE_Real value_type[]; typedef View::size_type size_type; size_type value_count; View X_; ColumnSums(const View& X):value_count(X.dimension_1()),X_(X){} KOKKOS_INLINE_FUNCTION void operator()(const size_type i,value_type sum) const { for (size_type j = 0;j < value_count;j++) { sum[j] += X_(i,j); } } KOKKOS_INLINE_FUNCTION void join (volatile value_type dst,volatile value_type src) const { for (size_type j= 0;j < value_count;j++) { dst[j] +=src[j]; } } KOKKOS_INLINE_FUNCTION void init(value_type sum) const { for (size_type j= 0;j < value_count;j++) { sum[j] += 0.0; } } }; } */ #define hypre_BoxLoopGetIndex(index) \ index[0] = hypre_IndexD(local_idx, 0); \ index[1] = hypre_IndexD(local_idx, 1); \ index[2] = hypre_IndexD(local_idx, 2); #define hypre_BoxLoopBlock() 0 #define hypre_BoxLoop0Begin hypre_newBoxLoop0Begin #define hypre_BoxLoop0For hypre_newBoxLoop0For #define hypre_BoxLoop0End hypre_newBoxLoop0End #define hypre_BoxLoop1Begin hypre_newBoxLoop1Begin #define hypre_BoxLoop1For hypre_newBoxLoop1For #define hypre_BoxLoop1End hypre_newBoxLoop1End #define hypre_BoxLoop2Begin hypre_newBoxLoop2Begin #define hypre_BoxLoop2For hypre_newBoxLoop2For #define hypre_BoxLoop2End hypre_newBoxLoop2End #define hypre_BoxLoop3Begin hypre_newBoxLoop3Begin #define hypre_BoxLoop3For hypre_newBoxLoop3For #define hypre_BoxLoop3End hypre_newBoxLoop3End #define hypre_BoxLoop4Begin hypre_newBoxLoop4Begin #define hypre_BoxLoop4For hypre_newBoxLoop4For #define hypre_BoxLoop4End hypre_newBoxLoop4End #define hypre_BasicBoxLoop2Begin hypre_newBasicBoxLoop2Begin #endif #endif /* #ifndef HYPRE_BOXLOOP_KOKKOS_HEADER */ /****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * Header info for the BoxLoop * *****************************************************************************/ /*-------------------------------------------------------------------------- * BoxLoop macros: *--------------------------------------------------------------------------*/ #ifndef HYPRE_BOXLOOP_CUDA_HEADER #define HYPRE_BOXLOOP_CUDA_HEADER #if (defined(HYPRE_USING_CUDA) || defined(HYPRE_USING_HIP)) && !defined(HYPRE_USING_RAJA) && !defined(HYPRE_USING_KOKKOS) #define HYPRE_LAMBDA [=] __host__ __device__ /* TODO: RL: support 4-D */ typedef struct hypre_Boxloop_struct { HYPRE_Int lsize0, lsize1, lsize2; HYPRE_Int strides0, strides1, strides2; HYPRE_Int bstart0, bstart1, bstart2; HYPRE_Int bsize0, bsize1, bsize2; } hypre_Boxloop; #ifdef __cplusplus extern "C++" { #endif /* ------------------------- * parfor-loop * ------------------------*/ template __global__ void forall_kernel( hypre_DeviceItem & item, LOOP_BODY loop_body, HYPRE_Int length ) { const HYPRE_Int idx = hypre_gpu_get_grid_thread_id<1, 1>(item); /* const HYPRE_Int number_threads = hypre_gpu_get_grid_num_threads<1,1>(item); */ if (idx < length) { loop_body(idx); } } template void BoxLoopforall( HYPRE_Int length, LOOP_BODY loop_body ) { const HYPRE_MemoryLocation memory_location = hypre_HandleMemoryLocation(hypre_handle()); const HYPRE_ExecutionPolicy exec_policy = hypre_GetExecPolicy1(memory_location); if (exec_policy == HYPRE_EXEC_HOST) { #ifdef HYPRE_USING_OPENMP #pragma omp parallel for HYPRE_SMP_SCHEDULE #endif for (HYPRE_Int idx = 0; idx < length; idx++) { loop_body(idx); } } else if (exec_policy == HYPRE_EXEC_DEVICE) { const dim3 bDim = hypre_GetDefaultDeviceBlockDimension(); const dim3 gDim = hypre_GetDefaultDeviceGridDimension(length, "thread", bDim); HYPRE_GPU_LAUNCH( forall_kernel, gDim, bDim, loop_body, length ); } } /* ------------------------------ * parforreduction-loop * -----------------------------*/ template __global__ void reductionforall_kernel( hypre_DeviceItem & item, HYPRE_Int length, REDUCER reducer, LOOP_BODY loop_body ) { const HYPRE_Int thread_id = hypre_gpu_get_grid_thread_id<1, 1>(item); const HYPRE_Int n_threads = hypre_gpu_get_grid_num_threads<1, 1>(item); for (HYPRE_Int idx = thread_id; idx < length; idx += n_threads) { loop_body(idx, reducer); } /* reduction in block-level and the save the results in reducer */ reducer.BlockReduce(); } template void ReductionBoxLoopforall( HYPRE_Int length, REDUCER & reducer, LOOP_BODY loop_body ) { if (length <= 0) { return; } const HYPRE_MemoryLocation memory_location = hypre_HandleMemoryLocation(hypre_handle()); const HYPRE_ExecutionPolicy exec_policy = hypre_GetExecPolicy1(memory_location); if (exec_policy == HYPRE_EXEC_HOST) { for (HYPRE_Int idx = 0; idx < length; idx++) { loop_body(idx, reducer); } } else if (exec_policy == HYPRE_EXEC_DEVICE) { /* Assume gDim cannot exceed HYPRE_MAX_NTHREADS_BLOCK (the max size for the 2nd reduction) * and bDim <= WARP * WARP (because we use 1 warp fro the block-level reduction) */ const dim3 bDim = hypre_GetDefaultDeviceBlockDimension(); dim3 gDim = hypre_GetDefaultDeviceGridDimension(length, "thread", bDim); gDim.x = hypre_min(gDim.x, HYPRE_MAX_NTHREADS_BLOCK); reducer.nblocks = gDim.x; reducer.Allocate2ndPhaseBuffer(); /* hypre_printf("length= %d, blocksize = %d, gridsize = %d\n", length, bDim.x, gDim.x); */ HYPRE_GPU_LAUNCH( reductionforall_kernel, gDim, bDim, length, reducer, loop_body ); } } #ifdef __cplusplus } #endif /* Get 1-D length of the loop, in hypre__tot */ #define hypre_newBoxLoopInit(ndim, loop_size) \ HYPRE_Int hypre__tot = 1; \ for (HYPRE_Int hypre_d = 0; hypre_d < ndim; hypre_d ++) \ { \ hypre__tot *= loop_size[hypre_d]; \ } /* Initialize struct for box-k */ #define hypre_BoxLoopDataDeclareK(k, ndim, loop_size, dbox, start, stride) \ hypre_Boxloop databox##k; \ /* dim 0 */ \ databox##k.lsize0 = loop_size[0]; \ databox##k.strides0 = stride[0]; \ databox##k.bstart0 = start[0] - dbox->imin[0]; \ databox##k.bsize0 = dbox->imax[0] - dbox->imin[0]; \ /* dim 1 */ \ if (ndim > 1) \ { \ databox##k.lsize1 = loop_size[1]; \ databox##k.strides1 = stride[1]; \ databox##k.bstart1 = start[1] - dbox->imin[1]; \ databox##k.bsize1 = dbox->imax[1] - dbox->imin[1]; \ } \ else \ { \ databox##k.lsize1 = 1; \ databox##k.strides1 = 0; \ databox##k.bstart1 = 0; \ databox##k.bsize1 = 0; \ } \ /* dim 2 */ \ if (ndim == 3) \ { \ databox##k.lsize2 = loop_size[2]; \ databox##k.strides2 = stride[2]; \ databox##k.bstart2 = start[2] - dbox->imin[2]; \ databox##k.bsize2 = dbox->imax[2] - dbox->imin[2]; \ } \ else \ { \ databox##k.lsize2 = 1; \ databox##k.strides2 = 0; \ databox##k.bstart2 = 0; \ databox##k.bsize2 = 0; \ } #define hypre_BasicBoxLoopDataDeclareK(k,ndim,loop_size,stride) \ hypre_Boxloop databox##k; \ databox##k.lsize0 = loop_size[0]; \ databox##k.strides0 = stride[0]; \ databox##k.bstart0 = 0; \ databox##k.bsize0 = 0; \ if (ndim > 1) \ { \ databox##k.lsize1 = loop_size[1]; \ databox##k.strides1 = stride[1]; \ databox##k.bstart1 = 0; \ databox##k.bsize1 = 0; \ } \ else \ { \ databox##k.lsize1 = 1; \ databox##k.strides1 = 0; \ databox##k.bstart1 = 0; \ databox##k.bsize1 = 0; \ } \ if (ndim == 3) \ { \ databox##k.lsize2 = loop_size[2]; \ databox##k.strides2 = stride[2]; \ databox##k.bstart2 = 0; \ databox##k.bsize2 = 0; \ } \ else \ { \ databox##k.lsize2 = 1; \ databox##k.strides2 = 0; \ databox##k.bstart2 = 0; \ databox##k.bsize2 = 0; \ } /* RL: TODO loop_size out of box struct, bsize +1 */ /* Given input 1-D 'idx' in box, get 3-D 'local_idx' in loop_size */ #define hypre_newBoxLoopDeclare(box) \ hypre_Index local_idx; \ HYPRE_Int idx_local = idx; \ hypre_IndexD(local_idx, 0) = idx_local % box.lsize0; \ idx_local = idx_local / box.lsize0; \ hypre_IndexD(local_idx, 1) = idx_local % box.lsize1; \ idx_local = idx_local / box.lsize1; \ hypre_IndexD(local_idx, 2) = idx_local % box.lsize2; \ /* Given input 3-D 'local_idx', get 1-D 'hypre__i' in 'box' */ #define hypre_BoxLoopIncK(k, box, hypre__i) \ HYPRE_Int hypre_boxD##k = 1; \ HYPRE_Int hypre__i = 0; \ hypre__i += (hypre_IndexD(local_idx, 0) * box.strides0 + box.bstart0) * hypre_boxD##k; \ hypre_boxD##k *= hypre_max(0, box.bsize0 + 1); \ hypre__i += (hypre_IndexD(local_idx, 1) * box.strides1 + box.bstart1) * hypre_boxD##k; \ hypre_boxD##k *= hypre_max(0, box.bsize1 + 1); \ hypre__i += (hypre_IndexD(local_idx, 2) * box.strides2 + box.bstart2) * hypre_boxD##k; \ hypre_boxD##k *= hypre_max(0, box.bsize2 + 1); /* get 3-D local_idx into 'index' */ #define hypre_BoxLoopGetIndexCUDA(index) \ index[0] = hypre_IndexD(local_idx, 0); \ index[1] = hypre_IndexD(local_idx, 1); \ index[2] = hypre_IndexD(local_idx, 2); /* BoxLoop 0 */ #define hypre_BoxLoop0BeginCUDA(ndim, loop_size) \ { \ hypre_newBoxLoopInit(ndim, loop_size); \ BoxLoopforall(hypre__tot, HYPRE_LAMBDA (HYPRE_Int idx) \ { #define hypre_BoxLoop0EndCUDA() \ }); \ } /* BoxLoop 1 */ #define hypre_BoxLoop1BeginCUDA(ndim, loop_size, dbox1, start1, stride1, i1) \ { \ hypre_newBoxLoopInit(ndim, loop_size); \ hypre_BoxLoopDataDeclareK(1, ndim, loop_size, dbox1, start1, stride1); \ BoxLoopforall(hypre__tot, HYPRE_LAMBDA (HYPRE_Int idx) \ { \ hypre_newBoxLoopDeclare(databox1); \ hypre_BoxLoopIncK(1, databox1, i1); #define hypre_BoxLoop1EndCUDA(i1) \ }); \ } /* BoxLoop 2 */ #define hypre_BoxLoop2BeginCUDA(ndim, loop_size, dbox1, start1, stride1, i1, \ dbox2, start2, stride2, i2) \ { \ hypre_newBoxLoopInit(ndim, loop_size); \ hypre_BoxLoopDataDeclareK(1, ndim, loop_size, dbox1, start1, stride1); \ hypre_BoxLoopDataDeclareK(2, ndim, loop_size, dbox2, start2, stride2); \ BoxLoopforall(hypre__tot, HYPRE_LAMBDA (HYPRE_Int idx) \ { \ hypre_newBoxLoopDeclare(databox1); \ hypre_BoxLoopIncK(1, databox1, i1); \ hypre_BoxLoopIncK(2, databox2, i2); #define hypre_BoxLoop2EndCUDA(i1, i2) \ }); \ } /* BoxLoop 3 */ #define hypre_BoxLoop3BeginCUDA(ndim, loop_size, dbox1, start1, stride1, i1, \ dbox2, start2, stride2, i2, \ dbox3, start3, stride3, i3) \ { \ hypre_newBoxLoopInit(ndim, loop_size); \ hypre_BoxLoopDataDeclareK(1, ndim,loop_size, dbox1, start1, stride1); \ hypre_BoxLoopDataDeclareK(2, ndim,loop_size, dbox2, start2, stride2); \ hypre_BoxLoopDataDeclareK(3, ndim,loop_size, dbox3, start3, stride3); \ BoxLoopforall(hypre__tot, HYPRE_LAMBDA (HYPRE_Int idx) \ { \ hypre_newBoxLoopDeclare(databox1); \ hypre_BoxLoopIncK(1, databox1, i1); \ hypre_BoxLoopIncK(2, databox2, i2); \ hypre_BoxLoopIncK(3, databox3, i3); #define hypre_BoxLoop3EndCUDA(i1, i2, i3) \ }); \ } /* BoxLoop 4 */ #define hypre_BoxLoop4BeginCUDA(ndim, loop_size, dbox1, start1, stride1, i1, \ dbox2, start2, stride2, i2, \ dbox3, start3, stride3, i3, \ dbox4, start4, stride4, i4) \ { \ hypre_newBoxLoopInit(ndim, loop_size); \ hypre_BoxLoopDataDeclareK(1, ndim, loop_size, dbox1, start1, stride1); \ hypre_BoxLoopDataDeclareK(2, ndim, loop_size, dbox2, start2, stride2); \ hypre_BoxLoopDataDeclareK(3, ndim, loop_size, dbox3, start3, stride3); \ hypre_BoxLoopDataDeclareK(4, ndim, loop_size, dbox4, start4, stride4); \ BoxLoopforall(hypre__tot, HYPRE_LAMBDA (HYPRE_Int idx) \ { \ hypre_newBoxLoopDeclare(databox1); \ hypre_BoxLoopIncK(1, databox1, i1); \ hypre_BoxLoopIncK(2, databox2, i2); \ hypre_BoxLoopIncK(3, databox3, i3); \ hypre_BoxLoopIncK(4, databox4, i4); #define hypre_BoxLoop4EndCUDA(i1, i2, i3, i4) \ }); \ } /* Basic BoxLoops have no boxes */ /* BoxLoop 1 */ #define hypre_BasicBoxLoop1BeginCUDA(ndim, loop_size, stride1, i1) \ { \ hypre_newBoxLoopInit(ndim, loop_size); \ hypre_BasicBoxLoopDataDeclareK(1, ndim, loop_size, stride1); \ BoxLoopforall(hypre__tot, HYPRE_LAMBDA (HYPRE_Int idx) \ { \ hypre_newBoxLoopDeclare(databox1); \ hypre_BoxLoopIncK(1, databox1, i1); /* BoxLoop 2 */ #define hypre_BasicBoxLoop2BeginCUDA(ndim, loop_size, stride1, i1, stride2, i2) \ { \ hypre_newBoxLoopInit(ndim, loop_size); \ hypre_BasicBoxLoopDataDeclareK(1, ndim, loop_size, stride1); \ hypre_BasicBoxLoopDataDeclareK(2, ndim, loop_size, stride2); \ BoxLoopforall(hypre__tot, HYPRE_LAMBDA (HYPRE_Int idx) \ { \ hypre_newBoxLoopDeclare(databox1); \ hypre_BoxLoopIncK(1, databox1, i1); \ hypre_BoxLoopIncK(2, databox2, i2); \ /* Parallel for-loop */ #define hypre_LoopBeginCUDA(size, idx) \ { \ BoxLoopforall(size, HYPRE_LAMBDA (HYPRE_Int idx) \ { #define hypre_LoopEndCUDA() \ }); \ } /* Reduction BoxLoop1 */ #define hypre_BoxLoop1ReductionBeginCUDA(ndim, loop_size, dbox1, start1, stride1, i1, reducesum) \ { \ hypre_newBoxLoopInit(ndim, loop_size); \ hypre_BoxLoopDataDeclareK(1, ndim, loop_size, dbox1, start1, stride1); \ ReductionBoxLoopforall(hypre__tot, reducesum, HYPRE_LAMBDA (HYPRE_Int idx, decltype(reducesum) &reducesum) \ { \ hypre_newBoxLoopDeclare(databox1); \ hypre_BoxLoopIncK(1, databox1, i1); #define hypre_BoxLoop1ReductionEndCUDA(i1, reducesum) \ }); \ } /* Reduction BoxLoop2 */ #define hypre_BoxLoop2ReductionBeginCUDA(ndim, loop_size, dbox1, start1, stride1, i1, \ dbox2, start2, stride2, i2, reducesum) \ { \ hypre_newBoxLoopInit(ndim, loop_size); \ hypre_BoxLoopDataDeclareK(1, ndim, loop_size, dbox1, start1, stride1); \ hypre_BoxLoopDataDeclareK(2, ndim, loop_size, dbox2, start2, stride2); \ ReductionBoxLoopforall(hypre__tot, reducesum, HYPRE_LAMBDA (HYPRE_Int idx, decltype(reducesum) &reducesum) \ { \ hypre_newBoxLoopDeclare(databox1); \ hypre_BoxLoopIncK(1, databox1, i1); \ hypre_BoxLoopIncK(2, databox2, i2); #define hypre_BoxLoop2ReductionEndCUDA(i1, i2, reducesum) \ }); \ } /* Renamings */ #define hypre_BoxLoopGetIndexDevice hypre_BoxLoopGetIndexCUDA #define hypre_BoxLoopBlockDevice() 0 #define hypre_BoxLoop0BeginDevice hypre_BoxLoop0BeginCUDA #define hypre_BoxLoop0EndDevice hypre_BoxLoop0EndCUDA #define hypre_BoxLoop1BeginDevice hypre_BoxLoop1BeginCUDA #define hypre_BoxLoop1EndDevice hypre_BoxLoop1EndCUDA #define hypre_BoxLoop2BeginDevice hypre_BoxLoop2BeginCUDA #define hypre_BoxLoop2EndDevice hypre_BoxLoop2EndCUDA #define hypre_BoxLoop3BeginDevice hypre_BoxLoop3BeginCUDA #define hypre_BoxLoop3EndDevice hypre_BoxLoop3EndCUDA #define hypre_BoxLoop4BeginDevice hypre_BoxLoop4BeginCUDA #define hypre_BoxLoop4EndDevice hypre_BoxLoop4EndCUDA #define hypre_BasicBoxLoop1BeginDevice hypre_BasicBoxLoop1BeginCUDA #define hypre_BasicBoxLoop2BeginDevice hypre_BasicBoxLoop2BeginCUDA #define hypre_LoopBeginDevice hypre_LoopBeginCUDA #define hypre_LoopEndDevice hypre_LoopEndCUDA #define hypre_BoxLoop1ReductionBeginDevice hypre_BoxLoop1ReductionBeginCUDA #define hypre_BoxLoop1ReductionEndDevice hypre_BoxLoop1ReductionEndCUDA #define hypre_BoxLoop2ReductionBeginDevice hypre_BoxLoop2ReductionBeginCUDA #define hypre_BoxLoop2ReductionEndDevice hypre_BoxLoop2ReductionEndCUDA //TODO TEMP FIX #define hypre_BoxLoopGetIndex hypre_BoxLoopGetIndexDevice #define hypre_BoxLoopBlock() 0 #define hypre_BoxLoop0Begin hypre_BoxLoop0BeginDevice #define hypre_BoxLoop0End hypre_BoxLoop0EndDevice #define hypre_BoxLoop1Begin hypre_BoxLoop1BeginDevice #define hypre_BoxLoop1End hypre_BoxLoop1EndDevice #define hypre_BoxLoop2Begin hypre_BoxLoop2BeginDevice #define hypre_BoxLoop2End hypre_BoxLoop2EndDevice #define hypre_BoxLoop3Begin hypre_BoxLoop3BeginDevice #define hypre_BoxLoop3End hypre_BoxLoop3EndDevice #define hypre_BoxLoop4Begin hypre_BoxLoop4BeginDevice #define hypre_BoxLoop4End hypre_BoxLoop4EndDevice #define hypre_BasicBoxLoop1Begin hypre_BasicBoxLoop1BeginDevice #define hypre_BasicBoxLoop2Begin hypre_BasicBoxLoop2BeginDevice #define hypre_LoopBegin hypre_LoopBeginDevice #define hypre_LoopEnd hypre_LoopEndDevice #define hypre_BoxLoop1ReductionBegin hypre_BoxLoop1ReductionBeginDevice #define hypre_BoxLoop1ReductionEnd hypre_BoxLoop1ReductionEndDevice #define hypre_BoxLoop2ReductionBegin hypre_BoxLoop2ReductionBeginDevice #define hypre_BoxLoop2ReductionEnd hypre_BoxLoop2ReductionEndDevice #endif #endif /* #ifndef HYPRE_BOXLOOP_CUDA_HEADER */ /****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * Header info for the BoxLoop * *****************************************************************************/ /*-------------------------------------------------------------------------- * BoxLoop macros: *--------------------------------------------------------------------------*/ #ifndef HYPRE_BOXLOOP_SYCL_HEADER #define HYPRE_BOXLOOP_SYCL_HEADER #if defined(HYPRE_USING_SYCL) && !defined(HYPRE_USING_RAJA) && !defined(HYPRE_USING_KOKKOS) typedef struct hypre_Boxloop_struct { HYPRE_Int lsize0, lsize1, lsize2; HYPRE_Int strides0, strides1, strides2; HYPRE_Int bstart0, bstart1, bstart2; HYPRE_Int bsize0, bsize1, bsize2; } hypre_Boxloop; #ifdef __cplusplus extern "C++" { #endif /********************************************************************* * wrapper functions calling sycl parallel_for * WM: todo - add runtime switch between CPU/GPU execution *********************************************************************/ template void BoxLoopforall( HYPRE_Int length, LOOP_BODY loop_body) { if (length <= 0) { return; } dim3 bDim = hypre_GetDefaultDeviceBlockDimension(); dim3 gDim = hypre_GetDefaultDeviceGridDimension(length, "thread", bDim); hypre_HandleComputeStream(hypre_handle())->submit([&] (sycl::handler & cgh) { cgh.parallel_for(sycl::nd_range<3>(gDim * bDim, bDim), loop_body); }).wait_and_throw(); } template void ReductionBoxLoopforall( LOOP_BODY loop_body, HYPRE_Int length, HYPRE_Real * shared_sum_var ) { if (length <= 0) { return; } dim3 bDim = hypre_GetDefaultDeviceBlockDimension(); dim3 gDim = hypre_GetDefaultDeviceGridDimension(length, "thread", bDim); hypre_HandleComputeStream(hypre_handle())->submit([&] (sycl::handler & cgh) { cgh.parallel_for(sycl::nd_range<3>(gDim * bDim, bDim), sycl::reduction(shared_sum_var, std::plus<>()), loop_body); }).wait_and_throw(); } #ifdef __cplusplus } #endif /********************************************************************* * Init/Declare/IncK etc. *********************************************************************/ /* Get 1-D length of the loop, in hypre__tot */ #define hypre_newBoxLoopInit(ndim, loop_size) \ HYPRE_Int hypre__tot = 1; \ for (HYPRE_Int hypre_d = 0; hypre_d < ndim; hypre_d ++) \ { \ hypre__tot *= loop_size[hypre_d]; \ } /* Initialize struct for box-k */ #define hypre_BoxLoopDataDeclareK(k, ndim, loop_size, dbox, start, stride) \ hypre_Boxloop databox##k; \ databox##k.lsize0 = loop_size[0]; \ databox##k.strides0 = stride[0]; \ databox##k.bstart0 = start[0] - dbox->imin[0]; \ databox##k.bsize0 = dbox->imax[0] - dbox->imin[0]; \ if (ndim > 1) \ { \ databox##k.lsize1 = loop_size[1]; \ databox##k.strides1 = stride[1]; \ databox##k.bstart1 = start[1] - dbox->imin[1]; \ databox##k.bsize1 = dbox->imax[1] - dbox->imin[1]; \ } \ else \ { \ databox##k.lsize1 = 1; \ databox##k.strides1 = 0; \ databox##k.bstart1 = 0; \ databox##k.bsize1 = 0; \ } \ if (ndim == 3) \ { \ databox##k.lsize2 = loop_size[2]; \ databox##k.strides2 = stride[2]; \ databox##k.bstart2 = start[2] - dbox->imin[2]; \ databox##k.bsize2 = dbox->imax[2] - dbox->imin[2]; \ } \ else \ { \ databox##k.lsize2 = 1; \ databox##k.strides2 = 0; \ databox##k.bstart2 = 0; \ databox##k.bsize2 = 0; \ } #define hypre_BasicBoxLoopDataDeclareK(k,ndim,loop_size,stride) \ hypre_Boxloop databox##k; \ databox##k.lsize0 = loop_size[0]; \ databox##k.strides0 = stride[0]; \ databox##k.bstart0 = 0; \ databox##k.bsize0 = 0; \ if (ndim > 1) \ { \ databox##k.lsize1 = loop_size[1]; \ databox##k.strides1 = stride[1]; \ databox##k.bstart1 = 0; \ databox##k.bsize1 = 0; \ } \ else \ { \ databox##k.lsize1 = 1; \ databox##k.strides1 = 0; \ databox##k.bstart1 = 0; \ databox##k.bsize1 = 0; \ } \ if (ndim == 3) \ { \ databox##k.lsize2 = loop_size[2]; \ databox##k.strides2 = stride[2]; \ databox##k.bstart2 = 0; \ databox##k.bsize2 = 0; \ } \ else \ { \ databox##k.lsize2 = 1; \ databox##k.strides2 = 0; \ databox##k.bstart2 = 0; \ databox##k.bsize2 = 0; \ } /* Given input 1-D 'idx' in box, get 3-D 'local_idx' in loop_size */ #define hypre_newBoxLoopDeclare(box) \ hypre_Index local_idx; \ HYPRE_Int idx_local = idx; \ hypre_IndexD(local_idx, 0) = idx_local % box.lsize0; \ idx_local = idx_local / box.lsize0; \ hypre_IndexD(local_idx, 1) = idx_local % box.lsize1; \ idx_local = idx_local / box.lsize1; \ hypre_IndexD(local_idx, 2) = idx_local % box.lsize2; \ /* Given input 3-D 'local_idx', get 1-D 'hypre__i' in 'box' */ #define hypre_BoxLoopIncK(k, box, hypre__i) \ HYPRE_Int hypre_boxD##k = 1; \ HYPRE_Int hypre__i = 0; \ hypre__i += (hypre_IndexD(local_idx, 0) * box.strides0 + box.bstart0) * hypre_boxD##k; \ hypre_boxD##k *= hypre_max(0, box.bsize0 + 1); \ hypre__i += (hypre_IndexD(local_idx, 1) * box.strides1 + box.bstart1) * hypre_boxD##k; \ hypre_boxD##k *= hypre_max(0, box.bsize1 + 1); \ hypre__i += (hypre_IndexD(local_idx, 2) * box.strides2 + box.bstart2) * hypre_boxD##k; \ hypre_boxD##k *= hypre_max(0, box.bsize2 + 1); /* get 3-D local_idx into 'index' */ #define hypre_BoxLoopGetIndex(index) \ index[0] = hypre_IndexD(local_idx, 0); \ index[1] = hypre_IndexD(local_idx, 1); \ index[2] = hypre_IndexD(local_idx, 2); /********************************************************************* * Boxloops *********************************************************************/ /* BoxLoop 0 */ #define hypre_newBoxLoop0Begin(ndim, loop_size) \ { \ hypre_newBoxLoopInit(ndim, loop_size); \ BoxLoopforall(hypre__tot, [=] (sycl::nd_item<3> item) \ { \ HYPRE_Int idx = (HYPRE_Int) item.get_global_linear_id(); \ if (idx < hypre__tot) \ { \ #define hypre_newBoxLoop0End() \ } \ }); \ } /* BoxLoop 1 */ #define hypre_newBoxLoop1Begin(ndim, loop_size, dbox1, start1, stride1, i1) \ { \ hypre_newBoxLoopInit(ndim, loop_size); \ hypre_BoxLoopDataDeclareK(1, ndim, loop_size, dbox1, start1, stride1); \ BoxLoopforall(hypre__tot, [=] (sycl::nd_item<3> item) \ { \ HYPRE_Int idx = (HYPRE_Int) item.get_global_linear_id(); \ if (idx < hypre__tot) \ { \ hypre_newBoxLoopDeclare(databox1); \ hypre_BoxLoopIncK(1, databox1, i1); #define hypre_newBoxLoop1End(i1) \ } \ }); \ } /* BoxLoop 2 */ #define hypre_newBoxLoop2Begin(ndim, loop_size, dbox1, start1, stride1, i1, \ dbox2, start2, stride2, i2) \ { \ hypre_newBoxLoopInit(ndim, loop_size); \ hypre_BoxLoopDataDeclareK(1, ndim, loop_size, dbox1, start1, stride1); \ hypre_BoxLoopDataDeclareK(2, ndim, loop_size, dbox2, start2, stride2); \ BoxLoopforall(hypre__tot, [=] (sycl::nd_item<3> item) \ { \ HYPRE_Int idx = (HYPRE_Int) item.get_global_linear_id(); \ if (idx < hypre__tot) \ { \ hypre_newBoxLoopDeclare(databox1); \ hypre_BoxLoopIncK(1, databox1, i1); \ hypre_BoxLoopIncK(2, databox2, i2); #define hypre_newBoxLoop2End(i1, i2) \ } \ }); \ } /* BoxLoop 3 */ #define hypre_newBoxLoop3Begin(ndim, loop_size, dbox1, start1, stride1, i1, \ dbox2, start2, stride2, i2, \ dbox3, start3, stride3, i3) \ { \ hypre_newBoxLoopInit(ndim, loop_size); \ hypre_BoxLoopDataDeclareK(1, ndim,loop_size, dbox1, start1, stride1); \ hypre_BoxLoopDataDeclareK(2, ndim,loop_size, dbox2, start2, stride2); \ hypre_BoxLoopDataDeclareK(3, ndim,loop_size, dbox3, start3, stride3); \ BoxLoopforall(hypre__tot, [=] (sycl::nd_item<3> item) \ { \ HYPRE_Int idx = (HYPRE_Int) item.get_global_linear_id(); \ if (idx < hypre__tot) \ { \ hypre_newBoxLoopDeclare(databox1); \ hypre_BoxLoopIncK(1, databox1, i1); \ hypre_BoxLoopIncK(2, databox2, i2); \ hypre_BoxLoopIncK(3, databox3, i3); #define hypre_newBoxLoop3End(i1, i2, i3) \ } \ }); \ } /* BoxLoop 4 */ #define hypre_newBoxLoop4Begin(ndim, loop_size, dbox1, start1, stride1, i1, \ dbox2, start2, stride2, i2, \ dbox3, start3, stride3, i3, \ dbox4, start4, stride4, i4) \ { \ hypre_newBoxLoopInit(ndim, loop_size); \ hypre_BoxLoopDataDeclareK(1, ndim, loop_size, dbox1, start1, stride1); \ hypre_BoxLoopDataDeclareK(2, ndim, loop_size, dbox2, start2, stride2); \ hypre_BoxLoopDataDeclareK(3, ndim, loop_size, dbox3, start3, stride3); \ hypre_BoxLoopDataDeclareK(4, ndim, loop_size, dbox4, start4, stride4); \ BoxLoopforall(hypre__tot, [=] (sycl::nd_item<3> item) \ { \ HYPRE_Int idx = (HYPRE_Int) item.get_global_linear_id(); \ if (idx < hypre__tot) \ { \ hypre_newBoxLoopDeclare(databox1); \ hypre_BoxLoopIncK(1, databox1, i1); \ hypre_BoxLoopIncK(2, databox2, i2); \ hypre_BoxLoopIncK(3, databox3, i3); \ hypre_BoxLoopIncK(4, databox4, i4); #define hypre_newBoxLoop4End(i1, i2, i3, i4) \ } \ }); \ } /* Basic BoxLoops have no boxes */ /* BoxLoop 1 */ #define hypre_newBasicBoxLoop1Begin(ndim, loop_size, stride1, i1) \ { \ hypre_newBoxLoopInit(ndim, loop_size); \ hypre_BasicBoxLoopDataDeclareK(1, ndim, loop_size, stride1); \ BoxLoopforall(hypre__tot, [=] (sycl::nd_item<3> item) \ { \ HYPRE_Int idx = (HYPRE_Int) item.get_global_linear_id(); \ if (idx < hypre__tot) \ { \ hypre_newBoxLoopDeclare(databox1); \ hypre_BoxLoopIncK(1, databox1, i1); /* BoxLoop 2 */ #define hypre_newBasicBoxLoop2Begin(ndim, loop_size, stride1, i1, stride2, i2) \ { \ hypre_newBoxLoopInit(ndim, loop_size); \ hypre_BasicBoxLoopDataDeclareK(1, ndim, loop_size, stride1); \ hypre_BasicBoxLoopDataDeclareK(2, ndim, loop_size, stride2); \ BoxLoopforall(hypre__tot, [=] (sycl::nd_item<3> item) \ { \ HYPRE_Int idx = (HYPRE_Int) item.get_global_linear_id(); \ if (idx < hypre__tot) \ { \ hypre_newBoxLoopDeclare(databox1); \ hypre_BoxLoopIncK(1, databox1, i1); \ hypre_BoxLoopIncK(2, databox2, i2); /* Reduction BoxLoop1 */ #define hypre_newBoxLoop1ReductionBegin(ndim, loop_size, dbox1, start1, stride1, i1, sum_var) \ { \ hypre_newBoxLoopInit(ndim, loop_size); \ hypre_BoxLoopDataDeclareK(1, ndim, loop_size, dbox1, start1, stride1); \ HYPRE_Real *shared_sum_var = hypre_CTAlloc(HYPRE_Real, 1, HYPRE_MEMORY_DEVICE); \ hypre_TMemcpy(shared_sum_var, &sum_var, HYPRE_Real, 1, HYPRE_MEMORY_DEVICE, HYPRE_MEMORY_HOST); \ ReductionBoxLoopforall( [=,hypre_unused_var=sum_var] (sycl::nd_item<3> item, auto &sum_var) \ { \ HYPRE_Int idx = (HYPRE_Int) item.get_global_linear_id(); \ if (idx < hypre__tot) \ { \ hypre_newBoxLoopDeclare(databox1); \ hypre_BoxLoopIncK(1, databox1, i1); #define hypre_newBoxLoop1ReductionEnd(i1, sum_var) \ } \ }, hypre__tot, shared_sum_var); \ hypre_TMemcpy(&sum_var, shared_sum_var, HYPRE_Real, 1, HYPRE_MEMORY_HOST, HYPRE_MEMORY_DEVICE); \ hypre_TFree(shared_sum_var, HYPRE_MEMORY_DEVICE); \ } /* Reduction BoxLoop2 */ #define hypre_newBoxLoop2ReductionBegin(ndim, loop_size, dbox1, start1, stride1, i1, \ dbox2, start2, stride2, i2, sum_var) \ { \ hypre_newBoxLoopInit(ndim, loop_size); \ hypre_BoxLoopDataDeclareK(1, ndim, loop_size, dbox1, start1, stride1); \ hypre_BoxLoopDataDeclareK(2, ndim, loop_size, dbox2, start2, stride2); \ HYPRE_Real *shared_sum_var = hypre_CTAlloc(HYPRE_Real, 1, HYPRE_MEMORY_DEVICE); \ hypre_TMemcpy(shared_sum_var, &sum_var, HYPRE_Real, 1, HYPRE_MEMORY_DEVICE, HYPRE_MEMORY_HOST); \ ReductionBoxLoopforall( [=,hypre_unused_var=sum_var] (sycl::nd_item<3> item, auto &sum_var) \ { \ HYPRE_Int idx = (HYPRE_Int) item.get_global_linear_id(); \ if (idx < hypre__tot) \ { \ hypre_newBoxLoopDeclare(databox1); \ hypre_BoxLoopIncK(1, databox1, i1); \ hypre_BoxLoopIncK(2, databox2, i2); #define hypre_newBoxLoop2ReductionEnd(i1, i2, sum_var) \ } \ }, hypre__tot, shared_sum_var); \ hypre_TMemcpy(&sum_var, shared_sum_var, HYPRE_Real, 1, HYPRE_MEMORY_HOST, HYPRE_MEMORY_DEVICE); \ hypre_TFree(shared_sum_var, HYPRE_MEMORY_DEVICE); \ } /* Plain parallel_for loop */ #define hypre_LoopBegin(size, idx) \ { \ HYPRE_Int hypre__tot = size; \ BoxLoopforall(hypre__tot, [=] (sycl::nd_item<3> item) \ { \ HYPRE_Int idx = (HYPRE_Int) item.get_global_linear_id(); \ if (idx < hypre__tot) \ { \ #define hypre_LoopEnd() \ } \ }); \ } /********************************************************************* * renamings *********************************************************************/ #define hypre_BoxLoopBlock() 0 #define hypre_BoxLoop0Begin hypre_newBoxLoop0Begin #define hypre_BoxLoop0End hypre_newBoxLoop0End #define hypre_BoxLoop1Begin hypre_newBoxLoop1Begin #define hypre_BoxLoop1End hypre_newBoxLoop1End #define hypre_BoxLoop2Begin hypre_newBoxLoop2Begin #define hypre_BoxLoop2End hypre_newBoxLoop2End #define hypre_BoxLoop3Begin hypre_newBoxLoop3Begin #define hypre_BoxLoop3End hypre_newBoxLoop3End #define hypre_BoxLoop4Begin hypre_newBoxLoop4Begin #define hypre_BoxLoop4End hypre_newBoxLoop4End #define hypre_BasicBoxLoop1Begin hypre_newBasicBoxLoop1Begin #define hypre_BasicBoxLoop2Begin hypre_newBasicBoxLoop2Begin /* Reduction */ #define hypre_BoxLoop1ReductionBegin(ndim, loop_size, dbox1, start1, stride1, i1, reducesum) \ hypre_newBoxLoop1ReductionBegin(ndim, loop_size, dbox1, start1, stride1, i1, reducesum) #define hypre_BoxLoop1ReductionEnd(i1, reducesum) \ hypre_newBoxLoop1ReductionEnd(i1, reducesum) #define hypre_BoxLoop2ReductionBegin(ndim, loop_size, dbox1, start1, stride1, i1, \ dbox2, start2, stride2, i2, reducesum) \ hypre_newBoxLoop2ReductionBegin(ndim, loop_size, dbox1, start1, stride1, i1, \ dbox2, start2, stride2, i2, reducesum) #define hypre_BoxLoop2ReductionEnd(i1, i2, reducesum) \ hypre_newBoxLoop2ReductionEnd(i1, i2, reducesum) #endif #endif /* #ifndef HYPRE_BOXLOOP_SYCL_HEADER */ #ifdef __cplusplus } #endif #endif hypre-2.33.0/src/struct_mv/assumed_part.c000066400000000000000000002024651477326011500204150ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /* This is code for the struct assumed partition - AHB 6/05 */ #include "_hypre_struct_mv.h" /* these are for debugging */ #define REGION_STAT 0 #define NO_REFINE 0 #define REFINE_INFO 0 /* Note: Functions used only in this file (not elsewhere) to determine the * partition have names that start with hypre_AP */ /*-------------------------------------------------------------------------- * Computes the product of the first ndim index values. Returns 1 if ndim = 0. *--------------------------------------------------------------------------*/ HYPRE_Int hypre_IndexProd( hypre_Index index, HYPRE_Int ndim ) { HYPRE_Int d, prod; prod = 1; for (d = 0; d < ndim; d++) { prod *= hypre_IndexD(index, d); } return prod; } /*-------------------------------------------------------------------------- * Computes an index into a multi-D box of size bsize[0] x bsize[1] x ... from a * rank where the assumed ordering is dimension 0 first, then dimension 1, etc. *--------------------------------------------------------------------------*/ HYPRE_Int hypre_IndexFromRank( HYPRE_Int rank, hypre_Index bsize, hypre_Index index, HYPRE_Int ndim ) { HYPRE_Int d, r, s; r = rank; for (d = ndim - 1; d >= 0; d--) { s = hypre_IndexProd(bsize, d); hypre_IndexD(index, d) = r / s; r = r % s; } return hypre_error_flag; } /****************************************************************************** * Given a region, subdivide the region equally a specified number of times. * For dimension d, each "level" is a subdivison of 2^d. The box_array is * adjusted to have space for l(2^d)^level boxes. We are bisecting each * dimension (level) times. * * We may want to add min size parameter for dimension of results regions * (currently 2), i.e., don't bisect a dimension if it will be smaller than 2 * grid points, for example. *****************************************************************************/ HYPRE_Int hypre_APSubdivideRegion( hypre_Box *region, HYPRE_Int ndim, HYPRE_Int level, hypre_BoxArray *box_array, HYPRE_Int *num_new_boxes ) { HYPRE_Int i, j, width, sz, dv, total; HYPRE_Int extra, points, count; HYPRE_Int *partition[HYPRE_MAXDIM]; HYPRE_Int min_gridpts; /* This should probably be an input parameter */ hypre_Index isize, index, div; hypre_Box *box; /* Initialize div */ hypre_SetIndex(div, 0); /* if level = 0 then no dividing */ if (!level) { hypre_BoxArraySetSize(box_array, 1); hypre_CopyBox(region, hypre_BoxArrayBox(box_array, 0)); *num_new_boxes = 1; return hypre_error_flag; } /* Get the size of the box in each dimension */ hypre_BoxGetSize(region, isize); /* div = num of regions in each dimension */ /* Figure out the number of regions. Make sure the sizes will contain the min number of gridpoints, or divide less in that dimension. We require at least min_gridpts in a region dimension. */ min_gridpts = 4; total = 1; for (i = 0; i < ndim; i++) { dv = 1; sz = hypre_IndexD(isize, i); for (j = 0; j < level; j++) { if (sz >= 2 * dv * min_gridpts) /* Cut each dim in half */ { dv *= 2; } } /* Space for each partition */ partition[i] = hypre_TAlloc(HYPRE_Int, dv + 1, HYPRE_MEMORY_HOST); /* Total number of regions to create */ total = total * dv; hypre_IndexD(div, i) = dv; } *num_new_boxes = total; /* Prepare box array */ hypre_BoxArraySetSize(box_array, total); /* Divide each dimension */ for (i = 0; i < ndim; i++) { dv = hypre_IndexD(div, i); partition[i][0] = hypre_BoxIMinD(region, i); /* Count grid points */ points = hypre_IndexD(isize, i); width = points / dv; extra = points % dv; for (j = 1; j < dv; j++) { partition[i][j] = partition[i][j - 1] + width; if (j <= extra) { partition[i][j]++; } } partition[i][dv] = hypre_BoxIMaxD(region, i) + 1; } count = 0; hypre_SerialBoxLoop0Begin(ndim, div); { box = hypre_BoxArrayBox(box_array, count); zypre_BoxLoopGetIndex(index); for (i = 0; i < ndim; i++) { j = hypre_IndexD(index, i); hypre_BoxIMinD(box, i) = partition[i][j]; hypre_BoxIMaxD(box, i) = partition[i][j + 1] - 1; } count++; } hypre_SerialBoxLoop0End(); /* clean up */ for (i = 0; i < ndim; i++) { hypre_TFree(partition[i], HYPRE_MEMORY_HOST); } return hypre_error_flag; } /****************************************************************************** * Given a list of regions, find out how many of *my* boxes are contained in * each region. *****************************************************************************/ HYPRE_Int hypre_APFindMyBoxesInRegions( hypre_BoxArray *region_array, hypre_BoxArray *my_box_array, HYPRE_Int **p_count_array, HYPRE_Real **p_vol_array ) { HYPRE_Int ndim = hypre_BoxArrayNDim(region_array); HYPRE_Int i, j, d; HYPRE_Int num_boxes, num_regions; HYPRE_Int *count_array; HYPRE_Real *vol_array; hypre_Box *my_box, *result_box, *grow_box, *region; hypre_Index grow_index; num_boxes = hypre_BoxArraySize(my_box_array); num_regions = hypre_BoxArraySize(region_array); count_array = *p_count_array; vol_array = *p_vol_array; /* May need to add some sorting to make this more efficient, though we shouldn't have many regions */ /* Note: a box can be in more than one region */ result_box = hypre_BoxCreate(ndim); grow_box = hypre_BoxCreate(ndim); for (i = 0; i < num_regions; i++) { count_array[i] = 0; vol_array[i] = 0.0; region = hypre_BoxArrayBox(region_array, i); for (j = 0; j < num_boxes; j++) { my_box = hypre_BoxArrayBox(my_box_array, j); /* Check if its a zero volume box. If so, it still need to be counted, so expand until volume is non-zero, then intersect. */ if (hypre_BoxVolume(my_box) == 0) { hypre_CopyBox(my_box, grow_box); for (d = 0; d < ndim; d++) { if (!hypre_BoxSizeD(my_box, d)) { hypre_IndexD(grow_index, d) = (hypre_BoxIMinD(my_box, d) - hypre_BoxIMaxD(my_box, d) + 1) / 2; } else { hypre_IndexD(grow_index, d) = 0; } } /* Expand the grow box (leave our box untouched) */ hypre_BoxGrowByIndex(grow_box, grow_index); /* Do they intersect? */ hypre_IntersectBoxes(grow_box, region, result_box); } else { /* Do they intersect? */ hypre_IntersectBoxes(my_box, region, result_box); } if (hypre_BoxVolume(result_box) > 0) { count_array[i]++; vol_array[i] += (HYPRE_Real) hypre_BoxVolume(result_box); } } } /* clean up */ hypre_BoxDestroy(result_box); hypre_BoxDestroy(grow_box); /* output */ *p_count_array = count_array; *p_vol_array = vol_array; return hypre_error_flag; } /****************************************************************************** * Given a list of regions, find out how many global boxes are contained in each * region. Assumes that p_count_array and p_vol_array have been allocated. *****************************************************************************/ HYPRE_Int hypre_APGetAllBoxesInRegions( hypre_BoxArray *region_array, hypre_BoxArray *my_box_array, HYPRE_Int **p_count_array, HYPRE_Real **p_vol_array, MPI_Comm comm ) { HYPRE_Int i; HYPRE_Int *count_array; HYPRE_Int num_regions; HYPRE_Int *send_buf_count; HYPRE_Real *send_buf_vol; HYPRE_Real *vol_array; HYPRE_Real *dbl_vol_and_count; count_array = *p_count_array; vol_array = *p_vol_array; /* First get a count and volume of my boxes in each region */ num_regions = hypre_BoxArraySize(region_array); send_buf_count = hypre_CTAlloc(HYPRE_Int, num_regions, HYPRE_MEMORY_HOST); send_buf_vol = hypre_CTAlloc(HYPRE_Real, num_regions * 2, HYPRE_MEMORY_HOST); /* allocate HYPRE_Real */ dbl_vol_and_count = hypre_CTAlloc(HYPRE_Real, num_regions * 2, HYPRE_MEMORY_HOST); /* allocate HYPRE_Real */ hypre_APFindMyBoxesInRegions( region_array, my_box_array, &send_buf_count, &send_buf_vol); /* Copy ints to doubles so we can do one Allreduce */ for (i = 0; i < num_regions; i++) { send_buf_vol[num_regions + i] = (HYPRE_Real) send_buf_count[i]; } hypre_MPI_Allreduce(send_buf_vol, dbl_vol_and_count, num_regions * 2, HYPRE_MPI_REAL, hypre_MPI_SUM, comm); /* Unpack */ for (i = 0; i < num_regions; i++) { vol_array[i] = dbl_vol_and_count[i]; count_array[i] = (HYPRE_Int) dbl_vol_and_count[num_regions + i]; } /* Clean up */ hypre_TFree(send_buf_count, HYPRE_MEMORY_HOST); hypre_TFree(send_buf_vol, HYPRE_MEMORY_HOST); hypre_TFree(dbl_vol_and_count, HYPRE_MEMORY_HOST); /* Output */ *p_count_array = count_array; *p_vol_array = vol_array; return hypre_error_flag; } /****************************************************************************** * Given a list of regions, shrink regions according to min and max extents. * These regions should all be non-empty at the global level. *****************************************************************************/ HYPRE_Int hypre_APShrinkRegions( hypre_BoxArray *region_array, hypre_BoxArray *my_box_array, MPI_Comm comm ) { HYPRE_Int ndim, ndim2; HYPRE_Int i, j, d, ii; HYPRE_Int num_boxes, num_regions; HYPRE_Int *indices, *recvbuf; HYPRE_Int count = 0; hypre_Box *my_box, *result_box, *grow_box, *region; hypre_Index grow_index, imin, imax; ndim = hypre_BoxArrayNDim(my_box_array); ndim2 = 2 * ndim; num_boxes = hypre_BoxArraySize(my_box_array); num_regions = hypre_BoxArraySize(region_array); indices = hypre_CTAlloc(HYPRE_Int, num_regions * ndim2, HYPRE_MEMORY_HOST); recvbuf = hypre_CTAlloc(HYPRE_Int, num_regions * ndim2, HYPRE_MEMORY_HOST); result_box = hypre_BoxCreate(ndim); /* Allocate a grow box */ grow_box = hypre_BoxCreate(ndim); /* Look locally at my boxes */ /* For each region */ for (i = 0; i < num_regions; i++) { count = 0; /* Number of my boxes in this region */ /* Get the region box */ region = hypre_BoxArrayBox(region_array, i); /* Go through each of my local boxes */ for (j = 0; j < num_boxes; j++) { my_box = hypre_BoxArrayBox(my_box_array, j); /* Check if its a zero volume box. If so, it still needs to be checked, so expand until volume is nonzero, then intersect. */ if (hypre_BoxVolume(my_box) == 0) { hypre_CopyBox(my_box, grow_box); for (d = 0; d < ndim; d++) { if (!hypre_BoxSizeD(my_box, d)) { hypre_IndexD(grow_index, d) = (hypre_BoxIMinD(my_box, d) - hypre_BoxIMaxD(my_box, d) + 1) / 2; } else { hypre_IndexD(grow_index, d) = 0; } } /* Grow the grow box (leave our box untouched) */ hypre_BoxGrowByIndex(grow_box, grow_index); /* Do they intersect? */ hypre_IntersectBoxes(grow_box, region, result_box); } else { /* Do they intersect? */ hypre_IntersectBoxes( my_box, region, result_box); } if (hypre_BoxVolume(result_box) > 0) /* They intersect */ { if (!count) /* Set min and max for first box */ { ii = i * ndim2; for (d = 0; d < ndim; d++) { indices[ii + d] = hypre_BoxIMinD(result_box, d); indices[ii + ndim + d] = hypre_BoxIMaxD(result_box, d); } } count++; /* Boxes intersect, so get max and min extents of the result box (this keeps the bounds inside the region) */ ii = i * ndim2; for (d = 0; d < ndim; d++) { indices[ii + d] = hypre_min(indices[ii + d], hypre_BoxIMinD(result_box, d)); indices[ii + ndim + d] = hypre_max(indices[ii + ndim + d], hypre_BoxIMaxD(result_box, d)); } } } /* If we had no boxes in that region, set the min to the max extents of the region and the max to the min! */ if (!count) { ii = i * ndim2; for (d = 0; d < ndim; d++) { indices[ii + d] = hypre_BoxIMaxD(region, d); indices[ii + ndim + d] = hypre_BoxIMinD(region, d); } } /* Negate max indices for the Allreduce */ /* Note: min(x)= -max(-x) */ ii = i * ndim2; for (d = 0; d < ndim; d++) { indices[ii + ndim + d] = -indices[ii + ndim + d]; } } /* Do an Allreduce on size and volume to get the global information */ hypre_MPI_Allreduce(indices, recvbuf, num_regions * ndim2, HYPRE_MPI_INT, hypre_MPI_MIN, comm); /* Unpack the "shrunk" regions */ /* For each region */ for (i = 0; i < num_regions; i++) { /* Get the region box */ region = hypre_BoxArrayBox(region_array, i); /* Resize the box */ ii = i * ndim2; for (d = 0; d < ndim; d++) { hypre_IndexD(imin, d) = recvbuf[ii + d]; hypre_IndexD(imax, d) = -recvbuf[ii + ndim + d]; } hypre_BoxSetExtents(region, imin, imax ); /* Add: check to see whether any shrinking is actually occuring */ } /* Clean up */ hypre_TFree(recvbuf, HYPRE_MEMORY_HOST); hypre_TFree(indices, HYPRE_MEMORY_HOST); hypre_BoxDestroy(result_box); hypre_BoxDestroy(grow_box); return hypre_error_flag; } /****************************************************************************** * Given a list of regions, eliminate empty regions. * * region_array = assumed partition regions * count_array = number of global boxes in each region *****************************************************************************/ HYPRE_Int hypre_APPruneRegions( hypre_BoxArray *region_array, HYPRE_Int **p_count_array, HYPRE_Real **p_vol_array ) { HYPRE_Int i, j; HYPRE_Int num_regions; HYPRE_Int count; HYPRE_Int *delete_indices; HYPRE_Int *count_array; HYPRE_Real *vol_array; count_array = *p_count_array; vol_array = *p_vol_array; num_regions = hypre_BoxArraySize(region_array); delete_indices = hypre_CTAlloc(HYPRE_Int, num_regions, HYPRE_MEMORY_HOST); count = 0; /* Delete regions with zero elements */ for (i = 0; i < num_regions; i++) { if (count_array[i] == 0) { delete_indices[count++] = i; } } hypre_DeleteMultipleBoxes(region_array, delete_indices, count); /* Adjust count and volume arrays */ if (count > 0) { j = 0; for (i = delete_indices[0]; (i + j) < num_regions; i++) { if (j < count) { while ((i + j) == delete_indices[j]) { j++; /* Increase the shift */ if (j == count) { break; } } } vol_array[i] = vol_array[i + j]; count_array[i] = count_array[i + j]; } } /* Clean up */ hypre_TFree(delete_indices, HYPRE_MEMORY_HOST); /* Return variables */ *p_count_array = count_array; *p_vol_array = vol_array; return hypre_error_flag; } /****************************************************************************** * Given a list of regions, and corresponding volumes contained in regions * subdivide some of the regions that are not full enough. *****************************************************************************/ HYPRE_Int hypre_APRefineRegionsByVol( hypre_BoxArray *region_array, HYPRE_Real *vol_array, HYPRE_Int max_regions, HYPRE_Real gamma, HYPRE_Int ndim, HYPRE_Int *return_code, MPI_Comm comm ) { HYPRE_Int i, count, loop; HYPRE_Int num_regions, init_num_regions; HYPRE_Int *delete_indices; HYPRE_Real *fraction_full; HYPRE_Int *order; HYPRE_Int myid, num_procs, est_size; HYPRE_Int new1; hypre_BoxArray *tmp_array; hypre_Box *box; hypre_MPI_Comm_rank(comm, &myid); hypre_MPI_Comm_size(comm, &num_procs); num_regions = hypre_BoxArraySize(region_array); if (!num_regions) { /* No regions, so no subdividing */ *return_code = 1; return hypre_error_flag; } fraction_full = hypre_CTAlloc(HYPRE_Real, num_regions, HYPRE_MEMORY_HOST); order = hypre_CTAlloc(HYPRE_Int, num_regions, HYPRE_MEMORY_HOST); delete_indices = hypre_CTAlloc(HYPRE_Int, num_regions, HYPRE_MEMORY_HOST); for (i = 0; i < num_regions; i++) { box = hypre_BoxArrayBox(region_array, i); fraction_full[i] = vol_array[i] / hypre_doubleBoxVolume(box); order[i] = i; /* This is what order to access the boxes */ } /* Want to refine the regions starting with those that are the least full */ /* Sort the fraction AND the index */ hypre_qsort2(order, fraction_full, 0, num_regions - 1); /* Now we can subdivide any that are not full enough */ /* When this is called, we know that size < max_regions */ /* It is ok to subdivde such that we have slightly more regions than max_region, but we do not want more regions than processors */ tmp_array = hypre_BoxArrayCreate(0, ndim); count = 0; /* How many regions subdivided */ loop = 0; /* Counts the loop number */ init_num_regions = num_regions; /* All regions are at least gamma full and no subdividing occured */ *return_code = 1; while (fraction_full[loop] < gamma) { /* Some subdividing occurred */ *return_code = 2; /* We can't let the number of regions exceed the number of processors. Only an issue for small proc numbers. */ est_size = num_regions + hypre_pow2(ndim) - 1; if (est_size > num_procs) { if (loop == 0) { /* Some are less than gamma full, but we cannot further subdivide due to max processors limit (no subdividing occured) */ *return_code = 4; } else { /* Some subdividing occured, but there are some regions less than gamma full (max reached) that were not subdivided */ *return_code = 3; } break; } box = hypre_BoxArrayBox(region_array, order[loop]); hypre_APSubdivideRegion(box, ndim, 1, tmp_array, &new1); if (new1 > 1) /* If new = 1, then no subdividing occured */ { num_regions = num_regions + new1 - 1; /* The orginal will be deleted */ delete_indices[count] = order[loop]; count++; /* Number of regions subdivided */ /* Append tmp_array to region_array */ hypre_AppendBoxArray(tmp_array, region_array); } /* If we are on the last region */ if ((loop + 1) == init_num_regions) { break; } /* Clear tmp_array for next loop */ hypre_BoxArraySetSize(tmp_array, 0); /* If we now have too many regions, don't want to subdivide anymore */ if (num_regions >= max_regions) { /* See if next regions satifies gamma */ if (fraction_full[order[loop + 1]] > gamma) { /* All regions less than gamma full have been subdivided (and we have reached max) */ *return_code = 5; } else { /* Some regions less than gamma full (but max is reached) */ *return_code = 3; } break; } loop++; /* Increment to repeat loop */ } if (count == 0 ) { /* No refining occured so don't do any more */ *return_code = 1; } else { /* We subdivided count regions */ /* Delete the old regions */ hypre_qsort0(delete_indices, 0, count - 1); /* Put deleted indices in asc order */ hypre_DeleteMultipleBoxes( region_array, delete_indices, count ); } /* TO DO: number of regions intact (beginning of region array is intact) - may return this eventually */ /* regions_intact = init_num_regions - count; */ /* Clean up */ hypre_TFree(fraction_full, HYPRE_MEMORY_HOST); hypre_TFree(order, HYPRE_MEMORY_HOST); hypre_TFree(delete_indices, HYPRE_MEMORY_HOST); hypre_BoxArrayDestroy(tmp_array); return hypre_error_flag; } /****************************************************************************** * Construct an assumed partition * * 8/06 - Changed the assumption that the local boxes have boxnums 0 to * num(local_boxes)-1 (now need to pass in ids). * * 10/06 - Changed. No longer need to deal with negative boxes as this is used * through the box manager. * * 3/6 - Don't allow more regions than boxes (unless global boxes = 0) and don't * partition into more procs than global number of boxes. *****************************************************************************/ HYPRE_Int hypre_StructAssumedPartitionCreate( HYPRE_Int ndim, hypre_Box *bounding_box, HYPRE_Real global_boxes_size, HYPRE_Int global_num_boxes, hypre_BoxArray *local_boxes, HYPRE_Int *local_boxnums, HYPRE_Int max_regions, HYPRE_Int max_refinements, HYPRE_Real gamma, MPI_Comm comm, hypre_StructAssumedPart **p_assumed_partition ) { HYPRE_Int i, j, d; HYPRE_Int size; HYPRE_Int myid, num_procs; HYPRE_Int num_proc_partitions; HYPRE_Int count_array_size; HYPRE_Int *count_array = NULL; HYPRE_Real *vol_array = NULL, one_volume, dbl_vol; HYPRE_Int return_code; HYPRE_Int num_refine; HYPRE_Int total_boxes, proc_count, max_position; HYPRE_Int *proc_array = NULL; HYPRE_Int initial_level; HYPRE_Int dmax; HYPRE_Real width, wmin, wmax; HYPRE_Real rn_cubes, rn_cube_procs, rn_cube_divs, rdiv; hypre_Index div_index; hypre_BoxArray *region_array; hypre_Box *box, *grow_box; hypre_StructAssumedPart *assumed_part; HYPRE_Int proc_alloc, count, box_count; HYPRE_Int max_response_size; HYPRE_Int *response_buf = NULL, *response_buf_starts = NULL; HYPRE_Int *tmp_proc_ids = NULL, *tmp_box_nums = NULL, *tmp_box_inds = NULL; HYPRE_Int *proc_array_starts = NULL; hypre_BoxArray *my_partition; hypre_DataExchangeResponse response_obj; HYPRE_Int *contact_boxinfo; HYPRE_Int index; hypre_MPI_Comm_size(comm, &num_procs); hypre_MPI_Comm_rank(comm, &myid); /* Special case where there are no boxes in the grid */ if (global_num_boxes == 0) { region_array = hypre_BoxArrayCreate(0, ndim); assumed_part = hypre_TAlloc(hypre_StructAssumedPart, 1, HYPRE_MEMORY_HOST); hypre_StructAssumedPartNDim(assumed_part) = ndim; hypre_StructAssumedPartRegions(assumed_part) = region_array; hypre_StructAssumedPartNumRegions(assumed_part) = 0; hypre_StructAssumedPartDivisions(assumed_part) = NULL; hypre_StructAssumedPartProcPartitions(assumed_part) = hypre_CTAlloc(HYPRE_Int, 1, HYPRE_MEMORY_HOST); hypre_StructAssumedPartProcPartition(assumed_part, 0) = 0; hypre_StructAssumedPartMyPartition(assumed_part) = NULL; hypre_StructAssumedPartMyPartitionBoxes(assumed_part) = hypre_BoxArrayCreate(0, ndim); hypre_StructAssumedPartMyPartitionIdsAlloc(assumed_part) = 0; hypre_StructAssumedPartMyPartitionIdsSize(assumed_part) = 0; hypre_StructAssumedPartMyPartitionNumDistinctProcs(assumed_part) = 0; hypre_StructAssumedPartMyPartitionBoxnums(assumed_part) = NULL; hypre_StructAssumedPartMyPartitionProcIds(assumed_part) = NULL; *p_assumed_partition = assumed_part; return hypre_error_flag; } /* End special case of zero boxes */ /* FIRST DO ALL THE GLOBAL PARTITION INFO */ /* Initially divide the bounding box */ if (!hypre_BoxVolume(bounding_box) && global_num_boxes) { hypre_error_w_msg(HYPRE_ERROR_GENERIC, "Bounding box has zero volume AND there are grid boxes"); } /* First modify any input parameters if necessary */ /* Don't want the number of regions exceeding the number of processors */ /* Note: This doesn't change the value in the caller's code */ max_regions = hypre_min(num_procs, max_regions); /* Don't want more regions than boxes either */ if (global_num_boxes) { max_regions = hypre_min(global_num_boxes, max_regions); } /* Start with a region array of size 0 */ region_array = hypre_BoxArrayCreate(0, ndim); /* If the bounding box is sufficiently covered by boxes, then we will just have one region (the bounding box), otherwise we will subdivide */ one_volume = hypre_doubleBoxVolume(bounding_box); if ( ((global_boxes_size / one_volume) > gamma) || (global_num_boxes > one_volume) || (global_num_boxes == 0) ) { /* Don't bother with any refinements. We are full enough, or we have a small bounding box and we are not full because of empty boxes */ initial_level = 0; max_refinements = 0; } else { /* Could be an input parameter, but 1 division is probably sufficient */ initial_level = 1; /* Start with the specified intial_levels for the original domain, unless we have a smaller number of procs */ for (i = 0; i < initial_level; i++) { if ( hypre_pow2(initial_level * ndim) > num_procs) { initial_level --; } /* Not be able to do any refinements due to the number of processors */ if (!initial_level) { max_refinements = 0; } } } #if NO_REFINE max_refinements = 0; initial_level = 0; #endif #if REFINE_INFO if (myid == 0) { hypre_printf("gamma = %g\n", gamma); hypre_printf("max_regions = %d\n", max_regions); hypre_printf("max_refinements = %d\n", max_refinements); hypre_printf("initial level = %d\n", initial_level); } #endif /* Divide the bounding box */ hypre_APSubdivideRegion(bounding_box, ndim, initial_level, region_array, &size); /* If no subdividing occured (because too small) then don't try to refine */ if (initial_level > 0 && size == 1) { max_refinements = 0; } /* Need space for count and volume */ size = hypre_BoxArraySize(region_array); count_array_size = size; /* Memory allocation size */ count_array = hypre_CTAlloc(HYPRE_Int, size, HYPRE_MEMORY_HOST); vol_array = hypre_CTAlloc(HYPRE_Real, size, HYPRE_MEMORY_HOST); /* How many boxes are in each region (global count) and what is the volume */ hypre_APGetAllBoxesInRegions(region_array, local_boxes, &count_array, &vol_array, comm); /* Don't do any initial prune and shrink if we have only one region and we can't do any refinements */ if ( !(size == 1 && max_refinements == 0)) { /* Get rid of regions with no boxes (and adjust count and vol arrays) */ hypre_APPruneRegions( region_array, &count_array, &vol_array); /* Shrink the extents */ hypre_APShrinkRegions( region_array, local_boxes, comm); } /* Keep track of refinements */ num_refine = 0; /* Now we can keep refining by dividing the regions that are not full enough and eliminating empty regions */ while ( (hypre_BoxArraySize(region_array) < max_regions) && (num_refine < max_refinements) ) { num_refine++; /* Calculate how full the regions are and subdivide the least full */ size = hypre_BoxArraySize(region_array); /* Divide regions that are not full enough */ hypre_APRefineRegionsByVol(region_array, vol_array, max_regions, gamma, ndim, &return_code, comm); /* 1 = all regions are at least gamma full - no subdividing occured */ /* 4 = no subdividing occured due to num_procs limit on regions */ if (return_code == 1 || return_code == 4) { break; } /* This is extraneous I think */ if (size == hypre_BoxArraySize(region_array)) { /* No dividing occured - exit the loop */ break; } size = hypre_BoxArraySize(region_array); if (size > count_array_size) { count_array = hypre_TReAlloc(count_array, HYPRE_Int, size, HYPRE_MEMORY_HOST); vol_array = hypre_TReAlloc(vol_array, HYPRE_Real, size, HYPRE_MEMORY_HOST); count_array_size = size; } /* FUTURE MOD: Just count and prune and shrink in the modified regions from refineRegionsByVol. These are the last regions in the array. */ /* Num boxes are in each region (global count) and what the volume is */ hypre_APGetAllBoxesInRegions(region_array, local_boxes, &count_array, &vol_array, comm); /* Get rid of regions with no boxes (and adjust count and vol arrays) */ hypre_APPruneRegions(region_array, &count_array, &vol_array); /* Shrink the extents */ hypre_APShrinkRegions(region_array, local_boxes, comm); /* These may be ok after pruning, but if no pruning then exit the loop */ /* 5 = all regions < gamma full were subdivided and max reached */ /* 3 = some regions were divided (not all that needed) and max reached */ if ( (return_code == 3 || return_code == 5) && size == hypre_BoxArraySize(region_array) ) { break; } } /* End of refinements */ /* Error checking */ if (global_num_boxes) { hypre_ForBoxI(i, region_array) { if (hypre_BoxVolume(hypre_BoxArrayBox(region_array, i)) == 0) { hypre_error(HYPRE_ERROR_GENERIC); hypre_error_w_msg( HYPRE_ERROR_GENERIC, "A region has zero volume (this should never happen)!"); } } } #if REGION_STAT if (myid == 0) { hypre_printf("myid = %d, %d REGIONS (after refining %d times\n", myid, hypre_BoxArraySize(region_array), num_refine); hypre_ForBoxI(i, region_array) { box = hypre_BoxArrayBox(region_array, i); hypre_printf("myid = %d, %d: (%d, %d, %d) x (%d, %d, %d)\n", myid, i, hypre_BoxIMinX(box), hypre_BoxIMinY(box), hypre_BoxIMinZ(box), hypre_BoxIMaxX(box), hypre_BoxIMaxY(box), hypre_BoxIMaxZ(box)); } } #endif hypre_TFree(vol_array, HYPRE_MEMORY_HOST); /* ------------------------------------------------------------------------*/ /* Now we have the regions - construct the assumed partition */ size = hypre_BoxArraySize(region_array); assumed_part = hypre_TAlloc(hypre_StructAssumedPart, 1, HYPRE_MEMORY_HOST); hypre_StructAssumedPartNDim(assumed_part) = ndim; hypre_StructAssumedPartRegions(assumed_part) = region_array; /* The above is aliased, so don't destroy region_array in this function */ hypre_StructAssumedPartNumRegions(assumed_part) = size; hypre_StructAssumedPartDivisions(assumed_part) = hypre_CTAlloc(hypre_Index, size, HYPRE_MEMORY_HOST); /* First determine which processors (how many) to assign to each region */ proc_array = hypre_CTAlloc(HYPRE_Int, size, HYPRE_MEMORY_HOST); /* This is different than the total number of boxes as some boxes can be in more than one region */ total_boxes = 0; proc_count = 0; d = -1; max_position = -1; /* Calculate total number of boxes in the regions */ for (i = 0; i < size; i++) { total_boxes += count_array[i]; } /* Calculate the fraction of actual boxes in each region, multiplied by total number of proc partitons desired, put result in proc_array to assign each region a number of processors proportional to the fraction of boxes */ /* 3/6 - Limit the number of proc partitions to no larger than the total boxes in the regions (at coarse levels, may be many more procs than boxes, so this should minimize some communication). */ num_proc_partitions = hypre_min(num_procs, total_boxes); for (i = 0; i < size; i++) { if (!total_boxes) /* In case there are no boxes in a grid */ { proc_array[i] = 0; } else { proc_array[i] = (HYPRE_Int) hypre_round( ((HYPRE_Real)count_array[i] / (HYPRE_Real)total_boxes) * (HYPRE_Real) num_proc_partitions ); } box = hypre_BoxArrayBox(region_array, i); dbl_vol = hypre_doubleBoxVolume(box); /* Can't have any zeros! */ if (!proc_array[i]) { proc_array[i] = 1; } if (dbl_vol < (HYPRE_Real) proc_array[i]) { /* Don't let the number of procs be greater than the volume. If true, then safe to cast back to HYPRE_Int and vol doesn't overflow. */ proc_array[i] = (HYPRE_Int) dbl_vol; } proc_count += proc_array[i]; if (d < proc_array[i]) { d = proc_array[i]; max_position = i; } /*If (myid == 0) hypre_printf("proc array[%d] = %d\n", i, proc_array[i]);*/ } hypre_TFree(count_array, HYPRE_MEMORY_HOST); /* Adjust such that num_proc_partitions = proc_count (they should be close) */ /* A processor is only assigned to ONE region */ /* If we need a few more processors assigned in proc_array for proc_count to equal num_proc_partitions (it is ok if we have fewer procs in proc_array due to volume constraints) */ while (num_proc_partitions > proc_count) { proc_array[max_position]++; if ( (HYPRE_Real) proc_array[max_position] > hypre_doubleBoxVolume(hypre_BoxArrayBox(region_array, max_position)) ) { proc_array[max_position]--; break; /* Some processors won't get assigned partitions */ } proc_count++; } /* If we we need fewer processors in proc_array */ i = 0; while (num_proc_partitions < proc_count) { if (proc_array[max_position] != 1) { proc_array[max_position]--; } else { while (i < size && proc_array[i] <= 1) /* size is the number of regions */ { i++; } proc_array[i]--; } proc_count--; } /* The above logic would be flawed IF we allowed more regions than processors, but this is not allowed! */ /* Now we have the number of processors in each region so create the processor partition */ /* size = # of regions */ hypre_StructAssumedPartProcPartitions(assumed_part) = hypre_CTAlloc(HYPRE_Int, size + 1, HYPRE_MEMORY_HOST); hypre_StructAssumedPartProcPartition(assumed_part, 0) = 0; for (i = 0; i < size; i++) { hypre_StructAssumedPartProcPartition(assumed_part, i + 1) = hypre_StructAssumedPartProcPartition(assumed_part, i) + proc_array[i]; } /* Now determine the NUMBER of divisions in the x, y amd z dir according to the number or processors assigned to the region */ /* FOR EACH REGION */ for (i = 0; i < size; i++) { proc_count = proc_array[i]; box = hypre_BoxArrayBox(region_array, i); /* Find min width and max width dimensions */ dmax = 0; wmin = wmax = hypre_BoxSizeD(box, 0); for (d = 1; d < ndim; d++) { width = hypre_BoxSizeD(box, d); if (width < wmin) { wmin = width; } else if (width > wmax) { dmax = d; wmax = width; } } /* Notation (all real numbers): rn_cubes - number of wmin-width cubes in the region rn_cube_procs - number of procs per wmin-width cube rn_cube_divs - number of divs per wmin-width cube */ /* After computing the above, each div_index[d] is set by first flooring rn_cube_divs, then div_index[dmax] is incremented until we have more partitions than processors. */ rn_cubes = hypre_doubleBoxVolume(box) / hypre_pow(wmin, ndim); rn_cube_procs = proc_count / rn_cubes; rn_cube_divs = hypre_pow(rn_cube_procs, (1.0 / (HYPRE_Real)ndim)); for (d = 0; d < ndim; d++) { width = hypre_BoxSizeD(box, d); rdiv = rn_cube_divs * (width / wmin); /* Add a small number to compensate for roundoff issues */ hypre_IndexD(div_index, d) = (HYPRE_Int) hypre_floor(rdiv + 1.0e-6); /* Make sure div_index[d] is at least 1 */ hypre_IndexD(div_index, d) = hypre_max(hypre_IndexD(div_index, d), 1); } /* Decrease div_index to ensure no more than 2 partitions per processor. * This is only needed when div_index[d] is adjusted to 1 above. */ while (hypre_IndexProd(div_index, ndim) >= 2 * proc_count) { /* Decrease the max dimension by a factor of 2 without going below 1 */ hypre_IndexD(div_index, dmax) = (hypre_IndexD(div_index, dmax) + 1) / 2; for (d = 0; d < ndim; d++) { if (hypre_IndexD(div_index, d) > hypre_IndexD(div_index, dmax)) { dmax = d; } } } /* Increment div_index[dmax] to ensure more partitions than processors. This can never result in more than 2 partitions per processor. */ while (hypre_IndexProd(div_index, ndim) < proc_count) { hypre_IndexD(div_index, dmax) ++; } hypre_CopyIndex(div_index, hypre_StructAssumedPartDivision(assumed_part, i)); #if REGION_STAT if ( myid == 0 ) { hypre_printf("region = %d, proc_count = %d, divisions = [", i, proc_count); for (d = 0; d < ndim; d++) { hypre_printf(" %d", hypre_IndexD(div_index, d)); } hypre_printf("]\n"); } #endif } /* End of FOR EACH REGION loop */ /* NOW WE HAVE COMPLETED GLOBAL INFO - START FILLING IN LOCAL INFO */ /* We need to populate the assumed partition object with info specific to each processor, like which assumed partition we own, which boxes are in that region, etc. */ /* Figure out my partition region and put it in the assumed_part structure */ hypre_StructAssumedPartMyPartition(assumed_part) = hypre_BoxArrayCreate(2, ndim); my_partition = hypre_StructAssumedPartMyPartition(assumed_part); hypre_StructAssumedPartitionGetRegionsFromProc(assumed_part, myid, my_partition); #if 0 hypre_ForBoxI(i, my_partition) { box = hypre_BoxArrayBox(my_partition, i); hypre_printf("myid = %d: MY ASSUMED Partitions (%d): (%d, %d, %d) x " "(%d, %d, %d)\n", myid, i, hypre_BoxIMinX(box), hypre_BoxIMinY(box), hypre_BoxIMinZ(box), hypre_BoxIMaxX(box), hypre_BoxIMaxY(box), hypre_BoxIMaxZ(box)); } #endif /* Find out which boxes are in my partition: Look through my boxes, figure out which assumed parition (AP) they fall in and contact that processor. Use the exchange data functionality for this. */ proc_alloc = hypre_pow2(ndim); proc_array = hypre_TReAlloc(proc_array, HYPRE_Int, proc_alloc, HYPRE_MEMORY_HOST); /* Probably there will mostly be one proc per box */ /* Don't want to allocate too much memory here */ size = (HYPRE_Int)(1.2 * hypre_BoxArraySize(local_boxes)); /* Each local box may live on multiple procs in the assumed partition */ tmp_proc_ids = hypre_CTAlloc(HYPRE_Int, size, HYPRE_MEMORY_HOST); /* local box proc ids */ tmp_box_nums = hypre_CTAlloc(HYPRE_Int, size, HYPRE_MEMORY_HOST); /* local box boxnum */ tmp_box_inds = hypre_CTAlloc(HYPRE_Int, size, HYPRE_MEMORY_HOST); /* local box array index */ proc_count = 0; count = 0; /* Current number of procs */ grow_box = hypre_BoxCreate(ndim); hypre_ForBoxI(i, local_boxes) { box = hypre_BoxArrayBox(local_boxes, i); hypre_StructAssumedPartitionGetProcsFromBox( assumed_part, box, &proc_count, &proc_alloc, &proc_array); /* Do we need more storage? */ if ((count + proc_count) > size) { size = (HYPRE_Int)(size + proc_count + 1.2 * (hypre_BoxArraySize(local_boxes) - i)); /* hypre_printf("myid = %d, *adjust* alloc size = %d\n", myid, size);*/ tmp_proc_ids = hypre_TReAlloc(tmp_proc_ids, HYPRE_Int, size, HYPRE_MEMORY_HOST); tmp_box_nums = hypre_TReAlloc(tmp_box_nums, HYPRE_Int, size, HYPRE_MEMORY_HOST); tmp_box_inds = hypre_TReAlloc(tmp_box_inds, HYPRE_Int, size, HYPRE_MEMORY_HOST); } for (j = 0; j < proc_count; j++) { tmp_proc_ids[count] = proc_array[j]; tmp_box_nums[count] = local_boxnums[i]; tmp_box_inds[count] = i; count++; } } hypre_BoxDestroy(grow_box); /* Now we have two arrays: tmp_proc_ids and tmp_box_nums. These are corresponding box numbers and proc ids. We need to sort the processor ids and then create a new buffer to send to the exchange data function. */ /* Sort the proc_ids */ hypre_qsort3i(tmp_proc_ids, tmp_box_nums, tmp_box_inds, 0, count - 1); /* Use proc_array for the processor ids to contact. Use box array to get our boxes and then pass the array only (not the structure) to exchange data. */ box_count = count; contact_boxinfo = hypre_CTAlloc(HYPRE_Int, box_count * (1 + 2 * ndim), HYPRE_MEMORY_HOST); proc_array = hypre_TReAlloc(proc_array, HYPRE_Int, box_count, HYPRE_MEMORY_HOST); proc_array_starts = hypre_CTAlloc(HYPRE_Int, box_count + 1, HYPRE_MEMORY_HOST); proc_array_starts[0] = 0; proc_count = 0; index = 0; if (box_count) { proc_array[0] = tmp_proc_ids[0]; contact_boxinfo[index++] = tmp_box_nums[0]; box = hypre_BoxArrayBox(local_boxes, tmp_box_inds[0]); for (d = 0; d < ndim; d++) { contact_boxinfo[index++] = hypre_BoxIMinD(box, d); contact_boxinfo[index++] = hypre_BoxIMaxD(box, d); } proc_count++; } for (i = 1; i < box_count; i++) { if (tmp_proc_ids[i] != proc_array[proc_count - 1]) { proc_array[proc_count] = tmp_proc_ids[i]; proc_array_starts[proc_count] = i; proc_count++; } /* These boxes are not copied in a particular order */ contact_boxinfo[index++] = tmp_box_nums[i]; box = hypre_BoxArrayBox(local_boxes, tmp_box_inds[i]); for (d = 0; d < ndim; d++) { contact_boxinfo[index++] = hypre_BoxIMinD(box, d); contact_boxinfo[index++] = hypre_BoxIMaxD(box, d); } } proc_array_starts[proc_count] = box_count; /* Clean up */ hypre_TFree(tmp_proc_ids, HYPRE_MEMORY_HOST); hypre_TFree(tmp_box_nums, HYPRE_MEMORY_HOST); hypre_TFree(tmp_box_inds, HYPRE_MEMORY_HOST); /* EXCHANGE DATA */ /* Prepare to populate the local info in the assumed partition */ hypre_StructAssumedPartMyPartitionBoxes(assumed_part) = hypre_BoxArrayCreate(box_count, ndim); hypre_BoxArraySetSize(hypre_StructAssumedPartMyPartitionBoxes(assumed_part), 0); hypre_StructAssumedPartMyPartitionIdsSize(assumed_part) = 0; hypre_StructAssumedPartMyPartitionIdsAlloc(assumed_part) = box_count; hypre_StructAssumedPartMyPartitionProcIds(assumed_part) = hypre_CTAlloc(HYPRE_Int, box_count, HYPRE_MEMORY_HOST); hypre_StructAssumedPartMyPartitionBoxnums(assumed_part) = hypre_CTAlloc(HYPRE_Int, box_count, HYPRE_MEMORY_HOST); hypre_StructAssumedPartMyPartitionNumDistinctProcs(assumed_part) = 0; /* Set up for exchanging data */ /* The response we expect is just a confirmation */ response_buf = NULL; response_buf_starts = NULL; /* Response object */ response_obj.fill_response = hypre_APFillResponseStructAssumedPart; response_obj.data1 = assumed_part; /* Where we keep info from contacts */ response_obj.data2 = NULL; max_response_size = 0; /* No response data - just confirmation */ hypre_DataExchangeList(proc_count, proc_array, contact_boxinfo, proc_array_starts, (1 + 2 * ndim)*sizeof(HYPRE_Int), sizeof(HYPRE_Int), &response_obj, max_response_size, 1, comm, (void**) &response_buf, &response_buf_starts); hypre_TFree(proc_array, HYPRE_MEMORY_HOST); hypre_TFree(proc_array_starts, HYPRE_MEMORY_HOST); hypre_TFree(response_buf, HYPRE_MEMORY_HOST); hypre_TFree(response_buf_starts, HYPRE_MEMORY_HOST); hypre_TFree(contact_boxinfo, HYPRE_MEMORY_HOST); /* Return vars */ *p_assumed_partition = assumed_part; return hypre_error_flag; } /****************************************************************************** * Destroy the assumed partition. *****************************************************************************/ HYPRE_Int hypre_StructAssumedPartitionDestroy( hypre_StructAssumedPart *assumed_part ) { if (assumed_part) { hypre_BoxArrayDestroy( hypre_StructAssumedPartRegions(assumed_part)); hypre_TFree(hypre_StructAssumedPartProcPartitions(assumed_part), HYPRE_MEMORY_HOST); hypre_TFree(hypre_StructAssumedPartDivisions(assumed_part), HYPRE_MEMORY_HOST); hypre_BoxArrayDestroy( hypre_StructAssumedPartMyPartition(assumed_part)); hypre_BoxArrayDestroy( hypre_StructAssumedPartMyPartitionBoxes(assumed_part)); hypre_TFree(hypre_StructAssumedPartMyPartitionProcIds(assumed_part), HYPRE_MEMORY_HOST); hypre_TFree( hypre_StructAssumedPartMyPartitionBoxnums(assumed_part), HYPRE_MEMORY_HOST); /* This goes last! */ hypre_TFree(assumed_part, HYPRE_MEMORY_HOST); } return hypre_error_flag; } /****************************************************************************** * fillResponseStructAssumedPart *****************************************************************************/ HYPRE_Int hypre_APFillResponseStructAssumedPart(void *p_recv_contact_buf, HYPRE_Int contact_size, HYPRE_Int contact_proc, void *ro, MPI_Comm comm, void **p_send_response_buf, HYPRE_Int *response_message_size ) { HYPRE_UNUSED_VAR(p_send_response_buf); HYPRE_Int ndim, size, alloc_size, myid, i, d, index; HYPRE_Int *ids, *boxnums; HYPRE_Int *recv_contact_buf; hypre_Box *box; hypre_BoxArray *part_boxes; hypre_DataExchangeResponse *response_obj = (hypre_DataExchangeResponse *)ro; hypre_StructAssumedPart *assumed_part = (hypre_StructAssumedPart *)response_obj->data1; /* Initialize stuff */ hypre_MPI_Comm_rank(comm, &myid ); ndim = hypre_StructAssumedPartNDim(assumed_part); part_boxes = hypre_StructAssumedPartMyPartitionBoxes(assumed_part); ids = hypre_StructAssumedPartMyPartitionProcIds(assumed_part); boxnums = hypre_StructAssumedPartMyPartitionBoxnums(assumed_part); size = hypre_StructAssumedPartMyPartitionIdsSize(assumed_part); alloc_size = hypre_StructAssumedPartMyPartitionIdsAlloc(assumed_part); recv_contact_buf = (HYPRE_Int * ) p_recv_contact_buf; /* Increment how many procs have contacted us */ hypre_StructAssumedPartMyPartitionNumDistinctProcs(assumed_part)++; /* Check to see if we need to allocate more space for ids and boxnums */ if ((size + contact_size) > alloc_size) { alloc_size = size + contact_size; ids = hypre_TReAlloc(ids, HYPRE_Int, alloc_size, HYPRE_MEMORY_HOST); boxnums = hypre_TReAlloc(boxnums, HYPRE_Int, alloc_size, HYPRE_MEMORY_HOST); hypre_StructAssumedPartMyPartitionIdsAlloc(assumed_part) = alloc_size; } box = hypre_BoxCreate(ndim); /* Populate our assumed partition according to boxes received */ index = 0; for (i = 0; i < contact_size; i++) { ids[size + i] = contact_proc; /* Set the proc id */ boxnums[size + i] = recv_contact_buf[index++]; for (d = 0; d < ndim; d++) { hypre_BoxIMinD(box, d) = recv_contact_buf[index++]; hypre_BoxIMaxD(box, d) = recv_contact_buf[index++]; } hypre_AppendBox(box, part_boxes); } /* Adjust the size of the proc ids*/ hypre_StructAssumedPartMyPartitionIdsSize(assumed_part) = size + contact_size; /* In case more memory was allocated we have to assign these pointers back */ hypre_StructAssumedPartMyPartitionBoxes(assumed_part) = part_boxes; hypre_StructAssumedPartMyPartitionProcIds(assumed_part) = ids; hypre_StructAssumedPartMyPartitionBoxnums(assumed_part) = boxnums; /* Output - no message to return (confirmation) */ *response_message_size = 0; hypre_BoxDestroy(box); return hypre_error_flag; } /****************************************************************************** * Given a processor id, get that processor's assumed region(s). * * At most a processor has 2 assumed regions. Pass in a BoxArray of size 2. *****************************************************************************/ HYPRE_Int hypre_StructAssumedPartitionGetRegionsFromProc( hypre_StructAssumedPart *assumed_part, HYPRE_Int proc_id, hypre_BoxArray *assumed_regions ) { HYPRE_Int *proc_partitions; HYPRE_Int ndim, i, d; HYPRE_Int in_region, proc_count, proc_start, num_partitions; HYPRE_Int part_num, width, extra; HYPRE_Int adj_proc_id; HYPRE_Int num_assumed, num_regions; hypre_Box *region, *box; hypre_Index div, divindex, rsize, imin, imax; HYPRE_Int divi; ndim = hypre_StructAssumedPartNDim(assumed_part); num_regions = hypre_StructAssumedPartNumRegions(assumed_part); proc_partitions = hypre_StructAssumedPartProcPartitions(assumed_part); /* Check if this processor owns an assumed region. It is rare that it won't (only if # procs > bounding box or # procs > global #boxes). */ if (proc_id >= proc_partitions[num_regions]) { /* Owns no boxes */ num_assumed = 0; } else { /* Which partition region am I in? */ in_region = 0; if (num_regions > 1) { while (proc_id >= proc_partitions[in_region + 1]) { in_region++; } } /* First processor in the range */ proc_start = proc_partitions[in_region]; /* How many processors in that region? */ proc_count = proc_partitions[in_region + 1] - proc_partitions[in_region]; /* Get the region */ region = hypre_BoxArrayBox(hypre_StructAssumedPartRegions(assumed_part), in_region); /* Size of the regions */ hypre_BoxGetSize(region, rsize); /* Get the divisions in each dimension */ hypre_CopyIndex(hypre_StructAssumedPartDivision(assumed_part, in_region), div); /* Calculate the assumed partition(s) (at most 2) that I own */ num_partitions = hypre_IndexProd(div, ndim); /* How many procs have 2 partitions instead of one*/ extra = num_partitions % proc_count; /* Adjust the proc number to range from 0 to (proc_count-1) */ adj_proc_id = proc_id - proc_start; /* The region is divided into num_partitions partitions according to the number of divisions in each direction. Some processors may own more than one partition (up to 2). These partitions are numbered by dimension 0 first, then dimension 1, etc. From the partition number, we can calculate the processor id. */ /* Get my partition number */ if (adj_proc_id < extra) { part_num = adj_proc_id * 2; num_assumed = 2; } else { part_num = extra + adj_proc_id; num_assumed = 1; } } /* Make sure BoxArray has been allocated for num_assumed boxes */ hypre_BoxArraySetSize(assumed_regions, num_assumed); for (i = 0; i < num_assumed; i++) { hypre_IndexFromRank(part_num + i, div, divindex, ndim); for (d = ndim - 1; d >= 0; d--) { width = hypre_IndexD(rsize, d) / hypre_IndexD(div, d); extra = hypre_IndexD(rsize, d) % hypre_IndexD(div, d); divi = hypre_IndexD(divindex, d); hypre_IndexD(imin, d) = divi * width + hypre_min(divi, extra); divi = hypre_IndexD(divindex, d) + 1; hypre_IndexD(imax, d) = divi * width + hypre_min(divi, extra) - 1; /* Change relative coordinates to absolute */ hypre_IndexD(imin, d) += hypre_BoxIMinD(region, d); hypre_IndexD(imax, d) += hypre_BoxIMinD(region, d); } /* Set the assumed region*/ box = hypre_BoxArrayBox(assumed_regions, i); hypre_BoxSetExtents(box, imin, imax); } return hypre_error_flag; } /****************************************************************************** * Given a box, which processor(s) assumed partition does the box intersect. * * proc_array should be allocated to size_alloc_proc_array *****************************************************************************/ HYPRE_Int hypre_StructAssumedPartitionGetProcsFromBox( hypre_StructAssumedPart *assumed_part, hypre_Box *box, HYPRE_Int *num_proc_array, HYPRE_Int *size_alloc_proc_array, HYPRE_Int **p_proc_array ) { HYPRE_Int ndim = hypre_StructAssumedPartNDim(assumed_part); HYPRE_Int i, d, p, q, r, myid; HYPRE_Int num_regions, in_regions, this_region, proc_count, proc_start; HYPRE_Int adj_proc_id, extra, num_partitions; HYPRE_Int width; HYPRE_Int *proc_array, proc_array_count; HYPRE_Int *which_regions; HYPRE_Int *proc_ids, num_proc_ids, size_proc_ids, ncorners; hypre_Box *region; hypre_Box *result_box, *part_box, *part_dbox; hypre_Index div, rsize, stride, loop_size; hypre_IndexRef start; hypre_BoxArray *region_array; HYPRE_Int *proc_partitions; /* Need myid only for the hypre_printf statement */ hypre_MPI_Comm_rank(hypre_MPI_COMM_WORLD, &myid); proc_array = *p_proc_array; region_array = hypre_StructAssumedPartRegions(assumed_part); num_regions = hypre_StructAssumedPartNumRegions(assumed_part); proc_partitions = hypre_StructAssumedPartProcPartitions(assumed_part); /* First intersect the box to find out which region(s) it lies in, then determine which processor owns the assumed part of these regions(s) */ result_box = hypre_BoxCreate(ndim); part_box = hypre_BoxCreate(ndim); part_dbox = hypre_BoxCreate(ndim); which_regions = hypre_CTAlloc(HYPRE_Int, num_regions, HYPRE_MEMORY_HOST); /* The number of corners in a box is a good initial size for proc_ids */ ncorners = hypre_pow2(ndim); size_proc_ids = ncorners; proc_ids = hypre_CTAlloc(HYPRE_Int, size_proc_ids, HYPRE_MEMORY_HOST); num_proc_ids = 0; /* which partition region(s) am i in? */ in_regions = 0; for (i = 0; i < num_regions; i++) { region = hypre_BoxArrayBox(region_array, i); hypre_IntersectBoxes(box, region, result_box); if ( hypre_BoxVolume(result_box) > 0 ) { which_regions[in_regions] = i; in_regions++; } } #if 0 if (in_regions == 0) { /* 9/16/10 - In hypre_SStructGridAssembleBoxManagers we grow boxes by 1 before we gather boxes because of shared variables, so we can get the situation that the gather box is outside of the assumed region. */ if (hypre_BoxVolume(box) > 0) { hypre_error(HYPRE_ERROR_GENERIC); hypre_printf("MY_ID = %d Error: positive volume box (%d, %d, %d) x " "(%d, %d, %d) not in any assumed regions! (this should never" " happen)\n", myid, hypre_BoxIMinX(box), hypre_BoxIMinY(box), hypre_BoxIMinZ(box), hypre_BoxIMaxX(box), hypre_BoxIMaxY(box), hypre_BoxIMaxZ(box)); } } #endif /* For each region, who is assumed to own this box? Add the proc number to proc array. */ for (r = 0; r < in_regions; r++) { /* Initialization for this particular region */ this_region = which_regions[r]; region = hypre_BoxArrayBox(region_array, this_region); /* First processor in the range */ proc_start = proc_partitions[this_region]; /* How many processors in that region? */ proc_count = proc_partitions[this_region + 1] - proc_start; /* Size of the regions */ hypre_BoxGetSize(region, rsize); /* Get the divisons in each dimension */ hypre_CopyIndex(hypre_StructAssumedPartDivision(assumed_part, this_region), div); /* Intersect box with region */ hypre_IntersectBoxes(box, region, result_box); /* Compute part_box (the intersected assumed partitions) from result_box. Start part index number from 1 for convenience in BoxLoop below. */ for (d = 0; d < ndim; d++) { width = hypre_IndexD(rsize, d) / hypre_IndexD(div, d); extra = hypre_IndexD(rsize, d) % hypre_IndexD(div, d); /* imin component, shifted by region imin */ i = hypre_BoxIMinD(result_box, d) - hypre_BoxIMinD(region, d); p = i / (width + 1); if (p < extra) { hypre_BoxIMinD(part_box, d) = p + 1; } else { q = (i - extra * (width + 1)) / width; hypre_BoxIMinD(part_box, d) = extra + q + 1; } /* imax component, shifted by region imin */ i = hypre_BoxIMaxD(result_box, d) - hypre_BoxIMinD(region, d); p = i / (width + 1); if (p < extra) { hypre_BoxIMaxD(part_box, d) = p + 1; } else { q = (i - extra * (width + 1)) / width; hypre_BoxIMaxD(part_box, d) = extra + q + 1; } } /* Number of partitions in this region? */ num_partitions = hypre_IndexProd(div, ndim); /* How many procs have 2 partitions instead of one*/ extra = num_partitions % proc_count; /* Compute part_num for each index in part_box and get proc_ids */ start = hypre_BoxIMin(part_box); hypre_SetIndex(stride, 1); hypre_BoxGetSize(part_box, loop_size); hypre_BoxSetExtents(part_dbox, stride, div); hypre_SerialBoxLoop1Begin(ndim, loop_size, part_dbox, start, stride, part_num); { /*convert the partition number to a processor number*/ if (part_num < (2 * extra)) { adj_proc_id = part_num / 2 ; } else { adj_proc_id = extra + (part_num - 2 * extra); } if (num_proc_ids == size_proc_ids) { size_proc_ids += ncorners; proc_ids = hypre_TReAlloc(proc_ids, HYPRE_Int, size_proc_ids, HYPRE_MEMORY_HOST); } proc_ids[num_proc_ids] = adj_proc_id + proc_start; num_proc_ids++; } hypre_SerialBoxLoop1End(part_num); } /*end of for each region loop*/ if (in_regions) { /* Determine unique proc_ids (could be duplicates due to a processor owning more than one partiton in a region). Sort the array. */ hypre_qsort0(proc_ids, 0, num_proc_ids - 1); /* Make sure we have enough space from proc_array */ if (*size_alloc_proc_array < num_proc_ids) { proc_array = hypre_TReAlloc(proc_array, HYPRE_Int, num_proc_ids, HYPRE_MEMORY_HOST); *size_alloc_proc_array = num_proc_ids; } /* Put unique values in proc_array */ proc_array[0] = proc_ids[0]; /* There will be at least one processor id */ proc_array_count = 1; for (i = 1; i < num_proc_ids; i++) { if (proc_ids[i] != proc_array[proc_array_count - 1]) { proc_array[proc_array_count] = proc_ids[i]; proc_array_count++; } } } else /* No processors for this box */ { proc_array_count = 0; } /* Return variables */ *p_proc_array = proc_array; *num_proc_array = proc_array_count; /* Clean up*/ hypre_BoxDestroy(result_box); hypre_BoxDestroy(part_box); hypre_BoxDestroy(part_dbox); hypre_TFree(which_regions, HYPRE_MEMORY_HOST); hypre_TFree(proc_ids, HYPRE_MEMORY_HOST); return hypre_error_flag; } #if 0 /****************************************************************************** * UNFINISHED * * Create a new assumed partition by coarsening another assumed partition. * * Unfinished because of a problem: Can't figure out what the new id is since * the zero boxes drop out, and we don't have all of the boxes from a particular * processor in the AP. This may not be a problem any longer (see [issue708]). *****************************************************************************/ HYPRE_Int hypre_StructCoarsenAP(hypre_StructAssumedPart *ap, hypre_Index index, hypre_Index stride, hypre_StructAssumedPart **new_ap_ptr ) { HYPRE_Int num_regions; hypre_BoxArray *coarse_boxes; hypre_BoxArray *fine_boxes; hypre_BoxArray *regions_array; hypre_Box *box, *new_box; hypre_StructAssumedPartition *new_ap; /* Create new ap and copy global description information */ new_ap = hypre_TAlloc(hypre_StructAssumedPart, 1, HYPRE_MEMORY_HOST); num_regions = hypre_StructAssumedPartNumRegions(ap); regions_array = hypre_BoxArrayCreate(num_regions, ndim); hypre_StructAssumedPartRegions(new_ap) = regions_array; hypre_StructAssumedPartNumRegions(new_ap) = num_regions; hypre_StructAssumedPartProcPartitions(new_ap) = hypre_CTAlloc(HYPRE_Int, num_regions + 1, HYPRE_MEMORY_HOST); hypre_StructAssumedPartDivisions(new_ap) = hypre_CTAlloc(HYPRE_Int, num_regions, HYPRE_MEMORY_HOST); hypre_StructAssumedPartProcPartitions(new_ap)[0] = 0; for (i = 0; i < num_regions; i++) { box = hypre_BoxArrayBox(hypre_StructAssumedPartRegions(ap), i); hypre_CopyBox(box, hypre_BoxArrayBox(regions_array, i)); hypre_StructAssumedPartDivision(new_ap, i) = hypre_StructAssumedPartDivision(new_ap, i); hypre_StructAssumedPartProcPartition(new_ap, i + 1) = hypre_StructAssumedPartProcPartition(ap, i + 1); } /* Copy my partition (at most 2 boxes)*/ hypre_StructAssumedPartMyPartition(new_ap) = hypre_BoxArrayCreate(2, ndim); for (i = 0; i < 2; i++) { box = hypre_BoxArrayBox(hypre_StructAssumedPartMyPartition(ap), i); new_box = hypre_BoxArrayBox(hypre_StructAssumedPartMyPartition(new_ap), i); hypre_CopyBox(box, new_box); } /* Create space for the boxes, ids and boxnums */ size = hypre_StructAssumedPartMyPartitionIdsSize(ap); hypre_StructAssumedPartMyPartitionProcIds(new_ap) = hypre_CTAlloc(HYPRE_Int, size, HYPRE_MEMORY_HOST); hypre_StructAssumedPartMyPartitionBoxnums(new_ap) = hypre_CTAlloc(HYPRE_Int, size, HYPRE_MEMORY_HOST); hypre_StructAssumedPartMyPartitionBoxes(new_ap) = hypre_BoxArrayCreate(size, ndim); hypre_StructAssumedPartMyPartitionIdsAlloc(new_ap) = size; hypre_StructAssumedPartMyPartitionIdsSize(new_ap) = size; /* Coarsen and copy the boxes. Need to prune size 0 boxes. */ coarse_boxes = hypre_StructAssumedPartMyPartitionBoxes(new_ap); fine_boxes = hypre_StructAssumedPartMyPartitionBoxes(ap); new_box = hypre_BoxCreate(ndim); hypre_ForBoxI(i, fine_boxes) { box = hypre_BoxArrayBox(fine_boxes, i); hypre_CopyBox(box, new_box); hypre_StructCoarsenBox(new_box, index, stride); } /* Unfinished because of a problem: Can't figure out what the new id is since the zero boxes drop out, and we don't have all of the boxes from a particular processor in the AP */ /* hypre_StructAssumedPartMyPartitionNumDistinctProcs(new_ap) */ *new_ap_ptr = new_ap; return hypre_error_flag; } #endif hypre-2.33.0/src/struct_mv/assumed_part.h000066400000000000000000000057511477326011500204210ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * Header info for the struct assumed partition * *****************************************************************************/ #ifndef hypre_ASSUMED_PART_HEADER #define hypre_ASSUMED_PART_HEADER typedef struct { /* the entries will be the same for all procs */ HYPRE_Int ndim; /* number of dimensions */ hypre_BoxArray *regions; /* areas of the grid with boxes */ HYPRE_Int num_regions; /* how many regions */ HYPRE_Int *proc_partitions; /* proc ids assigned to each region (this is size num_regions +1) */ hypre_Index *divisions; /* number of proc divisions in each direction for each region */ /* these entries are specific to each proc */ hypre_BoxArray *my_partition; /* my portion of grid (at most 2) */ hypre_BoxArray *my_partition_boxes; /* boxes in my portion */ HYPRE_Int *my_partition_proc_ids; HYPRE_Int *my_partition_boxnums; HYPRE_Int my_partition_ids_size; HYPRE_Int my_partition_ids_alloc; HYPRE_Int my_partition_num_distinct_procs; } hypre_StructAssumedPart; /*Accessor macros */ #define hypre_StructAssumedPartNDim(apart) ((apart)->ndim) #define hypre_StructAssumedPartRegions(apart) ((apart)->regions) #define hypre_StructAssumedPartNumRegions(apart) ((apart)->num_regions) #define hypre_StructAssumedPartDivisions(apart) ((apart)->divisions) #define hypre_StructAssumedPartDivision(apart, i) ((apart)->divisions[i]) #define hypre_StructAssumedPartProcPartitions(apart) ((apart)->proc_partitions) #define hypre_StructAssumedPartProcPartition(apart, i) ((apart)->proc_partitions[i]) #define hypre_StructAssumedPartMyPartition(apart) ((apart)->my_partition) #define hypre_StructAssumedPartMyPartitionBoxes(apart) ((apart)->my_partition_boxes) #define hypre_StructAssumedPartMyPartitionProcIds(apart) ((apart)->my_partition_proc_ids) #define hypre_StructAssumedPartMyPartitionIdsSize(apart) ((apart)->my_partition_ids_size) #define hypre_StructAssumedPartMyPartitionIdsAlloc(apart) ((apart)->my_partition_ids_alloc) #define hypre_StructAssumedPartMyPartitionNumDistinctProcs(apart) ((apart)->my_partition_num_distinct_procs) #define hypre_StructAssumedPartMyPartitionBoxnums(apart) ((apart)->my_partition_boxnums) #define hypre_StructAssumedPartMyPartitionProcId(apart, i) ((apart)->my_partition_proc_ids[i]) #define hypre_StructAssumedPartMyPartitionBoxnum(apart, i) ((apart)->my_partition_boxnums[i]) #endif hypre-2.33.0/src/struct_mv/box.c000066400000000000000000000635421477326011500165170ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * Member functions for hypre_Box class: * Basic class functions. * *****************************************************************************/ #include "_hypre_struct_mv.h" /*========================================================================== * Member functions: hypre_Index *==========================================================================*/ /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SetIndex( hypre_Index index, HYPRE_Int val ) { HYPRE_Int d; for (d = 0; d < HYPRE_MAXDIM; d++) { hypre_IndexD(index, d) = val; } return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_CopyIndex( hypre_Index in_index, hypre_Index out_index ) { HYPRE_Int d; for (d = 0; d < HYPRE_MAXDIM; d++) { hypre_IndexD(out_index, d) = hypre_IndexD(in_index, d); } return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_CopyToCleanIndex( hypre_Index in_index, HYPRE_Int ndim, hypre_Index out_index ) { HYPRE_Int d; for (d = 0; d < ndim; d++) { hypre_IndexD(out_index, d) = hypre_IndexD(in_index, d); } for (d = ndim; d < HYPRE_MAXDIM; d++) { hypre_IndexD(out_index, d) = 0; } return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_IndexEqual( hypre_Index index, HYPRE_Int val, HYPRE_Int ndim ) { HYPRE_Int d, equal; equal = 1; for (d = 0; d < ndim; d++) { if (hypre_IndexD(index, d) != val) { equal = 0; break; } } return equal; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_IndexMin( hypre_Index index, HYPRE_Int ndim ) { HYPRE_Int d, min; min = hypre_IndexD(index, 0); for (d = 1; d < ndim; d++) { if (hypre_IndexD(index, d) < min) { min = hypre_IndexD(index, d); } } return min; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_IndexMax( hypre_Index index, HYPRE_Int ndim ) { HYPRE_Int d, max; max = hypre_IndexD(index, 0); for (d = 1; d < ndim; d++) { if (hypre_IndexD(index, d) < max) { max = hypre_IndexD(index, d); } } return max; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_AddIndexes( hypre_Index index1, hypre_Index index2, HYPRE_Int ndim, hypre_Index result ) { HYPRE_Int d; for (d = 0; d < ndim; d++) { hypre_IndexD(result, d) = hypre_IndexD(index1, d) + hypre_IndexD(index2, d); } return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SubtractIndexes( hypre_Index index1, hypre_Index index2, HYPRE_Int ndim, hypre_Index result ) { HYPRE_Int d; for (d = 0; d < ndim; d++) { hypre_IndexD(result, d) = hypre_IndexD(index1, d) - hypre_IndexD(index2, d); } return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_IndexesEqual( hypre_Index index1, hypre_Index index2, HYPRE_Int ndim ) { HYPRE_Int d, equal; equal = 1; for (d = 0; d < ndim; d++) { if (hypre_IndexD(index1, d) != hypre_IndexD(index2, d)) { equal = 0; break; } } return equal; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_IndexPrint( FILE *file, HYPRE_Int ndim, hypre_Index index ) { HYPRE_Int d; hypre_fprintf(file, "[%d", hypre_IndexD(index, 0)); for (d = 1; d < ndim; d++) { hypre_fprintf(file, " %d", hypre_IndexD(index, d)); } hypre_fprintf(file, "]"); return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_IndexRead( FILE *file, HYPRE_Int ndim, hypre_Index index ) { HYPRE_Int d; hypre_fscanf(file, "[%d", &hypre_IndexD(index, 0)); for (d = 1; d < ndim; d++) { hypre_fscanf(file, " %d", &hypre_IndexD(index, d)); } hypre_fscanf(file, "]"); for (d = ndim; d < HYPRE_MAXDIM; d++) { hypre_IndexD(index, d) = 0; } return hypre_error_flag; } /*========================================================================== * Member functions: hypre_Box *==========================================================================*/ /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ hypre_Box * hypre_BoxCreate( HYPRE_Int ndim ) { hypre_Box *box; box = hypre_CTAlloc(hypre_Box, 1, HYPRE_MEMORY_HOST); hypre_BoxNDim(box) = ndim; return box; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_BoxDestroy( hypre_Box *box ) { if (box) { hypre_TFree(box, HYPRE_MEMORY_HOST); } return hypre_error_flag; } /*-------------------------------------------------------------------------- * This is used to initialize ndim when the box has static storage *--------------------------------------------------------------------------*/ HYPRE_Int hypre_BoxInit( hypre_Box *box, HYPRE_Int ndim ) { hypre_BoxNDim(box) = ndim; return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_BoxSetExtents( hypre_Box *box, hypre_Index imin, hypre_Index imax ) { hypre_CopyIndex(imin, hypre_BoxIMin(box)); hypre_CopyIndex(imax, hypre_BoxIMax(box)); return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_CopyBox( hypre_Box *box1, hypre_Box *box2 ) { hypre_CopyIndex(hypre_BoxIMin(box1), hypre_BoxIMin(box2)); hypre_CopyIndex(hypre_BoxIMax(box1), hypre_BoxIMax(box2)); hypre_BoxNDim(box2) = hypre_BoxNDim(box1); return hypre_error_flag; } /*-------------------------------------------------------------------------- * Return a duplicate box. *--------------------------------------------------------------------------*/ hypre_Box * hypre_BoxDuplicate( hypre_Box *box ) { hypre_Box *new_box; new_box = hypre_BoxCreate(hypre_BoxNDim(box)); hypre_CopyBox(box, new_box); return new_box; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_BoxVolume( hypre_Box *box ) { HYPRE_Int volume, d, ndim = hypre_BoxNDim(box); volume = 1; for (d = 0; d < ndim; d++) { volume *= hypre_BoxSizeD(box, d); } return volume; } /*-------------------------------------------------------------------------- * To prevent overflow when needed *--------------------------------------------------------------------------*/ HYPRE_Real hypre_doubleBoxVolume( hypre_Box *box ) { HYPRE_Real volume; HYPRE_Int d, ndim = hypre_BoxNDim(box); volume = 1.0; for (d = 0; d < ndim; d++) { volume *= hypre_BoxSizeD(box, d); } return volume; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_IndexInBox( hypre_Index index, hypre_Box *box ) { HYPRE_Int d, inbox, ndim = hypre_BoxNDim(box); inbox = 1; for (d = 0; d < ndim; d++) { if (!hypre_IndexDInBox(index, d, box)) { inbox = 0; break; } } return inbox; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_BoxGetSize( hypre_Box *box, hypre_Index size ) { HYPRE_Int d, ndim = hypre_BoxNDim(box); for (d = 0; d < ndim; d++) { hypre_IndexD(size, d) = hypre_BoxSizeD(box, d); } return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_BoxGetStrideSize( hypre_Box *box, hypre_Index stride, hypre_Index size ) { HYPRE_Int d, s, ndim = hypre_BoxNDim(box); for (d = 0; d < ndim; d++) { s = hypre_BoxSizeD(box, d); if (s > 0) { s = (s - 1) / hypre_IndexD(stride, d) + 1; } hypre_IndexD(size, d) = s; } return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_BoxGetStrideVolume( hypre_Box *box, hypre_Index stride, HYPRE_Int *volume_ptr ) { HYPRE_Int volume, d, s, ndim = hypre_BoxNDim(box); volume = 1; for (d = 0; d < ndim; d++) { s = hypre_BoxSizeD(box, d); if (s > 0) { s = (s - 1) / hypre_IndexD(stride, d) + 1; } volume *= s; } *volume_ptr = volume; return hypre_error_flag; } /*-------------------------------------------------------------------------- * Returns the rank of an index into a multi-D box where the assumed ordering is * dimension 0 first, then dimension 1, etc. *--------------------------------------------------------------------------*/ HYPRE_Int hypre_BoxIndexRank( hypre_Box *box, hypre_Index index ) { HYPRE_Int rank, size, d, ndim = hypre_BoxNDim(box); rank = 0; size = 1; for (d = 0; d < ndim; d++) { rank += (hypre_IndexD(index, d) - hypre_BoxIMinD(box, d)) * size; size *= hypre_BoxSizeD(box, d); } return rank; } /*-------------------------------------------------------------------------- * Computes an index into a multi-D box from a rank where the assumed ordering * is dimension 0 first, then dimension 1, etc. *--------------------------------------------------------------------------*/ HYPRE_Int hypre_BoxRankIndex( hypre_Box *box, HYPRE_Int rank, hypre_Index index ) { HYPRE_Int d, r, s, ndim = hypre_BoxNDim(box); r = rank; s = hypre_BoxVolume(box); for (d = ndim - 1; d >= 0; d--) { s = s / hypre_BoxSizeD(box, d); hypre_IndexD(index, d) = r / s; hypre_IndexD(index, d) += hypre_BoxIMinD(box, d); r = r % s; } return hypre_error_flag; } /*-------------------------------------------------------------------------- * Returns the distance of an index offset in a multi-D box where the assumed * ordering is dimension 0 first, then dimension 1, etc. *--------------------------------------------------------------------------*/ HYPRE_Int hypre_BoxOffsetDistance( hypre_Box *box, hypre_Index index ) { HYPRE_Int dist, size, d, ndim = hypre_BoxNDim(box); dist = 0; size = 1; for (d = 0; d < ndim; d++) { dist += hypre_IndexD(index, d) * size; size *= hypre_BoxSizeD(box, d); } return dist; } /*-------------------------------------------------------------------------- * Shift a box by a positive shift *--------------------------------------------------------------------------*/ HYPRE_Int hypre_BoxShiftPos( hypre_Box *box, hypre_Index shift ) { HYPRE_Int d, ndim = hypre_BoxNDim(box); for (d = 0; d < ndim; d++) { hypre_BoxIMinD(box, d) += hypre_IndexD(shift, d); hypre_BoxIMaxD(box, d) += hypre_IndexD(shift, d); } return hypre_error_flag; } /*-------------------------------------------------------------------------- * Shift a box by a negative shift *--------------------------------------------------------------------------*/ HYPRE_Int hypre_BoxShiftNeg( hypre_Box *box, hypre_Index shift ) { HYPRE_Int d, ndim = hypre_BoxNDim(box); for (d = 0; d < ndim; d++) { hypre_BoxIMinD(box, d) -= hypre_IndexD(shift, d); hypre_BoxIMaxD(box, d) -= hypre_IndexD(shift, d); } return hypre_error_flag; } /*-------------------------------------------------------------------------- * Grow a box outward in each dimension as specified by index *--------------------------------------------------------------------------*/ HYPRE_Int hypre_BoxGrowByIndex( hypre_Box *box, hypre_Index index ) { hypre_IndexRef imin = hypre_BoxIMin(box); hypre_IndexRef imax = hypre_BoxIMax(box); HYPRE_Int ndim = hypre_BoxNDim(box); HYPRE_Int d, i; for (d = 0; d < ndim; d++) { i = hypre_IndexD(index, d); hypre_IndexD(imin, d) -= i; hypre_IndexD(imax, d) += i; } return hypre_error_flag; } /*-------------------------------------------------------------------------- * Grow a box outward by val in each dimension *--------------------------------------------------------------------------*/ HYPRE_Int hypre_BoxGrowByValue( hypre_Box *box, HYPRE_Int val ) { HYPRE_Int *imin = hypre_BoxIMin(box); HYPRE_Int *imax = hypre_BoxIMax(box); HYPRE_Int ndim = hypre_BoxNDim(box); HYPRE_Int d; for (d = 0; d < ndim; d++) { hypre_IndexD(imin, d) -= val; hypre_IndexD(imax, d) += val; } return hypre_error_flag; } /*-------------------------------------------------------------------------- * Grow a box as specified by array *--------------------------------------------------------------------------*/ HYPRE_Int hypre_BoxGrowByArray( hypre_Box *box, HYPRE_Int *array ) { HYPRE_Int *imin = hypre_BoxIMin(box); HYPRE_Int *imax = hypre_BoxIMax(box); HYPRE_Int ndim = hypre_BoxNDim(box); HYPRE_Int d; for (d = 0; d < ndim; d++) { imin[d] -= array[2 * d]; imax[d] += array[2 * d + 1]; } return hypre_error_flag; } /*-------------------------------------------------------------------------- * Print a box to file *--------------------------------------------------------------------------*/ HYPRE_Int hypre_BoxPrint( FILE *file, hypre_Box *box ) { HYPRE_Int ndim = hypre_BoxNDim(box); HYPRE_Int d; hypre_fprintf(file, "(%d", hypre_BoxIMinD(box, 0)); for (d = 1; d < ndim; d++) { hypre_fprintf(file, ", %d", hypre_BoxIMinD(box, d)); } hypre_fprintf(file, ") x (%d", hypre_BoxIMaxD(box, 0)); for (d = 1; d < ndim; d++) { hypre_fprintf(file, ", %d", hypre_BoxIMaxD(box, d)); } hypre_fprintf(file, ")"); return hypre_error_flag; } /*-------------------------------------------------------------------------- * Read a box from file *--------------------------------------------------------------------------*/ HYPRE_Int hypre_BoxRead( FILE *file, HYPRE_Int ndim, hypre_Box **box_ptr ) { hypre_Box *box; HYPRE_Int d; /* Don't create a new box if the output box already exists */ if (*box_ptr) { box = *box_ptr; hypre_BoxInit(box, ndim); } else { box = hypre_BoxCreate(ndim); } hypre_fscanf(file, "(%d", &hypre_BoxIMinD(box, 0)); for (d = 1; d < ndim; d++) { hypre_fscanf(file, ", %d", &hypre_BoxIMinD(box, d)); } hypre_fscanf(file, ") x (%d", &hypre_BoxIMaxD(box, 0)); for (d = 1; d < ndim; d++) { hypre_fscanf(file, ", %d", &hypre_BoxIMaxD(box, d)); } hypre_fscanf(file, ")"); *box_ptr = box; return hypre_error_flag; } /*========================================================================== * Member functions: hypre_BoxArray *==========================================================================*/ /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ hypre_BoxArray * hypre_BoxArrayCreate( HYPRE_Int size, HYPRE_Int ndim ) { HYPRE_Int i; hypre_Box *box; hypre_BoxArray *box_array; box_array = hypre_TAlloc(hypre_BoxArray, 1, HYPRE_MEMORY_HOST); hypre_BoxArrayBoxes(box_array) = hypre_CTAlloc(hypre_Box, size, HYPRE_MEMORY_HOST); hypre_BoxArraySize(box_array) = size; hypre_BoxArrayAllocSize(box_array) = size; hypre_BoxArrayNDim(box_array) = ndim; for (i = 0; i < size; i++) { box = hypre_BoxArrayBox(box_array, i); hypre_BoxNDim(box) = ndim; } return box_array; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_BoxArrayDestroy( hypre_BoxArray *box_array ) { if (box_array) { hypre_TFree(hypre_BoxArrayBoxes(box_array), HYPRE_MEMORY_HOST); hypre_TFree(box_array, HYPRE_MEMORY_HOST); } return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_BoxArraySetSize( hypre_BoxArray *box_array, HYPRE_Int size ) { HYPRE_Int alloc_size; alloc_size = hypre_BoxArrayAllocSize(box_array); if (size > alloc_size) { HYPRE_Int i, old_alloc_size, ndim = hypre_BoxArrayNDim(box_array); hypre_Box *box; old_alloc_size = alloc_size; alloc_size = size + hypre_BoxArrayExcess; hypre_BoxArrayBoxes(box_array) = hypre_TReAlloc(hypre_BoxArrayBoxes(box_array), hypre_Box, alloc_size, HYPRE_MEMORY_HOST); hypre_BoxArrayAllocSize(box_array) = alloc_size; for (i = old_alloc_size; i < alloc_size; i++) { box = hypre_BoxArrayBox(box_array, i); hypre_BoxNDim(box) = ndim; } } hypre_BoxArraySize(box_array) = size; return hypre_error_flag; } /*-------------------------------------------------------------------------- * Return a duplicate box_array. *--------------------------------------------------------------------------*/ hypre_BoxArray * hypre_BoxArrayDuplicate( hypre_BoxArray *box_array ) { hypre_BoxArray *new_box_array; HYPRE_Int i; new_box_array = hypre_BoxArrayCreate( hypre_BoxArraySize(box_array), hypre_BoxArrayNDim(box_array)); hypre_ForBoxI(i, box_array) { hypre_CopyBox(hypre_BoxArrayBox(box_array, i), hypre_BoxArrayBox(new_box_array, i)); } return new_box_array; } /*-------------------------------------------------------------------------- * Append box to the end of box_array. * The box_array may be empty. *--------------------------------------------------------------------------*/ HYPRE_Int hypre_AppendBox( hypre_Box *box, hypre_BoxArray *box_array ) { HYPRE_Int size; size = hypre_BoxArraySize(box_array); hypre_BoxArraySetSize(box_array, (size + 1)); hypre_CopyBox(box, hypre_BoxArrayBox(box_array, size)); return hypre_error_flag; } /*-------------------------------------------------------------------------- * Delete box from box_array. *--------------------------------------------------------------------------*/ HYPRE_Int hypre_DeleteBox( hypre_BoxArray *box_array, HYPRE_Int index ) { HYPRE_Int i; for (i = index; i < hypre_BoxArraySize(box_array) - 1; i++) { hypre_CopyBox(hypre_BoxArrayBox(box_array, i + 1), hypre_BoxArrayBox(box_array, i)); } hypre_BoxArraySize(box_array) --; return hypre_error_flag; } /*-------------------------------------------------------------------------- * Deletes boxes corrsponding to indices from box_array. * Assumes indices are in ascending order. (AB 11/04) *--------------------------------------------------------------------------*/ HYPRE_Int hypre_DeleteMultipleBoxes( hypre_BoxArray *box_array, HYPRE_Int* indices, HYPRE_Int num ) { HYPRE_Int i, j, start, array_size; if (num < 1) { return hypre_error_flag; } array_size = hypre_BoxArraySize(box_array); start = indices[0]; j = 0; for (i = start; (i + j) < array_size; i++) { if (j < num) { while ((i + j) == indices[j]) /* see if deleting consecutive items */ { j++; /*increase the shift*/ if (j == num) { break; } } } if ( (i + j) < array_size) /* if deleting the last item then no moving */ { hypre_CopyBox(hypre_BoxArrayBox(box_array, i + j), hypre_BoxArrayBox(box_array, i)); } } hypre_BoxArraySize(box_array) = array_size - num; return hypre_error_flag; } /*-------------------------------------------------------------------------- * Append box_array_0 to the end of box_array_1. * The box_array_1 may be empty. *--------------------------------------------------------------------------*/ HYPRE_Int hypre_AppendBoxArray( hypre_BoxArray *box_array_0, hypre_BoxArray *box_array_1 ) { HYPRE_Int size, size_0; HYPRE_Int i; size = hypre_BoxArraySize(box_array_1); size_0 = hypre_BoxArraySize(box_array_0); hypre_BoxArraySetSize(box_array_1, (size + size_0)); /* copy box_array_0 boxes into box_array_1 */ for (i = 0; i < size_0; i++) { hypre_CopyBox(hypre_BoxArrayBox(box_array_0, i), hypre_BoxArrayBox(box_array_1, size + i)); } return hypre_error_flag; } /*========================================================================== * Member functions: hypre_BoxArrayArray *==========================================================================*/ /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ hypre_BoxArrayArray * hypre_BoxArrayArrayCreate( HYPRE_Int size, HYPRE_Int ndim ) { hypre_BoxArrayArray *box_array_array; HYPRE_Int i; box_array_array = hypre_CTAlloc(hypre_BoxArrayArray, 1, HYPRE_MEMORY_HOST); hypre_BoxArrayArrayBoxArrays(box_array_array) = hypre_CTAlloc(hypre_BoxArray *, size, HYPRE_MEMORY_HOST); for (i = 0; i < size; i++) { hypre_BoxArrayArrayBoxArray(box_array_array, i) = hypre_BoxArrayCreate(0, ndim); } hypre_BoxArrayArraySize(box_array_array) = size; hypre_BoxArrayArrayNDim(box_array_array) = ndim; return box_array_array; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_BoxArrayArrayDestroy( hypre_BoxArrayArray *box_array_array ) { HYPRE_Int i; if (box_array_array) { hypre_ForBoxArrayI(i, box_array_array) hypre_BoxArrayDestroy( hypre_BoxArrayArrayBoxArray(box_array_array, i)); hypre_TFree(hypre_BoxArrayArrayBoxArrays(box_array_array), HYPRE_MEMORY_HOST); hypre_TFree(box_array_array, HYPRE_MEMORY_HOST); } return hypre_error_flag; } /*-------------------------------------------------------------------------- * Return a duplicate box_array_array. *--------------------------------------------------------------------------*/ hypre_BoxArrayArray * hypre_BoxArrayArrayDuplicate( hypre_BoxArrayArray *box_array_array ) { hypre_BoxArrayArray *new_box_array_array; hypre_BoxArray **new_box_arrays; HYPRE_Int new_size; hypre_BoxArray **box_arrays; HYPRE_Int i; new_size = hypre_BoxArrayArraySize(box_array_array); new_box_array_array = hypre_BoxArrayArrayCreate( new_size, hypre_BoxArrayArrayNDim(box_array_array)); if (new_size) { new_box_arrays = hypre_BoxArrayArrayBoxArrays(new_box_array_array); box_arrays = hypre_BoxArrayArrayBoxArrays(box_array_array); for (i = 0; i < new_size; i++) { hypre_AppendBoxArray(box_arrays[i], new_box_arrays[i]); } } return new_box_array_array; } hypre-2.33.0/src/struct_mv/box.h000066400000000000000000000314251477326011500165170ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * Header info for the Box structures * *****************************************************************************/ #ifndef hypre_BOX_HEADER #define hypre_BOX_HEADER #ifndef HYPRE_MAXDIM #define HYPRE_MAXDIM 3 #endif /*-------------------------------------------------------------------------- * hypre_Index: * This is used to define indices in index space, or dimension * sizes of boxes. * * The spatial dimensions x, y, and z may be specified by the * integers 0, 1, and 2, respectively (see the hypre_IndexD macro below). * This simplifies the code in the hypre_Box class by reducing code * replication. *--------------------------------------------------------------------------*/ typedef HYPRE_Int hypre_Index[HYPRE_MAXDIM]; typedef HYPRE_Int *hypre_IndexRef; /*-------------------------------------------------------------------------- * hypre_Box: *--------------------------------------------------------------------------*/ typedef struct hypre_Box_struct { hypre_Index imin; /* min bounding indices */ hypre_Index imax; /* max bounding indices */ HYPRE_Int ndim; /* number of dimensions */ } hypre_Box; /*-------------------------------------------------------------------------- * hypre_BoxArray: * An array of boxes. * Since size can be zero, need to store ndim separately. *--------------------------------------------------------------------------*/ typedef struct hypre_BoxArray_struct { hypre_Box *boxes; /* Array of boxes */ HYPRE_Int size; /* Size of box array */ HYPRE_Int alloc_size; /* Size of currently alloced space */ HYPRE_Int ndim; /* number of dimensions */ } hypre_BoxArray; #define hypre_BoxArrayExcess 10 /*-------------------------------------------------------------------------- * hypre_BoxArrayArray: * An array of box arrays. * Since size can be zero, need to store ndim separately. *--------------------------------------------------------------------------*/ typedef struct hypre_BoxArrayArray_struct { hypre_BoxArray **box_arrays; /* Array of pointers to box arrays */ HYPRE_Int size; /* Size of box array array */ HYPRE_Int ndim; /* number of dimensions */ } hypre_BoxArrayArray; /*-------------------------------------------------------------------------- * Accessor macros: hypre_Index *--------------------------------------------------------------------------*/ #define hypre_IndexD(index, d) (index[d]) /* Avoid using these macros */ #define hypre_IndexX(index) hypre_IndexD(index, 0) #define hypre_IndexY(index) hypre_IndexD(index, 1) #define hypre_IndexZ(index) hypre_IndexD(index, 2) /*-------------------------------------------------------------------------- * Member functions: hypre_Index *--------------------------------------------------------------------------*/ /*----- Avoid using these Index macros -----*/ #define hypre_SetIndex3(index, ix, iy, iz) \ ( hypre_IndexD(index, 0) = ix,\ hypre_IndexD(index, 1) = iy,\ hypre_IndexD(index, 2) = iz ) #define hypre_ClearIndex(index) hypre_SetIndex(index, 0) /*-------------------------------------------------------------------------- * Accessor macros: hypre_Box *--------------------------------------------------------------------------*/ #define hypre_BoxIMin(box) ((box) -> imin) #define hypre_BoxIMax(box) ((box) -> imax) #define hypre_BoxNDim(box) ((box) -> ndim) #define hypre_BoxIMinD(box, d) (hypre_IndexD(hypre_BoxIMin(box), d)) #define hypre_BoxIMaxD(box, d) (hypre_IndexD(hypre_BoxIMax(box), d)) #define hypre_BoxSizeD(box, d) \ hypre_max(0, (hypre_BoxIMaxD(box, d) - hypre_BoxIMinD(box, d) + 1)) #define hypre_IndexDInBox(index, d, box) \ ( hypre_IndexD(index, d) >= hypre_BoxIMinD(box, d) && \ hypre_IndexD(index, d) <= hypre_BoxIMaxD(box, d) ) /* The first hypre_CCBoxIndexRank is better style because it is similar to hypre_BoxIndexRank. The second one sometimes avoids compiler warnings. */ #define hypre_CCBoxIndexRank(box, index) 0 #define hypre_CCBoxIndexRank_noargs() 0 #define hypre_CCBoxOffsetDistance(box, index) 0 /*----- Avoid using these Box macros -----*/ #define hypre_BoxSizeX(box) hypre_BoxSizeD(box, 0) #define hypre_BoxSizeY(box) hypre_BoxSizeD(box, 1) #define hypre_BoxSizeZ(box) hypre_BoxSizeD(box, 2) /*-------------------------------------------------------------------------- * Accessor macros: hypre_BoxArray *--------------------------------------------------------------------------*/ #define hypre_BoxArrayBoxes(box_array) ((box_array) -> boxes) #define hypre_BoxArrayBox(box_array, i) &((box_array) -> boxes[(i)]) #define hypre_BoxArraySize(box_array) ((box_array) -> size) #define hypre_BoxArrayAllocSize(box_array) ((box_array) -> alloc_size) #define hypre_BoxArrayNDim(box_array) ((box_array) -> ndim) /*-------------------------------------------------------------------------- * Accessor macros: hypre_BoxArrayArray *--------------------------------------------------------------------------*/ #define hypre_BoxArrayArrayBoxArrays(box_array_array) \ ((box_array_array) -> box_arrays) #define hypre_BoxArrayArrayBoxArray(box_array_array, i) \ ((box_array_array) -> box_arrays[(i)]) #define hypre_BoxArrayArraySize(box_array_array) \ ((box_array_array) -> size) #define hypre_BoxArrayArrayNDim(box_array_array) \ ((box_array_array) -> ndim) /*-------------------------------------------------------------------------- * Looping macros: *--------------------------------------------------------------------------*/ #define hypre_ForBoxI(i, box_array) \ for (i = 0; i < hypre_BoxArraySize(box_array); i++) #define hypre_ForBoxArrayI(i, box_array_array) \ for (i = 0; i < hypre_BoxArrayArraySize(box_array_array); i++) #define ZYPRE_BOX_PRIVATE hypre__IN,hypre__JN,hypre__I,hypre__J,hypre__d,hypre__i #define HYPRE_BOX_PRIVATE ZYPRE_BOX_PRIVATE #define zypre_BoxLoopDeclare() \ HYPRE_Int hypre__tot, hypre__div, hypre__mod;\ HYPRE_Int hypre__block, hypre__num_blocks;\ HYPRE_Int hypre__d, hypre__ndim;\ HYPRE_Int hypre__I, hypre__J, hypre__IN, hypre__JN;\ HYPRE_Int hypre__i[HYPRE_MAXDIM+1], hypre__n[HYPRE_MAXDIM+1] #define zypre_BoxLoopDeclareK(k) \ HYPRE_Int hypre__ikstart##k, hypre__i0inc##k;\ HYPRE_Int hypre__sk##k[HYPRE_MAXDIM], hypre__ikinc##k[HYPRE_MAXDIM+1] #define zypre_BoxLoopInit(ndim, loop_size) \ hypre__ndim = ndim;\ hypre__n[0] = loop_size[0];\ hypre__tot = 1;\ for (hypre__d = 1; hypre__d < hypre__ndim; hypre__d++)\ {\ hypre__n[hypre__d] = loop_size[hypre__d];\ hypre__tot *= hypre__n[hypre__d];\ }\ hypre__n[hypre__ndim] = 2;\ hypre__num_blocks = hypre_NumThreads();\ if (hypre__tot < hypre__num_blocks)\ {\ hypre__num_blocks = hypre__tot;\ }\ if (hypre__num_blocks > 0)\ {\ hypre__div = hypre__tot / hypre__num_blocks;\ hypre__mod = hypre__tot % hypre__num_blocks;\ }\ else\ {\ hypre__div = 0;\ hypre__mod = 0;\ } #define zypre_BoxLoopInitK(k, dboxk, startk, stridek, ik) \ hypre__sk##k[0] = stridek[0];\ hypre__ikinc##k[0] = 0;\ ik = hypre_BoxSizeD(dboxk, 0); /* temporarily use ik */\ for (hypre__d = 1; hypre__d < hypre__ndim; hypre__d++)\ {\ hypre__sk##k[hypre__d] = ik*stridek[hypre__d];\ hypre__ikinc##k[hypre__d] = hypre__ikinc##k[hypre__d-1] +\ hypre__sk##k[hypre__d] - hypre__n[hypre__d-1]*hypre__sk##k[hypre__d-1];\ ik *= hypre_BoxSizeD(dboxk, hypre__d);\ }\ hypre__i0inc##k = hypre__sk##k[0];\ hypre__ikinc##k[hypre__ndim] = 0;\ hypre__ikstart##k = hypre_BoxIndexRank(dboxk, startk) #define zypre_BoxLoopSet() \ hypre__IN = hypre__n[0];\ if (hypre__num_blocks > 1)/* in case user sets num_blocks to 1 */\ {\ hypre__JN = hypre__div + ((hypre__mod > hypre__block) ? 1 : 0);\ hypre__J = hypre__block * hypre__div + hypre_min(hypre__mod, hypre__block);\ for (hypre__d = 1; hypre__d < hypre__ndim; hypre__d++)\ {\ hypre__i[hypre__d] = hypre__J % hypre__n[hypre__d];\ hypre__J /= hypre__n[hypre__d];\ }\ }\ else\ {\ hypre__JN = hypre__tot;\ for (hypre__d = 1; hypre__d < hypre__ndim; hypre__d++)\ {\ hypre__i[hypre__d] = 0;\ }\ }\ hypre__i[hypre__ndim] = 0 #define zypre_BoxLoopSetK(k, ik) \ ik = hypre__ikstart##k;\ for (hypre__d = 1; hypre__d < hypre__ndim; hypre__d++)\ {\ ik += hypre__i[hypre__d]*hypre__sk##k[hypre__d];\ } #define zypre_BoxLoopInc1() \ hypre__d = 1;\ while ((hypre__i[hypre__d]+2) > hypre__n[hypre__d])\ {\ hypre__d++;\ } #define zypre_BoxLoopInc2() \ hypre__i[hypre__d]++;\ while (hypre__d > 1)\ {\ hypre__d--;\ hypre__i[hypre__d] = 0;\ } /* This returns the loop index (of type hypre_Index) for the current iteration, * where the numbering starts at 0. It works even when threading is turned on, * as long as 'index' is declared to be private. */ #define zypre_BoxLoopGetIndex(index) \ index[0] = hypre__I;\ for (hypre__d = 1; hypre__d < hypre__ndim; hypre__d++)\ {\ index[hypre__d] = hypre__i[hypre__d];\ } /* Use this before the For macros below to force only one block */ #define zypre_BoxLoopSetOneBlock() hypre__num_blocks = 1 /* Use this to get the block iteration inside a BoxLoop */ #define zypre_BoxLoopBlock() hypre__block #define zypre_BasicBoxLoopInitK(k, stridek) \ hypre__sk##k[0] = stridek[0];\ hypre__ikinc##k[0] = 0;\ for (hypre__d = 1; hypre__d < hypre__ndim; hypre__d++)\ {\ hypre__sk##k[hypre__d] = stridek[hypre__d];\ hypre__ikinc##k[hypre__d] = hypre__ikinc##k[hypre__d-1] +\ hypre__sk##k[hypre__d] - hypre__n[hypre__d-1]*hypre__sk##k[hypre__d-1];\ }\ hypre__i0inc##k = hypre__sk##k[0];\ hypre__ikinc##k[hypre__ndim] = 0;\ hypre__ikstart##k = 0 /*-------------------------------------------------------------------------- * NOTES - Keep these for reference here and elsewhere in the code *--------------------------------------------------------------------------*/ #if 0 #define hypre_BoxLoop2Begin(loop_size, dbox1, start1, stride1, i1, dbox2, start2, stride2, i2) { /* init hypre__i1start */ HYPRE_Int hypre__i1start = hypre_BoxIndexRank(dbox1, start1); HYPRE_Int hypre__i2start = hypre_BoxIndexRank(dbox2, start2); /* declare and set hypre__s1 */ hypre_BoxLoopDeclareS(dbox1, stride1, hypre__sx1, hypre__sy1, hypre__sz1); hypre_BoxLoopDeclareS(dbox2, stride2, hypre__sx2, hypre__sy2, hypre__sz2); /* declare and set hypre__n, hypre__m, hypre__dir, hypre__max, * hypre__div, hypre__mod, hypre__block, hypre__num_blocks */ hypre_BoxLoopDeclareN(loop_size); #define hypre_BoxLoop2For(i, j, k, i1, i2) for (hypre__block = 0; hypre__block < hypre__num_blocks; hypre__block++) { /* set i and hypre__n */ hypre_BoxLoopSet(i, j, k); /* set i1 */ i1 = hypre__i1start + i * hypre__sx1 + j * hypre__sy1 + k * hypre__sz1; i2 = hypre__i2start + i * hypre__sx2 + j * hypre__sy2 + k * hypre__sz2; for (k = 0; k < hypre__nz; k++) { for (j = 0; j < hypre__ny; j++) { for (i = 0; i < hypre__nx; i++) { #define hypre_BoxLoop2End(i1, i2) i1 += hypre__sx1; i2 += hypre__sx2; } i1 += hypre__sy1 - hypre__nx * hypre__sx1; i2 += hypre__sy2 - hypre__nx * hypre__sx2; } i1 += hypre__sz1 - hypre__ny * hypre__sy1; i2 += hypre__sz2 - hypre__ny * hypre__sy2; } } } /*---------------------------------------- * Idea 2: Simple version of Idea 3 below *----------------------------------------*/ N = 1; for (d = 0; d < ndim; d++) { N *= n[d]; i[d] = 0; n[d] -= 2; /* this produces a simpler comparison below */ } i[ndim] = 0; n[ndim] = 0; for (I = 0; I < N; I++) { /* loop body */ for (d = 0; i[d] > n[d]; d++) { i[d] = 0; } i[d]++; i1 += s1[d]; /* NOTE: These are different from hypre__sx1, etc. above */ i2 += s2[d]; /* The lengths of i, n, and s must be (ndim+1) */ } /*---------------------------------------- * Idea 3: Approach used in the box loops *----------------------------------------*/ N = 1; for (d = 1; d < ndim; d++) { N *= n[d]; i[d] = 0; n[d] -= 2; /* this produces a simpler comparison below */ } i[ndim] = 0; n[ndim] = 0; for (J = 0; J < N; J++) { for (I = 0; I < n[0]; I++) { /* loop body */ i1 += s1[0]; i2 += s2[0]; } for (d = 1; i[d] > n[d]; d++) { i[d] = 0; } i[d]++; i1 += s1[d]; /* NOTE: These are different from hypre__sx1, etc. above */ i2 += s2[d]; /* The lengths of i, n, and s must be (ndim+1) */ } #endif #endif /* #ifndef hypre_BOX_HEADER */ hypre-2.33.0/src/struct_mv/box_algebra.c000066400000000000000000000514711477326011500201720ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * Member functions for hypre_Box class: * Box algebra functions. * *****************************************************************************/ #include "_hypre_struct_mv.h" /*-------------------------------------------------------------------------- * Intersect box1 and box2. * If the boxes do not intersect, the result is a box with zero volume. *--------------------------------------------------------------------------*/ HYPRE_Int hypre_IntersectBoxes( hypre_Box *box1, hypre_Box *box2, hypre_Box *ibox ) { HYPRE_Int d, ndim = hypre_BoxNDim(box1); for (d = 0; d < ndim; d++) { hypre_BoxIMinD(ibox, d) = hypre_max(hypre_BoxIMinD(box1, d), hypre_BoxIMinD(box2, d)); hypre_BoxIMaxD(ibox, d) = hypre_min(hypre_BoxIMaxD(box1, d), hypre_BoxIMaxD(box2, d)); } return hypre_error_flag; } /*-------------------------------------------------------------------------- * Compute (box1 - box2) and append result to box_array. *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SubtractBoxes( hypre_Box *box1, hypre_Box *box2, hypre_BoxArray *box_array ) { HYPRE_Int d, size, maxboxes, ndim = hypre_BoxNDim(box1); hypre_Box *box; hypre_Box *rembox; /*------------------------------------------------------ * Set the box array size to the maximum possible, * plus one, to have space for the remainder box. *------------------------------------------------------*/ maxboxes = 2 * ndim; size = hypre_BoxArraySize(box_array); hypre_BoxArraySetSize(box_array, (size + maxboxes + 1)); /*------------------------------------------------------ * Subtract the boxes by cutting box1 in x, y, then z *------------------------------------------------------*/ rembox = hypre_BoxArrayBox(box_array, (size + maxboxes)); hypre_CopyBox(box1, rembox); for (d = 0; d < ndim; d++) { /* if the boxes do not intersect, the subtraction is trivial */ if ( (hypre_BoxIMinD(box2, d) > hypre_BoxIMaxD(rembox, d)) || (hypre_BoxIMaxD(box2, d) < hypre_BoxIMinD(rembox, d)) ) { size = hypre_BoxArraySize(box_array) - maxboxes - 1; hypre_CopyBox(box1, hypre_BoxArrayBox(box_array, size)); size++; break; } /* update the box array */ else { if ( hypre_BoxIMinD(box2, d) > hypre_BoxIMinD(rembox, d) ) { box = hypre_BoxArrayBox(box_array, size); hypre_CopyBox(rembox, box); hypre_BoxIMaxD(box, d) = hypre_BoxIMinD(box2, d) - 1; hypre_BoxIMinD(rembox, d) = hypre_BoxIMinD(box2, d); if ( hypre_BoxVolume(box) > 0 ) { size++; } } if ( hypre_BoxIMaxD(box2, d) < hypre_BoxIMaxD(rembox, d) ) { box = hypre_BoxArrayBox(box_array, size); hypre_CopyBox(rembox, box); hypre_BoxIMinD(box, d) = hypre_BoxIMaxD(box2, d) + 1; hypre_BoxIMaxD(rembox, d) = hypre_BoxIMaxD(box2, d); if ( hypre_BoxVolume(box) > 0 ) { size++; } } } } hypre_BoxArraySetSize(box_array, size); return hypre_error_flag; } /*-------------------------------------------------------------------------- * Compute (box_array1 - box_array2) and replace box_array1 with result. *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SubtractBoxArrays( hypre_BoxArray *box_array1, hypre_BoxArray *box_array2, hypre_BoxArray *tmp_box_array ) { hypre_BoxArray *diff_boxes = box_array1; hypre_BoxArray *new_diff_boxes = tmp_box_array; hypre_BoxArray box_array; hypre_Box *box1; hypre_Box *box2; HYPRE_Int i, k; hypre_ForBoxI(i, box_array2) { box2 = hypre_BoxArrayBox(box_array2, i); /* compute new_diff_boxes = (diff_boxes - box2) */ hypre_BoxArraySetSize(new_diff_boxes, 0); hypre_ForBoxI(k, diff_boxes) { box1 = hypre_BoxArrayBox(diff_boxes, k); hypre_SubtractBoxes(box1, box2, new_diff_boxes); } /* swap internals of diff_boxes and new_diff_boxes */ box_array = *new_diff_boxes; *new_diff_boxes = *diff_boxes; *diff_boxes = box_array; } return hypre_error_flag; } /*-------------------------------------------------------------------------- * NOTE: Avoid using - this only works for ndim < 4 * * Compute the union of all boxes. * * To compute the union, we first construct a logically rectangular, * variably spaced, 3D grid called block. Each cell (i,j,k) of block * corresponds to a box with extents given by * * iminx = block_index[0][i] * iminy = block_index[1][j] * iminz = block_index[2][k] * imaxx = block_index[0][i+1] - 1 * imaxy = block_index[1][j+1] - 1 * imaxz = block_index[2][k+1] - 1 * * The size of block is given by * * sizex = block_sz[0] * sizey = block_sz[1] * sizez = block_sz[2] * * We initially set all cells of block that are part of the union to * * factor[2] + factor[1] + factor[0] * * where * * factor[0] = 1; * factor[1] = (block_sz[0] + 1); * factor[2] = (block_sz[1] + 1) * factor[1]; * * The cells of block are then "joined" in x first, then y, then z. * The result is that each nonzero entry of block corresponds to a * box in the union with extents defined by factoring the entry, then * indexing into the block_index array. * * Note: Special care has to be taken for boxes of size 0. * *--------------------------------------------------------------------------*/ /* ONLY3D */ HYPRE_Int hypre_UnionBoxes( hypre_BoxArray *boxes ) { hypre_Box *box; HYPRE_Int *block_index[3]; HYPRE_Int block_sz[3], block_volume; HYPRE_Int *block; HYPRE_Int index; HYPRE_Int size; HYPRE_Int factor[3]; HYPRE_Int iminmax[2], imin[3], imax[3]; HYPRE_Int ii[3], dd[3]; HYPRE_Int join; HYPRE_Int i_tmp0, i_tmp1; HYPRE_Int ioff, joff, koff; HYPRE_Int bi, d, i, j, k; HYPRE_Int index_not_there; /*------------------------------------------------------ * If the size of boxes is less than 2, return *------------------------------------------------------*/ if (hypre_BoxArraySize(boxes) < 2) { return hypre_error_flag; } /*------------------------------------------------------ * Set up the block_index array *------------------------------------------------------*/ i_tmp0 = 2 * hypre_BoxArraySize(boxes); block_index[0] = hypre_TAlloc(HYPRE_Int, 3 * i_tmp0, HYPRE_MEMORY_HOST); block_sz[0] = 0; for (d = 1; d < 3; d++) { block_index[d] = block_index[d - 1] + i_tmp0; block_sz[d] = 0; } hypre_ForBoxI(bi, boxes) { box = hypre_BoxArrayBox(boxes, bi); for (d = 0; d < 3; d++) { iminmax[0] = hypre_BoxIMinD(box, d); iminmax[1] = hypre_BoxIMaxD(box, d) + 1; for (i = 0; i < 2; i++) { /* find the new index position in the block_index array */ index_not_there = 1; for (j = 0; j < block_sz[d]; j++) { if (iminmax[i] <= block_index[d][j]) { if (iminmax[i] == block_index[d][j]) { index_not_there = 0; } break; } } /* if the index is already there, don't add it again */ if (index_not_there) { for (k = block_sz[d]; k > j; k--) { block_index[d][k] = block_index[d][k - 1]; } block_index[d][j] = iminmax[i]; block_sz[d]++; } } } } for (d = 0; d < 3; d++) { block_sz[d]--; } block_volume = block_sz[0] * block_sz[1] * block_sz[2]; /*------------------------------------------------------ * Set factor values *------------------------------------------------------*/ factor[0] = 1; factor[1] = (block_sz[0] + 1); factor[2] = (block_sz[1] + 1) * factor[1]; /*------------------------------------------------------ * Set up the block array *------------------------------------------------------*/ block = hypre_CTAlloc(HYPRE_Int, block_volume, HYPRE_MEMORY_HOST); hypre_ForBoxI(bi, boxes) { box = hypre_BoxArrayBox(boxes, bi); /* find the block_index indices corresponding to the current box */ for (d = 0; d < 3; d++) { j = 0; while (hypre_BoxIMinD(box, d) != block_index[d][j]) { j++; } imin[d] = j; while (hypre_BoxIMaxD(box, d) + 1 != block_index[d][j]) { j++; } imax[d] = j; } /* note: boxes of size zero will not be added to block */ for (k = imin[2]; k < imax[2]; k++) { for (j = imin[1]; j < imax[1]; j++) { for (i = imin[0]; i < imax[0]; i++) { index = ((k) * block_sz[1] + j) * block_sz[0] + i; block[index] = factor[2] + factor[1] + factor[0]; } } } } /*------------------------------------------------------ * Join block array in x, then y, then z * * Notes: * - ii[0], ii[1], and ii[2] correspond to indices * in x, y, and z respectively. * - dd specifies the order in which to loop over * the three dimensions. *------------------------------------------------------*/ for (d = 0; d < 3; d++) { switch (d) { case 0: /* join in x */ dd[0] = 0; dd[1] = 1; dd[2] = 2; break; case 1: /* join in y */ dd[0] = 1; dd[1] = 0; dd[2] = 2; break; case 2: /* join in z */ dd[0] = 2; dd[1] = 1; dd[2] = 0; break; } for (ii[dd[2]] = 0; ii[dd[2]] < block_sz[dd[2]]; ii[dd[2]]++) { for (ii[dd[1]] = 0; ii[dd[1]] < block_sz[dd[1]]; ii[dd[1]]++) { join = 0; for (ii[dd[0]] = 0; ii[dd[0]] < block_sz[dd[0]]; ii[dd[0]]++) { index = ((ii[2]) * block_sz[1] + ii[1]) * block_sz[0] + ii[0]; if ((join) && (block[index] == i_tmp1)) { block[index] = 0; block[i_tmp0] += factor[dd[0]]; } else { if (block[index]) { i_tmp0 = index; i_tmp1 = block[index]; join = 1; } else { join = 0; } } } } } } /*------------------------------------------------------ * Set up the boxes BoxArray *------------------------------------------------------*/ size = 0; for (index = 0; index < block_volume; index++) { if (block[index]) { size++; } } hypre_BoxArraySetSize(boxes, size); index = 0; size = 0; for (k = 0; k < block_sz[2]; k++) { for (j = 0; j < block_sz[1]; j++) { for (i = 0; i < block_sz[0]; i++) { if (block[index]) { ioff = (block[index] % factor[1]) ; joff = (block[index] % factor[2]) / factor[1]; koff = (block[index] ) / factor[2]; box = hypre_BoxArrayBox(boxes, size); hypre_BoxIMinD(box, 0) = block_index[0][i]; hypre_BoxIMinD(box, 1) = block_index[1][j]; hypre_BoxIMinD(box, 2) = block_index[2][k]; hypre_BoxIMaxD(box, 0) = block_index[0][i + ioff] - 1; hypre_BoxIMaxD(box, 1) = block_index[1][j + joff] - 1; hypre_BoxIMaxD(box, 2) = block_index[2][k + koff] - 1; size++; } index++; } } } /*--------------------------------------------------------- * Clean up and return *---------------------------------------------------------*/ hypre_TFree(block_index[0], HYPRE_MEMORY_HOST); hypre_TFree(block, HYPRE_MEMORY_HOST); return hypre_error_flag; } /*-------------------------------------------------------------------------- * NOTE: Avoid using - this only works for ndim < 4 * * Compute the union of all boxes such that the minimum number of boxes is * generated. Accomplished by making six calls to hypre_UnionBoxes and then * taking the union that has the least no. of boxes. The six calls union in the * order xzy, yzx, yxz, zxy, zyx, xyz *--------------------------------------------------------------------------*/ /* ONLY3D */ HYPRE_Int hypre_MinUnionBoxes( hypre_BoxArray *boxes ) { hypre_BoxArrayArray *rotated_array; hypre_BoxArray *rotated_boxes; hypre_Box *box, *rotated_box; hypre_Index lower, upper; HYPRE_Int i, j, size, min_size, array; size = hypre_BoxArraySize(boxes); rotated_box = hypre_CTAlloc(hypre_Box, 1, HYPRE_MEMORY_HOST); rotated_array = hypre_BoxArrayArrayCreate(5, hypre_BoxArrayNDim(boxes)); for (i = 0; i < 5; i++) { rotated_boxes = hypre_BoxArrayArrayBoxArray(rotated_array, i); switch (i) { case 0: for (j = 0; j < size; j++) { box = hypre_BoxArrayBox(boxes, j); hypre_SetIndex3(lower, hypre_BoxIMin(box)[0], hypre_BoxIMin(box)[2], hypre_BoxIMin(box)[1]); hypre_SetIndex3(upper, hypre_BoxIMax(box)[0], hypre_BoxIMax(box)[2], hypre_BoxIMax(box)[1]); hypre_BoxSetExtents(rotated_box, lower, upper); hypre_AppendBox(rotated_box, rotated_boxes); } hypre_UnionBoxes(rotated_boxes); break; case 1: for (j = 0; j < size; j++) { box = hypre_BoxArrayBox(boxes, j); hypre_SetIndex3(lower, hypre_BoxIMin(box)[1], hypre_BoxIMin(box)[2], hypre_BoxIMin(box)[0]); hypre_SetIndex3(upper, hypre_BoxIMax(box)[1], hypre_BoxIMax(box)[2], hypre_BoxIMax(box)[0]); hypre_BoxSetExtents(rotated_box, lower, upper); hypre_AppendBox(rotated_box, rotated_boxes); } hypre_UnionBoxes(rotated_boxes); break; case 2: for (j = 0; j < size; j++) { box = hypre_BoxArrayBox(boxes, j); hypre_SetIndex3(lower, hypre_BoxIMin(box)[1], hypre_BoxIMin(box)[0], hypre_BoxIMin(box)[2]); hypre_SetIndex3(upper, hypre_BoxIMax(box)[1], hypre_BoxIMax(box)[0], hypre_BoxIMax(box)[2]); hypre_BoxSetExtents(rotated_box, lower, upper); hypre_AppendBox(rotated_box, rotated_boxes); } hypre_UnionBoxes(rotated_boxes); break; case 3: for (j = 0; j < size; j++) { box = hypre_BoxArrayBox(boxes, j); hypre_SetIndex3(lower, hypre_BoxIMin(box)[2], hypre_BoxIMin(box)[0], hypre_BoxIMin(box)[1]); hypre_SetIndex3(upper, hypre_BoxIMax(box)[2], hypre_BoxIMax(box)[0], hypre_BoxIMax(box)[1]); hypre_BoxSetExtents(rotated_box, lower, upper); hypre_AppendBox(rotated_box, rotated_boxes); } hypre_UnionBoxes(rotated_boxes); break; case 4: for (j = 0; j < size; j++) { box = hypre_BoxArrayBox(boxes, j); hypre_SetIndex3(lower, hypre_BoxIMin(box)[2], hypre_BoxIMin(box)[1], hypre_BoxIMin(box)[0]); hypre_SetIndex3(upper, hypre_BoxIMax(box)[2], hypre_BoxIMax(box)[1], hypre_BoxIMax(box)[0]); hypre_BoxSetExtents(rotated_box, lower, upper); hypre_AppendBox(rotated_box, rotated_boxes); } hypre_UnionBoxes(rotated_boxes); break; } /*switch(i) */ } /* for (i= 0; i< 5; i++) */ hypre_TFree(rotated_box, HYPRE_MEMORY_HOST); hypre_UnionBoxes(boxes); array = 5; min_size = hypre_BoxArraySize(boxes); for (i = 0; i < 5; i++) { rotated_boxes = hypre_BoxArrayArrayBoxArray(rotated_array, i); if (hypre_BoxArraySize(rotated_boxes) < min_size) { min_size = hypre_BoxArraySize(rotated_boxes); array = i; } } /* copy the box_array with the minimum number of boxes to boxes */ if (array != 5) { rotated_boxes = hypre_BoxArrayArrayBoxArray(rotated_array, array); hypre_BoxArraySize(boxes) = min_size; switch (array) { case 0: for (j = 0; j < min_size; j++) { rotated_box = hypre_BoxArrayBox(rotated_boxes, j); hypre_SetIndex3(lower, hypre_BoxIMin(rotated_box)[0], hypre_BoxIMin(rotated_box)[2], hypre_BoxIMin(rotated_box)[1]); hypre_SetIndex3(upper, hypre_BoxIMax(rotated_box)[0], hypre_BoxIMax(rotated_box)[2], hypre_BoxIMax(rotated_box)[1]); hypre_BoxSetExtents( hypre_BoxArrayBox(boxes, j), lower, upper); } break; case 1: for (j = 0; j < min_size; j++) { rotated_box = hypre_BoxArrayBox(rotated_boxes, j); hypre_SetIndex3(lower, hypre_BoxIMin(rotated_box)[2], hypre_BoxIMin(rotated_box)[0], hypre_BoxIMin(rotated_box)[1]); hypre_SetIndex3(upper, hypre_BoxIMax(rotated_box)[2], hypre_BoxIMax(rotated_box)[0], hypre_BoxIMax(rotated_box)[1]); hypre_BoxSetExtents( hypre_BoxArrayBox(boxes, j), lower, upper); } break; case 2: for (j = 0; j < min_size; j++) { rotated_box = hypre_BoxArrayBox(rotated_boxes, j); hypre_SetIndex3(lower, hypre_BoxIMin(rotated_box)[1], hypre_BoxIMin(rotated_box)[0], hypre_BoxIMin(rotated_box)[2]); hypre_SetIndex3(upper, hypre_BoxIMax(rotated_box)[1], hypre_BoxIMax(rotated_box)[0], hypre_BoxIMax(rotated_box)[2]); hypre_BoxSetExtents( hypre_BoxArrayBox(boxes, j), lower, upper); } break; case 3: for (j = 0; j < min_size; j++) { rotated_box = hypre_BoxArrayBox(rotated_boxes, j); hypre_SetIndex3(lower, hypre_BoxIMin(rotated_box)[1], hypre_BoxIMin(rotated_box)[2], hypre_BoxIMin(rotated_box)[0]); hypre_SetIndex3(upper, hypre_BoxIMax(rotated_box)[1], hypre_BoxIMax(rotated_box)[2], hypre_BoxIMax(rotated_box)[0]); hypre_BoxSetExtents( hypre_BoxArrayBox(boxes, j), lower, upper); } break; case 4: for (j = 0; j < min_size; j++) { rotated_box = hypre_BoxArrayBox(rotated_boxes, j); hypre_SetIndex3(lower, hypre_BoxIMin(rotated_box)[2], hypre_BoxIMin(rotated_box)[1], hypre_BoxIMin(rotated_box)[0]); hypre_SetIndex3(upper, hypre_BoxIMax(rotated_box)[2], hypre_BoxIMax(rotated_box)[1], hypre_BoxIMax(rotated_box)[0]); hypre_BoxSetExtents( hypre_BoxArrayBox(boxes, j), lower, upper); } break; } /* switch(array) */ } /* if (array != 5) */ hypre_BoxArrayArrayDestroy(rotated_array); return hypre_error_flag; } hypre-2.33.0/src/struct_mv/box_boundary.c000066400000000000000000000165261477326011500204220ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * NOTE: The following routines are currently only used as follows in hypre, and * also appear in '_hypre_struct_mv.h': * * hypre_BoxBoundaryG * struct_mv/box_boundary.c * struct_mv/struct_vector.c * sstruct_ls/maxwell_grad.c * sstruct_ls/maxwell_TV_setup.c * * hypre_BoxBoundaryDG * struct_mv/box_boundary.c * sstruct_ls/maxwell_grad.c * sstruct_ls/maxwell_PNedelec_bdy.c * *****************************************************************************/ #include "_hypre_struct_mv.h" /*-------------------------------------------------------------------------- * Intersect a surface of 'box' with the physical boundary. The surface is * given by (d,dir), where 'dir' is a direction (+-1) in dimension 'd'. * * The result will be returned in the box array 'boundary'. Any boxes already * in 'boundary' will be overwritten. *--------------------------------------------------------------------------*/ HYPRE_Int hypre_BoxBoundaryIntersect( hypre_Box *box, hypre_StructGrid *grid, HYPRE_Int d, HYPRE_Int dir, hypre_BoxArray *boundary ) { HYPRE_Int ndim = hypre_BoxNDim(box); hypre_BoxManager *boxman; hypre_BoxManEntry **entries; hypre_BoxArray *int_boxes, *tmp_boxes; hypre_Box *bbox, *ibox; HYPRE_Int nentries, i; /* set bbox to the box surface of interest */ hypre_BoxArraySetSize(boundary, 1); bbox = hypre_BoxArrayBox(boundary, 0); hypre_CopyBox(box, bbox); if (dir > 0) { hypre_BoxIMinD(bbox, d) = hypre_BoxIMaxD(bbox, d); } else if (dir < 0) { hypre_BoxIMaxD(bbox, d) = hypre_BoxIMinD(bbox, d); } /* temporarily shift bbox in direction dir and intersect with the grid */ hypre_BoxIMinD(bbox, d) += dir; hypre_BoxIMaxD(bbox, d) += dir; boxman = hypre_StructGridBoxMan(grid); hypre_BoxManIntersect(boxman, hypre_BoxIMin(bbox), hypre_BoxIMax(bbox), &entries, &nentries); hypre_BoxIMinD(bbox, d) -= dir; hypre_BoxIMaxD(bbox, d) -= dir; /* shift intersected boxes in direction -dir and subtract from bbox */ int_boxes = hypre_BoxArrayCreate(nentries, ndim); tmp_boxes = hypre_BoxArrayCreate(0, ndim); for (i = 0; i < nentries; i++) { ibox = hypre_BoxArrayBox(int_boxes, i); hypre_BoxManEntryGetExtents( entries[i], hypre_BoxIMin(ibox), hypre_BoxIMax(ibox)); hypre_BoxIMinD(ibox, d) -= dir; hypre_BoxIMaxD(ibox, d) -= dir; } hypre_SubtractBoxArrays(boundary, int_boxes, tmp_boxes); hypre_BoxArrayDestroy(int_boxes); hypre_BoxArrayDestroy(tmp_boxes); hypre_TFree(entries, HYPRE_MEMORY_HOST); return hypre_error_flag; } /*-------------------------------------------------------------------------- * Find the parts of the given box which lie on a (physical) boundary of grid g. * Stick them into the user-provided box array boundary. Any input contents of * this box array will get overwritten. *--------------------------------------------------------------------------*/ HYPRE_Int hypre_BoxBoundaryG( hypre_Box *box, hypre_StructGrid *g, hypre_BoxArray *boundary ) { HYPRE_Int ndim = hypre_BoxNDim(box); hypre_BoxArray *boundary_d; HYPRE_Int d; boundary_d = hypre_BoxArrayCreate(0, ndim); for (d = 0; d < ndim; d++) { hypre_BoxBoundaryIntersect(box, g, d, -1, boundary_d); hypre_AppendBoxArray(boundary_d, boundary); hypre_BoxBoundaryIntersect(box, g, d, 1, boundary_d); hypre_AppendBoxArray(boundary_d, boundary); } hypre_BoxArrayDestroy(boundary_d); return hypre_error_flag; } /*-------------------------------------------------------------------------- * Find the parts of the given box which lie on a (physical) boundary of grid g, * only in the (unsigned) direction of d (d=0,1,2). Stick them into the * user-provided box arrays boundarym (minus direction) and boundaryp (plus * direction). Any input contents of these box arrays will get overwritten. *--------------------------------------------------------------------------*/ HYPRE_Int hypre_BoxBoundaryDG( hypre_Box *box, hypre_StructGrid *g, hypre_BoxArray *boundarym, hypre_BoxArray *boundaryp, HYPRE_Int d ) { hypre_BoxBoundaryIntersect(box, g, d, -1, boundarym); hypre_BoxBoundaryIntersect(box, g, d, 1, boundaryp); return hypre_error_flag; } /*-------------------------------------------------------------------------- * Intersect a surface of 'box' with the physical boundary. A stencil element * indicates in which direction the surface should be determined. * * The result will be returned in the box array 'boundary'. Any boxes already * in 'boundary' will be overwritten. *--------------------------------------------------------------------------*/ HYPRE_Int hypre_GeneralBoxBoundaryIntersect( hypre_Box *box, hypre_StructGrid *grid, hypre_Index stencil_element, hypre_BoxArray *boundary ) { hypre_BoxManager *boxman; hypre_BoxManEntry **entries; hypre_BoxArray *int_boxes, *tmp_boxes; hypre_Box *bbox, *ibox; HYPRE_Int nentries, i, j; HYPRE_Int *dd; HYPRE_Int ndim; ndim = hypre_StructGridNDim(grid); dd = hypre_CTAlloc(HYPRE_Int, ndim, HYPRE_MEMORY_HOST); for (i = 0; i < ndim; i++) { dd[i] = hypre_IndexD(stencil_element, i); } /* set bbox to the box surface of interest */ hypre_BoxArraySetSize(boundary, 1); bbox = hypre_BoxArrayBox(boundary, 0); hypre_CopyBox(box, bbox); /* temporarily shift bbox in direction dir and intersect with the grid */ for (i = 0; i < ndim; i++) { hypre_BoxIMinD(bbox, i) += dd[i]; hypre_BoxIMaxD(bbox, i) += dd[i]; } boxman = hypre_StructGridBoxMan(grid); hypre_BoxManIntersect(boxman, hypre_BoxIMin(bbox), hypre_BoxIMax(bbox), &entries, &nentries); for (i = 0; i < ndim; i++) { hypre_BoxIMinD(bbox, i) -= dd[i]; hypre_BoxIMaxD(bbox, i) -= dd[i]; } /* shift intersected boxes in direction -dir and subtract from bbox */ int_boxes = hypre_BoxArrayCreate(nentries, ndim); tmp_boxes = hypre_BoxArrayCreate(0, ndim); for (i = 0; i < nentries; i++) { ibox = hypre_BoxArrayBox(int_boxes, i); hypre_BoxManEntryGetExtents( entries[i], hypre_BoxIMin(ibox), hypre_BoxIMax(ibox)); for (j = 0; j < ndim; j++) { hypre_BoxIMinD(ibox, j) -= dd[j]; hypre_BoxIMaxD(ibox, j) -= dd[j]; } } hypre_SubtractBoxArrays(boundary, int_boxes, tmp_boxes); hypre_BoxArrayDestroy(int_boxes); hypre_BoxArrayDestroy(tmp_boxes); hypre_TFree(entries, HYPRE_MEMORY_HOST); hypre_TFree(dd, HYPRE_MEMORY_HOST); return hypre_error_flag; } hypre-2.33.0/src/struct_mv/box_manager.c000066400000000000000000002746261477326011500202200ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /******************************************************************************* BoxManager: AHB 10/06, updated 10/09 (changes to info object) purpose:: organize arbitrary information in a spatial way misc. notes/considerations/open questions: (1) In the struct code, we want to use Box Manager instead of current box neighbor stuff (see Struct function hypre_CreateCommInfoFromStencil. For example, to get neighbors of box b, we can call Intersect with a larger box than b). (2) will associate a Box Manager with the struct grid (implement under the struct grid) (3) will interface with the Box Manager in the struct coarsen routine the coarsen routine: (a) get all the box manager entries from the current level, coarsen them, and create a new box manager for the coarse grid, adding the boxes via AddEntry (b) check the max_distance value and see if we have all the neighbor info we need in the current box manager. (c) if (b) is no, then call GatherEntries as needed on the coarse box manager (d) call assemble for the new coarse box manager (note: if gather entries has not been called, then no communication is required (4) We will associate an assumed partition with the box manager (this will be created in the box manager assemble routine) (5) We use the box manager with sstruct "on the side" as the boxmap is now, (at issue is modifying the "info" associated with an entry after the box manager has already been assembled through the underlying struct grid) (6) In SStruct we will have a separate box manager for the neighbor box information ********************************************************************************/ #include "_hypre_struct_mv.h" /****************************************************************************** * Some specialized sorting routines used only in this file *****************************************************************************/ /* sort on HYPRE_Int i, move entry pointers ent */ void hypre_entryswap2( HYPRE_Int *v, hypre_BoxManEntry ** ent, HYPRE_Int i, HYPRE_Int j ) { HYPRE_Int temp; hypre_BoxManEntry *temp_e; temp = v[i]; v[i] = v[j]; v[j] = temp; temp_e = ent[i]; ent[i] = ent[j]; ent[j] = temp_e; } void hypre_entryqsort2( HYPRE_Int *v, hypre_BoxManEntry ** ent, HYPRE_Int left, HYPRE_Int right ) { HYPRE_Int i, last; if (left >= right) { return; } hypre_entryswap2( v, ent, left, (left + right) / 2); last = left; for (i = left + 1; i <= right; i++) { if (v[i] < v[left]) { hypre_entryswap2(v, ent, ++last, i); } } hypre_entryswap2(v, ent, left, last); hypre_entryqsort2(v, ent, left, last - 1); hypre_entryqsort2(v, ent, last + 1, right); } /*-------------------------------------------------------------------------- * This is not used *--------------------------------------------------------------------------*/ #if 0 HYPRE_Int hypre_BoxManEntrySetInfo ( hypre_BoxManEntry *entry, void *info ) { /* TO DO*/ return hypre_error_flag; } #endif /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_BoxManEntryGetInfo (hypre_BoxManEntry *entry, void **info_ptr ) { HYPRE_Int position = hypre_BoxManEntryPosition(entry); hypre_BoxManager *boxman; boxman = (hypre_BoxManager *) hypre_BoxManEntryBoxMan(entry); *info_ptr = hypre_BoxManInfoObject(boxman, position); return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_BoxManEntryGetExtents ( hypre_BoxManEntry *entry, hypre_Index imin, hypre_Index imax ) { hypre_IndexRef entry_imin = hypre_BoxManEntryIMin(entry); hypre_IndexRef entry_imax = hypre_BoxManEntryIMax(entry); HYPRE_Int ndim = hypre_BoxManEntryNDim(entry); HYPRE_Int d; for (d = 0; d < ndim; d++) { hypre_IndexD(imin, d) = hypre_IndexD(entry_imin, d); hypre_IndexD(imax, d) = hypre_IndexD(entry_imax, d); } return hypre_error_flag; } /*-------------------------------------------------------------------------- * Warning: This does not copy the position or info! *--------------------------------------------------------------------------*/ HYPRE_Int hypre_BoxManEntryCopy( hypre_BoxManEntry *fromentry, hypre_BoxManEntry *toentry ) { HYPRE_Int ndim = hypre_BoxManEntryNDim(fromentry); HYPRE_Int d; hypre_Index imin; hypre_Index imax; hypre_IndexRef toentry_imin; hypre_IndexRef toentry_imax; /* copy extents */ hypre_BoxManEntryGetExtents(fromentry, imin, imax); toentry_imin = hypre_BoxManEntryIMin(toentry); toentry_imax = hypre_BoxManEntryIMax(toentry); for (d = 0; d < ndim; d++) { hypre_IndexD(toentry_imin, d) = hypre_IndexD(imin, d); hypre_IndexD(toentry_imax, d) = hypre_IndexD(imax, d); } hypre_BoxManEntryNDim(toentry) = ndim; /* copy proc and id */ hypre_BoxManEntryProc(toentry) = hypre_BoxManEntryProc(fromentry); hypre_BoxManEntryId(toentry) = hypre_BoxManEntryId(fromentry); /*copy ghost */ for (d = 0; d < 2 * ndim; d++) { hypre_BoxManEntryNumGhost(toentry)[d] = hypre_BoxManEntryNumGhost(fromentry)[d]; } /* copy box manager pointer */ hypre_BoxManEntryBoxMan(toentry) = hypre_BoxManEntryBoxMan(fromentry) ; /* position - we don't copy this! */ /* copy list pointer */ hypre_BoxManEntryNext(toentry) = hypre_BoxManEntryNext(fromentry); return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_BoxManSetAllGlobalKnown ( hypre_BoxManager *manager, HYPRE_Int known ) { hypre_BoxManAllGlobalKnown(manager) = known; return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_BoxManGetAllGlobalKnown ( hypre_BoxManager *manager, HYPRE_Int *known ) { *known = hypre_BoxManAllGlobalKnown(manager); return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_BoxManSetIsEntriesSort ( hypre_BoxManager *manager, HYPRE_Int is_sort ) { hypre_BoxManIsEntriesSort(manager) = is_sort; return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_BoxManGetIsEntriesSort ( hypre_BoxManager *manager, HYPRE_Int *is_sort ) { *is_sort = hypre_BoxManIsEntriesSort(manager); return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_BoxManGetGlobalIsGatherCalled( hypre_BoxManager *manager, MPI_Comm comm, HYPRE_Int *is_gather ) { HYPRE_Int loc_is_gather; HYPRE_Int nprocs; hypre_MPI_Comm_size(comm, &nprocs); loc_is_gather = hypre_BoxManIsGatherCalled(manager); if (nprocs > 1) { hypre_MPI_Allreduce(&loc_is_gather, is_gather, 1, HYPRE_MPI_INT, hypre_MPI_LOR, comm); } else /* just one proc */ { *is_gather = loc_is_gather; } return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_BoxManGetAssumedPartition( hypre_BoxManager *manager, hypre_StructAssumedPart **assumed_partition ) { *assumed_partition = hypre_BoxManAssumedPartition(manager); return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_BoxManSetAssumedPartition( hypre_BoxManager *manager, hypre_StructAssumedPart *assumed_partition ) { hypre_BoxManAssumedPartition(manager) = assumed_partition; return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_BoxManSetBoundingBox ( hypre_BoxManager *manager, hypre_Box *bounding_box ) { hypre_Box* bbox = hypre_BoxManBoundingBox(manager); hypre_BoxSetExtents(bbox, hypre_BoxIMin(bounding_box), hypre_BoxIMax(bounding_box)); return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_BoxManSetNumGhost( hypre_BoxManager *manager, HYPRE_Int *num_ghost ) { HYPRE_Int i, ndim = hypre_BoxManNDim(manager); for (i = 0; i < 2 * ndim; i++) { hypre_BoxManNumGhost(manager)[i] = num_ghost[i]; } return hypre_error_flag; } /*-------------------------------------------------------------------------- * Delete multiple entries (and their corresponding info object) from the * manager. The indices correspond to the ordering of the entries. Assumes * indices given in ascending order - this is meant for internal use inside the * Assemble routime. *--------------------------------------------------------------------------*/ HYPRE_Int hypre_BoxManDeleteMultipleEntriesAndInfo( hypre_BoxManager *manager, HYPRE_Int* indices, HYPRE_Int num ) { HYPRE_Int i, j, start; HYPRE_Int array_size = hypre_BoxManNEntries(manager); HYPRE_Int info_size = hypre_BoxManEntryInfoSize(manager); void *to_ptr; void *from_ptr; hypre_BoxManEntry *entries = hypre_BoxManEntries(manager); if (num > 0) { start = indices[0]; j = 0; for (i = start; (i + j) < array_size; i++) { if (j < num) { while ((i + j) == indices[j]) /* see if deleting consecutive items */ { j++; /*increase the shift*/ if (j == num) { break; } } } if ( (i + j) < array_size) /* if deleting the last item then no moving */ { /*copy the entry */ hypre_BoxManEntryCopy(&entries[i + j], &entries[i]); /* change the position */ hypre_BoxManEntryPosition(&entries[i]) = i; /* copy the info object */ to_ptr = hypre_BoxManInfoObject(manager, i); from_ptr = hypre_BoxManInfoObject(manager, i + j); hypre_TMemcpy(to_ptr, from_ptr, char, info_size, HYPRE_MEMORY_HOST, HYPRE_MEMORY_HOST); } } hypre_BoxManNEntries(manager) = array_size - num; } return hypre_error_flag; } /*-------------------------------------------------------------------------- * Allocate and initialize the box manager structure. * * Notes: * * (1) max_nentries indicates how much storage you think you will need for * adding entries with BoxManAddEntry * * (2) info_size indicates the size (in bytes) of the info object that * will be attached to each entry in this box manager. * * (3) we will collect the bounding box - this is used by the AP * * (4) comm is needed for later calls to addentry - also used in the assemble * *--------------------------------------------------------------------------*/ HYPRE_Int hypre_BoxManCreate( HYPRE_Int max_nentries, HYPRE_Int info_size, HYPRE_Int ndim, hypre_Box *bounding_box, MPI_Comm comm, hypre_BoxManager **manager_ptr ) { hypre_BoxManager *manager; hypre_Box *bbox; HYPRE_Int i, d; /* allocate object */ manager = hypre_CTAlloc(hypre_BoxManager, 1, HYPRE_MEMORY_HOST); /* initialize */ hypre_BoxManComm(manager) = comm; hypre_BoxManMaxNEntries(manager) = max_nentries; hypre_BoxManEntryInfoSize(manager) = info_size; hypre_BoxManNDim(manager) = ndim; hypre_BoxManIsAssembled(manager) = 0; for (d = 0; d < ndim; d++) { hypre_BoxManIndexesD(manager, d) = NULL; } hypre_BoxManNEntries(manager) = 0; hypre_BoxManEntries(manager) = hypre_CTAlloc(hypre_BoxManEntry, max_nentries, HYPRE_MEMORY_HOST); hypre_BoxManInfoObjects(manager) = NULL; hypre_BoxManInfoObjects(manager) = hypre_TAlloc(char, max_nentries * info_size, HYPRE_MEMORY_HOST); hypre_BoxManIndexTable(manager) = NULL; hypre_BoxManNumProcsSort(manager) = 0; hypre_BoxManIdsSort(manager) = hypre_CTAlloc(HYPRE_Int, max_nentries, HYPRE_MEMORY_HOST); hypre_BoxManProcsSort(manager) = hypre_CTAlloc(HYPRE_Int, max_nentries, HYPRE_MEMORY_HOST); hypre_BoxManProcsSortOffsets(manager) = NULL; hypre_BoxManFirstLocal(manager) = 0; hypre_BoxManLocalProcOffset(manager) = 0; hypre_BoxManIsGatherCalled(manager) = 0; hypre_BoxManGatherRegions(manager) = hypre_BoxArrayCreate(0, ndim); hypre_BoxManAllGlobalKnown(manager) = 0; hypre_BoxManIsEntriesSort(manager) = 0; hypre_BoxManNumMyEntries(manager) = 0; hypre_BoxManMyIds(manager) = NULL; hypre_BoxManMyEntries(manager) = NULL; hypre_BoxManAssumedPartition(manager) = NULL; hypre_BoxManMyIds(manager) = hypre_CTAlloc(HYPRE_Int, max_nentries, HYPRE_MEMORY_HOST); hypre_BoxManMyEntries(manager) = hypre_CTAlloc(hypre_BoxManEntry *, max_nentries, HYPRE_MEMORY_HOST); bbox = hypre_BoxCreate(ndim); hypre_BoxManBoundingBox(manager) = bbox; hypre_BoxSetExtents(bbox, hypre_BoxIMin(bounding_box), hypre_BoxIMax(bounding_box)); hypre_BoxManNextId(manager) = 0; /* ghost points: we choose a default that will give zero everywhere..*/ for (i = 0; i < 2 * HYPRE_MAXDIM; i++) { hypre_BoxManNumGhost(manager)[i] = 0; } /* return */ *manager_ptr = manager; return hypre_error_flag; } /*-------------------------------------------------------------------------- * Increase storage for entries (for future calls to BoxManAddEntry). * * Notes: * * In addition, we will dynamically allocate more memory if needed when a call * to BoxManAddEntry is made and there is not enough storage available. *--------------------------------------------------------------------------*/ HYPRE_Int hypre_BoxManIncSize ( hypre_BoxManager *manager, HYPRE_Int inc_size ) { HYPRE_Int max_nentries = hypre_BoxManMaxNEntries(manager); HYPRE_Int *ids = hypre_BoxManIdsSort(manager); HYPRE_Int *procs = hypre_BoxManProcsSort(manager); HYPRE_Int info_size = hypre_BoxManEntryInfoSize(manager); void *info = hypre_BoxManInfoObjects(manager); hypre_BoxManEntry *entries = hypre_BoxManEntries(manager); /* increase size */ max_nentries += inc_size; entries = hypre_TReAlloc(entries, hypre_BoxManEntry, max_nentries, HYPRE_MEMORY_HOST); ids = hypre_TReAlloc(ids, HYPRE_Int, max_nentries, HYPRE_MEMORY_HOST); procs = hypre_TReAlloc(procs, HYPRE_Int, max_nentries, HYPRE_MEMORY_HOST); info = (void *) hypre_TReAlloc((char *)info, char, max_nentries * info_size, HYPRE_MEMORY_HOST); /* update manager */ hypre_BoxManMaxNEntries(manager) = max_nentries; hypre_BoxManEntries(manager) = entries; hypre_BoxManIdsSort(manager) = ids; hypre_BoxManProcsSort(manager) = procs; hypre_BoxManInfoObjects(manager) = info; /* my ids temporary structure (destroyed in assemble) */ { HYPRE_Int *my_ids = hypre_BoxManMyIds(manager); hypre_BoxManEntry **my_entries = hypre_BoxManMyEntries(manager); my_ids = hypre_TReAlloc(my_ids, HYPRE_Int, max_nentries, HYPRE_MEMORY_HOST); my_entries = hypre_TReAlloc(my_entries, hypre_BoxManEntry *, max_nentries, HYPRE_MEMORY_HOST); hypre_BoxManMyIds(manager) = my_ids; hypre_BoxManMyEntries(manager) = my_entries; } return hypre_error_flag; } /*-------------------------------------------------------------------------- * De-allocate the box manager structure. *--------------------------------------------------------------------------*/ HYPRE_Int hypre_BoxManDestroy( hypre_BoxManager *manager ) { HYPRE_Int ndim = hypre_BoxManNDim(manager); HYPRE_Int d; if (manager) { for (d = 0; d < ndim; d++) { hypre_TFree(hypre_BoxManIndexesD(manager, d), HYPRE_MEMORY_HOST); } hypre_TFree(hypre_BoxManEntries(manager), HYPRE_MEMORY_HOST); hypre_TFree(hypre_BoxManInfoObjects(manager), HYPRE_MEMORY_HOST); hypre_TFree(hypre_BoxManIndexTable(manager), HYPRE_MEMORY_HOST); hypre_TFree(hypre_BoxManIdsSort(manager), HYPRE_MEMORY_HOST); hypre_TFree(hypre_BoxManProcsSort(manager), HYPRE_MEMORY_HOST); hypre_TFree(hypre_BoxManProcsSortOffsets(manager), HYPRE_MEMORY_HOST); hypre_BoxArrayDestroy(hypre_BoxManGatherRegions(manager)); hypre_TFree(hypre_BoxManMyIds(manager), HYPRE_MEMORY_HOST); hypre_TFree(hypre_BoxManMyEntries(manager), HYPRE_MEMORY_HOST); hypre_StructAssumedPartitionDestroy(hypre_BoxManAssumedPartition(manager)); hypre_BoxDestroy(hypre_BoxManBoundingBox(manager)); hypre_TFree(manager, HYPRE_MEMORY_HOST); } return hypre_error_flag; } /*-------------------------------------------------------------------------- * Add a box (entry) to the box manager. Each entry is given a * unique id (proc_id, box_id). Need to assemble after adding entries. * * Notes: * * (1) The id assigned may be any integer - though since (proc_id, * box_id) is unique, duplicates will be eliminated in the assemble. * * (2) If there is not enough storage available for this entry, then * increase the amount automatically * * (3) Only add entries whose boxes have non-zero volume. * * (4) The info object will be copied (according to the info size given in * the create) to storage within the box manager. * * (5) If the id passed in is negative (user doesn't care what it is) , * then use the next_id stored in the box manager to assign the id * *--------------------------------------------------------------------------*/ HYPRE_Int hypre_BoxManAddEntry( hypre_BoxManager *manager, hypre_Index imin, hypre_Index imax, HYPRE_Int proc_id, HYPRE_Int box_id, void *info ) { HYPRE_Int myid; HYPRE_Int nentries = hypre_BoxManNEntries(manager); HYPRE_Int info_size = hypre_BoxManEntryInfoSize(manager); HYPRE_Int ndim = hypre_BoxManNDim(manager); hypre_BoxManEntry *entries = hypre_BoxManEntries(manager); hypre_BoxManEntry *entry; hypre_IndexRef entry_imin; hypre_IndexRef entry_imax; HYPRE_Int d; HYPRE_Int *num_ghost = hypre_BoxManNumGhost(manager); HYPRE_Int volume; HYPRE_Int id; hypre_Box *box; /* can only use before assembling */ if (hypre_BoxManIsAssembled(manager)) { hypre_error_in_arg(1); return hypre_error_flag; } /* check to see if we have a non-zero box volume (only add if non-zero) */ box = hypre_BoxCreate(hypre_BoxManNDim(manager)); hypre_BoxSetExtents( box, imin, imax ); volume = hypre_BoxVolume(box); hypre_BoxDestroy(box); if (volume) { hypre_MPI_Comm_rank(hypre_BoxManComm(manager), &myid ); /* check to make sure that there is enough storage available for this new entry - if not add space for 10 more */ if (nentries + 1 > hypre_BoxManMaxNEntries(manager)) { hypre_BoxManIncSize(manager, 10); entries = hypre_BoxManEntries(manager); } /* we add this to the end entry list - get pointer to location*/ entry = &entries[nentries]; entry_imin = hypre_BoxManEntryIMin(entry); entry_imax = hypre_BoxManEntryIMax(entry); /* copy information into entry */ for (d = 0; d < ndim; d++) { hypre_IndexD(entry_imin, d) = hypre_IndexD(imin, d); hypre_IndexD(entry_imax, d) = hypre_IndexD(imax, d); } hypre_BoxManEntryNDim(entry) = ndim; /* set the processor */ hypre_BoxManEntryProc(entry) = proc_id; /* set the id */ if (box_id >= 0) { id = box_id; } else /* negative means use id from box manager */ { id = hypre_BoxManNextId(manager); /* increment fir next time */ hypre_BoxManNextId(manager) = id + 1; } hypre_BoxManEntryId(entry) = id; /* this is the current position in the entries array */ hypre_BoxManEntryPosition(entry) = nentries; /*this associates it with the box manager */ hypre_BoxManEntryBoxMan(entry) = (void *) manager; /* copy the info object */ if (info_size > 0) { void *index_ptr; /*point in the info array */ index_ptr = hypre_BoxManInfoObject(manager, nentries); hypre_TMemcpy(index_ptr, info, char, info_size, HYPRE_MEMORY_HOST, HYPRE_MEMORY_HOST); } /* inherit and inject the numghost from manager into the entry (as * in boxmap) */ for (d = 0; d < 2 * ndim; d++) { hypre_BoxManEntryNumGhost(entry)[d] = num_ghost[d]; } hypre_BoxManEntryNext(entry) = NULL; /* add proc and id to procs_sort and ids_sort array */ hypre_BoxManProcsSort(manager)[nentries] = proc_id; hypre_BoxManIdsSort(manager)[nentries] = id; /* here we need to keep track of my entries separately just to improve speed at the beginning of the assemble - then this gets deleted when the entries are sorted. */ if (proc_id == myid) { HYPRE_Int *my_ids = hypre_BoxManMyIds(manager); hypre_BoxManEntry **my_entries = hypre_BoxManMyEntries(manager); HYPRE_Int num_my_entries = hypre_BoxManNumMyEntries(manager); my_ids[num_my_entries] = id; my_entries[num_my_entries] = &entries[nentries]; num_my_entries++; hypre_BoxManNumMyEntries(manager) = num_my_entries; } /* increment number of entries */ hypre_BoxManNEntries(manager) = nentries + 1; } /* end of vol > 0 */ return hypre_error_flag; } /*-------------------------------------------------------------------------- * Given an id: (proc_id, box_id), return a pointer to the box entry. * * Notes: * * (1) Use of this is generally to get back something that has been * added by the above function. If no entry is found, an error is returned. * * (2) This functionality will replace that previously provided by * hypre_BoxManFindBoxProcEntry. * * (3) Need to store entry information such that this information is * easily found. (During the assemble, we will sort on proc_id, then * box_id, and provide a pointer to the entries. Then we can do a * search into the proc_id, and then into the box_id.) *--------------------------------------------------------------------------*/ HYPRE_Int hypre_BoxManGetEntry( hypre_BoxManager *manager, HYPRE_Int proc, HYPRE_Int id, hypre_BoxManEntry **entry_ptr ) { /* find proc_id in procs array. then find id in ids array, then grab the corresponding entry */ hypre_BoxManEntry *entry; HYPRE_Int myid; HYPRE_Int i, offset; HYPRE_Int start, finish; HYPRE_Int location; HYPRE_Int first_local = hypre_BoxManFirstLocal(manager); HYPRE_Int *procs_sort = hypre_BoxManProcsSort(manager); HYPRE_Int *ids_sort = hypre_BoxManIdsSort(manager); HYPRE_Int nentries = hypre_BoxManNEntries(manager); HYPRE_Int num_proc = hypre_BoxManNumProcsSort(manager); HYPRE_Int *proc_offsets = hypre_BoxManProcsSortOffsets(manager); /* can only use after assembling */ if (!hypre_BoxManIsAssembled(manager)) { hypre_error_in_arg(1); return hypre_error_flag; } hypre_MPI_Comm_rank(hypre_BoxManComm(manager), &myid ); if (nentries) { /* check to see if it is the local id first - this will be the case most * of the time (currently it is only used in this manner)*/ if (proc == myid) { start = first_local; if (start >= 0 ) { finish = proc_offsets[hypre_BoxManLocalProcOffset(manager) + 1]; } } else /* otherwise find proc (TO DO: just have procs_sort not contain duplicates - then we could do a regular binary search (though this list is probably short)- this has to be changed in assemble, then also memory management in addentry - but currently this is not necessary because proc = myid for all current hypre calls) */ { start = -1; for (i = 0; i < num_proc; i++) { offset = proc_offsets[i]; if (proc == procs_sort[offset]) { start = offset; finish = proc_offsets[i + 1]; break; } } } if (start >= 0 ) { /* now look for the id - returns -1 if not found*/ location = hypre_BinarySearch(&ids_sort[start], id, finish - start); } else { location = -1; } } else { location = -1; } if (location >= 0 ) { /* this location is relative to where we started searching - so fix if * non-negative */ location += start; /* now grab entry */ entry = &hypre_BoxManEntries(manager)[location]; } else { entry = NULL; } *entry_ptr = entry; return hypre_error_flag; } /*-------------------------------------------------------------------------- * Return a list of all of the entries in the box manager (and the number of * entries). These are sorted by (proc, id) pairs. * * 11/06 - changed to return the pointer to the boxman entries rather than a * copy of the array (so calling code should not free this array!) *--------------------------------------------------------------------------*/ HYPRE_Int hypre_BoxManGetAllEntries( hypre_BoxManager *manager, HYPRE_Int *num_entries, hypre_BoxManEntry **entries) { /* can only use after assembling */ if (!hypre_BoxManIsAssembled(manager)) { hypre_error_in_arg(1); return hypre_error_flag; } /* return */ *num_entries = hypre_BoxManNEntries(manager); *entries = hypre_BoxManEntries(manager); return hypre_error_flag; } /*-------------------------------------------------------------------------- * Return a list of all of the boxes ONLY in the entries in the box manager. * * Notes: Should have already created the box array; * * TO DO: (?) Might want to just store the array of boxes seperate from the * entries array so we don't have to create the array everytime this function is * called. (may be called quite a bit in some sstruct apps) *--------------------------------------------------------------------------*/ HYPRE_Int hypre_BoxManGetAllEntriesBoxes( hypre_BoxManager *manager, hypre_BoxArray *boxes ) { hypre_BoxManEntry entry; HYPRE_Int i, nentries; hypre_Index ilower, iupper; hypre_BoxManEntry *boxman_entries = hypre_BoxManEntries(manager); /* can only use after assembling */ if (!hypre_BoxManIsAssembled(manager)) { hypre_error_in_arg(1); return hypre_error_flag; } /* set array size */ nentries = hypre_BoxManNEntries(manager); hypre_BoxArraySetSize(boxes, nentries); for (i = 0; i < nentries; i++) { entry = boxman_entries[i]; hypre_BoxManEntryGetExtents(&entry, ilower, iupper); hypre_BoxSetExtents(hypre_BoxArrayBox(boxes, i), ilower, iupper); } /* return */ return hypre_error_flag; } /*-------------------------------------------------------------------------- * Return a list of all of the boxes ONLY in the entries in the box manager that * belong to the calling processor. * * Notes: Should have already created the box array; *--------------------------------------------------------------------------*/ HYPRE_Int hypre_BoxManGetLocalEntriesBoxes( hypre_BoxManager *manager, hypre_BoxArray *boxes ) { hypre_BoxManEntry entry; HYPRE_Int i; hypre_Index ilower, iupper; HYPRE_Int start = hypre_BoxManFirstLocal(manager); HYPRE_Int finish; HYPRE_Int num_my_entries = hypre_BoxManNumMyEntries(manager); hypre_BoxManEntry *boxman_entries = hypre_BoxManEntries(manager); HYPRE_Int *offsets = hypre_BoxManProcsSortOffsets(manager); /* can only use after assembling */ if (!hypre_BoxManIsAssembled(manager)) { hypre_error_in_arg(1); return hypre_error_flag; } /* set array size */ hypre_BoxArraySetSize(boxes, num_my_entries); finish = offsets[hypre_BoxManLocalProcOffset(manager) + 1]; if (num_my_entries && ((finish - start) != num_my_entries)) { hypre_error_w_msg(HYPRE_ERROR_GENERIC, "Something's wrong with box manager!"); } for (i = 0; i < num_my_entries; i++) { entry = boxman_entries[start + i]; hypre_BoxManEntryGetExtents(&entry, ilower, iupper); hypre_BoxSetExtents(hypre_BoxArrayBox(boxes, i), ilower, iupper); } /* return */ return hypre_error_flag; } /*-------------------------------------------------------------------------- * Get the boxes and the proc ids. The input procs array should be NULL. *--------------------------------------------------------------------------*/ HYPRE_Int hypre_BoxManGetAllEntriesBoxesProc( hypre_BoxManager *manager, hypre_BoxArray *boxes, HYPRE_Int **procs_ptr) { hypre_BoxManEntry entry; HYPRE_Int i, nentries; hypre_Index ilower, iupper; hypre_BoxManEntry *boxman_entries = hypre_BoxManEntries(manager); HYPRE_Int *procs; /* can only use after assembling */ if (!hypre_BoxManIsAssembled(manager)) { hypre_error_in_arg(1); return hypre_error_flag; } /* set array size */ nentries = hypre_BoxManNEntries(manager); hypre_BoxArraySetSize(boxes, nentries); procs = hypre_TAlloc(HYPRE_Int, nentries, HYPRE_MEMORY_HOST); for (i = 0; i < nentries; i++) { entry = boxman_entries[i]; hypre_BoxManEntryGetExtents(&entry, ilower, iupper); hypre_BoxSetExtents(hypre_BoxArrayBox(boxes, i), ilower, iupper); procs[i] = hypre_BoxManEntryProc(&entry); } /* return */ *procs_ptr = procs; return hypre_error_flag; } /*-------------------------------------------------------------------------- * All global entries that lie within the boxes supplied to this function are * gathered from other processors during the assemble and stored in a * processor's local box manager. Multiple calls may be made to this * function. The box extents supplied here are not retained after the assemble. * * Note: * * (1) This affects whether or not calls to BoxManIntersect() can be answered * correctly. In other words, the user needs to anticipate the areas of the * grid where BoxManIntersect() calls will be made, and make sure that * information has been collected. * * (2) when this is called, the boolean "is_gather_entries" is set and the box * is added to gather_regions array. *--------------------------------------------------------------------------*/ HYPRE_Int hypre_BoxManGatherEntries(hypre_BoxManager *manager, hypre_Index imin, hypre_Index imax ) { hypre_Box *box; hypre_BoxArray *gather_regions; /* can only use before assembling */ if (hypre_BoxManIsAssembled(manager)) { hypre_error_in_arg(1); return hypre_error_flag; } /* initialize */ hypre_BoxManIsGatherCalled(manager) = 1; gather_regions = hypre_BoxManGatherRegions(manager); /* add the box to the gather region array */ box = hypre_BoxCreate(hypre_BoxManNDim(manager)); hypre_BoxSetExtents( box, imin, imax ); hypre_AppendBox( box, gather_regions); /* this is a copy */ /* clean up */ hypre_BoxDestroy(box); hypre_BoxManGatherRegions(manager) = gather_regions; /* may be a realloc */ return hypre_error_flag; } /*-------------------------------------------------------------------------- * In the assemble, we populate the local box manager with global box * information to be used by calls to BoxManIntersect(). Global box information * is gathered that corresponds to the regions input by calls to * hypre_BoxManGatherEntries(). * * Notes: * * (1) In the assumed partition (AP) case, the boxes gathered are those that * correspond to boxes living in the assumed partition regions that intersect * the regions input to hypre_BoxManGatherEntries(). (We will have to check for * duplicates here as a box can be in more than one AP.) * * (2) If a box is gathered from a neighbor processor, then all the boxes from * that neighbor processor are retrieved. So we can always assume that have all * the local information from neighbor processors. * * (3) If hypre_BoxManGatherEntries() has *not* been called, then only the box * information provided via calls to hypre_BoxManAddEntry will be in the box * manager. (There is a global communication to check if GatherEntires has been * called on any processor). In the non-AP case, if GatherEntries is called on * *any* processor, then all processors get *all* boxes (via allgatherv). * * (Don't call gather entries if all is known already) * * (4) Need to check for duplicate boxes (and eliminate) - based on pair * (proc_id, box_id). Also sort this identifier pair so that GetEntry calls can * be made more easily. * * (5) ****TO DO****Particularly in the AP case, might want to think about a * "smart" algorithm to decide whether point-to-point communications or an * AllGather is the best way to collect the needed entries resulting from calls * to GatherEntries(). If this was done well, then the AP and non-AP would not * have to be treated separately at all! * * **Assumptions: * * 1. A processor has used "add entry" to put all of the boxes that it owns into * its box manager * * 2. The assemble routine is only called once for a box manager (i.e., you * don't assemble, then add more entries and then assemble again) *--------------------------------------------------------------------------*/ HYPRE_Int hypre_BoxManAssemble( hypre_BoxManager *manager ) { HYPRE_Int ndim = hypre_BoxManNDim(manager); HYPRE_Int myid, nprocs; HYPRE_Int is_gather, global_is_gather; HYPRE_Int nentries; HYPRE_Int *procs_sort, *ids_sort; HYPRE_Int i, j, k; HYPRE_Int need_to_sort = 1; /* default it to sort */ //HYPRE_Int short_sort = 0; /*do abreviated sort */ HYPRE_Int non_ap_gather = 1; /* default to gather w/out ap*/ HYPRE_Int global_num_boxes = 0; hypre_BoxManEntry *entries; hypre_BoxArray *gather_regions; MPI_Comm comm = hypre_BoxManComm(manager); /* cannot re-assemble */ if (hypre_BoxManIsAssembled(manager)) { hypre_error_in_arg(1); return hypre_error_flag; } /* initilize */ hypre_MPI_Comm_rank(comm, &myid); hypre_MPI_Comm_size(comm, &nprocs); gather_regions = hypre_BoxManGatherRegions(manager); nentries = hypre_BoxManNEntries(manager); entries = hypre_BoxManEntries(manager); procs_sort = hypre_BoxManProcsSort(manager); ids_sort = hypre_BoxManIdsSort(manager); /* do we need to gather entries - check to see if ANY processor called a * gather? */ if (!hypre_BoxManAllGlobalKnown(manager)) { if (nprocs > 1) { is_gather = hypre_BoxManIsGatherCalled(manager); hypre_MPI_Allreduce(&is_gather, &global_is_gather, 1, HYPRE_MPI_INT, hypre_MPI_LOR, comm); } else /* just one proc */ { global_is_gather = 0; hypre_BoxManAllGlobalKnown(manager) = 1; } } else /* global info is known - don't call a gather even if the use has called gather entries */ { global_is_gather = 0; } /* ----------------------------GATHER? ------------------------------------*/ if (global_is_gather) { HYPRE_Int *my_ids = hypre_BoxManMyIds(manager); HYPRE_Int num_my_entries = hypre_BoxManNumMyEntries(manager); hypre_BoxManEntry **my_entries = hypre_BoxManMyEntries(manager); /* Need to be able to find our own entry, given the box number - for the second data exchange - so do some sorting now. Then we can use my_ids to quickly find an entry. This will be freed when the sort table is created (it's redundant at that point). (Note: we may be creating the AP here, so this sorting needs to be done at the beginning for that too). If non-ap, then we want the allgatherv to already be sorted - so this takes care of that */ /* my entries may already be sorted (if all entries are then my entries are - so check first */ if (hypre_BoxManIsEntriesSort(manager) == 0) { hypre_entryqsort2(my_ids, my_entries, 0, num_my_entries - 1); } /* if AP, use AP to find out who owns the data we need. In the non-AP, then just gather everything for now. */ non_ap_gather = 0; /* Goal: Gather entries from the relevant processor and add to the entries * array. Also add proc and id to the procs_sort and ids_sort arrays. */ if (!non_ap_gather) /*********** AP CASE! ***********/ { HYPRE_Int size; HYPRE_Int *tmp_proc_ids; HYPRE_Int proc_count, proc_alloc; //HYPRE_Int max_proc_count; HYPRE_Int *proc_array; HYPRE_Int *ap_proc_ids; HYPRE_Int count; HYPRE_Int max_response_size; HYPRE_Int non_info_size, entry_size_bytes; HYPRE_Int *neighbor_proc_ids = NULL; HYPRE_Int *response_buf_starts; HYPRE_Int *response_buf; HYPRE_Int response_size, tmp_int; HYPRE_Int *send_buf = NULL; HYPRE_Int *send_buf_starts = NULL; HYPRE_Int d, proc, id, last_id; HYPRE_Int *tmp_int_ptr; HYPRE_Int *contact_proc_ids = NULL; HYPRE_Int max_regions, max_refinements, ologp; HYPRE_Int *local_boxnums; HYPRE_Int statbuf[3]; HYPRE_Int send_statbuf[3]; HYPRE_Int ndim = hypre_BoxManNDim(manager); void *entry_response_buf; void *index_ptr; HYPRE_Real gamma; HYPRE_Real local_volume, global_volume; HYPRE_Real sendbuf2[2], recvbuf2[2]; hypre_BoxArray *gather_regions; hypre_BoxArray *local_boxes; hypre_Box *box; hypre_StructAssumedPart *ap; hypre_DataExchangeResponse response_obj, response_obj2; hypre_BoxManEntry *entry_ptr; hypre_Index imin, imax; hypre_IndexRef min_ref, max_ref; /* 1. Create an assumed partition? (may have been added in the coarsen routine) */ if (hypre_BoxManAssumedPartition(manager) == NULL) { /* create an array of local boxes. get the global box size/volume (as a HYPRE_Real). */ local_boxes = hypre_BoxArrayCreate(num_my_entries, ndim); local_boxnums = hypre_CTAlloc(HYPRE_Int, num_my_entries, HYPRE_MEMORY_HOST); local_volume = 0.0; for (i = 0; i < num_my_entries; i++) { /* get entry */ entry_ptr = my_entries[i]; /* copy box info to local_boxes */ min_ref = hypre_BoxManEntryIMin(entry_ptr); max_ref = hypre_BoxManEntryIMax(entry_ptr); box = hypre_BoxArrayBox(local_boxes, i); hypre_BoxSetExtents( box, min_ref, max_ref ); /* keep box num also */ local_boxnums[i] = hypre_BoxManEntryId(entry_ptr); /* calculate volume */ local_volume += (HYPRE_Real) hypre_BoxVolume(box); }/* end of local boxes */ /* get the number of global entries and the global volume */ sendbuf2[0] = local_volume; sendbuf2[1] = (HYPRE_Real) num_my_entries; hypre_MPI_Allreduce(&sendbuf2, &recvbuf2, 2, HYPRE_MPI_REAL, hypre_MPI_SUM, comm); global_volume = recvbuf2[0]; global_num_boxes = (HYPRE_Int) recvbuf2[1]; /* estimates for the assumed partition */ d = nprocs / 2; ologp = 0; while ( d > 0) { d = d / 2; /* note - d is an HYPRE_Int - so this is floored */ ologp++; } max_regions = hypre_min(hypre_pow2(ologp + 1), 10 * ologp); max_refinements = ologp; gamma = .6; /* percentage a region must be full to avoid refinement */ hypre_StructAssumedPartitionCreate( ndim, hypre_BoxManBoundingBox(manager), global_volume, global_num_boxes, local_boxes, local_boxnums, max_regions, max_refinements, gamma, comm, &ap); hypre_BoxManAssumedPartition(manager) = ap; hypre_BoxArrayDestroy(local_boxes); hypre_TFree(local_boxnums, HYPRE_MEMORY_HOST); } else { ap = hypre_BoxManAssumedPartition(manager); } /* 2. Now go thru gather regions and find out which processor's AP region they intersect - only do the rest if we have global boxes!*/ if (global_num_boxes) { gather_regions = hypre_BoxManGatherRegions(manager); /*allocate space to store info from one box */ proc_count = 0; proc_alloc = hypre_pow2(ndim); /* Just an initial estimate */ proc_array = hypre_CTAlloc(HYPRE_Int, proc_alloc, HYPRE_MEMORY_HOST); /* probably there will mostly be one proc per box - allocate space * for 2 */ size = 2 * hypre_BoxArraySize(gather_regions); tmp_proc_ids = hypre_CTAlloc(HYPRE_Int, size, HYPRE_MEMORY_HOST); count = 0; /* loop through all boxes */ hypre_ForBoxI(i, gather_regions) { hypre_StructAssumedPartitionGetProcsFromBox( ap, hypre_BoxArrayBox(gather_regions, i), &proc_count, &proc_alloc, &proc_array); if ((count + proc_count) > size) { size = size + proc_count + 2 * (hypre_BoxArraySize(gather_regions) - i); tmp_proc_ids = hypre_TReAlloc(tmp_proc_ids, HYPRE_Int, size, HYPRE_MEMORY_HOST); } for (j = 0; j < proc_count; j++) { tmp_proc_ids[count] = proc_array[j]; count++; } } hypre_TFree(proc_array, HYPRE_MEMORY_HOST); /* now get rid of redundencies in tmp_proc_ids (since a box can lie in more than one AP - put in ap_proc_ids*/ hypre_qsort0(tmp_proc_ids, 0, count - 1); proc_count = 0; ap_proc_ids = hypre_CTAlloc(HYPRE_Int, count, HYPRE_MEMORY_HOST); if (count) { ap_proc_ids[0] = tmp_proc_ids[0]; proc_count++; } for (i = 1; i < count; i++) { if (tmp_proc_ids[i] != ap_proc_ids[proc_count - 1]) { ap_proc_ids[proc_count] = tmp_proc_ids[i]; proc_count++; } } hypre_TFree(tmp_proc_ids, HYPRE_MEMORY_HOST); /* 3. now we have a sorted list with no duplicates in ap_proc_ids */ /* for each of these processor ids, we need to get infomation about the boxes in their assumed partition region */ /* get some stats: check how many point to point communications? (what is the max?) */ /* also get the max distinct AP procs and the max # of entries) */ send_statbuf[0] = proc_count; send_statbuf[1] = hypre_StructAssumedPartMyPartitionNumDistinctProcs(ap); send_statbuf[2] = num_my_entries; hypre_MPI_Allreduce(send_statbuf, statbuf, 3, HYPRE_MPI_INT, hypre_MPI_MAX, comm); //max_proc_count = statbuf[0]; /* we do not want a single processor to do a ton of point to point communications (relative to the number of total processors - how much is too much?*/ /* is there a better way to figure the threshold? */ /* 3/07 - take out threshold calculation - shouldn't be a problem on * large number of processors if box sizes are relativesly * similar */ #if 0 threshold = hypre_min(12 * ologp, nprocs); if ( max_proc_count >= threshold) { /* too many! */ /*if (myid == 0) hypre_printf("TOO BIG: check 1: max_proc_count = %d\n", max_proc_count);*/ /* change coarse midstream!- now we will just gather everything! */ non_ap_gather = 1; /*clean up from above */ hypre_TFree(ap_proc_ids, HYPRE_MEMORY_HOST); } #endif if (!non_ap_gather) { /* EXCHANGE DATA information (2 required) : if we simply return the boxes in the AP region, we will not have the entry information- in particular, we will not have the "info" obj. So we have to get this info by doing a second communication where we contact the actual owners of the boxes and request the entry info...So: (1) exchange #1: contact the AP processor, get the ids of the procs with boxes in that AP region (for now we ignore the box numbers - since we will get all of the entries from each processor) (2) exchange #2: use this info to contact the owner processors and from them get the rest of the entry infomation: box extents, info object, etc. ***note: we will get all of the entries from that processor, not just the ones in a particular AP region (whose box numbers we ignored above) */ /* exchange #1 - we send nothing, and the contacted proc returns * all of the procs with boxes in its AP region*/ /* build response object*/ response_obj.fill_response = hypre_FillResponseBoxManAssemble1; response_obj.data1 = ap; /* needed to fill responses*/ response_obj.data2 = NULL; send_buf = NULL; send_buf_starts = hypre_CTAlloc(HYPRE_Int, proc_count + 1, HYPRE_MEMORY_HOST); for (i = 0; i < proc_count + 1; i++) { send_buf_starts[i] = 0; } response_buf = NULL; /*this and the next are allocated in * exchange data */ response_buf_starts = NULL; /*we expect back the proc id for each box owned */ size = sizeof(HYPRE_Int); /* this parameter needs to be the same on all processors */ /* max_response_size = (global_num_boxes/nprocs)*2;*/ /* modification - should reduce data passed */ max_response_size = statbuf[1]; /*max num of distinct procs */ hypre_DataExchangeList(proc_count, ap_proc_ids, send_buf, send_buf_starts, 0, size, &response_obj, max_response_size, 3, comm, (void**) &response_buf, &response_buf_starts); /*how many items were returned? */ size = response_buf_starts[proc_count]; /* alias the response buffer */ neighbor_proc_ids = response_buf; /*clean up*/ hypre_TFree(send_buf_starts, HYPRE_MEMORY_HOST); hypre_TFree(ap_proc_ids, HYPRE_MEMORY_HOST); hypre_TFree(response_buf_starts, HYPRE_MEMORY_HOST); /* create a contact list of these processors (eliminate duplicate * procs and also my id ) */ /*first sort on proc_id */ hypre_qsort0(neighbor_proc_ids, 0, size - 1); /* new contact list: */ contact_proc_ids = hypre_CTAlloc(HYPRE_Int, size, HYPRE_MEMORY_HOST); proc_count = 0; /* to determine the number of unique ids) */ last_id = -1; for (i = 0; i < size; i++) { if (neighbor_proc_ids[i] != last_id) { if (neighbor_proc_ids[i] != myid) { contact_proc_ids[proc_count] = neighbor_proc_ids[i]; last_id = neighbor_proc_ids[i]; proc_count++; } } } /* check to see if we have any entries from a processor before contacting(if we have one entry from a processor, then we have all of the entries) we will do we only do this if we have sorted - otherwise we can't easily seach the proc list - this will be most common usage anyways */ if (hypre_BoxManIsEntriesSort(manager) && nentries) { /* so we can eliminate duplicate contacts */ HYPRE_Int new_count = 0; HYPRE_Int proc_spot = 0; HYPRE_Int known_id, contact_id; /* in this case, we can do the "short sort" because we will not have any duplicate proc ids */ //short_sort = 1; for (i = 0; i < proc_count; i++) { contact_id = contact_proc_ids[i]; while (proc_spot < nentries) { known_id = procs_sort[proc_spot]; if (contact_id > known_id) { proc_spot++; } else if (contact_id == known_id) { /* known already - remove from contact list - so go to next i and spot*/ proc_spot++; break; } else /* contact_id < known_id */ { /* this contact_id is not known already - keep in list*/ contact_proc_ids[new_count] = contact_id; new_count++; break; } } if (proc_spot == nentries) /* keep the rest */ { contact_proc_ids[new_count] = contact_id; new_count++; } } proc_count = new_count; } #if 0 /* also can do the short sort if we just have boxes that are ours....here we also don't need to check for duplicates */ if (nentries == num_my_entries) { short_sort = 1; } #endif send_buf_starts = hypre_CTAlloc(HYPRE_Int, proc_count + 1, HYPRE_MEMORY_HOST); for (i = 0; i < proc_count + 1; i++) { send_buf_starts[i] = 0; } send_buf = NULL; /* exchange #2 - now we contact processors (send nothing) and that processor needs to send us all of their local entry information*/ entry_response_buf = NULL; /*this and the next are allocated * in exchange data */ response_buf_starts = NULL; response_obj2.fill_response = hypre_FillResponseBoxManAssemble2; response_obj2.data1 = manager; /* needed to fill responses*/ response_obj2.data2 = NULL; /* How big is an entry? extents - 2*ndim HYPRE_Ints proc - 1 HYPRE_Int id - 1 HYPRE_Int info - info_size in bytes Note: For now, we do not need to send num_ghost, position, or boxman, since this is just generated in addentry. */ non_info_size = 2 * ndim + 2; entry_size_bytes = non_info_size * sizeof(HYPRE_Int) + hypre_BoxManEntryInfoSize(manager); /* modification - use an true max_response_size (should be faster and less communication */ max_response_size = statbuf[2]; /* max of num_my_entries */ hypre_DataExchangeList(proc_count, contact_proc_ids, send_buf, send_buf_starts, sizeof(HYPRE_Int), entry_size_bytes, &response_obj2, max_response_size, 4, comm, &entry_response_buf, &response_buf_starts); /* now we can add entries that are in response_buf - we check for duplicates later */ /*how many entries do we have?*/ response_size = response_buf_starts[proc_count]; /* do we need more storage ?*/ if (nentries + response_size > hypre_BoxManMaxNEntries(manager)) { HYPRE_Int inc_size; inc_size = (response_size + nentries - hypre_BoxManMaxNEntries(manager)); hypre_BoxManIncSize ( manager, inc_size); entries = hypre_BoxManEntries(manager); procs_sort = hypre_BoxManProcsSort(manager); ids_sort = hypre_BoxManIdsSort(manager); } index_ptr = entry_response_buf; /* point into response buf */ for (i = 0; i < response_size; i++) { size = sizeof(HYPRE_Int); /* imin */ for (d = 0; d < ndim; d++) { hypre_TMemcpy( &tmp_int, index_ptr, HYPRE_Int, 1, HYPRE_MEMORY_HOST, HYPRE_MEMORY_HOST); index_ptr = (void *) ((char *) index_ptr + size); hypre_IndexD(imin, d) = tmp_int; } /*imax */ for (d = 0; d < ndim; d++) { hypre_TMemcpy( &tmp_int, index_ptr, HYPRE_Int, 1, HYPRE_MEMORY_HOST, HYPRE_MEMORY_HOST); index_ptr = (void *) ((char *) index_ptr + size); hypre_IndexD(imax, d) = tmp_int; } /* proc */ tmp_int_ptr = (HYPRE_Int *) index_ptr; proc = *tmp_int_ptr; index_ptr = (void *) ((char *) index_ptr + size); /* id */ tmp_int_ptr = (HYPRE_Int *) index_ptr; id = *tmp_int_ptr; index_ptr = (void *) ((char *) index_ptr + size); /* the info object (now pointer to by index_ptr) is copied by AddEntry*/ hypre_BoxManAddEntry(manager, imin, imax, proc, id, index_ptr); /* start of next entry */ index_ptr = (void *) ((char *) index_ptr + hypre_BoxManEntryInfoSize(manager)); } /* clean up from this section of code*/ hypre_TFree(entry_response_buf, HYPRE_MEMORY_HOST); hypre_TFree(response_buf_starts, HYPRE_MEMORY_HOST); hypre_TFree(send_buf_starts, HYPRE_MEMORY_HOST); hypre_TFree(contact_proc_ids, HYPRE_MEMORY_HOST); hypre_TFree(neighbor_proc_ids, HYPRE_MEMORY_HOST); /* response_buf - aliased */ } /* end of nested non_ap_gather -exchange 1*/ } /* end of if global boxes */ } /********** end of gathering for the AP case *****************/ if (non_ap_gather) /* beginning of gathering for the non-AP case */ { /* collect global data - here we will just send each processor's local entries id = myid (not all of the entries in the table). Then we will just re-create the entries array instead of looking for duplicates and sorting */ HYPRE_Int entry_size_bytes; HYPRE_Int send_count, send_count_bytes; HYPRE_Int *displs, *recv_counts; HYPRE_Int recv_buf_size, recv_buf_size_bytes; HYPRE_Int d; HYPRE_Int size, non_info_size, position; HYPRE_Int proc, id; HYPRE_Int tmp_int; HYPRE_Int *tmp_int_ptr; void *send_buf = NULL; void *recv_buf = NULL; hypre_BoxManEntry *entry; hypre_IndexRef index; hypre_Index imin, imax; void *index_ptr; void *info; /* How big is an entry? extents - 2*ndim HYPRE_Ints proc - 1 HYPRE_Int id - 1 HYPRE_Int info - info_size in bytes Note: For now, we do not need to send num_ghost, position, or boxman, since this is just generated in addentry. */ non_info_size = 2 * ndim + 2; entry_size_bytes = non_info_size * sizeof(HYPRE_Int) + hypre_BoxManEntryInfoSize(manager); /* figure out how many entries each proc has - let the group know */ send_count = num_my_entries; send_count_bytes = send_count * entry_size_bytes; recv_counts = hypre_CTAlloc(HYPRE_Int, nprocs, HYPRE_MEMORY_HOST); hypre_MPI_Allgather(&send_count_bytes, 1, HYPRE_MPI_INT, recv_counts, 1, HYPRE_MPI_INT, comm); displs = hypre_CTAlloc(HYPRE_Int, nprocs, HYPRE_MEMORY_HOST); displs[0] = 0; recv_buf_size_bytes = recv_counts[0]; for (i = 1; i < nprocs; i++) { displs[i] = displs[i - 1] + recv_counts[i - 1]; recv_buf_size_bytes += recv_counts[i]; } recv_buf_size = recv_buf_size_bytes / entry_size_bytes; /* mydispls = displs[myid]/entry_size_bytes; */ global_num_boxes = recv_buf_size; /* populate the send buffer with my entries (note: these are sorted above by increasing id */ send_buf = hypre_TAlloc(char, send_count_bytes, HYPRE_MEMORY_HOST); recv_buf = hypre_TAlloc(char, recv_buf_size_bytes, HYPRE_MEMORY_HOST); index_ptr = send_buf; /* step through send_buf with this pointer */ /* loop over my entries */ for (i = 0; i < send_count; i++) { entry = my_entries[i]; size = sizeof(HYPRE_Int); /* imin */ index = hypre_BoxManEntryIMin(entry); for (d = 0; d < ndim; d++) { tmp_int = hypre_IndexD(index, d); hypre_TMemcpy( index_ptr, &tmp_int, HYPRE_Int, 1, HYPRE_MEMORY_HOST, HYPRE_MEMORY_HOST); index_ptr = (void *) ((char *) index_ptr + size); } /* imax */ index = hypre_BoxManEntryIMax(entry); for (d = 0; d < ndim; d++) { tmp_int = hypre_IndexD(index, d); hypre_TMemcpy( index_ptr, &tmp_int, HYPRE_Int, 1, HYPRE_MEMORY_HOST, HYPRE_MEMORY_HOST); index_ptr = (void *) ((char *) index_ptr + size); } /* proc */ tmp_int = hypre_BoxManEntryProc(entry); hypre_TMemcpy( index_ptr, &tmp_int, HYPRE_Int, 1, HYPRE_MEMORY_HOST, HYPRE_MEMORY_HOST); index_ptr = (void *) ((char *) index_ptr + size); /* id */ tmp_int = hypre_BoxManEntryId(entry); hypre_TMemcpy( index_ptr, &tmp_int, HYPRE_Int, 1, HYPRE_MEMORY_HOST, HYPRE_MEMORY_HOST); index_ptr = (void *) ((char *) index_ptr + size); /*info object*/ size = hypre_BoxManEntryInfoSize(manager); position = hypre_BoxManEntryPosition(entry); info = hypre_BoxManInfoObject(manager, position); hypre_TMemcpy(index_ptr, info, char, size, HYPRE_MEMORY_HOST, HYPRE_MEMORY_HOST); index_ptr = (void *) ((char *) index_ptr + size); } /* end of loop over my entries */ /* now send_buf is ready to go! */ hypre_MPI_Allgatherv(send_buf, send_count_bytes, hypre_MPI_BYTE, recv_buf, recv_counts, displs, hypre_MPI_BYTE, comm); /* unpack recv_buf into entries - let's just unpack them all into the entries table - this way they will already be sorted - so we set nentries to zero so that add entries starts at the beginning (i.e., we are deleting the current entries and re-creating)*/ if (recv_buf_size > hypre_BoxManMaxNEntries(manager)) { HYPRE_Int inc_size; inc_size = (recv_buf_size - hypre_BoxManMaxNEntries(manager)); hypre_BoxManIncSize ( manager, inc_size); nentries = hypre_BoxManNEntries(manager); entries = hypre_BoxManEntries(manager); procs_sort = hypre_BoxManProcsSort(manager); ids_sort = hypre_BoxManIdsSort(manager); } /* now "empty" the entries array */ hypre_BoxManNEntries(manager) = 0; hypre_BoxManNumMyEntries(manager) = 0; /* point into recv buf and then unpack */ index_ptr = recv_buf; for (i = 0; i < recv_buf_size; i++) { size = sizeof(HYPRE_Int); /* imin */ for (d = 0; d < ndim; d++) { hypre_TMemcpy( &tmp_int, index_ptr, HYPRE_Int, 1, HYPRE_MEMORY_HOST, HYPRE_MEMORY_HOST); index_ptr = (void *) ((char *) index_ptr + size); hypre_IndexD(imin, d) = tmp_int; } /*imax */ for (d = 0; d < ndim; d++) { hypre_TMemcpy( &tmp_int, index_ptr, HYPRE_Int, 1, HYPRE_MEMORY_HOST, HYPRE_MEMORY_HOST); index_ptr = (void *) ((char *) index_ptr + size); hypre_IndexD(imax, d) = tmp_int; } /* proc */ tmp_int_ptr = (HYPRE_Int *) index_ptr; proc = *tmp_int_ptr; index_ptr = (void *) ((char *) index_ptr + size); /* id */ tmp_int_ptr = (HYPRE_Int *) index_ptr; id = *tmp_int_ptr; index_ptr = (void *) ((char *) index_ptr + size); /* info is copied by AddEntry and index_ptr is at info */ hypre_BoxManAddEntry( manager, imin, imax, proc, id, index_ptr ); /* start of next entry */ index_ptr = (void *) ((char *) index_ptr + hypre_BoxManEntryInfoSize(manager)); } hypre_BoxManAllGlobalKnown(manager) = 1; hypre_TFree(send_buf, HYPRE_MEMORY_HOST); hypre_TFree(recv_buf, HYPRE_MEMORY_HOST); hypre_TFree(recv_counts, HYPRE_MEMORY_HOST); hypre_TFree(displs, HYPRE_MEMORY_HOST); /* now the entries and procs_sort and ids_sort are already sorted */ need_to_sort = 0; hypre_BoxManIsEntriesSort(manager) = 1; } /********* end of non-AP gather *****************/ }/* end of if (gather entries) for both AP and non-AP */ else { /* no gather - so check to see if the entries have been sorted by the user - if so we don't need to sort! */ if (hypre_BoxManIsEntriesSort(manager)) { need_to_sort = 0; } } /* we don't need special access to my entries anymore - because we will create the sort table */ hypre_TFree(hypre_BoxManMyIds(manager), HYPRE_MEMORY_HOST); hypre_TFree(hypre_BoxManMyEntries(manager), HYPRE_MEMORY_HOST); hypre_BoxManMyIds(manager) = NULL; hypre_BoxManMyEntries(manager) = NULL; /* -----------------------SORT--------------------------------------*/ /* now everything we need is in entries, also ids and procs have * been added to procs_sort and ids_sort, but possibly not sorted. (check need_to_sort flag). If sorted already, then duplicates have been removed. Also there may not be any duplicates in the AP case if a duplicate proc check was done (depends on if current entry info was sorted)*/ /* check for and remove duplicate boxes - based on (proc, id) */ /* at the same time sort the procs_sort and ids_sort and then sort the * entries*/ { HYPRE_Int *order_index = NULL; HYPRE_Int *delete_array = NULL; HYPRE_Int tmp_id, start, index; HYPRE_Int first_local; HYPRE_Int num_procs_sort; HYPRE_Int *proc_offsets; HYPRE_Int myoffset; HYPRE_Int size; hypre_BoxManEntry *new_entries; /* (TO DO): if we are sorting after the ap gather, then the box ids may already be sorted within processor number (depends on if the check for contacting duplicate processors was performed....if so, then there may be a faster way to sort the proc ids and not mess up the already sorted box ids - also there will not be any duplicates )*/ /* initial... */ nentries = hypre_BoxManNEntries(manager); entries = hypre_BoxManEntries(manager); /* these are negative if a proc does not have any local entries in the manager */ first_local = -1; myoffset = -1; if (need_to_sort) { #if 0 /* TO DO: add code for the "short sort" - which is don't check for duplicates and the boxids are already sorted within each processor id - but the proc ids are not sorted */ if (short_sort) { /* TO DO: write this */ } else { /*stuff below */ } #endif order_index = hypre_CTAlloc(HYPRE_Int, nentries, HYPRE_MEMORY_HOST); delete_array = hypre_CTAlloc(HYPRE_Int, nentries, HYPRE_MEMORY_HOST); index = 0; for (i = 0; i < nentries; i++) { order_index[i] = i; } /* sort by proc_id */ hypre_qsort3i(procs_sort, ids_sort, order_index, 0, nentries - 1); num_procs_sort = 0; /* get first id */ if (nentries) { tmp_id = procs_sort[0]; num_procs_sort++; } /* now sort on ids within each processor number*/ start = 0; for (i = 1; i < nentries; i++) { if (procs_sort[i] != tmp_id) { hypre_qsort2i(ids_sort, order_index, start, i - 1); /*now find duplicate ids */ for (j = start + 1; j < i; j++) { if (ids_sort[j] == ids_sort[j - 1]) { delete_array[index++] = j; } } /* update start and tmp_id */ start = i; tmp_id = procs_sort[i]; num_procs_sort++; } } /* final sort and purge (the last group doesn't get caught in the above loop) */ if (nentries) { hypre_qsort2i(ids_sort, order_index, start, nentries - 1); /*now find duplicate boxnums */ for (j = start + 1; j < nentries; j++) { if (ids_sort[j] == ids_sort[j - 1]) { delete_array[index++] = j; } } } /* now index = the number to delete (in delete_array) */ if (index) { /* now delete from sort procs and sort ids -use delete_array because these have already been sorted. also delete from order_index */ start = delete_array[0]; j = 0; for (i = start; (i + j) < nentries; i++) { if (j < index) { while ((i + j) == delete_array[j]) /* see if deleting * consec. items */ { j++; /*increase the shift*/ if (j == index) { break; } } } if ((i + j) < nentries) /* if deleting the last item then no moving */ { ids_sort[i] = ids_sort[i + j]; procs_sort[i] = procs_sort[i + j]; order_index[i] = order_index[i + j]; } } } /*** create new sorted entries and info arrays - delete old one ****/ { HYPRE_Int position; HYPRE_Int info_size = hypre_BoxManEntryInfoSize(manager); void *index_ptr; void *new_info; void *info; size = nentries - index; new_entries = hypre_CTAlloc(hypre_BoxManEntry, size, HYPRE_MEMORY_HOST); new_info = hypre_TAlloc(char, size * info_size, HYPRE_MEMORY_HOST); index_ptr = new_info; for (i = 0; i < size; i++) { /* copy the entry */ hypre_BoxManEntryCopy(&entries[order_index[i]], &new_entries[i]); /* set the new position */ hypre_BoxManEntryPosition(&new_entries[i]) = i; /* copy the info object */ position = hypre_BoxManEntryPosition(&entries[order_index[i]]); info = hypre_BoxManInfoObject(manager, position); hypre_TMemcpy(index_ptr, info, char, info_size, HYPRE_MEMORY_HOST, HYPRE_MEMORY_HOST); index_ptr = (void *) ((char *) index_ptr + info_size); } hypre_TFree(entries, HYPRE_MEMORY_HOST); hypre_TFree(hypre_BoxManInfoObjects(manager), HYPRE_MEMORY_HOST); hypre_BoxManEntries(manager) = new_entries; hypre_BoxManMaxNEntries(manager) = size; hypre_BoxManNEntries(manager) = size; hypre_BoxManInfoObjects(manager) = new_info; nentries = hypre_BoxManNEntries(manager); entries = hypre_BoxManEntries(manager); } } /* end of if (need_to_sort) */ else { /* no sorting - just get num_procs_sort by looping through procs_sort array*/ num_procs_sort = 0; if (nentries > 0) { tmp_id = procs_sort[0]; num_procs_sort++; } for (i = 1; i < nentries; i++) { if (procs_sort[i] != tmp_id) { num_procs_sort++; tmp_id = procs_sort[i]; } } } hypre_BoxManNumProcsSort(manager) = num_procs_sort; /* finally, create proc_offsets (myoffset corresponds to local id position) first_local is the position in entries; */ proc_offsets = hypre_CTAlloc(HYPRE_Int, num_procs_sort + 1, HYPRE_MEMORY_HOST); proc_offsets[0] = 0; if (nentries > 0) { j = 1; tmp_id = procs_sort[0]; if (myid == tmp_id) { myoffset = 0; first_local = 0; } for (i = 0; i < nentries; i++) { if (procs_sort[i] != tmp_id) { if (myid == procs_sort[i]) { myoffset = j; first_local = i; } proc_offsets[j++] = i; tmp_id = procs_sort[i]; } } proc_offsets[j] = nentries; /* last one */ } hypre_BoxManProcsSortOffsets(manager) = proc_offsets; hypre_BoxManFirstLocal(manager) = first_local; hypre_BoxManLocalProcOffset(manager) = myoffset; /* clean up from this section of code */ hypre_TFree(delete_array, HYPRE_MEMORY_HOST); hypre_TFree(order_index, HYPRE_MEMORY_HOST); }/* end bracket for all or the sorting stuff */ { /* for the assumed partition case, we can check to see if all the global information is known (is a gather has been done) - this could prevent future comm costs */ HYPRE_Int all_known = 0; HYPRE_Int global_all_known; nentries = hypre_BoxManNEntries(manager); if (!hypre_BoxManAllGlobalKnown(manager) && global_is_gather) { /*if every processor has its nentries = global_num_boxes, then all is * known */ if (global_num_boxes == nentries) { all_known = 1; } hypre_MPI_Allreduce(&all_known, &global_all_known, 1, HYPRE_MPI_INT, hypre_MPI_LAND, comm); hypre_BoxManAllGlobalKnown(manager) = global_all_known; } } /*------------------------------INDEX TABLE ---------------------------*/ /* now build the index_table and indexes array */ /* Note: for now we are using the same scheme as in BoxMap */ { HYPRE_Int *indexes[HYPRE_MAXDIM]; HYPRE_Int size[HYPRE_MAXDIM]; HYPRE_Int iminmax[2]; HYPRE_Int index_not_there; HYPRE_Int d, e, itsize; HYPRE_Int mystart, myfinish; HYPRE_Int imin[HYPRE_MAXDIM]; HYPRE_Int imax[HYPRE_MAXDIM]; HYPRE_Int start_loop[HYPRE_MAXDIM]; HYPRE_Int end_loop[HYPRE_MAXDIM]; HYPRE_Int loop, range, loop_num; HYPRE_Int *proc_offsets; HYPRE_Int location, spot; hypre_BoxManEntry **index_table; hypre_BoxManEntry *entry; hypre_Box *index_box, *table_box; hypre_Index stride, loop_size; hypre_IndexRef entry_imin; hypre_IndexRef entry_imax; /* initial */ nentries = hypre_BoxManNEntries(manager); entries = hypre_BoxManEntries(manager); proc_offsets = hypre_BoxManProcsSortOffsets(manager); /*------------------------------------------------------ * Set up the indexes array and record the processor's * entries. This will be used in ordering the link list * of BoxManEntry- ones on this processor listed first. *------------------------------------------------------*/ itsize = 0; for (d = 0; d < ndim; d++) { /* room for min and max of each entry in each dim */ indexes[d] = hypre_CTAlloc(HYPRE_Int, 2 * nentries, HYPRE_MEMORY_HOST); size[d] = 0; } /* loop through each entry and get index */ for (e = 0; e < nentries; e++) { entry = &entries[e]; /* grab the entry - get min and max extents */ entry_imin = hypre_BoxManEntryIMin(entry); entry_imax = hypre_BoxManEntryIMax(entry); /* in each dim, check if min/max positions are already in the table */ for (d = 0; d < ndim; d++) { iminmax[0] = hypre_IndexD(entry_imin, d); iminmax[1] = hypre_IndexD(entry_imax, d) + 1; /* do the min then the max */ for (i = 0; i < 2; i++) { /* find the new index position in the indexes array */ index_not_there = 1; if (!i) { location = hypre_BinarySearch2(indexes[d], iminmax[i], 0, size[d] - 1, &j); if (location != -1) { index_not_there = 0; } } else /* for max, we can start seach at min position */ { location = hypre_BinarySearch2(indexes[d], iminmax[i], j, size[d] - 1, &j); if (location != -1) { index_not_there = 0; } } /* if the index is already there, don't add it again */ if (index_not_there) { for (k = size[d]; k > j; k--) /* make room for new index */ { indexes[d][k] = indexes[d][k - 1]; } indexes[d][j] = iminmax[i]; size[d]++; /* increase the size in that dimension */ } } /* end of for min and max */ } /* end of for each dimension of the entry */ } /* end of for each entry loop */ if (nentries) { itsize = 1; for (d = 0; d < ndim; d++) { size[d]--; itsize *= size[d]; } } /*------------------------------------------------------ * Set up the table - do offprocessor then on-processor *------------------------------------------------------*/ /* allocate space for table */ index_table = hypre_CTAlloc(hypre_BoxManEntry *, itsize, HYPRE_MEMORY_HOST); index_box = hypre_BoxCreate(ndim); table_box = hypre_BoxCreate(ndim); /* create a table_box for use below */ hypre_SetIndex(stride, 1); hypre_BoxSetExtents(table_box, stride, size); hypre_BoxShiftNeg(table_box, stride); /* Want box to start at 0*/ /* which are my entries? (on-processor) */ mystart = hypre_BoxManFirstLocal(manager); if (mystart >= 0 ) /* we have local entries) because firstlocal = -1 if no local entries */ { loop_num = 3; /* basically we have need to do the same code fragment repeated three times so that we can do off-proc then on proc entries - this ordering is because creating the linked list for overlapping boxes */ myfinish = proc_offsets[hypre_BoxManLocalProcOffset(manager) + 1]; /* #1 do off proc. entries - lower range */ start_loop[0] = 0; end_loop[0] = mystart; /* #2 do off proc. entries - upper range */ start_loop[1] = myfinish; end_loop[1] = nentries; /* #3 do ON proc. entries */ start_loop[2] = mystart; end_loop[2] = myfinish; } else /* no on-proc entries */ { loop_num = 1; start_loop[0] = 0; end_loop[0] = nentries; } for (loop = 0; loop < loop_num; loop++) { for (range = start_loop[loop]; range < end_loop[loop]; range++) { entry = &entries[range]; entry_imin = hypre_BoxManEntryIMin(entry); entry_imax = hypre_BoxManEntryIMax(entry); /* find the indexes corresponding to the current box - put in imin and imax */ for (d = 0; d < ndim; d++) { /* need to go to size[d] because that contains the last element */ location = hypre_BinarySearch2( indexes[d], hypre_IndexD(entry_imin, d), 0, size[d], &spot); hypre_IndexD(imin, d) = location; location = hypre_BinarySearch2( indexes[d], hypre_IndexD(entry_imax, d) + 1, 0, size[d], &spot); hypre_IndexD(imax, d) = location - 1; } /* now have imin and imax location in index array*/ /* set up index table */ hypre_BoxSetExtents(index_box, imin, imax); hypre_BoxGetSize(index_box, loop_size); hypre_SerialBoxLoop1Begin(ndim, loop_size, table_box, imin, stride, ii); { if (!index_table[ii]) /* no entry- add one */ { index_table[ii] = entry; } else /* already an entry there - so add to link list for BoxMapEntry - overlapping */ { hypre_BoxManEntryNext(entry) = index_table[ii]; index_table[ii] = entry; } } hypre_SerialBoxLoop1End(ii); } /* end of subset of entries */ }/* end of three loops over subsets */ /* done with the index_table! */ hypre_TFree( hypre_BoxManIndexTable(manager), HYPRE_MEMORY_HOST); /* in case this is a re-assemble - shouldn't be though */ hypre_BoxManIndexTable(manager) = index_table; for (d = 0; d < ndim; d++) { hypre_TFree(hypre_BoxManIndexesD(manager, d), HYPRE_MEMORY_HOST); hypre_BoxManIndexesD(manager, d) = indexes[d]; hypre_BoxManSizeD(manager, d) = size[d]; hypre_BoxManLastIndexD(manager, d) = 0; } hypre_BoxDestroy(index_box); hypre_BoxDestroy(table_box); } /* end of building index table group */ /* clean up and update*/ hypre_BoxManNEntries(manager) = nentries; hypre_BoxManEntries(manager) = entries; hypre_BoxManIsGatherCalled(manager) = 0; hypre_BoxArrayDestroy(gather_regions); hypre_BoxManGatherRegions(manager) = hypre_BoxArrayCreate(0, ndim); hypre_BoxManIsAssembled(manager) = 1; return hypre_error_flag; } /*-------------------------------------------------------------------------- * Given a box (lower and upper indices), return a list of boxes in the global * grid that are intersected by this box. The user must insure that a processor * owns the correct global information to do the intersection. For now this is * virtually the same as the box map intersect. * * Notes: * * (1) This function can also be used in the way that hypre_BoxMapFindEntry was * previously used - just pass in iupper=ilower. * * (2) return NULL for entries if none are found * *--------------------------------------------------------------------------*/ HYPRE_Int hypre_BoxManIntersect ( hypre_BoxManager *manager, hypre_Index ilower, hypre_Index iupper, hypre_BoxManEntry ***entries_ptr, HYPRE_Int *nentries_ptr ) { HYPRE_Int ndim = hypre_BoxManNDim(manager); HYPRE_Int d; HYPRE_Int find_index_d, current_index_d; HYPRE_Int *man_indexes_d; HYPRE_Int man_index_size_d; HYPRE_Int nentries; HYPRE_Int *marker, position; hypre_Box *index_box, *table_box; hypre_Index stride, loop_size; hypre_Index man_ilower, man_iupper; hypre_BoxManEntry **index_table; hypre_BoxManEntry **entries; hypre_BoxManEntry *entry; #if 0 HYPRE_Int i, cnt; HYPRE_Int *proc_ids, *ids, *unsort; HYPRE_Int tmp_id, start; #endif /* can only use after assembling */ if (!hypre_BoxManIsAssembled(manager)) { hypre_error_in_arg(1); return hypre_error_flag; } /* Check whether the box manager contains any entries */ if (hypre_BoxManNEntries(manager) == 0) { *entries_ptr = NULL; *nentries_ptr = 0; return hypre_error_flag; } /* Loop through each dimension */ for (d = 0; d < ndim; d++) { /* Initialize */ man_ilower[d] = 0; man_iupper[d] = 0; man_indexes_d = hypre_BoxManIndexesD(manager, d); man_index_size_d = hypre_BoxManSizeD(manager, d); /* -----find location of ilower[d] in indexes-----*/ find_index_d = hypre_IndexD(ilower, d); /* Start looking in place indicated by last_index stored in map */ current_index_d = hypre_BoxManLastIndexD(manager, d); /* Loop downward if target index is less than current location */ while ( (current_index_d >= 0 ) && (find_index_d < man_indexes_d[current_index_d]) ) { current_index_d --; } /* Loop upward if target index is greater than current location */ while ( (current_index_d <= (man_index_size_d - 1)) && (find_index_d >= man_indexes_d[current_index_d + 1]) ) { current_index_d ++; } if ( current_index_d > (man_index_size_d - 1) ) { *entries_ptr = NULL; *nentries_ptr = 0; return hypre_error_flag; } else { man_ilower[d] = hypre_max(current_index_d, 0); } /* -----find location of iupper[d] in indexes-----*/ find_index_d = hypre_IndexD(iupper, d); /* Loop upward if target index is greater than current location */ while ( (current_index_d <= (man_index_size_d - 1)) && (find_index_d >= man_indexes_d[current_index_d + 1]) ) { current_index_d ++; } if ( current_index_d < 0 ) { *entries_ptr = NULL; *nentries_ptr = 0; return hypre_error_flag; } else { man_iupper[d] = hypre_min(current_index_d, (man_index_size_d - 1)); } } /*----------------------------------------------------------------- * If we reach this point, then set up the entries array. * Use a marker array to ensure unique entries. *-----------------------------------------------------------------*/ nentries = hypre_BoxManMaxNEntries(manager); entries = hypre_CTAlloc(hypre_BoxManEntry *, nentries, HYPRE_MEMORY_HOST); /* realloc below */ marker = hypre_CTAlloc(HYPRE_Int, nentries, HYPRE_MEMORY_HOST); index_table = hypre_BoxManIndexTable(manager); nentries = 0; table_box = hypre_BoxCreate(ndim); index_box = hypre_BoxCreate(ndim); hypre_SetIndex(stride, 1); hypre_BoxSetExtents(table_box, stride, hypre_BoxManSize(manager)); hypre_BoxShiftNeg(table_box, stride); /* Want box to start at 0*/ hypre_BoxSetExtents(index_box, man_ilower, man_iupper); hypre_BoxGetSize(index_box, loop_size); hypre_SerialBoxLoop1Begin(ndim, loop_size, table_box, man_ilower, stride, ii); { entry = index_table[ii]; while (entry != NULL) { position = hypre_BoxManEntryPosition(entry); if (marker[position] == 0) /* Add entry and mark as added */ { entries[nentries] = entry; marker[position] = 1; nentries++; } entry = hypre_BoxManEntryNext(entry); } } hypre_SerialBoxLoop1End(ii); entries = hypre_TReAlloc(entries, hypre_BoxManEntry *, nentries, HYPRE_MEMORY_HOST); /* Reset the last index in the manager */ for (d = 0; d < ndim; d++) { hypre_BoxManLastIndexD(manager, d) = man_ilower[d]; } hypre_BoxDestroy(table_box); hypre_BoxDestroy(index_box); hypre_TFree(marker, HYPRE_MEMORY_HOST); *entries_ptr = entries; *nentries_ptr = nentries; return hypre_error_flag; } /****************************************************************************** * contact message is null. need to return the (proc) id of each box in our * assumed partition. * * 1/07 - just returning distinct proc ids. *****************************************************************************/ HYPRE_Int hypre_FillResponseBoxManAssemble1( void *p_recv_contact_buf, HYPRE_Int contact_size, HYPRE_Int contact_proc, void *ro, MPI_Comm comm, void **p_send_response_buf, HYPRE_Int *response_message_size ) { HYPRE_UNUSED_VAR(p_recv_contact_buf); HYPRE_UNUSED_VAR(contact_size); HYPRE_UNUSED_VAR(contact_proc); HYPRE_Int myid, i, index; HYPRE_Int size, num_boxes, num_objects; HYPRE_Int *proc_ids; HYPRE_Int *send_response_buf = (HYPRE_Int *) *p_send_response_buf; hypre_DataExchangeResponse *response_obj = (hypre_DataExchangeResponse *)ro; hypre_StructAssumedPart *ap = (hypre_StructAssumedPart *)response_obj->data1; HYPRE_Int overhead = response_obj->send_response_overhead; /* initialize stuff */ hypre_MPI_Comm_rank(comm, &myid ); proc_ids = hypre_StructAssumedPartMyPartitionProcIds(ap); /* we need to send back the list of all the processor ids for the boxes */ /* NOTE: in the AP, boxes with the same proc id are adjacent (but proc ids not in any sorted order) */ /* how many boxes do we have in the AP?*/ num_boxes = hypre_StructAssumedPartMyPartitionIdsSize(ap); /* how many procs do we have in the AP?*/ num_objects = hypre_StructAssumedPartMyPartitionNumDistinctProcs(ap); /* num_objects is then how much we need to send*/ /* check storage in send_buf for adding the information */ /* note: we are returning objects that are 1 ints in size */ if ( response_obj->send_response_storage < num_objects ) { response_obj->send_response_storage = hypre_max(num_objects, 10); size = 1 * (response_obj->send_response_storage + overhead); send_response_buf = hypre_TReAlloc( send_response_buf, HYPRE_Int, size, HYPRE_MEMORY_HOST); *p_send_response_buf = send_response_buf; } /* populate send_response_buf with distinct proc ids*/ index = 0; if (num_objects > 0) { send_response_buf[index++] = proc_ids[0]; } for (i = 1; i < num_boxes && index < num_objects; i++) { /* processor id */ if (proc_ids[i] != proc_ids[i - 1]) { send_response_buf[index++] = proc_ids[i]; } } /* return variables */ *response_message_size = num_objects; *p_send_response_buf = send_response_buf; return hypre_error_flag; } /****************************************************************************** * contact message is null. the response needs to be the all our entries (with * id = myid). *****************************************************************************/ HYPRE_Int hypre_FillResponseBoxManAssemble2( void *p_recv_contact_buf, HYPRE_Int contact_size, HYPRE_Int contact_proc, void *ro, MPI_Comm comm, void **p_send_response_buf, HYPRE_Int *response_message_size ) { HYPRE_UNUSED_VAR(p_recv_contact_buf); HYPRE_UNUSED_VAR(contact_size); HYPRE_UNUSED_VAR(contact_proc); HYPRE_Int myid, i, d, size, position; HYPRE_Int proc_id, box_id, tmp_int; HYPRE_Int entry_size_bytes; hypre_BoxManEntry *entry; hypre_IndexRef index; void *info, *index_ptr; void *send_response_buf = (void *) *p_send_response_buf; hypre_DataExchangeResponse *response_obj = (hypre_DataExchangeResponse *)ro; hypre_BoxManager *manager = (hypre_BoxManager *)response_obj->data1; HYPRE_Int overhead = response_obj->send_response_overhead; HYPRE_Int ndim = hypre_BoxManNDim(manager); hypre_BoxManEntry **my_entries = hypre_BoxManMyEntries(manager) ; HYPRE_Int num_my_entries = hypre_BoxManNumMyEntries(manager); /*initialize stuff */ hypre_MPI_Comm_rank(comm, &myid ); entry_size_bytes = 8 * sizeof(HYPRE_Int) + hypre_BoxManEntryInfoSize(manager); /* num_my_entries is the amount of information to send */ /*check storage in send_buf for adding the information */ if ( response_obj->send_response_storage < num_my_entries ) { response_obj->send_response_storage = num_my_entries; size = entry_size_bytes * (response_obj->send_response_storage + overhead); send_response_buf = hypre_TReAlloc( (char*)send_response_buf, char, size, HYPRE_MEMORY_HOST); *p_send_response_buf = send_response_buf; } index_ptr = send_response_buf; /* step through send_buf with this pointer */ for (i = 0; i < num_my_entries; i++) { entry = my_entries[i]; /*pack response buffer with information */ size = sizeof(HYPRE_Int); /* imin */ index = hypre_BoxManEntryIMin(entry); for (d = 0; d < ndim; d++) { tmp_int = hypre_IndexD(index, d); hypre_TMemcpy( index_ptr, &tmp_int, HYPRE_Int, 1, HYPRE_MEMORY_HOST, HYPRE_MEMORY_HOST); index_ptr = (void *) ((char *) index_ptr + size); } /* imax */ index = hypre_BoxManEntryIMax(entry); for (d = 0; d < ndim; d++) { tmp_int = hypre_IndexD(index, d); hypre_TMemcpy( index_ptr, &tmp_int, HYPRE_Int, 1, HYPRE_MEMORY_HOST, HYPRE_MEMORY_HOST); index_ptr = (void *) ((char *) index_ptr + size); } /* proc */ proc_id = hypre_BoxManEntryProc(entry); hypre_TMemcpy( index_ptr, &proc_id, HYPRE_Int, 1, HYPRE_MEMORY_HOST, HYPRE_MEMORY_HOST); index_ptr = (void *) ((char *) index_ptr + size); /* id */ box_id = hypre_BoxManEntryId(entry); hypre_TMemcpy( index_ptr, &box_id, HYPRE_Int, 1, HYPRE_MEMORY_HOST, HYPRE_MEMORY_HOST); index_ptr = (void *) ((char *) index_ptr + size); /*info*/ size = hypre_BoxManEntryInfoSize(manager); position = hypre_BoxManEntryPosition(entry); info = hypre_BoxManInfoObject(manager, position); hypre_TMemcpy(index_ptr, info, char, size, HYPRE_MEMORY_HOST, HYPRE_MEMORY_HOST); index_ptr = (void *) ((char *) index_ptr + size); } /* now send_response_buf is full */ /* return variable */ *response_message_size = num_my_entries; *p_send_response_buf = send_response_buf; return hypre_error_flag; } hypre-2.33.0/src/struct_mv/box_manager.h000066400000000000000000000227161477326011500202140ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #ifndef hypre_BOX_MANAGER_HEADER #define hypre_BOX_MANAGER_HEADER /*-------------------------------------------------------------------------- * BoxManEntry *--------------------------------------------------------------------------*/ typedef struct hypre_BoxManEntry_struct { hypre_Index imin; /* Extents of box */ hypre_Index imax; HYPRE_Int ndim; /* Number of dimensions */ HYPRE_Int proc; /* This is a two-part unique id: (proc, id) */ HYPRE_Int id; HYPRE_Int num_ghost[2 * HYPRE_MAXDIM]; HYPRE_Int position; /* This indicates the location of the entry in the the * box manager entries array and is used for pairing with * the info object (populated in addentry) */ void *boxman; /* The owning manager (populated in addentry) */ struct hypre_BoxManEntry_struct *next; } hypre_BoxManEntry; /*--------------------------------------------------------------------------- * Box Manager: organizes arbitrary information in a spatial way *----------------------------------------------------------------------------*/ typedef struct { MPI_Comm comm; HYPRE_Int max_nentries; /* storage allocated for entries */ HYPRE_Int is_gather_called; /* Boolean to indicate whether GatherEntries function has been called (prior to assemble) - may not want this (can tell by the size of gather_regions array) */ hypre_BoxArray *gather_regions; /* This is where we collect boxes input by calls to BoxManGatherEntries - to be gathered in the assemble. These are then deleted after the assemble */ HYPRE_Int all_global_known; /* Boolean to say that every processor already has all of the global data for this manager (this could be accessed by a coarsening routine, for example) */ HYPRE_Int is_entries_sort; /* Boolean to say that entries were added in sorted order (id, proc) (this could be accessed by a coarsening routine, for example) */ HYPRE_Int entry_info_size; /* In bytes, the (max) size of the info object for the entries */ HYPRE_Int is_assembled; /* Flag to indicate if the box manager has been assembled (used to control whether or not functions can be used prior to assemble) */ /* Storing the entries */ HYPRE_Int nentries; /* Number of entries stored */ hypre_BoxManEntry *entries; /* Actual box manager entries - sorted by (proc, id) at the end of the assemble) */ HYPRE_Int *procs_sort; /* The sorted procs corresponding to entries */ HYPRE_Int *ids_sort; /* Sorted ids corresponding to the entries */ HYPRE_Int num_procs_sort; /* Number of distinct procs in entries */ HYPRE_Int *procs_sort_offsets; /* Offsets for procs into the entry_sort array */ HYPRE_Int first_local; /* Position of local infomation in entries */ HYPRE_Int local_proc_offset; /* Position of local information in offsets */ /* Here is the table that organizes the entries spatially (by index) */ hypre_BoxManEntry **index_table; /* This points into 'entries' array and corresponds to the index arays */ HYPRE_Int *indexes[HYPRE_MAXDIM]; /* Indexes (ordered) for imin and imax of each box in the entries array */ HYPRE_Int size[HYPRE_MAXDIM]; /* How many indexes in each direction */ HYPRE_Int last_index[HYPRE_MAXDIM]; /* Last index used in the indexes map */ HYPRE_Int num_my_entries; /* Num entries with proc_id = myid */ HYPRE_Int *my_ids; /* Array of ids corresponding to my entries */ hypre_BoxManEntry **my_entries; /* Points into entries that are mine and corresponds to my_ids array. This is destroyed in the assemble. */ void *info_objects; /* Array of info objects (each of size entry_info_size), managed byte-wise */ hypre_StructAssumedPart *assumed_partition; /* The assumed partition object. For now this is only used during the assemble (where it is created). */ HYPRE_Int ndim; /* Problem dimension (known in the grid) */ hypre_Box *bounding_box; /* Bounding box from associated grid */ HYPRE_Int next_id; /* Counter to indicate the next id that would be unique (regardless of proc id) */ /* Ghost stuff */ HYPRE_Int num_ghost[2 * HYPRE_MAXDIM]; } hypre_BoxManager; /*-------------------------------------------------------------------------- * Accessor macros: hypre_BoxMan *--------------------------------------------------------------------------*/ #define hypre_BoxManComm(manager) ((manager) -> comm) #define hypre_BoxManMaxNEntries(manager) ((manager) -> max_nentries) #define hypre_BoxManIsGatherCalled(manager) ((manager) -> is_gather_called) #define hypre_BoxManIsEntriesSort(manager) ((manager) -> is_entries_sort) #define hypre_BoxManGatherRegions(manager) ((manager) -> gather_regions) #define hypre_BoxManAllGlobalKnown(manager) ((manager) -> all_global_known) #define hypre_BoxManEntryInfoSize(manager) ((manager) -> entry_info_size) #define hypre_BoxManNEntries(manager) ((manager) -> nentries) #define hypre_BoxManEntries(manager) ((manager) -> entries) #define hypre_BoxManInfoObjects(manager) ((manager) -> info_objects) #define hypre_BoxManIsAssembled(manager) ((manager) -> is_assembled) #define hypre_BoxManProcsSort(manager) ((manager) -> procs_sort) #define hypre_BoxManIdsSort(manager) ((manager) -> ids_sort) #define hypre_BoxManNumProcsSort(manager) ((manager) -> num_procs_sort) #define hypre_BoxManProcsSortOffsets(manager) ((manager) -> procs_sort_offsets) #define hypre_BoxManLocalProcOffset(manager) ((manager) -> local_proc_offset) #define hypre_BoxManFirstLocal(manager) ((manager) -> first_local) #define hypre_BoxManIndexTable(manager) ((manager) -> index_table) #define hypre_BoxManIndexes(manager) ((manager) -> indexes) #define hypre_BoxManSize(manager) ((manager) -> size) #define hypre_BoxManLastIndex(manager) ((manager) -> last_index) #define hypre_BoxManNumMyEntries(manager) ((manager) -> num_my_entries) #define hypre_BoxManMyIds(manager) ((manager) -> my_ids) #define hypre_BoxManMyEntries(manager) ((manager) -> my_entries) #define hypre_BoxManAssumedPartition(manager) ((manager) -> assumed_partition) #define hypre_BoxManNDim(manager) ((manager) -> ndim) #define hypre_BoxManBoundingBox(manager) ((manager) -> bounding_box) #define hypre_BoxManNextId(manager) ((manager) -> next_id) #define hypre_BoxManNumGhost(manager) ((manager) -> num_ghost) #define hypre_BoxManIndexesD(manager, d) hypre_BoxManIndexes(manager)[d] #define hypre_BoxManSizeD(manager, d) hypre_BoxManSize(manager)[d] #define hypre_BoxManLastIndexD(manager, d) hypre_BoxManLastIndex(manager)[d] #define hypre_BoxManInfoObject(manager, i) \ (void *) ((char *)hypre_BoxManInfoObjects(manager) + i* hypre_BoxManEntryInfoSize(manager)) /*-------------------------------------------------------------------------- * Accessor macros: hypre_BoxManEntry *--------------------------------------------------------------------------*/ #define hypre_BoxManEntryIMin(entry) ((entry) -> imin) #define hypre_BoxManEntryIMax(entry) ((entry) -> imax) #define hypre_BoxManEntryNDim(entry) ((entry) -> ndim) #define hypre_BoxManEntryProc(entry) ((entry) -> proc) #define hypre_BoxManEntryId(entry) ((entry) -> id) #define hypre_BoxManEntryPosition(entry) ((entry) -> position) #define hypre_BoxManEntryNumGhost(entry) ((entry) -> num_ghost) #define hypre_BoxManEntryNext(entry) ((entry) -> next) #define hypre_BoxManEntryBoxMan(entry) ((entry) -> boxman) #endif hypre-2.33.0/src/struct_mv/boxloop_cuda.h000066400000000000000000000632041477326011500204050ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * Header info for the BoxLoop * *****************************************************************************/ /*-------------------------------------------------------------------------- * BoxLoop macros: *--------------------------------------------------------------------------*/ #ifndef HYPRE_BOXLOOP_CUDA_HEADER #define HYPRE_BOXLOOP_CUDA_HEADER #if (defined(HYPRE_USING_CUDA) || defined(HYPRE_USING_HIP)) && !defined(HYPRE_USING_RAJA) && !defined(HYPRE_USING_KOKKOS) #define HYPRE_LAMBDA [=] __host__ __device__ /* TODO: RL: support 4-D */ typedef struct hypre_Boxloop_struct { HYPRE_Int lsize0, lsize1, lsize2; HYPRE_Int strides0, strides1, strides2; HYPRE_Int bstart0, bstart1, bstart2; HYPRE_Int bsize0, bsize1, bsize2; } hypre_Boxloop; #ifdef __cplusplus extern "C++" { #endif /* ------------------------- * parfor-loop * ------------------------*/ template __global__ void forall_kernel( hypre_DeviceItem & item, LOOP_BODY loop_body, HYPRE_Int length ) { const HYPRE_Int idx = hypre_gpu_get_grid_thread_id<1, 1>(item); /* const HYPRE_Int number_threads = hypre_gpu_get_grid_num_threads<1,1>(item); */ if (idx < length) { loop_body(idx); } } template void BoxLoopforall( HYPRE_Int length, LOOP_BODY loop_body ) { const HYPRE_MemoryLocation memory_location = hypre_HandleMemoryLocation(hypre_handle()); const HYPRE_ExecutionPolicy exec_policy = hypre_GetExecPolicy1(memory_location); if (exec_policy == HYPRE_EXEC_HOST) { #ifdef HYPRE_USING_OPENMP #pragma omp parallel for HYPRE_SMP_SCHEDULE #endif for (HYPRE_Int idx = 0; idx < length; idx++) { loop_body(idx); } } else if (exec_policy == HYPRE_EXEC_DEVICE) { const dim3 bDim = hypre_GetDefaultDeviceBlockDimension(); const dim3 gDim = hypre_GetDefaultDeviceGridDimension(length, "thread", bDim); HYPRE_GPU_LAUNCH( forall_kernel, gDim, bDim, loop_body, length ); } } /* ------------------------------ * parforreduction-loop * -----------------------------*/ template __global__ void reductionforall_kernel( hypre_DeviceItem & item, HYPRE_Int length, REDUCER reducer, LOOP_BODY loop_body ) { const HYPRE_Int thread_id = hypre_gpu_get_grid_thread_id<1, 1>(item); const HYPRE_Int n_threads = hypre_gpu_get_grid_num_threads<1, 1>(item); for (HYPRE_Int idx = thread_id; idx < length; idx += n_threads) { loop_body(idx, reducer); } /* reduction in block-level and the save the results in reducer */ reducer.BlockReduce(); } template void ReductionBoxLoopforall( HYPRE_Int length, REDUCER & reducer, LOOP_BODY loop_body ) { if (length <= 0) { return; } const HYPRE_MemoryLocation memory_location = hypre_HandleMemoryLocation(hypre_handle()); const HYPRE_ExecutionPolicy exec_policy = hypre_GetExecPolicy1(memory_location); if (exec_policy == HYPRE_EXEC_HOST) { for (HYPRE_Int idx = 0; idx < length; idx++) { loop_body(idx, reducer); } } else if (exec_policy == HYPRE_EXEC_DEVICE) { /* Assume gDim cannot exceed HYPRE_MAX_NTHREADS_BLOCK (the max size for the 2nd reduction) * and bDim <= WARP * WARP (because we use 1 warp fro the block-level reduction) */ const dim3 bDim = hypre_GetDefaultDeviceBlockDimension(); dim3 gDim = hypre_GetDefaultDeviceGridDimension(length, "thread", bDim); gDim.x = hypre_min(gDim.x, HYPRE_MAX_NTHREADS_BLOCK); reducer.nblocks = gDim.x; reducer.Allocate2ndPhaseBuffer(); /* hypre_printf("length= %d, blocksize = %d, gridsize = %d\n", length, bDim.x, gDim.x); */ HYPRE_GPU_LAUNCH( reductionforall_kernel, gDim, bDim, length, reducer, loop_body ); } } #ifdef __cplusplus } #endif /* Get 1-D length of the loop, in hypre__tot */ #define hypre_newBoxLoopInit(ndim, loop_size) \ HYPRE_Int hypre__tot = 1; \ for (HYPRE_Int hypre_d = 0; hypre_d < ndim; hypre_d ++) \ { \ hypre__tot *= loop_size[hypre_d]; \ } /* Initialize struct for box-k */ #define hypre_BoxLoopDataDeclareK(k, ndim, loop_size, dbox, start, stride) \ hypre_Boxloop databox##k; \ /* dim 0 */ \ databox##k.lsize0 = loop_size[0]; \ databox##k.strides0 = stride[0]; \ databox##k.bstart0 = start[0] - dbox->imin[0]; \ databox##k.bsize0 = dbox->imax[0] - dbox->imin[0]; \ /* dim 1 */ \ if (ndim > 1) \ { \ databox##k.lsize1 = loop_size[1]; \ databox##k.strides1 = stride[1]; \ databox##k.bstart1 = start[1] - dbox->imin[1]; \ databox##k.bsize1 = dbox->imax[1] - dbox->imin[1]; \ } \ else \ { \ databox##k.lsize1 = 1; \ databox##k.strides1 = 0; \ databox##k.bstart1 = 0; \ databox##k.bsize1 = 0; \ } \ /* dim 2 */ \ if (ndim == 3) \ { \ databox##k.lsize2 = loop_size[2]; \ databox##k.strides2 = stride[2]; \ databox##k.bstart2 = start[2] - dbox->imin[2]; \ databox##k.bsize2 = dbox->imax[2] - dbox->imin[2]; \ } \ else \ { \ databox##k.lsize2 = 1; \ databox##k.strides2 = 0; \ databox##k.bstart2 = 0; \ databox##k.bsize2 = 0; \ } #define hypre_BasicBoxLoopDataDeclareK(k,ndim,loop_size,stride) \ hypre_Boxloop databox##k; \ databox##k.lsize0 = loop_size[0]; \ databox##k.strides0 = stride[0]; \ databox##k.bstart0 = 0; \ databox##k.bsize0 = 0; \ if (ndim > 1) \ { \ databox##k.lsize1 = loop_size[1]; \ databox##k.strides1 = stride[1]; \ databox##k.bstart1 = 0; \ databox##k.bsize1 = 0; \ } \ else \ { \ databox##k.lsize1 = 1; \ databox##k.strides1 = 0; \ databox##k.bstart1 = 0; \ databox##k.bsize1 = 0; \ } \ if (ndim == 3) \ { \ databox##k.lsize2 = loop_size[2]; \ databox##k.strides2 = stride[2]; \ databox##k.bstart2 = 0; \ databox##k.bsize2 = 0; \ } \ else \ { \ databox##k.lsize2 = 1; \ databox##k.strides2 = 0; \ databox##k.bstart2 = 0; \ databox##k.bsize2 = 0; \ } /* RL: TODO loop_size out of box struct, bsize +1 */ /* Given input 1-D 'idx' in box, get 3-D 'local_idx' in loop_size */ #define hypre_newBoxLoopDeclare(box) \ hypre_Index local_idx; \ HYPRE_Int idx_local = idx; \ hypre_IndexD(local_idx, 0) = idx_local % box.lsize0; \ idx_local = idx_local / box.lsize0; \ hypre_IndexD(local_idx, 1) = idx_local % box.lsize1; \ idx_local = idx_local / box.lsize1; \ hypre_IndexD(local_idx, 2) = idx_local % box.lsize2; \ /* Given input 3-D 'local_idx', get 1-D 'hypre__i' in 'box' */ #define hypre_BoxLoopIncK(k, box, hypre__i) \ HYPRE_Int hypre_boxD##k = 1; \ HYPRE_Int hypre__i = 0; \ hypre__i += (hypre_IndexD(local_idx, 0) * box.strides0 + box.bstart0) * hypre_boxD##k; \ hypre_boxD##k *= hypre_max(0, box.bsize0 + 1); \ hypre__i += (hypre_IndexD(local_idx, 1) * box.strides1 + box.bstart1) * hypre_boxD##k; \ hypre_boxD##k *= hypre_max(0, box.bsize1 + 1); \ hypre__i += (hypre_IndexD(local_idx, 2) * box.strides2 + box.bstart2) * hypre_boxD##k; \ hypre_boxD##k *= hypre_max(0, box.bsize2 + 1); /* get 3-D local_idx into 'index' */ #define hypre_BoxLoopGetIndexCUDA(index) \ index[0] = hypre_IndexD(local_idx, 0); \ index[1] = hypre_IndexD(local_idx, 1); \ index[2] = hypre_IndexD(local_idx, 2); /* BoxLoop 0 */ #define hypre_BoxLoop0BeginCUDA(ndim, loop_size) \ { \ hypre_newBoxLoopInit(ndim, loop_size); \ BoxLoopforall(hypre__tot, HYPRE_LAMBDA (HYPRE_Int idx) \ { #define hypre_BoxLoop0EndCUDA() \ }); \ } /* BoxLoop 1 */ #define hypre_BoxLoop1BeginCUDA(ndim, loop_size, dbox1, start1, stride1, i1) \ { \ hypre_newBoxLoopInit(ndim, loop_size); \ hypre_BoxLoopDataDeclareK(1, ndim, loop_size, dbox1, start1, stride1); \ BoxLoopforall(hypre__tot, HYPRE_LAMBDA (HYPRE_Int idx) \ { \ hypre_newBoxLoopDeclare(databox1); \ hypre_BoxLoopIncK(1, databox1, i1); #define hypre_BoxLoop1EndCUDA(i1) \ }); \ } /* BoxLoop 2 */ #define hypre_BoxLoop2BeginCUDA(ndim, loop_size, dbox1, start1, stride1, i1, \ dbox2, start2, stride2, i2) \ { \ hypre_newBoxLoopInit(ndim, loop_size); \ hypre_BoxLoopDataDeclareK(1, ndim, loop_size, dbox1, start1, stride1); \ hypre_BoxLoopDataDeclareK(2, ndim, loop_size, dbox2, start2, stride2); \ BoxLoopforall(hypre__tot, HYPRE_LAMBDA (HYPRE_Int idx) \ { \ hypre_newBoxLoopDeclare(databox1); \ hypre_BoxLoopIncK(1, databox1, i1); \ hypre_BoxLoopIncK(2, databox2, i2); #define hypre_BoxLoop2EndCUDA(i1, i2) \ }); \ } /* BoxLoop 3 */ #define hypre_BoxLoop3BeginCUDA(ndim, loop_size, dbox1, start1, stride1, i1, \ dbox2, start2, stride2, i2, \ dbox3, start3, stride3, i3) \ { \ hypre_newBoxLoopInit(ndim, loop_size); \ hypre_BoxLoopDataDeclareK(1, ndim,loop_size, dbox1, start1, stride1); \ hypre_BoxLoopDataDeclareK(2, ndim,loop_size, dbox2, start2, stride2); \ hypre_BoxLoopDataDeclareK(3, ndim,loop_size, dbox3, start3, stride3); \ BoxLoopforall(hypre__tot, HYPRE_LAMBDA (HYPRE_Int idx) \ { \ hypre_newBoxLoopDeclare(databox1); \ hypre_BoxLoopIncK(1, databox1, i1); \ hypre_BoxLoopIncK(2, databox2, i2); \ hypre_BoxLoopIncK(3, databox3, i3); #define hypre_BoxLoop3EndCUDA(i1, i2, i3) \ }); \ } /* BoxLoop 4 */ #define hypre_BoxLoop4BeginCUDA(ndim, loop_size, dbox1, start1, stride1, i1, \ dbox2, start2, stride2, i2, \ dbox3, start3, stride3, i3, \ dbox4, start4, stride4, i4) \ { \ hypre_newBoxLoopInit(ndim, loop_size); \ hypre_BoxLoopDataDeclareK(1, ndim, loop_size, dbox1, start1, stride1); \ hypre_BoxLoopDataDeclareK(2, ndim, loop_size, dbox2, start2, stride2); \ hypre_BoxLoopDataDeclareK(3, ndim, loop_size, dbox3, start3, stride3); \ hypre_BoxLoopDataDeclareK(4, ndim, loop_size, dbox4, start4, stride4); \ BoxLoopforall(hypre__tot, HYPRE_LAMBDA (HYPRE_Int idx) \ { \ hypre_newBoxLoopDeclare(databox1); \ hypre_BoxLoopIncK(1, databox1, i1); \ hypre_BoxLoopIncK(2, databox2, i2); \ hypre_BoxLoopIncK(3, databox3, i3); \ hypre_BoxLoopIncK(4, databox4, i4); #define hypre_BoxLoop4EndCUDA(i1, i2, i3, i4) \ }); \ } /* Basic BoxLoops have no boxes */ /* BoxLoop 1 */ #define hypre_BasicBoxLoop1BeginCUDA(ndim, loop_size, stride1, i1) \ { \ hypre_newBoxLoopInit(ndim, loop_size); \ hypre_BasicBoxLoopDataDeclareK(1, ndim, loop_size, stride1); \ BoxLoopforall(hypre__tot, HYPRE_LAMBDA (HYPRE_Int idx) \ { \ hypre_newBoxLoopDeclare(databox1); \ hypre_BoxLoopIncK(1, databox1, i1); /* BoxLoop 2 */ #define hypre_BasicBoxLoop2BeginCUDA(ndim, loop_size, stride1, i1, stride2, i2) \ { \ hypre_newBoxLoopInit(ndim, loop_size); \ hypre_BasicBoxLoopDataDeclareK(1, ndim, loop_size, stride1); \ hypre_BasicBoxLoopDataDeclareK(2, ndim, loop_size, stride2); \ BoxLoopforall(hypre__tot, HYPRE_LAMBDA (HYPRE_Int idx) \ { \ hypre_newBoxLoopDeclare(databox1); \ hypre_BoxLoopIncK(1, databox1, i1); \ hypre_BoxLoopIncK(2, databox2, i2); \ /* Parallel for-loop */ #define hypre_LoopBeginCUDA(size, idx) \ { \ BoxLoopforall(size, HYPRE_LAMBDA (HYPRE_Int idx) \ { #define hypre_LoopEndCUDA() \ }); \ } /* Reduction BoxLoop1 */ #define hypre_BoxLoop1ReductionBeginCUDA(ndim, loop_size, dbox1, start1, stride1, i1, reducesum) \ { \ hypre_newBoxLoopInit(ndim, loop_size); \ hypre_BoxLoopDataDeclareK(1, ndim, loop_size, dbox1, start1, stride1); \ ReductionBoxLoopforall(hypre__tot, reducesum, HYPRE_LAMBDA (HYPRE_Int idx, decltype(reducesum) &reducesum) \ { \ hypre_newBoxLoopDeclare(databox1); \ hypre_BoxLoopIncK(1, databox1, i1); #define hypre_BoxLoop1ReductionEndCUDA(i1, reducesum) \ }); \ } /* Reduction BoxLoop2 */ #define hypre_BoxLoop2ReductionBeginCUDA(ndim, loop_size, dbox1, start1, stride1, i1, \ dbox2, start2, stride2, i2, reducesum) \ { \ hypre_newBoxLoopInit(ndim, loop_size); \ hypre_BoxLoopDataDeclareK(1, ndim, loop_size, dbox1, start1, stride1); \ hypre_BoxLoopDataDeclareK(2, ndim, loop_size, dbox2, start2, stride2); \ ReductionBoxLoopforall(hypre__tot, reducesum, HYPRE_LAMBDA (HYPRE_Int idx, decltype(reducesum) &reducesum) \ { \ hypre_newBoxLoopDeclare(databox1); \ hypre_BoxLoopIncK(1, databox1, i1); \ hypre_BoxLoopIncK(2, databox2, i2); #define hypre_BoxLoop2ReductionEndCUDA(i1, i2, reducesum) \ }); \ } /* Renamings */ #define hypre_BoxLoopGetIndexDevice hypre_BoxLoopGetIndexCUDA #define hypre_BoxLoopBlockDevice() 0 #define hypre_BoxLoop0BeginDevice hypre_BoxLoop0BeginCUDA #define hypre_BoxLoop0EndDevice hypre_BoxLoop0EndCUDA #define hypre_BoxLoop1BeginDevice hypre_BoxLoop1BeginCUDA #define hypre_BoxLoop1EndDevice hypre_BoxLoop1EndCUDA #define hypre_BoxLoop2BeginDevice hypre_BoxLoop2BeginCUDA #define hypre_BoxLoop2EndDevice hypre_BoxLoop2EndCUDA #define hypre_BoxLoop3BeginDevice hypre_BoxLoop3BeginCUDA #define hypre_BoxLoop3EndDevice hypre_BoxLoop3EndCUDA #define hypre_BoxLoop4BeginDevice hypre_BoxLoop4BeginCUDA #define hypre_BoxLoop4EndDevice hypre_BoxLoop4EndCUDA #define hypre_BasicBoxLoop1BeginDevice hypre_BasicBoxLoop1BeginCUDA #define hypre_BasicBoxLoop2BeginDevice hypre_BasicBoxLoop2BeginCUDA #define hypre_LoopBeginDevice hypre_LoopBeginCUDA #define hypre_LoopEndDevice hypre_LoopEndCUDA #define hypre_BoxLoop1ReductionBeginDevice hypre_BoxLoop1ReductionBeginCUDA #define hypre_BoxLoop1ReductionEndDevice hypre_BoxLoop1ReductionEndCUDA #define hypre_BoxLoop2ReductionBeginDevice hypre_BoxLoop2ReductionBeginCUDA #define hypre_BoxLoop2ReductionEndDevice hypre_BoxLoop2ReductionEndCUDA //TODO TEMP FIX #define hypre_BoxLoopGetIndex hypre_BoxLoopGetIndexDevice #define hypre_BoxLoopBlock() 0 #define hypre_BoxLoop0Begin hypre_BoxLoop0BeginDevice #define hypre_BoxLoop0End hypre_BoxLoop0EndDevice #define hypre_BoxLoop1Begin hypre_BoxLoop1BeginDevice #define hypre_BoxLoop1End hypre_BoxLoop1EndDevice #define hypre_BoxLoop2Begin hypre_BoxLoop2BeginDevice #define hypre_BoxLoop2End hypre_BoxLoop2EndDevice #define hypre_BoxLoop3Begin hypre_BoxLoop3BeginDevice #define hypre_BoxLoop3End hypre_BoxLoop3EndDevice #define hypre_BoxLoop4Begin hypre_BoxLoop4BeginDevice #define hypre_BoxLoop4End hypre_BoxLoop4EndDevice #define hypre_BasicBoxLoop1Begin hypre_BasicBoxLoop1BeginDevice #define hypre_BasicBoxLoop2Begin hypre_BasicBoxLoop2BeginDevice #define hypre_LoopBegin hypre_LoopBeginDevice #define hypre_LoopEnd hypre_LoopEndDevice #define hypre_BoxLoop1ReductionBegin hypre_BoxLoop1ReductionBeginDevice #define hypre_BoxLoop1ReductionEnd hypre_BoxLoop1ReductionEndDevice #define hypre_BoxLoop2ReductionBegin hypre_BoxLoop2ReductionBeginDevice #define hypre_BoxLoop2ReductionEnd hypre_BoxLoop2ReductionEndDevice #endif #endif /* #ifndef HYPRE_BOXLOOP_CUDA_HEADER */ hypre-2.33.0/src/struct_mv/boxloop_host.h000066400000000000000000000614261477326011500204520ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * Header info for the BoxLoop * *****************************************************************************/ /*-------------------------------------------------------------------------- * BoxLoop macros: *--------------------------------------------------------------------------*/ #ifndef HYPRE_BOXLOOP_HOST_HEADER #define HYPRE_BOXLOOP_HOST_HEADER #if defined(HYPRE_USING_OPENMP) #define HYPRE_BOX_REDUCTION #define HYPRE_OMP_CLAUSE #if defined(WIN32) && defined(_MSC_VER) #define Pragma(x) __pragma(x) #else #define Pragma(x) _Pragma(HYPRE_XSTR(x)) #endif #define OMP0 Pragma(omp parallel for HYPRE_OMP_CLAUSE HYPRE_BOX_REDUCTION HYPRE_SMP_SCHEDULE) #define OMP1 Pragma(omp parallel for private(HYPRE_BOX_PRIVATE) HYPRE_OMP_CLAUSE HYPRE_BOX_REDUCTION HYPRE_SMP_SCHEDULE) #else /* #if defined(HYPRE_USING_OPENMP) */ #define OMP0 #define OMP1 #endif /* #if defined(HYPRE_USING_OPENMP) */ #define zypre_BoxLoop0Begin(ndim, loop_size) \ { \ zypre_BoxLoopDeclare(); \ zypre_BoxLoopInit(ndim, loop_size); \ OMP1 \ for (hypre__block = 0; hypre__block < hypre__num_blocks; hypre__block++) \ { \ zypre_BoxLoopSet(); \ for (hypre__J = 0; hypre__J < hypre__JN; hypre__J++) \ { \ for (hypre__I = 0; hypre__I < hypre__IN; hypre__I++) \ { #define zypre_BoxLoop0End() \ } \ zypre_BoxLoopInc1(); \ zypre_BoxLoopInc2(); \ } \ } \ } #define zypre_BoxLoop1Begin(ndim, loop_size, \ dbox1, start1, stride1, i1) \ { \ HYPRE_Int i1; \ zypre_BoxLoopDeclare(); \ zypre_BoxLoopDeclareK(1); \ zypre_BoxLoopInit(ndim, loop_size); \ zypre_BoxLoopInitK(1, dbox1, start1, stride1, i1); \ OMP1 \ for (hypre__block = 0; hypre__block < hypre__num_blocks; hypre__block++) \ { \ HYPRE_Int i1; \ zypre_BoxLoopSet(); \ zypre_BoxLoopSetK(1, i1); \ for (hypre__J = 0; hypre__J < hypre__JN; hypre__J++) \ { \ for (hypre__I = 0; hypre__I < hypre__IN; hypre__I++) \ { #define zypre_BoxLoop1End(i1) \ i1 += hypre__i0inc1; \ } \ zypre_BoxLoopInc1(); \ i1 += hypre__ikinc1[hypre__d]; \ zypre_BoxLoopInc2(); \ } \ } \ } #define zypre_BoxLoop2Begin(ndim, loop_size, \ dbox1, start1, stride1, i1, \ dbox2, start2, stride2, i2) \ { \ HYPRE_Int i1, i2; \ zypre_BoxLoopDeclare(); \ zypre_BoxLoopDeclareK(1); \ zypre_BoxLoopDeclareK(2); \ zypre_BoxLoopInit(ndim, loop_size); \ zypre_BoxLoopInitK(1, dbox1, start1, stride1, i1); \ zypre_BoxLoopInitK(2, dbox2, start2, stride2, i2); \ OMP1 \ for (hypre__block = 0; hypre__block < hypre__num_blocks; hypre__block++) \ { \ HYPRE_Int i1, i2; \ zypre_BoxLoopSet(); \ zypre_BoxLoopSetK(1, i1); \ zypre_BoxLoopSetK(2, i2); \ for (hypre__J = 0; hypre__J < hypre__JN; hypre__J++) \ { \ for (hypre__I = 0; hypre__I < hypre__IN; hypre__I++) \ { #define zypre_BoxLoop2End(i1, i2) \ i1 += hypre__i0inc1; \ i2 += hypre__i0inc2; \ } \ zypre_BoxLoopInc1(); \ i1 += hypre__ikinc1[hypre__d]; \ i2 += hypre__ikinc2[hypre__d]; \ zypre_BoxLoopInc2(); \ } \ } \ } #define zypre_BoxLoop3Begin(ndim, loop_size, \ dbox1, start1, stride1, i1, \ dbox2, start2, stride2, i2, \ dbox3, start3, stride3, i3) \ { \ HYPRE_Int i1, i2, i3; \ zypre_BoxLoopDeclare(); \ zypre_BoxLoopDeclareK(1); \ zypre_BoxLoopDeclareK(2); \ zypre_BoxLoopDeclareK(3); \ zypre_BoxLoopInit(ndim, loop_size); \ zypre_BoxLoopInitK(1, dbox1, start1, stride1, i1); \ zypre_BoxLoopInitK(2, dbox2, start2, stride2, i2); \ zypre_BoxLoopInitK(3, dbox3, start3, stride3, i3); \ OMP1 \ for (hypre__block = 0; hypre__block < hypre__num_blocks; hypre__block++) \ { \ HYPRE_Int i1, i2, i3; \ zypre_BoxLoopSet(); \ zypre_BoxLoopSetK(1, i1); \ zypre_BoxLoopSetK(2, i2); \ zypre_BoxLoopSetK(3, i3); \ for (hypre__J = 0; hypre__J < hypre__JN; hypre__J++) \ { \ for (hypre__I = 0; hypre__I < hypre__IN; hypre__I++) \ { #define zypre_BoxLoop3End(i1, i2, i3) \ i1 += hypre__i0inc1; \ i2 += hypre__i0inc2; \ i3 += hypre__i0inc3; \ } \ zypre_BoxLoopInc1(); \ i1 += hypre__ikinc1[hypre__d]; \ i2 += hypre__ikinc2[hypre__d]; \ i3 += hypre__ikinc3[hypre__d]; \ zypre_BoxLoopInc2(); \ } \ } \ } #define zypre_BoxLoop4Begin(ndim, loop_size, \ dbox1, start1, stride1, i1, \ dbox2, start2, stride2, i2, \ dbox3, start3, stride3, i3, \ dbox4, start4, stride4, i4) \ { \ HYPRE_Int i1, i2, i3, i4; \ zypre_BoxLoopDeclare(); \ zypre_BoxLoopDeclareK(1); \ zypre_BoxLoopDeclareK(2); \ zypre_BoxLoopDeclareK(3); \ zypre_BoxLoopDeclareK(4); \ zypre_BoxLoopInit(ndim, loop_size); \ zypre_BoxLoopInitK(1, dbox1, start1, stride1, i1); \ zypre_BoxLoopInitK(2, dbox2, start2, stride2, i2); \ zypre_BoxLoopInitK(3, dbox3, start3, stride3, i3); \ zypre_BoxLoopInitK(4, dbox4, start4, stride4, i4); \ OMP1 \ for (hypre__block = 0; hypre__block < hypre__num_blocks; hypre__block++) \ { \ HYPRE_Int i1, i2, i3, i4; \ zypre_BoxLoopSet(); \ zypre_BoxLoopSetK(1, i1); \ zypre_BoxLoopSetK(2, i2); \ zypre_BoxLoopSetK(3, i3); \ zypre_BoxLoopSetK(4, i4); \ for (hypre__J = 0; hypre__J < hypre__JN; hypre__J++) \ { \ for (hypre__I = 0; hypre__I < hypre__IN; hypre__I++) \ { #define zypre_BoxLoop4End(i1, i2, i3, i4) \ i1 += hypre__i0inc1; \ i2 += hypre__i0inc2; \ i3 += hypre__i0inc3; \ i4 += hypre__i0inc4; \ } \ zypre_BoxLoopInc1(); \ i1 += hypre__ikinc1[hypre__d]; \ i2 += hypre__ikinc2[hypre__d]; \ i3 += hypre__ikinc3[hypre__d]; \ i4 += hypre__ikinc4[hypre__d]; \ zypre_BoxLoopInc2(); \ } \ } \ } #define zypre_BasicBoxLoop1Begin(ndim, loop_size, \ stride1, i1) \ { \ zypre_BoxLoopDeclare(); \ zypre_BoxLoopDeclareK(1); \ zypre_BoxLoopInit(ndim, loop_size); \ zypre_BasicBoxLoopInitK(1, stride1); \ OMP1 \ for (hypre__block = 0; hypre__block < hypre__num_blocks; hypre__block++) \ { \ HYPRE_Int i1; \ zypre_BoxLoopSet(); \ zypre_BoxLoopSetK(1, i1); \ for (hypre__J = 0; hypre__J < hypre__JN; hypre__J++) \ { \ for (hypre__I = 0; hypre__I < hypre__IN; hypre__I++) \ { #define zypre_BasicBoxLoop2Begin(ndim, loop_size, \ stride1, i1, \ stride2, i2) \ { \ zypre_BoxLoopDeclare(); \ zypre_BoxLoopDeclareK(1); \ zypre_BoxLoopDeclareK(2); \ zypre_BoxLoopInit(ndim, loop_size); \ zypre_BasicBoxLoopInitK(1, stride1); \ zypre_BasicBoxLoopInitK(2, stride2); \ OMP1 \ for (hypre__block = 0; hypre__block < hypre__num_blocks; hypre__block++) \ { \ HYPRE_Int i1, i2; \ zypre_BoxLoopSet(); \ zypre_BoxLoopSetK(1, i1); \ zypre_BoxLoopSetK(2, i2); \ for (hypre__J = 0; hypre__J < hypre__JN; hypre__J++) \ { \ for (hypre__I = 0; hypre__I < hypre__IN; hypre__I++) \ { #define zypre_LoopBegin(size, idx) \ { \ HYPRE_Int idx; \ OMP0 \ for (idx = 0; idx < size; idx ++) \ { #define zypre_LoopEnd() \ } \ } /*-------------------------------------------------------------------------- * Serial BoxLoop macros: * [same as the ones above (without OMP and with SetOneBlock)] * TODO: combine them *--------------------------------------------------------------------------*/ #define hypre_SerialBoxLoop0Begin(ndim, loop_size) \ { \ zypre_BoxLoopDeclare(); \ zypre_BoxLoopInit(ndim, loop_size); \ zypre_BoxLoopSetOneBlock(); \ for (hypre__block = 0; hypre__block < hypre__num_blocks; hypre__block++) \ { \ zypre_BoxLoopSet(); \ for (hypre__J = 0; hypre__J < hypre__JN; hypre__J++) \ { \ for (hypre__I = 0; hypre__I < hypre__IN; hypre__I++) \ { #define hypre_SerialBoxLoop0End() \ } \ zypre_BoxLoopInc1(); \ zypre_BoxLoopInc2(); \ } \ } \ } #define hypre_SerialBoxLoop1Begin(ndim, loop_size, \ dbox1, start1, stride1, i1) \ { \ HYPRE_Int i1; \ zypre_BoxLoopDeclare(); \ zypre_BoxLoopDeclareK(1); \ zypre_BoxLoopInit(ndim, loop_size); \ zypre_BoxLoopInitK(1, dbox1, start1, stride1, i1); \ zypre_BoxLoopSetOneBlock(); \ for (hypre__block = 0; hypre__block < hypre__num_blocks; hypre__block++) \ { \ zypre_BoxLoopSet(); \ zypre_BoxLoopSetK(1, i1); \ for (hypre__J = 0; hypre__J < hypre__JN; hypre__J++) \ { \ for (hypre__I = 0; hypre__I < hypre__IN; hypre__I++) \ { #define hypre_SerialBoxLoop1End(i1) zypre_BoxLoop1End(i1) #define hypre_SerialBoxLoop2Begin(ndim, loop_size, \ dbox1, start1, stride1, i1, \ dbox2, start2, stride2, i2) \ { \ HYPRE_Int i1,i2; \ zypre_BoxLoopDeclare(); \ zypre_BoxLoopDeclareK(1); \ zypre_BoxLoopDeclareK(2); \ zypre_BoxLoopInit(ndim, loop_size); \ zypre_BoxLoopInitK(1, dbox1, start1, stride1, i1); \ zypre_BoxLoopInitK(2, dbox2, start2, stride2, i2); \ zypre_BoxLoopSetOneBlock(); \ for (hypre__block = 0; hypre__block < hypre__num_blocks; hypre__block++) \ { \ zypre_BoxLoopSet(); \ zypre_BoxLoopSetK(1, i1); \ zypre_BoxLoopSetK(2, i2); \ for (hypre__J = 0; hypre__J < hypre__JN; hypre__J++) \ { \ for (hypre__I = 0; hypre__I < hypre__IN; hypre__I++) \ { #define hypre_SerialBoxLoop2End(i1, i2) zypre_BoxLoop2End(i1, i2) /* Reduction BoxLoop1 */ #define zypre_BoxLoop1ReductionBegin(ndim, loop_size, dbox1, start1, stride1, i1, reducesum) \ zypre_BoxLoop1Begin(ndim, loop_size, dbox1, start1, stride1, i1) #define zypre_BoxLoop1ReductionEnd(i1, reducesum) zypre_BoxLoop1End(i1) /* Reduction BoxLoop2 */ #define zypre_BoxLoop2ReductionBegin(ndim, loop_size, dbox1, start1, stride1, i1, \ dbox2, start2, stride2, i2, reducesum) \ zypre_BoxLoop2Begin(ndim, loop_size, dbox1, start1, stride1, i1, \ dbox2, start2, stride2, i2) #define zypre_BoxLoop2ReductionEnd(i1, i2, reducesum) zypre_BoxLoop2End(i1, i2) /* Renaming */ #define hypre_BoxLoopGetIndexHost zypre_BoxLoopGetIndex #define hypre_BoxLoopBlockHost zypre_BoxLoopBlock #define hypre_BoxLoop0BeginHost zypre_BoxLoop0Begin #define hypre_BoxLoop0EndHost zypre_BoxLoop0End #define hypre_BoxLoop1BeginHost zypre_BoxLoop1Begin #define hypre_BoxLoop1EndHost zypre_BoxLoop1End #define hypre_BoxLoop2BeginHost zypre_BoxLoop2Begin #define hypre_BoxLoop2EndHost zypre_BoxLoop2End #define hypre_BoxLoop3BeginHost zypre_BoxLoop3Begin #define hypre_BoxLoop3EndHost zypre_BoxLoop3End #define hypre_BoxLoop4BeginHost zypre_BoxLoop4Begin #define hypre_BoxLoop4EndHost zypre_BoxLoop4End #define hypre_BasicBoxLoop1BeginHost zypre_BasicBoxLoop1Begin #define hypre_BasicBoxLoop2BeginHost zypre_BasicBoxLoop2Begin #define hypre_LoopBeginHost zypre_LoopBegin #define hypre_LoopEndHost zypre_LoopEnd #define hypre_BoxLoop1ReductionBeginHost zypre_BoxLoop1ReductionBegin #define hypre_BoxLoop1ReductionEndHost zypre_BoxLoop1ReductionEnd #define hypre_BoxLoop2ReductionBeginHost zypre_BoxLoop2ReductionBegin #define hypre_BoxLoop2ReductionEndHost zypre_BoxLoop2ReductionEnd //TODO TEMP FIX #if !defined(HYPRE_USING_RAJA) && !defined(HYPRE_USING_KOKKOS) && !defined(HYPRE_USING_CUDA) && !defined(HYPRE_USING_HIP) && !defined(HYPRE_USING_DEVICE_OPENMP) && !defined(HYPRE_USING_SYCL) #define hypre_BoxLoopGetIndex hypre_BoxLoopGetIndexHost #define hypre_BoxLoopBlock() 0 #define hypre_BoxLoop0Begin hypre_BoxLoop0BeginHost #define hypre_BoxLoop0End hypre_BoxLoop0EndHost #define hypre_BoxLoop1Begin hypre_BoxLoop1BeginHost #define hypre_BoxLoop1End hypre_BoxLoop1EndHost #define hypre_BoxLoop2Begin hypre_BoxLoop2BeginHost #define hypre_BoxLoop2End hypre_BoxLoop2EndHost #define hypre_BoxLoop3Begin hypre_BoxLoop3BeginHost #define hypre_BoxLoop3End hypre_BoxLoop3EndHost #define hypre_BoxLoop4Begin hypre_BoxLoop4BeginHost #define hypre_BoxLoop4End hypre_BoxLoop4EndHost #define hypre_BasicBoxLoop1Begin hypre_BasicBoxLoop1BeginHost #define hypre_BasicBoxLoop2Begin hypre_BasicBoxLoop2BeginHost #define hypre_LoopBegin hypre_LoopBeginHost #define hypre_LoopEnd hypre_LoopEndHost #define hypre_BoxLoop1ReductionBegin hypre_BoxLoop1ReductionBeginHost #define hypre_BoxLoop1ReductionEnd hypre_BoxLoop1ReductionEndHost #define hypre_BoxLoop2ReductionBegin hypre_BoxLoop2ReductionBeginHost #define hypre_BoxLoop2ReductionEnd hypre_BoxLoop2ReductionEndHost #endif #endif /* #ifndef HYPRE_BOXLOOP_HOST_HEADER */ hypre-2.33.0/src/struct_mv/boxloop_kokkos.h000066400000000000000000000464331477326011500207770ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * Header info for the BoxLoop * *****************************************************************************/ /*-------------------------------------------------------------------------- * BoxLoop macros: *--------------------------------------------------------------------------*/ #ifndef HYPRE_BOXLOOP_KOKKOS_HEADER #define HYPRE_BOXLOOP_KOKKOS_HEADER #if defined(HYPRE_USING_KOKKOS) #ifdef __cplusplus extern "C++" { #endif #include using namespace Kokkos; #ifdef __cplusplus } #endif #if defined( KOKKOS_HAVE_MPI ) #include #endif typedef struct hypre_Boxloop_struct { HYPRE_Int lsize0, lsize1, lsize2; HYPRE_Int strides0, strides1, strides2; HYPRE_Int bstart0, bstart1, bstart2; HYPRE_Int bsize0, bsize1, bsize2; } hypre_Boxloop; #define hypre_fence() /* #define hypre_fence() \ cudaError err = cudaGetLastError(); \ if ( cudaSuccess != err ) { \ printf("\n ERROR hypre_newBoxLoop: %s in %s(%d) function %s\n", cudaGetErrorString(err),__FILE__,__LINE__,__FUNCTION__); \ } \ hypre_CheckErrorDevice(cudaDeviceSynchronize()); */ #define hypre_newBoxLoopInit(ndim,loop_size) \ HYPRE_Int hypre__tot = 1; \ for (HYPRE_Int d = 0;d < ndim;d ++) \ hypre__tot *= loop_size[d]; #define hypre_BoxLoopIncK(k,box,hypre__i) \ HYPRE_Int hypre_boxD##k = 1; \ HYPRE_Int hypre__i = 0; \ hypre__i += (hypre_IndexD(local_idx, 0)*box.strides0 + box.bstart0) * hypre_boxD##k; \ hypre_boxD##k *= hypre_max(0, box.bsize0 + 1); \ hypre__i += (hypre_IndexD(local_idx, 1)*box.strides1 + box.bstart1) * hypre_boxD##k; \ hypre_boxD##k *= hypre_max(0, box.bsize1 + 1); \ hypre__i += (hypre_IndexD(local_idx, 2)*box.strides2 + box.bstart2) * hypre_boxD##k; \ hypre_boxD##k *= hypre_max(0, box.bsize2 + 1); \ #define hypre_newBoxLoopDeclare(box) \ hypre_Index local_idx; \ HYPRE_Int idx_local = idx; \ hypre_IndexD(local_idx, 0) = idx_local % box.lsize0; \ idx_local = idx_local / box.lsize0; \ hypre_IndexD(local_idx, 1) = idx_local % box.lsize1; \ idx_local = idx_local / box.lsize1; \ hypre_IndexD(local_idx, 2) = idx_local % box.lsize2; #define hypre_BoxLoopDataDeclareK(k,ndim,loop_size,dbox,start,stride) \ hypre_Boxloop databox##k; \ databox##k.lsize0 = loop_size[0]; \ databox##k.strides0 = stride[0]; \ databox##k.bstart0 = start[0] - dbox->imin[0]; \ databox##k.bsize0 = dbox->imax[0]-dbox->imin[0]; \ if (ndim > 1) \ { \ databox##k.lsize1 = loop_size[1]; \ databox##k.strides1 = stride[1]; \ databox##k.bstart1 = start[1] - dbox->imin[1]; \ databox##k.bsize1 = dbox->imax[1]-dbox->imin[1]; \ } \ else \ { \ databox##k.lsize1 = 1; \ databox##k.strides1 = 0; \ databox##k.bstart1 = 0; \ databox##k.bsize1 = 0; \ } \ if (ndim == 3) \ { \ databox##k.lsize2 = loop_size[2]; \ databox##k.strides2 = stride[2]; \ databox##k.bstart2 = start[2] - dbox->imin[2]; \ databox##k.bsize2 = dbox->imax[2]-dbox->imin[2]; \ } \ else \ { \ databox##k.lsize2 = 1; \ databox##k.strides2 = 0; \ databox##k.bstart2 = 0; \ databox##k.bsize2 = 0; \ } #define hypre_newBoxLoop0Begin(ndim, loop_size) \ { \ hypre_newBoxLoopInit(ndim,loop_size); \ Kokkos::parallel_for (hypre__tot, KOKKOS_LAMBDA (HYPRE_Int idx) \ { #define hypre_newBoxLoop0End(i1) \ }); \ hypre_fence(); \ } #define hypre_newBoxLoop1Begin(ndim, loop_size, \ dbox1, start1, stride1, i1) \ { \ hypre_newBoxLoopInit(ndim,loop_size) \ hypre_BoxLoopDataDeclareK(1,ndim,loop_size,dbox1,start1,stride1); \ Kokkos::parallel_for (hypre__tot, KOKKOS_LAMBDA (HYPRE_Int idx) \ { \ hypre_newBoxLoopDeclare(databox1); \ hypre_BoxLoopIncK(1,databox1,i1); #define hypre_newBoxLoop1End(i1) \ }); \ hypre_fence(); \ } #define hypre_newBoxLoop2Begin(ndim, loop_size, \ dbox1, start1, stride1, i1, \ dbox2, start2, stride2, i2) \ { \ hypre_newBoxLoopInit(ndim,loop_size); \ hypre_BoxLoopDataDeclareK(1,ndim,loop_size,dbox1,start1,stride1); \ hypre_BoxLoopDataDeclareK(2,ndim,loop_size,dbox2,start2,stride2); \ Kokkos::parallel_for (hypre__tot, KOKKOS_LAMBDA (HYPRE_Int idx) \ { \ hypre_newBoxLoopDeclare(databox1) \ hypre_BoxLoopIncK(1,databox1,i1); \ hypre_BoxLoopIncK(2,databox2,i2); #define hypre_newBoxLoop2End(i1, i2) \ }); \ hypre_fence(); \ } #define hypre_newBoxLoop3Begin(ndim, loop_size, \ dbox1, start1, stride1, i1, \ dbox2, start2, stride2, i2, \ dbox3, start3, stride3, i3) \ { \ hypre_newBoxLoopInit(ndim,loop_size); \ hypre_BoxLoopDataDeclareK(1,ndim,loop_size,dbox1,start1,stride1); \ hypre_BoxLoopDataDeclareK(2,ndim,loop_size,dbox2,start2,stride2); \ hypre_BoxLoopDataDeclareK(3,ndim,loop_size,dbox3,start3,stride3); \ Kokkos::parallel_for (hypre__tot, KOKKOS_LAMBDA (HYPRE_Int idx) \ { \ hypre_newBoxLoopDeclare(databox1); \ hypre_BoxLoopIncK(1,databox1,i1); \ hypre_BoxLoopIncK(2,databox2,i2); \ hypre_BoxLoopIncK(3,databox3,i3); #define hypre_newBoxLoop3End(i1, i2, i3) \ }); \ hypre_fence(); \ } #define hypre_newBoxLoop4Begin(ndim, loop_size, \ dbox1, start1, stride1, i1, \ dbox2, start2, stride2, i2, \ dbox3, start3, stride3, i3, \ dbox4, start4, stride4, i4) \ { \ hypre_newBoxLoopInit(ndim,loop_size); \ hypre_BoxLoopDataDeclareK(1,ndim,loop_size,dbox1,start1,stride1); \ hypre_BoxLoopDataDeclareK(2,ndim,loop_size,dbox2,start2,stride2); \ hypre_BoxLoopDataDeclareK(3,ndim,loop_size,dbox3,start3,stride3); \ hypre_BoxLoopDataDeclareK(4,ndim,loop_size,dbox4,start4,stride4); \ Kokkos::parallel_for (hypre__tot, KOKKOS_LAMBDA (HYPRE_Int idx) \ { \ hypre_newBoxLoopDeclare(databox1); \ hypre_BoxLoopIncK(1,databox1,i1); \ hypre_BoxLoopIncK(2,databox2,i2); \ hypre_BoxLoopIncK(3,databox3,i3); \ hypre_BoxLoopIncK(4,databox4,i4); #define hypre_newBoxLoop4End(i1, i2, i3, i4) \ }); \ hypre_fence(); \ } #define hypre_BasicBoxLoopDataDeclareK(k,ndim,loop_size,stride) \ hypre_Boxloop databox##k; \ databox##k.lsize0 = loop_size[0]; \ databox##k.strides0 = stride[0]; \ databox##k.bstart0 = 0; \ databox##k.bsize0 = 0; \ if (ndim > 1) \ { \ databox##k.lsize1 = loop_size[1]; \ databox##k.strides1 = stride[1]; \ databox##k.bstart1 = 0; \ databox##k.bsize1 = 0; \ } \ else \ { \ databox##k.lsize1 = 1; \ databox##k.strides1 = 0; \ databox##k.bstart1 = 0; \ databox##k.bsize1 = 0; \ } \ if (ndim == 3) \ { \ databox##k.lsize2 = loop_size[2]; \ databox##k.strides2 = stride[2]; \ databox##k.bstart2 = 0; \ databox##k.bsize2 = 0; \ } \ else \ { \ databox##k.lsize2 = 1; \ databox##k.strides2 = 0; \ databox##k.bstart2 = 0; \ databox##k.bsize2 = 0; \ } #define hypre_newBasicBoxLoop2Begin(ndim, loop_size, \ stride1, i1, \ stride2, i2) \ { \ hypre_newBoxLoopInit(ndim,loop_size); \ hypre_BasicBoxLoopDataDeclareK(1,ndim,loop_size,stride1); \ hypre_BasicBoxLoopDataDeclareK(2,ndim,loop_size,stride2); \ Kokkos::parallel_for (hypre__tot, KOKKOS_LAMBDA (HYPRE_Int idx) \ { \ hypre_newBoxLoopDeclare(databox1); \ hypre_BoxLoopIncK(1,databox1,i1); \ hypre_BoxLoopIncK(2,databox2,i2); \ #define hypre_BoxLoop1ReductionBegin(ndim, loop_size, \ dbox1, start1, stride1, i1, \ HYPRE_BOX_REDUCTION) \ { \ HYPRE_Real __hypre_sum_tmp = HYPRE_BOX_REDUCTION; \ HYPRE_BOX_REDUCTION = 0.0; \ hypre_newBoxLoopInit(ndim,loop_size); \ hypre_BoxLoopDataDeclareK(1,ndim,loop_size,dbox1,start1,stride1); \ Kokkos::parallel_reduce (hypre__tot, KOKKOS_LAMBDA (HYPRE_Int idx, \ HYPRE_Real &HYPRE_BOX_REDUCTION) \ { \ hypre_newBoxLoopDeclare(databox1); \ hypre_BoxLoopIncK(1,databox1,i1); \ #define hypre_BoxLoop1ReductionEnd(i1, HYPRE_BOX_REDUCTION) \ }, HYPRE_BOX_REDUCTION); \ hypre_fence(); \ HYPRE_BOX_REDUCTION += __hypre_sum_tmp; \ } #define hypre_BoxLoop2ReductionBegin(ndim, loop_size, \ dbox1, start1, stride1, i1, \ dbox2, start2, stride2, i2, \ HYPRE_BOX_REDUCTION) \ { \ HYPRE_Real __hypre_sum_tmp = HYPRE_BOX_REDUCTION; \ HYPRE_BOX_REDUCTION = 0.0; \ hypre_newBoxLoopInit(ndim,loop_size); \ hypre_BoxLoopDataDeclareK(1,ndim,loop_size,dbox1,start1,stride1); \ hypre_BoxLoopDataDeclareK(2,ndim,loop_size,dbox2,start2,stride2); \ Kokkos::parallel_reduce (hypre__tot, KOKKOS_LAMBDA (HYPRE_Int idx, \ HYPRE_Real &HYPRE_BOX_REDUCTION) \ { \ hypre_newBoxLoopDeclare(databox1); \ hypre_BoxLoopIncK(1,databox1,i1); \ hypre_BoxLoopIncK(2,databox2,i2); \ #define hypre_BoxLoop2ReductionEnd(i1, i2, HYPRE_BOX_REDUCTION) \ }, HYPRE_BOX_REDUCTION); \ hypre_fence(); \ HYPRE_BOX_REDUCTION += __hypre_sum_tmp; \ } #define hypre_LoopBegin(size,idx) \ { \ Kokkos::parallel_for(size, KOKKOS_LAMBDA (HYPRE_Int idx) \ { #define hypre_LoopEnd() \ }); \ hypre_fence(); \ } /* extern "C++" { struct ColumnSums { typedef HYPRE_Real value_type[]; typedef View::size_type size_type; size_type value_count; View X_; ColumnSums(const View& X):value_count(X.dimension_1()),X_(X){} KOKKOS_INLINE_FUNCTION void operator()(const size_type i,value_type sum) const { for (size_type j = 0;j < value_count;j++) { sum[j] += X_(i,j); } } KOKKOS_INLINE_FUNCTION void join (volatile value_type dst,volatile value_type src) const { for (size_type j= 0;j < value_count;j++) { dst[j] +=src[j]; } } KOKKOS_INLINE_FUNCTION void init(value_type sum) const { for (size_type j= 0;j < value_count;j++) { sum[j] += 0.0; } } }; } */ #define hypre_BoxLoopGetIndex(index) \ index[0] = hypre_IndexD(local_idx, 0); \ index[1] = hypre_IndexD(local_idx, 1); \ index[2] = hypre_IndexD(local_idx, 2); #define hypre_BoxLoopBlock() 0 #define hypre_BoxLoop0Begin hypre_newBoxLoop0Begin #define hypre_BoxLoop0For hypre_newBoxLoop0For #define hypre_BoxLoop0End hypre_newBoxLoop0End #define hypre_BoxLoop1Begin hypre_newBoxLoop1Begin #define hypre_BoxLoop1For hypre_newBoxLoop1For #define hypre_BoxLoop1End hypre_newBoxLoop1End #define hypre_BoxLoop2Begin hypre_newBoxLoop2Begin #define hypre_BoxLoop2For hypre_newBoxLoop2For #define hypre_BoxLoop2End hypre_newBoxLoop2End #define hypre_BoxLoop3Begin hypre_newBoxLoop3Begin #define hypre_BoxLoop3For hypre_newBoxLoop3For #define hypre_BoxLoop3End hypre_newBoxLoop3End #define hypre_BoxLoop4Begin hypre_newBoxLoop4Begin #define hypre_BoxLoop4For hypre_newBoxLoop4For #define hypre_BoxLoop4End hypre_newBoxLoop4End #define hypre_BasicBoxLoop2Begin hypre_newBasicBoxLoop2Begin #endif #endif /* #ifndef HYPRE_BOXLOOP_KOKKOS_HEADER */ hypre-2.33.0/src/struct_mv/boxloop_omp_device.h000066400000000000000000000573511477326011500216110ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * Header info for the BoxLoop * *****************************************************************************/ /*-------------------------------------------------------------------------- * BoxLoop macros: *--------------------------------------------------------------------------*/ #ifndef HYPRE_BOXLOOP_DEVICEOMP_HEADER #define HYPRE_BOXLOOP_DEVICEOMP_HEADER #if defined(HYPRE_USING_DEVICE_OPENMP) && !defined(HYPRE_USING_RAJA) && !defined(HYPRE_USING_KOKKOS) #include "omp.h" /* concatenation: */ #define HYPRE_CONCAT2(x, y) x ## _ ## y #define HYPRE_XCONCAT2(x, y) HYPRE_CONCAT2(x, y) #define HYPRE_CONCAT3(x, y, z) x ## _ ## y ## _ ## z #define HYPRE_XCONCAT3(x, y, z) HYPRE_CONCAT3(x, y, z) /* if use OMP 4.5 default team size and number of teams */ #define AUTO_OMP_TEAM #ifndef AUTO_OMP_TEAM /* omp team size (aka. gpu block size) */ #define hypre_gpu_block_size HYPRE_1D_BLOCK_SIZE /* the max number of omp teams */ #define hypre_max_num_blocks 1000000 #endif //#define HYPRE_BOXLOOP_ENTRY_PRINT hypre_printf("%s %s %d\n", __FILE__, __func__, __LINE__); #define HYPRE_BOXLOOP_ENTRY_PRINT /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - BOX LOOPS [TEAM DISTRIBUTE VERSION] !!! NOTE: THIS CODE ONLY WORKS FOR DIM <= 3 !!! * - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/ /* #define hypre_BoxLoop0For() #define hypre_BoxLoop1For(i1) #define hypre_BoxLoop2For(i1, i2) #define hypre_BoxLoop3For(i1, i2, i3) #define hypre_BoxLoop4For(i1, i2, i3, i4) */ #define hypre_BoxLoopBlock() 0 #define hypre_BoxLoop0Begin zypre_omp4_dist_BoxLoop0Begin #define hypre_BoxLoop0End zypre_omp4_dist_BoxLoopEnd #define hypre_BoxLoop1Begin zypre_omp4_dist_BoxLoop1Begin #define hypre_BoxLoop1End zypre_omp4_dist_BoxLoopEnd #define hypre_BasicBoxLoop2Begin zypre_omp4_dist_BoxLoop2_v2_Begin #define hypre_BoxLoop2Begin zypre_omp4_dist_BoxLoop2Begin #define hypre_BoxLoop2End zypre_omp4_dist_BoxLoopEnd #define hypre_BoxLoop3Begin zypre_omp4_dist_BoxLoop3Begin #if 0 #define hypre_BoxLoop3_SAME_STRIDE_Begin zypre_omp4_dist_BoxLoop3_SAME_STRIDE_Begin #endif #define hypre_BoxLoop3End zypre_omp4_dist_BoxLoopEnd #define hypre_BoxLoop4Begin zypre_omp4_dist_BoxLoop4Begin #define hypre_BoxLoop4End zypre_omp4_dist_BoxLoopEnd #define hypre_LoopBegin zypre_omp4_dist_LoopBegin #define hypre_LoopEnd zypre_omp4_dist_BoxLoopEnd /* Look for more in struct_ls/red_black_gs.h" */ #define zypre_omp4_dist_BoxLoopEnd(...) \ }\ /*cudaDeviceSynchronize();*/ \ } #define HYPRE_BOX_REDUCTION /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - * host code: declare variables used in the box loop * - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/ #define zypre_omp4_BoxLoopDeclareInit_0(ndim, loop_size) \ HYPRE_Int hypre__ndim = ndim, hypre__tot = 1; \ /* HYPRE_Int hypre__thread; */ \ /* loop size */ \ HYPRE_Int hypre__loop_size_0, hypre__loop_size_1, hypre__loop_size_2; \ if (hypre__ndim > 0) { hypre__loop_size_0 = loop_size[0]; hypre__tot *= hypre__loop_size_0; } \ if (hypre__ndim > 1) { hypre__loop_size_1 = loop_size[1]; hypre__tot *= hypre__loop_size_1; } \ if (hypre__ndim > 2) { hypre__loop_size_2 = loop_size[2]; hypre__tot *= hypre__loop_size_2; } #ifdef AUTO_OMP_TEAM #define TEAM_CLAUSE #define zypre_omp4_BoxLoopDeclareInit(ndim, loop_size) zypre_omp4_BoxLoopDeclareInit_0(ndim, loop_size) #else #define TEAM_CLAUSE num_teams(num_blocks) thread_limit(block_size) #define zypre_omp4_BoxLoopDeclareInit(ndim, loop_size) zypre_omp4_BoxLoopDeclareInit_0(ndim, loop_size) \ /* GPU block numbers and dimensions */ \ HYPRE_Int block_size = hypre_gpu_block_size; \ HYPRE_Int num_blocks = hypre_min(hypre_max_num_blocks, (hypre__tot + hypre_gpu_block_size - 1) / hypre_gpu_block_size); #endif /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - * host code: declare and initialize variables for box k * - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/ #define zypre_omp4_BoxKDeclareInitBody(j, k, startk, dboxk, stridek) \ HYPRE_XCONCAT3(hypre__stride,j,k) = stridek[j]; \ /* precompute some entities used in the parallel for loop */ \ HYPRE_XCONCAT3(hypre__box_start_imin,j,k) = startk[j] - dboxk->imin[j]; \ HYPRE_XCONCAT3(hypre__box_imax_imin,j,k) = dboxk->imax[j] - dboxk->imin[j] + 1; #define zypre_omp4_BoxKDeclareInit(k, startk, dboxk, stridek)\ /* start - imin */ \ HYPRE_Int HYPRE_XCONCAT3(hypre__box_start_imin,0,k), HYPRE_XCONCAT3(hypre__box_start_imin,1,k), HYPRE_XCONCAT3(hypre__box_start_imin,2,k); \ /* imax - imin + 1 */ \ HYPRE_Int HYPRE_XCONCAT3(hypre__box_imax_imin,0,k), HYPRE_XCONCAT3(hypre__box_imax_imin,1,k), HYPRE_XCONCAT3(hypre__box_imax_imin,2,k); \ /* stride */ \ HYPRE_Int HYPRE_XCONCAT3(hypre__stride,0,k), HYPRE_XCONCAT3(hypre__stride,1,k), HYPRE_XCONCAT3(hypre__stride,2,k); \ /*if (hypre__ndim > 0)*/ { zypre_omp4_BoxKDeclareInitBody(0, k, startk, dboxk, stridek) } \ if (hypre__ndim > 1) { zypre_omp4_BoxKDeclareInitBody(1, k, startk, dboxk, stridek) } \ if (hypre__ndim > 2) { zypre_omp4_BoxKDeclareInitBody(2, k, startk, dboxk, stridek) } \ /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - * map clause * - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/ #define MAP_CLAUSE0 #define MAP_CLAUSE1 #define MAP_CLAUSE2 #define MAP_CLAUSE3 #define MAP_CLAUSE4 /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - * if clause * - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/ #define IF_CLAUSE if (hypre__global_offload && hypre__tot > 0) //#define IF_CLAUSE /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - * is_device_ptr clause * - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/ #if defined(HYPRE_DEVICE_OPENMP_ALLOC) #define IS_DEVICE_CLAUSE DEVICE_VAR #else #define IS_DEVICE_CLAUSE #endif /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - * device code for BoxLoop 1, set i1 * - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/ #define zypre_omp4_BoxLoopSet1Body(j, i1) \ /* coord in dimension j */ \ hypre__i = hypre__J % HYPRE_XCONCAT2(hypre__loop_size,j); \ /* once */ \ hypre__i_1 = hypre__i * HYPRE_XCONCAT3(hypre__stride,j,1) + HYPRE_XCONCAT3(hypre__box_start_imin,j,1);\ /* once */ \ i1 += hypre__i_1 * hypre__I_1; \ /* once */ \ hypre__I_1 *= HYPRE_XCONCAT3(hypre__box_imax_imin,j,1); \ /* */ \ hypre__J /= HYPRE_XCONCAT2(hypre__loop_size,j); \ /* save the 3-D id */ \ HYPRE_XCONCAT2(hypre__id,j) = hypre__i; #define zypre_omp4_BoxLoopSet1(i1) \ HYPRE_Int hypre__I_1, hypre__i, hypre__i_1, hypre__J, i1, idx; \ HYPRE_Int hypre__id_0, hypre__id_1, hypre__id_2; \ hypre__I_1 = 1; idx = hypre__J = hypre__thread; i1 = 0; \ /*if (hypre__ndim > 0)*/ { zypre_omp4_BoxLoopSet1Body(0, i1) } \ if (hypre__ndim > 1) { zypre_omp4_BoxLoopSet1Body(1, i1) } \ if (hypre__ndim > 2) { zypre_omp4_BoxLoopSet1Body(2, i1) } /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - * device code for BoxLoop 2, set i1, i2 * - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/ #define zypre_omp4_BoxLoopSet2Body(j, i1, i2) \ /* */ \ hypre__i = hypre__J % HYPRE_XCONCAT2(hypre__loop_size,j); \ /* twice */ \ hypre__i_1 = hypre__i * HYPRE_XCONCAT3(hypre__stride,j,1) + HYPRE_XCONCAT3(hypre__box_start_imin,j,1);\ hypre__i_2 = hypre__i * HYPRE_XCONCAT3(hypre__stride,j,2) + HYPRE_XCONCAT3(hypre__box_start_imin,j,2);\ /* twice */ \ i1 += hypre__i_1 * hypre__I_1; \ i2 += hypre__i_2 * hypre__I_2; \ /* twice */ \ hypre__I_1 *= HYPRE_XCONCAT3(hypre__box_imax_imin,j,1); \ hypre__I_2 *= HYPRE_XCONCAT3(hypre__box_imax_imin,j,2); \ /* */ \ hypre__J /= HYPRE_XCONCAT2(hypre__loop_size,j); \ /* save the 3-D id */ \ HYPRE_XCONCAT2(hypre__id,j) = hypre__i; #define zypre_omp4_BoxLoopSet2(i1, i2) \ HYPRE_Int hypre__I_1, hypre__I_2, hypre__i, hypre__i_1, hypre__i_2, hypre__J, i1, i2; \ HYPRE_Int hypre__id_0, hypre__id_1, hypre__id_2; \ hypre__I_1 = hypre__I_2 = 1; hypre__J = hypre__thread; i1 = i2 = 0; \ /*if (hypre__ndim > 0)*/ { zypre_omp4_BoxLoopSet2Body(0, i1, i2) } \ if (hypre__ndim > 1) { zypre_omp4_BoxLoopSet2Body(1, i1, i2) } \ if (hypre__ndim > 2) { zypre_omp4_BoxLoopSet2Body(2, i1, i2) } /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - * device code for BoxLoop 3, set i1, i2, i3 * - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/ #define zypre_omp4_BoxLoopSet3Body(j, i1, i2, i3) \ /* */ \ hypre__i = hypre__J % HYPRE_XCONCAT2(hypre__loop_size,j); \ /* 3 times */ \ hypre__i_1 = hypre__i * HYPRE_XCONCAT3(hypre__stride,j,1) + HYPRE_XCONCAT3(hypre__box_start_imin,j,1);\ hypre__i_2 = hypre__i * HYPRE_XCONCAT3(hypre__stride,j,2) + HYPRE_XCONCAT3(hypre__box_start_imin,j,2);\ hypre__i_3 = hypre__i * HYPRE_XCONCAT3(hypre__stride,j,3) + HYPRE_XCONCAT3(hypre__box_start_imin,j,3);\ /* 3 times */ \ i1 += hypre__i_1 * hypre__I_1; \ i2 += hypre__i_2 * hypre__I_2; \ i3 += hypre__i_3 * hypre__I_3; \ /* 3 times */ \ hypre__I_1 *= HYPRE_XCONCAT3(hypre__box_imax_imin,j,1); \ hypre__I_2 *= HYPRE_XCONCAT3(hypre__box_imax_imin,j,2); \ hypre__I_3 *= HYPRE_XCONCAT3(hypre__box_imax_imin,j,3); \ /* */ \ hypre__J /= HYPRE_XCONCAT2(hypre__loop_size,j); \ /* save the 3-D id */ \ HYPRE_XCONCAT2(hypre__id,j) = hypre__i; #define zypre_omp4_BoxLoopSet3(i1, i2, i3) \ HYPRE_Int hypre__I_1, hypre__I_2, hypre__I_3, hypre__i, hypre__i_1, hypre__i_2, hypre__i_3, hypre__J, i1, i2, i3; \ HYPRE_Int hypre__id_0, hypre__id_1, hypre__id_2; \ hypre__I_1 = hypre__I_2 = hypre__I_3 = 1; hypre__J = hypre__thread; i1 = i2 = i3 = 0; \ /*if (hypre__ndim > 0)*/ { zypre_omp4_BoxLoopSet3Body(0, i1, i2, i3) } \ if (hypre__ndim > 1) { zypre_omp4_BoxLoopSet3Body(1, i1, i2, i3) } \ if (hypre__ndim > 2) { zypre_omp4_BoxLoopSet3Body(2, i1, i2, i3) } #if 0 /* - - - - - special Box 3: XXX */ #define zypre_omp4_BoxLoopSet3_SAME_STRIDE_Body(j, i1, i2, i3) \ /* */ \ hypre__i = (hypre__J % HYPRE_XCONCAT2(hypre__loop_size,j)) * HYPRE_XCONCAT3(hypre__stride,j,1); \ /* 3 times */ \ hypre__i_1 = hypre__i + HYPRE_XCONCAT3(hypre__box_start_imin,j,1);\ hypre__i_2 = hypre__i + HYPRE_XCONCAT3(hypre__box_start_imin,j,2);\ hypre__i_3 = hypre__i + HYPRE_XCONCAT3(hypre__box_start_imin,j,3);\ /* 3 times */ \ i1 += hypre__i_1 * hypre__I_1; \ i2 += hypre__i_2 * hypre__I_2; \ i3 += hypre__i_3 * hypre__I_3; \ /* 3 times */ \ hypre__I_1 *= HYPRE_XCONCAT3(hypre__box_imax_imin,j,1); \ hypre__I_2 *= HYPRE_XCONCAT3(hypre__box_imax_imin,j,2); \ hypre__I_3 *= HYPRE_XCONCAT3(hypre__box_imax_imin,j,3); \ /* */ \ hypre__J /= HYPRE_XCONCAT2(hypre__loop_size,j); #define zypre_omp4_BoxLoopSet3_SAME_STRIDE(i1, i2, o2, i3) \ HYPRE_Int hypre__I_1, hypre__I_2, hypre__I_3, hypre__i, hypre__i_1, hypre__i_2, hypre__i_3, hypre__J; \ hypre__I_1 = hypre__I_2 = hypre__I_3 = 1; hypre__J = hypre__thread; i1 = i3 = 0; i2 = o2;\ /*if (hypre__ndim > 0)*/ { zypre_omp4_BoxLoopSet3_SAME_STRIDE_Body(0, i1, i2, i3) } \ if (hypre__ndim > 1) { zypre_omp4_BoxLoopSet3_SAME_STRIDE_Body(1, i1, i2, i3) } \ if (hypre__ndim > 2) { zypre_omp4_BoxLoopSet3_SAME_STRIDE_Body(2, i1, i2, i3) } #endif /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - * device code for BoxLoop 4, set i1, i2, i3, i4 * - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/ #define zypre_omp4_BoxLoopSet4Body(j, i1, i2, i3, i4) \ /* */ \ hypre__i = hypre__J % HYPRE_XCONCAT2(hypre__loop_size,j); \ /* 4 times */ \ hypre__i_1 = hypre__i * HYPRE_XCONCAT3(hypre__stride,j,1) + HYPRE_XCONCAT3(hypre__box_start_imin,j,1);\ hypre__i_2 = hypre__i * HYPRE_XCONCAT3(hypre__stride,j,2) + HYPRE_XCONCAT3(hypre__box_start_imin,j,2);\ hypre__i_3 = hypre__i * HYPRE_XCONCAT3(hypre__stride,j,3) + HYPRE_XCONCAT3(hypre__box_start_imin,j,3);\ hypre__i_4 = hypre__i * HYPRE_XCONCAT3(hypre__stride,j,4) + HYPRE_XCONCAT3(hypre__box_start_imin,j,4);\ /* 4 times */ \ i1 += hypre__i_1 * hypre__I_1; \ i2 += hypre__i_2 * hypre__I_2; \ i3 += hypre__i_3 * hypre__I_3; \ i4 += hypre__i_4 * hypre__I_4; \ /* 4 times */ \ hypre__I_1 *= HYPRE_XCONCAT3(hypre__box_imax_imin,j,1); \ hypre__I_2 *= HYPRE_XCONCAT3(hypre__box_imax_imin,j,2); \ hypre__I_3 *= HYPRE_XCONCAT3(hypre__box_imax_imin,j,3); \ hypre__I_4 *= HYPRE_XCONCAT3(hypre__box_imax_imin,j,4); \ /* */ \ hypre__J /= HYPRE_XCONCAT2(hypre__loop_size,j); \ /* save the 3-D id */ \ HYPRE_XCONCAT2(hypre__id,j) = hypre__i; #define zypre_omp4_BoxLoopSet4(i1, i2, i3, i4) \ HYPRE_Int hypre__I_1, hypre__I_2, hypre__I_3, hypre__I_4, hypre__i, hypre__i_1, hypre__i_2, hypre__i_3, hypre__i_4, hypre__J, i1, i2, i3, i4; \ HYPRE_Int hypre__id_0, hypre__id_1, hypre__id_2; \ hypre__I_1 = hypre__I_2 = hypre__I_3 = hypre__I_4 = 1; hypre__J = hypre__thread; i1 = i2 = i3 = i4 = 0; \ /*if (hypre__ndim > 0)*/ { zypre_omp4_BoxLoopSet4Body(0, i1, i2, i3, i4) } \ if (hypre__ndim > 1) { zypre_omp4_BoxLoopSet4Body(1, i1, i2, i3, i4) } \ if (hypre__ndim > 2) { zypre_omp4_BoxLoopSet4Body(2, i1, i2, i3, i4) } /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - * BoxLoop 0 * - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/ #define zypre_omp4_dist_BoxLoop0Begin(ndim, loop_size) \ {\ /* host code: */ \ HYPRE_BOXLOOP_ENTRY_PRINT \ zypre_omp4_BoxLoopDeclareInit(ndim, loop_size) \ /* device code: */ \ _Pragma (HYPRE_XSTR(omp target teams distribute parallel for IF_CLAUSE MAP_CLAUSE0 IS_DEVICE_CLAUSE TEAM_CLAUSE)) \ for (HYPRE_Int hypre__thread = 0; hypre__thread < hypre__tot; hypre__thread++) \ {\ /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - * BoxLoop 1 * - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/ #define zypre_omp4_dist_BoxLoop1Begin(ndim, loop_size, dbox1, start1, stride1, i1) \ {\ /* host code: */ \ HYPRE_BOXLOOP_ENTRY_PRINT \ zypre_omp4_BoxLoopDeclareInit(ndim, loop_size) \ zypre_omp4_BoxKDeclareInit(1, start1, dbox1, stride1) \ /* device code: */ \ _Pragma (HYPRE_XSTR(omp target teams distribute parallel for IF_CLAUSE MAP_CLAUSE1 IS_DEVICE_CLAUSE HYPRE_BOX_REDUCTION TEAM_CLAUSE)) \ for (HYPRE_Int hypre__thread = 0; hypre__thread < hypre__tot; hypre__thread++) \ {\ zypre_omp4_BoxLoopSet1(i1) /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - * BoxLoop 2 * - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/ #define zypre_omp4_dist_BoxLoop2Begin(ndim, loop_size, dbox1, start1, stride1, i1, dbox2, start2, stride2, i2) \ {\ /* host code: */ \ HYPRE_BOXLOOP_ENTRY_PRINT \ zypre_omp4_BoxLoopDeclareInit(ndim, loop_size) \ zypre_omp4_BoxKDeclareInit(1, start1, dbox1, stride1) \ zypre_omp4_BoxKDeclareInit(2, start2, dbox2, stride2) \ /* device code: */ \ _Pragma (HYPRE_XSTR(omp target teams distribute parallel for IF_CLAUSE MAP_CLAUSE2 IS_DEVICE_CLAUSE HYPRE_BOX_REDUCTION TEAM_CLAUSE)) \ for (HYPRE_Int hypre__thread = 0; hypre__thread < hypre__tot; hypre__thread++) \ {\ zypre_omp4_BoxLoopSet2(i1, i2) /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - * BoxLoop 3 * - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/ #define zypre_omp4_dist_BoxLoop3Begin(ndim, loop_size, \ dbox1, start1, stride1, i1, \ dbox2, start2, stride2, i2, \ dbox3, start3, stride3, i3) \ {\ /* host code: */ \ HYPRE_BOXLOOP_ENTRY_PRINT \ zypre_omp4_BoxLoopDeclareInit(ndim, loop_size) \ zypre_omp4_BoxKDeclareInit(1, start1, dbox1, stride1) \ zypre_omp4_BoxKDeclareInit(2, start2, dbox2, stride2) \ zypre_omp4_BoxKDeclareInit(3, start3, dbox3, stride3) \ /* device code: */ \ _Pragma (HYPRE_XSTR(omp target teams distribute parallel for IF_CLAUSE MAP_CLAUSE3 IS_DEVICE_CLAUSE TEAM_CLAUSE)) \ for (HYPRE_Int hypre__thread = 0; hypre__thread < hypre__tot; hypre__thread++) \ {\ zypre_omp4_BoxLoopSet3(i1, i2, i3) #if 0 #define zypre_omp4_dist_BoxLoop3_SAME_STRIDE_Begin(ndim, loop_size, \ dbox1, start1, stride1, i1, \ dbox2, start2, stride2, i2, o2, \ dbox3, start3, stride3, i3) \ {\ /* host code: */ \ zypre_omp4_BoxLoopDeclareInit(ndim, loop_size) \ zypre_omp4_BoxKDeclareInit(1, start1, dbox1, stride1) \ zypre_omp4_BoxKDeclareInit(2, start2, dbox2, stride2) \ zypre_omp4_BoxKDeclareInit(3, start3, dbox3, stride3) \ /* device code: */ \ _Pragma (HYPRE_XSTR(omp target teams distribute parallel for IF_CLAUSE MAP_CLAUSE3 IS_DEVICE_CLAUSE TEAM_CLAUSE)) \ for (HYPRE_Int hypre__thread = 0; hypre__thread < hypre__tot; hypre__thread++) \ {\ zypre_omp4_BoxLoopSet3_SAME_STRIDE(i1, i2, o2, i3) #endif /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - * BoxLoop 4 * - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/ #define zypre_omp4_dist_BoxLoop4Begin(ndim, loop_size, \ dbox1, start1, stride1, i1, \ dbox2, start2, stride2, i2, \ dbox3, start3, stride3, i3, \ dbox4, start4, stride4, i4) \ {\ /* host code: */ \ HYPRE_BOXLOOP_ENTRY_PRINT \ zypre_omp4_BoxLoopDeclareInit(ndim, loop_size) \ zypre_omp4_BoxKDeclareInit(1, start1, dbox1, stride1) \ zypre_omp4_BoxKDeclareInit(2, start2, dbox2, stride2) \ zypre_omp4_BoxKDeclareInit(3, start3, dbox3, stride3) \ zypre_omp4_BoxKDeclareInit(4, start4, dbox4, stride4) \ /* device code: */ \ _Pragma (HYPRE_XSTR(omp target teams distribute parallel for IF_CLAUSE MAP_CLAUSE4 IS_DEVICE_CLAUSE TEAM_CLAUSE)) \ for (HYPRE_Int hypre__thread = 0; hypre__thread < hypre__tot; hypre__thread++) \ {\ zypre_omp4_BoxLoopSet4(i1, i2, i3, i4) #if 0 /* no longer needed, use the above BoxLoop's for reductions */ /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - * BoxLoop 1 reduction * - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/ #define zypre_omp4_dist_Red_BoxLoop1Begin(ndim, loop_size, dbox1, start1, stride1, i1, xsum) \ {\ /* host code: */ \ zypre_omp4_BoxLoopDeclareInit(ndim, loop_size) \ zypre_omp4_BoxKDeclareInit(1, start1, dbox1, stride1) \ /* device code: */ \ _Pragma (HYPRE_XSTR(omp target teams distribute parallel for IF_CLAUSE MAP_CLAUSE1 map(tofrom: xsum) reduction(+:xsum) TEAM_CLAUSE)) \ for (HYPRE_Int hypre__thread = 0; hypre__thread < hypre__tot; hypre__thread++) \ {\ zypre_omp4_BoxLoopSet1(i1) /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - * BoxLoop 2 reduction * - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/ #define zypre_omp4_dist_Red_BoxLoop2Begin(ndim, loop_size, dbox1, start1, stride1, i1, dbox2, start2, stride2, i2, xsum) \ {\ /* host code: */ \ zypre_omp4_BoxLoopDeclareInit(ndim, loop_size) \ zypre_omp4_BoxKDeclareInit(1, start1, dbox1, stride1) \ zypre_omp4_BoxKDeclareInit(2, start2, dbox2, stride2) \ /* device code: */ \ _Pragma (HYPRE_XSTR(omp target teams distribute parallel for IF_CLAUSE MAP_CLAUSE2 map(tofrom: xsum) reduction(+:xsum) TEAM_CLAUSE)) \ for (HYPRE_Int hypre__thread = 0; hypre__thread < hypre__tot; hypre__thread++) \ {\ zypre_omp4_BoxLoopSet2(i1, i2) #endif /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - * v2 * host code: declare and initialize variables for box k * - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/ #define zypre_omp4_BoxKDeclareInit_v2(k, stridek)\ /* stridek[0,1,2] */ \ HYPRE_Int HYPRE_XCONCAT3(hypre__stride,0,k), HYPRE_XCONCAT3(hypre__stride,1,k), HYPRE_XCONCAT3(hypre__stride,2,k); \ /*if (hypre__ndim > 0)*/ { HYPRE_XCONCAT3(hypre__stride,0,k) = stridek[0]; } \ if (hypre__ndim > 1) { HYPRE_XCONCAT3(hypre__stride,1,k) = stridek[1]; } \ if (hypre__ndim > 2) { HYPRE_XCONCAT3(hypre__stride,2,k) = stridek[2]; } \ /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - * v2 * device code for BoxLoop 1, set i1 * - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/ #define zypre_omp4_BoxLoopSet1Body_v2(j, i1) \ i1 += ( hypre__J % HYPRE_XCONCAT2(hypre__loop_size,j) ) * HYPRE_XCONCAT3(hypre__stride,j,1);\ hypre__J /= HYPRE_XCONCAT2(hypre__loop_size,j); #define zypre_omp4_BoxLoopSet1_v2(i1, idx) \ HYPRE_Int hypre__J, i1, idx; \ idx = hypre__J = hypre__thread; i1 = 0; \ /*if (hypre__ndim > 0)*/ { zypre_omp4_BoxLoopSet1Body_v2(0, i1) } \ if (hypre__ndim > 1) { zypre_omp4_BoxLoopSet1Body_v2(1, i1) } \ if (hypre__ndim > 2) { zypre_omp4_BoxLoopSet1Body_v2(2, i1) } /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - * v2: Basic * BoxLoop 1 * - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/ #define zypre_omp4_dist_BoxLoop1_v2_Begin(ndim, loop_size, stride1, i1, idx) \ {\ /* host code: */ \ HYPRE_BOXLOOP_ENTRY_PRINT \ zypre_omp4_BoxLoopDeclareInit(ndim, loop_size) \ zypre_omp4_BoxKDeclareInit_v2(1, stride1) \ /* device code: */ \ _Pragma (HYPRE_XSTR(omp target teams distribute parallel for IF_CLAUSE MAP_CLAUSE1 IS_DEVICE_CLAUSE TEAM_CLAUSE)) \ for (HYPRE_Int hypre__thread = 0; hypre__thread < hypre__tot; hypre__thread++) \ {\ zypre_omp4_BoxLoopSet1_v2(i1, idx) /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - * v2 * device code for BoxLoop 2, set i1, i2 * - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/ #define zypre_omp4_BoxLoopSet2Body_v2(j, i1, i2) \ hypre__i = hypre__J % HYPRE_XCONCAT2(hypre__loop_size,j); \ /* twice */ \ i1 += hypre__i * HYPRE_XCONCAT3(hypre__stride,j,1); \ i2 += hypre__i * HYPRE_XCONCAT3(hypre__stride,j,2); \ hypre__J /= HYPRE_XCONCAT2(hypre__loop_size,j); #define zypre_omp4_BoxLoopSet2_v2(i1, i2) \ HYPRE_Int hypre__i, hypre__J, i1, i2; \ hypre__J = hypre__thread; i1 = i2 = 0; \ /*if (hypre__ndim > 0)*/ { zypre_omp4_BoxLoopSet2Body_v2(0, i1, i2) } \ if (hypre__ndim > 1) { zypre_omp4_BoxLoopSet2Body_v2(1, i1, i2) } \ if (hypre__ndim > 2) { zypre_omp4_BoxLoopSet2Body_v2(2, i1, i2) } /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - * v2: Basic * BoxLoop 2 * - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/ #define zypre_omp4_dist_BoxLoop2_v2_Begin(ndim, loop_size, stride1, i1, stride2, i2) \ { \ /* host code: */ \ HYPRE_BOXLOOP_ENTRY_PRINT \ zypre_omp4_BoxLoopDeclareInit(ndim, loop_size) \ zypre_omp4_BoxKDeclareInit_v2(1, stride1) \ zypre_omp4_BoxKDeclareInit_v2(2, stride2) \ /* device code: */ \ _Pragma (HYPRE_XSTR(omp target teams distribute parallel for IF_CLAUSE MAP_CLAUSE2 IS_DEVICE_CLAUSE TEAM_CLAUSE)) \ for (HYPRE_Int hypre__thread = 0; hypre__thread < hypre__tot; hypre__thread++) \ { \ zypre_omp4_BoxLoopSet2_v2(i1, i2) /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - * Basic Loop * - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/ #define zypre_omp4_dist_LoopBegin(size, idx) \ { \ /* host code: */ \ /* HYPRE_Int idx = 0; */\ HYPRE_Int hypre__tot = size; \ HYPRE_BOXLOOP_ENTRY_PRINT \ /* device code: */ \ _Pragma (HYPRE_XSTR(omp target teams distribute parallel for IF_CLAUSE MAP_CLAUSE2 IS_DEVICE_CLAUSE TEAM_CLAUSE)) \ for (HYPRE_Int idx = 0; idx < hypre__tot; idx++) \ { #define hypre_BoxLoopGetIndex(index) \ index[0] = hypre__id_0; \ index[1] = hypre__id_1; \ index[2] = hypre__id_2; /* Reduction */ #define hypre_BoxLoop1ReductionBegin(ndim, loop_size, dbox1, start1, stride1, i1, reducesum) \ hypre_BoxLoop1Begin(ndim, loop_size, dbox1, start1, stride1, i1) #define hypre_BoxLoop1ReductionEnd(i1, reducesum) \ hypre_BoxLoop1End(i1) #define hypre_BoxLoop2ReductionBegin(ndim, loop_size, dbox1, start1, stride1, i1, \ dbox2, start2, stride2, i2, reducesum) \ hypre_BoxLoop2Begin(ndim, loop_size, dbox1, start1, stride1, i1, \ dbox2, start2, stride2, i2) #define hypre_BoxLoop2ReductionEnd(i1, i2, reducesum) \ hypre_BoxLoop2End(i1, i2) #endif #endif /* #ifndef HYPRE_BOXLOOP_DEVICEOMP_HEADER */ hypre-2.33.0/src/struct_mv/boxloop_raja.h000066400000000000000000000457751477326011500204230ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * Header info for the BoxLoop * *****************************************************************************/ /*-------------------------------------------------------------------------- * BoxLoop macros: *--------------------------------------------------------------------------*/ #ifndef HYPRE_BOXLOOP_RAJA_HEADER #define HYPRE_BOXLOOP_RAJA_HEADER #if defined(HYPRE_USING_RAJA) #ifdef __cplusplus extern "C++" { #endif #include using namespace RAJA; #ifdef __cplusplus } #endif typedef struct hypre_Boxloop_struct { HYPRE_Int lsize0, lsize1, lsize2; HYPRE_Int strides0, strides1, strides2; HYPRE_Int bstart0, bstart1, bstart2; HYPRE_Int bsize0, bsize1, bsize2; } hypre_Boxloop; #if defined(HYPRE_USING_CUDA) /* RAJA with CUDA, running on device */ #define BLOCKSIZE HYPRE_1D_BLOCK_SIZE #define hypre_RAJA_DEVICE RAJA_DEVICE #define hypre_raja_exec_policy cuda_exec /* #define hypre_raja_reduce_policy cuda_reduce_atomic */ #define hypre_raja_reduce_policy cuda_reduce // #define hypre_fence() /* #define hypre_fence() \ cudaError err = cudaGetLastError();\ if ( cudaSuccess != err ) {\ printf("\n ERROR zypre_newBoxLoop: %s in %s(%d) function %s\n",cudaGetErrorString(err),__FILE__,__LINE__,__FUNCTION__); \ }\ hypre_CheckErrorDevice(cudaDeviceSynchronize()); */ #elif defined(HYPRE_USING_DEVICE_OPENMP) /* RAJA with OpenMP (>4.5), running on device */ #define hypre_RAJA_DEVICE #define hypre_raja_exec_policy omp_target_parallel_for_exec #define hypre_raja_reduce_policy omp_target_reduce #define hypre_fence() #elif defined(HYPRE_USING_OPENMP) /* RAJA with OpenMP, running on host (CPU) */ #define hypre_RAJA_DEVICE #define hypre_raja_exec_policy omp_for_exec #define hypre_raja_reduce_policy omp_reduce #define hypre_fence() #else /* RAJA, running on host (CPU) */ #define hypre_RAJA_DEVICE #define hypre_raja_exec_policy seq_exec #define hypre_raja_reduce_policy seq_reduce #define hypre_fence() #endif /* #if defined(HYPRE_USING_CUDA) */ #define zypre_BoxLoopIncK(k,box,hypre__i) \ HYPRE_Int hypre_boxD##k = 1; \ HYPRE_Int hypre__i = 0; \ hypre__i += (hypre_IndexD(local_idx, 0)*box.strides0 + box.bstart0) * hypre_boxD##k; \ hypre_boxD##k *= hypre_max(0, box.bsize0 + 1); \ hypre__i += (hypre_IndexD(local_idx, 1)*box.strides1 + box.bstart1) * hypre_boxD##k; \ hypre_boxD##k *= hypre_max(0, box.bsize1 + 1); \ hypre__i += (hypre_IndexD(local_idx, 2)*box.strides2 + box.bstart2) * hypre_boxD##k; \ hypre_boxD##k *= hypre_max(0, box.bsize2 + 1); \ #define zypre_newBoxLoopInit(ndim,loop_size) \ HYPRE_Int hypre__tot = 1; \ for (HYPRE_Int d = 0;d < ndim;d ++) \ hypre__tot *= loop_size[d]; #define zypre_newBoxLoopDeclare(box) \ hypre_Index local_idx; \ HYPRE_Int idx_local = idx; \ hypre_IndexD(local_idx, 0) = idx_local % box.lsize0; \ idx_local = idx_local / box.lsize0; \ hypre_IndexD(local_idx, 1) = idx_local % box.lsize1; \ idx_local = idx_local / box.lsize1; \ hypre_IndexD(local_idx, 2) = idx_local % box.lsize2; #define zypre_BoxLoopDataDeclareK(k,ndim,loop_size,dbox,start,stride) \ hypre_Boxloop databox##k; \ databox##k.lsize0 = loop_size[0]; \ databox##k.strides0 = stride[0]; \ databox##k.bstart0 = start[0] - dbox->imin[0]; \ databox##k.bsize0 = dbox->imax[0]-dbox->imin[0]; \ if (ndim > 1) \ { \ databox##k.lsize1 = loop_size[1]; \ databox##k.strides1 = stride[1]; \ databox##k.bstart1 = start[1] - dbox->imin[1]; \ databox##k.bsize1 = dbox->imax[1]-dbox->imin[1]; \ } \ else \ { \ databox##k.lsize1 = 1; \ databox##k.strides1 = 0; \ databox##k.bstart1 = 0; \ databox##k.bsize1 = 0; \ } \ if (ndim == 3) \ { \ databox##k.lsize2 = loop_size[2]; \ databox##k.strides2 = stride[2]; \ databox##k.bstart2 = start[2] - dbox->imin[2]; \ databox##k.bsize2 = dbox->imax[2]-dbox->imin[2]; \ } \ else \ { \ databox##k.lsize2 = 1; \ databox##k.strides2 = 0; \ databox##k.bstart2 = 0; \ databox##k.bsize2 = 0; \ } #define zypre_newBoxLoop0Begin(ndim, loop_size) \ { \ zypre_newBoxLoopInit(ndim,loop_size); \ forall< hypre_raja_exec_policy >(RangeSegment(0, hypre__tot), [=] hypre_RAJA_DEVICE (HYPRE_Int idx) \ { #define zypre_newBoxLoop0End() \ }); \ hypre_fence(); \ } #define zypre_newBoxLoop1Begin(ndim, loop_size, \ dbox1, start1, stride1, i1) \ { \ zypre_newBoxLoopInit(ndim,loop_size); \ zypre_BoxLoopDataDeclareK(1,ndim,loop_size,dbox1,start1,stride1); \ forall< hypre_raja_exec_policy >(RangeSegment(0, hypre__tot), [=] hypre_RAJA_DEVICE (HYPRE_Int idx) \ { \ zypre_newBoxLoopDeclare(databox1); \ zypre_BoxLoopIncK(1,databox1,i1); #define zypre_newBoxLoop1End(i1) \ }); \ hypre_fence(); \ } #define zypre_newBoxLoop2Begin(ndim, loop_size, \ dbox1, start1, stride1, i1, \ dbox2, start2, stride2, i2) \ { \ zypre_newBoxLoopInit(ndim,loop_size); \ zypre_BoxLoopDataDeclareK(1,ndim,loop_size,dbox1,start1,stride1); \ zypre_BoxLoopDataDeclareK(2,ndim,loop_size,dbox2,start2,stride2); \ forall< hypre_raja_exec_policy >(RangeSegment(0, hypre__tot), [=] hypre_RAJA_DEVICE (HYPRE_Int idx) \ { \ zypre_newBoxLoopDeclare(databox1); \ zypre_BoxLoopIncK(1,databox1,i1); \ zypre_BoxLoopIncK(2,databox2,i2); #define zypre_newBoxLoop2End(i1, i2) \ }); \ hypre_fence(); \ } #define zypre_newBoxLoop3Begin(ndim, loop_size, \ dbox1, start1, stride1, i1, \ dbox2, start2, stride2, i2, \ dbox3, start3, stride3, i3) \ { \ zypre_newBoxLoopInit(ndim,loop_size); \ zypre_BoxLoopDataDeclareK(1,ndim,loop_size,dbox1,start1,stride1); \ zypre_BoxLoopDataDeclareK(2,ndim,loop_size,dbox2,start2,stride2); \ zypre_BoxLoopDataDeclareK(3,ndim,loop_size,dbox3,start3,stride3); \ forall< hypre_raja_exec_policy >(RangeSegment(0, hypre__tot), [=] hypre_RAJA_DEVICE (HYPRE_Int idx) \ { \ zypre_newBoxLoopDeclare(databox1); \ zypre_BoxLoopIncK(1,databox1,i1); \ zypre_BoxLoopIncK(2,databox2,i2); \ zypre_BoxLoopIncK(3,databox3,i3); #define zypre_newBoxLoop3End(i1, i2, i3) \ }); \ hypre_fence(); \ } #define zypre_newBoxLoop4Begin(ndim, loop_size, \ dbox1, start1, stride1, i1, \ dbox2, start2, stride2, i2, \ dbox3, start3, stride3, i3, \ dbox4, start4, stride4, i4) \ { \ zypre_newBoxLoopInit(ndim,loop_size); \ zypre_BoxLoopDataDeclareK(1,ndim,loop_size,dbox1,start1,stride1); \ zypre_BoxLoopDataDeclareK(2,ndim,loop_size,dbox2,start2,stride2); \ zypre_BoxLoopDataDeclareK(3,ndim,loop_size,dbox3,start3,stride3); \ zypre_BoxLoopDataDeclareK(4,ndim,loop_size,dbox4,start4,stride4); \ forall< hypre_raja_exec_policy >(RangeSegment(0, hypre__tot), [=] hypre_RAJA_DEVICE (HYPRE_Int idx) \ { \ zypre_newBoxLoopDeclare(databox1); \ zypre_BoxLoopIncK(1,databox1,i1); \ zypre_BoxLoopIncK(2,databox2,i2); \ zypre_BoxLoopIncK(3,databox3,i3); \ zypre_BoxLoopIncK(4,databox4,i4); #define zypre_newBoxLoop4End(i1, i2, i3, i4) \ }); \ hypre_fence(); \ } #define zypre_BasicBoxLoopDataDeclareK(k,ndim,loop_size,stride) \ hypre_Boxloop databox##k; \ databox##k.lsize0 = loop_size[0]; \ databox##k.strides0 = stride[0]; \ databox##k.bstart0 = 0; \ databox##k.bsize0 = 0; \ if (ndim > 1) \ { \ databox##k.lsize1 = loop_size[1]; \ databox##k.strides1 = stride[1]; \ databox##k.bstart1 = 0; \ databox##k.bsize1 = 0; \ } \ else \ { \ databox##k.lsize1 = 1; \ databox##k.strides1 = 0; \ databox##k.bstart1 = 0; \ databox##k.bsize1 = 0; \ } \ if (ndim == 3) \ { \ databox##k.lsize2 = loop_size[2]; \ databox##k.strides2 = stride[2]; \ databox##k.bstart2 = 0; \ databox##k.bsize2 = 0; \ } \ else \ { \ databox##k.lsize2 = 1; \ databox##k.strides2 = 0; \ databox##k.bstart2 = 0; \ databox##k.bsize2 = 0; \ } #define zypre_newBasicBoxLoop2Begin(ndim, loop_size, \ stride1, i1, \ stride2, i2) \ { \ zypre_newBoxLoopInit(ndim,loop_size); \ zypre_BasicBoxLoopDataDeclareK(1,ndim,loop_size,stride1); \ zypre_BasicBoxLoopDataDeclareK(2,ndim,loop_size,stride2); \ forall< hypre_raja_exec_policy >(RangeSegment(0, hypre__tot), [=] hypre_RAJA_DEVICE (HYPRE_Int idx) \ { \ zypre_newBoxLoopDeclare(databox1); \ zypre_BoxLoopIncK(1,databox1,i1); \ zypre_BoxLoopIncK(2,databox2,i2); \ #define hypre_LoopBegin(size,idx) \ { \ forall< hypre_raja_exec_policy >(RangeSegment(0, size), [=] hypre_RAJA_DEVICE (HYPRE_Int idx) \ { #define hypre_LoopEnd() \ }); \ hypre_fence(); \ } #define hypre_BoxLoopGetIndex(index) \ index[0] = hypre_IndexD(local_idx, 0); \ index[1] = hypre_IndexD(local_idx, 1); \ index[2] = hypre_IndexD(local_idx, 2); #define hypre_BoxLoopBlock() 0 #define hypre_BoxLoop0Begin zypre_newBoxLoop0Begin #define hypre_BoxLoop0For zypre_newBoxLoop0For #define hypre_BoxLoop0End zypre_newBoxLoop0End #define hypre_BoxLoop1Begin zypre_newBoxLoop1Begin #define hypre_BoxLoop1For zypre_newBoxLoop1For #define hypre_BoxLoop1End zypre_newBoxLoop1End #define hypre_BoxLoop2Begin zypre_newBoxLoop2Begin #define hypre_BoxLoop2For zypre_newBoxLoop2For #define hypre_BoxLoop2End zypre_newBoxLoop2End #define hypre_BoxLoop3Begin zypre_newBoxLoop3Begin #define hypre_BoxLoop3For zypre_newBoxLoop3For #define hypre_BoxLoop3End zypre_newBoxLoop3End #define hypre_BoxLoop4Begin zypre_newBoxLoop4Begin #define hypre_BoxLoop4For zypre_newBoxLoop4For #define hypre_BoxLoop4End zypre_newBoxLoop4End #define hypre_newBoxLoopInit zypre_newBoxLoopInit #define hypre_BasicBoxLoop2Begin zypre_newBasicBoxLoop2Begin /* Reduction */ #define hypre_BoxLoop1ReductionBegin(ndim, loop_size, dbox1, start1, stride1, i1, reducesum) \ hypre_BoxLoop1Begin(ndim, loop_size, dbox1, start1, stride1, i1) #define hypre_BoxLoop1ReductionEnd(i1, reducesum) \ hypre_BoxLoop1End(i1) #define hypre_BoxLoop2ReductionBegin(ndim, loop_size, dbox1, start1, stride1, i1, \ dbox2, start2, stride2, i2, reducesum) \ hypre_BoxLoop2Begin(ndim, loop_size, dbox1, start1, stride1, i1, \ dbox2, start2, stride2, i2) #define hypre_BoxLoop2ReductionEnd(i1, i2, reducesum) \ hypre_BoxLoop2End(i1, i2) #endif #endif /* #ifndef HYPRE_BOXLOOP_RAJA_HEADER */ hypre-2.33.0/src/struct_mv/boxloop_sycl.h000066400000000000000000000661741477326011500204540ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * Header info for the BoxLoop * *****************************************************************************/ /*-------------------------------------------------------------------------- * BoxLoop macros: *--------------------------------------------------------------------------*/ #ifndef HYPRE_BOXLOOP_SYCL_HEADER #define HYPRE_BOXLOOP_SYCL_HEADER #if defined(HYPRE_USING_SYCL) && !defined(HYPRE_USING_RAJA) && !defined(HYPRE_USING_KOKKOS) typedef struct hypre_Boxloop_struct { HYPRE_Int lsize0, lsize1, lsize2; HYPRE_Int strides0, strides1, strides2; HYPRE_Int bstart0, bstart1, bstart2; HYPRE_Int bsize0, bsize1, bsize2; } hypre_Boxloop; #ifdef __cplusplus extern "C++" { #endif /********************************************************************* * wrapper functions calling sycl parallel_for * WM: todo - add runtime switch between CPU/GPU execution *********************************************************************/ template void BoxLoopforall( HYPRE_Int length, LOOP_BODY loop_body) { if (length <= 0) { return; } dim3 bDim = hypre_GetDefaultDeviceBlockDimension(); dim3 gDim = hypre_GetDefaultDeviceGridDimension(length, "thread", bDim); hypre_HandleComputeStream(hypre_handle())->submit([&] (sycl::handler & cgh) { cgh.parallel_for(sycl::nd_range<3>(gDim * bDim, bDim), loop_body); }).wait_and_throw(); } template void ReductionBoxLoopforall( LOOP_BODY loop_body, HYPRE_Int length, HYPRE_Real * shared_sum_var ) { if (length <= 0) { return; } dim3 bDim = hypre_GetDefaultDeviceBlockDimension(); dim3 gDim = hypre_GetDefaultDeviceGridDimension(length, "thread", bDim); hypre_HandleComputeStream(hypre_handle())->submit([&] (sycl::handler & cgh) { cgh.parallel_for(sycl::nd_range<3>(gDim * bDim, bDim), sycl::reduction(shared_sum_var, std::plus<>()), loop_body); }).wait_and_throw(); } #ifdef __cplusplus } #endif /********************************************************************* * Init/Declare/IncK etc. *********************************************************************/ /* Get 1-D length of the loop, in hypre__tot */ #define hypre_newBoxLoopInit(ndim, loop_size) \ HYPRE_Int hypre__tot = 1; \ for (HYPRE_Int hypre_d = 0; hypre_d < ndim; hypre_d ++) \ { \ hypre__tot *= loop_size[hypre_d]; \ } /* Initialize struct for box-k */ #define hypre_BoxLoopDataDeclareK(k, ndim, loop_size, dbox, start, stride) \ hypre_Boxloop databox##k; \ databox##k.lsize0 = loop_size[0]; \ databox##k.strides0 = stride[0]; \ databox##k.bstart0 = start[0] - dbox->imin[0]; \ databox##k.bsize0 = dbox->imax[0] - dbox->imin[0]; \ if (ndim > 1) \ { \ databox##k.lsize1 = loop_size[1]; \ databox##k.strides1 = stride[1]; \ databox##k.bstart1 = start[1] - dbox->imin[1]; \ databox##k.bsize1 = dbox->imax[1] - dbox->imin[1]; \ } \ else \ { \ databox##k.lsize1 = 1; \ databox##k.strides1 = 0; \ databox##k.bstart1 = 0; \ databox##k.bsize1 = 0; \ } \ if (ndim == 3) \ { \ databox##k.lsize2 = loop_size[2]; \ databox##k.strides2 = stride[2]; \ databox##k.bstart2 = start[2] - dbox->imin[2]; \ databox##k.bsize2 = dbox->imax[2] - dbox->imin[2]; \ } \ else \ { \ databox##k.lsize2 = 1; \ databox##k.strides2 = 0; \ databox##k.bstart2 = 0; \ databox##k.bsize2 = 0; \ } #define hypre_BasicBoxLoopDataDeclareK(k,ndim,loop_size,stride) \ hypre_Boxloop databox##k; \ databox##k.lsize0 = loop_size[0]; \ databox##k.strides0 = stride[0]; \ databox##k.bstart0 = 0; \ databox##k.bsize0 = 0; \ if (ndim > 1) \ { \ databox##k.lsize1 = loop_size[1]; \ databox##k.strides1 = stride[1]; \ databox##k.bstart1 = 0; \ databox##k.bsize1 = 0; \ } \ else \ { \ databox##k.lsize1 = 1; \ databox##k.strides1 = 0; \ databox##k.bstart1 = 0; \ databox##k.bsize1 = 0; \ } \ if (ndim == 3) \ { \ databox##k.lsize2 = loop_size[2]; \ databox##k.strides2 = stride[2]; \ databox##k.bstart2 = 0; \ databox##k.bsize2 = 0; \ } \ else \ { \ databox##k.lsize2 = 1; \ databox##k.strides2 = 0; \ databox##k.bstart2 = 0; \ databox##k.bsize2 = 0; \ } /* Given input 1-D 'idx' in box, get 3-D 'local_idx' in loop_size */ #define hypre_newBoxLoopDeclare(box) \ hypre_Index local_idx; \ HYPRE_Int idx_local = idx; \ hypre_IndexD(local_idx, 0) = idx_local % box.lsize0; \ idx_local = idx_local / box.lsize0; \ hypre_IndexD(local_idx, 1) = idx_local % box.lsize1; \ idx_local = idx_local / box.lsize1; \ hypre_IndexD(local_idx, 2) = idx_local % box.lsize2; \ /* Given input 3-D 'local_idx', get 1-D 'hypre__i' in 'box' */ #define hypre_BoxLoopIncK(k, box, hypre__i) \ HYPRE_Int hypre_boxD##k = 1; \ HYPRE_Int hypre__i = 0; \ hypre__i += (hypre_IndexD(local_idx, 0) * box.strides0 + box.bstart0) * hypre_boxD##k; \ hypre_boxD##k *= hypre_max(0, box.bsize0 + 1); \ hypre__i += (hypre_IndexD(local_idx, 1) * box.strides1 + box.bstart1) * hypre_boxD##k; \ hypre_boxD##k *= hypre_max(0, box.bsize1 + 1); \ hypre__i += (hypre_IndexD(local_idx, 2) * box.strides2 + box.bstart2) * hypre_boxD##k; \ hypre_boxD##k *= hypre_max(0, box.bsize2 + 1); /* get 3-D local_idx into 'index' */ #define hypre_BoxLoopGetIndex(index) \ index[0] = hypre_IndexD(local_idx, 0); \ index[1] = hypre_IndexD(local_idx, 1); \ index[2] = hypre_IndexD(local_idx, 2); /********************************************************************* * Boxloops *********************************************************************/ /* BoxLoop 0 */ #define hypre_newBoxLoop0Begin(ndim, loop_size) \ { \ hypre_newBoxLoopInit(ndim, loop_size); \ BoxLoopforall(hypre__tot, [=] (sycl::nd_item<3> item) \ { \ HYPRE_Int idx = (HYPRE_Int) item.get_global_linear_id(); \ if (idx < hypre__tot) \ { \ #define hypre_newBoxLoop0End() \ } \ }); \ } /* BoxLoop 1 */ #define hypre_newBoxLoop1Begin(ndim, loop_size, dbox1, start1, stride1, i1) \ { \ hypre_newBoxLoopInit(ndim, loop_size); \ hypre_BoxLoopDataDeclareK(1, ndim, loop_size, dbox1, start1, stride1); \ BoxLoopforall(hypre__tot, [=] (sycl::nd_item<3> item) \ { \ HYPRE_Int idx = (HYPRE_Int) item.get_global_linear_id(); \ if (idx < hypre__tot) \ { \ hypre_newBoxLoopDeclare(databox1); \ hypre_BoxLoopIncK(1, databox1, i1); #define hypre_newBoxLoop1End(i1) \ } \ }); \ } /* BoxLoop 2 */ #define hypre_newBoxLoop2Begin(ndim, loop_size, dbox1, start1, stride1, i1, \ dbox2, start2, stride2, i2) \ { \ hypre_newBoxLoopInit(ndim, loop_size); \ hypre_BoxLoopDataDeclareK(1, ndim, loop_size, dbox1, start1, stride1); \ hypre_BoxLoopDataDeclareK(2, ndim, loop_size, dbox2, start2, stride2); \ BoxLoopforall(hypre__tot, [=] (sycl::nd_item<3> item) \ { \ HYPRE_Int idx = (HYPRE_Int) item.get_global_linear_id(); \ if (idx < hypre__tot) \ { \ hypre_newBoxLoopDeclare(databox1); \ hypre_BoxLoopIncK(1, databox1, i1); \ hypre_BoxLoopIncK(2, databox2, i2); #define hypre_newBoxLoop2End(i1, i2) \ } \ }); \ } /* BoxLoop 3 */ #define hypre_newBoxLoop3Begin(ndim, loop_size, dbox1, start1, stride1, i1, \ dbox2, start2, stride2, i2, \ dbox3, start3, stride3, i3) \ { \ hypre_newBoxLoopInit(ndim, loop_size); \ hypre_BoxLoopDataDeclareK(1, ndim,loop_size, dbox1, start1, stride1); \ hypre_BoxLoopDataDeclareK(2, ndim,loop_size, dbox2, start2, stride2); \ hypre_BoxLoopDataDeclareK(3, ndim,loop_size, dbox3, start3, stride3); \ BoxLoopforall(hypre__tot, [=] (sycl::nd_item<3> item) \ { \ HYPRE_Int idx = (HYPRE_Int) item.get_global_linear_id(); \ if (idx < hypre__tot) \ { \ hypre_newBoxLoopDeclare(databox1); \ hypre_BoxLoopIncK(1, databox1, i1); \ hypre_BoxLoopIncK(2, databox2, i2); \ hypre_BoxLoopIncK(3, databox3, i3); #define hypre_newBoxLoop3End(i1, i2, i3) \ } \ }); \ } /* BoxLoop 4 */ #define hypre_newBoxLoop4Begin(ndim, loop_size, dbox1, start1, stride1, i1, \ dbox2, start2, stride2, i2, \ dbox3, start3, stride3, i3, \ dbox4, start4, stride4, i4) \ { \ hypre_newBoxLoopInit(ndim, loop_size); \ hypre_BoxLoopDataDeclareK(1, ndim, loop_size, dbox1, start1, stride1); \ hypre_BoxLoopDataDeclareK(2, ndim, loop_size, dbox2, start2, stride2); \ hypre_BoxLoopDataDeclareK(3, ndim, loop_size, dbox3, start3, stride3); \ hypre_BoxLoopDataDeclareK(4, ndim, loop_size, dbox4, start4, stride4); \ BoxLoopforall(hypre__tot, [=] (sycl::nd_item<3> item) \ { \ HYPRE_Int idx = (HYPRE_Int) item.get_global_linear_id(); \ if (idx < hypre__tot) \ { \ hypre_newBoxLoopDeclare(databox1); \ hypre_BoxLoopIncK(1, databox1, i1); \ hypre_BoxLoopIncK(2, databox2, i2); \ hypre_BoxLoopIncK(3, databox3, i3); \ hypre_BoxLoopIncK(4, databox4, i4); #define hypre_newBoxLoop4End(i1, i2, i3, i4) \ } \ }); \ } /* Basic BoxLoops have no boxes */ /* BoxLoop 1 */ #define hypre_newBasicBoxLoop1Begin(ndim, loop_size, stride1, i1) \ { \ hypre_newBoxLoopInit(ndim, loop_size); \ hypre_BasicBoxLoopDataDeclareK(1, ndim, loop_size, stride1); \ BoxLoopforall(hypre__tot, [=] (sycl::nd_item<3> item) \ { \ HYPRE_Int idx = (HYPRE_Int) item.get_global_linear_id(); \ if (idx < hypre__tot) \ { \ hypre_newBoxLoopDeclare(databox1); \ hypre_BoxLoopIncK(1, databox1, i1); /* BoxLoop 2 */ #define hypre_newBasicBoxLoop2Begin(ndim, loop_size, stride1, i1, stride2, i2) \ { \ hypre_newBoxLoopInit(ndim, loop_size); \ hypre_BasicBoxLoopDataDeclareK(1, ndim, loop_size, stride1); \ hypre_BasicBoxLoopDataDeclareK(2, ndim, loop_size, stride2); \ BoxLoopforall(hypre__tot, [=] (sycl::nd_item<3> item) \ { \ HYPRE_Int idx = (HYPRE_Int) item.get_global_linear_id(); \ if (idx < hypre__tot) \ { \ hypre_newBoxLoopDeclare(databox1); \ hypre_BoxLoopIncK(1, databox1, i1); \ hypre_BoxLoopIncK(2, databox2, i2); /* Reduction BoxLoop1 */ #define hypre_newBoxLoop1ReductionBegin(ndim, loop_size, dbox1, start1, stride1, i1, sum_var) \ { \ hypre_newBoxLoopInit(ndim, loop_size); \ hypre_BoxLoopDataDeclareK(1, ndim, loop_size, dbox1, start1, stride1); \ HYPRE_Real *shared_sum_var = hypre_CTAlloc(HYPRE_Real, 1, HYPRE_MEMORY_DEVICE); \ hypre_TMemcpy(shared_sum_var, &sum_var, HYPRE_Real, 1, HYPRE_MEMORY_DEVICE, HYPRE_MEMORY_HOST); \ ReductionBoxLoopforall( [=,hypre_unused_var=sum_var] (sycl::nd_item<3> item, auto &sum_var) \ { \ HYPRE_Int idx = (HYPRE_Int) item.get_global_linear_id(); \ if (idx < hypre__tot) \ { \ hypre_newBoxLoopDeclare(databox1); \ hypre_BoxLoopIncK(1, databox1, i1); #define hypre_newBoxLoop1ReductionEnd(i1, sum_var) \ } \ }, hypre__tot, shared_sum_var); \ hypre_TMemcpy(&sum_var, shared_sum_var, HYPRE_Real, 1, HYPRE_MEMORY_HOST, HYPRE_MEMORY_DEVICE); \ hypre_TFree(shared_sum_var, HYPRE_MEMORY_DEVICE); \ } /* Reduction BoxLoop2 */ #define hypre_newBoxLoop2ReductionBegin(ndim, loop_size, dbox1, start1, stride1, i1, \ dbox2, start2, stride2, i2, sum_var) \ { \ hypre_newBoxLoopInit(ndim, loop_size); \ hypre_BoxLoopDataDeclareK(1, ndim, loop_size, dbox1, start1, stride1); \ hypre_BoxLoopDataDeclareK(2, ndim, loop_size, dbox2, start2, stride2); \ HYPRE_Real *shared_sum_var = hypre_CTAlloc(HYPRE_Real, 1, HYPRE_MEMORY_DEVICE); \ hypre_TMemcpy(shared_sum_var, &sum_var, HYPRE_Real, 1, HYPRE_MEMORY_DEVICE, HYPRE_MEMORY_HOST); \ ReductionBoxLoopforall( [=,hypre_unused_var=sum_var] (sycl::nd_item<3> item, auto &sum_var) \ { \ HYPRE_Int idx = (HYPRE_Int) item.get_global_linear_id(); \ if (idx < hypre__tot) \ { \ hypre_newBoxLoopDeclare(databox1); \ hypre_BoxLoopIncK(1, databox1, i1); \ hypre_BoxLoopIncK(2, databox2, i2); #define hypre_newBoxLoop2ReductionEnd(i1, i2, sum_var) \ } \ }, hypre__tot, shared_sum_var); \ hypre_TMemcpy(&sum_var, shared_sum_var, HYPRE_Real, 1, HYPRE_MEMORY_HOST, HYPRE_MEMORY_DEVICE); \ hypre_TFree(shared_sum_var, HYPRE_MEMORY_DEVICE); \ } /* Plain parallel_for loop */ #define hypre_LoopBegin(size, idx) \ { \ HYPRE_Int hypre__tot = size; \ BoxLoopforall(hypre__tot, [=] (sycl::nd_item<3> item) \ { \ HYPRE_Int idx = (HYPRE_Int) item.get_global_linear_id(); \ if (idx < hypre__tot) \ { \ #define hypre_LoopEnd() \ } \ }); \ } /********************************************************************* * renamings *********************************************************************/ #define hypre_BoxLoopBlock() 0 #define hypre_BoxLoop0Begin hypre_newBoxLoop0Begin #define hypre_BoxLoop0End hypre_newBoxLoop0End #define hypre_BoxLoop1Begin hypre_newBoxLoop1Begin #define hypre_BoxLoop1End hypre_newBoxLoop1End #define hypre_BoxLoop2Begin hypre_newBoxLoop2Begin #define hypre_BoxLoop2End hypre_newBoxLoop2End #define hypre_BoxLoop3Begin hypre_newBoxLoop3Begin #define hypre_BoxLoop3End hypre_newBoxLoop3End #define hypre_BoxLoop4Begin hypre_newBoxLoop4Begin #define hypre_BoxLoop4End hypre_newBoxLoop4End #define hypre_BasicBoxLoop1Begin hypre_newBasicBoxLoop1Begin #define hypre_BasicBoxLoop2Begin hypre_newBasicBoxLoop2Begin /* Reduction */ #define hypre_BoxLoop1ReductionBegin(ndim, loop_size, dbox1, start1, stride1, i1, reducesum) \ hypre_newBoxLoop1ReductionBegin(ndim, loop_size, dbox1, start1, stride1, i1, reducesum) #define hypre_BoxLoop1ReductionEnd(i1, reducesum) \ hypre_newBoxLoop1ReductionEnd(i1, reducesum) #define hypre_BoxLoop2ReductionBegin(ndim, loop_size, dbox1, start1, stride1, i1, \ dbox2, start2, stride2, i2, reducesum) \ hypre_newBoxLoop2ReductionBegin(ndim, loop_size, dbox1, start1, stride1, i1, \ dbox2, start2, stride2, i2, reducesum) #define hypre_BoxLoop2ReductionEnd(i1, i2, reducesum) \ hypre_newBoxLoop2ReductionEnd(i1, i2, reducesum) #endif #endif /* #ifndef HYPRE_BOXLOOP_SYCL_HEADER */ hypre-2.33.0/src/struct_mv/communication_info.c000066400000000000000000001070361477326011500216040ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "_hypre_struct_mv.h" /*-------------------------------------------------------------------------- * Note that send_coords, recv_coords, send_dirs, recv_dirs may be NULL to * represent an identity transform. *--------------------------------------------------------------------------*/ HYPRE_Int hypre_CommInfoCreate( hypre_BoxArrayArray *send_boxes, hypre_BoxArrayArray *recv_boxes, HYPRE_Int **send_procs, HYPRE_Int **recv_procs, HYPRE_Int **send_rboxnums, HYPRE_Int **recv_rboxnums, hypre_BoxArrayArray *send_rboxes, hypre_BoxArrayArray *recv_rboxes, HYPRE_Int boxes_match, hypre_CommInfo **comm_info_ptr ) { hypre_CommInfo *comm_info; comm_info = hypre_TAlloc(hypre_CommInfo, 1, HYPRE_MEMORY_HOST); hypre_CommInfoNDim(comm_info) = hypre_BoxArrayArrayNDim(send_boxes); hypre_CommInfoSendBoxes(comm_info) = send_boxes; hypre_CommInfoRecvBoxes(comm_info) = recv_boxes; hypre_CommInfoSendProcesses(comm_info) = send_procs; hypre_CommInfoRecvProcesses(comm_info) = recv_procs; hypre_CommInfoSendRBoxnums(comm_info) = send_rboxnums; hypre_CommInfoRecvRBoxnums(comm_info) = recv_rboxnums; hypre_CommInfoSendRBoxes(comm_info) = send_rboxes; hypre_CommInfoRecvRBoxes(comm_info) = recv_rboxes; hypre_CommInfoNumTransforms(comm_info) = 0; hypre_CommInfoCoords(comm_info) = NULL; hypre_CommInfoDirs(comm_info) = NULL; hypre_CommInfoSendTransforms(comm_info) = NULL; hypre_CommInfoRecvTransforms(comm_info) = NULL; hypre_CommInfoBoxesMatch(comm_info) = boxes_match; hypre_SetIndex(hypre_CommInfoSendStride(comm_info), 1); hypre_SetIndex(hypre_CommInfoRecvStride(comm_info), 1); *comm_info_ptr = comm_info; return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_CommInfoSetTransforms( hypre_CommInfo *comm_info, HYPRE_Int num_transforms, hypre_Index *coords, hypre_Index *dirs, HYPRE_Int **send_transforms, HYPRE_Int **recv_transforms ) { hypre_CommInfoNumTransforms(comm_info) = num_transforms; hypre_CommInfoCoords(comm_info) = coords; hypre_CommInfoDirs(comm_info) = dirs; hypre_CommInfoSendTransforms(comm_info) = send_transforms; hypre_CommInfoRecvTransforms(comm_info) = recv_transforms; return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_CommInfoGetTransforms( hypre_CommInfo *comm_info, HYPRE_Int *num_transforms, hypre_Index **coords, hypre_Index **dirs ) { *num_transforms = hypre_CommInfoNumTransforms(comm_info); *coords = hypre_CommInfoCoords(comm_info); *dirs = hypre_CommInfoDirs(comm_info); return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_CommInfoProjectSend( hypre_CommInfo *comm_info, hypre_Index index, hypre_Index stride ) { hypre_ProjectBoxArrayArray(hypre_CommInfoSendBoxes(comm_info), index, stride); hypre_ProjectBoxArrayArray(hypre_CommInfoSendRBoxes(comm_info), index, stride); hypre_CopyIndex(stride, hypre_CommInfoSendStride(comm_info)); return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_CommInfoProjectRecv( hypre_CommInfo *comm_info, hypre_Index index, hypre_Index stride ) { hypre_ProjectBoxArrayArray(hypre_CommInfoRecvBoxes(comm_info), index, stride); hypre_ProjectBoxArrayArray(hypre_CommInfoRecvRBoxes(comm_info), index, stride); hypre_CopyIndex(stride, hypre_CommInfoRecvStride(comm_info)); return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_CommInfoDestroy( hypre_CommInfo *comm_info ) { HYPRE_Int **processes; HYPRE_Int **rboxnums; HYPRE_Int **transforms; HYPRE_Int i, size; if (comm_info) { size = hypre_BoxArrayArraySize(hypre_CommInfoSendBoxes(comm_info)); hypre_BoxArrayArrayDestroy(hypre_CommInfoSendBoxes(comm_info)); processes = hypre_CommInfoSendProcesses(comm_info); for (i = 0; i < size; i++) { hypre_TFree(processes[i], HYPRE_MEMORY_HOST); } hypre_TFree(processes, HYPRE_MEMORY_HOST); rboxnums = hypre_CommInfoSendRBoxnums(comm_info); if (rboxnums != NULL) { for (i = 0; i < size; i++) { hypre_TFree(rboxnums[i], HYPRE_MEMORY_HOST); } hypre_TFree(rboxnums, HYPRE_MEMORY_HOST); } hypre_BoxArrayArrayDestroy(hypre_CommInfoSendRBoxes(comm_info)); transforms = hypre_CommInfoSendTransforms(comm_info); if (transforms != NULL) { for (i = 0; i < size; i++) { hypre_TFree(transforms[i], HYPRE_MEMORY_HOST); } hypre_TFree(transforms, HYPRE_MEMORY_HOST); } size = hypre_BoxArrayArraySize(hypre_CommInfoRecvBoxes(comm_info)); hypre_BoxArrayArrayDestroy(hypre_CommInfoRecvBoxes(comm_info)); processes = hypre_CommInfoRecvProcesses(comm_info); for (i = 0; i < size; i++) { hypre_TFree(processes[i], HYPRE_MEMORY_HOST); } hypre_TFree(processes, HYPRE_MEMORY_HOST); rboxnums = hypre_CommInfoRecvRBoxnums(comm_info); if (rboxnums != NULL) { for (i = 0; i < size; i++) { hypre_TFree(rboxnums[i], HYPRE_MEMORY_HOST); } hypre_TFree(rboxnums, HYPRE_MEMORY_HOST); } hypre_BoxArrayArrayDestroy(hypre_CommInfoRecvRBoxes(comm_info)); transforms = hypre_CommInfoRecvTransforms(comm_info); if (transforms != NULL) { for (i = 0; i < size; i++) { hypre_TFree(transforms[i], HYPRE_MEMORY_HOST); } hypre_TFree(transforms, HYPRE_MEMORY_HOST); } hypre_TFree(hypre_CommInfoCoords(comm_info), HYPRE_MEMORY_HOST); hypre_TFree(hypre_CommInfoDirs(comm_info), HYPRE_MEMORY_HOST); hypre_TFree(comm_info, HYPRE_MEMORY_HOST); } return hypre_error_flag; } /*-------------------------------------------------------------------------- * NEW version that uses the box manager to find neighbors boxes. * AHB 9/06 * * Return descriptions of communications patterns for a given * grid-stencil computation. These patterns are defined by * intersecting the data dependencies of each box (including data * dependencies within the box) with its neighbor boxes. * * An inconsistent ordering of the boxes in the send/recv data regions * is returned. That is, the ordering of the boxes on process p for * receives from process q is not guaranteed to be the same as the * ordering of the boxes on process q for sends to process p. * * The routine uses a grow-the-box-and-intersect-with-neighbors style * algorithm. * * 1. The basic algorithm: * * The basic algorithm is as follows, with one additional optimization * discussed below that helps to minimize the number of communications * that are done with neighbors (e.g., consider a 7-pt stencil and the * difference between doing 26 communications versus 6): * * To compute send/recv regions, do * * for i = local box * { * gbox_i = grow box i according to stencil * * //find neighbors of i * call BoxManIntersect on gbox_i (and periodic gbox_i) * * // receives * for j = neighbor box of i * { * intersect gbox_i with box j and add to recv region * } * * // sends * for j = neighbor box of i * { * gbox_j = grow box j according to stencil * intersect gbox_j with box i and add to send region * } * } * * (Note: no ordering is assumed) * * 2. Optimization on basic algorithm: * * Before looping over the neighbors in the above algorithm, do a * preliminary sweep through the neighbors to select a subset of * neighbors to do the intersections with. To select the subset, * compute a so-called "distance index" and check the corresponding * entry in the so-called "stencil grid" to decide whether or not to * use the box. * * The "stencil grid" is a 3x3x3 grid in 3D that is built from the * stencil as follows: * * // assume for simplicity that i,j,k are -1, 0, or 1 * for each stencil entry (i,j,k) * { * mark all stencil grid entries in (1,1,1) x (1+i,1+j,1+k) * // here (1,1,1) is the "center" entry in the stencil grid * } * * * 3. Complications with periodicity: * * When periodicity is on, it is possible to have a box-pair region * (the description of a communication pattern between two boxes) that * consists of more than one box. * * 4. Box Manager * * The box manager is used to determine neighbors. It is assumed * that the grid's box manager contains sufficient neighbor * information. * * NOTES: * * A. No concept of data ownership is assumed. As a result, * redundant communication patterns can be produced when the grid * boxes overlap. * * B. Boxes in the send and recv regions do not need to be in any * particular order (including those that are periodic). * *--------------------------------------------------------------------------*/ HYPRE_Int hypre_CreateCommInfoFromStencil( hypre_StructGrid *grid, hypre_StructStencil *stencil, hypre_CommInfo **comm_info_ptr ) { HYPRE_Int ndim = hypre_StructGridNDim(grid); HYPRE_Int i, j, k, d, m, s, si; hypre_BoxArrayArray *send_boxes; hypre_BoxArrayArray *recv_boxes; HYPRE_Int **send_procs; HYPRE_Int **recv_procs; HYPRE_Int **send_rboxnums; HYPRE_Int **recv_rboxnums; hypre_BoxArrayArray *send_rboxes; hypre_BoxArrayArray *recv_rboxes; hypre_BoxArray *local_boxes; HYPRE_Int num_boxes; hypre_BoxManager *boxman; hypre_Index *stencil_shape; hypre_IndexRef stencil_offset; hypre_IndexRef pshift; hypre_Box *box; hypre_Box *hood_box; hypre_Box *grow_box; hypre_Box *extend_box; hypre_Box *int_box; hypre_Box *periodic_box; hypre_Box *stencil_box, *sbox; /* extents of the stencil grid */ HYPRE_Int *stencil_grid; HYPRE_Int grow[HYPRE_MAXDIM][2]; hypre_BoxManEntry **entries; hypre_BoxManEntry *entry; HYPRE_Int num_entries; hypre_BoxArray *neighbor_boxes = NULL; HYPRE_Int *neighbor_procs = NULL; HYPRE_Int *neighbor_ids = NULL; HYPRE_Int *neighbor_shifts = NULL; HYPRE_Int neighbor_count; HYPRE_Int neighbor_alloc; hypre_Index ilower, iupper; hypre_BoxArray *send_box_array; hypre_BoxArray *recv_box_array; hypre_BoxArray *send_rbox_array; hypre_BoxArray *recv_rbox_array; hypre_Box **cboxes; hypre_Box *cboxes_mem; HYPRE_Int *cboxes_neighbor_location; HYPRE_Int num_cboxes, cbox_alloc; hypre_Index istart, istop, sgindex; hypre_IndexRef start; hypre_Index loop_size, stride; HYPRE_Int num_periods, loc, box_id, id, proc_id; HYPRE_Int myid; MPI_Comm comm; /*------------------------------------------------------ * Initializations *------------------------------------------------------*/ hypre_SetIndex(ilower, 0); hypre_SetIndex(iupper, 0); hypre_SetIndex(istart, 0); hypre_SetIndex(istop, 0); hypre_SetIndex(sgindex, 0); local_boxes = hypre_StructGridBoxes(grid); num_boxes = hypre_BoxArraySize(local_boxes); num_periods = hypre_StructGridNumPeriods(grid); boxman = hypre_StructGridBoxMan(grid); comm = hypre_StructGridComm(grid); hypre_MPI_Comm_rank(comm, &myid); stencil_box = hypre_BoxCreate(ndim); hypre_SetIndex(hypre_BoxIMin(stencil_box), 0); hypre_SetIndex(hypre_BoxIMax(stencil_box), 2); /* Set initial values to zero */ stencil_grid = hypre_CTAlloc(HYPRE_Int, hypre_BoxVolume(stencil_box), HYPRE_MEMORY_HOST); sbox = hypre_BoxCreate(ndim); hypre_SetIndex(stride, 1); /*------------------------------------------------------ * Compute the "grow" information from the stencil *------------------------------------------------------*/ stencil_shape = hypre_StructStencilShape(stencil); for (d = 0; d < ndim; d++) { grow[d][0] = 0; grow[d][1] = 0; } for (s = 0; s < hypre_StructStencilSize(stencil); s++) { stencil_offset = stencil_shape[s]; for (d = 0; d < ndim; d++) { m = stencil_offset[d]; istart[d] = 1; istop[d] = 1; if (m < 0) { istart[d] = 0; grow[d][0] = hypre_max(grow[d][0], -m); } else if (m > 0) { istop[d] = 2; grow[d][1] = hypre_max(grow[d][1], m); } } /* update stencil grid from the grow_stencil */ hypre_BoxSetExtents(sbox, istart, istop); start = hypre_BoxIMin(sbox); hypre_BoxGetSize(sbox, loop_size); hypre_SerialBoxLoop1Begin(ndim, loop_size, stencil_box, start, stride, si); { stencil_grid[si] = 1; } hypre_SerialBoxLoop1End(si); } /*------------------------------------------------------ * Compute send/recv boxes and procs for each local box *------------------------------------------------------*/ /* initialize: for each local box, we create an array of send/recv info */ send_boxes = hypre_BoxArrayArrayCreate(num_boxes, ndim); recv_boxes = hypre_BoxArrayArrayCreate(num_boxes, ndim); send_procs = hypre_CTAlloc(HYPRE_Int *, num_boxes, HYPRE_MEMORY_HOST); recv_procs = hypre_CTAlloc(HYPRE_Int *, num_boxes, HYPRE_MEMORY_HOST); /* Remote boxnums and boxes describe data on the opposing processor, so some shifting of boxes is needed below for periodic neighbor boxes. Remote box info is also needed for receives to allow for reverse communication. */ send_rboxnums = hypre_CTAlloc(HYPRE_Int *, num_boxes, HYPRE_MEMORY_HOST); send_rboxes = hypre_BoxArrayArrayCreate(num_boxes, ndim); recv_rboxnums = hypre_CTAlloc(HYPRE_Int *, num_boxes, HYPRE_MEMORY_HOST); recv_rboxes = hypre_BoxArrayArrayCreate(num_boxes, ndim); grow_box = hypre_BoxCreate(hypre_StructGridNDim(grid)); extend_box = hypre_BoxCreate(hypre_StructGridNDim(grid)); int_box = hypre_BoxCreate(hypre_StructGridNDim(grid)); periodic_box = hypre_BoxCreate(hypre_StructGridNDim(grid)); /* storage we will use and keep track of the neighbors */ neighbor_alloc = 30; /* initial guess at max size */ neighbor_boxes = hypre_BoxArrayCreate(neighbor_alloc, ndim); neighbor_procs = hypre_CTAlloc(HYPRE_Int, neighbor_alloc, HYPRE_MEMORY_HOST); neighbor_ids = hypre_CTAlloc(HYPRE_Int, neighbor_alloc, HYPRE_MEMORY_HOST); neighbor_shifts = hypre_CTAlloc(HYPRE_Int, neighbor_alloc, HYPRE_MEMORY_HOST); /* storage we will use to collect all of the intersected boxes (the send and recv regions for box i (this may not be enough in the case of periodic boxes, so we will have to check) */ cbox_alloc = hypre_BoxManNEntries(boxman); cboxes_neighbor_location = hypre_CTAlloc(HYPRE_Int, cbox_alloc, HYPRE_MEMORY_HOST); cboxes = hypre_CTAlloc(hypre_Box *, cbox_alloc, HYPRE_MEMORY_HOST); cboxes_mem = hypre_CTAlloc(hypre_Box, cbox_alloc, HYPRE_MEMORY_HOST); /******* loop through each local box **************/ for (i = 0; i < num_boxes; i++) { /* get the box */ box = hypre_BoxArrayBox(local_boxes, i); box_id = i; /* grow box local i according to the stencil*/ hypre_CopyBox(box, grow_box); for (d = 0; d < ndim; d++) { hypre_BoxIMinD(grow_box, d) -= grow[d][0]; hypre_BoxIMaxD(grow_box, d) += grow[d][1]; } /* extend_box - to find the list of potential neighbors, we need to grow the local box a bit differently in case, for example, the stencil grows in one dimension [0] and not the other [1] */ hypre_CopyBox(box, extend_box); for (d = 0; d < ndim; d++) { hypre_BoxIMinD(extend_box, d) -= hypre_max(grow[d][0], grow[d][1]); hypre_BoxIMaxD(extend_box, d) += hypre_max(grow[d][0], grow[d][1]); } /*------------------------------------------------ * Determine the neighbors of box i *------------------------------------------------*/ /* Do this by intersecting the extend box with the BoxManager. We must also check for periodic neighbors. */ neighbor_count = 0; hypre_BoxArraySetSize(neighbor_boxes, 0); /* shift the box by each period (k=0 is original box) */ for (k = 0; k < num_periods; k++) { hypre_CopyBox(extend_box, periodic_box); pshift = hypre_StructGridPShift(grid, k); hypre_BoxShiftPos(periodic_box, pshift); /* get the intersections */ hypre_BoxManIntersect(boxman, hypre_BoxIMin(periodic_box), hypre_BoxIMax(periodic_box), &entries, &num_entries); /* note: do we need to remove the intersection with our original box? no if periodic, yes if non-periodic (k=0) */ /* unpack entries (first check storage) */ if (neighbor_count + num_entries > neighbor_alloc) { neighbor_alloc = neighbor_count + num_entries + 5; neighbor_procs = hypre_TReAlloc(neighbor_procs, HYPRE_Int, neighbor_alloc, HYPRE_MEMORY_HOST); neighbor_ids = hypre_TReAlloc(neighbor_ids, HYPRE_Int, neighbor_alloc, HYPRE_MEMORY_HOST); neighbor_shifts = hypre_TReAlloc(neighbor_shifts, HYPRE_Int, neighbor_alloc, HYPRE_MEMORY_HOST); } /* check storage for the array */ hypre_BoxArraySetSize(neighbor_boxes, neighbor_count + num_entries); /* now unpack */ for (j = 0; j < num_entries; j++) { entry = entries[j]; proc_id = hypre_BoxManEntryProc(entry); id = hypre_BoxManEntryId(entry); /* don't keep box i in the non-periodic case*/ if (!k) { if ((myid == proc_id) && (box_id == id)) { continue; } } hypre_BoxManEntryGetExtents(entry, ilower, iupper); hypre_BoxSetExtents(hypre_BoxArrayBox(neighbor_boxes, neighbor_count), ilower, iupper); /* shift the periodic boxes (needs to be the opposite of above) */ if (k) { hypre_BoxShiftNeg( hypre_BoxArrayBox(neighbor_boxes, neighbor_count), pshift); } neighbor_procs[neighbor_count] = proc_id; neighbor_ids[neighbor_count] = id; neighbor_shifts[neighbor_count] = k; neighbor_count++; } hypre_BoxArraySetSize(neighbor_boxes, neighbor_count); hypre_TFree(entries, HYPRE_MEMORY_HOST); } /* end of loop through periods k */ /* Now we have a list of all of the neighbors for box i! */ /* note: we don't want/need to remove duplicates - they should have different intersections (TO DO: put more thought into if there are ever any exceptions to this? - the intersection routine already eliminates duplicates - so what i mean is eliminating duplicates from multiple intersection calls in periodic case) */ /*------------------------------------------------ * Compute recv_box_array for box i *------------------------------------------------*/ /* check size of storage for cboxes */ /* let's make sure that we have enough storage in case each neighbor produces a send/recv region */ if (neighbor_count > cbox_alloc) { cbox_alloc = neighbor_count; cboxes_neighbor_location = hypre_TReAlloc(cboxes_neighbor_location, HYPRE_Int, cbox_alloc, HYPRE_MEMORY_HOST); cboxes = hypre_TReAlloc(cboxes, hypre_Box *, cbox_alloc, HYPRE_MEMORY_HOST); cboxes_mem = hypre_TReAlloc(cboxes_mem, hypre_Box, cbox_alloc, HYPRE_MEMORY_HOST); } /* Loop through each neighbor box. If the neighbor box intersects the grown box i (grown according to our stencil), then the intersection is a recv region. If the neighbor box was shifted to handle periodicity, we need to (positive) shift it back. */ num_cboxes = 0; for (k = 0; k < neighbor_count; k++) { hood_box = hypre_BoxArrayBox(neighbor_boxes, k); /* check the stencil grid to see if it makes sense to intersect */ for (d = 0; d < ndim; d++) { sgindex[d] = 1; s = hypre_BoxIMinD(hood_box, d) - hypre_BoxIMaxD(box, d); if (s > 0) { sgindex[d] = 2; } s = hypre_BoxIMinD(box, d) - hypre_BoxIMaxD(hood_box, d); if (s > 0) { sgindex[d] = 0; } } /* it makes sense only if we have at least one non-zero entry */ si = hypre_BoxIndexRank(stencil_box, sgindex); if (stencil_grid[si]) { /* intersect - result is int_box */ hypre_IntersectBoxes(grow_box, hood_box, int_box); /* if we have a positive volume box, this is a recv region */ if (hypre_BoxVolume(int_box)) { /* keep track of which neighbor: k... */ cboxes_neighbor_location[num_cboxes] = k; cboxes[num_cboxes] = &cboxes_mem[num_cboxes]; /* keep the intersected box */ hypre_CopyBox(int_box, cboxes[num_cboxes]); num_cboxes++; } } } /* end of loop through each neighbor */ /* create recv_box_array and recv_procs for box i */ recv_box_array = hypre_BoxArrayArrayBoxArray(recv_boxes, i); hypre_BoxArraySetSize(recv_box_array, num_cboxes); recv_procs[i] = hypre_CTAlloc(HYPRE_Int, num_cboxes, HYPRE_MEMORY_HOST); recv_rboxnums[i] = hypre_CTAlloc(HYPRE_Int, num_cboxes, HYPRE_MEMORY_HOST); recv_rbox_array = hypre_BoxArrayArrayBoxArray(recv_rboxes, i); hypre_BoxArraySetSize(recv_rbox_array, num_cboxes); for (m = 0; m < num_cboxes; m++) { loc = cboxes_neighbor_location[m]; recv_procs[i][m] = neighbor_procs[loc]; recv_rboxnums[i][m] = neighbor_ids[loc]; hypre_CopyBox(cboxes[m], hypre_BoxArrayBox(recv_box_array, m)); /* if periodic, positive shift before copying to the rbox_array */ if (neighbor_shifts[loc]) /* periodic if shift != 0 */ { pshift = hypre_StructGridPShift(grid, neighbor_shifts[loc]); hypre_BoxShiftPos(cboxes[m], pshift); } hypre_CopyBox(cboxes[m], hypre_BoxArrayBox(recv_rbox_array, m)); cboxes[m] = NULL; } /*------------------------------------------------ * Compute send_box_array for box i *------------------------------------------------*/ /* Loop through each neighbor box. If the grown neighbor box intersects box i, then the intersection is a send region. If the neighbor box was shifted to handle periodicity, we need to (positive) shift it back. */ num_cboxes = 0; for (k = 0; k < neighbor_count; k++) { hood_box = hypre_BoxArrayBox(neighbor_boxes, k); /* check the stencil grid to see if it makes sense to intersect */ for (d = 0; d < ndim; d++) { sgindex[d] = 1; s = hypre_BoxIMinD(box, d) - hypre_BoxIMaxD(hood_box, d); if (s > 0) { sgindex[d] = 2; } s = hypre_BoxIMinD(hood_box, d) - hypre_BoxIMaxD(box, d); if (s > 0) { sgindex[d] = 0; } } /* it makes sense only if we have at least one non-zero entry */ si = hypre_BoxIndexRank(stencil_box, sgindex); if (stencil_grid[si]) { /* grow the neighbor box and intersect */ hypre_CopyBox(hood_box, grow_box); for (d = 0; d < ndim; d++) { hypre_BoxIMinD(grow_box, d) -= grow[d][0]; hypre_BoxIMaxD(grow_box, d) += grow[d][1]; } hypre_IntersectBoxes(box, grow_box, int_box); /* if we have a positive volume box, this is a send region */ if (hypre_BoxVolume(int_box)) { /* keep track of which neighbor: k... */ cboxes_neighbor_location[num_cboxes] = k; cboxes[num_cboxes] = &cboxes_mem[num_cboxes]; /* keep the intersected box */ hypre_CopyBox(int_box, cboxes[num_cboxes]); num_cboxes++; } } }/* end of loop through neighbors */ /* create send_box_array and send_procs for box i */ send_box_array = hypre_BoxArrayArrayBoxArray(send_boxes, i); hypre_BoxArraySetSize(send_box_array, num_cboxes); send_procs[i] = hypre_CTAlloc(HYPRE_Int, num_cboxes, HYPRE_MEMORY_HOST); send_rboxnums[i] = hypre_CTAlloc(HYPRE_Int, num_cboxes, HYPRE_MEMORY_HOST); send_rbox_array = hypre_BoxArrayArrayBoxArray(send_rboxes, i); hypre_BoxArraySetSize(send_rbox_array, num_cboxes); for (m = 0; m < num_cboxes; m++) { loc = cboxes_neighbor_location[m]; send_procs[i][m] = neighbor_procs[loc]; send_rboxnums[i][m] = neighbor_ids[loc]; hypre_CopyBox(cboxes[m], hypre_BoxArrayBox(send_box_array, m)); /* if periodic, positive shift before copying to the rbox_array */ if (neighbor_shifts[loc]) /* periodic if shift != 0 */ { pshift = hypre_StructGridPShift(grid, neighbor_shifts[loc]); hypre_BoxShiftPos(cboxes[m], pshift); } hypre_CopyBox(cboxes[m], hypre_BoxArrayBox(send_rbox_array, m)); cboxes[m] = NULL; } } /* end of loop through each local box */ /* clean up */ hypre_TFree(neighbor_procs, HYPRE_MEMORY_HOST); hypre_TFree(neighbor_ids, HYPRE_MEMORY_HOST); hypre_TFree(neighbor_shifts, HYPRE_MEMORY_HOST); hypre_BoxArrayDestroy(neighbor_boxes); hypre_TFree(cboxes, HYPRE_MEMORY_HOST); hypre_TFree(cboxes_mem, HYPRE_MEMORY_HOST); hypre_TFree(cboxes_neighbor_location, HYPRE_MEMORY_HOST); hypre_BoxDestroy(grow_box); hypre_BoxDestroy(int_box); hypre_BoxDestroy(periodic_box); hypre_BoxDestroy(extend_box); hypre_BoxDestroy(stencil_box); hypre_BoxDestroy(sbox); hypre_TFree(stencil_grid, HYPRE_MEMORY_HOST); /*------------------------------------------------------ * Return *------------------------------------------------------*/ hypre_CommInfoCreate(send_boxes, recv_boxes, send_procs, recv_procs, send_rboxnums, recv_rboxnums, send_rboxes, recv_rboxes, 1, comm_info_ptr); return hypre_error_flag; } /*-------------------------------------------------------------------------- * Return descriptions of communications patterns for a given grid * based on a specified number of "ghost zones". These patterns are * defined by building a stencil and calling CommInfoFromStencil. *--------------------------------------------------------------------------*/ HYPRE_Int hypre_CreateCommInfoFromNumGhost( hypre_StructGrid *grid, HYPRE_Int *num_ghost, hypre_CommInfo **comm_info_ptr ) { HYPRE_Int ndim = hypre_StructGridNDim(grid); hypre_StructStencil *stencil; hypre_Index *stencil_shape; hypre_Box *box; hypre_Index ii, loop_size; hypre_IndexRef start; HYPRE_Int i, d, size; size = (HYPRE_Int)(pow(3.0, ndim) + 0.5); stencil_shape = hypre_CTAlloc(hypre_Index, size, HYPRE_MEMORY_HOST); box = hypre_BoxCreate(ndim); for (d = 0; d < ndim; d++) { hypre_BoxIMinD(box, d) = -(num_ghost[2 * d] ? 1 : 0); hypre_BoxIMaxD(box, d) = (num_ghost[2 * d + 1] ? 1 : 0); } size = 0; start = hypre_BoxIMin(box); hypre_BoxGetSize(box, loop_size); hypre_SerialBoxLoop0Begin(ndim, loop_size); { zypre_BoxLoopGetIndex(ii); for (d = 0; d < ndim; d++) { i = ii[d] + start[d]; if (i < 0) { stencil_shape[size][d] = -num_ghost[2 * d]; } else if (i > 0) { stencil_shape[size][d] = num_ghost[2 * d + 1]; } } size++; } hypre_SerialBoxLoop0End(); hypre_BoxDestroy(box); stencil = hypre_StructStencilCreate(ndim, size, stencil_shape); hypre_CreateCommInfoFromStencil(grid, stencil, comm_info_ptr); hypre_StructStencilDestroy(stencil); return hypre_error_flag; } /*-------------------------------------------------------------------------- * Return descriptions of communications patterns for migrating data * from one grid distribution to another. *--------------------------------------------------------------------------*/ HYPRE_Int hypre_CreateCommInfoFromGrids( hypre_StructGrid *from_grid, hypre_StructGrid *to_grid, hypre_CommInfo **comm_info_ptr ) { hypre_BoxArrayArray *send_boxes; hypre_BoxArrayArray *recv_boxes; HYPRE_Int **send_procs; HYPRE_Int **recv_procs; HYPRE_Int **send_rboxnums; HYPRE_Int **recv_rboxnums; hypre_BoxArrayArray *send_rboxes; hypre_BoxArrayArray *recv_rboxes; hypre_BoxArrayArray *comm_boxes; HYPRE_Int **comm_procs; HYPRE_Int **comm_boxnums; hypre_BoxArray *comm_box_array; hypre_Box *comm_box; hypre_StructGrid *local_grid; hypre_StructGrid *remote_grid; hypre_BoxArray *local_boxes; hypre_BoxArray *remote_boxes; hypre_BoxArray *remote_all_boxes; HYPRE_Int *remote_all_procs; HYPRE_Int *remote_all_boxnums; HYPRE_Int remote_first_local; hypre_Box *local_box; hypre_Box *remote_box; HYPRE_Int i, j, k, r, ndim; /*------------------------------------------------------ * Set up communication info *------------------------------------------------------*/ ndim = hypre_StructGridNDim(from_grid); for (r = 0; r < 2; r++) { switch (r) { case 0: local_grid = from_grid; remote_grid = to_grid; break; case 1: local_grid = to_grid; remote_grid = from_grid; break; } /*--------------------------------------------------- * Compute comm_boxes and comm_procs *---------------------------------------------------*/ local_boxes = hypre_StructGridBoxes(local_grid); remote_boxes = hypre_StructGridBoxes(remote_grid); hypre_GatherAllBoxes(hypre_StructGridComm(remote_grid), remote_boxes, ndim, &remote_all_boxes, &remote_all_procs, &remote_first_local); hypre_ComputeBoxnums(remote_all_boxes, remote_all_procs, &remote_all_boxnums); comm_boxes = hypre_BoxArrayArrayCreate(hypre_BoxArraySize(local_boxes), ndim); comm_procs = hypre_CTAlloc(HYPRE_Int *, hypre_BoxArraySize(local_boxes), HYPRE_MEMORY_HOST); comm_boxnums = hypre_CTAlloc(HYPRE_Int *, hypre_BoxArraySize(local_boxes), HYPRE_MEMORY_HOST); comm_box = hypre_BoxCreate(ndim); hypre_ForBoxI(i, local_boxes) { local_box = hypre_BoxArrayBox(local_boxes, i); comm_box_array = hypre_BoxArrayArrayBoxArray(comm_boxes, i); comm_procs[i] = hypre_CTAlloc(HYPRE_Int, hypre_BoxArraySize(remote_all_boxes), HYPRE_MEMORY_HOST); comm_boxnums[i] = hypre_CTAlloc(HYPRE_Int, hypre_BoxArraySize(remote_all_boxes), HYPRE_MEMORY_HOST); hypre_ForBoxI(j, remote_all_boxes) { remote_box = hypre_BoxArrayBox(remote_all_boxes, j); hypre_IntersectBoxes(local_box, remote_box, comm_box); if (hypre_BoxVolume(comm_box)) { k = hypre_BoxArraySize(comm_box_array); comm_procs[i][k] = remote_all_procs[j]; comm_boxnums[i][k] = remote_all_boxnums[j]; hypre_AppendBox(comm_box, comm_box_array); } } comm_procs[i] = hypre_TReAlloc(comm_procs[i], HYPRE_Int, hypre_BoxArraySize(comm_box_array), HYPRE_MEMORY_HOST); comm_boxnums[i] = hypre_TReAlloc(comm_boxnums[i], HYPRE_Int, hypre_BoxArraySize(comm_box_array), HYPRE_MEMORY_HOST); } hypre_BoxDestroy(comm_box); hypre_BoxArrayDestroy(remote_all_boxes); hypre_TFree(remote_all_procs, HYPRE_MEMORY_HOST); hypre_TFree(remote_all_boxnums, HYPRE_MEMORY_HOST); switch (r) { case 0: send_boxes = comm_boxes; send_procs = comm_procs; send_rboxnums = comm_boxnums; send_rboxes = hypre_BoxArrayArrayDuplicate(comm_boxes); break; case 1: recv_boxes = comm_boxes; recv_procs = comm_procs; recv_rboxnums = comm_boxnums; recv_rboxes = hypre_BoxArrayArrayDuplicate(comm_boxes); break; } } hypre_CommInfoCreate(send_boxes, recv_boxes, send_procs, recv_procs, send_rboxnums, recv_rboxnums, send_rboxes, recv_rboxes, 1, comm_info_ptr); return hypre_error_flag; } hypre-2.33.0/src/struct_mv/computation.c000066400000000000000000000301541477326011500202620ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * *****************************************************************************/ #include "_hypre_struct_mv.h" /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ComputeInfoCreate( hypre_CommInfo *comm_info, hypre_BoxArrayArray *indt_boxes, hypre_BoxArrayArray *dept_boxes, hypre_ComputeInfo **compute_info_ptr ) { hypre_ComputeInfo *compute_info; compute_info = hypre_TAlloc(hypre_ComputeInfo, 1, HYPRE_MEMORY_HOST); hypre_ComputeInfoCommInfo(compute_info) = comm_info; hypre_ComputeInfoIndtBoxes(compute_info) = indt_boxes; hypre_ComputeInfoDeptBoxes(compute_info) = dept_boxes; hypre_SetIndex(hypre_ComputeInfoStride(compute_info), 1); *compute_info_ptr = compute_info; return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ComputeInfoProjectSend( hypre_ComputeInfo *compute_info, hypre_Index index, hypre_Index stride ) { hypre_CommInfoProjectSend(hypre_ComputeInfoCommInfo(compute_info), index, stride); return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ComputeInfoProjectRecv( hypre_ComputeInfo *compute_info, hypre_Index index, hypre_Index stride ) { hypre_CommInfoProjectRecv(hypre_ComputeInfoCommInfo(compute_info), index, stride); return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ComputeInfoProjectComp( hypre_ComputeInfo *compute_info, hypre_Index index, hypre_Index stride ) { hypre_ProjectBoxArrayArray(hypre_ComputeInfoIndtBoxes(compute_info), index, stride); hypre_ProjectBoxArrayArray(hypre_ComputeInfoDeptBoxes(compute_info), index, stride); hypre_CopyIndex(stride, hypre_ComputeInfoStride(compute_info)); return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ComputeInfoDestroy( hypre_ComputeInfo *compute_info ) { hypre_TFree(compute_info, HYPRE_MEMORY_HOST); return hypre_error_flag; } /*-------------------------------------------------------------------------- * Return descriptions of communications and computations patterns for * a given grid-stencil computation. If HYPRE\_OVERLAP\_COMM\_COMP is * defined, then the patterns are computed to allow for overlapping * communications and computations. The default is no overlap. * * Note: This routine assumes that the grid boxes do not overlap. *--------------------------------------------------------------------------*/ HYPRE_Int hypre_CreateComputeInfo( hypre_StructGrid *grid, hypre_StructStencil *stencil, hypre_ComputeInfo **compute_info_ptr ) { HYPRE_Int ndim = hypre_StructGridNDim(grid); hypre_CommInfo *comm_info; hypre_BoxArrayArray *indt_boxes; hypre_BoxArrayArray *dept_boxes; hypre_BoxArray *boxes; hypre_BoxArray *cbox_array; hypre_Box *cbox; HYPRE_Int i; #ifdef HYPRE_OVERLAP_COMM_COMP hypre_Box *rembox; hypre_Index *stencil_shape; hypre_Index lborder, rborder; HYPRE_Int cbox_array_size; HYPRE_Int s, d; #endif /*------------------------------------------------------ * Extract needed grid info *------------------------------------------------------*/ boxes = hypre_StructGridBoxes(grid); /*------------------------------------------------------ * Get communication info *------------------------------------------------------*/ hypre_CreateCommInfoFromStencil(grid, stencil, &comm_info); #ifdef HYPRE_OVERLAP_COMM_COMP /*------------------------------------------------------ * Compute border info *------------------------------------------------------*/ hypre_SetIndex(lborder, 0); hypre_SetIndex(rborder, 0); stencil_shape = hypre_StructStencilShape(stencil); for (s = 0; s < hypre_StructStencilSize(stencil); s++) { for (d = 0; d < ndim; d++) { i = hypre_IndexD(stencil_shape[s], d); if (i < 0) { lborder[d] = hypre_max(lborder[d], -i); } else if (i > 0) { rborder[d] = hypre_max(rborder[d], i); } } } /*------------------------------------------------------ * Set up the dependent boxes *------------------------------------------------------*/ dept_boxes = hypre_BoxArrayArrayCreate(hypre_BoxArraySize(boxes), ndim); rembox = hypre_BoxCreate(hypre_StructGridNDim(grid)); hypre_ForBoxI(i, boxes) { cbox_array = hypre_BoxArrayArrayBoxArray(dept_boxes, i); hypre_BoxArraySetSize(cbox_array, 2 * ndim); hypre_CopyBox(hypre_BoxArrayBox(boxes, i), rembox); cbox_array_size = 0; for (d = 0; d < ndim; d++) { if ( (hypre_BoxVolume(rembox)) && lborder[d] ) { cbox = hypre_BoxArrayBox(cbox_array, cbox_array_size); hypre_CopyBox(rembox, cbox); hypre_BoxIMaxD(cbox, d) = hypre_BoxIMinD(cbox, d) + lborder[d] - 1; hypre_BoxIMinD(rembox, d) = hypre_BoxIMinD(cbox, d) + lborder[d]; cbox_array_size++; } if ( (hypre_BoxVolume(rembox)) && rborder[d] ) { cbox = hypre_BoxArrayBox(cbox_array, cbox_array_size); hypre_CopyBox(rembox, cbox); hypre_BoxIMinD(cbox, d) = hypre_BoxIMaxD(cbox, d) - rborder[d] + 1; hypre_BoxIMaxD(rembox, d) = hypre_BoxIMaxD(cbox, d) - rborder[d]; cbox_array_size++; } } hypre_BoxArraySetSize(cbox_array, cbox_array_size); } hypre_BoxDestroy(rembox); /*------------------------------------------------------ * Set up the independent boxes *------------------------------------------------------*/ indt_boxes = hypre_BoxArrayArrayCreate(hypre_BoxArraySize(boxes), ndim); hypre_ForBoxI(i, boxes) { cbox_array = hypre_BoxArrayArrayBoxArray(indt_boxes, i); hypre_BoxArraySetSize(cbox_array, 1); cbox = hypre_BoxArrayBox(cbox_array, 0); hypre_CopyBox(hypre_BoxArrayBox(boxes, i), cbox); for (d = 0; d < ndim; d++) { if ( lborder[d] ) { hypre_BoxIMinD(cbox, d) += lborder[d]; } if ( rborder[d] ) { hypre_BoxIMaxD(cbox, d) -= rborder[d]; } } } #else /*------------------------------------------------------ * Set up the independent boxes *------------------------------------------------------*/ indt_boxes = hypre_BoxArrayArrayCreate(hypre_BoxArraySize(boxes), ndim); /*------------------------------------------------------ * Set up the dependent boxes *------------------------------------------------------*/ dept_boxes = hypre_BoxArrayArrayCreate(hypre_BoxArraySize(boxes), ndim); hypre_ForBoxI(i, boxes) { cbox_array = hypre_BoxArrayArrayBoxArray(dept_boxes, i); hypre_BoxArraySetSize(cbox_array, 1); cbox = hypre_BoxArrayBox(cbox_array, 0); hypre_CopyBox(hypre_BoxArrayBox(boxes, i), cbox); } #endif /*------------------------------------------------------ * Return *------------------------------------------------------*/ hypre_ComputeInfoCreate(comm_info, indt_boxes, dept_boxes, compute_info_ptr); return hypre_error_flag; } /*-------------------------------------------------------------------------- * Create a computation package from a grid-based description of a * communication-computation pattern. * * Note: The input boxes and processes are destroyed. *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ComputePkgCreate( hypre_ComputeInfo *compute_info, hypre_BoxArray *data_space, HYPRE_Int num_values, hypre_StructGrid *grid, hypre_ComputePkg **compute_pkg_ptr ) { hypre_ComputePkg *compute_pkg; hypre_CommPkg *comm_pkg; compute_pkg = hypre_CTAlloc(hypre_ComputePkg, 1, HYPRE_MEMORY_HOST); hypre_CommPkgCreate(hypre_ComputeInfoCommInfo(compute_info), data_space, data_space, num_values, NULL, 0, hypre_StructGridComm(grid), &comm_pkg); hypre_CommInfoDestroy(hypre_ComputeInfoCommInfo(compute_info)); hypre_ComputePkgCommPkg(compute_pkg) = comm_pkg; hypre_ComputePkgIndtBoxes(compute_pkg) = hypre_ComputeInfoIndtBoxes(compute_info); hypre_ComputePkgDeptBoxes(compute_pkg) = hypre_ComputeInfoDeptBoxes(compute_info); hypre_CopyIndex(hypre_ComputeInfoStride(compute_info), hypre_ComputePkgStride(compute_pkg)); hypre_StructGridRef(grid, &hypre_ComputePkgGrid(compute_pkg)); hypre_ComputePkgDataSpace(compute_pkg) = data_space; hypre_ComputePkgNumValues(compute_pkg) = num_values; hypre_ComputeInfoDestroy(compute_info); *compute_pkg_ptr = compute_pkg; return hypre_error_flag; } /*-------------------------------------------------------------------------- * Destroy a computation package. *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ComputePkgDestroy( hypre_ComputePkg *compute_pkg ) { if (compute_pkg) { hypre_CommPkgDestroy(hypre_ComputePkgCommPkg(compute_pkg)); hypre_BoxArrayArrayDestroy(hypre_ComputePkgIndtBoxes(compute_pkg)); hypre_BoxArrayArrayDestroy(hypre_ComputePkgDeptBoxes(compute_pkg)); hypre_StructGridDestroy(hypre_ComputePkgGrid(compute_pkg)); hypre_TFree(compute_pkg, HYPRE_MEMORY_HOST); } return hypre_error_flag; } /*-------------------------------------------------------------------------- * Initialize a non-blocking communication exchange. The independent * computations may be done after a call to this routine, to allow for * overlap of communications and computations. *--------------------------------------------------------------------------*/ HYPRE_Int hypre_InitializeIndtComputations( hypre_ComputePkg *compute_pkg, HYPRE_Complex *data, hypre_CommHandle **comm_handle_ptr ) { hypre_CommPkg *comm_pkg = hypre_ComputePkgCommPkg(compute_pkg); hypre_InitializeCommunication(comm_pkg, data, data, 0, 0, comm_handle_ptr); return hypre_error_flag; } /*-------------------------------------------------------------------------- * Finalize a communication exchange. The dependent computations may * be done after a call to this routine. *--------------------------------------------------------------------------*/ HYPRE_Int hypre_FinalizeIndtComputations( hypre_CommHandle *comm_handle ) { hypre_FinalizeCommunication(comm_handle ); return hypre_error_flag; } hypre-2.33.0/src/struct_mv/computation.h000066400000000000000000000053171477326011500202720ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * Header info for computation * *****************************************************************************/ #ifndef hypre_COMPUTATION_HEADER #define hypre_COMPUTATION_HEADER /*-------------------------------------------------------------------------- * hypre_ComputeInfo: *--------------------------------------------------------------------------*/ typedef struct hypre_ComputeInfo_struct { hypre_CommInfo *comm_info; hypre_BoxArrayArray *indt_boxes; hypre_BoxArrayArray *dept_boxes; hypre_Index stride; } hypre_ComputeInfo; /*-------------------------------------------------------------------------- * hypre_ComputePkg: * Structure containing information for doing computations. *--------------------------------------------------------------------------*/ typedef struct hypre_ComputePkg_struct { hypre_CommPkg *comm_pkg; hypre_BoxArrayArray *indt_boxes; hypre_BoxArrayArray *dept_boxes; hypre_Index stride; hypre_StructGrid *grid; hypre_BoxArray *data_space; HYPRE_Int num_values; } hypre_ComputePkg; /*-------------------------------------------------------------------------- * Accessor macros: hypre_ComputeInfo *--------------------------------------------------------------------------*/ #define hypre_ComputeInfoCommInfo(info) (info -> comm_info) #define hypre_ComputeInfoIndtBoxes(info) (info -> indt_boxes) #define hypre_ComputeInfoDeptBoxes(info) (info -> dept_boxes) #define hypre_ComputeInfoStride(info) (info -> stride) /*-------------------------------------------------------------------------- * Accessor macros: hypre_ComputePkg *--------------------------------------------------------------------------*/ #define hypre_ComputePkgCommPkg(compute_pkg) (compute_pkg -> comm_pkg) #define hypre_ComputePkgIndtBoxes(compute_pkg) (compute_pkg -> indt_boxes) #define hypre_ComputePkgDeptBoxes(compute_pkg) (compute_pkg -> dept_boxes) #define hypre_ComputePkgStride(compute_pkg) (compute_pkg -> stride) #define hypre_ComputePkgGrid(compute_pkg) (compute_pkg -> grid) #define hypre_ComputePkgDataSpace(compute_pkg) (compute_pkg -> data_space) #define hypre_ComputePkgNumValues(compute_pkg) (compute_pkg -> num_values) #endif hypre-2.33.0/src/struct_mv/headers000077500000000000000000000057321477326011500171210ustar00rootroot00000000000000#!/bin/bash # Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) INTERNAL_HEADER=_hypre_struct_mv.h #=========================================================================== # Include guards and other includes #=========================================================================== cat > $INTERNAL_HEADER <<@ /*** DO NOT EDIT THIS FILE DIRECTLY (use 'headers' to generate) ***/ #ifndef hypre_STRUCT_MV_HEADER #define hypre_STRUCT_MV_HEADER #include #include #include #include "HYPRE_struct_mv.h" #include "_hypre_utilities.h" @ cat >> $INTERNAL_HEADER <<@ #ifdef __cplusplus extern "C" { #endif @ #=========================================================================== # Structures and prototypes #=========================================================================== cat box.h >> $INTERNAL_HEADER cat assumed_part.h >> $INTERNAL_HEADER cat box_manager.h >> $INTERNAL_HEADER cat struct_grid.h >> $INTERNAL_HEADER cat struct_stencil.h >> $INTERNAL_HEADER cat struct_communication.h >> $INTERNAL_HEADER cat computation.h >> $INTERNAL_HEADER cat struct_matrix.h >> $INTERNAL_HEADER cat struct_vector.h >> $INTERNAL_HEADER cat protos.h >> $INTERNAL_HEADER #=========================================================================== # BoxLoops #=========================================================================== cat boxloop_omp_device.h >> $INTERNAL_HEADER cat boxloop_host.h >> $INTERNAL_HEADER #=========================================================================== # Include guards #=========================================================================== cat >> $INTERNAL_HEADER <<@ #ifdef __cplusplus } #endif #endif @ INTERNAL_HEADER=_hypre_struct_mv.hpp #=========================================================================== # Include guards and other includes #=========================================================================== cat > $INTERNAL_HEADER <<@ /*** DO NOT EDIT THIS FILE DIRECTLY (use 'headers' to generate) ***/ #ifndef hypre_STRUCT_MV_HPP #define hypre_STRUCT_MV_HPP #include "_hypre_utilities.hpp" @ cat >> $INTERNAL_HEADER <<@ #ifdef __cplusplus extern "C++" { #endif @ #=========================================================================== # BoxLoops #=========================================================================== cat boxloop_raja.h >> $INTERNAL_HEADER cat boxloop_kokkos.h >> $INTERNAL_HEADER cat boxloop_cuda.h >> $INTERNAL_HEADER cat boxloop_sycl.h >> $INTERNAL_HEADER #=========================================================================== # Include guards #=========================================================================== cat >> $INTERNAL_HEADER <<@ #ifdef __cplusplus } #endif #endif @ hypre-2.33.0/src/struct_mv/project.c000066400000000000000000000066321477326011500173720ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * Projection routines. * *****************************************************************************/ #include "_hypre_struct_mv.h" /*-------------------------------------------------------------------------- * hypre_ProjectBox: * Projects a box onto a strided index space that contains the * index `index' and has stride `stride'. * * Note: An "empty" projection is represented by a box with volume 0. *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ProjectBox( hypre_Box *box, hypre_Index index, hypre_Index stride ) { HYPRE_Int i, s, d, hl, hu, kl, ku, ndim = hypre_BoxNDim(box); /*------------------------------------------------------ * project in all ndim dimensions *------------------------------------------------------*/ for (d = 0; d < ndim; d++) { i = hypre_IndexD(index, d); s = hypre_IndexD(stride, d); hl = hypre_BoxIMinD(box, d) - i; hu = hypre_BoxIMaxD(box, d) - i; if ( hl <= 0 ) { kl = (HYPRE_Int) (hl / s); } else { kl = (HYPRE_Int) ((hl + (s - 1)) / s); } if ( hu >= 0 ) { ku = (HYPRE_Int) (hu / s); } else { ku = (HYPRE_Int) ((hu - (s - 1)) / s); } hypre_BoxIMinD(box, d) = i + kl * s; hypre_BoxIMaxD(box, d) = i + ku * s; } return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_ProjectBoxArray: * * Note: The dimensions of the modified box array are not changed. * So, it is possible to have boxes with volume 0. *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ProjectBoxArray( hypre_BoxArray *box_array, hypre_Index index, hypre_Index stride ) { hypre_Box *box; HYPRE_Int i; hypre_ForBoxI(i, box_array) { box = hypre_BoxArrayBox(box_array, i); hypre_ProjectBox(box, index, stride); } return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_ProjectBoxArrayArray: * * Note: The dimensions of the modified box array-array are not changed. * So, it is possible to have boxes with volume 0. *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ProjectBoxArrayArray( hypre_BoxArrayArray *box_array_array, hypre_Index index, hypre_Index stride ) { hypre_BoxArray *box_array; hypre_Box *box; HYPRE_Int i, j; hypre_ForBoxArrayI(i, box_array_array) { box_array = hypre_BoxArrayArrayBoxArray(box_array_array, i); hypre_ForBoxI(j, box_array) { box = hypre_BoxArrayBox(box_array, j); hypre_ProjectBox(box, index, stride); } } return hypre_error_flag; } hypre-2.33.0/src/struct_mv/protos.h000066400000000000000000001046171477326011500172610ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /* assumed_part.c */ HYPRE_Int hypre_APSubdivideRegion ( hypre_Box *region, HYPRE_Int dim, HYPRE_Int level, hypre_BoxArray *box_array, HYPRE_Int *num_new_boxes ); HYPRE_Int hypre_APFindMyBoxesInRegions ( hypre_BoxArray *region_array, hypre_BoxArray *my_box_array, HYPRE_Int **p_count_array, HYPRE_Real **p_vol_array ); HYPRE_Int hypre_APGetAllBoxesInRegions ( hypre_BoxArray *region_array, hypre_BoxArray *my_box_array, HYPRE_Int **p_count_array, HYPRE_Real **p_vol_array, MPI_Comm comm ); HYPRE_Int hypre_APShrinkRegions ( hypre_BoxArray *region_array, hypre_BoxArray *my_box_array, MPI_Comm comm ); HYPRE_Int hypre_APPruneRegions ( hypre_BoxArray *region_array, HYPRE_Int **p_count_array, HYPRE_Real **p_vol_array ); HYPRE_Int hypre_APRefineRegionsByVol ( hypre_BoxArray *region_array, HYPRE_Real *vol_array, HYPRE_Int max_regions, HYPRE_Real gamma, HYPRE_Int dim, HYPRE_Int *return_code, MPI_Comm comm ); HYPRE_Int hypre_StructAssumedPartitionCreate ( HYPRE_Int dim, hypre_Box *bounding_box, HYPRE_Real global_boxes_size, HYPRE_Int global_num_boxes, hypre_BoxArray *local_boxes, HYPRE_Int *local_boxnums, HYPRE_Int max_regions, HYPRE_Int max_refinements, HYPRE_Real gamma, MPI_Comm comm, hypre_StructAssumedPart **p_assumed_partition ); HYPRE_Int hypre_StructAssumedPartitionDestroy ( hypre_StructAssumedPart *assumed_part ); HYPRE_Int hypre_APFillResponseStructAssumedPart ( void *p_recv_contact_buf, HYPRE_Int contact_size, HYPRE_Int contact_proc, void *ro, MPI_Comm comm, void **p_send_response_buf, HYPRE_Int *response_message_size ); HYPRE_Int hypre_StructAssumedPartitionGetRegionsFromProc ( hypre_StructAssumedPart *assumed_part, HYPRE_Int proc_id, hypre_BoxArray *assumed_regions ); HYPRE_Int hypre_StructAssumedPartitionGetProcsFromBox ( hypre_StructAssumedPart *assumed_part, hypre_Box *box, HYPRE_Int *num_proc_array, HYPRE_Int *size_alloc_proc_array, HYPRE_Int **p_proc_array ); /* box_algebra.c */ HYPRE_Int hypre_IntersectBoxes ( hypre_Box *box1, hypre_Box *box2, hypre_Box *ibox ); HYPRE_Int hypre_SubtractBoxes ( hypre_Box *box1, hypre_Box *box2, hypre_BoxArray *box_array ); HYPRE_Int hypre_SubtractBoxArrays ( hypre_BoxArray *box_array1, hypre_BoxArray *box_array2, hypre_BoxArray *tmp_box_array ); HYPRE_Int hypre_UnionBoxes ( hypre_BoxArray *boxes ); HYPRE_Int hypre_MinUnionBoxes ( hypre_BoxArray *boxes ); /* box_boundary.c */ HYPRE_Int hypre_BoxBoundaryIntersect ( hypre_Box *box, hypre_StructGrid *grid, HYPRE_Int d, HYPRE_Int dir, hypre_BoxArray *boundary ); HYPRE_Int hypre_BoxBoundaryG ( hypre_Box *box, hypre_StructGrid *g, hypre_BoxArray *boundary ); HYPRE_Int hypre_BoxBoundaryDG ( hypre_Box *box, hypre_StructGrid *g, hypre_BoxArray *boundarym, hypre_BoxArray *boundaryp, HYPRE_Int d ); HYPRE_Int hypre_GeneralBoxBoundaryIntersect( hypre_Box *box, hypre_StructGrid *grid, hypre_Index stencil_element, hypre_BoxArray *boundary ); /* box.c */ HYPRE_Int hypre_SetIndex ( hypre_Index index, HYPRE_Int val ); HYPRE_Int hypre_CopyIndex( hypre_Index in_index, hypre_Index out_index ); HYPRE_Int hypre_CopyToCleanIndex( hypre_Index in_index, HYPRE_Int ndim, hypre_Index out_index ); HYPRE_Int hypre_IndexEqual ( hypre_Index index, HYPRE_Int val, HYPRE_Int ndim ); HYPRE_Int hypre_IndexMin( hypre_Index index, HYPRE_Int ndim ); HYPRE_Int hypre_IndexMax( hypre_Index index, HYPRE_Int ndim ); HYPRE_Int hypre_AddIndexes ( hypre_Index index1, hypre_Index index2, HYPRE_Int ndim, hypre_Index result ); HYPRE_Int hypre_SubtractIndexes ( hypre_Index index1, hypre_Index index2, HYPRE_Int ndim, hypre_Index result ); HYPRE_Int hypre_IndexesEqual ( hypre_Index index1, hypre_Index index2, HYPRE_Int ndim ); HYPRE_Int hypre_IndexPrint ( FILE *file, HYPRE_Int ndim, hypre_Index index ); HYPRE_Int hypre_IndexRead ( FILE *file, HYPRE_Int ndim, hypre_Index index ); hypre_Box *hypre_BoxCreate ( HYPRE_Int ndim ); HYPRE_Int hypre_BoxDestroy ( hypre_Box *box ); HYPRE_Int hypre_BoxInit( hypre_Box *box, HYPRE_Int ndim ); HYPRE_Int hypre_BoxSetExtents ( hypre_Box *box, hypre_Index imin, hypre_Index imax ); HYPRE_Int hypre_CopyBox( hypre_Box *box1, hypre_Box *box2 ); hypre_Box *hypre_BoxDuplicate ( hypre_Box *box ); HYPRE_Int hypre_BoxVolume( hypre_Box *box ); HYPRE_Real hypre_doubleBoxVolume( hypre_Box *box ); HYPRE_Int hypre_IndexInBox ( hypre_Index index, hypre_Box *box ); HYPRE_Int hypre_BoxGetSize ( hypre_Box *box, hypre_Index size ); HYPRE_Int hypre_BoxGetStrideSize ( hypre_Box *box, hypre_Index stride, hypre_Index size ); HYPRE_Int hypre_BoxGetStrideVolume ( hypre_Box *box, hypre_Index stride, HYPRE_Int *volume_ptr ); HYPRE_Int hypre_BoxIndexRank( hypre_Box *box, hypre_Index index ); HYPRE_Int hypre_BoxRankIndex( hypre_Box *box, HYPRE_Int rank, hypre_Index index ); HYPRE_Int hypre_BoxOffsetDistance( hypre_Box *box, hypre_Index index ); HYPRE_Int hypre_BoxShiftPos( hypre_Box *box, hypre_Index shift ); HYPRE_Int hypre_BoxShiftNeg( hypre_Box *box, hypre_Index shift ); HYPRE_Int hypre_BoxGrowByIndex( hypre_Box *box, hypre_Index index ); HYPRE_Int hypre_BoxGrowByValue( hypre_Box *box, HYPRE_Int val ); HYPRE_Int hypre_BoxGrowByArray ( hypre_Box *box, HYPRE_Int *array ); HYPRE_Int hypre_BoxPrint ( FILE *file, hypre_Box *box ); HYPRE_Int hypre_BoxRead ( FILE *file, HYPRE_Int ndim, hypre_Box **box_ptr ); hypre_BoxArray *hypre_BoxArrayCreate ( HYPRE_Int size, HYPRE_Int ndim ); HYPRE_Int hypre_BoxArrayDestroy ( hypre_BoxArray *box_array ); HYPRE_Int hypre_BoxArraySetSize ( hypre_BoxArray *box_array, HYPRE_Int size ); hypre_BoxArray *hypre_BoxArrayDuplicate ( hypre_BoxArray *box_array ); HYPRE_Int hypre_AppendBox ( hypre_Box *box, hypre_BoxArray *box_array ); HYPRE_Int hypre_DeleteBox ( hypre_BoxArray *box_array, HYPRE_Int index ); HYPRE_Int hypre_DeleteMultipleBoxes ( hypre_BoxArray *box_array, HYPRE_Int *indices, HYPRE_Int num ); HYPRE_Int hypre_AppendBoxArray ( hypre_BoxArray *box_array_0, hypre_BoxArray *box_array_1 ); hypre_BoxArrayArray *hypre_BoxArrayArrayCreate ( HYPRE_Int size, HYPRE_Int ndim ); HYPRE_Int hypre_BoxArrayArrayDestroy ( hypre_BoxArrayArray *box_array_array ); hypre_BoxArrayArray *hypre_BoxArrayArrayDuplicate ( hypre_BoxArrayArray *box_array_array ); /* box_manager.c */ HYPRE_Int hypre_BoxManEntryGetInfo ( hypre_BoxManEntry *entry, void **info_ptr ); HYPRE_Int hypre_BoxManEntryGetExtents ( hypre_BoxManEntry *entry, hypre_Index imin, hypre_Index imax ); HYPRE_Int hypre_BoxManEntryCopy ( hypre_BoxManEntry *fromentry, hypre_BoxManEntry *toentry ); HYPRE_Int hypre_BoxManSetAllGlobalKnown ( hypre_BoxManager *manager, HYPRE_Int known ); HYPRE_Int hypre_BoxManGetAllGlobalKnown ( hypre_BoxManager *manager, HYPRE_Int *known ); HYPRE_Int hypre_BoxManSetIsEntriesSort ( hypre_BoxManager *manager, HYPRE_Int is_sort ); HYPRE_Int hypre_BoxManGetIsEntriesSort ( hypre_BoxManager *manager, HYPRE_Int *is_sort ); HYPRE_Int hypre_BoxManGetGlobalIsGatherCalled ( hypre_BoxManager *manager, MPI_Comm comm, HYPRE_Int *is_gather ); HYPRE_Int hypre_BoxManGetAssumedPartition ( hypre_BoxManager *manager, hypre_StructAssumedPart **assumed_partition ); HYPRE_Int hypre_BoxManSetAssumedPartition ( hypre_BoxManager *manager, hypre_StructAssumedPart *assumed_partition ); HYPRE_Int hypre_BoxManSetBoundingBox ( hypre_BoxManager *manager, hypre_Box *bounding_box ); HYPRE_Int hypre_BoxManSetNumGhost ( hypre_BoxManager *manager, HYPRE_Int *num_ghost ); HYPRE_Int hypre_BoxManDeleteMultipleEntriesAndInfo ( hypre_BoxManager *manager, HYPRE_Int *indices, HYPRE_Int num ); HYPRE_Int hypre_BoxManCreate ( HYPRE_Int max_nentries, HYPRE_Int info_size, HYPRE_Int dim, hypre_Box *bounding_box, MPI_Comm comm, hypre_BoxManager **manager_ptr ); HYPRE_Int hypre_BoxManIncSize ( hypre_BoxManager *manager, HYPRE_Int inc_size ); HYPRE_Int hypre_BoxManDestroy ( hypre_BoxManager *manager ); HYPRE_Int hypre_BoxManAddEntry ( hypre_BoxManager *manager, hypre_Index imin, hypre_Index imax, HYPRE_Int proc_id, HYPRE_Int box_id, void *info ); HYPRE_Int hypre_BoxManGetEntry ( hypre_BoxManager *manager, HYPRE_Int proc, HYPRE_Int id, hypre_BoxManEntry **entry_ptr ); HYPRE_Int hypre_BoxManGetAllEntries ( hypre_BoxManager *manager, HYPRE_Int *num_entries, hypre_BoxManEntry **entries ); HYPRE_Int hypre_BoxManGetAllEntriesBoxes ( hypre_BoxManager *manager, hypre_BoxArray *boxes ); HYPRE_Int hypre_BoxManGetLocalEntriesBoxes ( hypre_BoxManager *manager, hypre_BoxArray *boxes ); HYPRE_Int hypre_BoxManGetAllEntriesBoxesProc ( hypre_BoxManager *manager, hypre_BoxArray *boxes, HYPRE_Int **procs_ptr ); HYPRE_Int hypre_BoxManGatherEntries ( hypre_BoxManager *manager, hypre_Index imin, hypre_Index imax ); HYPRE_Int hypre_BoxManAssemble ( hypre_BoxManager *manager ); HYPRE_Int hypre_BoxManIntersect ( hypre_BoxManager *manager, hypre_Index ilower, hypre_Index iupper, hypre_BoxManEntry ***entries_ptr, HYPRE_Int *nentries_ptr ); HYPRE_Int hypre_FillResponseBoxManAssemble1 ( void *p_recv_contact_buf, HYPRE_Int contact_size, HYPRE_Int contact_proc, void *ro, MPI_Comm comm, void **p_send_response_buf, HYPRE_Int *response_message_size ); HYPRE_Int hypre_FillResponseBoxManAssemble2 ( void *p_recv_contact_buf, HYPRE_Int contact_size, HYPRE_Int contact_proc, void *ro, MPI_Comm comm, void **p_send_response_buf, HYPRE_Int *response_message_size ); /* communication_info.c */ HYPRE_Int hypre_CommInfoCreate ( hypre_BoxArrayArray *send_boxes, hypre_BoxArrayArray *recv_boxes, HYPRE_Int **send_procs, HYPRE_Int **recv_procs, HYPRE_Int **send_rboxnums, HYPRE_Int **recv_rboxnums, hypre_BoxArrayArray *send_rboxes, hypre_BoxArrayArray *recv_rboxes, HYPRE_Int boxes_match, hypre_CommInfo **comm_info_ptr ); HYPRE_Int hypre_CommInfoSetTransforms ( hypre_CommInfo *comm_info, HYPRE_Int num_transforms, hypre_Index *coords, hypre_Index *dirs, HYPRE_Int **send_transforms, HYPRE_Int **recv_transforms ); HYPRE_Int hypre_CommInfoGetTransforms ( hypre_CommInfo *comm_info, HYPRE_Int *num_transforms, hypre_Index **coords, hypre_Index **dirs ); HYPRE_Int hypre_CommInfoProjectSend ( hypre_CommInfo *comm_info, hypre_Index index, hypre_Index stride ); HYPRE_Int hypre_CommInfoProjectRecv ( hypre_CommInfo *comm_info, hypre_Index index, hypre_Index stride ); HYPRE_Int hypre_CommInfoDestroy ( hypre_CommInfo *comm_info ); HYPRE_Int hypre_CreateCommInfoFromStencil ( hypre_StructGrid *grid, hypre_StructStencil *stencil, hypre_CommInfo **comm_info_ptr ); HYPRE_Int hypre_CreateCommInfoFromNumGhost ( hypre_StructGrid *grid, HYPRE_Int *num_ghost, hypre_CommInfo **comm_info_ptr ); HYPRE_Int hypre_CreateCommInfoFromGrids ( hypre_StructGrid *from_grid, hypre_StructGrid *to_grid, hypre_CommInfo **comm_info_ptr ); /* computation.c */ HYPRE_Int hypre_ComputeInfoCreate ( hypre_CommInfo *comm_info, hypre_BoxArrayArray *indt_boxes, hypre_BoxArrayArray *dept_boxes, hypre_ComputeInfo **compute_info_ptr ); HYPRE_Int hypre_ComputeInfoProjectSend ( hypre_ComputeInfo *compute_info, hypre_Index index, hypre_Index stride ); HYPRE_Int hypre_ComputeInfoProjectRecv ( hypre_ComputeInfo *compute_info, hypre_Index index, hypre_Index stride ); HYPRE_Int hypre_ComputeInfoProjectComp ( hypre_ComputeInfo *compute_info, hypre_Index index, hypre_Index stride ); HYPRE_Int hypre_ComputeInfoDestroy ( hypre_ComputeInfo *compute_info ); HYPRE_Int hypre_CreateComputeInfo ( hypre_StructGrid *grid, hypre_StructStencil *stencil, hypre_ComputeInfo **compute_info_ptr ); HYPRE_Int hypre_ComputePkgCreate ( hypre_ComputeInfo *compute_info, hypre_BoxArray *data_space, HYPRE_Int num_values, hypre_StructGrid *grid, hypre_ComputePkg **compute_pkg_ptr ); HYPRE_Int hypre_ComputePkgDestroy ( hypre_ComputePkg *compute_pkg ); HYPRE_Int hypre_InitializeIndtComputations ( hypre_ComputePkg *compute_pkg, HYPRE_Complex *data, hypre_CommHandle **comm_handle_ptr ); HYPRE_Int hypre_FinalizeIndtComputations ( hypre_CommHandle *comm_handle ); /* HYPRE_struct_grid.c */ HYPRE_Int HYPRE_StructGridCreate ( MPI_Comm comm, HYPRE_Int dim, HYPRE_StructGrid *grid ); HYPRE_Int HYPRE_StructGridDestroy ( HYPRE_StructGrid grid ); HYPRE_Int HYPRE_StructGridSetExtents ( HYPRE_StructGrid grid, HYPRE_Int *ilower, HYPRE_Int *iupper ); HYPRE_Int HYPRE_StructGridSetPeriodic ( HYPRE_StructGrid grid, HYPRE_Int *periodic ); HYPRE_Int HYPRE_StructGridAssemble ( HYPRE_StructGrid grid ); HYPRE_Int HYPRE_StructGridSetNumGhost ( HYPRE_StructGrid grid, HYPRE_Int *num_ghost ); /* HYPRE_struct_matrix.c */ HYPRE_Int HYPRE_StructMatrixCreate ( MPI_Comm comm, HYPRE_StructGrid grid, HYPRE_StructStencil stencil, HYPRE_StructMatrix *matrix ); HYPRE_Int HYPRE_StructMatrixDestroy ( HYPRE_StructMatrix matrix ); HYPRE_Int HYPRE_StructMatrixInitialize ( HYPRE_StructMatrix matrix ); HYPRE_Int HYPRE_StructMatrixSetValues ( HYPRE_StructMatrix matrix, HYPRE_Int *grid_index, HYPRE_Int num_stencil_indices, HYPRE_Int *stencil_indices, HYPRE_Complex *values ); HYPRE_Int HYPRE_StructMatrixGetValues ( HYPRE_StructMatrix matrix, HYPRE_Int *grid_index, HYPRE_Int num_stencil_indices, HYPRE_Int *stencil_indices, HYPRE_Complex *values ); HYPRE_Int HYPRE_StructMatrixSetBoxValues ( HYPRE_StructMatrix matrix, HYPRE_Int *ilower, HYPRE_Int *iupper, HYPRE_Int num_stencil_indices, HYPRE_Int *stencil_indices, HYPRE_Complex *values ); HYPRE_Int HYPRE_StructMatrixGetBoxValues ( HYPRE_StructMatrix matrix, HYPRE_Int *ilower, HYPRE_Int *iupper, HYPRE_Int num_stencil_indices, HYPRE_Int *stencil_indices, HYPRE_Complex *values ); HYPRE_Int HYPRE_StructMatrixSetConstantValues ( HYPRE_StructMatrix matrix, HYPRE_Int num_stencil_indices, HYPRE_Int *stencil_indices, HYPRE_Complex *values ); HYPRE_Int HYPRE_StructMatrixAddToValues ( HYPRE_StructMatrix matrix, HYPRE_Int *grid_index, HYPRE_Int num_stencil_indices, HYPRE_Int *stencil_indices, HYPRE_Complex *values ); HYPRE_Int HYPRE_StructMatrixAddToBoxValues ( HYPRE_StructMatrix matrix, HYPRE_Int *ilower, HYPRE_Int *iupper, HYPRE_Int num_stencil_indices, HYPRE_Int *stencil_indices, HYPRE_Complex *values ); HYPRE_Int HYPRE_StructMatrixAddToConstantValues ( HYPRE_StructMatrix matrix, HYPRE_Int num_stencil_indices, HYPRE_Int *stencil_indices, HYPRE_Complex *values ); HYPRE_Int HYPRE_StructMatrixAssemble ( HYPRE_StructMatrix matrix ); HYPRE_Int HYPRE_StructMatrixSetNumGhost ( HYPRE_StructMatrix matrix, HYPRE_Int *num_ghost ); HYPRE_Int HYPRE_StructMatrixGetGrid ( HYPRE_StructMatrix matrix, HYPRE_StructGrid *grid ); HYPRE_Int HYPRE_StructMatrixSetSymmetric ( HYPRE_StructMatrix matrix, HYPRE_Int symmetric ); HYPRE_Int HYPRE_StructMatrixSetConstantEntries ( HYPRE_StructMatrix matrix, HYPRE_Int nentries, HYPRE_Int *entries ); HYPRE_Int HYPRE_StructMatrixPrint ( const char *filename, HYPRE_StructMatrix matrix, HYPRE_Int all ); HYPRE_Int HYPRE_StructMatrixMatvec ( HYPRE_Complex alpha, HYPRE_StructMatrix A, HYPRE_StructVector x, HYPRE_Complex beta, HYPRE_StructVector y ); HYPRE_Int HYPRE_StructMatrixClearBoundary( HYPRE_StructMatrix matrix ); /* HYPRE_struct_stencil.c */ HYPRE_Int HYPRE_StructStencilCreate ( HYPRE_Int dim, HYPRE_Int size, HYPRE_StructStencil *stencil ); HYPRE_Int HYPRE_StructStencilSetElement ( HYPRE_StructStencil stencil, HYPRE_Int element_index, HYPRE_Int *offset ); HYPRE_Int HYPRE_StructStencilDestroy ( HYPRE_StructStencil stencil ); /* HYPRE_struct_vector.c */ HYPRE_Int HYPRE_StructVectorCreate ( MPI_Comm comm, HYPRE_StructGrid grid, HYPRE_StructVector *vector ); HYPRE_Int HYPRE_StructVectorDestroy ( HYPRE_StructVector struct_vector ); HYPRE_Int HYPRE_StructVectorInitialize ( HYPRE_StructVector vector ); HYPRE_Int HYPRE_StructVectorSetValues ( HYPRE_StructVector vector, HYPRE_Int *grid_index, HYPRE_Complex values ); HYPRE_Int HYPRE_StructVectorSetBoxValues ( HYPRE_StructVector vector, HYPRE_Int *ilower, HYPRE_Int *iupper, HYPRE_Complex *values ); HYPRE_Int HYPRE_StructVectorAddToValues ( HYPRE_StructVector vector, HYPRE_Int *grid_index, HYPRE_Complex values ); HYPRE_Int HYPRE_StructVectorAddToBoxValues ( HYPRE_StructVector vector, HYPRE_Int *ilower, HYPRE_Int *iupper, HYPRE_Complex *values ); HYPRE_Int HYPRE_StructVectorScaleValues ( HYPRE_StructVector vector, HYPRE_Complex factor ); HYPRE_Int HYPRE_StructVectorGetValues ( HYPRE_StructVector vector, HYPRE_Int *grid_index, HYPRE_Complex *values ); HYPRE_Int HYPRE_StructVectorGetBoxValues ( HYPRE_StructVector vector, HYPRE_Int *ilower, HYPRE_Int *iupper, HYPRE_Complex *values ); HYPRE_Int HYPRE_StructVectorAssemble ( HYPRE_StructVector vector ); HYPRE_Int hypre_StructVectorPrintData ( FILE *file, hypre_StructVector *vector, HYPRE_Int all ); HYPRE_Int hypre_StructVectorReadData ( FILE *file, hypre_StructVector *vector ); HYPRE_Int HYPRE_StructVectorPrint ( const char *filename, HYPRE_StructVector vector, HYPRE_Int all ); HYPRE_Int HYPRE_StructVectorRead ( MPI_Comm comm, const char *filename, HYPRE_Int *num_ghost, HYPRE_StructVector *vector ); HYPRE_Int HYPRE_StructVectorSetNumGhost ( HYPRE_StructVector vector, HYPRE_Int *num_ghost ); HYPRE_Int HYPRE_StructVectorCopy ( HYPRE_StructVector x, HYPRE_StructVector y ); HYPRE_Int HYPRE_StructVectorSetConstantValues ( HYPRE_StructVector vector, HYPRE_Complex values ); HYPRE_Int HYPRE_StructVectorGetMigrateCommPkg ( HYPRE_StructVector from_vector, HYPRE_StructVector to_vector, HYPRE_CommPkg *comm_pkg ); HYPRE_Int HYPRE_StructVectorMigrate ( HYPRE_CommPkg comm_pkg, HYPRE_StructVector from_vector, HYPRE_StructVector to_vector ); HYPRE_Int HYPRE_CommPkgDestroy ( HYPRE_CommPkg comm_pkg ); /* project.c */ HYPRE_Int hypre_ProjectBox ( hypre_Box *box, hypre_Index index, hypre_Index stride ); HYPRE_Int hypre_ProjectBoxArray ( hypre_BoxArray *box_array, hypre_Index index, hypre_Index stride ); HYPRE_Int hypre_ProjectBoxArrayArray ( hypre_BoxArrayArray *box_array_array, hypre_Index index, hypre_Index stride ); /* struct_axpy.c */ HYPRE_Int hypre_StructAxpy ( HYPRE_Complex alpha, hypre_StructVector *x, hypre_StructVector *y ); /* struct_communication.c */ HYPRE_Int hypre_CommPkgCreate ( hypre_CommInfo *comm_info, hypre_BoxArray *send_data_space, hypre_BoxArray *recv_data_space, HYPRE_Int num_values, HYPRE_Int **orders, HYPRE_Int reverse, MPI_Comm comm, hypre_CommPkg **comm_pkg_ptr ); HYPRE_Int hypre_CommTypeSetEntries ( hypre_CommType *comm_type, HYPRE_Int *boxnums, hypre_Box *boxes, hypre_Index stride, hypre_Index coord, hypre_Index dir, HYPRE_Int *order, hypre_BoxArray *data_space, HYPRE_Int *data_offsets ); HYPRE_Int hypre_CommTypeSetEntry ( hypre_Box *box, hypre_Index stride, hypre_Index coord, hypre_Index dir, HYPRE_Int *order, hypre_Box *data_box, HYPRE_Int data_box_offset, hypre_CommEntryType *comm_entry ); HYPRE_Int hypre_InitializeCommunication ( hypre_CommPkg *comm_pkg, HYPRE_Complex *send_data, HYPRE_Complex *recv_data, HYPRE_Int action, HYPRE_Int tag, hypre_CommHandle **comm_handle_ptr ); HYPRE_Int hypre_FinalizeCommunication ( hypre_CommHandle *comm_handle ); HYPRE_Int hypre_ExchangeLocalData ( hypre_CommPkg *comm_pkg, HYPRE_Complex *send_data, HYPRE_Complex *recv_data, HYPRE_Int action ); HYPRE_Int hypre_CommPkgDestroy ( hypre_CommPkg *comm_pkg ); /* struct_copy.c */ HYPRE_Int hypre_StructCopy ( hypre_StructVector *x, hypre_StructVector *y ); HYPRE_Int hypre_StructPartialCopy ( hypre_StructVector *x, hypre_StructVector *y, hypre_BoxArrayArray *array_boxes ); /* struct_grid.c */ HYPRE_Int hypre_StructGridCreate ( MPI_Comm comm, HYPRE_Int dim, hypre_StructGrid **grid_ptr ); HYPRE_Int hypre_StructGridRef ( hypre_StructGrid *grid, hypre_StructGrid **grid_ref ); HYPRE_Int hypre_StructGridDestroy ( hypre_StructGrid *grid ); HYPRE_Int hypre_StructGridSetPeriodic ( hypre_StructGrid *grid, hypre_Index periodic ); HYPRE_Int hypre_StructGridSetExtents ( hypre_StructGrid *grid, hypre_Index ilower, hypre_Index iupper ); HYPRE_Int hypre_StructGridSetBoxes ( hypre_StructGrid *grid, hypre_BoxArray *boxes ); HYPRE_Int hypre_StructGridSetBoundingBox ( hypre_StructGrid *grid, hypre_Box *new_bb ); HYPRE_Int hypre_StructGridSetIDs ( hypre_StructGrid *grid, HYPRE_Int *ids ); HYPRE_Int hypre_StructGridSetBoxManager ( hypre_StructGrid *grid, hypre_BoxManager *boxman ); HYPRE_Int hypre_StructGridSetMaxDistance ( hypre_StructGrid *grid, hypre_Index dist ); HYPRE_Int hypre_StructGridAssemble ( hypre_StructGrid *grid ); HYPRE_Int hypre_GatherAllBoxes ( MPI_Comm comm, hypre_BoxArray *boxes, HYPRE_Int dim, hypre_BoxArray **all_boxes_ptr, HYPRE_Int **all_procs_ptr, HYPRE_Int *first_local_ptr ); HYPRE_Int hypre_ComputeBoxnums ( hypre_BoxArray *boxes, HYPRE_Int *procs, HYPRE_Int **boxnums_ptr ); HYPRE_Int hypre_StructGridPrint ( FILE *file, hypre_StructGrid *grid ); HYPRE_Int hypre_StructGridRead ( MPI_Comm comm, FILE *file, hypre_StructGrid **grid_ptr ); HYPRE_Int hypre_StructGridSetNumGhost ( hypre_StructGrid *grid, HYPRE_Int *num_ghost ); HYPRE_Int hypre_StructGridGetMaxBoxSize ( hypre_StructGrid *grid ); #if defined(HYPRE_USING_CUDA) || defined(HYPRE_USING_HIP) HYPRE_Int hypre_StructGridSetDataLocation( HYPRE_StructGrid grid, HYPRE_MemoryLocation data_location ); #endif /* struct_innerprod.c */ HYPRE_Real hypre_StructInnerProd ( hypre_StructVector *x, hypre_StructVector *y ); /* struct_io.c */ HYPRE_Int hypre_PrintBoxArrayData ( FILE *file, hypre_BoxArray *box_array, hypre_BoxArray *data_space, HYPRE_Int num_values, HYPRE_Int dim, HYPRE_Complex *data ); HYPRE_Int hypre_PrintCCVDBoxArrayData ( FILE *file, hypre_BoxArray *box_array, hypre_BoxArray *data_space, HYPRE_Int num_values, HYPRE_Int center_rank, HYPRE_Int stencil_size, HYPRE_Int *symm_elements, HYPRE_Int dim, HYPRE_Complex *data ); HYPRE_Int hypre_PrintCCBoxArrayData ( FILE *file, hypre_BoxArray *box_array, hypre_BoxArray *data_space, HYPRE_Int num_values, HYPRE_Complex *data ); HYPRE_Int hypre_ReadBoxArrayData ( FILE *file, hypre_BoxArray *box_array, hypre_BoxArray *data_space, HYPRE_Int num_values, HYPRE_Int dim, HYPRE_Complex *data ); HYPRE_Int hypre_ReadBoxArrayData_CC ( FILE *file, hypre_BoxArray *box_array, hypre_BoxArray *data_space, HYPRE_Int stencil_size, HYPRE_Int real_stencil_size, HYPRE_Int constant_coefficient, HYPRE_Int dim, HYPRE_Complex *data ); /* struct_matrix.c */ HYPRE_Complex *hypre_StructMatrixExtractPointerByIndex ( hypre_StructMatrix *matrix, HYPRE_Int b, hypre_Index index ); hypre_StructMatrix *hypre_StructMatrixCreate ( MPI_Comm comm, hypre_StructGrid *grid, hypre_StructStencil *user_stencil ); hypre_StructMatrix *hypre_StructMatrixRef ( hypre_StructMatrix *matrix ); HYPRE_Int hypre_StructMatrixDestroy ( hypre_StructMatrix *matrix ); HYPRE_Int hypre_StructMatrixInitializeShell ( hypre_StructMatrix *matrix ); HYPRE_Int hypre_StructMatrixInitializeData ( hypre_StructMatrix *matrix, HYPRE_Complex *data, HYPRE_Complex *data_const); HYPRE_Int hypre_StructMatrixInitialize ( hypre_StructMatrix *matrix ); HYPRE_Int hypre_StructMatrixSetValues ( hypre_StructMatrix *matrix, hypre_Index grid_index, HYPRE_Int num_stencil_indices, HYPRE_Int *stencil_indices, HYPRE_Complex *values, HYPRE_Int action, HYPRE_Int boxnum, HYPRE_Int outside ); HYPRE_Int hypre_StructMatrixSetBoxValues ( hypre_StructMatrix *matrix, hypre_Box *set_box, hypre_Box *value_box, HYPRE_Int num_stencil_indices, HYPRE_Int *stencil_indices, HYPRE_Complex *values, HYPRE_Int action, HYPRE_Int boxnum, HYPRE_Int outside ); HYPRE_Int hypre_StructMatrixSetConstantValues ( hypre_StructMatrix *matrix, HYPRE_Int num_stencil_indices, HYPRE_Int *stencil_indices, HYPRE_Complex *values, HYPRE_Int action ); HYPRE_Int hypre_StructMatrixClearValues ( hypre_StructMatrix *matrix, hypre_Index grid_index, HYPRE_Int num_stencil_indices, HYPRE_Int *stencil_indices, HYPRE_Int boxnum, HYPRE_Int outside ); HYPRE_Int hypre_StructMatrixClearBoxValues ( hypre_StructMatrix *matrix, hypre_Box *clear_box, HYPRE_Int num_stencil_indices, HYPRE_Int *stencil_indices, HYPRE_Int boxnum, HYPRE_Int outside ); HYPRE_Int hypre_StructMatrixAssemble ( hypre_StructMatrix *matrix ); HYPRE_Int hypre_StructMatrixSetNumGhost ( hypre_StructMatrix *matrix, HYPRE_Int *num_ghost ); HYPRE_Int hypre_StructMatrixSetConstantCoefficient ( hypre_StructMatrix *matrix, HYPRE_Int constant_coefficient ); HYPRE_Int hypre_StructMatrixSetConstantEntries ( hypre_StructMatrix *matrix, HYPRE_Int nentries, HYPRE_Int *entries ); HYPRE_Int hypre_StructMatrixClearGhostValues ( hypre_StructMatrix *matrix ); HYPRE_Int hypre_StructMatrixPrintData ( FILE *file, hypre_StructMatrix *matrix, HYPRE_Int all ); HYPRE_Int hypre_StructMatrixReadData ( FILE *file, hypre_StructMatrix *matrix ); HYPRE_Int hypre_StructMatrixPrint ( const char *filename, hypre_StructMatrix *matrix, HYPRE_Int all ); hypre_StructMatrix *hypre_StructMatrixRead ( MPI_Comm comm, const char *filename, HYPRE_Int *num_ghost ); HYPRE_Int hypre_StructMatrixMigrate ( hypre_StructMatrix *from_matrix, hypre_StructMatrix *to_matrix ); HYPRE_Int hypre_StructMatrixClearBoundary( hypre_StructMatrix *matrix); /* struct_matrix_mask.c */ hypre_StructMatrix *hypre_StructMatrixCreateMask ( hypre_StructMatrix *matrix, HYPRE_Int num_stencil_indices, HYPRE_Int *stencil_indices ); /* struct_matvec.c */ void *hypre_StructMatvecCreate ( void ); HYPRE_Int hypre_StructMatvecSetup ( void *matvec_vdata, hypre_StructMatrix *A, hypre_StructVector *x ); HYPRE_Int hypre_StructMatvecCompute ( void *matvec_vdata, HYPRE_Complex alpha, hypre_StructMatrix *A, hypre_StructVector *x, HYPRE_Complex beta, hypre_StructVector *y ); HYPRE_Int hypre_StructMatvecCC0 ( HYPRE_Complex alpha, hypre_StructMatrix *A, hypre_StructVector *x, hypre_StructVector *y, hypre_BoxArrayArray *compute_box_aa, hypre_IndexRef stride ); HYPRE_Int hypre_StructMatvecCC1 ( HYPRE_Complex alpha, hypre_StructMatrix *A, hypre_StructVector *x, hypre_StructVector *y, hypre_BoxArrayArray *compute_box_aa, hypre_IndexRef stride ); HYPRE_Int hypre_StructMatvecCC2 ( HYPRE_Complex alpha, hypre_StructMatrix *A, hypre_StructVector *x, hypre_StructVector *y, hypre_BoxArrayArray *compute_box_aa, hypre_IndexRef stride ); HYPRE_Int hypre_StructMatvecDestroy ( void *matvec_vdata ); HYPRE_Int hypre_StructMatvec ( HYPRE_Complex alpha, hypre_StructMatrix *A, hypre_StructVector *x, HYPRE_Complex beta, hypre_StructVector *y ); /* struct_scale.c */ HYPRE_Int hypre_StructScale ( HYPRE_Complex alpha, hypre_StructVector *y ); /* struct_stencil.c */ hypre_StructStencil *hypre_StructStencilCreate ( HYPRE_Int dim, HYPRE_Int size, hypre_Index *shape ); hypre_StructStencil *hypre_StructStencilRef ( hypre_StructStencil *stencil ); HYPRE_Int hypre_StructStencilDestroy ( hypre_StructStencil *stencil ); HYPRE_Int hypre_StructStencilElementRank ( hypre_StructStencil *stencil, hypre_Index stencil_element ); HYPRE_Int hypre_StructStencilSymmetrize ( hypre_StructStencil *stencil, hypre_StructStencil **symm_stencil_ptr, HYPRE_Int **symm_elements_ptr ); /* struct_vector.c */ hypre_StructVector *hypre_StructVectorCreate ( MPI_Comm comm, hypre_StructGrid *grid ); hypre_StructVector *hypre_StructVectorRef ( hypre_StructVector *vector ); HYPRE_Int hypre_StructVectorDestroy ( hypre_StructVector *vector ); HYPRE_Int hypre_StructVectorInitializeShell ( hypre_StructVector *vector ); HYPRE_Int hypre_StructVectorInitializeData ( hypre_StructVector *vector, HYPRE_Complex *data); HYPRE_Int hypre_StructVectorInitialize ( hypre_StructVector *vector ); HYPRE_Int hypre_StructVectorSetValues ( hypre_StructVector *vector, hypre_Index grid_index, HYPRE_Complex *values, HYPRE_Int action, HYPRE_Int boxnum, HYPRE_Int outside ); HYPRE_Int hypre_StructVectorSetBoxValues ( hypre_StructVector *vector, hypre_Box *set_box, hypre_Box *value_box, HYPRE_Complex *values, HYPRE_Int action, HYPRE_Int boxnum, HYPRE_Int outside ); HYPRE_Int hypre_StructVectorClearValues ( hypre_StructVector *vector, hypre_Index grid_index, HYPRE_Int boxnum, HYPRE_Int outside ); HYPRE_Int hypre_StructVectorClearBoxValues ( hypre_StructVector *vector, hypre_Box *clear_box, HYPRE_Int boxnum, HYPRE_Int outside ); HYPRE_Int hypre_StructVectorClearAllValues ( hypre_StructVector *vector ); HYPRE_Int hypre_StructVectorSetNumGhost ( hypre_StructVector *vector, HYPRE_Int *num_ghost ); HYPRE_Int hypre_StructVectorSetDataSize(hypre_StructVector *vector, HYPRE_Int *data_size, HYPRE_Int *data_host_size); HYPRE_Int hypre_StructVectorAssemble ( hypre_StructVector *vector ); HYPRE_Int hypre_StructVectorCopy ( hypre_StructVector *x, hypre_StructVector *y ); HYPRE_Int hypre_StructVectorSetConstantValues ( hypre_StructVector *vector, HYPRE_Complex values ); HYPRE_Int hypre_StructVectorSetFunctionValues ( hypre_StructVector *vector, HYPRE_Complex (*fcn )( HYPRE_Int, HYPRE_Int, HYPRE_Int )); HYPRE_Int hypre_StructVectorClearGhostValues ( hypre_StructVector *vector ); HYPRE_Int hypre_StructVectorClearBoundGhostValues ( hypre_StructVector *vector, HYPRE_Int force ); HYPRE_Int hypre_StructVectorScaleValues ( hypre_StructVector *vector, HYPRE_Complex factor ); hypre_CommPkg *hypre_StructVectorGetMigrateCommPkg ( hypre_StructVector *from_vector, hypre_StructVector *to_vector ); HYPRE_Int hypre_StructVectorMigrate ( hypre_CommPkg *comm_pkg, hypre_StructVector *from_vector, hypre_StructVector *to_vector ); HYPRE_Int hypre_StructVectorPrint ( const char *filename, hypre_StructVector *vector, HYPRE_Int all ); hypre_StructVector *hypre_StructVectorRead ( MPI_Comm comm, const char *filename, HYPRE_Int *num_ghost ); hypre_StructVector *hypre_StructVectorClone ( hypre_StructVector *vector ); hypre-2.33.0/src/struct_mv/struct_axpy.c000066400000000000000000000045641477326011500203130ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * Structured axpy routine * *****************************************************************************/ #include "_hypre_struct_mv.h" #include "_hypre_struct_mv.hpp" /*-------------------------------------------------------------------------- * hypre_StructAxpy *--------------------------------------------------------------------------*/ HYPRE_Int hypre_StructAxpy( HYPRE_Complex alpha, hypre_StructVector *x, hypre_StructVector *y ) { hypre_Box *x_data_box; hypre_Box *y_data_box; HYPRE_Complex *xp; HYPRE_Complex *yp; hypre_BoxArray *boxes; hypre_Box *box; hypre_Index loop_size; hypre_IndexRef start; hypre_Index unit_stride; HYPRE_Int i; hypre_SetIndex(unit_stride, 1); boxes = hypre_StructGridBoxes(hypre_StructVectorGrid(y)); hypre_ForBoxI(i, boxes) { box = hypre_BoxArrayBox(boxes, i); start = hypre_BoxIMin(box); x_data_box = hypre_BoxArrayBox(hypre_StructVectorDataSpace(x), i); y_data_box = hypre_BoxArrayBox(hypre_StructVectorDataSpace(y), i); xp = hypre_StructVectorBoxData(x, i); yp = hypre_StructVectorBoxData(y, i); hypre_BoxGetSize(box, loop_size); #if 0 HYPRE_BOXLOOP ( hypre_BoxLoop2Begin, (hypre_StructVectorNDim(x), loop_size, x_data_box, start, unit_stride, xi, y_data_box, start, unit_stride, yi), { yp[yi] += alpha * xp[xi]; }, hypre_BoxLoop2End, (xi, yi) ) #else #define DEVICE_VAR is_device_ptr(yp,xp) hypre_BoxLoop2Begin(hypre_StructVectorNDim(x), loop_size, x_data_box, start, unit_stride, xi, y_data_box, start, unit_stride, yi); { yp[yi] += alpha * xp[xi]; } hypre_BoxLoop2End(xi, yi); #undef DEVICE_VAR #endif } return hypre_error_flag; } hypre-2.33.0/src/struct_mv/struct_communication.c000066400000000000000000001522561477326011500222010ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "_hypre_struct_mv.h" #include "_hypre_struct_mv.hpp" #define DEBUG 0 #if DEBUG char filename[255]; FILE *file; #endif /* this computes a (large enough) size (in doubles) for the message prefix */ #define hypre_CommPrefixSize(ne) \ ( (((1+ne)*sizeof(HYPRE_Int) + ne*sizeof(hypre_Box))/sizeof(HYPRE_Complex)) + 1 ) /*-------------------------------------------------------------------------- * Create a communication package. A grid-based description of a communication * exchange is passed in. This description is then compiled into an * intermediate processor-based description of the communication. The * intermediate processor-based description is used directly to pack and unpack * buffers during the communications. * * The 'orders' argument is dimension 'num_transforms' x 'num_values' and should * have a one-to-one correspondence with the transform data in 'comm_info'. * * If 'reverse' is > 0, then the meaning of send/recv is reversed * *--------------------------------------------------------------------------*/ HYPRE_Int hypre_CommPkgCreate( hypre_CommInfo *comm_info, hypre_BoxArray *send_data_space, hypre_BoxArray *recv_data_space, HYPRE_Int num_values, HYPRE_Int **orders, HYPRE_Int reverse, MPI_Comm comm, hypre_CommPkg **comm_pkg_ptr ) { HYPRE_Int ndim = hypre_CommInfoNDim(comm_info); hypre_BoxArrayArray *send_boxes; hypre_BoxArrayArray *recv_boxes; hypre_BoxArrayArray *send_rboxes; hypre_BoxArrayArray *recv_rboxes; hypre_IndexRef send_stride; hypre_IndexRef recv_stride; HYPRE_Int **send_processes; HYPRE_Int **recv_processes; HYPRE_Int **send_rboxnums; HYPRE_Int num_transforms; hypre_Index *coords; hypre_Index *dirs; HYPRE_Int **send_transforms; HYPRE_Int **cp_orders; hypre_CommPkg *comm_pkg; hypre_CommType *comm_types; hypre_CommType *comm_type; hypre_CommEntryType *ct_entries; HYPRE_Int *ct_rem_boxnums; hypre_Box *ct_rem_boxes; HYPRE_Int *comm_boxes_p, *comm_boxes_i, *comm_boxes_j; HYPRE_Int num_boxes, num_entries, num_comms, comm_bufsize; hypre_BoxArray *box_array; hypre_Box *box; hypre_BoxArray *rbox_array; hypre_Box *rbox; hypre_Box *data_box; HYPRE_Int *data_offsets; HYPRE_Int data_offset; hypre_IndexRef send_coord, send_dir; HYPRE_Int *send_order; HYPRE_Int i, j, k, p, m, size, p_old, my_proc; /*------------------------------------------------------ *------------------------------------------------------*/ if (reverse > 0) { /* reverse the meaning of send and recv */ send_boxes = hypre_CommInfoRecvBoxes(comm_info); recv_boxes = hypre_CommInfoSendBoxes(comm_info); send_stride = hypre_CommInfoRecvStride(comm_info); recv_stride = hypre_CommInfoSendStride(comm_info); send_processes = hypre_CommInfoRecvProcesses(comm_info); recv_processes = hypre_CommInfoSendProcesses(comm_info); send_rboxnums = hypre_CommInfoRecvRBoxnums(comm_info); send_rboxes = hypre_CommInfoRecvRBoxes(comm_info); recv_rboxes = hypre_CommInfoSendRBoxes(comm_info); send_transforms = hypre_CommInfoRecvTransforms(comm_info); /* may be NULL */ box_array = send_data_space; send_data_space = recv_data_space; recv_data_space = box_array; } else { send_boxes = hypre_CommInfoSendBoxes(comm_info); recv_boxes = hypre_CommInfoRecvBoxes(comm_info); send_stride = hypre_CommInfoSendStride(comm_info); recv_stride = hypre_CommInfoRecvStride(comm_info); send_processes = hypre_CommInfoSendProcesses(comm_info); recv_processes = hypre_CommInfoRecvProcesses(comm_info); send_rboxnums = hypre_CommInfoSendRBoxnums(comm_info); send_rboxes = hypre_CommInfoSendRBoxes(comm_info); recv_rboxes = hypre_CommInfoRecvRBoxes(comm_info); send_transforms = hypre_CommInfoSendTransforms(comm_info); /* may be NULL */ } num_transforms = hypre_CommInfoNumTransforms(comm_info); coords = hypre_CommInfoCoords(comm_info); /* may be NULL */ dirs = hypre_CommInfoDirs(comm_info); /* may be NULL */ hypre_MPI_Comm_rank(comm, &my_proc ); /*------------------------------------------------------ * Set up various entries in CommPkg *------------------------------------------------------*/ comm_pkg = hypre_CTAlloc(hypre_CommPkg, 1, HYPRE_MEMORY_HOST); hypre_CommPkgComm(comm_pkg) = comm; hypre_CommPkgFirstComm(comm_pkg) = 1; hypre_CommPkgNDim(comm_pkg) = ndim; hypre_CommPkgNumValues(comm_pkg) = num_values; hypre_CommPkgNumOrders(comm_pkg) = 0; hypre_CommPkgOrders(comm_pkg) = NULL; if ( (send_transforms != NULL) && (orders != NULL) ) { hypre_CommPkgNumOrders(comm_pkg) = num_transforms; cp_orders = hypre_TAlloc(HYPRE_Int *, num_transforms, HYPRE_MEMORY_HOST); for (i = 0; i < num_transforms; i++) { cp_orders[i] = hypre_TAlloc(HYPRE_Int, num_values, HYPRE_MEMORY_HOST); for (j = 0; j < num_values; j++) { cp_orders[i][j] = orders[i][j]; } } hypre_CommPkgOrders(comm_pkg) = cp_orders; } hypre_CopyIndex(send_stride, hypre_CommPkgSendStride(comm_pkg)); hypre_CopyIndex(recv_stride, hypre_CommPkgRecvStride(comm_pkg)); /* set identity transform and send_coord/dir/order if needed below */ hypre_CommPkgIdentityOrder(comm_pkg) = hypre_TAlloc(HYPRE_Int, num_values, HYPRE_MEMORY_HOST); send_coord = hypre_CommPkgIdentityCoord(comm_pkg); send_dir = hypre_CommPkgIdentityDir(comm_pkg); send_order = hypre_CommPkgIdentityOrder(comm_pkg); for (i = 0; i < ndim; i++) { hypre_IndexD(send_coord, i) = i; hypre_IndexD(send_dir, i) = 1; } for (i = 0; i < num_values; i++) { send_order[i] = i; } /*------------------------------------------------------ * Set up send CommType information *------------------------------------------------------*/ /* set data_offsets and compute num_boxes, num_entries */ data_offsets = hypre_TAlloc(HYPRE_Int, hypre_BoxArraySize(send_data_space), HYPRE_MEMORY_HOST); data_offset = 0; num_boxes = 0; num_entries = 0; hypre_ForBoxI(i, send_data_space) { data_offsets[i] = data_offset; data_box = hypre_BoxArrayBox(send_data_space, i); data_offset += hypre_BoxVolume(data_box) * num_values; /* RDF: This should always be true, but it's not for FAC. Find out why. */ if (i < hypre_BoxArrayArraySize(send_boxes)) { box_array = hypre_BoxArrayArrayBoxArray(send_boxes, i); num_boxes += hypre_BoxArraySize(box_array); hypre_ForBoxI(j, box_array) { box = hypre_BoxArrayBox(box_array, j); if (hypre_BoxVolume(box) != 0) { num_entries++; } } } } /* set up comm_boxes_[pij] */ comm_boxes_p = hypre_TAlloc(HYPRE_Int, num_boxes, HYPRE_MEMORY_HOST); comm_boxes_i = hypre_TAlloc(HYPRE_Int, num_boxes, HYPRE_MEMORY_HOST); comm_boxes_j = hypre_TAlloc(HYPRE_Int, num_boxes, HYPRE_MEMORY_HOST); num_boxes = 0; hypre_ForBoxArrayI(i, send_boxes) { box_array = hypre_BoxArrayArrayBoxArray(send_boxes, i); hypre_ForBoxI(j, box_array) { comm_boxes_p[num_boxes] = send_processes[i][j]; comm_boxes_i[num_boxes] = i; comm_boxes_j[num_boxes] = j; num_boxes++; } } hypre_qsort3i(comm_boxes_p, comm_boxes_i, comm_boxes_j, 0, num_boxes - 1); /* compute comm_types */ /* make sure there is at least 1 comm_type allocated */ comm_types = hypre_CTAlloc(hypre_CommType, (num_boxes + 1), HYPRE_MEMORY_HOST); ct_entries = hypre_TAlloc(hypre_CommEntryType, num_entries, HYPRE_MEMORY_HOST); ct_rem_boxnums = hypre_TAlloc(HYPRE_Int, num_entries, HYPRE_MEMORY_HOST); ct_rem_boxes = hypre_TAlloc(hypre_Box, num_entries, HYPRE_MEMORY_HOST); hypre_CommPkgEntries(comm_pkg) = ct_entries; hypre_CommPkgRemBoxnums(comm_pkg) = ct_rem_boxnums; hypre_CommPkgRemBoxes(comm_pkg) = ct_rem_boxes; p_old = -1; num_comms = 0; comm_bufsize = 0; comm_type = &comm_types[0]; for (m = 0; m < num_boxes; m++) { i = comm_boxes_i[m]; j = comm_boxes_j[m]; box_array = hypre_BoxArrayArrayBoxArray(send_boxes, i); rbox_array = hypre_BoxArrayArrayBoxArray(send_rboxes, i); box = hypre_BoxArrayBox(box_array, j); rbox = hypre_BoxArrayBox(rbox_array, j); if ((hypre_BoxVolume(box) != 0) && (hypre_BoxVolume(rbox) != 0)) { p = comm_boxes_p[m]; /* start a new comm_type */ if (p != p_old) { if (p != my_proc) { comm_type = &comm_types[num_comms + 1]; num_comms++; } else { comm_type = &comm_types[0]; } hypre_CommTypeProc(comm_type) = p; hypre_CommTypeBufsize(comm_type) = 0; hypre_CommTypeNumEntries(comm_type) = 0; hypre_CommTypeEntries(comm_type) = ct_entries; hypre_CommTypeRemBoxnums(comm_type) = ct_rem_boxnums; hypre_CommTypeRemBoxes(comm_type) = ct_rem_boxes; p_old = p; } k = hypre_CommTypeNumEntries(comm_type); hypre_BoxGetStrideVolume(box, send_stride, &size); hypre_CommTypeBufsize(comm_type) += (size * num_values); comm_bufsize += (size * num_values); rbox_array = hypre_BoxArrayArrayBoxArray(send_rboxes, i); data_box = hypre_BoxArrayBox(send_data_space, i); if (send_transforms != NULL) { send_coord = coords[send_transforms[i][j]]; send_dir = dirs[send_transforms[i][j]]; if (orders != NULL) { send_order = cp_orders[send_transforms[i][j]]; } } hypre_CommTypeSetEntry(box, send_stride, send_coord, send_dir, send_order, data_box, data_offsets[i], hypre_CommTypeEntry(comm_type, k)); hypre_CommTypeRemBoxnum(comm_type, k) = send_rboxnums[i][j]; hypre_CopyBox(hypre_BoxArrayBox(rbox_array, j), hypre_CommTypeRemBox(comm_type, k)); hypre_CommTypeNumEntries(comm_type) ++; ct_entries ++; ct_rem_boxnums ++; ct_rem_boxes ++; } } /* add space for prefix info */ for (m = 1; m < (num_comms + 1); m++) { comm_type = &comm_types[m]; k = hypre_CommTypeNumEntries(comm_type); size = hypre_CommPrefixSize(k); hypre_CommTypeBufsize(comm_type) += size; comm_bufsize += size; } /* set send info in comm_pkg */ comm_types = hypre_TReAlloc(comm_types, hypre_CommType, (num_comms + 1), HYPRE_MEMORY_HOST); hypre_CommPkgSendBufsize(comm_pkg) = comm_bufsize; hypre_CommPkgNumSends(comm_pkg) = num_comms; hypre_CommPkgSendTypes(comm_pkg) = &comm_types[1]; hypre_CommPkgCopyFromType(comm_pkg) = &comm_types[0]; /* free up data_offsets */ hypre_TFree(data_offsets, HYPRE_MEMORY_HOST); /*------------------------------------------------------ * Set up recv CommType information *------------------------------------------------------*/ /* set data_offsets and compute num_boxes */ data_offsets = hypre_TAlloc(HYPRE_Int, hypre_BoxArraySize(recv_data_space), HYPRE_MEMORY_HOST); data_offset = 0; num_boxes = 0; hypre_ForBoxI(i, recv_data_space) { data_offsets[i] = data_offset; data_box = hypre_BoxArrayBox(recv_data_space, i); data_offset += hypre_BoxVolume(data_box) * num_values; /* RDF: This should always be true, but it's not for FAC. Find out why. */ if (i < hypre_BoxArrayArraySize(recv_boxes)) { box_array = hypre_BoxArrayArrayBoxArray(recv_boxes, i); num_boxes += hypre_BoxArraySize(box_array); } } hypre_CommPkgRecvDataOffsets(comm_pkg) = data_offsets; hypre_CommPkgRecvDataSpace(comm_pkg) = hypre_BoxArrayDuplicate(recv_data_space); /* set up comm_boxes_[pij] */ comm_boxes_p = hypre_TReAlloc(comm_boxes_p, HYPRE_Int, num_boxes, HYPRE_MEMORY_HOST); comm_boxes_i = hypre_TReAlloc(comm_boxes_i, HYPRE_Int, num_boxes, HYPRE_MEMORY_HOST); comm_boxes_j = hypre_TReAlloc(comm_boxes_j, HYPRE_Int, num_boxes, HYPRE_MEMORY_HOST); num_boxes = 0; hypre_ForBoxArrayI(i, recv_boxes) { box_array = hypre_BoxArrayArrayBoxArray(recv_boxes, i); hypre_ForBoxI(j, box_array) { comm_boxes_p[num_boxes] = recv_processes[i][j]; comm_boxes_i[num_boxes] = i; comm_boxes_j[num_boxes] = j; num_boxes++; } } hypre_qsort3i(comm_boxes_p, comm_boxes_i, comm_boxes_j, 0, num_boxes - 1); /* compute comm_types */ /* make sure there is at least 1 comm_type allocated */ comm_types = hypre_CTAlloc(hypre_CommType, (num_boxes + 1), HYPRE_MEMORY_HOST); p_old = -1; num_comms = 0; comm_bufsize = 0; comm_type = &comm_types[0]; for (m = 0; m < num_boxes; m++) { i = comm_boxes_i[m]; j = comm_boxes_j[m]; box_array = hypre_BoxArrayArrayBoxArray(recv_boxes, i); rbox_array = hypre_BoxArrayArrayBoxArray(recv_rboxes, i); box = hypre_BoxArrayBox(box_array, j); rbox = hypre_BoxArrayBox(rbox_array, j); if ((hypre_BoxVolume(box) != 0) && (hypre_BoxVolume(rbox) != 0)) { p = comm_boxes_p[m]; /* start a new comm_type */ if (p != p_old) { if (p != my_proc) { comm_type = &comm_types[num_comms + 1]; num_comms++; } else { comm_type = &comm_types[0]; } hypre_CommTypeProc(comm_type) = p; hypre_CommTypeBufsize(comm_type) = 0; hypre_CommTypeNumEntries(comm_type) = 0; p_old = p; } k = hypre_CommTypeNumEntries(comm_type); hypre_BoxGetStrideVolume(box, recv_stride, &size); hypre_CommTypeBufsize(comm_type) += (size * num_values); comm_bufsize += (size * num_values); hypre_CommTypeNumEntries(comm_type) ++; } } /* add space for prefix info */ for (m = 1; m < (num_comms + 1); m++) { comm_type = &comm_types[m]; k = hypre_CommTypeNumEntries(comm_type); size = hypre_CommPrefixSize(k); hypre_CommTypeBufsize(comm_type) += size; comm_bufsize += size; } /* set recv info in comm_pkg */ comm_types = hypre_TReAlloc(comm_types, hypre_CommType, (num_comms + 1), HYPRE_MEMORY_HOST); hypre_CommPkgRecvBufsize(comm_pkg) = comm_bufsize; hypre_CommPkgNumRecvs(comm_pkg) = num_comms; hypre_CommPkgRecvTypes(comm_pkg) = &comm_types[1]; hypre_CommPkgCopyToType(comm_pkg) = &comm_types[0]; /* if CommInfo send/recv boxes don't match, compute a max bufsize */ if ( !hypre_CommInfoBoxesMatch(comm_info) ) { hypre_CommPkgRecvBufsize(comm_pkg) = 0; for (i = 0; i < hypre_CommPkgNumRecvs(comm_pkg); i++) { comm_type = hypre_CommPkgRecvType(comm_pkg, i); /* subtract off old (incorrect) prefix size */ num_entries = hypre_CommTypeNumEntries(comm_type); hypre_CommTypeBufsize(comm_type) -= hypre_CommPrefixSize(num_entries); /* set num_entries to number of grid points and add new prefix size */ num_entries = hypre_CommTypeBufsize(comm_type); hypre_CommTypeNumEntries(comm_type) = num_entries; size = hypre_CommPrefixSize(num_entries); hypre_CommTypeBufsize(comm_type) += size; hypre_CommPkgRecvBufsize(comm_pkg) += hypre_CommTypeBufsize(comm_type); } } hypre_CommPkgSendBufsizeFirstComm(comm_pkg) = hypre_CommPkgSendBufsize(comm_pkg); hypre_CommPkgRecvBufsizeFirstComm(comm_pkg) = hypre_CommPkgRecvBufsize(comm_pkg); /*------------------------------------------------------ * Debugging stuff - ONLY WORKS FOR 3D *------------------------------------------------------*/ #if DEBUG { hypre_MPI_Comm_rank(hypre_MPI_COMM_WORLD, &my_proc); hypre_sprintf(filename, "zcommboxes.%05d", my_proc); if ((file = fopen(filename, "a")) == NULL) { hypre_printf("Error: can't open output file %s\n", filename); exit(1); } hypre_fprintf(file, "\n\n============================\n\n"); hypre_fprintf(file, "SEND boxes:\n\n"); hypre_fprintf(file, "Stride = (%d,%d,%d)\n", hypre_IndexD(send_stride, 0), hypre_IndexD(send_stride, 1), hypre_IndexD(send_stride, 2)); hypre_fprintf(file, "BoxArrayArraySize = %d\n", hypre_BoxArrayArraySize(send_boxes)); hypre_ForBoxArrayI(i, send_boxes) { box_array = hypre_BoxArrayArrayBoxArray(send_boxes, i); hypre_fprintf(file, "BoxArraySize = %d\n", hypre_BoxArraySize(box_array)); hypre_ForBoxI(j, box_array) { box = hypre_BoxArrayBox(box_array, j); hypre_fprintf(file, "(%d,%d): (%d,%d,%d) x (%d,%d,%d)\n", i, j, hypre_BoxIMinD(box, 0), hypre_BoxIMinD(box, 1), hypre_BoxIMinD(box, 2), hypre_BoxIMaxD(box, 0), hypre_BoxIMaxD(box, 1), hypre_BoxIMaxD(box, 2)); hypre_fprintf(file, "(%d,%d): %d,%d\n", i, j, send_processes[i][j], send_rboxnums[i][j]); } } hypre_fprintf(file, "\n\n============================\n\n"); hypre_fprintf(file, "RECV boxes:\n\n"); hypre_fprintf(file, "Stride = (%d,%d,%d)\n", hypre_IndexD(recv_stride, 0), hypre_IndexD(recv_stride, 1), hypre_IndexD(recv_stride, 2)); hypre_fprintf(file, "BoxArrayArraySize = %d\n", hypre_BoxArrayArraySize(recv_boxes)); hypre_ForBoxArrayI(i, recv_boxes) { box_array = hypre_BoxArrayArrayBoxArray(recv_boxes, i); hypre_fprintf(file, "BoxArraySize = %d\n", hypre_BoxArraySize(box_array)); hypre_ForBoxI(j, box_array) { box = hypre_BoxArrayBox(box_array, j); hypre_fprintf(file, "(%d,%d): (%d,%d,%d) x (%d,%d,%d)\n", i, j, hypre_BoxIMinD(box, 0), hypre_BoxIMinD(box, 1), hypre_BoxIMinD(box, 2), hypre_BoxIMaxD(box, 0), hypre_BoxIMaxD(box, 1), hypre_BoxIMaxD(box, 2)); hypre_fprintf(file, "(%d,%d): %d\n", i, j, recv_processes[i][j]); } } fflush(file); fclose(file); } #endif #if DEBUG { hypre_CommEntryType *comm_entry; HYPRE_Int offset, dim; HYPRE_Int *length; HYPRE_Int *stride; hypre_MPI_Comm_rank(hypre_MPI_COMM_WORLD, &my_proc); hypre_sprintf(filename, "zcommentries.%05d", my_proc); if ((file = fopen(filename, "a")) == NULL) { hypre_printf("Error: can't open output file %s\n", filename); exit(1); } hypre_fprintf(file, "\n\n============================\n\n"); hypre_fprintf(file, "SEND entries:\n\n"); hypre_fprintf(file, "num_sends = %d\n", hypre_CommPkgNumSends(comm_pkg)); comm_types = hypre_CommPkgCopyFromType(comm_pkg); for (m = 0; m < (hypre_CommPkgNumSends(comm_pkg) + 1); m++) { comm_type = &comm_types[m]; hypre_fprintf(file, "process = %d\n", hypre_CommTypeProc(comm_type)); hypre_fprintf(file, "num_entries = %d\n", hypre_CommTypeNumEntries(comm_type)); for (i = 0; i < hypre_CommTypeNumEntries(comm_type); i++) { comm_entry = hypre_CommTypeEntry(comm_type, i); offset = hypre_CommEntryTypeOffset(comm_entry); dim = hypre_CommEntryTypeDim(comm_entry); length = hypre_CommEntryTypeLengthArray(comm_entry); stride = hypre_CommEntryTypeStrideArray(comm_entry); hypre_fprintf(file, "%d: %d,%d,(%d,%d,%d,%d),(%d,%d,%d,%d)\n", i, offset, dim, length[0], length[1], length[2], length[3], stride[0], stride[1], stride[2], stride[3]); } } hypre_fprintf(file, "\n\n============================\n\n"); hypre_fprintf(file, "RECV entries:\n\n"); hypre_fprintf(file, "num_recvs = %d\n", hypre_CommPkgNumRecvs(comm_pkg)); comm_types = hypre_CommPkgCopyToType(comm_pkg); comm_type = &comm_types[0]; hypre_fprintf(file, "process = %d\n", hypre_CommTypeProc(comm_type)); hypre_fprintf(file, "num_entries = %d\n", hypre_CommTypeNumEntries(comm_type)); for (i = 0; i < hypre_CommTypeNumEntries(comm_type); i++) { comm_entry = hypre_CommTypeEntry(comm_type, i); offset = hypre_CommEntryTypeOffset(comm_entry); dim = hypre_CommEntryTypeDim(comm_entry); length = hypre_CommEntryTypeLengthArray(comm_entry); stride = hypre_CommEntryTypeStrideArray(comm_entry); hypre_fprintf(file, "%d: %d,%d,(%d,%d,%d,%d),(%d,%d,%d,%d)\n", i, offset, dim, length[0], length[1], length[2], length[3], stride[0], stride[1], stride[2], stride[3]); } for (m = 1; m < (hypre_CommPkgNumRecvs(comm_pkg) + 1); m++) { comm_type = &comm_types[m]; hypre_fprintf(file, "process = %d\n", hypre_CommTypeProc(comm_type)); hypre_fprintf(file, "num_entries = %d\n", hypre_CommTypeNumEntries(comm_type)); } fflush(file); fclose(file); } #endif /*------------------------------------------------------ * Clean up *------------------------------------------------------*/ hypre_TFree(comm_boxes_p, HYPRE_MEMORY_HOST); hypre_TFree(comm_boxes_i, HYPRE_MEMORY_HOST); hypre_TFree(comm_boxes_j, HYPRE_MEMORY_HOST); *comm_pkg_ptr = comm_pkg; return hypre_error_flag; } /*-------------------------------------------------------------------------- * Note that this routine assumes an identity coordinate transform *--------------------------------------------------------------------------*/ HYPRE_Int hypre_CommTypeSetEntries( hypre_CommType *comm_type, HYPRE_Int *boxnums, hypre_Box *boxes, hypre_Index stride, hypre_Index coord, hypre_Index dir, HYPRE_Int *order, hypre_BoxArray *data_space, HYPRE_Int *data_offsets ) { HYPRE_Int num_entries = hypre_CommTypeNumEntries(comm_type); hypre_CommEntryType *entries = hypre_CommTypeEntries(comm_type); hypre_Box *box; hypre_Box *data_box; HYPRE_Int i, j; for (j = 0; j < num_entries; j++) { i = boxnums[j]; box = &boxes[j]; data_box = hypre_BoxArrayBox(data_space, i); hypre_CommTypeSetEntry(box, stride, coord, dir, order, data_box, data_offsets[i], &entries[j]); } return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_CommTypeSetEntry( hypre_Box *box, hypre_Index stride, hypre_Index coord, hypre_Index dir, HYPRE_Int *order, hypre_Box *data_box, HYPRE_Int data_box_offset, hypre_CommEntryType *comm_entry ) { HYPRE_Int dim, ndim = hypre_BoxNDim(box); HYPRE_Int offset; HYPRE_Int *length_array, tmp_length_array[HYPRE_MAXDIM]; HYPRE_Int *stride_array, tmp_stride_array[HYPRE_MAXDIM]; hypre_Index size; HYPRE_Int i, j; length_array = hypre_CommEntryTypeLengthArray(comm_entry); stride_array = hypre_CommEntryTypeStrideArray(comm_entry); /* initialize offset */ offset = data_box_offset + hypre_BoxIndexRank(data_box, hypre_BoxIMin(box)); /* initialize length_array and stride_array */ hypre_BoxGetStrideSize(box, stride, size); for (i = 0; i < ndim; i++) { length_array[i] = hypre_IndexD(size, i); stride_array[i] = hypre_IndexD(stride, i); for (j = 0; j < i; j++) { stride_array[i] *= hypre_BoxSizeD(data_box, j); } } stride_array[ndim] = hypre_BoxVolume(data_box); /* make adjustments for dir */ for (i = 0; i < ndim; i++) { if (dir[i] < 0) { offset += (length_array[i] - 1) * stride_array[i]; stride_array[i] = -stride_array[i]; } } /* make adjustments for coord */ for (i = 0; i < ndim; i++) { tmp_length_array[i] = length_array[i]; tmp_stride_array[i] = stride_array[i]; } for (i = 0; i < ndim; i++) { j = coord[i]; length_array[j] = tmp_length_array[i]; stride_array[j] = tmp_stride_array[i]; } /* eliminate dimensions with length_array = 1 */ dim = ndim; i = 0; while (i < dim) { if (length_array[i] == 1) { for (j = i; j < (dim - 1); j++) { length_array[j] = length_array[j + 1]; stride_array[j] = stride_array[j + 1]; } length_array[dim - 1] = 1; stride_array[dim - 1] = 1; dim--; } else { i++; } } #if 0 /* sort the array according to length_array (largest to smallest) */ for (i = (dim - 1); i > 0; i--) { for (j = 0; j < i; j++) { if (length_array[j] < length_array[j + 1]) { i_tmp = length_array[j]; length_array[j] = length_array[j + 1]; length_array[j + 1] = i_tmp; i_tmp = stride_array[j]; stride_array[j] = stride_array[j + 1]; stride_array[j + 1] = i_tmp; } } } #endif /* if every len was 1 we need to fix to communicate at least one */ if (!dim) { dim = 1; } hypre_CommEntryTypeOffset(comm_entry) = offset; hypre_CommEntryTypeDim(comm_entry) = dim; hypre_CommEntryTypeOrder(comm_entry) = order; return hypre_error_flag; } HYPRE_Complex * hypre_StructCommunicationGetBuffer(HYPRE_MemoryLocation memory_location, HYPRE_Int size) { HYPRE_Complex *ptr; #if defined(HYPRE_USING_GPU) || defined(HYPRE_USING_DEVICE_OPENMP) if (hypre_GetActualMemLocation(memory_location) != hypre_MEMORY_HOST) { if (size > hypre_HandleStructCommSendBufferSize(hypre_handle())) { HYPRE_Int new_size = 5 * size; hypre_HandleStructCommSendBufferSize(hypre_handle()) = new_size; hypre_TFree(hypre_HandleStructCommSendBuffer(hypre_handle()), memory_location); hypre_HandleStructCommSendBuffer(hypre_handle()) = hypre_CTAlloc(HYPRE_Complex, new_size, memory_location); } ptr = hypre_HandleStructCommSendBuffer(hypre_handle()); } else #endif { ptr = hypre_CTAlloc(HYPRE_Complex, size, memory_location); } return ptr; } HYPRE_Int hypre_StructCommunicationReleaseBuffer(HYPRE_Complex *buffer, HYPRE_MemoryLocation memory_location) { if (hypre_GetActualMemLocation(memory_location) == hypre_MEMORY_HOST) { hypre_TFree(buffer, memory_location); } return hypre_error_flag; } /*-------------------------------------------------------------------------- * Initialize a non-blocking communication exchange. * * The communication buffers are created, the send buffer is manually * packed, and the communication requests are posted. * * Different "actions" are possible when the buffer data is unpacked: * action = 0 - copy the data over existing values in memory * action = 1 - add the data to existing values in memory *--------------------------------------------------------------------------*/ HYPRE_Int hypre_InitializeCommunication( hypre_CommPkg *comm_pkg, HYPRE_Complex *send_data, HYPRE_Complex *recv_data, HYPRE_Int action, HYPRE_Int tag, hypre_CommHandle **comm_handle_ptr ) { hypre_CommHandle *comm_handle; HYPRE_Int ndim = hypre_CommPkgNDim(comm_pkg); HYPRE_Int num_values = hypre_CommPkgNumValues(comm_pkg); HYPRE_Int num_sends = hypre_CommPkgNumSends(comm_pkg); HYPRE_Int num_recvs = hypre_CommPkgNumRecvs(comm_pkg); MPI_Comm comm = hypre_CommPkgComm(comm_pkg); HYPRE_Int num_requests; hypre_MPI_Request *requests; hypre_MPI_Status *status; HYPRE_Complex **send_buffers; HYPRE_Complex **recv_buffers; HYPRE_Complex **send_buffers_mpi; HYPRE_Complex **recv_buffers_mpi; hypre_CommType *comm_type, *from_type, *to_type; hypre_CommEntryType *comm_entry; HYPRE_Int num_entries; HYPRE_Int *length_array; HYPRE_Int *stride_array, unitst_array[HYPRE_MAXDIM + 1]; HYPRE_Int *order; HYPRE_Complex *dptr, *kptr, *lptr; HYPRE_Int *qptr; HYPRE_Int i, j, d, ll; HYPRE_Int size; HYPRE_MemoryLocation memory_location = hypre_HandleMemoryLocation(hypre_handle()); HYPRE_MemoryLocation memory_location_mpi = memory_location; /*-------------------------------------------------------------------- * allocate requests and status *--------------------------------------------------------------------*/ num_requests = num_sends + num_recvs; requests = hypre_CTAlloc(hypre_MPI_Request, num_requests, HYPRE_MEMORY_HOST); status = hypre_CTAlloc(hypre_MPI_Status, num_requests, HYPRE_MEMORY_HOST); /*-------------------------------------------------------------------- * allocate buffers *--------------------------------------------------------------------*/ /* allocate send buffers */ send_buffers = hypre_TAlloc(HYPRE_Complex *, num_sends, HYPRE_MEMORY_HOST); if (num_sends > 0) { size = hypre_CommPkgSendBufsize(comm_pkg); send_buffers[0] = hypre_StructCommunicationGetBuffer(memory_location, size); for (i = 1; i < num_sends; i++) { comm_type = hypre_CommPkgSendType(comm_pkg, i - 1); size = hypre_CommTypeBufsize(comm_type); send_buffers[i] = send_buffers[i - 1] + size; } } /* allocate recv buffers */ recv_buffers = hypre_TAlloc(HYPRE_Complex *, num_recvs, HYPRE_MEMORY_HOST); if (num_recvs > 0) { size = hypre_CommPkgRecvBufsize(comm_pkg); recv_buffers[0] = hypre_StructCommunicationGetBuffer(memory_location, size); for (i = 1; i < num_recvs; i++) { comm_type = hypre_CommPkgRecvType(comm_pkg, i - 1); size = hypre_CommTypeBufsize(comm_type); recv_buffers[i] = recv_buffers[i - 1] + size; } } /*-------------------------------------------------------------------- * pack send buffers *--------------------------------------------------------------------*/ for (i = 0; i < num_sends; i++) { comm_type = hypre_CommPkgSendType(comm_pkg, i); num_entries = hypre_CommTypeNumEntries(comm_type); dptr = (HYPRE_Complex *) send_buffers[i]; if ( hypre_CommPkgFirstComm(comm_pkg) ) { dptr += hypre_CommPrefixSize(num_entries); } for (j = 0; j < num_entries; j++) { comm_entry = hypre_CommTypeEntry(comm_type, j); length_array = hypre_CommEntryTypeLengthArray(comm_entry); stride_array = hypre_CommEntryTypeStrideArray(comm_entry); order = hypre_CommEntryTypeOrder(comm_entry); unitst_array[0] = 1; for (d = 1; d <= ndim; d++) { unitst_array[d] = unitst_array[d - 1] * length_array[d - 1]; } lptr = send_data + hypre_CommEntryTypeOffset(comm_entry); for (ll = 0; ll < num_values; ll++) { if (order[ll] > -1) { kptr = lptr + order[ll] * stride_array[ndim]; #define DEVICE_VAR is_device_ptr(dptr,kptr) hypre_BasicBoxLoop2Begin(ndim, length_array, stride_array, ki, unitst_array, di); { dptr[di] = kptr[ki]; } hypre_BoxLoop2End(ki, di); #undef DEVICE_VAR dptr += unitst_array[ndim]; } else { size = 1; for (d = 0; d < ndim; d++) { size *= length_array[d]; } hypre_Memset(dptr, 0, size * sizeof(HYPRE_Complex), memory_location); dptr += size; } } } } #if defined(HYPRE_USING_GPU) || defined(HYPRE_USING_DEVICE_OPENMP) if (hypre_GetActualMemLocation(memory_location) != hypre_MEMORY_HOST) { if (hypre_GetGpuAwareMPI()) { #if defined(HYPRE_USING_GPU) hypre_ForceSyncComputeStream(); #endif send_buffers_mpi = send_buffers; recv_buffers_mpi = recv_buffers; } else { memory_location_mpi = HYPRE_MEMORY_HOST; send_buffers_mpi = hypre_TAlloc(HYPRE_Complex *, num_sends, HYPRE_MEMORY_HOST); if (num_sends > 0) { size = hypre_CommPkgSendBufsize(comm_pkg); send_buffers_mpi[0] = hypre_CTAlloc(HYPRE_Complex, size, memory_location_mpi); for (i = 1; i < num_sends; i++) { send_buffers_mpi[i] = send_buffers_mpi[i - 1] + (send_buffers[i] - send_buffers[i - 1]); } hypre_TMemcpy(send_buffers_mpi[0], send_buffers[0], HYPRE_Complex, size, HYPRE_MEMORY_HOST, memory_location); } recv_buffers_mpi = hypre_TAlloc(HYPRE_Complex *, num_recvs, HYPRE_MEMORY_HOST); if (num_recvs > 0) { size = hypre_CommPkgRecvBufsize(comm_pkg); recv_buffers_mpi[0] = hypre_CTAlloc(HYPRE_Complex, size, memory_location_mpi); for (i = 1; i < num_recvs; i++) { recv_buffers_mpi[i] = recv_buffers_mpi[i - 1] + (recv_buffers[i] - recv_buffers[i - 1]); } } } } else #endif { send_buffers_mpi = send_buffers; recv_buffers_mpi = recv_buffers; } for (i = 0; i < num_sends; i++) { comm_type = hypre_CommPkgSendType(comm_pkg, i); num_entries = hypre_CommTypeNumEntries(comm_type); if ( hypre_CommPkgFirstComm(comm_pkg) ) { qptr = (HYPRE_Int *) send_buffers_mpi[i]; hypre_TMemcpy(qptr, &num_entries, HYPRE_Int, 1, memory_location_mpi, HYPRE_MEMORY_HOST); qptr ++; hypre_TMemcpy(qptr, hypre_CommTypeRemBoxnums(comm_type), HYPRE_Int, num_entries, memory_location_mpi, HYPRE_MEMORY_HOST); qptr += num_entries; hypre_TMemcpy(qptr, hypre_CommTypeRemBoxes(comm_type), hypre_Box, num_entries, memory_location_mpi, HYPRE_MEMORY_HOST); hypre_CommTypeRemBoxnums(comm_type) = NULL; hypre_CommTypeRemBoxes(comm_type) = NULL; } } /*-------------------------------------------------------------------- * post receives and initiate sends *--------------------------------------------------------------------*/ j = 0; for (i = 0; i < num_recvs; i++) { comm_type = hypre_CommPkgRecvType(comm_pkg, i); hypre_MPI_Irecv(recv_buffers_mpi[i], hypre_CommTypeBufsize(comm_type)*sizeof(HYPRE_Complex), hypre_MPI_BYTE, hypre_CommTypeProc(comm_type), tag, comm, &requests[j++]); if ( hypre_CommPkgFirstComm(comm_pkg) ) { size = hypre_CommPrefixSize(hypre_CommTypeNumEntries(comm_type)); hypre_CommTypeBufsize(comm_type) -= size; hypre_CommPkgRecvBufsize(comm_pkg) -= size; } } for (i = 0; i < num_sends; i++) { comm_type = hypre_CommPkgSendType(comm_pkg, i); hypre_MPI_Isend(send_buffers_mpi[i], hypre_CommTypeBufsize(comm_type)*sizeof(HYPRE_Complex), hypre_MPI_BYTE, hypre_CommTypeProc(comm_type), tag, comm, &requests[j++]); if ( hypre_CommPkgFirstComm(comm_pkg) ) { size = hypre_CommPrefixSize(hypre_CommTypeNumEntries(comm_type)); hypre_CommTypeBufsize(comm_type) -= size; hypre_CommPkgSendBufsize(comm_pkg) -= size; } } /*-------------------------------------------------------------------- * set up CopyToType and exchange local data *--------------------------------------------------------------------*/ if ( hypre_CommPkgFirstComm(comm_pkg) ) { from_type = hypre_CommPkgCopyFromType(comm_pkg); to_type = hypre_CommPkgCopyToType(comm_pkg); num_entries = hypre_CommTypeNumEntries(from_type); hypre_CommTypeNumEntries(to_type) = num_entries; hypre_CommTypeEntries(to_type) = hypre_TAlloc(hypre_CommEntryType, num_entries, HYPRE_MEMORY_HOST); hypre_CommTypeSetEntries(to_type, hypre_CommTypeRemBoxnums(from_type), hypre_CommTypeRemBoxes(from_type), hypre_CommPkgRecvStride(comm_pkg), hypre_CommPkgIdentityCoord(comm_pkg), hypre_CommPkgIdentityDir(comm_pkg), hypre_CommPkgIdentityOrder(comm_pkg), hypre_CommPkgRecvDataSpace(comm_pkg), hypre_CommPkgRecvDataOffsets(comm_pkg)); hypre_TFree(hypre_CommPkgRemBoxnums(comm_pkg), HYPRE_MEMORY_HOST); hypre_TFree(hypre_CommPkgRemBoxes(comm_pkg), HYPRE_MEMORY_HOST); } hypre_ExchangeLocalData(comm_pkg, send_data, recv_data, action); /*-------------------------------------------------------------------- * set up comm_handle and return *--------------------------------------------------------------------*/ comm_handle = hypre_TAlloc(hypre_CommHandle, 1, HYPRE_MEMORY_HOST); hypre_CommHandleCommPkg(comm_handle) = comm_pkg; hypre_CommHandleSendData(comm_handle) = send_data; hypre_CommHandleRecvData(comm_handle) = recv_data; hypre_CommHandleNumRequests(comm_handle) = num_requests; hypre_CommHandleRequests(comm_handle) = requests; hypre_CommHandleStatus(comm_handle) = status; hypre_CommHandleSendBuffers(comm_handle) = send_buffers; hypre_CommHandleRecvBuffers(comm_handle) = recv_buffers; hypre_CommHandleAction(comm_handle) = action; hypre_CommHandleSendBuffersMPI(comm_handle) = send_buffers_mpi; hypre_CommHandleRecvBuffersMPI(comm_handle) = recv_buffers_mpi; *comm_handle_ptr = comm_handle; return hypre_error_flag; } /*-------------------------------------------------------------------------- * Finalize a communication exchange. This routine blocks until all * of the communication requests are completed. * * The communication requests are completed, and the receive buffer is * manually unpacked. *--------------------------------------------------------------------------*/ HYPRE_Int hypre_FinalizeCommunication( hypre_CommHandle *comm_handle ) { hypre_CommPkg *comm_pkg = hypre_CommHandleCommPkg(comm_handle); HYPRE_Complex **send_buffers = hypre_CommHandleSendBuffers(comm_handle); HYPRE_Complex **recv_buffers = hypre_CommHandleRecvBuffers(comm_handle); HYPRE_Complex **send_buffers_mpi = hypre_CommHandleSendBuffersMPI(comm_handle); HYPRE_Complex **recv_buffers_mpi = hypre_CommHandleRecvBuffersMPI(comm_handle); HYPRE_Int action = hypre_CommHandleAction(comm_handle); HYPRE_Int ndim = hypre_CommPkgNDim(comm_pkg); HYPRE_Int num_values = hypre_CommPkgNumValues(comm_pkg); HYPRE_Int num_sends = hypre_CommPkgNumSends(comm_pkg); HYPRE_Int num_recvs = hypre_CommPkgNumRecvs(comm_pkg); hypre_CommType *comm_type; hypre_CommEntryType *comm_entry; HYPRE_Int num_entries; HYPRE_Int *length_array; HYPRE_Int *stride_array, unitst_array[HYPRE_MAXDIM + 1]; HYPRE_Complex *kptr, *lptr; HYPRE_Complex *dptr; HYPRE_Int *qptr; HYPRE_Int *boxnums; hypre_Box *boxes; HYPRE_Int i, j, d, ll; HYPRE_MemoryLocation memory_location = hypre_HandleMemoryLocation(hypre_handle()); HYPRE_MemoryLocation memory_location_mpi = memory_location; #if defined(HYPRE_USING_GPU) || defined(HYPRE_USING_DEVICE_OPENMP) if (!hypre_GetGpuAwareMPI()) { memory_location_mpi = HYPRE_MEMORY_HOST; } #endif /*-------------------------------------------------------------------- * finish communications *--------------------------------------------------------------------*/ if (hypre_CommHandleNumRequests(comm_handle)) { hypre_MPI_Waitall(hypre_CommHandleNumRequests(comm_handle), hypre_CommHandleRequests(comm_handle), hypre_CommHandleStatus(comm_handle)); } /*-------------------------------------------------------------------- * if FirstComm, unpack prefix information and set 'num_entries' and * 'entries' for RecvType *--------------------------------------------------------------------*/ if ( hypre_CommPkgFirstComm(comm_pkg) ) { hypre_CommEntryType *ct_entries; num_entries = 0; for (i = 0; i < num_recvs; i++) { comm_type = hypre_CommPkgRecvType(comm_pkg, i); qptr = (HYPRE_Int *) recv_buffers_mpi[i]; hypre_TMemcpy(&hypre_CommTypeNumEntries(comm_type), qptr, HYPRE_Int, 1, HYPRE_MEMORY_HOST, memory_location_mpi); num_entries += hypre_CommTypeNumEntries(comm_type); } /* allocate CommType entries 'ct_entries' */ ct_entries = hypre_TAlloc(hypre_CommEntryType, num_entries, HYPRE_MEMORY_HOST); /* unpack prefix information and set RecvType entries */ for (i = 0; i < num_recvs; i++) { comm_type = hypre_CommPkgRecvType(comm_pkg, i); /* Assign the entries to the comm_type */ hypre_CommTypeEntries(comm_type) = ct_entries; num_entries = hypre_CommTypeNumEntries(comm_type); ct_entries += num_entries; qptr = (HYPRE_Int *) recv_buffers_mpi[i]; qptr++; /* Set boxnums and boxes from MPI recv buffer */ if (!hypre_GetGpuAwareMPI()) { boxnums = (HYPRE_Int*) qptr; qptr += num_entries; boxes = (hypre_Box*) qptr; } else { boxnums = hypre_TAlloc(HYPRE_Int, num_entries, HYPRE_MEMORY_HOST); hypre_TMemcpy(boxnums, qptr, HYPRE_Int, num_entries, HYPRE_MEMORY_HOST, memory_location_mpi); qptr += num_entries; boxes = hypre_TAlloc(hypre_Box, num_entries, HYPRE_MEMORY_HOST); hypre_TMemcpy(boxes, qptr, hypre_Box, num_entries, HYPRE_MEMORY_HOST, memory_location_mpi); } /* Set the entries for the comm_type */ hypre_CommTypeSetEntries(comm_type, boxnums, boxes, hypre_CommPkgRecvStride(comm_pkg), hypre_CommPkgIdentityCoord(comm_pkg), hypre_CommPkgIdentityDir(comm_pkg), hypre_CommPkgIdentityOrder(comm_pkg), hypre_CommPkgRecvDataSpace(comm_pkg), hypre_CommPkgRecvDataOffsets(comm_pkg)); /* Free allocated memory if using GPU-aware MPI */ if (hypre_GetGpuAwareMPI()) { hypre_TFree(boxnums, HYPRE_MEMORY_HOST); hypre_TFree(boxes, HYPRE_MEMORY_HOST); } } } /*-------------------------------------------------------------------- * unpack receive buffer data *--------------------------------------------------------------------*/ /* Note: hypre_CommPkgRecvBufsize is different in the first comm */ if (recv_buffers != recv_buffers_mpi) { if (num_recvs > 0) { HYPRE_Int recv_buf_size; recv_buf_size = hypre_CommPkgFirstComm(comm_pkg) ? hypre_CommPkgRecvBufsizeFirstComm(comm_pkg) : hypre_CommPkgRecvBufsize(comm_pkg); hypre_TMemcpy(recv_buffers[0], recv_buffers_mpi[0], HYPRE_Complex, recv_buf_size, memory_location, memory_location_mpi); } } for (i = 0; i < num_recvs; i++) { comm_type = hypre_CommPkgRecvType(comm_pkg, i); num_entries = hypre_CommTypeNumEntries(comm_type); dptr = (HYPRE_Complex *) recv_buffers[i]; if ( hypre_CommPkgFirstComm(comm_pkg) ) { dptr += hypre_CommPrefixSize(num_entries); } for (j = 0; j < num_entries; j++) { comm_entry = hypre_CommTypeEntry(comm_type, j); length_array = hypre_CommEntryTypeLengthArray(comm_entry); stride_array = hypre_CommEntryTypeStrideArray(comm_entry); unitst_array[0] = 1; for (d = 1; d <= ndim; d++) { unitst_array[d] = unitst_array[d - 1] * length_array[d - 1]; } lptr = hypre_CommHandleRecvData(comm_handle) + hypre_CommEntryTypeOffset(comm_entry); for (ll = 0; ll < num_values; ll++) { kptr = lptr + ll * stride_array[ndim]; #define DEVICE_VAR is_device_ptr(kptr,dptr) hypre_BasicBoxLoop2Begin(ndim, length_array, stride_array, ki, unitst_array, di); { if (action > 0) { kptr[ki] += dptr[di]; } else { kptr[ki] = dptr[di]; } } hypre_BoxLoop2End(ki, di); #undef DEVICE_VAR dptr += unitst_array[ndim]; } } } /*-------------------------------------------------------------------- * turn off first communication indicator *--------------------------------------------------------------------*/ hypre_CommPkgFirstComm(comm_pkg) = 0; /*-------------------------------------------------------------------- * Free up communication handle *--------------------------------------------------------------------*/ hypre_TFree(hypre_CommHandleRequests(comm_handle), HYPRE_MEMORY_HOST); hypre_TFree(hypre_CommHandleStatus(comm_handle), HYPRE_MEMORY_HOST); if (num_sends > 0) { hypre_StructCommunicationReleaseBuffer(send_buffers[0], memory_location); } if (num_recvs > 0) { hypre_StructCommunicationReleaseBuffer(recv_buffers[0], memory_location); } hypre_TFree(comm_handle, HYPRE_MEMORY_HOST); if (send_buffers != send_buffers_mpi) { hypre_TFree(send_buffers_mpi[0], memory_location_mpi); hypre_TFree(send_buffers_mpi, HYPRE_MEMORY_HOST); } if (recv_buffers != recv_buffers_mpi) { hypre_TFree(recv_buffers_mpi[0], memory_location_mpi); hypre_TFree(recv_buffers_mpi, HYPRE_MEMORY_HOST); } hypre_TFree(send_buffers, HYPRE_MEMORY_HOST); hypre_TFree(recv_buffers, HYPRE_MEMORY_HOST); return hypre_error_flag; } /*-------------------------------------------------------------------------- * Execute local data exchanges. *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ExchangeLocalData( hypre_CommPkg *comm_pkg, HYPRE_Complex *send_data, HYPRE_Complex *recv_data, HYPRE_Int action ) { HYPRE_Int ndim = hypre_CommPkgNDim(comm_pkg); HYPRE_Int num_values = hypre_CommPkgNumValues(comm_pkg); hypre_CommType *copy_fr_type; hypre_CommType *copy_to_type; hypre_CommEntryType *copy_fr_entry; hypre_CommEntryType *copy_to_entry; HYPRE_Complex *fr_dp; HYPRE_Int *fr_stride_array; HYPRE_Complex *to_dp; HYPRE_Int *to_stride_array; HYPRE_Complex *fr_dpl, *to_dpl; HYPRE_Int *length_array; HYPRE_Int i, ll; HYPRE_Int *order; /*-------------------------------------------------------------------- * copy local data *--------------------------------------------------------------------*/ copy_fr_type = hypre_CommPkgCopyFromType(comm_pkg); copy_to_type = hypre_CommPkgCopyToType(comm_pkg); for (i = 0; i < hypre_CommTypeNumEntries(copy_fr_type); i++) { copy_fr_entry = hypre_CommTypeEntry(copy_fr_type, i); copy_to_entry = hypre_CommTypeEntry(copy_to_type, i); fr_dp = send_data + hypre_CommEntryTypeOffset(copy_fr_entry); to_dp = recv_data + hypre_CommEntryTypeOffset(copy_to_entry); /* copy data only when necessary */ if (to_dp != fr_dp) { length_array = hypre_CommEntryTypeLengthArray(copy_fr_entry); fr_stride_array = hypre_CommEntryTypeStrideArray(copy_fr_entry); to_stride_array = hypre_CommEntryTypeStrideArray(copy_to_entry); order = hypre_CommEntryTypeOrder(copy_fr_entry); for (ll = 0; ll < num_values; ll++) { if (order[ll] > -1) { fr_dpl = fr_dp + (order[ll]) * fr_stride_array[ndim]; to_dpl = to_dp + ( ll ) * to_stride_array[ndim]; #define DEVICE_VAR is_device_ptr(to_dpl,fr_dpl) hypre_BasicBoxLoop2Begin(ndim, length_array, fr_stride_array, fi, to_stride_array, ti); { if (action > 0) { /* add the data to existing values in memory */ to_dpl[ti] += fr_dpl[fi]; } else { /* copy the data over existing values in memory */ to_dpl[ti] = fr_dpl[fi]; } } hypre_BoxLoop2End(fi, ti); #undef DEVICE_VAR } } } } return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_CommPkgDestroy( hypre_CommPkg *comm_pkg ) { hypre_CommType *comm_type; HYPRE_Int **orders; HYPRE_Int i; if (comm_pkg) { /* note that entries are allocated in two stages for To/Recv */ if (hypre_CommPkgNumRecvs(comm_pkg) > 0) { comm_type = hypre_CommPkgRecvType(comm_pkg, 0); hypre_TFree(hypre_CommTypeEntries(comm_type), HYPRE_MEMORY_HOST); } comm_type = hypre_CommPkgCopyToType(comm_pkg); hypre_TFree(hypre_CommTypeEntries(comm_type), HYPRE_MEMORY_HOST); hypre_TFree(comm_type, HYPRE_MEMORY_HOST); comm_type = hypre_CommPkgCopyFromType(comm_pkg); hypre_TFree(comm_type, HYPRE_MEMORY_HOST); hypre_TFree(hypre_CommPkgEntries(comm_pkg), HYPRE_MEMORY_HOST); hypre_TFree(hypre_CommPkgRemBoxnums(comm_pkg), HYPRE_MEMORY_HOST); hypre_TFree(hypre_CommPkgRemBoxes(comm_pkg), HYPRE_MEMORY_HOST); hypre_TFree(hypre_CommPkgRecvDataOffsets(comm_pkg), HYPRE_MEMORY_HOST); hypre_BoxArrayDestroy(hypre_CommPkgRecvDataSpace(comm_pkg)); orders = hypre_CommPkgOrders(comm_pkg); for (i = 0; i < hypre_CommPkgNumOrders(comm_pkg); i++) { hypre_TFree(orders[i], HYPRE_MEMORY_HOST); } hypre_TFree(orders, HYPRE_MEMORY_HOST); hypre_TFree(hypre_CommPkgIdentityOrder(comm_pkg), HYPRE_MEMORY_HOST); hypre_TFree(comm_pkg, HYPRE_MEMORY_HOST); } return hypre_error_flag; } hypre-2.33.0/src/struct_mv/struct_communication.h000066400000000000000000000270511477326011500222000ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #ifndef hypre_COMMUNICATION_HEADER #define hypre_COMMUNICATION_HEADER /*-------------------------------------------------------------------------- * hypre_CommInfo: * * For "reverse" communication, send_transforms is not needed (may be NULL). * For "forward" communication, recv_transforms is not needed (may be NULL). *--------------------------------------------------------------------------*/ typedef struct hypre_CommInfo_struct { HYPRE_Int ndim; hypre_BoxArrayArray *send_boxes; hypre_Index send_stride; HYPRE_Int **send_processes; HYPRE_Int **send_rboxnums; hypre_BoxArrayArray *send_rboxes; /* send_boxes, some with periodic shift */ hypre_BoxArrayArray *recv_boxes; hypre_Index recv_stride; HYPRE_Int **recv_processes; HYPRE_Int **recv_rboxnums; hypre_BoxArrayArray *recv_rboxes; /* recv_boxes, some with periodic shift */ HYPRE_Int num_transforms; /* may be 0 = identity transform */ hypre_Index *coords; /* may be NULL = identity transform */ hypre_Index *dirs; /* may be NULL = identity transform */ HYPRE_Int **send_transforms; /* may be NULL = identity transform */ HYPRE_Int **recv_transforms; /* may be NULL = identity transform */ HYPRE_Int boxes_match; /* true (>0) if each send box has a * matching box on the recv processor */ } hypre_CommInfo; /*-------------------------------------------------------------------------- * hypre_CommEntryType: *--------------------------------------------------------------------------*/ typedef struct hypre_CommEntryType_struct { HYPRE_Int offset; /* offset for the data */ HYPRE_Int dim; /* dimension of the communication */ HYPRE_Int length_array[HYPRE_MAXDIM]; /* last dim has length num_values */ HYPRE_Int stride_array[HYPRE_MAXDIM + 1]; HYPRE_Int *order; /* order of last dim values */ } hypre_CommEntryType; /*-------------------------------------------------------------------------- * hypre_CommType: *--------------------------------------------------------------------------*/ typedef struct hypre_CommType_struct { HYPRE_Int proc; HYPRE_Int bufsize; /* message buffer size (in doubles) */ HYPRE_Int num_entries; hypre_CommEntryType *entries; /* this is only needed until first send buffer prefix is packed */ HYPRE_Int *rem_boxnums; /* entry remote box numbers */ hypre_Box *rem_boxes; /* entry remote boxes */ } hypre_CommType; /*-------------------------------------------------------------------------- * hypre_CommPkg: * Structure containing information for doing communications *--------------------------------------------------------------------------*/ typedef struct hypre_CommPkg_struct { MPI_Comm comm; /* is this the first communication? */ HYPRE_Int first_comm; HYPRE_Int ndim; HYPRE_Int num_values; hypre_Index send_stride; hypre_Index recv_stride; /* total send buffer size (in doubles) */ HYPRE_Int send_bufsize; /* total recv buffer size (in doubles) */ HYPRE_Int recv_bufsize; /* total send buffer size (in doubles) at the first comm. */ HYPRE_Int send_bufsize_first_comm; /* total recv buffer size (in doubles) at the first comm. */ HYPRE_Int recv_bufsize_first_comm; HYPRE_Int num_sends; HYPRE_Int num_recvs; hypre_CommType *send_types; hypre_CommType *recv_types; hypre_CommType *copy_from_type; hypre_CommType *copy_to_type; /* these pointers are just to help free up memory for send/from types */ hypre_CommEntryType *entries; HYPRE_Int *rem_boxnums; hypre_Box *rem_boxes; HYPRE_Int num_orders; /* num_orders x num_values */ HYPRE_Int **orders; /* offsets into recv data (by box) */ HYPRE_Int *recv_data_offsets; /* recv data dimensions (by box) */ hypre_BoxArray *recv_data_space; hypre_Index identity_coord; hypre_Index identity_dir; HYPRE_Int *identity_order; } hypre_CommPkg; /*-------------------------------------------------------------------------- * CommHandle: *--------------------------------------------------------------------------*/ typedef struct hypre_CommHandle_struct { hypre_CommPkg *comm_pkg; HYPRE_Complex *send_data; HYPRE_Complex *recv_data; HYPRE_Int num_requests; hypre_MPI_Request *requests; hypre_MPI_Status *status; HYPRE_Complex **send_buffers; HYPRE_Complex **recv_buffers; HYPRE_Complex **send_buffers_mpi; HYPRE_Complex **recv_buffers_mpi; /* set = 0, add = 1 */ HYPRE_Int action; } hypre_CommHandle; /*-------------------------------------------------------------------------- * Accessor macros: hypre_CommInto *--------------------------------------------------------------------------*/ #define hypre_CommInfoNDim(info) (info -> ndim) #define hypre_CommInfoSendBoxes(info) (info -> send_boxes) #define hypre_CommInfoSendStride(info) (info -> send_stride) #define hypre_CommInfoSendProcesses(info) (info -> send_processes) #define hypre_CommInfoSendRBoxnums(info) (info -> send_rboxnums) #define hypre_CommInfoSendRBoxes(info) (info -> send_rboxes) #define hypre_CommInfoRecvBoxes(info) (info -> recv_boxes) #define hypre_CommInfoRecvStride(info) (info -> recv_stride) #define hypre_CommInfoRecvProcesses(info) (info -> recv_processes) #define hypre_CommInfoRecvRBoxnums(info) (info -> recv_rboxnums) #define hypre_CommInfoRecvRBoxes(info) (info -> recv_rboxes) #define hypre_CommInfoNumTransforms(info) (info -> num_transforms) #define hypre_CommInfoCoords(info) (info -> coords) #define hypre_CommInfoDirs(info) (info -> dirs) #define hypre_CommInfoSendTransforms(info) (info -> send_transforms) #define hypre_CommInfoRecvTransforms(info) (info -> recv_transforms) #define hypre_CommInfoBoxesMatch(info) (info -> boxes_match) /*-------------------------------------------------------------------------- * Accessor macros: hypre_CommEntryType *--------------------------------------------------------------------------*/ #define hypre_CommEntryTypeOffset(entry) (entry -> offset) #define hypre_CommEntryTypeDim(entry) (entry -> dim) #define hypre_CommEntryTypeLengthArray(entry) (entry -> length_array) #define hypre_CommEntryTypeStrideArray(entry) (entry -> stride_array) #define hypre_CommEntryTypeOrder(entry) (entry -> order) /*-------------------------------------------------------------------------- * Accessor macros: hypre_CommType *--------------------------------------------------------------------------*/ #define hypre_CommTypeProc(type) (type -> proc) #define hypre_CommTypeBufsize(type) (type -> bufsize) #define hypre_CommTypeNumEntries(type) (type -> num_entries) #define hypre_CommTypeEntries(type) (type -> entries) #define hypre_CommTypeEntry(type, i) (&(type -> entries[i])) #define hypre_CommTypeRemBoxnums(type) (type -> rem_boxnums) #define hypre_CommTypeRemBoxnum(type, i) (type -> rem_boxnums[i]) #define hypre_CommTypeRemBoxes(type) (type -> rem_boxes) #define hypre_CommTypeRemBox(type, i) (&(type -> rem_boxes[i])) /*-------------------------------------------------------------------------- * Accessor macros: hypre_CommPkg *--------------------------------------------------------------------------*/ #define hypre_CommPkgComm(comm_pkg) (comm_pkg -> comm) #define hypre_CommPkgFirstComm(comm_pkg) (comm_pkg -> first_comm) #define hypre_CommPkgNDim(comm_pkg) (comm_pkg -> ndim) #define hypre_CommPkgNumValues(comm_pkg) (comm_pkg -> num_values) #define hypre_CommPkgSendStride(comm_pkg) (comm_pkg -> send_stride) #define hypre_CommPkgRecvStride(comm_pkg) (comm_pkg -> recv_stride) #define hypre_CommPkgSendBufsize(comm_pkg) (comm_pkg -> send_bufsize) #define hypre_CommPkgRecvBufsize(comm_pkg) (comm_pkg -> recv_bufsize) #define hypre_CommPkgSendBufsizeFirstComm(comm_pkg) (comm_pkg -> send_bufsize_first_comm) #define hypre_CommPkgRecvBufsizeFirstComm(comm_pkg) (comm_pkg -> recv_bufsize_first_comm) #define hypre_CommPkgNumSends(comm_pkg) (comm_pkg -> num_sends) #define hypre_CommPkgNumRecvs(comm_pkg) (comm_pkg -> num_recvs) #define hypre_CommPkgSendTypes(comm_pkg) (comm_pkg -> send_types) #define hypre_CommPkgSendType(comm_pkg, i) (&(comm_pkg -> send_types[i])) #define hypre_CommPkgRecvTypes(comm_pkg) (comm_pkg -> recv_types) #define hypre_CommPkgRecvType(comm_pkg, i) (&(comm_pkg -> recv_types[i])) #define hypre_CommPkgCopyFromType(comm_pkg) (comm_pkg -> copy_from_type) #define hypre_CommPkgCopyToType(comm_pkg) (comm_pkg -> copy_to_type) #define hypre_CommPkgEntries(comm_pkg) (comm_pkg -> entries) #define hypre_CommPkgRemBoxnums(comm_pkg) (comm_pkg -> rem_boxnums) #define hypre_CommPkgRemBoxes(comm_pkg) (comm_pkg -> rem_boxes) #define hypre_CommPkgNumOrders(comm_pkg) (comm_pkg -> num_orders) #define hypre_CommPkgOrders(comm_pkg) (comm_pkg -> orders) #define hypre_CommPkgRecvDataOffsets(comm_pkg) (comm_pkg -> recv_data_offsets) #define hypre_CommPkgRecvDataSpace(comm_pkg) (comm_pkg -> recv_data_space) #define hypre_CommPkgIdentityCoord(comm_pkg) (comm_pkg -> identity_coord) #define hypre_CommPkgIdentityDir(comm_pkg) (comm_pkg -> identity_dir) #define hypre_CommPkgIdentityOrder(comm_pkg) (comm_pkg -> identity_order) /*-------------------------------------------------------------------------- * Accessor macros: hypre_CommHandle *--------------------------------------------------------------------------*/ #define hypre_CommHandleCommPkg(comm_handle) (comm_handle -> comm_pkg) #define hypre_CommHandleSendData(comm_handle) (comm_handle -> send_data) #define hypre_CommHandleRecvData(comm_handle) (comm_handle -> recv_data) #define hypre_CommHandleNumRequests(comm_handle) (comm_handle -> num_requests) #define hypre_CommHandleRequests(comm_handle) (comm_handle -> requests) #define hypre_CommHandleStatus(comm_handle) (comm_handle -> status) #define hypre_CommHandleSendBuffers(comm_handle) (comm_handle -> send_buffers) #define hypre_CommHandleRecvBuffers(comm_handle) (comm_handle -> recv_buffers) #define hypre_CommHandleAction(comm_handle) (comm_handle -> action) #define hypre_CommHandleSendBuffersMPI(comm_handle) (comm_handle -> send_buffers_mpi) #define hypre_CommHandleRecvBuffersMPI(comm_handle) (comm_handle -> recv_buffers_mpi) #endif hypre-2.33.0/src/struct_mv/struct_copy.c000066400000000000000000000073641477326011500203050ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * Structured copy routine * *****************************************************************************/ #include "_hypre_struct_mv.h" #include "_hypre_struct_mv.hpp" /*-------------------------------------------------------------------------- * hypre_StructCopy *--------------------------------------------------------------------------*/ HYPRE_Int hypre_StructCopy( hypre_StructVector *x, hypre_StructVector *y ) { hypre_Box *x_data_box; hypre_Box *y_data_box; HYPRE_Complex *xp; HYPRE_Complex *yp; hypre_BoxArray *boxes; hypre_Box *box; hypre_Index loop_size; hypre_IndexRef start; hypre_Index unit_stride; HYPRE_Int i; hypre_SetIndex(unit_stride, 1); boxes = hypre_StructGridBoxes(hypre_StructVectorGrid(y)); hypre_ForBoxI(i, boxes) { box = hypre_BoxArrayBox(boxes, i); start = hypre_BoxIMin(box); x_data_box = hypre_BoxArrayBox(hypre_StructVectorDataSpace(x), i); y_data_box = hypre_BoxArrayBox(hypre_StructVectorDataSpace(y), i); xp = hypre_StructVectorBoxData(x, i); yp = hypre_StructVectorBoxData(y, i); hypre_BoxGetSize(box, loop_size); #define DEVICE_VAR is_device_ptr(yp,xp) hypre_BoxLoop2Begin(hypre_StructVectorNDim(x), loop_size, x_data_box, start, unit_stride, xi, y_data_box, start, unit_stride, yi); { yp[yi] = xp[xi]; } hypre_BoxLoop2End(xi, yi); #undef DEVICE_VAR } return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_StructPartialCopy: copy only the components on a subset of the grid. * A BoxArrayArray of boxes are needed- for each box of x, only an array * of subboxes (i.e., a boxarray for each box of x) are copied. *--------------------------------------------------------------------------*/ HYPRE_Int hypre_StructPartialCopy( hypre_StructVector *x, hypre_StructVector *y, hypre_BoxArrayArray *array_boxes ) { hypre_Box *x_data_box; hypre_Box *y_data_box; HYPRE_Complex *xp; HYPRE_Complex *yp; hypre_BoxArray *boxes; hypre_Box *box; hypre_Index loop_size; hypre_IndexRef start; hypre_Index unit_stride; HYPRE_Int i, j ; hypre_SetIndex(unit_stride, 1); hypre_ForBoxArrayI(i, array_boxes) { boxes = hypre_BoxArrayArrayBoxArray(array_boxes, i); x_data_box = hypre_BoxArrayBox(hypre_StructVectorDataSpace(x), i); y_data_box = hypre_BoxArrayBox(hypre_StructVectorDataSpace(y), i); xp = hypre_StructVectorBoxData(x, i); yp = hypre_StructVectorBoxData(y, i); /* array of sub_boxes of box_i of the vector */ hypre_ForBoxI(j, boxes) { box = hypre_BoxArrayBox(boxes, j); start = hypre_BoxIMin(box); hypre_BoxGetSize(box, loop_size); #define DEVICE_VAR is_device_ptr(yp,xp) hypre_BoxLoop2Begin(hypre_StructVectorNDim(x), loop_size, x_data_box, start, unit_stride, xi, y_data_box, start, unit_stride, yi); { yp[yi] = xp[xi]; } hypre_BoxLoop2End(xi, yi); #undef DEVICE_VAR } } return hypre_error_flag; } hypre-2.33.0/src/struct_mv/struct_grid.c000066400000000000000000000651221477326011500202540ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * Member functions for hypre_StructGrid class. * *****************************************************************************/ #include "_hypre_struct_mv.h" #define DEBUG 0 #if DEBUG char filename[255]; FILE *file; HYPRE_Int my_rank; #endif static HYPRE_Int time_index = 0; /*-------------------------------------------------------------------------- * hypre_StructGridCreate *--------------------------------------------------------------------------*/ HYPRE_Int hypre_StructGridCreate( MPI_Comm comm, HYPRE_Int ndim, hypre_StructGrid **grid_ptr) { hypre_StructGrid *grid; HYPRE_Int i; grid = hypre_TAlloc(hypre_StructGrid, 1, HYPRE_MEMORY_HOST); hypre_StructGridComm(grid) = comm; hypre_StructGridNDim(grid) = ndim; hypre_StructGridBoxes(grid) = hypre_BoxArrayCreate(0, ndim); hypre_StructGridIDs(grid) = NULL; hypre_SetIndex(hypre_StructGridMaxDistance(grid), 8); hypre_StructGridBoundingBox(grid) = NULL; hypre_StructGridLocalSize(grid) = 0; hypre_StructGridGlobalSize(grid) = 0; hypre_SetIndex(hypre_StructGridPeriodic(grid), 0); hypre_StructGridRefCount(grid) = 1; hypre_StructGridBoxMan(grid) = NULL; hypre_StructGridNumPeriods(grid) = 1; hypre_StructGridPShifts(grid) = NULL; hypre_StructGridGhlocalSize(grid) = 0; for (i = 0; i < 2 * ndim; i++) { hypre_StructGridNumGhost(grid)[i] = 1; } *grid_ptr = grid; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_StructGridRef *--------------------------------------------------------------------------*/ HYPRE_Int hypre_StructGridRef( hypre_StructGrid *grid, hypre_StructGrid **grid_ref) { hypre_StructGridRefCount(grid) ++; *grid_ref = grid; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_StructGridDestroy *--------------------------------------------------------------------------*/ HYPRE_Int hypre_StructGridDestroy( hypre_StructGrid *grid ) { if (grid) { hypre_StructGridRefCount(grid) --; if (hypre_StructGridRefCount(grid) == 0) { hypre_BoxDestroy(hypre_StructGridBoundingBox(grid)); hypre_TFree(hypre_StructGridIDs(grid), HYPRE_MEMORY_HOST); hypre_BoxArrayDestroy(hypre_StructGridBoxes(grid)); hypre_BoxManDestroy(hypre_StructGridBoxMan(grid)); hypre_TFree( hypre_StructGridPShifts(grid), HYPRE_MEMORY_HOST); hypre_TFree(grid, HYPRE_MEMORY_HOST); } } return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_StructGridSetPeriodic *--------------------------------------------------------------------------*/ HYPRE_Int hypre_StructGridSetPeriodic( hypre_StructGrid *grid, hypre_Index periodic) { hypre_CopyIndex(periodic, hypre_StructGridPeriodic(grid)); return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_StructGridSetExtents *--------------------------------------------------------------------------*/ HYPRE_Int hypre_StructGridSetExtents( hypre_StructGrid *grid, hypre_Index ilower, hypre_Index iupper ) { hypre_Box *box; box = hypre_BoxCreate(hypre_StructGridNDim(grid)); hypre_BoxSetExtents(box, ilower, iupper); hypre_AppendBox(box, hypre_StructGridBoxes(grid)); hypre_BoxDestroy(box); return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_StructGridSetBoxes *--------------------------------------------------------------------------*/ HYPRE_Int hypre_StructGridSetBoxes( hypre_StructGrid *grid, hypre_BoxArray *boxes ) { hypre_TFree(hypre_StructGridBoxes(grid), HYPRE_MEMORY_HOST); hypre_StructGridBoxes(grid) = boxes; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_StructGridSetBoundingBox *--------------------------------------------------------------------------*/ HYPRE_Int hypre_StructGridSetBoundingBox( hypre_StructGrid *grid, hypre_Box *new_bb ) { hypre_BoxDestroy(hypre_StructGridBoundingBox(grid)); hypre_StructGridBoundingBox(grid) = hypre_BoxDuplicate(new_bb); return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_StructGridSetIDs *--------------------------------------------------------------------------*/ HYPRE_Int hypre_StructGridSetIDs( hypre_StructGrid *grid, HYPRE_Int *ids ) { hypre_TFree(hypre_StructGridIDs(grid), HYPRE_MEMORY_HOST); hypre_StructGridIDs(grid) = ids; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_StructGridSetBoxManager *--------------------------------------------------------------------------*/ HYPRE_Int hypre_StructGridSetBoxManager( hypre_StructGrid *grid, hypre_BoxManager *boxman ) { hypre_TFree(hypre_StructGridBoxMan(grid), HYPRE_MEMORY_HOST); hypre_StructGridBoxMan(grid) = boxman; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_StructGridSetMaxDistance *--------------------------------------------------------------------------*/ HYPRE_Int hypre_StructGridSetMaxDistance( hypre_StructGrid *grid, hypre_Index dist ) { hypre_CopyIndex(dist, hypre_StructGridMaxDistance(grid)); return hypre_error_flag; } /*-------------------------------------------------------------------------- * New - hypre_StructGridAssemble * AHB 9/06 * New assemble routine that uses the BoxManager structure * * Notes: * 1. No longer need a different assemble for the assumed partition case * 2. if this is called from StructCoarsen, then the Box Manager has already * been created, and ids have been set * *--------------------------------------------------------------------------*/ HYPRE_Int hypre_StructGridAssemble( hypre_StructGrid *grid ) { HYPRE_Int d, k, p, i; HYPRE_Int is_boxman; HYPRE_Int size, ghostsize; HYPRE_Int num_local_boxes; HYPRE_Int myid, num_procs; HYPRE_BigInt global_size; HYPRE_Int max_nentries; HYPRE_Int info_size; HYPRE_Int num_periods; HYPRE_Int *ids = NULL; HYPRE_Int iperiodic, notcenter; HYPRE_Int sendbuf6[2 * HYPRE_MAXDIM], recvbuf6[2 * HYPRE_MAXDIM]; hypre_Box *box; hypre_Box *ghostbox; hypre_Box *grow_box; hypre_Box *periodic_box; hypre_Box *result_box; hypre_Index min_index, max_index, loop_size; hypre_Index *pshifts; hypre_IndexRef pshift; void *entry_info = NULL; /* initialize info from the grid */ MPI_Comm comm = hypre_StructGridComm(grid); HYPRE_Int ndim = hypre_StructGridNDim(grid); hypre_BoxArray *local_boxes = hypre_StructGridBoxes(grid); hypre_IndexRef max_distance = hypre_StructGridMaxDistance(grid); hypre_Box *bounding_box = hypre_StructGridBoundingBox(grid); hypre_IndexRef periodic = hypre_StructGridPeriodic(grid); hypre_BoxManager *boxman = hypre_StructGridBoxMan(grid); HYPRE_Int *numghost = hypre_StructGridNumGhost(grid); if (!time_index) { time_index = hypre_InitializeTiming("StructGridAssemble"); } hypre_BeginTiming(time_index); /* other initializations */ num_local_boxes = hypre_BoxArraySize(local_boxes); hypre_MPI_Comm_size(comm, &num_procs); hypre_MPI_Comm_rank(comm, &myid); /* has the box manager been created? */ if (boxman == NULL) { is_boxman = 0; } else { is_boxman = 1; } /* are the ids known? (these may have been set in coarsen) - if not we need to set them */ if (hypre_StructGridIDs(grid) == NULL) { ids = hypre_CTAlloc(HYPRE_Int, num_local_boxes, HYPRE_MEMORY_HOST); for (i = 0; i < num_local_boxes; i++) { ids[i] = i; } hypre_StructGridIDs(grid) = ids; } else { ids = hypre_StructGridIDs(grid); } /******** calculate the periodicity information ****************/ box = hypre_BoxCreate(ndim); for (d = 0; d < ndim; d++) { iperiodic = hypre_IndexD(periodic, d) ? 1 : 0; hypre_BoxIMinD(box, d) = -iperiodic; hypre_BoxIMaxD(box, d) = iperiodic; } num_periods = hypre_BoxVolume(box); pshifts = hypre_CTAlloc(hypre_Index, num_periods, HYPRE_MEMORY_HOST); pshift = pshifts[0]; hypre_SetIndex(pshift, 0); if (num_periods > 1) { p = 1; hypre_BoxGetSize(box, loop_size); hypre_SerialBoxLoop0Begin(ndim, loop_size); { pshift = pshifts[p]; zypre_BoxLoopGetIndex(pshift); hypre_AddIndexes(pshift, hypre_BoxIMin(box), ndim, pshift); notcenter = 0; for (d = 0; d < ndim; d++) { hypre_IndexD(pshift, d) *= hypre_IndexD(periodic, d); if (hypre_IndexD(pshift, d)) { notcenter = 1; } } if (notcenter) { p++; } } hypre_SerialBoxLoop0End(); } hypre_BoxDestroy(box); hypre_StructGridNumPeriods(grid) = num_periods; hypre_StructGridPShifts(grid) = pshifts; /********calculate local size and the ghost size **************/ size = 0; ghostsize = 0; ghostbox = hypre_BoxCreate(ndim); hypre_ForBoxI(i, local_boxes) { box = hypre_BoxArrayBox(local_boxes, i); size += hypre_BoxVolume(box); hypre_CopyBox(box, ghostbox); hypre_BoxGrowByArray(ghostbox, numghost); ghostsize += hypre_BoxVolume(ghostbox); } hypre_StructGridLocalSize(grid) = size; hypre_StructGridGhlocalSize(grid) = ghostsize; hypre_BoxDestroy(ghostbox); /* if the box manager has been created then we don't need to do the * following (because it was done through the coarsening routine) */ if (!is_boxman) { /*************** set the global size *****************/ HYPRE_BigInt big_size = (HYPRE_BigInt)size; hypre_MPI_Allreduce(&big_size, &global_size, 1, HYPRE_MPI_BIG_INT, hypre_MPI_SUM, comm); hypre_StructGridGlobalSize(grid) = global_size; /* TO DO: this HYPRE_Int * could overflow! (used * to calc flops) */ /*************** set bounding box ***********/ bounding_box = hypre_BoxCreate(ndim); if (num_local_boxes) { /* initialize min and max index*/ box = hypre_BoxArrayBox(local_boxes, 0); for (d = 0; d < ndim; d++) { hypre_IndexD(min_index, d) = hypre_BoxIMinD(box, d); hypre_IndexD(max_index, d) = hypre_BoxIMaxD(box, d); } hypre_ForBoxI(i, local_boxes) { box = hypre_BoxArrayBox(local_boxes, i); /* find min and max box extents */ for (d = 0; d < ndim; d++) { hypre_IndexD(min_index, d) = hypre_min( hypre_IndexD(min_index, d), hypre_BoxIMinD(box, d)); hypre_IndexD(max_index, d) = hypre_max( hypre_IndexD(max_index, d), hypre_BoxIMaxD(box, d)); } } /*set bounding box (this is still based on local info only) */ hypre_BoxSetExtents(bounding_box, min_index, max_index); } else /* no boxes owned*/ { /* initialize min and max */ for (d = 0; d < ndim; d++) { hypre_BoxIMinD(bounding_box, d) = hypre_pow2(30); hypre_BoxIMaxD(bounding_box, d) = -hypre_pow2(30); } } /* set the extra dimensions of the bounding box to zero */ for (d = ndim; d < HYPRE_MAXDIM; d++) { hypre_BoxIMinD(bounding_box, d) = 0; hypre_BoxIMaxD(bounding_box, d) = 0; } /* communication needed for the bounding box */ /* pack buffer */ for (d = 0; d < ndim; d++) { sendbuf6[d] = hypre_BoxIMinD(bounding_box, d); sendbuf6[d + ndim] = -hypre_BoxIMaxD(bounding_box, d); } hypre_MPI_Allreduce(sendbuf6, recvbuf6, 2 * ndim, HYPRE_MPI_INT, hypre_MPI_MIN, comm); /* unpack buffer */ for (d = 0; d < ndim; d++) { hypre_BoxIMinD(bounding_box, d) = recvbuf6[d]; hypre_BoxIMaxD(bounding_box, d) = -recvbuf6[d + ndim]; } hypre_StructGridBoundingBox(grid) = bounding_box; /*************** create a box manager *****************/ max_nentries = num_local_boxes + 20; info_size = 0; /* we don't need an info object */ hypre_BoxManCreate(max_nentries, info_size, ndim, bounding_box, comm, &boxman); /******** populate the box manager with my local boxes and gather neighbor information ******/ grow_box = hypre_BoxCreate(ndim); result_box = hypre_BoxCreate(ndim); periodic_box = hypre_BoxCreate(ndim); /* now loop through each local box */ hypre_ForBoxI(i, local_boxes) { box = hypre_BoxArrayBox(local_boxes, i); /* add entry for each local box (the id is the boxnum, and should be sequential */ hypre_BoxManAddEntry( boxman, hypre_BoxIMin(box), hypre_BoxIMax(box), myid, i, entry_info ); /* now expand box by max_distance or larger and gather entries */ hypre_CopyBox(box, grow_box); hypre_BoxGrowByIndex(grow_box, max_distance); hypre_BoxManGatherEntries(boxman, hypre_BoxIMin(grow_box), hypre_BoxIMax(grow_box)); /* now repeat for any periodic boxes - by shifting the grow_box*/ for (k = 1; k < num_periods; k++) /* k=0 is original box */ { hypre_CopyBox(grow_box, periodic_box); pshift = pshifts[k]; hypre_BoxShiftPos(periodic_box, pshift); /* see if the shifted box intersects the domain */ hypre_IntersectBoxes(periodic_box, bounding_box, result_box); /* if so, call gather entries */ if (hypre_BoxVolume(result_box) > 0) { hypre_BoxManGatherEntries(boxman, hypre_BoxIMin(periodic_box), hypre_BoxIMax(periodic_box)); } } }/* end of for each local box */ hypre_BoxDestroy(periodic_box); hypre_BoxDestroy(grow_box); hypre_BoxDestroy(result_box); } /* end of if (!is_boxman) */ /* boxman was created, but need to get additional neighbor info */ else if ( hypre_IndexEqual(max_distance, 0, ndim) ) { /* pick a new max distance and set in grid*/ hypre_SetIndex(hypre_StructGridMaxDistance(grid), 2); max_distance = hypre_StructGridMaxDistance(grid); grow_box = hypre_BoxCreate(ndim); result_box = hypre_BoxCreate(ndim); periodic_box = hypre_BoxCreate(ndim); /* now loop through each local box */ hypre_ForBoxI(i, local_boxes) { box = hypre_BoxArrayBox(local_boxes, i); /* now expand box by max_distance or larger and gather entries */ hypre_CopyBox(box, grow_box); hypre_BoxGrowByIndex(grow_box, max_distance); hypre_BoxManGatherEntries(boxman, hypre_BoxIMin(grow_box), hypre_BoxIMax(grow_box)); /* now repeat for any periodic boxes - by shifting the grow_box*/ for (k = 1; k < num_periods; k++) /* k=0 is original box */ { hypre_CopyBox(grow_box, periodic_box); pshift = pshifts[k]; hypre_BoxShiftPos(periodic_box, pshift); /* see if the shifted box intersects the domain */ hypre_IntersectBoxes(periodic_box, bounding_box, result_box); /* if so, call gather entries */ if (hypre_BoxVolume(result_box) > 0) { hypre_BoxManGatherEntries(boxman, hypre_BoxIMin(periodic_box), hypre_BoxIMax(periodic_box)); } } }/* end of for each local box */ hypre_BoxDestroy(periodic_box); hypre_BoxDestroy(grow_box); hypre_BoxDestroy(result_box); } /***************Assemble the box manager *****************/ hypre_BoxManAssemble(boxman); hypre_StructGridBoxMan(grid) = boxman; hypre_EndTiming(time_index); return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_GatherAllBoxes *--------------------------------------------------------------------------*/ HYPRE_Int hypre_GatherAllBoxes(MPI_Comm comm, hypre_BoxArray *boxes, HYPRE_Int ndim, hypre_BoxArray **all_boxes_ptr, HYPRE_Int **all_procs_ptr, HYPRE_Int *first_local_ptr) { hypre_BoxArray *all_boxes; HYPRE_Int *all_procs; HYPRE_Int first_local; HYPRE_Int all_boxes_size; hypre_Box *box; hypre_Index imin; hypre_Index imax; HYPRE_Int num_all_procs, my_rank; HYPRE_Int *sendbuf; HYPRE_Int sendcount; HYPRE_Int *recvbuf; HYPRE_Int *recvcounts; HYPRE_Int *displs; HYPRE_Int recvbuf_size; HYPRE_Int item_size; HYPRE_Int i, p, b, d; /*----------------------------------------------------- * Accumulate the box info *-----------------------------------------------------*/ hypre_MPI_Comm_size(comm, &num_all_procs); hypre_MPI_Comm_rank(comm, &my_rank); /* compute recvcounts and displs */ item_size = 2 * ndim + 1; sendcount = item_size * hypre_BoxArraySize(boxes); recvcounts = hypre_TAlloc(HYPRE_Int, num_all_procs, HYPRE_MEMORY_HOST); displs = hypre_TAlloc(HYPRE_Int, num_all_procs, HYPRE_MEMORY_HOST); hypre_MPI_Allgather(&sendcount, 1, HYPRE_MPI_INT, recvcounts, 1, HYPRE_MPI_INT, comm); displs[0] = 0; recvbuf_size = recvcounts[0]; for (p = 1; p < num_all_procs; p++) { displs[p] = displs[p - 1] + recvcounts[p - 1]; recvbuf_size += recvcounts[p]; } /* allocate sendbuf and recvbuf */ sendbuf = hypre_TAlloc(HYPRE_Int, sendcount, HYPRE_MEMORY_HOST); recvbuf = hypre_TAlloc(HYPRE_Int, recvbuf_size, HYPRE_MEMORY_HOST); /* put local box extents and process number into sendbuf */ i = 0; for (b = 0; b < hypre_BoxArraySize(boxes); b++) { sendbuf[i++] = my_rank; box = hypre_BoxArrayBox(boxes, b); for (d = 0; d < ndim; d++) { sendbuf[i++] = hypre_BoxIMinD(box, d); sendbuf[i++] = hypre_BoxIMaxD(box, d); } } /* get global grid info */ hypre_MPI_Allgatherv(sendbuf, sendcount, HYPRE_MPI_INT, recvbuf, recvcounts, displs, HYPRE_MPI_INT, comm); /* sort recvbuf by process rank? */ /*----------------------------------------------------- * Create all_boxes, etc. *-----------------------------------------------------*/ /* unpack recvbuf box info */ all_boxes_size = recvbuf_size / item_size; all_boxes = hypre_BoxArrayCreate(all_boxes_size, ndim); all_procs = hypre_TAlloc(HYPRE_Int, all_boxes_size, HYPRE_MEMORY_HOST); first_local = -1; i = 0; b = 0; box = hypre_BoxCreate(ndim); while (i < recvbuf_size) { all_procs[b] = recvbuf[i++]; for (d = 0; d < ndim; d++) { hypre_IndexD(imin, d) = recvbuf[i++]; hypre_IndexD(imax, d) = recvbuf[i++]; } hypre_BoxSetExtents(box, imin, imax); hypre_CopyBox(box, hypre_BoxArrayBox(all_boxes, b)); if ((first_local < 0) && (all_procs[b] == my_rank)) { first_local = b; } b++; } hypre_BoxDestroy(box); /*----------------------------------------------------- * Return *-----------------------------------------------------*/ hypre_TFree(sendbuf, HYPRE_MEMORY_HOST); hypre_TFree(recvbuf, HYPRE_MEMORY_HOST); hypre_TFree(recvcounts, HYPRE_MEMORY_HOST); hypre_TFree(displs, HYPRE_MEMORY_HOST); *all_boxes_ptr = all_boxes; *all_procs_ptr = all_procs; *first_local_ptr = first_local; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_ComputeBoxnums * * It is assumed that, for any process number in 'procs', all of that * processes local boxes appear in the 'boxes' array. * * It is assumed that the boxes in 'boxes' are ordered by associated * process number then by their local ordering on that process. * *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ComputeBoxnums(hypre_BoxArray *boxes, HYPRE_Int *procs, HYPRE_Int **boxnums_ptr) { HYPRE_Int *boxnums; HYPRE_Int num_boxes; HYPRE_Int p, b; HYPRE_Int boxnum = 0; /*----------------------------------------------------- *-----------------------------------------------------*/ num_boxes = hypre_BoxArraySize(boxes); boxnums = hypre_TAlloc(HYPRE_Int, num_boxes, HYPRE_MEMORY_HOST); p = -1; for (b = 0; b < num_boxes; b++) { /* start boxnum count at zero for each new process */ if (procs[b] != p) { boxnum = 0; p = procs[b]; } boxnums[b] = boxnum; boxnum++; } *boxnums_ptr = boxnums; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_StructGridPrint *--------------------------------------------------------------------------*/ HYPRE_Int hypre_StructGridPrint( FILE *file, hypre_StructGrid *grid ) { hypre_BoxArray *boxes; hypre_Box *box; HYPRE_Int i, d, ndim; ndim = hypre_StructGridNDim(grid); hypre_fprintf(file, "%d\n", ndim); boxes = hypre_StructGridBoxes(grid); hypre_fprintf(file, "%d\n", hypre_BoxArraySize(boxes)); /* Print lines of the form: "%d: (%d, %d, %d) x (%d, %d, %d)\n" */ hypre_ForBoxI(i, boxes) { box = hypre_BoxArrayBox(boxes, i); hypre_fprintf(file, "%d: (%d", i, hypre_BoxIMinD(box, 0)); for (d = 1; d < ndim; d++) { hypre_fprintf(file, ", %d", hypre_BoxIMinD(box, d)); } hypre_fprintf(file, ") x (%d", hypre_BoxIMaxD(box, 0)); for (d = 1; d < ndim; d++) { hypre_fprintf(file, ", %d", hypre_BoxIMaxD(box, d)); } hypre_fprintf(file, ")\n"); } /* Print line of the form: "Periodic: %d %d %d\n" */ hypre_fprintf(file, "\nPeriodic:"); for (d = 0; d < ndim; d++) { hypre_fprintf(file, " %d", hypre_StructGridPeriodic(grid)[d]); } hypre_fprintf(file, "\n"); return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_StructGridRead *--------------------------------------------------------------------------*/ HYPRE_Int hypre_StructGridRead( MPI_Comm comm, FILE *file, hypre_StructGrid **grid_ptr ) { hypre_StructGrid *grid; hypre_Index ilower; hypre_Index iupper; hypre_IndexRef periodic; HYPRE_Int ndim; HYPRE_Int num_boxes; HYPRE_Int i, d, idummy; hypre_fscanf(file, "%d\n", &ndim); hypre_StructGridCreate(comm, ndim, &grid); hypre_fscanf(file, "%d\n", &num_boxes); /* Read lines of the form: "%d: (%d, %d, %d) x (%d, %d, %d)\n" */ for (i = 0; i < num_boxes; i++) { hypre_fscanf(file, "%d: (%d", &idummy, &hypre_IndexD(ilower, 0)); for (d = 1; d < ndim; d++) { hypre_fscanf(file, ", %d", &hypre_IndexD(ilower, d)); } hypre_fscanf(file, ") x (%d", &hypre_IndexD(iupper, 0)); for (d = 1; d < ndim; d++) { hypre_fscanf(file, ", %d", &hypre_IndexD(iupper, d)); } hypre_fscanf(file, ")\n"); hypre_StructGridSetExtents(grid, ilower, iupper); } periodic = hypre_StructGridPeriodic(grid); /* Read line of the form: "Periodic: %d %d %d\n" */ hypre_fscanf(file, "Periodic:"); for (d = 0; d < ndim; d++) { hypre_fscanf(file, " %d", &hypre_IndexD(periodic, d)); } hypre_fscanf(file, "\n"); hypre_StructGridAssemble(grid); *grid_ptr = grid; return hypre_error_flag; } /*------------------------------------------------------------------------------ * GEC0902 hypre_StructGridSetNumGhost * * the purpose is to set num ghost in the structure grid. It is identical * to the function that is used in the structure vector entity. *-----------------------------------------------------------------------------*/ HYPRE_Int hypre_StructGridSetNumGhost( hypre_StructGrid *grid, HYPRE_Int *num_ghost ) { HYPRE_Int i, ndim = hypre_StructGridNDim(grid); for (i = 0; i < 2 * ndim; i++) { hypre_StructGridNumGhost(grid)[i] = num_ghost[i]; } return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_StructGridGetMaxBoxSize *--------------------------------------------------------------------------*/ HYPRE_Int hypre_StructGridGetMaxBoxSize( hypre_StructGrid *grid ) { hypre_BoxArray *boxes; hypre_Box *box; HYPRE_Int i, max_box_size = 0; boxes = hypre_StructGridBoxes(grid); hypre_ForBoxI(i, boxes) { box = hypre_BoxArrayBox(hypre_StructGridBoxes(grid), i); max_box_size = hypre_max(max_box_size, hypre_BoxVolume(box)); } return max_box_size; } #if 0 //defined(HYPRE_USING_CUDA) || defined(HYPRE_USING_HIP) HYPRE_Int hypre_StructGridSetDataLocation( HYPRE_StructGrid grid, HYPRE_MemoryLocation data_location ) { hypre_StructGridDataLocation(grid) = data_location; return hypre_error_flag; } #endif hypre-2.33.0/src/struct_mv/struct_grid.h000066400000000000000000000100761477326011500202570ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * Header info for the hypre_StructGrid structures * *****************************************************************************/ #ifndef hypre_STRUCT_GRID_HEADER #define hypre_STRUCT_GRID_HEADER /*-------------------------------------------------------------------------- * hypre_StructGrid: *--------------------------------------------------------------------------*/ typedef struct hypre_StructGrid_struct { MPI_Comm comm; HYPRE_Int ndim; /* Number of grid dimensions */ hypre_BoxArray *boxes; /* Array of boxes in this process */ HYPRE_Int *ids; /* Unique IDs for boxes */ hypre_Index max_distance; /* Neighborhood size - in each dimension*/ hypre_Box *bounding_box; /* Bounding box around grid */ HYPRE_Int local_size; /* Number of grid points locally */ HYPRE_BigInt global_size; /* Total number of grid points */ hypre_Index periodic; /* Indicates if grid is periodic */ HYPRE_Int num_periods; /* number of box set periods */ hypre_Index *pshifts; /* shifts of periodicity */ HYPRE_Int ref_count; HYPRE_Int ghlocal_size; /* Number of vars in box including ghosts */ HYPRE_Int num_ghost[2 * HYPRE_MAXDIM]; /* ghost layer size */ hypre_BoxManager *boxman; } hypre_StructGrid; /*-------------------------------------------------------------------------- * Accessor macros: hypre_StructGrid *--------------------------------------------------------------------------*/ #define hypre_StructGridComm(grid) ((grid) -> comm) #define hypre_StructGridNDim(grid) ((grid) -> ndim) #define hypre_StructGridBoxes(grid) ((grid) -> boxes) #define hypre_StructGridIDs(grid) ((grid) -> ids) #define hypre_StructGridMaxDistance(grid) ((grid) -> max_distance) #define hypre_StructGridBoundingBox(grid) ((grid) -> bounding_box) #define hypre_StructGridLocalSize(grid) ((grid) -> local_size) #define hypre_StructGridGlobalSize(grid) ((grid) -> global_size) #define hypre_StructGridPeriodic(grid) ((grid) -> periodic) #define hypre_StructGridNumPeriods(grid) ((grid) -> num_periods) #define hypre_StructGridPShifts(grid) ((grid) -> pshifts) #define hypre_StructGridPShift(grid, i) ((grid) -> pshifts[i]) #define hypre_StructGridRefCount(grid) ((grid) -> ref_count) #define hypre_StructGridGhlocalSize(grid) ((grid) -> ghlocal_size) #define hypre_StructGridNumGhost(grid) ((grid) -> num_ghost) #define hypre_StructGridBoxMan(grid) ((grid) -> boxman) #define hypre_StructGridBox(grid, i) (hypre_BoxArrayBox(hypre_StructGridBoxes(grid), i)) #define hypre_StructGridNumBoxes(grid) (hypre_BoxArraySize(hypre_StructGridBoxes(grid))) #define hypre_StructGridIDPeriod(grid) hypre_BoxNeighborsIDPeriod(hypre_StructGridNeighbors(grid)) #if 0 //defined(HYPRE_USING_CUDA) || defined(HYPRE_USING_HIP) #define hypre_StructGridDataLocation(grid) ((grid) -> data_location) #endif /*-------------------------------------------------------------------------- * Looping macros: *--------------------------------------------------------------------------*/ #define hypre_ForStructGridBoxI(i, grid) hypre_ForBoxI(i, hypre_StructGridBoxes(grid)) #if 0 //defined(HYPRE_USING_CUDA) || defined(HYPRE_USING_HIP) #define HYPRE_MIN_GPU_SIZE (131072) #define hypre_SetDeviceOn() hypre_HandleStructExecPolicy(hypre_handle()) = HYPRE_EXEC_DEVICE #define hypre_SetDeviceOff() hypre_HandleStructExecPolicy(hypre_handle()) = HYPRE_EXEC_HOST #endif #endif hypre-2.33.0/src/struct_mv/struct_innerprod.c000066400000000000000000000064501477326011500213260ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * Structured inner product routine * *****************************************************************************/ #include "_hypre_struct_mv.h" #include "_hypre_struct_mv.hpp" /*-------------------------------------------------------------------------- * hypre_StructInnerProd *--------------------------------------------------------------------------*/ HYPRE_Real hypre_StructInnerProd( hypre_StructVector *x, hypre_StructVector *y ) { HYPRE_Real final_innerprod_result; HYPRE_Real process_result; hypre_Box *x_data_box; hypre_Box *y_data_box; HYPRE_Complex *xp; HYPRE_Complex *yp; hypre_BoxArray *boxes; hypre_Box *box; hypre_Index loop_size; hypre_IndexRef start; hypre_Index unit_stride; HYPRE_Int ndim = hypre_StructVectorNDim(x); HYPRE_Int i; #if 0 //defined(HYPRE_USING_CUDA) || defined(HYPRE_USING_HIP) const HYPRE_Int data_location = hypre_StructGridDataLocation(hypre_StructVectorGrid(y)); #endif HYPRE_Real local_result = 0.0; hypre_SetIndex(unit_stride, 1); boxes = hypre_StructGridBoxes(hypre_StructVectorGrid(y)); hypre_ForBoxI(i, boxes) { box = hypre_BoxArrayBox(boxes, i); start = hypre_BoxIMin(box); x_data_box = hypre_BoxArrayBox(hypre_StructVectorDataSpace(x), i); y_data_box = hypre_BoxArrayBox(hypre_StructVectorDataSpace(y), i); xp = hypre_StructVectorBoxData(x, i); yp = hypre_StructVectorBoxData(y, i); hypre_BoxGetSize(box, loop_size); #if defined(HYPRE_USING_KOKKOS) || defined(HYPRE_USING_SYCL) HYPRE_Real box_sum = 0.0; #elif defined(HYPRE_USING_RAJA) ReduceSum box_sum(0.0); #elif defined(HYPRE_USING_CUDA) || defined(HYPRE_USING_HIP) ReduceSum box_sum(0.0); #else HYPRE_Real box_sum = 0.0; #endif #ifdef HYPRE_BOX_REDUCTION #undef HYPRE_BOX_REDUCTION #endif #if defined(HYPRE_USING_DEVICE_OPENMP) #define HYPRE_BOX_REDUCTION map(tofrom: box_sum) reduction(+:box_sum) #else #define HYPRE_BOX_REDUCTION reduction(+:box_sum) #endif #define DEVICE_VAR is_device_ptr(yp,xp) hypre_BoxLoop2ReductionBegin(ndim, loop_size, x_data_box, start, unit_stride, xi, y_data_box, start, unit_stride, yi, box_sum) { HYPRE_Real tmp = xp[xi] * hypre_conj(yp[yi]); box_sum += tmp; } hypre_BoxLoop2ReductionEnd(xi, yi, box_sum); local_result += (HYPRE_Real) box_sum; } process_result = (HYPRE_Real) local_result; hypre_MPI_Allreduce(&process_result, &final_innerprod_result, 1, HYPRE_MPI_REAL, hypre_MPI_SUM, hypre_StructVectorComm(x)); hypre_IncFLOPCount(2 * hypre_StructVectorGlobalSize(x)); return final_innerprod_result; } hypre-2.33.0/src/struct_mv/struct_io.c000066400000000000000000000270211477326011500177320ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * Functions for scanning and printing "box-dimensioned" data. * *****************************************************************************/ #include "_hypre_struct_mv.h" /*-------------------------------------------------------------------------- * hypre_PrintBoxArrayData * * Note: data array is expected to live on the host memory. *--------------------------------------------------------------------------*/ HYPRE_Int hypre_PrintBoxArrayData( FILE *file, hypre_BoxArray *box_array, hypre_BoxArray *data_space, HYPRE_Int num_values, HYPRE_Int dim, HYPRE_Complex *data ) { hypre_Box *box; hypre_Box *data_box; HYPRE_Int data_box_volume; hypre_Index loop_size; hypre_IndexRef start; hypre_Index stride; hypre_Index index; HYPRE_Int i, j, d; HYPRE_Complex value; /* Print data from the host */ hypre_SetIndex(stride, 1); hypre_ForBoxI(i, box_array) { box = hypre_BoxArrayBox(box_array, i); data_box = hypre_BoxArrayBox(data_space, i); start = hypre_BoxIMin(box); data_box_volume = hypre_BoxVolume(data_box); hypre_BoxGetSize(box, loop_size); hypre_SerialBoxLoop1Begin(dim, loop_size, data_box, start, stride, datai); { /* Print lines of the form: "%d: (%d, %d, %d; %d) %.14e\n" */ zypre_BoxLoopGetIndex(index); for (j = 0; j < num_values; j++) { hypre_fprintf(file, "%d: (%d", i, hypre_IndexD(start, 0) + hypre_IndexD(index, 0)); for (d = 1; d < dim; d++) { hypre_fprintf(file, ", %d", hypre_IndexD(start, d) + hypre_IndexD(index, d)); } value = data[datai + j * data_box_volume]; #ifdef HYPRE_COMPLEX hypre_fprintf(file, "; %d) %.14e , %.14e\n", j, hypre_creal(value), hypre_cimag(value)); #else hypre_fprintf(file, "; %d) %.14e\n", j, value); #endif } } hypre_SerialBoxLoop1End(datai); data += num_values * data_box_volume; } return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_PrintCCVDBoxArrayData * * Note that the the stencil loop (j) is _outside_ the space index loop * (datai), unlike hypre_PrintBoxArrayData (there is no j loop in * hypre_PrintCCBoxArrayData) * * Note: data array is expected to live on the host memory. *--------------------------------------------------------------------------*/ HYPRE_Int hypre_PrintCCVDBoxArrayData( FILE *file, hypre_BoxArray *box_array, hypre_BoxArray *data_space, HYPRE_Int num_values, HYPRE_Int center_rank, HYPRE_Int stencil_size, HYPRE_Int *symm_elements, HYPRE_Int dim, HYPRE_Complex *data ) { HYPRE_UNUSED_VAR(num_values); HYPRE_UNUSED_VAR(data_space); hypre_Box *box; hypre_Box *data_box; HYPRE_Int data_box_volume; hypre_Index loop_size; hypre_IndexRef start; hypre_Index stride; hypre_Index index; HYPRE_Int i, j, d; HYPRE_Complex value; /*---------------------------------------- * Print data *----------------------------------------*/ hypre_SetIndex(stride, 1); /* First is the constant, off-diagonal, part of the matrix: */ for (j = 0; j < stencil_size; j++) { if (symm_elements[j] < 0 && j != center_rank) { #ifdef HYPRE_COMPLEX hypre_fprintf( file, "*: (*, *, *; %d) %.14e , %.14e\n", j, hypre_creal(data[0]), hypre_cimag(data[0])); #else hypre_fprintf( file, "*: (*, *, *; %d) %.14e\n", j, data[0] ); #endif } ++data; } /* Then each box has a variable, diagonal, part of the matrix: */ hypre_ForBoxI(i, box_array) { box = hypre_BoxArrayBox(box_array, i); data_box = hypre_BoxArrayBox(data_space, i); start = hypre_BoxIMin(box); data_box_volume = hypre_BoxVolume(data_box); hypre_BoxGetSize(box, loop_size); hypre_SerialBoxLoop1Begin(dim, loop_size, data_box, start, stride, datai); { /* Print line of the form: "%d: (%d, %d, %d; %d) %.14e\n" */ zypre_BoxLoopGetIndex(index); hypre_fprintf(file, "%d: (%d", i, hypre_IndexD(start, 0) + hypre_IndexD(index, 0)); for (d = 1; d < dim; d++) { hypre_fprintf(file, ", %d", hypre_IndexD(start, d) + hypre_IndexD(index, d)); } value = data[datai]; #ifdef HYPRE_COMPLEX hypre_fprintf(file, "; %d) %.14e , %.14e\n", center_rank, hypre_creal(value), hypre_cimag(value)); #else hypre_fprintf(file, "; %d) %.14e\n", center_rank, value); #endif } hypre_SerialBoxLoop1End(datai); data += data_box_volume; } return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_PrintCCBoxArrayData * * same as hypre_PrintBoxArrayData but for constant coefficients * * Note: data array is expected to live on the host memory. *--------------------------------------------------------------------------*/ HYPRE_Int hypre_PrintCCBoxArrayData( FILE *file, hypre_BoxArray *box_array, hypre_BoxArray *data_space, HYPRE_Int num_values, HYPRE_Complex *data ) { HYPRE_UNUSED_VAR(data_space); HYPRE_Int datai; HYPRE_Int i, j; HYPRE_Complex value; /*---------------------------------------- * Print data *----------------------------------------*/ hypre_ForBoxI(i, box_array) { datai = hypre_CCBoxIndexRank_noargs(); for (j = 0; j < num_values; j++) { value = data[datai + j]; #ifdef HYPRE_COMPLEX hypre_fprintf(file, "*: (*, *, *; %d) %.14e , %.14e\n", j, hypre_creal(value), hypre_cimag(value)); #else hypre_fprintf(file, "*: (*, *, *; %d) %.14e\n", j, value); #endif } data += num_values; } return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_ReadBoxArrayData (for non-constant coefficients) * * Note: data array is expected to live on the host memory. *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ReadBoxArrayData( FILE *file, hypre_BoxArray *box_array, hypre_BoxArray *data_space, HYPRE_Int num_values, HYPRE_Int dim, HYPRE_Complex *data ) { hypre_Box *box; hypre_Box *data_box; HYPRE_Int data_box_volume; hypre_Index loop_size; hypre_IndexRef start; hypre_Index stride; HYPRE_Int i, j, d, idummy; /* Read data on the host */ hypre_SetIndex(stride, 1); hypre_ForBoxI(i, box_array) { box = hypre_BoxArrayBox(box_array, i); data_box = hypre_BoxArrayBox(data_space, i); start = hypre_BoxIMin(box); data_box_volume = hypre_BoxVolume(data_box); hypre_BoxGetSize(box, loop_size); hypre_SerialBoxLoop1Begin(dim, loop_size, data_box, start, stride, datai); { /* Read lines of the form: "%d: (%d, %d, %d; %d) %le\n" */ for (j = 0; j < num_values; j++) { hypre_fscanf(file, "%d: (%d", &idummy, &idummy); for (d = 1; d < dim; d++) { hypre_fscanf(file, ", %d", &idummy); } hypre_fscanf(file, "; %d) %le\n", &idummy, &data[datai + j * data_box_volume]); } } hypre_SerialBoxLoop1End(datai); data += num_values * data_box_volume; } return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_ReadBoxArrayData_CC (for when there are some constant coefficients) * * Note: data array is expected to live on the host memory. *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ReadBoxArrayData_CC( FILE *file, hypre_BoxArray *box_array, hypre_BoxArray *data_space, HYPRE_Int stencil_size, HYPRE_Int real_stencil_size, HYPRE_Int constant_coefficient, HYPRE_Int dim, HYPRE_Complex *data ) { hypre_Box *box; hypre_Box *data_box; HYPRE_Int data_box_volume; HYPRE_Int constant_stencil_size; hypre_Index loop_size; hypre_IndexRef start; hypre_Index stride; HYPRE_Int i, j, d, idummy; /*---------------------------------------- * Read data *----------------------------------------*/ switch (constant_coefficient) { case 1: constant_stencil_size = stencil_size; break; case 2: constant_stencil_size = stencil_size - 1; break; default: constant_stencil_size = 0; break; } hypre_SetIndex(stride, 1); hypre_ForBoxI(i, box_array) { box = hypre_BoxArrayBox(box_array, i); data_box = hypre_BoxArrayBox(data_space, i); start = hypre_BoxIMin(box); data_box_volume = hypre_BoxVolume(data_box); hypre_BoxGetSize(box, loop_size); /* First entries will be the constant part of the matrix. There is one entry for each constant stencil element, excluding ones which are redundant due to symmetry.*/ for (j = 0; j < constant_stencil_size; j++) { hypre_fscanf(file, "*: (*, *, *; %d) %le\n", &idummy, &data[j]); } /* Next entries, if any, will be for a variable diagonal: */ data += real_stencil_size; if (constant_coefficient == 2) { hypre_SerialBoxLoop1Begin(dim, loop_size, data_box, start, stride, datai); { /* Read line of the form: "%d: (%d, %d, %d; %d) %.14e\n" */ hypre_fscanf(file, "%d: (%d", &idummy, &idummy); for (d = 1; d < dim; d++) { hypre_fscanf(file, ", %d", &idummy); } hypre_fscanf(file, "; %d) %le\n", &idummy, &data[datai]); } hypre_SerialBoxLoop1End(datai); data += data_box_volume; } } return hypre_error_flag; } hypre-2.33.0/src/struct_mv/struct_matrix.c000066400000000000000000002217511477326011500206350ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * Member functions for hypre_StructMatrix class. * *****************************************************************************/ #include "_hypre_struct_mv.h" #include "_hypre_struct_mv.hpp" /*-------------------------------------------------------------------------- * hypre_StructMatrixExtractPointerByIndex * Returns pointer to data for stencil entry coresponding to * `index' in `matrix'. If the index does not exist in the matrix's * stencil, the NULL pointer is returned. *--------------------------------------------------------------------------*/ HYPRE_Complex * hypre_StructMatrixExtractPointerByIndex( hypre_StructMatrix *matrix, HYPRE_Int b, hypre_Index index ) { hypre_StructStencil *stencil; HYPRE_Int rank; stencil = hypre_StructMatrixStencil(matrix); rank = hypre_StructStencilElementRank( stencil, index ); if ( rank >= 0 ) { return hypre_StructMatrixBoxData(matrix, b, rank); } else { return NULL; /* error - invalid index */ } } /*-------------------------------------------------------------------------- * hypre_StructMatrixCreate *--------------------------------------------------------------------------*/ hypre_StructMatrix * hypre_StructMatrixCreate( MPI_Comm comm, hypre_StructGrid *grid, hypre_StructStencil *user_stencil ) { HYPRE_Int ndim = hypre_StructGridNDim(grid); hypre_StructMatrix *matrix; HYPRE_Int i; matrix = hypre_CTAlloc(hypre_StructMatrix, 1, HYPRE_MEMORY_HOST); hypre_StructMatrixComm(matrix) = comm; hypre_StructGridRef(grid, &hypre_StructMatrixGrid(matrix)); hypre_StructMatrixUserStencil(matrix) = hypre_StructStencilRef(user_stencil); hypre_StructMatrixDataAlloced(matrix) = 1; hypre_StructMatrixRefCount(matrix) = 1; /* set defaults */ hypre_StructMatrixSymmetric(matrix) = 0; hypre_StructMatrixConstantCoefficient(matrix) = 0; for (i = 0; i < 2 * ndim; i++) { hypre_StructMatrixNumGhost(matrix)[i] = hypre_StructGridNumGhost(grid)[i]; } hypre_StructMatrixMemoryLocation(matrix) = hypre_HandleMemoryLocation(hypre_handle()); return matrix; } /*-------------------------------------------------------------------------- * hypre_StructMatrixRef *--------------------------------------------------------------------------*/ hypre_StructMatrix * hypre_StructMatrixRef( hypre_StructMatrix *matrix ) { hypre_StructMatrixRefCount(matrix) ++; return matrix; } /*-------------------------------------------------------------------------- * hypre_StructMatrixDestroy *--------------------------------------------------------------------------*/ HYPRE_Int hypre_StructMatrixDestroy( hypre_StructMatrix *matrix ) { if (matrix) { hypre_StructMatrixRefCount(matrix) --; if (hypre_StructMatrixRefCount(matrix) == 0) { if (hypre_StructMatrixDataAlloced(matrix)) { hypre_TFree(hypre_StructMatrixData(matrix), hypre_StructMatrixMemoryLocation(matrix)); hypre_TFree(hypre_StructMatrixDataConst(matrix), HYPRE_MEMORY_HOST); } hypre_TFree(hypre_StructMatrixStencilData(matrix), HYPRE_MEMORY_HOST); hypre_CommPkgDestroy(hypre_StructMatrixCommPkg(matrix)); if (hypre_BoxArraySize(hypre_StructMatrixDataSpace(matrix)) > 0) { hypre_TFree(hypre_StructMatrixDataIndices(matrix)[0], HYPRE_MEMORY_HOST); } hypre_TFree(hypre_StructMatrixDataIndices(matrix), HYPRE_MEMORY_HOST); hypre_BoxArrayDestroy(hypre_StructMatrixDataSpace(matrix)); hypre_TFree(hypre_StructMatrixSymmElements(matrix), HYPRE_MEMORY_HOST); hypre_StructStencilDestroy(hypre_StructMatrixUserStencil(matrix)); hypre_StructStencilDestroy(hypre_StructMatrixStencil(matrix)); hypre_StructGridDestroy(hypre_StructMatrixGrid(matrix)); hypre_TFree(matrix, HYPRE_MEMORY_HOST); } } return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_StructMatrixInitializeShell *--------------------------------------------------------------------------*/ HYPRE_Int hypre_StructMatrixInitializeShell( hypre_StructMatrix *matrix ) { HYPRE_Int ndim = hypre_StructMatrixNDim(matrix); hypre_StructGrid *grid = hypre_StructMatrixGrid(matrix); hypre_StructStencil *user_stencil; hypre_StructStencil *stencil; hypre_Index *stencil_shape; HYPRE_Int stencil_size; HYPRE_Complex **stencil_data; HYPRE_Int num_values; HYPRE_Int *symm_elements; HYPRE_Int constant_coefficient; HYPRE_Int *num_ghost; HYPRE_Int extra_ghost[2 * HYPRE_MAXDIM]; hypre_BoxArray *data_space; hypre_BoxArray *boxes; hypre_Box *box; hypre_Box *data_box; HYPRE_Int **data_indices; HYPRE_Int data_size; HYPRE_Int data_const_size; HYPRE_Int data_box_volume; HYPRE_Int i, j, d; /*----------------------------------------------------------------------- * Set up stencil and num_values: * * If the matrix is symmetric, then the stencil is a "symmetrized" * version of the user's stencil. If the matrix is not symmetric, * then the stencil is the same as the user's stencil. * * The `symm_elements' array is used to determine what data is * explicitely stored (symm_elements[i] < 0) and what data does is * not explicitely stored (symm_elements[i] >= 0), but is instead * stored as the transpose coefficient at a neighboring grid point. *-----------------------------------------------------------------------*/ if (hypre_StructMatrixStencil(matrix) == NULL) { user_stencil = hypre_StructMatrixUserStencil(matrix); if (hypre_StructMatrixSymmetric(matrix)) { /* store only symmetric stencil entry data */ hypre_StructStencilSymmetrize(user_stencil, &stencil, &symm_elements); num_values = ( hypre_StructStencilSize(stencil) + 1 ) / 2; } else { /* store all stencil entry data */ stencil = hypre_StructStencilRef(user_stencil); num_values = hypre_StructStencilSize(stencil); symm_elements = hypre_TAlloc(HYPRE_Int, num_values, HYPRE_MEMORY_HOST); for (i = 0; i < num_values; i++) { symm_elements[i] = -1; } } hypre_StructMatrixStencil(matrix) = stencil; hypre_StructMatrixSymmElements(matrix) = symm_elements; hypre_StructMatrixNumValues(matrix) = num_values; } /*----------------------------------------------------------------------- * Set ghost-layer size for symmetric storage * - All stencil coeffs are to be available at each point in the * grid, as well as in the user-specified ghost layer. *-----------------------------------------------------------------------*/ num_ghost = hypre_StructMatrixNumGhost(matrix); stencil = hypre_StructMatrixStencil(matrix); stencil_shape = hypre_StructStencilShape(stencil); stencil_size = hypre_StructStencilSize(stencil); symm_elements = hypre_StructMatrixSymmElements(matrix); stencil_data = hypre_TAlloc(HYPRE_Complex*, stencil_size, HYPRE_MEMORY_HOST); hypre_StructMatrixStencilData(matrix) = stencil_data; for (d = 0; d < 2 * ndim; d++) { extra_ghost[d] = 0; } for (i = 0; i < stencil_size; i++) { if (symm_elements[i] >= 0) { for (d = 0; d < ndim; d++) { extra_ghost[2 * d] = hypre_max( extra_ghost[2 * d], -hypre_IndexD(stencil_shape[i], d) ); extra_ghost[2 * d + 1] = hypre_max( extra_ghost[2 * d + 1], hypre_IndexD(stencil_shape[i], d) ); } } } for (d = 0; d < ndim; d++) { num_ghost[2 * d] += extra_ghost[2 * d]; num_ghost[2 * d + 1] += extra_ghost[2 * d + 1]; } /*----------------------------------------------------------------------- * Set up data_space *-----------------------------------------------------------------------*/ if (hypre_StructMatrixDataSpace(matrix) == NULL) { boxes = hypre_StructGridBoxes(grid); data_space = hypre_BoxArrayCreate(hypre_BoxArraySize(boxes), ndim); hypre_ForBoxI(i, boxes) { box = hypre_BoxArrayBox(boxes, i); data_box = hypre_BoxArrayBox(data_space, i); hypre_CopyBox(box, data_box); for (d = 0; d < ndim; d++) { hypre_BoxIMinD(data_box, d) -= num_ghost[2 * d]; hypre_BoxIMaxD(data_box, d) += num_ghost[2 * d + 1]; } } hypre_StructMatrixDataSpace(matrix) = data_space; } /*----------------------------------------------------------------------- * Set up data_indices array and data-size *-----------------------------------------------------------------------*/ if (hypre_StructMatrixDataIndices(matrix) == NULL) { data_space = hypre_StructMatrixDataSpace(matrix); data_indices = hypre_TAlloc(HYPRE_Int *, hypre_BoxArraySize(data_space), HYPRE_MEMORY_HOST); if (hypre_BoxArraySize(data_space) > 0) { data_indices[0] = hypre_TAlloc(HYPRE_Int, stencil_size * hypre_BoxArraySize(data_space), HYPRE_MEMORY_HOST); } constant_coefficient = hypre_StructMatrixConstantCoefficient(matrix); data_size = 0; data_const_size = 0; if ( constant_coefficient == 0 ) { hypre_ForBoxI(i, data_space) { data_box = hypre_BoxArrayBox(data_space, i); data_box_volume = hypre_BoxVolume(data_box); data_indices[i] = data_indices[0] + stencil_size * i; /* set pointers for "stored" coefficients */ for (j = 0; j < stencil_size; j++) { if (symm_elements[j] < 0) { data_indices[i][j] = data_size; data_size += data_box_volume; } } /* set pointers for "symmetric" coefficients */ for (j = 0; j < stencil_size; j++) { if (symm_elements[j] >= 0) { data_indices[i][j] = data_indices[i][symm_elements[j]] + hypre_BoxOffsetDistance(data_box, stencil_shape[j]); } } } } else if ( constant_coefficient == 1 ) { hypre_ForBoxI(i, data_space) { data_box = hypre_BoxArrayBox(data_space, i); data_box_volume = hypre_BoxVolume(data_box); data_indices[i] = data_indices[0] + stencil_size * i; /* set pointers for "stored" coefficients */ for (j = 0; j < stencil_size; j++) { if (symm_elements[j] < 0) { data_indices[i][j] = data_const_size; ++data_const_size; } } /* set pointers for "symmetric" coefficients */ for (j = 0; j < stencil_size; j++) { if (symm_elements[j] >= 0) { data_indices[i][j] = data_indices[i][symm_elements[j]]; } } } } else { hypre_assert( constant_coefficient == 2 ); data_const_size += stencil_size; #if 0 //defined(HYPRE_USING_CUDA) || defined(HYPRE_USING_HIP) if (hypre_StructGridDataLocation(grid) == HYPRE_MEMORY_HOST) { /* in this case, "data" is put on host using the space of * "data_const". so, "data" need to be shifted by the size of * const coeff */ data_size += stencil_size;/* all constant coeffs at the beginning */ } #endif /* ... this allocates a little more space than is absolutely necessary */ hypre_ForBoxI(i, data_space) { data_box = hypre_BoxArrayBox(data_space, i); data_box_volume = hypre_BoxVolume(data_box); data_indices[i] = data_indices[0] + stencil_size * i; /* set pointers for "stored" coefficients */ for (j = 0; j < stencil_size; j++) { if (symm_elements[j] < 0) { /* diagonal, variable coefficient */ if (hypre_IndexEqual(stencil_shape[j], 0, ndim)) { data_indices[i][j] = data_size; data_size += data_box_volume; } /* off-diagonal, constant coefficient */ else { data_indices[i][j] = j; } } } /* set pointers for "symmetric" coefficients */ for (j = 0; j < stencil_size; j++) { if (symm_elements[j] >= 0) { /* diagonal, variable coefficient */ if (hypre_IndexEqual(stencil_shape[j], 0, ndim)) { data_indices[i][j] = data_indices[i][symm_elements[j]] + hypre_BoxOffsetDistance(data_box, stencil_shape[j]); } /* off-diagonal, constant coefficient */ else { data_indices[i][j] = data_indices[i][symm_elements[j]]; } } } } } hypre_StructMatrixDataIndices(matrix) = data_indices; /*----------------------------------------------------------------------- * if data location has not been set outside, set up the data location * based on the total number of *-----------------------------------------------------------------------*/ #if 0 //defined(HYPRE_USING_CUDA) || defined(HYPRE_USING_HIP) if (hypre_StructGridDataLocation(grid) == HYPRE_MEMORY_HOST) { data_const_size = data_size + data_const_size; data_size = 0; } #endif hypre_StructMatrixDataSize(matrix) = data_size; hypre_StructMatrixDataConstSize(matrix) = data_const_size; /* if (hypre_BoxArraySize(data_space) > 0) { hypre_StructMatrixDataDeviceIndices(matrix) = data_indices[0]; } */ } /*----------------------------------------------------------------------- * Set total number of nonzero coefficients * For constant coefficients, this is unrelated to the amount of data * actually stored. *-----------------------------------------------------------------------*/ hypre_StructMatrixGlobalSize(matrix) = hypre_StructGridGlobalSize(grid) * stencil_size; /*----------------------------------------------------------------------- * Return *-----------------------------------------------------------------------*/ return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_StructMatrixInitializeData *--------------------------------------------------------------------------*/ HYPRE_Int hypre_StructMatrixInitializeData( hypre_StructMatrix *matrix, HYPRE_Complex *data, HYPRE_Complex *data_const) { HYPRE_Int ndim = hypre_StructMatrixNDim(matrix); HYPRE_Int constant_coefficient; hypre_StructStencil *stencil; hypre_Index *stencil_shape; HYPRE_Complex **stencil_data; HYPRE_Int stencil_size, i; #if 0 //defined(HYPRE_USING_CUDA) || defined(HYPRE_USING_HIP) hypre_StructGrid *grid = hypre_StructMatrixGrid(matrix); #endif hypre_StructMatrixData(matrix) = data; hypre_StructMatrixDataConst(matrix) = data_const; hypre_StructMatrixDataAlloced(matrix) = 0; stencil = hypre_StructMatrixStencil(matrix); stencil_shape = hypre_StructStencilShape(stencil); stencil_size = hypre_StructStencilSize(stencil); stencil_data = hypre_StructMatrixStencilData(matrix); constant_coefficient = hypre_StructMatrixConstantCoefficient(matrix); if (constant_coefficient == 0) { for (i = 0; i < stencil_size; i++) { #if 0 //defined(HYPRE_USING_CUDA) || defined(HYPRE_USING_HIP) if (hypre_StructGridDataLocation(grid) != HYPRE_MEMORY_HOST) { stencil_data[i] = hypre_StructMatrixData(matrix); } else { stencil_data[i] = hypre_StructMatrixDataConst(matrix); } #else stencil_data[i] = hypre_StructMatrixData(matrix); #endif } } else if (constant_coefficient == 1) { for (i = 0; i < stencil_size; i++) { stencil_data[i] = hypre_StructMatrixDataConst(matrix); } } else { for (i = 0; i < stencil_size; i++) { /* diagonal, variable coefficient */ if (hypre_IndexEqual(stencil_shape[i], 0, ndim)) { #if 0 //defined(HYPRE_USING_CUDA) || defined(HYPRE_USING_HIP) if (hypre_StructGridDataLocation(grid) != HYPRE_MEMORY_HOST) { stencil_data[i] = hypre_StructMatrixData(matrix); } else { stencil_data[i] = hypre_StructMatrixDataConst(matrix); } #else stencil_data[i] = hypre_StructMatrixData(matrix); #endif } /* off-diagonal, constant coefficient */ else { stencil_data[i] = hypre_StructMatrixDataConst(matrix); } } } return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_StructMatrixInitialize *--------------------------------------------------------------------------*/ HYPRE_Int hypre_StructMatrixInitialize( hypre_StructMatrix *matrix ) { HYPRE_Complex *data; HYPRE_Complex *data_const; hypre_StructMatrixInitializeShell(matrix); data = hypre_CTAlloc(HYPRE_Complex, hypre_StructMatrixDataSize(matrix), hypre_StructMatrixMemoryLocation(matrix)); data_const = hypre_CTAlloc(HYPRE_Complex, hypre_StructMatrixDataConstSize(matrix), HYPRE_MEMORY_HOST); hypre_StructMatrixInitializeData(matrix, data, data_const); hypre_StructMatrixDataAlloced(matrix) = 1; return hypre_error_flag; } /*-------------------------------------------------------------------------- * (action > 0): add-to values * (action = 0): set values * (action < 0): get values * * should not be called to set a constant-coefficient part of the matrix, * call hypre_StructMatrixSetConstantValues instead *--------------------------------------------------------------------------*/ HYPRE_Int hypre_StructMatrixSetValues( hypre_StructMatrix *matrix, hypre_Index grid_index, HYPRE_Int num_stencil_indices, HYPRE_Int *stencil_indices, HYPRE_Complex *values, HYPRE_Int action, HYPRE_Int boxnum, HYPRE_Int outside ) { hypre_BoxArray *grid_boxes; hypre_Box *grid_box; hypre_Index center_index; hypre_StructStencil *stencil; HYPRE_Int center_rank; HYPRE_Int *symm_elements; HYPRE_Int constant_coefficient; HYPRE_Complex *matp; HYPRE_Int i, s, istart, istop; #if defined(HYPRE_USING_GPU) HYPRE_MemoryLocation memory_location = hypre_StructMatrixMemoryLocation(matrix); #endif /*----------------------------------------------------------------------- * Initialize some things *-----------------------------------------------------------------------*/ constant_coefficient = hypre_StructMatrixConstantCoefficient(matrix); symm_elements = hypre_StructMatrixSymmElements(matrix); if (outside > 0) { grid_boxes = hypre_StructMatrixDataSpace(matrix); } else { grid_boxes = hypre_StructGridBoxes(hypre_StructMatrixGrid(matrix)); } if (boxnum < 0) { istart = 0; istop = hypre_BoxArraySize(grid_boxes); } else { istart = boxnum; istop = istart + 1; } /*----------------------------------------------------------------------- * Set the matrix coefficients *-----------------------------------------------------------------------*/ center_rank = 0; if ( constant_coefficient == 2 ) { hypre_SetIndex(center_index, 0); stencil = hypre_StructMatrixStencil(matrix); center_rank = hypre_StructStencilElementRank( stencil, center_index ); } for (i = istart; i < istop; i++) { grid_box = hypre_BoxArrayBox(grid_boxes, i); if (hypre_IndexInBox(grid_index, grid_box)) { for (s = 0; s < num_stencil_indices; s++) { /* only set stored stencil values */ if (symm_elements[stencil_indices[s]] < 0) { if ( (constant_coefficient == 1) || (constant_coefficient == 2 && stencil_indices[s] != center_rank) ) { /* call SetConstantValues instead */ hypre_error(HYPRE_ERROR_GENERIC); matp = hypre_StructMatrixBoxData(matrix, i, stencil_indices[s]); } else /* variable coefficient, constant_coefficient=0 */ { matp = hypre_StructMatrixBoxDataValue(matrix, i, stencil_indices[s], grid_index); } #if defined(HYPRE_USING_GPU) if (hypre_GetExecPolicy1(memory_location) == HYPRE_EXEC_DEVICE) { if (action > 0) { #define DEVICE_VAR is_device_ptr(matp,values) hypre_LoopBegin(1, k) { *matp += values[s]; } hypre_LoopEnd() #undef DEVICE_VAR } else if (action > -1) { hypre_TMemcpy(matp, values + s, HYPRE_Complex, 1, memory_location, memory_location); } else /* action < 0 */ { hypre_TMemcpy(values + s, matp, HYPRE_Complex, 1, memory_location, memory_location); } } else #endif { if (action > 0) { *matp += values[s]; } else if (action > -1) { *matp = values[s]; } else /* action < 0 */ { values[s] = *matp; } } } } } } return hypre_error_flag; } /*-------------------------------------------------------------------------- * (action > 0): add-to values * (action = 0): set values * (action < 0): get values * (action =-2): get values and zero out * * should not be called to set a constant-coefficient part of the matrix, * call hypre_StructMatrixSetConstantValues instead *--------------------------------------------------------------------------*/ HYPRE_Int hypre_StructMatrixSetBoxValues( hypre_StructMatrix *matrix, hypre_Box *set_box, hypre_Box *value_box, HYPRE_Int num_stencil_indices, HYPRE_Int *stencil_indices, HYPRE_Complex *values, HYPRE_Int action, HYPRE_Int boxnum, HYPRE_Int outside ) { hypre_BoxArray *grid_boxes; hypre_Box *grid_box; hypre_Box *int_box; hypre_Index center_index; hypre_StructStencil *stencil; HYPRE_Int center_rank = 0; HYPRE_Int *symm_elements; hypre_BoxArray *data_space; hypre_Box *data_box; hypre_IndexRef data_start; hypre_Index data_stride; HYPRE_Int datai; HYPRE_Complex *datap; HYPRE_Int constant_coefficient; hypre_Box *dval_box; hypre_Index dval_start; hypre_Index dval_stride; HYPRE_Int dvali; hypre_Index loop_size; HYPRE_Int i, s, istart, istop; /*----------------------------------------------------------------------- * Initialize some things *-----------------------------------------------------------------------*/ constant_coefficient = hypre_StructMatrixConstantCoefficient(matrix); symm_elements = hypre_StructMatrixSymmElements(matrix); if (outside > 0) { grid_boxes = hypre_StructMatrixDataSpace(matrix); } else { grid_boxes = hypre_StructGridBoxes(hypre_StructMatrixGrid(matrix)); } data_space = hypre_StructMatrixDataSpace(matrix); if (boxnum < 0) { istart = 0; istop = hypre_BoxArraySize(grid_boxes); } else { istart = boxnum; istop = istart + 1; } /*----------------------------------------------------------------------- * Set the matrix coefficients *-----------------------------------------------------------------------*/ hypre_SetIndex(data_stride, 1); int_box = hypre_BoxCreate(hypre_StructMatrixNDim(matrix)); dval_box = hypre_BoxDuplicate(value_box); hypre_BoxIMinD(dval_box, 0) *= num_stencil_indices; hypre_BoxIMaxD(dval_box, 0) *= num_stencil_indices; hypre_BoxIMaxD(dval_box, 0) += num_stencil_indices - 1; hypre_SetIndex(dval_stride, 1); hypre_IndexD(dval_stride, 0) = num_stencil_indices; for (i = istart; i < istop; i++) { grid_box = hypre_BoxArrayBox(grid_boxes, i); data_box = hypre_BoxArrayBox(data_space, i); hypre_IntersectBoxes(set_box, grid_box, int_box); /* if there was an intersection */ if (hypre_BoxVolume(int_box)) { data_start = hypre_BoxIMin(int_box); hypre_CopyIndex(data_start, dval_start); hypre_IndexD(dval_start, 0) *= num_stencil_indices; if (constant_coefficient == 2) { hypre_SetIndex(center_index, 0); stencil = hypre_StructMatrixStencil(matrix); center_rank = hypre_StructStencilElementRank(stencil, center_index); } for (s = 0; s < num_stencil_indices; s++) { /* only set stored stencil values */ if (symm_elements[stencil_indices[s]] < 0) { datap = hypre_StructMatrixBoxData(matrix, i, stencil_indices[s]); if ( (constant_coefficient == 1) || (constant_coefficient == 2 && stencil_indices[s] != center_rank )) /* datap has only one data point for a given i and s */ { /* should have called SetConstantValues */ hypre_error(HYPRE_ERROR_GENERIC); hypre_BoxGetSize(int_box, loop_size); if (action > 0) { datai = hypre_CCBoxIndexRank(data_box, data_start); dvali = hypre_BoxIndexRank(dval_box, dval_start); datap[datai] += values[dvali]; } else if (action > -1) { datai = hypre_CCBoxIndexRank(data_box, data_start); dvali = hypre_BoxIndexRank(dval_box, dval_start); datap[datai] = values[dvali]; } else { datai = hypre_CCBoxIndexRank(data_box, data_start); dvali = hypre_BoxIndexRank(dval_box, dval_start); values[dvali] = datap[datai]; if (action == -2) { datap[datai] = 0; } } } else /* variable coefficient: constant_coefficient==0 or diagonal with constant_coefficient==2 */ { #define DEVICE_VAR is_device_ptr(datap,values) hypre_BoxGetSize(int_box, loop_size); if (action > 0) { hypre_BoxLoop2Begin(hypre_StructMatrixNDim(matrix), loop_size, data_box, data_start, data_stride, datai, dval_box, dval_start, dval_stride, dvali); { datap[datai] += values[dvali]; } hypre_BoxLoop2End(datai, dvali); } else if (action > -1) { hypre_BoxLoop2Begin(hypre_StructMatrixNDim(matrix), loop_size, data_box, data_start, data_stride, datai, dval_box, dval_start, dval_stride, dvali); { datap[datai] = values[dvali]; } hypre_BoxLoop2End(datai, dvali); } else if (action == -2) { hypre_BoxLoop2Begin(hypre_StructMatrixNDim(matrix), loop_size, data_box, data_start, data_stride, datai, dval_box, dval_start, dval_stride, dvali); { values[dvali] = datap[datai]; datap[datai] = 0; } hypre_BoxLoop2End(datai, dvali); } else { hypre_BoxLoop2Begin(hypre_StructMatrixNDim(matrix), loop_size, data_box, data_start, data_stride, datai, dval_box, dval_start, dval_stride, dvali); { values[dvali] = datap[datai]; } hypre_BoxLoop2End(datai, dvali); } #undef DEVICE_VAR } } /* end if (symm_elements) */ hypre_IndexD(dval_start, 0) ++; } } } hypre_BoxDestroy(int_box); hypre_BoxDestroy(dval_box); return hypre_error_flag; } /*-------------------------------------------------------------------------- * (action > 0): add-to values * (action = 0): set values * (action < 0): get values * (action =-2): get values and zero out (not implemented, just gets values) * should be called to set a constant-coefficient part of the matrix *--------------------------------------------------------------------------*/ HYPRE_Int hypre_StructMatrixSetConstantValues( hypre_StructMatrix *matrix, HYPRE_Int num_stencil_indices, HYPRE_Int *stencil_indices, HYPRE_Complex *values, HYPRE_Int action ) { hypre_BoxArray *boxes; hypre_Box *box; hypre_Index center_index; hypre_StructStencil *stencil; HYPRE_Int center_rank; HYPRE_Int constant_coefficient; HYPRE_Complex *matp; HYPRE_Int i, s; boxes = hypre_StructGridBoxes(hypre_StructMatrixGrid(matrix)); constant_coefficient = hypre_StructMatrixConstantCoefficient(matrix); if ( constant_coefficient == 1 ) { hypre_ForBoxI(i, boxes) { box = hypre_BoxArrayBox(boxes, i); if (action > 0) { for (s = 0; s < num_stencil_indices; s++) { matp = hypre_StructMatrixBoxData(matrix, i, stencil_indices[s]); *matp += values[s]; } } else if (action > -1) { for (s = 0; s < num_stencil_indices; s++) { matp = hypre_StructMatrixBoxData(matrix, i, stencil_indices[s]); *matp = values[s]; } } else /* action < 0 */ { for (s = 0; s < num_stencil_indices; s++) { matp = hypre_StructMatrixBoxData(matrix, i, stencil_indices[s]); values[s] = *matp; } } } } else if ( constant_coefficient == 2 ) { hypre_SetIndex(center_index, 0); stencil = hypre_StructMatrixStencil(matrix); center_rank = hypre_StructStencilElementRank( stencil, center_index ); if ( action > 0 ) { for (s = 0; s < num_stencil_indices; s++) { if ( stencil_indices[s] == center_rank ) { /* center (diagonal), like constant_coefficient==0 We consider it an error, but do the best we can. */ hypre_error(HYPRE_ERROR_GENERIC); hypre_ForBoxI(i, boxes) { box = hypre_BoxArrayBox(boxes, i); hypre_StructMatrixSetBoxValues( matrix, box, box, num_stencil_indices, stencil_indices, values, action, -1, 0 ); } } else { /* non-center, like constant_coefficient==1 */ matp = hypre_StructMatrixBoxData(matrix, 0, stencil_indices[s]); *matp += values[s]; } } } else if ( action > -1 ) { for (s = 0; s < num_stencil_indices; s++) { if ( stencil_indices[s] == center_rank ) { /* center (diagonal), like constant_coefficient==0 We consider it an error, but do the best we can. */ hypre_error(HYPRE_ERROR_GENERIC); hypre_ForBoxI(i, boxes) { box = hypre_BoxArrayBox(boxes, i); hypre_StructMatrixSetBoxValues( matrix, box, box, num_stencil_indices, stencil_indices, values, action, -1, 0 ); } } else { /* non-center, like constant_coefficient==1 */ matp = hypre_StructMatrixBoxData(matrix, 0, stencil_indices[s]); *matp += values[s]; } } } else /* action<0 */ { for (s = 0; s < num_stencil_indices; s++) { if ( stencil_indices[s] == center_rank ) { /* center (diagonal), like constant_coefficient==0 We consider it an error, but do the best we can. */ hypre_error(HYPRE_ERROR_GENERIC); hypre_ForBoxI(i, boxes) { box = hypre_BoxArrayBox(boxes, i); hypre_StructMatrixSetBoxValues( matrix, box, box, num_stencil_indices, stencil_indices, values, -1, -1, 0 ); } } else { /* non-center, like constant_coefficient==1 */ matp = hypre_StructMatrixBoxData(matrix, 0, stencil_indices[s]); values[s] = *matp; } } } } else /* constant_coefficient==0 */ { /* We consider this an error, but do the best we can. */ hypre_error(HYPRE_ERROR_GENERIC); hypre_ForBoxI(i, boxes) { box = hypre_BoxArrayBox(boxes, i); hypre_StructMatrixSetBoxValues( matrix, box, box, num_stencil_indices, stencil_indices, values, action, -1, 0 ); } } return hypre_error_flag; } /*-------------------------------------------------------------------------- * (outside > 0): clear values possibly outside of the grid extents * (outside = 0): clear values only inside the grid extents *--------------------------------------------------------------------------*/ HYPRE_Int hypre_StructMatrixClearValues( hypre_StructMatrix *matrix, hypre_Index grid_index, HYPRE_Int num_stencil_indices, HYPRE_Int *stencil_indices, HYPRE_Int boxnum, HYPRE_Int outside ) { hypre_BoxArray *grid_boxes; hypre_Box *grid_box; HYPRE_Complex *matp; HYPRE_Int i, s, istart, istop; /*----------------------------------------------------------------------- * Initialize some things *-----------------------------------------------------------------------*/ if (outside > 0) { grid_boxes = hypre_StructMatrixDataSpace(matrix); } else { grid_boxes = hypre_StructGridBoxes(hypre_StructMatrixGrid(matrix)); } if (boxnum < 0) { istart = 0; istop = hypre_BoxArraySize(grid_boxes); } else { istart = boxnum; istop = istart + 1; } /*----------------------------------------------------------------------- * Clear the matrix coefficients *-----------------------------------------------------------------------*/ for (i = istart; i < istop; i++) { grid_box = hypre_BoxArrayBox(grid_boxes, i); if (hypre_IndexInBox(grid_index, grid_box)) { for (s = 0; s < num_stencil_indices; s++) { matp = hypre_StructMatrixBoxDataValue(matrix, i, stencil_indices[s], grid_index); *matp = 0.0; } } } return hypre_error_flag; } /*-------------------------------------------------------------------------- * (outside > 0): clear values possibly outside of the grid extents * (outside = 0): clear values only inside the grid extents *--------------------------------------------------------------------------*/ HYPRE_Int hypre_StructMatrixClearBoxValues( hypre_StructMatrix *matrix, hypre_Box *clear_box, HYPRE_Int num_stencil_indices, HYPRE_Int *stencil_indices, HYPRE_Int boxnum, HYPRE_Int outside ) { hypre_BoxArray *grid_boxes; hypre_Box *grid_box; hypre_Box *int_box; HYPRE_Int *symm_elements; hypre_BoxArray *data_space; hypre_Box *data_box; hypre_IndexRef data_start; hypre_Index data_stride; HYPRE_Complex *datap; hypre_Index loop_size; HYPRE_Int i, s, istart, istop; /*----------------------------------------------------------------------- * Initialize some things *-----------------------------------------------------------------------*/ if (outside > 0) { grid_boxes = hypre_StructMatrixDataSpace(matrix); } else { grid_boxes = hypre_StructGridBoxes(hypre_StructMatrixGrid(matrix)); } data_space = hypre_StructMatrixDataSpace(matrix); if (boxnum < 0) { istart = 0; istop = hypre_BoxArraySize(grid_boxes); } else { istart = boxnum; istop = istart + 1; } /*----------------------------------------------------------------------- * Clear the matrix coefficients *-----------------------------------------------------------------------*/ hypre_SetIndex(data_stride, 1); symm_elements = hypre_StructMatrixSymmElements(matrix); int_box = hypre_BoxCreate(hypre_StructMatrixNDim(matrix)); for (i = istart; i < istop; i++) { grid_box = hypre_BoxArrayBox(grid_boxes, i); data_box = hypre_BoxArrayBox(data_space, i); hypre_IntersectBoxes(clear_box, grid_box, int_box); /* if there was an intersection */ if (hypre_BoxVolume(int_box)) { data_start = hypre_BoxIMin(int_box); for (s = 0; s < num_stencil_indices; s++) { /* only clear stencil entries that are explicitly stored */ if (symm_elements[stencil_indices[s]] < 0) { datap = hypre_StructMatrixBoxData(matrix, i, stencil_indices[s]); hypre_BoxGetSize(int_box, loop_size); #define DEVICE_VAR is_device_ptr(datap) hypre_BoxLoop1Begin(hypre_StructMatrixNDim(matrix), loop_size, data_box, data_start, data_stride, datai); { datap[datai] = 0.0; } hypre_BoxLoop1End(datai); #undef DEVICE_VAR } } } } hypre_BoxDestroy(int_box); return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_StructMatrixAssemble( hypre_StructMatrix *matrix ) { HYPRE_Int ndim = hypre_StructMatrixNDim(matrix); HYPRE_Int *num_ghost = hypre_StructMatrixNumGhost(matrix); HYPRE_Int comm_num_values, mat_num_values, constant_coefficient; #if 0 //defined(HYPRE_USING_CUDA) || defined(HYPRE_USING_HIP) HYPRE_Int stencil_size; hypre_StructStencil *stencil; #endif hypre_CommInfo *comm_info; hypre_CommPkg *comm_pkg; hypre_CommHandle *comm_handle; HYPRE_Complex *matrix_data = hypre_StructMatrixData(matrix); HYPRE_Complex *matrix_data_comm = matrix_data; /* BEGIN - variables for ghost layer identity code below */ hypre_StructGrid *grid; hypre_BoxManager *boxman; hypre_BoxArray *data_space; hypre_BoxArrayArray *boundary_boxes; hypre_BoxArray *boundary_box_a; hypre_BoxArray *entry_box_a; hypre_BoxArray *tmp_box_a; hypre_Box *data_box; hypre_Box *boundary_box; hypre_Box *entry_box; hypre_BoxManEntry **entries; hypre_Index loop_size; hypre_Index index; hypre_IndexRef start; hypre_Index stride; HYPRE_Complex *datap; HYPRE_Int i, j, ei; HYPRE_Int num_entries; /* End - variables for ghost layer identity code below */ constant_coefficient = hypre_StructMatrixConstantCoefficient( matrix ); /*----------------------------------------------------------------------- * Set ghost zones along the domain boundary to the identity to enable code * simplifications elsewhere in hypre (e.g., CyclicReduction). * * Intersect each data box with the BoxMan to get neighbors, then subtract * the neighbors from the box to get the boundary boxes. *-----------------------------------------------------------------------*/ if ( constant_coefficient != 1 ) { data_space = hypre_StructMatrixDataSpace(matrix); grid = hypre_StructMatrixGrid(matrix); boxman = hypre_StructGridBoxMan(grid); boundary_boxes = hypre_BoxArrayArrayCreate( hypre_BoxArraySize(data_space), ndim); entry_box_a = hypre_BoxArrayCreate(0, ndim); tmp_box_a = hypre_BoxArrayCreate(0, ndim); hypre_ForBoxI(i, data_space) { /* copy data box to boundary_box_a */ boundary_box_a = hypre_BoxArrayArrayBoxArray(boundary_boxes, i); hypre_BoxArraySetSize(boundary_box_a, 1); boundary_box = hypre_BoxArrayBox(boundary_box_a, 0); hypre_CopyBox(hypre_BoxArrayBox(data_space, i), boundary_box); hypre_BoxManIntersect(boxman, hypre_BoxIMin(boundary_box), hypre_BoxIMax(boundary_box), &entries, &num_entries); /* put neighbor boxes into entry_box_a */ hypre_BoxArraySetSize(entry_box_a, num_entries); for (ei = 0; ei < num_entries; ei++) { entry_box = hypre_BoxArrayBox(entry_box_a, ei); hypre_BoxManEntryGetExtents(entries[ei], hypre_BoxIMin(entry_box), hypre_BoxIMax(entry_box)); } hypre_TFree(entries, HYPRE_MEMORY_HOST); /* subtract neighbor boxes (entry_box_a) from data box (boundary_box_a) */ hypre_SubtractBoxArrays(boundary_box_a, entry_box_a, tmp_box_a); } hypre_BoxArrayDestroy(entry_box_a); hypre_BoxArrayDestroy(tmp_box_a); /* set boundary ghost zones to the identity equation */ hypre_SetIndex(index, 0); hypre_SetIndex(stride, 1); data_space = hypre_StructMatrixDataSpace(matrix); hypre_ForBoxI(i, data_space) { datap = hypre_StructMatrixExtractPointerByIndex(matrix, i, index); if (datap) { data_box = hypre_BoxArrayBox(data_space, i); boundary_box_a = hypre_BoxArrayArrayBoxArray(boundary_boxes, i); hypre_ForBoxI(j, boundary_box_a) { boundary_box = hypre_BoxArrayBox(boundary_box_a, j); start = hypre_BoxIMin(boundary_box); hypre_BoxGetSize(boundary_box, loop_size); #define DEVICE_VAR is_device_ptr(datap) hypre_BoxLoop1Begin(hypre_StructMatrixNDim(matrix), loop_size, data_box, start, stride, datai); { datap[datai] = 1.0; } hypre_BoxLoop1End(datai); #undef DEVICE_VAR } } } hypre_BoxArrayArrayDestroy(boundary_boxes); } /*----------------------------------------------------------------------- * If the CommPkg has not been set up, set it up * * The matrix data array is assumed to have two segments - an initial * segment of data constant over all space, followed by a segment with * comm_num_values matrix entries for each mesh element. The mesh-dependent * data is, of course, the only part relevent to communications. * For constant_coefficient==0, all the data is mesh-dependent. * For constant_coefficient==1, all data is constant. * For constant_coefficient==2, both segments are non-null. *-----------------------------------------------------------------------*/ mat_num_values = hypre_StructMatrixNumValues(matrix); if ( constant_coefficient == 0 ) { comm_num_values = mat_num_values; #if 0 //defined(HYPRE_USING_CUDA) || defined(HYPRE_USING_HIP) if (hypre_StructGridDataLocation(grid) == HYPRE_MEMORY_HOST) { matrix_data_comm = hypre_StructMatrixDataConst(matrix); } #endif } else if ( constant_coefficient == 1 ) { comm_num_values = 0; } else /* constant_coefficient==2 */ { comm_num_values = 1; #if 0 //defined(HYPRE_USING_CUDA) || defined(HYPRE_USING_HIP) if (hypre_StructGridDataLocation(grid) == HYPRE_MEMORY_HOST) { stencil = hypre_StructMatrixStencil(matrix); stencil_size = hypre_StructStencilSize(stencil); matrix_data_comm = hypre_StructMatrixDataConst(matrix) + stencil_size; } #endif } comm_pkg = hypre_StructMatrixCommPkg(matrix); if (!comm_pkg) { hypre_CreateCommInfoFromNumGhost(hypre_StructMatrixGrid(matrix), num_ghost, &comm_info); hypre_CommPkgCreate(comm_info, hypre_StructMatrixDataSpace(matrix), hypre_StructMatrixDataSpace(matrix), comm_num_values, NULL, 0, hypre_StructMatrixComm(matrix), &comm_pkg); hypre_CommInfoDestroy(comm_info); hypre_StructMatrixCommPkg(matrix) = comm_pkg; } /*----------------------------------------------------------------------- * Update the ghost data * This takes care of the communication needs of all known functions * referencing the matrix. * * At present this is the only place where matrix data gets communicated. * However, comm_pkg is kept as long as the matrix is, in case some * future version hypre has a use for it - e.g. if the user replaces * a matrix with a very similar one, we may not want to recompute comm_pkg. *-----------------------------------------------------------------------*/ if ( constant_coefficient != 1 ) { hypre_InitializeCommunication( comm_pkg, matrix_data_comm, matrix_data_comm, 0, 0, &comm_handle ); hypre_FinalizeCommunication( comm_handle ); } return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_StructMatrixSetNumGhost *--------------------------------------------------------------------------*/ HYPRE_Int hypre_StructMatrixSetNumGhost( hypre_StructMatrix *matrix, HYPRE_Int *num_ghost ) { HYPRE_Int d, ndim = hypre_StructMatrixNDim(matrix); for (d = 0; d < ndim; d++) { hypre_StructMatrixNumGhost(matrix)[2 * d] = num_ghost[2 * d]; hypre_StructMatrixNumGhost(matrix)[2 * d + 1] = num_ghost[2 * d + 1]; } return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_StructMatrixSetConstantCoefficient * deprecated in user interface, in favor of SetConstantEntries. * left here for internal use *--------------------------------------------------------------------------*/ HYPRE_Int hypre_StructMatrixSetConstantCoefficient( hypre_StructMatrix *matrix, HYPRE_Int constant_coefficient ) { hypre_StructMatrixConstantCoefficient(matrix) = constant_coefficient; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_StructMatrixSetConstantEntries * - nentries is the number of array entries * - Each HYPRE_Int entries[i] is an index into the shape array of the stencil * of the matrix * In the present version, only three possibilites are recognized: * - no entries constant (constant_coefficient==0) * - all entries constant (constant_coefficient==1) * - all but the diagonal entry constant (constant_coefficient==2) * If something else is attempted, this function will return a nonzero error. * In the present version, if this function is called more than once, only * the last call will take effect. *--------------------------------------------------------------------------*/ HYPRE_Int hypre_StructMatrixSetConstantEntries( hypre_StructMatrix *matrix, HYPRE_Int nentries, HYPRE_Int *entries ) { /* We make an array offdconst corresponding to the stencil's shape array, and use "entries" to fill it with flags - 1 for constant, 0 otherwise. By counting the nonzeros in offdconst, and by checking whether its diagonal entry is nonzero, we can distinguish among the three presently legal values of constant_coefficient, and detect input errors. We do not need to treat duplicates in "entries" as an error condition. */ hypre_StructStencil *stencil = hypre_StructMatrixUserStencil(matrix); /* ... Stencil doesn't exist yet */ HYPRE_Int stencil_size = hypre_StructStencilSize(stencil); HYPRE_Int *offdconst = hypre_CTAlloc(HYPRE_Int, stencil_size, HYPRE_MEMORY_HOST); /* ... note: CTAlloc initializes to 0 (normally it works by calling calloc) */ HYPRE_Int nconst = 0; HYPRE_Int constant_coefficient, diag_rank; hypre_Index diag_index; HYPRE_Int i, j; for ( i = 0; i < nentries; ++i ) { offdconst[ entries[i] ] = 1; } for ( j = 0; j < stencil_size; ++j ) { nconst += offdconst[j]; } if ( nconst <= 0 ) { constant_coefficient = 0; } else if ( nconst >= stencil_size ) { constant_coefficient = 1; } else { hypre_SetIndex(diag_index, 0); diag_rank = hypre_StructStencilElementRank( stencil, diag_index ); if ( offdconst[diag_rank] == 0 ) { constant_coefficient = 2; if ( nconst != (stencil_size - 1) ) { hypre_error(HYPRE_ERROR_GENERIC); } } else { constant_coefficient = 0; hypre_error(HYPRE_ERROR_GENERIC); } } hypre_StructMatrixSetConstantCoefficient( matrix, constant_coefficient ); hypre_TFree(offdconst, HYPRE_MEMORY_HOST); return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_StructMatrixClearGhostValues( hypre_StructMatrix *matrix ) { HYPRE_Int ndim = hypre_StructMatrixNDim(matrix); hypre_Box *m_data_box; HYPRE_Complex *mp; hypre_StructStencil *stencil; HYPRE_Int *symm_elements; hypre_BoxArray *boxes; hypre_Box *box; hypre_BoxArray *diff_boxes; hypre_Box *diff_box; hypre_Index loop_size; hypre_IndexRef start; hypre_Index unit_stride; HYPRE_Int i, j, s; /*----------------------------------------------------------------------- * Set the matrix coefficients *-----------------------------------------------------------------------*/ hypre_SetIndex(unit_stride, 1); stencil = hypre_StructMatrixStencil(matrix); symm_elements = hypre_StructMatrixSymmElements(matrix); boxes = hypre_StructGridBoxes(hypre_StructMatrixGrid(matrix)); diff_boxes = hypre_BoxArrayCreate(0, ndim); hypre_ForBoxI(i, boxes) { box = hypre_BoxArrayBox(boxes, i); m_data_box = hypre_BoxArrayBox(hypre_StructMatrixDataSpace(matrix), i); hypre_BoxArraySetSize(diff_boxes, 0); hypre_SubtractBoxes(m_data_box, box, diff_boxes); for (s = 0; s < hypre_StructStencilSize(stencil); s++) { /* only clear stencil entries that are explicitly stored */ if (symm_elements[s] < 0) { mp = hypre_StructMatrixBoxData(matrix, i, s); hypre_ForBoxI(j, diff_boxes) { diff_box = hypre_BoxArrayBox(diff_boxes, j); start = hypre_BoxIMin(diff_box); hypre_BoxGetSize(diff_box, loop_size); #define DEVICE_VAR is_device_ptr(mp) hypre_BoxLoop1Begin(hypre_StructMatrixNDim(matrix), loop_size, m_data_box, start, unit_stride, mi); { mp[mi] = 0.0; } hypre_BoxLoop1End(mi); #undef DEVICE_VAR } } } } hypre_BoxArrayDestroy(diff_boxes); return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_StructMatrixPrintData *--------------------------------------------------------------------------*/ HYPRE_Int hypre_StructMatrixPrintData( FILE *file, hypre_StructMatrix *matrix, HYPRE_Int all ) { HYPRE_Int ndim = hypre_StructMatrixNDim(matrix); HYPRE_Int num_values = hypre_StructMatrixNumValues(matrix); HYPRE_Int ctecoef = hypre_StructMatrixConstantCoefficient(matrix); hypre_StructGrid *grid = hypre_StructMatrixGrid(matrix); hypre_StructStencil *stencil = hypre_StructMatrixStencil(matrix); HYPRE_Int stencil_size = hypre_StructStencilSize(stencil); HYPRE_Int *symm_elements = hypre_StructMatrixSymmElements(matrix); hypre_BoxArray *data_space = hypre_StructMatrixDataSpace(matrix); HYPRE_Int data_size = hypre_StructMatrixDataSize(matrix); hypre_BoxArray *grid_boxes = hypre_StructGridBoxes(grid); HYPRE_Complex *data = hypre_StructMatrixData(matrix); HYPRE_MemoryLocation memory_location = hypre_StructMatrixMemoryLocation(matrix); hypre_BoxArray *boxes; hypre_Index center_index; HYPRE_Int center_rank; HYPRE_Complex *h_data; /* Allocate/Point to data on the host memory */ if (hypre_GetActualMemLocation(memory_location) != hypre_MEMORY_HOST) { h_data = hypre_CTAlloc(HYPRE_Complex, data_size, HYPRE_MEMORY_HOST); hypre_TMemcpy(h_data, data, HYPRE_Complex, data_size, HYPRE_MEMORY_HOST, memory_location); } else { h_data = data; } /* Print ghost data (all) also or only real data? */ boxes = (all) ? data_space : grid_boxes; /* Print data to file */ if (ctecoef == 1) { hypre_PrintCCBoxArrayData(file, boxes, data_space, num_values, h_data); } else if (ctecoef == 2) { hypre_SetIndex(center_index, 0); center_rank = hypre_StructStencilElementRank(stencil, center_index); hypre_PrintCCVDBoxArrayData(file, boxes, data_space, num_values, center_rank, stencil_size, symm_elements, ndim, h_data); } else { hypre_PrintBoxArrayData(file, boxes, data_space, num_values, ndim, h_data); } /* Free memory */ if (hypre_GetActualMemLocation(memory_location) != hypre_MEMORY_HOST) { hypre_TFree(h_data, HYPRE_MEMORY_HOST); } return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_StructMatrixReadData *--------------------------------------------------------------------------*/ HYPRE_Int hypre_StructMatrixReadData( FILE *file, hypre_StructMatrix *matrix ) { HYPRE_Int ndim = hypre_StructMatrixNDim(matrix); HYPRE_Int num_values = hypre_StructMatrixNumValues(matrix); HYPRE_Int ctecoef = hypre_StructMatrixConstantCoefficient(matrix); hypre_StructGrid *grid = hypre_StructMatrixGrid(matrix); hypre_StructStencil *stencil = hypre_StructMatrixStencil(matrix); HYPRE_Int stencil_size = hypre_StructStencilSize(stencil); HYPRE_Int symmetric = hypre_StructMatrixSymmetric(matrix); hypre_BoxArray *data_space = hypre_StructMatrixDataSpace(matrix); hypre_BoxArray *boxes = hypre_StructGridBoxes(grid); HYPRE_Complex *data = hypre_StructMatrixData(matrix); HYPRE_Int data_size = hypre_StructMatrixDataSize(matrix); HYPRE_MemoryLocation memory_location = hypre_StructMatrixMemoryLocation(matrix); HYPRE_Complex *h_data; HYPRE_Int real_stencil_size; /* Allocate/Point to data on the host memory */ if (hypre_GetActualMemLocation(memory_location) != hypre_MEMORY_HOST) { h_data = hypre_CTAlloc(HYPRE_Complex, data_size, HYPRE_MEMORY_HOST); } else { h_data = data; } /* real_stencil_size is the stencil size of the matrix after it's fixed up by the call (if any) of hypre_StructStencilSymmetrize from hypre_StructMatrixInitializeShell.*/ if (symmetric) { real_stencil_size = 2 * stencil_size - 1; } else { real_stencil_size = stencil_size; } /* Read data from file */ if (ctecoef == 0) { hypre_ReadBoxArrayData(file, boxes, data_space, num_values, ndim, h_data); } else { hypre_assert(ctecoef <= 2); hypre_ReadBoxArrayData_CC(file, boxes, data_space, stencil_size, real_stencil_size, ctecoef, ndim, h_data); } /* Move data to the device memory if necessary and free host data */ if (hypre_GetActualMemLocation(memory_location) != hypre_MEMORY_HOST) { hypre_TMemcpy(data, h_data, HYPRE_Complex, data_size, memory_location, HYPRE_MEMORY_HOST); hypre_TFree(h_data, HYPRE_MEMORY_HOST); } return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_StructMatrixPrint *--------------------------------------------------------------------------*/ HYPRE_Int hypre_StructMatrixPrint( const char *filename, hypre_StructMatrix *matrix, HYPRE_Int all ) { FILE *file; char new_filename[255]; hypre_StructGrid *grid; hypre_StructStencil *stencil; hypre_Index *stencil_shape; HYPRE_Int stencil_size; HYPRE_Int ndim, num_values; HYPRE_Int *symm_elements; HYPRE_Int i, j, d; HYPRE_Int myid; /*---------------------------------------- * Open file *----------------------------------------*/ hypre_MPI_Comm_rank(hypre_StructMatrixComm(matrix), &myid); hypre_sprintf(new_filename, "%s.%05d", filename, myid); if ((file = fopen(new_filename, "w")) == NULL) { hypre_printf("Error: can't open output file %s\n", new_filename); exit(1); } /*---------------------------------------- * Print header info *----------------------------------------*/ hypre_fprintf(file, "StructMatrix\n"); hypre_fprintf(file, "\nSymmetric: %d\n", hypre_StructMatrixSymmetric(matrix)); hypre_fprintf(file, "\nConstantCoefficient: %d\n", hypre_StructMatrixConstantCoefficient(matrix)); /* print grid info */ hypre_fprintf(file, "\nGrid:\n"); grid = hypre_StructMatrixGrid(matrix); hypre_StructGridPrint(file, grid); /* print stencil info */ hypre_fprintf(file, "\nStencil:\n"); stencil = hypre_StructMatrixStencil(matrix); stencil_shape = hypre_StructStencilShape(stencil); ndim = hypre_StructMatrixNDim(matrix); num_values = hypre_StructMatrixNumValues(matrix); symm_elements = hypre_StructMatrixSymmElements(matrix); hypre_fprintf(file, "%d\n", num_values); stencil_size = hypre_StructStencilSize(stencil); j = 0; for (i = 0; i < stencil_size; i++) { if (symm_elements[i] < 0) { /* Print line of the form: "%d: %d %d %d\n" */ hypre_fprintf(file, "%d:", j++); for (d = 0; d < ndim; d++) { hypre_fprintf(file, " %d", hypre_IndexD(stencil_shape[i], d)); } hypre_fprintf(file, "\n"); } } /*---------------------------------------- * Print data *----------------------------------------*/ hypre_fprintf(file, "\nData:\n"); hypre_StructMatrixPrintData(file, matrix, all); /*---------------------------------------- * Close file *----------------------------------------*/ fflush(file); fclose(file); return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_StructMatrixRead *--------------------------------------------------------------------------*/ hypre_StructMatrix * hypre_StructMatrixRead( MPI_Comm comm, const char *filename, HYPRE_Int *num_ghost ) { FILE *file; char new_filename[255]; hypre_StructMatrix *matrix; hypre_StructGrid *grid; HYPRE_Int ndim; hypre_StructStencil *stencil; hypre_Index *stencil_shape; HYPRE_Int stencil_size; HYPRE_Int symmetric; HYPRE_Int constant_coefficient; HYPRE_Int i, d, idummy; HYPRE_Int myid; /*---------------------------------------- * Open file *----------------------------------------*/ hypre_MPI_Comm_rank(comm, &myid ); hypre_sprintf(new_filename, "%s.%05d", filename, myid); if ((file = fopen(new_filename, "r")) == NULL) { hypre_printf("Error: can't open output file %s\n", new_filename); exit(1); } /*---------------------------------------- * Read header info *----------------------------------------*/ hypre_fscanf(file, "StructMatrix\n"); hypre_fscanf(file, "\nSymmetric: %d\n", &symmetric); hypre_fscanf(file, "\nConstantCoefficient: %d\n", &constant_coefficient); /* read grid info */ hypre_fscanf(file, "\nGrid:\n"); hypre_StructGridRead(comm, file, &grid); /* read stencil info */ hypre_fscanf(file, "\nStencil:\n"); ndim = hypre_StructGridNDim(grid); hypre_fscanf(file, "%d\n", &stencil_size); stencil_shape = hypre_CTAlloc(hypre_Index, stencil_size, HYPRE_MEMORY_HOST); for (i = 0; i < stencil_size; i++) { /* Read line of the form: "%d: %d %d %d\n" */ hypre_fscanf(file, "%d:", &idummy); for (d = 0; d < ndim; d++) { hypre_fscanf(file, " %d", &hypre_IndexD(stencil_shape[i], d)); } hypre_fscanf(file, "\n"); } stencil = hypre_StructStencilCreate(ndim, stencil_size, stencil_shape); /*---------------------------------------- * Initialize the matrix *----------------------------------------*/ matrix = hypre_StructMatrixCreate(comm, grid, stencil); hypre_StructMatrixSymmetric(matrix) = symmetric; hypre_StructMatrixConstantCoefficient(matrix) = constant_coefficient; hypre_StructMatrixSetNumGhost(matrix, num_ghost); hypre_StructMatrixInitialize(matrix); /*---------------------------------------- * Read data *----------------------------------------*/ hypre_fscanf(file, "\nData:\n"); hypre_StructMatrixReadData(file, matrix); /*---------------------------------------- * Assemble the matrix *----------------------------------------*/ hypre_StructMatrixAssemble(matrix); /*---------------------------------------- * Close file *----------------------------------------*/ fclose(file); return matrix; } /*-------------------------------------------------------------------------- * hypre_StructMatrixMigrate *--------------------------------------------------------------------------*/ HYPRE_Int hypre_StructMatrixMigrate( hypre_StructMatrix *from_matrix, hypre_StructMatrix *to_matrix ) { hypre_CommInfo *comm_info; hypre_CommPkg *comm_pkg; hypre_CommHandle *comm_handle; HYPRE_Int constant_coefficient, comm_num_values; HYPRE_Int stencil_size, mat_num_values; hypre_StructStencil *stencil; HYPRE_Complex *matrix_data_from = hypre_StructMatrixData(from_matrix); HYPRE_Complex *matrix_data_to = hypre_StructMatrixData(to_matrix); HYPRE_Complex *matrix_data_comm_from = matrix_data_from; HYPRE_Complex *matrix_data_comm_to = matrix_data_to; /*------------------------------------------------------ * Set up hypre_CommPkg *------------------------------------------------------*/ constant_coefficient = hypre_StructMatrixConstantCoefficient( from_matrix ); hypre_assert( constant_coefficient == hypre_StructMatrixConstantCoefficient( to_matrix ) ); mat_num_values = hypre_StructMatrixNumValues(from_matrix); hypre_assert( mat_num_values == hypre_StructMatrixNumValues(to_matrix) ); if ( constant_coefficient == 0 ) { comm_num_values = mat_num_values; } else if ( constant_coefficient == 1 ) { comm_num_values = 0; } else /* constant_coefficient==2 */ { comm_num_values = 1; stencil = hypre_StructMatrixStencil(from_matrix); stencil_size = hypre_StructStencilSize(stencil); hypre_assert(stencil_size == hypre_StructStencilSize( hypre_StructMatrixStencil(to_matrix) ) ); #if 0 //defined(HYPRE_USING_CUDA) || defined(HYPRE_USING_HIP) if (hypre_StructGridDataLocation(hypre_StructMatrixGrid(from_matrix)) == HYPRE_MEMORY_HOST) { stencil = hypre_StructMatrixStencil(from_matrix); stencil_size = hypre_StructStencilSize(stencil); matrix_data_comm_from = hypre_StructMatrixDataConst(from_matrix) + stencil_size; stencil = hypre_StructMatrixStencil(to_matrix); stencil_size = hypre_StructStencilSize(stencil); matrix_data_comm_to = hypre_StructMatrixDataConst(to_matrix) + stencil_size; } #endif } hypre_CreateCommInfoFromGrids(hypre_StructMatrixGrid(from_matrix), hypre_StructMatrixGrid(to_matrix), &comm_info); hypre_CommPkgCreate(comm_info, hypre_StructMatrixDataSpace(from_matrix), hypre_StructMatrixDataSpace(to_matrix), comm_num_values, NULL, 0, hypre_StructMatrixComm(from_matrix), &comm_pkg); hypre_CommInfoDestroy(comm_info); /* is this correct for periodic? */ /*----------------------------------------------------------------------- * Migrate the matrix data *-----------------------------------------------------------------------*/ if ( constant_coefficient != 1 ) { hypre_InitializeCommunication( comm_pkg, matrix_data_comm_from, matrix_data_comm_to, 0, 0, &comm_handle ); hypre_FinalizeCommunication( comm_handle ); } hypre_CommPkgDestroy(comm_pkg); return hypre_error_flag; } /*-------------------------------------------------------------------------- * clears matrix stencil coefficients reaching outside of the physical boundaries *--------------------------------------------------------------------------*/ HYPRE_Int hypre_StructMatrixClearBoundary( hypre_StructMatrix *matrix) { HYPRE_Int ndim = hypre_StructMatrixNDim(matrix); HYPRE_Complex *data; hypre_BoxArray *grid_boxes; hypre_BoxArray *data_space; /*hypre_Box *box;*/ hypre_Box *grid_box; hypre_Box *data_box; hypre_Box *tmp_box; hypre_Index *shape; hypre_Index stencil_element; hypre_Index loop_size; hypre_IndexRef start; hypre_Index stride; hypre_StructGrid *grid; hypre_StructStencil *stencil; hypre_BoxArray *boundary; HYPRE_Int i, i2, j; /*----------------------------------------------------------------------- * Set the matrix coefficients *-----------------------------------------------------------------------*/ grid = hypre_StructMatrixGrid(matrix); stencil = hypre_StructMatrixStencil(matrix); grid_boxes = hypre_StructGridBoxes(grid); ndim = hypre_StructStencilNDim(stencil); data_space = hypre_StructMatrixDataSpace(matrix); hypre_SetIndex(stride, 1); shape = hypre_StructStencilShape(stencil); for (j = 0; j < hypre_StructStencilSize(stencil); j++) { hypre_CopyIndex(shape[j], stencil_element); if (!hypre_IndexEqual(stencil_element, 0, ndim)) { hypre_ForBoxI(i, grid_boxes) { grid_box = hypre_BoxArrayBox(grid_boxes, i); data_box = hypre_BoxArrayBox(data_space, i); boundary = hypre_BoxArrayCreate( 0, ndim ); hypre_GeneralBoxBoundaryIntersect(grid_box, grid, stencil_element, boundary); data = hypre_StructMatrixBoxData(matrix, i, j); hypre_ForBoxI(i2, boundary) { tmp_box = hypre_BoxArrayBox(boundary, i2); hypre_BoxGetSize(tmp_box, loop_size); start = hypre_BoxIMin(tmp_box); #define DEVICE_VAR is_device_ptr(data) hypre_BoxLoop1Begin(ndim, loop_size, data_box, start, stride, ixyz); { data[ixyz] = 0.0; } hypre_BoxLoop1End(ixyz); #undef DEVICE_VAR } hypre_BoxArrayDestroy(boundary); } } } return hypre_error_flag; } hypre-2.33.0/src/struct_mv/struct_matrix.h000066400000000000000000000127211477326011500206350ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * Header info for the hypre_StructMatrix structures * *****************************************************************************/ #ifndef hypre_STRUCT_MATRIX_HEADER #define hypre_STRUCT_MATRIX_HEADER /*-------------------------------------------------------------------------- * hypre_StructMatrix: *--------------------------------------------------------------------------*/ typedef struct hypre_StructMatrix_struct { MPI_Comm comm; hypre_StructGrid *grid; hypre_StructStencil *user_stencil; hypre_StructStencil *stencil; HYPRE_Int num_values; /* Number of "stored" coefficients */ hypre_BoxArray *data_space; HYPRE_MemoryLocation memory_location; /* memory location of data */ HYPRE_Complex *data; /* Pointer to variable matrix data */ HYPRE_Complex *data_const; /* Pointer to constant matrix data */ HYPRE_Complex **stencil_data; /* Pointer for each stencil */ HYPRE_Int data_alloced; /* Boolean used for freeing data */ HYPRE_Int data_size; /* Size of variable matrix data */ HYPRE_Int data_const_size; /* Size of constant matrix data */ HYPRE_Int **data_indices; /* num-boxes by stencil-size array of indices into the data array. data_indices[b][s] is the starting index of matrix data corresponding to box b and stencil coefficient s */ HYPRE_Int constant_coefficient; /* normally 0; set to 1 for constant coefficient matrices or 2 for constant coefficient with variable diagonal */ HYPRE_Int symmetric; /* Is the matrix symmetric */ HYPRE_Int *symm_elements; /* Which elements are "symmetric" */ HYPRE_Int num_ghost[2 * HYPRE_MAXDIM]; /* Num ghost layers in each direction */ HYPRE_BigInt global_size; /* Total number of nonzero coeffs */ hypre_CommPkg *comm_pkg; /* Info on how to update ghost data */ HYPRE_Int ref_count; } hypre_StructMatrix; /*-------------------------------------------------------------------------- * Accessor macros: hypre_StructMatrix *--------------------------------------------------------------------------*/ #define hypre_StructMatrixComm(matrix) ((matrix) -> comm) #define hypre_StructMatrixGrid(matrix) ((matrix) -> grid) #define hypre_StructMatrixUserStencil(matrix) ((matrix) -> user_stencil) #define hypre_StructMatrixStencil(matrix) ((matrix) -> stencil) #define hypre_StructMatrixNumValues(matrix) ((matrix) -> num_values) #define hypre_StructMatrixDataSpace(matrix) ((matrix) -> data_space) #define hypre_StructMatrixMemoryLocation(matrix) ((matrix) -> memory_location) #define hypre_StructMatrixData(matrix) ((matrix) -> data) #define hypre_StructMatrixDataConst(matrix) ((matrix) -> data_const) #define hypre_StructMatrixStencilData(matrix) ((matrix) -> stencil_data) #define hypre_StructMatrixDataAlloced(matrix) ((matrix) -> data_alloced) #define hypre_StructMatrixDataSize(matrix) ((matrix) -> data_size) #define hypre_StructMatrixDataConstSize(matrix) ((matrix) -> data_const_size) #define hypre_StructMatrixDataIndices(matrix) ((matrix) -> data_indices) #define hypre_StructMatrixConstantCoefficient(matrix) ((matrix) -> constant_coefficient) #define hypre_StructMatrixSymmetric(matrix) ((matrix) -> symmetric) #define hypre_StructMatrixSymmElements(matrix) ((matrix) -> symm_elements) #define hypre_StructMatrixNumGhost(matrix) ((matrix) -> num_ghost) #define hypre_StructMatrixGlobalSize(matrix) ((matrix) -> global_size) #define hypre_StructMatrixCommPkg(matrix) ((matrix) -> comm_pkg) #define hypre_StructMatrixRefCount(matrix) ((matrix) -> ref_count) #define hypre_StructMatrixNDim(matrix) \ hypre_StructGridNDim(hypre_StructMatrixGrid(matrix)) #define hypre_StructMatrixBox(matrix, b) \ hypre_BoxArrayBox(hypre_StructMatrixDataSpace(matrix), b) #define hypre_StructMatrixBoxData(matrix, b, s) \ (hypre_StructMatrixStencilData(matrix)[s] + hypre_StructMatrixDataIndices(matrix)[b][s]) #define hypre_StructMatrixBoxDataValue(matrix, b, s, index) \ (hypre_StructMatrixBoxData(matrix, b, s) + \ hypre_BoxIndexRank(hypre_StructMatrixBox(matrix, b), index)) #define hypre_CCStructMatrixBoxDataValue(matrix, b, s, index) \ (hypre_StructMatrixBoxData(matrix, b, s) + \ hypre_CCBoxIndexRank(hypre_StructMatrixBox(matrix, b), index)) #endif hypre-2.33.0/src/struct_mv/struct_matrix_mask.c000066400000000000000000000130401477326011500216360ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * Member functions for hypre_StructMatrix class. * *****************************************************************************/ #include "_hypre_struct_mv.h" /*-------------------------------------------------------------------------- * hypre_StructMatrixCreateMask * This routine returns the matrix, `mask', containing pointers to * some of the data in the input matrix `matrix'. This can be useful, * for example, to construct "splittings" of a matrix for use in * iterative methods. The key note here is that the matrix `mask' does * NOT contain a copy of the data in `matrix', but it can be used as * if it were a normal StructMatrix object. * * Notes: * (1) Only the stencil, data_indices, and global_size components of the * StructMatrix structure are modified. * (2) PrintStructMatrix will not correctly print the stencil-to-data * correspondence. *--------------------------------------------------------------------------*/ hypre_StructMatrix * hypre_StructMatrixCreateMask( hypre_StructMatrix *matrix, HYPRE_Int num_stencil_indices, HYPRE_Int *stencil_indices ) { HYPRE_Int ndim = hypre_StructMatrixNDim(matrix); hypre_StructMatrix *mask; hypre_StructStencil *stencil; hypre_Index *stencil_shape; HYPRE_Int stencil_size; HYPRE_Complex **stencil_data; hypre_Index *mask_stencil_shape; HYPRE_Int mask_stencil_size; HYPRE_Complex **mask_stencil_data; hypre_BoxArray *data_space; HYPRE_Int **data_indices; HYPRE_Int **mask_data_indices; HYPRE_Int i, j; stencil = hypre_StructMatrixStencil(matrix); stencil_shape = hypre_StructStencilShape(stencil); stencil_size = hypre_StructStencilSize(stencil); stencil_data = hypre_StructMatrixStencilData(matrix); mask = hypre_CTAlloc(hypre_StructMatrix, 1, HYPRE_MEMORY_HOST); hypre_StructMatrixComm(mask) = hypre_StructMatrixComm(matrix); hypre_StructGridRef(hypre_StructMatrixGrid(matrix), &hypre_StructMatrixGrid(mask)); hypre_StructMatrixUserStencil(mask) = hypre_StructStencilRef(hypre_StructMatrixUserStencil(matrix)); mask_stencil_size = num_stencil_indices; mask_stencil_shape = hypre_CTAlloc(hypre_Index, num_stencil_indices, HYPRE_MEMORY_HOST); for (i = 0; i < num_stencil_indices; i++) { hypre_CopyIndex(stencil_shape[stencil_indices[i]], mask_stencil_shape[i]); } hypre_StructMatrixStencil(mask) = hypre_StructStencilCreate(hypre_StructStencilNDim(stencil), mask_stencil_size, mask_stencil_shape); hypre_StructMatrixNumValues(mask) = hypre_StructMatrixNumValues(matrix); hypre_StructMatrixDataSpace(mask) = hypre_BoxArrayDuplicate(hypre_StructMatrixDataSpace(matrix)); hypre_StructMatrixMemoryLocation(mask) = hypre_StructMatrixMemoryLocation(matrix); hypre_StructMatrixData(mask) = hypre_StructMatrixData(matrix); hypre_StructMatrixDataConst(mask) = hypre_StructMatrixDataConst(matrix); hypre_StructMatrixDataAlloced(mask) = 0; hypre_StructMatrixDataSize(mask) = hypre_StructMatrixDataSize(matrix); hypre_StructMatrixDataConstSize(mask) = hypre_StructMatrixDataConstSize(matrix); data_space = hypre_StructMatrixDataSpace(matrix); data_indices = hypre_StructMatrixDataIndices(matrix); mask_data_indices = hypre_CTAlloc(HYPRE_Int *, hypre_BoxArraySize(data_space), HYPRE_MEMORY_HOST); mask_stencil_data = hypre_TAlloc(HYPRE_Complex*, mask_stencil_size, HYPRE_MEMORY_HOST); if (hypre_BoxArraySize(data_space) > 0) { mask_data_indices[0] = hypre_TAlloc(HYPRE_Int, num_stencil_indices * hypre_BoxArraySize(data_space), HYPRE_MEMORY_HOST); } hypre_ForBoxI(i, data_space) { mask_data_indices[i] = mask_data_indices[0] + num_stencil_indices * i; for (j = 0; j < num_stencil_indices; j++) { mask_data_indices[i][j] = data_indices[i][stencil_indices[j]]; } } for (i = 0; i < mask_stencil_size; i++) { mask_stencil_data[i] = stencil_data[stencil_indices[i]]; } hypre_StructMatrixStencilData(mask) = mask_stencil_data; hypre_StructMatrixDataIndices(mask) = mask_data_indices; hypre_StructMatrixSymmetric(mask) = hypre_StructMatrixSymmetric(matrix); hypre_StructMatrixSymmElements(mask) = hypre_TAlloc(HYPRE_Int, stencil_size, HYPRE_MEMORY_HOST); for (i = 0; i < stencil_size; i++) { hypre_StructMatrixSymmElements(mask)[i] = hypre_StructMatrixSymmElements(matrix)[i]; } for (i = 0; i < 2 * ndim; i++) { hypre_StructMatrixNumGhost(mask)[i] = hypre_StructMatrixNumGhost(matrix)[i]; } hypre_StructMatrixGlobalSize(mask) = hypre_StructGridGlobalSize(hypre_StructMatrixGrid(mask)) * mask_stencil_size; hypre_StructMatrixCommPkg(mask) = NULL; hypre_StructMatrixRefCount(mask) = 1; return mask; } hypre-2.33.0/src/struct_mv/struct_matvec.c000066400000000000000000001567251477326011500206200ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * Structured matrix-vector multiply routine * *****************************************************************************/ #include "_hypre_struct_mv.h" #include "_hypre_struct_mv.hpp" /* this currently cannot be greater than 7 */ #ifdef MAX_DEPTH #undef MAX_DEPTH #endif #define MAX_DEPTH 7 /*-------------------------------------------------------------------------- * hypre_StructMatvecData data structure *--------------------------------------------------------------------------*/ typedef struct { hypre_StructMatrix *A; hypre_StructVector *x; hypre_ComputePkg *compute_pkg; } hypre_StructMatvecData; /*-------------------------------------------------------------------------- * hypre_StructMatvecCreate *--------------------------------------------------------------------------*/ void * hypre_StructMatvecCreate( void ) { hypre_StructMatvecData *matvec_data; matvec_data = hypre_CTAlloc(hypre_StructMatvecData, 1, HYPRE_MEMORY_HOST); return (void *) matvec_data; } /*-------------------------------------------------------------------------- * hypre_StructMatvecSetup *--------------------------------------------------------------------------*/ HYPRE_Int hypre_StructMatvecSetup( void *matvec_vdata, hypre_StructMatrix *A, hypre_StructVector *x ) { hypre_StructMatvecData *matvec_data = (hypre_StructMatvecData *)matvec_vdata; hypre_StructGrid *grid; hypre_StructStencil *stencil; hypre_ComputeInfo *compute_info; hypre_ComputePkg *compute_pkg; HYPRE_ANNOTATE_FUNC_BEGIN; /*---------------------------------------------------------- * Set up the compute package *----------------------------------------------------------*/ grid = hypre_StructMatrixGrid(A); stencil = hypre_StructMatrixStencil(A); hypre_CreateComputeInfo(grid, stencil, &compute_info); hypre_ComputePkgCreate(compute_info, hypre_StructVectorDataSpace(x), 1, grid, &compute_pkg); /*---------------------------------------------------------- * Set up the matvec data structure *----------------------------------------------------------*/ (matvec_data -> A) = hypre_StructMatrixRef(A); (matvec_data -> x) = hypre_StructVectorRef(x); (matvec_data -> compute_pkg) = compute_pkg; HYPRE_ANNOTATE_FUNC_END; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_StructMatvecCompute *--------------------------------------------------------------------------*/ HYPRE_Int hypre_StructMatvecCompute( void *matvec_vdata, HYPRE_Complex alpha, hypre_StructMatrix *A, hypre_StructVector *x, HYPRE_Complex beta, hypre_StructVector *y ) { hypre_StructMatvecData *matvec_data = (hypre_StructMatvecData *)matvec_vdata; hypre_ComputePkg *compute_pkg; hypre_CommHandle *comm_handle; hypre_BoxArrayArray *compute_box_aa; hypre_Box *y_data_box; HYPRE_Complex *xp; HYPRE_Complex *yp; hypre_BoxArray *boxes; hypre_Box *box; hypre_Index loop_size; hypre_IndexRef start; hypre_IndexRef stride; HYPRE_Int constant_coefficient; HYPRE_Complex temp; HYPRE_Int compute_i, i; hypre_StructVector *x_tmp = NULL; /*----------------------------------------------------------------------- * Initialize some things *-----------------------------------------------------------------------*/ HYPRE_ANNOTATE_FUNC_BEGIN; constant_coefficient = hypre_StructMatrixConstantCoefficient(A); if (constant_coefficient) { hypre_StructVectorClearBoundGhostValues(x, 0); } compute_pkg = (matvec_data -> compute_pkg); stride = hypre_ComputePkgStride(compute_pkg); /*----------------------------------------------------------------------- * Do (alpha == 0.0) computation *-----------------------------------------------------------------------*/ if (alpha == 0.0) { boxes = hypre_StructGridBoxes(hypre_StructMatrixGrid(A)); hypre_ForBoxI(i, boxes) { box = hypre_BoxArrayBox(boxes, i); start = hypre_BoxIMin(box); y_data_box = hypre_BoxArrayBox(hypre_StructVectorDataSpace(y), i); yp = hypre_StructVectorBoxData(y, i); hypre_BoxGetSize(box, loop_size); #define DEVICE_VAR is_device_ptr(yp) hypre_BoxLoop1Begin(hypre_StructVectorNDim(x), loop_size, y_data_box, start, stride, yi); { yp[yi] *= beta; } hypre_BoxLoop1End(yi); #undef DEVICE_VAR } return hypre_error_flag; } if (x == y) { x_tmp = hypre_StructVectorClone(y); x = x_tmp; } /*----------------------------------------------------------------------- * Do (alpha != 0.0) computation *-----------------------------------------------------------------------*/ for (compute_i = 0; compute_i < 2; compute_i++) { switch (compute_i) { case 0: { xp = hypre_StructVectorData(x); hypre_InitializeIndtComputations(compute_pkg, xp, &comm_handle); compute_box_aa = hypre_ComputePkgIndtBoxes(compute_pkg); /*-------------------------------------------------------------- * initialize y= (beta/alpha)*y normally (where everything * is multiplied by alpha at the end), * beta*y for constant coefficient (where only Ax gets multiplied by alpha) *--------------------------------------------------------------*/ if ( constant_coefficient == 1 ) { temp = beta; } else { temp = beta / alpha; } if (temp != 1.0) { boxes = hypre_StructGridBoxes(hypre_StructMatrixGrid(A)); hypre_ForBoxI(i, boxes) { box = hypre_BoxArrayBox(boxes, i); start = hypre_BoxIMin(box); y_data_box = hypre_BoxArrayBox(hypre_StructVectorDataSpace(y), i); yp = hypre_StructVectorBoxData(y, i); #define DEVICE_VAR is_device_ptr(yp) if (temp == 0.0) { hypre_BoxGetSize(box, loop_size); hypre_BoxLoop1Begin(hypre_StructVectorNDim(x), loop_size, y_data_box, start, stride, yi); { yp[yi] = 0.0; } hypre_BoxLoop1End(yi); } else { hypre_BoxGetSize(box, loop_size); hypre_BoxLoop1Begin(hypre_StructVectorNDim(x), loop_size, y_data_box, start, stride, yi); { yp[yi] *= temp; } hypre_BoxLoop1End(yi); } #undef DEVICE_VAR } } } break; case 1: { hypre_FinalizeIndtComputations(comm_handle); compute_box_aa = hypre_ComputePkgDeptBoxes(compute_pkg); } break; } /*-------------------------------------------------------------------- * y += A*x *--------------------------------------------------------------------*/ switch ( constant_coefficient ) { case 0: { hypre_StructMatvecCC0( alpha, A, x, y, compute_box_aa, stride ); break; } case 1: { hypre_StructMatvecCC1( alpha, A, x, y, compute_box_aa, stride ); break; } case 2: { hypre_StructMatvecCC2( alpha, A, x, y, compute_box_aa, stride ); break; } } } if (x_tmp) { hypre_StructVectorDestroy(x_tmp); x = y; } HYPRE_ANNOTATE_FUNC_END; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_StructMatvecCC0 * core of struct matvec computation, for the case constant_coefficient==0 * (all coefficients are variable) *--------------------------------------------------------------------------*/ HYPRE_Int hypre_StructMatvecCC0( HYPRE_Complex alpha, hypre_StructMatrix *A, hypre_StructVector *x, hypre_StructVector *y, hypre_BoxArrayArray *compute_box_aa, hypre_IndexRef stride ) { HYPRE_Int i, j, si; HYPRE_Complex *Ap0; HYPRE_Complex *Ap1; HYPRE_Complex *Ap2; HYPRE_Complex *Ap3; HYPRE_Complex *Ap4; HYPRE_Complex *Ap5; HYPRE_Complex *Ap6; HYPRE_Int xoff0; HYPRE_Int xoff1; HYPRE_Int xoff2; HYPRE_Int xoff3; HYPRE_Int xoff4; HYPRE_Int xoff5; HYPRE_Int xoff6; hypre_BoxArray *compute_box_a; hypre_Box *compute_box; hypre_Box *A_data_box; hypre_Box *x_data_box; hypre_StructStencil *stencil; hypre_Index *stencil_shape; HYPRE_Int stencil_size; hypre_Box *y_data_box; HYPRE_Complex *xp; HYPRE_Complex *yp; HYPRE_Int depth; hypre_Index loop_size; hypre_IndexRef start; HYPRE_Int ndim; stencil = hypre_StructMatrixStencil(A); stencil_shape = hypre_StructStencilShape(stencil); stencil_size = hypre_StructStencilSize(stencil); ndim = hypre_StructVectorNDim(x); hypre_ForBoxArrayI(i, compute_box_aa) { compute_box_a = hypre_BoxArrayArrayBoxArray(compute_box_aa, i); A_data_box = hypre_BoxArrayBox(hypre_StructMatrixDataSpace(A), i); x_data_box = hypre_BoxArrayBox(hypre_StructVectorDataSpace(x), i); y_data_box = hypre_BoxArrayBox(hypre_StructVectorDataSpace(y), i); xp = hypre_StructVectorBoxData(x, i); yp = hypre_StructVectorBoxData(y, i); hypre_ForBoxI(j, compute_box_a) { compute_box = hypre_BoxArrayBox(compute_box_a, j); hypre_BoxGetSize(compute_box, loop_size); start = hypre_BoxIMin(compute_box); /* unroll up to depth MAX_DEPTH */ for (si = 0; si < stencil_size; si += MAX_DEPTH) { depth = hypre_min(MAX_DEPTH, (stencil_size - si)); switch (depth) { case 7: Ap0 = hypre_StructMatrixBoxData(A, i, si + 0); Ap1 = hypre_StructMatrixBoxData(A, i, si + 1); Ap2 = hypre_StructMatrixBoxData(A, i, si + 2); Ap3 = hypre_StructMatrixBoxData(A, i, si + 3); Ap4 = hypre_StructMatrixBoxData(A, i, si + 4); Ap5 = hypre_StructMatrixBoxData(A, i, si + 5); Ap6 = hypre_StructMatrixBoxData(A, i, si + 6); xoff0 = hypre_BoxOffsetDistance(x_data_box, stencil_shape[si + 0]); xoff1 = hypre_BoxOffsetDistance(x_data_box, stencil_shape[si + 1]); xoff2 = hypre_BoxOffsetDistance(x_data_box, stencil_shape[si + 2]); xoff3 = hypre_BoxOffsetDistance(x_data_box, stencil_shape[si + 3]); xoff4 = hypre_BoxOffsetDistance(x_data_box, stencil_shape[si + 4]); xoff5 = hypre_BoxOffsetDistance(x_data_box, stencil_shape[si + 5]); xoff6 = hypre_BoxOffsetDistance(x_data_box, stencil_shape[si + 6]); #define DEVICE_VAR is_device_ptr(yp,Ap0,Ap1,Ap2,Ap3,Ap4,Ap5,Ap6,xp) hypre_BoxLoop3Begin(ndim, loop_size, A_data_box, start, stride, Ai, x_data_box, start, stride, xi, y_data_box, start, stride, yi); { yp[yi] += Ap0[Ai] * xp[xi + xoff0] + Ap1[Ai] * xp[xi + xoff1] + Ap2[Ai] * xp[xi + xoff2] + Ap3[Ai] * xp[xi + xoff3] + Ap4[Ai] * xp[xi + xoff4] + Ap5[Ai] * xp[xi + xoff5] + Ap6[Ai] * xp[xi + xoff6]; } hypre_BoxLoop3End(Ai, xi, yi); #undef DEVICE_VAR break; case 6: Ap0 = hypre_StructMatrixBoxData(A, i, si + 0); Ap1 = hypre_StructMatrixBoxData(A, i, si + 1); Ap2 = hypre_StructMatrixBoxData(A, i, si + 2); Ap3 = hypre_StructMatrixBoxData(A, i, si + 3); Ap4 = hypre_StructMatrixBoxData(A, i, si + 4); Ap5 = hypre_StructMatrixBoxData(A, i, si + 5); xoff0 = hypre_BoxOffsetDistance(x_data_box, stencil_shape[si + 0]); xoff1 = hypre_BoxOffsetDistance(x_data_box, stencil_shape[si + 1]); xoff2 = hypre_BoxOffsetDistance(x_data_box, stencil_shape[si + 2]); xoff3 = hypre_BoxOffsetDistance(x_data_box, stencil_shape[si + 3]); xoff4 = hypre_BoxOffsetDistance(x_data_box, stencil_shape[si + 4]); xoff5 = hypre_BoxOffsetDistance(x_data_box, stencil_shape[si + 5]); #define DEVICE_VAR is_device_ptr(yp,Ap0,Ap1,Ap2,Ap3,Ap4,Ap5,xp) hypre_BoxLoop3Begin(ndim, loop_size, A_data_box, start, stride, Ai, x_data_box, start, stride, xi, y_data_box, start, stride, yi); { yp[yi] += Ap0[Ai] * xp[xi + xoff0] + Ap1[Ai] * xp[xi + xoff1] + Ap2[Ai] * xp[xi + xoff2] + Ap3[Ai] * xp[xi + xoff3] + Ap4[Ai] * xp[xi + xoff4] + Ap5[Ai] * xp[xi + xoff5]; } hypre_BoxLoop3End(Ai, xi, yi); #undef DEVICE_VAR break; case 5: Ap0 = hypre_StructMatrixBoxData(A, i, si + 0); Ap1 = hypre_StructMatrixBoxData(A, i, si + 1); Ap2 = hypre_StructMatrixBoxData(A, i, si + 2); Ap3 = hypre_StructMatrixBoxData(A, i, si + 3); Ap4 = hypre_StructMatrixBoxData(A, i, si + 4); xoff0 = hypre_BoxOffsetDistance(x_data_box, stencil_shape[si + 0]); xoff1 = hypre_BoxOffsetDistance(x_data_box, stencil_shape[si + 1]); xoff2 = hypre_BoxOffsetDistance(x_data_box, stencil_shape[si + 2]); xoff3 = hypre_BoxOffsetDistance(x_data_box, stencil_shape[si + 3]); xoff4 = hypre_BoxOffsetDistance(x_data_box, stencil_shape[si + 4]); #define DEVICE_VAR is_device_ptr(yp,Ap0,Ap1,Ap2,Ap3,Ap4,xp) hypre_BoxLoop3Begin(ndim, loop_size, A_data_box, start, stride, Ai, x_data_box, start, stride, xi, y_data_box, start, stride, yi); { yp[yi] += Ap0[Ai] * xp[xi + xoff0] + Ap1[Ai] * xp[xi + xoff1] + Ap2[Ai] * xp[xi + xoff2] + Ap3[Ai] * xp[xi + xoff3] + Ap4[Ai] * xp[xi + xoff4]; } hypre_BoxLoop3End(Ai, xi, yi); #undef DEVICE_VAR break; case 4: Ap0 = hypre_StructMatrixBoxData(A, i, si + 0); Ap1 = hypre_StructMatrixBoxData(A, i, si + 1); Ap2 = hypre_StructMatrixBoxData(A, i, si + 2); Ap3 = hypre_StructMatrixBoxData(A, i, si + 3); xoff0 = hypre_BoxOffsetDistance(x_data_box, stencil_shape[si + 0]); xoff1 = hypre_BoxOffsetDistance(x_data_box, stencil_shape[si + 1]); xoff2 = hypre_BoxOffsetDistance(x_data_box, stencil_shape[si + 2]); xoff3 = hypre_BoxOffsetDistance(x_data_box, stencil_shape[si + 3]); #define DEVICE_VAR is_device_ptr(yp,Ap0,Ap1,Ap2,Ap3,xp) hypre_BoxLoop3Begin(ndim, loop_size, A_data_box, start, stride, Ai, x_data_box, start, stride, xi, y_data_box, start, stride, yi); { yp[yi] += Ap0[Ai] * xp[xi + xoff0] + Ap1[Ai] * xp[xi + xoff1] + Ap2[Ai] * xp[xi + xoff2] + Ap3[Ai] * xp[xi + xoff3]; } hypre_BoxLoop3End(Ai, xi, yi); #undef DEVICE_VAR break; case 3: Ap0 = hypre_StructMatrixBoxData(A, i, si + 0); Ap1 = hypre_StructMatrixBoxData(A, i, si + 1); Ap2 = hypre_StructMatrixBoxData(A, i, si + 2); xoff0 = hypre_BoxOffsetDistance(x_data_box, stencil_shape[si + 0]); xoff1 = hypre_BoxOffsetDistance(x_data_box, stencil_shape[si + 1]); xoff2 = hypre_BoxOffsetDistance(x_data_box, stencil_shape[si + 2]); #define DEVICE_VAR is_device_ptr(yp,Ap0,Ap1,Ap2,xp) hypre_BoxLoop3Begin(ndim, loop_size, A_data_box, start, stride, Ai, x_data_box, start, stride, xi, y_data_box, start, stride, yi); { yp[yi] += Ap0[Ai] * xp[xi + xoff0] + Ap1[Ai] * xp[xi + xoff1] + Ap2[Ai] * xp[xi + xoff2]; } hypre_BoxLoop3End(Ai, xi, yi); #undef DEVICE_VAR break; case 2: Ap0 = hypre_StructMatrixBoxData(A, i, si + 0); Ap1 = hypre_StructMatrixBoxData(A, i, si + 1); xoff0 = hypre_BoxOffsetDistance(x_data_box, stencil_shape[si + 0]); xoff1 = hypre_BoxOffsetDistance(x_data_box, stencil_shape[si + 1]); #define DEVICE_VAR is_device_ptr(yp,Ap0,Ap1,xp) hypre_BoxLoop3Begin(ndim, loop_size, A_data_box, start, stride, Ai, x_data_box, start, stride, xi, y_data_box, start, stride, yi); { yp[yi] += Ap0[Ai] * xp[xi + xoff0] + Ap1[Ai] * xp[xi + xoff1]; } hypre_BoxLoop3End(Ai, xi, yi); #undef DEVICE_VAR break; case 1: Ap0 = hypre_StructMatrixBoxData(A, i, si + 0); xoff0 = hypre_BoxOffsetDistance(x_data_box, stencil_shape[si + 0]); #define DEVICE_VAR is_device_ptr(yp,Ap0,xp) hypre_BoxLoop3Begin(ndim, loop_size, A_data_box, start, stride, Ai, x_data_box, start, stride, xi, y_data_box, start, stride, yi); { yp[yi] += Ap0[Ai] * xp[xi + xoff0]; } hypre_BoxLoop3End(Ai, xi, yi); #undef DEVICE_VAR break; } } if (alpha != 1.0) { #define DEVICE_VAR is_device_ptr(yp) hypre_BoxLoop1Begin(ndim, loop_size, y_data_box, start, stride, yi); { yp[yi] *= alpha; } hypre_BoxLoop1End(yi); #undef DEVICE_VAR } } } return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_StructMatvecCC1 * core of struct matvec computation, for the case constant_coefficient==1 *--------------------------------------------------------------------------*/ HYPRE_Int hypre_StructMatvecCC1( HYPRE_Complex alpha, hypre_StructMatrix *A, hypre_StructVector *x, hypre_StructVector *y, hypre_BoxArrayArray *compute_box_aa, hypre_IndexRef stride ) { HYPRE_Int i, j, si; HYPRE_Complex *Ap0; HYPRE_Complex *Ap1; HYPRE_Complex *Ap2; HYPRE_Complex *Ap3; HYPRE_Complex *Ap4; HYPRE_Complex *Ap5; HYPRE_Complex *Ap6; HYPRE_Complex AAp0; HYPRE_Complex AAp1; HYPRE_Complex AAp2; HYPRE_Complex AAp3; HYPRE_Complex AAp4; HYPRE_Complex AAp5; HYPRE_Complex AAp6; HYPRE_Int xoff0; HYPRE_Int xoff1; HYPRE_Int xoff2; HYPRE_Int xoff3; HYPRE_Int xoff4; HYPRE_Int xoff5; HYPRE_Int xoff6; HYPRE_Int Ai; hypre_BoxArray *compute_box_a; hypre_Box *compute_box; hypre_Box *x_data_box; hypre_StructStencil *stencil; hypre_Index *stencil_shape; HYPRE_Int stencil_size; hypre_Box *y_data_box; HYPRE_Complex *xp; HYPRE_Complex *yp; HYPRE_Int depth; hypre_Index loop_size; hypre_IndexRef start; HYPRE_Int ndim; stencil = hypre_StructMatrixStencil(A); stencil_shape = hypre_StructStencilShape(stencil); stencil_size = hypre_StructStencilSize(stencil); ndim = hypre_StructVectorNDim(x); hypre_ForBoxArrayI(i, compute_box_aa) { compute_box_a = hypre_BoxArrayArrayBoxArray(compute_box_aa, i); x_data_box = hypre_BoxArrayBox(hypre_StructVectorDataSpace(x), i); y_data_box = hypre_BoxArrayBox(hypre_StructVectorDataSpace(y), i); xp = hypre_StructVectorBoxData(x, i); yp = hypre_StructVectorBoxData(y, i); hypre_ForBoxI(j, compute_box_a) { compute_box = hypre_BoxArrayBox(compute_box_a, j); hypre_BoxGetSize(compute_box, loop_size); start = hypre_BoxIMin(compute_box); Ai = 0; /* unroll up to depth MAX_DEPTH */ for (si = 0; si < stencil_size; si += MAX_DEPTH) { depth = hypre_min(MAX_DEPTH, (stencil_size - si)); switch (depth) { case 7: Ap0 = hypre_StructMatrixBoxData(A, i, si + 0); Ap1 = hypre_StructMatrixBoxData(A, i, si + 1); Ap2 = hypre_StructMatrixBoxData(A, i, si + 2); Ap3 = hypre_StructMatrixBoxData(A, i, si + 3); Ap4 = hypre_StructMatrixBoxData(A, i, si + 4); Ap5 = hypre_StructMatrixBoxData(A, i, si + 5); Ap6 = hypre_StructMatrixBoxData(A, i, si + 6); AAp0 = Ap0[Ai] * alpha; AAp1 = Ap1[Ai] * alpha; AAp2 = Ap2[Ai] * alpha; AAp3 = Ap3[Ai] * alpha; AAp4 = Ap4[Ai] * alpha; AAp5 = Ap5[Ai] * alpha; AAp6 = Ap6[Ai] * alpha; xoff0 = hypre_BoxOffsetDistance(x_data_box, stencil_shape[si + 0]); xoff1 = hypre_BoxOffsetDistance(x_data_box, stencil_shape[si + 1]); xoff2 = hypre_BoxOffsetDistance(x_data_box, stencil_shape[si + 2]); xoff3 = hypre_BoxOffsetDistance(x_data_box, stencil_shape[si + 3]); xoff4 = hypre_BoxOffsetDistance(x_data_box, stencil_shape[si + 4]); xoff5 = hypre_BoxOffsetDistance(x_data_box, stencil_shape[si + 5]); xoff6 = hypre_BoxOffsetDistance(x_data_box, stencil_shape[si + 6]); #define DEVICE_VAR is_device_ptr(yp,xp) hypre_BoxLoop2Begin(ndim, loop_size, x_data_box, start, stride, xi, y_data_box, start, stride, yi); { yp[yi] += AAp0 * xp[xi + xoff0] + AAp1 * xp[xi + xoff1] + AAp2 * xp[xi + xoff2] + AAp3 * xp[xi + xoff3] + AAp4 * xp[xi + xoff4] + AAp5 * xp[xi + xoff5] + AAp6 * xp[xi + xoff6]; } hypre_BoxLoop2End(xi, yi); #undef DEVICE_VAR break; case 6: Ap0 = hypre_StructMatrixBoxData(A, i, si + 0); Ap1 = hypre_StructMatrixBoxData(A, i, si + 1); Ap2 = hypre_StructMatrixBoxData(A, i, si + 2); Ap3 = hypre_StructMatrixBoxData(A, i, si + 3); Ap4 = hypre_StructMatrixBoxData(A, i, si + 4); Ap5 = hypre_StructMatrixBoxData(A, i, si + 5); AAp0 = Ap0[Ai] * alpha; AAp1 = Ap1[Ai] * alpha; AAp2 = Ap2[Ai] * alpha; AAp3 = Ap3[Ai] * alpha; AAp4 = Ap4[Ai] * alpha; AAp5 = Ap5[Ai] * alpha; xoff0 = hypre_BoxOffsetDistance(x_data_box, stencil_shape[si + 0]); xoff1 = hypre_BoxOffsetDistance(x_data_box, stencil_shape[si + 1]); xoff2 = hypre_BoxOffsetDistance(x_data_box, stencil_shape[si + 2]); xoff3 = hypre_BoxOffsetDistance(x_data_box, stencil_shape[si + 3]); xoff4 = hypre_BoxOffsetDistance(x_data_box, stencil_shape[si + 4]); xoff5 = hypre_BoxOffsetDistance(x_data_box, stencil_shape[si + 5]); #define DEVICE_VAR is_device_ptr(yp,xp) hypre_BoxLoop2Begin(ndim, loop_size, x_data_box, start, stride, xi, y_data_box, start, stride, yi); { yp[yi] += AAp0 * xp[xi + xoff0] + AAp1 * xp[xi + xoff1] + AAp2 * xp[xi + xoff2] + AAp3 * xp[xi + xoff3] + AAp4 * xp[xi + xoff4] + AAp5 * xp[xi + xoff5]; } hypre_BoxLoop2End(xi, yi); #undef DEVICE_VAR break; case 5: Ap0 = hypre_StructMatrixBoxData(A, i, si + 0); Ap1 = hypre_StructMatrixBoxData(A, i, si + 1); Ap2 = hypre_StructMatrixBoxData(A, i, si + 2); Ap3 = hypre_StructMatrixBoxData(A, i, si + 3); Ap4 = hypre_StructMatrixBoxData(A, i, si + 4); AAp0 = Ap0[Ai] * alpha; AAp1 = Ap1[Ai] * alpha; AAp2 = Ap2[Ai] * alpha; AAp3 = Ap3[Ai] * alpha; AAp4 = Ap4[Ai] * alpha; xoff0 = hypre_BoxOffsetDistance(x_data_box, stencil_shape[si + 0]); xoff1 = hypre_BoxOffsetDistance(x_data_box, stencil_shape[si + 1]); xoff2 = hypre_BoxOffsetDistance(x_data_box, stencil_shape[si + 2]); xoff3 = hypre_BoxOffsetDistance(x_data_box, stencil_shape[si + 3]); xoff4 = hypre_BoxOffsetDistance(x_data_box, stencil_shape[si + 4]); #define DEVICE_VAR is_device_ptr(yp,xp) hypre_BoxLoop2Begin(ndim, loop_size, x_data_box, start, stride, xi, y_data_box, start, stride, yi); { yp[yi] += AAp0 * xp[xi + xoff0] + AAp1 * xp[xi + xoff1] + AAp2 * xp[xi + xoff2] + AAp3 * xp[xi + xoff3] + AAp4 * xp[xi + xoff4]; } hypre_BoxLoop2End(xi, yi); #undef DEVICE_VAR break; case 4: Ap0 = hypre_StructMatrixBoxData(A, i, si + 0); Ap1 = hypre_StructMatrixBoxData(A, i, si + 1); Ap2 = hypre_StructMatrixBoxData(A, i, si + 2); Ap3 = hypre_StructMatrixBoxData(A, i, si + 3); AAp0 = Ap0[Ai] * alpha; AAp1 = Ap1[Ai] * alpha; AAp2 = Ap2[Ai] * alpha; AAp3 = Ap3[Ai] * alpha; xoff0 = hypre_BoxOffsetDistance(x_data_box, stencil_shape[si + 0]); xoff1 = hypre_BoxOffsetDistance(x_data_box, stencil_shape[si + 1]); xoff2 = hypre_BoxOffsetDistance(x_data_box, stencil_shape[si + 2]); xoff3 = hypre_BoxOffsetDistance(x_data_box, stencil_shape[si + 3]); #define DEVICE_VAR is_device_ptr(yp,xp) hypre_BoxLoop2Begin(ndim, loop_size, x_data_box, start, stride, xi, y_data_box, start, stride, yi); { yp[yi] += AAp0 * xp[xi + xoff0] + AAp1 * xp[xi + xoff1] + AAp2 * xp[xi + xoff2] + AAp3 * xp[xi + xoff3]; } hypre_BoxLoop2End(xi, yi); #undef DEVICE_VAR break; case 3: Ap0 = hypre_StructMatrixBoxData(A, i, si + 0); Ap1 = hypre_StructMatrixBoxData(A, i, si + 1); Ap2 = hypre_StructMatrixBoxData(A, i, si + 2); AAp0 = Ap0[Ai] * alpha; AAp1 = Ap1[Ai] * alpha; AAp2 = Ap2[Ai] * alpha; xoff0 = hypre_BoxOffsetDistance(x_data_box, stencil_shape[si + 0]); xoff1 = hypre_BoxOffsetDistance(x_data_box, stencil_shape[si + 1]); xoff2 = hypre_BoxOffsetDistance(x_data_box, stencil_shape[si + 2]); #define DEVICE_VAR is_device_ptr(yp,xp) hypre_BoxLoop2Begin(ndim, loop_size, x_data_box, start, stride, xi, y_data_box, start, stride, yi); { yp[yi] += AAp0 * xp[xi + xoff0] + AAp1 * xp[xi + xoff1] + AAp2 * xp[xi + xoff2]; } hypre_BoxLoop2End(xi, yi); #undef DEVICE_VAR break; case 2: Ap0 = hypre_StructMatrixBoxData(A, i, si + 0); Ap1 = hypre_StructMatrixBoxData(A, i, si + 1); AAp0 = Ap0[Ai] * alpha; AAp1 = Ap1[Ai] * alpha; xoff0 = hypre_BoxOffsetDistance(x_data_box, stencil_shape[si + 0]); xoff1 = hypre_BoxOffsetDistance(x_data_box, stencil_shape[si + 1]); #define DEVICE_VAR is_device_ptr(yp,xp) hypre_BoxLoop2Begin(ndim, loop_size, x_data_box, start, stride, xi, y_data_box, start, stride, yi); { yp[yi] += AAp0 * xp[xi + xoff0] + AAp1 * xp[xi + xoff1]; } hypre_BoxLoop2End(xi, yi); #undef DEVICE_VAR break; case 1: Ap0 = hypre_StructMatrixBoxData(A, i, si + 0); AAp0 = Ap0[Ai] * alpha; xoff0 = hypre_BoxOffsetDistance(x_data_box, stencil_shape[si + 0]); #define DEVICE_VAR is_device_ptr(yp,xp) hypre_BoxLoop2Begin(ndim, loop_size, x_data_box, start, stride, xi, y_data_box, start, stride, yi); { yp[yi] += AAp0 * xp[xi + xoff0]; } hypre_BoxLoop2End(xi, yi); #undef DEVICE_VAR } } } } return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_StructMatvecCC2 * core of struct matvec computation, for the case constant_coefficient==2 *--------------------------------------------------------------------------*/ HYPRE_Int hypre_StructMatvecCC2( HYPRE_Complex alpha, hypre_StructMatrix *A, hypre_StructVector *x, hypre_StructVector *y, hypre_BoxArrayArray *compute_box_aa, hypre_IndexRef stride ) { HYPRE_Int i, j, si; HYPRE_Complex *Ap0; HYPRE_Complex *Ap1; HYPRE_Complex *Ap2; HYPRE_Complex *Ap3; HYPRE_Complex *Ap4; HYPRE_Complex *Ap5; HYPRE_Complex *Ap6; HYPRE_Complex AAp0; HYPRE_Complex AAp1; HYPRE_Complex AAp2; HYPRE_Complex AAp3; HYPRE_Complex AAp4; HYPRE_Complex AAp5; HYPRE_Complex AAp6; HYPRE_Int xoff0; HYPRE_Int xoff1; HYPRE_Int xoff2; HYPRE_Int xoff3; HYPRE_Int xoff4; HYPRE_Int xoff5; HYPRE_Int xoff6; HYPRE_Int si_center, center_rank; hypre_Index center_index; HYPRE_Int Ai_CC; hypre_BoxArray *compute_box_a; hypre_Box *compute_box; hypre_Box *A_data_box; hypre_Box *x_data_box; hypre_StructStencil *stencil; hypre_Index *stencil_shape; HYPRE_Int stencil_size; hypre_Box *y_data_box; HYPRE_Complex *xp; HYPRE_Complex *yp; HYPRE_Int depth; hypre_Index loop_size; hypre_IndexRef start; HYPRE_Int ndim; HYPRE_Complex zero[1] = {0}; stencil = hypre_StructMatrixStencil(A); stencil_shape = hypre_StructStencilShape(stencil); stencil_size = hypre_StructStencilSize(stencil); ndim = hypre_StructVectorNDim(x); hypre_ForBoxArrayI(i, compute_box_aa) { compute_box_a = hypre_BoxArrayArrayBoxArray(compute_box_aa, i); A_data_box = hypre_BoxArrayBox(hypre_StructMatrixDataSpace(A), i); x_data_box = hypre_BoxArrayBox(hypre_StructVectorDataSpace(x), i); y_data_box = hypre_BoxArrayBox(hypre_StructVectorDataSpace(y), i); xp = hypre_StructVectorBoxData(x, i); yp = hypre_StructVectorBoxData(y, i); hypre_ForBoxI(j, compute_box_a) { compute_box = hypre_BoxArrayBox(compute_box_a, j); hypre_BoxGetSize(compute_box, loop_size); start = hypre_BoxIMin(compute_box); Ai_CC = hypre_CCBoxIndexRank( A_data_box, start ); /* Find the stencil index for the center of the stencil, which makes the matrix diagonal. This is the variable coefficient part of the matrix, so will get different treatment...*/ hypre_SetIndex(center_index, 0); center_rank = hypre_StructStencilElementRank( stencil, center_index ); si_center = center_rank; /* unroll up to depth MAX_DEPTH Only the constant coefficient part of the matrix is referenced here, the center (variable) coefficient part is deferred. */ for (si = 0; si < stencil_size; si += MAX_DEPTH) { depth = hypre_min(MAX_DEPTH, (stencil_size - si)); switch (depth) { case 7: Ap0 = hypre_StructMatrixBoxData(A, i, si + 0); Ap1 = hypre_StructMatrixBoxData(A, i, si + 1); Ap2 = hypre_StructMatrixBoxData(A, i, si + 2); Ap3 = hypre_StructMatrixBoxData(A, i, si + 3); Ap4 = hypre_StructMatrixBoxData(A, i, si + 4); Ap5 = hypre_StructMatrixBoxData(A, i, si + 5); Ap6 = hypre_StructMatrixBoxData(A, i, si + 6); if ( (0 <= si_center - si) && (si_center - si < 7) ) { switch ( si_center - si ) { case 0: Ap0 = zero; break; case 1: Ap1 = zero; break; case 2: Ap2 = zero; break; case 3: Ap3 = zero; break; case 4: Ap4 = zero; break; case 5: Ap5 = zero; break; case 6: Ap6 = zero; break; } } AAp0 = Ap0[Ai_CC]; AAp1 = Ap1[Ai_CC]; AAp2 = Ap2[Ai_CC]; AAp3 = Ap3[Ai_CC]; AAp4 = Ap4[Ai_CC]; AAp5 = Ap5[Ai_CC]; AAp6 = Ap6[Ai_CC]; xoff0 = hypre_BoxOffsetDistance(x_data_box, stencil_shape[si + 0]); xoff0 = hypre_BoxOffsetDistance(x_data_box, stencil_shape[si + 0]); xoff1 = hypre_BoxOffsetDistance(x_data_box, stencil_shape[si + 1]); xoff2 = hypre_BoxOffsetDistance(x_data_box, stencil_shape[si + 2]); xoff3 = hypre_BoxOffsetDistance(x_data_box, stencil_shape[si + 3]); xoff4 = hypre_BoxOffsetDistance(x_data_box, stencil_shape[si + 4]); xoff5 = hypre_BoxOffsetDistance(x_data_box, stencil_shape[si + 5]); xoff6 = hypre_BoxOffsetDistance(x_data_box, stencil_shape[si + 6]); #define DEVICE_VAR is_device_ptr(yp,xp) hypre_BoxLoop2Begin(ndim, loop_size, x_data_box, start, stride, xi, y_data_box, start, stride, yi); { yp[yi] += AAp0 * xp[xi + xoff0] + AAp1 * xp[xi + xoff1] + AAp2 * xp[xi + xoff2] + AAp3 * xp[xi + xoff3] + AAp4 * xp[xi + xoff4] + AAp5 * xp[xi + xoff5] + AAp6 * xp[xi + xoff6]; } hypre_BoxLoop2End(xi, yi); #undef DEVICE_VAR break; case 6: Ap0 = hypre_StructMatrixBoxData(A, i, si + 0); Ap1 = hypre_StructMatrixBoxData(A, i, si + 1); Ap2 = hypre_StructMatrixBoxData(A, i, si + 2); Ap3 = hypre_StructMatrixBoxData(A, i, si + 3); Ap4 = hypre_StructMatrixBoxData(A, i, si + 4); Ap5 = hypre_StructMatrixBoxData(A, i, si + 5); if ( (0 <= si_center - si) && (si_center - si < 6) ) { switch ( si_center - si ) { case 0: Ap0 = zero; break; case 1: Ap1 = zero; break; case 2: Ap2 = zero; break; case 3: Ap3 = zero; break; case 4: Ap4 = zero; break; case 5: Ap5 = zero; break; } } AAp0 = Ap0[Ai_CC]; AAp1 = Ap1[Ai_CC]; AAp2 = Ap2[Ai_CC]; AAp3 = Ap3[Ai_CC]; AAp4 = Ap4[Ai_CC]; AAp5 = Ap5[Ai_CC]; xoff0 = hypre_BoxOffsetDistance(x_data_box, stencil_shape[si + 0]); xoff1 = hypre_BoxOffsetDistance(x_data_box, stencil_shape[si + 1]); xoff2 = hypre_BoxOffsetDistance(x_data_box, stencil_shape[si + 2]); xoff3 = hypre_BoxOffsetDistance(x_data_box, stencil_shape[si + 3]); xoff4 = hypre_BoxOffsetDistance(x_data_box, stencil_shape[si + 4]); xoff5 = hypre_BoxOffsetDistance(x_data_box, stencil_shape[si + 5]); #define DEVICE_VAR is_device_ptr(yp,xp) hypre_BoxLoop2Begin(ndim, loop_size, x_data_box, start, stride, xi, y_data_box, start, stride, yi); { yp[yi] += AAp0 * xp[xi + xoff0] + AAp1 * xp[xi + xoff1] + AAp2 * xp[xi + xoff2] + AAp3 * xp[xi + xoff3] + AAp4 * xp[xi + xoff4] + AAp5 * xp[xi + xoff5]; } hypre_BoxLoop2End(xi, yi); #undef DEVICE_VAR break; case 5: Ap0 = hypre_StructMatrixBoxData(A, i, si + 0); Ap1 = hypre_StructMatrixBoxData(A, i, si + 1); Ap2 = hypre_StructMatrixBoxData(A, i, si + 2); Ap3 = hypre_StructMatrixBoxData(A, i, si + 3); Ap4 = hypre_StructMatrixBoxData(A, i, si + 4); if ( (0 <= si_center - si) && (si_center - si < 5) ) { switch ( si_center - si ) { case 0: Ap0 = zero; break; case 1: Ap1 = zero; break; case 2: Ap2 = zero; break; case 3: Ap3 = zero; break; case 4: Ap4 = zero; break; } } AAp0 = Ap0[Ai_CC]; AAp1 = Ap1[Ai_CC]; AAp2 = Ap2[Ai_CC]; AAp3 = Ap3[Ai_CC]; AAp4 = Ap4[Ai_CC]; xoff0 = hypre_BoxOffsetDistance(x_data_box, stencil_shape[si + 0]); xoff1 = hypre_BoxOffsetDistance(x_data_box, stencil_shape[si + 1]); xoff2 = hypre_BoxOffsetDistance(x_data_box, stencil_shape[si + 2]); xoff3 = hypre_BoxOffsetDistance(x_data_box, stencil_shape[si + 3]); xoff4 = hypre_BoxOffsetDistance(x_data_box, stencil_shape[si + 4]); #define DEVICE_VAR is_device_ptr(yp,xp) hypre_BoxLoop2Begin(ndim, loop_size, x_data_box, start, stride, xi, y_data_box, start, stride, yi); { yp[yi] += AAp0 * xp[xi + xoff0] + AAp1 * xp[xi + xoff1] + AAp2 * xp[xi + xoff2] + AAp3 * xp[xi + xoff3] + AAp4 * xp[xi + xoff4]; } hypre_BoxLoop2End(xi, yi); #undef DEVICE_VAR break; case 4: Ap0 = hypre_StructMatrixBoxData(A, i, si + 0); Ap1 = hypre_StructMatrixBoxData(A, i, si + 1); Ap2 = hypre_StructMatrixBoxData(A, i, si + 2); Ap3 = hypre_StructMatrixBoxData(A, i, si + 3); if ( (0 <= si_center - si) && (si_center - si < 4) ) { switch ( si_center - si ) { case 0: Ap0 = zero; break; case 1: Ap1 = zero; break; case 2: Ap2 = zero; break; case 3: Ap3 = zero; break; } } AAp0 = Ap0[Ai_CC]; AAp1 = Ap1[Ai_CC]; AAp2 = Ap2[Ai_CC]; AAp3 = Ap3[Ai_CC]; xoff0 = hypre_BoxOffsetDistance(x_data_box, stencil_shape[si + 0]); xoff1 = hypre_BoxOffsetDistance(x_data_box, stencil_shape[si + 1]); xoff2 = hypre_BoxOffsetDistance(x_data_box, stencil_shape[si + 2]); xoff3 = hypre_BoxOffsetDistance(x_data_box, stencil_shape[si + 3]); #define DEVICE_VAR is_device_ptr(yp,xp) hypre_BoxLoop2Begin(ndim, loop_size, x_data_box, start, stride, xi, y_data_box, start, stride, yi); { yp[yi] += AAp0 * xp[xi + xoff0] + AAp1 * xp[xi + xoff1] + AAp2 * xp[xi + xoff2] + AAp3 * xp[xi + xoff3]; } hypre_BoxLoop2End(xi, yi); #undef DEVICE_VAR break; case 3: Ap0 = hypre_StructMatrixBoxData(A, i, si + 0); Ap1 = hypre_StructMatrixBoxData(A, i, si + 1); Ap2 = hypre_StructMatrixBoxData(A, i, si + 2); if ( (0 <= si_center - si) && (si_center - si < 3) ) { switch ( si_center - si ) { case 0: Ap0 = zero; break; case 1: Ap1 = zero; break; case 2: Ap2 = zero; break; } } AAp0 = Ap0[Ai_CC]; AAp1 = Ap1[Ai_CC]; AAp2 = Ap2[Ai_CC]; xoff0 = hypre_BoxOffsetDistance(x_data_box, stencil_shape[si + 0]); xoff1 = hypre_BoxOffsetDistance(x_data_box, stencil_shape[si + 1]); xoff2 = hypre_BoxOffsetDistance(x_data_box, stencil_shape[si + 2]); #define DEVICE_VAR is_device_ptr(yp,xp) hypre_BoxLoop2Begin(ndim, loop_size, x_data_box, start, stride, xi, y_data_box, start, stride, yi); { yp[yi] += AAp0 * xp[xi + xoff0] + AAp1 * xp[xi + xoff1] + AAp2 * xp[xi + xoff2]; } hypre_BoxLoop2End(xi, yi); #undef DEVICE_VAR break; case 2: Ap0 = hypre_StructMatrixBoxData(A, i, si + 0); Ap1 = hypre_StructMatrixBoxData(A, i, si + 1); if ( (0 <= si_center - si) && (si_center - si < 2) ) { switch ( si_center - si ) { case 0: Ap0 = zero; break; case 1: Ap1 = zero; break; } } AAp0 = Ap0[Ai_CC]; AAp1 = Ap1[Ai_CC]; xoff0 = hypre_BoxOffsetDistance(x_data_box, stencil_shape[si + 0]); xoff1 = hypre_BoxOffsetDistance(x_data_box, stencil_shape[si + 1]); #define DEVICE_VAR is_device_ptr(yp,xp) hypre_BoxLoop2Begin(ndim, loop_size, x_data_box, start, stride, xi, y_data_box, start, stride, yi); { yp[yi] += AAp0 * xp[xi + xoff0] + AAp1 * xp[xi + xoff1]; } hypre_BoxLoop2End(xi, yi); #undef DEVICE_VAR break; case 1: Ap0 = hypre_StructMatrixBoxData(A, i, si + 0); if ( si_center - si == 0 ) { Ap0 = zero; } AAp0 = Ap0[Ai_CC]; xoff0 = hypre_BoxOffsetDistance(x_data_box, stencil_shape[si + 0]); #define DEVICE_VAR is_device_ptr(yp,xp) hypre_BoxLoop2Begin(ndim, loop_size, x_data_box, start, stride, xi, y_data_box, start, stride, yi); { yp[yi] += AAp0 * xp[xi + xoff0]; } hypre_BoxLoop2End(xi, yi); #undef DEVICE_VAR break; } } Ap0 = hypre_StructMatrixBoxData(A, i, si_center); xoff0 = hypre_BoxOffsetDistance(x_data_box, stencil_shape[si_center]); if (alpha != 1.0 ) { #define DEVICE_VAR is_device_ptr(yp,Ap0,xp) hypre_BoxLoop3Begin(ndim, loop_size, A_data_box, start, stride, Ai, x_data_box, start, stride, xi, y_data_box, start, stride, yi); { yp[yi] = alpha * ( yp[yi] + Ap0[Ai] * xp[xi + xoff0] ); } hypre_BoxLoop3End(Ai, xi, yi); #undef DEVICE_VAR } else { #define DEVICE_VAR is_device_ptr(yp,Ap0,xp) hypre_BoxLoop3Begin(ndim, loop_size, A_data_box, start, stride, Ai, x_data_box, start, stride, xi, y_data_box, start, stride, yi); { yp[yi] += Ap0[Ai] * xp[xi + xoff0]; } hypre_BoxLoop3End(Ai, xi, yi); #undef DEVICE_VAR } } } return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_StructMatvecDestroy *--------------------------------------------------------------------------*/ HYPRE_Int hypre_StructMatvecDestroy( void *matvec_vdata ) { hypre_StructMatvecData *matvec_data = (hypre_StructMatvecData *)matvec_vdata; if (matvec_data) { hypre_StructMatrixDestroy(matvec_data -> A); hypre_StructVectorDestroy(matvec_data -> x); hypre_ComputePkgDestroy(matvec_data -> compute_pkg ); hypre_TFree(matvec_data, HYPRE_MEMORY_HOST); } return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_StructMatvec *--------------------------------------------------------------------------*/ HYPRE_Int hypre_StructMatvec( HYPRE_Complex alpha, hypre_StructMatrix *A, hypre_StructVector *x, HYPRE_Complex beta, hypre_StructVector *y ) { void *matvec_data; matvec_data = hypre_StructMatvecCreate(); hypre_StructMatvecSetup(matvec_data, A, x); hypre_StructMatvecCompute(matvec_data, alpha, A, x, beta, y); hypre_StructMatvecDestroy(matvec_data); return hypre_error_flag; } hypre-2.33.0/src/struct_mv/struct_scale.c000066400000000000000000000033701477326011500204130ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * Structured scale routine * *****************************************************************************/ #include "_hypre_struct_mv.h" #include "_hypre_struct_mv.hpp" /*-------------------------------------------------------------------------- * hypre_StructScale *--------------------------------------------------------------------------*/ HYPRE_Int hypre_StructScale( HYPRE_Complex alpha, hypre_StructVector *y ) { hypre_Box *y_data_box; HYPRE_Complex *yp; hypre_BoxArray *boxes; hypre_Box *box; hypre_Index loop_size; hypre_IndexRef start; hypre_Index unit_stride; HYPRE_Int i; hypre_SetIndex(unit_stride, 1); boxes = hypre_StructGridBoxes(hypre_StructVectorGrid(y)); hypre_ForBoxI(i, boxes) { box = hypre_BoxArrayBox(boxes, i); start = hypre_BoxIMin(box); y_data_box = hypre_BoxArrayBox(hypre_StructVectorDataSpace(y), i); yp = hypre_StructVectorBoxData(y, i); hypre_BoxGetSize(box, loop_size); #define DEVICE_VAR is_device_ptr(yp) hypre_BoxLoop1Begin(hypre_StructVectorNDim(y), loop_size, y_data_box, start, unit_stride, yi); { yp[yi] *= alpha; } hypre_BoxLoop1End(yi); #undef DEVICE_VAR } return hypre_error_flag; } hypre-2.33.0/src/struct_mv/struct_stencil.c000066400000000000000000000147161477326011500207730ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * Constructors and destructors for stencil structure. * *****************************************************************************/ #include "_hypre_struct_mv.h" /*-------------------------------------------------------------------------- * hypre_StructStencilCreate *--------------------------------------------------------------------------*/ hypre_StructStencil * hypre_StructStencilCreate( HYPRE_Int dim, HYPRE_Int size, hypre_Index *shape ) { hypre_StructStencil *stencil; stencil = hypre_TAlloc(hypre_StructStencil, 1, HYPRE_MEMORY_HOST); hypre_StructStencilShape(stencil) = shape; hypre_StructStencilSize(stencil) = size; hypre_StructStencilNDim(stencil) = dim; hypre_StructStencilRefCount(stencil) = 1; return stencil; } /*-------------------------------------------------------------------------- * hypre_StructStencilRef *--------------------------------------------------------------------------*/ hypre_StructStencil * hypre_StructStencilRef( hypre_StructStencil *stencil ) { hypre_StructStencilRefCount(stencil) ++; return stencil; } /*-------------------------------------------------------------------------- * hypre_StructStencilDestroy *--------------------------------------------------------------------------*/ HYPRE_Int hypre_StructStencilDestroy( hypre_StructStencil *stencil ) { if (stencil) { hypre_StructStencilRefCount(stencil) --; if (hypre_StructStencilRefCount(stencil) == 0) { hypre_TFree(hypre_StructStencilShape(stencil), HYPRE_MEMORY_HOST); hypre_TFree(stencil, HYPRE_MEMORY_HOST); } } return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_StructStencilElementRank * Returns the rank of the `stencil_element' in `stencil'. * If the element is not found, a -1 is returned. *--------------------------------------------------------------------------*/ HYPRE_Int hypre_StructStencilElementRank( hypre_StructStencil *stencil, hypre_Index stencil_element ) { hypre_Index *stencil_shape; HYPRE_Int rank; HYPRE_Int i, ndim; rank = -1; ndim = hypre_StructStencilNDim(stencil); stencil_shape = hypre_StructStencilShape(stencil); for (i = 0; i < hypre_StructStencilSize(stencil); i++) { if (hypre_IndexesEqual(stencil_shape[i], stencil_element, ndim)) { rank = i; break; } } return rank; } /*-------------------------------------------------------------------------- * hypre_StructStencilSymmetrize: * Computes a new "symmetrized" stencil. * * An integer array called `symm_elements' is also set up. A non-negative * value of `symm_elements[i]' indicates that the `i'th stencil element * is a "symmetric element". That is, this stencil element is the * transpose element of an element that is not a "symmetric element". *--------------------------------------------------------------------------*/ HYPRE_Int hypre_StructStencilSymmetrize( hypre_StructStencil *stencil, hypre_StructStencil **symm_stencil_ptr, HYPRE_Int **symm_elements_ptr ) { hypre_Index *stencil_shape = hypre_StructStencilShape(stencil); HYPRE_Int stencil_size = hypre_StructStencilSize(stencil); hypre_StructStencil *symm_stencil; hypre_Index *symm_stencil_shape; HYPRE_Int symm_stencil_size; HYPRE_Int *symm_elements; HYPRE_Int no_symmetric_stencil_element, symmetric; HYPRE_Int i, j, d, ndim; /*------------------------------------------------------ * Copy stencil elements into `symm_stencil_shape' *------------------------------------------------------*/ ndim = hypre_StructStencilNDim(stencil); symm_stencil_shape = hypre_CTAlloc(hypre_Index, 2 * stencil_size, HYPRE_MEMORY_HOST); for (i = 0; i < stencil_size; i++) { hypre_CopyIndex(stencil_shape[i], symm_stencil_shape[i]); } /*------------------------------------------------------ * Create symmetric stencil elements and `symm_elements' *------------------------------------------------------*/ symm_elements = hypre_CTAlloc(HYPRE_Int, 2 * stencil_size, HYPRE_MEMORY_HOST); for (i = 0; i < 2 * stencil_size; i++) { symm_elements[i] = -1; } symm_stencil_size = stencil_size; for (i = 0; i < stencil_size; i++) { if (symm_elements[i] < 0) { /* note: start at i to handle "center" element correctly */ no_symmetric_stencil_element = 1; for (j = i; j < stencil_size; j++) { symmetric = 1; for (d = 0; d < ndim; d++) { if (hypre_IndexD(symm_stencil_shape[j], d) != -hypre_IndexD(symm_stencil_shape[i], d)) { symmetric = 0; break; } } if (symmetric) { /* only "off-center" elements have symmetric entries */ if (i != j) { symm_elements[j] = i; } no_symmetric_stencil_element = 0; } } if (no_symmetric_stencil_element) { /* add symmetric stencil element to `symm_stencil' */ for (d = 0; d < ndim; d++) { hypre_IndexD(symm_stencil_shape[symm_stencil_size], d) = -hypre_IndexD(symm_stencil_shape[i], d); } symm_elements[symm_stencil_size] = i; symm_stencil_size++; } } } symm_stencil = hypre_StructStencilCreate(hypre_StructStencilNDim(stencil), symm_stencil_size, symm_stencil_shape); *symm_stencil_ptr = symm_stencil; *symm_elements_ptr = symm_elements; return hypre_error_flag; } hypre-2.33.0/src/struct_mv/struct_stencil.h000066400000000000000000000032471477326011500207750ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * Header info for hypre_StructStencil data structures * *****************************************************************************/ #ifndef hypre_STRUCT_STENCIL_HEADER #define hypre_STRUCT_STENCIL_HEADER /*-------------------------------------------------------------------------- * hypre_StructStencil *--------------------------------------------------------------------------*/ typedef struct hypre_StructStencil_struct { hypre_Index *shape; /* Description of a stencil's shape */ HYPRE_Int size; /* Number of stencil coefficients */ HYPRE_Int ndim; /* Number of dimensions */ HYPRE_Int ref_count; } hypre_StructStencil; /*-------------------------------------------------------------------------- * Accessor functions for the hypre_StructStencil structure *--------------------------------------------------------------------------*/ #define hypre_StructStencilShape(stencil) ((stencil) -> shape) #define hypre_StructStencilSize(stencil) ((stencil) -> size) #define hypre_StructStencilNDim(stencil) ((stencil) -> ndim) #define hypre_StructStencilRefCount(stencil) ((stencil) -> ref_count) #define hypre_StructStencilElement(stencil, i) hypre_StructStencilShape(stencil)[i] #endif hypre-2.33.0/src/struct_mv/struct_vector.c000066400000000000000000001206211477326011500206250ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * Member functions for hypre_StructVector class. * *****************************************************************************/ #include "_hypre_struct_mv.h" #include "_hypre_struct_mv.hpp" /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ hypre_StructVector * hypre_StructVectorCreate( MPI_Comm comm, hypre_StructGrid *grid ) { HYPRE_Int ndim = hypre_StructGridNDim(grid); hypre_StructVector *vector; HYPRE_Int i; vector = hypre_CTAlloc(hypre_StructVector, 1, HYPRE_MEMORY_HOST); hypre_StructVectorComm(vector) = comm; hypre_StructGridRef(grid, &hypre_StructVectorGrid(vector)); hypre_StructVectorDataAlloced(vector) = 1; hypre_StructVectorBGhostNotClear(vector) = 0; hypre_StructVectorRefCount(vector) = 1; /* set defaults */ for (i = 0; i < 2 * ndim; i++) { hypre_StructVectorNumGhost(vector)[i] = hypre_StructGridNumGhost(grid)[i]; } hypre_StructVectorMemoryLocation(vector) = hypre_HandleMemoryLocation(hypre_handle()); return vector; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ hypre_StructVector * hypre_StructVectorRef( hypre_StructVector *vector ) { hypre_StructVectorRefCount(vector) ++; return vector; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_StructVectorDestroy( hypre_StructVector *vector ) { if (vector) { hypre_StructVectorRefCount(vector) --; if (hypre_StructVectorRefCount(vector) == 0) { if (hypre_StructVectorDataAlloced(vector)) { hypre_TFree(hypre_StructVectorData(vector), hypre_StructVectorMemoryLocation(vector)); } hypre_TFree(hypre_StructVectorDataIndices(vector), HYPRE_MEMORY_HOST); hypre_BoxArrayDestroy(hypre_StructVectorDataSpace(vector)); hypre_StructGridDestroy(hypre_StructVectorGrid(vector)); hypre_TFree(vector, HYPRE_MEMORY_HOST); } } return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_StructVectorInitializeShell( hypre_StructVector *vector ) { HYPRE_Int ndim = hypre_StructVectorNDim(vector); hypre_StructGrid *grid; HYPRE_Int *num_ghost; hypre_BoxArray *data_space; hypre_BoxArray *boxes; hypre_Box *box; hypre_Box *data_box; HYPRE_Int *data_indices; HYPRE_Int data_size; HYPRE_Int i, d; /*----------------------------------------------------------------------- * Set up data_space *-----------------------------------------------------------------------*/ grid = hypre_StructVectorGrid(vector); if (hypre_StructVectorDataSpace(vector) == NULL) { num_ghost = hypre_StructVectorNumGhost(vector); boxes = hypre_StructGridBoxes(grid); data_space = hypre_BoxArrayCreate(hypre_BoxArraySize(boxes), ndim); hypre_ForBoxI(i, boxes) { box = hypre_BoxArrayBox(boxes, i); data_box = hypre_BoxArrayBox(data_space, i); hypre_CopyBox(box, data_box); for (d = 0; d < ndim; d++) { hypre_BoxIMinD(data_box, d) -= num_ghost[2 * d]; hypre_BoxIMaxD(data_box, d) += num_ghost[2 * d + 1]; } } hypre_StructVectorDataSpace(vector) = data_space; } /*----------------------------------------------------------------------- * Set up data_indices array and data_size *-----------------------------------------------------------------------*/ if (hypre_StructVectorDataIndices(vector) == NULL) { data_space = hypre_StructVectorDataSpace(vector); data_indices = hypre_CTAlloc(HYPRE_Int, hypre_BoxArraySize(data_space), HYPRE_MEMORY_HOST); data_size = 0; hypre_ForBoxI(i, data_space) { data_box = hypre_BoxArrayBox(data_space, i); data_indices[i] = data_size; data_size += hypre_BoxVolume(data_box); } hypre_StructVectorDataIndices(vector) = data_indices; hypre_StructVectorDataSize(vector) = data_size; } /*----------------------------------------------------------------------- * Set total number of nonzero coefficients *-----------------------------------------------------------------------*/ hypre_StructVectorGlobalSize(vector) = hypre_StructGridGlobalSize(grid); return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_StructVectorInitializeData( hypre_StructVector *vector, HYPRE_Complex *data) { hypre_StructVectorData(vector) = data; hypre_StructVectorDataAlloced(vector) = 0; return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_StructVectorInitialize( hypre_StructVector *vector ) { HYPRE_Complex *data; hypre_StructVectorInitializeShell(vector); data = hypre_CTAlloc(HYPRE_Complex, hypre_StructVectorDataSize(vector), hypre_StructVectorMemoryLocation(vector)); hypre_StructVectorInitializeData(vector, data); hypre_StructVectorDataAlloced(vector) = 1; return hypre_error_flag; } /*-------------------------------------------------------------------------- * (action > 0): add-to values * (action = 0): set values * (action < 0): get values * * (outside > 0): set values possibly outside of the grid extents * (outside = 0): set values only inside the grid extents * * NOTE: Getting and setting values outside of the grid extents requires care, * as these values may be stored in multiple ghost zone locations. *--------------------------------------------------------------------------*/ HYPRE_Int hypre_StructVectorSetValues( hypre_StructVector *vector, hypre_Index grid_index, HYPRE_Complex *values, HYPRE_Int action, HYPRE_Int boxnum, HYPRE_Int outside ) { hypre_BoxArray *grid_boxes; hypre_Box *grid_box; HYPRE_Complex *vecp; HYPRE_Int i, istart, istop; #if defined(HYPRE_USING_GPU) HYPRE_MemoryLocation memory_location = hypre_StructVectorMemoryLocation(vector); #endif if (outside > 0) { grid_boxes = hypre_StructVectorDataSpace(vector); } else { grid_boxes = hypre_StructGridBoxes(hypre_StructVectorGrid(vector)); } if (boxnum < 0) { istart = 0; istop = hypre_BoxArraySize(grid_boxes); } else { istart = boxnum; istop = istart + 1; } for (i = istart; i < istop; i++) { grid_box = hypre_BoxArrayBox(grid_boxes, i); if (hypre_IndexInBox(grid_index, grid_box)) { vecp = hypre_StructVectorBoxDataValue(vector, i, grid_index); #if defined(HYPRE_USING_GPU) if (hypre_GetExecPolicy1(memory_location) == HYPRE_EXEC_DEVICE) { if (action > 0) { #define DEVICE_VAR is_device_ptr(vecp,values) hypre_LoopBegin(1, k) { *vecp += *values; } hypre_LoopEnd() #undef DEVICE_VAR } else if (action > -1) { hypre_TMemcpy(vecp, values, HYPRE_Complex, 1, memory_location, memory_location); } else /* action < 0 */ { hypre_TMemcpy(values, vecp, HYPRE_Complex, 1, memory_location, memory_location); } } else #endif { if (action > 0) { *vecp += *values; } else if (action > -1) { *vecp = *values; } else /* action < 0 */ { *values = *vecp; } } } } return hypre_error_flag; } /*-------------------------------------------------------------------------- * (action > 0): add-to values * (action = 0): set values * (action < 0): get values * * (outside > 0): set values possibly outside of the grid extents * (outside = 0): set values only inside the grid extents * * NOTE: Getting and setting values outside of the grid extents requires care, * as these values may be stored in multiple ghost zone locations. *--------------------------------------------------------------------------*/ HYPRE_Int hypre_StructVectorSetBoxValues( hypre_StructVector *vector, hypre_Box *set_box, hypre_Box *value_box, HYPRE_Complex *values, HYPRE_Int action, HYPRE_Int boxnum, HYPRE_Int outside ) { hypre_BoxArray *grid_boxes; hypre_Box *grid_box; hypre_Box *int_box; hypre_BoxArray *data_space; hypre_Box *data_box; hypre_IndexRef data_start; hypre_Index data_stride; HYPRE_Complex *datap; hypre_Box *dval_box; hypre_Index dval_start; hypre_Index dval_stride; hypre_Index loop_size; HYPRE_Int i, istart, istop; /*----------------------------------------------------------------------- * Initialize some things *-----------------------------------------------------------------------*/ if (outside > 0) { grid_boxes = hypre_StructVectorDataSpace(vector); } else { grid_boxes = hypre_StructGridBoxes(hypre_StructVectorGrid(vector)); } data_space = hypre_StructVectorDataSpace(vector); if (boxnum < 0) { istart = 0; istop = hypre_BoxArraySize(grid_boxes); } else { istart = boxnum; istop = istart + 1; } /*----------------------------------------------------------------------- * Set the vector coefficients *-----------------------------------------------------------------------*/ hypre_SetIndex(data_stride, 1); int_box = hypre_BoxCreate(hypre_StructVectorNDim(vector)); dval_box = hypre_BoxDuplicate(value_box); hypre_SetIndex(dval_stride, 1); for (i = istart; i < istop; i++) { grid_box = hypre_BoxArrayBox(grid_boxes, i); data_box = hypre_BoxArrayBox(data_space, i); hypre_IntersectBoxes(set_box, grid_box, int_box); /* if there was an intersection */ if (hypre_BoxVolume(int_box)) { data_start = hypre_BoxIMin(int_box); hypre_CopyIndex(data_start, dval_start); datap = hypre_StructVectorBoxData(vector, i); hypre_BoxGetSize(int_box, loop_size); #define DEVICE_VAR is_device_ptr(datap,values) if (action > 0) { hypre_BoxLoop2Begin(hypre_StructVectorNDim(vector), loop_size, data_box, data_start, data_stride, datai, dval_box, dval_start, dval_stride, dvali); { datap[datai] += values[dvali]; } hypre_BoxLoop2End(datai, dvali); } else if (action > -1) { hypre_BoxLoop2Begin(hypre_StructVectorNDim(vector), loop_size, data_box, data_start, data_stride, datai, dval_box, dval_start, dval_stride, dvali); { datap[datai] = values[dvali]; } hypre_BoxLoop2End(datai, dvali); } else /* action < 0 */ { hypre_BoxLoop2Begin(hypre_StructVectorNDim(vector), loop_size, data_box, data_start, data_stride, datai, dval_box, dval_start, dval_stride, dvali); { values[dvali] = datap[datai]; } hypre_BoxLoop2End(datai, dvali); } #undef DEVICE_VAR } } hypre_BoxDestroy(int_box); hypre_BoxDestroy(dval_box); return hypre_error_flag; } /*-------------------------------------------------------------------------- * (outside > 0): clear values possibly outside of the grid extents * (outside = 0): clear values only inside the grid extents *--------------------------------------------------------------------------*/ HYPRE_Int hypre_StructVectorClearValues( hypre_StructVector *vector, hypre_Index grid_index, HYPRE_Int boxnum, HYPRE_Int outside ) { hypre_BoxArray *grid_boxes; hypre_Box *grid_box; HYPRE_Complex *vecp; HYPRE_Int i, istart, istop; #if defined(HYPRE_USING_GPU) HYPRE_MemoryLocation memory_location = hypre_StructVectorMemoryLocation(vector); #endif if (outside > 0) { grid_boxes = hypre_StructVectorDataSpace(vector); } else { grid_boxes = hypre_StructGridBoxes(hypre_StructVectorGrid(vector)); } if (boxnum < 0) { istart = 0; istop = hypre_BoxArraySize(grid_boxes); } else { istart = boxnum; istop = istart + 1; } for (i = istart; i < istop; i++) { grid_box = hypre_BoxArrayBox(grid_boxes, i); if (hypre_IndexInBox(grid_index, grid_box)) { vecp = hypre_StructVectorBoxDataValue(vector, i, grid_index); #if defined(HYPRE_USING_GPU) if (hypre_GetExecPolicy1(memory_location) == HYPRE_EXEC_DEVICE) { #define DEVICE_VAR is_device_ptr(vecp) hypre_LoopBegin(1, k) { *vecp = 0.0; } hypre_LoopEnd() #undef DEVICE_VAR } else #endif { *vecp = 0.0; } } } return hypre_error_flag; } /*-------------------------------------------------------------------------- * (outside > 0): clear values possibly outside of the grid extents * (outside = 0): clear values only inside the grid extents *--------------------------------------------------------------------------*/ HYPRE_Int hypre_StructVectorClearBoxValues( hypre_StructVector *vector, hypre_Box *clear_box, HYPRE_Int boxnum, HYPRE_Int outside ) { hypre_BoxArray *grid_boxes; hypre_Box *grid_box; hypre_Box *int_box; hypre_BoxArray *data_space; hypre_Box *data_box; hypre_IndexRef data_start; hypre_Index data_stride; HYPRE_Complex *datap; hypre_Index loop_size; HYPRE_Int i, istart, istop; /*----------------------------------------------------------------------- * Initialize some things *-----------------------------------------------------------------------*/ if (outside > 0) { grid_boxes = hypre_StructVectorDataSpace(vector); } else { grid_boxes = hypre_StructGridBoxes(hypre_StructVectorGrid(vector)); } data_space = hypre_StructVectorDataSpace(vector); if (boxnum < 0) { istart = 0; istop = hypre_BoxArraySize(grid_boxes); } else { istart = boxnum; istop = istart + 1; } /*----------------------------------------------------------------------- * Set the vector coefficients *-----------------------------------------------------------------------*/ hypre_SetIndex(data_stride, 1); int_box = hypre_BoxCreate(hypre_StructVectorNDim(vector)); for (i = istart; i < istop; i++) { grid_box = hypre_BoxArrayBox(grid_boxes, i); data_box = hypre_BoxArrayBox(data_space, i); hypre_IntersectBoxes(clear_box, grid_box, int_box); /* if there was an intersection */ if (hypre_BoxVolume(int_box)) { data_start = hypre_BoxIMin(int_box); datap = hypre_StructVectorBoxData(vector, i); hypre_BoxGetSize(int_box, loop_size); #define DEVICE_VAR is_device_ptr(datap) hypre_BoxLoop1Begin(hypre_StructVectorNDim(vector), loop_size, data_box, data_start, data_stride, datai); { datap[datai] = 0.0; } hypre_BoxLoop1End(datai); #undef DEVICE_VAR } } hypre_BoxDestroy(int_box); return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_StructVectorClearAllValues( hypre_StructVector *vector ) { HYPRE_Complex *data = hypre_StructVectorData(vector); HYPRE_Int data_size = hypre_StructVectorDataSize(vector); hypre_Index imin, imax; hypre_Box *box; box = hypre_BoxCreate(1); hypre_IndexD(imin, 0) = 1; hypre_IndexD(imax, 0) = data_size; hypre_BoxSetExtents(box, imin, imax); #define DEVICE_VAR is_device_ptr(data) hypre_BoxLoop1Begin(1, imax, box, imin, imin, datai); { data[datai] = 0.0; } hypre_BoxLoop1End(datai); #undef DEVICE_VAR hypre_BoxDestroy(box); return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_StructVectorSetNumGhost( hypre_StructVector *vector, HYPRE_Int *num_ghost ) { HYPRE_Int d, ndim = hypre_StructVectorNDim(vector); for (d = 0; d < ndim; d++) { hypre_StructVectorNumGhost(vector)[2 * d] = num_ghost[2 * d]; hypre_StructVectorNumGhost(vector)[2 * d + 1] = num_ghost[2 * d + 1]; } return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_StructVectorSetDataSize(hypre_StructVector *vector, HYPRE_Int *data_size, HYPRE_Int *data_host_size) { HYPRE_UNUSED_VAR(data_host_size); #if 0 //defined(HYPRE_USING_CUDA) || defined(HYPRE_USING_HIP) hypre_StructGrid *grid = hypre_StructVectorGrid(vector); if (hypre_StructGridDataLocation(grid) != HYPRE_MEMORY_HOST) { *data_size += hypre_StructVectorDataSize(vector); } else { *data_host_size += hypre_StructVectorDataSize(vector); } #else *data_size += hypre_StructVectorDataSize(vector); #endif return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_StructVectorAssemble( hypre_StructVector *vector ) { HYPRE_UNUSED_VAR(vector); return hypre_error_flag; } /*-------------------------------------------------------------------------- * copies data from x to y * y has its own data array, so this is a deep copy in that sense. * The grid and other size information are not copied - they are * assumed to have already been set up to be consistent. *--------------------------------------------------------------------------*/ HYPRE_Int hypre_StructVectorCopy( hypre_StructVector *x, hypre_StructVector *y ) { hypre_Box *x_data_box; HYPRE_Complex *xp, *yp; hypre_BoxArray *boxes; hypre_Box *box; hypre_Index loop_size; hypre_IndexRef start; hypre_Index unit_stride; HYPRE_Int i; /*----------------------------------------------------------------------- * Set the vector coefficients *-----------------------------------------------------------------------*/ hypre_SetIndex(unit_stride, 1); boxes = hypre_StructGridBoxes( hypre_StructVectorGrid(x) ); hypre_ForBoxI(i, boxes) { box = hypre_BoxArrayBox(boxes, i); start = hypre_BoxIMin(box); x_data_box = hypre_BoxArrayBox(hypre_StructVectorDataSpace(x), i); xp = hypre_StructVectorBoxData(x, i); yp = hypre_StructVectorBoxData(y, i); hypre_BoxGetSize(box, loop_size); #define DEVICE_VAR is_device_ptr(yp,xp) hypre_BoxLoop1Begin(hypre_StructVectorNDim(x), loop_size, x_data_box, start, unit_stride, vi); { yp[vi] = xp[vi]; } hypre_BoxLoop1End(vi); #undef DEVICE_VAR } return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_StructVectorSetConstantValues( hypre_StructVector *vector, HYPRE_Complex values ) { hypre_Box *v_data_box; HYPRE_Complex *vp; hypre_BoxArray *boxes; hypre_Box *box; hypre_Index loop_size; hypre_IndexRef start; hypre_Index unit_stride; HYPRE_Int i; /*----------------------------------------------------------------------- * Set the vector coefficients *-----------------------------------------------------------------------*/ hypre_SetIndex(unit_stride, 1); boxes = hypre_StructGridBoxes(hypre_StructVectorGrid(vector)); hypre_ForBoxI(i, boxes) { box = hypre_BoxArrayBox(boxes, i); start = hypre_BoxIMin(box); v_data_box = hypre_BoxArrayBox(hypre_StructVectorDataSpace(vector), i); vp = hypre_StructVectorBoxData(vector, i); hypre_BoxGetSize(box, loop_size); #define DEVICE_VAR is_device_ptr(vp) hypre_BoxLoop1Begin(hypre_StructVectorNDim(vector), loop_size, v_data_box, start, unit_stride, vi); { vp[vi] = values; } hypre_BoxLoop1End(vi); #undef DEVICE_VAR } return hypre_error_flag; } /*-------------------------------------------------------------------------- * Takes a function pointer of the form: HYPRE_Complex f(i,j,k) * RDF: This function doesn't appear to be used anywhere. *--------------------------------------------------------------------------*/ /* ONLY3D */ HYPRE_Int hypre_StructVectorSetFunctionValues( hypre_StructVector *vector, HYPRE_Complex (*fcn)(HYPRE_Int, HYPRE_Int, HYPRE_Int) ) { hypre_Box *v_data_box; HYPRE_Complex *vp; hypre_BoxArray *boxes; hypre_Box *box; hypre_Index loop_size; hypre_IndexRef start; hypre_Index unit_stride; HYPRE_Int b, i, j, k; /*----------------------------------------------------------------------- * Set the vector coefficients *-----------------------------------------------------------------------*/ hypre_SetIndex(unit_stride, 1); boxes = hypre_StructGridBoxes(hypre_StructVectorGrid(vector)); hypre_ForBoxI(b, boxes) { box = hypre_BoxArrayBox(boxes, b); start = hypre_BoxIMin(box); v_data_box = hypre_BoxArrayBox(hypre_StructVectorDataSpace(vector), b); vp = hypre_StructVectorBoxData(vector, b); hypre_BoxGetSize(box, loop_size); i = hypre_IndexD(start, 0); j = hypre_IndexD(start, 1); k = hypre_IndexD(start, 2); hypre_SerialBoxLoop1Begin(hypre_StructVectorNDim(vector), loop_size, v_data_box, start, unit_stride, vi) { vp[vi] = fcn(i, j, k); i++; j++; k++; } hypre_SerialBoxLoop1End(vi) } return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_StructVectorClearGhostValues( hypre_StructVector *vector ) { HYPRE_Int ndim = hypre_StructVectorNDim(vector); hypre_Box *v_data_box; HYPRE_Complex *vp; hypre_BoxArray *boxes; hypre_Box *box; hypre_BoxArray *diff_boxes; hypre_Box *diff_box; hypre_Index loop_size; hypre_IndexRef start; hypre_Index unit_stride; HYPRE_Int i, j; /*----------------------------------------------------------------------- * Set the vector coefficients *-----------------------------------------------------------------------*/ hypre_SetIndex(unit_stride, 1); boxes = hypre_StructGridBoxes(hypre_StructVectorGrid(vector)); diff_boxes = hypre_BoxArrayCreate(0, ndim); hypre_ForBoxI(i, boxes) { box = hypre_BoxArrayBox(boxes, i); v_data_box = hypre_BoxArrayBox(hypre_StructVectorDataSpace(vector), i); hypre_BoxArraySetSize(diff_boxes, 0); hypre_SubtractBoxes(v_data_box, box, diff_boxes); vp = hypre_StructVectorBoxData(vector, i); hypre_ForBoxI(j, diff_boxes) { diff_box = hypre_BoxArrayBox(diff_boxes, j); start = hypre_BoxIMin(diff_box); hypre_BoxGetSize(diff_box, loop_size); #define DEVICE_VAR is_device_ptr(vp) hypre_BoxLoop1Begin(hypre_StructVectorNDim(vector), loop_size, v_data_box, start, unit_stride, vi); { vp[vi] = 0.0; } hypre_BoxLoop1End(vi); #undef DEVICE_VAR } } hypre_BoxArrayDestroy(diff_boxes); return hypre_error_flag; } /*-------------------------------------------------------------------------- * clears vector values on the physical boundaries *--------------------------------------------------------------------------*/ HYPRE_Int hypre_StructVectorClearBoundGhostValues( hypre_StructVector *vector, HYPRE_Int force ) { HYPRE_Int ndim = hypre_StructVectorNDim(vector); HYPRE_Complex *vp; hypre_BoxArray *boxes; hypre_Box *box; hypre_Box *v_data_box; hypre_Index loop_size; hypre_IndexRef start; hypre_Index stride; hypre_Box *bbox; hypre_StructGrid *grid; hypre_BoxArray *boundary_boxes; hypre_BoxArray *array_of_box; hypre_BoxArray *work_boxarray; HYPRE_Int i, i2; /*----------------------------------------------------------------------- * Set the vector coefficients *-----------------------------------------------------------------------*/ /* Only clear if not clear already or if force argument is set */ if (hypre_StructVectorBGhostNotClear(vector) || force) { grid = hypre_StructVectorGrid(vector); boxes = hypre_StructGridBoxes(grid); hypre_SetIndex(stride, 1); hypre_ForBoxI(i, boxes) { box = hypre_BoxArrayBox(boxes, i); boundary_boxes = hypre_BoxArrayCreate( 0, ndim ); v_data_box = hypre_BoxArrayBox(hypre_StructVectorDataSpace(vector), i); hypre_BoxBoundaryG( v_data_box, grid, boundary_boxes ); vp = hypre_StructVectorBoxData(vector, i); /* box is a grid box, no ghost zones. v_data_box is vector data box, may or may not have ghost zones To get only ghost zones, subtract box from boundary_boxes. */ work_boxarray = hypre_BoxArrayCreate( 0, ndim ); array_of_box = hypre_BoxArrayCreate( 1, ndim ); hypre_BoxArrayBoxes(array_of_box)[0] = *box; hypre_SubtractBoxArrays( boundary_boxes, array_of_box, work_boxarray ); hypre_ForBoxI(i2, boundary_boxes) { bbox = hypre_BoxArrayBox(boundary_boxes, i2); hypre_BoxGetSize(bbox, loop_size); start = hypre_BoxIMin(bbox); #define DEVICE_VAR is_device_ptr(vp) hypre_BoxLoop1Begin(hypre_StructVectorNDim(vector), loop_size, v_data_box, start, stride, vi); { vp[vi] = 0.0; } hypre_BoxLoop1End(vi); #undef DEVICE_VAR } hypre_BoxArrayDestroy(boundary_boxes); hypre_BoxArrayDestroy(work_boxarray); hypre_BoxArrayDestroy(array_of_box); } hypre_StructVectorBGhostNotClear(vector) = 0; } return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_StructVectorScaleValues( hypre_StructVector *vector, HYPRE_Complex factor ) { HYPRE_Complex *data; hypre_Index imin; hypre_Index imax; hypre_Box *box; hypre_Index loop_size; /*----------------------------------------------------------------------- * Set the vector coefficients *-----------------------------------------------------------------------*/ box = hypre_BoxCreate(hypre_StructVectorNDim(vector)); hypre_SetIndex(imin, 1); hypre_SetIndex(imax, 1); hypre_IndexD(imax, 0) = hypre_StructVectorDataSize(vector); hypre_BoxSetExtents(box, imin, imax); data = hypre_StructVectorData(vector); hypre_BoxGetSize(box, loop_size); #define DEVICE_VAR is_device_ptr(data) hypre_BoxLoop1Begin(hypre_StructVectorNDim(vector), loop_size, box, imin, imin, datai); { data[datai] *= factor; } hypre_BoxLoop1End(datai); #undef DEVICE_VAR hypre_BoxDestroy(box); return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ hypre_CommPkg * hypre_StructVectorGetMigrateCommPkg( hypre_StructVector *from_vector, hypre_StructVector *to_vector ) { hypre_CommInfo *comm_info; hypre_CommPkg *comm_pkg; /*------------------------------------------------------ * Set up hypre_CommPkg *------------------------------------------------------*/ hypre_CreateCommInfoFromGrids(hypre_StructVectorGrid(from_vector), hypre_StructVectorGrid(to_vector), &comm_info); hypre_CommPkgCreate(comm_info, hypre_StructVectorDataSpace(from_vector), hypre_StructVectorDataSpace(to_vector), 1, NULL, 0, hypre_StructVectorComm(from_vector), &comm_pkg); hypre_CommInfoDestroy(comm_info); /* is this correct for periodic? */ return comm_pkg; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_StructVectorMigrate( hypre_CommPkg *comm_pkg, hypre_StructVector *from_vector, hypre_StructVector *to_vector ) { hypre_CommHandle *comm_handle; /*----------------------------------------------------------------------- * Migrate the vector data *-----------------------------------------------------------------------*/ hypre_InitializeCommunication(comm_pkg, hypre_StructVectorData(from_vector), hypre_StructVectorData(to_vector), 0, 0, &comm_handle); hypre_FinalizeCommunication(comm_handle); return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_StructVectorPrintData *--------------------------------------------------------------------------*/ HYPRE_Int hypre_StructVectorPrintData( FILE *file, hypre_StructVector *vector, HYPRE_Int all ) { HYPRE_Int ndim = hypre_StructVectorNDim(vector); hypre_StructGrid *grid = hypre_StructVectorGrid(vector); hypre_BoxArray *grid_boxes = hypre_StructGridBoxes(grid); hypre_BoxArray *data_space = hypre_StructVectorDataSpace(vector); HYPRE_Int data_size = hypre_StructVectorDataSize(vector); HYPRE_Complex *data = hypre_StructVectorData(vector); HYPRE_MemoryLocation memory_location = hypre_StructVectorMemoryLocation(vector); hypre_BoxArray *boxes; HYPRE_Complex *h_data; /* Allocate/Point to data on the host memory */ if (hypre_GetActualMemLocation(memory_location) != hypre_MEMORY_HOST) { h_data = hypre_CTAlloc(HYPRE_Complex, data_size, HYPRE_MEMORY_HOST); hypre_TMemcpy(h_data, data, HYPRE_Complex, data_size, HYPRE_MEMORY_HOST, memory_location); } else { h_data = data; } /* Print ghost data (all) also or only real data? */ boxes = (all) ? data_space : grid_boxes; /* Print data to file */ hypre_PrintBoxArrayData(file, boxes, data_space, 1, ndim, h_data); /* Free memory */ if (hypre_GetActualMemLocation(memory_location) != hypre_MEMORY_HOST) { hypre_TFree(h_data, HYPRE_MEMORY_HOST); } return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_StructVectorReadData *--------------------------------------------------------------------------*/ HYPRE_Int hypre_StructVectorReadData( FILE *file, hypre_StructVector *vector ) { HYPRE_Int ndim = hypre_StructVectorNDim(vector); hypre_StructGrid *grid = hypre_StructVectorGrid(vector); hypre_BoxArray *grid_boxes = hypre_StructGridBoxes(grid); hypre_BoxArray *data_space = hypre_StructVectorDataSpace(vector); HYPRE_Int data_size = hypre_StructVectorDataSize(vector); HYPRE_Complex *data = hypre_StructVectorData(vector); HYPRE_MemoryLocation memory_location = hypre_StructVectorMemoryLocation(vector); HYPRE_Complex *h_data; /* Allocate/Point to data on the host memory */ if (hypre_GetActualMemLocation(memory_location) != hypre_MEMORY_HOST) { h_data = hypre_CTAlloc(HYPRE_Complex, data_size, HYPRE_MEMORY_HOST); } else { h_data = data; } /* Read data from file */ hypre_ReadBoxArrayData(file, grid_boxes, data_space, 1, ndim, h_data); /* Move data to the device memory if necessary and free host data */ if (hypre_GetActualMemLocation(memory_location) != hypre_MEMORY_HOST) { hypre_TMemcpy(data, h_data, HYPRE_Complex, data_size, memory_location, HYPRE_MEMORY_HOST); hypre_TFree(h_data, HYPRE_MEMORY_HOST); } return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_StructVectorPrint *--------------------------------------------------------------------------*/ HYPRE_Int hypre_StructVectorPrint( const char *filename, hypre_StructVector *vector, HYPRE_Int all ) { FILE *file; char new_filename[255]; hypre_StructGrid *grid; HYPRE_Int myid; /*---------------------------------------- * Open file *----------------------------------------*/ hypre_MPI_Comm_rank(hypre_StructVectorComm(vector), &myid); hypre_sprintf(new_filename, "%s.%05d", filename, myid); if ((file = fopen(new_filename, "w")) == NULL) { hypre_printf("Error: can't open output file %s\n", new_filename); hypre_error_in_arg(1); return hypre_error_flag; } /*---------------------------------------- * Print header info *----------------------------------------*/ hypre_fprintf(file, "StructVector\n"); /* print grid info */ hypre_fprintf(file, "\nGrid:\n"); grid = hypre_StructVectorGrid(vector); hypre_StructGridPrint(file, grid); /*---------------------------------------- * Print data *----------------------------------------*/ hypre_fprintf(file, "\nData:\n"); hypre_StructVectorPrintData(file, vector, all); /*---------------------------------------- * Close file *----------------------------------------*/ fflush(file); fclose(file); return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_StructVectorRead *--------------------------------------------------------------------------*/ hypre_StructVector * hypre_StructVectorRead( MPI_Comm comm, const char *filename, HYPRE_Int *num_ghost ) { FILE *file; char new_filename[255]; hypre_StructVector *vector; hypre_StructGrid *grid; HYPRE_Int myid; /*---------------------------------------- * Open file *----------------------------------------*/ hypre_MPI_Comm_rank(comm, &myid); hypre_sprintf(new_filename, "%s.%05d", filename, myid); if ((file = fopen(new_filename, "r")) == NULL) { hypre_printf("Error: can't open input file %s\n", new_filename); hypre_error_in_arg(2); exit(1); } /*---------------------------------------- * Read header info *----------------------------------------*/ hypre_fscanf(file, "StructVector\n"); /* read grid info */ hypre_fscanf(file, "\nGrid:\n"); hypre_StructGridRead(comm, file, &grid); /*---------------------------------------- * Initialize the vector *----------------------------------------*/ vector = hypre_StructVectorCreate(comm, grid); hypre_StructVectorSetNumGhost(vector, num_ghost); hypre_StructVectorInitialize(vector); /*---------------------------------------- * Read data *----------------------------------------*/ hypre_fscanf(file, "\nData:\n"); hypre_StructVectorReadData(file, vector); /*---------------------------------------- * Assemble the vector *----------------------------------------*/ hypre_StructVectorAssemble(vector); /*---------------------------------------- * Close file *----------------------------------------*/ fclose(file); return vector; } /*-------------------------------------------------------------------------- * The following is used only as a debugging aid. * * hypre_StructVectorClone * Returns a complete copy of x - a deep copy, with its own copy of the data. *--------------------------------------------------------------------------*/ hypre_StructVector * hypre_StructVectorClone(hypre_StructVector *x) { MPI_Comm comm = hypre_StructVectorComm(x); hypre_StructGrid *grid = hypre_StructVectorGrid(x); HYPRE_MemoryLocation memory_location = hypre_StructVectorMemoryLocation(x); hypre_BoxArray *data_space = hypre_StructVectorDataSpace(x); HYPRE_Int *data_indices = hypre_StructVectorDataIndices(x); HYPRE_Int data_size = hypre_StructVectorDataSize(x); HYPRE_Int ndim = hypre_StructGridNDim(grid); HYPRE_Int data_space_size = hypre_BoxArraySize(data_space); hypre_StructVector *y = hypre_StructVectorCreate(comm, grid); HYPRE_Int i; hypre_StructVectorDataSize(y) = data_size; hypre_StructVectorDataSpace(y) = hypre_BoxArrayDuplicate(data_space); hypre_StructVectorData(y) = hypre_CTAlloc(HYPRE_Complex, data_size, memory_location); hypre_StructVectorDataIndices(y) = hypre_CTAlloc(HYPRE_Int, data_space_size, HYPRE_MEMORY_HOST); for (i = 0; i < data_space_size; i++) { hypre_StructVectorDataIndices(y)[i] = data_indices[i]; } hypre_StructVectorCopy( x, y ); for (i = 0; i < 2 * ndim; i++) { hypre_StructVectorNumGhost(y)[i] = hypre_StructVectorNumGhost(x)[i]; } hypre_StructVectorBGhostNotClear(y) = hypre_StructVectorBGhostNotClear(x); hypre_StructVectorGlobalSize(y) = hypre_StructVectorGlobalSize(x); return y; } hypre-2.33.0/src/struct_mv/struct_vector.h000066400000000000000000000070711477326011500206350ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * Header info for the hypre_StructVector structures * *****************************************************************************/ #ifndef hypre_STRUCT_VECTOR_HEADER #define hypre_STRUCT_VECTOR_HEADER /*-------------------------------------------------------------------------- * hypre_StructVector: *--------------------------------------------------------------------------*/ typedef struct hypre_StructVector_struct { MPI_Comm comm; hypre_StructGrid *grid; hypre_BoxArray *data_space; HYPRE_MemoryLocation memory_location; /* memory location of data */ HYPRE_Complex *data; /* Pointer to vector data on device*/ HYPRE_Int data_alloced; /* Boolean used for freeing data */ HYPRE_Int data_size; /* Size of vector data */ HYPRE_Int *data_indices; /* num-boxes array of indices into the data array. data_indices[b] is the starting index of vector data corresponding to box b. */ HYPRE_Int num_ghost[2 * HYPRE_MAXDIM]; /* Num ghost layers in each * direction */ HYPRE_Int bghost_not_clear; /* Are boundary ghosts clear? */ HYPRE_BigInt global_size; /* Total number coefficients */ HYPRE_Int ref_count; } hypre_StructVector; /*-------------------------------------------------------------------------- * Accessor macros: hypre_StructVector *--------------------------------------------------------------------------*/ #define hypre_StructVectorComm(vector) ((vector) -> comm) #define hypre_StructVectorGrid(vector) ((vector) -> grid) #define hypre_StructVectorDataSpace(vector) ((vector) -> data_space) #define hypre_StructVectorMemoryLocation(vector) ((vector) -> memory_location) #define hypre_StructVectorData(vector) ((vector) -> data) #define hypre_StructVectorDataAlloced(vector) ((vector) -> data_alloced) #define hypre_StructVectorDataSize(vector) ((vector) -> data_size) #define hypre_StructVectorDataIndices(vector) ((vector) -> data_indices) #define hypre_StructVectorNumGhost(vector) ((vector) -> num_ghost) #define hypre_StructVectorBGhostNotClear(vector) ((vector) -> bghost_not_clear) #define hypre_StructVectorGlobalSize(vector) ((vector) -> global_size) #define hypre_StructVectorRefCount(vector) ((vector) -> ref_count) #define hypre_StructVectorNDim(vector) \ hypre_StructGridNDim(hypre_StructVectorGrid(vector)) #define hypre_StructVectorBox(vector, b) \ hypre_BoxArrayBox(hypre_StructVectorDataSpace(vector), b) #define hypre_StructVectorBoxData(vector, b) \ (hypre_StructVectorData(vector) + hypre_StructVectorDataIndices(vector)[b]) #define hypre_StructVectorBoxDataValue(vector, b, index) \ (hypre_StructVectorBoxData(vector, b) + \ hypre_BoxIndexRank(hypre_StructVectorBox(vector, b), index)) #endif hypre-2.33.0/src/tarch000077500000000000000000000036331477326011500145570ustar00rootroot00000000000000#! /bin/bash # set -x # # Returns the architecture of the host machine # # # Try to find location of utility uname for dir in /bin /usr/bin /usr/local/bin ; do if [ -x $dir/uname ] ; then UNAME="$dir/uname" break fi done # # Get machine kernal and hardware names values # if [ -n "$UNAME" ] ; then ARCHLIST="`uname -s`" ARCHLIST="$ARCHLIST `uname -m`" fi # # Get environment variable, ARCH, name if defined if [ -n "$ARCH" ] ; then ARCHLIST="$ARCHLIST $ARCH" fi # # Get arch command and execute it to get host machine architecture if [ -x /bin/arch ] ; then ARCHLIST="$ARCHLIST `/bin/arch`" elif [ -x /usr/local/bin/arch ] ; then ARCHLIST="$ARCHLIST `/usr/local/bin/arch`" fi # # GARCH is a guess for the host machine architecture # LARCH is current value from list of architectures # FARCH is the returned value GARCH= # search architecture list; removing blanks first for LARCH in $ARCHLIST ; do LARCH=`echo $LARCH | sed 's/ //g'` case $LARCH in AIX|RIOS|ppc64) FARCH=rs6000; break ;; HP-UX) FARCH=hpux ; break ;; IRIX64|IRIX) FARCH=$LARCH ; break ;; Linux|LINUX) FARCH=LINUX ; break ;; i586|i486|i86pc) GARCH=$LARCH ;; sun4*) Version=`$UNAME -r` MajorVersion=`expr "$Version" : "\(.\)"` if [ "$MajorVersion" -ge 5 ] ; then FARCH=solaris else FARCH=sun4 fi break ;; hp9000*|hp7000*) FARCH=hpux ; break ;; mips|dec-5000) FARCH=dec5000 ; break ;; IP12|iris-4d) GARCH=IRIX ;; cray|CRAY*) GARCH=CRAY ;; KSR1|KSR2) FARCH=ksr ; break ;; FreeBSD) FARCH=freebsd ; break ;; i386) GARCH=ipsc2 ;; ULTRIX|RISC) GARCH=dec5000 ;; esac LLARCH=$LARCH done # # Set return value if not already defined if [ -z "$FARCH" ] ; then FARCH=$GARCH if [ -z "$FARCH" ] ; then FARCH=$LLARCH fi if [ -z "$FARCH" ] ; then FARCH=unknown fi fi echo $FARCH exit 0 hypre-2.33.0/src/test/000077500000000000000000000000001477326011500145025ustar00rootroot00000000000000hypre-2.33.0/src/test/CMakeLists.txt000066400000000000000000000114731477326011500172500ustar00rootroot00000000000000# Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) add_definitions (-DHYPRE_TIMING) if (MSVC) add_definitions(-D_CRT_SECURE_NO_WARNINGS) endif () # Set default tolerance if not defined if(NOT DEFINED HYPRE_CHECK_TOL) set(HYPRE_CHECK_TOL 1.0e-6) endif() set(TEST_SRCS ij.c sstruct.c struct.c ams_driver.c maxwell_unscaled.c struct_migrate.c sstruct_fac.c ij_assembly.c ) add_hypre_executables(TEST_SRCS) # Copy test input files configure_file(${CMAKE_CURRENT_SOURCE_DIR}/TEST_sstruct/sstruct.in.default ${CMAKE_CURRENT_BINARY_DIR}/sstruct.in.default COPYONLY) # Add check target find_program(BASH_PROGRAM bash) # Run check target add_custom_target(check COMMAND ${CMAKE_COMMAND} -E echo "Checking the library..." COMMAND ${MPIEXEC_EXECUTABLE} ${MPIEXEC_NUMPROC_FLAG} 1 $ 2> ij.err COMMAND ${MPIEXEC_EXECUTABLE} ${MPIEXEC_NUMPROC_FLAG} 1 $ 2> struct.err COMMAND ${MPIEXEC_EXECUTABLE} ${MPIEXEC_NUMPROC_FLAG} 1 $ 2> sstruct.err COMMAND ${CMAKE_COMMAND} -E echo "Test error files:" COMMAND ${CMAKE_COMMAND} -E cat ij.err struct.err sstruct.err WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} DEPENDS ij struct sstruct COMMENT "Running basic library check" VERBATIM ) # Add checkpar target for parallel testing add_custom_target(checkpar COMMAND ${CMAKE_COMMAND} -E echo "Checking the library..." COMMAND ${CMAKE_COMMAND} -E echo_append "Testing IJ... " COMMAND ${BASH_PROGRAM} ${CMAKE_CURRENT_SOURCE_DIR}/runtest.sh -atol ${HYPRE_CHECK_TOL} -mpi "${MPIEXEC_EXECUTABLE} ${MPIEXEC_NUMPROC_FLAG}" ${CMAKE_CURRENT_SOURCE_DIR}/TEST_ij/solvers.sh COMMAND ${BASH_PROGRAM} ${CMAKE_CURRENT_SOURCE_DIR}/checktest.sh COMMAND ${BASH_PROGRAM} ${CMAKE_CURRENT_SOURCE_DIR}/cleantest.sh COMMAND echo "" COMMAND ${CMAKE_COMMAND} -E echo_append "Testing Struct... " COMMAND ${BASH_PROGRAM} ${CMAKE_CURRENT_SOURCE_DIR}/runtest.sh -atol ${HYPRE_CHECK_TOL} -mpi "${MPIEXEC_EXECUTABLE} ${MPIEXEC_NUMPROC_FLAG}" ${CMAKE_CURRENT_SOURCE_DIR}/TEST_struct/solvers.sh COMMAND ${BASH_PROGRAM} ${CMAKE_CURRENT_SOURCE_DIR}/checktest.sh COMMAND ${BASH_PROGRAM} ${CMAKE_CURRENT_SOURCE_DIR}/cleantest.sh COMMAND echo "" COMMAND ${CMAKE_COMMAND} -E echo_append "Testing SStruct... " COMMAND ${BASH_PROGRAM} ${CMAKE_CURRENT_SOURCE_DIR}/runtest.sh -atol ${HYPRE_CHECK_TOL} -mpi "${MPIEXEC_EXECUTABLE} ${MPIEXEC_NUMPROC_FLAG}" ${CMAKE_CURRENT_SOURCE_DIR}/TEST_sstruct/solvers.sh COMMAND ${BASH_PROGRAM} ${CMAKE_CURRENT_SOURCE_DIR}/checktest.sh COMMAND ${BASH_PROGRAM} ${CMAKE_CURRENT_SOURCE_DIR}/cleantest.sh COMMAND echo "" WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} DEPENDS ${TEST_SRCS} COMMENT "Running parallel tests" VERBATIM ) # Add CTest support if(BUILD_TESTING) message(STATUS "Building tests with CTest support") # IJ tests add_test(NAME test_ij_solvers COMMAND ${BASH_PROGRAM} -c "\ ${BASH_PROGRAM} ${CMAKE_CURRENT_SOURCE_DIR}/runtest.sh \ -atol ${HYPRE_CHECK_TOL} \ -mpi \"${MPIEXEC_EXECUTABLE} ${MPIEXEC_NUMPROC_FLAG}\" \ ${CMAKE_CURRENT_SOURCE_DIR}/TEST_ij/solvers.sh && \ ${BASH_PROGRAM} ${CMAKE_CURRENT_SOURCE_DIR}/checktest.sh && \ ${BASH_PROGRAM} ${CMAKE_CURRENT_SOURCE_DIR}/cleantest.sh" ) set_tests_properties(test_ij_solvers PROPERTIES WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} DEPENDS ij FAIL_REGULAR_EXPRESSION "Failed" ) # Struct tests add_test(NAME test_struct_solvers COMMAND ${BASH_PROGRAM} -c "\ ${BASH_PROGRAM} ${CMAKE_CURRENT_SOURCE_DIR}/runtest.sh \ -atol ${HYPRE_CHECK_TOL} \ -mpi \"${MPIEXEC_EXECUTABLE} ${MPIEXEC_NUMPROC_FLAG}\" \ ${CMAKE_CURRENT_SOURCE_DIR}/TEST_struct/solvers.sh && \ ${BASH_PROGRAM} ${CMAKE_CURRENT_SOURCE_DIR}/checktest.sh && \ ${BASH_PROGRAM} ${CMAKE_CURRENT_SOURCE_DIR}/cleantest.sh" ) set_tests_properties(test_struct_solvers PROPERTIES WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} DEPENDS struct FAIL_REGULAR_EXPRESSION "Failed" ) # SStruct tests add_test(NAME test_sstruct_solvers COMMAND ${BASH_PROGRAM} -c "\ ${BASH_PROGRAM} ${CMAKE_CURRENT_SOURCE_DIR}/runtest.sh \ -atol ${HYPRE_CHECK_TOL} \ -mpi \"${MPIEXEC_EXECUTABLE} ${MPIEXEC_NUMPROC_FLAG}\" \ ${CMAKE_CURRENT_SOURCE_DIR}/TEST_sstruct/solvers.sh && \ ${BASH_PROGRAM} ${CMAKE_CURRENT_SOURCE_DIR}/checktest.sh && \ ${BASH_PROGRAM} ${CMAKE_CURRENT_SOURCE_DIR}/cleantest.sh" ) set_tests_properties(test_sstruct_solvers PROPERTIES WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} DEPENDS sstruct FAIL_REGULAR_EXPRESSION "Failed" ) endif() hypre-2.33.0/src/test/Makefile000066400000000000000000000147711477326011500161540ustar00rootroot00000000000000# Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) default:all include ../config/Makefile.config CINCLUDES = ${INCLUDES} ${MPIINCLUDE} CDEFS = -DHYPRE_TIMING -DHYPRE_FORTRAN CXXDEFS = -DNOFEI -DHYPRE_TIMING -DMPICH_SKIP_MPICXX C_COMPILE_FLAGS = \ -I$(srcdir)\ -I${HYPRE_BUILD_DIR}/include\ $(SUPERLU_INCLUDE)\ $(DSUPERLU_INCLUDE)\ ${CINCLUDES}\ ${CDEFS} CXX_COMPILE_FLAGS = \ -I$(srcdir)\ -I$(srcdir)/../FEI_mv/fei-base\ -I${HYPRE_BUILD_DIR}/include\ $(SUPERLU_INCLUDE)\ $(DSUPERLU_INCLUDE)\ ${CINCLUDES}\ ${CXXDEFS} F77_COMPILE_FLAGS = \ -I$(srcdir)\ -I${HYPRE_BUILD_DIR}/include\ ${CINCLUDES} MPILIBFLAGS = ${MPILIBDIRS} ${MPILIBS} ${MPIFLAGS} LAPACKLIBFLAGS = ${LAPACKLIBDIRS} ${LAPACKLIBS} BLASLIBFLAGS = ${BLASLIBDIRS} ${BLASLIBS} LIBFLAGS = ${LDFLAGS} ${LIBS} LIBHYPRE = -L${HYPRE_BUILD_DIR}/lib -lHYPRE ifeq ($(notdir $(firstword ${LINK_CC})), nvcc) XLINK = -Xlinker=-rpath,${HYPRE_BUILD_DIR}/lib else XLINK = -Wl,-rpath,${HYPRE_BUILD_DIR}/lib endif LFLAGS =\ $(LIBHYPRE)\ ${XLINK}\ ${DSUPERLU_LIBS}\ ${SUPERLU_LIBS}\ ${MPILIBFLAGS}\ ${LAPACKLIBFLAGS}\ ${BLASLIBFLAGS}\ ${LIBFLAGS} ################################################################## # Targets ################################################################## HYPRE_DRIVERS =\ ij.c\ ij_assembly.c\ sstruct.c\ struct.c\ ams_driver.c\ maxwell_unscaled.c\ struct_migrate.c\ sstruct_fac.c\ ij_mm.c\ zboxloop.c HYPRE_DRIVERS_CXX =\ cxx_ij.cxx\ cxx_sstruct.cxx\ cxx_struct.cxx HYPRE_F77_EXAMPLES_DRIVERS =\ ex1_for.c\ ex3_for.c\ ex5_for.c\ ex6_for.c\ ex7_for.c HYPRE_DRIVERS_F77 =\ f77_ij.f\ f77_struct.f HYPRE_DRIVER_EXECS=${HYPRE_DRIVERS:.c=} HYPRE_F77_EXAMPLES_DRIVER_EXECS=${HYPRE_F77_EXAMPLES_DRIVERS:.c=} HYPRE_DRIVER_F77_EXECS=${HYPRE_DRIVERS_F77:.f=} HYPRE_DRIVER_CXX_EXECS=${HYPRE_DRIVERS_CXX:.cxx=} all: ${HYPRE_DRIVER_EXECS} all77: ${HYPRE_DRIVER_F77_EXECS} all++: ${HYPRE_DRIVER_CXX_EXECS} install: clean: rm -f *.o *.obj *.csv rm -rf pchdir tca.map *inslog* distclean: clean rm -f ${HYPRE_DRIVER_EXECS} rm -f ${HYPRE_F77_EXAMPLES_DRIVER_EXECS} rm -f ${HYPRE_DRIVER_F77_EXECS} rm -f ${HYPRE_DRIVER_CXX_EXECS} cxx_* rm -f TEST_examples/*.out* rm -f TEST_examples/*.err* rm -f TEST_fac/*.out* rm -f TEST_fac/*.err* rm -f TEST_ij/*.out* rm -f TEST_ij/*.err* rm -f TEST_ij/*.txt* rm -f TEST_ij/vectors.* rm -f TEST_sstruct/*.out* rm -f TEST_sstruct/*.err* rm -f TEST_struct/*.out* rm -f TEST_struct/*.err* rm -f ex1 ex2 ex3 ex4 ex5 ex5big ex5b ex5b77 ex6 ex7 ex8 ex9 ex15big ex18comp ################################################################## # Rules ################################################################## # C ij: ij.o @echo "Building" $@ "... " ${LINK_CC} -o $@ $< ${LFLAGS} ij_assembly: ij_assembly.o @echo "Building" $@ "... " ${LINK_CC} -o $@ $< ${LFLAGS} sstruct: sstruct.o @echo "Building" $@ "... " ${LINK_CC} -o $@ $< ${LFLAGS} struct: struct.obj @echo "Building" $@ "... " ${LINK_CC} -o $@ $< ${LFLAGS} ams_driver: ams_driver.o @echo "Building" $@ "... " ${LINK_CC} -o $@ $< ${LFLAGS} maxwell_unscaled: maxwell_unscaled.o @echo "Building" $@ "... " ${LINK_CC} -o $@ $< ${LFLAGS} struct_migrate: struct_migrate.o @echo "Building" $@ "... " ${LINK_CC} -o $@ $< ${LFLAGS} sstruct_fac: sstruct_fac.o @echo "Building" $@ "... " ${LINK_CC} -o $@ $< ${LFLAGS} ij_device: ij_device.o @echo "Building" $@ "... " ${LINK_CC} -o $@ $< ${LFLAGS} ij_mm: ij_mm.o @echo "Building" $@ "... " ${LINK_CC} -o $@ $< ${LFLAGS} zboxloop: zboxloop.obj @echo "Building" $@ "... " ${LINK_CC} -o $@ $< ${LFLAGS} struct_newboxloop: struct_newboxloop.o $(KOKKOS_LINK_DEPENDS) @echo "Building" $@ "... " ${LINK_CC} -o $@ $< ${LFLAGS} # RDF: Keep these for now hypre_set_precond: hypre_set_precond.o @echo "Building" $@ "... " ${LINK_CC} -o $@ $@.o ${LFLAGS} test_ij: hypre_set_precond.o test_ij.o @echo "Building" $@ "... " ${LINK_CC} -o $@ hypre_set_precond.o $@.o ${LFLAGS} driver_commpkg: driver_commpkg.o @echo "Building" $@ "... " ${LINK_CC} -o $@ $@.o ${LFLAGS} # C++ fei: fei.o @echo "Building" $@ "... " ${LINK_CXX} -o $@ $@.o ${LFLAGS} cxx_ij: cxx_ij.o @echo "Building" $@ "... " ${LINK_CXX} -o $@ $@.o ${LFLAGS} cxx_ij.o: cxx_ij.cxx cxx_ij.cxx: ij.c cp -fp ij.c cxx_ij.cxx cxx_sstruct: cxx_sstruct.o @echo "Building" $@ "... " ${LINK_CXX} -o $@ $@.o ${LFLAGS} cxx_sstruct.o: cxx_sstruct.cxx cxx_sstruct.cxx: sstruct.c cp -fp sstruct.c cxx_sstruct.cxx cxx_struct: cxx_struct.o @echo "Building" $@ "... " ${LINK_CXX} -o $@ $@.o ${LFLAGS} cxx_struct.o: cxx_struct.cxx cxx_struct.cxx: struct.c cp -fp struct.c cxx_struct.cxx # Fortran f77_ij: f77_ij.o @echo "Building" $@ "... " ${LINK_FC} -o $@ $@.o ${LFLAGS} f77_struct: f77_struct.o @echo "Building" $@ "... " ${LINK_FC} -o $@ $@.o ${LFLAGS} # RDF: Keep these for now struct_for: fstruct_mv.o fstruct_ls.o struct_for.o @echo "Building" $@ "... " ${LINK_CC} -o $@ fstruct_mv.o fstruct_ls.o $@.o ${LFLAGS} ex1_for: fstruct_mv.o fstruct_ls.o ex1_for.o @echo "Building" $@ "... " ${LINK_CC} -o $@ fstruct_mv.o fstruct_ls.o $@.o ${LFLAGS} ex3_for: fstruct_mv.o fstruct_ls.o ex3_for.o @echo "Building" $@ "... " ${LINK_CC} -o $@ fstruct_mv.o fstruct_ls.o $@.o ${LFLAGS} ex5_for: fij_mv.o fparcsr_mv.o fparcsr_ls.o ex5_for.o @echo "Building" $@ "... " ${LINK_CC} -o $@ fij_mv.o fparcsr_mv.o fparcsr_ls.o $@.o ${LFLAGS} ex6_for: fstruct_mv.o fstruct_ls.o fsstruct_mv.o fsstruct_ls.o ex6_for.o @echo "Building" $@ "... " ${LINK_CC} -o $@ fstruct_mv.o fstruct_ls.o fsstruct_mv.o fsstruct_ls.o $@.o ${LFLAGS} ex7_for: fstruct_mv.o fstruct_ls.o fsstruct_mv.o fsstruct_ls.o ex7_for.o @echo "Building" $@ "... " ${LINK_CC} -o $@ fstruct_mv.o fstruct_ls.o fsstruct_mv.o fsstruct_ls.o $@.o ${LFLAGS} for_maxwell: fparcsr_mv.o fsstruct_mv.o fsstruct_ls.o for_maxwell.o @echo "Building" $@ "... " ${LINK_CC} -o $@ fparcsr_mv.o fsstruct_mv.o fsstruct_ls.o $@.o ${LFLAGS} fij_mv: fij_mv.f @echo "Building" $@ "... " ${LINK_FC} -c $@ fparcsr_ls: fparcsr_ls.f @echo "Building" $@ "... " ${LINK_FC} -c $@ fparcsr_mv: fparcsr_mv.f @echo "Building" $@ "... " ${LINK_FC} -c $@ fsstruct_ls: fsstruct_ls.f @echo "Building" $@ "... " ${LINK_FC} -c $@ fsstruct_mv: fsstruct_mv.f @echo "Building" $@ "... " ${LINK_FC} -c $@ fstruct_ls: fstruct_ls.f @echo "Building" $@ "... " ${LINK_FC} -c $@ fstruct_mv: fstruct_mv.f @echo "Building" $@ "... " ${LINK_FC} -c $@ hypre-2.33.0/src/test/TEST_ams/000077500000000000000000000000001477326011500161215ustar00rootroot00000000000000hypre-2.33.0/src/test/TEST_ams/.psrc000066400000000000000000000002131477326011500170650ustar00rootroot00000000000000insure++.report_file insure.log insure++.report_overwrite false insure++.summarize leaks outstanding insure++.suppress EXPR_NULL,PARM_NULL hypre-2.33.0/src/test/TEST_ams/mfem.A.00000000066400000000000000000015070551477326011500176220ustar00rootroot000000000000001 1075 1 1075 1 1 1.6006250000000001e+01 2 2 3.7343750000291664e+01 3 3 1.6006250000000001e+01 4 4 1.6010416666666668e+01 5 5 5.8672916667041662e+01 5 518 1.0666666666625000e+01 5 516 1.3552527156068805e-19 5 517 -2.4000000000010417e+01 5 3470 1.0666666666625000e+01 5 3463 1.0666666666791667e+01 5 2888 -5.3333333333437496e+00 5 3469 -1.3552527156068805e-19 5 3462 1.0667708333333334e+01 5 3461 2.4000000000010417e+01 5 2887 -1.0667708333333334e+01 5 4353 -5.3333333333437496e+00 5 5053 1.0666666666791667e+01 5 5046 5.3333333333020834e+00 5 5047 -2.1333333333312499e+01 5 4773 -5.3333333333020834e+00 5 4350 -1.0666666666604167e+01 6 6 1.6006250000000001e+01 7 7 3.2020833333333336e+01 8 8 6.4049999999999997e+01 8 850 5.3312499999999998e+00 8 539 -1.0416666666666664e-02 8 530 5.3312499999999998e+00 8 22 -1.0667708333333334e+01 8 831 5.3312499999999998e+00 8 537 -1.0416666666666664e-02 8 538 2.1329166666666662e+01 8 840 -5.3312499999999998e+00 8 19 -1.0661458333333334e+01 8 18 -1.0667708333333334e+01 8 535 -2.1329166666666662e+01 8 525 1.0416666666666664e-02 8 536 2.1329166666666662e+01 9 9 1.6006250000000001e+01 10 10 3.2020833333333336e+01 11 11 6.4049999999999997e+01 11 502 5.3312499999999998e+00 11 837 -1.0416666666666664e-02 11 846 5.3312499999999998e+00 11 20 -1.0667708333333334e+01 11 836 2.1329166666666662e+01 11 19 -1.0661458333333334e+01 11 840 -5.3312499999999998e+00 11 835 -1.0416666666666664e-02 11 831 5.3312499999999998e+00 11 18 -1.0667708333333334e+01 11 834 -2.1329166666666662e+01 11 828 1.0416666666666664e-02 11 505 -2.1329166666666662e+01 12 12 1.6006250000000001e+01 13 13 3.2020833333333336e+01 14 14 6.4049999999999997e+01 14 872 5.3312499999999998e+00 14 511 -1.0416666666666664e-02 14 848 5.3312499999999998e+00 14 21 -1.0667708333333334e+01 14 510 2.1329166666666662e+01 14 19 -1.0661458333333334e+01 14 846 5.3312499999999998e+00 14 509 -1.0416666666666664e-02 14 502 5.3312499999999998e+00 14 20 -1.0667708333333334e+01 14 507 -2.1329166666666662e+01 14 497 1.0416666666666664e-02 14 508 2.1329166666666662e+01 15 15 1.6006250000000001e+01 16 16 3.2020833333333336e+01 17 17 6.4049999999999997e+01 17 530 5.3312499999999998e+00 17 877 -1.0416666666666664e-02 17 850 5.3312499999999998e+00 17 22 -1.0667708333333334e+01 17 852 -2.1329166666666662e+01 17 19 -1.0661458333333334e+01 17 848 5.3312499999999998e+00 17 876 -1.0416666666666664e-02 17 872 5.3312499999999998e+00 17 21 -1.0667708333333334e+01 17 875 -2.1329166666666662e+01 17 867 1.0416666666666664e-02 17 533 -2.1329166666666662e+01 18 18 3.2012500000000003e+01 18 836 -1.3552527156068805e-19 18 834 -1.3552527156068805e-19 18 835 -1.0667708333333334e+01 18 11 -1.0667708333333334e+01 18 536 -1.3552527156068805e-19 18 831 -5.3333333333333330e+00 18 538 1.3552527156068805e-19 18 537 -1.0667708333333334e+01 18 840 5.3333333333333330e+00 18 8 -1.0667708333333334e+01 18 19 -5.3333333333333330e+00 19 19 6.4041666666666671e+01 19 539 5.3312499999999998e+00 19 877 5.3312499999999998e+00 19 850 -5.3395833333333327e+00 19 22 -5.3333333333333330e+00 19 852 2.1334374999999998e+01 19 17 -1.0661458333333334e+01 19 876 5.3312499999999998e+00 19 511 5.3312499999999998e+00 19 848 -5.3395833333333327e+00 19 21 -5.3333333333333330e+00 19 510 -2.1334374999999998e+01 19 14 -1.0661458333333334e+01 19 509 5.3312499999999998e+00 19 837 5.3312499999999998e+00 19 846 -5.3395833333333327e+00 19 20 -5.3333333333333330e+00 19 836 -2.1334374999999998e+01 19 11 -1.0661458333333334e+01 19 835 5.3312499999999998e+00 19 538 -2.1334374999999998e+01 19 537 5.3312499999999998e+00 19 840 5.3395833333333327e+00 19 8 -1.0661458333333334e+01 19 18 -5.3333333333333330e+00 20 20 3.2012500000000003e+01 20 510 -1.3552527156068805e-19 20 507 -1.3552527156068805e-19 20 509 -1.0667708333333334e+01 20 14 -1.0667708333333334e+01 20 505 1.3552527156068805e-19 20 502 -5.3333333333333330e+00 20 836 1.3552527156068805e-19 20 837 -1.0667708333333334e+01 20 846 -5.3333333333333330e+00 20 11 -1.0667708333333334e+01 20 19 -5.3333333333333330e+00 21 21 3.2012500000000003e+01 21 852 1.3552527156068805e-19 21 875 -1.3552527156068805e-19 21 876 -1.0667708333333334e+01 21 17 -1.0667708333333334e+01 21 508 -1.3552527156068805e-19 21 872 -5.3333333333333330e+00 21 510 1.3552527156068805e-19 21 511 -1.0667708333333334e+01 21 848 -5.3333333333333330e+00 21 14 -1.0667708333333334e+01 21 19 -5.3333333333333330e+00 22 22 3.2012500000000003e+01 22 538 -1.3552527156068805e-19 22 535 -1.3552527156068805e-19 22 539 -1.0667708333333334e+01 22 8 -1.0667708333333334e+01 22 533 1.3552527156068805e-19 22 530 -5.3333333333333330e+00 22 852 -1.3552527156068805e-19 22 877 -1.0667708333333334e+01 22 850 -5.3333333333333330e+00 22 17 -1.0667708333333334e+01 22 19 -5.3333333333333330e+00 23 23 3.2012500000000003e+01 23 564 1.3552527156068805e-19 23 506 1.3552527156068805e-19 23 513 1.3552527156068805e-19 23 512 -1.0667708333333334e+01 23 561 -5.3333333333333330e+00 23 27 -1.0667708333333334e+01 23 26 -5.3333333333333330e+00 23 503 -1.3552527156068805e-19 23 570 -1.0667708333333334e+01 23 502 -5.3333333333333330e+00 23 25 -1.0667708333333334e+01 24 24 3.2020833333333336e+01 25 25 6.4049999999999997e+01 25 561 5.3312499999999998e+00 25 572 -1.0416666666666664e-02 25 571 2.1329166666666662e+01 25 550 -5.3312499999999998e+00 25 558 1.0416666666666664e-02 25 564 -2.1329166666666662e+01 25 555 -5.3312499999999998e+00 25 26 -1.0661458333333334e+01 25 30 -1.0667708333333334e+01 25 570 -1.0416666666666664e-02 25 503 -2.1329166666666662e+01 25 502 5.3312499999999998e+00 25 23 -1.0667708333333334e+01 26 26 5.3354166666875003e+01 26 570 5.3312499999999998e+00 26 515 5.3312499999999998e+00 26 562 2.6635416666145835e+00 26 36 -8.0000000000000000e+00 26 554 -3.6295685768920020e-28 26 560 1.0666666666562499e+01 26 33 -1.0666666666666666e+01 26 564 2.1334374999999998e+01 26 558 -5.3312499999999998e+00 26 555 -2.6635416666145835e+00 26 25 -1.0661458333333334e+01 26 30 -8.0000000000000000e+00 26 513 -2.1334374999999998e+01 26 512 5.3312499999999998e+00 26 561 -5.3395833333333327e+00 26 27 -1.0661458333333334e+01 26 23 -5.3333333333333330e+00 26 5053 2.2851328271989659e-27 27 27 6.4049999999999997e+01 27 562 5.3312499999999998e+00 27 515 -1.0416666666666664e-02 27 517 5.3312499999999998e+00 27 36 -1.0667708333333334e+01 27 502 5.3312499999999998e+00 27 514 2.1329166666666662e+01 27 499 1.0416666666666664e-02 27 506 -2.1329166666666662e+01 27 512 -1.0416666666666664e-02 27 513 2.1329166666666662e+01 27 561 5.3312499999999998e+00 27 26 -1.0661458333333334e+01 27 23 -1.0667708333333334e+01 28 28 1.6006250000000001e+01 29 29 3.7343750000291664e+01 30 30 3.7339583333437503e+01 30 560 2.0194839173657902e-27 30 574 -2.0194839173657902e-27 30 33 -5.3333333333229165e+00 30 554 5.3333333333229165e+00 30 571 -1.3552527156068805e-19 30 550 1.3333333333343749e+01 30 564 -1.3552527156068805e-19 30 558 1.0667708333333334e+01 30 555 8.0000000000000000e+00 30 25 -1.0667708333333334e+01 30 26 -8.0000000000000000e+00 31 31 3.7343750000291664e+01 32 32 2.1333333333437498e+01 33 33 4.2666666667166666e+01 33 518 -1.0666666666729165e+01 33 517 5.3333333332812494e+00 33 562 2.2470898404921788e-28 33 36 -5.3333333333229165e+00 33 555 -2.0194839173657902e-27 33 560 -1.0666666666666666e+01 33 26 -1.0666666666666666e+01 33 554 6.2499999999999991e-11 33 550 -5.3333333332812494e+00 33 30 -5.3333333333229165e+00 33 574 -1.0666666666729165e+01 33 825 -6.2500000000000004e-11 33 824 1.0666666666666666e+01 33 5057 -6.2499999999999991e-11 33 5053 -6.2500000000000004e-11 34 34 2.1333333333541667e+01 35 35 1.6006250000000001e+01 36 36 3.7339583333437503e+01 36 518 2.0194839173657902e-27 36 560 -2.0194839173657902e-27 36 33 -5.3333333333229165e+00 36 513 -1.3552527156068805e-19 36 26 -8.0000000000000000e+00 36 562 -8.0000000000000000e+00 36 514 1.3552527156068805e-19 36 515 -1.0667708333333334e+01 36 517 -1.3333333333343749e+01 36 27 -1.0667708333333334e+01 36 5053 -5.3333333333229165e+00 37 37 2.1333333333437498e+01 38 38 3.2012500000000003e+01 38 509 1.3552527156068805e-19 38 512 -1.3552527156068805e-19 38 43 -5.3333333333333330e+00 38 502 5.3333333333333330e+00 38 499 -1.3552527156068805e-19 38 506 1.0667708333333334e+01 38 41 -1.0667708333333334e+01 38 497 1.3552527156068805e-19 38 40 -1.0667708333333334e+01 38 39 -5.3333333333333330e+00 38 507 1.0667708333333334e+01 39 39 6.4041666666666671e+01 39 508 5.3312499999999998e+00 39 873 -5.3312499999999998e+00 39 46 -5.3333333333333330e+00 39 501 2.1334374999999998e+01 39 886 5.3312499999999998e+00 39 47 -1.0661458333333334e+01 39 521 5.3312499999999998e+00 39 48 -5.3333333333333330e+00 39 495 2.1334374999999998e+01 39 516 -5.3312499999999998e+00 39 514 5.3312499999999998e+00 39 42 -5.3333333333333330e+00 39 499 2.1334374999999998e+01 39 506 -5.3312499999999998e+00 39 41 -1.0661458333333334e+01 39 497 2.1334374999999998e+01 39 40 -1.0661458333333334e+01 39 507 -5.3312499999999998e+00 39 38 -5.3333333333333330e+00 39 2868 -1.0661458333333334e+01 40 40 6.4049999999999997e+01 40 508 -1.0416666666666664e-02 40 872 -5.3312499999999998e+00 40 46 -1.0667708333333334e+01 40 511 2.1329166666666662e+01 40 848 -5.3312499999999998e+00 40 45 -1.0661458333333334e+01 40 510 -1.0416666666666664e-02 40 846 -5.3312499999999998e+00 40 44 -1.0667708333333334e+01 40 509 2.1329166666666662e+01 40 502 -5.3312499999999998e+00 40 43 -1.0661458333333334e+01 40 507 1.0416666666666664e-02 40 497 -2.1329166666666662e+01 40 39 -1.0661458333333334e+01 40 38 -1.0667708333333334e+01 41 41 6.4049999999999997e+01 41 562 -5.3312499999999998e+00 41 515 2.1329166666666662e+01 41 517 -5.3312499999999998e+00 41 513 -1.0416666666666664e-02 41 561 -5.3312499999999998e+00 41 51 -1.0667708333333334e+01 41 512 2.1329166666666662e+01 41 43 -1.0661458333333334e+01 41 502 -5.3312499999999998e+00 41 514 -1.0416666666666664e-02 41 42 -1.0667708333333334e+01 41 506 1.0416666666666664e-02 41 499 -2.1329166666666662e+01 41 39 -1.0661458333333334e+01 41 38 -1.0667708333333334e+01 41 2865 -1.0661458333333334e+01 42 42 3.2012500000000003e+01 42 515 1.3552527156068805e-19 42 517 5.3333333333333330e+00 42 495 -1.3552527156068805e-19 42 516 1.0667708333333334e+01 42 499 1.3552527156068805e-19 42 41 -1.0667708333333334e+01 42 39 -5.3333333333333330e+00 42 514 -1.0667708333333334e+01 42 3462 1.3552527156068805e-19 42 2865 -5.3333333333333330e+00 42 2868 -1.0667708333333334e+01 43 43 6.4041666666666671e+01 43 513 5.3312499999999998e+00 43 563 -5.3312499999999998e+00 43 561 5.3395833333333327e+00 43 51 -5.3333333333333330e+00 43 864 2.1334374999999998e+01 43 863 -5.3395833333333327e+00 43 862 2.1334374999999998e+01 43 847 -5.3312499999999998e+00 43 510 5.3312499999999998e+00 43 846 5.3395833333333327e+00 43 44 -5.3333333333333330e+00 43 509 -2.1334374999999998e+01 43 507 -5.3312499999999998e+00 43 40 -1.0661458333333334e+01 43 512 -2.1334374999999998e+01 43 41 -1.0661458333333334e+01 43 506 -5.3312499999999998e+00 43 502 5.3395833333333327e+00 43 38 -5.3333333333333330e+00 43 3468 -5.3312499999999998e+00 43 2866 -1.0661458333333334e+01 43 3413 -5.3312499999999998e+00 43 2869 -5.3333333333333330e+00 43 2860 -1.0661458333333334e+01 44 44 3.2012500000000003e+01 44 511 1.3552527156068805e-19 44 865 -1.0842021724855044e-19 44 45 -5.3333333333333330e+00 44 848 5.3333333333333330e+00 44 862 -1.0842021724855044e-19 44 847 1.0667708333333334e+01 44 509 -1.3552527156068805e-19 44 40 -1.0667708333333334e+01 44 43 -5.3333333333333330e+00 44 510 -1.0667708333333334e+01 44 846 5.3333333333333330e+00 44 2860 -1.0667708333333334e+01 45 45 6.4041666666666671e+01 45 884 -5.3395833333333327e+00 45 885 2.1334374999999998e+01 45 937 -5.3312499999999998e+00 45 888 5.3312499999999998e+00 45 883 -5.3395833333333327e+00 45 49 -5.3333333333333330e+00 45 881 2.1334374999999998e+01 45 873 -5.3312499999999998e+00 45 47 -1.0661458333333334e+01 45 508 5.3312499999999998e+00 45 872 5.3395833333333327e+00 45 46 -5.3333333333333330e+00 45 511 -2.1334374999999998e+01 45 510 5.3312499999999998e+00 45 40 -1.0661458333333334e+01 45 865 -2.1334374999999998e+01 45 847 -5.3312499999999998e+00 45 848 5.3395833333333327e+00 45 44 -5.3333333333333330e+00 45 3410 -5.3312499999999998e+00 45 3409 -5.3312499999999998e+00 45 2858 -5.3333333333333330e+00 45 2861 -1.0661458333333334e+01 45 2860 -1.0661458333333334e+01 46 46 3.2012500000000003e+01 46 497 -1.3552527156068805e-19 46 501 1.3552527156068805e-19 46 39 -5.3333333333333330e+00 46 881 -1.3552527156068805e-19 46 873 1.0667708333333334e+01 46 47 -1.0667708333333334e+01 46 511 -1.3552527156068805e-19 46 40 -1.0667708333333334e+01 46 45 -5.3333333333333330e+00 46 508 -1.0667708333333334e+01 46 872 5.3333333333333330e+00 47 47 6.4049999999999997e+01 47 883 5.3312499999999998e+00 47 888 -1.0416666666666664e-02 47 887 2.1329166666666662e+01 47 50 -1.0661458333333334e+01 47 49 -1.0667708333333334e+01 47 886 -1.0416666666666664e-02 47 501 -2.1329166666666662e+01 47 39 -1.0661458333333334e+01 47 48 -1.0667708333333334e+01 47 873 1.0416666666666664e-02 47 881 -2.1329166666666662e+01 47 872 -5.3312499999999998e+00 47 45 -1.0661458333333334e+01 47 46 -1.0667708333333334e+01 48 48 3.2012500000000003e+01 48 520 1.3552527156068805e-19 48 887 -1.3552527156068805e-19 48 50 -5.3333333333333330e+00 48 501 -1.3552527156068805e-19 48 886 -1.0667708333333334e+01 48 47 -1.0667708333333334e+01 48 495 1.3552527156068805e-19 48 39 -5.3333333333333330e+00 48 521 -1.0667708333333334e+01 48 2868 -1.0667708333333334e+01 49 49 3.2012500000000003e+01 49 885 -1.3552527156068805e-19 49 881 1.0842021724855044e-19 49 45 -5.3333333333333330e+00 49 883 -5.3333333333333330e+00 49 887 1.0842021724855044e-19 49 888 -1.0667708333333334e+01 49 47 -1.0667708333333334e+01 49 933 1.3552527156068805e-19 49 50 -5.3333333333333330e+00 49 937 1.0667708333333334e+01 49 2861 -1.0667708333333334e+01 50 50 6.4041666666666671e+01 50 936 2.1334374999999998e+01 50 520 -2.1334374999999998e+01 50 521 5.3312499999999998e+00 50 886 5.3312499999999998e+00 50 48 -5.3333333333333330e+00 50 887 -2.1334374999999998e+01 50 888 5.3312499999999998e+00 50 47 -1.0661458333333334e+01 50 933 2.1334374999999998e+01 50 937 -5.3312499999999998e+00 50 49 -5.3333333333333330e+00 50 3039 -5.3312499999999998e+00 50 3036 -5.3312499999999998e+00 50 2862 -5.3333333333333330e+00 50 3416 -5.3312499999999998e+00 50 2863 -1.0661458333333334e+01 50 3469 -5.3312499999999998e+00 50 2867 -5.3333333333333330e+00 50 2868 -1.0661458333333334e+01 50 2861 -1.0661458333333334e+01 51 51 3.2012500000000003e+01 51 515 -1.0842021724855044e-19 51 562 5.3333333333333330e+00 51 512 1.0842021724855044e-19 51 513 -1.0667708333333334e+01 51 41 -1.0667708333333334e+01 51 864 1.3552527156068805e-19 51 43 -5.3333333333333330e+00 51 563 1.0667708333333334e+01 51 561 5.3333333333333330e+00 51 3465 -1.3552527156068805e-19 51 2865 -5.3333333333333330e+00 51 2866 -1.0667708333333334e+01 52 52 1.6006250000000001e+01 53 53 1.6010416666666668e+01 54 54 6.4049999999999997e+01 54 694 5.3312499999999998e+00 54 548 -1.0416666666666664e-02 54 549 2.1329166666666662e+01 54 811 5.3312499999999998e+00 54 62 -1.0667708333333334e+01 54 546 -1.0416666666666664e-02 54 547 2.1329166666666662e+01 54 523 1.0416666666666664e-02 54 544 -2.1329166666666662e+01 55 55 1.6006250000000001e+01 56 56 3.2010416666770837e+01 57 57 1.6000000000062499e+01 58 58 1.6000000000104166e+01 59 59 6.4000000000499995e+01 59 811 5.3333333333124999e+00 59 780 -1.0416666666666666e-10 59 695 -2.1333333333291666e+01 59 694 5.3333333333124999e+00 59 62 -1.0666666666677083e+01 59 778 -1.0416666666666666e-10 59 779 2.1333333333291666e+01 59 760 1.0416666666666666e-10 59 776 -2.1333333333291666e+01 60 60 1.6000000000062499e+01 61 61 3.2010416666770830e+01 62 62 3.2006250000062501e+01 62 779 -1.4136387421560532e-27 62 547 -1.3552527156068805e-19 62 695 -1.4136387421560532e-27 62 780 -1.0666666666677083e+01 62 694 -5.3333333333333330e+00 62 59 -1.0666666666677083e+01 62 549 1.3552527156068805e-19 62 548 -1.0667708333333334e+01 62 811 -5.3333333333333330e+00 62 54 -1.0667708333333334e+01 63 63 3.2012500000000003e+01 63 900 -1.3552527156068805e-19 63 534 1.3552527156068805e-19 63 541 1.3552527156068805e-19 63 540 -1.0667708333333334e+01 63 895 5.3333333333333330e+00 63 67 -1.0667708333333334e+01 63 531 -1.3552527156068805e-19 63 894 1.0667708333333334e+01 63 530 -5.3333333333333330e+00 63 65 -1.0667708333333334e+01 64 64 3.2020833333333336e+01 65 65 6.4049999999999997e+01 65 895 -5.3312499999999998e+00 65 899 -1.0416666666666664e-02 65 900 2.1329166666666662e+01 65 871 1.0416666666666664e-02 65 898 2.1329166666666662e+01 65 894 1.0416666666666664e-02 65 531 -2.1329166666666662e+01 65 530 5.3312499999999998e+00 65 63 -1.0667708333333334e+01 66 66 3.2020833333333336e+01 67 67 6.4049999999999997e+01 67 543 -1.0416666666666664e-02 67 530 5.3312499999999998e+00 67 542 2.1329166666666662e+01 67 527 1.0416666666666664e-02 67 534 -2.1329166666666662e+01 67 540 -1.0416666666666664e-02 67 541 2.1329166666666662e+01 67 895 -5.3312499999999998e+00 67 63 -1.0667708333333334e+01 68 68 1.6006250000000001e+01 69 69 1.6010416666666668e+01 70 70 1.6006250000000001e+01 71 71 1.6010416666666668e+01 72 72 1.6006250000000001e+01 73 73 1.6006250000000001e+01 74 74 3.2012500000000003e+01 74 539 1.3552527156068805e-19 74 540 -1.3552527156068805e-19 74 91 -5.3333333333333330e+00 74 530 5.3333333333333330e+00 74 527 -1.3552527156068805e-19 74 534 1.0667708333333334e+01 74 77 -1.0667708333333334e+01 74 525 1.3552527156068805e-19 74 76 -1.0667708333333334e+01 74 75 -5.3333333333333330e+00 74 535 1.0667708333333334e+01 75 75 6.4041666666666671e+01 75 536 5.3312499999999998e+00 75 832 -5.3312499999999998e+00 75 88 -5.3333333333333330e+00 75 529 2.1334374999999998e+01 75 812 -5.3312499999999998e+00 75 89 -1.0661458333333334e+01 75 549 5.3312499999999998e+00 75 90 -5.3333333333333330e+00 75 523 2.1334374999999998e+01 75 544 -5.3312499999999998e+00 75 79 -1.0661458333333334e+01 75 542 5.3312499999999998e+00 75 78 -5.3333333333333330e+00 75 527 2.1334374999999998e+01 75 534 -5.3312499999999998e+00 75 77 -1.0661458333333334e+01 75 525 2.1334374999999998e+01 75 76 -1.0661458333333334e+01 75 535 -5.3312499999999998e+00 75 74 -5.3333333333333330e+00 76 76 6.4049999999999997e+01 76 850 -5.3312499999999998e+00 76 539 2.1329166666666662e+01 76 530 -5.3312499999999998e+00 76 91 -1.0661458333333334e+01 76 536 -1.0416666666666664e-02 76 831 -5.3312499999999998e+00 76 88 -1.0667708333333334e+01 76 538 -1.0416666666666664e-02 76 537 2.1329166666666662e+01 76 840 5.3312499999999998e+00 76 86 -1.0661458333333334e+01 76 85 -1.0667708333333334e+01 76 535 1.0416666666666664e-02 76 525 -2.1329166666666662e+01 76 75 -1.0661458333333334e+01 76 74 -1.0667708333333334e+01 77 77 6.4049999999999997e+01 77 543 2.1329166666666662e+01 77 81 -1.0661458333333334e+01 77 541 -1.0416666666666664e-02 77 895 5.3312499999999998e+00 77 99 -1.0667708333333334e+01 77 540 2.1329166666666662e+01 77 91 -1.0661458333333334e+01 77 530 -5.3312499999999998e+00 77 542 -1.0416666666666664e-02 77 78 -1.0667708333333334e+01 77 534 1.0416666666666664e-02 77 527 -2.1329166666666662e+01 77 75 -1.0661458333333334e+01 77 74 -1.0667708333333334e+01 78 78 3.2012500000000003e+01 78 543 1.3552527156068805e-19 78 546 -1.3552527156068805e-19 78 81 -5.3333333333333330e+00 78 523 -1.3552527156068805e-19 78 544 1.0667708333333334e+01 78 79 -1.0667708333333334e+01 78 527 1.3552527156068805e-19 78 77 -1.0667708333333334e+01 78 75 -5.3333333333333330e+00 78 542 -1.0667708333333334e+01 79 79 6.4049999999999997e+01 79 694 -5.3312499999999998e+00 79 548 2.1329166666666662e+01 79 811 -5.3312499999999998e+00 79 93 -1.0661458333333334e+01 79 549 -1.0416666666666664e-02 79 90 -1.0667708333333334e+01 79 547 -1.0416666666666664e-02 79 546 2.1329166666666662e+01 79 81 -1.0661458333333334e+01 79 84 -1.0667708333333334e+01 79 544 1.0416666666666664e-02 79 523 -2.1329166666666662e+01 79 75 -1.0661458333333334e+01 79 78 -1.0667708333333334e+01 80 80 3.2012500000000003e+01 80 690 1.3552527156068805e-19 80 691 -1.3552527156068805e-19 80 96 -5.3333333333333330e+00 80 682 5.3333333333333330e+00 80 681 -1.3552527156068805e-19 80 685 1.0667708333333334e+01 80 83 -1.0667708333333334e+01 80 679 1.3552527156068805e-19 80 82 -1.0667708333333334e+01 80 81 -5.3333333333333330e+00 80 686 1.0667708333333334e+01 81 81 6.4041666666666671e+01 81 687 5.3312499999999998e+00 81 541 5.3312499999999998e+00 81 99 -5.3333333333333330e+00 81 543 -2.1334374999999998e+01 81 542 5.3312499999999998e+00 81 77 -1.0661458333333334e+01 81 544 -5.3312499999999998e+00 81 78 -5.3333333333333330e+00 81 546 -2.1334374999999998e+01 81 547 5.3312499999999998e+00 81 79 -1.0661458333333334e+01 81 692 5.3312499999999998e+00 81 84 -5.3333333333333330e+00 81 681 2.1334374999999998e+01 81 685 -5.3312499999999998e+00 81 83 -1.0661458333333334e+01 81 679 2.1334374999999998e+01 81 82 -1.0661458333333334e+01 81 686 -5.3312499999999998e+00 81 80 -5.3333333333333330e+00 82 82 6.4049999999999997e+01 82 964 5.3312499999999998e+00 82 690 2.1329166666666662e+01 82 682 -5.3312499999999998e+00 82 96 -1.0661458333333334e+01 82 687 -1.0416666666666664e-02 82 895 5.3312499999999998e+00 82 99 -1.0667708333333334e+01 82 689 -1.0416666666666664e-02 82 688 2.1329166666666662e+01 82 896 5.3312499999999998e+00 82 91 -1.0661458333333334e+01 82 98 -1.0667708333333334e+01 82 686 1.0416666666666664e-02 82 679 -2.1329166666666662e+01 82 81 -1.0661458333333334e+01 82 80 -1.0667708333333334e+01 83 83 6.4049999999999997e+01 83 682 -5.3312499999999998e+00 83 595 -5.3312499999999998e+00 83 693 2.1329166666666662e+01 83 694 -5.3312499999999998e+00 83 93 -1.0661458333333334e+01 83 594 1.0416666666666664e-02 83 691 2.1329166666666662e+01 83 593 -5.3312499999999998e+00 83 96 -1.0661458333333334e+01 83 97 -1.0667708333333334e+01 83 692 -1.0416666666666664e-02 83 84 -1.0667708333333334e+01 83 685 1.0416666666666664e-02 83 681 -2.1329166666666662e+01 83 81 -1.0661458333333334e+01 83 80 -1.0667708333333334e+01 84 84 3.2012500000000003e+01 84 693 1.0842021724855044e-19 84 548 -1.3552527156068805e-19 84 93 -5.3333333333333330e+00 84 694 5.3333333333333330e+00 84 546 1.3552527156068805e-19 84 547 -1.0667708333333334e+01 84 79 -1.0667708333333334e+01 84 681 1.0842021724855044e-19 84 83 -1.0667708333333334e+01 84 81 -5.3333333333333330e+00 84 692 -1.0667708333333334e+01 85 85 3.2012500000000003e+01 85 853 1.0842021724855044e-19 85 539 -1.3552527156068805e-19 85 91 -5.3333333333333330e+00 85 850 5.3333333333333330e+00 85 537 1.3552527156068805e-19 85 538 -1.0667708333333334e+01 85 76 -1.0667708333333334e+01 85 843 1.0842021724855044e-19 85 87 -1.0667708333333334e+01 85 86 -5.3333333333333330e+00 85 851 1.0667708333333334e+01 85 840 -5.3333333333333330e+00 86 86 6.4041666666666671e+01 86 854 5.3312499999999998e+00 86 957 5.3312499999999998e+00 86 842 -5.3395833333333327e+00 86 95 -5.3333333333333330e+00 86 844 2.1334374999999998e+01 86 744 -5.3312499999999998e+00 86 94 -1.0661458333333334e+01 86 743 -5.3312499999999998e+00 86 735 5.3395833333333327e+00 86 92 -5.3333333333333330e+00 86 839 2.1334374999999998e+01 86 832 -5.3312499999999998e+00 86 89 -1.0661458333333334e+01 86 536 5.3312499999999998e+00 86 831 5.3395833333333327e+00 86 88 -5.3333333333333330e+00 86 537 -2.1334374999999998e+01 86 538 5.3312499999999998e+00 86 76 -1.0661458333333334e+01 86 843 2.1334374999999998e+01 86 87 -1.0661458333333334e+01 86 851 -5.3312499999999998e+00 86 840 -5.3395833333333327e+00 86 85 -5.3333333333333330e+00 87 87 6.4049999999999997e+01 87 964 5.3312499999999998e+00 87 856 -1.0416666666666664e-02 87 896 5.3312499999999998e+00 87 98 -1.0667708333333334e+01 87 855 2.1329166666666662e+01 87 96 -1.0661458333333334e+01 87 959 -5.3312499999999998e+00 87 854 -1.0416666666666664e-02 87 842 5.3312499999999998e+00 87 95 -1.0667708333333334e+01 87 853 2.1329166666666662e+01 87 850 -5.3312499999999998e+00 87 91 -1.0661458333333334e+01 87 851 1.0416666666666664e-02 87 843 -2.1329166666666662e+01 87 86 -1.0661458333333334e+01 87 840 5.3312499999999998e+00 87 85 -1.0667708333333334e+01 88 88 3.2012500000000003e+01 88 525 -1.3552527156068805e-19 88 529 1.3552527156068805e-19 88 75 -5.3333333333333330e+00 88 839 -1.3552527156068805e-19 88 832 1.0667708333333334e+01 88 89 -1.0667708333333334e+01 88 537 -1.3552527156068805e-19 88 76 -1.0667708333333334e+01 88 86 -5.3333333333333330e+00 88 536 -1.0667708333333334e+01 88 831 5.3333333333333330e+00 89 89 6.4049999999999997e+01 89 735 -5.3312499999999998e+00 89 811 -5.3312499999999998e+00 89 743 1.0416666666666664e-02 89 857 2.1329166666666662e+01 89 739 -5.3312499999999998e+00 89 93 -1.0661458333333334e+01 89 92 -1.0667708333333334e+01 89 812 1.0416666666666664e-02 89 529 -2.1329166666666662e+01 89 75 -1.0661458333333334e+01 89 90 -1.0667708333333334e+01 89 832 1.0416666666666664e-02 89 839 -2.1329166666666662e+01 89 831 -5.3312499999999998e+00 89 86 -1.0661458333333334e+01 89 88 -1.0667708333333334e+01 90 90 3.2012500000000003e+01 90 548 1.3552527156068805e-19 90 857 -1.3552527156068805e-19 90 93 -5.3333333333333330e+00 90 811 5.3333333333333330e+00 90 529 -1.3552527156068805e-19 90 812 1.0667708333333334e+01 90 89 -1.0667708333333334e+01 90 523 1.3552527156068805e-19 90 79 -1.0667708333333334e+01 90 75 -5.3333333333333330e+00 90 549 -1.0667708333333334e+01 91 91 6.4041666666666671e+01 91 541 5.3312499999999998e+00 91 687 5.3312499999999998e+00 91 895 -5.3395833333333327e+00 91 99 -5.3333333333333330e+00 91 688 -2.1334374999999998e+01 91 689 5.3312499999999998e+00 91 82 -1.0661458333333334e+01 91 856 5.3312499999999998e+00 91 896 -5.3395833333333327e+00 91 98 -5.3333333333333330e+00 91 853 -2.1334374999999998e+01 91 851 -5.3312499999999998e+00 91 87 -1.0661458333333334e+01 91 538 5.3312499999999998e+00 91 850 5.3395833333333327e+00 91 85 -5.3333333333333330e+00 91 539 -2.1334374999999998e+01 91 535 -5.3312499999999998e+00 91 76 -1.0661458333333334e+01 91 540 -2.1334374999999998e+01 91 77 -1.0661458333333334e+01 91 534 -5.3312499999999998e+00 91 530 5.3395833333333327e+00 91 74 -5.3333333333333330e+00 92 92 3.2012500000000003e+01 92 844 -1.3552527156068805e-19 92 839 1.0842021724855044e-19 92 86 -5.3333333333333330e+00 92 735 5.3333333333333330e+00 92 857 1.0842021724855044e-19 92 743 1.0667708333333334e+01 92 89 -1.0667708333333334e+01 92 955 1.3552527156068805e-19 92 94 -1.0667708333333334e+01 92 93 -5.3333333333333330e+00 92 744 1.0667708333333334e+01 92 739 5.3333333333333330e+00 93 93 6.4041666666666671e+01 93 596 -5.3312499999999998e+00 93 594 -5.3312499999999998e+00 93 595 5.3395833333333327e+00 93 97 -5.3333333333333330e+00 93 693 -2.1334374999999998e+01 93 692 5.3312499999999998e+00 93 83 -1.0661458333333334e+01 93 547 5.3312499999999998e+00 93 694 5.3395833333333327e+00 93 84 -5.3333333333333330e+00 93 548 -2.1334374999999998e+01 93 549 5.3312499999999998e+00 93 79 -1.0661458333333334e+01 93 812 -5.3312499999999998e+00 93 811 5.3395833333333327e+00 93 90 -5.3333333333333330e+00 93 857 -2.1334374999999998e+01 93 743 -5.3312499999999998e+00 93 89 -1.0661458333333334e+01 93 955 2.1334374999999998e+01 93 94 -1.0661458333333334e+01 93 744 -5.3312499999999998e+00 93 739 5.3395833333333327e+00 93 92 -5.3333333333333330e+00 94 94 6.4049999999999997e+01 94 595 -5.3312499999999998e+00 94 596 1.0416666666666664e-02 94 593 -5.3312499999999998e+00 94 97 -1.0667708333333334e+01 94 958 2.1329166666666662e+01 94 959 -5.3312499999999998e+00 94 96 -1.0661458333333334e+01 94 957 -1.0416666666666664e-02 94 842 5.3312499999999998e+00 94 95 -1.0667708333333334e+01 94 844 -2.1329166666666662e+01 94 735 -5.3312499999999998e+00 94 86 -1.0661458333333334e+01 94 744 1.0416666666666664e-02 94 955 -2.1329166666666662e+01 94 93 -1.0661458333333334e+01 94 739 -5.3312499999999998e+00 94 92 -1.0667708333333334e+01 95 95 3.2012500000000003e+01 95 958 1.3552527156068805e-19 95 855 -1.3552527156068805e-19 95 96 -5.3333333333333330e+00 95 959 5.3333333333333330e+00 95 843 -1.3552527156068805e-19 95 854 -1.0667708333333334e+01 95 87 -1.0667708333333334e+01 95 844 1.3552527156068805e-19 95 94 -1.0667708333333334e+01 95 86 -5.3333333333333330e+00 95 957 -1.0667708333333334e+01 95 842 -5.3333333333333330e+00 96 96 6.4041666666666671e+01 96 856 5.3312499999999998e+00 96 689 5.3312499999999998e+00 96 964 -5.3395833333333327e+00 96 98 -5.3333333333333330e+00 96 690 -2.1334374999999998e+01 96 686 -5.3312499999999998e+00 96 82 -1.0661458333333334e+01 96 685 -5.3312499999999998e+00 96 682 5.3395833333333327e+00 96 80 -5.3333333333333330e+00 96 691 -2.1334374999999998e+01 96 594 -5.3312499999999998e+00 96 83 -1.0661458333333334e+01 96 596 -5.3312499999999998e+00 96 593 5.3395833333333327e+00 96 97 -5.3333333333333330e+00 96 958 -2.1334374999999998e+01 96 957 5.3312499999999998e+00 96 94 -1.0661458333333334e+01 96 855 -2.1334374999999998e+01 96 87 -1.0661458333333334e+01 96 854 5.3312499999999998e+00 96 959 5.3395833333333327e+00 96 95 -5.3333333333333330e+00 97 97 3.2012500000000003e+01 97 955 -1.3552527156068805e-19 97 693 -1.3552527156068805e-19 97 93 -5.3333333333333330e+00 97 595 5.3333333333333330e+00 97 691 1.3552527156068805e-19 97 594 1.0667708333333334e+01 97 83 -1.0667708333333334e+01 97 958 -1.3552527156068805e-19 97 94 -1.0667708333333334e+01 97 96 -5.3333333333333330e+00 97 596 1.0667708333333334e+01 97 593 5.3333333333333330e+00 98 98 3.2012500000000003e+01 98 855 1.3552527156068805e-19 98 690 -1.3552527156068805e-19 98 96 -5.3333333333333330e+00 98 964 -5.3333333333333330e+00 98 688 1.3552527156068805e-19 98 689 -1.0667708333333334e+01 98 82 -1.0667708333333334e+01 98 853 -1.3552527156068805e-19 98 87 -1.0667708333333334e+01 98 91 -5.3333333333333330e+00 98 856 -1.0667708333333334e+01 98 896 -5.3333333333333330e+00 99 99 3.2012500000000003e+01 99 679 -1.3552527156068805e-19 99 543 -1.0842021724855044e-19 99 81 -5.3333333333333330e+00 99 540 1.0842021724855044e-19 99 541 -1.0667708333333334e+01 99 77 -1.0667708333333334e+01 99 688 -1.3552527156068805e-19 99 82 -1.0667708333333334e+01 99 91 -5.3333333333333330e+00 99 687 -1.0667708333333334e+01 99 895 -5.3333333333333330e+00 100 100 4.8006250000249999e+01 100 813 5.3333333333020834e+00 100 578 -1.3552527156068805e-19 100 574 1.0666666666625000e+01 100 554 -1.0666666666791667e+01 100 108 -5.3333333333437496e+00 100 552 1.0666666666625000e+01 100 553 1.3333333333322916e+01 100 573 -1.3552527156068805e-19 100 551 1.0667708333333334e+01 100 550 2.4000000000010417e+01 100 102 -1.0667708333333334e+01 100 2100 -5.3333333333229165e+00 100 1143 -8.0000000000000000e+00 100 1146 -1.0666666666645833e+01 101 101 3.7343750000291664e+01 102 102 6.4049999999999997e+01 102 622 -5.3312499999999998e+00 102 553 -5.3312499999999998e+00 102 579 -1.0416666666666664e-02 102 580 2.1329166666666662e+01 102 577 -1.0416666666666664e-02 102 578 2.1329166666666662e+01 102 621 -5.3312499999999998e+00 102 103 -1.0667708333333334e+01 102 551 1.0416666666666664e-02 102 573 -2.1329166666666662e+01 102 550 -5.3312499999999998e+00 102 100 -1.0667708333333334e+01 102 1143 -1.0661458333333334e+01 103 103 3.2006250000062501e+01 103 651 1.0097419586828951e-27 103 580 -1.3552527156068805e-19 103 752 -1.0097419586828951e-27 103 623 1.0666666666677083e+01 103 622 5.3333333333333330e+00 103 105 -1.0666666666677083e+01 103 578 1.3552527156068805e-19 103 577 -1.0667708333333334e+01 103 621 5.3333333333333330e+00 103 102 -1.0667708333333334e+01 103 1143 -5.3333333333333330e+00 104 104 3.2010416666770830e+01 105 105 6.4000000000499995e+01 105 621 -5.3333333333124999e+00 105 757 -1.0416666666666666e-10 105 758 2.1333333333291666e+01 105 756 -1.0416666666666666e-10 105 651 -2.1333333333291666e+01 105 650 5.3333333333124999e+00 105 623 1.0416666666666666e-10 105 752 -2.1333333333291666e+01 105 622 -5.3333333333124999e+00 105 103 -1.0666666666677083e+01 105 2196 -5.3333333333124999e+00 105 1143 -1.0666666666614583e+01 105 1144 -1.0666666666677083e+01 106 106 1.6006250000000001e+01 107 107 1.6000000000062499e+01 108 108 2.1333333333499997e+01 108 813 2.0833333333333345e-11 108 552 5.3333333333229165e+00 108 554 -5.3333333333437496e+00 108 550 -5.3333333333229165e+00 108 100 -5.3333333333437496e+00 108 825 5.3333333333437496e+00 108 574 -1.0666666666729165e+01 108 2318 -5.3333333333229165e+00 108 1146 -1.0666666666729165e+01 109 109 3.7339583333520835e+01 109 813 -5.3333333332812494e+00 109 552 -1.0416666666666666e-10 109 815 -5.3333333333229165e+00 109 114 -1.0666666666708332e+01 109 565 1.3552527156068805e-19 109 566 1.3552527156068805e-19 109 557 1.0667708333333334e+01 109 556 1.3333333333322916e+01 109 113 -1.0667708333333334e+01 109 112 -8.0000000000000000e+00 109 560 2.0194839173657902e-27 109 554 5.3333333333229165e+00 109 555 8.0000000000000000e+00 109 110 -8.0000000000000000e+00 109 4154 6.2499999999999991e-11 110 110 5.3354166666874995e+01 110 567 5.3312499999999998e+00 110 864 -5.3312499999999998e+00 110 561 -5.3395833333333327e+00 110 117 -5.3333333333333330e+00 110 565 2.1334374999999998e+01 110 113 -1.0661458333333334e+01 110 557 -5.3312499999999998e+00 110 563 2.1334374999999998e+01 110 562 2.6635416666145835e+00 110 111 -8.0000000000000000e+00 110 554 -3.6295685768920020e-28 110 555 -2.6635416666145830e+00 110 560 1.0666666666562499e+01 110 109 -8.0000000000000000e+00 110 5053 -1.8812360437258079e-27 110 3465 -5.3312499999999998e+00 110 2488 -1.0661458333333334e+01 110 4154 -1.0666666666666666e+01 111 111 3.7339583333583334e+01 111 560 2.2470898404921788e-28 111 563 -1.3552527156068805e-19 111 562 -8.0000000000000000e+00 111 110 -8.0000000000000000e+00 111 3467 1.3552527156068805e-19 111 2488 -1.0667708333333334e+01 111 3465 1.0667708333333334e+01 111 3466 2.0194839173657902e-27 111 3463 -5.3333333333229165e+00 111 2487 6.2499999999999991e-11 111 3464 8.0000000000000000e+00 111 2482 -8.0000000000000000e+00 111 4773 5.3333333332812494e+00 111 5047 1.4583333333333335e-10 111 4154 6.2499999999999991e-11 111 5053 -5.3333333333229165e+00 111 5046 -5.3333333332812494e+00 111 4153 -1.0666666666729165e+01 112 112 5.3354166667000001e+01 112 816 1.0416666666666666e-11 112 820 -6.2499999999999991e-11 112 941 5.3312499999999998e+00 112 569 5.3312499999999998e+00 112 819 -5.3395833333333327e+00 112 118 -5.3333333333333330e+00 112 823 2.1334374999999998e+01 112 821 2.6635416666250000e+00 112 552 1.0416666666666666e-11 112 815 6.2499999999999991e-11 112 114 4.1666666666666665e-11 112 817 -1.0666666666583334e+01 112 116 -1.0666666666666666e+01 112 566 -2.1334374999999998e+01 112 557 -5.3312499999999998e+00 112 556 -2.6635416666250000e+00 112 113 -1.0661458333333334e+01 112 109 -8.0000000000000000e+00 112 3474 -1.0416666666666666e-11 112 2492 4.1666666666666665e-11 112 2486 -1.0661458333333334e+01 112 3473 -5.3312499999999998e+00 112 2484 -8.0000000000000000e+00 112 2315 -1.0416666666666666e-11 113 113 6.4049999999999997e+01 113 819 5.3312499999999998e+00 113 569 -1.0416666666666664e-02 113 938 5.3312499999999998e+00 113 118 -1.0667708333333334e+01 113 568 2.1329166666666662e+01 113 863 -5.3312499999999998e+00 113 567 -1.0416666666666664e-02 113 561 5.3312499999999998e+00 113 117 -1.0667708333333334e+01 113 565 -2.1329166666666662e+01 113 110 -1.0661458333333334e+01 113 555 -5.3312499999999998e+00 113 557 1.0416666666666664e-02 113 566 2.1329166666666662e+01 113 556 -5.3312499999999998e+00 113 112 -1.0661458333333334e+01 113 109 -1.0667708333333334e+01 113 2490 -1.0661458333333334e+01 114 114 3.2000000000229164e+01 114 554 3.1495832401145651e-28 114 552 -5.3333333332916668e+00 114 556 -5.3333333333124999e+00 114 109 -1.0666666666708332e+01 114 818 -5.3333333333124999e+00 114 112 4.1666666666666665e-11 114 817 -5.3333333333124999e+00 114 815 1.0666666666687499e+01 114 116 -1.0666666666687499e+01 114 813 5.3333333332916668e+00 114 115 4.1666666666666665e-11 114 814 1.0666666666687499e+01 114 2315 -4.1666666666666665e-11 114 4775 -5.3333333333124999e+00 114 4154 -1.0666666666708332e+01 115 115 5.3333333334124987e+01 115 816 1.0416666666666666e-11 115 818 -1.0666666666583334e+01 115 116 -1.0666666666666666e+01 115 814 6.2499999999999991e-11 115 813 -1.0416666666666666e-11 115 114 4.1666666666666665e-11 115 3704 6.2499999999999991e-11 115 3701 -1.0416666666666666e-11 115 2494 4.1666666666666665e-11 115 3699 6.2499999999999991e-11 115 3698 -1.0416666666666666e-11 115 2492 4.1666666666666665e-11 115 3702 -1.0666666666583334e+01 115 2493 -1.0666666666666666e+01 115 4772 5.3333333333020834e+00 115 4155 2.0833333333333336e-11 115 4775 -2.1333333333260416e+01 115 4154 -1.5999999999947917e+01 115 4774 -1.0666666666833333e+01 115 5040 -5.3333333333020834e+00 115 4760 -1.0416666666666666e-11 115 4771 -2.1333333333260416e+01 115 2487 -1.5999999999947917e+01 115 2315 -1.0416666666666666e-11 116 116 4.2666666666916662e+01 116 820 5.3333333333229165e+00 116 816 -6.2500000000000004e-11 116 818 2.1333333333312499e+01 116 115 -1.0666666666666666e+01 116 814 -5.3333333333229165e+00 116 817 2.1333333333312499e+01 116 815 -5.3333333333229165e+00 116 112 -1.0666666666666666e+01 116 114 -1.0666666666687499e+01 116 3699 -5.3333333333229165e+00 116 2492 -1.0666666666687499e+01 116 2315 6.2500000000000004e-11 117 117 3.2012500000000003e+01 117 568 -1.3552527156068805e-19 117 565 -1.3552527156068805e-19 117 567 -1.0667708333333334e+01 117 113 -1.0667708333333334e+01 117 563 1.3552527156068805e-19 117 110 -5.3333333333333330e+00 117 561 -5.3333333333333330e+00 117 864 1.0667708333333334e+01 117 863 5.3333333333333330e+00 117 3468 -1.3552527156068805e-19 117 2488 -1.0667708333333334e+01 117 2490 -5.3333333333333330e+00 118 118 3.2012500000000003e+01 118 823 -1.0842021724855044e-19 118 941 -1.0667708333333334e+01 118 566 -1.3552527156068805e-19 118 112 -5.3333333333333330e+00 118 819 -5.3333333333333330e+00 118 568 1.3552527156068805e-19 118 569 -1.0667708333333334e+01 118 938 -5.3333333333333330e+00 118 113 -1.0667708333333334e+01 118 3472 1.0842021724855044e-19 118 2486 -1.0667708333333334e+01 118 2490 -5.3333333333333330e+00 119 119 3.2012500000000003e+01 119 567 1.0842021724855044e-19 119 570 -1.3552527156068805e-19 119 138 -5.3333333333333330e+00 119 561 5.3333333333333330e+00 119 558 -1.3552527156068805e-19 119 564 1.0667708333333334e+01 119 122 -1.0667708333333334e+01 119 557 1.0842021724855044e-19 119 121 -1.0667708333333334e+01 119 120 -5.3333333333333330e+00 119 565 1.0667708333333334e+01 119 555 -5.3333333333333330e+00 120 120 6.4041666666666671e+01 120 566 5.3312499999999998e+00 120 648 5.3312499999999998e+00 120 556 -5.3395833333333327e+00 120 142 -5.3333333333333330e+00 120 559 2.1334374999999998e+01 120 649 5.3312499999999998e+00 120 128 -1.0661458333333334e+01 120 578 5.3312499999999998e+00 120 553 -5.3395833333333327e+00 120 129 -5.3333333333333330e+00 120 551 2.1334374999999998e+01 120 573 -5.3312499999999998e+00 120 124 -1.0661458333333334e+01 120 571 5.3312499999999998e+00 120 550 -5.3395833333333327e+00 120 123 -5.3333333333333330e+00 120 558 2.1334374999999998e+01 120 564 -5.3312499999999998e+00 120 122 -1.0661458333333334e+01 120 557 2.1334374999999998e+01 120 121 -1.0661458333333334e+01 120 565 -5.3312499999999998e+00 120 555 -5.3395833333333327e+00 120 119 -5.3333333333333330e+00 121 121 6.4049999999999997e+01 121 556 5.3312499999999998e+00 121 566 -1.0416666666666664e-02 121 819 -5.3312499999999998e+00 121 142 -1.0667708333333334e+01 121 569 2.1329166666666662e+01 121 938 -5.3312499999999998e+00 121 141 -1.0661458333333334e+01 121 568 -1.0416666666666664e-02 121 863 5.3312499999999998e+00 121 140 -1.0667708333333334e+01 121 567 2.1329166666666662e+01 121 561 -5.3312499999999998e+00 121 138 -1.0661458333333334e+01 121 565 1.0416666666666664e-02 121 557 -2.1329166666666662e+01 121 120 -1.0661458333333334e+01 121 555 5.3312499999999998e+00 121 119 -1.0667708333333334e+01 122 122 6.4049999999999997e+01 122 561 -5.3312499999999998e+00 122 572 2.1329166666666662e+01 122 131 -1.0661458333333334e+01 122 503 1.0416666666666664e-02 122 570 2.1329166666666662e+01 122 502 -5.3312499999999998e+00 122 138 -1.0661458333333334e+01 122 139 -1.0667708333333334e+01 122 571 -1.0416666666666664e-02 122 550 5.3312499999999998e+00 122 123 -1.0667708333333334e+01 122 564 1.0416666666666664e-02 122 558 -2.1329166666666662e+01 122 555 5.3312499999999998e+00 122 120 -1.0661458333333334e+01 122 119 -1.0667708333333334e+01 123 123 3.2012500000000003e+01 123 572 1.3552527156068805e-19 123 579 -1.3552527156068805e-19 123 131 -5.3333333333333330e+00 123 551 -1.3552527156068805e-19 123 573 1.0667708333333334e+01 123 124 -1.0667708333333334e+01 123 558 1.3552527156068805e-19 123 122 -1.0667708333333334e+01 123 120 -5.3333333333333330e+00 123 571 -1.0667708333333334e+01 123 550 -5.3333333333333330e+00 124 124 6.4049999999999997e+01 124 622 5.3312499999999998e+00 124 553 5.3312499999999998e+00 124 580 -1.0416666666666664e-02 124 579 2.1329166666666662e+01 124 131 -1.0661458333333334e+01 124 134 -1.0667708333333334e+01 124 578 -1.0416666666666664e-02 124 577 2.1329166666666662e+01 124 621 5.3312499999999998e+00 124 126 -1.0661458333333334e+01 124 129 -1.0667708333333334e+01 124 573 1.0416666666666664e-02 124 551 -2.1329166666666662e+01 124 550 5.3312499999999998e+00 124 120 -1.0661458333333334e+01 124 123 -1.0667708333333334e+01 125 125 3.2012500000000003e+01 125 646 1.3552527156068805e-19 125 647 -1.3552527156068805e-19 125 141 -5.3333333333333330e+00 125 632 5.3333333333333330e+00 125 628 -1.3552527156068805e-19 125 639 1.0667708333333334e+01 125 128 -1.0667708333333334e+01 125 625 1.3552527156068805e-19 125 127 -1.0667708333333334e+01 125 126 -5.3333333333333330e+00 125 640 1.0667708333333334e+01 125 626 -5.3333333333333330e+00 126 126 6.4041666666666671e+01 126 643 5.3312499999999998e+00 126 736 -5.3312499999999998e+00 126 624 -5.3395833333333327e+00 126 144 -5.3333333333333330e+00 126 630 2.1334374999999998e+01 126 754 -5.3312499999999998e+00 126 133 -1.0661458333333334e+01 126 580 5.3312499999999998e+00 126 622 -5.3395833333333327e+00 126 134 -5.3333333333333330e+00 126 577 -2.1334374999999998e+01 126 578 5.3312499999999998e+00 126 124 -1.0661458333333334e+01 126 649 5.3312499999999998e+00 126 621 -5.3395833333333327e+00 126 129 -5.3333333333333330e+00 126 628 2.1334374999999998e+01 126 639 -5.3312499999999998e+00 126 128 -1.0661458333333334e+01 126 625 2.1334374999999998e+01 126 127 -1.0661458333333334e+01 126 640 -5.3312499999999998e+00 126 626 -5.3395833333333327e+00 126 125 -5.3333333333333330e+00 127 127 6.4049999999999997e+01 127 951 5.3312499999999998e+00 127 646 2.1329166666666662e+01 127 632 -5.3312499999999998e+00 127 141 -1.0661458333333334e+01 127 624 5.3312499999999998e+00 127 643 -1.0416666666666664e-02 127 735 -5.3312499999999998e+00 127 144 -1.0667708333333334e+01 127 645 -1.0416666666666664e-02 127 644 2.1329166666666662e+01 127 842 5.3312499999999998e+00 127 135 -1.0661458333333334e+01 127 143 -1.0667708333333334e+01 127 640 1.0416666666666664e-02 127 625 -2.1329166666666662e+01 127 126 -1.0661458333333334e+01 127 626 5.3312499999999998e+00 127 125 -1.0667708333333334e+01 128 128 6.4049999999999997e+01 128 632 -5.3312499999999998e+00 128 556 5.3312499999999998e+00 128 559 -2.1329166666666662e+01 128 553 5.3312499999999998e+00 128 120 -1.0661458333333334e+01 128 648 -1.0416666666666664e-02 128 647 2.1329166666666662e+01 128 819 -5.3312499999999998e+00 128 141 -1.0661458333333334e+01 128 142 -1.0667708333333334e+01 128 649 -1.0416666666666664e-02 128 621 5.3312499999999998e+00 128 129 -1.0667708333333334e+01 128 639 1.0416666666666664e-02 128 628 -2.1329166666666662e+01 128 626 5.3312499999999998e+00 128 126 -1.0661458333333334e+01 128 125 -1.0667708333333334e+01 129 129 3.2012500000000003e+01 129 559 -1.3552527156068805e-19 129 551 1.0842021724855044e-19 129 120 -5.3333333333333330e+00 129 553 -5.3333333333333330e+00 129 577 1.0842021724855044e-19 129 578 -1.0667708333333334e+01 129 124 -1.0667708333333334e+01 129 628 1.3552527156068805e-19 129 128 -1.0667708333333334e+01 129 126 -5.3333333333333330e+00 129 649 -1.0667708333333334e+01 129 621 -5.3333333333333330e+00 130 130 3.2012500000000003e+01 130 835 1.3552527156068805e-19 130 838 -1.3552527156068805e-19 130 135 -5.3333333333333330e+00 130 831 5.3333333333333330e+00 130 830 -1.3552527156068805e-19 130 833 1.0667708333333334e+01 130 133 -1.0667708333333334e+01 130 828 1.3552527156068805e-19 130 132 -1.0667708333333334e+01 130 131 -5.3333333333333330e+00 130 834 1.0667708333333334e+01 131 131 6.4041666666666671e+01 131 505 -5.3312499999999998e+00 131 503 -5.3312499999999998e+00 131 139 -5.3333333333333330e+00 131 572 -2.1334374999999998e+01 131 571 5.3312499999999998e+00 131 122 -1.0661458333333334e+01 131 573 -5.3312499999999998e+00 131 123 -5.3333333333333330e+00 131 579 -2.1334374999999998e+01 131 580 5.3312499999999998e+00 131 124 -1.0661458333333334e+01 131 754 -5.3312499999999998e+00 131 134 -5.3333333333333330e+00 131 830 2.1334374999999998e+01 131 833 -5.3312499999999998e+00 131 133 -1.0661458333333334e+01 131 828 2.1334374999999998e+01 131 132 -1.0661458333333334e+01 131 834 -5.3312499999999998e+00 131 130 -5.3333333333333330e+00 132 132 6.4049999999999997e+01 132 505 1.0416666666666664e-02 132 502 -5.3312499999999998e+00 132 139 -1.0667708333333334e+01 132 837 2.1329166666666662e+01 132 846 -5.3312499999999998e+00 132 138 -1.0661458333333334e+01 132 836 -1.0416666666666664e-02 132 840 5.3312499999999998e+00 132 136 -1.0667708333333334e+01 132 835 2.1329166666666662e+01 132 831 -5.3312499999999998e+00 132 135 -1.0661458333333334e+01 132 834 1.0416666666666664e-02 132 828 -2.1329166666666662e+01 132 131 -1.0661458333333334e+01 132 130 -1.0667708333333334e+01 133 133 6.4049999999999997e+01 133 624 5.3312499999999998e+00 133 630 -2.1329166666666662e+01 133 622 5.3312499999999998e+00 133 126 -1.0661458333333334e+01 133 736 1.0416666666666664e-02 133 735 -5.3312499999999998e+00 133 144 -1.0667708333333334e+01 133 838 2.1329166666666662e+01 133 135 -1.0661458333333334e+01 133 831 -5.3312499999999998e+00 133 754 1.0416666666666664e-02 133 134 -1.0667708333333334e+01 133 833 1.0416666666666664e-02 133 830 -2.1329166666666662e+01 133 131 -1.0661458333333334e+01 133 130 -1.0667708333333334e+01 134 134 3.2012500000000003e+01 134 630 -1.3552527156068805e-19 134 577 -1.3552527156068805e-19 134 126 -5.3333333333333330e+00 134 622 -5.3333333333333330e+00 134 579 1.3552527156068805e-19 134 580 -1.0667708333333334e+01 134 124 -1.0667708333333334e+01 134 830 1.3552527156068805e-19 134 133 -1.0667708333333334e+01 134 131 -5.3333333333333330e+00 134 754 1.0667708333333334e+01 135 135 6.4041666666666671e+01 135 736 -5.3312499999999998e+00 135 643 5.3312499999999998e+00 135 735 5.3395833333333327e+00 135 144 -5.3333333333333330e+00 135 644 -2.1334374999999998e+01 135 645 5.3312499999999998e+00 135 127 -1.0661458333333334e+01 135 861 5.3312499999999998e+00 135 842 -5.3395833333333327e+00 135 143 -5.3333333333333330e+00 135 841 2.1334374999999998e+01 135 845 -5.3312499999999998e+00 135 137 -1.0661458333333334e+01 135 836 5.3312499999999998e+00 135 840 -5.3395833333333327e+00 135 136 -5.3333333333333330e+00 135 835 -2.1334374999999998e+01 135 834 -5.3312499999999998e+00 135 132 -1.0661458333333334e+01 135 838 -2.1334374999999998e+01 135 133 -1.0661458333333334e+01 135 833 -5.3312499999999998e+00 135 831 5.3395833333333327e+00 135 130 -5.3333333333333330e+00 136 136 3.2012500000000003e+01 136 837 1.0842021724855044e-19 136 858 -1.3552527156068805e-19 136 138 -5.3333333333333330e+00 136 846 5.3333333333333330e+00 136 841 -1.3552527156068805e-19 136 845 1.0667708333333334e+01 136 137 -1.0667708333333334e+01 136 835 -1.0842021724855044e-19 136 132 -1.0667708333333334e+01 136 135 -5.3333333333333330e+00 136 836 -1.0667708333333334e+01 136 840 -5.3333333333333330e+00 137 137 6.4049999999999997e+01 137 951 5.3312499999999998e+00 137 861 -1.0416666666666664e-02 137 842 5.3312499999999998e+00 137 143 -1.0667708333333334e+01 137 860 2.1329166666666662e+01 137 141 -1.0661458333333334e+01 137 938 -5.3312499999999998e+00 137 859 -1.0416666666666664e-02 137 863 5.3312499999999998e+00 137 140 -1.0667708333333334e+01 137 858 2.1329166666666662e+01 137 138 -1.0661458333333334e+01 137 846 -5.3312499999999998e+00 137 845 1.0416666666666664e-02 137 841 -2.1329166666666662e+01 137 840 5.3312499999999998e+00 137 135 -1.0661458333333334e+01 137 136 -1.0667708333333334e+01 138 138 6.4041666666666671e+01 138 859 5.3312499999999998e+00 138 568 5.3312499999999998e+00 138 863 -5.3395833333333327e+00 138 140 -5.3333333333333330e+00 138 567 -2.1334374999999998e+01 138 565 -5.3312499999999998e+00 138 121 -1.0661458333333334e+01 138 564 -5.3312499999999998e+00 138 561 5.3395833333333327e+00 138 119 -5.3333333333333330e+00 138 570 -2.1334374999999998e+01 138 503 -5.3312499999999998e+00 138 122 -1.0661458333333334e+01 138 505 -5.3312499999999998e+00 138 502 5.3395833333333327e+00 138 139 -5.3333333333333330e+00 138 837 -2.1334374999999998e+01 138 836 5.3312499999999998e+00 138 132 -1.0661458333333334e+01 138 858 -2.1334374999999998e+01 138 137 -1.0661458333333334e+01 138 845 -5.3312499999999998e+00 138 846 5.3395833333333327e+00 138 136 -5.3333333333333330e+00 139 139 3.2012500000000003e+01 139 828 -1.3552527156068805e-19 139 572 -1.3552527156068805e-19 139 131 -5.3333333333333330e+00 139 570 1.3552527156068805e-19 139 503 1.0667708333333334e+01 139 122 -1.0667708333333334e+01 139 837 -1.3552527156068805e-19 139 132 -1.0667708333333334e+01 139 138 -5.3333333333333330e+00 139 505 1.0667708333333334e+01 139 502 5.3333333333333330e+00 140 140 3.2012500000000003e+01 140 569 1.3552527156068805e-19 140 860 -1.3552527156068805e-19 140 141 -5.3333333333333330e+00 140 938 5.3333333333333330e+00 140 858 1.3552527156068805e-19 140 859 -1.0667708333333334e+01 140 137 -1.0667708333333334e+01 140 567 -1.3552527156068805e-19 140 121 -1.0667708333333334e+01 140 138 -5.3333333333333330e+00 140 568 -1.0667708333333334e+01 140 863 -5.3333333333333330e+00 141 141 6.4041666666666671e+01 141 861 5.3312499999999998e+00 141 645 5.3312499999999998e+00 141 951 -5.3395833333333327e+00 141 143 -5.3333333333333330e+00 141 646 -2.1334374999999998e+01 141 640 -5.3312499999999998e+00 141 127 -1.0661458333333334e+01 141 639 -5.3312499999999998e+00 141 632 5.3395833333333327e+00 141 125 -5.3333333333333330e+00 141 647 -2.1334374999999998e+01 141 648 5.3312499999999998e+00 141 128 -1.0661458333333334e+01 141 566 5.3312499999999998e+00 141 819 5.3395833333333327e+00 141 142 -5.3333333333333330e+00 141 569 -2.1334374999999998e+01 141 568 5.3312499999999998e+00 141 121 -1.0661458333333334e+01 141 860 -2.1334374999999998e+01 141 137 -1.0661458333333334e+01 141 859 5.3312499999999998e+00 141 938 5.3395833333333327e+00 141 140 -5.3333333333333330e+00 142 142 3.2012500000000003e+01 142 557 -1.3552527156068805e-19 142 559 1.3552527156068805e-19 142 120 -5.3333333333333330e+00 142 556 -5.3333333333333330e+00 142 647 1.3552527156068805e-19 142 648 -1.0667708333333334e+01 142 128 -1.0667708333333334e+01 142 569 -1.3552527156068805e-19 142 121 -1.0667708333333334e+01 142 141 -5.3333333333333330e+00 142 566 -1.0667708333333334e+01 142 819 5.3333333333333330e+00 143 143 3.2012500000000003e+01 143 860 1.3552527156068805e-19 143 646 -1.3552527156068805e-19 143 141 -5.3333333333333330e+00 143 951 -5.3333333333333330e+00 143 644 1.3552527156068805e-19 143 645 -1.0667708333333334e+01 143 127 -1.0667708333333334e+01 143 841 1.3552527156068805e-19 143 137 -1.0667708333333334e+01 143 135 -5.3333333333333330e+00 143 861 -1.0667708333333334e+01 143 842 -5.3333333333333330e+00 144 144 3.2012500000000003e+01 144 625 -1.0842021724855044e-19 144 630 1.3552527156068805e-19 144 126 -5.3333333333333330e+00 144 624 -5.3333333333333330e+00 144 838 1.3552527156068805e-19 144 736 1.0667708333333334e+01 144 133 -1.0667708333333334e+01 144 644 -1.0842021724855044e-19 144 127 -1.0667708333333334e+01 144 135 -5.3333333333333330e+00 144 643 -1.0667708333333334e+01 144 735 5.3333333333333330e+00 145 145 3.2006250000062501e+01 145 614 1.0097419586828951e-27 145 620 -1.3552527156068805e-19 145 730 -1.0097419586828951e-27 145 584 1.0666666666677083e+01 145 583 5.3333333333333330e+00 145 148 -1.0666666666677083e+01 145 612 -1.3552527156068805e-19 145 582 1.0667708333333334e+01 145 581 5.3333333333333330e+00 145 147 -1.0667708333333334e+01 145 2810 -5.3333333333333330e+00 146 146 3.2010416666770837e+01 147 147 6.4049999999999997e+01 147 583 -5.3312499999999998e+00 147 619 -1.0416666666666664e-02 147 620 2.1329166666666662e+01 147 617 -1.0416666666666664e-02 147 618 2.1329166666666662e+01 147 582 1.0416666666666664e-02 147 612 -2.1329166666666662e+01 147 581 -5.3312499999999998e+00 147 145 -1.0667708333333334e+01 147 3534 -5.3312499999999998e+00 147 3390 -5.3312499999999998e+00 147 2810 -1.0661458333333334e+01 147 2819 -1.0667708333333334e+01 148 148 6.4000000000499995e+01 148 581 -5.3333333333124999e+00 148 734 -1.0416666666666666e-10 148 614 -2.1333333333291666e+01 148 732 -1.0416666666666666e-10 148 733 2.1333333333291666e+01 148 584 1.0416666666666666e-10 148 730 -2.1333333333291666e+01 148 583 -5.3333333333124999e+00 148 145 -1.0666666666677083e+01 148 3387 -5.3333333333124999e+00 148 2165 -5.3333333333124999e+00 148 1645 -1.0666666666677083e+01 148 2810 -1.0666666666614583e+01 149 149 1.6000000000062499e+01 150 150 1.6006250000000001e+01 151 151 3.2006250000062501e+01 151 742 1.0097419586828951e-27 151 640 1.3552527156068805e-19 151 638 -1.0097419586828951e-27 151 627 1.0666666666677083e+01 151 626 5.3333333333333330e+00 151 163 -1.0666666666677083e+01 151 161 -5.3333333333333330e+00 151 643 1.3552527156068805e-19 151 625 1.0667708333333334e+01 151 624 5.3333333333333330e+00 151 153 -1.0667708333333334e+01 151 152 -5.3333333333333330e+00 152 152 6.4020833333541674e+01 152 747 5.3333333333124999e+00 152 1070 5.3333333333124999e+00 152 737 -5.3333333333958333e+00 152 176 -5.3333333333333330e+00 152 844 -5.3312499999999998e+00 152 644 5.3312499999999998e+00 152 735 -5.3395833333333327e+00 152 167 -5.3333333333333330e+00 152 744 2.1334374999999998e+01 152 156 -1.0661458333333334e+01 152 955 -5.3312499999999998e+00 152 742 2.1333333333343749e+01 152 163 -1.0666666666614583e+01 152 627 -5.3333333333124999e+00 152 740 2.1333333333343749e+01 152 956 -5.3333333333124999e+00 152 739 -5.3364583333645834e+00 152 166 -1.0666666666614583e+01 152 154 -5.3333333333333330e+00 152 643 -2.1334374999999998e+01 152 625 -5.3312499999999998e+00 152 624 5.3364583333645825e+00 152 153 -1.0661458333333334e+01 152 151 -5.3333333333333330e+00 153 153 6.4049999999999997e+01 153 951 -5.3312499999999998e+00 153 646 -1.0416666666666664e-02 153 632 5.3312499999999998e+00 153 171 -1.0667708333333334e+01 153 735 5.3312499999999998e+00 153 644 -1.0416666666666664e-02 153 645 2.1329166666666662e+01 153 842 -5.3312499999999998e+00 153 168 -1.0661458333333334e+01 153 167 -1.0667708333333334e+01 153 640 -2.1329166666666662e+01 153 161 -1.0661458333333334e+01 153 626 -5.3312499999999998e+00 153 625 1.0416666666666664e-02 153 643 2.1329166666666662e+01 153 624 -5.3312499999999998e+00 153 152 -1.0661458333333334e+01 153 151 -1.0667708333333334e+01 154 154 3.2006250000062501e+01 154 603 1.4136387421560532e-27 154 744 1.3552527156068805e-19 154 740 -1.4136387421560532e-27 154 956 1.0666666666677083e+01 154 739 -5.3333333333333330e+00 154 166 -1.0666666666677083e+01 154 152 -5.3333333333333330e+00 154 596 -1.3552527156068805e-19 154 955 1.0667708333333334e+01 154 595 -5.3333333333333330e+00 154 156 -1.0667708333333334e+01 154 155 -5.3333333333333330e+00 155 155 6.4020833333541674e+01 155 920 -5.3333333333124999e+00 155 725 5.3333333333124999e+00 155 597 -5.3333333333958333e+00 155 175 -5.3333333333333330e+00 155 603 2.1333333333343749e+01 155 166 -1.0666666666614583e+01 155 956 -5.3333333333124999e+00 155 605 5.3312499999999998e+00 155 958 5.3312499999999998e+00 155 593 -5.3395833333333327e+00 155 169 -5.3333333333333330e+00 155 601 2.1334374999999998e+01 155 159 -1.0661458333333334e+01 155 586 -5.3312499999999998e+00 155 599 2.1333333333343749e+01 155 588 -5.3333333333124999e+00 155 587 5.3364583333645834e+00 155 165 -1.0666666666614583e+01 155 157 -5.3333333333333330e+00 155 596 2.1334374999999998e+01 155 955 -5.3312499999999998e+00 155 595 -5.3364583333645825e+00 155 156 -1.0661458333333334e+01 155 154 -5.3333333333333330e+00 156 156 6.4049999999999997e+01 156 593 5.3312499999999998e+00 156 958 -1.0416666666666664e-02 156 959 5.3312499999999998e+00 156 169 -1.0667708333333334e+01 156 957 2.1329166666666662e+01 156 168 -1.0661458333333334e+01 156 842 -5.3312499999999998e+00 156 844 1.0416666666666664e-02 156 735 5.3312499999999998e+00 156 167 -1.0667708333333334e+01 156 744 -2.1329166666666662e+01 156 152 -1.0661458333333334e+01 156 739 5.3312499999999998e+00 156 955 1.0416666666666664e-02 156 596 -2.1329166666666662e+01 156 595 5.3312499999999998e+00 156 155 -1.0661458333333334e+01 156 154 -1.0667708333333334e+01 157 157 3.2006250000062501e+01 157 720 1.0097419586828951e-27 157 601 1.3552527156068805e-19 157 599 -1.0097419586828951e-27 157 588 1.0666666666677083e+01 157 587 5.3333333333333330e+00 157 165 -1.0666666666677083e+01 157 155 -5.3333333333333330e+00 157 604 1.3552527156068805e-19 157 586 1.0667708333333334e+01 157 585 5.3333333333333330e+00 157 159 -1.0667708333333334e+01 157 158 -5.3333333333333330e+00 158 158 6.4020833333541674e+01 158 723 5.3333333333124999e+00 158 1066 -5.3333333333124999e+00 158 715 -5.3333333333958333e+00 158 174 -5.3333333333333330e+00 158 976 5.3312499999999998e+00 158 607 5.3312499999999998e+00 158 713 -5.3395833333333327e+00 158 170 -5.3333333333333330e+00 158 722 2.1334374999999998e+01 158 162 -1.0661458333333334e+01 158 971 -5.3312499999999998e+00 158 720 2.1333333333343749e+01 158 165 -1.0666666666614583e+01 158 588 -5.3333333333124999e+00 158 718 2.1333333333343749e+01 158 972 -5.3333333333124999e+00 158 717 -5.3364583333645834e+00 158 164 -1.0666666666614583e+01 158 160 -5.3333333333333330e+00 158 604 -2.1334374999999998e+01 158 586 -5.3312499999999998e+00 158 585 5.3364583333645825e+00 158 159 -1.0661458333333334e+01 158 157 -5.3333333333333330e+00 159 159 6.4049999999999997e+01 159 713 5.3312499999999998e+00 159 607 -1.0416666666666664e-02 159 961 5.3312499999999998e+00 159 170 -1.0667708333333334e+01 159 606 2.1329166666666662e+01 159 168 -1.0661458333333334e+01 159 959 5.3312499999999998e+00 159 605 -1.0416666666666664e-02 159 593 5.3312499999999998e+00 159 169 -1.0667708333333334e+01 159 601 -2.1329166666666662e+01 159 155 -1.0661458333333334e+01 159 587 -5.3312499999999998e+00 159 586 1.0416666666666664e-02 159 604 2.1329166666666662e+01 159 585 -5.3312499999999998e+00 159 158 -1.0661458333333334e+01 159 157 -1.0667708333333334e+01 160 160 3.2006250000062501e+01 160 642 1.4136387421560532e-27 160 722 1.3552527156068805e-19 160 718 -1.4136387421560532e-27 160 972 1.0666666666677083e+01 160 717 -5.3333333333333330e+00 160 164 -1.0666666666677083e+01 160 158 -5.3333333333333330e+00 160 635 -1.3552527156068805e-19 160 971 1.0667708333333334e+01 160 634 -5.3333333333333330e+00 160 162 -1.0667708333333334e+01 160 161 -5.3333333333333330e+00 161 161 6.4020833333541674e+01 161 1045 -5.3333333333124999e+00 161 745 5.3333333333124999e+00 161 636 -5.3333333333958333e+00 161 172 -5.3333333333333330e+00 161 642 2.1333333333343749e+01 161 164 -1.0666666666614583e+01 161 972 -5.3333333333124999e+00 161 646 5.3312499999999998e+00 161 952 -5.3312499999999998e+00 161 632 -5.3395833333333327e+00 161 171 -5.3333333333333330e+00 161 640 2.1334374999999998e+01 161 153 -1.0661458333333334e+01 161 625 -5.3312499999999998e+00 161 638 2.1333333333343749e+01 161 627 -5.3333333333124999e+00 161 626 5.3364583333645834e+00 161 163 -1.0666666666614583e+01 161 151 -5.3333333333333330e+00 161 635 2.1334374999999998e+01 161 971 -5.3312499999999998e+00 161 634 -5.3364583333645825e+00 161 162 -1.0661458333333334e+01 161 160 -5.3333333333333330e+00 162 162 6.4049999999999997e+01 162 632 5.3312499999999998e+00 162 952 1.0416666666666664e-02 162 951 -5.3312499999999998e+00 162 171 -1.0667708333333334e+01 162 962 -2.1329166666666662e+01 162 168 -1.0661458333333334e+01 162 961 5.3312499999999998e+00 162 976 -1.0416666666666664e-02 162 713 5.3312499999999998e+00 162 170 -1.0667708333333334e+01 162 722 -2.1329166666666662e+01 162 158 -1.0661458333333334e+01 162 717 5.3312499999999998e+00 162 971 1.0416666666666664e-02 162 635 -2.1329166666666662e+01 162 634 5.3312499999999998e+00 162 161 -1.0661458333333334e+01 162 160 -1.0667708333333334e+01 163 163 6.4000000000499995e+01 163 1068 5.3333333333124999e+00 163 747 -1.0416666666666666e-10 163 737 5.3333333333124999e+00 163 176 -1.0666666666677083e+01 163 636 5.3333333333124999e+00 163 745 -1.0416666666666666e-10 163 746 2.1333333333291666e+01 163 1043 -5.3333333333124999e+00 163 173 -1.0666666666614583e+01 163 172 -1.0666666666677083e+01 163 742 -2.1333333333291666e+01 163 152 -1.0666666666614583e+01 163 624 -5.3333333333124999e+00 163 627 1.0416666666666666e-10 163 638 -2.1333333333291666e+01 163 626 -5.3333333333124999e+00 163 161 -1.0666666666614583e+01 163 151 -1.0666666666677083e+01 164 164 6.4000000000499995e+01 164 715 5.3333333333124999e+00 164 1066 1.0416666666666666e-10 164 1065 -5.3333333333124999e+00 164 174 -1.0666666666677083e+01 164 1067 2.1333333333291666e+01 164 173 -1.0666666666614583e+01 164 1043 -5.3333333333124999e+00 164 1045 1.0416666666666666e-10 164 636 5.3333333333124999e+00 164 172 -1.0666666666677083e+01 164 642 -2.1333333333291666e+01 164 161 -1.0666666666614583e+01 164 634 5.3333333333124999e+00 164 972 1.0416666666666666e-10 164 718 -2.1333333333291666e+01 164 717 5.3333333333124999e+00 164 158 -1.0666666666614583e+01 164 160 -1.0666666666677083e+01 165 165 6.4000000000499995e+01 165 597 5.3333333333124999e+00 165 725 -1.0416666666666666e-10 165 918 -5.3333333333124999e+00 165 175 -1.0666666666677083e+01 165 724 2.1333333333291666e+01 165 173 -1.0666666666614583e+01 165 1065 -5.3333333333124999e+00 165 723 -1.0416666666666666e-10 165 715 5.3333333333124999e+00 165 174 -1.0666666666677083e+01 165 720 -2.1333333333291666e+01 165 158 -1.0666666666614583e+01 165 585 -5.3333333333124999e+00 165 588 1.0416666666666666e-10 165 599 -2.1333333333291666e+01 165 587 -5.3333333333124999e+00 165 155 -1.0666666666614583e+01 165 157 -1.0666666666677083e+01 166 166 6.4000000000499995e+01 166 737 5.3333333333124999e+00 166 1070 -1.0416666666666666e-10 166 1068 5.3333333333124999e+00 166 176 -1.0666666666677083e+01 166 1069 -2.1333333333291666e+01 166 173 -1.0666666666614583e+01 166 918 -5.3333333333124999e+00 166 920 1.0416666666666666e-10 166 597 5.3333333333124999e+00 166 175 -1.0666666666677083e+01 166 603 -2.1333333333291666e+01 166 155 -1.0666666666614583e+01 166 595 5.3333333333124999e+00 166 956 1.0416666666666666e-10 166 740 -2.1333333333291666e+01 166 739 5.3333333333124999e+00 166 152 -1.0666666666614583e+01 166 154 -1.0666666666677083e+01 167 167 3.2012500000000003e+01 167 957 -1.3552527156068805e-19 167 744 -1.3552527156068805e-19 167 844 1.0667708333333334e+01 167 156 -1.0667708333333334e+01 167 643 -1.3552527156068805e-19 167 152 -5.3333333333333330e+00 167 735 -5.3333333333333330e+00 167 645 1.3552527156068805e-19 167 644 -1.0667708333333334e+01 167 842 5.3333333333333330e+00 167 153 -1.0667708333333334e+01 167 168 -5.3333333333333330e+00 168 168 6.4041666666666671e+01 168 646 5.3312499999999998e+00 168 952 -5.3312499999999998e+00 168 951 5.3395833333333327e+00 168 171 -5.3333333333333330e+00 168 962 2.1334374999999998e+01 168 162 -1.0661458333333334e+01 168 976 5.3312499999999998e+00 168 607 5.3312499999999998e+00 168 961 -5.3395833333333327e+00 168 170 -5.3333333333333330e+00 168 606 -2.1334374999999998e+01 168 159 -1.0661458333333334e+01 168 605 5.3312499999999998e+00 168 958 5.3312499999999998e+00 168 959 -5.3395833333333327e+00 168 169 -5.3333333333333330e+00 168 957 -2.1334374999999998e+01 168 156 -1.0661458333333334e+01 168 844 -5.3312499999999998e+00 168 645 -2.1334374999999998e+01 168 644 5.3312499999999998e+00 168 842 5.3395833333333327e+00 168 153 -1.0661458333333334e+01 168 167 -5.3333333333333330e+00 169 169 3.2012500000000003e+01 169 606 -1.3552527156068805e-19 169 601 -1.3552527156068805e-19 169 605 -1.0667708333333334e+01 169 159 -1.0667708333333334e+01 169 596 1.0842021724855044e-19 169 155 -5.3333333333333330e+00 169 593 -5.3333333333333330e+00 169 957 1.0842021724855044e-19 169 958 -1.0667708333333334e+01 169 959 -5.3333333333333330e+00 169 156 -1.0667708333333334e+01 169 168 -5.3333333333333330e+00 170 170 3.2012500000000003e+01 170 962 1.3552527156068805e-19 170 722 -1.3552527156068805e-19 170 976 -1.0667708333333334e+01 170 162 -1.0667708333333334e+01 170 604 -1.3552527156068805e-19 170 158 -5.3333333333333330e+00 170 713 -5.3333333333333330e+00 170 606 1.3552527156068805e-19 170 607 -1.0667708333333334e+01 170 961 -5.3333333333333330e+00 170 159 -1.0667708333333334e+01 170 168 -5.3333333333333330e+00 171 171 3.2012500000000003e+01 171 645 -1.3552527156068805e-19 171 640 -1.3552527156068805e-19 171 646 -1.0667708333333334e+01 171 153 -1.0667708333333334e+01 171 635 1.0842021724855044e-19 171 161 -5.3333333333333330e+00 171 632 -5.3333333333333330e+00 171 962 -1.0842021724855044e-19 171 952 1.0667708333333334e+01 171 951 5.3333333333333330e+00 171 162 -1.0667708333333334e+01 171 168 -5.3333333333333330e+00 172 172 3.2000000000124999e+01 172 1067 -1.0097419586828951e-27 172 642 -1.0097419586828951e-27 172 1045 1.0666666666677083e+01 172 164 -1.0666666666677083e+01 172 638 1.2116903504194741e-27 172 161 -5.3333333333333330e+00 172 636 -5.3333333333333330e+00 172 746 1.2116903504194741e-27 172 745 -1.0666666666677083e+01 172 1043 5.3333333333333330e+00 172 163 -1.0666666666677083e+01 172 173 -5.3333333333333330e+00 173 173 6.4000000000416662e+01 173 747 5.3333333333124999e+00 173 1070 5.3333333333124999e+00 173 1068 -5.3333333333958333e+00 173 176 -5.3333333333333330e+00 173 1069 2.1333333333343749e+01 173 166 -1.0666666666614583e+01 173 920 -5.3333333333124999e+00 173 725 5.3333333333124999e+00 173 918 5.3333333333958333e+00 173 175 -5.3333333333333330e+00 173 724 -2.1333333333343749e+01 173 165 -1.0666666666614583e+01 173 723 5.3333333333124999e+00 173 1066 -5.3333333333124999e+00 173 1065 5.3333333333958333e+00 173 174 -5.3333333333333330e+00 173 1067 -2.1333333333343749e+01 173 164 -1.0666666666614583e+01 173 1045 -5.3333333333124999e+00 173 746 -2.1333333333343749e+01 173 745 5.3333333333124999e+00 173 1043 5.3333333333958333e+00 173 163 -1.0666666666614583e+01 173 172 -5.3333333333333330e+00 174 174 3.2000000000124999e+01 174 724 -1.4136387421560532e-27 174 720 -1.4136387421560532e-27 174 723 -1.0666666666677083e+01 174 165 -1.0666666666677083e+01 174 718 1.2116903504194741e-27 174 158 -5.3333333333333330e+00 174 715 -5.3333333333333330e+00 174 1067 1.2116903504194741e-27 174 1066 1.0666666666677083e+01 174 1065 5.3333333333333330e+00 174 164 -1.0666666666677083e+01 174 173 -5.3333333333333330e+00 175 175 3.2000000000124999e+01 175 1069 1.0097419586828951e-27 175 603 -1.0097419586828951e-27 175 920 1.0666666666677083e+01 175 166 -1.0666666666677083e+01 175 599 1.2116903504194741e-27 175 155 -5.3333333333333330e+00 175 597 -5.3333333333333330e+00 175 724 1.2116903504194741e-27 175 725 -1.0666666666677083e+01 175 918 5.3333333333333330e+00 175 165 -1.0666666666677083e+01 175 173 -5.3333333333333330e+00 176 176 3.2000000000124999e+01 176 746 -1.4136387421560532e-27 176 742 -1.4136387421560532e-27 176 747 -1.0666666666677083e+01 176 163 -1.0666666666677083e+01 176 740 1.2116903504194741e-27 176 152 -5.3333333333333330e+00 176 737 -5.3333333333333330e+00 176 1069 -1.2116903504194741e-27 176 1070 -1.0666666666677083e+01 176 1068 -5.3333333333333330e+00 176 166 -1.0666666666677083e+01 176 173 -5.3333333333333330e+00 177 177 3.2000000000124999e+01 177 602 1.2116903504194741e-27 177 908 1.0097419586828951e-27 177 598 -1.0097419586828951e-27 177 914 -1.0666666666677083e+01 177 597 -5.3333333333333330e+00 177 185 -1.0666666666677083e+01 177 181 -5.3333333333333330e+00 177 907 -1.2116903504194741e-27 177 915 1.0666666666677083e+01 177 906 -5.3333333333333330e+00 177 179 -1.0666666666677083e+01 178 178 3.2000000000208331e+01 179 179 6.4000000000499995e+01 179 597 5.3333333333124999e+00 179 694 5.3333333333124999e+00 179 927 -1.0416666666666666e-10 179 602 -2.1333333333291666e+01 179 595 5.3333333333124999e+00 179 181 -1.0666666666614583e+01 179 192 -1.0666666666677083e+01 179 765 1.0416666666666666e-10 179 697 -2.1333333333291666e+01 179 915 1.0416666666666666e-10 179 907 -2.1333333333291666e+01 179 906 5.3333333333124999e+00 179 177 -1.0666666666677083e+01 180 180 3.2012500000000003e+01 180 685 1.3552527156068805e-19 180 600 1.0842021724855044e-19 180 609 1.0842021724855044e-19 180 608 -1.0667708333333334e+01 180 682 -5.3333333333333330e+00 180 184 -1.0667708333333334e+01 180 594 -1.3552527156068805e-19 180 691 -1.0667708333333334e+01 180 593 -5.3333333333333330e+00 180 182 -1.0667708333333334e+01 180 181 -5.3333333333333330e+00 181 181 6.4020833333541674e+01 181 915 -5.3333333333124999e+00 181 592 -5.3333333333124999e+00 181 602 2.1333333333343749e+01 181 927 5.3333333333124999e+00 181 179 -1.0666666666614583e+01 181 608 5.3312499999999998e+00 181 693 5.3312499999999998e+00 181 595 -5.3364583333645825e+00 181 192 -5.3333333333333330e+00 181 600 2.1334374999999998e+01 181 589 -5.3312499999999998e+00 181 587 5.3364583333645825e+00 181 184 -1.0661458333333334e+01 181 186 -5.3333333333333330e+00 181 598 2.1333333333343749e+01 181 914 5.3333333333124999e+00 181 597 -5.3333333333958333e+00 181 185 -1.0666666666614583e+01 181 177 -5.3333333333333330e+00 181 594 2.1334374999999998e+01 181 691 5.3312499999999998e+00 181 593 -5.3395833333333327e+00 181 182 -1.0661458333333334e+01 181 180 -5.3333333333333330e+00 182 182 6.4049999999999997e+01 182 682 5.3312499999999998e+00 182 595 5.3312499999999998e+00 182 693 -1.0416666666666664e-02 182 694 5.3312499999999998e+00 182 192 -1.0667708333333334e+01 182 692 2.1329166666666662e+01 182 681 1.0416666666666664e-02 182 685 -2.1329166666666662e+01 182 691 -1.0416666666666664e-02 182 594 -2.1329166666666662e+01 182 593 5.3312499999999998e+00 182 181 -1.0661458333333334e+01 182 180 -1.0667708333333334e+01 183 183 3.2020833333333336e+01 184 184 6.4049999999999997e+01 184 611 -1.0416666666666664e-02 184 593 5.3312499999999998e+00 184 610 2.1329166666666662e+01 184 581 -5.3312499999999998e+00 184 589 1.0416666666666664e-02 184 600 -2.1329166666666662e+01 184 587 -5.3312499999999998e+00 184 181 -1.0661458333333334e+01 184 186 -1.0667708333333334e+01 184 608 -1.0416666666666664e-02 184 609 2.1329166666666662e+01 184 682 5.3312499999999998e+00 184 180 -1.0667708333333334e+01 185 185 6.4000000000499995e+01 185 587 -5.3333333333124999e+00 185 592 1.0416666666666666e-10 185 581 -5.3333333333124999e+00 185 186 -1.0666666666677083e+01 185 906 5.3333333333124999e+00 185 615 -2.1333333333291666e+01 185 905 1.0416666666666666e-10 185 908 -2.1333333333291666e+01 185 914 -1.0416666666666666e-10 185 598 -2.1333333333291666e+01 185 597 5.3333333333124999e+00 185 181 -1.0666666666614583e+01 185 177 -1.0666666666677083e+01 186 186 3.2006250000062501e+01 186 598 1.4136387421560532e-27 186 615 -1.4136387421560532e-27 186 592 1.0666666666677083e+01 186 185 -1.0666666666677083e+01 186 610 -1.3552527156068805e-19 186 581 5.3333333333333330e+00 186 600 -1.3552527156068805e-19 186 589 1.0667708333333334e+01 186 587 5.3333333333333330e+00 186 184 -1.0667708333333334e+01 186 181 -5.3333333333333330e+00 187 187 3.2010416666770837e+01 188 188 1.6006250000000001e+01 189 189 3.2010416666770837e+01 190 190 1.6000000000062499e+01 191 191 1.6000000000062499e+01 192 192 3.2006250000062501e+01 192 697 1.0097419586828951e-27 192 602 -1.0097419586828951e-27 192 927 -1.0666666666677083e+01 192 179 -1.0666666666677083e+01 192 594 1.3552527156068805e-19 192 181 -5.3333333333333330e+00 192 595 -5.3333333333333330e+00 192 692 1.3552527156068805e-19 192 693 -1.0667708333333334e+01 192 694 -5.3333333333333330e+00 192 182 -1.0667708333333334e+01 193 193 1.6006250000000001e+01 194 194 3.2012500000000003e+01 194 605 1.3552527156068805e-19 194 608 -1.3552527156068805e-19 194 200 -5.3333333333333330e+00 194 593 5.3333333333333330e+00 194 589 -1.3552527156068805e-19 194 600 1.0667708333333334e+01 194 197 -1.0667708333333334e+01 194 586 1.3552527156068805e-19 194 196 -1.0667708333333334e+01 194 195 -5.3333333333333330e+00 194 601 1.0667708333333334e+01 194 587 -5.3333333333333330e+00 195 195 6.4041666666666671e+01 195 604 5.3312499999999998e+00 195 714 -5.3312499999999998e+00 195 585 -5.3395833333333327e+00 195 204 -5.3333333333333330e+00 195 591 2.1334374999999998e+01 195 731 -5.3312499999999998e+00 195 205 -1.0661458333333334e+01 195 620 5.3312499999999998e+00 195 583 -5.3395833333333327e+00 195 206 -5.3333333333333330e+00 195 582 2.1334374999999998e+01 195 612 -5.3312499999999998e+00 195 199 -1.0661458333333334e+01 195 610 5.3312499999999998e+00 195 581 -5.3395833333333327e+00 195 198 -5.3333333333333330e+00 195 589 2.1334374999999998e+01 195 600 -5.3312499999999998e+00 195 197 -1.0661458333333334e+01 195 586 2.1334374999999998e+01 195 196 -1.0661458333333334e+01 195 601 -5.3312499999999998e+00 195 587 -5.3395833333333327e+00 195 194 -5.3333333333333330e+00 196 196 6.4049999999999997e+01 196 585 5.3312499999999998e+00 196 604 -1.0416666666666664e-02 196 713 -5.3312499999999998e+00 196 204 -1.0667708333333334e+01 196 607 2.1329166666666662e+01 196 961 -5.3312499999999998e+00 196 203 -1.0661458333333334e+01 196 606 -1.0416666666666664e-02 196 959 -5.3312499999999998e+00 196 201 -1.0667708333333334e+01 196 605 2.1329166666666662e+01 196 593 -5.3312499999999998e+00 196 200 -1.0661458333333334e+01 196 601 1.0416666666666664e-02 196 586 -2.1329166666666662e+01 196 195 -1.0661458333333334e+01 196 587 5.3312499999999998e+00 196 194 -1.0667708333333334e+01 197 197 6.4049999999999997e+01 197 611 2.1329166666666662e+01 197 208 -1.0661458333333334e+01 197 609 -1.0416666666666664e-02 197 682 -5.3312499999999998e+00 197 214 -1.0667708333333334e+01 197 608 2.1329166666666662e+01 197 200 -1.0661458333333334e+01 197 593 -5.3312499999999998e+00 197 610 -1.0416666666666664e-02 197 581 5.3312499999999998e+00 197 198 -1.0667708333333334e+01 197 600 1.0416666666666664e-02 197 589 -2.1329166666666662e+01 197 587 5.3312499999999998e+00 197 195 -1.0661458333333334e+01 197 194 -1.0667708333333334e+01 198 198 3.2012500000000003e+01 198 611 1.3552527156068805e-19 198 617 -1.0842021724855044e-19 198 208 -5.3333333333333330e+00 198 582 -1.0842021724855044e-19 198 612 1.0667708333333334e+01 198 199 -1.0667708333333334e+01 198 589 1.3552527156068805e-19 198 197 -1.0667708333333334e+01 198 195 -5.3333333333333330e+00 198 610 -1.0667708333333334e+01 198 581 -5.3333333333333330e+00 199 199 6.4049999999999997e+01 199 619 2.1329166666666662e+01 199 216 -1.0661458333333334e+01 199 618 -1.0416666666666664e-02 199 617 2.1329166666666662e+01 199 208 -1.0661458333333334e+01 199 211 -1.0667708333333334e+01 199 620 -1.0416666666666664e-02 199 583 5.3312499999999998e+00 199 206 -1.0667708333333334e+01 199 612 1.0416666666666664e-02 199 582 -2.1329166666666662e+01 199 581 5.3312499999999998e+00 199 195 -1.0661458333333334e+01 199 198 -1.0667708333333334e+01 199 3534 5.3312499999999998e+00 199 3390 5.3312499999999998e+00 200 200 6.4041666666666671e+01 200 609 5.3312499999999998e+00 200 684 -5.3312499999999998e+00 200 682 5.3395833333333327e+00 200 214 -5.3333333333333330e+00 200 965 2.1334374999999998e+01 200 994 -5.3312499999999998e+00 200 209 -1.0661458333333334e+01 200 967 5.3312499999999998e+00 200 964 -5.3395833333333327e+00 200 213 -5.3333333333333330e+00 200 963 2.1334374999999998e+01 200 960 -5.3312499999999998e+00 200 202 -1.0661458333333334e+01 200 606 5.3312499999999998e+00 200 959 5.3395833333333327e+00 200 201 -5.3333333333333330e+00 200 605 -2.1334374999999998e+01 200 601 -5.3312499999999998e+00 200 196 -1.0661458333333334e+01 200 608 -2.1334374999999998e+01 200 197 -1.0661458333333334e+01 200 600 -5.3312499999999998e+00 200 593 5.3395833333333327e+00 200 194 -5.3333333333333330e+00 201 201 3.2012500000000003e+01 201 607 1.3552527156068805e-19 201 968 -1.3552527156068805e-19 201 203 -5.3333333333333330e+00 201 961 5.3333333333333330e+00 201 963 -1.3552527156068805e-19 201 960 1.0667708333333334e+01 201 202 -1.0667708333333334e+01 201 605 -1.3552527156068805e-19 201 196 -1.0667708333333334e+01 201 200 -5.3333333333333330e+00 201 606 -1.0667708333333334e+01 201 959 5.3333333333333330e+00 202 202 6.4049999999999997e+01 202 969 -1.0416666666666664e-02 202 982 5.3312499999999998e+00 202 218 -1.0667708333333334e+01 202 964 5.3312499999999998e+00 202 967 -1.0416666666666664e-02 202 966 2.1329166666666662e+01 202 212 -1.0661458333333334e+01 202 213 -1.0667708333333334e+01 202 968 2.1329166666666662e+01 202 203 -1.0661458333333334e+01 202 961 -5.3312499999999998e+00 202 960 1.0416666666666664e-02 202 963 -2.1329166666666662e+01 202 959 -5.3312499999999998e+00 202 200 -1.0661458333333334e+01 202 201 -1.0667708333333334e+01 202 3447 5.3312499999999998e+00 202 3483 5.3312499999999998e+00 203 203 6.4041666666666671e+01 203 969 5.3312499999999998e+00 203 1010 5.3312499999999998e+00 203 982 -5.3395833333333327e+00 203 218 -5.3333333333333330e+00 203 984 2.1334374999999998e+01 203 1008 -5.3312499999999998e+00 203 217 -1.0661458333333334e+01 203 986 5.3312499999999998e+00 203 981 -5.3395833333333327e+00 203 215 -5.3333333333333330e+00 203 980 2.1334374999999998e+01 203 714 -5.3312499999999998e+00 203 205 -1.0661458333333334e+01 203 604 5.3312499999999998e+00 203 713 5.3395833333333327e+00 203 204 -5.3333333333333330e+00 203 607 -2.1334374999999998e+01 203 606 5.3312499999999998e+00 203 196 -1.0661458333333334e+01 203 968 -2.1334374999999998e+01 203 202 -1.0661458333333334e+01 203 960 -5.3312499999999998e+00 203 961 5.3395833333333327e+00 203 201 -5.3333333333333330e+00 204 204 3.2012500000000003e+01 204 586 -1.0842021724855044e-19 204 591 1.3552527156068805e-19 204 195 -5.3333333333333330e+00 204 585 -5.3333333333333330e+00 204 980 -1.3552527156068805e-19 204 714 1.0667708333333334e+01 204 205 -1.0667708333333334e+01 204 607 -1.0842021724855044e-19 204 196 -1.0667708333333334e+01 204 203 -5.3333333333333330e+00 204 604 -1.0667708333333334e+01 204 713 5.3333333333333330e+00 205 205 6.4049999999999997e+01 205 981 5.3312499999999998e+00 205 986 -1.0416666666666664e-02 205 985 2.1329166666666662e+01 205 216 -1.0661458333333334e+01 205 215 -1.0667708333333334e+01 205 585 5.3312499999999998e+00 205 731 1.0416666666666664e-02 205 591 -2.1329166666666662e+01 205 583 5.3312499999999998e+00 205 195 -1.0661458333333334e+01 205 206 -1.0667708333333334e+01 205 714 1.0416666666666664e-02 205 980 -2.1329166666666662e+01 205 713 -5.3312499999999998e+00 205 203 -1.0661458333333334e+01 205 204 -1.0667708333333334e+01 205 3390 5.3312499999999998e+00 205 3211 5.3312499999999998e+00 206 206 3.2012500000000003e+01 206 619 1.3552527156068805e-19 206 985 -1.3552527156068805e-19 206 216 -5.3333333333333330e+00 206 591 -1.3552527156068805e-19 206 731 1.0667708333333334e+01 206 205 -1.0667708333333334e+01 206 582 1.3552527156068805e-19 206 199 -1.0667708333333334e+01 206 195 -5.3333333333333330e+00 206 620 -1.0667708333333334e+01 206 583 -5.3333333333333330e+00 206 3390 -5.3333333333333330e+00 207 207 3.2012500000000003e+01 207 1001 1.0842021724855044e-19 207 1002 -1.3552527156068805e-19 207 212 -5.3333333333333330e+00 207 998 -1.3552527156068805e-19 207 999 1.0667708333333334e+01 207 210 -1.0667708333333334e+01 207 996 1.0842021724855044e-19 207 209 -1.0667708333333334e+01 207 208 -5.3333333333333330e+00 207 1000 1.0667708333333334e+01 207 3484 -5.3333333333333330e+00 208 208 6.4041666666666671e+01 208 684 -5.3312499999999998e+00 208 609 5.3312499999999998e+00 208 214 -5.3333333333333330e+00 208 611 -2.1334374999999998e+01 208 610 5.3312499999999998e+00 208 197 -1.0661458333333334e+01 208 612 -5.3312499999999998e+00 208 198 -5.3333333333333330e+00 208 617 -2.1334374999999998e+01 208 618 5.3312499999999998e+00 208 199 -1.0661458333333334e+01 208 1004 5.3312499999999998e+00 208 211 -5.3333333333333330e+00 208 998 2.1334374999999998e+01 208 999 -5.3312499999999998e+00 208 210 -1.0661458333333334e+01 208 996 2.1334374999999998e+01 208 209 -1.0661458333333334e+01 208 1000 -5.3312499999999998e+00 208 207 -5.3333333333333330e+00 209 209 6.4049999999999997e+01 209 684 1.0416666666666664e-02 209 682 -5.3312499999999998e+00 209 214 -1.0667708333333334e+01 209 965 -2.1329166666666662e+01 209 964 5.3312499999999998e+00 209 200 -1.0661458333333334e+01 209 994 1.0416666666666664e-02 209 213 -1.0667708333333334e+01 209 1001 2.1329166666666662e+01 209 212 -1.0661458333333334e+01 209 1000 1.0416666666666664e-02 209 996 -2.1329166666666662e+01 209 208 -1.0661458333333334e+01 209 207 -1.0667708333333334e+01 209 3483 5.3312499999999998e+00 209 3484 5.3312499999999998e+00 210 210 6.4049999999999997e+01 210 1005 2.1329166666666662e+01 210 216 -1.0661458333333334e+01 210 1003 -1.0416666666666664e-02 210 219 -1.0667708333333334e+01 210 1002 2.1329166666666662e+01 210 212 -1.0661458333333334e+01 210 1004 -1.0416666666666664e-02 210 211 -1.0667708333333334e+01 210 999 1.0416666666666664e-02 210 998 -2.1329166666666662e+01 210 208 -1.0661458333333334e+01 210 207 -1.0667708333333334e+01 210 3158 5.3312499999999998e+00 210 3534 5.3312499999999998e+00 210 3157 5.3312499999999998e+00 210 3484 5.3312499999999998e+00 211 211 3.2012500000000003e+01 211 1005 1.3552527156068805e-19 211 619 -1.3552527156068805e-19 211 216 -5.3333333333333330e+00 211 617 1.3552527156068805e-19 211 618 -1.0667708333333334e+01 211 199 -1.0667708333333334e+01 211 998 1.3552527156068805e-19 211 210 -1.0667708333333334e+01 211 208 -5.3333333333333330e+00 211 1004 -1.0667708333333334e+01 211 3534 -5.3333333333333330e+00 212 212 6.4041666666666671e+01 212 1003 5.3312499999999998e+00 212 1009 5.3312499999999998e+00 212 219 -5.3333333333333330e+00 212 1006 2.1334374999999998e+01 212 1010 5.3312499999999998e+00 212 217 -1.0661458333333334e+01 212 969 5.3312499999999998e+00 212 218 -5.3333333333333330e+00 212 966 -2.1334374999999998e+01 212 967 5.3312499999999998e+00 212 202 -1.0661458333333334e+01 212 994 -5.3312499999999998e+00 212 213 -5.3333333333333330e+00 212 1001 -2.1334374999999998e+01 212 1000 -5.3312499999999998e+00 212 209 -1.0661458333333334e+01 212 1002 -2.1334374999999998e+01 212 210 -1.0661458333333334e+01 212 999 -5.3312499999999998e+00 212 207 -5.3333333333333330e+00 212 3157 -5.3395833333333327e+00 212 3447 -5.3395833333333327e+00 212 3483 -5.3395833333333327e+00 212 3484 -5.3395833333333327e+00 213 213 3.2012500000000003e+01 213 965 -1.3552527156068805e-19 213 963 1.3552527156068805e-19 213 200 -5.3333333333333330e+00 213 964 -5.3333333333333330e+00 213 966 1.3552527156068805e-19 213 967 -1.0667708333333334e+01 213 202 -1.0667708333333334e+01 213 1001 -1.3552527156068805e-19 213 209 -1.0667708333333334e+01 213 212 -5.3333333333333330e+00 213 994 1.0667708333333334e+01 213 3483 -5.3333333333333330e+00 214 214 3.2012500000000003e+01 214 996 -1.3552527156068805e-19 214 611 -1.3552527156068805e-19 214 208 -5.3333333333333330e+00 214 608 1.3552527156068805e-19 214 609 -1.0667708333333334e+01 214 197 -1.0667708333333334e+01 214 965 1.3552527156068805e-19 214 209 -1.0667708333333334e+01 214 200 -5.3333333333333330e+00 214 684 1.0667708333333334e+01 214 682 5.3333333333333330e+00 215 215 3.2012500000000003e+01 215 984 -1.3552527156068805e-19 215 980 1.3552527156068805e-19 215 203 -5.3333333333333330e+00 215 981 -5.3333333333333330e+00 215 985 1.3552527156068805e-19 215 986 -1.0667708333333334e+01 215 205 -1.0667708333333334e+01 215 1007 1.3552527156068805e-19 215 217 -1.0667708333333334e+01 215 216 -5.3333333333333330e+00 215 1008 1.0667708333333334e+01 215 3211 -5.3333333333333330e+00 216 216 6.4041666666666671e+01 216 1009 5.3312499999999998e+00 216 1003 5.3312499999999998e+00 216 219 -5.3333333333333330e+00 216 1005 -2.1334374999999998e+01 216 1004 5.3312499999999998e+00 216 210 -1.0661458333333334e+01 216 618 5.3312499999999998e+00 216 211 -5.3333333333333330e+00 216 619 -2.1334374999999998e+01 216 620 5.3312499999999998e+00 216 199 -1.0661458333333334e+01 216 731 -5.3312499999999998e+00 216 206 -5.3333333333333330e+00 216 985 -2.1334374999999998e+01 216 986 5.3312499999999998e+00 216 205 -1.0661458333333334e+01 216 1007 2.1334374999999998e+01 216 217 -1.0661458333333334e+01 216 1008 -5.3312499999999998e+00 216 215 -5.3333333333333330e+00 216 3158 -5.3395833333333327e+00 216 3534 -5.3395833333333327e+00 216 3390 -5.3395833333333327e+00 216 3211 -5.3395833333333327e+00 217 217 6.4049999999999997e+01 217 1009 -1.0416666666666664e-02 217 219 -1.0667708333333334e+01 217 1006 -2.1329166666666662e+01 217 212 -1.0661458333333334e+01 217 1010 -1.0416666666666664e-02 217 982 5.3312499999999998e+00 217 218 -1.0667708333333334e+01 217 984 -2.1329166666666662e+01 217 981 5.3312499999999998e+00 217 203 -1.0661458333333334e+01 217 1008 1.0416666666666664e-02 217 1007 -2.1329166666666662e+01 217 216 -1.0661458333333334e+01 217 215 -1.0667708333333334e+01 217 3158 5.3312499999999998e+00 217 3157 5.3312499999999998e+00 217 3447 5.3312499999999998e+00 217 3211 5.3312499999999998e+00 218 218 3.2012500000000003e+01 218 1006 -1.0842021724855044e-19 218 966 -1.3552527156068805e-19 218 212 -5.3333333333333330e+00 218 968 1.3552527156068805e-19 218 969 -1.0667708333333334e+01 218 202 -1.0667708333333334e+01 218 984 1.0842021724855044e-19 218 217 -1.0667708333333334e+01 218 203 -5.3333333333333330e+00 218 1010 -1.0667708333333334e+01 218 982 -5.3333333333333330e+00 218 3447 -5.3333333333333330e+00 219 219 3.2012500000000003e+01 219 1007 -1.3552527156068805e-19 219 1005 -1.3552527156068805e-19 219 216 -5.3333333333333330e+00 219 1002 1.3552527156068805e-19 219 1003 -1.0667708333333334e+01 219 210 -1.0667708333333334e+01 219 1006 1.3552527156068805e-19 219 217 -1.0667708333333334e+01 219 212 -5.3333333333333330e+00 219 1009 -1.0667708333333334e+01 219 3158 -5.3333333333333330e+00 219 3157 -5.3333333333333330e+00 220 220 3.2012500000000003e+01 220 639 1.0842021724855044e-19 220 822 1.3552527156068805e-19 220 633 -1.3552527156068805e-19 220 942 -1.0667708333333334e+01 220 632 -5.3333333333333330e+00 220 224 -1.0667708333333334e+01 220 223 -5.3333333333333330e+00 220 648 1.0842021724855044e-19 220 647 -1.0667708333333334e+01 220 819 -5.3333333333333330e+00 220 222 -1.0667708333333334e+01 220 221 -5.3333333333333330e+00 221 221 5.3354166667000001e+01 221 942 5.3312499999999998e+00 221 559 -5.3312499999999998e+00 221 822 2.1334374999999998e+01 221 940 -5.3312499999999998e+00 221 821 2.6635416666250000e+00 221 224 -1.0661458333333334e+01 221 231 -8.0000000000000000e+00 221 552 1.0416666666666666e-11 221 556 -2.6635416666250005e+00 221 230 -8.0000000000000000e+00 221 815 6.2499999999999991e-11 221 820 -6.2499999999999991e-11 221 816 1.0416666666666666e-11 221 228 4.1666666666666665e-11 221 817 -1.0666666666583334e+01 221 648 -2.1334374999999998e+01 221 647 5.3312499999999998e+00 221 819 -5.3395833333333327e+00 221 222 -1.0661458333333334e+01 221 220 -5.3333333333333330e+00 221 3474 -1.0416666666666666e-11 221 2315 -1.0416666666666666e-11 221 1613 4.1666666666666665e-11 221 1614 -1.0666666666666666e+01 222 222 6.4049999999999997e+01 222 632 5.3312499999999998e+00 222 556 -5.3312499999999998e+00 222 559 1.0416666666666664e-02 222 553 -5.3312499999999998e+00 222 230 -1.0667708333333334e+01 222 649 2.1329166666666662e+01 222 621 -5.3312499999999998e+00 222 628 1.0416666666666664e-02 222 639 -2.1329166666666662e+01 222 626 -5.3312499999999998e+00 222 223 -1.0661458333333334e+01 222 229 -1.0667708333333334e+01 222 647 -1.0416666666666664e-02 222 648 2.1329166666666662e+01 222 819 5.3312499999999998e+00 222 221 -1.0661458333333334e+01 222 220 -1.0667708333333334e+01 222 1617 -1.0661458333333334e+01 223 223 6.4020833333541674e+01 223 1040 -5.3333333333124999e+00 223 631 -5.3333333333124999e+00 223 641 2.1333333333343749e+01 223 974 -5.3333333333124999e+00 223 226 -1.0666666666614583e+01 223 647 5.3312499999999998e+00 223 944 5.3312499999999998e+00 223 634 -5.3364583333645825e+00 223 232 -5.3333333333333330e+00 223 639 2.1334374999999998e+01 223 628 -5.3312499999999998e+00 223 626 5.3364583333645825e+00 223 222 -1.0661458333333334e+01 223 229 -5.3333333333333330e+00 223 637 2.1333333333343749e+01 223 1039 5.3333333333124999e+00 223 636 -5.3333333333958333e+00 223 227 -1.0666666666614583e+01 223 225 -5.3333333333333330e+00 223 633 2.1334374999999998e+01 223 942 5.3312499999999998e+00 223 632 -5.3395833333333327e+00 223 224 -1.0661458333333334e+01 223 220 -5.3333333333333330e+00 224 224 6.4049999999999997e+01 224 634 5.3312499999999998e+00 224 944 -1.0416666666666664e-02 224 946 5.3312499999999998e+00 224 232 -1.0667708333333334e+01 224 819 5.3312499999999998e+00 224 943 2.1329166666666662e+01 224 939 -5.3312499999999998e+00 224 940 1.0416666666666664e-02 224 822 -2.1329166666666662e+01 224 821 5.3312499999999998e+00 224 221 -1.0661458333333334e+01 224 231 -1.0667708333333334e+01 224 942 -1.0416666666666664e-02 224 633 -2.1329166666666662e+01 224 632 5.3312499999999998e+00 224 223 -1.0661458333333334e+01 224 220 -1.0667708333333334e+01 224 1619 -1.0661458333333334e+01 225 225 3.2000000000124999e+01 225 641 1.2116903504194741e-27 225 1030 1.0097419586828951e-27 225 637 -1.0097419586828951e-27 225 1039 -1.0666666666677083e+01 225 636 -5.3333333333333330e+00 225 227 -1.0666666666677083e+01 225 223 -5.3333333333333330e+00 225 1029 -1.2116903504194741e-27 225 1040 1.0666666666677083e+01 225 1028 -5.3333333333333330e+00 225 226 -1.0666666666677083e+01 225 1620 -5.3333333333333330e+00 226 226 6.4000000000499995e+01 226 636 5.3333333333124999e+00 226 946 5.3333333333124999e+00 226 974 1.0416666666666666e-10 226 641 -2.1333333333291666e+01 226 634 5.3333333333124999e+00 226 223 -1.0666666666614583e+01 226 232 -1.0666666666677083e+01 226 701 1.0416666666666666e-10 226 948 -2.1333333333291666e+01 226 1040 1.0416666666666666e-10 226 1029 -2.1333333333291666e+01 226 1028 5.3333333333124999e+00 226 225 -1.0666666666677083e+01 226 1818 -5.3333333333124999e+00 226 1816 -5.3333333333124999e+00 226 1619 -1.0666666666614583e+01 226 1621 -1.0666666666677083e+01 226 1620 -1.0666666666614583e+01 227 227 6.4000000000499995e+01 227 626 -5.3333333333124999e+00 227 631 1.0416666666666666e-10 227 621 -5.3333333333124999e+00 227 229 -1.0666666666677083e+01 227 1028 5.3333333333124999e+00 227 652 -2.1333333333291666e+01 227 650 5.3333333333124999e+00 227 1026 1.0416666666666666e-10 227 1030 -2.1333333333291666e+01 227 1025 -5.3333333333124999e+00 227 233 -1.0666666666677083e+01 227 1039 -1.0416666666666666e-10 227 637 -2.1333333333291666e+01 227 636 5.3333333333124999e+00 227 223 -1.0666666666614583e+01 227 225 -1.0666666666677083e+01 227 1617 -1.0666666666614583e+01 227 1620 -1.0666666666614583e+01 228 228 3.2000000000249997e+01 228 821 5.3333333333124999e+00 228 939 -5.3333333333124999e+00 228 231 -1.0666666666687499e+01 228 947 -1.0666666666687499e+01 228 1075 1.0666666666687499e+01 228 816 4.1666666666666665e-11 228 221 4.1666666666666665e-11 228 817 -5.3333333333124999e+00 228 820 -1.0666666666687499e+01 228 3474 -4.1666666666666665e-11 228 1619 4.1666666666666665e-11 228 1787 -5.3333333333124999e+00 228 5004 -4.1666666666666665e-11 228 1786 -5.3333333333124999e+00 228 1618 -1.0666666666687499e+01 228 1612 4.1666666666666665e-11 228 2096 -5.3333333333124999e+00 228 1614 -1.0666666666687499e+01 229 229 3.2006250000062501e+01 229 637 1.4136387421560532e-27 229 652 -1.4136387421560532e-27 229 631 1.0666666666677083e+01 229 227 -1.0666666666677083e+01 229 649 -1.3552527156068805e-19 229 621 5.3333333333333330e+00 229 639 -1.3552527156068805e-19 229 628 1.0667708333333334e+01 229 626 5.3333333333333330e+00 229 222 -1.0667708333333334e+01 229 223 -5.3333333333333330e+00 229 1617 -5.3333333333333330e+00 230 230 3.7339583333458329e+01 230 648 -1.3552527156068805e-19 230 649 1.3552527156068805e-19 230 559 1.0667708333333334e+01 230 222 -1.0667708333333334e+01 230 553 1.3333333333322916e+01 230 552 -6.2499999999999991e-11 230 556 1.3333333333322916e+01 230 815 -5.3333333333229165e+00 230 221 -8.0000000000000000e+00 230 1617 -8.0000000000000000e+00 230 2100 -5.3333333333229165e+00 230 1613 -1.0666666666687499e+01 231 231 3.7339583333458329e+01 231 820 5.3333333333229165e+00 231 947 5.3333333333229165e+00 231 228 -1.0666666666687499e+01 231 943 -1.3552527156068805e-19 231 939 1.3333333333322916e+01 231 822 -1.3552527156068805e-19 231 940 1.0667708333333334e+01 231 821 -1.3333333333322916e+01 231 224 -1.0667708333333334e+01 231 221 -8.0000000000000000e+00 231 3474 6.2499999999999991e-11 231 1619 -8.0000000000000000e+00 232 232 3.2006250000062501e+01 232 948 1.0097419586828951e-27 232 641 -1.0097419586828951e-27 232 974 1.0666666666677083e+01 232 226 -1.0666666666677083e+01 232 633 1.3552527156068805e-19 232 223 -5.3333333333333330e+00 232 634 -5.3333333333333330e+00 232 943 1.3552527156068805e-19 232 944 -1.0667708333333334e+01 232 946 -5.3333333333333330e+00 232 224 -1.0667708333333334e+01 232 1619 -5.3333333333333330e+00 233 233 3.7333333333520827e+01 233 652 1.2116903504194741e-27 233 1030 -1.2116903504194741e-27 233 1026 1.0666666666677083e+01 233 227 -1.0666666666677083e+01 233 1025 1.3333333333322916e+01 233 1023 -5.3333333333229165e+00 233 650 -1.3333333333322916e+01 233 1620 -8.0000000000000000e+00 233 1726 6.2499999999999991e-11 233 1723 -5.3333333333229165e+00 233 1617 -8.0000000000000000e+00 233 1615 -1.0666666666687499e+01 234 234 1.6006250000000001e+01 235 235 1.6010416666666668e+01 236 236 6.4049999999999997e+01 236 675 -1.0416666666666664e-02 236 676 2.1329166666666662e+01 236 673 -1.0416666666666664e-02 236 674 2.1329166666666662e+01 236 654 1.0416666666666664e-02 236 671 -2.1329166666666662e+01 237 237 1.6006250000000001e+01 238 238 1.6010416666666668e+01 239 239 1.6006250000000001e+01 240 240 1.6010416666666668e+01 241 241 1.6006250000000001e+01 242 242 3.2020833333333336e+01 243 243 6.4049999999999997e+01 243 666 -1.0416666666666664e-02 243 883 -5.3312499999999998e+00 243 664 -1.0416666666666664e-02 243 665 2.1329166666666662e+01 243 884 -5.3312499999999998e+00 243 245 -1.0667708333333334e+01 243 662 -2.1329166666666662e+01 243 656 1.0416666666666664e-02 243 663 2.1329166666666662e+01 243 3412 -5.3312499999999998e+00 243 3481 -5.3312499999999998e+00 243 2363 -1.0667708333333334e+01 243 2360 -1.0661458333333334e+01 244 244 1.6006250000000001e+01 245 245 3.2012500000000003e+01 245 937 -1.3552527156068805e-19 245 885 1.0667708333333334e+01 245 663 -1.3552527156068805e-19 245 883 5.3333333333333330e+00 245 665 1.3552527156068805e-19 245 664 -1.0667708333333334e+01 245 884 5.3333333333333330e+00 245 243 -1.0667708333333334e+01 245 3409 1.3552527156068805e-19 245 2361 -1.0667708333333334e+01 245 2360 -5.3333333333333330e+00 246 246 6.4049999999999997e+01 246 670 -1.0416666666666664e-02 246 669 2.1329166666666662e+01 246 658 1.0416666666666664e-02 246 661 -2.1329166666666662e+01 246 667 -1.0416666666666664e-02 246 668 2.1329166666666662e+01 246 3481 -5.3312499999999998e+00 246 3128 -5.3312499999999998e+00 246 2515 -1.0667708333333334e+01 247 247 1.6006250000000001e+01 248 248 1.6010416666666668e+01 249 249 1.6006250000000001e+01 250 250 3.2012500000000003e+01 250 666 1.3552527156068805e-19 250 667 -1.3552527156068805e-19 250 270 -5.3333333333333330e+00 250 658 -1.3552527156068805e-19 250 661 1.0667708333333334e+01 250 253 -1.0667708333333334e+01 250 656 1.3552527156068805e-19 250 252 -1.0667708333333334e+01 250 251 -5.3333333333333330e+00 250 662 1.0667708333333334e+01 250 3481 -5.3333333333333330e+00 251 251 6.4041666666666671e+01 251 663 5.3312499999999998e+00 251 879 5.3312499999999998e+00 251 269 -5.3333333333333330e+00 251 660 2.1334374999999998e+01 251 880 5.3312499999999998e+00 251 259 -1.0661458333333334e+01 251 674 5.3312499999999998e+00 251 260 -5.3333333333333330e+00 251 654 2.1334374999999998e+01 251 671 -5.3312499999999998e+00 251 255 -1.0661458333333334e+01 251 669 5.3312499999999998e+00 251 254 -5.3333333333333330e+00 251 658 2.1334374999999998e+01 251 661 -5.3312499999999998e+00 251 253 -1.0661458333333334e+01 251 656 2.1334374999999998e+01 251 252 -1.0661458333333334e+01 251 662 -5.3312499999999998e+00 251 250 -5.3333333333333330e+00 252 252 6.4049999999999997e+01 252 666 2.1329166666666662e+01 252 270 -1.0661458333333334e+01 252 663 -1.0416666666666664e-02 252 883 5.3312499999999998e+00 252 269 -1.0667708333333334e+01 252 665 -1.0416666666666664e-02 252 664 2.1329166666666662e+01 252 884 5.3312499999999998e+00 252 261 -1.0661458333333334e+01 252 268 -1.0667708333333334e+01 252 662 1.0416666666666664e-02 252 656 -2.1329166666666662e+01 252 251 -1.0661458333333334e+01 252 250 -1.0667708333333334e+01 252 3412 5.3312499999999998e+00 252 3481 5.3312499999999998e+00 253 253 6.4049999999999997e+01 253 670 2.1329166666666662e+01 253 272 -1.0661458333333334e+01 253 668 -1.0416666666666664e-02 253 275 -1.0667708333333334e+01 253 667 2.1329166666666662e+01 253 270 -1.0661458333333334e+01 253 669 -1.0416666666666664e-02 253 254 -1.0667708333333334e+01 253 661 1.0416666666666664e-02 253 658 -2.1329166666666662e+01 253 251 -1.0661458333333334e+01 253 250 -1.0667708333333334e+01 253 3128 5.3312499999999998e+00 253 3481 5.3312499999999998e+00 254 254 3.2012500000000003e+01 254 670 1.3552527156068805e-19 254 675 -1.0842021724855044e-19 254 272 -5.3333333333333330e+00 254 654 -1.0842021724855044e-19 254 671 1.0667708333333334e+01 254 255 -1.0667708333333334e+01 254 658 1.3552527156068805e-19 254 253 -1.0667708333333334e+01 254 251 -5.3333333333333330e+00 254 669 -1.0667708333333334e+01 255 255 6.4049999999999997e+01 255 675 2.1329166666666662e+01 255 272 -1.0661458333333334e+01 255 676 -1.0416666666666664e-02 255 267 -1.0667708333333334e+01 255 674 -1.0416666666666664e-02 255 673 2.1329166666666662e+01 255 257 -1.0661458333333334e+01 255 260 -1.0667708333333334e+01 255 671 1.0416666666666664e-02 255 654 -2.1329166666666662e+01 255 251 -1.0661458333333334e+01 255 254 -1.0667708333333334e+01 256 256 3.2012500000000003e+01 256 876 1.3552527156068805e-19 256 878 -1.3552527156068805e-19 256 261 -5.3333333333333330e+00 256 872 5.3333333333333330e+00 256 869 -1.3552527156068805e-19 256 874 1.0667708333333334e+01 256 259 -1.0667708333333334e+01 256 867 1.3552527156068805e-19 256 258 -1.0667708333333334e+01 256 257 -5.3333333333333330e+00 256 875 1.0667708333333334e+01 257 257 6.4041666666666671e+01 257 533 -5.3312499999999998e+00 257 531 -5.3312499999999998e+00 257 265 -5.3333333333333330e+00 257 871 2.1334374999999998e+01 257 898 5.3312499999999998e+00 257 266 -1.0661458333333334e+01 257 676 5.3312499999999998e+00 257 267 -5.3333333333333330e+00 257 673 -2.1334374999999998e+01 257 674 5.3312499999999998e+00 257 255 -1.0661458333333334e+01 257 880 5.3312499999999998e+00 257 260 -5.3333333333333330e+00 257 869 2.1334374999999998e+01 257 874 -5.3312499999999998e+00 257 259 -1.0661458333333334e+01 257 867 2.1334374999999998e+01 257 258 -1.0661458333333334e+01 257 875 -5.3312499999999998e+00 257 256 -5.3333333333333330e+00 258 258 6.4049999999999997e+01 258 533 1.0416666666666664e-02 258 530 -5.3312499999999998e+00 258 265 -1.0667708333333334e+01 258 877 2.1329166666666662e+01 258 850 -5.3312499999999998e+00 258 264 -1.0661458333333334e+01 258 852 1.0416666666666664e-02 258 848 -5.3312499999999998e+00 258 262 -1.0667708333333334e+01 258 876 2.1329166666666662e+01 258 872 -5.3312499999999998e+00 258 261 -1.0661458333333334e+01 258 875 1.0416666666666664e-02 258 867 -2.1329166666666662e+01 258 257 -1.0661458333333334e+01 258 256 -1.0667708333333334e+01 259 259 6.4049999999999997e+01 259 660 -2.1329166666666662e+01 259 251 -1.0661458333333334e+01 259 879 -1.0416666666666664e-02 259 883 5.3312499999999998e+00 259 269 -1.0667708333333334e+01 259 878 2.1329166666666662e+01 259 261 -1.0661458333333334e+01 259 872 -5.3312499999999998e+00 259 880 -1.0416666666666664e-02 259 260 -1.0667708333333334e+01 259 874 1.0416666666666664e-02 259 869 -2.1329166666666662e+01 259 257 -1.0661458333333334e+01 259 256 -1.0667708333333334e+01 260 260 3.2012500000000003e+01 260 660 -1.3552527156068805e-19 260 654 1.3552527156068805e-19 260 251 -5.3333333333333330e+00 260 673 1.3552527156068805e-19 260 674 -1.0667708333333334e+01 260 255 -1.0667708333333334e+01 260 869 1.3552527156068805e-19 260 259 -1.0667708333333334e+01 260 257 -5.3333333333333330e+00 260 880 -1.0667708333333334e+01 261 261 6.4041666666666671e+01 261 879 5.3312499999999998e+00 261 663 5.3312499999999998e+00 261 883 -5.3395833333333327e+00 261 269 -5.3333333333333330e+00 261 664 -2.1334374999999998e+01 261 665 5.3312499999999998e+00 261 252 -1.0661458333333334e+01 261 891 5.3312499999999998e+00 261 884 -5.3395833333333327e+00 261 268 -5.3333333333333330e+00 261 882 2.1334374999999998e+01 261 849 -5.3312499999999998e+00 261 263 -1.0661458333333334e+01 261 852 -5.3312499999999998e+00 261 848 5.3395833333333327e+00 261 262 -5.3333333333333330e+00 261 876 -2.1334374999999998e+01 261 875 -5.3312499999999998e+00 261 258 -1.0661458333333334e+01 261 878 -2.1334374999999998e+01 261 259 -1.0661458333333334e+01 261 874 -5.3312499999999998e+00 261 872 5.3395833333333327e+00 261 256 -5.3333333333333330e+00 262 262 3.2012500000000003e+01 262 877 1.0842021724855044e-19 262 892 -1.3552527156068805e-19 262 264 -5.3333333333333330e+00 262 850 5.3333333333333330e+00 262 882 -1.3552527156068805e-19 262 849 1.0667708333333334e+01 262 263 -1.0667708333333334e+01 262 876 -1.0842021724855044e-19 262 258 -1.0667708333333334e+01 262 261 -5.3333333333333330e+00 262 852 1.0667708333333334e+01 262 848 5.3333333333333330e+00 263 263 6.4049999999999997e+01 263 893 -1.0416666666666664e-02 263 896 5.3312499999999998e+00 263 274 -1.0667708333333334e+01 263 890 2.1329166666666662e+01 263 270 -1.0661458333333334e+01 263 891 -1.0416666666666664e-02 263 884 5.3312499999999998e+00 263 268 -1.0667708333333334e+01 263 892 2.1329166666666662e+01 263 264 -1.0661458333333334e+01 263 850 -5.3312499999999998e+00 263 849 1.0416666666666664e-02 263 882 -2.1329166666666662e+01 263 848 -5.3312499999999998e+00 263 261 -1.0661458333333334e+01 263 262 -1.0667708333333334e+01 263 3482 5.3312499999999998e+00 263 3412 5.3312499999999998e+00 264 264 6.4041666666666671e+01 264 893 5.3312499999999998e+00 264 993 5.3312499999999998e+00 264 896 -5.3395833333333327e+00 264 274 -5.3333333333333330e+00 264 897 2.1334374999999998e+01 264 991 -5.3312499999999998e+00 264 273 -1.0661458333333334e+01 264 900 5.3312499999999998e+00 264 895 -5.3395833333333327e+00 264 271 -5.3333333333333330e+00 264 894 2.1334374999999998e+01 264 531 -5.3312499999999998e+00 264 266 -1.0661458333333334e+01 264 533 -5.3312499999999998e+00 264 530 5.3395833333333327e+00 264 265 -5.3333333333333330e+00 264 877 -2.1334374999999998e+01 264 852 -5.3312499999999998e+00 264 258 -1.0661458333333334e+01 264 892 -2.1334374999999998e+01 264 263 -1.0661458333333334e+01 264 849 -5.3312499999999998e+00 264 850 5.3395833333333327e+00 264 262 -5.3333333333333330e+00 265 265 3.2012500000000003e+01 265 867 -1.3552527156068805e-19 265 871 1.3552527156068805e-19 265 257 -5.3333333333333330e+00 265 894 -1.3552527156068805e-19 265 531 1.0667708333333334e+01 265 266 -1.0667708333333334e+01 265 877 -1.3552527156068805e-19 265 258 -1.0667708333333334e+01 265 264 -5.3333333333333330e+00 265 533 1.0667708333333334e+01 265 530 5.3333333333333330e+00 266 266 6.4049999999999997e+01 266 895 5.3312499999999998e+00 266 900 -1.0416666666666664e-02 266 899 2.1329166666666662e+01 266 272 -1.0661458333333334e+01 266 271 -1.0667708333333334e+01 266 898 -1.0416666666666664e-02 266 871 -2.1329166666666662e+01 266 257 -1.0661458333333334e+01 266 267 -1.0667708333333334e+01 266 531 1.0416666666666664e-02 266 894 -2.1329166666666662e+01 266 530 -5.3312499999999998e+00 266 264 -1.0661458333333334e+01 266 265 -1.0667708333333334e+01 267 267 3.2012500000000003e+01 267 675 1.3552527156068805e-19 267 899 -1.3552527156068805e-19 267 272 -5.3333333333333330e+00 267 871 -1.3552527156068805e-19 267 898 -1.0667708333333334e+01 267 266 -1.0667708333333334e+01 267 673 -1.3552527156068805e-19 267 255 -1.0667708333333334e+01 267 257 -5.3333333333333330e+00 267 676 -1.0667708333333334e+01 268 268 3.2012500000000003e+01 268 890 1.3552527156068805e-19 268 666 -1.3552527156068805e-19 268 270 -5.3333333333333330e+00 268 664 1.3552527156068805e-19 268 665 -1.0667708333333334e+01 268 252 -1.0667708333333334e+01 268 882 1.3552527156068805e-19 268 263 -1.0667708333333334e+01 268 261 -5.3333333333333330e+00 268 891 -1.0667708333333334e+01 268 884 -5.3333333333333330e+00 268 3412 -5.3333333333333330e+00 269 269 3.2012500000000003e+01 269 656 -1.0842021724855044e-19 269 660 1.3552527156068805e-19 269 251 -5.3333333333333330e+00 269 878 1.3552527156068805e-19 269 879 -1.0667708333333334e+01 269 259 -1.0667708333333334e+01 269 664 -1.0842021724855044e-19 269 252 -1.0667708333333334e+01 269 261 -5.3333333333333330e+00 269 663 -1.0667708333333334e+01 269 883 -5.3333333333333330e+00 270 270 6.4041666666666671e+01 270 668 5.3312499999999998e+00 270 992 5.3312499999999998e+00 270 275 -5.3333333333333330e+00 270 987 2.1334374999999998e+01 270 993 5.3312499999999998e+00 270 273 -1.0661458333333334e+01 270 893 5.3312499999999998e+00 270 274 -5.3333333333333330e+00 270 890 -2.1334374999999998e+01 270 891 5.3312499999999998e+00 270 263 -1.0661458333333334e+01 270 665 5.3312499999999998e+00 270 268 -5.3333333333333330e+00 270 666 -2.1334374999999998e+01 270 662 -5.3312499999999998e+00 270 252 -1.0661458333333334e+01 270 667 -2.1334374999999998e+01 270 253 -1.0661458333333334e+01 270 661 -5.3312499999999998e+00 270 250 -5.3333333333333330e+00 270 3128 -5.3395833333333327e+00 270 3482 -5.3395833333333327e+00 270 3412 -5.3395833333333327e+00 270 3481 -5.3395833333333327e+00 271 271 3.2012500000000003e+01 271 897 -1.0842021724855044e-19 271 894 1.3552527156068805e-19 271 264 -5.3333333333333330e+00 271 895 -5.3333333333333330e+00 271 899 1.3552527156068805e-19 271 900 -1.0667708333333334e+01 271 266 -1.0667708333333334e+01 271 989 1.0842021724855044e-19 271 273 -1.0667708333333334e+01 271 272 -5.3333333333333330e+00 271 991 1.0667708333333334e+01 272 272 6.4041666666666671e+01 272 992 5.3312499999999998e+00 272 668 5.3312499999999998e+00 272 275 -5.3333333333333330e+00 272 670 -2.1334374999999998e+01 272 669 5.3312499999999998e+00 272 253 -1.0661458333333334e+01 272 671 -5.3312499999999998e+00 272 254 -5.3333333333333330e+00 272 675 -2.1334374999999998e+01 272 676 5.3312499999999998e+00 272 255 -1.0661458333333334e+01 272 898 5.3312499999999998e+00 272 267 -5.3333333333333330e+00 272 899 -2.1334374999999998e+01 272 900 5.3312499999999998e+00 272 266 -1.0661458333333334e+01 272 989 2.1334374999999998e+01 272 273 -1.0661458333333334e+01 272 991 -5.3312499999999998e+00 272 271 -5.3333333333333330e+00 273 273 6.4049999999999997e+01 273 992 -1.0416666666666664e-02 273 275 -1.0667708333333334e+01 273 987 -2.1329166666666662e+01 273 270 -1.0661458333333334e+01 273 993 -1.0416666666666664e-02 273 896 5.3312499999999998e+00 273 274 -1.0667708333333334e+01 273 897 -2.1329166666666662e+01 273 895 5.3312499999999998e+00 273 264 -1.0661458333333334e+01 273 991 1.0416666666666664e-02 273 989 -2.1329166666666662e+01 273 272 -1.0661458333333334e+01 273 271 -1.0667708333333334e+01 273 3128 5.3312499999999998e+00 273 3482 5.3312499999999998e+00 274 274 3.2012500000000003e+01 274 987 -1.3552527156068805e-19 274 890 -1.3552527156068805e-19 274 270 -5.3333333333333330e+00 274 892 1.3552527156068805e-19 274 893 -1.0667708333333334e+01 274 263 -1.0667708333333334e+01 274 897 1.3552527156068805e-19 274 273 -1.0667708333333334e+01 274 264 -5.3333333333333330e+00 274 993 -1.0667708333333334e+01 274 896 -5.3333333333333330e+00 274 3482 -5.3333333333333330e+00 275 275 3.2012500000000003e+01 275 989 -1.3552527156068805e-19 275 670 -1.3552527156068805e-19 275 272 -5.3333333333333330e+00 275 667 1.3552527156068805e-19 275 668 -1.0667708333333334e+01 275 253 -1.0667708333333334e+01 275 987 1.3552527156068805e-19 275 273 -1.0667708333333334e+01 275 270 -5.3333333333333330e+00 275 992 -1.0667708333333334e+01 275 3128 -5.3333333333333330e+00 276 276 1.6006250000000001e+01 277 277 3.2020833333333336e+01 278 278 6.4049999999999997e+01 278 964 -5.3312499999999998e+00 278 690 -1.0416666666666664e-02 278 682 5.3312499999999998e+00 278 285 -1.0667708333333334e+01 278 895 -5.3312499999999998e+00 278 688 -1.0416666666666664e-02 278 689 2.1329166666666662e+01 278 896 -5.3312499999999998e+00 278 284 -1.0667708333333334e+01 278 686 -2.1329166666666662e+01 278 679 1.0416666666666664e-02 278 687 2.1329166666666662e+01 278 2513 -1.0661458333333334e+01 279 279 1.6006250000000001e+01 280 280 6.4049999999999997e+01 280 987 1.0416666666666664e-02 280 993 2.1329166666666662e+01 280 896 -5.3312499999999998e+00 280 897 1.0416666666666664e-02 280 895 -5.3312499999999998e+00 280 284 -1.0667708333333334e+01 280 991 -2.1329166666666662e+01 280 989 1.0416666666666664e-02 280 992 2.1329166666666662e+01 280 3128 -5.3312499999999998e+00 280 3482 -5.3312499999999998e+00 280 2512 -1.0667708333333334e+01 280 2513 -1.0661458333333334e+01 281 281 1.6006250000000001e+01 282 282 3.2020833333333336e+01 283 283 6.4049999999999997e+01 283 682 5.3312499999999998e+00 283 965 1.0416666666666664e-02 283 964 -5.3312499999999998e+00 283 285 -1.0667708333333334e+01 283 994 -2.1329166666666662e+01 283 1001 -1.0416666666666664e-02 283 1000 -2.1329166666666662e+01 283 996 1.0416666666666664e-02 283 684 -2.1329166666666662e+01 283 2513 -1.0661458333333334e+01 283 3483 -5.3312499999999998e+00 283 3484 -5.3312499999999998e+00 283 2514 -1.0667708333333334e+01 284 284 3.2012500000000003e+01 284 993 -1.3552527156068805e-19 284 991 -1.3552527156068805e-19 284 897 1.0667708333333334e+01 284 280 -1.0667708333333334e+01 284 687 -1.3552527156068805e-19 284 895 5.3333333333333330e+00 284 689 1.3552527156068805e-19 284 688 -1.0667708333333334e+01 284 896 5.3333333333333330e+00 284 278 -1.0667708333333334e+01 284 2513 -5.3333333333333330e+00 285 285 3.2012500000000003e+01 285 689 -1.0842021724855044e-19 285 686 -1.0842021724855044e-19 285 690 -1.0667708333333334e+01 285 278 -1.0667708333333334e+01 285 684 1.3552527156068805e-19 285 682 -5.3333333333333330e+00 285 994 -1.3552527156068805e-19 285 965 1.0667708333333334e+01 285 964 5.3333333333333330e+00 285 283 -1.0667708333333334e+01 285 2513 -5.3333333333333330e+00 286 286 6.4000000000499995e+01 286 970 -5.3333333333124999e+00 286 708 5.3333333333124999e+00 286 711 -1.0416666666666666e-10 286 712 2.1333333333291666e+01 286 946 5.3333333333124999e+00 286 287 -1.0666666666677083e+01 286 709 -1.0416666666666666e-10 286 710 2.1333333333291666e+01 286 978 5.3333333333124999e+00 286 289 -1.0666666666677083e+01 286 698 1.0416666666666666e-10 286 707 -2.1333333333291666e+01 286 1816 -5.3333333333124999e+00 286 1208 -1.0666666666614583e+01 286 2413 -1.0666666666614583e+01 286 1819 -5.3333333333124999e+00 286 3780 -1.0666666666614583e+01 286 1207 -1.0666666666677083e+01 287 287 3.2006250000062501e+01 287 710 -1.4136387421560532e-27 287 945 1.3552527156068805e-19 287 712 1.4136387421560532e-27 287 711 -1.0666666666677083e+01 287 946 -5.3333333333333330e+00 287 286 -1.0666666666677083e+01 287 949 -1.0667708333333334e+01 287 970 5.3333333333333330e+00 287 1208 -5.3333333333333330e+00 287 3089 -1.3552527156068805e-19 287 2406 -1.0667708333333334e+01 287 2413 -5.3333333333333330e+00 288 288 3.2024999999999999e+01 288 978 5.3312499999999998e+00 288 1011 -4.1666666666666666e-03 288 708 5.3312499999999998e+00 288 289 -1.0668750000000001e+01 288 2409 4.1666666666666657e-03 288 3218 -5.3312499999999998e+00 288 3326 1.0668749999999999e+01 288 3219 4.1666666666666666e-03 288 2413 4.1666666666666657e-03 288 3214 5.3312499999999998e+00 288 3213 1.0668749999999999e+01 288 2408 -1.0668750000000001e+01 288 3780 4.1666666666666657e-03 288 4885 5.3312499999999998e+00 288 4886 1.0668749999999999e+01 288 4889 4.1666666666666666e-03 288 4866 5.3312499999999998e+00 288 3779 -1.0668750000000001e+01 289 289 3.7345833333395831e+01 289 707 1.0097419586828951e-27 289 710 1.0097419586828951e-27 289 709 -1.0666666666677083e+01 289 978 -1.3332291666666665e+01 289 286 -1.0666666666677083e+01 289 1011 6.2500000000000003e-03 289 708 -1.3332291666666665e+01 289 288 -1.0668750000000001e+01 289 3213 -5.3322916666666664e+00 289 2413 -8.0000000000000000e+00 289 4886 -5.3322916666666664e+00 289 3780 -8.0000000000000000e+00 290 290 3.2000000000249997e+01 290 939 -5.3333333333124999e+00 290 947 -1.0666666666687499e+01 290 3661 -4.1666666666666665e-11 290 3083 5.3333333333124999e+00 290 2412 -1.0666666666687499e+01 290 3474 -4.1666666666666665e-11 290 2405 4.1666666666666665e-11 290 3085 5.3333333333124999e+00 290 3084 -1.0666666666687499e+01 290 2414 -1.0666666666687499e+01 290 5004 -4.1666666666666665e-11 290 4467 5.3333333333124999e+00 290 3781 -1.0666666666687499e+01 290 3777 4.1666666666666665e-11 290 4466 5.3333333333124999e+00 290 4465 -1.0666666666687499e+01 290 1208 4.1666666666666665e-11 290 1787 -5.3333333333124999e+00 291 291 6.4000000000499995e+01 291 1038 -1.0416666666666666e-10 291 1037 2.1333333333291666e+01 291 1041 -5.3333333333124999e+00 291 1036 -1.0416666666666666e-10 291 1028 5.3333333333124999e+00 291 292 -1.0666666666677083e+01 291 1031 -2.1333333333291666e+01 291 1025 -5.3333333333124999e+00 291 1024 1.0416666666666666e-10 291 1035 2.1333333333291666e+01 291 1916 -5.3333333333124999e+00 291 2264 -5.3333333333124999e+00 291 1286 -1.0666666666677083e+01 291 1287 -1.0666666666614583e+01 291 1282 -1.0666666666614583e+01 291 1915 -5.3333333333124999e+00 291 1278 -1.0666666666614583e+01 291 1285 -1.0666666666677083e+01 292 292 3.2000000000124999e+01 292 1037 -1.2116903504194741e-27 292 1031 -1.2116903504194741e-27 292 1036 -1.0666666666677083e+01 292 291 -1.0666666666677083e+01 292 702 -1.0097419586828951e-27 292 1028 -5.3333333333333330e+00 292 703 -1.0666666666677083e+01 292 1041 5.3333333333333330e+00 292 1282 -5.3333333333333330e+00 292 2269 -1.0097419586828951e-27 292 1290 -1.0666666666677083e+01 292 1287 -5.3333333333333330e+00 293 293 3.7345833333395831e+01 293 704 -1.2116903504194741e-27 293 705 1.2116903504194741e-27 293 706 -1.0666666666677083e+01 293 708 -1.3332291666666665e+01 293 1011 6.2500000000000003e-03 293 1015 -1.3332291666666665e+01 293 1014 -5.3322916666666664e+00 293 1470 -1.0666666666677083e+01 293 3977 -8.0000000000000000e+00 293 4886 -5.3322916666666664e+00 293 1463 -8.0000000000000000e+00 293 3971 -1.0668750000000001e+01 294 294 6.4000000000416662e+01 294 702 5.3333333333124999e+00 294 1029 -5.3333333333124999e+00 294 298 -5.3333333333333330e+00 294 701 2.1333333333343749e+01 294 948 -5.3333333333124999e+00 294 299 -1.0666666666614583e+01 294 712 5.3333333333124999e+00 294 300 -5.3333333333333330e+00 294 698 2.1333333333343749e+01 294 707 -5.3333333333124999e+00 294 296 -1.0666666666614583e+01 294 705 5.3333333333124999e+00 294 295 -5.3333333333333330e+00 294 700 2.1333333333343749e+01 294 699 2.1333333333343749e+01 294 1818 -5.3333333333958333e+00 294 1816 -5.3333333333958333e+00 294 1819 -5.3333333333958333e+00 294 2284 -5.3333333333124999e+00 294 1674 -1.0666666666614583e+01 294 1675 -1.0666666666614583e+01 294 2283 -5.3333333333124999e+00 294 1817 -5.3333333333958333e+00 294 1672 -5.3333333333333330e+00 295 295 3.2000000000124999e+01 295 706 1.4136387421560532e-27 295 709 -1.0097419586828951e-27 295 302 -5.3333333333333330e+00 295 708 5.3333333333333330e+00 295 698 -1.0097419586828951e-27 295 707 1.0666666666677083e+01 295 296 -1.0666666666677083e+01 295 700 1.4136387421560532e-27 295 294 -5.3333333333333330e+00 295 705 -1.0666666666677083e+01 295 1674 -1.0666666666677083e+01 295 1819 -5.3333333333333330e+00 296 296 6.4000000000499995e+01 296 970 5.3333333333124999e+00 296 711 2.1333333333291666e+01 296 946 -5.3333333333124999e+00 296 310 -1.0666666666614583e+01 296 708 -5.3333333333124999e+00 296 710 -1.0416666666666666e-10 296 709 2.1333333333291666e+01 296 978 -5.3333333333124999e+00 296 302 -1.0666666666614583e+01 296 305 -1.0666666666677083e+01 296 712 -1.0416666666666666e-10 296 300 -1.0666666666677083e+01 296 707 1.0416666666666666e-10 296 698 -2.1333333333291666e+01 296 294 -1.0666666666614583e+01 296 295 -1.0666666666677083e+01 296 1816 5.3333333333124999e+00 296 1819 5.3333333333124999e+00 297 297 6.4000000000416662e+01 297 1049 5.3333333333124999e+00 297 1067 5.3333333333124999e+00 297 1043 -5.3333333333958333e+00 297 312 -5.3333333333333330e+00 297 1045 2.1333333333343749e+01 297 642 -5.3333333333124999e+00 297 311 -1.0666666666614583e+01 297 641 -5.3333333333124999e+00 297 636 5.3333333333958333e+00 297 309 -5.3333333333333330e+00 297 1040 2.1333333333343749e+01 297 1029 -5.3333333333124999e+00 297 299 -1.0666666666614583e+01 297 702 5.3333333333124999e+00 297 1028 5.3333333333958333e+00 297 298 -5.3333333333333330e+00 297 703 -2.1333333333343749e+01 297 1044 2.1333333333343749e+01 297 1041 -5.3333333333958333e+00 297 2269 -5.3333333333124999e+00 297 1675 -1.0666666666614583e+01 297 1677 -1.0666666666614583e+01 297 2267 -5.3333333333124999e+00 297 1676 -5.3333333333333330e+00 298 298 3.2000000000124999e+01 298 699 -1.0097419586828951e-27 298 701 1.4136387421560532e-27 298 294 -5.3333333333333330e+00 298 1040 -1.4136387421560532e-27 298 1029 1.0666666666677083e+01 298 299 -1.0666666666677083e+01 298 703 -1.0097419586828951e-27 298 297 -5.3333333333333330e+00 298 702 -1.0666666666677083e+01 298 1028 5.3333333333333330e+00 298 1818 -5.3333333333333330e+00 298 1675 -1.0666666666677083e+01 299 299 6.4000000000499995e+01 299 636 -5.3333333333124999e+00 299 946 -5.3333333333124999e+00 299 641 1.0416666666666666e-10 299 974 -2.1333333333291666e+01 299 634 -5.3333333333124999e+00 299 310 -1.0666666666614583e+01 299 309 -1.0666666666677083e+01 299 948 1.0416666666666666e-10 299 701 -2.1333333333291666e+01 299 294 -1.0666666666614583e+01 299 300 -1.0666666666677083e+01 299 1029 1.0416666666666666e-10 299 1040 -2.1333333333291666e+01 299 1028 -5.3333333333124999e+00 299 297 -1.0666666666614583e+01 299 298 -1.0666666666677083e+01 299 1818 5.3333333333124999e+00 299 1816 5.3333333333124999e+00 300 300 3.2000000000124999e+01 300 711 1.2116903504194741e-27 300 974 1.0097419586828951e-27 300 310 -5.3333333333333330e+00 300 946 5.3333333333333330e+00 300 701 -1.0097419586828951e-27 300 948 1.0666666666677083e+01 300 299 -1.0666666666677083e+01 300 698 1.2116903504194741e-27 300 296 -1.0666666666677083e+01 300 294 -5.3333333333333330e+00 300 712 -1.0666666666677083e+01 300 1816 -5.3333333333333330e+00 301 301 3.2000000000124999e+01 301 1060 1.0097419586828951e-27 301 1063 -1.4136387421560532e-27 301 306 -5.3333333333333330e+00 301 1020 5.3333333333333330e+00 301 1019 -1.4136387421560532e-27 301 1021 1.0666666666677083e+01 301 304 -1.0666666666677083e+01 301 1017 1.0097419586828951e-27 301 303 -1.0666666666677083e+01 301 302 -5.3333333333333330e+00 301 1022 1.0666666666677083e+01 301 1018 -5.3333333333333330e+00 302 302 6.4000000000416662e+01 302 1016 -5.3333333333124999e+00 302 704 5.3333333333124999e+00 302 1015 5.3333333333958333e+00 302 308 -5.3333333333333330e+00 302 706 -2.1333333333343749e+01 302 705 5.3333333333124999e+00 302 707 -5.3333333333124999e+00 302 708 5.3333333333958333e+00 302 295 -5.3333333333333330e+00 302 709 -2.1333333333343749e+01 302 710 5.3333333333124999e+00 302 296 -1.0666666666614583e+01 302 979 -5.3333333333124999e+00 302 978 5.3333333333958333e+00 302 305 -5.3333333333333330e+00 302 1019 2.1333333333343749e+01 302 1021 -5.3333333333124999e+00 302 304 -1.0666666666614583e+01 302 1017 2.1333333333343749e+01 302 303 -1.0666666666614583e+01 302 1022 -5.3333333333124999e+00 302 1018 -5.3333333333958333e+00 302 301 -5.3333333333333330e+00 302 1674 -1.0666666666614583e+01 303 303 6.4000000000499995e+01 303 1015 -5.3333333333124999e+00 303 1016 1.0416666666666666e-10 303 308 -1.0666666666677083e+01 303 1062 2.1333333333291666e+01 303 1061 -1.0416666666666666e-10 303 1064 5.3333333333124999e+00 303 307 -1.0666666666677083e+01 303 1060 2.1333333333291666e+01 303 1020 -5.3333333333124999e+00 303 306 -1.0666666666614583e+01 303 1022 1.0416666666666666e-10 303 1017 -2.1333333333291666e+01 303 302 -1.0666666666614583e+01 303 1018 5.3333333333124999e+00 303 301 -1.0666666666677083e+01 303 1940 5.3333333333124999e+00 303 2280 5.3333333333124999e+00 303 1673 -1.0666666666614583e+01 304 304 6.4000000000499995e+01 304 717 -5.3333333333124999e+00 304 975 -2.1333333333291666e+01 304 970 5.3333333333124999e+00 304 310 -1.0666666666614583e+01 304 716 1.0416666666666666e-10 304 715 -5.3333333333124999e+00 304 313 -1.0666666666677083e+01 304 1063 2.1333333333291666e+01 304 306 -1.0666666666614583e+01 304 1020 -5.3333333333124999e+00 304 979 1.0416666666666666e-10 304 978 -5.3333333333124999e+00 304 305 -1.0666666666677083e+01 304 1021 1.0416666666666666e-10 304 1019 -2.1333333333291666e+01 304 1018 5.3333333333124999e+00 304 302 -1.0666666666614583e+01 304 301 -1.0666666666677083e+01 305 305 3.2000000000124999e+01 305 975 -1.2116903504194741e-27 305 711 -1.4136387421560532e-27 305 310 -5.3333333333333330e+00 305 970 -5.3333333333333330e+00 305 709 1.4136387421560532e-27 305 710 -1.0666666666677083e+01 305 296 -1.0666666666677083e+01 305 1019 1.2116903504194741e-27 305 304 -1.0666666666677083e+01 305 302 -5.3333333333333330e+00 305 979 1.0666666666677083e+01 305 978 5.3333333333333330e+00 306 306 6.4000000000416662e+01 306 716 -5.3333333333124999e+00 306 718 -5.3333333333124999e+00 306 715 5.3333333333958333e+00 306 313 -5.3333333333333330e+00 306 1066 2.1333333333343749e+01 306 1067 5.3333333333124999e+00 306 311 -1.0666666666614583e+01 306 1049 5.3333333333124999e+00 306 1065 -5.3333333333958333e+00 306 312 -5.3333333333333330e+00 306 1047 -2.1333333333343749e+01 306 1048 5.3333333333124999e+00 306 1061 5.3333333333124999e+00 306 1064 -5.3333333333958333e+00 306 307 -5.3333333333333330e+00 306 1060 -2.1333333333343749e+01 306 1022 -5.3333333333124999e+00 306 303 -1.0666666666614583e+01 306 1063 -2.1333333333343749e+01 306 304 -1.0666666666614583e+01 306 1021 -5.3333333333124999e+00 306 1020 5.3333333333958333e+00 306 301 -5.3333333333333330e+00 306 1677 -1.0666666666614583e+01 307 307 3.2000000000124999e+01 307 1062 1.2116903504194741e-27 307 1047 1.0097419586828951e-27 307 1048 -1.0666666666677083e+01 307 1060 -1.2116903504194741e-27 307 303 -1.0666666666677083e+01 307 306 -5.3333333333333330e+00 307 1061 -1.0666666666677083e+01 307 1064 -5.3333333333333330e+00 307 2279 1.0097419586828951e-27 307 1673 -5.3333333333333330e+00 307 2280 -5.3333333333333330e+00 307 1677 -1.0666666666677083e+01 308 308 3.2000000000124999e+01 308 1017 -1.4136387421560532e-27 308 706 -1.2116903504194741e-27 308 302 -5.3333333333333330e+00 308 1015 5.3333333333333330e+00 308 704 -1.0666666666677083e+01 308 1062 -1.4136387421560532e-27 308 303 -1.0666666666677083e+01 308 1016 1.0666666666677083e+01 308 2282 -1.2116903504194741e-27 308 1674 -1.0666666666677083e+01 308 1673 -5.3333333333333330e+00 308 1940 -5.3333333333333330e+00 309 309 3.2000000000124999e+01 309 1045 -1.4136387421560532e-27 309 1040 1.2116903504194741e-27 309 297 -5.3333333333333330e+00 309 636 5.3333333333333330e+00 309 974 -1.2116903504194741e-27 309 641 1.0666666666677083e+01 309 299 -1.0666666666677083e+01 309 972 1.4136387421560532e-27 309 311 -1.0666666666677083e+01 309 310 -5.3333333333333330e+00 309 642 1.0666666666677083e+01 309 634 5.3333333333333330e+00 310 310 6.4000000000416662e+01 310 718 -5.3333333333124999e+00 310 716 -5.3333333333124999e+00 310 717 5.3333333333958333e+00 310 313 -5.3333333333333330e+00 310 975 2.1333333333343749e+01 310 979 -5.3333333333124999e+00 310 304 -1.0666666666614583e+01 310 710 5.3333333333124999e+00 310 970 -5.3333333333958333e+00 310 305 -5.3333333333333330e+00 310 711 -2.1333333333343749e+01 310 712 5.3333333333124999e+00 310 296 -1.0666666666614583e+01 310 948 -5.3333333333124999e+00 310 946 5.3333333333958333e+00 310 300 -5.3333333333333330e+00 310 974 2.1333333333343749e+01 310 641 -5.3333333333124999e+00 310 299 -1.0666666666614583e+01 310 972 2.1333333333343749e+01 310 311 -1.0666666666614583e+01 310 642 -5.3333333333124999e+00 310 634 5.3333333333958333e+00 310 309 -5.3333333333333330e+00 311 311 6.4000000000499995e+01 311 717 -5.3333333333124999e+00 311 718 1.0416666666666666e-10 311 715 -5.3333333333124999e+00 311 313 -1.0666666666677083e+01 311 1066 -2.1333333333291666e+01 311 1065 5.3333333333124999e+00 311 306 -1.0666666666614583e+01 311 1067 -1.0416666666666666e-10 311 1043 5.3333333333124999e+00 311 312 -1.0666666666677083e+01 311 1045 -2.1333333333291666e+01 311 636 -5.3333333333124999e+00 311 297 -1.0666666666614583e+01 311 642 1.0416666666666666e-10 311 972 -2.1333333333291666e+01 311 310 -1.0666666666614583e+01 311 634 -5.3333333333124999e+00 311 309 -1.0666666666677083e+01 312 312 3.2000000000124999e+01 312 1066 -1.0097419586828951e-27 312 1047 -1.4136387421560532e-27 312 306 -5.3333333333333330e+00 312 1065 -5.3333333333333330e+00 312 1044 -1.4136387421560532e-27 312 1049 -1.0666666666677083e+01 312 1045 1.0097419586828951e-27 312 311 -1.0666666666677083e+01 312 297 -5.3333333333333330e+00 312 1067 -1.0666666666677083e+01 312 1043 -5.3333333333333330e+00 312 1677 -1.0666666666677083e+01 313 313 3.2000000000124999e+01 313 972 -1.2116903504194741e-27 313 975 1.0097419586828951e-27 313 310 -5.3333333333333330e+00 313 717 5.3333333333333330e+00 313 1063 1.0097419586828951e-27 313 716 1.0666666666677083e+01 313 304 -1.0666666666677083e+01 313 1066 1.2116903504194741e-27 313 311 -1.0666666666677083e+01 313 306 -5.3333333333333330e+00 313 718 1.0666666666677083e+01 313 715 5.3333333333333330e+00 314 314 3.2012500000000003e+01 314 986 -1.3552527156068805e-19 314 721 1.3552527156068805e-19 314 977 -1.0667708333333334e+01 314 981 5.3333333333333330e+00 314 714 -1.3552527156068805e-19 314 980 1.0667708333333334e+01 314 713 -5.3333333333333330e+00 314 316 -1.0667708333333334e+01 314 315 -5.3333333333333330e+00 314 3212 -1.3552527156068805e-19 314 2671 -1.0667708333333334e+01 314 2665 -5.3333333333333330e+00 315 315 6.4020833333541674e+01 315 726 5.3333333333124999e+00 315 975 -5.3333333333124999e+00 315 977 5.3312499999999998e+00 315 591 -5.3312499999999998e+00 315 721 2.1334374999999998e+01 315 973 -5.3312499999999998e+00 315 717 -5.3364583333645825e+00 315 321 -5.3333333333333330e+00 315 719 2.1333333333343749e+01 315 590 -5.3333333333124999e+00 315 585 5.3364583333645834e+00 315 318 -1.0666666666614583e+01 315 320 -5.3333333333333330e+00 315 716 2.1333333333343749e+01 315 1063 5.3333333333124999e+00 315 715 -5.3333333333958333e+00 315 319 -1.0666666666614583e+01 315 317 -5.3333333333333330e+00 315 714 2.1334374999999998e+01 315 980 -5.3312499999999998e+00 315 713 -5.3395833333333327e+00 315 316 -1.0661458333333334e+01 315 314 -5.3333333333333330e+00 315 2671 -1.0661458333333334e+01 316 316 6.4049999999999997e+01 316 981 -5.3312499999999998e+00 316 985 -1.0416666666666664e-02 316 986 2.1329166666666662e+01 316 585 -5.3312499999999998e+00 316 591 1.0416666666666664e-02 316 731 -2.1329166666666662e+01 316 583 -5.3312499999999998e+00 316 320 -1.0667708333333334e+01 316 980 1.0416666666666664e-02 316 714 -2.1329166666666662e+01 316 713 5.3312499999999998e+00 316 315 -1.0661458333333334e+01 316 314 -1.0667708333333334e+01 316 3390 -5.3312499999999998e+00 316 3211 -5.3312499999999998e+00 316 2665 -1.0661458333333334e+01 316 2673 -1.0667708333333334e+01 316 2670 -1.0661458333333334e+01 317 317 3.2000000000124999e+01 317 719 1.2116903504194741e-27 317 1021 1.4136387421560532e-27 317 716 -1.4136387421560532e-27 317 1063 -1.0666666666677083e+01 317 715 -5.3333333333333330e+00 317 319 -1.0666666666677083e+01 317 315 -5.3333333333333330e+00 317 727 1.2116903504194741e-27 317 726 -1.0666666666677083e+01 317 1020 -5.3333333333333330e+00 317 318 -1.0666666666677083e+01 317 2668 -5.3333333333333330e+00 318 318 6.4000000000499995e+01 318 715 5.3333333333124999e+00 318 729 -1.0416666666666666e-10 318 728 2.1333333333291666e+01 318 583 -5.3333333333124999e+00 318 590 1.0416666666666666e-10 318 719 -2.1333333333291666e+01 318 585 -5.3333333333124999e+00 318 315 -1.0666666666614583e+01 318 320 -1.0666666666677083e+01 318 726 -1.0416666666666666e-10 318 727 2.1333333333291666e+01 318 1020 5.3333333333124999e+00 318 317 -1.0666666666677083e+01 318 3385 -5.3333333333124999e+00 318 3387 -5.3333333333124999e+00 318 2669 -1.0666666666677083e+01 318 2670 -1.0666666666614583e+01 318 2668 -1.0666666666614583e+01 319 319 6.4000000000499995e+01 319 717 5.3333333333124999e+00 319 975 1.0416666666666666e-10 319 970 -5.3333333333124999e+00 319 321 -1.0666666666677083e+01 319 1020 5.3333333333124999e+00 319 979 -2.1333333333291666e+01 319 978 5.3333333333124999e+00 319 1019 1.0416666666666666e-10 319 1021 -2.1333333333291666e+01 319 1018 -5.3333333333124999e+00 319 322 -1.0666666666677083e+01 319 1063 -1.0416666666666666e-10 319 716 -2.1333333333291666e+01 319 715 5.3333333333124999e+00 319 315 -1.0666666666614583e+01 319 317 -1.0666666666677083e+01 319 2666 -1.0666666666614583e+01 319 2668 -1.0666666666614583e+01 320 320 3.2006250000062494e+01 320 714 1.3552527156068805e-19 320 731 -1.3552527156068805e-19 320 591 1.0667708333333334e+01 320 316 -1.0667708333333334e+01 320 728 -1.4136387421560532e-27 320 583 5.3333333333333330e+00 320 719 -1.4136387421560532e-27 320 590 1.0666666666677083e+01 320 585 5.3333333333333330e+00 320 318 -1.0666666666677083e+01 320 315 -5.3333333333333330e+00 320 2670 -5.3333333333333330e+00 321 321 3.2006250000062501e+01 321 716 1.0097419586828951e-27 321 979 -1.0097419586828951e-27 321 975 1.0666666666677083e+01 321 319 -1.0666666666677083e+01 321 970 5.3333333333333330e+00 321 721 -1.3552527156068805e-19 321 973 1.0667708333333334e+01 321 717 -5.3333333333333330e+00 321 315 -5.3333333333333330e+00 321 3215 1.3552527156068805e-19 321 2666 -5.3333333333333330e+00 321 2671 -1.0667708333333334e+01 322 322 3.7345833333395831e+01 322 979 1.2116903504194741e-27 322 1021 -1.2116903504194741e-27 322 1019 1.0666666666677083e+01 322 319 -1.0666666666677083e+01 322 1018 1.3332291666666665e+01 322 1012 -5.3322916666666664e+00 322 1011 6.2500000000000003e-03 322 978 -1.3332291666666665e+01 322 2668 -8.0000000000000000e+00 322 3213 -5.3322916666666664e+00 322 2666 -8.0000000000000000e+00 322 2674 -1.0668750000000001e+01 323 323 3.2000000000124999e+01 323 723 1.0097419586828951e-27 323 726 -1.2116903504194741e-27 323 345 -5.3333333333333330e+00 323 715 5.3333333333333330e+00 323 590 -1.2116903504194741e-27 323 719 1.0666666666677083e+01 323 326 -1.0666666666677083e+01 323 588 1.0097419586828951e-27 323 325 -1.0666666666677083e+01 323 324 -5.3333333333333330e+00 323 720 1.0666666666677083e+01 323 585 -5.3333333333333330e+00 324 324 6.4000000000416662e+01 324 599 -5.3333333333124999e+00 324 598 -5.3333333333124999e+00 324 587 -5.3333333333958333e+00 324 348 -5.3333333333333330e+00 324 592 2.1333333333343749e+01 324 615 -5.3333333333124999e+00 324 337 -1.0666666666614583e+01 324 614 -5.3333333333124999e+00 324 581 -5.3333333333958333e+00 324 338 -5.3333333333333330e+00 324 584 2.1333333333343749e+01 324 730 -5.3333333333124999e+00 324 328 -1.0666666666614583e+01 324 728 5.3333333333124999e+00 324 583 -5.3333333333958333e+00 324 327 -5.3333333333333330e+00 324 590 2.1333333333343749e+01 324 719 -5.3333333333124999e+00 324 326 -1.0666666666614583e+01 324 588 2.1333333333343749e+01 324 325 -1.0666666666614583e+01 324 720 -5.3333333333124999e+00 324 585 -5.3333333333958333e+00 324 323 -5.3333333333333330e+00 325 325 6.4000000000499995e+01 325 587 5.3333333333124999e+00 325 599 1.0416666666666666e-10 325 597 -5.3333333333124999e+00 325 348 -1.0666666666677083e+01 325 725 2.1333333333291666e+01 325 918 5.3333333333124999e+00 325 339 -1.0666666666614583e+01 325 724 -1.0416666666666666e-10 325 1065 5.3333333333124999e+00 325 347 -1.0666666666677083e+01 325 723 2.1333333333291666e+01 325 715 -5.3333333333124999e+00 325 345 -1.0666666666614583e+01 325 720 1.0416666666666666e-10 325 588 -2.1333333333291666e+01 325 324 -1.0666666666614583e+01 325 585 5.3333333333124999e+00 325 323 -1.0666666666677083e+01 326 326 6.4000000000499995e+01 326 715 -5.3333333333124999e+00 326 729 2.1333333333291666e+01 326 330 -1.0666666666614583e+01 326 727 -1.0416666666666666e-10 326 726 2.1333333333291666e+01 326 1020 -5.3333333333124999e+00 326 345 -1.0666666666614583e+01 326 346 -1.0666666666677083e+01 326 728 -1.0416666666666666e-10 326 583 5.3333333333124999e+00 326 327 -1.0666666666677083e+01 326 719 1.0416666666666666e-10 326 590 -2.1333333333291666e+01 326 585 5.3333333333124999e+00 326 324 -1.0666666666614583e+01 326 323 -1.0666666666677083e+01 326 3385 5.3333333333124999e+00 326 3387 5.3333333333124999e+00 327 327 3.2000000000124999e+01 327 729 1.4136387421560532e-27 327 732 -1.2116903504194741e-27 327 330 -5.3333333333333330e+00 327 584 -1.2116903504194741e-27 327 730 1.0666666666677083e+01 327 328 -1.0666666666677083e+01 327 590 1.4136387421560532e-27 327 326 -1.0666666666677083e+01 327 324 -5.3333333333333330e+00 327 728 -1.0666666666677083e+01 327 583 -5.3333333333333330e+00 327 3387 -5.3333333333333330e+00 328 328 6.4000000000499995e+01 328 581 5.3333333333124999e+00 328 614 1.0416666666666666e-10 328 734 2.1333333333291666e+01 328 335 -1.0666666666614583e+01 328 338 -1.0666666666677083e+01 328 733 -1.0416666666666666e-10 328 732 2.1333333333291666e+01 328 330 -1.0666666666614583e+01 328 333 -1.0666666666677083e+01 328 730 1.0416666666666666e-10 328 584 -2.1333333333291666e+01 328 583 5.3333333333124999e+00 328 324 -1.0666666666614583e+01 328 327 -1.0666666666677083e+01 328 3387 5.3333333333124999e+00 328 2165 5.3333333333124999e+00 329 329 3.2000000000124999e+01 329 788 1.2116903504194741e-27 329 789 -1.4136387421560532e-27 329 342 -5.3333333333333330e+00 329 782 -1.4136387421560532e-27 329 783 1.0666666666677083e+01 329 332 -1.0666666666677083e+01 329 781 1.2116903504194741e-27 329 331 -1.0666666666677083e+01 329 330 -5.3333333333333330e+00 329 784 1.0666666666677083e+01 329 2046 -5.3333333333333330e+00 329 2159 -5.3333333333333330e+00 330 330 6.4000000000416662e+01 330 785 5.3333333333124999e+00 330 727 5.3333333333124999e+00 330 346 -5.3333333333333330e+00 330 729 -2.1333333333343749e+01 330 728 5.3333333333124999e+00 330 326 -1.0666666666614583e+01 330 730 -5.3333333333124999e+00 330 327 -5.3333333333333330e+00 330 732 -2.1333333333343749e+01 330 733 5.3333333333124999e+00 330 328 -1.0666666666614583e+01 330 791 5.3333333333124999e+00 330 333 -5.3333333333333330e+00 330 782 2.1333333333343749e+01 330 783 -5.3333333333124999e+00 330 332 -1.0666666666614583e+01 330 781 2.1333333333343749e+01 330 331 -1.0666666666614583e+01 330 784 -5.3333333333124999e+00 330 329 -5.3333333333333330e+00 330 3385 -5.3333333333958333e+00 330 3387 -5.3333333333958333e+00 330 2165 -5.3333333333958333e+00 330 2159 -5.3333333333958333e+00 331 331 6.4000000000499995e+01 331 788 2.1333333333291666e+01 331 342 -1.0666666666614583e+01 331 785 -1.0416666666666666e-10 331 1020 -5.3333333333124999e+00 331 346 -1.0666666666677083e+01 331 787 -1.0416666666666666e-10 331 786 2.1333333333291666e+01 331 1064 5.3333333333124999e+00 331 345 -1.0666666666614583e+01 331 344 -1.0666666666677083e+01 331 784 1.0416666666666666e-10 331 781 -2.1333333333291666e+01 331 330 -1.0666666666614583e+01 331 329 -1.0666666666677083e+01 331 2047 5.3333333333124999e+00 331 2046 5.3333333333124999e+00 331 3385 5.3333333333124999e+00 331 2159 5.3333333333124999e+00 332 332 6.4000000000499995e+01 332 792 2.1333333333291666e+01 332 335 -1.0666666666614583e+01 332 790 -1.0416666666666666e-10 332 789 2.1333333333291666e+01 332 342 -1.0666666666614583e+01 332 343 -1.0666666666677083e+01 332 791 -1.0416666666666666e-10 332 333 -1.0666666666677083e+01 332 783 1.0416666666666666e-10 332 782 -2.1333333333291666e+01 332 330 -1.0666666666614583e+01 332 329 -1.0666666666677083e+01 332 2046 5.3333333333124999e+00 332 1703 5.3333333333124999e+00 332 2165 5.3333333333124999e+00 332 2159 5.3333333333124999e+00 333 333 3.2000000000124999e+01 333 792 1.0097419586828951e-27 333 734 -1.4136387421560532e-27 333 335 -5.3333333333333330e+00 333 732 1.4136387421560532e-27 333 733 -1.0666666666677083e+01 333 328 -1.0666666666677083e+01 333 782 1.0097419586828951e-27 333 332 -1.0666666666677083e+01 333 330 -5.3333333333333330e+00 333 791 -1.0666666666677083e+01 333 2165 -5.3333333333333330e+00 334 334 3.2000000000124999e+01 334 911 1.4136387421560532e-27 334 914 -1.0097419586828951e-27 334 339 -5.3333333333333330e+00 334 906 5.3333333333333330e+00 334 905 -1.0097419586828951e-27 334 908 1.0666666666677083e+01 334 337 -1.0666666666677083e+01 334 903 1.4136387421560532e-27 334 336 -1.0666666666677083e+01 334 335 -5.3333333333333330e+00 334 909 1.0666666666677083e+01 335 335 6.4000000000416662e+01 335 910 5.3333333333124999e+00 335 790 5.3333333333124999e+00 335 343 -5.3333333333333330e+00 335 792 -2.1333333333343749e+01 335 791 5.3333333333124999e+00 335 332 -1.0666666666614583e+01 335 733 5.3333333333124999e+00 335 333 -5.3333333333333330e+00 335 734 -2.1333333333343749e+01 335 614 -5.3333333333124999e+00 335 328 -1.0666666666614583e+01 335 615 -5.3333333333124999e+00 335 338 -5.3333333333333330e+00 335 905 2.1333333333343749e+01 335 908 -5.3333333333124999e+00 335 337 -1.0666666666614583e+01 335 903 2.1333333333343749e+01 335 336 -1.0666666666614583e+01 335 909 -5.3333333333124999e+00 335 334 -5.3333333333333330e+00 336 336 6.4000000000499995e+01 336 910 -1.0416666666666666e-10 336 343 -1.0666666666677083e+01 336 913 2.1333333333291666e+01 336 342 -1.0666666666614583e+01 336 912 -1.0416666666666666e-10 336 916 5.3333333333124999e+00 336 340 -1.0666666666677083e+01 336 911 2.1333333333291666e+01 336 906 -5.3333333333124999e+00 336 339 -1.0666666666614583e+01 336 909 1.0416666666666666e-10 336 903 -2.1333333333291666e+01 336 335 -1.0666666666614583e+01 336 334 -1.0666666666677083e+01 336 1703 5.3333333333124999e+00 336 2044 5.3333333333124999e+00 337 337 6.4000000000499995e+01 337 587 5.3333333333124999e+00 337 592 -2.1333333333291666e+01 337 581 5.3333333333124999e+00 337 324 -1.0666666666614583e+01 337 598 1.0416666666666666e-10 337 597 -5.3333333333124999e+00 337 348 -1.0666666666677083e+01 337 914 2.1333333333291666e+01 337 339 -1.0666666666614583e+01 337 906 -5.3333333333124999e+00 337 615 1.0416666666666666e-10 337 338 -1.0666666666677083e+01 337 908 1.0416666666666666e-10 337 905 -2.1333333333291666e+01 337 335 -1.0666666666614583e+01 337 334 -1.0666666666677083e+01 338 338 3.2000000000124999e+01 338 592 -1.2116903504194741e-27 338 584 1.0097419586828951e-27 338 324 -5.3333333333333330e+00 338 581 -5.3333333333333330e+00 338 734 1.0097419586828951e-27 338 614 1.0666666666677083e+01 338 328 -1.0666666666677083e+01 338 905 1.2116903504194741e-27 338 337 -1.0666666666677083e+01 338 335 -5.3333333333333330e+00 338 615 1.0666666666677083e+01 339 339 6.4000000000416662e+01 339 598 -5.3333333333124999e+00 339 599 -5.3333333333124999e+00 339 597 5.3333333333958333e+00 339 348 -5.3333333333333330e+00 339 725 -2.1333333333343749e+01 339 724 5.3333333333124999e+00 339 325 -1.0666666666614583e+01 339 929 5.3333333333124999e+00 339 918 -5.3333333333958333e+00 339 347 -5.3333333333333330e+00 339 917 2.1333333333343749e+01 339 921 -5.3333333333124999e+00 339 341 -1.0666666666614583e+01 339 912 5.3333333333124999e+00 339 916 -5.3333333333958333e+00 339 340 -5.3333333333333330e+00 339 911 -2.1333333333343749e+01 339 909 -5.3333333333124999e+00 339 336 -1.0666666666614583e+01 339 914 -2.1333333333343749e+01 339 337 -1.0666666666614583e+01 339 908 -5.3333333333124999e+00 339 906 5.3333333333958333e+00 339 334 -5.3333333333333330e+00 340 340 3.2000000000124999e+01 340 913 1.2116903504194741e-27 340 930 -1.4136387421560532e-27 340 342 -5.3333333333333330e+00 340 917 -1.4136387421560532e-27 340 921 1.0666666666677083e+01 340 341 -1.0666666666677083e+01 340 911 -1.2116903504194741e-27 340 336 -1.0666666666677083e+01 340 339 -5.3333333333333330e+00 340 912 -1.0666666666677083e+01 340 916 -5.3333333333333330e+00 340 2044 -5.3333333333333330e+00 341 341 6.4000000000499995e+01 341 918 5.3333333333124999e+00 341 929 -1.0416666666666666e-10 341 1065 5.3333333333124999e+00 341 347 -1.0666666666677083e+01 341 931 -1.0416666666666666e-10 341 928 2.1333333333291666e+01 341 345 -1.0666666666614583e+01 341 1064 5.3333333333124999e+00 341 344 -1.0666666666677083e+01 341 930 2.1333333333291666e+01 341 342 -1.0666666666614583e+01 341 921 1.0416666666666666e-10 341 917 -2.1333333333291666e+01 341 916 5.3333333333124999e+00 341 339 -1.0666666666614583e+01 341 340 -1.0666666666677083e+01 341 2047 5.3333333333124999e+00 341 2044 5.3333333333124999e+00 342 342 6.4000000000416662e+01 342 931 5.3333333333124999e+00 342 787 5.3333333333124999e+00 342 344 -5.3333333333333330e+00 342 788 -2.1333333333343749e+01 342 784 -5.3333333333124999e+00 342 331 -1.0666666666614583e+01 342 783 -5.3333333333124999e+00 342 329 -5.3333333333333330e+00 342 789 -2.1333333333343749e+01 342 790 5.3333333333124999e+00 342 332 -1.0666666666614583e+01 342 910 5.3333333333124999e+00 342 343 -5.3333333333333330e+00 342 913 -2.1333333333343749e+01 342 912 5.3333333333124999e+00 342 336 -1.0666666666614583e+01 342 930 -2.1333333333343749e+01 342 341 -1.0666666666614583e+01 342 921 -5.3333333333124999e+00 342 340 -5.3333333333333330e+00 342 2047 -5.3333333333958333e+00 342 2046 -5.3333333333958333e+00 342 1703 -5.3333333333958333e+00 342 2044 -5.3333333333958333e+00 343 343 3.2000000000124999e+01 343 903 -1.0097419586828951e-27 343 792 -1.2116903504194741e-27 343 335 -5.3333333333333330e+00 343 789 1.2116903504194741e-27 343 790 -1.0666666666677083e+01 343 332 -1.0666666666677083e+01 343 913 -1.0097419586828951e-27 343 336 -1.0666666666677083e+01 343 342 -5.3333333333333330e+00 343 910 -1.0666666666677083e+01 343 1703 -5.3333333333333330e+00 344 344 3.2000000000124999e+01 344 930 1.2116903504194741e-27 344 788 -1.0097419586828951e-27 344 342 -5.3333333333333330e+00 344 786 1.0097419586828951e-27 344 787 -1.0666666666677083e+01 344 331 -1.0666666666677083e+01 344 928 -1.2116903504194741e-27 344 341 -1.0666666666677083e+01 344 345 -5.3333333333333330e+00 344 931 -1.0666666666677083e+01 344 1064 -5.3333333333333330e+00 344 2047 -5.3333333333333330e+00 345 345 6.4000000000416662e+01 345 929 5.3333333333124999e+00 345 724 5.3333333333124999e+00 345 1065 -5.3333333333958333e+00 345 347 -5.3333333333333330e+00 345 723 -2.1333333333343749e+01 345 720 -5.3333333333124999e+00 345 325 -1.0666666666614583e+01 345 719 -5.3333333333124999e+00 345 715 5.3333333333958333e+00 345 323 -5.3333333333333330e+00 345 726 -2.1333333333343749e+01 345 727 5.3333333333124999e+00 345 326 -1.0666666666614583e+01 345 785 5.3333333333124999e+00 345 1020 5.3333333333958333e+00 345 346 -5.3333333333333330e+00 345 786 -2.1333333333343749e+01 345 787 5.3333333333124999e+00 345 331 -1.0666666666614583e+01 345 928 -2.1333333333343749e+01 345 341 -1.0666666666614583e+01 345 931 5.3333333333124999e+00 345 1064 -5.3333333333958333e+00 345 344 -5.3333333333333330e+00 346 346 3.2000000000124999e+01 346 781 -1.4136387421560532e-27 346 729 -1.0097419586828951e-27 346 330 -5.3333333333333330e+00 346 726 1.0097419586828951e-27 346 727 -1.0666666666677083e+01 346 326 -1.0666666666677083e+01 346 786 -1.4136387421560532e-27 346 331 -1.0666666666677083e+01 346 345 -5.3333333333333330e+00 346 785 -1.0666666666677083e+01 346 1020 5.3333333333333330e+00 346 3385 -5.3333333333333330e+00 347 347 3.2000000000124999e+01 347 725 1.4136387421560532e-27 347 917 1.0097419586828951e-27 347 339 -5.3333333333333330e+00 347 918 -5.3333333333333330e+00 347 928 1.0097419586828951e-27 347 929 -1.0666666666677083e+01 347 341 -1.0666666666677083e+01 347 723 -1.4136387421560532e-27 347 325 -1.0666666666677083e+01 347 345 -5.3333333333333330e+00 347 724 -1.0666666666677083e+01 347 1065 -5.3333333333333330e+00 348 348 3.2000000000124999e+01 348 588 -1.2116903504194741e-27 348 592 1.4136387421560532e-27 348 324 -5.3333333333333330e+00 348 587 -5.3333333333333330e+00 348 914 1.4136387421560532e-27 348 598 1.0666666666677083e+01 348 337 -1.0666666666677083e+01 348 725 -1.2116903504194741e-27 348 325 -1.0666666666677083e+01 348 339 -5.3333333333333330e+00 348 599 1.0666666666677083e+01 348 597 5.3333333333333330e+00 349 349 3.2012500000000003e+01 349 743 1.3552527156068805e-19 349 833 1.3552527156068805e-19 349 736 -1.3552527156068805e-19 349 838 -1.0667708333333334e+01 349 735 -5.3333333333333330e+00 349 353 -1.0667708333333334e+01 349 352 -5.3333333333333330e+00 349 832 -1.3552527156068805e-19 349 839 1.0667708333333334e+01 349 831 -5.3333333333333330e+00 349 351 -1.0667708333333334e+01 350 350 3.2020833333333336e+01 351 351 6.4049999999999997e+01 351 735 5.3312499999999998e+00 351 811 5.3312499999999998e+00 351 857 -1.0416666666666664e-02 351 743 -2.1329166666666662e+01 351 739 5.3312499999999998e+00 351 352 -1.0661458333333334e+01 351 364 -1.0667708333333334e+01 351 529 1.0416666666666664e-02 351 812 -2.1329166666666662e+01 351 839 1.0416666666666664e-02 351 832 -2.1329166666666662e+01 351 831 5.3312499999999998e+00 351 349 -1.0667708333333334e+01 352 352 6.4020833333541674e+01 352 748 5.3333333333124999e+00 352 810 5.3333333333124999e+00 352 839 -5.3312499999999998e+00 352 630 -5.3312499999999998e+00 352 743 2.1334374999999998e+01 352 857 5.3312499999999998e+00 352 739 -5.3364583333645825e+00 352 351 -1.0661458333333334e+01 352 364 -5.3333333333333330e+00 352 741 2.1333333333343749e+01 352 629 -5.3333333333124999e+00 352 624 5.3364583333645834e+00 352 357 -1.0666666666614583e+01 352 358 -5.3333333333333330e+00 352 738 2.1333333333343749e+01 352 808 5.3333333333124999e+00 352 737 -5.3333333333958333e+00 352 355 -1.0666666666614583e+01 352 354 -5.3333333333333330e+00 352 736 2.1334374999999998e+01 352 838 5.3312499999999998e+00 352 735 -5.3395833333333327e+00 352 353 -1.0661458333333334e+01 352 349 -5.3333333333333330e+00 353 353 6.4049999999999997e+01 353 624 -5.3312499999999998e+00 353 630 1.0416666666666664e-02 353 622 -5.3312499999999998e+00 353 358 -1.0667708333333334e+01 353 831 5.3312499999999998e+00 353 754 -2.1329166666666662e+01 353 830 1.0416666666666664e-02 353 833 -2.1329166666666662e+01 353 838 -1.0416666666666664e-02 353 736 -2.1329166666666662e+01 353 735 5.3312499999999998e+00 353 352 -1.0661458333333334e+01 353 349 -1.0667708333333334e+01 354 354 3.2000000000124999e+01 354 802 1.4136387421560532e-27 354 741 1.2116903504194741e-27 354 749 1.2116903504194741e-27 354 748 -1.0666666666677083e+01 354 799 -5.3333333333333330e+00 354 357 -1.0666666666677083e+01 354 738 -1.4136387421560532e-27 354 808 -1.0666666666677083e+01 354 737 -5.3333333333333330e+00 354 355 -1.0666666666677083e+01 354 352 -5.3333333333333330e+00 355 355 6.4000000000499995e+01 355 799 5.3333333333124999e+00 355 739 5.3333333333124999e+00 355 810 -1.0416666666666666e-10 355 811 5.3333333333124999e+00 355 364 -1.0666666666677083e+01 355 809 2.1333333333291666e+01 355 798 1.0416666666666666e-10 355 802 -2.1333333333291666e+01 355 808 -1.0416666666666666e-10 355 738 -2.1333333333291666e+01 355 737 5.3333333333124999e+00 355 352 -1.0666666666614583e+01 355 354 -1.0666666666677083e+01 356 356 3.2000000000208331e+01 357 357 6.4000000000499995e+01 357 751 -1.0416666666666666e-10 357 737 5.3333333333124999e+00 357 750 2.1333333333291666e+01 357 622 -5.3333333333124999e+00 357 629 1.0416666666666666e-10 357 741 -2.1333333333291666e+01 357 624 -5.3333333333124999e+00 357 352 -1.0666666666614583e+01 357 358 -1.0666666666677083e+01 357 748 -1.0416666666666666e-10 357 749 2.1333333333291666e+01 357 799 5.3333333333124999e+00 357 354 -1.0666666666677083e+01 358 358 3.2006250000062494e+01 358 736 1.3552527156068805e-19 358 754 -1.3552527156068805e-19 358 630 1.0667708333333334e+01 358 353 -1.0667708333333334e+01 358 750 -1.4136387421560532e-27 358 622 5.3333333333333330e+00 358 741 -1.4136387421560532e-27 358 629 1.0666666666677083e+01 358 624 5.3333333333333330e+00 358 357 -1.0666666666677083e+01 358 352 -5.3333333333333330e+00 359 359 3.2010416666770830e+01 360 360 1.6000000000062499e+01 361 361 3.2010416666770830e+01 362 362 1.6006250000000001e+01 363 363 1.6006250000000001e+01 364 364 3.2006250000062501e+01 364 738 1.0097419586828951e-27 364 809 1.0097419586828951e-27 364 810 -1.0666666666677083e+01 364 355 -1.0666666666677083e+01 364 812 1.3552527156068805e-19 364 811 -5.3333333333333330e+00 364 743 -1.3552527156068805e-19 364 857 -1.0667708333333334e+01 364 739 -5.3333333333333330e+00 364 351 -1.0667708333333334e+01 364 352 -5.3333333333333330e+00 365 365 1.6000000000062499e+01 366 366 3.2000000000124999e+01 366 747 1.0097419586828951e-27 366 748 -1.2116903504194741e-27 366 386 -5.3333333333333330e+00 366 737 5.3333333333333330e+00 366 629 -1.2116903504194741e-27 366 741 1.0666666666677083e+01 366 369 -1.0666666666677083e+01 366 627 1.0097419586828951e-27 366 368 -1.0666666666677083e+01 366 367 -5.3333333333333330e+00 366 742 1.0666666666677083e+01 366 624 -5.3333333333333330e+00 367 367 6.4000000000416662e+01 367 638 -5.3333333333124999e+00 367 637 -5.3333333333124999e+00 367 626 -5.3333333333958333e+00 367 385 -5.3333333333333330e+00 367 631 2.1333333333343749e+01 367 652 -5.3333333333124999e+00 367 375 -1.0666666666614583e+01 367 651 -5.3333333333124999e+00 367 621 -5.3333333333958333e+00 367 376 -5.3333333333333330e+00 367 623 2.1333333333343749e+01 367 752 -5.3333333333124999e+00 367 371 -1.0666666666614583e+01 367 750 5.3333333333124999e+00 367 622 -5.3333333333958333e+00 367 370 -5.3333333333333330e+00 367 629 2.1333333333343749e+01 367 741 -5.3333333333124999e+00 367 369 -1.0666666666614583e+01 367 627 2.1333333333343749e+01 367 368 -1.0666666666614583e+01 367 742 -5.3333333333124999e+00 367 624 -5.3333333333958333e+00 367 366 -5.3333333333333330e+00 368 368 6.4000000000499995e+01 368 1068 -5.3333333333124999e+00 368 747 2.1333333333291666e+01 368 737 -5.3333333333124999e+00 368 386 -1.0666666666614583e+01 368 626 5.3333333333124999e+00 368 638 1.0416666666666666e-10 368 636 -5.3333333333124999e+00 368 385 -1.0666666666677083e+01 368 746 -1.0416666666666666e-10 368 745 2.1333333333291666e+01 368 1043 5.3333333333124999e+00 368 377 -1.0666666666614583e+01 368 384 -1.0666666666677083e+01 368 742 1.0416666666666666e-10 368 627 -2.1333333333291666e+01 368 367 -1.0666666666614583e+01 368 624 5.3333333333124999e+00 368 366 -1.0666666666677083e+01 369 369 6.4000000000499995e+01 369 751 2.1333333333291666e+01 369 388 -1.0666666666614583e+01 369 749 -1.0416666666666666e-10 369 799 -5.3333333333124999e+00 369 391 -1.0666666666677083e+01 369 748 2.1333333333291666e+01 369 386 -1.0666666666614583e+01 369 737 -5.3333333333124999e+00 369 750 -1.0416666666666666e-10 369 622 5.3333333333124999e+00 369 370 -1.0666666666677083e+01 369 741 1.0416666666666666e-10 369 629 -2.1333333333291666e+01 369 624 5.3333333333124999e+00 369 367 -1.0666666666614583e+01 369 366 -1.0666666666677083e+01 370 370 3.2000000000124999e+01 370 751 1.4136387421560532e-27 370 757 -1.2116903504194741e-27 370 388 -5.3333333333333330e+00 370 623 -1.2116903504194741e-27 370 752 1.0666666666677083e+01 370 371 -1.0666666666677083e+01 370 629 1.4136387421560532e-27 370 369 -1.0666666666677083e+01 370 367 -5.3333333333333330e+00 370 750 -1.0666666666677083e+01 370 622 -5.3333333333333330e+00 371 371 6.4000000000499995e+01 371 757 2.1333333333291666e+01 371 388 -1.0666666666614583e+01 371 621 5.3333333333124999e+00 371 758 -1.0416666666666666e-10 371 383 -1.0666666666677083e+01 371 651 1.0416666666666666e-10 371 756 2.1333333333291666e+01 371 650 -5.3333333333124999e+00 371 373 -1.0666666666614583e+01 371 376 -1.0666666666677083e+01 371 752 1.0416666666666666e-10 371 623 -2.1333333333291666e+01 371 622 5.3333333333124999e+00 371 367 -1.0666666666614583e+01 371 370 -1.0666666666677083e+01 371 2196 5.3333333333124999e+00 372 372 3.2000000000124999e+01 372 1036 1.4136387421560532e-27 372 1039 -1.0097419586828951e-27 372 377 -5.3333333333333330e+00 372 1028 5.3333333333333330e+00 372 1026 -1.0097419586828951e-27 372 1030 1.0666666666677083e+01 372 375 -1.0666666666677083e+01 372 1024 1.4136387421560532e-27 372 374 -1.0666666666677083e+01 372 373 -5.3333333333333330e+00 372 1031 1.0666666666677083e+01 372 1025 -5.3333333333333330e+00 373 373 6.4000000000416662e+01 373 1035 5.3333333333124999e+00 373 1055 -5.3333333333124999e+00 373 381 -5.3333333333333330e+00 373 1027 2.1333333333343749e+01 373 1056 5.3333333333124999e+00 373 382 -1.0666666666614583e+01 373 758 5.3333333333124999e+00 373 383 -5.3333333333333330e+00 373 756 -2.1333333333343749e+01 373 651 -5.3333333333124999e+00 373 371 -1.0666666666614583e+01 373 652 -5.3333333333124999e+00 373 650 5.3333333333958333e+00 373 376 -5.3333333333333330e+00 373 1026 2.1333333333343749e+01 373 1030 -5.3333333333124999e+00 373 375 -1.0666666666614583e+01 373 1024 2.1333333333343749e+01 373 374 -1.0666666666614583e+01 373 1031 -5.3333333333124999e+00 373 1025 -5.3333333333958333e+00 373 372 -5.3333333333333330e+00 373 1915 -5.3333333333958333e+00 373 2196 -5.3333333333958333e+00 374 374 6.4000000000499995e+01 374 1035 -1.0416666666666666e-10 374 381 -1.0666666666677083e+01 374 1038 2.1333333333291666e+01 374 380 -1.0666666666614583e+01 374 1037 -1.0416666666666666e-10 374 1041 5.3333333333124999e+00 374 378 -1.0666666666677083e+01 374 1036 2.1333333333291666e+01 374 1028 -5.3333333333124999e+00 374 377 -1.0666666666614583e+01 374 1031 1.0416666666666666e-10 374 1024 -2.1333333333291666e+01 374 373 -1.0666666666614583e+01 374 1025 5.3333333333124999e+00 374 372 -1.0666666666677083e+01 374 1915 5.3333333333124999e+00 374 1916 5.3333333333124999e+00 374 2264 5.3333333333124999e+00 375 375 6.4000000000499995e+01 375 626 5.3333333333124999e+00 375 631 -2.1333333333291666e+01 375 621 5.3333333333124999e+00 375 367 -1.0666666666614583e+01 375 637 1.0416666666666666e-10 375 636 -5.3333333333124999e+00 375 385 -1.0666666666677083e+01 375 1039 2.1333333333291666e+01 375 377 -1.0666666666614583e+01 375 1028 -5.3333333333124999e+00 375 652 1.0416666666666666e-10 375 650 -5.3333333333124999e+00 375 376 -1.0666666666677083e+01 375 1030 1.0416666666666666e-10 375 1026 -2.1333333333291666e+01 375 1025 5.3333333333124999e+00 375 373 -1.0666666666614583e+01 375 372 -1.0666666666677083e+01 376 376 3.2000000000124999e+01 376 631 -1.2116903504194741e-27 376 623 1.0097419586828951e-27 376 367 -5.3333333333333330e+00 376 621 -5.3333333333333330e+00 376 756 1.0097419586828951e-27 376 651 1.0666666666677083e+01 376 371 -1.0666666666677083e+01 376 1026 1.2116903504194741e-27 376 375 -1.0666666666677083e+01 376 373 -5.3333333333333330e+00 376 652 1.0666666666677083e+01 376 650 5.3333333333333330e+00 377 377 6.4000000000416662e+01 377 637 -5.3333333333124999e+00 377 638 -5.3333333333124999e+00 377 636 5.3333333333958333e+00 377 385 -5.3333333333333330e+00 377 745 -2.1333333333343749e+01 377 746 5.3333333333124999e+00 377 368 -1.0666666666614583e+01 377 1051 5.3333333333124999e+00 377 1043 -5.3333333333958333e+00 377 384 -5.3333333333333330e+00 377 1042 2.1333333333343749e+01 377 1046 -5.3333333333124999e+00 377 379 -1.0666666666614583e+01 377 1037 5.3333333333124999e+00 377 1041 -5.3333333333958333e+00 377 378 -5.3333333333333330e+00 377 1036 -2.1333333333343749e+01 377 1031 -5.3333333333124999e+00 377 374 -1.0666666666614583e+01 377 1039 -2.1333333333343749e+01 377 375 -1.0666666666614583e+01 377 1030 -5.3333333333124999e+00 377 1028 5.3333333333958333e+00 377 372 -5.3333333333333330e+00 378 378 3.2000000000124999e+01 378 1038 1.2116903504194741e-27 378 1052 -1.4136387421560532e-27 378 380 -5.3333333333333330e+00 378 1042 -1.4136387421560532e-27 378 1046 1.0666666666677083e+01 378 379 -1.0666666666677083e+01 378 1036 -1.2116903504194741e-27 378 374 -1.0666666666677083e+01 378 377 -5.3333333333333330e+00 378 1037 -1.0666666666677083e+01 378 1041 -5.3333333333333330e+00 378 2264 -5.3333333333333330e+00 379 379 6.4000000000499995e+01 379 1033 -5.3333333333124999e+00 379 1032 1.0416666666666666e-10 379 390 -1.0666666666677083e+01 379 1050 2.1333333333291666e+01 379 1068 -5.3333333333124999e+00 379 386 -1.0666666666614583e+01 379 1051 -1.0416666666666666e-10 379 1043 5.3333333333124999e+00 379 384 -1.0666666666677083e+01 379 1052 2.1333333333291666e+01 379 380 -1.0666666666614583e+01 379 1046 1.0416666666666666e-10 379 1042 -2.1333333333291666e+01 379 1041 5.3333333333124999e+00 379 377 -1.0666666666614583e+01 379 378 -1.0666666666677083e+01 379 2263 5.3333333333124999e+00 379 2264 5.3333333333124999e+00 380 380 6.4000000000416662e+01 380 1032 -5.3333333333124999e+00 380 1034 -5.3333333333124999e+00 380 390 -5.3333333333333330e+00 380 1054 2.1333333333343749e+01 380 1074 -5.3333333333124999e+00 380 389 -1.0666666666614583e+01 380 1058 5.3333333333124999e+00 380 387 -5.3333333333333330e+00 380 1053 2.1333333333343749e+01 380 1055 -5.3333333333124999e+00 380 382 -1.0666666666614583e+01 380 1035 5.3333333333124999e+00 380 381 -5.3333333333333330e+00 380 1038 -2.1333333333343749e+01 380 1037 5.3333333333124999e+00 380 374 -1.0666666666614583e+01 380 1052 -2.1333333333343749e+01 380 379 -1.0666666666614583e+01 380 1046 -5.3333333333124999e+00 380 378 -5.3333333333333330e+00 380 2263 -5.3333333333958333e+00 380 2265 -5.3333333333958333e+00 380 1916 -5.3333333333958333e+00 380 2264 -5.3333333333958333e+00 381 381 3.2000000000124999e+01 381 1024 -1.0097419586828951e-27 381 1027 1.2116903504194741e-27 381 373 -5.3333333333333330e+00 381 1053 -1.2116903504194741e-27 381 1055 1.0666666666677083e+01 381 382 -1.0666666666677083e+01 381 1038 -1.0097419586828951e-27 381 374 -1.0666666666677083e+01 381 380 -5.3333333333333330e+00 381 1035 -1.0666666666677083e+01 381 1915 -5.3333333333333330e+00 381 1916 -5.3333333333333330e+00 382 382 6.4000000000499995e+01 382 1058 -1.0416666666666666e-10 382 1057 2.1333333333291666e+01 382 388 -1.0666666666614583e+01 382 387 -1.0666666666677083e+01 382 1056 -1.0416666666666666e-10 382 1027 -2.1333333333291666e+01 382 373 -1.0666666666614583e+01 382 383 -1.0666666666677083e+01 382 1055 1.0416666666666666e-10 382 1053 -2.1333333333291666e+01 382 380 -1.0666666666614583e+01 382 381 -1.0666666666677083e+01 382 2265 5.3333333333124999e+00 382 1915 5.3333333333124999e+00 382 2196 5.3333333333124999e+00 382 1916 5.3333333333124999e+00 383 383 3.2000000000124999e+01 383 757 1.4136387421560532e-27 383 1057 -1.0097419586828951e-27 383 388 -5.3333333333333330e+00 383 1027 -1.0097419586828951e-27 383 1056 -1.0666666666677083e+01 383 382 -1.0666666666677083e+01 383 756 -1.4136387421560532e-27 383 371 -1.0666666666677083e+01 383 373 -5.3333333333333330e+00 383 758 -1.0666666666677083e+01 383 2196 -5.3333333333333330e+00 384 384 3.2000000000124999e+01 384 1050 1.0097419586828951e-27 384 747 -1.4136387421560532e-27 384 386 -5.3333333333333330e+00 384 1068 5.3333333333333330e+00 384 745 1.4136387421560532e-27 384 746 -1.0666666666677083e+01 384 368 -1.0666666666677083e+01 384 1042 1.0097419586828951e-27 384 379 -1.0666666666677083e+01 384 377 -5.3333333333333330e+00 384 1051 -1.0666666666677083e+01 384 1043 -5.3333333333333330e+00 385 385 3.2000000000124999e+01 385 627 -1.2116903504194741e-27 385 631 1.4136387421560532e-27 385 367 -5.3333333333333330e+00 385 626 -5.3333333333333330e+00 385 1039 1.4136387421560532e-27 385 637 1.0666666666677083e+01 385 375 -1.0666666666677083e+01 385 745 -1.2116903504194741e-27 385 368 -1.0666666666677083e+01 385 377 -5.3333333333333330e+00 385 638 1.0666666666677083e+01 385 636 5.3333333333333330e+00 386 386 6.4000000000416662e+01 386 749 5.3333333333124999e+00 386 801 -5.3333333333124999e+00 386 799 5.3333333333958333e+00 386 391 -5.3333333333333330e+00 386 1071 2.1333333333343749e+01 386 1034 -5.3333333333124999e+00 386 389 -1.0666666666614583e+01 386 1032 -5.3333333333124999e+00 386 1033 5.3333333333958333e+00 386 390 -5.3333333333333330e+00 386 1050 -2.1333333333343749e+01 386 1051 5.3333333333124999e+00 386 379 -1.0666666666614583e+01 386 746 5.3333333333124999e+00 386 1068 5.3333333333958333e+00 386 384 -5.3333333333333330e+00 386 747 -2.1333333333343749e+01 386 742 -5.3333333333124999e+00 386 368 -1.0666666666614583e+01 386 748 -2.1333333333343749e+01 386 369 -1.0666666666614583e+01 386 741 -5.3333333333124999e+00 386 737 5.3333333333958333e+00 386 366 -5.3333333333333330e+00 387 387 3.2000000000124999e+01 387 1054 -1.2116903504194741e-27 387 1053 1.4136387421560532e-27 387 380 -5.3333333333333330e+00 387 1057 1.4136387421560532e-27 387 1058 -1.0666666666677083e+01 387 382 -1.0666666666677083e+01 387 1072 1.2116903504194741e-27 387 389 -1.0666666666677083e+01 387 388 -5.3333333333333330e+00 387 1074 1.0666666666677083e+01 387 2265 -5.3333333333333330e+00 388 388 6.4000000000416662e+01 388 801 -5.3333333333124999e+00 388 749 5.3333333333124999e+00 388 391 -5.3333333333333330e+00 388 751 -2.1333333333343749e+01 388 750 5.3333333333124999e+00 388 369 -1.0666666666614583e+01 388 752 -5.3333333333124999e+00 388 370 -5.3333333333333330e+00 388 757 -2.1333333333343749e+01 388 758 5.3333333333124999e+00 388 371 -1.0666666666614583e+01 388 1056 5.3333333333124999e+00 388 383 -5.3333333333333330e+00 388 1057 -2.1333333333343749e+01 388 1058 5.3333333333124999e+00 388 382 -1.0666666666614583e+01 388 1072 2.1333333333343749e+01 388 389 -1.0666666666614583e+01 388 1074 -5.3333333333124999e+00 388 387 -5.3333333333333330e+00 389 389 6.4000000000499995e+01 389 801 1.0416666666666666e-10 389 799 -5.3333333333124999e+00 389 391 -1.0666666666677083e+01 389 1071 -2.1333333333291666e+01 389 1033 -5.3333333333124999e+00 389 386 -1.0666666666614583e+01 389 1034 1.0416666666666666e-10 389 390 -1.0666666666677083e+01 389 1054 -2.1333333333291666e+01 389 380 -1.0666666666614583e+01 389 1074 1.0416666666666666e-10 389 1072 -2.1333333333291666e+01 389 388 -1.0666666666614583e+01 389 387 -1.0666666666677083e+01 389 2263 5.3333333333124999e+00 389 2265 5.3333333333124999e+00 390 390 3.2000000000124999e+01 390 1071 -1.0097419586828951e-27 390 1050 -1.2116903504194741e-27 390 386 -5.3333333333333330e+00 390 1033 5.3333333333333330e+00 390 1052 1.2116903504194741e-27 390 1032 1.0666666666677083e+01 390 379 -1.0666666666677083e+01 390 1054 1.0097419586828951e-27 390 389 -1.0666666666677083e+01 390 380 -5.3333333333333330e+00 390 1034 1.0666666666677083e+01 390 2263 -5.3333333333333330e+00 391 391 3.2000000000124999e+01 391 1072 -1.4136387421560532e-27 391 751 -1.0097419586828951e-27 391 388 -5.3333333333333330e+00 391 748 1.0097419586828951e-27 391 749 -1.0666666666677083e+01 391 369 -1.0666666666677083e+01 391 1071 1.4136387421560532e-27 391 389 -1.0666666666677083e+01 391 386 -5.3333333333333330e+00 391 801 1.0666666666677083e+01 391 799 5.3333333333333330e+00 392 392 1.6000000000062499e+01 393 393 3.2000000000208331e+01 394 394 6.4000000000499995e+01 394 771 -1.0416666666666666e-10 394 906 5.3333333333124999e+00 394 769 -1.0416666666666666e-10 394 770 2.1333333333291666e+01 394 916 -5.3333333333124999e+00 394 397 -1.0666666666677083e+01 394 767 -2.1333333333291666e+01 394 762 1.0416666666666666e-10 394 768 2.1333333333291666e+01 394 2053 -5.3333333333124999e+00 394 2261 -5.3333333333124999e+00 394 1099 -1.0666666666677083e+01 394 1097 -1.0666666666614583e+01 395 395 1.6000000000062499e+01 396 396 6.4000000000499995e+01 396 913 -1.0416666666666666e-10 396 912 2.1333333333291666e+01 396 916 -5.3333333333124999e+00 396 911 -1.0416666666666666e-10 396 906 5.3333333333124999e+00 396 397 -1.0666666666677083e+01 396 909 -2.1333333333291666e+01 396 903 1.0416666666666666e-10 396 910 2.1333333333291666e+01 396 1703 -5.3333333333124999e+00 396 2044 -5.3333333333124999e+00 396 1096 -1.0666666666677083e+01 396 1097 -1.0666666666614583e+01 397 397 3.2000000000124999e+01 397 912 -1.2116903504194741e-27 397 909 -1.2116903504194741e-27 397 911 -1.0666666666677083e+01 397 396 -1.0666666666677083e+01 397 768 -1.0097419586828951e-27 397 906 -5.3333333333333330e+00 397 770 1.0097419586828951e-27 397 769 -1.0666666666677083e+01 397 916 5.3333333333333330e+00 397 394 -1.0666666666677083e+01 397 1097 -5.3333333333333330e+00 398 398 6.4000000000499995e+01 398 775 -1.0416666666666666e-10 398 774 2.1333333333291666e+01 398 764 1.0416666666666666e-10 398 766 -2.1333333333291666e+01 398 772 -1.0416666666666666e-10 398 773 2.1333333333291666e+01 398 2261 -5.3333333333124999e+00 398 2252 -5.3333333333124999e+00 398 1665 -1.0666666666677083e+01 399 399 1.6000000000062499e+01 400 400 1.6000000000104166e+01 401 401 1.6000000000062499e+01 402 402 3.2000000000124999e+01 402 771 1.2116903504194741e-27 402 772 -1.0097419586828951e-27 402 420 -5.3333333333333330e+00 402 764 -1.0097419586828951e-27 402 766 1.0666666666677083e+01 402 405 -1.0666666666677083e+01 402 762 1.2116903504194741e-27 402 404 -1.0666666666677083e+01 402 403 -5.3333333333333330e+00 402 767 1.0666666666677083e+01 402 2261 -5.3333333333333330e+00 403 403 6.4000000000416662e+01 403 768 5.3333333333124999e+00 403 907 -5.3333333333124999e+00 403 416 -5.3333333333333330e+00 403 765 2.1333333333343749e+01 403 697 -5.3333333333124999e+00 403 417 -1.0666666666614583e+01 403 695 -5.3333333333124999e+00 403 418 -5.3333333333333330e+00 403 760 2.1333333333343749e+01 403 776 -5.3333333333124999e+00 403 407 -1.0666666666614583e+01 403 774 5.3333333333124999e+00 403 406 -5.3333333333333330e+00 403 764 2.1333333333343749e+01 403 766 -5.3333333333124999e+00 403 405 -1.0666666666614583e+01 403 762 2.1333333333343749e+01 403 404 -1.0666666666614583e+01 403 767 -5.3333333333124999e+00 403 402 -5.3333333333333330e+00 404 404 6.4000000000499995e+01 404 771 2.1333333333291666e+01 404 420 -1.0666666666614583e+01 404 768 -1.0416666666666666e-10 404 906 -5.3333333333124999e+00 404 416 -1.0666666666677083e+01 404 770 -1.0416666666666666e-10 404 769 2.1333333333291666e+01 404 916 5.3333333333124999e+00 404 414 -1.0666666666614583e+01 404 413 -1.0666666666677083e+01 404 767 1.0416666666666666e-10 404 762 -2.1333333333291666e+01 404 403 -1.0666666666614583e+01 404 402 -1.0666666666677083e+01 404 2053 5.3333333333124999e+00 404 2261 5.3333333333124999e+00 405 405 6.4000000000499995e+01 405 775 2.1333333333291666e+01 405 409 -1.0666666666614583e+01 405 773 -1.0416666666666666e-10 405 772 2.1333333333291666e+01 405 420 -1.0666666666614583e+01 405 421 -1.0666666666677083e+01 405 774 -1.0416666666666666e-10 405 406 -1.0666666666677083e+01 405 766 1.0416666666666666e-10 405 764 -2.1333333333291666e+01 405 403 -1.0666666666614583e+01 405 402 -1.0666666666677083e+01 405 2261 5.3333333333124999e+00 405 2252 5.3333333333124999e+00 406 406 3.2000000000124999e+01 406 775 1.4136387421560532e-27 406 778 -1.0097419586828951e-27 406 409 -5.3333333333333330e+00 406 760 -1.0097419586828951e-27 406 776 1.0666666666677083e+01 406 407 -1.0666666666677083e+01 406 764 1.4136387421560532e-27 406 405 -1.0666666666677083e+01 406 403 -5.3333333333333330e+00 406 774 -1.0666666666677083e+01 407 407 6.4000000000499995e+01 407 811 -5.3333333333124999e+00 407 780 2.1333333333291666e+01 407 694 -5.3333333333124999e+00 407 423 -1.0666666666614583e+01 407 695 1.0416666666666666e-10 407 418 -1.0666666666677083e+01 407 779 -1.0416666666666666e-10 407 778 2.1333333333291666e+01 407 409 -1.0666666666614583e+01 407 412 -1.0666666666677083e+01 407 776 1.0416666666666666e-10 407 760 -2.1333333333291666e+01 407 403 -1.0666666666614583e+01 407 406 -1.0666666666677083e+01 408 408 3.2000000000124999e+01 408 807 1.0097419586828951e-27 408 808 -1.4136387421560532e-27 408 426 -5.3333333333333330e+00 408 799 5.3333333333333330e+00 408 798 -1.4136387421560532e-27 408 802 1.0666666666677083e+01 408 411 -1.0666666666677083e+01 408 796 1.0097419586828951e-27 408 410 -1.0666666666677083e+01 408 409 -5.3333333333333330e+00 408 803 1.0666666666677083e+01 409 409 6.4000000000416662e+01 409 804 5.3333333333124999e+00 409 773 5.3333333333124999e+00 409 421 -5.3333333333333330e+00 409 775 -2.1333333333343749e+01 409 774 5.3333333333124999e+00 409 405 -1.0666666666614583e+01 409 776 -5.3333333333124999e+00 409 406 -5.3333333333333330e+00 409 778 -2.1333333333343749e+01 409 779 5.3333333333124999e+00 409 407 -1.0666666666614583e+01 409 809 5.3333333333124999e+00 409 412 -5.3333333333333330e+00 409 798 2.1333333333343749e+01 409 802 -5.3333333333124999e+00 409 411 -1.0666666666614583e+01 409 796 2.1333333333343749e+01 409 410 -1.0666666666614583e+01 409 803 -5.3333333333124999e+00 409 408 -5.3333333333333330e+00 410 410 6.4000000000499995e+01 410 1033 -5.3333333333124999e+00 410 807 2.1333333333291666e+01 410 799 -5.3333333333124999e+00 410 426 -1.0666666666614583e+01 410 804 -1.0416666666666666e-10 410 421 -1.0666666666677083e+01 410 806 -1.0416666666666666e-10 410 805 2.1333333333291666e+01 410 420 -1.0666666666614583e+01 410 419 -1.0666666666677083e+01 410 803 1.0416666666666666e-10 410 796 -2.1333333333291666e+01 410 409 -1.0666666666614583e+01 410 408 -1.0666666666677083e+01 410 2252 5.3333333333124999e+00 410 2260 5.3333333333124999e+00 411 411 6.4000000000499995e+01 411 799 -5.3333333333124999e+00 411 739 -5.3333333333124999e+00 411 810 2.1333333333291666e+01 411 811 -5.3333333333124999e+00 411 423 -1.0666666666614583e+01 411 738 1.0416666666666666e-10 411 808 2.1333333333291666e+01 411 737 -5.3333333333124999e+00 411 426 -1.0666666666614583e+01 411 427 -1.0666666666677083e+01 411 809 -1.0416666666666666e-10 411 412 -1.0666666666677083e+01 411 802 1.0416666666666666e-10 411 798 -2.1333333333291666e+01 411 409 -1.0666666666614583e+01 411 408 -1.0666666666677083e+01 412 412 3.2000000000124999e+01 412 810 1.2116903504194741e-27 412 780 -1.4136387421560532e-27 412 423 -5.3333333333333330e+00 412 811 5.3333333333333330e+00 412 778 1.4136387421560532e-27 412 779 -1.0666666666677083e+01 412 407 -1.0666666666677083e+01 412 798 1.2116903504194741e-27 412 411 -1.0666666666677083e+01 412 409 -5.3333333333333330e+00 412 809 -1.0666666666677083e+01 413 413 3.2000000000124999e+01 413 924 1.2116903504194741e-27 413 771 -1.4136387421560532e-27 413 420 -5.3333333333333330e+00 413 769 1.4136387421560532e-27 413 770 -1.0666666666677083e+01 413 404 -1.0666666666677083e+01 413 919 1.2116903504194741e-27 413 415 -1.0666666666677083e+01 413 414 -5.3333333333333330e+00 413 922 1.0666666666677083e+01 413 916 -5.3333333333333330e+00 413 2053 -5.3333333333333330e+00 414 414 6.4000000000416662e+01 414 923 5.3333333333124999e+00 414 1069 -5.3333333333124999e+00 414 918 -5.3333333333958333e+00 414 425 -5.3333333333333330e+00 414 920 2.1333333333343749e+01 414 603 -5.3333333333124999e+00 414 424 -1.0666666666614583e+01 414 602 -5.3333333333124999e+00 414 597 5.3333333333958333e+00 414 422 -5.3333333333333330e+00 414 915 2.1333333333343749e+01 414 907 -5.3333333333124999e+00 414 417 -1.0666666666614583e+01 414 768 5.3333333333124999e+00 414 906 5.3333333333958333e+00 414 416 -5.3333333333333330e+00 414 769 -2.1333333333343749e+01 414 770 5.3333333333124999e+00 414 404 -1.0666666666614583e+01 414 919 2.1333333333343749e+01 414 415 -1.0666666666614583e+01 414 922 -5.3333333333124999e+00 414 916 -5.3333333333958333e+00 414 413 -5.3333333333333330e+00 415 415 6.4000000000499995e+01 415 1033 -5.3333333333124999e+00 415 925 2.1333333333291666e+01 415 426 -1.0666666666614583e+01 415 1068 -5.3333333333124999e+00 415 923 -1.0416666666666666e-10 415 918 5.3333333333124999e+00 415 425 -1.0666666666677083e+01 415 926 -1.0416666666666666e-10 415 924 2.1333333333291666e+01 415 420 -1.0666666666614583e+01 415 419 -1.0666666666677083e+01 415 922 1.0416666666666666e-10 415 919 -2.1333333333291666e+01 415 414 -1.0666666666614583e+01 415 916 5.3333333333124999e+00 415 413 -1.0666666666677083e+01 415 2053 5.3333333333124999e+00 415 2260 5.3333333333124999e+00 416 416 3.2000000000124999e+01 416 762 -1.0097419586828951e-27 416 765 1.4136387421560532e-27 416 403 -5.3333333333333330e+00 416 915 -1.4136387421560532e-27 416 907 1.0666666666677083e+01 416 417 -1.0666666666677083e+01 416 769 -1.0097419586828951e-27 416 404 -1.0666666666677083e+01 416 414 -5.3333333333333330e+00 416 768 -1.0666666666677083e+01 416 906 5.3333333333333330e+00 417 417 6.4000000000499995e+01 417 597 -5.3333333333124999e+00 417 694 -5.3333333333124999e+00 417 602 1.0416666666666666e-10 417 927 2.1333333333291666e+01 417 595 -5.3333333333124999e+00 417 423 -1.0666666666614583e+01 417 422 -1.0666666666677083e+01 417 697 1.0416666666666666e-10 417 765 -2.1333333333291666e+01 417 403 -1.0666666666614583e+01 417 418 -1.0666666666677083e+01 417 907 1.0416666666666666e-10 417 915 -2.1333333333291666e+01 417 906 -5.3333333333124999e+00 417 414 -1.0666666666614583e+01 417 416 -1.0666666666677083e+01 418 418 3.2000000000124999e+01 418 780 1.2116903504194741e-27 418 927 -1.0097419586828951e-27 418 423 -5.3333333333333330e+00 418 694 5.3333333333333330e+00 418 765 -1.0097419586828951e-27 418 697 1.0666666666677083e+01 418 417 -1.0666666666677083e+01 418 760 1.2116903504194741e-27 418 407 -1.0666666666677083e+01 418 403 -5.3333333333333330e+00 418 695 1.0666666666677083e+01 419 419 3.2000000000124999e+01 419 925 1.0097419586828951e-27 419 807 -1.2116903504194741e-27 419 426 -5.3333333333333330e+00 419 1033 5.3333333333333330e+00 419 805 1.2116903504194741e-27 419 806 -1.0666666666677083e+01 419 410 -1.0666666666677083e+01 419 924 -1.0097419586828951e-27 419 415 -1.0666666666677083e+01 419 420 -5.3333333333333330e+00 419 926 -1.0666666666677083e+01 419 2260 -5.3333333333333330e+00 420 420 6.4000000000416662e+01 420 922 -5.3333333333124999e+00 420 770 5.3333333333124999e+00 420 413 -5.3333333333333330e+00 420 771 -2.1333333333343749e+01 420 767 -5.3333333333124999e+00 420 404 -1.0666666666614583e+01 420 766 -5.3333333333124999e+00 420 402 -5.3333333333333330e+00 420 772 -2.1333333333343749e+01 420 773 5.3333333333124999e+00 420 405 -1.0666666666614583e+01 420 804 5.3333333333124999e+00 420 421 -5.3333333333333330e+00 420 805 -2.1333333333343749e+01 420 806 5.3333333333124999e+00 420 410 -1.0666666666614583e+01 420 924 -2.1333333333343749e+01 420 415 -1.0666666666614583e+01 420 926 5.3333333333124999e+00 420 419 -5.3333333333333330e+00 420 2053 -5.3333333333958333e+00 420 2261 -5.3333333333958333e+00 420 2252 -5.3333333333958333e+00 420 2260 -5.3333333333958333e+00 421 421 3.2000000000124999e+01 421 796 -1.4136387421560532e-27 421 775 -1.2116903504194741e-27 421 409 -5.3333333333333330e+00 421 772 1.2116903504194741e-27 421 773 -1.0666666666677083e+01 421 405 -1.0666666666677083e+01 421 805 -1.4136387421560532e-27 421 410 -1.0666666666677083e+01 421 420 -5.3333333333333330e+00 421 804 -1.0666666666677083e+01 421 2252 -5.3333333333333330e+00 422 422 3.2000000000124999e+01 422 920 -1.4136387421560532e-27 422 915 1.2116903504194741e-27 422 414 -5.3333333333333330e+00 422 597 5.3333333333333330e+00 422 927 1.2116903504194741e-27 422 602 1.0666666666677083e+01 422 417 -1.0666666666677083e+01 422 956 1.4136387421560532e-27 422 424 -1.0666666666677083e+01 422 423 -5.3333333333333330e+00 422 603 1.0666666666677083e+01 422 595 5.3333333333333330e+00 423 423 6.4000000000416662e+01 423 740 -5.3333333333124999e+00 423 738 -5.3333333333124999e+00 423 739 5.3333333333958333e+00 423 427 -5.3333333333333330e+00 423 810 -2.1333333333343749e+01 423 809 5.3333333333124999e+00 423 411 -1.0666666666614583e+01 423 779 5.3333333333124999e+00 423 811 5.3333333333958333e+00 423 412 -5.3333333333333330e+00 423 780 -2.1333333333343749e+01 423 695 -5.3333333333124999e+00 423 407 -1.0666666666614583e+01 423 697 -5.3333333333124999e+00 423 694 5.3333333333958333e+00 423 418 -5.3333333333333330e+00 423 927 -2.1333333333343749e+01 423 602 -5.3333333333124999e+00 423 417 -1.0666666666614583e+01 423 956 2.1333333333343749e+01 423 424 -1.0666666666614583e+01 423 603 -5.3333333333124999e+00 423 595 5.3333333333958333e+00 423 422 -5.3333333333333330e+00 424 424 6.4000000000499995e+01 424 739 -5.3333333333124999e+00 424 740 1.0416666666666666e-10 424 737 -5.3333333333124999e+00 424 427 -1.0666666666677083e+01 424 1070 2.1333333333291666e+01 424 1068 -5.3333333333124999e+00 424 426 -1.0666666666614583e+01 424 1069 1.0416666666666666e-10 424 918 5.3333333333124999e+00 424 425 -1.0666666666677083e+01 424 920 -2.1333333333291666e+01 424 597 -5.3333333333124999e+00 424 414 -1.0666666666614583e+01 424 603 1.0416666666666666e-10 424 956 -2.1333333333291666e+01 424 423 -1.0666666666614583e+01 424 595 -5.3333333333124999e+00 424 422 -1.0666666666677083e+01 425 425 3.2000000000124999e+01 425 1070 1.0097419586828951e-27 425 925 -1.4136387421560532e-27 425 426 -5.3333333333333330e+00 425 1068 5.3333333333333330e+00 425 919 -1.4136387421560532e-27 425 923 -1.0666666666677083e+01 425 415 -1.0666666666677083e+01 425 920 1.0097419586828951e-27 425 424 -1.0666666666677083e+01 425 414 -5.3333333333333330e+00 425 1069 1.0666666666677083e+01 425 918 -5.3333333333333330e+00 426 426 6.4000000000416662e+01 426 926 5.3333333333124999e+00 426 806 5.3333333333124999e+00 426 1033 5.3333333333958333e+00 426 419 -5.3333333333333330e+00 426 807 -2.1333333333343749e+01 426 803 -5.3333333333124999e+00 426 410 -1.0666666666614583e+01 426 802 -5.3333333333124999e+00 426 799 5.3333333333958333e+00 426 408 -5.3333333333333330e+00 426 808 -2.1333333333343749e+01 426 738 -5.3333333333124999e+00 426 411 -1.0666666666614583e+01 426 740 -5.3333333333124999e+00 426 737 5.3333333333958333e+00 426 427 -5.3333333333333330e+00 426 1070 -2.1333333333343749e+01 426 1069 -5.3333333333124999e+00 426 424 -1.0666666666614583e+01 426 925 -2.1333333333343749e+01 426 415 -1.0666666666614583e+01 426 923 5.3333333333124999e+00 426 1068 5.3333333333958333e+00 426 425 -5.3333333333333330e+00 427 427 3.2000000000124999e+01 427 956 -1.2116903504194741e-27 427 810 -1.0097419586828951e-27 427 423 -5.3333333333333330e+00 427 739 5.3333333333333330e+00 427 808 1.0097419586828951e-27 427 738 1.0666666666677083e+01 427 411 -1.0666666666677083e+01 427 1070 -1.2116903504194741e-27 427 424 -1.0666666666677083e+01 427 426 -5.3333333333333330e+00 427 740 1.0666666666677083e+01 427 737 5.3333333333333330e+00 428 428 6.4000000000499995e+01 428 788 -1.0416666666666666e-10 428 1020 5.3333333333124999e+00 428 786 -1.0416666666666666e-10 428 787 2.1333333333291666e+01 428 1064 -5.3333333333124999e+00 428 432 -1.0666666666677083e+01 428 784 -2.1333333333291666e+01 428 781 1.0416666666666666e-10 428 785 2.1333333333291666e+01 428 2047 -5.3333333333124999e+00 428 2046 -5.3333333333124999e+00 428 1462 -1.0666666666677083e+01 428 1460 -1.0666666666614583e+01 428 1447 -1.0666666666614583e+01 428 2159 -5.3333333333124999e+00 428 3385 -5.3333333333124999e+00 428 2834 -1.0666666666614583e+01 428 1446 -1.0666666666677083e+01 429 429 3.7345833333395831e+01 429 1022 1.0097419586828951e-27 429 1018 1.3332291666666665e+01 429 1012 -5.3322916666666664e+00 429 1011 6.2500000000000003e-03 429 1014 -5.3322916666666664e+00 429 431 -1.0668750000000001e+01 429 1016 -1.0097419586828951e-27 429 1017 1.0666666666677083e+01 429 1015 -1.3332291666666665e+01 429 430 -1.0666666666677083e+01 429 2834 -8.0000000000000000e+00 429 1454 -8.0000000000000000e+00 430 430 6.4000000000499995e+01 430 1062 -1.0416666666666666e-10 430 1061 2.1333333333291666e+01 430 1064 -5.3333333333124999e+00 430 1060 -1.0416666666666666e-10 430 1020 5.3333333333124999e+00 430 432 -1.0666666666677083e+01 430 1022 -2.1333333333291666e+01 430 1018 -5.3333333333124999e+00 430 1017 1.0416666666666666e-10 430 1016 -2.1333333333291666e+01 430 1015 5.3333333333124999e+00 430 429 -1.0666666666677083e+01 430 1940 -5.3333333333124999e+00 430 2280 -5.3333333333124999e+00 430 1459 -1.0666666666677083e+01 430 1460 -1.0666666666614583e+01 430 2834 -1.0666666666614583e+01 430 1454 -1.0666666666614583e+01 431 431 3.2024999999999999e+01 431 1018 -5.3312499999999998e+00 431 1012 1.0668750000000001e+01 431 1011 -4.1666666666666666e-03 431 1015 5.3312499999999998e+00 431 429 -1.0668750000000001e+01 431 1013 1.0668750000000001e+01 431 1014 1.0668750000000001e+01 431 3382 -5.3312499999999998e+00 431 3383 -4.1666666666666666e-03 431 3381 -5.3312499999999998e+00 431 2833 -1.0668750000000001e+01 431 2834 4.1666666666666657e-03 431 1458 4.1666666666666657e-03 431 2194 -5.3312499999999998e+00 431 4597 -4.1666666666666666e-03 431 1454 4.1666666666666657e-03 431 1937 -5.3312499999999998e+00 431 1457 -1.0668750000000001e+01 432 432 3.2000000000124999e+01 432 1061 -1.2116903504194741e-27 432 1022 -1.2116903504194741e-27 432 1060 -1.0666666666677083e+01 432 430 -1.0666666666677083e+01 432 785 -1.4136387421560532e-27 432 1020 -5.3333333333333330e+00 432 787 1.4136387421560532e-27 432 786 -1.0666666666677083e+01 432 1064 5.3333333333333330e+00 432 428 -1.0666666666677083e+01 432 2834 -5.3333333333333330e+00 432 1460 -5.3333333333333330e+00 433 433 6.4000000000499995e+01 433 792 -1.0416666666666666e-10 433 791 2.1333333333291666e+01 433 782 1.0416666666666666e-10 433 783 -2.1333333333291666e+01 433 789 -1.0416666666666666e-10 433 790 2.1333333333291666e+01 433 2046 -5.3333333333124999e+00 433 2165 -5.3333333333124999e+00 433 2159 -5.3333333333124999e+00 433 1101 -1.0666666666614583e+01 433 1112 -1.0666666666677083e+01 433 1703 -5.3333333333124999e+00 433 1100 -1.0666666666677083e+01 434 434 1.6000000000062499e+01 435 435 1.6000000000062499e+01 436 436 6.4000000000499995e+01 436 1033 5.3333333333124999e+00 436 807 -1.0416666666666666e-10 436 799 5.3333333333124999e+00 436 440 -1.0666666666677083e+01 436 805 -1.0416666666666666e-10 436 806 2.1333333333291666e+01 436 803 -2.1333333333291666e+01 436 796 1.0416666666666666e-10 436 804 2.1333333333291666e+01 436 2252 -5.3333333333124999e+00 436 2260 -5.3333333333124999e+00 436 1390 -1.0666666666614583e+01 436 1389 -1.0666666666677083e+01 437 437 1.6000000000062499e+01 438 438 3.2000000000208331e+01 439 439 6.4000000000499995e+01 439 799 5.3333333333124999e+00 439 1071 1.0416666666666666e-10 439 1033 5.3333333333124999e+00 439 440 -1.0666666666677083e+01 439 1034 -2.1333333333291666e+01 439 1054 1.0416666666666666e-10 439 1074 -2.1333333333291666e+01 439 1072 1.0416666666666666e-10 439 801 -2.1333333333291666e+01 439 1390 -1.0666666666614583e+01 439 2263 -5.3333333333124999e+00 439 2265 -5.3333333333124999e+00 439 1392 -1.0666666666677083e+01 440 440 3.2000000000124999e+01 440 806 -1.2116903504194741e-27 440 803 -1.2116903504194741e-27 440 807 -1.0666666666677083e+01 440 436 -1.0666666666677083e+01 440 801 1.4136387421560532e-27 440 799 -5.3333333333333330e+00 440 1034 -1.4136387421560532e-27 440 1071 1.0666666666677083e+01 440 1033 -5.3333333333333330e+00 440 439 -1.0666666666677083e+01 440 1390 -5.3333333333333330e+00 441 441 5.3333333334124987e+01 441 442 4.1666666666666665e-11 441 813 -1.0416666666666666e-11 441 816 1.0416666666666666e-11 441 814 6.2499999999999991e-11 441 818 -1.0666666666583334e+01 441 3704 6.2499999999999991e-11 441 3701 -1.0416666666666666e-11 441 3021 4.1666666666666665e-11 441 3699 6.2499999999999991e-11 441 3698 -1.0416666666666666e-11 441 3702 -1.0666666666583334e+01 441 3020 -1.0666666666666666e+01 441 4772 -5.3333333332812494e+00 441 4072 1.4583333333333335e-10 441 4775 -1.0666666666531249e+01 441 4774 1.0666666666625000e+01 441 5040 5.3333333332812494e+00 441 4073 -1.6000000000010417e+01 441 4760 -1.0416666666666666e-11 441 4771 -1.0666666666531249e+01 441 4062 -1.6000000000010417e+01 441 2315 -1.0416666666666666e-11 441 1522 4.1666666666666665e-11 441 1524 -1.0666666666666666e+01 442 442 3.2000000000249997e+01 442 441 4.1666666666666665e-11 442 818 -5.3333333333124999e+00 442 816 4.1666666666666665e-11 442 3022 4.1666666666666665e-11 442 3703 -5.3333333333124999e+00 442 3700 1.0666666666687499e+01 442 3698 -4.1666666666666665e-11 442 3702 -5.3333333333124999e+00 442 3699 1.0666666666687499e+01 442 3020 -1.0666666666687499e+01 442 4068 4.1666666666666665e-11 442 5007 -5.3333333333124999e+00 442 5005 1.0666666666687499e+01 442 5002 -4.1666666666666665e-11 442 4992 5.3333333333124999e+00 442 4067 -1.0666666666687499e+01 442 1993 -5.3333333333124999e+00 442 1524 -1.0666666666687499e+01 443 443 2.1333333333541667e+01 444 444 3.2012500000000003e+01 444 861 -1.3552527156068805e-19 444 851 1.3552527156068805e-19 444 854 1.3552527156068805e-19 444 843 1.0667708333333334e+01 444 842 5.3333333333333330e+00 444 451 -1.0667708333333334e+01 444 453 -5.3333333333333330e+00 444 845 -1.3552527156068805e-19 444 841 1.0667708333333334e+01 444 840 5.3333333333333330e+00 444 446 -1.0667708333333334e+01 444 445 -5.3333333333333330e+00 445 445 6.4041666666666671e+01 445 892 5.3312499999999998e+00 445 865 5.3312499999999998e+00 445 858 5.3312499999999998e+00 445 843 -5.3312499999999998e+00 445 851 2.1334374999999998e+01 445 853 5.3312499999999998e+00 445 850 -5.3395833333333327e+00 445 451 -1.0661458333333334e+01 445 450 -5.3333333333333330e+00 445 849 2.1334374999999998e+01 445 882 -5.3312499999999998e+00 445 848 -5.3395833333333327e+00 445 449 -1.0661458333333334e+01 445 448 -5.3333333333333330e+00 445 847 2.1334374999999998e+01 445 862 -5.3312499999999998e+00 445 846 -5.3395833333333327e+00 445 447 -5.3333333333333330e+00 445 845 2.1334374999999998e+01 445 841 -5.3312499999999998e+00 445 840 5.3395833333333327e+00 445 446 -1.0661458333333334e+01 445 444 -5.3333333333333330e+00 445 2853 -1.0661458333333334e+01 446 446 6.4049999999999997e+01 446 842 -5.3312499999999998e+00 446 938 5.3312499999999998e+00 446 846 5.3312499999999998e+00 446 860 -1.0416666666666664e-02 446 861 2.1329166666666662e+01 446 951 -5.3312499999999998e+00 446 453 -1.0661458333333334e+01 446 452 -1.0667708333333334e+01 446 858 -1.0416666666666664e-02 446 859 2.1329166666666662e+01 446 863 -5.3312499999999998e+00 446 447 -1.0667708333333334e+01 446 841 1.0416666666666664e-02 446 845 -2.1329166666666662e+01 446 840 -5.3312499999999998e+00 446 445 -1.0661458333333334e+01 446 444 -1.0667708333333334e+01 446 2852 -1.0661458333333334e+01 447 447 3.2012500000000003e+01 447 845 1.3552527156068805e-19 447 859 1.3552527156068805e-19 447 858 -1.0667708333333334e+01 447 863 5.3333333333333330e+00 447 446 -1.0667708333333334e+01 447 847 -1.3552527156068805e-19 447 862 1.0667708333333334e+01 447 846 -5.3333333333333330e+00 447 445 -5.3333333333333330e+00 447 3413 1.3552527156068805e-19 447 2852 -5.3333333333333330e+00 447 2853 -1.0667708333333334e+01 448 448 3.2012500000000003e+01 448 891 -1.3552527156068805e-19 448 847 1.3552527156068805e-19 448 865 -1.0667708333333334e+01 448 884 5.3333333333333330e+00 448 849 -1.3552527156068805e-19 448 882 1.0667708333333334e+01 448 848 -5.3333333333333330e+00 448 449 -1.0667708333333334e+01 448 445 -5.3333333333333330e+00 448 3410 -1.3552527156068805e-19 448 2853 -1.0667708333333334e+01 448 2846 -5.3333333333333330e+00 449 449 6.4049999999999997e+01 449 884 -5.3312499999999998e+00 449 850 5.3312499999999998e+00 449 892 -1.0416666666666664e-02 449 893 2.1329166666666662e+01 449 896 -5.3312499999999998e+00 449 450 -1.0667708333333334e+01 449 890 -1.0416666666666664e-02 449 891 2.1329166666666662e+01 449 882 1.0416666666666664e-02 449 849 -2.1329166666666662e+01 449 848 5.3312499999999998e+00 449 445 -1.0661458333333334e+01 449 448 -1.0667708333333334e+01 449 3482 -5.3312499999999998e+00 449 2856 -1.0661458333333334e+01 449 3412 -5.3312499999999998e+00 449 2846 -1.0661458333333334e+01 449 2855 -1.0667708333333334e+01 450 450 3.2012500000000003e+01 450 856 -1.3552527156068805e-19 450 849 1.3552527156068805e-19 450 893 1.3552527156068805e-19 450 892 -1.0667708333333334e+01 450 896 5.3333333333333330e+00 450 449 -1.0667708333333334e+01 450 851 -1.3552527156068805e-19 450 853 -1.0667708333333334e+01 450 850 -5.3333333333333330e+00 450 451 -1.0667708333333334e+01 450 445 -5.3333333333333330e+00 450 2856 -5.3333333333333330e+00 451 451 6.4049999999999997e+01 451 896 -5.3312499999999998e+00 451 959 5.3312499999999998e+00 451 840 -5.3312499999999998e+00 451 855 -1.0416666666666664e-02 451 856 2.1329166666666662e+01 451 964 -5.3312499999999998e+00 451 454 -1.0667708333333334e+01 451 843 1.0416666666666664e-02 451 854 2.1329166666666662e+01 451 842 -5.3312499999999998e+00 451 453 -1.0661458333333334e+01 451 444 -1.0667708333333334e+01 451 853 -1.0416666666666664e-02 451 851 -2.1329166666666662e+01 451 850 5.3312499999999998e+00 451 445 -1.0661458333333334e+01 451 450 -1.0667708333333334e+01 451 2856 -1.0661458333333334e+01 452 452 3.2012500000000003e+01 452 954 -1.3552527156068805e-19 452 859 -1.0842021724855044e-19 452 861 1.0842021724855044e-19 452 860 -1.0667708333333334e+01 452 951 5.3333333333333330e+00 452 446 -1.0667708333333334e+01 452 453 -5.3333333333333330e+00 452 950 1.0667708333333334e+01 452 938 -5.3333333333333330e+00 452 3460 -1.3552527156068805e-19 452 2851 -1.0667708333333334e+01 452 2852 -5.3333333333333330e+00 453 453 6.4041666666666671e+01 453 950 -5.3312499999999998e+00 453 968 5.3312499999999998e+00 453 855 5.3312499999999998e+00 453 841 -5.3312499999999998e+00 453 861 -2.1334374999999998e+01 453 860 5.3312499999999998e+00 453 951 5.3395833333333327e+00 453 446 -1.0661458333333334e+01 453 452 -5.3333333333333330e+00 453 954 -2.1334374999999998e+01 453 953 5.3312499999999998e+00 453 961 -5.3395833333333327e+00 453 456 -5.3333333333333330e+00 453 960 2.1334374999999998e+01 453 963 -5.3312499999999998e+00 453 959 -5.3395833333333327e+00 453 455 -1.0661458333333334e+01 453 454 -5.3333333333333330e+00 453 854 -2.1334374999999998e+01 453 843 -5.3312499999999998e+00 453 842 5.3395833333333327e+00 453 451 -1.0661458333333334e+01 453 444 -5.3333333333333330e+00 453 2851 -1.0661458333333334e+01 454 454 3.2012500000000003e+01 454 967 -1.0842021724855044e-19 454 854 -1.3552527156068805e-19 454 856 1.3552527156068805e-19 454 855 -1.0667708333333334e+01 454 964 5.3333333333333330e+00 454 451 -1.0667708333333334e+01 454 960 -1.0842021724855044e-19 454 963 1.0667708333333334e+01 454 959 -5.3333333333333330e+00 454 455 -1.0667708333333334e+01 454 453 -5.3333333333333330e+00 454 2856 -5.3333333333333330e+00 455 455 6.4049999999999997e+01 455 964 -5.3312499999999998e+00 455 961 5.3312499999999998e+00 455 968 -1.0416666666666664e-02 455 969 2.1329166666666662e+01 455 982 -5.3312499999999998e+00 455 456 -1.0667708333333334e+01 455 966 -1.0416666666666664e-02 455 967 2.1329166666666662e+01 455 963 1.0416666666666664e-02 455 960 -2.1329166666666662e+01 455 959 5.3312499999999998e+00 455 453 -1.0661458333333334e+01 455 454 -1.0667708333333334e+01 455 3447 -5.3312499999999998e+00 455 2849 -1.0661458333333334e+01 455 3483 -5.3312499999999998e+00 455 2856 -1.0661458333333334e+01 455 2857 -1.0667708333333334e+01 456 456 3.2012500000000003e+01 456 960 1.3552527156068805e-19 456 969 1.3552527156068805e-19 456 968 -1.0667708333333334e+01 456 982 5.3333333333333330e+00 456 455 -1.0667708333333334e+01 456 954 1.3552527156068805e-19 456 953 -1.0667708333333334e+01 456 961 -5.3333333333333330e+00 456 453 -5.3333333333333330e+00 456 3446 1.3552527156068805e-19 456 2849 -5.3333333333333330e+00 456 2851 -1.0667708333333334e+01 457 457 3.2012500000000003e+01 457 888 -1.3552527156068805e-19 457 874 1.3552527156068805e-19 457 879 1.3552527156068805e-19 457 878 -1.0667708333333334e+01 457 883 5.3333333333333330e+00 457 461 -1.0667708333333334e+01 457 873 -1.3552527156068805e-19 457 881 1.0667708333333334e+01 457 872 -5.3333333333333330e+00 457 459 -1.0667708333333334e+01 458 458 3.2020833333333336e+01 459 459 6.4049999999999997e+01 459 883 -5.3312499999999998e+00 459 887 -1.0416666666666664e-02 459 888 2.1329166666666662e+01 459 501 1.0416666666666664e-02 459 886 2.1329166666666662e+01 459 881 1.0416666666666664e-02 459 873 -2.1329166666666662e+01 459 872 5.3312499999999998e+00 459 457 -1.0667708333333334e+01 460 460 3.2020833333333336e+01 461 461 6.4049999999999997e+01 461 660 1.0416666666666664e-02 461 872 5.3312499999999998e+00 461 880 2.1329166666666662e+01 461 869 1.0416666666666664e-02 461 874 -2.1329166666666662e+01 461 878 -1.0416666666666664e-02 461 879 2.1329166666666662e+01 461 883 -5.3312499999999998e+00 461 457 -1.0667708333333334e+01 462 462 1.6006250000000001e+01 463 463 1.6010416666666668e+01 464 464 1.6006250000000001e+01 465 465 1.6010416666666668e+01 466 466 1.6006250000000001e+01 467 467 1.6006250000000001e+01 468 468 3.2000000000124999e+01 468 929 -1.0097419586828951e-27 468 922 1.2116903504194741e-27 468 923 1.2116903504194741e-27 468 919 1.0666666666677083e+01 468 918 5.3333333333333330e+00 468 474 -1.0666666666677083e+01 468 473 -5.3333333333333330e+00 468 921 -1.0097419586828951e-27 468 917 1.0666666666677083e+01 468 916 5.3333333333333330e+00 468 469 -1.0666666666677083e+01 468 1581 -5.3333333333333330e+00 469 469 6.4000000000499995e+01 469 918 -5.3333333333124999e+00 469 1064 -5.3333333333124999e+00 469 930 -1.0416666666666666e-10 469 931 2.1333333333291666e+01 469 928 -1.0416666666666666e-10 469 929 2.1333333333291666e+01 469 1065 -5.3333333333124999e+00 469 473 -1.0666666666614583e+01 469 472 -1.0666666666677083e+01 469 917 1.0416666666666666e-10 469 921 -2.1333333333291666e+01 469 916 -5.3333333333124999e+00 469 468 -1.0666666666677083e+01 469 2044 -5.3333333333124999e+00 469 2047 -5.3333333333124999e+00 469 1595 -1.0666666666614583e+01 469 1580 -1.0666666666677083e+01 469 1581 -1.0666666666614583e+01 470 470 3.2000000000124999e+01 470 1051 -1.0097419586828951e-27 470 1049 1.2116903504194741e-27 470 1044 1.0666666666677083e+01 470 1043 5.3333333333333330e+00 470 473 -5.3333333333333330e+00 470 1046 -1.0097419586828951e-27 470 1042 1.0666666666677083e+01 470 1041 5.3333333333333330e+00 470 471 -1.0666666666677083e+01 470 2267 1.2116903504194741e-27 470 1594 -1.0666666666677083e+01 470 1591 -5.3333333333333330e+00 471 471 6.4000000000499995e+01 471 1033 5.3333333333124999e+00 471 1043 -5.3333333333124999e+00 471 1052 -1.0416666666666666e-10 471 1032 -2.1333333333291666e+01 471 1050 -1.0416666666666666e-10 471 1051 2.1333333333291666e+01 471 1068 5.3333333333124999e+00 471 473 -1.0666666666614583e+01 471 475 -1.0666666666677083e+01 471 1042 1.0416666666666666e-10 471 1046 -2.1333333333291666e+01 471 1041 -5.3333333333124999e+00 471 470 -1.0666666666677083e+01 471 2264 -5.3333333333124999e+00 471 2263 -5.3333333333124999e+00 471 1589 -1.0666666666614583e+01 471 1590 -1.0666666666677083e+01 471 1591 -1.0666666666614583e+01 472 472 3.2000000000124999e+01 472 1049 -1.4136387421560532e-27 472 931 -1.2116903504194741e-27 472 929 1.2116903504194741e-27 472 928 -1.0666666666677083e+01 472 1065 5.3333333333333330e+00 472 469 -1.0666666666677083e+01 472 473 -5.3333333333333330e+00 472 1048 1.4136387421560532e-27 472 1047 -1.0666666666677083e+01 472 1064 5.3333333333333330e+00 472 1594 -1.0666666666677083e+01 472 1595 -5.3333333333333330e+00 473 473 6.4000000000416662e+01 473 925 5.3333333333124999e+00 473 917 -5.3333333333124999e+00 473 1047 5.3333333333124999e+00 473 1042 -5.3333333333124999e+00 473 1051 -2.1333333333343749e+01 473 1050 5.3333333333124999e+00 473 1068 -5.3333333333958333e+00 473 471 -1.0666666666614583e+01 473 475 -5.3333333333333330e+00 473 923 -2.1333333333343749e+01 473 919 -5.3333333333124999e+00 473 918 5.3333333333958333e+00 473 474 -1.0666666666614583e+01 473 468 -5.3333333333333330e+00 473 929 -2.1333333333343749e+01 473 928 5.3333333333124999e+00 473 1065 5.3333333333958333e+00 473 469 -1.0666666666614583e+01 473 472 -5.3333333333333330e+00 473 1049 -2.1333333333343749e+01 473 1044 -5.3333333333124999e+00 473 1043 5.3333333333958333e+00 473 470 -5.3333333333333330e+00 473 1594 -1.0666666666614583e+01 474 474 6.4000000000499995e+01 474 1068 5.3333333333124999e+00 474 916 -5.3333333333124999e+00 474 925 -1.0416666666666666e-10 474 926 2.1333333333291666e+01 474 1033 5.3333333333124999e+00 474 475 -1.0666666666677083e+01 474 924 -1.0416666666666666e-10 474 922 -2.1333333333291666e+01 474 919 1.0416666666666666e-10 474 923 2.1333333333291666e+01 474 918 -5.3333333333124999e+00 474 473 -1.0666666666614583e+01 474 468 -1.0666666666677083e+01 474 2260 -5.3333333333124999e+00 474 1589 -1.0666666666614583e+01 474 2053 -5.3333333333124999e+00 474 1581 -1.0666666666614583e+01 474 1588 -1.0666666666677083e+01 475 475 3.2000000000124999e+01 475 1032 1.2116903504194741e-27 475 923 -1.4136387421560532e-27 475 926 1.4136387421560532e-27 475 925 -1.0666666666677083e+01 475 1033 -5.3333333333333330e+00 475 474 -1.0666666666677083e+01 475 1051 1.2116903504194741e-27 475 1050 -1.0666666666677083e+01 475 1068 -5.3333333333333330e+00 475 471 -1.0666666666677083e+01 475 473 -5.3333333333333330e+00 475 1589 -5.3333333333333330e+00 476 476 1.6006250000000001e+01 477 477 3.2012500000000003e+01 477 941 1.3552527156068805e-19 477 942 -1.3552527156068805e-19 477 480 -5.3333333333333330e+00 477 819 5.3333333333333330e+00 477 940 -1.3552527156068805e-19 477 822 1.0667708333333334e+01 477 478 -1.0667708333333334e+01 477 823 1.0667708333333334e+01 477 821 5.3333333333333330e+00 477 3473 1.3552527156068805e-19 477 2475 -1.0667708333333334e+01 477 2477 -5.3333333333333330e+00 478 478 6.4049999999999997e+01 478 634 -5.3312499999999998e+00 478 944 2.1329166666666662e+01 478 946 -5.3312499999999998e+00 478 482 -1.0661458333333334e+01 478 633 1.0416666666666664e-02 478 632 -5.3312499999999998e+00 478 486 -1.0667708333333334e+01 478 942 2.1329166666666662e+01 478 480 -1.0661458333333334e+01 478 819 -5.3312499999999998e+00 478 943 -1.0416666666666664e-02 478 939 5.3312499999999998e+00 478 479 -1.0667708333333334e+01 478 822 1.0416666666666664e-02 478 940 -2.1329166666666662e+01 478 821 -5.3312499999999998e+00 478 477 -1.0667708333333334e+01 478 2477 -1.0661458333333334e+01 479 479 3.2012500000000003e+01 479 944 1.0842021724855044e-19 479 949 -1.3552527156068805e-19 479 482 -5.3333333333333330e+00 479 946 5.3333333333333330e+00 479 945 1.0667708333333334e+01 479 940 1.0842021724855044e-19 479 478 -1.0667708333333334e+01 479 943 -1.0667708333333334e+01 479 939 -5.3333333333333330e+00 479 3088 -1.3552527156068805e-19 479 2470 -1.0667708333333334e+01 479 2477 -5.3333333333333330e+00 480 480 6.4041666666666671e+01 480 633 -5.3312499999999998e+00 480 635 -5.3312499999999998e+00 480 632 5.3395833333333327e+00 480 486 -5.3333333333333330e+00 480 952 2.1334374999999998e+01 480 962 -5.3312499999999998e+00 480 483 -1.0661458333333334e+01 480 954 5.3312499999999998e+00 480 951 -5.3395833333333327e+00 480 485 -5.3333333333333330e+00 480 950 2.1334374999999998e+01 480 938 5.3395833333333327e+00 480 941 -2.1334374999999998e+01 480 823 -5.3312499999999998e+00 480 942 -2.1334374999999998e+01 480 478 -1.0661458333333334e+01 480 822 -5.3312499999999998e+00 480 819 5.3395833333333327e+00 480 477 -5.3333333333333330e+00 480 3460 -5.3312499999999998e+00 480 2473 -1.0661458333333334e+01 480 3472 -5.3312499999999998e+00 480 2474 -5.3333333333333330e+00 480 2475 -1.0661458333333334e+01 481 481 3.2012500000000003e+01 481 976 1.3552527156068805e-19 481 977 -1.0842021724855044e-19 481 484 -5.3333333333333330e+00 481 713 5.3333333333333330e+00 481 973 -1.0842021724855044e-19 481 721 1.0667708333333334e+01 481 971 1.3552527156068805e-19 481 483 -1.0667708333333334e+01 481 482 -5.3333333333333330e+00 481 722 1.0667708333333334e+01 481 717 5.3333333333333330e+00 481 2479 -1.0667708333333334e+01 482 482 6.4041666666666671e+01 482 635 -5.3312499999999998e+00 482 633 -5.3312499999999998e+00 482 634 5.3395833333333327e+00 482 486 -5.3333333333333330e+00 482 944 -2.1334374999999998e+01 482 943 5.3312499999999998e+00 482 478 -1.0661458333333334e+01 482 945 -5.3312499999999998e+00 482 946 5.3395833333333327e+00 482 479 -5.3333333333333330e+00 482 949 -2.1334374999999998e+01 482 970 -5.3395833333333327e+00 482 973 2.1334374999999998e+01 482 721 -5.3312499999999998e+00 482 971 2.1334374999999998e+01 482 483 -1.0661458333333334e+01 482 722 -5.3312499999999998e+00 482 717 5.3395833333333327e+00 482 481 -5.3333333333333330e+00 482 3089 -5.3312499999999998e+00 482 2470 -1.0661458333333334e+01 482 3215 -5.3312499999999998e+00 482 2478 -5.3333333333333330e+00 482 2479 -1.0661458333333334e+01 483 483 6.4049999999999997e+01 483 634 -5.3312499999999998e+00 483 635 1.0416666666666664e-02 483 632 -5.3312499999999998e+00 483 486 -1.0667708333333334e+01 483 952 -2.1329166666666662e+01 483 951 5.3312499999999998e+00 483 480 -1.0661458333333334e+01 483 962 1.0416666666666664e-02 483 961 -5.3312499999999998e+00 483 485 -1.0667708333333334e+01 483 976 2.1329166666666662e+01 483 713 -5.3312499999999998e+00 483 484 -1.0661458333333334e+01 483 722 1.0416666666666664e-02 483 971 -2.1329166666666662e+01 483 482 -1.0661458333333334e+01 483 717 -5.3312499999999998e+00 483 481 -1.0667708333333334e+01 484 484 6.4041666666666671e+01 484 981 -5.3395833333333327e+00 484 983 2.1334374999999998e+01 484 982 -5.3395833333333327e+00 484 953 -2.1334374999999998e+01 484 954 5.3312499999999998e+00 484 962 -5.3312499999999998e+00 484 961 5.3395833333333327e+00 484 485 -5.3333333333333330e+00 484 976 -2.1334374999999998e+01 484 722 -5.3312499999999998e+00 484 483 -1.0661458333333334e+01 484 977 -2.1334374999999998e+01 484 721 -5.3312499999999998e+00 484 713 5.3395833333333327e+00 484 481 -5.3333333333333330e+00 484 3212 -5.3312499999999998e+00 484 3074 -5.3312499999999998e+00 484 2480 -5.3333333333333330e+00 484 3076 -5.3312499999999998e+00 484 2467 -1.0661458333333334e+01 484 3446 -5.3312499999999998e+00 484 2472 -5.3333333333333330e+00 484 2473 -1.0661458333333334e+01 484 2479 -1.0661458333333334e+01 485 485 3.2012500000000003e+01 485 952 -1.3552527156068805e-19 485 950 1.3552527156068805e-19 485 480 -5.3333333333333330e+00 485 951 -5.3333333333333330e+00 485 953 1.3552527156068805e-19 485 954 -1.0667708333333334e+01 485 976 -1.3552527156068805e-19 485 483 -1.0667708333333334e+01 485 484 -5.3333333333333330e+00 485 962 1.0667708333333334e+01 485 961 5.3333333333333330e+00 485 2473 -1.0667708333333334e+01 486 486 3.2012500000000003e+01 486 971 -1.3552527156068805e-19 486 944 -1.3552527156068805e-19 486 482 -5.3333333333333330e+00 486 634 5.3333333333333330e+00 486 942 1.3552527156068805e-19 486 633 1.0667708333333334e+01 486 478 -1.0667708333333334e+01 486 952 1.3552527156068805e-19 486 483 -1.0667708333333334e+01 486 480 -5.3333333333333330e+00 486 635 1.0667708333333334e+01 486 632 5.3333333333333330e+00 487 487 6.4049999999999997e+01 487 1005 -1.0416666666666664e-02 487 1004 2.1329166666666662e+01 487 998 1.0416666666666664e-02 487 999 -2.1329166666666662e+01 487 1002 -1.0416666666666664e-02 487 1003 2.1329166666666662e+01 487 3158 -5.3312499999999998e+00 487 3534 -5.3312499999999998e+00 487 2561 -1.0667708333333334e+01 487 3484 -5.3312499999999998e+00 487 3157 -5.3312499999999998e+00 487 2553 -1.0661458333333334e+01 487 2548 -1.0667708333333334e+01 488 488 1.6006250000000001e+01 489 489 6.4049999999999997e+01 489 1006 1.0416666666666664e-02 489 1010 2.1329166666666662e+01 489 982 -5.3312499999999998e+00 489 984 1.0416666666666664e-02 489 981 -5.3312499999999998e+00 489 490 -1.0667708333333334e+01 489 1008 -2.1329166666666662e+01 489 1007 1.0416666666666664e-02 489 1009 2.1329166666666662e+01 489 3157 -5.3312499999999998e+00 489 3447 -5.3312499999999998e+00 489 2437 -1.0667708333333334e+01 489 2435 -1.0661458333333334e+01 489 2424 -1.0661458333333334e+01 489 3211 -5.3312499999999998e+00 489 3158 -5.3312499999999998e+00 489 2432 -1.0661458333333334e+01 489 2429 -1.0667708333333334e+01 490 490 3.2012500000000003e+01 490 1010 -1.3552527156068805e-19 490 1008 -1.3552527156068805e-19 490 984 1.0667708333333334e+01 490 489 -1.0667708333333334e+01 490 981 5.3333333333333330e+00 490 983 1.0667708333333334e+01 490 982 5.3333333333333330e+00 490 3074 1.3552527156068805e-19 490 2424 -5.3333333333333330e+00 490 3076 -1.3552527156068805e-19 490 2425 -1.0667708333333334e+01 490 2435 -5.3333333333333330e+00 491 491 3.2024999999999999e+01 491 1013 1.0668750000000001e+01 491 3662 -4.1666666666666666e-03 491 3668 5.3312499999999998e+00 491 2830 -1.0668749999999999e+01 491 3383 -4.1666666666666666e-03 491 2824 4.1666666666666657e-03 491 3384 -5.3312499999999998e+00 491 3663 1.0668750000000001e+01 491 2822 -1.0668749999999999e+01 491 4597 -4.1666666666666666e-03 491 4599 -5.3312499999999998e+00 491 3957 -1.0668749999999999e+01 491 3958 4.1666666666666657e-03 491 4606 5.3312499999999998e+00 491 4605 -1.0668750000000001e+01 491 3381 -5.3312499999999998e+00 491 1646 4.1666666666666657e-03 491 2194 -5.3312499999999998e+00 492 492 6.4000000000499995e+01 492 1057 -1.0416666666666666e-10 492 1058 2.1333333333291666e+01 492 1027 1.0416666666666666e-10 492 1056 2.1333333333291666e+01 492 1053 1.0416666666666666e-10 492 1055 -2.1333333333291666e+01 492 2265 -5.3333333333124999e+00 492 1915 -5.3333333333124999e+00 492 2196 -5.3333333333124999e+00 492 1429 -1.0666666666677083e+01 492 1916 -5.3333333333124999e+00 492 1421 -1.0666666666614583e+01 492 1424 -1.0666666666677083e+01 493 493 1.6000000000062499e+01 494 494 3.2020833333333336e+01 495 495 6.4029166666666669e+01 495 48 1.4465734552327348e-19 495 521 2.1329166666666662e+01 495 42 -1.2659172094511536e-19 495 39 2.1334374999999998e+01 495 516 -2.1329166666666662e+01 495 2868 -2.1329166666666662e+01 495 2887 1.0416666666666664e-02 496 496 3.2020833333333336e+01 497 497 6.4029166666666654e+01 497 46 -1.2659172094511536e-19 497 38 1.4465734552327348e-19 497 40 -2.1329166666666662e+01 497 39 2.1334374999999998e+01 497 507 -2.1329166666666662e+01 497 14 1.0416666666666664e-02 497 508 2.1329166666666662e+01 498 498 3.2020833333333336e+01 499 499 6.4029166666666669e+01 499 42 1.4465734552327348e-19 499 514 2.1329166666666662e+01 499 38 -1.4465734552327348e-19 499 41 -2.1329166666666662e+01 499 39 2.1334374999999998e+01 499 27 1.0416666666666664e-02 499 506 -2.1329166666666662e+01 500 500 3.2020833333333336e+01 501 501 6.4029166666666669e+01 501 46 1.4465734552327348e-19 501 873 -2.1329166666666662e+01 501 48 -1.4465734552327348e-19 501 47 -2.1329166666666662e+01 501 39 2.1334374999999998e+01 501 459 1.0416666666666664e-02 501 886 2.1329166666666662e+01 502 502 6.4041666666666671e+01 502 40 -5.3312499999999998e+00 502 27 5.3312499999999998e+00 502 512 -1.5997916666666667e+01 502 41 -5.3312499999999998e+00 502 43 5.3395833333333327e+00 502 506 -1.5997916666666665e+01 502 38 5.3333333333333330e+00 502 507 -1.5997916666666667e+01 502 509 -1.5997916666666665e+01 502 14 5.3312499999999998e+00 502 122 -5.3312499999999998e+00 502 11 5.3312499999999998e+00 502 20 -5.3333333333333330e+00 502 837 -1.5997916666666667e+01 502 132 -5.3312499999999998e+00 502 138 5.3395833333333327e+00 502 505 -1.5997916666666665e+01 502 139 5.3333333333333330e+00 502 503 -1.5997916666666667e+01 502 570 -1.5997916666666665e+01 502 25 5.3312499999999998e+00 502 23 -5.3333333333333330e+00 503 503 6.4029166666666654e+01 503 572 2.1329166666666662e+01 503 131 -5.3312499999999998e+00 503 122 1.0416666666666664e-02 503 138 -5.3312499999999998e+00 503 139 1.0667708333333334e+01 503 23 -1.4465734552327348e-19 503 570 2.1329166666666662e+01 503 502 -1.5997916666666667e+01 503 25 -2.1329166666666662e+01 504 504 3.2020833333333336e+01 505 505 6.4029166666666669e+01 505 131 -5.3312499999999998e+00 505 20 1.2659172094511536e-19 505 132 1.0416666666666664e-02 505 837 2.1329166666666662e+01 505 138 -5.3312499999999998e+00 505 502 -1.5997916666666665e+01 505 139 1.0667708333333334e+01 505 828 -2.1329166666666662e+01 505 11 -2.1329166666666662e+01 506 506 6.4029166666666654e+01 506 23 1.2659172094511536e-19 506 512 2.1329166666666662e+01 506 43 -5.3312499999999998e+00 506 502 -1.5997916666666665e+01 506 41 1.0416666666666664e-02 506 39 -5.3312499999999998e+00 506 38 1.0667708333333334e+01 506 499 -2.1329166666666662e+01 506 27 -2.1329166666666662e+01 507 507 6.4029166666666669e+01 507 43 -5.3312499999999998e+00 507 20 -1.4465734552327348e-19 507 509 2.1329166666666662e+01 507 502 -1.5997916666666667e+01 507 14 -2.1329166666666662e+01 507 40 1.0416666666666664e-02 507 497 -2.1329166666666662e+01 507 39 -5.3312499999999998e+00 507 38 1.0667708333333334e+01 508 508 6.4029166666666669e+01 508 39 5.3312499999999998e+00 508 21 -1.4465734552327348e-19 508 40 -1.0416666666666664e-02 508 511 -2.1329166666666662e+01 508 45 5.3312499999999998e+00 508 872 1.5997916666666665e+01 508 46 -1.0667708333333334e+01 508 497 2.1329166666666662e+01 508 14 2.1329166666666662e+01 509 509 6.4029166666666669e+01 509 19 5.3312499999999998e+00 509 44 -1.4465734552327348e-19 509 510 -2.1329166666666662e+01 509 846 -1.5997916666666667e+01 509 38 1.4465734552327348e-19 509 40 2.1329166666666662e+01 509 43 -2.1334374999999998e+01 509 14 -1.0416666666666664e-02 509 507 2.1329166666666662e+01 509 502 -1.5997916666666665e+01 509 20 -1.0667708333333334e+01 510 510 6.4029166666666669e+01 510 45 5.3312499999999998e+00 510 21 1.4465734552327348e-19 510 511 -2.1329166666666662e+01 510 848 1.5997916666666667e+01 510 20 -1.4465734552327348e-19 510 14 2.1329166666666662e+01 510 19 -2.1334374999999998e+01 510 40 -1.0416666666666664e-02 510 509 -2.1329166666666662e+01 510 43 5.3312499999999998e+00 510 846 1.5997916666666665e+01 510 44 -1.0667708333333334e+01 511 511 6.4029166666666669e+01 511 46 -1.2659172094511536e-19 511 508 -2.1329166666666662e+01 511 872 -1.5997916666666667e+01 511 44 1.4465734552327348e-19 511 40 2.1329166666666662e+01 511 45 -2.1334374999999998e+01 511 14 -1.0416666666666664e-02 511 510 -2.1329166666666662e+01 511 848 -1.5997916666666665e+01 511 19 5.3312499999999998e+00 511 21 -1.0667708333333334e+01 512 512 6.4029166666666654e+01 512 51 9.9486666632977745e-20 512 38 -1.4465734552327348e-19 512 41 2.1329166666666662e+01 512 43 -2.1334374999999998e+01 512 506 2.1329166666666662e+01 512 502 -1.5997916666666667e+01 512 27 -1.0416666666666664e-02 512 513 -2.1329166666666662e+01 512 561 -1.5997916666666665e+01 512 26 5.3312499999999998e+00 512 23 -1.0667708333333334e+01 513 513 6.4029166666666654e+01 513 36 -1.4465734552327348e-19 513 515 -2.1329166666666662e+01 513 562 1.5997916666666665e+01 513 41 -1.0416666666666664e-02 513 43 5.3312499999999998e+00 513 51 -1.0667708333333334e+01 513 23 1.2659172094511536e-19 513 512 -2.1329166666666662e+01 513 561 1.5997916666666667e+01 513 27 2.1329166666666662e+01 513 26 -2.1334374999999998e+01 513 2865 5.3312499999999998e+00 514 514 6.4029166666666669e+01 514 36 1.4465734552327348e-19 514 515 -2.1329166666666662e+01 514 517 1.5997916666666667e+01 514 27 2.1329166666666662e+01 514 41 -1.0416666666666664e-02 514 499 2.1329166666666662e+01 514 39 5.3312499999999998e+00 514 42 -1.0667708333333334e+01 514 2865 5.3312499999999998e+00 515 515 6.4029166666666669e+01 515 26 5.3312499999999998e+00 515 51 -9.9486666632977745e-20 515 513 -2.1329166666666662e+01 515 562 -1.5997916666666667e+01 515 42 1.4465734552327348e-19 515 41 2.1329166666666662e+01 515 27 -1.0416666666666664e-02 515 514 -2.1329166666666662e+01 515 517 -1.5997916666666665e+01 515 36 -1.0667708333333334e+01 515 2865 -2.1334374999999998e+01 516 516 6.4029166666666654e+01 516 5 1.4465734552327348e-19 516 517 -1.5997916666666665e+01 516 39 -5.3312499999999998e+00 516 42 1.0667708333333334e+01 516 495 -2.1329166666666662e+01 516 3462 -2.1329166666666662e+01 516 2865 -5.3312499999999998e+00 516 2868 1.0416666666666664e-02 516 2887 -2.1329166666666662e+01 517 517 7.4687500000250012e+01 517 33 5.3333333332812494e+00 517 518 -2.1333333333291666e+01 517 41 -5.3312499999999998e+00 517 5 -2.4000000000010417e+01 517 516 -1.5997916666666665e+01 517 42 5.3333333333333330e+00 517 514 1.5997916666666667e+01 517 515 -1.5997916666666665e+01 517 27 5.3312499999999998e+00 517 36 -1.3333333333343749e+01 517 5053 -1.0666666666583334e+01 517 4353 5.3333333333229165e+00 517 2887 5.3312499999999998e+00 517 3462 1.5997916666666667e+01 517 2868 -5.3312499999999998e+00 517 2865 5.3395833333333327e+00 518 518 4.2666666666999994e+01 518 36 1.8812360437258079e-27 518 33 -1.0666666666729165e+01 518 517 -2.1333333333291666e+01 518 5 1.0666666666625000e+01 518 5057 1.0666666666666666e+01 518 5053 1.0666666666666666e+01 518 4353 -1.0666666666729165e+01 519 519 4.2666666666916669e+01 520 520 6.4029166666666669e+01 520 48 1.4465734552327348e-19 520 50 -2.1334374999999998e+01 520 521 -2.1329166666666662e+01 520 2867 -1.4465734552327348e-19 520 3469 2.1329166666666662e+01 520 2868 2.1329166666666662e+01 520 2887 -1.0416666666666664e-02 521 521 6.4029166666666669e+01 521 50 5.3312499999999998e+00 521 495 2.1329166666666662e+01 521 39 5.3312499999999998e+00 521 48 -1.0667708333333334e+01 521 520 -2.1329166666666662e+01 521 2868 -1.0416666666666664e-02 521 2887 2.1329166666666662e+01 522 522 3.2020833333333336e+01 523 523 6.4029166666666669e+01 523 90 1.4465734552327348e-19 523 549 2.1329166666666662e+01 523 78 -1.2659172094511536e-19 523 79 -2.1329166666666662e+01 523 75 2.1334374999999998e+01 523 54 1.0416666666666664e-02 523 544 -2.1329166666666662e+01 524 524 3.2020833333333336e+01 525 525 6.4029166666666654e+01 525 88 -1.2659172094511536e-19 525 74 1.4465734552327348e-19 525 76 -2.1329166666666662e+01 525 75 2.1334374999999998e+01 525 535 -2.1329166666666662e+01 525 8 1.0416666666666664e-02 525 536 2.1329166666666662e+01 526 526 3.2020833333333336e+01 527 527 6.4029166666666669e+01 527 78 1.4465734552327348e-19 527 542 2.1329166666666662e+01 527 74 -1.4465734552327348e-19 527 77 -2.1329166666666662e+01 527 75 2.1334374999999998e+01 527 67 1.0416666666666664e-02 527 534 -2.1329166666666662e+01 528 528 3.2020833333333336e+01 529 529 6.4029166666666669e+01 529 88 1.4465734552327348e-19 529 832 -2.1329166666666662e+01 529 90 -1.4465734552327348e-19 529 89 -2.1329166666666662e+01 529 75 2.1334374999999998e+01 529 351 1.0416666666666664e-02 529 812 -2.1329166666666662e+01 530 530 6.4041666666666671e+01 530 76 -5.3312499999999998e+00 530 67 5.3312499999999998e+00 530 540 -1.5997916666666667e+01 530 77 -5.3312499999999998e+00 530 91 5.3395833333333327e+00 530 534 -1.5997916666666665e+01 530 74 5.3333333333333330e+00 530 535 -1.5997916666666667e+01 530 539 -1.5997916666666665e+01 530 8 5.3312499999999998e+00 530 266 -5.3312499999999998e+00 530 17 5.3312499999999998e+00 530 22 -5.3333333333333330e+00 530 877 -1.5997916666666667e+01 530 258 -5.3312499999999998e+00 530 264 5.3395833333333327e+00 530 533 -1.5997916666666665e+01 530 265 5.3333333333333330e+00 530 531 -1.5997916666666667e+01 530 894 1.5997916666666665e+01 530 65 5.3312499999999998e+00 530 63 -5.3333333333333330e+00 531 531 6.4029166666666654e+01 531 871 -2.1329166666666662e+01 531 257 -5.3312499999999998e+00 531 266 1.0416666666666664e-02 531 264 -5.3312499999999998e+00 531 265 1.0667708333333334e+01 531 63 -1.4465734552327348e-19 531 894 -2.1329166666666662e+01 531 530 -1.5997916666666667e+01 531 65 -2.1329166666666662e+01 532 532 3.2020833333333336e+01 533 533 6.4029166666666669e+01 533 257 -5.3312499999999998e+00 533 22 1.2659172094511536e-19 533 258 1.0416666666666664e-02 533 877 2.1329166666666662e+01 533 264 -5.3312499999999998e+00 533 530 -1.5997916666666665e+01 533 265 1.0667708333333334e+01 533 867 -2.1329166666666662e+01 533 17 -2.1329166666666662e+01 534 534 6.4029166666666654e+01 534 63 1.2659172094511536e-19 534 540 2.1329166666666662e+01 534 91 -5.3312499999999998e+00 534 530 -1.5997916666666665e+01 534 77 1.0416666666666664e-02 534 75 -5.3312499999999998e+00 534 74 1.0667708333333334e+01 534 527 -2.1329166666666662e+01 534 67 -2.1329166666666662e+01 535 535 6.4029166666666669e+01 535 91 -5.3312499999999998e+00 535 22 -1.4465734552327348e-19 535 539 2.1329166666666662e+01 535 530 -1.5997916666666667e+01 535 8 -2.1329166666666662e+01 535 76 1.0416666666666664e-02 535 525 -2.1329166666666662e+01 535 75 -5.3312499999999998e+00 535 74 1.0667708333333334e+01 536 536 6.4029166666666669e+01 536 75 5.3312499999999998e+00 536 18 -1.4465734552327348e-19 536 76 -1.0416666666666664e-02 536 537 -2.1329166666666662e+01 536 86 5.3312499999999998e+00 536 831 1.5997916666666665e+01 536 88 -1.0667708333333334e+01 536 525 2.1329166666666662e+01 536 8 2.1329166666666662e+01 537 537 6.4029166666666669e+01 537 88 -1.2659172094511536e-19 537 536 -2.1329166666666662e+01 537 831 -1.5997916666666667e+01 537 85 1.4465734552327348e-19 537 76 2.1329166666666662e+01 537 86 -2.1334374999999998e+01 537 8 -1.0416666666666664e-02 537 538 -2.1329166666666662e+01 537 840 1.5997916666666665e+01 537 19 5.3312499999999998e+00 537 18 -1.0667708333333334e+01 538 538 6.4029166666666654e+01 538 22 -1.4465734552327348e-19 538 539 -2.1329166666666662e+01 538 91 5.3312499999999998e+00 538 850 1.5997916666666665e+01 538 76 -1.0416666666666664e-02 538 86 5.3312499999999998e+00 538 85 -1.0667708333333334e+01 538 18 1.4465734552327348e-19 538 537 -2.1329166666666662e+01 538 840 -1.5997916666666667e+01 538 8 2.1329166666666662e+01 538 19 -2.1334374999999998e+01 539 539 6.4029166666666669e+01 539 19 5.3312499999999998e+00 539 85 -1.4465734552327348e-19 539 538 -2.1329166666666662e+01 539 850 -1.5997916666666667e+01 539 74 1.4465734552327348e-19 539 76 2.1329166666666662e+01 539 91 -2.1334374999999998e+01 539 8 -1.0416666666666664e-02 539 535 2.1329166666666662e+01 539 530 -1.5997916666666665e+01 539 22 -1.0667708333333334e+01 540 540 6.4029166666666654e+01 540 99 9.9486666632977745e-20 540 74 -1.4465734552327348e-19 540 77 2.1329166666666662e+01 540 91 -2.1334374999999998e+01 540 534 2.1329166666666662e+01 540 530 -1.5997916666666667e+01 540 67 -1.0416666666666664e-02 540 541 -2.1329166666666662e+01 540 895 1.5997916666666665e+01 540 63 -1.0667708333333334e+01 541 541 6.4029166666666654e+01 541 543 -2.1329166666666662e+01 541 81 5.3312499999999998e+00 541 77 -1.0416666666666664e-02 541 91 5.3312499999999998e+00 541 99 -1.0667708333333334e+01 541 63 1.2659172094511536e-19 541 540 -2.1329166666666662e+01 541 895 -1.5997916666666667e+01 541 67 2.1329166666666662e+01 542 542 6.4029166666666669e+01 542 81 5.3312499999999998e+00 542 543 -2.1329166666666662e+01 542 67 2.1329166666666662e+01 542 77 -1.0416666666666664e-02 542 527 2.1329166666666662e+01 542 75 5.3312499999999998e+00 542 78 -1.0667708333333334e+01 543 543 6.4029166666666669e+01 543 99 -9.9486666632977745e-20 543 541 -2.1329166666666662e+01 543 78 1.4465734552327348e-19 543 77 2.1329166666666662e+01 543 81 -2.1334374999999998e+01 543 67 -1.0416666666666664e-02 543 542 -2.1329166666666662e+01 544 544 6.4029166666666654e+01 544 546 2.1329166666666662e+01 544 81 -5.3312499999999998e+00 544 79 1.0416666666666664e-02 544 75 -5.3312499999999998e+00 544 78 1.0667708333333334e+01 544 523 -2.1329166666666662e+01 544 54 -2.1329166666666662e+01 545 545 3.2020833333333336e+01 546 546 6.4029166666666669e+01 546 78 -1.2659172094511536e-19 546 544 2.1329166666666662e+01 546 84 1.4465734552327348e-19 546 79 2.1329166666666662e+01 546 81 -2.1334374999999998e+01 546 54 -1.0416666666666664e-02 546 547 -2.1329166666666662e+01 547 547 6.4029166666666654e+01 547 62 -1.4465734552327348e-19 547 548 -2.1329166666666662e+01 547 93 5.3312499999999998e+00 547 694 1.5997916666666665e+01 547 79 -1.0416666666666664e-02 547 81 5.3312499999999998e+00 547 84 -1.0667708333333334e+01 547 546 -2.1329166666666662e+01 547 54 2.1329166666666662e+01 548 548 6.4029166666666669e+01 548 84 -1.4465734552327348e-19 548 547 -2.1329166666666662e+01 548 694 -1.5997916666666667e+01 548 90 1.4465734552327348e-19 548 79 2.1329166666666662e+01 548 93 -2.1334374999999998e+01 548 54 -1.0416666666666664e-02 548 549 -2.1329166666666662e+01 548 811 -1.5997916666666665e+01 548 62 -1.0667708333333334e+01 549 549 6.4029166666666669e+01 549 93 5.3312499999999998e+00 549 79 -1.0416666666666664e-02 549 523 2.1329166666666662e+01 549 75 5.3312499999999998e+00 549 90 -1.0667708333333334e+01 549 62 1.4465734552327348e-19 549 548 -2.1329166666666662e+01 549 811 1.5997916666666667e+01 549 54 2.1329166666666662e+01 550 550 7.4687500000249997e+01 550 108 -5.3333333333229165e+00 550 554 -1.0666666666583334e+01 550 574 2.1333333333291666e+01 550 33 -5.3333333332812494e+00 550 124 5.3312499999999998e+00 550 25 -5.3312499999999998e+00 550 30 1.3333333333343749e+01 550 558 -1.5997916666666667e+01 550 122 5.3312499999999998e+00 550 120 -5.3395833333333327e+00 550 571 -1.5997916666666665e+01 550 123 -5.3333333333333330e+00 550 573 1.5997916666666667e+01 550 551 -1.5997916666666665e+01 550 102 -5.3312499999999998e+00 550 100 2.4000000000010417e+01 551 551 6.4029166666666669e+01 551 129 9.9486666632977745e-20 551 578 2.1329166666666662e+01 551 553 -1.5997916666666667e+01 551 123 -1.4465734552327348e-19 551 124 -2.1329166666666662e+01 551 120 2.1334374999999998e+01 551 102 1.0416666666666664e-02 551 573 -2.1329166666666662e+01 551 550 -1.5997916666666665e+01 551 100 1.0667708333333334e+01 551 1143 -5.3312499999999998e+00 552 552 6.4000000000583327e+01 552 554 -3.2000000000020833e+01 552 813 2.1333333333208333e+01 552 108 5.3333333333229165e+00 552 112 1.0416666666666666e-11 552 109 -1.0416666666666666e-10 552 114 -5.3333333332916668e+00 552 221 1.0416666666666666e-11 552 230 -6.2499999999999991e-11 552 556 -1.0666666666583334e+01 552 815 1.0666666666666666e+01 552 100 1.0666666666625000e+01 552 553 -1.0666666666583334e+01 552 4154 5.3333333332812494e+00 552 1617 1.0416666666666666e-11 552 1613 4.1666666666666665e-11 552 1143 1.0416666666666666e-11 552 1146 -1.5999999999958334e+01 552 2100 1.0666666666666666e+01 553 553 6.4020833333541660e+01 553 128 5.3312499999999998e+00 553 102 -5.3312499999999998e+00 553 551 -1.5997916666666667e+01 553 124 5.3312499999999998e+00 553 120 -5.3395833333333327e+00 553 578 -1.5997916666666665e+01 553 129 -5.3333333333333330e+00 553 649 -1.5997916666666667e+01 553 559 -1.5997916666666665e+01 553 222 -5.3312499999999998e+00 553 230 1.3333333333322916e+01 553 552 -1.0666666666583334e+01 553 100 1.3333333333322916e+01 553 1617 -2.6635416666250005e+00 553 1613 -5.3333333333124999e+00 553 2100 -2.1333333333312499e+01 553 1143 -2.6635416666250005e+00 553 1146 -5.3333333333124999e+00 554 554 5.3333333333749991e+01 554 114 2.8320667257631078e-28 554 552 -3.2000000000020833e+01 554 813 -2.1333333333291666e+01 554 26 -2.2470898404921788e-28 554 108 -5.3333333333437496e+00 554 100 -1.0666666666791667e+01 554 33 6.2500000000000004e-11 554 550 -1.0666666666583334e+01 554 574 -1.0666666666666666e+01 554 30 5.3333333333229165e+00 554 110 -4.5860624244724788e-28 554 109 5.3333333333229165e+00 554 555 -1.0666666666666666e+01 554 560 -1.0666666666666666e+01 554 1146 1.0666666666625000e+01 554 4154 -5.3333333333229165e+00 555 555 5.3354166666874995e+01 555 33 -2.2851328271989659e-27 555 122 5.3312499999999998e+00 555 113 -5.3312499999999998e+00 555 557 -1.5997916666666667e+01 555 121 5.3312499999999998e+00 555 120 -5.3395833333333327e+00 555 565 1.5997916666666665e+01 555 119 -5.3333333333333330e+00 555 564 1.5997916666666667e+01 555 558 -1.5997916666666665e+01 555 25 -5.3312499999999998e+00 555 26 -2.6635416666145835e+00 555 30 8.0000000000000000e+00 555 560 1.0666666666562499e+01 555 554 -1.0666666666666666e+01 555 110 -2.6635416666145830e+00 555 109 8.0000000000000000e+00 555 4154 -1.8812360437258079e-27 556 556 6.4020833333541660e+01 556 121 5.3312499999999998e+00 556 222 -5.3312499999999998e+00 556 559 -1.5997916666666667e+01 556 128 5.3312499999999998e+00 556 120 -5.3395833333333327e+00 556 648 -1.5997916666666665e+01 556 142 -5.3333333333333330e+00 556 114 -5.3333333333124999e+00 556 815 -2.1333333333312499e+01 556 552 -1.0666666666583334e+01 556 221 -2.6635416666250005e+00 556 230 1.3333333333322916e+01 556 566 -1.5997916666666667e+01 556 557 -1.5997916666666665e+01 556 113 -5.3312499999999998e+00 556 112 -2.6635416666250000e+00 556 109 1.3333333333322916e+01 556 1613 -5.3333333333124999e+00 557 557 6.4029166666666654e+01 557 142 -1.4465734552327348e-19 557 110 -5.3312499999999998e+00 557 119 9.9486666632977745e-20 557 121 -2.1329166666666662e+01 557 120 2.1334374999999998e+01 557 565 -2.1329166666666662e+01 557 555 -1.5997916666666667e+01 557 113 1.0416666666666664e-02 557 566 2.1329166666666662e+01 557 556 -1.5997916666666665e+01 557 112 -5.3312499999999998e+00 557 109 1.0667708333333334e+01 558 558 6.4029166666666669e+01 558 123 1.2659172094511536e-19 558 571 2.1329166666666662e+01 558 550 -1.5997916666666667e+01 558 119 -1.4465734552327348e-19 558 122 -2.1329166666666662e+01 558 120 2.1334374999999998e+01 558 25 1.0416666666666664e-02 558 564 -2.1329166666666662e+01 558 555 -1.5997916666666665e+01 558 26 -5.3312499999999998e+00 558 30 1.0667708333333334e+01 559 559 6.4029166666666669e+01 559 221 -5.3312499999999998e+00 559 142 1.2659172094511536e-19 559 648 2.1329166666666662e+01 559 556 -1.5997916666666667e+01 559 129 -1.4465734552327348e-19 559 128 -2.1329166666666662e+01 559 120 2.1334374999999998e+01 559 222 1.0416666666666664e-02 559 649 2.1329166666666662e+01 559 553 -1.5997916666666665e+01 559 230 1.0667708333333334e+01 559 1617 -5.3312499999999998e+00 560 560 4.2666666667083327e+01 560 111 3.6295685768920020e-28 560 36 -1.8812360437258079e-27 560 562 -1.0666666666562499e+01 560 30 1.8812360437258079e-27 560 26 1.0666666666562499e+01 560 33 -1.0666666666666666e+01 560 109 2.2851328271989659e-27 560 555 1.0666666666562499e+01 560 554 -1.0666666666666666e+01 560 110 1.0666666666562499e+01 560 5053 1.0666666666666666e+01 560 4154 -1.0666666666666666e+01 561 561 6.4041666666666671e+01 561 121 -5.3312499999999998e+00 561 25 5.3312499999999998e+00 561 570 -1.5997916666666667e+01 561 122 -5.3312499999999998e+00 561 138 5.3395833333333327e+00 561 564 -1.5997916666666665e+01 561 119 5.3333333333333330e+00 561 565 -1.5997916666666667e+01 561 567 -1.5997916666666665e+01 561 113 5.3312499999999998e+00 561 41 -5.3312499999999998e+00 561 110 -5.3395833333333327e+00 561 117 -5.3333333333333330e+00 561 864 1.5997916666666667e+01 561 43 5.3395833333333327e+00 561 563 -1.5997916666666665e+01 561 51 5.3333333333333330e+00 561 513 1.5997916666666667e+01 561 512 -1.5997916666666665e+01 561 27 5.3312499999999998e+00 561 26 -5.3395833333333327e+00 561 23 -5.3333333333333330e+00 561 2488 5.3312499999999998e+00 561 2866 -5.3312499999999998e+00 562 562 5.3354166666874995e+01 562 33 3.6295685768920020e-28 562 560 -1.0666666666562499e+01 562 27 5.3312499999999998e+00 562 26 2.6635416666145835e+00 562 36 -8.0000000000000000e+00 562 515 -1.5997916666666667e+01 562 41 -5.3312499999999998e+00 562 513 1.5997916666666665e+01 562 51 5.3333333333333330e+00 562 563 -1.5997916666666667e+01 562 110 2.6635416666145835e+00 562 111 -8.0000000000000000e+00 562 4154 -1.8812360437258079e-27 562 5053 -1.0666666666666666e+01 562 2866 -5.3312499999999998e+00 562 2865 5.3395833333333327e+00 562 3465 1.5997916666666665e+01 562 2488 5.3312499999999998e+00 563 563 6.4029166666666669e+01 563 117 1.4465734552327348e-19 563 864 -2.1329166666666662e+01 563 43 -5.3312499999999998e+00 563 561 -1.5997916666666665e+01 563 51 1.0667708333333334e+01 563 111 -1.4465734552327348e-19 563 562 -1.5997916666666667e+01 563 110 2.1334374999999998e+01 563 2865 -5.3312499999999998e+00 563 2866 1.0416666666666664e-02 563 3465 -2.1329166666666662e+01 563 2488 -2.1329166666666662e+01 564 564 6.4029166666666654e+01 564 23 1.4465734552327348e-19 564 570 2.1329166666666662e+01 564 138 -5.3312499999999998e+00 564 561 -1.5997916666666665e+01 564 122 1.0416666666666664e-02 564 120 -5.3312499999999998e+00 564 119 1.0667708333333334e+01 564 30 -1.4465734552327348e-19 564 558 -2.1329166666666662e+01 564 555 1.5997916666666667e+01 564 25 -2.1329166666666662e+01 564 26 2.1334374999999998e+01 565 565 6.4029166666666669e+01 565 138 -5.3312499999999998e+00 565 117 -1.2659172094511536e-19 565 567 2.1329166666666662e+01 565 561 -1.5997916666666667e+01 565 109 1.4465734552327348e-19 565 113 -2.1329166666666662e+01 565 110 2.1334374999999998e+01 565 121 1.0416666666666664e-02 565 557 -2.1329166666666662e+01 565 120 -5.3312499999999998e+00 565 555 1.5997916666666665e+01 565 119 1.0667708333333334e+01 566 566 6.4029166666666669e+01 566 120 5.3312499999999998e+00 566 118 -1.4465734552327348e-19 566 121 -1.0416666666666664e-02 566 569 -2.1329166666666662e+01 566 141 5.3312499999999998e+00 566 819 1.5997916666666665e+01 566 142 -1.0667708333333334e+01 566 109 1.4465734552327348e-19 566 557 2.1329166666666662e+01 566 556 -1.5997916666666667e+01 566 113 2.1329166666666662e+01 566 112 -2.1334374999999998e+01 567 567 6.4029166666666669e+01 567 140 -1.4465734552327348e-19 567 568 -2.1329166666666662e+01 567 863 1.5997916666666667e+01 567 119 9.9486666632977745e-20 567 121 2.1329166666666662e+01 567 138 -2.1334374999999998e+01 567 113 -1.0416666666666664e-02 567 565 2.1329166666666662e+01 567 561 -1.5997916666666665e+01 567 110 5.3312499999999998e+00 567 117 -1.0667708333333334e+01 567 2490 5.3312499999999998e+00 568 568 6.4029166666666669e+01 568 141 5.3312499999999998e+00 568 118 1.4465734552327348e-19 568 569 -2.1329166666666662e+01 568 938 1.5997916666666667e+01 568 117 -1.2659172094511536e-19 568 113 2.1329166666666662e+01 568 121 -1.0416666666666664e-02 568 567 -2.1329166666666662e+01 568 138 5.3312499999999998e+00 568 863 -1.5997916666666665e+01 568 140 -1.0667708333333334e+01 568 2490 -2.1334374999999998e+01 569 569 6.4029166666666669e+01 569 112 5.3312499999999998e+00 569 142 -1.4465734552327348e-19 569 566 -2.1329166666666662e+01 569 819 -1.5997916666666667e+01 569 140 1.4465734552327348e-19 569 121 2.1329166666666662e+01 569 141 -2.1334374999999998e+01 569 113 -1.0416666666666664e-02 569 568 -2.1329166666666662e+01 569 938 -1.5997916666666665e+01 569 118 -1.0667708333333334e+01 569 2490 5.3312499999999998e+00 570 570 6.4029166666666669e+01 570 26 5.3312499999999998e+00 570 119 -1.4465734552327348e-19 570 564 2.1329166666666662e+01 570 561 -1.5997916666666667e+01 570 139 1.4465734552327348e-19 570 122 2.1329166666666662e+01 570 138 -2.1334374999999998e+01 570 25 -1.0416666666666664e-02 570 503 2.1329166666666662e+01 570 502 -1.5997916666666665e+01 570 23 -1.0667708333333334e+01 571 571 6.4029166666666669e+01 571 131 5.3312499999999998e+00 571 572 -2.1329166666666662e+01 571 30 -1.4465734552327348e-19 571 25 2.1329166666666662e+01 571 122 -1.0416666666666664e-02 571 558 2.1329166666666662e+01 571 120 5.3312499999999998e+00 571 550 -1.5997916666666665e+01 571 123 -1.0667708333333334e+01 572 572 6.4029166666666669e+01 572 139 -1.4465734552327348e-19 572 503 2.1329166666666662e+01 572 123 1.2659172094511536e-19 572 122 2.1329166666666662e+01 572 131 -2.1334374999999998e+01 572 25 -1.0416666666666664e-02 572 571 -2.1329166666666662e+01 573 573 6.4029166666666654e+01 573 579 2.1329166666666662e+01 573 131 -5.3312499999999998e+00 573 124 1.0416666666666664e-02 573 120 -5.3312499999999998e+00 573 123 1.0667708333333334e+01 573 100 -1.4465734552327348e-19 573 551 -2.1329166666666662e+01 573 550 1.5997916666666667e+01 573 102 -2.1329166666666662e+01 574 574 4.2666666666999994e+01 574 100 1.0666666666625000e+01 574 30 -1.8812360437258079e-27 574 550 2.1333333333291666e+01 574 554 -1.0666666666666666e+01 574 33 -1.0666666666729165e+01 574 825 1.0666666666666666e+01 574 108 -1.0666666666729165e+01 575 575 4.2666666666916662e+01 576 576 3.2020833333333336e+01 577 577 6.4029166666666669e+01 577 134 -1.4465734552327348e-19 577 580 -2.1329166666666662e+01 577 622 1.5997916666666667e+01 577 129 9.9486666632977745e-20 577 124 2.1329166666666662e+01 577 126 -2.1334374999999998e+01 577 102 -1.0416666666666664e-02 577 578 -2.1329166666666662e+01 577 621 1.5997916666666665e+01 577 103 -1.0667708333333334e+01 577 1143 5.3312499999999998e+00 578 578 6.4029166666666654e+01 578 100 -1.4465734552327348e-19 578 551 2.1329166666666662e+01 578 120 5.3312499999999998e+00 578 553 -1.5997916666666665e+01 578 124 -1.0416666666666664e-02 578 126 5.3312499999999998e+00 578 129 -1.0667708333333334e+01 578 103 1.2659172094511536e-19 578 577 -2.1329166666666662e+01 578 621 -1.5997916666666667e+01 578 102 2.1329166666666662e+01 578 1143 -2.1334374999999998e+01 579 579 6.4029166666666669e+01 579 123 -1.4465734552327348e-19 579 573 2.1329166666666662e+01 579 134 1.4465734552327348e-19 579 124 2.1329166666666662e+01 579 131 -2.1334374999999998e+01 579 102 -1.0416666666666664e-02 579 580 -2.1329166666666662e+01 580 580 6.4029166666666654e+01 580 103 -1.2659172094511536e-19 580 577 -2.1329166666666662e+01 580 126 5.3312499999999998e+00 580 622 -1.5997916666666665e+01 580 124 -1.0416666666666664e-02 580 131 5.3312499999999998e+00 580 134 -1.0667708333333334e+01 580 579 -2.1329166666666662e+01 580 102 2.1329166666666662e+01 581 581 6.4020833333541660e+01 581 337 5.3333333333124999e+00 581 148 -5.3333333333124999e+00 581 584 -1.5999999999979167e+01 581 328 5.3333333333124999e+00 581 324 -5.3333333333958333e+00 581 614 1.5999999999979167e+01 581 338 -5.3333333333333330e+00 581 615 1.5999999999979167e+01 581 592 -1.5999999999979167e+01 581 185 -5.3333333333124999e+00 581 199 5.3312499999999998e+00 581 184 -5.3312499999999998e+00 581 186 5.3333333333333330e+00 581 589 -1.5997916666666667e+01 581 197 5.3312499999999998e+00 581 195 -5.3395833333333327e+00 581 610 -1.5997916666666665e+01 581 198 -5.3333333333333330e+00 581 612 1.5997916666666667e+01 581 582 -1.5997916666666665e+01 581 147 -5.3312499999999998e+00 581 145 5.3333333333333330e+00 582 582 6.4029166666666669e+01 582 206 1.4465734552327348e-19 582 620 2.1329166666666662e+01 582 583 -1.5997916666666667e+01 582 198 -9.9486666632977745e-20 582 199 -2.1329166666666662e+01 582 195 2.1334374999999998e+01 582 147 1.0416666666666664e-02 582 612 -2.1329166666666662e+01 582 581 -1.5997916666666665e+01 582 145 1.0667708333333334e+01 582 2810 -5.3312499999999998e+00 583 583 6.4020833333541660e+01 583 205 5.3312499999999998e+00 583 147 -5.3312499999999998e+00 583 582 -1.5997916666666667e+01 583 199 5.3312499999999998e+00 583 195 -5.3395833333333327e+00 583 620 -1.5997916666666665e+01 583 206 -5.3333333333333330e+00 583 731 1.5997916666666667e+01 583 591 -1.5997916666666665e+01 583 316 -5.3312499999999998e+00 583 328 5.3333333333124999e+00 583 318 -5.3333333333124999e+00 583 320 5.3333333333333330e+00 583 590 -1.5999999999979167e+01 583 326 5.3333333333124999e+00 583 324 -5.3333333333958333e+00 583 728 -1.5999999999979167e+01 583 327 -5.3333333333333330e+00 583 730 1.5999999999979167e+01 583 584 -1.5999999999979167e+01 583 148 -5.3333333333124999e+00 583 145 5.3333333333333330e+00 583 2670 5.3364583333645834e+00 583 2810 5.3364583333645834e+00 584 584 6.4000000000291664e+01 584 338 1.1000665323307010e-27 584 614 -2.1333333333291666e+01 584 581 -1.5999999999979167e+01 584 327 -1.3020149240672800e-27 584 328 -2.1333333333291666e+01 584 324 2.1333333333343749e+01 584 148 1.0416666666666666e-10 584 730 -2.1333333333291666e+01 584 583 -1.5999999999979167e+01 584 145 1.0666666666677083e+01 584 2810 -5.3333333333124999e+00 585 585 6.4020833333541660e+01 585 196 5.3312499999999998e+00 585 316 -5.3312499999999998e+00 585 591 -1.5997916666666667e+01 585 205 5.3312499999999998e+00 585 195 -5.3395833333333327e+00 585 714 1.5997916666666665e+01 585 204 -5.3333333333333330e+00 585 326 5.3333333333124999e+00 585 165 -5.3333333333124999e+00 585 588 -1.5999999999979167e+01 585 325 5.3333333333124999e+00 585 324 -5.3333333333958333e+00 585 720 1.5999999999979167e+01 585 323 -5.3333333333333330e+00 585 719 1.5999999999979167e+01 585 590 -1.5999999999979167e+01 585 318 -5.3333333333124999e+00 585 315 5.3364583333645834e+00 585 320 5.3333333333333330e+00 585 604 -1.5997916666666667e+01 585 586 -1.5997916666666665e+01 585 159 -5.3312499999999998e+00 585 158 5.3364583333645825e+00 585 157 5.3333333333333330e+00 586 586 6.4029166666666654e+01 586 204 -9.9486666632977745e-20 586 155 -5.3312499999999998e+00 586 194 1.4465734552327348e-19 586 196 -2.1329166666666662e+01 586 195 2.1334374999999998e+01 586 601 -2.1329166666666662e+01 586 587 -1.5997916666666667e+01 586 159 1.0416666666666664e-02 586 604 2.1329166666666662e+01 586 585 -1.5997916666666665e+01 586 158 -5.3312499999999998e+00 586 157 1.0667708333333334e+01 587 587 6.4020833333541660e+01 587 325 5.3333333333124999e+00 587 185 -5.3333333333124999e+00 587 592 -1.5999999999979167e+01 587 337 5.3333333333124999e+00 587 324 -5.3333333333958333e+00 587 598 1.5999999999979167e+01 587 348 -5.3333333333333330e+00 587 197 5.3312499999999998e+00 587 159 -5.3312499999999998e+00 587 586 -1.5997916666666667e+01 587 196 5.3312499999999998e+00 587 195 -5.3395833333333327e+00 587 601 1.5997916666666665e+01 587 194 -5.3333333333333330e+00 587 600 1.5997916666666667e+01 587 589 -1.5997916666666665e+01 587 184 -5.3312499999999998e+00 587 181 5.3364583333645825e+00 587 186 5.3333333333333330e+00 587 599 1.5999999999979167e+01 587 588 -1.5999999999979167e+01 587 165 -5.3333333333124999e+00 587 155 5.3364583333645834e+00 587 157 5.3333333333333330e+00 588 588 6.4000000000291664e+01 588 348 -1.3020149240672800e-27 588 158 -5.3333333333124999e+00 588 323 1.1000665323307010e-27 588 325 -2.1333333333291666e+01 588 324 2.1333333333343749e+01 588 720 -2.1333333333291666e+01 588 585 -1.5999999999979167e+01 588 165 1.0416666666666666e-10 588 599 -2.1333333333291666e+01 588 587 -1.5999999999979167e+01 588 155 -5.3333333333124999e+00 588 157 1.0666666666677083e+01 589 589 6.4029166666666669e+01 589 198 1.4465734552327348e-19 589 610 2.1329166666666662e+01 589 581 -1.5997916666666667e+01 589 194 -1.4465734552327348e-19 589 197 -2.1329166666666662e+01 589 195 2.1334374999999998e+01 589 184 1.0416666666666664e-02 589 600 -2.1329166666666662e+01 589 587 -1.5997916666666665e+01 589 181 -5.3312499999999998e+00 589 186 1.0667708333333334e+01 590 590 6.4000000000291664e+01 590 327 1.5039633158038590e-27 590 728 2.1333333333291666e+01 590 583 -1.5999999999979167e+01 590 323 -1.1213657767716683e-27 590 326 -2.1333333333291666e+01 590 324 2.1333333333343749e+01 590 318 1.0416666666666666e-10 590 719 -2.1333333333291666e+01 590 585 -1.5999999999979167e+01 590 315 -5.3333333333124999e+00 590 320 1.0666666666677083e+01 590 2670 -5.3333333333124999e+00 591 591 6.4029166666666669e+01 591 315 -5.3312499999999998e+00 591 204 1.4465734552327348e-19 591 714 -2.1329166666666662e+01 591 585 -1.5997916666666667e+01 591 206 -1.4465734552327348e-19 591 205 -2.1329166666666662e+01 591 195 2.1334374999999998e+01 591 316 1.0416666666666664e-02 591 731 -2.1329166666666662e+01 591 583 -1.5997916666666665e+01 591 320 1.0667708333333334e+01 591 2670 -5.3312499999999998e+00 592 592 6.4000000000291664e+01 592 181 -5.3333333333124999e+00 592 348 1.5039633158038590e-27 592 598 -2.1333333333291666e+01 592 587 -1.5999999999979167e+01 592 338 -1.1213657767716683e-27 592 337 -2.1333333333291666e+01 592 324 2.1333333333343749e+01 592 185 1.0416666666666666e-10 592 615 -2.1333333333291666e+01 592 581 -1.5999999999979167e+01 592 186 1.0666666666677083e+01 593 593 6.4041666666666671e+01 593 196 -5.3312499999999998e+00 593 184 5.3312499999999998e+00 593 608 -1.5997916666666667e+01 593 197 -5.3312499999999998e+00 593 200 5.3395833333333327e+00 593 600 -1.5997916666666665e+01 593 194 5.3333333333333330e+00 593 601 -1.5997916666666667e+01 593 605 -1.5997916666666665e+01 593 159 5.3312499999999998e+00 593 83 -5.3312499999999998e+00 593 156 5.3312499999999998e+00 593 155 -5.3395833333333327e+00 593 169 -5.3333333333333330e+00 593 958 -1.5997916666666667e+01 593 94 -5.3312499999999998e+00 593 96 5.3395833333333327e+00 593 596 -1.5997916666666665e+01 593 97 5.3333333333333330e+00 593 594 -1.5997916666666667e+01 593 691 -1.5997916666666665e+01 593 182 5.3312499999999998e+00 593 181 -5.3395833333333327e+00 593 180 -5.3333333333333330e+00 594 594 6.4029166666666654e+01 594 192 1.2659172094511536e-19 594 693 2.1329166666666662e+01 594 93 -5.3312499999999998e+00 594 595 -1.5997916666666665e+01 594 83 1.0416666666666664e-02 594 96 -5.3312499999999998e+00 594 97 1.0667708333333334e+01 594 180 -1.4465734552327348e-19 594 691 2.1329166666666662e+01 594 593 -1.5997916666666667e+01 594 182 -2.1329166666666662e+01 594 181 2.1334374999999998e+01 595 595 6.4020833333541660e+01 595 417 -5.3333333333124999e+00 595 166 5.3333333333124999e+00 595 956 1.5999999999979167e+01 595 424 -5.3333333333124999e+00 595 423 5.3333333333958333e+00 595 603 -1.5999999999979167e+01 595 422 5.3333333333333330e+00 595 602 -1.5999999999979167e+01 595 927 -1.5999999999979167e+01 595 179 5.3333333333124999e+00 595 94 -5.3312499999999998e+00 595 182 5.3312499999999998e+00 595 181 -5.3364583333645825e+00 595 192 -5.3333333333333330e+00 595 693 -1.5997916666666667e+01 595 83 -5.3312499999999998e+00 595 93 5.3395833333333327e+00 595 594 -1.5997916666666665e+01 595 97 5.3333333333333330e+00 595 596 -1.5997916666666667e+01 595 955 1.5997916666666665e+01 595 156 5.3312499999999998e+00 595 155 -5.3364583333645825e+00 595 154 -5.3333333333333330e+00 596 596 6.4029166666666669e+01 596 93 -5.3312499999999998e+00 596 169 9.9486666632977745e-20 596 94 1.0416666666666664e-02 596 958 2.1329166666666662e+01 596 96 -5.3312499999999998e+00 596 593 -1.5997916666666665e+01 596 97 1.0667708333333334e+01 596 154 -1.4465734552327348e-19 596 955 -2.1329166666666662e+01 596 595 -1.5997916666666667e+01 596 156 -2.1329166666666662e+01 596 155 2.1334374999999998e+01 597 597 6.4000000000416662e+01 597 424 -5.3333333333124999e+00 597 179 5.3333333333124999e+00 597 915 1.5999999999979167e+01 597 417 -5.3333333333124999e+00 597 414 5.3333333333958333e+00 597 602 -1.5999999999979167e+01 597 422 5.3333333333333330e+00 597 603 -1.5999999999979167e+01 597 920 1.5999999999979167e+01 597 166 5.3333333333124999e+00 597 337 -5.3333333333124999e+00 597 165 5.3333333333124999e+00 597 155 -5.3333333333958333e+00 597 175 -5.3333333333333330e+00 597 725 -1.5999999999979167e+01 597 325 -5.3333333333124999e+00 597 339 5.3333333333958333e+00 597 599 -1.5999999999979167e+01 597 348 5.3333333333333330e+00 597 598 -1.5999999999979167e+01 597 914 -1.5999999999979167e+01 597 185 5.3333333333124999e+00 597 181 -5.3333333333958333e+00 597 177 -5.3333333333333330e+00 598 598 6.4000000000291664e+01 598 186 1.3233141685082473e-27 598 592 -2.1333333333291666e+01 598 324 -5.3333333333124999e+00 598 587 1.5999999999979167e+01 598 337 1.0416666666666666e-10 598 339 -5.3333333333124999e+00 598 348 1.0666666666677083e+01 598 177 -1.1000665323307010e-27 598 914 2.1333333333291666e+01 598 597 -1.5999999999979167e+01 598 185 -2.1333333333291666e+01 598 181 2.1333333333343749e+01 599 599 6.4000000000291664e+01 599 324 -5.3333333333124999e+00 599 175 1.1213657767716683e-27 599 325 1.0416666666666666e-10 599 725 2.1333333333291666e+01 599 339 -5.3333333333124999e+00 599 597 -1.5999999999979167e+01 599 348 1.0666666666677083e+01 599 157 -1.1000665323307010e-27 599 588 -2.1333333333291666e+01 599 587 1.5999999999979167e+01 599 165 -2.1333333333291666e+01 599 155 2.1333333333343749e+01 600 600 6.4029166666666654e+01 600 180 9.9486666632977745e-20 600 608 2.1329166666666662e+01 600 200 -5.3312499999999998e+00 600 593 -1.5997916666666665e+01 600 197 1.0416666666666664e-02 600 195 -5.3312499999999998e+00 600 194 1.0667708333333334e+01 600 186 -1.4465734552327348e-19 600 589 -2.1329166666666662e+01 600 587 1.5997916666666667e+01 600 184 -2.1329166666666662e+01 600 181 2.1334374999999998e+01 601 601 6.4029166666666669e+01 601 200 -5.3312499999999998e+00 601 169 -1.4465734552327348e-19 601 605 2.1329166666666662e+01 601 593 -1.5997916666666667e+01 601 157 1.2659172094511536e-19 601 159 -2.1329166666666662e+01 601 155 2.1334374999999998e+01 601 196 1.0416666666666664e-02 601 586 -2.1329166666666662e+01 601 195 -5.3312499999999998e+00 601 587 1.5997916666666665e+01 601 194 1.0667708333333334e+01 602 602 6.4000000000291664e+01 602 177 1.1213657767716683e-27 602 915 -2.1333333333291666e+01 602 414 -5.3333333333124999e+00 602 597 -1.5999999999979167e+01 602 417 1.0416666666666666e-10 602 423 -5.3333333333124999e+00 602 422 1.0666666666677083e+01 602 192 -1.1000665323307010e-27 602 927 2.1333333333291666e+01 602 595 -1.5999999999979167e+01 602 179 -2.1333333333291666e+01 602 181 2.1333333333343749e+01 603 603 6.4000000000291664e+01 603 414 -5.3333333333124999e+00 603 175 -1.1000665323307010e-27 603 920 -2.1333333333291666e+01 603 597 -1.5999999999979167e+01 603 154 1.3233141685082473e-27 603 166 -2.1333333333291666e+01 603 155 2.1333333333343749e+01 603 424 1.0416666666666666e-10 603 956 -2.1333333333291666e+01 603 423 -5.3333333333124999e+00 603 595 -1.5999999999979167e+01 603 422 1.0666666666677083e+01 604 604 6.4029166666666669e+01 604 195 5.3312499999999998e+00 604 170 -1.4465734552327348e-19 604 196 -1.0416666666666664e-02 604 607 -2.1329166666666662e+01 604 203 5.3312499999999998e+00 604 713 1.5997916666666665e+01 604 204 -1.0667708333333334e+01 604 157 1.2659172094511536e-19 604 586 2.1329166666666662e+01 604 585 -1.5997916666666667e+01 604 159 2.1329166666666662e+01 604 158 -2.1334374999999998e+01 605 605 6.4029166666666669e+01 605 168 5.3312499999999998e+00 605 201 -1.4465734552327348e-19 605 606 -2.1329166666666662e+01 605 959 -1.5997916666666667e+01 605 194 1.4465734552327348e-19 605 196 2.1329166666666662e+01 605 200 -2.1334374999999998e+01 605 159 -1.0416666666666664e-02 605 601 2.1329166666666662e+01 605 593 -1.5997916666666665e+01 605 155 5.3312499999999998e+00 605 169 -1.0667708333333334e+01 606 606 6.4029166666666669e+01 606 203 5.3312499999999998e+00 606 170 1.4465734552327348e-19 606 607 -2.1329166666666662e+01 606 961 1.5997916666666667e+01 606 169 -1.4465734552327348e-19 606 159 2.1329166666666662e+01 606 168 -2.1334374999999998e+01 606 196 -1.0416666666666664e-02 606 605 -2.1329166666666662e+01 606 200 5.3312499999999998e+00 606 959 1.5997916666666665e+01 606 201 -1.0667708333333334e+01 607 607 6.4029166666666669e+01 607 158 5.3312499999999998e+00 607 204 -9.9486666632977745e-20 607 604 -2.1329166666666662e+01 607 713 -1.5997916666666667e+01 607 201 1.4465734552327348e-19 607 196 2.1329166666666662e+01 607 203 -2.1334374999999998e+01 607 159 -1.0416666666666664e-02 607 606 -2.1329166666666662e+01 607 961 -1.5997916666666665e+01 607 168 5.3312499999999998e+00 607 170 -1.0667708333333334e+01 608 608 6.4029166666666654e+01 608 214 1.2659172094511536e-19 608 181 5.3312499999999998e+00 608 194 -1.4465734552327348e-19 608 197 2.1329166666666662e+01 608 200 -2.1334374999999998e+01 608 600 2.1329166666666662e+01 608 593 -1.5997916666666667e+01 608 184 -1.0416666666666664e-02 608 609 -2.1329166666666662e+01 608 682 -1.5997916666666665e+01 608 180 -1.0667708333333334e+01 609 609 6.4029166666666654e+01 609 611 -2.1329166666666662e+01 609 208 5.3312499999999998e+00 609 197 -1.0416666666666664e-02 609 200 5.3312499999999998e+00 609 214 -1.0667708333333334e+01 609 180 9.9486666632977745e-20 609 608 -2.1329166666666662e+01 609 682 1.5997916666666667e+01 609 184 2.1329166666666662e+01 610 610 6.4029166666666669e+01 610 208 5.3312499999999998e+00 610 611 -2.1329166666666662e+01 610 186 -1.4465734552327348e-19 610 184 2.1329166666666662e+01 610 197 -1.0416666666666664e-02 610 589 2.1329166666666662e+01 610 195 5.3312499999999998e+00 610 581 -1.5997916666666665e+01 610 198 -1.0667708333333334e+01 611 611 6.4029166666666669e+01 611 214 -1.2659172094511536e-19 611 609 -2.1329166666666662e+01 611 198 1.4465734552327348e-19 611 197 2.1329166666666662e+01 611 208 -2.1334374999999998e+01 611 184 -1.0416666666666664e-02 611 610 -2.1329166666666662e+01 612 612 6.4029166666666654e+01 612 617 2.1329166666666662e+01 612 208 -5.3312499999999998e+00 612 199 1.0416666666666664e-02 612 195 -5.3312499999999998e+00 612 198 1.0667708333333334e+01 612 145 -1.2659172094511536e-19 612 582 -2.1329166666666662e+01 612 581 1.5997916666666667e+01 612 147 -2.1329166666666662e+01 613 613 3.2000000000208331e+01 614 614 6.4000000000291664e+01 614 145 1.1000665323307010e-27 614 584 -2.1333333333291666e+01 614 324 -5.3333333333124999e+00 614 581 1.5999999999979167e+01 614 328 1.0416666666666666e-10 614 335 -5.3333333333124999e+00 614 338 1.0666666666677083e+01 614 734 2.1333333333291666e+01 614 148 -2.1333333333291666e+01 615 615 6.4000000000291664e+01 615 324 -5.3333333333124999e+00 615 186 -1.3233141685082473e-27 615 592 -2.1333333333291666e+01 615 581 1.5999999999979167e+01 615 185 -2.1333333333291666e+01 615 337 1.0416666666666666e-10 615 905 -2.1333333333291666e+01 615 335 -5.3333333333124999e+00 615 338 1.0666666666677083e+01 616 616 3.2020833333333336e+01 617 617 6.4029166666666669e+01 617 198 -9.9486666632977745e-20 617 612 2.1329166666666662e+01 617 211 1.4465734552327348e-19 617 199 2.1329166666666662e+01 617 208 -2.1334374999999998e+01 617 147 -1.0416666666666664e-02 617 618 -2.1329166666666662e+01 618 618 6.4029166666666654e+01 618 619 -2.1329166666666662e+01 618 216 5.3312499999999998e+00 618 199 -1.0416666666666664e-02 618 208 5.3312499999999998e+00 618 211 -1.0667708333333334e+01 618 617 -2.1329166666666662e+01 618 147 2.1329166666666662e+01 618 2819 -1.4465734552327348e-19 618 3534 -1.5997916666666665e+01 619 619 6.4029166666666669e+01 619 211 -1.4465734552327348e-19 619 618 -2.1329166666666662e+01 619 206 1.4465734552327348e-19 619 199 2.1329166666666662e+01 619 216 -2.1334374999999998e+01 619 147 -1.0416666666666664e-02 619 620 -2.1329166666666662e+01 619 3534 1.5997916666666667e+01 619 3390 1.5997916666666665e+01 619 2810 5.3312499999999998e+00 619 2819 -1.0667708333333334e+01 620 620 6.4029166666666669e+01 620 216 5.3312499999999998e+00 620 145 -1.2659172094511536e-19 620 199 -1.0416666666666664e-02 620 582 2.1329166666666662e+01 620 195 5.3312499999999998e+00 620 583 -1.5997916666666665e+01 620 206 -1.0667708333333334e+01 620 619 -2.1329166666666662e+01 620 147 2.1329166666666662e+01 620 2819 1.4465734552327348e-19 620 3390 -1.5997916666666667e+01 620 2810 -2.1334374999999998e+01 621 621 6.4020833333541660e+01 621 375 5.3333333333124999e+00 621 105 -5.3333333333124999e+00 621 623 -1.5999999999979167e+01 621 371 5.3333333333124999e+00 621 367 -5.3333333333958333e+00 621 651 1.5999999999979167e+01 621 376 -5.3333333333333330e+00 621 652 1.5999999999979167e+01 621 631 -1.5999999999979167e+01 621 227 -5.3333333333124999e+00 621 124 5.3312499999999998e+00 621 222 -5.3312499999999998e+00 621 229 5.3333333333333330e+00 621 628 -1.5997916666666667e+01 621 128 5.3312499999999998e+00 621 126 -5.3395833333333327e+00 621 649 -1.5997916666666665e+01 621 129 -5.3333333333333330e+00 621 578 -1.5997916666666667e+01 621 577 1.5997916666666665e+01 621 102 -5.3312499999999998e+00 621 103 5.3333333333333330e+00 621 1617 5.3364583333645825e+00 621 1143 5.3364583333645825e+00 622 622 6.4020833333541660e+01 622 133 5.3312499999999998e+00 622 102 -5.3312499999999998e+00 622 577 1.5997916666666667e+01 622 124 5.3312499999999998e+00 622 126 -5.3395833333333327e+00 622 580 -1.5997916666666665e+01 622 134 -5.3333333333333330e+00 622 754 1.5997916666666667e+01 622 630 -1.5997916666666665e+01 622 353 -5.3312499999999998e+00 622 371 5.3333333333124999e+00 622 357 -5.3333333333124999e+00 622 358 5.3333333333333330e+00 622 629 -1.5999999999979167e+01 622 369 5.3333333333124999e+00 622 367 -5.3333333333958333e+00 622 750 -1.5999999999979167e+01 622 370 -5.3333333333333330e+00 622 752 1.5999999999979167e+01 622 623 -1.5999999999979167e+01 622 105 -5.3333333333124999e+00 622 103 5.3333333333333330e+00 623 623 6.4000000000291664e+01 623 376 1.1000665323307010e-27 623 651 -2.1333333333291666e+01 623 621 -1.5999999999979167e+01 623 370 -1.3020149240672800e-27 623 371 -2.1333333333291666e+01 623 367 2.1333333333343749e+01 623 105 1.0416666666666666e-10 623 752 -2.1333333333291666e+01 623 622 -1.5999999999979167e+01 623 103 1.0666666666677083e+01 623 1143 -5.3333333333124999e+00 624 624 6.4020833333541660e+01 624 127 5.3312499999999998e+00 624 353 -5.3312499999999998e+00 624 630 -1.5997916666666667e+01 624 133 5.3312499999999998e+00 624 126 -5.3395833333333327e+00 624 736 1.5997916666666665e+01 624 144 -5.3333333333333330e+00 624 369 5.3333333333124999e+00 624 163 -5.3333333333124999e+00 624 627 -1.5999999999979167e+01 624 368 5.3333333333124999e+00 624 367 -5.3333333333958333e+00 624 742 1.5999999999979167e+01 624 366 -5.3333333333333330e+00 624 741 1.5999999999979167e+01 624 629 -1.5999999999979167e+01 624 357 -5.3333333333124999e+00 624 352 5.3364583333645834e+00 624 358 5.3333333333333330e+00 624 643 -1.5997916666666667e+01 624 625 -1.5997916666666665e+01 624 153 -5.3312499999999998e+00 624 152 5.3364583333645825e+00 624 151 5.3333333333333330e+00 625 625 6.4029166666666654e+01 625 144 -9.9486666632977745e-20 625 161 -5.3312499999999998e+00 625 125 1.4465734552327348e-19 625 127 -2.1329166666666662e+01 625 126 2.1334374999999998e+01 625 640 -2.1329166666666662e+01 625 626 -1.5997916666666667e+01 625 153 1.0416666666666664e-02 625 643 2.1329166666666662e+01 625 624 -1.5997916666666665e+01 625 152 -5.3312499999999998e+00 625 151 1.0667708333333334e+01 626 626 6.4020833333541660e+01 626 368 5.3333333333124999e+00 626 227 -5.3333333333124999e+00 626 631 -1.5999999999979167e+01 626 375 5.3333333333124999e+00 626 367 -5.3333333333958333e+00 626 637 1.5999999999979167e+01 626 385 -5.3333333333333330e+00 626 128 5.3312499999999998e+00 626 153 -5.3312499999999998e+00 626 625 -1.5997916666666667e+01 626 127 5.3312499999999998e+00 626 126 -5.3395833333333327e+00 626 640 1.5997916666666665e+01 626 125 -5.3333333333333330e+00 626 639 1.5997916666666667e+01 626 628 -1.5997916666666665e+01 626 222 -5.3312499999999998e+00 626 223 5.3364583333645825e+00 626 229 5.3333333333333330e+00 626 638 1.5999999999979167e+01 626 627 -1.5999999999979167e+01 626 163 -5.3333333333124999e+00 626 161 5.3364583333645834e+00 626 151 5.3333333333333330e+00 627 627 6.4000000000291664e+01 627 385 -1.3020149240672800e-27 627 152 -5.3333333333124999e+00 627 366 1.1000665323307010e-27 627 368 -2.1333333333291666e+01 627 367 2.1333333333343749e+01 627 742 -2.1333333333291666e+01 627 624 -1.5999999999979167e+01 627 163 1.0416666666666666e-10 627 638 -2.1333333333291666e+01 627 626 -1.5999999999979167e+01 627 161 -5.3333333333124999e+00 627 151 1.0666666666677083e+01 628 628 6.4029166666666669e+01 628 129 1.4465734552327348e-19 628 649 2.1329166666666662e+01 628 621 -1.5997916666666667e+01 628 125 -1.4465734552327348e-19 628 128 -2.1329166666666662e+01 628 126 2.1334374999999998e+01 628 222 1.0416666666666664e-02 628 639 -2.1329166666666662e+01 628 626 -1.5997916666666665e+01 628 223 -5.3312499999999998e+00 628 229 1.0667708333333334e+01 628 1617 -5.3312499999999998e+00 629 629 6.4000000000291664e+01 629 370 1.5039633158038590e-27 629 750 2.1333333333291666e+01 629 622 -1.5999999999979167e+01 629 366 -1.1213657767716683e-27 629 369 -2.1333333333291666e+01 629 367 2.1333333333343749e+01 629 357 1.0416666666666666e-10 629 741 -2.1333333333291666e+01 629 624 -1.5999999999979167e+01 629 352 -5.3333333333124999e+00 629 358 1.0666666666677083e+01 630 630 6.4029166666666669e+01 630 352 -5.3312499999999998e+00 630 144 1.4465734552327348e-19 630 736 -2.1329166666666662e+01 630 624 -1.5997916666666667e+01 630 134 -1.4465734552327348e-19 630 133 -2.1329166666666662e+01 630 126 2.1334374999999998e+01 630 353 1.0416666666666664e-02 630 754 -2.1329166666666662e+01 630 622 -1.5997916666666665e+01 630 358 1.0667708333333334e+01 631 631 6.4000000000291664e+01 631 223 -5.3333333333124999e+00 631 385 1.5039633158038590e-27 631 637 -2.1333333333291666e+01 631 626 -1.5999999999979167e+01 631 376 -1.1213657767716683e-27 631 375 -2.1333333333291666e+01 631 367 2.1333333333343749e+01 631 227 1.0416666666666666e-10 631 652 -2.1333333333291666e+01 631 621 -1.5999999999979167e+01 631 229 1.0666666666677083e+01 631 1617 -5.3333333333124999e+00 632 632 6.4041666666666671e+01 632 127 -5.3312499999999998e+00 632 222 5.3312499999999998e+00 632 647 -1.5997916666666667e+01 632 128 -5.3312499999999998e+00 632 141 5.3395833333333327e+00 632 639 -1.5997916666666665e+01 632 125 5.3333333333333330e+00 632 640 -1.5997916666666667e+01 632 646 -1.5997916666666665e+01 632 153 5.3312499999999998e+00 632 478 -5.3312499999999998e+00 632 162 5.3312499999999998e+00 632 161 -5.3395833333333327e+00 632 171 -5.3333333333333330e+00 632 952 1.5997916666666667e+01 632 483 -5.3312499999999998e+00 632 480 5.3395833333333327e+00 632 635 -1.5997916666666665e+01 632 486 5.3333333333333330e+00 632 633 -1.5997916666666667e+01 632 942 -1.5997916666666665e+01 632 224 5.3312499999999998e+00 632 223 -5.3395833333333327e+00 632 220 -5.3333333333333330e+00 633 633 6.4029166666666654e+01 633 232 1.2659172094511536e-19 633 944 2.1329166666666662e+01 633 482 -5.3312499999999998e+00 633 634 -1.5997916666666665e+01 633 478 1.0416666666666664e-02 633 480 -5.3312499999999998e+00 633 486 1.0667708333333334e+01 633 220 -1.4465734552327348e-19 633 942 2.1329166666666662e+01 633 632 -1.5997916666666667e+01 633 224 -2.1329166666666662e+01 633 223 2.1334374999999998e+01 634 634 6.4020833333541660e+01 634 299 -5.3333333333124999e+00 634 164 5.3333333333124999e+00 634 972 1.5999999999979167e+01 634 311 -5.3333333333124999e+00 634 310 5.3333333333958333e+00 634 642 -1.5999999999979167e+01 634 309 5.3333333333333330e+00 634 641 -1.5999999999979167e+01 634 974 1.5999999999979167e+01 634 226 5.3333333333124999e+00 634 483 -5.3312499999999998e+00 634 224 5.3312499999999998e+00 634 223 -5.3364583333645825e+00 634 232 -5.3333333333333330e+00 634 944 -1.5997916666666667e+01 634 478 -5.3312499999999998e+00 634 482 5.3395833333333327e+00 634 633 -1.5997916666666665e+01 634 486 5.3333333333333330e+00 634 635 -1.5997916666666667e+01 634 971 1.5997916666666665e+01 634 162 5.3312499999999998e+00 634 161 -5.3364583333645825e+00 634 160 -5.3333333333333330e+00 635 635 6.4029166666666669e+01 635 482 -5.3312499999999998e+00 635 171 9.9486666632977745e-20 635 483 1.0416666666666664e-02 635 952 -2.1329166666666662e+01 635 480 -5.3312499999999998e+00 635 632 -1.5997916666666665e+01 635 486 1.0667708333333334e+01 635 160 -1.4465734552327348e-19 635 971 -2.1329166666666662e+01 635 634 -1.5997916666666667e+01 635 162 -2.1329166666666662e+01 635 161 2.1334374999999998e+01 636 636 6.4000000000416662e+01 636 311 -5.3333333333124999e+00 636 226 5.3333333333124999e+00 636 1040 1.5999999999979167e+01 636 299 -5.3333333333124999e+00 636 297 5.3333333333958333e+00 636 641 -1.5999999999979167e+01 636 309 5.3333333333333330e+00 636 642 -1.5999999999979167e+01 636 1045 1.5999999999979167e+01 636 164 5.3333333333124999e+00 636 375 -5.3333333333124999e+00 636 163 5.3333333333124999e+00 636 161 -5.3333333333958333e+00 636 172 -5.3333333333333330e+00 636 745 -1.5999999999979167e+01 636 368 -5.3333333333124999e+00 636 377 5.3333333333958333e+00 636 638 -1.5999999999979167e+01 636 385 5.3333333333333330e+00 636 637 -1.5999999999979167e+01 636 1039 -1.5999999999979167e+01 636 227 5.3333333333124999e+00 636 223 -5.3333333333958333e+00 636 225 -5.3333333333333330e+00 637 637 6.4000000000291664e+01 637 229 1.3233141685082473e-27 637 631 -2.1333333333291666e+01 637 367 -5.3333333333124999e+00 637 626 1.5999999999979167e+01 637 375 1.0416666666666666e-10 637 377 -5.3333333333124999e+00 637 385 1.0666666666677083e+01 637 225 -1.1000665323307010e-27 637 1039 2.1333333333291666e+01 637 636 -1.5999999999979167e+01 637 227 -2.1333333333291666e+01 637 223 2.1333333333343749e+01 638 638 6.4000000000291664e+01 638 367 -5.3333333333124999e+00 638 172 1.1213657767716683e-27 638 368 1.0416666666666666e-10 638 745 2.1333333333291666e+01 638 377 -5.3333333333124999e+00 638 636 -1.5999999999979167e+01 638 385 1.0666666666677083e+01 638 151 -1.1000665323307010e-27 638 627 -2.1333333333291666e+01 638 626 1.5999999999979167e+01 638 163 -2.1333333333291666e+01 638 161 2.1333333333343749e+01 639 639 6.4029166666666654e+01 639 220 9.9486666632977745e-20 639 647 2.1329166666666662e+01 639 141 -5.3312499999999998e+00 639 632 -1.5997916666666665e+01 639 128 1.0416666666666664e-02 639 126 -5.3312499999999998e+00 639 125 1.0667708333333334e+01 639 229 -1.4465734552327348e-19 639 628 -2.1329166666666662e+01 639 626 1.5997916666666667e+01 639 222 -2.1329166666666662e+01 639 223 2.1334374999999998e+01 640 640 6.4029166666666669e+01 640 141 -5.3312499999999998e+00 640 171 -1.4465734552327348e-19 640 646 2.1329166666666662e+01 640 632 -1.5997916666666667e+01 640 151 1.2659172094511536e-19 640 153 -2.1329166666666662e+01 640 161 2.1334374999999998e+01 640 127 1.0416666666666664e-02 640 625 -2.1329166666666662e+01 640 126 -5.3312499999999998e+00 640 626 1.5997916666666665e+01 640 125 1.0667708333333334e+01 641 641 6.4000000000291664e+01 641 225 1.1213657767716683e-27 641 1040 -2.1333333333291666e+01 641 297 -5.3333333333124999e+00 641 636 -1.5999999999979167e+01 641 299 1.0416666666666666e-10 641 310 -5.3333333333124999e+00 641 309 1.0666666666677083e+01 641 232 -1.1000665323307010e-27 641 974 -2.1333333333291666e+01 641 634 -1.5999999999979167e+01 641 226 -2.1333333333291666e+01 641 223 2.1333333333343749e+01 642 642 6.4000000000291664e+01 642 297 -5.3333333333124999e+00 642 172 -1.1000665323307010e-27 642 1045 -2.1333333333291666e+01 642 636 -1.5999999999979167e+01 642 160 1.3233141685082473e-27 642 164 -2.1333333333291666e+01 642 161 2.1333333333343749e+01 642 311 1.0416666666666666e-10 642 972 -2.1333333333291666e+01 642 310 -5.3333333333124999e+00 642 634 -1.5999999999979167e+01 642 309 1.0666666666677083e+01 643 643 6.4029166666666669e+01 643 126 5.3312499999999998e+00 643 167 -1.4465734552327348e-19 643 127 -1.0416666666666664e-02 643 644 -2.1329166666666662e+01 643 135 5.3312499999999998e+00 643 735 1.5997916666666665e+01 643 144 -1.0667708333333334e+01 643 151 1.2659172094511536e-19 643 625 2.1329166666666662e+01 643 624 -1.5997916666666667e+01 643 153 2.1329166666666662e+01 643 152 -2.1334374999999998e+01 644 644 6.4029166666666669e+01 644 152 5.3312499999999998e+00 644 144 -9.9486666632977745e-20 644 643 -2.1329166666666662e+01 644 735 -1.5997916666666667e+01 644 143 1.4465734552327348e-19 644 127 2.1329166666666662e+01 644 135 -2.1334374999999998e+01 644 153 -1.0416666666666664e-02 644 645 -2.1329166666666662e+01 644 842 1.5997916666666665e+01 644 168 5.3312499999999998e+00 644 167 -1.0667708333333334e+01 645 645 6.4029166666666654e+01 645 171 -1.4465734552327348e-19 645 646 -2.1329166666666662e+01 645 141 5.3312499999999998e+00 645 951 -1.5997916666666665e+01 645 127 -1.0416666666666664e-02 645 135 5.3312499999999998e+00 645 143 -1.0667708333333334e+01 645 167 1.4465734552327348e-19 645 644 -2.1329166666666662e+01 645 842 -1.5997916666666667e+01 645 153 2.1329166666666662e+01 645 168 -2.1334374999999998e+01 646 646 6.4029166666666669e+01 646 168 5.3312499999999998e+00 646 143 -1.4465734552327348e-19 646 645 -2.1329166666666662e+01 646 951 1.5997916666666667e+01 646 125 1.4465734552327348e-19 646 127 2.1329166666666662e+01 646 141 -2.1334374999999998e+01 646 153 -1.0416666666666664e-02 646 640 2.1329166666666662e+01 646 632 -1.5997916666666665e+01 646 161 5.3312499999999998e+00 646 171 -1.0667708333333334e+01 647 647 6.4029166666666669e+01 647 223 5.3312499999999998e+00 647 125 -1.4465734552327348e-19 647 639 2.1329166666666662e+01 647 632 -1.5997916666666667e+01 647 142 1.2659172094511536e-19 647 128 2.1329166666666662e+01 647 141 -2.1334374999999998e+01 647 222 -1.0416666666666664e-02 647 648 -2.1329166666666662e+01 647 819 -1.5997916666666665e+01 647 221 5.3312499999999998e+00 647 220 -1.0667708333333334e+01 648 648 6.4029166666666654e+01 648 230 -1.4465734552327348e-19 648 559 2.1329166666666662e+01 648 120 5.3312499999999998e+00 648 556 -1.5997916666666665e+01 648 128 -1.0416666666666664e-02 648 141 5.3312499999999998e+00 648 142 -1.0667708333333334e+01 648 220 9.9486666632977745e-20 648 647 -2.1329166666666662e+01 648 819 1.5997916666666667e+01 648 222 2.1329166666666662e+01 648 221 -2.1334374999999998e+01 649 649 6.4029166666666669e+01 649 120 5.3312499999999998e+00 649 230 1.4465734552327348e-19 649 559 2.1329166666666662e+01 649 553 -1.5997916666666667e+01 649 229 -1.4465734552327348e-19 649 222 2.1329166666666662e+01 649 128 -1.0416666666666664e-02 649 628 2.1329166666666662e+01 649 126 5.3312499999999998e+00 649 621 -1.5997916666666665e+01 649 129 -1.0667708333333334e+01 649 1617 -2.1334374999999998e+01 650 650 6.4000000000416662e+01 650 371 -5.3333333333124999e+00 650 227 5.3333333333124999e+00 650 1026 1.5999999999979167e+01 650 375 -5.3333333333124999e+00 650 373 5.3333333333958333e+00 650 652 -1.5999999999979167e+01 650 376 5.3333333333333330e+00 650 233 -1.3333333333322916e+01 650 651 -1.5999999999979167e+01 650 756 -1.5999999999979167e+01 650 105 5.3333333333124999e+00 650 1139 5.3333333333124999e+00 650 1723 2.1333333333312499e+01 650 1726 -1.0666666666583334e+01 650 1617 2.6666666665937502e+00 650 1615 5.3333333333124999e+00 650 1143 2.6666666665937497e+00 650 1144 -1.3333333333322916e+01 651 651 6.4000000000291664e+01 651 103 1.1000665323307010e-27 651 623 -2.1333333333291666e+01 651 367 -5.3333333333124999e+00 651 621 1.5999999999979167e+01 651 371 1.0416666666666666e-10 651 373 -5.3333333333124999e+00 651 376 1.0666666666677083e+01 651 756 2.1333333333291666e+01 651 650 -1.5999999999979167e+01 651 105 -2.1333333333291666e+01 651 1144 -1.5039633158038590e-27 651 1143 2.1333333333343749e+01 652 652 6.4000000000291664e+01 652 367 -5.3333333333124999e+00 652 229 -1.3233141685082473e-27 652 631 -2.1333333333291666e+01 652 621 1.5999999999979167e+01 652 233 1.3020149240672800e-27 652 227 -2.1333333333291666e+01 652 375 1.0416666666666666e-10 652 1026 -2.1333333333291666e+01 652 373 -5.3333333333124999e+00 652 650 -1.5999999999979167e+01 652 376 1.0666666666677083e+01 652 1617 2.1333333333343749e+01 653 653 3.2020833333333336e+01 654 654 6.4029166666666669e+01 654 260 1.4465734552327348e-19 654 674 2.1329166666666662e+01 654 254 -9.9486666632977745e-20 654 255 -2.1329166666666662e+01 654 251 2.1334374999999998e+01 654 236 1.0416666666666664e-02 654 671 -2.1329166666666662e+01 655 655 3.2020833333333336e+01 656 656 6.4029166666666654e+01 656 269 -9.9486666632977745e-20 656 250 1.4465734552327348e-19 656 252 -2.1329166666666662e+01 656 251 2.1334374999999998e+01 656 662 -2.1329166666666662e+01 656 243 1.0416666666666664e-02 656 663 2.1329166666666662e+01 657 657 3.2020833333333336e+01 658 658 6.4029166666666669e+01 658 254 1.4465734552327348e-19 658 669 2.1329166666666662e+01 658 250 -1.4465734552327348e-19 658 253 -2.1329166666666662e+01 658 251 2.1334374999999998e+01 658 246 1.0416666666666664e-02 658 661 -2.1329166666666662e+01 659 659 3.2020833333333336e+01 660 660 6.4029166666666669e+01 660 269 1.4465734552327348e-19 660 879 2.1329166666666662e+01 660 260 -1.4465734552327348e-19 660 259 -2.1329166666666662e+01 660 251 2.1334374999999998e+01 660 461 1.0416666666666664e-02 660 880 2.1329166666666662e+01 661 661 6.4029166666666654e+01 661 667 2.1329166666666662e+01 661 270 -5.3312499999999998e+00 661 253 1.0416666666666664e-02 661 251 -5.3312499999999998e+00 661 250 1.0667708333333334e+01 661 658 -2.1329166666666662e+01 661 246 -2.1329166666666662e+01 661 2515 9.9486666632977745e-20 661 3481 1.5997916666666665e+01 662 662 6.4029166666666669e+01 662 270 -5.3312499999999998e+00 662 666 2.1329166666666662e+01 662 243 -2.1329166666666662e+01 662 252 1.0416666666666664e-02 662 656 -2.1329166666666662e+01 662 251 -5.3312499999999998e+00 662 250 1.0667708333333334e+01 662 2363 -1.4465734552327348e-19 662 3481 1.5997916666666667e+01 663 663 6.4029166666666669e+01 663 251 5.3312499999999998e+00 663 245 -1.4465734552327348e-19 663 252 -1.0416666666666664e-02 663 664 -2.1329166666666662e+01 663 261 5.3312499999999998e+00 663 883 -1.5997916666666665e+01 663 269 -1.0667708333333334e+01 663 656 2.1329166666666662e+01 663 243 2.1329166666666662e+01 664 664 6.4029166666666669e+01 664 269 -9.9486666632977745e-20 664 663 -2.1329166666666662e+01 664 883 1.5997916666666667e+01 664 268 1.4465734552327348e-19 664 252 2.1329166666666662e+01 664 261 -2.1334374999999998e+01 664 243 -1.0416666666666664e-02 664 665 -2.1329166666666662e+01 664 884 1.5997916666666665e+01 664 245 -1.0667708333333334e+01 664 2360 5.3312499999999998e+00 665 665 6.4029166666666654e+01 665 666 -2.1329166666666662e+01 665 270 5.3312499999999998e+00 665 252 -1.0416666666666664e-02 665 261 5.3312499999999998e+00 665 268 -1.0667708333333334e+01 665 245 1.4465734552327348e-19 665 664 -2.1329166666666662e+01 665 884 -1.5997916666666667e+01 665 243 2.1329166666666662e+01 665 2363 -1.4465734552327348e-19 665 3412 -1.5997916666666665e+01 665 2360 -2.1334374999999998e+01 666 666 6.4029166666666669e+01 666 268 -1.4465734552327348e-19 666 665 -2.1329166666666662e+01 666 250 1.4465734552327348e-19 666 252 2.1329166666666662e+01 666 270 -2.1334374999999998e+01 666 243 -1.0416666666666664e-02 666 662 2.1329166666666662e+01 666 2360 5.3312499999999998e+00 666 3412 1.5997916666666667e+01 666 3481 1.5997916666666665e+01 666 2363 -1.0667708333333334e+01 667 667 6.4029166666666654e+01 667 275 1.2659172094511536e-19 667 250 -1.4465734552327348e-19 667 253 2.1329166666666662e+01 667 270 -2.1334374999999998e+01 667 661 2.1329166666666662e+01 667 246 -1.0416666666666664e-02 667 668 -2.1329166666666662e+01 667 3481 1.5997916666666667e+01 667 3128 1.5997916666666665e+01 667 2515 -1.0667708333333334e+01 668 668 6.4029166666666654e+01 668 670 -2.1329166666666662e+01 668 272 5.3312499999999998e+00 668 253 -1.0416666666666664e-02 668 270 5.3312499999999998e+00 668 275 -1.0667708333333334e+01 668 667 -2.1329166666666662e+01 668 246 2.1329166666666662e+01 668 2515 9.9486666632977745e-20 668 3128 -1.5997916666666667e+01 669 669 6.4029166666666669e+01 669 272 5.3312499999999998e+00 669 670 -2.1329166666666662e+01 669 246 2.1329166666666662e+01 669 253 -1.0416666666666664e-02 669 658 2.1329166666666662e+01 669 251 5.3312499999999998e+00 669 254 -1.0667708333333334e+01 670 670 6.4029166666666669e+01 670 275 -1.2659172094511536e-19 670 668 -2.1329166666666662e+01 670 254 1.4465734552327348e-19 670 253 2.1329166666666662e+01 670 272 -2.1334374999999998e+01 670 246 -1.0416666666666664e-02 670 669 -2.1329166666666662e+01 671 671 6.4029166666666654e+01 671 675 2.1329166666666662e+01 671 272 -5.3312499999999998e+00 671 255 1.0416666666666664e-02 671 251 -5.3312499999999998e+00 671 254 1.0667708333333334e+01 671 654 -2.1329166666666662e+01 671 236 -2.1329166666666662e+01 672 672 3.2020833333333336e+01 673 673 6.4029166666666669e+01 673 267 -1.4465734552327348e-19 673 676 -2.1329166666666662e+01 673 260 1.4465734552327348e-19 673 255 2.1329166666666662e+01 673 257 -2.1334374999999998e+01 673 236 -1.0416666666666664e-02 673 674 -2.1329166666666662e+01 674 674 6.4029166666666654e+01 674 654 2.1329166666666662e+01 674 251 5.3312499999999998e+00 674 255 -1.0416666666666664e-02 674 257 5.3312499999999998e+00 674 260 -1.0667708333333334e+01 674 673 -2.1329166666666662e+01 674 236 2.1329166666666662e+01 675 675 6.4029166666666669e+01 675 254 -9.9486666632977745e-20 675 671 2.1329166666666662e+01 675 267 1.4465734552327348e-19 675 255 2.1329166666666662e+01 675 272 -2.1334374999999998e+01 675 236 -1.0416666666666664e-02 675 676 -2.1329166666666662e+01 676 676 6.4029166666666669e+01 676 272 5.3312499999999998e+00 676 255 -1.0416666666666664e-02 676 673 -2.1329166666666662e+01 676 257 5.3312499999999998e+00 676 267 -1.0667708333333334e+01 676 675 -2.1329166666666662e+01 676 236 2.1329166666666662e+01 677 677 3.2020833333333336e+01 678 678 3.2020833333333336e+01 679 679 6.4029166666666654e+01 679 99 -1.4465734552327348e-19 679 80 1.2659172094511536e-19 679 82 -2.1329166666666662e+01 679 81 2.1334374999999998e+01 679 686 -2.1329166666666662e+01 679 278 1.0416666666666664e-02 679 687 2.1329166666666662e+01 680 680 3.2020833333333336e+01 681 681 6.4029166666666669e+01 681 84 9.9486666632977745e-20 681 692 2.1329166666666662e+01 681 80 -1.4465734552327348e-19 681 83 -2.1329166666666662e+01 681 81 2.1334374999999998e+01 681 182 1.0416666666666664e-02 681 685 -2.1329166666666662e+01 682 682 6.4041666666666671e+01 682 82 -5.3312499999999998e+00 682 182 5.3312499999999998e+00 682 691 -1.5997916666666667e+01 682 83 -5.3312499999999998e+00 682 96 5.3395833333333327e+00 682 685 -1.5997916666666665e+01 682 80 5.3333333333333330e+00 682 686 -1.5997916666666667e+01 682 690 -1.5997916666666665e+01 682 278 5.3312499999999998e+00 682 197 -5.3312499999999998e+00 682 283 5.3312499999999998e+00 682 285 -5.3333333333333330e+00 682 965 1.5997916666666667e+01 682 209 -5.3312499999999998e+00 682 200 5.3395833333333327e+00 682 684 -1.5997916666666665e+01 682 214 5.3333333333333330e+00 682 609 1.5997916666666667e+01 682 608 -1.5997916666666665e+01 682 184 5.3312499999999998e+00 682 180 -5.3333333333333330e+00 683 683 3.2020833333333336e+01 684 684 6.4029166666666669e+01 684 208 -5.3312499999999998e+00 684 285 1.4465734552327348e-19 684 209 1.0416666666666664e-02 684 965 -2.1329166666666662e+01 684 200 -5.3312499999999998e+00 684 682 -1.5997916666666665e+01 684 214 1.0667708333333334e+01 684 996 -2.1329166666666662e+01 684 283 -2.1329166666666662e+01 685 685 6.4029166666666654e+01 685 180 1.4465734552327348e-19 685 691 2.1329166666666662e+01 685 96 -5.3312499999999998e+00 685 682 -1.5997916666666665e+01 685 83 1.0416666666666664e-02 685 81 -5.3312499999999998e+00 685 80 1.0667708333333334e+01 685 681 -2.1329166666666662e+01 685 182 -2.1329166666666662e+01 686 686 6.4029166666666669e+01 686 96 -5.3312499999999998e+00 686 285 -9.9486666632977745e-20 686 690 2.1329166666666662e+01 686 682 -1.5997916666666667e+01 686 278 -2.1329166666666662e+01 686 82 1.0416666666666664e-02 686 679 -2.1329166666666662e+01 686 81 -5.3312499999999998e+00 686 80 1.0667708333333334e+01 687 687 6.4029166666666669e+01 687 81 5.3312499999999998e+00 687 284 -1.4465734552327348e-19 687 82 -1.0416666666666664e-02 687 688 -2.1329166666666662e+01 687 91 5.3312499999999998e+00 687 895 -1.5997916666666665e+01 687 99 -1.0667708333333334e+01 687 679 2.1329166666666662e+01 687 278 2.1329166666666662e+01 688 688 6.4029166666666669e+01 688 99 -1.4465734552327348e-19 688 687 -2.1329166666666662e+01 688 895 1.5997916666666667e+01 688 98 1.4465734552327348e-19 688 82 2.1329166666666662e+01 688 91 -2.1334374999999998e+01 688 278 -1.0416666666666664e-02 688 689 -2.1329166666666662e+01 688 896 1.5997916666666665e+01 688 284 -1.0667708333333334e+01 688 2513 5.3312499999999998e+00 689 689 6.4029166666666654e+01 689 285 -9.9486666632977745e-20 689 690 -2.1329166666666662e+01 689 96 5.3312499999999998e+00 689 964 -1.5997916666666665e+01 689 82 -1.0416666666666664e-02 689 91 5.3312499999999998e+00 689 98 -1.0667708333333334e+01 689 284 1.4465734552327348e-19 689 688 -2.1329166666666662e+01 689 896 -1.5997916666666667e+01 689 278 2.1329166666666662e+01 689 2513 -2.1334374999999998e+01 690 690 6.4029166666666669e+01 690 98 -1.4465734552327348e-19 690 689 -2.1329166666666662e+01 690 964 1.5997916666666667e+01 690 80 1.2659172094511536e-19 690 82 2.1329166666666662e+01 690 96 -2.1334374999999998e+01 690 278 -1.0416666666666664e-02 690 686 2.1329166666666662e+01 690 682 -1.5997916666666665e+01 690 285 -1.0667708333333334e+01 690 2513 5.3312499999999998e+00 691 691 6.4029166666666669e+01 691 80 -1.4465734552327348e-19 691 685 2.1329166666666662e+01 691 682 -1.5997916666666667e+01 691 97 1.4465734552327348e-19 691 83 2.1329166666666662e+01 691 96 -2.1334374999999998e+01 691 182 -1.0416666666666664e-02 691 594 2.1329166666666662e+01 691 593 -1.5997916666666665e+01 691 181 5.3312499999999998e+00 691 180 -1.0667708333333334e+01 692 692 6.4029166666666669e+01 692 93 5.3312499999999998e+00 692 192 1.2659172094511536e-19 692 693 -2.1329166666666662e+01 692 694 1.5997916666666667e+01 692 182 2.1329166666666662e+01 692 83 -1.0416666666666664e-02 692 681 2.1329166666666662e+01 692 81 5.3312499999999998e+00 692 84 -1.0667708333333334e+01 693 693 6.4029166666666669e+01 693 181 5.3312499999999998e+00 693 97 -1.4465734552327348e-19 693 594 2.1329166666666662e+01 693 595 -1.5997916666666667e+01 693 84 9.9486666632977745e-20 693 83 2.1329166666666662e+01 693 93 -2.1334374999999998e+01 693 182 -1.0416666666666664e-02 693 692 -2.1329166666666662e+01 693 694 -1.5997916666666665e+01 693 192 -1.0667708333333334e+01 694 694 6.4020833333541660e+01 694 407 -5.3333333333124999e+00 694 179 5.3333333333124999e+00 694 927 -1.5999999999979167e+01 694 417 -5.3333333333124999e+00 694 423 5.3333333333958333e+00 694 697 -1.5999999999979167e+01 694 418 5.3333333333333330e+00 694 83 -5.3312499999999998e+00 694 54 5.3312499999999998e+00 694 548 -1.5997916666666667e+01 694 79 -5.3312499999999998e+00 694 93 5.3395833333333327e+00 694 547 1.5997916666666665e+01 694 84 5.3333333333333330e+00 694 692 1.5997916666666667e+01 694 693 -1.5997916666666665e+01 694 182 5.3312499999999998e+00 694 192 -5.3333333333333330e+00 694 695 -1.5999999999979167e+01 694 780 -1.5999999999979167e+01 694 59 5.3333333333124999e+00 694 62 -5.3333333333333330e+00 695 695 6.4000000000291664e+01 695 423 -5.3333333333124999e+00 695 407 1.0416666666666666e-10 695 760 -2.1333333333291666e+01 695 403 -5.3333333333124999e+00 695 418 1.0666666666677083e+01 695 62 -1.3233141685082473e-27 695 780 2.1333333333291666e+01 695 694 -1.5999999999979167e+01 695 59 -2.1333333333291666e+01 696 696 3.2000000000208331e+01 697 697 6.4000000000291664e+01 697 192 1.1000665323307010e-27 697 927 2.1333333333291666e+01 697 423 -5.3333333333124999e+00 697 694 -1.5999999999979167e+01 697 417 1.0416666666666666e-10 697 403 -5.3333333333124999e+00 697 418 1.0666666666677083e+01 697 765 -2.1333333333291666e+01 697 179 -2.1333333333291666e+01 698 698 6.4000000000291664e+01 698 300 1.1213657767716683e-27 698 712 2.1333333333291666e+01 698 295 -1.1000665323307010e-27 698 296 -2.1333333333291666e+01 698 294 2.1333333333343749e+01 698 286 1.0416666666666666e-10 698 707 -2.1333333333291666e+01 698 1208 -5.3333333333124999e+00 698 1816 -1.5999999999979167e+01 698 1819 -1.5999999999979167e+01 698 3780 -5.3333333333124999e+00 698 1207 1.0666666666677083e+01 699 699 6.4000000000291664e+01 699 298 -1.1000665323307010e-27 699 294 2.1333333333343749e+01 699 702 2.1333333333291666e+01 699 1271 -5.3333333333124999e+00 699 1672 1.1213657767716683e-27 699 1675 -2.1333333333291666e+01 699 2283 -2.1333333333291666e+01 699 1817 -1.5999999999979167e+01 699 1290 1.0416666666666666e-10 699 1818 -1.5999999999979167e+01 699 1282 -5.3333333333124999e+00 699 1274 1.0666666666677083e+01 700 700 6.4000000000291664e+01 700 295 1.3233141685082473e-27 700 705 2.1333333333291666e+01 700 294 2.1333333333343749e+01 700 3977 -5.3333333333124999e+00 700 1819 -1.5999999999979167e+01 700 1672 -1.1000665323307010e-27 700 1674 -2.1333333333291666e+01 700 1470 1.0416666666666666e-10 700 2284 -2.1333333333291666e+01 700 1817 -1.5999999999979167e+01 700 1465 -5.3333333333124999e+00 700 1472 1.0666666666677083e+01 701 701 6.4000000000291664e+01 701 298 1.3233141685082473e-27 701 1029 -2.1333333333291666e+01 701 300 -1.1000665323307010e-27 701 299 -2.1333333333291666e+01 701 294 2.1333333333343749e+01 701 226 1.0416666666666666e-10 701 948 -2.1333333333291666e+01 701 1620 -5.3333333333124999e+00 701 1818 -1.5999999999979167e+01 701 1816 -1.5999999999979167e+01 701 1619 -5.3333333333124999e+00 701 1621 1.0666666666677083e+01 702 702 6.4000000000291664e+01 702 294 5.3333333333124999e+00 702 292 -1.1000665323307010e-27 702 703 -2.1333333333291666e+01 702 297 5.3333333333124999e+00 702 1028 1.5999999999979167e+01 702 298 -1.0666666666677083e+01 702 699 2.1333333333291666e+01 702 1675 -1.0416666666666666e-10 702 1274 1.3020149240672800e-27 702 1818 -1.5999999999979167e+01 702 1290 2.1333333333291666e+01 702 1282 -2.1333333333343749e+01 703 703 6.4000000000291664e+01 703 298 -1.1000665323307010e-27 703 702 -2.1333333333291666e+01 703 1028 -1.5999999999979167e+01 703 297 -2.1333333333343749e+01 703 1041 1.5999999999979167e+01 703 292 -1.0666666666677083e+01 703 1282 5.3333333333124999e+00 703 1676 1.5039633158038590e-27 703 1675 2.1333333333291666e+01 703 1290 -1.0416666666666666e-10 703 2269 2.1333333333291666e+01 703 1287 5.3333333333124999e+00 704 704 6.4000000000291664e+01 704 293 -1.1213657767716683e-27 704 706 -2.1333333333291666e+01 704 302 5.3333333333124999e+00 704 1015 1.5999999999979167e+01 704 308 -1.0666666666677083e+01 704 1674 -1.0416666666666666e-10 704 1673 5.3333333333124999e+00 704 1464 1.1000665323307010e-27 704 2282 2.1333333333291666e+01 704 1940 -1.5999999999979167e+01 704 1470 2.1333333333291666e+01 704 1463 -2.1333333333343749e+01 705 705 6.4000000000291664e+01 705 302 5.3333333333124999e+00 705 293 1.1213657767716683e-27 705 706 -2.1333333333291666e+01 705 708 1.5999999999979167e+01 705 700 2.1333333333291666e+01 705 294 5.3333333333124999e+00 705 295 -1.0666666666677083e+01 705 1472 -1.5039633158038590e-27 705 1470 2.1333333333291666e+01 705 3977 -2.1333333333343749e+01 705 1674 -1.0416666666666666e-10 705 1819 -1.5999999999979167e+01 706 706 6.4000000000291664e+01 706 308 -1.3020149240672800e-27 706 704 -2.1333333333291666e+01 706 1015 -1.5999999999979167e+01 706 295 1.3233141685082473e-27 706 302 -2.1333333333343749e+01 706 705 -2.1333333333291666e+01 706 708 -1.5999999999979167e+01 706 293 -1.0666666666677083e+01 706 1463 5.3333333333124999e+00 706 1674 2.1333333333291666e+01 706 1470 -1.0416666666666666e-10 706 3977 5.3333333333124999e+00 707 707 6.4000000000291664e+01 707 289 1.1000665323307010e-27 707 709 2.1333333333291666e+01 707 302 -5.3333333333124999e+00 707 708 -1.5999999999979167e+01 707 296 1.0416666666666666e-10 707 294 -5.3333333333124999e+00 707 295 1.0666666666677083e+01 707 698 -2.1333333333291666e+01 707 286 -2.1333333333291666e+01 707 1207 -1.3020149240672800e-27 707 1819 1.5999999999979167e+01 707 3780 2.1333333333343749e+01 708 708 6.4020833333541660e+01 708 286 5.3333333333124999e+00 708 709 -1.5999999999979167e+01 708 296 -5.3333333333124999e+00 708 302 5.3333333333958333e+00 708 707 -1.5999999999979167e+01 708 295 5.3333333333333330e+00 708 705 1.5999999999979167e+01 708 706 -1.5999999999979167e+01 708 293 -1.3332291666666665e+01 708 1011 -1.0658333333333333e+01 708 289 -1.3332291666666665e+01 708 288 5.3312499999999998e+00 708 1674 -5.3333333333124999e+00 708 1470 5.3333333333124999e+00 708 3977 2.6624999999687500e+00 708 3971 5.3312499999999998e+00 708 4886 2.1331249999999997e+01 708 3780 2.6624999999687500e+00 709 709 6.4000000000291664e+01 709 295 -1.1000665323307010e-27 709 707 2.1333333333291666e+01 709 708 -1.5999999999979167e+01 709 305 1.5039633158038590e-27 709 296 2.1333333333291666e+01 709 302 -2.1333333333343749e+01 709 286 -1.0416666666666666e-10 709 710 -2.1333333333291666e+01 709 978 -1.5999999999979167e+01 709 289 -1.0666666666677083e+01 709 3780 5.3333333333124999e+00 709 2413 5.3333333333124999e+00 710 710 6.4000000000291664e+01 710 287 -1.3233141685082473e-27 710 711 -2.1333333333291666e+01 710 310 5.3333333333124999e+00 710 970 -1.5999999999979167e+01 710 296 -1.0416666666666666e-10 710 302 5.3333333333124999e+00 710 305 -1.0666666666677083e+01 710 289 1.1000665323307010e-27 710 709 -2.1333333333291666e+01 710 978 1.5999999999979167e+01 710 286 2.1333333333291666e+01 710 2413 -2.1333333333343749e+01 711 711 6.4000000000291664e+01 711 305 -1.5039633158038590e-27 711 710 -2.1333333333291666e+01 711 970 1.5999999999979167e+01 711 300 1.1213657767716683e-27 711 296 2.1333333333291666e+01 711 310 -2.1333333333343749e+01 711 286 -1.0416666666666666e-10 711 712 -2.1333333333291666e+01 711 946 -1.5999999999979167e+01 711 287 -1.0666666666677083e+01 711 2413 5.3333333333124999e+00 711 1208 5.3333333333124999e+00 712 712 6.4000000000291664e+01 712 310 5.3333333333124999e+00 712 296 -1.0416666666666666e-10 712 698 2.1333333333291666e+01 712 294 5.3333333333124999e+00 712 300 -1.0666666666677083e+01 712 287 1.3233141685082473e-27 712 711 -2.1333333333291666e+01 712 946 1.5999999999979167e+01 712 286 2.1333333333291666e+01 712 1207 -1.3020149240672800e-27 712 1816 -1.5999999999979167e+01 712 1208 -2.1333333333343749e+01 713 713 6.4041666666666671e+01 713 483 -5.3312499999999998e+00 713 977 -1.5997916666666667e+01 713 484 5.3395833333333327e+00 713 721 -1.5997916666666665e+01 713 481 5.3333333333333330e+00 713 722 -1.5997916666666667e+01 713 976 -1.5997916666666665e+01 713 162 5.3312499999999998e+00 713 205 -5.3312499999999998e+00 713 159 5.3312499999999998e+00 713 158 -5.3395833333333327e+00 713 170 -5.3333333333333330e+00 713 607 -1.5997916666666667e+01 713 196 -5.3312499999999998e+00 713 203 5.3395833333333327e+00 713 604 1.5997916666666665e+01 713 204 5.3333333333333330e+00 713 714 -1.5997916666666667e+01 713 980 1.5997916666666665e+01 713 316 5.3312499999999998e+00 713 315 -5.3395833333333327e+00 713 314 -5.3333333333333330e+00 713 2671 5.3312499999999998e+00 713 2479 -5.3312499999999998e+00 714 714 6.4029166666666654e+01 714 320 1.4465734552327348e-19 714 591 -2.1329166666666662e+01 714 195 -5.3312499999999998e+00 714 585 1.5997916666666665e+01 714 205 1.0416666666666664e-02 714 203 -5.3312499999999998e+00 714 204 1.0667708333333334e+01 714 314 -1.4465734552327348e-19 714 980 -2.1329166666666662e+01 714 713 -1.5997916666666667e+01 714 316 -2.1329166666666662e+01 714 315 2.1334374999999998e+01 715 715 6.4000000000416662e+01 715 325 -5.3333333333124999e+00 715 318 5.3333333333124999e+00 715 726 -1.5999999999979167e+01 715 326 -5.3333333333124999e+00 715 345 5.3333333333958333e+00 715 719 -1.5999999999979167e+01 715 323 5.3333333333333330e+00 715 720 -1.5999999999979167e+01 715 723 -1.5999999999979167e+01 715 165 5.3333333333124999e+00 715 304 -5.3333333333124999e+00 715 164 5.3333333333124999e+00 715 158 -5.3333333333958333e+00 715 174 -5.3333333333333330e+00 715 1066 1.5999999999979167e+01 715 311 -5.3333333333124999e+00 715 306 5.3333333333958333e+00 715 718 -1.5999999999979167e+01 715 313 5.3333333333333330e+00 715 716 -1.5999999999979167e+01 715 1063 -1.5999999999979167e+01 715 319 5.3333333333124999e+00 715 315 -5.3333333333958333e+00 715 317 -5.3333333333333330e+00 716 716 6.4000000000291664e+01 716 321 1.1000665323307010e-27 716 975 -2.1333333333291666e+01 716 310 -5.3333333333124999e+00 716 717 -1.5999999999979167e+01 716 304 1.0416666666666666e-10 716 306 -5.3333333333124999e+00 716 313 1.0666666666677083e+01 716 317 -1.5039633158038590e-27 716 1063 2.1333333333291666e+01 716 715 -1.5999999999979167e+01 716 319 -2.1333333333291666e+01 716 315 2.1333333333343749e+01 717 717 6.4020833333541660e+01 717 311 -5.3333333333124999e+00 717 319 5.3333333333124999e+00 717 975 1.5999999999979167e+01 717 304 -5.3333333333124999e+00 717 310 5.3333333333958333e+00 717 716 -1.5999999999979167e+01 717 313 5.3333333333333330e+00 717 162 5.3312499999999998e+00 717 971 1.5997916666666667e+01 717 483 -5.3312499999999998e+00 717 482 5.3395833333333327e+00 717 722 -1.5997916666666665e+01 717 481 5.3333333333333330e+00 717 721 -1.5997916666666667e+01 717 973 1.5997916666666665e+01 717 315 -5.3364583333645825e+00 717 321 -5.3333333333333330e+00 717 718 -1.5999999999979167e+01 717 972 1.5999999999979167e+01 717 164 5.3333333333124999e+00 717 158 -5.3364583333645834e+00 717 160 -5.3333333333333330e+00 717 2479 -5.3312499999999998e+00 717 2671 5.3312499999999998e+00 718 718 6.4000000000291664e+01 718 310 -5.3333333333124999e+00 718 174 1.3020149240672800e-27 718 311 1.0416666666666666e-10 718 1066 -2.1333333333291666e+01 718 306 -5.3333333333124999e+00 718 715 -1.5999999999979167e+01 718 313 1.0666666666677083e+01 718 160 -1.3233141685082473e-27 718 972 -2.1333333333291666e+01 718 717 -1.5999999999979167e+01 718 164 -2.1333333333291666e+01 718 158 2.1333333333343749e+01 719 719 6.4000000000291664e+01 719 317 1.3020149240672800e-27 719 726 2.1333333333291666e+01 719 345 -5.3333333333124999e+00 719 715 -1.5999999999979167e+01 719 326 1.0416666666666666e-10 719 324 -5.3333333333124999e+00 719 323 1.0666666666677083e+01 719 320 -1.3233141685082473e-27 719 590 -2.1333333333291666e+01 719 585 1.5999999999979167e+01 719 318 -2.1333333333291666e+01 719 315 2.1333333333343749e+01 720 720 6.4000000000291664e+01 720 345 -5.3333333333124999e+00 720 174 -1.5039633158038590e-27 720 723 2.1333333333291666e+01 720 715 -1.5999999999979167e+01 720 157 1.1000665323307010e-27 720 165 -2.1333333333291666e+01 720 158 2.1333333333343749e+01 720 325 1.0416666666666666e-10 720 588 -2.1333333333291666e+01 720 324 -5.3333333333124999e+00 720 585 1.5999999999979167e+01 720 323 1.0666666666677083e+01 721 721 6.4029166666666654e+01 721 314 1.4465734552327348e-19 721 977 2.1329166666666662e+01 721 484 -5.3312499999999998e+00 721 713 -1.5997916666666665e+01 721 482 -5.3312499999999998e+00 721 481 1.0667708333333334e+01 721 321 -1.2659172094511536e-19 721 973 -2.1329166666666662e+01 721 717 -1.5997916666666667e+01 721 315 2.1334374999999998e+01 721 2479 1.0416666666666664e-02 721 2671 -2.1329166666666662e+01 722 722 6.4029166666666669e+01 722 484 -5.3312499999999998e+00 722 170 -1.4465734552327348e-19 722 976 2.1329166666666662e+01 722 713 -1.5997916666666667e+01 722 160 1.4465734552327348e-19 722 162 -2.1329166666666662e+01 722 158 2.1334374999999998e+01 722 483 1.0416666666666664e-02 722 971 -2.1329166666666662e+01 722 482 -5.3312499999999998e+00 722 717 -1.5997916666666665e+01 722 481 1.0667708333333334e+01 723 723 6.4000000000291664e+01 723 173 5.3333333333124999e+00 723 347 -1.3233141685082473e-27 723 724 -2.1333333333291666e+01 723 1065 1.5999999999979167e+01 723 323 1.1000665323307010e-27 723 325 2.1333333333291666e+01 723 345 -2.1333333333343749e+01 723 165 -1.0416666666666666e-10 723 720 2.1333333333291666e+01 723 715 -1.5999999999979167e+01 723 158 5.3333333333124999e+00 723 174 -1.0666666666677083e+01 724 724 6.4000000000291664e+01 724 339 5.3333333333124999e+00 724 175 1.1213657767716683e-27 724 725 -2.1333333333291666e+01 724 918 -1.5999999999979167e+01 724 174 -1.5039633158038590e-27 724 165 2.1333333333291666e+01 724 173 -2.1333333333343749e+01 724 325 -1.0416666666666666e-10 724 723 -2.1333333333291666e+01 724 345 5.3333333333124999e+00 724 1065 -1.5999999999979167e+01 724 347 -1.0666666666677083e+01 725 725 6.4000000000291664e+01 725 155 5.3333333333124999e+00 725 348 -1.3020149240672800e-27 725 599 2.1333333333291666e+01 725 597 -1.5999999999979167e+01 725 347 1.3233141685082473e-27 725 325 2.1333333333291666e+01 725 339 -2.1333333333343749e+01 725 165 -1.0416666666666666e-10 725 724 -2.1333333333291666e+01 725 918 1.5999999999979167e+01 725 173 5.3333333333124999e+00 725 175 -1.0666666666677083e+01 726 726 6.4000000000291664e+01 726 315 5.3333333333124999e+00 726 323 -1.1213657767716683e-27 726 719 2.1333333333291666e+01 726 715 -1.5999999999979167e+01 726 346 1.1000665323307010e-27 726 326 2.1333333333291666e+01 726 345 -2.1333333333343749e+01 726 318 -1.0416666666666666e-10 726 727 -2.1333333333291666e+01 726 1020 -1.5999999999979167e+01 726 317 -1.0666666666677083e+01 726 2668 5.3333333333124999e+00 727 727 6.4000000000291664e+01 727 729 -2.1333333333291666e+01 727 330 5.3333333333124999e+00 727 326 -1.0416666666666666e-10 727 345 5.3333333333124999e+00 727 346 -1.0666666666677083e+01 727 317 1.3020149240672800e-27 727 726 -2.1333333333291666e+01 727 1020 1.5999999999979167e+01 727 318 2.1333333333291666e+01 727 2669 -1.1000665323307010e-27 727 3385 -1.5999999999979167e+01 727 2668 -2.1333333333343749e+01 728 728 6.4000000000291664e+01 728 330 5.3333333333124999e+00 728 729 -2.1333333333291666e+01 728 320 -1.3233141685082473e-27 728 318 2.1333333333291666e+01 728 326 -1.0416666666666666e-10 728 590 2.1333333333291666e+01 728 324 5.3333333333124999e+00 728 583 -1.5999999999979167e+01 728 327 -1.0666666666677083e+01 728 2669 1.1000665323307010e-27 728 3387 -1.5999999999979167e+01 728 2670 -2.1333333333343749e+01 729 729 6.4000000000291664e+01 729 346 -1.1000665323307010e-27 729 727 -2.1333333333291666e+01 729 327 1.5039633158038590e-27 729 326 2.1333333333291666e+01 729 330 -2.1333333333343749e+01 729 318 -1.0416666666666666e-10 729 728 -2.1333333333291666e+01 729 2668 5.3333333333124999e+00 729 3385 1.5999999999979167e+01 729 3387 1.5999999999979167e+01 729 2670 5.3333333333124999e+00 729 2669 -1.0666666666677083e+01 730 730 6.4000000000291664e+01 730 732 2.1333333333291666e+01 730 330 -5.3333333333124999e+00 730 328 1.0416666666666666e-10 730 324 -5.3333333333124999e+00 730 327 1.0666666666677083e+01 730 145 -1.1000665323307010e-27 730 584 -2.1333333333291666e+01 730 583 1.5999999999979167e+01 730 148 -2.1333333333291666e+01 730 1645 1.1213657767716683e-27 730 3387 1.5999999999979167e+01 730 2810 2.1333333333343749e+01 731 731 6.4029166666666654e+01 731 985 2.1329166666666662e+01 731 216 -5.3312499999999998e+00 731 205 1.0416666666666664e-02 731 195 -5.3312499999999998e+00 731 206 1.0667708333333334e+01 731 320 -1.4465734552327348e-19 731 591 -2.1329166666666662e+01 731 583 1.5997916666666667e+01 731 316 -2.1329166666666662e+01 731 2673 9.9486666632977745e-20 731 3390 1.5997916666666665e+01 731 2670 2.1334374999999998e+01 732 732 6.4000000000291664e+01 732 327 -1.3020149240672800e-27 732 730 2.1333333333291666e+01 732 333 1.3233141685082473e-27 732 328 2.1333333333291666e+01 732 330 -2.1333333333343749e+01 732 148 -1.0416666666666666e-10 732 733 -2.1333333333291666e+01 732 2810 5.3333333333124999e+00 732 3387 1.5999999999979167e+01 732 2165 1.5999999999979167e+01 732 1645 -1.0666666666677083e+01 733 733 6.4000000000291664e+01 733 734 -2.1333333333291666e+01 733 335 5.3333333333124999e+00 733 328 -1.0416666666666666e-10 733 330 5.3333333333124999e+00 733 333 -1.0666666666677083e+01 733 732 -2.1333333333291666e+01 733 148 2.1333333333291666e+01 733 1645 1.1213657767716683e-27 733 2165 -1.5999999999979167e+01 734 734 6.4000000000291664e+01 734 333 -1.3233141685082473e-27 734 733 -2.1333333333291666e+01 734 338 1.1000665323307010e-27 734 328 2.1333333333291666e+01 734 335 -2.1333333333343749e+01 734 148 -1.0416666666666666e-10 734 614 2.1333333333291666e+01 735 735 6.4041666666666671e+01 735 94 -5.3312499999999998e+00 735 351 5.3312499999999998e+00 735 839 1.5997916666666667e+01 735 89 -5.3312499999999998e+00 735 86 5.3395833333333327e+00 735 743 -1.5997916666666665e+01 735 92 5.3333333333333330e+00 735 744 -1.5997916666666667e+01 735 844 1.5997916666666665e+01 735 156 5.3312499999999998e+00 735 133 -5.3312499999999998e+00 735 153 5.3312499999999998e+00 735 152 -5.3395833333333327e+00 735 167 -5.3333333333333330e+00 735 644 -1.5997916666666667e+01 735 127 -5.3312499999999998e+00 735 135 5.3395833333333327e+00 735 643 1.5997916666666665e+01 735 144 5.3333333333333330e+00 735 736 -1.5997916666666667e+01 735 838 -1.5997916666666665e+01 735 353 5.3312499999999998e+00 735 352 -5.3395833333333327e+00 735 349 -5.3333333333333330e+00 736 736 6.4029166666666654e+01 736 358 1.4465734552327348e-19 736 630 -2.1329166666666662e+01 736 126 -5.3312499999999998e+00 736 624 1.5997916666666665e+01 736 133 1.0416666666666664e-02 736 135 -5.3312499999999998e+00 736 144 1.0667708333333334e+01 736 349 -1.4465734552327348e-19 736 838 2.1329166666666662e+01 736 735 -1.5997916666666667e+01 736 353 -2.1329166666666662e+01 736 352 2.1334374999999998e+01 737 737 6.4000000000416662e+01 737 368 -5.3333333333124999e+00 737 357 5.3333333333124999e+00 737 748 -1.5999999999979167e+01 737 369 -5.3333333333124999e+00 737 386 5.3333333333958333e+00 737 741 -1.5999999999979167e+01 737 366 5.3333333333333330e+00 737 742 -1.5999999999979167e+01 737 747 -1.5999999999979167e+01 737 163 5.3333333333124999e+00 737 411 -5.3333333333124999e+00 737 166 5.3333333333124999e+00 737 152 -5.3333333333958333e+00 737 176 -5.3333333333333330e+00 737 1070 -1.5999999999979167e+01 737 424 -5.3333333333124999e+00 737 426 5.3333333333958333e+00 737 740 -1.5999999999979167e+01 737 427 5.3333333333333330e+00 737 738 -1.5999999999979167e+01 737 808 -1.5999999999979167e+01 737 355 5.3333333333124999e+00 737 352 -5.3333333333958333e+00 737 354 -5.3333333333333330e+00 738 738 6.4000000000291664e+01 738 364 1.1000665323307010e-27 738 810 2.1333333333291666e+01 738 423 -5.3333333333124999e+00 738 739 -1.5999999999979167e+01 738 411 1.0416666666666666e-10 738 426 -5.3333333333124999e+00 738 427 1.0666666666677083e+01 738 354 -1.5039633158038590e-27 738 808 2.1333333333291666e+01 738 737 -1.5999999999979167e+01 738 355 -2.1333333333291666e+01 738 352 2.1333333333343749e+01 739 739 6.4020833333541660e+01 739 424 -5.3333333333124999e+00 739 355 5.3333333333124999e+00 739 810 -1.5999999999979167e+01 739 411 -5.3333333333124999e+00 739 423 5.3333333333958333e+00 739 738 -1.5999999999979167e+01 739 427 5.3333333333333330e+00 739 89 -5.3312499999999998e+00 739 156 5.3312499999999998e+00 739 955 1.5997916666666667e+01 739 94 -5.3312499999999998e+00 739 93 5.3395833333333327e+00 739 744 -1.5997916666666665e+01 739 92 5.3333333333333330e+00 739 743 -1.5997916666666667e+01 739 857 -1.5997916666666665e+01 739 351 5.3312499999999998e+00 739 352 -5.3364583333645825e+00 739 364 -5.3333333333333330e+00 739 740 -1.5999999999979167e+01 739 956 1.5999999999979167e+01 739 166 5.3333333333124999e+00 739 152 -5.3364583333645834e+00 739 154 -5.3333333333333330e+00 740 740 6.4000000000291664e+01 740 423 -5.3333333333124999e+00 740 176 1.3020149240672800e-27 740 424 1.0416666666666666e-10 740 1070 2.1333333333291666e+01 740 426 -5.3333333333124999e+00 740 737 -1.5999999999979167e+01 740 427 1.0666666666677083e+01 740 154 -1.3233141685082473e-27 740 956 -2.1333333333291666e+01 740 739 -1.5999999999979167e+01 740 166 -2.1333333333291666e+01 740 152 2.1333333333343749e+01 741 741 6.4000000000291664e+01 741 354 1.3020149240672800e-27 741 748 2.1333333333291666e+01 741 386 -5.3333333333124999e+00 741 737 -1.5999999999979167e+01 741 369 1.0416666666666666e-10 741 367 -5.3333333333124999e+00 741 366 1.0666666666677083e+01 741 358 -1.3233141685082473e-27 741 629 -2.1333333333291666e+01 741 624 1.5999999999979167e+01 741 357 -2.1333333333291666e+01 741 352 2.1333333333343749e+01 742 742 6.4000000000291664e+01 742 386 -5.3333333333124999e+00 742 176 -1.5039633158038590e-27 742 747 2.1333333333291666e+01 742 737 -1.5999999999979167e+01 742 151 1.1000665323307010e-27 742 163 -2.1333333333291666e+01 742 152 2.1333333333343749e+01 742 368 1.0416666666666666e-10 742 627 -2.1333333333291666e+01 742 367 -5.3333333333124999e+00 742 624 1.5999999999979167e+01 742 366 1.0666666666677083e+01 743 743 6.4029166666666654e+01 743 349 1.4465734552327348e-19 743 839 -2.1329166666666662e+01 743 86 -5.3312499999999998e+00 743 735 -1.5997916666666665e+01 743 89 1.0416666666666664e-02 743 93 -5.3312499999999998e+00 743 92 1.0667708333333334e+01 743 364 -1.2659172094511536e-19 743 857 2.1329166666666662e+01 743 739 -1.5997916666666667e+01 743 351 -2.1329166666666662e+01 743 352 2.1334374999999998e+01 744 744 6.4029166666666669e+01 744 86 -5.3312499999999998e+00 744 167 -1.4465734552327348e-19 744 844 -2.1329166666666662e+01 744 735 -1.5997916666666667e+01 744 154 1.4465734552327348e-19 744 156 -2.1329166666666662e+01 744 152 2.1334374999999998e+01 744 94 1.0416666666666664e-02 744 955 -2.1329166666666662e+01 744 93 -5.3312499999999998e+00 744 739 -1.5997916666666665e+01 744 92 1.0667708333333334e+01 745 745 6.4000000000291664e+01 745 161 5.3333333333124999e+00 745 385 -1.3020149240672800e-27 745 638 2.1333333333291666e+01 745 636 -1.5999999999979167e+01 745 384 1.3233141685082473e-27 745 368 2.1333333333291666e+01 745 377 -2.1333333333343749e+01 745 163 -1.0416666666666666e-10 745 746 -2.1333333333291666e+01 745 1043 1.5999999999979167e+01 745 173 5.3333333333124999e+00 745 172 -1.0666666666677083e+01 746 746 6.4000000000291664e+01 746 176 -1.5039633158038590e-27 746 747 -2.1333333333291666e+01 746 386 5.3333333333124999e+00 746 1068 1.5999999999979167e+01 746 368 -1.0416666666666666e-10 746 377 5.3333333333124999e+00 746 384 -1.0666666666677083e+01 746 172 1.1213657767716683e-27 746 745 -2.1333333333291666e+01 746 1043 -1.5999999999979167e+01 746 163 2.1333333333291666e+01 746 173 -2.1333333333343749e+01 747 747 6.4000000000291664e+01 747 173 5.3333333333124999e+00 747 384 -1.3233141685082473e-27 747 746 -2.1333333333291666e+01 747 1068 -1.5999999999979167e+01 747 366 1.1000665323307010e-27 747 368 2.1333333333291666e+01 747 386 -2.1333333333343749e+01 747 163 -1.0416666666666666e-10 747 742 2.1333333333291666e+01 747 737 -1.5999999999979167e+01 747 152 5.3333333333124999e+00 747 176 -1.0666666666677083e+01 748 748 6.4000000000291664e+01 748 391 1.1000665323307010e-27 748 352 5.3333333333124999e+00 748 366 -1.1213657767716683e-27 748 369 2.1333333333291666e+01 748 386 -2.1333333333343749e+01 748 741 2.1333333333291666e+01 748 737 -1.5999999999979167e+01 748 357 -1.0416666666666666e-10 748 749 -2.1333333333291666e+01 748 799 -1.5999999999979167e+01 748 354 -1.0666666666677083e+01 749 749 6.4000000000291664e+01 749 751 -2.1333333333291666e+01 749 388 5.3333333333124999e+00 749 369 -1.0416666666666666e-10 749 386 5.3333333333124999e+00 749 391 -1.0666666666677083e+01 749 354 1.3020149240672800e-27 749 748 -2.1333333333291666e+01 749 799 1.5999999999979167e+01 749 357 2.1333333333291666e+01 750 750 6.4000000000291664e+01 750 388 5.3333333333124999e+00 750 751 -2.1333333333291666e+01 750 358 -1.3233141685082473e-27 750 357 2.1333333333291666e+01 750 369 -1.0416666666666666e-10 750 629 2.1333333333291666e+01 750 367 5.3333333333124999e+00 750 622 -1.5999999999979167e+01 750 370 -1.0666666666677083e+01 751 751 6.4000000000291664e+01 751 391 -1.1000665323307010e-27 751 749 -2.1333333333291666e+01 751 370 1.5039633158038590e-27 751 369 2.1333333333291666e+01 751 388 -2.1333333333343749e+01 751 357 -1.0416666666666666e-10 751 750 -2.1333333333291666e+01 752 752 6.4000000000291664e+01 752 757 2.1333333333291666e+01 752 388 -5.3333333333124999e+00 752 371 1.0416666666666666e-10 752 367 -5.3333333333124999e+00 752 370 1.0666666666677083e+01 752 103 -1.1000665323307010e-27 752 623 -2.1333333333291666e+01 752 622 1.5999999999979167e+01 752 105 -2.1333333333291666e+01 753 753 3.2020833333333336e+01 754 754 6.4029166666666669e+01 754 126 -5.3312499999999998e+00 754 358 -1.4465734552327348e-19 754 630 -2.1329166666666662e+01 754 622 1.5997916666666667e+01 754 353 -2.1329166666666662e+01 754 133 1.0416666666666664e-02 754 830 -2.1329166666666662e+01 754 131 -5.3312499999999998e+00 754 134 1.0667708333333334e+01 755 755 3.2000000000208331e+01 756 756 6.4000000000291664e+01 756 383 -1.3233141685082473e-27 756 758 -2.1333333333291666e+01 756 376 1.1000665323307010e-27 756 371 2.1333333333291666e+01 756 373 -2.1333333333343749e+01 756 105 -1.0416666666666666e-10 756 651 2.1333333333291666e+01 756 650 -1.5999999999979167e+01 756 2196 1.5999999999979167e+01 756 1143 5.3333333333124999e+00 756 1144 -1.0666666666677083e+01 757 757 6.4000000000291664e+01 757 370 -1.3020149240672800e-27 757 752 2.1333333333291666e+01 757 383 1.3233141685082473e-27 757 371 2.1333333333291666e+01 757 388 -2.1333333333343749e+01 757 105 -1.0416666666666666e-10 757 758 -2.1333333333291666e+01 758 758 6.4000000000291664e+01 758 388 5.3333333333124999e+00 758 371 -1.0416666666666666e-10 758 756 -2.1333333333291666e+01 758 373 5.3333333333124999e+00 758 383 -1.0666666666677083e+01 758 757 -2.1333333333291666e+01 758 105 2.1333333333291666e+01 758 1144 -1.5039633158038590e-27 758 2196 -1.5999999999979167e+01 759 759 3.2000000000208331e+01 760 760 6.4000000000291664e+01 760 418 1.1213657767716683e-27 760 695 -2.1333333333291666e+01 760 406 -1.1000665323307010e-27 760 407 -2.1333333333291666e+01 760 403 2.1333333333343749e+01 760 59 1.0416666666666666e-10 760 776 -2.1333333333291666e+01 761 761 3.2000000000208331e+01 762 762 6.4000000000291664e+01 762 416 -1.1000665323307010e-27 762 402 1.1213657767716683e-27 762 404 -2.1333333333291666e+01 762 403 2.1333333333343749e+01 762 767 -2.1333333333291666e+01 762 394 1.0416666666666666e-10 762 768 2.1333333333291666e+01 763 763 3.2000000000208331e+01 764 764 6.4000000000291664e+01 764 406 1.3233141685082473e-27 764 774 2.1333333333291666e+01 764 402 -1.1000665323307010e-27 764 405 -2.1333333333291666e+01 764 403 2.1333333333343749e+01 764 398 1.0416666666666666e-10 764 766 -2.1333333333291666e+01 765 765 6.4000000000291664e+01 765 416 1.3233141685082473e-27 765 907 -2.1333333333291666e+01 765 418 -1.1000665323307010e-27 765 417 -2.1333333333291666e+01 765 403 2.1333333333343749e+01 765 179 1.0416666666666666e-10 765 697 -2.1333333333291666e+01 766 766 6.4000000000291664e+01 766 772 2.1333333333291666e+01 766 420 -5.3333333333124999e+00 766 405 1.0416666666666666e-10 766 403 -5.3333333333124999e+00 766 402 1.0666666666677083e+01 766 764 -2.1333333333291666e+01 766 398 -2.1333333333291666e+01 766 1665 1.1000665323307010e-27 766 2261 1.5999999999979167e+01 767 767 6.4000000000291664e+01 767 420 -5.3333333333124999e+00 767 771 2.1333333333291666e+01 767 394 -2.1333333333291666e+01 767 404 1.0416666666666666e-10 767 762 -2.1333333333291666e+01 767 403 -5.3333333333124999e+00 767 402 1.0666666666677083e+01 767 1099 -1.3233141685082473e-27 767 2261 1.5999999999979167e+01 768 768 6.4000000000291664e+01 768 403 5.3333333333124999e+00 768 397 -1.1000665323307010e-27 768 404 -1.0416666666666666e-10 768 769 -2.1333333333291666e+01 768 414 5.3333333333124999e+00 768 906 1.5999999999979167e+01 768 416 -1.0666666666677083e+01 768 762 2.1333333333291666e+01 768 394 2.1333333333291666e+01 769 769 6.4000000000291664e+01 769 416 -1.1000665323307010e-27 769 768 -2.1333333333291666e+01 769 906 -1.5999999999979167e+01 769 413 1.5039633158038590e-27 769 404 2.1333333333291666e+01 769 414 -2.1333333333343749e+01 769 394 -1.0416666666666666e-10 769 770 -2.1333333333291666e+01 769 916 1.5999999999979167e+01 769 397 -1.0666666666677083e+01 769 1097 5.3333333333124999e+00 770 770 6.4000000000291664e+01 770 771 -2.1333333333291666e+01 770 420 5.3333333333124999e+00 770 404 -1.0416666666666666e-10 770 414 5.3333333333124999e+00 770 413 -1.0666666666677083e+01 770 397 1.1000665323307010e-27 770 769 -2.1333333333291666e+01 770 916 -1.5999999999979167e+01 770 394 2.1333333333291666e+01 770 1099 -1.3233141685082473e-27 770 2053 -1.5999999999979167e+01 770 1097 -2.1333333333343749e+01 771 771 6.4000000000291664e+01 771 413 -1.5039633158038590e-27 771 770 -2.1333333333291666e+01 771 402 1.1213657767716683e-27 771 404 2.1333333333291666e+01 771 420 -2.1333333333343749e+01 771 394 -1.0416666666666666e-10 771 767 2.1333333333291666e+01 771 1097 5.3333333333124999e+00 771 2053 1.5999999999979167e+01 771 2261 1.5999999999979167e+01 771 1099 -1.0666666666677083e+01 772 772 6.4000000000291664e+01 772 402 -1.1000665323307010e-27 772 766 2.1333333333291666e+01 772 421 1.3020149240672800e-27 772 405 2.1333333333291666e+01 772 420 -2.1333333333343749e+01 772 398 -1.0416666666666666e-10 772 773 -2.1333333333291666e+01 772 2261 1.5999999999979167e+01 772 2252 1.5999999999979167e+01 772 1665 -1.0666666666677083e+01 773 773 6.4000000000291664e+01 773 775 -2.1333333333291666e+01 773 409 5.3333333333124999e+00 773 405 -1.0416666666666666e-10 773 420 5.3333333333124999e+00 773 421 -1.0666666666677083e+01 773 772 -2.1333333333291666e+01 773 398 2.1333333333291666e+01 773 1665 1.1000665323307010e-27 773 2252 -1.5999999999979167e+01 774 774 6.4000000000291664e+01 774 409 5.3333333333124999e+00 774 775 -2.1333333333291666e+01 774 398 2.1333333333291666e+01 774 405 -1.0416666666666666e-10 774 764 2.1333333333291666e+01 774 403 5.3333333333124999e+00 774 406 -1.0666666666677083e+01 775 775 6.4000000000291664e+01 775 421 -1.3020149240672800e-27 775 773 -2.1333333333291666e+01 775 406 1.3233141685082473e-27 775 405 2.1333333333291666e+01 775 409 -2.1333333333343749e+01 775 398 -1.0416666666666666e-10 775 774 -2.1333333333291666e+01 776 776 6.4000000000291664e+01 776 778 2.1333333333291666e+01 776 409 -5.3333333333124999e+00 776 407 1.0416666666666666e-10 776 403 -5.3333333333124999e+00 776 406 1.0666666666677083e+01 776 760 -2.1333333333291666e+01 776 59 -2.1333333333291666e+01 777 777 3.2000000000208331e+01 778 778 6.4000000000291664e+01 778 406 -1.1000665323307010e-27 778 776 2.1333333333291666e+01 778 412 1.5039633158038590e-27 778 407 2.1333333333291666e+01 778 409 -2.1333333333343749e+01 778 59 -1.0416666666666666e-10 778 779 -2.1333333333291666e+01 779 779 6.4000000000291664e+01 779 62 -1.3233141685082473e-27 779 780 -2.1333333333291666e+01 779 423 5.3333333333124999e+00 779 811 1.5999999999979167e+01 779 407 -1.0416666666666666e-10 779 409 5.3333333333124999e+00 779 412 -1.0666666666677083e+01 779 778 -2.1333333333291666e+01 779 59 2.1333333333291666e+01 780 780 6.4000000000291664e+01 780 412 -1.5039633158038590e-27 780 779 -2.1333333333291666e+01 780 811 -1.5999999999979167e+01 780 418 1.1213657767716683e-27 780 407 2.1333333333291666e+01 780 423 -2.1333333333343749e+01 780 59 -1.0416666666666666e-10 780 695 2.1333333333291666e+01 780 694 -1.5999999999979167e+01 780 62 -1.0666666666677083e+01 781 781 6.4000000000291664e+01 781 346 -1.3233141685082473e-27 781 329 1.3020149240672800e-27 781 331 -2.1333333333291666e+01 781 330 2.1333333333343749e+01 781 784 -2.1333333333291666e+01 781 428 1.0416666666666666e-10 781 785 2.1333333333291666e+01 781 1447 -5.3333333333124999e+00 781 2159 -1.5999999999979167e+01 781 3385 -1.5999999999979167e+01 781 2834 -5.3333333333124999e+00 781 1446 1.0666666666677083e+01 782 782 6.4000000000291664e+01 782 333 1.1000665323307010e-27 782 791 2.1333333333291666e+01 782 329 -1.5039633158038590e-27 782 332 -2.1333333333291666e+01 782 330 2.1333333333343749e+01 782 433 1.0416666666666666e-10 782 783 -2.1333333333291666e+01 782 2165 -1.5999999999979167e+01 782 2159 -1.5999999999979167e+01 782 1101 -5.3333333333124999e+00 782 1112 1.0666666666677083e+01 783 783 6.4000000000291664e+01 783 789 2.1333333333291666e+01 783 342 -5.3333333333124999e+00 783 332 1.0416666666666666e-10 783 330 -5.3333333333124999e+00 783 329 1.0666666666677083e+01 783 782 -2.1333333333291666e+01 783 433 -2.1333333333291666e+01 783 1100 1.3233141685082473e-27 783 2046 1.5999999999979167e+01 783 1112 -1.1000665323307010e-27 783 2159 1.5999999999979167e+01 783 1101 2.1333333333343749e+01 784 784 6.4000000000291664e+01 784 342 -5.3333333333124999e+00 784 788 2.1333333333291666e+01 784 428 -2.1333333333291666e+01 784 331 1.0416666666666666e-10 784 781 -2.1333333333291666e+01 784 330 -5.3333333333124999e+00 784 329 1.0666666666677083e+01 784 1462 -1.1000665323307010e-27 784 2046 1.5999999999979167e+01 784 1446 1.1213657767716683e-27 784 1447 2.1333333333343749e+01 784 2159 1.5999999999979167e+01 785 785 6.4000000000291664e+01 785 330 5.3333333333124999e+00 785 432 -1.5039633158038590e-27 785 331 -1.0416666666666666e-10 785 786 -2.1333333333291666e+01 785 345 5.3333333333124999e+00 785 1020 1.5999999999979167e+01 785 346 -1.0666666666677083e+01 785 781 2.1333333333291666e+01 785 428 2.1333333333291666e+01 785 1446 1.1213657767716683e-27 785 3385 -1.5999999999979167e+01 785 2834 -2.1333333333343749e+01 786 786 6.4000000000291664e+01 786 346 -1.3233141685082473e-27 786 785 -2.1333333333291666e+01 786 1020 -1.5999999999979167e+01 786 344 1.1000665323307010e-27 786 331 2.1333333333291666e+01 786 345 -2.1333333333343749e+01 786 428 -1.0416666666666666e-10 786 787 -2.1333333333291666e+01 786 1064 1.5999999999979167e+01 786 432 -1.0666666666677083e+01 786 2834 5.3333333333124999e+00 786 1460 5.3333333333124999e+00 787 787 6.4000000000291664e+01 787 788 -2.1333333333291666e+01 787 342 5.3333333333124999e+00 787 331 -1.0416666666666666e-10 787 345 5.3333333333124999e+00 787 344 -1.0666666666677083e+01 787 432 1.5039633158038590e-27 787 786 -2.1333333333291666e+01 787 1064 -1.5999999999979167e+01 787 428 2.1333333333291666e+01 787 1462 -1.1000665323307010e-27 787 2047 -1.5999999999979167e+01 787 1460 -2.1333333333343749e+01 788 788 6.4000000000291664e+01 788 344 -1.1000665323307010e-27 788 787 -2.1333333333291666e+01 788 329 1.3020149240672800e-27 788 331 2.1333333333291666e+01 788 342 -2.1333333333343749e+01 788 428 -1.0416666666666666e-10 788 784 2.1333333333291666e+01 788 1460 5.3333333333124999e+00 788 2047 1.5999999999979167e+01 788 2046 1.5999999999979167e+01 788 1447 5.3333333333124999e+00 788 1462 -1.0666666666677083e+01 789 789 6.4000000000291664e+01 789 329 -1.5039633158038590e-27 789 783 2.1333333333291666e+01 789 343 1.1213657767716683e-27 789 332 2.1333333333291666e+01 789 342 -2.1333333333343749e+01 789 433 -1.0416666666666666e-10 789 790 -2.1333333333291666e+01 789 1101 5.3333333333124999e+00 789 2046 1.5999999999979167e+01 789 1703 1.5999999999979167e+01 789 1100 -1.0666666666677083e+01 790 790 6.4000000000291664e+01 790 792 -2.1333333333291666e+01 790 335 5.3333333333124999e+00 790 332 -1.0416666666666666e-10 790 342 5.3333333333124999e+00 790 343 -1.0666666666677083e+01 790 789 -2.1333333333291666e+01 790 433 2.1333333333291666e+01 790 1100 1.3233141685082473e-27 790 1703 -1.5999999999979167e+01 791 791 6.4000000000291664e+01 791 335 5.3333333333124999e+00 791 792 -2.1333333333291666e+01 791 433 2.1333333333291666e+01 791 332 -1.0416666666666666e-10 791 782 2.1333333333291666e+01 791 330 5.3333333333124999e+00 791 333 -1.0666666666677083e+01 791 1112 -1.1000665323307010e-27 791 2165 -1.5999999999979167e+01 792 792 6.4000000000291664e+01 792 343 -1.1213657767716683e-27 792 790 -2.1333333333291666e+01 792 333 1.1000665323307010e-27 792 332 2.1333333333291666e+01 792 335 -2.1333333333343749e+01 792 433 -1.0416666666666666e-10 792 791 -2.1333333333291666e+01 793 793 3.2000000000208331e+01 794 794 3.2000000000208331e+01 795 795 3.2000000000208331e+01 796 796 6.4000000000291664e+01 796 421 -1.5039633158038590e-27 796 408 1.1000665323307010e-27 796 410 -2.1333333333291666e+01 796 409 2.1333333333343749e+01 796 803 -2.1333333333291666e+01 796 436 1.0416666666666666e-10 796 804 2.1333333333291666e+01 797 797 3.2000000000208331e+01 798 798 6.4000000000291664e+01 798 412 1.3020149240672800e-27 798 809 2.1333333333291666e+01 798 408 -1.3233141685082473e-27 798 411 -2.1333333333291666e+01 798 409 2.1333333333343749e+01 798 355 1.0416666666666666e-10 798 802 -2.1333333333291666e+01 799 799 6.4000000000416662e+01 799 410 -5.3333333333124999e+00 799 355 5.3333333333124999e+00 799 808 -1.5999999999979167e+01 799 411 -5.3333333333124999e+00 799 426 5.3333333333958333e+00 799 802 -1.5999999999979167e+01 799 408 5.3333333333333330e+00 799 803 -1.5999999999979167e+01 799 807 -1.5999999999979167e+01 799 436 5.3333333333124999e+00 799 369 -5.3333333333124999e+00 799 439 5.3333333333124999e+00 799 440 -5.3333333333333330e+00 799 1071 1.5999999999979167e+01 799 389 -5.3333333333124999e+00 799 386 5.3333333333958333e+00 799 801 -1.5999999999979167e+01 799 391 5.3333333333333330e+00 799 749 1.5999999999979167e+01 799 748 -1.5999999999979167e+01 799 357 5.3333333333124999e+00 799 354 -5.3333333333333330e+00 800 800 3.2000000000208331e+01 801 801 6.4000000000291664e+01 801 388 -5.3333333333124999e+00 801 440 1.5039633158038590e-27 801 389 1.0416666666666666e-10 801 1071 -2.1333333333291666e+01 801 386 -5.3333333333124999e+00 801 799 -1.5999999999979167e+01 801 391 1.0666666666677083e+01 801 1072 -2.1333333333291666e+01 801 439 -2.1333333333291666e+01 802 802 6.4000000000291664e+01 802 354 1.5039633158038590e-27 802 808 2.1333333333291666e+01 802 426 -5.3333333333124999e+00 802 799 -1.5999999999979167e+01 802 411 1.0416666666666666e-10 802 409 -5.3333333333124999e+00 802 408 1.0666666666677083e+01 802 798 -2.1333333333291666e+01 802 355 -2.1333333333291666e+01 803 803 6.4000000000291664e+01 803 426 -5.3333333333124999e+00 803 440 -1.3020149240672800e-27 803 807 2.1333333333291666e+01 803 799 -1.5999999999979167e+01 803 436 -2.1333333333291666e+01 803 410 1.0416666666666666e-10 803 796 -2.1333333333291666e+01 803 409 -5.3333333333124999e+00 803 408 1.0666666666677083e+01 804 804 6.4000000000291664e+01 804 409 5.3333333333124999e+00 804 410 -1.0416666666666666e-10 804 805 -2.1333333333291666e+01 804 420 5.3333333333124999e+00 804 421 -1.0666666666677083e+01 804 796 2.1333333333291666e+01 804 436 2.1333333333291666e+01 804 1389 -1.3233141685082473e-27 804 2252 -1.5999999999979167e+01 805 805 6.4000000000291664e+01 805 421 -1.5039633158038590e-27 805 804 -2.1333333333291666e+01 805 419 1.1213657767716683e-27 805 410 2.1333333333291666e+01 805 420 -2.1333333333343749e+01 805 436 -1.0416666666666666e-10 805 806 -2.1333333333291666e+01 805 2252 1.5999999999979167e+01 805 2260 1.5999999999979167e+01 805 1390 5.3333333333124999e+00 805 1389 -1.0666666666677083e+01 806 806 6.4000000000291664e+01 806 440 -1.3020149240672800e-27 806 807 -2.1333333333291666e+01 806 426 5.3333333333124999e+00 806 1033 1.5999999999979167e+01 806 410 -1.0416666666666666e-10 806 420 5.3333333333124999e+00 806 419 -1.0666666666677083e+01 806 805 -2.1333333333291666e+01 806 436 2.1333333333291666e+01 806 1389 1.3233141685082473e-27 806 2260 -1.5999999999979167e+01 806 1390 -2.1333333333343749e+01 807 807 6.4000000000291664e+01 807 419 -1.1213657767716683e-27 807 806 -2.1333333333291666e+01 807 1033 -1.5999999999979167e+01 807 408 1.1000665323307010e-27 807 410 2.1333333333291666e+01 807 426 -2.1333333333343749e+01 807 436 -1.0416666666666666e-10 807 803 2.1333333333291666e+01 807 799 -1.5999999999979167e+01 807 440 -1.0666666666677083e+01 807 1390 5.3333333333124999e+00 808 808 6.4000000000291664e+01 808 408 -1.3233141685082473e-27 808 802 2.1333333333291666e+01 808 799 -1.5999999999979167e+01 808 427 1.1000665323307010e-27 808 411 2.1333333333291666e+01 808 426 -2.1333333333343749e+01 808 355 -1.0416666666666666e-10 808 738 2.1333333333291666e+01 808 737 -1.5999999999979167e+01 808 352 5.3333333333124999e+00 808 354 -1.0666666666677083e+01 809 809 6.4000000000291664e+01 809 423 5.3333333333124999e+00 809 364 1.1000665323307010e-27 809 810 -2.1333333333291666e+01 809 811 1.5999999999979167e+01 809 355 2.1333333333291666e+01 809 411 -1.0416666666666666e-10 809 798 2.1333333333291666e+01 809 409 5.3333333333124999e+00 809 412 -1.0666666666677083e+01 810 810 6.4000000000291664e+01 810 352 5.3333333333124999e+00 810 427 -1.1000665323307010e-27 810 738 2.1333333333291666e+01 810 739 -1.5999999999979167e+01 810 412 1.3020149240672800e-27 810 411 2.1333333333291666e+01 810 423 -2.1333333333343749e+01 810 355 -1.0416666666666666e-10 810 809 -2.1333333333291666e+01 810 811 -1.5999999999979167e+01 810 364 -1.0666666666677083e+01 811 811 6.4020833333541660e+01 811 411 -5.3333333333124999e+00 811 59 5.3333333333124999e+00 811 780 -1.5999999999979167e+01 811 407 -5.3333333333124999e+00 811 423 5.3333333333958333e+00 811 779 1.5999999999979167e+01 811 412 5.3333333333333330e+00 811 809 1.5999999999979167e+01 811 810 -1.5999999999979167e+01 811 355 5.3333333333124999e+00 811 79 -5.3312499999999998e+00 811 351 5.3312499999999998e+00 811 364 -5.3333333333333330e+00 811 857 -1.5997916666666667e+01 811 89 -5.3312499999999998e+00 811 93 5.3395833333333327e+00 811 812 -1.5997916666666665e+01 811 90 5.3333333333333330e+00 811 549 1.5997916666666667e+01 811 548 -1.5997916666666665e+01 811 54 5.3312499999999998e+00 811 62 -5.3333333333333330e+00 812 812 6.4029166666666654e+01 812 364 1.2659172094511536e-19 812 857 2.1329166666666662e+01 812 93 -5.3312499999999998e+00 812 811 -1.5997916666666665e+01 812 89 1.0416666666666664e-02 812 75 -5.3312499999999998e+00 812 90 1.0667708333333334e+01 812 529 -2.1329166666666662e+01 812 351 -2.1329166666666662e+01 813 813 6.4000000000916657e+01 813 441 -1.0416666666666666e-11 813 109 -5.3333333332812494e+00 813 108 2.0833333333333342e-11 813 554 -2.1333333333291666e+01 813 552 2.1333333333208333e+01 813 100 5.3333333333020834e+00 813 825 2.1333333333291666e+01 813 115 -1.0416666666666666e-11 813 114 5.3333333332916668e+00 813 814 -1.0666666666666666e+01 813 4356 -1.0416666666666666e-11 813 4071 -1.0416666666666666e-11 813 4073 6.2499999999999991e-11 813 1522 -4.1666666666666665e-11 813 5059 1.0666666666583334e+01 813 2319 -1.0666666666666666e+01 813 1146 -1.0666666666833333e+01 813 4355 1.0416666666666666e-10 813 2318 -2.1333333333208333e+01 813 1691 5.3333333332916668e+00 813 4154 1.0416666666666667e-10 813 4775 1.0666666666583334e+01 814 814 4.2666666666916662e+01 814 116 -5.3333333333229165e+00 814 441 6.2499999999999991e-11 814 818 -2.1333333333312499e+01 814 115 6.2499999999999991e-11 814 813 -1.0666666666666666e+01 814 114 1.0666666666687499e+01 814 4073 -5.3333333333229165e+00 814 2315 -1.0666666666666666e+01 814 1524 -5.3333333333229165e+00 814 1522 1.0666666666687499e+01 814 4775 -2.1333333333312499e+01 814 4154 -5.3333333333229165e+00 815 815 4.2666666666916662e+01 815 109 -5.3333333333229165e+00 815 556 -2.1333333333312499e+01 815 552 1.0666666666666666e+01 815 230 -5.3333333333229165e+00 815 221 6.2499999999999991e-11 815 112 6.2500000000000004e-11 815 817 -2.1333333333312499e+01 815 116 -5.3333333333229165e+00 815 114 1.0666666666687499e+01 815 1614 -5.3333333333229165e+00 815 1613 1.0666666666687499e+01 815 2315 -1.0666666666666666e+01 816 816 4.2666666667333331e+01 816 112 1.0416666666666666e-11 816 441 1.0416666666666666e-11 816 115 1.0416666666666666e-11 816 116 -6.2499999999999991e-11 816 818 -1.0666666666583334e+01 816 1075 1.0666666666666666e+01 816 442 4.1666666666666665e-11 816 221 1.0416666666666666e-11 816 228 4.1666666666666665e-11 816 817 -1.0666666666583334e+01 816 820 -1.0666666666666666e+01 816 2492 4.1666666666666665e-11 816 3699 1.0666666666666666e+01 816 4316 1.0416666666666666e-11 816 1612 1.0416666666666666e-11 816 1223 1.0416666666666666e-11 816 1228 -6.2499999999999991e-11 816 4318 4.1666666666666665e-11 816 2096 -1.0666666666583334e+01 816 4068 1.0416666666666666e-11 816 1524 -6.2499999999999991e-11 816 1993 -1.0666666666583334e+01 816 5005 1.0666666666666666e+01 816 1614 -6.2499999999999991e-11 817 817 6.4000000000416662e+01 817 815 -2.1333333333312499e+01 817 112 -1.0666666666583334e+01 817 116 2.1333333333312499e+01 817 114 -5.3333333333124999e+00 817 820 2.1333333333312499e+01 817 816 -1.0666666666583334e+01 817 221 -1.0666666666583334e+01 817 228 -5.3333333333124999e+00 817 2492 -5.3333333333124999e+00 817 1613 -5.3333333333124999e+00 817 2315 1.0666666666583334e+01 817 1614 2.1333333333312499e+01 818 818 6.4000000000416662e+01 818 442 -5.3333333333124999e+00 818 816 -1.0666666666583334e+01 818 115 -1.0666666666583334e+01 818 116 2.1333333333312499e+01 818 114 -5.3333333333124999e+00 818 814 -2.1333333333312499e+01 818 441 -1.0666666666583334e+01 818 3699 -2.1333333333312499e+01 818 2492 -5.3333333333124999e+00 818 2315 1.0666666666583334e+01 818 1524 2.1333333333312499e+01 818 1522 -5.3333333333124999e+00 819 819 6.4041666666666671e+01 819 224 5.3312499999999998e+00 819 942 -1.5997916666666667e+01 819 478 -5.3312499999999998e+00 819 480 5.3395833333333327e+00 819 822 -1.5997916666666665e+01 819 477 5.3333333333333330e+00 819 823 -1.5997916666666667e+01 819 941 -1.5997916666666665e+01 819 128 -5.3312499999999998e+00 819 113 5.3312499999999998e+00 819 112 -5.3395833333333327e+00 819 118 -5.3333333333333330e+00 819 569 -1.5997916666666667e+01 819 121 -5.3312499999999998e+00 819 141 5.3395833333333327e+00 819 566 1.5997916666666665e+01 819 142 5.3333333333333330e+00 819 648 1.5997916666666667e+01 819 647 -1.5997916666666665e+01 819 222 5.3312499999999998e+00 819 221 -5.3395833333333327e+00 819 220 -5.3333333333333330e+00 819 2475 -5.3312499999999998e+00 819 2486 5.3312499999999998e+00 820 820 4.2666666666916662e+01 820 116 5.3333333333229165e+00 820 231 5.3333333333229165e+00 820 112 -6.2499999999999991e-11 820 821 -2.1333333333312499e+01 820 221 -6.2500000000000004e-11 820 817 2.1333333333312499e+01 820 816 -1.0666666666666666e+01 820 228 -1.0666666666687499e+01 820 3474 1.0666666666666666e+01 820 2484 5.3333333333229165e+00 820 2492 -1.0666666666687499e+01 820 1614 5.3333333333229165e+00 821 821 6.4020833333541674e+01 821 228 5.3333333333124999e+00 821 820 -2.1333333333312499e+01 821 478 -5.3312499999999998e+00 821 112 2.6635416666250000e+00 821 823 -1.5997916666666665e+01 821 477 5.3333333333333330e+00 821 822 -1.5997916666666667e+01 821 940 1.5997916666666665e+01 821 224 5.3312499999999998e+00 821 221 2.6635416666250000e+00 821 231 -1.3333333333322916e+01 821 3474 -1.0666666666583334e+01 821 2492 5.3333333333124999e+00 821 2486 5.3312499999999998e+00 821 2484 -1.3333333333322916e+01 821 3473 1.5997916666666667e+01 821 2475 -5.3312499999999998e+00 821 2477 5.3395833333333327e+00 822 822 6.4029166666666654e+01 822 220 1.4465734552327348e-19 822 942 2.1329166666666662e+01 822 480 -5.3312499999999998e+00 822 819 -1.5997916666666665e+01 822 478 1.0416666666666664e-02 822 477 1.0667708333333334e+01 822 231 -1.4465734552327348e-19 822 940 -2.1329166666666662e+01 822 821 -1.5997916666666667e+01 822 224 -2.1329166666666662e+01 822 221 2.1334374999999998e+01 822 2477 -5.3312499999999998e+00 823 823 6.4029166666666669e+01 823 480 -5.3312499999999998e+00 823 118 -9.9486666632977745e-20 823 941 2.1329166666666662e+01 823 819 -1.5997916666666667e+01 823 112 2.1334374999999998e+01 823 821 -1.5997916666666665e+01 823 477 1.0667708333333334e+01 823 2484 1.4465734552327348e-19 823 2486 -2.1329166666666662e+01 823 2475 1.0416666666666664e-02 823 3473 -2.1329166666666662e+01 823 2477 -5.3312499999999998e+00 824 824 4.2666666667083327e+01 824 33 1.0666666666666666e+01 824 825 -1.0666666666666666e+01 824 5057 -1.0666666666666666e+01 824 4355 1.0666666666666666e+01 825 825 5.3333333333749991e+01 825 813 2.1333333333291666e+01 825 33 -6.2499999999999991e-11 825 824 -1.0666666666666666e+01 825 108 5.3333333333437496e+00 825 574 1.0666666666666666e+01 825 1146 -1.0666666666625000e+01 825 1691 3.5848693552059962e-28 825 2318 -3.2000000000020833e+01 825 4355 5.3333333333229165e+00 826 826 2.1333333333541667e+01 827 827 2.1333333333541667e+01 828 828 6.4029166666666654e+01 828 139 -1.4465734552327348e-19 828 130 1.4465734552327348e-19 828 132 -2.1329166666666662e+01 828 131 2.1334374999999998e+01 828 834 -2.1329166666666662e+01 828 11 1.0416666666666664e-02 828 505 -2.1329166666666662e+01 829 829 3.2020833333333336e+01 830 830 6.4029166666666669e+01 830 134 1.4465734552327348e-19 830 754 -2.1329166666666662e+01 830 130 -1.2659172094511536e-19 830 133 -2.1329166666666662e+01 830 131 2.1334374999999998e+01 830 353 1.0416666666666664e-02 830 833 -2.1329166666666662e+01 831 831 6.4041666666666671e+01 831 132 -5.3312499999999998e+00 831 353 5.3312499999999998e+00 831 838 -1.5997916666666667e+01 831 133 -5.3312499999999998e+00 831 135 5.3395833333333327e+00 831 833 -1.5997916666666665e+01 831 130 5.3333333333333330e+00 831 834 -1.5997916666666667e+01 831 835 -1.5997916666666665e+01 831 11 5.3312499999999998e+00 831 89 -5.3312499999999998e+00 831 8 5.3312499999999998e+00 831 18 -5.3333333333333330e+00 831 537 -1.5997916666666667e+01 831 76 -5.3312499999999998e+00 831 86 5.3395833333333327e+00 831 536 1.5997916666666665e+01 831 88 5.3333333333333330e+00 831 832 -1.5997916666666667e+01 831 839 1.5997916666666665e+01 831 351 5.3312499999999998e+00 831 349 -5.3333333333333330e+00 832 832 6.4029166666666654e+01 832 529 -2.1329166666666662e+01 832 75 -5.3312499999999998e+00 832 89 1.0416666666666664e-02 832 86 -5.3312499999999998e+00 832 88 1.0667708333333334e+01 832 349 -1.4465734552327348e-19 832 839 -2.1329166666666662e+01 832 831 -1.5997916666666667e+01 832 351 -2.1329166666666662e+01 833 833 6.4029166666666654e+01 833 349 1.4465734552327348e-19 833 838 2.1329166666666662e+01 833 135 -5.3312499999999998e+00 833 831 -1.5997916666666665e+01 833 133 1.0416666666666664e-02 833 131 -5.3312499999999998e+00 833 130 1.0667708333333334e+01 833 830 -2.1329166666666662e+01 833 353 -2.1329166666666662e+01 834 834 6.4029166666666669e+01 834 135 -5.3312499999999998e+00 834 18 -1.4465734552327348e-19 834 835 2.1329166666666662e+01 834 831 -1.5997916666666667e+01 834 11 -2.1329166666666662e+01 834 132 1.0416666666666664e-02 834 828 -2.1329166666666662e+01 834 131 -5.3312499999999998e+00 834 130 1.0667708333333334e+01 835 835 6.4029166666666669e+01 835 19 5.3312499999999998e+00 835 136 -9.9486666632977745e-20 835 836 -2.1329166666666662e+01 835 840 1.5997916666666667e+01 835 130 1.4465734552327348e-19 835 132 2.1329166666666662e+01 835 135 -2.1334374999999998e+01 835 11 -1.0416666666666664e-02 835 834 2.1329166666666662e+01 835 831 -1.5997916666666665e+01 835 18 -1.0667708333333334e+01 836 836 6.4029166666666669e+01 836 138 5.3312499999999998e+00 836 20 1.2659172094511536e-19 836 837 -2.1329166666666662e+01 836 846 1.5997916666666667e+01 836 18 -1.4465734552327348e-19 836 11 2.1329166666666662e+01 836 19 -2.1334374999999998e+01 836 132 -1.0416666666666664e-02 836 835 -2.1329166666666662e+01 836 135 5.3312499999999998e+00 836 840 -1.5997916666666665e+01 836 136 -1.0667708333333334e+01 837 837 6.4029166666666669e+01 837 139 -1.4465734552327348e-19 837 505 2.1329166666666662e+01 837 502 -1.5997916666666667e+01 837 136 9.9486666632977745e-20 837 132 2.1329166666666662e+01 837 138 -2.1334374999999998e+01 837 11 -1.0416666666666664e-02 837 836 -2.1329166666666662e+01 837 846 -1.5997916666666665e+01 837 19 5.3312499999999998e+00 837 20 -1.0667708333333334e+01 838 838 6.4029166666666654e+01 838 144 1.4465734552327348e-19 838 130 -1.2659172094511536e-19 838 133 2.1329166666666662e+01 838 135 -2.1334374999999998e+01 838 833 2.1329166666666662e+01 838 831 -1.5997916666666667e+01 838 353 -1.0416666666666664e-02 838 736 2.1329166666666662e+01 838 735 -1.5997916666666665e+01 838 352 5.3312499999999998e+00 838 349 -1.0667708333333334e+01 839 839 6.4029166666666669e+01 839 352 -5.3312499999999998e+00 839 92 9.9486666632977745e-20 839 743 -2.1329166666666662e+01 839 735 1.5997916666666667e+01 839 88 -1.4465734552327348e-19 839 89 -2.1329166666666662e+01 839 86 2.1334374999999998e+01 839 351 1.0416666666666664e-02 839 832 -2.1329166666666662e+01 839 831 1.5997916666666665e+01 839 349 1.0667708333333334e+01 840 840 6.4041666666666671e+01 840 137 5.3312499999999998e+00 840 11 -5.3312499999999998e+00 840 835 1.5997916666666667e+01 840 132 5.3312499999999998e+00 840 135 -5.3395833333333327e+00 840 836 -1.5997916666666665e+01 840 136 -5.3333333333333330e+00 840 76 5.3312499999999998e+00 840 451 -5.3312499999999998e+00 840 843 -1.5997916666666667e+01 840 87 5.3312499999999998e+00 840 86 -5.3395833333333327e+00 840 851 1.5997916666666665e+01 840 85 -5.3333333333333330e+00 840 538 -1.5997916666666667e+01 840 537 1.5997916666666665e+01 840 8 -5.3312499999999998e+00 840 19 5.3395833333333327e+00 840 18 5.3333333333333330e+00 840 845 1.5997916666666667e+01 840 841 -1.5997916666666665e+01 840 446 -5.3312499999999998e+00 840 445 5.3395833333333327e+00 840 444 5.3333333333333330e+00 841 841 6.4029166666666669e+01 841 453 -5.3312499999999998e+00 841 143 1.2659172094511536e-19 841 861 2.1329166666666662e+01 841 842 -1.5997916666666667e+01 841 136 -1.4465734552327348e-19 841 137 -2.1329166666666662e+01 841 135 2.1334374999999998e+01 841 446 1.0416666666666664e-02 841 845 -2.1329166666666662e+01 841 840 -1.5997916666666665e+01 841 445 -5.3312499999999998e+00 841 444 1.0667708333333334e+01 842 842 6.4041666666666671e+01 842 87 5.3312499999999998e+00 842 156 -5.3312499999999998e+00 842 844 -1.5997916666666667e+01 842 94 5.3312499999999998e+00 842 86 -5.3395833333333327e+00 842 957 -1.5997916666666665e+01 842 95 -5.3333333333333330e+00 842 127 5.3312499999999998e+00 842 446 -5.3312499999999998e+00 842 841 -1.5997916666666667e+01 842 137 5.3312499999999998e+00 842 135 -5.3395833333333327e+00 842 861 -1.5997916666666665e+01 842 143 -5.3333333333333330e+00 842 645 -1.5997916666666667e+01 842 644 1.5997916666666665e+01 842 153 -5.3312499999999998e+00 842 168 5.3395833333333327e+00 842 167 5.3333333333333330e+00 842 854 -1.5997916666666667e+01 842 843 -1.5997916666666665e+01 842 451 -5.3312499999999998e+00 842 453 5.3395833333333327e+00 842 444 5.3333333333333330e+00 843 843 6.4029166666666654e+01 843 95 -1.4465734552327348e-19 843 445 -5.3312499999999998e+00 843 85 9.9486666632977745e-20 843 87 -2.1329166666666662e+01 843 86 2.1334374999999998e+01 843 851 -2.1329166666666662e+01 843 840 -1.5997916666666667e+01 843 451 1.0416666666666664e-02 843 854 2.1329166666666662e+01 843 842 -1.5997916666666665e+01 843 453 -5.3312499999999998e+00 843 444 1.0667708333333334e+01 844 844 6.4029166666666669e+01 844 168 -5.3312499999999998e+00 844 95 1.2659172094511536e-19 844 957 2.1329166666666662e+01 844 842 -1.5997916666666667e+01 844 92 -1.4465734552327348e-19 844 94 -2.1329166666666662e+01 844 86 2.1334374999999998e+01 844 156 1.0416666666666664e-02 844 744 -2.1329166666666662e+01 844 735 1.5997916666666665e+01 844 152 -5.3312499999999998e+00 844 167 1.0667708333333334e+01 845 845 6.4029166666666654e+01 845 447 1.4465734552327348e-19 845 858 2.1329166666666662e+01 845 138 -5.3312499999999998e+00 845 846 -1.5997916666666665e+01 845 137 1.0416666666666664e-02 845 135 -5.3312499999999998e+00 845 136 1.0667708333333334e+01 845 444 -1.4465734552327348e-19 845 841 -2.1329166666666662e+01 845 840 1.5997916666666667e+01 845 446 -2.1329166666666662e+01 845 445 2.1334374999999998e+01 846 846 6.4041666666666671e+01 846 14 5.3312499999999998e+00 846 509 -1.5997916666666667e+01 846 40 -5.3312499999999998e+00 846 43 5.3395833333333327e+00 846 510 1.5997916666666665e+01 846 44 5.3333333333333330e+00 846 132 -5.3312499999999998e+00 846 446 5.3312499999999998e+00 846 858 -1.5997916666666667e+01 846 137 -5.3312499999999998e+00 846 138 5.3395833333333327e+00 846 845 -1.5997916666666665e+01 846 136 5.3333333333333330e+00 846 836 1.5997916666666667e+01 846 837 -1.5997916666666665e+01 846 11 5.3312499999999998e+00 846 19 -5.3395833333333327e+00 846 20 -5.3333333333333330e+00 846 847 -1.5997916666666667e+01 846 862 1.5997916666666665e+01 846 445 -5.3395833333333327e+00 846 447 -5.3333333333333330e+00 846 2860 -5.3312499999999998e+00 846 2853 5.3312499999999998e+00 847 847 6.4029166666666654e+01 847 448 1.4465734552327348e-19 847 865 2.1329166666666662e+01 847 45 -5.3312499999999998e+00 847 848 -1.5997916666666665e+01 847 43 -5.3312499999999998e+00 847 44 1.0667708333333334e+01 847 447 -1.2659172094511536e-19 847 862 -2.1329166666666662e+01 847 846 -1.5997916666666667e+01 847 445 2.1334374999999998e+01 847 2860 1.0416666666666664e-02 847 2853 -2.1329166666666662e+01 848 848 6.4041666666666671e+01 848 263 -5.3312499999999998e+00 848 17 5.3312499999999998e+00 848 876 -1.5997916666666667e+01 848 258 -5.3312499999999998e+00 848 261 5.3395833333333327e+00 848 852 -1.5997916666666665e+01 848 262 5.3333333333333330e+00 848 40 -5.3312499999999998e+00 848 865 -1.5997916666666667e+01 848 45 5.3395833333333327e+00 848 847 -1.5997916666666665e+01 848 44 5.3333333333333330e+00 848 510 1.5997916666666667e+01 848 511 -1.5997916666666665e+01 848 14 5.3312499999999998e+00 848 19 -5.3395833333333327e+00 848 21 -5.3333333333333330e+00 848 849 -1.5997916666666667e+01 848 882 1.5997916666666665e+01 848 449 5.3312499999999998e+00 848 445 -5.3395833333333327e+00 848 448 -5.3333333333333330e+00 848 2853 5.3312499999999998e+00 848 2860 -5.3312499999999998e+00 849 849 6.4029166666666654e+01 849 450 1.4465734552327348e-19 849 892 2.1329166666666662e+01 849 264 -5.3312499999999998e+00 849 850 -1.5997916666666665e+01 849 263 1.0416666666666664e-02 849 261 -5.3312499999999998e+00 849 262 1.0667708333333334e+01 849 448 -1.4465734552327348e-19 849 882 -2.1329166666666662e+01 849 848 -1.5997916666666667e+01 849 449 -2.1329166666666662e+01 849 445 2.1334374999999998e+01 850 850 6.4041666666666671e+01 850 87 -5.3312499999999998e+00 850 8 5.3312499999999998e+00 850 539 -1.5997916666666667e+01 850 76 -5.3312499999999998e+00 850 91 5.3395833333333327e+00 850 538 1.5997916666666665e+01 850 85 5.3333333333333330e+00 850 258 -5.3312499999999998e+00 850 449 5.3312499999999998e+00 850 892 -1.5997916666666667e+01 850 263 -5.3312499999999998e+00 850 264 5.3395833333333327e+00 850 849 -1.5997916666666665e+01 850 262 5.3333333333333330e+00 850 852 -1.5997916666666667e+01 850 877 -1.5997916666666665e+01 850 17 5.3312499999999998e+00 850 19 -5.3395833333333327e+00 850 22 -5.3333333333333330e+00 850 851 -1.5997916666666667e+01 850 853 -1.5997916666666665e+01 850 451 5.3312499999999998e+00 850 445 -5.3395833333333327e+00 850 450 -5.3333333333333330e+00 851 851 6.4029166666666669e+01 851 91 -5.3312499999999998e+00 851 444 1.4465734552327348e-19 851 87 1.0416666666666664e-02 851 843 -2.1329166666666662e+01 851 86 -5.3312499999999998e+00 851 840 1.5997916666666665e+01 851 85 1.0667708333333334e+01 851 450 -1.2659172094511536e-19 851 853 2.1329166666666662e+01 851 850 -1.5997916666666667e+01 851 451 -2.1329166666666662e+01 851 445 2.1334374999999998e+01 852 852 6.4029166666666669e+01 852 264 -5.3312499999999998e+00 852 22 -1.2659172094511536e-19 852 877 2.1329166666666662e+01 852 850 -1.5997916666666667e+01 852 21 1.4465734552327348e-19 852 17 -2.1329166666666662e+01 852 19 2.1334374999999998e+01 852 258 1.0416666666666664e-02 852 876 2.1329166666666662e+01 852 261 -5.3312499999999998e+00 852 848 -1.5997916666666665e+01 852 262 1.0667708333333334e+01 853 853 6.4029166666666669e+01 853 98 -1.4465734552327348e-19 853 856 -2.1329166666666662e+01 853 896 1.5997916666666667e+01 853 85 9.9486666632977745e-20 853 87 2.1329166666666662e+01 853 91 -2.1334374999999998e+01 853 451 -1.0416666666666664e-02 853 851 2.1329166666666662e+01 853 850 -1.5997916666666665e+01 853 445 5.3312499999999998e+00 853 450 -1.0667708333333334e+01 853 2856 5.3312499999999998e+00 854 854 6.4029166666666654e+01 854 454 -1.4465734552327348e-19 854 855 -2.1329166666666662e+01 854 96 5.3312499999999998e+00 854 959 1.5997916666666665e+01 854 87 -1.0416666666666664e-02 854 86 5.3312499999999998e+00 854 95 -1.0667708333333334e+01 854 444 1.4465734552327348e-19 854 843 2.1329166666666662e+01 854 842 -1.5997916666666667e+01 854 451 2.1329166666666662e+01 854 453 -2.1334374999999998e+01 855 855 6.4029166666666654e+01 855 98 1.4465734552327348e-19 855 453 5.3312499999999998e+00 855 95 -1.4465734552327348e-19 855 87 2.1329166666666662e+01 855 96 -2.1334374999999998e+01 855 854 -2.1329166666666662e+01 855 959 -1.5997916666666667e+01 855 451 -1.0416666666666664e-02 855 856 -2.1329166666666662e+01 855 964 1.5997916666666665e+01 855 454 -1.0667708333333334e+01 855 2856 5.3312499999999998e+00 856 856 6.4029166666666669e+01 856 96 5.3312499999999998e+00 856 450 -1.2659172094511536e-19 856 87 -1.0416666666666664e-02 856 853 -2.1329166666666662e+01 856 91 5.3312499999999998e+00 856 896 -1.5997916666666665e+01 856 98 -1.0667708333333334e+01 856 454 1.4465734552327348e-19 856 855 -2.1329166666666662e+01 856 964 -1.5997916666666667e+01 856 451 2.1329166666666662e+01 856 2856 -2.1334374999999998e+01 857 857 6.4029166666666669e+01 857 90 -1.4465734552327348e-19 857 812 2.1329166666666662e+01 857 811 -1.5997916666666667e+01 857 92 9.9486666632977745e-20 857 89 2.1329166666666662e+01 857 93 -2.1334374999999998e+01 857 351 -1.0416666666666664e-02 857 743 2.1329166666666662e+01 857 739 -1.5997916666666665e+01 857 352 5.3312499999999998e+00 857 364 -1.0667708333333334e+01 858 858 6.4029166666666654e+01 858 140 1.4465734552327348e-19 858 445 5.3312499999999998e+00 858 136 -1.4465734552327348e-19 858 137 2.1329166666666662e+01 858 138 -2.1334374999999998e+01 858 845 2.1329166666666662e+01 858 846 -1.5997916666666667e+01 858 446 -1.0416666666666664e-02 858 859 -2.1329166666666662e+01 858 863 1.5997916666666665e+01 858 447 -1.0667708333333334e+01 858 2852 5.3312499999999998e+00 859 859 6.4029166666666654e+01 859 452 -9.9486666632977745e-20 859 860 -2.1329166666666662e+01 859 141 5.3312499999999998e+00 859 938 1.5997916666666665e+01 859 137 -1.0416666666666664e-02 859 138 5.3312499999999998e+00 859 140 -1.0667708333333334e+01 859 447 1.4465734552327348e-19 859 858 -2.1329166666666662e+01 859 863 -1.5997916666666667e+01 859 446 2.1329166666666662e+01 859 2852 -2.1334374999999998e+01 860 860 6.4029166666666654e+01 860 143 1.2659172094511536e-19 860 140 -1.4465734552327348e-19 860 137 2.1329166666666662e+01 860 141 -2.1334374999999998e+01 860 859 -2.1329166666666662e+01 860 938 -1.5997916666666667e+01 860 446 -1.0416666666666664e-02 860 861 -2.1329166666666662e+01 860 951 1.5997916666666665e+01 860 453 5.3312499999999998e+00 860 452 -1.0667708333333334e+01 860 2852 5.3312499999999998e+00 861 861 6.4029166666666669e+01 861 141 5.3312499999999998e+00 861 444 -1.4465734552327348e-19 861 137 -1.0416666666666664e-02 861 841 2.1329166666666662e+01 861 135 5.3312499999999998e+00 861 842 -1.5997916666666665e+01 861 143 -1.0667708333333334e+01 861 452 9.9486666632977745e-20 861 860 -2.1329166666666662e+01 861 951 -1.5997916666666667e+01 861 446 2.1329166666666662e+01 861 453 -2.1334374999999998e+01 862 862 6.4029166666666669e+01 862 863 -1.5997916666666667e+01 862 44 -9.9486666632977745e-20 862 43 2.1334374999999998e+01 862 847 -2.1329166666666662e+01 862 846 1.5997916666666665e+01 862 445 -5.3312499999999998e+00 862 447 1.0667708333333334e+01 862 2852 -5.3312499999999998e+00 862 2869 1.4465734552327348e-19 862 3413 -2.1329166666666662e+01 862 2860 -2.1329166666666662e+01 862 2853 1.0416666666666664e-02 863 863 6.4041666666666671e+01 863 137 5.3312499999999998e+00 863 113 -5.3312499999999998e+00 863 567 1.5997916666666667e+01 863 121 5.3312499999999998e+00 863 138 -5.3395833333333327e+00 863 568 -1.5997916666666665e+01 863 140 -5.3333333333333330e+00 863 862 -1.5997916666666667e+01 863 43 -5.3395833333333327e+00 863 864 -1.5997916666666665e+01 863 117 5.3333333333333330e+00 863 859 -1.5997916666666667e+01 863 858 1.5997916666666665e+01 863 446 -5.3312499999999998e+00 863 447 5.3333333333333330e+00 863 2866 5.3312499999999998e+00 863 2853 -5.3312499999999998e+00 863 2860 5.3312499999999998e+00 863 3413 1.5997916666666665e+01 863 2869 -5.3333333333333330e+00 863 3468 1.5997916666666667e+01 863 2488 -5.3312499999999998e+00 863 2490 5.3395833333333327e+00 863 2852 5.3395833333333327e+00 864 864 6.4029166666666669e+01 864 110 -5.3312499999999998e+00 864 51 1.4465734552327348e-19 864 563 -2.1329166666666662e+01 864 561 1.5997916666666667e+01 864 43 2.1334374999999998e+01 864 863 -1.5997916666666665e+01 864 117 1.0667708333333334e+01 864 2869 -1.4465734552327348e-19 864 2866 -2.1329166666666662e+01 864 2488 1.0416666666666664e-02 864 3468 -2.1329166666666662e+01 864 2490 -5.3312499999999998e+00 865 865 6.4029166666666654e+01 865 445 5.3312499999999998e+00 865 44 -9.9486666632977745e-20 865 45 -2.1334374999999998e+01 865 847 2.1329166666666662e+01 865 848 -1.5997916666666667e+01 865 884 1.5997916666666665e+01 865 448 -1.0667708333333334e+01 865 2858 1.4465734552327348e-19 865 2860 2.1329166666666662e+01 865 2853 -1.0416666666666664e-02 865 3410 2.1329166666666662e+01 865 2846 5.3312499999999998e+00 866 866 3.2020833333333336e+01 867 867 6.4029166666666654e+01 867 265 -1.4465734552327348e-19 867 256 1.4465734552327348e-19 867 258 -2.1329166666666662e+01 867 257 2.1334374999999998e+01 867 875 -2.1329166666666662e+01 867 17 1.0416666666666664e-02 867 533 -2.1329166666666662e+01 868 868 3.2020833333333336e+01 869 869 6.4029166666666669e+01 869 260 1.4465734552327348e-19 869 880 2.1329166666666662e+01 869 256 -1.2659172094511536e-19 869 259 -2.1329166666666662e+01 869 257 2.1334374999999998e+01 869 461 1.0416666666666664e-02 869 874 -2.1329166666666662e+01 870 870 3.2020833333333336e+01 871 871 6.4029166666666669e+01 871 265 1.4465734552327348e-19 871 531 -2.1329166666666662e+01 871 267 -1.2659172094511536e-19 871 266 -2.1329166666666662e+01 871 257 2.1334374999999998e+01 871 65 1.0416666666666664e-02 871 898 2.1329166666666662e+01 872 872 6.4041666666666671e+01 872 258 -5.3312499999999998e+00 872 461 5.3312499999999998e+00 872 878 -1.5997916666666667e+01 872 259 -5.3312499999999998e+00 872 261 5.3395833333333327e+00 872 874 -1.5997916666666665e+01 872 256 5.3333333333333330e+00 872 875 -1.5997916666666667e+01 872 876 -1.5997916666666665e+01 872 17 5.3312499999999998e+00 872 47 -5.3312499999999998e+00 872 14 5.3312499999999998e+00 872 21 -5.3333333333333330e+00 872 511 -1.5997916666666667e+01 872 40 -5.3312499999999998e+00 872 45 5.3395833333333327e+00 872 508 1.5997916666666665e+01 872 46 5.3333333333333330e+00 872 873 -1.5997916666666667e+01 872 881 1.5997916666666665e+01 872 459 5.3312499999999998e+00 872 457 -5.3333333333333330e+00 873 873 6.4029166666666654e+01 873 501 -2.1329166666666662e+01 873 39 -5.3312499999999998e+00 873 47 1.0416666666666664e-02 873 45 -5.3312499999999998e+00 873 46 1.0667708333333334e+01 873 457 -1.4465734552327348e-19 873 881 -2.1329166666666662e+01 873 872 -1.5997916666666667e+01 873 459 -2.1329166666666662e+01 874 874 6.4029166666666654e+01 874 457 1.4465734552327348e-19 874 878 2.1329166666666662e+01 874 261 -5.3312499999999998e+00 874 872 -1.5997916666666665e+01 874 259 1.0416666666666664e-02 874 257 -5.3312499999999998e+00 874 256 1.0667708333333334e+01 874 869 -2.1329166666666662e+01 874 461 -2.1329166666666662e+01 875 875 6.4029166666666669e+01 875 261 -5.3312499999999998e+00 875 21 -1.4465734552327348e-19 875 876 2.1329166666666662e+01 875 872 -1.5997916666666667e+01 875 17 -2.1329166666666662e+01 875 258 1.0416666666666664e-02 875 867 -2.1329166666666662e+01 875 257 -5.3312499999999998e+00 875 256 1.0667708333333334e+01 876 876 6.4029166666666669e+01 876 19 5.3312499999999998e+00 876 262 -9.9486666632977745e-20 876 852 2.1329166666666662e+01 876 848 -1.5997916666666667e+01 876 256 1.4465734552327348e-19 876 258 2.1329166666666662e+01 876 261 -2.1334374999999998e+01 876 17 -1.0416666666666664e-02 876 875 2.1329166666666662e+01 876 872 -1.5997916666666665e+01 876 21 -1.0667708333333334e+01 877 877 6.4029166666666669e+01 877 265 -1.4465734552327348e-19 877 533 2.1329166666666662e+01 877 530 -1.5997916666666667e+01 877 262 9.9486666632977745e-20 877 258 2.1329166666666662e+01 877 264 -2.1334374999999998e+01 877 17 -1.0416666666666664e-02 877 852 2.1329166666666662e+01 877 850 -1.5997916666666665e+01 877 19 5.3312499999999998e+00 877 22 -1.0667708333333334e+01 878 878 6.4029166666666654e+01 878 269 1.4465734552327348e-19 878 256 -1.2659172094511536e-19 878 259 2.1329166666666662e+01 878 261 -2.1334374999999998e+01 878 874 2.1329166666666662e+01 878 872 -1.5997916666666667e+01 878 461 -1.0416666666666664e-02 878 879 -2.1329166666666662e+01 878 883 1.5997916666666665e+01 878 457 -1.0667708333333334e+01 879 879 6.4029166666666654e+01 879 660 2.1329166666666662e+01 879 251 5.3312499999999998e+00 879 259 -1.0416666666666664e-02 879 261 5.3312499999999998e+00 879 269 -1.0667708333333334e+01 879 457 1.4465734552327348e-19 879 878 -2.1329166666666662e+01 879 883 -1.5997916666666667e+01 879 461 2.1329166666666662e+01 880 880 6.4029166666666669e+01 880 251 5.3312499999999998e+00 880 660 2.1329166666666662e+01 880 461 2.1329166666666662e+01 880 259 -1.0416666666666664e-02 880 869 2.1329166666666662e+01 880 257 5.3312499999999998e+00 880 260 -1.0667708333333334e+01 881 881 6.4029166666666669e+01 881 49 9.9486666632977745e-20 881 888 2.1329166666666662e+01 881 883 -1.5997916666666667e+01 881 46 -1.4465734552327348e-19 881 47 -2.1329166666666662e+01 881 45 2.1334374999999998e+01 881 459 1.0416666666666664e-02 881 873 -2.1329166666666662e+01 881 872 1.5997916666666665e+01 881 457 1.0667708333333334e+01 882 882 6.4029166666666669e+01 882 268 1.2659172094511536e-19 882 891 2.1329166666666662e+01 882 884 -1.5997916666666667e+01 882 262 -1.4465734552327348e-19 882 263 -2.1329166666666662e+01 882 261 2.1334374999999998e+01 882 449 1.0416666666666664e-02 882 849 -2.1329166666666662e+01 882 848 1.5997916666666665e+01 882 445 -5.3312499999999998e+00 882 448 1.0667708333333334e+01 882 2846 -5.3312499999999998e+00 883 883 6.4041666666666671e+01 883 459 -5.3312499999999998e+00 883 881 -1.5997916666666667e+01 883 47 5.3312499999999998e+00 883 45 -5.3395833333333327e+00 883 888 -1.5997916666666665e+01 883 49 -5.3333333333333330e+00 883 937 1.5997916666666667e+01 883 885 -1.5997916666666665e+01 883 259 5.3312499999999998e+00 883 243 -5.3312499999999998e+00 883 245 5.3333333333333330e+00 883 664 1.5997916666666667e+01 883 252 5.3312499999999998e+00 883 261 -5.3395833333333327e+00 883 663 -1.5997916666666665e+01 883 269 -5.3333333333333330e+00 883 879 -1.5997916666666667e+01 883 878 1.5997916666666665e+01 883 461 -5.3312499999999998e+00 883 457 5.3333333333333330e+00 883 2861 5.3312499999999998e+00 883 2361 -5.3312499999999998e+00 884 884 6.4041666666666671e+01 884 885 -1.5997916666666667e+01 884 45 -5.3395833333333327e+00 884 252 5.3312499999999998e+00 884 449 -5.3312499999999998e+00 884 882 -1.5997916666666667e+01 884 263 5.3312499999999998e+00 884 261 -5.3395833333333327e+00 884 891 -1.5997916666666665e+01 884 268 -5.3333333333333330e+00 884 665 -1.5997916666666667e+01 884 664 1.5997916666666665e+01 884 243 -5.3312499999999998e+00 884 245 5.3333333333333330e+00 884 865 1.5997916666666665e+01 884 448 5.3333333333333330e+00 884 2860 5.3312499999999998e+00 884 2361 -5.3312499999999998e+00 884 2861 5.3312499999999998e+00 884 3409 1.5997916666666665e+01 884 2858 -5.3333333333333330e+00 884 2360 5.3395833333333327e+00 884 3410 1.5997916666666667e+01 884 2853 -5.3312499999999998e+00 884 2846 5.3395833333333327e+00 885 885 6.4029166666666669e+01 885 884 -1.5997916666666667e+01 885 49 -1.4465734552327348e-19 885 45 2.1334374999999998e+01 885 937 -2.1329166666666662e+01 885 883 -1.5997916666666665e+01 885 245 1.0667708333333334e+01 885 2360 -5.3312499999999998e+00 885 2858 1.2659172094511536e-19 885 3409 -2.1329166666666662e+01 885 2861 -2.1329166666666662e+01 885 2361 1.0416666666666664e-02 886 886 6.4029166666666654e+01 886 887 -2.1329166666666662e+01 886 50 5.3312499999999998e+00 886 47 -1.0416666666666664e-02 886 39 5.3312499999999998e+00 886 48 -1.0667708333333334e+01 886 501 2.1329166666666662e+01 886 459 2.1329166666666662e+01 887 887 6.4029166666666669e+01 887 48 -1.4465734552327348e-19 887 886 -2.1329166666666662e+01 887 49 9.9486666632977745e-20 887 47 2.1329166666666662e+01 887 50 -2.1334374999999998e+01 887 459 -1.0416666666666664e-02 887 888 -2.1329166666666662e+01 888 888 6.4029166666666654e+01 888 457 -1.4465734552327348e-19 888 881 2.1329166666666662e+01 888 45 5.3312499999999998e+00 888 883 -1.5997916666666665e+01 888 47 -1.0416666666666664e-02 888 50 5.3312499999999998e+00 888 49 -1.0667708333333334e+01 888 887 -2.1329166666666662e+01 888 459 2.1329166666666662e+01 889 889 3.2020833333333336e+01 890 890 6.4029166666666669e+01 890 274 -1.4465734552327348e-19 890 893 -2.1329166666666662e+01 890 268 1.2659172094511536e-19 890 263 2.1329166666666662e+01 890 270 -2.1334374999999998e+01 890 449 -1.0416666666666664e-02 890 891 -2.1329166666666662e+01 890 2856 5.3312499999999998e+00 890 3482 1.5997916666666667e+01 890 3412 1.5997916666666665e+01 890 2846 5.3312499999999998e+00 890 2855 -1.0667708333333334e+01 891 891 6.4029166666666669e+01 891 270 5.3312499999999998e+00 891 448 -1.4465734552327348e-19 891 263 -1.0416666666666664e-02 891 882 2.1329166666666662e+01 891 261 5.3312499999999998e+00 891 884 -1.5997916666666665e+01 891 268 -1.0667708333333334e+01 891 890 -2.1329166666666662e+01 891 449 2.1329166666666662e+01 891 2855 9.9486666632977745e-20 891 3412 -1.5997916666666667e+01 891 2846 -2.1334374999999998e+01 892 892 6.4029166666666654e+01 892 274 1.4465734552327348e-19 892 445 5.3312499999999998e+00 892 262 -1.4465734552327348e-19 892 263 2.1329166666666662e+01 892 264 -2.1334374999999998e+01 892 849 2.1329166666666662e+01 892 850 -1.5997916666666667e+01 892 449 -1.0416666666666664e-02 892 893 -2.1329166666666662e+01 892 896 1.5997916666666665e+01 892 450 -1.0667708333333334e+01 892 2856 5.3312499999999998e+00 893 893 6.4029166666666654e+01 893 890 -2.1329166666666662e+01 893 270 5.3312499999999998e+00 893 263 -1.0416666666666664e-02 893 264 5.3312499999999998e+00 893 274 -1.0667708333333334e+01 893 450 1.4465734552327348e-19 893 892 -2.1329166666666662e+01 893 896 -1.5997916666666667e+01 893 449 2.1329166666666662e+01 893 2855 -9.9486666632977745e-20 893 3482 -1.5997916666666665e+01 893 2856 -2.1334374999999998e+01 894 894 6.4029166666666669e+01 894 271 1.4465734552327348e-19 894 900 2.1329166666666662e+01 894 895 -1.5997916666666667e+01 894 265 -1.4465734552327348e-19 894 266 -2.1329166666666662e+01 894 264 2.1334374999999998e+01 894 65 1.0416666666666664e-02 894 531 -2.1329166666666662e+01 894 530 1.5997916666666665e+01 894 63 1.0667708333333334e+01 895 895 6.4041666666666671e+01 895 273 5.3312499999999998e+00 895 65 -5.3312499999999998e+00 895 894 -1.5997916666666667e+01 895 266 5.3312499999999998e+00 895 264 -5.3395833333333327e+00 895 900 -1.5997916666666665e+01 895 271 -5.3333333333333330e+00 895 991 1.5997916666666667e+01 895 897 -1.5997916666666665e+01 895 280 -5.3312499999999998e+00 895 77 5.3312499999999998e+00 895 278 -5.3312499999999998e+00 895 284 5.3333333333333330e+00 895 688 1.5997916666666667e+01 895 82 5.3312499999999998e+00 895 91 -5.3395833333333327e+00 895 687 -1.5997916666666665e+01 895 99 -5.3333333333333330e+00 895 541 -1.5997916666666667e+01 895 540 1.5997916666666665e+01 895 67 -5.3312499999999998e+00 895 63 5.3333333333333330e+00 896 896 6.4041666666666671e+01 896 263 5.3312499999999998e+00 896 280 -5.3312499999999998e+00 896 897 -1.5997916666666667e+01 896 273 5.3312499999999998e+00 896 264 -5.3395833333333327e+00 896 993 -1.5997916666666665e+01 896 274 -5.3333333333333330e+00 896 82 5.3312499999999998e+00 896 451 -5.3312499999999998e+00 896 853 1.5997916666666667e+01 896 87 5.3312499999999998e+00 896 91 -5.3395833333333327e+00 896 856 -1.5997916666666665e+01 896 98 -5.3333333333333330e+00 896 689 -1.5997916666666667e+01 896 688 1.5997916666666665e+01 896 278 -5.3312499999999998e+00 896 284 5.3333333333333330e+00 896 893 -1.5997916666666667e+01 896 892 1.5997916666666665e+01 896 449 -5.3312499999999998e+00 896 450 5.3333333333333330e+00 896 2513 5.3395833333333327e+00 896 2856 5.3395833333333327e+00 897 897 6.4029166666666669e+01 897 274 1.4465734552327348e-19 897 993 2.1329166666666662e+01 897 896 -1.5997916666666667e+01 897 271 -9.9486666632977745e-20 897 273 -2.1329166666666662e+01 897 264 2.1334374999999998e+01 897 280 1.0416666666666664e-02 897 991 -2.1329166666666662e+01 897 895 -1.5997916666666665e+01 897 284 1.0667708333333334e+01 897 2513 -5.3312499999999998e+00 898 898 6.4029166666666654e+01 898 899 -2.1329166666666662e+01 898 272 5.3312499999999998e+00 898 266 -1.0416666666666664e-02 898 257 5.3312499999999998e+00 898 267 -1.0667708333333334e+01 898 871 2.1329166666666662e+01 898 65 2.1329166666666662e+01 899 899 6.4029166666666669e+01 899 267 -1.2659172094511536e-19 899 898 -2.1329166666666662e+01 899 271 1.4465734552327348e-19 899 266 2.1329166666666662e+01 899 272 -2.1334374999999998e+01 899 65 -1.0416666666666664e-02 899 900 -2.1329166666666662e+01 900 900 6.4029166666666654e+01 900 63 -1.4465734552327348e-19 900 894 2.1329166666666662e+01 900 264 5.3312499999999998e+00 900 895 -1.5997916666666665e+01 900 266 -1.0416666666666664e-02 900 272 5.3312499999999998e+00 900 271 -1.0667708333333334e+01 900 899 -2.1329166666666662e+01 900 65 2.1329166666666662e+01 901 901 3.2020833333333336e+01 902 902 3.2000000000208331e+01 903 903 6.4000000000291664e+01 903 343 -1.1000665323307010e-27 903 334 1.3233141685082473e-27 903 336 -2.1333333333291666e+01 903 335 2.1333333333343749e+01 903 909 -2.1333333333291666e+01 903 396 1.0416666666666666e-10 903 910 2.1333333333291666e+01 904 904 3.2000000000208331e+01 905 905 6.4000000000291664e+01 905 338 1.1213657767716683e-27 905 615 -2.1333333333291666e+01 905 334 -1.1000665323307010e-27 905 337 -2.1333333333291666e+01 905 335 2.1333333333343749e+01 905 185 1.0416666666666666e-10 905 908 -2.1333333333291666e+01 906 906 6.4000000000416662e+01 906 336 -5.3333333333124999e+00 906 185 5.3333333333124999e+00 906 914 -1.5999999999979167e+01 906 337 -5.3333333333124999e+00 906 339 5.3333333333958333e+00 906 908 -1.5999999999979167e+01 906 334 5.3333333333333330e+00 906 909 -1.5999999999979167e+01 906 911 -1.5999999999979167e+01 906 396 5.3333333333124999e+00 906 417 -5.3333333333124999e+00 906 394 5.3333333333124999e+00 906 397 -5.3333333333333330e+00 906 769 -1.5999999999979167e+01 906 404 -5.3333333333124999e+00 906 414 5.3333333333958333e+00 906 768 1.5999999999979167e+01 906 416 5.3333333333333330e+00 906 907 -1.5999999999979167e+01 906 915 1.5999999999979167e+01 906 179 5.3333333333124999e+00 906 177 -5.3333333333333330e+00 907 907 6.4000000000291664e+01 907 765 -2.1333333333291666e+01 907 403 -5.3333333333124999e+00 907 417 1.0416666666666666e-10 907 414 -5.3333333333124999e+00 907 416 1.0666666666677083e+01 907 177 -1.1213657767716683e-27 907 915 -2.1333333333291666e+01 907 906 -1.5999999999979167e+01 907 179 -2.1333333333291666e+01 908 908 6.4000000000291664e+01 908 177 1.1000665323307010e-27 908 914 2.1333333333291666e+01 908 339 -5.3333333333124999e+00 908 906 -1.5999999999979167e+01 908 337 1.0416666666666666e-10 908 335 -5.3333333333124999e+00 908 334 1.0666666666677083e+01 908 905 -2.1333333333291666e+01 908 185 -2.1333333333291666e+01 909 909 6.4000000000291664e+01 909 339 -5.3333333333124999e+00 909 397 -1.1213657767716683e-27 909 911 2.1333333333291666e+01 909 906 -1.5999999999979167e+01 909 396 -2.1333333333291666e+01 909 336 1.0416666666666666e-10 909 903 -2.1333333333291666e+01 909 335 -5.3333333333124999e+00 909 334 1.0666666666677083e+01 910 910 6.4000000000291664e+01 910 335 5.3333333333124999e+00 910 336 -1.0416666666666666e-10 910 913 -2.1333333333291666e+01 910 342 5.3333333333124999e+00 910 343 -1.0666666666677083e+01 910 903 2.1333333333291666e+01 910 396 2.1333333333291666e+01 910 1096 -1.1000665323307010e-27 910 1703 -1.5999999999979167e+01 911 911 6.4000000000291664e+01 911 340 -1.3020149240672800e-27 911 912 -2.1333333333291666e+01 911 916 1.5999999999979167e+01 911 334 1.3233141685082473e-27 911 336 2.1333333333291666e+01 911 339 -2.1333333333343749e+01 911 396 -1.0416666666666666e-10 911 909 2.1333333333291666e+01 911 906 -1.5999999999979167e+01 911 397 -1.0666666666677083e+01 911 1097 5.3333333333124999e+00 912 912 6.4000000000291664e+01 912 342 5.3333333333124999e+00 912 913 -2.1333333333291666e+01 912 397 -1.1213657767716683e-27 912 396 2.1333333333291666e+01 912 336 -1.0416666666666666e-10 912 911 -2.1333333333291666e+01 912 339 5.3333333333124999e+00 912 916 -1.5999999999979167e+01 912 340 -1.0666666666677083e+01 912 1096 1.1000665323307010e-27 912 2044 -1.5999999999979167e+01 912 1097 -2.1333333333343749e+01 913 913 6.4000000000291664e+01 913 343 -1.1000665323307010e-27 913 910 -2.1333333333291666e+01 913 340 1.3020149240672800e-27 913 336 2.1333333333291666e+01 913 342 -2.1333333333343749e+01 913 396 -1.0416666666666666e-10 913 912 -2.1333333333291666e+01 913 1703 1.5999999999979167e+01 913 2044 1.5999999999979167e+01 913 1097 5.3333333333124999e+00 913 1096 -1.0666666666677083e+01 914 914 6.4000000000291664e+01 914 348 1.5039633158038590e-27 914 334 -1.1000665323307010e-27 914 337 2.1333333333291666e+01 914 339 -2.1333333333343749e+01 914 908 2.1333333333291666e+01 914 906 -1.5999999999979167e+01 914 185 -1.0416666666666666e-10 914 598 2.1333333333291666e+01 914 597 -1.5999999999979167e+01 914 181 5.3333333333124999e+00 914 177 -1.0666666666677083e+01 915 915 6.4000000000291664e+01 915 181 -5.3333333333124999e+00 915 422 1.3020149240672800e-27 915 602 -2.1333333333291666e+01 915 597 1.5999999999979167e+01 915 416 -1.3233141685082473e-27 915 417 -2.1333333333291666e+01 915 414 2.1333333333343749e+01 915 179 1.0416666666666666e-10 915 907 -2.1333333333291666e+01 915 906 1.5999999999979167e+01 915 177 1.0666666666677083e+01 916 916 6.4000000000416662e+01 916 341 5.3333333333124999e+00 916 396 -5.3333333333124999e+00 916 911 1.5999999999979167e+01 916 336 5.3333333333124999e+00 916 339 -5.3333333333958333e+00 916 912 -1.5999999999979167e+01 916 340 -5.3333333333333330e+00 916 404 5.3333333333124999e+00 916 474 -5.3333333333124999e+00 916 919 -1.5999999999979167e+01 916 415 5.3333333333124999e+00 916 414 -5.3333333333958333e+00 916 922 1.5999999999979167e+01 916 413 -5.3333333333333330e+00 916 770 -1.5999999999979167e+01 916 769 1.5999999999979167e+01 916 394 -5.3333333333124999e+00 916 397 5.3333333333333330e+00 916 921 1.5999999999979167e+01 916 917 -1.5999999999979167e+01 916 469 -5.3333333333124999e+00 916 468 5.3333333333333330e+00 916 1097 5.3333333333958333e+00 916 1581 5.3333333333958333e+00 917 917 6.4000000000291664e+01 917 473 -5.3333333333124999e+00 917 347 1.1000665323307010e-27 917 929 2.1333333333291666e+01 917 918 -1.5999999999979167e+01 917 340 -1.5039633158038590e-27 917 341 -2.1333333333291666e+01 917 339 2.1333333333343749e+01 917 469 1.0416666666666666e-10 917 921 -2.1333333333291666e+01 917 916 -1.5999999999979167e+01 917 468 1.0666666666677083e+01 917 1581 -5.3333333333124999e+00 918 918 6.4000000000416662e+01 918 415 5.3333333333124999e+00 918 166 -5.3333333333124999e+00 918 920 -1.5999999999979167e+01 918 424 5.3333333333124999e+00 918 414 -5.3333333333958333e+00 918 1069 1.5999999999979167e+01 918 425 -5.3333333333333330e+00 918 325 5.3333333333124999e+00 918 469 -5.3333333333124999e+00 918 917 -1.5999999999979167e+01 918 341 5.3333333333124999e+00 918 339 -5.3333333333958333e+00 918 929 -1.5999999999979167e+01 918 347 -5.3333333333333330e+00 918 724 -1.5999999999979167e+01 918 725 1.5999999999979167e+01 918 165 -5.3333333333124999e+00 918 173 5.3333333333958333e+00 918 175 5.3333333333333330e+00 918 923 -1.5999999999979167e+01 918 919 -1.5999999999979167e+01 918 474 -5.3333333333124999e+00 918 473 5.3333333333958333e+00 918 468 5.3333333333333330e+00 919 919 6.4000000000291664e+01 919 425 -1.3233141685082473e-27 919 413 1.3020149240672800e-27 919 415 -2.1333333333291666e+01 919 414 2.1333333333343749e+01 919 922 -2.1333333333291666e+01 919 916 -1.5999999999979167e+01 919 474 1.0416666666666666e-10 919 923 2.1333333333291666e+01 919 918 -1.5999999999979167e+01 919 473 -5.3333333333124999e+00 919 468 1.0666666666677083e+01 919 1581 -5.3333333333124999e+00 920 920 6.4000000000291664e+01 920 173 -5.3333333333124999e+00 920 425 1.1000665323307010e-27 920 1069 -2.1333333333291666e+01 920 918 -1.5999999999979167e+01 920 422 -1.5039633158038590e-27 920 424 -2.1333333333291666e+01 920 414 2.1333333333343749e+01 920 166 1.0416666666666666e-10 920 603 -2.1333333333291666e+01 920 597 1.5999999999979167e+01 920 155 -5.3333333333124999e+00 920 175 1.0666666666677083e+01 921 921 6.4000000000291664e+01 921 930 2.1333333333291666e+01 921 342 -5.3333333333124999e+00 921 341 1.0416666666666666e-10 921 339 -5.3333333333124999e+00 921 340 1.0666666666677083e+01 921 468 -1.1000665323307010e-27 921 917 -2.1333333333291666e+01 921 916 1.5999999999979167e+01 921 469 -2.1333333333291666e+01 921 1580 1.3233141685082473e-27 921 2044 1.5999999999979167e+01 921 1581 2.1333333333343749e+01 922 922 6.4000000000291664e+01 922 420 -5.3333333333124999e+00 922 468 1.1213657767716683e-27 922 415 1.0416666666666666e-10 922 919 -2.1333333333291666e+01 922 414 -5.3333333333124999e+00 922 916 1.5999999999979167e+01 922 413 1.0666666666677083e+01 922 924 2.1333333333291666e+01 922 474 -2.1333333333291666e+01 922 1588 -1.1000665323307010e-27 922 2053 1.5999999999979167e+01 922 1581 2.1333333333343749e+01 923 923 6.4000000000291664e+01 923 475 -1.5039633158038590e-27 923 925 -2.1333333333291666e+01 923 426 5.3333333333124999e+00 923 1068 1.5999999999979167e+01 923 415 -1.0416666666666666e-10 923 414 5.3333333333124999e+00 923 425 -1.0666666666677083e+01 923 468 1.1213657767716683e-27 923 919 2.1333333333291666e+01 923 918 -1.5999999999979167e+01 923 474 2.1333333333291666e+01 923 473 -2.1333333333343749e+01 924 924 6.4000000000291664e+01 924 413 1.3020149240672800e-27 924 419 -1.1000665323307010e-27 924 415 2.1333333333291666e+01 924 420 -2.1333333333343749e+01 924 926 -2.1333333333291666e+01 924 474 -1.0416666666666666e-10 924 922 2.1333333333291666e+01 924 1589 5.3333333333124999e+00 924 2260 1.5999999999979167e+01 924 2053 1.5999999999979167e+01 924 1581 5.3333333333124999e+00 924 1588 -1.0666666666677083e+01 925 925 6.4000000000291664e+01 925 419 1.1000665323307010e-27 925 473 5.3333333333124999e+00 925 425 -1.3233141685082473e-27 925 415 2.1333333333291666e+01 925 426 -2.1333333333343749e+01 925 923 -2.1333333333291666e+01 925 1068 -1.5999999999979167e+01 925 474 -1.0416666666666666e-10 925 926 -2.1333333333291666e+01 925 1033 -1.5999999999979167e+01 925 475 -1.0666666666677083e+01 925 1589 5.3333333333124999e+00 926 926 6.4000000000291664e+01 926 426 5.3333333333124999e+00 926 415 -1.0416666666666666e-10 926 924 -2.1333333333291666e+01 926 420 5.3333333333124999e+00 926 419 -1.0666666666677083e+01 926 475 1.5039633158038590e-27 926 925 -2.1333333333291666e+01 926 1033 1.5999999999979167e+01 926 474 2.1333333333291666e+01 926 1588 -1.1000665323307010e-27 926 2260 -1.5999999999979167e+01 926 1589 -2.1333333333343749e+01 927 927 6.4000000000291664e+01 927 418 -1.1000665323307010e-27 927 697 2.1333333333291666e+01 927 694 -1.5999999999979167e+01 927 422 1.3020149240672800e-27 927 417 2.1333333333291666e+01 927 423 -2.1333333333343749e+01 927 179 -1.0416666666666666e-10 927 602 2.1333333333291666e+01 927 595 -1.5999999999979167e+01 927 181 5.3333333333124999e+00 927 192 -1.0666666666677083e+01 928 928 6.4000000000291664e+01 928 347 1.1000665323307010e-27 928 344 -1.1213657767716683e-27 928 341 2.1333333333291666e+01 928 345 -2.1333333333343749e+01 928 931 -2.1333333333291666e+01 928 1064 1.5999999999979167e+01 928 469 -1.0416666666666666e-10 928 929 -2.1333333333291666e+01 928 1065 1.5999999999979167e+01 928 473 5.3333333333124999e+00 928 472 -1.0666666666677083e+01 928 1595 5.3333333333124999e+00 929 929 6.4000000000291664e+01 929 468 -1.1000665323307010e-27 929 917 2.1333333333291666e+01 929 339 5.3333333333124999e+00 929 918 -1.5999999999979167e+01 929 341 -1.0416666666666666e-10 929 345 5.3333333333124999e+00 929 347 -1.0666666666677083e+01 929 472 1.3020149240672800e-27 929 928 -2.1333333333291666e+01 929 1065 -1.5999999999979167e+01 929 469 2.1333333333291666e+01 929 473 -2.1333333333343749e+01 930 930 6.4000000000291664e+01 930 344 1.1213657767716683e-27 930 340 -1.5039633158038590e-27 930 341 2.1333333333291666e+01 930 342 -2.1333333333343749e+01 930 921 2.1333333333291666e+01 930 469 -1.0416666666666666e-10 930 931 -2.1333333333291666e+01 930 1581 5.3333333333124999e+00 930 2044 1.5999999999979167e+01 930 2047 1.5999999999979167e+01 930 1595 5.3333333333124999e+00 930 1580 -1.0666666666677083e+01 931 931 6.4000000000291664e+01 931 342 5.3333333333124999e+00 931 472 -1.3020149240672800e-27 931 341 -1.0416666666666666e-10 931 928 -2.1333333333291666e+01 931 345 5.3333333333124999e+00 931 1064 -1.5999999999979167e+01 931 344 -1.0666666666677083e+01 931 930 -2.1333333333291666e+01 931 469 2.1333333333291666e+01 931 1580 1.3233141685082473e-27 931 2047 -1.5999999999979167e+01 931 1595 -2.1333333333343749e+01 932 932 3.2020833333333336e+01 933 933 6.4029166666666654e+01 933 49 1.4465734552327348e-19 933 50 2.1334374999999998e+01 933 937 -2.1329166666666662e+01 933 2862 -1.4465734552327348e-19 933 2861 -2.1329166666666662e+01 933 2361 1.0416666666666664e-02 933 3039 -2.1329166666666662e+01 934 934 3.2020833333333336e+01 935 935 3.2020833333333336e+01 936 936 6.4029166666666669e+01 936 50 2.1334374999999998e+01 936 2862 1.4465734552327348e-19 936 3036 -2.1329166666666662e+01 936 2867 -9.9486666632977745e-20 936 2863 -2.1329166666666662e+01 936 2366 1.0416666666666664e-02 936 3416 -2.1329166666666662e+01 937 937 6.4029166666666669e+01 937 45 -5.3312499999999998e+00 937 245 -1.4465734552327348e-19 937 885 -2.1329166666666662e+01 937 883 1.5997916666666667e+01 937 933 -2.1329166666666662e+01 937 50 -5.3312499999999998e+00 937 49 1.0667708333333334e+01 937 2361 -2.1329166666666662e+01 937 2861 1.0416666666666664e-02 938 938 6.4041666666666671e+01 938 941 -1.5997916666666667e+01 938 480 5.3395833333333327e+00 938 121 -5.3312499999999998e+00 938 446 5.3312499999999998e+00 938 860 -1.5997916666666667e+01 938 137 -5.3312499999999998e+00 938 141 5.3395833333333327e+00 938 859 1.5997916666666665e+01 938 140 5.3333333333333330e+00 938 568 1.5997916666666667e+01 938 569 -1.5997916666666665e+01 938 113 5.3312499999999998e+00 938 118 -5.3333333333333330e+00 938 950 1.5997916666666665e+01 938 452 -5.3333333333333330e+00 938 2473 -5.3312499999999998e+00 938 2486 5.3312499999999998e+00 938 2475 -5.3312499999999998e+00 938 3472 -1.5997916666666665e+01 938 2474 5.3333333333333330e+00 938 2490 -5.3395833333333327e+00 938 3460 -1.5997916666666667e+01 938 2851 5.3312499999999998e+00 938 2852 -5.3395833333333327e+00 939 939 6.4020833333541674e+01 939 290 -5.3333333333124999e+00 939 947 2.1333333333312499e+01 939 228 -5.3333333333124999e+00 939 224 -5.3312499999999998e+00 939 231 1.3333333333322916e+01 939 940 -1.5997916666666667e+01 939 478 5.3312499999999998e+00 939 943 -1.5997916666666665e+01 939 479 -5.3333333333333330e+00 939 945 1.5997916666666667e+01 939 3474 1.0666666666583334e+01 939 2470 5.3312499999999998e+00 939 1619 -2.6635416666250000e+00 939 2477 -5.3395833333333327e+00 939 3088 -1.5997916666666665e+01 939 2406 -5.3312499999999998e+00 939 1208 -2.6635416666250000e+00 939 2414 1.3333333333322916e+01 940 940 6.4029166666666669e+01 940 479 9.9486666632977745e-20 940 943 2.1329166666666662e+01 940 939 -1.5997916666666667e+01 940 477 -1.4465734552327348e-19 940 478 -2.1329166666666662e+01 940 224 1.0416666666666664e-02 940 822 -2.1329166666666662e+01 940 821 1.5997916666666665e+01 940 221 -5.3312499999999998e+00 940 231 1.0667708333333334e+01 940 1619 -5.3312499999999998e+00 940 2477 2.1334374999999998e+01 941 941 6.4029166666666669e+01 941 938 -1.5997916666666667e+01 941 477 1.2659172094511536e-19 941 480 -2.1334374999999998e+01 941 823 2.1329166666666662e+01 941 819 -1.5997916666666665e+01 941 112 5.3312499999999998e+00 941 118 -1.0667708333333334e+01 941 2490 5.3312499999999998e+00 941 2474 -1.4465734552327348e-19 941 3472 2.1329166666666662e+01 941 2475 2.1329166666666662e+01 941 2486 -1.0416666666666664e-02 942 942 6.4029166666666654e+01 942 486 1.4465734552327348e-19 942 221 5.3312499999999998e+00 942 477 -1.4465734552327348e-19 942 478 2.1329166666666662e+01 942 480 -2.1334374999999998e+01 942 822 2.1329166666666662e+01 942 819 -1.5997916666666667e+01 942 224 -1.0416666666666664e-02 942 633 2.1329166666666662e+01 942 632 -1.5997916666666665e+01 942 223 5.3312499999999998e+00 942 220 -1.0667708333333334e+01 943 943 6.4029166666666669e+01 943 482 5.3312499999999998e+00 943 232 1.2659172094511536e-19 943 944 -2.1329166666666662e+01 943 946 1.5997916666666667e+01 943 231 -1.4465734552327348e-19 943 224 2.1329166666666662e+01 943 478 -1.0416666666666664e-02 943 940 2.1329166666666662e+01 943 939 -1.5997916666666665e+01 943 479 -1.0667708333333334e+01 943 1619 -2.1334374999999998e+01 943 2477 5.3312499999999998e+00 944 944 6.4029166666666669e+01 944 223 5.3312499999999998e+00 944 486 -1.4465734552327348e-19 944 633 2.1329166666666662e+01 944 634 -1.5997916666666667e+01 944 479 9.9486666632977745e-20 944 478 2.1329166666666662e+01 944 482 -2.1334374999999998e+01 944 224 -1.0416666666666664e-02 944 943 -2.1329166666666662e+01 944 946 -1.5997916666666665e+01 944 232 -1.0667708333333334e+01 944 1619 5.3312499999999998e+00 945 945 6.4029166666666654e+01 945 287 1.4465734552327348e-19 945 949 2.1329166666666662e+01 945 482 -5.3312499999999998e+00 945 946 -1.5997916666666665e+01 945 479 1.0667708333333334e+01 945 939 1.5997916666666667e+01 945 2470 1.0416666666666664e-02 945 2477 -5.3312499999999998e+00 945 2414 -1.4465734552327348e-19 945 3088 -2.1329166666666662e+01 945 2406 -2.1329166666666662e+01 945 1208 2.1334374999999998e+01 946 946 6.4020833333541660e+01 946 296 -5.3333333333124999e+00 946 226 5.3333333333124999e+00 946 974 1.5999999999979167e+01 946 299 -5.3333333333124999e+00 946 310 5.3333333333958333e+00 946 948 -1.5999999999979167e+01 946 300 5.3333333333333330e+00 946 478 -5.3312499999999998e+00 946 949 -1.5997916666666667e+01 946 482 5.3395833333333327e+00 946 945 -1.5997916666666665e+01 946 479 5.3333333333333330e+00 946 943 1.5997916666666667e+01 946 944 -1.5997916666666665e+01 946 224 5.3312499999999998e+00 946 232 -5.3333333333333330e+00 946 712 1.5999999999979167e+01 946 711 -1.5999999999979167e+01 946 286 5.3333333333124999e+00 946 287 -5.3333333333333330e+00 946 2406 5.3312499999999998e+00 946 2470 -5.3312499999999998e+00 946 1619 -5.3364583333645825e+00 946 1208 -5.3364583333645834e+00 947 947 4.2666666666916662e+01 947 939 2.1333333333312499e+01 947 231 5.3333333333229165e+00 947 228 -1.0666666666687499e+01 947 290 -1.0666666666687499e+01 947 2414 5.3333333333229165e+00 947 3474 1.0666666666666666e+01 947 1619 -6.2500000000000004e-11 947 1618 5.3333333333229165e+00 947 1208 -6.2500000000000004e-11 947 1787 2.1333333333312499e+01 947 5004 1.0666666666666666e+01 947 3781 5.3333333333229165e+00 948 948 6.4000000000291664e+01 948 232 1.1000665323307010e-27 948 974 -2.1333333333291666e+01 948 310 -5.3333333333124999e+00 948 946 -1.5999999999979167e+01 948 299 1.0416666666666666e-10 948 294 -5.3333333333124999e+00 948 300 1.0666666666677083e+01 948 701 -2.1333333333291666e+01 948 226 -2.1333333333291666e+01 948 1621 -1.5039633158038590e-27 948 1816 1.5999999999979167e+01 948 1619 2.1333333333343749e+01 949 949 6.4029166666666669e+01 949 479 -1.4465734552327348e-19 949 945 2.1329166666666662e+01 949 946 -1.5997916666666667e+01 949 482 -2.1334374999999998e+01 949 970 1.5997916666666665e+01 949 287 -1.0667708333333334e+01 949 1208 5.3312499999999998e+00 949 2478 1.4465734552327348e-19 949 2470 2.1329166666666662e+01 949 2406 -1.0416666666666664e-02 949 3089 2.1329166666666662e+01 949 2413 5.3312499999999998e+00 950 950 6.4029166666666669e+01 950 453 -5.3312499999999998e+00 950 485 1.4465734552327348e-19 950 954 2.1329166666666662e+01 950 951 -1.5997916666666667e+01 950 480 2.1334374999999998e+01 950 938 1.5997916666666665e+01 950 452 1.0667708333333334e+01 950 2474 -1.4465734552327348e-19 950 2473 -2.1329166666666662e+01 950 2851 1.0416666666666664e-02 950 3460 -2.1329166666666662e+01 950 2852 -5.3312499999999998e+00 951 951 6.4041666666666671e+01 951 137 5.3312499999999998e+00 951 153 -5.3312499999999998e+00 951 646 1.5997916666666667e+01 951 127 5.3312499999999998e+00 951 141 -5.3395833333333327e+00 951 645 -1.5997916666666665e+01 951 143 -5.3333333333333330e+00 951 483 5.3312499999999998e+00 951 950 -1.5997916666666667e+01 951 480 -5.3395833333333327e+00 951 954 -1.5997916666666665e+01 951 485 -5.3333333333333330e+00 951 962 1.5997916666666667e+01 951 952 -1.5997916666666665e+01 951 162 -5.3312499999999998e+00 951 168 5.3395833333333327e+00 951 171 5.3333333333333330e+00 951 861 -1.5997916666666667e+01 951 860 1.5997916666666665e+01 951 446 -5.3312499999999998e+00 951 453 5.3395833333333327e+00 951 452 5.3333333333333330e+00 951 2851 -5.3312499999999998e+00 951 2473 5.3312499999999998e+00 952 952 6.4029166666666669e+01 952 161 -5.3312499999999998e+00 952 486 1.4465734552327348e-19 952 635 -2.1329166666666662e+01 952 632 1.5997916666666667e+01 952 485 -1.2659172094511536e-19 952 483 -2.1329166666666662e+01 952 480 2.1334374999999998e+01 952 162 1.0416666666666664e-02 952 962 -2.1329166666666662e+01 952 951 -1.5997916666666665e+01 952 168 -5.3312499999999998e+00 952 171 1.0667708333333334e+01 953 953 6.4029166666666669e+01 953 982 1.5997916666666667e+01 953 485 1.4465734552327348e-19 953 484 -2.1334374999999998e+01 953 954 -2.1329166666666662e+01 953 961 -1.5997916666666665e+01 953 453 5.3312499999999998e+00 953 456 -1.0667708333333334e+01 953 2849 5.3312499999999998e+00 953 2472 -9.9486666632977745e-20 953 3446 2.1329166666666662e+01 953 2473 2.1329166666666662e+01 953 2851 -1.0416666666666664e-02 954 954 6.4029166666666654e+01 954 452 -1.4465734552327348e-19 954 950 2.1329166666666662e+01 954 480 5.3312499999999998e+00 954 951 -1.5997916666666665e+01 954 484 5.3312499999999998e+00 954 485 -1.0667708333333334e+01 954 456 1.4465734552327348e-19 954 953 -2.1329166666666662e+01 954 961 1.5997916666666667e+01 954 453 -2.1334374999999998e+01 954 2473 -1.0416666666666664e-02 954 2851 2.1329166666666662e+01 955 955 6.4029166666666654e+01 955 97 -1.4465734552327348e-19 955 152 -5.3312499999999998e+00 955 92 1.4465734552327348e-19 955 94 -2.1329166666666662e+01 955 93 2.1334374999999998e+01 955 744 -2.1329166666666662e+01 955 739 1.5997916666666667e+01 955 156 1.0416666666666664e-02 955 596 -2.1329166666666662e+01 955 595 1.5997916666666665e+01 955 155 -5.3312499999999998e+00 955 154 1.0667708333333334e+01 956 956 6.4000000000291664e+01 956 427 -1.1213657767716683e-27 956 155 -5.3333333333124999e+00 956 422 1.5039633158038590e-27 956 424 -2.1333333333291666e+01 956 423 2.1333333333343749e+01 956 603 -2.1333333333291666e+01 956 595 1.5999999999979167e+01 956 166 1.0416666666666666e-10 956 740 -2.1333333333291666e+01 956 739 1.5999999999979167e+01 956 152 -5.3333333333124999e+00 956 154 1.0666666666677083e+01 957 957 6.4029166666666669e+01 957 96 5.3312499999999998e+00 957 169 9.9486666632977745e-20 957 958 -2.1329166666666662e+01 957 959 1.5997916666666667e+01 957 167 -1.4465734552327348e-19 957 156 2.1329166666666662e+01 957 168 -2.1334374999999998e+01 957 94 -1.0416666666666664e-02 957 844 2.1329166666666662e+01 957 86 5.3312499999999998e+00 957 842 -1.5997916666666665e+01 957 95 -1.0667708333333334e+01 958 958 6.4029166666666669e+01 958 155 5.3312499999999998e+00 958 97 -1.4465734552327348e-19 958 596 2.1329166666666662e+01 958 593 -1.5997916666666667e+01 958 95 1.2659172094511536e-19 958 94 2.1329166666666662e+01 958 96 -2.1334374999999998e+01 958 156 -1.0416666666666664e-02 958 957 -2.1329166666666662e+01 958 959 -1.5997916666666665e+01 958 168 5.3312499999999998e+00 958 169 -1.0667708333333334e+01 959 959 6.4041666666666671e+01 959 202 -5.3312499999999998e+00 959 159 5.3312499999999998e+00 959 605 -1.5997916666666667e+01 959 196 -5.3312499999999998e+00 959 200 5.3395833333333327e+00 959 606 1.5997916666666665e+01 959 201 5.3333333333333330e+00 959 94 -5.3312499999999998e+00 959 451 5.3312499999999998e+00 959 855 -1.5997916666666667e+01 959 87 -5.3312499999999998e+00 959 96 5.3395833333333327e+00 959 854 1.5997916666666665e+01 959 95 5.3333333333333330e+00 959 957 1.5997916666666667e+01 959 958 -1.5997916666666665e+01 959 156 5.3312499999999998e+00 959 168 -5.3395833333333327e+00 959 169 -5.3333333333333330e+00 959 960 -1.5997916666666667e+01 959 963 1.5997916666666665e+01 959 455 5.3312499999999998e+00 959 453 -5.3395833333333327e+00 959 454 -5.3333333333333330e+00 960 960 6.4029166666666654e+01 960 456 1.4465734552327348e-19 960 968 2.1329166666666662e+01 960 203 -5.3312499999999998e+00 960 961 -1.5997916666666665e+01 960 202 1.0416666666666664e-02 960 200 -5.3312499999999998e+00 960 201 1.0667708333333334e+01 960 454 -9.9486666632977745e-20 960 963 -2.1329166666666662e+01 960 959 -1.5997916666666667e+01 960 455 -2.1329166666666662e+01 960 453 2.1334374999999998e+01 961 961 6.4041666666666671e+01 961 162 5.3312499999999998e+00 961 976 -1.5997916666666667e+01 961 483 -5.3312499999999998e+00 961 484 5.3395833333333327e+00 961 962 -1.5997916666666665e+01 961 485 5.3333333333333330e+00 961 196 -5.3312499999999998e+00 961 455 5.3312499999999998e+00 961 968 -1.5997916666666667e+01 961 202 -5.3312499999999998e+00 961 203 5.3395833333333327e+00 961 960 -1.5997916666666665e+01 961 201 5.3333333333333330e+00 961 606 1.5997916666666667e+01 961 607 -1.5997916666666665e+01 961 159 5.3312499999999998e+00 961 168 -5.3395833333333327e+00 961 170 -5.3333333333333330e+00 961 954 1.5997916666666667e+01 961 953 -1.5997916666666665e+01 961 453 -5.3395833333333327e+00 961 456 -5.3333333333333330e+00 961 2473 -5.3312499999999998e+00 961 2851 5.3312499999999998e+00 962 962 6.4029166666666669e+01 962 480 -5.3312499999999998e+00 962 171 -9.9486666632977745e-20 962 952 -2.1329166666666662e+01 962 951 1.5997916666666667e+01 962 170 1.4465734552327348e-19 962 162 -2.1329166666666662e+01 962 168 2.1334374999999998e+01 962 483 1.0416666666666664e-02 962 976 2.1329166666666662e+01 962 484 -5.3312499999999998e+00 962 961 -1.5997916666666665e+01 962 485 1.0667708333333334e+01 963 963 6.4029166666666669e+01 963 213 1.4465734552327348e-19 963 967 2.1329166666666662e+01 963 964 -1.5997916666666667e+01 963 201 -1.2659172094511536e-19 963 202 -2.1329166666666662e+01 963 200 2.1334374999999998e+01 963 455 1.0416666666666664e-02 963 960 -2.1329166666666662e+01 963 959 1.5997916666666665e+01 963 453 -5.3312499999999998e+00 963 454 1.0667708333333334e+01 963 2856 -5.3312499999999998e+00 964 964 6.4041666666666671e+01 964 87 5.3312499999999998e+00 964 278 -5.3312499999999998e+00 964 690 1.5997916666666667e+01 964 82 5.3312499999999998e+00 964 96 -5.3395833333333327e+00 964 689 -1.5997916666666665e+01 964 98 -5.3333333333333330e+00 964 209 5.3312499999999998e+00 964 455 -5.3312499999999998e+00 964 963 -1.5997916666666667e+01 964 202 5.3312499999999998e+00 964 200 -5.3395833333333327e+00 964 967 -1.5997916666666665e+01 964 213 -5.3333333333333330e+00 964 994 1.5997916666666667e+01 964 965 -1.5997916666666665e+01 964 283 -5.3312499999999998e+00 964 285 5.3333333333333330e+00 964 856 -1.5997916666666667e+01 964 855 1.5997916666666665e+01 964 451 -5.3312499999999998e+00 964 454 5.3333333333333330e+00 964 2513 5.3395833333333327e+00 964 2856 5.3395833333333327e+00 965 965 6.4029166666666669e+01 965 214 1.4465734552327348e-19 965 684 -2.1329166666666662e+01 965 682 1.5997916666666667e+01 965 213 -1.4465734552327348e-19 965 209 -2.1329166666666662e+01 965 200 2.1334374999999998e+01 965 283 1.0416666666666664e-02 965 994 -2.1329166666666662e+01 965 964 -1.5997916666666665e+01 965 285 1.0667708333333334e+01 965 2513 -5.3312499999999998e+00 966 966 6.4029166666666669e+01 966 218 -1.4465734552327348e-19 966 969 -2.1329166666666662e+01 966 213 1.4465734552327348e-19 966 202 2.1329166666666662e+01 966 212 -2.1334374999999998e+01 966 455 -1.0416666666666664e-02 966 967 -2.1329166666666662e+01 966 2849 5.3312499999999998e+00 966 3447 1.5997916666666667e+01 966 3483 1.5997916666666665e+01 966 2856 5.3312499999999998e+00 966 2857 -1.0667708333333334e+01 967 967 6.4029166666666654e+01 967 454 -9.9486666632977745e-20 967 963 2.1329166666666662e+01 967 200 5.3312499999999998e+00 967 964 -1.5997916666666665e+01 967 202 -1.0416666666666664e-02 967 212 5.3312499999999998e+00 967 213 -1.0667708333333334e+01 967 966 -2.1329166666666662e+01 967 455 2.1329166666666662e+01 967 2857 1.4465734552327348e-19 967 3483 -1.5997916666666667e+01 967 2856 -2.1334374999999998e+01 968 968 6.4029166666666654e+01 968 218 1.4465734552327348e-19 968 453 5.3312499999999998e+00 968 201 -1.2659172094511536e-19 968 202 2.1329166666666662e+01 968 203 -2.1334374999999998e+01 968 960 2.1329166666666662e+01 968 961 -1.5997916666666667e+01 968 455 -1.0416666666666664e-02 968 969 -2.1329166666666662e+01 968 982 1.5997916666666665e+01 968 456 -1.0667708333333334e+01 968 2849 5.3312499999999998e+00 969 969 6.4029166666666654e+01 969 966 -2.1329166666666662e+01 969 212 5.3312499999999998e+00 969 202 -1.0416666666666664e-02 969 203 5.3312499999999998e+00 969 218 -1.0667708333333334e+01 969 456 1.4465734552327348e-19 969 968 -2.1329166666666662e+01 969 982 -1.5997916666666667e+01 969 455 2.1329166666666662e+01 969 2857 -1.4465734552327348e-19 969 3447 -1.5997916666666665e+01 969 2849 -2.1334374999999998e+01 970 970 6.4020833333541660e+01 970 304 5.3333333333124999e+00 970 286 -5.3333333333124999e+00 970 711 1.5999999999979167e+01 970 296 5.3333333333124999e+00 970 310 -5.3333333333958333e+00 970 710 -1.5999999999979167e+01 970 305 -5.3333333333333330e+00 970 979 1.5999999999979167e+01 970 975 -1.5999999999979167e+01 970 319 -5.3333333333124999e+00 970 321 5.3333333333333330e+00 970 973 -1.5997916666666667e+01 970 482 -5.3395833333333327e+00 970 949 1.5997916666666665e+01 970 287 5.3333333333333330e+00 970 2470 5.3312499999999998e+00 970 2671 -5.3312499999999998e+00 970 2666 5.3364583333645825e+00 970 2479 5.3312499999999998e+00 970 3215 1.5997916666666665e+01 970 2478 -5.3333333333333330e+00 970 3089 1.5997916666666667e+01 970 2406 -5.3312499999999998e+00 970 2413 5.3364583333645825e+00 971 971 6.4029166666666654e+01 971 486 -1.4465734552327348e-19 971 158 -5.3312499999999998e+00 971 481 1.4465734552327348e-19 971 483 -2.1329166666666662e+01 971 482 2.1334374999999998e+01 971 722 -2.1329166666666662e+01 971 717 1.5997916666666667e+01 971 162 1.0416666666666664e-02 971 635 -2.1329166666666662e+01 971 634 1.5997916666666665e+01 971 161 -5.3312499999999998e+00 971 160 1.0667708333333334e+01 972 972 6.4000000000291664e+01 972 313 -1.1213657767716683e-27 972 161 -5.3333333333124999e+00 972 309 1.5039633158038590e-27 972 311 -2.1333333333291666e+01 972 310 2.1333333333343749e+01 972 642 -2.1333333333291666e+01 972 634 1.5999999999979167e+01 972 164 1.0416666666666666e-10 972 718 -2.1333333333291666e+01 972 717 1.5999999999979167e+01 972 158 -5.3333333333124999e+00 972 160 1.0666666666677083e+01 973 973 6.4029166666666669e+01 973 970 -1.5997916666666667e+01 973 481 -9.9486666632977745e-20 973 482 2.1334374999999998e+01 973 721 -2.1329166666666662e+01 973 717 1.5997916666666665e+01 973 315 -5.3312499999999998e+00 973 321 1.0667708333333334e+01 973 2666 -5.3312499999999998e+00 973 2478 1.4465734552327348e-19 973 3215 -2.1329166666666662e+01 973 2479 -2.1329166666666662e+01 973 2671 1.0416666666666664e-02 974 974 6.4000000000291664e+01 974 300 1.1000665323307010e-27 974 948 -2.1333333333291666e+01 974 946 1.5999999999979167e+01 974 309 -1.3020149240672800e-27 974 299 -2.1333333333291666e+01 974 310 2.1333333333343749e+01 974 226 1.0416666666666666e-10 974 641 -2.1333333333291666e+01 974 634 1.5999999999979167e+01 974 223 -5.3333333333124999e+00 974 232 1.0666666666677083e+01 974 1619 -5.3333333333124999e+00 975 975 6.4000000000291664e+01 975 315 -5.3333333333124999e+00 975 313 1.1000665323307010e-27 975 716 -2.1333333333291666e+01 975 717 1.5999999999979167e+01 975 305 -1.3020149240672800e-27 975 304 -2.1333333333291666e+01 975 310 2.1333333333343749e+01 975 319 1.0416666666666666e-10 975 979 -2.1333333333291666e+01 975 970 -1.5999999999979167e+01 975 321 1.0666666666677083e+01 975 2666 -5.3333333333124999e+00 976 976 6.4029166666666669e+01 976 168 5.3312499999999998e+00 976 485 -1.2659172094511536e-19 976 962 2.1329166666666662e+01 976 961 -1.5997916666666667e+01 976 481 1.4465734552327348e-19 976 483 2.1329166666666662e+01 976 484 -2.1334374999999998e+01 976 162 -1.0416666666666664e-02 976 722 2.1329166666666662e+01 976 713 -1.5997916666666665e+01 976 158 5.3312499999999998e+00 976 170 -1.0667708333333334e+01 977 977 6.4029166666666654e+01 977 315 5.3312499999999998e+00 977 481 -9.9486666632977745e-20 977 484 -2.1334374999999998e+01 977 721 2.1329166666666662e+01 977 713 -1.5997916666666667e+01 977 981 1.5997916666666665e+01 977 314 -1.0667708333333334e+01 977 2480 1.4465734552327348e-19 977 2479 2.1329166666666662e+01 977 2671 -1.0416666666666664e-02 977 3212 2.1329166666666662e+01 977 2665 5.3312499999999998e+00 978 978 6.4020833333541660e+01 978 296 -5.3333333333124999e+00 978 319 5.3333333333124999e+00 978 1019 1.5999999999979167e+01 978 304 -5.3333333333124999e+00 978 302 5.3333333333958333e+00 978 979 -1.5999999999979167e+01 978 305 5.3333333333333330e+00 978 288 5.3312499999999998e+00 978 1011 -1.0658333333333333e+01 978 322 -1.3332291666666665e+01 978 710 1.5999999999979167e+01 978 709 -1.5999999999979167e+01 978 286 5.3333333333124999e+00 978 289 -1.3332291666666665e+01 978 3213 2.1331249999999997e+01 978 2666 2.6624999999687500e+00 978 2674 5.3312499999999998e+00 978 2413 2.6624999999687495e+00 979 979 6.4000000000291664e+01 979 310 -5.3333333333124999e+00 979 321 -1.1000665323307010e-27 979 975 -2.1333333333291666e+01 979 970 1.5999999999979167e+01 979 322 1.1213657767716683e-27 979 319 -2.1333333333291666e+01 979 304 1.0416666666666666e-10 979 1019 -2.1333333333291666e+01 979 302 -5.3333333333124999e+00 979 978 -1.5999999999979167e+01 979 305 1.0666666666677083e+01 979 2666 2.1333333333343749e+01 980 980 6.4029166666666669e+01 980 215 1.2659172094511536e-19 980 986 2.1329166666666662e+01 980 981 -1.5997916666666667e+01 980 204 -1.4465734552327348e-19 980 205 -2.1329166666666662e+01 980 203 2.1334374999999998e+01 980 316 1.0416666666666664e-02 980 714 -2.1329166666666662e+01 980 713 1.5997916666666665e+01 980 315 -5.3312499999999998e+00 980 314 1.0667708333333334e+01 980 2665 -5.3312499999999998e+00 981 981 6.4041666666666671e+01 981 217 5.3312499999999998e+00 981 316 -5.3312499999999998e+00 981 980 -1.5997916666666667e+01 981 205 5.3312499999999998e+00 981 203 -5.3395833333333327e+00 981 986 -1.5997916666666665e+01 981 215 -5.3333333333333330e+00 981 1008 1.5997916666666667e+01 981 984 -1.5997916666666665e+01 981 489 -5.3312499999999998e+00 981 490 5.3333333333333330e+00 981 983 -1.5997916666666667e+01 981 484 -5.3395833333333327e+00 981 977 1.5997916666666665e+01 981 314 5.3333333333333330e+00 981 2479 5.3312499999999998e+00 981 2425 -5.3312499999999998e+00 981 2424 5.3395833333333327e+00 981 2467 5.3312499999999998e+00 981 3074 1.5997916666666665e+01 981 2480 -5.3333333333333330e+00 981 3212 1.5997916666666667e+01 981 2671 -5.3312499999999998e+00 981 2665 5.3395833333333327e+00 982 982 6.4041666666666671e+01 982 202 5.3312499999999998e+00 982 489 -5.3312499999999998e+00 982 984 -1.5997916666666667e+01 982 217 5.3312499999999998e+00 982 203 -5.3395833333333327e+00 982 1010 -1.5997916666666665e+01 982 218 -5.3333333333333330e+00 982 953 1.5997916666666667e+01 982 484 -5.3395833333333327e+00 982 983 -1.5997916666666665e+01 982 490 5.3333333333333330e+00 982 969 -1.5997916666666667e+01 982 968 1.5997916666666665e+01 982 455 -5.3312499999999998e+00 982 456 5.3333333333333330e+00 982 2467 5.3312499999999998e+00 982 2851 -5.3312499999999998e+00 982 2473 5.3312499999999998e+00 982 3446 1.5997916666666665e+01 982 2472 -5.3333333333333330e+00 982 3076 1.5997916666666667e+01 982 2425 -5.3312499999999998e+00 982 2435 5.3395833333333327e+00 982 2849 5.3395833333333327e+00 983 983 6.4029166666666669e+01 983 981 -1.5997916666666667e+01 983 484 2.1334374999999998e+01 983 982 -1.5997916666666665e+01 983 490 1.0667708333333334e+01 983 2424 -5.3312499999999998e+00 983 2480 1.2659172094511536e-19 983 3074 -2.1329166666666662e+01 983 2472 -1.4465734552327348e-19 983 2467 -2.1329166666666662e+01 983 2425 1.0416666666666664e-02 983 3076 -2.1329166666666662e+01 983 2435 -5.3312499999999998e+00 984 984 6.4029166666666669e+01 984 218 9.9486666632977745e-20 984 1010 2.1329166666666662e+01 984 982 -1.5997916666666667e+01 984 215 -1.4465734552327348e-19 984 217 -2.1329166666666662e+01 984 203 2.1334374999999998e+01 984 489 1.0416666666666664e-02 984 1008 -2.1329166666666662e+01 984 981 -1.5997916666666665e+01 984 490 1.0667708333333334e+01 984 2435 -5.3312499999999998e+00 984 2424 -5.3312499999999998e+00 985 985 6.4029166666666669e+01 985 206 -1.4465734552327348e-19 985 731 2.1329166666666662e+01 985 215 1.2659172094511536e-19 985 205 2.1329166666666662e+01 985 216 -2.1334374999999998e+01 985 316 -1.0416666666666664e-02 985 986 -2.1329166666666662e+01 985 2670 5.3312499999999998e+00 985 3390 1.5997916666666667e+01 985 3211 1.5997916666666665e+01 985 2665 5.3312499999999998e+00 985 2673 -1.0667708333333334e+01 986 986 6.4029166666666654e+01 986 314 -1.4465734552327348e-19 986 980 2.1329166666666662e+01 986 203 5.3312499999999998e+00 986 981 -1.5997916666666665e+01 986 205 -1.0416666666666664e-02 986 216 5.3312499999999998e+00 986 215 -1.0667708333333334e+01 986 985 -2.1329166666666662e+01 986 316 2.1329166666666662e+01 986 2673 9.9486666632977745e-20 986 3211 -1.5997916666666667e+01 986 2665 -2.1334374999999998e+01 987 987 6.4029166666666669e+01 987 275 1.4465734552327348e-19 987 992 2.1329166666666662e+01 987 274 -1.4465734552327348e-19 987 273 -2.1329166666666662e+01 987 270 2.1334374999999998e+01 987 280 1.0416666666666664e-02 987 993 2.1329166666666662e+01 987 3128 -1.5997916666666667e+01 987 3482 -1.5997916666666665e+01 987 2513 -5.3312499999999998e+00 987 2512 1.0667708333333334e+01 988 988 3.2020833333333336e+01 989 989 6.4029166666666654e+01 989 275 -1.4465734552327348e-19 989 271 9.9486666632977745e-20 989 273 -2.1329166666666662e+01 989 272 2.1334374999999998e+01 989 991 -2.1329166666666662e+01 989 280 1.0416666666666664e-02 989 992 2.1329166666666662e+01 990 990 3.2020833333333336e+01 991 991 6.4029166666666669e+01 991 264 -5.3312499999999998e+00 991 284 -1.2659172094511536e-19 991 897 -2.1329166666666662e+01 991 895 1.5997916666666667e+01 991 280 -2.1329166666666662e+01 991 273 1.0416666666666664e-02 991 989 -2.1329166666666662e+01 991 272 -5.3312499999999998e+00 991 271 1.0667708333333334e+01 992 992 6.4029166666666669e+01 992 272 5.3312499999999998e+00 992 273 -1.0416666666666664e-02 992 987 2.1329166666666662e+01 992 270 5.3312499999999998e+00 992 275 -1.0667708333333334e+01 992 989 2.1329166666666662e+01 992 280 2.1329166666666662e+01 992 2512 -1.4465734552327348e-19 992 3128 -1.5997916666666665e+01 993 993 6.4029166666666669e+01 993 270 5.3312499999999998e+00 993 987 2.1329166666666662e+01 993 284 -1.2659172094511536e-19 993 280 2.1329166666666662e+01 993 273 -1.0416666666666664e-02 993 897 2.1329166666666662e+01 993 264 5.3312499999999998e+00 993 896 -1.5997916666666665e+01 993 274 -1.0667708333333334e+01 993 2512 1.4465734552327348e-19 993 3482 -1.5997916666666667e+01 993 2513 -2.1334374999999998e+01 994 994 6.4029166666666669e+01 994 200 -5.3312499999999998e+00 994 285 -1.4465734552327348e-19 994 965 -2.1329166666666662e+01 994 964 1.5997916666666667e+01 994 283 -2.1329166666666662e+01 994 209 1.0416666666666664e-02 994 1001 2.1329166666666662e+01 994 212 -5.3312499999999998e+00 994 213 1.0667708333333334e+01 994 2514 1.2659172094511536e-19 994 2513 2.1334374999999998e+01 994 3483 1.5997916666666665e+01 995 995 3.2020833333333336e+01 996 996 6.4029166666666654e+01 996 214 -1.4465734552327348e-19 996 207 9.9486666632977745e-20 996 209 -2.1329166666666662e+01 996 208 2.1334374999999998e+01 996 1000 -2.1329166666666662e+01 996 283 1.0416666666666664e-02 996 684 -2.1329166666666662e+01 997 997 3.2020833333333336e+01 998 998 6.4029166666666669e+01 998 211 1.2659172094511536e-19 998 1004 2.1329166666666662e+01 998 207 -1.4465734552327348e-19 998 210 -2.1329166666666662e+01 998 208 2.1334374999999998e+01 998 487 1.0416666666666664e-02 998 999 -2.1329166666666662e+01 999 999 6.4029166666666654e+01 999 1002 2.1329166666666662e+01 999 212 -5.3312499999999998e+00 999 210 1.0416666666666664e-02 999 208 -5.3312499999999998e+00 999 207 1.0667708333333334e+01 999 998 -2.1329166666666662e+01 999 487 -2.1329166666666662e+01 999 2548 1.4465734552327348e-19 999 3484 1.5997916666666665e+01 1000 1000 6.4029166666666669e+01 1000 212 -5.3312499999999998e+00 1000 1001 2.1329166666666662e+01 1000 283 -2.1329166666666662e+01 1000 209 1.0416666666666664e-02 1000 996 -2.1329166666666662e+01 1000 208 -5.3312499999999998e+00 1000 207 1.0667708333333334e+01 1000 2514 -1.2659172094511536e-19 1000 3484 1.5997916666666667e+01 1001 1001 6.4029166666666669e+01 1001 213 -1.4465734552327348e-19 1001 994 2.1329166666666662e+01 1001 207 9.9486666632977745e-20 1001 209 2.1329166666666662e+01 1001 212 -2.1334374999999998e+01 1001 283 -1.0416666666666664e-02 1001 1000 2.1329166666666662e+01 1001 2513 5.3312499999999998e+00 1001 3483 1.5997916666666667e+01 1001 3484 1.5997916666666665e+01 1001 2514 -1.0667708333333334e+01 1002 1002 6.4029166666666654e+01 1002 219 1.4465734552327348e-19 1002 207 -1.4465734552327348e-19 1002 210 2.1329166666666662e+01 1002 212 -2.1334374999999998e+01 1002 999 2.1329166666666662e+01 1002 487 -1.0416666666666664e-02 1002 1003 -2.1329166666666662e+01 1002 3484 1.5997916666666667e+01 1002 3157 1.5997916666666665e+01 1002 2553 5.3312499999999998e+00 1002 2548 -1.0667708333333334e+01 1003 1003 6.4029166666666654e+01 1003 1005 -2.1329166666666662e+01 1003 216 5.3312499999999998e+00 1003 210 -1.0416666666666664e-02 1003 212 5.3312499999999998e+00 1003 219 -1.0667708333333334e+01 1003 1002 -2.1329166666666662e+01 1003 487 2.1329166666666662e+01 1003 2561 -9.9486666632977745e-20 1003 3158 -1.5997916666666665e+01 1003 2548 1.4465734552327348e-19 1003 3157 -1.5997916666666667e+01 1003 2553 -2.1334374999999998e+01 1004 1004 6.4029166666666669e+01 1004 216 5.3312499999999998e+00 1004 1005 -2.1329166666666662e+01 1004 487 2.1329166666666662e+01 1004 210 -1.0416666666666664e-02 1004 998 2.1329166666666662e+01 1004 208 5.3312499999999998e+00 1004 211 -1.0667708333333334e+01 1004 2561 9.9486666632977745e-20 1004 3534 -1.5997916666666667e+01 1005 1005 6.4029166666666669e+01 1005 219 -1.4465734552327348e-19 1005 1003 -2.1329166666666662e+01 1005 211 1.2659172094511536e-19 1005 210 2.1329166666666662e+01 1005 216 -2.1334374999999998e+01 1005 487 -1.0416666666666664e-02 1005 1004 -2.1329166666666662e+01 1005 2553 5.3312499999999998e+00 1005 3158 1.5997916666666667e+01 1005 3534 1.5997916666666665e+01 1005 2561 -1.0667708333333334e+01 1006 1006 6.4029166666666669e+01 1006 219 1.4465734552327348e-19 1006 1009 2.1329166666666662e+01 1006 218 -9.9486666632977745e-20 1006 217 -2.1329166666666662e+01 1006 212 2.1334374999999998e+01 1006 489 1.0416666666666664e-02 1006 1010 2.1329166666666662e+01 1006 2432 -5.3312499999999998e+00 1006 3157 -1.5997916666666667e+01 1006 3447 -1.5997916666666665e+01 1006 2435 -5.3312499999999998e+00 1006 2437 1.0667708333333334e+01 1007 1007 6.4029166666666654e+01 1007 219 -1.4465734552327348e-19 1007 215 1.4465734552327348e-19 1007 217 -2.1329166666666662e+01 1007 216 2.1334374999999998e+01 1007 1008 -2.1329166666666662e+01 1007 489 1.0416666666666664e-02 1007 1009 2.1329166666666662e+01 1007 2424 -5.3312499999999998e+00 1007 3211 -1.5997916666666667e+01 1007 3158 -1.5997916666666665e+01 1007 2432 -5.3312499999999998e+00 1007 2429 1.0667708333333334e+01 1008 1008 6.4029166666666669e+01 1008 203 -5.3312499999999998e+00 1008 490 -1.4465734552327348e-19 1008 984 -2.1329166666666662e+01 1008 981 1.5997916666666667e+01 1008 489 -2.1329166666666662e+01 1008 217 1.0416666666666664e-02 1008 1007 -2.1329166666666662e+01 1008 216 -5.3312499999999998e+00 1008 215 1.0667708333333334e+01 1008 2429 1.4465734552327348e-19 1008 2424 2.1334374999999998e+01 1008 3211 1.5997916666666665e+01 1009 1009 6.4029166666666669e+01 1009 216 5.3312499999999998e+00 1009 217 -1.0416666666666664e-02 1009 1006 2.1329166666666662e+01 1009 212 5.3312499999999998e+00 1009 219 -1.0667708333333334e+01 1009 1007 2.1329166666666662e+01 1009 489 2.1329166666666662e+01 1009 2437 -1.2659172094511536e-19 1009 3157 -1.5997916666666665e+01 1009 2429 1.4465734552327348e-19 1009 3158 -1.5997916666666667e+01 1009 2432 -2.1334374999999998e+01 1010 1010 6.4029166666666669e+01 1010 212 5.3312499999999998e+00 1010 1006 2.1329166666666662e+01 1010 490 -1.4465734552327348e-19 1010 489 2.1329166666666662e+01 1010 217 -1.0416666666666664e-02 1010 984 2.1329166666666662e+01 1010 203 5.3312499999999998e+00 1010 982 -1.5997916666666665e+01 1010 218 -1.0667708333333334e+01 1010 2437 1.2659172094511536e-19 1010 3447 -1.5997916666666667e+01 1010 2435 -2.1334374999999998e+01 1011 1011 4.2733333333333334e+01 1011 322 6.2500000000000003e-03 1011 978 -1.0658333333333333e+01 1011 1018 1.0658333333333333e+01 1011 1012 -1.0666666666666666e+01 1011 429 6.2500000000000003e-03 1011 431 -4.1666666666666666e-03 1011 293 6.2500000000000003e-03 1011 1015 -1.0658333333333333e+01 1011 1014 -1.0666666666666666e+01 1011 289 6.2500000000000003e-03 1011 288 -4.1666666666666666e-03 1011 708 -1.0658333333333333e+01 1011 2668 -1.0416666666666669e-03 1011 2413 -1.0416666666666669e-03 1011 2666 -1.0416666666666667e-03 1011 2674 -4.1666666666666666e-03 1011 3213 -1.0666666666666666e+01 1011 2834 -1.0416666666666667e-03 1011 3977 -1.0416666666666669e-03 1011 1454 -1.0416666666666669e-03 1011 1463 -1.0416666666666667e-03 1011 3971 -4.1666666666666666e-03 1011 3780 -1.0416666666666667e-03 1011 4886 -1.0666666666666666e+01 1012 1012 4.2691666666666663e+01 1012 322 -5.3322916666666664e+00 1012 1018 -2.1331249999999997e+01 1012 1011 -1.0666666666666666e+01 1012 429 -5.3322916666666664e+00 1012 431 1.0668750000000001e+01 1012 2833 -5.3322916666666664e+00 1012 2834 6.2500000000000003e-03 1012 2668 6.2500000000000003e-03 1012 3382 -2.1331249999999997e+01 1012 3383 -1.0666666666666666e+01 1012 2661 -5.3322916666666664e+00 1012 2674 1.0668750000000001e+01 1013 1013 4.2691666666666663e+01 1013 431 1.0668750000000001e+01 1013 491 1.0668750000000001e+01 1013 2822 -5.3322916666666664e+00 1013 3381 -2.1331249999999997e+01 1013 3383 -1.0666666666666666e+01 1013 2833 -5.3322916666666664e+00 1013 1458 6.2500000000000003e-03 1013 1457 -5.3322916666666664e+00 1013 1646 6.2500000000000003e-03 1013 2194 -2.1331249999999997e+01 1013 4597 -1.0666666666666666e+01 1013 3957 -5.3322916666666664e+00 1014 1014 4.2691666666666663e+01 1014 429 -5.3322916666666664e+00 1014 1015 2.1331249999999997e+01 1014 1011 -1.0666666666666666e+01 1014 293 -5.3322916666666664e+00 1014 431 1.0668750000000001e+01 1014 1463 6.2500000000000003e-03 1014 3972 -5.3322916666666664e+00 1014 3971 1.0668750000000001e+01 1014 1454 6.2500000000000003e-03 1014 1937 -2.1331249999999997e+01 1014 4597 -1.0666666666666666e+01 1014 1457 -5.3322916666666664e+00 1015 1015 6.4020833333541660e+01 1015 303 -5.3333333333124999e+00 1015 706 -1.5999999999979167e+01 1015 302 5.3333333333958333e+00 1015 704 1.5999999999979167e+01 1015 308 5.3333333333333330e+00 1015 431 5.3312499999999998e+00 1015 1014 2.1331249999999997e+01 1015 1011 -1.0658333333333333e+01 1015 293 -1.3332291666666665e+01 1015 1016 -1.5999999999979167e+01 1015 1017 1.5999999999979167e+01 1015 430 5.3333333333124999e+00 1015 429 -1.3332291666666665e+01 1015 1470 5.3333333333124999e+00 1015 1674 -5.3333333333124999e+00 1015 1463 2.6624999999687500e+00 1015 3971 5.3312499999999998e+00 1015 1454 2.6624999999687495e+00 1016 1016 6.4000000000291664e+01 1016 302 -5.3333333333124999e+00 1016 303 1.0416666666666666e-10 1016 1062 2.1333333333291666e+01 1016 308 1.0666666666677083e+01 1016 429 -1.1000665323307010e-27 1016 1017 -2.1333333333291666e+01 1016 1015 -1.5999999999979167e+01 1016 430 -2.1333333333291666e+01 1016 1459 1.3233141685082473e-27 1016 1673 -5.3333333333124999e+00 1016 1940 1.5999999999979167e+01 1016 1454 2.1333333333343749e+01 1017 1017 6.4000000000291664e+01 1017 308 -1.5039633158038590e-27 1017 301 1.1000665323307010e-27 1017 303 -2.1333333333291666e+01 1017 302 2.1333333333343749e+01 1017 1022 -2.1333333333291666e+01 1017 1018 -1.5999999999979167e+01 1017 430 1.0416666666666666e-10 1017 1016 -2.1333333333291666e+01 1017 1015 1.5999999999979167e+01 1017 429 1.0666666666677083e+01 1017 2834 -5.3333333333124999e+00 1017 1454 -5.3333333333124999e+00 1018 1018 6.4020833333541660e+01 1018 304 5.3333333333124999e+00 1018 430 -5.3333333333124999e+00 1018 1017 -1.5999999999979167e+01 1018 303 5.3333333333124999e+00 1018 302 -5.3333333333958333e+00 1018 1022 1.5999999999979167e+01 1018 301 -5.3333333333333330e+00 1018 1021 1.5999999999979167e+01 1018 1019 -1.5999999999979167e+01 1018 319 -5.3333333333124999e+00 1018 322 1.3332291666666665e+01 1018 1012 -2.1331249999999997e+01 1018 1011 1.0658333333333333e+01 1018 429 1.3332291666666665e+01 1018 431 -5.3312499999999998e+00 1018 2668 -2.6624999999687500e+00 1018 2674 -5.3312499999999998e+00 1018 2834 -2.6624999999687500e+00 1019 1019 6.4000000000291664e+01 1019 305 1.3020149240672800e-27 1019 979 -2.1333333333291666e+01 1019 978 1.5999999999979167e+01 1019 301 -1.3233141685082473e-27 1019 304 -2.1333333333291666e+01 1019 302 2.1333333333343749e+01 1019 319 1.0416666666666666e-10 1019 1021 -2.1333333333291666e+01 1019 1018 -1.5999999999979167e+01 1019 322 1.0666666666677083e+01 1019 2666 -5.3333333333124999e+00 1019 2668 -5.3333333333124999e+00 1020 1020 6.4000000000416662e+01 1020 303 -5.3333333333124999e+00 1020 319 5.3333333333124999e+00 1020 1063 -1.5999999999979167e+01 1020 304 -5.3333333333124999e+00 1020 306 5.3333333333958333e+00 1020 1021 -1.5999999999979167e+01 1020 301 5.3333333333333330e+00 1020 1022 -1.5999999999979167e+01 1020 1060 -1.5999999999979167e+01 1020 430 5.3333333333124999e+00 1020 326 -5.3333333333124999e+00 1020 428 5.3333333333124999e+00 1020 432 -5.3333333333333330e+00 1020 786 -1.5999999999979167e+01 1020 331 -5.3333333333124999e+00 1020 345 5.3333333333958333e+00 1020 785 1.5999999999979167e+01 1020 346 5.3333333333333330e+00 1020 727 1.5999999999979167e+01 1020 726 -1.5999999999979167e+01 1020 318 5.3333333333124999e+00 1020 317 -5.3333333333333330e+00 1020 2834 -5.3333333333958333e+00 1020 2668 -5.3333333333958333e+00 1021 1021 6.4000000000291664e+01 1021 317 1.5039633158038590e-27 1021 1063 2.1333333333291666e+01 1021 306 -5.3333333333124999e+00 1021 1020 -1.5999999999979167e+01 1021 304 1.0416666666666666e-10 1021 302 -5.3333333333124999e+00 1021 301 1.0666666666677083e+01 1021 322 -1.1213657767716683e-27 1021 1019 -2.1333333333291666e+01 1021 1018 1.5999999999979167e+01 1021 319 -2.1333333333291666e+01 1021 2668 2.1333333333343749e+01 1022 1022 6.4000000000291664e+01 1022 306 -5.3333333333124999e+00 1022 432 -1.3020149240672800e-27 1022 1060 2.1333333333291666e+01 1022 1020 -1.5999999999979167e+01 1022 429 1.1000665323307010e-27 1022 430 -2.1333333333291666e+01 1022 303 1.0416666666666666e-10 1022 1017 -2.1333333333291666e+01 1022 302 -5.3333333333124999e+00 1022 1018 1.5999999999979167e+01 1022 301 1.0666666666677083e+01 1022 2834 2.1333333333343749e+01 1023 1023 4.2666666666916662e+01 1023 233 -5.3333333333229165e+00 1023 1025 -2.1333333333312499e+01 1023 1281 -5.3333333333229165e+00 1023 1282 6.2499999999999991e-11 1023 1726 -1.0666666666666666e+01 1023 1285 -5.3333333333229165e+00 1023 1283 1.0666666666687499e+01 1023 1620 6.2500000000000004e-11 1023 2094 -2.1333333333312499e+01 1023 1732 -1.0666666666666666e+01 1023 1611 -5.3333333333229165e+00 1023 1615 1.0666666666687499e+01 1024 1024 6.4000000000291664e+01 1024 381 -1.1000665323307010e-27 1024 372 1.3233141685082473e-27 1024 374 -2.1333333333291666e+01 1024 373 2.1333333333343749e+01 1024 1031 -2.1333333333291666e+01 1024 1025 -1.5999999999979167e+01 1024 291 1.0416666666666666e-10 1024 1035 2.1333333333291666e+01 1024 1282 -5.3333333333124999e+00 1024 1915 -1.5999999999979167e+01 1024 1278 -5.3333333333124999e+00 1024 1285 1.0666666666677083e+01 1025 1025 6.4000000000416662e+01 1025 375 5.3333333333124999e+00 1025 291 -5.3333333333124999e+00 1025 1024 -1.5999999999979167e+01 1025 374 5.3333333333124999e+00 1025 373 -5.3333333333958333e+00 1025 1031 1.5999999999979167e+01 1025 372 -5.3333333333333330e+00 1025 1030 1.5999999999979167e+01 1025 1026 -1.5999999999979167e+01 1025 227 -5.3333333333124999e+00 1025 233 1.3333333333322916e+01 1025 1023 -2.1333333333312499e+01 1025 1620 -2.6666666665937502e+00 1025 1615 -5.3333333333124999e+00 1025 1726 1.0666666666583334e+01 1025 1282 -2.6666666665937502e+00 1025 1285 1.3333333333322916e+01 1025 1283 -5.3333333333124999e+00 1026 1026 6.4000000000291664e+01 1026 376 1.1213657767716683e-27 1026 652 -2.1333333333291666e+01 1026 650 1.5999999999979167e+01 1026 372 -1.1000665323307010e-27 1026 375 -2.1333333333291666e+01 1026 373 2.1333333333343749e+01 1026 227 1.0416666666666666e-10 1026 1030 -2.1333333333291666e+01 1026 1025 -1.5999999999979167e+01 1026 233 1.0666666666677083e+01 1026 1617 -5.3333333333124999e+00 1026 1620 -5.3333333333124999e+00 1027 1027 6.4000000000291664e+01 1027 381 1.1213657767716683e-27 1027 1055 -2.1333333333291666e+01 1027 383 -1.1000665323307010e-27 1027 382 -2.1333333333291666e+01 1027 373 2.1333333333343749e+01 1027 492 1.0416666666666666e-10 1027 1056 2.1333333333291666e+01 1027 1421 -5.3333333333124999e+00 1027 1915 -1.5999999999979167e+01 1027 2196 -1.5999999999979167e+01 1027 1429 1.0666666666677083e+01 1028 1028 6.4000000000416662e+01 1028 374 -5.3333333333124999e+00 1028 227 5.3333333333124999e+00 1028 1039 -1.5999999999979167e+01 1028 375 -5.3333333333124999e+00 1028 377 5.3333333333958333e+00 1028 1030 -1.5999999999979167e+01 1028 372 5.3333333333333330e+00 1028 1031 -1.5999999999979167e+01 1028 1036 -1.5999999999979167e+01 1028 291 5.3333333333124999e+00 1028 299 -5.3333333333124999e+00 1028 292 -5.3333333333333330e+00 1028 703 -1.5999999999979167e+01 1028 297 5.3333333333958333e+00 1028 702 1.5999999999979167e+01 1028 298 5.3333333333333330e+00 1028 1029 -1.5999999999979167e+01 1028 1040 1.5999999999979167e+01 1028 226 5.3333333333124999e+00 1028 225 -5.3333333333333330e+00 1028 1290 5.3333333333124999e+00 1028 1282 -5.3333333333958333e+00 1028 1675 -5.3333333333124999e+00 1028 1620 -5.3333333333958333e+00 1029 1029 6.4000000000291664e+01 1029 701 -2.1333333333291666e+01 1029 294 -5.3333333333124999e+00 1029 299 1.0416666666666666e-10 1029 297 -5.3333333333124999e+00 1029 298 1.0666666666677083e+01 1029 225 -1.1213657767716683e-27 1029 1040 -2.1333333333291666e+01 1029 1028 -1.5999999999979167e+01 1029 226 -2.1333333333291666e+01 1029 1621 1.5039633158038590e-27 1029 1818 1.5999999999979167e+01 1029 1620 2.1333333333343749e+01 1030 1030 6.4000000000291664e+01 1030 225 1.1000665323307010e-27 1030 1039 2.1333333333291666e+01 1030 377 -5.3333333333124999e+00 1030 1028 -1.5999999999979167e+01 1030 375 1.0416666666666666e-10 1030 373 -5.3333333333124999e+00 1030 372 1.0666666666677083e+01 1030 233 -1.3020149240672800e-27 1030 1026 -2.1333333333291666e+01 1030 1025 1.5999999999979167e+01 1030 227 -2.1333333333291666e+01 1030 1620 2.1333333333343749e+01 1031 1031 6.4000000000291664e+01 1031 377 -5.3333333333124999e+00 1031 292 -1.1213657767716683e-27 1031 1036 2.1333333333291666e+01 1031 1028 -1.5999999999979167e+01 1031 291 -2.1333333333291666e+01 1031 374 1.0416666666666666e-10 1031 1024 -2.1333333333291666e+01 1031 373 -5.3333333333124999e+00 1031 1025 1.5999999999979167e+01 1031 372 1.0666666666677083e+01 1031 1285 1.5039633158038590e-27 1031 1282 2.1333333333343749e+01 1032 1032 6.4000000000291664e+01 1032 475 1.3020149240672800e-27 1032 1050 2.1333333333291666e+01 1032 386 -5.3333333333124999e+00 1032 1033 -1.5999999999979167e+01 1032 379 1.0416666666666666e-10 1032 380 -5.3333333333124999e+00 1032 390 1.0666666666677083e+01 1032 1052 2.1333333333291666e+01 1032 471 -2.1333333333291666e+01 1032 1590 -1.3233141685082473e-27 1032 2263 1.5999999999979167e+01 1032 1589 2.1333333333343749e+01 1033 1033 6.4000000000416662e+01 1033 415 -5.3333333333124999e+00 1033 436 5.3333333333124999e+00 1033 807 -1.5999999999979167e+01 1033 410 -5.3333333333124999e+00 1033 426 5.3333333333958333e+00 1033 806 1.5999999999979167e+01 1033 419 5.3333333333333330e+00 1033 389 -5.3333333333124999e+00 1033 471 5.3333333333124999e+00 1033 1050 -1.5999999999979167e+01 1033 379 -5.3333333333124999e+00 1033 386 5.3333333333958333e+00 1033 1032 -1.5999999999979167e+01 1033 390 5.3333333333333330e+00 1033 1034 -1.5999999999979167e+01 1033 1071 1.5999999999979167e+01 1033 439 5.3333333333124999e+00 1033 440 -5.3333333333333330e+00 1033 926 1.5999999999979167e+01 1033 925 -1.5999999999979167e+01 1033 474 5.3333333333124999e+00 1033 475 -5.3333333333333330e+00 1033 1390 -5.3333333333958333e+00 1033 1589 -5.3333333333958333e+00 1034 1034 6.4000000000291664e+01 1034 386 -5.3333333333124999e+00 1034 440 -1.5039633158038590e-27 1034 1071 -2.1333333333291666e+01 1034 1033 -1.5999999999979167e+01 1034 439 -2.1333333333291666e+01 1034 389 1.0416666666666666e-10 1034 1054 -2.1333333333291666e+01 1034 380 -5.3333333333124999e+00 1034 390 1.0666666666677083e+01 1034 1392 1.1000665323307010e-27 1034 1390 2.1333333333343749e+01 1034 2263 1.5999999999979167e+01 1035 1035 6.4000000000291664e+01 1035 373 5.3333333333124999e+00 1035 374 -1.0416666666666666e-10 1035 1038 -2.1333333333291666e+01 1035 380 5.3333333333124999e+00 1035 381 -1.0666666666677083e+01 1035 1024 2.1333333333291666e+01 1035 291 2.1333333333291666e+01 1035 1286 -1.1000665323307010e-27 1035 1916 -1.5999999999979167e+01 1035 1285 1.5039633158038590e-27 1035 1915 -1.5999999999979167e+01 1035 1278 -2.1333333333343749e+01 1036 1036 6.4000000000291664e+01 1036 378 -1.3020149240672800e-27 1036 1037 -2.1333333333291666e+01 1036 1041 1.5999999999979167e+01 1036 372 1.3233141685082473e-27 1036 374 2.1333333333291666e+01 1036 377 -2.1333333333343749e+01 1036 291 -1.0416666666666666e-10 1036 1031 2.1333333333291666e+01 1036 1028 -1.5999999999979167e+01 1036 292 -1.0666666666677083e+01 1036 1287 5.3333333333124999e+00 1036 1282 5.3333333333124999e+00 1037 1037 6.4000000000291664e+01 1037 380 5.3333333333124999e+00 1037 1038 -2.1333333333291666e+01 1037 292 -1.1213657767716683e-27 1037 291 2.1333333333291666e+01 1037 374 -1.0416666666666666e-10 1037 1036 -2.1333333333291666e+01 1037 377 5.3333333333124999e+00 1037 1041 -1.5999999999979167e+01 1037 378 -1.0666666666677083e+01 1037 1286 1.1000665323307010e-27 1037 2264 -1.5999999999979167e+01 1037 1287 -2.1333333333343749e+01 1038 1038 6.4000000000291664e+01 1038 381 -1.1000665323307010e-27 1038 1035 -2.1333333333291666e+01 1038 378 1.3020149240672800e-27 1038 374 2.1333333333291666e+01 1038 380 -2.1333333333343749e+01 1038 291 -1.0416666666666666e-10 1038 1037 -2.1333333333291666e+01 1038 1278 5.3333333333124999e+00 1038 1916 1.5999999999979167e+01 1038 2264 1.5999999999979167e+01 1038 1287 5.3333333333124999e+00 1038 1286 -1.0666666666677083e+01 1039 1039 6.4000000000291664e+01 1039 385 1.5039633158038590e-27 1039 372 -1.1000665323307010e-27 1039 375 2.1333333333291666e+01 1039 377 -2.1333333333343749e+01 1039 1030 2.1333333333291666e+01 1039 1028 -1.5999999999979167e+01 1039 227 -1.0416666666666666e-10 1039 637 2.1333333333291666e+01 1039 636 -1.5999999999979167e+01 1039 223 5.3333333333124999e+00 1039 225 -1.0666666666677083e+01 1039 1620 5.3333333333124999e+00 1040 1040 6.4000000000291664e+01 1040 223 -5.3333333333124999e+00 1040 309 1.3020149240672800e-27 1040 641 -2.1333333333291666e+01 1040 636 1.5999999999979167e+01 1040 298 -1.3233141685082473e-27 1040 299 -2.1333333333291666e+01 1040 297 2.1333333333343749e+01 1040 226 1.0416666666666666e-10 1040 1029 -2.1333333333291666e+01 1040 1028 1.5999999999979167e+01 1040 225 1.0666666666677083e+01 1040 1620 -5.3333333333124999e+00 1041 1041 6.4000000000416662e+01 1041 379 5.3333333333124999e+00 1041 291 -5.3333333333124999e+00 1041 1036 1.5999999999979167e+01 1041 374 5.3333333333124999e+00 1041 377 -5.3333333333958333e+00 1041 1037 -1.5999999999979167e+01 1041 378 -5.3333333333333330e+00 1041 1044 -1.5999999999979167e+01 1041 297 -5.3333333333958333e+00 1041 703 1.5999999999979167e+01 1041 292 5.3333333333333330e+00 1041 1046 1.5999999999979167e+01 1041 1042 -1.5999999999979167e+01 1041 471 -5.3333333333124999e+00 1041 470 5.3333333333333330e+00 1041 1675 5.3333333333124999e+00 1041 1594 -5.3333333333124999e+00 1041 1677 5.3333333333124999e+00 1041 2267 1.5999999999979167e+01 1041 1676 -5.3333333333333330e+00 1041 2269 1.5999999999979167e+01 1041 1290 -5.3333333333124999e+00 1041 1287 5.3333333333958333e+00 1041 1591 5.3333333333958333e+00 1042 1042 6.4000000000291664e+01 1042 473 -5.3333333333124999e+00 1042 384 1.1000665323307010e-27 1042 1051 2.1333333333291666e+01 1042 1043 -1.5999999999979167e+01 1042 378 -1.5039633158038590e-27 1042 379 -2.1333333333291666e+01 1042 377 2.1333333333343749e+01 1042 471 1.0416666666666666e-10 1042 1046 -2.1333333333291666e+01 1042 1041 -1.5999999999979167e+01 1042 470 1.0666666666677083e+01 1042 1591 -5.3333333333124999e+00 1043 1043 6.4000000000416662e+01 1043 164 -5.3333333333124999e+00 1043 1045 -1.5999999999979167e+01 1043 311 5.3333333333124999e+00 1043 297 -5.3333333333958333e+00 1043 1067 -1.5999999999979167e+01 1043 312 -5.3333333333333330e+00 1043 368 5.3333333333124999e+00 1043 471 -5.3333333333124999e+00 1043 1042 -1.5999999999979167e+01 1043 379 5.3333333333124999e+00 1043 377 -5.3333333333958333e+00 1043 1051 -1.5999999999979167e+01 1043 384 -5.3333333333333330e+00 1043 746 -1.5999999999979167e+01 1043 745 1.5999999999979167e+01 1043 163 -5.3333333333124999e+00 1043 173 5.3333333333958333e+00 1043 172 5.3333333333333330e+00 1043 1049 -1.5999999999979167e+01 1043 1044 -1.5999999999979167e+01 1043 473 5.3333333333958333e+00 1043 470 5.3333333333333330e+00 1043 1677 5.3333333333124999e+00 1043 1594 -5.3333333333124999e+00 1044 1044 6.4000000000291664e+01 1044 312 -1.3233141685082473e-27 1044 297 2.1333333333343749e+01 1044 1041 -1.5999999999979167e+01 1044 1049 2.1333333333291666e+01 1044 1043 -1.5999999999979167e+01 1044 473 -5.3333333333124999e+00 1044 470 1.0666666666677083e+01 1044 1591 -5.3333333333124999e+00 1044 1676 1.3020149240672800e-27 1044 1677 -2.1333333333291666e+01 1044 2267 -2.1333333333291666e+01 1044 1594 1.0416666666666666e-10 1045 1045 6.4000000000291664e+01 1045 173 -5.3333333333124999e+00 1045 312 1.1000665323307010e-27 1045 1067 2.1333333333291666e+01 1045 1043 -1.5999999999979167e+01 1045 309 -1.5039633158038590e-27 1045 311 -2.1333333333291666e+01 1045 297 2.1333333333343749e+01 1045 164 1.0416666666666666e-10 1045 642 -2.1333333333291666e+01 1045 636 1.5999999999979167e+01 1045 161 -5.3333333333124999e+00 1045 172 1.0666666666677083e+01 1046 1046 6.4000000000291664e+01 1046 1052 2.1333333333291666e+01 1046 380 -5.3333333333124999e+00 1046 379 1.0416666666666666e-10 1046 377 -5.3333333333124999e+00 1046 378 1.0666666666677083e+01 1046 470 -1.1000665323307010e-27 1046 1042 -2.1333333333291666e+01 1046 1041 1.5999999999979167e+01 1046 471 -2.1333333333291666e+01 1046 1590 1.3233141685082473e-27 1046 2264 1.5999999999979167e+01 1046 1591 2.1333333333343749e+01 1047 1047 6.4000000000291664e+01 1047 473 5.3333333333124999e+00 1047 312 -1.3233141685082473e-27 1047 1049 -2.1333333333291666e+01 1047 1065 1.5999999999979167e+01 1047 307 1.1000665323307010e-27 1047 306 -2.1333333333343749e+01 1047 1048 -2.1333333333291666e+01 1047 1064 1.5999999999979167e+01 1047 472 -1.0666666666677083e+01 1047 1677 2.1333333333291666e+01 1047 1594 -1.0416666666666666e-10 1047 1595 5.3333333333124999e+00 1048 1048 6.4000000000291664e+01 1048 306 5.3333333333124999e+00 1048 307 -1.0666666666677083e+01 1048 472 1.5039633158038590e-27 1048 1047 -2.1333333333291666e+01 1048 1064 -1.5999999999979167e+01 1048 1593 -1.1000665323307010e-27 1048 2279 2.1333333333291666e+01 1048 1673 5.3333333333124999e+00 1048 2280 -1.5999999999979167e+01 1048 1677 -1.0416666666666666e-10 1048 1594 2.1333333333291666e+01 1048 1595 -2.1333333333343749e+01 1049 1049 6.4000000000291664e+01 1049 472 -1.5039633158038590e-27 1049 1047 -2.1333333333291666e+01 1049 306 5.3333333333124999e+00 1049 1065 -1.5999999999979167e+01 1049 297 5.3333333333124999e+00 1049 312 -1.0666666666677083e+01 1049 470 1.1213657767716683e-27 1049 1044 2.1333333333291666e+01 1049 1043 -1.5999999999979167e+01 1049 473 -2.1333333333343749e+01 1049 1677 -1.0416666666666666e-10 1049 1594 2.1333333333291666e+01 1050 1050 6.4000000000291664e+01 1050 390 -1.1213657767716683e-27 1050 1032 2.1333333333291666e+01 1050 1033 -1.5999999999979167e+01 1050 384 1.1000665323307010e-27 1050 379 2.1333333333291666e+01 1050 386 -2.1333333333343749e+01 1050 471 -1.0416666666666666e-10 1050 1051 -2.1333333333291666e+01 1050 1068 -1.5999999999979167e+01 1050 473 5.3333333333124999e+00 1050 475 -1.0666666666677083e+01 1050 1589 5.3333333333124999e+00 1051 1051 6.4000000000291664e+01 1051 386 5.3333333333124999e+00 1051 470 -1.1000665323307010e-27 1051 379 -1.0416666666666666e-10 1051 1042 2.1333333333291666e+01 1051 377 5.3333333333124999e+00 1051 1043 -1.5999999999979167e+01 1051 384 -1.0666666666677083e+01 1051 475 1.3020149240672800e-27 1051 1050 -2.1333333333291666e+01 1051 1068 1.5999999999979167e+01 1051 471 2.1333333333291666e+01 1051 473 -2.1333333333343749e+01 1052 1052 6.4000000000291664e+01 1052 390 1.1213657767716683e-27 1052 378 -1.5039633158038590e-27 1052 379 2.1333333333291666e+01 1052 380 -2.1333333333343749e+01 1052 1046 2.1333333333291666e+01 1052 471 -1.0416666666666666e-10 1052 1032 2.1333333333291666e+01 1052 1591 5.3333333333124999e+00 1052 2264 1.5999999999979167e+01 1052 2263 1.5999999999979167e+01 1052 1589 5.3333333333124999e+00 1052 1590 -1.0666666666677083e+01 1053 1053 6.4000000000291664e+01 1053 387 1.5039633158038590e-27 1053 1058 2.1333333333291666e+01 1053 381 -1.1213657767716683e-27 1053 382 -2.1333333333291666e+01 1053 380 2.1333333333343749e+01 1053 492 1.0416666666666666e-10 1053 1055 -2.1333333333291666e+01 1053 2265 -1.5999999999979167e+01 1053 1916 -1.5999999999979167e+01 1053 1421 -5.3333333333124999e+00 1053 1424 1.0666666666677083e+01 1054 1054 6.4000000000291664e+01 1054 390 1.1000665323307010e-27 1054 1034 -2.1333333333291666e+01 1054 387 -1.3020149240672800e-27 1054 389 -2.1333333333291666e+01 1054 380 2.1333333333343749e+01 1054 439 1.0416666666666666e-10 1054 1074 -2.1333333333291666e+01 1054 1390 -5.3333333333124999e+00 1054 2263 -1.5999999999979167e+01 1054 2265 -1.5999999999979167e+01 1054 1392 1.0666666666677083e+01 1055 1055 6.4000000000291664e+01 1055 1027 -2.1333333333291666e+01 1055 373 -5.3333333333124999e+00 1055 382 1.0416666666666666e-10 1055 380 -5.3333333333124999e+00 1055 381 1.0666666666677083e+01 1055 1053 -2.1333333333291666e+01 1055 492 -2.1333333333291666e+01 1055 1429 1.3020149240672800e-27 1055 1915 1.5999999999979167e+01 1055 1424 -1.3233141685082473e-27 1055 1916 1.5999999999979167e+01 1055 1421 2.1333333333343749e+01 1056 1056 6.4000000000291664e+01 1056 1057 -2.1333333333291666e+01 1056 388 5.3333333333124999e+00 1056 382 -1.0416666666666666e-10 1056 373 5.3333333333124999e+00 1056 383 -1.0666666666677083e+01 1056 1027 2.1333333333291666e+01 1056 492 2.1333333333291666e+01 1056 1429 1.3020149240672800e-27 1056 2196 -1.5999999999979167e+01 1057 1057 6.4000000000291664e+01 1057 383 -1.1000665323307010e-27 1057 1056 -2.1333333333291666e+01 1057 387 1.5039633158038590e-27 1057 382 2.1333333333291666e+01 1057 388 -2.1333333333343749e+01 1057 492 -1.0416666666666666e-10 1057 1058 -2.1333333333291666e+01 1058 1058 6.4000000000291664e+01 1058 1053 2.1333333333291666e+01 1058 380 5.3333333333124999e+00 1058 382 -1.0416666666666666e-10 1058 388 5.3333333333124999e+00 1058 387 -1.0666666666677083e+01 1058 1057 -2.1333333333291666e+01 1058 492 2.1333333333291666e+01 1058 1424 -1.3233141685082473e-27 1058 2265 -1.5999999999979167e+01 1059 1059 3.2000000000208331e+01 1060 1060 6.4000000000291664e+01 1060 307 -1.1213657767716683e-27 1060 1061 -2.1333333333291666e+01 1060 1064 1.5999999999979167e+01 1060 301 1.1000665323307010e-27 1060 303 2.1333333333291666e+01 1060 306 -2.1333333333343749e+01 1060 430 -1.0416666666666666e-10 1060 1022 2.1333333333291666e+01 1060 1020 -1.5999999999979167e+01 1060 432 -1.0666666666677083e+01 1060 1460 5.3333333333124999e+00 1060 2834 5.3333333333124999e+00 1061 1061 6.4000000000291664e+01 1061 1062 -2.1333333333291666e+01 1061 432 -1.3020149240672800e-27 1061 430 2.1333333333291666e+01 1061 303 -1.0416666666666666e-10 1061 1060 -2.1333333333291666e+01 1061 306 5.3333333333124999e+00 1061 1064 -1.5999999999979167e+01 1061 307 -1.0666666666677083e+01 1061 1673 5.3333333333124999e+00 1061 1459 1.3233141685082473e-27 1061 2280 -1.5999999999979167e+01 1061 1460 -2.1333333333343749e+01 1062 1062 6.4000000000291664e+01 1062 308 -1.5039633158038590e-27 1062 1016 2.1333333333291666e+01 1062 307 1.1213657767716683e-27 1062 303 2.1333333333291666e+01 1062 430 -1.0416666666666666e-10 1062 1061 -2.1333333333291666e+01 1062 1454 5.3333333333124999e+00 1062 1940 1.5999999999979167e+01 1062 1673 -2.1333333333343749e+01 1062 2280 1.5999999999979167e+01 1062 1460 5.3333333333124999e+00 1062 1459 -1.0666666666677083e+01 1063 1063 6.4000000000291664e+01 1063 313 1.1000665323307010e-27 1063 301 -1.3233141685082473e-27 1063 304 2.1333333333291666e+01 1063 306 -2.1333333333343749e+01 1063 1021 2.1333333333291666e+01 1063 1020 -1.5999999999979167e+01 1063 319 -1.0416666666666666e-10 1063 716 2.1333333333291666e+01 1063 715 -1.5999999999979167e+01 1063 315 5.3333333333124999e+00 1063 317 -1.0666666666677083e+01 1063 2668 5.3333333333124999e+00 1064 1064 6.4000000000416662e+01 1064 430 -5.3333333333124999e+00 1064 1060 1.5999999999979167e+01 1064 303 5.3333333333124999e+00 1064 306 -5.3333333333958333e+00 1064 1061 -1.5999999999979167e+01 1064 307 -5.3333333333333330e+00 1064 331 5.3333333333124999e+00 1064 469 -5.3333333333124999e+00 1064 928 1.5999999999979167e+01 1064 341 5.3333333333124999e+00 1064 345 -5.3333333333958333e+00 1064 931 -1.5999999999979167e+01 1064 344 -5.3333333333333330e+00 1064 787 -1.5999999999979167e+01 1064 786 1.5999999999979167e+01 1064 428 -5.3333333333124999e+00 1064 432 5.3333333333333330e+00 1064 1048 -1.5999999999979167e+01 1064 1047 1.5999999999979167e+01 1064 472 5.3333333333333330e+00 1064 1677 5.3333333333124999e+00 1064 1460 5.3333333333958333e+00 1064 1594 -5.3333333333124999e+00 1064 1595 5.3333333333958333e+00 1065 1065 6.4000000000416662e+01 1065 341 5.3333333333124999e+00 1065 165 -5.3333333333124999e+00 1065 723 1.5999999999979167e+01 1065 325 5.3333333333124999e+00 1065 345 -5.3333333333958333e+00 1065 724 -1.5999999999979167e+01 1065 347 -5.3333333333333330e+00 1065 311 5.3333333333124999e+00 1065 1047 1.5999999999979167e+01 1065 306 -5.3333333333958333e+00 1065 1049 -1.5999999999979167e+01 1065 312 -5.3333333333333330e+00 1065 1067 -1.5999999999979167e+01 1065 1066 -1.5999999999979167e+01 1065 164 -5.3333333333124999e+00 1065 173 5.3333333333958333e+00 1065 174 5.3333333333333330e+00 1065 929 -1.5999999999979167e+01 1065 928 1.5999999999979167e+01 1065 469 -5.3333333333124999e+00 1065 473 5.3333333333958333e+00 1065 472 5.3333333333333330e+00 1065 1594 -5.3333333333124999e+00 1065 1677 5.3333333333124999e+00 1066 1066 6.4000000000291664e+01 1066 158 -5.3333333333124999e+00 1066 313 1.1213657767716683e-27 1066 718 -2.1333333333291666e+01 1066 715 1.5999999999979167e+01 1066 312 -1.1000665323307010e-27 1066 311 -2.1333333333291666e+01 1066 306 2.1333333333343749e+01 1066 164 1.0416666666666666e-10 1066 1067 2.1333333333291666e+01 1066 1065 -1.5999999999979167e+01 1066 173 -5.3333333333124999e+00 1066 174 1.0666666666677083e+01 1067 1067 6.4000000000291664e+01 1067 306 5.3333333333124999e+00 1067 174 1.3020149240672800e-27 1067 1066 2.1333333333291666e+01 1067 1065 -1.5999999999979167e+01 1067 172 -1.1000665323307010e-27 1067 164 2.1333333333291666e+01 1067 173 -2.1333333333343749e+01 1067 311 -1.0416666666666666e-10 1067 1045 2.1333333333291666e+01 1067 297 5.3333333333124999e+00 1067 1043 -1.5999999999979167e+01 1067 312 -1.0666666666677083e+01 1068 1068 6.4000000000416662e+01 1068 379 -5.3333333333124999e+00 1068 163 5.3333333333124999e+00 1068 747 -1.5999999999979167e+01 1068 368 -5.3333333333124999e+00 1068 386 5.3333333333958333e+00 1068 746 1.5999999999979167e+01 1068 384 5.3333333333333330e+00 1068 424 -5.3333333333124999e+00 1068 474 5.3333333333124999e+00 1068 925 -1.5999999999979167e+01 1068 415 -5.3333333333124999e+00 1068 426 5.3333333333958333e+00 1068 923 1.5999999999979167e+01 1068 425 5.3333333333333330e+00 1068 1069 -1.5999999999979167e+01 1068 1070 -1.5999999999979167e+01 1068 166 5.3333333333124999e+00 1068 173 -5.3333333333958333e+00 1068 176 -5.3333333333333330e+00 1068 1051 1.5999999999979167e+01 1068 1050 -1.5999999999979167e+01 1068 471 5.3333333333124999e+00 1068 473 -5.3333333333958333e+00 1068 475 -5.3333333333333330e+00 1069 1069 6.4000000000291664e+01 1069 426 -5.3333333333124999e+00 1069 176 -1.3020149240672800e-27 1069 1070 2.1333333333291666e+01 1069 1068 -1.5999999999979167e+01 1069 175 1.1000665323307010e-27 1069 166 -2.1333333333291666e+01 1069 173 2.1333333333343749e+01 1069 424 1.0416666666666666e-10 1069 920 -2.1333333333291666e+01 1069 414 -5.3333333333124999e+00 1069 918 1.5999999999979167e+01 1069 425 1.0666666666677083e+01 1070 1070 6.4000000000291664e+01 1070 152 5.3333333333124999e+00 1070 427 -1.1213657767716683e-27 1070 740 2.1333333333291666e+01 1070 737 -1.5999999999979167e+01 1070 425 1.1000665323307010e-27 1070 424 2.1333333333291666e+01 1070 426 -2.1333333333343749e+01 1070 166 -1.0416666666666666e-10 1070 1069 2.1333333333291666e+01 1070 1068 -1.5999999999979167e+01 1070 173 5.3333333333124999e+00 1070 176 -1.0666666666677083e+01 1071 1071 6.4000000000291664e+01 1071 391 1.3233141685082473e-27 1071 801 -2.1333333333291666e+01 1071 799 1.5999999999979167e+01 1071 390 -1.1000665323307010e-27 1071 389 -2.1333333333291666e+01 1071 386 2.1333333333343749e+01 1071 439 1.0416666666666666e-10 1071 1034 -2.1333333333291666e+01 1071 1033 1.5999999999979167e+01 1071 440 1.0666666666677083e+01 1071 1390 -5.3333333333124999e+00 1072 1072 6.4000000000291664e+01 1072 391 -1.3233141685082473e-27 1072 387 1.3020149240672800e-27 1072 389 -2.1333333333291666e+01 1072 388 2.1333333333343749e+01 1072 1074 -2.1333333333291666e+01 1072 439 1.0416666666666666e-10 1072 801 -2.1333333333291666e+01 1073 1073 3.2000000000208331e+01 1074 1074 6.4000000000291664e+01 1074 380 -5.3333333333124999e+00 1074 1054 -2.1333333333291666e+01 1074 439 -2.1333333333291666e+01 1074 389 1.0416666666666666e-10 1074 1072 -2.1333333333291666e+01 1074 388 -5.3333333333124999e+00 1074 387 1.0666666666677083e+01 1074 1392 -1.1000665323307010e-27 1074 2265 1.5999999999979167e+01 1075 1075 4.2666666666916662e+01 1075 228 1.0666666666687499e+01 1075 816 1.0666666666666666e+01 1075 4319 -5.3333333333229165e+00 1075 1786 -2.1333333333312499e+01 1075 5004 -1.0666666666666666e+01 1075 1618 -5.3333333333229165e+00 1075 1612 6.2499999999999991e-11 1075 1614 -5.3333333333229165e+00 1075 1223 6.2499999999999991e-11 1075 2096 -2.1333333333312499e+01 1075 1228 -5.3333333333229165e+00 1075 4318 1.0666666666687499e+01 hypre-2.33.0/src/test/TEST_ams/mfem.A.00001000066400000000000000000016341101477326011500176140ustar00rootroot000000000000001076 2332 1076 2332 1076 1076 1.6000000000062499e+01 1077 1077 3.7362500000104163e+01 1078 1078 6.4000000000499995e+01 1078 1714 5.3333333333124999e+00 1078 1718 -1.0416666666666666e-10 1078 1719 2.1333333333291666e+01 1078 2155 -5.3333333333124999e+00 1078 1081 -1.0666666666677083e+01 1078 1716 -1.0416666666666666e-10 1078 1717 2.1333333333291666e+01 1078 1694 1.0416666666666666e-10 1078 1712 -2.1333333333291666e+01 1079 1079 1.6000000000062499e+01 1080 1080 1.6000000000104166e+01 1081 1081 4.8025000000062498e+01 1081 1712 1.0097419586828951e-27 1081 2144 -5.3322916666666664e+00 1081 2139 -1.0662499999999998e+01 1081 2143 5.3302083333333332e+00 1081 1085 -1.0664583333333335e+01 1081 1714 -2.4001041666666666e+01 1081 1713 1.0662500000000000e+01 1081 2153 1.0679166666666665e+01 1081 1083 -5.3343749999999996e+00 1081 1719 1.0097419586828951e-27 1081 1718 -1.0666666666677083e+01 1081 2155 1.3332291666666665e+01 1081 1078 -1.0666666666677083e+01 1082 1082 2.6683333333437496e+01 1083 1083 2.1349999999999998e+01 1083 2139 -5.3322916666666664e+00 1083 2143 2.0833333333333346e-03 1083 2141 -5.3322916666666664e+00 1083 1085 -1.0672916666666666e+01 1083 2150 5.3343749999999996e+00 1083 2153 5.3343749999999996e+00 1083 1714 5.3322916666666664e+00 1083 1713 -1.0672916666666666e+01 1083 1081 -5.3343749999999996e+00 1084 1084 4.2704166666666659e+01 1085 1085 5.3383333333333326e+01 1085 1790 -1.0662500000000000e+01 1085 1791 -1.0662500000000000e+01 1085 1789 1.0683333333333334e+01 1085 1087 -1.0672916666666666e+01 1085 2145 1.5995833333333334e+01 1085 2155 -5.3312499999999998e+00 1085 2144 1.0668750000000001e+01 1085 2153 -1.0662500000000000e+01 1085 1081 -1.0664583333333335e+01 1085 2139 1.5995833333333334e+01 1085 2150 -1.0662500000000000e+01 1085 2141 3.1995833333333334e+01 1085 2143 -1.0683333333333334e+01 1085 1083 -1.0672916666666666e+01 1086 1086 3.2024999999999999e+01 1087 1087 2.1349999999999998e+01 1087 1795 1.0672916666666666e+01 1087 1790 5.3343749999999996e+00 1087 2141 -5.3322916666666664e+00 1087 1789 -2.0833333333333346e-03 1087 1791 5.3343749999999996e+00 1087 2145 -5.3322916666666664e+00 1087 1085 -1.0672916666666666e+01 1088 1088 2.1362499999999997e+01 1089 1089 1.6000000000062499e+01 1090 1090 3.2000000000208331e+01 1091 1091 6.4000000000499995e+01 1091 2302 -5.3333333333124999e+00 1091 1707 -1.0416666666666666e-10 1091 2050 5.3333333333124999e+00 1091 1098 -1.0666666666677083e+01 1091 1706 2.1333333333291666e+01 1091 1097 -1.0666666666614583e+01 1091 2044 -5.3333333333124999e+00 1091 1705 -1.0416666666666666e-10 1091 1703 -5.3333333333124999e+00 1091 1096 -1.0666666666677083e+01 1091 1702 -2.1333333333291666e+01 1091 1696 1.0416666666666666e-10 1091 1704 2.1333333333291666e+01 1092 1092 1.6000000000062499e+01 1093 1093 3.2000000000208331e+01 1094 1094 6.4000000000499995e+01 1094 2261 -5.3333333333124999e+00 1094 2262 1.0416666666666666e-10 1094 2053 -5.3333333333124999e+00 1094 1099 -1.0666666666677083e+01 1094 2052 -2.1333333333291666e+01 1094 1097 -1.0666666666614583e+01 1094 2050 5.3333333333124999e+00 1094 2303 1.0416666666666666e-10 1094 2302 -5.3333333333124999e+00 1094 1098 -1.0666666666677083e+01 1094 2313 -2.1333333333291666e+01 1094 2311 1.0416666666666666e-10 1094 2314 2.1333333333291666e+01 1095 1095 3.2000000000208331e+01 1096 1096 3.2000000000124999e+01 1096 1703 5.3333333333333330e+00 1096 2044 5.3333333333333330e+00 1096 1097 -5.3333333333333330e+00 1096 1706 -1.4136387421560532e-27 1096 1702 -1.4136387421560532e-27 1096 1705 -1.0666666666677083e+01 1096 1091 -1.0666666666677083e+01 1096 910 -1.0097419586828951e-27 1096 912 1.0097419586828951e-27 1096 913 -1.0666666666677083e+01 1096 396 -1.0666666666677083e+01 1097 1097 6.4000000000416662e+01 1097 2053 5.3333333333958333e+00 1097 1099 -5.3333333333333330e+00 1097 2044 5.3333333333958333e+00 1097 1096 -5.3333333333333330e+00 1097 2262 -5.3333333333124999e+00 1097 2052 2.1333333333343749e+01 1097 1094 -1.0666666666614583e+01 1097 2303 -5.3333333333124999e+00 1097 1707 5.3333333333124999e+00 1097 2050 -5.3333333333958333e+00 1097 1098 -5.3333333333333330e+00 1097 1706 -2.1333333333343749e+01 1097 1091 -1.0666666666614583e+01 1097 1705 5.3333333333124999e+00 1097 771 5.3333333333124999e+00 1097 913 5.3333333333124999e+00 1097 912 -2.1333333333343749e+01 1097 396 -1.0666666666614583e+01 1097 911 5.3333333333124999e+00 1097 770 -2.1333333333343749e+01 1097 769 5.3333333333124999e+00 1097 916 5.3333333333958333e+00 1097 394 -1.0666666666614583e+01 1097 397 -5.3333333333333330e+00 1098 1098 3.2000000000124999e+01 1098 2052 1.2116903504194741e-27 1098 2313 -1.2116903504194741e-27 1098 2303 1.0666666666677083e+01 1098 1094 -1.0666666666677083e+01 1098 1704 -1.0097419586828951e-27 1098 2302 5.3333333333333330e+00 1098 1706 1.0097419586828951e-27 1098 1707 -1.0666666666677083e+01 1098 2050 -5.3333333333333330e+00 1098 1091 -1.0666666666677083e+01 1098 1097 -5.3333333333333330e+00 1099 1099 3.2000000000124999e+01 1099 1097 -5.3333333333333330e+00 1099 2053 5.3333333333333330e+00 1099 2261 5.3333333333333330e+00 1099 2314 -1.0097419586828951e-27 1099 2052 -1.0097419586828951e-27 1099 2262 1.0666666666677083e+01 1099 1094 -1.0666666666677083e+01 1099 770 -1.4136387421560532e-27 1099 767 -1.4136387421560532e-27 1099 771 -1.0666666666677083e+01 1099 394 -1.0666666666677083e+01 1100 1100 3.2000000000124999e+01 1100 1101 -5.3333333333333330e+00 1100 2046 5.3333333333333330e+00 1100 1703 5.3333333333333330e+00 1100 1701 1.0097419586828951e-27 1100 1709 1.0097419586828951e-27 1100 1708 -1.0666666666677083e+01 1100 1102 -1.0666666666677083e+01 1100 783 1.4136387421560532e-27 1100 790 1.4136387421560532e-27 1100 789 -1.0666666666677083e+01 1100 433 -1.0666666666677083e+01 1101 1101 5.3354166666875003e+01 1101 2046 5.3333333333958333e+00 1101 1100 -5.3333333333333330e+00 1101 2159 -2.6614583333020834e+00 1101 1112 -8.0000000000000000e+00 1101 1711 5.3333333333124999e+00 1101 2153 2.1705219273391446e-19 1101 2152 -1.0656249999999998e+01 1101 1107 -1.0666666666666666e+01 1101 2156 -2.6614583333020834e+00 1101 1106 -8.0000000000000000e+00 1101 1709 -2.1333333333343749e+01 1101 1708 5.3333333333124999e+00 1101 1102 -1.0666666666614583e+01 1101 789 5.3333333333124999e+00 1101 783 2.1333333333343749e+01 1101 782 -5.3333333333124999e+00 1101 433 -1.0666666666614583e+01 1101 3388 -5.0116116045879435e-20 1102 1102 6.4000000000499995e+01 1102 2156 -5.3333333333124999e+00 1102 1711 -1.0416666666666666e-10 1102 1714 5.3333333333124999e+00 1102 1106 -1.0666666666677083e+01 1102 1703 -5.3333333333124999e+00 1102 1710 2.1333333333291666e+01 1102 1698 1.0416666666666666e-10 1102 1701 -2.1333333333291666e+01 1102 1708 -1.0416666666666666e-10 1102 1709 2.1333333333291666e+01 1102 2046 -5.3333333333124999e+00 1102 1101 -1.0666666666614583e+01 1102 1100 -1.0666666666677083e+01 1103 1103 1.6000000000062499e+01 1104 1104 3.2000000000208331e+01 1105 1105 3.7362500000104163e+01 1106 1106 3.7343750000062499e+01 1106 1709 -1.2116903504194741e-27 1106 1710 1.2116903504194741e-27 1106 1711 -1.0666666666677083e+01 1106 1102 -1.0666666666677083e+01 1106 1713 2.1684043449710089e-19 1106 1714 -1.3334375000000000e+01 1106 2152 2.1684043449710089e-19 1106 1107 -5.3322916666666664e+00 1106 2153 -5.3322916666666664e+00 1106 1101 -8.0000000000000000e+00 1106 2156 8.0000000000000000e+00 1107 1107 4.2716666666666669e+01 1107 2159 -2.1684043449710089e-19 1107 2165 -5.3281250000000000e+00 1107 1112 -5.3322916666666664e+00 1107 2154 1.0672916666666666e+01 1107 2151 1.0666666666666666e+01 1107 2150 -6.2499999999999986e-03 1107 1713 -1.0672916666666666e+01 1107 1714 5.3281250000000000e+00 1107 2156 3.2249014814734037e-20 1107 2153 -6.2499999999999986e-03 1107 1106 -5.3322916666666664e+00 1107 2152 1.0666666666666666e+01 1107 1101 -1.0666666666666666e+01 1107 3388 -6.2499999999999986e-03 1107 3391 -6.2499999999999986e-03 1108 1108 2.1343750000000000e+01 1109 1109 2.1354166666666668e+01 1110 1110 2.1343750000000000e+01 1111 1111 3.7362500000104163e+01 1112 1112 3.7343750000062499e+01 1112 2165 1.3334375000000000e+01 1112 2159 8.0000000000000000e+00 1112 1101 -8.0000000000000000e+00 1112 2152 -2.1684043449710089e-19 1112 2154 1.6263032587282567e-19 1112 1107 -5.3322916666666664e+00 1112 791 -1.0097419586828951e-27 1112 783 -1.0097419586828951e-27 1112 782 1.0666666666677083e+01 1112 433 -1.0666666666677083e+01 1112 3388 -5.3322916666666664e+00 1113 1113 3.2000000000124999e+01 1113 1705 1.2116903504194741e-27 1113 1708 -1.0097419586828951e-27 1113 1119 -5.3333333333333330e+00 1113 1703 -5.3333333333333330e+00 1113 1698 -1.0097419586828951e-27 1113 1701 1.0666666666677083e+01 1113 1116 -1.0666666666677083e+01 1113 1696 1.2116903504194741e-27 1113 1115 -1.0666666666677083e+01 1113 1114 -5.3333333333333330e+00 1113 1702 1.0666666666677083e+01 1114 1114 6.4000000000416662e+01 1114 1704 5.3333333333124999e+00 1114 2299 5.3333333333124999e+00 1114 1133 -5.3333333333333330e+00 1114 1700 2.1333333333343749e+01 1114 2300 5.3333333333124999e+00 1114 1125 -1.0666666666614583e+01 1114 1717 5.3333333333124999e+00 1114 1126 -5.3333333333333330e+00 1114 1694 2.1333333333343749e+01 1114 1712 -5.3333333333124999e+00 1114 1118 -1.0666666666614583e+01 1114 1710 5.3333333333124999e+00 1114 1117 -5.3333333333333330e+00 1114 1698 2.1333333333343749e+01 1114 1701 -5.3333333333124999e+00 1114 1116 -1.0666666666614583e+01 1114 1696 2.1333333333343749e+01 1114 1115 -1.0666666666614583e+01 1114 1702 -5.3333333333124999e+00 1114 1113 -5.3333333333333330e+00 1115 1115 6.4000000000499995e+01 1115 1704 -1.0416666666666666e-10 1115 2302 5.3333333333124999e+00 1115 1133 -1.0666666666677083e+01 1115 1707 2.1333333333291666e+01 1115 2050 -5.3333333333124999e+00 1115 1127 -1.0666666666614583e+01 1115 1706 -1.0416666666666666e-10 1115 2044 5.3333333333124999e+00 1115 1120 -1.0666666666677083e+01 1115 1705 2.1333333333291666e+01 1115 1703 5.3333333333124999e+00 1115 1119 -1.0666666666614583e+01 1115 1702 1.0416666666666666e-10 1115 1696 -2.1333333333291666e+01 1115 1114 -1.0666666666614583e+01 1115 1113 -1.0666666666677083e+01 1116 1116 6.4000000000499995e+01 1116 2156 5.3333333333124999e+00 1116 1711 2.1333333333291666e+01 1116 1714 -5.3333333333124999e+00 1116 1135 -1.0666666666614583e+01 1116 1709 -1.0416666666666666e-10 1116 2046 5.3333333333124999e+00 1116 1138 -1.0666666666677083e+01 1116 1708 2.1333333333291666e+01 1116 1119 -1.0666666666614583e+01 1116 1703 5.3333333333124999e+00 1116 1710 -1.0416666666666666e-10 1116 1117 -1.0666666666677083e+01 1116 1701 1.0416666666666666e-10 1116 1698 -2.1333333333291666e+01 1116 1114 -1.0666666666614583e+01 1116 1113 -1.0666666666677083e+01 1117 1117 3.2000000000124999e+01 1117 1711 1.4136387421560532e-27 1117 1718 -1.0097419586828951e-27 1117 1135 -5.3333333333333330e+00 1117 1714 5.3333333333333330e+00 1117 1694 -1.0097419586828951e-27 1117 1712 1.0666666666677083e+01 1117 1118 -1.0666666666677083e+01 1117 1698 1.4136387421560532e-27 1117 1116 -1.0666666666677083e+01 1117 1114 -5.3333333333333330e+00 1117 1710 -1.0666666666677083e+01 1118 1118 6.4000000000499995e+01 1118 1714 -5.3333333333124999e+00 1118 1718 2.1333333333291666e+01 1118 2155 5.3333333333124999e+00 1118 1135 -1.0666666666614583e+01 1118 1719 -1.0416666666666666e-10 1118 1132 -1.0666666666677083e+01 1118 1717 -1.0416666666666666e-10 1118 1716 2.1333333333291666e+01 1118 1123 -1.0666666666614583e+01 1118 1126 -1.0666666666677083e+01 1118 1712 1.0416666666666666e-10 1118 1694 -2.1333333333291666e+01 1118 1114 -1.0666666666614583e+01 1118 1117 -1.0666666666677083e+01 1119 1119 6.4000000000416662e+01 1119 1709 5.3333333333124999e+00 1119 2160 -5.3333333333124999e+00 1119 2046 -5.3333333333958333e+00 1119 1138 -5.3333333333333330e+00 1119 2048 2.1333333333343749e+01 1119 2286 -5.3333333333124999e+00 1119 1136 -1.0666666666614583e+01 1119 2057 5.3333333333124999e+00 1119 2047 -5.3333333333958333e+00 1119 1137 -5.3333333333333330e+00 1119 2045 2.1333333333343749e+01 1119 2049 -5.3333333333124999e+00 1119 1121 -1.0666666666614583e+01 1119 1706 5.3333333333124999e+00 1119 2044 -5.3333333333958333e+00 1119 1120 -5.3333333333333330e+00 1119 1705 -2.1333333333343749e+01 1119 1702 -5.3333333333124999e+00 1119 1115 -1.0666666666614583e+01 1119 1708 -2.1333333333343749e+01 1119 1116 -1.0666666666614583e+01 1119 1701 -5.3333333333124999e+00 1119 1703 -5.3333333333958333e+00 1119 1113 -5.3333333333333330e+00 1120 1120 3.2000000000124999e+01 1120 1707 1.4136387421560532e-27 1120 2054 -1.2116903504194741e-27 1120 1127 -5.3333333333333330e+00 1120 2050 5.3333333333333330e+00 1120 2045 -1.2116903504194741e-27 1120 2049 1.0666666666677083e+01 1120 1121 -1.0666666666677083e+01 1120 1705 -1.4136387421560532e-27 1120 1115 -1.0666666666677083e+01 1120 1119 -5.3333333333333330e+00 1120 1706 -1.0666666666677083e+01 1120 2044 -5.3333333333333330e+00 1121 1121 6.4000000000499995e+01 1121 2047 5.3333333333124999e+00 1121 2057 -1.0416666666666666e-10 1121 2285 -5.3333333333124999e+00 1121 1137 -1.0666666666677083e+01 1121 2050 -5.3333333333124999e+00 1121 2056 2.1333333333291666e+01 1121 1129 -1.0666666666614583e+01 1121 2223 -5.3333333333124999e+00 1121 2055 -1.0416666666666666e-10 1121 2054 2.1333333333291666e+01 1121 2222 -5.3333333333124999e+00 1121 1127 -1.0666666666614583e+01 1121 1128 -1.0666666666677083e+01 1121 2049 1.0416666666666666e-10 1121 2045 -2.1333333333291666e+01 1121 2044 5.3333333333124999e+00 1121 1119 -1.0666666666614583e+01 1121 1120 -1.0666666666677083e+01 1122 1122 3.2000000000124999e+01 1122 2296 1.4136387421560532e-27 1122 2298 -1.2116903504194741e-27 1122 1127 -5.3333333333333330e+00 1122 2292 5.3333333333333330e+00 1122 2290 -1.2116903504194741e-27 1122 2294 1.0666666666677083e+01 1122 1125 -1.0666666666677083e+01 1122 2288 1.4136387421560532e-27 1122 1124 -1.0666666666677083e+01 1122 1123 -5.3333333333333330e+00 1122 2295 1.0666666666677083e+01 1123 1123 6.4000000000416662e+01 1123 1966 -5.3333333333124999e+00 1123 1964 -5.3333333333124999e+00 1123 1130 -5.3333333333333330e+00 1123 2291 2.1333333333343749e+01 1123 2168 -5.3333333333124999e+00 1123 1131 -1.0666666666614583e+01 1123 1719 5.3333333333124999e+00 1123 1132 -5.3333333333333330e+00 1123 1716 -2.1333333333343749e+01 1123 1717 5.3333333333124999e+00 1123 1118 -1.0666666666614583e+01 1123 2300 5.3333333333124999e+00 1123 1126 -5.3333333333333330e+00 1123 2290 2.1333333333343749e+01 1123 2294 -5.3333333333124999e+00 1123 1125 -1.0666666666614583e+01 1123 2288 2.1333333333343749e+01 1123 1124 -1.0666666666614583e+01 1123 2295 -5.3333333333124999e+00 1123 1122 -5.3333333333333330e+00 1124 1124 6.4000000000499995e+01 1124 1966 1.0416666666666666e-10 1124 1963 -5.3333333333124999e+00 1124 1130 -1.0666666666677083e+01 1124 2297 2.1333333333291666e+01 1124 2223 -5.3333333333124999e+00 1124 1129 -1.0666666666614583e+01 1124 2225 1.0416666666666666e-10 1124 2222 -5.3333333333124999e+00 1124 1128 -1.0666666666677083e+01 1124 2296 2.1333333333291666e+01 1124 2292 -5.3333333333124999e+00 1124 1127 -1.0666666666614583e+01 1124 2295 1.0416666666666666e-10 1124 2288 -2.1333333333291666e+01 1124 1123 -1.0666666666614583e+01 1124 1122 -1.0666666666677083e+01 1125 1125 6.4000000000499995e+01 1125 1700 -2.1333333333291666e+01 1125 1114 -1.0666666666614583e+01 1125 2299 -1.0416666666666666e-10 1125 2302 5.3333333333124999e+00 1125 1133 -1.0666666666677083e+01 1125 2298 2.1333333333291666e+01 1125 1127 -1.0666666666614583e+01 1125 2292 -5.3333333333124999e+00 1125 2300 -1.0416666666666666e-10 1125 1126 -1.0666666666677083e+01 1125 2294 1.0416666666666666e-10 1125 2290 -2.1333333333291666e+01 1125 1123 -1.0666666666614583e+01 1125 1122 -1.0666666666677083e+01 1126 1126 3.2000000000124999e+01 1126 1700 -1.0097419586828951e-27 1126 1694 1.2116903504194741e-27 1126 1114 -5.3333333333333330e+00 1126 1716 1.2116903504194741e-27 1126 1717 -1.0666666666677083e+01 1126 1118 -1.0666666666677083e+01 1126 2290 1.0097419586828951e-27 1126 1125 -1.0666666666677083e+01 1126 1123 -5.3333333333333330e+00 1126 2300 -1.0666666666677083e+01 1127 1127 6.4000000000416662e+01 1127 2299 5.3333333333124999e+00 1127 1704 5.3333333333124999e+00 1127 2302 -5.3333333333958333e+00 1127 1133 -5.3333333333333330e+00 1127 1707 -2.1333333333343749e+01 1127 1706 5.3333333333124999e+00 1127 1115 -1.0666666666614583e+01 1127 2049 -5.3333333333124999e+00 1127 2050 5.3333333333958333e+00 1127 1120 -5.3333333333333330e+00 1127 2054 -2.1333333333343749e+01 1127 2055 5.3333333333124999e+00 1127 1121 -1.0666666666614583e+01 1127 2225 -5.3333333333124999e+00 1127 2222 5.3333333333958333e+00 1127 1128 -5.3333333333333330e+00 1127 2296 -2.1333333333343749e+01 1127 2295 -5.3333333333124999e+00 1127 1124 -1.0666666666614583e+01 1127 2298 -2.1333333333343749e+01 1127 1125 -1.0666666666614583e+01 1127 2294 -5.3333333333124999e+00 1127 2292 5.3333333333958333e+00 1127 1122 -5.3333333333333330e+00 1128 1128 3.2000000000124999e+01 1128 2297 1.0097419586828951e-27 1128 2056 -1.4136387421560532e-27 1128 1129 -5.3333333333333330e+00 1128 2223 5.3333333333333330e+00 1128 2054 1.4136387421560532e-27 1128 2055 -1.0666666666677083e+01 1128 1121 -1.0666666666677083e+01 1128 2296 -1.0097419586828951e-27 1128 1124 -1.0666666666677083e+01 1128 1127 -5.3333333333333330e+00 1128 2225 1.0666666666677083e+01 1128 2222 5.3333333333333330e+00 1129 1129 6.4000000000416662e+01 1129 2057 5.3333333333124999e+00 1129 2286 -5.3333333333124999e+00 1129 2285 5.3333333333958333e+00 1129 1137 -5.3333333333333330e+00 1129 2309 2.1333333333343749e+01 1129 2149 -5.3333333333124999e+00 1129 1136 -1.0666666666614583e+01 1129 2148 -5.3333333333124999e+00 1129 2147 5.3333333333958333e+00 1129 1134 -5.3333333333333330e+00 1129 2308 2.1333333333343749e+01 1129 1964 -5.3333333333124999e+00 1129 1131 -1.0666666666614583e+01 1129 1966 -5.3333333333124999e+00 1129 1963 5.3333333333958333e+00 1129 1130 -5.3333333333333330e+00 1129 2297 -2.1333333333343749e+01 1129 2225 -5.3333333333124999e+00 1129 1124 -1.0666666666614583e+01 1129 2056 -2.1333333333343749e+01 1129 1121 -1.0666666666614583e+01 1129 2055 5.3333333333124999e+00 1129 2223 5.3333333333958333e+00 1129 1128 -5.3333333333333330e+00 1130 1130 3.2000000000124999e+01 1130 2288 -1.2116903504194741e-27 1130 2291 1.0097419586828951e-27 1130 1123 -5.3333333333333330e+00 1130 2308 -1.0097419586828951e-27 1130 1964 1.0666666666677083e+01 1130 1131 -1.0666666666677083e+01 1130 2297 -1.2116903504194741e-27 1130 1124 -1.0666666666677083e+01 1130 1129 -5.3333333333333330e+00 1130 1966 1.0666666666677083e+01 1130 1963 5.3333333333333330e+00 1131 1131 6.4000000000499995e+01 1131 2147 -5.3333333333124999e+00 1131 2155 5.3333333333124999e+00 1131 2148 1.0416666666666666e-10 1131 2158 -2.1333333333291666e+01 1131 2146 -5.3333333333124999e+00 1131 1135 -1.0666666666614583e+01 1131 1134 -1.0666666666677083e+01 1131 2168 1.0416666666666666e-10 1131 2291 -2.1333333333291666e+01 1131 1123 -1.0666666666614583e+01 1131 1132 -1.0666666666677083e+01 1131 1964 1.0416666666666666e-10 1131 2308 -2.1333333333291666e+01 1131 1963 -5.3333333333124999e+00 1131 1129 -1.0666666666614583e+01 1131 1130 -1.0666666666677083e+01 1132 1132 3.2000000000124999e+01 1132 1718 1.4136387421560532e-27 1132 2158 1.2116903504194741e-27 1132 1135 -5.3333333333333330e+00 1132 2155 -5.3333333333333330e+00 1132 2291 -1.2116903504194741e-27 1132 2168 1.0666666666677083e+01 1132 1131 -1.0666666666677083e+01 1132 1716 -1.4136387421560532e-27 1132 1118 -1.0666666666677083e+01 1132 1123 -5.3333333333333330e+00 1132 1719 -1.0666666666677083e+01 1133 1133 3.2000000000124999e+01 1133 1696 -1.0097419586828951e-27 1133 1700 1.4136387421560532e-27 1133 1114 -5.3333333333333330e+00 1133 2298 1.4136387421560532e-27 1133 2299 -1.0666666666677083e+01 1133 1125 -1.0666666666677083e+01 1133 1707 -1.0097419586828951e-27 1133 1115 -1.0666666666677083e+01 1133 1127 -5.3333333333333330e+00 1133 1704 -1.0666666666677083e+01 1133 2302 -5.3333333333333330e+00 1134 1134 3.2000000000124999e+01 1134 2309 -1.0097419586828951e-27 1134 2308 1.4136387421560532e-27 1134 1129 -5.3333333333333330e+00 1134 2147 5.3333333333333330e+00 1134 2158 -1.4136387421560532e-27 1134 2148 1.0666666666677083e+01 1134 1131 -1.0666666666677083e+01 1134 2157 1.0097419586828951e-27 1134 1136 -1.0666666666677083e+01 1134 1135 -5.3333333333333330e+00 1134 2149 1.0666666666677083e+01 1134 2146 5.3333333333333330e+00 1135 1135 6.4000000000416662e+01 1135 2160 -5.3333333333124999e+00 1135 1709 5.3333333333124999e+00 1135 2156 -5.3333333333958333e+00 1135 1138 -5.3333333333333330e+00 1135 1711 -2.1333333333343749e+01 1135 1710 5.3333333333124999e+00 1135 1116 -1.0666666666614583e+01 1135 1712 -5.3333333333124999e+00 1135 1714 5.3333333333958333e+00 1135 1117 -5.3333333333333330e+00 1135 1718 -2.1333333333343749e+01 1135 1719 5.3333333333124999e+00 1135 1118 -1.0666666666614583e+01 1135 2168 -5.3333333333124999e+00 1135 2155 -5.3333333333958333e+00 1135 1132 -5.3333333333333330e+00 1135 2158 2.1333333333343749e+01 1135 2148 -5.3333333333124999e+00 1135 1131 -1.0666666666614583e+01 1135 2157 2.1333333333343749e+01 1135 1136 -1.0666666666614583e+01 1135 2149 -5.3333333333124999e+00 1135 2146 5.3333333333958333e+00 1135 1134 -5.3333333333333330e+00 1136 1136 6.4000000000499995e+01 1136 2156 5.3333333333124999e+00 1136 2160 1.0416666666666666e-10 1136 2046 5.3333333333124999e+00 1136 1138 -1.0666666666677083e+01 1136 2048 -2.1333333333291666e+01 1136 2047 5.3333333333124999e+00 1136 1119 -1.0666666666614583e+01 1136 2286 1.0416666666666666e-10 1136 2285 -5.3333333333124999e+00 1136 1137 -1.0666666666677083e+01 1136 2309 -2.1333333333291666e+01 1136 2147 -5.3333333333124999e+00 1136 1129 -1.0666666666614583e+01 1136 2149 1.0416666666666666e-10 1136 2157 -2.1333333333291666e+01 1136 1135 -1.0666666666614583e+01 1136 2146 -5.3333333333124999e+00 1136 1134 -1.0666666666677083e+01 1137 1137 3.2000000000124999e+01 1137 2048 -1.2116903504194741e-27 1137 2045 1.0097419586828951e-27 1137 1119 -5.3333333333333330e+00 1137 2047 -5.3333333333333330e+00 1137 2056 1.0097419586828951e-27 1137 2057 -1.0666666666677083e+01 1137 1121 -1.0666666666677083e+01 1137 2309 1.2116903504194741e-27 1137 1136 -1.0666666666677083e+01 1137 1129 -5.3333333333333330e+00 1137 2286 1.0666666666677083e+01 1137 2285 5.3333333333333330e+00 1138 1138 3.2000000000124999e+01 1138 2157 -1.4136387421560532e-27 1138 1711 -1.2116903504194741e-27 1138 1135 -5.3333333333333330e+00 1138 2156 -5.3333333333333330e+00 1138 1708 1.2116903504194741e-27 1138 1709 -1.0666666666677083e+01 1138 1116 -1.0666666666677083e+01 1138 2048 1.4136387421560532e-27 1138 1136 -1.0666666666677083e+01 1138 1119 -5.3333333333333330e+00 1138 2160 1.0666666666677083e+01 1138 2046 -5.3333333333333330e+00 1139 1139 3.2000000000249997e+01 1139 1143 4.1666666666666665e-11 1139 1726 -4.1666666666666665e-11 1139 1144 -1.0666666666687499e+01 1139 1723 1.0666666666687499e+01 1139 1755 5.3333333333124999e+00 1139 2196 -5.3333333333124999e+00 1139 1727 1.0666666666687499e+01 1139 1722 -4.1666666666666665e-11 1139 2098 -5.3333333333124999e+00 1139 1142 -1.0666666666687499e+01 1139 1720 -4.1666666666666665e-11 1139 1721 1.0666666666687499e+01 1139 650 5.3333333333124999e+00 1140 1140 2.1333333333458331e+01 1141 1141 2.1333333333666662e+01 1142 1142 4.2666666666916662e+01 1142 2100 -5.3333333333229165e+00 1142 1721 -5.3333333333229165e+00 1142 2099 -6.2500000000000004e-11 1142 1755 -2.1333333333312499e+01 1142 1754 5.3333333333229165e+00 1142 1146 -1.0666666666687499e+01 1142 1722 6.2499999999999991e-11 1142 2098 2.1333333333312499e+01 1142 1723 -5.3333333333229165e+00 1142 1143 -1.0666666666666666e+01 1142 1139 -1.0666666666687499e+01 1143 1143 5.3343750000437495e+01 1143 1723 6.2499999999999991e-11 1143 1726 -1.0416666666666666e-11 1143 1139 4.1666666666666665e-11 1143 1144 -8.0000000000000000e+00 1143 2100 6.2499999999999991e-11 1143 1146 4.1666666666666665e-11 1143 2099 1.0416666666666666e-11 1143 1722 -1.0416666666666666e-11 1143 2098 -1.0666666666583334e+01 1143 1142 -1.0666666666666666e+01 1143 623 -5.3333333333124999e+00 1143 551 -5.3312499999999998e+00 1143 651 2.1333333333343749e+01 1143 756 5.3333333333124999e+00 1143 650 2.6666666665937497e+00 1143 105 -1.0666666666614583e+01 1143 552 1.0416666666666666e-11 1143 553 -2.6635416666250005e+00 1143 100 -8.0000000000000000e+00 1143 578 -2.1334374999999998e+01 1143 577 5.3312499999999998e+00 1143 621 5.3364583333645825e+00 1143 102 -1.0661458333333334e+01 1143 103 -5.3333333333333330e+00 1144 1144 3.7333333333520827e+01 1144 2196 1.3333333333322916e+01 1144 1726 6.2499999999999991e-11 1144 1723 -5.3333333333229165e+00 1144 1139 -1.0666666666687499e+01 1144 1143 -8.0000000000000000e+00 1144 1727 -5.3333333333229165e+00 1144 758 -1.4136387421560532e-27 1144 651 -1.4136387421560532e-27 1144 756 -1.0666666666677083e+01 1144 650 -1.3333333333322916e+01 1144 105 -1.0666666666677083e+01 1145 1145 2.6666666666937498e+01 1146 1146 4.2666666667041660e+01 1146 2318 1.5999999999958334e+01 1146 1143 4.1666666666666665e-11 1146 2100 1.0666666666687499e+01 1146 2098 -5.3333333333124999e+00 1146 2099 4.1666666666666665e-11 1146 1755 5.3333333333124999e+00 1146 1754 -1.0666666666687499e+01 1146 1142 -1.0666666666687499e+01 1146 825 -1.0666666666625000e+01 1146 554 1.0666666666625000e+01 1146 813 -1.0666666666833333e+01 1146 108 -1.0666666666729165e+01 1146 552 -1.5999999999958334e+01 1146 553 -5.3333333333124999e+00 1146 100 -1.0666666666645833e+01 1147 1147 3.2000000000249997e+01 1148 1148 3.2000000000249997e+01 1148 1156 4.1666666666666665e-11 1148 1732 -4.1666666666666665e-11 1148 1814 -5.3333333333124999e+00 1148 1160 -1.0666666666687499e+01 1148 1735 1.0666666666687499e+01 1148 1750 5.3333333333124999e+00 1148 1728 -4.1666666666666665e-11 1148 1815 5.3333333333124999e+00 1148 1171 -1.0666666666687499e+01 1148 1741 -5.3333333333124999e+00 1148 1153 4.1666666666666665e-11 1148 1778 5.3333333333124999e+00 1148 1733 1.0666666666687499e+01 1148 1724 -4.1666666666666665e-11 1148 1150 4.1666666666666665e-11 1148 1740 -5.3333333333124999e+00 1148 1730 1.0666666666687499e+01 1148 1149 -1.0666666666687499e+01 1149 1149 4.2666666666916662e+01 1149 1747 5.3333333333229165e+00 1149 1733 -5.3333333333229165e+00 1149 1738 -6.2499999999999991e-11 1149 1741 2.1333333333312499e+01 1149 1776 5.3333333333229165e+00 1149 1153 -1.0666666666666666e+01 1149 1159 -1.0666666666687499e+01 1149 1724 6.2499999999999991e-11 1149 1740 2.1333333333312499e+01 1149 1730 -5.3333333333229165e+00 1149 1150 -1.0666666666666666e+01 1149 1148 -1.0666666666687499e+01 1150 1150 4.2666666667333331e+01 1150 1838 1.0416666666666666e-11 1150 1728 -1.0416666666666666e-11 1150 1749 -6.2499999999999991e-11 1150 2175 -1.0416666666666666e-11 1150 1167 4.1666666666666665e-11 1150 1750 1.0666666666583334e+01 1150 1171 -1.0666666666666666e+01 1150 1738 1.0416666666666666e-11 1150 1822 -1.0416666666666666e-11 1150 1747 -6.2499999999999991e-11 1150 2083 -1.0416666666666666e-11 1150 1159 4.1666666666666665e-11 1150 1748 1.0666666666583334e+01 1150 1161 -1.0666666666666666e+01 1150 1745 -6.2499999999999991e-11 1150 1830 -1.0416666666666666e-11 1150 1157 4.1666666666666665e-11 1150 1746 1.0666666666583334e+01 1150 1158 -1.0666666666666666e+01 1150 1730 6.2499999999999991e-11 1150 1724 -1.0416666666666666e-11 1150 1148 4.1666666666666665e-11 1150 1740 -1.0666666666583334e+01 1150 1149 -1.0666666666666666e+01 1151 1151 3.2000000000249997e+01 1151 1814 -5.3333333333124999e+00 1151 1761 -4.1666666666666665e-11 1151 1778 5.3333333333124999e+00 1151 1160 -1.0666666666687499e+01 1151 1156 4.1666666666666665e-11 1151 1806 -5.3333333333124999e+00 1151 1767 1.0666666666687499e+01 1151 1759 -4.1666666666666665e-11 1151 1782 5.3333333333124999e+00 1151 1155 -1.0666666666687499e+01 1151 1154 4.1666666666666665e-11 1151 1770 -5.3333333333124999e+00 1151 1765 1.0666666666687499e+01 1151 1757 -4.1666666666666665e-11 1151 1153 4.1666666666666665e-11 1151 1771 -5.3333333333124999e+00 1151 1766 1.0666666666687499e+01 1151 1152 -1.0666666666687499e+01 1152 1152 4.2666666666895829e+01 1152 1779 -2.8860671737211984e-28 1152 1783 2.0194839173657902e-27 1152 1772 5.3333333333229165e+00 1152 1165 -5.3333333333229165e+00 1152 1770 1.5999999999989583e+01 1152 1154 -1.0666666666666666e+01 1152 1765 -5.3333333333229165e+00 1152 1757 6.2499999999999991e-11 1152 1771 2.1333333333333332e+01 1152 1766 -5.3333333333229165e+00 1152 1153 -1.6000000000010417e+01 1152 1151 -1.0666666666687499e+01 1153 1153 5.3333333334124987e+01 1153 1772 -5.3333333332812494e+00 1153 2003 1.0416666666666666e-11 1153 1165 1.4583333333333332e-10 1153 1777 1.0666666666531249e+01 1153 1779 1.0666666666625000e+01 1153 2001 -5.3333333332812494e+00 1153 1166 -1.6000000000010417e+01 1153 1724 -1.0416666666666666e-11 1153 1761 -1.0416666666666666e-11 1153 1733 6.2499999999999991e-11 1153 1732 -1.0416666666666666e-11 1153 1148 4.1666666666666665e-11 1153 1778 1.0666666666583334e+01 1153 1160 -1.0666666666666666e+01 1153 1776 -6.2499999999999991e-11 1153 1738 1.0416666666666666e-11 1153 1159 4.1666666666666665e-11 1153 1741 -1.0666666666583334e+01 1153 1149 -1.0666666666666666e+01 1153 1766 6.2499999999999991e-11 1153 1757 -1.0416666666666666e-11 1153 1151 4.1666666666666665e-11 1153 1771 -1.0666666666531249e+01 1153 1152 -1.6000000000010417e+01 1154 1154 5.3333333334062495e+01 1154 1807 -5.3333333332812494e+00 1154 2019 1.0416666666666666e-11 1154 1169 1.4583333333333335e-10 1154 1781 1.0666666666531249e+01 1154 1784 1.0666666666625000e+01 1154 2017 -5.3333333332812494e+00 1154 1170 -1.6000000000010417e+01 1154 1780 -6.2499999999999991e-11 1154 1162 4.1666666666666665e-11 1154 2109 -1.0416666666666665e-11 1154 1772 -3.6295685768920020e-28 1154 1783 1.0666666666572915e+01 1154 1165 -1.0666666666666666e+01 1154 1759 -1.0416666666666666e-11 1154 1782 1.0666666666531249e+01 1154 1155 -1.6000000000010417e+01 1154 1765 6.2499999999999991e-11 1154 1757 -1.0416666666666666e-11 1154 1151 4.1666666666666665e-11 1154 1770 -1.0666666666572917e+01 1154 1152 -1.0666666666666666e+01 1155 1155 4.2666666666895829e+01 1155 1784 -9.1882743488121268e-30 1155 1812 2.0194839173657902e-27 1155 1807 5.3333333333229165e+00 1155 1169 -5.3333333333229165e+00 1155 1806 1.5999999999989583e+01 1155 1156 -1.0666666666666666e+01 1155 1767 -5.3333333333229165e+00 1155 1759 6.2499999999999991e-11 1155 1782 -2.1333333333333332e+01 1155 1765 -5.3333333333229165e+00 1155 1154 -1.6000000000010417e+01 1155 1151 -1.0666666666687499e+01 1156 1156 4.2666666667270832e+01 1156 1735 6.2499999999999991e-11 1156 1732 -1.0416666666666666e-11 1156 1148 4.1666666666666665e-11 1156 1814 -1.0666666666583334e+01 1156 1160 -1.0666666666666666e+01 1156 2175 -1.0416666666666666e-11 1156 1728 -1.0416666666666666e-11 1156 1815 1.0666666666583334e+01 1156 1171 -1.0666666666666666e+01 1156 1761 -1.0416666666666666e-11 1156 1813 -6.2499999999999991e-11 1156 1167 4.1666666666666665e-11 1156 2174 -1.0416666666666665e-11 1156 1807 -3.6295685768920020e-28 1156 1812 1.0666666666572915e+01 1156 1169 -1.0666666666666666e+01 1156 1767 6.2499999999999991e-11 1156 1759 -1.0416666666666666e-11 1156 1151 4.1666666666666665e-11 1156 1806 -1.0666666666572917e+01 1156 1155 -1.0666666666666666e+01 1157 1157 3.2000000000249997e+01 1157 1840 -5.3333333333124999e+00 1157 1168 4.1666666666666665e-11 1157 2118 -5.3333333333124999e+00 1157 1835 1.0666666666687499e+01 1157 1826 -4.1666666666666665e-11 1157 2117 -5.3333333333124999e+00 1157 1163 -1.0666666666687499e+01 1157 1164 4.1666666666666665e-11 1157 2103 -5.3333333333124999e+00 1157 1833 1.0666666666687499e+01 1157 1822 -4.1666666666666665e-11 1157 1748 5.3333333333124999e+00 1157 1161 -1.0666666666687499e+01 1157 1830 -4.1666666666666665e-11 1157 1150 4.1666666666666665e-11 1157 1746 5.3333333333124999e+00 1157 1745 -1.0666666666687499e+01 1157 1158 -1.0666666666687499e+01 1158 1158 4.2666666666916662e+01 1158 1749 5.3333333333229165e+00 1158 1835 -5.3333333333229165e+00 1158 1838 -6.2499999999999991e-11 1158 1840 2.1333333333312499e+01 1158 2177 -5.3333333333229165e+00 1158 1168 -1.0666666666666666e+01 1158 1167 -1.0666666666687499e+01 1158 1830 6.2499999999999991e-11 1158 1746 -2.1333333333312499e+01 1158 1745 5.3333333333229165e+00 1158 1150 -1.0666666666666666e+01 1158 1157 -1.0666666666687499e+01 1159 1159 3.2000000000249997e+01 1159 1777 5.3333333333124999e+00 1159 2003 4.1666666666666665e-11 1159 2002 -5.3333333333124999e+00 1159 1166 -1.0666666666687499e+01 1159 1164 4.1666666666666665e-11 1159 2103 -5.3333333333124999e+00 1159 2087 1.0666666666687499e+01 1159 1740 -5.3333333333124999e+00 1159 2083 -4.1666666666666665e-11 1159 1150 4.1666666666666665e-11 1159 1748 5.3333333333124999e+00 1159 1747 -1.0666666666687499e+01 1159 1161 -1.0666666666687499e+01 1159 1738 4.1666666666666665e-11 1159 1153 4.1666666666666665e-11 1159 1741 -5.3333333333124999e+00 1159 1776 -1.0666666666687499e+01 1159 1149 -1.0666666666687499e+01 1160 1160 4.2666666666916662e+01 1160 1732 6.2500000000000004e-11 1160 1814 2.1333333333312499e+01 1160 1156 -1.0666666666666666e+01 1160 1735 -5.3333333333229165e+00 1160 1148 -1.0666666666687499e+01 1160 1767 -5.3333333333229165e+00 1160 1761 6.2500000000000004e-11 1160 1766 -5.3333333333229165e+00 1160 1151 -1.0666666666687499e+01 1160 1778 -2.1333333333312499e+01 1160 1733 -5.3333333333229165e+00 1160 1153 -1.0666666666666666e+01 1161 1161 4.2666666666916662e+01 1161 2087 -5.3333333333229165e+00 1161 2103 2.1333333333312499e+01 1161 1833 -5.3333333333229165e+00 1161 1164 -1.0666666666666666e+01 1161 1822 6.2500000000000004e-11 1161 1745 5.3333333333229165e+00 1161 1157 -1.0666666666687499e+01 1161 2083 6.2499999999999991e-11 1161 1748 -2.1333333333312499e+01 1161 1747 5.3333333333229165e+00 1161 1150 -1.0666666666666666e+01 1161 1159 -1.0666666666687499e+01 1162 1162 3.2000000000249997e+01 1162 1781 5.3333333333124999e+00 1162 2019 4.1666666666666665e-11 1162 2018 -5.3333333333124999e+00 1162 1170 -1.0666666666687499e+01 1162 1168 4.1666666666666665e-11 1162 2118 -5.3333333333124999e+00 1162 2114 1.0666666666687499e+01 1162 1154 4.1666666666666665e-11 1162 1780 -1.0666666666687499e+01 1162 1783 5.3333333333124999e+00 1162 2109 -4.1666666666666665e-11 1162 2121 5.3333333333124999e+00 1162 1165 -1.0666666666687499e+01 1162 2110 -4.1666666666666665e-11 1162 1164 4.1666666666666665e-11 1162 2117 -5.3333333333124999e+00 1162 2112 1.0666666666687499e+01 1162 1163 -1.0666666666687499e+01 1163 1163 4.2666666666916662e+01 1163 2114 -5.3333333333229165e+00 1163 2118 2.1333333333312499e+01 1163 1835 -5.3333333333229165e+00 1163 1168 -1.0666666666666666e+01 1163 1826 6.2500000000000004e-11 1163 1833 -5.3333333333229165e+00 1163 1157 -1.0666666666687499e+01 1163 2110 6.2500000000000004e-11 1163 2117 2.1333333333312499e+01 1163 2112 -5.3333333333229165e+00 1163 1164 -1.0666666666666666e+01 1163 1162 -1.0666666666687499e+01 1164 1164 4.2666666667270825e+01 1164 2003 1.0416666666666666e-11 1164 2001 2.2851328271989659e-27 1164 2002 -1.0666666666572915e+01 1164 1166 -1.0666666666666666e+01 1164 2109 -1.0416666666666666e-11 1164 2121 1.0666666666572917e+01 1164 1165 -1.0666666666666666e+01 1164 1826 -1.0416666666666666e-11 1164 2087 6.2499999999999991e-11 1164 2083 -1.0416666666666666e-11 1164 1159 4.1666666666666665e-11 1164 1833 6.2499999999999991e-11 1164 1822 -1.0416666666666666e-11 1164 1157 4.1666666666666665e-11 1164 2103 -1.0666666666583334e+01 1164 1161 -1.0666666666666666e+01 1164 2112 6.2499999999999991e-11 1164 2110 -1.0416666666666666e-11 1164 1162 4.1666666666666665e-11 1164 2117 -1.0666666666583334e+01 1164 1163 -1.0666666666666666e+01 1165 1165 4.2666666667041660e+01 1165 1780 5.3333333333229165e+00 1165 1771 -5.3333333332812494e+00 1165 1770 -2.0194839173657902e-27 1165 1772 6.2500000000000004e-11 1165 1152 -5.3333333333229165e+00 1165 1783 -1.5999999999989583e+01 1165 1154 -1.0666666666666666e+01 1165 2002 2.0194839173657902e-27 1165 2001 6.2500000000000004e-11 1165 1153 1.4583333333333335e-10 1165 1777 5.3333333332812494e+00 1165 1779 -1.0666666666729165e+01 1165 1166 -5.3333333333229165e+00 1165 2109 6.2500000000000004e-11 1165 2112 -5.3333333333229165e+00 1165 2121 -1.5999999999989583e+01 1165 1164 -1.0666666666666666e+01 1165 1162 -1.0666666666687499e+01 1166 1166 4.2666666666895829e+01 1166 1776 5.3333333333229165e+00 1166 2003 -6.2500000000000004e-11 1166 2087 -5.3333333333229165e+00 1166 1159 -1.0666666666687499e+01 1166 2121 -4.5860624244724788e-28 1166 2002 1.5999999999989583e+01 1166 1164 -1.0666666666666666e+01 1166 1779 2.4233807008389483e-27 1166 1777 -2.1333333333333332e+01 1166 2001 5.3333333333229165e+00 1166 1153 -1.6000000000010417e+01 1166 1165 -5.3333333333229165e+00 1167 1167 3.2000000000249997e+01 1167 1746 5.3333333333124999e+00 1167 1150 4.1666666666666665e-11 1167 1750 5.3333333333124999e+00 1167 1749 -1.0666666666687499e+01 1167 2175 -4.1666666666666665e-11 1167 1815 5.3333333333124999e+00 1167 1171 -1.0666666666687499e+01 1167 1156 4.1666666666666665e-11 1167 1813 -1.0666666666687499e+01 1167 1812 5.3333333333124999e+00 1167 2174 -4.1666666666666665e-11 1167 2182 5.3333333333124999e+00 1167 1169 -1.0666666666687499e+01 1167 1838 4.1666666666666665e-11 1167 1168 4.1666666666666665e-11 1167 1840 -5.3333333333124999e+00 1167 2177 1.0666666666687499e+01 1167 1158 -1.0666666666687499e+01 1168 1168 4.2666666667270825e+01 1168 2019 1.0416666666666666e-11 1168 2017 1.8812360437258079e-27 1168 2018 -1.0666666666572915e+01 1168 1170 -1.0666666666666666e+01 1168 2174 -1.0416666666666666e-11 1168 2182 1.0666666666572917e+01 1168 1169 -1.0666666666666666e+01 1168 1830 -1.0416666666666666e-11 1168 2114 6.2499999999999991e-11 1168 2110 -1.0416666666666666e-11 1168 1162 4.1666666666666665e-11 1168 1835 6.2499999999999991e-11 1168 1826 -1.0416666666666666e-11 1168 1157 4.1666666666666665e-11 1168 2118 -1.0666666666583334e+01 1168 1163 -1.0666666666666666e+01 1168 2177 6.2499999999999991e-11 1168 1838 1.0416666666666666e-11 1168 1167 4.1666666666666665e-11 1168 1840 -1.0666666666583334e+01 1168 1158 -1.0666666666666666e+01 1169 1169 4.2666666667041660e+01 1169 1813 5.3333333333229165e+00 1169 1782 5.3333333332812494e+00 1169 1806 -2.0194839173657902e-27 1169 1807 6.2500000000000004e-11 1169 1155 -5.3333333333229165e+00 1169 1812 -1.5999999999989583e+01 1169 1156 -1.0666666666666666e+01 1169 2018 2.0194839173657902e-27 1169 2017 6.2500000000000004e-11 1169 1154 1.4583333333333335e-10 1169 1781 5.3333333332812494e+00 1169 1784 -1.0666666666729165e+01 1169 1170 -5.3333333333229165e+00 1169 2174 6.2500000000000004e-11 1169 2177 -5.3333333333229165e+00 1169 2182 -1.5999999999989583e+01 1169 1168 -1.0666666666666666e+01 1169 1167 -1.0666666666687499e+01 1170 1170 4.2666666666895829e+01 1170 1780 5.3333333333229165e+00 1170 2019 -6.2499999999999991e-11 1170 2114 -5.3333333333229165e+00 1170 1162 -1.0666666666687499e+01 1170 2182 -4.5860624244724788e-28 1170 2018 1.5999999999989583e+01 1170 1168 -1.0666666666666666e+01 1170 1784 2.0194839173657902e-27 1170 1781 -2.1333333333333332e+01 1170 2017 5.3333333333229165e+00 1170 1154 -1.6000000000010417e+01 1170 1169 -5.3333333333229165e+00 1171 1171 4.2666666666916662e+01 1171 1730 -5.3333333333229165e+00 1171 1750 -2.1333333333312499e+01 1171 1749 5.3333333333229165e+00 1171 1150 -1.0666666666666666e+01 1171 2175 6.2499999999999991e-11 1171 1813 5.3333333333229165e+00 1171 1167 -1.0666666666687499e+01 1171 1728 6.2500000000000004e-11 1171 1815 -2.1333333333312499e+01 1171 1735 -5.3333333333229165e+00 1171 1156 -1.0666666666666666e+01 1171 1148 -1.0666666666687499e+01 1172 1172 3.2000000000249997e+01 1172 2195 -5.3333333333124999e+00 1172 1728 -4.1666666666666665e-11 1172 1750 5.3333333333124999e+00 1172 1186 -1.0666666666687499e+01 1172 1729 1.0666666666687499e+01 1172 1720 -4.1666666666666665e-11 1172 1175 4.1666666666666665e-11 1172 1740 -5.3333333333124999e+00 1172 1730 1.0666666666687499e+01 1172 1724 -4.1666666666666665e-11 1172 1739 -5.3333333333124999e+00 1172 1731 1.0666666666687499e+01 1172 1173 -1.0666666666687499e+01 1173 1173 4.2666666666916662e+01 1173 1742 5.3333333333229165e+00 1173 1738 -6.2499999999999991e-11 1173 1747 5.3333333333229165e+00 1173 1181 -1.0666666666687499e+01 1173 1740 2.1333333333312499e+01 1173 1175 -1.0666666666666666e+01 1173 1730 -5.3333333333229165e+00 1173 1724 6.2499999999999991e-11 1173 1739 2.1333333333312499e+01 1173 1731 -5.3333333333229165e+00 1173 1172 -1.0666666666687499e+01 1174 1174 2.1333333333666662e+01 1175 1175 4.2666666667333331e+01 1175 1838 1.0416666666666666e-11 1175 1728 -1.0416666666666666e-11 1175 1749 -6.2499999999999991e-11 1175 2175 -1.0416666666666666e-11 1175 1185 4.1666666666666665e-11 1175 1750 1.0666666666583334e+01 1175 1186 -1.0666666666666666e+01 1175 1738 1.0416666666666666e-11 1175 1822 -1.0416666666666666e-11 1175 1747 -6.2499999999999991e-11 1175 2083 -1.0416666666666666e-11 1175 1181 4.1666666666666665e-11 1175 1748 1.0666666666583334e+01 1175 1182 -1.0666666666666666e+01 1175 1745 -6.2499999999999991e-11 1175 1830 -1.0416666666666666e-11 1175 1177 4.1666666666666665e-11 1175 1746 1.0666666666583334e+01 1175 1178 -1.0666666666666666e+01 1175 1730 6.2499999999999991e-11 1175 1724 -1.0416666666666666e-11 1175 1172 4.1666666666666665e-11 1175 1740 -1.0666666666583334e+01 1175 1173 -1.0666666666666666e+01 1176 1176 2.1333333333458331e+01 1177 1177 3.2000000000249997e+01 1177 2101 -5.3333333333124999e+00 1177 1822 -4.1666666666666665e-11 1177 1748 5.3333333333124999e+00 1177 1182 -1.0666666666687499e+01 1177 1823 1.0666666666687499e+01 1177 1820 -4.1666666666666665e-11 1177 1175 4.1666666666666665e-11 1177 1746 5.3333333333124999e+00 1177 1745 -1.0666666666687499e+01 1177 1830 -4.1666666666666665e-11 1177 1839 -5.3333333333124999e+00 1177 1832 1.0666666666687499e+01 1177 1178 -1.0666666666687499e+01 1178 1178 4.2666666666916662e+01 1178 1841 5.3333333333229165e+00 1178 1838 -6.2499999999999991e-11 1178 1749 5.3333333333229165e+00 1178 1185 -1.0666666666687499e+01 1178 1746 -2.1333333333312499e+01 1178 1175 -1.0666666666666666e+01 1178 1745 5.3333333333229165e+00 1178 1830 6.2499999999999991e-11 1178 1839 2.1333333333312499e+01 1178 1832 -5.3333333333229165e+00 1178 1177 -1.0666666666687499e+01 1179 1179 2.1333333333666662e+01 1180 1180 2.1333333333458331e+01 1181 1181 3.2000000000249997e+01 1181 1739 -5.3333333333124999e+00 1181 1738 4.1666666666666665e-11 1181 1740 -5.3333333333124999e+00 1181 1173 -1.0666666666687499e+01 1181 1742 -1.0666666666687499e+01 1181 2081 -4.1666666666666665e-11 1181 1175 4.1666666666666665e-11 1181 1748 5.3333333333124999e+00 1181 1747 -1.0666666666687499e+01 1181 2083 -4.1666666666666665e-11 1181 2101 -5.3333333333124999e+00 1181 2086 1.0666666666687499e+01 1181 1182 -1.0666666666687499e+01 1182 1182 4.2666666666916662e+01 1182 1823 -5.3333333333229165e+00 1182 1822 6.2499999999999991e-11 1182 1745 5.3333333333229165e+00 1182 1177 -1.0666666666687499e+01 1182 1748 -2.1333333333312499e+01 1182 1175 -1.0666666666666666e+01 1182 1747 5.3333333333229165e+00 1182 2083 6.2500000000000004e-11 1182 2101 2.1333333333312499e+01 1182 2086 -5.3333333333229165e+00 1182 1181 -1.0666666666687499e+01 1183 1183 2.1333333333666662e+01 1184 1184 2.1333333333458331e+01 1185 1185 3.2000000000249997e+01 1185 1839 -5.3333333333124999e+00 1185 1838 4.1666666666666665e-11 1185 1746 5.3333333333124999e+00 1185 1178 -1.0666666666687499e+01 1185 1841 -1.0666666666687499e+01 1185 2176 -4.1666666666666665e-11 1185 1175 4.1666666666666665e-11 1185 1750 5.3333333333124999e+00 1185 1749 -1.0666666666687499e+01 1185 2175 -4.1666666666666665e-11 1185 2195 -5.3333333333124999e+00 1185 2179 1.0666666666687499e+01 1185 1186 -1.0666666666687499e+01 1186 1186 4.2666666666916662e+01 1186 1729 -5.3333333333229165e+00 1186 1728 6.2499999999999991e-11 1186 1730 -5.3333333333229165e+00 1186 1172 -1.0666666666687499e+01 1186 1750 -2.1333333333312499e+01 1186 1175 -1.0666666666666666e+01 1186 1749 5.3333333333229165e+00 1186 2175 6.2500000000000004e-11 1186 2195 2.1333333333312499e+01 1186 2179 -5.3333333333229165e+00 1186 1185 -1.0666666666687499e+01 1187 1187 2.1333333333666662e+01 1188 1188 2.1333333333458331e+01 1189 1189 3.2000000000249997e+01 1189 2089 5.3333333333124999e+00 1189 1722 -4.1666666666666665e-11 1189 1755 5.3333333333124999e+00 1189 1202 -1.0666666666687499e+01 1189 1721 1.0666666666687499e+01 1189 1720 -4.1666666666666665e-11 1189 1739 -5.3333333333124999e+00 1189 1731 1.0666666666687499e+01 1189 1724 -4.1666666666666665e-11 1189 1191 4.1666666666666665e-11 1189 1737 -5.3333333333124999e+00 1189 1725 1.0666666666687499e+01 1189 1190 -1.0666666666687499e+01 1190 1190 4.2666666666916662e+01 1190 2085 -5.3333333333229165e+00 1190 1731 -5.3333333333229165e+00 1190 1738 -6.2499999999999991e-11 1190 1739 2.1333333333312499e+01 1190 1742 5.3333333333229165e+00 1190 1192 -1.0666666666687499e+01 1190 1724 6.2499999999999991e-11 1190 1737 2.1333333333312499e+01 1190 1725 -5.3333333333229165e+00 1190 1191 -1.0666666666666666e+01 1190 1189 -1.0666666666687499e+01 1191 1191 4.2666666667333331e+01 1191 1978 -1.0416666666666666e-11 1191 2099 1.0416666666666666e-11 1191 2090 -6.2499999999999991e-11 1191 2316 -1.0416666666666666e-11 1191 1196 4.1666666666666665e-11 1191 1722 -1.0416666666666666e-11 1191 2089 1.0666666666583334e+01 1191 1202 -1.0666666666666666e+01 1191 1996 1.0416666666666666e-11 1191 1998 -1.0666666666583334e+01 1191 1200 -1.0666666666666666e+01 1191 2085 6.2499999999999991e-11 1191 1738 1.0416666666666666e-11 1191 1192 4.1666666666666665e-11 1191 1980 6.2499999999999991e-11 1191 1979 -1.0416666666666666e-11 1191 1194 4.1666666666666665e-11 1191 2088 1.0666666666583334e+01 1191 1195 -1.0666666666666666e+01 1191 1725 6.2499999999999991e-11 1191 1724 -1.0416666666666666e-11 1191 1189 4.1666666666666665e-11 1191 1737 -1.0666666666583334e+01 1191 1190 -1.0666666666666666e+01 1192 1192 3.2000000000249997e+01 1192 2081 -4.1666666666666665e-11 1192 1997 -5.3333333333124999e+00 1192 2080 1.0666666666687499e+01 1192 1996 4.1666666666666665e-11 1192 1998 -5.3333333333124999e+00 1192 1200 -1.0666666666687499e+01 1192 1191 4.1666666666666665e-11 1192 1737 -5.3333333333124999e+00 1192 2085 1.0666666666687499e+01 1192 1738 4.1666666666666665e-11 1192 1739 -5.3333333333124999e+00 1192 1742 -1.0666666666687499e+01 1192 1190 -1.0666666666687499e+01 1193 1193 2.1333333333666662e+01 1194 1194 3.2000000000249997e+01 1194 2320 -5.3333333333124999e+00 1194 1984 1.0666666666687499e+01 1194 1998 -5.3333333333124999e+00 1194 1978 -4.1666666666666665e-11 1194 1997 -5.3333333333124999e+00 1194 1981 1.0666666666687499e+01 1194 1200 -1.0666666666687499e+01 1194 1979 -4.1666666666666665e-11 1194 1191 4.1666666666666665e-11 1194 2088 5.3333333333124999e+00 1194 1980 1.0666666666687499e+01 1194 1195 -1.0666666666687499e+01 1194 4705 -4.1666666666666665e-11 1195 1195 4.2666666666916662e+01 1195 1984 -5.3333333333229165e+00 1195 2090 5.3333333333229165e+00 1195 2316 6.2499999999999991e-11 1195 2320 2.1333333333312499e+01 1195 2317 -5.3333333333229165e+00 1195 1196 -1.0666666666687499e+01 1195 1979 6.2499999999999991e-11 1195 2088 -2.1333333333312499e+01 1195 1980 -5.3333333333229165e+00 1195 1191 -1.0666666666666666e+01 1195 1194 -1.0666666666687499e+01 1196 1196 3.2000000000249997e+01 1196 2318 -4.1666666666666665e-11 1196 1755 5.3333333333124999e+00 1196 1754 -1.0666666666687499e+01 1196 2099 4.1666666666666665e-11 1196 2089 5.3333333333124999e+00 1196 1202 -1.0666666666687499e+01 1196 1191 4.1666666666666665e-11 1196 2088 5.3333333333124999e+00 1196 2090 -1.0666666666687499e+01 1196 2316 -4.1666666666666665e-11 1196 2320 -5.3333333333124999e+00 1196 2317 1.0666666666687499e+01 1196 1195 -1.0666666666687499e+01 1197 1197 2.1333333333666662e+01 1198 1198 2.1333333333458331e+01 1199 1199 2.1333333333666662e+01 1200 1200 4.2666666666916662e+01 1200 1980 -5.3333333333229165e+00 1200 1978 6.2500000000000004e-11 1200 1981 -5.3333333333229165e+00 1200 1194 -1.0666666666687499e+01 1200 1997 2.1333333333312499e+01 1200 2080 -5.3333333333229165e+00 1200 1996 -6.2499999999999991e-11 1200 1998 2.1333333333312499e+01 1200 2085 -5.3333333333229165e+00 1200 1191 -1.0666666666666666e+01 1200 1192 -1.0666666666687499e+01 1201 1201 2.1333333333666662e+01 1202 1202 4.2666666666916662e+01 1202 1754 5.3333333333229165e+00 1202 2099 -6.2499999999999991e-11 1202 2090 5.3333333333229165e+00 1202 1196 -1.0666666666687499e+01 1202 2089 -2.1333333333312499e+01 1202 1191 -1.0666666666666666e+01 1202 1725 -5.3333333333229165e+00 1202 1722 6.2500000000000004e-11 1202 1755 -2.1333333333312499e+01 1202 1721 -5.3333333333229165e+00 1202 1189 -1.0666666666687499e+01 1203 1203 2.1333333333458331e+01 1204 1204 2.1333333333458331e+01 1205 1205 2.1333333333458331e+01 1206 1206 5.3333333333833323e+01 1206 1787 -5.3333333333124999e+00 1206 1785 1.0666666666625000e+01 1206 1804 -1.0666666666625000e+01 1206 1759 -1.0666666666833333e+01 1206 1209 -1.0666666666729165e+01 1206 1758 1.5999999999958334e+01 1206 1760 3.1999999999958334e+01 1206 1757 -1.0666666666833333e+01 1206 1763 1.5999999999958334e+01 1206 1208 4.1666666666666665e-11 1206 1816 -5.3333333333124999e+00 1206 1764 1.0666666666687499e+01 1206 1207 -1.0666666666645833e+01 1206 5011 -1.0666666666625000e+01 1206 3781 -1.0666666666645833e+01 1206 4460 -1.0666666666625000e+01 1206 3776 -1.0666666666604167e+01 1206 3782 -1.0666666666729165e+01 1207 1207 4.8000000000312497e+01 1207 1208 -8.0000000000000000e+00 1207 1816 1.3333333333322916e+01 1207 1819 2.4000000000010417e+01 1207 1811 -1.0666666666625000e+01 1207 1209 -5.3333333333437496e+00 1207 1804 1.0666666666791667e+01 1207 1759 5.3333333333020834e+00 1207 1763 -1.0666666666625000e+01 1207 1764 -5.3333333333229165e+00 1207 1206 -1.0666666666645833e+01 1207 712 -1.2116903504194741e-27 1207 707 -1.2116903504194741e-27 1207 698 1.0666666666677083e+01 1207 286 -1.0666666666677083e+01 1207 3780 -1.3333333333281249e+01 1208 1208 5.3343750000437495e+01 1208 1816 -2.6666666665937502e+00 1208 1207 -8.0000000000000000e+00 1208 1787 -1.0666666666583334e+01 1208 1758 -1.0416666666666666e-11 1208 1764 6.2499999999999991e-11 1208 1763 -1.0416666666666666e-11 1208 1206 4.1666666666666665e-11 1208 3474 -1.0416666666666666e-11 1208 698 -5.3333333333124999e+00 1208 949 5.3312499999999998e+00 1208 947 -6.2499999999999991e-11 1208 5004 -1.0416666666666666e-11 1208 290 4.1666666666666665e-11 1208 3781 -1.0666666666666666e+01 1208 712 -2.1333333333343749e+01 1208 711 5.3333333333124999e+00 1208 946 -5.3364583333645834e+00 1208 286 -1.0666666666614583e+01 1208 287 -5.3333333333333330e+00 1208 945 2.1334374999999998e+01 1208 3088 -5.3312499999999998e+00 1208 939 -2.6635416666250000e+00 1208 2406 -1.0661458333333334e+01 1208 2414 -8.0000000000000000e+00 1209 1209 2.1333333333499997e+01 1209 1819 -5.3333333333229165e+00 1209 1811 1.0666666666729165e+01 1209 1785 -5.3333333333437496e+00 1209 1760 -5.3333333333229165e+00 1209 1759 2.0833333333333345e-11 1209 1207 -5.3333333333437496e+00 1209 1804 5.3333333333437496e+00 1209 1763 -5.3333333333229165e+00 1209 1206 -1.0666666666729165e+01 1209 3780 2.0833333333333339e-11 1209 4462 -5.3333333333229165e+00 1209 3776 -5.3333333333437496e+00 1210 1210 3.2000000000229164e+01 1210 2093 -5.3333333333124999e+00 1210 1761 -4.1666666666666665e-11 1210 1778 5.3333333333124999e+00 1210 1222 -1.0666666666687499e+01 1210 1223 4.1666666666666665e-11 1210 1786 -5.3333333333124999e+00 1210 1762 1.0666666666687499e+01 1210 1215 4.1666666666666665e-11 1210 1771 -5.3333333333124999e+00 1210 1766 1.0666666666687499e+01 1210 1758 5.3333333332916668e+00 1210 1757 5.3333333332916668e+00 1210 5011 2.8940292364521930e-29 1210 4319 -1.0666666666708332e+01 1210 4320 -1.0666666666708332e+01 1211 1211 5.3333333333833330e+01 1211 1990 -2.0194839173657902e-27 1211 2128 -5.3333333333020834e+00 1211 1996 5.3333333332812494e+00 1211 1779 1.0666666666625000e+01 1211 2001 -1.0666666666791667e+01 1211 1225 -5.3333333333437496e+00 1211 2004 1.0666666666583334e+01 1211 2005 5.3333333333229165e+00 1211 2322 5.3333333332812494e+00 1211 1216 -1.0666666666666666e+01 1211 2003 -1.0416666666666667e-10 1211 1777 -3.2000000000000000e+01 1211 1776 5.3333333333229165e+00 1211 1215 -1.5999999999947917e+01 1211 1214 -1.0666666666708332e+01 1211 1988 2.0194839173657902e-27 1211 1995 -5.3333333333229165e+00 1211 1212 6.2500000000000004e-11 1211 1987 -1.0666666666666666e+01 1211 1213 -1.0666666666666666e+01 1211 4317 6.2500000000000004e-11 1212 1212 4.2666666666979161e+01 1212 1980 -5.3333333333229165e+00 1212 2003 5.3333333332812494e+00 1212 1996 -1.0416666666666667e-10 1212 1998 2.1333333333312499e+01 1212 1220 -1.0666666666666666e+01 1212 2085 -5.3333333333229165e+00 1212 1214 -1.0666666666708332e+01 1212 1978 6.2499999999999991e-11 1212 1983 -5.3333333333229165e+00 1212 1217 -1.0666666666687499e+01 1212 1987 2.0194839173657902e-27 1212 1995 5.3333333333229165e+00 1212 1211 6.2499999999999991e-11 1212 1988 -1.5999999999989583e+01 1212 1213 -1.0666666666666666e+01 1213 1213 4.2666666667208325e+01 1213 2005 -1.8812360437258079e-27 1213 1989 -6.2499999999999991e-11 1213 1990 1.0666666666572917e+01 1213 1978 -1.0416666666666666e-11 1213 1983 6.2499999999999991e-11 1213 1217 4.1666666666666665e-11 1213 1985 -1.0666666666583334e+01 1213 1218 -1.0666666666666666e+01 1213 1995 -3.6295685768920020e-28 1213 1988 1.0666666666572915e+01 1213 1987 1.0666666666562499e+01 1213 1212 -1.0666666666666666e+01 1213 1211 -1.0666666666666666e+01 1213 4985 -1.0416666666666666e-11 1213 4982 -1.0416666666666666e-11 1213 4313 4.1666666666666665e-11 1213 4317 -1.0666666666666666e+01 1213 4699 -1.0416666666666666e-11 1214 1214 3.2000000000229164e+01 1214 1995 -8.8938459461701536e-29 1214 1996 -5.3333333332916668e+00 1214 1998 -5.3333333333124999e+00 1214 1212 -1.0666666666708332e+01 1214 1741 -5.3333333333124999e+00 1214 1738 4.1666666666666665e-11 1214 1220 4.1666666666666665e-11 1214 1737 -5.3333333333124999e+00 1214 2085 1.0666666666687499e+01 1214 1219 -1.0666666666687499e+01 1214 2003 -5.3333333332916668e+00 1214 1215 4.1666666666666665e-11 1214 1777 5.3333333333124999e+00 1214 1776 -1.0666666666687499e+01 1214 1211 -1.0666666666708332e+01 1215 1215 5.3333333334124987e+01 1215 1772 5.3333333333020834e+00 1215 1225 2.0833333333333339e-11 1215 1779 -1.0666666666833333e+01 1215 2001 5.3333333333020834e+00 1215 1724 -1.0416666666666666e-11 1215 1761 -1.0416666666666666e-11 1215 1733 6.2499999999999991e-11 1215 1732 -1.0416666666666666e-11 1215 1221 4.1666666666666665e-11 1215 1778 1.0666666666583334e+01 1215 1222 -1.0666666666666666e+01 1215 1738 1.0416666666666666e-11 1215 1741 -1.0666666666583334e+01 1215 1219 -1.0666666666666666e+01 1215 1766 6.2499999999999991e-11 1215 1757 -1.0416666666666666e-11 1215 1210 4.1666666666666665e-11 1215 1771 -2.1333333333260416e+01 1215 1776 -6.2499999999999991e-11 1215 2003 1.0416666666666666e-11 1215 1214 4.1666666666666665e-11 1215 1777 2.1333333333260416e+01 1215 1211 -1.5999999999947917e+01 1215 4320 -1.5999999999947917e+01 1216 1216 4.2666666666999994e+01 1216 2001 1.0666666666625000e+01 1216 1769 3.1495832401145651e-28 1216 1773 -2.1333333333291666e+01 1216 1772 1.0666666666625000e+01 1216 2128 1.0666666666833333e+01 1216 1225 -1.0666666666729165e+01 1216 2005 -4.3283707583767993e-28 1216 2322 -1.0666666666625000e+01 1216 2004 -2.1333333333291666e+01 1216 1211 -1.0666666666666666e+01 1216 4320 -1.0666666666666666e+01 1216 4317 -1.0666666666729165e+01 1217 1217 3.2000000000249997e+01 1217 2088 5.3333333333124999e+00 1217 1979 -4.1666666666666665e-11 1217 1992 5.3333333333124999e+00 1217 1227 -1.0666666666687499e+01 1217 1220 4.1666666666666665e-11 1217 1998 -5.3333333333124999e+00 1217 1980 1.0666666666687499e+01 1217 1978 -4.1666666666666665e-11 1217 1988 5.3333333333124999e+00 1217 1212 -1.0666666666687499e+01 1217 1986 -5.3333333333124999e+00 1217 1982 1.0666666666687499e+01 1217 1213 4.1666666666666665e-11 1217 1985 -5.3333333333124999e+00 1217 1983 1.0666666666687499e+01 1217 1218 -1.0666666666687499e+01 1217 4316 4.1666666666666665e-11 1217 4699 -4.1666666666666665e-11 1218 1218 4.2666666666916662e+01 1218 1989 5.3333333333229165e+00 1218 1986 2.1333333333312499e+01 1218 1982 -5.3333333333229165e+00 1218 1985 2.1333333333312499e+01 1218 1983 -5.3333333333229165e+00 1218 1213 -1.0666666666666666e+01 1218 1217 -1.0666666666687499e+01 1218 4985 6.2500000000000004e-11 1218 4987 -5.3333333333229165e+00 1218 4313 -1.0666666666687499e+01 1218 4316 -1.0666666666666666e+01 1218 4699 6.2500000000000004e-11 1219 1219 4.2666666666916662e+01 1219 1725 -5.3333333333229165e+00 1219 1724 6.2499999999999991e-11 1219 1733 -5.3333333333229165e+00 1219 1221 -1.0666666666687499e+01 1219 1741 2.1333333333312499e+01 1219 1215 -1.0666666666666666e+01 1219 1776 5.3333333333229165e+00 1219 1738 -6.2499999999999991e-11 1219 1737 2.1333333333312499e+01 1219 2085 -5.3333333333229165e+00 1219 1220 -1.0666666666666666e+01 1219 1214 -1.0666666666687499e+01 1220 1220 4.2666666667333331e+01 1220 1979 -1.0416666666666666e-11 1220 1980 6.2499999999999991e-11 1220 1978 -1.0416666666666666e-11 1220 1217 4.1666666666666665e-11 1220 2099 1.0416666666666666e-11 1220 2090 -6.2499999999999991e-11 1220 2316 -1.0416666666666666e-11 1220 1226 4.1666666666666665e-11 1220 2088 1.0666666666583334e+01 1220 1227 -1.0666666666666666e+01 1220 1724 -1.0416666666666666e-11 1220 1725 6.2499999999999991e-11 1220 1722 -1.0416666666666666e-11 1220 1221 4.1666666666666665e-11 1220 2089 1.0666666666583334e+01 1220 1224 -1.0666666666666666e+01 1220 1996 1.0416666666666666e-11 1220 1998 -1.0666666666583334e+01 1220 1212 -1.0666666666666666e+01 1220 2085 6.2499999999999991e-11 1220 1738 1.0416666666666666e-11 1220 1214 4.1666666666666665e-11 1220 1737 -1.0666666666583334e+01 1220 1219 -1.0666666666666666e+01 1221 1221 3.2000000000249997e+01 1221 1737 -5.3333333333124999e+00 1221 1724 -4.1666666666666665e-11 1221 1741 -5.3333333333124999e+00 1221 1219 -1.0666666666687499e+01 1221 1220 4.1666666666666665e-11 1221 2089 5.3333333333124999e+00 1221 1725 1.0666666666687499e+01 1221 1722 -4.1666666666666665e-11 1221 2097 5.3333333333124999e+00 1221 1224 -1.0666666666687499e+01 1221 1215 4.1666666666666665e-11 1221 1778 5.3333333333124999e+00 1221 1733 1.0666666666687499e+01 1221 1732 -4.1666666666666665e-11 1221 1223 4.1666666666666665e-11 1221 2093 -5.3333333333124999e+00 1221 1734 1.0666666666687499e+01 1221 1222 -1.0666666666687499e+01 1222 1222 4.2666666666916662e+01 1222 1762 -5.3333333333229165e+00 1222 1761 6.2500000000000004e-11 1222 1766 -5.3333333333229165e+00 1222 1210 -1.0666666666687499e+01 1222 1778 -2.1333333333312499e+01 1222 1215 -1.0666666666666666e+01 1222 1733 -5.3333333333229165e+00 1222 1732 6.2500000000000004e-11 1222 2093 2.1333333333312499e+01 1222 1734 -5.3333333333229165e+00 1222 1223 -1.0666666666666666e+01 1222 1221 -1.0666666666687499e+01 1223 1223 4.2666666667333331e+01 1223 1786 -1.0666666666583334e+01 1223 2096 -1.0666666666583334e+01 1223 1228 -1.0666666666666666e+01 1223 2315 -1.0416666666666666e-11 1223 2095 -6.2499999999999991e-11 1223 2099 1.0416666666666666e-11 1223 1226 4.1666666666666665e-11 1223 1761 -1.0416666666666666e-11 1223 1762 6.2499999999999991e-11 1223 1758 -1.0416666666666666e-11 1223 1210 4.1666666666666665e-11 1223 1722 -1.0416666666666666e-11 1223 2097 1.0666666666583334e+01 1223 1224 -1.0666666666666666e+01 1223 1734 6.2499999999999991e-11 1223 1732 -1.0416666666666666e-11 1223 1221 4.1666666666666665e-11 1223 2093 -1.0666666666583334e+01 1223 1222 -1.0666666666666666e+01 1223 5004 -1.0416666666666666e-11 1223 4319 -1.0666666666666666e+01 1223 1075 6.2499999999999991e-11 1223 816 1.0416666666666666e-11 1223 4318 4.1666666666666665e-11 1224 1224 4.2666666666916662e+01 1224 2095 5.3333333333229165e+00 1224 2099 -6.2500000000000004e-11 1224 2090 5.3333333333229165e+00 1224 1226 -1.0666666666687499e+01 1224 2089 -2.1333333333312499e+01 1224 1725 -5.3333333333229165e+00 1224 1220 -1.0666666666666666e+01 1224 1722 6.2499999999999991e-11 1224 2097 -2.1333333333312499e+01 1224 1223 -1.0666666666666666e+01 1224 1734 -5.3333333333229165e+00 1224 1221 -1.0666666666687499e+01 1225 1225 2.1333333333499997e+01 1225 2004 5.3333333333229165e+00 1225 2128 -2.0833333333333339e-11 1225 1773 5.3333333333229165e+00 1225 1216 -1.0666666666729165e+01 1225 1772 -5.3333333333437496e+00 1225 1771 -5.3333333333229165e+00 1225 1215 2.0833333333333339e-11 1225 2001 -5.3333333333437496e+00 1225 1777 5.3333333333229165e+00 1225 1211 -5.3333333333437496e+00 1225 1779 -1.0666666666729165e+01 1225 4320 -5.3333333333437496e+00 1226 1226 3.2000000000249997e+01 1226 2096 -5.3333333333124999e+00 1226 2315 -4.1666666666666665e-11 1226 1993 -5.3333333333124999e+00 1226 1228 -1.0666666666687499e+01 1226 1223 4.1666666666666665e-11 1226 2097 5.3333333333124999e+00 1226 2095 -1.0666666666687499e+01 1226 2099 4.1666666666666665e-11 1226 2089 5.3333333333124999e+00 1226 1224 -1.0666666666687499e+01 1226 1992 5.3333333333124999e+00 1226 1991 -1.0666666666687499e+01 1226 2316 -4.1666666666666665e-11 1226 1220 4.1666666666666665e-11 1226 2088 5.3333333333124999e+00 1226 2090 -1.0666666666687499e+01 1226 1227 -1.0666666666687499e+01 1226 4316 4.1666666666666665e-11 1227 1227 4.2666666666916662e+01 1227 1980 -5.3333333333229165e+00 1227 1979 6.2499999999999991e-11 1227 1982 -5.3333333333229165e+00 1227 1217 -1.0666666666687499e+01 1227 1992 -2.1333333333312499e+01 1227 1991 5.3333333333229165e+00 1227 2316 6.2499999999999991e-11 1227 2088 -2.1333333333312499e+01 1227 2090 5.3333333333229165e+00 1227 1220 -1.0666666666666666e+01 1227 1226 -1.0666666666687499e+01 1227 4316 -1.0666666666666666e+01 1228 1228 4.2666666666916662e+01 1228 1993 2.1333333333312499e+01 1228 2096 2.1333333333312499e+01 1228 1223 -1.0666666666666666e+01 1228 2095 5.3333333333229165e+00 1228 2315 6.2500000000000004e-11 1228 1991 5.3333333333229165e+00 1228 1226 -1.0666666666687499e+01 1228 4316 -1.0666666666666666e+01 1228 5005 -5.3333333333229165e+00 1228 816 -6.2500000000000004e-11 1228 1075 -5.3333333333229165e+00 1228 4318 -1.0666666666687499e+01 1229 1229 3.2000000000208331e+01 1229 1782 5.3333333333124999e+00 1229 1757 5.3333333332916668e+00 1229 1235 4.1666666666666665e-11 1229 1770 -5.3333333333124999e+00 1229 1765 1.0666666666687499e+01 1229 1785 -4.3283707583767993e-28 1229 1760 1.0666666666625000e+01 1229 1759 5.3333333332916668e+00 1229 1230 -1.0666666666708332e+01 1229 4460 3.1495832401145651e-28 1229 3783 -1.0666666666708332e+01 1229 3784 -1.0666666666729165e+01 1230 1230 5.3333333333833338e+01 1230 2077 5.3333333332812494e+00 1230 1808 1.0666666666583334e+01 1230 2190 -5.3333333333020834e+00 1230 1239 -1.0666666666666666e+01 1230 1784 1.0666666666625000e+01 1230 1807 -1.0666666666791667e+01 1230 1245 -5.3333333333437496e+00 1230 1782 -3.2000000000000000e+01 1230 1235 -1.5999999999947917e+01 1230 1765 -5.3333333333229165e+00 1230 2076 2.0194839173657902e-27 1230 1802 5.3333333333229165e+00 1230 1238 6.2500000000000004e-11 1230 1803 1.0666666666666666e+01 1230 1759 1.0416666666666667e-10 1230 1785 -5.3333333333229165e+00 1230 1760 -5.3333333332812494e+00 1230 1229 -1.0666666666708332e+01 1230 4461 2.0194839173657902e-27 1230 3791 -1.0666666666666666e+01 1230 3784 6.2500000000000004e-11 1231 1231 5.3333333333833330e+01 1231 2043 -2.0194839173657902e-27 1231 2190 -5.3333333333020834e+00 1231 2037 5.3333333332812494e+00 1231 1784 1.0666666666625000e+01 1231 2017 -1.0666666666791667e+01 1231 1245 -5.3333333333437496e+00 1231 2020 1.0666666666583334e+01 1231 1238 6.2500000000000004e-11 1231 2021 5.3333333333229165e+00 1231 2077 5.3333333332812494e+00 1231 1239 -1.0666666666666666e+01 1231 2019 -1.0416666666666667e-10 1231 1781 -3.2000000000000000e+01 1231 1780 5.3333333333229165e+00 1231 1235 -1.5999999999947917e+01 1231 1234 -1.0666666666708332e+01 1231 2034 -2.0194839173657902e-27 1231 2015 5.3333333333229165e+00 1231 1232 6.2500000000000004e-11 1231 2016 1.0666666666666666e+01 1231 1233 -1.0666666666666666e+01 1232 1232 4.2666666667041667e+01 1232 2064 -4.5860624244724788e-28 1232 2019 5.3333333332812494e+00 1232 2037 -1.4583333333333335e-10 1232 1244 6.2499999999999991e-11 1232 1234 -1.0666666666729165e+01 1232 2036 5.3333333333229165e+00 1232 2109 -5.3333333332812494e+00 1232 2042 5.3333333333229165e+00 1232 2035 -6.2500000000000004e-11 1232 2039 1.5999999999989583e+01 1232 2061 5.3333333333229165e+00 1232 1237 -1.0666666666666666e+01 1232 1241 -1.0666666666687499e+01 1232 2016 -2.0194839173657902e-27 1232 2015 -5.3333333333229165e+00 1232 1231 6.2499999999999991e-11 1232 2034 1.5999999999989583e+01 1232 1233 -1.0666666666666666e+01 1233 1233 4.2666666667208325e+01 1233 2021 -2.2851328271989659e-27 1233 2040 -6.2499999999999991e-11 1233 2074 -1.0416666666666666e-11 1233 1243 4.1666666666666665e-11 1233 2043 1.0666666666572917e+01 1233 1238 -1.0666666666666666e+01 1233 2035 1.0416666666666666e-11 1233 2042 -6.2499999999999991e-11 1233 1241 4.1666666666666665e-11 1233 2041 1.0666666666583334e+01 1233 1242 -1.0666666666666666e+01 1233 2015 -3.6295685768920020e-28 1233 2034 -1.0666666666572915e+01 1233 2016 -1.0666666666562499e+01 1233 1232 -1.0666666666666666e+01 1233 1231 -1.0666666666666666e+01 1233 4893 -1.0416666666666666e-11 1233 4475 -1.0416666666666666e-11 1234 1234 3.2000000000208331e+01 1234 2015 3.1495832401145651e-28 1234 2036 1.8812360437258079e-27 1234 2037 -1.0666666666625000e+01 1234 1232 -1.0666666666729165e+01 1234 2109 5.3333333332916668e+00 1234 1783 5.3333333333124999e+00 1234 1244 -1.0666666666708332e+01 1234 2019 -5.3333333332916668e+00 1234 1235 4.1666666666666665e-11 1234 1781 5.3333333333124999e+00 1234 1780 -1.0666666666687499e+01 1234 1231 -1.0666666666708332e+01 1235 1235 5.3333333334062488e+01 1235 1807 5.3333333333020834e+00 1235 1245 2.0833333333333339e-11 1235 1784 -1.0666666666833333e+01 1235 2017 5.3333333333020834e+00 1235 2109 -1.0416666666666666e-11 1235 1772 1.8812360437258079e-27 1235 1783 1.0666666666572915e+01 1235 1244 -1.0666666666666666e+01 1235 1759 -1.0416666666666666e-11 1235 1782 2.1333333333260416e+01 1235 1230 -1.5999999999947917e+01 1235 1765 6.2499999999999991e-11 1235 1757 -1.0416666666666666e-11 1235 1229 4.1666666666666665e-11 1235 1770 -1.0666666666572917e+01 1235 1780 -6.2499999999999991e-11 1235 2019 1.0416666666666666e-11 1235 1234 4.1666666666666665e-11 1235 1781 2.1333333333260416e+01 1235 1231 -1.5999999999947917e+01 1235 3783 -1.0666666666666666e+01 1236 1236 3.2000000000208331e+01 1236 1774 2.8940292364521930e-29 1236 1772 2.2851328271989659e-27 1236 1773 -1.0666666666625000e+01 1236 2128 -5.3333333332916668e+00 1236 2064 5.3333333333124999e+00 1236 1244 -1.0666666666708332e+01 1236 2069 -5.3333333332916668e+00 1236 1237 4.1666666666666665e-11 1236 2063 5.3333333333124999e+00 1236 2062 -1.0666666666687499e+01 1236 3783 -1.0666666666729165e+01 1236 3790 -1.0666666666708332e+01 1237 1237 4.2666666667270825e+01 1237 2036 2.2851328271989659e-27 1237 2128 1.0416666666666666e-11 1237 2064 1.0666666666572917e+01 1237 1244 -1.0666666666666666e+01 1237 2061 -6.2499999999999991e-11 1237 2035 1.0416666666666666e-11 1237 1241 4.1666666666666665e-11 1237 2039 -1.0666666666572917e+01 1237 1232 -1.0666666666666666e+01 1237 2058 6.2499999999999991e-11 1237 2059 -1.0666666666583334e+01 1237 1240 -1.0666666666666666e+01 1237 2062 -6.2499999999999991e-11 1237 2069 1.0416666666666666e-11 1237 1236 4.1666666666666665e-11 1237 2063 1.0666666666583334e+01 1237 4477 -1.0416666666666666e-11 1237 4846 -1.0416666666666666e-11 1237 4482 -1.0416666666666666e-11 1237 3789 4.1666666666666665e-11 1237 3790 -1.0666666666666666e+01 1238 1238 4.2666666667041667e+01 1238 2016 -2.2470898404921788e-28 1238 1808 5.3333333332812494e+00 1238 2043 -1.5999999999989583e+01 1238 2040 5.3333333333229165e+00 1238 1233 -1.0666666666666666e+01 1238 2074 6.2500000000000004e-11 1238 2075 -5.3333333333229165e+00 1238 1243 -1.0666666666687499e+01 1238 2077 -1.4583333333333335e-10 1238 1231 6.2499999999999991e-11 1238 2021 -5.3333333333229165e+00 1238 2020 5.3333333332812494e+00 1238 1239 -1.0666666666729165e+01 1238 1803 -2.0194839173657902e-27 1238 1802 -5.3333333333229165e+00 1238 1230 6.2499999999999991e-11 1238 2076 -1.5999999999989583e+01 1238 3791 -1.0666666666666666e+01 1239 1239 4.2666666666999994e+01 1239 2017 1.0666666666625000e+01 1239 1802 -8.8938459461701536e-29 1239 1808 -2.1333333333291666e+01 1239 1807 1.0666666666625000e+01 1239 2190 1.0666666666833333e+01 1239 1230 -1.0666666666666666e+01 1239 1245 -1.0666666666729165e+01 1239 2021 2.8940292364521930e-29 1239 2077 -1.0666666666625000e+01 1239 2020 -2.1333333333291666e+01 1239 1238 -1.0666666666729165e+01 1239 1231 -1.0666666666666666e+01 1240 1240 4.2666666666916662e+01 1240 2061 5.3333333333229165e+00 1240 2065 5.3333333333229165e+00 1240 1241 -1.0666666666687499e+01 1240 2060 2.1333333333312499e+01 1240 2059 2.1333333333312499e+01 1240 2058 -5.3333333333229165e+00 1240 1237 -1.0666666666666666e+01 1240 4477 6.2499999999999991e-11 1240 3788 -1.0666666666666666e+01 1240 4457 -5.3333333333229165e+00 1240 4482 6.2500000000000004e-11 1240 3789 -1.0666666666687499e+01 1241 1241 3.2000000000249997e+01 1241 2034 -5.3333333333124999e+00 1241 2066 5.3333333333124999e+00 1241 1233 4.1666666666666665e-11 1241 2041 5.3333333333124999e+00 1241 2042 -1.0666666666687499e+01 1241 1242 -1.0666666666687499e+01 1241 2059 -5.3333333333124999e+00 1241 2060 -5.3333333333124999e+00 1241 2065 -1.0666666666687499e+01 1241 1240 -1.0666666666687499e+01 1241 2035 4.1666666666666665e-11 1241 1237 4.1666666666666665e-11 1241 2039 -5.3333333333124999e+00 1241 2061 -1.0666666666687499e+01 1241 1232 -1.0666666666687499e+01 1241 4475 -4.1666666666666665e-11 1241 4477 -4.1666666666666665e-11 1241 3788 4.1666666666666665e-11 1242 1242 4.2666666666916662e+01 1242 2040 5.3333333333229165e+00 1242 2067 5.3333333333229165e+00 1242 1243 -1.0666666666687499e+01 1242 2066 -2.1333333333312499e+01 1242 2065 5.3333333333229165e+00 1242 2041 -2.1333333333312499e+01 1242 2042 5.3333333333229165e+00 1242 1233 -1.0666666666666666e+01 1242 1241 -1.0666666666687499e+01 1242 4893 6.2499999999999991e-11 1242 3788 -1.0666666666666666e+01 1242 4475 6.2499999999999991e-11 1243 1243 3.2000000000249997e+01 1243 2041 5.3333333333124999e+00 1243 2066 5.3333333333124999e+00 1243 1242 -1.0666666666687499e+01 1243 1233 4.1666666666666665e-11 1243 2043 5.3333333333124999e+00 1243 2040 -1.0666666666687499e+01 1243 2074 -4.1666666666666665e-11 1243 2076 5.3333333333124999e+00 1243 1238 -1.0666666666687499e+01 1243 2067 -1.0666666666687499e+01 1243 2075 1.0666666666687499e+01 1243 4893 -4.1666666666666665e-11 1243 3788 4.1666666666666665e-11 1243 4458 -5.3333333333124999e+00 1243 4888 -4.1666666666666665e-11 1243 3791 4.1666666666666665e-11 1243 4887 -5.3333333333124999e+00 1243 3792 -1.0666666666687499e+01 1244 1244 4.2666666667041667e+01 1244 2039 2.0194839173657902e-27 1244 1773 5.3333333332812494e+00 1244 2128 -1.0416666666666667e-10 1244 2062 5.3333333333229165e+00 1244 2064 -1.5999999999989583e+01 1244 1237 -1.0666666666666666e+01 1244 1236 -1.0666666666708332e+01 1244 1232 6.2500000000000004e-11 1244 2037 5.3333333332812494e+00 1244 2036 -5.3333333333229165e+00 1244 2109 1.0416666666666667e-10 1244 1780 5.3333333333229165e+00 1244 1234 -1.0666666666708332e+01 1244 1770 2.0194839173657902e-27 1244 1772 -5.3333333333229165e+00 1244 1235 -1.0666666666666666e+01 1244 1783 -1.5999999999989583e+01 1244 3783 6.2500000000000004e-11 1245 1245 2.1333333333499997e+01 1245 2020 5.3333333333229165e+00 1245 2190 -2.0833333333333339e-11 1245 1808 5.3333333333229165e+00 1245 1239 -1.0666666666729165e+01 1245 1807 -5.3333333333437496e+00 1245 1782 5.3333333333229165e+00 1245 1230 -5.3333333333437496e+00 1245 1235 2.0833333333333339e-11 1245 2017 -5.3333333333437496e+00 1245 1781 5.3333333333229165e+00 1245 1231 -5.3333333333437496e+00 1245 1784 -1.0666666666729165e+01 1246 1246 2.1354166666666668e+01 1247 1247 2.1358333333333331e+01 1248 1248 2.1354166666666668e+01 1249 1249 4.2699999999999996e+01 1249 1793 1.0662500000000000e+01 1249 2150 -4.5316262678105068e-20 1249 2143 2.1329166666666666e+01 1249 2134 -1.0662500000000000e+01 1249 2130 1.0683333333333334e+01 1249 1250 -1.0672916666666666e+01 1249 1790 -2.8940292364521927e-21 1249 2141 1.0662500000000000e+01 1249 1789 -2.1329166666666666e+01 1249 2837 -1.0666666666666668e+01 1249 4288 -1.0666666666666664e+01 1250 1250 2.1349999999999998e+01 1250 1251 2.0833333333333337e-03 1250 2137 1.0672916666666666e+01 1250 1789 5.3322916666666664e+00 1250 1793 -5.3343749999999996e+00 1250 2130 -2.0833333333333337e-03 1250 2143 -5.3322916666666664e+00 1250 2134 5.3343749999999996e+00 1250 1249 -1.0672916666666666e+01 1250 3392 -5.3322916666666664e+00 1250 4958 -5.3322916666666664e+00 1250 4288 -5.3343749999999996e+00 1250 2837 -5.3343749999999996e+00 1251 1251 5.3412499999999994e+01 1251 2134 -5.3302083333333332e+00 1251 1250 2.0833333333333333e-03 1251 2137 1.0683333333333334e+01 1251 1793 5.3302083333333332e+00 1251 3672 -1.0416666666666667e-03 1251 3395 -1.0658333333333333e+01 1251 2844 -1.0666666666666666e+01 1251 3374 -1.0416666666666667e-03 1251 3393 -6.2500000000000003e-03 1251 3669 1.0416666666666667e-03 1251 2839 4.1666666666666666e-03 1251 3394 1.0658333333333333e+01 1251 2840 -1.0666666666666666e+01 1251 3378 6.2500000000000003e-03 1251 3369 -1.0416666666666667e-03 1251 2836 4.1666666666666666e-03 1251 3392 -2.1326041666666665e+01 1251 2837 -1.5994791666666664e+01 1251 4950 -1.0416666666666667e-03 1251 4947 6.2500000000000003e-03 1251 4946 -1.0416666666666667e-03 1251 4287 4.1666666666666666e-03 1251 4958 -2.1326041666666665e+01 1251 4288 -1.5994791666666664e+01 1252 1252 2.1352083333333333e+01 1253 1253 2.1354166666666668e+01 1254 1254 4.2704166666666666e+01 1254 2133 -1.0416666666666664e-02 1254 2142 -5.3322916666666664e+00 1254 2130 -1.0416666666666664e-02 1254 1789 5.3281250000000000e+00 1254 1255 -1.0670833333333333e+01 1254 2136 5.3322916666666664e+00 1254 2131 1.5998958333333333e+01 1254 1793 -5.3322916666666664e+00 1254 2132 1.5998958333333333e+01 1254 4595 -5.3322916666666664e+00 1254 4588 -5.3281250000000000e+00 1254 4015 -1.0670833333333333e+01 1254 4654 -2.1684043449710089e-19 1254 4021 6.2499999999999995e-03 1254 4018 -1.0666666666666666e+01 1255 1255 3.2020833333333343e+01 1255 2131 -5.3312499999999998e+00 1255 1793 -2.8940292364521927e-21 1255 2130 -5.3291666666666666e+00 1255 1254 -1.0670833333333333e+01 1255 1791 8.8938459461701536e-21 1255 1789 -1.0662500000000000e+01 1255 2145 5.3291666666666666e+00 1255 2142 1.0668750000000001e+01 1255 4021 -1.0672916666666666e+01 1256 1256 2.1360416666666666e+01 1257 1257 2.1362499999999997e+01 1258 1258 2.1343750000000000e+01 1259 1259 4.2716666666666669e+01 1259 1791 -6.2499999999999986e-03 1259 1795 1.0672916666666666e+01 1259 1790 -6.2499999999999986e-03 1259 1788 1.0666666666666666e+01 1259 1794 1.0672916666666666e+01 1259 1792 1.0666666666666666e+01 1259 4960 -6.2499999999999986e-03 1259 4962 -6.2499999999999986e-03 1260 1260 2.1354166666666668e+01 1261 1261 2.1362499999999997e+01 1262 1262 2.1343750000000000e+01 1263 1263 2.1354166666666668e+01 1264 1264 2.1343750000000000e+01 1265 1265 2.1362499999999997e+01 1266 1266 2.1343750000000000e+01 1267 1267 3.7333333333583333e+01 1267 2192 4.5860624244724788e-28 1267 1911 5.3333333333229165e+00 1267 1904 -1.0416666666666667e-10 1267 1279 6.2499999999999991e-11 1267 1280 -1.0666666666708332e+01 1267 1903 5.3333333333229165e+00 1267 2174 -5.3333333332812494e+00 1267 1914 1.2116903504194741e-27 1267 1278 -8.0000000000000000e+00 1267 1908 1.3333333333322916e+01 1267 1917 1.2116903504194741e-27 1267 1906 1.0666666666677083e+01 1267 1905 8.0000000000000000e+00 1267 1269 -1.0666666666677083e+01 1267 1268 -8.0000000000000000e+00 1268 1268 5.3333333333812490e+01 1268 1903 1.8812360437258079e-27 1268 2190 1.0416666666666666e-11 1268 2192 -1.0666666666572917e+01 1268 1279 -1.0666666666666666e+01 1268 2218 -5.3333333333124999e+00 1268 1920 5.3333333333124999e+00 1268 2215 5.3333333333958333e+00 1268 1288 -5.3333333333333330e+00 1268 2275 2.1333333333343749e+01 1268 1272 -1.0666666666614583e+01 1268 2271 -5.3333333333124999e+00 1268 2274 -6.2499999999999991e-11 1268 2272 1.0416666666666666e-11 1268 1275 4.1666666666666665e-11 1268 2273 -2.6666666665937502e+00 1268 1270 -8.0000000000000000e+00 1268 1917 -2.1333333333343749e+01 1268 1906 -5.3333333333124999e+00 1268 1905 -2.6666666665833332e+00 1268 1269 -1.0666666666614583e+01 1268 1267 -8.0000000000000000e+00 1269 1269 6.4000000000499995e+01 1269 2215 -5.3333333333124999e+00 1269 1920 -1.0416666666666666e-10 1269 2216 -5.3333333333124999e+00 1269 1288 -1.0666666666677083e+01 1269 1919 2.1333333333291666e+01 1269 1287 -1.0666666666614583e+01 1269 2264 -5.3333333333124999e+00 1269 1918 -1.0416666666666666e-10 1269 1916 -5.3333333333124999e+00 1269 1286 -1.0666666666677083e+01 1269 1914 -2.1333333333291666e+01 1269 1278 -1.0666666666614583e+01 1269 1908 -5.3333333333124999e+00 1269 1906 1.0416666666666666e-10 1269 1917 2.1333333333291666e+01 1269 1905 -5.3333333333124999e+00 1269 1268 -1.0666666666614583e+01 1269 1267 -1.0666666666677083e+01 1270 1270 3.7333333333583333e+01 1270 1808 5.3333333332812494e+00 1270 1805 -2.2470898404921788e-28 1270 1809 -5.3333333333229165e+00 1270 1273 6.2499999999999991e-11 1270 2275 1.4136387421560532e-27 1270 2272 -1.0416666666666667e-10 1270 2273 1.3333333333322916e+01 1270 2274 5.3333333333229165e+00 1270 1268 -8.0000000000000000e+00 1270 1275 -1.0666666666708332e+01 1270 2276 1.4136387421560532e-27 1270 2271 1.0666666666677083e+01 1270 2270 8.0000000000000000e+00 1270 1272 -1.0666666666677083e+01 1270 1271 -8.0000000000000000e+00 1271 1271 5.3333333333749991e+01 1271 2283 2.1333333333343749e+01 1271 1290 -1.0666666666614583e+01 1271 1817 -2.6666666665833327e+00 1271 1274 -8.0000000000000000e+00 1271 1809 -1.8812360437258079e-27 1271 2281 -5.3333333333124999e+00 1271 2277 5.3333333333124999e+00 1271 2278 5.3333333333958333e+00 1271 1289 -5.3333333333333330e+00 1271 1804 3.6295685768920020e-28 1271 1805 -1.0666666666562499e+01 1271 1273 -1.0666666666666666e+01 1271 2276 -2.1333333333343749e+01 1271 2271 -5.3333333333124999e+00 1271 2270 -2.6666666665833332e+00 1271 1272 -1.0666666666614583e+01 1271 1270 -8.0000000000000000e+00 1271 699 -5.3333333333124999e+00 1272 1272 6.4000000000499995e+01 1272 2278 -5.3333333333124999e+00 1272 2277 -1.0416666666666666e-10 1272 2266 5.3333333333124999e+00 1272 1289 -1.0666666666677083e+01 1272 2268 -2.1333333333291666e+01 1272 1287 -1.0666666666614583e+01 1272 2216 -5.3333333333124999e+00 1272 2218 1.0416666666666666e-10 1272 2215 -5.3333333333124999e+00 1272 1288 -1.0666666666677083e+01 1272 2275 -2.1333333333291666e+01 1272 1268 -1.0666666666614583e+01 1272 2273 -5.3333333333124999e+00 1272 2271 1.0416666666666666e-10 1272 2276 2.1333333333291666e+01 1272 2270 -5.3333333333124999e+00 1272 1271 -1.0666666666614583e+01 1272 1270 -1.0666666666677083e+01 1273 1273 4.2666666667104167e+01 1273 2272 5.3333333332812494e+00 1273 2270 2.0194839173657902e-27 1273 1270 6.2500000000000004e-11 1273 1809 5.3333333333229165e+00 1273 1808 -1.4583333333333335e-10 1273 1275 -1.0666666666729165e+01 1273 2190 5.3333333332812494e+00 1273 1812 -4.5860624244724788e-28 1273 1807 5.3333333333229165e+00 1273 1279 6.2499999999999991e-11 1273 1763 -5.3333333332812494e+00 1273 1759 1.0416666666666667e-10 1273 1806 1.5999999999989583e+01 1273 1767 -5.3333333333229165e+00 1273 1277 -1.0666666666666666e+01 1273 1276 -1.0666666666708332e+01 1273 1817 -2.0194839173657902e-27 1273 1804 5.3333333333229165e+00 1273 1274 6.2500000000000004e-11 1273 1805 1.0666666666666666e+01 1273 1271 -1.0666666666666666e+01 1274 1274 3.7333333333583326e+01 1274 2283 1.2116903504194741e-27 1274 1271 -8.0000000000000000e+00 1274 1817 8.0000000000000000e+00 1274 1818 1.3333333333322916e+01 1274 1290 -1.0666666666677083e+01 1274 1282 -8.0000000000000000e+00 1274 1768 -5.3333333333229165e+00 1274 1763 1.0416666666666666e-10 1274 1759 -5.3333333332812494e+00 1274 1276 -1.0666666666708332e+01 1274 1805 -2.0194839173657902e-27 1274 1804 -5.3333333333229165e+00 1274 1273 6.2499999999999991e-11 1274 702 1.2116903504194741e-27 1274 699 1.0666666666677083e+01 1275 1275 3.2000000000208331e+01 1275 1809 -2.8940292364521930e-29 1275 1807 1.8812360437258079e-27 1275 1808 -1.0666666666625000e+01 1275 1273 -1.0666666666729165e+01 1275 2190 -5.3333333332916668e+00 1275 2192 -5.3333333333124999e+00 1275 1279 -1.0666666666708332e+01 1275 2272 -5.3333333332916668e+00 1275 1268 4.1666666666666665e-11 1275 2273 -5.3333333333124999e+00 1275 2274 -1.0666666666687499e+01 1275 1270 -1.0666666666708332e+01 1276 1276 3.2000000000229164e+01 1276 1818 -5.3333333333124999e+00 1276 1814 -5.3333333333124999e+00 1276 1761 -4.1666666666666665e-11 1276 1282 4.1666666666666665e-11 1276 2094 -5.3333333333124999e+00 1276 1768 1.0666666666687499e+01 1276 1281 -1.0666666666687499e+01 1276 1804 -3.1495832401145651e-28 1276 1274 -1.0666666666708332e+01 1276 1763 5.3333333332916668e+00 1276 1759 5.3333333332916668e+00 1276 1277 4.1666666666666665e-11 1276 1806 -5.3333333333124999e+00 1276 1767 1.0666666666687499e+01 1276 1273 -1.0666666666708332e+01 1277 1277 4.2666666667270832e+01 1277 1735 6.2499999999999991e-11 1277 1732 -1.0416666666666666e-11 1277 1283 4.1666666666666665e-11 1277 1814 -1.0666666666583334e+01 1277 1281 -1.0666666666666666e+01 1277 2175 -1.0416666666666666e-11 1277 1728 -1.0416666666666666e-11 1277 1815 1.0666666666583334e+01 1277 1284 -1.0666666666666666e+01 1277 1761 -1.0416666666666666e-11 1277 1813 -6.2499999999999991e-11 1277 2174 -1.0416666666666666e-11 1277 1280 4.1666666666666665e-11 1277 1807 1.8812360437258079e-27 1277 1812 1.0666666666572915e+01 1277 1279 -1.0666666666666666e+01 1277 1767 6.2499999999999991e-11 1277 1759 -1.0416666666666666e-11 1277 1276 4.1666666666666665e-11 1277 1806 -1.0666666666572917e+01 1277 1273 -1.0666666666666666e+01 1278 1278 5.3333333333874990e+01 1278 1916 5.3333333333958333e+00 1278 1286 -5.3333333333333330e+00 1278 1915 -2.6666666665937502e+00 1278 1285 -8.0000000000000000e+00 1278 1918 5.3333333333124999e+00 1278 2175 -1.0416666666666666e-11 1278 1911 -6.2499999999999991e-11 1278 1904 1.0416666666666666e-11 1278 1280 4.1666666666666665e-11 1278 1726 -1.0416666666666666e-11 1278 1736 6.2499999999999991e-11 1278 1728 -1.0416666666666666e-11 1278 1283 4.1666666666666665e-11 1278 1912 1.0666666666583334e+01 1278 1284 -1.0666666666666666e+01 1278 1914 2.1333333333343749e+01 1278 1269 -1.0666666666614583e+01 1278 1906 -5.3333333333124999e+00 1278 1908 -2.6666666665937497e+00 1278 1267 -8.0000000000000000e+00 1278 1038 5.3333333333124999e+00 1278 1035 -2.1333333333343749e+01 1278 1024 -5.3333333333124999e+00 1278 291 -1.0666666666614583e+01 1279 1279 4.2666666667041667e+01 1279 1905 2.0194839173657902e-27 1279 1808 5.3333333332812494e+00 1279 2190 -1.0416666666666667e-10 1279 2274 5.3333333333229165e+00 1279 2192 1.5999999999989583e+01 1279 1268 -1.0666666666666666e+01 1279 1275 -1.0666666666708332e+01 1279 1267 6.2500000000000004e-11 1279 1904 5.3333333332812494e+00 1279 1903 -5.3333333333229165e+00 1279 2174 1.0416666666666667e-10 1279 1813 5.3333333333229165e+00 1279 1280 -1.0666666666708332e+01 1279 1806 2.0194839173657902e-27 1279 1273 6.2500000000000004e-11 1279 1807 -5.3333333333229165e+00 1279 1277 -1.0666666666666666e+01 1279 1812 -1.5999999999989583e+01 1280 1280 3.2000000000229164e+01 1280 1912 5.3333333333124999e+00 1280 2175 -4.1666666666666665e-11 1280 1815 5.3333333333124999e+00 1280 1284 -1.0666666666687499e+01 1280 1278 4.1666666666666665e-11 1280 1908 -5.3333333333124999e+00 1280 1911 -1.0666666666687499e+01 1280 1903 2.2851328271989659e-27 1280 1904 -5.3333333332916668e+00 1280 1267 -1.0666666666708332e+01 1280 2174 5.3333333332916668e+00 1280 1277 4.1666666666666665e-11 1280 1813 -1.0666666666687499e+01 1280 1812 5.3333333333124999e+00 1280 1279 -1.0666666666708332e+01 1281 1281 4.2666666666916662e+01 1281 2094 2.1333333333312499e+01 1281 1282 -1.0666666666666666e+01 1281 1732 6.2500000000000004e-11 1281 1814 2.1333333333312499e+01 1281 1735 -5.3333333333229165e+00 1281 1277 -1.0666666666666666e+01 1281 1283 -1.0666666666687499e+01 1281 1767 -5.3333333333229165e+00 1281 1761 6.2500000000000004e-11 1281 1768 -5.3333333333229165e+00 1281 1276 -1.0666666666687499e+01 1281 1023 -5.3333333333229165e+00 1282 1282 5.3333333333874990e+01 1282 1732 -1.0416666666666666e-11 1282 2094 -1.0666666666583334e+01 1282 1281 -1.0666666666666666e+01 1282 1726 -1.0416666666666666e-11 1282 1283 4.1666666666666665e-11 1282 1285 -8.0000000000000000e+00 1282 1818 -2.6666666665937502e+00 1282 1290 -1.0666666666614583e+01 1282 1274 -8.0000000000000000e+00 1282 1763 -1.0416666666666666e-11 1282 1768 6.2499999999999991e-11 1282 1761 -1.0416666666666666e-11 1282 1276 4.1666666666666665e-11 1282 1036 5.3333333333124999e+00 1282 703 5.3333333333124999e+00 1282 1028 -5.3333333333958333e+00 1282 292 -5.3333333333333330e+00 1282 1031 2.1333333333343749e+01 1282 291 -1.0666666666614583e+01 1282 1024 -5.3333333333124999e+00 1282 1023 6.2499999999999991e-11 1282 1025 -2.6666666665937502e+00 1282 702 -2.1333333333343749e+01 1282 699 -5.3333333333124999e+00 1283 1283 3.2000000000249997e+01 1283 2094 -5.3333333333124999e+00 1283 1732 -4.1666666666666665e-11 1283 1277 4.1666666666666665e-11 1283 1814 -5.3333333333124999e+00 1283 1735 1.0666666666687499e+01 1283 1281 -1.0666666666687499e+01 1283 1726 -4.1666666666666665e-11 1283 1282 4.1666666666666665e-11 1283 1285 -1.0666666666687499e+01 1283 1915 -5.3333333333124999e+00 1283 1815 5.3333333333124999e+00 1283 1728 -4.1666666666666665e-11 1283 1278 4.1666666666666665e-11 1283 1912 5.3333333333124999e+00 1283 1736 1.0666666666687499e+01 1283 1284 -1.0666666666687499e+01 1283 1025 -5.3333333333124999e+00 1283 1023 1.0666666666687499e+01 1284 1284 4.2666666666916662e+01 1284 1911 5.3333333333229165e+00 1284 2175 6.2500000000000004e-11 1284 1813 5.3333333333229165e+00 1284 1280 -1.0666666666687499e+01 1284 1815 -2.1333333333312499e+01 1284 1277 -1.0666666666666666e+01 1284 1735 -5.3333333333229165e+00 1284 1728 6.2499999999999991e-11 1284 1912 -2.1333333333312499e+01 1284 1736 -5.3333333333229165e+00 1284 1278 -1.0666666666666666e+01 1284 1283 -1.0666666666687499e+01 1285 1285 3.7333333333520827e+01 1285 1726 6.2499999999999991e-11 1285 1282 -8.0000000000000000e+00 1285 1283 -1.0666666666687499e+01 1285 1915 1.3333333333322916e+01 1285 1278 -8.0000000000000000e+00 1285 1736 -5.3333333333229165e+00 1285 1031 1.4136387421560532e-27 1285 1025 1.3333333333322916e+01 1285 1023 -5.3333333333229165e+00 1285 1035 1.4136387421560532e-27 1285 1024 1.0666666666677083e+01 1285 291 -1.0666666666677083e+01 1286 1286 3.2000000000124999e+01 1286 1278 -5.3333333333333330e+00 1286 1916 5.3333333333333330e+00 1286 2264 5.3333333333333330e+00 1286 1287 -5.3333333333333330e+00 1286 1919 -1.4136387421560532e-27 1286 1914 -1.4136387421560532e-27 1286 1918 -1.0666666666677083e+01 1286 1269 -1.0666666666677083e+01 1286 1035 -1.0097419586828951e-27 1286 1037 1.0097419586828951e-27 1286 1038 -1.0666666666677083e+01 1286 291 -1.0666666666677083e+01 1287 1287 6.4000000000416662e+01 1287 2264 5.3333333333958333e+00 1287 1286 -5.3333333333333330e+00 1287 2269 2.1333333333343749e+01 1287 1290 -1.0666666666614583e+01 1287 2281 -5.3333333333124999e+00 1287 2277 5.3333333333124999e+00 1287 2266 -5.3333333333958333e+00 1287 1289 -5.3333333333333330e+00 1287 2268 2.1333333333343749e+01 1287 1272 -1.0666666666614583e+01 1287 2218 -5.3333333333124999e+00 1287 1920 5.3333333333124999e+00 1287 2216 5.3333333333958333e+00 1287 1288 -5.3333333333333330e+00 1287 1919 -2.1333333333343749e+01 1287 1269 -1.0666666666614583e+01 1287 1918 5.3333333333124999e+00 1287 1038 5.3333333333124999e+00 1287 1037 -2.1333333333343749e+01 1287 291 -1.0666666666614583e+01 1287 1036 5.3333333333124999e+00 1287 703 5.3333333333124999e+00 1287 1041 5.3333333333958333e+00 1287 292 -5.3333333333333330e+00 1288 1288 3.2000000000124999e+01 1288 2268 1.2116903504194741e-27 1288 2275 -1.2116903504194741e-27 1288 2218 1.0666666666677083e+01 1288 1272 -1.0666666666677083e+01 1288 1917 -1.0097419586828951e-27 1288 1268 -5.3333333333333330e+00 1288 2215 5.3333333333333330e+00 1288 1919 1.0097419586828951e-27 1288 1920 -1.0666666666677083e+01 1288 2216 5.3333333333333330e+00 1288 1269 -1.0666666666677083e+01 1288 1287 -5.3333333333333330e+00 1289 1289 3.2000000000124999e+01 1289 2269 1.4136387421560532e-27 1289 2283 -1.4136387421560532e-27 1289 2281 1.0666666666677083e+01 1289 1290 -1.0666666666677083e+01 1289 2276 -1.0097419586828951e-27 1289 1271 -5.3333333333333330e+00 1289 2278 5.3333333333333330e+00 1289 2268 -1.0097419586828951e-27 1289 2277 -1.0666666666677083e+01 1289 2266 -5.3333333333333330e+00 1289 1272 -1.0666666666677083e+01 1289 1287 -5.3333333333333330e+00 1290 1290 6.4000000000499995e+01 1290 2269 -2.1333333333291666e+01 1290 1287 -1.0666666666614583e+01 1290 2283 -2.1333333333291666e+01 1290 1271 -1.0666666666614583e+01 1290 1817 -5.3333333333124999e+00 1290 1818 -5.3333333333124999e+00 1290 1282 -1.0666666666614583e+01 1290 1274 -1.0666666666677083e+01 1290 2266 5.3333333333124999e+00 1290 2281 1.0416666666666666e-10 1290 2278 -5.3333333333124999e+00 1290 1289 -1.0666666666677083e+01 1290 1028 5.3333333333124999e+00 1290 703 -1.0416666666666666e-10 1290 1041 -5.3333333333124999e+00 1290 292 -1.0666666666677083e+01 1290 699 1.0416666666666666e-10 1290 702 2.1333333333291666e+01 1291 1291 3.2000000000249997e+01 1291 1828 -4.1666666666666665e-11 1291 1829 1.0666666666687499e+01 1291 1824 -4.1666666666666665e-11 1291 1825 1.0666666666687499e+01 1291 1820 -4.1666666666666665e-11 1291 1821 1.0666666666687499e+01 1292 1292 2.1333333333458331e+01 1293 1293 1.0666666666833333e+01 1294 1294 2.1333333333458331e+01 1295 1295 1.0666666666833333e+01 1296 1296 2.1333333333458331e+01 1297 1297 1.0666666666833333e+01 1298 1298 3.2000000000249997e+01 1298 1828 -4.1666666666666665e-11 1298 1821 1.0666666666687499e+01 1298 1820 -4.1666666666666665e-11 1298 1839 -5.3333333333124999e+00 1298 1832 1.0666666666687499e+01 1298 1830 -4.1666666666666665e-11 1298 1837 -5.3333333333124999e+00 1298 1831 1.0666666666687499e+01 1298 1299 -1.0666666666687499e+01 1299 1299 4.2666666666916662e+01 1299 2178 -5.3333333333229165e+00 1299 1832 -5.3333333333229165e+00 1299 1838 -6.2499999999999991e-11 1299 1839 2.1333333333312499e+01 1299 1841 5.3333333333229165e+00 1299 1301 -1.0666666666687499e+01 1299 1830 6.2499999999999991e-11 1299 1837 2.1333333333312499e+01 1299 1831 -5.3333333333229165e+00 1299 1298 -1.0666666666687499e+01 1300 1300 2.1333333333666662e+01 1301 1301 3.2000000000249997e+01 1301 2176 -4.1666666666666665e-11 1301 2173 1.0666666666687499e+01 1301 2172 -4.1666666666666665e-11 1301 1837 -5.3333333333124999e+00 1301 2178 1.0666666666687499e+01 1301 1838 4.1666666666666665e-11 1301 1839 -5.3333333333124999e+00 1301 1841 -1.0666666666687499e+01 1301 1299 -1.0666666666687499e+01 1302 1302 2.1333333333666662e+01 1303 1303 2.1333333333458331e+01 1304 1304 1.0666666666833333e+01 1305 1305 2.1333333333458331e+01 1306 1306 1.0666666666833333e+01 1307 1307 2.1333333333458331e+01 1308 1308 2.1333333333458331e+01 1309 1309 1.6000000000062499e+01 1310 1310 1.6000000000104166e+01 1311 1311 6.4000000000499995e+01 1311 1874 -1.0416666666666666e-10 1311 1875 2.1333333333291666e+01 1311 1872 -1.0416666666666666e-10 1311 1873 2.1333333333291666e+01 1311 1849 1.0416666666666666e-10 1311 1870 -2.1333333333291666e+01 1312 1312 1.6000000000062499e+01 1313 1313 1.6000000000104166e+01 1314 1314 1.6000000000062499e+01 1315 1315 1.6000000000104166e+01 1316 1316 1.6000000000062499e+01 1317 1317 3.2000000000208331e+01 1318 1318 6.4000000000499995e+01 1318 2223 5.3333333333124999e+00 1318 1972 -1.0416666666666666e-10 1318 1963 5.3333333333124999e+00 1318 1332 -1.0666666666677083e+01 1318 2202 5.3333333333124999e+00 1318 1970 -1.0416666666666666e-10 1318 1971 2.1333333333291666e+01 1318 2213 -5.3333333333124999e+00 1318 1329 -1.0666666666614583e+01 1318 1328 -1.0666666666677083e+01 1318 1968 -2.1333333333291666e+01 1318 1958 1.0416666666666666e-10 1318 1969 2.1333333333291666e+01 1319 1319 1.6000000000062499e+01 1320 1320 3.2000000000208331e+01 1321 1321 6.4000000000499995e+01 1321 1856 5.3333333333124999e+00 1321 2208 -1.0416666666666666e-10 1321 2220 5.3333333333124999e+00 1321 1330 -1.0666666666677083e+01 1321 2207 2.1333333333291666e+01 1321 1329 -1.0666666666614583e+01 1321 2213 -5.3333333333124999e+00 1321 2206 -1.0416666666666666e-10 1321 2202 5.3333333333124999e+00 1321 1328 -1.0666666666677083e+01 1321 2205 -2.1333333333291666e+01 1321 2199 1.0416666666666666e-10 1321 1859 -2.1333333333291666e+01 1322 1322 1.6000000000062499e+01 1323 1323 3.2000000000208331e+01 1324 1324 6.4000000000499995e+01 1324 2292 5.3333333333124999e+00 1324 1865 -1.0416666666666666e-10 1324 2222 5.3333333333124999e+00 1324 1331 -1.0666666666677083e+01 1324 1864 2.1333333333291666e+01 1324 1329 -1.0666666666614583e+01 1324 2220 5.3333333333124999e+00 1324 1863 -1.0416666666666666e-10 1324 1856 5.3333333333124999e+00 1324 1330 -1.0666666666677083e+01 1324 1861 -2.1333333333291666e+01 1324 1851 1.0416666666666666e-10 1324 1862 2.1333333333291666e+01 1325 1325 1.6000000000062499e+01 1326 1326 3.2000000000208331e+01 1327 1327 6.4000000000499995e+01 1327 1963 5.3333333333124999e+00 1327 2297 -1.0416666666666666e-10 1327 2223 5.3333333333124999e+00 1327 1332 -1.0666666666677083e+01 1327 2225 -2.1333333333291666e+01 1327 1329 -1.0666666666614583e+01 1327 2222 5.3333333333124999e+00 1327 2296 -1.0416666666666666e-10 1327 2292 5.3333333333124999e+00 1327 1331 -1.0666666666677083e+01 1327 2295 -2.1333333333291666e+01 1327 2288 1.0416666666666666e-10 1327 1966 -2.1333333333291666e+01 1328 1328 3.2000000000124999e+01 1328 2207 -1.0097419586828951e-27 1328 2205 -1.0097419586828951e-27 1328 2206 -1.0666666666677083e+01 1328 1321 -1.0666666666677083e+01 1328 1969 -1.2116903504194741e-27 1328 2202 -5.3333333333333330e+00 1328 1971 1.2116903504194741e-27 1328 1970 -1.0666666666677083e+01 1328 2213 5.3333333333333330e+00 1328 1318 -1.0666666666677083e+01 1328 1329 -5.3333333333333330e+00 1329 1329 6.4000000000416662e+01 1329 1972 5.3333333333124999e+00 1329 2297 5.3333333333124999e+00 1329 2223 -5.3333333333958333e+00 1329 1332 -5.3333333333333330e+00 1329 2225 2.1333333333343749e+01 1329 1327 -1.0666666666614583e+01 1329 2296 5.3333333333124999e+00 1329 1865 5.3333333333124999e+00 1329 2222 -5.3333333333958333e+00 1329 1331 -5.3333333333333330e+00 1329 1864 -2.1333333333343749e+01 1329 1324 -1.0666666666614583e+01 1329 1863 5.3333333333124999e+00 1329 2208 5.3333333333124999e+00 1329 2220 -5.3333333333958333e+00 1329 1330 -5.3333333333333330e+00 1329 2207 -2.1333333333343749e+01 1329 1321 -1.0666666666614583e+01 1329 2206 5.3333333333124999e+00 1329 1971 -2.1333333333343749e+01 1329 1970 5.3333333333124999e+00 1329 2213 5.3333333333958333e+00 1329 1318 -1.0666666666614583e+01 1329 1328 -5.3333333333333330e+00 1330 1330 3.2000000000124999e+01 1330 1864 -1.4136387421560532e-27 1330 1861 -1.4136387421560532e-27 1330 1863 -1.0666666666677083e+01 1330 1324 -1.0666666666677083e+01 1330 1859 1.2116903504194741e-27 1330 1856 -5.3333333333333330e+00 1330 2207 1.2116903504194741e-27 1330 2208 -1.0666666666677083e+01 1330 2220 -5.3333333333333330e+00 1330 1321 -1.0666666666677083e+01 1330 1329 -5.3333333333333330e+00 1331 1331 3.2000000000124999e+01 1331 2225 1.0097419586828951e-27 1331 2295 -1.0097419586828951e-27 1331 2296 -1.0666666666677083e+01 1331 1327 -1.0666666666677083e+01 1331 1862 -1.2116903504194741e-27 1331 2292 -5.3333333333333330e+00 1331 1864 1.2116903504194741e-27 1331 1865 -1.0666666666677083e+01 1331 2222 -5.3333333333333330e+00 1331 1324 -1.0666666666677083e+01 1331 1329 -5.3333333333333330e+00 1332 1332 3.2000000000124999e+01 1332 1971 -1.4136387421560532e-27 1332 1968 -1.4136387421560532e-27 1332 1972 -1.0666666666677083e+01 1332 1318 -1.0666666666677083e+01 1332 1966 1.2116903504194741e-27 1332 1963 -5.3333333333333330e+00 1332 2225 -1.2116903504194741e-27 1332 2297 -1.0666666666677083e+01 1332 2223 -5.3333333333333330e+00 1332 1327 -1.0666666666677083e+01 1332 1329 -5.3333333333333330e+00 1333 1333 3.2000000000124999e+01 1333 1887 1.4136387421560532e-27 1333 1860 1.2116903504194741e-27 1333 1867 1.2116903504194741e-27 1333 1866 -1.0666666666677083e+01 1333 1884 -5.3333333333333330e+00 1333 1337 -1.0666666666677083e+01 1333 1857 -1.4136387421560532e-27 1333 1893 -1.0666666666677083e+01 1333 1856 -5.3333333333333330e+00 1333 1335 -1.0666666666677083e+01 1334 1334 3.2000000000208331e+01 1335 1335 6.4000000000499995e+01 1335 1884 5.3333333333124999e+00 1335 1895 -1.0416666666666666e-10 1335 1894 2.1333333333291666e+01 1335 1881 1.0416666666666666e-10 1335 1887 -2.1333333333291666e+01 1335 1893 -1.0416666666666666e-10 1335 1857 -2.1333333333291666e+01 1335 1856 5.3333333333124999e+00 1335 1333 -1.0666666666677083e+01 1336 1336 3.2000000000208331e+01 1337 1337 6.4000000000499995e+01 1337 1869 -1.0416666666666666e-10 1337 1856 5.3333333333124999e+00 1337 1868 2.1333333333291666e+01 1337 1853 1.0416666666666666e-10 1337 1860 -2.1333333333291666e+01 1337 1866 -1.0416666666666666e-10 1337 1867 2.1333333333291666e+01 1337 1884 5.3333333333124999e+00 1337 1333 -1.0666666666677083e+01 1338 1338 1.6000000000062499e+01 1339 1339 1.6000000000104166e+01 1340 1340 1.6000000000062499e+01 1341 1341 1.6000000000104166e+01 1342 1342 1.6000000000062499e+01 1343 1343 1.6000000000062499e+01 1344 1344 3.2000000000124999e+01 1344 1863 1.0097419586828951e-27 1344 1866 -1.2116903504194741e-27 1344 1350 -5.3333333333333330e+00 1344 1856 5.3333333333333330e+00 1344 1853 -1.2116903504194741e-27 1344 1860 1.0666666666677083e+01 1344 1347 -1.0666666666677083e+01 1344 1851 1.0097419586828951e-27 1344 1346 -1.0666666666677083e+01 1344 1345 -5.3333333333333330e+00 1344 1861 1.0666666666677083e+01 1345 1345 6.4000000000416662e+01 1345 1862 5.3333333333124999e+00 1345 2293 -5.3333333333124999e+00 1345 1362 -5.3333333333333330e+00 1345 1855 2.1333333333343749e+01 1345 2304 5.3333333333124999e+00 1345 1363 -1.0666666666614583e+01 1345 1875 5.3333333333124999e+00 1345 1364 -5.3333333333333330e+00 1345 1849 2.1333333333343749e+01 1345 1870 -5.3333333333124999e+00 1345 1349 -1.0666666666614583e+01 1345 1868 5.3333333333124999e+00 1345 1348 -5.3333333333333330e+00 1345 1853 2.1333333333343749e+01 1345 1860 -5.3333333333124999e+00 1345 1347 -1.0666666666614583e+01 1345 1851 2.1333333333343749e+01 1345 1346 -1.0666666666614583e+01 1345 1861 -5.3333333333124999e+00 1345 1344 -5.3333333333333330e+00 1346 1346 6.4000000000499995e+01 1346 1862 -1.0416666666666666e-10 1346 2292 -5.3333333333124999e+00 1346 1362 -1.0666666666677083e+01 1346 1865 2.1333333333291666e+01 1346 2222 -5.3333333333124999e+00 1346 1361 -1.0666666666614583e+01 1346 1864 -1.0416666666666666e-10 1346 2220 -5.3333333333124999e+00 1346 1351 -1.0666666666677083e+01 1346 1863 2.1333333333291666e+01 1346 1856 -5.3333333333124999e+00 1346 1350 -1.0666666666614583e+01 1346 1861 1.0416666666666666e-10 1346 1851 -2.1333333333291666e+01 1346 1345 -1.0666666666614583e+01 1346 1344 -1.0666666666677083e+01 1347 1347 6.4000000000499995e+01 1347 1869 2.1333333333291666e+01 1347 1354 -1.0666666666614583e+01 1347 1867 -1.0416666666666666e-10 1347 1884 -5.3333333333124999e+00 1347 1360 -1.0666666666677083e+01 1347 1866 2.1333333333291666e+01 1347 1350 -1.0666666666614583e+01 1347 1856 -5.3333333333124999e+00 1347 1868 -1.0416666666666666e-10 1347 1348 -1.0666666666677083e+01 1347 1860 1.0416666666666666e-10 1347 1853 -2.1333333333291666e+01 1347 1345 -1.0666666666614583e+01 1347 1344 -1.0666666666677083e+01 1348 1348 3.2000000000124999e+01 1348 1869 1.4136387421560532e-27 1348 1872 -1.2116903504194741e-27 1348 1354 -5.3333333333333330e+00 1348 1849 -1.2116903504194741e-27 1348 1870 1.0666666666677083e+01 1348 1349 -1.0666666666677083e+01 1348 1853 1.4136387421560532e-27 1348 1347 -1.0666666666677083e+01 1348 1345 -5.3333333333333330e+00 1348 1868 -1.0666666666677083e+01 1349 1349 6.4000000000499995e+01 1349 1874 2.1333333333291666e+01 1349 1366 -1.0666666666614583e+01 1349 1875 -1.0416666666666666e-10 1349 1364 -1.0666666666677083e+01 1349 1873 -1.0416666666666666e-10 1349 1872 2.1333333333291666e+01 1349 1354 -1.0666666666614583e+01 1349 1357 -1.0666666666677083e+01 1349 1870 1.0416666666666666e-10 1349 1849 -2.1333333333291666e+01 1349 1345 -1.0666666666614583e+01 1349 1348 -1.0666666666677083e+01 1350 1350 6.4000000000416662e+01 1350 1867 5.3333333333124999e+00 1350 1886 -5.3333333333124999e+00 1350 1884 5.3333333333958333e+00 1350 1360 -5.3333333333333330e+00 1350 2242 2.1333333333343749e+01 1350 2254 5.3333333333124999e+00 1350 1355 -1.0666666666614583e+01 1350 2244 5.3333333333124999e+00 1350 2241 -5.3333333333958333e+00 1350 1359 -5.3333333333333330e+00 1350 2240 2.1333333333343749e+01 1350 2221 -5.3333333333124999e+00 1350 1352 -1.0666666666614583e+01 1350 1864 5.3333333333124999e+00 1350 2220 5.3333333333958333e+00 1350 1351 -5.3333333333333330e+00 1350 1863 -2.1333333333343749e+01 1350 1861 -5.3333333333124999e+00 1350 1346 -1.0666666666614583e+01 1350 1866 -2.1333333333343749e+01 1350 1347 -1.0666666666614583e+01 1350 1860 -5.3333333333124999e+00 1350 1856 5.3333333333958333e+00 1350 1344 -5.3333333333333330e+00 1351 1351 3.2000000000124999e+01 1351 1865 1.4136387421560532e-27 1351 2245 -1.0097419586828951e-27 1351 1361 -5.3333333333333330e+00 1351 2222 5.3333333333333330e+00 1351 2240 -1.0097419586828951e-27 1351 2221 1.0666666666677083e+01 1351 1352 -1.0666666666677083e+01 1351 1863 -1.4136387421560532e-27 1351 1346 -1.0666666666677083e+01 1351 1350 -5.3333333333333330e+00 1351 1864 -1.0666666666677083e+01 1351 2220 5.3333333333333330e+00 1352 1352 6.4000000000499995e+01 1352 2053 5.3333333333124999e+00 1352 2051 1.0416666666666666e-10 1352 2050 -5.3333333333124999e+00 1352 1368 -1.0666666666677083e+01 1352 2245 2.1333333333291666e+01 1352 1361 -1.0666666666614583e+01 1352 2222 -5.3333333333124999e+00 1352 2241 5.3333333333124999e+00 1352 2244 -1.0416666666666666e-10 1352 2243 2.1333333333291666e+01 1352 2260 5.3333333333124999e+00 1352 1358 -1.0666666666614583e+01 1352 1359 -1.0666666666677083e+01 1352 2221 1.0416666666666666e-10 1352 2240 -2.1333333333291666e+01 1352 2220 -5.3333333333124999e+00 1352 1350 -1.0666666666614583e+01 1352 1351 -1.0666666666677083e+01 1353 1353 3.2000000000124999e+01 1353 2253 1.2116903504194741e-27 1353 2255 -1.4136387421560532e-27 1353 1358 -5.3333333333333330e+00 1353 2252 -5.3333333333333330e+00 1353 2249 -1.4136387421560532e-27 1353 2250 1.0666666666677083e+01 1353 1356 -1.0666666666677083e+01 1353 2247 1.2116903504194741e-27 1353 1355 -1.0666666666677083e+01 1353 1354 -5.3333333333333330e+00 1353 2251 1.0666666666677083e+01 1354 1354 6.4000000000416662e+01 1354 1886 -5.3333333333124999e+00 1354 1867 5.3333333333124999e+00 1354 1360 -5.3333333333333330e+00 1354 1869 -2.1333333333343749e+01 1354 1868 5.3333333333124999e+00 1354 1347 -1.0666666666614583e+01 1354 1870 -5.3333333333124999e+00 1354 1348 -5.3333333333333330e+00 1354 1872 -2.1333333333343749e+01 1354 1873 5.3333333333124999e+00 1354 1349 -1.0666666666614583e+01 1354 2257 5.3333333333124999e+00 1354 1357 -5.3333333333333330e+00 1354 2249 2.1333333333343749e+01 1354 2250 -5.3333333333124999e+00 1354 1356 -1.0666666666614583e+01 1354 2247 2.1333333333343749e+01 1354 1355 -1.0666666666614583e+01 1354 2251 -5.3333333333124999e+00 1354 1353 -5.3333333333333330e+00 1355 1355 6.4000000000499995e+01 1355 1886 1.0416666666666666e-10 1355 1884 -5.3333333333124999e+00 1355 1360 -1.0666666666677083e+01 1355 2242 -2.1333333333291666e+01 1355 2241 5.3333333333124999e+00 1355 1350 -1.0666666666614583e+01 1355 2254 -1.0416666666666666e-10 1355 2260 5.3333333333124999e+00 1355 1359 -1.0666666666677083e+01 1355 2253 2.1333333333291666e+01 1355 2252 5.3333333333124999e+00 1355 1358 -1.0666666666614583e+01 1355 2251 1.0416666666666666e-10 1355 2247 -2.1333333333291666e+01 1355 1354 -1.0666666666614583e+01 1355 1353 -1.0666666666677083e+01 1356 1356 6.4000000000499995e+01 1356 2258 2.1333333333291666e+01 1356 1366 -1.0666666666614583e+01 1356 2256 -1.0416666666666666e-10 1356 2261 5.3333333333124999e+00 1356 1369 -1.0666666666677083e+01 1356 2255 2.1333333333291666e+01 1356 1358 -1.0666666666614583e+01 1356 2252 5.3333333333124999e+00 1356 2257 -1.0416666666666666e-10 1356 1357 -1.0666666666677083e+01 1356 2250 1.0416666666666666e-10 1356 2249 -2.1333333333291666e+01 1356 1354 -1.0666666666614583e+01 1356 1353 -1.0666666666677083e+01 1357 1357 3.2000000000124999e+01 1357 2258 1.0097419586828951e-27 1357 1874 -1.4136387421560532e-27 1357 1366 -5.3333333333333330e+00 1357 1872 1.4136387421560532e-27 1357 1873 -1.0666666666677083e+01 1357 1349 -1.0666666666677083e+01 1357 2249 1.0097419586828951e-27 1357 1356 -1.0666666666677083e+01 1357 1354 -5.3333333333333330e+00 1357 2257 -1.0666666666677083e+01 1358 1358 6.4000000000416662e+01 1358 2256 5.3333333333124999e+00 1358 2314 5.3333333333124999e+00 1358 2261 -5.3333333333958333e+00 1358 1369 -5.3333333333333330e+00 1358 2262 2.1333333333343749e+01 1358 2052 -5.3333333333124999e+00 1358 1367 -1.0666666666614583e+01 1358 2051 -5.3333333333124999e+00 1358 2053 -5.3333333333958333e+00 1358 1368 -5.3333333333333330e+00 1358 2243 -2.1333333333343749e+01 1358 2244 5.3333333333124999e+00 1358 1352 -1.0666666666614583e+01 1358 2254 5.3333333333124999e+00 1358 2260 -5.3333333333958333e+00 1358 1359 -5.3333333333333330e+00 1358 2253 -2.1333333333343749e+01 1358 2251 -5.3333333333124999e+00 1358 1355 -1.0666666666614583e+01 1358 2255 -2.1333333333343749e+01 1358 1356 -1.0666666666614583e+01 1358 2250 -5.3333333333124999e+00 1358 2252 -5.3333333333958333e+00 1358 1353 -5.3333333333333330e+00 1359 1359 3.2000000000124999e+01 1359 2242 -1.0097419586828951e-27 1359 2240 1.2116903504194741e-27 1359 1350 -5.3333333333333330e+00 1359 2241 -5.3333333333333330e+00 1359 2243 1.2116903504194741e-27 1359 2244 -1.0666666666677083e+01 1359 1352 -1.0666666666677083e+01 1359 2253 -1.0097419586828951e-27 1359 1355 -1.0666666666677083e+01 1359 1358 -5.3333333333333330e+00 1359 2254 -1.0666666666677083e+01 1359 2260 -5.3333333333333330e+00 1360 1360 3.2000000000124999e+01 1360 2247 -1.4136387421560532e-27 1360 1869 -1.0097419586828951e-27 1360 1354 -5.3333333333333330e+00 1360 1866 1.0097419586828951e-27 1360 1867 -1.0666666666677083e+01 1360 1347 -1.0666666666677083e+01 1360 2242 1.4136387421560532e-27 1360 1355 -1.0666666666677083e+01 1360 1350 -5.3333333333333330e+00 1360 1886 1.0666666666677083e+01 1360 1884 5.3333333333333330e+00 1361 1361 6.4000000000416662e+01 1361 2051 -5.3333333333124999e+00 1361 2052 -5.3333333333124999e+00 1361 2050 5.3333333333958333e+00 1361 1368 -5.3333333333333330e+00 1361 2303 2.1333333333343749e+01 1361 2313 -5.3333333333124999e+00 1361 1367 -1.0666666666614583e+01 1361 2306 5.3333333333124999e+00 1361 2302 -5.3333333333958333e+00 1361 1365 -5.3333333333333330e+00 1361 2301 2.1333333333343749e+01 1361 2293 -5.3333333333124999e+00 1361 1363 -1.0666666666614583e+01 1361 1862 5.3333333333124999e+00 1361 2292 5.3333333333958333e+00 1361 1362 -5.3333333333333330e+00 1361 1865 -2.1333333333343749e+01 1361 1864 5.3333333333124999e+00 1361 1346 -1.0666666666614583e+01 1361 2245 -2.1333333333343749e+01 1361 1352 -1.0666666666614583e+01 1361 2221 -5.3333333333124999e+00 1361 2222 5.3333333333958333e+00 1361 1351 -5.3333333333333330e+00 1362 1362 3.2000000000124999e+01 1362 1851 -1.2116903504194741e-27 1362 1855 1.4136387421560532e-27 1362 1345 -5.3333333333333330e+00 1362 2301 -1.4136387421560532e-27 1362 2293 1.0666666666677083e+01 1362 1363 -1.0666666666677083e+01 1362 1865 -1.2116903504194741e-27 1362 1346 -1.0666666666677083e+01 1362 1361 -5.3333333333333330e+00 1362 1862 -1.0666666666677083e+01 1362 2292 5.3333333333333330e+00 1363 1363 6.4000000000499995e+01 1363 2302 5.3333333333124999e+00 1363 2306 -1.0416666666666666e-10 1363 2305 2.1333333333291666e+01 1363 1366 -1.0666666666614583e+01 1363 1365 -1.0666666666677083e+01 1363 2304 -1.0416666666666666e-10 1363 1855 -2.1333333333291666e+01 1363 1345 -1.0666666666614583e+01 1363 1364 -1.0666666666677083e+01 1363 2293 1.0416666666666666e-10 1363 2301 -2.1333333333291666e+01 1363 2292 -5.3333333333124999e+00 1363 1361 -1.0666666666614583e+01 1363 1362 -1.0666666666677083e+01 1364 1364 3.2000000000124999e+01 1364 1874 1.0097419586828951e-27 1364 2305 -1.2116903504194741e-27 1364 1366 -5.3333333333333330e+00 1364 1855 -1.2116903504194741e-27 1364 2304 -1.0666666666677083e+01 1364 1363 -1.0666666666677083e+01 1364 1849 1.0097419586828951e-27 1364 1349 -1.0666666666677083e+01 1364 1345 -5.3333333333333330e+00 1364 1875 -1.0666666666677083e+01 1365 1365 3.2000000000124999e+01 1365 2303 -1.4136387421560532e-27 1365 2301 1.0097419586828951e-27 1365 1361 -5.3333333333333330e+00 1365 2302 -5.3333333333333330e+00 1365 2305 1.0097419586828951e-27 1365 2306 -1.0666666666677083e+01 1365 1363 -1.0666666666677083e+01 1365 2311 1.4136387421560532e-27 1365 1367 -1.0666666666677083e+01 1365 1366 -5.3333333333333330e+00 1365 2313 1.0666666666677083e+01 1366 1366 6.4000000000416662e+01 1366 2314 5.3333333333124999e+00 1366 2256 5.3333333333124999e+00 1366 1369 -5.3333333333333330e+00 1366 2258 -2.1333333333343749e+01 1366 2257 5.3333333333124999e+00 1366 1356 -1.0666666666614583e+01 1366 1873 5.3333333333124999e+00 1366 1357 -5.3333333333333330e+00 1366 1874 -2.1333333333343749e+01 1366 1875 5.3333333333124999e+00 1366 1349 -1.0666666666614583e+01 1366 2304 5.3333333333124999e+00 1366 1364 -5.3333333333333330e+00 1366 2305 -2.1333333333343749e+01 1366 2306 5.3333333333124999e+00 1366 1363 -1.0666666666614583e+01 1366 2311 2.1333333333343749e+01 1366 1367 -1.0666666666614583e+01 1366 2313 -5.3333333333124999e+00 1366 1365 -5.3333333333333330e+00 1367 1367 6.4000000000499995e+01 1367 2314 -1.0416666666666666e-10 1367 2261 5.3333333333124999e+00 1367 1369 -1.0666666666677083e+01 1367 2262 -2.1333333333291666e+01 1367 2053 5.3333333333124999e+00 1367 1358 -1.0666666666614583e+01 1367 2052 1.0416666666666666e-10 1367 2050 -5.3333333333124999e+00 1367 1368 -1.0666666666677083e+01 1367 2303 -2.1333333333291666e+01 1367 2302 5.3333333333124999e+00 1367 1361 -1.0666666666614583e+01 1367 2313 1.0416666666666666e-10 1367 2311 -2.1333333333291666e+01 1367 1366 -1.0666666666614583e+01 1367 1365 -1.0666666666677083e+01 1368 1368 3.2000000000124999e+01 1368 2262 -1.2116903504194741e-27 1368 2243 -1.4136387421560532e-27 1368 1358 -5.3333333333333330e+00 1368 2053 -5.3333333333333330e+00 1368 2245 1.4136387421560532e-27 1368 2051 1.0666666666677083e+01 1368 1352 -1.0666666666677083e+01 1368 2303 1.2116903504194741e-27 1368 1367 -1.0666666666677083e+01 1368 1361 -5.3333333333333330e+00 1368 2052 1.0666666666677083e+01 1368 2050 5.3333333333333330e+00 1369 1369 3.2000000000124999e+01 1369 2311 -1.0097419586828951e-27 1369 2258 -1.2116903504194741e-27 1369 1366 -5.3333333333333330e+00 1369 2255 1.2116903504194741e-27 1369 2256 -1.0666666666677083e+01 1369 1356 -1.0666666666677083e+01 1369 2262 1.0097419586828951e-27 1369 1367 -1.0666666666677083e+01 1369 1358 -5.3333333333333330e+00 1369 2314 -1.0666666666677083e+01 1369 2261 -5.3333333333333330e+00 1370 1370 1.6000000000062499e+01 1371 1371 1.6000000000104166e+01 1372 1372 6.4000000000499995e+01 1372 1907 -5.3333333333124999e+00 1372 1900 -1.0416666666666666e-10 1372 1901 2.1333333333291666e+01 1372 1898 -1.0416666666666666e-10 1372 1899 2.1333333333291666e+01 1372 1902 -5.3333333333124999e+00 1372 1373 -1.0666666666677083e+01 1372 1877 1.0416666666666666e-10 1372 1896 -2.1333333333291666e+01 1373 1373 4.8000000000312497e+01 1373 1901 -1.2116903504194741e-27 1373 1924 5.3333333333229165e+00 1373 1907 2.4000000000010417e+01 1373 2189 -1.0666666666625000e+01 1373 1378 -5.3333333333437496e+00 1373 1904 1.0666666666625000e+01 1373 1903 -1.0666666666791667e+01 1373 2174 5.3333333333020834e+00 1373 1375 -1.0666666666645833e+01 1373 1899 1.2116903504194741e-27 1373 1898 -1.0666666666677083e+01 1373 1902 1.3333333333322916e+01 1373 1372 -1.0666666666677083e+01 1374 1374 2.6666666666937495e+01 1375 1375 4.2666666667041667e+01 1375 1902 -5.3333333333124999e+00 1375 2184 1.0666666666625000e+01 1375 2176 -4.1666666666666665e-11 1375 1924 -1.0666666666687499e+01 1375 1904 -1.5999999999958334e+01 1375 1903 1.0666666666625000e+01 1375 2174 -1.0666666666833333e+01 1375 1373 -1.0666666666645833e+01 1375 1378 -1.0666666666729165e+01 1375 2172 1.5999999999958334e+01 1375 2173 1.0666666666687499e+01 1376 1376 3.2000000000249997e+01 1377 1377 1.0666666666833333e+01 1378 1378 2.1333333333499997e+01 1378 2172 -5.3333333333229165e+00 1378 2184 -5.3333333333437496e+00 1378 1907 -5.3333333333229165e+00 1378 2189 1.0666666666729165e+01 1378 2174 2.0833333333333339e-11 1378 1373 -5.3333333333437496e+00 1378 1904 5.3333333333229165e+00 1378 1903 -5.3333333333437496e+00 1378 1375 -1.0666666666729165e+01 1379 1379 2.1333333333458331e+01 1380 1380 1.6000000000062499e+01 1381 1381 3.7333333333729158e+01 1382 1382 1.6000000000062499e+01 1383 1383 3.2000000000208331e+01 1384 1384 6.4000000000499995e+01 1384 1884 5.3333333333124999e+00 1384 2242 1.0416666666666666e-10 1384 2241 -5.3333333333124999e+00 1384 1391 -1.0666666666677083e+01 1384 2254 2.1333333333291666e+01 1384 1390 -1.0666666666614583e+01 1384 2260 -5.3333333333124999e+00 1384 2253 -1.0416666666666666e-10 1384 2252 -5.3333333333124999e+00 1384 1389 -1.0666666666677083e+01 1384 2251 -2.1333333333291666e+01 1384 2247 1.0416666666666666e-10 1384 1886 -2.1333333333291666e+01 1385 1385 1.6000000000062499e+01 1386 1386 3.2000000000208331e+01 1387 1387 6.4000000000499995e+01 1387 2265 -5.3333333333124999e+00 1387 1892 -1.0416666666666666e-10 1387 2263 -5.3333333333124999e+00 1387 1392 -1.0666666666677083e+01 1387 1891 2.1333333333291666e+01 1387 1390 -1.0666666666614583e+01 1387 2241 -5.3333333333124999e+00 1387 1890 -1.0416666666666666e-10 1387 1884 5.3333333333124999e+00 1387 1391 -1.0666666666677083e+01 1387 1888 -2.1333333333291666e+01 1387 1879 1.0416666666666666e-10 1387 1889 2.1333333333291666e+01 1388 1388 3.2000000000208331e+01 1389 1389 3.2000000000124999e+01 1389 2252 5.3333333333333330e+00 1389 2260 5.3333333333333330e+00 1389 1390 -5.3333333333333330e+00 1389 2254 -1.0097419586828951e-27 1389 2251 -1.0097419586828951e-27 1389 2253 -1.0666666666677083e+01 1389 1384 -1.0666666666677083e+01 1389 804 -1.4136387421560532e-27 1389 806 1.4136387421560532e-27 1389 805 -1.0666666666677083e+01 1389 436 -1.0666666666677083e+01 1390 1390 6.4000000000416662e+01 1390 2263 5.3333333333958333e+00 1390 1392 -5.3333333333333330e+00 1390 2260 5.3333333333958333e+00 1390 1389 -5.3333333333333330e+00 1390 1892 5.3333333333124999e+00 1390 1891 -2.1333333333343749e+01 1390 1387 -1.0666666666614583e+01 1390 1890 5.3333333333124999e+00 1390 2242 -5.3333333333124999e+00 1390 2241 5.3333333333958333e+00 1390 1391 -5.3333333333333330e+00 1390 2254 -2.1333333333343749e+01 1390 1384 -1.0666666666614583e+01 1390 2253 5.3333333333124999e+00 1390 807 5.3333333333124999e+00 1390 1071 -5.3333333333124999e+00 1390 1033 -5.3333333333958333e+00 1390 440 -5.3333333333333330e+00 1390 1034 2.1333333333343749e+01 1390 439 -1.0666666666614583e+01 1390 1054 -5.3333333333124999e+00 1390 806 -2.1333333333343749e+01 1390 805 5.3333333333124999e+00 1390 436 -1.0666666666614583e+01 1391 1391 3.2000000000124999e+01 1391 1891 -1.2116903504194741e-27 1391 1888 -1.2116903504194741e-27 1391 1890 -1.0666666666677083e+01 1391 1387 -1.0666666666677083e+01 1391 1886 1.4136387421560532e-27 1391 1884 -5.3333333333333330e+00 1391 2254 1.4136387421560532e-27 1391 2242 1.0666666666677083e+01 1391 2241 5.3333333333333330e+00 1391 1384 -1.0666666666677083e+01 1391 1390 -5.3333333333333330e+00 1392 1392 3.2000000000124999e+01 1392 1390 -5.3333333333333330e+00 1392 2263 5.3333333333333330e+00 1392 2265 5.3333333333333330e+00 1392 1889 -1.4136387421560532e-27 1392 1891 1.4136387421560532e-27 1392 1892 -1.0666666666677083e+01 1392 1387 -1.0666666666677083e+01 1392 1034 1.0097419586828951e-27 1392 1074 -1.0097419586828951e-27 1392 1054 1.0666666666677083e+01 1392 439 -1.0666666666677083e+01 1393 1393 3.2000000000124999e+01 1393 1890 1.0097419586828951e-27 1393 1893 -1.4136387421560532e-27 1393 1412 -5.3333333333333330e+00 1393 1884 5.3333333333333330e+00 1393 1881 -1.4136387421560532e-27 1393 1887 1.0666666666677083e+01 1393 1396 -1.0666666666677083e+01 1393 1879 1.0097419586828951e-27 1393 1395 -1.0666666666677083e+01 1393 1394 -5.3333333333333330e+00 1393 1888 1.0666666666677083e+01 1394 1394 6.4000000000416662e+01 1394 1889 5.3333333333124999e+00 1394 1922 5.3333333333124999e+00 1394 1418 -5.3333333333333330e+00 1394 1883 2.1333333333343749e+01 1394 1923 5.3333333333124999e+00 1394 1402 -1.0666666666614583e+01 1394 1899 5.3333333333124999e+00 1394 1403 -5.3333333333333330e+00 1394 1877 2.1333333333343749e+01 1394 1896 -5.3333333333124999e+00 1394 1398 -1.0666666666614583e+01 1394 1894 5.3333333333124999e+00 1394 1397 -5.3333333333333330e+00 1394 1881 2.1333333333343749e+01 1394 1887 -5.3333333333124999e+00 1394 1396 -1.0666666666614583e+01 1394 1879 2.1333333333343749e+01 1394 1395 -1.0666666666614583e+01 1394 1888 -5.3333333333124999e+00 1394 1393 -5.3333333333333330e+00 1395 1395 6.4000000000499995e+01 1395 1889 -1.0416666666666666e-10 1395 2265 5.3333333333124999e+00 1395 1418 -1.0666666666677083e+01 1395 1892 2.1333333333291666e+01 1395 2263 5.3333333333124999e+00 1395 1415 -1.0666666666614583e+01 1395 1891 -1.0416666666666666e-10 1395 2241 5.3333333333124999e+00 1395 1414 -1.0666666666677083e+01 1395 1890 2.1333333333291666e+01 1395 1884 -5.3333333333124999e+00 1395 1412 -1.0666666666614583e+01 1395 1888 1.0416666666666666e-10 1395 1879 -2.1333333333291666e+01 1395 1394 -1.0666666666614583e+01 1395 1393 -1.0666666666677083e+01 1396 1396 6.4000000000499995e+01 1396 1884 -5.3333333333124999e+00 1396 1895 2.1333333333291666e+01 1396 1405 -1.0666666666614583e+01 1396 1857 1.0416666666666666e-10 1396 1893 2.1333333333291666e+01 1396 1856 -5.3333333333124999e+00 1396 1412 -1.0666666666614583e+01 1396 1413 -1.0666666666677083e+01 1396 1894 -1.0416666666666666e-10 1396 1397 -1.0666666666677083e+01 1396 1887 1.0416666666666666e-10 1396 1881 -2.1333333333291666e+01 1396 1394 -1.0666666666614583e+01 1396 1393 -1.0666666666677083e+01 1397 1397 3.2000000000124999e+01 1397 1895 1.2116903504194741e-27 1397 1900 -1.4136387421560532e-27 1397 1405 -5.3333333333333330e+00 1397 1877 -1.4136387421560532e-27 1397 1896 1.0666666666677083e+01 1397 1398 -1.0666666666677083e+01 1397 1881 1.2116903504194741e-27 1397 1396 -1.0666666666677083e+01 1397 1394 -5.3333333333333330e+00 1397 1894 -1.0666666666677083e+01 1398 1398 6.4000000000499995e+01 1398 1907 5.3333333333124999e+00 1398 1901 -1.0416666666666666e-10 1398 1900 2.1333333333291666e+01 1398 1405 -1.0666666666614583e+01 1398 1408 -1.0666666666677083e+01 1398 1899 -1.0416666666666666e-10 1398 1898 2.1333333333291666e+01 1398 1902 5.3333333333124999e+00 1398 1400 -1.0666666666614583e+01 1398 1403 -1.0666666666677083e+01 1398 1896 1.0416666666666666e-10 1398 1877 -2.1333333333291666e+01 1398 1394 -1.0666666666614583e+01 1398 1397 -1.0666666666677083e+01 1399 1399 3.2000000000124999e+01 1399 1918 1.2116903504194741e-27 1399 1921 -1.0097419586828951e-27 1399 1415 -5.3333333333333330e+00 1399 1916 -5.3333333333333330e+00 1399 1909 -1.0097419586828951e-27 1399 1913 1.0666666666677083e+01 1399 1402 -1.0666666666677083e+01 1399 1906 1.2116903504194741e-27 1399 1401 -1.0666666666677083e+01 1399 1400 -5.3333333333333330e+00 1399 1914 1.0666666666677083e+01 1399 1908 -5.3333333333333330e+00 1400 1400 6.4000000000416662e+01 1400 1917 5.3333333333124999e+00 1400 2210 5.3333333333124999e+00 1400 1905 -5.3333333333958333e+00 1400 1417 -5.3333333333333330e+00 1400 1910 2.1333333333343749e+01 1400 2211 5.3333333333124999e+00 1400 1407 -1.0666666666614583e+01 1400 1901 5.3333333333124999e+00 1400 1907 -5.3333333333958333e+00 1400 1408 -5.3333333333333330e+00 1400 1898 -2.1333333333343749e+01 1400 1899 5.3333333333124999e+00 1400 1398 -1.0666666666614583e+01 1400 1923 5.3333333333124999e+00 1400 1902 -5.3333333333958333e+00 1400 1403 -5.3333333333333330e+00 1400 1909 2.1333333333343749e+01 1400 1913 -5.3333333333124999e+00 1400 1402 -1.0666666666614583e+01 1400 1906 2.1333333333343749e+01 1400 1401 -1.0666666666614583e+01 1400 1914 -5.3333333333124999e+00 1400 1908 -5.3333333333958333e+00 1400 1399 -5.3333333333333330e+00 1401 1401 6.4000000000499995e+01 1401 1905 5.3333333333124999e+00 1401 1917 -1.0416666666666666e-10 1401 2215 5.3333333333124999e+00 1401 1417 -1.0666666666677083e+01 1401 1920 2.1333333333291666e+01 1401 2216 5.3333333333124999e+00 1401 1409 -1.0666666666614583e+01 1401 1919 -1.0416666666666666e-10 1401 2264 5.3333333333124999e+00 1401 1416 -1.0666666666677083e+01 1401 1918 2.1333333333291666e+01 1401 1916 5.3333333333124999e+00 1401 1415 -1.0666666666614583e+01 1401 1914 1.0416666666666666e-10 1401 1906 -2.1333333333291666e+01 1401 1400 -1.0666666666614583e+01 1401 1908 5.3333333333124999e+00 1401 1399 -1.0666666666677083e+01 1402 1402 6.4000000000499995e+01 1402 1883 -2.1333333333291666e+01 1402 1394 -1.0666666666614583e+01 1402 1922 -1.0416666666666666e-10 1402 2265 5.3333333333124999e+00 1402 1418 -1.0666666666677083e+01 1402 1921 2.1333333333291666e+01 1402 1415 -1.0666666666614583e+01 1402 1916 5.3333333333124999e+00 1402 1923 -1.0416666666666666e-10 1402 1902 5.3333333333124999e+00 1402 1403 -1.0666666666677083e+01 1402 1913 1.0416666666666666e-10 1402 1909 -2.1333333333291666e+01 1402 1908 5.3333333333124999e+00 1402 1400 -1.0666666666614583e+01 1402 1399 -1.0666666666677083e+01 1403 1403 3.2000000000124999e+01 1403 1883 -1.4136387421560532e-27 1403 1877 1.0097419586828951e-27 1403 1394 -5.3333333333333330e+00 1403 1898 1.0097419586828951e-27 1403 1899 -1.0666666666677083e+01 1403 1398 -1.0666666666677083e+01 1403 1909 1.4136387421560532e-27 1403 1402 -1.0666666666677083e+01 1403 1400 -5.3333333333333330e+00 1403 1923 -1.0666666666677083e+01 1403 1902 -5.3333333333333330e+00 1404 1404 3.2000000000124999e+01 1404 2206 1.4136387421560532e-27 1404 2209 -1.2116903504194741e-27 1404 1409 -5.3333333333333330e+00 1404 2202 5.3333333333333330e+00 1404 2201 -1.2116903504194741e-27 1404 2204 1.0666666666677083e+01 1404 1407 -1.0666666666677083e+01 1404 2199 1.4136387421560532e-27 1404 1406 -1.0666666666677083e+01 1404 1405 -5.3333333333333330e+00 1404 2205 1.0666666666677083e+01 1405 1405 6.4000000000416662e+01 1405 1859 -5.3333333333124999e+00 1405 1857 -5.3333333333124999e+00 1405 1413 -5.3333333333333330e+00 1405 1895 -2.1333333333343749e+01 1405 1894 5.3333333333124999e+00 1405 1396 -1.0666666666614583e+01 1405 1896 -5.3333333333124999e+00 1405 1397 -5.3333333333333330e+00 1405 1900 -2.1333333333343749e+01 1405 1901 5.3333333333124999e+00 1405 1398 -1.0666666666614583e+01 1405 2211 5.3333333333124999e+00 1405 1408 -5.3333333333333330e+00 1405 2201 2.1333333333343749e+01 1405 2204 -5.3333333333124999e+00 1405 1407 -1.0666666666614583e+01 1405 2199 2.1333333333343749e+01 1405 1406 -1.0666666666614583e+01 1405 2205 -5.3333333333124999e+00 1405 1404 -5.3333333333333330e+00 1406 1406 6.4000000000499995e+01 1406 1859 1.0416666666666666e-10 1406 1856 -5.3333333333124999e+00 1406 1413 -1.0666666666677083e+01 1406 2208 2.1333333333291666e+01 1406 2220 -5.3333333333124999e+00 1406 1412 -1.0666666666614583e+01 1406 2207 -1.0416666666666666e-10 1406 2213 5.3333333333124999e+00 1406 1410 -1.0666666666677083e+01 1406 2206 2.1333333333291666e+01 1406 2202 -5.3333333333124999e+00 1406 1409 -1.0666666666614583e+01 1406 2205 1.0416666666666666e-10 1406 2199 -2.1333333333291666e+01 1406 1405 -1.0666666666614583e+01 1406 1404 -1.0666666666677083e+01 1407 1407 6.4000000000499995e+01 1407 1905 5.3333333333124999e+00 1407 1910 -2.1333333333291666e+01 1407 1907 5.3333333333124999e+00 1407 1400 -1.0666666666614583e+01 1407 2210 -1.0416666666666666e-10 1407 2215 5.3333333333124999e+00 1407 1417 -1.0666666666677083e+01 1407 2209 2.1333333333291666e+01 1407 1409 -1.0666666666614583e+01 1407 2202 -5.3333333333124999e+00 1407 2211 -1.0416666666666666e-10 1407 1408 -1.0666666666677083e+01 1407 2204 1.0416666666666666e-10 1407 2201 -2.1333333333291666e+01 1407 1405 -1.0666666666614583e+01 1407 1404 -1.0666666666677083e+01 1408 1408 3.2000000000124999e+01 1408 1910 -1.0097419586828951e-27 1408 1898 -1.2116903504194741e-27 1408 1400 -5.3333333333333330e+00 1408 1907 -5.3333333333333330e+00 1408 1900 1.2116903504194741e-27 1408 1901 -1.0666666666677083e+01 1408 1398 -1.0666666666677083e+01 1408 2201 1.0097419586828951e-27 1408 1407 -1.0666666666677083e+01 1408 1405 -5.3333333333333330e+00 1408 2211 -1.0666666666677083e+01 1409 1409 6.4000000000416662e+01 1409 2210 5.3333333333124999e+00 1409 1917 5.3333333333124999e+00 1409 2215 -5.3333333333958333e+00 1409 1417 -5.3333333333333330e+00 1409 1920 -2.1333333333343749e+01 1409 1919 5.3333333333124999e+00 1409 1401 -1.0666666666614583e+01 1409 2239 5.3333333333124999e+00 1409 2216 -5.3333333333958333e+00 1409 1416 -5.3333333333333330e+00 1409 2214 2.1333333333343749e+01 1409 2219 -5.3333333333124999e+00 1409 1411 -1.0666666666614583e+01 1409 2207 5.3333333333124999e+00 1409 2213 -5.3333333333958333e+00 1409 1410 -5.3333333333333330e+00 1409 2206 -2.1333333333343749e+01 1409 2205 -5.3333333333124999e+00 1409 1406 -1.0666666666614583e+01 1409 2209 -2.1333333333343749e+01 1409 1407 -1.0666666666614583e+01 1409 2204 -5.3333333333124999e+00 1409 2202 5.3333333333958333e+00 1409 1404 -5.3333333333333330e+00 1410 1410 3.2000000000124999e+01 1410 2208 1.0097419586828951e-27 1410 2236 -1.4136387421560532e-27 1410 1412 -5.3333333333333330e+00 1410 2220 5.3333333333333330e+00 1410 2214 -1.4136387421560532e-27 1410 2219 1.0666666666677083e+01 1410 1411 -1.0666666666677083e+01 1410 2206 -1.0097419586828951e-27 1410 1406 -1.0666666666677083e+01 1410 1409 -5.3333333333333330e+00 1410 2207 -1.0666666666677083e+01 1410 2213 -5.3333333333333330e+00 1411 1411 6.4000000000499995e+01 1411 2263 5.3333333333124999e+00 1411 2216 5.3333333333124999e+00 1411 2239 -1.0416666666666666e-10 1411 2238 2.1333333333291666e+01 1411 2264 5.3333333333124999e+00 1411 1415 -1.0666666666614583e+01 1411 1416 -1.0666666666677083e+01 1411 2237 -1.0416666666666666e-10 1411 2241 5.3333333333124999e+00 1411 1414 -1.0666666666677083e+01 1411 2236 2.1333333333291666e+01 1411 1412 -1.0666666666614583e+01 1411 2220 -5.3333333333124999e+00 1411 2219 1.0416666666666666e-10 1411 2214 -2.1333333333291666e+01 1411 2213 5.3333333333124999e+00 1411 1409 -1.0666666666614583e+01 1411 1410 -1.0666666666677083e+01 1412 1412 6.4000000000416662e+01 1412 2237 5.3333333333124999e+00 1412 1891 5.3333333333124999e+00 1412 2241 -5.3333333333958333e+00 1412 1414 -5.3333333333333330e+00 1412 1890 -2.1333333333343749e+01 1412 1888 -5.3333333333124999e+00 1412 1395 -1.0666666666614583e+01 1412 1887 -5.3333333333124999e+00 1412 1884 5.3333333333958333e+00 1412 1393 -5.3333333333333330e+00 1412 1893 -2.1333333333343749e+01 1412 1857 -5.3333333333124999e+00 1412 1396 -1.0666666666614583e+01 1412 1859 -5.3333333333124999e+00 1412 1856 5.3333333333958333e+00 1412 1413 -5.3333333333333330e+00 1412 2208 -2.1333333333343749e+01 1412 2207 5.3333333333124999e+00 1412 1406 -1.0666666666614583e+01 1412 2236 -2.1333333333343749e+01 1412 1411 -1.0666666666614583e+01 1412 2219 -5.3333333333124999e+00 1412 2220 5.3333333333958333e+00 1412 1410 -5.3333333333333330e+00 1413 1413 3.2000000000124999e+01 1413 2199 -1.2116903504194741e-27 1413 1895 -1.0097419586828951e-27 1413 1405 -5.3333333333333330e+00 1413 1893 1.0097419586828951e-27 1413 1857 1.0666666666677083e+01 1413 1396 -1.0666666666677083e+01 1413 2208 -1.2116903504194741e-27 1413 1406 -1.0666666666677083e+01 1413 1412 -5.3333333333333330e+00 1413 1859 1.0666666666677083e+01 1413 1856 5.3333333333333330e+00 1414 1414 3.2000000000124999e+01 1414 1892 1.2116903504194741e-27 1414 2238 -1.0097419586828951e-27 1414 1415 -5.3333333333333330e+00 1414 2263 -5.3333333333333330e+00 1414 2236 1.0097419586828951e-27 1414 2237 -1.0666666666677083e+01 1414 1411 -1.0666666666677083e+01 1414 1890 -1.2116903504194741e-27 1414 1395 -1.0666666666677083e+01 1414 1412 -5.3333333333333330e+00 1414 1891 -1.0666666666677083e+01 1414 2241 -5.3333333333333330e+00 1415 1415 6.4000000000416662e+01 1415 1922 5.3333333333124999e+00 1415 1889 5.3333333333124999e+00 1415 2265 -5.3333333333958333e+00 1415 1418 -5.3333333333333330e+00 1415 1892 -2.1333333333343749e+01 1415 1891 5.3333333333124999e+00 1415 1395 -1.0666666666614583e+01 1415 2237 5.3333333333124999e+00 1415 2263 -5.3333333333958333e+00 1415 1414 -5.3333333333333330e+00 1415 2238 -2.1333333333343749e+01 1415 2239 5.3333333333124999e+00 1415 1411 -1.0666666666614583e+01 1415 1919 5.3333333333124999e+00 1415 2264 -5.3333333333958333e+00 1415 1416 -5.3333333333333330e+00 1415 1918 -2.1333333333343749e+01 1415 1914 -5.3333333333124999e+00 1415 1401 -1.0666666666614583e+01 1415 1921 -2.1333333333343749e+01 1415 1402 -1.0666666666614583e+01 1415 1913 -5.3333333333124999e+00 1415 1916 -5.3333333333958333e+00 1415 1399 -5.3333333333333330e+00 1416 1416 3.2000000000124999e+01 1416 1920 1.4136387421560532e-27 1416 2214 1.2116903504194741e-27 1416 1409 -5.3333333333333330e+00 1416 2216 -5.3333333333333330e+00 1416 2238 1.2116903504194741e-27 1416 2239 -1.0666666666677083e+01 1416 1411 -1.0666666666677083e+01 1416 1918 -1.4136387421560532e-27 1416 1401 -1.0666666666677083e+01 1416 1415 -5.3333333333333330e+00 1416 1919 -1.0666666666677083e+01 1416 2264 -5.3333333333333330e+00 1417 1417 3.2000000000124999e+01 1417 1906 -1.0097419586828951e-27 1417 1910 1.4136387421560532e-27 1417 1400 -5.3333333333333330e+00 1417 1905 -5.3333333333333330e+00 1417 2209 1.4136387421560532e-27 1417 2210 -1.0666666666677083e+01 1417 1407 -1.0666666666677083e+01 1417 1920 -1.0097419586828951e-27 1417 1401 -1.0666666666677083e+01 1417 1409 -5.3333333333333330e+00 1417 1917 -1.0666666666677083e+01 1417 2215 -5.3333333333333330e+00 1418 1418 3.2000000000124999e+01 1418 1879 -1.4136387421560532e-27 1418 1883 1.2116903504194741e-27 1418 1394 -5.3333333333333330e+00 1418 1921 1.2116903504194741e-27 1418 1922 -1.0666666666677083e+01 1418 1402 -1.0666666666677083e+01 1418 1892 -1.4136387421560532e-27 1418 1395 -1.0666666666677083e+01 1418 1415 -5.3333333333333330e+00 1418 1889 -1.0666666666677083e+01 1418 2265 -5.3333333333333330e+00 1419 1419 3.2000000000249997e+01 1419 2176 -4.1666666666666665e-11 1419 2195 -5.3333333333124999e+00 1419 2179 1.0666666666687499e+01 1419 1908 -5.3333333333124999e+00 1419 1904 4.1666666666666665e-11 1419 1902 -5.3333333333124999e+00 1419 1924 -1.0666666666687499e+01 1419 1427 -1.0666666666687499e+01 1419 2175 -4.1666666666666665e-11 1419 1421 4.1666666666666665e-11 1419 1912 5.3333333333124999e+00 1419 1911 -1.0666666666687499e+01 1419 1420 -1.0666666666687499e+01 1420 1420 4.2666666666916662e+01 1420 2179 -5.3333333333229165e+00 1420 1736 -5.3333333333229165e+00 1420 1728 6.2500000000000004e-11 1420 2195 2.1333333333312499e+01 1420 1729 -5.3333333333229165e+00 1420 1422 -1.0666666666687499e+01 1420 2175 6.2499999999999991e-11 1420 1912 -2.1333333333312499e+01 1420 1911 5.3333333333229165e+00 1420 1421 -1.0666666666666666e+01 1420 1419 -1.0666666666687499e+01 1421 1421 5.3333333333874990e+01 1421 1915 -2.6666666665937502e+00 1421 1429 -8.0000000000000000e+00 1421 1916 5.3333333333958333e+00 1421 1424 -5.3333333333333330e+00 1421 1921 5.3333333333124999e+00 1421 1904 1.0416666666666666e-11 1421 1726 -1.0416666666666666e-11 1421 1736 6.2499999999999991e-11 1421 1728 -1.0416666666666666e-11 1421 1422 4.1666666666666665e-11 1421 1913 2.1333333333343749e+01 1421 1909 -5.3333333333124999e+00 1421 1908 -2.6666666665937497e+00 1421 1426 -1.0666666666614583e+01 1421 1427 -8.0000000000000000e+00 1421 1911 -6.2499999999999991e-11 1421 2175 -1.0416666666666666e-11 1421 1419 4.1666666666666665e-11 1421 1912 1.0666666666583334e+01 1421 1420 -1.0666666666666666e+01 1421 1027 -5.3333333333124999e+00 1421 1055 2.1333333333343749e+01 1421 1053 -5.3333333333124999e+00 1421 492 -1.0666666666614583e+01 1422 1422 3.2000000000249997e+01 1422 1720 -4.1666666666666665e-11 1422 2196 -5.3333333333124999e+00 1422 1727 1.0666666666687499e+01 1422 1726 -4.1666666666666665e-11 1422 1915 -5.3333333333124999e+00 1422 1429 -1.0666666666687499e+01 1422 1421 4.1666666666666665e-11 1422 1912 5.3333333333124999e+00 1422 1736 1.0666666666687499e+01 1422 1728 -4.1666666666666665e-11 1422 2195 -5.3333333333124999e+00 1422 1729 1.0666666666687499e+01 1422 1420 -1.0666666666687499e+01 1423 1423 2.1333333333666662e+01 1424 1424 3.2000000000124999e+01 1424 2265 5.3333333333333330e+00 1424 1916 5.3333333333333330e+00 1424 1421 -5.3333333333333330e+00 1424 1913 1.0097419586828951e-27 1424 1922 1.0097419586828951e-27 1424 1921 -1.0666666666677083e+01 1424 1426 -1.0666666666677083e+01 1424 1058 -1.4136387421560532e-27 1424 1055 -1.4136387421560532e-27 1424 1053 1.0666666666677083e+01 1424 492 -1.0666666666677083e+01 1425 1425 3.2000000000208331e+01 1426 1426 6.4000000000499995e+01 1426 1883 1.0416666666666666e-10 1426 1916 -5.3333333333124999e+00 1426 1923 2.1333333333291666e+01 1426 1902 -5.3333333333124999e+00 1426 1909 1.0416666666666666e-10 1426 1913 -2.1333333333291666e+01 1426 1908 -5.3333333333124999e+00 1426 1421 -1.0666666666614583e+01 1426 1427 -1.0666666666677083e+01 1426 1921 -1.0416666666666666e-10 1426 1922 2.1333333333291666e+01 1426 2265 -5.3333333333124999e+00 1426 1424 -1.0666666666677083e+01 1427 1427 3.7333333333520827e+01 1427 1911 5.3333333333229165e+00 1427 1904 -6.2499999999999991e-11 1427 1924 5.3333333333229165e+00 1427 1419 -1.0666666666687499e+01 1427 1923 -1.4136387421560532e-27 1427 1902 1.3333333333322916e+01 1427 1913 -1.4136387421560532e-27 1427 1909 1.0666666666677083e+01 1427 1908 1.3333333333322916e+01 1427 1426 -1.0666666666677083e+01 1427 1421 -8.0000000000000000e+00 1428 1428 2.6666666666937495e+01 1429 1429 3.7333333333520827e+01 1429 1421 -8.0000000000000000e+00 1429 1915 1.3333333333322916e+01 1429 2196 1.3333333333322916e+01 1429 1727 -5.3333333333229165e+00 1429 1726 6.2499999999999991e-11 1429 1736 -5.3333333333229165e+00 1429 1422 -1.0666666666687499e+01 1429 1055 1.2116903504194741e-27 1429 1056 1.2116903504194741e-27 1429 1027 1.0666666666677083e+01 1429 492 -1.0666666666677083e+01 1430 1430 2.6666666666937498e+01 1431 1431 2.1333333333458331e+01 1432 1432 2.1333333333458331e+01 1433 1433 1.6000000000062499e+01 1434 1434 4.8025000000062498e+01 1434 1953 -1.2116903504194741e-27 1434 1930 1.0662499999999998e+01 1434 2133 -5.3302083333333332e+00 1434 1929 2.4001041666666666e+01 1434 1976 1.0662500000000000e+01 1434 1928 -1.0679166666666665e+01 1434 1439 -5.3343749999999996e+00 1434 1949 -1.2116903504194741e-27 1434 1927 1.0666666666677083e+01 1434 1926 1.3332291666666665e+01 1434 1435 -1.0666666666677083e+01 1434 4587 -5.3322916666666664e+00 1434 3948 -1.0664583333333335e+01 1434 3950 -8.0000000000000000e+00 1435 1435 6.4000000000499995e+01 1435 1929 -5.3333333333124999e+00 1435 1951 5.3333333333124999e+00 1435 1954 -1.0416666666666666e-10 1435 1955 2.1333333333291666e+01 1435 2233 5.3333333333124999e+00 1435 1440 -1.0666666666677083e+01 1435 1952 -1.0416666666666666e-10 1435 1953 2.1333333333291666e+01 1435 1927 1.0416666666666666e-10 1435 1949 -2.1333333333291666e+01 1435 1926 -5.3333333333124999e+00 1435 1434 -1.0666666666677083e+01 1435 3950 -1.0666666666614583e+01 1436 1436 1.6000000000062499e+01 1437 1437 3.7362500000104163e+01 1438 1438 6.4000000000499995e+01 1438 2026 -1.0666666666625000e+01 1438 1445 -5.3333333333437496e+00 1438 2021 1.0666666666791667e+01 1438 2020 -5.3333333333020834e+00 1438 2077 2.1333333333312499e+01 1438 1808 -5.3333333333020834e+00 1438 1443 -1.0666666666604167e+01 1438 1810 -1.0666666666625000e+01 1438 1802 1.0666666666791667e+01 1438 1442 -5.3333333333437496e+00 1438 2078 3.2000000000000000e+01 1438 2074 6.2500000000000004e-11 1438 1950 -3.2000000000000000e+01 1438 4891 -5.3333333333229165e+00 1438 4615 -5.3333333333229165e+00 1438 3950 -1.5999999999947917e+01 1438 3953 -1.0666666666687499e+01 1439 1439 2.1349999999999998e+01 1439 2136 5.3343749999999996e+00 1439 2133 -2.0833333333333337e-03 1439 1930 5.3322916666666664e+00 1439 1928 -5.3343749999999996e+00 1439 1929 -5.3322916666666664e+00 1439 1976 -1.0672916666666666e+01 1439 1434 -5.3343749999999996e+00 1439 4588 -5.3322916666666664e+00 1439 3948 -1.0672916666666666e+01 1440 1440 4.8000000000312497e+01 1440 2234 5.3333333333229165e+00 1440 2272 1.0666666666625000e+01 1440 1808 -5.3333333333020834e+00 1440 1443 -1.0666666666645833e+01 1440 1810 -1.0666666666625000e+01 1440 1809 1.0666666666791667e+01 1440 1442 -5.3333333333437496e+00 1440 1949 1.4136387421560532e-27 1440 1951 -2.4000000000010417e+01 1440 1955 1.4136387421560532e-27 1440 1954 -1.0666666666677083e+01 1440 2233 -1.3333333333322916e+01 1440 1435 -1.0666666666677083e+01 1440 3950 -1.3333333333281249e+01 1441 1441 2.6666666666937495e+01 1442 1442 2.1333333333499997e+01 1442 2272 5.3333333333229165e+00 1442 1808 -2.0833333333333345e-11 1442 2077 5.3333333333229165e+00 1442 1443 -1.0666666666729165e+01 1442 1802 5.3333333333437496e+00 1442 1950 5.3333333333229165e+00 1442 1438 -5.3333333333437496e+00 1442 1809 5.3333333333437496e+00 1442 1951 5.3333333333229165e+00 1442 1810 1.0666666666729165e+01 1442 1440 -5.3333333333437496e+00 1442 3950 2.0833333333333339e-11 1443 1443 5.3333333333833323e+01 1443 2021 -1.0666666666625000e+01 1443 2022 -1.0666666666625000e+01 1443 2020 1.0666666666833333e+01 1443 1445 -1.0666666666729165e+01 1443 2329 1.5999999999958334e+01 1443 2233 5.3333333333124999e+00 1443 2234 -1.0666666666687499e+01 1443 1809 -1.0666666666625000e+01 1443 1440 -1.0666666666645833e+01 1443 2272 -1.5999999999958334e+01 1443 1802 -1.0666666666625000e+01 1443 2077 -3.1999999999958334e+01 1443 1808 1.0666666666833333e+01 1443 1438 -1.0666666666604167e+01 1443 1442 -1.0666666666729165e+01 1444 1444 3.2000000000249997e+01 1445 1445 2.1333333333499997e+01 1445 2078 -5.3333333333229165e+00 1445 2026 1.0666666666729165e+01 1445 1438 -5.3333333333437496e+00 1445 2021 5.3333333333437496e+00 1445 2077 5.3333333333229165e+00 1445 2020 -2.0833333333333342e-11 1445 2022 5.3333333333437496e+00 1445 2329 -5.3333333333229165e+00 1445 1443 -1.0666666666729165e+01 1446 1446 3.7352083333395832e+01 1446 1447 -8.0000000000000000e+00 1446 2159 8.0000000000000000e+00 1446 2152 -2.1684043449710089e-19 1446 784 1.2116903504194741e-27 1446 785 1.2116903504194741e-27 1446 781 1.0666666666677083e+01 1446 3385 1.3332291666666665e+01 1446 428 -1.0666666666677083e+01 1446 2834 -8.0000000000000000e+00 1446 2835 6.2499999999999986e-03 1446 3388 -5.3322916666666664e+00 1446 3369 -5.3281250000000000e+00 1446 3367 1.0416666666666666e-02 1446 3377 -5.3322916666666664e+00 1446 2832 -1.0670833333333334e+01 1447 1447 5.3354166666875003e+01 1447 2046 5.3333333333958333e+00 1447 1462 -5.3333333333333330e+00 1447 2159 -2.6614583333020834e+00 1447 1446 -8.0000000000000000e+00 1447 2048 -5.3333333333124999e+00 1447 2153 -2.1705219273391446e-19 1447 2160 2.1333333333343749e+01 1447 2157 -5.3333333333124999e+00 1447 2156 -2.6614583333020829e+00 1447 1453 -1.0666666666614583e+01 1447 1449 -8.0000000000000000e+00 1447 2152 -1.0656249999999998e+01 1447 788 5.3333333333124999e+00 1447 784 2.1333333333343749e+01 1447 428 -1.0666666666614583e+01 1447 781 -5.3333333333124999e+00 1447 3388 -5.0116116045879435e-20 1447 2835 -1.0666666666666666e+01 1448 1448 3.2020833333333336e+01 1448 2153 2.8940292364521927e-21 1448 2134 -2.1705219273391446e-19 1448 2143 1.0662500000000000e+01 1448 2130 -5.3291666666666666e+00 1448 2135 -5.3312499999999998e+00 1448 1455 -1.0670833333333334e+01 1448 2139 5.3291666666666666e+00 1448 1450 4.1666666666666657e-03 1448 2146 5.3312499999999998e+00 1448 2140 1.0668750000000001e+01 1448 1449 -1.0670833333333334e+01 1448 2835 -1.0672916666666666e+01 1449 1449 3.7352083333395825e+01 1449 2149 1.0097419586828951e-27 1449 2143 -5.3281250000000000e+00 1449 2152 3.2249014814734037e-20 1449 2153 -5.3322916666666664e+00 1449 2160 -1.0097419586828951e-27 1449 2157 1.0666666666677083e+01 1449 2156 8.0000000000000000e+00 1449 1453 -1.0666666666677083e+01 1449 1447 -8.0000000000000000e+00 1449 2139 1.0416666666666666e-02 1449 2146 -1.3332291666666665e+01 1449 2140 -5.3322916666666664e+00 1449 1450 -8.0000000000000000e+00 1449 1448 -1.0670833333333334e+01 1449 2835 6.2499999999999995e-03 1450 1450 5.3360416666874997e+01 1450 2309 -5.3333333333124999e+00 1450 1944 5.3333333333124999e+00 1450 2147 -5.3333333333958333e+00 1450 1461 -5.3333333333333330e+00 1450 2149 2.1333333333343749e+01 1450 1453 -1.0666666666614583e+01 1450 2157 -5.3333333333124999e+00 1450 1928 2.1705219273391446e-19 1450 2130 1.0416666666666667e-03 1450 2135 -1.0657291666666666e+01 1450 1455 -1.0666666666666666e+01 1450 1941 -2.1333333333343749e+01 1450 1932 -5.3333333333124999e+00 1450 1931 -2.6614583333020829e+00 1450 1452 -1.0666666666614583e+01 1450 1451 -8.0000000000000000e+00 1450 2140 6.2499999999999995e-03 1450 2139 -1.0416666666666667e-03 1450 1448 4.1666666666666666e-03 1450 2146 2.6624999999687500e+00 1450 1449 -8.0000000000000000e+00 1451 1451 3.7352083333395832e+01 1451 2133 5.3281250000000000e+00 1451 1930 -1.0416666666666666e-02 1451 1936 5.3322916666666664e+00 1451 1456 -1.0670833333333334e+01 1451 2135 -4.9904357809065860e-20 1451 1928 5.3322916666666664e+00 1451 1455 6.2499999999999986e-03 1451 1939 1.2116903504194741e-27 1451 1454 -8.0000000000000000e+00 1451 1933 1.3332291666666665e+01 1451 1941 1.2116903504194741e-27 1451 1932 1.0666666666677083e+01 1451 1931 8.0000000000000000e+00 1451 1452 -1.0666666666677083e+01 1451 1450 -8.0000000000000000e+00 1452 1452 6.4000000000499995e+01 1452 2147 5.3333333333124999e+00 1452 1944 -1.0416666666666666e-10 1452 2285 5.3333333333124999e+00 1452 1461 -1.0666666666677083e+01 1452 1943 2.1333333333291666e+01 1452 1460 -1.0666666666614583e+01 1452 2280 -5.3333333333124999e+00 1452 1942 -1.0416666666666666e-10 1452 1940 -5.3333333333124999e+00 1452 1459 -1.0666666666677083e+01 1452 1939 -2.1333333333291666e+01 1452 1454 -1.0666666666614583e+01 1452 1933 -5.3333333333124999e+00 1452 1932 1.0416666666666666e-10 1452 1941 2.1333333333291666e+01 1452 1931 -5.3333333333124999e+00 1452 1450 -1.0666666666614583e+01 1452 1451 -1.0666666666677083e+01 1453 1453 6.4000000000499995e+01 1453 2046 -5.3333333333124999e+00 1453 2048 1.0416666666666666e-10 1453 2047 -5.3333333333124999e+00 1453 1462 -1.0666666666677083e+01 1453 2286 -2.1333333333291666e+01 1453 1460 -1.0666666666614583e+01 1453 2285 5.3333333333124999e+00 1453 2309 1.0416666666666666e-10 1453 2147 5.3333333333124999e+00 1453 1461 -1.0666666666677083e+01 1453 2149 -2.1333333333291666e+01 1453 1450 -1.0666666666614583e+01 1453 2146 5.3333333333124999e+00 1453 2157 1.0416666666666666e-10 1453 2160 -2.1333333333291666e+01 1453 2156 -5.3333333333124999e+00 1453 1447 -1.0666666666614583e+01 1453 1449 -1.0666666666677083e+01 1454 1454 5.3366666666874991e+01 1454 1940 5.3333333333958333e+00 1454 1459 -5.3333333333333330e+00 1454 1937 -1.0658333333333333e+01 1454 1457 -1.0666666666666666e+01 1454 1942 5.3333333333124999e+00 1454 1936 -6.2500000000000003e-03 1454 1930 1.0416666666666667e-03 1454 1456 4.1666666666666666e-03 1454 1939 2.1333333333343749e+01 1454 1452 -1.0666666666614583e+01 1454 1932 -5.3333333333124999e+00 1454 1933 -2.6624999999687495e+00 1454 1451 -8.0000000000000000e+00 1454 1062 5.3333333333124999e+00 1454 1011 -1.0416666666666667e-03 1454 1014 6.2500000000000003e-03 1454 4597 -1.0416666666666667e-03 1454 431 4.1666666666666666e-03 1454 1016 2.1333333333343749e+01 1454 1017 -5.3333333333124999e+00 1454 1015 2.6624999999687495e+00 1454 430 -1.0666666666614583e+01 1454 429 -8.0000000000000000e+00 1454 4592 -1.0416666666666667e-03 1455 1455 4.2704166666666666e+01 1455 1930 5.3281250000000000e+00 1455 2133 -1.0416666666666666e-02 1455 2193 -5.3322916666666664e+00 1455 1456 -1.0670833333333334e+01 1455 1458 -1.0666666666666666e+01 1455 2138 1.5998958333333333e+01 1455 1931 2.1684043449710089e-19 1455 1451 6.2499999999999986e-03 1455 1928 -5.3322916666666664e+00 1455 2143 -5.3281250000000000e+00 1455 2134 5.3322916666666664e+00 1455 2130 -1.0416666666666666e-02 1455 2140 -5.3322916666666664e+00 1455 2135 1.5998958333333331e+01 1455 1450 -1.0666666666666666e+01 1455 1448 -1.0670833333333334e+01 1455 3386 2.1684043449710089e-19 1455 2835 6.2499999999999986e-03 1456 1456 3.2022916666666667e+01 1456 1928 2.1705219273391446e-19 1456 2133 -5.3291666666666666e+00 1456 2138 -5.3312499999999998e+00 1456 1455 -1.0670833333333334e+01 1456 1937 -5.3312499999999998e+00 1456 1458 4.1666666666666657e-03 1456 2194 -5.3312499999999998e+00 1456 2193 1.0668750000000001e+01 1456 1457 -1.0668750000000001e+01 1456 1930 -5.3291666666666666e+00 1456 1454 4.1666666666666657e-03 1456 1933 -5.3312499999999998e+00 1456 1936 -1.0668750000000001e+01 1456 1451 -1.0670833333333334e+01 1456 4592 -4.1666666666666666e-03 1457 1457 4.2691666666666663e+01 1457 2194 2.1331249999999997e+01 1457 1458 -1.0666666666666666e+01 1457 1937 2.1331249999999997e+01 1457 1454 -1.0666666666666666e+01 1457 1936 5.3322916666666664e+00 1457 2193 -5.3322916666666664e+00 1457 1456 -1.0668750000000001e+01 1457 1013 -5.3322916666666664e+00 1457 4597 6.2500000000000003e-03 1457 1014 -5.3322916666666664e+00 1457 431 -1.0668750000000001e+01 1457 4592 6.2500000000000003e-03 1458 1458 4.2727083333333333e+01 1458 2194 -1.0658333333333333e+01 1458 1457 -1.0666666666666666e+01 1458 2133 1.0416666666666667e-03 1458 2134 -2.1705219273391446e-19 1458 2138 -1.0657291666666666e+01 1458 1455 -1.0666666666666666e+01 1458 2193 6.2499999999999995e-03 1458 1456 4.1666666666666666e-03 1458 3383 -1.0416666666666667e-03 1458 3381 -1.0658333333333333e+01 1458 2833 -1.0666666666666666e+01 1458 1013 6.2500000000000003e-03 1458 4597 -1.0416666666666667e-03 1458 431 4.1666666666666666e-03 1458 3369 -1.0416666666666667e-03 1458 3386 -1.0657291666666666e+01 1458 2835 -1.0666666666666666e+01 1458 3376 6.2500000000000003e-03 1458 3373 -1.0416666666666667e-03 1458 2832 4.1666666666666666e-03 1458 4592 -1.0416666666666667e-03 1459 1459 3.2000000000124999e+01 1459 1454 -5.3333333333333330e+00 1459 1940 5.3333333333333330e+00 1459 2280 5.3333333333333330e+00 1459 1460 -5.3333333333333330e+00 1459 1943 -1.0097419586828951e-27 1459 1939 -1.0097419586828951e-27 1459 1942 -1.0666666666677083e+01 1459 1452 -1.0666666666677083e+01 1459 1016 1.4136387421560532e-27 1459 1061 1.4136387421560532e-27 1459 1062 -1.0666666666677083e+01 1459 430 -1.0666666666677083e+01 1460 1460 6.4000000000416662e+01 1460 2047 5.3333333333958333e+00 1460 1462 -5.3333333333333330e+00 1460 2280 5.3333333333958333e+00 1460 1459 -5.3333333333333330e+00 1460 2048 -5.3333333333124999e+00 1460 2286 2.1333333333343749e+01 1460 1453 -1.0666666666614583e+01 1460 2309 -5.3333333333124999e+00 1460 1944 5.3333333333124999e+00 1460 2285 -5.3333333333958333e+00 1460 1461 -5.3333333333333330e+00 1460 1943 -2.1333333333343749e+01 1460 1452 -1.0666666666614583e+01 1460 1942 5.3333333333124999e+00 1460 788 5.3333333333124999e+00 1460 1062 5.3333333333124999e+00 1460 1061 -2.1333333333343749e+01 1460 430 -1.0666666666614583e+01 1460 1060 5.3333333333124999e+00 1460 787 -2.1333333333343749e+01 1460 786 5.3333333333124999e+00 1460 1064 5.3333333333958333e+00 1460 428 -1.0666666666614583e+01 1460 432 -5.3333333333333330e+00 1461 1461 3.2000000000124999e+01 1461 2286 1.2116903504194741e-27 1461 2149 -1.2116903504194741e-27 1461 2309 1.0666666666677083e+01 1461 1453 -1.0666666666677083e+01 1461 1941 -1.4136387421560532e-27 1461 1450 -5.3333333333333330e+00 1461 2147 -5.3333333333333330e+00 1461 1943 1.4136387421560532e-27 1461 1944 -1.0666666666677083e+01 1461 2285 -5.3333333333333330e+00 1461 1452 -1.0666666666677083e+01 1461 1460 -5.3333333333333330e+00 1462 1462 3.2000000000124999e+01 1462 1460 -5.3333333333333330e+00 1462 2047 5.3333333333333330e+00 1462 2046 5.3333333333333330e+00 1462 1447 -5.3333333333333330e+00 1462 2160 1.4136387421560532e-27 1462 2286 -1.4136387421560532e-27 1462 2048 1.0666666666677083e+01 1462 1453 -1.0666666666677083e+01 1462 787 -1.0097419586828951e-27 1462 784 -1.0097419586828951e-27 1462 788 -1.0666666666677083e+01 1462 428 -1.0666666666677083e+01 1463 1463 5.3366666666874991e+01 1463 1937 -1.0658333333333333e+01 1463 2282 -5.3333333333124999e+00 1463 1940 5.3333333333958333e+00 1463 1470 -1.0666666666614583e+01 1463 1464 -5.3333333333333330e+00 1463 1945 5.3333333333124999e+00 1463 1930 1.0416666666666667e-03 1463 1938 2.1333333333343749e+01 1463 1934 -5.3333333333124999e+00 1463 1933 -2.6624999999687495e+00 1463 1466 -1.0666666666614583e+01 1463 1467 -8.0000000000000000e+00 1463 1936 -6.2500000000000003e-03 1463 706 5.3333333333124999e+00 1463 1011 -1.0416666666666667e-03 1463 1015 2.6624999999687500e+00 1463 293 -8.0000000000000000e+00 1463 1014 6.2500000000000003e-03 1463 4597 -1.0416666666666667e-03 1463 3971 4.1666666666666666e-03 1463 3972 -1.0666666666666666e+01 1463 704 -2.1333333333343749e+01 1463 4592 -1.0416666666666667e-03 1463 3973 4.1666666666666666e-03 1464 1464 3.2000000000124999e+01 1464 2282 1.0666666666677083e+01 1464 1940 5.3333333333333330e+00 1464 1470 -1.0666666666677083e+01 1464 1463 -5.3333333333333330e+00 1464 1938 1.4136387421560532e-27 1464 2284 1.0097419586828951e-27 1464 1946 1.4136387421560532e-27 1464 1945 -1.0666666666677083e+01 1464 2278 5.3333333333333330e+00 1464 1466 -1.0666666666677083e+01 1464 1465 -5.3333333333333330e+00 1464 704 1.0097419586828951e-27 1465 1465 5.3333333333749991e+01 1465 2284 2.1333333333343749e+01 1465 1817 -2.6666666665833327e+00 1465 1470 -1.0666666666614583e+01 1465 1472 -8.0000000000000000e+00 1465 1804 3.6295685768920020e-28 1465 1809 2.2851328271989659e-27 1465 1805 -1.0666666666562499e+01 1465 1471 -1.0666666666666666e+01 1465 2282 -5.3333333333124999e+00 1465 1948 5.3333333333124999e+00 1465 2270 -2.6666666665833332e+00 1465 1469 -8.0000000000000000e+00 1465 1946 -2.1333333333343749e+01 1465 1945 5.3333333333124999e+00 1465 2278 5.3333333333958333e+00 1465 1466 -1.0666666666614583e+01 1465 1464 -5.3333333333333330e+00 1465 700 -5.3333333333124999e+00 1466 1466 6.4000000000499995e+01 1466 1940 -5.3333333333124999e+00 1466 2270 -5.3333333333124999e+00 1466 1948 -1.0416666666666666e-10 1466 1951 5.3333333333124999e+00 1466 1469 -1.0666666666677083e+01 1466 1947 2.1333333333291666e+01 1466 1926 -5.3333333333124999e+00 1466 1934 1.0416666666666666e-10 1466 1938 -2.1333333333291666e+01 1466 1933 -5.3333333333124999e+00 1466 1463 -1.0666666666614583e+01 1466 1467 -1.0666666666677083e+01 1466 1945 -1.0416666666666666e-10 1466 1946 2.1333333333291666e+01 1466 2278 -5.3333333333124999e+00 1466 1465 -1.0666666666614583e+01 1466 1464 -1.0666666666677083e+01 1466 3975 -1.0666666666614583e+01 1467 1467 3.7345833333395831e+01 1467 1936 5.3322916666666664e+00 1467 1930 -6.2500000000000003e-03 1467 1947 -1.0097419586828951e-27 1467 1926 1.3332291666666665e+01 1467 1938 -1.0097419586828951e-27 1467 1934 1.0666666666677083e+01 1467 1933 1.3332291666666665e+01 1467 1466 -1.0666666666677083e+01 1467 1463 -8.0000000000000000e+00 1467 4587 -5.3322916666666664e+00 1467 3973 -1.0668750000000001e+01 1467 3975 -8.0000000000000000e+00 1468 1468 4.2666666666895829e+01 1468 1803 -2.0194839173657902e-27 1468 1810 2.0194839173657902e-27 1468 1471 -5.3333333333229165e+00 1468 1802 -5.3333333333229165e+00 1468 1950 -2.1333333333333332e+01 1468 2074 6.2500000000000004e-11 1468 2076 -1.5999999999989583e+01 1468 2075 -5.3333333333229165e+00 1468 3975 -1.6000000000010417e+01 1468 4615 -5.3333333333229165e+00 1468 3968 -1.0666666666666666e+01 1468 3969 -1.0666666666687499e+01 1469 1469 3.7333333333499994e+01 1469 1810 -2.0194839173657902e-27 1469 1805 2.0194839173657902e-27 1469 1471 -5.3333333333229165e+00 1469 1809 -5.3333333333229165e+00 1469 1946 -1.2116903504194741e-27 1469 1465 -8.0000000000000000e+00 1469 2270 8.0000000000000000e+00 1469 1947 1.2116903504194741e-27 1469 1948 -1.0666666666677083e+01 1469 1951 -1.3333333333343749e+01 1469 1466 -1.0666666666677083e+01 1469 3975 -1.3333333333343749e+01 1470 1470 6.4000000000499995e+01 1470 1819 -5.3333333333124999e+00 1470 2284 -2.1333333333291666e+01 1470 1817 -5.3333333333124999e+00 1470 1465 -1.0666666666614583e+01 1470 1472 -1.0666666666677083e+01 1470 2282 1.0416666666666666e-10 1470 1940 -5.3333333333124999e+00 1470 1463 -1.0666666666614583e+01 1470 1464 -1.0666666666677083e+01 1470 2278 -5.3333333333124999e+00 1470 1015 5.3333333333124999e+00 1470 706 -1.0416666666666666e-10 1470 708 5.3333333333124999e+00 1470 293 -1.0666666666677083e+01 1470 705 2.1333333333291666e+01 1470 3977 -1.0666666666614583e+01 1470 700 1.0416666666666666e-10 1470 704 2.1333333333291666e+01 1471 1471 4.2666666667166666e+01 1471 1817 -2.0194839173657902e-27 1471 1804 -6.2499999999999991e-11 1471 1819 -5.3333333332812494e+00 1471 1472 -5.3333333333229165e+00 1471 1811 1.0666666666729165e+01 1471 1785 6.2500000000000004e-11 1471 2076 2.0194839173657902e-27 1471 1803 1.0666666666666666e+01 1471 1802 -6.2499999999999991e-11 1471 1950 5.3333333332812494e+00 1471 1468 -5.3333333333229165e+00 1471 1810 1.0666666666729165e+01 1471 1951 5.3333333332812494e+00 1471 2270 -2.2470898404921788e-28 1471 1809 -6.2500000000000004e-11 1471 1469 -5.3333333333229165e+00 1471 1805 1.0666666666666666e+01 1471 1465 -1.0666666666666666e+01 1471 3977 1.4583333333333335e-10 1471 4462 -5.3333333332812494e+00 1471 4461 4.5860624244724788e-28 1471 3976 -5.3333333333229165e+00 1471 3968 -1.0666666666666666e+01 1471 3975 1.4583333333333335e-10 1472 1472 3.7333333333499994e+01 1472 1819 1.3333333333343749e+01 1472 2284 -1.4136387421560532e-27 1472 1817 8.0000000000000000e+00 1472 1470 -1.0666666666677083e+01 1472 1465 -8.0000000000000000e+00 1472 1805 -2.0194839173657902e-27 1472 1811 2.0194839173657902e-27 1472 1471 -5.3333333333229165e+00 1472 1804 -5.3333333333229165e+00 1472 705 -1.4136387421560532e-27 1472 3977 -1.3333333333343749e+01 1472 700 1.0666666666677083e+01 1473 1473 3.2000000000124999e+01 1473 1942 1.2116903504194741e-27 1473 1945 -1.4136387421560532e-27 1473 1494 -5.3333333333333330e+00 1473 1940 -5.3333333333333330e+00 1473 1934 -1.4136387421560532e-27 1473 1938 1.0666666666677083e+01 1473 1476 -1.0666666666677083e+01 1473 1932 1.2116903504194741e-27 1473 1475 -1.0666666666677083e+01 1473 1474 -5.3333333333333330e+00 1473 1939 1.0666666666677083e+01 1473 1933 -5.3333333333333330e+00 1474 1474 6.4000000000416662e+01 1474 1941 5.3333333333124999e+00 1474 1974 5.3333333333124999e+00 1474 1931 -5.3333333333958333e+00 1474 1498 -5.3333333333333330e+00 1474 1935 2.1333333333343749e+01 1474 1975 5.3333333333124999e+00 1474 1482 -1.0666666666614583e+01 1474 1953 5.3333333333124999e+00 1474 1929 -5.3333333333958333e+00 1474 1483 -5.3333333333333330e+00 1474 1927 2.1333333333343749e+01 1474 1949 -5.3333333333124999e+00 1474 1478 -1.0666666666614583e+01 1474 1947 5.3333333333124999e+00 1474 1926 -5.3333333333958333e+00 1474 1477 -5.3333333333333330e+00 1474 1934 2.1333333333343749e+01 1474 1938 -5.3333333333124999e+00 1474 1476 -1.0666666666614583e+01 1474 1932 2.1333333333343749e+01 1474 1475 -1.0666666666614583e+01 1474 1939 -5.3333333333124999e+00 1474 1933 -5.3333333333958333e+00 1474 1473 -5.3333333333333330e+00 1475 1475 6.4000000000499995e+01 1475 1931 5.3333333333124999e+00 1475 1941 -1.0416666666666666e-10 1475 2147 -5.3333333333124999e+00 1475 1498 -1.0666666666677083e+01 1475 1944 2.1333333333291666e+01 1475 2285 -5.3333333333124999e+00 1475 1497 -1.0666666666614583e+01 1475 1943 -1.0416666666666666e-10 1475 2280 5.3333333333124999e+00 1475 1496 -1.0666666666677083e+01 1475 1942 2.1333333333291666e+01 1475 1940 5.3333333333124999e+00 1475 1494 -1.0666666666614583e+01 1475 1939 1.0416666666666666e-10 1475 1932 -2.1333333333291666e+01 1475 1474 -1.0666666666614583e+01 1475 1933 5.3333333333124999e+00 1475 1473 -1.0666666666677083e+01 1476 1476 6.4000000000499995e+01 1476 1940 5.3333333333124999e+00 1476 2270 5.3333333333124999e+00 1476 1948 2.1333333333291666e+01 1476 1951 -5.3333333333124999e+00 1476 1491 -1.0666666666614583e+01 1476 1946 -1.0416666666666666e-10 1476 1945 2.1333333333291666e+01 1476 2278 5.3333333333124999e+00 1476 1494 -1.0666666666614583e+01 1476 1495 -1.0666666666677083e+01 1476 1947 -1.0416666666666666e-10 1476 1926 5.3333333333124999e+00 1476 1477 -1.0666666666677083e+01 1476 1938 1.0416666666666666e-10 1476 1934 -2.1333333333291666e+01 1476 1933 5.3333333333124999e+00 1476 1474 -1.0666666666614583e+01 1476 1473 -1.0666666666677083e+01 1477 1477 3.2000000000124999e+01 1477 1948 1.0097419586828951e-27 1477 1954 -1.4136387421560532e-27 1477 1491 -5.3333333333333330e+00 1477 1951 5.3333333333333330e+00 1477 1927 -1.4136387421560532e-27 1477 1949 1.0666666666677083e+01 1477 1478 -1.0666666666677083e+01 1477 1934 1.0097419586828951e-27 1477 1476 -1.0666666666677083e+01 1477 1474 -5.3333333333333330e+00 1477 1947 -1.0666666666677083e+01 1477 1926 -5.3333333333333330e+00 1478 1478 6.4000000000499995e+01 1478 1929 5.3333333333124999e+00 1478 1951 -5.3333333333124999e+00 1478 1954 2.1333333333291666e+01 1478 2233 -5.3333333333124999e+00 1478 1491 -1.0666666666614583e+01 1478 1955 -1.0416666666666666e-10 1478 1489 -1.0666666666677083e+01 1478 1953 -1.0416666666666666e-10 1478 1952 2.1333333333291666e+01 1478 1480 -1.0666666666614583e+01 1478 1483 -1.0666666666677083e+01 1478 1949 1.0416666666666666e-10 1478 1927 -2.1333333333291666e+01 1478 1926 5.3333333333124999e+00 1478 1474 -1.0666666666614583e+01 1478 1477 -1.0666666666677083e+01 1479 1479 3.2000000000124999e+01 1479 1972 1.0097419586828951e-27 1479 1973 -1.2116903504194741e-27 1479 1497 -5.3333333333333330e+00 1479 1963 5.3333333333333330e+00 1479 1960 -1.2116903504194741e-27 1479 1967 1.0666666666677083e+01 1479 1482 -1.0666666666677083e+01 1479 1958 1.0097419586828951e-27 1479 1481 -1.0666666666677083e+01 1479 1480 -5.3333333333333330e+00 1479 1968 1.0666666666677083e+01 1480 1480 6.4000000000416662e+01 1480 1969 5.3333333333124999e+00 1480 2203 -5.3333333333124999e+00 1480 1487 -5.3333333333333330e+00 1480 1962 2.1333333333343749e+01 1480 2230 5.3333333333124999e+00 1480 1488 -1.0666666666614583e+01 1480 1955 5.3333333333124999e+00 1480 1489 -5.3333333333333330e+00 1480 1952 -2.1333333333343749e+01 1480 1953 5.3333333333124999e+00 1480 1478 -1.0666666666614583e+01 1480 1975 5.3333333333124999e+00 1480 1483 -5.3333333333333330e+00 1480 1960 2.1333333333343749e+01 1480 1967 -5.3333333333124999e+00 1480 1482 -1.0666666666614583e+01 1480 1958 2.1333333333343749e+01 1480 1481 -1.0666666666614583e+01 1480 1968 -5.3333333333124999e+00 1480 1479 -5.3333333333333330e+00 1481 1481 6.4000000000499995e+01 1481 2223 -5.3333333333124999e+00 1481 1972 2.1333333333291666e+01 1481 1963 -5.3333333333124999e+00 1481 1497 -1.0666666666614583e+01 1481 1969 -1.0416666666666666e-10 1481 2202 -5.3333333333124999e+00 1481 1487 -1.0666666666677083e+01 1481 1971 -1.0416666666666666e-10 1481 1970 2.1333333333291666e+01 1481 2213 5.3333333333124999e+00 1481 1485 -1.0666666666614583e+01 1481 1484 -1.0666666666677083e+01 1481 1968 1.0416666666666666e-10 1481 1958 -2.1333333333291666e+01 1481 1480 -1.0666666666614583e+01 1481 1479 -1.0666666666677083e+01 1482 1482 6.4000000000499995e+01 1482 1931 5.3333333333124999e+00 1482 1935 -2.1333333333291666e+01 1482 1929 5.3333333333124999e+00 1482 1474 -1.0666666666614583e+01 1482 1974 -1.0416666666666666e-10 1482 2147 -5.3333333333124999e+00 1482 1498 -1.0666666666677083e+01 1482 1973 2.1333333333291666e+01 1482 1497 -1.0666666666614583e+01 1482 1963 -5.3333333333124999e+00 1482 1975 -1.0416666666666666e-10 1482 1483 -1.0666666666677083e+01 1482 1967 1.0416666666666666e-10 1482 1960 -2.1333333333291666e+01 1482 1480 -1.0666666666614583e+01 1482 1479 -1.0666666666677083e+01 1483 1483 3.2000000000124999e+01 1483 1935 -1.4136387421560532e-27 1483 1927 1.2116903504194741e-27 1483 1474 -5.3333333333333330e+00 1483 1929 -5.3333333333333330e+00 1483 1952 1.2116903504194741e-27 1483 1953 -1.0666666666677083e+01 1483 1478 -1.0666666666677083e+01 1483 1960 1.4136387421560532e-27 1483 1482 -1.0666666666677083e+01 1483 1480 -5.3333333333333330e+00 1483 1975 -1.0666666666677083e+01 1484 1484 3.2000000000124999e+01 1484 2229 1.0097419586828951e-27 1484 1972 -1.4136387421560532e-27 1484 1497 -5.3333333333333330e+00 1484 2223 5.3333333333333330e+00 1484 1970 1.4136387421560532e-27 1484 1971 -1.0666666666677083e+01 1484 1481 -1.0666666666677083e+01 1484 2217 1.0097419586828951e-27 1484 1486 -1.0666666666677083e+01 1484 1485 -5.3333333333333330e+00 1484 2224 1.0666666666677083e+01 1484 2213 -5.3333333333333330e+00 1485 1485 6.4000000000416662e+01 1485 2226 5.3333333333124999e+00 1485 2268 -5.3333333333124999e+00 1485 2216 -5.3333333333958333e+00 1485 1493 -5.3333333333333330e+00 1485 2218 2.1333333333343749e+01 1485 2275 -5.3333333333124999e+00 1485 1492 -1.0666666666614583e+01 1485 2232 5.3333333333124999e+00 1485 2215 -5.3333333333958333e+00 1485 1490 -5.3333333333333330e+00 1485 2212 2.1333333333343749e+01 1485 2203 -5.3333333333124999e+00 1485 1488 -1.0666666666614583e+01 1485 1969 5.3333333333124999e+00 1485 2202 5.3333333333958333e+00 1485 1487 -5.3333333333333330e+00 1485 1970 -2.1333333333343749e+01 1485 1971 5.3333333333124999e+00 1485 1481 -1.0666666666614583e+01 1485 2217 2.1333333333343749e+01 1485 1486 -1.0666666666614583e+01 1485 2224 -5.3333333333124999e+00 1485 2213 -5.3333333333958333e+00 1485 1484 -5.3333333333333330e+00 1486 1486 6.4000000000499995e+01 1486 2285 -5.3333333333124999e+00 1486 2229 2.1333333333291666e+01 1486 2223 -5.3333333333124999e+00 1486 1497 -1.0666666666614583e+01 1486 2228 -1.0416666666666666e-10 1486 2280 5.3333333333124999e+00 1486 1496 -1.0666666666677083e+01 1486 2227 2.1333333333291666e+01 1486 1494 -1.0666666666614583e+01 1486 2266 -5.3333333333124999e+00 1486 2226 -1.0416666666666666e-10 1486 2216 5.3333333333124999e+00 1486 1493 -1.0666666666677083e+01 1486 2224 1.0416666666666666e-10 1486 2217 -2.1333333333291666e+01 1486 1485 -1.0666666666614583e+01 1486 2213 5.3333333333124999e+00 1486 1484 -1.0666666666677083e+01 1487 1487 3.2000000000124999e+01 1487 1958 -1.2116903504194741e-27 1487 1962 1.4136387421560532e-27 1487 1480 -5.3333333333333330e+00 1487 2212 -1.4136387421560532e-27 1487 2203 1.0666666666677083e+01 1487 1488 -1.0666666666677083e+01 1487 1970 -1.2116903504194741e-27 1487 1481 -1.0666666666677083e+01 1487 1485 -5.3333333333333330e+00 1487 1969 -1.0666666666677083e+01 1487 2202 5.3333333333333330e+00 1488 1488 6.4000000000499995e+01 1488 2215 5.3333333333124999e+00 1488 2233 -5.3333333333124999e+00 1488 2232 -1.0416666666666666e-10 1488 2231 2.1333333333291666e+01 1488 2273 5.3333333333124999e+00 1488 1491 -1.0666666666614583e+01 1488 1490 -1.0666666666677083e+01 1488 2230 -1.0416666666666666e-10 1488 1962 -2.1333333333291666e+01 1488 1480 -1.0666666666614583e+01 1488 1489 -1.0666666666677083e+01 1488 2203 1.0416666666666666e-10 1488 2212 -2.1333333333291666e+01 1488 2202 -5.3333333333124999e+00 1488 1485 -1.0666666666614583e+01 1488 1487 -1.0666666666677083e+01 1489 1489 3.2000000000124999e+01 1489 1954 1.0097419586828951e-27 1489 2231 -1.2116903504194741e-27 1489 1491 -5.3333333333333330e+00 1489 2233 5.3333333333333330e+00 1489 1962 -1.2116903504194741e-27 1489 2230 -1.0666666666677083e+01 1489 1488 -1.0666666666677083e+01 1489 1952 -1.0097419586828951e-27 1489 1478 -1.0666666666677083e+01 1489 1480 -5.3333333333333330e+00 1489 1955 -1.0666666666677083e+01 1490 1490 3.2000000000124999e+01 1490 2218 -1.4136387421560532e-27 1490 2212 1.0097419586828951e-27 1490 1485 -5.3333333333333330e+00 1490 2215 -5.3333333333333330e+00 1490 2231 1.0097419586828951e-27 1490 2232 -1.0666666666677083e+01 1490 1488 -1.0666666666677083e+01 1490 2271 1.4136387421560532e-27 1490 1492 -1.0666666666677083e+01 1490 1491 -5.3333333333333330e+00 1490 2275 1.0666666666677083e+01 1490 2273 -5.3333333333333330e+00 1491 1491 6.4000000000416662e+01 1491 2276 5.3333333333124999e+00 1491 1946 5.3333333333124999e+00 1491 2270 -5.3333333333958333e+00 1491 1495 -5.3333333333333330e+00 1491 1948 -2.1333333333343749e+01 1491 1947 5.3333333333124999e+00 1491 1476 -1.0666666666614583e+01 1491 1949 -5.3333333333124999e+00 1491 1951 5.3333333333958333e+00 1491 1477 -5.3333333333333330e+00 1491 1954 -2.1333333333343749e+01 1491 1955 5.3333333333124999e+00 1491 1478 -1.0666666666614583e+01 1491 2230 5.3333333333124999e+00 1491 2233 5.3333333333958333e+00 1491 1489 -5.3333333333333330e+00 1491 2231 -2.1333333333343749e+01 1491 2232 5.3333333333124999e+00 1491 1488 -1.0666666666614583e+01 1491 2271 2.1333333333343749e+01 1491 1492 -1.0666666666614583e+01 1491 2275 -5.3333333333124999e+00 1491 2273 -5.3333333333958333e+00 1491 1490 -5.3333333333333330e+00 1492 1492 6.4000000000499995e+01 1492 2270 5.3333333333124999e+00 1492 2276 -1.0416666666666666e-10 1492 2278 5.3333333333124999e+00 1492 1495 -1.0666666666677083e+01 1492 2277 2.1333333333291666e+01 1492 2266 -5.3333333333124999e+00 1492 1494 -1.0666666666614583e+01 1492 2268 1.0416666666666666e-10 1492 2216 5.3333333333124999e+00 1492 1493 -1.0666666666677083e+01 1492 2218 -2.1333333333291666e+01 1492 2215 5.3333333333124999e+00 1492 1485 -1.0666666666614583e+01 1492 2275 1.0416666666666666e-10 1492 2271 -2.1333333333291666e+01 1492 1491 -1.0666666666614583e+01 1492 2273 5.3333333333124999e+00 1492 1490 -1.0666666666677083e+01 1493 1493 3.2000000000124999e+01 1493 2277 1.2116903504194741e-27 1493 2227 -1.4136387421560532e-27 1493 1494 -5.3333333333333330e+00 1493 2266 5.3333333333333330e+00 1493 2217 -1.4136387421560532e-27 1493 2226 -1.0666666666677083e+01 1493 1486 -1.0666666666677083e+01 1493 2218 1.2116903504194741e-27 1493 1492 -1.0666666666677083e+01 1493 1485 -5.3333333333333330e+00 1493 2268 1.0666666666677083e+01 1493 2216 -5.3333333333333330e+00 1494 1494 6.4000000000416662e+01 1494 2228 5.3333333333124999e+00 1494 1943 5.3333333333124999e+00 1494 2280 -5.3333333333958333e+00 1494 1496 -5.3333333333333330e+00 1494 1942 -2.1333333333343749e+01 1494 1939 -5.3333333333124999e+00 1494 1475 -1.0666666666614583e+01 1494 1938 -5.3333333333124999e+00 1494 1940 -5.3333333333958333e+00 1494 1473 -5.3333333333333330e+00 1494 1945 -2.1333333333343749e+01 1494 1946 5.3333333333124999e+00 1494 1476 -1.0666666666614583e+01 1494 2276 5.3333333333124999e+00 1494 2278 -5.3333333333958333e+00 1494 1495 -5.3333333333333330e+00 1494 2277 -2.1333333333343749e+01 1494 2268 -5.3333333333124999e+00 1494 1492 -1.0666666666614583e+01 1494 2227 -2.1333333333343749e+01 1494 1486 -1.0666666666614583e+01 1494 2226 5.3333333333124999e+00 1494 2266 5.3333333333958333e+00 1494 1493 -5.3333333333333330e+00 1495 1495 3.2000000000124999e+01 1495 2271 -1.0097419586828951e-27 1495 1948 -1.2116903504194741e-27 1495 1491 -5.3333333333333330e+00 1495 2270 -5.3333333333333330e+00 1495 1945 1.2116903504194741e-27 1495 1946 -1.0666666666677083e+01 1495 1476 -1.0666666666677083e+01 1495 2277 -1.0097419586828951e-27 1495 1492 -1.0666666666677083e+01 1495 1494 -5.3333333333333330e+00 1495 2276 -1.0666666666677083e+01 1495 2278 -5.3333333333333330e+00 1496 1496 3.2000000000124999e+01 1496 1944 1.0097419586828951e-27 1496 2229 -1.2116903504194741e-27 1496 1497 -5.3333333333333330e+00 1496 2285 5.3333333333333330e+00 1496 2227 1.2116903504194741e-27 1496 2228 -1.0666666666677083e+01 1496 1486 -1.0666666666677083e+01 1496 1942 -1.0097419586828951e-27 1496 1475 -1.0666666666677083e+01 1496 1494 -5.3333333333333330e+00 1496 1943 -1.0666666666677083e+01 1496 2280 -5.3333333333333330e+00 1497 1497 6.4000000000416662e+01 1497 1974 5.3333333333124999e+00 1497 1941 5.3333333333124999e+00 1497 2147 5.3333333333958333e+00 1497 1498 -5.3333333333333330e+00 1497 1944 -2.1333333333343749e+01 1497 1943 5.3333333333124999e+00 1497 1475 -1.0666666666614583e+01 1497 2228 5.3333333333124999e+00 1497 2285 5.3333333333958333e+00 1497 1496 -5.3333333333333330e+00 1497 2229 -2.1333333333343749e+01 1497 2224 -5.3333333333124999e+00 1497 1486 -1.0666666666614583e+01 1497 1971 5.3333333333124999e+00 1497 2223 5.3333333333958333e+00 1497 1484 -5.3333333333333330e+00 1497 1972 -2.1333333333343749e+01 1497 1968 -5.3333333333124999e+00 1497 1481 -1.0666666666614583e+01 1497 1973 -2.1333333333343749e+01 1497 1482 -1.0666666666614583e+01 1497 1967 -5.3333333333124999e+00 1497 1963 5.3333333333958333e+00 1497 1479 -5.3333333333333330e+00 1498 1498 3.2000000000124999e+01 1498 1932 -1.4136387421560532e-27 1498 1935 1.0097419586828951e-27 1498 1474 -5.3333333333333330e+00 1498 1931 -5.3333333333333330e+00 1498 1973 1.0097419586828951e-27 1498 1974 -1.0666666666677083e+01 1498 1482 -1.0666666666677083e+01 1498 1944 -1.4136387421560532e-27 1498 1475 -1.0666666666677083e+01 1498 1497 -5.3333333333333330e+00 1498 1941 -1.0666666666677083e+01 1498 2147 5.3333333333333330e+00 1499 1499 4.2704166666666673e+01 1499 2136 -6.2499999999999986e-03 1499 1929 -5.3281250000000000e+00 1499 1976 -1.0672916666666666e+01 1499 1931 -2.1684043449710089e-19 1499 1928 6.2500000000000003e-03 1499 1509 -5.3322916666666664e+00 1499 2140 -5.3322916666666664e+00 1499 1505 -1.0666666666666666e+01 1499 2135 1.5998958333333331e+01 1499 2130 -6.2499999999999995e-03 1499 2142 -5.3322916666666664e+00 1499 2131 1.5998958333333331e+01 1499 1500 -1.0668750000000001e+01 1500 1500 3.2024999999999999e+01 1500 2145 -4.1666666666666666e-03 1500 2146 5.3312499999999998e+00 1500 2139 -4.1666666666666666e-03 1500 2155 -5.3312499999999998e+00 1500 2144 1.0668750000000001e+01 1500 1510 -1.0668750000000001e+01 1500 1505 4.1666666666666657e-03 1500 2140 1.0668750000000001e+01 1500 2135 -5.3312499999999998e+00 1500 2130 4.1666666666666675e-03 1500 2142 1.0668750000000001e+01 1500 2131 -5.3312499999999998e+00 1500 1499 -1.0668750000000001e+01 1501 1501 2.1360416666666669e+01 1502 1502 3.2000000000124999e+01 1502 2148 1.4136387421560532e-27 1502 1967 1.2116903504194741e-27 1502 1974 1.2116903504194741e-27 1502 1973 -1.0666666666677083e+01 1502 2147 -5.3333333333333330e+00 1502 1506 -1.0666666666677083e+01 1502 1505 -5.3333333333333330e+00 1502 1964 -1.4136387421560532e-27 1502 2308 1.0666666666677083e+01 1502 1963 -5.3333333333333330e+00 1502 1504 -1.0666666666677083e+01 1503 1503 3.2000000000208331e+01 1504 1504 6.4000000000499995e+01 1504 2147 5.3333333333124999e+00 1504 2155 -5.3333333333124999e+00 1504 2158 1.0416666666666666e-10 1504 2148 -2.1333333333291666e+01 1504 2146 5.3333333333124999e+00 1504 1505 -1.0666666666614583e+01 1504 1510 -1.0666666666677083e+01 1504 2291 1.0416666666666666e-10 1504 2168 -2.1333333333291666e+01 1504 2308 1.0416666666666666e-10 1504 1964 -2.1333333333291666e+01 1504 1963 5.3333333333124999e+00 1504 1502 -1.0666666666677083e+01 1505 1505 5.3360416666874997e+01 1505 2308 -5.3333333333124999e+00 1505 1935 -5.3333333333124999e+00 1505 2148 2.1333333333343749e+01 1505 2158 -5.3333333333124999e+00 1505 1504 -1.0666666666614583e+01 1505 2139 -1.0416666666666667e-03 1505 2146 2.6624999999687500e+00 1505 1510 -8.0000000000000000e+00 1505 1928 5.0116116045879435e-20 1505 1931 -2.6614583333020834e+00 1505 1509 -8.0000000000000000e+00 1505 2140 6.2499999999999995e-03 1505 1500 4.1666666666666657e-03 1505 2130 1.0416666666666664e-03 1505 2135 -1.0657291666666666e+01 1505 1499 -1.0666666666666666e+01 1505 1974 -2.1333333333343749e+01 1505 1973 5.3333333333124999e+00 1505 2147 -5.3333333333958333e+00 1505 1506 -1.0666666666614583e+01 1505 1502 -5.3333333333333330e+00 1506 1506 6.4000000000499995e+01 1506 1931 -5.3333333333124999e+00 1506 1935 1.0416666666666666e-10 1506 1929 -5.3333333333124999e+00 1506 1509 -1.0666666666677083e+01 1506 1963 5.3333333333124999e+00 1506 1975 2.1333333333291666e+01 1506 1960 1.0416666666666666e-10 1506 1967 -2.1333333333291666e+01 1506 1973 -1.0416666666666666e-10 1506 1974 2.1333333333291666e+01 1506 2147 5.3333333333124999e+00 1506 1505 -1.0666666666614583e+01 1506 1502 -1.0666666666677083e+01 1507 1507 1.6000000000062499e+01 1508 1508 3.7362500000104163e+01 1509 1509 3.7343750000062499e+01 1509 1974 -1.0097419586828951e-27 1509 1975 1.0097419586828951e-27 1509 1935 1.0666666666677083e+01 1509 1506 -1.0666666666677083e+01 1509 1976 2.1961093809541182e-20 1509 1929 1.3334375000000000e+01 1509 2135 -2.1684043449710089e-19 1509 1928 5.3322916666666664e+00 1509 1499 -5.3322916666666664e+00 1509 1931 8.0000000000000000e+00 1509 1505 -8.0000000000000000e+00 1510 1510 3.7345833333395831e+01 1510 2168 1.2116903504194741e-27 1510 2148 -1.2116903504194741e-27 1510 2158 1.0666666666677083e+01 1510 1504 -1.0666666666677083e+01 1510 2146 -1.3332291666666665e+01 1510 1505 -8.0000000000000000e+00 1510 2140 -5.3322916666666664e+00 1510 2139 6.2500000000000003e-03 1510 2155 1.3332291666666665e+01 1510 2144 -5.3322916666666664e+00 1510 1500 -1.0668750000000001e+01 1511 1511 2.6683333333437499e+01 1512 1512 2.1345833333333331e+01 1513 1513 2.1343750000000000e+01 1514 1514 1.6000000000062499e+01 1515 1515 5.3333333333708325e+01 1515 1981 -5.3333333333229165e+00 1515 2003 -5.3333333333020834e+00 1515 1999 1.0666666666625000e+01 1515 1995 -1.0666666666791667e+01 1515 1520 -5.3333333333437496e+00 1515 1996 1.0666666666625000e+01 1515 1997 2.1333333333312499e+01 1515 2080 -5.3333333333229165e+00 1515 1516 -1.0666666666645833e+01 1515 1978 6.2499999999999991e-11 1515 1994 3.2000000000000000e+01 1515 4704 -5.3333333333229165e+00 1515 4107 -1.0666666666687499e+01 1516 1516 4.2666666667041660e+01 1516 2008 -1.0666666666625000e+01 1516 1995 1.0666666666625000e+01 1516 2003 1.0666666666833333e+01 1516 1520 -1.0666666666729165e+01 1516 2011 -1.5999999999958334e+01 1516 2081 -4.1666666666666665e-11 1516 2082 1.0666666666687499e+01 1516 1996 -1.5999999999958334e+01 1516 1997 -5.3333333333124999e+00 1516 2080 1.0666666666687499e+01 1516 1515 -1.0666666666645833e+01 1517 1517 2.1333333333666662e+01 1518 1518 2.1333333333458331e+01 1519 1519 1.0666666666833333e+01 1520 1520 2.1333333333499997e+01 1520 2011 5.3333333333229165e+00 1520 2003 -2.0833333333333345e-11 1520 1996 5.3333333333229165e+00 1520 1516 -1.0666666666729165e+01 1520 1995 -5.3333333333437496e+00 1520 1994 -5.3333333333229165e+00 1520 1515 -5.3333333333437496e+00 1520 2008 5.3333333333437496e+00 1520 1999 -1.0666666666729165e+01 1521 1521 3.2000000000249997e+01 1522 1522 3.2000000000249997e+01 1522 2319 1.0666666666687499e+01 1522 2315 -4.1666666666666665e-11 1522 1524 -1.0666666666687499e+01 1522 2321 -5.3333333333124999e+00 1522 1993 -5.3333333333124999e+00 1522 2316 -4.1666666666666665e-11 1522 1992 5.3333333333124999e+00 1522 1991 -1.0666666666687499e+01 1522 1523 -1.0666666666687499e+01 1522 4775 -5.3333333333124999e+00 1522 813 -4.1666666666666665e-11 1522 4071 4.1666666666666665e-11 1522 5059 -5.3333333333124999e+00 1522 4073 -1.0666666666687499e+01 1522 441 4.1666666666666665e-11 1522 818 -5.3333333333124999e+00 1522 814 1.0666666666687499e+01 1522 4068 4.1666666666666665e-11 1523 1523 4.2666666666916662e+01 1523 2319 -5.3333333333229165e+00 1523 2321 2.1333333333312499e+01 1523 1979 6.2499999999999991e-11 1523 1982 -5.3333333333229165e+00 1523 2316 6.2499999999999991e-11 1523 1992 -2.1333333333312499e+01 1523 1991 5.3333333333229165e+00 1523 1522 -1.0666666666687499e+01 1523 4706 -5.3333333333229165e+00 1523 4071 -1.0666666666666666e+01 1523 4060 -1.0666666666687499e+01 1523 4068 -1.0666666666666666e+01 1524 1524 4.2666666666916662e+01 1524 1993 2.1333333333312499e+01 1524 2315 6.2500000000000004e-11 1524 1522 -1.0666666666687499e+01 1524 1991 5.3333333333229165e+00 1524 3699 -5.3333333333229165e+00 1524 816 -6.2500000000000004e-11 1524 5005 -5.3333333333229165e+00 1524 4068 -1.0666666666666666e+01 1524 442 -1.0666666666687499e+01 1524 818 2.1333333333312499e+01 1524 814 -5.3333333333229165e+00 1524 441 -1.0666666666666666e+01 1525 1525 4.2666666667208325e+01 1525 2005 2.2851328271989659e-27 1525 1990 1.0666666666572917e+01 1525 1530 -1.0666666666666666e+01 1525 1995 -3.6295685768920020e-28 1525 1987 1.0666666666562499e+01 1525 1528 -1.0666666666666666e+01 1525 1978 -1.0416666666666666e-11 1525 1988 1.0666666666572917e+01 1525 1526 -1.0666666666666666e+01 1525 1983 6.2499999999999991e-11 1525 1989 -6.2499999999999991e-11 1525 1985 -1.0666666666583334e+01 1525 4982 -1.0416666666666666e-11 1525 4699 -1.0416666666666666e-11 1525 4305 4.1666666666666665e-11 1525 4985 -1.0416666666666666e-11 1525 4308 4.1666666666666665e-11 1525 4306 -1.0666666666666666e+01 1526 1526 4.2666666666895829e+01 1526 1987 2.0194839173657902e-27 1526 1999 -2.0194839173657902e-27 1526 1528 -5.3333333333229165e+00 1526 1995 5.3333333333229165e+00 1526 1994 2.1333333333333332e+01 1526 1978 6.2500000000000004e-11 1526 1988 -1.5999999999989583e+01 1526 1983 -5.3333333333229165e+00 1526 1525 -1.0666666666666666e+01 1526 4704 -5.3333333333229165e+00 1526 4305 -1.0666666666687499e+01 1527 1527 2.1333333333437498e+01 1528 1528 4.2666666667166666e+01 1528 2006 -6.2499999999999991e-11 1528 2009 1.0666666666729165e+01 1528 2323 -5.3333333332812494e+00 1528 1990 -4.5860624244724788e-28 1528 2005 -6.2500000000000004e-11 1528 1530 -5.3333333333229165e+00 1528 1988 2.0194839173657902e-27 1528 1987 -1.0666666666666666e+01 1528 1525 -1.0666666666666666e+01 1528 1995 6.2499999999999991e-11 1528 1994 -5.3333333332812494e+00 1528 1526 -5.3333333333229165e+00 1528 1999 -1.0666666666729165e+01 1528 2008 -6.2500000000000004e-11 1528 2007 1.0666666666666666e+01 1529 1529 2.1333333333541667e+01 1530 1530 4.2666666666895829e+01 1530 2009 -2.4233807008389483e-27 1530 1987 -2.0194839173657902e-27 1530 1528 -5.3333333333229165e+00 1530 2005 -5.3333333333229165e+00 1530 1990 -1.5999999999989583e+01 1530 1525 -1.0666666666666666e+01 1530 1989 5.3333333333229165e+00 1530 2323 2.1333333333333332e+01 1530 4982 6.2499999999999991e-11 1530 4980 -5.3333333333229165e+00 1530 4308 -1.0666666666687499e+01 1531 1531 2.1333333333437498e+01 1532 1532 4.2666666667041660e+01 1532 2325 -5.3333333333229165e+00 1532 2128 -1.0416666666666667e-10 1532 2004 5.3333333332812494e+00 1532 1547 -1.0666666666708332e+01 1532 2129 1.5999999999989583e+01 1532 2112 -5.3333333333229165e+00 1532 2109 1.0416666666666667e-10 1532 2107 -5.3333333332812494e+00 1532 2123 -5.3333333333229165e+00 1532 1538 -1.0666666666708332e+01 1532 2002 -2.0194839173657902e-27 1532 2001 -5.3333333333229165e+00 1532 1533 6.2500000000000004e-11 1532 2121 -1.5999999999989583e+01 1532 1534 -1.0666666666666666e+01 1533 1533 4.2666666667104167e+01 1533 2128 5.3333333332812494e+00 1533 2004 -1.4583333333333335e-10 1533 2326 -5.3333333332812494e+00 1533 1547 -1.0666666666729165e+01 1533 2087 -5.3333333333229165e+00 1533 2003 -1.0416666666666667e-10 1533 2011 5.3333333332812494e+00 1533 1546 -1.0666666666708332e+01 1533 2008 5.3333333333229165e+00 1533 2006 5.3333333333229165e+00 1533 2007 1.0666666666666666e+01 1533 2121 2.0194839173657902e-27 1533 2001 5.3333333333229165e+00 1533 1532 6.2499999999999991e-11 1533 2002 1.5999999999989583e+01 1533 1534 -1.0666666666666666e+01 1534 1534 4.2666666667270832e+01 1534 2003 1.0416666666666666e-11 1534 2109 -1.0416666666666665e-11 1534 1826 -1.0416666666666666e-11 1534 2087 6.2499999999999991e-11 1534 2083 -1.0416666666666666e-11 1534 1546 4.1666666666666665e-11 1534 1833 6.2499999999999991e-11 1534 1822 -1.0416666666666666e-11 1534 1542 4.1666666666666665e-11 1534 2103 -1.0666666666583334e+01 1534 1543 -1.0666666666666666e+01 1534 2112 6.2499999999999991e-11 1534 2110 -1.0416666666666666e-11 1534 1538 4.1666666666666665e-11 1534 2117 -1.0666666666583334e+01 1534 1539 -1.0666666666666666e+01 1534 2001 3.6295685768920020e-28 1534 2002 -1.0666666666572915e+01 1534 2121 1.0666666666572915e+01 1534 1533 -1.0666666666666666e+01 1534 1532 -1.0666666666666666e+01 1535 1535 2.1333333333520830e+01 1536 1536 2.1333333333541667e+01 1537 1537 2.1333333333520830e+01 1538 1538 3.2000000000229164e+01 1538 2121 5.3333333333124999e+00 1538 2123 2.8940292364521930e-29 1538 2109 5.3333333332916668e+00 1538 1532 -1.0666666666708332e+01 1538 2107 5.3333333332916668e+00 1538 1534 4.1666666666666665e-11 1538 2117 -5.3333333333124999e+00 1538 2112 1.0666666666687499e+01 1538 2110 -4.1666666666666665e-11 1538 2115 -5.3333333333124999e+00 1538 2113 1.0666666666687499e+01 1538 1539 -1.0666666666687499e+01 1539 1539 4.2666666666916662e+01 1539 1827 -5.3333333333229165e+00 1539 1826 6.2500000000000004e-11 1539 1833 -5.3333333333229165e+00 1539 1542 -1.0666666666687499e+01 1539 2117 2.1333333333312499e+01 1539 1534 -1.0666666666666666e+01 1539 2112 -5.3333333333229165e+00 1539 2110 6.2500000000000004e-11 1539 2115 2.1333333333312499e+01 1539 2113 -5.3333333333229165e+00 1539 1538 -1.0666666666687499e+01 1540 1540 2.1333333333666662e+01 1541 1541 2.1333333333520830e+01 1542 1542 3.2000000000249997e+01 1542 2115 -5.3333333333124999e+00 1542 1826 -4.1666666666666665e-11 1542 2117 -5.3333333333124999e+00 1542 1539 -1.0666666666687499e+01 1542 1827 1.0666666666687499e+01 1542 1824 -4.1666666666666665e-11 1542 1534 4.1666666666666665e-11 1542 2103 -5.3333333333124999e+00 1542 1833 1.0666666666687499e+01 1542 1822 -4.1666666666666665e-11 1542 2102 -5.3333333333124999e+00 1542 1834 1.0666666666687499e+01 1542 1543 -1.0666666666687499e+01 1543 1543 4.2666666666916662e+01 1543 2084 -5.3333333333229165e+00 1543 2083 6.2500000000000004e-11 1543 2087 -5.3333333333229165e+00 1543 1546 -1.0666666666687499e+01 1543 2103 2.1333333333312499e+01 1543 1534 -1.0666666666666666e+01 1543 1833 -5.3333333333229165e+00 1543 1822 6.2499999999999991e-11 1543 2102 2.1333333333312499e+01 1543 1834 -5.3333333333229165e+00 1543 1542 -1.0666666666687499e+01 1544 1544 2.1333333333666662e+01 1545 1545 2.1333333333458331e+01 1546 1546 3.2000000000229164e+01 1546 2002 -5.3333333333124999e+00 1546 2008 -2.8940292364521930e-29 1546 2003 -5.3333333332916668e+00 1546 1533 -1.0666666666708332e+01 1546 2102 -5.3333333333124999e+00 1546 2083 -4.1666666666666665e-11 1546 1534 4.1666666666666665e-11 1546 2103 -5.3333333333124999e+00 1546 2087 1.0666666666687499e+01 1546 1543 -1.0666666666687499e+01 1546 2011 -5.3333333332916668e+00 1546 2084 1.0666666666687499e+01 1547 1547 3.2000000000208331e+01 1547 2129 -5.3333333333124999e+00 1547 2001 -4.3283707583767993e-28 1547 2128 -5.3333333332916668e+00 1547 1532 -1.0666666666708332e+01 1547 2006 -3.1495832401145651e-28 1547 1533 -1.0666666666729165e+01 1547 2004 -1.0666666666625000e+01 1547 2326 5.3333333332916668e+00 1547 2325 1.0666666666687499e+01 1548 1548 2.1333333333604163e+01 1549 1549 4.2666666667041660e+01 1549 2328 -5.3333333333229165e+00 1549 2190 -1.0416666666666667e-10 1549 2020 5.3333333332812494e+00 1549 1564 -1.0666666666708332e+01 1549 2191 1.5999999999989583e+01 1549 2177 -5.3333333333229165e+00 1549 2174 1.0416666666666667e-10 1549 2172 -5.3333333332812494e+00 1549 2184 -5.3333333333229165e+00 1549 1555 -1.0666666666708332e+01 1549 2018 -2.0194839173657902e-27 1549 2017 -5.3333333333229165e+00 1549 1550 6.2500000000000004e-11 1549 2182 -1.5999999999989583e+01 1549 1551 -1.0666666666666666e+01 1550 1550 4.2666666667104167e+01 1550 2190 5.3333333332812494e+00 1550 2020 -1.4583333333333335e-10 1550 2329 -5.3333333332812494e+00 1550 1564 -1.0666666666729165e+01 1550 2114 -5.3333333333229165e+00 1550 2019 -1.0416666666666667e-10 1550 2029 5.3333333332812494e+00 1550 1563 -1.0666666666708332e+01 1550 2024 5.3333333333229165e+00 1550 2022 5.3333333333229165e+00 1550 2023 1.0666666666666666e+01 1550 2182 2.0194839173657902e-27 1550 2017 5.3333333333229165e+00 1550 1549 6.2499999999999991e-11 1550 2018 1.5999999999989583e+01 1550 1551 -1.0666666666666666e+01 1551 1551 4.2666666667270832e+01 1551 2019 1.0416666666666666e-11 1551 2174 -1.0416666666666665e-11 1551 1830 -1.0416666666666666e-11 1551 2114 6.2499999999999991e-11 1551 2110 -1.0416666666666666e-11 1551 1563 4.1666666666666665e-11 1551 1835 6.2499999999999991e-11 1551 1826 -1.0416666666666666e-11 1551 1559 4.1666666666666665e-11 1551 2118 -1.0666666666583334e+01 1551 1560 -1.0666666666666666e+01 1551 2177 6.2499999999999991e-11 1551 1838 1.0416666666666666e-11 1551 1555 4.1666666666666665e-11 1551 1840 -1.0666666666583334e+01 1551 1556 -1.0666666666666666e+01 1551 2017 -3.6295685768920020e-28 1551 2018 -1.0666666666572915e+01 1551 2182 1.0666666666572915e+01 1551 1550 -1.0666666666666666e+01 1551 1549 -1.0666666666666666e+01 1552 1552 2.1333333333520830e+01 1553 1553 2.1333333333541667e+01 1554 1554 2.1333333333520830e+01 1555 1555 3.2000000000229164e+01 1555 2182 5.3333333333124999e+00 1555 2184 4.3283707583767993e-28 1555 2174 5.3333333332916668e+00 1555 1549 -1.0666666666708332e+01 1555 2172 5.3333333332916668e+00 1555 1551 4.1666666666666665e-11 1555 1840 -5.3333333333124999e+00 1555 2177 1.0666666666687499e+01 1555 1838 4.1666666666666665e-11 1555 1837 -5.3333333333124999e+00 1555 2178 1.0666666666687499e+01 1555 1556 -1.0666666666687499e+01 1556 1556 4.2666666666916662e+01 1556 1831 -5.3333333333229165e+00 1556 1830 6.2499999999999991e-11 1556 1835 -5.3333333333229165e+00 1556 1559 -1.0666666666687499e+01 1556 1840 2.1333333333312499e+01 1556 1551 -1.0666666666666666e+01 1556 2177 -5.3333333333229165e+00 1556 1838 -6.2499999999999991e-11 1556 1837 2.1333333333312499e+01 1556 2178 -5.3333333333229165e+00 1556 1555 -1.0666666666687499e+01 1557 1557 2.1333333333666662e+01 1558 1558 2.1333333333520830e+01 1559 1559 3.2000000000249997e+01 1559 1837 -5.3333333333124999e+00 1559 1830 -4.1666666666666665e-11 1559 1840 -5.3333333333124999e+00 1559 1556 -1.0666666666687499e+01 1559 1831 1.0666666666687499e+01 1559 1828 -4.1666666666666665e-11 1559 1551 4.1666666666666665e-11 1559 2118 -5.3333333333124999e+00 1559 1835 1.0666666666687499e+01 1559 1826 -4.1666666666666665e-11 1559 2116 -5.3333333333124999e+00 1559 1836 1.0666666666687499e+01 1559 1560 -1.0666666666687499e+01 1560 1560 4.2666666666916662e+01 1560 2111 -5.3333333333229165e+00 1560 2110 6.2500000000000004e-11 1560 2114 -5.3333333333229165e+00 1560 1563 -1.0666666666687499e+01 1560 2118 2.1333333333312499e+01 1560 1551 -1.0666666666666666e+01 1560 1835 -5.3333333333229165e+00 1560 1826 6.2500000000000004e-11 1560 2116 2.1333333333312499e+01 1560 1836 -5.3333333333229165e+00 1560 1559 -1.0666666666687499e+01 1561 1561 2.1333333333666662e+01 1562 1562 2.1333333333458331e+01 1563 1563 3.2000000000229164e+01 1563 2018 -5.3333333333124999e+00 1563 2024 2.8940292364521930e-29 1563 2019 -5.3333333332916668e+00 1563 1550 -1.0666666666708332e+01 1563 2116 -5.3333333333124999e+00 1563 2110 -4.1666666666666665e-11 1563 1551 4.1666666666666665e-11 1563 2118 -5.3333333333124999e+00 1563 2114 1.0666666666687499e+01 1563 1560 -1.0666666666687499e+01 1563 2029 -5.3333333332916668e+00 1563 2111 1.0666666666687499e+01 1564 1564 3.2000000000208331e+01 1564 2191 -5.3333333333124999e+00 1564 2017 2.8940292364521930e-29 1564 2190 -5.3333333332916668e+00 1564 1549 -1.0666666666708332e+01 1564 2022 3.1495832401145651e-28 1564 1550 -1.0666666666729165e+01 1564 2020 -1.0666666666625000e+01 1564 2329 5.3333333332916668e+00 1564 2328 1.0666666666687499e+01 1565 1565 2.1333333333604163e+01 1566 1566 6.4000000000499995e+01 1566 2019 -5.3333333333020834e+00 1566 2025 -1.0666666666625000e+01 1566 2015 1.0666666666791667e+01 1566 1571 -5.3333333333437496e+00 1566 2038 3.2000000000000000e+01 1566 2072 1.0666666666625000e+01 1566 1570 -5.3333333333437496e+00 1566 2037 2.1333333333312499e+01 1566 2036 -1.0666666666791667e+01 1566 2109 5.3333333333020834e+00 1566 1567 -1.0666666666604167e+01 1566 2035 -6.2500000000000004e-11 1566 2033 -3.2000000000000000e+01 1566 4470 -5.3333333333229165e+00 1566 4481 -5.3333333333229165e+00 1566 3817 -1.0666666666687499e+01 1567 1567 5.3333333333833323e+01 1567 2024 -1.0666666666625000e+01 1567 2015 -1.0666666666625000e+01 1567 2019 1.0666666666833333e+01 1567 1571 -1.0666666666729165e+01 1567 2029 -1.5999999999958334e+01 1567 2123 1.0666666666625000e+01 1567 2037 -3.1999999999958334e+01 1567 2036 1.0666666666625000e+01 1567 2109 -1.0666666666833333e+01 1567 1566 -1.0666666666604167e+01 1567 1570 -1.0666666666729165e+01 1567 2107 1.5999999999958334e+01 1567 2108 1.0666666666687499e+01 1568 1568 3.2000000000249997e+01 1569 1569 1.0666666666833333e+01 1570 1570 2.1333333333499997e+01 1570 2107 -5.3333333333229165e+00 1570 2123 -5.3333333333437496e+00 1570 2038 -5.3333333333229165e+00 1570 2072 -1.0666666666729165e+01 1570 2109 2.0833333333333339e-11 1570 1566 -5.3333333333437496e+00 1570 2037 5.3333333333229165e+00 1570 2036 -5.3333333333437496e+00 1570 1567 -1.0666666666729165e+01 1571 1571 2.1333333333499997e+01 1571 2029 5.3333333333229165e+00 1571 2019 -2.0833333333333342e-11 1571 2037 5.3333333333229165e+00 1571 1567 -1.0666666666729165e+01 1571 2015 5.3333333333437496e+00 1571 2033 5.3333333333229165e+00 1571 1566 -5.3333333333437496e+00 1571 2024 5.3333333333437496e+00 1571 2025 1.0666666666729165e+01 1572 1572 3.2000000000249997e+01 1573 1573 4.2666666667208325e+01 1573 2021 1.8812360437258079e-27 1573 2074 -1.0416666666666666e-11 1573 2043 1.0666666666572917e+01 1573 1578 -1.0666666666666666e+01 1573 2035 1.0416666666666666e-11 1573 2042 -6.2499999999999991e-11 1573 2015 -3.6295685768920020e-28 1573 2016 -1.0666666666562499e+01 1573 2034 -1.0666666666572915e+01 1573 1575 -1.0666666666666666e+01 1573 1577 -1.0666666666666666e+01 1573 2040 -6.2499999999999991e-11 1573 2041 1.0666666666583334e+01 1573 4475 -1.0416666666666666e-11 1573 4377 4.1666666666666665e-11 1573 4893 -1.0416666666666666e-11 1573 4380 4.1666666666666665e-11 1573 4378 -1.0666666666666666e+01 1574 1574 2.1333333333437498e+01 1575 1575 4.2666666667166666e+01 1575 2022 -6.2499999999999991e-11 1575 2026 1.0666666666729165e+01 1575 2078 -5.3333333332812494e+00 1575 2043 -4.5860624244724788e-28 1575 2021 -6.2500000000000004e-11 1575 1578 -5.3333333333229165e+00 1575 2034 -2.0194839173657902e-27 1575 2016 1.0666666666666666e+01 1575 1573 -1.0666666666666666e+01 1575 2015 -6.2499999999999991e-11 1575 2033 5.3333333332812494e+00 1575 1577 -5.3333333333229165e+00 1575 2025 1.0666666666729165e+01 1575 2024 -6.2500000000000004e-11 1575 2023 1.0666666666666666e+01 1576 1576 2.1333333333541667e+01 1577 1577 4.2666666666895829e+01 1577 2035 -6.2500000000000004e-11 1577 2042 5.3333333333229165e+00 1577 2016 -2.0194839173657902e-27 1577 2034 1.5999999999989583e+01 1577 1573 -1.0666666666666666e+01 1577 2025 2.4233807008389483e-27 1577 1575 -5.3333333333229165e+00 1577 2033 -2.1333333333333332e+01 1577 2015 -5.3333333333229165e+00 1577 4481 -5.3333333333229165e+00 1577 4377 -1.0666666666687499e+01 1578 1578 4.2666666666895829e+01 1578 2026 -2.0194839173657902e-27 1578 2016 2.0194839173657902e-27 1578 1575 -5.3333333333229165e+00 1578 2021 -5.3333333333229165e+00 1578 2043 -1.5999999999989583e+01 1578 1573 -1.0666666666666666e+01 1578 2040 5.3333333333229165e+00 1578 2074 6.2500000000000004e-11 1578 2078 2.1333333333333332e+01 1578 4891 -5.3333333333229165e+00 1578 4380 -1.0666666666687499e+01 1579 1579 2.1333333333437498e+01 1580 1580 3.2000000000124999e+01 1580 1581 -5.3333333333333330e+00 1580 2044 5.3333333333333330e+00 1580 2047 5.3333333333333330e+00 1580 1595 -5.3333333333333330e+00 1580 2057 -1.0097419586828951e-27 1580 2049 -1.0097419586828951e-27 1580 2045 1.0666666666677083e+01 1580 1582 -1.0666666666677083e+01 1580 921 1.4136387421560532e-27 1580 931 1.4136387421560532e-27 1580 930 -1.0666666666677083e+01 1580 469 -1.0666666666677083e+01 1581 1581 6.4000000000416662e+01 1581 2044 5.3333333333958333e+00 1581 1580 -5.3333333333333330e+00 1581 2053 5.3333333333958333e+00 1581 1588 -5.3333333333333330e+00 1581 2243 5.3333333333124999e+00 1581 2054 5.3333333333124999e+00 1581 2051 2.1333333333343749e+01 1581 2245 5.3333333333124999e+00 1581 2050 -5.3333333333958333e+00 1581 1587 -1.0666666666614583e+01 1581 1596 -5.3333333333333330e+00 1581 2049 2.1333333333343749e+01 1581 2045 -5.3333333333124999e+00 1581 1582 -1.0666666666614583e+01 1581 930 5.3333333333124999e+00 1581 919 -5.3333333333124999e+00 1581 922 2.1333333333343749e+01 1581 924 5.3333333333124999e+00 1581 474 -1.0666666666614583e+01 1581 921 2.1333333333343749e+01 1581 917 -5.3333333333124999e+00 1581 916 5.3333333333958333e+00 1581 469 -1.0666666666614583e+01 1581 468 -5.3333333333333330e+00 1582 1582 6.4000000000499995e+01 1582 2047 -5.3333333333124999e+00 1582 2050 5.3333333333124999e+00 1582 2223 5.3333333333124999e+00 1582 2056 -1.0416666666666666e-10 1582 2057 2.1333333333291666e+01 1582 2285 5.3333333333124999e+00 1582 1595 -1.0666666666614583e+01 1582 1597 -1.0666666666677083e+01 1582 2054 -1.0416666666666666e-10 1582 2055 2.1333333333291666e+01 1582 2222 5.3333333333124999e+00 1582 1584 -1.0666666666614583e+01 1582 1596 -1.0666666666677083e+01 1582 2045 1.0416666666666666e-10 1582 2049 -2.1333333333291666e+01 1582 2044 -5.3333333333124999e+00 1582 1581 -1.0666666666614583e+01 1582 1580 -1.0666666666677083e+01 1583 1583 3.2000000000124999e+01 1583 2239 -1.2116903504194741e-27 1583 2224 1.0097419586828951e-27 1583 2226 1.0097419586828951e-27 1583 2217 1.0666666666677083e+01 1583 2216 5.3333333333333330e+00 1583 1592 -1.0666666666677083e+01 1583 1591 -5.3333333333333330e+00 1583 2219 -1.2116903504194741e-27 1583 2214 1.0666666666677083e+01 1583 2213 5.3333333333333330e+00 1583 1585 -1.0666666666677083e+01 1583 1584 -5.3333333333333330e+00 1584 1584 6.4000000000416662e+01 1584 2056 5.3333333333124999e+00 1584 2245 5.3333333333124999e+00 1584 2236 5.3333333333124999e+00 1584 2217 -5.3333333333124999e+00 1584 2224 2.1333333333343749e+01 1584 2229 5.3333333333124999e+00 1584 2223 -5.3333333333958333e+00 1584 1592 -1.0666666666614583e+01 1584 1597 -5.3333333333333330e+00 1584 2055 -2.1333333333343749e+01 1584 2054 5.3333333333124999e+00 1584 2222 -5.3333333333958333e+00 1584 1582 -1.0666666666614583e+01 1584 1596 -5.3333333333333330e+00 1584 2221 2.1333333333343749e+01 1584 2240 -5.3333333333124999e+00 1584 2220 -5.3333333333958333e+00 1584 1587 -1.0666666666614583e+01 1584 1586 -5.3333333333333330e+00 1584 2219 2.1333333333343749e+01 1584 2214 -5.3333333333124999e+00 1584 2213 5.3333333333958333e+00 1584 1585 -1.0666666666614583e+01 1584 1583 -5.3333333333333330e+00 1585 1585 6.4000000000499995e+01 1585 2263 -5.3333333333124999e+00 1585 2216 -5.3333333333124999e+00 1585 2220 5.3333333333124999e+00 1585 2238 -1.0416666666666666e-10 1585 2239 2.1333333333291666e+01 1585 2264 -5.3333333333124999e+00 1585 1591 -1.0666666666614583e+01 1585 1590 -1.0666666666677083e+01 1585 2236 -1.0416666666666666e-10 1585 2237 2.1333333333291666e+01 1585 2241 -5.3333333333124999e+00 1585 1589 -1.0666666666614583e+01 1585 1586 -1.0666666666677083e+01 1585 2214 1.0416666666666666e-10 1585 2219 -2.1333333333291666e+01 1585 2213 -5.3333333333124999e+00 1585 1584 -1.0666666666614583e+01 1585 1583 -1.0666666666677083e+01 1586 1586 3.2000000000124999e+01 1586 2244 -1.2116903504194741e-27 1586 2219 1.4136387421560532e-27 1586 2237 1.4136387421560532e-27 1586 2236 -1.0666666666677083e+01 1586 2241 5.3333333333333330e+00 1586 1585 -1.0666666666677083e+01 1586 1589 -5.3333333333333330e+00 1586 2221 -1.2116903504194741e-27 1586 2240 1.0666666666677083e+01 1586 2220 -5.3333333333333330e+00 1586 1587 -1.0666666666677083e+01 1586 1584 -5.3333333333333330e+00 1587 1587 6.4000000000499995e+01 1587 2053 -5.3333333333124999e+00 1587 2222 5.3333333333124999e+00 1587 2241 -5.3333333333124999e+00 1587 2245 -1.0416666666666666e-10 1587 2051 -2.1333333333291666e+01 1587 2050 5.3333333333124999e+00 1587 1581 -1.0666666666614583e+01 1587 1596 -1.0666666666677083e+01 1587 2243 -1.0416666666666666e-10 1587 2244 2.1333333333291666e+01 1587 2260 -5.3333333333124999e+00 1587 1589 -1.0666666666614583e+01 1587 1588 -1.0666666666677083e+01 1587 2240 1.0416666666666666e-10 1587 2221 -2.1333333333291666e+01 1587 2220 5.3333333333124999e+00 1587 1584 -1.0666666666614583e+01 1587 1586 -1.0666666666677083e+01 1588 1588 3.2000000000124999e+01 1588 1589 -5.3333333333333330e+00 1588 2260 5.3333333333333330e+00 1588 2053 5.3333333333333330e+00 1588 1581 -5.3333333333333330e+00 1588 2051 1.4136387421560532e-27 1588 2244 1.4136387421560532e-27 1588 2243 -1.0666666666677083e+01 1588 1587 -1.0666666666677083e+01 1588 926 -1.0097419586828951e-27 1588 922 -1.0097419586828951e-27 1588 924 -1.0666666666677083e+01 1588 474 -1.0666666666677083e+01 1589 1589 6.4000000000416662e+01 1589 2260 5.3333333333958333e+00 1589 1588 -5.3333333333333330e+00 1589 2263 5.3333333333958333e+00 1589 1590 -5.3333333333333330e+00 1589 2238 5.3333333333124999e+00 1589 2240 -5.3333333333124999e+00 1589 2237 -2.1333333333343749e+01 1589 2236 5.3333333333124999e+00 1589 2241 5.3333333333958333e+00 1589 1585 -1.0666666666614583e+01 1589 1586 -5.3333333333333330e+00 1589 2244 -2.1333333333343749e+01 1589 2243 5.3333333333124999e+00 1589 1587 -1.0666666666614583e+01 1589 1050 5.3333333333124999e+00 1589 924 5.3333333333124999e+00 1589 926 -2.1333333333343749e+01 1589 925 5.3333333333124999e+00 1589 1033 -5.3333333333958333e+00 1589 474 -1.0666666666614583e+01 1589 475 -5.3333333333333330e+00 1589 1032 2.1333333333343749e+01 1589 1052 5.3333333333124999e+00 1589 471 -1.0666666666614583e+01 1590 1590 3.2000000000124999e+01 1590 1591 -5.3333333333333330e+00 1590 2264 5.3333333333333330e+00 1590 2263 5.3333333333333330e+00 1590 1589 -5.3333333333333330e+00 1590 2237 -1.0097419586828951e-27 1590 2239 1.0097419586828951e-27 1590 2238 -1.0666666666677083e+01 1590 1585 -1.0666666666677083e+01 1590 1046 1.4136387421560532e-27 1590 1032 -1.4136387421560532e-27 1590 1052 -1.0666666666677083e+01 1590 471 -1.0666666666677083e+01 1591 1591 6.4000000000416662e+01 1591 2264 5.3333333333958333e+00 1591 1590 -5.3333333333333330e+00 1591 2267 2.1333333333343749e+01 1591 1594 -1.0666666666614583e+01 1591 2227 5.3333333333124999e+00 1591 2214 -5.3333333333124999e+00 1591 2279 -5.3333333333124999e+00 1591 2266 -5.3333333333958333e+00 1591 1593 -5.3333333333333330e+00 1591 2226 -2.1333333333343749e+01 1591 2217 -5.3333333333124999e+00 1591 2216 5.3333333333958333e+00 1591 1592 -1.0666666666614583e+01 1591 1583 -5.3333333333333330e+00 1591 2239 -2.1333333333343749e+01 1591 2238 5.3333333333124999e+00 1591 1585 -1.0666666666614583e+01 1591 1052 5.3333333333124999e+00 1591 1044 -5.3333333333124999e+00 1591 1046 2.1333333333343749e+01 1591 1042 -5.3333333333124999e+00 1591 1041 5.3333333333958333e+00 1591 471 -1.0666666666614583e+01 1591 470 -5.3333333333333330e+00 1592 1592 6.4000000000499995e+01 1592 2285 5.3333333333124999e+00 1592 2266 5.3333333333124999e+00 1592 2213 -5.3333333333124999e+00 1592 2229 -1.0416666666666666e-10 1592 2224 -2.1333333333291666e+01 1592 2223 5.3333333333124999e+00 1592 1584 -1.0666666666614583e+01 1592 1597 -1.0666666666677083e+01 1592 2227 -1.0416666666666666e-10 1592 2228 2.1333333333291666e+01 1592 2280 -5.3333333333124999e+00 1592 1595 -1.0666666666614583e+01 1592 1593 -1.0666666666677083e+01 1592 2217 1.0416666666666666e-10 1592 2226 2.1333333333291666e+01 1592 2216 -5.3333333333124999e+00 1592 1591 -1.0666666666614583e+01 1592 1583 -1.0666666666677083e+01 1593 1593 3.2000000000124999e+01 1593 1594 -1.0666666666677083e+01 1593 1595 -5.3333333333333330e+00 1593 2279 1.0666666666677083e+01 1593 2280 5.3333333333333330e+00 1593 2226 -1.4136387421560532e-27 1593 2228 1.4136387421560532e-27 1593 2227 -1.0666666666677083e+01 1593 1592 -1.0666666666677083e+01 1593 2267 -1.0097419586828951e-27 1593 2266 -5.3333333333333330e+00 1593 1591 -5.3333333333333330e+00 1593 1048 -1.0097419586828951e-27 1594 1594 6.4000000000499995e+01 1594 2279 1.0416666666666666e-10 1594 2280 -5.3333333333124999e+00 1594 1593 -1.0666666666677083e+01 1594 2267 -2.1333333333291666e+01 1594 1591 -1.0666666666614583e+01 1594 1595 -1.0666666666614583e+01 1594 2266 5.3333333333124999e+00 1594 1065 -5.3333333333124999e+00 1594 1041 -5.3333333333124999e+00 1594 1044 1.0416666666666666e-10 1594 1049 2.1333333333291666e+01 1594 1043 -5.3333333333124999e+00 1594 473 -1.0666666666614583e+01 1594 470 -1.0666666666677083e+01 1594 1047 -1.0416666666666666e-10 1594 1048 2.1333333333291666e+01 1594 1064 -5.3333333333124999e+00 1594 472 -1.0666666666677083e+01 1595 1595 6.4000000000416662e+01 1595 2279 -5.3333333333124999e+00 1595 2280 5.3333333333958333e+00 1595 1593 -5.3333333333333330e+00 1595 2047 5.3333333333958333e+00 1595 1580 -5.3333333333333330e+00 1595 1594 -1.0666666666614583e+01 1595 2045 -5.3333333333124999e+00 1595 2229 5.3333333333124999e+00 1595 2057 -2.1333333333343749e+01 1595 2056 5.3333333333124999e+00 1595 2285 -5.3333333333958333e+00 1595 1582 -1.0666666666614583e+01 1595 1597 -5.3333333333333330e+00 1595 2228 -2.1333333333343749e+01 1595 2227 5.3333333333124999e+00 1595 1592 -1.0666666666614583e+01 1595 928 5.3333333333124999e+00 1595 931 -2.1333333333343749e+01 1595 930 5.3333333333124999e+00 1595 469 -1.0666666666614583e+01 1595 1048 -2.1333333333343749e+01 1595 1047 5.3333333333124999e+00 1595 1064 5.3333333333958333e+00 1595 472 -5.3333333333333330e+00 1596 1596 3.2000000000124999e+01 1596 2049 1.2116903504194741e-27 1596 2221 1.0097419586828951e-27 1596 2051 -1.0097419586828951e-27 1596 2245 -1.0666666666677083e+01 1596 2050 -5.3333333333333330e+00 1596 1587 -1.0666666666677083e+01 1596 1581 -5.3333333333333330e+00 1596 2055 1.2116903504194741e-27 1596 2054 -1.0666666666677083e+01 1596 2222 -5.3333333333333330e+00 1596 1582 -1.0666666666677083e+01 1596 1584 -5.3333333333333330e+00 1597 1597 3.2000000000124999e+01 1597 2228 -1.2116903504194741e-27 1597 2055 -1.4136387421560532e-27 1597 2057 1.4136387421560532e-27 1597 2056 -1.0666666666677083e+01 1597 2285 -5.3333333333333330e+00 1597 1582 -1.0666666666677083e+01 1597 1595 -5.3333333333333330e+00 1597 2224 -1.2116903504194741e-27 1597 2229 -1.0666666666677083e+01 1597 2223 -5.3333333333333330e+00 1597 1592 -1.0666666666677083e+01 1597 1584 -5.3333333333333330e+00 1598 1598 2.1333333333499997e+01 1598 2069 5.3333333333229165e+00 1598 1773 -2.0833333333333342e-11 1598 2322 5.3333333333229165e+00 1598 1599 -1.0666666666729165e+01 1598 1769 5.3333333333437496e+00 1598 1774 5.3333333333437496e+00 1598 1775 1.0666666666729165e+01 1598 4862 -5.3333333333229165e+00 1598 4254 -5.3333333333437496e+00 1598 4243 2.0833333333333339e-11 1598 4863 -5.3333333333229165e+00 1598 4255 -5.3333333333437496e+00 1599 1599 5.3333333333833323e+01 1599 2005 -1.0666666666625000e+01 1599 2006 -1.0666666666625000e+01 1599 2004 1.0666666666833333e+01 1599 1601 -1.0666666666729165e+01 1599 2326 1.5999999999958334e+01 1599 2068 -5.3333333333124999e+00 1599 2070 -1.0666666666687499e+01 1599 1774 -1.0666666666625000e+01 1599 2069 -1.5999999999958334e+01 1599 1769 -1.0666666666625000e+01 1599 2322 -3.1999999999958334e+01 1599 1773 1.0666666666833333e+01 1599 1598 -1.0666666666729165e+01 1599 4255 -1.0666666666645833e+01 1599 4254 -1.0666666666604167e+01 1600 1600 3.2000000000249997e+01 1601 1601 2.1333333333499997e+01 1601 2323 -5.3333333333229165e+00 1601 2009 1.0666666666729165e+01 1601 2005 5.3333333333437496e+00 1601 2322 5.3333333333229165e+00 1601 2004 -2.0833333333333345e-11 1601 2006 5.3333333333437496e+00 1601 2326 -5.3333333333229165e+00 1601 1599 -1.0666666666729165e+01 1601 4254 -5.3333333333437496e+00 1602 1602 4.2666666667270825e+01 1602 2069 1.0416666666666666e-11 1602 2036 3.6295685768920020e-28 1602 2062 -6.2499999999999991e-11 1602 1604 4.1666666666666665e-11 1602 2128 1.0416666666666665e-11 1602 2064 1.0666666666572917e+01 1602 1603 -1.0666666666666666e+01 1602 2035 1.0416666666666666e-11 1602 2039 -1.0666666666572917e+01 1602 1607 -1.0666666666666666e+01 1602 2063 1.0666666666583334e+01 1602 1606 -1.0666666666666666e+01 1602 2058 6.2499999999999991e-11 1602 2061 -6.2499999999999991e-11 1602 2059 -1.0666666666583334e+01 1602 4846 -1.0416666666666666e-11 1602 4482 -1.0416666666666666e-11 1602 3823 4.1666666666666665e-11 1602 4477 -1.0416666666666666e-11 1602 3826 4.1666666666666665e-11 1602 3824 -1.0666666666666666e+01 1603 1603 4.2666666667041667e+01 1603 2123 6.2500000000000004e-11 1603 2038 -5.3333333332812494e+00 1603 2072 -1.0666666666729165e+01 1603 2039 -2.0194839173657902e-27 1603 2036 6.2500000000000004e-11 1603 1607 -5.3333333333229165e+00 1603 2062 5.3333333333229165e+00 1603 1602 -1.0666666666666666e+01 1603 2064 -1.5999999999989583e+01 1603 2128 -6.2499999999999991e-11 1603 2325 -5.3333333333229165e+00 1603 2129 1.5999999999989583e+01 1603 1604 -1.0666666666687499e+01 1604 1604 3.2000000000249997e+01 1604 2326 -4.1666666666666665e-11 1604 2063 5.3333333333124999e+00 1604 2069 4.1666666666666665e-11 1604 2068 -5.3333333333124999e+00 1604 2070 -1.0666666666687499e+01 1604 1606 -1.0666666666687499e+01 1604 1602 4.1666666666666665e-11 1604 2062 -1.0666666666687499e+01 1604 2064 5.3333333333124999e+00 1604 2128 4.1666666666666665e-11 1604 2325 1.0666666666687499e+01 1604 2129 -5.3333333333124999e+00 1604 1603 -1.0666666666687499e+01 1605 1605 2.1333333333604166e+01 1606 1606 4.2666666666916662e+01 1606 2062 5.3333333333229165e+00 1606 2069 -6.2500000000000004e-11 1606 2070 5.3333333333229165e+00 1606 1604 -1.0666666666687499e+01 1606 2068 2.1333333333312499e+01 1606 2063 -2.1333333333312499e+01 1606 2058 -5.3333333333229165e+00 1606 1602 -1.0666666666666666e+01 1606 4848 -5.3333333333229165e+00 1606 4846 6.2500000000000004e-11 1606 3823 -1.0666666666687499e+01 1607 1607 4.2666666666895829e+01 1607 2072 -9.1882743488121268e-30 1607 2064 2.0194839173657902e-27 1607 2036 5.3333333333229165e+00 1607 1603 -5.3333333333229165e+00 1607 2039 1.5999999999989583e+01 1607 1602 -1.0666666666666666e+01 1607 2061 5.3333333333229165e+00 1607 2035 -6.2500000000000004e-11 1607 2038 2.1333333333333332e+01 1607 4470 -5.3333333333229165e+00 1607 3826 -1.0666666666687499e+01 1608 1608 2.1333333333458331e+01 1609 1609 2.1333333333437498e+01 1610 1610 3.2000000000249997e+01 1610 1816 -5.3333333333124999e+00 1610 1763 -4.1666666666666665e-11 1610 1818 -5.3333333333124999e+00 1610 1621 -1.0666666666687499e+01 1610 1620 4.1666666666666665e-11 1610 2094 -5.3333333333124999e+00 1610 1768 1.0666666666687499e+01 1610 1786 -5.3333333333124999e+00 1610 1758 -4.1666666666666665e-11 1610 1619 4.1666666666666665e-11 1610 1787 -5.3333333333124999e+00 1610 1764 1.0666666666687499e+01 1610 1618 -1.0666666666687499e+01 1610 1761 -4.1666666666666665e-11 1610 1612 4.1666666666666665e-11 1610 2093 -5.3333333333124999e+00 1610 1762 1.0666666666687499e+01 1610 1611 -1.0666666666687499e+01 1611 1611 4.2666666666916662e+01 1611 1732 6.2500000000000004e-11 1611 2094 2.1333333333312499e+01 1611 1620 -1.0666666666666666e+01 1611 1615 -1.0666666666687499e+01 1611 1768 -5.3333333333229165e+00 1611 1734 -5.3333333333229165e+00 1611 1761 6.2500000000000004e-11 1611 2093 2.1333333333312499e+01 1611 1762 -5.3333333333229165e+00 1611 1612 -1.0666666666666666e+01 1611 1610 -1.0666666666687499e+01 1611 1023 -5.3333333333229165e+00 1612 1612 4.2666666667333331e+01 1612 1786 -1.0666666666583334e+01 1612 1618 -1.0666666666666666e+01 1612 2096 -1.0666666666583334e+01 1612 1614 -1.0666666666666666e+01 1612 2099 1.0416666666666666e-11 1612 1758 -1.0416666666666666e-11 1612 1722 -1.0416666666666666e-11 1612 2097 1.0666666666583334e+01 1612 1616 -1.0666666666666666e+01 1612 1734 6.2499999999999991e-11 1612 1732 -1.0416666666666666e-11 1612 1615 4.1666666666666665e-11 1612 2095 -6.2499999999999991e-11 1612 2315 -1.0416666666666666e-11 1612 1613 4.1666666666666665e-11 1612 1762 6.2499999999999991e-11 1612 1761 -1.0416666666666666e-11 1612 1610 4.1666666666666665e-11 1612 2093 -1.0666666666583334e+01 1612 1611 -1.0666666666666666e+01 1612 5004 -1.0416666666666666e-11 1612 1075 6.2499999999999991e-11 1612 816 1.0416666666666666e-11 1612 228 4.1666666666666665e-11 1613 1613 3.2000000000249997e+01 1613 1617 4.1666666666666665e-11 1613 2100 1.0666666666687499e+01 1613 2315 -4.1666666666666665e-11 1613 1614 -1.0666666666687499e+01 1613 2097 5.3333333333124999e+00 1613 2099 4.1666666666666665e-11 1613 2098 -5.3333333333124999e+00 1613 1616 -1.0666666666687499e+01 1613 1612 4.1666666666666665e-11 1613 2096 -5.3333333333124999e+00 1613 2095 -1.0666666666687499e+01 1613 553 -5.3333333333124999e+00 1613 552 4.1666666666666665e-11 1613 556 -5.3333333333124999e+00 1613 230 -1.0666666666687499e+01 1613 221 4.1666666666666665e-11 1613 817 -5.3333333333124999e+00 1613 815 1.0666666666687499e+01 1614 1614 4.2666666666916662e+01 1614 2096 2.1333333333312499e+01 1614 1612 -1.0666666666666666e+01 1614 2315 6.2500000000000004e-11 1614 1613 -1.0666666666687499e+01 1614 2095 5.3333333333229165e+00 1614 1075 -5.3333333333229165e+00 1614 815 -5.3333333333229165e+00 1614 816 -6.2500000000000004e-11 1614 817 2.1333333333312499e+01 1614 820 5.3333333333229165e+00 1614 221 -1.0666666666666666e+01 1614 228 -1.0666666666687499e+01 1615 1615 3.2000000000249997e+01 1615 1726 -4.1666666666666665e-11 1615 1617 4.1666666666666665e-11 1615 1723 1.0666666666687499e+01 1615 1732 -4.1666666666666665e-11 1615 1620 4.1666666666666665e-11 1615 2094 -5.3333333333124999e+00 1615 1611 -1.0666666666687499e+01 1615 2098 -5.3333333333124999e+00 1615 1722 -4.1666666666666665e-11 1615 2097 5.3333333333124999e+00 1615 1616 -1.0666666666687499e+01 1615 1612 4.1666666666666665e-11 1615 2093 -5.3333333333124999e+00 1615 1734 1.0666666666687499e+01 1615 1025 -5.3333333333124999e+00 1615 650 5.3333333333124999e+00 1615 233 -1.0666666666687499e+01 1615 1023 1.0666666666687499e+01 1616 1616 4.2666666666916662e+01 1616 2095 5.3333333333229165e+00 1616 2099 -6.2499999999999991e-11 1616 2100 -5.3333333333229165e+00 1616 1613 -1.0666666666687499e+01 1616 2098 2.1333333333312499e+01 1616 1617 -1.0666666666666666e+01 1616 1723 -5.3333333333229165e+00 1616 1722 6.2500000000000004e-11 1616 2097 -2.1333333333312499e+01 1616 1734 -5.3333333333229165e+00 1616 1612 -1.0666666666666666e+01 1616 1615 -1.0666666666687499e+01 1617 1617 5.3343750000437495e+01 1617 1723 6.2499999999999991e-11 1617 1726 -1.0416666666666666e-11 1617 1615 4.1666666666666665e-11 1617 2100 6.2499999999999991e-11 1617 1613 4.1666666666666665e-11 1617 2099 1.0416666666666666e-11 1617 1722 -1.0416666666666666e-11 1617 2098 -1.0666666666583334e+01 1617 1616 -1.0666666666666666e+01 1617 631 -5.3333333333124999e+00 1617 652 2.1333333333343749e+01 1617 227 -1.0666666666614583e+01 1617 1026 -5.3333333333124999e+00 1617 650 2.6666666665937502e+00 1617 233 -8.0000000000000000e+00 1617 559 -5.3312499999999998e+00 1617 552 1.0416666666666666e-11 1617 553 -2.6635416666250005e+00 1617 230 -8.0000000000000000e+00 1617 649 -2.1334374999999998e+01 1617 222 -1.0661458333333334e+01 1617 628 -5.3312499999999998e+00 1617 621 5.3364583333645825e+00 1617 229 -5.3333333333333330e+00 1618 1618 4.2666666666916662e+01 1618 1787 2.1333333333312499e+01 1618 1619 -1.0666666666666666e+01 1618 1786 2.1333333333312499e+01 1618 1612 -1.0666666666666666e+01 1618 1762 -5.3333333333229165e+00 1618 1758 6.2499999999999991e-11 1618 1764 -5.3333333333229165e+00 1618 1610 -1.0666666666687499e+01 1618 947 5.3333333333229165e+00 1618 5004 6.2500000000000004e-11 1618 1075 -5.3333333333229165e+00 1618 228 -1.0666666666687499e+01 1619 1619 5.3343750000437510e+01 1619 1787 -1.0666666666583334e+01 1619 1618 -1.0666666666666666e+01 1619 1816 -2.6666666665937502e+00 1619 1621 -8.0000000000000000e+00 1619 1763 -1.0416666666666666e-11 1619 1764 6.2499999999999991e-11 1619 1758 -1.0416666666666666e-11 1619 1610 4.1666666666666665e-11 1619 3474 -1.0416666666666666e-11 1619 947 -6.2499999999999991e-11 1619 5004 -1.0416666666666666e-11 1619 228 4.1666666666666665e-11 1619 974 -5.3333333333124999e+00 1619 948 2.1333333333343749e+01 1619 701 -5.3333333333124999e+00 1619 226 -1.0666666666614583e+01 1619 944 5.3312499999999998e+00 1619 946 -5.3364583333645825e+00 1619 232 -5.3333333333333330e+00 1619 943 -2.1334374999999998e+01 1619 224 -1.0661458333333334e+01 1619 940 -5.3312499999999998e+00 1619 939 -2.6635416666250000e+00 1619 231 -8.0000000000000000e+00 1620 1620 5.3333333333875004e+01 1620 1818 -2.6666666665937502e+00 1620 1621 -8.0000000000000000e+00 1620 1726 -1.0416666666666666e-11 1620 1732 -1.0416666666666666e-11 1620 1615 4.1666666666666665e-11 1620 2094 -1.0666666666583334e+01 1620 1611 -1.0666666666666666e+01 1620 1763 -1.0416666666666666e-11 1620 1768 6.2499999999999991e-11 1620 1761 -1.0416666666666666e-11 1620 1610 4.1666666666666665e-11 1620 1039 5.3333333333124999e+00 1620 701 -5.3333333333124999e+00 1620 1030 2.1333333333343749e+01 1620 1026 -5.3333333333124999e+00 1620 227 -1.0666666666614583e+01 1620 1025 -2.6666666665937502e+00 1620 233 -8.0000000000000000e+00 1620 1029 2.1333333333343749e+01 1620 1040 -5.3333333333124999e+00 1620 1028 -5.3333333333958333e+00 1620 226 -1.0666666666614583e+01 1620 225 -5.3333333333333330e+00 1620 1023 6.2499999999999991e-11 1621 1621 3.7333333333520827e+01 1621 1620 -8.0000000000000000e+00 1621 1818 1.3333333333322916e+01 1621 1816 1.3333333333322916e+01 1621 1619 -8.0000000000000000e+00 1621 1764 -5.3333333333229165e+00 1621 1763 6.2499999999999991e-11 1621 1768 -5.3333333333229165e+00 1621 1610 -1.0666666666687499e+01 1621 1029 1.4136387421560532e-27 1621 948 -1.4136387421560532e-27 1621 701 1.0666666666677083e+01 1621 226 -1.0666666666677083e+01 1622 1622 3.2000000000249997e+01 1622 1824 -4.1666666666666665e-11 1622 2102 -5.3333333333124999e+00 1622 1834 1.0666666666687499e+01 1622 1820 -4.1666666666666665e-11 1622 1825 1.0666666666687499e+01 1622 1822 -4.1666666666666665e-11 1622 2101 -5.3333333333124999e+00 1622 1823 1.0666666666687499e+01 1622 1623 -1.0666666666687499e+01 1623 1623 4.2666666666916662e+01 1623 1834 -5.3333333333229165e+00 1623 2086 -5.3333333333229165e+00 1623 2083 6.2499999999999991e-11 1623 2102 2.1333333333312499e+01 1623 2084 -5.3333333333229165e+00 1623 1625 -1.0666666666687499e+01 1623 1822 6.2500000000000004e-11 1623 2101 2.1333333333312499e+01 1623 1823 -5.3333333333229165e+00 1623 1622 -1.0666666666687499e+01 1624 1624 2.1333333333666662e+01 1625 1625 3.2000000000249997e+01 1625 2011 4.1666666666666665e-11 1625 2082 1.0666666666687499e+01 1625 2081 -4.1666666666666665e-11 1625 2101 -5.3333333333124999e+00 1625 2086 1.0666666666687499e+01 1625 2083 -4.1666666666666665e-11 1625 2102 -5.3333333333124999e+00 1625 2084 1.0666666666687499e+01 1625 1623 -1.0666666666687499e+01 1626 1626 2.1333333333666662e+01 1627 1627 2.1333333333458331e+01 1628 1628 1.0666666666833333e+01 1629 1629 2.1333333333458331e+01 1630 1630 1.0666666666833333e+01 1631 1631 2.1333333333458331e+01 1632 1632 2.1333333333458331e+01 1633 1633 3.2000000000249997e+01 1633 1828 -4.1666666666666665e-11 1633 2116 -5.3333333333124999e+00 1633 1836 1.0666666666687499e+01 1633 1824 -4.1666666666666665e-11 1633 1829 1.0666666666687499e+01 1633 1826 -4.1666666666666665e-11 1633 2115 -5.3333333333124999e+00 1633 1827 1.0666666666687499e+01 1633 1634 -1.0666666666687499e+01 1634 1634 4.2666666666916662e+01 1634 1836 -5.3333333333229165e+00 1634 2113 -5.3333333333229165e+00 1634 2110 6.2500000000000004e-11 1634 2116 2.1333333333312499e+01 1634 2111 -5.3333333333229165e+00 1634 1636 -1.0666666666687499e+01 1634 1826 6.2500000000000004e-11 1634 2115 2.1333333333312499e+01 1634 1827 -5.3333333333229165e+00 1634 1633 -1.0666666666687499e+01 1635 1635 2.1333333333666662e+01 1636 1636 3.2000000000249997e+01 1636 2029 4.1666666666666665e-11 1636 2108 1.0666666666687499e+01 1636 2107 -4.1666666666666665e-11 1636 2115 -5.3333333333124999e+00 1636 2113 1.0666666666687499e+01 1636 2110 -4.1666666666666665e-11 1636 2116 -5.3333333333124999e+00 1636 2111 1.0666666666687499e+01 1636 1634 -1.0666666666687499e+01 1637 1637 2.1333333333666662e+01 1638 1638 2.1333333333458331e+01 1639 1639 1.0666666666833333e+01 1640 1640 2.1333333333458331e+01 1641 1641 1.0666666666833333e+01 1642 1642 2.1333333333458331e+01 1643 1643 2.1333333333458331e+01 1644 1644 3.7362500000104163e+01 1645 1645 4.8025000000062505e+01 1645 2165 2.4001041666666666e+01 1645 2154 -1.0662500000000000e+01 1645 730 1.2116903504194741e-27 1645 2810 -8.0000000000000000e+00 1645 3387 1.3332291666666665e+01 1645 733 1.2116903504194741e-27 1645 732 -1.0666666666677083e+01 1645 148 -1.0666666666677083e+01 1645 2813 -5.3343749999999996e+00 1645 3388 1.0679166666666665e+01 1645 3369 5.3302083333333332e+00 1645 3367 -1.0662499999999998e+01 1645 3368 -5.3322916666666664e+00 1645 2809 -1.0664583333333333e+01 1646 1646 4.2727083333333333e+01 1646 2194 -1.0658333333333333e+01 1646 2133 1.0416666666666664e-03 1646 2134 -5.0116116045879435e-20 1646 2138 -1.0657291666666666e+01 1646 1647 -1.0666666666666666e+01 1646 2193 6.2499999999999995e-03 1646 3383 -1.0416666666666667e-03 1646 3381 -1.0658333333333333e+01 1646 2822 -1.0666666666666666e+01 1646 1013 6.2500000000000003e-03 1646 4597 -1.0416666666666667e-03 1646 491 4.1666666666666666e-03 1646 3957 -1.0666666666666666e+01 1646 3369 -1.0416666666666667e-03 1646 3386 -1.0657291666666666e+01 1646 2823 -1.0666666666666666e+01 1646 3376 6.2500000000000003e-03 1646 3373 -1.0416666666666667e-03 1646 2821 4.1666666666666666e-03 1646 4592 -1.0416666666666667e-03 1646 3956 4.1666666666666657e-03 1647 1647 4.2704166666666659e+01 1647 2193 -5.3322916666666664e+00 1647 2134 -6.2500000000000003e-03 1647 2138 1.5998958333333333e+01 1647 1646 -1.0666666666666666e+01 1647 1793 6.2499999999999986e-03 1647 1648 1.4583333333333332e-02 1647 2137 1.0672916666666666e+01 1647 2133 -6.2499999999999995e-03 1647 2132 1.5998958333333331e+01 1647 3392 -5.3281250000000000e+00 1647 3386 -2.1684043449710089e-19 1647 2823 -5.3322916666666664e+00 1647 4654 2.1684043449710089e-19 1647 4958 -5.3281250000000000e+00 1647 3964 -5.3322916666666664e+00 1647 4595 -5.3322916666666664e+00 1647 3962 -1.0666666666666666e+01 1647 3956 -1.0668750000000001e+01 1648 1648 5.3412499999999994e+01 1648 2134 5.3281250000000000e+00 1648 1647 1.4583333333333332e-02 1648 2137 -1.0662500000000000e+01 1648 1793 -5.3281250000000000e+00 1648 3672 -1.0416666666666667e-03 1648 3395 -1.0658333333333333e+01 1648 2827 -1.0666666666666666e+01 1648 3374 -1.0416666666666667e-03 1648 3393 -6.2500000000000003e-03 1648 3669 1.0416666666666667e-03 1648 2826 4.1666666666666666e-03 1648 3394 1.0658333333333333e+01 1648 2825 -1.0666666666666666e+01 1648 3378 6.2500000000000003e-03 1648 3369 -1.0416666666666667e-03 1648 2821 4.1666666666666666e-03 1648 3392 -1.0653124999999999e+01 1648 2823 -1.6001041666666666e+01 1648 4946 -1.0416666666666667e-03 1648 4958 -1.0653124999999999e+01 1648 3964 -1.6001041666666666e+01 1648 4947 6.2500000000000003e-03 1648 4950 -1.0416666666666667e-03 1648 3963 4.1666666666666666e-03 1649 1649 3.2000000000124999e+01 1649 2232 -1.0097419586828951e-27 1649 2204 1.2116903504194741e-27 1649 2210 1.2116903504194741e-27 1649 2209 -1.0666666666677083e+01 1649 2215 5.3333333333333330e+00 1649 1653 -1.0666666666677083e+01 1649 1652 -5.3333333333333330e+00 1649 2203 -1.0097419586828951e-27 1649 2212 1.0666666666677083e+01 1649 2202 -5.3333333333333330e+00 1649 1651 -1.0666666666677083e+01 1650 1650 3.2000000000208331e+01 1651 1651 6.4000000000499995e+01 1651 2215 -5.3333333333124999e+00 1651 2233 5.3333333333124999e+00 1651 2231 -1.0416666666666666e-10 1651 2232 2.1333333333291666e+01 1651 2273 -5.3333333333124999e+00 1651 1652 -1.0666666666614583e+01 1651 1661 -1.0666666666677083e+01 1651 1962 1.0416666666666666e-10 1651 2230 2.1333333333291666e+01 1651 2212 1.0416666666666666e-10 1651 2203 -2.1333333333291666e+01 1651 2202 5.3333333333124999e+00 1651 1649 -1.0666666666677083e+01 1652 1652 5.3333333333812497e+01 1652 2272 1.0416666666666666e-11 1652 1903 -3.6295685768920020e-28 1652 2274 -6.2499999999999991e-11 1652 1655 4.1666666666666665e-11 1652 2190 1.0416666666666665e-11 1652 2192 -1.0666666666572917e+01 1652 1654 -1.0666666666666666e+01 1652 2212 -5.3333333333124999e+00 1652 1910 -5.3333333333124999e+00 1652 1905 -2.6666666665833332e+00 1652 1662 -8.0000000000000000e+00 1652 2232 -2.1333333333343749e+01 1652 2231 5.3333333333124999e+00 1652 2273 -2.6666666665937497e+00 1652 1651 -1.0666666666614583e+01 1652 1661 -8.0000000000000000e+00 1652 2210 -2.1333333333343749e+01 1652 2209 5.3333333333124999e+00 1652 2215 5.3333333333958333e+00 1652 1653 -1.0666666666614583e+01 1652 1649 -5.3333333333333330e+00 1653 1653 6.4000000000499995e+01 1653 1905 -5.3333333333124999e+00 1653 1910 1.0416666666666666e-10 1653 1907 -5.3333333333124999e+00 1653 1662 -1.0666666666677083e+01 1653 2202 5.3333333333124999e+00 1653 2211 2.1333333333291666e+01 1653 2201 1.0416666666666666e-10 1653 2204 -2.1333333333291666e+01 1653 2209 -1.0416666666666666e-10 1653 2210 2.1333333333291666e+01 1653 2215 -5.3333333333124999e+00 1653 1652 -1.0666666666614583e+01 1653 1649 -1.0666666666677083e+01 1654 1654 4.2666666667041667e+01 1654 2184 6.2500000000000004e-11 1654 1907 -5.3333333332812494e+00 1654 2189 1.0666666666729165e+01 1654 1905 -2.0194839173657902e-27 1654 1903 6.2500000000000004e-11 1654 1662 -5.3333333333229165e+00 1654 2274 5.3333333333229165e+00 1654 1652 -1.0666666666666666e+01 1654 2192 1.5999999999989583e+01 1654 2190 -6.2500000000000004e-11 1654 2328 -5.3333333333229165e+00 1654 2191 1.5999999999989583e+01 1654 1655 -1.0666666666687499e+01 1655 1655 3.2000000000249997e+01 1655 2329 -4.1666666666666665e-11 1655 2273 -5.3333333333124999e+00 1655 2272 4.1666666666666665e-11 1655 2233 5.3333333333124999e+00 1655 2234 -1.0666666666687499e+01 1655 1661 -1.0666666666687499e+01 1655 1652 4.1666666666666665e-11 1655 2274 -1.0666666666687499e+01 1655 2192 -5.3333333333124999e+00 1655 2190 4.1666666666666665e-11 1655 2328 1.0666666666687499e+01 1655 2191 -5.3333333333124999e+00 1655 1654 -1.0666666666687499e+01 1656 1656 2.1333333333604166e+01 1657 1657 1.6000000000062499e+01 1658 1658 3.7333333333729158e+01 1659 1659 1.6000000000062499e+01 1660 1660 2.6666666666937495e+01 1661 1661 3.7333333333520827e+01 1661 2274 5.3333333333229165e+00 1661 2272 -6.2499999999999991e-11 1661 2234 5.3333333333229165e+00 1661 1655 -1.0666666666687499e+01 1661 2230 -1.2116903504194741e-27 1661 2233 -1.3333333333322916e+01 1661 2232 1.2116903504194741e-27 1661 2231 -1.0666666666677083e+01 1661 2273 1.3333333333322916e+01 1661 1651 -1.0666666666677083e+01 1661 1652 -8.0000000000000000e+00 1662 1662 3.7333333333499994e+01 1662 2189 -3.9470850912434592e-28 1662 2192 -2.0194839173657902e-27 1662 1903 5.3333333333229165e+00 1662 1654 -5.3333333333229165e+00 1662 2210 -1.4136387421560532e-27 1662 1652 -8.0000000000000000e+00 1662 1905 8.0000000000000000e+00 1662 2211 1.4136387421560532e-27 1662 1910 1.0666666666677083e+01 1662 1907 1.3333333333343749e+01 1662 1653 -1.0666666666677083e+01 1663 1663 2.1333333333458331e+01 1664 1664 2.1333333333437498e+01 1665 1665 3.2000000000124999e+01 1665 2261 5.3333333333333330e+00 1665 2252 5.3333333333333330e+00 1665 2250 1.4136387421560532e-27 1665 2256 1.4136387421560532e-27 1665 2255 -1.0666666666677083e+01 1665 1667 -1.0666666666677083e+01 1665 766 1.0097419586828951e-27 1665 773 1.0097419586828951e-27 1665 772 -1.0666666666677083e+01 1665 398 -1.0666666666677083e+01 1666 1666 3.2000000000208331e+01 1667 1667 6.4000000000499995e+01 1667 2258 -1.0416666666666666e-10 1667 2252 -5.3333333333124999e+00 1667 2257 2.1333333333291666e+01 1667 2249 1.0416666666666666e-10 1667 2250 -2.1333333333291666e+01 1667 2255 -1.0416666666666666e-10 1667 2256 2.1333333333291666e+01 1667 2261 -5.3333333333124999e+00 1667 1665 -1.0666666666677083e+01 1668 1668 1.6000000000062499e+01 1669 1669 3.2000000000208331e+01 1670 1670 1.6000000000104166e+01 1671 1671 1.6000000000062499e+01 1672 1672 3.2000000000124999e+01 1672 2284 1.0666666666677083e+01 1672 1674 -1.0666666666677083e+01 1672 1675 -1.0666666666677083e+01 1672 2283 1.0666666666677083e+01 1672 1817 -5.3333333333333330e+00 1672 2281 -1.2116903504194741e-27 1672 2282 1.0097419586828951e-27 1672 1673 -5.3333333333333330e+00 1672 2278 -5.3333333333333330e+00 1672 700 -1.0097419586828951e-27 1672 699 1.2116903504194741e-27 1672 294 -5.3333333333333330e+00 1673 1673 6.4000000000416662e+01 1673 2282 2.1333333333343749e+01 1673 1674 -1.0666666666614583e+01 1673 1940 -5.3333333333958333e+00 1673 2279 2.1333333333343749e+01 1673 1677 -1.0666666666614583e+01 1673 2280 -5.3333333333958333e+00 1673 2267 -5.3333333333124999e+00 1673 2269 -5.3333333333124999e+00 1673 2266 5.3333333333958333e+00 1673 1676 -5.3333333333333330e+00 1673 2281 2.1333333333343749e+01 1673 2283 -5.3333333333124999e+00 1673 1675 -1.0666666666614583e+01 1673 2284 -5.3333333333124999e+00 1673 2278 -5.3333333333958333e+00 1673 1672 -5.3333333333333330e+00 1673 704 5.3333333333124999e+00 1673 1016 -5.3333333333124999e+00 1673 308 -5.3333333333333330e+00 1673 1062 -2.1333333333343749e+01 1673 1061 5.3333333333124999e+00 1673 303 -1.0666666666614583e+01 1673 1048 5.3333333333124999e+00 1673 307 -5.3333333333333330e+00 1674 1674 6.4000000000499995e+01 1674 2282 -2.1333333333291666e+01 1674 1940 5.3333333333124999e+00 1674 1673 -1.0666666666614583e+01 1674 1819 5.3333333333124999e+00 1674 2284 1.0416666666666666e-10 1674 1817 5.3333333333124999e+00 1674 1672 -1.0666666666677083e+01 1674 2278 5.3333333333124999e+00 1674 1015 -5.3333333333124999e+00 1674 706 2.1333333333291666e+01 1674 708 -5.3333333333124999e+00 1674 302 -1.0666666666614583e+01 1674 704 -1.0416666666666666e-10 1674 308 -1.0666666666677083e+01 1674 705 -1.0416666666666666e-10 1674 295 -1.0666666666677083e+01 1674 700 -2.1333333333291666e+01 1674 294 -1.0666666666614583e+01 1675 1675 6.4000000000499995e+01 1675 1818 5.3333333333124999e+00 1675 2269 1.0416666666666666e-10 1675 1676 -1.0666666666677083e+01 1675 2283 1.0416666666666666e-10 1675 1817 5.3333333333124999e+00 1675 1672 -1.0666666666677083e+01 1675 2266 -5.3333333333124999e+00 1675 2281 -2.1333333333291666e+01 1675 2278 5.3333333333124999e+00 1675 1673 -1.0666666666614583e+01 1675 702 -1.0416666666666666e-10 1675 1028 -5.3333333333124999e+00 1675 298 -1.0666666666677083e+01 1675 703 2.1333333333291666e+01 1675 1041 5.3333333333124999e+00 1675 297 -1.0666666666614583e+01 1675 699 -2.1333333333291666e+01 1675 294 -1.0666666666614583e+01 1676 1676 3.2000000000124999e+01 1676 2269 1.0666666666677083e+01 1676 1675 -1.0666666666677083e+01 1676 1677 -1.0666666666677083e+01 1676 2267 1.0666666666677083e+01 1676 2279 -1.2116903504194741e-27 1676 2281 1.4136387421560532e-27 1676 1673 -5.3333333333333330e+00 1676 2266 5.3333333333333330e+00 1676 703 1.4136387421560532e-27 1676 1044 1.2116903504194741e-27 1676 297 -5.3333333333333330e+00 1676 1041 -5.3333333333333330e+00 1677 1677 6.4000000000499995e+01 1677 2279 -2.1333333333291666e+01 1677 1673 -1.0666666666614583e+01 1677 2280 5.3333333333124999e+00 1677 2267 1.0416666666666666e-10 1677 1676 -1.0666666666677083e+01 1677 2266 -5.3333333333124999e+00 1677 1065 5.3333333333124999e+00 1677 1049 -1.0416666666666666e-10 1677 1043 5.3333333333124999e+00 1677 312 -1.0666666666677083e+01 1677 1048 -1.0416666666666666e-10 1677 1047 2.1333333333291666e+01 1677 1064 5.3333333333124999e+00 1677 306 -1.0666666666614583e+01 1677 307 -1.0666666666677083e+01 1677 1044 -2.1333333333291666e+01 1677 297 -1.0666666666614583e+01 1677 1041 5.3333333333124999e+00 1678 1678 3.2000000000124999e+01 1678 2306 -1.0097419586828951e-27 1678 2294 1.2116903504194741e-27 1678 2299 1.2116903504194741e-27 1678 2298 -1.0666666666677083e+01 1678 2302 5.3333333333333330e+00 1678 1682 -1.0666666666677083e+01 1678 2293 -1.0097419586828951e-27 1678 2301 1.0666666666677083e+01 1678 2292 -5.3333333333333330e+00 1678 1680 -1.0666666666677083e+01 1679 1679 3.2000000000208331e+01 1680 1680 6.4000000000499995e+01 1680 2302 -5.3333333333124999e+00 1680 2305 -1.0416666666666666e-10 1680 2306 2.1333333333291666e+01 1680 1855 1.0416666666666666e-10 1680 2304 2.1333333333291666e+01 1680 2301 1.0416666666666666e-10 1680 2293 -2.1333333333291666e+01 1680 2292 5.3333333333124999e+00 1680 1678 -1.0666666666677083e+01 1681 1681 3.2000000000208331e+01 1682 1682 6.4000000000499995e+01 1682 1700 1.0416666666666666e-10 1682 2292 5.3333333333124999e+00 1682 2300 2.1333333333291666e+01 1682 2290 1.0416666666666666e-10 1682 2294 -2.1333333333291666e+01 1682 2298 -1.0416666666666666e-10 1682 2299 2.1333333333291666e+01 1682 2302 -5.3333333333124999e+00 1682 1678 -1.0666666666677083e+01 1683 1683 1.6000000000062499e+01 1684 1684 1.6000000000104166e+01 1685 1685 1.6000000000062499e+01 1686 1686 1.6000000000104166e+01 1687 1687 1.6000000000062499e+01 1688 1688 1.6000000000062499e+01 1689 1689 4.2666666666916662e+01 1689 2317 -5.3333333333229165e+00 1689 2316 6.2499999999999991e-11 1689 2319 -5.3333333333229165e+00 1689 1691 -1.0666666666687499e+01 1689 2321 2.1333333333312499e+01 1689 1979 6.2499999999999991e-11 1689 2320 2.1333333333312499e+01 1689 1984 -5.3333333333229165e+00 1689 4356 -1.0666666666666666e+01 1689 4706 -5.3333333333229165e+00 1689 4364 -1.0666666666687499e+01 1690 1690 2.1333333333666662e+01 1691 1691 3.2000000000229164e+01 1691 2319 1.0666666666687499e+01 1691 2318 5.3333333332916668e+00 1691 2320 -5.3333333333124999e+00 1691 2316 -4.1666666666666665e-11 1691 2321 -5.3333333333124999e+00 1691 1689 -1.0666666666687499e+01 1691 2317 1.0666666666687499e+01 1691 4356 4.1666666666666665e-11 1691 5059 -5.3333333333124999e+00 1691 825 4.3283707583767993e-28 1691 813 5.3333333332916668e+00 1691 4355 -1.0666666666708332e+01 1692 1692 2.1333333333520830e+01 1693 1693 3.2000000000208331e+01 1694 1694 6.4000000000291664e+01 1694 1126 1.1213657767716683e-27 1694 1717 2.1333333333291666e+01 1694 1117 -1.1000665323307010e-27 1694 1118 -2.1333333333291666e+01 1694 1114 2.1333333333343749e+01 1694 1078 1.0416666666666666e-10 1694 1712 -2.1333333333291666e+01 1695 1695 3.2000000000208331e+01 1696 1696 6.4000000000291664e+01 1696 1133 -1.1000665323307010e-27 1696 1113 1.1213657767716683e-27 1696 1115 -2.1333333333291666e+01 1696 1114 2.1333333333343749e+01 1696 1702 -2.1333333333291666e+01 1696 1091 1.0416666666666666e-10 1696 1704 2.1333333333291666e+01 1697 1697 3.2000000000208331e+01 1698 1698 6.4000000000291664e+01 1698 1117 1.3233141685082473e-27 1698 1710 2.1333333333291666e+01 1698 1113 -1.1000665323307010e-27 1698 1116 -2.1333333333291666e+01 1698 1114 2.1333333333343749e+01 1698 1102 1.0416666666666666e-10 1698 1701 -2.1333333333291666e+01 1699 1699 3.2000000000208331e+01 1700 1700 6.4000000000291664e+01 1700 1133 1.3233141685082473e-27 1700 2299 2.1333333333291666e+01 1700 1126 -1.1000665323307010e-27 1700 1125 -2.1333333333291666e+01 1700 1114 2.1333333333343749e+01 1700 1682 1.0416666666666666e-10 1700 2300 2.1333333333291666e+01 1701 1701 6.4000000000291664e+01 1701 1100 1.1000665323307010e-27 1701 1708 2.1333333333291666e+01 1701 1119 -5.3333333333124999e+00 1701 1703 1.5999999999979167e+01 1701 1116 1.0416666666666666e-10 1701 1114 -5.3333333333124999e+00 1701 1113 1.0666666666677083e+01 1701 1698 -2.1333333333291666e+01 1701 1102 -2.1333333333291666e+01 1702 1702 6.4000000000291664e+01 1702 1119 -5.3333333333124999e+00 1702 1096 -1.3233141685082473e-27 1702 1705 2.1333333333291666e+01 1702 1703 1.5999999999979167e+01 1702 1091 -2.1333333333291666e+01 1702 1115 1.0416666666666666e-10 1702 1696 -2.1333333333291666e+01 1702 1114 -5.3333333333124999e+00 1702 1113 1.0666666666677083e+01 1703 1703 6.4000000000416662e+01 1703 1096 5.3333333333333330e+00 1703 1100 5.3333333333333330e+00 1703 1115 5.3333333333124999e+00 1703 1102 -5.3333333333124999e+00 1703 1708 1.5999999999979167e+01 1703 1116 5.3333333333124999e+00 1703 1119 -5.3333333333958333e+00 1703 1701 1.5999999999979167e+01 1703 1113 -5.3333333333333330e+00 1703 1702 1.5999999999979167e+01 1703 1705 1.5999999999979167e+01 1703 1091 -5.3333333333124999e+00 1703 332 5.3333333333124999e+00 1703 396 -5.3333333333124999e+00 1703 913 1.5999999999979167e+01 1703 336 5.3333333333124999e+00 1703 342 -5.3333333333958333e+00 1703 910 -1.5999999999979167e+01 1703 343 -5.3333333333333330e+00 1703 790 -1.5999999999979167e+01 1703 789 1.5999999999979167e+01 1703 433 -5.3333333333124999e+00 1704 1704 6.4000000000291664e+01 1704 1114 5.3333333333124999e+00 1704 1098 -1.1000665323307010e-27 1704 1115 -1.0416666666666666e-10 1704 1707 -2.1333333333291666e+01 1704 1127 5.3333333333124999e+00 1704 2302 -1.5999999999979167e+01 1704 1133 -1.0666666666677083e+01 1704 1696 2.1333333333291666e+01 1704 1091 2.1333333333291666e+01 1705 1705 6.4000000000291664e+01 1705 1097 5.3333333333124999e+00 1705 1120 -1.5039633158038590e-27 1705 1706 -2.1333333333291666e+01 1705 2044 1.5999999999979167e+01 1705 1113 1.1213657767716683e-27 1705 1115 2.1333333333291666e+01 1705 1119 -2.1333333333343749e+01 1705 1091 -1.0416666666666666e-10 1705 1702 2.1333333333291666e+01 1705 1703 1.5999999999979167e+01 1705 1096 -1.0666666666677083e+01 1706 1706 6.4000000000291664e+01 1706 1127 5.3333333333124999e+00 1706 1098 1.1000665323307010e-27 1706 1707 -2.1333333333291666e+01 1706 2050 1.5999999999979167e+01 1706 1096 -1.3233141685082473e-27 1706 1091 2.1333333333291666e+01 1706 1097 -2.1333333333343749e+01 1706 1115 -1.0416666666666666e-10 1706 1705 -2.1333333333291666e+01 1706 1119 5.3333333333124999e+00 1706 2044 -1.5999999999979167e+01 1706 1120 -1.0666666666677083e+01 1707 1707 6.4000000000291664e+01 1707 1133 -1.1000665323307010e-27 1707 1704 -2.1333333333291666e+01 1707 2302 1.5999999999979167e+01 1707 1120 1.5039633158038590e-27 1707 1115 2.1333333333291666e+01 1707 1127 -2.1333333333343749e+01 1707 1091 -1.0416666666666666e-10 1707 1706 -2.1333333333291666e+01 1707 2050 -1.5999999999979167e+01 1707 1097 5.3333333333124999e+00 1707 1098 -1.0666666666677083e+01 1708 1708 6.4000000000291664e+01 1708 1138 1.3020149240672800e-27 1708 1113 -1.1000665323307010e-27 1708 1116 2.1333333333291666e+01 1708 1119 -2.1333333333343749e+01 1708 1701 2.1333333333291666e+01 1708 1703 1.5999999999979167e+01 1708 1102 -1.0416666666666666e-10 1708 1709 -2.1333333333291666e+01 1708 2046 1.5999999999979167e+01 1708 1101 5.3333333333124999e+00 1708 1100 -1.0666666666677083e+01 1709 1709 6.4000000000291664e+01 1709 1106 -1.1213657767716683e-27 1709 1711 -2.1333333333291666e+01 1709 1135 5.3333333333124999e+00 1709 2156 -1.5999999999979167e+01 1709 1116 -1.0416666666666666e-10 1709 1119 5.3333333333124999e+00 1709 1138 -1.0666666666677083e+01 1709 1100 1.1000665323307010e-27 1709 1708 -2.1333333333291666e+01 1709 2046 -1.5999999999979167e+01 1709 1102 2.1333333333291666e+01 1709 1101 -2.1333333333343749e+01 1710 1710 6.4000000000291664e+01 1710 1135 5.3333333333124999e+00 1710 1106 1.1213657767716683e-27 1710 1711 -2.1333333333291666e+01 1710 1714 1.5999999999979167e+01 1710 1102 2.1333333333291666e+01 1710 1116 -1.0416666666666666e-10 1710 1698 2.1333333333291666e+01 1710 1114 5.3333333333124999e+00 1710 1117 -1.0666666666677083e+01 1711 1711 6.4000000000291664e+01 1711 1101 5.3333333333124999e+00 1711 1138 -1.3020149240672800e-27 1711 1709 -2.1333333333291666e+01 1711 2156 1.5999999999979167e+01 1711 1117 1.3233141685082473e-27 1711 1116 2.1333333333291666e+01 1711 1135 -2.1333333333343749e+01 1711 1102 -1.0416666666666666e-10 1711 1710 -2.1333333333291666e+01 1711 1714 -1.5999999999979167e+01 1711 1106 -1.0666666666677083e+01 1712 1712 6.4000000000291664e+01 1712 1081 1.1000665323307010e-27 1712 1718 2.1333333333291666e+01 1712 1135 -5.3333333333124999e+00 1712 1714 -1.5999999999979167e+01 1712 1118 1.0416666666666666e-10 1712 1114 -5.3333333333124999e+00 1712 1117 1.0666666666677083e+01 1712 1694 -2.1333333333291666e+01 1712 1078 -2.1333333333291666e+01 1713 1713 4.2699999999999996e+01 1713 2150 1.0666666666666664e+01 1713 1106 2.1705219273391446e-19 1713 1107 -1.0672916666666666e+01 1713 1714 -2.1329166666666666e+01 1713 2153 1.0666666666666668e+01 1713 1081 1.0662500000000000e+01 1713 1083 -1.0672916666666666e+01 1714 1714 7.4691666666874994e+01 1714 1116 -5.3333333333124999e+00 1714 1078 5.3333333333124999e+00 1714 1718 -1.5999999999979167e+01 1714 1118 -5.3333333333124999e+00 1714 1135 5.3333333333958333e+00 1714 1712 -1.5999999999979167e+01 1714 1117 5.3333333333333330e+00 1714 1710 1.5999999999979167e+01 1714 1711 -1.5999999999979167e+01 1714 1102 5.3333333333124999e+00 1714 1107 5.3281250000000000e+00 1714 1106 -1.3334375000000000e+01 1714 1713 -2.1329166666666666e+01 1714 2153 -1.0658333333333331e+01 1714 1081 -2.4001041666666666e+01 1714 1083 5.3322916666666664e+00 1715 1715 4.2691666666666663e+01 1716 1716 6.4000000000291664e+01 1716 1132 -1.5039633158038590e-27 1716 1719 -2.1333333333291666e+01 1716 1126 1.1213657767716683e-27 1716 1118 2.1333333333291666e+01 1716 1123 -2.1333333333343749e+01 1716 1078 -1.0416666666666666e-10 1716 1717 -2.1333333333291666e+01 1717 1717 6.4000000000291664e+01 1717 1694 2.1333333333291666e+01 1717 1114 5.3333333333124999e+00 1717 1118 -1.0416666666666666e-10 1717 1123 5.3333333333124999e+00 1717 1126 -1.0666666666677083e+01 1717 1716 -2.1333333333291666e+01 1717 1078 2.1333333333291666e+01 1718 1718 6.4000000000291664e+01 1718 1117 -1.1000665323307010e-27 1718 1712 2.1333333333291666e+01 1718 1714 -1.5999999999979167e+01 1718 1132 1.5039633158038590e-27 1718 1118 2.1333333333291666e+01 1718 1135 -2.1333333333343749e+01 1718 1078 -1.0416666666666666e-10 1718 1719 -2.1333333333291666e+01 1718 2155 1.5999999999979167e+01 1718 1081 -1.0666666666677083e+01 1719 1719 6.4000000000291664e+01 1719 1135 5.3333333333124999e+00 1719 1118 -1.0416666666666666e-10 1719 1716 -2.1333333333291666e+01 1719 1123 5.3333333333124999e+00 1719 1132 -1.0666666666677083e+01 1719 1081 1.1000665323307010e-27 1719 1718 -2.1333333333291666e+01 1719 2155 -1.5999999999979167e+01 1719 1078 2.1333333333291666e+01 1720 1720 4.2666666667333331e+01 1720 1422 -4.1666666666666665e-11 1720 1727 -1.0666666666666666e+01 1720 1729 -1.0666666666666666e+01 1720 1172 -4.1666666666666665e-11 1720 1189 -4.1666666666666665e-11 1720 1731 -1.0666666666666666e+01 1720 1139 -4.1666666666666665e-11 1720 1721 -1.0666666666666666e+01 1721 1721 4.2666666666916662e+01 1721 1142 -5.3333333333229165e+00 1721 1755 2.1333333333312499e+01 1721 1722 -1.0666666666666666e+01 1721 1202 -5.3333333333229165e+00 1721 1189 1.0666666666687499e+01 1721 1720 -1.0666666666666666e+01 1721 1139 1.0666666666687499e+01 1722 1722 4.2666666667333331e+01 1722 1191 -1.0416666666666666e-11 1722 1202 6.2499999999999991e-11 1722 1189 -4.1666666666666665e-11 1722 1755 -1.0666666666583334e+01 1722 1721 -1.0666666666666666e+01 1722 1220 -1.0416666666666666e-11 1722 2089 -1.0666666666583334e+01 1722 1725 -1.0666666666666666e+01 1722 1617 -1.0416666666666666e-11 1722 1223 -1.0416666666666666e-11 1722 1224 6.2499999999999991e-11 1722 1221 -4.1666666666666665e-11 1722 1612 -1.0416666666666666e-11 1722 1616 6.2499999999999991e-11 1722 1615 -4.1666666666666665e-11 1722 2097 -1.0666666666583334e+01 1722 1734 -1.0666666666666666e+01 1722 1143 -1.0416666666666666e-11 1722 1142 6.2499999999999991e-11 1722 1139 -4.1666666666666665e-11 1722 2098 1.0666666666583334e+01 1722 1723 -1.0666666666666666e+01 1723 1723 4.2666666666916662e+01 1723 1143 6.2500000000000004e-11 1723 1144 -5.3333333333229165e+00 1723 1139 1.0666666666687499e+01 1723 1617 6.2500000000000004e-11 1723 1726 -1.0666666666666666e+01 1723 1615 1.0666666666687499e+01 1723 1616 -5.3333333333229165e+00 1723 2098 -2.1333333333312499e+01 1723 1722 -1.0666666666666666e+01 1723 1142 -5.3333333333229165e+00 1723 650 2.1333333333312499e+01 1723 233 -5.3333333333229165e+00 1724 1724 4.2666666667333331e+01 1724 1220 -1.0416666666666666e-11 1724 1153 -1.0416666666666666e-11 1724 1215 -1.0416666666666666e-11 1724 1219 6.2499999999999991e-11 1724 1221 -4.1666666666666665e-11 1724 1741 1.0666666666583334e+01 1724 1733 -1.0666666666666666e+01 1724 1175 -1.0416666666666666e-11 1724 1173 6.2499999999999991e-11 1724 1172 -4.1666666666666665e-11 1724 1739 1.0666666666583334e+01 1724 1731 -1.0666666666666666e+01 1724 1150 -1.0416666666666666e-11 1724 1149 6.2499999999999991e-11 1724 1148 -4.1666666666666665e-11 1724 1740 1.0666666666583334e+01 1724 1730 -1.0666666666666666e+01 1724 1191 -1.0416666666666666e-11 1724 1190 6.2499999999999991e-11 1724 1189 -4.1666666666666665e-11 1724 1737 1.0666666666583334e+01 1724 1725 -1.0666666666666666e+01 1725 1725 4.2666666666916662e+01 1725 1219 -5.3333333333229165e+00 1725 1202 -5.3333333333229165e+00 1725 1220 6.2500000000000004e-11 1725 2089 2.1333333333312499e+01 1725 1722 -1.0666666666666666e+01 1725 1224 -5.3333333333229165e+00 1725 1221 1.0666666666687499e+01 1725 1191 6.2500000000000004e-11 1725 1737 -2.1333333333312499e+01 1725 1724 -1.0666666666666666e+01 1725 1190 -5.3333333333229165e+00 1725 1189 1.0666666666687499e+01 1726 1726 4.2666666667333324e+01 1726 1620 -1.0416666666666666e-11 1726 1143 -1.0416666666666666e-11 1726 1144 6.2499999999999991e-11 1726 1139 -4.1666666666666665e-11 1726 1617 -1.0416666666666666e-11 1726 1615 -4.1666666666666665e-11 1726 1723 -1.0666666666666666e+01 1726 1282 -1.0416666666666666e-11 1726 1285 6.2499999999999991e-11 1726 1283 -4.1666666666666665e-11 1726 1278 -1.0416666666666666e-11 1726 1421 -1.0416666666666666e-11 1726 1429 6.2499999999999991e-11 1726 1422 -4.1666666666666665e-11 1726 1915 1.0666666666583334e+01 1726 1736 -1.0666666666666666e+01 1726 2196 1.0666666666583334e+01 1726 1727 -1.0666666666666666e+01 1726 233 6.2499999999999991e-11 1726 650 -1.0666666666583334e+01 1726 1025 1.0666666666583334e+01 1726 1023 -1.0666666666666666e+01 1727 1727 4.2666666666916662e+01 1727 1720 -1.0666666666666666e+01 1727 1429 -5.3333333333229165e+00 1727 1422 1.0666666666687499e+01 1727 2196 -2.1333333333312499e+01 1727 1726 -1.0666666666666666e+01 1727 1144 -5.3333333333229165e+00 1727 1139 1.0666666666687499e+01 1728 1728 4.2666666667333331e+01 1728 1150 -1.0416666666666666e-11 1728 1175 -1.0416666666666666e-11 1728 1186 6.2499999999999991e-11 1728 1172 -4.1666666666666665e-11 1728 1750 -1.0666666666583334e+01 1728 1730 -1.0666666666666666e+01 1728 1277 -1.0416666666666666e-11 1728 1421 -1.0416666666666666e-11 1728 1278 -1.0416666666666666e-11 1728 1284 6.2499999999999991e-11 1728 1283 -4.1666666666666665e-11 1728 1912 -1.0666666666583334e+01 1728 1736 -1.0666666666666666e+01 1728 1156 -1.0416666666666666e-11 1728 1171 6.2499999999999991e-11 1728 1148 -4.1666666666666665e-11 1728 1815 -1.0666666666583334e+01 1728 1735 -1.0666666666666666e+01 1728 1420 6.2499999999999991e-11 1728 1422 -4.1666666666666665e-11 1728 2195 1.0666666666583334e+01 1728 1729 -1.0666666666666666e+01 1729 1729 4.2666666666916662e+01 1729 1186 -5.3333333333229165e+00 1729 1720 -1.0666666666666666e+01 1729 1172 1.0666666666687499e+01 1729 2195 -2.1333333333312499e+01 1729 1728 -1.0666666666666666e+01 1729 1420 -5.3333333333229165e+00 1729 1422 1.0666666666687499e+01 1730 1730 4.2666666666916662e+01 1730 1171 -5.3333333333229165e+00 1730 1750 2.1333333333312499e+01 1730 1728 -1.0666666666666666e+01 1730 1186 -5.3333333333229165e+00 1730 1175 6.2500000000000004e-11 1730 1173 -5.3333333333229165e+00 1730 1172 1.0666666666687499e+01 1730 1150 6.2500000000000004e-11 1730 1740 -2.1333333333312499e+01 1730 1724 -1.0666666666666666e+01 1730 1149 -5.3333333333229165e+00 1730 1148 1.0666666666687499e+01 1731 1731 4.2666666666916662e+01 1731 1720 -1.0666666666666666e+01 1731 1190 -5.3333333333229165e+00 1731 1189 1.0666666666687499e+01 1731 1739 -2.1333333333312499e+01 1731 1724 -1.0666666666666666e+01 1731 1173 -5.3333333333229165e+00 1731 1172 1.0666666666687499e+01 1732 1732 4.2666666667333324e+01 1732 1282 -1.0416666666666666e-11 1732 1156 -1.0416666666666666e-11 1732 1160 6.2499999999999991e-11 1732 1148 -4.1666666666666665e-11 1732 1277 -1.0416666666666666e-11 1732 1281 6.2499999999999991e-11 1732 1283 -4.1666666666666665e-11 1732 1814 1.0666666666583334e+01 1732 1735 -1.0666666666666666e+01 1732 1620 -1.0416666666666666e-11 1732 1611 6.2499999999999991e-11 1732 1615 -4.1666666666666665e-11 1732 2094 1.0666666666583334e+01 1732 1215 -1.0416666666666666e-11 1732 1612 -1.0416666666666666e-11 1732 1223 -1.0416666666666666e-11 1732 1222 6.2499999999999991e-11 1732 1221 -4.1666666666666665e-11 1732 2093 1.0666666666583334e+01 1732 1734 -1.0666666666666666e+01 1732 1153 -1.0416666666666666e-11 1732 1778 -1.0666666666583334e+01 1732 1733 -1.0666666666666666e+01 1732 1023 -1.0666666666666666e+01 1733 1733 4.2666666666916662e+01 1733 1149 -5.3333333333229165e+00 1733 1741 -2.1333333333312499e+01 1733 1724 -1.0666666666666666e+01 1733 1219 -5.3333333333229165e+00 1733 1215 6.2499999999999991e-11 1733 1222 -5.3333333333229165e+00 1733 1221 1.0666666666687499e+01 1733 1153 6.2500000000000004e-11 1733 1778 2.1333333333312499e+01 1733 1732 -1.0666666666666666e+01 1733 1160 -5.3333333333229165e+00 1733 1148 1.0666666666687499e+01 1734 1734 4.2666666666916662e+01 1734 1224 -5.3333333333229165e+00 1734 2097 2.1333333333312499e+01 1734 1722 -1.0666666666666666e+01 1734 1616 -5.3333333333229165e+00 1734 1612 6.2499999999999991e-11 1734 1611 -5.3333333333229165e+00 1734 1615 1.0666666666687499e+01 1734 1223 6.2499999999999991e-11 1734 2093 -2.1333333333312499e+01 1734 1732 -1.0666666666666666e+01 1734 1222 -5.3333333333229165e+00 1734 1221 1.0666666666687499e+01 1735 1735 4.2666666666916662e+01 1735 1156 6.2499999999999991e-11 1735 1160 -5.3333333333229165e+00 1735 1148 1.0666666666687499e+01 1735 1277 6.2499999999999991e-11 1735 1814 -2.1333333333312499e+01 1735 1732 -1.0666666666666666e+01 1735 1281 -5.3333333333229165e+00 1735 1283 1.0666666666687499e+01 1735 1284 -5.3333333333229165e+00 1735 1815 2.1333333333312499e+01 1735 1728 -1.0666666666666666e+01 1735 1171 -5.3333333333229165e+00 1736 1736 4.2666666666916662e+01 1736 1285 -5.3333333333229165e+00 1736 1915 -2.1333333333312499e+01 1736 1726 -1.0666666666666666e+01 1736 1429 -5.3333333333229165e+00 1736 1421 6.2500000000000004e-11 1736 1420 -5.3333333333229165e+00 1736 1422 1.0666666666687499e+01 1736 1278 6.2500000000000004e-11 1736 1912 2.1333333333312499e+01 1736 1728 -1.0666666666666666e+01 1736 1284 -5.3333333333229165e+00 1736 1283 1.0666666666687499e+01 1737 1737 6.4000000000416662e+01 1737 1221 -5.3333333333124999e+00 1737 1192 -5.3333333333124999e+00 1737 2085 -2.1333333333312499e+01 1737 1738 -1.0666666666583334e+01 1737 1220 -1.0666666666583334e+01 1737 1219 2.1333333333312499e+01 1737 1214 -5.3333333333124999e+00 1737 1725 -2.1333333333312499e+01 1737 1724 1.0666666666583334e+01 1737 1191 -1.0666666666583334e+01 1737 1190 2.1333333333312499e+01 1737 1189 -5.3333333333124999e+00 1738 1738 4.2666666667333331e+01 1738 1150 1.0416666666666666e-11 1738 1175 1.0416666666666666e-11 1738 1173 -6.2499999999999991e-11 1738 1181 4.1666666666666665e-11 1738 1740 -1.0666666666583334e+01 1738 1747 -1.0666666666666666e+01 1738 1215 1.0416666666666666e-11 1738 1191 1.0416666666666666e-11 1738 1220 1.0416666666666666e-11 1738 1219 -6.2499999999999991e-11 1738 1214 4.1666666666666665e-11 1738 1737 -1.0666666666583334e+01 1738 2085 1.0666666666666666e+01 1738 1153 1.0416666666666666e-11 1738 1149 -6.2499999999999991e-11 1738 1159 4.1666666666666665e-11 1738 1741 -1.0666666666583334e+01 1738 1776 -1.0666666666666666e+01 1738 1190 -6.2499999999999991e-11 1738 1192 4.1666666666666665e-11 1738 1739 -1.0666666666583334e+01 1738 1742 -1.0666666666666666e+01 1739 1739 6.4000000000416662e+01 1739 1181 -5.3333333333124999e+00 1739 1189 -5.3333333333124999e+00 1739 1731 -2.1333333333312499e+01 1739 1724 1.0666666666583334e+01 1739 1173 2.1333333333312499e+01 1739 1172 -5.3333333333124999e+00 1739 1742 2.1333333333312499e+01 1739 1738 -1.0666666666583334e+01 1739 1190 2.1333333333312499e+01 1739 1192 -5.3333333333124999e+00 1740 1740 6.4000000000416662e+01 1740 1159 -5.3333333333124999e+00 1740 1747 2.1333333333312499e+01 1740 1738 -1.0666666666583334e+01 1740 1181 -5.3333333333124999e+00 1740 1175 -1.0666666666583334e+01 1740 1173 2.1333333333312499e+01 1740 1172 -5.3333333333124999e+00 1740 1730 -2.1333333333312499e+01 1740 1724 1.0666666666583334e+01 1740 1150 -1.0666666666583334e+01 1740 1149 2.1333333333312499e+01 1740 1148 -5.3333333333124999e+00 1741 1741 6.4000000000416662e+01 1741 1148 -5.3333333333124999e+00 1741 1733 -2.1333333333312499e+01 1741 1724 1.0666666666583334e+01 1741 1221 -5.3333333333124999e+00 1741 1215 -1.0666666666583334e+01 1741 1219 2.1333333333312499e+01 1741 1214 -5.3333333333124999e+00 1741 1776 2.1333333333312499e+01 1741 1738 -1.0666666666583334e+01 1741 1153 -1.0666666666583334e+01 1741 1149 2.1333333333312499e+01 1741 1159 -5.3333333333124999e+00 1742 1742 4.2666666666916662e+01 1742 1173 5.3333333333229165e+00 1742 2081 1.0666666666666666e+01 1742 1181 -1.0666666666687499e+01 1742 1739 2.1333333333312499e+01 1742 1738 -1.0666666666666666e+01 1742 1190 5.3333333333229165e+00 1742 1192 -1.0666666666687499e+01 1743 1743 3.2000000000208331e+01 1744 1744 3.2000000000208331e+01 1745 1745 4.2666666666916662e+01 1745 1161 5.3333333333229165e+00 1745 1748 -2.1333333333312499e+01 1745 1822 1.0666666666666666e+01 1745 1182 5.3333333333229165e+00 1745 1175 -6.2500000000000004e-11 1745 1178 5.3333333333229165e+00 1745 1177 -1.0666666666687499e+01 1745 1150 -6.2500000000000004e-11 1745 1746 -2.1333333333312499e+01 1745 1830 1.0666666666666666e+01 1745 1158 5.3333333333229165e+00 1745 1157 -1.0666666666687499e+01 1746 1746 6.4000000000416662e+01 1746 1167 5.3333333333124999e+00 1746 1749 -2.1333333333312499e+01 1746 1838 1.0666666666583334e+01 1746 1185 5.3333333333124999e+00 1746 1175 1.0666666666583334e+01 1746 1178 -2.1333333333312499e+01 1746 1177 5.3333333333124999e+00 1746 1745 -2.1333333333312499e+01 1746 1830 -1.0666666666583334e+01 1746 1150 1.0666666666583334e+01 1746 1158 -2.1333333333312499e+01 1746 1157 5.3333333333124999e+00 1747 1747 4.2666666666916662e+01 1747 1149 5.3333333333229165e+00 1747 1740 2.1333333333312499e+01 1747 1738 -1.0666666666666666e+01 1747 1173 5.3333333333229165e+00 1747 1175 -6.2500000000000004e-11 1747 1182 5.3333333333229165e+00 1747 1181 -1.0666666666687499e+01 1747 1150 -6.2500000000000004e-11 1747 1748 -2.1333333333312499e+01 1747 2083 1.0666666666666666e+01 1747 1161 5.3333333333229165e+00 1747 1159 -1.0666666666687499e+01 1748 1748 6.4000000000416662e+01 1748 1157 5.3333333333124999e+00 1748 1745 -2.1333333333312499e+01 1748 1822 -1.0666666666583334e+01 1748 1177 5.3333333333124999e+00 1748 1175 1.0666666666583334e+01 1748 1182 -2.1333333333312499e+01 1748 1181 5.3333333333124999e+00 1748 1747 -2.1333333333312499e+01 1748 2083 -1.0666666666583334e+01 1748 1150 1.0666666666583334e+01 1748 1161 -2.1333333333312499e+01 1748 1159 5.3333333333124999e+00 1749 1749 4.2666666666916662e+01 1749 1158 5.3333333333229165e+00 1749 1746 -2.1333333333312499e+01 1749 1838 -1.0666666666666666e+01 1749 1178 5.3333333333229165e+00 1749 1175 -6.2500000000000004e-11 1749 1186 5.3333333333229165e+00 1749 1185 -1.0666666666687499e+01 1749 1150 -6.2500000000000004e-11 1749 1750 -2.1333333333312499e+01 1749 2175 1.0666666666666666e+01 1749 1171 5.3333333333229165e+00 1749 1167 -1.0666666666687499e+01 1750 1750 6.4000000000416662e+01 1750 1148 5.3333333333124999e+00 1750 1730 2.1333333333312499e+01 1750 1728 -1.0666666666583334e+01 1750 1172 5.3333333333124999e+00 1750 1175 1.0666666666583334e+01 1750 1186 -2.1333333333312499e+01 1750 1185 5.3333333333124999e+00 1750 1749 -2.1333333333312499e+01 1750 2175 -1.0666666666583334e+01 1750 1150 1.0666666666583334e+01 1750 1171 -2.1333333333312499e+01 1750 1167 5.3333333333124999e+00 1751 1751 3.2000000000208331e+01 1752 1752 3.2000000000208331e+01 1753 1753 3.2000000000208331e+01 1754 1754 4.2666666666916662e+01 1754 2318 1.0666666666666666e+01 1754 1202 5.3333333333229165e+00 1754 1196 -1.0666666666687499e+01 1754 1755 -2.1333333333312499e+01 1754 2099 -1.0666666666666666e+01 1754 1142 5.3333333333229165e+00 1754 1146 -1.0666666666687499e+01 1755 1755 6.4000000000416662e+01 1755 1196 5.3333333333124999e+00 1755 1139 5.3333333333124999e+00 1755 1721 2.1333333333312499e+01 1755 1722 -1.0666666666583334e+01 1755 1202 -2.1333333333312499e+01 1755 1189 5.3333333333124999e+00 1755 1754 -2.1333333333312499e+01 1755 2099 1.0666666666583334e+01 1755 1142 -2.1333333333312499e+01 1755 1146 5.3333333333124999e+00 1756 1756 3.2000000000208331e+01 1757 1757 6.4000000000916657e+01 1757 1760 -2.1333333333208333e+01 1757 1206 -1.0666666666833333e+01 1757 1154 -1.0416666666666666e-11 1757 1215 -1.0416666666666666e-11 1757 1153 -1.0416666666666666e-11 1757 1152 6.2499999999999991e-11 1757 1151 -4.1666666666666665e-11 1757 1771 1.0666666666583334e+01 1757 1766 -1.0666666666666666e+01 1757 1235 -1.0416666666666666e-11 1757 1229 5.3333333332916668e+00 1757 1770 1.0666666666583334e+01 1757 1765 -1.0666666666666666e+01 1757 1758 -2.1333333333208333e+01 1757 1210 5.3333333332916668e+00 1757 3781 5.3333333333020834e+00 1757 3784 -5.3333333332812494e+00 1757 3782 2.0833333333333339e-11 1757 4460 2.1333333333291666e+01 1757 3776 5.3333333333020834e+00 1757 3783 1.0416666666666667e-10 1757 4320 1.0416666666666667e-10 1757 5011 2.1333333333291666e+01 1757 4319 -5.3333333332812494e+00 1758 1758 6.4000000000583341e+01 1758 1612 -1.0416666666666666e-11 1758 1208 -1.0416666666666666e-11 1758 1619 -1.0416666666666666e-11 1758 1618 6.2499999999999991e-11 1758 1610 -4.1666666666666665e-11 1758 1787 1.0666666666583334e+01 1758 1764 -1.0666666666666666e+01 1758 1223 -1.0416666666666666e-11 1758 1786 1.0666666666583334e+01 1758 1762 -1.0666666666666666e+01 1758 1206 1.5999999999958334e+01 1758 1757 -2.1333333333208333e+01 1758 1210 5.3333333332916668e+00 1758 3781 -1.0666666666625000e+01 1758 3782 -5.3333333333229165e+00 1758 4319 1.0416666666666667e-10 1758 5011 -3.2000000000020833e+01 1758 4320 -5.3333333332812494e+00 1759 1759 6.4000000000916657e+01 1759 1274 -5.3333333332812494e+00 1759 1209 2.0833333333333342e-11 1759 1804 2.1333333333291666e+01 1759 1763 -2.1333333333208333e+01 1759 1207 5.3333333333020834e+00 1759 1206 -1.0666666666833333e+01 1759 1156 -1.0416666666666666e-11 1759 1235 -1.0416666666666666e-11 1759 1154 -1.0416666666666666e-11 1759 1155 6.2499999999999991e-11 1759 1151 -4.1666666666666665e-11 1759 1782 -1.0666666666583334e+01 1759 1765 -1.0666666666666666e+01 1759 1277 -1.0416666666666666e-11 1759 1273 1.0416666666666667e-10 1759 1276 5.3333333332916668e+00 1759 1806 1.0666666666583334e+01 1759 1767 -1.0666666666666666e+01 1759 1230 1.0416666666666666e-10 1759 1785 -2.1333333333291666e+01 1759 1760 -2.1333333333208333e+01 1759 1229 5.3333333332916668e+00 1759 3776 5.3333333333020834e+00 1759 3784 -5.3333333332812494e+00 1760 1760 8.5333333333833338e+01 1760 1209 -5.3333333333229165e+00 1760 1757 -2.1333333333208333e+01 1760 1206 3.1999999999958334e+01 1760 1785 3.2000000000020833e+01 1760 1759 -2.1333333333208333e+01 1760 1230 -5.3333333332812494e+00 1760 1229 1.0666666666625000e+01 1760 3783 -5.3333333332812494e+00 1760 4460 -3.2000000000020833e+01 1760 3776 -2.1333333333312499e+01 1760 3782 -5.3333333333229165e+00 1760 3784 1.4583333333333335e-10 1761 1761 4.2666666667333331e+01 1761 1277 -1.0416666666666666e-11 1761 1620 -1.0416666666666666e-11 1761 1282 -1.0416666666666666e-11 1761 1281 6.2499999999999991e-11 1761 1276 -4.1666666666666665e-11 1761 2094 1.0666666666583334e+01 1761 1768 -1.0666666666666666e+01 1761 1156 -1.0416666666666666e-11 1761 1814 1.0666666666583334e+01 1761 1767 -1.0666666666666666e+01 1761 1223 -1.0416666666666666e-11 1761 1153 -1.0416666666666666e-11 1761 1160 6.2499999999999991e-11 1761 1151 -4.1666666666666665e-11 1761 1215 -1.0416666666666666e-11 1761 1222 6.2499999999999991e-11 1761 1210 -4.1666666666666665e-11 1761 1778 -1.0666666666583334e+01 1761 1766 -1.0666666666666666e+01 1761 1612 -1.0416666666666666e-11 1761 1611 6.2499999999999991e-11 1761 1610 -4.1666666666666665e-11 1761 2093 1.0666666666583334e+01 1761 1762 -1.0666666666666666e+01 1762 1762 4.2666666666916662e+01 1762 1222 -5.3333333333229165e+00 1762 1618 -5.3333333333229165e+00 1762 1223 6.2499999999999991e-11 1762 1786 -2.1333333333312499e+01 1762 1758 -1.0666666666666666e+01 1762 1210 1.0666666666687499e+01 1762 1612 6.2499999999999991e-11 1762 2093 -2.1333333333312499e+01 1762 1761 -1.0666666666666666e+01 1762 1611 -5.3333333333229165e+00 1762 1610 1.0666666666687499e+01 1762 4319 -5.3333333333229165e+00 1763 1763 6.4000000000583327e+01 1763 1619 -1.0416666666666666e-11 1763 1282 -1.0416666666666666e-11 1763 1620 -1.0416666666666666e-11 1763 1621 6.2499999999999991e-11 1763 1610 -4.1666666666666665e-11 1763 1818 1.0666666666583334e+01 1763 1768 -1.0666666666666666e+01 1763 1274 1.0416666666666666e-10 1763 1273 -5.3333333332812494e+00 1763 1276 5.3333333332916668e+00 1763 1804 -3.2000000000020833e+01 1763 1759 -2.1333333333208333e+01 1763 1209 -5.3333333333229165e+00 1763 1208 -1.0416666666666666e-11 1763 1207 -1.0666666666625000e+01 1763 1206 1.5999999999958334e+01 1763 1816 1.0666666666583334e+01 1763 1764 -1.0666666666666666e+01 1764 1764 4.2666666666916662e+01 1764 1621 -5.3333333333229165e+00 1764 1619 6.2500000000000004e-11 1764 1787 -2.1333333333312499e+01 1764 1758 -1.0666666666666666e+01 1764 1618 -5.3333333333229165e+00 1764 1610 1.0666666666687499e+01 1764 1208 6.2500000000000004e-11 1764 1816 -2.1333333333312499e+01 1764 1763 -1.0666666666666666e+01 1764 1207 -5.3333333333229165e+00 1764 1206 1.0666666666687499e+01 1764 3781 -5.3333333333229165e+00 1765 1765 4.2666666666916662e+01 1765 1230 -5.3333333333229165e+00 1765 1782 2.1333333333312499e+01 1765 1759 -1.0666666666666666e+01 1765 1155 -5.3333333333229165e+00 1765 1154 6.2500000000000004e-11 1765 1152 -5.3333333333229165e+00 1765 1151 1.0666666666687499e+01 1765 1235 6.2500000000000004e-11 1765 1770 -2.1333333333312499e+01 1765 1757 -1.0666666666666666e+01 1765 1229 1.0666666666687499e+01 1765 3783 -5.3333333333229165e+00 1766 1766 4.2666666666916662e+01 1766 1160 -5.3333333333229165e+00 1766 1778 2.1333333333312499e+01 1766 1761 -1.0666666666666666e+01 1766 1222 -5.3333333333229165e+00 1766 1215 6.2500000000000004e-11 1766 1210 1.0666666666687499e+01 1766 1153 6.2499999999999991e-11 1766 1771 -2.1333333333312499e+01 1766 1757 -1.0666666666666666e+01 1766 1152 -5.3333333333229165e+00 1766 1151 1.0666666666687499e+01 1766 4320 -5.3333333333229165e+00 1767 1767 4.2666666666916662e+01 1767 1281 -5.3333333333229165e+00 1767 1814 -2.1333333333312499e+01 1767 1761 -1.0666666666666666e+01 1767 1160 -5.3333333333229165e+00 1767 1156 6.2499999999999991e-11 1767 1155 -5.3333333333229165e+00 1767 1151 1.0666666666687499e+01 1767 1277 6.2499999999999991e-11 1767 1806 -2.1333333333312499e+01 1767 1759 -1.0666666666666666e+01 1767 1273 -5.3333333333229165e+00 1767 1276 1.0666666666687499e+01 1768 1768 4.2666666666916662e+01 1768 1274 -5.3333333333229165e+00 1768 1818 -2.1333333333312499e+01 1768 1763 -1.0666666666666666e+01 1768 1621 -5.3333333333229165e+00 1768 1620 6.2499999999999991e-11 1768 1611 -5.3333333333229165e+00 1768 1610 1.0666666666687499e+01 1768 1282 6.2500000000000004e-11 1768 2094 -2.1333333333312499e+01 1768 1761 -1.0666666666666666e+01 1768 1281 -5.3333333333229165e+00 1768 1276 1.0666666666687499e+01 1769 1769 5.3333333333749991e+01 1769 1216 3.0430870179097285e-28 1769 2322 3.2000000000020833e+01 1769 1773 -2.1333333333291666e+01 1769 1599 -1.0666666666625000e+01 1769 1598 5.3333333333437496e+00 1769 1775 -1.0666666666666666e+01 1769 3805 -4.5860624244724788e-28 1769 4243 -5.3333333333020834e+00 1769 4254 1.0666666666791667e+01 1769 3816 -6.2500000000000004e-11 1769 4862 1.0666666666583334e+01 1769 3809 5.3333333332812494e+00 1769 3814 -5.3333333333229165e+00 1769 4315 -2.2470898404921788e-28 1769 4317 -5.3333333333229165e+00 1769 4320 5.3333333333229165e+00 1769 5008 1.0666666666666666e+01 1769 5010 -1.0666666666666666e+01 1770 1770 5.3333333333749991e+01 1770 1244 1.8812360437258079e-27 1770 1165 -1.8812360437258079e-27 1770 1783 1.0666666666562499e+01 1770 1772 -1.0666666666666666e+01 1770 1154 -1.0666666666572917e+01 1770 1152 1.5999999999989583e+01 1770 1151 -5.3333333333124999e+00 1770 1765 -2.1333333333312499e+01 1770 1757 1.0666666666583334e+01 1770 1235 -1.0666666666572917e+01 1770 1229 -5.3333333333124999e+00 1770 3783 1.5999999999989583e+01 1771 1771 7.4666666667125000e+01 1771 1165 -5.3333333332812494e+00 1771 1779 2.1333333333291666e+01 1771 1772 -1.0666666666583334e+01 1771 1225 -5.3333333333229165e+00 1771 1215 -2.1333333333260416e+01 1771 1210 -5.3333333333124999e+00 1771 1766 -2.1333333333312499e+01 1771 1757 1.0666666666583334e+01 1771 1153 -1.0666666666531249e+01 1771 1152 2.1333333333333332e+01 1771 1151 -5.3333333333124999e+00 1771 4320 3.2000000000000000e+01 1772 1772 5.3333333333749991e+01 1772 1236 2.0194839173657902e-27 1772 1773 -3.2000000000020833e+01 1772 2128 2.1333333333291666e+01 1772 1216 1.0666666666625000e+01 1772 1153 -5.3333333332812494e+00 1772 1235 2.0194839173657902e-27 1772 1244 -5.3333333333229165e+00 1772 1154 -4.5860624244724788e-28 1772 1152 5.3333333333229165e+00 1772 1165 6.2499999999999991e-11 1772 1770 -1.0666666666666666e+01 1772 1783 -1.0666666666666666e+01 1772 1225 -5.3333333333437496e+00 1772 1771 -1.0666666666583334e+01 1772 1779 -1.0666666666666666e+01 1772 1215 5.3333333333020834e+00 1772 3783 5.3333333333229165e+00 1772 4320 -1.0666666666791667e+01 1773 1773 8.5333333334166667e+01 1773 1598 -2.0833333333333339e-11 1773 1769 -2.1333333333291666e+01 1773 2322 -2.1333333333208333e+01 1773 1599 1.0666666666833333e+01 1773 1774 -2.1333333333291666e+01 1773 2069 -2.1333333333208333e+01 1773 1236 -1.0666666666625000e+01 1773 1244 5.3333333332812494e+00 1773 1772 -3.2000000000020833e+01 1773 2128 -2.1333333333208333e+01 1773 1216 -2.1333333333291666e+01 1773 1225 5.3333333333229165e+00 1773 4255 -5.3333333333020834e+00 1773 4317 5.3333333332812494e+00 1773 4254 -5.3333333333020834e+00 1773 3790 5.3333333332812494e+00 1773 3783 -1.4583333333333335e-10 1773 4320 1.0666666666583334e+01 1774 1774 5.3333333333749991e+01 1774 1599 -1.0666666666625000e+01 1774 1236 -2.8113590706237963e-30 1774 2069 3.2000000000020833e+01 1774 1773 -2.1333333333291666e+01 1774 1598 5.3333333333437496e+00 1774 1775 -1.0666666666666666e+01 1774 3809 5.3333333332812494e+00 1774 3785 -2.0194839173657902e-27 1774 3790 -5.3333333333229165e+00 1774 3783 5.3333333333229165e+00 1774 3797 2.0194839173657902e-27 1774 3816 -6.2499999999999991e-11 1774 3811 -5.3333333333229165e+00 1774 4454 -1.0666666666666666e+01 1774 4456 1.0666666666666666e+01 1774 4863 1.0666666666583334e+01 1774 4243 -5.3333333333020834e+00 1774 4255 1.0666666666791667e+01 1775 1775 4.2666666666999994e+01 1775 1769 -1.0666666666666666e+01 1775 1774 -1.0666666666666666e+01 1775 1598 1.0666666666729165e+01 1775 4254 -1.0666666666625000e+01 1775 3814 2.2851328271989659e-27 1775 4862 -2.1333333333291666e+01 1775 3811 -1.8812360437258079e-27 1775 3809 -1.0666666666625000e+01 1775 3816 1.0666666666729165e+01 1775 4863 -2.1333333333291666e+01 1775 4243 1.0666666666833333e+01 1775 4255 -1.0666666666625000e+01 1776 1776 4.2666666666916662e+01 1776 1166 5.3333333333229165e+00 1776 1219 5.3333333333229165e+00 1776 1153 -6.2499999999999991e-11 1776 1741 2.1333333333312499e+01 1776 1738 -1.0666666666666666e+01 1776 1149 5.3333333333229165e+00 1776 1159 -1.0666666666687499e+01 1776 1215 -6.2500000000000004e-11 1776 1777 -2.1333333333312499e+01 1776 2003 -1.0666666666666666e+01 1776 1211 5.3333333333229165e+00 1776 1214 -1.0666666666687499e+01 1777 1777 7.4666666667124986e+01 1777 1159 5.3333333333124999e+00 1777 1225 5.3333333333229165e+00 1777 2001 1.0666666666583334e+01 1777 1779 -2.1333333333291666e+01 1777 1153 1.0666666666531249e+01 1777 1166 -2.1333333333333332e+01 1777 1165 5.3333333332812494e+00 1777 1776 -2.1333333333312499e+01 1777 2003 1.0666666666583334e+01 1777 1215 2.1333333333260416e+01 1777 1211 -3.2000000000000000e+01 1777 1214 5.3333333333124999e+00 1778 1778 6.4000000000416662e+01 1778 1151 5.3333333333124999e+00 1778 1766 2.1333333333312499e+01 1778 1761 -1.0666666666583334e+01 1778 1210 5.3333333333124999e+00 1778 1215 1.0666666666583334e+01 1778 1222 -2.1333333333312499e+01 1778 1221 5.3333333333124999e+00 1778 1733 2.1333333333312499e+01 1778 1732 -1.0666666666583334e+01 1778 1153 1.0666666666583334e+01 1778 1160 -2.1333333333312499e+01 1778 1148 5.3333333333124999e+00 1779 1779 4.2666666666999994e+01 1779 1152 -3.6295685768920020e-28 1779 1771 2.1333333333291666e+01 1779 1772 -1.0666666666666666e+01 1779 1215 -1.0666666666833333e+01 1779 1211 1.0666666666625000e+01 1779 1225 -1.0666666666729165e+01 1779 1166 2.2851328271989659e-27 1779 1777 -2.1333333333291666e+01 1779 2001 -1.0666666666666666e+01 1779 1153 1.0666666666625000e+01 1779 1165 -1.0666666666729165e+01 1779 4320 1.0666666666625000e+01 1780 1780 4.2666666666916662e+01 1780 1170 5.3333333333229165e+00 1780 1154 -6.2499999999999991e-11 1780 1162 -1.0666666666687499e+01 1780 1165 5.3333333333229165e+00 1780 1783 -2.1333333333312499e+01 1780 2109 1.0666666666666666e+01 1780 1244 5.3333333333229165e+00 1780 1235 -6.2500000000000004e-11 1780 1781 -2.1333333333312499e+01 1780 2019 -1.0666666666666666e+01 1780 1231 5.3333333333229165e+00 1780 1234 -1.0666666666687499e+01 1781 1781 7.4666666667124986e+01 1781 1162 5.3333333333124999e+00 1781 1245 5.3333333333229165e+00 1781 2017 1.0666666666583334e+01 1781 1784 -2.1333333333291666e+01 1781 1154 1.0666666666531249e+01 1781 1170 -2.1333333333333332e+01 1781 1169 5.3333333332812494e+00 1781 1780 -2.1333333333312499e+01 1781 2019 1.0666666666583334e+01 1781 1235 2.1333333333260416e+01 1781 1231 -3.2000000000000000e+01 1781 1234 5.3333333333124999e+00 1782 1782 7.4666666667125000e+01 1782 1169 5.3333333332812494e+00 1782 1784 -2.1333333333291666e+01 1782 1807 1.0666666666583334e+01 1782 1245 5.3333333333229165e+00 1782 1235 2.1333333333260416e+01 1782 1230 -3.2000000000000000e+01 1782 1229 5.3333333333124999e+00 1782 1765 2.1333333333312499e+01 1782 1759 -1.0666666666583334e+01 1782 1154 1.0666666666531249e+01 1782 1155 -2.1333333333333332e+01 1782 1151 5.3333333333124999e+00 1783 1783 5.3333333333749998e+01 1783 1162 5.3333333333124999e+00 1783 1780 -2.1333333333312499e+01 1783 2109 -1.0666666666583334e+01 1783 1234 5.3333333333124999e+00 1783 1235 1.0666666666572915e+01 1783 1244 -1.5999999999989583e+01 1783 1152 2.2851328271989659e-27 1783 1770 1.0666666666562499e+01 1783 1772 -1.0666666666666666e+01 1783 1154 1.0666666666572915e+01 1783 1165 -1.5999999999989583e+01 1783 3783 3.6295685768920020e-28 1784 1784 4.2666666666999994e+01 1784 1155 -4.0939925783957852e-29 1784 1782 -2.1333333333291666e+01 1784 1807 -1.0666666666666666e+01 1784 1230 1.0666666666625000e+01 1784 1235 -1.0666666666833333e+01 1784 1231 1.0666666666625000e+01 1784 1245 -1.0666666666729165e+01 1784 1170 2.2851328271989659e-27 1784 1781 -2.1333333333291666e+01 1784 2017 -1.0666666666666666e+01 1784 1154 1.0666666666625000e+01 1784 1169 -1.0666666666729165e+01 1785 1785 5.3333333333750005e+01 1785 1471 6.2499999999999991e-11 1785 1803 1.0666666666666666e+01 1785 1811 1.0666666666666666e+01 1785 1209 -5.3333333333437496e+00 1785 1206 1.0666666666625000e+01 1785 1229 -3.5848693552059962e-28 1785 1760 3.2000000000020833e+01 1785 1759 -2.1333333333291666e+01 1785 1230 -5.3333333333229165e+00 1785 3977 -5.3333333332812494e+00 1785 3791 2.0194839173657902e-27 1785 3968 -2.0194839173657902e-27 1785 3976 5.3333333333229165e+00 1785 4461 -1.0666666666666666e+01 1785 4462 -1.0666666666583334e+01 1785 3780 5.3333333333020834e+00 1785 3776 -1.0666666666791667e+01 1785 3784 5.3333333333229165e+00 1786 1786 6.4000000000416662e+01 1786 1223 -1.0666666666583334e+01 1786 1612 -1.0666666666583334e+01 1786 1618 2.1333333333312499e+01 1786 1610 -5.3333333333124999e+00 1786 1762 -2.1333333333312499e+01 1786 1758 1.0666666666583334e+01 1786 1210 -5.3333333333124999e+00 1786 4319 2.1333333333312499e+01 1786 4318 -5.3333333333124999e+00 1786 1075 -2.1333333333312499e+01 1786 5004 1.0666666666583334e+01 1786 228 -5.3333333333124999e+00 1787 1787 6.4000000000416662e+01 1787 1619 -1.0666666666583334e+01 1787 1618 2.1333333333312499e+01 1787 1208 -1.0666666666583334e+01 1787 1206 -5.3333333333124999e+00 1787 1764 -2.1333333333312499e+01 1787 1758 1.0666666666583334e+01 1787 1610 -5.3333333333124999e+00 1787 228 -5.3333333333124999e+00 1787 947 2.1333333333312499e+01 1787 5004 1.0666666666583334e+01 1787 3781 2.1333333333312499e+01 1787 290 -5.3333333333124999e+00 1788 1788 4.2708333333333329e+01 1788 1790 -1.0666666666666666e+01 1788 1259 1.0666666666666666e+01 1788 4960 -1.0666666666666666e+01 1788 4288 1.0666666666666666e+01 1789 1789 8.5416666666666671e+01 1789 1250 5.3322916666666664e+00 1789 1793 -3.2002083333333331e+01 1789 2130 -2.1320833333333333e+01 1789 1254 5.3281250000000000e+00 1789 1255 -1.0662500000000000e+01 1789 1087 -2.0833333333333342e-03 1789 1791 -2.1329166666666666e+01 1789 2145 2.1320833333333333e+01 1789 1085 1.0683333333333334e+01 1789 1790 -2.1329166666666669e+01 1789 2141 2.1320833333333333e+01 1789 1249 -2.1329166666666666e+01 1789 4021 -1.4583333333333332e-02 1789 4288 1.0658333333333331e+01 1790 1790 5.3375000000000014e+01 1790 1259 -6.2499999999999986e-03 1790 1788 -1.0666666666666666e+01 1790 1795 -1.0666666666666668e+01 1790 1087 5.3343749999999996e+00 1790 1085 -1.0662500000000000e+01 1790 1249 -2.0761130467597592e-20 1790 2141 -3.2002083333333331e+01 1790 1789 -2.1329166666666669e+01 1790 4288 5.3322916666666664e+00 1791 1791 5.3375000000000007e+01 1791 1259 -6.2499999999999986e-03 1791 1795 -1.0666666666666664e+01 1791 1255 2.7157993871341005e-20 1791 2145 -3.2002083333333331e+01 1791 1789 -2.1329166666666666e+01 1791 1087 5.3343749999999996e+00 1791 1085 -1.0662500000000000e+01 1791 1792 -1.0666666666666666e+01 1791 4021 5.3322916666666664e+00 1792 1792 4.2708333333333329e+01 1792 1259 1.0666666666666666e+01 1792 1791 -1.0666666666666666e+01 1792 4962 -1.0666666666666666e+01 1792 4021 1.0666666666666666e+01 1793 1793 5.3375000000000007e+01 1793 1251 5.3302083333333332e+00 1793 1647 6.2499999999999995e-03 1793 2137 1.0666666666666664e+01 1793 1648 -5.3281250000000000e+00 1793 1249 1.0662500000000000e+01 1793 1250 -5.3343749999999996e+00 1793 1255 1.4973071994693204e-20 1793 1789 -3.2002083333333331e+01 1793 2130 2.1329166666666669e+01 1793 1254 -5.3322916666666664e+00 1793 2132 1.0666666666666666e+01 1793 3962 2.1684043449710089e-19 1793 4958 -1.0658333333333331e+01 1793 3964 5.3322916666666664e+00 1793 4288 -1.0679166666666665e+01 1793 4018 4.9904357809065860e-20 1793 4021 5.3322916666666664e+00 1793 4654 -1.0666666666666666e+01 1794 1794 4.2699999999999996e+01 1794 1259 1.0672916666666666e+01 1794 4960 -1.0666666666666664e+01 1794 4962 -1.0666666666666668e+01 1794 4285 1.0672916666666666e+01 1795 1795 4.2699999999999996e+01 1795 1791 -1.0666666666666664e+01 1795 1259 1.0672916666666666e+01 1795 1790 -1.0666666666666668e+01 1795 1087 1.0672916666666666e+01 1796 1796 4.2691666666666663e+01 1797 1797 2.1354166666666668e+01 1798 1798 2.1354166666666668e+01 1799 1799 4.2691666666666663e+01 1800 1800 2.1354166666666668e+01 1801 1801 2.1354166666666668e+01 1802 1802 5.3333333333749991e+01 1802 1239 -5.7186808026555811e-29 1802 2077 3.2000000000020833e+01 1802 1808 -2.1333333333291666e+01 1802 1443 -1.0666666666625000e+01 1802 1442 5.3333333333437496e+00 1802 1438 1.0666666666791667e+01 1802 1471 -6.2500000000000004e-11 1802 1950 -1.0666666666583334e+01 1802 1810 -1.0666666666666666e+01 1802 1468 -5.3333333333229165e+00 1802 1238 -5.3333333333229165e+00 1802 1230 5.3333333333229165e+00 1802 2076 -1.0666666666666666e+01 1802 1803 -1.0666666666666666e+01 1802 3968 -4.5860624244724788e-28 1802 3950 -5.3333333333020834e+00 1802 3975 5.3333333332812494e+00 1802 3791 -2.2470898404921788e-28 1803 1803 4.2666666667083327e+01 1803 1785 1.0666666666666666e+01 1803 1468 -1.8812360437258079e-27 1803 1471 1.0666666666666666e+01 1803 1238 -1.8812360437258079e-27 1803 2076 1.0666666666562499e+01 1803 1802 -1.0666666666666666e+01 1803 1230 1.0666666666666666e+01 1803 3784 3.6295685768920020e-28 1803 3976 1.8812360437258079e-27 1803 4461 -1.0666666666562499e+01 1803 3968 -1.0666666666562499e+01 1803 3791 -1.0666666666562499e+01 1804 1804 5.3333333333749998e+01 1804 1465 2.2470898404921788e-28 1804 1471 -6.2500000000000004e-11 1804 1819 1.0666666666583334e+01 1804 1811 -1.0666666666666666e+01 1804 1472 -5.3333333333229165e+00 1804 1276 -2.8320667257631078e-28 1804 1763 -3.2000000000020833e+01 1804 1759 2.1333333333291666e+01 1804 1207 1.0666666666791667e+01 1804 1209 5.3333333333437496e+00 1804 1206 -1.0666666666625000e+01 1804 1271 4.5860624244724788e-28 1804 1274 -5.3333333333229165e+00 1804 1273 5.3333333333229165e+00 1804 1817 1.0666666666666666e+01 1804 1805 -1.0666666666666666e+01 1804 3780 -5.3333333333020834e+00 1804 3977 5.3333333332812494e+00 1805 1805 4.2666666667083327e+01 1805 1472 -1.8812360437258079e-27 1805 1270 -3.6295685768920020e-28 1805 1469 1.8812360437258079e-27 1805 1465 -1.0666666666562499e+01 1805 1471 1.0666666666666666e+01 1805 2270 -1.0666666666562499e+01 1805 1809 -1.0666666666666666e+01 1805 1274 -2.2851328271989659e-27 1805 1817 -1.0666666666562499e+01 1805 1804 -1.0666666666666666e+01 1805 1271 -1.0666666666562499e+01 1805 1273 1.0666666666666666e+01 1806 1806 5.3333333333749991e+01 1806 1279 1.8812360437258079e-27 1806 1169 -1.8812360437258079e-27 1806 1812 1.0666666666562499e+01 1806 1807 -1.0666666666666666e+01 1806 1156 -1.0666666666572917e+01 1806 1155 1.5999999999989583e+01 1806 1151 -5.3333333333124999e+00 1806 1767 -2.1333333333312499e+01 1806 1759 1.0666666666583334e+01 1806 1277 -1.0666666666572917e+01 1806 1273 1.5999999999989583e+01 1806 1276 -5.3333333333124999e+00 1807 1807 5.3333333333749991e+01 1807 1275 2.0194839173657902e-27 1807 1808 -3.2000000000020833e+01 1807 2190 2.1333333333291666e+01 1807 1239 1.0666666666625000e+01 1807 1154 -5.3333333332812494e+00 1807 1277 2.0194839173657902e-27 1807 1273 5.3333333333229165e+00 1807 1279 -5.3333333333229165e+00 1807 1156 -4.5860624244724788e-28 1807 1155 5.3333333333229165e+00 1807 1169 6.2499999999999991e-11 1807 1806 -1.0666666666666666e+01 1807 1812 -1.0666666666666666e+01 1807 1245 -5.3333333333437496e+00 1807 1782 1.0666666666583334e+01 1807 1784 -1.0666666666666666e+01 1807 1235 5.3333333333020834e+00 1807 1230 -1.0666666666791667e+01 1808 1808 8.5333333334166667e+01 1808 1440 -5.3333333333020834e+00 1808 1238 5.3333333332812494e+00 1808 1442 -2.0833333333333339e-11 1808 1802 -2.1333333333291666e+01 1808 2077 -2.1333333333208333e+01 1808 1438 -5.3333333333020834e+00 1808 1443 1.0666666666833333e+01 1808 1809 -2.1333333333291666e+01 1808 2272 -2.1333333333208333e+01 1808 1270 5.3333333332812494e+00 1808 1273 -1.4583333333333335e-10 1808 1275 -1.0666666666625000e+01 1808 1279 5.3333333332812494e+00 1808 1807 -3.2000000000020833e+01 1808 2190 -2.1333333333208333e+01 1808 1230 1.0666666666583334e+01 1808 1239 -2.1333333333291666e+01 1808 1245 5.3333333333229165e+00 1809 1809 5.3333333333749991e+01 1809 1443 -1.0666666666625000e+01 1809 1275 -6.0691943799667649e-29 1809 2272 3.2000000000020833e+01 1809 1808 -2.1333333333291666e+01 1809 1271 -2.0194839173657902e-27 1809 1270 -5.3333333333229165e+00 1809 1273 5.3333333333229165e+00 1809 1465 2.0194839173657902e-27 1809 1471 -6.2499999999999991e-11 1809 1469 -5.3333333333229165e+00 1809 1805 -1.0666666666666666e+01 1809 2270 1.0666666666666666e+01 1809 1442 5.3333333333437496e+00 1809 1951 -1.0666666666583334e+01 1809 1810 -1.0666666666666666e+01 1809 1440 1.0666666666791667e+01 1809 3975 5.3333333332812494e+00 1809 3950 -5.3333333333020834e+00 1810 1810 4.2666666666999994e+01 1810 1438 -1.0666666666625000e+01 1810 1468 1.8812360437258079e-27 1810 1950 2.1333333333291666e+01 1810 1802 -1.0666666666666666e+01 1810 1469 -1.8812360437258079e-27 1810 1471 1.0666666666729165e+01 1810 1951 2.1333333333291666e+01 1810 1809 -1.0666666666666666e+01 1810 1440 -1.0666666666625000e+01 1810 1442 1.0666666666729165e+01 1810 3975 -1.0666666666625000e+01 1810 3950 1.0666666666833333e+01 1811 1811 4.2666666666999994e+01 1811 1207 -1.0666666666625000e+01 1811 1472 1.8812360437258079e-27 1811 1819 -2.1333333333291666e+01 1811 1804 -1.0666666666666666e+01 1811 1471 1.0666666666729165e+01 1811 1785 1.0666666666666666e+01 1811 1209 1.0666666666729165e+01 1811 3976 -2.2851328271989659e-27 1811 3977 -1.0666666666625000e+01 1811 4462 -2.1333333333291666e+01 1811 3780 1.0666666666833333e+01 1811 3776 -1.0666666666625000e+01 1812 1812 5.3333333333749998e+01 1812 1167 5.3333333333124999e+00 1812 1813 -2.1333333333312499e+01 1812 2174 -1.0666666666583334e+01 1812 1280 5.3333333333124999e+00 1812 1273 -3.6295685768920020e-28 1812 1277 1.0666666666572915e+01 1812 1279 -1.5999999999989583e+01 1812 1155 1.8812360437258079e-27 1812 1806 1.0666666666562499e+01 1812 1807 -1.0666666666666666e+01 1812 1156 1.0666666666572915e+01 1812 1169 -1.5999999999989583e+01 1813 1813 4.2666666666916662e+01 1813 1171 5.3333333333229165e+00 1813 1815 -2.1333333333312499e+01 1813 2175 1.0666666666666666e+01 1813 1284 5.3333333333229165e+00 1813 1156 -6.2499999999999991e-11 1813 1167 -1.0666666666687499e+01 1813 1169 5.3333333333229165e+00 1813 1277 -6.2499999999999991e-11 1813 1812 -2.1333333333312499e+01 1813 2174 1.0666666666666666e+01 1813 1280 -1.0666666666687499e+01 1813 1279 5.3333333333229165e+00 1814 1814 6.4000000000416662e+01 1814 1156 -1.0666666666583334e+01 1814 1160 2.1333333333312499e+01 1814 1148 -5.3333333333124999e+00 1814 1735 -2.1333333333312499e+01 1814 1732 1.0666666666583334e+01 1814 1277 -1.0666666666583334e+01 1814 1281 2.1333333333312499e+01 1814 1283 -5.3333333333124999e+00 1814 1276 -5.3333333333124999e+00 1814 1767 -2.1333333333312499e+01 1814 1761 1.0666666666583334e+01 1814 1151 -5.3333333333124999e+00 1815 1815 6.4000000000416662e+01 1815 1167 5.3333333333124999e+00 1815 1813 -2.1333333333312499e+01 1815 2175 -1.0666666666583334e+01 1815 1280 5.3333333333124999e+00 1815 1277 1.0666666666583334e+01 1815 1284 -2.1333333333312499e+01 1815 1283 5.3333333333124999e+00 1815 1735 2.1333333333312499e+01 1815 1728 -1.0666666666583334e+01 1815 1156 1.0666666666583334e+01 1815 1171 -2.1333333333312499e+01 1815 1148 5.3333333333124999e+00 1816 1816 6.4000000000416662e+01 1816 1208 -2.6666666665937502e+00 1816 1207 1.3333333333322916e+01 1816 1619 -2.6666666665937502e+00 1816 1621 1.3333333333322916e+01 1816 1610 -5.3333333333124999e+00 1816 1764 -2.1333333333312499e+01 1816 1763 1.0666666666583334e+01 1816 1206 -5.3333333333124999e+00 1816 299 5.3333333333124999e+00 1816 286 -5.3333333333124999e+00 1816 698 -1.5999999999979167e+01 1816 296 5.3333333333124999e+00 1816 294 -5.3333333333958333e+00 1816 712 -1.5999999999979167e+01 1816 300 -5.3333333333333330e+00 1816 948 1.5999999999979167e+01 1816 701 -1.5999999999979167e+01 1816 226 -5.3333333333124999e+00 1817 1817 5.3333333333749998e+01 1817 1674 5.3333333333124999e+00 1817 1290 -5.3333333333124999e+00 1817 1271 -2.6666666665833327e+00 1817 1274 8.0000000000000000e+00 1817 1675 5.3333333333124999e+00 1817 2283 1.5999999999979167e+01 1817 1672 -5.3333333333333330e+00 1817 2284 1.5999999999979167e+01 1817 1470 -5.3333333333124999e+00 1817 1465 -2.6666666665833327e+00 1817 1472 8.0000000000000000e+00 1817 1471 -2.2851328271989659e-27 1817 1273 -1.8812360437258079e-27 1817 1805 -1.0666666666562499e+01 1817 1804 1.0666666666666666e+01 1817 699 -1.5999999999979167e+01 1817 294 -5.3333333333958333e+00 1817 700 -1.5999999999979167e+01 1818 1818 6.4000000000416662e+01 1818 1675 5.3333333333124999e+00 1818 1620 -2.6666666665937502e+00 1818 1621 1.3333333333322916e+01 1818 1290 -5.3333333333124999e+00 1818 1282 -2.6666666665937502e+00 1818 1274 1.3333333333322916e+01 1818 1276 -5.3333333333124999e+00 1818 1768 -2.1333333333312499e+01 1818 1763 1.0666666666583334e+01 1818 1610 -5.3333333333124999e+00 1818 226 -5.3333333333124999e+00 1818 701 -1.5999999999979167e+01 1818 299 5.3333333333124999e+00 1818 294 -5.3333333333958333e+00 1818 1029 1.5999999999979167e+01 1818 298 -5.3333333333333330e+00 1818 702 -1.5999999999979167e+01 1818 699 -1.5999999999979167e+01 1819 1819 7.4666666667125000e+01 1819 1470 -5.3333333333124999e+00 1819 1472 1.3333333333343749e+01 1819 1674 5.3333333333124999e+00 1819 1207 2.4000000000010417e+01 1819 1209 -5.3333333333229165e+00 1819 1804 1.0666666666583334e+01 1819 1811 -2.1333333333291666e+01 1819 1471 -5.3333333332812494e+00 1819 296 5.3333333333124999e+00 1819 3977 -2.6666666665416665e+00 1819 700 -1.5999999999979167e+01 1819 294 -5.3333333333958333e+00 1819 705 -1.5999999999979167e+01 1819 295 -5.3333333333333330e+00 1819 707 1.5999999999979167e+01 1819 698 -1.5999999999979167e+01 1819 286 -5.3333333333124999e+00 1819 3780 -1.3333333333270833e+01 1820 1820 4.2666666667333331e+01 1820 1622 -4.1666666666666665e-11 1820 1825 -1.0666666666666666e+01 1820 1823 -1.0666666666666666e+01 1820 1177 -4.1666666666666665e-11 1820 1298 -4.1666666666666665e-11 1820 1832 -1.0666666666666666e+01 1820 1291 -4.1666666666666665e-11 1820 1821 -1.0666666666666666e+01 1821 1821 4.2666666666916662e+01 1821 1828 -1.0666666666666666e+01 1821 1298 1.0666666666687499e+01 1821 1820 -1.0666666666666666e+01 1821 1291 1.0666666666687499e+01 1822 1822 4.2666666667333331e+01 1822 1534 -1.0416666666666666e-11 1822 1543 6.2499999999999991e-11 1822 1542 -4.1666666666666665e-11 1822 2102 1.0666666666583334e+01 1822 1834 -1.0666666666666666e+01 1822 1164 -1.0416666666666666e-11 1822 2103 1.0666666666583334e+01 1822 1833 -1.0666666666666666e+01 1822 1150 -1.0416666666666666e-11 1822 1161 6.2499999999999991e-11 1822 1157 -4.1666666666666665e-11 1822 1175 -1.0416666666666666e-11 1822 1182 6.2499999999999991e-11 1822 1177 -4.1666666666666665e-11 1822 1748 -1.0666666666583334e+01 1822 1745 1.0666666666666666e+01 1822 1623 6.2499999999999991e-11 1822 1622 -4.1666666666666665e-11 1822 2101 1.0666666666583334e+01 1822 1823 -1.0666666666666666e+01 1823 1823 4.2666666666916662e+01 1823 1182 -5.3333333333229165e+00 1823 1820 -1.0666666666666666e+01 1823 1177 1.0666666666687499e+01 1823 2101 -2.1333333333312499e+01 1823 1822 -1.0666666666666666e+01 1823 1623 -5.3333333333229165e+00 1823 1622 1.0666666666687499e+01 1824 1824 4.2666666667333331e+01 1824 1633 -4.1666666666666665e-11 1824 1829 -1.0666666666666666e+01 1824 1827 -1.0666666666666666e+01 1824 1542 -4.1666666666666665e-11 1824 1622 -4.1666666666666665e-11 1824 1834 -1.0666666666666666e+01 1824 1291 -4.1666666666666665e-11 1824 1825 -1.0666666666666666e+01 1825 1825 4.2666666666916662e+01 1825 1820 -1.0666666666666666e+01 1825 1622 1.0666666666687499e+01 1825 1824 -1.0666666666666666e+01 1825 1291 1.0666666666687499e+01 1826 1826 4.2666666667333331e+01 1826 1551 -1.0416666666666666e-11 1826 1560 6.2499999999999991e-11 1826 1559 -4.1666666666666665e-11 1826 2116 1.0666666666583334e+01 1826 1836 -1.0666666666666666e+01 1826 1168 -1.0416666666666666e-11 1826 2118 1.0666666666583334e+01 1826 1835 -1.0666666666666666e+01 1826 1164 -1.0416666666666666e-11 1826 1163 6.2499999999999991e-11 1826 1157 -4.1666666666666665e-11 1826 1534 -1.0416666666666666e-11 1826 1539 6.2499999999999991e-11 1826 1542 -4.1666666666666665e-11 1826 2117 1.0666666666583334e+01 1826 1833 -1.0666666666666666e+01 1826 1634 6.2499999999999991e-11 1826 1633 -4.1666666666666665e-11 1826 2115 1.0666666666583334e+01 1826 1827 -1.0666666666666666e+01 1827 1827 4.2666666666916662e+01 1827 1539 -5.3333333333229165e+00 1827 1824 -1.0666666666666666e+01 1827 1542 1.0666666666687499e+01 1827 2115 -2.1333333333312499e+01 1827 1826 -1.0666666666666666e+01 1827 1634 -5.3333333333229165e+00 1827 1633 1.0666666666687499e+01 1828 1828 4.2666666667333331e+01 1828 1298 -4.1666666666666665e-11 1828 1821 -1.0666666666666666e+01 1828 1831 -1.0666666666666666e+01 1828 1559 -4.1666666666666665e-11 1828 1633 -4.1666666666666665e-11 1828 1836 -1.0666666666666666e+01 1828 1291 -4.1666666666666665e-11 1828 1829 -1.0666666666666666e+01 1829 1829 4.2666666666916662e+01 1829 1824 -1.0666666666666666e+01 1829 1633 1.0666666666687499e+01 1829 1828 -1.0666666666666666e+01 1829 1291 1.0666666666687499e+01 1830 1830 4.2666666667333331e+01 1830 1168 -1.0416666666666666e-11 1830 1551 -1.0416666666666666e-11 1830 1556 6.2499999999999991e-11 1830 1559 -4.1666666666666665e-11 1830 1840 1.0666666666583334e+01 1830 1835 -1.0666666666666666e+01 1830 1175 -1.0416666666666666e-11 1830 1178 6.2499999999999991e-11 1830 1177 -4.1666666666666665e-11 1830 1839 1.0666666666583334e+01 1830 1832 -1.0666666666666666e+01 1830 1150 -1.0416666666666666e-11 1830 1158 6.2499999999999991e-11 1830 1157 -4.1666666666666665e-11 1830 1746 -1.0666666666583334e+01 1830 1745 1.0666666666666666e+01 1830 1299 6.2499999999999991e-11 1830 1298 -4.1666666666666665e-11 1830 1837 1.0666666666583334e+01 1830 1831 -1.0666666666666666e+01 1831 1831 4.2666666666916662e+01 1831 1556 -5.3333333333229165e+00 1831 1828 -1.0666666666666666e+01 1831 1559 1.0666666666687499e+01 1831 1837 -2.1333333333312499e+01 1831 1830 -1.0666666666666666e+01 1831 1299 -5.3333333333229165e+00 1831 1298 1.0666666666687499e+01 1832 1832 4.2666666666916662e+01 1832 1820 -1.0666666666666666e+01 1832 1299 -5.3333333333229165e+00 1832 1298 1.0666666666687499e+01 1832 1839 -2.1333333333312499e+01 1832 1830 -1.0666666666666666e+01 1832 1178 -5.3333333333229165e+00 1832 1177 1.0666666666687499e+01 1833 1833 4.2666666666916662e+01 1833 1163 -5.3333333333229165e+00 1833 2117 -2.1333333333312499e+01 1833 1826 -1.0666666666666666e+01 1833 1539 -5.3333333333229165e+00 1833 1534 6.2499999999999991e-11 1833 1543 -5.3333333333229165e+00 1833 1542 1.0666666666687499e+01 1833 1164 6.2499999999999991e-11 1833 2103 -2.1333333333312499e+01 1833 1822 -1.0666666666666666e+01 1833 1161 -5.3333333333229165e+00 1833 1157 1.0666666666687499e+01 1834 1834 4.2666666666916662e+01 1834 1824 -1.0666666666666666e+01 1834 1623 -5.3333333333229165e+00 1834 1622 1.0666666666687499e+01 1834 2102 -2.1333333333312499e+01 1834 1822 -1.0666666666666666e+01 1834 1543 -5.3333333333229165e+00 1834 1542 1.0666666666687499e+01 1835 1835 4.2666666666916662e+01 1835 1158 -5.3333333333229165e+00 1835 1840 -2.1333333333312499e+01 1835 1830 -1.0666666666666666e+01 1835 1556 -5.3333333333229165e+00 1835 1551 6.2499999999999991e-11 1835 1560 -5.3333333333229165e+00 1835 1559 1.0666666666687499e+01 1835 1168 6.2500000000000004e-11 1835 2118 -2.1333333333312499e+01 1835 1826 -1.0666666666666666e+01 1835 1163 -5.3333333333229165e+00 1835 1157 1.0666666666687499e+01 1836 1836 4.2666666666916662e+01 1836 1828 -1.0666666666666666e+01 1836 1634 -5.3333333333229165e+00 1836 1633 1.0666666666687499e+01 1836 2116 -2.1333333333312499e+01 1836 1826 -1.0666666666666666e+01 1836 1560 -5.3333333333229165e+00 1836 1559 1.0666666666687499e+01 1837 1837 6.4000000000416662e+01 1837 1559 -5.3333333333124999e+00 1837 1301 -5.3333333333124999e+00 1837 2178 -2.1333333333312499e+01 1837 1838 -1.0666666666583334e+01 1837 1556 2.1333333333312499e+01 1837 1555 -5.3333333333124999e+00 1837 1831 -2.1333333333312499e+01 1837 1830 1.0666666666583334e+01 1837 1299 2.1333333333312499e+01 1837 1298 -5.3333333333124999e+00 1838 1838 4.2666666667333331e+01 1838 1150 1.0416666666666666e-11 1838 1175 1.0416666666666666e-11 1838 1178 -6.2499999999999991e-11 1838 1185 4.1666666666666665e-11 1838 1746 1.0666666666583334e+01 1838 1749 -1.0666666666666666e+01 1838 1551 1.0416666666666666e-11 1838 1556 -6.2499999999999991e-11 1838 1555 4.1666666666666665e-11 1838 1837 -1.0666666666583334e+01 1838 2178 1.0666666666666666e+01 1838 1168 1.0416666666666666e-11 1838 1158 -6.2499999999999991e-11 1838 1167 4.1666666666666665e-11 1838 1840 -1.0666666666583334e+01 1838 2177 1.0666666666666666e+01 1838 1299 -6.2499999999999991e-11 1838 1301 4.1666666666666665e-11 1838 1839 -1.0666666666583334e+01 1838 1841 -1.0666666666666666e+01 1839 1839 6.4000000000416662e+01 1839 1185 -5.3333333333124999e+00 1839 1298 -5.3333333333124999e+00 1839 1832 -2.1333333333312499e+01 1839 1830 1.0666666666583334e+01 1839 1178 2.1333333333312499e+01 1839 1177 -5.3333333333124999e+00 1839 1841 2.1333333333312499e+01 1839 1838 -1.0666666666583334e+01 1839 1299 2.1333333333312499e+01 1839 1301 -5.3333333333124999e+00 1840 1840 6.4000000000416662e+01 1840 1157 -5.3333333333124999e+00 1840 1835 -2.1333333333312499e+01 1840 1830 1.0666666666583334e+01 1840 1559 -5.3333333333124999e+00 1840 1551 -1.0666666666583334e+01 1840 1556 2.1333333333312499e+01 1840 1555 -5.3333333333124999e+00 1840 2177 -2.1333333333312499e+01 1840 1838 -1.0666666666583334e+01 1840 1168 -1.0666666666583334e+01 1840 1158 2.1333333333312499e+01 1840 1167 -5.3333333333124999e+00 1841 1841 4.2666666666916662e+01 1841 1178 5.3333333333229165e+00 1841 2176 1.0666666666666666e+01 1841 1185 -1.0666666666687499e+01 1841 1839 2.1333333333312499e+01 1841 1838 -1.0666666666666666e+01 1841 1299 5.3333333333229165e+00 1841 1301 -1.0666666666687499e+01 1842 1842 3.2000000000208331e+01 1843 1843 3.2000000000208331e+01 1844 1844 3.2000000000208331e+01 1845 1845 3.2000000000208331e+01 1846 1846 3.2000000000208331e+01 1847 1847 3.2000000000208331e+01 1848 1848 3.2000000000208331e+01 1849 1849 6.4000000000291664e+01 1849 1364 1.1000665323307010e-27 1849 1875 2.1333333333291666e+01 1849 1348 -1.3020149240672800e-27 1849 1349 -2.1333333333291666e+01 1849 1345 2.1333333333343749e+01 1849 1311 1.0416666666666666e-10 1849 1870 -2.1333333333291666e+01 1850 1850 3.2000000000208331e+01 1851 1851 6.4000000000291664e+01 1851 1362 -1.3020149240672800e-27 1851 1344 1.1000665323307010e-27 1851 1346 -2.1333333333291666e+01 1851 1345 2.1333333333343749e+01 1851 1861 -2.1333333333291666e+01 1851 1324 1.0416666666666666e-10 1851 1862 2.1333333333291666e+01 1852 1852 3.2000000000208331e+01 1853 1853 6.4000000000291664e+01 1853 1348 1.5039633158038590e-27 1853 1868 2.1333333333291666e+01 1853 1344 -1.1213657767716683e-27 1853 1347 -2.1333333333291666e+01 1853 1345 2.1333333333343749e+01 1853 1337 1.0416666666666666e-10 1853 1860 -2.1333333333291666e+01 1854 1854 3.2000000000208331e+01 1855 1855 6.4000000000291664e+01 1855 1362 1.5039633158038590e-27 1855 2293 -2.1333333333291666e+01 1855 1364 -1.1213657767716683e-27 1855 1363 -2.1333333333291666e+01 1855 1345 2.1333333333343749e+01 1855 1680 1.0416666666666666e-10 1855 2304 2.1333333333291666e+01 1856 1856 6.4000000000416662e+01 1856 1346 -5.3333333333124999e+00 1856 1337 5.3333333333124999e+00 1856 1866 -1.5999999999979167e+01 1856 1347 -5.3333333333124999e+00 1856 1350 5.3333333333958333e+00 1856 1860 -1.5999999999979167e+01 1856 1344 5.3333333333333330e+00 1856 1861 -1.5999999999979167e+01 1856 1863 -1.5999999999979167e+01 1856 1324 5.3333333333124999e+00 1856 1396 -5.3333333333124999e+00 1856 1321 5.3333333333124999e+00 1856 1330 -5.3333333333333330e+00 1856 2208 -1.5999999999979167e+01 1856 1406 -5.3333333333124999e+00 1856 1412 5.3333333333958333e+00 1856 1859 -1.5999999999979167e+01 1856 1413 5.3333333333333330e+00 1856 1857 -1.5999999999979167e+01 1856 1893 -1.5999999999979167e+01 1856 1335 5.3333333333124999e+00 1856 1333 -5.3333333333333330e+00 1857 1857 6.4000000000291664e+01 1857 1895 2.1333333333291666e+01 1857 1405 -5.3333333333124999e+00 1857 1396 1.0416666666666666e-10 1857 1412 -5.3333333333124999e+00 1857 1413 1.0666666666677083e+01 1857 1333 -1.5039633158038590e-27 1857 1893 2.1333333333291666e+01 1857 1856 -1.5999999999979167e+01 1857 1335 -2.1333333333291666e+01 1858 1858 3.2000000000208331e+01 1859 1859 6.4000000000291664e+01 1859 1405 -5.3333333333124999e+00 1859 1330 1.3020149240672800e-27 1859 1406 1.0416666666666666e-10 1859 2208 2.1333333333291666e+01 1859 1412 -5.3333333333124999e+00 1859 1856 -1.5999999999979167e+01 1859 1413 1.0666666666677083e+01 1859 2199 -2.1333333333291666e+01 1859 1321 -2.1333333333291666e+01 1860 1860 6.4000000000291664e+01 1860 1333 1.3020149240672800e-27 1860 1866 2.1333333333291666e+01 1860 1350 -5.3333333333124999e+00 1860 1856 -1.5999999999979167e+01 1860 1347 1.0416666666666666e-10 1860 1345 -5.3333333333124999e+00 1860 1344 1.0666666666677083e+01 1860 1853 -2.1333333333291666e+01 1860 1337 -2.1333333333291666e+01 1861 1861 6.4000000000291664e+01 1861 1350 -5.3333333333124999e+00 1861 1330 -1.5039633158038590e-27 1861 1863 2.1333333333291666e+01 1861 1856 -1.5999999999979167e+01 1861 1324 -2.1333333333291666e+01 1861 1346 1.0416666666666666e-10 1861 1851 -2.1333333333291666e+01 1861 1345 -5.3333333333124999e+00 1861 1344 1.0666666666677083e+01 1862 1862 6.4000000000291664e+01 1862 1345 5.3333333333124999e+00 1862 1331 -1.1213657767716683e-27 1862 1346 -1.0416666666666666e-10 1862 1865 -2.1333333333291666e+01 1862 1361 5.3333333333124999e+00 1862 2292 1.5999999999979167e+01 1862 1362 -1.0666666666677083e+01 1862 1851 2.1333333333291666e+01 1862 1324 2.1333333333291666e+01 1863 1863 6.4000000000291664e+01 1863 1329 5.3333333333124999e+00 1863 1351 -1.3233141685082473e-27 1863 1864 -2.1333333333291666e+01 1863 2220 -1.5999999999979167e+01 1863 1344 1.1000665323307010e-27 1863 1346 2.1333333333291666e+01 1863 1350 -2.1333333333343749e+01 1863 1324 -1.0416666666666666e-10 1863 1861 2.1333333333291666e+01 1863 1856 -1.5999999999979167e+01 1863 1330 -1.0666666666677083e+01 1864 1864 6.4000000000291664e+01 1864 1361 5.3333333333124999e+00 1864 1331 1.1213657767716683e-27 1864 1865 -2.1333333333291666e+01 1864 2222 1.5999999999979167e+01 1864 1330 -1.5039633158038590e-27 1864 1324 2.1333333333291666e+01 1864 1329 -2.1333333333343749e+01 1864 1346 -1.0416666666666666e-10 1864 1863 -2.1333333333291666e+01 1864 1350 5.3333333333124999e+00 1864 2220 1.5999999999979167e+01 1864 1351 -1.0666666666677083e+01 1865 1865 6.4000000000291664e+01 1865 1362 -1.3020149240672800e-27 1865 1862 -2.1333333333291666e+01 1865 2292 -1.5999999999979167e+01 1865 1351 1.3233141685082473e-27 1865 1346 2.1333333333291666e+01 1865 1361 -2.1333333333343749e+01 1865 1324 -1.0416666666666666e-10 1865 1864 -2.1333333333291666e+01 1865 2222 -1.5999999999979167e+01 1865 1329 5.3333333333124999e+00 1865 1331 -1.0666666666677083e+01 1866 1866 6.4000000000291664e+01 1866 1360 1.1000665323307010e-27 1866 1344 -1.1213657767716683e-27 1866 1347 2.1333333333291666e+01 1866 1350 -2.1333333333343749e+01 1866 1860 2.1333333333291666e+01 1866 1856 -1.5999999999979167e+01 1866 1337 -1.0416666666666666e-10 1866 1867 -2.1333333333291666e+01 1866 1884 -1.5999999999979167e+01 1866 1333 -1.0666666666677083e+01 1867 1867 6.4000000000291664e+01 1867 1869 -2.1333333333291666e+01 1867 1354 5.3333333333124999e+00 1867 1347 -1.0416666666666666e-10 1867 1350 5.3333333333124999e+00 1867 1360 -1.0666666666677083e+01 1867 1333 1.3020149240672800e-27 1867 1866 -2.1333333333291666e+01 1867 1884 1.5999999999979167e+01 1867 1337 2.1333333333291666e+01 1868 1868 6.4000000000291664e+01 1868 1354 5.3333333333124999e+00 1868 1869 -2.1333333333291666e+01 1868 1337 2.1333333333291666e+01 1868 1347 -1.0416666666666666e-10 1868 1853 2.1333333333291666e+01 1868 1345 5.3333333333124999e+00 1868 1348 -1.0666666666677083e+01 1869 1869 6.4000000000291664e+01 1869 1360 -1.1000665323307010e-27 1869 1867 -2.1333333333291666e+01 1869 1348 1.5039633158038590e-27 1869 1347 2.1333333333291666e+01 1869 1354 -2.1333333333343749e+01 1869 1337 -1.0416666666666666e-10 1869 1868 -2.1333333333291666e+01 1870 1870 6.4000000000291664e+01 1870 1872 2.1333333333291666e+01 1870 1354 -5.3333333333124999e+00 1870 1349 1.0416666666666666e-10 1870 1345 -5.3333333333124999e+00 1870 1348 1.0666666666677083e+01 1870 1849 -2.1333333333291666e+01 1870 1311 -2.1333333333291666e+01 1871 1871 3.2000000000208331e+01 1872 1872 6.4000000000291664e+01 1872 1348 -1.3020149240672800e-27 1872 1870 2.1333333333291666e+01 1872 1357 1.3233141685082473e-27 1872 1349 2.1333333333291666e+01 1872 1354 -2.1333333333343749e+01 1872 1311 -1.0416666666666666e-10 1872 1873 -2.1333333333291666e+01 1873 1873 6.4000000000291664e+01 1873 1874 -2.1333333333291666e+01 1873 1366 5.3333333333124999e+00 1873 1349 -1.0416666666666666e-10 1873 1354 5.3333333333124999e+00 1873 1357 -1.0666666666677083e+01 1873 1872 -2.1333333333291666e+01 1873 1311 2.1333333333291666e+01 1874 1874 6.4000000000291664e+01 1874 1357 -1.3233141685082473e-27 1874 1873 -2.1333333333291666e+01 1874 1364 1.1000665323307010e-27 1874 1349 2.1333333333291666e+01 1874 1366 -2.1333333333343749e+01 1874 1311 -1.0416666666666666e-10 1874 1875 -2.1333333333291666e+01 1875 1875 6.4000000000291664e+01 1875 1366 5.3333333333124999e+00 1875 1349 -1.0416666666666666e-10 1875 1849 2.1333333333291666e+01 1875 1345 5.3333333333124999e+00 1875 1364 -1.0666666666677083e+01 1875 1874 -2.1333333333291666e+01 1875 1311 2.1333333333291666e+01 1876 1876 3.2000000000208331e+01 1877 1877 6.4000000000291664e+01 1877 1403 1.1000665323307010e-27 1877 1899 2.1333333333291666e+01 1877 1397 -1.5039633158038590e-27 1877 1398 -2.1333333333291666e+01 1877 1394 2.1333333333343749e+01 1877 1372 1.0416666666666666e-10 1877 1896 -2.1333333333291666e+01 1878 1878 3.2000000000208331e+01 1879 1879 6.4000000000291664e+01 1879 1418 -1.5039633158038590e-27 1879 1393 1.1000665323307010e-27 1879 1395 -2.1333333333291666e+01 1879 1394 2.1333333333343749e+01 1879 1888 -2.1333333333291666e+01 1879 1387 1.0416666666666666e-10 1879 1889 2.1333333333291666e+01 1880 1880 3.2000000000208331e+01 1881 1881 6.4000000000291664e+01 1881 1397 1.3020149240672800e-27 1881 1894 2.1333333333291666e+01 1881 1393 -1.3233141685082473e-27 1881 1396 -2.1333333333291666e+01 1881 1394 2.1333333333343749e+01 1881 1335 1.0416666666666666e-10 1881 1887 -2.1333333333291666e+01 1882 1882 3.2000000000208331e+01 1883 1883 6.4000000000291664e+01 1883 1418 1.3020149240672800e-27 1883 1922 2.1333333333291666e+01 1883 1403 -1.3233141685082473e-27 1883 1402 -2.1333333333291666e+01 1883 1394 2.1333333333343749e+01 1883 1426 1.0416666666666666e-10 1883 1923 2.1333333333291666e+01 1884 1884 6.4000000000416662e+01 1884 1395 -5.3333333333124999e+00 1884 1335 5.3333333333124999e+00 1884 1893 -1.5999999999979167e+01 1884 1396 -5.3333333333124999e+00 1884 1412 5.3333333333958333e+00 1884 1887 -1.5999999999979167e+01 1884 1393 5.3333333333333330e+00 1884 1888 -1.5999999999979167e+01 1884 1890 -1.5999999999979167e+01 1884 1387 5.3333333333124999e+00 1884 1347 -5.3333333333124999e+00 1884 1384 5.3333333333124999e+00 1884 1391 -5.3333333333333330e+00 1884 2242 1.5999999999979167e+01 1884 1355 -5.3333333333124999e+00 1884 1350 5.3333333333958333e+00 1884 1886 -1.5999999999979167e+01 1884 1360 5.3333333333333330e+00 1884 1867 1.5999999999979167e+01 1884 1866 -1.5999999999979167e+01 1884 1337 5.3333333333124999e+00 1884 1333 -5.3333333333333330e+00 1885 1885 3.2000000000208331e+01 1886 1886 6.4000000000291664e+01 1886 1354 -5.3333333333124999e+00 1886 1391 1.5039633158038590e-27 1886 1355 1.0416666666666666e-10 1886 2242 -2.1333333333291666e+01 1886 1350 -5.3333333333124999e+00 1886 1884 -1.5999999999979167e+01 1886 1360 1.0666666666677083e+01 1886 2247 -2.1333333333291666e+01 1886 1384 -2.1333333333291666e+01 1887 1887 6.4000000000291664e+01 1887 1333 1.5039633158038590e-27 1887 1893 2.1333333333291666e+01 1887 1412 -5.3333333333124999e+00 1887 1884 -1.5999999999979167e+01 1887 1396 1.0416666666666666e-10 1887 1394 -5.3333333333124999e+00 1887 1393 1.0666666666677083e+01 1887 1881 -2.1333333333291666e+01 1887 1335 -2.1333333333291666e+01 1888 1888 6.4000000000291664e+01 1888 1412 -5.3333333333124999e+00 1888 1391 -1.3020149240672800e-27 1888 1890 2.1333333333291666e+01 1888 1884 -1.5999999999979167e+01 1888 1387 -2.1333333333291666e+01 1888 1395 1.0416666666666666e-10 1888 1879 -2.1333333333291666e+01 1888 1394 -5.3333333333124999e+00 1888 1393 1.0666666666677083e+01 1889 1889 6.4000000000291664e+01 1889 1394 5.3333333333124999e+00 1889 1392 -1.3233141685082473e-27 1889 1395 -1.0416666666666666e-10 1889 1892 -2.1333333333291666e+01 1889 1415 5.3333333333124999e+00 1889 2265 -1.5999999999979167e+01 1889 1418 -1.0666666666677083e+01 1889 1879 2.1333333333291666e+01 1889 1387 2.1333333333291666e+01 1890 1890 6.4000000000291664e+01 1890 1390 5.3333333333124999e+00 1890 1414 -1.1213657767716683e-27 1890 1891 -2.1333333333291666e+01 1890 2241 1.5999999999979167e+01 1890 1393 1.1000665323307010e-27 1890 1395 2.1333333333291666e+01 1890 1412 -2.1333333333343749e+01 1890 1387 -1.0416666666666666e-10 1890 1888 2.1333333333291666e+01 1890 1884 -1.5999999999979167e+01 1890 1391 -1.0666666666677083e+01 1891 1891 6.4000000000291664e+01 1891 1415 5.3333333333124999e+00 1891 1392 1.3233141685082473e-27 1891 1892 -2.1333333333291666e+01 1891 2263 -1.5999999999979167e+01 1891 1391 -1.3020149240672800e-27 1891 1387 2.1333333333291666e+01 1891 1390 -2.1333333333343749e+01 1891 1395 -1.0416666666666666e-10 1891 1890 -2.1333333333291666e+01 1891 1412 5.3333333333124999e+00 1891 2241 -1.5999999999979167e+01 1891 1414 -1.0666666666677083e+01 1892 1892 6.4000000000291664e+01 1892 1418 -1.5039633158038590e-27 1892 1889 -2.1333333333291666e+01 1892 2265 1.5999999999979167e+01 1892 1414 1.1213657767716683e-27 1892 1395 2.1333333333291666e+01 1892 1415 -2.1333333333343749e+01 1892 1387 -1.0416666666666666e-10 1892 1891 -2.1333333333291666e+01 1892 2263 1.5999999999979167e+01 1892 1390 5.3333333333124999e+00 1892 1392 -1.0666666666677083e+01 1893 1893 6.4000000000291664e+01 1893 1393 -1.3233141685082473e-27 1893 1887 2.1333333333291666e+01 1893 1884 -1.5999999999979167e+01 1893 1413 1.1000665323307010e-27 1893 1396 2.1333333333291666e+01 1893 1412 -2.1333333333343749e+01 1893 1335 -1.0416666666666666e-10 1893 1857 2.1333333333291666e+01 1893 1856 -1.5999999999979167e+01 1893 1333 -1.0666666666677083e+01 1894 1894 6.4000000000291664e+01 1894 1405 5.3333333333124999e+00 1894 1895 -2.1333333333291666e+01 1894 1335 2.1333333333291666e+01 1894 1396 -1.0416666666666666e-10 1894 1881 2.1333333333291666e+01 1894 1394 5.3333333333124999e+00 1894 1397 -1.0666666666677083e+01 1895 1895 6.4000000000291664e+01 1895 1413 -1.1000665323307010e-27 1895 1857 2.1333333333291666e+01 1895 1397 1.3020149240672800e-27 1895 1396 2.1333333333291666e+01 1895 1405 -2.1333333333343749e+01 1895 1335 -1.0416666666666666e-10 1895 1894 -2.1333333333291666e+01 1896 1896 6.4000000000291664e+01 1896 1900 2.1333333333291666e+01 1896 1405 -5.3333333333124999e+00 1896 1398 1.0416666666666666e-10 1896 1394 -5.3333333333124999e+00 1896 1397 1.0666666666677083e+01 1896 1877 -2.1333333333291666e+01 1896 1372 -2.1333333333291666e+01 1897 1897 3.2000000000208331e+01 1898 1898 6.4000000000291664e+01 1898 1408 -1.1213657767716683e-27 1898 1901 -2.1333333333291666e+01 1898 1907 1.5999999999979167e+01 1898 1403 1.1000665323307010e-27 1898 1398 2.1333333333291666e+01 1898 1400 -2.1333333333343749e+01 1898 1372 -1.0416666666666666e-10 1898 1899 -2.1333333333291666e+01 1898 1902 1.5999999999979167e+01 1898 1373 -1.0666666666677083e+01 1899 1899 6.4000000000291664e+01 1899 1877 2.1333333333291666e+01 1899 1394 5.3333333333124999e+00 1899 1398 -1.0416666666666666e-10 1899 1400 5.3333333333124999e+00 1899 1403 -1.0666666666677083e+01 1899 1373 1.3020149240672800e-27 1899 1898 -2.1333333333291666e+01 1899 1902 -1.5999999999979167e+01 1899 1372 2.1333333333291666e+01 1900 1900 6.4000000000291664e+01 1900 1397 -1.5039633158038590e-27 1900 1896 2.1333333333291666e+01 1900 1408 1.1213657767716683e-27 1900 1398 2.1333333333291666e+01 1900 1405 -2.1333333333343749e+01 1900 1372 -1.0416666666666666e-10 1900 1901 -2.1333333333291666e+01 1901 1901 6.4000000000291664e+01 1901 1373 -1.3020149240672800e-27 1901 1898 -2.1333333333291666e+01 1901 1400 5.3333333333124999e+00 1901 1907 -1.5999999999979167e+01 1901 1398 -1.0416666666666666e-10 1901 1405 5.3333333333124999e+00 1901 1408 -1.0666666666677083e+01 1901 1900 -2.1333333333291666e+01 1901 1372 2.1333333333291666e+01 1902 1902 6.4000000000416662e+01 1902 1375 -5.3333333333124999e+00 1902 1924 2.1333333333312499e+01 1902 1904 -1.0666666666583334e+01 1902 1419 -5.3333333333124999e+00 1902 1398 5.3333333333124999e+00 1902 1426 -5.3333333333124999e+00 1902 1427 1.3333333333322916e+01 1902 1909 -1.5999999999979167e+01 1902 1402 5.3333333333124999e+00 1902 1400 -5.3333333333958333e+00 1902 1923 -1.5999999999979167e+01 1902 1403 -5.3333333333333330e+00 1902 1899 -1.5999999999979167e+01 1902 1898 1.5999999999979167e+01 1902 1372 -5.3333333333124999e+00 1902 1373 1.3333333333322916e+01 1903 1903 5.3333333333749998e+01 1903 1268 2.0194839173657902e-27 1903 1652 -4.5860624244724788e-28 1903 1662 5.3333333333229165e+00 1903 1654 6.2499999999999991e-11 1903 1905 -1.0666666666666666e+01 1903 2192 1.0666666666666666e+01 1903 1280 2.0194839173657902e-27 1903 1267 5.3333333333229165e+00 1903 1279 -5.3333333333229165e+00 1903 1907 -1.0666666666583334e+01 1903 2189 1.0666666666666666e+01 1903 1904 -3.2000000000020833e+01 1903 2174 -2.1333333333291666e+01 1903 1373 -1.0666666666791667e+01 1903 1375 1.0666666666625000e+01 1903 1378 -5.3333333333437496e+00 1904 1904 6.4000000000583327e+01 1904 1421 1.0416666666666666e-11 1904 1427 -6.2499999999999991e-11 1904 1419 4.1666666666666665e-11 1904 1902 -1.0666666666583334e+01 1904 1924 -1.0666666666666666e+01 1904 1278 1.0416666666666666e-11 1904 1908 -1.0666666666583334e+01 1904 1911 -1.0666666666666666e+01 1904 1267 -1.0416666666666667e-10 1904 1280 -5.3333333332916668e+00 1904 1279 5.3333333332812494e+00 1904 1903 -3.2000000000020833e+01 1904 2174 2.1333333333208333e+01 1904 1373 1.0666666666625000e+01 1904 1375 -1.5999999999958334e+01 1904 1378 5.3333333333229165e+00 1905 1905 5.3333333333749991e+01 1905 1279 1.8812360437258079e-27 1905 1654 -1.8812360437258079e-27 1905 2192 -1.0666666666562499e+01 1905 1903 -1.0666666666666666e+01 1905 1401 5.3333333333124999e+00 1905 1653 -5.3333333333124999e+00 1905 1652 -2.6666666665833332e+00 1905 1662 8.0000000000000000e+00 1905 1910 -1.5999999999979167e+01 1905 1407 5.3333333333124999e+00 1905 1400 -5.3333333333958333e+00 1905 2210 -1.5999999999979167e+01 1905 1417 -5.3333333333333330e+00 1905 1917 -1.5999999999979167e+01 1905 1906 -1.5999999999979167e+01 1905 1269 -5.3333333333124999e+00 1905 1268 -2.6666666665833332e+00 1905 1267 8.0000000000000000e+00 1906 1906 6.4000000000291664e+01 1906 1417 -1.1000665323307010e-27 1906 1278 -5.3333333333124999e+00 1906 1399 1.1213657767716683e-27 1906 1401 -2.1333333333291666e+01 1906 1400 2.1333333333343749e+01 1906 1914 -2.1333333333291666e+01 1906 1908 -1.5999999999979167e+01 1906 1269 1.0416666666666666e-10 1906 1917 2.1333333333291666e+01 1906 1905 -1.5999999999979167e+01 1906 1268 -5.3333333333124999e+00 1906 1267 1.0666666666677083e+01 1907 1907 7.4666666667125000e+01 1907 1654 -5.3333333332812494e+00 1907 1407 5.3333333333124999e+00 1907 1372 -5.3333333333124999e+00 1907 1898 1.5999999999979167e+01 1907 1398 5.3333333333124999e+00 1907 1400 -5.3333333333958333e+00 1907 1901 -1.5999999999979167e+01 1907 1408 -5.3333333333333330e+00 1907 2211 -1.5999999999979167e+01 1907 1910 -1.5999999999979167e+01 1907 1653 -5.3333333333124999e+00 1907 1662 1.3333333333343749e+01 1907 2189 -2.1333333333291666e+01 1907 1903 -1.0666666666583334e+01 1907 1373 2.4000000000010417e+01 1907 1378 -5.3333333333229165e+00 1908 1908 6.4000000000416662e+01 1908 1419 -5.3333333333124999e+00 1908 1911 2.1333333333312499e+01 1908 1904 -1.0666666666583334e+01 1908 1280 -5.3333333333124999e+00 1908 1402 5.3333333333124999e+00 1908 1269 -5.3333333333124999e+00 1908 1278 -2.6666666665937497e+00 1908 1267 1.3333333333322916e+01 1908 1906 -1.5999999999979167e+01 1908 1401 5.3333333333124999e+00 1908 1400 -5.3333333333958333e+00 1908 1914 1.5999999999979167e+01 1908 1399 -5.3333333333333330e+00 1908 1913 1.5999999999979167e+01 1908 1909 -1.5999999999979167e+01 1908 1426 -5.3333333333124999e+00 1908 1421 -2.6666666665937497e+00 1908 1427 1.3333333333322916e+01 1909 1909 6.4000000000291664e+01 1909 1403 1.3233141685082473e-27 1909 1923 2.1333333333291666e+01 1909 1902 -1.5999999999979167e+01 1909 1399 -1.1000665323307010e-27 1909 1402 -2.1333333333291666e+01 1909 1400 2.1333333333343749e+01 1909 1426 1.0416666666666666e-10 1909 1913 -2.1333333333291666e+01 1909 1908 -1.5999999999979167e+01 1909 1421 -5.3333333333124999e+00 1909 1427 1.0666666666677083e+01 1910 1910 6.4000000000291664e+01 1910 1652 -5.3333333333124999e+00 1910 1417 1.3233141685082473e-27 1910 2210 2.1333333333291666e+01 1910 1905 -1.5999999999979167e+01 1910 1408 -1.1000665323307010e-27 1910 1407 -2.1333333333291666e+01 1910 1400 2.1333333333343749e+01 1910 1653 1.0416666666666666e-10 1910 2211 2.1333333333291666e+01 1910 1907 -1.5999999999979167e+01 1910 1662 1.0666666666677083e+01 1911 1911 4.2666666666916662e+01 1911 1284 5.3333333333229165e+00 1911 1427 5.3333333333229165e+00 1911 1278 -6.2500000000000004e-11 1911 1908 2.1333333333312499e+01 1911 1904 -1.0666666666666666e+01 1911 1267 5.3333333333229165e+00 1911 1280 -1.0666666666687499e+01 1911 1421 -6.2500000000000004e-11 1911 1912 -2.1333333333312499e+01 1911 2175 1.0666666666666666e+01 1911 1420 5.3333333333229165e+00 1911 1419 -1.0666666666687499e+01 1912 1912 6.4000000000416662e+01 1912 1280 5.3333333333124999e+00 1912 1422 5.3333333333124999e+00 1912 1736 2.1333333333312499e+01 1912 1728 -1.0666666666583334e+01 1912 1278 1.0666666666583334e+01 1912 1284 -2.1333333333312499e+01 1912 1283 5.3333333333124999e+00 1912 1911 -2.1333333333312499e+01 1912 2175 -1.0666666666583334e+01 1912 1421 1.0666666666583334e+01 1912 1420 -2.1333333333312499e+01 1912 1419 5.3333333333124999e+00 1913 1913 6.4000000000291664e+01 1913 1424 1.1000665323307010e-27 1913 1921 2.1333333333291666e+01 1913 1415 -5.3333333333124999e+00 1913 1916 1.5999999999979167e+01 1913 1402 1.0416666666666666e-10 1913 1400 -5.3333333333124999e+00 1913 1399 1.0666666666677083e+01 1913 1427 -1.5039633158038590e-27 1913 1909 -2.1333333333291666e+01 1913 1908 1.5999999999979167e+01 1913 1426 -2.1333333333291666e+01 1913 1421 2.1333333333343749e+01 1914 1914 6.4000000000291664e+01 1914 1415 -5.3333333333124999e+00 1914 1286 -1.3233141685082473e-27 1914 1918 2.1333333333291666e+01 1914 1916 1.5999999999979167e+01 1914 1267 1.3020149240672800e-27 1914 1269 -2.1333333333291666e+01 1914 1278 2.1333333333343749e+01 1914 1401 1.0416666666666666e-10 1914 1906 -2.1333333333291666e+01 1914 1400 -5.3333333333124999e+00 1914 1908 1.5999999999979167e+01 1914 1399 1.0666666666677083e+01 1915 1915 6.4000000000416662e+01 1915 1421 -2.6666666665937502e+00 1915 1429 1.3333333333322916e+01 1915 1278 -2.6666666665937502e+00 1915 1285 1.3333333333322916e+01 1915 1283 -5.3333333333124999e+00 1915 1736 -2.1333333333312499e+01 1915 1726 1.0666666666583334e+01 1915 1422 -5.3333333333124999e+00 1915 374 5.3333333333124999e+00 1915 492 -5.3333333333124999e+00 1915 1027 -1.5999999999979167e+01 1915 382 5.3333333333124999e+00 1915 373 -5.3333333333958333e+00 1915 1055 1.5999999999979167e+01 1915 381 -5.3333333333333330e+00 1915 1035 -1.5999999999979167e+01 1915 1024 -1.5999999999979167e+01 1915 291 -5.3333333333124999e+00 1916 1916 6.4000000000416662e+01 1916 1278 5.3333333333958333e+00 1916 1286 5.3333333333333330e+00 1916 1421 5.3333333333958333e+00 1916 1424 5.3333333333333330e+00 1916 1401 5.3333333333124999e+00 1916 1426 -5.3333333333124999e+00 1916 1921 1.5999999999979167e+01 1916 1402 5.3333333333124999e+00 1916 1415 -5.3333333333958333e+00 1916 1913 1.5999999999979167e+01 1916 1399 -5.3333333333333330e+00 1916 1914 1.5999999999979167e+01 1916 1918 1.5999999999979167e+01 1916 1269 -5.3333333333124999e+00 1916 382 5.3333333333124999e+00 1916 291 -5.3333333333124999e+00 1916 1038 1.5999999999979167e+01 1916 374 5.3333333333124999e+00 1916 380 -5.3333333333958333e+00 1916 1035 -1.5999999999979167e+01 1916 381 -5.3333333333333330e+00 1916 1055 1.5999999999979167e+01 1916 1053 -1.5999999999979167e+01 1916 492 -5.3333333333124999e+00 1917 1917 6.4000000000291664e+01 1917 1400 5.3333333333124999e+00 1917 1288 -1.1000665323307010e-27 1917 1401 -1.0416666666666666e-10 1917 1920 -2.1333333333291666e+01 1917 1409 5.3333333333124999e+00 1917 2215 -1.5999999999979167e+01 1917 1417 -1.0666666666677083e+01 1917 1267 1.3020149240672800e-27 1917 1906 2.1333333333291666e+01 1917 1905 -1.5999999999979167e+01 1917 1269 2.1333333333291666e+01 1917 1268 -2.1333333333343749e+01 1918 1918 6.4000000000291664e+01 1918 1287 5.3333333333124999e+00 1918 1416 -1.5039633158038590e-27 1918 1919 -2.1333333333291666e+01 1918 2264 1.5999999999979167e+01 1918 1399 1.1213657767716683e-27 1918 1401 2.1333333333291666e+01 1918 1415 -2.1333333333343749e+01 1918 1269 -1.0416666666666666e-10 1918 1914 2.1333333333291666e+01 1918 1916 1.5999999999979167e+01 1918 1278 5.3333333333124999e+00 1918 1286 -1.0666666666677083e+01 1919 1919 6.4000000000291664e+01 1919 1409 5.3333333333124999e+00 1919 1288 1.1000665323307010e-27 1919 1920 -2.1333333333291666e+01 1919 2216 -1.5999999999979167e+01 1919 1286 -1.3233141685082473e-27 1919 1269 2.1333333333291666e+01 1919 1287 -2.1333333333343749e+01 1919 1401 -1.0416666666666666e-10 1919 1918 -2.1333333333291666e+01 1919 1415 5.3333333333124999e+00 1919 2264 -1.5999999999979167e+01 1919 1416 -1.0666666666677083e+01 1920 1920 6.4000000000291664e+01 1920 1268 5.3333333333124999e+00 1920 1417 -1.1000665323307010e-27 1920 1917 -2.1333333333291666e+01 1920 2215 1.5999999999979167e+01 1920 1416 1.5039633158038590e-27 1920 1401 2.1333333333291666e+01 1920 1409 -2.1333333333343749e+01 1920 1269 -1.0416666666666666e-10 1920 1919 -2.1333333333291666e+01 1920 2216 1.5999999999979167e+01 1920 1287 5.3333333333124999e+00 1920 1288 -1.0666666666677083e+01 1921 1921 6.4000000000291664e+01 1921 1418 1.3020149240672800e-27 1921 1421 5.3333333333124999e+00 1921 1399 -1.1000665323307010e-27 1921 1402 2.1333333333291666e+01 1921 1415 -2.1333333333343749e+01 1921 1913 2.1333333333291666e+01 1921 1916 1.5999999999979167e+01 1921 1426 -1.0416666666666666e-10 1921 1922 -2.1333333333291666e+01 1921 2265 1.5999999999979167e+01 1921 1424 -1.0666666666677083e+01 1922 1922 6.4000000000291664e+01 1922 1883 2.1333333333291666e+01 1922 1394 5.3333333333124999e+00 1922 1402 -1.0416666666666666e-10 1922 1415 5.3333333333124999e+00 1922 1418 -1.0666666666677083e+01 1922 1424 1.1000665323307010e-27 1922 1921 -2.1333333333291666e+01 1922 2265 -1.5999999999979167e+01 1922 1426 2.1333333333291666e+01 1923 1923 6.4000000000291664e+01 1923 1394 5.3333333333124999e+00 1923 1883 2.1333333333291666e+01 1923 1427 -1.5039633158038590e-27 1923 1426 2.1333333333291666e+01 1923 1402 -1.0416666666666666e-10 1923 1909 2.1333333333291666e+01 1923 1400 5.3333333333124999e+00 1923 1902 -1.5999999999979167e+01 1923 1403 -1.0666666666677083e+01 1924 1924 4.2666666666916662e+01 1924 1373 5.3333333333229165e+00 1924 1902 2.1333333333312499e+01 1924 1904 -1.0666666666666666e+01 1924 1427 5.3333333333229165e+00 1924 1419 -1.0666666666687499e+01 1924 2176 1.0666666666666666e+01 1924 1375 -1.0666666666687499e+01 1925 1925 3.2000000000208331e+01 1926 1926 6.4020833333541660e+01 1926 1930 -1.0658333333333333e+01 1926 1478 5.3333333333124999e+00 1926 1466 -5.3333333333124999e+00 1926 1467 1.3332291666666665e+01 1926 1934 -1.5999999999979167e+01 1926 1476 5.3333333333124999e+00 1926 1474 -5.3333333333958333e+00 1926 1947 -1.5999999999979167e+01 1926 1477 -5.3333333333333330e+00 1926 1949 1.5999999999979167e+01 1926 1927 -1.5999999999979167e+01 1926 1435 -5.3333333333124999e+00 1926 1434 1.3332291666666665e+01 1926 3948 -5.3312499999999998e+00 1926 4587 -2.1331249999999997e+01 1926 3973 -5.3312499999999998e+00 1926 3975 -2.6624999999687495e+00 1926 3950 -2.6624999999687495e+00 1927 1927 6.4000000000291664e+01 1927 1483 1.3020149240672800e-27 1927 1953 2.1333333333291666e+01 1927 1929 -1.5999999999979167e+01 1927 1477 -1.3233141685082473e-27 1927 1478 -2.1333333333291666e+01 1927 1474 2.1333333333343749e+01 1927 1435 1.0416666666666666e-10 1927 1949 -2.1333333333291666e+01 1927 1926 -1.5999999999979167e+01 1927 1434 1.0666666666677083e+01 1927 3950 -5.3333333333124999e+00 1928 1928 5.3375000000000007e+01 1928 1456 2.1684043449710089e-19 1928 1450 2.1684043449710089e-19 1928 1451 5.3322916666666664e+00 1928 1455 -5.3322916666666664e+00 1928 1505 4.9904357809065860e-20 1928 1509 5.3322916666666664e+00 1928 1499 6.2499999999999995e-03 1928 1931 -1.0666666666666666e+01 1928 2135 1.0666666666666666e+01 1928 1930 -3.2002083333333331e+01 1928 2133 2.1329166666666666e+01 1928 1439 -5.3343749999999996e+00 1928 1929 -1.0658333333333331e+01 1928 1976 -1.0666666666666668e+01 1928 1434 -1.0679166666666665e+01 1928 3948 1.0662500000000000e+01 1929 1929 7.4691666666874994e+01 1929 1482 5.3333333333124999e+00 1929 1435 -5.3333333333124999e+00 1929 1927 -1.5999999999979167e+01 1929 1478 5.3333333333124999e+00 1929 1474 -5.3333333333958333e+00 1929 1953 -1.5999999999979167e+01 1929 1483 -5.3333333333333330e+00 1929 1975 -1.5999999999979167e+01 1929 1935 -1.5999999999979167e+01 1929 1506 -5.3333333333124999e+00 1929 1509 1.3334375000000000e+01 1929 1499 -5.3281250000000000e+00 1929 1976 2.1329166666666666e+01 1929 1928 -1.0658333333333331e+01 1929 1434 2.4001041666666666e+01 1929 1439 -5.3322916666666664e+00 1930 1930 6.4058333333333337e+01 1930 1455 5.3281250000000000e+00 1930 1463 1.0416666666666669e-03 1930 1467 -6.2500000000000003e-03 1930 1926 -1.0658333333333333e+01 1930 1454 1.0416666666666667e-03 1930 1451 -1.0416666666666664e-02 1930 1456 -5.3291666666666666e+00 1930 1933 -1.0658333333333333e+01 1930 1936 -1.0666666666666666e+01 1930 1928 -3.2002083333333331e+01 1930 2133 -2.1320833333333333e+01 1930 1434 1.0662499999999998e+01 1930 1439 5.3322916666666664e+00 1930 3950 1.0416666666666669e-03 1930 3975 1.0416666666666667e-03 1930 3973 4.1666666666666666e-03 1930 4587 1.0666666666666666e+01 1930 3948 -1.5995833333333334e+01 1931 1931 5.3354166666875003e+01 1931 1475 5.3333333333124999e+00 1931 1506 -5.3333333333124999e+00 1931 1935 -1.5999999999979167e+01 1931 1482 5.3333333333124999e+00 1931 1474 -5.3333333333958333e+00 1931 1974 -1.5999999999979167e+01 1931 1498 -5.3333333333333330e+00 1931 1455 2.1705219273391446e-19 1931 1499 -2.1705219273391446e-19 1931 2135 -1.0656249999999998e+01 1931 1928 -1.0666666666666666e+01 1931 1505 -2.6614583333020834e+00 1931 1509 8.0000000000000000e+00 1931 1941 -1.5999999999979167e+01 1931 1932 -1.5999999999979167e+01 1931 1452 -5.3333333333124999e+00 1931 1450 -2.6614583333020829e+00 1931 1451 8.0000000000000000e+00 1932 1932 6.4000000000291664e+01 1932 1498 -1.3233141685082473e-27 1932 1454 -5.3333333333124999e+00 1932 1473 1.3020149240672800e-27 1932 1475 -2.1333333333291666e+01 1932 1474 2.1333333333343749e+01 1932 1939 -2.1333333333291666e+01 1932 1933 -1.5999999999979167e+01 1932 1452 1.0416666666666666e-10 1932 1941 2.1333333333291666e+01 1932 1931 -1.5999999999979167e+01 1932 1450 -5.3333333333124999e+00 1932 1451 1.0666666666677083e+01 1933 1933 6.4020833333541660e+01 1933 1936 2.1331249999999997e+01 1933 1930 -1.0658333333333333e+01 1933 1456 -5.3312499999999998e+00 1933 1476 5.3333333333124999e+00 1933 1452 -5.3333333333124999e+00 1933 1454 -2.6624999999687495e+00 1933 1451 1.3332291666666665e+01 1933 1932 -1.5999999999979167e+01 1933 1475 5.3333333333124999e+00 1933 1474 -5.3333333333958333e+00 1933 1939 1.5999999999979167e+01 1933 1473 -5.3333333333333330e+00 1933 1938 1.5999999999979167e+01 1933 1934 -1.5999999999979167e+01 1933 1466 -5.3333333333124999e+00 1933 1463 -2.6624999999687495e+00 1933 1467 1.3332291666666665e+01 1933 3973 -5.3312499999999998e+00 1934 1934 6.4000000000291664e+01 1934 1477 1.1000665323307010e-27 1934 1947 2.1333333333291666e+01 1934 1926 -1.5999999999979167e+01 1934 1473 -1.5039633158038590e-27 1934 1476 -2.1333333333291666e+01 1934 1474 2.1333333333343749e+01 1934 1466 1.0416666666666666e-10 1934 1938 -2.1333333333291666e+01 1934 1933 -1.5999999999979167e+01 1934 1463 -5.3333333333124999e+00 1934 1467 1.0666666666677083e+01 1934 3975 -5.3333333333124999e+00 1935 1935 6.4000000000291664e+01 1935 1505 -5.3333333333124999e+00 1935 1498 1.1000665323307010e-27 1935 1974 2.1333333333291666e+01 1935 1931 -1.5999999999979167e+01 1935 1483 -1.5039633158038590e-27 1935 1482 -2.1333333333291666e+01 1935 1474 2.1333333333343749e+01 1935 1506 1.0416666666666666e-10 1935 1975 2.1333333333291666e+01 1935 1929 -1.5999999999979167e+01 1935 1509 1.0666666666677083e+01 1936 1936 4.2691666666666663e+01 1936 1457 5.3322916666666664e+00 1936 1467 5.3322916666666664e+00 1936 1454 -6.2500000000000003e-03 1936 1933 2.1331249999999997e+01 1936 1930 -1.0666666666666666e+01 1936 1451 5.3322916666666664e+00 1936 1456 -1.0668750000000001e+01 1936 1463 -6.2500000000000003e-03 1936 1937 2.1331249999999997e+01 1936 4592 1.0666666666666666e+01 1936 3972 5.3322916666666664e+00 1936 3973 -1.0668750000000001e+01 1937 1937 6.4041666666666671e+01 1937 1463 -1.0658333333333333e+01 1937 1454 -1.0658333333333333e+01 1937 1457 2.1331249999999997e+01 1937 1456 -5.3312499999999998e+00 1937 1936 2.1331249999999997e+01 1937 3972 2.1331249999999997e+01 1937 3971 -5.3312499999999998e+00 1937 1014 -2.1331249999999997e+01 1937 4597 1.0658333333333333e+01 1937 431 -5.3312499999999998e+00 1937 4592 1.0658333333333333e+01 1937 3973 -5.3312499999999998e+00 1938 1938 6.4000000000291664e+01 1938 1464 1.3233141685082473e-27 1938 1945 2.1333333333291666e+01 1938 1494 -5.3333333333124999e+00 1938 1940 1.5999999999979167e+01 1938 1476 1.0416666666666666e-10 1938 1474 -5.3333333333124999e+00 1938 1473 1.0666666666677083e+01 1938 1467 -1.1000665323307010e-27 1938 1934 -2.1333333333291666e+01 1938 1933 1.5999999999979167e+01 1938 1466 -2.1333333333291666e+01 1938 1463 2.1333333333343749e+01 1939 1939 6.4000000000291664e+01 1939 1494 -5.3333333333124999e+00 1939 1459 -1.1000665323307010e-27 1939 1942 2.1333333333291666e+01 1939 1940 1.5999999999979167e+01 1939 1451 1.1213657767716683e-27 1939 1452 -2.1333333333291666e+01 1939 1454 2.1333333333343749e+01 1939 1475 1.0416666666666666e-10 1939 1932 -2.1333333333291666e+01 1939 1474 -5.3333333333124999e+00 1939 1933 1.5999999999979167e+01 1939 1473 1.0666666666677083e+01 1940 1940 6.4000000000416662e+01 1940 1674 5.3333333333124999e+00 1940 1454 5.3333333333958333e+00 1940 1459 5.3333333333333330e+00 1940 1673 -5.3333333333958333e+00 1940 2282 -1.5999999999979167e+01 1940 1470 -5.3333333333124999e+00 1940 1463 5.3333333333958333e+00 1940 1464 5.3333333333333330e+00 1940 1475 5.3333333333124999e+00 1940 1466 -5.3333333333124999e+00 1940 1945 1.5999999999979167e+01 1940 1476 5.3333333333124999e+00 1940 1494 -5.3333333333958333e+00 1940 1938 1.5999999999979167e+01 1940 1473 -5.3333333333333330e+00 1940 1939 1.5999999999979167e+01 1940 1942 1.5999999999979167e+01 1940 1452 -5.3333333333124999e+00 1940 430 -5.3333333333124999e+00 1940 1062 1.5999999999979167e+01 1940 303 5.3333333333124999e+00 1940 1016 1.5999999999979167e+01 1940 308 -5.3333333333333330e+00 1940 704 -1.5999999999979167e+01 1941 1941 6.4000000000291664e+01 1941 1474 5.3333333333124999e+00 1941 1461 -1.5039633158038590e-27 1941 1475 -1.0416666666666666e-10 1941 1944 -2.1333333333291666e+01 1941 1497 5.3333333333124999e+00 1941 2147 1.5999999999979167e+01 1941 1498 -1.0666666666677083e+01 1941 1451 1.1213657767716683e-27 1941 1932 2.1333333333291666e+01 1941 1931 -1.5999999999979167e+01 1941 1452 2.1333333333291666e+01 1941 1450 -2.1333333333343749e+01 1942 1942 6.4000000000291664e+01 1942 1460 5.3333333333124999e+00 1942 1496 -1.1000665323307010e-27 1942 1943 -2.1333333333291666e+01 1942 2280 1.5999999999979167e+01 1942 1473 1.3020149240672800e-27 1942 1475 2.1333333333291666e+01 1942 1494 -2.1333333333343749e+01 1942 1452 -1.0416666666666666e-10 1942 1939 2.1333333333291666e+01 1942 1940 1.5999999999979167e+01 1942 1454 5.3333333333124999e+00 1942 1459 -1.0666666666677083e+01 1943 1943 6.4000000000291664e+01 1943 1497 5.3333333333124999e+00 1943 1461 1.5039633158038590e-27 1943 1944 -2.1333333333291666e+01 1943 2285 1.5999999999979167e+01 1943 1459 -1.1000665323307010e-27 1943 1452 2.1333333333291666e+01 1943 1460 -2.1333333333343749e+01 1943 1475 -1.0416666666666666e-10 1943 1942 -2.1333333333291666e+01 1943 1494 5.3333333333124999e+00 1943 2280 -1.5999999999979167e+01 1943 1496 -1.0666666666677083e+01 1944 1944 6.4000000000291664e+01 1944 1450 5.3333333333124999e+00 1944 1498 -1.3233141685082473e-27 1944 1941 -2.1333333333291666e+01 1944 2147 -1.5999999999979167e+01 1944 1496 1.1000665323307010e-27 1944 1475 2.1333333333291666e+01 1944 1497 -2.1333333333343749e+01 1944 1452 -1.0416666666666666e-10 1944 1943 -2.1333333333291666e+01 1944 2285 -1.5999999999979167e+01 1944 1460 5.3333333333124999e+00 1944 1461 -1.0666666666677083e+01 1945 1945 6.4000000000291664e+01 1945 1463 5.3333333333124999e+00 1945 1473 -1.5039633158038590e-27 1945 1938 2.1333333333291666e+01 1945 1940 1.5999999999979167e+01 1945 1495 1.1213657767716683e-27 1945 1476 2.1333333333291666e+01 1945 1494 -2.1333333333343749e+01 1945 1466 -1.0416666666666666e-10 1945 1946 -2.1333333333291666e+01 1945 2278 1.5999999999979167e+01 1945 1465 5.3333333333124999e+00 1945 1464 -1.0666666666677083e+01 1946 1946 6.4000000000291664e+01 1946 1469 -1.3020149240672800e-27 1946 1948 -2.1333333333291666e+01 1946 1491 5.3333333333124999e+00 1946 2270 -1.5999999999979167e+01 1946 1476 -1.0416666666666666e-10 1946 1494 5.3333333333124999e+00 1946 1495 -1.0666666666677083e+01 1946 1464 1.3233141685082473e-27 1946 1945 -2.1333333333291666e+01 1946 2278 -1.5999999999979167e+01 1946 1466 2.1333333333291666e+01 1946 1465 -2.1333333333343749e+01 1947 1947 6.4000000000291664e+01 1947 1491 5.3333333333124999e+00 1947 1469 1.3020149240672800e-27 1947 1948 -2.1333333333291666e+01 1947 1951 1.5999999999979167e+01 1947 1467 -1.1000665323307010e-27 1947 1466 2.1333333333291666e+01 1947 1476 -1.0416666666666666e-10 1947 1934 2.1333333333291666e+01 1947 1474 5.3333333333124999e+00 1947 1926 -1.5999999999979167e+01 1947 1477 -1.0666666666677083e+01 1947 3975 -2.1333333333343749e+01 1948 1948 6.4000000000291664e+01 1948 1465 5.3333333333124999e+00 1948 1495 -1.1213657767716683e-27 1948 1946 -2.1333333333291666e+01 1948 2270 1.5999999999979167e+01 1948 1477 1.1000665323307010e-27 1948 1476 2.1333333333291666e+01 1948 1491 -2.1333333333343749e+01 1948 1466 -1.0416666666666666e-10 1948 1947 -2.1333333333291666e+01 1948 1951 -1.5999999999979167e+01 1948 1469 -1.0666666666677083e+01 1948 3975 5.3333333333124999e+00 1949 1949 6.4000000000291664e+01 1949 1440 1.5039633158038590e-27 1949 1954 2.1333333333291666e+01 1949 1491 -5.3333333333124999e+00 1949 1951 -1.5999999999979167e+01 1949 1478 1.0416666666666666e-10 1949 1474 -5.3333333333124999e+00 1949 1477 1.0666666666677083e+01 1949 1434 -1.1213657767716683e-27 1949 1927 -2.1333333333291666e+01 1949 1926 1.5999999999979167e+01 1949 1435 -2.1333333333291666e+01 1949 3950 2.1333333333343749e+01 1950 1950 7.4666666667124986e+01 1950 1442 5.3333333333229165e+00 1950 1802 -1.0666666666583334e+01 1950 1810 2.1333333333291666e+01 1950 1471 5.3333333332812494e+00 1950 1468 -2.1333333333333332e+01 1950 2074 -1.0666666666583334e+01 1950 1438 -3.2000000000000000e+01 1950 3975 1.0666666666531249e+01 1950 3969 5.3333333333124999e+00 1950 4615 2.1333333333312499e+01 1950 3950 2.1333333333260416e+01 1950 3953 5.3333333333124999e+00 1951 1951 7.4666666667125000e+01 1951 1471 5.3333333332812494e+00 1951 1810 2.1333333333291666e+01 1951 1809 -1.0666666666583334e+01 1951 1442 5.3333333333229165e+00 1951 1476 -5.3333333333124999e+00 1951 1435 5.3333333333124999e+00 1951 1440 -2.4000000000010417e+01 1951 1954 -1.5999999999979167e+01 1951 1478 -5.3333333333124999e+00 1951 1491 5.3333333333958333e+00 1951 1949 -1.5999999999979167e+01 1951 1477 5.3333333333333330e+00 1951 1947 1.5999999999979167e+01 1951 1948 -1.5999999999979167e+01 1951 1466 5.3333333333124999e+00 1951 1469 -1.3333333333343749e+01 1951 3950 1.3333333333270833e+01 1951 3975 2.6666666665416665e+00 1952 1952 6.4000000000291664e+01 1952 1489 -1.1000665323307010e-27 1952 1955 -2.1333333333291666e+01 1952 1483 1.3020149240672800e-27 1952 1478 2.1333333333291666e+01 1952 1480 -2.1333333333343749e+01 1952 1435 -1.0416666666666666e-10 1952 1953 -2.1333333333291666e+01 1953 1953 6.4000000000291664e+01 1953 1434 -1.1213657767716683e-27 1953 1927 2.1333333333291666e+01 1953 1474 5.3333333333124999e+00 1953 1929 -1.5999999999979167e+01 1953 1478 -1.0416666666666666e-10 1953 1480 5.3333333333124999e+00 1953 1483 -1.0666666666677083e+01 1953 1952 -2.1333333333291666e+01 1953 1435 2.1333333333291666e+01 1954 1954 6.4000000000291664e+01 1954 1477 -1.3233141685082473e-27 1954 1949 2.1333333333291666e+01 1954 1951 -1.5999999999979167e+01 1954 1489 1.1000665323307010e-27 1954 1478 2.1333333333291666e+01 1954 1491 -2.1333333333343749e+01 1954 1435 -1.0416666666666666e-10 1954 1955 -2.1333333333291666e+01 1954 2233 -1.5999999999979167e+01 1954 1440 -1.0666666666677083e+01 1954 3950 5.3333333333124999e+00 1955 1955 6.4000000000291664e+01 1955 1491 5.3333333333124999e+00 1955 1478 -1.0416666666666666e-10 1955 1952 -2.1333333333291666e+01 1955 1480 5.3333333333124999e+00 1955 1489 -1.0666666666677083e+01 1955 1440 1.5039633158038590e-27 1955 1954 -2.1333333333291666e+01 1955 2233 1.5999999999979167e+01 1955 1435 2.1333333333291666e+01 1956 1956 3.2000000000208331e+01 1957 1957 3.2000000000208331e+01 1958 1958 6.4000000000291664e+01 1958 1487 -1.3020149240672800e-27 1958 1479 1.1000665323307010e-27 1958 1481 -2.1333333333291666e+01 1958 1480 2.1333333333343749e+01 1958 1968 -2.1333333333291666e+01 1958 1318 1.0416666666666666e-10 1958 1969 2.1333333333291666e+01 1959 1959 3.2000000000208331e+01 1960 1960 6.4000000000291664e+01 1960 1483 1.5039633158038590e-27 1960 1975 2.1333333333291666e+01 1960 1479 -1.1213657767716683e-27 1960 1482 -2.1333333333291666e+01 1960 1480 2.1333333333343749e+01 1960 1506 1.0416666666666666e-10 1960 1967 -2.1333333333291666e+01 1961 1961 3.2000000000208331e+01 1962 1962 6.4000000000291664e+01 1962 1487 1.5039633158038590e-27 1962 2203 -2.1333333333291666e+01 1962 1489 -1.1213657767716683e-27 1962 1488 -2.1333333333291666e+01 1962 1480 2.1333333333343749e+01 1962 1651 1.0416666666666666e-10 1962 2230 2.1333333333291666e+01 1963 1963 6.4000000000416662e+01 1963 1481 -5.3333333333124999e+00 1963 1506 5.3333333333124999e+00 1963 1973 -1.5999999999979167e+01 1963 1482 -5.3333333333124999e+00 1963 1497 5.3333333333958333e+00 1963 1967 -1.5999999999979167e+01 1963 1479 5.3333333333333330e+00 1963 1968 -1.5999999999979167e+01 1963 1972 -1.5999999999979167e+01 1963 1318 5.3333333333124999e+00 1963 1131 -5.3333333333124999e+00 1963 1327 5.3333333333124999e+00 1963 1332 -5.3333333333333330e+00 1963 2297 -1.5999999999979167e+01 1963 1124 -5.3333333333124999e+00 1963 1129 5.3333333333958333e+00 1963 1966 -1.5999999999979167e+01 1963 1130 5.3333333333333330e+00 1963 1964 -1.5999999999979167e+01 1963 2308 1.5999999999979167e+01 1963 1504 5.3333333333124999e+00 1963 1502 -5.3333333333333330e+00 1964 1964 6.4000000000291664e+01 1964 2291 -2.1333333333291666e+01 1964 1123 -5.3333333333124999e+00 1964 1131 1.0416666666666666e-10 1964 1129 -5.3333333333124999e+00 1964 1130 1.0666666666677083e+01 1964 1502 -1.5039633158038590e-27 1964 2308 -2.1333333333291666e+01 1964 1963 -1.5999999999979167e+01 1964 1504 -2.1333333333291666e+01 1965 1965 3.2000000000208331e+01 1966 1966 6.4000000000291664e+01 1966 1123 -5.3333333333124999e+00 1966 1332 1.3020149240672800e-27 1966 1124 1.0416666666666666e-10 1966 2297 2.1333333333291666e+01 1966 1129 -5.3333333333124999e+00 1966 1963 -1.5999999999979167e+01 1966 1130 1.0666666666677083e+01 1966 2288 -2.1333333333291666e+01 1966 1327 -2.1333333333291666e+01 1967 1967 6.4000000000291664e+01 1967 1502 1.3020149240672800e-27 1967 1973 2.1333333333291666e+01 1967 1497 -5.3333333333124999e+00 1967 1963 -1.5999999999979167e+01 1967 1482 1.0416666666666666e-10 1967 1480 -5.3333333333124999e+00 1967 1479 1.0666666666677083e+01 1967 1960 -2.1333333333291666e+01 1967 1506 -2.1333333333291666e+01 1968 1968 6.4000000000291664e+01 1968 1497 -5.3333333333124999e+00 1968 1332 -1.5039633158038590e-27 1968 1972 2.1333333333291666e+01 1968 1963 -1.5999999999979167e+01 1968 1318 -2.1333333333291666e+01 1968 1481 1.0416666666666666e-10 1968 1958 -2.1333333333291666e+01 1968 1480 -5.3333333333124999e+00 1968 1479 1.0666666666677083e+01 1969 1969 6.4000000000291664e+01 1969 1480 5.3333333333124999e+00 1969 1328 -1.1213657767716683e-27 1969 1481 -1.0416666666666666e-10 1969 1970 -2.1333333333291666e+01 1969 1485 5.3333333333124999e+00 1969 2202 1.5999999999979167e+01 1969 1487 -1.0666666666677083e+01 1969 1958 2.1333333333291666e+01 1969 1318 2.1333333333291666e+01 1970 1970 6.4000000000291664e+01 1970 1487 -1.3020149240672800e-27 1970 1969 -2.1333333333291666e+01 1970 2202 -1.5999999999979167e+01 1970 1484 1.3233141685082473e-27 1970 1481 2.1333333333291666e+01 1970 1485 -2.1333333333343749e+01 1970 1318 -1.0416666666666666e-10 1970 1971 -2.1333333333291666e+01 1970 2213 1.5999999999979167e+01 1970 1329 5.3333333333124999e+00 1970 1328 -1.0666666666677083e+01 1971 1971 6.4000000000291664e+01 1971 1332 -1.5039633158038590e-27 1971 1972 -2.1333333333291666e+01 1971 1497 5.3333333333124999e+00 1971 2223 1.5999999999979167e+01 1971 1481 -1.0416666666666666e-10 1971 1485 5.3333333333124999e+00 1971 1484 -1.0666666666677083e+01 1971 1328 1.1213657767716683e-27 1971 1970 -2.1333333333291666e+01 1971 2213 -1.5999999999979167e+01 1971 1318 2.1333333333291666e+01 1971 1329 -2.1333333333343749e+01 1972 1972 6.4000000000291664e+01 1972 1329 5.3333333333124999e+00 1972 1484 -1.3233141685082473e-27 1972 1971 -2.1333333333291666e+01 1972 2223 -1.5999999999979167e+01 1972 1479 1.1000665323307010e-27 1972 1481 2.1333333333291666e+01 1972 1497 -2.1333333333343749e+01 1972 1318 -1.0416666666666666e-10 1972 1968 2.1333333333291666e+01 1972 1963 -1.5999999999979167e+01 1972 1332 -1.0666666666677083e+01 1973 1973 6.4000000000291664e+01 1973 1498 1.1000665323307010e-27 1973 1479 -1.1213657767716683e-27 1973 1482 2.1333333333291666e+01 1973 1497 -2.1333333333343749e+01 1973 1967 2.1333333333291666e+01 1973 1963 -1.5999999999979167e+01 1973 1506 -1.0416666666666666e-10 1973 1974 -2.1333333333291666e+01 1973 2147 -1.5999999999979167e+01 1973 1505 5.3333333333124999e+00 1973 1502 -1.0666666666677083e+01 1974 1974 6.4000000000291664e+01 1974 1509 -1.1000665323307010e-27 1974 1935 2.1333333333291666e+01 1974 1474 5.3333333333124999e+00 1974 1931 -1.5999999999979167e+01 1974 1482 -1.0416666666666666e-10 1974 1497 5.3333333333124999e+00 1974 1498 -1.0666666666677083e+01 1974 1502 1.3020149240672800e-27 1974 1973 -2.1333333333291666e+01 1974 2147 1.5999999999979167e+01 1974 1506 2.1333333333291666e+01 1974 1505 -2.1333333333343749e+01 1975 1975 6.4000000000291664e+01 1975 1474 5.3333333333124999e+00 1975 1509 1.1000665323307010e-27 1975 1935 2.1333333333291666e+01 1975 1929 -1.5999999999979167e+01 1975 1506 2.1333333333291666e+01 1975 1482 -1.0416666666666666e-10 1975 1960 2.1333333333291666e+01 1975 1480 5.3333333333124999e+00 1975 1483 -1.0666666666677083e+01 1976 1976 4.2699999999999996e+01 1976 2136 1.0666666666666664e+01 1976 1509 4.0939925783957855e-21 1976 1499 -1.0672916666666666e+01 1976 1929 2.1329166666666666e+01 1976 1928 -1.0666666666666668e+01 1976 1434 1.0662500000000000e+01 1976 1439 -1.0672916666666666e+01 1977 1977 4.2691666666666663e+01 1978 1978 4.2666666667333331e+01 1978 1191 -1.0416666666666666e-11 1978 1200 6.2499999999999991e-11 1978 1194 -4.1666666666666665e-11 1978 1997 1.0666666666583334e+01 1978 1981 -1.0666666666666666e+01 1978 1220 -1.0416666666666666e-11 1978 1998 1.0666666666583334e+01 1978 1980 -1.0666666666666666e+01 1978 1213 -1.0416666666666666e-11 1978 1212 6.2499999999999991e-11 1978 1217 -4.1666666666666665e-11 1978 1525 -1.0416666666666666e-11 1978 1526 6.2499999999999991e-11 1978 1988 -1.0666666666583334e+01 1978 1983 -1.0666666666666666e+01 1978 1515 6.2499999999999991e-11 1978 1994 1.0666666666583334e+01 1978 4305 -4.1666666666666665e-11 1978 4107 -4.1666666666666665e-11 1978 4704 -1.0666666666666666e+01 1979 1979 4.2666666667333331e+01 1979 1689 6.2499999999999991e-11 1979 2320 1.0666666666583334e+01 1979 1984 -1.0666666666666666e+01 1979 2321 1.0666666666583334e+01 1979 1220 -1.0416666666666666e-11 1979 1523 6.2499999999999991e-11 1979 1227 6.2499999999999991e-11 1979 1217 -4.1666666666666665e-11 1979 1992 -1.0666666666583334e+01 1979 1982 -1.0666666666666666e+01 1979 1191 -1.0416666666666666e-11 1979 1195 6.2499999999999991e-11 1979 1194 -4.1666666666666665e-11 1979 2088 -1.0666666666583334e+01 1979 1980 -1.0666666666666666e+01 1979 4356 -1.0416666666666666e-11 1979 4364 -4.1666666666666665e-11 1979 4071 -1.0416666666666666e-11 1979 4706 -1.0666666666666666e+01 1979 4068 -1.0416666666666666e-11 1979 4060 -4.1666666666666665e-11 1979 4316 -1.0416666666666666e-11 1980 1980 4.2666666666916662e+01 1980 1227 -5.3333333333229165e+00 1980 1200 -5.3333333333229165e+00 1980 1220 6.2500000000000004e-11 1980 1998 -2.1333333333312499e+01 1980 1978 -1.0666666666666666e+01 1980 1212 -5.3333333333229165e+00 1980 1217 1.0666666666687499e+01 1980 1191 6.2500000000000004e-11 1980 2088 2.1333333333312499e+01 1980 1979 -1.0666666666666666e+01 1980 1195 -5.3333333333229165e+00 1980 1194 1.0666666666687499e+01 1981 1981 4.2666666666916662e+01 1981 1515 -5.3333333333229165e+00 1981 1997 -2.1333333333312499e+01 1981 1978 -1.0666666666666666e+01 1981 1200 -5.3333333333229165e+00 1981 1194 1.0666666666687499e+01 1981 4705 -1.0666666666666666e+01 1981 4107 1.0666666666687499e+01 1982 1982 4.2666666666916662e+01 1982 1523 -5.3333333333229165e+00 1982 1992 2.1333333333312499e+01 1982 1979 -1.0666666666666666e+01 1982 1227 -5.3333333333229165e+00 1982 1218 -5.3333333333229165e+00 1982 1217 1.0666666666687499e+01 1982 1986 -2.1333333333312499e+01 1982 4316 6.2499999999999991e-11 1982 4068 6.2500000000000004e-11 1982 4699 -1.0666666666666666e+01 1982 4066 -5.3333333333229165e+00 1982 4060 1.0666666666687499e+01 1983 1983 4.2666666666916662e+01 1983 1212 -5.3333333333229165e+00 1983 1988 2.1333333333312499e+01 1983 1978 -1.0666666666666666e+01 1983 1526 -5.3333333333229165e+00 1983 1525 6.2499999999999991e-11 1983 1213 6.2499999999999991e-11 1983 1985 -2.1333333333312499e+01 1983 1218 -5.3333333333229165e+00 1983 1217 1.0666666666687499e+01 1983 4306 -5.3333333333229165e+00 1983 4305 1.0666666666687499e+01 1983 4699 -1.0666666666666666e+01 1984 1984 4.2666666666916662e+01 1984 1195 -5.3333333333229165e+00 1984 1194 1.0666666666687499e+01 1984 2320 -2.1333333333312499e+01 1984 1979 -1.0666666666666666e+01 1984 1689 -5.3333333333229165e+00 1984 4705 -1.0666666666666666e+01 1984 4364 1.0666666666687499e+01 1985 1985 6.4000000000416662e+01 1985 1983 -2.1333333333312499e+01 1985 1213 -1.0666666666583334e+01 1985 1218 2.1333333333312499e+01 1985 1217 -5.3333333333124999e+00 1985 1989 2.1333333333312499e+01 1985 1525 -1.0666666666583334e+01 1985 4313 -5.3333333333124999e+00 1985 4305 -5.3333333333124999e+00 1985 4699 1.0666666666583334e+01 1985 4985 1.0666666666583334e+01 1985 4306 2.1333333333312499e+01 1985 4308 -5.3333333333124999e+00 1986 1986 6.4000000000416662e+01 1986 1218 2.1333333333312499e+01 1986 1217 -5.3333333333124999e+00 1986 1982 -2.1333333333312499e+01 1986 4064 -5.3333333333124999e+00 1986 4987 -2.1333333333312499e+01 1986 4985 1.0666666666583334e+01 1986 4313 -5.3333333333124999e+00 1986 4316 -1.0666666666583334e+01 1986 4699 1.0666666666583334e+01 1986 4068 -1.0666666666583334e+01 1986 4066 2.1333333333312499e+01 1986 4060 -5.3333333333124999e+00 1987 1987 4.2666666667083327e+01 1987 1530 -1.8812360437258079e-27 1987 1990 -1.0666666666562499e+01 1987 2005 1.0666666666666666e+01 1987 1526 1.8812360437258079e-27 1987 1525 1.0666666666562499e+01 1987 1528 -1.0666666666666666e+01 1987 1212 1.8812360437258079e-27 1987 1988 -1.0666666666562499e+01 1987 1995 -1.0666666666666666e+01 1987 1213 1.0666666666562499e+01 1987 1211 -1.0666666666666666e+01 1987 4317 -3.6295685768920020e-28 1988 1988 5.3333333333749998e+01 1988 1528 1.8812360437258079e-27 1988 1217 5.3333333333124999e+00 1988 1983 2.1333333333312499e+01 1988 1978 -1.0666666666583334e+01 1988 1525 1.0666666666572917e+01 1988 1526 -1.5999999999989583e+01 1988 1211 1.8812360437258079e-27 1988 1987 -1.0666666666562499e+01 1988 1995 1.0666666666666666e+01 1988 1213 1.0666666666572915e+01 1988 1212 -1.5999999999989583e+01 1988 4305 5.3333333333124999e+00 1989 1989 4.2666666666916662e+01 1989 1218 5.3333333333229165e+00 1989 1530 5.3333333333229165e+00 1989 1213 -6.2499999999999991e-11 1989 1990 -2.1333333333312499e+01 1989 1525 -6.2499999999999991e-11 1989 1985 2.1333333333312499e+01 1989 4982 1.0666666666666666e+01 1989 4317 5.3333333333229165e+00 1989 4313 -1.0666666666687499e+01 1989 4985 1.0666666666666666e+01 1989 4306 5.3333333333229165e+00 1989 4308 -1.0666666666687499e+01 1990 1990 5.3333333333749991e+01 1990 1211 -1.8812360437258079e-27 1990 1528 -3.6295685768920020e-28 1990 1987 -1.0666666666562499e+01 1990 2005 -1.0666666666666666e+01 1990 1525 1.0666666666572917e+01 1990 1530 -1.5999999999989583e+01 1990 1989 -2.1333333333312499e+01 1990 1213 1.0666666666572917e+01 1990 4308 5.3333333333124999e+00 1990 4982 -1.0666666666583334e+01 1990 4317 -1.5999999999989583e+01 1990 4313 5.3333333333124999e+00 1991 1991 4.2666666666916662e+01 1991 1524 5.3333333333229165e+00 1991 1993 2.1333333333312499e+01 1991 2315 1.0666666666666666e+01 1991 1228 5.3333333333229165e+00 1991 1227 5.3333333333229165e+00 1991 1226 -1.0666666666687499e+01 1991 1992 -2.1333333333312499e+01 1991 2316 1.0666666666666666e+01 1991 1523 5.3333333333229165e+00 1991 1522 -1.0666666666687499e+01 1991 4316 -6.2500000000000004e-11 1991 4068 -6.2499999999999991e-11 1992 1992 6.4000000000416662e+01 1992 1982 2.1333333333312499e+01 1992 1979 -1.0666666666583334e+01 1992 1217 5.3333333333124999e+00 1992 1227 -2.1333333333312499e+01 1992 1226 5.3333333333124999e+00 1992 1991 -2.1333333333312499e+01 1992 2316 -1.0666666666583334e+01 1992 1523 -2.1333333333312499e+01 1992 1522 5.3333333333124999e+00 1992 4060 5.3333333333124999e+00 1992 4316 1.0666666666583334e+01 1992 4068 1.0666666666583334e+01 1993 1993 6.4000000000416662e+01 1993 1228 2.1333333333312499e+01 1993 1524 2.1333333333312499e+01 1993 1522 -5.3333333333124999e+00 1993 1991 2.1333333333312499e+01 1993 2315 1.0666666666583334e+01 1993 1226 -5.3333333333124999e+00 1993 4316 -1.0666666666583334e+01 1993 4318 -5.3333333333124999e+00 1993 5005 -2.1333333333312499e+01 1993 816 -1.0666666666583334e+01 1993 4068 -1.0666666666583334e+01 1993 442 -5.3333333333124999e+00 1994 1994 7.4666666667124986e+01 1994 1520 -5.3333333333229165e+00 1994 1995 -1.0666666666583334e+01 1994 1999 2.1333333333291666e+01 1994 1528 -5.3333333332812494e+00 1994 1526 2.1333333333333332e+01 1994 1978 1.0666666666583334e+01 1994 1515 3.2000000000000000e+01 1994 4305 -5.3333333333124999e+00 1994 4704 -2.1333333333312499e+01 1994 4107 -5.3333333333124999e+00 1995 1995 5.3333333333749991e+01 1995 1214 -1.2069011089684726e-28 1995 1996 -3.2000000000020833e+01 1995 2003 2.1333333333291666e+01 1995 1516 1.0666666666625000e+01 1995 1525 -2.2470898404921788e-28 1995 1520 -5.3333333333437496e+00 1995 1515 -1.0666666666791667e+01 1995 1528 6.2500000000000004e-11 1995 1994 -1.0666666666583334e+01 1995 1999 -1.0666666666666666e+01 1995 1526 5.3333333333229165e+00 1995 1213 -4.5860624244724788e-28 1995 1212 5.3333333333229165e+00 1995 1211 -5.3333333333229165e+00 1995 1988 1.0666666666666666e+01 1995 1987 -1.0666666666666666e+01 1996 1996 6.4000000000583327e+01 1996 1211 5.3333333332812494e+00 1996 1995 -3.2000000000020833e+01 1996 2003 -2.1333333333208333e+01 1996 1520 5.3333333333229165e+00 1996 1220 1.0416666666666666e-11 1996 1212 -1.0416666666666666e-10 1996 1214 -5.3333333332916668e+00 1996 1191 1.0416666666666666e-11 1996 1200 -6.2499999999999991e-11 1996 1192 4.1666666666666665e-11 1996 1998 -1.0666666666583334e+01 1996 2085 1.0666666666666666e+01 1996 1515 1.0666666666625000e+01 1996 1516 -1.5999999999958334e+01 1996 1997 -1.0666666666583334e+01 1996 2080 1.0666666666666666e+01 1997 1997 6.4000000000416662e+01 1997 1981 -2.1333333333312499e+01 1997 1978 1.0666666666583334e+01 1997 1194 -5.3333333333124999e+00 1997 1200 2.1333333333312499e+01 1997 1192 -5.3333333333124999e+00 1997 2080 -2.1333333333312499e+01 1997 1996 -1.0666666666583334e+01 1997 1515 2.1333333333312499e+01 1997 1516 -5.3333333333124999e+00 1997 4107 -5.3333333333124999e+00 1998 1998 6.4000000000416662e+01 1998 1194 -5.3333333333124999e+00 1998 1980 -2.1333333333312499e+01 1998 1978 1.0666666666583334e+01 1998 1217 -5.3333333333124999e+00 1998 1220 -1.0666666666583334e+01 1998 1212 2.1333333333312499e+01 1998 1214 -5.3333333333124999e+00 1998 2085 -2.1333333333312499e+01 1998 1996 -1.0666666666583334e+01 1998 1191 -1.0666666666583334e+01 1998 1200 2.1333333333312499e+01 1998 1192 -5.3333333333124999e+00 1999 1999 4.2666666666999994e+01 1999 1515 1.0666666666625000e+01 1999 1526 -1.8812360437258079e-27 1999 1994 2.1333333333291666e+01 1999 1995 -1.0666666666666666e+01 1999 1528 -1.0666666666729165e+01 1999 2008 1.0666666666666666e+01 1999 1520 -1.0666666666729165e+01 2000 2000 4.2666666666916662e+01 2001 2001 5.3333333333749991e+01 2001 1216 1.0666666666625000e+01 2001 1547 -3.5848693552059962e-28 2001 2004 -3.2000000000020833e+01 2001 2128 2.1333333333291666e+01 2001 1164 2.0194839173657902e-27 2001 1225 -5.3333333333437496e+00 2001 1215 5.3333333333020834e+00 2001 1211 -1.0666666666791667e+01 2001 1777 1.0666666666583334e+01 2001 1165 6.2499999999999991e-11 2001 1779 -1.0666666666666666e+01 2001 1153 -5.3333333332812494e+00 2001 1166 5.3333333333229165e+00 2001 1534 2.2470898404921788e-28 2001 1533 5.3333333333229165e+00 2001 1532 -5.3333333333229165e+00 2001 2002 -1.0666666666666666e+01 2001 2121 -1.0666666666666666e+01 2002 2002 5.3333333333749998e+01 2002 1546 -5.3333333333124999e+00 2002 2087 -2.1333333333312499e+01 2002 2003 -1.0666666666583334e+01 2002 1159 -5.3333333333124999e+00 2002 1165 1.8812360437258079e-27 2002 1164 -1.0666666666572915e+01 2002 1166 1.5999999999989583e+01 2002 1532 -1.8812360437258079e-27 2002 2121 1.0666666666562499e+01 2002 2001 -1.0666666666666666e+01 2002 1534 -1.0666666666572915e+01 2002 1533 1.5999999999989583e+01 2003 2003 6.4000000000916657e+01 2003 1153 1.0416666666666666e-11 2003 1534 1.0416666666666666e-11 2003 1164 1.0416666666666666e-11 2003 1166 -6.2499999999999991e-11 2003 1159 4.1666666666666665e-11 2003 2002 -1.0666666666583334e+01 2003 2087 1.0666666666666666e+01 2003 1212 5.3333333332812494e+00 2003 1520 -2.0833333333333342e-11 2003 1995 2.1333333333291666e+01 2003 1996 -2.1333333333208333e+01 2003 1515 -5.3333333333020834e+00 2003 1516 1.0666666666833333e+01 2003 1533 -1.0416666666666666e-10 2003 2008 -2.1333333333291666e+01 2003 2011 -2.1333333333208333e+01 2003 1546 -5.3333333332916668e+00 2003 1215 1.0416666666666666e-11 2003 1211 -1.0416666666666667e-10 2003 1214 -5.3333333332916668e+00 2003 1777 1.0666666666583334e+01 2003 1776 -1.0666666666666666e+01 2004 2004 8.5333333334166653e+01 2004 1225 5.3333333333229165e+00 2004 2001 -3.2000000000020833e+01 2004 2128 -2.1333333333208333e+01 2004 1532 5.3333333332812494e+00 2004 1533 -1.4583333333333332e-10 2004 1547 -1.0666666666625000e+01 2004 1601 -2.0833333333333342e-11 2004 2006 -2.1333333333291666e+01 2004 2326 2.1333333333208333e+01 2004 1599 1.0666666666833333e+01 2004 1211 1.0666666666583334e+01 2004 2005 -2.1333333333291666e+01 2004 2322 -2.1333333333208333e+01 2004 1216 -2.1333333333291666e+01 2004 4254 -5.3333333333020834e+00 2004 4317 5.3333333332812494e+00 2005 2005 5.3333333333750005e+01 2005 1213 -2.0194839173657902e-27 2005 1525 2.0194839173657902e-27 2005 1528 -6.2499999999999991e-11 2005 1530 -5.3333333333229165e+00 2005 1987 1.0666666666666666e+01 2005 1990 -1.0666666666666666e+01 2005 2323 1.0666666666583334e+01 2005 2009 -1.0666666666666666e+01 2005 1601 5.3333333333437496e+00 2005 1599 -1.0666666666625000e+01 2005 1216 -4.6458872727282566e-28 2005 2322 3.2000000000020833e+01 2005 2004 -2.1333333333291666e+01 2005 1211 5.3333333333229165e+00 2005 4254 1.0666666666791667e+01 2005 4317 -5.3333333333229165e+00 2006 2006 5.3333333333749998e+01 2006 1528 -6.2500000000000004e-11 2006 2009 -1.0666666666666666e+01 2006 1547 -2.8320667257631078e-28 2006 2326 -3.2000000000020833e+01 2006 2004 -2.1333333333291666e+01 2006 1601 5.3333333333437496e+00 2006 1599 -1.0666666666625000e+01 2006 1533 5.3333333333229165e+00 2006 2007 -1.0666666666666666e+01 2007 2007 4.2666666667083327e+01 2007 1528 1.0666666666666666e+01 2007 2008 -1.0666666666666666e+01 2007 2006 -1.0666666666666666e+01 2007 1533 1.0666666666666666e+01 2008 2008 5.3333333333749991e+01 2008 1516 -1.0666666666625000e+01 2008 1546 -6.0691943799667649e-29 2008 2011 3.2000000000020833e+01 2008 2003 -2.1333333333291666e+01 2008 1533 5.3333333333229165e+00 2008 1528 -6.2499999999999991e-11 2008 2007 -1.0666666666666666e+01 2008 1520 5.3333333333437496e+00 2008 1999 1.0666666666666666e+01 2009 2009 4.2666666666999994e+01 2009 2006 -1.0666666666666666e+01 2009 1530 -2.2851328271989659e-27 2009 1528 1.0666666666729165e+01 2009 2323 -2.1333333333291666e+01 2009 2005 -1.0666666666666666e+01 2009 1601 1.0666666666729165e+01 2009 4254 -1.0666666666625000e+01 2010 2010 2.1333333333541667e+01 2011 2011 6.4000000000583327e+01 2011 1520 5.3333333333229165e+00 2011 2008 3.2000000000020833e+01 2011 2003 -2.1333333333208333e+01 2011 1533 5.3333333332812494e+00 2011 1516 -1.5999999999958334e+01 2011 1625 4.1666666666666665e-11 2011 2082 1.0666666666666666e+01 2011 1546 -5.3333333332916668e+00 2011 2084 1.0666666666666666e+01 2012 2012 3.2000000000208331e+01 2013 2013 3.2000000000208331e+01 2014 2014 2.1333333333541667e+01 2015 2015 5.3333333333749991e+01 2015 1234 3.0430870179097285e-28 2015 2037 3.2000000000020833e+01 2015 2019 -2.1333333333291666e+01 2015 1567 -1.0666666666625000e+01 2015 1573 -4.5860624244724788e-28 2015 1571 5.3333333333437496e+00 2015 1566 1.0666666666791667e+01 2015 1575 -6.2500000000000004e-11 2015 2033 -1.0666666666583334e+01 2015 2025 -1.0666666666666666e+01 2015 1577 -5.3333333333229165e+00 2015 1233 -2.2470898404921788e-28 2015 1232 -5.3333333333229165e+00 2015 1231 5.3333333333229165e+00 2015 2034 1.0666666666666666e+01 2015 2016 -1.0666666666666666e+01 2016 2016 4.2666666667083327e+01 2016 1238 -3.6295685768920020e-28 2016 1578 1.8812360437258079e-27 2016 2043 1.0666666666562499e+01 2016 2021 -1.0666666666666666e+01 2016 1577 -1.8812360437258079e-27 2016 1573 -1.0666666666562499e+01 2016 1575 1.0666666666666666e+01 2016 1232 -2.2851328271989659e-27 2016 2034 -1.0666666666562499e+01 2016 2015 -1.0666666666666666e+01 2016 1233 -1.0666666666562499e+01 2016 1231 1.0666666666666666e+01 2017 2017 5.3333333333749991e+01 2017 1239 1.0666666666625000e+01 2017 1564 6.0691943799667649e-29 2017 2020 -3.2000000000020833e+01 2017 2190 2.1333333333291666e+01 2017 1168 2.0194839173657902e-27 2017 1245 -5.3333333333437496e+00 2017 1235 5.3333333333020834e+00 2017 1231 -1.0666666666791667e+01 2017 1781 1.0666666666583334e+01 2017 1169 6.2499999999999991e-11 2017 1784 -1.0666666666666666e+01 2017 1154 -5.3333333332812494e+00 2017 1170 5.3333333333229165e+00 2017 1551 -4.5860624244724788e-28 2017 1550 5.3333333333229165e+00 2017 1549 -5.3333333333229165e+00 2017 2018 -1.0666666666666666e+01 2017 2182 -1.0666666666666666e+01 2018 2018 5.3333333333749998e+01 2018 1563 -5.3333333333124999e+00 2018 2114 -2.1333333333312499e+01 2018 2019 -1.0666666666583334e+01 2018 1162 -5.3333333333124999e+00 2018 1169 1.8812360437258079e-27 2018 1168 -1.0666666666572915e+01 2018 1170 1.5999999999989583e+01 2018 1549 -1.8812360437258079e-27 2018 2182 1.0666666666562499e+01 2018 2017 -1.0666666666666666e+01 2018 1551 -1.0666666666572915e+01 2018 1550 1.5999999999989583e+01 2019 2019 6.4000000000916657e+01 2019 1154 1.0416666666666666e-11 2019 1551 1.0416666666666666e-11 2019 1168 1.0416666666666666e-11 2019 1170 -6.2499999999999991e-11 2019 1162 4.1666666666666665e-11 2019 2018 -1.0666666666583334e+01 2019 2114 1.0666666666666666e+01 2019 1232 5.3333333332812494e+00 2019 1571 -2.0833333333333339e-11 2019 2015 -2.1333333333291666e+01 2019 2037 -2.1333333333208333e+01 2019 1566 -5.3333333333020834e+00 2019 1567 1.0666666666833333e+01 2019 1550 -1.0416666666666667e-10 2019 2024 -2.1333333333291666e+01 2019 2029 -2.1333333333208333e+01 2019 1563 -5.3333333332916668e+00 2019 1235 1.0416666666666666e-11 2019 1231 -1.0416666666666667e-10 2019 1234 -5.3333333332916668e+00 2019 1781 1.0666666666583334e+01 2019 1780 -1.0666666666666666e+01 2020 2020 8.5333333334166653e+01 2020 1245 5.3333333333229165e+00 2020 2017 -3.2000000000020833e+01 2020 2190 -2.1333333333208333e+01 2020 1549 5.3333333332812494e+00 2020 1438 -5.3333333333020834e+00 2020 1550 -1.4583333333333335e-10 2020 1564 -1.0666666666625000e+01 2020 1445 -2.0833333333333339e-11 2020 2022 -2.1333333333291666e+01 2020 2329 2.1333333333208333e+01 2020 1443 1.0666666666833333e+01 2020 1231 1.0666666666583334e+01 2020 2021 -2.1333333333291666e+01 2020 2077 -2.1333333333208333e+01 2020 1238 5.3333333332812494e+00 2020 1239 -2.1333333333291666e+01 2021 2021 5.3333333333750005e+01 2021 1233 -2.0194839173657902e-27 2021 1573 2.0194839173657902e-27 2021 1575 -6.2499999999999991e-11 2021 1578 -5.3333333333229165e+00 2021 2016 -1.0666666666666666e+01 2021 2043 -1.0666666666666666e+01 2021 2078 1.0666666666583334e+01 2021 2026 -1.0666666666666666e+01 2021 1438 1.0666666666791667e+01 2021 1445 5.3333333333437496e+00 2021 1443 -1.0666666666625000e+01 2021 1239 -2.8113590706237963e-30 2021 2077 3.2000000000020833e+01 2021 2020 -2.1333333333291666e+01 2021 1238 -5.3333333333229165e+00 2021 1231 5.3333333333229165e+00 2022 2022 5.3333333333749998e+01 2022 1575 -6.2500000000000004e-11 2022 2026 -1.0666666666666666e+01 2022 1564 3.0430870179097285e-28 2022 2329 -3.2000000000020833e+01 2022 2020 -2.1333333333291666e+01 2022 1445 5.3333333333437496e+00 2022 1443 -1.0666666666625000e+01 2022 1550 5.3333333333229165e+00 2022 2023 -1.0666666666666666e+01 2023 2023 4.2666666667083327e+01 2023 1575 1.0666666666666666e+01 2023 2024 -1.0666666666666666e+01 2023 2022 -1.0666666666666666e+01 2023 1550 1.0666666666666666e+01 2024 2024 5.3333333333749991e+01 2024 1567 -1.0666666666625000e+01 2024 1563 -2.8113590706237963e-30 2024 2029 3.2000000000020833e+01 2024 2019 -2.1333333333291666e+01 2024 1550 5.3333333333229165e+00 2024 1575 -6.2499999999999991e-11 2024 2023 -1.0666666666666666e+01 2024 1571 5.3333333333437496e+00 2024 2025 -1.0666666666666666e+01 2025 2025 4.2666666666999994e+01 2025 1566 -1.0666666666625000e+01 2025 1577 2.2851328271989659e-27 2025 2033 2.1333333333291666e+01 2025 2015 -1.0666666666666666e+01 2025 1575 1.0666666666729165e+01 2025 2024 -1.0666666666666666e+01 2025 1571 1.0666666666729165e+01 2026 2026 4.2666666666999994e+01 2026 2022 -1.0666666666666666e+01 2026 1578 -1.8812360437258079e-27 2026 1575 1.0666666666729165e+01 2026 2078 -2.1333333333291666e+01 2026 2021 -1.0666666666666666e+01 2026 1438 -1.0666666666625000e+01 2026 1445 1.0666666666729165e+01 2027 2027 4.2666666666916662e+01 2028 2028 2.1333333333541667e+01 2029 2029 6.4000000000583327e+01 2029 1571 5.3333333333229165e+00 2029 2024 3.2000000000020833e+01 2029 2019 -2.1333333333208333e+01 2029 1550 5.3333333332812494e+00 2029 1567 -1.5999999999958334e+01 2029 1636 4.1666666666666665e-11 2029 2108 1.0666666666666666e+01 2029 1563 -5.3333333332916668e+00 2029 2111 1.0666666666666666e+01 2030 2030 3.2000000000208331e+01 2031 2031 3.2000000000208331e+01 2032 2032 2.1333333333541667e+01 2033 2033 7.4666666667124986e+01 2033 1571 5.3333333333229165e+00 2033 2015 -1.0666666666583334e+01 2033 2025 2.1333333333291666e+01 2033 1575 5.3333333332812494e+00 2033 1577 -2.1333333333333332e+01 2033 2035 1.0666666666583334e+01 2033 1566 -3.2000000000000000e+01 2033 4377 5.3333333333124999e+00 2033 4481 2.1333333333312499e+01 2033 3817 5.3333333333124999e+00 2034 2034 5.3333333333749998e+01 2034 1241 -5.3333333333124999e+00 2034 2042 2.1333333333312499e+01 2034 2035 -1.0666666666583334e+01 2034 1575 -1.8812360437258079e-27 2034 1573 -1.0666666666572915e+01 2034 1577 1.5999999999989583e+01 2034 1231 -1.8812360437258079e-27 2034 2016 -1.0666666666562499e+01 2034 2015 1.0666666666666666e+01 2034 1233 -1.0666666666572915e+01 2034 1232 1.5999999999989583e+01 2034 4377 -5.3333333333124999e+00 2035 2035 4.2666666667333331e+01 2035 1233 1.0416666666666666e-11 2035 1573 1.0416666666666666e-11 2035 1577 -6.2499999999999991e-11 2035 2034 -1.0666666666583334e+01 2035 2042 -1.0666666666666666e+01 2035 1602 1.0416666666666666e-11 2035 1607 -6.2499999999999991e-11 2035 2038 -1.0666666666583334e+01 2035 1237 1.0416666666666666e-11 2035 1232 -6.2499999999999991e-11 2035 1241 4.1666666666666665e-11 2035 2039 -1.0666666666583334e+01 2035 2061 -1.0666666666666666e+01 2035 1566 -6.2499999999999991e-11 2035 2033 1.0666666666583334e+01 2035 4377 4.1666666666666665e-11 2035 3826 4.1666666666666665e-11 2035 4470 1.0666666666666666e+01 2035 3817 4.1666666666666665e-11 2035 4481 1.0666666666666666e+01 2036 2036 5.3333333333749998e+01 2036 1237 2.0194839173657902e-27 2036 1602 2.2470898404921788e-28 2036 1607 5.3333333333229165e+00 2036 1603 6.2499999999999991e-11 2036 2039 -1.0666666666666666e+01 2036 2064 -1.0666666666666666e+01 2036 1234 2.0194839173657902e-27 2036 1232 5.3333333333229165e+00 2036 1244 -5.3333333333229165e+00 2036 2038 -1.0666666666583334e+01 2036 2072 -1.0666666666666666e+01 2036 2037 -3.2000000000020833e+01 2036 2109 -2.1333333333291666e+01 2036 1566 -1.0666666666791667e+01 2036 1567 1.0666666666625000e+01 2036 1570 -5.3333333333437496e+00 2037 2037 8.5333333333833323e+01 2037 1231 5.3333333332812494e+00 2037 2015 3.2000000000020833e+01 2037 2019 -2.1333333333208333e+01 2037 1571 5.3333333333229165e+00 2037 1232 -1.4583333333333332e-10 2037 1234 -1.0666666666625000e+01 2037 1244 5.3333333332812494e+00 2037 2036 -3.2000000000020833e+01 2037 2109 2.1333333333208333e+01 2037 1566 2.1333333333312499e+01 2037 1567 -3.1999999999958334e+01 2037 1570 5.3333333333229165e+00 2038 2038 7.4666666667125000e+01 2038 1603 -5.3333333332812494e+00 2038 2035 -1.0666666666583334e+01 2038 1607 2.1333333333333332e+01 2038 2072 2.1333333333291666e+01 2038 2036 -1.0666666666583334e+01 2038 1566 3.2000000000000000e+01 2038 1570 -5.3333333333229165e+00 2038 3817 -5.3333333333124999e+00 2038 4470 -2.1333333333312499e+01 2038 3826 -5.3333333333124999e+00 2039 2039 5.3333333333749991e+01 2039 1244 1.8812360437258079e-27 2039 1603 -1.8812360437258079e-27 2039 2064 1.0666666666562499e+01 2039 2036 -1.0666666666666666e+01 2039 1602 -1.0666666666572917e+01 2039 1607 1.5999999999989583e+01 2039 2061 2.1333333333312499e+01 2039 2035 -1.0666666666583334e+01 2039 1237 -1.0666666666572917e+01 2039 1232 1.5999999999989583e+01 2039 1241 -5.3333333333124999e+00 2039 3826 -5.3333333333124999e+00 2040 2040 4.2666666666916662e+01 2040 1242 5.3333333333229165e+00 2040 1578 5.3333333333229165e+00 2040 1233 -6.2500000000000004e-11 2040 2043 -2.1333333333312499e+01 2040 2074 1.0666666666666666e+01 2040 1238 5.3333333333229165e+00 2040 1243 -1.0666666666687499e+01 2040 1573 -6.2499999999999991e-11 2040 2041 -2.1333333333312499e+01 2040 4893 1.0666666666666666e+01 2040 4378 5.3333333333229165e+00 2040 4380 -1.0666666666687499e+01 2041 2041 6.4000000000416662e+01 2041 1243 5.3333333333124999e+00 2041 2042 -2.1333333333312499e+01 2041 1233 1.0666666666583334e+01 2041 1242 -2.1333333333312499e+01 2041 1241 5.3333333333124999e+00 2041 2040 -2.1333333333312499e+01 2041 1573 1.0666666666583334e+01 2041 4377 5.3333333333124999e+00 2041 4475 -1.0666666666583334e+01 2041 4893 -1.0666666666583334e+01 2041 4378 -2.1333333333312499e+01 2041 4380 5.3333333333124999e+00 2042 2042 4.2666666666916662e+01 2042 1232 5.3333333333229165e+00 2042 2034 2.1333333333312499e+01 2042 2035 -1.0666666666666666e+01 2042 1577 5.3333333333229165e+00 2042 1573 -6.2500000000000004e-11 2042 1233 -6.2499999999999991e-11 2042 2041 -2.1333333333312499e+01 2042 1242 5.3333333333229165e+00 2042 1241 -1.0666666666687499e+01 2042 4378 5.3333333333229165e+00 2042 4377 -1.0666666666687499e+01 2042 4475 1.0666666666666666e+01 2043 2043 5.3333333333749991e+01 2043 1231 -1.8812360437258079e-27 2043 1575 -3.6295685768920020e-28 2043 2016 1.0666666666562499e+01 2043 2021 -1.0666666666666666e+01 2043 1573 1.0666666666572917e+01 2043 1578 -1.5999999999989583e+01 2043 2040 -2.1333333333312499e+01 2043 2074 -1.0666666666583334e+01 2043 1233 1.0666666666572917e+01 2043 1238 -1.5999999999989583e+01 2043 1243 5.3333333333124999e+00 2043 4380 5.3333333333124999e+00 2044 2044 6.4000000000416662e+01 2044 1581 5.3333333333958333e+00 2044 1580 5.3333333333333330e+00 2044 1097 5.3333333333958333e+00 2044 1096 5.3333333333333330e+00 2044 1121 5.3333333333124999e+00 2044 1091 -5.3333333333124999e+00 2044 1705 1.5999999999979167e+01 2044 1115 5.3333333333124999e+00 2044 1119 -5.3333333333958333e+00 2044 1706 -1.5999999999979167e+01 2044 1120 -5.3333333333333330e+00 2044 2049 1.5999999999979167e+01 2044 2045 -1.5999999999979167e+01 2044 1582 -5.3333333333124999e+00 2044 336 5.3333333333124999e+00 2044 469 -5.3333333333124999e+00 2044 930 1.5999999999979167e+01 2044 341 5.3333333333124999e+00 2044 342 -5.3333333333958333e+00 2044 921 1.5999999999979167e+01 2044 340 -5.3333333333333330e+00 2044 912 -1.5999999999979167e+01 2044 913 1.5999999999979167e+01 2044 396 -5.3333333333124999e+00 2045 2045 6.4000000000291664e+01 2045 1595 -5.3333333333124999e+00 2045 1137 1.1000665323307010e-27 2045 2057 2.1333333333291666e+01 2045 2047 -1.5999999999979167e+01 2045 1120 -1.3020149240672800e-27 2045 1121 -2.1333333333291666e+01 2045 1119 2.1333333333343749e+01 2045 1582 1.0416666666666666e-10 2045 2049 -2.1333333333291666e+01 2045 2044 -1.5999999999979167e+01 2045 1581 -5.3333333333124999e+00 2045 1580 1.0666666666677083e+01 2046 2046 6.4000000000416662e+01 2046 1101 5.3333333333958333e+00 2046 1100 5.3333333333333330e+00 2046 1447 5.3333333333958333e+00 2046 1462 5.3333333333333330e+00 2046 1116 5.3333333333124999e+00 2046 1453 -5.3333333333124999e+00 2046 2048 -1.5999999999979167e+01 2046 1136 5.3333333333124999e+00 2046 1119 -5.3333333333958333e+00 2046 2160 1.5999999999979167e+01 2046 1138 -5.3333333333333330e+00 2046 1709 -1.5999999999979167e+01 2046 1708 1.5999999999979167e+01 2046 1102 -5.3333333333124999e+00 2046 331 5.3333333333124999e+00 2046 433 -5.3333333333124999e+00 2046 789 1.5999999999979167e+01 2046 332 5.3333333333124999e+00 2046 342 -5.3333333333958333e+00 2046 783 1.5999999999979167e+01 2046 329 -5.3333333333333330e+00 2046 784 1.5999999999979167e+01 2046 788 1.5999999999979167e+01 2046 428 -5.3333333333124999e+00 2047 2047 6.4000000000416662e+01 2047 1460 5.3333333333958333e+00 2047 1462 5.3333333333333330e+00 2047 1595 5.3333333333958333e+00 2047 1580 5.3333333333333330e+00 2047 1136 5.3333333333124999e+00 2047 1582 -5.3333333333124999e+00 2047 2045 -1.5999999999979167e+01 2047 1121 5.3333333333124999e+00 2047 1119 -5.3333333333958333e+00 2047 2057 -1.5999999999979167e+01 2047 1137 -5.3333333333333330e+00 2047 2286 1.5999999999979167e+01 2047 2048 -1.5999999999979167e+01 2047 1453 -5.3333333333124999e+00 2047 341 5.3333333333124999e+00 2047 428 -5.3333333333124999e+00 2047 788 1.5999999999979167e+01 2047 331 5.3333333333124999e+00 2047 342 -5.3333333333958333e+00 2047 787 -1.5999999999979167e+01 2047 344 -5.3333333333333330e+00 2047 931 -1.5999999999979167e+01 2047 930 1.5999999999979167e+01 2047 469 -5.3333333333124999e+00 2048 2048 6.4000000000291664e+01 2048 1447 -5.3333333333124999e+00 2048 1138 1.5039633158038590e-27 2048 2160 -2.1333333333291666e+01 2048 2046 -1.5999999999979167e+01 2048 1137 -1.1213657767716683e-27 2048 1136 -2.1333333333291666e+01 2048 1119 2.1333333333343749e+01 2048 1453 1.0416666666666666e-10 2048 2286 -2.1333333333291666e+01 2048 2047 -1.5999999999979167e+01 2048 1460 -5.3333333333124999e+00 2048 1462 1.0666666666677083e+01 2049 2049 6.4000000000291664e+01 2049 1596 1.1213657767716683e-27 2049 2054 2.1333333333291666e+01 2049 1127 -5.3333333333124999e+00 2049 2050 -1.5999999999979167e+01 2049 1121 1.0416666666666666e-10 2049 1119 -5.3333333333124999e+00 2049 1120 1.0666666666677083e+01 2049 1580 -1.1000665323307010e-27 2049 2045 -2.1333333333291666e+01 2049 2044 1.5999999999979167e+01 2049 1582 -2.1333333333291666e+01 2049 1581 2.1333333333343749e+01 2050 2050 6.4000000000416662e+01 2050 1352 -5.3333333333124999e+00 2050 1094 5.3333333333124999e+00 2050 2303 1.5999999999979167e+01 2050 1367 -5.3333333333124999e+00 2050 1361 5.3333333333958333e+00 2050 2052 -1.5999999999979167e+01 2050 1368 5.3333333333333330e+00 2050 1115 -5.3333333333124999e+00 2050 1582 5.3333333333124999e+00 2050 2054 -1.5999999999979167e+01 2050 1121 -5.3333333333124999e+00 2050 1127 5.3333333333958333e+00 2050 2049 -1.5999999999979167e+01 2050 1120 5.3333333333333330e+00 2050 1706 1.5999999999979167e+01 2050 1707 -1.5999999999979167e+01 2050 1091 5.3333333333124999e+00 2050 1097 -5.3333333333958333e+00 2050 1098 -5.3333333333333330e+00 2050 2051 -1.5999999999979167e+01 2050 2245 -1.5999999999979167e+01 2050 1587 5.3333333333124999e+00 2050 1581 -5.3333333333958333e+00 2050 1596 -5.3333333333333330e+00 2051 2051 6.4000000000291664e+01 2051 1588 1.3233141685082473e-27 2051 2243 2.1333333333291666e+01 2051 1358 -5.3333333333124999e+00 2051 2053 1.5999999999979167e+01 2051 1352 1.0416666666666666e-10 2051 1361 -5.3333333333124999e+00 2051 1368 1.0666666666677083e+01 2051 1596 -1.1000665323307010e-27 2051 2245 2.1333333333291666e+01 2051 2050 -1.5999999999979167e+01 2051 1587 -2.1333333333291666e+01 2051 1581 2.1333333333343749e+01 2052 2052 6.4000000000291664e+01 2052 1358 -5.3333333333124999e+00 2052 1099 -1.1000665323307010e-27 2052 2262 -2.1333333333291666e+01 2052 2053 1.5999999999979167e+01 2052 1098 1.1213657767716683e-27 2052 1094 -2.1333333333291666e+01 2052 1097 2.1333333333343749e+01 2052 1367 1.0416666666666666e-10 2052 2303 -2.1333333333291666e+01 2052 1361 -5.3333333333124999e+00 2052 2050 -1.5999999999979167e+01 2052 1368 1.0666666666677083e+01 2053 2053 6.4000000000416662e+01 2053 1097 5.3333333333958333e+00 2053 1099 5.3333333333333330e+00 2053 1581 5.3333333333958333e+00 2053 1588 5.3333333333333330e+00 2053 1367 5.3333333333124999e+00 2053 1587 -5.3333333333124999e+00 2053 2243 1.5999999999979167e+01 2053 1352 5.3333333333124999e+00 2053 1358 -5.3333333333958333e+00 2053 2051 1.5999999999979167e+01 2053 1368 -5.3333333333333330e+00 2053 2052 1.5999999999979167e+01 2053 2262 -1.5999999999979167e+01 2053 1094 -5.3333333333124999e+00 2053 415 5.3333333333124999e+00 2053 394 -5.3333333333124999e+00 2053 771 1.5999999999979167e+01 2053 404 5.3333333333124999e+00 2053 420 -5.3333333333958333e+00 2053 770 -1.5999999999979167e+01 2053 413 -5.3333333333333330e+00 2053 922 1.5999999999979167e+01 2053 924 1.5999999999979167e+01 2053 474 -5.3333333333124999e+00 2054 2054 6.4000000000291664e+01 2054 1581 5.3333333333124999e+00 2054 1120 -1.3020149240672800e-27 2054 2049 2.1333333333291666e+01 2054 2050 -1.5999999999979167e+01 2054 1128 1.3233141685082473e-27 2054 1121 2.1333333333291666e+01 2054 1127 -2.1333333333343749e+01 2054 1582 -1.0416666666666666e-10 2054 2055 -2.1333333333291666e+01 2054 2222 -1.5999999999979167e+01 2054 1584 5.3333333333124999e+00 2054 1596 -1.0666666666677083e+01 2055 2055 6.4000000000291664e+01 2055 1597 -1.5039633158038590e-27 2055 2056 -2.1333333333291666e+01 2055 1129 5.3333333333124999e+00 2055 2223 1.5999999999979167e+01 2055 1121 -1.0416666666666666e-10 2055 1127 5.3333333333124999e+00 2055 1128 -1.0666666666677083e+01 2055 1596 1.1213657767716683e-27 2055 2054 -2.1333333333291666e+01 2055 2222 1.5999999999979167e+01 2055 1582 2.1333333333291666e+01 2055 1584 -2.1333333333343749e+01 2056 2056 6.4000000000291664e+01 2056 1137 1.1000665323307010e-27 2056 1584 5.3333333333124999e+00 2056 1128 -1.3233141685082473e-27 2056 1121 2.1333333333291666e+01 2056 1129 -2.1333333333343749e+01 2056 2055 -2.1333333333291666e+01 2056 2223 -1.5999999999979167e+01 2056 1582 -1.0416666666666666e-10 2056 2057 -2.1333333333291666e+01 2056 2285 -1.5999999999979167e+01 2056 1595 5.3333333333124999e+00 2056 1597 -1.0666666666677083e+01 2057 2057 6.4000000000291664e+01 2057 1580 -1.1000665323307010e-27 2057 2045 2.1333333333291666e+01 2057 1119 5.3333333333124999e+00 2057 2047 -1.5999999999979167e+01 2057 1121 -1.0416666666666666e-10 2057 1129 5.3333333333124999e+00 2057 1137 -1.0666666666677083e+01 2057 1597 1.5039633158038590e-27 2057 2056 -2.1333333333291666e+01 2057 2285 1.5999999999979167e+01 2057 1582 2.1333333333291666e+01 2057 1595 -2.1333333333343749e+01 2058 2058 4.2666666666916662e+01 2058 2063 2.1333333333312499e+01 2058 1606 -5.3333333333229165e+00 2058 1602 6.2499999999999991e-11 2058 1237 6.2499999999999991e-11 2058 2059 -2.1333333333312499e+01 2058 1240 -5.3333333333229165e+00 2058 3790 -5.3333333333229165e+00 2058 4846 -1.0666666666666666e+01 2058 3824 -5.3333333333229165e+00 2058 3823 1.0666666666687499e+01 2058 4482 -1.0666666666666666e+01 2058 3789 1.0666666666687499e+01 2059 2059 6.4000000000416662e+01 2059 1241 -5.3333333333124999e+00 2059 2058 -2.1333333333312499e+01 2059 1237 -1.0666666666583334e+01 2059 1240 2.1333333333312499e+01 2059 2061 2.1333333333312499e+01 2059 1602 -1.0666666666583334e+01 2059 3823 -5.3333333333124999e+00 2059 4482 1.0666666666583334e+01 2059 3789 -5.3333333333124999e+00 2059 4477 1.0666666666583334e+01 2059 3824 2.1333333333312499e+01 2059 3826 -5.3333333333124999e+00 2060 2060 6.4000000000416662e+01 2060 2065 2.1333333333312499e+01 2060 1241 -5.3333333333124999e+00 2060 1240 2.1333333333312499e+01 2060 3727 -5.3333333333124999e+00 2060 4477 1.0666666666583334e+01 2060 3788 -1.0666666666583334e+01 2060 3789 -5.3333333333124999e+00 2060 4457 -2.1333333333312499e+01 2060 4482 1.0666666666583334e+01 2060 3726 -1.0666666666583334e+01 2060 3728 2.1333333333312499e+01 2060 3739 -5.3333333333124999e+00 2061 2061 4.2666666666916662e+01 2061 1240 5.3333333333229165e+00 2061 1607 5.3333333333229165e+00 2061 1237 -6.2499999999999991e-11 2061 2039 2.1333333333312499e+01 2061 2035 -1.0666666666666666e+01 2061 1232 5.3333333333229165e+00 2061 1241 -1.0666666666687499e+01 2061 1602 -6.2499999999999991e-11 2061 2059 2.1333333333312499e+01 2061 4477 1.0666666666666666e+01 2061 3824 5.3333333333229165e+00 2061 3826 -1.0666666666687499e+01 2062 2062 4.2666666666916662e+01 2062 1606 5.3333333333229165e+00 2062 1602 -6.2499999999999991e-11 2062 1604 -1.0666666666687499e+01 2062 1603 5.3333333333229165e+00 2062 2064 -2.1333333333312499e+01 2062 2128 -1.0666666666666666e+01 2062 1244 5.3333333333229165e+00 2062 1237 -6.2499999999999991e-11 2062 2063 -2.1333333333312499e+01 2062 2069 -1.0666666666666666e+01 2062 1236 -1.0666666666687499e+01 2062 3790 5.3333333333229165e+00 2063 2063 6.4000000000416662e+01 2063 1604 5.3333333333124999e+00 2063 2058 2.1333333333312499e+01 2063 1602 1.0666666666583334e+01 2063 1606 -2.1333333333312499e+01 2063 2062 -2.1333333333312499e+01 2063 2069 1.0666666666583334e+01 2063 1237 1.0666666666583334e+01 2063 1236 5.3333333333124999e+00 2063 3789 5.3333333333124999e+00 2063 4846 -1.0666666666583334e+01 2063 3823 5.3333333333124999e+00 2063 3790 -2.1333333333312499e+01 2064 2064 5.3333333333749991e+01 2064 1232 -3.6295685768920020e-28 2064 1607 1.8812360437258079e-27 2064 2039 1.0666666666562499e+01 2064 2036 -1.0666666666666666e+01 2064 1602 1.0666666666572917e+01 2064 1604 5.3333333333124999e+00 2064 1603 -1.5999999999989583e+01 2064 2062 -2.1333333333312499e+01 2064 2128 1.0666666666583334e+01 2064 1237 1.0666666666572917e+01 2064 1236 5.3333333333124999e+00 2064 1244 -1.5999999999989583e+01 2065 2065 4.2666666666916662e+01 2065 1242 5.3333333333229165e+00 2065 2066 -2.1333333333312499e+01 2065 2060 2.1333333333312499e+01 2065 1240 5.3333333333229165e+00 2065 1241 -1.0666666666687499e+01 2065 4475 1.0666666666666666e+01 2065 3746 5.3333333333229165e+00 2065 3726 -6.2500000000000004e-11 2065 3728 5.3333333333229165e+00 2065 3727 -1.0666666666687499e+01 2065 3788 -6.2500000000000004e-11 2065 4477 1.0666666666666666e+01 2066 2066 6.4000000000416662e+01 2066 2067 -2.1333333333312499e+01 2066 1243 5.3333333333124999e+00 2066 1242 -2.1333333333312499e+01 2066 1241 5.3333333333124999e+00 2066 2065 -2.1333333333312499e+01 2066 3743 5.3333333333124999e+00 2066 4893 -1.0666666666583334e+01 2066 3788 1.0666666666583334e+01 2066 4475 -1.0666666666583334e+01 2066 3726 1.0666666666583334e+01 2066 3746 -2.1333333333312499e+01 2066 3727 5.3333333333124999e+00 2067 2067 4.2666666666916662e+01 2067 2066 -2.1333333333312499e+01 2067 1242 5.3333333333229165e+00 2067 1243 -1.0666666666687499e+01 2067 3746 5.3333333333229165e+00 2067 4893 1.0666666666666666e+01 2067 3788 -6.2500000000000004e-11 2067 3792 5.3333333333229165e+00 2067 3726 -6.2500000000000004e-11 2067 4458 2.1333333333312499e+01 2067 4888 1.0666666666666666e+01 2067 3742 5.3333333333229165e+00 2067 3743 -1.0666666666687499e+01 2068 2068 6.4000000000416662e+01 2068 1599 -5.3333333333124999e+00 2068 2070 2.1333333333312499e+01 2068 2069 -1.0666666666583334e+01 2068 1604 -5.3333333333124999e+00 2068 1606 2.1333333333312499e+01 2068 3823 -5.3333333333124999e+00 2068 4848 -2.1333333333312499e+01 2068 4846 1.0666666666583334e+01 2068 4255 2.1333333333312499e+01 2068 4241 -5.3333333333124999e+00 2069 2069 6.4000000000583327e+01 2069 1602 1.0416666666666666e-11 2069 1606 -6.2499999999999991e-11 2069 1604 4.1666666666666665e-11 2069 2068 -1.0666666666583334e+01 2069 2070 -1.0666666666666666e+01 2069 1598 5.3333333333229165e+00 2069 1599 -1.5999999999958334e+01 2069 1774 3.2000000000020833e+01 2069 1773 -2.1333333333208333e+01 2069 1237 1.0416666666666666e-11 2069 1236 -5.3333333332916668e+00 2069 2063 1.0666666666583334e+01 2069 2062 -1.0666666666666666e+01 2069 4255 1.0666666666625000e+01 2069 3783 5.3333333332812494e+00 2069 3790 -1.0416666666666667e-10 2070 2070 4.2666666666916662e+01 2070 2326 1.0666666666666666e+01 2070 1599 -1.0666666666687499e+01 2070 2068 2.1333333333312499e+01 2070 2069 -1.0666666666666666e+01 2070 1606 5.3333333333229165e+00 2070 1604 -1.0666666666687499e+01 2070 4255 5.3333333333229165e+00 2071 2071 3.2000000000208331e+01 2072 2072 4.2666666666999994e+01 2072 2123 -1.0666666666666666e+01 2072 1607 -4.0939925783957852e-29 2072 1603 -1.0666666666729165e+01 2072 2038 2.1333333333291666e+01 2072 2036 -1.0666666666666666e+01 2072 1566 1.0666666666625000e+01 2072 1570 -1.0666666666729165e+01 2073 2073 4.2666666666916669e+01 2074 2074 4.2666666667333331e+01 2074 1573 -1.0416666666666666e-11 2074 1578 6.2499999999999991e-11 2074 2078 1.0666666666583334e+01 2074 1233 -1.0416666666666666e-11 2074 2043 -1.0666666666583334e+01 2074 2040 1.0666666666666666e+01 2074 1238 6.2499999999999991e-11 2074 1243 -4.1666666666666665e-11 2074 1468 6.2499999999999991e-11 2074 2076 -1.0666666666583334e+01 2074 2075 -1.0666666666666666e+01 2074 1438 6.2499999999999991e-11 2074 1950 -1.0666666666583334e+01 2074 4380 -4.1666666666666665e-11 2074 4891 -1.0666666666666666e+01 2074 3975 -1.0416666666666666e-11 2074 3791 -1.0416666666666666e-11 2074 3968 -1.0416666666666666e-11 2074 3969 -4.1666666666666665e-11 2074 3950 -1.0416666666666666e-11 2074 3953 -4.1666666666666665e-11 2074 4615 -1.0666666666666666e+01 2075 2075 4.2666666666916662e+01 2075 1238 -5.3333333333229165e+00 2075 2076 2.1333333333312499e+01 2075 2074 -1.0666666666666666e+01 2075 1468 -5.3333333333229165e+00 2075 1243 1.0666666666687499e+01 2075 3968 6.2499999999999991e-11 2075 3967 -5.3333333333229165e+00 2075 3969 1.0666666666687499e+01 2075 3791 6.2499999999999991e-11 2075 4887 -2.1333333333312499e+01 2075 4888 -1.0666666666666666e+01 2075 3792 -5.3333333333229165e+00 2076 2076 5.3333333333749998e+01 2076 1471 1.8812360437258079e-27 2076 1243 5.3333333333124999e+00 2076 2075 2.1333333333312499e+01 2076 2074 -1.0666666666583334e+01 2076 1468 -1.5999999999989583e+01 2076 1230 1.8812360437258079e-27 2076 1803 1.0666666666562499e+01 2076 1802 -1.0666666666666666e+01 2076 1238 -1.5999999999989583e+01 2076 3968 1.0666666666572917e+01 2076 3969 5.3333333333124999e+00 2076 3791 1.0666666666572915e+01 2077 2077 8.5333333333833338e+01 2077 1445 5.3333333333229165e+00 2077 1230 5.3333333332812494e+00 2077 1802 3.2000000000020833e+01 2077 1808 -2.1333333333208333e+01 2077 1438 2.1333333333312499e+01 2077 1442 5.3333333333229165e+00 2077 1443 -3.1999999999958334e+01 2077 1238 -1.4583333333333335e-10 2077 2021 3.2000000000020833e+01 2077 2020 -2.1333333333208333e+01 2077 1231 5.3333333332812494e+00 2077 1239 -1.0666666666625000e+01 2078 2078 7.4666666667125000e+01 2078 1575 -5.3333333332812494e+00 2078 2026 -2.1333333333291666e+01 2078 2021 1.0666666666583334e+01 2078 1445 -5.3333333333229165e+00 2078 1438 3.2000000000000000e+01 2078 2074 1.0666666666583334e+01 2078 1578 2.1333333333333332e+01 2078 3953 -5.3333333333124999e+00 2078 4891 -2.1333333333312499e+01 2078 4380 -5.3333333333124999e+00 2079 2079 4.2666666666916669e+01 2080 2080 4.2666666666916662e+01 2080 2081 -1.0666666666666666e+01 2080 1200 -5.3333333333229165e+00 2080 1192 1.0666666666687499e+01 2080 1997 -2.1333333333312499e+01 2080 1996 1.0666666666666666e+01 2080 1515 -5.3333333333229165e+00 2080 1516 1.0666666666687499e+01 2081 2081 4.2666666667333331e+01 2081 1192 -4.1666666666666665e-11 2081 2080 -1.0666666666666666e+01 2081 1742 1.0666666666666666e+01 2081 1181 -4.1666666666666665e-11 2081 1625 -4.1666666666666665e-11 2081 2086 -1.0666666666666666e+01 2081 1516 -4.1666666666666665e-11 2081 2082 -1.0666666666666666e+01 2082 2082 4.2666666666916662e+01 2082 2011 1.0666666666666666e+01 2082 1625 1.0666666666687499e+01 2082 2081 -1.0666666666666666e+01 2082 1516 1.0666666666687499e+01 2083 2083 4.2666666667333331e+01 2083 1164 -1.0416666666666666e-11 2083 1534 -1.0416666666666666e-11 2083 1543 6.2499999999999991e-11 2083 1546 -4.1666666666666665e-11 2083 2103 1.0666666666583334e+01 2083 2087 -1.0666666666666666e+01 2083 1175 -1.0416666666666666e-11 2083 1182 6.2499999999999991e-11 2083 1181 -4.1666666666666665e-11 2083 2101 1.0666666666583334e+01 2083 2086 -1.0666666666666666e+01 2083 1150 -1.0416666666666666e-11 2083 1161 6.2499999999999991e-11 2083 1159 -4.1666666666666665e-11 2083 1748 -1.0666666666583334e+01 2083 1747 1.0666666666666666e+01 2083 1623 6.2499999999999991e-11 2083 1625 -4.1666666666666665e-11 2083 2102 1.0666666666583334e+01 2083 2084 -1.0666666666666666e+01 2084 2084 4.2666666666916662e+01 2084 1543 -5.3333333333229165e+00 2084 2011 1.0666666666666666e+01 2084 1546 1.0666666666687499e+01 2084 2102 -2.1333333333312499e+01 2084 2083 -1.0666666666666666e+01 2084 1623 -5.3333333333229165e+00 2084 1625 1.0666666666687499e+01 2085 2085 4.2666666666916662e+01 2085 1212 -5.3333333333229165e+00 2085 1998 -2.1333333333312499e+01 2085 1996 1.0666666666666666e+01 2085 1200 -5.3333333333229165e+00 2085 1191 6.2500000000000004e-11 2085 1190 -5.3333333333229165e+00 2085 1192 1.0666666666687499e+01 2085 1220 6.2500000000000004e-11 2085 1737 -2.1333333333312499e+01 2085 1738 1.0666666666666666e+01 2085 1219 -5.3333333333229165e+00 2085 1214 1.0666666666687499e+01 2086 2086 4.2666666666916662e+01 2086 2081 -1.0666666666666666e+01 2086 1623 -5.3333333333229165e+00 2086 1625 1.0666666666687499e+01 2086 2101 -2.1333333333312499e+01 2086 2083 -1.0666666666666666e+01 2086 1182 -5.3333333333229165e+00 2086 1181 1.0666666666687499e+01 2087 2087 4.2666666666916662e+01 2087 1533 -5.3333333333229165e+00 2087 2002 -2.1333333333312499e+01 2087 2003 1.0666666666666666e+01 2087 1166 -5.3333333333229165e+00 2087 1164 6.2499999999999991e-11 2087 1161 -5.3333333333229165e+00 2087 1159 1.0666666666687499e+01 2087 1534 6.2499999999999991e-11 2087 2103 -2.1333333333312499e+01 2087 2083 -1.0666666666666666e+01 2087 1543 -5.3333333333229165e+00 2087 1546 1.0666666666687499e+01 2088 2088 6.4000000000416662e+01 2088 1217 5.3333333333124999e+00 2088 1196 5.3333333333124999e+00 2088 2090 -2.1333333333312499e+01 2088 2316 -1.0666666666583334e+01 2088 1220 1.0666666666583334e+01 2088 1227 -2.1333333333312499e+01 2088 1226 5.3333333333124999e+00 2088 1980 2.1333333333312499e+01 2088 1979 -1.0666666666583334e+01 2088 1191 1.0666666666583334e+01 2088 1195 -2.1333333333312499e+01 2088 1194 5.3333333333124999e+00 2089 2089 6.4000000000416662e+01 2089 1226 5.3333333333124999e+00 2089 2090 -2.1333333333312499e+01 2089 2099 1.0666666666583334e+01 2089 1196 5.3333333333124999e+00 2089 1191 1.0666666666583334e+01 2089 1202 -2.1333333333312499e+01 2089 1189 5.3333333333124999e+00 2089 1725 2.1333333333312499e+01 2089 1722 -1.0666666666583334e+01 2089 1220 1.0666666666583334e+01 2089 1224 -2.1333333333312499e+01 2089 1221 5.3333333333124999e+00 2090 2090 4.2666666666916662e+01 2090 1224 5.3333333333229165e+00 2090 2089 -2.1333333333312499e+01 2090 2099 -1.0666666666666666e+01 2090 1202 5.3333333333229165e+00 2090 1191 -6.2500000000000004e-11 2090 1195 5.3333333333229165e+00 2090 1196 -1.0666666666687499e+01 2090 1220 -6.2500000000000004e-11 2090 2088 -2.1333333333312499e+01 2090 2316 1.0666666666666666e+01 2090 1227 5.3333333333229165e+00 2090 1226 -1.0666666666687499e+01 2091 2091 3.2000000000208331e+01 2092 2092 3.2000000000208331e+01 2093 2093 6.4000000000416662e+01 2093 1210 -5.3333333333124999e+00 2093 1615 -5.3333333333124999e+00 2093 1734 -2.1333333333312499e+01 2093 1732 1.0666666666583334e+01 2093 1223 -1.0666666666583334e+01 2093 1222 2.1333333333312499e+01 2093 1221 -5.3333333333124999e+00 2093 1762 -2.1333333333312499e+01 2093 1761 1.0666666666583334e+01 2093 1612 -1.0666666666583334e+01 2093 1611 2.1333333333312499e+01 2093 1610 -5.3333333333124999e+00 2094 2094 6.4000000000416662e+01 2094 1282 -1.0666666666583334e+01 2094 1281 2.1333333333312499e+01 2094 1283 -5.3333333333124999e+00 2094 1732 1.0666666666583334e+01 2094 1620 -1.0666666666583334e+01 2094 1611 2.1333333333312499e+01 2094 1615 -5.3333333333124999e+00 2094 1610 -5.3333333333124999e+00 2094 1768 -2.1333333333312499e+01 2094 1761 1.0666666666583334e+01 2094 1276 -5.3333333333124999e+00 2094 1023 -2.1333333333312499e+01 2095 2095 4.2666666666916662e+01 2095 1228 5.3333333333229165e+00 2095 1616 5.3333333333229165e+00 2095 1223 -6.2499999999999991e-11 2095 2097 -2.1333333333312499e+01 2095 2099 -1.0666666666666666e+01 2095 1224 5.3333333333229165e+00 2095 1226 -1.0666666666687499e+01 2095 1612 -6.2499999999999991e-11 2095 2096 2.1333333333312499e+01 2095 2315 1.0666666666666666e+01 2095 1614 5.3333333333229165e+00 2095 1613 -1.0666666666687499e+01 2096 2096 6.4000000000416662e+01 2096 1612 -1.0666666666583334e+01 2096 1614 2.1333333333312499e+01 2096 1223 -1.0666666666583334e+01 2096 1228 2.1333333333312499e+01 2096 1226 -5.3333333333124999e+00 2096 2095 2.1333333333312499e+01 2096 2315 1.0666666666583334e+01 2096 1613 -5.3333333333124999e+00 2096 228 -5.3333333333124999e+00 2096 1075 -2.1333333333312499e+01 2096 816 -1.0666666666583334e+01 2096 4318 -5.3333333333124999e+00 2097 2097 6.4000000000416662e+01 2097 1613 5.3333333333124999e+00 2097 2095 -2.1333333333312499e+01 2097 2099 1.0666666666583334e+01 2097 1226 5.3333333333124999e+00 2097 1223 1.0666666666583334e+01 2097 1224 -2.1333333333312499e+01 2097 1221 5.3333333333124999e+00 2097 1734 2.1333333333312499e+01 2097 1722 -1.0666666666583334e+01 2097 1612 1.0666666666583334e+01 2097 1616 -2.1333333333312499e+01 2097 1615 5.3333333333124999e+00 2098 2098 6.4000000000416662e+01 2098 1146 -5.3333333333124999e+00 2098 2100 -2.1333333333312499e+01 2098 2099 -1.0666666666583334e+01 2098 1613 -5.3333333333124999e+00 2098 1617 -1.0666666666583334e+01 2098 1616 2.1333333333312499e+01 2098 1615 -5.3333333333124999e+00 2098 1723 -2.1333333333312499e+01 2098 1722 1.0666666666583334e+01 2098 1143 -1.0666666666583334e+01 2098 1142 2.1333333333312499e+01 2098 1139 -5.3333333333124999e+00 2099 2099 4.2666666667333331e+01 2099 1612 1.0416666666666666e-11 2099 1143 1.0416666666666666e-11 2099 1617 1.0416666666666666e-11 2099 1616 -6.2499999999999991e-11 2099 1613 4.1666666666666665e-11 2099 2098 -1.0666666666583334e+01 2099 2100 1.0666666666666666e+01 2099 1223 1.0416666666666666e-11 2099 2097 1.0666666666583334e+01 2099 2095 -1.0666666666666666e+01 2099 1220 1.0416666666666666e-11 2099 1224 -6.2499999999999991e-11 2099 1226 4.1666666666666665e-11 2099 1191 1.0416666666666666e-11 2099 1202 -6.2499999999999991e-11 2099 1196 4.1666666666666665e-11 2099 2089 1.0666666666583334e+01 2099 2090 -1.0666666666666666e+01 2099 1142 -6.2499999999999991e-11 2099 1146 4.1666666666666665e-11 2099 1755 1.0666666666583334e+01 2099 1754 -1.0666666666666666e+01 2100 2100 4.2666666666916662e+01 2100 1617 6.2500000000000004e-11 2100 1613 1.0666666666687499e+01 2100 1143 6.2500000000000004e-11 2100 1146 1.0666666666687499e+01 2100 1142 -5.3333333333229165e+00 2100 2098 -2.1333333333312499e+01 2100 2099 1.0666666666666666e+01 2100 1616 -5.3333333333229165e+00 2100 230 -5.3333333333229165e+00 2100 553 -2.1333333333312499e+01 2100 552 1.0666666666666666e+01 2100 100 -5.3333333333229165e+00 2101 2101 6.4000000000416662e+01 2101 1177 -5.3333333333124999e+00 2101 1625 -5.3333333333124999e+00 2101 2086 -2.1333333333312499e+01 2101 2083 1.0666666666583334e+01 2101 1182 2.1333333333312499e+01 2101 1181 -5.3333333333124999e+00 2101 1823 -2.1333333333312499e+01 2101 1822 1.0666666666583334e+01 2101 1623 2.1333333333312499e+01 2101 1622 -5.3333333333124999e+00 2102 2102 6.4000000000416662e+01 2102 1546 -5.3333333333124999e+00 2102 1622 -5.3333333333124999e+00 2102 1834 -2.1333333333312499e+01 2102 1822 1.0666666666583334e+01 2102 1543 2.1333333333312499e+01 2102 1542 -5.3333333333124999e+00 2102 2084 -2.1333333333312499e+01 2102 2083 1.0666666666583334e+01 2102 1623 2.1333333333312499e+01 2102 1625 -5.3333333333124999e+00 2103 2103 6.4000000000416662e+01 2103 1159 -5.3333333333124999e+00 2103 2087 -2.1333333333312499e+01 2103 2083 1.0666666666583334e+01 2103 1546 -5.3333333333124999e+00 2103 1534 -1.0666666666583334e+01 2103 1543 2.1333333333312499e+01 2103 1542 -5.3333333333124999e+00 2103 1833 -2.1333333333312499e+01 2103 1822 1.0666666666583334e+01 2103 1164 -1.0666666666583334e+01 2103 1161 2.1333333333312499e+01 2103 1157 -5.3333333333124999e+00 2104 2104 3.2000000000208331e+01 2105 2105 3.2000000000208331e+01 2106 2106 3.2000000000208331e+01 2107 2107 6.4000000000583327e+01 2107 1570 -5.3333333333229165e+00 2107 2123 3.2000000000020833e+01 2107 2109 -2.1333333333208333e+01 2107 1532 -5.3333333332812494e+00 2107 1538 5.3333333332916668e+00 2107 1636 -4.1666666666666665e-11 2107 2113 -1.0666666666666666e+01 2107 1567 1.5999999999958334e+01 2107 2108 -1.0666666666666666e+01 2108 2108 4.2666666666916662e+01 2108 2029 1.0666666666666666e+01 2108 1636 1.0666666666687499e+01 2108 2107 -1.0666666666666666e+01 2108 1567 1.0666666666687499e+01 2109 2109 6.4000000000916657e+01 2109 1232 -5.3333333332812494e+00 2109 1154 -1.0416666666666665e-11 2109 1235 -1.0416666666666668e-11 2109 1234 5.3333333332916668e+00 2109 1244 1.0416666666666667e-10 2109 1780 1.0666666666666666e+01 2109 1783 -1.0666666666583334e+01 2109 1534 -1.0416666666666665e-11 2109 1532 1.0416666666666667e-10 2109 2107 -2.1333333333208333e+01 2109 2123 -2.1333333333291666e+01 2109 1538 5.3333333332916668e+00 2109 1164 -1.0416666666666668e-11 2109 1162 -4.1666666666666665e-11 2109 1165 6.2500000000000004e-11 2109 2112 -1.0666666666666666e+01 2109 2121 -1.0666666666583334e+01 2109 1570 2.0833333333333339e-11 2109 2037 2.1333333333208333e+01 2109 2036 -2.1333333333291666e+01 2109 1566 5.3333333333020834e+00 2109 1567 -1.0666666666833333e+01 2110 2110 4.2666666667333331e+01 2110 1168 -1.0416666666666666e-11 2110 1551 -1.0416666666666666e-11 2110 1560 6.2499999999999991e-11 2110 1563 -4.1666666666666665e-11 2110 2118 1.0666666666583334e+01 2110 2114 -1.0666666666666666e+01 2110 1534 -1.0416666666666666e-11 2110 1539 6.2499999999999991e-11 2110 1538 -4.1666666666666665e-11 2110 2115 1.0666666666583334e+01 2110 2113 -1.0666666666666666e+01 2110 1164 -1.0416666666666666e-11 2110 1163 6.2499999999999991e-11 2110 1162 -4.1666666666666665e-11 2110 2117 1.0666666666583334e+01 2110 2112 -1.0666666666666666e+01 2110 1634 6.2499999999999991e-11 2110 1636 -4.1666666666666665e-11 2110 2116 1.0666666666583334e+01 2110 2111 -1.0666666666666666e+01 2111 2111 4.2666666666916662e+01 2111 1560 -5.3333333333229165e+00 2111 2029 1.0666666666666666e+01 2111 1563 1.0666666666687499e+01 2111 2116 -2.1333333333312499e+01 2111 2110 -1.0666666666666666e+01 2111 1634 -5.3333333333229165e+00 2111 1636 1.0666666666687499e+01 2112 2112 4.2666666666916662e+01 2112 1532 -5.3333333333229165e+00 2112 2121 2.1333333333312499e+01 2112 2109 -1.0666666666666666e+01 2112 1165 -5.3333333333229165e+00 2112 1534 6.2499999999999991e-11 2112 1539 -5.3333333333229165e+00 2112 1538 1.0666666666687499e+01 2112 1164 6.2499999999999991e-11 2112 2117 -2.1333333333312499e+01 2112 2110 -1.0666666666666666e+01 2112 1163 -5.3333333333229165e+00 2112 1162 1.0666666666687499e+01 2113 2113 4.2666666666916662e+01 2113 2107 -1.0666666666666666e+01 2113 1634 -5.3333333333229165e+00 2113 1636 1.0666666666687499e+01 2113 2115 -2.1333333333312499e+01 2113 2110 -1.0666666666666666e+01 2113 1539 -5.3333333333229165e+00 2113 1538 1.0666666666687499e+01 2114 2114 4.2666666666916662e+01 2114 1550 -5.3333333333229165e+00 2114 2018 -2.1333333333312499e+01 2114 2019 1.0666666666666666e+01 2114 1170 -5.3333333333229165e+00 2114 1168 6.2499999999999991e-11 2114 1163 -5.3333333333229165e+00 2114 1162 1.0666666666687499e+01 2114 1551 6.2500000000000004e-11 2114 2118 -2.1333333333312499e+01 2114 2110 -1.0666666666666666e+01 2114 1560 -5.3333333333229165e+00 2114 1563 1.0666666666687499e+01 2115 2115 6.4000000000416662e+01 2115 1542 -5.3333333333124999e+00 2115 1636 -5.3333333333124999e+00 2115 2113 -2.1333333333312499e+01 2115 2110 1.0666666666583334e+01 2115 1539 2.1333333333312499e+01 2115 1538 -5.3333333333124999e+00 2115 1827 -2.1333333333312499e+01 2115 1826 1.0666666666583334e+01 2115 1634 2.1333333333312499e+01 2115 1633 -5.3333333333124999e+00 2116 2116 6.4000000000416662e+01 2116 1563 -5.3333333333124999e+00 2116 1633 -5.3333333333124999e+00 2116 1836 -2.1333333333312499e+01 2116 1826 1.0666666666583334e+01 2116 1560 2.1333333333312499e+01 2116 1559 -5.3333333333124999e+00 2116 2111 -2.1333333333312499e+01 2116 2110 1.0666666666583334e+01 2116 1634 2.1333333333312499e+01 2116 1636 -5.3333333333124999e+00 2117 2117 6.4000000000416662e+01 2117 1157 -5.3333333333124999e+00 2117 1833 -2.1333333333312499e+01 2117 1826 1.0666666666583334e+01 2117 1542 -5.3333333333124999e+00 2117 1534 -1.0666666666583334e+01 2117 1539 2.1333333333312499e+01 2117 1538 -5.3333333333124999e+00 2117 2112 -2.1333333333312499e+01 2117 2110 1.0666666666583334e+01 2117 1164 -1.0666666666583334e+01 2117 1163 2.1333333333312499e+01 2117 1162 -5.3333333333124999e+00 2118 2118 6.4000000000416662e+01 2118 1162 -5.3333333333124999e+00 2118 2114 -2.1333333333312499e+01 2118 2110 1.0666666666583334e+01 2118 1563 -5.3333333333124999e+00 2118 1551 -1.0666666666583334e+01 2118 1560 2.1333333333312499e+01 2118 1559 -5.3333333333124999e+00 2118 1835 -2.1333333333312499e+01 2118 1826 1.0666666666583334e+01 2118 1168 -1.0666666666583334e+01 2118 1163 2.1333333333312499e+01 2118 1157 -5.3333333333124999e+00 2119 2119 3.2000000000208331e+01 2120 2120 3.2000000000208331e+01 2121 2121 5.3333333333749998e+01 2121 1166 -3.6295685768920020e-28 2121 1538 5.3333333333124999e+00 2121 2112 2.1333333333312499e+01 2121 2109 -1.0666666666583334e+01 2121 1164 1.0666666666572917e+01 2121 1162 5.3333333333124999e+00 2121 1165 -1.5999999999989583e+01 2121 1533 1.8812360437258079e-27 2121 2002 1.0666666666562499e+01 2121 2001 -1.0666666666666666e+01 2121 1534 1.0666666666572915e+01 2121 1532 -1.5999999999989583e+01 2122 2122 3.2000000000208331e+01 2123 2123 5.3333333333750005e+01 2123 1603 6.2499999999999991e-11 2123 2072 -1.0666666666666666e+01 2123 2129 1.0666666666666666e+01 2123 1567 1.0666666666625000e+01 2123 1570 -5.3333333333437496e+00 2123 1538 6.0691943799667649e-29 2123 2107 3.2000000000020833e+01 2123 2109 -2.1333333333291666e+01 2123 1532 -5.3333333333229165e+00 2124 2124 2.1333333333541667e+01 2125 2125 3.2000000000208331e+01 2126 2126 3.2000000000208331e+01 2127 2127 3.2000000000208331e+01 2128 2128 6.4000000000916643e+01 2128 1211 -5.3333333333020834e+00 2128 1532 -1.0416666666666667e-10 2128 2004 -2.1333333333208333e+01 2128 2001 2.1333333333291666e+01 2128 1533 5.3333333332812494e+00 2128 1547 -5.3333333332916668e+00 2128 1602 1.0416666666666665e-11 2128 1237 1.0416666666666668e-11 2128 1236 -5.3333333332916668e+00 2128 1244 -1.0416666666666667e-10 2128 2062 -1.0666666666666666e+01 2128 2064 1.0666666666583334e+01 2128 1225 -2.0833333333333339e-11 2128 1773 -2.1333333333208333e+01 2128 1772 2.1333333333291666e+01 2128 1216 1.0666666666833333e+01 2128 1604 4.1666666666666665e-11 2128 1603 -6.2499999999999991e-11 2128 2325 1.0666666666666666e+01 2128 2129 -1.0666666666583334e+01 2128 3783 5.3333333332812494e+00 2128 4320 -5.3333333333020834e+00 2129 2129 5.3333333333749991e+01 2129 1547 -5.3333333333124999e+00 2129 2123 1.0666666666666666e+01 2129 1532 1.5999999999989583e+01 2129 2325 -2.1333333333312499e+01 2129 2128 -1.0666666666583334e+01 2129 1604 -5.3333333333124999e+00 2129 1603 1.5999999999989583e+01 2130 2130 6.4091666666666669e+01 2130 1254 -1.0416666666666664e-02 2130 1789 -2.1320833333333333e+01 2130 1793 2.1329166666666669e+01 2130 1255 -5.3291666666666666e+00 2130 1505 1.0416666666666664e-03 2130 1450 1.0416666666666667e-03 2130 1448 -5.3291666666666666e+00 2130 1455 -1.0416666666666666e-02 2130 2140 1.0666666666666666e+01 2130 2135 -1.0658333333333333e+01 2130 1250 -2.0833333333333337e-03 2130 2143 2.1320833333333333e+01 2130 2134 -2.1329166666666666e+01 2130 1249 1.0683333333333334e+01 2130 1500 4.1666666666666657e-03 2130 1499 -6.2499999999999995e-03 2130 2142 1.0666666666666666e+01 2130 2131 -1.0658333333333333e+01 2130 4288 -5.3302083333333332e+00 2130 4021 5.3281250000000000e+00 2130 2835 5.3281250000000000e+00 2130 2837 -5.3302083333333332e+00 2131 2131 5.3375000000000000e+01 2131 1255 -5.3312499999999998e+00 2131 2136 -1.0666666666666666e+01 2131 1254 1.5998958333333333e+01 2131 2142 -2.1331249999999997e+01 2131 2130 -1.0658333333333333e+01 2131 1500 -5.3312499999999998e+00 2131 1499 1.5998958333333331e+01 2132 2132 5.3374999999999993e+01 2132 2133 -1.0658333333333333e+01 2132 1647 1.5998958333333331e+01 2132 1793 1.0666666666666666e+01 2132 1254 1.5998958333333333e+01 2132 3964 -5.0116116045879435e-20 2132 4015 -5.3312499999999998e+00 2132 4595 -2.1331249999999997e+01 2132 3962 -1.0657291666666666e+01 2132 3956 -5.3312499999999998e+00 2132 4021 -2.1705219273391446e-19 2132 4654 -1.0656249999999998e+01 2132 4018 -1.0657291666666666e+01 2133 2133 6.4091666666666669e+01 2133 1451 5.3281250000000000e+00 2133 1646 1.0416666666666664e-03 2133 1458 1.0416666666666667e-03 2133 1456 -5.3291666666666666e+00 2133 1455 -1.0416666666666666e-02 2133 2193 1.0666666666666666e+01 2133 2138 -1.0658333333333333e+01 2133 1254 -1.0416666666666664e-02 2133 2136 -2.1329166666666669e+01 2133 1647 -6.2499999999999995e-03 2133 2132 -1.0658333333333333e+01 2133 1439 -2.0833333333333337e-03 2133 1930 -2.1320833333333333e+01 2133 1928 2.1329166666666666e+01 2133 1434 -5.3302083333333332e+00 2133 4018 1.0416666666666664e-03 2133 4588 2.1320833333333333e+01 2133 4015 -5.3291666666666666e+00 2133 3962 1.0416666666666667e-03 2133 3956 4.1666666666666657e-03 2133 4595 1.0666666666666666e+01 2133 3948 1.0683333333333334e+01 2134 2134 5.3375000000000021e+01 2134 1648 5.3281250000000000e+00 2134 1458 -2.1684043449710089e-19 2134 1646 -4.9904357809065860e-20 2134 1647 -6.2499999999999995e-03 2134 2138 -1.0666666666666666e+01 2134 2137 -1.0666666666666668e+01 2134 1251 -5.3302083333333332e+00 2134 1448 -2.1684043449710089e-19 2134 1455 5.3322916666666664e+00 2134 2143 -3.2002083333333331e+01 2134 2130 -2.1329166666666666e+01 2134 1249 -1.0662500000000000e+01 2134 1250 5.3343749999999996e+00 2134 2823 -5.3322916666666664e+00 2134 3386 1.0666666666666666e+01 2134 3392 1.0658333333333331e+01 2134 2835 -5.3322916666666664e+00 2134 2837 1.0679166666666665e+01 2135 2135 5.3374999999999993e+01 2135 1451 -5.0116116045879435e-20 2135 1509 -2.1705219273391446e-19 2135 1931 -1.0656249999999998e+01 2135 1928 1.0666666666666666e+01 2135 1505 -1.0657291666666666e+01 2135 1500 -5.3312499999999998e+00 2135 1499 1.5998958333333331e+01 2135 2140 -2.1331249999999997e+01 2135 2130 -1.0658333333333333e+01 2135 1450 -1.0657291666666666e+01 2135 1448 -5.3312499999999998e+00 2135 1455 1.5998958333333331e+01 2136 2136 5.3375000000000000e+01 2136 2133 -2.1329166666666669e+01 2136 1439 5.3343749999999996e+00 2136 1499 -6.2499999999999995e-03 2136 1976 1.0666666666666664e+01 2136 1254 5.3322916666666664e+00 2136 2131 -1.0666666666666666e+01 2136 3948 -1.0662500000000000e+01 2136 4015 -1.4973071994693204e-20 2136 4588 -3.2002083333333331e+01 2137 2137 4.2699999999999996e+01 2137 2134 -1.0666666666666668e+01 2137 1251 1.0683333333333334e+01 2137 1250 1.0672916666666666e+01 2137 1793 1.0666666666666664e+01 2137 1648 -1.0662500000000000e+01 2137 1647 1.0672916666666666e+01 2137 2823 -4.0939925783957855e-21 2137 3392 -2.1329166666666666e+01 2137 2837 -1.0662500000000000e+01 2137 4288 -1.0662500000000000e+01 2137 3964 -1.6284208410963924e-19 2137 4958 -2.1329166666666666e+01 2138 2138 5.3375000000000000e+01 2138 2193 -2.1331249999999997e+01 2138 2133 -1.0658333333333333e+01 2138 1456 -5.3312499999999998e+00 2138 1458 -1.0657291666666666e+01 2138 1455 1.5998958333333333e+01 2138 2134 -1.0666666666666666e+01 2138 1646 -1.0657291666666666e+01 2138 1647 1.5998958333333333e+01 2138 3956 -5.3312499999999998e+00 2138 2835 -5.0116116045879435e-20 2138 2823 -2.1705219273391446e-19 2138 3386 -1.0656249999999998e+01 2139 2139 6.4058333333333337e+01 2139 1505 -1.0416666666666669e-03 2139 1510 6.2500000000000003e-03 2139 1500 -4.1666666666666666e-03 2139 2155 1.0658333333333333e+01 2139 2144 -1.0666666666666666e+01 2139 1081 -1.0662499999999998e+01 2139 1083 -5.3322916666666664e+00 2139 1085 1.5995833333333334e+01 2139 2153 -3.2002083333333331e+01 2139 2143 -2.1320833333333333e+01 2139 1450 -1.0416666666666667e-03 2139 1449 1.0416666666666666e-02 2139 1448 5.3291666666666666e+00 2139 2146 -1.0658333333333333e+01 2139 2140 -1.0666666666666666e+01 2139 2835 -5.3281250000000000e+00 2140 2140 4.2691666666666663e+01 2140 1510 -5.3322916666666664e+00 2140 1505 6.2499999999999995e-03 2140 1500 1.0668750000000001e+01 2140 1499 -5.3322916666666664e+00 2140 2135 -2.1331249999999997e+01 2140 2130 1.0666666666666666e+01 2140 1455 -5.3322916666666664e+00 2140 1450 6.2499999999999995e-03 2140 2146 2.1331249999999997e+01 2140 2139 -1.0666666666666666e+01 2140 1449 -5.3322916666666664e+00 2140 1448 1.0668750000000001e+01 2141 2141 8.5383333333333340e+01 2141 1087 -5.3322916666666664e+00 2141 2150 -3.2002083333333331e+01 2141 2143 -2.1320833333333333e+01 2141 1083 -5.3322916666666664e+00 2141 1085 3.1995833333333334e+01 2141 1790 -3.2002083333333331e+01 2141 1789 2.1320833333333333e+01 2141 1249 1.0662500000000000e+01 2141 2837 -5.3281250000000000e+00 2141 4288 -5.3281250000000000e+00 2142 2142 4.2691666666666663e+01 2142 1254 -5.3322916666666664e+00 2142 1255 1.0668750000000001e+01 2142 2145 -1.0666666666666666e+01 2142 2131 -2.1331249999999997e+01 2142 2130 1.0666666666666666e+01 2142 1500 1.0668750000000001e+01 2142 1499 -5.3322916666666664e+00 2143 2143 8.5416666666666671e+01 2143 1081 5.3302083333333332e+00 2143 1083 2.0833333333333342e-03 2143 2150 2.1329166666666666e+01 2143 2141 -2.1320833333333333e+01 2143 1085 -1.0683333333333334e+01 2143 2153 2.1329166666666669e+01 2143 2139 -2.1320833333333333e+01 2143 1449 -5.3281250000000000e+00 2143 1448 1.0662500000000000e+01 2143 1455 -5.3281250000000000e+00 2143 2134 -3.2002083333333331e+01 2143 2130 2.1320833333333333e+01 2143 1249 2.1329166666666666e+01 2143 1250 -5.3322916666666664e+00 2143 2835 1.4583333333333330e-02 2143 2837 -1.0658333333333331e+01 2144 2144 4.2691666666666663e+01 2144 2145 -1.0666666666666666e+01 2144 1081 -5.3322916666666664e+00 2144 1085 1.0668750000000001e+01 2144 2155 -2.1331249999999997e+01 2144 2139 -1.0666666666666666e+01 2144 1510 -5.3322916666666664e+00 2144 1500 1.0668750000000001e+01 2145 2145 6.4058333333333323e+01 2145 1791 -3.2002083333333331e+01 2145 1789 2.1320833333333333e+01 2145 1087 -5.3322916666666664e+00 2145 1255 5.3291666666666666e+00 2145 1500 -4.1666666666666666e-03 2145 2142 -1.0666666666666666e+01 2145 1085 1.5995833333333334e+01 2145 2144 -1.0666666666666666e+01 2145 4021 -5.3281250000000000e+00 2146 2146 6.4020833333541660e+01 2146 1131 -5.3333333333124999e+00 2146 1453 5.3333333333124999e+00 2146 2157 1.5999999999979167e+01 2146 1136 -5.3333333333124999e+00 2146 1135 5.3333333333958333e+00 2146 2149 -1.5999999999979167e+01 2146 1134 5.3333333333333330e+00 2146 2148 -1.5999999999979167e+01 2146 2158 1.5999999999979167e+01 2146 1504 5.3333333333124999e+00 2146 1505 2.6624999999687500e+00 2146 1510 -1.3332291666666665e+01 2146 1500 5.3312499999999998e+00 2146 2140 2.1331249999999997e+01 2146 2139 -1.0658333333333333e+01 2146 1450 2.6624999999687500e+00 2146 1449 -1.3332291666666665e+01 2146 1448 5.3312499999999998e+00 2147 2147 6.4000000000416662e+01 2147 1136 -5.3333333333124999e+00 2147 1504 5.3333333333124999e+00 2147 2308 1.5999999999979167e+01 2147 1131 -5.3333333333124999e+00 2147 1129 5.3333333333958333e+00 2147 2148 -1.5999999999979167e+01 2147 1134 5.3333333333333330e+00 2147 2149 -1.5999999999979167e+01 2147 2309 1.5999999999979167e+01 2147 1453 5.3333333333124999e+00 2147 1482 -5.3333333333124999e+00 2147 1452 5.3333333333124999e+00 2147 1450 -5.3333333333958333e+00 2147 1461 -5.3333333333333330e+00 2147 1944 -1.5999999999979167e+01 2147 1475 -5.3333333333124999e+00 2147 1497 5.3333333333958333e+00 2147 1941 1.5999999999979167e+01 2147 1498 5.3333333333333330e+00 2147 1974 1.5999999999979167e+01 2147 1973 -1.5999999999979167e+01 2147 1506 5.3333333333124999e+00 2147 1505 -5.3333333333958333e+00 2147 1502 -5.3333333333333330e+00 2148 2148 6.4000000000291664e+01 2148 1502 1.5039633158038590e-27 2148 2308 -2.1333333333291666e+01 2148 1129 -5.3333333333124999e+00 2148 2147 -1.5999999999979167e+01 2148 1131 1.0416666666666666e-10 2148 1135 -5.3333333333124999e+00 2148 1134 1.0666666666677083e+01 2148 1510 -1.1213657767716683e-27 2148 2158 -2.1333333333291666e+01 2148 2146 -1.5999999999979167e+01 2148 1504 -2.1333333333291666e+01 2148 1505 2.1333333333343749e+01 2149 2149 6.4000000000291664e+01 2149 1129 -5.3333333333124999e+00 2149 1461 -1.3020149240672800e-27 2149 2309 -2.1333333333291666e+01 2149 2147 -1.5999999999979167e+01 2149 1449 1.1000665323307010e-27 2149 1453 -2.1333333333291666e+01 2149 1450 2.1333333333343749e+01 2149 1136 1.0416666666666666e-10 2149 2157 -2.1333333333291666e+01 2149 1135 -5.3333333333124999e+00 2149 2146 -1.5999999999979167e+01 2149 1134 1.0666666666677083e+01 2150 2150 5.3375000000000000e+01 2150 1249 -2.7052114752934217e-20 2150 2141 -3.2002083333333331e+01 2150 2143 2.1329166666666666e+01 2150 1085 -1.0662500000000000e+01 2150 1083 5.3343749999999996e+00 2150 1107 -6.2499999999999986e-03 2150 1713 1.0666666666666664e+01 2150 2151 -1.0666666666666666e+01 2150 2837 5.3322916666666664e+00 2151 2151 4.2708333333333329e+01 2151 1107 1.0666666666666666e+01 2151 2150 -1.0666666666666666e+01 2151 3391 -1.0666666666666666e+01 2151 2837 1.0666666666666666e+01 2152 2152 4.2708333333333329e+01 2152 1112 -2.1705219273391446e-19 2152 1449 5.0116116045879435e-20 2152 1106 2.1705219273391446e-19 2152 1101 -1.0656249999999998e+01 2152 1107 1.0666666666666666e+01 2152 2156 -1.0656249999999998e+01 2152 2153 -1.0666666666666666e+01 2152 1446 -2.1705219273391446e-19 2152 2159 -1.0656249999999998e+01 2152 1447 -1.0656249999999998e+01 2152 3388 -1.0666666666666666e+01 2152 2835 1.0666666666666666e+01 2153 2153 5.3375000000000000e+01 2153 1085 -1.0662500000000000e+01 2153 1448 2.1158177161623045e-20 2153 2139 -3.2002083333333331e+01 2153 2143 2.1329166666666669e+01 2153 1447 -2.1684043449710089e-19 2153 1449 -5.3322916666666664e+00 2153 1101 2.1684043449710089e-19 2153 1107 -6.2499999999999986e-03 2153 1106 -5.3322916666666664e+00 2153 2152 -1.0666666666666666e+01 2153 2156 1.0666666666666666e+01 2153 1083 5.3343749999999996e+00 2153 1714 -1.0658333333333331e+01 2153 1713 1.0666666666666668e+01 2153 1081 1.0679166666666665e+01 2153 2835 5.3322916666666664e+00 2154 2154 4.2699999999999996e+01 2154 1645 -1.0662500000000000e+01 2154 1112 1.6284208410963924e-19 2154 2165 -2.1329166666666666e+01 2154 1107 1.0672916666666666e+01 2154 3388 -1.0666666666666664e+01 2154 3391 -1.0666666666666668e+01 2154 2813 1.0672916666666666e+01 2155 2155 6.4020833333541660e+01 2155 1118 5.3333333333124999e+00 2155 1504 -5.3333333333124999e+00 2155 2158 -1.5999999999979167e+01 2155 1131 5.3333333333124999e+00 2155 1135 -5.3333333333958333e+00 2155 2168 1.5999999999979167e+01 2155 1132 -5.3333333333333330e+00 2155 1085 -5.3312499999999998e+00 2155 2144 -2.1331249999999997e+01 2155 2139 1.0658333333333333e+01 2155 1510 1.3332291666666665e+01 2155 1500 -5.3312499999999998e+00 2155 1719 -1.5999999999979167e+01 2155 1718 1.5999999999979167e+01 2155 1078 -5.3333333333124999e+00 2155 1081 1.3332291666666665e+01 2156 2156 5.3354166666875003e+01 2156 1136 5.3333333333124999e+00 2156 1102 -5.3333333333124999e+00 2156 1711 1.5999999999979167e+01 2156 1116 5.3333333333124999e+00 2156 1135 -5.3333333333958333e+00 2156 1709 -1.5999999999979167e+01 2156 1138 -5.3333333333333330e+00 2156 1107 5.0116116045879435e-20 2156 2152 -1.0656249999999998e+01 2156 1101 -2.6614583333020834e+00 2156 2153 1.0666666666666666e+01 2156 1106 8.0000000000000000e+00 2156 2160 1.5999999999979167e+01 2156 2157 -1.5999999999979167e+01 2156 1453 -5.3333333333124999e+00 2156 1447 -2.6614583333020829e+00 2156 1449 8.0000000000000000e+00 2156 2835 2.1705219273391446e-19 2157 2157 6.4000000000291664e+01 2157 1138 -1.5039633158038590e-27 2157 1450 -5.3333333333124999e+00 2157 1134 1.1000665323307010e-27 2157 1136 -2.1333333333291666e+01 2157 1135 2.1333333333343749e+01 2157 2149 -2.1333333333291666e+01 2157 2146 1.5999999999979167e+01 2157 1453 1.0416666666666666e-10 2157 2160 -2.1333333333291666e+01 2157 2156 -1.5999999999979167e+01 2157 1447 -5.3333333333124999e+00 2157 1449 1.0666666666677083e+01 2158 2158 6.4000000000291664e+01 2158 1132 1.3020149240672800e-27 2158 2168 -2.1333333333291666e+01 2158 2155 -1.5999999999979167e+01 2158 1134 -1.3233141685082473e-27 2158 1131 -2.1333333333291666e+01 2158 1135 2.1333333333343749e+01 2158 1504 1.0416666666666666e-10 2158 2148 -2.1333333333291666e+01 2158 2146 1.5999999999979167e+01 2158 1505 -5.3333333333124999e+00 2158 1510 1.0666666666677083e+01 2159 2159 5.3354166666875003e+01 2159 1447 -2.6614583333020834e+00 2159 1446 8.0000000000000000e+00 2159 1101 -2.6614583333020834e+00 2159 1112 8.0000000000000000e+00 2159 1107 -2.1705219273391446e-19 2159 2152 -1.0656249999999998e+01 2159 332 5.3333333333124999e+00 2159 428 -5.3333333333124999e+00 2159 781 -1.5999999999979167e+01 2159 331 5.3333333333124999e+00 2159 330 -5.3333333333958333e+00 2159 784 1.5999999999979167e+01 2159 329 -5.3333333333333330e+00 2159 783 1.5999999999979167e+01 2159 782 -1.5999999999979167e+01 2159 433 -5.3333333333124999e+00 2159 2835 -2.1705219273391446e-19 2159 3388 1.0666666666666666e+01 2160 2160 6.4000000000291664e+01 2160 1135 -5.3333333333124999e+00 2160 1462 1.3233141685082473e-27 2160 1136 1.0416666666666666e-10 2160 2048 -2.1333333333291666e+01 2160 1119 -5.3333333333124999e+00 2160 2046 1.5999999999979167e+01 2160 1138 1.0666666666677083e+01 2160 1449 -1.1000665323307010e-27 2160 2157 -2.1333333333291666e+01 2160 2156 1.5999999999979167e+01 2160 1453 -2.1333333333291666e+01 2160 1447 2.1333333333343749e+01 2161 2161 2.1354166666666668e+01 2162 2162 4.2691666666666663e+01 2163 2163 2.1354166666666668e+01 2164 2164 4.2691666666666663e+01 2165 2165 7.4691666666874994e+01 2165 1112 1.3334375000000000e+01 2165 1645 2.4001041666666666e+01 2165 2154 -2.1329166666666666e+01 2165 1107 -5.3281250000000000e+00 2165 328 5.3333333333124999e+00 2165 433 -5.3333333333124999e+00 2165 782 -1.5999999999979167e+01 2165 332 5.3333333333124999e+00 2165 330 -5.3333333333958333e+00 2165 791 -1.5999999999979167e+01 2165 333 -5.3333333333333330e+00 2165 733 -1.5999999999979167e+01 2165 732 1.5999999999979167e+01 2165 148 -5.3333333333124999e+00 2165 2813 -5.3322916666666664e+00 2165 3388 1.0658333333333331e+01 2166 2166 3.2020833333333336e+01 2167 2167 3.2000000000208331e+01 2168 2168 6.4000000000291664e+01 2168 1510 1.1213657767716683e-27 2168 2158 -2.1333333333291666e+01 2168 1135 -5.3333333333124999e+00 2168 2155 1.5999999999979167e+01 2168 1131 1.0416666666666666e-10 2168 1123 -5.3333333333124999e+00 2168 1132 1.0666666666677083e+01 2168 2291 -2.1333333333291666e+01 2168 1504 -2.1333333333291666e+01 2169 2169 3.2020833333333336e+01 2170 2170 4.2691666666666663e+01 2171 2171 2.1354166666666668e+01 2172 2172 6.4000000000583327e+01 2172 1378 -5.3333333333229165e+00 2172 2184 3.2000000000020833e+01 2172 2174 -2.1333333333208333e+01 2172 1549 -5.3333333332812494e+00 2172 1555 5.3333333332916668e+00 2172 1301 -4.1666666666666665e-11 2172 2178 -1.0666666666666666e+01 2172 1375 1.5999999999958334e+01 2172 2173 -1.0666666666666666e+01 2173 2173 4.2666666666916662e+01 2173 2176 -1.0666666666666666e+01 2173 1301 1.0666666666687499e+01 2173 2172 -1.0666666666666666e+01 2173 1375 1.0666666666687499e+01 2174 2174 6.4000000000916657e+01 2174 1267 -5.3333333332812494e+00 2174 1156 -1.0416666666666665e-11 2174 1277 -1.0416666666666668e-11 2174 1280 5.3333333332916668e+00 2174 1279 1.0416666666666667e-10 2174 1813 1.0666666666666666e+01 2174 1812 -1.0666666666583334e+01 2174 1551 -1.0416666666666665e-11 2174 1549 1.0416666666666667e-10 2174 2172 -2.1333333333208333e+01 2174 2184 -2.1333333333291666e+01 2174 1555 5.3333333332916668e+00 2174 1168 -1.0416666666666668e-11 2174 1167 -4.1666666666666665e-11 2174 1169 6.2500000000000004e-11 2174 2177 -1.0666666666666666e+01 2174 2182 -1.0666666666583334e+01 2174 1378 2.0833333333333339e-11 2174 1904 2.1333333333208333e+01 2174 1903 -2.1333333333291666e+01 2174 1373 5.3333333333020834e+00 2174 1375 -1.0666666666833333e+01 2175 2175 4.2666666667333331e+01 2175 1175 -1.0416666666666666e-11 2175 1186 6.2499999999999991e-11 2175 1185 -4.1666666666666665e-11 2175 2195 1.0666666666583334e+01 2175 2179 -1.0666666666666666e+01 2175 1150 -1.0416666666666666e-11 2175 1750 -1.0666666666583334e+01 2175 1749 1.0666666666666666e+01 2175 1278 -1.0416666666666666e-11 2175 1156 -1.0416666666666666e-11 2175 1171 6.2499999999999991e-11 2175 1167 -4.1666666666666665e-11 2175 1277 -1.0416666666666666e-11 2175 1284 6.2499999999999991e-11 2175 1280 -4.1666666666666665e-11 2175 1815 -1.0666666666583334e+01 2175 1813 1.0666666666666666e+01 2175 1421 -1.0416666666666666e-11 2175 1420 6.2499999999999991e-11 2175 1419 -4.1666666666666665e-11 2175 1912 -1.0666666666583334e+01 2175 1911 1.0666666666666666e+01 2176 2176 4.2666666667333331e+01 2176 1301 -4.1666666666666665e-11 2176 2173 -1.0666666666666666e+01 2176 1841 1.0666666666666666e+01 2176 1185 -4.1666666666666665e-11 2176 1419 -4.1666666666666665e-11 2176 2179 -1.0666666666666666e+01 2176 1375 -4.1666666666666665e-11 2176 1924 1.0666666666666666e+01 2177 2177 4.2666666666916662e+01 2177 1549 -5.3333333333229165e+00 2177 2182 2.1333333333312499e+01 2177 2174 -1.0666666666666666e+01 2177 1169 -5.3333333333229165e+00 2177 1551 6.2499999999999991e-11 2177 1556 -5.3333333333229165e+00 2177 1555 1.0666666666687499e+01 2177 1168 6.2499999999999991e-11 2177 1840 -2.1333333333312499e+01 2177 1838 1.0666666666666666e+01 2177 1158 -5.3333333333229165e+00 2177 1167 1.0666666666687499e+01 2178 2178 4.2666666666916662e+01 2178 2172 -1.0666666666666666e+01 2178 1299 -5.3333333333229165e+00 2178 1301 1.0666666666687499e+01 2178 1837 -2.1333333333312499e+01 2178 1838 1.0666666666666666e+01 2178 1556 -5.3333333333229165e+00 2178 1555 1.0666666666687499e+01 2179 2179 4.2666666666916662e+01 2179 2176 -1.0666666666666666e+01 2179 1420 -5.3333333333229165e+00 2179 1419 1.0666666666687499e+01 2179 2195 -2.1333333333312499e+01 2179 2175 -1.0666666666666666e+01 2179 1186 -5.3333333333229165e+00 2179 1185 1.0666666666687499e+01 2180 2180 3.2000000000208331e+01 2181 2181 3.2000000000208331e+01 2182 2182 5.3333333333749998e+01 2182 1170 -3.6295685768920020e-28 2182 1555 5.3333333333124999e+00 2182 2177 2.1333333333312499e+01 2182 2174 -1.0666666666583334e+01 2182 1168 1.0666666666572917e+01 2182 1167 5.3333333333124999e+00 2182 1169 -1.5999999999989583e+01 2182 1550 1.8812360437258079e-27 2182 2018 1.0666666666562499e+01 2182 2017 -1.0666666666666666e+01 2182 1551 1.0666666666572915e+01 2182 1549 -1.5999999999989583e+01 2183 2183 3.2000000000208331e+01 2184 2184 5.3333333333750005e+01 2184 1654 6.2499999999999991e-11 2184 2189 1.0666666666666666e+01 2184 2191 1.0666666666666666e+01 2184 1375 1.0666666666625000e+01 2184 1378 -5.3333333333437496e+00 2184 1555 4.6458872727282566e-28 2184 2172 3.2000000000020833e+01 2184 2174 -2.1333333333291666e+01 2184 1549 -5.3333333333229165e+00 2185 2185 2.1333333333541667e+01 2186 2186 4.2666666666916669e+01 2187 2187 3.2000000000208331e+01 2188 2188 3.2000000000208331e+01 2189 2189 4.2666666666999994e+01 2189 2184 1.0666666666666666e+01 2189 1662 -3.6295685768920020e-28 2189 1654 1.0666666666729165e+01 2189 1907 -2.1333333333291666e+01 2189 1903 1.0666666666666666e+01 2189 1373 -1.0666666666625000e+01 2189 1378 1.0666666666729165e+01 2190 2190 6.4000000000916643e+01 2190 1231 -5.3333333333020834e+00 2190 1549 -1.0416666666666667e-10 2190 2020 -2.1333333333208333e+01 2190 2017 2.1333333333291666e+01 2190 1550 5.3333333332812494e+00 2190 1564 -5.3333333332916668e+00 2190 1273 5.3333333332812494e+00 2190 1652 1.0416666666666665e-11 2190 1268 1.0416666666666668e-11 2190 1275 -5.3333333332916668e+00 2190 1279 -1.0416666666666667e-10 2190 2274 -1.0666666666666666e+01 2190 2192 -1.0666666666583334e+01 2190 1245 -2.0833333333333339e-11 2190 1808 -2.1333333333208333e+01 2190 1807 2.1333333333291666e+01 2190 1230 -5.3333333333020834e+00 2190 1239 1.0666666666833333e+01 2190 1655 4.1666666666666665e-11 2190 1654 -6.2500000000000004e-11 2190 2328 1.0666666666666666e+01 2190 2191 -1.0666666666583334e+01 2191 2191 5.3333333333749991e+01 2191 1564 -5.3333333333124999e+00 2191 2184 1.0666666666666666e+01 2191 1549 1.5999999999989583e+01 2191 2328 -2.1333333333312499e+01 2191 2190 -1.0666666666583334e+01 2191 1655 -5.3333333333124999e+00 2191 1654 1.5999999999989583e+01 2192 2192 5.3333333333749991e+01 2192 1267 3.6295685768920020e-28 2192 1662 -1.8812360437258079e-27 2192 1905 -1.0666666666562499e+01 2192 1903 1.0666666666666666e+01 2192 1652 -1.0666666666572917e+01 2192 1655 -5.3333333333124999e+00 2192 1654 1.5999999999989583e+01 2192 2274 2.1333333333312499e+01 2192 2190 -1.0666666666583334e+01 2192 1268 -1.0666666666572917e+01 2192 1275 -5.3333333333124999e+00 2192 1279 1.5999999999989583e+01 2193 2193 4.2691666666666663e+01 2193 1647 -5.3322916666666664e+00 2193 2138 -2.1331249999999997e+01 2193 2133 1.0666666666666666e+01 2193 1455 -5.3322916666666664e+00 2193 1646 6.2499999999999995e-03 2193 1458 6.2499999999999995e-03 2193 2194 -2.1331249999999997e+01 2193 1457 -5.3322916666666664e+00 2193 1456 1.0668750000000001e+01 2193 3957 -5.3322916666666664e+00 2193 3956 1.0668750000000001e+01 2193 4592 -1.0666666666666666e+01 2194 2194 6.4041666666666671e+01 2194 1458 -1.0658333333333333e+01 2194 1457 2.1331249999999997e+01 2194 1646 -1.0658333333333333e+01 2194 2193 -2.1331249999999997e+01 2194 1456 -5.3312499999999998e+00 2194 431 -5.3312499999999998e+00 2194 1013 -2.1331249999999997e+01 2194 4597 1.0658333333333333e+01 2194 3957 2.1331249999999997e+01 2194 491 -5.3312499999999998e+00 2194 3956 -5.3312499999999998e+00 2194 4592 1.0658333333333333e+01 2195 2195 6.4000000000416662e+01 2195 1172 -5.3333333333124999e+00 2195 1419 -5.3333333333124999e+00 2195 2179 -2.1333333333312499e+01 2195 2175 1.0666666666583334e+01 2195 1186 2.1333333333312499e+01 2195 1185 -5.3333333333124999e+00 2195 1729 -2.1333333333312499e+01 2195 1728 1.0666666666583334e+01 2195 1420 2.1333333333312499e+01 2195 1422 -5.3333333333124999e+00 2196 2196 6.4000000000416662e+01 2196 1144 1.3333333333322916e+01 2196 1429 1.3333333333322916e+01 2196 1422 -5.3333333333124999e+00 2196 1727 -2.1333333333312499e+01 2196 1726 1.0666666666583334e+01 2196 1139 -5.3333333333124999e+00 2196 382 5.3333333333124999e+00 2196 105 -5.3333333333124999e+00 2196 756 1.5999999999979167e+01 2196 371 5.3333333333124999e+00 2196 373 -5.3333333333958333e+00 2196 758 -1.5999999999979167e+01 2196 383 -5.3333333333333330e+00 2196 1056 -1.5999999999979167e+01 2196 1027 -1.5999999999979167e+01 2196 492 -5.3333333333124999e+00 2197 2197 3.2000000000208331e+01 2198 2198 3.2000000000208331e+01 2199 2199 6.4000000000291664e+01 2199 1413 -1.1213657767716683e-27 2199 1404 1.5039633158038590e-27 2199 1406 -2.1333333333291666e+01 2199 1405 2.1333333333343749e+01 2199 2205 -2.1333333333291666e+01 2199 1321 1.0416666666666666e-10 2199 1859 -2.1333333333291666e+01 2200 2200 3.2000000000208331e+01 2201 2201 6.4000000000291664e+01 2201 1408 1.1000665323307010e-27 2201 2211 2.1333333333291666e+01 2201 1404 -1.3020149240672800e-27 2201 1407 -2.1333333333291666e+01 2201 1405 2.1333333333343749e+01 2201 1653 1.0416666666666666e-10 2201 2204 -2.1333333333291666e+01 2202 2202 6.4000000000416662e+01 2202 1406 -5.3333333333124999e+00 2202 1653 5.3333333333124999e+00 2202 2209 -1.5999999999979167e+01 2202 1407 -5.3333333333124999e+00 2202 1409 5.3333333333958333e+00 2202 2204 -1.5999999999979167e+01 2202 1404 5.3333333333333330e+00 2202 2205 -1.5999999999979167e+01 2202 2206 -1.5999999999979167e+01 2202 1321 5.3333333333124999e+00 2202 1488 -5.3333333333124999e+00 2202 1318 5.3333333333124999e+00 2202 1328 -5.3333333333333330e+00 2202 1970 -1.5999999999979167e+01 2202 1481 -5.3333333333124999e+00 2202 1485 5.3333333333958333e+00 2202 1969 1.5999999999979167e+01 2202 1487 5.3333333333333330e+00 2202 2203 -1.5999999999979167e+01 2202 2212 1.5999999999979167e+01 2202 1651 5.3333333333124999e+00 2202 1649 -5.3333333333333330e+00 2203 2203 6.4000000000291664e+01 2203 1962 -2.1333333333291666e+01 2203 1480 -5.3333333333124999e+00 2203 1488 1.0416666666666666e-10 2203 1485 -5.3333333333124999e+00 2203 1487 1.0666666666677083e+01 2203 1649 -1.1000665323307010e-27 2203 2212 -2.1333333333291666e+01 2203 2202 -1.5999999999979167e+01 2203 1651 -2.1333333333291666e+01 2204 2204 6.4000000000291664e+01 2204 1649 1.1213657767716683e-27 2204 2209 2.1333333333291666e+01 2204 1409 -5.3333333333124999e+00 2204 2202 -1.5999999999979167e+01 2204 1407 1.0416666666666666e-10 2204 1405 -5.3333333333124999e+00 2204 1404 1.0666666666677083e+01 2204 2201 -2.1333333333291666e+01 2204 1653 -2.1333333333291666e+01 2205 2205 6.4000000000291664e+01 2205 1409 -5.3333333333124999e+00 2205 1328 -1.1000665323307010e-27 2205 2206 2.1333333333291666e+01 2205 2202 -1.5999999999979167e+01 2205 1321 -2.1333333333291666e+01 2205 1406 1.0416666666666666e-10 2205 2199 -2.1333333333291666e+01 2205 1405 -5.3333333333124999e+00 2205 1404 1.0666666666677083e+01 2206 2206 6.4000000000291664e+01 2206 1329 5.3333333333124999e+00 2206 1410 -1.1000665323307010e-27 2206 2207 -2.1333333333291666e+01 2206 2213 1.5999999999979167e+01 2206 1404 1.5039633158038590e-27 2206 1406 2.1333333333291666e+01 2206 1409 -2.1333333333343749e+01 2206 1321 -1.0416666666666666e-10 2206 2205 2.1333333333291666e+01 2206 2202 -1.5999999999979167e+01 2206 1328 -1.0666666666677083e+01 2207 2207 6.4000000000291664e+01 2207 1412 5.3333333333124999e+00 2207 1330 1.3020149240672800e-27 2207 2208 -2.1333333333291666e+01 2207 2220 1.5999999999979167e+01 2207 1328 -1.1000665323307010e-27 2207 1321 2.1333333333291666e+01 2207 1329 -2.1333333333343749e+01 2207 1406 -1.0416666666666666e-10 2207 2206 -2.1333333333291666e+01 2207 1409 5.3333333333124999e+00 2207 2213 -1.5999999999979167e+01 2207 1410 -1.0666666666677083e+01 2208 2208 6.4000000000291664e+01 2208 1413 -1.1213657767716683e-27 2208 1859 2.1333333333291666e+01 2208 1856 -1.5999999999979167e+01 2208 1410 1.1000665323307010e-27 2208 1406 2.1333333333291666e+01 2208 1412 -2.1333333333343749e+01 2208 1321 -1.0416666666666666e-10 2208 2207 -2.1333333333291666e+01 2208 2220 -1.5999999999979167e+01 2208 1329 5.3333333333124999e+00 2208 1330 -1.0666666666677083e+01 2209 2209 6.4000000000291664e+01 2209 1417 1.3233141685082473e-27 2209 1404 -1.3020149240672800e-27 2209 1407 2.1333333333291666e+01 2209 1409 -2.1333333333343749e+01 2209 2204 2.1333333333291666e+01 2209 2202 -1.5999999999979167e+01 2209 1653 -1.0416666666666666e-10 2209 2210 -2.1333333333291666e+01 2209 2215 1.5999999999979167e+01 2209 1652 5.3333333333124999e+00 2209 1649 -1.0666666666677083e+01 2210 2210 6.4000000000291664e+01 2210 1662 -1.5039633158038590e-27 2210 1910 2.1333333333291666e+01 2210 1400 5.3333333333124999e+00 2210 1905 -1.5999999999979167e+01 2210 1407 -1.0416666666666666e-10 2210 1409 5.3333333333124999e+00 2210 1417 -1.0666666666677083e+01 2210 1649 1.1213657767716683e-27 2210 2209 -2.1333333333291666e+01 2210 2215 -1.5999999999979167e+01 2210 1653 2.1333333333291666e+01 2210 1652 -2.1333333333343749e+01 2211 2211 6.4000000000291664e+01 2211 1400 5.3333333333124999e+00 2211 1662 1.5039633158038590e-27 2211 1910 2.1333333333291666e+01 2211 1907 -1.5999999999979167e+01 2211 1653 2.1333333333291666e+01 2211 1407 -1.0416666666666666e-10 2211 2201 2.1333333333291666e+01 2211 1405 5.3333333333124999e+00 2211 1408 -1.0666666666677083e+01 2212 2212 6.4000000000291664e+01 2212 1652 -5.3333333333124999e+00 2212 1490 1.1000665323307010e-27 2212 2232 2.1333333333291666e+01 2212 2215 -1.5999999999979167e+01 2212 1487 -1.5039633158038590e-27 2212 1488 -2.1333333333291666e+01 2212 1485 2.1333333333343749e+01 2212 1651 1.0416666666666666e-10 2212 2203 -2.1333333333291666e+01 2212 2202 1.5999999999979167e+01 2212 1649 1.0666666666677083e+01 2213 2213 6.4000000000416662e+01 2213 1411 5.3333333333124999e+00 2213 1321 -5.3333333333124999e+00 2213 2206 1.5999999999979167e+01 2213 1406 5.3333333333124999e+00 2213 1409 -5.3333333333958333e+00 2213 2207 -1.5999999999979167e+01 2213 1410 -5.3333333333333330e+00 2213 1481 5.3333333333124999e+00 2213 1592 -5.3333333333124999e+00 2213 2217 -1.5999999999979167e+01 2213 1486 5.3333333333124999e+00 2213 1485 -5.3333333333958333e+00 2213 2224 1.5999999999979167e+01 2213 1484 -5.3333333333333330e+00 2213 1971 -1.5999999999979167e+01 2213 1970 1.5999999999979167e+01 2213 1318 -5.3333333333124999e+00 2213 1329 5.3333333333958333e+00 2213 1328 5.3333333333333330e+00 2213 2219 1.5999999999979167e+01 2213 2214 -1.5999999999979167e+01 2213 1585 -5.3333333333124999e+00 2213 1584 5.3333333333958333e+00 2213 1583 5.3333333333333330e+00 2214 2214 6.4000000000291664e+01 2214 1591 -5.3333333333124999e+00 2214 1416 1.3020149240672800e-27 2214 2239 2.1333333333291666e+01 2214 2216 -1.5999999999979167e+01 2214 1410 -1.3233141685082473e-27 2214 1411 -2.1333333333291666e+01 2214 1409 2.1333333333343749e+01 2214 1585 1.0416666666666666e-10 2214 2219 -2.1333333333291666e+01 2214 2213 -1.5999999999979167e+01 2214 1584 -5.3333333333124999e+00 2214 1583 1.0666666666677083e+01 2215 2215 6.4000000000416662e+01 2215 1492 5.3333333333124999e+00 2215 1651 -5.3333333333124999e+00 2215 2212 -1.5999999999979167e+01 2215 1488 5.3333333333124999e+00 2215 1485 -5.3333333333958333e+00 2215 2232 -1.5999999999979167e+01 2215 1490 -5.3333333333333330e+00 2215 2275 1.5999999999979167e+01 2215 2218 -1.5999999999979167e+01 2215 1272 -5.3333333333124999e+00 2215 1407 5.3333333333124999e+00 2215 1269 -5.3333333333124999e+00 2215 1268 5.3333333333958333e+00 2215 1288 5.3333333333333330e+00 2215 1920 1.5999999999979167e+01 2215 1401 5.3333333333124999e+00 2215 1409 -5.3333333333958333e+00 2215 1917 -1.5999999999979167e+01 2215 1417 -5.3333333333333330e+00 2215 2210 -1.5999999999979167e+01 2215 2209 1.5999999999979167e+01 2215 1653 -5.3333333333124999e+00 2215 1652 5.3333333333958333e+00 2215 1649 5.3333333333333330e+00 2216 2216 6.4000000000416662e+01 2216 1486 5.3333333333124999e+00 2216 1272 -5.3333333333124999e+00 2216 2218 -1.5999999999979167e+01 2216 1492 5.3333333333124999e+00 2216 1485 -5.3333333333958333e+00 2216 2268 1.5999999999979167e+01 2216 1493 -5.3333333333333330e+00 2216 1401 5.3333333333124999e+00 2216 1585 -5.3333333333124999e+00 2216 2214 -1.5999999999979167e+01 2216 1411 5.3333333333124999e+00 2216 1409 -5.3333333333958333e+00 2216 2239 -1.5999999999979167e+01 2216 1416 -5.3333333333333330e+00 2216 1919 -1.5999999999979167e+01 2216 1920 1.5999999999979167e+01 2216 1269 -5.3333333333124999e+00 2216 1287 5.3333333333958333e+00 2216 1288 5.3333333333333330e+00 2216 2226 -1.5999999999979167e+01 2216 2217 -1.5999999999979167e+01 2216 1592 -5.3333333333124999e+00 2216 1591 5.3333333333958333e+00 2216 1583 5.3333333333333330e+00 2217 2217 6.4000000000291664e+01 2217 1493 -1.5039633158038590e-27 2217 1584 -5.3333333333124999e+00 2217 1484 1.1000665323307010e-27 2217 1486 -2.1333333333291666e+01 2217 1485 2.1333333333343749e+01 2217 2224 -2.1333333333291666e+01 2217 2213 -1.5999999999979167e+01 2217 1592 1.0416666666666666e-10 2217 2226 2.1333333333291666e+01 2217 2216 -1.5999999999979167e+01 2217 1591 -5.3333333333124999e+00 2217 1583 1.0666666666677083e+01 2218 2218 6.4000000000291664e+01 2218 1287 -5.3333333333124999e+00 2218 1493 1.3020149240672800e-27 2218 2268 -2.1333333333291666e+01 2218 2216 -1.5999999999979167e+01 2218 1490 -1.3233141685082473e-27 2218 1492 -2.1333333333291666e+01 2218 1485 2.1333333333343749e+01 2218 1272 1.0416666666666666e-10 2218 2275 -2.1333333333291666e+01 2218 2215 -1.5999999999979167e+01 2218 1268 -5.3333333333124999e+00 2218 1288 1.0666666666677083e+01 2219 2219 6.4000000000291664e+01 2219 1586 1.5039633158038590e-27 2219 2236 2.1333333333291666e+01 2219 1412 -5.3333333333124999e+00 2219 2220 -1.5999999999979167e+01 2219 1411 1.0416666666666666e-10 2219 1409 -5.3333333333124999e+00 2219 1410 1.0666666666677083e+01 2219 1583 -1.1213657767716683e-27 2219 2214 -2.1333333333291666e+01 2219 2213 1.5999999999979167e+01 2219 1585 -2.1333333333291666e+01 2219 1584 2.1333333333343749e+01 2220 2220 6.4000000000416662e+01 2220 1352 -5.3333333333124999e+00 2220 1324 5.3333333333124999e+00 2220 1863 -1.5999999999979167e+01 2220 1346 -5.3333333333124999e+00 2220 1350 5.3333333333958333e+00 2220 1864 1.5999999999979167e+01 2220 1351 5.3333333333333330e+00 2220 1406 -5.3333333333124999e+00 2220 1585 5.3333333333124999e+00 2220 2236 -1.5999999999979167e+01 2220 1411 -5.3333333333124999e+00 2220 1412 5.3333333333958333e+00 2220 2219 -1.5999999999979167e+01 2220 1410 5.3333333333333330e+00 2220 2207 1.5999999999979167e+01 2220 2208 -1.5999999999979167e+01 2220 1321 5.3333333333124999e+00 2220 1329 -5.3333333333958333e+00 2220 1330 -5.3333333333333330e+00 2220 2221 -1.5999999999979167e+01 2220 2240 1.5999999999979167e+01 2220 1587 5.3333333333124999e+00 2220 1584 -5.3333333333958333e+00 2220 1586 -5.3333333333333330e+00 2221 2221 6.4000000000291664e+01 2221 1596 1.1000665323307010e-27 2221 2245 2.1333333333291666e+01 2221 1361 -5.3333333333124999e+00 2221 2222 -1.5999999999979167e+01 2221 1352 1.0416666666666666e-10 2221 1350 -5.3333333333124999e+00 2221 1351 1.0666666666677083e+01 2221 1586 -1.3020149240672800e-27 2221 2240 -2.1333333333291666e+01 2221 2220 -1.5999999999979167e+01 2221 1587 -2.1333333333291666e+01 2221 1584 2.1333333333343749e+01 2222 2222 6.4000000000416662e+01 2222 1121 -5.3333333333124999e+00 2222 1327 5.3333333333124999e+00 2222 2296 -1.5999999999979167e+01 2222 1124 -5.3333333333124999e+00 2222 1127 5.3333333333958333e+00 2222 2225 -1.5999999999979167e+01 2222 1128 5.3333333333333330e+00 2222 1346 -5.3333333333124999e+00 2222 1587 5.3333333333124999e+00 2222 2245 -1.5999999999979167e+01 2222 1352 -5.3333333333124999e+00 2222 1361 5.3333333333958333e+00 2222 2221 -1.5999999999979167e+01 2222 1351 5.3333333333333330e+00 2222 1864 1.5999999999979167e+01 2222 1865 -1.5999999999979167e+01 2222 1324 5.3333333333124999e+00 2222 1329 -5.3333333333958333e+00 2222 1331 -5.3333333333333330e+00 2222 2055 1.5999999999979167e+01 2222 2054 -1.5999999999979167e+01 2222 1582 5.3333333333124999e+00 2222 1584 -5.3333333333958333e+00 2222 1596 -5.3333333333333330e+00 2223 2223 6.4000000000416662e+01 2223 1486 -5.3333333333124999e+00 2223 1318 5.3333333333124999e+00 2223 1972 -1.5999999999979167e+01 2223 1481 -5.3333333333124999e+00 2223 1497 5.3333333333958333e+00 2223 1971 1.5999999999979167e+01 2223 1484 5.3333333333333330e+00 2223 1124 -5.3333333333124999e+00 2223 1582 5.3333333333124999e+00 2223 2056 -1.5999999999979167e+01 2223 1121 -5.3333333333124999e+00 2223 1129 5.3333333333958333e+00 2223 2055 1.5999999999979167e+01 2223 1128 5.3333333333333330e+00 2223 2225 -1.5999999999979167e+01 2223 2297 -1.5999999999979167e+01 2223 1327 5.3333333333124999e+00 2223 1329 -5.3333333333958333e+00 2223 1332 -5.3333333333333330e+00 2223 2224 -1.5999999999979167e+01 2223 2229 -1.5999999999979167e+01 2223 1592 5.3333333333124999e+00 2223 1584 -5.3333333333958333e+00 2223 1597 -5.3333333333333330e+00 2224 2224 6.4000000000291664e+01 2224 1497 -5.3333333333124999e+00 2224 1583 1.1000665323307010e-27 2224 1486 1.0416666666666666e-10 2224 2217 -2.1333333333291666e+01 2224 1485 -5.3333333333124999e+00 2224 2213 1.5999999999979167e+01 2224 1484 1.0666666666677083e+01 2224 1597 -1.3020149240672800e-27 2224 2229 2.1333333333291666e+01 2224 2223 -1.5999999999979167e+01 2224 1592 -2.1333333333291666e+01 2224 1584 2.1333333333343749e+01 2225 2225 6.4000000000291664e+01 2225 1129 -5.3333333333124999e+00 2225 1332 -1.3020149240672800e-27 2225 2297 2.1333333333291666e+01 2225 2223 -1.5999999999979167e+01 2225 1331 1.1000665323307010e-27 2225 1327 -2.1333333333291666e+01 2225 1329 2.1333333333343749e+01 2225 1124 1.0416666666666666e-10 2225 2296 2.1333333333291666e+01 2225 1127 -5.3333333333124999e+00 2225 2222 -1.5999999999979167e+01 2225 1128 1.0666666666677083e+01 2226 2226 6.4000000000291664e+01 2226 1593 -1.3233141685082473e-27 2226 2227 -2.1333333333291666e+01 2226 1494 5.3333333333124999e+00 2226 2266 1.5999999999979167e+01 2226 1486 -1.0416666666666666e-10 2226 1485 5.3333333333124999e+00 2226 1493 -1.0666666666677083e+01 2226 1583 1.1000665323307010e-27 2226 2217 2.1333333333291666e+01 2226 2216 -1.5999999999979167e+01 2226 1592 2.1333333333291666e+01 2226 1591 -2.1333333333343749e+01 2227 2227 6.4000000000291664e+01 2227 1496 1.1213657767716683e-27 2227 1591 5.3333333333124999e+00 2227 1493 -1.5039633158038590e-27 2227 1486 2.1333333333291666e+01 2227 1494 -2.1333333333343749e+01 2227 2226 -2.1333333333291666e+01 2227 2266 -1.5999999999979167e+01 2227 1592 -1.0416666666666666e-10 2227 2228 -2.1333333333291666e+01 2227 2280 1.5999999999979167e+01 2227 1595 5.3333333333124999e+00 2227 1593 -1.0666666666677083e+01 2228 2228 6.4000000000291664e+01 2228 1597 -1.3020149240672800e-27 2228 2229 -2.1333333333291666e+01 2228 1497 5.3333333333124999e+00 2228 2285 1.5999999999979167e+01 2228 1486 -1.0416666666666666e-10 2228 1494 5.3333333333124999e+00 2228 1496 -1.0666666666677083e+01 2228 1593 1.3233141685082473e-27 2228 2227 -2.1333333333291666e+01 2228 2280 -1.5999999999979167e+01 2228 1592 2.1333333333291666e+01 2228 1595 -2.1333333333343749e+01 2229 2229 6.4000000000291664e+01 2229 1595 5.3333333333124999e+00 2229 1496 -1.1213657767716683e-27 2229 2228 -2.1333333333291666e+01 2229 2285 -1.5999999999979167e+01 2229 1484 1.1000665323307010e-27 2229 1486 2.1333333333291666e+01 2229 1497 -2.1333333333343749e+01 2229 1592 -1.0416666666666666e-10 2229 2224 2.1333333333291666e+01 2229 2223 -1.5999999999979167e+01 2229 1584 5.3333333333124999e+00 2229 1597 -1.0666666666677083e+01 2230 2230 6.4000000000291664e+01 2230 1661 -1.3020149240672800e-27 2230 2231 -2.1333333333291666e+01 2230 1491 5.3333333333124999e+00 2230 2233 1.5999999999979167e+01 2230 1488 -1.0416666666666666e-10 2230 1480 5.3333333333124999e+00 2230 1489 -1.0666666666677083e+01 2230 1962 2.1333333333291666e+01 2230 1651 2.1333333333291666e+01 2231 2231 6.4000000000291664e+01 2231 1489 -1.1213657767716683e-27 2231 2230 -2.1333333333291666e+01 2231 2233 -1.5999999999979167e+01 2231 1490 1.1000665323307010e-27 2231 1488 2.1333333333291666e+01 2231 1491 -2.1333333333343749e+01 2231 1651 -1.0416666666666666e-10 2231 2232 -2.1333333333291666e+01 2231 2273 1.5999999999979167e+01 2231 1652 5.3333333333124999e+00 2231 1661 -1.0666666666677083e+01 2232 2232 6.4000000000291664e+01 2232 1649 -1.1000665323307010e-27 2232 2212 2.1333333333291666e+01 2232 1485 5.3333333333124999e+00 2232 2215 -1.5999999999979167e+01 2232 1488 -1.0416666666666666e-10 2232 1491 5.3333333333124999e+00 2232 1490 -1.0666666666677083e+01 2232 1661 1.3020149240672800e-27 2232 2231 -2.1333333333291666e+01 2232 2273 -1.5999999999979167e+01 2232 1651 2.1333333333291666e+01 2232 1652 -2.1333333333343749e+01 2233 2233 6.4000000000416662e+01 2233 1443 5.3333333333124999e+00 2233 2234 -2.1333333333312499e+01 2233 2272 1.0666666666583334e+01 2233 1655 5.3333333333124999e+00 2233 1478 -5.3333333333124999e+00 2233 1651 5.3333333333124999e+00 2233 1661 -1.3333333333322916e+01 2233 2231 -1.5999999999979167e+01 2233 1488 -5.3333333333124999e+00 2233 1491 5.3333333333958333e+00 2233 2230 1.5999999999979167e+01 2233 1489 5.3333333333333330e+00 2233 1955 1.5999999999979167e+01 2233 1954 -1.5999999999979167e+01 2233 1435 5.3333333333124999e+00 2233 1440 -1.3333333333322916e+01 2234 2234 4.2666666666916662e+01 2234 2329 1.0666666666666666e+01 2234 1440 5.3333333333229165e+00 2234 1443 -1.0666666666687499e+01 2234 2233 -2.1333333333312499e+01 2234 2272 -1.0666666666666666e+01 2234 1661 5.3333333333229165e+00 2234 1655 -1.0666666666687499e+01 2235 2235 3.2000000000208331e+01 2236 2236 6.4000000000291664e+01 2236 1414 1.1000665323307010e-27 2236 1584 5.3333333333124999e+00 2236 1410 -1.3233141685082473e-27 2236 1411 2.1333333333291666e+01 2236 1412 -2.1333333333343749e+01 2236 2219 2.1333333333291666e+01 2236 2220 -1.5999999999979167e+01 2236 1585 -1.0416666666666666e-10 2236 2237 -2.1333333333291666e+01 2236 2241 1.5999999999979167e+01 2236 1589 5.3333333333124999e+00 2236 1586 -1.0666666666677083e+01 2237 2237 6.4000000000291664e+01 2237 1590 -1.1000665323307010e-27 2237 2238 -2.1333333333291666e+01 2237 1415 5.3333333333124999e+00 2237 2263 -1.5999999999979167e+01 2237 1411 -1.0416666666666666e-10 2237 1412 5.3333333333124999e+00 2237 1414 -1.0666666666677083e+01 2237 1586 1.5039633158038590e-27 2237 2236 -2.1333333333291666e+01 2237 2241 -1.5999999999979167e+01 2237 1585 2.1333333333291666e+01 2237 1589 -2.1333333333343749e+01 2238 2238 6.4000000000291664e+01 2238 1589 5.3333333333124999e+00 2238 1414 -1.1000665323307010e-27 2238 2237 -2.1333333333291666e+01 2238 2263 1.5999999999979167e+01 2238 1416 1.3020149240672800e-27 2238 1411 2.1333333333291666e+01 2238 1415 -2.1333333333343749e+01 2238 1585 -1.0416666666666666e-10 2238 2239 -2.1333333333291666e+01 2238 2264 1.5999999999979167e+01 2238 1591 5.3333333333124999e+00 2238 1590 -1.0666666666677083e+01 2239 2239 6.4000000000291664e+01 2239 1583 -1.1213657767716683e-27 2239 2214 2.1333333333291666e+01 2239 1409 5.3333333333124999e+00 2239 2216 -1.5999999999979167e+01 2239 1411 -1.0416666666666666e-10 2239 1415 5.3333333333124999e+00 2239 1416 -1.0666666666677083e+01 2239 1590 1.1000665323307010e-27 2239 2238 -2.1333333333291666e+01 2239 2264 -1.5999999999979167e+01 2239 1585 2.1333333333291666e+01 2239 1591 -2.1333333333343749e+01 2240 2240 6.4000000000291664e+01 2240 1589 -5.3333333333124999e+00 2240 1359 1.1213657767716683e-27 2240 2244 2.1333333333291666e+01 2240 2241 -1.5999999999979167e+01 2240 1351 -1.1000665323307010e-27 2240 1352 -2.1333333333291666e+01 2240 1350 2.1333333333343749e+01 2240 1587 1.0416666666666666e-10 2240 2221 -2.1333333333291666e+01 2240 2220 1.5999999999979167e+01 2240 1584 -5.3333333333124999e+00 2240 1586 1.0666666666677083e+01 2241 2241 6.4000000000416662e+01 2241 1411 5.3333333333124999e+00 2241 1387 -5.3333333333124999e+00 2241 1890 1.5999999999979167e+01 2241 1395 5.3333333333124999e+00 2241 1412 -5.3333333333958333e+00 2241 1891 -1.5999999999979167e+01 2241 1414 -5.3333333333333330e+00 2241 1355 5.3333333333124999e+00 2241 1587 -5.3333333333124999e+00 2241 2240 -1.5999999999979167e+01 2241 1352 5.3333333333124999e+00 2241 1350 -5.3333333333958333e+00 2241 2244 -1.5999999999979167e+01 2241 1359 -5.3333333333333330e+00 2241 2254 -1.5999999999979167e+01 2241 2242 -1.5999999999979167e+01 2241 1384 -5.3333333333124999e+00 2241 1390 5.3333333333958333e+00 2241 1391 5.3333333333333330e+00 2241 2237 -1.5999999999979167e+01 2241 2236 1.5999999999979167e+01 2241 1585 -5.3333333333124999e+00 2241 1589 5.3333333333958333e+00 2241 1586 5.3333333333333330e+00 2242 2242 6.4000000000291664e+01 2242 1360 1.3233141685082473e-27 2242 1886 -2.1333333333291666e+01 2242 1884 1.5999999999979167e+01 2242 1359 -1.1000665323307010e-27 2242 1355 -2.1333333333291666e+01 2242 1350 2.1333333333343749e+01 2242 1384 1.0416666666666666e-10 2242 2254 2.1333333333291666e+01 2242 2241 -1.5999999999979167e+01 2242 1390 -5.3333333333124999e+00 2242 1391 1.0666666666677083e+01 2243 2243 6.4000000000291664e+01 2243 1581 5.3333333333124999e+00 2243 1368 -1.5039633158038590e-27 2243 2051 2.1333333333291666e+01 2243 2053 1.5999999999979167e+01 2243 1359 1.1213657767716683e-27 2243 1352 2.1333333333291666e+01 2243 1358 -2.1333333333343749e+01 2243 1587 -1.0416666666666666e-10 2243 2244 -2.1333333333291666e+01 2243 2260 1.5999999999979167e+01 2243 1589 5.3333333333124999e+00 2243 1588 -1.0666666666677083e+01 2244 2244 6.4000000000291664e+01 2244 1586 -1.3020149240672800e-27 2244 2240 2.1333333333291666e+01 2244 1350 5.3333333333124999e+00 2244 2241 -1.5999999999979167e+01 2244 1352 -1.0416666666666666e-10 2244 1358 5.3333333333124999e+00 2244 1359 -1.0666666666677083e+01 2244 1588 1.3233141685082473e-27 2244 2243 -2.1333333333291666e+01 2244 2260 -1.5999999999979167e+01 2244 1587 2.1333333333291666e+01 2244 1589 -2.1333333333343749e+01 2245 2245 6.4000000000291664e+01 2245 1368 1.5039633158038590e-27 2245 1584 5.3333333333124999e+00 2245 1351 -1.1000665323307010e-27 2245 1352 2.1333333333291666e+01 2245 1361 -2.1333333333343749e+01 2245 2221 2.1333333333291666e+01 2245 2222 -1.5999999999979167e+01 2245 1587 -1.0416666666666666e-10 2245 2051 2.1333333333291666e+01 2245 2050 -1.5999999999979167e+01 2245 1581 5.3333333333124999e+00 2245 1596 -1.0666666666677083e+01 2246 2246 3.2000000000208331e+01 2247 2247 6.4000000000291664e+01 2247 1360 -1.3233141685082473e-27 2247 1353 1.3020149240672800e-27 2247 1355 -2.1333333333291666e+01 2247 1354 2.1333333333343749e+01 2247 2251 -2.1333333333291666e+01 2247 1384 1.0416666666666666e-10 2247 1886 -2.1333333333291666e+01 2248 2248 3.2000000000208331e+01 2249 2249 6.4000000000291664e+01 2249 1357 1.1000665323307010e-27 2249 2257 2.1333333333291666e+01 2249 1353 -1.5039633158038590e-27 2249 1356 -2.1333333333291666e+01 2249 1354 2.1333333333343749e+01 2249 1667 1.0416666666666666e-10 2249 2250 -2.1333333333291666e+01 2250 2250 6.4000000000291664e+01 2250 1665 1.3233141685082473e-27 2250 2255 2.1333333333291666e+01 2250 1358 -5.3333333333124999e+00 2250 2252 1.5999999999979167e+01 2250 1356 1.0416666666666666e-10 2250 1354 -5.3333333333124999e+00 2250 1353 1.0666666666677083e+01 2250 2249 -2.1333333333291666e+01 2250 1667 -2.1333333333291666e+01 2251 2251 6.4000000000291664e+01 2251 1358 -5.3333333333124999e+00 2251 1389 -1.1000665323307010e-27 2251 2253 2.1333333333291666e+01 2251 2252 1.5999999999979167e+01 2251 1384 -2.1333333333291666e+01 2251 1355 1.0416666666666666e-10 2251 2247 -2.1333333333291666e+01 2251 1354 -5.3333333333124999e+00 2251 1353 1.0666666666677083e+01 2252 2252 6.4000000000416662e+01 2252 1389 5.3333333333333330e+00 2252 1665 5.3333333333333330e+00 2252 1355 5.3333333333124999e+00 2252 1667 -5.3333333333124999e+00 2252 2255 1.5999999999979167e+01 2252 1356 5.3333333333124999e+00 2252 1358 -5.3333333333958333e+00 2252 2250 1.5999999999979167e+01 2252 1353 -5.3333333333333330e+00 2252 2251 1.5999999999979167e+01 2252 2253 1.5999999999979167e+01 2252 1384 -5.3333333333124999e+00 2252 405 5.3333333333124999e+00 2252 436 -5.3333333333124999e+00 2252 805 1.5999999999979167e+01 2252 410 5.3333333333124999e+00 2252 420 -5.3333333333958333e+00 2252 804 -1.5999999999979167e+01 2252 421 -5.3333333333333330e+00 2252 773 -1.5999999999979167e+01 2252 772 1.5999999999979167e+01 2252 398 -5.3333333333124999e+00 2253 2253 6.4000000000291664e+01 2253 1390 5.3333333333124999e+00 2253 1359 -1.1000665323307010e-27 2253 2254 -2.1333333333291666e+01 2253 2260 1.5999999999979167e+01 2253 1353 1.3020149240672800e-27 2253 1355 2.1333333333291666e+01 2253 1358 -2.1333333333343749e+01 2253 1384 -1.0416666666666666e-10 2253 2251 2.1333333333291666e+01 2253 2252 1.5999999999979167e+01 2253 1389 -1.0666666666677083e+01 2254 2254 6.4000000000291664e+01 2254 1350 5.3333333333124999e+00 2254 1391 1.5039633158038590e-27 2254 2242 2.1333333333291666e+01 2254 2241 -1.5999999999979167e+01 2254 1389 -1.1000665323307010e-27 2254 1384 2.1333333333291666e+01 2254 1390 -2.1333333333343749e+01 2254 1355 -1.0416666666666666e-10 2254 2253 -2.1333333333291666e+01 2254 1358 5.3333333333124999e+00 2254 2260 -1.5999999999979167e+01 2254 1359 -1.0666666666677083e+01 2255 2255 6.4000000000291664e+01 2255 1369 1.1213657767716683e-27 2255 1353 -1.5039633158038590e-27 2255 1356 2.1333333333291666e+01 2255 1358 -2.1333333333343749e+01 2255 2250 2.1333333333291666e+01 2255 2252 1.5999999999979167e+01 2255 1667 -1.0416666666666666e-10 2255 2256 -2.1333333333291666e+01 2255 2261 1.5999999999979167e+01 2255 1665 -1.0666666666677083e+01 2256 2256 6.4000000000291664e+01 2256 2258 -2.1333333333291666e+01 2256 1366 5.3333333333124999e+00 2256 1356 -1.0416666666666666e-10 2256 1358 5.3333333333124999e+00 2256 1369 -1.0666666666677083e+01 2256 1665 1.3233141685082473e-27 2256 2255 -2.1333333333291666e+01 2256 2261 -1.5999999999979167e+01 2256 1667 2.1333333333291666e+01 2257 2257 6.4000000000291664e+01 2257 1366 5.3333333333124999e+00 2257 2258 -2.1333333333291666e+01 2257 1667 2.1333333333291666e+01 2257 1356 -1.0416666666666666e-10 2257 2249 2.1333333333291666e+01 2257 1354 5.3333333333124999e+00 2257 1357 -1.0666666666677083e+01 2258 2258 6.4000000000291664e+01 2258 1369 -1.1213657767716683e-27 2258 2256 -2.1333333333291666e+01 2258 1357 1.1000665323307010e-27 2258 1356 2.1333333333291666e+01 2258 1366 -2.1333333333343749e+01 2258 1667 -1.0416666666666666e-10 2258 2257 -2.1333333333291666e+01 2259 2259 3.2000000000208331e+01 2260 2260 6.4000000000416662e+01 2260 1589 5.3333333333958333e+00 2260 1588 5.3333333333333330e+00 2260 1390 5.3333333333958333e+00 2260 1389 5.3333333333333330e+00 2260 1352 5.3333333333124999e+00 2260 1384 -5.3333333333124999e+00 2260 2253 1.5999999999979167e+01 2260 1355 5.3333333333124999e+00 2260 1358 -5.3333333333958333e+00 2260 2254 -1.5999999999979167e+01 2260 1359 -5.3333333333333330e+00 2260 2244 -1.5999999999979167e+01 2260 2243 1.5999999999979167e+01 2260 1587 -5.3333333333124999e+00 2260 410 5.3333333333124999e+00 2260 474 -5.3333333333124999e+00 2260 924 1.5999999999979167e+01 2260 415 5.3333333333124999e+00 2260 420 -5.3333333333958333e+00 2260 926 -1.5999999999979167e+01 2260 419 -5.3333333333333330e+00 2260 806 -1.5999999999979167e+01 2260 805 1.5999999999979167e+01 2260 436 -5.3333333333124999e+00 2261 2261 6.4000000000416662e+01 2261 1665 5.3333333333333330e+00 2261 1099 5.3333333333333330e+00 2261 1356 5.3333333333124999e+00 2261 1094 -5.3333333333124999e+00 2261 2262 -1.5999999999979167e+01 2261 1367 5.3333333333124999e+00 2261 1358 -5.3333333333958333e+00 2261 2314 -1.5999999999979167e+01 2261 1369 -5.3333333333333330e+00 2261 2256 -1.5999999999979167e+01 2261 2255 1.5999999999979167e+01 2261 1667 -5.3333333333124999e+00 2261 404 5.3333333333124999e+00 2261 398 -5.3333333333124999e+00 2261 772 1.5999999999979167e+01 2261 405 5.3333333333124999e+00 2261 420 -5.3333333333958333e+00 2261 766 1.5999999999979167e+01 2261 402 -5.3333333333333330e+00 2261 767 1.5999999999979167e+01 2261 771 1.5999999999979167e+01 2261 394 -5.3333333333124999e+00 2262 2262 6.4000000000291664e+01 2262 1369 1.1000665323307010e-27 2262 2314 2.1333333333291666e+01 2262 2261 -1.5999999999979167e+01 2262 1368 -1.3020149240672800e-27 2262 1367 -2.1333333333291666e+01 2262 1358 2.1333333333343749e+01 2262 1094 1.0416666666666666e-10 2262 2052 -2.1333333333291666e+01 2262 2053 -1.5999999999979167e+01 2262 1097 -5.3333333333124999e+00 2262 1099 1.0666666666677083e+01 2263 2263 6.4000000000416662e+01 2263 1390 5.3333333333958333e+00 2263 1392 5.3333333333333330e+00 2263 1589 5.3333333333958333e+00 2263 1590 5.3333333333333330e+00 2263 1395 5.3333333333124999e+00 2263 1585 -5.3333333333124999e+00 2263 2238 1.5999999999979167e+01 2263 1411 5.3333333333124999e+00 2263 1415 -5.3333333333958333e+00 2263 2237 -1.5999999999979167e+01 2263 1414 -5.3333333333333330e+00 2263 1891 -1.5999999999979167e+01 2263 1892 1.5999999999979167e+01 2263 1387 -5.3333333333124999e+00 2263 379 5.3333333333124999e+00 2263 439 -5.3333333333124999e+00 2263 1054 -1.5999999999979167e+01 2263 389 5.3333333333124999e+00 2263 380 -5.3333333333958333e+00 2263 1034 1.5999999999979167e+01 2263 390 -5.3333333333333330e+00 2263 1032 1.5999999999979167e+01 2263 1052 1.5999999999979167e+01 2263 471 -5.3333333333124999e+00 2264 2264 6.4000000000416662e+01 2264 1591 5.3333333333958333e+00 2264 1590 5.3333333333333330e+00 2264 1287 5.3333333333958333e+00 2264 1286 5.3333333333333330e+00 2264 1411 5.3333333333124999e+00 2264 1269 -5.3333333333124999e+00 2264 1918 1.5999999999979167e+01 2264 1401 5.3333333333124999e+00 2264 1415 -5.3333333333958333e+00 2264 1919 -1.5999999999979167e+01 2264 1416 -5.3333333333333330e+00 2264 2239 -1.5999999999979167e+01 2264 2238 1.5999999999979167e+01 2264 1585 -5.3333333333124999e+00 2264 374 5.3333333333124999e+00 2264 471 -5.3333333333124999e+00 2264 1052 1.5999999999979167e+01 2264 379 5.3333333333124999e+00 2264 380 -5.3333333333958333e+00 2264 1046 1.5999999999979167e+01 2264 378 -5.3333333333333330e+00 2264 1037 -1.5999999999979167e+01 2264 1038 1.5999999999979167e+01 2264 291 -5.3333333333124999e+00 2265 2265 6.4000000000416662e+01 2265 1424 5.3333333333333330e+00 2265 1392 5.3333333333333330e+00 2265 1402 5.3333333333124999e+00 2265 1387 -5.3333333333124999e+00 2265 1892 1.5999999999979167e+01 2265 1395 5.3333333333124999e+00 2265 1415 -5.3333333333958333e+00 2265 1889 -1.5999999999979167e+01 2265 1418 -5.3333333333333330e+00 2265 1922 -1.5999999999979167e+01 2265 1921 1.5999999999979167e+01 2265 1426 -5.3333333333124999e+00 2265 389 5.3333333333124999e+00 2265 492 -5.3333333333124999e+00 2265 1053 -1.5999999999979167e+01 2265 382 5.3333333333124999e+00 2265 380 -5.3333333333958333e+00 2265 1058 -1.5999999999979167e+01 2265 387 -5.3333333333333330e+00 2265 1074 1.5999999999979167e+01 2265 1054 -1.5999999999979167e+01 2265 439 -5.3333333333124999e+00 2266 2266 6.4000000000416662e+01 2266 1677 -5.3333333333124999e+00 2266 1290 5.3333333333124999e+00 2266 2281 1.5999999999979167e+01 2266 1675 -5.3333333333124999e+00 2266 1673 5.3333333333958333e+00 2266 2269 -1.5999999999979167e+01 2266 1676 5.3333333333333330e+00 2266 1492 -5.3333333333124999e+00 2266 1592 5.3333333333124999e+00 2266 2227 -1.5999999999979167e+01 2266 1486 -5.3333333333124999e+00 2266 1494 5.3333333333958333e+00 2266 2226 1.5999999999979167e+01 2266 1493 5.3333333333333330e+00 2266 2268 -1.5999999999979167e+01 2266 2277 -1.5999999999979167e+01 2266 1272 5.3333333333124999e+00 2266 1287 -5.3333333333958333e+00 2266 1289 -5.3333333333333330e+00 2266 2267 -1.5999999999979167e+01 2266 2279 1.5999999999979167e+01 2266 1594 5.3333333333124999e+00 2266 1591 -5.3333333333958333e+00 2266 1593 -5.3333333333333330e+00 2267 2267 6.4000000000291664e+01 2267 1594 -2.1333333333291666e+01 2267 1591 2.1333333333343749e+01 2267 1677 1.0416666666666666e-10 2267 1676 1.0666666666677083e+01 2267 1673 -5.3333333333124999e+00 2267 1593 -1.1000665323307010e-27 2267 2279 -2.1333333333291666e+01 2267 2266 -1.5999999999979167e+01 2267 470 1.1213657767716683e-27 2267 1044 -2.1333333333291666e+01 2267 297 -5.3333333333124999e+00 2267 1041 1.5999999999979167e+01 2268 2268 6.4000000000291664e+01 2268 1494 -5.3333333333124999e+00 2268 1289 -1.1000665323307010e-27 2268 2277 2.1333333333291666e+01 2268 2266 -1.5999999999979167e+01 2268 1288 1.1213657767716683e-27 2268 1272 -2.1333333333291666e+01 2268 1287 2.1333333333343749e+01 2268 1492 1.0416666666666666e-10 2268 2218 -2.1333333333291666e+01 2268 1485 -5.3333333333124999e+00 2268 2216 1.5999999999979167e+01 2268 1493 1.0666666666677083e+01 2269 2269 6.4000000000291664e+01 2269 1675 1.0416666666666666e-10 2269 1676 1.0666666666677083e+01 2269 1290 -2.1333333333291666e+01 2269 1287 2.1333333333343749e+01 2269 1289 1.3233141685082473e-27 2269 2281 -2.1333333333291666e+01 2269 1673 -5.3333333333124999e+00 2269 2266 -1.5999999999979167e+01 2269 297 -5.3333333333124999e+00 2269 292 -1.1000665323307010e-27 2269 703 2.1333333333291666e+01 2269 1041 1.5999999999979167e+01 2270 2270 5.3333333333749991e+01 2270 1273 1.8812360437258079e-27 2270 1471 -3.6295685768920020e-28 2270 1805 -1.0666666666562499e+01 2270 1809 1.0666666666666666e+01 2270 1492 5.3333333333124999e+00 2270 1466 -5.3333333333124999e+00 2270 1465 -2.6666666665833332e+00 2270 1469 8.0000000000000000e+00 2270 1948 1.5999999999979167e+01 2270 1476 5.3333333333124999e+00 2270 1491 -5.3333333333958333e+00 2270 1946 -1.5999999999979167e+01 2270 1495 -5.3333333333333330e+00 2270 2276 -1.5999999999979167e+01 2270 2271 -1.5999999999979167e+01 2270 1272 -5.3333333333124999e+00 2270 1271 -2.6666666665833332e+00 2270 1270 8.0000000000000000e+00 2271 2271 6.4000000000291664e+01 2271 1495 -1.1000665323307010e-27 2271 1268 -5.3333333333124999e+00 2271 1490 1.3233141685082473e-27 2271 1492 -2.1333333333291666e+01 2271 1491 2.1333333333343749e+01 2271 2275 -2.1333333333291666e+01 2271 2273 -1.5999999999979167e+01 2271 1272 1.0416666666666666e-10 2271 2276 2.1333333333291666e+01 2271 2270 -1.5999999999979167e+01 2271 1271 -5.3333333333124999e+00 2271 1270 1.0666666666677083e+01 2272 2272 6.4000000000583327e+01 2272 1652 1.0416666666666666e-11 2272 1661 -6.2499999999999991e-11 2272 1655 4.1666666666666665e-11 2272 2233 1.0666666666583334e+01 2272 2234 -1.0666666666666666e+01 2272 1440 1.0666666666625000e+01 2272 1442 5.3333333333229165e+00 2272 1443 -1.5999999999958334e+01 2272 1809 3.2000000000020833e+01 2272 1808 -2.1333333333208333e+01 2272 1273 5.3333333332812494e+00 2272 1268 1.0416666666666666e-11 2272 1270 -1.0416666666666667e-10 2272 1275 -5.3333333332916668e+00 2272 2273 -1.0666666666583334e+01 2272 2274 -1.0666666666666666e+01 2273 2273 6.4000000000416662e+01 2273 1655 -5.3333333333124999e+00 2273 1488 5.3333333333124999e+00 2273 1272 -5.3333333333124999e+00 2273 2271 -1.5999999999979167e+01 2273 1492 5.3333333333124999e+00 2273 1491 -5.3333333333958333e+00 2273 2275 1.5999999999979167e+01 2273 1490 -5.3333333333333330e+00 2273 2232 -1.5999999999979167e+01 2273 2231 1.5999999999979167e+01 2273 1651 -5.3333333333124999e+00 2273 1652 -2.6666666665937497e+00 2273 1661 1.3333333333322916e+01 2273 2274 2.1333333333312499e+01 2273 2272 -1.0666666666583334e+01 2273 1268 -2.6666666665937502e+00 2273 1270 1.3333333333322916e+01 2273 1275 -5.3333333333124999e+00 2274 2274 4.2666666666916662e+01 2274 1661 5.3333333333229165e+00 2274 1652 -6.2499999999999991e-11 2274 1655 -1.0666666666687499e+01 2274 1654 5.3333333333229165e+00 2274 2192 2.1333333333312499e+01 2274 2190 -1.0666666666666666e+01 2274 1279 5.3333333333229165e+00 2274 1268 -6.2499999999999991e-11 2274 2273 2.1333333333312499e+01 2274 2272 -1.0666666666666666e+01 2274 1270 5.3333333333229165e+00 2274 1275 -1.0666666666687499e+01 2275 2275 6.4000000000291664e+01 2275 1485 -5.3333333333124999e+00 2275 1288 -1.1213657767716683e-27 2275 2218 -2.1333333333291666e+01 2275 2215 1.5999999999979167e+01 2275 1270 1.5039633158038590e-27 2275 1272 -2.1333333333291666e+01 2275 1268 2.1333333333343749e+01 2275 1492 1.0416666666666666e-10 2275 2271 -2.1333333333291666e+01 2275 1491 -5.3333333333124999e+00 2275 2273 1.5999999999979167e+01 2275 1490 1.0666666666677083e+01 2276 2276 6.4000000000291664e+01 2276 1491 5.3333333333124999e+00 2276 1289 -1.1000665323307010e-27 2276 1492 -1.0416666666666666e-10 2276 2277 -2.1333333333291666e+01 2276 1494 5.3333333333124999e+00 2276 2278 -1.5999999999979167e+01 2276 1495 -1.0666666666677083e+01 2276 1270 1.5039633158038590e-27 2276 2271 2.1333333333291666e+01 2276 2270 -1.5999999999979167e+01 2276 1272 2.1333333333291666e+01 2276 1271 -2.1333333333343749e+01 2277 2277 6.4000000000291664e+01 2277 1271 5.3333333333124999e+00 2277 1495 -1.1000665323307010e-27 2277 2276 -2.1333333333291666e+01 2277 2278 1.5999999999979167e+01 2277 1493 1.3020149240672800e-27 2277 1492 2.1333333333291666e+01 2277 1494 -2.1333333333343749e+01 2277 1272 -1.0416666666666666e-10 2277 2268 2.1333333333291666e+01 2277 2266 -1.5999999999979167e+01 2277 1287 5.3333333333124999e+00 2277 1289 -1.0666666666677083e+01 2278 2278 6.4000000000416662e+01 2278 1675 5.3333333333124999e+00 2278 1470 -5.3333333333124999e+00 2278 2282 -1.5999999999979167e+01 2278 1674 5.3333333333124999e+00 2278 1673 -5.3333333333958333e+00 2278 2284 1.5999999999979167e+01 2278 1672 -5.3333333333333330e+00 2278 2283 1.5999999999979167e+01 2278 2281 -1.5999999999979167e+01 2278 1290 -5.3333333333124999e+00 2278 1476 5.3333333333124999e+00 2278 1272 -5.3333333333124999e+00 2278 1271 5.3333333333958333e+00 2278 1289 5.3333333333333330e+00 2278 2277 1.5999999999979167e+01 2278 1492 5.3333333333124999e+00 2278 1494 -5.3333333333958333e+00 2278 2276 -1.5999999999979167e+01 2278 1495 -5.3333333333333330e+00 2278 1946 -1.5999999999979167e+01 2278 1945 1.5999999999979167e+01 2278 1466 -5.3333333333124999e+00 2278 1465 5.3333333333958333e+00 2278 1464 5.3333333333333330e+00 2279 2279 6.4000000000291664e+01 2279 1594 1.0416666666666666e-10 2279 1595 -5.3333333333124999e+00 2279 1593 1.0666666666677083e+01 2279 1677 -2.1333333333291666e+01 2279 1673 2.1333333333343749e+01 2279 2280 -1.5999999999979167e+01 2279 1676 -1.3020149240672800e-27 2279 2267 -2.1333333333291666e+01 2279 2266 1.5999999999979167e+01 2279 1591 -5.3333333333124999e+00 2279 307 1.1000665323307010e-27 2279 1048 2.1333333333291666e+01 2280 2280 6.4000000000416662e+01 2280 1594 -5.3333333333124999e+00 2280 1595 5.3333333333958333e+00 2280 1593 5.3333333333333330e+00 2280 2279 -1.5999999999979167e+01 2280 1677 5.3333333333124999e+00 2280 1673 -5.3333333333958333e+00 2280 1460 5.3333333333958333e+00 2280 1459 5.3333333333333330e+00 2280 1486 5.3333333333124999e+00 2280 1452 -5.3333333333124999e+00 2280 1942 1.5999999999979167e+01 2280 1475 5.3333333333124999e+00 2280 1494 -5.3333333333958333e+00 2280 1943 -1.5999999999979167e+01 2280 1496 -5.3333333333333330e+00 2280 2228 -1.5999999999979167e+01 2280 2227 1.5999999999979167e+01 2280 1592 -5.3333333333124999e+00 2280 303 5.3333333333124999e+00 2280 1048 -1.5999999999979167e+01 2280 307 -5.3333333333333330e+00 2280 1061 -1.5999999999979167e+01 2280 1062 1.5999999999979167e+01 2280 430 -5.3333333333124999e+00 2281 2281 6.4000000000291664e+01 2281 1287 -5.3333333333124999e+00 2281 1676 1.5039633158038590e-27 2281 2269 -2.1333333333291666e+01 2281 2266 1.5999999999979167e+01 2281 1672 -1.1213657767716683e-27 2281 1675 -2.1333333333291666e+01 2281 1673 2.1333333333343749e+01 2281 1290 1.0416666666666666e-10 2281 2283 -2.1333333333291666e+01 2281 2278 -1.5999999999979167e+01 2281 1271 -5.3333333333124999e+00 2281 1289 1.0666666666677083e+01 2282 2282 6.4000000000291664e+01 2282 1674 -2.1333333333291666e+01 2282 1673 2.1333333333343749e+01 2282 1470 1.0416666666666666e-10 2282 1940 -1.5999999999979167e+01 2282 1463 -5.3333333333124999e+00 2282 1464 1.0666666666677083e+01 2282 1465 -5.3333333333124999e+00 2282 1672 1.1000665323307010e-27 2282 2284 -2.1333333333291666e+01 2282 2278 -1.5999999999979167e+01 2282 308 -1.3020149240672800e-27 2282 704 2.1333333333291666e+01 2283 2283 6.4000000000291664e+01 2283 1274 1.3020149240672800e-27 2283 1290 -2.1333333333291666e+01 2283 1271 2.1333333333343749e+01 2283 1675 1.0416666666666666e-10 2283 1817 1.5999999999979167e+01 2283 1672 1.0666666666677083e+01 2283 1673 -5.3333333333124999e+00 2283 1289 -1.3233141685082473e-27 2283 2281 -2.1333333333291666e+01 2283 2278 1.5999999999979167e+01 2283 699 -2.1333333333291666e+01 2283 294 -5.3333333333124999e+00 2284 2284 6.4000000000291664e+01 2284 1674 1.0416666666666666e-10 2284 1672 1.0666666666677083e+01 2284 1472 -1.5039633158038590e-27 2284 1817 1.5999999999979167e+01 2284 1470 -2.1333333333291666e+01 2284 1465 2.1333333333343749e+01 2284 1464 1.1000665323307010e-27 2284 2282 -2.1333333333291666e+01 2284 1673 -5.3333333333124999e+00 2284 2278 1.5999999999979167e+01 2284 294 -5.3333333333124999e+00 2284 700 -2.1333333333291666e+01 2285 2285 6.4000000000416662e+01 2285 1121 -5.3333333333124999e+00 2285 1453 5.3333333333124999e+00 2285 2309 1.5999999999979167e+01 2285 1136 -5.3333333333124999e+00 2285 1129 5.3333333333958333e+00 2285 2286 -1.5999999999979167e+01 2285 1137 5.3333333333333330e+00 2285 1475 -5.3333333333124999e+00 2285 1592 5.3333333333124999e+00 2285 2229 -1.5999999999979167e+01 2285 1486 -5.3333333333124999e+00 2285 1497 5.3333333333958333e+00 2285 2228 1.5999999999979167e+01 2285 1496 5.3333333333333330e+00 2285 1943 1.5999999999979167e+01 2285 1944 -1.5999999999979167e+01 2285 1452 5.3333333333124999e+00 2285 1460 -5.3333333333958333e+00 2285 1461 -5.3333333333333330e+00 2285 2057 1.5999999999979167e+01 2285 2056 -1.5999999999979167e+01 2285 1582 5.3333333333124999e+00 2285 1595 -5.3333333333958333e+00 2285 1597 -5.3333333333333330e+00 2286 2286 6.4000000000291664e+01 2286 1119 -5.3333333333124999e+00 2286 1462 -1.3233141685082473e-27 2286 2048 -2.1333333333291666e+01 2286 2047 1.5999999999979167e+01 2286 1461 1.3020149240672800e-27 2286 1453 -2.1333333333291666e+01 2286 1460 2.1333333333343749e+01 2286 1136 1.0416666666666666e-10 2286 2309 -2.1333333333291666e+01 2286 1129 -5.3333333333124999e+00 2286 2285 -1.5999999999979167e+01 2286 1137 1.0666666666677083e+01 2287 2287 3.2000000000208331e+01 2288 2288 6.4000000000291664e+01 2288 1130 -1.1213657767716683e-27 2288 1122 1.5039633158038590e-27 2288 1124 -2.1333333333291666e+01 2288 1123 2.1333333333343749e+01 2288 2295 -2.1333333333291666e+01 2288 1327 1.0416666666666666e-10 2288 1966 -2.1333333333291666e+01 2289 2289 3.2000000000208331e+01 2290 2290 6.4000000000291664e+01 2290 1126 1.1000665323307010e-27 2290 2300 2.1333333333291666e+01 2290 1122 -1.3020149240672800e-27 2290 1125 -2.1333333333291666e+01 2290 1123 2.1333333333343749e+01 2290 1682 1.0416666666666666e-10 2290 2294 -2.1333333333291666e+01 2291 2291 6.4000000000291664e+01 2291 1130 1.1000665323307010e-27 2291 1964 -2.1333333333291666e+01 2291 1132 -1.3020149240672800e-27 2291 1131 -2.1333333333291666e+01 2291 1123 2.1333333333343749e+01 2291 1504 1.0416666666666666e-10 2291 2168 -2.1333333333291666e+01 2292 2292 6.4000000000416662e+01 2292 1124 -5.3333333333124999e+00 2292 1682 5.3333333333124999e+00 2292 2298 -1.5999999999979167e+01 2292 1125 -5.3333333333124999e+00 2292 1127 5.3333333333958333e+00 2292 2294 -1.5999999999979167e+01 2292 1122 5.3333333333333330e+00 2292 2295 -1.5999999999979167e+01 2292 2296 -1.5999999999979167e+01 2292 1327 5.3333333333124999e+00 2292 1363 -5.3333333333124999e+00 2292 1324 5.3333333333124999e+00 2292 1331 -5.3333333333333330e+00 2292 1865 -1.5999999999979167e+01 2292 1346 -5.3333333333124999e+00 2292 1361 5.3333333333958333e+00 2292 1862 1.5999999999979167e+01 2292 1362 5.3333333333333330e+00 2292 2293 -1.5999999999979167e+01 2292 2301 1.5999999999979167e+01 2292 1680 5.3333333333124999e+00 2292 1678 -5.3333333333333330e+00 2293 2293 6.4000000000291664e+01 2293 1855 -2.1333333333291666e+01 2293 1345 -5.3333333333124999e+00 2293 1363 1.0416666666666666e-10 2293 1361 -5.3333333333124999e+00 2293 1362 1.0666666666677083e+01 2293 1678 -1.1000665323307010e-27 2293 2301 -2.1333333333291666e+01 2293 2292 -1.5999999999979167e+01 2293 1680 -2.1333333333291666e+01 2294 2294 6.4000000000291664e+01 2294 1678 1.1213657767716683e-27 2294 2298 2.1333333333291666e+01 2294 1127 -5.3333333333124999e+00 2294 2292 -1.5999999999979167e+01 2294 1125 1.0416666666666666e-10 2294 1123 -5.3333333333124999e+00 2294 1122 1.0666666666677083e+01 2294 2290 -2.1333333333291666e+01 2294 1682 -2.1333333333291666e+01 2295 2295 6.4000000000291664e+01 2295 1127 -5.3333333333124999e+00 2295 1331 -1.1000665323307010e-27 2295 2296 2.1333333333291666e+01 2295 2292 -1.5999999999979167e+01 2295 1327 -2.1333333333291666e+01 2295 1124 1.0416666666666666e-10 2295 2288 -2.1333333333291666e+01 2295 1123 -5.3333333333124999e+00 2295 1122 1.0666666666677083e+01 2296 2296 6.4000000000291664e+01 2296 1329 5.3333333333124999e+00 2296 1128 -1.1000665323307010e-27 2296 2225 2.1333333333291666e+01 2296 2222 -1.5999999999979167e+01 2296 1122 1.5039633158038590e-27 2296 1124 2.1333333333291666e+01 2296 1127 -2.1333333333343749e+01 2296 1327 -1.0416666666666666e-10 2296 2295 2.1333333333291666e+01 2296 2292 -1.5999999999979167e+01 2296 1331 -1.0666666666677083e+01 2297 2297 6.4000000000291664e+01 2297 1130 -1.1213657767716683e-27 2297 1966 2.1333333333291666e+01 2297 1963 -1.5999999999979167e+01 2297 1128 1.1000665323307010e-27 2297 1124 2.1333333333291666e+01 2297 1129 -2.1333333333343749e+01 2297 1327 -1.0416666666666666e-10 2297 2225 2.1333333333291666e+01 2297 2223 -1.5999999999979167e+01 2297 1329 5.3333333333124999e+00 2297 1332 -1.0666666666677083e+01 2298 2298 6.4000000000291664e+01 2298 1133 1.3233141685082473e-27 2298 1122 -1.3020149240672800e-27 2298 1125 2.1333333333291666e+01 2298 1127 -2.1333333333343749e+01 2298 2294 2.1333333333291666e+01 2298 2292 -1.5999999999979167e+01 2298 1682 -1.0416666666666666e-10 2298 2299 -2.1333333333291666e+01 2298 2302 1.5999999999979167e+01 2298 1678 -1.0666666666677083e+01 2299 2299 6.4000000000291664e+01 2299 1700 2.1333333333291666e+01 2299 1114 5.3333333333124999e+00 2299 1125 -1.0416666666666666e-10 2299 1127 5.3333333333124999e+00 2299 1133 -1.0666666666677083e+01 2299 1678 1.1213657767716683e-27 2299 2298 -2.1333333333291666e+01 2299 2302 -1.5999999999979167e+01 2299 1682 2.1333333333291666e+01 2300 2300 6.4000000000291664e+01 2300 1114 5.3333333333124999e+00 2300 1700 2.1333333333291666e+01 2300 1682 2.1333333333291666e+01 2300 1125 -1.0416666666666666e-10 2300 2290 2.1333333333291666e+01 2300 1123 5.3333333333124999e+00 2300 1126 -1.0666666666677083e+01 2301 2301 6.4000000000291664e+01 2301 1365 1.1000665323307010e-27 2301 2306 2.1333333333291666e+01 2301 2302 -1.5999999999979167e+01 2301 1362 -1.5039633158038590e-27 2301 1363 -2.1333333333291666e+01 2301 1361 2.1333333333343749e+01 2301 1680 1.0416666666666666e-10 2301 2293 -2.1333333333291666e+01 2301 2292 1.5999999999979167e+01 2301 1678 1.0666666666677083e+01 2302 2302 6.4000000000416662e+01 2302 1367 5.3333333333124999e+00 2302 1680 -5.3333333333124999e+00 2302 2301 -1.5999999999979167e+01 2302 1363 5.3333333333124999e+00 2302 1361 -5.3333333333958333e+00 2302 2306 -1.5999999999979167e+01 2302 1365 -5.3333333333333330e+00 2302 2313 1.5999999999979167e+01 2302 2303 -1.5999999999979167e+01 2302 1094 -5.3333333333124999e+00 2302 1125 5.3333333333124999e+00 2302 1091 -5.3333333333124999e+00 2302 1098 5.3333333333333330e+00 2302 1707 1.5999999999979167e+01 2302 1115 5.3333333333124999e+00 2302 1127 -5.3333333333958333e+00 2302 1704 -1.5999999999979167e+01 2302 1133 -5.3333333333333330e+00 2302 2299 -1.5999999999979167e+01 2302 2298 1.5999999999979167e+01 2302 1682 -5.3333333333124999e+00 2302 1678 5.3333333333333330e+00 2303 2303 6.4000000000291664e+01 2303 1097 -5.3333333333124999e+00 2303 1368 1.3020149240672800e-27 2303 2052 -2.1333333333291666e+01 2303 2050 1.5999999999979167e+01 2303 1365 -1.3233141685082473e-27 2303 1367 -2.1333333333291666e+01 2303 1361 2.1333333333343749e+01 2303 1094 1.0416666666666666e-10 2303 2313 -2.1333333333291666e+01 2303 2302 -1.5999999999979167e+01 2303 1098 1.0666666666677083e+01 2304 2304 6.4000000000291664e+01 2304 2305 -2.1333333333291666e+01 2304 1366 5.3333333333124999e+00 2304 1363 -1.0416666666666666e-10 2304 1345 5.3333333333124999e+00 2304 1364 -1.0666666666677083e+01 2304 1855 2.1333333333291666e+01 2304 1680 2.1333333333291666e+01 2305 2305 6.4000000000291664e+01 2305 1364 -1.1213657767716683e-27 2305 2304 -2.1333333333291666e+01 2305 1365 1.1000665323307010e-27 2305 1363 2.1333333333291666e+01 2305 1366 -2.1333333333343749e+01 2305 1680 -1.0416666666666666e-10 2305 2306 -2.1333333333291666e+01 2306 2306 6.4000000000291664e+01 2306 1678 -1.1000665323307010e-27 2306 2301 2.1333333333291666e+01 2306 1361 5.3333333333124999e+00 2306 2302 -1.5999999999979167e+01 2306 1363 -1.0416666666666666e-10 2306 1366 5.3333333333124999e+00 2306 1365 -1.0666666666677083e+01 2306 2305 -2.1333333333291666e+01 2306 1680 2.1333333333291666e+01 2307 2307 3.2000000000208331e+01 2308 2308 6.4000000000291664e+01 2308 1505 -5.3333333333124999e+00 2308 1134 1.3233141685082473e-27 2308 2148 -2.1333333333291666e+01 2308 2147 1.5999999999979167e+01 2308 1130 -1.1000665323307010e-27 2308 1131 -2.1333333333291666e+01 2308 1129 2.1333333333343749e+01 2308 1504 1.0416666666666666e-10 2308 1964 -2.1333333333291666e+01 2308 1963 1.5999999999979167e+01 2308 1502 1.0666666666677083e+01 2309 2309 6.4000000000291664e+01 2309 1460 -5.3333333333124999e+00 2309 1137 1.1213657767716683e-27 2309 2286 -2.1333333333291666e+01 2309 2285 1.5999999999979167e+01 2309 1134 -1.1000665323307010e-27 2309 1136 -2.1333333333291666e+01 2309 1129 2.1333333333343749e+01 2309 1453 1.0416666666666666e-10 2309 2149 -2.1333333333291666e+01 2309 2147 1.5999999999979167e+01 2309 1450 -5.3333333333124999e+00 2309 1461 1.0666666666677083e+01 2310 2310 3.2000000000208331e+01 2311 2311 6.4000000000291664e+01 2311 1369 -1.1000665323307010e-27 2311 1365 1.3233141685082473e-27 2311 1367 -2.1333333333291666e+01 2311 1366 2.1333333333343749e+01 2311 2313 -2.1333333333291666e+01 2311 1094 1.0416666666666666e-10 2311 2314 2.1333333333291666e+01 2312 2312 3.2000000000208331e+01 2313 2313 6.4000000000291664e+01 2313 1361 -5.3333333333124999e+00 2313 1098 -1.1213657767716683e-27 2313 2303 -2.1333333333291666e+01 2313 2302 1.5999999999979167e+01 2313 1094 -2.1333333333291666e+01 2313 1367 1.0416666666666666e-10 2313 2311 -2.1333333333291666e+01 2313 1366 -5.3333333333124999e+00 2313 1365 1.0666666666677083e+01 2314 2314 6.4000000000291664e+01 2314 1366 5.3333333333124999e+00 2314 1099 -1.1000665323307010e-27 2314 1367 -1.0416666666666666e-10 2314 2262 2.1333333333291666e+01 2314 1358 5.3333333333124999e+00 2314 2261 -1.5999999999979167e+01 2314 1369 -1.0666666666677083e+01 2314 2311 2.1333333333291666e+01 2314 1094 2.1333333333291666e+01 2315 2315 4.2666666667333324e+01 2315 1614 6.2499999999999991e-11 2315 1613 -4.1666666666666665e-11 2315 1524 6.2499999999999991e-11 2315 1522 -4.1666666666666665e-11 2315 1223 -1.0416666666666666e-11 2315 1228 6.2499999999999991e-11 2315 1226 -4.1666666666666665e-11 2315 1993 1.0666666666583334e+01 2315 1991 1.0666666666666666e+01 2315 1612 -1.0416666666666666e-11 2315 2096 1.0666666666583334e+01 2315 2095 1.0666666666666666e+01 2315 115 -1.0416666666666666e-11 2315 221 -1.0416666666666666e-11 2315 112 -1.0416666666666666e-11 2315 116 6.2499999999999991e-11 2315 114 -4.1666666666666665e-11 2315 817 1.0666666666583334e+01 2315 815 -1.0666666666666666e+01 2315 441 -1.0416666666666666e-11 2315 818 1.0666666666583334e+01 2315 814 -1.0666666666666666e+01 2315 4068 -1.0416666666666666e-11 2315 4316 -1.0416666666666666e-11 2316 2316 4.2666666667333331e+01 2316 1689 6.2499999999999991e-11 2316 1691 -4.1666666666666665e-11 2316 2321 1.0666666666583334e+01 2316 2319 -1.0666666666666666e+01 2316 1191 -1.0416666666666666e-11 2316 1220 -1.0416666666666666e-11 2316 1227 6.2499999999999991e-11 2316 1226 -4.1666666666666665e-11 2316 2088 -1.0666666666583334e+01 2316 2090 1.0666666666666666e+01 2316 1523 6.2499999999999991e-11 2316 1522 -4.1666666666666665e-11 2316 1992 -1.0666666666583334e+01 2316 1991 1.0666666666666666e+01 2316 1195 6.2499999999999991e-11 2316 1196 -4.1666666666666665e-11 2316 2320 1.0666666666583334e+01 2316 2317 -1.0666666666666666e+01 2316 4071 -1.0416666666666666e-11 2316 4356 -1.0416666666666666e-11 2316 4316 -1.0416666666666666e-11 2316 4068 -1.0416666666666666e-11 2317 2317 4.2666666666916662e+01 2317 1689 -5.3333333333229165e+00 2317 2318 -1.0666666666666666e+01 2317 1691 1.0666666666687499e+01 2317 2320 -2.1333333333312499e+01 2317 2316 -1.0666666666666666e+01 2317 1195 -5.3333333333229165e+00 2317 1196 1.0666666666687499e+01 2318 2318 6.4000000000583327e+01 2318 1146 1.5999999999958334e+01 2318 1691 5.3333333332916668e+00 2318 1196 -4.1666666666666665e-11 2318 1754 1.0666666666666666e+01 2318 2317 -1.0666666666666666e+01 2318 108 -5.3333333333229165e+00 2318 825 -3.2000000000020833e+01 2318 813 -2.1333333333208333e+01 2318 4355 -5.3333333332812494e+00 2319 2319 4.2666666666916662e+01 2319 1691 1.0666666666687499e+01 2319 1522 1.0666666666687499e+01 2319 1523 -5.3333333333229165e+00 2319 2321 -2.1333333333312499e+01 2319 2316 -1.0666666666666666e+01 2319 1689 -5.3333333333229165e+00 2319 4356 6.2500000000000004e-11 2319 4355 -5.3333333333229165e+00 2319 4071 6.2500000000000004e-11 2319 5059 -2.1333333333312499e+01 2319 813 -1.0666666666666666e+01 2319 4073 -5.3333333333229165e+00 2320 2320 6.4000000000416662e+01 2320 1691 -5.3333333333124999e+00 2320 1194 -5.3333333333124999e+00 2320 1984 -2.1333333333312499e+01 2320 1979 1.0666666666583334e+01 2320 1689 2.1333333333312499e+01 2320 2317 -2.1333333333312499e+01 2320 2316 1.0666666666583334e+01 2320 1195 2.1333333333312499e+01 2320 1196 -5.3333333333124999e+00 2320 4364 -5.3333333333124999e+00 2321 2321 6.4000000000416662e+01 2321 1522 -5.3333333333124999e+00 2321 2319 -2.1333333333312499e+01 2321 2316 1.0666666666583334e+01 2321 1691 -5.3333333333124999e+00 2321 1689 2.1333333333312499e+01 2321 1979 1.0666666666583334e+01 2321 1523 2.1333333333312499e+01 2321 4356 -1.0666666666583334e+01 2321 4364 -5.3333333333124999e+00 2321 4706 -2.1333333333312499e+01 2321 4071 -1.0666666666583334e+01 2321 4060 -5.3333333333124999e+00 2322 2322 8.5333333333833338e+01 2322 1601 5.3333333333229165e+00 2322 1769 3.2000000000020833e+01 2322 1773 -2.1333333333208333e+01 2322 1598 5.3333333333229165e+00 2322 1599 -3.1999999999958334e+01 2322 2005 3.2000000000020833e+01 2322 2004 -2.1333333333208333e+01 2322 1211 5.3333333332812494e+00 2322 1216 -1.0666666666625000e+01 2322 4320 5.3333333332812494e+00 2322 4254 2.1333333333312499e+01 2322 4317 -1.4583333333333335e-10 2323 2323 7.4666666667125000e+01 2323 1528 -5.3333333332812494e+00 2323 2009 -2.1333333333291666e+01 2323 2005 1.0666666666583334e+01 2323 1601 -5.3333333333229165e+00 2323 1530 2.1333333333333332e+01 2323 4254 3.2000000000000000e+01 2323 4250 -5.3333333333124999e+00 2323 4980 -2.1333333333312499e+01 2323 4982 1.0666666666583334e+01 2323 4308 -5.3333333333124999e+00 2324 2324 4.2666666666916669e+01 2325 2325 4.2666666666916662e+01 2325 1532 -5.3333333333229165e+00 2325 1547 1.0666666666687499e+01 2325 2326 -1.0666666666666666e+01 2325 2129 -2.1333333333312499e+01 2325 2128 1.0666666666666666e+01 2325 1604 1.0666666666687499e+01 2325 1603 -5.3333333333229165e+00 2326 2326 6.4000000000583327e+01 2326 1533 -5.3333333332812494e+00 2326 2006 -3.2000000000020833e+01 2326 2004 2.1333333333208333e+01 2326 1601 -5.3333333333229165e+00 2326 1547 5.3333333332916668e+00 2326 1604 -4.1666666666666665e-11 2326 2325 -1.0666666666666666e+01 2326 1599 1.5999999999958334e+01 2326 2070 1.0666666666666666e+01 2327 2327 3.2000000000208331e+01 2328 2328 4.2666666666916662e+01 2328 1549 -5.3333333333229165e+00 2328 1564 1.0666666666687499e+01 2328 2329 -1.0666666666666666e+01 2328 2191 -2.1333333333312499e+01 2328 2190 1.0666666666666666e+01 2328 1655 1.0666666666687499e+01 2328 1654 -5.3333333333229165e+00 2329 2329 6.4000000000583327e+01 2329 1550 -5.3333333332812494e+00 2329 2022 -3.2000000000020833e+01 2329 2020 2.1333333333208333e+01 2329 1445 -5.3333333333229165e+00 2329 1564 5.3333333332916668e+00 2329 1655 -4.1666666666666665e-11 2329 2328 -1.0666666666666666e+01 2329 1443 1.5999999999958334e+01 2329 2234 1.0666666666666666e+01 2330 2330 3.2000000000208331e+01 2331 2331 3.2000000000208331e+01 2332 2332 3.2000000000208331e+01 hypre-2.33.0/src/test/TEST_ams/mfem.A.00002000066400000000000000000020632521477326011500176210ustar00rootroot000000000000002333 3709 2333 3709 2333 2333 1.6006250000000001e+01 2334 2334 3.7343750000291664e+01 2335 2335 6.4049999999999997e+01 2335 3049 5.3312499999999998e+00 2335 3114 5.3312499999999998e+00 2335 3054 -1.0416666666666664e-02 2335 3055 2.1329166666666662e+01 2335 3421 -5.3312499999999998e+00 2335 2338 -1.0667708333333334e+01 2335 3052 -1.0416666666666664e-02 2335 3053 2.1329166666666662e+01 2335 3090 -5.3312499999999998e+00 2335 2337 -1.0661458333333334e+01 2335 2336 -1.0667708333333334e+01 2335 3028 1.0416666666666664e-02 2335 3048 -2.1329166666666662e+01 2336 2336 4.8006250000249999e+01 2336 2350 -5.3333333333437496e+00 2336 3096 1.0666666666791667e+01 2336 3095 -1.0666666666625000e+01 2336 2349 -1.0666666666645833e+01 2336 3050 1.0666666666625000e+01 2336 3117 -5.3333333333229165e+00 2336 3048 1.3552527156068805e-19 2336 3049 -2.4000000000010417e+01 2336 3053 1.3552527156068805e-19 2336 3052 -1.0667708333333334e+01 2336 3090 1.3333333333322916e+01 2336 2335 -1.0667708333333334e+01 2336 2337 -8.0000000000000000e+00 2336 4760 5.3333333333020834e+00 2337 2337 5.8722916666833335e+01 2337 3117 6.2499999999999991e-11 2337 2349 4.1666666666666665e-11 2337 3116 -1.0662499999958333e+01 2337 2348 -1.0666666666666666e+01 2337 3095 -1.0416666666666666e-11 2337 3635 -1.0416666666666667e-03 2337 3263 -5.3302083333333332e+00 2337 2344 2.0833333333333337e-03 2337 3115 -1.0683333333333334e+01 2337 3269 -5.3302083333333332e+00 2337 3054 5.3312499999999998e+00 2337 3114 1.3327083333333333e+01 2337 2338 -1.3328124999999998e+01 2337 3112 -6.2500000000000003e-03 2337 3491 1.0416666666666667e-03 2337 2340 4.1666666666666666e-03 2337 3113 2.1326041666666665e+01 2337 2343 -1.5994791666666666e+01 2337 3053 -2.1334374999999998e+01 2337 3052 5.3312499999999998e+00 2337 3090 -2.6635416666250000e+00 2337 2335 -1.0661458333333334e+01 2337 2336 -8.0000000000000000e+00 2337 4763 -1.0416666666666666e-11 2338 2338 4.8031250000000000e+01 2338 3438 5.3322916666666664e+00 2338 3423 1.0662499999999998e+01 2338 3268 -5.3302083333333332e+00 2338 2345 -1.0664583333333335e+01 2338 3115 1.0662500000000000e+01 2338 3269 1.0679166666666665e+01 2338 2344 -5.3343749999999996e+00 2338 3053 -1.3552527156068805e-19 2338 2337 -1.3328124999999998e+01 2338 3114 -2.4001041666666666e+01 2338 3055 1.3552527156068805e-19 2338 3054 -1.0667708333333334e+01 2338 3421 1.3332291666666665e+01 2338 2335 -1.0667708333333334e+01 2339 2339 2.6693749999999998e+01 2340 2340 4.2704166666666666e+01 2340 2348 -1.0664583333333333e+01 2340 3635 1.5995833333333334e+01 2340 3630 1.5995833333333334e+01 2340 3492 -5.3312499999999998e+00 2340 3116 -5.3312499999999998e+00 2340 3491 4.1666666666666666e-03 2340 2337 4.1666666666666657e-03 2340 3113 5.3312499999999998e+00 2340 3112 -1.0668750000000001e+01 2340 2343 -1.0668750000000001e+01 2340 3498 -1.0668750000000001e+01 2340 4791 -1.0662500000000000e+01 2340 4782 -1.0662500000000000e+01 2340 4786 1.0683333333333334e+01 2340 4152 -1.0672916666666666e+01 2341 2341 3.2024999999999999e+01 2342 2342 3.2045833333333334e+01 2343 2343 6.4049999999999997e+01 2343 3498 5.3322916666666664e+00 2343 3492 3.2000000000000000e+01 2343 3180 -1.0662500000000000e+01 2343 2347 -5.3343749999999996e+00 2343 3171 1.0679166666666665e+01 2343 3170 -5.3302083333333332e+00 2343 3487 -2.1331249999999997e+01 2343 3268 -5.3302083333333332e+00 2343 2345 -1.0660416666666666e+01 2343 3115 1.0662500000000000e+01 2343 3263 1.0679166666666665e+01 2343 2344 -5.3343749999999996e+00 2343 3491 -6.2500000000000003e-03 2343 3113 -3.1999999999999996e+01 2343 3112 5.3322916666666664e+00 2343 2337 -1.5994791666666666e+01 2343 2340 -1.0668750000000001e+01 2344 2344 2.1349999999999998e+01 2344 3423 5.3322916666666664e+00 2344 3268 -2.0833333333333346e-03 2344 3487 -5.3322916666666664e+00 2344 2345 -1.0672916666666666e+01 2344 3263 5.3343749999999996e+00 2344 3113 5.3322916666666664e+00 2344 2343 -5.3343749999999996e+00 2344 3269 5.3343749999999996e+00 2344 2337 2.0833333333333337e-03 2344 3114 5.3322916666666664e+00 2344 3115 -1.0672916666666666e+01 2344 2338 -5.3343749999999996e+00 2345 2345 5.3383333333333326e+01 2345 3171 -1.0662500000000000e+01 2345 3172 -1.0662500000000000e+01 2345 3170 1.0683333333333334e+01 2345 2347 -1.0672916666666666e+01 2345 3489 1.5995833333333334e+01 2345 3421 -5.3312499999999998e+00 2345 3438 -1.0668750000000001e+01 2345 3269 -1.0662500000000000e+01 2345 2338 -1.0664583333333335e+01 2345 3423 -1.5995833333333334e+01 2345 3263 -1.0662500000000000e+01 2345 3487 3.1995833333333334e+01 2345 3268 1.0683333333333334e+01 2345 2343 -1.0660416666666666e+01 2345 2344 -1.0672916666666666e+01 2346 2346 3.2024999999999999e+01 2347 2347 2.1349999999999998e+01 2347 3492 -5.3322916666666664e+00 2347 3180 1.0672916666666666e+01 2347 2343 -5.3343749999999996e+00 2347 3171 5.3343749999999996e+00 2347 3487 -5.3322916666666664e+00 2347 3170 -2.0833333333333346e-03 2347 3172 5.3343749999999996e+00 2347 3489 -5.3322916666666664e+00 2347 2345 -1.0672916666666666e+01 2348 2348 5.3358333333458326e+01 2348 3635 -1.0662499999999998e+01 2348 2340 -1.0664583333333333e+01 2348 3116 2.1332291666656246e+01 2348 3117 -5.3333333333229165e+00 2348 2337 -1.0666666666666666e+01 2348 2349 -1.0666666666687499e+01 2348 3112 5.3322916666666664e+00 2348 4765 -5.3333333333229165e+00 2348 4786 -5.3302083333333332e+00 2348 4794 3.2001041666656249e+01 2348 4792 -1.0662500000000000e+01 2348 4791 1.0679166666666665e+01 2348 4152 -5.3343749999999996e+00 2348 4763 6.2500000000000004e-11 2349 2349 4.2666666667041667e+01 2349 3096 -1.0666666666625000e+01 2349 2336 -1.0666666666645833e+01 2349 3095 1.5999999999958334e+01 2349 3705 -1.0666666666625000e+01 2349 2350 -1.0666666666729165e+01 2349 2337 4.1666666666666665e-11 2349 3116 -5.3333333333124999e+00 2349 3117 1.0666666666687499e+01 2349 2348 -1.0666666666687499e+01 2349 3090 -5.3333333333124999e+00 2349 4794 -5.3333333333124999e+00 2349 4760 -1.0666666666833333e+01 2349 4764 1.5999999999958334e+01 2349 4765 1.0666666666687499e+01 2349 4763 -4.1666666666666665e-11 2350 2350 2.1333333333499997e+01 2350 2336 -5.3333333333437496e+00 2350 3096 5.3333333333437496e+00 2350 3095 -5.3333333333229165e+00 2350 3705 5.3333333333437496e+00 2350 2349 -1.0666666666729165e+01 2350 3049 5.3333333333229165e+00 2350 3050 -1.0666666666729165e+01 2350 4760 2.0833333333333345e-11 2350 4764 -5.3333333333229165e+00 2351 2351 3.2000000000249997e+01 2352 2352 1.6006250000000001e+01 2353 2353 3.2020833333333336e+01 2354 2354 6.4049999999999997e+01 2354 3442 -5.3312499999999998e+00 2354 3043 -1.0416666666666664e-02 2354 3407 5.3312499999999998e+00 2354 2362 -1.0667708333333334e+01 2354 3042 2.1329166666666662e+01 2354 2360 -1.0661458333333334e+01 2354 3399 -5.3312499999999998e+00 2354 3041 -1.0416666666666664e-02 2354 3035 5.3312499999999998e+00 2354 2359 -1.0667708333333334e+01 2354 3038 -2.1329166666666662e+01 2354 3030 1.0416666666666664e-02 2354 3040 2.1329166666666662e+01 2355 2355 1.6006250000000001e+01 2356 2356 3.2020833333333336e+01 2357 2357 6.4049999999999997e+01 2357 3481 -5.3312499999999998e+00 2357 3480 -1.0416666666666664e-02 2357 3412 -5.3312499999999998e+00 2357 2363 -1.0667708333333334e+01 2357 3411 -2.1329166666666662e+01 2357 2360 -1.0661458333333334e+01 2357 3407 5.3312499999999998e+00 2357 3444 1.0416666666666664e-02 2357 3442 -5.3312499999999998e+00 2357 2362 -1.0667708333333334e+01 2357 3478 -2.1329166666666662e+01 2357 3476 1.0416666666666664e-02 2357 3479 2.1329166666666662e+01 2358 2358 3.2020833333333336e+01 2359 2359 3.2012500000000003e+01 2359 3042 -1.3552527156068805e-19 2359 3038 -1.3552527156068805e-19 2359 3041 -1.0667708333333334e+01 2359 2354 -1.0667708333333334e+01 2359 3039 1.0842021724855044e-19 2359 3035 -5.3333333333333330e+00 2359 3409 -1.0842021724855044e-19 2359 3404 1.0667708333333334e+01 2359 3399 5.3333333333333330e+00 2359 2361 -1.0667708333333334e+01 2359 2360 -5.3333333333333330e+00 2360 2360 6.4041666666666671e+01 2360 3412 5.3395833333333327e+00 2360 2363 -5.3333333333333330e+00 2360 3409 2.1334374999999998e+01 2360 2361 -1.0661458333333332e+01 2360 3480 5.3312499999999998e+00 2360 3411 2.1334374999999998e+01 2360 2357 -1.0661458333333334e+01 2360 3444 -5.3312499999999998e+00 2360 3043 5.3312499999999998e+00 2360 3407 -5.3395833333333327e+00 2360 2362 -5.3333333333333330e+00 2360 3042 -2.1334374999999998e+01 2360 2354 -1.0661458333333334e+01 2360 3041 5.3312499999999998e+00 2360 3404 -5.3312499999999998e+00 2360 3399 5.3395833333333327e+00 2360 2359 -5.3333333333333330e+00 2360 666 5.3312499999999998e+00 2360 885 -5.3312499999999998e+00 2360 665 -2.1334374999999998e+01 2360 664 5.3312499999999998e+00 2360 884 5.3395833333333327e+00 2360 243 -1.0661458333333334e+01 2360 245 -5.3333333333333330e+00 2361 2361 6.4049999999999997e+01 2361 3409 -2.1329166666666666e+01 2361 2360 -1.0661458333333332e+01 2361 3039 -2.1329166666666666e+01 2361 3035 5.3312499999999998e+00 2361 3404 1.0416666666666664e-02 2361 3399 -5.3312499999999998e+00 2361 2359 -1.0667708333333334e+01 2361 884 -5.3312499999999998e+00 2361 885 1.0416666666666664e-02 2361 883 -5.3312499999999998e+00 2361 245 -1.0667708333333334e+01 2361 937 -2.1329166666666662e+01 2361 933 1.0416666666666664e-02 2362 2362 3.2012500000000003e+01 2362 3411 1.3552527156068805e-19 2362 3478 -1.3552527156068805e-19 2362 3444 1.0667708333333334e+01 2362 2357 -1.0667708333333334e+01 2362 3040 -1.3552527156068805e-19 2362 3442 5.3333333333333330e+00 2362 3042 1.3552527156068805e-19 2362 3043 -1.0667708333333334e+01 2362 3407 -5.3333333333333330e+00 2362 2354 -1.0667708333333334e+01 2362 2360 -5.3333333333333330e+00 2363 2363 3.2012500000000003e+01 2363 2360 -5.3333333333333330e+00 2363 3412 5.3333333333333330e+00 2363 3481 5.3333333333333330e+00 2363 3479 -1.0842021724855044e-19 2363 3411 -1.0842021724855044e-19 2363 3480 -1.0667708333333334e+01 2363 2357 -1.0667708333333334e+01 2363 665 -1.3552527156068805e-19 2363 662 -1.3552527156068805e-19 2363 666 -1.0667708333333334e+01 2363 243 -1.0667708333333334e+01 2364 2364 3.2012500000000003e+01 2364 3415 -1.3552527156068805e-19 2364 3037 1.0842021724855044e-19 2364 3045 1.0842021724855044e-19 2364 3044 -1.0667708333333334e+01 2364 3401 5.3333333333333330e+00 2364 2368 -1.0667708333333334e+01 2364 2367 -5.3333333333333330e+00 2364 3036 -1.3552527156068805e-19 2364 3398 1.0667708333333334e+01 2364 3035 -5.3333333333333330e+00 2364 2366 -1.0667708333333334e+01 2365 2365 3.2020833333333336e+01 2366 2366 6.4049999999999997e+01 2366 3036 -2.1329166666666666e+01 2366 3416 -2.1329166666666666e+01 2366 3401 -5.3312499999999998e+00 2366 3461 -5.3312499999999998e+00 2366 3414 -1.0416666666666664e-02 2366 3415 2.1329166666666662e+01 2366 3464 -5.3312499999999998e+00 2366 2367 -1.0661458333333334e+01 2366 2371 -1.0667708333333334e+01 2366 3398 1.0416666666666664e-02 2366 3035 5.3312499999999998e+00 2366 2364 -1.0667708333333334e+01 2366 936 1.0416666666666664e-02 2367 2367 5.3354166666874995e+01 2367 3096 2.2851328271989659e-27 2367 3463 3.6295685768920020e-28 2367 3466 1.0666666666562499e+01 2367 2375 -1.0666666666666666e+01 2367 3398 -5.3312499999999998e+00 2367 3047 5.3312499999999998e+00 2367 3091 -2.6635416666145835e+00 2367 2373 -8.0000000000000000e+00 2367 3415 -2.1334374999999998e+01 2367 3414 5.3312499999999998e+00 2367 3464 -2.6635416666145835e+00 2367 2366 -1.0661458333333334e+01 2367 2371 -8.0000000000000000e+00 2367 3045 -2.1334374999999998e+01 2367 3044 5.3312499999999998e+00 2367 3401 5.3395833333333327e+00 2367 2368 -1.0661458333333334e+01 2367 2364 -5.3333333333333330e+00 2368 2368 6.4049999999999997e+01 2368 3091 -5.3312499999999998e+00 2368 3047 -1.0416666666666664e-02 2368 3049 5.3312499999999998e+00 2368 2373 -1.0667708333333334e+01 2368 3035 5.3312499999999998e+00 2368 3046 2.1329166666666662e+01 2368 3032 1.0416666666666664e-02 2368 3037 -2.1329166666666662e+01 2368 3044 -1.0416666666666664e-02 2368 3045 2.1329166666666662e+01 2368 3401 -5.3312499999999998e+00 2368 2367 -1.0661458333333334e+01 2368 2364 -1.0667708333333334e+01 2369 2369 1.6006250000000001e+01 2370 2370 3.7343750000291664e+01 2371 2371 3.7339583333437503e+01 2371 3466 2.0194839173657902e-27 2371 3470 -2.0194839173657902e-27 2371 2375 -5.3333333333229165e+00 2371 3463 -5.3333333333229165e+00 2371 3416 1.3552527156068805e-19 2371 3461 1.3333333333343749e+01 2371 3415 1.3552527156068805e-19 2371 3414 -1.0667708333333334e+01 2371 3464 8.0000000000000000e+00 2371 2366 -1.0667708333333334e+01 2371 2367 -8.0000000000000000e+00 2372 2372 3.7343750000291664e+01 2373 2373 3.7339583333437503e+01 2373 3050 2.0194839173657902e-27 2373 3466 -2.0194839173657902e-27 2373 2375 -5.3333333333229165e+00 2373 3096 -5.3333333333229165e+00 2373 3045 -1.3552527156068805e-19 2373 2367 -8.0000000000000000e+00 2373 3091 8.0000000000000000e+00 2373 3046 1.3552527156068805e-19 2373 3047 -1.0667708333333334e+01 2373 3049 -1.3333333333343749e+01 2373 2368 -1.0667708333333334e+01 2374 2374 2.1333333333437498e+01 2375 2375 4.2666666667166666e+01 2375 3705 -6.2499999999999991e-11 2375 3050 -1.0666666666729165e+01 2375 3049 5.3333333332812494e+00 2375 3091 -2.2470898404921788e-28 2375 3096 -6.2500000000000004e-11 2375 2373 -5.3333333333229165e+00 2375 3464 -2.0194839173657902e-27 2375 3466 -1.0666666666666666e+01 2375 2367 -1.0666666666666666e+01 2375 3463 -6.2499999999999991e-11 2375 3461 -5.3333333332812494e+00 2375 2371 -5.3333333333229165e+00 2375 3470 -1.0666666666729165e+01 2375 3707 -6.2500000000000004e-11 2375 3706 1.0666666666666666e+01 2376 2376 2.1333333333541667e+01 2377 2377 2.1333333333437498e+01 2378 2378 3.2012500000000003e+01 2378 3041 1.3552527156068805e-19 2378 3044 -1.3552527156068805e-19 2378 2389 -5.3333333333333330e+00 2378 3035 5.3333333333333330e+00 2378 3032 -1.3552527156068805e-19 2378 3037 1.0667708333333334e+01 2378 2381 -1.0667708333333334e+01 2378 3030 1.3552527156068805e-19 2378 2380 -1.0667708333333334e+01 2378 2379 -5.3333333333333330e+00 2378 3038 1.0667708333333334e+01 2379 2379 6.4041666666666671e+01 2379 3040 5.3312499999999998e+00 2379 3436 5.3312499999999998e+00 2379 2403 -5.3333333333333330e+00 2379 3034 2.1334374999999998e+01 2379 3437 5.3312499999999998e+00 2379 2395 -1.0661458333333334e+01 2379 3055 5.3312499999999998e+00 2379 2396 -5.3333333333333330e+00 2379 3028 2.1334374999999998e+01 2379 3048 -5.3312499999999998e+00 2379 2383 -1.0661458333333334e+01 2379 3046 5.3312499999999998e+00 2379 2382 -5.3333333333333330e+00 2379 3032 2.1334374999999998e+01 2379 3037 -5.3312499999999998e+00 2379 2381 -1.0661458333333334e+01 2379 3030 2.1334374999999998e+01 2379 2380 -1.0661458333333334e+01 2379 3038 -5.3312499999999998e+00 2379 2378 -5.3333333333333330e+00 2380 2380 6.4049999999999997e+01 2380 3040 -1.0416666666666664e-02 2380 3442 5.3312499999999998e+00 2380 2403 -1.0667708333333334e+01 2380 3043 2.1329166666666662e+01 2380 3407 -5.3312499999999998e+00 2380 2397 -1.0661458333333334e+01 2380 3042 -1.0416666666666664e-02 2380 3399 5.3312499999999998e+00 2380 2390 -1.0667708333333334e+01 2380 3041 2.1329166666666662e+01 2380 3035 -5.3312499999999998e+00 2380 2389 -1.0661458333333334e+01 2380 3038 1.0416666666666664e-02 2380 3030 -2.1329166666666662e+01 2380 2379 -1.0661458333333334e+01 2380 2378 -1.0667708333333334e+01 2381 2381 6.4049999999999997e+01 2381 3091 5.3312499999999998e+00 2381 3047 2.1329166666666662e+01 2381 3049 -5.3312499999999998e+00 2381 2385 -1.0661458333333334e+01 2381 3045 -1.0416666666666664e-02 2381 3401 5.3312499999999998e+00 2381 2402 -1.0667708333333334e+01 2381 3044 2.1329166666666662e+01 2381 2389 -1.0661458333333334e+01 2381 3035 -5.3312499999999998e+00 2381 3046 -1.0416666666666664e-02 2381 2382 -1.0667708333333334e+01 2381 3037 1.0416666666666664e-02 2381 3032 -2.1329166666666662e+01 2381 2379 -1.0661458333333334e+01 2381 2378 -1.0667708333333334e+01 2382 2382 3.2012500000000003e+01 2382 3047 1.3552527156068805e-19 2382 3052 -1.0842021724855044e-19 2382 2385 -5.3333333333333330e+00 2382 3049 5.3333333333333330e+00 2382 3028 -1.0842021724855044e-19 2382 3048 1.0667708333333334e+01 2382 2383 -1.0667708333333334e+01 2382 3032 1.3552527156068805e-19 2382 2381 -1.0667708333333334e+01 2382 2379 -5.3333333333333330e+00 2382 3046 -1.0667708333333334e+01 2383 2383 6.4049999999999997e+01 2383 3049 -5.3312499999999998e+00 2383 3114 -5.3312499999999998e+00 2383 3055 -1.0416666666666664e-02 2383 3054 2.1329166666666662e+01 2383 3421 5.3312499999999998e+00 2383 2393 -1.0661458333333334e+01 2383 2396 -1.0667708333333334e+01 2383 3053 -1.0416666666666664e-02 2383 3052 2.1329166666666662e+01 2383 3090 5.3312499999999998e+00 2383 2385 -1.0661458333333334e+01 2383 2388 -1.0667708333333334e+01 2383 3048 1.0416666666666664e-02 2383 3028 -2.1329166666666662e+01 2383 2379 -1.0661458333333334e+01 2383 2382 -1.0667708333333334e+01 2384 2384 3.2012500000000003e+01 2384 3108 1.0842021724855044e-19 2384 3109 -1.3552527156068805e-19 2384 2399 -5.3333333333333330e+00 2384 3097 5.3333333333333330e+00 2384 3094 -1.3552527156068805e-19 2384 3102 1.0667708333333334e+01 2384 2387 -1.0667708333333334e+01 2384 3092 1.0842021724855044e-19 2384 2386 -1.0667708333333334e+01 2384 2385 -5.3333333333333330e+00 2384 3103 1.0667708333333334e+01 2384 3093 -5.3333333333333330e+00 2385 2385 6.4041666666666671e+01 2385 3105 5.3312499999999998e+00 2385 3045 5.3312499999999998e+00 2385 3091 -5.3395833333333327e+00 2385 2402 -5.3333333333333330e+00 2385 3047 -2.1334374999999998e+01 2385 3046 5.3312499999999998e+00 2385 2381 -1.0661458333333334e+01 2385 3048 -5.3312499999999998e+00 2385 3049 5.3395833333333327e+00 2385 2382 -5.3333333333333330e+00 2385 3052 -2.1334374999999998e+01 2385 3053 5.3312499999999998e+00 2385 2383 -1.0661458333333334e+01 2385 3110 5.3312499999999998e+00 2385 3090 -5.3395833333333327e+00 2385 2388 -5.3333333333333330e+00 2385 3094 2.1334374999999998e+01 2385 3102 -5.3312499999999998e+00 2385 2387 -1.0661458333333334e+01 2385 3092 2.1334374999999998e+01 2385 2386 -1.0661458333333334e+01 2385 3103 -5.3312499999999998e+00 2385 3093 -5.3395833333333327e+00 2385 2384 -5.3333333333333330e+00 2386 2386 6.4049999999999997e+01 2386 3458 5.3312499999999998e+00 2386 3108 2.1329166666666662e+01 2386 3097 -5.3312499999999998e+00 2386 2399 -1.0661458333333334e+01 2386 3091 5.3312499999999998e+00 2386 3105 -1.0416666666666664e-02 2386 3401 5.3312499999999998e+00 2386 2402 -1.0667708333333334e+01 2386 3107 -1.0416666666666664e-02 2386 3106 2.1329166666666662e+01 2386 3402 5.3312499999999998e+00 2386 2389 -1.0661458333333334e+01 2386 2401 -1.0667708333333334e+01 2386 3103 1.0416666666666664e-02 2386 3092 -2.1329166666666662e+01 2386 2385 -1.0661458333333334e+01 2386 3093 5.3312499999999998e+00 2386 2384 -1.0667708333333334e+01 2387 2387 6.4049999999999997e+01 2387 3097 -5.3312499999999998e+00 2387 3069 -5.3312499999999998e+00 2387 3111 2.1329166666666662e+01 2387 3114 -5.3312499999999998e+00 2387 2393 -1.0661458333333334e+01 2387 3068 1.0416666666666664e-02 2387 3109 2.1329166666666662e+01 2387 3067 -5.3312499999999998e+00 2387 2399 -1.0661458333333334e+01 2387 2400 -1.0667708333333334e+01 2387 3110 -1.0416666666666664e-02 2387 3090 5.3312499999999998e+00 2387 2388 -1.0667708333333334e+01 2387 3102 1.0416666666666664e-02 2387 3094 -2.1329166666666662e+01 2387 3093 5.3312499999999998e+00 2387 2385 -1.0661458333333334e+01 2387 2384 -1.0667708333333334e+01 2388 2388 3.2012500000000003e+01 2388 3111 1.3552527156068805e-19 2388 3054 -1.3552527156068805e-19 2388 2393 -5.3333333333333330e+00 2388 3114 5.3333333333333330e+00 2388 3052 1.3552527156068805e-19 2388 3053 -1.0667708333333334e+01 2388 2383 -1.0667708333333334e+01 2388 3094 1.3552527156068805e-19 2388 2387 -1.0667708333333334e+01 2388 2385 -5.3333333333333330e+00 2388 3110 -1.0667708333333334e+01 2388 3090 -5.3333333333333330e+00 2389 2389 6.4041666666666671e+01 2389 3045 5.3312499999999998e+00 2389 3105 5.3312499999999998e+00 2389 3401 -5.3395833333333327e+00 2389 2402 -5.3333333333333330e+00 2389 3106 -2.1334374999999998e+01 2389 3107 5.3312499999999998e+00 2389 2386 -1.0661458333333334e+01 2389 3420 5.3312499999999998e+00 2389 3402 -5.3395833333333327e+00 2389 2401 -5.3333333333333330e+00 2389 3400 2.1334374999999998e+01 2389 3406 -5.3312499999999998e+00 2389 2391 -1.0661458333333334e+01 2389 3042 5.3312499999999998e+00 2389 3399 -5.3395833333333327e+00 2389 2390 -5.3333333333333330e+00 2389 3041 -2.1334374999999998e+01 2389 3038 -5.3312499999999998e+00 2389 2380 -1.0661458333333334e+01 2389 3044 -2.1334374999999998e+01 2389 2381 -1.0661458333333334e+01 2389 3037 -5.3312499999999998e+00 2389 3035 5.3395833333333327e+00 2389 2378 -5.3333333333333330e+00 2390 2390 3.2012500000000003e+01 2390 3043 1.3552527156068805e-19 2390 3417 -1.3552527156068805e-19 2390 2397 -5.3333333333333330e+00 2390 3407 5.3333333333333330e+00 2390 3400 -1.3552527156068805e-19 2390 3406 1.0667708333333334e+01 2390 2391 -1.0667708333333334e+01 2390 3041 -1.3552527156068805e-19 2390 2380 -1.0667708333333334e+01 2390 2389 -5.3333333333333330e+00 2390 3042 -1.0667708333333334e+01 2390 3399 -5.3333333333333330e+00 2391 2391 6.4049999999999997e+01 2391 3407 -5.3312499999999998e+00 2391 3458 5.3312499999999998e+00 2391 3420 -1.0416666666666664e-02 2391 3402 5.3312499999999998e+00 2391 2401 -1.0667708333333334e+01 2391 3419 2.1329166666666662e+01 2391 2399 -1.0661458333333334e+01 2391 3445 -5.3312499999999998e+00 2391 3418 -1.0416666666666664e-02 2391 3417 2.1329166666666662e+01 2391 3441 5.3312499999999998e+00 2391 2397 -1.0661458333333334e+01 2391 2398 -1.0667708333333334e+01 2391 3406 1.0416666666666664e-02 2391 3400 -2.1329166666666662e+01 2391 3399 5.3312499999999998e+00 2391 2389 -1.0661458333333334e+01 2391 2390 -1.0667708333333334e+01 2392 2392 3.2012500000000003e+01 2392 3432 1.3552527156068805e-19 2392 3435 -1.3552527156068805e-19 2392 2397 -5.3333333333333330e+00 2392 3426 5.3333333333333330e+00 2392 3425 -1.3552527156068805e-19 2392 3429 1.0667708333333334e+01 2392 2395 -1.0667708333333334e+01 2392 3422 1.3552527156068805e-19 2392 2394 -1.0667708333333334e+01 2392 2393 -5.3333333333333330e+00 2392 3430 1.0667708333333334e+01 2392 3424 -5.3333333333333330e+00 2393 2393 6.4041666666666671e+01 2393 3070 -5.3312499999999998e+00 2393 3068 -5.3312499999999998e+00 2393 3069 5.3395833333333327e+00 2393 2400 -5.3333333333333330e+00 2393 3111 -2.1334374999999998e+01 2393 3110 5.3312499999999998e+00 2393 2387 -1.0661458333333334e+01 2393 3053 5.3312499999999998e+00 2393 3114 5.3395833333333327e+00 2393 2388 -5.3333333333333330e+00 2393 3054 -2.1334374999999998e+01 2393 3055 5.3312499999999998e+00 2393 2383 -1.0661458333333334e+01 2393 3437 5.3312499999999998e+00 2393 3421 -5.3395833333333327e+00 2393 2396 -5.3333333333333330e+00 2393 3425 2.1334374999999998e+01 2393 3429 -5.3312499999999998e+00 2393 2395 -1.0661458333333334e+01 2393 3422 2.1334374999999998e+01 2393 2394 -1.0661458333333334e+01 2393 3430 -5.3312499999999998e+00 2393 3424 -5.3395833333333327e+00 2393 2392 -5.3333333333333330e+00 2394 2394 6.4049999999999997e+01 2394 3069 -5.3312499999999998e+00 2394 3070 1.0416666666666664e-02 2394 3067 -5.3312499999999998e+00 2394 2400 -1.0667708333333334e+01 2394 3434 2.1329166666666662e+01 2394 3445 -5.3312499999999998e+00 2394 2399 -1.0661458333333334e+01 2394 3433 -1.0416666666666664e-02 2394 3441 5.3312499999999998e+00 2394 2398 -1.0667708333333334e+01 2394 3432 2.1329166666666662e+01 2394 3426 -5.3312499999999998e+00 2394 2397 -1.0661458333333334e+01 2394 3430 1.0416666666666664e-02 2394 3422 -2.1329166666666662e+01 2394 2393 -1.0661458333333334e+01 2394 3424 5.3312499999999998e+00 2394 2392 -1.0667708333333334e+01 2395 2395 6.4049999999999997e+01 2395 3034 -2.1329166666666662e+01 2395 2379 -1.0661458333333334e+01 2395 3436 -1.0416666666666664e-02 2395 3442 5.3312499999999998e+00 2395 2403 -1.0667708333333334e+01 2395 3435 2.1329166666666662e+01 2395 2397 -1.0661458333333334e+01 2395 3426 -5.3312499999999998e+00 2395 3437 -1.0416666666666664e-02 2395 3421 5.3312499999999998e+00 2395 2396 -1.0667708333333334e+01 2395 3429 1.0416666666666664e-02 2395 3425 -2.1329166666666662e+01 2395 3424 5.3312499999999998e+00 2395 2393 -1.0661458333333334e+01 2395 2392 -1.0667708333333334e+01 2396 2396 3.2012500000000003e+01 2396 3034 -1.3552527156068805e-19 2396 3028 1.3552527156068805e-19 2396 2379 -5.3333333333333330e+00 2396 3054 1.3552527156068805e-19 2396 3055 -1.0667708333333334e+01 2396 2383 -1.0667708333333334e+01 2396 3425 1.3552527156068805e-19 2396 2395 -1.0667708333333334e+01 2396 2393 -5.3333333333333330e+00 2396 3437 -1.0667708333333334e+01 2396 3421 -5.3333333333333330e+00 2397 2397 6.4041666666666671e+01 2397 3436 5.3312499999999998e+00 2397 3040 5.3312499999999998e+00 2397 3442 -5.3395833333333327e+00 2397 2403 -5.3333333333333330e+00 2397 3043 -2.1334374999999998e+01 2397 3042 5.3312499999999998e+00 2397 2380 -1.0661458333333334e+01 2397 3406 -5.3312499999999998e+00 2397 3407 5.3395833333333327e+00 2397 2390 -5.3333333333333330e+00 2397 3417 -2.1334374999999998e+01 2397 3418 5.3312499999999998e+00 2397 2391 -1.0661458333333334e+01 2397 3433 5.3312499999999998e+00 2397 3441 -5.3395833333333327e+00 2397 2398 -5.3333333333333330e+00 2397 3432 -2.1334374999999998e+01 2397 3430 -5.3312499999999998e+00 2397 2394 -1.0661458333333334e+01 2397 3435 -2.1334374999999998e+01 2397 2395 -1.0661458333333334e+01 2397 3429 -5.3312499999999998e+00 2397 3426 5.3395833333333327e+00 2397 2392 -5.3333333333333330e+00 2398 2398 3.2012500000000003e+01 2398 3434 1.0842021724855044e-19 2398 3419 -1.3552527156068805e-19 2398 2399 -5.3333333333333330e+00 2398 3445 5.3333333333333330e+00 2398 3417 1.3552527156068805e-19 2398 3418 -1.0667708333333334e+01 2398 2391 -1.0667708333333334e+01 2398 3432 -1.0842021724855044e-19 2398 2394 -1.0667708333333334e+01 2398 2397 -5.3333333333333330e+00 2398 3433 -1.0667708333333334e+01 2398 3441 -5.3333333333333330e+00 2399 2399 6.4041666666666671e+01 2399 3420 5.3312499999999998e+00 2399 3107 5.3312499999999998e+00 2399 3458 -5.3395833333333327e+00 2399 2401 -5.3333333333333330e+00 2399 3108 -2.1334374999999998e+01 2399 3103 -5.3312499999999998e+00 2399 2386 -1.0661458333333334e+01 2399 3102 -5.3312499999999998e+00 2399 3097 5.3395833333333327e+00 2399 2384 -5.3333333333333330e+00 2399 3109 -2.1334374999999998e+01 2399 3068 -5.3312499999999998e+00 2399 2387 -1.0661458333333334e+01 2399 3070 -5.3312499999999998e+00 2399 3067 5.3395833333333327e+00 2399 2400 -5.3333333333333330e+00 2399 3434 -2.1334374999999998e+01 2399 3433 5.3312499999999998e+00 2399 2394 -1.0661458333333334e+01 2399 3419 -2.1334374999999998e+01 2399 2391 -1.0661458333333334e+01 2399 3418 5.3312499999999998e+00 2399 3445 5.3395833333333327e+00 2399 2398 -5.3333333333333330e+00 2400 2400 3.2012500000000003e+01 2400 3422 -1.3552527156068805e-19 2400 3111 -1.3552527156068805e-19 2400 2393 -5.3333333333333330e+00 2400 3069 5.3333333333333330e+00 2400 3109 1.3552527156068805e-19 2400 3068 1.0667708333333334e+01 2400 2387 -1.0667708333333334e+01 2400 3434 -1.3552527156068805e-19 2400 2394 -1.0667708333333334e+01 2400 2399 -5.3333333333333330e+00 2400 3070 1.0667708333333334e+01 2400 3067 5.3333333333333330e+00 2401 2401 3.2012500000000003e+01 2401 3419 1.3552527156068805e-19 2401 3108 -1.3552527156068805e-19 2401 2399 -5.3333333333333330e+00 2401 3458 -5.3333333333333330e+00 2401 3106 1.3552527156068805e-19 2401 3107 -1.0667708333333334e+01 2401 2386 -1.0667708333333334e+01 2401 3400 1.3552527156068805e-19 2401 2391 -1.0667708333333334e+01 2401 2389 -5.3333333333333330e+00 2401 3420 -1.0667708333333334e+01 2401 3402 -5.3333333333333330e+00 2402 2402 3.2012500000000003e+01 2402 3092 -1.3552527156068805e-19 2402 3047 -1.3552527156068805e-19 2402 2385 -5.3333333333333330e+00 2402 3091 -5.3333333333333330e+00 2402 3044 1.3552527156068805e-19 2402 3045 -1.0667708333333334e+01 2402 2381 -1.0667708333333334e+01 2402 3106 -1.3552527156068805e-19 2402 2386 -1.0667708333333334e+01 2402 2389 -5.3333333333333330e+00 2402 3105 -1.0667708333333334e+01 2402 3401 -5.3333333333333330e+00 2403 2403 3.2012500000000003e+01 2403 3030 -1.0842021724855044e-19 2403 3034 1.3552527156068805e-19 2403 2379 -5.3333333333333330e+00 2403 3435 1.3552527156068805e-19 2403 3436 -1.0667708333333334e+01 2403 2395 -1.0667708333333334e+01 2403 3043 -1.0842021724855044e-19 2403 2380 -1.0667708333333334e+01 2403 2397 -5.3333333333333330e+00 2403 3040 -1.0667708333333334e+01 2403 3442 -5.3333333333333330e+00 2404 2404 5.8710416666666667e+01 2404 3207 -5.3302083333333332e+00 2404 3086 1.0662500000000000e+01 2404 3089 1.0842021724855044e-19 2404 2416 -5.3343749999999996e+00 2404 3060 -1.0679166666666665e+01 2404 3065 2.1331249999999997e+01 2404 3253 5.3302083333333332e+00 2404 2407 -1.0660416666666666e+01 2404 3064 2.4001041666666666e+01 2404 3209 -1.0662500000000000e+01 2404 3063 -1.0679166666666665e+01 2404 2413 -1.3328124999999998e+01 2404 2415 -5.3343749999999996e+00 2404 3081 -1.0842021724855044e-19 2404 3057 1.0667708333333334e+01 2404 3056 2.4001041666666666e+01 2404 2406 -1.0667708333333334e+01 2404 2405 -1.3328124999999998e+01 2405 2405 5.8722916666833335e+01 2405 3661 -1.0416666666666666e-11 2405 3277 1.0416666666666667e-03 2405 3060 5.3302083333333332e+00 2405 2416 2.0833333333333337e-03 2405 3087 2.1326041666666665e+01 2405 3086 -1.0683333333333334e+01 2405 3262 -5.3302083333333332e+00 2405 2411 -1.5994791666666664e+01 2405 3088 -5.3312499999999998e+00 2405 3084 -6.2499999999999991e-11 2405 3474 -1.0416666666666666e-11 2405 3085 2.6635416666250005e+00 2405 2414 -8.0000000000000000e+00 2405 3082 -6.2500000000000003e-03 2405 3623 -1.0416666666666667e-03 2405 2410 4.1666666666666666e-03 2405 3083 1.0662499999958333e+01 2405 2412 -1.0666666666666666e+01 2405 3081 2.1334374999999998e+01 2405 3057 -5.3312499999999998e+00 2405 3056 -1.3327083333333333e+01 2405 2406 -1.0661458333333334e+01 2405 2404 -1.3328124999999998e+01 2405 290 4.1666666666666665e-11 2406 2406 6.4049999999999997e+01 2406 3089 -2.1329166666666666e+01 2406 2413 -1.0661458333333332e+01 2406 3088 1.0416666666666664e-02 2406 2414 -1.0667708333333334e+01 2406 3064 -5.3312499999999998e+00 2406 3085 5.3312499999999998e+00 2406 3057 1.0416666666666664e-02 2406 3081 -2.1329166666666662e+01 2406 3056 -5.3312499999999998e+00 2406 2405 -1.0661458333333334e+01 2406 2404 -1.0667708333333334e+01 2406 946 5.3312499999999998e+00 2406 949 -1.0416666666666664e-02 2406 970 -5.3312499999999998e+00 2406 287 -1.0667708333333334e+01 2406 945 -2.1329166666666662e+01 2406 939 -5.3312499999999998e+00 2406 1208 -1.0661458333333334e+01 2407 2407 5.3383333333333326e+01 2407 3063 1.0662500000000000e+01 2407 3199 -1.0662500000000000e+01 2407 3207 1.0683333333333334e+01 2407 2415 -1.0672916666666666e+01 2407 3278 -5.3312499999999998e+00 2407 3262 -1.0662500000000000e+01 2407 2411 -1.0664583333333335e+01 2407 3254 1.5995833333333334e+01 2407 3060 1.0662500000000000e+01 2407 3065 -3.1995833333333334e+01 2407 3253 -1.0683333333333334e+01 2407 2404 -1.0660416666666666e+01 2407 2416 -1.0672916666666666e+01 2407 3217 -1.5995833333333334e+01 2407 2409 4.1666666666666657e-03 2407 3218 -5.3312499999999998e+00 2407 3255 1.0668750000000001e+01 2407 2408 -1.0664583333333333e+01 2408 2408 5.3370833333333330e+01 2408 3326 -5.3322916666666664e+00 2408 3207 -5.3302083333333332e+00 2408 3209 -1.0662500000000000e+01 2408 3199 1.0679166666666665e+01 2408 2415 -5.3343749999999996e+00 2408 3219 -6.2500000000000003e-03 2408 3214 -3.1999999999999996e+01 2408 3213 -5.3322916666666664e+00 2408 2413 -1.5994791666666666e+01 2408 3217 1.0662499999999998e+01 2408 3218 2.1331249999999997e+01 2408 3255 -5.3322916666666664e+00 2408 2409 -1.0666666666666666e+01 2408 2407 -1.0664583333333333e+01 2408 288 -1.0668750000000001e+01 2409 2409 4.2716666666833326e+01 2409 3325 6.2500000000000003e-03 2409 2410 4.1666666666666666e-03 2409 3326 6.2500000000000003e-03 2409 3219 1.0416666666666667e-03 2409 3254 -1.0416666666666667e-03 2409 3277 1.0416666666666667e-03 2409 3278 -1.0658333333333333e+01 2409 2411 -1.0666666666666666e+01 2409 3255 6.2500000000000003e-03 2409 3217 1.0416666666666667e-03 2409 2407 4.1666666666666666e-03 2409 3218 -1.0658333333333333e+01 2409 2408 -1.0666666666666666e+01 2409 4865 1.0416666666666667e-03 2409 4438 -1.0416666666666666e-11 2409 4889 1.0416666666666667e-03 2409 288 4.1666666666666666e-03 2409 4866 1.0662499999958333e+01 2409 3779 -1.0666666666666666e+01 2409 4433 6.2499999999999991e-11 2409 4432 -1.0416666666666666e-11 2409 3775 4.1666666666666665e-11 2409 4864 -1.0662499999958333e+01 2409 3778 -1.0666666666666666e+01 2410 2410 3.2024999999999999e+01 2410 3623 -4.1666666666666666e-03 2410 2412 -1.0668749999999999e+01 2410 2409 4.1666666666666657e-03 2410 3325 1.0668749999999999e+01 2410 3087 5.3312499999999998e+00 2410 2405 4.1666666666666657e-03 2410 3083 5.3312499999999998e+00 2410 3082 -1.0668750000000001e+01 2410 3277 4.1666666666666666e-03 2410 3278 -5.3312499999999998e+00 2410 2411 -1.0668750000000001e+01 2410 4466 5.3312499999999998e+00 2410 4864 -5.3312499999999998e+00 2410 4865 4.1666666666666666e-03 2410 3777 4.1666666666666657e-03 2410 4464 5.3312499999999998e+00 2410 4463 -1.0668750000000001e+01 2410 3778 -1.0668750000000001e+01 2411 2411 5.3370833333333330e+01 2411 3082 5.3322916666666664e+00 2411 3255 -5.3322916666666664e+00 2411 3087 -3.2000000000000000e+01 2411 3086 1.0662500000000000e+01 2411 2405 -1.5994791666666664e+01 2411 2416 -5.3343749999999996e+00 2411 3262 1.0679166666666665e+01 2411 3254 -1.0662499999999998e+01 2411 3253 5.3302083333333332e+00 2411 2407 -1.0664583333333335e+01 2411 3277 -6.2500000000000003e-03 2411 3278 2.1331249999999997e+01 2411 3325 -5.3322916666666664e+00 2411 2409 -1.0666666666666666e+01 2411 2410 -1.0668750000000001e+01 2412 2412 4.2679166666791659e+01 2412 3623 6.2500000000000003e-03 2412 2410 -1.0668749999999999e+01 2412 3661 6.2500000000000004e-11 2412 3084 5.3333333333229165e+00 2412 3083 -2.1332291666656246e+01 2412 3082 5.3322916666666664e+00 2412 2405 -1.0666666666666666e+01 2412 4463 5.3322916666666664e+00 2412 4466 -2.1332291666656250e+01 2412 4465 5.3333333333229165e+00 2412 3777 -1.0666666666666666e+01 2412 290 -1.0666666666687499e+01 2413 2413 6.4056250000104171e+01 2413 3213 6.2500000000000003e-03 2413 3089 2.1334374999999998e+01 2413 2406 -1.0661458333333332e+01 2413 3057 -5.3312499999999998e+00 2413 3199 -5.3302083333333332e+00 2413 2415 2.0833333333333333e-03 2413 3064 -1.3327083333333333e+01 2413 3209 1.0683333333333334e+01 2413 3063 5.3302083333333332e+00 2413 2404 -1.3328124999999998e+01 2413 3219 1.0416666666666667e-03 2413 3214 2.1326041666666665e+01 2413 2408 -1.5994791666666666e+01 2413 711 5.3333333333124999e+00 2413 1011 -1.0416666666666667e-03 2413 288 4.1666666666666666e-03 2413 710 -2.1333333333343749e+01 2413 709 5.3333333333124999e+00 2413 978 2.6624999999687495e+00 2413 286 -1.0666666666614583e+01 2413 289 -8.0000000000000000e+00 2413 949 5.3312499999999998e+00 2413 970 5.3364583333645825e+00 2413 287 -5.3333333333333330e+00 2414 2414 3.7339583333458336e+01 2414 3474 6.2499999999999991e-11 2414 3088 1.0667708333333334e+01 2414 2406 -1.0667708333333334e+01 2414 3081 1.3552527156068805e-19 2414 3085 -1.3333333333322916e+01 2414 3084 5.3333333333229165e+00 2414 2405 -8.0000000000000000e+00 2414 947 5.3333333333229165e+00 2414 290 -1.0666666666687499e+01 2414 945 -1.3552527156068805e-19 2414 939 1.3333333333322916e+01 2414 1208 -8.0000000000000000e+00 2415 2415 2.1349999999999998e+01 2415 3065 5.3322916666666664e+00 2415 3207 -2.0833333333333342e-03 2415 3217 5.3322916666666664e+00 2415 2407 -1.0672916666666666e+01 2415 3199 5.3343749999999996e+00 2415 3214 5.3322916666666664e+00 2415 2408 -5.3343749999999996e+00 2415 3063 -5.3343749999999996e+00 2415 2413 2.0833333333333337e-03 2415 3064 -5.3322916666666664e+00 2415 3209 1.0672916666666666e+01 2415 2404 -5.3343749999999996e+00 2416 2416 2.1349999999999998e+01 2416 3056 -5.3322916666666664e+00 2416 2405 2.0833333333333337e-03 2416 3087 5.3322916666666664e+00 2416 3086 -1.0672916666666666e+01 2416 2411 -5.3343749999999996e+00 2416 3262 5.3343749999999996e+00 2416 3254 -5.3322916666666664e+00 2416 3253 2.0833333333333342e-03 2416 2404 -5.3343749999999996e+00 2416 3060 -5.3343749999999996e+00 2416 3065 5.3322916666666664e+00 2416 2407 -1.0672916666666666e+01 2417 2417 3.7364583333333336e+01 2417 3230 -5.3281250000000000e+00 2417 3148 -1.4583333333333332e-02 2417 2440 -1.0672916666666666e+01 2417 3227 -5.3281250000000000e+00 2417 3153 2.1684043449710089e-19 2417 3152 5.3322916666666664e+00 2417 2430 6.2499999999999995e-03 2417 3431 4.9904357809065860e-20 2417 3146 5.3322916666666664e+00 2417 2438 6.2499999999999986e-03 2417 3156 1.0842021724855044e-19 2417 2432 -8.0000000000000000e+00 2417 3149 8.0000000000000000e+00 2417 3159 1.0842021724855044e-19 2417 3145 1.0667708333333334e+01 2417 3144 8.0000000000000000e+00 2417 2419 -1.0667708333333334e+01 2417 2418 -8.0000000000000000e+00 2418 2418 5.3381250000000001e+01 2418 3146 2.1705219273391446e-19 2418 3485 1.0416666666666667e-03 2418 3431 1.0657291666666666e+01 2418 2438 -1.0666666666666666e+01 2418 3432 5.3312499999999998e+00 2418 3160 5.3312499999999998e+00 2418 3426 -5.3395833333333327e+00 2418 2434 -5.3333333333333330e+00 2418 3430 2.1334374999999998e+01 2418 2422 -1.0661458333333334e+01 2418 3422 -5.3312499999999998e+00 2418 3428 -6.2499999999999995e-03 2418 3423 1.0416666666666667e-03 2418 2427 4.1666666666666666e-03 2418 3424 -2.6593750000000003e+00 2418 2420 -8.0000000000000000e+00 2418 3159 -2.1334374999999998e+01 2418 3145 -5.3312499999999998e+00 2418 3144 -2.6583333333333332e+00 2418 2419 -1.0661458333333334e+01 2418 2417 -8.0000000000000000e+00 2419 2419 6.4049999999999997e+01 2419 3447 -5.3312499999999998e+00 2419 3162 -1.0416666666666664e-02 2419 3157 -5.3312499999999998e+00 2419 2437 -1.0667708333333334e+01 2419 3426 5.3312499999999998e+00 2419 3160 -1.0416666666666664e-02 2419 3161 2.1329166666666662e+01 2419 3441 -5.3312499999999998e+00 2419 2435 -1.0661458333333334e+01 2419 2434 -1.0667708333333334e+01 2419 3156 -2.1329166666666662e+01 2419 2432 -1.0661458333333334e+01 2419 3149 -5.3312499999999998e+00 2419 3145 1.0416666666666664e-02 2419 3159 2.1329166666666662e+01 2419 3144 -5.3312499999999998e+00 2419 2418 -1.0661458333333334e+01 2419 2417 -1.0667708333333334e+01 2420 2420 3.7358333333333341e+01 2420 3268 5.3281250000000000e+00 2420 3071 -3.2249014814734037e-20 2420 3269 -5.3322916666666664e+00 2420 2426 6.2499999999999995e-03 2420 3430 1.3552527156068805e-19 2420 3423 -1.0416666666666666e-02 2420 3424 1.3332291666666665e+01 2420 3428 5.3322916666666664e+00 2420 2418 -8.0000000000000000e+00 2420 2427 -1.0670833333333334e+01 2420 3070 -1.3552527156068805e-19 2420 3422 1.0667708333333334e+01 2420 3069 -8.0000000000000000e+00 2420 2422 -1.0667708333333334e+01 2420 2421 -8.0000000000000000e+00 2421 2421 5.3375000000000000e+01 2421 3269 -2.1705219273391446e-19 2421 3075 5.3312499999999998e+00 2421 3434 5.3312499999999998e+00 2421 3067 -5.3395833333333327e+00 2421 2436 -5.3333333333333330e+00 2421 3073 2.1334374999999998e+01 2421 2425 -1.0661458333333334e+01 2421 3059 -5.3312499999999998e+00 2421 3060 5.0116116045879435e-20 2421 3061 -2.6583333333333337e+00 2421 3071 1.0656249999999998e+01 2421 2423 -8.0000000000000000e+00 2421 2426 -1.0666666666666666e+01 2421 3070 2.1334374999999998e+01 2421 3422 -5.3312499999999998e+00 2421 3069 2.6583333333333332e+00 2421 2422 -1.0661458333333334e+01 2421 2420 -8.0000000000000000e+00 2422 2422 6.4049999999999997e+01 2422 3067 5.3312499999999998e+00 2422 3434 -1.0416666666666664e-02 2422 3445 5.3312499999999998e+00 2422 2436 -1.0667708333333334e+01 2422 3433 2.1329166666666662e+01 2422 2435 -1.0661458333333334e+01 2422 3441 -5.3312499999999998e+00 2422 3432 -1.0416666666666664e-02 2422 3426 5.3312499999999998e+00 2422 2434 -1.0667708333333334e+01 2422 3430 -2.1329166666666662e+01 2422 2418 -1.0661458333333334e+01 2422 3424 -5.3312499999999998e+00 2422 3422 1.0416666666666664e-02 2422 3070 -2.1329166666666662e+01 2422 3069 5.3312499999999998e+00 2422 2421 -1.0661458333333334e+01 2422 2420 -1.0667708333333334e+01 2423 2423 3.7364583333333336e+01 2423 3207 5.3281250000000000e+00 2423 3065 -1.4583333333333332e-02 2423 3253 -5.3281250000000000e+00 2423 2433 -1.0672916666666666e+01 2423 3204 -4.9904357809065860e-20 2423 3063 5.3322916666666664e+00 2423 2428 6.2499999999999995e-03 2423 3073 1.0842021724855044e-19 2423 3071 2.1684043449710089e-19 2423 3060 5.3322916666666664e+00 2423 2426 6.2499999999999986e-03 2423 3061 8.0000000000000000e+00 2423 2421 -8.0000000000000000e+00 2423 3074 -1.0842021724855044e-19 2423 3059 1.0667708333333334e+01 2423 3058 8.0000000000000000e+00 2423 2425 -1.0667708333333334e+01 2423 2424 -8.0000000000000000e+00 2424 2424 5.3375000000000000e+01 2424 3074 2.1334374999999998e+01 2424 2425 -1.0661458333333332e+01 2424 3211 -2.6583333333333337e+00 2424 2429 -8.0000000000000000e+00 2424 3063 2.1705219273391446e-19 2424 3203 -5.0116116045879435e-20 2424 3204 -1.0656249999999998e+01 2424 2428 -1.0666666666666666e+01 2424 3059 -5.3312499999999998e+00 2424 3058 -2.6583333333333332e+00 2424 2423 -8.0000000000000000e+00 2424 984 -5.3312499999999998e+00 2424 983 -5.3312499999999998e+00 2424 981 5.3395833333333327e+00 2424 490 -5.3333333333333330e+00 2424 1008 2.1334374999999998e+01 2424 489 -1.0661458333333334e+01 2424 1007 -5.3312499999999998e+00 2425 2425 6.4049999999999997e+01 2425 3074 -2.1329166666666666e+01 2425 2424 -1.0661458333333332e+01 2425 3076 -2.1329166666666666e+01 2425 2435 -1.0661458333333332e+01 2425 3445 5.3312499999999998e+00 2425 3075 -1.0416666666666664e-02 2425 3067 5.3312499999999998e+00 2425 2436 -1.0667708333333334e+01 2425 3073 -2.1329166666666662e+01 2425 2421 -1.0661458333333334e+01 2425 3061 -5.3312499999999998e+00 2425 3059 1.0416666666666664e-02 2425 3058 -5.3312499999999998e+00 2425 2423 -1.0667708333333334e+01 2425 981 -5.3312499999999998e+00 2425 983 1.0416666666666664e-02 2425 982 -5.3312499999999998e+00 2425 490 -1.0667708333333334e+01 2426 2426 4.2710416666666674e+01 2426 3276 4.9904357809065860e-20 2426 3423 5.3281250000000000e+00 2426 3069 -2.1684043449710089e-19 2426 2420 6.2500000000000003e-03 2426 3269 5.3322916666666664e+00 2426 3268 -1.4583333333333332e-02 2426 2438 6.2499999999999986e-03 2426 2427 -1.0672916666666666e+01 2426 3267 5.3322916666666664e+00 2426 3485 5.3281250000000000e+00 2426 3065 5.3281250000000000e+00 2426 3253 1.0416666666666666e-02 2426 3265 1.5998958333333331e+01 2426 3259 -5.3322916666666664e+00 2426 2431 -1.0666666666666666e+01 2426 2433 -1.0670833333333334e+01 2426 3061 -2.1684043449710089e-19 2426 3060 -5.3322916666666664e+00 2426 2423 6.2499999999999986e-03 2426 3071 -1.0666666666666666e+01 2426 2421 -1.0666666666666666e+01 2427 2427 3.2020833333333336e+01 2427 3269 2.8940292364521927e-21 2427 3267 2.1705219273391446e-19 2427 3268 -1.0662500000000000e+01 2427 2426 -1.0672916666666666e+01 2427 3485 -5.3291666666666666e+00 2427 3431 5.3312499999999998e+00 2427 2438 -1.0670833333333334e+01 2427 3423 -5.3291666666666666e+00 2427 2418 4.1666666666666657e-03 2427 3424 -5.3312499999999998e+00 2427 3428 -1.0668750000000001e+01 2427 2420 -1.0670833333333334e+01 2428 2428 4.2710416666666660e+01 2428 3259 -5.3322916666666664e+00 2428 3207 -1.0416666666666664e-02 2428 3065 5.3281250000000000e+00 2428 2433 -1.0670833333333333e+01 2428 3501 5.3281250000000000e+00 2428 3201 -1.4583333333333330e-02 2428 3509 -5.3281250000000000e+00 2428 2439 -1.0672916666666666e+01 2428 3058 2.1684043449710089e-19 2428 2423 6.2500000000000003e-03 2428 3063 -5.3322916666666664e+00 2428 3275 2.1684043449710089e-19 2428 3205 5.3322916666666664e+00 2428 2430 6.2499999999999995e-03 2428 3206 1.5998958333333333e+01 2428 2431 -1.0666666666666666e+01 2428 3211 -2.1684043449710089e-19 2428 3203 5.3322916666666664e+00 2428 2429 6.2499999999999986e-03 2428 3204 1.0666666666666666e+01 2428 2424 -1.0666666666666666e+01 2429 2429 3.7358333333333334e+01 2429 2424 -8.0000000000000000e+00 2429 3211 8.0000000000000000e+00 2429 3158 1.3332291666666665e+01 2429 2432 -8.0000000000000000e+00 2429 3201 5.3281250000000000e+00 2429 3509 1.0416666666666666e-02 2429 3154 5.3322916666666664e+00 2429 2439 -1.0670833333333334e+01 2429 3204 -2.1684043449710089e-19 2429 3203 -5.3322916666666664e+00 2429 2428 6.2499999999999986e-03 2429 1008 1.3552527156068805e-19 2429 1009 1.3552527156068805e-19 2429 1007 1.0667708333333334e+01 2429 489 -1.0667708333333334e+01 2430 2430 4.2704166666666666e+01 2430 3234 -5.3322916666666664e+00 2430 3230 1.0416666666666664e-02 2430 3148 5.3281250000000000e+00 2430 2440 -1.0670833333333333e+01 2430 3154 5.3322916666666664e+00 2430 3501 -1.0416666666666664e-02 2430 3201 5.3281250000000000e+00 2430 2439 -1.0670833333333333e+01 2430 3149 -2.1684043449710089e-19 2430 3152 -5.3322916666666664e+00 2430 2417 6.2499999999999995e-03 2430 3153 -1.5998958333333333e+01 2430 2432 -1.0666666666666666e+01 2430 3206 -2.1684043449710089e-19 2430 3205 -5.3322916666666664e+00 2430 2428 6.2499999999999995e-03 2430 3275 -1.5998958333333333e+01 2430 2431 -1.0666666666666666e+01 2431 2431 4.2720833333333331e+01 2431 3207 1.0416666666666667e-03 2431 3230 -1.0416666666666664e-03 2431 3234 6.2499999999999986e-03 2431 3227 -1.0416666666666667e-03 2431 2440 4.1666666666666657e-03 2431 3267 2.1705219273391446e-19 2431 3276 1.0657291666666666e+01 2431 2438 -1.0666666666666666e+01 2431 3259 6.2500000000000003e-03 2431 3253 -1.0416666666666667e-03 2431 2433 4.1666666666666666e-03 2431 3265 -1.0657291666666666e+01 2431 2426 -1.0666666666666666e+01 2431 3205 -5.0116116045879435e-20 2431 3206 -1.0657291666666666e+01 2431 3275 1.0657291666666666e+01 2431 2428 -1.0666666666666666e+01 2431 2430 -1.0666666666666666e+01 2432 2432 5.3381249999999994e+01 2432 3157 5.3395833333333327e+00 2432 2437 -5.3333333333333330e+00 2432 3158 -2.6593750000000003e+00 2432 2429 -8.0000000000000000e+00 2432 3501 1.0416666666666664e-03 2432 3152 5.0116116045879435e-20 2432 3153 1.0657291666666666e+01 2432 2430 -1.0666666666666666e+01 2432 3154 -6.2499999999999995e-03 2432 3509 -1.0416666666666667e-03 2432 2439 4.1666666666666657e-03 2432 3162 5.3312499999999998e+00 2432 3156 2.1334374999999998e+01 2432 2419 -1.0661458333333334e+01 2432 3145 -5.3312499999999998e+00 2432 3149 -2.6583333333333332e+00 2432 2417 -8.0000000000000000e+00 2432 1006 -5.3312499999999998e+00 2432 1009 -2.1334374999999998e+01 2432 1007 -5.3312499999999998e+00 2432 489 -1.0661458333333334e+01 2433 2433 3.2020833333333343e+01 2433 3206 -5.3312499999999998e+00 2433 3063 -2.8940292364521927e-21 2433 3207 -5.3291666666666666e+00 2433 2428 -1.0670833333333333e+01 2433 3060 8.8938459461701536e-21 2433 2423 -1.0672916666666666e+01 2433 3065 -1.0662500000000000e+01 2433 3253 5.3291666666666666e+00 2433 2431 4.1666666666666657e-03 2433 3265 -5.3312499999999998e+00 2433 3259 1.0668750000000001e+01 2433 2426 -1.0670833333333334e+01 2434 2434 3.2012500000000003e+01 2434 3433 -1.3552527156068805e-19 2434 3430 -1.3552527156068805e-19 2434 3432 -1.0667708333333334e+01 2434 2422 -1.0667708333333334e+01 2434 3159 -1.3552527156068805e-19 2434 2418 -5.3333333333333330e+00 2434 3426 -5.3333333333333330e+00 2434 3161 1.3552527156068805e-19 2434 3160 -1.0667708333333334e+01 2434 3441 5.3333333333333330e+00 2434 2419 -1.0667708333333334e+01 2434 2435 -5.3333333333333330e+00 2435 2435 6.4041666666666671e+01 2435 3447 5.3395833333333327e+00 2435 2437 -5.3333333333333330e+00 2435 3076 2.1334374999999998e+01 2435 2425 -1.0661458333333332e+01 2435 3162 5.3312499999999998e+00 2435 3075 5.3312499999999998e+00 2435 3434 5.3312499999999998e+00 2435 3445 -5.3395833333333327e+00 2435 2436 -5.3333333333333330e+00 2435 3433 -2.1334374999999998e+01 2435 2422 -1.0661458333333334e+01 2435 3432 5.3312499999999998e+00 2435 3161 -2.1334374999999998e+01 2435 3160 5.3312499999999998e+00 2435 3441 5.3395833333333327e+00 2435 2419 -1.0661458333333334e+01 2435 2434 -5.3333333333333330e+00 2435 1006 -5.3312499999999998e+00 2435 1010 -2.1334374999999998e+01 2435 489 -1.0661458333333334e+01 2435 984 -5.3312499999999998e+00 2435 983 -5.3312499999999998e+00 2435 982 5.3395833333333327e+00 2435 490 -5.3333333333333330e+00 2436 2436 3.2012500000000003e+01 2436 3076 1.3552527156068805e-19 2436 3073 -1.3552527156068805e-19 2436 3075 -1.0667708333333334e+01 2436 2425 -1.0667708333333334e+01 2436 3070 1.3552527156068805e-19 2436 2421 -5.3333333333333330e+00 2436 3067 -5.3333333333333330e+00 2436 3433 1.3552527156068805e-19 2436 3434 -1.0667708333333334e+01 2436 3445 -5.3333333333333330e+00 2436 2422 -1.0667708333333334e+01 2436 2435 -5.3333333333333330e+00 2437 2437 3.2012500000000003e+01 2437 2432 -5.3333333333333330e+00 2437 3157 5.3333333333333330e+00 2437 3447 5.3333333333333330e+00 2437 2435 -5.3333333333333330e+00 2437 3161 -1.3552527156068805e-19 2437 3156 -1.3552527156068805e-19 2437 3162 -1.0667708333333334e+01 2437 2419 -1.0667708333333334e+01 2437 1009 -1.3552527156068805e-19 2437 1010 1.3552527156068805e-19 2437 1006 1.0667708333333334e+01 2437 489 -1.0667708333333334e+01 2438 2438 4.2704166666666666e+01 2438 3148 5.3281250000000000e+00 2438 3227 1.0416666666666666e-02 2438 3234 -5.3322916666666664e+00 2438 2440 -1.0670833333333334e+01 2438 3265 2.1684043449710089e-19 2438 2431 -1.0666666666666666e+01 2438 3276 -1.5998958333333333e+01 2438 3144 2.1684043449710089e-19 2438 2417 6.2499999999999986e-03 2438 3146 -5.3322916666666664e+00 2438 2426 6.2499999999999986e-03 2438 3268 5.3281250000000000e+00 2438 3267 -5.3322916666666664e+00 2438 3485 -1.0416666666666666e-02 2438 3428 5.3322916666666664e+00 2438 3431 -1.5998958333333331e+01 2438 2418 -1.0666666666666666e+01 2438 2427 -1.0670833333333334e+01 2439 2439 3.2020833333333343e+01 2439 3153 5.3312499999999998e+00 2439 3205 2.8940292364521927e-21 2439 3501 -5.3291666666666666e+00 2439 2430 -1.0670833333333333e+01 2439 3203 4.5316262678105068e-20 2439 2428 -1.0672916666666666e+01 2439 3201 -1.0662500000000000e+01 2439 2432 4.1666666666666657e-03 2439 3509 5.3291666666666666e+00 2439 3158 -5.3312499999999998e+00 2439 2429 -1.0670833333333334e+01 2439 3154 -1.0668750000000001e+01 2440 2440 3.2020833333333343e+01 2440 3275 5.3312499999999998e+00 2440 3152 -2.8940292364521927e-21 2440 3230 5.3291666666666666e+00 2440 2430 -1.0670833333333333e+01 2440 3146 2.1705219273391446e-19 2440 3148 -1.0662500000000000e+01 2440 2417 -1.0672916666666666e+01 2440 3227 5.3291666666666666e+00 2440 2431 4.1666666666666657e-03 2440 3234 1.0668750000000001e+01 2440 3276 5.3312499999999998e+00 2440 2438 -1.0670833333333334e+01 2441 2441 3.2012500000000003e+01 2441 3102 1.3552527156068805e-19 2441 3072 1.3552527156068805e-19 2441 3078 1.3552527156068805e-19 2441 3077 -1.0667708333333334e+01 2441 3097 -5.3333333333333330e+00 2441 2445 -1.0667708333333334e+01 2441 2444 -5.3333333333333330e+00 2441 3068 -1.3552527156068805e-19 2441 3109 -1.0667708333333334e+01 2441 3067 -5.3333333333333330e+00 2441 2443 -1.0667708333333334e+01 2441 2442 -5.3333333333333330e+00 2442 2442 5.3374999999999993e+01 2442 3060 5.0116116045879435e-20 2442 3269 2.1705219273391446e-19 2442 3071 1.0656249999999998e+01 2442 2460 -1.0666666666666666e+01 2442 3077 5.3312499999999998e+00 2442 3111 5.3312499999999998e+00 2442 3069 2.6583333333333332e+00 2442 2458 -8.0000000000000000e+00 2442 3072 2.1334374999999998e+01 2442 3062 -5.3312499999999998e+00 2442 3061 -2.6583333333333332e+00 2442 2445 -1.0661458333333334e+01 2442 2454 -8.0000000000000000e+00 2442 3068 2.1334374999999998e+01 2442 3109 5.3312499999999998e+00 2442 3067 -5.3395833333333327e+00 2442 2443 -1.0661458333333334e+01 2442 2441 -5.3333333333333330e+00 2443 2443 6.4049999999999997e+01 2443 3097 5.3312499999999998e+00 2443 3069 5.3312499999999998e+00 2443 3111 -1.0416666666666664e-02 2443 3114 5.3312499999999998e+00 2443 2458 -1.0667708333333334e+01 2443 3110 2.1329166666666662e+01 2443 2457 -1.0661458333333334e+01 2443 3090 -5.3312499999999998e+00 2443 3094 1.0416666666666664e-02 2443 3102 -2.1329166666666662e+01 2443 3093 -5.3312499999999998e+00 2443 2444 -1.0661458333333334e+01 2443 2456 -1.0667708333333334e+01 2443 3109 -1.0416666666666664e-02 2443 3068 -2.1329166666666662e+01 2443 3067 5.3312499999999998e+00 2443 2442 -1.0661458333333334e+01 2443 2441 -1.0667708333333334e+01 2444 2444 5.3354166667000001e+01 2444 3095 -1.0416666666666666e-11 2444 3474 -1.0416666666666666e-11 2444 3104 -6.2499999999999991e-11 2444 3698 -1.0416666666666666e-11 2444 2453 4.1666666666666665e-11 2444 3109 5.3312499999999998e+00 2444 3080 5.3312499999999998e+00 2444 3098 2.6635416666250000e+00 2444 2459 -8.0000000000000000e+00 2444 3102 2.1334374999999998e+01 2444 3094 -5.3312499999999998e+00 2444 3093 -2.6635416666250000e+00 2444 2443 -1.0661458333333334e+01 2444 2456 -8.0000000000000000e+00 2444 3100 -6.2499999999999991e-11 2444 3701 -1.0416666666666666e-11 2444 2451 4.1666666666666665e-11 2444 3101 1.0666666666583334e+01 2444 2452 -1.0666666666666666e+01 2444 3078 -2.1334374999999998e+01 2444 3077 5.3312499999999998e+00 2444 3097 -5.3395833333333327e+00 2444 2445 -1.0661458333333334e+01 2444 2441 -5.3333333333333330e+00 2445 2445 6.4049999999999997e+01 2445 3098 5.3312499999999998e+00 2445 3080 -1.0416666666666664e-02 2445 3085 5.3312499999999998e+00 2445 2459 -1.0667708333333334e+01 2445 3067 5.3312499999999998e+00 2445 3079 2.1329166666666662e+01 2445 2455 -1.0661458333333334e+01 2445 3056 -5.3312499999999998e+00 2445 3062 1.0416666666666664e-02 2445 3072 -2.1329166666666662e+01 2445 3061 -5.3312499999999998e+00 2445 2442 -1.0661458333333334e+01 2445 2454 -1.0667708333333334e+01 2445 3077 -1.0416666666666664e-02 2445 3078 2.1329166666666662e+01 2445 3097 5.3312499999999998e+00 2445 2444 -1.0661458333333334e+01 2445 2441 -1.0667708333333334e+01 2446 2446 3.2024999999999999e+01 2446 3113 5.3312499999999998e+00 2446 3491 4.1666666666666666e-03 2446 3490 -5.3312499999999998e+00 2446 2461 -1.0668750000000001e+01 2446 2450 4.1666666666666657e-03 2446 3494 5.3312499999999998e+00 2446 3495 -1.0668750000000001e+01 2446 3660 -5.3312499999999998e+00 2446 3635 -4.1666666666666666e-03 2446 2457 4.1666666666666657e-03 2446 3116 -5.3312499999999998e+00 2446 3112 -1.0668750000000001e+01 2446 2464 -1.0668750000000001e+01 2446 3631 -4.1666666666666666e-03 2446 2448 4.1666666666666657e-03 2446 3655 -5.3312499999999998e+00 2446 3632 1.0668750000000001e+01 2446 2447 -1.0668750000000001e+01 2447 2447 4.2691666666666663e+01 2447 3495 5.3322916666666664e+00 2447 3627 -5.3322916666666664e+00 2447 3624 6.2500000000000003e-03 2447 3494 -2.1331249999999997e+01 2447 3493 5.3322916666666664e+00 2447 2450 -1.0666666666666666e+01 2447 2449 -1.0668750000000001e+01 2447 3631 6.2500000000000003e-03 2447 3655 2.1331249999999997e+01 2447 3632 -5.3322916666666664e+00 2447 2448 -1.0666666666666666e+01 2447 2446 -1.0668750000000001e+01 2448 2448 4.2700000000333333e+01 2448 3660 -1.0662499999958333e+01 2448 2464 -1.0666666666666666e+01 2448 3701 -1.0416666666666666e-11 2448 2451 4.1666666666666665e-11 2448 3658 -1.0666666666583334e+01 2448 2452 -1.0666666666666666e+01 2448 3661 -1.0416666666666666e-11 2448 3635 -1.0416666666666667e-03 2448 3623 -1.0416666666666667e-03 2448 3659 1.0662499999958333e+01 2448 2463 -1.0666666666666666e+01 2448 3627 6.2500000000000003e-03 2448 3624 -1.0416666666666667e-03 2448 2449 4.1666666666666666e-03 2448 3657 -6.2499999999999991e-11 2448 3698 -1.0416666666666666e-11 2448 2453 4.1666666666666665e-11 2448 3632 6.2500000000000003e-03 2448 3631 -1.0416666666666667e-03 2448 2446 4.1666666666666666e-03 2448 3655 -1.0658333333333333e+01 2448 2447 -1.0666666666666666e+01 2448 4763 -1.0416666666666666e-11 2448 4768 6.2499999999999991e-11 2449 2449 3.2024999999999999e+01 2449 3279 -5.3312499999999998e+00 2449 3277 4.1666666666666666e-03 2449 3087 5.3312499999999998e+00 2449 2462 -1.0668750000000001e+01 2449 2455 4.1666666666666657e-03 2449 3083 5.3312499999999998e+00 2449 3082 -1.0668750000000001e+01 2449 3623 -4.1666666666666666e-03 2449 3659 5.3312499999999998e+00 2449 2463 -1.0668750000000001e+01 2449 2448 4.1666666666666657e-03 2449 3655 -5.3312499999999998e+00 2449 3627 1.0668750000000001e+01 2449 3624 -4.1666666666666666e-03 2449 2450 4.1666666666666657e-03 2449 3494 5.3312499999999998e+00 2449 3493 -1.0668750000000001e+01 2449 2447 -1.0668750000000001e+01 2450 2450 4.2720833333333339e+01 2450 3277 1.0416666666666667e-03 2450 3491 1.0416666666666667e-03 2450 3495 -6.2500000000000003e-03 2450 3631 -1.0416666666666667e-03 2450 2446 4.1666666666666666e-03 2450 3262 2.1705219273391446e-19 2450 3279 -1.0657291666666666e+01 2450 2462 -1.0666666666666666e+01 2450 3263 5.0116116045879435e-20 2450 3264 -1.0656249999999998e+01 2450 3490 -1.0657291666666666e+01 2450 2460 -1.0666666666666666e+01 2450 2461 -1.0666666666666666e+01 2450 3493 -6.2500000000000003e-03 2450 3624 -1.0416666666666667e-03 2450 2449 4.1666666666666666e-03 2450 3494 1.0658333333333333e+01 2450 2447 -1.0666666666666666e+01 2451 2451 3.2000000000249997e+01 2451 2457 4.1666666666666665e-11 2451 3116 -5.3333333333124999e+00 2451 3117 1.0666666666687499e+01 2451 3660 -5.3333333333124999e+00 2451 2464 -1.0666666666687499e+01 2451 2448 4.1666666666666665e-11 2451 3701 -4.1666666666666665e-11 2451 3658 -5.3333333333124999e+00 2451 2452 -1.0666666666687499e+01 2451 3093 -5.3333333333124999e+00 2451 3095 -4.1666666666666665e-11 2451 3090 -5.3333333333124999e+00 2451 2456 -1.0666666666687499e+01 2451 2444 4.1666666666666665e-11 2451 3101 5.3333333333124999e+00 2451 3100 -1.0666666666687499e+01 2451 4763 -4.1666666666666665e-11 2451 4768 1.0666666666687499e+01 2452 2452 4.2666666666916662e+01 2452 3701 6.2499999999999991e-11 2452 3658 2.1333333333312499e+01 2452 2448 -1.0666666666666666e+01 2452 2451 -1.0666666666687499e+01 2452 3104 5.3333333333229165e+00 2452 3698 6.2500000000000004e-11 2452 3657 5.3333333333229165e+00 2452 2453 -1.0666666666687499e+01 2452 3101 -2.1333333333312499e+01 2452 3100 5.3333333333229165e+00 2452 2444 -1.0666666666666666e+01 2452 4768 -5.3333333333229165e+00 2453 2453 3.2000000000249997e+01 2453 3659 5.3333333333124999e+00 2453 3661 -4.1666666666666665e-11 2453 3083 5.3333333333124999e+00 2453 2463 -1.0666666666687499e+01 2453 2455 4.1666666666666665e-11 2453 3085 5.3333333333124999e+00 2453 3084 -1.0666666666687499e+01 2453 3474 -4.1666666666666665e-11 2453 3098 5.3333333333124999e+00 2453 2459 -1.0666666666687499e+01 2453 2444 4.1666666666666665e-11 2453 3101 5.3333333333124999e+00 2453 3104 -1.0666666666687499e+01 2453 3698 -4.1666666666666665e-11 2453 2448 4.1666666666666665e-11 2453 3658 -5.3333333333124999e+00 2453 3657 -1.0666666666687499e+01 2453 2452 -1.0666666666687499e+01 2454 2454 3.7350000000000009e+01 2454 3071 2.1684043449710089e-19 2454 3086 -1.6263032587282567e-19 2454 2460 -5.3322916666666664e+00 2454 3060 5.3322916666666664e+00 2454 3079 -1.3552527156068805e-19 2454 2455 -1.3334375000000000e+01 2454 3056 1.3334375000000000e+01 2454 3072 -1.3552527156068805e-19 2454 3062 1.0667708333333334e+01 2454 3061 8.0000000000000000e+00 2454 2445 -1.0667708333333334e+01 2454 2442 -8.0000000000000000e+00 2455 2455 5.8722916666833342e+01 2455 3661 -1.0416666666666666e-11 2455 3084 -6.2499999999999991e-11 2455 3474 -1.0416666666666666e-11 2455 2453 4.1666666666666665e-11 2455 3277 1.0416666666666667e-03 2455 3082 -6.2500000000000003e-03 2455 3623 -1.0416666666666667e-03 2455 2449 4.1666666666666666e-03 2455 3083 1.0662499999958333e+01 2455 2463 -1.0666666666666666e+01 2455 3060 -5.3281250000000000e+00 2455 2460 1.4583333333333330e-02 2455 3086 1.0662500000000000e+01 2455 3087 1.0653124999999999e+01 2455 3262 5.3281250000000000e+00 2455 2462 -1.6001041666666666e+01 2455 3080 5.3312499999999998e+00 2455 3085 2.6635416666250000e+00 2455 2459 -8.0000000000000000e+00 2455 3079 -2.1334374999999998e+01 2455 2445 -1.0661458333333334e+01 2455 3062 -5.3312499999999998e+00 2455 3056 -2.6541666666666668e+00 2455 2454 -1.3334375000000000e+01 2456 2456 3.7339583333458329e+01 2456 3100 5.3333333333229165e+00 2456 3095 6.2499999999999991e-11 2456 3117 -5.3333333333229165e+00 2456 2451 -1.0666666666687499e+01 2456 3110 -1.3552527156068805e-19 2456 2457 -8.0000000000000000e+00 2456 3090 1.3333333333322916e+01 2456 3102 -1.3552527156068805e-19 2456 3094 1.0667708333333334e+01 2456 3093 1.3333333333322916e+01 2456 2443 -1.0667708333333334e+01 2456 2444 -8.0000000000000000e+00 2457 2457 5.8722916666833342e+01 2457 3117 6.2499999999999991e-11 2457 2451 4.1666666666666665e-11 2457 3116 -1.0662499999958333e+01 2457 2464 -1.0666666666666666e+01 2457 3095 -1.0416666666666666e-11 2457 3491 1.0416666666666667e-03 2457 3112 -6.2500000000000003e-03 2457 3635 -1.0416666666666667e-03 2457 2446 4.1666666666666666e-03 2457 3113 1.0653124999999999e+01 2457 3263 5.3281250000000000e+00 2457 2461 -1.6001041666666666e+01 2457 2460 1.4583333333333330e-02 2457 3115 1.0662500000000000e+01 2457 3269 5.3281250000000000e+00 2457 3111 5.3312499999999998e+00 2457 3114 2.6541666666666668e+00 2457 2458 -1.3334375000000000e+01 2457 3110 -2.1334374999999998e+01 2457 2443 -1.0661458333333334e+01 2457 3094 -5.3312499999999998e+00 2457 3090 -2.6635416666250000e+00 2457 2456 -8.0000000000000000e+00 2457 4763 -1.0416666666666666e-11 2458 2458 3.7350000000000001e+01 2458 3115 2.1684043449710089e-19 2458 3071 -2.1684043449710089e-19 2458 2460 -5.3322916666666664e+00 2458 3269 -5.3322916666666664e+00 2458 3068 1.0842021724855044e-19 2458 2442 -8.0000000000000000e+00 2458 3069 -8.0000000000000000e+00 2458 3110 1.0842021724855044e-19 2458 3111 -1.0667708333333334e+01 2458 3114 -1.3334375000000000e+01 2458 2443 -1.0667708333333334e+01 2458 2457 -1.3334375000000000e+01 2459 2459 3.7339583333458329e+01 2459 3084 5.3333333333229165e+00 2459 3474 6.2499999999999991e-11 2459 3104 5.3333333333229165e+00 2459 2453 -1.0666666666687499e+01 2459 3078 -1.3552527156068805e-19 2459 2444 -8.0000000000000000e+00 2459 3098 -1.3333333333322916e+01 2459 3079 1.3552527156068805e-19 2459 3080 -1.0667708333333334e+01 2459 3085 -1.3333333333322916e+01 2459 2445 -1.0667708333333334e+01 2459 2455 -8.0000000000000000e+00 2460 2460 4.2716666666666669e+01 2460 3061 -2.1684043449710089e-19 2460 3060 6.2499999999999986e-03 2460 3056 -5.3281250000000000e+00 2460 2454 -5.3322916666666664e+00 2460 2455 1.4583333333333332e-02 2460 3086 -1.0672916666666666e+01 2460 3087 5.3281250000000000e+00 2460 3279 -4.9904357809065860e-20 2460 3262 -6.2499999999999986e-03 2460 2462 -5.3322916666666664e+00 2460 3490 -2.1684043449710089e-19 2460 3264 1.0666666666666666e+01 2460 2450 -1.0666666666666666e+01 2460 3263 -6.2499999999999986e-03 2460 3113 5.3281250000000000e+00 2460 2461 -5.3322916666666664e+00 2460 2457 1.4583333333333332e-02 2460 3115 -1.0672916666666666e+01 2460 3114 5.3281250000000000e+00 2460 3069 -3.2249014814734037e-20 2460 3269 -6.2499999999999986e-03 2460 2458 -5.3322916666666664e+00 2460 3071 -1.0666666666666666e+01 2460 2442 -1.0666666666666666e+01 2461 2461 4.2689583333333331e+01 2461 3112 5.3322916666666664e+00 2461 3491 -6.2500000000000003e-03 2461 3495 5.3322916666666664e+00 2461 2446 -1.0668750000000001e+01 2461 3264 -2.1684043449710089e-19 2461 3490 1.5998958333333333e+01 2461 2450 -1.0666666666666666e+01 2461 3115 -2.1684043449710089e-19 2461 2457 -1.6001041666666666e+01 2461 2460 -5.3322916666666664e+00 2461 3113 -2.1333333333333336e+01 2461 3263 -5.3322916666666664e+00 2462 2462 4.2689583333333331e+01 2462 3493 5.3322916666666664e+00 2462 3277 -6.2500000000000003e-03 2462 3082 5.3322916666666664e+00 2462 2449 -1.0668750000000001e+01 2462 3086 1.6263032587282567e-19 2462 3087 -2.1333333333333336e+01 2462 2455 -1.6001041666666666e+01 2462 3264 2.1684043449710089e-19 2462 2460 -5.3322916666666664e+00 2462 3262 -5.3322916666666664e+00 2462 2450 -1.0666666666666666e+01 2462 3279 1.5998958333333333e+01 2463 2463 4.2679166666791659e+01 2463 3657 5.3333333333229165e+00 2463 3661 6.2500000000000004e-11 2463 3084 5.3333333333229165e+00 2463 2453 -1.0666666666687499e+01 2463 3083 -2.1332291666656246e+01 2463 2455 -1.0666666666666666e+01 2463 3082 5.3322916666666664e+00 2463 3623 6.2500000000000003e-03 2463 3659 -2.1332291666656246e+01 2463 3627 -5.3322916666666664e+00 2463 2448 -1.0666666666666666e+01 2463 2449 -1.0668750000000001e+01 2464 2464 4.2679166666791659e+01 2464 3116 2.1332291666656246e+01 2464 2457 -1.0666666666666666e+01 2464 3117 -5.3333333333229165e+00 2464 3660 2.1332291666656246e+01 2464 2448 -1.0666666666666666e+01 2464 2451 -1.0666666666687499e+01 2464 3632 -5.3322916666666664e+00 2464 3635 6.2500000000000003e-03 2464 3112 5.3322916666666664e+00 2464 2446 -1.0668750000000001e+01 2464 4763 6.2500000000000004e-11 2464 4768 -5.3333333333229165e+00 2465 2465 3.2012500000000003e+01 2465 3075 1.3552527156068805e-19 2465 3077 -1.3552527156068805e-19 2465 2471 -5.3333333333333330e+00 2465 3067 5.3333333333333330e+00 2465 3062 -1.3552527156068805e-19 2465 3072 1.0667708333333334e+01 2465 2468 -1.0667708333333334e+01 2465 3059 1.3552527156068805e-19 2465 2467 -1.0667708333333334e+01 2465 2466 -5.3333333333333330e+00 2465 3073 1.0667708333333334e+01 2465 3061 -5.3333333333333330e+00 2466 2466 6.4041666666666671e+01 2466 3074 -5.3312499999999998e+00 2466 3212 -5.3312499999999998e+00 2466 3058 -5.3395833333333327e+00 2466 2480 -5.3333333333333330e+00 2466 3066 2.1334374999999998e+01 2466 3215 -5.3312499999999998e+00 2466 2479 -1.0661458333333334e+01 2466 3089 -5.3312499999999998e+00 2466 3064 -5.3395833333333327e+00 2466 2478 -5.3333333333333330e+00 2466 3057 2.1334374999999998e+01 2466 3081 -5.3312499999999998e+00 2466 2470 -1.0661458333333334e+01 2466 3079 5.3312499999999998e+00 2466 3056 -5.3395833333333327e+00 2466 2469 -5.3333333333333330e+00 2466 3062 2.1334374999999998e+01 2466 3072 -5.3312499999999998e+00 2466 2468 -1.0661458333333334e+01 2466 3059 2.1334374999999998e+01 2466 2467 -1.0661458333333334e+01 2466 3073 -5.3312499999999998e+00 2466 3061 -5.3395833333333327e+00 2466 2465 -5.3333333333333330e+00 2467 2467 6.4049999999999997e+01 2467 3074 1.0416666666666664e-02 2467 2480 -1.0667708333333334e+01 2467 3076 1.0416666666666664e-02 2467 2472 -1.0667708333333334e+01 2467 3058 5.3312499999999998e+00 2467 3445 -5.3312499999999998e+00 2467 3075 2.1329166666666662e+01 2467 3067 -5.3312499999999998e+00 2467 2471 -1.0661458333333334e+01 2467 3073 1.0416666666666664e-02 2467 3059 -2.1329166666666662e+01 2467 2466 -1.0661458333333334e+01 2467 3061 5.3312499999999998e+00 2467 2465 -1.0667708333333334e+01 2467 981 5.3312499999999998e+00 2467 983 -2.1329166666666662e+01 2467 982 5.3312499999999998e+00 2467 484 -1.0661458333333334e+01 2468 2468 6.4049999999999997e+01 2468 3098 -5.3312499999999998e+00 2468 3080 2.1329166666666662e+01 2468 3085 -5.3312499999999998e+00 2468 2477 -1.0661458333333334e+01 2468 3078 -1.0416666666666664e-02 2468 3097 -5.3312499999999998e+00 2468 2476 -1.0667708333333334e+01 2468 3077 2.1329166666666662e+01 2468 2471 -1.0661458333333334e+01 2468 3067 -5.3312499999999998e+00 2468 3079 -1.0416666666666664e-02 2468 3056 5.3312499999999998e+00 2468 2469 -1.0667708333333334e+01 2468 3072 1.0416666666666664e-02 2468 3062 -2.1329166666666662e+01 2468 3061 5.3312499999999998e+00 2468 2466 -1.0661458333333334e+01 2468 2465 -1.0667708333333334e+01 2469 2469 3.2012500000000003e+01 2469 3080 1.3552527156068805e-19 2469 3088 1.3552527156068805e-19 2469 2477 -5.3333333333333330e+00 2469 3085 5.3333333333333330e+00 2469 3057 -1.3552527156068805e-19 2469 3081 1.0667708333333334e+01 2469 2470 -1.0667708333333334e+01 2469 3062 1.3552527156068805e-19 2469 2468 -1.0667708333333334e+01 2469 2466 -5.3333333333333330e+00 2469 3079 -1.0667708333333334e+01 2469 3056 -5.3333333333333330e+00 2470 2470 6.4049999999999997e+01 2470 3089 1.0416666666666664e-02 2470 2478 -1.0667708333333334e+01 2470 3088 -2.1329166666666666e+01 2470 2477 -1.0661458333333332e+01 2470 3064 5.3312499999999998e+00 2470 3085 -5.3312499999999998e+00 2470 3081 1.0416666666666664e-02 2470 3057 -2.1329166666666662e+01 2470 3056 5.3312499999999998e+00 2470 2466 -1.0661458333333334e+01 2470 2469 -1.0667708333333334e+01 2470 946 -5.3312499999999998e+00 2470 949 2.1329166666666662e+01 2470 970 5.3312499999999998e+00 2470 482 -1.0661458333333334e+01 2470 945 1.0416666666666664e-02 2470 939 5.3312499999999998e+00 2470 479 -1.0667708333333334e+01 2471 2471 6.4041666666666671e+01 2471 3078 5.3312499999999998e+00 2471 3099 -5.3312499999999998e+00 2471 3097 5.3395833333333327e+00 2471 2476 -5.3333333333333330e+00 2471 3459 2.1334374999999998e+01 2471 3472 -5.3312499999999998e+00 2471 2475 -1.0661458333333334e+01 2471 3460 -5.3312499999999998e+00 2471 3458 -5.3395833333333327e+00 2471 2474 -5.3333333333333330e+00 2471 3457 2.1334374999999998e+01 2471 3446 -5.3312499999999998e+00 2471 2473 -1.0661458333333334e+01 2471 3076 -5.3312499999999998e+00 2471 3445 5.3395833333333327e+00 2471 2472 -5.3333333333333330e+00 2471 3075 -2.1334374999999998e+01 2471 3073 -5.3312499999999998e+00 2471 2467 -1.0661458333333334e+01 2471 3077 -2.1334374999999998e+01 2471 2468 -1.0661458333333334e+01 2471 3072 -5.3312499999999998e+00 2471 3067 5.3395833333333327e+00 2471 2465 -5.3333333333333330e+00 2472 2472 3.2012500000000003e+01 2472 3076 1.0667708333333334e+01 2472 2467 -1.0667708333333334e+01 2472 2473 -1.0667708333333334e+01 2472 3446 1.0667708333333334e+01 2472 3457 -1.0842021724855044e-19 2472 3075 -1.3552527156068805e-19 2472 2471 -5.3333333333333330e+00 2472 3445 5.3333333333333330e+00 2472 983 -1.3552527156068805e-19 2472 953 -1.0842021724855044e-19 2472 484 -5.3333333333333330e+00 2472 982 -5.3333333333333330e+00 2473 2473 6.4049999999999997e+01 2473 3446 1.0416666666666664e-02 2473 2472 -1.0667708333333334e+01 2473 3460 1.0416666666666664e-02 2473 2474 -1.0667708333333334e+01 2473 3458 5.3312499999999998e+00 2473 3457 -2.1329166666666662e+01 2473 3445 -5.3312499999999998e+00 2473 2471 -1.0661458333333334e+01 2473 982 5.3312499999999998e+00 2473 951 5.3312499999999998e+00 2473 954 -1.0416666666666664e-02 2473 953 2.1329166666666662e+01 2473 961 -5.3312499999999998e+00 2473 484 -1.0661458333333334e+01 2473 485 -1.0667708333333334e+01 2473 950 -2.1329166666666662e+01 2473 938 -5.3312499999999998e+00 2473 480 -1.0661458333333334e+01 2474 2474 3.2012500000000003e+01 2474 3460 1.0667708333333334e+01 2474 2473 -1.0667708333333334e+01 2474 2475 -1.0667708333333334e+01 2474 3472 1.0667708333333334e+01 2474 3459 -1.3552527156068805e-19 2474 3457 1.3552527156068805e-19 2474 2471 -5.3333333333333330e+00 2474 3458 -5.3333333333333330e+00 2474 950 -1.3552527156068805e-19 2474 941 -1.3552527156068805e-19 2474 480 -5.3333333333333330e+00 2474 938 5.3333333333333330e+00 2475 2475 6.4049999999999997e+01 2475 3472 1.0416666666666664e-02 2475 2474 -1.0667708333333334e+01 2475 3473 -2.1329166666666666e+01 2475 2477 -1.0661458333333332e+01 2475 3098 -5.3312499999999998e+00 2475 3099 1.0416666666666664e-02 2475 3097 -5.3312499999999998e+00 2475 2476 -1.0667708333333334e+01 2475 3459 -2.1329166666666662e+01 2475 3458 5.3312499999999998e+00 2475 2471 -1.0661458333333334e+01 2475 938 -5.3312499999999998e+00 2475 941 2.1329166666666662e+01 2475 819 -5.3312499999999998e+00 2475 480 -1.0661458333333334e+01 2475 823 1.0416666666666664e-02 2475 821 -5.3312499999999998e+00 2475 477 -1.0667708333333334e+01 2476 2476 3.2012500000000003e+01 2476 3473 -1.3552527156068805e-19 2476 3080 -1.0842021724855044e-19 2476 2477 -5.3333333333333330e+00 2476 3098 5.3333333333333330e+00 2476 3077 1.0842021724855044e-19 2476 3078 -1.0667708333333334e+01 2476 2468 -1.0667708333333334e+01 2476 3459 1.3552527156068805e-19 2476 2475 -1.0667708333333334e+01 2476 2471 -5.3333333333333330e+00 2476 3099 1.0667708333333334e+01 2476 3097 5.3333333333333330e+00 2477 2477 6.4041666666666671e+01 2477 3088 2.1334374999999998e+01 2477 2470 -1.0661458333333332e+01 2477 3473 2.1334374999999998e+01 2477 2475 -1.0661458333333332e+01 2477 3099 -5.3312499999999998e+00 2477 3078 5.3312499999999998e+00 2477 3098 5.3395833333333327e+00 2477 2476 -5.3333333333333330e+00 2477 3080 -2.1334374999999998e+01 2477 3079 5.3312499999999998e+00 2477 2468 -1.0661458333333334e+01 2477 3081 -5.3312499999999998e+00 2477 3085 5.3395833333333327e+00 2477 2469 -5.3333333333333330e+00 2477 945 -5.3312499999999998e+00 2477 943 5.3312499999999998e+00 2477 939 -5.3395833333333327e+00 2477 479 -5.3333333333333330e+00 2477 940 2.1334374999999998e+01 2477 822 -5.3312499999999998e+00 2477 478 -1.0661458333333334e+01 2477 823 -5.3312499999999998e+00 2477 821 5.3395833333333327e+00 2477 477 -5.3333333333333330e+00 2478 2478 3.2012500000000003e+01 2478 3089 1.0667708333333334e+01 2478 2470 -1.0667708333333334e+01 2478 2479 -1.0667708333333334e+01 2478 3215 1.0667708333333334e+01 2478 3066 -1.3552527156068805e-19 2478 3057 1.3552527156068805e-19 2478 2466 -5.3333333333333330e+00 2478 3064 -5.3333333333333330e+00 2478 949 1.3552527156068805e-19 2478 973 1.3552527156068805e-19 2478 482 -5.3333333333333330e+00 2478 970 -5.3333333333333330e+00 2479 2479 6.4049999999999997e+01 2479 3212 1.0416666666666664e-02 2479 2480 -1.0667708333333334e+01 2479 3215 1.0416666666666664e-02 2479 2478 -1.0667708333333334e+01 2479 3058 5.3312499999999998e+00 2479 3066 -2.1329166666666662e+01 2479 3064 5.3312499999999998e+00 2479 2466 -1.0661458333333334e+01 2479 981 5.3312499999999998e+00 2479 977 2.1329166666666662e+01 2479 484 -1.0661458333333334e+01 2479 713 -5.3312499999999998e+00 2479 970 5.3312499999999998e+00 2479 721 1.0416666666666664e-02 2479 973 -2.1329166666666662e+01 2479 717 -5.3312499999999998e+00 2479 482 -1.0661458333333334e+01 2479 481 -1.0667708333333334e+01 2480 2480 3.2012500000000003e+01 2480 3212 1.0667708333333334e+01 2480 2479 -1.0667708333333334e+01 2480 2467 -1.0667708333333334e+01 2480 3074 1.0667708333333334e+01 2480 3059 -1.3552527156068805e-19 2480 3066 1.3552527156068805e-19 2480 2466 -5.3333333333333330e+00 2480 3058 -5.3333333333333330e+00 2480 977 1.3552527156068805e-19 2480 983 1.3552527156068805e-19 2480 484 -5.3333333333333330e+00 2480 981 -5.3333333333333330e+00 2481 2481 3.7339583333520835e+01 2481 3095 1.0416666666666667e-10 2481 2487 6.2499999999999991e-11 2481 3096 -5.3333333333229165e+00 2481 2494 -1.0666666666708332e+01 2481 3466 -4.5860624244724788e-28 2481 3100 5.3333333333229165e+00 2481 3103 1.3552527156068805e-19 2481 2485 -8.0000000000000000e+00 2481 3093 1.3333333333322916e+01 2481 3105 1.3552527156068805e-19 2481 3092 1.0667708333333334e+01 2481 3091 8.0000000000000000e+00 2481 2483 -1.0667708333333334e+01 2481 2482 -8.0000000000000000e+00 2481 4760 -5.3333333332812494e+00 2482 2482 5.3354166666874995e+01 2482 3096 -1.8812360437258079e-27 2482 3405 -5.3312499999999998e+00 2482 3106 5.3312499999999998e+00 2482 3401 5.3395833333333327e+00 2482 2489 -5.3333333333333330e+00 2482 3467 2.1334374999999998e+01 2482 2488 -1.0661458333333334e+01 2482 3465 -5.3312499999999998e+00 2482 3463 3.6295685768920020e-28 2482 3464 -2.6635416666145830e+00 2482 3466 1.0666666666562499e+01 2482 2487 -1.0666666666666666e+01 2482 3105 -2.1334374999999998e+01 2482 3092 -5.3312499999999998e+00 2482 3091 -2.6635416666145835e+00 2482 2483 -1.0661458333333334e+01 2482 2481 -8.0000000000000000e+00 2482 111 -8.0000000000000000e+00 2483 2483 6.4049999999999997e+01 2483 3458 -5.3312499999999998e+00 2483 3108 -1.0416666666666664e-02 2483 3097 5.3312499999999998e+00 2483 2491 -1.0667708333333334e+01 2483 3401 -5.3312499999999998e+00 2483 3106 -1.0416666666666664e-02 2483 3107 2.1329166666666662e+01 2483 3402 -5.3312499999999998e+00 2483 2490 -1.0661458333333334e+01 2483 2489 -1.0667708333333334e+01 2483 3103 -2.1329166666666662e+01 2483 2485 -1.0661458333333334e+01 2483 3093 -5.3312499999999998e+00 2483 3092 1.0416666666666664e-02 2483 3105 2.1329166666666662e+01 2483 3091 -5.3312499999999998e+00 2483 2482 -1.0661458333333334e+01 2483 2481 -1.0667708333333334e+01 2484 2484 3.7339583333458336e+01 2484 3474 6.2499999999999991e-11 2484 2492 -1.0666666666687499e+01 2484 2486 -1.0667708333333334e+01 2484 3473 1.0667708333333334e+01 2484 3104 5.3333333333229165e+00 2484 3099 -1.3552527156068805e-19 2484 3098 -1.3333333333322916e+01 2484 2485 -8.0000000000000000e+00 2484 820 5.3333333333229165e+00 2484 823 1.3552527156068805e-19 2484 112 -8.0000000000000000e+00 2484 821 -1.3333333333322916e+01 2485 2485 5.3354166667000008e+01 2485 3701 -1.0416666666666666e-11 2485 3100 -6.2499999999999991e-11 2485 3095 -1.0416666666666666e-11 2485 2494 4.1666666666666665e-11 2485 3474 -1.0416666666666666e-11 2485 3104 -6.2499999999999991e-11 2485 3698 -1.0416666666666666e-11 2485 2492 4.1666666666666665e-11 2485 3101 1.0666666666583334e+01 2485 2493 -1.0666666666666666e+01 2485 3108 5.3312499999999998e+00 2485 3459 -5.3312499999999998e+00 2485 3097 -5.3395833333333327e+00 2485 2491 -5.3333333333333330e+00 2485 3103 2.1334374999999998e+01 2485 2483 -1.0661458333333334e+01 2485 3092 -5.3312499999999998e+00 2485 3093 -2.6635416666250000e+00 2485 2481 -8.0000000000000000e+00 2485 3099 2.1334374999999998e+01 2485 3473 -5.3312499999999998e+00 2485 3098 2.6635416666250000e+00 2485 2486 -1.0661458333333334e+01 2485 2484 -8.0000000000000000e+00 2486 2486 6.4049999999999997e+01 2486 3472 -2.1329166666666666e+01 2486 2490 -1.0661458333333332e+01 2486 3473 1.0416666666666664e-02 2486 2484 -1.0667708333333334e+01 2486 3097 5.3312499999999998e+00 2486 3459 1.0416666666666664e-02 2486 3458 -5.3312499999999998e+00 2486 2491 -1.0667708333333334e+01 2486 3099 -2.1329166666666662e+01 2486 3098 5.3312499999999998e+00 2486 2485 -1.0661458333333334e+01 2486 938 5.3312499999999998e+00 2486 941 -1.0416666666666664e-02 2486 819 5.3312499999999998e+00 2486 118 -1.0667708333333334e+01 2486 823 -2.1329166666666662e+01 2486 112 -1.0661458333333334e+01 2486 821 5.3312499999999998e+00 2487 2487 5.3333333333833323e+01 2487 3463 5.3333333333229165e+00 2487 3704 -5.3333333333229165e+00 2487 2481 6.2500000000000004e-11 2487 3096 5.3333333333229165e+00 2487 3095 -5.3333333332812494e+00 2487 2494 -1.0666666666708332e+01 2487 3091 2.0194839173657902e-27 2487 3464 -2.0194839173657902e-27 2487 3466 -1.0666666666666666e+01 2487 2482 -1.0666666666666666e+01 2487 4774 1.0666666666625000e+01 2487 111 6.2500000000000004e-11 2487 5047 -5.3333333332812494e+00 2487 4155 -5.3333333333437496e+00 2487 4773 1.0666666666583334e+01 2487 4772 -1.0666666666791667e+01 2487 5038 -5.3333333333020834e+00 2487 4153 -1.0666666666666666e+01 2487 4771 3.2000000000000000e+01 2487 115 -1.5999999999947917e+01 2487 4760 1.0416666666666667e-10 2488 2488 6.4049999999999997e+01 2488 3468 -2.1329166666666666e+01 2488 2490 -1.0661458333333332e+01 2488 3465 1.0416666666666664e-02 2488 3402 -5.3312499999999998e+00 2488 3405 1.0416666666666664e-02 2488 3401 -5.3312499999999998e+00 2488 2489 -1.0667708333333334e+01 2488 3467 -2.1329166666666662e+01 2488 2482 -1.0661458333333334e+01 2488 3464 -5.3312499999999998e+00 2488 561 5.3312499999999998e+00 2488 864 1.0416666666666664e-02 2488 863 -5.3312499999999998e+00 2488 117 -1.0667708333333334e+01 2488 563 -2.1329166666666662e+01 2488 562 5.3312499999999998e+00 2488 110 -1.0661458333333334e+01 2488 111 -1.0667708333333334e+01 2489 2489 3.2012500000000003e+01 2489 3468 1.0842021724855044e-19 2489 3467 -1.0842021724855044e-19 2489 3405 1.0667708333333334e+01 2489 2488 -1.0667708333333334e+01 2489 3105 -1.3552527156068805e-19 2489 2482 -5.3333333333333330e+00 2489 3401 5.3333333333333330e+00 2489 3107 1.3552527156068805e-19 2489 3106 -1.0667708333333334e+01 2489 3402 5.3333333333333330e+00 2489 2483 -1.0667708333333334e+01 2489 2490 -5.3333333333333330e+00 2490 2490 6.4041666666666671e+01 2490 3472 2.1334374999999998e+01 2490 2486 -1.0661458333333332e+01 2490 3468 2.1334374999999998e+01 2490 2488 -1.0661458333333332e+01 2490 3108 5.3312499999999998e+00 2490 3459 -5.3312499999999998e+00 2490 3458 5.3395833333333327e+00 2490 2491 -5.3333333333333330e+00 2490 3405 -5.3312499999999998e+00 2490 3107 -2.1334374999999998e+01 2490 3106 5.3312499999999998e+00 2490 3402 5.3395833333333327e+00 2490 2483 -1.0661458333333334e+01 2490 2489 -5.3333333333333330e+00 2490 941 5.3312499999999998e+00 2490 569 5.3312499999999998e+00 2490 938 -5.3395833333333327e+00 2490 118 -5.3333333333333330e+00 2490 568 -2.1334374999999998e+01 2490 113 -1.0661458333333334e+01 2490 567 5.3312499999999998e+00 2490 864 -5.3312499999999998e+00 2490 863 5.3395833333333327e+00 2490 117 -5.3333333333333330e+00 2491 2491 3.2012500000000003e+01 2491 3107 -1.3552527156068805e-19 2491 3103 -1.3552527156068805e-19 2491 3108 -1.0667708333333334e+01 2491 2483 -1.0667708333333334e+01 2491 3099 1.3552527156068805e-19 2491 2485 -5.3333333333333330e+00 2491 3097 -5.3333333333333330e+00 2491 3472 -1.3552527156068805e-19 2491 3459 1.0667708333333334e+01 2491 3458 5.3333333333333330e+00 2491 2486 -1.0667708333333334e+01 2491 2490 -5.3333333333333330e+00 2492 2492 3.2000000000249997e+01 2492 3699 1.0666666666687499e+01 2492 3474 -4.1666666666666665e-11 2492 2484 -1.0666666666687499e+01 2492 3098 5.3333333333124999e+00 2492 3702 -5.3333333333124999e+00 2492 3698 -4.1666666666666665e-11 2492 2485 4.1666666666666665e-11 2492 3101 5.3333333333124999e+00 2492 3104 -1.0666666666687499e+01 2492 2493 -1.0666666666687499e+01 2492 817 -5.3333333333124999e+00 2492 816 4.1666666666666665e-11 2492 115 4.1666666666666665e-11 2492 818 -5.3333333333124999e+00 2492 116 -1.0666666666687499e+01 2492 112 4.1666666666666665e-11 2492 821 5.3333333333124999e+00 2492 820 -1.0666666666687499e+01 2493 2493 4.2666666666916662e+01 2493 3100 5.3333333333229165e+00 2493 3701 6.2500000000000004e-11 2493 3704 -5.3333333333229165e+00 2493 2494 -1.0666666666687499e+01 2493 3702 2.1333333333312499e+01 2493 3699 -5.3333333333229165e+00 2493 3698 6.2499999999999991e-11 2493 3101 -2.1333333333312499e+01 2493 3104 5.3333333333229165e+00 2493 2485 -1.0666666666666666e+01 2493 2492 -1.0666666666687499e+01 2493 115 -1.0666666666666666e+01 2494 2494 3.2000000000229164e+01 2494 3704 1.0666666666687499e+01 2494 3096 -2.8940292364521930e-29 2494 3095 5.3333333332916668e+00 2494 2481 -1.0666666666708332e+01 2494 2487 -1.0666666666708332e+01 2494 3101 5.3333333333124999e+00 2494 3701 -4.1666666666666665e-11 2494 3702 -5.3333333333124999e+00 2494 2493 -1.0666666666687499e+01 2494 2485 4.1666666666666665e-11 2494 3093 -5.3333333333124999e+00 2494 3100 -1.0666666666687499e+01 2494 115 4.1666666666666665e-11 2494 4771 -5.3333333333124999e+00 2494 4760 5.3333333332916668e+00 2495 2495 1.6006250000000001e+01 2496 2496 1.6010416666666668e+01 2497 2497 6.4049999999999997e+01 2497 3147 -5.3312499999999998e+00 2497 3141 -1.0416666666666664e-02 2497 3142 2.1329166666666662e+01 2497 3139 -1.0416666666666664e-02 2497 3140 2.1329166666666662e+01 2497 3143 -5.3312499999999998e+00 2497 2498 -1.0667708333333334e+01 2497 3119 1.0416666666666664e-02 2497 3137 -2.1329166666666662e+01 2498 2498 5.8710416666666667e+01 2498 3230 5.3302083333333332e+00 2498 3166 1.0662500000000000e+01 2498 3152 -1.0679166666666665e+01 2498 2506 -5.3343749999999996e+00 2498 3142 -1.0842021724855044e-19 2498 3148 2.1331249999999997e+01 2498 3227 5.3302083333333332e+00 2498 2500 -1.0660416666666666e+01 2498 3147 2.4001041666666666e+01 2498 3456 1.0662500000000000e+01 2498 3146 -1.0679166666666665e+01 2498 2505 -5.3343749999999996e+00 2498 3140 1.0842021724855044e-19 2498 3139 -1.0667708333333334e+01 2498 3143 2.4001041666666666e+01 2498 2497 -1.0667708333333334e+01 2499 2499 3.7372916666666669e+01 2500 2500 5.3383333333333333e+01 2500 3152 1.0662500000000000e+01 2500 3249 1.0662500000000000e+01 2500 3231 1.5995833333333334e+01 2500 3500 -1.0662500000000000e+01 2500 3230 -1.0683333333333334e+01 2500 2506 -1.0672916666666666e+01 2500 3148 -3.1995833333333334e+01 2500 3146 1.0662500000000000e+01 2500 3227 -1.0683333333333334e+01 2500 2498 -1.0660416666666666e+01 2500 2505 -1.0672916666666666e+01 2500 3225 1.5995833333333334e+01 2500 3226 1.0668750000000001e+01 2501 2501 3.2024999999999999e+01 2502 2502 1.0683333333333334e+01 2503 2503 1.6006250000000001e+01 2504 2504 3.7372916666666669e+01 2505 2505 2.1349999999999998e+01 2505 3225 -5.3322916666666664e+00 2505 3249 -5.3343749999999996e+00 2505 3227 2.0833333333333337e-03 2505 3148 5.3322916666666664e+00 2505 2500 -1.0672916666666666e+01 2505 3146 -5.3343749999999996e+00 2505 3147 -5.3322916666666664e+00 2505 3456 -1.0672916666666666e+01 2505 2498 -5.3343749999999996e+00 2506 2506 2.1349999999999998e+01 2506 3148 5.3322916666666664e+00 2506 3152 -5.3343749999999996e+00 2506 3143 -5.3322916666666664e+00 2506 2498 -5.3343749999999996e+00 2506 3230 2.0833333333333337e-03 2506 3231 -5.3322916666666664e+00 2506 2500 -1.0672916666666666e+01 2506 3500 5.3343749999999996e+00 2506 3166 -1.0672916666666666e+01 2507 2507 3.2024999999999999e+01 2508 2508 1.6006250000000001e+01 2509 2509 3.2020833333333336e+01 2510 2510 6.4049999999999997e+01 2510 3484 -5.3312499999999998e+00 2510 3132 -1.0416666666666664e-02 2510 3483 -5.3312499999999998e+00 2510 2514 -1.0667708333333334e+01 2510 3131 2.1329166666666662e+01 2510 2513 -1.0661458333333334e+01 2510 3482 -5.3312499999999998e+00 2510 3130 -1.0416666666666664e-02 2510 3128 -5.3312499999999998e+00 2510 2512 -1.0667708333333334e+01 2510 3127 -2.1329166666666662e+01 2510 3121 1.0416666666666664e-02 2510 3129 2.1329166666666662e+01 2511 2511 3.2020833333333336e+01 2512 2512 3.2012500000000003e+01 2512 3128 5.3333333333333330e+00 2512 3482 5.3333333333333330e+00 2512 2513 -5.3333333333333330e+00 2512 3131 -1.0842021724855044e-19 2512 3127 -1.0842021724855044e-19 2512 3130 -1.0667708333333334e+01 2512 2510 -1.0667708333333334e+01 2512 992 -1.3552527156068805e-19 2512 993 1.3552527156068805e-19 2512 987 1.0667708333333334e+01 2512 280 -1.0667708333333334e+01 2513 2513 6.4041666666666671e+01 2513 3483 5.3395833333333327e+00 2513 2514 -5.3333333333333330e+00 2513 3482 5.3395833333333327e+00 2513 2512 -5.3333333333333330e+00 2513 3132 5.3312499999999998e+00 2513 3131 -2.1334374999999998e+01 2513 2510 -1.0661458333333334e+01 2513 3130 5.3312499999999998e+00 2513 690 5.3312499999999998e+00 2513 965 -5.3312499999999998e+00 2513 964 5.3395833333333327e+00 2513 285 -5.3333333333333330e+00 2513 994 2.1334374999999998e+01 2513 283 -1.0661458333333334e+01 2513 1001 5.3312499999999998e+00 2513 987 -5.3312499999999998e+00 2513 993 -2.1334374999999998e+01 2513 280 -1.0661458333333334e+01 2513 897 -5.3312499999999998e+00 2513 689 -2.1334374999999998e+01 2513 688 5.3312499999999998e+00 2513 896 5.3395833333333327e+00 2513 278 -1.0661458333333334e+01 2513 284 -5.3333333333333330e+00 2514 2514 3.2012500000000003e+01 2514 2513 -5.3333333333333330e+00 2514 3483 5.3333333333333330e+00 2514 3484 5.3333333333333330e+00 2514 3129 -1.3552527156068805e-19 2514 3131 1.3552527156068805e-19 2514 3132 -1.0667708333333334e+01 2514 2510 -1.0667708333333334e+01 2514 994 1.3552527156068805e-19 2514 1000 -1.3552527156068805e-19 2514 1001 -1.0667708333333334e+01 2514 283 -1.0667708333333334e+01 2515 2515 3.2012500000000003e+01 2515 3481 5.3333333333333330e+00 2515 3128 5.3333333333333330e+00 2515 3126 1.3552527156068805e-19 2515 3134 1.3552527156068805e-19 2515 3133 -1.0667708333333334e+01 2515 2517 -1.0667708333333334e+01 2515 661 1.0842021724855044e-19 2515 668 1.0842021724855044e-19 2515 667 -1.0667708333333334e+01 2515 246 -1.0667708333333334e+01 2516 2516 3.2020833333333336e+01 2517 2517 6.4049999999999997e+01 2517 3128 -5.3312499999999998e+00 2517 3136 -1.0416666666666664e-02 2517 3135 2.1329166666666662e+01 2517 3123 1.0416666666666664e-02 2517 3126 -2.1329166666666662e+01 2517 3133 -1.0416666666666664e-02 2517 3134 2.1329166666666662e+01 2517 3481 -5.3312499999999998e+00 2517 2515 -1.0667708333333334e+01 2518 2518 1.6006250000000001e+01 2519 2519 3.2020833333333336e+01 2520 2520 1.6010416666666668e+01 2521 2521 1.6006250000000001e+01 2522 2522 3.2012500000000003e+01 2522 3130 1.3552527156068805e-19 2522 3133 -1.3552527156068805e-19 2522 2543 -5.3333333333333330e+00 2522 3128 -5.3333333333333330e+00 2522 3123 -1.3552527156068805e-19 2522 3126 1.0667708333333334e+01 2522 2525 -1.0667708333333334e+01 2522 3121 1.3552527156068805e-19 2522 2524 -1.0667708333333334e+01 2522 2523 -5.3333333333333330e+00 2522 3127 1.0667708333333334e+01 2523 2523 6.4041666666666671e+01 2523 3129 5.3312499999999998e+00 2523 3164 5.3312499999999998e+00 2523 2547 -5.3333333333333330e+00 2523 3125 2.1334374999999998e+01 2523 3165 5.3312499999999998e+00 2523 2531 -1.0661458333333334e+01 2523 3140 5.3312499999999998e+00 2523 2532 -5.3333333333333330e+00 2523 3119 2.1334374999999998e+01 2523 3137 -5.3312499999999998e+00 2523 2527 -1.0661458333333334e+01 2523 3135 5.3312499999999998e+00 2523 2526 -5.3333333333333330e+00 2523 3123 2.1334374999999998e+01 2523 3126 -5.3312499999999998e+00 2523 2525 -1.0661458333333334e+01 2523 3121 2.1334374999999998e+01 2523 2524 -1.0661458333333334e+01 2523 3127 -5.3312499999999998e+00 2523 2522 -5.3333333333333330e+00 2524 2524 6.4049999999999997e+01 2524 3129 -1.0416666666666664e-02 2524 3484 5.3312499999999998e+00 2524 2547 -1.0667708333333334e+01 2524 3132 2.1329166666666662e+01 2524 3483 5.3312499999999998e+00 2524 2546 -1.0661458333333334e+01 2524 3131 -1.0416666666666664e-02 2524 3482 5.3312499999999998e+00 2524 2545 -1.0667708333333334e+01 2524 3130 2.1329166666666662e+01 2524 3128 5.3312499999999998e+00 2524 2543 -1.0661458333333334e+01 2524 3127 1.0416666666666664e-02 2524 3121 -2.1329166666666662e+01 2524 2523 -1.0661458333333334e+01 2524 2522 -1.0667708333333334e+01 2525 2525 6.4049999999999997e+01 2525 3128 5.3312499999999998e+00 2525 3136 2.1329166666666662e+01 2525 2540 -1.0661458333333334e+01 2525 3134 -1.0416666666666664e-02 2525 3133 2.1329166666666662e+01 2525 3481 5.3312499999999998e+00 2525 2543 -1.0661458333333334e+01 2525 2544 -1.0667708333333334e+01 2525 3135 -1.0416666666666664e-02 2525 2526 -1.0667708333333334e+01 2525 3126 1.0416666666666664e-02 2525 3123 -2.1329166666666662e+01 2525 2523 -1.0661458333333334e+01 2525 2522 -1.0667708333333334e+01 2526 2526 3.2012500000000003e+01 2526 3136 1.0842021724855044e-19 2526 3141 -1.3552527156068805e-19 2526 2540 -5.3333333333333330e+00 2526 3119 -1.3552527156068805e-19 2526 3137 1.0667708333333334e+01 2526 2527 -1.0667708333333334e+01 2526 3123 1.0842021724855044e-19 2526 2525 -1.0667708333333334e+01 2526 2523 -5.3333333333333330e+00 2526 3135 -1.0667708333333334e+01 2527 2527 6.4049999999999997e+01 2527 3141 2.1329166666666662e+01 2527 2540 -1.0661458333333334e+01 2527 3142 -1.0416666666666664e-02 2527 3147 5.3312499999999998e+00 2527 2538 -1.0667708333333334e+01 2527 3140 -1.0416666666666664e-02 2527 3139 2.1329166666666662e+01 2527 3143 5.3312499999999998e+00 2527 2529 -1.0661458333333334e+01 2527 2532 -1.0667708333333334e+01 2527 3137 1.0416666666666664e-02 2527 3119 -2.1329166666666662e+01 2527 2523 -1.0661458333333334e+01 2527 2526 -1.0667708333333334e+01 2528 2528 3.2012500000000003e+01 2528 3162 1.3552527156068805e-19 2528 3163 -1.3552527156068805e-19 2528 2546 -5.3333333333333330e+00 2528 3157 -5.3333333333333330e+00 2528 3150 -1.3552527156068805e-19 2528 3155 1.0667708333333334e+01 2528 2531 -1.0667708333333334e+01 2528 3145 1.3552527156068805e-19 2528 2530 -1.0667708333333334e+01 2528 2529 -5.3333333333333330e+00 2528 3156 1.0667708333333334e+01 2528 3149 -5.3333333333333330e+00 2529 2529 6.4041666666666671e+01 2529 3159 5.3312499999999998e+00 2529 3427 -5.3312499999999998e+00 2529 3144 -5.3395833333333327e+00 2529 2536 -5.3333333333333330e+00 2529 3151 2.1334374999999998e+01 2529 3452 5.3312499999999998e+00 2529 2537 -1.0661458333333334e+01 2529 3142 5.3312499999999998e+00 2529 3147 -5.3395833333333327e+00 2529 2538 -5.3333333333333330e+00 2529 3139 -2.1334374999999998e+01 2529 3140 5.3312499999999998e+00 2529 2527 -1.0661458333333334e+01 2529 3165 5.3312499999999998e+00 2529 3143 -5.3395833333333327e+00 2529 2532 -5.3333333333333330e+00 2529 3150 2.1334374999999998e+01 2529 3155 -5.3312499999999998e+00 2529 2531 -1.0661458333333334e+01 2529 3145 2.1334374999999998e+01 2529 2530 -1.0661458333333334e+01 2529 3156 -5.3312499999999998e+00 2529 3149 -5.3395833333333327e+00 2529 2528 -5.3333333333333330e+00 2530 2530 6.4049999999999997e+01 2530 3447 5.3312499999999998e+00 2530 3162 2.1329166666666662e+01 2530 3157 5.3312499999999998e+00 2530 2546 -1.0661458333333334e+01 2530 3144 5.3312499999999998e+00 2530 3159 -1.0416666666666664e-02 2530 3426 -5.3312499999999998e+00 2530 2536 -1.0667708333333334e+01 2530 3161 -1.0416666666666664e-02 2530 3160 2.1329166666666662e+01 2530 3441 5.3312499999999998e+00 2530 2534 -1.0661458333333334e+01 2530 2533 -1.0667708333333334e+01 2530 3156 1.0416666666666664e-02 2530 3145 -2.1329166666666662e+01 2530 2529 -1.0661458333333334e+01 2530 3149 5.3312499999999998e+00 2530 2528 -1.0667708333333334e+01 2531 2531 6.4049999999999997e+01 2531 3157 5.3312499999999998e+00 2531 3125 -2.1329166666666662e+01 2531 2523 -1.0661458333333334e+01 2531 3164 -1.0416666666666664e-02 2531 3163 2.1329166666666662e+01 2531 3484 5.3312499999999998e+00 2531 2546 -1.0661458333333334e+01 2531 2547 -1.0667708333333334e+01 2531 3165 -1.0416666666666664e-02 2531 3143 5.3312499999999998e+00 2531 2532 -1.0667708333333334e+01 2531 3155 1.0416666666666664e-02 2531 3150 -2.1329166666666662e+01 2531 3149 5.3312499999999998e+00 2531 2529 -1.0661458333333334e+01 2531 2528 -1.0667708333333334e+01 2532 2532 3.2012500000000003e+01 2532 3125 -1.3552527156068805e-19 2532 3119 1.3552527156068805e-19 2532 2523 -5.3333333333333330e+00 2532 3139 1.3552527156068805e-19 2532 3140 -1.0667708333333334e+01 2532 2527 -1.0667708333333334e+01 2532 3150 1.3552527156068805e-19 2532 2531 -1.0667708333333334e+01 2532 2529 -5.3333333333333330e+00 2532 3165 -1.0667708333333334e+01 2532 3143 -5.3333333333333330e+00 2533 2533 3.2012500000000003e+01 2533 3451 1.0842021724855044e-19 2533 3162 -1.3552527156068805e-19 2533 2546 -5.3333333333333330e+00 2533 3447 -5.3333333333333330e+00 2533 3160 1.3552527156068805e-19 2533 3161 -1.0667708333333334e+01 2533 2530 -1.0667708333333334e+01 2533 3443 1.0842021724855044e-19 2533 2535 -1.0667708333333334e+01 2533 2534 -5.3333333333333330e+00 2533 3448 1.0667708333333334e+01 2533 3441 -5.3333333333333330e+00 2534 2534 6.4041666666666671e+01 2534 3408 -5.3312499999999998e+00 2534 3411 -5.3312499999999998e+00 2534 3407 5.3395833333333327e+00 2534 2542 -5.3333333333333330e+00 2534 3444 2.1334374999999998e+01 2534 3478 -5.3312499999999998e+00 2534 2541 -1.0661458333333334e+01 2534 3454 5.3312499999999998e+00 2534 3442 -5.3395833333333327e+00 2534 2539 -5.3333333333333330e+00 2534 3440 2.1334374999999998e+01 2534 3427 -5.3312499999999998e+00 2534 2537 -1.0661458333333334e+01 2534 3159 5.3312499999999998e+00 2534 3426 5.3395833333333327e+00 2534 2536 -5.3333333333333330e+00 2534 3160 -2.1334374999999998e+01 2534 3161 5.3312499999999998e+00 2534 2530 -1.0661458333333334e+01 2534 3443 2.1334374999999998e+01 2534 2535 -1.0661458333333334e+01 2534 3448 -5.3312499999999998e+00 2534 3441 -5.3395833333333327e+00 2534 2533 -5.3333333333333330e+00 2535 2535 6.4049999999999997e+01 2535 3447 5.3312499999999998e+00 2535 3451 2.1329166666666662e+01 2535 2546 -1.0661458333333334e+01 2535 3483 5.3312499999999998e+00 2535 3450 -1.0416666666666664e-02 2535 3482 5.3312499999999998e+00 2535 2545 -1.0667708333333334e+01 2535 3449 2.1329166666666662e+01 2535 2543 -1.0661458333333334e+01 2535 3412 5.3312499999999998e+00 2535 3408 1.0416666666666664e-02 2535 3407 -5.3312499999999998e+00 2535 2542 -1.0667708333333334e+01 2535 3448 1.0416666666666664e-02 2535 3443 -2.1329166666666662e+01 2535 2534 -1.0661458333333334e+01 2535 3441 5.3312499999999998e+00 2535 2533 -1.0667708333333334e+01 2536 2536 3.2012500000000003e+01 2536 3145 -1.3552527156068805e-19 2536 3151 1.3552527156068805e-19 2536 2529 -5.3333333333333330e+00 2536 3144 -5.3333333333333330e+00 2536 3440 -1.3552527156068805e-19 2536 3427 1.0667708333333334e+01 2536 2537 -1.0667708333333334e+01 2536 3160 -1.3552527156068805e-19 2536 2530 -1.0667708333333334e+01 2536 2534 -5.3333333333333330e+00 2536 3159 -1.0667708333333334e+01 2536 3426 5.3333333333333330e+00 2537 2537 6.4049999999999997e+01 2537 3442 5.3312499999999998e+00 2537 3454 -1.0416666666666664e-02 2537 3453 2.1329166666666662e+01 2537 2540 -1.0661458333333334e+01 2537 2539 -1.0667708333333334e+01 2537 3144 5.3312499999999998e+00 2537 3452 -1.0416666666666664e-02 2537 3151 -2.1329166666666662e+01 2537 3147 5.3312499999999998e+00 2537 2529 -1.0661458333333334e+01 2537 2538 -1.0667708333333334e+01 2537 3427 1.0416666666666664e-02 2537 3440 -2.1329166666666662e+01 2537 3426 -5.3312499999999998e+00 2537 2534 -1.0661458333333334e+01 2537 2536 -1.0667708333333334e+01 2538 2538 3.2012500000000003e+01 2538 3141 1.3552527156068805e-19 2538 3453 -1.3552527156068805e-19 2538 2540 -5.3333333333333330e+00 2538 3151 -1.3552527156068805e-19 2538 3452 -1.0667708333333334e+01 2538 2537 -1.0667708333333334e+01 2538 3139 -1.3552527156068805e-19 2538 2527 -1.0667708333333334e+01 2538 2529 -5.3333333333333330e+00 2538 3142 -1.0667708333333334e+01 2538 3147 -5.3333333333333330e+00 2539 2539 3.2012500000000003e+01 2539 3444 -1.3552527156068805e-19 2539 3440 1.0842021724855044e-19 2539 2534 -5.3333333333333330e+00 2539 3442 -5.3333333333333330e+00 2539 3453 1.0842021724855044e-19 2539 3454 -1.0667708333333334e+01 2539 2537 -1.0667708333333334e+01 2539 3476 1.3552527156068805e-19 2539 2541 -1.0667708333333334e+01 2539 2540 -5.3333333333333330e+00 2539 3478 1.0667708333333334e+01 2540 2540 6.4041666666666671e+01 2540 3479 5.3312499999999998e+00 2540 3134 5.3312499999999998e+00 2540 2544 -5.3333333333333330e+00 2540 3136 -2.1334374999999998e+01 2540 3135 5.3312499999999998e+00 2540 2525 -1.0661458333333334e+01 2540 3137 -5.3312499999999998e+00 2540 2526 -5.3333333333333330e+00 2540 3141 -2.1334374999999998e+01 2540 3142 5.3312499999999998e+00 2540 2527 -1.0661458333333334e+01 2540 3452 5.3312499999999998e+00 2540 2538 -5.3333333333333330e+00 2540 3453 -2.1334374999999998e+01 2540 3454 5.3312499999999998e+00 2540 2537 -1.0661458333333334e+01 2540 3476 2.1334374999999998e+01 2540 2541 -1.0661458333333334e+01 2540 3478 -5.3312499999999998e+00 2540 2539 -5.3333333333333330e+00 2541 2541 6.4049999999999997e+01 2541 3479 -1.0416666666666664e-02 2541 3481 5.3312499999999998e+00 2541 2544 -1.0667708333333334e+01 2541 3480 2.1329166666666662e+01 2541 3412 5.3312499999999998e+00 2541 2543 -1.0661458333333334e+01 2541 3411 1.0416666666666664e-02 2541 3407 -5.3312499999999998e+00 2541 2542 -1.0667708333333334e+01 2541 3444 -2.1329166666666662e+01 2541 3442 5.3312499999999998e+00 2541 2534 -1.0661458333333334e+01 2541 3478 1.0416666666666664e-02 2541 3476 -2.1329166666666662e+01 2541 2540 -1.0661458333333334e+01 2541 2539 -1.0667708333333334e+01 2542 2542 3.2012500000000003e+01 2542 3480 1.3552527156068805e-19 2542 3449 -1.3552527156068805e-19 2542 2543 -5.3333333333333330e+00 2542 3412 -5.3333333333333330e+00 2542 3443 -1.3552527156068805e-19 2542 3408 1.0667708333333334e+01 2542 2535 -1.0667708333333334e+01 2542 3444 1.3552527156068805e-19 2542 2541 -1.0667708333333334e+01 2542 2534 -5.3333333333333330e+00 2542 3411 1.0667708333333334e+01 2542 3407 5.3333333333333330e+00 2543 2543 6.4041666666666671e+01 2543 3450 5.3312499999999998e+00 2543 3131 5.3312499999999998e+00 2543 3482 -5.3395833333333327e+00 2543 2545 -5.3333333333333330e+00 2543 3130 -2.1334374999999998e+01 2543 3127 -5.3312499999999998e+00 2543 2524 -1.0661458333333334e+01 2543 3126 -5.3312499999999998e+00 2543 3128 -5.3395833333333327e+00 2543 2522 -5.3333333333333330e+00 2543 3133 -2.1334374999999998e+01 2543 3134 5.3312499999999998e+00 2543 2525 -1.0661458333333334e+01 2543 3479 5.3312499999999998e+00 2543 3481 -5.3395833333333327e+00 2543 2544 -5.3333333333333330e+00 2543 3480 -2.1334374999999998e+01 2543 3411 -5.3312499999999998e+00 2543 2541 -1.0661458333333334e+01 2543 3449 -2.1334374999999998e+01 2543 2535 -1.0661458333333334e+01 2543 3408 -5.3312499999999998e+00 2543 3412 -5.3395833333333327e+00 2543 2542 -5.3333333333333330e+00 2544 2544 3.2012500000000003e+01 2544 3476 -1.3552527156068805e-19 2544 3136 -1.3552527156068805e-19 2544 2540 -5.3333333333333330e+00 2544 3133 1.3552527156068805e-19 2544 3134 -1.0667708333333334e+01 2544 2525 -1.0667708333333334e+01 2544 3480 -1.3552527156068805e-19 2544 2541 -1.0667708333333334e+01 2544 2543 -5.3333333333333330e+00 2544 3479 -1.0667708333333334e+01 2544 3481 -5.3333333333333330e+00 2545 2545 3.2012500000000003e+01 2545 3132 1.3552527156068805e-19 2545 3451 -1.3552527156068805e-19 2545 2546 -5.3333333333333330e+00 2545 3483 -5.3333333333333330e+00 2545 3449 1.3552527156068805e-19 2545 3450 -1.0667708333333334e+01 2545 2535 -1.0667708333333334e+01 2545 3130 -1.3552527156068805e-19 2545 2524 -1.0667708333333334e+01 2545 2543 -5.3333333333333330e+00 2545 3131 -1.0667708333333334e+01 2545 3482 -5.3333333333333330e+00 2546 2546 6.4041666666666671e+01 2546 3448 -5.3312499999999998e+00 2546 3161 5.3312499999999998e+00 2546 3447 -5.3395833333333327e+00 2546 2533 -5.3333333333333330e+00 2546 3162 -2.1334374999999998e+01 2546 3156 -5.3312499999999998e+00 2546 2530 -1.0661458333333334e+01 2546 3155 -5.3312499999999998e+00 2546 3157 -5.3395833333333327e+00 2546 2528 -5.3333333333333330e+00 2546 3163 -2.1334374999999998e+01 2546 3164 5.3312499999999998e+00 2546 2531 -1.0661458333333334e+01 2546 3129 5.3312499999999998e+00 2546 3484 -5.3395833333333327e+00 2546 2547 -5.3333333333333330e+00 2546 3132 -2.1334374999999998e+01 2546 3131 5.3312499999999998e+00 2546 2524 -1.0661458333333334e+01 2546 3451 -2.1334374999999998e+01 2546 2535 -1.0661458333333334e+01 2546 3450 5.3312499999999998e+00 2546 3483 -5.3395833333333327e+00 2546 2545 -5.3333333333333330e+00 2547 2547 3.2012500000000003e+01 2547 3121 -1.3552527156068805e-19 2547 3125 1.0842021724855044e-19 2547 2523 -5.3333333333333330e+00 2547 3163 1.0842021724855044e-19 2547 3164 -1.0667708333333334e+01 2547 2531 -1.0667708333333334e+01 2547 3132 -1.3552527156068805e-19 2547 2524 -1.0667708333333334e+01 2547 2546 -5.3333333333333330e+00 2547 3129 -1.0667708333333334e+01 2547 3484 -5.3333333333333330e+00 2548 2548 3.2012500000000003e+01 2548 3484 5.3333333333333330e+00 2548 3157 5.3333333333333330e+00 2548 2553 -5.3333333333333330e+00 2548 3155 1.3552527156068805e-19 2548 3164 1.3552527156068805e-19 2548 3163 -1.0667708333333334e+01 2548 2550 -1.0667708333333334e+01 2548 999 1.3552527156068805e-19 2548 1003 1.3552527156068805e-19 2548 1002 -1.0667708333333334e+01 2548 487 -1.0667708333333334e+01 2549 2549 3.2020833333333336e+01 2550 2550 6.4049999999999997e+01 2550 3157 -5.3312499999999998e+00 2550 3125 1.0416666666666664e-02 2550 3165 2.1329166666666662e+01 2550 3143 -5.3312499999999998e+00 2550 3150 1.0416666666666664e-02 2550 3155 -2.1329166666666662e+01 2550 3149 -5.3312499999999998e+00 2550 2553 -1.0661458333333334e+01 2550 2554 -1.0667708333333334e+01 2550 3163 -1.0416666666666664e-02 2550 3164 2.1329166666666662e+01 2550 3484 -5.3312499999999998e+00 2550 2548 -1.0667708333333334e+01 2551 2551 4.2704166666666673e+01 2551 3149 2.1684043449710089e-19 2551 3152 6.2499999999999986e-03 2551 3143 -5.3281250000000000e+00 2551 2554 -5.3322916666666664e+00 2551 3166 -1.0672916666666666e+01 2551 3500 -6.2500000000000003e-03 2551 3505 -5.3322916666666664e+00 2551 3503 1.5998958333333331e+01 2551 3501 -6.2499999999999995e-03 2551 3154 5.3322916666666664e+00 2551 3153 -1.5998958333333331e+01 2551 2553 -1.0666666666666666e+01 2551 2552 -1.0668750000000001e+01 2552 2552 3.2024999999999999e+01 2552 3534 -5.3312499999999998e+00 2552 3509 -4.1666666666666666e-03 2552 3158 -5.3312499999999998e+00 2552 2561 -1.0668750000000001e+01 2552 3504 -4.1666666666666666e-03 2552 3508 1.0668750000000001e+01 2552 3505 1.0668750000000001e+01 2552 3503 -5.3312499999999998e+00 2552 3501 4.1666666666666675e-03 2552 2553 4.1666666666666657e-03 2552 3154 -1.0668750000000001e+01 2552 3153 5.3312499999999998e+00 2552 2551 -1.0668750000000001e+01 2553 2553 5.3381249999999994e+01 2553 3158 -2.6593750000000003e+00 2553 2561 -8.0000000000000000e+00 2553 3157 5.3395833333333327e+00 2553 2548 -5.3333333333333330e+00 2553 3152 2.1705219273391446e-19 2553 3509 -1.0416666666666667e-03 2553 3163 5.3312499999999998e+00 2553 3155 2.1334374999999998e+01 2553 3150 -5.3312499999999998e+00 2553 3149 -2.6583333333333332e+00 2553 2550 -1.0661458333333334e+01 2553 2554 -8.0000000000000000e+00 2553 3154 -6.2499999999999995e-03 2553 3501 1.0416666666666667e-03 2553 2552 4.1666666666666666e-03 2553 3153 1.0657291666666666e+01 2553 2551 -1.0666666666666666e+01 2553 1005 5.3312499999999998e+00 2553 1003 -2.1334374999999998e+01 2553 1002 5.3312499999999998e+00 2553 487 -1.0661458333333334e+01 2554 2554 3.7350000000000009e+01 2554 3153 -3.2249014814734037e-20 2554 3166 2.1684043449710089e-19 2554 3152 5.3322916666666664e+00 2554 2551 -5.3322916666666664e+00 2554 3165 -1.3552527156068805e-19 2554 3143 1.3334375000000000e+01 2554 3155 -1.3552527156068805e-19 2554 3150 1.0667708333333334e+01 2554 3149 8.0000000000000000e+00 2554 2550 -1.0667708333333334e+01 2554 2553 -8.0000000000000000e+00 2555 2555 3.7372916666666669e+01 2556 2556 1.6006250000000001e+01 2557 2557 2.1360416666666666e+01 2558 2558 2.1343750000000000e+01 2559 2559 2.1345833333333331e+01 2560 2560 2.6693750000000001e+01 2561 2561 3.7352083333333333e+01 2561 2553 -8.0000000000000000e+00 2561 3158 1.3332291666666665e+01 2561 3534 1.3332291666666665e+01 2561 3508 -5.3322916666666664e+00 2561 3509 6.2500000000000003e-03 2561 3154 5.3322916666666664e+00 2561 2552 -1.0668750000000001e+01 2561 1003 -1.0842021724855044e-19 2561 1004 1.0842021724855044e-19 2561 1005 -1.0667708333333334e+01 2561 487 -1.0667708333333334e+01 2562 2562 5.3383333333333333e+01 2562 3192 5.3281250000000000e+00 2562 3274 1.0662500000000000e+01 2562 3198 -2.1684043449710089e-19 2562 2576 -5.3343749999999996e+00 2562 3174 -1.0679166666666665e+01 2562 3485 -5.3302083333333332e+00 2562 3176 -1.0416666666666666e-02 2562 3177 3.1999999999999996e+01 2562 3270 5.3322916666666664e+00 2562 2572 -1.5994791666666666e+01 2562 2571 -1.0670833333333334e+01 2562 3170 1.0658333333333331e+01 2562 2568 6.2500000000000003e-03 2562 3171 5.3322916666666664e+00 2562 3487 -5.3281250000000000e+00 2562 2570 -1.0666666666666664e+01 2562 3190 -2.1684043449710089e-19 2562 3168 5.3322916666666664e+00 2562 2563 6.2499999999999986e-03 2562 3169 1.0666666666666666e+01 2562 2564 -1.0666666666666666e+01 2563 2563 4.2697916666666671e+01 2563 3330 -5.3322916666666664e+00 2563 3176 5.3281250000000000e+00 2563 3192 -1.0416666666666666e-02 2563 3194 2.1331249999999997e+01 2563 2578 -1.0666666666666666e+01 2563 3571 -5.3322916666666664e+00 2563 2571 -1.0670833333333334e+01 2563 3191 -6.2500000000000003e-03 2563 3197 5.3322916666666664e+00 2563 2573 -1.0668750000000001e+01 2563 3169 -2.1684043449710089e-19 2563 3168 -5.3322916666666664e+00 2563 2562 6.2499999999999986e-03 2563 3190 1.5998958333333333e+01 2563 2564 -1.0666666666666666e+01 2564 2564 4.2720833333333331e+01 2564 3359 1.0416666666666667e-03 2564 3195 -6.2500000000000003e-03 2564 3491 1.0416666666666667e-03 2564 2587 4.1666666666666666e-03 2564 3171 -2.1705219273391446e-19 2564 3198 1.0657291666666666e+01 2564 2568 -1.0666666666666666e+01 2564 3191 1.0416666666666667e-03 2564 3197 -6.2500000000000003e-03 2564 3333 -1.0416666666666667e-03 2564 2573 4.1666666666666666e-03 2564 3196 1.0658333333333333e+01 2564 2574 -1.0666666666666666e+01 2564 3168 5.0116116045879435e-20 2564 3190 -1.0657291666666666e+01 2564 3169 -1.0656249999999998e+01 2564 2563 -1.0666666666666666e+01 2564 2562 -1.0666666666666666e+01 2565 2565 3.2022916666666667e+01 2565 3312 -5.3312499999999998e+00 2565 3256 -4.1666666666666666e-03 2565 3273 5.3312499999999998e+00 2565 2580 -1.0668750000000001e+01 2565 2581 4.1666666666666657e-03 2565 3280 -5.3312499999999998e+00 2565 3257 1.0668750000000001e+01 2565 2572 4.1666666666666657e-03 2565 3266 -5.3312499999999998e+00 2565 3260 1.0668750000000001e+01 2565 3262 -2.8940292364521927e-21 2565 3254 5.3291666666666666e+00 2565 3253 5.3291666666666666e+00 2565 2567 -1.0670833333333333e+01 2565 2566 -1.0670833333333333e+01 2566 2566 5.3383333333333333e+01 2566 3274 1.0662500000000000e+01 2566 3487 -5.3281250000000000e+00 2566 3279 2.1684043449710089e-19 2566 2576 -5.3343749999999996e+00 2566 3268 1.0658333333333331e+01 2566 3267 -1.0679166666666665e+01 2566 3485 -5.3302083333333332e+00 2566 2570 -1.0666666666666668e+01 2566 3266 3.1999999999999996e+01 2566 2572 -1.5994791666666666e+01 2566 3260 -5.3322916666666664e+00 2566 3490 -2.1684043449710089e-19 2566 3263 5.3322916666666664e+00 2566 2568 6.2499999999999986e-03 2566 3264 1.0666666666666666e+01 2566 2569 -1.0666666666666666e+01 2566 3253 1.0416666666666664e-02 2566 2567 6.2500000000000003e-03 2566 3262 5.3322916666666664e+00 2566 3254 -5.3281250000000000e+00 2566 2565 -1.0670833333333333e+01 2567 2567 4.2697916666666664e+01 2567 3493 5.3322916666666664e+00 2567 3277 -6.2500000000000003e-03 2567 3600 5.3322916666666664e+00 2567 2583 -1.0668750000000001e+01 2567 3280 2.1331249999999997e+01 2567 3257 -5.3322916666666664e+00 2567 2581 -1.0666666666666666e+01 2567 3264 -4.9904357809065860e-20 2567 3279 1.5998958333333333e+01 2567 2569 -1.0666666666666666e+01 2567 3254 1.0416666666666666e-02 2567 2566 6.2499999999999995e-03 2567 3262 -5.3322916666666664e+00 2567 3253 -5.3281250000000000e+00 2567 2565 -1.0670833333333333e+01 2568 2568 4.2704166666666666e+01 2568 3195 5.3322916666666664e+00 2568 3491 -6.2500000000000003e-03 2568 3495 5.3322916666666664e+00 2568 2587 -1.0668750000000001e+01 2568 3169 3.2249014814734037e-20 2568 3198 -1.5998958333333333e+01 2568 2564 -1.0666666666666666e+01 2568 3268 5.3281250000000000e+00 2568 3487 1.4583333333333332e-02 2568 2562 6.2499999999999995e-03 2568 3171 -5.3322916666666664e+00 2568 3170 5.3281250000000000e+00 2568 2570 -1.0672916666666666e+01 2568 3264 -2.1684043449710089e-19 2568 3263 -5.3322916666666664e+00 2568 2566 6.2499999999999986e-03 2568 3490 1.5998958333333333e+01 2568 2569 -1.0666666666666666e+01 2569 2569 4.2720833333333339e+01 2569 3624 -1.0416666666666667e-03 2569 3493 -6.2500000000000003e-03 2569 3277 1.0416666666666667e-03 2569 2583 4.1666666666666666e-03 2569 3491 1.0416666666666667e-03 2569 3495 -6.2500000000000003e-03 2569 3631 -1.0416666666666667e-03 2569 2587 4.1666666666666666e-03 2569 3494 1.0658333333333333e+01 2569 2588 -1.0666666666666666e+01 2569 3262 -2.1705219273391446e-19 2569 3279 -1.0657291666666666e+01 2569 2567 -1.0666666666666666e+01 2569 3263 5.0116116045879435e-20 2569 3490 -1.0657291666666666e+01 2569 3264 -1.0656249999999998e+01 2569 2568 -1.0666666666666666e+01 2569 2566 -1.0666666666666666e+01 2570 2570 4.2699999999999996e+01 2570 3174 1.0662500000000000e+01 2570 3263 -4.5316262678105068e-20 2570 3268 -2.1329166666666666e+01 2570 3267 1.0662500000000000e+01 2570 3485 1.0683333333333334e+01 2570 2566 -1.0666666666666668e+01 2570 2576 -1.0672916666666666e+01 2570 3171 -2.8940292364521927e-21 2570 3487 1.0662500000000000e+01 2570 3170 -2.1329166666666666e+01 2570 2568 -1.0672916666666666e+01 2570 2562 -1.0666666666666664e+01 2571 2571 3.2022916666666667e+01 2571 3168 -4.5316262678105068e-20 2571 3192 -5.3291666666666666e+00 2571 3194 -5.3312499999999998e+00 2571 2563 -1.0670833333333334e+01 2571 3271 5.3312499999999998e+00 2571 3549 4.1666666666666666e-03 2571 2578 4.1666666666666657e-03 2571 3551 -5.3312499999999998e+00 2571 3571 1.0668750000000001e+01 2571 2577 -1.0668750000000001e+01 2571 3176 -5.3291666666666666e+00 2571 2572 4.1666666666666657e-03 2571 3177 -5.3312499999999998e+00 2571 3270 -1.0668750000000001e+01 2571 2562 -1.0670833333333334e+01 2572 2572 5.3412499999999994e+01 2572 3267 5.3302083333333332e+00 2572 2576 2.0833333333333333e-03 2572 3274 -1.0683333333333334e+01 2572 3174 5.3302083333333332e+00 2572 3539 -1.0416666666666667e-03 2572 3256 -1.0416666666666667e-03 2572 3272 -6.2500000000000003e-03 2572 3313 1.0416666666666667e-03 2572 2579 4.1666666666666666e-03 2572 3273 1.0658333333333333e+01 2572 2580 -1.0666666666666666e+01 2572 3549 1.0416666666666667e-03 2572 3271 1.0658333333333333e+01 2572 2577 -1.0666666666666666e+01 2572 3260 6.2500000000000003e-03 2572 3253 -1.0416666666666667e-03 2572 2565 4.1666666666666666e-03 2572 3266 -2.1326041666666665e+01 2572 2566 -1.5994791666666666e+01 2572 3270 -6.2500000000000003e-03 2572 3176 1.0416666666666667e-03 2572 2571 4.1666666666666666e-03 2572 3177 -2.1326041666666665e+01 2572 2562 -1.5994791666666666e+01 2573 2573 3.2024999999999999e+01 2573 3342 -5.3312499999999998e+00 2573 3329 -4.1666666666666666e-03 2573 3346 -5.3312499999999998e+00 2573 2586 -1.0668750000000001e+01 2573 2578 4.1666666666666657e-03 2573 3194 -5.3312499999999998e+00 2573 3330 1.0668750000000001e+01 2573 3191 4.1666666666666666e-03 2573 3190 -5.3312499999999998e+00 2573 2563 -1.0668750000000001e+01 2573 2575 4.1666666666666657e-03 2573 3360 -5.3312499999999998e+00 2573 3339 1.0668750000000001e+01 2573 3333 -4.1666666666666666e-03 2573 2564 4.1666666666666657e-03 2573 3196 5.3312499999999998e+00 2573 3197 -1.0668750000000001e+01 2573 2574 -1.0668750000000001e+01 2574 2574 4.2691666666666663e+01 2574 3195 5.3322916666666664e+00 2574 3359 -6.2500000000000003e-03 2574 3365 5.3322916666666664e+00 2574 2587 -1.0668750000000001e+01 2574 3360 2.1331249999999997e+01 2574 2575 -1.0666666666666666e+01 2574 3339 -5.3322916666666664e+00 2574 3333 6.2500000000000003e-03 2574 3196 -2.1331249999999997e+01 2574 3197 5.3322916666666664e+00 2574 2564 -1.0666666666666666e+01 2574 2573 -1.0668750000000001e+01 2575 2575 4.2733333333333334e+01 2575 3359 1.0416666666666667e-03 2575 3624 -1.0416666666666667e-03 2575 3365 -6.2500000000000003e-03 2575 3631 -1.0416666666666667e-03 2575 2587 4.1666666666666666e-03 2575 3366 1.0658333333333333e+01 2575 2588 -1.0666666666666666e+01 2575 3628 -1.0416666666666667e-03 2575 3329 -1.0416666666666667e-03 2575 3364 -6.2500000000000003e-03 2575 3343 1.0416666666666667e-03 2575 2585 4.1666666666666666e-03 2575 3346 -1.0658333333333333e+01 2575 2586 -1.0666666666666666e+01 2575 3362 -6.2500000000000003e-03 2575 3625 -1.0416666666666667e-03 2575 2583 4.1666666666666666e-03 2575 3363 1.0658333333333333e+01 2575 2584 -1.0666666666666666e+01 2575 3339 6.2500000000000003e-03 2575 3333 -1.0416666666666667e-03 2575 2573 4.1666666666666666e-03 2575 3360 -1.0658333333333333e+01 2575 2574 -1.0666666666666666e+01 2576 2576 2.1349999999999998e+01 2576 3266 -5.3322916666666664e+00 2576 2572 2.0833333333333337e-03 2576 3177 -5.3322916666666664e+00 2576 3274 -1.0672916666666666e+01 2576 2562 -5.3343749999999996e+00 2576 3170 5.3322916666666664e+00 2576 3174 -5.3343749999999996e+00 2576 3485 -2.0833333333333337e-03 2576 2566 -5.3343749999999996e+00 2576 3268 5.3322916666666664e+00 2576 3267 -5.3343749999999996e+00 2576 2570 -1.0672916666666666e+01 2577 2577 4.2691666666666663e+01 2577 3540 -5.3322916666666664e+00 2577 3539 6.2500000000000003e-03 2577 3272 5.3322916666666664e+00 2577 2579 -1.0668750000000001e+01 2577 3271 -2.1331249999999997e+01 2577 2572 -1.0666666666666666e+01 2577 3270 5.3322916666666664e+00 2577 3549 -6.2500000000000003e-03 2577 3551 2.1331249999999997e+01 2577 3571 -5.3322916666666664e+00 2577 2578 -1.0666666666666666e+01 2577 2571 -1.0668750000000001e+01 2578 2578 4.2733333333333334e+01 2578 3329 -1.0416666666666667e-03 2578 3330 6.2500000000000003e-03 2578 3191 1.0416666666666667e-03 2578 2573 4.1666666666666666e-03 2578 3602 1.0416666666666667e-03 2578 3596 -6.2500000000000003e-03 2578 3343 1.0416666666666667e-03 2578 2585 4.1666666666666666e-03 2578 3342 -1.0658333333333333e+01 2578 2586 -1.0666666666666666e+01 2578 3539 -1.0416666666666667e-03 2578 3540 6.2500000000000003e-03 2578 3537 -1.0416666666666667e-03 2578 2579 4.1666666666666666e-03 2578 3595 1.0658333333333333e+01 2578 2582 -1.0666666666666666e+01 2578 3192 1.0416666666666667e-03 2578 3194 -1.0658333333333333e+01 2578 2563 -1.0666666666666666e+01 2578 3571 6.2500000000000003e-03 2578 3549 1.0416666666666667e-03 2578 2571 4.1666666666666666e-03 2578 3551 -1.0658333333333333e+01 2578 2577 -1.0666666666666666e+01 2579 2579 3.2024999999999999e+01 2579 3551 -5.3312499999999998e+00 2579 3539 -4.1666666666666666e-03 2579 3271 5.3312499999999998e+00 2579 2577 -1.0668750000000001e+01 2579 2578 4.1666666666666657e-03 2579 3595 5.3312499999999998e+00 2579 3540 1.0668750000000001e+01 2579 3537 -4.1666666666666666e-03 2579 3599 5.3312499999999998e+00 2579 2582 -1.0668750000000001e+01 2579 2572 4.1666666666666657e-03 2579 3273 5.3312499999999998e+00 2579 3272 -1.0668750000000001e+01 2579 3313 4.1666666666666666e-03 2579 2581 4.1666666666666657e-03 2579 3312 -5.3312499999999998e+00 2579 3547 1.0668750000000001e+01 2579 2580 -1.0668750000000001e+01 2580 2580 4.2691666666666663e+01 2580 3257 -5.3322916666666664e+00 2580 3256 6.2500000000000003e-03 2580 3260 -5.3322916666666664e+00 2580 2565 -1.0668750000000001e+01 2580 3273 -2.1331249999999997e+01 2580 2572 -1.0666666666666666e+01 2580 3272 5.3322916666666664e+00 2580 3313 -6.2500000000000003e-03 2580 3312 2.1331249999999997e+01 2580 3547 -5.3322916666666664e+00 2580 2581 -1.0666666666666666e+01 2580 2579 -1.0668750000000001e+01 2581 2581 4.2733333333333334e+01 2581 3628 -1.0416666666666667e-03 2581 3597 -6.2500000000000003e-03 2581 3602 1.0416666666666667e-03 2581 2585 4.1666666666666666e-03 2581 3277 1.0416666666666667e-03 2581 3600 -6.2500000000000003e-03 2581 3625 -1.0416666666666667e-03 2581 2583 4.1666666666666666e-03 2581 3598 1.0658333333333333e+01 2581 2584 -1.0666666666666666e+01 2581 3256 -1.0416666666666667e-03 2581 3257 6.2500000000000003e-03 2581 3254 -1.0416666666666667e-03 2581 2565 4.1666666666666666e-03 2581 3280 -1.0658333333333333e+01 2581 2567 -1.0666666666666666e+01 2581 3537 -1.0416666666666667e-03 2581 3599 1.0658333333333333e+01 2581 2582 -1.0666666666666666e+01 2581 3547 6.2500000000000003e-03 2581 3313 1.0416666666666667e-03 2581 2579 4.1666666666666666e-03 2581 3312 -1.0658333333333333e+01 2581 2580 -1.0666666666666666e+01 2582 2582 4.2691666666666663e+01 2582 3597 5.3322916666666664e+00 2582 3602 -6.2500000000000003e-03 2582 3596 5.3322916666666664e+00 2582 2585 -1.0668750000000001e+01 2582 3595 -2.1331249999999997e+01 2582 3540 -5.3322916666666664e+00 2582 2578 -1.0666666666666666e+01 2582 3537 6.2500000000000003e-03 2582 3599 -2.1331249999999997e+01 2582 2581 -1.0666666666666666e+01 2582 3547 -5.3322916666666664e+00 2582 2579 -1.0668750000000001e+01 2583 2583 3.2024999999999999e+01 2583 3494 5.3312499999999998e+00 2583 3624 -4.1666666666666666e-03 2583 3366 5.3312499999999998e+00 2583 2588 -1.0668750000000001e+01 2583 2569 4.1666666666666657e-03 2583 3279 -5.3312499999999998e+00 2583 3493 -1.0668750000000001e+01 2583 3277 4.1666666666666666e-03 2583 3280 -5.3312499999999998e+00 2583 2567 -1.0668750000000001e+01 2583 2575 4.1666666666666657e-03 2583 3363 5.3312499999999998e+00 2583 3362 -1.0668750000000001e+01 2583 3625 -4.1666666666666666e-03 2583 2581 4.1666666666666657e-03 2583 3598 5.3312499999999998e+00 2583 3600 -1.0668750000000001e+01 2583 2584 -1.0668750000000001e+01 2584 2584 4.2691666666666663e+01 2584 3597 5.3322916666666664e+00 2584 3628 6.2500000000000003e-03 2584 3364 5.3322916666666664e+00 2584 2585 -1.0668750000000001e+01 2584 3363 -2.1331249999999997e+01 2584 2575 -1.0666666666666666e+01 2584 3362 5.3322916666666664e+00 2584 3625 6.2500000000000003e-03 2584 3598 -2.1331249999999997e+01 2584 3600 5.3322916666666664e+00 2584 2581 -1.0666666666666666e+01 2584 2583 -1.0668750000000001e+01 2585 2585 3.2024999999999999e+01 2585 3598 5.3312499999999998e+00 2585 3628 -4.1666666666666666e-03 2585 3363 5.3312499999999998e+00 2585 2584 -1.0668750000000001e+01 2585 2581 4.1666666666666657e-03 2585 3599 5.3312499999999998e+00 2585 3597 -1.0668750000000001e+01 2585 3602 4.1666666666666666e-03 2585 3595 5.3312499999999998e+00 2585 2582 -1.0668750000000001e+01 2585 2575 4.1666666666666657e-03 2585 3346 -5.3312499999999998e+00 2585 3364 -1.0668750000000001e+01 2585 3343 4.1666666666666666e-03 2585 2578 4.1666666666666657e-03 2585 3342 -5.3312499999999998e+00 2585 3596 -1.0668750000000001e+01 2585 2586 -1.0668750000000001e+01 2586 2586 4.2691666666666663e+01 2586 3330 -5.3322916666666664e+00 2586 3329 6.2500000000000003e-03 2586 3339 -5.3322916666666664e+00 2586 2573 -1.0668750000000001e+01 2586 3346 2.1331249999999997e+01 2586 2575 -1.0666666666666666e+01 2586 3364 5.3322916666666664e+00 2586 3343 -6.2500000000000003e-03 2586 3342 2.1331249999999997e+01 2586 3596 5.3322916666666664e+00 2586 2578 -1.0666666666666666e+01 2586 2585 -1.0668750000000001e+01 2587 2587 3.2024999999999999e+01 2587 3196 5.3312499999999998e+00 2587 3359 4.1666666666666666e-03 2587 3360 -5.3312499999999998e+00 2587 2574 -1.0668750000000001e+01 2587 2564 4.1666666666666657e-03 2587 3198 5.3312499999999998e+00 2587 3195 -1.0668750000000001e+01 2587 3491 4.1666666666666666e-03 2587 3490 -5.3312499999999998e+00 2587 2568 -1.0668750000000001e+01 2587 2575 4.1666666666666657e-03 2587 3366 5.3312499999999998e+00 2587 3365 -1.0668750000000001e+01 2587 3631 -4.1666666666666666e-03 2587 2569 4.1666666666666657e-03 2587 3494 5.3312499999999998e+00 2587 3495 -1.0668750000000001e+01 2587 2588 -1.0668750000000001e+01 2588 2588 4.2691666666666663e+01 2588 3493 5.3322916666666664e+00 2588 3624 6.2500000000000003e-03 2588 3362 5.3322916666666664e+00 2588 2583 -1.0668750000000001e+01 2588 3366 -2.1331249999999997e+01 2588 2575 -1.0666666666666666e+01 2588 3365 5.3322916666666664e+00 2588 3631 6.2500000000000003e-03 2588 3494 -2.1331249999999997e+01 2588 3495 5.3322916666666664e+00 2588 2569 -1.0666666666666666e+01 2588 2587 -1.0668750000000001e+01 2589 2589 4.2710416666666660e+01 2589 3247 5.3322916666666664e+00 2589 3176 -1.0416666666666666e-02 2589 3183 5.3281250000000000e+00 2589 2605 -1.0670833333333333e+01 2589 3485 5.3281250000000000e+00 2589 3170 -1.4583333333333332e-02 2589 3489 -5.3281250000000000e+00 2589 2599 -1.0672916666666666e+01 2589 3178 5.3322916666666664e+00 2589 3244 2.1684043449710089e-19 2589 3174 5.3322916666666664e+00 2589 2592 6.2499999999999995e-03 2589 3175 1.5998958333333333e+01 2589 2593 -1.0666666666666666e+01 2589 3172 5.3322916666666664e+00 2589 3173 1.0666666666666666e+01 2590 2590 2.1352083333333333e+01 2591 2591 2.1354166666666668e+01 2592 2592 4.2704166666666666e+01 2592 3232 -5.3322916666666664e+00 2592 3227 1.0416666666666664e-02 2592 3225 -5.3281250000000000e+00 2592 2595 -1.0670833333333333e+01 2592 3488 -5.3322916666666664e+00 2592 3485 -1.0416666666666664e-02 2592 3170 5.3281250000000000e+00 2592 2599 -1.0670833333333333e+01 2592 3249 -5.3322916666666664e+00 2592 3486 1.5998958333333333e+01 2592 3175 -2.1684043449710089e-19 2592 3174 -5.3322916666666664e+00 2592 2589 6.2499999999999995e-03 2592 3244 -1.5998958333333333e+01 2592 2593 -1.0666666666666666e+01 2593 2593 4.2727083333333333e+01 2593 3176 1.0416666666666667e-03 2593 3227 -1.0416666666666664e-03 2593 3236 1.0416666666666667e-03 2593 3247 -6.2500000000000003e-03 2593 3568 -1.0416666666666667e-03 2593 2605 4.1666666666666666e-03 2593 3245 -6.2500000000000003e-03 2593 3572 1.0416666666666667e-03 2593 2601 4.1666666666666666e-03 2593 3246 1.0658333333333333e+01 2593 2602 -1.0666666666666666e+01 2593 3232 6.2499999999999995e-03 2593 3228 -1.0416666666666667e-03 2593 2595 4.1666666666666657e-03 2593 3239 -1.0658333333333333e+01 2593 2596 -1.0666666666666666e+01 2593 3174 5.0116116045879435e-20 2593 3175 -1.0657291666666666e+01 2593 3244 1.0657291666666666e+01 2593 2589 -1.0666666666666666e+01 2593 2592 -1.0666666666666666e+01 2594 2594 2.1352083333333333e+01 2595 2595 3.2022916666666674e+01 2595 3244 5.3312499999999998e+00 2595 3249 -2.8940292364521927e-21 2595 3227 5.3291666666666666e+00 2595 2592 -1.0670833333333333e+01 2595 3225 5.3291666666666666e+00 2595 2593 4.1666666666666657e-03 2595 3239 -5.3312499999999998e+00 2595 3232 1.0668750000000001e+01 2595 3228 -4.1666666666666666e-03 2595 3237 -5.3312499999999998e+00 2595 3233 1.0668750000000001e+01 2595 2596 -1.0668750000000001e+01 2596 2596 4.2691666666666663e+01 2596 3241 5.3322916666666664e+00 2596 3236 -6.2500000000000003e-03 2596 3245 5.3322916666666664e+00 2596 2601 -1.0668750000000001e+01 2596 3239 2.1331249999999997e+01 2596 2593 -1.0666666666666666e+01 2596 3232 -5.3322916666666664e+00 2596 3228 6.2500000000000003e-03 2596 3237 2.1331249999999997e+01 2596 3233 -5.3322916666666664e+00 2596 2595 -1.0668750000000001e+01 2597 2597 2.1366666666666664e+01 2598 2598 2.1352083333333329e+01 2599 2599 3.2020833333333343e+01 2599 3486 -5.3312499999999998e+00 2599 3174 -2.8940292364521927e-21 2599 3485 -5.3291666666666666e+00 2599 2592 -1.0670833333333333e+01 2599 3172 8.8938459461701536e-21 2599 2589 -1.0672916666666666e+01 2599 3170 -1.0662500000000000e+01 2599 3489 5.3291666666666666e+00 2599 3488 1.0668750000000001e+01 2600 2600 2.1360416666666666e+01 2601 2601 3.2024999999999999e+01 2601 3237 -5.3312499999999998e+00 2601 3236 4.1666666666666666e-03 2601 3239 -5.3312499999999998e+00 2601 2596 -1.0668750000000001e+01 2601 3241 -1.0668750000000001e+01 2601 3579 -4.1666666666666666e-03 2601 2593 4.1666666666666657e-03 2601 3246 5.3312499999999998e+00 2601 3245 -1.0668750000000001e+01 2601 3572 4.1666666666666666e-03 2601 3574 -5.3312499999999998e+00 2601 3585 1.0668750000000001e+01 2601 2602 -1.0668750000000001e+01 2602 2602 4.2691666666666663e+01 2602 3569 -5.3322916666666664e+00 2602 3568 6.2500000000000003e-03 2602 3247 5.3322916666666664e+00 2602 2605 -1.0668750000000001e+01 2602 3246 -2.1331249999999997e+01 2602 2593 -1.0666666666666666e+01 2602 3245 5.3322916666666664e+00 2602 3572 -6.2500000000000003e-03 2602 3574 2.1331249999999997e+01 2602 3585 -5.3322916666666664e+00 2602 2601 -1.0668750000000001e+01 2603 2603 2.1366666666666664e+01 2604 2604 2.1345833333333331e+01 2605 2605 3.2022916666666674e+01 2605 3175 -5.3312499999999998e+00 2605 3178 -2.8940292364521927e-21 2605 3176 -5.3291666666666666e+00 2605 2589 -1.0670833333333333e+01 2605 3574 -5.3312499999999998e+00 2605 3568 -4.1666666666666666e-03 2605 2593 4.1666666666666657e-03 2605 3246 5.3312499999999998e+00 2605 3247 -1.0668750000000001e+01 2605 2602 -1.0668750000000001e+01 2605 3183 -5.3291666666666666e+00 2605 3569 1.0668750000000001e+01 2606 2606 3.2024999999999999e+01 2606 3193 -5.3312499999999998e+00 2606 3331 -4.1666666666666666e-03 2606 3332 1.0668750000000001e+01 2606 3191 4.1666666666666666e-03 2606 3188 5.3312499999999998e+00 2606 3187 -1.0668750000000001e+01 2606 2609 -1.0668750000000001e+01 2606 3327 -4.1666666666666666e-03 2606 3328 1.0668750000000001e+01 2607 2607 2.1345833333333331e+01 2608 2608 2.1366666666666664e+01 2609 2609 5.3370833333333330e+01 2609 3328 -5.3322916666666664e+00 2609 3176 -5.3302083333333332e+00 2609 3179 -1.0662500000000000e+01 2609 3168 1.0679166666666665e+01 2609 2616 -5.3343749999999996e+00 2609 3192 1.0662499999999998e+01 2609 3193 2.1331249999999997e+01 2609 3356 5.3322916666666664e+00 2609 2611 -1.0664583333333333e+01 2609 3191 -6.2500000000000003e-03 2609 3188 -3.1999999999999996e+01 2609 3187 5.3322916666666664e+00 2609 2606 -1.0668750000000001e+01 2610 2610 3.2045833333333334e+01 2611 2611 4.2704166666666659e+01 2611 3178 -1.0662500000000000e+01 2611 3168 -1.0662500000000000e+01 2611 3176 1.0683333333333334e+01 2611 2616 -1.0672916666666666e+01 2611 3183 -1.5995833333333334e+01 2611 3192 -1.5995833333333334e+01 2611 3193 -5.3312499999999998e+00 2611 3356 -1.0668750000000001e+01 2611 2609 -1.0664583333333333e+01 2611 3566 -4.1666666666666666e-03 2611 3567 1.0668750000000001e+01 2612 2612 2.1345833333333331e+01 2613 2613 1.0683333333333334e+01 2614 2614 2.1345833333333331e+01 2615 2615 1.0683333333333334e+01 2616 2616 2.1349999999999998e+01 2616 3183 5.3322916666666664e+00 2616 3176 -2.0833333333333346e-03 2616 3192 5.3322916666666664e+00 2616 2611 -1.0672916666666666e+01 2616 3168 5.3343749999999996e+00 2616 3188 5.3322916666666664e+00 2616 2609 -5.3343749999999996e+00 2616 3178 5.3343749999999996e+00 2616 3179 1.0672916666666666e+01 2617 2617 3.2025000000000006e+01 2618 2618 3.2024999999999999e+01 2618 3331 -4.1666666666666666e-03 2618 3188 5.3312499999999998e+00 2618 3187 -1.0668750000000001e+01 2618 3191 4.1666666666666666e-03 2618 3190 -5.3312499999999998e+00 2618 2627 -1.0668750000000001e+01 2618 2622 4.1666666666666657e-03 2618 3196 5.3312499999999998e+00 2618 3197 -1.0668750000000001e+01 2618 3333 -4.1666666666666666e-03 2618 3358 -5.3312499999999998e+00 2618 3334 1.0668750000000001e+01 2618 2619 -1.0668750000000001e+01 2619 2619 4.2691666666666663e+01 2619 3634 -5.3322916666666664e+00 2619 3197 5.3322916666666664e+00 2619 3359 -6.2500000000000003e-03 2619 3196 -2.1331249999999997e+01 2619 3195 5.3322916666666664e+00 2619 2622 -1.0666666666666666e+01 2619 2621 -1.0668750000000001e+01 2619 3333 6.2500000000000003e-03 2619 3358 2.1331249999999997e+01 2619 3334 -5.3322916666666664e+00 2619 2618 -1.0668750000000001e+01 2620 2620 2.1366666666666664e+01 2621 2621 3.2024999999999999e+01 2621 3198 5.3312499999999998e+00 2621 3491 4.1666666666666666e-03 2621 3492 -5.3312499999999998e+00 2621 2628 -1.0668750000000001e+01 2621 3498 -1.0668750000000001e+01 2621 3630 -4.1666666666666666e-03 2621 3358 -5.3312499999999998e+00 2621 3634 1.0668750000000001e+01 2621 3359 4.1666666666666666e-03 2621 2622 4.1666666666666657e-03 2621 3196 5.3312499999999998e+00 2621 3195 -1.0668750000000001e+01 2621 2619 -1.0668750000000001e+01 2622 2622 4.2720833333333331e+01 2622 3491 1.0416666666666667e-03 2622 3171 2.1705219273391446e-19 2622 3198 1.0657291666666666e+01 2622 2628 -1.0666666666666666e+01 2622 3191 1.0416666666666667e-03 2622 3197 -6.2500000000000003e-03 2622 3333 -1.0416666666666667e-03 2622 2618 4.1666666666666666e-03 2622 3168 5.0116116045879435e-20 2622 3169 -1.0656249999999998e+01 2622 3190 -1.0657291666666666e+01 2622 2624 -1.0666666666666666e+01 2622 2627 -1.0666666666666666e+01 2622 3195 -6.2500000000000003e-03 2622 3359 1.0416666666666667e-03 2622 2621 4.1666666666666666e-03 2622 3196 1.0658333333333333e+01 2622 2619 -1.0666666666666666e+01 2623 2623 2.1343750000000000e+01 2624 2624 4.2716666666666669e+01 2624 3172 -6.2499999999999986e-03 2624 3180 1.0672916666666666e+01 2624 3492 -5.3281250000000000e+00 2624 3198 4.9904357809065860e-20 2624 3171 -6.2499999999999986e-03 2624 2628 -5.3322916666666664e+00 2624 3190 -2.1684043449710089e-19 2624 3169 1.0666666666666666e+01 2624 2622 -1.0666666666666666e+01 2624 3168 -6.2499999999999986e-03 2624 3188 5.3281250000000000e+00 2624 2627 -5.3322916666666664e+00 2624 3179 1.0672916666666666e+01 2624 3178 -6.2499999999999986e-03 2624 3173 1.0666666666666666e+01 2625 2625 2.1354166666666668e+01 2626 2626 3.2045833333333327e+01 2627 2627 4.2689583333333331e+01 2627 3187 5.3322916666666664e+00 2627 3191 -6.2500000000000003e-03 2627 3197 5.3322916666666664e+00 2627 2618 -1.0668750000000001e+01 2627 3169 -2.1684043449710089e-19 2627 3190 1.5998958333333333e+01 2627 2622 -1.0666666666666666e+01 2627 3179 1.6263032587282567e-19 2627 2624 -5.3322916666666664e+00 2627 3188 -2.1333333333333336e+01 2627 3168 -5.3322916666666664e+00 2628 2628 4.2689583333333331e+01 2628 3195 5.3322916666666664e+00 2628 3491 -6.2500000000000003e-03 2628 3498 5.3322916666666664e+00 2628 2621 -1.0668750000000001e+01 2628 3180 -2.1684043449710089e-19 2628 3492 2.1333333333333336e+01 2628 3169 2.1684043449710089e-19 2628 2624 -5.3322916666666664e+00 2628 3171 -5.3322916666666664e+00 2628 2622 -1.0666666666666666e+01 2628 3198 -1.5998958333333333e+01 2629 2629 3.2045833333333327e+01 2630 2630 2.1343750000000000e+01 2631 2631 2.1345833333333331e+01 2632 2632 2.1345833333333331e+01 2633 2633 5.3383333333333333e+01 2633 3217 5.3281250000000000e+00 2633 3322 1.0662500000000000e+01 2633 3223 -2.1684043449710089e-19 2633 2646 -5.3343749999999996e+00 2633 3205 -1.0679166666666665e+01 2633 3501 -5.3302083333333332e+00 2633 3207 -1.0416666666666664e-02 2633 3208 3.1999999999999996e+01 2633 3258 -5.3322916666666664e+00 2633 2643 -1.5994791666666666e+01 2633 2642 -1.0670833333333334e+01 2633 3201 1.0658333333333331e+01 2633 2637 6.2500000000000003e-03 2633 3202 5.3322916666666664e+00 2633 3506 -5.3281250000000000e+00 2633 2639 -1.0666666666666664e+01 2633 3216 -2.1684043449710089e-19 2633 3199 5.3322916666666664e+00 2633 2634 6.2499999999999986e-03 2633 3200 1.0666666666666666e+01 2633 2635 -1.0666666666666666e+01 2634 2634 4.2697916666666664e+01 2634 3317 5.3322916666666664e+00 2634 3219 -6.2500000000000003e-03 2634 3224 5.3322916666666664e+00 2634 2651 -1.0668750000000001e+01 2634 3207 5.3281250000000000e+00 2634 3217 -1.0416666666666666e-02 2634 3220 2.1331249999999997e+01 2634 2645 -1.0666666666666666e+01 2634 3261 -5.3322916666666664e+00 2634 2642 -1.0670833333333334e+01 2634 3200 -2.1684043449710089e-19 2634 3199 -5.3322916666666664e+00 2634 2633 6.2499999999999986e-03 2634 3216 1.5998958333333333e+01 2634 2635 -1.0666666666666666e+01 2635 2635 4.2720833333333339e+01 2635 3373 -1.0416666666666667e-03 2635 3221 -6.2500000000000003e-03 2635 3371 -1.0416666666666667e-03 2635 2654 4.1666666666666666e-03 2635 3219 1.0416666666666667e-03 2635 3224 -6.2500000000000003e-03 2635 3383 -1.0416666666666667e-03 2635 2651 4.1666666666666666e-03 2635 3222 1.0658333333333333e+01 2635 2652 -1.0666666666666666e+01 2635 3202 -2.1705219273391446e-19 2635 3223 1.0657291666666666e+01 2635 2637 -1.0666666666666666e+01 2635 3199 -5.0116116045879435e-20 2635 3216 -1.0657291666666666e+01 2635 3200 -1.0656249999999998e+01 2635 2634 -1.0666666666666666e+01 2635 2633 -1.0666666666666666e+01 2636 2636 5.3383333333333326e+01 2636 3322 1.0662500000000000e+01 2636 3321 -3.1999999999999996e+01 2636 2643 -1.5994791666666666e+01 2636 3295 -5.3322916666666664e+00 2636 3506 -5.3281250000000000e+00 2636 3527 -2.1684043449710089e-19 2636 2646 -5.3343749999999996e+00 2636 3507 -1.0658333333333331e+01 2636 3502 1.0679166666666665e+01 2636 3501 -5.3302083333333332e+00 2636 2639 -1.0666666666666668e+01 2636 3287 1.0416666666666666e-02 2636 2641 6.2500000000000003e-03 2636 3515 5.3322916666666664e+00 2636 3288 -5.3281250000000000e+00 2636 2640 -1.0670833333333333e+01 2636 3524 -2.1684043449710089e-19 2636 3512 5.3322916666666664e+00 2636 2637 6.2499999999999986e-03 2636 3513 1.0666666666666666e+01 2636 2638 -1.0666666666666666e+01 2637 2637 4.2704166666666666e+01 2637 3221 5.3322916666666664e+00 2637 3371 6.2500000000000003e-03 2637 3380 -5.3322916666666664e+00 2637 2654 -1.0668750000000001e+01 2637 3200 -4.9904357809065860e-20 2637 3223 -1.5998958333333333e+01 2637 2635 -1.0666666666666666e+01 2637 3507 -5.3281250000000000e+00 2637 3506 1.4583333333333332e-02 2637 2633 6.2499999999999995e-03 2637 3202 -5.3322916666666664e+00 2637 3201 5.3281250000000000e+00 2637 2639 -1.0672916666666666e+01 2637 3513 -2.1684043449710089e-19 2637 3512 -5.3322916666666664e+00 2637 2636 6.2499999999999986e-03 2637 3524 1.5998958333333333e+01 2637 2638 -1.0666666666666666e+01 2638 2638 4.2720833333333339e+01 2638 3669 1.0416666666666667e-03 2638 3525 -6.2500000000000003e-03 2638 3528 1.0416666666666667e-03 2638 2656 4.1666666666666666e-03 2638 3371 -1.0416666666666667e-03 2638 3380 6.2500000000000003e-03 2638 3374 -1.0416666666666667e-03 2638 2654 4.1666666666666666e-03 2638 3526 1.0658333333333333e+01 2638 2655 -1.0666666666666666e+01 2638 3515 -2.1705219273391446e-19 2638 3527 1.0657291666666666e+01 2638 2641 -1.0666666666666666e+01 2638 3512 5.0116116045879435e-20 2638 3524 -1.0657291666666666e+01 2638 3513 -1.0656249999999998e+01 2638 2637 -1.0666666666666666e+01 2638 2636 -1.0666666666666666e+01 2639 2639 4.2699999999999996e+01 2639 3205 1.0662500000000000e+01 2639 3512 8.8938459461701536e-21 2639 3507 2.1329166666666666e+01 2639 3502 -1.0662500000000000e+01 2639 3501 1.0683333333333334e+01 2639 2636 -1.0666666666666668e+01 2639 2646 -1.0672916666666666e+01 2639 3202 2.8940292364521927e-21 2639 3506 1.0662500000000000e+01 2639 3201 -2.1329166666666666e+01 2639 2637 -1.0672916666666666e+01 2639 2633 -1.0666666666666664e+01 2640 2640 3.2022916666666667e+01 2640 3609 -5.3312499999999998e+00 2640 3289 -4.1666666666666666e-03 2640 3324 5.3312499999999998e+00 2640 2648 -1.0668750000000001e+01 2640 2649 4.1666666666666657e-03 2640 3531 -5.3312499999999998e+00 2640 3290 1.0668750000000001e+01 2640 2643 4.1666666666666657e-03 2640 3321 5.3312499999999998e+00 2640 3295 1.0668750000000001e+01 2640 3515 -2.8940292364521927e-21 2640 3288 5.3291666666666666e+00 2640 3287 5.3291666666666666e+00 2640 2641 -1.0670833333333333e+01 2640 2636 -1.0670833333333333e+01 2641 2641 4.2697916666666664e+01 2641 3621 5.3322916666666664e+00 2641 3528 -6.2500000000000003e-03 2641 3525 5.3322916666666664e+00 2641 2656 -1.0668750000000001e+01 2641 3531 2.1331249999999997e+01 2641 3290 -5.3322916666666664e+00 2641 2649 -1.0666666666666666e+01 2641 3513 3.2249014814734037e-20 2641 3527 -1.5998958333333333e+01 2641 2638 -1.0666666666666666e+01 2641 3288 1.0416666666666666e-02 2641 2636 6.2499999999999995e-03 2641 3515 -5.3322916666666664e+00 2641 3287 -5.3281250000000000e+00 2641 2640 -1.0670833333333333e+01 2642 2642 3.2022916666666667e+01 2642 3199 4.5316262678105068e-20 2642 3217 -5.3291666666666666e+00 2642 3220 -5.3312499999999998e+00 2642 2634 -1.0670833333333334e+01 2642 3315 -5.3312499999999998e+00 2642 3256 -4.1666666666666666e-03 2642 2645 4.1666666666666657e-03 2642 3314 -5.3312499999999998e+00 2642 3261 1.0668750000000001e+01 2642 2644 -1.0668750000000001e+01 2642 3207 -5.3291666666666666e+00 2642 2643 4.1666666666666657e-03 2642 3208 -5.3312499999999998e+00 2642 3258 1.0668750000000001e+01 2642 2633 -1.0670833333333334e+01 2643 2643 5.3412500000000001e+01 2643 3313 1.0416666666666667e-03 2643 3289 -1.0416666666666667e-03 2643 3323 -6.2500000000000003e-03 2643 3541 -1.0416666666666667e-03 2643 2647 4.1666666666666666e-03 2643 3324 1.0658333333333333e+01 2643 2648 -1.0666666666666666e+01 2643 3502 -5.3302083333333332e+00 2643 2646 2.0833333333333337e-03 2643 3322 -1.0683333333333334e+01 2643 3205 5.3302083333333332e+00 2643 3295 6.2500000000000003e-03 2643 3287 -1.0416666666666667e-03 2643 2640 4.1666666666666666e-03 2643 3321 2.1326041666666665e+01 2643 2636 -1.5994791666666666e+01 2643 3256 -1.0416666666666667e-03 2643 3315 -1.0658333333333333e+01 2643 2644 -1.0666666666666666e+01 2643 3258 6.2500000000000003e-03 2643 3207 1.0416666666666667e-03 2643 2642 4.1666666666666666e-03 2643 3208 -2.1326041666666665e+01 2643 2633 -1.5994791666666666e+01 2644 2644 4.2691666666666663e+01 2644 3316 5.3322916666666664e+00 2644 3313 -6.2500000000000003e-03 2644 3323 5.3322916666666664e+00 2644 2647 -1.0668750000000001e+01 2644 3315 2.1331249999999997e+01 2644 2643 -1.0666666666666666e+01 2644 3258 -5.3322916666666664e+00 2644 3256 6.2500000000000003e-03 2644 3314 2.1331249999999997e+01 2644 3261 -5.3322916666666664e+00 2644 2645 -1.0666666666666666e+01 2644 2642 -1.0668750000000001e+01 2645 2645 4.2733333333333334e+01 2645 3662 -1.0416666666666667e-03 2645 3317 -6.2500000000000003e-03 2645 3219 1.0416666666666667e-03 2645 2651 4.1666666666666666e-03 2645 3622 1.0416666666666667e-03 2645 3320 -6.2500000000000003e-03 2645 3692 -1.0416666666666667e-03 2645 2658 4.1666666666666666e-03 2645 3318 1.0658333333333333e+01 2645 2659 -1.0666666666666666e+01 2645 3313 1.0416666666666667e-03 2645 3316 -6.2500000000000003e-03 2645 3543 -1.0416666666666667e-03 2645 2647 4.1666666666666666e-03 2645 3319 1.0658333333333333e+01 2645 2650 -1.0666666666666666e+01 2645 3217 1.0416666666666667e-03 2645 3220 -1.0658333333333333e+01 2645 2634 -1.0666666666666666e+01 2645 3261 6.2500000000000003e-03 2645 3256 -1.0416666666666667e-03 2645 2642 4.1666666666666666e-03 2645 3314 -1.0658333333333333e+01 2645 2644 -1.0666666666666666e+01 2646 2646 2.1349999999999998e+01 2646 3321 5.3322916666666664e+00 2646 2643 2.0833333333333337e-03 2646 3208 -5.3322916666666664e+00 2646 3322 -1.0672916666666666e+01 2646 2633 -5.3343749999999996e+00 2646 3201 5.3322916666666664e+00 2646 3205 -5.3343749999999996e+00 2646 3501 -2.0833333333333337e-03 2646 2636 -5.3343749999999996e+00 2646 3507 -5.3322916666666664e+00 2646 3502 5.3343749999999996e+00 2646 2639 -1.0672916666666666e+01 2647 2647 3.2024999999999999e+01 2647 3314 -5.3312499999999998e+00 2647 3313 4.1666666666666666e-03 2647 3315 -5.3312499999999998e+00 2647 2644 -1.0668750000000001e+01 2647 2645 4.1666666666666657e-03 2647 3319 5.3312499999999998e+00 2647 3316 -1.0668750000000001e+01 2647 3543 -4.1666666666666666e-03 2647 3620 5.3312499999999998e+00 2647 2650 -1.0668750000000001e+01 2647 2643 4.1666666666666657e-03 2647 3324 5.3312499999999998e+00 2647 3323 -1.0668750000000001e+01 2647 3541 -4.1666666666666666e-03 2647 2649 4.1666666666666657e-03 2647 3609 -5.3312499999999998e+00 2647 3548 1.0668750000000001e+01 2647 2648 -1.0668750000000001e+01 2648 2648 4.2691666666666663e+01 2648 3290 -5.3322916666666664e+00 2648 3289 6.2500000000000003e-03 2648 3295 -5.3322916666666664e+00 2648 2640 -1.0668750000000001e+01 2648 3324 -2.1331249999999997e+01 2648 2643 -1.0666666666666666e+01 2648 3323 5.3322916666666664e+00 2648 3541 6.2500000000000003e-03 2648 3609 2.1331249999999997e+01 2648 3548 -5.3322916666666664e+00 2648 2649 -1.0666666666666666e+01 2648 2647 -1.0668750000000001e+01 2649 2649 4.2733333333333334e+01 2649 3688 1.0416666666666667e-03 2649 3618 -6.2500000000000003e-03 2649 3622 1.0416666666666667e-03 2649 2658 4.1666666666666666e-03 2649 3528 1.0416666666666667e-03 2649 3621 -6.2500000000000003e-03 2649 3674 -1.0416666666666667e-03 2649 2656 4.1666666666666666e-03 2649 3619 1.0658333333333333e+01 2649 2657 -1.0666666666666666e+01 2649 3289 -1.0416666666666667e-03 2649 3290 6.2500000000000003e-03 2649 3288 -1.0416666666666667e-03 2649 2640 4.1666666666666666e-03 2649 3531 -1.0658333333333333e+01 2649 2641 -1.0666666666666666e+01 2649 3543 -1.0416666666666667e-03 2649 3620 1.0658333333333333e+01 2649 2650 -1.0666666666666666e+01 2649 3548 6.2500000000000003e-03 2649 3541 -1.0416666666666667e-03 2649 2647 4.1666666666666666e-03 2649 3609 -1.0658333333333333e+01 2649 2648 -1.0666666666666666e+01 2650 2650 4.2691666666666663e+01 2650 3618 5.3322916666666664e+00 2650 3622 -6.2500000000000003e-03 2650 3320 5.3322916666666664e+00 2650 2658 -1.0668750000000001e+01 2650 3319 -2.1331249999999997e+01 2650 3316 5.3322916666666664e+00 2650 2645 -1.0666666666666666e+01 2650 3543 6.2500000000000003e-03 2650 3620 -2.1331249999999997e+01 2650 2649 -1.0666666666666666e+01 2650 3548 -5.3322916666666664e+00 2650 2647 -1.0668750000000001e+01 2651 2651 3.2024999999999999e+01 2651 3318 5.3312499999999998e+00 2651 3662 -4.1666666666666666e-03 2651 3668 5.3312499999999998e+00 2651 2659 -1.0668750000000001e+01 2651 2645 4.1666666666666657e-03 2651 3220 -5.3312499999999998e+00 2651 3317 -1.0668750000000001e+01 2651 3219 4.1666666666666666e-03 2651 3216 -5.3312499999999998e+00 2651 2634 -1.0668750000000001e+01 2651 2653 4.1666666666666657e-03 2651 3384 -5.3312499999999998e+00 2651 3663 1.0668750000000001e+01 2651 3383 -4.1666666666666666e-03 2651 2635 4.1666666666666657e-03 2651 3222 5.3312499999999998e+00 2651 3224 -1.0668750000000001e+01 2651 2652 -1.0668750000000001e+01 2652 2652 4.2691666666666663e+01 2652 3221 5.3322916666666664e+00 2652 3373 6.2500000000000003e-03 2652 3379 -5.3322916666666664e+00 2652 2654 -1.0668750000000001e+01 2652 3384 2.1331249999999997e+01 2652 2653 -1.0666666666666666e+01 2652 3663 -5.3322916666666664e+00 2652 3383 6.2500000000000003e-03 2652 3222 -2.1331249999999997e+01 2652 3224 5.3322916666666664e+00 2652 2635 -1.0666666666666666e+01 2652 2651 -1.0668750000000001e+01 2653 2653 4.2733333333333334e+01 2653 3688 1.0416666666666667e-03 2653 3662 -1.0416666666666667e-03 2653 3667 -6.2500000000000003e-03 2653 3692 -1.0416666666666667e-03 2653 2658 4.1666666666666666e-03 2653 3668 1.0658333333333333e+01 2653 2659 -1.0666666666666666e+01 2653 3674 -1.0416666666666667e-03 2653 3666 1.0658333333333333e+01 2653 2657 -1.0666666666666666e+01 2653 3373 -1.0416666666666667e-03 2653 3665 -6.2500000000000003e-03 2653 3669 1.0416666666666667e-03 2653 2656 4.1666666666666666e-03 2653 3379 6.2500000000000003e-03 2653 3374 -1.0416666666666667e-03 2653 2654 4.1666666666666666e-03 2653 3664 1.0658333333333333e+01 2653 2655 -1.0666666666666666e+01 2653 3663 6.2500000000000003e-03 2653 3383 -1.0416666666666667e-03 2653 2651 4.1666666666666666e-03 2653 3384 -1.0658333333333333e+01 2653 2652 -1.0666666666666666e+01 2654 2654 3.2024999999999999e+01 2654 3222 5.3312499999999998e+00 2654 3373 -4.1666666666666666e-03 2654 3384 -5.3312499999999998e+00 2654 2652 -1.0668750000000001e+01 2654 2635 4.1666666666666657e-03 2654 3223 5.3312499999999998e+00 2654 3221 -1.0668750000000001e+01 2654 3371 -4.1666666666666666e-03 2654 3524 -5.3312499999999998e+00 2654 2637 -1.0668750000000001e+01 2654 2653 4.1666666666666657e-03 2654 3664 5.3312499999999998e+00 2654 3379 1.0668750000000001e+01 2654 3374 -4.1666666666666666e-03 2654 2638 4.1666666666666657e-03 2654 3526 5.3312499999999998e+00 2654 3380 1.0668750000000001e+01 2654 2655 -1.0668750000000001e+01 2655 2655 4.2691666666666663e+01 2655 3525 5.3322916666666664e+00 2655 3669 -6.2500000000000003e-03 2655 3665 5.3322916666666664e+00 2655 2656 -1.0668750000000001e+01 2655 3664 -2.1331249999999997e+01 2655 2653 -1.0666666666666666e+01 2655 3379 -5.3322916666666664e+00 2655 3374 6.2500000000000003e-03 2655 3526 -2.1331249999999997e+01 2655 3380 -5.3322916666666664e+00 2655 2638 -1.0666666666666666e+01 2655 2654 -1.0668750000000001e+01 2656 2656 3.2024999999999999e+01 2656 3531 -5.3312499999999998e+00 2656 3666 5.3312499999999998e+00 2656 3674 -4.1666666666666666e-03 2656 2649 4.1666666666666657e-03 2656 3619 5.3312499999999998e+00 2656 3621 -1.0668750000000001e+01 2656 2657 -1.0668750000000001e+01 2656 3526 5.3312499999999998e+00 2656 3669 4.1666666666666666e-03 2656 2653 4.1666666666666657e-03 2656 3664 5.3312499999999998e+00 2656 3665 -1.0668750000000001e+01 2656 2655 -1.0668750000000001e+01 2656 3528 4.1666666666666666e-03 2656 2638 4.1666666666666657e-03 2656 3527 5.3312499999999998e+00 2656 3525 -1.0668750000000001e+01 2656 2641 -1.0668750000000001e+01 2657 2657 4.2691666666666663e+01 2657 3618 5.3322916666666664e+00 2657 3688 -6.2500000000000003e-03 2657 3667 5.3322916666666664e+00 2657 2658 -1.0668750000000001e+01 2657 3666 -2.1331249999999997e+01 2657 2653 -1.0666666666666666e+01 2657 3665 5.3322916666666664e+00 2657 3674 6.2500000000000003e-03 2657 3619 -2.1331249999999997e+01 2657 3621 5.3322916666666664e+00 2657 2649 -1.0666666666666666e+01 2657 2656 -1.0668750000000001e+01 2658 2658 3.2024999999999999e+01 2658 3619 5.3312499999999998e+00 2658 3688 4.1666666666666666e-03 2658 3666 5.3312499999999998e+00 2658 2657 -1.0668750000000001e+01 2658 2649 4.1666666666666657e-03 2658 3620 5.3312499999999998e+00 2658 3618 -1.0668750000000001e+01 2658 3622 4.1666666666666666e-03 2658 3319 5.3312499999999998e+00 2658 2650 -1.0668750000000001e+01 2658 2653 4.1666666666666657e-03 2658 3668 5.3312499999999998e+00 2658 3667 -1.0668750000000001e+01 2658 3692 -4.1666666666666666e-03 2658 2645 4.1666666666666657e-03 2658 3318 5.3312499999999998e+00 2658 3320 -1.0668750000000001e+01 2658 2659 -1.0668750000000001e+01 2659 2659 4.2691666666666663e+01 2659 3317 5.3322916666666664e+00 2659 3662 6.2500000000000003e-03 2659 3663 -5.3322916666666664e+00 2659 2651 -1.0668750000000001e+01 2659 3668 -2.1331249999999997e+01 2659 2653 -1.0666666666666666e+01 2659 3667 5.3322916666666664e+00 2659 3692 6.2500000000000003e-03 2659 3318 -2.1331249999999997e+01 2659 3320 5.3322916666666664e+00 2659 2645 -1.0666666666666666e+01 2659 2658 -1.0668750000000001e+01 2660 2660 3.2024999999999999e+01 2660 3223 5.3312499999999998e+00 2660 3371 -4.1666666666666666e-03 2660 3389 5.3312499999999998e+00 2660 2672 -1.0668750000000001e+01 2660 2670 4.1666666666666657e-03 2660 3387 -5.3312499999999998e+00 2660 3368 1.0668750000000001e+01 2660 3367 -4.1666666666666666e-03 2660 3385 -5.3312499999999998e+00 2660 2669 -1.0668750000000001e+01 2660 2668 4.1666666666666657e-03 2660 3382 -5.3312499999999998e+00 2660 3377 1.0668750000000001e+01 2660 3373 -4.1666666666666666e-03 2660 2662 4.1666666666666657e-03 2660 3222 5.3312499999999998e+00 2660 3221 -1.0668750000000001e+01 2660 2661 -1.0668750000000001e+01 2661 2661 4.2691666666666663e+01 2661 3383 6.2500000000000003e-03 2661 3382 2.1331249999999997e+01 2661 2668 -1.0666666666666666e+01 2661 2674 -1.0668749999999999e+01 2661 3224 5.3322916666666664e+00 2661 3377 -5.3322916666666664e+00 2661 3373 6.2500000000000003e-03 2661 3222 -2.1331249999999997e+01 2661 3221 5.3322916666666664e+00 2661 2662 -1.0666666666666666e+01 2661 2660 -1.0668750000000001e+01 2661 1012 -5.3322916666666664e+00 2662 2662 4.2720833333333339e+01 2662 3371 -1.0416666666666667e-03 2662 3219 1.0416666666666667e-03 2662 3224 -6.2500000000000003e-03 2662 3383 -1.0416666666666667e-03 2662 2674 4.1666666666666666e-03 2662 3202 2.1705219273391446e-19 2662 3223 1.0657291666666666e+01 2662 2672 -1.0666666666666666e+01 2662 3199 -5.0116116045879435e-20 2662 3200 -1.0656249999999998e+01 2662 3216 -1.0657291666666666e+01 2662 2664 -1.0666666666666666e+01 2662 2667 -1.0666666666666666e+01 2662 3221 -6.2500000000000003e-03 2662 3373 -1.0416666666666667e-03 2662 2660 4.1666666666666666e-03 2662 3222 1.0658333333333333e+01 2662 2661 -1.0666666666666666e+01 2663 2663 3.7349999999999994e+01 2663 3212 1.3552527156068805e-19 2663 3215 -1.3552527156068805e-19 2663 3066 1.0667708333333334e+01 2663 2671 -1.0667708333333334e+01 2663 3209 -1.6263032587282567e-19 2663 3064 1.3334375000000000e+01 2663 2666 -1.3334375000000000e+01 2663 3204 2.1684043449710089e-19 2663 2664 -5.3322916666666664e+00 2663 3063 5.3322916666666664e+00 2663 2665 -8.0000000000000000e+00 2663 3058 8.0000000000000000e+00 2664 2664 4.2716666666666669e+01 2664 3211 -2.1684043449710089e-19 2664 3203 -6.2499999999999986e-03 2664 3390 -5.3281250000000000e+00 2664 2673 -5.3322916666666664e+00 2664 2670 1.4583333333333330e-02 2664 3210 1.0672916666666666e+01 2664 3389 5.3281250000000000e+00 2664 3223 4.9904357809065860e-20 2664 3202 -6.2499999999999986e-03 2664 2672 -5.3322916666666664e+00 2664 3216 -2.1684043449710089e-19 2664 3200 1.0666666666666666e+01 2664 2662 -1.0666666666666666e+01 2664 3199 -6.2499999999999986e-03 2664 3214 5.3281250000000000e+00 2664 2667 -5.3322916666666664e+00 2664 2666 1.4583333333333330e-02 2664 3209 1.0672916666666666e+01 2664 3064 -5.3281250000000000e+00 2664 3058 3.2249014814734037e-20 2664 3063 6.2499999999999986e-03 2664 2663 -5.3322916666666664e+00 2664 3204 1.0666666666666666e+01 2664 2665 -1.0666666666666666e+01 2665 2665 5.3375000000000000e+01 2665 3211 -2.6583333333333337e+00 2665 2673 -8.0000000000000000e+00 2665 3212 2.1334374999999998e+01 2665 2671 -1.0661458333333332e+01 2665 3203 -5.0116116045879435e-20 2665 3066 -5.3312499999999998e+00 2665 3063 -2.1705219273391446e-19 2665 3204 -1.0656249999999998e+01 2665 2664 -1.0666666666666666e+01 2665 3058 -2.6583333333333337e+00 2665 2663 -8.0000000000000000e+00 2665 980 -5.3312499999999998e+00 2665 986 -2.1334374999999998e+01 2665 985 5.3312499999999998e+00 2665 316 -1.0661458333333334e+01 2665 977 5.3312499999999998e+00 2665 981 5.3395833333333327e+00 2665 314 -5.3333333333333330e+00 2666 2666 6.4056250000104157e+01 2666 3213 6.2500000000000003e-03 2666 2674 4.1666666666666666e-03 2666 3215 2.1334374999999998e+01 2666 2671 -1.0661458333333332e+01 2666 3219 1.0416666666666667e-03 2666 3066 -5.3312499999999998e+00 2666 3214 1.0653124999999999e+01 2666 3199 5.3281250000000000e+00 2666 2667 -1.6001041666666666e+01 2666 2664 1.4583333333333330e-02 2666 3209 -1.0662500000000000e+01 2666 3064 -2.6541666666666663e+00 2666 3063 -5.3281250000000000e+00 2666 2663 -1.3334375000000000e+01 2666 975 -5.3333333333124999e+00 2666 979 2.1333333333343749e+01 2666 319 -1.0666666666614583e+01 2666 1019 -5.3333333333124999e+00 2666 1011 -1.0416666666666667e-03 2666 978 2.6624999999687500e+00 2666 322 -8.0000000000000000e+00 2666 973 -5.3312499999999998e+00 2666 970 5.3364583333645825e+00 2666 321 -5.3333333333333330e+00 2667 2667 4.2689583333333331e+01 2667 3213 -5.3322916666666664e+00 2667 3219 -6.2500000000000003e-03 2667 3224 5.3322916666666664e+00 2667 2674 -1.0668750000000001e+01 2667 3200 -2.1684043449710089e-19 2667 3216 1.5998958333333333e+01 2667 2662 -1.0666666666666666e+01 2667 3209 2.1684043449710089e-19 2667 2666 -1.6001041666666666e+01 2667 2664 -5.3322916666666664e+00 2667 3214 -2.1333333333333336e+01 2667 3199 -5.3322916666666664e+00 2668 2668 5.3366666666875005e+01 2668 3385 -2.6624999999687500e+00 2668 2669 -8.0000000000000000e+00 2668 3383 -1.0416666666666667e-03 2668 2674 4.1666666666666666e-03 2668 3382 -1.0658333333333333e+01 2668 2661 -1.0666666666666666e+01 2668 3367 -1.0416666666666667e-03 2668 3377 6.2500000000000003e-03 2668 3373 -1.0416666666666667e-03 2668 2660 4.1666666666666666e-03 2668 1063 5.3333333333124999e+00 2668 729 5.3333333333124999e+00 2668 1021 2.1333333333343749e+01 2668 1019 -5.3333333333124999e+00 2668 319 -1.0666666666614583e+01 2668 1011 -1.0416666666666667e-03 2668 1018 -2.6624999999687500e+00 2668 322 -8.0000000000000000e+00 2668 727 -2.1333333333343749e+01 2668 726 5.3333333333124999e+00 2668 1020 -5.3333333333958333e+00 2668 318 -1.0666666666614583e+01 2668 317 -5.3333333333333330e+00 2668 1012 6.2500000000000003e-03 2669 2669 3.7345833333395831e+01 2669 2668 -8.0000000000000000e+00 2669 3385 1.3332291666666665e+01 2669 3387 1.3332291666666665e+01 2669 2670 -8.0000000000000000e+00 2669 3368 -5.3322916666666664e+00 2669 3367 6.2500000000000003e-03 2669 3377 -5.3322916666666664e+00 2669 2660 -1.0668750000000001e+01 2669 727 -1.0097419586828951e-27 2669 728 1.0097419586828951e-27 2669 729 -1.0666666666677083e+01 2669 318 -1.0666666666677083e+01 2670 2670 6.4056250000104171e+01 2670 3387 -2.6624999999687500e+00 2670 2669 -8.0000000000000000e+00 2670 3390 -2.6541666666666663e+00 2670 2673 -1.3334375000000000e+01 2670 3371 -1.0416666666666667e-03 2670 3203 5.3281250000000000e+00 2670 2664 1.4583333333333330e-02 2670 3210 -1.0662500000000000e+01 2670 3389 1.0653124999999999e+01 2670 3202 5.3281250000000000e+00 2670 2672 -1.6001041666666666e+01 2670 3368 6.2500000000000003e-03 2670 3367 -1.0416666666666667e-03 2670 2660 4.1666666666666666e-03 2670 729 5.3333333333124999e+00 2670 985 5.3312499999999998e+00 2670 731 2.1334374999999998e+01 2670 591 -5.3312499999999998e+00 2670 316 -1.0661458333333334e+01 2670 728 -2.1333333333343749e+01 2670 318 -1.0666666666614583e+01 2670 590 -5.3333333333124999e+00 2670 583 5.3364583333645834e+00 2670 320 -5.3333333333333330e+00 2671 2671 6.4049999999999997e+01 2671 3215 -2.1329166666666666e+01 2671 2666 -1.0661458333333332e+01 2671 3212 -2.1329166666666666e+01 2671 2665 -1.0661458333333332e+01 2671 3058 -5.3312499999999998e+00 2671 3066 1.0416666666666664e-02 2671 3064 -5.3312499999999998e+00 2671 2663 -1.0667708333333334e+01 2671 713 5.3312499999999998e+00 2671 970 -5.3312499999999998e+00 2671 973 1.0416666666666664e-02 2671 721 -2.1329166666666662e+01 2671 717 5.3312499999999998e+00 2671 315 -1.0661458333333334e+01 2671 321 -1.0667708333333334e+01 2671 977 -1.0416666666666664e-02 2671 981 -5.3312499999999998e+00 2671 314 -1.0667708333333334e+01 2672 2672 4.2689583333333331e+01 2672 3221 5.3322916666666664e+00 2672 3371 6.2500000000000003e-03 2672 3368 -5.3322916666666664e+00 2672 2660 -1.0668750000000001e+01 2672 3210 -1.6263032587282567e-19 2672 3389 -2.1333333333333336e+01 2672 2670 -1.6001041666666666e+01 2672 3200 2.1684043449710089e-19 2672 2664 -5.3322916666666664e+00 2672 3202 -5.3322916666666664e+00 2672 2662 -1.0666666666666666e+01 2672 3223 -1.5998958333333333e+01 2673 2673 3.7350000000000001e+01 2673 2670 -1.3334375000000000e+01 2673 3390 1.3334375000000000e+01 2673 3211 8.0000000000000000e+00 2673 2665 -8.0000000000000000e+00 2673 3204 -2.1684043449710089e-19 2673 3210 2.1684043449710089e-19 2673 2664 -5.3322916666666664e+00 2673 3203 -5.3322916666666664e+00 2673 731 1.0842021724855044e-19 2673 986 1.0842021724855044e-19 2673 985 -1.0667708333333334e+01 2673 316 -1.0667708333333334e+01 2674 2674 3.2024999999999999e+01 2674 2666 4.1666666666666657e-03 2674 3213 1.0668749999999999e+01 2674 3383 -4.1666666666666666e-03 2674 2668 4.1666666666666657e-03 2674 3382 -5.3312499999999998e+00 2674 2661 -1.0668749999999999e+01 2674 3214 5.3312499999999998e+00 2674 3219 4.1666666666666666e-03 2674 3216 -5.3312499999999998e+00 2674 2667 -1.0668750000000001e+01 2674 2662 4.1666666666666657e-03 2674 3222 5.3312499999999998e+00 2674 3224 -1.0668750000000001e+01 2674 1018 -5.3312499999999998e+00 2674 1011 -4.1666666666666666e-03 2674 978 5.3312499999999998e+00 2674 322 -1.0668750000000001e+01 2674 1012 1.0668750000000001e+01 2675 2675 3.2024999999999999e+01 2675 3306 5.3312499999999998e+00 2675 3230 -4.1666666666666675e-03 2675 3275 5.3312499999999998e+00 2675 2697 -1.0668750000000001e+01 2675 2684 4.1666666666666657e-03 2675 3240 -5.3312499999999998e+00 2675 3235 1.0668750000000001e+01 2675 2681 4.1666666666666657e-03 2675 3234 1.0668750000000001e+01 2675 3276 5.3312499999999998e+00 2675 3227 -4.1666666666666675e-03 2675 3244 5.3312499999999998e+00 2675 2693 -1.0668750000000001e+01 2675 3228 -4.1666666666666666e-03 2675 2677 4.1666666666666657e-03 2675 3239 -5.3312499999999998e+00 2675 3232 1.0668750000000001e+01 2675 2676 -1.0668750000000001e+01 2676 2676 4.2691666666666663e+01 2676 3235 -5.3322916666666664e+00 2676 3240 2.1331249999999997e+01 2676 3304 5.3322916666666664e+00 2676 2684 -1.0666666666666666e+01 2676 3236 -6.2500000000000003e-03 2676 3245 5.3322916666666664e+00 2676 2692 -1.0668750000000001e+01 2676 3228 6.2500000000000003e-03 2676 3239 2.1331249999999997e+01 2676 3232 -5.3322916666666664e+00 2676 2677 -1.0666666666666666e+01 2676 2675 -1.0668750000000001e+01 2677 2677 4.2727083333333326e+01 2677 3176 1.0416666666666667e-03 2677 3174 2.1705219273391446e-19 2677 3175 -1.0657291666666666e+01 2677 2694 -1.0666666666666666e+01 2677 3227 -1.0416666666666667e-03 2677 3244 1.0657291666666666e+01 2677 2693 -1.0666666666666666e+01 2677 3236 1.0416666666666667e-03 2677 3247 -6.2500000000000003e-03 2677 3568 -1.0416666666666667e-03 2677 2690 4.1666666666666666e-03 2677 3245 -6.2500000000000003e-03 2677 3572 1.0416666666666667e-03 2677 2692 4.1666666666666666e-03 2677 3246 1.0658333333333333e+01 2677 2691 -1.0666666666666666e+01 2677 3232 6.2499999999999995e-03 2677 3228 -1.0416666666666667e-03 2677 2675 4.1666666666666666e-03 2677 3239 -1.0658333333333333e+01 2677 2676 -1.0666666666666666e+01 2678 2678 3.2024999999999999e+01 2678 3208 -5.3312499999999998e+00 2678 3207 4.1666666666666666e-03 2678 3206 -5.3312499999999998e+00 2678 2698 -1.0668750000000001e+01 2678 3273 5.3312499999999998e+00 2678 3256 -4.1666666666666666e-03 2678 2686 4.1666666666666657e-03 2678 3315 -5.3312499999999998e+00 2678 3258 1.0668750000000001e+01 2678 2685 -1.0668750000000001e+01 2678 2681 4.1666666666666657e-03 2678 3265 -5.3312499999999998e+00 2678 3259 1.0668750000000001e+01 2678 3253 -4.1666666666666666e-03 2678 2680 4.1666666666666657e-03 2678 3266 -5.3312499999999998e+00 2678 3260 1.0668750000000001e+01 2678 2679 -1.0668750000000001e+01 2679 2679 4.2689583333333331e+01 2679 3274 2.1961093809541182e-20 2679 3276 2.1684043449710089e-19 2679 3267 5.3322916666666664e+00 2679 2693 -5.3322916666666664e+00 2679 3265 1.5998958333333331e+01 2679 2681 -1.0666666666666666e+01 2679 3259 -5.3322916666666664e+00 2679 3253 6.2500000000000003e-03 2679 3266 2.1333333333333329e+01 2679 3260 -5.3322916666666664e+00 2679 2680 -1.6001041666666666e+01 2679 2678 -1.0668750000000001e+01 2680 2680 5.3412499999999994e+01 2680 3267 -5.3281250000000000e+00 2680 3176 1.0416666666666667e-03 2680 2693 1.4583333333333332e-02 2680 3177 -1.0653124999999999e+01 2680 3274 1.0662500000000000e+01 2680 3174 -5.3281250000000000e+00 2680 2694 -1.6001041666666666e+01 2680 3539 -1.0416666666666667e-03 2680 3256 -1.0416666666666667e-03 2680 3272 -6.2500000000000003e-03 2680 3313 1.0416666666666667e-03 2680 2687 4.1666666666666666e-03 2680 3273 1.0658333333333333e+01 2680 2685 -1.0666666666666666e+01 2680 3270 -6.2500000000000003e-03 2680 3549 1.0416666666666667e-03 2680 2690 4.1666666666666666e-03 2680 3271 1.0658333333333333e+01 2680 2688 -1.0666666666666666e+01 2680 3260 6.2500000000000003e-03 2680 3253 -1.0416666666666667e-03 2680 2678 4.1666666666666666e-03 2680 3266 -1.0653124999999999e+01 2680 2679 -1.6001041666666666e+01 2681 2681 4.2720833333333331e+01 2681 3207 1.0416666666666667e-03 2681 3205 2.1705219273391446e-19 2681 3206 -1.0657291666666666e+01 2681 2698 -1.0666666666666666e+01 2681 3230 -1.0416666666666667e-03 2681 3275 1.0657291666666666e+01 2681 2697 -1.0666666666666666e+01 2681 3234 6.2499999999999986e-03 2681 2675 4.1666666666666657e-03 2681 3227 -1.0416666666666664e-03 2681 3267 5.0116116045879435e-20 2681 3276 1.0657291666666666e+01 2681 2693 -1.0666666666666666e+01 2681 3259 6.2500000000000003e-03 2681 3253 -1.0416666666666667e-03 2681 2678 4.1666666666666666e-03 2681 3265 -1.0657291666666666e+01 2681 2679 -1.0666666666666666e+01 2682 2682 3.2024999999999999e+01 2682 3324 5.3312499999999998e+00 2682 3305 5.3312499999999998e+00 2682 3287 -4.1666666666666666e-03 2682 2686 4.1666666666666657e-03 2682 3321 5.3312499999999998e+00 2682 3295 1.0668750000000001e+01 2682 2696 -1.0668750000000001e+01 2682 3300 -5.3312499999999998e+00 2682 3289 -4.1666666666666666e-03 2682 2689 4.1666666666666657e-03 2682 3559 5.3312499999999998e+00 2682 3293 1.0668750000000001e+01 2682 2695 -1.0668750000000001e+01 2682 3285 -4.1666666666666666e-03 2682 2684 4.1666666666666657e-03 2682 3299 -5.3312499999999998e+00 2682 3291 1.0668750000000001e+01 2682 2683 -1.0668750000000001e+01 2683 2683 4.2691666666666663e+01 2683 3304 5.3322916666666664e+00 2683 3293 -5.3322916666666664e+00 2683 3297 -6.2500000000000003e-03 2683 3300 2.1331249999999997e+01 2683 3558 5.3322916666666664e+00 2683 2689 -1.0666666666666666e+01 2683 2692 -1.0668750000000001e+01 2683 3285 6.2500000000000003e-03 2683 3299 2.1331249999999997e+01 2683 3291 -5.3322916666666664e+00 2683 2684 -1.0666666666666666e+01 2683 2682 -1.0668750000000001e+01 2684 2684 4.2727083333333326e+01 2684 3230 -1.0416666666666664e-03 2684 3502 -5.0116116045879435e-20 2684 3306 1.0657291666666666e+01 2684 2697 -1.0666666666666666e+01 2684 3287 -1.0416666666666667e-03 2684 3305 1.0657291666666666e+01 2684 2696 -1.0666666666666666e+01 2684 3297 1.0416666666666667e-03 2684 3235 6.2499999999999995e-03 2684 3228 -1.0416666666666667e-03 2684 2675 4.1666666666666657e-03 2684 3304 -6.2500000000000003e-03 2684 3236 1.0416666666666667e-03 2684 2692 4.1666666666666666e-03 2684 3240 -1.0658333333333333e+01 2684 2676 -1.0666666666666666e+01 2684 3291 6.2500000000000003e-03 2684 3285 -1.0416666666666667e-03 2684 2682 4.1666666666666666e-03 2684 3299 -1.0658333333333333e+01 2684 2683 -1.0666666666666666e+01 2685 2685 4.2691666666666663e+01 2685 3323 5.3322916666666664e+00 2685 3260 -5.3322916666666664e+00 2685 3313 -6.2500000000000003e-03 2685 3273 -2.1331249999999997e+01 2685 3272 5.3322916666666664e+00 2685 2680 -1.0666666666666666e+01 2685 2687 -1.0668750000000001e+01 2685 3256 6.2500000000000003e-03 2685 3315 2.1331249999999997e+01 2685 3258 -5.3322916666666664e+00 2685 2686 -1.0666666666666666e+01 2685 2678 -1.0668750000000001e+01 2686 2686 5.3412500000000009e+01 2686 3313 1.0416666666666667e-03 2686 3289 -1.0416666666666667e-03 2686 3323 -6.2500000000000003e-03 2686 3541 -1.0416666666666667e-03 2686 2687 4.1666666666666666e-03 2686 3324 1.0658333333333333e+01 2686 2695 -1.0666666666666666e+01 2686 3502 5.3281250000000000e+00 2686 3207 1.0416666666666667e-03 2686 2697 1.4583333333333332e-02 2686 3208 -1.0653124999999999e+01 2686 3322 1.0662500000000000e+01 2686 3205 -5.3281250000000000e+00 2686 2698 -1.6001041666666666e+01 2686 3295 6.2500000000000003e-03 2686 3287 -1.0416666666666667e-03 2686 2682 4.1666666666666666e-03 2686 3321 1.0653124999999999e+01 2686 2696 -1.6001041666666666e+01 2686 3258 6.2500000000000003e-03 2686 3256 -1.0416666666666667e-03 2686 2678 4.1666666666666666e-03 2686 3315 -1.0658333333333333e+01 2686 2685 -1.0666666666666666e+01 2687 2687 3.2024999999999999e+01 2687 3315 -5.3312499999999998e+00 2687 2686 4.1666666666666657e-03 2687 3324 5.3312499999999998e+00 2687 3323 -1.0668750000000001e+01 2687 3541 -4.1666666666666666e-03 2687 3559 5.3312499999999998e+00 2687 2695 -1.0668750000000001e+01 2687 3271 5.3312499999999998e+00 2687 3313 4.1666666666666666e-03 2687 2680 4.1666666666666657e-03 2687 3273 5.3312499999999998e+00 2687 3272 -1.0668750000000001e+01 2687 2685 -1.0668750000000001e+01 2687 3539 -4.1666666666666666e-03 2687 2689 4.1666666666666657e-03 2687 3552 -5.3312499999999998e+00 2687 3545 1.0668750000000001e+01 2687 2688 -1.0668750000000001e+01 2688 2688 4.2691666666666663e+01 2688 3272 5.3322916666666664e+00 2688 3271 -2.1331249999999997e+01 2688 3270 5.3322916666666664e+00 2688 2680 -1.0666666666666666e+01 2688 3549 -6.2500000000000003e-03 2688 3556 5.3322916666666664e+00 2688 2690 -1.0668750000000001e+01 2688 3539 6.2500000000000003e-03 2688 3552 2.1331249999999997e+01 2688 3545 -5.3322916666666664e+00 2688 2689 -1.0666666666666666e+01 2688 2687 -1.0668750000000001e+01 2689 2689 4.2733333333333334e+01 2689 3285 -1.0416666666666667e-03 2689 3541 -1.0416666666666667e-03 2689 3293 6.2500000000000003e-03 2689 3289 -1.0416666666666667e-03 2689 2682 4.1666666666666666e-03 2689 3559 1.0658333333333333e+01 2689 2695 -1.0666666666666666e+01 2689 3297 1.0416666666666667e-03 2689 3300 -1.0658333333333333e+01 2689 2683 -1.0666666666666666e+01 2689 3549 1.0416666666666667e-03 2689 3558 -6.2500000000000003e-03 2689 3572 1.0416666666666667e-03 2689 2692 4.1666666666666666e-03 2689 3556 -6.2500000000000003e-03 2689 3568 -1.0416666666666667e-03 2689 2690 4.1666666666666666e-03 2689 3557 1.0658333333333333e+01 2689 2691 -1.0666666666666666e+01 2689 3545 6.2500000000000003e-03 2689 3539 -1.0416666666666667e-03 2689 2687 4.1666666666666666e-03 2689 3552 -1.0658333333333333e+01 2689 2688 -1.0666666666666666e+01 2690 2690 3.2024999999999999e+01 2690 3177 -5.3312499999999998e+00 2690 3176 4.1666666666666666e-03 2690 3175 -5.3312499999999998e+00 2690 2694 -1.0668750000000001e+01 2690 2680 4.1666666666666657e-03 2690 3271 5.3312499999999998e+00 2690 3270 -1.0668750000000001e+01 2690 2677 4.1666666666666657e-03 2690 3246 5.3312499999999998e+00 2690 3247 -1.0668750000000001e+01 2690 3549 4.1666666666666666e-03 2690 3552 -5.3312499999999998e+00 2690 2688 -1.0668750000000001e+01 2690 3568 -4.1666666666666666e-03 2690 2689 4.1666666666666657e-03 2690 3557 5.3312499999999998e+00 2690 3556 -1.0668750000000001e+01 2690 2691 -1.0668750000000001e+01 2691 2691 4.2691666666666663e+01 2691 3247 5.3322916666666664e+00 2691 3246 -2.1331249999999997e+01 2691 3245 5.3322916666666664e+00 2691 2677 -1.0666666666666666e+01 2691 3572 -6.2500000000000003e-03 2691 3558 5.3322916666666664e+00 2691 2692 -1.0668750000000001e+01 2691 3568 6.2500000000000003e-03 2691 3557 -2.1331249999999997e+01 2691 3556 5.3322916666666664e+00 2691 2689 -1.0666666666666666e+01 2691 2690 -1.0668750000000001e+01 2692 2692 3.2024999999999999e+01 2692 3299 -5.3312499999999998e+00 2692 2684 4.1666666666666657e-03 2692 3240 -5.3312499999999998e+00 2692 3304 -1.0668750000000001e+01 2692 3297 4.1666666666666666e-03 2692 3300 -5.3312499999999998e+00 2692 2683 -1.0668750000000001e+01 2692 3236 4.1666666666666666e-03 2692 3239 -5.3312499999999998e+00 2692 2676 -1.0668750000000001e+01 2692 2677 4.1666666666666657e-03 2692 3246 5.3312499999999998e+00 2692 3245 -1.0668750000000001e+01 2692 2689 4.1666666666666657e-03 2692 3572 4.1666666666666666e-03 2692 3557 5.3312499999999998e+00 2692 2691 -1.0668750000000001e+01 2692 3558 -1.0668750000000001e+01 2693 2693 4.2704166666666659e+01 2693 3234 -5.3322916666666664e+00 2693 3266 -5.3281250000000000e+00 2693 3265 -2.1684043449710089e-19 2693 3267 6.2500000000000003e-03 2693 2679 -5.3322916666666664e+00 2693 3276 -1.5998958333333333e+01 2693 2681 -1.0666666666666666e+01 2693 3175 2.1684043449710089e-19 2693 3174 6.2499999999999986e-03 2693 2680 1.4583333333333332e-02 2693 3177 -5.3281250000000000e+00 2693 3274 -1.0672916666666666e+01 2693 2694 -5.3322916666666664e+00 2693 3227 6.2499999999999995e-03 2693 3232 -5.3322916666666664e+00 2693 3244 -1.5998958333333331e+01 2693 2677 -1.0666666666666666e+01 2693 2675 -1.0668750000000001e+01 2694 2694 4.2689583333333331e+01 2694 3270 5.3322916666666664e+00 2694 3176 -6.2500000000000003e-03 2694 3247 5.3322916666666664e+00 2694 2690 -1.0668750000000001e+01 2694 3244 4.9904357809065860e-20 2694 3175 1.5998958333333333e+01 2694 2677 -1.0666666666666666e+01 2694 3274 1.6263032587282567e-19 2694 3177 2.1333333333333336e+01 2694 3174 5.3322916666666664e+00 2694 2680 -1.6001041666666666e+01 2694 2693 -5.3322916666666664e+00 2695 2695 4.2691666666666663e+01 2695 3295 -5.3322916666666664e+00 2695 3324 -2.1331249999999997e+01 2695 3323 5.3322916666666664e+00 2695 2686 -1.0666666666666666e+01 2695 3541 6.2500000000000003e-03 2695 3545 -5.3322916666666664e+00 2695 2687 -1.0668750000000001e+01 2695 3289 6.2500000000000003e-03 2695 3559 -2.1331249999999997e+01 2695 3293 -5.3322916666666664e+00 2695 2689 -1.0666666666666666e+01 2695 2682 -1.0668750000000001e+01 2696 2696 4.2689583333333331e+01 2696 3322 1.3773108652749614e-20 2696 3306 2.1684043449710089e-19 2696 3502 -5.3322916666666664e+00 2696 2697 -5.3322916666666664e+00 2696 3305 -1.5998958333333331e+01 2696 2684 -1.0666666666666666e+01 2696 3291 -5.3322916666666664e+00 2696 3287 6.2500000000000003e-03 2696 3321 -2.1333333333333329e+01 2696 3295 -5.3322916666666664e+00 2696 2686 -1.6001041666666666e+01 2696 2682 -1.0668750000000001e+01 2697 2697 4.2704166666666659e+01 2697 3235 -5.3322916666666664e+00 2697 3321 5.3281250000000000e+00 2697 3305 2.1684043449710089e-19 2697 3502 -6.2500000000000003e-03 2697 2696 -5.3322916666666664e+00 2697 3306 -1.5998958333333333e+01 2697 2684 -1.0666666666666666e+01 2697 3206 2.1684043449710089e-19 2697 3205 6.2499999999999986e-03 2697 2686 1.4583333333333334e-02 2697 3208 -5.3281250000000000e+00 2697 3322 -1.0672916666666666e+01 2697 2698 -5.3322916666666664e+00 2697 3230 6.2499999999999995e-03 2697 3234 -5.3322916666666664e+00 2697 3275 -1.5998958333333331e+01 2697 2681 -1.0666666666666666e+01 2697 2675 -1.0668750000000001e+01 2698 2698 4.2689583333333331e+01 2698 3258 -5.3322916666666664e+00 2698 3207 -6.2500000000000003e-03 2698 3259 -5.3322916666666664e+00 2698 2678 -1.0668750000000001e+01 2698 3275 4.9904357809065860e-20 2698 3206 1.5998958333333333e+01 2698 2681 -1.0666666666666666e+01 2698 3322 1.6263032587282567e-19 2698 3208 2.1333333333333336e+01 2698 3205 5.3322916666666664e+00 2698 2686 -1.6001041666666666e+01 2698 2697 -5.3322916666666664e+00 2699 2699 3.2024999999999999e+01 2699 3583 -4.1666666666666666e-03 2699 3238 -5.3312499999999998e+00 2699 3587 1.0668750000000001e+01 2699 3579 -4.1666666666666666e-03 2699 3584 1.0668750000000001e+01 2699 3236 4.1666666666666666e-03 2699 3237 -5.3312499999999998e+00 2699 3241 -1.0668750000000001e+01 2699 2700 -1.0668750000000001e+01 2700 2700 4.2691666666666663e+01 2700 3587 -5.3322916666666664e+00 2700 3233 -5.3322916666666664e+00 2700 3228 6.2500000000000003e-03 2700 3238 2.1331249999999997e+01 2700 3229 -5.3322916666666664e+00 2700 2702 -1.0668750000000001e+01 2700 3236 -6.2500000000000003e-03 2700 3237 2.1331249999999997e+01 2700 3241 5.3322916666666664e+00 2700 2699 -1.0668750000000001e+01 2701 2701 2.1366666666666664e+01 2702 2702 3.2024999999999999e+01 2702 3231 -4.1666666666666666e-03 2702 3226 1.0668750000000001e+01 2702 3225 -4.1666666666666666e-03 2702 3237 -5.3312499999999998e+00 2702 3233 1.0668750000000001e+01 2702 3228 -4.1666666666666666e-03 2702 3238 -5.3312499999999998e+00 2702 3229 1.0668750000000001e+01 2702 2700 -1.0668750000000001e+01 2703 2703 2.1366666666666664e+01 2704 2704 2.1345833333333331e+01 2705 2705 1.0683333333333334e+01 2706 2706 2.1345833333333331e+01 2707 2707 1.0683333333333334e+01 2708 2708 2.1345833333333331e+01 2709 2709 2.1345833333333331e+01 2710 2710 4.2704166666666673e+01 2710 3529 -5.3312499999999998e+00 2710 3515 -1.0662500000000000e+01 2710 2718 -1.0664583333333335e+01 2710 3288 1.5995833333333334e+01 2710 3308 1.0662500000000000e+01 2710 3287 -1.0683333333333334e+01 2710 2721 -1.0672916666666666e+01 2710 3283 -4.1666666666666666e-03 2710 3284 1.0668750000000001e+01 2710 3281 1.5995833333333334e+01 2710 3282 1.0668750000000001e+01 2711 2711 3.2024999999999999e+01 2712 2712 1.0683333333333334e+01 2713 2713 2.1345833333333331e+01 2714 2714 2.1366666666666664e+01 2715 2715 3.2024999999999999e+01 2715 3530 -5.3312499999999998e+00 2715 3676 -4.1666666666666666e-03 2715 3677 1.0668750000000001e+01 2715 3528 4.1666666666666666e-03 2715 3529 -5.3312499999999998e+00 2715 3612 -1.0668750000000001e+01 2715 2718 -1.0668750000000001e+01 2715 3671 -4.1666666666666666e-03 2715 3532 -1.0668750000000001e+01 2716 2716 2.1345833333333331e+01 2717 2717 3.2045833333333334e+01 2718 2718 5.3370833333333330e+01 2718 3532 5.3322916666666664e+00 2718 3284 -5.3322916666666664e+00 2718 3288 -1.0662499999999998e+01 2718 3287 5.3302083333333332e+00 2718 2710 -1.0664583333333335e+01 2718 3530 3.2000000000000000e+01 2718 3518 -1.0662500000000000e+01 2718 3515 1.0679166666666665e+01 2718 2721 -5.3343749999999996e+00 2718 3528 -6.2500000000000003e-03 2718 3529 2.1331249999999997e+01 2718 3612 5.3322916666666664e+00 2718 2715 -1.0668750000000001e+01 2719 2719 2.1345833333333331e+01 2720 2720 1.0683333333333334e+01 2721 2721 2.1349999999999998e+01 2721 3288 -5.3322916666666664e+00 2721 3287 2.0833333333333346e-03 2721 3281 -5.3322916666666664e+00 2721 2710 -1.0672916666666666e+01 2721 3308 -5.3343749999999996e+00 2721 3515 5.3343749999999996e+00 2721 3530 -5.3322916666666664e+00 2721 3518 1.0672916666666666e+01 2721 2718 -5.3343749999999996e+00 2722 2722 4.2710416666666674e+01 2722 3306 -3.2249014814734037e-20 2722 3281 -5.3281250000000000e+00 2722 3287 1.0416666666666666e-02 2722 3305 -1.5998958333333331e+01 2722 3291 -5.3322916666666664e+00 2722 2731 -1.0666666666666666e+01 2722 2728 -1.0670833333333334e+01 2722 3504 -5.3281250000000000e+00 2722 3516 5.3322916666666664e+00 2722 3507 1.4583333333333332e-02 2722 2732 6.2499999999999986e-03 2722 2725 -1.0672916666666666e+01 2722 3502 -5.3322916666666664e+00 2722 3501 5.3281250000000000e+00 2722 3308 -5.3322916666666664e+00 2722 3514 1.0666666666666666e+01 2723 2723 2.1352083333333333e+01 2724 2724 2.1354166666666668e+01 2725 2725 3.2020833333333336e+01 2725 3516 -2.8940292364521927e-21 2725 3502 -1.6284208410963924e-19 2725 3507 1.0662500000000000e+01 2725 2722 -1.0672916666666666e+01 2725 3501 -5.3291666666666666e+00 2725 3503 -5.3312499999999998e+00 2725 2732 -1.0670833333333334e+01 2725 3504 5.3291666666666666e+00 2725 3505 1.0668750000000001e+01 2726 2726 2.1352083333333329e+01 2727 2727 2.1360416666666669e+01 2728 2728 3.2022916666666667e+01 2728 3308 4.5316262678105068e-20 2728 3287 5.3291666666666666e+00 2728 3305 5.3312499999999998e+00 2728 2722 -1.0670833333333334e+01 2728 3281 5.3291666666666666e+00 2728 2731 4.1666666666666657e-03 2728 3299 -5.3312499999999998e+00 2728 3291 1.0668750000000001e+01 2728 3285 -4.1666666666666666e-03 2728 3298 -5.3312499999999998e+00 2728 3292 1.0668750000000001e+01 2728 2729 -1.0668750000000001e+01 2729 2729 4.2691666666666663e+01 2729 3301 5.3322916666666664e+00 2729 3297 -6.2500000000000003e-03 2729 3304 5.3322916666666664e+00 2729 2734 -1.0668750000000001e+01 2729 3299 2.1331249999999997e+01 2729 2731 -1.0666666666666666e+01 2729 3291 -5.3322916666666664e+00 2729 3285 6.2500000000000003e-03 2729 3298 2.1331249999999997e+01 2729 3292 -5.3322916666666664e+00 2729 2728 -1.0668750000000001e+01 2730 2730 2.1366666666666664e+01 2731 2731 4.2727083333333326e+01 2731 3230 -1.0416666666666667e-03 2731 3502 -2.1705219273391446e-19 2731 3306 1.0657291666666666e+01 2731 2732 -1.0666666666666666e+01 2731 3287 -1.0416666666666667e-03 2731 3305 1.0657291666666666e+01 2731 2722 -1.0666666666666666e+01 2731 3297 1.0416666666666667e-03 2731 3235 6.2499999999999995e-03 2731 3228 -1.0416666666666667e-03 2731 2738 4.1666666666666666e-03 2731 3304 -6.2500000000000003e-03 2731 3236 1.0416666666666667e-03 2731 2734 4.1666666666666666e-03 2731 3240 -1.0658333333333333e+01 2731 2735 -1.0666666666666666e+01 2731 3291 6.2500000000000003e-03 2731 3285 -1.0416666666666667e-03 2731 2728 4.1666666666666666e-03 2731 3299 -1.0658333333333333e+01 2731 2729 -1.0666666666666666e+01 2732 2732 4.2704166666666666e+01 2732 3231 -5.3281250000000000e+00 2732 3230 1.0416666666666666e-02 2732 3235 -5.3322916666666664e+00 2732 2738 -1.0670833333333334e+01 2732 3305 -2.1684043449710089e-19 2732 2731 -1.0666666666666666e+01 2732 3306 -1.5998958333333333e+01 2732 3500 5.3322916666666664e+00 2732 2722 6.2499999999999986e-03 2732 3507 -5.3281250000000000e+00 2732 3502 5.3322916666666664e+00 2732 3501 -1.0416666666666668e-02 2732 3505 -5.3322916666666664e+00 2732 3503 1.5998958333333331e+01 2732 2725 -1.0670833333333334e+01 2733 2733 2.1352083333333333e+01 2734 2734 3.2024999999999999e+01 2734 3298 -5.3312499999999998e+00 2734 3297 4.1666666666666666e-03 2734 3299 -5.3312499999999998e+00 2734 2729 -1.0668750000000001e+01 2734 3301 -1.0668750000000001e+01 2734 3583 -4.1666666666666666e-03 2734 2731 4.1666666666666657e-03 2734 3240 -5.3312499999999998e+00 2734 3304 -1.0668750000000001e+01 2734 3236 4.1666666666666666e-03 2734 3238 -5.3312499999999998e+00 2734 3587 1.0668750000000001e+01 2734 2735 -1.0668750000000001e+01 2735 2735 4.2691666666666663e+01 2735 3229 -5.3322916666666664e+00 2735 3228 6.2500000000000003e-03 2735 3235 -5.3322916666666664e+00 2735 2738 -1.0668750000000001e+01 2735 3240 2.1331249999999997e+01 2735 2731 -1.0666666666666666e+01 2735 3304 5.3322916666666664e+00 2735 3236 -6.2500000000000003e-03 2735 3238 2.1331249999999997e+01 2735 3587 -5.3322916666666664e+00 2735 2734 -1.0668750000000001e+01 2736 2736 2.1366666666666664e+01 2737 2737 2.1345833333333331e+01 2738 2738 3.2022916666666667e+01 2738 3500 -2.1705219273391446e-19 2738 3230 5.3291666666666666e+00 2738 3306 5.3312499999999998e+00 2738 2732 -1.0670833333333334e+01 2738 3238 -5.3312499999999998e+00 2738 3228 -4.1666666666666666e-03 2738 2731 4.1666666666666657e-03 2738 3240 -5.3312499999999998e+00 2738 3235 1.0668750000000001e+01 2738 2735 -1.0668750000000001e+01 2738 3231 5.3291666666666666e+00 2738 3229 1.0668750000000001e+01 2739 2739 3.2024999999999999e+01 2739 3283 -4.1666666666666666e-03 2739 3282 1.0668750000000001e+01 2739 3281 -4.1666666666666666e-03 2739 3298 -5.3312499999999998e+00 2739 3292 1.0668750000000001e+01 2739 3285 -4.1666666666666666e-03 2739 3296 -5.3312499999999998e+00 2739 3286 1.0668750000000001e+01 2739 2740 -1.0668750000000001e+01 2740 2740 4.2691666666666663e+01 2740 3586 -5.3322916666666664e+00 2740 3292 -5.3322916666666664e+00 2740 3297 -6.2500000000000003e-03 2740 3298 2.1331249999999997e+01 2740 3301 5.3322916666666664e+00 2740 2742 -1.0668750000000001e+01 2740 3285 6.2500000000000003e-03 2740 3296 2.1331249999999997e+01 2740 3286 -5.3322916666666664e+00 2740 2739 -1.0668750000000001e+01 2741 2741 2.1366666666666664e+01 2742 2742 3.2024999999999999e+01 2742 3583 -4.1666666666666666e-03 2742 3582 1.0668750000000001e+01 2742 3581 -4.1666666666666666e-03 2742 3296 -5.3312499999999998e+00 2742 3586 1.0668750000000001e+01 2742 3297 4.1666666666666666e-03 2742 3298 -5.3312499999999998e+00 2742 3301 -1.0668750000000001e+01 2742 2740 -1.0668750000000001e+01 2743 2743 2.1366666666666664e+01 2744 2744 2.1345833333333331e+01 2745 2745 1.0683333333333334e+01 2746 2746 2.1345833333333331e+01 2747 2747 1.0683333333333334e+01 2748 2748 2.1345833333333331e+01 2749 2749 2.1345833333333331e+01 2750 2750 3.2024999999999999e+01 2750 3280 -5.3312499999999998e+00 2750 3254 -4.1666666666666666e-03 2750 3278 -5.3312499999999998e+00 2750 2763 -1.0668750000000001e+01 2750 2760 4.1666666666666657e-03 2750 3218 -5.3312499999999998e+00 2750 3255 1.0668750000000001e+01 2750 3217 4.1666666666666666e-03 2750 3220 -5.3312499999999998e+00 2750 2759 -1.0668750000000001e+01 2750 2754 4.1666666666666657e-03 2750 3314 -5.3312499999999998e+00 2750 3261 1.0668750000000001e+01 2750 3256 -4.1666666666666666e-03 2750 2752 4.1666666666666657e-03 2750 3312 -5.3312499999999998e+00 2750 3257 1.0668750000000001e+01 2750 2751 -1.0668750000000001e+01 2751 2751 4.2691666666666663e+01 2751 3547 -5.3322916666666664e+00 2751 3261 -5.3322916666666664e+00 2751 3313 -6.2500000000000003e-03 2751 3314 2.1331249999999997e+01 2751 3316 5.3322916666666664e+00 2751 2754 -1.0666666666666666e+01 2751 2753 -1.0668750000000001e+01 2751 3256 6.2500000000000003e-03 2751 3312 2.1331249999999997e+01 2751 3257 -5.3322916666666664e+00 2751 2752 -1.0666666666666666e+01 2751 2750 -1.0668750000000001e+01 2752 2752 4.2733333333333334e+01 2752 3602 1.0416666666666667e-03 2752 3277 1.0416666666666667e-03 2752 3600 -6.2500000000000003e-03 2752 3625 -1.0416666666666667e-03 2752 2765 4.1666666666666666e-03 2752 3254 -1.0416666666666667e-03 2752 3280 -1.0658333333333333e+01 2752 2763 -1.0666666666666666e+01 2752 3537 -1.0416666666666667e-03 2752 3599 1.0658333333333333e+01 2752 2761 -1.0666666666666666e+01 2752 3547 6.2500000000000003e-03 2752 3313 1.0416666666666667e-03 2752 2753 4.1666666666666666e-03 2752 3597 -6.2500000000000003e-03 2752 3628 -1.0416666666666667e-03 2752 2755 4.1666666666666666e-03 2752 3598 1.0658333333333333e+01 2752 2756 -1.0666666666666666e+01 2752 3257 6.2500000000000003e-03 2752 3256 -1.0416666666666667e-03 2752 2750 4.1666666666666666e-03 2752 3312 -1.0658333333333333e+01 2752 2751 -1.0666666666666666e+01 2753 2753 3.2024999999999999e+01 2753 3319 5.3312499999999998e+00 2753 3543 -4.1666666666666666e-03 2753 3604 5.3312499999999998e+00 2753 2764 -1.0668750000000001e+01 2753 2762 4.1666666666666657e-03 2753 3601 -5.3312499999999998e+00 2753 3538 1.0668750000000001e+01 2753 3537 -4.1666666666666666e-03 2753 3599 5.3312499999999998e+00 2753 2761 -1.0668750000000001e+01 2753 2752 4.1666666666666657e-03 2753 3312 -5.3312499999999998e+00 2753 3547 1.0668750000000001e+01 2753 3313 4.1666666666666666e-03 2753 2754 4.1666666666666657e-03 2753 3314 -5.3312499999999998e+00 2753 3316 -1.0668750000000001e+01 2753 2751 -1.0668750000000001e+01 2754 2754 4.2733333333333334e+01 2754 3219 1.0416666666666667e-03 2754 3622 1.0416666666666667e-03 2754 3320 -6.2500000000000003e-03 2754 3692 -1.0416666666666667e-03 2754 2766 4.1666666666666666e-03 2754 3543 -1.0416666666666667e-03 2754 3319 1.0658333333333333e+01 2754 2764 -1.0666666666666666e+01 2754 3217 1.0416666666666667e-03 2754 3220 -1.0658333333333333e+01 2754 2759 -1.0666666666666666e+01 2754 3261 6.2500000000000003e-03 2754 3256 -1.0416666666666667e-03 2754 2750 4.1666666666666666e-03 2754 3317 -6.2500000000000003e-03 2754 3662 -1.0416666666666667e-03 2754 2757 4.1666666666666666e-03 2754 3318 1.0658333333333333e+01 2754 2758 -1.0666666666666666e+01 2754 3316 -6.2500000000000003e-03 2754 3313 1.0416666666666667e-03 2754 2753 4.1666666666666666e-03 2754 3314 -1.0658333333333333e+01 2754 2751 -1.0666666666666666e+01 2755 2755 3.2024999999999999e+01 2755 2762 4.1666666666666657e-03 2755 3605 1.0668749999999999e+01 2755 3628 -4.1666666666666666e-03 2755 2756 -1.0668749999999999e+01 2755 3599 5.3312499999999998e+00 2755 3602 4.1666666666666666e-03 2755 3601 -5.3312499999999998e+00 2755 2761 -1.0668750000000001e+01 2755 2752 4.1666666666666657e-03 2755 3598 5.3312499999999998e+00 2755 3597 -1.0668750000000001e+01 2755 4526 5.3312499999999998e+00 2755 4527 -4.1666666666666666e-03 2755 4537 5.3312499999999998e+00 2755 3869 -1.0668750000000001e+01 2755 3865 4.1666666666666657e-03 2755 4534 -5.3312499999999998e+00 2755 4532 1.0668750000000001e+01 2756 2756 4.2691666666666663e+01 2756 3628 6.2500000000000003e-03 2756 2755 -1.0668749999999999e+01 2756 3625 6.2500000000000003e-03 2756 2765 -1.0668749999999999e+01 2756 3600 5.3322916666666664e+00 2756 3598 -2.1331249999999997e+01 2756 3597 5.3322916666666664e+00 2756 2752 -1.0666666666666666e+01 2756 4532 -5.3322916666666664e+00 2756 4534 2.1331249999999997e+01 2756 4536 5.3322916666666664e+00 2756 3865 -1.0666666666666666e+01 2757 2757 3.2024999999999999e+01 2757 2760 4.1666666666666657e-03 2757 3326 1.0668749999999999e+01 2757 3662 -4.1666666666666666e-03 2757 2758 -1.0668749999999999e+01 2757 3220 -5.3312499999999998e+00 2757 3219 4.1666666666666666e-03 2757 3218 -5.3312499999999998e+00 2757 2759 -1.0668750000000001e+01 2757 2754 4.1666666666666657e-03 2757 3318 5.3312499999999998e+00 2757 3317 -1.0668750000000001e+01 2757 4866 5.3312499999999998e+00 2757 4889 4.1666666666666666e-03 2757 4515 5.3312499999999998e+00 2757 3871 -1.0668750000000001e+01 2757 3867 4.1666666666666657e-03 2757 4513 5.3312499999999998e+00 2757 4516 -1.0668750000000001e+01 2758 2758 4.2691666666666663e+01 2758 3662 6.2500000000000003e-03 2758 2757 -1.0668749999999999e+01 2758 3692 6.2500000000000003e-03 2758 2766 -1.0668749999999999e+01 2758 3320 5.3322916666666664e+00 2758 3318 -2.1331249999999997e+01 2758 3317 5.3322916666666664e+00 2758 2754 -1.0666666666666666e+01 2758 4516 5.3322916666666664e+00 2758 4513 -2.1331249999999997e+01 2758 4512 5.3322916666666664e+00 2758 3867 -1.0666666666666666e+01 2759 2759 4.2691666666666663e+01 2759 3317 5.3322916666666664e+00 2759 3219 -6.2500000000000003e-03 2759 3326 -5.3322916666666664e+00 2759 2757 -1.0668750000000001e+01 2759 3218 2.1331249999999997e+01 2759 2760 -1.0666666666666666e+01 2759 3255 -5.3322916666666664e+00 2759 3217 -6.2500000000000003e-03 2759 3220 2.1331249999999997e+01 2759 3261 -5.3322916666666664e+00 2759 2754 -1.0666666666666666e+01 2759 2750 -1.0668750000000001e+01 2760 2760 4.2716666666833326e+01 2760 3326 6.2500000000000003e-03 2760 2757 4.1666666666666666e-03 2760 3325 6.2500000000000003e-03 2760 2765 4.1666666666666666e-03 2760 3219 1.0416666666666667e-03 2760 3277 1.0416666666666667e-03 2760 3254 -1.0416666666666667e-03 2760 3278 -1.0658333333333333e+01 2760 2763 -1.0666666666666666e+01 2760 3255 6.2500000000000003e-03 2760 3217 1.0416666666666667e-03 2760 2750 4.1666666666666666e-03 2760 3218 -1.0658333333333333e+01 2760 2759 -1.0666666666666666e+01 2760 4889 1.0416666666666667e-03 2760 4865 1.0416666666666667e-03 2760 4438 -1.0416666666666666e-11 2760 4866 1.0662499999958333e+01 2760 3871 -1.0666666666666666e+01 2760 4433 6.2499999999999991e-11 2760 4432 -1.0416666666666666e-11 2760 3866 4.1666666666666665e-11 2760 4864 -1.0662499999958333e+01 2760 3870 -1.0666666666666666e+01 2761 2761 4.2691666666666663e+01 2761 3597 5.3322916666666664e+00 2761 3602 -6.2500000000000003e-03 2761 3605 -5.3322916666666664e+00 2761 2755 -1.0668750000000001e+01 2761 3601 2.1331249999999997e+01 2761 2762 -1.0666666666666666e+01 2761 3538 -5.3322916666666664e+00 2761 3537 6.2500000000000003e-03 2761 3599 -2.1331249999999997e+01 2761 3547 -5.3322916666666664e+00 2761 2752 -1.0666666666666666e+01 2761 2753 -1.0668750000000001e+01 2762 2762 4.2716666666833326e+01 2762 3603 6.2500000000000003e-03 2762 2766 4.1666666666666666e-03 2762 3605 6.2500000000000003e-03 2762 2755 4.1666666666666666e-03 2762 3622 1.0416666666666667e-03 2762 3602 1.0416666666666667e-03 2762 3543 -1.0416666666666667e-03 2762 3604 1.0658333333333333e+01 2762 2764 -1.0666666666666666e+01 2762 3538 6.2500000000000003e-03 2762 3537 -1.0416666666666667e-03 2762 2753 4.1666666666666666e-03 2762 3601 -1.0658333333333333e+01 2762 2761 -1.0666666666666666e+01 2762 4523 1.0416666666666667e-03 2762 4496 -1.0416666666666666e-11 2762 4527 -1.0416666666666667e-03 2762 4526 1.0662499999958333e+01 2762 3869 -1.0666666666666666e+01 2762 4491 6.2499999999999991e-11 2762 4490 -1.0416666666666666e-11 2762 3863 4.1666666666666665e-11 2762 4522 -1.0662499999958333e+01 2762 3868 -1.0666666666666666e+01 2763 2763 4.2691666666666663e+01 2763 3325 -5.3322916666666664e+00 2763 3277 -6.2500000000000003e-03 2763 3600 5.3322916666666664e+00 2763 2765 -1.0668750000000001e+01 2763 3280 2.1331249999999997e+01 2763 2752 -1.0666666666666666e+01 2763 3257 -5.3322916666666664e+00 2763 3254 6.2500000000000003e-03 2763 3278 2.1331249999999997e+01 2763 3255 -5.3322916666666664e+00 2763 2760 -1.0666666666666666e+01 2763 2750 -1.0668750000000001e+01 2764 2764 4.2691666666666663e+01 2764 3603 -5.3322916666666664e+00 2764 3622 -6.2500000000000003e-03 2764 3320 5.3322916666666664e+00 2764 2766 -1.0668750000000001e+01 2764 3319 -2.1331249999999997e+01 2764 2754 -1.0666666666666666e+01 2764 3316 5.3322916666666664e+00 2764 3543 6.2500000000000003e-03 2764 3604 -2.1331249999999997e+01 2764 3538 -5.3322916666666664e+00 2764 2762 -1.0666666666666666e+01 2764 2753 -1.0668750000000001e+01 2765 2765 3.2024999999999999e+01 2765 2760 4.1666666666666657e-03 2765 3325 1.0668749999999999e+01 2765 3625 -4.1666666666666666e-03 2765 2756 -1.0668749999999999e+01 2765 3278 -5.3312499999999998e+00 2765 3277 4.1666666666666666e-03 2765 3280 -5.3312499999999998e+00 2765 2763 -1.0668750000000001e+01 2765 2752 4.1666666666666657e-03 2765 3598 5.3312499999999998e+00 2765 3600 -1.0668750000000001e+01 2765 4538 5.3312499999999998e+00 2765 4865 4.1666666666666666e-03 2765 4864 -5.3312499999999998e+00 2765 3870 -1.0668750000000001e+01 2765 3865 4.1666666666666657e-03 2765 4534 -5.3312499999999998e+00 2765 4536 -1.0668750000000001e+01 2766 2766 3.2024999999999999e+01 2766 2762 4.1666666666666657e-03 2766 3603 1.0668749999999999e+01 2766 3692 -4.1666666666666666e-03 2766 2758 -1.0668749999999999e+01 2766 3604 5.3312499999999998e+00 2766 3622 4.1666666666666666e-03 2766 3319 5.3312499999999998e+00 2766 2764 -1.0668750000000001e+01 2766 2754 4.1666666666666657e-03 2766 3318 5.3312499999999998e+00 2766 3320 -1.0668750000000001e+01 2766 4514 5.3312499999999998e+00 2766 4523 4.1666666666666666e-03 2766 4522 -5.3312499999999998e+00 2766 3868 -1.0668750000000001e+01 2766 3867 4.1666666666666657e-03 2766 4513 5.3312499999999998e+00 2766 4512 -1.0668750000000001e+01 2767 2767 3.2024999999999999e+01 2767 3351 5.3312499999999998e+00 2767 3361 -5.3312499999999998e+00 2767 3335 -4.1666666666666666e-03 2767 2776 4.1666666666666657e-03 2767 3639 5.3312499999999998e+00 2767 3340 1.0668750000000001e+01 2767 2777 -1.0668750000000001e+01 2767 3346 -5.3312499999999998e+00 2767 3333 -4.1666666666666666e-03 2767 2771 4.1666666666666657e-03 2767 3360 -5.3312499999999998e+00 2767 3339 1.0668750000000001e+01 2767 2770 -1.0668750000000001e+01 2767 3329 -4.1666666666666666e-03 2767 2769 4.1666666666666657e-03 2767 3345 -5.3312499999999998e+00 2767 3337 1.0668750000000001e+01 2767 2768 -1.0668750000000001e+01 2768 2768 4.2691666666666663e+01 2768 3352 -5.3322916666666664e+00 2768 3339 -5.3322916666666664e+00 2768 3343 -6.2500000000000003e-03 2768 3346 2.1331249999999997e+01 2768 3364 5.3322916666666664e+00 2768 2771 -1.0666666666666666e+01 2768 2774 -1.0668750000000001e+01 2768 3329 6.2500000000000003e-03 2768 3345 2.1331249999999997e+01 2768 3337 -5.3322916666666664e+00 2768 2769 -1.0666666666666666e+01 2768 2767 -1.0668750000000001e+01 2769 2769 4.2733333333333327e+01 2769 3352 6.2500000000000003e-03 2769 2774 4.1666666666666666e-03 2769 3350 6.2500000000000003e-03 2769 2778 4.1666666666666666e-03 2769 3343 1.0416666666666667e-03 2769 3335 -1.0416666666666667e-03 2769 3641 1.0416666666666667e-03 2769 3351 1.0658333333333333e+01 2769 2777 -1.0666666666666666e+01 2769 3337 6.2500000000000003e-03 2769 3329 -1.0416666666666667e-03 2769 2767 4.1666666666666666e-03 2769 3345 -1.0658333333333333e+01 2769 2768 -1.0666666666666666e+01 2769 4925 -1.0416666666666667e-03 2769 4528 -1.0416666666666667e-03 2769 4932 1.0658333333333333e+01 2769 3882 -1.0666666666666666e+01 2769 4550 -1.0416666666666667e-03 2769 4927 6.2500000000000003e-03 2769 4580 1.0416666666666667e-03 2769 3880 4.1666666666666666e-03 2769 4582 -1.0658333333333333e+01 2769 3875 -1.0666666666666666e+01 2770 2770 4.2691666666666663e+01 2770 3365 5.3322916666666664e+00 2770 3340 -5.3322916666666664e+00 2770 3359 -6.2500000000000003e-03 2770 3361 2.1331249999999997e+01 2770 3633 -5.3322916666666664e+00 2770 2776 -1.0666666666666666e+01 2770 2775 -1.0668750000000001e+01 2770 3333 6.2500000000000003e-03 2770 3360 2.1331249999999997e+01 2770 3339 -5.3322916666666664e+00 2770 2771 -1.0666666666666666e+01 2770 2767 -1.0668750000000001e+01 2771 2771 4.2733333333333334e+01 2771 3359 1.0416666666666667e-03 2771 3624 -1.0416666666666667e-03 2771 3365 -6.2500000000000003e-03 2771 3631 -1.0416666666666667e-03 2771 2775 4.1666666666666666e-03 2771 3366 1.0658333333333333e+01 2771 2779 -1.0666666666666666e+01 2771 3628 -1.0416666666666667e-03 2771 3329 -1.0416666666666667e-03 2771 3364 -6.2500000000000003e-03 2771 3343 1.0416666666666667e-03 2771 2774 4.1666666666666666e-03 2771 3346 -1.0658333333333333e+01 2771 2768 -1.0666666666666666e+01 2771 3362 -6.2500000000000003e-03 2771 3625 -1.0416666666666667e-03 2771 2772 4.1666666666666666e-03 2771 3363 1.0658333333333333e+01 2771 2773 -1.0666666666666666e+01 2771 3339 6.2500000000000003e-03 2771 3333 -1.0416666666666667e-03 2771 2767 4.1666666666666666e-03 2771 3360 -1.0658333333333333e+01 2771 2770 -1.0666666666666666e+01 2772 2772 3.2024999999999999e+01 2772 2780 4.1666666666666657e-03 2772 3626 1.0668749999999999e+01 2772 3625 -4.1666666666666666e-03 2772 2773 -1.0668749999999999e+01 2772 3366 5.3312499999999998e+00 2772 3624 -4.1666666666666666e-03 2772 3656 -5.3312499999999998e+00 2772 2779 -1.0668750000000001e+01 2772 2771 4.1666666666666657e-03 2772 3363 5.3312499999999998e+00 2772 3362 -1.0668750000000001e+01 2772 4899 -5.3312499999999998e+00 2772 4535 -5.3312499999999998e+00 2772 4895 -4.1666666666666666e-03 2772 3872 4.1666666666666657e-03 2772 4540 5.3312499999999998e+00 2772 4539 -1.0668750000000001e+01 2772 3876 -1.0668750000000001e+01 2773 2773 4.2691666666666663e+01 2773 3625 6.2500000000000003e-03 2773 2772 -1.0668749999999999e+01 2773 3628 6.2500000000000003e-03 2773 2774 -1.0668749999999999e+01 2773 3364 5.3322916666666664e+00 2773 3363 -2.1331249999999997e+01 2773 3362 5.3322916666666664e+00 2773 2771 -1.0666666666666666e+01 2773 4539 5.3322916666666664e+00 2773 4535 2.1331249999999997e+01 2773 4531 -5.3322916666666664e+00 2773 3872 -1.0666666666666666e+01 2774 2774 3.2024999999999999e+01 2774 2769 4.1666666666666657e-03 2774 3352 1.0668749999999999e+01 2774 3628 -4.1666666666666666e-03 2774 2773 -1.0668749999999999e+01 2774 3345 -5.3312499999999998e+00 2774 3363 5.3312499999999998e+00 2774 3343 4.1666666666666666e-03 2774 2771 4.1666666666666657e-03 2774 3346 -5.3312499999999998e+00 2774 3364 -1.0668750000000001e+01 2774 2768 -1.0668750000000001e+01 2774 4932 5.3312499999999998e+00 2774 4528 -4.1666666666666666e-03 2774 4544 5.3312499999999998e+00 2774 3882 -1.0668750000000001e+01 2774 3872 4.1666666666666657e-03 2774 4535 -5.3312499999999998e+00 2774 4531 1.0668750000000001e+01 2775 2775 3.2024999999999999e+01 2775 2776 4.1666666666666657e-03 2775 3633 1.0668749999999999e+01 2775 2780 4.1666666666666657e-03 2775 3636 1.0668749999999999e+01 2775 3360 -5.3312499999999998e+00 2775 2771 4.1666666666666657e-03 2775 3366 5.3312499999999998e+00 2775 3365 -1.0668750000000001e+01 2775 3631 -4.1666666666666666e-03 2775 3656 -5.3312499999999998e+00 2775 2779 -1.0668750000000001e+01 2775 3359 4.1666666666666666e-03 2775 3361 -5.3312499999999998e+00 2775 2770 -1.0668750000000001e+01 2775 4566 5.3312499999999998e+00 2775 4786 4.1666666666666666e-03 2775 4785 -5.3312499999999998e+00 2775 3879 -1.0668750000000001e+01 2776 2776 5.3412499999999994e+01 2776 3633 6.2500000000000003e-03 2776 2775 4.1666666666666666e-03 2776 3640 6.2500000000000003e-03 2776 2778 4.1666666666666666e-03 2776 3333 -1.0416666666666667e-03 2776 3641 1.0416666666666667e-03 2776 3340 6.2500000000000003e-03 2776 3335 -1.0416666666666667e-03 2776 2767 4.1666666666666666e-03 2776 3639 1.0658333333333333e+01 2776 2777 -1.0666666666666666e+01 2776 3359 1.0416666666666667e-03 2776 3361 -1.0658333333333333e+01 2776 2770 -1.0666666666666666e+01 2776 4561 -5.3281250000000000e+00 2776 4786 1.0416666666666667e-03 2776 3878 1.4583333333333332e-02 2776 4566 1.0653124999999999e+01 2776 4567 1.0662500000000000e+01 2776 4784 -5.3281250000000000e+00 2776 3879 -1.6001041666666666e+01 2776 4547 -1.0416666666666667e-03 2776 4560 -1.0653124999999999e+01 2776 3873 -1.6001041666666666e+01 2777 2777 4.2691666666666663e+01 2777 3337 -5.3322916666666664e+00 2777 3351 -2.1331249999999997e+01 2777 3350 -5.3322916666666664e+00 2777 2769 -1.0666666666666666e+01 2777 3641 -6.2500000000000003e-03 2777 3640 -5.3322916666666664e+00 2777 2778 -1.0668750000000001e+01 2777 3335 6.2500000000000003e-03 2777 3639 -2.1331249999999997e+01 2777 3340 -5.3322916666666664e+00 2777 2776 -1.0666666666666666e+01 2777 2767 -1.0668750000000001e+01 2778 2778 3.2024999999999999e+01 2778 2769 4.1666666666666657e-03 2778 3350 1.0668749999999999e+01 2778 2776 4.1666666666666657e-03 2778 3640 1.0668749999999999e+01 2778 3351 5.3312499999999998e+00 2778 3641 4.1666666666666666e-03 2778 3639 5.3312499999999998e+00 2778 2777 -1.0668750000000001e+01 2778 4582 -5.3312499999999998e+00 2778 4550 -4.1666666666666666e-03 2778 4568 5.3312499999999998e+00 2778 3875 -1.0668750000000001e+01 2778 3874 4.1666666666666657e-03 2778 4559 -5.3312499999999998e+00 2778 4552 1.0668750000000001e+01 2778 4547 -4.1666666666666666e-03 2778 4560 -5.3312499999999998e+00 2778 3873 -1.0668750000000001e+01 2779 2779 4.2691666666666663e+01 2779 3362 5.3322916666666664e+00 2779 3366 -2.1331249999999997e+01 2779 3365 5.3322916666666664e+00 2779 2771 -1.0666666666666666e+01 2779 3631 6.2500000000000003e-03 2779 3636 -5.3322916666666664e+00 2779 2775 -1.0668750000000001e+01 2779 3624 6.2500000000000003e-03 2779 3656 2.1331249999999997e+01 2779 3626 -5.3322916666666664e+00 2779 2780 -1.0666666666666666e+01 2779 2772 -1.0668750000000001e+01 2780 2780 4.2727083333333326e+01 2780 3626 6.2500000000000003e-03 2780 2772 4.1666666666666666e-03 2780 3636 6.2500000000000003e-03 2780 2775 4.1666666666666666e-03 2780 3631 -1.0416666666666667e-03 2780 3624 -1.0416666666666667e-03 2780 3656 -1.0658333333333333e+01 2780 2779 -1.0666666666666666e+01 2780 4895 -1.0416666666666667e-03 2780 4897 1.0416666666666667e-03 2780 4899 -1.0658333333333333e+01 2780 3876 -1.0666666666666666e+01 2780 4786 1.0416666666666667e-03 2780 4784 2.1705219273391446e-19 2780 4785 -1.0657291666666666e+01 2780 3879 -1.0666666666666666e+01 2780 4905 6.2499999999999995e-03 2780 4900 -1.0416666666666667e-03 2780 3877 4.1666666666666666e-03 2780 4907 -1.0657291666666666e+01 2780 3878 -1.0666666666666666e+01 2781 2781 3.2024999999999999e+01 2781 3643 -5.3312499999999998e+00 2781 3335 -4.1666666666666666e-03 2781 3351 5.3312499999999998e+00 2781 2787 -1.0668750000000001e+01 2781 3336 1.0668750000000001e+01 2781 3327 -4.1666666666666666e-03 2781 2784 4.1666666666666657e-03 2781 3345 -5.3312499999999998e+00 2781 3337 1.0668750000000001e+01 2781 3329 -4.1666666666666666e-03 2781 3344 -5.3312499999999998e+00 2781 3338 1.0668750000000001e+01 2781 2782 -1.0668750000000001e+01 2782 2782 4.2691666666666663e+01 2782 3347 5.3322916666666664e+00 2782 3343 -6.2500000000000003e-03 2782 3352 -5.3322916666666664e+00 2782 2790 -1.0668750000000001e+01 2782 3345 2.1331249999999997e+01 2782 2784 -1.0666666666666666e+01 2782 3337 -5.3322916666666664e+00 2782 3329 6.2500000000000003e-03 2782 3344 2.1331249999999997e+01 2782 3338 -5.3322916666666664e+00 2782 2781 -1.0668750000000001e+01 2783 2783 2.1366666666666664e+01 2784 2784 4.2733333333333327e+01 2784 3352 6.2500000000000003e-03 2784 2790 4.1666666666666666e-03 2784 3350 6.2500000000000003e-03 2784 2786 4.1666666666666666e-03 2784 3343 1.0416666666666667e-03 2784 3335 -1.0416666666666667e-03 2784 3641 1.0416666666666667e-03 2784 3351 1.0658333333333333e+01 2784 2787 -1.0666666666666666e+01 2784 3337 6.2500000000000003e-03 2784 3329 -1.0416666666666667e-03 2784 2781 4.1666666666666666e-03 2784 3345 -1.0658333333333333e+01 2784 2782 -1.0666666666666666e+01 2784 4925 -1.0416666666666667e-03 2784 4528 -1.0416666666666667e-03 2784 4932 1.0658333333333333e+01 2784 4278 -1.0666666666666666e+01 2784 4550 -1.0416666666666667e-03 2784 4927 6.2500000000000003e-03 2784 4580 1.0416666666666667e-03 2784 4274 4.1666666666666666e-03 2784 4582 -1.0658333333333333e+01 2784 4275 -1.0666666666666666e+01 2785 2785 2.1345833333333331e+01 2786 2786 3.2024999999999999e+01 2786 2784 4.1666666666666657e-03 2786 3350 1.0668749999999999e+01 2786 3648 -4.1666666666666666e-03 2786 3351 5.3312499999999998e+00 2786 3641 4.1666666666666666e-03 2786 3643 -5.3312499999999998e+00 2786 3651 1.0668750000000001e+01 2786 2787 -1.0668750000000001e+01 2786 4579 -5.3312499999999998e+00 2786 4550 -4.1666666666666666e-03 2786 4582 -5.3312499999999998e+00 2786 4275 -1.0668750000000001e+01 2786 4551 1.0668750000000001e+01 2787 2787 4.2691666666666663e+01 2787 3336 -5.3322916666666664e+00 2787 3335 6.2500000000000003e-03 2787 3337 -5.3322916666666664e+00 2787 2781 -1.0668750000000001e+01 2787 3351 -2.1331249999999997e+01 2787 2784 -1.0666666666666666e+01 2787 3350 -5.3322916666666664e+00 2787 3641 -6.2500000000000003e-03 2787 3643 2.1331249999999997e+01 2787 3651 -5.3322916666666664e+00 2787 2786 -1.0668750000000001e+01 2788 2788 2.1366666666666664e+01 2789 2789 2.1345833333333331e+01 2790 2790 3.2024999999999999e+01 2790 3629 -4.1666666666666666e-03 2790 2784 4.1666666666666657e-03 2790 3352 1.0668749999999999e+01 2790 3344 -5.3312499999999998e+00 2790 3343 4.1666666666666666e-03 2790 3345 -5.3312499999999998e+00 2790 2782 -1.0668750000000001e+01 2790 3347 -1.0668750000000001e+01 2790 4932 5.3312499999999998e+00 2790 4528 -4.1666666666666666e-03 2790 4938 -5.3312499999999998e+00 2790 4533 1.0668750000000001e+01 2790 4278 -1.0668750000000001e+01 2791 2791 2.1345833333333331e+01 2792 2792 3.2024999999999999e+01 2792 3193 -5.3312499999999998e+00 2792 3192 4.1666666666666666e-03 2792 3194 -5.3312499999999998e+00 2792 2806 -1.0668750000000001e+01 2792 2796 4.1666666666666657e-03 2792 3551 -5.3312499999999998e+00 2792 3571 1.0668750000000001e+01 2792 3566 -4.1666666666666666e-03 2792 3356 -1.0668750000000001e+01 2792 3549 4.1666666666666666e-03 2792 3550 -5.3312499999999998e+00 2792 3553 -1.0668750000000001e+01 2792 2793 -1.0668750000000001e+01 2793 2793 4.2691666666666663e+01 2793 3571 -5.3322916666666664e+00 2793 3546 -5.3322916666666664e+00 2793 3539 6.2500000000000003e-03 2793 3551 2.1331249999999997e+01 2793 3540 -5.3322916666666664e+00 2793 2796 -1.0666666666666666e+01 2793 2795 -1.0668750000000001e+01 2793 3549 -6.2500000000000003e-03 2793 3550 2.1331249999999997e+01 2793 3553 5.3322916666666664e+00 2793 2792 -1.0668750000000001e+01 2794 2794 2.1366666666666664e+01 2795 2795 3.2024999999999999e+01 2795 3595 5.3312499999999998e+00 2795 3537 -4.1666666666666666e-03 2795 3564 5.3312499999999998e+00 2795 2807 -1.0668750000000001e+01 2795 3536 1.0668750000000001e+01 2795 3535 -4.1666666666666666e-03 2795 3550 -5.3312499999999998e+00 2795 3546 1.0668750000000001e+01 2795 3539 -4.1666666666666666e-03 2795 2796 4.1666666666666657e-03 2795 3551 -5.3312499999999998e+00 2795 3540 1.0668750000000001e+01 2795 2793 -1.0668750000000001e+01 2796 2796 4.2733333333333334e+01 2796 3191 1.0416666666666667e-03 2796 3602 1.0416666666666667e-03 2796 3596 -6.2500000000000003e-03 2796 3343 1.0416666666666667e-03 2796 2799 4.1666666666666666e-03 2796 3537 -1.0416666666666667e-03 2796 3595 1.0658333333333333e+01 2796 2807 -1.0666666666666666e+01 2796 3192 1.0416666666666667e-03 2796 3194 -1.0658333333333333e+01 2796 2806 -1.0666666666666666e+01 2796 3571 6.2500000000000003e-03 2796 3549 1.0416666666666667e-03 2796 2792 4.1666666666666666e-03 2796 3330 6.2500000000000003e-03 2796 3329 -1.0416666666666667e-03 2796 2797 4.1666666666666666e-03 2796 3342 -1.0658333333333333e+01 2796 2798 -1.0666666666666666e+01 2796 3540 6.2500000000000003e-03 2796 3539 -1.0416666666666667e-03 2796 2795 4.1666666666666666e-03 2796 3551 -1.0658333333333333e+01 2796 2793 -1.0666666666666666e+01 2797 2797 3.2024999999999999e+01 2797 3194 -5.3312499999999998e+00 2797 3191 4.1666666666666666e-03 2797 3193 -5.3312499999999998e+00 2797 2806 -1.0668750000000001e+01 2797 3328 1.0668750000000001e+01 2797 3327 -4.1666666666666666e-03 2797 3344 -5.3312499999999998e+00 2797 3338 1.0668750000000001e+01 2797 3329 -4.1666666666666666e-03 2797 2796 4.1666666666666657e-03 2797 3342 -5.3312499999999998e+00 2797 3330 1.0668750000000001e+01 2797 2798 -1.0668750000000001e+01 2798 2798 4.2691666666666663e+01 2798 3596 5.3322916666666664e+00 2798 3338 -5.3322916666666664e+00 2798 3343 -6.2500000000000003e-03 2798 3344 2.1331249999999997e+01 2798 3347 5.3322916666666664e+00 2798 2799 -1.0668750000000001e+01 2798 3329 6.2500000000000003e-03 2798 3342 2.1331249999999997e+01 2798 3330 -5.3322916666666664e+00 2798 2796 -1.0666666666666666e+01 2798 2797 -1.0668750000000001e+01 2799 2799 3.2024999999999999e+01 2799 3629 -4.1666666666666666e-03 2799 3564 5.3312499999999998e+00 2799 3563 -1.0668750000000001e+01 2799 3602 4.1666666666666666e-03 2799 3595 5.3312499999999998e+00 2799 2807 -1.0668750000000001e+01 2799 2796 4.1666666666666657e-03 2799 3342 -5.3312499999999998e+00 2799 3596 -1.0668750000000001e+01 2799 3343 4.1666666666666666e-03 2799 3344 -5.3312499999999998e+00 2799 3347 -1.0668750000000001e+01 2799 2798 -1.0668750000000001e+01 2800 2800 2.1366666666666664e+01 2801 2801 2.1345833333333331e+01 2802 2802 2.1366666666666664e+01 2803 2803 2.1345833333333331e+01 2804 2804 2.1366666666666664e+01 2805 2805 2.1345833333333331e+01 2806 2806 4.2691666666666663e+01 2806 3330 -5.3322916666666664e+00 2806 3191 -6.2500000000000003e-03 2806 3328 -5.3322916666666664e+00 2806 2797 -1.0668750000000001e+01 2806 3193 2.1331249999999997e+01 2806 3356 5.3322916666666664e+00 2806 3192 -6.2500000000000003e-03 2806 3194 2.1331249999999997e+01 2806 3571 -5.3322916666666664e+00 2806 2796 -1.0666666666666666e+01 2806 2792 -1.0668750000000001e+01 2807 2807 4.2691666666666663e+01 2807 3563 5.3322916666666664e+00 2807 3602 -6.2500000000000003e-03 2807 3596 5.3322916666666664e+00 2807 2799 -1.0668750000000001e+01 2807 3595 -2.1331249999999997e+01 2807 2796 -1.0666666666666666e+01 2807 3540 -5.3322916666666664e+00 2807 3537 6.2500000000000003e-03 2807 3564 -2.1331249999999997e+01 2807 3536 -5.3322916666666664e+00 2807 2795 -1.0668750000000001e+01 2808 2808 2.1345833333333331e+01 2809 2809 4.2704166666666673e+01 2809 3389 5.3312499999999998e+00 2809 3391 -1.0662500000000000e+01 2809 3370 1.5995833333333334e+01 2809 3388 -1.0662500000000000e+01 2809 3369 -1.0683333333333334e+01 2809 2813 -1.0672916666666666e+01 2809 3371 -4.1666666666666666e-03 2809 3523 5.3312499999999998e+00 2809 3372 1.0668750000000001e+01 2809 2811 -1.0668750000000001e+01 2809 3367 1.5995833333333334e+01 2809 2810 4.1666666666666657e-03 2809 3387 -5.3312499999999998e+00 2809 3368 1.0668750000000001e+01 2809 1645 -1.0664583333333333e+01 2810 2810 6.4056250000104171e+01 2810 3387 -2.6624999999687500e+00 2810 3390 -1.3327083333333333e+01 2810 2819 -1.3328124999999998e+01 2810 3371 -1.0416666666666667e-03 2810 3203 -5.3302083333333332e+00 2810 2820 2.0833333333333333e-03 2810 3389 2.1326041666666665e+01 2810 3210 1.0683333333333334e+01 2810 3202 -5.3302083333333332e+00 2810 2811 -1.5994791666666664e+01 2810 3368 6.2500000000000003e-03 2810 3367 -1.0416666666666667e-03 2810 2809 4.1666666666666666e-03 2810 732 5.3333333333124999e+00 2810 1645 -8.0000000000000000e+00 2810 582 -5.3312499999999998e+00 2810 620 -2.1334374999999998e+01 2810 619 5.3312499999999998e+00 2810 147 -1.0661458333333334e+01 2810 730 2.1333333333343749e+01 2810 584 -5.3333333333124999e+00 2810 583 5.3364583333645834e+00 2810 148 -1.0666666666614583e+01 2810 145 -5.3333333333333330e+00 2811 2811 6.4049999999999997e+01 2811 3368 -5.3322916666666664e+00 2811 3389 -3.2000000000000000e+01 2811 3210 -1.0662500000000000e+01 2811 2810 -1.5994791666666664e+01 2811 2820 -5.3343749999999996e+00 2811 3202 1.0679166666666665e+01 2811 3201 -5.3302083333333332e+00 2811 3506 -2.1331249999999997e+01 2811 3507 5.3302083333333332e+00 2811 2817 -1.0660416666666666e+01 2811 3517 -1.0662500000000000e+01 2811 3512 1.0679166666666665e+01 2811 2815 -5.3343749999999996e+00 2811 3371 6.2500000000000003e-03 2811 3523 -3.1999999999999996e+01 2811 3372 -5.3322916666666664e+00 2811 2809 -1.0668750000000001e+01 2812 2812 3.2045833333333334e+01 2813 2813 2.1349999999999998e+01 2813 3388 5.3343749999999996e+00 2813 3391 5.3343749999999996e+00 2813 3370 -5.3322916666666664e+00 2813 3369 2.0833333333333342e-03 2813 3367 -5.3322916666666664e+00 2813 2809 -1.0672916666666666e+01 2813 2165 -5.3322916666666664e+00 2813 1645 -5.3343749999999996e+00 2813 2154 1.0672916666666666e+01 2814 2814 3.2025000000000006e+01 2815 2815 2.1349999999999998e+01 2815 3504 -5.3322916666666664e+00 2815 3507 2.0833333333333346e-03 2815 3506 -5.3322916666666664e+00 2815 2817 -1.0672916666666666e+01 2815 3512 5.3343749999999996e+00 2815 3523 5.3322916666666664e+00 2815 2811 -5.3343749999999996e+00 2815 3516 5.3343749999999996e+00 2815 3517 1.0672916666666666e+01 2816 2816 3.2024999999999999e+01 2817 2817 5.3383333333333326e+01 2817 3202 -1.0662500000000000e+01 2817 3203 -1.0662500000000000e+01 2817 3201 1.0683333333333334e+01 2817 2820 -1.0672916666666666e+01 2817 3509 1.5995833333333334e+01 2817 3534 -5.3312499999999998e+00 2817 2819 -1.0664583333333333e+01 2817 3508 1.0668750000000001e+01 2817 3516 -1.0662500000000000e+01 2817 3504 1.5995833333333334e+01 2817 3512 -1.0662500000000000e+01 2817 3506 3.1995833333333334e+01 2817 3507 -1.0683333333333334e+01 2817 2811 -1.0660416666666666e+01 2817 2815 -1.0672916666666666e+01 2818 2818 2.6693750000000001e+01 2819 2819 4.8031250000000000e+01 2819 3534 1.3332291666666665e+01 2819 3390 2.4001041666666666e+01 2819 2810 -1.3328124999999998e+01 2819 3210 -1.0662500000000000e+01 2819 2820 -5.3343749999999996e+00 2819 3203 1.0679166666666665e+01 2819 3201 -5.3302083333333332e+00 2819 3509 -1.0662499999999998e+01 2819 3508 -5.3322916666666664e+00 2819 2817 -1.0664583333333333e+01 2819 618 -1.3552527156068805e-19 2819 620 1.3552527156068805e-19 2819 619 -1.0667708333333334e+01 2819 147 -1.0667708333333334e+01 2820 2820 2.1349999999999998e+01 2820 3390 -5.3322916666666664e+00 2820 2810 2.0833333333333337e-03 2820 3389 5.3322916666666664e+00 2820 3210 1.0672916666666666e+01 2820 2811 -5.3343749999999996e+00 2820 3202 5.3343749999999996e+00 2820 3506 -5.3322916666666664e+00 2820 3201 -2.0833333333333342e-03 2820 2819 -5.3343749999999996e+00 2820 3203 5.3343749999999996e+00 2820 3509 -5.3322916666666664e+00 2820 2817 -1.0672916666666666e+01 2821 2821 3.2024999999999999e+01 2821 3394 5.3312499999999998e+00 2821 3384 -5.3312499999999998e+00 2821 3374 -4.1666666666666666e-03 2821 2824 4.1666666666666657e-03 2821 3664 5.3312499999999998e+00 2821 3379 1.0668750000000001e+01 2821 2825 -1.0668750000000001e+01 2821 3386 -5.3312499999999998e+00 2821 3369 -4.1666666666666666e-03 2821 3392 -5.3312499999999998e+00 2821 3378 1.0668750000000001e+01 2821 2823 -1.0668750000000001e+01 2821 3373 -4.1666666666666666e-03 2821 3381 -5.3312499999999998e+00 2821 3376 1.0668750000000001e+01 2821 2822 -1.0668750000000001e+01 2821 1648 4.1666666666666657e-03 2821 1646 4.1666666666666657e-03 2822 2822 4.2691666666666663e+01 2822 3383 6.2500000000000003e-03 2822 3381 2.1331249999999997e+01 2822 3379 -5.3322916666666664e+00 2822 3384 2.1331249999999997e+01 2822 3663 -5.3322916666666664e+00 2822 2824 -1.0666666666666666e+01 2822 3373 6.2500000000000003e-03 2822 3376 -5.3322916666666664e+00 2822 2821 -1.0668750000000001e+01 2822 1646 -1.0666666666666666e+01 2822 1013 -5.3322916666666664e+00 2822 491 -1.0668749999999999e+01 2823 2823 4.2689583333333331e+01 2823 3392 2.1333333333333332e+01 2823 3386 1.5998958333333331e+01 2823 3376 -5.3322916666666664e+00 2823 3369 6.2500000000000003e-03 2823 3378 -5.3322916666666664e+00 2823 2821 -1.0668750000000001e+01 2823 2137 -2.1961093809541182e-20 2823 1648 -1.6001041666666666e+01 2823 2138 -2.1684043449710089e-19 2823 2134 -5.3322916666666664e+00 2823 1647 -5.3322916666666664e+00 2823 1646 -1.0666666666666666e+01 2824 2824 4.2733333333333334e+01 2824 3688 1.0416666666666667e-03 2824 3662 -1.0416666666666667e-03 2824 3667 -6.2500000000000003e-03 2824 3692 -1.0416666666666667e-03 2824 2829 4.1666666666666666e-03 2824 3668 1.0658333333333333e+01 2824 2830 -1.0666666666666666e+01 2824 3674 -1.0416666666666667e-03 2824 3666 1.0658333333333333e+01 2824 2828 -1.0666666666666666e+01 2824 3373 -1.0416666666666667e-03 2824 3665 -6.2500000000000003e-03 2824 3669 1.0416666666666667e-03 2824 2826 4.1666666666666666e-03 2824 3379 6.2500000000000003e-03 2824 3374 -1.0416666666666667e-03 2824 2821 4.1666666666666666e-03 2824 3664 1.0658333333333333e+01 2824 2825 -1.0666666666666666e+01 2824 3663 6.2500000000000003e-03 2824 3383 -1.0416666666666667e-03 2824 3384 -1.0658333333333333e+01 2824 2822 -1.0666666666666666e+01 2824 491 4.1666666666666666e-03 2825 2825 4.2691666666666663e+01 2825 3378 -5.3322916666666664e+00 2825 3394 -2.1331249999999997e+01 2825 3393 5.3322916666666664e+00 2825 3669 -6.2500000000000003e-03 2825 3665 5.3322916666666664e+00 2825 2826 -1.0668750000000001e+01 2825 3374 6.2500000000000003e-03 2825 3664 -2.1331249999999997e+01 2825 3379 -5.3322916666666664e+00 2825 2824 -1.0666666666666666e+01 2825 2821 -1.0668750000000001e+01 2825 1648 -1.0666666666666666e+01 2826 2826 3.2024999999999999e+01 2826 3686 -5.3312499999999998e+00 2826 2831 4.1666666666666657e-03 2826 3690 -5.3312499999999998e+00 2826 3679 1.0668750000000001e+01 2826 3674 -4.1666666666666666e-03 2826 3666 5.3312499999999998e+00 2826 2828 -1.0668750000000001e+01 2826 3672 -4.1666666666666666e-03 2826 3395 -5.3312499999999998e+00 2826 2827 -1.0668750000000001e+01 2826 3394 5.3312499999999998e+00 2826 3393 -1.0668750000000001e+01 2826 2824 4.1666666666666657e-03 2826 3669 4.1666666666666666e-03 2826 3664 5.3312499999999998e+00 2826 2825 -1.0668750000000001e+01 2826 3665 -1.0668750000000001e+01 2826 1648 4.1666666666666657e-03 2827 2827 4.2691666666666663e+01 2827 3686 2.1331249999999997e+01 2827 2831 -1.0666666666666666e+01 2827 3395 2.1331249999999997e+01 2827 3679 -5.3322916666666664e+00 2827 3672 6.2500000000000003e-03 2827 3393 5.3322916666666664e+00 2827 2826 -1.0668750000000001e+01 2827 4640 5.3322916666666664e+00 2827 4950 6.2500000000000003e-03 2827 4947 -5.3322916666666664e+00 2827 1648 -1.0666666666666666e+01 2827 3963 -1.0668750000000001e+01 2828 2828 4.2691666666666663e+01 2828 3679 -5.3322916666666664e+00 2828 3690 2.1331249999999997e+01 2828 3693 -5.3322916666666664e+00 2828 2831 -1.0666666666666666e+01 2828 3688 -6.2500000000000003e-03 2828 3667 5.3322916666666664e+00 2828 2829 -1.0668750000000001e+01 2828 3674 6.2500000000000003e-03 2828 3666 -2.1331249999999997e+01 2828 3665 5.3322916666666664e+00 2828 2824 -1.0666666666666666e+01 2828 2826 -1.0668750000000001e+01 2829 2829 3.2024999999999999e+01 2829 2831 4.1666666666666657e-03 2829 3693 1.0668749999999999e+01 2829 3692 -4.1666666666666666e-03 2829 2830 -1.0668749999999999e+01 2829 3690 -5.3312499999999998e+00 2829 3688 4.1666666666666666e-03 2829 3666 5.3312499999999998e+00 2829 2828 -1.0668750000000001e+01 2829 2824 4.1666666666666657e-03 2829 3668 5.3312499999999998e+00 2829 3667 -1.0668750000000001e+01 2829 4636 -5.3312499999999998e+00 2829 4634 4.1666666666666666e-03 2829 4608 5.3312499999999998e+00 2829 3960 -1.0668750000000001e+01 2829 3958 4.1666666666666657e-03 2829 4606 5.3312499999999998e+00 2829 4607 -1.0668750000000001e+01 2830 2830 4.2691666666666663e+01 2830 3692 6.2500000000000003e-03 2830 2829 -1.0668749999999999e+01 2830 3662 6.2500000000000003e-03 2830 3663 -5.3322916666666664e+00 2830 3668 -2.1331249999999997e+01 2830 3667 5.3322916666666664e+00 2830 2824 -1.0666666666666666e+01 2830 4607 5.3322916666666664e+00 2830 4606 -2.1331249999999997e+01 2830 4605 5.3322916666666664e+00 2830 3958 -1.0666666666666666e+01 2830 491 -1.0668749999999999e+01 2831 2831 4.2733333333333327e+01 2831 3686 -1.0658333333333333e+01 2831 2827 -1.0666666666666666e+01 2831 3693 6.2500000000000003e-03 2831 2829 4.1666666666666666e-03 2831 3672 -1.0416666666666667e-03 2831 3679 6.2500000000000003e-03 2831 3674 -1.0416666666666667e-03 2831 2826 4.1666666666666666e-03 2831 3688 1.0416666666666667e-03 2831 3690 -1.0658333333333333e+01 2831 2828 -1.0666666666666666e+01 2831 4950 -1.0416666666666667e-03 2831 4622 -1.0416666666666667e-03 2831 4640 -6.2500000000000003e-03 2831 4952 -1.0416666666666667e-03 2831 3963 4.1666666666666666e-03 2831 4641 1.0658333333333333e+01 2831 3965 -1.0666666666666666e+01 2831 4634 1.0416666666666667e-03 2831 4628 6.2500000000000003e-03 2831 4620 -1.0416666666666667e-03 2831 3959 4.1666666666666666e-03 2831 4636 -1.0658333333333333e+01 2831 3960 -1.0666666666666666e+01 2832 2832 3.2022916666666667e+01 2832 3388 -8.8938459461701536e-21 2832 3369 5.3291666666666666e+00 2832 3386 -5.3312499999999998e+00 2832 2835 -1.0670833333333334e+01 2832 3367 5.3291666666666666e+00 2832 3385 -5.3312499999999998e+00 2832 3381 -5.3312499999999998e+00 2832 3376 1.0668750000000001e+01 2832 3373 -4.1666666666666666e-03 2832 2834 4.1666666666666657e-03 2832 3382 -5.3312499999999998e+00 2832 3377 1.0668750000000001e+01 2832 2833 -1.0668750000000001e+01 2832 1446 -1.0670833333333334e+01 2832 1458 4.1666666666666657e-03 2833 2833 4.2691666666666663e+01 2833 3382 2.1331249999999997e+01 2833 2834 -1.0666666666666666e+01 2833 3383 6.2500000000000003e-03 2833 3381 2.1331249999999997e+01 2833 3376 -5.3322916666666664e+00 2833 3373 6.2500000000000003e-03 2833 3377 -5.3322916666666664e+00 2833 2832 -1.0668750000000001e+01 2833 1012 -5.3322916666666664e+00 2833 1013 -5.3322916666666664e+00 2833 1458 -1.0666666666666666e+01 2833 431 -1.0668750000000001e+01 2834 2834 5.3366666666874991e+01 2834 3383 -1.0416666666666667e-03 2834 3382 -1.0658333333333333e+01 2834 2833 -1.0666666666666666e+01 2834 3385 -2.6624999999687500e+00 2834 3367 -1.0416666666666667e-03 2834 3377 6.2500000000000003e-03 2834 3373 -1.0416666666666667e-03 2834 2832 4.1666666666666666e-03 2834 1060 5.3333333333124999e+00 2834 786 5.3333333333124999e+00 2834 1020 -5.3333333333958333e+00 2834 432 -5.3333333333333330e+00 2834 1022 2.1333333333343749e+01 2834 430 -1.0666666666614583e+01 2834 1017 -5.3333333333124999e+00 2834 1012 6.2500000000000003e-03 2834 1011 -1.0416666666666667e-03 2834 431 4.1666666666666666e-03 2834 1018 -2.6624999999687500e+00 2834 429 -8.0000000000000000e+00 2834 785 -2.1333333333343749e+01 2834 781 -5.3333333333124999e+00 2834 428 -1.0666666666614583e+01 2834 1446 -8.0000000000000000e+00 2835 2835 4.2710416666666660e+01 2835 3386 1.5998958333333331e+01 2835 3388 5.3322916666666664e+00 2835 3367 -5.3281250000000000e+00 2835 3369 1.0416666666666666e-02 2835 3376 -5.3322916666666664e+00 2835 2832 -1.0670833333333334e+01 2835 2138 -4.9904357809065860e-20 2835 1458 -1.0666666666666666e+01 2835 2139 -5.3281250000000000e+00 2835 2156 2.1684043449710089e-19 2835 1449 6.2500000000000003e-03 2835 2153 5.3322916666666664e+00 2835 2143 1.4583333333333332e-02 2835 1455 6.2499999999999986e-03 2835 1448 -1.0672916666666666e+01 2835 2134 -5.3322916666666664e+00 2835 2130 5.3281250000000000e+00 2835 2159 -2.1684043449710089e-19 2835 1446 6.2499999999999986e-03 2835 2152 1.0666666666666666e+01 2835 1447 -1.0666666666666666e+01 2836 2836 3.2022916666666667e+01 2836 3670 -5.3312499999999998e+00 2836 3374 -4.1666666666666666e-03 2836 3394 5.3312499999999998e+00 2836 2840 -1.0668750000000001e+01 2836 3375 1.0668750000000001e+01 2836 3392 -5.3312499999999998e+00 2836 3378 1.0668750000000001e+01 2836 3391 -2.8940292364521927e-21 2836 3370 5.3291666666666666e+00 2836 3369 5.3291666666666666e+00 2836 2837 -1.0670833333333333e+01 2836 1251 4.1666666666666657e-03 2837 2837 5.3383333333333333e+01 2837 3392 3.1999999999999996e+01 2837 3391 5.3322916666666664e+00 2837 3378 -5.3322916666666664e+00 2837 3369 1.0416666666666664e-02 2837 3370 -5.3281250000000000e+00 2837 2836 -1.0670833333333333e+01 2837 2137 -1.0662500000000000e+01 2837 1251 -1.5994791666666664e+01 2837 2141 -5.3281250000000000e+00 2837 1250 -5.3343749999999996e+00 2837 2143 -1.0658333333333331e+01 2837 2134 1.0679166666666665e+01 2837 2130 -5.3302083333333332e+00 2837 1249 -1.0666666666666668e+01 2837 2150 5.3322916666666664e+00 2837 2151 1.0666666666666666e+01 2838 2838 2.1352083333333333e+01 2839 2839 3.2024999999999999e+01 2839 3685 -5.3312499999999998e+00 2839 3672 -4.1666666666666666e-03 2839 3395 -5.3312499999999998e+00 2839 2844 -1.0668750000000001e+01 2839 3673 1.0668750000000001e+01 2839 3671 -4.1666666666666666e-03 2839 3394 5.3312499999999998e+00 2839 3393 -1.0668750000000001e+01 2839 3669 4.1666666666666666e-03 2839 3670 -5.3312499999999998e+00 2839 3678 1.0668750000000001e+01 2839 2840 -1.0668750000000001e+01 2839 1251 4.1666666666666657e-03 2840 2840 4.2691666666666663e+01 2840 3375 -5.3322916666666664e+00 2840 3374 6.2500000000000003e-03 2840 3378 -5.3322916666666664e+00 2840 2836 -1.0668750000000001e+01 2840 3394 -2.1331249999999997e+01 2840 3393 5.3322916666666664e+00 2840 3669 -6.2500000000000003e-03 2840 3670 2.1331249999999997e+01 2840 3678 -5.3322916666666664e+00 2840 2839 -1.0668750000000001e+01 2840 1251 -1.0666666666666666e+01 2841 2841 2.1366666666666664e+01 2842 2842 2.1345833333333331e+01 2843 2843 2.1366666666666667e+01 2844 2844 4.2691666666666663e+01 2844 3395 2.1331249999999997e+01 2844 3685 2.1331249999999997e+01 2844 3673 -5.3322916666666664e+00 2844 3672 6.2500000000000003e-03 2844 3393 5.3322916666666664e+00 2844 2839 -1.0668750000000001e+01 2844 1251 -1.0666666666666666e+01 2844 4947 -5.3322916666666664e+00 2844 4950 6.2500000000000003e-03 2844 4954 -5.3322916666666664e+00 2844 4287 -1.0668750000000001e+01 2845 2845 3.2012500000000003e+01 2845 3420 -1.0842021724855044e-19 2845 3410 1.3552527156068805e-19 2845 3413 -1.3552527156068805e-19 2845 3403 1.0667708333333334e+01 2845 3402 5.3333333333333330e+00 2845 2853 -1.0667708333333334e+01 2845 2852 -5.3333333333333330e+00 2845 3406 -1.0842021724855044e-19 2845 3400 1.0667708333333334e+01 2845 3399 5.3333333333333330e+00 2845 2847 -1.0667708333333334e+01 2845 2846 -5.3333333333333330e+00 2846 2846 6.4041666666666671e+01 2846 3412 5.3395833333333327e+00 2846 2855 -5.3333333333333330e+00 2846 3410 2.1334374999999998e+01 2846 2853 -1.0661458333333332e+01 2846 3449 5.3312499999999998e+00 2846 3417 5.3312499999999998e+00 2846 3403 -5.3312499999999998e+00 2846 3408 2.1334374999999998e+01 2846 3443 -5.3312499999999998e+00 2846 3407 -5.3395833333333327e+00 2846 2854 -1.0661458333333334e+01 2846 2848 -5.3333333333333330e+00 2846 3406 2.1334374999999998e+01 2846 3400 -5.3312499999999998e+00 2846 3399 5.3395833333333327e+00 2846 2847 -1.0661458333333334e+01 2846 2845 -5.3333333333333330e+00 2846 882 -5.3312499999999998e+00 2846 891 -2.1334374999999998e+01 2846 890 5.3312499999999998e+00 2846 449 -1.0661458333333334e+01 2846 865 5.3312499999999998e+00 2846 884 5.3395833333333327e+00 2846 448 -5.3333333333333330e+00 2847 2847 6.4049999999999997e+01 2847 3407 5.3312499999999998e+00 2847 3402 -5.3312499999999998e+00 2847 3445 5.3312499999999998e+00 2847 3419 -1.0416666666666664e-02 2847 3420 2.1329166666666662e+01 2847 3458 -5.3312499999999998e+00 2847 2852 -1.0661458333333334e+01 2847 2850 -1.0667708333333334e+01 2847 3417 -1.0416666666666664e-02 2847 3418 2.1329166666666662e+01 2847 3441 -5.3312499999999998e+00 2847 2849 -1.0661458333333334e+01 2847 2848 -1.0667708333333334e+01 2847 3400 1.0416666666666664e-02 2847 3406 -2.1329166666666662e+01 2847 3399 -5.3312499999999998e+00 2847 2846 -1.0661458333333334e+01 2847 2845 -1.0667708333333334e+01 2848 2848 3.2012500000000003e+01 2848 3406 1.3552527156068805e-19 2848 3448 1.3552527156068805e-19 2848 3408 -1.3552527156068805e-19 2848 3443 1.0667708333333334e+01 2848 3407 -5.3333333333333330e+00 2848 2854 -1.0667708333333334e+01 2848 2846 -5.3333333333333330e+00 2848 3418 1.3552527156068805e-19 2848 3417 -1.0667708333333334e+01 2848 3441 5.3333333333333330e+00 2848 2847 -1.0667708333333334e+01 2848 2849 -5.3333333333333330e+00 2849 2849 6.4041666666666671e+01 2849 3447 5.3395833333333327e+00 2849 2857 -5.3333333333333330e+00 2849 3446 2.1334374999999998e+01 2849 2851 -1.0661458333333332e+01 2849 3419 5.3312499999999998e+00 2849 3443 -5.3312499999999998e+00 2849 3448 2.1334374999999998e+01 2849 3451 5.3312499999999998e+00 2849 2854 -1.0661458333333334e+01 2849 3457 -5.3312499999999998e+00 2849 3445 -5.3395833333333327e+00 2849 2850 -5.3333333333333330e+00 2849 3418 -2.1334374999999998e+01 2849 3417 5.3312499999999998e+00 2849 3441 5.3395833333333327e+00 2849 2847 -1.0661458333333334e+01 2849 2848 -5.3333333333333330e+00 2849 966 5.3312499999999998e+00 2849 953 5.3312499999999998e+00 2849 969 -2.1334374999999998e+01 2849 968 5.3312499999999998e+00 2849 982 5.3395833333333327e+00 2849 455 -1.0661458333333334e+01 2849 456 -5.3333333333333330e+00 2850 2850 3.2012500000000003e+01 2850 3460 1.3552527156068805e-19 2850 3418 -1.3552527156068805e-19 2850 3420 1.3552527156068805e-19 2850 3419 -1.0667708333333334e+01 2850 3458 5.3333333333333330e+00 2850 2847 -1.0667708333333334e+01 2850 2852 -5.3333333333333330e+00 2850 3446 -1.3552527156068805e-19 2850 3457 1.0667708333333334e+01 2850 3445 -5.3333333333333330e+00 2850 2851 -1.0667708333333334e+01 2850 2849 -5.3333333333333330e+00 2851 2851 6.4049999999999997e+01 2851 3446 -2.1329166666666666e+01 2851 2849 -1.0661458333333332e+01 2851 3460 -2.1329166666666666e+01 2851 2852 -1.0661458333333332e+01 2851 3458 -5.3312499999999998e+00 2851 3457 1.0416666666666664e-02 2851 3445 5.3312499999999998e+00 2851 2850 -1.0667708333333334e+01 2851 982 -5.3312499999999998e+00 2851 951 -5.3312499999999998e+00 2851 953 -1.0416666666666664e-02 2851 954 2.1329166666666662e+01 2851 961 5.3312499999999998e+00 2851 453 -1.0661458333333334e+01 2851 456 -1.0667708333333334e+01 2851 950 1.0416666666666664e-02 2851 938 5.3312499999999998e+00 2851 452 -1.0667708333333334e+01 2852 2852 6.4041666666666671e+01 2852 3413 2.1334374999999998e+01 2852 2853 -1.0661458333333332e+01 2852 3460 2.1334374999999998e+01 2852 2851 -1.0661458333333332e+01 2852 3457 -5.3312499999999998e+00 2852 3400 -5.3312499999999998e+00 2852 3420 -2.1334374999999998e+01 2852 3419 5.3312499999999998e+00 2852 3458 5.3395833333333327e+00 2852 2847 -1.0661458333333334e+01 2852 2850 -5.3333333333333330e+00 2852 3403 -5.3312499999999998e+00 2852 3402 5.3395833333333327e+00 2852 2845 -5.3333333333333330e+00 2852 860 5.3312499999999998e+00 2852 862 -5.3312499999999998e+00 2852 950 -5.3312499999999998e+00 2852 938 -5.3395833333333327e+00 2852 452 -5.3333333333333330e+00 2852 859 -2.1334374999999998e+01 2852 858 5.3312499999999998e+00 2852 863 5.3395833333333327e+00 2852 446 -1.0661458333333334e+01 2852 447 -5.3333333333333330e+00 2853 2853 6.4049999999999997e+01 2853 3413 -2.1329166666666666e+01 2853 2852 -1.0661458333333332e+01 2853 3410 -2.1329166666666666e+01 2853 2846 -1.0661458333333332e+01 2853 3399 -5.3312499999999998e+00 2853 3403 1.0416666666666664e-02 2853 3402 -5.3312499999999998e+00 2853 2845 -1.0667708333333334e+01 2853 863 -5.3312499999999998e+00 2853 848 5.3312499999999998e+00 2853 865 -1.0416666666666664e-02 2853 884 -5.3312499999999998e+00 2853 448 -1.0667708333333334e+01 2853 862 1.0416666666666664e-02 2853 847 -2.1329166666666662e+01 2853 846 5.3312499999999998e+00 2853 445 -1.0661458333333334e+01 2853 447 -1.0667708333333334e+01 2854 2854 6.4049999999999997e+01 2854 3483 -5.3312499999999998e+00 2854 3412 -5.3312499999999998e+00 2854 3441 -5.3312499999999998e+00 2854 3451 -1.0416666666666664e-02 2854 3448 -2.1329166666666662e+01 2854 3447 -5.3312499999999998e+00 2854 2849 -1.0661458333333334e+01 2854 2857 -1.0667708333333334e+01 2854 3449 -1.0416666666666664e-02 2854 3450 2.1329166666666662e+01 2854 3482 -5.3312499999999998e+00 2854 2856 -1.0661458333333334e+01 2854 2855 -1.0667708333333334e+01 2854 3443 1.0416666666666664e-02 2854 3408 -2.1329166666666662e+01 2854 3407 5.3312499999999998e+00 2854 2846 -1.0661458333333334e+01 2854 2848 -1.0667708333333334e+01 2855 2855 3.2012500000000003e+01 2855 2856 -5.3333333333333330e+00 2855 3482 5.3333333333333330e+00 2855 3412 5.3333333333333330e+00 2855 2846 -5.3333333333333330e+00 2855 3408 1.3552527156068805e-19 2855 3450 1.3552527156068805e-19 2855 3449 -1.0667708333333334e+01 2855 2854 -1.0667708333333334e+01 2855 893 -1.0842021724855044e-19 2855 891 1.0842021724855044e-19 2855 890 -1.0667708333333334e+01 2855 449 -1.0667708333333334e+01 2856 2856 6.4041666666666671e+01 2856 3482 5.3395833333333327e+00 2856 2855 -5.3333333333333330e+00 2856 3483 5.3395833333333327e+00 2856 2857 -5.3333333333333330e+00 2856 3451 5.3312499999999998e+00 2856 3450 -2.1334374999999998e+01 2856 3449 5.3312499999999998e+00 2856 2854 -1.0661458333333334e+01 2856 963 -5.3312499999999998e+00 2856 890 5.3312499999999998e+00 2856 853 5.3312499999999998e+00 2856 856 -2.1334374999999998e+01 2856 855 5.3312499999999998e+00 2856 964 5.3395833333333327e+00 2856 451 -1.0661458333333334e+01 2856 454 -5.3333333333333330e+00 2856 967 -2.1334374999999998e+01 2856 966 5.3312499999999998e+00 2856 455 -1.0661458333333334e+01 2856 893 -2.1334374999999998e+01 2856 892 5.3312499999999998e+00 2856 896 5.3395833333333327e+00 2856 449 -1.0661458333333334e+01 2856 450 -5.3333333333333330e+00 2857 2857 3.2012500000000003e+01 2857 2849 -5.3333333333333330e+00 2857 3447 5.3333333333333330e+00 2857 3483 5.3333333333333330e+00 2857 2856 -5.3333333333333330e+00 2857 3450 -1.3552527156068805e-19 2857 3448 -1.3552527156068805e-19 2857 3451 -1.0667708333333334e+01 2857 2854 -1.0667708333333334e+01 2857 969 -1.3552527156068805e-19 2857 967 1.3552527156068805e-19 2857 966 -1.0667708333333334e+01 2857 455 -1.0667708333333334e+01 2858 2858 3.2012500000000003e+01 2858 3410 1.0667708333333334e+01 2858 2860 -1.0667708333333334e+01 2858 2861 -1.0667708333333334e+01 2858 3409 1.0667708333333334e+01 2858 3404 -1.3552527156068805e-19 2858 3403 1.3552527156068805e-19 2858 2859 -5.3333333333333330e+00 2858 3399 -5.3333333333333330e+00 2858 865 1.3552527156068805e-19 2858 885 1.3552527156068805e-19 2858 45 -5.3333333333333330e+00 2858 884 -5.3333333333333330e+00 2859 2859 6.4041666666666671e+01 2859 3413 -5.3312499999999998e+00 2859 3468 -5.3312499999999998e+00 2859 3402 -5.3395833333333327e+00 2859 2869 -5.3333333333333330e+00 2859 3405 2.1334374999999998e+01 2859 3467 -5.3312499999999998e+00 2859 2866 -1.0661458333333334e+01 2859 3415 5.3312499999999998e+00 2859 3401 -5.3395833333333327e+00 2859 2864 -5.3333333333333330e+00 2859 3398 2.1334374999999998e+01 2859 3036 -5.3312499999999998e+00 2859 2863 -1.0661458333333334e+01 2859 3039 -5.3312499999999998e+00 2859 3035 5.3395833333333327e+00 2859 2862 -5.3333333333333330e+00 2859 3404 2.1334374999999998e+01 2859 3409 -5.3312499999999998e+00 2859 2861 -1.0661458333333334e+01 2859 3403 2.1334374999999998e+01 2859 2860 -1.0661458333333334e+01 2859 3410 -5.3312499999999998e+00 2859 3399 -5.3395833333333327e+00 2859 2858 -5.3333333333333330e+00 2860 2860 6.4049999999999997e+01 2860 3413 1.0416666666666664e-02 2860 2869 -1.0667708333333334e+01 2860 3410 1.0416666666666664e-02 2860 2858 -1.0667708333333334e+01 2860 3402 5.3312499999999998e+00 2860 3403 -2.1329166666666662e+01 2860 2859 -1.0661458333333334e+01 2860 3399 5.3312499999999998e+00 2860 863 5.3312499999999998e+00 2860 884 5.3312499999999998e+00 2860 865 2.1329166666666662e+01 2860 45 -1.0661458333333334e+01 2860 848 -5.3312499999999998e+00 2860 847 1.0416666666666664e-02 2860 862 -2.1329166666666662e+01 2860 846 -5.3312499999999998e+00 2860 43 -1.0661458333333334e+01 2860 44 -1.0667708333333334e+01 2861 2861 6.4049999999999997e+01 2861 3039 1.0416666666666664e-02 2861 2862 -1.0667708333333334e+01 2861 3409 1.0416666666666664e-02 2861 2858 -1.0667708333333334e+01 2861 3035 -5.3312499999999998e+00 2861 3404 -2.1329166666666662e+01 2861 3399 5.3312499999999998e+00 2861 2859 -1.0661458333333334e+01 2861 884 5.3312499999999998e+00 2861 885 -2.1329166666666662e+01 2861 883 5.3312499999999998e+00 2861 45 -1.0661458333333334e+01 2861 937 1.0416666666666664e-02 2861 933 -2.1329166666666662e+01 2861 50 -1.0661458333333334e+01 2861 49 -1.0667708333333334e+01 2862 2862 3.2012500000000003e+01 2862 3039 1.0667708333333334e+01 2862 2861 -1.0667708333333334e+01 2862 2863 -1.0667708333333334e+01 2862 3036 1.0667708333333334e+01 2862 3398 -1.3552527156068805e-19 2862 3404 1.3552527156068805e-19 2862 2859 -5.3333333333333330e+00 2862 3035 5.3333333333333330e+00 2862 933 -1.3552527156068805e-19 2862 936 1.3552527156068805e-19 2862 50 -5.3333333333333330e+00 2863 2863 6.4049999999999997e+01 2863 3036 1.0416666666666664e-02 2863 2862 -1.0667708333333334e+01 2863 3416 1.0416666666666664e-02 2863 2867 -1.0667708333333334e+01 2863 3401 5.3312499999999998e+00 2863 3461 5.3312499999999998e+00 2863 3415 -1.0416666666666664e-02 2863 3414 2.1329166666666662e+01 2863 3464 5.3312499999999998e+00 2863 2865 -1.0661458333333334e+01 2863 2864 -1.0667708333333334e+01 2863 3398 -2.1329166666666662e+01 2863 3035 -5.3312499999999998e+00 2863 2859 -1.0661458333333334e+01 2863 936 -2.1329166666666662e+01 2863 50 -1.0661458333333334e+01 2864 2864 3.2012500000000003e+01 2864 3405 -1.3552527156068805e-19 2864 3398 1.3552527156068805e-19 2864 2859 -5.3333333333333330e+00 2864 3401 -5.3333333333333330e+00 2864 3414 1.3552527156068805e-19 2864 3415 -1.0667708333333334e+01 2864 2863 -1.0667708333333334e+01 2864 3465 1.3552527156068805e-19 2864 2866 -1.0667708333333334e+01 2864 2865 -5.3333333333333330e+00 2864 3467 1.0667708333333334e+01 2864 3464 -5.3333333333333330e+00 2865 2865 6.4041666666666671e+01 2865 3465 2.1334374999999998e+01 2865 2866 -1.0661458333333332e+01 2865 3462 2.1334374999999998e+01 2865 2868 -1.0661458333333332e+01 2865 3469 -5.3312499999999998e+00 2865 3416 -5.3312499999999998e+00 2865 3461 -5.3395833333333327e+00 2865 2867 -5.3333333333333330e+00 2865 3414 -2.1334374999999998e+01 2865 3415 5.3312499999999998e+00 2865 2863 -1.0661458333333334e+01 2865 3467 -5.3312499999999998e+00 2865 3464 -5.3395833333333327e+00 2865 2864 -5.3333333333333330e+00 2865 563 -5.3312499999999998e+00 2865 513 5.3312499999999998e+00 2865 562 5.3395833333333327e+00 2865 51 -5.3333333333333330e+00 2865 515 -2.1334374999999998e+01 2865 514 5.3312499999999998e+00 2865 41 -1.0661458333333334e+01 2865 516 -5.3312499999999998e+00 2865 517 5.3395833333333327e+00 2865 42 -5.3333333333333330e+00 2866 2866 6.4049999999999997e+01 2866 3465 -2.1329166666666666e+01 2866 2865 -1.0661458333333332e+01 2866 3468 1.0416666666666664e-02 2866 2869 -1.0667708333333334e+01 2866 3402 5.3312499999999998e+00 2866 3405 -2.1329166666666662e+01 2866 3401 5.3312499999999998e+00 2866 2859 -1.0661458333333334e+01 2866 3467 1.0416666666666664e-02 2866 3464 5.3312499999999998e+00 2866 2864 -1.0667708333333334e+01 2866 562 -5.3312499999999998e+00 2866 563 1.0416666666666664e-02 2866 561 -5.3312499999999998e+00 2866 51 -1.0667708333333334e+01 2866 864 -2.1329166666666662e+01 2866 863 5.3312499999999998e+00 2866 43 -1.0661458333333334e+01 2867 2867 3.2012500000000003e+01 2867 3416 1.0667708333333334e+01 2867 2863 -1.0667708333333334e+01 2867 2868 -1.0667708333333334e+01 2867 3469 1.0667708333333334e+01 2867 3462 -1.3552527156068805e-19 2867 3414 -1.0842021724855044e-19 2867 2865 -5.3333333333333330e+00 2867 3461 -5.3333333333333330e+00 2867 936 -1.0842021724855044e-19 2867 520 -1.3552527156068805e-19 2867 50 -5.3333333333333330e+00 2868 2868 6.4049999999999997e+01 2868 3462 -2.1329166666666666e+01 2868 2865 -1.0661458333333332e+01 2868 3469 1.0416666666666664e-02 2868 2867 -1.0667708333333334e+01 2868 3461 5.3312499999999998e+00 2868 517 -5.3312499999999998e+00 2868 520 2.1329166666666662e+01 2868 50 -1.0661458333333334e+01 2868 521 -1.0416666666666664e-02 2868 48 -1.0667708333333334e+01 2868 516 1.0416666666666664e-02 2868 495 -2.1329166666666662e+01 2868 39 -1.0661458333333334e+01 2868 42 -1.0667708333333334e+01 2869 2869 3.2012500000000003e+01 2869 3468 1.0667708333333334e+01 2869 2866 -1.0667708333333334e+01 2869 2860 -1.0667708333333334e+01 2869 3413 1.0667708333333334e+01 2869 3403 -1.3552527156068805e-19 2869 3405 1.3552527156068805e-19 2869 2859 -5.3333333333333330e+00 2869 3402 -5.3333333333333330e+00 2869 864 -1.3552527156068805e-19 2869 862 1.3552527156068805e-19 2869 43 -5.3333333333333330e+00 2869 863 -5.3333333333333330e+00 2870 2870 3.2012500000000003e+01 2870 3454 -1.3552527156068805e-19 2870 3429 1.3552527156068805e-19 2870 3436 1.3552527156068805e-19 2870 3435 -1.0667708333333334e+01 2870 3442 5.3333333333333330e+00 2870 2874 -1.0667708333333334e+01 2870 3427 -1.3552527156068805e-19 2870 3440 1.0667708333333334e+01 2870 3426 -5.3333333333333330e+00 2870 2872 -1.0667708333333334e+01 2870 2871 -5.3333333333333330e+00 2871 2871 5.3381250000000001e+01 2871 3423 1.0416666666666667e-03 2871 3146 5.0116116045879435e-20 2871 3428 -6.2499999999999995e-03 2871 2876 4.1666666666666657e-03 2871 3485 1.0416666666666664e-03 2871 3431 1.0657291666666666e+01 2871 2875 -1.0666666666666666e+01 2871 3435 5.3312499999999998e+00 2871 3151 -5.3312499999999998e+00 2871 3144 -2.6583333333333332e+00 2871 2880 -8.0000000000000000e+00 2871 3429 2.1334374999999998e+01 2871 3425 -5.3312499999999998e+00 2871 3424 -2.6593749999999998e+00 2871 2874 -1.0661458333333334e+01 2871 2878 -8.0000000000000000e+00 2871 3427 2.1334374999999998e+01 2871 3440 -5.3312499999999998e+00 2871 3426 -5.3395833333333327e+00 2871 2872 -1.0661458333333334e+01 2871 2870 -5.3333333333333330e+00 2872 2872 6.4049999999999997e+01 2872 3442 -5.3312499999999998e+00 2872 3453 -1.0416666666666664e-02 2872 3454 2.1329166666666662e+01 2872 3144 -5.3312499999999998e+00 2872 3151 1.0416666666666664e-02 2872 3452 2.1329166666666662e+01 2872 3147 -5.3312499999999998e+00 2872 2880 -1.0667708333333334e+01 2872 3440 1.0416666666666664e-02 2872 3427 -2.1329166666666662e+01 2872 3426 5.3312499999999998e+00 2872 2871 -1.0661458333333334e+01 2872 2870 -1.0667708333333334e+01 2873 2873 3.2020833333333336e+01 2874 2874 6.4049999999999997e+01 2874 3034 1.0416666666666664e-02 2874 3426 5.3312499999999998e+00 2874 3437 2.1329166666666662e+01 2874 3421 -5.3312499999999998e+00 2874 3425 1.0416666666666664e-02 2874 3429 -2.1329166666666662e+01 2874 3424 -5.3312499999999998e+00 2874 2871 -1.0661458333333334e+01 2874 2878 -1.0667708333333334e+01 2874 3435 -1.0416666666666664e-02 2874 3436 2.1329166666666662e+01 2874 3442 -5.3312499999999998e+00 2874 2870 -1.0667708333333334e+01 2875 2875 4.2704166666666673e+01 2875 3249 6.2499999999999986e-03 2875 3147 -5.3281250000000000e+00 2875 3456 -1.0672916666666666e+01 2875 3144 -2.1684043449710089e-19 2875 3146 6.2500000000000003e-03 2875 2880 -5.3322916666666664e+00 2875 3428 5.3322916666666664e+00 2875 2871 -1.0666666666666666e+01 2875 3431 -1.5998958333333331e+01 2875 3485 -6.2499999999999995e-03 2875 3488 -5.3322916666666664e+00 2875 3486 1.5998958333333331e+01 2875 2876 -1.0668750000000001e+01 2876 2876 3.2024999999999999e+01 2876 3489 -4.1666666666666666e-03 2876 3424 -5.3312499999999998e+00 2876 3423 4.1666666666666666e-03 2876 3421 -5.3312499999999998e+00 2876 3438 -1.0668750000000001e+01 2876 2878 -1.0668750000000001e+01 2876 2871 4.1666666666666657e-03 2876 3428 -1.0668750000000001e+01 2876 3431 5.3312499999999998e+00 2876 3485 4.1666666666666675e-03 2876 3488 1.0668750000000001e+01 2876 3486 -5.3312499999999998e+00 2876 2875 -1.0668750000000001e+01 2877 2877 2.1360416666666669e+01 2878 2878 3.7352083333333333e+01 2878 3428 5.3322916666666664e+00 2878 3423 -6.2500000000000003e-03 2878 3438 5.3322916666666664e+00 2878 2876 -1.0668750000000001e+01 2878 3437 -1.0842021724855044e-19 2878 3421 1.3332291666666665e+01 2878 3429 -1.0842021724855044e-19 2878 3425 1.0667708333333334e+01 2878 3424 1.3332291666666665e+01 2878 2874 -1.0667708333333334e+01 2878 2871 -8.0000000000000000e+00 2879 2879 2.6693749999999998e+01 2880 2880 3.7350000000000001e+01 2880 3456 2.1961093809541182e-20 2880 3431 2.1684043449710089e-19 2880 3146 5.3322916666666664e+00 2880 2875 -5.3322916666666664e+00 2880 3427 1.3552527156068805e-19 2880 2871 -8.0000000000000000e+00 2880 3144 8.0000000000000000e+00 2880 3452 1.3552527156068805e-19 2880 3151 1.0667708333333334e+01 2880 3147 1.3334375000000000e+01 2880 2872 -1.0667708333333334e+01 2881 2881 3.7372916666666669e+01 2882 2882 1.6006250000000001e+01 2883 2883 1.6006250000000001e+01 2884 2884 2.1345833333333331e+01 2885 2885 2.1343750000000000e+01 2886 2886 3.7343750000291664e+01 2887 2887 6.4049999999999997e+01 2887 3462 1.0416666666666664e-02 2887 3469 -2.1329166666666666e+01 2887 3461 -5.3312499999999998e+00 2887 517 5.3312499999999998e+00 2887 5 -1.0667708333333334e+01 2887 520 -1.0416666666666664e-02 2887 521 2.1329166666666662e+01 2887 495 1.0416666666666664e-02 2887 516 -2.1329166666666662e+01 2888 2888 2.1333333333499997e+01 2888 3707 5.3333333333437496e+00 2888 3463 5.3333333333437496e+00 2888 3461 -5.3333333333229165e+00 2888 3470 -1.0666666666729165e+01 2888 5044 -5.3333333333229165e+00 2888 4773 -2.0833333333333345e-11 2888 5 -5.3333333333437496e+00 2888 5047 -5.3333333333229165e+00 2888 4350 -1.0666666666729165e+01 2889 2889 3.2000000000249997e+01 2890 2890 3.2024999999999999e+01 2890 3671 -4.1666666666666666e-03 2890 3670 -5.3312499999999998e+00 2890 3678 1.0668750000000001e+01 2890 3527 5.3312499999999998e+00 2890 3528 4.1666666666666666e-03 2890 3530 -5.3312499999999998e+00 2890 3532 -1.0668750000000001e+01 2890 2900 -1.0668750000000001e+01 2890 3669 4.1666666666666666e-03 2890 2892 4.1666666666666657e-03 2890 3526 5.3312499999999998e+00 2890 3525 -1.0668750000000001e+01 2890 2891 -1.0668750000000001e+01 2891 2891 4.2691666666666663e+01 2891 3678 -5.3322916666666664e+00 2891 3380 -5.3322916666666664e+00 2891 3374 6.2500000000000003e-03 2891 3670 2.1331249999999997e+01 2891 3375 -5.3322916666666664e+00 2891 2893 -1.0668750000000001e+01 2891 3669 -6.2500000000000003e-03 2891 3526 -2.1331249999999997e+01 2891 3525 5.3322916666666664e+00 2891 2892 -1.0666666666666666e+01 2891 2890 -1.0668750000000001e+01 2892 2892 4.2720833333333339e+01 2892 3528 1.0416666666666667e-03 2892 3371 -1.0416666666666667e-03 2892 3380 6.2500000000000003e-03 2892 3374 -1.0416666666666667e-03 2892 2893 4.1666666666666666e-03 2892 3515 2.1705219273391446e-19 2892 3527 1.0657291666666666e+01 2892 2900 -1.0666666666666666e+01 2892 3512 5.0116116045879435e-20 2892 3513 -1.0656249999999998e+01 2892 3524 -1.0657291666666666e+01 2892 2896 -1.0666666666666666e+01 2892 2899 -1.0666666666666666e+01 2892 3525 -6.2500000000000003e-03 2892 3669 1.0416666666666667e-03 2892 2890 4.1666666666666666e-03 2892 3526 1.0658333333333333e+01 2892 2891 -1.0666666666666666e+01 2893 2893 3.2024999999999999e+01 2893 3370 -4.1666666666666666e-03 2893 3523 5.3312499999999998e+00 2893 3372 1.0668750000000001e+01 2893 3371 -4.1666666666666666e-03 2893 3524 -5.3312499999999998e+00 2893 2899 -1.0668750000000001e+01 2893 2892 4.1666666666666657e-03 2893 3526 5.3312499999999998e+00 2893 3380 1.0668750000000001e+01 2893 3374 -4.1666666666666666e-03 2893 3670 -5.3312499999999998e+00 2893 3375 1.0668750000000001e+01 2893 2891 -1.0668750000000001e+01 2894 2894 2.1366666666666664e+01 2895 2895 2.1343750000000000e+01 2896 2896 4.2716666666666669e+01 2896 3308 6.2499999999999986e-03 2896 3518 1.0672916666666666e+01 2896 3530 -5.3281250000000000e+00 2896 3527 -3.2249014814734037e-20 2896 3515 -6.2499999999999986e-03 2896 2900 -5.3322916666666664e+00 2896 3524 -2.1684043449710089e-19 2896 3513 1.0666666666666666e+01 2896 2892 -1.0666666666666666e+01 2896 3512 -6.2499999999999986e-03 2896 3523 5.3281250000000000e+00 2896 2899 -5.3322916666666664e+00 2896 3517 1.0672916666666666e+01 2896 3516 -6.2499999999999986e-03 2896 3514 1.0666666666666666e+01 2897 2897 2.1354166666666668e+01 2898 2898 3.2045833333333327e+01 2899 2899 4.2689583333333331e+01 2899 3372 -5.3322916666666664e+00 2899 3371 6.2500000000000003e-03 2899 3380 -5.3322916666666664e+00 2899 2893 -1.0668750000000001e+01 2899 3513 -2.1684043449710089e-19 2899 3524 1.5998958333333333e+01 2899 2892 -1.0666666666666666e+01 2899 3517 1.6263032587282567e-19 2899 2896 -5.3322916666666664e+00 2899 3523 -2.1333333333333336e+01 2899 3512 -5.3322916666666664e+00 2900 2900 4.2689583333333331e+01 2900 3525 5.3322916666666664e+00 2900 3528 -6.2500000000000003e-03 2900 3532 5.3322916666666664e+00 2900 2890 -1.0668750000000001e+01 2900 3518 -2.1684043449710089e-19 2900 3530 2.1333333333333336e+01 2900 3513 2.1684043449710089e-19 2900 2896 -5.3322916666666664e+00 2900 3515 -5.3322916666666664e+00 2900 2892 -1.0666666666666666e+01 2900 3527 -1.5998958333333333e+01 2901 2901 3.2045833333333327e+01 2902 2902 2.1343750000000000e+01 2903 2903 2.1345833333333331e+01 2904 2904 2.1345833333333331e+01 2905 2905 3.2024999999999999e+01 2905 3604 5.3312499999999998e+00 2905 3564 5.3312499999999998e+00 2905 3543 -4.1666666666666666e-03 2905 3614 5.3312499999999998e+00 2905 3544 1.0668750000000001e+01 2905 2910 -1.0668750000000001e+01 2905 3537 -4.1666666666666666e-03 2905 2909 4.1666666666666657e-03 2905 3601 -5.3312499999999998e+00 2905 3538 1.0668750000000001e+01 2905 2908 -1.0668750000000001e+01 2905 3535 -4.1666666666666666e-03 2905 3536 1.0668750000000001e+01 2906 2906 2.1345833333333331e+01 2907 2907 2.1366666666666664e+01 2908 2908 4.2691666666666663e+01 2908 3605 -5.3322916666666664e+00 2908 3536 -5.3322916666666664e+00 2908 3602 -6.2500000000000003e-03 2908 3564 -2.1331249999999997e+01 2908 3563 5.3322916666666664e+00 2908 2912 -1.0668750000000001e+01 2908 3537 6.2500000000000003e-03 2908 3601 2.1331249999999997e+01 2908 3538 -5.3322916666666664e+00 2908 2909 -1.0666666666666666e+01 2908 2905 -1.0668750000000001e+01 2909 2909 4.2716666666833326e+01 2909 3603 6.2500000000000003e-03 2909 2913 4.1666666666666666e-03 2909 3605 6.2500000000000003e-03 2909 2912 4.1666666666666666e-03 2909 3602 1.0416666666666667e-03 2909 3543 -1.0416666666666667e-03 2909 3622 1.0416666666666667e-03 2909 3604 1.0658333333333333e+01 2909 2910 -1.0666666666666666e+01 2909 3538 6.2500000000000003e-03 2909 3537 -1.0416666666666667e-03 2909 2905 4.1666666666666666e-03 2909 3601 -1.0658333333333333e+01 2909 2908 -1.0666666666666666e+01 2909 4523 1.0416666666666667e-03 2909 4496 -1.0416666666666666e-11 2909 4527 -1.0416666666666667e-03 2909 4526 1.0662499999958333e+01 2909 3833 -1.0666666666666666e+01 2909 4491 6.2499999999999991e-11 2909 4490 -1.0416666666666666e-11 2909 3831 4.1666666666666665e-11 2909 4522 -1.0662499999958333e+01 2909 3832 -1.0666666666666666e+01 2910 2910 4.2691666666666663e+01 2910 3615 5.3322916666666664e+00 2910 3538 -5.3322916666666664e+00 2910 3622 -6.2500000000000003e-03 2910 3604 -2.1331249999999997e+01 2910 3603 -5.3322916666666664e+00 2910 2909 -1.0666666666666666e+01 2910 2913 -1.0668750000000001e+01 2910 3543 6.2500000000000003e-03 2910 3614 -2.1331249999999997e+01 2910 3544 -5.3322916666666664e+00 2910 2905 -1.0668750000000001e+01 2911 2911 2.1366666666666664e+01 2912 2912 3.2024999999999999e+01 2912 3629 -4.1666666666666666e-03 2912 2909 4.1666666666666657e-03 2912 3605 1.0668749999999999e+01 2912 3601 -5.3312499999999998e+00 2912 3602 4.1666666666666666e-03 2912 3564 5.3312499999999998e+00 2912 3563 -1.0668750000000001e+01 2912 2908 -1.0668750000000001e+01 2912 4545 -5.3312499999999998e+00 2912 4530 1.0668750000000001e+01 2912 4527 -4.1666666666666666e-03 2912 4526 5.3312499999999998e+00 2912 3833 -1.0668750000000001e+01 2913 2913 3.2024999999999999e+01 2913 3691 -4.1666666666666666e-03 2913 2909 4.1666666666666657e-03 2913 3603 1.0668749999999999e+01 2913 3614 5.3312499999999998e+00 2913 3615 -1.0668750000000001e+01 2913 3622 4.1666666666666666e-03 2913 3604 5.3312499999999998e+00 2913 2910 -1.0668750000000001e+01 2913 4522 -5.3312499999999998e+00 2913 4523 4.1666666666666666e-03 2913 4524 -5.3312499999999998e+00 2913 4965 1.0668750000000001e+01 2913 3832 -1.0668750000000001e+01 2914 2914 2.1345833333333331e+01 2915 2915 2.1345833333333331e+01 2916 2916 3.2024999999999999e+01 2916 3608 -5.3312499999999998e+00 2916 3541 -4.1666666666666666e-03 2916 3559 5.3312499999999998e+00 2916 2930 -1.0668750000000001e+01 2916 3542 1.0668750000000001e+01 2916 3535 -4.1666666666666666e-03 2916 2919 4.1666666666666657e-03 2916 3552 -5.3312499999999998e+00 2916 3545 1.0668750000000001e+01 2916 3539 -4.1666666666666666e-03 2916 3550 -5.3312499999999998e+00 2916 3546 1.0668750000000001e+01 2916 2917 -1.0668750000000001e+01 2917 2917 4.2691666666666663e+01 2917 3553 5.3322916666666664e+00 2917 3549 -6.2500000000000003e-03 2917 3556 5.3322916666666664e+00 2917 2921 -1.0668750000000001e+01 2917 3552 2.1331249999999997e+01 2917 2919 -1.0666666666666666e+01 2917 3545 -5.3322916666666664e+00 2917 3539 6.2500000000000003e-03 2917 3550 2.1331249999999997e+01 2917 3546 -5.3322916666666664e+00 2917 2916 -1.0668750000000001e+01 2918 2918 2.1366666666666664e+01 2919 2919 4.2733333333333334e+01 2919 3285 -1.0416666666666667e-03 2919 3541 -1.0416666666666667e-03 2919 3293 6.2500000000000003e-03 2919 3289 -1.0416666666666667e-03 2919 2929 4.1666666666666666e-03 2919 3559 1.0658333333333333e+01 2919 2930 -1.0666666666666666e+01 2919 3297 1.0416666666666667e-03 2919 3300 -1.0658333333333333e+01 2919 2927 -1.0666666666666666e+01 2919 3549 1.0416666666666667e-03 2919 3558 -6.2500000000000003e-03 2919 3572 1.0416666666666667e-03 2919 2925 4.1666666666666666e-03 2919 3556 -6.2500000000000003e-03 2919 3568 -1.0416666666666667e-03 2919 2921 4.1666666666666666e-03 2919 3557 1.0658333333333333e+01 2919 2922 -1.0666666666666666e+01 2919 3545 6.2500000000000003e-03 2919 3539 -1.0416666666666667e-03 2919 2916 4.1666666666666666e-03 2919 3552 -1.0658333333333333e+01 2919 2917 -1.0666666666666666e+01 2920 2920 2.1345833333333331e+01 2921 2921 3.2024999999999999e+01 2921 3550 -5.3312499999999998e+00 2921 3549 4.1666666666666666e-03 2921 3552 -5.3312499999999998e+00 2921 2917 -1.0668750000000001e+01 2921 3553 -1.0668750000000001e+01 2921 3566 -4.1666666666666666e-03 2921 2919 4.1666666666666657e-03 2921 3557 5.3312499999999998e+00 2921 3556 -1.0668750000000001e+01 2921 3568 -4.1666666666666666e-03 2921 3573 -5.3312499999999998e+00 2921 3570 1.0668750000000001e+01 2921 2922 -1.0668750000000001e+01 2922 2922 4.2691666666666663e+01 2922 3575 5.3322916666666664e+00 2922 3572 -6.2500000000000003e-03 2922 3558 5.3322916666666664e+00 2922 2925 -1.0668750000000001e+01 2922 3557 -2.1331249999999997e+01 2922 2919 -1.0666666666666666e+01 2922 3556 5.3322916666666664e+00 2922 3568 6.2500000000000003e-03 2922 3573 2.1331249999999997e+01 2922 3570 -5.3322916666666664e+00 2922 2921 -1.0668750000000001e+01 2923 2923 2.1366666666666664e+01 2924 2924 2.1345833333333331e+01 2925 2925 3.2024999999999999e+01 2925 3300 -5.3312499999999998e+00 2925 3297 4.1666666666666666e-03 2925 3296 -5.3312499999999998e+00 2925 3586 1.0668750000000001e+01 2925 2927 -1.0668750000000001e+01 2925 3573 -5.3312499999999998e+00 2925 3572 4.1666666666666666e-03 2925 2919 4.1666666666666657e-03 2925 3557 5.3312499999999998e+00 2925 3558 -1.0668750000000001e+01 2925 2922 -1.0668750000000001e+01 2925 3581 -4.1666666666666666e-03 2925 3575 -1.0668750000000001e+01 2926 2926 2.1345833333333331e+01 2927 2927 4.2691666666666663e+01 2927 3286 -5.3322916666666664e+00 2927 3285 6.2500000000000003e-03 2927 3293 -5.3322916666666664e+00 2927 2929 -1.0668750000000001e+01 2927 3300 2.1331249999999997e+01 2927 2919 -1.0666666666666666e+01 2927 3558 5.3322916666666664e+00 2927 3297 -6.2500000000000003e-03 2927 3296 2.1331249999999997e+01 2927 3586 -5.3322916666666664e+00 2927 2925 -1.0668750000000001e+01 2928 2928 2.1366666666666664e+01 2929 2929 3.2024999999999999e+01 2929 3296 -5.3312499999999998e+00 2929 3285 -4.1666666666666666e-03 2929 3300 -5.3312499999999998e+00 2929 2927 -1.0668750000000001e+01 2929 3286 1.0668750000000001e+01 2929 3283 -4.1666666666666666e-03 2929 2919 4.1666666666666657e-03 2929 3559 5.3312499999999998e+00 2929 3293 1.0668750000000001e+01 2929 3289 -4.1666666666666666e-03 2929 3608 -5.3312499999999998e+00 2929 3294 1.0668750000000001e+01 2929 2930 -1.0668750000000001e+01 2930 2930 4.2691666666666663e+01 2930 3542 -5.3322916666666664e+00 2930 3541 6.2500000000000003e-03 2930 3545 -5.3322916666666664e+00 2930 2916 -1.0668750000000001e+01 2930 3559 -2.1331249999999997e+01 2930 2919 -1.0666666666666666e+01 2930 3293 -5.3322916666666664e+00 2930 3289 6.2500000000000003e-03 2930 3608 2.1331249999999997e+01 2930 3294 -5.3322916666666664e+00 2930 2929 -1.0668750000000001e+01 2931 2931 2.1366666666666664e+01 2932 2932 2.1345833333333331e+01 2933 2933 3.2024999999999999e+01 2933 3579 -4.1666666666666666e-03 2933 3574 -5.3312499999999998e+00 2933 3585 1.0668750000000001e+01 2933 3581 -4.1666666666666666e-03 2933 3580 1.0668750000000001e+01 2933 3572 4.1666666666666666e-03 2933 3573 -5.3312499999999998e+00 2933 3575 -1.0668750000000001e+01 2933 2934 -1.0668750000000001e+01 2934 2934 4.2691666666666663e+01 2934 3585 -5.3322916666666664e+00 2934 3570 -5.3322916666666664e+00 2934 3568 6.2500000000000003e-03 2934 3574 2.1331249999999997e+01 2934 3569 -5.3322916666666664e+00 2934 2936 -1.0668750000000001e+01 2934 3572 -6.2500000000000003e-03 2934 3573 2.1331249999999997e+01 2934 3575 5.3322916666666664e+00 2934 2933 -1.0668750000000001e+01 2935 2935 2.1366666666666664e+01 2936 2936 3.2024999999999999e+01 2936 3183 4.1666666666666666e-03 2936 3567 1.0668750000000001e+01 2936 3566 -4.1666666666666666e-03 2936 3573 -5.3312499999999998e+00 2936 3570 1.0668750000000001e+01 2936 3568 -4.1666666666666666e-03 2936 3574 -5.3312499999999998e+00 2936 3569 1.0668750000000001e+01 2936 2934 -1.0668750000000001e+01 2937 2937 2.1366666666666664e+01 2938 2938 2.1345833333333331e+01 2939 2939 1.0683333333333334e+01 2940 2940 2.1345833333333331e+01 2941 2941 1.0683333333333334e+01 2942 2942 2.1345833333333331e+01 2943 2943 2.1345833333333331e+01 2944 2944 3.2024999999999999e+01 2944 3583 -4.1666666666666666e-03 2944 3584 1.0668750000000001e+01 2944 3581 -4.1666666666666666e-03 2944 3582 1.0668750000000001e+01 2944 3579 -4.1666666666666666e-03 2944 3580 1.0668750000000001e+01 2945 2945 2.1345833333333331e+01 2946 2946 1.0683333333333334e+01 2947 2947 2.1345833333333331e+01 2948 2948 1.0683333333333334e+01 2949 2949 2.1345833333333331e+01 2950 2950 1.0683333333333334e+01 2951 2951 3.2024999999999999e+01 2951 3614 5.3312499999999998e+00 2951 3543 -4.1666666666666666e-03 2951 3620 5.3312499999999998e+00 2951 2964 -1.0668750000000001e+01 2951 2955 4.1666666666666657e-03 2951 3609 -5.3312499999999998e+00 2951 3548 1.0668750000000001e+01 2951 3535 -4.1666666666666666e-03 2951 3544 1.0668750000000001e+01 2951 3541 -4.1666666666666666e-03 2951 3608 -5.3312499999999998e+00 2951 3542 1.0668750000000001e+01 2951 2952 -1.0668750000000001e+01 2952 2952 4.2691666666666663e+01 2952 3548 -5.3322916666666664e+00 2952 3294 -5.3322916666666664e+00 2952 3289 6.2500000000000003e-03 2952 3609 2.1331249999999997e+01 2952 3290 -5.3322916666666664e+00 2952 2955 -1.0666666666666666e+01 2952 2954 -1.0668750000000001e+01 2952 3541 6.2500000000000003e-03 2952 3608 2.1331249999999997e+01 2952 3542 -5.3322916666666664e+00 2952 2951 -1.0668750000000001e+01 2953 2953 2.1366666666666664e+01 2954 2954 3.2024999999999999e+01 2954 3531 -5.3312499999999998e+00 2954 3288 -4.1666666666666666e-03 2954 3529 -5.3312499999999998e+00 2954 2965 -1.0668750000000001e+01 2954 3284 1.0668750000000001e+01 2954 3283 -4.1666666666666666e-03 2954 3608 -5.3312499999999998e+00 2954 3294 1.0668750000000001e+01 2954 3289 -4.1666666666666666e-03 2954 2955 4.1666666666666657e-03 2954 3609 -5.3312499999999998e+00 2954 3290 1.0668750000000001e+01 2954 2952 -1.0668750000000001e+01 2955 2955 4.2733333333333334e+01 2955 3622 1.0416666666666667e-03 2955 3528 1.0416666666666667e-03 2955 3621 -6.2500000000000003e-03 2955 3674 -1.0416666666666667e-03 2955 2958 4.1666666666666666e-03 2955 3288 -1.0416666666666667e-03 2955 3531 -1.0658333333333333e+01 2955 2965 -1.0666666666666666e+01 2955 3543 -1.0416666666666667e-03 2955 3620 1.0658333333333333e+01 2955 2964 -1.0666666666666666e+01 2955 3548 6.2500000000000003e-03 2955 3541 -1.0416666666666667e-03 2955 2951 4.1666666666666666e-03 2955 3618 -6.2500000000000003e-03 2955 3688 1.0416666666666667e-03 2955 2956 4.1666666666666666e-03 2955 3619 1.0658333333333333e+01 2955 2957 -1.0666666666666666e+01 2955 3290 6.2500000000000003e-03 2955 3289 -1.0416666666666667e-03 2955 2954 4.1666666666666666e-03 2955 3609 -1.0658333333333333e+01 2955 2952 -1.0666666666666666e+01 2956 2956 3.2024999999999999e+01 2956 3691 -4.1666666666666666e-03 2956 3689 -5.3312499999999998e+00 2956 3694 1.0668750000000001e+01 2956 3620 5.3312499999999998e+00 2956 3622 4.1666666666666666e-03 2956 3614 5.3312499999999998e+00 2956 3615 -1.0668750000000001e+01 2956 2964 -1.0668750000000001e+01 2956 3688 4.1666666666666666e-03 2956 2955 4.1666666666666657e-03 2956 3619 5.3312499999999998e+00 2956 3618 -1.0668750000000001e+01 2956 2957 -1.0668750000000001e+01 2957 2957 4.2691666666666663e+01 2957 3694 -5.3322916666666664e+00 2957 3621 5.3322916666666664e+00 2957 3674 6.2500000000000003e-03 2957 3689 2.1331249999999997e+01 2957 3675 -5.3322916666666664e+00 2957 2958 -1.0668750000000001e+01 2957 3688 -6.2500000000000003e-03 2957 3619 -2.1331249999999997e+01 2957 3618 5.3322916666666664e+00 2957 2955 -1.0666666666666666e+01 2957 2956 -1.0668750000000001e+01 2958 2958 3.2024999999999999e+01 2958 3676 -4.1666666666666666e-03 2958 3529 -5.3312499999999998e+00 2958 3612 -1.0668750000000001e+01 2958 3528 4.1666666666666666e-03 2958 3531 -5.3312499999999998e+00 2958 2965 -1.0668750000000001e+01 2958 2955 4.1666666666666657e-03 2958 3619 5.3312499999999998e+00 2958 3621 -1.0668750000000001e+01 2958 3674 -4.1666666666666666e-03 2958 3689 -5.3312499999999998e+00 2958 3675 1.0668750000000001e+01 2958 2957 -1.0668750000000001e+01 2959 2959 2.1366666666666664e+01 2960 2960 2.1345833333333331e+01 2961 2961 2.1366666666666664e+01 2962 2962 2.1345833333333331e+01 2963 2963 2.1366666666666664e+01 2964 2964 4.2691666666666663e+01 2964 3618 5.3322916666666664e+00 2964 3622 -6.2500000000000003e-03 2964 3615 5.3322916666666664e+00 2964 2956 -1.0668750000000001e+01 2964 3614 -2.1331249999999997e+01 2964 3544 -5.3322916666666664e+00 2964 3543 6.2500000000000003e-03 2964 3620 -2.1331249999999997e+01 2964 3548 -5.3322916666666664e+00 2964 2955 -1.0666666666666666e+01 2964 2951 -1.0668750000000001e+01 2965 2965 4.2691666666666663e+01 2965 3612 5.3322916666666664e+00 2965 3528 -6.2500000000000003e-03 2965 3621 5.3322916666666664e+00 2965 2958 -1.0668750000000001e+01 2965 3531 2.1331249999999997e+01 2965 2955 -1.0666666666666666e+01 2965 3290 -5.3322916666666664e+00 2965 3288 6.2500000000000003e-03 2965 3529 2.1331249999999997e+01 2965 3284 -5.3322916666666664e+00 2965 2954 -1.0668750000000001e+01 2966 2966 2.1345833333333331e+01 2967 2967 2.1345833333333331e+01 2968 2968 3.2022916666666667e+01 2968 3630 5.3291666666666666e+00 2968 2971 4.1666666666666657e-03 2968 3633 1.0668749999999999e+01 2968 3361 -5.3312499999999998e+00 2968 3359 4.1666666666666666e-03 2968 3358 -5.3312499999999998e+00 2968 3634 1.0668750000000001e+01 2968 2969 -1.0668750000000001e+01 2968 4782 4.5316262678105068e-20 2968 4786 -5.3291666666666666e+00 2968 4566 5.3312499999999998e+00 2968 3914 -1.0670833333333334e+01 2969 2969 4.2691666666666663e+01 2969 3334 -5.3322916666666664e+00 2969 3333 6.2500000000000003e-03 2969 3340 -5.3322916666666664e+00 2969 2973 -1.0668750000000001e+01 2969 3361 2.1331249999999997e+01 2969 2971 -1.0666666666666666e+01 2969 3633 -5.3322916666666664e+00 2969 3359 -6.2500000000000003e-03 2969 3358 2.1331249999999997e+01 2969 3634 -5.3322916666666664e+00 2969 2968 -1.0668750000000001e+01 2970 2970 2.1366666666666664e+01 2971 2971 5.3412499999999994e+01 2971 3640 6.2500000000000003e-03 2971 2977 4.1666666666666666e-03 2971 3633 6.2500000000000003e-03 2971 2968 4.1666666666666666e-03 2971 3333 -1.0416666666666667e-03 2971 3641 1.0416666666666667e-03 2971 3340 6.2500000000000003e-03 2971 3335 -1.0416666666666667e-03 2971 2973 4.1666666666666666e-03 2971 3639 1.0658333333333333e+01 2971 2974 -1.0666666666666666e+01 2971 3359 1.0416666666666667e-03 2971 3361 -1.0658333333333333e+01 2971 2969 -1.0666666666666666e+01 2971 4561 5.3302083333333332e+00 2971 3919 2.0833333333333337e-03 2971 4567 -1.0683333333333334e+01 2971 4784 5.3302083333333332e+00 2971 4547 -1.0416666666666667e-03 2971 4560 -2.1326041666666665e+01 2971 3913 -1.5994791666666666e+01 2971 4786 1.0416666666666667e-03 2971 4566 2.1326041666666665e+01 2971 3914 -1.5994791666666666e+01 2972 2972 2.1352083333333333e+01 2973 2973 3.2024999999999999e+01 2973 3358 -5.3312499999999998e+00 2973 3333 -4.1666666666666666e-03 2973 3361 -5.3312499999999998e+00 2973 2969 -1.0668750000000001e+01 2973 3334 1.0668750000000001e+01 2973 3331 -4.1666666666666666e-03 2973 2971 4.1666666666666657e-03 2973 3639 5.3312499999999998e+00 2973 3340 1.0668750000000001e+01 2973 3335 -4.1666666666666666e-03 2973 3642 -5.3312499999999998e+00 2973 3341 1.0668750000000001e+01 2973 2974 -1.0668750000000001e+01 2974 2974 4.2691666666666663e+01 2974 3644 5.3322916666666664e+00 2974 3641 -6.2500000000000003e-03 2974 3640 -5.3322916666666664e+00 2974 2977 -1.0668750000000001e+01 2974 3639 -2.1331249999999997e+01 2974 2971 -1.0666666666666666e+01 2974 3340 -5.3322916666666664e+00 2974 3335 6.2500000000000003e-03 2974 3642 2.1331249999999997e+01 2974 3341 -5.3322916666666664e+00 2974 2973 -1.0668750000000001e+01 2975 2975 2.1366666666666664e+01 2976 2976 2.1345833333333331e+01 2977 2977 3.2022916666666660e+01 2977 2971 4.1666666666666657e-03 2977 3640 1.0668749999999999e+01 2977 3650 5.3291666666666666e+00 2977 3642 -5.3312499999999998e+00 2977 3641 4.1666666666666666e-03 2977 3639 5.3312499999999998e+00 2977 2974 -1.0668750000000001e+01 2977 3644 -1.0668750000000001e+01 2977 4560 -5.3312499999999998e+00 2977 4554 -2.8940292364521927e-21 2977 4547 5.3291666666666666e+00 2977 3913 -1.0670833333333333e+01 2978 2978 2.1352083333333333e+01 2979 2979 3.2024999999999999e+01 2979 3648 -4.1666666666666666e-03 2979 3643 -5.3312499999999998e+00 2979 3651 1.0668750000000001e+01 2979 3650 -4.1666666666666666e-03 2979 3649 1.0668750000000001e+01 2979 3641 4.1666666666666666e-03 2979 3642 -5.3312499999999998e+00 2979 3644 -1.0668750000000001e+01 2979 2980 -1.0668750000000001e+01 2980 2980 4.2691666666666663e+01 2980 3651 -5.3322916666666664e+00 2980 3341 -5.3322916666666664e+00 2980 3335 6.2500000000000003e-03 2980 3643 2.1331249999999997e+01 2980 3336 -5.3322916666666664e+00 2980 2982 -1.0668750000000001e+01 2980 3641 -6.2500000000000003e-03 2980 3642 2.1331249999999997e+01 2980 3644 5.3322916666666664e+00 2980 2979 -1.0668750000000001e+01 2981 2981 2.1366666666666664e+01 2982 2982 3.2024999999999999e+01 2982 3327 -4.1666666666666666e-03 2982 3332 1.0668750000000001e+01 2982 3331 -4.1666666666666666e-03 2982 3642 -5.3312499999999998e+00 2982 3341 1.0668750000000001e+01 2982 3335 -4.1666666666666666e-03 2982 3643 -5.3312499999999998e+00 2982 3336 1.0668750000000001e+01 2982 2980 -1.0668750000000001e+01 2983 2983 2.1366666666666664e+01 2984 2984 2.1345833333333331e+01 2985 2985 1.0683333333333334e+01 2986 2986 2.1345833333333331e+01 2987 2987 1.0683333333333334e+01 2988 2988 2.1345833333333331e+01 2989 2989 2.1345833333333331e+01 2990 2990 4.2704166666666666e+01 2990 3648 -4.1666666666666666e-03 2990 3650 1.5995833333333334e+01 2990 3649 1.0668750000000001e+01 2990 4554 -1.0662500000000000e+01 2990 4557 -1.0662500000000000e+01 2990 4547 -1.0683333333333334e+01 2990 3911 -1.0672916666666666e+01 2990 4548 1.5995833333333334e+01 2990 4549 1.0668750000000001e+01 2991 2991 2.1345833333333331e+01 2992 2992 1.0683333333333334e+01 2993 2993 3.2025000000000006e+01 2994 2994 3.2024999999999999e+01 2994 2997 4.1666666666666657e-03 2994 3626 1.0668749999999999e+01 2994 3623 -4.1666666666666666e-03 2994 2998 -1.0668749999999999e+01 2994 3659 5.3312499999999998e+00 2994 3656 -5.3312499999999998e+00 2994 3624 -4.1666666666666666e-03 2994 2996 4.1666666666666657e-03 2994 3655 -5.3312499999999998e+00 2994 3627 1.0668750000000001e+01 2994 2995 -1.0668750000000001e+01 2994 4898 -5.3312499999999998e+00 2994 4895 -4.1666666666666666e-03 2994 4899 -5.3312499999999998e+00 2994 4175 -1.0668750000000001e+01 2994 4176 4.1666666666666657e-03 2994 4942 5.3312499999999998e+00 2994 4896 1.0668750000000001e+01 2995 2995 4.2691666666666663e+01 2995 3632 -5.3322916666666664e+00 2995 3631 6.2500000000000003e-03 2995 3636 -5.3322916666666664e+00 2995 2999 -1.0668750000000001e+01 2995 3656 2.1331249999999997e+01 2995 2997 -1.0666666666666666e+01 2995 3626 -5.3322916666666664e+00 2995 3624 6.2500000000000003e-03 2995 3655 2.1331249999999997e+01 2995 3627 -5.3322916666666664e+00 2995 2996 -1.0666666666666666e+01 2995 2994 -1.0668750000000001e+01 2996 2996 4.2700000000333333e+01 2996 3660 -1.0662499999958333e+01 2996 3000 -1.0666666666666666e+01 2996 3701 -1.0416666666666666e-11 2996 3658 -1.0666666666583334e+01 2996 3002 -1.0666666666666666e+01 2996 3698 -1.0416666666666666e-11 2996 3657 -6.2499999999999991e-11 2996 3661 -1.0416666666666666e-11 2996 3001 4.1666666666666665e-11 2996 3631 -1.0416666666666667e-03 2996 3632 6.2500000000000003e-03 2996 3635 -1.0416666666666667e-03 2996 2999 4.1666666666666666e-03 2996 3623 -1.0416666666666667e-03 2996 3659 1.0662499999958333e+01 2996 2998 -1.0666666666666666e+01 2996 3627 6.2500000000000003e-03 2996 3624 -1.0416666666666667e-03 2996 2994 4.1666666666666666e-03 2996 3655 -1.0658333333333333e+01 2996 2995 -1.0666666666666666e+01 2996 4763 -1.0416666666666666e-11 2996 4768 6.2499999999999991e-11 2996 4182 4.1666666666666665e-11 2997 2997 4.2727083333333326e+01 2997 3626 6.2500000000000003e-03 2997 2994 4.1666666666666666e-03 2997 3636 6.2500000000000003e-03 2997 2999 4.1666666666666666e-03 2997 3631 -1.0416666666666667e-03 2997 3624 -1.0416666666666667e-03 2997 3656 -1.0658333333333333e+01 2997 2995 -1.0666666666666666e+01 2997 4895 -1.0416666666666667e-03 2997 4897 1.0416666666666667e-03 2997 4899 -1.0658333333333333e+01 2997 4175 -1.0666666666666666e+01 2997 4786 1.0416666666666667e-03 2997 4905 6.2499999999999995e-03 2997 4173 4.1666666666666657e-03 2997 4900 -1.0416666666666664e-03 2997 4784 -5.0116116045879435e-20 2997 4785 -1.0657291666666666e+01 2997 4907 -1.0657291666666666e+01 2997 4170 -1.0666666666666666e+01 2997 4169 -1.0666666666666666e+01 2998 2998 4.2679166666791659e+01 2998 3661 6.2500000000000004e-11 2998 3001 -1.0666666666687499e+01 2998 3623 6.2500000000000003e-03 2998 2994 -1.0668749999999999e+01 2998 3657 5.3333333333229165e+00 2998 3659 -2.1332291666656246e+01 2998 2996 -1.0666666666666666e+01 2998 3627 -5.3322916666666664e+00 2998 4943 5.3333333333229165e+00 2998 4942 -2.1332291666656246e+01 2998 4896 -5.3322916666666664e+00 2998 4176 -1.0666666666666666e+01 2999 2999 3.2022916666666660e+01 2999 2997 4.1666666666666657e-03 2999 3636 1.0668749999999999e+01 2999 3635 5.3291666666666666e+00 2999 3000 -1.0670833333333333e+01 2999 3655 -5.3312499999999998e+00 2999 3631 -4.1666666666666666e-03 2999 3656 -5.3312499999999998e+00 2999 2995 -1.0668750000000001e+01 2999 2996 4.1666666666666657e-03 2999 3660 -5.3312499999999998e+00 2999 3632 1.0668750000000001e+01 2999 4785 -5.3312499999999998e+00 2999 4791 2.8940292364521927e-21 2999 4786 -5.3291666666666666e+00 2999 4170 -1.0670833333333333e+01 3000 3000 4.2685416666791660e+01 3000 3660 2.1332291666656246e+01 3000 2996 -1.0666666666666666e+01 3000 3635 1.0416666666666666e-02 3000 2999 -1.0670833333333333e+01 3000 3632 -5.3322916666666664e+00 3000 4768 -5.3333333333229165e+00 3000 4763 6.2500000000000004e-11 3000 4762 -5.3333333333229165e+00 3000 4182 -1.0666666666687499e+01 3000 4786 5.3281250000000000e+00 3000 4790 -4.9904357809065860e-20 3000 4791 -5.3322916666666664e+00 3000 4170 6.2499999999999995e-03 3000 4795 1.5999999999989583e+01 3000 4172 -1.0666666666666666e+01 3001 3001 3.2000000000249997e+01 3001 3661 -4.1666666666666665e-11 3001 2998 -1.0666666666687499e+01 3001 3003 4.1666666666666665e-11 3001 3700 1.0666666666687499e+01 3001 3658 -5.3333333333124999e+00 3001 3698 -4.1666666666666665e-11 3001 3703 -5.3333333333124999e+00 3001 3002 -1.0666666666687499e+01 3001 2996 4.1666666666666665e-11 3001 3659 5.3333333333124999e+00 3001 3657 -1.0666666666687499e+01 3001 4942 5.3333333333124999e+00 3001 4992 5.3333333333124999e+00 3001 5002 -4.1666666666666665e-11 3001 4176 4.1666666666666665e-11 3001 4941 5.3333333333124999e+00 3001 4943 -1.0666666666687499e+01 3001 4183 -1.0666666666687499e+01 3002 3002 4.2666666666916662e+01 3002 3703 2.1333333333312499e+01 3002 3003 -1.0666666666666666e+01 3002 3701 6.2500000000000004e-11 3002 3658 2.1333333333312499e+01 3002 2996 -1.0666666666666666e+01 3002 3657 5.3333333333229165e+00 3002 3698 6.2499999999999991e-11 3002 3700 -5.3333333333229165e+00 3002 3001 -1.0666666666687499e+01 3002 4767 -5.3333333333229165e+00 3002 4768 -5.3333333333229165e+00 3002 4182 -1.0666666666687499e+01 3003 3003 4.2666666667333331e+01 3003 3700 6.2499999999999991e-11 3003 3001 4.1666666666666665e-11 3003 3701 -1.0416666666666666e-11 3003 3703 -1.0666666666583334e+01 3003 3002 -1.0666666666666666e+01 3003 3698 -1.0416666666666666e-11 3003 4981 -1.0416666666666666e-11 3003 5002 -1.0416666666666666e-11 3003 4992 1.0666666666583334e+01 3003 4183 -1.0666666666666666e+01 3003 4663 -1.0416666666666666e-11 3003 4767 6.2499999999999991e-11 3003 4761 -1.0416666666666666e-11 3003 4182 4.1666666666666665e-11 3003 4673 6.2499999999999991e-11 3003 4667 -1.0416666666666666e-11 3003 4180 4.1666666666666665e-11 3003 4991 1.0666666666583334e+01 3003 4181 -1.0666666666666666e+01 3003 4983 6.2499999999999991e-11 3003 4678 1.0416666666666666e-11 3003 4177 4.1666666666666665e-11 3003 4681 -1.0666666666583334e+01 3003 4178 -1.0666666666666666e+01 3004 3004 3.2024999999999999e+01 3004 3676 -4.1666666666666666e-03 3004 3687 -5.3312499999999998e+00 3004 3680 1.0668750000000001e+01 3004 3671 -4.1666666666666666e-03 3004 3677 1.0668750000000001e+01 3004 3672 -4.1666666666666666e-03 3004 3685 -5.3312499999999998e+00 3004 3673 1.0668750000000001e+01 3004 3005 -1.0668750000000001e+01 3005 3005 4.2691666666666663e+01 3005 3685 2.1331249999999997e+01 3005 3687 2.1331249999999997e+01 3005 3680 -5.3322916666666664e+00 3005 3672 6.2500000000000003e-03 3005 3673 -5.3322916666666664e+00 3005 3004 -1.0668750000000001e+01 3005 4954 -5.3322916666666664e+00 3005 4950 6.2500000000000003e-03 3005 4951 -5.3322916666666664e+00 3005 4290 -1.0668750000000001e+01 3006 3006 2.1366666666666667e+01 3007 3007 2.1345833333333331e+01 3008 3008 1.0683333333333334e+01 3009 3009 2.1366666666666667e+01 3010 3010 2.1345833333333331e+01 3011 3011 3.2024999999999999e+01 3011 3014 4.1666666666666657e-03 3011 3693 1.0668749999999999e+01 3011 3691 -4.1666666666666666e-03 3011 3690 -5.3312499999999998e+00 3011 3688 4.1666666666666666e-03 3011 3689 -5.3312499999999998e+00 3011 3694 1.0668750000000001e+01 3011 3012 -1.0668750000000001e+01 3011 4635 -5.3312499999999998e+00 3011 4634 4.1666666666666666e-03 3011 4636 -5.3312499999999998e+00 3011 3991 -1.0668750000000001e+01 3011 4637 -1.0668750000000001e+01 3012 3012 4.2691666666666663e+01 3012 3675 -5.3322916666666664e+00 3012 3674 6.2500000000000003e-03 3012 3679 -5.3322916666666664e+00 3012 3016 -1.0668750000000001e+01 3012 3690 2.1331249999999997e+01 3012 3014 -1.0666666666666666e+01 3012 3693 -5.3322916666666664e+00 3012 3688 -6.2500000000000003e-03 3012 3689 2.1331249999999997e+01 3012 3694 -5.3322916666666664e+00 3012 3011 -1.0668750000000001e+01 3013 3013 2.1366666666666664e+01 3014 3014 4.2733333333333327e+01 3014 3686 -1.0658333333333333e+01 3014 3018 -1.0666666666666666e+01 3014 3693 6.2500000000000003e-03 3014 3011 4.1666666666666666e-03 3014 3672 -1.0416666666666667e-03 3014 3679 6.2500000000000003e-03 3014 3674 -1.0416666666666667e-03 3014 3016 4.1666666666666666e-03 3014 3688 1.0416666666666667e-03 3014 3690 -1.0658333333333333e+01 3014 3012 -1.0666666666666666e+01 3014 4950 -1.0416666666666667e-03 3014 4622 -1.0416666666666667e-03 3014 4640 -6.2500000000000003e-03 3014 4952 -1.0416666666666667e-03 3014 3994 4.1666666666666666e-03 3014 4641 1.0658333333333333e+01 3014 3995 -1.0666666666666666e+01 3014 4634 1.0416666666666667e-03 3014 4628 6.2500000000000003e-03 3014 4620 -1.0416666666666667e-03 3014 3990 4.1666666666666666e-03 3014 4636 -1.0658333333333333e+01 3014 3991 -1.0666666666666666e+01 3015 3015 2.1345833333333331e+01 3016 3016 3.2024999999999999e+01 3016 3686 -5.3312499999999998e+00 3016 3672 -4.1666666666666666e-03 3016 3687 -5.3312499999999998e+00 3016 3680 1.0668750000000001e+01 3016 3018 -1.0668750000000001e+01 3016 3689 -5.3312499999999998e+00 3016 3674 -4.1666666666666666e-03 3016 3014 4.1666666666666657e-03 3016 3690 -5.3312499999999998e+00 3016 3679 1.0668750000000001e+01 3016 3012 -1.0668750000000001e+01 3016 3676 -4.1666666666666666e-03 3016 3675 1.0668750000000001e+01 3017 3017 2.1345833333333331e+01 3018 3018 4.2691666666666663e+01 3018 3687 2.1331249999999997e+01 3018 3686 2.1331249999999997e+01 3018 3014 -1.0666666666666666e+01 3018 3679 -5.3322916666666664e+00 3018 3672 6.2500000000000003e-03 3018 3680 -5.3322916666666664e+00 3018 3016 -1.0668750000000001e+01 3018 4951 -5.3322916666666664e+00 3018 4950 6.2500000000000003e-03 3018 4640 5.3322916666666664e+00 3018 3994 -1.0668750000000001e+01 3019 3019 2.1366666666666667e+01 3020 3020 4.2666666666916662e+01 3020 3701 6.2499999999999991e-11 3020 3703 2.1333333333312499e+01 3020 3022 -1.0666666666666666e+01 3020 3021 -1.0666666666687499e+01 3020 3700 -5.3333333333229165e+00 3020 3704 -5.3333333333229165e+00 3020 3698 6.2500000000000004e-11 3020 3702 2.1333333333312499e+01 3020 3699 -5.3333333333229165e+00 3020 4767 -5.3333333333229165e+00 3020 441 -1.0666666666666666e+01 3020 442 -1.0666666666687499e+01 3021 3021 3.2000000000249997e+01 3021 3701 -4.1666666666666665e-11 3021 3703 -5.3333333333124999e+00 3021 3020 -1.0666666666687499e+01 3021 3022 4.1666666666666665e-11 3021 3704 1.0666666666687499e+01 3021 3702 -5.3333333333124999e+00 3021 4776 5.3333333333124999e+00 3021 4761 -4.1666666666666665e-11 3021 4991 5.3333333333124999e+00 3021 4065 -1.0666666666687499e+01 3021 4767 1.0666666666687499e+01 3021 4063 4.1666666666666665e-11 3021 4770 -5.3333333333124999e+00 3021 4766 1.0666666666687499e+01 3021 4760 -4.1666666666666665e-11 3021 441 4.1666666666666665e-11 3021 4771 -5.3333333333124999e+00 3021 4062 -1.0666666666687499e+01 3022 3022 4.2666666667333331e+01 3022 3700 6.2499999999999991e-11 3022 3701 -1.0416666666666666e-11 3022 3703 -1.0666666666583334e+01 3022 3020 -1.0666666666666666e+01 3022 3021 4.1666666666666665e-11 3022 3698 -1.0416666666666666e-11 3022 4981 -1.0416666666666666e-11 3022 5002 -1.0416666666666666e-11 3022 442 4.1666666666666665e-11 3022 4992 1.0666666666583334e+01 3022 4067 -1.0666666666666666e+01 3022 4663 -1.0416666666666666e-11 3022 4767 6.2499999999999991e-11 3022 4761 -1.0416666666666666e-11 3022 4673 6.2499999999999991e-11 3022 4667 -1.0416666666666666e-11 3022 4057 4.1666666666666665e-11 3022 4991 1.0666666666583334e+01 3022 4065 -1.0666666666666666e+01 3022 4983 6.2499999999999991e-11 3022 4678 1.0416666666666666e-11 3022 4064 4.1666666666666665e-11 3022 4681 -1.0666666666583334e+01 3022 4058 -1.0666666666666666e+01 3023 3023 4.2666666667104160e+01 3023 3707 5.3333333333229165e+00 3023 3705 5.3333333333229165e+00 3023 3706 1.0666666666666666e+01 3023 4779 2.2470898404921788e-28 3023 5044 -5.3333333332812494e+00 3023 4773 -1.4583333333333332e-10 3023 4168 6.2499999999999991e-11 3023 4156 -1.0666666666729165e+01 3023 4772 5.3333333333229165e+00 3023 5038 5.3333333332812494e+00 3023 4764 -5.3333333332812494e+00 3023 4760 1.0416666666666667e-10 3023 4770 1.5999999999989583e+01 3023 4766 -5.3333333333229165e+00 3023 4159 -1.0666666666666666e+01 3023 4158 -1.0666666666708332e+01 3024 3024 2.1333333333520830e+01 3025 3025 2.1333333333541667e+01 3026 3026 2.1333333333520830e+01 3027 3027 3.2020833333333336e+01 3028 3028 6.4029166666666669e+01 3028 2396 1.4465734552327348e-19 3028 3055 2.1329166666666662e+01 3028 2382 -9.9486666632977745e-20 3028 2383 -2.1329166666666662e+01 3028 2379 2.1334374999999998e+01 3028 2335 1.0416666666666664e-02 3028 3048 -2.1329166666666662e+01 3029 3029 3.2020833333333336e+01 3030 3030 6.4029166666666654e+01 3030 2403 -9.9486666632977745e-20 3030 2378 1.4465734552327348e-19 3030 2380 -2.1329166666666662e+01 3030 2379 2.1334374999999998e+01 3030 3038 -2.1329166666666662e+01 3030 2354 1.0416666666666664e-02 3030 3040 2.1329166666666662e+01 3031 3031 3.2020833333333336e+01 3032 3032 6.4029166666666669e+01 3032 2382 1.4465734552327348e-19 3032 3046 2.1329166666666662e+01 3032 2378 -1.4465734552327348e-19 3032 2381 -2.1329166666666662e+01 3032 2379 2.1334374999999998e+01 3032 2368 1.0416666666666664e-02 3032 3037 -2.1329166666666662e+01 3033 3033 3.2020833333333336e+01 3034 3034 6.4029166666666669e+01 3034 2403 1.4465734552327348e-19 3034 3436 2.1329166666666662e+01 3034 2396 -1.4465734552327348e-19 3034 2395 -2.1329166666666662e+01 3034 2379 2.1334374999999998e+01 3034 2874 1.0416666666666664e-02 3034 3437 2.1329166666666662e+01 3035 3035 6.4041666666666671e+01 3035 2380 -5.3312499999999998e+00 3035 2368 5.3312499999999998e+00 3035 3044 -1.5997916666666667e+01 3035 2381 -5.3312499999999998e+00 3035 2389 5.3395833333333327e+00 3035 3037 -1.5997916666666665e+01 3035 2378 5.3333333333333330e+00 3035 3038 -1.5997916666666667e+01 3035 3041 -1.5997916666666665e+01 3035 2354 5.3312499999999998e+00 3035 2863 -5.3312499999999998e+00 3035 2361 5.3312499999999998e+00 3035 2359 -5.3333333333333330e+00 3035 3404 1.5997916666666667e+01 3035 2861 -5.3312499999999998e+00 3035 2859 5.3395833333333327e+00 3035 3039 -1.5997916666666665e+01 3035 2862 5.3333333333333330e+00 3035 3036 -1.5997916666666667e+01 3035 3398 1.5997916666666665e+01 3035 2366 5.3312499999999998e+00 3035 2364 -5.3333333333333330e+00 3036 3036 6.4029166666666669e+01 3036 2366 -2.1329166666666666e+01 3036 2863 1.0416666666666664e-02 3036 2862 1.0667708333333334e+01 3036 2859 -5.3312499999999998e+00 3036 2364 -1.4465734552327348e-19 3036 3398 -2.1329166666666662e+01 3036 3035 -1.5997916666666667e+01 3036 936 -2.1329166666666662e+01 3036 50 -5.3312499999999998e+00 3037 3037 6.4029166666666654e+01 3037 2364 9.9486666632977745e-20 3037 3044 2.1329166666666662e+01 3037 2389 -5.3312499999999998e+00 3037 3035 -1.5997916666666665e+01 3037 2381 1.0416666666666664e-02 3037 2379 -5.3312499999999998e+00 3037 2378 1.0667708333333334e+01 3037 3032 -2.1329166666666662e+01 3037 2368 -2.1329166666666662e+01 3038 3038 6.4029166666666669e+01 3038 2389 -5.3312499999999998e+00 3038 2359 -1.4465734552327348e-19 3038 3041 2.1329166666666662e+01 3038 3035 -1.5997916666666667e+01 3038 2354 -2.1329166666666662e+01 3038 2380 1.0416666666666664e-02 3038 3030 -2.1329166666666662e+01 3038 2379 -5.3312499999999998e+00 3038 2378 1.0667708333333334e+01 3039 3039 6.4029166666666669e+01 3039 2861 1.0416666666666664e-02 3039 2862 1.0667708333333334e+01 3039 2361 -2.1329166666666666e+01 3039 2359 9.9486666632977745e-20 3039 3404 -2.1329166666666662e+01 3039 2859 -5.3312499999999998e+00 3039 3035 -1.5997916666666665e+01 3039 50 -5.3312499999999998e+00 3039 933 -2.1329166666666662e+01 3040 3040 6.4029166666666669e+01 3040 2379 5.3312499999999998e+00 3040 2362 -1.4465734552327348e-19 3040 2380 -1.0416666666666664e-02 3040 3043 -2.1329166666666662e+01 3040 2397 5.3312499999999998e+00 3040 3442 -1.5997916666666665e+01 3040 2403 -1.0667708333333334e+01 3040 3030 2.1329166666666662e+01 3040 2354 2.1329166666666662e+01 3041 3041 6.4029166666666669e+01 3041 2360 5.3312499999999998e+00 3041 2390 -1.4465734552327348e-19 3041 3042 -2.1329166666666662e+01 3041 3399 1.5997916666666667e+01 3041 2378 1.4465734552327348e-19 3041 2380 2.1329166666666662e+01 3041 2389 -2.1334374999999998e+01 3041 2354 -1.0416666666666664e-02 3041 3038 2.1329166666666662e+01 3041 3035 -1.5997916666666665e+01 3041 2359 -1.0667708333333334e+01 3042 3042 6.4029166666666669e+01 3042 2397 5.3312499999999998e+00 3042 2362 1.4465734552327348e-19 3042 3043 -2.1329166666666662e+01 3042 3407 1.5997916666666667e+01 3042 2359 -1.4465734552327348e-19 3042 2354 2.1329166666666662e+01 3042 2360 -2.1334374999999998e+01 3042 2380 -1.0416666666666664e-02 3042 3041 -2.1329166666666662e+01 3042 2389 5.3312499999999998e+00 3042 3399 -1.5997916666666665e+01 3042 2390 -1.0667708333333334e+01 3043 3043 6.4029166666666669e+01 3043 2403 -9.9486666632977745e-20 3043 3040 -2.1329166666666662e+01 3043 3442 1.5997916666666667e+01 3043 2390 1.4465734552327348e-19 3043 2380 2.1329166666666662e+01 3043 2397 -2.1334374999999998e+01 3043 2354 -1.0416666666666664e-02 3043 3042 -2.1329166666666662e+01 3043 3407 -1.5997916666666665e+01 3043 2360 5.3312499999999998e+00 3043 2362 -1.0667708333333334e+01 3044 3044 6.4029166666666654e+01 3044 2402 1.2659172094511536e-19 3044 2378 -1.4465734552327348e-19 3044 2381 2.1329166666666662e+01 3044 2389 -2.1334374999999998e+01 3044 3037 2.1329166666666662e+01 3044 3035 -1.5997916666666667e+01 3044 2368 -1.0416666666666664e-02 3044 3045 -2.1329166666666662e+01 3044 3401 1.5997916666666665e+01 3044 2367 5.3312499999999998e+00 3044 2364 -1.0667708333333334e+01 3045 3045 6.4029166666666654e+01 3045 2373 -1.4465734552327348e-19 3045 3047 -2.1329166666666662e+01 3045 2385 5.3312499999999998e+00 3045 3091 -1.5997916666666665e+01 3045 2381 -1.0416666666666664e-02 3045 2389 5.3312499999999998e+00 3045 2402 -1.0667708333333334e+01 3045 2364 9.9486666632977745e-20 3045 3044 -2.1329166666666662e+01 3045 3401 -1.5997916666666667e+01 3045 2368 2.1329166666666662e+01 3045 2367 -2.1334374999999998e+01 3046 3046 6.4029166666666669e+01 3046 2385 5.3312499999999998e+00 3046 2373 1.4465734552327348e-19 3046 3047 -2.1329166666666662e+01 3046 3049 1.5997916666666667e+01 3046 2368 2.1329166666666662e+01 3046 2381 -1.0416666666666664e-02 3046 3032 2.1329166666666662e+01 3046 2379 5.3312499999999998e+00 3046 2382 -1.0667708333333334e+01 3047 3047 6.4029166666666669e+01 3047 2367 5.3312499999999998e+00 3047 2402 -1.2659172094511536e-19 3047 3045 -2.1329166666666662e+01 3047 3091 1.5997916666666667e+01 3047 2382 1.4465734552327348e-19 3047 2381 2.1329166666666662e+01 3047 2385 -2.1334374999999998e+01 3047 2368 -1.0416666666666664e-02 3047 3046 -2.1329166666666662e+01 3047 3049 -1.5997916666666665e+01 3047 2373 -1.0667708333333334e+01 3048 3048 6.4029166666666654e+01 3048 2336 1.4465734552327348e-19 3048 3052 2.1329166666666662e+01 3048 2385 -5.3312499999999998e+00 3048 3049 -1.5997916666666665e+01 3048 2383 1.0416666666666664e-02 3048 2379 -5.3312499999999998e+00 3048 2382 1.0667708333333334e+01 3048 3028 -2.1329166666666662e+01 3048 2335 -2.1329166666666662e+01 3049 3049 7.4687500000250012e+01 3049 2375 5.3333333332812494e+00 3049 3050 -2.1333333333291666e+01 3049 3096 -1.0666666666583334e+01 3049 2350 5.3333333333229165e+00 3049 2381 -5.3312499999999998e+00 3049 2335 5.3312499999999998e+00 3049 2336 -2.4000000000010417e+01 3049 3052 -1.5997916666666667e+01 3049 2383 -5.3312499999999998e+00 3049 2385 5.3395833333333327e+00 3049 3048 -1.5997916666666665e+01 3049 2382 5.3333333333333330e+00 3049 3046 1.5997916666666667e+01 3049 3047 -1.5997916666666665e+01 3049 2368 5.3312499999999998e+00 3049 2373 -1.3333333333343749e+01 3050 3050 4.2666666666999994e+01 3050 3705 1.0666666666666666e+01 3050 2373 1.8812360437258079e-27 3050 2375 -1.0666666666729165e+01 3050 3049 -2.1333333333291666e+01 3050 3096 1.0666666666666666e+01 3050 2336 1.0666666666625000e+01 3050 2350 -1.0666666666729165e+01 3051 3051 4.2666666666916669e+01 3052 3052 6.4029166666666669e+01 3052 2382 -9.9486666632977745e-20 3052 3048 2.1329166666666662e+01 3052 3049 -1.5997916666666667e+01 3052 2388 1.4465734552327348e-19 3052 2383 2.1329166666666662e+01 3052 2385 -2.1334374999999998e+01 3052 2335 -1.0416666666666664e-02 3052 3053 -2.1329166666666662e+01 3052 3090 1.5997916666666665e+01 3052 2337 5.3312499999999998e+00 3052 2336 -1.0667708333333334e+01 3053 3053 6.4029166666666654e+01 3053 2338 -1.4465734552327348e-19 3053 3054 -2.1329166666666662e+01 3053 2393 5.3312499999999998e+00 3053 3114 1.5997916666666665e+01 3053 2383 -1.0416666666666664e-02 3053 2385 5.3312499999999998e+00 3053 2388 -1.0667708333333334e+01 3053 2336 1.4465734552327348e-19 3053 3052 -2.1329166666666662e+01 3053 3090 -1.5997916666666667e+01 3053 2335 2.1329166666666662e+01 3053 2337 -2.1334374999999998e+01 3054 3054 6.4029166666666669e+01 3054 2337 5.3312499999999998e+00 3054 2388 -1.4465734552327348e-19 3054 3053 -2.1329166666666662e+01 3054 3114 -1.5997916666666667e+01 3054 2396 1.4465734552327348e-19 3054 2383 2.1329166666666662e+01 3054 2393 -2.1334374999999998e+01 3054 2335 -1.0416666666666664e-02 3054 3055 -2.1329166666666662e+01 3054 3421 1.5997916666666665e+01 3054 2338 -1.0667708333333334e+01 3055 3055 6.4029166666666654e+01 3055 3028 2.1329166666666662e+01 3055 2379 5.3312499999999998e+00 3055 2383 -1.0416666666666664e-02 3055 2393 5.3312499999999998e+00 3055 2396 -1.0667708333333334e+01 3055 2338 1.4465734552327348e-19 3055 3054 -2.1329166666666662e+01 3055 3421 -1.5997916666666667e+01 3055 2335 2.1329166666666662e+01 3056 3056 7.4712500000000006e+01 3056 2416 -5.3322916666666664e+00 3056 3060 -1.0658333333333331e+01 3056 3086 2.1329166666666666e+01 3056 2460 -5.3281250000000000e+00 3056 2470 5.3312499999999998e+00 3056 2445 -5.3312499999999998e+00 3056 2455 -2.6541666666666668e+00 3056 2454 1.3334375000000000e+01 3056 3062 -1.5997916666666667e+01 3056 2468 5.3312499999999998e+00 3056 2466 -5.3395833333333327e+00 3056 3079 -1.5997916666666665e+01 3056 2469 -5.3333333333333330e+00 3056 3081 1.5997916666666667e+01 3056 3057 -1.5997916666666665e+01 3056 2406 -5.3312499999999998e+00 3056 2405 -1.3327083333333333e+01 3056 2404 2.4001041666666666e+01 3057 3057 6.4029166666666669e+01 3057 2413 -5.3312499999999998e+00 3057 2478 1.4465734552327348e-19 3057 3089 -2.1329166666666662e+01 3057 3064 -1.5997916666666667e+01 3057 2469 -1.2659172094511536e-19 3057 2470 -2.1329166666666662e+01 3057 2466 2.1334374999999998e+01 3057 2406 1.0416666666666664e-02 3057 3081 -2.1329166666666662e+01 3057 3056 -1.5997916666666665e+01 3057 2405 -5.3312499999999998e+00 3057 2404 1.0667708333333334e+01 3058 3058 5.3375000000000007e+01 3058 2467 5.3312499999999998e+00 3058 2671 -5.3312499999999998e+00 3058 3066 -1.5997916666666667e+01 3058 2479 5.3312499999999998e+00 3058 2466 -5.3395833333333327e+00 3058 3212 1.5997916666666665e+01 3058 2480 -5.3333333333333330e+00 3058 2428 2.1705219273391446e-19 3058 2664 5.0116116045879435e-20 3058 3204 -1.0656249999999998e+01 3058 2665 -2.6583333333333337e+00 3058 3063 -1.0666666666666666e+01 3058 2663 8.0000000000000000e+00 3058 3074 1.5997916666666667e+01 3058 3059 -1.5997916666666665e+01 3058 2425 -5.3312499999999998e+00 3058 2424 -2.6583333333333332e+00 3058 2423 8.0000000000000000e+00 3059 3059 6.4029166666666654e+01 3059 2480 -1.2659172094511536e-19 3059 2421 -5.3312499999999998e+00 3059 2465 1.4465734552327348e-19 3059 2467 -2.1329166666666662e+01 3059 2466 2.1334374999999998e+01 3059 3073 -2.1329166666666662e+01 3059 3061 -1.5997916666666667e+01 3059 2425 1.0416666666666664e-02 3059 3074 -2.1329166666666662e+01 3059 3058 -1.5997916666666665e+01 3059 2424 -5.3312499999999998e+00 3059 2423 1.0667708333333334e+01 3060 3060 5.3375000000000007e+01 3060 2442 3.2249014814734037e-20 3060 2405 5.3302083333333332e+00 3060 2460 6.2499999999999986e-03 3060 3056 -1.0658333333333331e+01 3060 3086 -1.0666666666666664e+01 3060 2455 -5.3281250000000000e+00 3060 2454 5.3322916666666664e+00 3060 2433 -9.3703019790006975e-21 3060 3065 -3.2002083333333331e+01 3060 3253 -2.1329166666666666e+01 3060 2404 -1.0679166666666665e+01 3060 2416 -5.3343749999999996e+00 3060 2407 1.0662500000000000e+01 3060 2421 4.9904357809065860e-20 3060 2423 5.3322916666666664e+00 3060 2426 -5.3322916666666664e+00 3060 3061 -1.0666666666666666e+01 3060 3071 -1.0666666666666666e+01 3061 3061 5.3375000000000000e+01 3061 2460 -2.1705219273391446e-19 3061 2468 5.3312499999999998e+00 3061 2425 -5.3312499999999998e+00 3061 3059 -1.5997916666666667e+01 3061 2467 5.3312499999999998e+00 3061 2466 -5.3395833333333327e+00 3061 3073 1.5997916666666665e+01 3061 2465 -5.3333333333333330e+00 3061 3072 1.5997916666666667e+01 3061 3062 -1.5997916666666665e+01 3061 2445 -5.3312499999999998e+00 3061 2442 -2.6583333333333332e+00 3061 2454 8.0000000000000000e+00 3061 2426 -2.1705219273391446e-19 3061 3071 1.0656249999999998e+01 3061 3060 -1.0666666666666666e+01 3061 2421 -2.6583333333333337e+00 3061 2423 8.0000000000000000e+00 3062 3062 6.4029166666666669e+01 3062 2455 -5.3312499999999998e+00 3062 2469 1.4465734552327348e-19 3062 3079 2.1329166666666662e+01 3062 3056 -1.5997916666666667e+01 3062 2465 -1.4465734552327348e-19 3062 2468 -2.1329166666666662e+01 3062 2466 2.1334374999999998e+01 3062 2445 1.0416666666666664e-02 3062 3072 -2.1329166666666662e+01 3062 3061 -1.5997916666666665e+01 3062 2442 -5.3312499999999998e+00 3062 2454 1.0667708333333334e+01 3063 3063 5.3375000000000000e+01 3063 2407 1.0662500000000000e+01 3063 2433 1.4973071994693204e-20 3063 3065 -3.2002083333333331e+01 3063 3207 2.1329166666666669e+01 3063 2666 -5.3281250000000000e+00 3063 2424 2.1684043449710089e-19 3063 2423 5.3322916666666664e+00 3063 2428 -5.3322916666666664e+00 3063 2665 -2.1684043449710089e-19 3063 2664 6.2499999999999986e-03 3063 2663 5.3322916666666664e+00 3063 3204 1.0666666666666666e+01 3063 3058 -1.0666666666666666e+01 3063 2415 -5.3343749999999996e+00 3063 3064 -1.0658333333333331e+01 3063 3209 1.0666666666666668e+01 3063 2413 5.3302083333333332e+00 3063 2404 -1.0679166666666665e+01 3064 3064 7.4712499999999991e+01 3064 2479 5.3312499999999998e+00 3064 2406 -5.3312499999999998e+00 3064 3057 -1.5997916666666667e+01 3064 2470 5.3312499999999998e+00 3064 2466 -5.3395833333333327e+00 3064 3089 1.5997916666666665e+01 3064 2478 -5.3333333333333330e+00 3064 3215 1.5997916666666667e+01 3064 3066 -1.5997916666666665e+01 3064 2671 -5.3312499999999998e+00 3064 2666 -2.6541666666666663e+00 3064 2664 -5.3281250000000000e+00 3064 2663 1.3334375000000000e+01 3064 3209 -2.1329166666666666e+01 3064 3063 -1.0658333333333331e+01 3064 2413 -1.3327083333333333e+01 3064 2404 2.4001041666666666e+01 3064 2415 -5.3322916666666664e+00 3065 3065 8.5383333333333340e+01 3065 2415 5.3322916666666664e+00 3065 3063 -3.2002083333333331e+01 3065 3207 -2.1320833333333333e+01 3065 2428 5.3281250000000000e+00 3065 2423 -1.4583333333333334e-02 3065 2426 5.3281250000000000e+00 3065 2433 -1.0662500000000000e+01 3065 3060 -3.2002083333333331e+01 3065 3253 2.1320833333333333e+01 3065 2404 2.1331249999999997e+01 3065 2416 5.3322916666666664e+00 3065 2407 -3.1995833333333334e+01 3066 3066 6.4029166666666669e+01 3066 2665 -5.3312499999999998e+00 3066 2480 1.4465734552327348e-19 3066 3212 -2.1329166666666662e+01 3066 3058 -1.5997916666666667e+01 3066 2478 -1.4465734552327348e-19 3066 2479 -2.1329166666666662e+01 3066 2466 2.1334374999999998e+01 3066 2671 1.0416666666666664e-02 3066 3215 -2.1329166666666662e+01 3066 3064 -1.5997916666666665e+01 3066 2666 -5.3312499999999998e+00 3066 2663 1.0667708333333334e+01 3067 3067 6.4041666666666671e+01 3067 2467 -5.3312499999999998e+00 3067 2445 5.3312499999999998e+00 3067 3077 -1.5997916666666667e+01 3067 2468 -5.3312499999999998e+00 3067 2471 5.3395833333333327e+00 3067 3072 -1.5997916666666665e+01 3067 2465 5.3333333333333330e+00 3067 3073 -1.5997916666666667e+01 3067 3075 -1.5997916666666665e+01 3067 2425 5.3312499999999998e+00 3067 2387 -5.3312499999999998e+00 3067 2422 5.3312499999999998e+00 3067 2421 -5.3395833333333327e+00 3067 2436 -5.3333333333333330e+00 3067 3434 -1.5997916666666667e+01 3067 2394 -5.3312499999999998e+00 3067 2399 5.3395833333333327e+00 3067 3070 -1.5997916666666665e+01 3067 2400 5.3333333333333330e+00 3067 3068 -1.5997916666666667e+01 3067 3109 -1.5997916666666665e+01 3067 2443 5.3312499999999998e+00 3067 2442 -5.3395833333333327e+00 3067 2441 -5.3333333333333330e+00 3068 3068 6.4029166666666654e+01 3068 2458 9.9486666632977745e-20 3068 3111 2.1329166666666662e+01 3068 2393 -5.3312499999999998e+00 3068 3069 -1.5997916666666665e+01 3068 2387 1.0416666666666664e-02 3068 2399 -5.3312499999999998e+00 3068 2400 1.0667708333333334e+01 3068 2441 -1.4465734552327348e-19 3068 3109 2.1329166666666662e+01 3068 3067 -1.5997916666666667e+01 3068 2443 -2.1329166666666662e+01 3068 2442 2.1334374999999998e+01 3069 3069 5.3374999999999993e+01 3069 2426 -2.1705219273391446e-19 3069 2460 -5.0116116045879435e-20 3069 3071 -1.0656249999999998e+01 3069 3269 -1.0666666666666666e+01 3069 2394 -5.3312499999999998e+00 3069 2443 5.3312499999999998e+00 3069 2442 2.6583333333333332e+00 3069 2458 -8.0000000000000000e+00 3069 3111 -1.5997916666666667e+01 3069 2387 -5.3312499999999998e+00 3069 2393 5.3395833333333327e+00 3069 3068 -1.5997916666666665e+01 3069 2400 5.3333333333333330e+00 3069 3070 -1.5997916666666667e+01 3069 3422 1.5997916666666665e+01 3069 2422 5.3312499999999998e+00 3069 2421 2.6583333333333332e+00 3069 2420 -8.0000000000000000e+00 3070 3070 6.4029166666666669e+01 3070 2393 -5.3312499999999998e+00 3070 2436 1.2659172094511536e-19 3070 2394 1.0416666666666664e-02 3070 3434 2.1329166666666662e+01 3070 2399 -5.3312499999999998e+00 3070 3067 -1.5997916666666665e+01 3070 2400 1.0667708333333334e+01 3070 2420 -1.4465734552327348e-19 3070 3422 -2.1329166666666662e+01 3070 3069 -1.5997916666666667e+01 3070 2422 -2.1329166666666662e+01 3070 2421 2.1334374999999998e+01 3071 3071 4.2708333333333329e+01 3071 2454 2.1705219273391446e-19 3071 2420 -5.0116116045879435e-20 3071 2458 -2.1705219273391446e-19 3071 2442 1.0656249999999998e+01 3071 2460 -1.0666666666666666e+01 3071 3069 -1.0656249999999998e+01 3071 3269 1.0666666666666666e+01 3071 2423 2.1705219273391446e-19 3071 3061 1.0656249999999998e+01 3071 3060 -1.0666666666666666e+01 3071 2421 1.0656249999999998e+01 3071 2426 -1.0666666666666666e+01 3072 3072 6.4029166666666654e+01 3072 2441 1.2659172094511536e-19 3072 3077 2.1329166666666662e+01 3072 2471 -5.3312499999999998e+00 3072 3067 -1.5997916666666665e+01 3072 2468 1.0416666666666664e-02 3072 2466 -5.3312499999999998e+00 3072 2465 1.0667708333333334e+01 3072 2454 -1.4465734552327348e-19 3072 3062 -2.1329166666666662e+01 3072 3061 1.5997916666666667e+01 3072 2445 -2.1329166666666662e+01 3072 2442 2.1334374999999998e+01 3073 3073 6.4029166666666669e+01 3073 2471 -5.3312499999999998e+00 3073 2436 -1.4465734552327348e-19 3073 3075 2.1329166666666662e+01 3073 3067 -1.5997916666666667e+01 3073 2423 9.9486666632977745e-20 3073 2425 -2.1329166666666662e+01 3073 2421 2.1334374999999998e+01 3073 2467 1.0416666666666664e-02 3073 3059 -2.1329166666666662e+01 3073 2466 -5.3312499999999998e+00 3073 3061 1.5997916666666665e+01 3073 2465 1.0667708333333334e+01 3074 3074 6.4029166666666669e+01 3074 2425 -2.1329166666666666e+01 3074 2424 2.1334374999999998e+01 3074 2467 1.0416666666666664e-02 3074 2480 1.0667708333333334e+01 3074 2466 -5.3312499999999998e+00 3074 2423 -9.9486666632977745e-20 3074 3059 -2.1329166666666662e+01 3074 3058 1.5997916666666667e+01 3074 490 1.4465734552327348e-19 3074 983 -2.1329166666666662e+01 3074 484 -5.3312499999999998e+00 3074 981 1.5997916666666665e+01 3075 3075 6.4029166666666669e+01 3075 2435 5.3312499999999998e+00 3075 2472 -1.4465734552327348e-19 3075 3076 2.1329166666666662e+01 3075 3445 -1.5997916666666667e+01 3075 2465 1.4465734552327348e-19 3075 2467 2.1329166666666662e+01 3075 2471 -2.1334374999999998e+01 3075 2425 -1.0416666666666664e-02 3075 3073 2.1329166666666662e+01 3075 3067 -1.5997916666666665e+01 3075 2421 5.3312499999999998e+00 3075 2436 -1.0667708333333334e+01 3076 3076 6.4029166666666669e+01 3076 2467 1.0416666666666664e-02 3076 2472 1.0667708333333334e+01 3076 2425 -2.1329166666666666e+01 3076 2435 2.1334374999999998e+01 3076 2436 1.4465734552327348e-19 3076 3075 2.1329166666666662e+01 3076 2471 -5.3312499999999998e+00 3076 3445 -1.5997916666666665e+01 3076 484 -5.3312499999999998e+00 3076 490 -1.4465734552327348e-19 3076 983 -2.1329166666666662e+01 3076 982 1.5997916666666667e+01 3077 3077 6.4029166666666654e+01 3077 2476 9.9486666632977745e-20 3077 2442 5.3312499999999998e+00 3077 2465 -1.4465734552327348e-19 3077 2468 2.1329166666666662e+01 3077 2471 -2.1334374999999998e+01 3077 3072 2.1329166666666662e+01 3077 3067 -1.5997916666666667e+01 3077 2445 -1.0416666666666664e-02 3077 3078 -2.1329166666666662e+01 3077 3097 -1.5997916666666665e+01 3077 2444 5.3312499999999998e+00 3077 2441 -1.0667708333333334e+01 3078 3078 6.4029166666666654e+01 3078 2459 -1.4465734552327348e-19 3078 3080 -2.1329166666666662e+01 3078 2477 5.3312499999999998e+00 3078 3098 1.5997916666666665e+01 3078 2468 -1.0416666666666664e-02 3078 2471 5.3312499999999998e+00 3078 2476 -1.0667708333333334e+01 3078 2441 1.2659172094511536e-19 3078 3077 -2.1329166666666662e+01 3078 3097 1.5997916666666667e+01 3078 2445 2.1329166666666662e+01 3078 2444 -2.1334374999999998e+01 3079 3079 6.4029166666666669e+01 3079 2477 5.3312499999999998e+00 3079 2459 1.4465734552327348e-19 3079 3080 -2.1329166666666662e+01 3079 3085 1.5997916666666667e+01 3079 2454 -1.4465734552327348e-19 3079 2445 2.1329166666666662e+01 3079 2455 -2.1334374999999998e+01 3079 2468 -1.0416666666666664e-02 3079 3062 2.1329166666666662e+01 3079 2466 5.3312499999999998e+00 3079 3056 -1.5997916666666665e+01 3079 2469 -1.0667708333333334e+01 3080 3080 6.4029166666666669e+01 3080 2444 5.3312499999999998e+00 3080 2476 -9.9486666632977745e-20 3080 3078 -2.1329166666666662e+01 3080 3098 -1.5997916666666667e+01 3080 2469 1.4465734552327348e-19 3080 2468 2.1329166666666662e+01 3080 2477 -2.1334374999999998e+01 3080 2445 -1.0416666666666664e-02 3080 3079 -2.1329166666666662e+01 3080 3085 -1.5997916666666665e+01 3080 2455 5.3312499999999998e+00 3080 2459 -1.0667708333333334e+01 3081 3081 6.4029166666666654e+01 3081 2414 1.4465734552327348e-19 3081 3088 -2.1329166666666662e+01 3081 2477 -5.3312499999999998e+00 3081 3085 -1.5997916666666665e+01 3081 2470 1.0416666666666664e-02 3081 2466 -5.3312499999999998e+00 3081 2469 1.0667708333333334e+01 3081 2404 -9.9486666632977745e-20 3081 3057 -2.1329166666666662e+01 3081 3056 1.5997916666666667e+01 3081 2406 -2.1329166666666662e+01 3081 2405 2.1334374999999998e+01 3082 3082 4.2691666666666663e+01 3082 2411 5.3322916666666664e+00 3082 3087 -2.1331249999999997e+01 3082 3277 -1.0666666666666666e+01 3082 2462 5.3322916666666664e+00 3082 2455 -6.2500000000000003e-03 3082 2463 5.3322916666666664e+00 3082 2449 -1.0668750000000001e+01 3082 2405 -6.2500000000000003e-03 3082 3083 -2.1331249999999997e+01 3082 3623 1.0666666666666666e+01 3082 2412 5.3322916666666664e+00 3082 2410 -1.0668750000000001e+01 3083 3083 6.4020833333541674e+01 3083 3084 -2.1333333333312499e+01 3083 3661 -1.0666666666583334e+01 3083 2453 5.3333333333124999e+00 3083 2455 1.0662499999958333e+01 3083 2463 -2.1332291666656246e+01 3083 2449 5.3312499999999998e+00 3083 3082 -2.1331249999999997e+01 3083 3623 -1.0658333333333333e+01 3083 2405 1.0662499999958333e+01 3083 2412 -2.1332291666656246e+01 3083 2410 5.3312499999999998e+00 3083 290 5.3333333333124999e+00 3084 3084 4.2666666666916662e+01 3084 2412 5.3333333333229165e+00 3084 3083 -2.1333333333312499e+01 3084 3661 1.0666666666666666e+01 3084 2463 5.3333333333229165e+00 3084 2455 -6.2500000000000004e-11 3084 2459 5.3333333333229165e+00 3084 2453 -1.0666666666687499e+01 3084 2405 -6.2499999999999991e-11 3084 3085 -2.1333333333312499e+01 3084 3474 1.0666666666666666e+01 3084 2414 5.3333333333229165e+00 3084 290 -1.0666666666687499e+01 3085 3085 6.4020833333541674e+01 3085 2453 5.3333333333124999e+00 3085 2468 -5.3312499999999998e+00 3085 2406 5.3312499999999998e+00 3085 3088 1.5997916666666667e+01 3085 2470 -5.3312499999999998e+00 3085 2477 5.3395833333333327e+00 3085 3081 -1.5997916666666665e+01 3085 2469 5.3333333333333330e+00 3085 3079 1.5997916666666667e+01 3085 3080 -1.5997916666666665e+01 3085 2445 5.3312499999999998e+00 3085 2455 2.6635416666250000e+00 3085 2459 -1.3333333333322916e+01 3085 3084 -2.1333333333312499e+01 3085 3474 -1.0666666666583334e+01 3085 2405 2.6635416666250005e+00 3085 2414 -1.3333333333322916e+01 3085 290 5.3333333333124999e+00 3086 3086 4.2699999999999996e+01 3086 2404 1.0662500000000000e+01 3086 2454 -1.6284208410963924e-19 3086 3056 2.1329166666666666e+01 3086 3060 -1.0666666666666664e+01 3086 2462 1.6284208410963924e-19 3086 2455 1.0662500000000000e+01 3086 2460 -1.0672916666666666e+01 3086 3087 -2.1329166666666666e+01 3086 3262 1.0666666666666668e+01 3086 2405 -1.0683333333333334e+01 3086 2411 1.0662500000000000e+01 3086 2416 -1.0672916666666666e+01 3087 3087 7.4712499999999991e+01 3087 2410 5.3312499999999998e+00 3087 3082 -2.1331249999999997e+01 3087 3277 1.0658333333333333e+01 3087 2449 5.3312499999999998e+00 3087 2455 1.0653124999999999e+01 3087 2460 5.3281250000000000e+00 3087 2462 -2.1333333333333336e+01 3087 3086 -2.1329166666666666e+01 3087 3262 -1.0658333333333331e+01 3087 2405 2.1326041666666665e+01 3087 2411 -3.2000000000000000e+01 3087 2416 5.3322916666666664e+00 3088 3088 6.4029166666666669e+01 3088 2470 -2.1329166666666666e+01 3088 2477 2.1334374999999998e+01 3088 2406 1.0416666666666664e-02 3088 2414 1.0667708333333334e+01 3088 2405 -5.3312499999999998e+00 3088 2469 1.2659172094511536e-19 3088 3081 -2.1329166666666662e+01 3088 3085 1.5997916666666667e+01 3088 479 -1.4465734552327348e-19 3088 945 -2.1329166666666662e+01 3088 939 -1.5997916666666665e+01 3088 1208 -5.3312499999999998e+00 3089 3089 6.4029166666666669e+01 3089 2470 1.0416666666666664e-02 3089 2478 1.0667708333333334e+01 3089 2406 -2.1329166666666666e+01 3089 2413 2.1334374999999998e+01 3089 2404 9.9486666632977745e-20 3089 3057 -2.1329166666666662e+01 3089 2466 -5.3312499999999998e+00 3089 3064 1.5997916666666665e+01 3089 482 -5.3312499999999998e+00 3089 287 -1.4465734552327348e-19 3089 949 2.1329166666666662e+01 3089 970 1.5997916666666667e+01 3090 3090 6.4020833333541674e+01 3090 2349 -5.3333333333124999e+00 3090 3117 -2.1333333333312499e+01 3090 3095 1.0666666666583334e+01 3090 2451 -5.3333333333124999e+00 3090 2383 5.3312499999999998e+00 3090 2443 -5.3312499999999998e+00 3090 2457 -2.6635416666250000e+00 3090 2456 1.3333333333322916e+01 3090 3094 -1.5997916666666667e+01 3090 2387 5.3312499999999998e+00 3090 2385 -5.3395833333333327e+00 3090 3110 -1.5997916666666665e+01 3090 2388 -5.3333333333333330e+00 3090 3053 -1.5997916666666667e+01 3090 3052 1.5997916666666665e+01 3090 2335 -5.3312499999999998e+00 3090 2337 -2.6635416666250000e+00 3090 2336 1.3333333333322916e+01 3091 3091 5.3354166666874995e+01 3091 2487 1.8812360437258079e-27 3091 2375 -3.6295685768920020e-28 3091 3466 1.0666666666562499e+01 3091 3096 1.0666666666666666e+01 3091 2386 5.3312499999999998e+00 3091 2368 -5.3312499999999998e+00 3091 2367 -2.6635416666145835e+00 3091 2373 8.0000000000000000e+00 3091 3047 1.5997916666666667e+01 3091 2381 5.3312499999999998e+00 3091 2385 -5.3395833333333327e+00 3091 3045 -1.5997916666666665e+01 3091 2402 -5.3333333333333330e+00 3091 3105 -1.5997916666666667e+01 3091 3092 -1.5997916666666665e+01 3091 2483 -5.3312499999999998e+00 3091 2482 -2.6635416666145835e+00 3091 2481 8.0000000000000000e+00 3092 3092 6.4029166666666654e+01 3092 2402 -1.4465734552327348e-19 3092 2485 -5.3312499999999998e+00 3092 2384 9.9486666632977745e-20 3092 2386 -2.1329166666666662e+01 3092 2385 2.1334374999999998e+01 3092 3103 -2.1329166666666662e+01 3092 3093 -1.5997916666666667e+01 3092 2483 1.0416666666666664e-02 3092 3105 2.1329166666666662e+01 3092 3091 -1.5997916666666665e+01 3092 2482 -5.3312499999999998e+00 3092 2481 1.0667708333333334e+01 3093 3093 6.4020833333541674e+01 3093 2451 -5.3333333333124999e+00 3093 3100 2.1333333333312499e+01 3093 3095 1.0666666666583334e+01 3093 2494 -5.3333333333124999e+00 3093 2387 5.3312499999999998e+00 3093 2483 -5.3312499999999998e+00 3093 2485 -2.6635416666250000e+00 3093 2481 1.3333333333322916e+01 3093 3092 -1.5997916666666667e+01 3093 2386 5.3312499999999998e+00 3093 2385 -5.3395833333333327e+00 3093 3103 1.5997916666666665e+01 3093 2384 -5.3333333333333330e+00 3093 3102 1.5997916666666667e+01 3093 3094 -1.5997916666666665e+01 3093 2443 -5.3312499999999998e+00 3093 2444 -2.6635416666250000e+00 3093 2456 1.3333333333322916e+01 3094 3094 6.4029166666666669e+01 3094 2457 -5.3312499999999998e+00 3094 2388 1.2659172094511536e-19 3094 3110 2.1329166666666662e+01 3094 3090 -1.5997916666666667e+01 3094 2384 -1.4465734552327348e-19 3094 2387 -2.1329166666666662e+01 3094 2385 2.1334374999999998e+01 3094 2443 1.0416666666666664e-02 3094 3102 -2.1329166666666662e+01 3094 3093 -1.5997916666666665e+01 3094 2444 -5.3312499999999998e+00 3094 2456 1.0667708333333334e+01 3095 3095 6.4000000000583327e+01 3095 2336 -1.0666666666625000e+01 3095 2350 -5.3333333333229165e+00 3095 2349 1.5999999999958334e+01 3095 2481 1.0416666666666667e-10 3095 3096 -3.2000000000020833e+01 3095 2487 -5.3333333332812494e+00 3095 2494 5.3333333332916668e+00 3095 2444 -1.0416666666666666e-11 3095 2337 -1.0416666666666666e-11 3095 2457 -1.0416666666666666e-11 3095 2456 6.2499999999999991e-11 3095 2451 -4.1666666666666665e-11 3095 3090 1.0666666666583334e+01 3095 3117 -1.0666666666666666e+01 3095 2485 -1.0416666666666666e-11 3095 3093 1.0666666666583334e+01 3095 3100 1.0666666666666666e+01 3095 4760 -2.1333333333208333e+01 3096 3096 5.3333333333749991e+01 3096 2336 1.0666666666791667e+01 3096 2350 5.3333333333437496e+00 3096 2349 -1.0666666666625000e+01 3096 2494 -6.0691943799667649e-29 3096 3095 -3.2000000000020833e+01 3096 2481 -5.3333333333229165e+00 3096 2487 5.3333333333229165e+00 3096 2482 -2.0194839173657902e-27 3096 2367 2.0194839173657902e-27 3096 2375 -6.2499999999999991e-11 3096 2373 -5.3333333333229165e+00 3096 3466 1.0666666666666666e+01 3096 3091 1.0666666666666666e+01 3096 3049 -1.0666666666583334e+01 3096 3050 1.0666666666666666e+01 3096 4760 2.1333333333291666e+01 3097 3097 6.4041666666666671e+01 3097 2386 -5.3312499999999998e+00 3097 2443 5.3312499999999998e+00 3097 3109 -1.5997916666666667e+01 3097 2387 -5.3312499999999998e+00 3097 2399 5.3395833333333327e+00 3097 3102 -1.5997916666666665e+01 3097 2384 5.3333333333333330e+00 3097 3103 -1.5997916666666667e+01 3097 3108 -1.5997916666666665e+01 3097 2483 5.3312499999999998e+00 3097 2468 -5.3312499999999998e+00 3097 2486 5.3312499999999998e+00 3097 2485 -5.3395833333333327e+00 3097 2491 -5.3333333333333330e+00 3097 3459 1.5997916666666667e+01 3097 2475 -5.3312499999999998e+00 3097 2471 5.3395833333333327e+00 3097 3099 -1.5997916666666665e+01 3097 2476 5.3333333333333330e+00 3097 3078 1.5997916666666667e+01 3097 3077 -1.5997916666666665e+01 3097 2445 5.3312499999999998e+00 3097 2444 -5.3395833333333327e+00 3097 2441 -5.3333333333333330e+00 3098 3098 6.4020833333541674e+01 3098 2492 5.3333333333124999e+00 3098 3104 -2.1333333333312499e+01 3098 3474 -1.0666666666583334e+01 3098 2453 5.3333333333124999e+00 3098 2475 -5.3312499999999998e+00 3098 2445 5.3312499999999998e+00 3098 2444 2.6635416666250000e+00 3098 2459 -1.3333333333322916e+01 3098 3080 -1.5997916666666667e+01 3098 2468 -5.3312499999999998e+00 3098 2477 5.3395833333333327e+00 3098 3078 1.5997916666666665e+01 3098 2476 5.3333333333333330e+00 3098 3099 -1.5997916666666667e+01 3098 3473 1.5997916666666665e+01 3098 2486 5.3312499999999998e+00 3098 2485 2.6635416666250000e+00 3098 2484 -1.3333333333322916e+01 3099 3099 6.4029166666666669e+01 3099 2477 -5.3312499999999998e+00 3099 2491 1.4465734552327348e-19 3099 2475 1.0416666666666664e-02 3099 3459 -2.1329166666666662e+01 3099 2471 -5.3312499999999998e+00 3099 3097 -1.5997916666666665e+01 3099 2476 1.0667708333333334e+01 3099 2484 -1.4465734552327348e-19 3099 3473 -2.1329166666666662e+01 3099 3098 -1.5997916666666667e+01 3099 2486 -2.1329166666666662e+01 3099 2485 2.1334374999999998e+01 3100 3100 4.2666666666916662e+01 3100 2493 5.3333333333229165e+00 3100 2456 5.3333333333229165e+00 3100 2485 -6.2500000000000004e-11 3100 3093 2.1333333333312499e+01 3100 3095 1.0666666666666666e+01 3100 2481 5.3333333333229165e+00 3100 2494 -1.0666666666687499e+01 3100 2444 -6.2500000000000004e-11 3100 3101 -2.1333333333312499e+01 3100 3701 1.0666666666666666e+01 3100 2452 5.3333333333229165e+00 3100 2451 -1.0666666666687499e+01 3101 3101 6.4000000000416662e+01 3101 2494 5.3333333333124999e+00 3101 2453 5.3333333333124999e+00 3101 3104 -2.1333333333312499e+01 3101 3698 -1.0666666666583334e+01 3101 2485 1.0666666666583334e+01 3101 2493 -2.1333333333312499e+01 3101 2492 5.3333333333124999e+00 3101 3100 -2.1333333333312499e+01 3101 3701 -1.0666666666583334e+01 3101 2444 1.0666666666583334e+01 3101 2452 -2.1333333333312499e+01 3101 2451 5.3333333333124999e+00 3102 3102 6.4029166666666654e+01 3102 2441 1.4465734552327348e-19 3102 3109 2.1329166666666662e+01 3102 2399 -5.3312499999999998e+00 3102 3097 -1.5997916666666665e+01 3102 2387 1.0416666666666664e-02 3102 2385 -5.3312499999999998e+00 3102 2384 1.0667708333333334e+01 3102 2456 -1.4465734552327348e-19 3102 3094 -2.1329166666666662e+01 3102 3093 1.5997916666666667e+01 3102 2443 -2.1329166666666662e+01 3102 2444 2.1334374999999998e+01 3103 3103 6.4029166666666669e+01 3103 2399 -5.3312499999999998e+00 3103 2491 -1.2659172094511536e-19 3103 3108 2.1329166666666662e+01 3103 3097 -1.5997916666666667e+01 3103 2481 1.4465734552327348e-19 3103 2483 -2.1329166666666662e+01 3103 2485 2.1334374999999998e+01 3103 2386 1.0416666666666664e-02 3103 3092 -2.1329166666666662e+01 3103 2385 -5.3312499999999998e+00 3103 3093 1.5997916666666665e+01 3103 2384 1.0667708333333334e+01 3104 3104 4.2666666666916662e+01 3104 2484 5.3333333333229165e+00 3104 3098 -2.1333333333312499e+01 3104 3474 1.0666666666666666e+01 3104 2459 5.3333333333229165e+00 3104 2444 -6.2500000000000004e-11 3104 2452 5.3333333333229165e+00 3104 2453 -1.0666666666687499e+01 3104 2485 -6.2500000000000004e-11 3104 3101 -2.1333333333312499e+01 3104 3698 1.0666666666666666e+01 3104 2493 5.3333333333229165e+00 3104 2492 -1.0666666666687499e+01 3105 3105 6.4029166666666669e+01 3105 2385 5.3312499999999998e+00 3105 2489 -1.4465734552327348e-19 3105 2386 -1.0416666666666664e-02 3105 3106 -2.1329166666666662e+01 3105 2389 5.3312499999999998e+00 3105 3401 -1.5997916666666665e+01 3105 2402 -1.0667708333333334e+01 3105 2481 1.4465734552327348e-19 3105 3092 2.1329166666666662e+01 3105 3091 -1.5997916666666667e+01 3105 2483 2.1329166666666662e+01 3105 2482 -2.1334374999999998e+01 3106 3106 6.4029166666666669e+01 3106 2482 5.3312499999999998e+00 3106 2402 -1.4465734552327348e-19 3106 3105 -2.1329166666666662e+01 3106 3401 1.5997916666666667e+01 3106 2401 1.4465734552327348e-19 3106 2386 2.1329166666666662e+01 3106 2389 -2.1334374999999998e+01 3106 2483 -1.0416666666666664e-02 3106 3107 -2.1329166666666662e+01 3106 3402 1.5997916666666665e+01 3106 2490 5.3312499999999998e+00 3106 2489 -1.0667708333333334e+01 3107 3107 6.4029166666666654e+01 3107 2491 -1.2659172094511536e-19 3107 3108 -2.1329166666666662e+01 3107 2399 5.3312499999999998e+00 3107 3458 -1.5997916666666665e+01 3107 2386 -1.0416666666666664e-02 3107 2389 5.3312499999999998e+00 3107 2401 -1.0667708333333334e+01 3107 2489 1.4465734552327348e-19 3107 3106 -2.1329166666666662e+01 3107 3402 -1.5997916666666667e+01 3107 2483 2.1329166666666662e+01 3107 2490 -2.1334374999999998e+01 3108 3108 6.4029166666666669e+01 3108 2490 5.3312499999999998e+00 3108 2401 -1.4465734552327348e-19 3108 3107 -2.1329166666666662e+01 3108 3458 1.5997916666666667e+01 3108 2384 9.9486666632977745e-20 3108 2386 2.1329166666666662e+01 3108 2399 -2.1334374999999998e+01 3108 2483 -1.0416666666666664e-02 3108 3103 2.1329166666666662e+01 3108 3097 -1.5997916666666665e+01 3108 2485 5.3312499999999998e+00 3108 2491 -1.0667708333333334e+01 3109 3109 6.4029166666666669e+01 3109 2444 5.3312499999999998e+00 3109 2384 -1.4465734552327348e-19 3109 3102 2.1329166666666662e+01 3109 3097 -1.5997916666666667e+01 3109 2400 1.4465734552327348e-19 3109 2387 2.1329166666666662e+01 3109 2399 -2.1334374999999998e+01 3109 2443 -1.0416666666666664e-02 3109 3068 2.1329166666666662e+01 3109 3067 -1.5997916666666665e+01 3109 2442 5.3312499999999998e+00 3109 2441 -1.0667708333333334e+01 3110 3110 6.4029166666666669e+01 3110 2393 5.3312499999999998e+00 3110 2458 9.9486666632977745e-20 3110 3111 -2.1329166666666662e+01 3110 3114 1.5997916666666667e+01 3110 2456 -1.4465734552327348e-19 3110 2443 2.1329166666666662e+01 3110 2457 -2.1334374999999998e+01 3110 2387 -1.0416666666666664e-02 3110 3094 2.1329166666666662e+01 3110 2385 5.3312499999999998e+00 3110 3090 -1.5997916666666665e+01 3110 2388 -1.0667708333333334e+01 3111 3111 6.4029166666666669e+01 3111 2442 5.3312499999999998e+00 3111 2400 -1.4465734552327348e-19 3111 3068 2.1329166666666662e+01 3111 3069 -1.5997916666666667e+01 3111 2388 1.2659172094511536e-19 3111 2387 2.1329166666666662e+01 3111 2393 -2.1334374999999998e+01 3111 2443 -1.0416666666666664e-02 3111 3110 -2.1329166666666662e+01 3111 3114 -1.5997916666666665e+01 3111 2457 5.3312499999999998e+00 3111 2458 -1.0667708333333334e+01 3112 3112 4.2691666666666663e+01 3112 2461 5.3322916666666664e+00 3112 2348 5.3322916666666664e+00 3112 2457 -6.2500000000000003e-03 3112 3116 2.1331249999999997e+01 3112 3635 1.0666666666666666e+01 3112 2464 5.3322916666666664e+00 3112 2446 -1.0668750000000001e+01 3112 2337 -6.2500000000000003e-03 3112 3113 -2.1331249999999997e+01 3112 3491 -1.0666666666666666e+01 3112 2343 5.3322916666666664e+00 3112 2340 -1.0668750000000001e+01 3113 3113 7.4712500000000006e+01 3113 2446 5.3312499999999998e+00 3113 2344 5.3322916666666664e+00 3113 3263 -1.0658333333333331e+01 3113 3115 -2.1329166666666666e+01 3113 2457 1.0653124999999999e+01 3113 2460 5.3281250000000000e+00 3113 2461 -2.1333333333333336e+01 3113 3112 -2.1331249999999997e+01 3113 3491 1.0658333333333333e+01 3113 2337 2.1326041666666665e+01 3113 2343 -3.1999999999999996e+01 3113 2340 5.3312499999999998e+00 3114 3114 7.4712500000000020e+01 3114 2460 5.3281250000000000e+00 3114 3115 -2.1329166666666666e+01 3114 3269 -1.0658333333333331e+01 3114 2344 5.3322916666666664e+00 3114 2387 -5.3312499999999998e+00 3114 2335 5.3312499999999998e+00 3114 2337 1.3327083333333333e+01 3114 2338 -2.4001041666666666e+01 3114 3054 -1.5997916666666667e+01 3114 2383 -5.3312499999999998e+00 3114 2393 5.3395833333333327e+00 3114 3053 1.5997916666666665e+01 3114 2388 5.3333333333333330e+00 3114 3110 1.5997916666666667e+01 3114 3111 -1.5997916666666665e+01 3114 2443 5.3312499999999998e+00 3114 2457 2.6541666666666668e+00 3114 2458 -1.3334375000000000e+01 3115 3115 4.2699999999999996e+01 3115 2343 1.0662500000000000e+01 3115 2461 -2.1705219273391446e-19 3115 3113 -2.1329166666666666e+01 3115 3263 1.0666666666666664e+01 3115 2458 2.1705219273391446e-19 3115 2457 1.0662500000000000e+01 3115 2460 -1.0672916666666666e+01 3115 3114 -2.1329166666666666e+01 3115 3269 1.0666666666666668e+01 3115 2337 -1.0683333333333334e+01 3115 2338 1.0662500000000000e+01 3115 2344 -1.0672916666666666e+01 3116 3116 6.4020833333541674e+01 3116 2457 -1.0662499999958333e+01 3116 2464 2.1332291666656246e+01 3116 2451 -5.3333333333124999e+00 3116 3117 -2.1333333333312499e+01 3116 2337 -1.0662499999958333e+01 3116 2348 2.1332291666656246e+01 3116 2349 -5.3333333333124999e+00 3116 2340 -5.3312499999999998e+00 3116 3112 2.1331249999999997e+01 3116 3635 1.0658333333333333e+01 3116 2446 -5.3312499999999998e+00 3116 4763 1.0666666666583334e+01 3117 3117 4.2666666666916662e+01 3117 2457 6.2499999999999991e-11 3117 2464 -5.3333333333229165e+00 3117 2451 1.0666666666687499e+01 3117 2337 6.2500000000000004e-11 3117 3116 -2.1333333333312499e+01 3117 2348 -5.3333333333229165e+00 3117 2349 1.0666666666687499e+01 3117 2336 -5.3333333333229165e+00 3117 3090 -2.1333333333312499e+01 3117 3095 -1.0666666666666666e+01 3117 2456 -5.3333333333229165e+00 3117 4763 -1.0666666666666666e+01 3118 3118 3.2020833333333336e+01 3119 3119 6.4029166666666669e+01 3119 2532 1.2659172094511536e-19 3119 3140 2.1329166666666662e+01 3119 2526 -1.4465734552327348e-19 3119 2527 -2.1329166666666662e+01 3119 2523 2.1334374999999998e+01 3119 2497 1.0416666666666664e-02 3119 3137 -2.1329166666666662e+01 3120 3120 3.2020833333333336e+01 3121 3121 6.4029166666666654e+01 3121 2547 -1.4465734552327348e-19 3121 2522 1.2659172094511536e-19 3121 2524 -2.1329166666666662e+01 3121 2523 2.1334374999999998e+01 3121 3127 -2.1329166666666662e+01 3121 2510 1.0416666666666664e-02 3121 3129 2.1329166666666662e+01 3122 3122 3.2020833333333336e+01 3123 3123 6.4029166666666669e+01 3123 2526 9.9486666632977745e-20 3123 3135 2.1329166666666662e+01 3123 2522 -1.4465734552327348e-19 3123 2525 -2.1329166666666662e+01 3123 2523 2.1334374999999998e+01 3123 2517 1.0416666666666664e-02 3123 3126 -2.1329166666666662e+01 3124 3124 3.2020833333333336e+01 3125 3125 6.4029166666666669e+01 3125 2547 9.9486666632977745e-20 3125 3164 2.1329166666666662e+01 3125 2532 -1.4465734552327348e-19 3125 2531 -2.1329166666666662e+01 3125 2523 2.1334374999999998e+01 3125 2550 1.0416666666666664e-02 3125 3165 2.1329166666666662e+01 3126 3126 6.4029166666666654e+01 3126 2515 1.4465734552327348e-19 3126 3133 2.1329166666666662e+01 3126 2543 -5.3312499999999998e+00 3126 3128 1.5997916666666665e+01 3126 2525 1.0416666666666664e-02 3126 2523 -5.3312499999999998e+00 3126 2522 1.0667708333333334e+01 3126 3123 -2.1329166666666662e+01 3126 2517 -2.1329166666666662e+01 3127 3127 6.4029166666666669e+01 3127 2543 -5.3312499999999998e+00 3127 2512 -9.9486666632977745e-20 3127 3130 2.1329166666666662e+01 3127 3128 1.5997916666666667e+01 3127 2510 -2.1329166666666662e+01 3127 2524 1.0416666666666664e-02 3127 3121 -2.1329166666666662e+01 3127 2523 -5.3312499999999998e+00 3127 2522 1.0667708333333334e+01 3128 3128 6.4041666666666671e+01 3128 2512 5.3333333333333330e+00 3128 2515 5.3333333333333330e+00 3128 2524 5.3312499999999998e+00 3128 2517 -5.3312499999999998e+00 3128 3133 1.5997916666666667e+01 3128 2525 5.3312499999999998e+00 3128 2543 -5.3395833333333327e+00 3128 3126 1.5997916666666665e+01 3128 2522 -5.3333333333333330e+00 3128 3127 1.5997916666666667e+01 3128 3130 1.5997916666666665e+01 3128 2510 -5.3312499999999998e+00 3128 253 5.3312499999999998e+00 3128 280 -5.3312499999999998e+00 3128 987 -1.5997916666666667e+01 3128 273 5.3312499999999998e+00 3128 270 -5.3395833333333327e+00 3128 992 -1.5997916666666665e+01 3128 275 -5.3333333333333330e+00 3128 668 -1.5997916666666667e+01 3128 667 1.5997916666666665e+01 3128 246 -5.3312499999999998e+00 3129 3129 6.4029166666666669e+01 3129 2523 5.3312499999999998e+00 3129 2514 -1.4465734552327348e-19 3129 2524 -1.0416666666666664e-02 3129 3132 -2.1329166666666662e+01 3129 2546 5.3312499999999998e+00 3129 3484 -1.5997916666666665e+01 3129 2547 -1.0667708333333334e+01 3129 3121 2.1329166666666662e+01 3129 2510 2.1329166666666662e+01 3130 3130 6.4029166666666669e+01 3130 2513 5.3312499999999998e+00 3130 2545 -1.4465734552327348e-19 3130 3131 -2.1329166666666662e+01 3130 3482 1.5997916666666667e+01 3130 2522 1.2659172094511536e-19 3130 2524 2.1329166666666662e+01 3130 2543 -2.1334374999999998e+01 3130 2510 -1.0416666666666664e-02 3130 3127 2.1329166666666662e+01 3130 3128 1.5997916666666665e+01 3130 2512 -1.0667708333333334e+01 3131 3131 6.4029166666666669e+01 3131 2546 5.3312499999999998e+00 3131 2514 1.4465734552327348e-19 3131 3132 -2.1329166666666662e+01 3131 3483 -1.5997916666666667e+01 3131 2512 -9.9486666632977745e-20 3131 2510 2.1329166666666662e+01 3131 2513 -2.1334374999999998e+01 3131 2524 -1.0416666666666664e-02 3131 3130 -2.1329166666666662e+01 3131 2543 5.3312499999999998e+00 3131 3482 -1.5997916666666665e+01 3131 2545 -1.0667708333333334e+01 3132 3132 6.4029166666666669e+01 3132 2547 -1.4465734552327348e-19 3132 3129 -2.1329166666666662e+01 3132 3484 1.5997916666666667e+01 3132 2545 1.4465734552327348e-19 3132 2524 2.1329166666666662e+01 3132 2546 -2.1334374999999998e+01 3132 2510 -1.0416666666666664e-02 3132 3131 -2.1329166666666662e+01 3132 3483 1.5997916666666665e+01 3132 2513 5.3312499999999998e+00 3132 2514 -1.0667708333333334e+01 3133 3133 6.4029166666666669e+01 3133 2522 -1.4465734552327348e-19 3133 3126 2.1329166666666662e+01 3133 3128 1.5997916666666667e+01 3133 2544 1.4465734552327348e-19 3133 2525 2.1329166666666662e+01 3133 2543 -2.1334374999999998e+01 3133 2517 -1.0416666666666664e-02 3133 3134 -2.1329166666666662e+01 3133 3481 1.5997916666666665e+01 3133 2515 -1.0667708333333334e+01 3134 3134 6.4029166666666654e+01 3134 3136 -2.1329166666666662e+01 3134 2540 5.3312499999999998e+00 3134 2525 -1.0416666666666664e-02 3134 2543 5.3312499999999998e+00 3134 2544 -1.0667708333333334e+01 3134 2515 1.4465734552327348e-19 3134 3133 -2.1329166666666662e+01 3134 3481 -1.5997916666666667e+01 3134 2517 2.1329166666666662e+01 3135 3135 6.4029166666666669e+01 3135 2540 5.3312499999999998e+00 3135 3136 -2.1329166666666662e+01 3135 2517 2.1329166666666662e+01 3135 2525 -1.0416666666666664e-02 3135 3123 2.1329166666666662e+01 3135 2523 5.3312499999999998e+00 3135 2526 -1.0667708333333334e+01 3136 3136 6.4029166666666669e+01 3136 2544 -1.4465734552327348e-19 3136 3134 -2.1329166666666662e+01 3136 2526 9.9486666632977745e-20 3136 2525 2.1329166666666662e+01 3136 2540 -2.1334374999999998e+01 3136 2517 -1.0416666666666664e-02 3136 3135 -2.1329166666666662e+01 3137 3137 6.4029166666666654e+01 3137 3141 2.1329166666666662e+01 3137 2540 -5.3312499999999998e+00 3137 2527 1.0416666666666664e-02 3137 2523 -5.3312499999999998e+00 3137 2526 1.0667708333333334e+01 3137 3119 -2.1329166666666662e+01 3137 2497 -2.1329166666666662e+01 3138 3138 3.2020833333333336e+01 3139 3139 6.4029166666666669e+01 3139 2538 -1.4465734552327348e-19 3139 3142 -2.1329166666666662e+01 3139 3147 1.5997916666666667e+01 3139 2532 1.2659172094511536e-19 3139 2527 2.1329166666666662e+01 3139 2529 -2.1334374999999998e+01 3139 2497 -1.0416666666666664e-02 3139 3140 -2.1329166666666662e+01 3139 3143 1.5997916666666665e+01 3139 2498 -1.0667708333333334e+01 3140 3140 6.4029166666666654e+01 3140 3119 2.1329166666666662e+01 3140 2523 5.3312499999999998e+00 3140 2527 -1.0416666666666664e-02 3140 2529 5.3312499999999998e+00 3140 2532 -1.0667708333333334e+01 3140 2498 9.9486666632977745e-20 3140 3139 -2.1329166666666662e+01 3140 3143 -1.5997916666666667e+01 3140 2497 2.1329166666666662e+01 3141 3141 6.4029166666666669e+01 3141 2526 -1.4465734552327348e-19 3141 3137 2.1329166666666662e+01 3141 2538 1.4465734552327348e-19 3141 2527 2.1329166666666662e+01 3141 2540 -2.1334374999999998e+01 3141 2497 -1.0416666666666664e-02 3141 3142 -2.1329166666666662e+01 3142 3142 6.4029166666666669e+01 3142 2540 5.3312499999999998e+00 3142 2498 -9.9486666632977745e-20 3142 2527 -1.0416666666666664e-02 3142 3139 -2.1329166666666662e+01 3142 2529 5.3312499999999998e+00 3142 3147 -1.5997916666666665e+01 3142 2538 -1.0667708333333334e+01 3142 3141 -2.1329166666666662e+01 3142 2497 2.1329166666666662e+01 3143 3143 7.4712500000000006e+01 3143 2506 -5.3322916666666664e+00 3143 3152 -1.0658333333333331e+01 3143 3166 2.1329166666666666e+01 3143 2551 -5.3281250000000000e+00 3143 2527 5.3312499999999998e+00 3143 2550 -5.3312499999999998e+00 3143 2554 1.3334375000000000e+01 3143 3150 -1.5997916666666667e+01 3143 2531 5.3312499999999998e+00 3143 2529 -5.3395833333333327e+00 3143 3165 -1.5997916666666665e+01 3143 2532 -5.3333333333333330e+00 3143 3140 -1.5997916666666667e+01 3143 3139 1.5997916666666665e+01 3143 2497 -5.3312499999999998e+00 3143 2498 2.4001041666666666e+01 3144 3144 5.3374999999999993e+01 3144 2438 2.1705219273391446e-19 3144 2875 -2.1705219273391446e-19 3144 3431 1.0656249999999998e+01 3144 3146 -1.0666666666666666e+01 3144 2530 5.3312499999999998e+00 3144 2872 -5.3312499999999998e+00 3144 2871 -2.6583333333333332e+00 3144 2880 8.0000000000000000e+00 3144 3151 -1.5997916666666667e+01 3144 2537 5.3312499999999998e+00 3144 2529 -5.3395833333333327e+00 3144 3427 1.5997916666666665e+01 3144 2536 -5.3333333333333330e+00 3144 3159 -1.5997916666666667e+01 3144 3145 -1.5997916666666665e+01 3144 2419 -5.3312499999999998e+00 3144 2418 -2.6583333333333332e+00 3144 2417 8.0000000000000000e+00 3145 3145 6.4029166666666654e+01 3145 2536 -1.2659172094511536e-19 3145 2432 -5.3312499999999998e+00 3145 2528 1.4465734552327348e-19 3145 2530 -2.1329166666666662e+01 3145 2529 2.1334374999999998e+01 3145 3156 -2.1329166666666662e+01 3145 3149 -1.5997916666666667e+01 3145 2419 1.0416666666666664e-02 3145 3159 2.1329166666666662e+01 3145 3144 -1.5997916666666665e+01 3145 2418 -5.3312499999999998e+00 3145 2417 1.0667708333333334e+01 3146 3146 5.3375000000000007e+01 3146 2440 2.1684043449710089e-19 3146 2418 2.1684043449710089e-19 3146 2417 5.3322916666666664e+00 3146 2438 -5.3322916666666664e+00 3146 2871 4.9904357809065860e-20 3146 2880 5.3322916666666664e+00 3146 2875 6.2499999999999995e-03 3146 3144 -1.0666666666666666e+01 3146 3431 -1.0666666666666666e+01 3146 3148 -3.2002083333333331e+01 3146 3227 -2.1329166666666666e+01 3146 2500 1.0662500000000000e+01 3146 2505 -5.3343749999999996e+00 3146 3147 -1.0658333333333331e+01 3146 3456 -1.0666666666666668e+01 3146 2498 -1.0679166666666665e+01 3147 3147 7.4712500000000006e+01 3147 2875 -5.3281250000000000e+00 3147 2537 5.3312499999999998e+00 3147 2497 -5.3312499999999998e+00 3147 3139 1.5997916666666667e+01 3147 2527 5.3312499999999998e+00 3147 2529 -5.3395833333333327e+00 3147 3142 -1.5997916666666665e+01 3147 2538 -5.3333333333333330e+00 3147 3452 -1.5997916666666667e+01 3147 3151 -1.5997916666666665e+01 3147 2872 -5.3312499999999998e+00 3147 2880 1.3334375000000000e+01 3147 3456 2.1329166666666666e+01 3147 3146 -1.0658333333333331e+01 3147 2498 2.4001041666666666e+01 3147 2505 -5.3322916666666664e+00 3148 3148 8.5383333333333340e+01 3148 2506 5.3322916666666664e+00 3148 3152 -3.2002083333333331e+01 3148 3230 2.1320833333333333e+01 3148 2430 5.3281250000000000e+00 3148 2417 -1.4583333333333330e-02 3148 2440 -1.0662500000000000e+01 3148 2438 5.3281250000000000e+00 3148 3146 -3.2002083333333331e+01 3148 3227 2.1320833333333333e+01 3148 2498 2.1331249999999997e+01 3148 2500 -3.1995833333333334e+01 3148 2505 5.3322916666666664e+00 3149 3149 5.3374999999999993e+01 3149 2551 2.1705219273391446e-19 3149 2430 -2.1705219273391446e-19 3149 3153 1.0656249999999998e+01 3149 3152 -1.0666666666666666e+01 3149 2531 5.3312499999999998e+00 3149 2419 -5.3312499999999998e+00 3149 2432 -2.6583333333333332e+00 3149 2417 8.0000000000000000e+00 3149 3145 -1.5997916666666667e+01 3149 2530 5.3312499999999998e+00 3149 2529 -5.3395833333333327e+00 3149 3156 1.5997916666666665e+01 3149 2528 -5.3333333333333330e+00 3149 3155 1.5997916666666667e+01 3149 3150 -1.5997916666666665e+01 3149 2550 -5.3312499999999998e+00 3149 2553 -2.6583333333333332e+00 3149 2554 8.0000000000000000e+00 3150 3150 6.4029166666666669e+01 3150 2532 1.4465734552327348e-19 3150 3165 2.1329166666666662e+01 3150 3143 -1.5997916666666667e+01 3150 2528 -1.4465734552327348e-19 3150 2531 -2.1329166666666662e+01 3150 2529 2.1334374999999998e+01 3150 2550 1.0416666666666664e-02 3150 3155 -2.1329166666666662e+01 3150 3149 -1.5997916666666665e+01 3150 2553 -5.3312499999999998e+00 3150 2554 1.0667708333333334e+01 3151 3151 6.4029166666666669e+01 3151 2871 -5.3312499999999998e+00 3151 2536 1.4465734552327348e-19 3151 3427 -2.1329166666666662e+01 3151 3144 -1.5997916666666667e+01 3151 2538 -1.4465734552327348e-19 3151 2537 -2.1329166666666662e+01 3151 2529 2.1334374999999998e+01 3151 2872 1.0416666666666664e-02 3151 3452 2.1329166666666662e+01 3151 3147 -1.5997916666666665e+01 3151 2880 1.0667708333333334e+01 3152 3152 5.3375000000000000e+01 3152 2500 1.0662500000000000e+01 3152 2440 -2.1158177161623045e-20 3152 3148 -3.2002083333333331e+01 3152 3230 -2.1329166666666669e+01 3152 2553 2.1684043449710089e-19 3152 2506 -5.3343749999999996e+00 3152 2498 -1.0679166666666665e+01 3152 3143 -1.0658333333333331e+01 3152 2551 6.2499999999999995e-03 3152 3166 -1.0666666666666664e+01 3152 2554 5.3322916666666664e+00 3152 2432 4.9904357809065860e-20 3152 2417 5.3322916666666664e+00 3152 2430 -5.3322916666666664e+00 3152 3149 -1.0666666666666666e+01 3152 3153 -1.0666666666666666e+01 3153 3153 5.3375000000000000e+01 3153 2439 5.3312499999999998e+00 3153 2554 -5.0116116045879435e-20 3153 2417 2.1705219273391446e-19 3153 3149 1.0656249999999998e+01 3153 3152 -1.0666666666666666e+01 3153 2432 1.0657291666666666e+01 3153 2430 -1.5998958333333333e+01 3153 3154 -2.1331249999999997e+01 3153 3501 1.0658333333333333e+01 3153 2553 1.0657291666666666e+01 3153 2552 5.3312499999999998e+00 3153 2551 -1.5998958333333331e+01 3154 3154 4.2691666666666663e+01 3154 2430 5.3322916666666664e+00 3154 2432 -6.2499999999999995e-03 3154 2429 5.3322916666666664e+00 3154 2439 -1.0668750000000001e+01 3154 3158 2.1331249999999997e+01 3154 3509 1.0666666666666666e+01 3154 2561 5.3322916666666664e+00 3154 2553 -6.2499999999999995e-03 3154 3153 -2.1331249999999997e+01 3154 3501 -1.0666666666666666e+01 3154 2552 -1.0668750000000001e+01 3154 2551 5.3322916666666664e+00 3155 3155 6.4029166666666654e+01 3155 2548 1.2659172094511536e-19 3155 3163 2.1329166666666662e+01 3155 2546 -5.3312499999999998e+00 3155 3157 1.5997916666666665e+01 3155 2531 1.0416666666666664e-02 3155 2529 -5.3312499999999998e+00 3155 2528 1.0667708333333334e+01 3155 2554 -1.4465734552327348e-19 3155 3150 -2.1329166666666662e+01 3155 3149 1.5997916666666667e+01 3155 2550 -2.1329166666666662e+01 3155 2553 2.1334374999999998e+01 3156 3156 6.4029166666666669e+01 3156 2546 -5.3312499999999998e+00 3156 2437 -1.4465734552327348e-19 3156 3162 2.1329166666666662e+01 3156 3157 1.5997916666666667e+01 3156 2417 9.9486666632977745e-20 3156 2419 -2.1329166666666662e+01 3156 2432 2.1334374999999998e+01 3156 2530 1.0416666666666664e-02 3156 3145 -2.1329166666666662e+01 3156 2529 -5.3312499999999998e+00 3156 3149 1.5997916666666665e+01 3156 2528 1.0667708333333334e+01 3157 3157 6.4041666666666671e+01 3157 2432 5.3395833333333327e+00 3157 2437 5.3333333333333330e+00 3157 2553 5.3395833333333327e+00 3157 2548 5.3333333333333330e+00 3157 2530 5.3312499999999998e+00 3157 2550 -5.3312499999999998e+00 3157 3163 1.5997916666666667e+01 3157 2531 5.3312499999999998e+00 3157 2546 -5.3395833333333327e+00 3157 3155 1.5997916666666665e+01 3157 2528 -5.3333333333333330e+00 3157 3156 1.5997916666666667e+01 3157 3162 1.5997916666666665e+01 3157 2419 -5.3312499999999998e+00 3157 210 5.3312499999999998e+00 3157 489 -5.3312499999999998e+00 3157 1006 -1.5997916666666667e+01 3157 217 5.3312499999999998e+00 3157 212 -5.3395833333333327e+00 3157 1009 -1.5997916666666665e+01 3157 219 -5.3333333333333330e+00 3157 1003 -1.5997916666666667e+01 3157 1002 1.5997916666666665e+01 3157 487 -5.3312499999999998e+00 3158 3158 6.4041666666666671e+01 3158 2553 -2.6593750000000003e+00 3158 2561 1.3332291666666665e+01 3158 2432 -2.6593750000000003e+00 3158 2429 1.3332291666666665e+01 3158 2439 -5.3312499999999998e+00 3158 3154 2.1331249999999997e+01 3158 3509 1.0658333333333333e+01 3158 2552 -5.3312499999999998e+00 3158 217 5.3312499999999998e+00 3158 487 -5.3312499999999998e+00 3158 1005 1.5997916666666667e+01 3158 210 5.3312499999999998e+00 3158 216 -5.3395833333333327e+00 3158 1003 -1.5997916666666665e+01 3158 219 -5.3333333333333330e+00 3158 1009 -1.5997916666666667e+01 3158 1007 -1.5997916666666665e+01 3158 489 -5.3312499999999998e+00 3159 3159 6.4029166666666669e+01 3159 2529 5.3312499999999998e+00 3159 2434 -1.4465734552327348e-19 3159 2530 -1.0416666666666664e-02 3159 3160 -2.1329166666666662e+01 3159 2534 5.3312499999999998e+00 3159 3426 1.5997916666666665e+01 3159 2536 -1.0667708333333334e+01 3159 2417 9.9486666632977745e-20 3159 3145 2.1329166666666662e+01 3159 3144 -1.5997916666666667e+01 3159 2419 2.1329166666666662e+01 3159 2418 -2.1334374999999998e+01 3160 3160 6.4029166666666669e+01 3160 2418 5.3312499999999998e+00 3160 2536 -1.2659172094511536e-19 3160 3159 -2.1329166666666662e+01 3160 3426 -1.5997916666666667e+01 3160 2533 1.4465734552327348e-19 3160 2530 2.1329166666666662e+01 3160 2534 -2.1334374999999998e+01 3160 2419 -1.0416666666666664e-02 3160 3161 -2.1329166666666662e+01 3160 3441 1.5997916666666665e+01 3160 2435 5.3312499999999998e+00 3160 2434 -1.0667708333333334e+01 3161 3161 6.4029166666666654e+01 3161 2437 -1.4465734552327348e-19 3161 3162 -2.1329166666666662e+01 3161 2546 5.3312499999999998e+00 3161 3447 -1.5997916666666665e+01 3161 2530 -1.0416666666666664e-02 3161 2534 5.3312499999999998e+00 3161 2533 -1.0667708333333334e+01 3161 2434 1.4465734552327348e-19 3161 3160 -2.1329166666666662e+01 3161 3441 -1.5997916666666667e+01 3161 2419 2.1329166666666662e+01 3161 2435 -2.1334374999999998e+01 3162 3162 6.4029166666666669e+01 3162 2435 5.3312499999999998e+00 3162 2533 -1.4465734552327348e-19 3162 3161 -2.1329166666666662e+01 3162 3447 1.5997916666666667e+01 3162 2528 1.4465734552327348e-19 3162 2530 2.1329166666666662e+01 3162 2546 -2.1334374999999998e+01 3162 2419 -1.0416666666666664e-02 3162 3156 2.1329166666666662e+01 3162 3157 1.5997916666666665e+01 3162 2432 5.3312499999999998e+00 3162 2437 -1.0667708333333334e+01 3163 3163 6.4029166666666669e+01 3163 2553 5.3312499999999998e+00 3163 2528 -1.4465734552327348e-19 3163 3155 2.1329166666666662e+01 3163 3157 1.5997916666666667e+01 3163 2547 9.9486666632977745e-20 3163 2531 2.1329166666666662e+01 3163 2546 -2.1334374999999998e+01 3163 2550 -1.0416666666666664e-02 3163 3164 -2.1329166666666662e+01 3163 3484 1.5997916666666665e+01 3163 2548 -1.0667708333333334e+01 3164 3164 6.4029166666666654e+01 3164 3125 2.1329166666666662e+01 3164 2523 5.3312499999999998e+00 3164 2531 -1.0416666666666664e-02 3164 2546 5.3312499999999998e+00 3164 2547 -1.0667708333333334e+01 3164 2548 1.2659172094511536e-19 3164 3163 -2.1329166666666662e+01 3164 3484 -1.5997916666666667e+01 3164 2550 2.1329166666666662e+01 3165 3165 6.4029166666666669e+01 3165 2523 5.3312499999999998e+00 3165 3125 2.1329166666666662e+01 3165 2554 -1.4465734552327348e-19 3165 2550 2.1329166666666662e+01 3165 2531 -1.0416666666666664e-02 3165 3150 2.1329166666666662e+01 3165 2529 5.3312499999999998e+00 3165 3143 -1.5997916666666665e+01 3165 2532 -1.0667708333333334e+01 3166 3166 4.2699999999999996e+01 3166 2498 1.0662500000000000e+01 3166 2554 2.1705219273391446e-19 3166 3143 2.1329166666666666e+01 3166 3152 -1.0666666666666664e+01 3166 2551 -1.0672916666666666e+01 3166 3500 1.0666666666666668e+01 3166 2506 -1.0672916666666666e+01 3167 3167 4.2691666666666663e+01 3168 3168 5.3375000000000000e+01 3168 2571 -2.7052114752934217e-20 3168 3192 3.2002083333333331e+01 3168 3176 -2.1329166666666666e+01 3168 2611 -1.0662500000000000e+01 3168 2622 4.9904357809065860e-20 3168 2616 5.3343749999999996e+00 3168 2609 1.0679166666666665e+01 3168 2624 -6.2499999999999986e-03 3168 3188 -1.0658333333333331e+01 3168 3179 -1.0666666666666664e+01 3168 2627 -5.3322916666666664e+00 3168 2564 3.2249014814734037e-20 3168 2563 -5.3322916666666664e+00 3168 2562 5.3322916666666664e+00 3168 3190 1.0666666666666666e+01 3168 3169 -1.0666666666666666e+01 3169 3169 4.2708333333333329e+01 3169 2568 5.0116116045879435e-20 3169 2628 2.1705219273391446e-19 3169 3198 1.0656249999999998e+01 3169 3171 -1.0666666666666666e+01 3169 2627 -2.1705219273391446e-19 3169 2622 -1.0656249999999998e+01 3169 2624 1.0666666666666666e+01 3169 2563 -2.1705219273391446e-19 3169 3190 -1.0656249999999998e+01 3169 3168 -1.0666666666666666e+01 3169 2564 -1.0656249999999998e+01 3169 2562 1.0666666666666666e+01 3170 3170 8.5416666666666671e+01 3170 2576 5.3322916666666664e+00 3170 3174 -3.2002083333333331e+01 3170 3485 -2.1320833333333333e+01 3170 2592 5.3281250000000000e+00 3170 2343 -5.3302083333333332e+00 3170 2589 -1.4583333333333332e-02 3170 2599 -1.0662500000000000e+01 3170 2347 -2.0833333333333342e-03 3170 3172 -2.1329166666666666e+01 3170 3489 2.1320833333333333e+01 3170 2345 1.0683333333333334e+01 3170 2562 1.0658333333333331e+01 3170 3171 -2.1329166666666669e+01 3170 3487 2.1320833333333333e+01 3170 2568 5.3281250000000000e+00 3170 2570 -2.1329166666666666e+01 3171 3171 5.3375000000000014e+01 3171 2564 -2.1684043449710089e-19 3171 2622 2.1684043449710089e-19 3171 2624 -6.2499999999999986e-03 3171 2628 -5.3322916666666664e+00 3171 3169 -1.0666666666666666e+01 3171 3198 -1.0666666666666666e+01 3171 3492 1.0658333333333331e+01 3171 3180 -1.0666666666666668e+01 3171 2343 1.0679166666666665e+01 3171 2347 5.3343749999999996e+00 3171 2345 -1.0662500000000000e+01 3171 2570 -2.0761130467597592e-20 3171 3487 -3.2002083333333331e+01 3171 3170 -2.1329166666666669e+01 3171 2568 -5.3322916666666664e+00 3171 2562 5.3322916666666664e+00 3172 3172 5.3375000000000007e+01 3172 2624 -6.2499999999999986e-03 3172 3180 -1.0666666666666664e+01 3172 2599 2.7157993871341005e-20 3172 3489 -3.2002083333333331e+01 3172 3170 -2.1329166666666666e+01 3172 2347 5.3343749999999996e+00 3172 2345 -1.0662500000000000e+01 3172 2589 5.3322916666666664e+00 3172 3173 -1.0666666666666666e+01 3173 3173 4.2708333333333329e+01 3173 2624 1.0666666666666666e+01 3173 3178 -1.0666666666666666e+01 3173 3172 -1.0666666666666666e+01 3173 2589 1.0666666666666666e+01 3174 3174 5.3375000000000007e+01 3174 2677 2.1684043449710089e-19 3174 2572 5.3302083333333332e+00 3174 3177 -1.0658333333333331e+01 3174 2693 6.2499999999999995e-03 3174 3274 -1.0666666666666664e+01 3174 2680 -5.3281250000000000e+00 3174 2694 5.3322916666666664e+00 3174 2562 -1.0679166666666665e+01 3174 2570 1.0662500000000000e+01 3174 2576 -5.3343749999999996e+00 3174 2599 1.4973071994693204e-20 3174 3170 -3.2002083333333331e+01 3174 3485 2.1329166666666669e+01 3174 2593 4.9904357809065860e-20 3174 2589 5.3322916666666664e+00 3174 2592 -5.3322916666666664e+00 3174 3175 -1.0666666666666666e+01 3174 3244 -1.0666666666666666e+01 3175 3175 5.3375000000000000e+01 3175 2605 -5.3312499999999998e+00 3175 3247 2.1331249999999997e+01 3175 3176 -1.0658333333333333e+01 3175 2690 -5.3312499999999998e+00 3175 2693 2.1705219273391446e-19 3175 2677 -1.0657291666666666e+01 3175 2694 1.5998958333333333e+01 3175 2592 -2.1705219273391446e-19 3175 3244 1.0656249999999998e+01 3175 3174 -1.0666666666666666e+01 3175 2593 -1.0657291666666666e+01 3175 2589 1.5998958333333333e+01 3176 3176 6.4091666666666669e+01 3176 2680 1.0416666666666669e-03 3176 2593 1.0416666666666669e-03 3176 2677 1.0416666666666667e-03 3176 2694 -6.2500000000000003e-03 3176 2690 4.1666666666666666e-03 3176 3175 -1.0658333333333333e+01 3176 3247 -1.0666666666666666e+01 3176 2563 5.3281250000000000e+00 3176 2616 -2.0833333333333342e-03 3176 3168 -2.1329166666666666e+01 3176 3192 -2.1320833333333333e+01 3176 2609 -5.3302083333333332e+00 3176 2611 1.0683333333333334e+01 3176 2589 -1.0416666666666666e-02 3176 3178 -2.1329166666666669e+01 3176 3183 -2.1320833333333333e+01 3176 2605 -5.3291666666666666e+00 3176 2572 1.0416666666666667e-03 3176 2562 -1.0416666666666666e-02 3176 2571 -5.3291666666666666e+00 3176 3177 -1.0658333333333333e+01 3176 3270 -1.0666666666666666e+01 3177 3177 7.4712500000000006e+01 3177 2690 -5.3312499999999998e+00 3177 2576 -5.3322916666666664e+00 3177 3174 -1.0658333333333331e+01 3177 3274 2.1329166666666666e+01 3177 2680 -1.0653124999999999e+01 3177 2694 2.1333333333333336e+01 3177 2693 -5.3281250000000000e+00 3177 3270 2.1331249999999997e+01 3177 3176 -1.0658333333333333e+01 3177 2572 -2.1326041666666665e+01 3177 2562 3.1999999999999996e+01 3177 2571 -5.3312499999999998e+00 3178 3178 5.3375000000000000e+01 3178 2611 -1.0662500000000000e+01 3178 2605 -2.0761130467597592e-20 3178 3183 3.2002083333333331e+01 3178 3176 -2.1329166666666669e+01 3178 2589 5.3322916666666664e+00 3178 2624 -6.2499999999999986e-03 3178 3173 -1.0666666666666666e+01 3178 2616 5.3343749999999996e+00 3178 3179 -1.0666666666666668e+01 3179 3179 4.2699999999999996e+01 3179 2609 -1.0662500000000000e+01 3179 2627 1.6284208410963924e-19 3179 3188 2.1329166666666666e+01 3179 3168 -1.0666666666666664e+01 3179 2624 1.0672916666666666e+01 3179 3178 -1.0666666666666668e+01 3179 2616 1.0672916666666666e+01 3180 3180 4.2699999999999996e+01 3180 3172 -1.0666666666666664e+01 3180 2628 -2.1705219273391446e-19 3180 2624 1.0672916666666666e+01 3180 3492 -2.1329166666666666e+01 3180 3171 -1.0666666666666668e+01 3180 2343 -1.0662500000000000e+01 3180 2347 1.0672916666666666e+01 3181 3181 4.2691666666666663e+01 3182 3182 2.1354166666666668e+01 3183 3183 6.4058333333333337e+01 3183 2616 5.3322916666666664e+00 3183 3178 3.2002083333333331e+01 3183 3176 -2.1320833333333333e+01 3183 2589 5.3281250000000000e+00 3183 2611 -1.5995833333333334e+01 3183 2936 4.1666666666666666e-03 3183 3567 1.0666666666666666e+01 3183 2605 -5.3291666666666666e+00 3183 3569 1.0666666666666666e+01 3184 3184 3.2020833333333336e+01 3185 3185 3.2020833333333336e+01 3186 3186 2.1354166666666668e+01 3187 3187 4.2691666666666663e+01 3187 3331 1.0666666666666666e+01 3187 2627 5.3322916666666664e+00 3187 2618 -1.0668750000000001e+01 3187 3188 -2.1331249999999997e+01 3187 3191 -1.0666666666666666e+01 3187 2609 5.3322916666666664e+00 3187 2606 -1.0668750000000001e+01 3188 3188 7.4712500000000006e+01 3188 2618 5.3312499999999998e+00 3188 2616 5.3322916666666664e+00 3188 3168 -1.0658333333333331e+01 3188 3179 2.1329166666666666e+01 3188 2624 5.3281250000000000e+00 3188 2627 -2.1333333333333336e+01 3188 3187 -2.1331249999999997e+01 3188 3191 1.0658333333333333e+01 3188 2609 -3.1999999999999996e+01 3188 2606 5.3312499999999998e+00 3189 3189 3.2020833333333336e+01 3190 3190 5.3375000000000000e+01 3190 2573 -5.3312499999999998e+00 3190 3197 2.1331249999999997e+01 3190 3191 -1.0658333333333333e+01 3190 2618 -5.3312499999999998e+00 3190 2624 -2.1705219273391446e-19 3190 2622 -1.0657291666666666e+01 3190 2627 1.5998958333333333e+01 3190 2562 -2.1705219273391446e-19 3190 3169 -1.0656249999999998e+01 3190 3168 1.0666666666666666e+01 3190 2564 -1.0657291666666666e+01 3190 2563 1.5998958333333333e+01 3191 3191 4.2733333333333334e+01 3191 2796 1.0416666666666669e-03 3191 2806 -6.2500000000000003e-03 3191 2797 4.1666666666666666e-03 3191 3193 -1.0658333333333333e+01 3191 3328 1.0666666666666666e+01 3191 2578 1.0416666666666667e-03 3191 3194 -1.0658333333333333e+01 3191 3330 1.0666666666666666e+01 3191 2564 1.0416666666666669e-03 3191 2563 -6.2500000000000003e-03 3191 2573 4.1666666666666666e-03 3191 2622 1.0416666666666667e-03 3191 2627 -6.2500000000000003e-03 3191 2618 4.1666666666666666e-03 3191 3190 -1.0658333333333333e+01 3191 3197 -1.0666666666666666e+01 3191 2609 -6.2500000000000003e-03 3191 2606 4.1666666666666666e-03 3191 3188 1.0658333333333333e+01 3191 3187 -1.0666666666666666e+01 3192 3192 6.4058333333333323e+01 3192 2562 5.3281250000000000e+00 3192 3168 3.2002083333333331e+01 3192 3176 -2.1320833333333333e+01 3192 2616 5.3322916666666664e+00 3192 2578 1.0416666666666669e-03 3192 2563 -1.0416666666666666e-02 3192 2571 -5.3291666666666666e+00 3192 2796 1.0416666666666667e-03 3192 2806 -6.2500000000000003e-03 3192 2792 4.1666666666666666e-03 3192 3194 -1.0658333333333333e+01 3192 3571 1.0666666666666666e+01 3192 2609 1.0662499999999998e+01 3192 2611 -1.5995833333333334e+01 3192 3193 -1.0658333333333333e+01 3192 3356 -1.0666666666666666e+01 3193 3193 6.4041666666666671e+01 3193 2606 -5.3312499999999998e+00 3193 3328 -2.1331249999999997e+01 3193 3191 -1.0658333333333333e+01 3193 2797 -5.3312499999999998e+00 3193 2806 2.1331249999999997e+01 3193 2792 -5.3312499999999998e+00 3193 3356 2.1331249999999997e+01 3193 3192 -1.0658333333333333e+01 3193 2609 2.1331249999999997e+01 3193 2611 -5.3312499999999998e+00 3194 3194 6.4041666666666671e+01 3194 2797 -5.3312499999999998e+00 3194 3330 -2.1331249999999997e+01 3194 3191 -1.0658333333333333e+01 3194 2573 -5.3312499999999998e+00 3194 2578 -1.0658333333333333e+01 3194 2563 2.1331249999999997e+01 3194 2571 -5.3312499999999998e+00 3194 3571 -2.1331249999999997e+01 3194 3192 -1.0658333333333333e+01 3194 2796 -1.0658333333333333e+01 3194 2806 2.1331249999999997e+01 3194 2792 -5.3312499999999998e+00 3195 3195 4.2691666666666663e+01 3195 2574 5.3322916666666664e+00 3195 2628 5.3322916666666664e+00 3195 2564 -6.2500000000000003e-03 3195 3198 -2.1331249999999997e+01 3195 3491 -1.0666666666666666e+01 3195 2568 5.3322916666666664e+00 3195 2587 -1.0668750000000001e+01 3195 2622 -6.2500000000000003e-03 3195 3196 -2.1331249999999997e+01 3195 3359 -1.0666666666666666e+01 3195 2619 5.3322916666666664e+00 3195 2621 -1.0668750000000001e+01 3196 3196 6.4041666666666671e+01 3196 2587 5.3312499999999998e+00 3196 2618 5.3312499999999998e+00 3196 3197 -2.1331249999999997e+01 3196 3333 -1.0658333333333333e+01 3196 2564 1.0658333333333333e+01 3196 2574 -2.1331249999999997e+01 3196 2573 5.3312499999999998e+00 3196 3195 -2.1331249999999997e+01 3196 3359 1.0658333333333333e+01 3196 2622 1.0658333333333333e+01 3196 2619 -2.1331249999999997e+01 3196 2621 5.3312499999999998e+00 3197 3197 4.2691666666666663e+01 3197 2563 5.3322916666666664e+00 3197 3190 2.1331249999999997e+01 3197 3191 -1.0666666666666666e+01 3197 2627 5.3322916666666664e+00 3197 2622 -6.2500000000000003e-03 3197 2619 5.3322916666666664e+00 3197 2618 -1.0668750000000001e+01 3197 2564 -6.2500000000000003e-03 3197 3196 -2.1331249999999997e+01 3197 3333 1.0666666666666666e+01 3197 2574 5.3322916666666664e+00 3197 2573 -1.0668750000000001e+01 3198 3198 5.3375000000000000e+01 3198 2621 5.3312499999999998e+00 3198 3195 -2.1331249999999997e+01 3198 3491 1.0658333333333333e+01 3198 2587 5.3312499999999998e+00 3198 2562 -2.1705219273391446e-19 3198 2564 1.0657291666666666e+01 3198 2568 -1.5998958333333333e+01 3198 2624 5.0116116045879435e-20 3198 3169 1.0656249999999998e+01 3198 2622 1.0657291666666666e+01 3198 3171 -1.0666666666666666e+01 3198 2628 -1.5998958333333333e+01 3199 3199 5.3375000000000000e+01 3199 2642 4.5528020914918643e-20 3199 3217 3.2002083333333331e+01 3199 3207 -2.1329166666666666e+01 3199 2407 -1.0662500000000000e+01 3199 2662 -3.2249014814734037e-20 3199 2415 5.3343749999999996e+00 3199 2413 -5.3302083333333332e+00 3199 2408 1.0679166666666665e+01 3199 2664 -6.2499999999999986e-03 3199 3214 -1.0658333333333331e+01 3199 3209 -1.0666666666666664e+01 3199 2666 5.3281250000000000e+00 3199 2667 -5.3322916666666664e+00 3199 2635 -4.9904357809065860e-20 3199 2634 -5.3322916666666664e+00 3199 2633 5.3322916666666664e+00 3199 3216 1.0666666666666666e+01 3199 3200 -1.0666666666666666e+01 3200 3200 4.2708333333333329e+01 3200 2637 -5.0116116045879435e-20 3200 2672 2.1705219273391446e-19 3200 3223 1.0656249999999998e+01 3200 3202 -1.0666666666666666e+01 3200 2667 -2.1705219273391446e-19 3200 2662 -1.0656249999999998e+01 3200 2664 1.0666666666666666e+01 3200 2634 -2.1705219273391446e-19 3200 3216 -1.0656249999999998e+01 3200 3199 -1.0666666666666666e+01 3200 2635 -1.0656249999999998e+01 3200 2633 1.0666666666666666e+01 3201 3201 8.5416666666666671e+01 3201 2646 5.3322916666666664e+00 3201 3205 -3.2002083333333331e+01 3201 3501 -2.1320833333333333e+01 3201 2430 5.3281250000000000e+00 3201 2811 -5.3302083333333332e+00 3201 2428 -1.4583333333333332e-02 3201 2429 5.3281250000000000e+00 3201 2439 -1.0662500000000000e+01 3201 2820 -2.0833333333333342e-03 3201 3203 -2.1329166666666666e+01 3201 3509 2.1320833333333333e+01 3201 2819 -5.3302083333333332e+00 3201 2817 1.0683333333333334e+01 3201 2633 1.0658333333333331e+01 3201 3202 -2.1329166666666669e+01 3201 3506 2.1320833333333333e+01 3201 2637 5.3281250000000000e+00 3201 2639 -2.1329166666666666e+01 3202 3202 5.3375000000000014e+01 3202 2670 5.3281250000000000e+00 3202 2635 -2.1684043449710089e-19 3202 2662 2.1684043449710089e-19 3202 2664 -6.2499999999999986e-03 3202 2672 -5.3322916666666664e+00 3202 3200 -1.0666666666666666e+01 3202 3223 -1.0666666666666666e+01 3202 3389 -1.0658333333333331e+01 3202 3210 -1.0666666666666668e+01 3202 2810 -5.3302083333333332e+00 3202 2811 1.0679166666666665e+01 3202 2820 5.3343749999999996e+00 3202 2817 -1.0662500000000000e+01 3202 2639 -1.4973071994693204e-20 3202 3506 -3.2002083333333331e+01 3202 3201 -2.1329166666666669e+01 3202 2637 -5.3322916666666664e+00 3202 2633 5.3322916666666664e+00 3203 3203 5.3375000000000007e+01 3203 2665 -3.2249014814734037e-20 3203 2810 -5.3302083333333332e+00 3203 2664 -6.2499999999999986e-03 3203 3390 1.0658333333333331e+01 3203 3210 -1.0666666666666664e+01 3203 2670 5.3281250000000000e+00 3203 2673 -5.3322916666666664e+00 3203 2439 4.5528020914918643e-20 3203 3509 -3.2002083333333331e+01 3203 3201 -2.1329166666666666e+01 3203 2819 1.0679166666666665e+01 3203 2820 5.3343749999999996e+00 3203 2817 -1.0662500000000000e+01 3203 2424 -4.9904357809065860e-20 3203 2429 -5.3322916666666664e+00 3203 2428 5.3322916666666664e+00 3203 3211 1.0666666666666666e+01 3203 3204 -1.0666666666666666e+01 3204 3204 4.2708333333333329e+01 3204 2673 -2.1705219273391446e-19 3204 2423 -5.0116116045879435e-20 3204 2663 2.1705219273391446e-19 3204 2665 -1.0656249999999998e+01 3204 2664 1.0666666666666666e+01 3204 3058 -1.0656249999999998e+01 3204 3063 1.0666666666666666e+01 3204 2429 -2.1705219273391446e-19 3204 3211 -1.0656249999999998e+01 3204 3203 -1.0666666666666666e+01 3204 2424 -1.0656249999999998e+01 3204 2428 1.0666666666666666e+01 3205 3205 5.3375000000000007e+01 3205 2681 2.1684043449710089e-19 3205 2643 5.3302083333333332e+00 3205 3208 -1.0658333333333331e+01 3205 2697 6.2499999999999995e-03 3205 3322 -1.0666666666666664e+01 3205 2686 -5.3281250000000000e+00 3205 2698 5.3322916666666664e+00 3205 2633 -1.0679166666666665e+01 3205 2639 1.0662500000000000e+01 3205 2646 -5.3343749999999996e+00 3205 2439 2.0761130467597592e-20 3205 3201 -3.2002083333333331e+01 3205 3501 2.1329166666666669e+01 3205 2431 -3.2249014814734037e-20 3205 2428 5.3322916666666664e+00 3205 2430 -5.3322916666666664e+00 3205 3206 -1.0666666666666666e+01 3205 3275 -1.0666666666666666e+01 3206 3206 5.3375000000000000e+01 3206 2433 -5.3312499999999998e+00 3206 3259 -2.1331249999999997e+01 3206 3207 -1.0658333333333333e+01 3206 2678 -5.3312499999999998e+00 3206 2697 2.1705219273391446e-19 3206 2681 -1.0657291666666666e+01 3206 2698 1.5998958333333333e+01 3206 2430 -2.1705219273391446e-19 3206 3275 1.0656249999999998e+01 3206 3205 -1.0666666666666666e+01 3206 2431 -1.0657291666666666e+01 3206 2428 1.5998958333333333e+01 3207 3207 6.4091666666666669e+01 3207 2686 1.0416666666666669e-03 3207 2431 1.0416666666666669e-03 3207 2681 1.0416666666666667e-03 3207 2698 -6.2500000000000003e-03 3207 2678 4.1666666666666666e-03 3207 3206 -1.0658333333333333e+01 3207 3259 1.0666666666666666e+01 3207 2404 -5.3302083333333332e+00 3207 2634 5.3281250000000000e+00 3207 2415 -2.0833333333333342e-03 3207 3199 -2.1329166666666666e+01 3207 3217 -2.1320833333333333e+01 3207 2408 -5.3302083333333332e+00 3207 2407 1.0683333333333334e+01 3207 2428 -1.0416666666666664e-02 3207 3063 2.1329166666666669e+01 3207 3065 -2.1320833333333333e+01 3207 2423 5.3281250000000000e+00 3207 2433 -5.3291666666666666e+00 3207 2643 1.0416666666666667e-03 3207 2633 -1.0416666666666666e-02 3207 2642 -5.3291666666666666e+00 3207 3208 -1.0658333333333333e+01 3207 3258 1.0666666666666666e+01 3208 3208 7.4712500000000006e+01 3208 2678 -5.3312499999999998e+00 3208 2646 -5.3322916666666664e+00 3208 3205 -1.0658333333333331e+01 3208 3322 2.1329166666666666e+01 3208 2686 -1.0653124999999999e+01 3208 2698 2.1333333333333336e+01 3208 2697 -5.3281250000000000e+00 3208 3258 -2.1331249999999997e+01 3208 3207 -1.0658333333333333e+01 3208 2643 -2.1326041666666665e+01 3208 2633 3.1999999999999996e+01 3208 2642 -5.3312499999999998e+00 3209 3209 4.2699999999999996e+01 3209 2408 -1.0662500000000000e+01 3209 2667 2.1705219273391446e-19 3209 3214 2.1329166666666666e+01 3209 3199 -1.0666666666666664e+01 3209 2663 -1.6284208410963924e-19 3209 2666 -1.0662500000000000e+01 3209 2664 1.0672916666666666e+01 3209 3064 -2.1329166666666666e+01 3209 3063 1.0666666666666668e+01 3209 2413 1.0683333333333334e+01 3209 2404 -1.0662500000000000e+01 3209 2415 1.0672916666666666e+01 3210 3210 4.2699999999999996e+01 3210 2819 -1.0662500000000000e+01 3210 2673 2.1705219273391446e-19 3210 3390 -2.1329166666666666e+01 3210 3203 -1.0666666666666664e+01 3210 2672 -1.6284208410963924e-19 3210 2670 -1.0662500000000000e+01 3210 2664 1.0672916666666666e+01 3210 3389 2.1329166666666666e+01 3210 3202 -1.0666666666666668e+01 3210 2810 1.0683333333333334e+01 3210 2811 -1.0662500000000000e+01 3210 2820 1.0672916666666666e+01 3211 3211 5.3375000000000000e+01 3211 2424 -2.6583333333333337e+00 3211 2429 8.0000000000000000e+00 3211 2665 -2.6583333333333337e+00 3211 2673 8.0000000000000000e+00 3211 2664 -2.1705219273391446e-19 3211 2428 -2.1705219273391446e-19 3211 3204 -1.0656249999999998e+01 3211 3203 1.0666666666666666e+01 3211 205 5.3312499999999998e+00 3211 489 -5.3312499999999998e+00 3211 1007 -1.5997916666666667e+01 3211 217 5.3312499999999998e+00 3211 216 -5.3395833333333327e+00 3211 1008 1.5997916666666665e+01 3211 215 -5.3333333333333330e+00 3211 986 -1.5997916666666667e+01 3211 985 1.5997916666666665e+01 3211 316 -5.3312499999999998e+00 3212 3212 6.4029166666666669e+01 3212 2479 1.0416666666666664e-02 3212 2480 1.0667708333333334e+01 3212 2671 -2.1329166666666666e+01 3212 2665 2.1334374999999998e+01 3212 2663 1.4465734552327348e-19 3212 3066 -2.1329166666666662e+01 3212 2466 -5.3312499999999998e+00 3212 3058 1.5997916666666665e+01 3212 484 -5.3312499999999998e+00 3212 314 -1.4465734552327348e-19 3212 977 2.1329166666666662e+01 3212 981 1.5997916666666667e+01 3213 3213 4.2691666666666663e+01 3213 2413 6.2500000000000003e-03 3213 2666 6.2500000000000003e-03 3213 2674 1.0668749999999999e+01 3213 2667 -5.3322916666666664e+00 3213 3214 2.1331249999999997e+01 3213 3219 1.0666666666666666e+01 3213 2408 -5.3322916666666664e+00 3213 289 -5.3322916666666664e+00 3213 288 1.0668749999999999e+01 3213 978 2.1331249999999997e+01 3213 1011 -1.0666666666666666e+01 3213 322 -5.3322916666666664e+00 3214 3214 7.4712500000000006e+01 3214 2674 5.3312499999999998e+00 3214 2415 5.3322916666666664e+00 3214 3199 -1.0658333333333331e+01 3214 3209 2.1329166666666666e+01 3214 2666 1.0653124999999999e+01 3214 2664 5.3281250000000000e+00 3214 2667 -2.1333333333333336e+01 3214 3213 2.1331249999999997e+01 3214 3219 1.0658333333333333e+01 3214 2413 2.1326041666666665e+01 3214 2408 -3.1999999999999996e+01 3214 288 5.3312499999999998e+00 3215 3215 6.4029166666666669e+01 3215 2671 -2.1329166666666666e+01 3215 2666 2.1334374999999998e+01 3215 2479 1.0416666666666664e-02 3215 2478 1.0667708333333334e+01 3215 2466 -5.3312499999999998e+00 3215 2663 -1.4465734552327348e-19 3215 3066 -2.1329166666666662e+01 3215 3064 1.5997916666666667e+01 3215 321 1.2659172094511536e-19 3215 973 -2.1329166666666662e+01 3215 482 -5.3312499999999998e+00 3215 970 1.5997916666666665e+01 3216 3216 5.3375000000000000e+01 3216 2651 -5.3312499999999998e+00 3216 3224 2.1331249999999997e+01 3216 3219 -1.0658333333333333e+01 3216 2674 -5.3312499999999998e+00 3216 2664 -2.1705219273391446e-19 3216 2662 -1.0657291666666666e+01 3216 2667 1.5998958333333333e+01 3216 2633 -2.1705219273391446e-19 3216 3200 -1.0656249999999998e+01 3216 3199 1.0666666666666666e+01 3216 2635 -1.0657291666666666e+01 3216 2634 1.5998958333333333e+01 3217 3217 6.4058333333333323e+01 3217 2633 5.3281250000000000e+00 3217 3199 3.2002083333333331e+01 3217 3207 -2.1320833333333333e+01 3217 2415 5.3322916666666664e+00 3217 2760 1.0416666666666669e-03 3217 2645 1.0416666666666669e-03 3217 2634 -1.0416666666666666e-02 3217 2642 -5.3291666666666666e+00 3217 2754 1.0416666666666667e-03 3217 2759 -6.2500000000000003e-03 3217 2750 4.1666666666666666e-03 3217 3220 -1.0658333333333333e+01 3217 3261 1.0666666666666666e+01 3217 2409 1.0416666666666667e-03 3217 2408 1.0662499999999998e+01 3217 2407 -1.5995833333333334e+01 3217 3218 -1.0658333333333333e+01 3217 3255 1.0666666666666666e+01 3218 3218 6.4041666666666671e+01 3218 3326 -2.1331249999999997e+01 3218 3219 -1.0658333333333333e+01 3218 2757 -5.3312499999999998e+00 3218 2760 -1.0658333333333333e+01 3218 2759 2.1331249999999997e+01 3218 2750 -5.3312499999999998e+00 3218 3255 -2.1331249999999997e+01 3218 3217 -1.0658333333333333e+01 3218 2409 -1.0658333333333333e+01 3218 2408 2.1331249999999997e+01 3218 2407 -5.3312499999999998e+00 3218 288 -5.3312499999999998e+00 3219 3219 4.2733333333333334e+01 3219 2754 1.0416666666666669e-03 3219 2409 1.0416666666666669e-03 3219 2760 1.0416666666666667e-03 3219 2759 -6.2500000000000003e-03 3219 2757 4.1666666666666666e-03 3219 3218 -1.0658333333333333e+01 3219 3326 1.0666666666666666e+01 3219 2645 1.0416666666666667e-03 3219 3220 -1.0658333333333333e+01 3219 3317 -1.0666666666666666e+01 3219 2666 1.0416666666666669e-03 3219 2635 1.0416666666666669e-03 3219 2634 -6.2500000000000003e-03 3219 2651 4.1666666666666666e-03 3219 2662 1.0416666666666667e-03 3219 2667 -6.2500000000000003e-03 3219 2674 4.1666666666666666e-03 3219 3216 -1.0658333333333333e+01 3219 3224 -1.0666666666666666e+01 3219 2413 1.0416666666666667e-03 3219 2408 -6.2500000000000003e-03 3219 3214 1.0658333333333333e+01 3219 3213 1.0666666666666666e+01 3219 288 4.1666666666666666e-03 3220 3220 6.4041666666666671e+01 3220 2757 -5.3312499999999998e+00 3220 3317 2.1331249999999997e+01 3220 3219 -1.0658333333333333e+01 3220 2651 -5.3312499999999998e+00 3220 2645 -1.0658333333333333e+01 3220 2634 2.1331249999999997e+01 3220 2642 -5.3312499999999998e+00 3220 3261 -2.1331249999999997e+01 3220 3217 -1.0658333333333333e+01 3220 2754 -1.0658333333333333e+01 3220 2759 2.1331249999999997e+01 3220 2750 -5.3312499999999998e+00 3221 3221 4.2691666666666663e+01 3221 2652 5.3322916666666664e+00 3221 2672 5.3322916666666664e+00 3221 2635 -6.2500000000000003e-03 3221 3223 -2.1331249999999997e+01 3221 3371 1.0666666666666666e+01 3221 2637 5.3322916666666664e+00 3221 2654 -1.0668750000000001e+01 3221 2662 -6.2500000000000003e-03 3221 3222 -2.1331249999999997e+01 3221 3373 1.0666666666666666e+01 3221 2661 5.3322916666666664e+00 3221 2660 -1.0668750000000001e+01 3222 3222 6.4041666666666671e+01 3222 2654 5.3312499999999998e+00 3222 2674 5.3312499999999998e+00 3222 3224 -2.1331249999999997e+01 3222 3383 -1.0658333333333333e+01 3222 2635 1.0658333333333333e+01 3222 2652 -2.1331249999999997e+01 3222 2651 5.3312499999999998e+00 3222 3221 -2.1331249999999997e+01 3222 3373 -1.0658333333333333e+01 3222 2662 1.0658333333333333e+01 3222 2661 -2.1331249999999997e+01 3222 2660 5.3312499999999998e+00 3223 3223 5.3375000000000000e+01 3223 2660 5.3312499999999998e+00 3223 3221 -2.1331249999999997e+01 3223 3371 -1.0658333333333333e+01 3223 2654 5.3312499999999998e+00 3223 2633 -2.1705219273391446e-19 3223 2635 1.0657291666666666e+01 3223 2637 -1.5998958333333333e+01 3223 2664 5.0116116045879435e-20 3223 3200 1.0656249999999998e+01 3223 2662 1.0657291666666666e+01 3223 3202 -1.0666666666666666e+01 3223 2672 -1.5998958333333333e+01 3224 3224 4.2691666666666663e+01 3224 2634 5.3322916666666664e+00 3224 3216 2.1331249999999997e+01 3224 3219 -1.0666666666666666e+01 3224 2667 5.3322916666666664e+00 3224 2662 -6.2500000000000003e-03 3224 2661 5.3322916666666664e+00 3224 2674 -1.0668750000000001e+01 3224 2635 -6.2500000000000003e-03 3224 3222 -2.1331249999999997e+01 3224 3383 1.0666666666666666e+01 3224 2652 5.3322916666666664e+00 3224 2651 -1.0668750000000001e+01 3225 3225 6.4058333333333337e+01 3225 2505 -5.3322916666666664e+00 3225 3249 3.2002083333333331e+01 3225 3227 -2.1320833333333333e+01 3225 2592 -5.3281250000000000e+00 3225 2595 5.3291666666666666e+00 3225 2702 -4.1666666666666666e-03 3225 3233 -1.0666666666666666e+01 3225 2500 1.5995833333333334e+01 3225 3226 -1.0666666666666666e+01 3226 3226 4.2691666666666663e+01 3226 3231 -1.0666666666666666e+01 3226 2702 1.0668750000000001e+01 3226 3225 -1.0666666666666666e+01 3226 2500 1.0668750000000001e+01 3227 3227 6.4091666666666669e+01 3227 2417 -5.3281250000000000e+00 3227 2681 -1.0416666666666664e-03 3227 2431 -1.0416666666666667e-03 3227 2440 5.3291666666666666e+00 3227 2438 1.0416666666666666e-02 3227 3234 -1.0666666666666666e+01 3227 3276 -1.0658333333333333e+01 3227 2593 -1.0416666666666664e-03 3227 2592 1.0416666666666664e-02 3227 3225 -2.1320833333333333e+01 3227 3249 -2.1329166666666669e+01 3227 2595 5.3291666666666666e+00 3227 2677 -1.0416666666666667e-03 3227 2675 -4.1666666666666657e-03 3227 2693 6.2499999999999995e-03 3227 3232 -1.0666666666666666e+01 3227 3244 -1.0658333333333333e+01 3227 2505 2.0833333333333337e-03 3227 3148 2.1320833333333333e+01 3227 3146 -2.1329166666666666e+01 3227 2498 5.3302083333333332e+00 3227 2500 -1.0683333333333334e+01 3228 3228 4.2733333333333334e+01 3228 2684 -1.0416666666666669e-03 3228 2731 -1.0416666666666667e-03 3228 2735 6.2500000000000003e-03 3228 2738 -4.1666666666666666e-03 3228 3240 1.0658333333333333e+01 3228 3235 -1.0666666666666666e+01 3228 2593 -1.0416666666666669e-03 3228 2596 6.2500000000000003e-03 3228 2595 -4.1666666666666666e-03 3228 3237 1.0658333333333333e+01 3228 3233 -1.0666666666666666e+01 3228 2677 -1.0416666666666667e-03 3228 2676 6.2500000000000003e-03 3228 2675 -4.1666666666666666e-03 3228 3239 1.0658333333333333e+01 3228 3232 -1.0666666666666666e+01 3228 2700 6.2500000000000003e-03 3228 2702 -4.1666666666666666e-03 3228 3238 1.0658333333333333e+01 3228 3229 -1.0666666666666666e+01 3229 3229 4.2691666666666663e+01 3229 2735 -5.3322916666666664e+00 3229 3231 -1.0666666666666666e+01 3229 2738 1.0668750000000001e+01 3229 3238 -2.1331249999999997e+01 3229 3228 -1.0666666666666666e+01 3229 2700 -5.3322916666666664e+00 3229 2702 1.0668750000000001e+01 3230 3230 6.4091666666666669e+01 3230 2684 -1.0416666666666664e-03 3230 2731 -1.0416666666666667e-03 3230 2738 5.3291666666666666e+00 3230 2732 1.0416666666666666e-02 3230 3235 -1.0666666666666666e+01 3230 3306 -1.0658333333333333e+01 3230 2431 -1.0416666666666664e-03 3230 2498 5.3302083333333332e+00 3230 2430 1.0416666666666664e-02 3230 3148 2.1320833333333333e+01 3230 3152 -2.1329166666666669e+01 3230 2417 -5.3281250000000000e+00 3230 2440 5.3291666666666666e+00 3230 2681 -1.0416666666666667e-03 3230 2675 -4.1666666666666657e-03 3230 2697 6.2499999999999995e-03 3230 3234 -1.0666666666666666e+01 3230 3275 -1.0658333333333333e+01 3230 2506 2.0833333333333337e-03 3230 3231 -2.1320833333333333e+01 3230 3500 2.1329166666666666e+01 3230 2500 -1.0683333333333334e+01 3231 3231 6.4058333333333337e+01 3231 2732 -5.3281250000000000e+00 3231 2702 -4.1666666666666666e-03 3231 3226 -1.0666666666666666e+01 3231 2738 5.3291666666666666e+00 3231 3229 -1.0666666666666666e+01 3231 3500 -3.2002083333333331e+01 3231 3230 -2.1320833333333333e+01 3231 2500 1.5995833333333334e+01 3231 2506 -5.3322916666666664e+00 3232 3232 4.2691666666666663e+01 3232 2592 -5.3322916666666664e+00 3232 3244 2.1331249999999997e+01 3232 3227 -1.0666666666666666e+01 3232 2693 -5.3322916666666664e+00 3232 2593 6.2499999999999995e-03 3232 2596 -5.3322916666666664e+00 3232 2595 1.0668750000000001e+01 3232 2677 6.2499999999999995e-03 3232 3239 -2.1331249999999997e+01 3232 3228 -1.0666666666666666e+01 3232 2676 -5.3322916666666664e+00 3232 2675 1.0668750000000001e+01 3233 3233 4.2691666666666663e+01 3233 3225 -1.0666666666666666e+01 3233 2700 -5.3322916666666664e+00 3233 2702 1.0668750000000001e+01 3233 3237 -2.1331249999999997e+01 3233 3228 -1.0666666666666666e+01 3233 2596 -5.3322916666666664e+00 3233 2595 1.0668750000000001e+01 3234 3234 4.2691666666666663e+01 3234 2430 -5.3322916666666664e+00 3234 3275 2.1331249999999997e+01 3234 3230 -1.0666666666666666e+01 3234 2697 -5.3322916666666664e+00 3234 2681 6.2499999999999986e-03 3234 2675 1.0668750000000001e+01 3234 2693 -5.3322916666666664e+00 3234 2431 6.2499999999999986e-03 3234 3276 2.1331249999999997e+01 3234 3227 -1.0666666666666666e+01 3234 2440 1.0668750000000001e+01 3234 2438 -5.3322916666666664e+00 3235 3235 4.2691666666666663e+01 3235 2697 -5.3322916666666664e+00 3235 3306 2.1331249999999997e+01 3235 3230 -1.0666666666666666e+01 3235 2732 -5.3322916666666664e+00 3235 2684 6.2499999999999995e-03 3235 2676 -5.3322916666666664e+00 3235 2675 1.0668750000000001e+01 3235 2731 6.2499999999999995e-03 3235 3240 -2.1331249999999997e+01 3235 3228 -1.0666666666666666e+01 3235 2735 -5.3322916666666664e+00 3235 2738 1.0668750000000001e+01 3236 3236 4.2733333333333334e+01 3236 2731 1.0416666666666669e-03 3236 2735 -6.2500000000000003e-03 3236 2734 4.1666666666666666e-03 3236 3238 -1.0658333333333333e+01 3236 3587 1.0666666666666666e+01 3236 2684 1.0416666666666667e-03 3236 3240 -1.0658333333333333e+01 3236 3304 -1.0666666666666666e+01 3236 2677 1.0416666666666669e-03 3236 2676 -6.2500000000000003e-03 3236 2692 4.1666666666666666e-03 3236 2593 1.0416666666666667e-03 3236 2596 -6.2500000000000003e-03 3236 2601 4.1666666666666666e-03 3236 3239 -1.0658333333333333e+01 3236 3245 -1.0666666666666666e+01 3236 2700 -6.2500000000000003e-03 3236 2699 4.1666666666666666e-03 3236 3237 -1.0658333333333333e+01 3236 3241 -1.0666666666666666e+01 3237 3237 6.4041666666666671e+01 3237 2601 -5.3312499999999998e+00 3237 2702 -5.3312499999999998e+00 3237 3233 -2.1331249999999997e+01 3237 3228 1.0658333333333333e+01 3237 2596 2.1331249999999997e+01 3237 2595 -5.3312499999999998e+00 3237 3241 2.1331249999999997e+01 3237 3236 -1.0658333333333333e+01 3237 2700 2.1331249999999997e+01 3237 2699 -5.3312499999999998e+00 3238 3238 6.4041666666666671e+01 3238 2738 -5.3312499999999998e+00 3238 2699 -5.3312499999999998e+00 3238 3587 -2.1331249999999997e+01 3238 3236 -1.0658333333333333e+01 3238 2735 2.1331249999999997e+01 3238 2734 -5.3312499999999998e+00 3238 3229 -2.1331249999999997e+01 3238 3228 1.0658333333333333e+01 3238 2700 2.1331249999999997e+01 3238 2702 -5.3312499999999998e+00 3239 3239 6.4041666666666671e+01 3239 2692 -5.3312499999999998e+00 3239 3245 2.1331249999999997e+01 3239 3236 -1.0658333333333333e+01 3239 2601 -5.3312499999999998e+00 3239 2593 -1.0658333333333333e+01 3239 2596 2.1331249999999997e+01 3239 2595 -5.3312499999999998e+00 3239 3232 -2.1331249999999997e+01 3239 3228 1.0658333333333333e+01 3239 2677 -1.0658333333333333e+01 3239 2676 2.1331249999999997e+01 3239 2675 -5.3312499999999998e+00 3240 3240 6.4041666666666671e+01 3240 2675 -5.3312499999999998e+00 3240 3235 -2.1331249999999997e+01 3240 3228 1.0658333333333333e+01 3240 2738 -5.3312499999999998e+00 3240 2731 -1.0658333333333333e+01 3240 2735 2.1331249999999997e+01 3240 2734 -5.3312499999999998e+00 3240 3304 2.1331249999999997e+01 3240 3236 -1.0658333333333333e+01 3240 2684 -1.0658333333333333e+01 3240 2676 2.1331249999999997e+01 3240 2692 -5.3312499999999998e+00 3241 3241 4.2691666666666663e+01 3241 2596 5.3322916666666664e+00 3241 3579 1.0666666666666666e+01 3241 2601 -1.0668750000000001e+01 3241 3237 2.1331249999999997e+01 3241 3236 -1.0666666666666666e+01 3241 2700 5.3322916666666664e+00 3241 2699 -1.0668750000000001e+01 3242 3242 3.2020833333333336e+01 3243 3243 3.2020833333333336e+01 3244 3244 5.3374999999999993e+01 3244 2694 5.0116116045879435e-20 3244 2595 5.3312499999999998e+00 3244 3232 2.1331249999999997e+01 3244 3227 -1.0658333333333333e+01 3244 2677 1.0657291666666666e+01 3244 2675 5.3312499999999998e+00 3244 2693 -1.5998958333333331e+01 3244 2589 2.1705219273391446e-19 3244 3175 1.0656249999999998e+01 3244 3174 -1.0666666666666666e+01 3244 2593 1.0657291666666666e+01 3244 2592 -1.5998958333333333e+01 3245 3245 4.2691666666666663e+01 3245 2676 5.3322916666666664e+00 3245 3239 2.1331249999999997e+01 3245 3236 -1.0666666666666666e+01 3245 2596 5.3322916666666664e+00 3245 2593 -6.2500000000000003e-03 3245 2602 5.3322916666666664e+00 3245 2601 -1.0668750000000001e+01 3245 2677 -6.2500000000000003e-03 3245 3246 -2.1331249999999997e+01 3245 3572 -1.0666666666666666e+01 3245 2691 5.3322916666666664e+00 3245 2692 -1.0668750000000001e+01 3246 3246 6.4041666666666671e+01 3246 2690 5.3312499999999998e+00 3246 3247 -2.1331249999999997e+01 3246 3568 -1.0658333333333333e+01 3246 2605 5.3312499999999998e+00 3246 2593 1.0658333333333333e+01 3246 2602 -2.1331249999999997e+01 3246 2601 5.3312499999999998e+00 3246 3245 -2.1331249999999997e+01 3246 3572 1.0658333333333333e+01 3246 2677 1.0658333333333333e+01 3246 2691 -2.1331249999999997e+01 3246 2692 5.3312499999999998e+00 3247 3247 4.2691666666666663e+01 3247 2589 5.3322916666666664e+00 3247 3175 2.1331249999999997e+01 3247 3176 -1.0666666666666666e+01 3247 2694 5.3322916666666664e+00 3247 2677 -6.2500000000000003e-03 3247 2691 5.3322916666666664e+00 3247 2690 -1.0668750000000001e+01 3247 2593 -6.2500000000000003e-03 3247 3246 -2.1331249999999997e+01 3247 3568 1.0666666666666666e+01 3247 2602 5.3322916666666664e+00 3247 2605 -1.0668750000000001e+01 3248 3248 3.2020833333333336e+01 3249 3249 5.3375000000000000e+01 3249 2500 1.0662500000000000e+01 3249 2595 1.4973071994693204e-20 3249 3225 3.2002083333333331e+01 3249 3227 -2.1329166666666669e+01 3249 2505 -5.3343749999999996e+00 3249 2875 6.2499999999999995e-03 3249 3456 -1.0666666666666664e+01 3249 2592 -5.3322916666666664e+00 3249 3486 1.0666666666666666e+01 3250 3250 2.1354166666666668e+01 3251 3251 4.2691666666666663e+01 3252 3252 3.2020833333333336e+01 3253 3253 6.4091666666666654e+01 3253 2411 5.3302083333333332e+00 3253 2423 -5.3281250000000000e+00 3253 2416 2.0833333333333342e-03 3253 3060 -2.1329166666666666e+01 3253 3065 2.1320833333333333e+01 3253 2404 5.3302083333333332e+00 3253 2407 -1.0683333333333334e+01 3253 2681 -1.0416666666666669e-03 3253 2572 -1.0416666666666669e-03 3253 2680 -1.0416666666666667e-03 3253 2679 6.2500000000000003e-03 3253 2678 -4.1666666666666666e-03 3253 3266 1.0658333333333333e+01 3253 3260 -1.0666666666666666e+01 3253 2431 -1.0416666666666667e-03 3253 2426 1.0416666666666666e-02 3253 2433 5.3291666666666666e+00 3253 3265 1.0658333333333333e+01 3253 3259 -1.0666666666666666e+01 3253 2566 1.0416666666666664e-02 3253 3262 2.1329166666666669e+01 3253 3254 -2.1320833333333333e+01 3253 2567 -5.3281250000000000e+00 3253 2565 5.3291666666666666e+00 3254 3254 6.4058333333333337e+01 3254 2752 -1.0416666666666669e-03 3254 2409 -1.0416666666666669e-03 3254 2760 -1.0416666666666667e-03 3254 2763 6.2500000000000003e-03 3254 2750 -4.1666666666666666e-03 3254 3278 1.0658333333333333e+01 3254 3255 -1.0666666666666666e+01 3254 2581 -1.0416666666666667e-03 3254 3280 1.0658333333333333e+01 3254 3257 -1.0666666666666666e+01 3254 2411 -1.0662499999999998e+01 3254 2416 -5.3322916666666664e+00 3254 2407 1.5995833333333334e+01 3254 2567 1.0416666666666666e-02 3254 3262 -3.2002083333333331e+01 3254 3253 -2.1320833333333333e+01 3254 2566 -5.3281250000000000e+00 3254 2565 5.3291666666666666e+00 3255 3255 4.2691666666666663e+01 3255 2411 -5.3322916666666664e+00 3255 3278 -2.1331249999999997e+01 3255 3254 -1.0666666666666666e+01 3255 2763 -5.3322916666666664e+00 3255 2760 6.2500000000000003e-03 3255 2759 -5.3322916666666664e+00 3255 2750 1.0668750000000001e+01 3255 2409 6.2500000000000003e-03 3255 3218 -2.1331249999999997e+01 3255 3217 1.0666666666666666e+01 3255 2408 -5.3322916666666664e+00 3255 2407 1.0668750000000001e+01 3256 3256 4.2733333333333334e+01 3256 2581 -1.0416666666666669e-03 3256 2680 -1.0416666666666669e-03 3256 2572 -1.0416666666666667e-03 3256 2580 6.2500000000000003e-03 3256 2565 -4.1666666666666666e-03 3256 3273 -1.0658333333333333e+01 3256 3260 -1.0666666666666666e+01 3256 2643 -1.0416666666666669e-03 3256 2754 -1.0416666666666669e-03 3256 2645 -1.0416666666666667e-03 3256 2644 6.2500000000000003e-03 3256 2642 -4.1666666666666666e-03 3256 3314 1.0658333333333333e+01 3256 3261 -1.0666666666666666e+01 3256 2686 -1.0416666666666667e-03 3256 2685 6.2500000000000003e-03 3256 2678 -4.1666666666666666e-03 3256 3315 1.0658333333333333e+01 3256 3258 -1.0666666666666666e+01 3256 2752 -1.0416666666666667e-03 3256 2751 6.2500000000000003e-03 3256 2750 -4.1666666666666666e-03 3256 3312 1.0658333333333333e+01 3256 3257 -1.0666666666666666e+01 3257 3257 4.2691666666666663e+01 3257 2580 -5.3322916666666664e+00 3257 2763 -5.3322916666666664e+00 3257 2581 6.2500000000000003e-03 3257 3280 -2.1331249999999997e+01 3257 3254 -1.0666666666666666e+01 3257 2567 -5.3322916666666664e+00 3257 2565 1.0668750000000001e+01 3257 2752 6.2500000000000003e-03 3257 3312 -2.1331249999999997e+01 3257 3256 -1.0666666666666666e+01 3257 2751 -5.3322916666666664e+00 3257 2750 1.0668750000000001e+01 3258 3258 4.2691666666666663e+01 3258 2698 -5.3322916666666664e+00 3258 2644 -5.3322916666666664e+00 3258 2686 6.2500000000000003e-03 3258 3315 -2.1331249999999997e+01 3258 3256 -1.0666666666666666e+01 3258 2685 -5.3322916666666664e+00 3258 2678 1.0668750000000001e+01 3258 2643 6.2500000000000003e-03 3258 3208 -2.1331249999999997e+01 3258 3207 1.0666666666666666e+01 3258 2633 -5.3322916666666664e+00 3258 2642 1.0668750000000001e+01 3259 3259 4.2691666666666663e+01 3259 2428 -5.3322916666666664e+00 3259 3206 -2.1331249999999997e+01 3259 3207 1.0666666666666666e+01 3259 2698 -5.3322916666666664e+00 3259 2681 6.2500000000000003e-03 3259 2679 -5.3322916666666664e+00 3259 2678 1.0668750000000001e+01 3259 2431 6.2500000000000003e-03 3259 3265 -2.1331249999999997e+01 3259 3253 -1.0666666666666666e+01 3259 2426 -5.3322916666666664e+00 3259 2433 1.0668750000000001e+01 3260 3260 4.2691666666666663e+01 3260 2685 -5.3322916666666664e+00 3260 3273 2.1331249999999997e+01 3260 3256 -1.0666666666666666e+01 3260 2580 -5.3322916666666664e+00 3260 2572 6.2500000000000003e-03 3260 2566 -5.3322916666666664e+00 3260 2565 1.0668750000000001e+01 3260 2680 6.2500000000000003e-03 3260 3266 -2.1331249999999997e+01 3260 3253 -1.0666666666666666e+01 3260 2679 -5.3322916666666664e+00 3260 2678 1.0668750000000001e+01 3261 3261 4.2691666666666663e+01 3261 2634 -5.3322916666666664e+00 3261 3220 -2.1331249999999997e+01 3261 3217 1.0666666666666666e+01 3261 2759 -5.3322916666666664e+00 3261 2754 6.2500000000000003e-03 3261 2751 -5.3322916666666664e+00 3261 2750 1.0668750000000001e+01 3261 2645 6.2500000000000003e-03 3261 3314 -2.1331249999999997e+01 3261 3256 -1.0666666666666666e+01 3261 2644 -5.3322916666666664e+00 3261 2642 1.0668750000000001e+01 3262 3262 5.3375000000000014e+01 3262 2455 5.3281250000000000e+00 3262 2569 -2.1684043449710089e-19 3262 2450 2.1684043449710089e-19 3262 2460 -6.2499999999999986e-03 3262 2462 -5.3322916666666664e+00 3262 3264 -1.0666666666666666e+01 3262 3279 1.0666666666666666e+01 3262 3087 -1.0658333333333331e+01 3262 3086 1.0666666666666668e+01 3262 2405 -5.3302083333333332e+00 3262 2411 1.0679166666666665e+01 3262 2416 5.3343749999999996e+00 3262 2407 -1.0662500000000000e+01 3262 2565 -2.0761130467597592e-20 3262 3254 -3.2002083333333331e+01 3262 3253 2.1329166666666669e+01 3262 2567 -5.3322916666666664e+00 3262 2566 5.3322916666666664e+00 3263 3263 5.3375000000000000e+01 3263 2570 -2.7052114752934217e-20 3263 3487 -3.2002083333333331e+01 3263 3268 -2.1329166666666666e+01 3263 2345 -1.0662500000000000e+01 3263 2450 4.9904357809065860e-20 3263 2344 5.3343749999999996e+00 3263 2337 -5.3302083333333332e+00 3263 2343 1.0679166666666665e+01 3263 2460 -6.2499999999999986e-03 3263 3113 -1.0658333333333331e+01 3263 3115 1.0666666666666664e+01 3263 2457 5.3281250000000000e+00 3263 2461 -5.3322916666666664e+00 3263 2569 3.2249014814734037e-20 3263 2568 -5.3322916666666664e+00 3263 2566 5.3322916666666664e+00 3263 3490 1.0666666666666666e+01 3263 3264 -1.0666666666666666e+01 3264 3264 4.2708333333333329e+01 3264 2567 -5.0116116045879435e-20 3264 2462 2.1705219273391446e-19 3264 3279 -1.0656249999999998e+01 3264 3262 -1.0666666666666666e+01 3264 2461 -2.1705219273391446e-19 3264 2450 -1.0656249999999998e+01 3264 2460 1.0666666666666666e+01 3264 2568 -2.1705219273391446e-19 3264 3490 -1.0656249999999998e+01 3264 3263 -1.0666666666666666e+01 3264 2569 -1.0656249999999998e+01 3264 2566 1.0666666666666666e+01 3265 3265 5.3374999999999993e+01 3265 2438 2.1705219273391446e-19 3265 2693 -2.1705219273391446e-19 3265 3276 1.0656249999999998e+01 3265 3267 -1.0666666666666666e+01 3265 2681 -1.0657291666666666e+01 3265 2679 1.5998958333333331e+01 3265 2678 -5.3312499999999998e+00 3265 3259 -2.1331249999999997e+01 3265 3253 1.0658333333333333e+01 3265 2431 -1.0657291666666666e+01 3265 2426 1.5998958333333331e+01 3265 2433 -5.3312499999999998e+00 3266 3266 7.4712500000000020e+01 3266 2693 -5.3281250000000000e+00 3266 3274 2.1329166666666666e+01 3266 3267 -1.0658333333333331e+01 3266 2576 -5.3322916666666664e+00 3266 2572 -2.1326041666666665e+01 3266 2566 3.1999999999999996e+01 3266 2565 -5.3312499999999998e+00 3266 3260 -2.1331249999999997e+01 3266 3253 1.0658333333333333e+01 3266 2680 -1.0653124999999999e+01 3266 2679 2.1333333333333329e+01 3266 2678 -5.3312499999999998e+00 3267 3267 5.3375000000000021e+01 3267 2680 -5.3281250000000000e+00 3267 2431 2.1684043449710089e-19 3267 2681 4.9904357809065860e-20 3267 2679 5.3322916666666664e+00 3267 2693 6.2499999999999995e-03 3267 3265 -1.0666666666666666e+01 3267 3276 -1.0666666666666666e+01 3267 3266 -1.0658333333333331e+01 3267 3274 -1.0666666666666668e+01 3267 2572 5.3302083333333332e+00 3267 2427 2.1684043449710089e-19 3267 2426 5.3322916666666664e+00 3267 2438 -5.3322916666666664e+00 3267 3268 -3.2002083333333331e+01 3267 3485 2.1329166666666666e+01 3267 2566 -1.0679166666666665e+01 3267 2570 1.0662500000000000e+01 3267 2576 -5.3343749999999996e+00 3268 3268 8.5416666666666671e+01 3268 2338 -5.3302083333333332e+00 3268 2568 5.3281250000000000e+00 3268 2344 -2.0833333333333342e-03 3268 3263 -2.1329166666666666e+01 3268 3487 2.1320833333333333e+01 3268 2343 -5.3302083333333332e+00 3268 2345 1.0683333333333334e+01 3268 3269 -2.1329166666666669e+01 3268 3423 -2.1320833333333333e+01 3268 2420 5.3281250000000000e+00 3268 2426 -1.4583333333333330e-02 3268 2427 -1.0662500000000000e+01 3268 2438 5.3281250000000000e+00 3268 3267 -3.2002083333333331e+01 3268 3485 -2.1320833333333333e+01 3268 2566 1.0658333333333331e+01 3268 2570 -2.1329166666666666e+01 3268 2576 5.3322916666666664e+00 3269 3269 5.3375000000000000e+01 3269 2345 -1.0662500000000000e+01 3269 2427 2.1158177161623045e-20 3269 3423 3.2002083333333331e+01 3269 3268 -2.1329166666666669e+01 3269 2457 5.3281250000000000e+00 3269 2421 -2.1684043449710089e-19 3269 2420 -5.3322916666666664e+00 3269 2426 5.3322916666666664e+00 3269 2442 2.1684043449710089e-19 3269 2460 -6.2499999999999986e-03 3269 2458 -5.3322916666666664e+00 3269 3071 1.0666666666666666e+01 3269 3069 -1.0666666666666666e+01 3269 2344 5.3343749999999996e+00 3269 3114 -1.0658333333333331e+01 3269 3115 1.0666666666666668e+01 3269 2337 -5.3302083333333332e+00 3269 2338 1.0679166666666665e+01 3270 3270 4.2691666666666663e+01 3270 2694 5.3322916666666664e+00 3270 2577 5.3322916666666664e+00 3270 2680 -6.2500000000000003e-03 3270 3271 -2.1331249999999997e+01 3270 3549 -1.0666666666666666e+01 3270 2688 5.3322916666666664e+00 3270 2690 -1.0668750000000001e+01 3270 2572 -6.2500000000000003e-03 3270 3177 2.1331249999999997e+01 3270 3176 -1.0666666666666666e+01 3270 2562 5.3322916666666664e+00 3270 2571 -1.0668750000000001e+01 3271 3271 6.4041666666666671e+01 3271 2687 5.3312499999999998e+00 3271 3272 -2.1331249999999997e+01 3271 3539 -1.0658333333333333e+01 3271 2579 5.3312499999999998e+00 3271 2572 1.0658333333333333e+01 3271 2577 -2.1331249999999997e+01 3271 2571 5.3312499999999998e+00 3271 3270 -2.1331249999999997e+01 3271 3549 1.0658333333333333e+01 3271 2680 1.0658333333333333e+01 3271 2688 -2.1331249999999997e+01 3271 2690 5.3312499999999998e+00 3272 3272 4.2691666666666663e+01 3272 2688 5.3322916666666664e+00 3272 3271 -2.1331249999999997e+01 3272 3539 1.0666666666666666e+01 3272 2577 5.3322916666666664e+00 3272 2572 -6.2500000000000003e-03 3272 2580 5.3322916666666664e+00 3272 2579 -1.0668750000000001e+01 3272 2680 -6.2500000000000003e-03 3272 3273 -2.1331249999999997e+01 3272 3313 -1.0666666666666666e+01 3272 2685 5.3322916666666664e+00 3272 2687 -1.0668750000000001e+01 3273 3273 6.4041666666666671e+01 3273 2678 5.3312499999999998e+00 3273 3260 2.1331249999999997e+01 3273 3256 -1.0658333333333333e+01 3273 2565 5.3312499999999998e+00 3273 2572 1.0658333333333333e+01 3273 2580 -2.1331249999999997e+01 3273 2579 5.3312499999999998e+00 3273 3272 -2.1331249999999997e+01 3273 3313 1.0658333333333333e+01 3273 2680 1.0658333333333333e+01 3273 2685 -2.1331249999999997e+01 3273 2687 5.3312499999999998e+00 3274 3274 4.2699999999999996e+01 3274 2679 4.0939925783957855e-21 3274 3266 2.1329166666666666e+01 3274 3267 -1.0666666666666668e+01 3274 2566 1.0662500000000000e+01 3274 2572 -1.0683333333333334e+01 3274 2562 1.0662500000000000e+01 3274 2576 -1.0672916666666666e+01 3274 2694 1.6284208410963924e-19 3274 3177 2.1329166666666666e+01 3274 3174 -1.0666666666666664e+01 3274 2680 1.0662500000000000e+01 3274 2693 -1.0672916666666666e+01 3275 3275 5.3374999999999993e+01 3275 2698 5.0116116045879435e-20 3275 2440 5.3312499999999998e+00 3275 3234 2.1331249999999997e+01 3275 3230 -1.0658333333333333e+01 3275 2681 1.0657291666666666e+01 3275 2675 5.3312499999999998e+00 3275 2697 -1.5998958333333331e+01 3275 2428 2.1705219273391446e-19 3275 3206 1.0656249999999998e+01 3275 3205 -1.0666666666666666e+01 3275 2431 1.0657291666666666e+01 3275 2430 -1.5998958333333333e+01 3276 3276 5.3375000000000000e+01 3276 2675 5.3312499999999998e+00 3276 3234 2.1331249999999997e+01 3276 3227 -1.0658333333333333e+01 3276 2440 5.3312499999999998e+00 3276 2426 5.0116116045879435e-20 3276 2431 1.0657291666666666e+01 3276 2438 -1.5998958333333333e+01 3276 2679 2.1705219273391446e-19 3276 3265 1.0656249999999998e+01 3276 3267 -1.0666666666666666e+01 3276 2681 1.0657291666666666e+01 3276 2693 -1.5998958333333333e+01 3277 3277 4.2733333333333334e+01 3277 2450 1.0416666666666669e-03 3277 2405 1.0416666666666669e-03 3277 2455 1.0416666666666667e-03 3277 2462 -6.2500000000000003e-03 3277 2449 4.1666666666666666e-03 3277 3087 1.0658333333333333e+01 3277 3082 -1.0666666666666666e+01 3277 2569 1.0416666666666667e-03 3277 3279 -1.0658333333333333e+01 3277 3493 -1.0666666666666666e+01 3277 2760 1.0416666666666669e-03 3277 2581 1.0416666666666669e-03 3277 2567 -6.2500000000000003e-03 3277 2583 4.1666666666666666e-03 3277 2752 1.0416666666666667e-03 3277 2763 -6.2500000000000003e-03 3277 2765 4.1666666666666666e-03 3277 3280 -1.0658333333333333e+01 3277 3600 -1.0666666666666666e+01 3277 2409 1.0416666666666667e-03 3277 2411 -6.2500000000000003e-03 3277 2410 4.1666666666666666e-03 3277 3278 -1.0658333333333333e+01 3277 3325 1.0666666666666666e+01 3278 3278 6.4041666666666671e+01 3278 2765 -5.3312499999999998e+00 3278 2407 -5.3312499999999998e+00 3278 3255 -2.1331249999999997e+01 3278 3254 1.0658333333333333e+01 3278 2760 -1.0658333333333333e+01 3278 2763 2.1331249999999997e+01 3278 2750 -5.3312499999999998e+00 3278 3325 -2.1331249999999997e+01 3278 3277 -1.0658333333333333e+01 3278 2409 -1.0658333333333333e+01 3278 2411 2.1331249999999997e+01 3278 2410 -5.3312499999999998e+00 3279 3279 5.3375000000000000e+01 3279 2449 -5.3312499999999998e+00 3279 3493 2.1331249999999997e+01 3279 3277 -1.0658333333333333e+01 3279 2583 -5.3312499999999998e+00 3279 2566 2.1705219273391446e-19 3279 2569 -1.0657291666666666e+01 3279 2567 1.5998958333333333e+01 3279 2460 -5.0116116045879435e-20 3279 3264 -1.0656249999999998e+01 3279 2450 -1.0657291666666666e+01 3279 3262 1.0666666666666666e+01 3279 2462 1.5998958333333333e+01 3280 3280 6.4041666666666671e+01 3280 2583 -5.3312499999999998e+00 3280 3600 2.1331249999999997e+01 3280 3277 -1.0658333333333333e+01 3280 2765 -5.3312499999999998e+00 3280 2752 -1.0658333333333333e+01 3280 2763 2.1331249999999997e+01 3280 2750 -5.3312499999999998e+00 3280 3257 -2.1331249999999997e+01 3280 3254 1.0658333333333333e+01 3280 2581 -1.0658333333333333e+01 3280 2567 2.1331249999999997e+01 3280 2565 -5.3312499999999998e+00 3281 3281 6.4058333333333323e+01 3281 2722 -5.3281250000000000e+00 3281 3308 3.2002083333333331e+01 3281 3287 -2.1320833333333333e+01 3281 2721 -5.3322916666666664e+00 3281 2728 5.3291666666666666e+00 3281 2739 -4.1666666666666666e-03 3281 3292 -1.0666666666666666e+01 3281 2710 1.5995833333333334e+01 3281 3282 -1.0666666666666666e+01 3282 3282 4.2691666666666663e+01 3282 3283 -1.0666666666666666e+01 3282 2739 1.0668750000000001e+01 3282 3281 -1.0666666666666666e+01 3282 2710 1.0668750000000001e+01 3283 3283 4.2733333333333334e+01 3283 2739 -4.1666666666666666e-03 3283 3282 -1.0666666666666666e+01 3283 3286 -1.0666666666666666e+01 3283 2929 -4.1666666666666666e-03 3283 2954 -4.1666666666666666e-03 3283 3294 -1.0666666666666666e+01 3283 2710 -4.1666666666666666e-03 3283 3284 -1.0666666666666666e+01 3284 3284 4.2691666666666663e+01 3284 2718 -5.3322916666666664e+00 3284 3529 -2.1331249999999997e+01 3284 3288 -1.0666666666666666e+01 3284 2965 -5.3322916666666664e+00 3284 2954 1.0668750000000001e+01 3284 3283 -1.0666666666666666e+01 3284 2710 1.0668750000000001e+01 3285 3285 4.2733333333333334e+01 3285 2689 -1.0416666666666669e-03 3285 2919 -1.0416666666666667e-03 3285 2927 6.2500000000000003e-03 3285 2929 -4.1666666666666666e-03 3285 3300 1.0658333333333333e+01 3285 3293 -1.0666666666666666e+01 3285 2731 -1.0416666666666669e-03 3285 2729 6.2500000000000003e-03 3285 2728 -4.1666666666666666e-03 3285 3298 1.0658333333333333e+01 3285 3292 -1.0666666666666666e+01 3285 2684 -1.0416666666666667e-03 3285 2683 6.2500000000000003e-03 3285 2682 -4.1666666666666666e-03 3285 3299 1.0658333333333333e+01 3285 3291 -1.0666666666666666e+01 3285 2740 6.2500000000000003e-03 3285 2739 -4.1666666666666666e-03 3285 3296 1.0658333333333333e+01 3285 3286 -1.0666666666666666e+01 3286 3286 4.2691666666666663e+01 3286 2927 -5.3322916666666664e+00 3286 3283 -1.0666666666666666e+01 3286 2929 1.0668750000000001e+01 3286 3296 -2.1331249999999997e+01 3286 3285 -1.0666666666666666e+01 3286 2740 -5.3322916666666664e+00 3286 2739 1.0668750000000001e+01 3287 3287 6.4091666666666654e+01 3287 2718 5.3302083333333332e+00 3287 2721 2.0833333333333342e-03 3287 3308 -2.1329166666666666e+01 3287 3281 -2.1320833333333333e+01 3287 2710 -1.0683333333333334e+01 3287 2684 -1.0416666666666669e-03 3287 2643 -1.0416666666666669e-03 3287 2686 -1.0416666666666667e-03 3287 2696 6.2500000000000003e-03 3287 2682 -4.1666666666666666e-03 3287 3321 -1.0658333333333333e+01 3287 3295 -1.0666666666666666e+01 3287 2731 -1.0416666666666667e-03 3287 2722 1.0416666666666666e-02 3287 2728 5.3291666666666666e+00 3287 3305 -1.0658333333333333e+01 3287 3291 -1.0666666666666666e+01 3287 2636 1.0416666666666666e-02 3287 3515 2.1329166666666669e+01 3287 3288 -2.1320833333333333e+01 3287 2641 -5.3281250000000000e+00 3287 2640 5.3291666666666666e+00 3288 3288 6.4058333333333337e+01 3288 2955 -1.0416666666666669e-03 3288 2965 6.2500000000000003e-03 3288 2954 -4.1666666666666666e-03 3288 3529 1.0658333333333333e+01 3288 3284 -1.0666666666666666e+01 3288 2649 -1.0416666666666667e-03 3288 3531 1.0658333333333333e+01 3288 3290 -1.0666666666666666e+01 3288 2718 -1.0662499999999998e+01 3288 2721 -5.3322916666666664e+00 3288 2710 1.5995833333333334e+01 3288 2641 1.0416666666666666e-02 3288 3515 -3.2002083333333331e+01 3288 3287 -2.1320833333333333e+01 3288 2636 -5.3281250000000000e+00 3288 2640 5.3291666666666666e+00 3289 3289 4.2733333333333334e+01 3289 2649 -1.0416666666666669e-03 3289 2686 -1.0416666666666669e-03 3289 2643 -1.0416666666666667e-03 3289 2648 6.2500000000000003e-03 3289 2640 -4.1666666666666666e-03 3289 3324 -1.0658333333333333e+01 3289 3295 -1.0666666666666666e+01 3289 2919 -1.0416666666666669e-03 3289 2930 6.2500000000000003e-03 3289 2929 -4.1666666666666666e-03 3289 3608 1.0658333333333333e+01 3289 3294 -1.0666666666666666e+01 3289 2689 -1.0416666666666667e-03 3289 2695 6.2500000000000003e-03 3289 2682 -4.1666666666666666e-03 3289 3559 -1.0658333333333333e+01 3289 3293 -1.0666666666666666e+01 3289 2955 -1.0416666666666667e-03 3289 2952 6.2500000000000003e-03 3289 2954 -4.1666666666666666e-03 3289 3609 1.0658333333333333e+01 3289 3290 -1.0666666666666666e+01 3290 3290 4.2691666666666663e+01 3290 2648 -5.3322916666666664e+00 3290 2965 -5.3322916666666664e+00 3290 2649 6.2500000000000003e-03 3290 3531 -2.1331249999999997e+01 3290 3288 -1.0666666666666666e+01 3290 2641 -5.3322916666666664e+00 3290 2640 1.0668750000000001e+01 3290 2955 6.2500000000000003e-03 3290 3609 -2.1331249999999997e+01 3290 3289 -1.0666666666666666e+01 3290 2952 -5.3322916666666664e+00 3290 2954 1.0668750000000001e+01 3291 3291 4.2691666666666663e+01 3291 2696 -5.3322916666666664e+00 3291 3305 2.1331249999999997e+01 3291 3287 -1.0666666666666666e+01 3291 2722 -5.3322916666666664e+00 3291 2731 6.2500000000000003e-03 3291 2729 -5.3322916666666664e+00 3291 2728 1.0668750000000001e+01 3291 2684 6.2500000000000003e-03 3291 3299 -2.1331249999999997e+01 3291 3285 -1.0666666666666666e+01 3291 2683 -5.3322916666666664e+00 3291 2682 1.0668750000000001e+01 3292 3292 4.2691666666666663e+01 3292 3281 -1.0666666666666666e+01 3292 2740 -5.3322916666666664e+00 3292 2739 1.0668750000000001e+01 3292 3298 -2.1331249999999997e+01 3292 3285 -1.0666666666666666e+01 3292 2729 -5.3322916666666664e+00 3292 2728 1.0668750000000001e+01 3293 3293 4.2691666666666663e+01 3293 2683 -5.3322916666666664e+00 3293 3300 -2.1331249999999997e+01 3293 3285 -1.0666666666666666e+01 3293 2927 -5.3322916666666664e+00 3293 2919 6.2500000000000003e-03 3293 2930 -5.3322916666666664e+00 3293 2929 1.0668750000000001e+01 3293 2689 6.2500000000000003e-03 3293 3559 2.1331249999999997e+01 3293 3289 -1.0666666666666666e+01 3293 2695 -5.3322916666666664e+00 3293 2682 1.0668750000000001e+01 3294 3294 4.2691666666666663e+01 3294 3283 -1.0666666666666666e+01 3294 2952 -5.3322916666666664e+00 3294 2954 1.0668750000000001e+01 3294 3608 -2.1331249999999997e+01 3294 3289 -1.0666666666666666e+01 3294 2930 -5.3322916666666664e+00 3294 2929 1.0668750000000001e+01 3295 3295 4.2691666666666663e+01 3295 2695 -5.3322916666666664e+00 3295 3324 2.1331249999999997e+01 3295 3289 -1.0666666666666666e+01 3295 2648 -5.3322916666666664e+00 3295 2643 6.2500000000000003e-03 3295 2636 -5.3322916666666664e+00 3295 2640 1.0668750000000001e+01 3295 2686 6.2500000000000003e-03 3295 3321 2.1331249999999997e+01 3295 3287 -1.0666666666666666e+01 3295 2696 -5.3322916666666664e+00 3295 2682 1.0668750000000001e+01 3296 3296 6.4041666666666671e+01 3296 2929 -5.3312499999999998e+00 3296 2742 -5.3312499999999998e+00 3296 3586 -2.1331249999999997e+01 3296 3297 -1.0658333333333333e+01 3296 2927 2.1331249999999997e+01 3296 2925 -5.3312499999999998e+00 3296 3286 -2.1331249999999997e+01 3296 3285 1.0658333333333333e+01 3296 2740 2.1331249999999997e+01 3296 2739 -5.3312499999999998e+00 3297 3297 4.2733333333333334e+01 3297 2684 1.0416666666666669e-03 3297 2731 1.0416666666666667e-03 3297 2729 -6.2500000000000003e-03 3297 2734 4.1666666666666666e-03 3297 3299 -1.0658333333333333e+01 3297 3304 -1.0666666666666666e+01 3297 2919 1.0416666666666669e-03 3297 2927 -6.2500000000000003e-03 3297 2925 4.1666666666666666e-03 3297 3296 -1.0658333333333333e+01 3297 3586 1.0666666666666666e+01 3297 2689 1.0416666666666667e-03 3297 2683 -6.2500000000000003e-03 3297 2692 4.1666666666666666e-03 3297 3300 -1.0658333333333333e+01 3297 3558 -1.0666666666666666e+01 3297 2740 -6.2500000000000003e-03 3297 2742 4.1666666666666666e-03 3297 3298 -1.0658333333333333e+01 3297 3301 -1.0666666666666666e+01 3298 3298 6.4041666666666671e+01 3298 2734 -5.3312499999999998e+00 3298 2739 -5.3312499999999998e+00 3298 3292 -2.1331249999999997e+01 3298 3285 1.0658333333333333e+01 3298 2729 2.1331249999999997e+01 3298 2728 -5.3312499999999998e+00 3298 3301 2.1331249999999997e+01 3298 3297 -1.0658333333333333e+01 3298 2740 2.1331249999999997e+01 3298 2742 -5.3312499999999998e+00 3299 3299 6.4041666666666671e+01 3299 2692 -5.3312499999999998e+00 3299 3304 2.1331249999999997e+01 3299 3297 -1.0658333333333333e+01 3299 2734 -5.3312499999999998e+00 3299 2731 -1.0658333333333333e+01 3299 2729 2.1331249999999997e+01 3299 2728 -5.3312499999999998e+00 3299 3291 -2.1331249999999997e+01 3299 3285 1.0658333333333333e+01 3299 2684 -1.0658333333333333e+01 3299 2683 2.1331249999999997e+01 3299 2682 -5.3312499999999998e+00 3300 3300 6.4041666666666671e+01 3300 2682 -5.3312499999999998e+00 3300 3293 -2.1331249999999997e+01 3300 3285 1.0658333333333333e+01 3300 2929 -5.3312499999999998e+00 3300 2919 -1.0658333333333333e+01 3300 2927 2.1331249999999997e+01 3300 2925 -5.3312499999999998e+00 3300 3558 2.1331249999999997e+01 3300 3297 -1.0658333333333333e+01 3300 2689 -1.0658333333333333e+01 3300 2683 2.1331249999999997e+01 3300 2692 -5.3312499999999998e+00 3301 3301 4.2691666666666663e+01 3301 2729 5.3322916666666664e+00 3301 3583 1.0666666666666666e+01 3301 2734 -1.0668750000000001e+01 3301 3298 2.1331249999999997e+01 3301 3297 -1.0666666666666666e+01 3301 2740 5.3322916666666664e+00 3301 2742 -1.0668750000000001e+01 3302 3302 3.2020833333333336e+01 3303 3303 3.2020833333333336e+01 3304 3304 4.2691666666666663e+01 3304 2683 5.3322916666666664e+00 3304 3299 2.1331249999999997e+01 3304 3297 -1.0666666666666666e+01 3304 2729 5.3322916666666664e+00 3304 2731 -6.2500000000000003e-03 3304 2735 5.3322916666666664e+00 3304 2734 -1.0668750000000001e+01 3304 2684 -6.2500000000000003e-03 3304 3240 2.1331249999999997e+01 3304 3236 -1.0666666666666666e+01 3304 2676 5.3322916666666664e+00 3304 2692 -1.0668750000000001e+01 3305 3305 5.3374999999999993e+01 3305 2732 -2.1705219273391446e-19 3305 2697 2.1705219273391446e-19 3305 3306 -1.0656249999999998e+01 3305 3502 -1.0666666666666666e+01 3305 2684 1.0657291666666666e+01 3305 2696 -1.5998958333333331e+01 3305 2682 5.3312499999999998e+00 3305 3291 2.1331249999999997e+01 3305 3287 -1.0658333333333333e+01 3305 2731 1.0657291666666666e+01 3305 2722 -1.5998958333333331e+01 3305 2728 5.3312499999999998e+00 3306 3306 5.3375000000000000e+01 3306 2675 5.3312499999999998e+00 3306 3235 2.1331249999999997e+01 3306 3230 -1.0658333333333333e+01 3306 2738 5.3312499999999998e+00 3306 2722 -5.0116116045879435e-20 3306 2731 1.0657291666666666e+01 3306 2732 -1.5998958333333333e+01 3306 2696 2.1705219273391446e-19 3306 3305 -1.0656249999999998e+01 3306 3502 1.0666666666666666e+01 3306 2684 1.0657291666666666e+01 3306 2697 -1.5998958333333333e+01 3307 3307 3.2020833333333336e+01 3308 3308 5.3375000000000000e+01 3308 2728 2.7052114752934217e-20 3308 3281 3.2002083333333331e+01 3308 3287 -2.1329166666666666e+01 3308 2710 1.0662500000000000e+01 3308 2721 -5.3343749999999996e+00 3308 2896 6.2499999999999986e-03 3308 3518 1.0666666666666664e+01 3308 2722 -5.3322916666666664e+00 3308 3514 1.0666666666666666e+01 3309 3309 2.1354166666666668e+01 3310 3310 4.2691666666666663e+01 3311 3311 3.2020833333333336e+01 3312 3312 6.4041666666666671e+01 3312 2565 -5.3312499999999998e+00 3312 2753 -5.3312499999999998e+00 3312 3547 -2.1331249999999997e+01 3312 3313 -1.0658333333333333e+01 3312 2581 -1.0658333333333333e+01 3312 2580 2.1331249999999997e+01 3312 2579 -5.3312499999999998e+00 3312 3257 -2.1331249999999997e+01 3312 3256 1.0658333333333333e+01 3312 2752 -1.0658333333333333e+01 3312 2751 2.1331249999999997e+01 3312 2750 -5.3312499999999998e+00 3313 3313 4.2733333333333334e+01 3313 2645 1.0416666666666669e-03 3313 2686 1.0416666666666669e-03 3313 2643 1.0416666666666667e-03 3313 2644 -6.2500000000000003e-03 3313 2647 4.1666666666666666e-03 3313 3315 -1.0658333333333333e+01 3313 3323 -1.0666666666666666e+01 3313 2572 1.0416666666666669e-03 3313 2752 1.0416666666666669e-03 3313 2581 1.0416666666666667e-03 3313 2580 -6.2500000000000003e-03 3313 2579 4.1666666666666666e-03 3313 3312 -1.0658333333333333e+01 3313 3547 1.0666666666666666e+01 3313 2680 1.0416666666666667e-03 3313 2685 -6.2500000000000003e-03 3313 2687 4.1666666666666666e-03 3313 3273 1.0658333333333333e+01 3313 3272 -1.0666666666666666e+01 3313 2754 1.0416666666666667e-03 3313 2751 -6.2500000000000003e-03 3313 2753 4.1666666666666666e-03 3313 3314 -1.0658333333333333e+01 3313 3316 -1.0666666666666666e+01 3314 3314 6.4041666666666671e+01 3314 2647 -5.3312499999999998e+00 3314 2750 -5.3312499999999998e+00 3314 3261 -2.1331249999999997e+01 3314 3256 1.0658333333333333e+01 3314 2645 -1.0658333333333333e+01 3314 2644 2.1331249999999997e+01 3314 2642 -5.3312499999999998e+00 3314 3316 2.1331249999999997e+01 3314 3313 -1.0658333333333333e+01 3314 2754 -1.0658333333333333e+01 3314 2751 2.1331249999999997e+01 3314 2753 -5.3312499999999998e+00 3315 3315 6.4041666666666671e+01 3315 2687 -5.3312499999999998e+00 3315 3323 2.1331249999999997e+01 3315 3313 -1.0658333333333333e+01 3315 2647 -5.3312499999999998e+00 3315 2643 -1.0658333333333333e+01 3315 2644 2.1331249999999997e+01 3315 2642 -5.3312499999999998e+00 3315 3258 -2.1331249999999997e+01 3315 3256 1.0658333333333333e+01 3315 2686 -1.0658333333333333e+01 3315 2685 2.1331249999999997e+01 3315 2678 -5.3312499999999998e+00 3316 3316 4.2691666666666663e+01 3316 2644 5.3322916666666664e+00 3316 2764 5.3322916666666664e+00 3316 2645 -6.2500000000000003e-03 3316 3319 -2.1331249999999997e+01 3316 3543 1.0666666666666666e+01 3316 2650 5.3322916666666664e+00 3316 2647 -1.0668750000000001e+01 3316 2754 -6.2500000000000003e-03 3316 3314 2.1331249999999997e+01 3316 3313 -1.0666666666666666e+01 3316 2751 5.3322916666666664e+00 3316 2753 -1.0668750000000001e+01 3317 3317 4.2691666666666663e+01 3317 2659 5.3322916666666664e+00 3317 2759 5.3322916666666664e+00 3317 2645 -6.2500000000000003e-03 3317 3220 2.1331249999999997e+01 3317 3219 -1.0666666666666666e+01 3317 2634 5.3322916666666664e+00 3317 2651 -1.0668750000000001e+01 3317 2754 -6.2500000000000003e-03 3317 3318 -2.1331249999999997e+01 3317 3662 1.0666666666666666e+01 3317 2758 5.3322916666666664e+00 3317 2757 -1.0668750000000001e+01 3318 3318 6.4041666666666671e+01 3318 2651 5.3312499999999998e+00 3318 2766 5.3312499999999998e+00 3318 3320 -2.1331249999999997e+01 3318 3692 -1.0658333333333333e+01 3318 2645 1.0658333333333333e+01 3318 2659 -2.1331249999999997e+01 3318 2658 5.3312499999999998e+00 3318 3317 -2.1331249999999997e+01 3318 3662 -1.0658333333333333e+01 3318 2754 1.0658333333333333e+01 3318 2758 -2.1331249999999997e+01 3318 2757 5.3312499999999998e+00 3319 3319 6.4041666666666671e+01 3319 2658 5.3312499999999998e+00 3319 3320 -2.1331249999999997e+01 3319 3622 1.0658333333333333e+01 3319 2766 5.3312499999999998e+00 3319 2754 1.0658333333333333e+01 3319 2764 -2.1331249999999997e+01 3319 2753 5.3312499999999998e+00 3319 3316 -2.1331249999999997e+01 3319 3543 -1.0658333333333333e+01 3319 2645 1.0658333333333333e+01 3319 2650 -2.1331249999999997e+01 3319 2647 5.3312499999999998e+00 3320 3320 4.2691666666666663e+01 3320 2650 5.3322916666666664e+00 3320 3319 -2.1331249999999997e+01 3320 3622 -1.0666666666666666e+01 3320 2764 5.3322916666666664e+00 3320 2754 -6.2500000000000003e-03 3320 2758 5.3322916666666664e+00 3320 2766 -1.0668750000000001e+01 3320 2645 -6.2500000000000003e-03 3320 3318 -2.1331249999999997e+01 3320 3692 1.0666666666666666e+01 3320 2659 5.3322916666666664e+00 3320 2658 -1.0668750000000001e+01 3321 3321 7.4712500000000020e+01 3321 2697 5.3281250000000000e+00 3321 3322 -2.1329166666666666e+01 3321 3502 -1.0658333333333331e+01 3321 2646 5.3322916666666664e+00 3321 2643 2.1326041666666665e+01 3321 2636 -3.1999999999999996e+01 3321 2640 5.3312499999999998e+00 3321 3295 2.1331249999999997e+01 3321 3287 -1.0658333333333333e+01 3321 2686 1.0653124999999999e+01 3321 2696 -2.1333333333333329e+01 3321 2682 5.3312499999999998e+00 3322 3322 4.2699999999999996e+01 3322 2696 -4.0939925783957855e-21 3322 3321 -2.1329166666666666e+01 3322 3502 1.0666666666666668e+01 3322 2636 1.0662500000000000e+01 3322 2643 -1.0683333333333334e+01 3322 2633 1.0662500000000000e+01 3322 2646 -1.0672916666666666e+01 3322 2698 1.6284208410963924e-19 3322 3208 2.1329166666666666e+01 3322 3205 -1.0666666666666664e+01 3322 2686 1.0662500000000000e+01 3322 2697 -1.0672916666666666e+01 3323 3323 4.2691666666666663e+01 3323 2685 5.3322916666666664e+00 3323 3315 2.1331249999999997e+01 3323 3313 -1.0666666666666666e+01 3323 2644 5.3322916666666664e+00 3323 2643 -6.2500000000000003e-03 3323 2648 5.3322916666666664e+00 3323 2647 -1.0668750000000001e+01 3323 2686 -6.2500000000000003e-03 3323 3324 -2.1331249999999997e+01 3323 3541 1.0666666666666666e+01 3323 2695 5.3322916666666664e+00 3323 2687 -1.0668750000000001e+01 3324 3324 6.4041666666666671e+01 3324 2682 5.3312499999999998e+00 3324 3295 2.1331249999999997e+01 3324 3289 -1.0658333333333333e+01 3324 2640 5.3312499999999998e+00 3324 2643 1.0658333333333333e+01 3324 2648 -2.1331249999999997e+01 3324 2647 5.3312499999999998e+00 3324 3323 -2.1331249999999997e+01 3324 3541 -1.0658333333333333e+01 3324 2686 1.0658333333333333e+01 3324 2695 -2.1331249999999997e+01 3324 2687 5.3312499999999998e+00 3325 3325 4.2691666666666663e+01 3325 2409 6.2500000000000003e-03 3325 2410 1.0668749999999999e+01 3325 2760 6.2500000000000003e-03 3325 2765 1.0668749999999999e+01 3325 2763 -5.3322916666666664e+00 3325 3278 -2.1331249999999997e+01 3325 3277 1.0666666666666666e+01 3325 2411 -5.3322916666666664e+00 3325 3778 -5.3322916666666664e+00 3325 4864 -2.1331249999999997e+01 3325 4865 1.0666666666666666e+01 3325 3870 -5.3322916666666664e+00 3326 3326 4.2691666666666663e+01 3326 2760 6.2500000000000003e-03 3326 2757 1.0668749999999999e+01 3326 2409 6.2500000000000003e-03 3326 2408 -5.3322916666666664e+00 3326 3218 -2.1331249999999997e+01 3326 3219 1.0666666666666666e+01 3326 2759 -5.3322916666666664e+00 3326 3871 -5.3322916666666664e+00 3326 4866 2.1331249999999997e+01 3326 4889 1.0666666666666666e+01 3326 3779 -5.3322916666666664e+00 3326 288 1.0668749999999999e+01 3327 3327 4.2733333333333334e+01 3327 2982 -4.1666666666666666e-03 3327 3332 -1.0666666666666666e+01 3327 3336 -1.0666666666666666e+01 3327 2781 -4.1666666666666666e-03 3327 2797 -4.1666666666666666e-03 3327 3338 -1.0666666666666666e+01 3327 2606 -4.1666666666666666e-03 3327 3328 -1.0666666666666666e+01 3328 3328 4.2691666666666663e+01 3328 2609 -5.3322916666666664e+00 3328 3193 -2.1331249999999997e+01 3328 3191 1.0666666666666666e+01 3328 2806 -5.3322916666666664e+00 3328 2797 1.0668750000000001e+01 3328 3327 -1.0666666666666666e+01 3328 2606 1.0668750000000001e+01 3329 3329 4.2733333333333334e+01 3329 2578 -1.0416666666666669e-03 3329 2771 -1.0416666666666669e-03 3329 2575 -1.0416666666666667e-03 3329 2586 6.2500000000000003e-03 3329 2573 -4.1666666666666666e-03 3329 3346 1.0658333333333333e+01 3329 3339 -1.0666666666666666e+01 3329 2784 -1.0416666666666669e-03 3329 2782 6.2500000000000003e-03 3329 2781 -4.1666666666666666e-03 3329 3344 1.0658333333333333e+01 3329 3338 -1.0666666666666666e+01 3329 2769 -1.0416666666666667e-03 3329 2768 6.2500000000000003e-03 3329 2767 -4.1666666666666666e-03 3329 3345 1.0658333333333333e+01 3329 3337 -1.0666666666666666e+01 3329 2796 -1.0416666666666667e-03 3329 2798 6.2500000000000003e-03 3329 2797 -4.1666666666666666e-03 3329 3342 1.0658333333333333e+01 3329 3330 -1.0666666666666666e+01 3330 3330 4.2691666666666663e+01 3330 2586 -5.3322916666666664e+00 3330 2806 -5.3322916666666664e+00 3330 2578 6.2500000000000003e-03 3330 3194 -2.1331249999999997e+01 3330 3191 1.0666666666666666e+01 3330 2563 -5.3322916666666664e+00 3330 2573 1.0668750000000001e+01 3330 2796 6.2500000000000003e-03 3330 3342 -2.1331249999999997e+01 3330 3329 -1.0666666666666666e+01 3330 2798 -5.3322916666666664e+00 3330 2797 1.0668750000000001e+01 3331 3331 4.2733333333333334e+01 3331 2618 -4.1666666666666666e-03 3331 3187 1.0666666666666666e+01 3331 3334 -1.0666666666666666e+01 3331 2973 -4.1666666666666666e-03 3331 2982 -4.1666666666666666e-03 3331 3341 -1.0666666666666666e+01 3331 2606 -4.1666666666666666e-03 3331 3332 -1.0666666666666666e+01 3332 3332 4.2691666666666663e+01 3332 3327 -1.0666666666666666e+01 3332 2982 1.0668750000000001e+01 3332 3331 -1.0666666666666666e+01 3332 2606 1.0668750000000001e+01 3333 3333 4.2733333333333334e+01 3333 2776 -1.0416666666666669e-03 3333 2971 -1.0416666666666667e-03 3333 2969 6.2500000000000003e-03 3333 2973 -4.1666666666666666e-03 3333 3361 1.0658333333333333e+01 3333 3340 -1.0666666666666666e+01 3333 2575 -1.0416666666666669e-03 3333 2622 -1.0416666666666669e-03 3333 2564 -1.0416666666666667e-03 3333 2574 6.2500000000000003e-03 3333 2573 -4.1666666666666666e-03 3333 3196 -1.0658333333333333e+01 3333 3197 1.0666666666666666e+01 3333 2771 -1.0416666666666667e-03 3333 2770 6.2500000000000003e-03 3333 2767 -4.1666666666666666e-03 3333 3360 1.0658333333333333e+01 3333 3339 -1.0666666666666666e+01 3333 2619 6.2500000000000003e-03 3333 2618 -4.1666666666666666e-03 3333 3358 1.0658333333333333e+01 3333 3334 -1.0666666666666666e+01 3334 3334 4.2691666666666663e+01 3334 2969 -5.3322916666666664e+00 3334 3331 -1.0666666666666666e+01 3334 2973 1.0668750000000001e+01 3334 3358 -2.1331249999999997e+01 3334 3333 -1.0666666666666666e+01 3334 2619 -5.3322916666666664e+00 3334 2618 1.0668750000000001e+01 3335 3335 4.2733333333333334e+01 3335 2769 -1.0416666666666669e-03 3335 2784 -1.0416666666666667e-03 3335 2787 6.2500000000000003e-03 3335 2781 -4.1666666666666666e-03 3335 3351 -1.0658333333333333e+01 3335 3337 -1.0666666666666666e+01 3335 2971 -1.0416666666666669e-03 3335 2974 6.2500000000000003e-03 3335 2973 -4.1666666666666666e-03 3335 3642 1.0658333333333333e+01 3335 3341 -1.0666666666666666e+01 3335 2776 -1.0416666666666667e-03 3335 2777 6.2500000000000003e-03 3335 2767 -4.1666666666666666e-03 3335 3639 -1.0658333333333333e+01 3335 3340 -1.0666666666666666e+01 3335 2980 6.2500000000000003e-03 3335 2982 -4.1666666666666666e-03 3335 3643 1.0658333333333333e+01 3335 3336 -1.0666666666666666e+01 3336 3336 4.2691666666666663e+01 3336 2787 -5.3322916666666664e+00 3336 3327 -1.0666666666666666e+01 3336 2781 1.0668750000000001e+01 3336 3643 -2.1331249999999997e+01 3336 3335 -1.0666666666666666e+01 3336 2980 -5.3322916666666664e+00 3336 2982 1.0668750000000001e+01 3337 3337 4.2691666666666663e+01 3337 2777 -5.3322916666666664e+00 3337 3351 2.1331249999999997e+01 3337 3335 -1.0666666666666666e+01 3337 2787 -5.3322916666666664e+00 3337 2784 6.2500000000000003e-03 3337 2782 -5.3322916666666664e+00 3337 2781 1.0668750000000001e+01 3337 2769 6.2500000000000003e-03 3337 3345 -2.1331249999999997e+01 3337 3329 -1.0666666666666666e+01 3337 2768 -5.3322916666666664e+00 3337 2767 1.0668750000000001e+01 3338 3338 4.2691666666666663e+01 3338 3327 -1.0666666666666666e+01 3338 2798 -5.3322916666666664e+00 3338 2797 1.0668750000000001e+01 3338 3344 -2.1331249999999997e+01 3338 3329 -1.0666666666666666e+01 3338 2782 -5.3322916666666664e+00 3338 2781 1.0668750000000001e+01 3339 3339 4.2691666666666663e+01 3339 2768 -5.3322916666666664e+00 3339 3346 -2.1331249999999997e+01 3339 3329 -1.0666666666666666e+01 3339 2586 -5.3322916666666664e+00 3339 2575 6.2500000000000003e-03 3339 2574 -5.3322916666666664e+00 3339 2573 1.0668750000000001e+01 3339 2771 6.2500000000000003e-03 3339 3360 -2.1331249999999997e+01 3339 3333 -1.0666666666666666e+01 3339 2770 -5.3322916666666664e+00 3339 2767 1.0668750000000001e+01 3340 3340 4.2691666666666663e+01 3340 2770 -5.3322916666666664e+00 3340 3361 -2.1331249999999997e+01 3340 3333 -1.0666666666666666e+01 3340 2969 -5.3322916666666664e+00 3340 2971 6.2500000000000003e-03 3340 2974 -5.3322916666666664e+00 3340 2973 1.0668750000000001e+01 3340 2776 6.2500000000000003e-03 3340 3639 2.1331249999999997e+01 3340 3335 -1.0666666666666666e+01 3340 2777 -5.3322916666666664e+00 3340 2767 1.0668750000000001e+01 3341 3341 4.2691666666666663e+01 3341 3331 -1.0666666666666666e+01 3341 2980 -5.3322916666666664e+00 3341 2982 1.0668750000000001e+01 3341 3642 -2.1331249999999997e+01 3341 3335 -1.0666666666666666e+01 3341 2974 -5.3322916666666664e+00 3341 2973 1.0668750000000001e+01 3342 3342 6.4041666666666671e+01 3342 2573 -5.3312499999999998e+00 3342 2799 -5.3312499999999998e+00 3342 3596 2.1331249999999997e+01 3342 3343 -1.0658333333333333e+01 3342 2578 -1.0658333333333333e+01 3342 2586 2.1331249999999997e+01 3342 2585 -5.3312499999999998e+00 3342 3330 -2.1331249999999997e+01 3342 3329 1.0658333333333333e+01 3342 2796 -1.0658333333333333e+01 3342 2798 2.1331249999999997e+01 3342 2797 -5.3312499999999998e+00 3343 3343 4.2733333333333334e+01 3343 2769 1.0416666666666669e-03 3343 2784 1.0416666666666667e-03 3343 2782 -6.2500000000000003e-03 3343 2790 4.1666666666666666e-03 3343 3345 -1.0658333333333333e+01 3343 3352 1.0666666666666666e+01 3343 2575 1.0416666666666669e-03 3343 2796 1.0416666666666669e-03 3343 2578 1.0416666666666667e-03 3343 2586 -6.2500000000000003e-03 3343 2585 4.1666666666666666e-03 3343 3342 -1.0658333333333333e+01 3343 3596 -1.0666666666666666e+01 3343 2771 1.0416666666666667e-03 3343 2768 -6.2500000000000003e-03 3343 2774 4.1666666666666666e-03 3343 3346 -1.0658333333333333e+01 3343 3364 -1.0666666666666666e+01 3343 2798 -6.2500000000000003e-03 3343 2799 4.1666666666666666e-03 3343 3344 -1.0658333333333333e+01 3343 3347 -1.0666666666666666e+01 3344 3344 6.4041666666666671e+01 3344 2790 -5.3312499999999998e+00 3344 2797 -5.3312499999999998e+00 3344 3338 -2.1331249999999997e+01 3344 3329 1.0658333333333333e+01 3344 2782 2.1331249999999997e+01 3344 2781 -5.3312499999999998e+00 3344 3347 2.1331249999999997e+01 3344 3343 -1.0658333333333333e+01 3344 2798 2.1331249999999997e+01 3344 2799 -5.3312499999999998e+00 3345 3345 6.4041666666666671e+01 3345 2774 -5.3312499999999998e+00 3345 3352 -2.1331249999999997e+01 3345 3343 -1.0658333333333333e+01 3345 2790 -5.3312499999999998e+00 3345 2784 -1.0658333333333333e+01 3345 2782 2.1331249999999997e+01 3345 2781 -5.3312499999999998e+00 3345 3337 -2.1331249999999997e+01 3345 3329 1.0658333333333333e+01 3345 2769 -1.0658333333333333e+01 3345 2768 2.1331249999999997e+01 3345 2767 -5.3312499999999998e+00 3346 3346 6.4041666666666671e+01 3346 2767 -5.3312499999999998e+00 3346 3339 -2.1331249999999997e+01 3346 3329 1.0658333333333333e+01 3346 2573 -5.3312499999999998e+00 3346 2575 -1.0658333333333333e+01 3346 2586 2.1331249999999997e+01 3346 2585 -5.3312499999999998e+00 3346 3364 2.1331249999999997e+01 3346 3343 -1.0658333333333333e+01 3346 2771 -1.0658333333333333e+01 3346 2768 2.1331249999999997e+01 3346 2774 -5.3312499999999998e+00 3347 3347 4.2691666666666663e+01 3347 2782 5.3322916666666664e+00 3347 3629 1.0666666666666666e+01 3347 2790 -1.0668750000000001e+01 3347 3344 2.1331249999999997e+01 3347 3343 -1.0666666666666666e+01 3347 2798 5.3322916666666664e+00 3347 2799 -1.0668750000000001e+01 3348 3348 3.2020833333333336e+01 3349 3349 3.2020833333333336e+01 3350 3350 4.2691666666666663e+01 3350 2769 6.2500000000000003e-03 3350 2778 1.0668749999999999e+01 3350 2784 6.2500000000000003e-03 3350 2786 1.0668749999999999e+01 3350 2787 -5.3322916666666664e+00 3350 3351 2.1331249999999997e+01 3350 3641 1.0666666666666666e+01 3350 2777 -5.3322916666666664e+00 3350 3875 -5.3322916666666664e+00 3350 4582 -2.1331249999999997e+01 3350 4550 -1.0666666666666666e+01 3350 4275 -5.3322916666666664e+00 3351 3351 6.4041666666666671e+01 3351 2767 5.3312499999999998e+00 3351 3337 2.1331249999999997e+01 3351 3335 -1.0658333333333333e+01 3351 2781 5.3312499999999998e+00 3351 2784 1.0658333333333333e+01 3351 2787 -2.1331249999999997e+01 3351 2786 5.3312499999999998e+00 3351 3350 2.1331249999999997e+01 3351 3641 1.0658333333333333e+01 3351 2769 1.0658333333333333e+01 3351 2777 -2.1331249999999997e+01 3351 2778 5.3312499999999998e+00 3352 3352 4.2691666666666663e+01 3352 2784 6.2500000000000003e-03 3352 2790 1.0668749999999999e+01 3352 2769 6.2500000000000003e-03 3352 2774 1.0668749999999999e+01 3352 2768 -5.3322916666666664e+00 3352 3345 -2.1331249999999997e+01 3352 3343 1.0666666666666666e+01 3352 2782 -5.3322916666666664e+00 3352 4278 -5.3322916666666664e+00 3352 4932 2.1331249999999997e+01 3352 4528 -1.0666666666666666e+01 3352 3882 -5.3322916666666664e+00 3353 3353 3.2020833333333336e+01 3354 3354 3.2020833333333336e+01 3355 3355 3.2020833333333336e+01 3356 3356 4.2691666666666663e+01 3356 2806 5.3322916666666664e+00 3356 3566 1.0666666666666666e+01 3356 2792 -1.0668750000000001e+01 3356 3193 2.1331249999999997e+01 3356 3192 -1.0666666666666666e+01 3356 2609 5.3322916666666664e+00 3356 2611 -1.0668750000000001e+01 3357 3357 3.2020833333333336e+01 3358 3358 6.4041666666666671e+01 3358 2973 -5.3312499999999998e+00 3358 2621 -5.3312499999999998e+00 3358 3634 -2.1331249999999997e+01 3358 3359 -1.0658333333333333e+01 3358 2969 2.1331249999999997e+01 3358 2968 -5.3312499999999998e+00 3358 3334 -2.1331249999999997e+01 3358 3333 1.0658333333333333e+01 3358 2619 2.1331249999999997e+01 3358 2618 -5.3312499999999998e+00 3359 3359 4.2733333333333334e+01 3359 2564 1.0416666666666669e-03 3359 2771 1.0416666666666669e-03 3359 2575 1.0416666666666667e-03 3359 2574 -6.2500000000000003e-03 3359 2587 4.1666666666666666e-03 3359 3360 -1.0658333333333333e+01 3359 3365 -1.0666666666666666e+01 3359 2971 1.0416666666666669e-03 3359 2969 -6.2500000000000003e-03 3359 2968 4.1666666666666666e-03 3359 3358 -1.0658333333333333e+01 3359 3634 1.0666666666666666e+01 3359 2776 1.0416666666666667e-03 3359 2770 -6.2500000000000003e-03 3359 2775 4.1666666666666666e-03 3359 3361 -1.0658333333333333e+01 3359 3633 1.0666666666666666e+01 3359 2622 1.0416666666666667e-03 3359 2619 -6.2500000000000003e-03 3359 2621 4.1666666666666666e-03 3359 3196 1.0658333333333333e+01 3359 3195 -1.0666666666666666e+01 3360 3360 6.4041666666666671e+01 3360 2775 -5.3312499999999998e+00 3360 3365 2.1331249999999997e+01 3360 3359 -1.0658333333333333e+01 3360 2587 -5.3312499999999998e+00 3360 2575 -1.0658333333333333e+01 3360 2574 2.1331249999999997e+01 3360 2573 -5.3312499999999998e+00 3360 3339 -2.1331249999999997e+01 3360 3333 1.0658333333333333e+01 3360 2771 -1.0658333333333333e+01 3360 2770 2.1331249999999997e+01 3360 2767 -5.3312499999999998e+00 3361 3361 6.4041666666666671e+01 3361 2767 -5.3312499999999998e+00 3361 3340 -2.1331249999999997e+01 3361 3333 1.0658333333333333e+01 3361 2973 -5.3312499999999998e+00 3361 2971 -1.0658333333333333e+01 3361 2969 2.1331249999999997e+01 3361 2968 -5.3312499999999998e+00 3361 3633 -2.1331249999999997e+01 3361 3359 -1.0658333333333333e+01 3361 2776 -1.0658333333333333e+01 3361 2770 2.1331249999999997e+01 3361 2775 -5.3312499999999998e+00 3362 3362 4.2691666666666663e+01 3362 2779 5.3322916666666664e+00 3362 3366 -2.1331249999999997e+01 3362 3624 1.0666666666666666e+01 3362 2588 5.3322916666666664e+00 3362 2575 -6.2500000000000003e-03 3362 2584 5.3322916666666664e+00 3362 2583 -1.0668750000000001e+01 3362 2771 -6.2500000000000003e-03 3362 3363 -2.1331249999999997e+01 3362 3625 1.0666666666666666e+01 3362 2773 5.3322916666666664e+00 3362 2772 -1.0668750000000001e+01 3363 3363 6.4041666666666671e+01 3363 2774 5.3312499999999998e+00 3363 3364 -2.1331249999999997e+01 3363 3628 -1.0658333333333333e+01 3363 2585 5.3312499999999998e+00 3363 2575 1.0658333333333333e+01 3363 2584 -2.1331249999999997e+01 3363 2583 5.3312499999999998e+00 3363 3362 -2.1331249999999997e+01 3363 3625 -1.0658333333333333e+01 3363 2771 1.0658333333333333e+01 3363 2773 -2.1331249999999997e+01 3363 2772 5.3312499999999998e+00 3364 3364 4.2691666666666663e+01 3364 2773 5.3322916666666664e+00 3364 3363 -2.1331249999999997e+01 3364 3628 1.0666666666666666e+01 3364 2584 5.3322916666666664e+00 3364 2575 -6.2500000000000003e-03 3364 2586 5.3322916666666664e+00 3364 2585 -1.0668750000000001e+01 3364 2771 -6.2500000000000003e-03 3364 3346 2.1331249999999997e+01 3364 3343 -1.0666666666666666e+01 3364 2768 5.3322916666666664e+00 3364 2774 -1.0668750000000001e+01 3365 3365 4.2691666666666663e+01 3365 2770 5.3322916666666664e+00 3365 3360 2.1331249999999997e+01 3365 3359 -1.0666666666666666e+01 3365 2574 5.3322916666666664e+00 3365 2575 -6.2500000000000003e-03 3365 2588 5.3322916666666664e+00 3365 2587 -1.0668750000000001e+01 3365 2771 -6.2500000000000003e-03 3365 3366 -2.1331249999999997e+01 3365 3631 1.0666666666666666e+01 3365 2779 5.3322916666666664e+00 3365 2775 -1.0668750000000001e+01 3366 3366 6.4041666666666671e+01 3366 2772 5.3312499999999998e+00 3366 3362 -2.1331249999999997e+01 3366 3624 -1.0658333333333333e+01 3366 2583 5.3312499999999998e+00 3366 2575 1.0658333333333333e+01 3366 2588 -2.1331249999999997e+01 3366 2587 5.3312499999999998e+00 3366 3365 -2.1331249999999997e+01 3366 3631 -1.0658333333333333e+01 3366 2771 1.0658333333333333e+01 3366 2779 -2.1331249999999997e+01 3366 2775 5.3312499999999998e+00 3367 3367 6.4058333333333323e+01 3367 2835 -5.3281250000000000e+00 3367 3388 -3.2002083333333331e+01 3367 3369 -2.1320833333333333e+01 3367 2813 -5.3322916666666664e+00 3367 2670 -1.0416666666666669e-03 3367 2834 -1.0416666666666669e-03 3367 2832 5.3291666666666666e+00 3367 2668 -1.0416666666666667e-03 3367 2669 6.2500000000000003e-03 3367 2660 -4.1666666666666666e-03 3367 3385 1.0658333333333333e+01 3367 3377 -1.0666666666666666e+01 3367 2810 -1.0416666666666667e-03 3367 2809 1.5995833333333334e+01 3367 3387 1.0658333333333333e+01 3367 3368 -1.0666666666666666e+01 3367 1446 1.0416666666666666e-02 3367 1645 -1.0662499999999998e+01 3368 3368 4.2691666666666663e+01 3368 2811 -5.3322916666666664e+00 3368 3389 2.1331249999999997e+01 3368 3371 -1.0666666666666666e+01 3368 2672 -5.3322916666666664e+00 3368 2670 6.2500000000000003e-03 3368 2669 -5.3322916666666664e+00 3368 2660 1.0668750000000001e+01 3368 2810 6.2500000000000003e-03 3368 3387 -2.1331249999999997e+01 3368 3367 -1.0666666666666666e+01 3368 2809 1.0668750000000001e+01 3368 1645 -5.3322916666666664e+00 3369 3369 6.4091666666666654e+01 3369 2813 2.0833333333333342e-03 3369 3388 2.1329166666666666e+01 3369 3367 -2.1320833333333333e+01 3369 2809 -1.0683333333333334e+01 3369 2823 6.2500000000000003e-03 3369 2821 -4.1666666666666666e-03 3369 3392 1.0658333333333333e+01 3369 3378 -1.0666666666666666e+01 3369 2835 1.0416666666666666e-02 3369 2832 5.3291666666666666e+00 3369 3386 1.0658333333333333e+01 3369 3376 -1.0666666666666666e+01 3369 2837 1.0416666666666664e-02 3369 3391 2.1329166666666669e+01 3369 3370 -2.1320833333333333e+01 3369 2836 5.3291666666666666e+00 3369 1446 -5.3281250000000000e+00 3369 1645 5.3302083333333332e+00 3369 1646 -1.0416666666666669e-03 3369 1251 -1.0416666666666669e-03 3369 1648 -1.0416666666666667e-03 3369 1458 -1.0416666666666667e-03 3370 3370 6.4058333333333337e+01 3370 2893 -4.1666666666666666e-03 3370 3372 -1.0666666666666666e+01 3370 3375 -1.0666666666666666e+01 3370 2813 -5.3322916666666664e+00 3370 2809 1.5995833333333334e+01 3370 3391 -3.2002083333333331e+01 3370 3369 -2.1320833333333333e+01 3370 2837 -5.3281250000000000e+00 3370 2836 5.3291666666666666e+00 3371 3371 4.2733333333333334e+01 3371 2662 -1.0416666666666669e-03 3371 2810 -1.0416666666666669e-03 3371 2670 -1.0416666666666667e-03 3371 2672 6.2500000000000003e-03 3371 2660 -4.1666666666666666e-03 3371 3389 -1.0658333333333333e+01 3371 3368 -1.0666666666666666e+01 3371 2635 -1.0416666666666667e-03 3371 3223 -1.0658333333333333e+01 3371 3221 1.0666666666666666e+01 3371 2638 -1.0416666666666669e-03 3371 2637 6.2500000000000003e-03 3371 2654 -4.1666666666666666e-03 3371 2892 -1.0416666666666667e-03 3371 2899 6.2500000000000003e-03 3371 2893 -4.1666666666666666e-03 3371 3524 1.0658333333333333e+01 3371 3380 -1.0666666666666666e+01 3371 2811 6.2500000000000003e-03 3371 2809 -4.1666666666666666e-03 3371 3523 -1.0658333333333333e+01 3371 3372 -1.0666666666666666e+01 3372 3372 4.2691666666666663e+01 3372 3370 -1.0666666666666666e+01 3372 2899 -5.3322916666666664e+00 3372 2893 1.0668750000000001e+01 3372 3523 2.1331249999999997e+01 3372 3371 -1.0666666666666666e+01 3372 2811 -5.3322916666666664e+00 3372 2809 1.0668750000000001e+01 3373 3373 4.2733333333333334e+01 3373 2635 -1.0416666666666669e-03 3373 2824 -1.0416666666666669e-03 3373 2653 -1.0416666666666667e-03 3373 2652 6.2500000000000003e-03 3373 2654 -4.1666666666666666e-03 3373 3384 1.0658333333333333e+01 3373 3379 -1.0666666666666666e+01 3373 2668 -1.0416666666666669e-03 3373 2834 -1.0416666666666667e-03 3373 2833 6.2500000000000003e-03 3373 2832 -4.1666666666666666e-03 3373 3382 1.0658333333333333e+01 3373 3377 -1.0666666666666666e+01 3373 2822 6.2500000000000003e-03 3373 2821 -4.1666666666666666e-03 3373 3381 1.0658333333333333e+01 3373 3376 -1.0666666666666666e+01 3373 2662 -1.0416666666666667e-03 3373 2661 6.2500000000000003e-03 3373 2660 -4.1666666666666666e-03 3373 3222 -1.0658333333333333e+01 3373 3221 1.0666666666666666e+01 3373 1458 -1.0416666666666669e-03 3373 1646 -1.0416666666666667e-03 3374 3374 4.2733333333333334e+01 3374 2840 6.2500000000000003e-03 3374 2836 -4.1666666666666666e-03 3374 3394 -1.0658333333333333e+01 3374 3378 -1.0666666666666666e+01 3374 2653 -1.0416666666666669e-03 3374 2892 -1.0416666666666669e-03 3374 2638 -1.0416666666666667e-03 3374 2655 6.2500000000000003e-03 3374 2654 -4.1666666666666666e-03 3374 3526 -1.0658333333333333e+01 3374 3380 -1.0666666666666666e+01 3374 2824 -1.0416666666666667e-03 3374 2825 6.2500000000000003e-03 3374 2821 -4.1666666666666666e-03 3374 3664 -1.0658333333333333e+01 3374 3379 -1.0666666666666666e+01 3374 2891 6.2500000000000003e-03 3374 2893 -4.1666666666666666e-03 3374 3670 1.0658333333333333e+01 3374 3375 -1.0666666666666666e+01 3374 1648 -1.0416666666666669e-03 3374 1251 -1.0416666666666667e-03 3375 3375 4.2691666666666663e+01 3375 2840 -5.3322916666666664e+00 3375 3370 -1.0666666666666666e+01 3375 2836 1.0668750000000001e+01 3375 3670 -2.1331249999999997e+01 3375 3374 -1.0666666666666666e+01 3375 2891 -5.3322916666666664e+00 3375 2893 1.0668750000000001e+01 3376 3376 4.2691666666666663e+01 3376 2823 -5.3322916666666664e+00 3376 3386 -2.1331249999999997e+01 3376 3369 -1.0666666666666666e+01 3376 2835 -5.3322916666666664e+00 3376 2833 -5.3322916666666664e+00 3376 2832 1.0668750000000001e+01 3376 3381 -2.1331249999999997e+01 3376 3373 -1.0666666666666666e+01 3376 2822 -5.3322916666666664e+00 3376 2821 1.0668750000000001e+01 3376 1458 6.2500000000000003e-03 3376 1646 6.2500000000000003e-03 3377 3377 4.2691666666666663e+01 3377 3385 -2.1331249999999997e+01 3377 3367 -1.0666666666666666e+01 3377 2669 -5.3322916666666664e+00 3377 2668 6.2500000000000003e-03 3377 2661 -5.3322916666666664e+00 3377 2660 1.0668750000000001e+01 3377 2834 6.2500000000000003e-03 3377 3382 -2.1331249999999997e+01 3377 3373 -1.0666666666666666e+01 3377 2833 -5.3322916666666664e+00 3377 2832 1.0668750000000001e+01 3377 1446 -5.3322916666666664e+00 3378 3378 4.2691666666666663e+01 3378 2825 -5.3322916666666664e+00 3378 3394 2.1331249999999997e+01 3378 3374 -1.0666666666666666e+01 3378 2840 -5.3322916666666664e+00 3378 2837 -5.3322916666666664e+00 3378 2836 1.0668750000000001e+01 3378 3392 -2.1331249999999997e+01 3378 3369 -1.0666666666666666e+01 3378 2823 -5.3322916666666664e+00 3378 2821 1.0668750000000001e+01 3378 1251 6.2500000000000003e-03 3378 1648 6.2500000000000003e-03 3379 3379 4.2691666666666663e+01 3379 2822 -5.3322916666666664e+00 3379 3384 -2.1331249999999997e+01 3379 3373 -1.0666666666666666e+01 3379 2652 -5.3322916666666664e+00 3379 2653 6.2500000000000003e-03 3379 2655 -5.3322916666666664e+00 3379 2654 1.0668750000000001e+01 3379 2824 6.2500000000000003e-03 3379 3664 2.1331249999999997e+01 3379 3374 -1.0666666666666666e+01 3379 2825 -5.3322916666666664e+00 3379 2821 1.0668750000000001e+01 3380 3380 4.2691666666666663e+01 3380 2637 -5.3322916666666664e+00 3380 3524 -2.1331249999999997e+01 3380 3371 -1.0666666666666666e+01 3380 2899 -5.3322916666666664e+00 3380 2892 6.2500000000000003e-03 3380 2891 -5.3322916666666664e+00 3380 2893 1.0668750000000001e+01 3380 2638 6.2500000000000003e-03 3380 3526 2.1331249999999997e+01 3380 3374 -1.0666666666666666e+01 3380 2655 -5.3322916666666664e+00 3380 2654 1.0668750000000001e+01 3381 3381 6.4041666666666671e+01 3381 2822 2.1331249999999997e+01 3381 3383 1.0658333333333333e+01 3381 2833 2.1331249999999997e+01 3381 2832 -5.3312499999999998e+00 3381 3376 -2.1331249999999997e+01 3381 3373 1.0658333333333333e+01 3381 2821 -5.3312499999999998e+00 3381 1646 -1.0658333333333333e+01 3381 491 -5.3312499999999998e+00 3381 1013 -2.1331249999999997e+01 3381 1458 -1.0658333333333333e+01 3381 431 -5.3312499999999998e+00 3382 3382 6.4041666666666671e+01 3382 2834 -1.0658333333333333e+01 3382 2833 2.1331249999999997e+01 3382 3383 1.0658333333333333e+01 3382 2668 -1.0658333333333333e+01 3382 2661 2.1331249999999997e+01 3382 2674 -5.3312499999999998e+00 3382 2660 -5.3312499999999998e+00 3382 3377 -2.1331249999999997e+01 3382 3373 1.0658333333333333e+01 3382 2832 -5.3312499999999998e+00 3382 431 -5.3312499999999998e+00 3382 1012 -2.1331249999999997e+01 3383 3383 4.2733333333333327e+01 3383 2834 -1.0416666666666669e-03 3383 2822 6.2500000000000003e-03 3383 2833 6.2500000000000003e-03 3383 3381 1.0658333333333333e+01 3383 2668 -1.0416666666666667e-03 3383 2661 6.2500000000000003e-03 3383 2674 -4.1666666666666666e-03 3383 3382 1.0658333333333333e+01 3383 2653 -1.0416666666666669e-03 3383 2662 -1.0416666666666669e-03 3383 2635 -1.0416666666666667e-03 3383 2652 6.2500000000000003e-03 3383 2651 -4.1666666666666666e-03 3383 3222 -1.0658333333333333e+01 3383 3224 1.0666666666666666e+01 3383 2824 -1.0416666666666667e-03 3383 3384 1.0658333333333333e+01 3383 3663 -1.0666666666666666e+01 3383 1646 -1.0416666666666669e-03 3383 491 -4.1666666666666666e-03 3383 1458 -1.0416666666666667e-03 3383 431 -4.1666666666666666e-03 3383 1013 -1.0666666666666666e+01 3383 1012 -1.0666666666666666e+01 3384 3384 6.4041666666666671e+01 3384 2821 -5.3312499999999998e+00 3384 3379 -2.1331249999999997e+01 3384 3373 1.0658333333333333e+01 3384 2654 -5.3312499999999998e+00 3384 2653 -1.0658333333333333e+01 3384 2652 2.1331249999999997e+01 3384 2651 -5.3312499999999998e+00 3384 3663 -2.1331249999999997e+01 3384 3383 1.0658333333333333e+01 3384 2824 -1.0658333333333333e+01 3384 2822 2.1331249999999997e+01 3384 491 -5.3312499999999998e+00 3385 3385 6.4020833333541674e+01 3385 2668 -2.6624999999687500e+00 3385 2669 1.3332291666666665e+01 3385 2834 -2.6624999999687500e+00 3385 2832 -5.3312499999999998e+00 3385 3377 -2.1331249999999997e+01 3385 3367 1.0658333333333333e+01 3385 2660 -5.3312499999999998e+00 3385 331 5.3333333333124999e+00 3385 318 -5.3333333333124999e+00 3385 729 1.5999999999979167e+01 3385 326 5.3333333333124999e+00 3385 330 -5.3333333333958333e+00 3385 727 -1.5999999999979167e+01 3385 346 -5.3333333333333330e+00 3385 785 -1.5999999999979167e+01 3385 781 -1.5999999999979167e+01 3385 428 -5.3333333333124999e+00 3385 1446 1.3332291666666665e+01 3386 3386 5.3375000000000000e+01 3386 2835 1.5998958333333331e+01 3386 2823 1.5998958333333331e+01 3386 2821 -5.3312499999999998e+00 3386 3376 -2.1331249999999997e+01 3386 3369 1.0658333333333333e+01 3386 2832 -5.3312499999999998e+00 3386 1455 2.1705219273391446e-19 3386 1458 -1.0657291666666666e+01 3386 1647 -2.1705219273391446e-19 3386 2138 -1.0656249999999998e+01 3386 2134 1.0666666666666666e+01 3386 1646 -1.0657291666666666e+01 3387 3387 6.4020833333541674e+01 3387 2810 -2.6624999999687500e+00 3387 2670 -2.6624999999687500e+00 3387 2669 1.3332291666666665e+01 3387 2660 -5.3312499999999998e+00 3387 3368 -2.1331249999999997e+01 3387 3367 1.0658333333333333e+01 3387 2809 -5.3312499999999998e+00 3387 326 5.3333333333124999e+00 3387 148 -5.3333333333124999e+00 3387 1645 1.3332291666666665e+01 3387 732 1.5999999999979167e+01 3387 328 5.3333333333124999e+00 3387 330 -5.3333333333958333e+00 3387 730 1.5999999999979167e+01 3387 327 -5.3333333333333330e+00 3387 728 -1.5999999999979167e+01 3387 729 1.5999999999979167e+01 3387 318 -5.3333333333124999e+00 3388 3388 5.3375000000000000e+01 3388 2813 5.3343749999999996e+00 3388 2835 5.3322916666666664e+00 3388 2832 9.3703019790006975e-21 3388 3367 -3.2002083333333331e+01 3388 3369 2.1329166666666666e+01 3388 2809 -1.0662500000000000e+01 3388 1101 -3.2249014814734037e-20 3388 1645 1.0679166666666665e+01 3388 1107 -6.2499999999999986e-03 3388 2165 1.0658333333333331e+01 3388 2154 -1.0666666666666664e+01 3388 1112 -5.3322916666666664e+00 3388 1447 -4.9904357809065860e-20 3388 1446 -5.3322916666666664e+00 3388 2159 1.0666666666666666e+01 3388 2152 -1.0666666666666666e+01 3389 3389 7.4712499999999991e+01 3389 2809 5.3312499999999998e+00 3389 3368 2.1331249999999997e+01 3389 3371 -1.0658333333333333e+01 3389 2660 5.3312499999999998e+00 3389 2670 1.0653124999999999e+01 3389 2664 5.3281250000000000e+00 3389 2672 -2.1333333333333336e+01 3389 3210 2.1329166666666666e+01 3389 3202 -1.0658333333333331e+01 3389 2810 2.1326041666666665e+01 3389 2811 -3.2000000000000000e+01 3389 2820 5.3322916666666664e+00 3390 3390 7.4712500000000006e+01 3390 2670 -2.6541666666666663e+00 3390 2673 1.3334375000000000e+01 3390 2810 -1.3327083333333333e+01 3390 2819 2.4001041666666666e+01 3390 2820 -5.3322916666666664e+00 3390 3203 1.0658333333333331e+01 3390 3210 -2.1329166666666666e+01 3390 2664 -5.3281250000000000e+00 3390 199 5.3312499999999998e+00 3390 316 -5.3312499999999998e+00 3390 985 1.5997916666666667e+01 3390 205 5.3312499999999998e+00 3390 216 -5.3395833333333327e+00 3390 731 1.5997916666666665e+01 3390 206 -5.3333333333333330e+00 3390 620 -1.5997916666666667e+01 3390 619 1.5997916666666665e+01 3390 147 -5.3312499999999998e+00 3391 3391 5.3375000000000000e+01 3391 2837 5.3322916666666664e+00 3391 2813 5.3343749999999996e+00 3391 2809 -1.0662500000000000e+01 3391 2836 -2.0761130467597592e-20 3391 3370 -3.2002083333333331e+01 3391 3369 2.1329166666666669e+01 3391 1107 -6.2499999999999986e-03 3391 2151 -1.0666666666666666e+01 3391 2154 -1.0666666666666668e+01 3392 3392 7.4712500000000006e+01 3392 2823 2.1333333333333332e+01 3392 2837 3.1999999999999996e+01 3392 2836 -5.3312499999999998e+00 3392 3378 -2.1331249999999997e+01 3392 3369 1.0658333333333333e+01 3392 2821 -5.3312499999999998e+00 3392 1648 -1.0653124999999999e+01 3392 1647 -5.3281250000000000e+00 3392 2137 -2.1329166666666666e+01 3392 2134 1.0658333333333331e+01 3392 1251 -2.1326041666666665e+01 3392 1250 -5.3322916666666664e+00 3393 3393 4.2691666666666663e+01 3393 2827 5.3322916666666664e+00 3393 3395 2.1331249999999997e+01 3393 3672 1.0666666666666666e+01 3393 2844 5.3322916666666664e+00 3393 2840 5.3322916666666664e+00 3393 2839 -1.0668750000000001e+01 3393 3394 -2.1331249999999997e+01 3393 3669 -1.0666666666666666e+01 3393 2825 5.3322916666666664e+00 3393 2826 -1.0668750000000001e+01 3393 1251 -6.2500000000000003e-03 3393 1648 -6.2500000000000003e-03 3394 3394 6.4041666666666671e+01 3394 2821 5.3312499999999998e+00 3394 3378 2.1331249999999997e+01 3394 3374 -1.0658333333333333e+01 3394 2836 5.3312499999999998e+00 3394 2840 -2.1331249999999997e+01 3394 2839 5.3312499999999998e+00 3394 3393 -2.1331249999999997e+01 3394 3669 1.0658333333333333e+01 3394 2825 -2.1331249999999997e+01 3394 2826 5.3312499999999998e+00 3394 1251 1.0658333333333333e+01 3394 1648 1.0658333333333333e+01 3395 3395 6.4041666666666671e+01 3395 2844 2.1331249999999997e+01 3395 2827 2.1331249999999997e+01 3395 2826 -5.3312499999999998e+00 3395 3393 2.1331249999999997e+01 3395 3672 1.0658333333333333e+01 3395 2839 -5.3312499999999998e+00 3395 1251 -1.0658333333333333e+01 3395 4287 -5.3312499999999998e+00 3395 4947 -2.1331249999999997e+01 3395 4950 1.0658333333333333e+01 3395 1648 -1.0658333333333333e+01 3395 3963 -5.3312499999999998e+00 3396 3396 3.2020833333333336e+01 3397 3397 3.2020833333333336e+01 3398 3398 6.4029166666666669e+01 3398 2367 -5.3312499999999998e+00 3398 2864 1.4465734552327348e-19 3398 3415 2.1329166666666662e+01 3398 3401 -1.5997916666666667e+01 3398 2862 -1.4465734552327348e-19 3398 2863 -2.1329166666666662e+01 3398 2859 2.1334374999999998e+01 3398 2366 1.0416666666666664e-02 3398 3036 -2.1329166666666662e+01 3398 3035 1.5997916666666665e+01 3398 2364 1.0667708333333334e+01 3399 3399 6.4041666666666671e+01 3399 2391 5.3312499999999998e+00 3399 2354 -5.3312499999999998e+00 3399 3041 1.5997916666666667e+01 3399 2380 5.3312499999999998e+00 3399 2389 -5.3395833333333327e+00 3399 3042 -1.5997916666666665e+01 3399 2390 -5.3333333333333330e+00 3399 2861 5.3312499999999998e+00 3399 2853 -5.3312499999999998e+00 3399 3403 -1.5997916666666667e+01 3399 2860 5.3312499999999998e+00 3399 2859 -5.3395833333333327e+00 3399 3410 1.5997916666666665e+01 3399 2858 -5.3333333333333330e+00 3399 3409 1.5997916666666667e+01 3399 3404 -1.5997916666666665e+01 3399 2361 -5.3312499999999998e+00 3399 2360 5.3395833333333327e+00 3399 2359 5.3333333333333330e+00 3399 3406 1.5997916666666667e+01 3399 3400 -1.5997916666666665e+01 3399 2847 -5.3312499999999998e+00 3399 2846 5.3395833333333327e+00 3399 2845 5.3333333333333330e+00 3400 3400 6.4029166666666669e+01 3400 2852 -5.3312499999999998e+00 3400 2401 1.4465734552327348e-19 3400 3420 2.1329166666666662e+01 3400 3402 -1.5997916666666667e+01 3400 2390 -1.2659172094511536e-19 3400 2391 -2.1329166666666662e+01 3400 2389 2.1334374999999998e+01 3400 2847 1.0416666666666664e-02 3400 3406 -2.1329166666666662e+01 3400 3399 -1.5997916666666665e+01 3400 2846 -5.3312499999999998e+00 3400 2845 1.0667708333333334e+01 3401 3401 6.4041666666666671e+01 3401 2866 5.3312499999999998e+00 3401 2366 -5.3312499999999998e+00 3401 3398 -1.5997916666666667e+01 3401 2863 5.3312499999999998e+00 3401 2859 -5.3395833333333327e+00 3401 3415 -1.5997916666666665e+01 3401 2864 -5.3333333333333330e+00 3401 3467 1.5997916666666667e+01 3401 3405 -1.5997916666666665e+01 3401 2488 -5.3312499999999998e+00 3401 2381 5.3312499999999998e+00 3401 2483 -5.3312499999999998e+00 3401 2482 5.3395833333333327e+00 3401 2489 5.3333333333333330e+00 3401 3106 1.5997916666666667e+01 3401 2386 5.3312499999999998e+00 3401 2389 -5.3395833333333327e+00 3401 3105 -1.5997916666666665e+01 3401 2402 -5.3333333333333330e+00 3401 3045 -1.5997916666666667e+01 3401 3044 1.5997916666666665e+01 3401 2368 -5.3312499999999998e+00 3401 2367 5.3395833333333327e+00 3401 2364 5.3333333333333330e+00 3402 3402 6.4041666666666671e+01 3402 2860 5.3312499999999998e+00 3402 2488 -5.3312499999999998e+00 3402 3405 -1.5997916666666667e+01 3402 2866 5.3312499999999998e+00 3402 2859 -5.3395833333333327e+00 3402 3468 1.5997916666666665e+01 3402 2869 -5.3333333333333330e+00 3402 2386 5.3312499999999998e+00 3402 2847 -5.3312499999999998e+00 3402 3400 -1.5997916666666667e+01 3402 2391 5.3312499999999998e+00 3402 2389 -5.3395833333333327e+00 3402 3420 -1.5997916666666665e+01 3402 2401 -5.3333333333333330e+00 3402 3107 -1.5997916666666667e+01 3402 3106 1.5997916666666665e+01 3402 2483 -5.3312499999999998e+00 3402 2490 5.3395833333333327e+00 3402 2489 5.3333333333333330e+00 3402 3413 1.5997916666666667e+01 3402 3403 -1.5997916666666665e+01 3402 2853 -5.3312499999999998e+00 3402 2852 5.3395833333333327e+00 3402 2845 5.3333333333333330e+00 3403 3403 6.4029166666666654e+01 3403 2869 -1.4465734552327348e-19 3403 2846 -5.3312499999999998e+00 3403 2858 1.4465734552327348e-19 3403 2860 -2.1329166666666662e+01 3403 2859 2.1334374999999998e+01 3403 3410 -2.1329166666666662e+01 3403 3399 -1.5997916666666667e+01 3403 2853 1.0416666666666664e-02 3403 3413 -2.1329166666666662e+01 3403 3402 -1.5997916666666665e+01 3403 2852 -5.3312499999999998e+00 3403 2845 1.0667708333333334e+01 3404 3404 6.4029166666666669e+01 3404 2862 1.4465734552327348e-19 3404 3039 -2.1329166666666662e+01 3404 3035 1.5997916666666667e+01 3404 2858 -1.2659172094511536e-19 3404 2861 -2.1329166666666662e+01 3404 2859 2.1334374999999998e+01 3404 2361 1.0416666666666664e-02 3404 3409 -2.1329166666666662e+01 3404 3399 -1.5997916666666665e+01 3404 2360 -5.3312499999999998e+00 3404 2359 1.0667708333333334e+01 3405 3405 6.4029166666666669e+01 3405 2490 -5.3312499999999998e+00 3405 2869 1.4465734552327348e-19 3405 3468 -2.1329166666666662e+01 3405 3402 -1.5997916666666667e+01 3405 2864 -1.2659172094511536e-19 3405 2866 -2.1329166666666662e+01 3405 2859 2.1334374999999998e+01 3405 2488 1.0416666666666664e-02 3405 3467 -2.1329166666666662e+01 3405 3401 -1.5997916666666665e+01 3405 2482 -5.3312499999999998e+00 3405 2489 1.0667708333333334e+01 3406 3406 6.4029166666666654e+01 3406 2848 1.4465734552327348e-19 3406 3417 2.1329166666666662e+01 3406 2397 -5.3312499999999998e+00 3406 3407 -1.5997916666666665e+01 3406 2391 1.0416666666666664e-02 3406 2389 -5.3312499999999998e+00 3406 2390 1.0667708333333334e+01 3406 2845 -9.9486666632977745e-20 3406 3400 -2.1329166666666662e+01 3406 3399 1.5997916666666667e+01 3406 2847 -2.1329166666666662e+01 3406 2846 2.1334374999999998e+01 3407 3407 6.4041666666666671e+01 3407 2535 -5.3312499999999998e+00 3407 2357 5.3312499999999998e+00 3407 3444 1.5997916666666667e+01 3407 2541 -5.3312499999999998e+00 3407 2534 5.3395833333333327e+00 3407 3411 -1.5997916666666665e+01 3407 2542 5.3333333333333330e+00 3407 2380 -5.3312499999999998e+00 3407 2847 5.3312499999999998e+00 3407 3417 -1.5997916666666667e+01 3407 2391 -5.3312499999999998e+00 3407 2397 5.3395833333333327e+00 3407 3406 -1.5997916666666665e+01 3407 2390 5.3333333333333330e+00 3407 3042 1.5997916666666667e+01 3407 3043 -1.5997916666666665e+01 3407 2354 5.3312499999999998e+00 3407 2360 -5.3395833333333327e+00 3407 2362 -5.3333333333333330e+00 3407 3408 -1.5997916666666667e+01 3407 3443 1.5997916666666665e+01 3407 2854 5.3312499999999998e+00 3407 2846 -5.3395833333333327e+00 3407 2848 -5.3333333333333330e+00 3408 3408 6.4029166666666654e+01 3408 2855 1.4465734552327348e-19 3408 3449 2.1329166666666662e+01 3408 2543 -5.3312499999999998e+00 3408 3412 1.5997916666666665e+01 3408 2535 1.0416666666666664e-02 3408 2534 -5.3312499999999998e+00 3408 2542 1.0667708333333334e+01 3408 2848 -1.4465734552327348e-19 3408 3443 -2.1329166666666662e+01 3408 3407 -1.5997916666666667e+01 3408 2854 -2.1329166666666662e+01 3408 2846 2.1334374999999998e+01 3409 3409 6.4029166666666669e+01 3409 2361 -2.1329166666666666e+01 3409 2360 2.1334374999999998e+01 3409 2861 1.0416666666666664e-02 3409 2858 1.0667708333333334e+01 3409 2859 -5.3312499999999998e+00 3409 2359 -9.9486666632977745e-20 3409 3404 -2.1329166666666662e+01 3409 3399 1.5997916666666667e+01 3409 245 1.4465734552327348e-19 3409 885 -2.1329166666666662e+01 3409 45 -5.3312499999999998e+00 3409 884 1.5997916666666665e+01 3410 3410 6.4029166666666669e+01 3410 2860 1.0416666666666664e-02 3410 2858 1.0667708333333334e+01 3410 2853 -2.1329166666666666e+01 3410 2846 2.1334374999999998e+01 3410 2845 1.4465734552327348e-19 3410 3403 -2.1329166666666662e+01 3410 2859 -5.3312499999999998e+00 3410 3399 1.5997916666666665e+01 3410 45 -5.3312499999999998e+00 3410 448 -1.4465734552327348e-19 3410 865 2.1329166666666662e+01 3410 884 1.5997916666666667e+01 3411 3411 6.4029166666666669e+01 3411 2543 -5.3312499999999998e+00 3411 2363 -9.9486666632977745e-20 3411 3480 2.1329166666666662e+01 3411 3412 1.5997916666666667e+01 3411 2362 1.4465734552327348e-19 3411 2357 -2.1329166666666662e+01 3411 2360 2.1334374999999998e+01 3411 2541 1.0416666666666664e-02 3411 3444 -2.1329166666666662e+01 3411 2534 -5.3312499999999998e+00 3411 3407 -1.5997916666666665e+01 3411 2542 1.0667708333333334e+01 3412 3412 6.4041666666666671e+01 3412 2360 5.3395833333333327e+00 3412 2363 5.3333333333333330e+00 3412 2846 5.3395833333333327e+00 3412 2855 5.3333333333333330e+00 3412 2541 5.3312499999999998e+00 3412 2854 -5.3312499999999998e+00 3412 3449 1.5997916666666667e+01 3412 2535 5.3312499999999998e+00 3412 2543 -5.3395833333333327e+00 3412 3408 1.5997916666666665e+01 3412 2542 -5.3333333333333330e+00 3412 3411 1.5997916666666667e+01 3412 3480 1.5997916666666665e+01 3412 2357 -5.3312499999999998e+00 3412 263 5.3312499999999998e+00 3412 243 -5.3312499999999998e+00 3412 666 1.5997916666666667e+01 3412 252 5.3312499999999998e+00 3412 270 -5.3395833333333327e+00 3412 665 -1.5997916666666665e+01 3412 268 -5.3333333333333330e+00 3412 891 -1.5997916666666667e+01 3412 890 1.5997916666666665e+01 3412 449 -5.3312499999999998e+00 3413 3413 6.4029166666666669e+01 3413 2853 -2.1329166666666666e+01 3413 2852 2.1334374999999998e+01 3413 2860 1.0416666666666664e-02 3413 2869 1.0667708333333334e+01 3413 2859 -5.3312499999999998e+00 3413 2845 -1.4465734552327348e-19 3413 3403 -2.1329166666666662e+01 3413 3402 1.5997916666666667e+01 3413 447 1.2659172094511536e-19 3413 862 -2.1329166666666662e+01 3413 43 -5.3312499999999998e+00 3413 863 1.5997916666666665e+01 3414 3414 6.4029166666666669e+01 3414 2867 -9.9486666632977745e-20 3414 3416 2.1329166666666662e+01 3414 3461 1.5997916666666667e+01 3414 2864 1.4465734552327348e-19 3414 2863 2.1329166666666662e+01 3414 2865 -2.1334374999999998e+01 3414 2366 -1.0416666666666664e-02 3414 3415 -2.1329166666666662e+01 3414 3464 1.5997916666666665e+01 3414 2367 5.3312499999999998e+00 3414 2371 -1.0667708333333334e+01 3415 3415 6.4029166666666654e+01 3415 2364 -1.4465734552327348e-19 3415 3398 2.1329166666666662e+01 3415 2859 5.3312499999999998e+00 3415 3401 -1.5997916666666665e+01 3415 2863 -1.0416666666666664e-02 3415 2865 5.3312499999999998e+00 3415 2864 -1.0667708333333334e+01 3415 2371 1.4465734552327348e-19 3415 3414 -2.1329166666666662e+01 3415 3464 -1.5997916666666667e+01 3415 2366 2.1329166666666662e+01 3415 2367 -2.1334374999999998e+01 3416 3416 6.4029166666666669e+01 3416 2863 1.0416666666666664e-02 3416 2867 1.0667708333333334e+01 3416 2366 -2.1329166666666666e+01 3416 2371 1.4465734552327348e-19 3416 3414 2.1329166666666662e+01 3416 2865 -5.3312499999999998e+00 3416 3461 1.5997916666666665e+01 3416 50 -5.3312499999999998e+00 3416 936 -2.1329166666666662e+01 3417 3417 6.4029166666666669e+01 3417 2846 5.3312499999999998e+00 3417 2390 -1.2659172094511536e-19 3417 3406 2.1329166666666662e+01 3417 3407 -1.5997916666666667e+01 3417 2398 1.4465734552327348e-19 3417 2391 2.1329166666666662e+01 3417 2397 -2.1334374999999998e+01 3417 2847 -1.0416666666666664e-02 3417 3418 -2.1329166666666662e+01 3417 3441 1.5997916666666665e+01 3417 2849 5.3312499999999998e+00 3417 2848 -1.0667708333333334e+01 3418 3418 6.4029166666666654e+01 3418 2850 -1.4465734552327348e-19 3418 3419 -2.1329166666666662e+01 3418 2399 5.3312499999999998e+00 3418 3445 1.5997916666666665e+01 3418 2391 -1.0416666666666664e-02 3418 2397 5.3312499999999998e+00 3418 2398 -1.0667708333333334e+01 3418 2848 1.4465734552327348e-19 3418 3417 -2.1329166666666662e+01 3418 3441 -1.5997916666666667e+01 3418 2847 2.1329166666666662e+01 3418 2849 -2.1334374999999998e+01 3419 3419 6.4029166666666654e+01 3419 2401 1.4465734552327348e-19 3419 2849 5.3312499999999998e+00 3419 2398 -1.4465734552327348e-19 3419 2391 2.1329166666666662e+01 3419 2399 -2.1334374999999998e+01 3419 3418 -2.1329166666666662e+01 3419 3445 -1.5997916666666667e+01 3419 2847 -1.0416666666666664e-02 3419 3420 -2.1329166666666662e+01 3419 3458 1.5997916666666665e+01 3419 2852 5.3312499999999998e+00 3419 2850 -1.0667708333333334e+01 3420 3420 6.4029166666666669e+01 3420 2399 5.3312499999999998e+00 3420 2845 -9.9486666632977745e-20 3420 2391 -1.0416666666666664e-02 3420 3400 2.1329166666666662e+01 3420 2389 5.3312499999999998e+00 3420 3402 -1.5997916666666665e+01 3420 2401 -1.0667708333333334e+01 3420 2850 1.4465734552327348e-19 3420 3419 -2.1329166666666662e+01 3420 3458 -1.5997916666666667e+01 3420 2847 2.1329166666666662e+01 3420 2852 -2.1334374999999998e+01 3421 3421 6.4041666666666671e+01 3421 2345 -5.3312499999999998e+00 3421 3438 2.1331249999999997e+01 3421 3423 -1.0658333333333333e+01 3421 2876 -5.3312499999999998e+00 3421 2383 5.3312499999999998e+00 3421 2874 -5.3312499999999998e+00 3421 2878 1.3332291666666665e+01 3421 3425 -1.5997916666666667e+01 3421 2395 5.3312499999999998e+00 3421 2393 -5.3395833333333327e+00 3421 3437 -1.5997916666666665e+01 3421 2396 -5.3333333333333330e+00 3421 3055 -1.5997916666666667e+01 3421 3054 1.5997916666666665e+01 3421 2335 -5.3312499999999998e+00 3421 2338 1.3332291666666665e+01 3422 3422 6.4029166666666654e+01 3422 2400 -1.4465734552327348e-19 3422 2418 -5.3312499999999998e+00 3422 2392 1.4465734552327348e-19 3422 2394 -2.1329166666666662e+01 3422 2393 2.1334374999999998e+01 3422 3430 -2.1329166666666662e+01 3422 3424 -1.5997916666666667e+01 3422 2422 1.0416666666666664e-02 3422 3070 -2.1329166666666662e+01 3422 3069 1.5997916666666665e+01 3422 2421 -5.3312499999999998e+00 3422 2420 1.0667708333333334e+01 3423 3423 6.4058333333333337e+01 3423 2871 1.0416666666666669e-03 3423 2878 -6.2500000000000003e-03 3423 2876 4.1666666666666666e-03 3423 3421 -1.0658333333333333e+01 3423 3438 -1.0666666666666666e+01 3423 2338 1.0662499999999998e+01 3423 2344 5.3322916666666664e+00 3423 2345 -1.5995833333333334e+01 3423 3269 3.2002083333333331e+01 3423 3268 -2.1320833333333333e+01 3423 2426 5.3281250000000000e+00 3423 2418 1.0416666666666667e-03 3423 2420 -1.0416666666666666e-02 3423 2427 -5.3291666666666666e+00 3423 3424 -1.0658333333333333e+01 3423 3428 -1.0666666666666666e+01 3424 3424 6.4041666666666671e+01 3424 2876 -5.3312499999999998e+00 3424 2395 5.3312499999999998e+00 3424 2422 -5.3312499999999998e+00 3424 3422 -1.5997916666666667e+01 3424 2394 5.3312499999999998e+00 3424 2393 -5.3395833333333327e+00 3424 3430 1.5997916666666665e+01 3424 2392 -5.3333333333333330e+00 3424 3429 1.5997916666666667e+01 3424 3425 -1.5997916666666665e+01 3424 2874 -5.3312499999999998e+00 3424 2871 -2.6593749999999998e+00 3424 2878 1.3332291666666665e+01 3424 3428 2.1331249999999997e+01 3424 3423 -1.0658333333333333e+01 3424 2418 -2.6593750000000003e+00 3424 2420 1.3332291666666665e+01 3424 2427 -5.3312499999999998e+00 3425 3425 6.4029166666666669e+01 3425 2396 1.4465734552327348e-19 3425 3437 2.1329166666666662e+01 3425 3421 -1.5997916666666667e+01 3425 2392 -1.2659172094511536e-19 3425 2395 -2.1329166666666662e+01 3425 2393 2.1334374999999998e+01 3425 2874 1.0416666666666664e-02 3425 3429 -2.1329166666666662e+01 3425 3424 -1.5997916666666665e+01 3425 2871 -5.3312499999999998e+00 3425 2878 1.0667708333333334e+01 3426 3426 6.4041666666666671e+01 3426 2394 -5.3312499999999998e+00 3426 2874 5.3312499999999998e+00 3426 3435 -1.5997916666666667e+01 3426 2395 -5.3312499999999998e+00 3426 2397 5.3395833333333327e+00 3426 3429 -1.5997916666666665e+01 3426 2392 5.3333333333333330e+00 3426 3430 -1.5997916666666667e+01 3426 3432 -1.5997916666666665e+01 3426 2422 5.3312499999999998e+00 3426 2537 -5.3312499999999998e+00 3426 2419 5.3312499999999998e+00 3426 2418 -5.3395833333333327e+00 3426 2434 -5.3333333333333330e+00 3426 3160 -1.5997916666666667e+01 3426 2530 -5.3312499999999998e+00 3426 2534 5.3395833333333327e+00 3426 3159 1.5997916666666665e+01 3426 2536 5.3333333333333330e+00 3426 3427 -1.5997916666666667e+01 3426 3440 1.5997916666666665e+01 3426 2872 5.3312499999999998e+00 3426 2871 -5.3395833333333327e+00 3426 2870 -5.3333333333333330e+00 3427 3427 6.4029166666666654e+01 3427 2880 1.4465734552327348e-19 3427 3151 -2.1329166666666662e+01 3427 2529 -5.3312499999999998e+00 3427 3144 1.5997916666666665e+01 3427 2537 1.0416666666666664e-02 3427 2534 -5.3312499999999998e+00 3427 2536 1.0667708333333334e+01 3427 2870 -1.4465734552327348e-19 3427 3440 -2.1329166666666662e+01 3427 3426 -1.5997916666666667e+01 3427 2872 -2.1329166666666662e+01 3427 2871 2.1334374999999998e+01 3428 3428 4.2691666666666663e+01 3428 2878 5.3322916666666664e+00 3428 2871 -6.2499999999999995e-03 3428 2876 -1.0668750000000001e+01 3428 2875 5.3322916666666664e+00 3428 3431 -2.1331249999999997e+01 3428 3485 -1.0666666666666666e+01 3428 2438 5.3322916666666664e+00 3428 2418 -6.2499999999999995e-03 3428 3424 2.1331249999999997e+01 3428 3423 -1.0666666666666666e+01 3428 2420 5.3322916666666664e+00 3428 2427 -1.0668750000000001e+01 3429 3429 6.4029166666666654e+01 3429 2870 1.4465734552327348e-19 3429 3435 2.1329166666666662e+01 3429 2397 -5.3312499999999998e+00 3429 3426 -1.5997916666666665e+01 3429 2395 1.0416666666666664e-02 3429 2393 -5.3312499999999998e+00 3429 2392 1.0667708333333334e+01 3429 2878 -9.9486666632977745e-20 3429 3425 -2.1329166666666662e+01 3429 3424 1.5997916666666667e+01 3429 2874 -2.1329166666666662e+01 3429 2871 2.1334374999999998e+01 3430 3430 6.4029166666666669e+01 3430 2397 -5.3312499999999998e+00 3430 2434 -1.4465734552327348e-19 3430 3432 2.1329166666666662e+01 3430 3426 -1.5997916666666667e+01 3430 2420 1.4465734552327348e-19 3430 2422 -2.1329166666666662e+01 3430 2418 2.1334374999999998e+01 3430 2394 1.0416666666666664e-02 3430 3422 -2.1329166666666662e+01 3430 2393 -5.3312499999999998e+00 3430 3424 1.5997916666666665e+01 3430 2392 1.0667708333333334e+01 3431 3431 5.3374999999999993e+01 3431 2417 5.0116116045879435e-20 3431 2880 2.1705219273391446e-19 3431 3144 1.0656249999999998e+01 3431 3146 -1.0666666666666666e+01 3431 2871 1.0657291666666666e+01 3431 2876 5.3312499999999998e+00 3431 2875 -1.5998958333333331e+01 3431 3428 -2.1331249999999997e+01 3431 3485 1.0658333333333333e+01 3431 2418 1.0657291666666666e+01 3431 2427 5.3312499999999998e+00 3431 2438 -1.5998958333333331e+01 3432 3432 6.4029166666666669e+01 3432 2435 5.3312499999999998e+00 3432 2398 -9.9486666632977745e-20 3432 3433 -2.1329166666666662e+01 3432 3441 1.5997916666666667e+01 3432 2392 1.4465734552327348e-19 3432 2394 2.1329166666666662e+01 3432 2397 -2.1334374999999998e+01 3432 2422 -1.0416666666666664e-02 3432 3430 2.1329166666666662e+01 3432 3426 -1.5997916666666665e+01 3432 2418 5.3312499999999998e+00 3432 2434 -1.0667708333333334e+01 3433 3433 6.4029166666666669e+01 3433 2399 5.3312499999999998e+00 3433 2436 1.2659172094511536e-19 3433 3434 -2.1329166666666662e+01 3433 3445 1.5997916666666667e+01 3433 2434 -1.4465734552327348e-19 3433 2422 2.1329166666666662e+01 3433 2435 -2.1334374999999998e+01 3433 2394 -1.0416666666666664e-02 3433 3432 -2.1329166666666662e+01 3433 2397 5.3312499999999998e+00 3433 3441 -1.5997916666666665e+01 3433 2398 -1.0667708333333334e+01 3434 3434 6.4029166666666669e+01 3434 2421 5.3312499999999998e+00 3434 2400 -1.4465734552327348e-19 3434 3070 2.1329166666666662e+01 3434 3067 -1.5997916666666667e+01 3434 2398 9.9486666632977745e-20 3434 2394 2.1329166666666662e+01 3434 2399 -2.1334374999999998e+01 3434 2422 -1.0416666666666664e-02 3434 3433 -2.1329166666666662e+01 3434 3445 -1.5997916666666665e+01 3434 2435 5.3312499999999998e+00 3434 2436 -1.0667708333333334e+01 3435 3435 6.4029166666666654e+01 3435 2403 1.4465734552327348e-19 3435 2871 5.3312499999999998e+00 3435 2392 -1.2659172094511536e-19 3435 2395 2.1329166666666662e+01 3435 2397 -2.1334374999999998e+01 3435 3429 2.1329166666666662e+01 3435 3426 -1.5997916666666667e+01 3435 2874 -1.0416666666666664e-02 3435 3436 -2.1329166666666662e+01 3435 3442 1.5997916666666665e+01 3435 2870 -1.0667708333333334e+01 3436 3436 6.4029166666666654e+01 3436 3034 2.1329166666666662e+01 3436 2379 5.3312499999999998e+00 3436 2395 -1.0416666666666664e-02 3436 2397 5.3312499999999998e+00 3436 2403 -1.0667708333333334e+01 3436 2870 1.4465734552327348e-19 3436 3435 -2.1329166666666662e+01 3436 3442 -1.5997916666666667e+01 3436 2874 2.1329166666666662e+01 3437 3437 6.4029166666666669e+01 3437 2379 5.3312499999999998e+00 3437 3034 2.1329166666666662e+01 3437 2878 -9.9486666632977745e-20 3437 2874 2.1329166666666662e+01 3437 2395 -1.0416666666666664e-02 3437 3425 2.1329166666666662e+01 3437 2393 5.3312499999999998e+00 3437 3421 -1.5997916666666665e+01 3437 2396 -1.0667708333333334e+01 3438 3438 4.2691666666666663e+01 3438 3489 1.0666666666666666e+01 3438 2338 5.3322916666666664e+00 3438 2345 -1.0668750000000001e+01 3438 3421 2.1331249999999997e+01 3438 3423 -1.0666666666666666e+01 3438 2878 5.3322916666666664e+00 3438 2876 -1.0668750000000001e+01 3439 3439 3.2020833333333336e+01 3440 3440 6.4029166666666669e+01 3440 2539 9.9486666632977745e-20 3440 3454 2.1329166666666662e+01 3440 3442 -1.5997916666666667e+01 3440 2536 -1.4465734552327348e-19 3440 2537 -2.1329166666666662e+01 3440 2534 2.1334374999999998e+01 3440 2872 1.0416666666666664e-02 3440 3427 -2.1329166666666662e+01 3440 3426 1.5997916666666665e+01 3440 2871 -5.3312499999999998e+00 3440 2870 1.0667708333333334e+01 3441 3441 6.4041666666666671e+01 3441 2391 5.3312499999999998e+00 3441 2422 -5.3312499999999998e+00 3441 3432 1.5997916666666667e+01 3441 2394 5.3312499999999998e+00 3441 2397 -5.3395833333333327e+00 3441 3433 -1.5997916666666665e+01 3441 2398 -5.3333333333333330e+00 3441 2530 5.3312499999999998e+00 3441 2854 -5.3312499999999998e+00 3441 3443 -1.5997916666666667e+01 3441 2535 5.3312499999999998e+00 3441 2534 -5.3395833333333327e+00 3441 3448 1.5997916666666665e+01 3441 2533 -5.3333333333333330e+00 3441 3161 -1.5997916666666667e+01 3441 3160 1.5997916666666665e+01 3441 2419 -5.3312499999999998e+00 3441 2435 5.3395833333333327e+00 3441 2434 5.3333333333333330e+00 3441 3418 -1.5997916666666667e+01 3441 3417 1.5997916666666665e+01 3441 2847 -5.3312499999999998e+00 3441 2849 5.3395833333333327e+00 3441 2848 5.3333333333333330e+00 3442 3442 6.4041666666666671e+01 3442 2541 5.3312499999999998e+00 3442 2872 -5.3312499999999998e+00 3442 3440 -1.5997916666666667e+01 3442 2537 5.3312499999999998e+00 3442 2534 -5.3395833333333327e+00 3442 3454 -1.5997916666666665e+01 3442 2539 -5.3333333333333330e+00 3442 3478 1.5997916666666667e+01 3442 3444 -1.5997916666666665e+01 3442 2357 -5.3312499999999998e+00 3442 2395 5.3312499999999998e+00 3442 2354 -5.3312499999999998e+00 3442 2362 5.3333333333333330e+00 3442 3043 1.5997916666666667e+01 3442 2380 5.3312499999999998e+00 3442 2397 -5.3395833333333327e+00 3442 3040 -1.5997916666666665e+01 3442 2403 -5.3333333333333330e+00 3442 3436 -1.5997916666666667e+01 3442 3435 1.5997916666666665e+01 3442 2874 -5.3312499999999998e+00 3442 2870 5.3333333333333330e+00 3443 3443 6.4029166666666654e+01 3443 2542 -1.4465734552327348e-19 3443 2849 -5.3312499999999998e+00 3443 2533 9.9486666632977745e-20 3443 2535 -2.1329166666666662e+01 3443 2534 2.1334374999999998e+01 3443 3448 -2.1329166666666662e+01 3443 3441 -1.5997916666666667e+01 3443 2854 1.0416666666666664e-02 3443 3408 -2.1329166666666662e+01 3443 3407 1.5997916666666665e+01 3443 2846 -5.3312499999999998e+00 3443 2848 1.0667708333333334e+01 3444 3444 6.4029166666666669e+01 3444 2360 -5.3312499999999998e+00 3444 2542 1.2659172094511536e-19 3444 3411 -2.1329166666666662e+01 3444 3407 1.5997916666666667e+01 3444 2539 -1.4465734552327348e-19 3444 2541 -2.1329166666666662e+01 3444 2534 2.1334374999999998e+01 3444 2357 1.0416666666666664e-02 3444 3478 -2.1329166666666662e+01 3444 3442 -1.5997916666666665e+01 3444 2362 1.0667708333333334e+01 3445 3445 6.4041666666666671e+01 3445 2473 -5.3312499999999998e+00 3445 2425 5.3312499999999998e+00 3445 3075 -1.5997916666666667e+01 3445 2467 -5.3312499999999998e+00 3445 2471 5.3395833333333327e+00 3445 3076 -1.5997916666666665e+01 3445 2472 5.3333333333333330e+00 3445 2394 -5.3312499999999998e+00 3445 2847 5.3312499999999998e+00 3445 3419 -1.5997916666666667e+01 3445 2391 -5.3312499999999998e+00 3445 2399 5.3395833333333327e+00 3445 3418 1.5997916666666665e+01 3445 2398 5.3333333333333330e+00 3445 3433 1.5997916666666667e+01 3445 3434 -1.5997916666666665e+01 3445 2422 5.3312499999999998e+00 3445 2435 -5.3395833333333327e+00 3445 2436 -5.3333333333333330e+00 3445 3446 -1.5997916666666667e+01 3445 3457 1.5997916666666665e+01 3445 2851 5.3312499999999998e+00 3445 2849 -5.3395833333333327e+00 3445 2850 -5.3333333333333330e+00 3446 3446 6.4029166666666669e+01 3446 2851 -2.1329166666666666e+01 3446 2849 2.1334374999999998e+01 3446 2473 1.0416666666666664e-02 3446 2472 1.0667708333333334e+01 3446 2471 -5.3312499999999998e+00 3446 2850 -1.2659172094511536e-19 3446 3457 -2.1329166666666662e+01 3446 3445 -1.5997916666666667e+01 3446 456 1.4465734552327348e-19 3446 953 2.1329166666666662e+01 3446 484 -5.3312499999999998e+00 3446 982 1.5997916666666665e+01 3447 3447 6.4041666666666671e+01 3447 2849 5.3395833333333327e+00 3447 2857 5.3333333333333330e+00 3447 2435 5.3395833333333327e+00 3447 2437 5.3333333333333330e+00 3447 2535 5.3312499999999998e+00 3447 2419 -5.3312499999999998e+00 3447 3162 1.5997916666666667e+01 3447 2530 5.3312499999999998e+00 3447 2546 -5.3395833333333327e+00 3447 3161 -1.5997916666666665e+01 3447 2533 -5.3333333333333330e+00 3447 3448 1.5997916666666667e+01 3447 3451 1.5997916666666665e+01 3447 2854 -5.3312499999999998e+00 3447 217 5.3312499999999998e+00 3447 455 -5.3312499999999998e+00 3447 966 1.5997916666666667e+01 3447 202 5.3312499999999998e+00 3447 212 -5.3395833333333327e+00 3447 969 -1.5997916666666665e+01 3447 218 -5.3333333333333330e+00 3447 1010 -1.5997916666666667e+01 3447 1006 -1.5997916666666665e+01 3447 489 -5.3312499999999998e+00 3448 3448 6.4029166666666669e+01 3448 2546 -5.3312499999999998e+00 3448 2848 1.4465734552327348e-19 3448 2535 1.0416666666666664e-02 3448 3443 -2.1329166666666662e+01 3448 2534 -5.3312499999999998e+00 3448 3441 1.5997916666666665e+01 3448 2533 1.0667708333333334e+01 3448 2857 -1.2659172094511536e-19 3448 3451 2.1329166666666662e+01 3448 3447 1.5997916666666667e+01 3448 2854 -2.1329166666666662e+01 3448 2849 2.1334374999999998e+01 3449 3449 6.4029166666666654e+01 3449 2545 1.4465734552327348e-19 3449 2846 5.3312499999999998e+00 3449 2542 -1.4465734552327348e-19 3449 2535 2.1329166666666662e+01 3449 2543 -2.1334374999999998e+01 3449 3408 2.1329166666666662e+01 3449 3412 1.5997916666666667e+01 3449 2854 -1.0416666666666664e-02 3449 3450 -2.1329166666666662e+01 3449 3482 1.5997916666666665e+01 3449 2856 5.3312499999999998e+00 3449 2855 -1.0667708333333334e+01 3450 3450 6.4029166666666654e+01 3450 2857 -1.2659172094511536e-19 3450 3451 -2.1329166666666662e+01 3450 2546 5.3312499999999998e+00 3450 3483 -1.5997916666666665e+01 3450 2535 -1.0416666666666664e-02 3450 2543 5.3312499999999998e+00 3450 2545 -1.0667708333333334e+01 3450 2855 1.4465734552327348e-19 3450 3449 -2.1329166666666662e+01 3450 3482 -1.5997916666666667e+01 3450 2854 2.1329166666666662e+01 3450 2856 -2.1334374999999998e+01 3451 3451 6.4029166666666654e+01 3451 2533 9.9486666632977745e-20 3451 2856 5.3312499999999998e+00 3451 2545 -1.4465734552327348e-19 3451 2535 2.1329166666666662e+01 3451 2546 -2.1334374999999998e+01 3451 3450 -2.1329166666666662e+01 3451 3483 1.5997916666666667e+01 3451 2854 -1.0416666666666664e-02 3451 3448 2.1329166666666662e+01 3451 3447 1.5997916666666665e+01 3451 2849 5.3312499999999998e+00 3451 2857 -1.0667708333333334e+01 3452 3452 6.4029166666666654e+01 3452 3453 -2.1329166666666662e+01 3452 2540 5.3312499999999998e+00 3452 2537 -1.0416666666666664e-02 3452 2529 5.3312499999999998e+00 3452 2538 -1.0667708333333334e+01 3452 2880 1.4465734552327348e-19 3452 3151 2.1329166666666662e+01 3452 3147 -1.5997916666666667e+01 3452 2872 2.1329166666666662e+01 3453 3453 6.4029166666666669e+01 3453 2538 -1.4465734552327348e-19 3453 3452 -2.1329166666666662e+01 3453 2539 9.9486666632977745e-20 3453 2537 2.1329166666666662e+01 3453 2540 -2.1334374999999998e+01 3453 2872 -1.0416666666666664e-02 3453 3454 -2.1329166666666662e+01 3454 3454 6.4029166666666654e+01 3454 2870 -1.4465734552327348e-19 3454 3440 2.1329166666666662e+01 3454 2534 5.3312499999999998e+00 3454 3442 -1.5997916666666665e+01 3454 2537 -1.0416666666666664e-02 3454 2540 5.3312499999999998e+00 3454 2539 -1.0667708333333334e+01 3454 3453 -2.1329166666666662e+01 3454 2872 2.1329166666666662e+01 3455 3455 3.2020833333333336e+01 3456 3456 4.2699999999999996e+01 3456 3249 -1.0666666666666664e+01 3456 2880 4.0939925783957855e-21 3456 2875 -1.0672916666666666e+01 3456 3147 2.1329166666666666e+01 3456 3146 -1.0666666666666668e+01 3456 2498 1.0662500000000000e+01 3456 2505 -1.0672916666666666e+01 3457 3457 6.4029166666666669e+01 3457 2852 -5.3312499999999998e+00 3457 2474 1.4465734552327348e-19 3457 3460 -2.1329166666666662e+01 3457 3458 -1.5997916666666667e+01 3457 2472 -9.9486666632977745e-20 3457 2473 -2.1329166666666662e+01 3457 2471 2.1334374999999998e+01 3457 2851 1.0416666666666664e-02 3457 3446 -2.1329166666666662e+01 3457 3445 1.5997916666666665e+01 3457 2849 -5.3312499999999998e+00 3457 2850 1.0667708333333334e+01 3458 3458 6.4041666666666671e+01 3458 2391 5.3312499999999998e+00 3458 2483 -5.3312499999999998e+00 3458 3108 1.5997916666666667e+01 3458 2386 5.3312499999999998e+00 3458 2399 -5.3395833333333327e+00 3458 3107 -1.5997916666666665e+01 3458 2401 -5.3333333333333330e+00 3458 2475 5.3312499999999998e+00 3458 2851 -5.3312499999999998e+00 3458 3457 -1.5997916666666667e+01 3458 2473 5.3312499999999998e+00 3458 2471 -5.3395833333333327e+00 3458 3460 1.5997916666666665e+01 3458 2474 -5.3333333333333330e+00 3458 3472 1.5997916666666667e+01 3458 3459 -1.5997916666666665e+01 3458 2486 -5.3312499999999998e+00 3458 2490 5.3395833333333327e+00 3458 2491 5.3333333333333330e+00 3458 3420 -1.5997916666666667e+01 3458 3419 1.5997916666666665e+01 3458 2847 -5.3312499999999998e+00 3458 2852 5.3395833333333327e+00 3458 2850 5.3333333333333330e+00 3459 3459 6.4029166666666669e+01 3459 2485 -5.3312499999999998e+00 3459 2476 1.4465734552327348e-19 3459 3099 -2.1329166666666662e+01 3459 3097 1.5997916666666667e+01 3459 2474 -1.4465734552327348e-19 3459 2475 -2.1329166666666662e+01 3459 2471 2.1334374999999998e+01 3459 2486 1.0416666666666664e-02 3459 3472 -2.1329166666666662e+01 3459 3458 -1.5997916666666665e+01 3459 2490 -5.3312499999999998e+00 3459 2491 1.0667708333333334e+01 3460 3460 6.4029166666666669e+01 3460 2473 1.0416666666666664e-02 3460 2474 1.0667708333333334e+01 3460 2851 -2.1329166666666666e+01 3460 2852 2.1334374999999998e+01 3460 2850 1.2659172094511536e-19 3460 3457 -2.1329166666666662e+01 3460 2471 -5.3312499999999998e+00 3460 3458 1.5997916666666665e+01 3460 480 -5.3312499999999998e+00 3460 452 -1.4465734552327348e-19 3460 950 -2.1329166666666662e+01 3460 938 -1.5997916666666667e+01 3461 3461 7.4687500000249997e+01 3461 2888 -5.3333333333229165e+00 3461 3463 1.0666666666583334e+01 3461 3470 2.1333333333291666e+01 3461 2375 -5.3333333332812494e+00 3461 2868 5.3312499999999998e+00 3461 2366 -5.3312499999999998e+00 3461 2371 1.3333333333343749e+01 3461 3414 1.5997916666666667e+01 3461 2863 5.3312499999999998e+00 3461 2865 -5.3395833333333327e+00 3461 3416 1.5997916666666665e+01 3461 2867 -5.3333333333333330e+00 3461 3469 1.5997916666666667e+01 3461 3462 -1.5997916666666665e+01 3461 2887 -5.3312499999999998e+00 3461 5 2.4000000000010417e+01 3462 3462 6.4029166666666669e+01 3462 2887 1.0416666666666664e-02 3462 2868 -2.1329166666666666e+01 3462 2865 2.1334374999999998e+01 3462 2867 -1.4465734552327348e-19 3462 3469 -2.1329166666666662e+01 3462 3461 -1.5997916666666665e+01 3462 5 1.0667708333333334e+01 3462 42 1.2659172094511536e-19 3462 516 -2.1329166666666662e+01 3462 517 1.5997916666666667e+01 3463 3463 5.3333333333749991e+01 3463 2487 5.3333333333229165e+00 3463 2888 5.3333333333437496e+00 3463 2367 2.2470898404921788e-28 3463 2375 -6.2500000000000004e-11 3463 3461 1.0666666666583334e+01 3463 3470 1.0666666666666666e+01 3463 2371 -5.3333333333229165e+00 3463 2482 4.5860624244724788e-28 3463 3464 1.0666666666666666e+01 3463 3466 1.0666666666666666e+01 3463 4153 -2.8320667257631078e-28 3463 111 -5.3333333333229165e+00 3463 5047 -3.2000000000020833e+01 3463 4773 -2.1333333333291666e+01 3463 5 1.0666666666791667e+01 3463 4350 -1.0666666666625000e+01 3464 3464 5.3354166666874995e+01 3464 2375 -2.2851328271989659e-27 3464 2863 5.3312499999999998e+00 3464 2488 -5.3312499999999998e+00 3464 3465 -1.5997916666666667e+01 3464 2866 5.3312499999999998e+00 3464 2865 -5.3395833333333327e+00 3464 3467 1.5997916666666665e+01 3464 2864 -5.3333333333333330e+00 3464 3415 -1.5997916666666667e+01 3464 3414 1.5997916666666665e+01 3464 2366 -5.3312499999999998e+00 3464 2367 -2.6635416666145835e+00 3464 2371 8.0000000000000000e+00 3464 2487 -1.8812360437258079e-27 3464 3466 1.0666666666562499e+01 3464 3463 1.0666666666666666e+01 3464 2482 -2.6635416666145830e+00 3464 111 8.0000000000000000e+00 3465 3465 6.4029166666666669e+01 3465 2866 -2.1329166666666666e+01 3465 2865 2.1334374999999998e+01 3465 2488 1.0416666666666664e-02 3465 2482 -5.3312499999999998e+00 3465 2864 1.2659172094511536e-19 3465 3467 -2.1329166666666662e+01 3465 3464 -1.5997916666666667e+01 3465 51 -1.4465734552327348e-19 3465 563 -2.1329166666666662e+01 3465 562 1.5997916666666665e+01 3465 110 -5.3312499999999998e+00 3465 111 1.0667708333333334e+01 3466 3466 4.2666666667083327e+01 3466 2481 -3.6295685768920020e-28 3466 2373 -1.8812360437258079e-27 3466 3091 1.0666666666562499e+01 3466 3096 1.0666666666666666e+01 3466 2371 1.8812360437258079e-27 3466 2367 1.0666666666562499e+01 3466 2375 -1.0666666666666666e+01 3466 3464 1.0666666666562499e+01 3466 3463 1.0666666666666666e+01 3466 2482 1.0666666666562499e+01 3466 2487 -1.0666666666666666e+01 3466 111 1.8812360437258079e-27 3467 3467 6.4029166666666669e+01 3467 2859 -5.3312499999999998e+00 3467 2489 -9.9486666632977745e-20 3467 3405 -2.1329166666666662e+01 3467 3401 1.5997916666666667e+01 3467 2488 -2.1329166666666662e+01 3467 2482 2.1334374999999998e+01 3467 2866 1.0416666666666664e-02 3467 3465 -2.1329166666666662e+01 3467 2865 -5.3312499999999998e+00 3467 3464 1.5997916666666665e+01 3467 2864 1.0667708333333334e+01 3467 111 1.4465734552327348e-19 3468 3468 6.4029166666666669e+01 3468 2866 1.0416666666666664e-02 3468 2869 1.0667708333333334e+01 3468 2488 -2.1329166666666666e+01 3468 2490 2.1334374999999998e+01 3468 2489 9.9486666632977745e-20 3468 3405 -2.1329166666666662e+01 3468 2859 -5.3312499999999998e+00 3468 3402 1.5997916666666665e+01 3468 43 -5.3312499999999998e+00 3468 117 -1.4465734552327348e-19 3468 864 -2.1329166666666662e+01 3468 863 1.5997916666666667e+01 3469 3469 6.4029166666666669e+01 3469 2887 -2.1329166666666666e+01 3469 2868 1.0416666666666664e-02 3469 2867 1.0667708333333334e+01 3469 2865 -5.3312499999999998e+00 3469 3462 -2.1329166666666662e+01 3469 3461 1.5997916666666667e+01 3469 520 2.1329166666666662e+01 3469 50 -5.3312499999999998e+00 3469 5 -1.4465734552327348e-19 3470 3470 4.2666666666999994e+01 3470 2371 -1.8812360437258079e-27 3470 3461 2.1333333333291666e+01 3470 3463 1.0666666666666666e+01 3470 2375 -1.0666666666729165e+01 3470 3707 1.0666666666666666e+01 3470 2888 -1.0666666666729165e+01 3470 5 1.0666666666625000e+01 3471 3471 4.2666666666916662e+01 3472 3472 6.4029166666666669e+01 3472 2486 -2.1329166666666666e+01 3472 2490 2.1334374999999998e+01 3472 2475 1.0416666666666664e-02 3472 2474 1.0667708333333334e+01 3472 2471 -5.3312499999999998e+00 3472 2491 -1.4465734552327348e-19 3472 3459 -2.1329166666666662e+01 3472 3458 1.5997916666666667e+01 3472 118 9.9486666632977745e-20 3472 941 2.1329166666666662e+01 3472 480 -5.3312499999999998e+00 3472 938 -1.5997916666666665e+01 3473 3473 6.4029166666666669e+01 3473 2486 1.0416666666666664e-02 3473 2484 1.0667708333333334e+01 3473 2475 -2.1329166666666666e+01 3473 2477 2.1334374999999998e+01 3473 2476 -1.4465734552327348e-19 3473 3099 -2.1329166666666662e+01 3473 3098 1.5997916666666665e+01 3473 2485 -5.3312499999999998e+00 3473 112 -5.3312499999999998e+00 3473 477 1.2659172094511536e-19 3473 823 -2.1329166666666662e+01 3473 821 1.5997916666666667e+01 3474 3474 4.2666666667333324e+01 3474 2414 6.2499999999999991e-11 3474 2484 6.2499999999999991e-11 3474 2492 -4.1666666666666665e-11 3474 2455 -1.0416666666666666e-11 3474 2485 -1.0416666666666666e-11 3474 2444 -1.0416666666666666e-11 3474 2459 6.2499999999999991e-11 3474 2453 -4.1666666666666665e-11 3474 3098 -1.0666666666583334e+01 3474 3104 1.0666666666666666e+01 3474 2405 -1.0416666666666666e-11 3474 3085 -1.0666666666583334e+01 3474 3084 1.0666666666666666e+01 3474 221 -1.0416666666666666e-11 3474 1208 -1.0416666666666666e-11 3474 290 -4.1666666666666665e-11 3474 1619 -1.0416666666666666e-11 3474 231 6.2499999999999991e-11 3474 228 -4.1666666666666665e-11 3474 939 1.0666666666583334e+01 3474 947 1.0666666666666666e+01 3474 112 -1.0416666666666666e-11 3474 821 -1.0666666666583334e+01 3474 820 1.0666666666666666e+01 3475 3475 3.2020833333333336e+01 3476 3476 6.4029166666666654e+01 3476 2544 -1.4465734552327348e-19 3476 2539 1.4465734552327348e-19 3476 2541 -2.1329166666666662e+01 3476 2540 2.1334374999999998e+01 3476 3478 -2.1329166666666662e+01 3476 2357 1.0416666666666664e-02 3476 3479 2.1329166666666662e+01 3477 3477 3.2020833333333336e+01 3478 3478 6.4029166666666669e+01 3478 2534 -5.3312499999999998e+00 3478 2362 -1.4465734552327348e-19 3478 3444 -2.1329166666666662e+01 3478 3442 1.5997916666666667e+01 3478 2357 -2.1329166666666662e+01 3478 2541 1.0416666666666664e-02 3478 3476 -2.1329166666666662e+01 3478 2540 -5.3312499999999998e+00 3478 2539 1.0667708333333334e+01 3479 3479 6.4029166666666669e+01 3479 2540 5.3312499999999998e+00 3479 2363 -9.9486666632977745e-20 3479 2541 -1.0416666666666664e-02 3479 3480 -2.1329166666666662e+01 3479 2543 5.3312499999999998e+00 3479 3481 -1.5997916666666665e+01 3479 2544 -1.0667708333333334e+01 3479 3476 2.1329166666666662e+01 3479 2357 2.1329166666666662e+01 3480 3480 6.4029166666666669e+01 3480 2544 -1.4465734552327348e-19 3480 3479 -2.1329166666666662e+01 3480 3481 1.5997916666666667e+01 3480 2542 1.2659172094511536e-19 3480 2541 2.1329166666666662e+01 3480 2543 -2.1334374999999998e+01 3480 2357 -1.0416666666666664e-02 3480 3411 2.1329166666666662e+01 3480 3412 1.5997916666666665e+01 3480 2360 5.3312499999999998e+00 3480 2363 -1.0667708333333334e+01 3481 3481 6.4041666666666671e+01 3481 2515 5.3333333333333330e+00 3481 2363 5.3333333333333330e+00 3481 2525 5.3312499999999998e+00 3481 2357 -5.3312499999999998e+00 3481 3480 1.5997916666666667e+01 3481 2541 5.3312499999999998e+00 3481 2543 -5.3395833333333327e+00 3481 3479 -1.5997916666666665e+01 3481 2544 -5.3333333333333330e+00 3481 3134 -1.5997916666666667e+01 3481 3133 1.5997916666666665e+01 3481 2517 -5.3312499999999998e+00 3481 252 5.3312499999999998e+00 3481 246 -5.3312499999999998e+00 3481 667 1.5997916666666667e+01 3481 253 5.3312499999999998e+00 3481 270 -5.3395833333333327e+00 3481 661 1.5997916666666665e+01 3481 250 -5.3333333333333330e+00 3481 662 1.5997916666666667e+01 3481 666 1.5997916666666665e+01 3481 243 -5.3312499999999998e+00 3482 3482 6.4041666666666671e+01 3482 2856 5.3395833333333327e+00 3482 2855 5.3333333333333330e+00 3482 2513 5.3395833333333327e+00 3482 2512 5.3333333333333330e+00 3482 2535 5.3312499999999998e+00 3482 2510 -5.3312499999999998e+00 3482 3130 1.5997916666666667e+01 3482 2524 5.3312499999999998e+00 3482 2543 -5.3395833333333327e+00 3482 3131 -1.5997916666666665e+01 3482 2545 -5.3333333333333330e+00 3482 3450 -1.5997916666666667e+01 3482 3449 1.5997916666666665e+01 3482 2854 -5.3312499999999998e+00 3482 273 5.3312499999999998e+00 3482 449 -5.3312499999999998e+00 3482 890 1.5997916666666667e+01 3482 263 5.3312499999999998e+00 3482 270 -5.3395833333333327e+00 3482 893 -1.5997916666666665e+01 3482 274 -5.3333333333333330e+00 3482 993 -1.5997916666666667e+01 3482 987 -1.5997916666666665e+01 3482 280 -5.3312499999999998e+00 3483 3483 6.4041666666666671e+01 3483 2513 5.3395833333333327e+00 3483 2514 5.3333333333333330e+00 3483 2856 5.3395833333333327e+00 3483 2857 5.3333333333333330e+00 3483 2524 5.3312499999999998e+00 3483 2854 -5.3312499999999998e+00 3483 3451 1.5997916666666667e+01 3483 2535 5.3312499999999998e+00 3483 2546 -5.3395833333333327e+00 3483 3450 -1.5997916666666665e+01 3483 2545 -5.3333333333333330e+00 3483 3131 -1.5997916666666667e+01 3483 3132 1.5997916666666665e+01 3483 2510 -5.3312499999999998e+00 3483 202 5.3312499999999998e+00 3483 283 -5.3312499999999998e+00 3483 1001 1.5997916666666667e+01 3483 209 5.3312499999999998e+00 3483 212 -5.3395833333333327e+00 3483 994 1.5997916666666665e+01 3483 213 -5.3333333333333330e+00 3483 967 -1.5997916666666667e+01 3483 966 1.5997916666666665e+01 3483 455 -5.3312499999999998e+00 3484 3484 6.4041666666666671e+01 3484 2548 5.3333333333333330e+00 3484 2514 5.3333333333333330e+00 3484 2531 5.3312499999999998e+00 3484 2510 -5.3312499999999998e+00 3484 3132 1.5997916666666667e+01 3484 2524 5.3312499999999998e+00 3484 2546 -5.3395833333333327e+00 3484 3129 -1.5997916666666665e+01 3484 2547 -5.3333333333333330e+00 3484 3164 -1.5997916666666667e+01 3484 3163 1.5997916666666665e+01 3484 2550 -5.3312499999999998e+00 3484 209 5.3312499999999998e+00 3484 487 -5.3312499999999998e+00 3484 1002 1.5997916666666667e+01 3484 210 5.3312499999999998e+00 3484 212 -5.3395833333333327e+00 3484 999 1.5997916666666665e+01 3484 207 -5.3333333333333330e+00 3484 1000 1.5997916666666667e+01 3484 1001 1.5997916666666665e+01 3484 283 -5.3312499999999998e+00 3485 3485 6.4091666666666669e+01 3485 2562 -5.3302083333333332e+00 3485 2592 -1.0416666666666664e-02 3485 3170 -2.1320833333333333e+01 3485 3174 2.1329166666666669e+01 3485 2589 5.3281250000000000e+00 3485 2599 -5.3291666666666666e+00 3485 2426 5.3281250000000000e+00 3485 2871 1.0416666666666664e-03 3485 2418 1.0416666666666667e-03 3485 2427 -5.3291666666666666e+00 3485 2438 -1.0416666666666666e-02 3485 3428 -1.0666666666666666e+01 3485 3431 1.0658333333333333e+01 3485 2576 -2.0833333333333337e-03 3485 3268 -2.1320833333333333e+01 3485 3267 2.1329166666666666e+01 3485 2566 -5.3302083333333332e+00 3485 2570 1.0683333333333334e+01 3485 2876 4.1666666666666657e-03 3485 2875 -6.2499999999999995e-03 3485 3488 1.0666666666666666e+01 3485 3486 -1.0658333333333333e+01 3486 3486 5.3375000000000000e+01 3486 2599 -5.3312499999999998e+00 3486 3249 1.0666666666666666e+01 3486 2592 1.5998958333333333e+01 3486 3488 -2.1331249999999997e+01 3486 3485 -1.0658333333333333e+01 3486 2876 -5.3312499999999998e+00 3486 2875 1.5998958333333331e+01 3487 3487 8.5383333333333340e+01 3487 2347 -5.3322916666666664e+00 3487 2566 -5.3281250000000000e+00 3487 3263 -3.2002083333333331e+01 3487 3268 2.1320833333333333e+01 3487 2343 -2.1331249999999997e+01 3487 2344 -5.3322916666666664e+00 3487 2345 3.1995833333333334e+01 3487 2568 1.4583333333333332e-02 3487 3171 -3.2002083333333331e+01 3487 3170 2.1320833333333333e+01 3487 2562 -5.3281250000000000e+00 3487 2570 1.0662500000000000e+01 3488 3488 4.2691666666666663e+01 3488 2592 -5.3322916666666664e+00 3488 2599 1.0668750000000001e+01 3488 3489 -1.0666666666666666e+01 3488 3486 -2.1331249999999997e+01 3488 3485 1.0666666666666666e+01 3488 2876 1.0668750000000001e+01 3488 2875 -5.3322916666666664e+00 3489 3489 6.4058333333333323e+01 3489 2589 -5.3281250000000000e+00 3489 3172 -3.2002083333333331e+01 3489 3170 2.1320833333333333e+01 3489 2347 -5.3322916666666664e+00 3489 2599 5.3291666666666666e+00 3489 2876 -4.1666666666666666e-03 3489 3488 -1.0666666666666666e+01 3489 2345 1.5995833333333334e+01 3489 3438 1.0666666666666666e+01 3490 3490 5.3375000000000000e+01 3490 2587 -5.3312499999999998e+00 3490 3495 2.1331249999999997e+01 3490 3491 -1.0658333333333333e+01 3490 2446 -5.3312499999999998e+00 3490 2460 -2.1705219273391446e-19 3490 2450 -1.0657291666666666e+01 3490 2461 1.5998958333333333e+01 3490 2566 -2.1705219273391446e-19 3490 3264 -1.0656249999999998e+01 3490 3263 1.0666666666666666e+01 3490 2569 -1.0657291666666666e+01 3490 2568 1.5998958333333333e+01 3491 3491 4.2733333333333334e+01 3491 2622 1.0416666666666669e-03 3491 2628 -6.2500000000000003e-03 3491 2621 4.1666666666666666e-03 3491 3492 -1.0658333333333333e+01 3491 3498 -1.0666666666666666e+01 3491 2564 1.0416666666666667e-03 3491 3198 1.0658333333333333e+01 3491 3195 -1.0666666666666666e+01 3491 2457 1.0416666666666669e-03 3491 2569 1.0416666666666669e-03 3491 2568 -6.2500000000000003e-03 3491 2587 4.1666666666666666e-03 3491 2450 1.0416666666666667e-03 3491 2461 -6.2500000000000003e-03 3491 2446 4.1666666666666666e-03 3491 3490 -1.0658333333333333e+01 3491 3495 -1.0666666666666666e+01 3491 2337 1.0416666666666667e-03 3491 2343 -6.2500000000000003e-03 3491 2340 4.1666666666666666e-03 3491 3113 1.0658333333333333e+01 3491 3112 -1.0666666666666666e+01 3492 3492 7.4712499999999991e+01 3492 2340 -5.3312499999999998e+00 3492 3498 2.1331249999999997e+01 3492 3491 -1.0658333333333333e+01 3492 2621 -5.3312499999999998e+00 3492 2624 -5.3281250000000000e+00 3492 2628 2.1333333333333336e+01 3492 3180 -2.1329166666666666e+01 3492 3171 1.0658333333333331e+01 3492 2343 3.2000000000000000e+01 3492 2347 -5.3322916666666664e+00 3493 3493 4.2691666666666663e+01 3493 2588 5.3322916666666664e+00 3493 2462 5.3322916666666664e+00 3493 2569 -6.2500000000000003e-03 3493 3279 2.1331249999999997e+01 3493 3277 -1.0666666666666666e+01 3493 2567 5.3322916666666664e+00 3493 2583 -1.0668750000000001e+01 3493 2450 -6.2500000000000003e-03 3493 3494 -2.1331249999999997e+01 3493 3624 1.0666666666666666e+01 3493 2447 5.3322916666666664e+00 3493 2449 -1.0668750000000001e+01 3494 3494 6.4041666666666671e+01 3494 2583 5.3312499999999998e+00 3494 2446 5.3312499999999998e+00 3494 3495 -2.1331249999999997e+01 3494 3631 -1.0658333333333333e+01 3494 2569 1.0658333333333333e+01 3494 2588 -2.1331249999999997e+01 3494 2587 5.3312499999999998e+00 3494 3493 -2.1331249999999997e+01 3494 3624 -1.0658333333333333e+01 3494 2450 1.0658333333333333e+01 3494 2447 -2.1331249999999997e+01 3494 2449 5.3312499999999998e+00 3495 3495 4.2691666666666663e+01 3495 2568 5.3322916666666664e+00 3495 3490 2.1331249999999997e+01 3495 3491 -1.0666666666666666e+01 3495 2461 5.3322916666666664e+00 3495 2450 -6.2500000000000003e-03 3495 2447 5.3322916666666664e+00 3495 2446 -1.0668750000000001e+01 3495 2569 -6.2500000000000003e-03 3495 3494 -2.1331249999999997e+01 3495 3631 1.0666666666666666e+01 3495 2588 5.3322916666666664e+00 3495 2587 -1.0668750000000001e+01 3496 3496 3.2020833333333336e+01 3497 3497 4.2691666666666663e+01 3498 3498 4.2691666666666663e+01 3498 2343 5.3322916666666664e+00 3498 3492 2.1331249999999997e+01 3498 3491 -1.0666666666666666e+01 3498 2628 5.3322916666666664e+00 3498 2621 -1.0668750000000001e+01 3498 3630 1.0666666666666666e+01 3498 2340 -1.0668750000000001e+01 3499 3499 3.2020833333333336e+01 3500 3500 5.3375000000000007e+01 3500 2738 -2.1684043449710089e-19 3500 2732 5.3322916666666664e+00 3500 2551 -6.2499999999999995e-03 3500 3503 -1.0666666666666666e+01 3500 3231 -3.2002083333333331e+01 3500 3230 2.1329166666666666e+01 3500 2500 -1.0662500000000000e+01 3500 2506 5.3343749999999996e+00 3500 3166 1.0666666666666668e+01 3501 3501 6.4091666666666669e+01 3501 2432 1.0416666666666664e-03 3501 2633 -5.3302083333333332e+00 3501 2430 -1.0416666666666664e-02 3501 3201 -2.1320833333333333e+01 3501 3205 2.1329166666666669e+01 3501 2428 5.3281250000000000e+00 3501 2439 -5.3291666666666666e+00 3501 2722 5.3281250000000000e+00 3501 2725 -5.3291666666666666e+00 3501 2732 -1.0416666666666666e-02 3501 3505 1.0666666666666666e+01 3501 3503 -1.0658333333333333e+01 3501 2646 -2.0833333333333337e-03 3501 3507 2.1320833333333333e+01 3501 3502 -2.1329166666666666e+01 3501 2636 -5.3302083333333332e+00 3501 2639 1.0683333333333334e+01 3501 2553 1.0416666666666667e-03 3501 2552 4.1666666666666657e-03 3501 2551 -6.2499999999999995e-03 3501 3154 -1.0666666666666666e+01 3501 3153 1.0658333333333333e+01 3502 3502 5.3375000000000021e+01 3502 2686 5.3281250000000000e+00 3502 2731 -2.1684043449710089e-19 3502 2684 -4.9904357809065860e-20 3502 2696 -5.3322916666666664e+00 3502 2697 -6.2499999999999995e-03 3502 3305 -1.0666666666666666e+01 3502 3306 1.0666666666666666e+01 3502 3321 -1.0658333333333331e+01 3502 3322 1.0666666666666668e+01 3502 2643 -5.3302083333333332e+00 3502 2725 -1.6263032587282567e-19 3502 2722 -5.3322916666666664e+00 3502 2732 5.3322916666666664e+00 3502 3507 -3.2002083333333331e+01 3502 3501 -2.1329166666666666e+01 3502 2636 1.0679166666666665e+01 3502 2639 -1.0662500000000000e+01 3502 2646 5.3343749999999996e+00 3503 3503 5.3374999999999993e+01 3503 3500 -1.0666666666666666e+01 3503 2552 -5.3312499999999998e+00 3503 2551 1.5998958333333331e+01 3503 3505 -2.1331249999999997e+01 3503 3501 -1.0658333333333333e+01 3503 2725 -5.3312499999999998e+00 3503 2732 1.5998958333333331e+01 3504 3504 6.4058333333333337e+01 3504 2552 -4.1666666666666666e-03 3504 3508 -1.0666666666666666e+01 3504 2815 -5.3322916666666664e+00 3504 2817 1.5995833333333334e+01 3504 3516 -3.2002083333333331e+01 3504 3507 -2.1320833333333333e+01 3504 2722 -5.3281250000000000e+00 3504 2725 5.3291666666666666e+00 3504 3505 -1.0666666666666666e+01 3505 3505 4.2691666666666663e+01 3505 2552 1.0668750000000001e+01 3505 2551 -5.3322916666666664e+00 3505 3503 -2.1331249999999997e+01 3505 3501 1.0666666666666666e+01 3505 2732 -5.3322916666666664e+00 3505 3504 -1.0666666666666666e+01 3505 2725 1.0668750000000001e+01 3506 3506 8.5383333333333340e+01 3506 2820 -5.3322916666666664e+00 3506 2636 -5.3281250000000000e+00 3506 3512 -3.2002083333333331e+01 3506 3507 -2.1320833333333333e+01 3506 2811 -2.1331249999999997e+01 3506 2815 -5.3322916666666664e+00 3506 2817 3.1995833333333334e+01 3506 2637 1.4583333333333334e-02 3506 3202 -3.2002083333333331e+01 3506 3201 2.1320833333333333e+01 3506 2633 -5.3281250000000000e+00 3506 2639 1.0662500000000000e+01 3507 3507 8.5416666666666671e+01 3507 2637 -5.3281250000000000e+00 3507 2815 2.0833333333333342e-03 3507 3512 2.1329166666666666e+01 3507 3506 -2.1320833333333333e+01 3507 2811 5.3302083333333332e+00 3507 2817 -1.0683333333333334e+01 3507 3516 2.1329166666666669e+01 3507 3504 -2.1320833333333333e+01 3507 2722 1.4583333333333330e-02 3507 2725 1.0662500000000000e+01 3507 2732 -5.3281250000000000e+00 3507 3502 -3.2002083333333331e+01 3507 3501 2.1320833333333333e+01 3507 2636 -1.0658333333333331e+01 3507 2639 2.1329166666666666e+01 3507 2646 -5.3322916666666664e+00 3508 3508 4.2691666666666663e+01 3508 2561 -5.3322916666666664e+00 3508 3534 -2.1331249999999997e+01 3508 3509 -1.0666666666666666e+01 3508 2819 -5.3322916666666664e+00 3508 2817 1.0668750000000001e+01 3508 3504 -1.0666666666666666e+01 3508 2552 1.0668750000000001e+01 3509 3509 6.4058333333333323e+01 3509 2428 -5.3281250000000000e+00 3509 3203 -3.2002083333333331e+01 3509 3201 2.1320833333333333e+01 3509 2820 -5.3322916666666664e+00 3509 2432 -1.0416666666666669e-03 3509 2429 1.0416666666666666e-02 3509 2439 5.3291666666666666e+00 3509 2553 -1.0416666666666667e-03 3509 2561 6.2500000000000003e-03 3509 2552 -4.1666666666666666e-03 3509 3158 1.0658333333333333e+01 3509 3154 1.0666666666666666e+01 3509 2819 -1.0662499999999998e+01 3509 2817 1.5995833333333334e+01 3509 3534 1.0658333333333333e+01 3509 3508 -1.0666666666666666e+01 3510 3510 3.2020833333333336e+01 3511 3511 2.1354166666666668e+01 3512 3512 5.3375000000000000e+01 3512 2639 2.7157993871341005e-20 3512 3506 -3.2002083333333331e+01 3512 3507 2.1329166666666666e+01 3512 2817 -1.0662500000000000e+01 3512 2892 4.9904357809065860e-20 3512 2815 5.3343749999999996e+00 3512 2811 1.0679166666666665e+01 3512 2896 -6.2499999999999986e-03 3512 3523 -1.0658333333333331e+01 3512 3517 -1.0666666666666664e+01 3512 2899 -5.3322916666666664e+00 3512 2638 3.2249014814734037e-20 3512 2637 -5.3322916666666664e+00 3512 2636 5.3322916666666664e+00 3512 3524 1.0666666666666666e+01 3512 3513 -1.0666666666666666e+01 3513 3513 4.2708333333333329e+01 3513 2641 5.0116116045879435e-20 3513 2900 2.1705219273391446e-19 3513 3527 1.0656249999999998e+01 3513 3515 -1.0666666666666666e+01 3513 2899 -2.1705219273391446e-19 3513 2892 -1.0656249999999998e+01 3513 2896 1.0666666666666666e+01 3513 2637 -2.1705219273391446e-19 3513 3524 -1.0656249999999998e+01 3513 3512 -1.0666666666666666e+01 3513 2638 -1.0656249999999998e+01 3513 2636 1.0666666666666666e+01 3514 3514 4.2708333333333329e+01 3514 2896 1.0666666666666666e+01 3514 3516 -1.0666666666666666e+01 3514 3308 1.0666666666666666e+01 3514 2722 1.0666666666666666e+01 3515 3515 5.3375000000000000e+01 3515 2710 -1.0662500000000000e+01 3515 2638 -2.1684043449710089e-19 3515 2892 2.1684043449710089e-19 3515 2896 -6.2499999999999986e-03 3515 2900 -5.3322916666666664e+00 3515 3513 -1.0666666666666666e+01 3515 3527 -1.0666666666666666e+01 3515 2721 5.3343749999999996e+00 3515 3530 1.0658333333333331e+01 3515 3518 -1.0666666666666668e+01 3515 2718 1.0679166666666665e+01 3515 2640 -2.0761130467597592e-20 3515 3288 -3.2002083333333331e+01 3515 3287 2.1329166666666669e+01 3515 2641 -5.3322916666666664e+00 3515 2636 5.3322916666666664e+00 3516 3516 5.3375000000000000e+01 3516 2817 -1.0662500000000000e+01 3516 2725 -2.0761130467597592e-20 3516 3504 -3.2002083333333331e+01 3516 3507 2.1329166666666669e+01 3516 2722 5.3322916666666664e+00 3516 2896 -6.2499999999999986e-03 3516 3514 -1.0666666666666666e+01 3516 2815 5.3343749999999996e+00 3516 3517 -1.0666666666666668e+01 3517 3517 4.2699999999999996e+01 3517 2811 -1.0662500000000000e+01 3517 2899 1.6284208410963924e-19 3517 3523 2.1329166666666666e+01 3517 3512 -1.0666666666666664e+01 3517 2896 1.0672916666666666e+01 3517 3516 -1.0666666666666668e+01 3517 2815 1.0672916666666666e+01 3518 3518 4.2699999999999996e+01 3518 3308 1.0666666666666664e+01 3518 2900 -2.1705219273391446e-19 3518 2896 1.0672916666666666e+01 3518 3530 -2.1329166666666666e+01 3518 3515 -1.0666666666666668e+01 3518 2718 -1.0662500000000000e+01 3518 2721 1.0672916666666666e+01 3519 3519 3.2020833333333336e+01 3520 3520 4.2691666666666663e+01 3521 3521 2.1354166666666668e+01 3522 3522 3.2020833333333336e+01 3523 3523 7.4712500000000006e+01 3523 2893 5.3312499999999998e+00 3523 2815 5.3322916666666664e+00 3523 3512 -1.0658333333333331e+01 3523 3517 2.1329166666666666e+01 3523 2896 5.3281250000000000e+00 3523 2899 -2.1333333333333336e+01 3523 3372 2.1331249999999997e+01 3523 3371 -1.0658333333333333e+01 3523 2811 -3.1999999999999996e+01 3523 2809 5.3312499999999998e+00 3524 3524 5.3375000000000000e+01 3524 2654 -5.3312499999999998e+00 3524 3380 -2.1331249999999997e+01 3524 3371 1.0658333333333333e+01 3524 2893 -5.3312499999999998e+00 3524 2896 -2.1705219273391446e-19 3524 2892 -1.0657291666666666e+01 3524 2899 1.5998958333333333e+01 3524 2636 -2.1705219273391446e-19 3524 3513 -1.0656249999999998e+01 3524 3512 1.0666666666666666e+01 3524 2638 -1.0657291666666666e+01 3524 2637 1.5998958333333333e+01 3525 3525 4.2691666666666663e+01 3525 2655 5.3322916666666664e+00 3525 2900 5.3322916666666664e+00 3525 2638 -6.2500000000000003e-03 3525 3527 -2.1331249999999997e+01 3525 3528 -1.0666666666666666e+01 3525 2641 5.3322916666666664e+00 3525 2656 -1.0668750000000001e+01 3525 2892 -6.2500000000000003e-03 3525 3526 -2.1331249999999997e+01 3525 3669 -1.0666666666666666e+01 3525 2891 5.3322916666666664e+00 3525 2890 -1.0668750000000001e+01 3526 3526 6.4041666666666671e+01 3526 2656 5.3312499999999998e+00 3526 2893 5.3312499999999998e+00 3526 3380 2.1331249999999997e+01 3526 3374 -1.0658333333333333e+01 3526 2638 1.0658333333333333e+01 3526 2655 -2.1331249999999997e+01 3526 2654 5.3312499999999998e+00 3526 3525 -2.1331249999999997e+01 3526 3669 1.0658333333333333e+01 3526 2892 1.0658333333333333e+01 3526 2891 -2.1331249999999997e+01 3526 2890 5.3312499999999998e+00 3527 3527 5.3375000000000000e+01 3527 2890 5.3312499999999998e+00 3527 3525 -2.1331249999999997e+01 3527 3528 1.0658333333333333e+01 3527 2656 5.3312499999999998e+00 3527 2636 -2.1705219273391446e-19 3527 2638 1.0657291666666666e+01 3527 2641 -1.5998958333333333e+01 3527 2896 -5.0116116045879435e-20 3527 3513 1.0656249999999998e+01 3527 2892 1.0657291666666666e+01 3527 3515 -1.0666666666666666e+01 3527 2900 -1.5998958333333333e+01 3528 3528 4.2733333333333334e+01 3528 2649 1.0416666666666669e-03 3528 2955 1.0416666666666667e-03 3528 2965 -6.2500000000000003e-03 3528 2958 4.1666666666666666e-03 3528 3531 -1.0658333333333333e+01 3528 3621 -1.0666666666666666e+01 3528 2892 1.0416666666666669e-03 3528 2900 -6.2500000000000003e-03 3528 2890 4.1666666666666666e-03 3528 3530 -1.0658333333333333e+01 3528 3532 -1.0666666666666666e+01 3528 2638 1.0416666666666667e-03 3528 2641 -6.2500000000000003e-03 3528 2656 4.1666666666666666e-03 3528 3527 1.0658333333333333e+01 3528 3525 -1.0666666666666666e+01 3528 2718 -6.2500000000000003e-03 3528 2715 4.1666666666666666e-03 3528 3529 -1.0658333333333333e+01 3528 3612 -1.0666666666666666e+01 3529 3529 6.4041666666666671e+01 3529 2958 -5.3312499999999998e+00 3529 2710 -5.3312499999999998e+00 3529 3284 -2.1331249999999997e+01 3529 3288 1.0658333333333333e+01 3529 2965 2.1331249999999997e+01 3529 2954 -5.3312499999999998e+00 3529 3612 2.1331249999999997e+01 3529 3528 -1.0658333333333333e+01 3529 2718 2.1331249999999997e+01 3529 2715 -5.3312499999999998e+00 3530 3530 7.4712499999999991e+01 3530 2715 -5.3312499999999998e+00 3530 3532 2.1331249999999997e+01 3530 3528 -1.0658333333333333e+01 3530 2890 -5.3312499999999998e+00 3530 2896 -5.3281250000000000e+00 3530 2900 2.1333333333333336e+01 3530 3518 -2.1329166666666666e+01 3530 3515 1.0658333333333331e+01 3530 2718 3.2000000000000000e+01 3530 2721 -5.3322916666666664e+00 3531 3531 6.4041666666666671e+01 3531 2656 -5.3312499999999998e+00 3531 3621 2.1331249999999997e+01 3531 3528 -1.0658333333333333e+01 3531 2958 -5.3312499999999998e+00 3531 2955 -1.0658333333333333e+01 3531 2965 2.1331249999999997e+01 3531 2954 -5.3312499999999998e+00 3531 3290 -2.1331249999999997e+01 3531 3288 1.0658333333333333e+01 3531 2649 -1.0658333333333333e+01 3531 2641 2.1331249999999997e+01 3531 2640 -5.3312499999999998e+00 3532 3532 4.2691666666666663e+01 3532 2718 5.3322916666666664e+00 3532 3530 2.1331249999999997e+01 3532 3528 -1.0666666666666666e+01 3532 2900 5.3322916666666664e+00 3532 2890 -1.0668750000000001e+01 3532 3671 1.0666666666666666e+01 3532 2715 -1.0668750000000001e+01 3533 3533 3.2020833333333336e+01 3534 3534 6.4041666666666671e+01 3534 2819 1.3332291666666665e+01 3534 2561 1.3332291666666665e+01 3534 2552 -5.3312499999999998e+00 3534 3508 -2.1331249999999997e+01 3534 3509 1.0658333333333333e+01 3534 2817 -5.3312499999999998e+00 3534 210 5.3312499999999998e+00 3534 147 -5.3312499999999998e+00 3534 619 1.5997916666666667e+01 3534 199 5.3312499999999998e+00 3534 216 -5.3395833333333327e+00 3534 618 -1.5997916666666665e+01 3534 211 -5.3333333333333330e+00 3534 1004 -1.5997916666666667e+01 3534 1005 1.5997916666666665e+01 3534 487 -5.3312499999999998e+00 3535 3535 4.2733333333333334e+01 3535 2951 -4.1666666666666666e-03 3535 3544 -1.0666666666666666e+01 3535 3542 -1.0666666666666666e+01 3535 2916 -4.1666666666666666e-03 3535 2795 -4.1666666666666666e-03 3535 3546 -1.0666666666666666e+01 3535 2905 -4.1666666666666666e-03 3535 3536 -1.0666666666666666e+01 3536 3536 4.2691666666666663e+01 3536 2908 -5.3322916666666664e+00 3536 3564 2.1331249999999997e+01 3536 3537 -1.0666666666666666e+01 3536 2807 -5.3322916666666664e+00 3536 2795 1.0668750000000001e+01 3536 3535 -1.0666666666666666e+01 3536 2905 1.0668750000000001e+01 3537 3537 4.2733333333333334e+01 3537 2796 -1.0416666666666669e-03 3537 2807 6.2500000000000003e-03 3537 2795 -4.1666666666666666e-03 3537 3564 -1.0658333333333333e+01 3537 3536 -1.0666666666666666e+01 3537 2578 -1.0416666666666667e-03 3537 3595 -1.0658333333333333e+01 3537 3540 -1.0666666666666666e+01 3537 2762 -1.0416666666666669e-03 3537 2581 -1.0416666666666669e-03 3537 2582 6.2500000000000003e-03 3537 2579 -4.1666666666666666e-03 3537 2752 -1.0416666666666667e-03 3537 2761 6.2500000000000003e-03 3537 2753 -4.1666666666666666e-03 3537 3599 -1.0658333333333333e+01 3537 3547 -1.0666666666666666e+01 3537 2909 -1.0416666666666667e-03 3537 2908 6.2500000000000003e-03 3537 2905 -4.1666666666666666e-03 3537 3601 1.0658333333333333e+01 3537 3538 -1.0666666666666666e+01 3538 3538 4.2691666666666663e+01 3538 2910 -5.3322916666666664e+00 3538 3604 2.1331249999999997e+01 3538 3543 -1.0666666666666666e+01 3538 2764 -5.3322916666666664e+00 3538 2762 6.2500000000000003e-03 3538 2761 -5.3322916666666664e+00 3538 2753 1.0668750000000001e+01 3538 2909 6.2500000000000003e-03 3538 3601 -2.1331249999999997e+01 3538 3537 -1.0666666666666666e+01 3538 2908 -5.3322916666666664e+00 3538 2905 1.0668750000000001e+01 3539 3539 4.2733333333333334e+01 3539 2578 -1.0416666666666669e-03 3539 2680 -1.0416666666666669e-03 3539 2572 -1.0416666666666667e-03 3539 2577 6.2500000000000003e-03 3539 2579 -4.1666666666666666e-03 3539 3271 -1.0658333333333333e+01 3539 3272 1.0666666666666666e+01 3539 2919 -1.0416666666666669e-03 3539 2917 6.2500000000000003e-03 3539 2916 -4.1666666666666666e-03 3539 3550 1.0658333333333333e+01 3539 3546 -1.0666666666666666e+01 3539 2689 -1.0416666666666667e-03 3539 2688 6.2500000000000003e-03 3539 2687 -4.1666666666666666e-03 3539 3552 1.0658333333333333e+01 3539 3545 -1.0666666666666666e+01 3539 2796 -1.0416666666666667e-03 3539 2793 6.2500000000000003e-03 3539 2795 -4.1666666666666666e-03 3539 3551 1.0658333333333333e+01 3539 3540 -1.0666666666666666e+01 3540 3540 4.2691666666666663e+01 3540 2577 -5.3322916666666664e+00 3540 2807 -5.3322916666666664e+00 3540 2578 6.2500000000000003e-03 3540 3595 2.1331249999999997e+01 3540 3537 -1.0666666666666666e+01 3540 2582 -5.3322916666666664e+00 3540 2579 1.0668750000000001e+01 3540 2796 6.2500000000000003e-03 3540 3551 -2.1331249999999997e+01 3540 3539 -1.0666666666666666e+01 3540 2793 -5.3322916666666664e+00 3540 2795 1.0668750000000001e+01 3541 3541 4.2733333333333334e+01 3541 2643 -1.0416666666666669e-03 3541 2955 -1.0416666666666669e-03 3541 2649 -1.0416666666666667e-03 3541 2648 6.2500000000000003e-03 3541 2647 -4.1666666666666666e-03 3541 3609 1.0658333333333333e+01 3541 3548 -1.0666666666666666e+01 3541 2686 -1.0416666666666667e-03 3541 3324 -1.0658333333333333e+01 3541 3323 1.0666666666666666e+01 3541 2689 -1.0416666666666669e-03 3541 2695 6.2500000000000003e-03 3541 2687 -4.1666666666666666e-03 3541 2919 -1.0416666666666667e-03 3541 2930 6.2500000000000003e-03 3541 2916 -4.1666666666666666e-03 3541 3559 -1.0658333333333333e+01 3541 3545 -1.0666666666666666e+01 3541 2952 6.2500000000000003e-03 3541 2951 -4.1666666666666666e-03 3541 3608 1.0658333333333333e+01 3541 3542 -1.0666666666666666e+01 3542 3542 4.2691666666666663e+01 3542 2930 -5.3322916666666664e+00 3542 3535 -1.0666666666666666e+01 3542 2916 1.0668750000000001e+01 3542 3608 -2.1331249999999997e+01 3542 3541 -1.0666666666666666e+01 3542 2952 -5.3322916666666664e+00 3542 2951 1.0668750000000001e+01 3543 3543 4.2733333333333334e+01 3543 2754 -1.0416666666666669e-03 3543 2909 -1.0416666666666669e-03 3543 2762 -1.0416666666666667e-03 3543 2764 6.2500000000000003e-03 3543 2753 -4.1666666666666666e-03 3543 3604 -1.0658333333333333e+01 3543 3538 -1.0666666666666666e+01 3543 2645 -1.0416666666666667e-03 3543 3319 -1.0658333333333333e+01 3543 3316 1.0666666666666666e+01 3543 2649 -1.0416666666666669e-03 3543 2650 6.2500000000000003e-03 3543 2647 -4.1666666666666666e-03 3543 2955 -1.0416666666666667e-03 3543 2964 6.2500000000000003e-03 3543 2951 -4.1666666666666666e-03 3543 3620 -1.0658333333333333e+01 3543 3548 -1.0666666666666666e+01 3543 2910 6.2500000000000003e-03 3543 2905 -4.1666666666666666e-03 3543 3614 -1.0658333333333333e+01 3543 3544 -1.0666666666666666e+01 3544 3544 4.2691666666666663e+01 3544 2964 -5.3322916666666664e+00 3544 3535 -1.0666666666666666e+01 3544 2951 1.0668750000000001e+01 3544 3614 2.1331249999999997e+01 3544 3543 -1.0666666666666666e+01 3544 2910 -5.3322916666666664e+00 3544 2905 1.0668750000000001e+01 3545 3545 4.2691666666666663e+01 3545 2695 -5.3322916666666664e+00 3545 3559 2.1331249999999997e+01 3545 3541 -1.0666666666666666e+01 3545 2930 -5.3322916666666664e+00 3545 2919 6.2500000000000003e-03 3545 2917 -5.3322916666666664e+00 3545 2916 1.0668750000000001e+01 3545 2689 6.2500000000000003e-03 3545 3552 -2.1331249999999997e+01 3545 3539 -1.0666666666666666e+01 3545 2688 -5.3322916666666664e+00 3545 2687 1.0668750000000001e+01 3546 3546 4.2691666666666663e+01 3546 3535 -1.0666666666666666e+01 3546 2793 -5.3322916666666664e+00 3546 2795 1.0668750000000001e+01 3546 3550 -2.1331249999999997e+01 3546 3539 -1.0666666666666666e+01 3546 2917 -5.3322916666666664e+00 3546 2916 1.0668750000000001e+01 3547 3547 4.2691666666666663e+01 3547 2582 -5.3322916666666664e+00 3547 3599 2.1331249999999997e+01 3547 3537 -1.0666666666666666e+01 3547 2761 -5.3322916666666664e+00 3547 2752 6.2500000000000003e-03 3547 2751 -5.3322916666666664e+00 3547 2753 1.0668750000000001e+01 3547 2581 6.2500000000000003e-03 3547 3312 -2.1331249999999997e+01 3547 3313 1.0666666666666666e+01 3547 2580 -5.3322916666666664e+00 3547 2579 1.0668750000000001e+01 3548 3548 4.2691666666666663e+01 3548 2650 -5.3322916666666664e+00 3548 3620 2.1331249999999997e+01 3548 3543 -1.0666666666666666e+01 3548 2964 -5.3322916666666664e+00 3548 2955 6.2500000000000003e-03 3548 2952 -5.3322916666666664e+00 3548 2951 1.0668750000000001e+01 3548 2649 6.2500000000000003e-03 3548 3609 -2.1331249999999997e+01 3548 3541 -1.0666666666666666e+01 3548 2648 -5.3322916666666664e+00 3548 2647 1.0668750000000001e+01 3549 3549 4.2733333333333334e+01 3549 2572 1.0416666666666669e-03 3549 2796 1.0416666666666669e-03 3549 2578 1.0416666666666667e-03 3549 2577 -6.2500000000000003e-03 3549 2571 4.1666666666666666e-03 3549 3551 -1.0658333333333333e+01 3549 3571 1.0666666666666666e+01 3549 2680 1.0416666666666667e-03 3549 3271 1.0658333333333333e+01 3549 3270 -1.0666666666666666e+01 3549 2689 1.0416666666666669e-03 3549 2688 -6.2500000000000003e-03 3549 2690 4.1666666666666666e-03 3549 2919 1.0416666666666667e-03 3549 2917 -6.2500000000000003e-03 3549 2921 4.1666666666666666e-03 3549 3552 -1.0658333333333333e+01 3549 3556 -1.0666666666666666e+01 3549 2793 -6.2500000000000003e-03 3549 2792 4.1666666666666666e-03 3549 3550 -1.0658333333333333e+01 3549 3553 -1.0666666666666666e+01 3550 3550 6.4041666666666671e+01 3550 2921 -5.3312499999999998e+00 3550 2795 -5.3312499999999998e+00 3550 3546 -2.1331249999999997e+01 3550 3539 1.0658333333333333e+01 3550 2917 2.1331249999999997e+01 3550 2916 -5.3312499999999998e+00 3550 3553 2.1331249999999997e+01 3550 3549 -1.0658333333333333e+01 3550 2793 2.1331249999999997e+01 3550 2792 -5.3312499999999998e+00 3551 3551 6.4041666666666671e+01 3551 2579 -5.3312499999999998e+00 3551 2792 -5.3312499999999998e+00 3551 3571 -2.1331249999999997e+01 3551 3549 -1.0658333333333333e+01 3551 2578 -1.0658333333333333e+01 3551 2577 2.1331249999999997e+01 3551 2571 -5.3312499999999998e+00 3551 3540 -2.1331249999999997e+01 3551 3539 1.0658333333333333e+01 3551 2796 -1.0658333333333333e+01 3551 2793 2.1331249999999997e+01 3551 2795 -5.3312499999999998e+00 3552 3552 6.4041666666666671e+01 3552 2690 -5.3312499999999998e+00 3552 3556 2.1331249999999997e+01 3552 3549 -1.0658333333333333e+01 3552 2921 -5.3312499999999998e+00 3552 2919 -1.0658333333333333e+01 3552 2917 2.1331249999999997e+01 3552 2916 -5.3312499999999998e+00 3552 3545 -2.1331249999999997e+01 3552 3539 1.0658333333333333e+01 3552 2689 -1.0658333333333333e+01 3552 2688 2.1331249999999997e+01 3552 2687 -5.3312499999999998e+00 3553 3553 4.2691666666666663e+01 3553 2917 5.3322916666666664e+00 3553 3566 1.0666666666666666e+01 3553 2921 -1.0668750000000001e+01 3553 3550 2.1331249999999997e+01 3553 3549 -1.0666666666666666e+01 3553 2793 5.3322916666666664e+00 3553 2792 -1.0668750000000001e+01 3554 3554 3.2020833333333336e+01 3555 3555 3.2020833333333336e+01 3556 3556 4.2691666666666663e+01 3556 2688 5.3322916666666664e+00 3556 3552 2.1331249999999997e+01 3556 3549 -1.0666666666666666e+01 3556 2917 5.3322916666666664e+00 3556 2919 -6.2500000000000003e-03 3556 2922 5.3322916666666664e+00 3556 2921 -1.0668750000000001e+01 3556 2689 -6.2500000000000003e-03 3556 3557 -2.1331249999999997e+01 3556 3568 1.0666666666666666e+01 3556 2691 5.3322916666666664e+00 3556 2690 -1.0668750000000001e+01 3557 3557 6.4041666666666671e+01 3557 2692 5.3312499999999998e+00 3557 3558 -2.1331249999999997e+01 3557 3572 1.0658333333333333e+01 3557 2925 5.3312499999999998e+00 3557 2919 1.0658333333333333e+01 3557 2922 -2.1331249999999997e+01 3557 2921 5.3312499999999998e+00 3557 3556 -2.1331249999999997e+01 3557 3568 -1.0658333333333333e+01 3557 2689 1.0658333333333333e+01 3557 2691 -2.1331249999999997e+01 3557 2690 5.3312499999999998e+00 3558 3558 4.2691666666666663e+01 3558 2927 5.3322916666666664e+00 3558 3300 2.1331249999999997e+01 3558 3297 -1.0666666666666666e+01 3558 2683 5.3322916666666664e+00 3558 2689 -6.2500000000000003e-03 3558 2691 5.3322916666666664e+00 3558 2692 -1.0668750000000001e+01 3558 2919 -6.2500000000000003e-03 3558 3557 -2.1331249999999997e+01 3558 3572 -1.0666666666666666e+01 3558 2922 5.3322916666666664e+00 3558 2925 -1.0668750000000001e+01 3559 3559 6.4041666666666671e+01 3559 2687 5.3312499999999998e+00 3559 3545 2.1331249999999997e+01 3559 3541 -1.0658333333333333e+01 3559 2916 5.3312499999999998e+00 3559 2919 1.0658333333333333e+01 3559 2930 -2.1331249999999997e+01 3559 2929 5.3312499999999998e+00 3559 3293 2.1331249999999997e+01 3559 3289 -1.0658333333333333e+01 3559 2689 1.0658333333333333e+01 3559 2695 -2.1331249999999997e+01 3559 2682 5.3312499999999998e+00 3560 3560 3.2020833333333336e+01 3561 3561 3.2020833333333336e+01 3562 3562 3.2020833333333336e+01 3563 3563 4.2691666666666663e+01 3563 3629 1.0666666666666666e+01 3563 2807 5.3322916666666664e+00 3563 2799 -1.0668750000000001e+01 3563 3564 -2.1331249999999997e+01 3563 3602 -1.0666666666666666e+01 3563 2908 5.3322916666666664e+00 3563 2912 -1.0668750000000001e+01 3564 3564 6.4041666666666671e+01 3564 2799 5.3312499999999998e+00 3564 2905 5.3312499999999998e+00 3564 3536 2.1331249999999997e+01 3564 3537 -1.0658333333333333e+01 3564 2807 -2.1331249999999997e+01 3564 2795 5.3312499999999998e+00 3564 3563 -2.1331249999999997e+01 3564 3602 1.0658333333333333e+01 3564 2908 -2.1331249999999997e+01 3564 2912 5.3312499999999998e+00 3565 3565 3.2020833333333336e+01 3566 3566 4.2733333333333334e+01 3566 2792 -4.1666666666666666e-03 3566 3356 1.0666666666666666e+01 3566 3553 1.0666666666666666e+01 3566 2921 -4.1666666666666666e-03 3566 2936 -4.1666666666666666e-03 3566 3570 -1.0666666666666666e+01 3566 2611 -4.1666666666666666e-03 3566 3567 -1.0666666666666666e+01 3567 3567 4.2691666666666663e+01 3567 3183 1.0666666666666666e+01 3567 2936 1.0668750000000001e+01 3567 3566 -1.0666666666666666e+01 3567 2611 1.0668750000000001e+01 3568 3568 4.2733333333333334e+01 3568 2677 -1.0416666666666669e-03 3568 2593 -1.0416666666666667e-03 3568 2602 6.2500000000000003e-03 3568 2605 -4.1666666666666666e-03 3568 3246 -1.0658333333333333e+01 3568 3247 1.0666666666666666e+01 3568 2919 -1.0416666666666669e-03 3568 2922 6.2500000000000003e-03 3568 2921 -4.1666666666666666e-03 3568 3573 1.0658333333333333e+01 3568 3570 -1.0666666666666666e+01 3568 2689 -1.0416666666666667e-03 3568 2691 6.2500000000000003e-03 3568 2690 -4.1666666666666666e-03 3568 3557 -1.0658333333333333e+01 3568 3556 1.0666666666666666e+01 3568 2934 6.2500000000000003e-03 3568 2936 -4.1666666666666666e-03 3568 3574 1.0658333333333333e+01 3568 3569 -1.0666666666666666e+01 3569 3569 4.2691666666666663e+01 3569 2602 -5.3322916666666664e+00 3569 3183 1.0666666666666666e+01 3569 2605 1.0668750000000001e+01 3569 3574 -2.1331249999999997e+01 3569 3568 -1.0666666666666666e+01 3569 2934 -5.3322916666666664e+00 3569 2936 1.0668750000000001e+01 3570 3570 4.2691666666666663e+01 3570 3566 -1.0666666666666666e+01 3570 2934 -5.3322916666666664e+00 3570 2936 1.0668750000000001e+01 3570 3573 -2.1331249999999997e+01 3570 3568 -1.0666666666666666e+01 3570 2922 -5.3322916666666664e+00 3570 2921 1.0668750000000001e+01 3571 3571 4.2691666666666663e+01 3571 2563 -5.3322916666666664e+00 3571 3194 -2.1331249999999997e+01 3571 3192 1.0666666666666666e+01 3571 2806 -5.3322916666666664e+00 3571 2796 6.2500000000000003e-03 3571 2793 -5.3322916666666664e+00 3571 2792 1.0668750000000001e+01 3571 2578 6.2500000000000003e-03 3571 3551 -2.1331249999999997e+01 3571 3549 1.0666666666666666e+01 3571 2577 -5.3322916666666664e+00 3571 2571 1.0668750000000001e+01 3572 3572 4.2733333333333334e+01 3572 2593 1.0416666666666669e-03 3572 2602 -6.2500000000000003e-03 3572 2601 4.1666666666666666e-03 3572 3574 -1.0658333333333333e+01 3572 3585 1.0666666666666666e+01 3572 2677 1.0416666666666667e-03 3572 3246 1.0658333333333333e+01 3572 3245 -1.0666666666666666e+01 3572 2689 1.0416666666666669e-03 3572 2691 -6.2500000000000003e-03 3572 2692 4.1666666666666666e-03 3572 2919 1.0416666666666667e-03 3572 2922 -6.2500000000000003e-03 3572 2925 4.1666666666666666e-03 3572 3557 1.0658333333333333e+01 3572 3558 -1.0666666666666666e+01 3572 2934 -6.2500000000000003e-03 3572 2933 4.1666666666666666e-03 3572 3573 -1.0658333333333333e+01 3572 3575 -1.0666666666666666e+01 3573 3573 6.4041666666666671e+01 3573 2925 -5.3312499999999998e+00 3573 2936 -5.3312499999999998e+00 3573 3570 -2.1331249999999997e+01 3573 3568 1.0658333333333333e+01 3573 2922 2.1331249999999997e+01 3573 2921 -5.3312499999999998e+00 3573 3575 2.1331249999999997e+01 3573 3572 -1.0658333333333333e+01 3573 2934 2.1331249999999997e+01 3573 2933 -5.3312499999999998e+00 3574 3574 6.4041666666666671e+01 3574 2605 -5.3312499999999998e+00 3574 2933 -5.3312499999999998e+00 3574 3585 -2.1331249999999997e+01 3574 3572 -1.0658333333333333e+01 3574 2602 2.1331249999999997e+01 3574 2601 -5.3312499999999998e+00 3574 3569 -2.1331249999999997e+01 3574 3568 1.0658333333333333e+01 3574 2934 2.1331249999999997e+01 3574 2936 -5.3312499999999998e+00 3575 3575 4.2691666666666663e+01 3575 2922 5.3322916666666664e+00 3575 3581 1.0666666666666666e+01 3575 2925 -1.0668750000000001e+01 3575 3573 2.1331249999999997e+01 3575 3572 -1.0666666666666666e+01 3575 2934 5.3322916666666664e+00 3575 2933 -1.0668750000000001e+01 3576 3576 3.2020833333333336e+01 3577 3577 3.2020833333333336e+01 3578 3578 3.2020833333333336e+01 3579 3579 4.2733333333333334e+01 3579 2699 -4.1666666666666666e-03 3579 3584 -1.0666666666666666e+01 3579 3241 1.0666666666666666e+01 3579 2601 -4.1666666666666666e-03 3579 2933 -4.1666666666666666e-03 3579 3585 -1.0666666666666666e+01 3579 2944 -4.1666666666666666e-03 3579 3580 -1.0666666666666666e+01 3580 3580 4.2691666666666663e+01 3580 3581 -1.0666666666666666e+01 3580 2933 1.0668750000000001e+01 3580 3579 -1.0666666666666666e+01 3580 2944 1.0668750000000001e+01 3581 3581 4.2733333333333334e+01 3581 2742 -4.1666666666666666e-03 3581 3586 -1.0666666666666666e+01 3581 2933 -4.1666666666666666e-03 3581 3580 -1.0666666666666666e+01 3581 2925 -4.1666666666666666e-03 3581 3575 1.0666666666666666e+01 3581 2944 -4.1666666666666666e-03 3581 3582 -1.0666666666666666e+01 3582 3582 4.2691666666666663e+01 3582 3583 -1.0666666666666666e+01 3582 2742 1.0668750000000001e+01 3582 3581 -1.0666666666666666e+01 3582 2944 1.0668750000000001e+01 3583 3583 4.2733333333333334e+01 3583 2742 -4.1666666666666666e-03 3583 3582 -1.0666666666666666e+01 3583 3301 1.0666666666666666e+01 3583 2734 -4.1666666666666666e-03 3583 2699 -4.1666666666666666e-03 3583 3587 -1.0666666666666666e+01 3583 2944 -4.1666666666666666e-03 3583 3584 -1.0666666666666666e+01 3584 3584 4.2691666666666663e+01 3584 3579 -1.0666666666666666e+01 3584 2699 1.0668750000000001e+01 3584 3583 -1.0666666666666666e+01 3584 2944 1.0668750000000001e+01 3585 3585 4.2691666666666663e+01 3585 3579 -1.0666666666666666e+01 3585 2934 -5.3322916666666664e+00 3585 2933 1.0668750000000001e+01 3585 3574 -2.1331249999999997e+01 3585 3572 1.0666666666666666e+01 3585 2602 -5.3322916666666664e+00 3585 2601 1.0668750000000001e+01 3586 3586 4.2691666666666663e+01 3586 3581 -1.0666666666666666e+01 3586 2740 -5.3322916666666664e+00 3586 2742 1.0668750000000001e+01 3586 3296 -2.1331249999999997e+01 3586 3297 1.0666666666666666e+01 3586 2927 -5.3322916666666664e+00 3586 2925 1.0668750000000001e+01 3587 3587 4.2691666666666663e+01 3587 3583 -1.0666666666666666e+01 3587 2700 -5.3322916666666664e+00 3587 2699 1.0668750000000001e+01 3587 3238 -2.1331249999999997e+01 3587 3236 1.0666666666666666e+01 3587 2735 -5.3322916666666664e+00 3587 2734 1.0668750000000001e+01 3588 3588 3.2020833333333336e+01 3589 3589 3.2020833333333336e+01 3590 3590 3.2020833333333336e+01 3591 3591 3.2020833333333336e+01 3592 3592 3.2020833333333336e+01 3593 3593 3.2020833333333336e+01 3594 3594 3.2020833333333336e+01 3595 3595 6.4041666666666671e+01 3595 2585 5.3312499999999998e+00 3595 3596 -2.1331249999999997e+01 3595 3602 1.0658333333333333e+01 3595 2799 5.3312499999999998e+00 3595 2796 1.0658333333333333e+01 3595 2807 -2.1331249999999997e+01 3595 2795 5.3312499999999998e+00 3595 3540 2.1331249999999997e+01 3595 3537 -1.0658333333333333e+01 3595 2578 1.0658333333333333e+01 3595 2582 -2.1331249999999997e+01 3595 2579 5.3312499999999998e+00 3596 3596 4.2691666666666663e+01 3596 2582 5.3322916666666664e+00 3596 3595 -2.1331249999999997e+01 3596 3602 -1.0666666666666666e+01 3596 2807 5.3322916666666664e+00 3596 2796 -6.2500000000000003e-03 3596 2798 5.3322916666666664e+00 3596 2799 -1.0668750000000001e+01 3596 2578 -6.2500000000000003e-03 3596 3342 2.1331249999999997e+01 3596 3343 -1.0666666666666666e+01 3596 2586 5.3322916666666664e+00 3596 2585 -1.0668750000000001e+01 3597 3597 4.2691666666666663e+01 3597 2584 5.3322916666666664e+00 3597 2761 5.3322916666666664e+00 3597 2581 -6.2500000000000003e-03 3597 3599 -2.1331249999999997e+01 3597 3602 -1.0666666666666666e+01 3597 2582 5.3322916666666664e+00 3597 2585 -1.0668750000000001e+01 3597 2752 -6.2500000000000003e-03 3597 3598 -2.1331249999999997e+01 3597 3628 1.0666666666666666e+01 3597 2756 5.3322916666666664e+00 3597 2755 -1.0668750000000001e+01 3598 3598 6.4041666666666671e+01 3598 2585 5.3312499999999998e+00 3598 2765 5.3312499999999998e+00 3598 3600 -2.1331249999999997e+01 3598 3625 -1.0658333333333333e+01 3598 2581 1.0658333333333333e+01 3598 2584 -2.1331249999999997e+01 3598 2583 5.3312499999999998e+00 3598 3597 -2.1331249999999997e+01 3598 3628 -1.0658333333333333e+01 3598 2752 1.0658333333333333e+01 3598 2756 -2.1331249999999997e+01 3598 2755 5.3312499999999998e+00 3599 3599 6.4041666666666671e+01 3599 2755 5.3312499999999998e+00 3599 3597 -2.1331249999999997e+01 3599 3602 1.0658333333333333e+01 3599 2585 5.3312499999999998e+00 3599 2581 1.0658333333333333e+01 3599 2582 -2.1331249999999997e+01 3599 2579 5.3312499999999998e+00 3599 3547 2.1331249999999997e+01 3599 3537 -1.0658333333333333e+01 3599 2752 1.0658333333333333e+01 3599 2761 -2.1331249999999997e+01 3599 2753 5.3312499999999998e+00 3600 3600 4.2691666666666663e+01 3600 2567 5.3322916666666664e+00 3600 3280 2.1331249999999997e+01 3600 3277 -1.0666666666666666e+01 3600 2763 5.3322916666666664e+00 3600 2752 -6.2500000000000003e-03 3600 2756 5.3322916666666664e+00 3600 2765 -1.0668750000000001e+01 3600 2581 -6.2500000000000003e-03 3600 3598 -2.1331249999999997e+01 3600 3625 1.0666666666666666e+01 3600 2584 5.3322916666666664e+00 3600 2583 -1.0668750000000001e+01 3601 3601 6.4041666666666671e+01 3601 2912 -5.3312499999999998e+00 3601 3605 -2.1331249999999997e+01 3601 3602 -1.0658333333333333e+01 3601 2755 -5.3312499999999998e+00 3601 2762 -1.0658333333333333e+01 3601 2761 2.1331249999999997e+01 3601 2753 -5.3312499999999998e+00 3601 3538 -2.1331249999999997e+01 3601 3537 1.0658333333333333e+01 3601 2909 -1.0658333333333333e+01 3601 2908 2.1331249999999997e+01 3601 2905 -5.3312499999999998e+00 3602 3602 4.2733333333333334e+01 3602 2752 1.0416666666666669e-03 3602 2909 1.0416666666666669e-03 3602 2762 1.0416666666666667e-03 3602 2761 -6.2500000000000003e-03 3602 2755 4.1666666666666666e-03 3602 3601 -1.0658333333333333e+01 3602 3605 1.0666666666666666e+01 3602 2581 1.0416666666666667e-03 3602 3599 1.0658333333333333e+01 3602 3597 -1.0666666666666666e+01 3602 2578 1.0416666666666669e-03 3602 2582 -6.2500000000000003e-03 3602 2585 4.1666666666666666e-03 3602 2796 1.0416666666666667e-03 3602 2807 -6.2500000000000003e-03 3602 2799 4.1666666666666666e-03 3602 3595 1.0658333333333333e+01 3602 3596 -1.0666666666666666e+01 3602 2908 -6.2500000000000003e-03 3602 2912 4.1666666666666666e-03 3602 3564 1.0658333333333333e+01 3602 3563 -1.0666666666666666e+01 3603 3603 4.2691666666666663e+01 3603 2909 6.2500000000000003e-03 3603 2913 1.0668749999999999e+01 3603 2762 6.2500000000000003e-03 3603 2766 1.0668749999999999e+01 3603 2764 -5.3322916666666664e+00 3603 3604 2.1331249999999997e+01 3603 3622 1.0666666666666666e+01 3603 2910 -5.3322916666666664e+00 3603 3832 -5.3322916666666664e+00 3603 4522 -2.1331249999999997e+01 3603 4523 1.0666666666666666e+01 3603 3868 -5.3322916666666664e+00 3604 3604 6.4041666666666671e+01 3604 2766 5.3312499999999998e+00 3604 2905 5.3312499999999998e+00 3604 3538 2.1331249999999997e+01 3604 3543 -1.0658333333333333e+01 3604 2762 1.0658333333333333e+01 3604 2764 -2.1331249999999997e+01 3604 2753 5.3312499999999998e+00 3604 3603 2.1331249999999997e+01 3604 3622 1.0658333333333333e+01 3604 2909 1.0658333333333333e+01 3604 2910 -2.1331249999999997e+01 3604 2913 5.3312499999999998e+00 3605 3605 4.2691666666666663e+01 3605 2762 6.2500000000000003e-03 3605 2755 1.0668749999999999e+01 3605 2909 6.2500000000000003e-03 3605 2912 1.0668749999999999e+01 3605 2908 -5.3322916666666664e+00 3605 3601 -2.1331249999999997e+01 3605 3602 1.0666666666666666e+01 3605 2761 -5.3322916666666664e+00 3605 3869 -5.3322916666666664e+00 3605 4526 2.1331249999999997e+01 3605 4527 -1.0666666666666666e+01 3605 3833 -5.3322916666666664e+00 3606 3606 3.2020833333333336e+01 3607 3607 3.2020833333333336e+01 3608 3608 6.4041666666666671e+01 3608 2916 -5.3312499999999998e+00 3608 2954 -5.3312499999999998e+00 3608 3294 -2.1331249999999997e+01 3608 3289 1.0658333333333333e+01 3608 2930 2.1331249999999997e+01 3608 2929 -5.3312499999999998e+00 3608 3542 -2.1331249999999997e+01 3608 3541 1.0658333333333333e+01 3608 2952 2.1331249999999997e+01 3608 2951 -5.3312499999999998e+00 3609 3609 6.4041666666666671e+01 3609 2640 -5.3312499999999998e+00 3609 2951 -5.3312499999999998e+00 3609 3548 -2.1331249999999997e+01 3609 3541 1.0658333333333333e+01 3609 2649 -1.0658333333333333e+01 3609 2648 2.1331249999999997e+01 3609 2647 -5.3312499999999998e+00 3609 3290 -2.1331249999999997e+01 3609 3289 1.0658333333333333e+01 3609 2955 -1.0658333333333333e+01 3609 2952 2.1331249999999997e+01 3609 2954 -5.3312499999999998e+00 3610 3610 3.2020833333333336e+01 3611 3611 3.2020833333333336e+01 3612 3612 4.2691666666666663e+01 3612 3676 1.0666666666666666e+01 3612 2965 5.3322916666666664e+00 3612 2958 -1.0668750000000001e+01 3612 3529 2.1331249999999997e+01 3612 3528 -1.0666666666666666e+01 3612 2718 5.3322916666666664e+00 3612 2715 -1.0668750000000001e+01 3613 3613 3.2020833333333336e+01 3614 3614 6.4041666666666671e+01 3614 2913 5.3312499999999998e+00 3614 3615 -2.1331249999999997e+01 3614 3622 1.0658333333333333e+01 3614 2956 5.3312499999999998e+00 3614 2964 -2.1331249999999997e+01 3614 2951 5.3312499999999998e+00 3614 3544 2.1331249999999997e+01 3614 3543 -1.0658333333333333e+01 3614 2910 -2.1331249999999997e+01 3614 2905 5.3312499999999998e+00 3615 3615 4.2691666666666663e+01 3615 2910 5.3322916666666664e+00 3615 3614 -2.1331249999999997e+01 3615 3622 -1.0666666666666666e+01 3615 2964 5.3322916666666664e+00 3615 2956 -1.0668750000000001e+01 3615 3691 1.0666666666666666e+01 3615 2913 -1.0668750000000001e+01 3616 3616 3.2020833333333336e+01 3617 3617 3.2020833333333336e+01 3618 3618 4.2691666666666663e+01 3618 2657 5.3322916666666664e+00 3618 2964 5.3322916666666664e+00 3618 2649 -6.2500000000000003e-03 3618 3620 -2.1331249999999997e+01 3618 3622 -1.0666666666666666e+01 3618 2650 5.3322916666666664e+00 3618 2658 -1.0668750000000001e+01 3618 2955 -6.2500000000000003e-03 3618 3619 -2.1331249999999997e+01 3618 3688 -1.0666666666666666e+01 3618 2957 5.3322916666666664e+00 3618 2956 -1.0668750000000001e+01 3619 3619 6.4041666666666671e+01 3619 2658 5.3312499999999998e+00 3619 2958 5.3312499999999998e+00 3619 3621 -2.1331249999999997e+01 3619 3674 -1.0658333333333333e+01 3619 2649 1.0658333333333333e+01 3619 2657 -2.1331249999999997e+01 3619 2656 5.3312499999999998e+00 3619 3618 -2.1331249999999997e+01 3619 3688 1.0658333333333333e+01 3619 2955 1.0658333333333333e+01 3619 2957 -2.1331249999999997e+01 3619 2956 5.3312499999999998e+00 3620 3620 6.4041666666666671e+01 3620 2956 5.3312499999999998e+00 3620 3618 -2.1331249999999997e+01 3620 3622 1.0658333333333333e+01 3620 2658 5.3312499999999998e+00 3620 2649 1.0658333333333333e+01 3620 2650 -2.1331249999999997e+01 3620 2647 5.3312499999999998e+00 3620 3548 2.1331249999999997e+01 3620 3543 -1.0658333333333333e+01 3620 2955 1.0658333333333333e+01 3620 2964 -2.1331249999999997e+01 3620 2951 5.3312499999999998e+00 3621 3621 4.2691666666666663e+01 3621 2641 5.3322916666666664e+00 3621 3531 2.1331249999999997e+01 3621 3528 -1.0666666666666666e+01 3621 2965 5.3322916666666664e+00 3621 2955 -6.2500000000000003e-03 3621 2957 5.3322916666666664e+00 3621 2958 -1.0668750000000001e+01 3621 2649 -6.2500000000000003e-03 3621 3619 -2.1331249999999997e+01 3621 3674 1.0666666666666666e+01 3621 2657 5.3322916666666664e+00 3621 2656 -1.0668750000000001e+01 3622 3622 4.2733333333333334e+01 3622 2955 1.0416666666666669e-03 3622 2964 -6.2500000000000003e-03 3622 2956 4.1666666666666666e-03 3622 3614 1.0658333333333333e+01 3622 3615 -1.0666666666666666e+01 3622 2649 1.0416666666666667e-03 3622 3620 1.0658333333333333e+01 3622 3618 -1.0666666666666666e+01 3622 2762 1.0416666666666669e-03 3622 2645 1.0416666666666669e-03 3622 2650 -6.2500000000000003e-03 3622 2658 4.1666666666666666e-03 3622 2754 1.0416666666666667e-03 3622 2764 -6.2500000000000003e-03 3622 2766 4.1666666666666666e-03 3622 3319 1.0658333333333333e+01 3622 3320 -1.0666666666666666e+01 3622 2909 1.0416666666666667e-03 3622 2910 -6.2500000000000003e-03 3622 2913 4.1666666666666666e-03 3622 3604 1.0658333333333333e+01 3622 3603 1.0666666666666666e+01 3623 3623 4.2733333333333327e+01 3623 2412 6.2500000000000003e-03 3623 2410 -4.1666666666666666e-03 3623 2998 6.2500000000000003e-03 3623 2994 -4.1666666666666666e-03 3623 2455 -1.0416666666666669e-03 3623 2996 -1.0416666666666669e-03 3623 2448 -1.0416666666666667e-03 3623 2463 6.2500000000000003e-03 3623 2449 -4.1666666666666666e-03 3623 3659 -1.0658333333333333e+01 3623 3627 -1.0666666666666666e+01 3623 2405 -1.0416666666666667e-03 3623 3083 -1.0658333333333333e+01 3623 3082 1.0666666666666666e+01 3623 3801 -1.0416666666666669e-03 3623 3777 -1.0416666666666669e-03 3623 3807 -1.0416666666666667e-03 3623 3813 6.2500000000000003e-03 3623 3800 -4.1666666666666666e-03 3623 4466 -1.0658333333333333e+01 3623 4463 1.0666666666666666e+01 3623 4176 -1.0416666666666667e-03 3623 4942 -1.0658333333333333e+01 3623 4896 -1.0666666666666666e+01 3624 3624 4.2733333333333334e+01 3624 2569 -1.0416666666666669e-03 3624 2771 -1.0416666666666669e-03 3624 2575 -1.0416666666666667e-03 3624 2588 6.2500000000000003e-03 3624 2583 -4.1666666666666666e-03 3624 3366 -1.0658333333333333e+01 3624 3362 1.0666666666666666e+01 3624 2997 -1.0416666666666669e-03 3624 2448 -1.0416666666666669e-03 3624 2996 -1.0416666666666667e-03 3624 2995 6.2500000000000003e-03 3624 2994 -4.1666666666666666e-03 3624 3655 1.0658333333333333e+01 3624 3627 -1.0666666666666666e+01 3624 2780 -1.0416666666666667e-03 3624 2779 6.2500000000000003e-03 3624 2772 -4.1666666666666666e-03 3624 3656 1.0658333333333333e+01 3624 3626 -1.0666666666666666e+01 3624 2450 -1.0416666666666667e-03 3624 2447 6.2500000000000003e-03 3624 2449 -4.1666666666666666e-03 3624 3494 -1.0658333333333333e+01 3624 3493 1.0666666666666666e+01 3625 3625 4.2733333333333327e+01 3625 2773 6.2500000000000003e-03 3625 2772 -4.1666666666666666e-03 3625 2756 6.2500000000000003e-03 3625 2765 -4.1666666666666666e-03 3625 2575 -1.0416666666666669e-03 3625 2752 -1.0416666666666669e-03 3625 2581 -1.0416666666666667e-03 3625 2584 6.2500000000000003e-03 3625 2583 -4.1666666666666666e-03 3625 3598 -1.0658333333333333e+01 3625 3600 1.0666666666666666e+01 3625 2771 -1.0416666666666667e-03 3625 3363 -1.0658333333333333e+01 3625 3362 1.0666666666666666e+01 3625 3885 -1.0416666666666669e-03 3625 3872 -1.0416666666666669e-03 3625 3886 -1.0416666666666667e-03 3625 3884 6.2500000000000003e-03 3625 3903 -4.1666666666666666e-03 3625 4535 1.0658333333333333e+01 3625 4539 1.0666666666666666e+01 3625 3865 -1.0416666666666667e-03 3625 4534 1.0658333333333333e+01 3625 4536 1.0666666666666666e+01 3626 3626 4.2691666666666663e+01 3626 2780 6.2500000000000003e-03 3626 2772 1.0668749999999999e+01 3626 2997 6.2500000000000003e-03 3626 2994 1.0668749999999999e+01 3626 2995 -5.3322916666666664e+00 3626 3656 -2.1331249999999997e+01 3626 3624 -1.0666666666666666e+01 3626 2779 -5.3322916666666664e+00 3626 3876 -5.3322916666666664e+00 3626 4899 -2.1331249999999997e+01 3626 4895 -1.0666666666666666e+01 3626 4175 -5.3322916666666664e+00 3627 3627 4.2691666666666663e+01 3627 2998 -5.3322916666666664e+00 3627 3659 2.1331249999999997e+01 3627 3623 -1.0666666666666666e+01 3627 2463 -5.3322916666666664e+00 3627 2448 6.2500000000000003e-03 3627 2447 -5.3322916666666664e+00 3627 2449 1.0668750000000001e+01 3627 2996 6.2500000000000003e-03 3627 3655 -2.1331249999999997e+01 3627 3624 -1.0666666666666666e+01 3627 2995 -5.3322916666666664e+00 3627 2994 1.0668750000000001e+01 3628 3628 4.2733333333333327e+01 3628 2756 6.2500000000000003e-03 3628 2755 -4.1666666666666666e-03 3628 2773 6.2500000000000003e-03 3628 2774 -4.1666666666666666e-03 3628 2581 -1.0416666666666669e-03 3628 2771 -1.0416666666666669e-03 3628 2575 -1.0416666666666667e-03 3628 2584 6.2500000000000003e-03 3628 2585 -4.1666666666666666e-03 3628 3363 -1.0658333333333333e+01 3628 3364 1.0666666666666666e+01 3628 2752 -1.0416666666666667e-03 3628 3598 -1.0658333333333333e+01 3628 3597 1.0666666666666666e+01 3628 3886 -1.0416666666666669e-03 3628 3865 -1.0416666666666669e-03 3628 3885 -1.0416666666666667e-03 3628 3884 6.2500000000000003e-03 3628 3883 -4.1666666666666666e-03 3628 4534 1.0658333333333333e+01 3628 4532 -1.0666666666666666e+01 3628 3872 -1.0416666666666667e-03 3628 4535 1.0658333333333333e+01 3628 4531 -1.0666666666666666e+01 3629 3629 4.2733333333333327e+01 3629 2790 -4.1666666666666666e-03 3629 2912 -4.1666666666666666e-03 3629 2799 -4.1666666666666666e-03 3629 3563 1.0666666666666666e+01 3629 3347 1.0666666666666666e+01 3629 4229 -4.1666666666666666e-03 3629 4533 -1.0666666666666666e+01 3629 4530 -1.0666666666666666e+01 3630 3630 6.4058333333333323e+01 3630 2968 5.3291666666666666e+00 3630 2340 1.5995833333333334e+01 3630 2621 -4.1666666666666666e-03 3630 3634 -1.0666666666666666e+01 3630 3498 1.0666666666666666e+01 3630 3914 -5.3281250000000000e+00 3630 4782 -3.2002083333333331e+01 3630 4786 2.1320833333333333e+01 3630 4152 -5.3322916666666664e+00 3631 3631 4.2733333333333334e+01 3631 2575 -1.0416666666666669e-03 3631 2450 -1.0416666666666669e-03 3631 2569 -1.0416666666666667e-03 3631 2588 6.2500000000000003e-03 3631 2587 -4.1666666666666666e-03 3631 3494 -1.0658333333333333e+01 3631 3495 1.0666666666666666e+01 3631 2771 -1.0416666666666667e-03 3631 3366 -1.0658333333333333e+01 3631 3365 1.0666666666666666e+01 3631 2996 -1.0416666666666669e-03 3631 2780 -1.0416666666666669e-03 3631 2779 6.2500000000000003e-03 3631 2775 -4.1666666666666666e-03 3631 2997 -1.0416666666666667e-03 3631 2995 6.2500000000000003e-03 3631 2999 -4.1666666666666666e-03 3631 3656 1.0658333333333333e+01 3631 3636 -1.0666666666666666e+01 3631 2448 -1.0416666666666667e-03 3631 2447 6.2500000000000003e-03 3631 2446 -4.1666666666666666e-03 3631 3655 1.0658333333333333e+01 3631 3632 -1.0666666666666666e+01 3632 3632 4.2691666666666663e+01 3632 2995 -5.3322916666666664e+00 3632 2464 -5.3322916666666664e+00 3632 2996 6.2500000000000003e-03 3632 3660 -2.1331249999999997e+01 3632 3635 -1.0666666666666666e+01 3632 3000 -5.3322916666666664e+00 3632 2999 1.0668750000000001e+01 3632 2448 6.2500000000000003e-03 3632 3655 -2.1331249999999997e+01 3632 3631 -1.0666666666666666e+01 3632 2447 -5.3322916666666664e+00 3632 2446 1.0668750000000001e+01 3633 3633 4.2691666666666663e+01 3633 2776 6.2500000000000003e-03 3633 2775 1.0668749999999999e+01 3633 2971 6.2500000000000003e-03 3633 2968 1.0668749999999999e+01 3633 2969 -5.3322916666666664e+00 3633 3361 -2.1331249999999997e+01 3633 3359 1.0666666666666666e+01 3633 2770 -5.3322916666666664e+00 3633 3879 -5.3322916666666664e+00 3633 4566 2.1331249999999997e+01 3633 4786 1.0666666666666666e+01 3633 3914 -5.3322916666666664e+00 3634 3634 4.2691666666666663e+01 3634 3630 -1.0666666666666666e+01 3634 2619 -5.3322916666666664e+00 3634 2621 1.0668750000000001e+01 3634 3358 -2.1331249999999997e+01 3634 3359 1.0666666666666666e+01 3634 2969 -5.3322916666666664e+00 3634 2968 1.0668750000000001e+01 3635 3635 6.4058333333333323e+01 3635 2348 -1.0662499999999998e+01 3635 2340 1.5995833333333334e+01 3635 3000 1.0416666666666666e-02 3635 2999 5.3291666666666666e+00 3635 2448 -1.0416666666666669e-03 3635 2337 -1.0416666666666669e-03 3635 2457 -1.0416666666666667e-03 3635 2464 6.2500000000000003e-03 3635 2446 -4.1666666666666666e-03 3635 3116 1.0658333333333333e+01 3635 3112 1.0666666666666666e+01 3635 2996 -1.0416666666666667e-03 3635 3660 1.0658333333333333e+01 3635 3632 -1.0666666666666666e+01 3635 4152 -5.3322916666666664e+00 3635 4791 -3.2002083333333331e+01 3635 4786 2.1320833333333333e+01 3635 4170 -5.3281250000000000e+00 3636 3636 4.2691666666666663e+01 3636 2997 6.2500000000000003e-03 3636 2999 1.0668749999999999e+01 3636 2780 6.2500000000000003e-03 3636 2775 1.0668749999999999e+01 3636 2779 -5.3322916666666664e+00 3636 3656 -2.1331249999999997e+01 3636 3631 -1.0666666666666666e+01 3636 2995 -5.3322916666666664e+00 3636 4170 -5.3322916666666664e+00 3636 4785 -2.1331249999999997e+01 3636 4786 1.0666666666666666e+01 3636 3879 -5.3322916666666664e+00 3637 3637 3.2020833333333336e+01 3638 3638 3.2020833333333336e+01 3639 3639 6.4041666666666671e+01 3639 2778 5.3312499999999998e+00 3639 3640 2.1331249999999997e+01 3639 3641 1.0658333333333333e+01 3639 2977 5.3312499999999998e+00 3639 2971 1.0658333333333333e+01 3639 2974 -2.1331249999999997e+01 3639 2973 5.3312499999999998e+00 3639 3340 2.1331249999999997e+01 3639 3335 -1.0658333333333333e+01 3639 2776 1.0658333333333333e+01 3639 2777 -2.1331249999999997e+01 3639 2767 5.3312499999999998e+00 3640 3640 4.2691666666666663e+01 3640 2971 6.2500000000000003e-03 3640 2977 1.0668749999999999e+01 3640 2776 6.2500000000000003e-03 3640 2778 1.0668749999999999e+01 3640 2777 -5.3322916666666664e+00 3640 3639 2.1331249999999997e+01 3640 3641 1.0666666666666666e+01 3640 2974 -5.3322916666666664e+00 3640 3913 -5.3322916666666664e+00 3640 4560 -2.1331249999999997e+01 3640 4547 -1.0666666666666666e+01 3640 3873 -5.3322916666666664e+00 3641 3641 4.2733333333333334e+01 3641 2784 1.0416666666666669e-03 3641 2787 -6.2500000000000003e-03 3641 2786 4.1666666666666666e-03 3641 3643 -1.0658333333333333e+01 3641 3651 1.0666666666666666e+01 3641 2769 1.0416666666666667e-03 3641 3351 1.0658333333333333e+01 3641 3350 1.0666666666666666e+01 3641 2776 1.0416666666666669e-03 3641 2777 -6.2500000000000003e-03 3641 2778 4.1666666666666666e-03 3641 2971 1.0416666666666667e-03 3641 2974 -6.2500000000000003e-03 3641 2977 4.1666666666666666e-03 3641 3639 1.0658333333333333e+01 3641 3640 1.0666666666666666e+01 3641 2980 -6.2500000000000003e-03 3641 2979 4.1666666666666666e-03 3641 3642 -1.0658333333333333e+01 3641 3644 -1.0666666666666666e+01 3642 3642 6.4041666666666671e+01 3642 2977 -5.3312499999999998e+00 3642 2982 -5.3312499999999998e+00 3642 3341 -2.1331249999999997e+01 3642 3335 1.0658333333333333e+01 3642 2974 2.1331249999999997e+01 3642 2973 -5.3312499999999998e+00 3642 3644 2.1331249999999997e+01 3642 3641 -1.0658333333333333e+01 3642 2980 2.1331249999999997e+01 3642 2979 -5.3312499999999998e+00 3643 3643 6.4041666666666671e+01 3643 2781 -5.3312499999999998e+00 3643 2979 -5.3312499999999998e+00 3643 3651 -2.1331249999999997e+01 3643 3641 -1.0658333333333333e+01 3643 2787 2.1331249999999997e+01 3643 2786 -5.3312499999999998e+00 3643 3336 -2.1331249999999997e+01 3643 3335 1.0658333333333333e+01 3643 2980 2.1331249999999997e+01 3643 2982 -5.3312499999999998e+00 3644 3644 4.2691666666666663e+01 3644 2974 5.3322916666666664e+00 3644 3650 1.0666666666666666e+01 3644 2977 -1.0668750000000001e+01 3644 3642 2.1331249999999997e+01 3644 3641 -1.0666666666666666e+01 3644 2980 5.3322916666666664e+00 3644 2979 -1.0668750000000001e+01 3645 3645 3.2020833333333336e+01 3646 3646 3.2020833333333336e+01 3647 3647 3.2020833333333336e+01 3648 3648 4.2733333333333327e+01 3648 2990 -4.1666666666666666e-03 3648 2786 -4.1666666666666666e-03 3648 2979 -4.1666666666666666e-03 3648 3651 -1.0666666666666666e+01 3648 3649 -1.0666666666666666e+01 3648 3937 -4.1666666666666666e-03 3648 4549 -1.0666666666666666e+01 3648 4551 -1.0666666666666666e+01 3649 3649 4.2691666666666663e+01 3649 3650 -1.0666666666666666e+01 3649 2979 1.0668750000000001e+01 3649 3648 -1.0666666666666666e+01 3649 2990 1.0668750000000001e+01 3650 3650 6.4058333333333323e+01 3650 2990 1.5995833333333334e+01 3650 2977 5.3291666666666666e+00 3650 2979 -4.1666666666666666e-03 3650 3649 -1.0666666666666666e+01 3650 3644 1.0666666666666666e+01 3650 3911 -5.3322916666666664e+00 3650 4554 -3.2002083333333331e+01 3650 4547 -2.1320833333333333e+01 3650 3913 -5.3281250000000000e+00 3651 3651 4.2691666666666663e+01 3651 3648 -1.0666666666666666e+01 3651 2980 -5.3322916666666664e+00 3651 2979 1.0668750000000001e+01 3651 3643 -2.1331249999999997e+01 3651 3641 1.0666666666666666e+01 3651 2787 -5.3322916666666664e+00 3651 2786 1.0668750000000001e+01 3652 3652 3.2020833333333336e+01 3653 3653 3.2020833333333336e+01 3654 3654 3.2020833333333336e+01 3655 3655 6.4041666666666671e+01 3655 2999 -5.3312499999999998e+00 3655 2449 -5.3312499999999998e+00 3655 3627 -2.1331249999999997e+01 3655 3624 1.0658333333333333e+01 3655 2996 -1.0658333333333333e+01 3655 2995 2.1331249999999997e+01 3655 2994 -5.3312499999999998e+00 3655 3632 -2.1331249999999997e+01 3655 3631 1.0658333333333333e+01 3655 2448 -1.0658333333333333e+01 3655 2447 2.1331249999999997e+01 3655 2446 -5.3312499999999998e+00 3656 3656 6.4041666666666671e+01 3656 2775 -5.3312499999999998e+00 3656 3636 -2.1331249999999997e+01 3656 3631 1.0658333333333333e+01 3656 2999 -5.3312499999999998e+00 3656 2997 -1.0658333333333333e+01 3656 2995 2.1331249999999997e+01 3656 2994 -5.3312499999999998e+00 3656 3626 -2.1331249999999997e+01 3656 3624 1.0658333333333333e+01 3656 2780 -1.0658333333333333e+01 3656 2779 2.1331249999999997e+01 3656 2772 -5.3312499999999998e+00 3657 3657 4.2666666666916662e+01 3657 3002 5.3333333333229165e+00 3657 2463 5.3333333333229165e+00 3657 2996 -6.2499999999999991e-11 3657 3659 -2.1333333333312499e+01 3657 3661 1.0666666666666666e+01 3657 2998 5.3333333333229165e+00 3657 3001 -1.0666666666687499e+01 3657 2448 -6.2499999999999991e-11 3657 3658 2.1333333333312499e+01 3657 3698 1.0666666666666666e+01 3657 2452 5.3333333333229165e+00 3657 2453 -1.0666666666687499e+01 3658 3658 6.4000000000416662e+01 3658 2448 -1.0666666666583334e+01 3658 2452 2.1333333333312499e+01 3658 2451 -5.3333333333124999e+00 3658 3701 1.0666666666583334e+01 3658 2996 -1.0666666666583334e+01 3658 3002 2.1333333333312499e+01 3658 3001 -5.3333333333124999e+00 3658 3657 2.1333333333312499e+01 3658 3698 1.0666666666583334e+01 3658 2453 -5.3333333333124999e+00 3658 4768 -2.1333333333312499e+01 3658 4182 -5.3333333333124999e+00 3659 3659 6.4020833333541674e+01 3659 2453 5.3333333333124999e+00 3659 3657 -2.1333333333312499e+01 3659 3661 -1.0666666666583334e+01 3659 3001 5.3333333333124999e+00 3659 2996 1.0662499999958333e+01 3659 2998 -2.1332291666656246e+01 3659 2994 5.3312499999999998e+00 3659 3627 2.1331249999999997e+01 3659 3623 -1.0658333333333333e+01 3659 2448 1.0662499999958333e+01 3659 2463 -2.1332291666656246e+01 3659 2449 5.3312499999999998e+00 3660 3660 6.4020833333541674e+01 3660 2996 -1.0662499999958333e+01 3660 3000 2.1332291666656246e+01 3660 2448 -1.0662499999958333e+01 3660 2464 2.1332291666656246e+01 3660 2451 -5.3333333333124999e+00 3660 2446 -5.3312499999999998e+00 3660 3632 -2.1331249999999997e+01 3660 3635 1.0658333333333333e+01 3660 2999 -5.3312499999999998e+00 3660 4182 -5.3333333333124999e+00 3660 4768 -2.1333333333312499e+01 3660 4763 1.0666666666583334e+01 3661 3661 4.2666666667333324e+01 3661 2998 6.2499999999999991e-11 3661 3001 -4.1666666666666665e-11 3661 2412 6.2499999999999991e-11 3661 2448 -1.0416666666666666e-11 3661 2405 -1.0416666666666666e-11 3661 2455 -1.0416666666666666e-11 3661 2463 6.2499999999999991e-11 3661 2453 -4.1666666666666665e-11 3661 3083 -1.0666666666583334e+01 3661 3084 1.0666666666666666e+01 3661 2996 -1.0416666666666666e-11 3661 3659 -1.0666666666583334e+01 3661 3657 1.0666666666666666e+01 3661 3807 -1.0416666666666666e-11 3661 4176 -1.0416666666666666e-11 3661 3801 -1.0416666666666666e-11 3661 3813 6.2499999999999991e-11 3661 3804 -4.1666666666666665e-11 3661 4942 -1.0666666666583334e+01 3661 4943 1.0666666666666666e+01 3661 3777 -1.0416666666666666e-11 3661 290 -4.1666666666666665e-11 3661 4466 -1.0666666666583334e+01 3661 4465 1.0666666666666666e+01 3662 3662 4.2733333333333327e+01 3662 2758 6.2500000000000003e-03 3662 2757 -4.1666666666666666e-03 3662 2830 6.2500000000000003e-03 3662 2645 -1.0416666666666669e-03 3662 2824 -1.0416666666666669e-03 3662 2653 -1.0416666666666667e-03 3662 2659 6.2500000000000003e-03 3662 2651 -4.1666666666666666e-03 3662 3668 -1.0658333333333333e+01 3662 3663 -1.0666666666666666e+01 3662 2754 -1.0416666666666667e-03 3662 3318 -1.0658333333333333e+01 3662 3317 1.0666666666666666e+01 3662 3845 -1.0416666666666669e-03 3662 3867 -1.0416666666666669e-03 3662 3839 -1.0416666666666667e-03 3662 3852 6.2500000000000003e-03 3662 3851 -4.1666666666666666e-03 3662 4513 -1.0658333333333333e+01 3662 4516 1.0666666666666666e+01 3662 3958 -1.0416666666666667e-03 3662 491 -4.1666666666666666e-03 3662 4606 -1.0658333333333333e+01 3662 4605 1.0666666666666666e+01 3663 3663 4.2691666666666663e+01 3663 2830 -5.3322916666666664e+00 3663 3668 2.1331249999999997e+01 3663 3662 -1.0666666666666666e+01 3663 2659 -5.3322916666666664e+00 3663 2653 6.2500000000000003e-03 3663 2652 -5.3322916666666664e+00 3663 2651 1.0668750000000001e+01 3663 2824 6.2500000000000003e-03 3663 3384 -2.1331249999999997e+01 3663 3383 -1.0666666666666666e+01 3663 2822 -5.3322916666666664e+00 3663 491 1.0668750000000001e+01 3664 3664 6.4041666666666671e+01 3664 2826 5.3312499999999998e+00 3664 3665 -2.1331249999999997e+01 3664 3669 1.0658333333333333e+01 3664 2656 5.3312499999999998e+00 3664 2653 1.0658333333333333e+01 3664 2655 -2.1331249999999997e+01 3664 2654 5.3312499999999998e+00 3664 3379 2.1331249999999997e+01 3664 3374 -1.0658333333333333e+01 3664 2824 1.0658333333333333e+01 3664 2825 -2.1331249999999997e+01 3664 2821 5.3312499999999998e+00 3665 3665 4.2691666666666663e+01 3665 2657 5.3322916666666664e+00 3665 3666 -2.1331249999999997e+01 3665 3674 1.0666666666666666e+01 3665 2828 5.3322916666666664e+00 3665 2824 -6.2500000000000003e-03 3665 2825 5.3322916666666664e+00 3665 2826 -1.0668750000000001e+01 3665 2653 -6.2500000000000003e-03 3665 3664 -2.1331249999999997e+01 3665 3669 -1.0666666666666666e+01 3665 2655 5.3322916666666664e+00 3665 2656 -1.0668750000000001e+01 3666 3666 6.4041666666666671e+01 3666 2829 5.3312499999999998e+00 3666 3667 -2.1331249999999997e+01 3666 3688 1.0658333333333333e+01 3666 2658 5.3312499999999998e+00 3666 2653 1.0658333333333333e+01 3666 2657 -2.1331249999999997e+01 3666 2656 5.3312499999999998e+00 3666 3665 -2.1331249999999997e+01 3666 3674 -1.0658333333333333e+01 3666 2824 1.0658333333333333e+01 3666 2828 -2.1331249999999997e+01 3666 2826 5.3312499999999998e+00 3667 3667 4.2691666666666663e+01 3667 2828 5.3322916666666664e+00 3667 3666 -2.1331249999999997e+01 3667 3688 -1.0666666666666666e+01 3667 2657 5.3322916666666664e+00 3667 2653 -6.2500000000000003e-03 3667 2659 5.3322916666666664e+00 3667 2658 -1.0668750000000001e+01 3667 2824 -6.2500000000000003e-03 3667 3668 -2.1331249999999997e+01 3667 3692 1.0666666666666666e+01 3667 2830 5.3322916666666664e+00 3667 2829 -1.0668750000000001e+01 3668 3668 6.4041666666666671e+01 3668 3663 2.1331249999999997e+01 3668 3662 -1.0658333333333333e+01 3668 2651 5.3312499999999998e+00 3668 2653 1.0658333333333333e+01 3668 2659 -2.1331249999999997e+01 3668 2658 5.3312499999999998e+00 3668 3667 -2.1331249999999997e+01 3668 3692 -1.0658333333333333e+01 3668 2824 1.0658333333333333e+01 3668 2830 -2.1331249999999997e+01 3668 2829 5.3312499999999998e+00 3668 491 5.3312499999999998e+00 3669 3669 4.2733333333333334e+01 3669 2840 -6.2500000000000003e-03 3669 2839 4.1666666666666666e-03 3669 3670 -1.0658333333333333e+01 3669 3678 1.0666666666666666e+01 3669 3394 1.0658333333333333e+01 3669 3393 -1.0666666666666666e+01 3669 2638 1.0416666666666669e-03 3669 2824 1.0416666666666669e-03 3669 2825 -6.2500000000000003e-03 3669 2826 4.1666666666666666e-03 3669 2653 1.0416666666666667e-03 3669 2655 -6.2500000000000003e-03 3669 2656 4.1666666666666666e-03 3669 3664 1.0658333333333333e+01 3669 3665 -1.0666666666666666e+01 3669 2892 1.0416666666666667e-03 3669 2891 -6.2500000000000003e-03 3669 2890 4.1666666666666666e-03 3669 3526 1.0658333333333333e+01 3669 3525 -1.0666666666666666e+01 3669 1251 1.0416666666666669e-03 3669 1648 1.0416666666666667e-03 3670 3670 6.4041666666666671e+01 3670 2836 -5.3312499999999998e+00 3670 2890 -5.3312499999999998e+00 3670 3678 -2.1331249999999997e+01 3670 3669 -1.0658333333333333e+01 3670 2840 2.1331249999999997e+01 3670 2839 -5.3312499999999998e+00 3670 3375 -2.1331249999999997e+01 3670 3374 1.0658333333333333e+01 3670 2891 2.1331249999999997e+01 3670 2893 -5.3312499999999998e+00 3671 3671 4.2733333333333334e+01 3671 3004 -4.1666666666666666e-03 3671 3677 -1.0666666666666666e+01 3671 3673 -1.0666666666666666e+01 3671 2839 -4.1666666666666666e-03 3671 2890 -4.1666666666666666e-03 3671 3678 -1.0666666666666666e+01 3671 2715 -4.1666666666666666e-03 3671 3532 1.0666666666666666e+01 3672 3672 4.2733333333333334e+01 3672 3014 -1.0416666666666669e-03 3672 3018 6.2500000000000003e-03 3672 3016 -4.1666666666666666e-03 3672 3687 1.0658333333333333e+01 3672 3680 -1.0666666666666666e+01 3672 2831 -1.0416666666666667e-03 3672 3686 1.0658333333333333e+01 3672 3679 -1.0666666666666666e+01 3672 2827 6.2500000000000003e-03 3672 2826 -4.1666666666666666e-03 3672 2844 6.2500000000000003e-03 3672 2839 -4.1666666666666666e-03 3672 3395 1.0658333333333333e+01 3672 3393 1.0666666666666666e+01 3672 3005 6.2500000000000003e-03 3672 3004 -4.1666666666666666e-03 3672 3685 1.0658333333333333e+01 3672 3673 -1.0666666666666666e+01 3672 1648 -1.0416666666666669e-03 3672 1251 -1.0416666666666667e-03 3673 3673 4.2691666666666663e+01 3673 2844 -5.3322916666666664e+00 3673 3671 -1.0666666666666666e+01 3673 2839 1.0668750000000001e+01 3673 3685 -2.1331249999999997e+01 3673 3672 -1.0666666666666666e+01 3673 3005 -5.3322916666666664e+00 3673 3004 1.0668750000000001e+01 3674 3674 4.2733333333333334e+01 3674 2831 -1.0416666666666669e-03 3674 3014 -1.0416666666666667e-03 3674 3012 6.2500000000000003e-03 3674 3016 -4.1666666666666666e-03 3674 3690 1.0658333333333333e+01 3674 3679 -1.0666666666666666e+01 3674 2653 -1.0416666666666669e-03 3674 2955 -1.0416666666666669e-03 3674 2649 -1.0416666666666667e-03 3674 2657 6.2500000000000003e-03 3674 2656 -4.1666666666666666e-03 3674 3619 -1.0658333333333333e+01 3674 3621 1.0666666666666666e+01 3674 2824 -1.0416666666666667e-03 3674 2828 6.2500000000000003e-03 3674 2826 -4.1666666666666666e-03 3674 3666 -1.0658333333333333e+01 3674 3665 1.0666666666666666e+01 3674 2957 6.2500000000000003e-03 3674 2958 -4.1666666666666666e-03 3674 3689 1.0658333333333333e+01 3674 3675 -1.0666666666666666e+01 3675 3675 4.2691666666666663e+01 3675 3012 -5.3322916666666664e+00 3675 3676 -1.0666666666666666e+01 3675 3016 1.0668750000000001e+01 3675 3689 -2.1331249999999997e+01 3675 3674 -1.0666666666666666e+01 3675 2957 -5.3322916666666664e+00 3675 2958 1.0668750000000001e+01 3676 3676 4.2733333333333334e+01 3676 3004 -4.1666666666666666e-03 3676 3680 -1.0666666666666666e+01 3676 2958 -4.1666666666666666e-03 3676 3612 1.0666666666666666e+01 3676 3016 -4.1666666666666666e-03 3676 3675 -1.0666666666666666e+01 3676 2715 -4.1666666666666666e-03 3676 3677 -1.0666666666666666e+01 3677 3677 4.2691666666666663e+01 3677 3671 -1.0666666666666666e+01 3677 3004 1.0668750000000001e+01 3677 3676 -1.0666666666666666e+01 3677 2715 1.0668750000000001e+01 3678 3678 4.2691666666666663e+01 3678 3671 -1.0666666666666666e+01 3678 2891 -5.3322916666666664e+00 3678 2890 1.0668750000000001e+01 3678 3670 -2.1331249999999997e+01 3678 3669 1.0666666666666666e+01 3678 2840 -5.3322916666666664e+00 3678 2839 1.0668750000000001e+01 3679 3679 4.2691666666666663e+01 3679 3018 -5.3322916666666664e+00 3679 3686 -2.1331249999999997e+01 3679 3672 -1.0666666666666666e+01 3679 2827 -5.3322916666666664e+00 3679 2831 6.2500000000000003e-03 3679 2828 -5.3322916666666664e+00 3679 2826 1.0668750000000001e+01 3679 3014 6.2500000000000003e-03 3679 3690 -2.1331249999999997e+01 3679 3674 -1.0666666666666666e+01 3679 3012 -5.3322916666666664e+00 3679 3016 1.0668750000000001e+01 3680 3680 4.2691666666666663e+01 3680 3676 -1.0666666666666666e+01 3680 3005 -5.3322916666666664e+00 3680 3004 1.0668750000000001e+01 3680 3687 -2.1331249999999997e+01 3680 3672 -1.0666666666666666e+01 3680 3018 -5.3322916666666664e+00 3680 3016 1.0668750000000001e+01 3681 3681 3.2020833333333336e+01 3682 3682 3.2020833333333336e+01 3683 3683 3.2020833333333336e+01 3684 3684 3.2020833333333336e+01 3685 3685 6.4041666666666671e+01 3685 3005 2.1331249999999997e+01 3685 2844 2.1331249999999997e+01 3685 2839 -5.3312499999999998e+00 3685 3673 -2.1331249999999997e+01 3685 3672 1.0658333333333333e+01 3685 3004 -5.3312499999999998e+00 3685 4290 -5.3312499999999998e+00 3685 4954 -2.1331249999999997e+01 3685 4950 1.0658333333333333e+01 3685 4287 -5.3312499999999998e+00 3686 3686 6.4041666666666671e+01 3686 2831 -1.0658333333333333e+01 3686 2827 2.1331249999999997e+01 3686 3014 -1.0658333333333333e+01 3686 3018 2.1331249999999997e+01 3686 3016 -5.3312499999999998e+00 3686 3679 -2.1331249999999997e+01 3686 3672 1.0658333333333333e+01 3686 2826 -5.3312499999999998e+00 3686 3963 -5.3312499999999998e+00 3686 4640 2.1331249999999997e+01 3686 4950 1.0658333333333333e+01 3686 3994 -5.3312499999999998e+00 3687 3687 6.4041666666666671e+01 3687 3018 2.1331249999999997e+01 3687 3005 2.1331249999999997e+01 3687 3004 -5.3312499999999998e+00 3687 3680 -2.1331249999999997e+01 3687 3672 1.0658333333333333e+01 3687 3016 -5.3312499999999998e+00 3687 3994 -5.3312499999999998e+00 3687 4951 -2.1331249999999997e+01 3687 4950 1.0658333333333333e+01 3687 4290 -5.3312499999999998e+00 3688 3688 4.2733333333333334e+01 3688 3014 1.0416666666666669e-03 3688 3012 -6.2500000000000003e-03 3688 3011 4.1666666666666666e-03 3688 3689 -1.0658333333333333e+01 3688 3694 1.0666666666666666e+01 3688 2831 1.0416666666666667e-03 3688 3690 -1.0658333333333333e+01 3688 3693 1.0666666666666666e+01 3688 2649 1.0416666666666669e-03 3688 2824 1.0416666666666669e-03 3688 2828 -6.2500000000000003e-03 3688 2829 4.1666666666666666e-03 3688 2653 1.0416666666666667e-03 3688 2657 -6.2500000000000003e-03 3688 2658 4.1666666666666666e-03 3688 3666 1.0658333333333333e+01 3688 3667 -1.0666666666666666e+01 3688 2955 1.0416666666666667e-03 3688 2957 -6.2500000000000003e-03 3688 2956 4.1666666666666666e-03 3688 3619 1.0658333333333333e+01 3688 3618 -1.0666666666666666e+01 3689 3689 6.4041666666666671e+01 3689 3016 -5.3312499999999998e+00 3689 2956 -5.3312499999999998e+00 3689 3694 -2.1331249999999997e+01 3689 3688 -1.0658333333333333e+01 3689 3012 2.1331249999999997e+01 3689 3011 -5.3312499999999998e+00 3689 3675 -2.1331249999999997e+01 3689 3674 1.0658333333333333e+01 3689 2957 2.1331249999999997e+01 3689 2958 -5.3312499999999998e+00 3690 3690 6.4041666666666671e+01 3690 2826 -5.3312499999999998e+00 3690 3679 -2.1331249999999997e+01 3690 3674 1.0658333333333333e+01 3690 3016 -5.3312499999999998e+00 3690 3014 -1.0658333333333333e+01 3690 3012 2.1331249999999997e+01 3690 3011 -5.3312499999999998e+00 3690 3693 -2.1331249999999997e+01 3690 3688 -1.0658333333333333e+01 3690 2831 -1.0658333333333333e+01 3690 2828 2.1331249999999997e+01 3690 2829 -5.3312499999999998e+00 3691 3691 4.2733333333333327e+01 3691 2913 -4.1666666666666666e-03 3691 3011 -4.1666666666666666e-03 3691 2956 -4.1666666666666666e-03 3691 3694 -1.0666666666666666e+01 3691 3615 1.0666666666666666e+01 3691 4001 -4.1666666666666666e-03 3691 4965 -1.0666666666666666e+01 3691 4637 1.0666666666666666e+01 3692 3692 4.2733333333333327e+01 3692 2830 6.2500000000000003e-03 3692 2829 -4.1666666666666666e-03 3692 2758 6.2500000000000003e-03 3692 2766 -4.1666666666666666e-03 3692 2653 -1.0416666666666669e-03 3692 2754 -1.0416666666666669e-03 3692 2645 -1.0416666666666667e-03 3692 2659 6.2500000000000003e-03 3692 2658 -4.1666666666666666e-03 3692 3318 -1.0658333333333333e+01 3692 3320 1.0666666666666666e+01 3692 2824 -1.0416666666666667e-03 3692 3668 -1.0658333333333333e+01 3692 3667 1.0666666666666666e+01 3692 3839 -1.0416666666666669e-03 3692 3958 -1.0416666666666669e-03 3692 3845 -1.0416666666666667e-03 3692 3852 6.2500000000000003e-03 3692 3853 -4.1666666666666666e-03 3692 4606 -1.0658333333333333e+01 3692 4607 1.0666666666666666e+01 3692 3867 -1.0416666666666667e-03 3692 4513 -1.0658333333333333e+01 3692 4512 1.0666666666666666e+01 3693 3693 4.2691666666666663e+01 3693 2831 6.2500000000000003e-03 3693 2829 1.0668749999999999e+01 3693 3014 6.2500000000000003e-03 3693 3011 1.0668749999999999e+01 3693 3012 -5.3322916666666664e+00 3693 3690 -2.1331249999999997e+01 3693 3688 1.0666666666666666e+01 3693 2828 -5.3322916666666664e+00 3693 3960 -5.3322916666666664e+00 3693 4636 -2.1331249999999997e+01 3693 4634 1.0666666666666666e+01 3693 3991 -5.3322916666666664e+00 3694 3694 4.2691666666666663e+01 3694 3691 -1.0666666666666666e+01 3694 2957 -5.3322916666666664e+00 3694 2956 1.0668750000000001e+01 3694 3689 -2.1331249999999997e+01 3694 3688 1.0666666666666666e+01 3694 3012 -5.3322916666666664e+00 3694 3011 1.0668750000000001e+01 3695 3695 3.2020833333333336e+01 3696 3696 3.2020833333333336e+01 3697 3697 3.2020833333333336e+01 3698 3698 4.2666666667333331e+01 3698 2996 -1.0416666666666666e-11 3698 3022 -1.0416666666666666e-11 3698 3003 -1.0416666666666666e-11 3698 3002 6.2499999999999991e-11 3698 3001 -4.1666666666666665e-11 3698 3703 1.0666666666583334e+01 3698 3700 -1.0666666666666666e+01 3698 2444 -1.0416666666666666e-11 3698 2485 -1.0416666666666666e-11 3698 2493 6.2499999999999991e-11 3698 2492 -4.1666666666666665e-11 3698 3101 -1.0666666666583334e+01 3698 3104 1.0666666666666666e+01 3698 3020 6.2499999999999991e-11 3698 3702 1.0666666666583334e+01 3698 3699 -1.0666666666666666e+01 3698 2448 -1.0416666666666666e-11 3698 2452 6.2499999999999991e-11 3698 2453 -4.1666666666666665e-11 3698 3658 1.0666666666583334e+01 3698 3657 1.0666666666666666e+01 3698 115 -1.0416666666666666e-11 3698 441 -1.0416666666666666e-11 3698 442 -4.1666666666666665e-11 3699 3699 4.2666666666916662e+01 3699 2492 1.0666666666687499e+01 3699 2493 -5.3333333333229165e+00 3699 3702 -2.1333333333312499e+01 3699 3698 -1.0666666666666666e+01 3699 3020 -5.3333333333229165e+00 3699 441 6.2499999999999991e-11 3699 1524 -5.3333333333229165e+00 3699 442 1.0666666666687499e+01 3699 115 6.2499999999999991e-11 3699 818 -2.1333333333312499e+01 3699 816 1.0666666666666666e+01 3699 116 -5.3333333333229165e+00 3700 3700 4.2666666666916662e+01 3700 3003 6.2500000000000004e-11 3700 3001 1.0666666666687499e+01 3700 3022 6.2500000000000004e-11 3700 3020 -5.3333333333229165e+00 3700 3703 -2.1333333333312499e+01 3700 3698 -1.0666666666666666e+01 3700 3002 -5.3333333333229165e+00 3700 4183 -5.3333333333229165e+00 3700 4992 2.1333333333312499e+01 3700 5002 -1.0666666666666666e+01 3700 4067 -5.3333333333229165e+00 3700 442 1.0666666666687499e+01 3701 3701 4.2666666667333324e+01 3701 3003 -1.0416666666666666e-11 3701 2448 -1.0416666666666666e-11 3701 2452 6.2499999999999991e-11 3701 2451 -4.1666666666666665e-11 3701 2996 -1.0416666666666666e-11 3701 3002 6.2499999999999991e-11 3701 3658 1.0666666666583334e+01 3701 3022 -1.0416666666666666e-11 3701 3020 6.2499999999999991e-11 3701 3021 -4.1666666666666665e-11 3701 3703 1.0666666666583334e+01 3701 2485 -1.0416666666666666e-11 3701 2493 6.2499999999999991e-11 3701 2494 -4.1666666666666665e-11 3701 3702 1.0666666666583334e+01 3701 3704 -1.0666666666666666e+01 3701 2444 -1.0416666666666666e-11 3701 3101 -1.0666666666583334e+01 3701 3100 1.0666666666666666e+01 3701 4182 -4.1666666666666665e-11 3701 4768 -1.0666666666666666e+01 3701 4767 -1.0666666666666666e+01 3701 441 -1.0416666666666666e-11 3701 115 -1.0416666666666666e-11 3702 3702 6.4000000000416662e+01 3702 3021 -5.3333333333124999e+00 3702 3704 -2.1333333333312499e+01 3702 3701 1.0666666666583334e+01 3702 2494 -5.3333333333124999e+00 3702 2493 2.1333333333312499e+01 3702 2492 -5.3333333333124999e+00 3702 3699 -2.1333333333312499e+01 3702 3698 1.0666666666583334e+01 3702 3020 2.1333333333312499e+01 3702 115 -1.0666666666583334e+01 3702 441 -1.0666666666583334e+01 3702 442 -5.3333333333124999e+00 3703 3703 6.4000000000416662e+01 3703 3003 -1.0666666666583334e+01 3703 3002 2.1333333333312499e+01 3703 3701 1.0666666666583334e+01 3703 3022 -1.0666666666583334e+01 3703 3020 2.1333333333312499e+01 3703 3021 -5.3333333333124999e+00 3703 3700 -2.1333333333312499e+01 3703 3698 1.0666666666583334e+01 3703 3001 -5.3333333333124999e+00 3703 4182 -5.3333333333124999e+00 3703 4767 -2.1333333333312499e+01 3703 442 -5.3333333333124999e+00 3704 3704 4.2666666666916662e+01 3704 2487 -5.3333333333229165e+00 3704 2494 1.0666666666687499e+01 3704 3021 1.0666666666687499e+01 3704 3020 -5.3333333333229165e+00 3704 3702 -2.1333333333312499e+01 3704 3701 -1.0666666666666666e+01 3704 2493 -5.3333333333229165e+00 3704 115 6.2499999999999991e-11 3704 441 6.2499999999999991e-11 3704 4771 -2.1333333333312499e+01 3704 4760 -1.0666666666666666e+01 3704 4062 -5.3333333333229165e+00 3705 3705 5.3333333333749991e+01 3705 3023 5.3333333333229165e+00 3705 2350 5.3333333333437496e+00 3705 2349 -1.0666666666625000e+01 3705 2375 -6.2500000000000004e-11 3705 3050 1.0666666666666666e+01 3705 3706 -1.0666666666666666e+01 3705 4158 1.2069011089684726e-28 3705 4764 -3.2000000000020833e+01 3705 4760 2.1333333333291666e+01 3706 3706 4.2666666667083327e+01 3706 2375 1.0666666666666666e+01 3706 3707 -1.0666666666666666e+01 3706 3705 -1.0666666666666666e+01 3706 3023 1.0666666666666666e+01 3707 3707 5.3333333333749991e+01 3707 2888 5.3333333333437496e+00 3707 3023 5.3333333333229165e+00 3707 2375 -6.2499999999999991e-11 3707 3706 -1.0666666666666666e+01 3707 3470 1.0666666666666666e+01 3707 4350 -1.0666666666625000e+01 3707 4156 -4.6458872727282566e-28 3707 5044 -3.2000000000020833e+01 3707 4773 -2.1333333333291666e+01 3708 3708 2.1333333333541667e+01 3709 3709 2.1333333333541667e+01 hypre-2.33.0/src/test/TEST_ams/mfem.A.00003000066400000000000000000016211611477326011500176200ustar00rootroot000000000000003710 5080 3710 5080 3710 3710 3.2000000000249997e+01 3710 4829 5.3333333333124999e+00 3710 4400 -4.1666666666666665e-11 3710 4876 -5.3333333333124999e+00 3710 4401 1.0666666666687499e+01 3710 3715 -1.0666666666687499e+01 3710 4396 -4.1666666666666665e-11 3710 4397 1.0666666666687499e+01 3710 4394 -4.1666666666666665e-11 3710 4395 1.0666666666687499e+01 3711 3711 2.1333333333458331e+01 3712 3712 1.0666666666833333e+01 3713 3713 2.1333333333458331e+01 3714 3714 2.1350000000166663e+01 3715 3715 4.2679166666791666e+01 3715 4878 5.3322916666666664e+00 3715 4397 -5.3333333333229165e+00 3715 4877 -6.2500000000000003e-03 3715 4829 -2.1332291666656246e+01 3715 4828 5.3322916666666664e+00 3715 3717 -1.0668750000000001e+01 3715 4400 6.2499999999999991e-11 3715 4876 2.1332291666656250e+01 3715 4401 -5.3333333333229165e+00 3715 3710 -1.0666666666687499e+01 3716 3716 2.1350000000166663e+01 3717 3717 3.2024999999999999e+01 3717 4876 -5.3312499999999998e+00 3717 4877 4.1666666666666666e-03 3717 4829 5.3312499999999998e+00 3717 4828 -1.0668750000000001e+01 3717 3715 -1.0668750000000001e+01 3717 4923 -4.1666666666666666e-03 3717 4878 -1.0668750000000001e+01 3717 4921 -4.1666666666666666e-03 3717 4922 1.0668750000000001e+01 3718 3718 2.1345833333333331e+01 3719 3719 1.0683333333333334e+01 3720 3720 2.1345833333333331e+01 3721 3721 3.2000000000249997e+01 3721 4425 5.3333333333124999e+00 3721 4824 -5.3333333333124999e+00 3721 4404 -4.1666666666666665e-11 3721 3740 4.1666666666666665e-11 3721 4854 5.3333333333124999e+00 3721 4410 1.0666666666687499e+01 3721 3741 -1.0666666666687499e+01 3721 4416 -5.3333333333124999e+00 3721 4402 -4.1666666666666665e-11 3721 3737 4.1666666666666665e-11 3721 4815 5.3333333333124999e+00 3721 4408 1.0666666666687499e+01 3721 3738 -1.0666666666687499e+01 3721 4398 -4.1666666666666665e-11 3721 3723 4.1666666666666665e-11 3721 4415 -5.3333333333124999e+00 3721 4406 1.0666666666687499e+01 3721 3722 -1.0666666666687499e+01 3722 3722 4.2666666666916662e+01 3722 4422 5.3333333333229165e+00 3722 4408 -5.3333333333229165e+00 3722 4413 -6.2499999999999991e-11 3722 4416 2.1333333333312499e+01 3722 4809 -5.3333333333229165e+00 3722 3737 -1.0666666666666666e+01 3722 3736 -1.0666666666687499e+01 3722 4398 6.2500000000000004e-11 3722 4415 2.1333333333312499e+01 3722 4406 -5.3333333333229165e+00 3722 3723 -1.0666666666666666e+01 3722 3721 -1.0666666666687499e+01 3723 3723 4.2666666667333331e+01 3723 4482 -1.0416666666666666e-11 3723 4404 -1.0416666666666666e-11 3723 4424 -6.2499999999999991e-11 3723 4840 -1.0416666666666666e-11 3723 3739 4.1666666666666665e-11 3723 4425 1.0666666666583334e+01 3723 3741 -1.0666666666666666e+01 3723 4413 1.0416666666666666e-11 3723 4473 -1.0416666666666666e-11 3723 4422 -6.2499999999999991e-11 3723 4719 1.0416666666666666e-11 3723 3736 4.1666666666666665e-11 3723 4423 1.0666666666583334e+01 3723 3732 -1.0666666666666666e+01 3723 4420 -6.2499999999999991e-11 3723 4477 -1.0416666666666666e-11 3723 3727 4.1666666666666665e-11 3723 4421 1.0666666666583334e+01 3723 3728 -1.0666666666666666e+01 3723 4406 6.2499999999999991e-11 3723 4398 -1.0416666666666666e-11 3723 3721 4.1666666666666665e-11 3723 4415 -1.0666666666583334e+01 3723 3722 -1.0666666666666666e+01 3724 3724 3.2000000000249997e+01 3724 4510 -5.3333333333124999e+00 3724 3731 4.1666666666666665e-11 3724 4517 5.3333333333124999e+00 3724 4446 1.0666666666687499e+01 3724 4436 -4.1666666666666665e-11 3724 4458 -5.3333333333124999e+00 3724 3742 -1.0666666666687499e+01 3724 4452 -5.3333333333124999e+00 3724 4440 -4.1666666666666665e-11 3724 3740 4.1666666666666665e-11 3724 4511 -5.3333333333124999e+00 3724 4444 1.0666666666687499e+01 3724 3730 -1.0666666666687499e+01 3724 4434 -4.1666666666666665e-11 3724 3726 4.1666666666666665e-11 3724 4451 -5.3333333333124999e+00 3724 4442 1.0666666666687499e+01 3724 3725 -1.0666666666687499e+01 3725 3725 4.2666666666916662e+01 3725 4457 -5.3333333333229165e+00 3725 4444 -5.3333333333229165e+00 3725 4449 -6.2499999999999991e-11 3725 4452 2.1333333333312499e+01 3725 4844 -5.3333333333229165e+00 3725 3740 -1.0666666666666666e+01 3725 3739 -1.0666666666687499e+01 3725 4434 6.2499999999999991e-11 3725 4451 2.1333333333312499e+01 3725 4442 -5.3333333333229165e+00 3725 3726 -1.0666666666666666e+01 3725 3724 -1.0666666666687499e+01 3726 3726 4.2666666667333324e+01 3726 4893 -1.0416666666666666e-11 3726 4888 -1.0416666666666666e-11 3726 3743 4.1666666666666665e-11 3726 4458 -1.0666666666583334e+01 3726 3742 -1.0666666666666666e+01 3726 4475 -1.0416666666666666e-11 3726 3746 -1.0666666666666666e+01 3726 4477 -1.0416666666666666e-11 3726 3727 4.1666666666666665e-11 3726 4457 6.2499999999999991e-11 3726 4482 -1.0416666666666666e-11 3726 3739 4.1666666666666665e-11 3726 3728 -1.0666666666666666e+01 3726 4436 -1.0416666666666666e-11 3726 4449 1.0416666666666666e-11 3726 4442 6.2499999999999991e-11 3726 4434 -1.0416666666666666e-11 3726 3724 4.1666666666666665e-11 3726 4451 -1.0666666666583334e+01 3726 3725 -1.0666666666666666e+01 3726 2067 -6.2499999999999991e-11 3726 2066 1.0666666666583334e+01 3726 2065 -6.2499999999999991e-11 3726 2060 -1.0666666666583334e+01 3727 3727 3.2000000000249997e+01 3727 4475 -4.1666666666666665e-11 3727 3746 -1.0666666666687499e+01 3727 3726 4.1666666666666665e-11 3727 4477 -4.1666666666666665e-11 3727 3728 -1.0666666666687499e+01 3727 4730 5.3333333333124999e+00 3727 4423 5.3333333333124999e+00 3727 4473 -4.1666666666666665e-11 3727 3733 4.1666666666666665e-11 3727 4721 -5.3333333333124999e+00 3727 4479 1.0666666666687499e+01 3727 3732 -1.0666666666687499e+01 3727 3723 4.1666666666666665e-11 3727 4421 5.3333333333124999e+00 3727 4420 -1.0666666666687499e+01 3727 2066 5.3333333333124999e+00 3727 2060 -5.3333333333124999e+00 3727 2065 -1.0666666666687499e+01 3728 3728 4.2666666666916662e+01 3728 4477 6.2500000000000004e-11 3728 3727 -1.0666666666687499e+01 3728 4482 6.2499999999999991e-11 3728 4457 -5.3333333333229165e+00 3728 3726 -1.0666666666666666e+01 3728 3739 -1.0666666666687499e+01 3728 4424 5.3333333333229165e+00 3728 4421 -2.1333333333312499e+01 3728 4420 5.3333333333229165e+00 3728 3723 -1.0666666666666666e+01 3728 2065 5.3333333333229165e+00 3728 2060 2.1333333333312499e+01 3729 3729 3.2000000000249997e+01 3729 4521 5.3333333333124999e+00 3729 4500 -4.1666666666666665e-11 3729 4816 5.3333333333124999e+00 3729 3744 -1.0666666666687499e+01 3729 4824 -5.3333333333124999e+00 3729 3740 4.1666666666666665e-11 3729 4511 -5.3333333333124999e+00 3729 4505 1.0666666666687499e+01 3729 3737 4.1666666666666665e-11 3729 4492 -4.1666666666666665e-11 3729 4815 5.3333333333124999e+00 3729 3738 -1.0666666666687499e+01 3729 4504 1.0666666666687499e+01 3729 4494 -4.1666666666666665e-11 3729 3731 4.1666666666666665e-11 3729 4510 -5.3333333333124999e+00 3729 4502 1.0666666666687499e+01 3729 3730 -1.0666666666687499e+01 3730 3730 4.2666666666916662e+01 3730 4446 -5.3333333333229165e+00 3730 4505 -5.3333333333229165e+00 3730 4440 6.2500000000000004e-11 3730 4511 2.1333333333312499e+01 3730 4444 -5.3333333333229165e+00 3730 3740 -1.0666666666666666e+01 3730 3724 -1.0666666666687499e+01 3730 4494 6.2500000000000004e-11 3730 4510 2.1333333333312499e+01 3730 4502 -5.3333333333229165e+00 3730 3731 -1.0666666666666666e+01 3730 3729 -1.0666666666687499e+01 3731 3731 4.2666666667333331e+01 3731 4743 -1.0416666666666666e-11 3731 4500 -1.0416666666666666e-11 3731 4520 -6.2499999999999991e-11 3731 4738 -1.0416666666666666e-11 3731 3734 4.1666666666666665e-11 3731 4521 1.0666666666583334e+01 3731 3744 -1.0666666666666666e+01 3731 4750 1.0416666666666666e-11 3731 4519 1.0666666666583334e+01 3731 3735 -1.0666666666666666e+01 3731 4440 -1.0416666666666666e-11 3731 4518 -6.2499999999999991e-11 3731 4888 -1.0416666666666666e-11 3731 3743 4.1666666666666665e-11 3731 4446 6.2499999999999991e-11 3731 4436 -1.0416666666666666e-11 3731 3724 4.1666666666666665e-11 3731 4517 1.0666666666583334e+01 3731 3742 -1.0666666666666666e+01 3731 4502 6.2499999999999991e-11 3731 4494 -1.0416666666666666e-11 3731 3729 4.1666666666666665e-11 3731 4510 -1.0666666666583334e+01 3731 3730 -1.0666666666666666e+01 3732 3732 4.2666666666916662e+01 3732 4727 5.3333333333229165e+00 3732 4420 5.3333333333229165e+00 3732 4719 -6.2500000000000004e-11 3732 4423 -2.1333333333312499e+01 3732 4422 5.3333333333229165e+00 3732 3723 -1.0666666666666666e+01 3732 3736 -1.0666666666687499e+01 3732 4473 6.2500000000000004e-11 3732 4721 2.1333333333312499e+01 3732 4479 -5.3333333333229165e+00 3732 3733 -1.0666666666666666e+01 3732 3727 -1.0666666666687499e+01 3733 3733 4.2666666667333331e+01 3733 4750 1.0416666666666666e-11 3733 4475 -1.0416666666666666e-11 3733 4729 -6.2499999999999991e-11 3733 4893 -1.0416666666666666e-11 3733 3743 4.1666666666666665e-11 3733 4730 1.0666666666583334e+01 3733 3746 -1.0666666666666666e+01 3733 4719 1.0416666666666666e-11 3733 4740 -1.0416666666666666e-11 3733 4727 -6.2499999999999991e-11 3733 4805 -1.0416666666666666e-11 3733 3736 4.1666666666666665e-11 3733 4728 1.0666666666583334e+01 3733 3745 -1.0666666666666666e+01 3733 4725 -6.2499999999999991e-11 3733 4743 -1.0416666666666666e-11 3733 3734 4.1666666666666665e-11 3733 4726 1.0666666666583334e+01 3733 3735 -1.0666666666666666e+01 3733 4479 6.2499999999999991e-11 3733 4473 -1.0416666666666666e-11 3733 3727 4.1666666666666665e-11 3733 4721 -1.0666666666583334e+01 3733 3732 -1.0666666666666666e+01 3734 3734 3.2000000000249997e+01 3734 4519 5.3333333333124999e+00 3734 3731 4.1666666666666665e-11 3734 4521 5.3333333333124999e+00 3734 4520 -1.0666666666687499e+01 3734 4728 5.3333333333124999e+00 3734 4738 -4.1666666666666665e-11 3734 4816 5.3333333333124999e+00 3734 3744 -1.0666666666687499e+01 3734 4740 -4.1666666666666665e-11 3734 3737 4.1666666666666665e-11 3734 4817 5.3333333333124999e+00 3734 4746 1.0666666666687499e+01 3734 3745 -1.0666666666687499e+01 3734 4743 -4.1666666666666665e-11 3734 3733 4.1666666666666665e-11 3734 4726 5.3333333333124999e+00 3734 4725 -1.0666666666687499e+01 3734 3735 -1.0666666666687499e+01 3735 3735 4.2666666666916662e+01 3735 4729 5.3333333333229165e+00 3735 4520 5.3333333333229165e+00 3735 4750 -6.2500000000000004e-11 3735 4519 -2.1333333333312499e+01 3735 4518 5.3333333333229165e+00 3735 3731 -1.0666666666666666e+01 3735 3743 -1.0666666666687499e+01 3735 4743 6.2500000000000004e-11 3735 4726 -2.1333333333312499e+01 3735 4725 5.3333333333229165e+00 3735 3733 -1.0666666666666666e+01 3735 3734 -1.0666666666687499e+01 3736 3736 3.2000000000249997e+01 3736 4721 -5.3333333333124999e+00 3736 3733 4.1666666666666665e-11 3736 4728 5.3333333333124999e+00 3736 4727 -1.0666666666687499e+01 3736 4805 -4.1666666666666665e-11 3736 4817 5.3333333333124999e+00 3736 3745 -1.0666666666687499e+01 3736 4415 -5.3333333333124999e+00 3736 4719 4.1666666666666665e-11 3736 3723 4.1666666666666665e-11 3736 4423 5.3333333333124999e+00 3736 4422 -1.0666666666687499e+01 3736 3732 -1.0666666666687499e+01 3736 4413 4.1666666666666665e-11 3736 3737 4.1666666666666665e-11 3736 4416 -5.3333333333124999e+00 3736 4809 1.0666666666687499e+01 3736 3722 -1.0666666666687499e+01 3737 3737 4.2666666667333331e+01 3737 4738 -1.0416666666666666e-11 3737 4805 -1.0416666666666666e-11 3737 4746 6.2499999999999991e-11 3737 4740 -1.0416666666666666e-11 3737 3734 4.1666666666666665e-11 3737 4817 1.0666666666583334e+01 3737 3745 -1.0666666666666666e+01 3737 4500 -1.0416666666666666e-11 3737 4816 1.0666666666583334e+01 3737 3744 -1.0666666666666666e+01 3737 4398 -1.0416666666666666e-11 3737 4504 6.2499999999999991e-11 3737 4492 -1.0416666666666666e-11 3737 3729 4.1666666666666665e-11 3737 4408 6.2499999999999991e-11 3737 4402 -1.0416666666666666e-11 3737 3721 4.1666666666666665e-11 3737 4815 1.0666666666583334e+01 3737 3738 -1.0666666666666666e+01 3737 4809 6.2499999999999991e-11 3737 4413 1.0416666666666666e-11 3737 3736 4.1666666666666665e-11 3737 4416 -1.0666666666583334e+01 3737 3722 -1.0666666666666666e+01 3738 3738 4.2666666666916662e+01 3738 4410 -5.3333333333229165e+00 3738 4824 2.1333333333312499e+01 3738 4505 -5.3333333333229165e+00 3738 3740 -1.0666666666666666e+01 3738 4492 6.2499999999999991e-11 3738 4504 -5.3333333333229165e+00 3738 3729 -1.0666666666687499e+01 3738 4402 6.2499999999999991e-11 3738 4815 -2.1333333333312499e+01 3738 4408 -5.3333333333229165e+00 3738 3737 -1.0666666666666666e+01 3738 3721 -1.0666666666687499e+01 3739 3739 3.2000000000249997e+01 3739 4482 -4.1666666666666665e-11 3739 3726 4.1666666666666665e-11 3739 4457 1.0666666666687499e+01 3739 3728 -1.0666666666687499e+01 3739 4421 5.3333333333124999e+00 3739 3723 4.1666666666666665e-11 3739 4425 5.3333333333124999e+00 3739 4424 -1.0666666666687499e+01 3739 4840 -4.1666666666666665e-11 3739 4854 5.3333333333124999e+00 3739 3741 -1.0666666666687499e+01 3739 4451 -5.3333333333124999e+00 3739 4449 4.1666666666666665e-11 3739 3740 4.1666666666666665e-11 3739 4452 -5.3333333333124999e+00 3739 4844 1.0666666666687499e+01 3739 3725 -1.0666666666687499e+01 3739 2060 -5.3333333333124999e+00 3740 3740 4.2666666667333331e+01 3740 4402 -1.0416666666666666e-11 3740 4840 -1.0416666666666666e-11 3740 4410 6.2499999999999991e-11 3740 4404 -1.0416666666666666e-11 3740 3721 4.1666666666666665e-11 3740 4854 1.0666666666583334e+01 3740 3741 -1.0666666666666666e+01 3740 4492 -1.0416666666666666e-11 3740 4824 -1.0666666666583334e+01 3740 3738 -1.0666666666666666e+01 3740 4434 -1.0416666666666666e-11 3740 4505 6.2499999999999991e-11 3740 4494 -1.0416666666666666e-11 3740 3729 4.1666666666666665e-11 3740 4444 6.2499999999999991e-11 3740 4440 -1.0416666666666666e-11 3740 3724 4.1666666666666665e-11 3740 4511 -1.0666666666583334e+01 3740 3730 -1.0666666666666666e+01 3740 4844 6.2499999999999991e-11 3740 4449 1.0416666666666666e-11 3740 3739 4.1666666666666665e-11 3740 4452 -1.0666666666583334e+01 3740 3725 -1.0666666666666666e+01 3741 3741 4.2666666666916662e+01 3741 4406 -5.3333333333229165e+00 3741 4425 -2.1333333333312499e+01 3741 4424 5.3333333333229165e+00 3741 3723 -1.0666666666666666e+01 3741 4840 6.2500000000000004e-11 3741 4844 -5.3333333333229165e+00 3741 3739 -1.0666666666687499e+01 3741 4404 6.2500000000000004e-11 3741 4854 -2.1333333333312499e+01 3741 4410 -5.3333333333229165e+00 3741 3740 -1.0666666666666666e+01 3741 3721 -1.0666666666687499e+01 3742 3742 4.2666666666916662e+01 3742 4888 6.2499999999999991e-11 3742 4458 2.1333333333312499e+01 3742 3726 -1.0666666666666666e+01 3742 3743 -1.0666666666687499e+01 3742 4518 5.3333333333229165e+00 3742 4517 -2.1333333333312499e+01 3742 4446 -5.3333333333229165e+00 3742 3731 -1.0666666666666666e+01 3742 4436 6.2500000000000004e-11 3742 4442 -5.3333333333229165e+00 3742 3724 -1.0666666666687499e+01 3742 2067 5.3333333333229165e+00 3743 3743 3.2000000000249997e+01 3743 4893 -4.1666666666666665e-11 3743 3746 -1.0666666666687499e+01 3743 4888 -4.1666666666666665e-11 3743 3726 4.1666666666666665e-11 3743 4458 -5.3333333333124999e+00 3743 3742 -1.0666666666687499e+01 3743 4726 5.3333333333124999e+00 3743 3733 4.1666666666666665e-11 3743 4730 5.3333333333124999e+00 3743 4729 -1.0666666666687499e+01 3743 4750 4.1666666666666665e-11 3743 4519 5.3333333333124999e+00 3743 3735 -1.0666666666687499e+01 3743 3731 4.1666666666666665e-11 3743 4517 5.3333333333124999e+00 3743 4518 -1.0666666666687499e+01 3743 2066 5.3333333333124999e+00 3743 2067 -1.0666666666687499e+01 3744 3744 4.2666666666916662e+01 3744 4502 -5.3333333333229165e+00 3744 4521 -2.1333333333312499e+01 3744 4520 5.3333333333229165e+00 3744 3731 -1.0666666666666666e+01 3744 4738 6.2500000000000004e-11 3744 4746 -5.3333333333229165e+00 3744 3734 -1.0666666666687499e+01 3744 4500 6.2499999999999991e-11 3744 4816 -2.1333333333312499e+01 3744 4504 -5.3333333333229165e+00 3744 3737 -1.0666666666666666e+01 3744 3729 -1.0666666666687499e+01 3745 3745 4.2666666666916662e+01 3745 4725 5.3333333333229165e+00 3745 4728 -2.1333333333312499e+01 3745 4727 5.3333333333229165e+00 3745 3733 -1.0666666666666666e+01 3745 4805 6.2499999999999991e-11 3745 4809 -5.3333333333229165e+00 3745 3736 -1.0666666666687499e+01 3745 4740 6.2499999999999991e-11 3745 4817 -2.1333333333312499e+01 3745 4746 -5.3333333333229165e+00 3745 3737 -1.0666666666666666e+01 3745 3734 -1.0666666666687499e+01 3746 3746 4.2666666666916662e+01 3746 4893 6.2499999999999991e-11 3746 3743 -1.0666666666687499e+01 3746 4475 6.2499999999999991e-11 3746 3726 -1.0666666666666666e+01 3746 3727 -1.0666666666687499e+01 3746 4479 -5.3333333333229165e+00 3746 4730 -2.1333333333312499e+01 3746 4729 5.3333333333229165e+00 3746 3733 -1.0666666666666666e+01 3746 2067 5.3333333333229165e+00 3746 2066 -2.1333333333312499e+01 3746 2065 5.3333333333229165e+00 3747 3747 3.2000000000249997e+01 3747 4871 -5.3333333333124999e+00 3747 4404 -4.1666666666666665e-11 3747 4425 5.3333333333124999e+00 3747 3761 -1.0666666666687499e+01 3747 4405 1.0666666666687499e+01 3747 4394 -4.1666666666666665e-11 3747 3750 4.1666666666666665e-11 3747 4415 -5.3333333333124999e+00 3747 4406 1.0666666666687499e+01 3747 4398 -4.1666666666666665e-11 3747 4414 -5.3333333333124999e+00 3747 4407 1.0666666666687499e+01 3747 3748 -1.0666666666687499e+01 3748 3748 4.2666666666916662e+01 3748 4417 5.3333333333229165e+00 3748 4413 -6.2500000000000004e-11 3748 4422 5.3333333333229165e+00 3748 3756 -1.0666666666687499e+01 3748 4415 2.1333333333312499e+01 3748 3750 -1.0666666666666666e+01 3748 4406 -5.3333333333229165e+00 3748 4398 6.2499999999999991e-11 3748 4414 2.1333333333312499e+01 3748 4407 -5.3333333333229165e+00 3748 3747 -1.0666666666687499e+01 3749 3749 2.1333333333666662e+01 3750 3750 4.2666666667333331e+01 3750 4482 -1.0416666666666666e-11 3750 4404 -1.0416666666666666e-11 3750 4424 -6.2499999999999991e-11 3750 4840 -1.0416666666666666e-11 3750 3760 4.1666666666666665e-11 3750 4425 1.0666666666583334e+01 3750 3761 -1.0666666666666666e+01 3750 4413 1.0416666666666666e-11 3750 4473 -1.0416666666666666e-11 3750 4422 -6.2499999999999991e-11 3750 4719 1.0416666666666666e-11 3750 3756 4.1666666666666665e-11 3750 4423 1.0666666666583334e+01 3750 3757 -1.0666666666666666e+01 3750 4420 -6.2499999999999991e-11 3750 4477 -1.0416666666666666e-11 3750 3752 4.1666666666666665e-11 3750 4421 1.0666666666583334e+01 3750 3753 -1.0666666666666666e+01 3750 4406 6.2499999999999991e-11 3750 4398 -1.0416666666666666e-11 3750 3747 4.1666666666666665e-11 3750 4415 -1.0666666666583334e+01 3750 3748 -1.0666666666666666e+01 3751 3751 2.1333333333458331e+01 3752 3752 3.2000000000249997e+01 3752 4718 -5.3333333333124999e+00 3752 4473 -4.1666666666666665e-11 3752 4423 5.3333333333124999e+00 3752 3757 -1.0666666666687499e+01 3752 4474 1.0666666666687499e+01 3752 4469 -4.1666666666666665e-11 3752 3750 4.1666666666666665e-11 3752 4421 5.3333333333124999e+00 3752 4420 -1.0666666666687499e+01 3752 4477 -4.1666666666666665e-11 3752 4483 -5.3333333333124999e+00 3752 4478 1.0666666666687499e+01 3752 3753 -1.0666666666687499e+01 3753 3753 4.2666666666916662e+01 3753 4484 5.3333333333229165e+00 3753 4482 6.2500000000000004e-11 3753 4424 5.3333333333229165e+00 3753 3760 -1.0666666666687499e+01 3753 4421 -2.1333333333312499e+01 3753 3750 -1.0666666666666666e+01 3753 4420 5.3333333333229165e+00 3753 4477 6.2499999999999991e-11 3753 4483 2.1333333333312499e+01 3753 4478 -5.3333333333229165e+00 3753 3752 -1.0666666666687499e+01 3754 3754 2.1333333333666662e+01 3755 3755 2.1333333333458331e+01 3756 3756 3.2000000000249997e+01 3756 4414 -5.3333333333124999e+00 3756 4413 4.1666666666666665e-11 3756 4415 -5.3333333333124999e+00 3756 3748 -1.0666666666687499e+01 3756 4417 -1.0666666666687499e+01 3756 4803 -4.1666666666666665e-11 3756 3750 4.1666666666666665e-11 3756 4423 5.3333333333124999e+00 3756 4422 -1.0666666666687499e+01 3756 4719 4.1666666666666665e-11 3756 4718 -5.3333333333124999e+00 3756 4811 1.0666666666687499e+01 3756 3757 -1.0666666666687499e+01 3757 3757 4.2666666666916662e+01 3757 4474 -5.3333333333229165e+00 3757 4473 6.2500000000000004e-11 3757 4420 5.3333333333229165e+00 3757 3752 -1.0666666666687499e+01 3757 4423 -2.1333333333312499e+01 3757 3750 -1.0666666666666666e+01 3757 4422 5.3333333333229165e+00 3757 4719 -6.2500000000000004e-11 3757 4718 2.1333333333312499e+01 3757 4811 -5.3333333333229165e+00 3757 3756 -1.0666666666687499e+01 3758 3758 2.1333333333666662e+01 3759 3759 2.1333333333458331e+01 3760 3760 3.2000000000249997e+01 3760 4483 -5.3333333333124999e+00 3760 4482 -4.1666666666666665e-11 3760 4421 5.3333333333124999e+00 3760 3753 -1.0666666666687499e+01 3760 4484 -1.0666666666687499e+01 3760 4842 -4.1666666666666665e-11 3760 3750 4.1666666666666665e-11 3760 4425 5.3333333333124999e+00 3760 4424 -1.0666666666687499e+01 3760 4840 -4.1666666666666665e-11 3760 4871 -5.3333333333124999e+00 3760 4847 1.0666666666687499e+01 3760 3761 -1.0666666666687499e+01 3761 3761 4.2666666666916662e+01 3761 4405 -5.3333333333229165e+00 3761 4404 6.2500000000000004e-11 3761 4406 -5.3333333333229165e+00 3761 3747 -1.0666666666687499e+01 3761 4425 -2.1333333333312499e+01 3761 3750 -1.0666666666666666e+01 3761 4424 5.3333333333229165e+00 3761 4840 6.2500000000000004e-11 3761 4871 2.1333333333312499e+01 3761 4847 -5.3333333333229165e+00 3761 3760 -1.0666666666687499e+01 3762 3762 2.1333333333666662e+01 3763 3763 2.1333333333458331e+01 3764 3764 3.2000000000249997e+01 3764 4396 -4.1666666666666665e-11 3764 4395 1.0666666666687499e+01 3764 4394 -4.1666666666666665e-11 3764 4414 -5.3333333333124999e+00 3764 4407 1.0666666666687499e+01 3764 4398 -4.1666666666666665e-11 3764 4412 -5.3333333333124999e+00 3764 4399 1.0666666666687499e+01 3764 3765 -1.0666666666687499e+01 3765 3765 4.2666666666916662e+01 3765 4810 -5.3333333333229165e+00 3765 4407 -5.3333333333229165e+00 3765 4413 -6.2499999999999991e-11 3765 4414 2.1333333333312499e+01 3765 4417 5.3333333333229165e+00 3765 3767 -1.0666666666687499e+01 3765 4398 6.2500000000000004e-11 3765 4412 2.1333333333312499e+01 3765 4399 -5.3333333333229165e+00 3765 3764 -1.0666666666687499e+01 3766 3766 2.1333333333666662e+01 3767 3767 3.2000000000249997e+01 3767 4803 -4.1666666666666665e-11 3767 4802 1.0666666666687499e+01 3767 4801 -4.1666666666666665e-11 3767 4412 -5.3333333333124999e+00 3767 4810 1.0666666666687499e+01 3767 4413 4.1666666666666665e-11 3767 4414 -5.3333333333124999e+00 3767 4417 -1.0666666666687499e+01 3767 3765 -1.0666666666687499e+01 3768 3768 2.1333333333666662e+01 3769 3769 2.1333333333458331e+01 3770 3770 1.0666666666833333e+01 3771 3771 2.1333333333458331e+01 3772 3772 1.0666666666833333e+01 3773 3773 2.1333333333458331e+01 3774 3774 2.1333333333458331e+01 3775 3775 3.2000000000249997e+01 3775 4866 5.3333333333124999e+00 3775 4462 -5.3333333333124999e+00 3775 4464 5.3333333333124999e+00 3775 4438 -4.1666666666666665e-11 3775 3780 4.1666666666666665e-11 3775 4885 5.3333333333124999e+00 3775 4439 1.0666666666687499e+01 3775 3779 -1.0666666666687499e+01 3775 4432 -4.1666666666666665e-11 3775 4864 -5.3333333333124999e+00 3775 4433 1.0666666666687499e+01 3775 3778 -1.0666666666687499e+01 3775 4430 -4.1666666666666665e-11 3775 3777 4.1666666666666665e-11 3775 4459 -5.3333333333124999e+00 3775 4431 1.0666666666687499e+01 3775 3776 -1.0666666666687499e+01 3775 2409 4.1666666666666665e-11 3776 3776 6.4000000000499995e+01 3776 4462 3.2000000000000000e+01 3776 3780 -1.5999999999947917e+01 3776 3782 -5.3333333333437496e+00 3776 4460 1.0666666666791667e+01 3776 4468 1.0666666666625000e+01 3776 4439 -5.3333333333229165e+00 3776 4430 6.2500000000000004e-11 3776 4459 3.2000000000000000e+01 3776 4431 -5.3333333333229165e+00 3776 3777 -1.5999999999947917e+01 3776 3775 -1.0666666666687499e+01 3776 1811 -1.0666666666625000e+01 3776 1209 -5.3333333333437496e+00 3776 1785 -1.0666666666791667e+01 3776 1759 5.3333333333020834e+00 3776 1760 -2.1333333333312499e+01 3776 1757 5.3333333333020834e+00 3776 1206 -1.0666666666604167e+01 3777 3777 5.3350000000624988e+01 3777 4460 -5.3333333333020834e+00 3777 3782 2.0833333333333336e-11 3777 4468 -1.0666666666833333e+01 3777 5011 -5.3333333333020834e+00 3777 5004 -1.0416666666666666e-11 3777 4467 2.1333333333260416e+01 3777 3781 -1.5999999999947917e+01 3777 4432 -1.0416666666666666e-11 3777 4465 -6.2499999999999991e-11 3777 4466 1.0662499999958333e+01 3777 4463 -6.2500000000000003e-03 3777 4865 1.0416666666666667e-03 3777 4464 1.0662499999958333e+01 3777 3778 -1.0666666666666666e+01 3777 4431 6.2499999999999991e-11 3777 4430 -1.0416666666666666e-11 3777 3775 4.1666666666666665e-11 3777 4459 -2.1333333333260416e+01 3777 3776 -1.5999999999947917e+01 3777 3623 -1.0416666666666667e-03 3777 3661 -1.0416666666666666e-11 3777 290 4.1666666666666665e-11 3777 2412 -1.0666666666666666e+01 3777 2410 4.1666666666666666e-03 3778 3778 4.2679166666791666e+01 3778 4431 -5.3333333333229165e+00 3778 4865 -6.2500000000000003e-03 3778 4464 -2.1332291666656246e+01 3778 4463 5.3322916666666664e+00 3778 3777 -1.0666666666666666e+01 3778 4432 6.2499999999999991e-11 3778 4864 2.1332291666656250e+01 3778 4433 -5.3333333333229165e+00 3778 3775 -1.0666666666687499e+01 3778 3325 -5.3322916666666664e+00 3778 2410 -1.0668750000000001e+01 3778 2409 -1.0666666666666666e+01 3779 3779 4.2679166666791666e+01 3779 4886 -5.3322916666666664e+00 3779 4433 -5.3333333333229165e+00 3779 4889 -6.2500000000000003e-03 3779 4866 -2.1332291666656246e+01 3779 4438 6.2499999999999991e-11 3779 4885 -2.1332291666656250e+01 3779 4439 -5.3333333333229165e+00 3779 3780 -1.0666666666666666e+01 3779 3775 -1.0666666666687499e+01 3779 3326 -5.3322916666666664e+00 3779 2409 -1.0666666666666666e+01 3779 288 -1.0668750000000001e+01 3780 3780 5.8683333333895824e+01 3780 4886 6.2500000000000003e-03 3780 4462 -2.1333333333260416e+01 3780 3776 -1.5999999999947917e+01 3780 4889 1.0416666666666667e-03 3780 4430 -1.0416666666666666e-11 3780 4439 6.2499999999999991e-11 3780 4438 -1.0416666666666666e-11 3780 3775 4.1666666666666665e-11 3780 4885 1.0662499999958333e+01 3780 3779 -1.0666666666666666e+01 3780 709 5.3333333333124999e+00 3780 1011 -1.0416666666666667e-03 3780 288 4.1666666666666666e-03 3780 708 2.6624999999687500e+00 3780 289 -8.0000000000000000e+00 3780 707 2.1333333333343749e+01 3780 698 -5.3333333333124999e+00 3780 1819 -1.3333333333270833e+01 3780 286 -1.0666666666614583e+01 3780 1207 -1.3333333333281249e+01 3780 1804 -5.3333333333020834e+00 3780 1209 2.0833333333333339e-11 3780 1811 1.0666666666833333e+01 3780 1785 5.3333333333020834e+00 3781 3781 5.3333333333708325e+01 3781 5004 6.2499999999999991e-11 3781 3782 -5.3333333333437496e+00 3781 5011 1.0666666666791667e+01 3781 4468 1.0666666666625000e+01 3781 4467 -3.2000000000000000e+01 3781 3777 -1.5999999999947917e+01 3781 4465 5.3333333333229165e+00 3781 1787 2.1333333333312499e+01 3781 947 5.3333333333229165e+00 3781 1208 -1.0666666666666666e+01 3781 290 -1.0666666666687499e+01 3781 1764 -5.3333333333229165e+00 3781 1758 -1.0666666666625000e+01 3781 1757 5.3333333333020834e+00 3781 1206 -1.0666666666645833e+01 3782 3782 2.1333333333499997e+01 3782 3781 -5.3333333333437496e+00 3782 5011 5.3333333333437496e+00 3782 3776 -5.3333333333437496e+00 3782 4460 5.3333333333437496e+00 3782 4459 -5.3333333333229165e+00 3782 3777 2.0833333333333339e-11 3782 4467 5.3333333333229165e+00 3782 4468 -1.0666666666729165e+01 3782 1758 -5.3333333333229165e+00 3782 1757 2.0833333333333342e-11 3782 1760 -5.3333333333229165e+00 3782 1206 -1.0666666666729165e+01 3783 3783 4.2666666667104167e+01 3783 4456 2.0194839173657902e-27 3783 3790 6.2500000000000004e-11 3783 3785 -1.0666666666666666e+01 3783 4454 1.0666666666666666e+01 3783 3784 6.2500000000000004e-11 3783 4460 5.3333333333229165e+00 3783 4455 2.0194839173657902e-27 3783 2069 5.3333333332812494e+00 3783 1774 5.3333333333229165e+00 3783 1773 -1.4583333333333335e-10 3783 1236 -1.0666666666729165e+01 3783 2128 5.3333333332812494e+00 3783 1783 2.2470898404921788e-28 3783 1772 5.3333333333229165e+00 3783 1244 6.2499999999999991e-11 3783 1760 -5.3333333332812494e+00 3783 1757 1.0416666666666667e-10 3783 1770 1.5999999999989583e+01 3783 1765 -5.3333333333229165e+00 3783 1235 -1.0666666666666666e+01 3783 1229 -1.0666666666708332e+01 3784 3784 4.2666666667041660e+01 3784 4461 1.5999999999989583e+01 3784 3791 -1.0666666666666666e+01 3784 3783 6.2499999999999991e-11 3784 4460 -5.3333333333229165e+00 3784 4437 -5.3333333333229165e+00 3784 4430 6.2500000000000004e-11 3784 4443 -5.3333333333229165e+00 3784 3786 -1.0666666666687499e+01 3784 4454 -2.0194839173657902e-27 3784 4455 -1.5999999999989583e+01 3784 3785 -1.0666666666666666e+01 3784 1803 4.5860624244724788e-28 3784 1757 -5.3333333332812494e+00 3784 1760 1.4583333333333335e-10 3784 1230 6.2499999999999991e-11 3784 1785 5.3333333333229165e+00 3784 1759 -5.3333333332812494e+00 3784 1229 -1.0666666666729165e+01 3785 3785 4.2666666667208332e+01 3785 4456 -1.0666666666572915e+01 3785 3790 -1.0666666666666666e+01 3785 4454 -1.0666666666562499e+01 3785 3783 -1.0666666666666666e+01 3785 4449 1.0416666666666666e-11 3785 4453 -6.2499999999999991e-11 3785 4846 -1.0416666666666666e-11 3785 3789 4.1666666666666665e-11 3785 4430 -1.0416666666666666e-11 3785 4443 6.2499999999999991e-11 3785 4434 -1.0416666666666666e-11 3785 3786 4.1666666666666665e-11 3785 4450 -1.0666666666583334e+01 3785 3787 -1.0666666666666666e+01 3785 4460 -3.6295685768920020e-28 3785 4455 1.0666666666572915e+01 3785 3784 -1.0666666666666666e+01 3785 1774 -2.2851328271989659e-27 3786 3786 3.2000000000249997e+01 3786 4887 -5.3333333333124999e+00 3786 4436 -4.1666666666666665e-11 3786 4458 -5.3333333333124999e+00 3786 3792 -1.0666666666687499e+01 3786 3791 4.1666666666666665e-11 3786 4461 -5.3333333333124999e+00 3786 4437 1.0666666666687499e+01 3786 4430 -4.1666666666666665e-11 3786 4455 5.3333333333124999e+00 3786 3784 -1.0666666666687499e+01 3786 3788 4.1666666666666665e-11 3786 4451 -5.3333333333124999e+00 3786 4442 1.0666666666687499e+01 3786 4434 -4.1666666666666665e-11 3786 3785 4.1666666666666665e-11 3786 4450 -5.3333333333124999e+00 3786 4443 1.0666666666687499e+01 3786 3787 -1.0666666666687499e+01 3787 3787 4.2666666666916662e+01 3787 4453 5.3333333333229165e+00 3787 4449 -6.2499999999999991e-11 3787 4457 -5.3333333333229165e+00 3787 3789 -1.0666666666687499e+01 3787 4451 2.1333333333312499e+01 3787 3788 -1.0666666666666666e+01 3787 4442 -5.3333333333229165e+00 3787 4434 6.2499999999999991e-11 3787 4450 2.1333333333312499e+01 3787 4443 -5.3333333333229165e+00 3787 3785 -1.0666666666666666e+01 3787 3786 -1.0666666666687499e+01 3788 3788 4.2666666667333324e+01 3788 4893 -1.0416666666666666e-11 3788 4888 -1.0416666666666666e-11 3788 4458 -1.0666666666583334e+01 3788 3792 -1.0666666666666666e+01 3788 4475 -1.0416666666666666e-11 3788 4477 -1.0416666666666666e-11 3788 4457 6.2499999999999991e-11 3788 4482 -1.0416666666666666e-11 3788 3789 4.1666666666666665e-11 3788 4436 -1.0416666666666666e-11 3788 4449 1.0416666666666666e-11 3788 4442 6.2499999999999991e-11 3788 4434 -1.0416666666666666e-11 3788 3786 4.1666666666666665e-11 3788 4451 -1.0666666666583334e+01 3788 3787 -1.0666666666666666e+01 3788 2067 -6.2499999999999991e-11 3788 1243 4.1666666666666665e-11 3788 2066 1.0666666666583334e+01 3788 1242 -1.0666666666666666e+01 3788 2065 -6.2499999999999991e-11 3788 1241 4.1666666666666665e-11 3788 2060 -1.0666666666583334e+01 3788 1240 -1.0666666666666666e+01 3789 3789 3.2000000000249997e+01 3789 4846 -4.1666666666666665e-11 3789 3790 -1.0666666666687499e+01 3789 3788 4.1666666666666665e-11 3789 4457 1.0666666666687499e+01 3789 4482 -4.1666666666666665e-11 3789 4450 -5.3333333333124999e+00 3789 4449 4.1666666666666665e-11 3789 4451 -5.3333333333124999e+00 3789 3787 -1.0666666666687499e+01 3789 3785 4.1666666666666665e-11 3789 4456 -5.3333333333124999e+00 3789 4453 -1.0666666666687499e+01 3789 2063 5.3333333333124999e+00 3789 2060 -5.3333333333124999e+00 3789 1237 4.1666666666666665e-11 3789 2059 -5.3333333333124999e+00 3789 2058 1.0666666666687499e+01 3789 1240 -1.0666666666687499e+01 3790 3790 4.2666666666979161e+01 3790 4454 -2.2470898404921788e-28 3790 3783 6.2499999999999991e-11 3790 4456 1.5999999999989583e+01 3790 3785 -1.0666666666666666e+01 3790 4846 6.2500000000000004e-11 3790 3789 -1.0666666666687499e+01 3790 4453 5.3333333333229165e+00 3790 1773 5.3333333332812494e+00 3790 1774 -5.3333333333229165e+00 3790 2058 -5.3333333333229165e+00 3790 2069 -1.0416666666666667e-10 3790 2063 -2.1333333333312499e+01 3790 2062 5.3333333333229165e+00 3790 1237 -1.0666666666666666e+01 3790 1236 -1.0666666666708332e+01 3791 3791 4.2666666667208332e+01 3791 4461 -1.0666666666572915e+01 3791 3784 -1.0666666666666666e+01 3791 4888 -1.0416666666666666e-11 3791 4887 -1.0666666666583334e+01 3791 3792 -1.0666666666666666e+01 3791 4436 -1.0416666666666666e-11 3791 4437 6.2499999999999991e-11 3791 4430 -1.0416666666666666e-11 3791 3786 4.1666666666666665e-11 3791 1785 2.2851328271989659e-27 3791 2074 -1.0416666666666666e-11 3791 2075 6.2499999999999991e-11 3791 1243 4.1666666666666665e-11 3791 1802 -3.6295685768920020e-28 3791 2076 1.0666666666572915e+01 3791 1803 -1.0666666666562499e+01 3791 1238 -1.0666666666666666e+01 3791 1230 -1.0666666666666666e+01 3792 3792 4.2666666666916662e+01 3792 4458 2.1333333333312499e+01 3792 3788 -1.0666666666666666e+01 3792 4888 6.2500000000000004e-11 3792 4887 2.1333333333312499e+01 3792 3791 -1.0666666666666666e+01 3792 4437 -5.3333333333229165e+00 3792 4436 6.2499999999999991e-11 3792 4442 -5.3333333333229165e+00 3792 3786 -1.0666666666687499e+01 3792 2067 5.3333333333229165e+00 3792 2075 -5.3333333333229165e+00 3792 1243 -1.0666666666687499e+01 3793 3793 3.2000000000249997e+01 3793 4852 5.3333333333124999e+00 3793 4432 -4.1666666666666665e-11 3793 4464 5.3333333333124999e+00 3793 3810 -1.0666666666687499e+01 3793 3807 4.1666666666666665e-11 3793 4459 -5.3333333333124999e+00 3793 4431 1.0666666666687499e+01 3793 4430 -4.1666666666666665e-11 3793 4455 5.3333333333124999e+00 3793 3806 -1.0666666666687499e+01 3793 3797 4.1666666666666665e-11 3793 4450 -5.3333333333124999e+00 3793 4443 1.0666666666687499e+01 3793 4434 -4.1666666666666665e-11 3793 3795 4.1666666666666665e-11 3793 4448 -5.3333333333124999e+00 3793 4435 1.0666666666687499e+01 3793 3794 -1.0666666666687499e+01 3794 3794 4.2666666666916662e+01 3794 4845 -5.3333333333229165e+00 3794 4443 -5.3333333333229165e+00 3794 4449 -6.2499999999999991e-11 3794 4450 2.1333333333312499e+01 3794 4453 5.3333333333229165e+00 3794 3797 -1.0666666666666666e+01 3794 3796 -1.0666666666687499e+01 3794 4434 6.2499999999999991e-11 3794 4448 2.1333333333312499e+01 3794 4435 -5.3333333333229165e+00 3794 3795 -1.0666666666666666e+01 3794 3793 -1.0666666666687499e+01 3795 3795 4.2700000000333333e+01 3795 4856 1.0416666666666667e-03 3795 4865 1.0416666666666667e-03 3795 4853 -6.2500000000000003e-03 3795 4895 -1.0416666666666667e-03 3795 3800 4.1666666666666666e-03 3795 4432 -1.0416666666666666e-11 3795 4852 1.0662499999958333e+01 3795 3810 -1.0666666666666666e+01 3795 4838 -1.0416666666666666e-11 3795 4851 1.0662499999958333e+01 3795 3808 -1.0666666666666666e+01 3795 4845 6.2499999999999991e-11 3795 4449 1.0416666666666666e-11 3795 3796 4.1666666666666665e-11 3795 4849 -6.2500000000000003e-03 3795 4897 1.0416666666666667e-03 3795 3798 4.1666666666666666e-03 3795 4850 1.0658333333333333e+01 3795 3799 -1.0666666666666666e+01 3795 4435 6.2499999999999991e-11 3795 4434 -1.0416666666666666e-11 3795 3793 4.1666666666666665e-11 3795 4448 -1.0666666666583334e+01 3795 3794 -1.0666666666666666e+01 3796 3796 3.2000000000249997e+01 3796 4456 -5.3333333333124999e+00 3796 4846 -4.1666666666666665e-11 3796 4863 -5.3333333333124999e+00 3796 3811 -1.0666666666687499e+01 3796 3809 4.1666666666666665e-11 3796 4855 -5.3333333333124999e+00 3796 4839 1.0666666666687499e+01 3796 4838 -4.1666666666666665e-11 3796 4851 5.3333333333124999e+00 3796 3808 -1.0666666666687499e+01 3796 3795 4.1666666666666665e-11 3796 4448 -5.3333333333124999e+00 3796 4845 1.0666666666687499e+01 3796 4449 4.1666666666666665e-11 3796 3797 4.1666666666666665e-11 3796 4450 -5.3333333333124999e+00 3796 4453 -1.0666666666687499e+01 3796 3794 -1.0666666666687499e+01 3797 3797 4.2666666667208332e+01 3797 4454 -1.0666666666562499e+01 3797 3816 -1.0666666666666666e+01 3797 4456 -1.0666666666572915e+01 3797 3811 -1.0666666666666666e+01 3797 4460 -3.6295685768920020e-28 3797 4846 -1.0416666666666666e-11 3797 4430 -1.0416666666666666e-11 3797 4455 1.0666666666572917e+01 3797 3806 -1.0666666666666666e+01 3797 4443 6.2499999999999991e-11 3797 4434 -1.0416666666666666e-11 3797 3793 4.1666666666666665e-11 3797 4453 -6.2499999999999991e-11 3797 4449 1.0416666666666666e-11 3797 3796 4.1666666666666665e-11 3797 4450 -1.0666666666583334e+01 3797 3794 -1.0666666666666666e+01 3797 1774 1.8812360437258079e-27 3798 3798 3.2024999999999999e+01 3798 4860 5.3312499999999998e+00 3798 4904 -4.1666666666666666e-03 3798 4916 -5.3312499999999998e+00 3798 3812 -1.0668750000000001e+01 3798 3801 4.1666666666666657e-03 3798 4898 -5.3312499999999998e+00 3798 4906 1.0668750000000001e+01 3798 4851 5.3312499999999998e+00 3798 4856 4.1666666666666666e-03 3798 3809 4.1666666666666657e-03 3798 4855 -5.3312499999999998e+00 3798 4859 -1.0668750000000001e+01 3798 3808 -1.0668750000000001e+01 3798 4897 4.1666666666666666e-03 3798 3795 4.1666666666666657e-03 3798 4850 5.3312499999999998e+00 3798 4849 -1.0668750000000001e+01 3798 3799 -1.0668750000000001e+01 3799 3799 4.2691666666666663e+01 3799 4906 -5.3322916666666664e+00 3799 4853 5.3322916666666664e+00 3799 4895 6.2500000000000003e-03 3799 4898 2.1331249999999997e+01 3799 4896 -5.3322916666666664e+00 3799 3801 -1.0666666666666666e+01 3799 3800 -1.0668750000000001e+01 3799 4897 -6.2500000000000003e-03 3799 4850 -2.1331249999999997e+01 3799 4849 5.3322916666666664e+00 3799 3795 -1.0666666666666666e+01 3799 3798 -1.0668750000000001e+01 3800 3800 3.2024999999999999e+01 3800 4942 5.3312499999999998e+00 3800 4466 5.3312499999999998e+00 3800 3813 -1.0668750000000001e+01 3800 3807 4.1666666666666657e-03 3800 4464 5.3312499999999998e+00 3800 4463 -1.0668750000000001e+01 3800 4865 4.1666666666666666e-03 3800 4852 5.3312499999999998e+00 3800 3810 -1.0668750000000001e+01 3800 3795 4.1666666666666657e-03 3800 4850 5.3312499999999998e+00 3800 4853 -1.0668750000000001e+01 3800 4895 -4.1666666666666666e-03 3800 3801 4.1666666666666657e-03 3800 4898 -5.3312499999999998e+00 3800 4896 1.0668750000000001e+01 3800 3799 -1.0668750000000001e+01 3800 3623 -4.1666666666666666e-03 3801 3801 4.2700000000333333e+01 3801 4914 1.0416666666666666e-11 3801 4943 -6.2499999999999991e-11 3801 5002 -1.0416666666666666e-11 3801 3804 4.1666666666666665e-11 3801 4942 1.0662499999958333e+01 3801 3813 -1.0666666666666666e+01 3801 4904 -1.0416666666666667e-03 3801 4916 -1.0662499999958333e+01 3801 3812 -1.0666666666666666e+01 3801 4906 6.2500000000000003e-03 3801 4897 1.0416666666666667e-03 3801 3798 4.1666666666666666e-03 3801 4940 -6.2499999999999991e-11 3801 4981 -1.0416666666666666e-11 3801 3802 4.1666666666666665e-11 3801 4941 1.0666666666583334e+01 3801 3803 -1.0666666666666666e+01 3801 4896 6.2500000000000003e-03 3801 4895 -1.0416666666666667e-03 3801 3800 4.1666666666666666e-03 3801 4898 -1.0658333333333333e+01 3801 3799 -1.0666666666666666e+01 3801 3661 -1.0416666666666666e-11 3801 3623 -1.0416666666666667e-03 3802 3802 3.2000000000249997e+01 3802 4862 -5.3333333333124999e+00 3802 4982 -4.1666666666666665e-11 3802 5008 -5.3333333333124999e+00 3802 3814 -1.0666666666687499e+01 3802 3805 4.1666666666666665e-11 3802 5006 -5.3333333333124999e+00 3802 4988 1.0666666666687499e+01 3802 4916 -5.3333333333124999e+00 3802 4914 4.1666666666666665e-11 3802 3809 4.1666666666666665e-11 3802 4860 5.3333333333124999e+00 3802 4861 -1.0666666666687499e+01 3802 3812 -1.0666666666687499e+01 3802 4981 -4.1666666666666665e-11 3802 3801 4.1666666666666665e-11 3802 4941 5.3333333333124999e+00 3802 4940 -1.0666666666687499e+01 3802 3803 -1.0666666666687499e+01 3803 3803 4.2666666666916662e+01 3803 4988 -5.3333333333229165e+00 3803 4943 5.3333333333229165e+00 3803 5002 6.2499999999999991e-11 3803 5006 2.1333333333312499e+01 3803 5003 -5.3333333333229165e+00 3803 3805 -1.0666666666666666e+01 3803 3804 -1.0666666666687499e+01 3803 4981 6.2499999999999991e-11 3803 4941 -2.1333333333312499e+01 3803 4940 5.3333333333229165e+00 3803 3801 -1.0666666666666666e+01 3803 3802 -1.0666666666687499e+01 3804 3804 3.2000000000249997e+01 3804 5009 5.3333333333124999e+00 3804 5004 -4.1666666666666665e-11 3804 4467 5.3333333333124999e+00 3804 3815 -1.0666666666687499e+01 3804 3807 4.1666666666666665e-11 3804 4466 5.3333333333124999e+00 3804 4465 -1.0666666666687499e+01 3804 4942 5.3333333333124999e+00 3804 3813 -1.0666666666687499e+01 3804 3801 4.1666666666666665e-11 3804 4941 5.3333333333124999e+00 3804 4943 -1.0666666666687499e+01 3804 5002 -4.1666666666666665e-11 3804 3805 4.1666666666666665e-11 3804 5006 -5.3333333333124999e+00 3804 5003 1.0666666666687499e+01 3804 3803 -1.0666666666687499e+01 3804 3661 -4.1666666666666665e-11 3805 3805 4.2666666667208332e+01 3805 5010 -1.0666666666562499e+01 3805 5008 -1.0666666666572915e+01 3805 3816 -1.0666666666666666e+01 3805 3814 -1.0666666666666666e+01 3805 5011 1.8812360437258079e-27 3805 5004 -1.0416666666666666e-11 3805 5009 1.0666666666572917e+01 3805 3815 -1.0666666666666666e+01 3805 4982 -1.0416666666666666e-11 3805 4988 6.2499999999999991e-11 3805 4981 -1.0416666666666666e-11 3805 3802 4.1666666666666665e-11 3805 5003 6.2499999999999991e-11 3805 5002 -1.0416666666666666e-11 3805 3804 4.1666666666666665e-11 3805 5006 -1.0666666666583334e+01 3805 3803 -1.0666666666666666e+01 3805 1769 -3.6295685768920020e-28 3806 3806 4.2666666666895829e+01 3806 4454 -2.0194839173657902e-27 3806 4468 -2.4233807008389483e-27 3806 3816 -5.3333333333229165e+00 3806 4460 -5.3333333333229165e+00 3806 4459 2.1333333333333332e+01 3806 3807 -1.6000000000010417e+01 3806 4431 -5.3333333333229165e+00 3806 4430 6.2500000000000004e-11 3806 4455 -1.5999999999989583e+01 3806 4443 -5.3333333333229165e+00 3806 3797 -1.0666666666666666e+01 3806 3793 -1.0666666666687499e+01 3807 3807 5.3350000000624988e+01 3807 4460 5.3333333332812494e+00 3807 3816 1.4583333333333332e-10 3807 4468 1.0666666666625000e+01 3807 5011 5.3333333332812494e+00 3807 5004 -1.0416666666666666e-11 3807 4467 1.0666666666531249e+01 3807 3815 -1.6000000000010417e+01 3807 4465 -6.2499999999999991e-11 3807 3804 4.1666666666666665e-11 3807 4466 1.0662499999958333e+01 3807 3813 -1.0666666666666666e+01 3807 4463 -6.2500000000000003e-03 3807 4865 1.0416666666666667e-03 3807 3800 4.1666666666666666e-03 3807 4432 -1.0416666666666666e-11 3807 4464 1.0662499999958333e+01 3807 3810 -1.0666666666666666e+01 3807 4431 6.2499999999999991e-11 3807 4430 -1.0416666666666666e-11 3807 3793 4.1666666666666665e-11 3807 4459 -1.0666666666531249e+01 3807 3806 -1.6000000000010417e+01 3807 3661 -1.0416666666666666e-11 3807 3623 -1.0416666666666667e-03 3808 3808 4.2679166666791666e+01 3808 4849 5.3322916666666664e+00 3808 4856 -6.2500000000000003e-03 3808 4859 5.3322916666666664e+00 3808 3798 -1.0668750000000001e+01 3808 4855 2.1332291666656250e+01 3808 3809 -1.0666666666666666e+01 3808 4839 -5.3333333333229165e+00 3808 4838 6.2499999999999991e-11 3808 4851 -2.1332291666656250e+01 3808 4845 -5.3333333333229165e+00 3808 3795 -1.0666666666666666e+01 3808 3796 -1.0666666666687499e+01 3809 3809 5.3350000000624995e+01 3809 4862 -1.0666666666531249e+01 3809 3814 -1.6000000000010417e+01 3809 3816 1.4583333333333332e-10 3809 4863 -1.0666666666531249e+01 3809 3811 -1.6000000000010417e+01 3809 4982 -1.0416666666666666e-11 3809 4861 -6.2499999999999991e-11 3809 4914 1.0416666666666666e-11 3809 3802 4.1666666666666665e-11 3809 4904 -1.0416666666666667e-03 3809 4860 1.0662499999958333e+01 3809 3812 -1.0666666666666666e+01 3809 4859 -6.2500000000000003e-03 3809 4856 1.0416666666666667e-03 3809 3798 4.1666666666666666e-03 3809 4846 -1.0416666666666666e-11 3809 4839 6.2499999999999991e-11 3809 4838 -1.0416666666666666e-11 3809 3796 4.1666666666666665e-11 3809 4855 -1.0662499999958333e+01 3809 3808 -1.0666666666666666e+01 3809 1769 5.3333333332812494e+00 3809 1775 -1.0666666666625000e+01 3809 1774 5.3333333332812494e+00 3810 3810 4.2679166666791666e+01 3810 4463 5.3322916666666664e+00 3810 4865 -6.2500000000000003e-03 3810 4853 5.3322916666666664e+00 3810 3800 -1.0668750000000001e+01 3810 4852 -2.1332291666656250e+01 3810 3795 -1.0666666666666666e+01 3810 4435 -5.3333333333229165e+00 3810 4432 6.2500000000000004e-11 3810 4464 -2.1332291666656250e+01 3810 4431 -5.3333333333229165e+00 3810 3807 -1.0666666666666666e+01 3810 3793 -1.0666666666687499e+01 3811 3811 4.2666666666895829e+01 3811 4863 2.1333333333333332e+01 3811 3809 -1.6000000000010417e+01 3811 4454 2.0194839173657902e-27 3811 3816 -5.3333333333229165e+00 3811 3797 -1.0666666666666666e+01 3811 4456 1.5999999999989583e+01 3811 4453 5.3333333333229165e+00 3811 4846 6.2500000000000004e-11 3811 4839 -5.3333333333229165e+00 3811 3796 -1.0666666666687499e+01 3811 1775 -2.0194839173657902e-27 3811 1774 -5.3333333333229165e+00 3812 3812 4.2679166666791659e+01 3812 4940 5.3333333333229165e+00 3812 4914 -6.2500000000000004e-11 3812 4861 5.3333333333229165e+00 3812 3802 -1.0666666666687499e+01 3812 4860 -2.1332291666656246e+01 3812 3809 -1.0666666666666666e+01 3812 4859 5.3322916666666664e+00 3812 4904 6.2500000000000003e-03 3812 4916 2.1332291666656246e+01 3812 4906 -5.3322916666666664e+00 3812 3801 -1.0666666666666666e+01 3812 3798 -1.0668750000000001e+01 3813 3813 4.2679166666791659e+01 3813 4465 5.3333333333229165e+00 3813 4943 5.3333333333229165e+00 3813 3804 -1.0666666666687499e+01 3813 4942 -2.1332291666656246e+01 3813 3801 -1.0666666666666666e+01 3813 4896 -5.3322916666666664e+00 3813 4466 -2.1332291666656246e+01 3813 4463 5.3322916666666664e+00 3813 3807 -1.0666666666666666e+01 3813 3800 -1.0668750000000001e+01 3813 3661 6.2500000000000004e-11 3813 3623 6.2500000000000003e-03 3814 3814 4.2666666666895829e+01 3814 5010 -2.0194839173657902e-27 3814 5008 1.5999999999989583e+01 3814 3805 -1.0666666666666666e+01 3814 3809 -1.6000000000010417e+01 3814 3816 -5.3333333333229165e+00 3814 4862 2.1333333333333332e+01 3814 4861 5.3333333333229165e+00 3814 4982 6.2499999999999991e-11 3814 4988 -5.3333333333229165e+00 3814 3802 -1.0666666666687499e+01 3814 1775 2.4233807008389483e-27 3814 1769 -5.3333333333229165e+00 3815 3815 4.2666666666895829e+01 3815 4468 2.0194839173657902e-27 3815 5010 2.0194839173657902e-27 3815 3816 -5.3333333333229165e+00 3815 5011 -5.3333333333229165e+00 3815 5009 -1.5999999999989583e+01 3815 3805 -1.0666666666666666e+01 3815 5003 -5.3333333333229165e+00 3815 5004 6.2500000000000004e-11 3815 4467 -2.1333333333333332e+01 3815 4465 5.3333333333229165e+00 3815 3807 -1.6000000000010417e+01 3815 3804 -1.0666666666687499e+01 3816 3816 4.2666666667166659e+01 3816 5008 -2.0194839173657902e-27 3816 5010 1.0666666666666666e+01 3816 3805 -1.0666666666666666e+01 3816 4862 -5.3333333332812494e+00 3816 3814 -5.3333333333229165e+00 3816 3809 1.4583333333333335e-10 3816 4863 -5.3333333332812494e+00 3816 4456 4.5860624244724788e-28 3816 3811 -5.3333333333229165e+00 3816 4454 1.0666666666666666e+01 3816 3797 -1.0666666666666666e+01 3816 4455 2.0194839173657902e-27 3816 4460 -6.2499999999999991e-11 3816 4459 -5.3333333332812494e+00 3816 3806 -5.3333333333229165e+00 3816 3807 1.4583333333333335e-10 3816 4468 -1.0666666666729165e+01 3816 4467 5.3333333332812494e+00 3816 5009 2.2470898404921788e-28 3816 5011 -6.2500000000000004e-11 3816 3815 -5.3333333333229165e+00 3816 1769 -6.2499999999999991e-11 3816 1775 1.0666666666729165e+01 3816 1774 -6.2500000000000004e-11 3817 3817 3.2000000000249997e+01 3817 4470 1.0666666666687499e+01 3817 4481 1.0666666666687499e+01 3817 4471 -4.1666666666666665e-11 3817 4472 1.0666666666687499e+01 3817 4469 -4.1666666666666665e-11 3817 2038 -5.3333333333124999e+00 3817 2035 4.1666666666666665e-11 3817 2033 5.3333333333124999e+00 3817 1566 -1.0666666666687499e+01 3818 3818 2.1333333333458331e+01 3819 3819 3.2000000000458328e+01 3820 3820 2.1333333333458331e+01 3821 3821 1.0666666666833333e+01 3822 3822 3.2000000000458328e+01 3823 3823 3.2000000000249997e+01 3823 4848 1.0666666666687499e+01 3823 4846 -4.1666666666666665e-11 3823 4482 -4.1666666666666665e-11 3823 3824 -1.0666666666687499e+01 3823 4842 -4.1666666666666665e-11 3823 4483 -5.3333333333124999e+00 3823 4484 -1.0666666666687499e+01 3823 2068 -5.3333333333124999e+00 3823 2063 5.3333333333124999e+00 3823 1606 -1.0666666666687499e+01 3823 1602 4.1666666666666665e-11 3823 2059 -5.3333333333124999e+00 3823 2058 1.0666666666687499e+01 3824 3824 4.2666666666916662e+01 3824 4482 6.2499999999999991e-11 3824 3823 -1.0666666666687499e+01 3824 4477 6.2500000000000004e-11 3824 3826 -1.0666666666687499e+01 3824 4478 -5.3333333333229165e+00 3824 4483 2.1333333333312499e+01 3824 4484 5.3333333333229165e+00 3824 2058 -5.3333333333229165e+00 3824 2059 2.1333333333312499e+01 3824 2061 5.3333333333229165e+00 3824 1602 -1.0666666666666666e+01 3825 3825 2.1333333333666662e+01 3826 3826 3.2000000000249997e+01 3826 4470 1.0666666666687499e+01 3826 4477 -4.1666666666666665e-11 3826 3824 -1.0666666666687499e+01 3826 4469 -4.1666666666666665e-11 3826 4483 -5.3333333333124999e+00 3826 4478 1.0666666666687499e+01 3826 2039 -5.3333333333124999e+00 3826 2035 4.1666666666666665e-11 3826 2038 -5.3333333333124999e+00 3826 1607 -1.0666666666687499e+01 3826 1602 4.1666666666666665e-11 3826 2059 -5.3333333333124999e+00 3826 2061 -1.0666666666687499e+01 3827 3827 2.1333333333458331e+01 3828 3828 3.2000000000458328e+01 3829 3829 2.1333333333458331e+01 3830 3830 2.1333333333666666e+01 3831 3831 3.2000000000249997e+01 3831 4524 -5.3333333333124999e+00 3831 4526 5.3333333333124999e+00 3831 4498 -4.1666666666666665e-11 3831 4499 1.0666666666687499e+01 3831 4496 -4.1666666666666665e-11 3831 4545 -5.3333333333124999e+00 3831 4497 1.0666666666687499e+01 3831 3833 -1.0666666666687499e+01 3831 4490 -4.1666666666666665e-11 3831 4522 -5.3333333333124999e+00 3831 4491 1.0666666666687499e+01 3831 3832 -1.0666666666687499e+01 3831 2909 4.1666666666666665e-11 3832 3832 4.2679166666791666e+01 3832 4499 -5.3333333333229165e+00 3832 4523 -6.2500000000000003e-03 3832 4524 2.1332291666656246e+01 3832 4965 -5.3322916666666664e+00 3832 4490 6.2499999999999991e-11 3832 4522 2.1332291666656250e+01 3832 4491 -5.3333333333229165e+00 3832 3831 -1.0666666666687499e+01 3832 3603 -5.3322916666666664e+00 3832 2913 -1.0668750000000001e+01 3832 2909 -1.0666666666666666e+01 3833 3833 4.2679166666791659e+01 3833 4530 -5.3322916666666664e+00 3833 4491 -5.3333333333229165e+00 3833 4496 6.2500000000000004e-11 3833 4545 2.1332291666656250e+01 3833 4497 -5.3333333333229165e+00 3833 3831 -1.0666666666687499e+01 3833 4527 6.2500000000000003e-03 3833 4526 -2.1332291666656246e+01 3833 3605 -5.3322916666666664e+00 3833 2909 -1.0666666666666666e+01 3833 2912 -1.0668750000000001e+01 3834 3834 2.1350000000166663e+01 3835 3835 2.1350000000166663e+01 3836 3836 2.1333333333458331e+01 3837 3837 3.2000000000249997e+01 3837 4967 5.3333333333124999e+00 3837 4500 -4.1666666666666665e-11 3837 4521 5.3333333333124999e+00 3837 3862 -1.0666666666687499e+01 3837 3855 4.1666666666666665e-11 3837 4525 -5.3333333333124999e+00 3837 4501 1.0666666666687499e+01 3837 4490 -4.1666666666666665e-11 3837 4514 5.3333333333124999e+00 3837 3841 -1.0666666666687499e+01 3837 3840 4.1666666666666665e-11 3837 4510 -5.3333333333124999e+00 3837 4502 1.0666666666687499e+01 3837 4494 -4.1666666666666665e-11 3837 3839 4.1666666666666665e-11 3837 4509 -5.3333333333124999e+00 3837 4503 1.0666666666687499e+01 3837 3838 -1.0666666666687499e+01 3838 3838 4.2666666666916662e+01 3838 4441 -5.3333333333229165e+00 3838 4440 6.2500000000000004e-11 3838 4446 -5.3333333333229165e+00 3838 3847 -1.0666666666687499e+01 3838 4510 2.1333333333312499e+01 3838 3840 -1.0666666666666666e+01 3838 4502 -5.3333333333229165e+00 3838 4494 6.2500000000000004e-11 3838 4509 2.1333333333312499e+01 3838 4503 -5.3333333333229165e+00 3838 3839 -1.0666666666666666e+01 3838 3837 -1.0666666666687499e+01 3839 3839 4.2700000000333333e+01 3839 4512 -6.2500000000000003e-03 3839 4523 1.0416666666666667e-03 3839 3853 4.1666666666666666e-03 3839 4889 1.0416666666666667e-03 3839 4516 -6.2500000000000003e-03 3839 3851 4.1666666666666666e-03 3839 4513 1.0658333333333333e+01 3839 3852 -1.0666666666666666e+01 3839 4440 -1.0416666666666666e-11 3839 4441 6.2499999999999991e-11 3839 4438 -1.0416666666666666e-11 3839 3847 4.1666666666666665e-11 3839 4515 1.0662499999958333e+01 3839 3849 -1.0666666666666666e+01 3839 4490 -1.0416666666666666e-11 3839 4514 1.0662499999958333e+01 3839 3841 -1.0666666666666666e+01 3839 4503 6.2499999999999991e-11 3839 4494 -1.0416666666666666e-11 3839 3837 4.1666666666666665e-11 3839 4509 -1.0666666666583334e+01 3839 3838 -1.0666666666666666e+01 3839 3692 -1.0416666666666667e-03 3839 3662 -1.0416666666666667e-03 3840 3840 4.2666666667333331e+01 3840 4743 -1.0416666666666666e-11 3840 4500 -1.0416666666666666e-11 3840 4520 -6.2499999999999991e-11 3840 4738 -1.0416666666666666e-11 3840 3861 4.1666666666666665e-11 3840 4521 1.0666666666583334e+01 3840 3862 -1.0666666666666666e+01 3840 4750 1.0416666666666666e-11 3840 4519 1.0666666666583334e+01 3840 3860 -1.0666666666666666e+01 3840 4440 -1.0416666666666666e-11 3840 4518 -6.2499999999999991e-11 3840 4888 -1.0416666666666666e-11 3840 3850 4.1666666666666665e-11 3840 4446 6.2499999999999991e-11 3840 4436 -1.0416666666666666e-11 3840 3847 4.1666666666666665e-11 3840 4517 1.0666666666583334e+01 3840 3848 -1.0666666666666666e+01 3840 4502 6.2499999999999991e-11 3840 4494 -1.0416666666666666e-11 3840 3837 4.1666666666666665e-11 3840 4510 -1.0666666666583334e+01 3840 3838 -1.0666666666666666e+01 3841 3841 4.2679166666791666e+01 3841 4501 -5.3333333333229165e+00 3841 4525 2.1332291666656246e+01 3841 3855 -1.0666666666666666e+01 3841 4966 -5.3322916666666664e+00 3841 4523 -6.2500000000000003e-03 3841 4512 5.3322916666666664e+00 3841 3853 -1.0668750000000001e+01 3841 4490 6.2499999999999991e-11 3841 4514 -2.1332291666656250e+01 3841 3839 -1.0666666666666666e+01 3841 4503 -5.3333333333229165e+00 3841 3837 -1.0666666666687499e+01 3842 3842 3.2024999999999999e+01 3842 4648 -5.3312499999999998e+00 3842 4590 -4.1666666666666666e-03 3842 4610 5.3312499999999998e+00 3842 3857 -1.0668750000000001e+01 3842 3858 4.1666666666666657e-03 3842 4614 -5.3312499999999998e+00 3842 4591 1.0668750000000001e+01 3842 4586 -4.1666666666666666e-03 3842 4603 5.3312499999999998e+00 3842 3846 -1.0668750000000001e+01 3842 3845 4.1666666666666657e-03 3842 4599 -5.3312499999999998e+00 3842 4593 1.0668750000000001e+01 3842 4592 -4.1666666666666666e-03 3842 3844 4.1666666666666657e-03 3842 4598 -5.3312499999999998e+00 3842 4594 1.0668750000000001e+01 3842 3843 -1.0668750000000001e+01 3843 3843 4.2691666666666663e+01 3843 4602 5.3322916666666664e+00 3843 4597 6.2500000000000003e-03 3843 4605 5.3322916666666664e+00 3843 3851 -1.0668750000000001e+01 3843 4599 2.1331249999999997e+01 3843 3845 -1.0666666666666666e+01 3843 4593 -5.3322916666666664e+00 3843 4592 6.2500000000000003e-03 3843 4598 2.1331249999999997e+01 3843 4594 -5.3322916666666664e+00 3843 3844 -1.0666666666666666e+01 3843 3842 -1.0668750000000001e+01 3844 3844 4.2700000000333333e+01 3844 4597 -1.0416666666666667e-03 3844 4602 -6.2500000000000003e-03 3844 4889 1.0416666666666667e-03 3844 3851 4.1666666666666666e-03 3844 4888 -1.0416666666666666e-11 3844 4600 -6.2499999999999991e-11 3844 4612 1.0416666666666666e-11 3844 3850 4.1666666666666665e-11 3844 4438 -1.0416666666666666e-11 3844 4604 1.0662499999958333e+01 3844 3849 -1.0666666666666666e+01 3844 4447 6.2499999999999991e-11 3844 4436 -1.0416666666666666e-11 3844 3847 4.1666666666666665e-11 3844 4601 1.0666666666583334e+01 3844 3848 -1.0666666666666666e+01 3844 4586 -1.0416666666666667e-03 3844 4603 1.0662499999958333e+01 3844 3846 -1.0666666666666666e+01 3844 4594 6.2500000000000003e-03 3844 4592 -1.0416666666666667e-03 3844 3842 4.1666666666666666e-03 3844 4598 -1.0658333333333333e+01 3844 3843 -1.0666666666666666e+01 3845 3845 4.2733333333333334e+01 3845 4620 -1.0416666666666667e-03 3845 4590 -1.0416666666666667e-03 3845 4609 -6.2500000000000003e-03 3845 4626 -1.0416666666666667e-03 3845 3856 4.1666666666666666e-03 3845 4610 1.0658333333333333e+01 3845 3857 -1.0666666666666666e+01 3845 4634 1.0416666666666667e-03 3845 4608 1.0658333333333333e+01 3845 3854 -1.0666666666666666e+01 3845 4597 -1.0416666666666667e-03 3845 4607 -6.2500000000000003e-03 3845 3853 4.1666666666666666e-03 3845 4605 -6.2500000000000003e-03 3845 3851 4.1666666666666666e-03 3845 4606 1.0658333333333333e+01 3845 3852 -1.0666666666666666e+01 3845 4593 6.2500000000000003e-03 3845 4592 -1.0416666666666667e-03 3845 3842 4.1666666666666666e-03 3845 4599 -1.0658333333333333e+01 3845 3843 -1.0666666666666666e+01 3845 3692 -1.0416666666666667e-03 3845 3662 -1.0416666666666667e-03 3846 3846 4.2679166666791659e+01 3846 4892 -5.3333333333229165e+00 3846 4614 2.1332291666656246e+01 3846 4591 -5.3322916666666664e+00 3846 3858 -1.0666666666666666e+01 3846 4612 -6.2499999999999991e-11 3846 4600 5.3333333333229165e+00 3846 3850 -1.0666666666687499e+01 3846 4586 6.2500000000000003e-03 3846 4603 -2.1332291666656246e+01 3846 3844 -1.0666666666666666e+01 3846 4594 -5.3322916666666664e+00 3846 3842 -1.0668750000000001e+01 3847 3847 3.2000000000249997e+01 3847 4509 -5.3333333333124999e+00 3847 4440 -4.1666666666666665e-11 3847 4510 -5.3333333333124999e+00 3847 3838 -1.0666666666687499e+01 3847 3839 4.1666666666666665e-11 3847 4515 5.3333333333124999e+00 3847 4441 1.0666666666687499e+01 3847 4438 -4.1666666666666665e-11 3847 4604 5.3333333333124999e+00 3847 3849 -1.0666666666687499e+01 3847 3840 4.1666666666666665e-11 3847 4517 5.3333333333124999e+00 3847 4446 1.0666666666687499e+01 3847 4436 -4.1666666666666665e-11 3847 3844 4.1666666666666665e-11 3847 4601 5.3333333333124999e+00 3847 4447 1.0666666666687499e+01 3847 3848 -1.0666666666687499e+01 3848 3848 4.2666666666916662e+01 3848 4600 5.3333333333229165e+00 3848 4888 6.2500000000000004e-11 3848 4518 5.3333333333229165e+00 3848 3850 -1.0666666666687499e+01 3848 4517 -2.1333333333312499e+01 3848 3840 -1.0666666666666666e+01 3848 4446 -5.3333333333229165e+00 3848 4436 6.2499999999999991e-11 3848 4601 -2.1333333333312499e+01 3848 4447 -5.3333333333229165e+00 3848 3844 -1.0666666666666666e+01 3848 3847 -1.0666666666687499e+01 3849 3849 4.2679166666791666e+01 3849 4602 5.3322916666666664e+00 3849 4889 -6.2500000000000003e-03 3849 4516 5.3322916666666664e+00 3849 3851 -1.0668750000000001e+01 3849 4515 -2.1332291666656250e+01 3849 4441 -5.3333333333229165e+00 3849 3839 -1.0666666666666666e+01 3849 4438 6.2499999999999991e-11 3849 4604 -2.1332291666656250e+01 3849 3844 -1.0666666666666666e+01 3849 4447 -5.3333333333229165e+00 3849 3847 -1.0666666666687499e+01 3850 3850 3.2000000000249997e+01 3850 4614 -5.3333333333124999e+00 3850 4519 5.3333333333124999e+00 3850 4750 4.1666666666666665e-11 3850 3858 4.1666666666666665e-11 3850 4749 -5.3333333333124999e+00 3850 4892 1.0666666666687499e+01 3850 3860 -1.0666666666687499e+01 3850 4601 5.3333333333124999e+00 3850 4888 -4.1666666666666665e-11 3850 3840 4.1666666666666665e-11 3850 4517 5.3333333333124999e+00 3850 4518 -1.0666666666687499e+01 3850 3848 -1.0666666666687499e+01 3850 4612 4.1666666666666665e-11 3850 3844 4.1666666666666665e-11 3850 4603 5.3333333333124999e+00 3850 4600 -1.0666666666687499e+01 3850 3846 -1.0666666666687499e+01 3851 3851 3.2024999999999999e+01 3851 4598 -5.3312499999999998e+00 3851 4597 -4.1666666666666666e-03 3851 4599 -5.3312499999999998e+00 3851 3843 -1.0668750000000001e+01 3851 3844 4.1666666666666657e-03 3851 4604 5.3312499999999998e+00 3851 4602 -1.0668750000000001e+01 3851 4889 4.1666666666666666e-03 3851 4515 5.3312499999999998e+00 3851 3849 -1.0668750000000001e+01 3851 3845 4.1666666666666657e-03 3851 4606 5.3312499999999998e+00 3851 4605 -1.0668750000000001e+01 3851 3839 4.1666666666666657e-03 3851 4513 5.3312499999999998e+00 3851 4516 -1.0668750000000001e+01 3851 3852 -1.0668750000000001e+01 3851 3662 -4.1666666666666666e-03 3852 3852 4.2691666666666663e+01 3852 4512 5.3322916666666664e+00 3852 4607 5.3322916666666664e+00 3852 3853 -1.0668750000000001e+01 3852 4606 -2.1331249999999997e+01 3852 3845 -1.0666666666666666e+01 3852 4605 5.3322916666666664e+00 3852 4513 -2.1331249999999997e+01 3852 4516 5.3322916666666664e+00 3852 3839 -1.0666666666666666e+01 3852 3851 -1.0668750000000001e+01 3852 3692 6.2500000000000003e-03 3852 3662 6.2500000000000003e-03 3853 3853 3.2024999999999999e+01 3853 4525 -5.3312499999999998e+00 3853 4608 5.3312499999999998e+00 3853 4634 4.1666666666666666e-03 3853 3855 4.1666666666666657e-03 3853 4633 -5.3312499999999998e+00 3853 4966 1.0668750000000001e+01 3853 3854 -1.0668750000000001e+01 3853 4513 5.3312499999999998e+00 3853 3845 4.1666666666666657e-03 3853 4606 5.3312499999999998e+00 3853 4607 -1.0668750000000001e+01 3853 3852 -1.0668750000000001e+01 3853 4523 4.1666666666666666e-03 3853 3839 4.1666666666666657e-03 3853 4514 5.3312499999999998e+00 3853 4512 -1.0668750000000001e+01 3853 3841 -1.0668750000000001e+01 3853 3692 -4.1666666666666666e-03 3854 3854 4.2691666666666663e+01 3854 4621 -5.3322916666666664e+00 3854 4620 6.2500000000000003e-03 3854 4609 5.3322916666666664e+00 3854 3856 -1.0668750000000001e+01 3854 4608 -2.1331249999999997e+01 3854 3845 -1.0666666666666666e+01 3854 4607 5.3322916666666664e+00 3854 4634 -6.2500000000000003e-03 3854 4633 2.1331249999999997e+01 3854 4966 -5.3322916666666664e+00 3854 3855 -1.0666666666666666e+01 3854 3853 -1.0668750000000001e+01 3855 3855 4.2700000000333333e+01 3855 4500 -1.0416666666666666e-11 3855 4501 6.2499999999999991e-11 3855 4490 -1.0416666666666666e-11 3855 3837 4.1666666666666665e-11 3855 4742 -1.0416666666666666e-11 3855 4748 6.2499999999999991e-11 3855 4738 -1.0416666666666666e-11 3855 3861 4.1666666666666665e-11 3855 4967 1.0666666666583334e+01 3855 3862 -1.0666666666666666e+01 3855 4620 -1.0416666666666667e-03 3855 4621 6.2500000000000003e-03 3855 4618 -1.0416666666666667e-03 3855 3856 4.1666666666666666e-03 3855 4968 1.0662499999958333e+01 3855 3859 -1.0666666666666666e+01 3855 4523 1.0416666666666667e-03 3855 4525 -1.0662499999958333e+01 3855 3841 -1.0666666666666666e+01 3855 4966 6.2500000000000003e-03 3855 4634 1.0416666666666667e-03 3855 3853 4.1666666666666666e-03 3855 4633 -1.0658333333333333e+01 3855 3854 -1.0666666666666666e+01 3856 3856 3.2024999999999999e+01 3856 4633 -5.3312499999999998e+00 3856 4620 -4.1666666666666666e-03 3856 4608 5.3312499999999998e+00 3856 3854 -1.0668750000000001e+01 3856 3855 4.1666666666666657e-03 3856 4968 5.3312499999999998e+00 3856 4621 1.0668750000000001e+01 3856 4618 -4.1666666666666666e-03 3856 4970 5.3312499999999998e+00 3856 3859 -1.0668750000000001e+01 3856 3845 4.1666666666666657e-03 3856 4610 5.3312499999999998e+00 3856 4609 -1.0668750000000001e+01 3856 4626 -4.1666666666666666e-03 3856 3858 4.1666666666666657e-03 3856 4648 -5.3312499999999998e+00 3856 4630 1.0668750000000001e+01 3856 3857 -1.0668750000000001e+01 3857 3857 4.2691666666666663e+01 3857 4591 -5.3322916666666664e+00 3857 4590 6.2500000000000003e-03 3857 4593 -5.3322916666666664e+00 3857 3842 -1.0668750000000001e+01 3857 4610 -2.1331249999999997e+01 3857 3845 -1.0666666666666666e+01 3857 4609 5.3322916666666664e+00 3857 4626 6.2500000000000003e-03 3857 4648 2.1331249999999997e+01 3857 4630 -5.3322916666666664e+00 3857 3858 -1.0666666666666666e+01 3857 3856 -1.0668750000000001e+01 3858 3858 4.2700000000333333e+01 3858 4743 -1.0416666666666666e-11 3858 4744 6.2499999999999991e-11 3858 4742 -1.0416666666666666e-11 3858 3861 4.1666666666666665e-11 3858 4612 1.0416666666666666e-11 3858 4892 6.2499999999999991e-11 3858 4750 1.0416666666666666e-11 3858 3850 4.1666666666666665e-11 3858 4749 -1.0666666666583334e+01 3858 3860 -1.0666666666666666e+01 3858 4590 -1.0416666666666667e-03 3858 4591 6.2500000000000003e-03 3858 4586 -1.0416666666666667e-03 3858 3842 4.1666666666666666e-03 3858 4614 -1.0662499999958333e+01 3858 3846 -1.0666666666666666e+01 3858 4618 -1.0416666666666667e-03 3858 4970 1.0662499999958333e+01 3858 3859 -1.0666666666666666e+01 3858 4630 6.2500000000000003e-03 3858 4626 -1.0416666666666667e-03 3858 3856 4.1666666666666666e-03 3858 4648 -1.0658333333333333e+01 3858 3857 -1.0666666666666666e+01 3859 3859 4.2679166666791659e+01 3859 4744 -5.3333333333229165e+00 3859 4742 6.2499999999999991e-11 3859 4748 -5.3333333333229165e+00 3859 3861 -1.0666666666687499e+01 3859 4968 -2.1332291666656246e+01 3859 4621 -5.3322916666666664e+00 3859 3855 -1.0666666666666666e+01 3859 4618 6.2500000000000003e-03 3859 4970 -2.1332291666656246e+01 3859 3858 -1.0666666666666666e+01 3859 4630 -5.3322916666666664e+00 3859 3856 -1.0668750000000001e+01 3860 3860 4.2666666666916662e+01 3860 4744 -5.3333333333229165e+00 3860 4743 6.2500000000000004e-11 3860 4520 5.3333333333229165e+00 3860 3861 -1.0666666666687499e+01 3860 4519 -2.1333333333312499e+01 3860 3840 -1.0666666666666666e+01 3860 4518 5.3333333333229165e+00 3860 4750 -6.2500000000000004e-11 3860 4749 2.1333333333312499e+01 3860 4892 -5.3333333333229165e+00 3860 3858 -1.0666666666666666e+01 3860 3850 -1.0666666666687499e+01 3861 3861 3.2000000000249997e+01 3861 4749 -5.3333333333124999e+00 3861 4743 -4.1666666666666665e-11 3861 4519 5.3333333333124999e+00 3861 3860 -1.0666666666687499e+01 3861 3858 4.1666666666666665e-11 3861 4970 5.3333333333124999e+00 3861 4744 1.0666666666687499e+01 3861 4742 -4.1666666666666665e-11 3861 4968 5.3333333333124999e+00 3861 3859 -1.0666666666687499e+01 3861 3840 4.1666666666666665e-11 3861 4521 5.3333333333124999e+00 3861 4520 -1.0666666666687499e+01 3861 4738 -4.1666666666666665e-11 3861 3855 4.1666666666666665e-11 3861 4967 5.3333333333124999e+00 3861 4748 1.0666666666687499e+01 3861 3862 -1.0666666666687499e+01 3862 3862 4.2666666666916662e+01 3862 4501 -5.3333333333229165e+00 3862 4500 6.2500000000000004e-11 3862 4502 -5.3333333333229165e+00 3862 3837 -1.0666666666687499e+01 3862 4521 -2.1333333333312499e+01 3862 3840 -1.0666666666666666e+01 3862 4520 5.3333333333229165e+00 3862 4738 6.2499999999999991e-11 3862 4967 -2.1333333333312499e+01 3862 4748 -5.3333333333229165e+00 3862 3855 -1.0666666666666666e+01 3862 3861 -1.0666666666687499e+01 3863 3863 3.2000000000249997e+01 3863 4537 5.3333333333124999e+00 3863 4496 -4.1666666666666665e-11 3863 4526 5.3333333333124999e+00 3863 3869 -1.0666666666687499e+01 3863 4522 -5.3333333333124999e+00 3863 4491 1.0666666666687499e+01 3863 4490 -4.1666666666666665e-11 3863 4514 5.3333333333124999e+00 3863 3868 -1.0666666666687499e+01 3863 3867 4.1666666666666665e-11 3863 4509 -5.3333333333124999e+00 3863 4503 1.0666666666687499e+01 3863 4494 -4.1666666666666665e-11 3863 3865 4.1666666666666665e-11 3863 4508 -5.3333333333124999e+00 3863 4495 1.0666666666687499e+01 3863 3864 -1.0666666666687499e+01 3863 2762 4.1666666666666665e-11 3864 3864 4.2666666666916662e+01 3864 4445 -5.3333333333229165e+00 3864 4503 -5.3333333333229165e+00 3864 4440 6.2500000000000004e-11 3864 4509 2.1333333333312499e+01 3864 4441 -5.3333333333229165e+00 3864 3867 -1.0666666666666666e+01 3864 3866 -1.0666666666687499e+01 3864 4494 6.2500000000000004e-11 3864 4508 2.1333333333312499e+01 3864 4495 -5.3333333333229165e+00 3864 3865 -1.0666666666666666e+01 3864 3863 -1.0666666666687499e+01 3865 3865 4.2700000000333333e+01 3865 4865 1.0416666666666667e-03 3865 4496 -1.0416666666666666e-11 3865 4432 -1.0416666666666666e-11 3865 4538 1.0662499999958333e+01 3865 3870 -1.0666666666666666e+01 3865 4445 6.2499999999999991e-11 3865 4440 -1.0416666666666666e-11 3865 3866 4.1666666666666665e-11 3865 4527 -1.0416666666666667e-03 3865 4537 1.0662499999958333e+01 3865 3869 -1.0666666666666666e+01 3865 4532 6.2500000000000003e-03 3865 4536 -6.2500000000000003e-03 3865 4534 -1.0658333333333333e+01 3865 4495 6.2499999999999991e-11 3865 4494 -1.0416666666666666e-11 3865 3863 4.1666666666666665e-11 3865 4508 -1.0666666666583334e+01 3865 3864 -1.0666666666666666e+01 3865 3628 -1.0416666666666667e-03 3865 2755 4.1666666666666666e-03 3865 3625 -1.0416666666666667e-03 3865 2765 4.1666666666666666e-03 3865 2756 -1.0666666666666666e+01 3866 3866 3.2000000000249997e+01 3866 4515 5.3333333333124999e+00 3866 4438 -4.1666666666666665e-11 3866 4866 5.3333333333124999e+00 3866 3871 -1.0666666666687499e+01 3866 4864 -5.3333333333124999e+00 3866 4433 1.0666666666687499e+01 3866 4432 -4.1666666666666665e-11 3866 4538 5.3333333333124999e+00 3866 3870 -1.0666666666687499e+01 3866 3865 4.1666666666666665e-11 3866 4508 -5.3333333333124999e+00 3866 4445 1.0666666666687499e+01 3866 4440 -4.1666666666666665e-11 3866 3867 4.1666666666666665e-11 3866 4509 -5.3333333333124999e+00 3866 4441 1.0666666666687499e+01 3866 3864 -1.0666666666687499e+01 3866 2760 4.1666666666666665e-11 3867 3867 4.2700000000333333e+01 3867 4523 1.0416666666666667e-03 3867 4889 1.0416666666666667e-03 3867 4516 -6.2500000000000003e-03 3867 4438 -1.0416666666666666e-11 3867 4515 1.0662499999958333e+01 3867 3871 -1.0666666666666666e+01 3867 4490 -1.0416666666666666e-11 3867 4514 1.0662499999958333e+01 3867 3868 -1.0666666666666666e+01 3867 4503 6.2499999999999991e-11 3867 4494 -1.0416666666666666e-11 3867 3863 4.1666666666666665e-11 3867 4512 -6.2500000000000003e-03 3867 4513 1.0658333333333333e+01 3867 4441 6.2499999999999991e-11 3867 4440 -1.0416666666666666e-11 3867 3866 4.1666666666666665e-11 3867 4509 -1.0666666666583334e+01 3867 3864 -1.0666666666666666e+01 3867 3662 -1.0416666666666667e-03 3867 2757 4.1666666666666666e-03 3867 3692 -1.0416666666666667e-03 3867 2766 4.1666666666666666e-03 3867 2758 -1.0666666666666666e+01 3868 3868 4.2679166666791666e+01 3868 4512 5.3322916666666664e+00 3868 4523 -6.2500000000000003e-03 3868 4522 2.1332291666656250e+01 3868 4491 -5.3333333333229165e+00 3868 4490 6.2499999999999991e-11 3868 4514 -2.1332291666656250e+01 3868 4503 -5.3333333333229165e+00 3868 3867 -1.0666666666666666e+01 3868 3863 -1.0666666666687499e+01 3868 3603 -5.3322916666666664e+00 3868 2766 -1.0668750000000001e+01 3868 2762 -1.0666666666666666e+01 3869 3869 4.2679166666791659e+01 3869 4495 -5.3333333333229165e+00 3869 4496 6.2499999999999991e-11 3869 4491 -5.3333333333229165e+00 3869 3863 -1.0666666666687499e+01 3869 4526 -2.1332291666656246e+01 3869 4527 6.2500000000000003e-03 3869 4537 -2.1332291666656246e+01 3869 4532 -5.3322916666666664e+00 3869 3865 -1.0666666666666666e+01 3869 2762 -1.0666666666666666e+01 3869 3605 -5.3322916666666664e+00 3869 2755 -1.0668750000000001e+01 3870 3870 4.2679166666791666e+01 3870 4536 5.3322916666666664e+00 3870 4865 -6.2500000000000003e-03 3870 4864 2.1332291666656250e+01 3870 4433 -5.3333333333229165e+00 3870 4432 6.2500000000000004e-11 3870 4538 -2.1332291666656250e+01 3870 4445 -5.3333333333229165e+00 3870 3865 -1.0666666666666666e+01 3870 3866 -1.0666666666687499e+01 3870 3325 -5.3322916666666664e+00 3870 2765 -1.0668750000000001e+01 3870 2760 -1.0666666666666666e+01 3871 3871 4.2679166666791666e+01 3871 4889 -6.2500000000000003e-03 3871 4516 5.3322916666666664e+00 3871 4515 -2.1332291666656250e+01 3871 3867 -1.0666666666666666e+01 3871 4441 -5.3333333333229165e+00 3871 4438 6.2499999999999991e-11 3871 4866 -2.1332291666656250e+01 3871 4433 -5.3333333333229165e+00 3871 3866 -1.0666666666687499e+01 3871 3326 -5.3322916666666664e+00 3871 2757 -1.0668750000000001e+01 3871 2760 -1.0666666666666666e+01 3872 3872 4.2733333333333334e+01 3872 4924 -1.0416666666666667e-03 3872 4528 -1.0416666666666667e-03 3872 4543 -6.2500000000000003e-03 3872 4925 -1.0416666666666667e-03 3872 3880 4.1666666666666666e-03 3872 4544 1.0658333333333333e+01 3872 3882 -1.0666666666666666e+01 3872 4902 -1.0416666666666667e-03 3872 4542 1.0658333333333333e+01 3872 3881 -1.0666666666666666e+01 3872 4541 -6.2500000000000003e-03 3872 4897 1.0416666666666667e-03 3872 3877 4.1666666666666666e-03 3872 4539 -6.2500000000000003e-03 3872 4895 -1.0416666666666667e-03 3872 4540 1.0658333333333333e+01 3872 3876 -1.0666666666666666e+01 3872 4531 6.2500000000000003e-03 3872 4535 -1.0658333333333333e+01 3872 3625 -1.0416666666666667e-03 3872 2772 4.1666666666666666e-03 3872 3628 -1.0416666666666667e-03 3872 2774 4.1666666666666666e-03 3872 2773 -1.0666666666666666e+01 3873 3873 4.2689583333333331e+01 3873 4567 1.3773108652749614e-20 3873 4569 2.1684043449710089e-19 3873 4561 5.3322916666666664e+00 3873 3878 -5.3322916666666664e+00 3873 4559 1.5998958333333331e+01 3873 3874 -1.0666666666666666e+01 3873 4552 -5.3322916666666664e+00 3873 4547 6.2500000000000003e-03 3873 4560 2.1333333333333329e+01 3873 3640 -5.3322916666666664e+00 3873 2776 -1.6001041666666666e+01 3873 2778 -1.0668750000000001e+01 3874 3874 4.2727083333333340e+01 3874 4580 1.0416666666666667e-03 3874 4902 -1.0416666666666667e-03 3874 4571 -6.2500000000000003e-03 3874 4924 -1.0416666666666667e-03 3874 3880 4.1666666666666666e-03 3874 4572 1.0658333333333333e+01 3874 3881 -1.0666666666666666e+01 3874 4570 -6.2499999999999995e-03 3874 3877 4.1666666666666657e-03 3874 4900 -1.0416666666666664e-03 3874 4561 5.0116116045879435e-20 3874 4569 1.0657291666666666e+01 3874 3878 -1.0666666666666666e+01 3874 4550 -1.0416666666666667e-03 3874 4568 1.0658333333333333e+01 3874 3875 -1.0666666666666666e+01 3874 4552 6.2500000000000003e-03 3874 4547 -1.0416666666666667e-03 3874 4559 -1.0657291666666666e+01 3874 3873 -1.0666666666666666e+01 3874 2778 4.1666666666666666e-03 3875 3875 4.2691666666666663e+01 3875 4571 5.3322916666666664e+00 3875 4580 -6.2500000000000003e-03 3875 4582 2.1331249999999997e+01 3875 4927 -5.3322916666666664e+00 3875 3880 -1.0668750000000001e+01 3875 4550 6.2500000000000003e-03 3875 4568 -2.1331249999999997e+01 3875 4552 -5.3322916666666664e+00 3875 3874 -1.0666666666666666e+01 3875 3350 -5.3322916666666664e+00 3875 2769 -1.0666666666666666e+01 3875 2778 -1.0668750000000001e+01 3876 3876 4.2691666666666663e+01 3876 4899 2.1331249999999997e+01 3876 4905 -5.3322916666666664e+00 3876 4897 -6.2500000000000003e-03 3876 4541 5.3322916666666664e+00 3876 3877 -1.0668750000000001e+01 3876 4895 6.2500000000000003e-03 3876 4540 -2.1331249999999997e+01 3876 4539 5.3322916666666664e+00 3876 3872 -1.0666666666666666e+01 3876 3626 -5.3322916666666664e+00 3876 2780 -1.0666666666666666e+01 3876 2772 -1.0668750000000001e+01 3877 3877 3.2024999999999999e+01 3877 4899 -5.3312499999999998e+00 3877 4542 5.3312499999999998e+00 3877 4902 -4.1666666666666666e-03 3877 4572 5.3312499999999998e+00 3877 3881 -1.0668750000000001e+01 3877 3874 4.1666666666666657e-03 3877 4570 -1.0668750000000001e+01 3877 4569 5.3312499999999998e+00 3877 4900 -4.1666666666666675e-03 3877 4905 1.0668750000000001e+01 3877 4907 -5.3312499999999998e+00 3877 3878 -1.0668750000000001e+01 3877 3872 4.1666666666666657e-03 3877 4897 4.1666666666666666e-03 3877 4540 5.3312499999999998e+00 3877 3876 -1.0668750000000001e+01 3877 4541 -1.0668750000000001e+01 3877 2780 4.1666666666666657e-03 3878 3878 4.2704166666666659e+01 3878 4570 5.3322916666666664e+00 3878 4560 -5.3281250000000000e+00 3878 4559 -2.1684043449710089e-19 3878 4561 6.2500000000000003e-03 3878 3873 -5.3322916666666664e+00 3878 4569 -1.5998958333333333e+01 3878 3874 -1.0666666666666666e+01 3878 4785 2.1684043449710089e-19 3878 4784 6.2499999999999986e-03 3878 4566 5.3281250000000000e+00 3878 4567 -1.0672916666666666e+01 3878 3879 -5.3322916666666664e+00 3878 4900 6.2499999999999995e-03 3878 4905 -5.3322916666666664e+00 3878 4907 1.5998958333333331e+01 3878 3877 -1.0668750000000001e+01 3878 2776 1.4583333333333334e-02 3878 2780 -1.0666666666666666e+01 3879 3879 4.2689583333333331e+01 3879 4786 -6.2500000000000003e-03 3879 4907 -4.9904357809065860e-20 3879 4785 1.5998958333333333e+01 3879 4567 1.6263032587282567e-19 3879 4566 -2.1333333333333336e+01 3879 4784 5.3322916666666664e+00 3879 3878 -5.3322916666666664e+00 3879 3633 -5.3322916666666664e+00 3879 3636 -5.3322916666666664e+00 3879 2775 -1.0668750000000001e+01 3879 2780 -1.0666666666666666e+01 3879 2776 -1.6001041666666666e+01 3880 3880 3.2024999999999999e+01 3880 4932 5.3312499999999998e+00 3880 4542 5.3312499999999998e+00 3880 4925 -4.1666666666666666e-03 3880 3872 4.1666666666666657e-03 3880 4544 5.3312499999999998e+00 3880 4543 -1.0668750000000001e+01 3880 3882 -1.0668750000000001e+01 3880 4568 5.3312499999999998e+00 3880 4924 -4.1666666666666666e-03 3880 3874 4.1666666666666657e-03 3880 4572 5.3312499999999998e+00 3880 4571 -1.0668750000000001e+01 3880 3881 -1.0668750000000001e+01 3880 4580 4.1666666666666666e-03 3880 4582 -5.3312499999999998e+00 3880 4927 1.0668750000000001e+01 3880 3875 -1.0668750000000001e+01 3880 2769 4.1666666666666657e-03 3881 3881 4.2691666666666663e+01 3881 4543 5.3322916666666664e+00 3881 4542 -2.1331249999999997e+01 3881 4541 5.3322916666666664e+00 3881 3872 -1.0666666666666666e+01 3881 4902 6.2500000000000003e-03 3881 4570 5.3322916666666664e+00 3881 3877 -1.0668750000000001e+01 3881 4924 6.2500000000000003e-03 3881 4572 -2.1331249999999997e+01 3881 4571 5.3322916666666664e+00 3881 3874 -1.0666666666666666e+01 3881 3880 -1.0668750000000001e+01 3882 3882 4.2691666666666663e+01 3882 4927 -5.3322916666666664e+00 3882 4932 -2.1331249999999997e+01 3882 4528 6.2500000000000003e-03 3882 4531 -5.3322916666666664e+00 3882 4925 6.2500000000000003e-03 3882 4544 -2.1331249999999997e+01 3882 4543 5.3322916666666664e+00 3882 3872 -1.0666666666666666e+01 3882 3880 -1.0668750000000001e+01 3882 3352 -5.3322916666666664e+00 3882 2769 -1.0666666666666666e+01 3882 2774 -1.0668750000000001e+01 3883 3883 3.2024999999999999e+01 3883 4867 5.3312499999999998e+00 3883 4528 -4.1666666666666666e-03 3883 4544 5.3312499999999998e+00 3883 3908 -1.0668750000000001e+01 3883 3898 4.1666666666666657e-03 3883 4546 -5.3312499999999998e+00 3883 4529 1.0668750000000001e+01 3883 4527 -4.1666666666666666e-03 3883 4537 5.3312499999999998e+00 3883 3887 -1.0668750000000001e+01 3883 3886 4.1666666666666657e-03 3883 4535 -5.3312499999999998e+00 3883 4531 1.0668750000000001e+01 3883 3885 4.1666666666666657e-03 3883 4534 -5.3312499999999998e+00 3883 4532 1.0668750000000001e+01 3883 3884 -1.0668750000000001e+01 3883 3628 -4.1666666666666666e-03 3884 3884 4.2691666666666663e+01 3884 4536 5.3322916666666664e+00 3884 4539 5.3322916666666664e+00 3884 3903 -1.0668750000000001e+01 3884 4535 2.1331249999999997e+01 3884 3886 -1.0666666666666666e+01 3884 4531 -5.3322916666666664e+00 3884 4534 2.1331249999999997e+01 3884 4532 -5.3322916666666664e+00 3884 3885 -1.0666666666666666e+01 3884 3883 -1.0668750000000001e+01 3884 3625 6.2500000000000003e-03 3884 3628 6.2500000000000003e-03 3885 3885 4.2700000000333333e+01 3885 4536 -6.2500000000000003e-03 3885 4865 1.0416666666666667e-03 3885 3903 4.1666666666666666e-03 3885 4494 -1.0416666666666666e-11 3885 4495 6.2499999999999991e-11 3885 4496 -1.0416666666666666e-11 3885 3896 4.1666666666666665e-11 3885 4432 -1.0416666666666666e-11 3885 4538 1.0662499999958333e+01 3885 3895 -1.0666666666666666e+01 3885 4445 6.2499999999999991e-11 3885 4440 -1.0416666666666666e-11 3885 3893 4.1666666666666665e-11 3885 4508 -1.0666666666583334e+01 3885 3894 -1.0666666666666666e+01 3885 4527 -1.0416666666666667e-03 3885 4537 1.0662499999958333e+01 3885 3887 -1.0666666666666666e+01 3885 4532 6.2500000000000003e-03 3885 3883 4.1666666666666666e-03 3885 4534 -1.0658333333333333e+01 3885 3884 -1.0666666666666666e+01 3885 3625 -1.0416666666666667e-03 3885 3628 -1.0416666666666667e-03 3886 3886 4.2733333333333334e+01 3886 4924 -1.0416666666666667e-03 3886 4528 -1.0416666666666667e-03 3886 4543 -6.2500000000000003e-03 3886 4925 -1.0416666666666667e-03 3886 3907 4.1666666666666666e-03 3886 4544 1.0658333333333333e+01 3886 3908 -1.0666666666666666e+01 3886 4902 -1.0416666666666667e-03 3886 4542 1.0658333333333333e+01 3886 3906 -1.0666666666666666e+01 3886 4541 -6.2500000000000003e-03 3886 4897 1.0416666666666667e-03 3886 3905 4.1666666666666666e-03 3886 4539 -6.2500000000000003e-03 3886 4895 -1.0416666666666667e-03 3886 3903 4.1666666666666666e-03 3886 4540 1.0658333333333333e+01 3886 3904 -1.0666666666666666e+01 3886 4531 6.2500000000000003e-03 3886 3883 4.1666666666666666e-03 3886 4535 -1.0658333333333333e+01 3886 3884 -1.0666666666666666e+01 3886 3625 -1.0416666666666667e-03 3886 3628 -1.0416666666666667e-03 3887 3887 4.2679166666791659e+01 3887 4529 -5.3322916666666664e+00 3887 4546 2.1332291666656250e+01 3887 3898 -1.0666666666666666e+01 3887 4506 -5.3333333333229165e+00 3887 4496 6.2500000000000004e-11 3887 4495 -5.3333333333229165e+00 3887 3896 -1.0666666666687499e+01 3887 4527 6.2500000000000003e-03 3887 4537 -2.1332291666656246e+01 3887 3885 -1.0666666666666666e+01 3887 4532 -5.3322916666666664e+00 3887 3883 -1.0668750000000001e+01 3888 3888 3.2000000000249997e+01 3888 4870 -5.3333333333124999e+00 3888 4840 -4.1666666666666665e-11 3888 4854 5.3333333333124999e+00 3888 3900 -1.0666666666687499e+01 3888 3901 4.1666666666666665e-11 3888 4858 -5.3333333333124999e+00 3888 4841 1.0666666666687499e+01 3888 4838 -4.1666666666666665e-11 3888 4851 5.3333333333124999e+00 3888 3892 -1.0666666666687499e+01 3888 3891 4.1666666666666665e-11 3888 4452 -5.3333333333124999e+00 3888 4844 1.0666666666687499e+01 3888 4449 4.1666666666666665e-11 3888 3890 4.1666666666666665e-11 3888 4448 -5.3333333333124999e+00 3888 4845 1.0666666666687499e+01 3888 3889 -1.0666666666687499e+01 3889 3889 4.2666666666916662e+01 3889 4435 -5.3333333333229165e+00 3889 4434 6.2499999999999991e-11 3889 4444 -5.3333333333229165e+00 3889 3893 -1.0666666666687499e+01 3889 4452 2.1333333333312499e+01 3889 3891 -1.0666666666666666e+01 3889 4844 -5.3333333333229165e+00 3889 4449 -6.2499999999999991e-11 3889 4448 2.1333333333312499e+01 3889 4845 -5.3333333333229165e+00 3889 3890 -1.0666666666666666e+01 3889 3888 -1.0666666666687499e+01 3890 3890 4.2700000000333333e+01 3890 4897 1.0416666666666667e-03 3890 4849 -6.2500000000000003e-03 3890 4856 1.0416666666666667e-03 3890 3905 4.1666666666666666e-03 3890 4865 1.0416666666666667e-03 3890 4853 -6.2500000000000003e-03 3890 4895 -1.0416666666666667e-03 3890 3903 4.1666666666666666e-03 3890 4850 1.0658333333333333e+01 3890 3904 -1.0666666666666666e+01 3890 4434 -1.0416666666666666e-11 3890 4435 6.2499999999999991e-11 3890 4432 -1.0416666666666666e-11 3890 3893 4.1666666666666665e-11 3890 4852 1.0662499999958333e+01 3890 3895 -1.0666666666666666e+01 3890 4838 -1.0416666666666666e-11 3890 4851 1.0662499999958333e+01 3890 3892 -1.0666666666666666e+01 3890 4845 6.2499999999999991e-11 3890 4449 1.0416666666666666e-11 3890 3888 4.1666666666666665e-11 3890 4448 -1.0666666666583334e+01 3890 3889 -1.0666666666666666e+01 3891 3891 4.2666666667333331e+01 3891 4402 -1.0416666666666666e-11 3891 4840 -1.0416666666666666e-11 3891 4410 6.2499999999999991e-11 3891 4404 -1.0416666666666666e-11 3891 3899 4.1666666666666665e-11 3891 4854 1.0666666666583334e+01 3891 3900 -1.0666666666666666e+01 3891 4492 -1.0416666666666666e-11 3891 4824 -1.0666666666583334e+01 3891 3897 -1.0666666666666666e+01 3891 4434 -1.0416666666666666e-11 3891 4505 6.2499999999999991e-11 3891 4494 -1.0416666666666666e-11 3891 3896 4.1666666666666665e-11 3891 4444 6.2499999999999991e-11 3891 4440 -1.0416666666666666e-11 3891 3893 4.1666666666666665e-11 3891 4511 -1.0666666666583334e+01 3891 3894 -1.0666666666666666e+01 3891 4844 6.2499999999999991e-11 3891 4449 1.0416666666666666e-11 3891 3888 4.1666666666666665e-11 3891 4452 -1.0666666666583334e+01 3891 3889 -1.0666666666666666e+01 3892 3892 4.2679166666791666e+01 3892 4875 5.3322916666666664e+00 3892 4856 -6.2500000000000003e-03 3892 4849 5.3322916666666664e+00 3892 3905 -1.0668750000000001e+01 3892 4858 2.1332291666656250e+01 3892 4841 -5.3333333333229165e+00 3892 3901 -1.0666666666666666e+01 3892 4838 6.2500000000000004e-11 3892 4851 -2.1332291666656250e+01 3892 3890 -1.0666666666666666e+01 3892 4845 -5.3333333333229165e+00 3892 3888 -1.0666666666687499e+01 3893 3893 3.2000000000249997e+01 3893 4448 -5.3333333333124999e+00 3893 4434 -4.1666666666666665e-11 3893 4452 -5.3333333333124999e+00 3893 3889 -1.0666666666687499e+01 3893 3890 4.1666666666666665e-11 3893 4852 5.3333333333124999e+00 3893 4435 1.0666666666687499e+01 3893 4432 -4.1666666666666665e-11 3893 4538 5.3333333333124999e+00 3893 3895 -1.0666666666687499e+01 3893 3891 4.1666666666666665e-11 3893 4511 -5.3333333333124999e+00 3893 4444 1.0666666666687499e+01 3893 4440 -4.1666666666666665e-11 3893 3885 4.1666666666666665e-11 3893 4508 -5.3333333333124999e+00 3893 4445 1.0666666666687499e+01 3893 3894 -1.0666666666687499e+01 3894 3894 4.2666666666916662e+01 3894 4495 -5.3333333333229165e+00 3894 4494 6.2500000000000004e-11 3894 4505 -5.3333333333229165e+00 3894 3896 -1.0666666666687499e+01 3894 4511 2.1333333333312499e+01 3894 3891 -1.0666666666666666e+01 3894 4444 -5.3333333333229165e+00 3894 4440 6.2500000000000004e-11 3894 4508 2.1333333333312499e+01 3894 4445 -5.3333333333229165e+00 3894 3885 -1.0666666666666666e+01 3894 3893 -1.0666666666687499e+01 3895 3895 4.2679166666791666e+01 3895 4536 5.3322916666666664e+00 3895 4865 -6.2500000000000003e-03 3895 4853 5.3322916666666664e+00 3895 3903 -1.0668750000000001e+01 3895 4852 -2.1332291666656250e+01 3895 4435 -5.3333333333229165e+00 3895 3890 -1.0666666666666666e+01 3895 4432 6.2499999999999991e-11 3895 4538 -2.1332291666656250e+01 3895 3885 -1.0666666666666666e+01 3895 4445 -5.3333333333229165e+00 3895 3893 -1.0666666666687499e+01 3896 3896 3.2000000000249997e+01 3896 4546 -5.3333333333124999e+00 3896 4824 -5.3333333333124999e+00 3896 4492 -4.1666666666666665e-11 3896 3898 4.1666666666666665e-11 3896 4823 -5.3333333333124999e+00 3896 4506 1.0666666666687499e+01 3896 3897 -1.0666666666687499e+01 3896 4508 -5.3333333333124999e+00 3896 4494 -4.1666666666666665e-11 3896 3891 4.1666666666666665e-11 3896 4511 -5.3333333333124999e+00 3896 4505 1.0666666666687499e+01 3896 3894 -1.0666666666687499e+01 3896 4496 -4.1666666666666665e-11 3896 3885 4.1666666666666665e-11 3896 4537 5.3333333333124999e+00 3896 4495 1.0666666666687499e+01 3896 3887 -1.0666666666687499e+01 3897 3897 4.2666666666916662e+01 3897 4403 -5.3333333333229165e+00 3897 4402 6.2499999999999991e-11 3897 4410 -5.3333333333229165e+00 3897 3899 -1.0666666666687499e+01 3897 4824 2.1333333333312499e+01 3897 3891 -1.0666666666666666e+01 3897 4505 -5.3333333333229165e+00 3897 4492 6.2499999999999991e-11 3897 4823 2.1333333333312499e+01 3897 4506 -5.3333333333229165e+00 3897 3898 -1.0666666666666666e+01 3897 3896 -1.0666666666687499e+01 3898 3898 4.2700000000333333e+01 3898 4528 -1.0416666666666667e-03 3898 4529 6.2500000000000003e-03 3898 4527 -1.0416666666666667e-03 3898 3883 4.1666666666666666e-03 3898 4877 1.0416666666666667e-03 3898 4869 -6.2500000000000003e-03 3898 4925 -1.0416666666666667e-03 3898 3907 4.1666666666666666e-03 3898 4867 1.0658333333333333e+01 3898 3908 -1.0666666666666666e+01 3898 4402 -1.0416666666666666e-11 3898 4403 6.2499999999999991e-11 3898 4400 -1.0416666666666666e-11 3898 3899 4.1666666666666665e-11 3898 4868 1.0662499999958333e+01 3898 3902 -1.0666666666666666e+01 3898 4496 -1.0416666666666666e-11 3898 4546 -1.0662499999958333e+01 3898 3887 -1.0666666666666666e+01 3898 4506 6.2499999999999991e-11 3898 4492 -1.0416666666666666e-11 3898 3896 4.1666666666666665e-11 3898 4823 -1.0666666666583334e+01 3898 3897 -1.0666666666666666e+01 3899 3899 3.2000000000249997e+01 3899 4823 -5.3333333333124999e+00 3899 4402 -4.1666666666666665e-11 3899 4824 -5.3333333333124999e+00 3899 3897 -1.0666666666687499e+01 3899 3898 4.1666666666666665e-11 3899 4868 5.3333333333124999e+00 3899 4403 1.0666666666687499e+01 3899 4400 -4.1666666666666665e-11 3899 4874 5.3333333333124999e+00 3899 3902 -1.0666666666687499e+01 3899 3891 4.1666666666666665e-11 3899 4854 5.3333333333124999e+00 3899 4410 1.0666666666687499e+01 3899 4404 -4.1666666666666665e-11 3899 3901 4.1666666666666665e-11 3899 4870 -5.3333333333124999e+00 3899 4411 1.0666666666687499e+01 3899 3900 -1.0666666666687499e+01 3900 3900 4.2666666666916662e+01 3900 4841 -5.3333333333229165e+00 3900 4840 6.2500000000000004e-11 3900 4844 -5.3333333333229165e+00 3900 3888 -1.0666666666687499e+01 3900 4854 -2.1333333333312499e+01 3900 3891 -1.0666666666666666e+01 3900 4410 -5.3333333333229165e+00 3900 4404 6.2500000000000004e-11 3900 4870 2.1333333333312499e+01 3900 4411 -5.3333333333229165e+00 3900 3901 -1.0666666666666666e+01 3900 3899 -1.0666666666687499e+01 3901 3901 4.2700000000333333e+01 3901 4924 -1.0416666666666667e-03 3901 4872 -6.2500000000000003e-03 3901 4877 1.0416666666666667e-03 3901 3907 4.1666666666666666e-03 3901 4856 1.0416666666666667e-03 3901 4875 -6.2500000000000003e-03 3901 4902 -1.0416666666666667e-03 3901 3905 4.1666666666666666e-03 3901 4873 1.0658333333333333e+01 3901 3906 -1.0666666666666666e+01 3901 4840 -1.0416666666666666e-11 3901 4841 6.2499999999999991e-11 3901 4838 -1.0416666666666666e-11 3901 3888 4.1666666666666665e-11 3901 4858 -1.0662499999958333e+01 3901 3892 -1.0666666666666666e+01 3901 4400 -1.0416666666666666e-11 3901 4874 1.0662499999958333e+01 3901 3902 -1.0666666666666666e+01 3901 4411 6.2499999999999991e-11 3901 4404 -1.0416666666666666e-11 3901 3899 4.1666666666666665e-11 3901 4870 -1.0666666666583334e+01 3901 3900 -1.0666666666666666e+01 3902 3902 4.2679166666791666e+01 3902 4872 5.3322916666666664e+00 3902 4877 -6.2500000000000003e-03 3902 4869 5.3322916666666664e+00 3902 3907 -1.0668750000000001e+01 3902 4868 -2.1332291666656250e+01 3902 4403 -5.3333333333229165e+00 3902 3898 -1.0666666666666666e+01 3902 4400 6.2499999999999991e-11 3902 4874 -2.1332291666656250e+01 3902 3901 -1.0666666666666666e+01 3902 4411 -5.3333333333229165e+00 3902 3899 -1.0666666666687499e+01 3903 3903 3.2024999999999999e+01 3903 4534 -5.3312499999999998e+00 3903 4535 -5.3312499999999998e+00 3903 3884 -1.0668750000000001e+01 3903 3885 4.1666666666666657e-03 3903 4538 5.3312499999999998e+00 3903 4536 -1.0668750000000001e+01 3903 4865 4.1666666666666666e-03 3903 4852 5.3312499999999998e+00 3903 3895 -1.0668750000000001e+01 3903 3886 4.1666666666666657e-03 3903 4540 5.3312499999999998e+00 3903 4539 -1.0668750000000001e+01 3903 4895 -4.1666666666666666e-03 3903 3890 4.1666666666666657e-03 3903 4850 5.3312499999999998e+00 3903 4853 -1.0668750000000001e+01 3903 3904 -1.0668750000000001e+01 3903 3625 -4.1666666666666666e-03 3904 3904 4.2691666666666663e+01 3904 4849 5.3322916666666664e+00 3904 4897 -6.2500000000000003e-03 3904 4541 5.3322916666666664e+00 3904 3905 -1.0668750000000001e+01 3904 4540 -2.1331249999999997e+01 3904 3886 -1.0666666666666666e+01 3904 4539 5.3322916666666664e+00 3904 4895 6.2500000000000003e-03 3904 4850 -2.1331249999999997e+01 3904 4853 5.3322916666666664e+00 3904 3890 -1.0666666666666666e+01 3904 3903 -1.0668750000000001e+01 3905 3905 3.2024999999999999e+01 3905 4858 -5.3312499999999998e+00 3905 4542 5.3312499999999998e+00 3905 4902 -4.1666666666666666e-03 3905 3901 4.1666666666666657e-03 3905 4873 5.3312499999999998e+00 3905 4875 -1.0668750000000001e+01 3905 3906 -1.0668750000000001e+01 3905 4850 5.3312499999999998e+00 3905 4897 4.1666666666666666e-03 3905 3886 4.1666666666666657e-03 3905 4540 5.3312499999999998e+00 3905 4541 -1.0668750000000001e+01 3905 3904 -1.0668750000000001e+01 3905 4856 4.1666666666666666e-03 3905 3890 4.1666666666666657e-03 3905 4851 5.3312499999999998e+00 3905 4849 -1.0668750000000001e+01 3905 3892 -1.0668750000000001e+01 3906 3906 4.2691666666666663e+01 3906 4872 5.3322916666666664e+00 3906 4924 6.2500000000000003e-03 3906 4543 5.3322916666666664e+00 3906 3907 -1.0668750000000001e+01 3906 4542 -2.1331249999999997e+01 3906 3886 -1.0666666666666666e+01 3906 4541 5.3322916666666664e+00 3906 4902 6.2500000000000003e-03 3906 4873 -2.1331249999999997e+01 3906 4875 5.3322916666666664e+00 3906 3901 -1.0666666666666666e+01 3906 3905 -1.0668750000000001e+01 3907 3907 3.2024999999999999e+01 3907 4873 5.3312499999999998e+00 3907 4924 -4.1666666666666666e-03 3907 4542 5.3312499999999998e+00 3907 3906 -1.0668750000000001e+01 3907 3901 4.1666666666666657e-03 3907 4874 5.3312499999999998e+00 3907 4872 -1.0668750000000001e+01 3907 4877 4.1666666666666666e-03 3907 4868 5.3312499999999998e+00 3907 3902 -1.0668750000000001e+01 3907 3886 4.1666666666666657e-03 3907 4544 5.3312499999999998e+00 3907 4543 -1.0668750000000001e+01 3907 4925 -4.1666666666666666e-03 3907 3898 4.1666666666666657e-03 3907 4867 5.3312499999999998e+00 3907 4869 -1.0668750000000001e+01 3907 3908 -1.0668750000000001e+01 3908 3908 4.2691666666666663e+01 3908 4529 -5.3322916666666664e+00 3908 4528 6.2500000000000003e-03 3908 4531 -5.3322916666666664e+00 3908 3883 -1.0668750000000001e+01 3908 4544 -2.1331249999999997e+01 3908 3886 -1.0666666666666666e+01 3908 4543 5.3322916666666664e+00 3908 4925 6.2500000000000003e-03 3908 4867 -2.1331249999999997e+01 3908 4869 5.3322916666666664e+00 3908 3898 -1.0666666666666666e+01 3908 3907 -1.0668750000000001e+01 3909 3909 3.2024999999999999e+01 3910 3910 1.0683333333333334e+01 3911 3911 2.1349999999999998e+01 3911 4565 1.0672916666666666e+01 3911 4554 5.3343749999999996e+00 3911 4547 2.0833333333333346e-03 3911 4557 5.3343749999999996e+00 3911 4548 -5.3322916666666664e+00 3911 3650 -5.3322916666666664e+00 3911 2990 -1.0672916666666666e+01 3912 3912 2.1362499999999997e+01 3913 3913 5.3383333333333340e+01 3913 5075 -5.3281250000000000e+00 3913 4562 1.0658333333333331e+01 3913 4910 -5.3302083333333332e+00 3913 3918 -1.0666666666666668e+01 3913 4567 1.0662500000000000e+01 3913 4561 -1.0679166666666665e+01 3913 3919 -5.3343749999999996e+00 3913 4560 3.1999999999999996e+01 3913 4555 5.3322916666666664e+00 3913 4556 1.0666666666666666e+01 3913 4547 1.0416666666666666e-02 3913 4554 5.3322916666666664e+00 3913 2971 -1.5994791666666666e+01 3913 3640 -5.3322916666666664e+00 3913 3650 -5.3281250000000000e+00 3913 2977 -1.0670833333333333e+01 3914 3914 5.3383333333333340e+01 3914 4910 -5.3302083333333332e+00 3914 4567 1.0662500000000000e+01 3914 4784 -1.0679166666666665e+01 3914 3919 -5.3343749999999996e+00 3914 4787 1.0658333333333331e+01 3914 4788 5.3322916666666664e+00 3914 5075 -5.3281250000000000e+00 3914 3918 -1.0666666666666664e+01 3914 4786 -1.0416666666666664e-02 3914 4566 -3.1999999999999996e+01 3914 4782 5.3322916666666664e+00 3914 4783 1.0666666666666666e+01 3914 3630 -5.3281250000000000e+00 3914 3633 -5.3322916666666664e+00 3914 2971 -1.5994791666666666e+01 3914 2968 -1.0670833333333334e+01 3915 3915 2.1354166666666668e+01 3916 3916 2.1358333333333331e+01 3917 3917 2.1354166666666668e+01 3918 3918 4.2699999999999996e+01 3918 4784 1.0662500000000000e+01 3918 4555 8.8938459461701536e-21 3918 4562 -2.1329166666666666e+01 3918 4561 1.0662500000000000e+01 3918 4910 1.0683333333333334e+01 3918 3913 -1.0666666666666668e+01 3918 3919 -1.0672916666666666e+01 3918 4788 2.8940292364521927e-21 3918 5075 1.0662500000000000e+01 3918 4787 -2.1329166666666666e+01 3918 3914 -1.0666666666666664e+01 3919 3919 2.1349999999999998e+01 3919 4787 5.3322916666666664e+00 3919 4910 -2.0833333333333337e-03 3919 4562 5.3322916666666664e+00 3919 3918 -1.0672916666666666e+01 3919 4561 -5.3343749999999996e+00 3919 4560 -5.3322916666666664e+00 3919 3913 -5.3343749999999996e+00 3919 4784 -5.3343749999999996e+00 3919 4566 5.3322916666666664e+00 3919 3914 -5.3343749999999996e+00 3919 4567 -1.0672916666666666e+01 3919 2971 2.0833333333333337e-03 3920 3920 4.2710416666666674e+01 3920 5073 -5.3281250000000000e+00 3920 4563 5.3322916666666664e+00 3920 4562 -1.4583333333333332e-02 3920 3923 -1.0672916666666666e+01 3920 4910 5.3281250000000000e+00 3920 4569 -3.2249014814734037e-20 3920 4561 5.3322916666666664e+00 3920 3930 6.2499999999999986e-03 3920 4548 -5.3281250000000000e+00 3920 4547 1.0416666666666666e-02 3920 4559 1.5998958333333331e+01 3920 4552 -5.3322916666666664e+00 3920 3927 -1.0666666666666666e+01 3920 3926 -1.0670833333333334e+01 3920 4557 5.3322916666666664e+00 3920 4558 1.0666666666666666e+01 3921 3921 2.1352083333333333e+01 3922 3922 2.1354166666666668e+01 3923 3923 3.2020833333333336e+01 3923 4563 -2.8940292364521927e-21 3923 4561 1.6284208410963924e-19 3923 4562 -1.0662500000000000e+01 3923 3920 -1.0672916666666666e+01 3923 4910 -5.3291666666666666e+00 3923 4913 -5.3312499999999998e+00 3923 3930 -1.0670833333333334e+01 3923 5073 5.3291666666666666e+00 3923 5074 1.0668750000000001e+01 3924 3924 2.1352083333333329e+01 3925 3925 2.1360416666666669e+01 3926 3926 3.2022916666666667e+01 3926 4568 5.3312499999999998e+00 3926 4550 -4.1666666666666666e-03 3926 4581 -5.3312499999999998e+00 3926 4553 1.0668750000000001e+01 3926 3928 -1.0668750000000001e+01 3926 4557 -4.5316262678105068e-20 3926 4548 5.3291666666666666e+00 3926 4547 5.3291666666666666e+00 3926 3927 4.1666666666666657e-03 3926 4559 -5.3312499999999998e+00 3926 4552 1.0668750000000001e+01 3926 3920 -1.0670833333333334e+01 3927 3927 4.2727083333333340e+01 3927 4580 1.0416666666666667e-03 3927 4902 -1.0416666666666667e-03 3927 4571 -6.2500000000000003e-03 3927 4924 -1.0416666666666667e-03 3927 3933 4.1666666666666666e-03 3927 4572 1.0658333333333333e+01 3927 3934 -1.0666666666666666e+01 3927 4570 -6.2499999999999995e-03 3927 4900 -1.0416666666666667e-03 3927 3931 4.1666666666666666e-03 3927 4561 2.1705219273391446e-19 3927 4569 1.0657291666666666e+01 3927 3930 -1.0666666666666666e+01 3927 4550 -1.0416666666666667e-03 3927 4568 1.0658333333333333e+01 3927 3928 -1.0666666666666666e+01 3927 4552 6.2500000000000003e-03 3927 4547 -1.0416666666666667e-03 3927 3926 4.1666666666666666e-03 3927 4559 -1.0657291666666666e+01 3927 3920 -1.0666666666666666e+01 3928 3928 4.2691666666666663e+01 3928 4583 5.3322916666666664e+00 3928 4580 -6.2500000000000003e-03 3928 4571 5.3322916666666664e+00 3928 3933 -1.0668750000000001e+01 3928 4568 -2.1331249999999997e+01 3928 3927 -1.0666666666666666e+01 3928 4552 -5.3322916666666664e+00 3928 4550 6.2500000000000003e-03 3928 4581 2.1331249999999997e+01 3928 4553 -5.3322916666666664e+00 3928 3926 -1.0668750000000001e+01 3929 3929 2.1366666666666664e+01 3930 3930 4.2704166666666673e+01 3930 4562 5.3281250000000000e+00 3930 4910 -1.0416666666666668e-02 3930 5074 -5.3322916666666664e+00 3930 4913 1.5998958333333331e+01 3930 3923 -1.0670833333333334e+01 3930 4901 -5.3281250000000000e+00 3930 4908 5.3322916666666664e+00 3930 4900 1.0416666666666666e-02 3930 4570 5.3322916666666664e+00 3930 3931 -1.0670833333333334e+01 3930 4559 2.1684043449710089e-19 3930 3920 6.2499999999999986e-03 3930 4561 -5.3322916666666664e+00 3930 3927 -1.0666666666666666e+01 3930 4569 -1.5998958333333333e+01 3931 3931 3.2022916666666667e+01 3931 4936 -5.3312499999999998e+00 3931 4902 -4.1666666666666666e-03 3931 4572 5.3312499999999998e+00 3931 3934 -1.0668750000000001e+01 3931 4903 1.0668750000000001e+01 3931 4908 -2.1705219273391446e-19 3931 4901 5.3291666666666666e+00 3931 4900 5.3291666666666666e+00 3931 3927 4.1666666666666657e-03 3931 4570 -1.0668750000000001e+01 3931 4569 5.3312499999999998e+00 3931 3930 -1.0670833333333334e+01 3932 3932 2.1352083333333333e+01 3933 3933 3.2024999999999999e+01 3933 4581 -5.3312499999999998e+00 3933 4580 4.1666666666666666e-03 3933 4568 5.3312499999999998e+00 3933 3928 -1.0668750000000001e+01 3933 4583 -1.0668750000000001e+01 3933 4923 -4.1666666666666666e-03 3933 3927 4.1666666666666657e-03 3933 4572 5.3312499999999998e+00 3933 4571 -1.0668750000000001e+01 3933 4924 -4.1666666666666666e-03 3933 4936 -5.3312499999999998e+00 3933 4929 1.0668750000000001e+01 3933 3934 -1.0668750000000001e+01 3934 3934 4.2691666666666663e+01 3934 4903 -5.3322916666666664e+00 3934 4902 6.2500000000000003e-03 3934 4570 5.3322916666666664e+00 3934 3931 -1.0668750000000001e+01 3934 4572 -2.1331249999999997e+01 3934 3927 -1.0666666666666666e+01 3934 4571 5.3322916666666664e+00 3934 4924 6.2500000000000003e-03 3934 4936 2.1331249999999997e+01 3934 4929 -5.3322916666666664e+00 3934 3933 -1.0668750000000001e+01 3935 3935 2.1366666666666664e+01 3936 3936 2.1345833333333331e+01 3937 3937 3.2024999999999999e+01 3937 4549 1.0668750000000001e+01 3937 4548 -4.1666666666666666e-03 3937 4581 -5.3312499999999998e+00 3937 4553 1.0668750000000001e+01 3937 4550 -4.1666666666666666e-03 3937 4579 -5.3312499999999998e+00 3937 4551 1.0668750000000001e+01 3937 3938 -1.0668750000000001e+01 3937 3648 -4.1666666666666666e-03 3938 3938 4.2691666666666663e+01 3938 4928 -5.3322916666666664e+00 3938 4553 -5.3322916666666664e+00 3938 4580 -6.2500000000000003e-03 3938 4581 2.1331249999999997e+01 3938 4583 5.3322916666666664e+00 3938 3940 -1.0668750000000001e+01 3938 4550 6.2500000000000003e-03 3938 4579 2.1331249999999997e+01 3938 4551 -5.3322916666666664e+00 3938 3937 -1.0668750000000001e+01 3939 3939 2.1366666666666664e+01 3940 3940 3.2024999999999999e+01 3940 4923 -4.1666666666666666e-03 3940 4922 1.0668750000000001e+01 3940 4921 -4.1666666666666666e-03 3940 4579 -5.3312499999999998e+00 3940 4928 1.0668750000000001e+01 3940 4580 4.1666666666666666e-03 3940 4581 -5.3312499999999998e+00 3940 4583 -1.0668750000000001e+01 3940 3938 -1.0668750000000001e+01 3941 3941 2.1366666666666664e+01 3942 3942 2.1345833333333331e+01 3943 3943 1.0683333333333334e+01 3944 3944 2.1345833333333331e+01 3945 3945 1.0683333333333334e+01 3946 3946 2.1345833333333331e+01 3947 3947 2.1345833333333331e+01 3948 3948 4.2704166666666666e+01 3948 4588 1.5995833333333334e+01 3948 3950 4.1666666666666657e-03 3948 4587 1.0668749999999999e+01 3948 4613 -5.3312499999999998e+00 3948 4589 1.0668750000000001e+01 3948 4586 -4.1666666666666666e-03 3948 4611 -5.3312499999999998e+00 3948 3949 -1.0668750000000001e+01 3948 2136 -1.0662500000000000e+01 3948 1926 -5.3312499999999998e+00 3948 1930 -1.5995833333333334e+01 3948 1928 1.0662500000000000e+01 3948 2133 1.0683333333333334e+01 3948 1434 -1.0664583333333335e+01 3948 1439 -1.0672916666666666e+01 3949 3949 4.2679166666791659e+01 3949 4589 -5.3322916666666664e+00 3949 4615 -5.3333333333229165e+00 3949 4612 -6.2499999999999991e-11 3949 4613 2.1332291666656250e+01 3949 4657 5.3333333333229165e+00 3949 3953 -1.0666666666687499e+01 3949 4586 6.2500000000000003e-03 3949 4611 2.1332291666656246e+01 3949 4587 -5.3322916666666664e+00 3949 3950 -1.0666666666666666e+01 3949 3948 -1.0668750000000001e+01 3950 3950 5.8683333333895817e+01 3950 4587 6.2500000000000003e-03 3950 3948 4.1666666666666666e-03 3950 4615 6.2499999999999991e-11 3950 3953 4.1666666666666665e-11 3950 4612 1.0416666666666666e-11 3950 4586 -1.0416666666666667e-03 3950 4611 -1.0662499999958333e+01 3950 3949 -1.0666666666666666e+01 3950 1802 -5.3333333333020834e+00 3950 1442 2.0833333333333339e-11 3950 1810 1.0666666666833333e+01 3950 1809 -5.3333333333020834e+00 3950 1954 5.3333333333124999e+00 3950 1951 1.3333333333270833e+01 3950 1440 -1.3333333333281249e+01 3950 1930 1.0416666666666667e-03 3950 2074 -1.0416666666666666e-11 3950 1950 2.1333333333260416e+01 3950 1438 -1.5999999999947917e+01 3950 1949 2.1333333333343749e+01 3950 1927 -5.3333333333124999e+00 3950 1926 -2.6624999999687495e+00 3950 1435 -1.0666666666614583e+01 3950 1434 -8.0000000000000000e+00 3951 3951 3.2024999999999999e+01 3952 3952 2.1350000000166663e+01 3953 3953 3.2000000000249997e+01 3953 4891 1.0666666666687499e+01 3953 3950 4.1666666666666665e-11 3953 4615 1.0666666666687499e+01 3953 4611 -5.3333333333124999e+00 3953 4890 -4.1666666666666665e-11 3953 4612 4.1666666666666665e-11 3953 4613 -5.3333333333124999e+00 3953 4657 -1.0666666666687499e+01 3953 3949 -1.0666666666687499e+01 3953 2078 -5.3333333333124999e+00 3953 2074 -4.1666666666666665e-11 3953 1950 5.3333333333124999e+00 3953 1438 -1.0666666666687499e+01 3954 3954 2.1333333333458331e+01 3955 3955 3.2000000000458328e+01 3956 3956 3.2024999999999999e+01 3956 3962 4.1666666666666657e-03 3956 4595 1.0668749999999999e+01 3956 4592 -4.1666666666666666e-03 3956 3957 -1.0668749999999999e+01 3956 4610 5.3312499999999998e+00 3956 4590 -4.1666666666666666e-03 3956 4650 -5.3312499999999998e+00 3956 3961 -1.0668750000000001e+01 3956 3958 4.1666666666666657e-03 3956 4599 -5.3312499999999998e+00 3956 4593 1.0668750000000001e+01 3956 2138 -5.3312499999999998e+00 3956 2133 4.1666666666666675e-03 3956 2132 -5.3312499999999998e+00 3956 1647 -1.0668750000000001e+01 3956 1646 4.1666666666666657e-03 3956 2194 -5.3312499999999998e+00 3956 2193 1.0668750000000001e+01 3957 3957 4.2691666666666663e+01 3957 4597 6.2500000000000003e-03 3957 4592 6.2500000000000003e-03 3957 3956 -1.0668749999999999e+01 3957 4605 5.3322916666666664e+00 3957 4599 2.1331249999999997e+01 3957 4593 -5.3322916666666664e+00 3957 3958 -1.0666666666666666e+01 3957 2194 2.1331249999999997e+01 3957 1013 -5.3322916666666664e+00 3957 1646 -1.0666666666666666e+01 3957 491 -1.0668749999999999e+01 3957 2193 -5.3322916666666664e+00 3958 3958 4.2733333333333334e+01 3958 4620 -1.0416666666666667e-03 3958 4590 -1.0416666666666667e-03 3958 4609 -6.2500000000000003e-03 3958 4626 -1.0416666666666667e-03 3958 3959 4.1666666666666666e-03 3958 4610 1.0658333333333333e+01 3958 3961 -1.0666666666666666e+01 3958 4634 1.0416666666666667e-03 3958 4608 1.0658333333333333e+01 3958 3960 -1.0666666666666666e+01 3958 4597 -1.0416666666666667e-03 3958 4607 -6.2500000000000003e-03 3958 4605 -6.2500000000000003e-03 3958 4606 1.0658333333333333e+01 3958 4593 6.2500000000000003e-03 3958 4592 -1.0416666666666667e-03 3958 3956 4.1666666666666666e-03 3958 4599 -1.0658333333333333e+01 3958 3957 -1.0666666666666666e+01 3958 3692 -1.0416666666666667e-03 3958 2829 4.1666666666666666e-03 3958 3662 -1.0416666666666667e-03 3958 491 4.1666666666666666e-03 3958 2830 -1.0666666666666666e+01 3959 3959 3.2024999999999999e+01 3959 4650 -5.3312499999999998e+00 3959 3962 4.1666666666666657e-03 3959 4655 5.3312499999999998e+00 3959 4631 1.0668750000000001e+01 3959 4622 -4.1666666666666666e-03 3959 4641 5.3312499999999998e+00 3959 3965 -1.0668750000000001e+01 3959 4608 5.3312499999999998e+00 3959 4626 -4.1666666666666666e-03 3959 3958 4.1666666666666657e-03 3959 4610 5.3312499999999998e+00 3959 4609 -1.0668750000000001e+01 3959 3961 -1.0668750000000001e+01 3959 4620 -4.1666666666666666e-03 3959 4636 -5.3312499999999998e+00 3959 4628 1.0668750000000001e+01 3959 3960 -1.0668750000000001e+01 3959 2831 4.1666666666666657e-03 3960 3960 4.2691666666666663e+01 3960 4609 5.3322916666666664e+00 3960 4634 -6.2500000000000003e-03 3960 4608 -2.1331249999999997e+01 3960 4607 5.3322916666666664e+00 3960 3958 -1.0666666666666666e+01 3960 4620 6.2500000000000003e-03 3960 4636 2.1331249999999997e+01 3960 4628 -5.3322916666666664e+00 3960 3959 -1.0668750000000001e+01 3960 3693 -5.3322916666666664e+00 3960 2829 -1.0668750000000001e+01 3960 2831 -1.0666666666666666e+01 3961 3961 4.2691666666666663e+01 3961 4631 -5.3322916666666664e+00 3961 4593 -5.3322916666666664e+00 3961 4626 6.2500000000000003e-03 3961 4610 -2.1331249999999997e+01 3961 4609 5.3322916666666664e+00 3961 3958 -1.0666666666666666e+01 3961 3959 -1.0668750000000001e+01 3961 4590 6.2500000000000003e-03 3961 4650 2.1331249999999997e+01 3961 4595 -5.3322916666666664e+00 3961 3962 -1.0666666666666666e+01 3961 3956 -1.0668750000000001e+01 3962 3962 4.2727083333333326e+01 3962 4654 -1.0657291666666666e+01 3962 3964 -1.0666666666666666e+01 3962 4595 6.2499999999999995e-03 3962 3956 4.1666666666666666e-03 3962 4626 -1.0416666666666667e-03 3962 4952 -1.0416666666666667e-03 3962 4631 6.2500000000000003e-03 3962 4622 -1.0416666666666667e-03 3962 3959 4.1666666666666666e-03 3962 4655 1.0658333333333333e+01 3962 3965 -1.0666666666666666e+01 3962 4653 -6.2500000000000003e-03 3962 4946 -1.0416666666666667e-03 3962 3963 4.1666666666666666e-03 3962 4590 -1.0416666666666667e-03 3962 4650 -1.0658333333333333e+01 3962 3961 -1.0666666666666666e+01 3962 1793 2.1705219273391446e-19 3962 2133 1.0416666666666667e-03 3962 2132 -1.0657291666666666e+01 3962 1647 -1.0666666666666666e+01 3963 3963 3.2024999999999999e+01 3963 4655 5.3312499999999998e+00 3963 4952 -4.1666666666666666e-03 3963 4641 5.3312499999999998e+00 3963 4640 -1.0668750000000001e+01 3963 3965 -1.0668750000000001e+01 3963 4958 -5.3312499999999998e+00 3963 4946 -4.1666666666666666e-03 3963 3962 4.1666666666666657e-03 3963 4654 -5.3312499999999998e+00 3963 4653 -1.0668750000000001e+01 3963 3964 -1.0668750000000001e+01 3963 4950 -4.1666666666666666e-03 3963 4947 1.0668750000000001e+01 3963 3686 -5.3312499999999998e+00 3963 2831 4.1666666666666657e-03 3963 1648 4.1666666666666657e-03 3963 3395 -5.3312499999999998e+00 3963 2827 -1.0668750000000001e+01 3964 3964 4.2689583333333331e+01 3964 4654 1.5998958333333331e+01 3964 3962 -1.0666666666666666e+01 3964 4958 2.1333333333333332e+01 3964 4947 -5.3322916666666664e+00 3964 4946 6.2500000000000003e-03 3964 4653 5.3322916666666664e+00 3964 3963 -1.0668750000000001e+01 3964 2132 -4.9904357809065860e-20 3964 2137 -1.6263032587282567e-19 3964 1793 5.3322916666666664e+00 3964 1648 -1.6001041666666666e+01 3964 1647 -5.3322916666666664e+00 3965 3965 4.2691666666666663e+01 3965 4653 5.3322916666666664e+00 3965 4655 -2.1331249999999997e+01 3965 4631 -5.3322916666666664e+00 3965 3962 -1.0666666666666666e+01 3965 4622 6.2500000000000003e-03 3965 4628 -5.3322916666666664e+00 3965 3959 -1.0668750000000001e+01 3965 4952 6.2500000000000003e-03 3965 4641 -2.1331249999999997e+01 3965 4640 5.3322916666666664e+00 3965 3963 -1.0668750000000001e+01 3965 2831 -1.0666666666666666e+01 3966 3966 3.2000000000249997e+01 3966 4885 5.3333333333124999e+00 3966 4438 -4.1666666666666665e-11 3966 4604 5.3333333333124999e+00 3966 3978 -1.0666666666687499e+01 3966 3970 4.1666666666666665e-11 3966 4601 5.3333333333124999e+00 3966 4447 1.0666666666687499e+01 3966 4461 -5.3333333333124999e+00 3966 4430 -4.1666666666666665e-11 3966 3977 4.1666666666666665e-11 3966 4462 -5.3333333333124999e+00 3966 4439 1.0666666666687499e+01 3966 3976 -1.0666666666687499e+01 3966 4436 -4.1666666666666665e-11 3966 3968 4.1666666666666665e-11 3966 4887 -5.3333333333124999e+00 3966 4437 1.0666666666687499e+01 3966 3967 -1.0666666666687499e+01 3967 3967 4.2666666666916662e+01 3967 4888 6.2499999999999991e-11 3967 4887 2.1333333333312499e+01 3967 3968 -1.0666666666666666e+01 3967 3969 -1.0666666666687499e+01 3967 4447 -5.3333333333229165e+00 3967 4601 -2.1333333333312499e+01 3967 4600 5.3333333333229165e+00 3967 3970 -1.0666666666666666e+01 3967 4436 6.2500000000000004e-11 3967 4437 -5.3333333333229165e+00 3967 3966 -1.0666666666687499e+01 3967 2075 -5.3333333333229165e+00 3968 3968 4.2666666667208332e+01 3968 4461 -1.0666666666572915e+01 3968 3976 -1.0666666666666666e+01 3968 4888 -1.0416666666666666e-11 3968 3969 4.1666666666666665e-11 3968 4887 -1.0666666666583334e+01 3968 3967 -1.0666666666666666e+01 3968 4430 -1.0416666666666666e-11 3968 4437 6.2499999999999991e-11 3968 4436 -1.0416666666666666e-11 3968 3966 4.1666666666666665e-11 3968 1785 -1.8812360437258079e-27 3968 1802 -3.6295685768920020e-28 3968 1803 -1.0666666666562499e+01 3968 1471 -1.0666666666666666e+01 3968 2074 -1.0416666666666666e-11 3968 2076 1.0666666666572917e+01 3968 1468 -1.0666666666666666e+01 3968 2075 6.2499999999999991e-11 3969 3969 3.2000000000249997e+01 3969 3975 4.1666666666666665e-11 3969 4615 1.0666666666687499e+01 3969 3968 4.1666666666666665e-11 3969 4888 -4.1666666666666665e-11 3969 4887 -5.3333333333124999e+00 3969 3967 -1.0666666666687499e+01 3969 4603 5.3333333333124999e+00 3969 4612 4.1666666666666665e-11 3969 4611 -5.3333333333124999e+00 3969 3974 -1.0666666666687499e+01 3969 3970 4.1666666666666665e-11 3969 4601 5.3333333333124999e+00 3969 4600 -1.0666666666687499e+01 3969 1950 5.3333333333124999e+00 3969 2074 -4.1666666666666665e-11 3969 2076 5.3333333333124999e+00 3969 1468 -1.0666666666687499e+01 3969 2075 1.0666666666687499e+01 3970 3970 4.2700000000333333e+01 3970 4889 1.0416666666666667e-03 3970 4612 1.0416666666666666e-11 3970 4438 -1.0416666666666666e-11 3970 4604 1.0662499999958333e+01 3970 3978 -1.0666666666666666e+01 3970 4447 6.2499999999999991e-11 3970 4436 -1.0416666666666666e-11 3970 3966 4.1666666666666665e-11 3970 4586 -1.0416666666666667e-03 3970 4603 1.0662499999958333e+01 3970 3974 -1.0666666666666666e+01 3970 4594 6.2500000000000003e-03 3970 4592 -1.0416666666666667e-03 3970 3973 4.1666666666666666e-03 3970 4602 -6.2500000000000003e-03 3970 4597 -1.0416666666666667e-03 3970 3971 4.1666666666666666e-03 3970 4598 -1.0658333333333333e+01 3970 3972 -1.0666666666666666e+01 3970 4600 -6.2499999999999991e-11 3970 4888 -1.0416666666666666e-11 3970 3969 4.1666666666666665e-11 3970 4601 1.0666666666583334e+01 3970 3967 -1.0666666666666666e+01 3971 3971 3.2024999999999999e+01 3971 3977 4.1666666666666657e-03 3971 4886 1.0668749999999999e+01 3971 4597 -4.1666666666666666e-03 3971 3972 -1.0668749999999999e+01 3971 4604 5.3312499999999998e+00 3971 4889 4.1666666666666666e-03 3971 4885 5.3312499999999998e+00 3971 3978 -1.0668750000000001e+01 3971 3970 4.1666666666666657e-03 3971 4598 -5.3312499999999998e+00 3971 4602 -1.0668750000000001e+01 3971 708 5.3312499999999998e+00 3971 1011 -4.1666666666666666e-03 3971 1015 5.3312499999999998e+00 3971 293 -1.0668750000000001e+01 3971 1463 4.1666666666666657e-03 3971 1937 -5.3312499999999998e+00 3971 1014 1.0668750000000001e+01 3972 3972 4.2691666666666663e+01 3972 4597 6.2500000000000003e-03 3972 3971 -1.0668749999999999e+01 3972 4592 6.2500000000000003e-03 3972 3973 -1.0668749999999999e+01 3972 4594 -5.3322916666666664e+00 3972 4598 2.1331249999999997e+01 3972 4602 5.3322916666666664e+00 3972 3970 -1.0666666666666666e+01 3972 1937 2.1331249999999997e+01 3972 1463 -1.0666666666666666e+01 3972 1014 -5.3322916666666664e+00 3972 1936 5.3322916666666664e+00 3973 3973 3.2024999999999999e+01 3973 3975 4.1666666666666657e-03 3973 4587 1.0668749999999999e+01 3973 4592 -4.1666666666666666e-03 3973 3972 -1.0668749999999999e+01 3973 4611 -5.3312499999999998e+00 3973 4586 -4.1666666666666666e-03 3973 4603 5.3312499999999998e+00 3973 3974 -1.0668750000000001e+01 3973 3970 4.1666666666666657e-03 3973 4598 -5.3312499999999998e+00 3973 4594 1.0668750000000001e+01 3973 1933 -5.3312499999999998e+00 3973 1930 4.1666666666666666e-03 3973 1926 -5.3312499999999998e+00 3973 1467 -1.0668750000000001e+01 3973 1463 4.1666666666666657e-03 3973 1937 -5.3312499999999998e+00 3973 1936 -1.0668750000000001e+01 3974 3974 4.2679166666791659e+01 3974 4600 5.3333333333229165e+00 3974 4612 -6.2499999999999991e-11 3974 4615 -5.3333333333229165e+00 3974 3969 -1.0666666666687499e+01 3974 4611 2.1332291666656246e+01 3974 3975 -1.0666666666666666e+01 3974 4587 -5.3322916666666664e+00 3974 4586 6.2500000000000003e-03 3974 4603 -2.1332291666656246e+01 3974 4594 -5.3322916666666664e+00 3974 3970 -1.0666666666666666e+01 3974 3973 -1.0668750000000001e+01 3975 3975 5.8683333333895817e+01 3975 4587 6.2500000000000003e-03 3975 3973 4.1666666666666666e-03 3975 4615 6.2499999999999991e-11 3975 3969 4.1666666666666665e-11 3975 4612 1.0416666666666666e-11 3975 4586 -1.0416666666666667e-03 3975 4611 -1.0662499999958333e+01 3975 3974 -1.0666666666666666e+01 3975 1802 5.3333333332812494e+00 3975 1471 1.4583333333333335e-10 3975 1810 -1.0666666666625000e+01 3975 1809 5.3333333332812494e+00 3975 1948 5.3333333333124999e+00 3975 1951 2.6666666665416665e+00 3975 1469 -1.3333333333343749e+01 3975 1930 1.0416666666666667e-03 3975 2074 -1.0416666666666666e-11 3975 1950 1.0666666666531249e+01 3975 1468 -1.6000000000010417e+01 3975 1947 -2.1333333333343749e+01 3975 1466 -1.0666666666614583e+01 3975 1934 -5.3333333333124999e+00 3975 1926 -2.6624999999687495e+00 3975 1467 -8.0000000000000000e+00 3976 3976 4.2666666666895829e+01 3976 4462 2.1333333333333332e+01 3976 3977 -1.6000000000010417e+01 3976 3968 -1.0666666666666666e+01 3976 4461 1.5999999999989583e+01 3976 4437 -5.3333333333229165e+00 3976 4430 6.2500000000000004e-11 3976 4439 -5.3333333333229165e+00 3976 3966 -1.0666666666687499e+01 3976 1811 -2.4233807008389483e-27 3976 1803 2.0194839173657902e-27 3976 1471 -5.3333333333229165e+00 3976 1785 5.3333333333229165e+00 3977 3977 5.8683333333895824e+01 3977 4886 6.2500000000000003e-03 3977 3971 4.1666666666666666e-03 3977 4462 -1.0666666666531249e+01 3977 3976 -1.6000000000010417e+01 3977 4889 1.0416666666666667e-03 3977 4438 -1.0416666666666666e-11 3977 4885 1.0662499999958333e+01 3977 3978 -1.0666666666666666e+01 3977 4439 6.2499999999999991e-11 3977 4430 -1.0416666666666666e-11 3977 3966 4.1666666666666665e-11 3977 706 5.3333333333124999e+00 3977 1011 -1.0416666666666667e-03 3977 708 2.6624999999687500e+00 3977 293 -8.0000000000000000e+00 3977 705 -2.1333333333343749e+01 3977 1470 -1.0666666666614583e+01 3977 700 -5.3333333333124999e+00 3977 1819 -2.6666666665416665e+00 3977 1472 -1.3333333333343749e+01 3977 1804 5.3333333332812494e+00 3977 1471 1.4583333333333332e-10 3977 1811 -1.0666666666625000e+01 3977 1785 -5.3333333332812494e+00 3978 3978 4.2679166666791666e+01 3978 4602 5.3322916666666664e+00 3978 4889 -6.2500000000000003e-03 3978 4886 -5.3322916666666664e+00 3978 3971 -1.0668750000000001e+01 3978 4885 -2.1332291666656250e+01 3978 3977 -1.0666666666666666e+01 3978 4439 -5.3333333333229165e+00 3978 4438 6.2499999999999991e-11 3978 4604 -2.1332291666656250e+01 3978 4447 -5.3333333333229165e+00 3978 3970 -1.0666666666666666e+01 3978 3966 -1.0666666666687499e+01 3979 3979 3.2024999999999999e+01 3979 4646 5.3312499999999998e+00 3979 4624 -4.1666666666666666e-03 3979 4625 1.0668750000000001e+01 3979 4618 -4.1666666666666666e-03 3979 4758 5.3312499999999998e+00 3979 4619 1.0668750000000001e+01 3979 3985 -1.0668750000000001e+01 3979 4616 -4.1666666666666666e-03 3979 4617 1.0668750000000001e+01 3980 3980 2.1345833333333331e+01 3981 3981 2.1350000000166663e+01 3982 3982 3.2000000000249997e+01 3982 4758 5.3333333333124999e+00 3982 4742 -4.1666666666666665e-11 3982 4646 5.3333333333124999e+00 3982 4645 -1.0666666666687499e+01 3982 3985 -1.0666666666687499e+01 3982 4736 -4.1666666666666665e-11 3982 4737 1.0666666666687499e+01 3982 4734 -4.1666666666666665e-11 3982 4735 1.0666666666687499e+01 3983 3983 2.1333333333458331e+01 3984 3984 2.1350000000166663e+01 3985 3985 4.2679166666791659e+01 3985 4735 -5.3333333333229165e+00 3985 4617 -5.3322916666666664e+00 3985 4742 6.2499999999999991e-11 3985 4646 -2.1332291666656250e+01 3985 4645 5.3333333333229165e+00 3985 3982 -1.0666666666687499e+01 3985 4618 6.2500000000000003e-03 3985 4758 -2.1332291666656246e+01 3985 4619 -5.3322916666666664e+00 3985 3979 -1.0668750000000001e+01 3986 3986 2.1345833333333331e+01 3987 3987 1.0683333333333334e+01 3988 3988 2.1333333333458331e+01 3989 3989 1.0666666666833333e+01 3990 3990 3.2024999999999999e+01 3990 4971 -5.3312499999999998e+00 3990 4622 -4.1666666666666666e-03 3990 4641 5.3312499999999998e+00 3990 3995 -1.0668750000000001e+01 3990 4623 1.0668750000000001e+01 3990 4616 -4.1666666666666666e-03 3990 4636 -5.3312499999999998e+00 3990 4628 1.0668750000000001e+01 3990 4620 -4.1666666666666666e-03 3990 4635 -5.3312499999999998e+00 3990 4629 1.0668750000000001e+01 3990 3991 -1.0668750000000001e+01 3990 3014 4.1666666666666657e-03 3991 3991 4.2691666666666663e+01 3991 4637 5.3322916666666664e+00 3991 4634 -6.2500000000000003e-03 3991 4636 2.1331249999999997e+01 3991 4628 -5.3322916666666664e+00 3991 4620 6.2500000000000003e-03 3991 4635 2.1331249999999997e+01 3991 4629 -5.3322916666666664e+00 3991 3990 -1.0668750000000001e+01 3991 3693 -5.3322916666666664e+00 3991 3011 -1.0668750000000001e+01 3991 3014 -1.0666666666666666e+01 3992 3992 2.1366666666666664e+01 3993 3993 2.1345833333333331e+01 3994 3994 3.2024999999999999e+01 3994 4950 -4.1666666666666666e-03 3994 4951 1.0668750000000001e+01 3994 4948 -4.1666666666666666e-03 3994 4641 5.3312499999999998e+00 3994 4640 -1.0668750000000001e+01 3994 4952 -4.1666666666666666e-03 3994 4971 -5.3312499999999998e+00 3994 4956 1.0668750000000001e+01 3994 3995 -1.0668750000000001e+01 3994 3687 -5.3312499999999998e+00 3994 3686 -5.3312499999999998e+00 3994 3018 -1.0668750000000001e+01 3994 3014 4.1666666666666657e-03 3995 3995 4.2691666666666663e+01 3995 4623 -5.3322916666666664e+00 3995 4622 6.2500000000000003e-03 3995 4628 -5.3322916666666664e+00 3995 3990 -1.0668750000000001e+01 3995 4641 -2.1331249999999997e+01 3995 4640 5.3322916666666664e+00 3995 4952 6.2500000000000003e-03 3995 4971 2.1331249999999997e+01 3995 4956 -5.3322916666666664e+00 3995 3994 -1.0668750000000001e+01 3995 3014 -1.0666666666666666e+01 3996 3996 2.1366666666666664e+01 3997 3997 2.1345833333333331e+01 3998 3998 3.2024999999999999e+01 3998 4968 5.3312499999999998e+00 3998 4618 -4.1666666666666666e-03 3998 4646 5.3312499999999998e+00 3998 4011 -1.0668750000000001e+01 3998 4617 1.0668750000000001e+01 3998 4616 -4.1666666666666666e-03 3998 4635 -5.3312499999999998e+00 3998 4629 1.0668750000000001e+01 3998 4620 -4.1666666666666666e-03 3998 4000 4.1666666666666657e-03 3998 4633 -5.3312499999999998e+00 3998 4621 1.0668750000000001e+01 3998 3999 -1.0668750000000001e+01 3999 3999 4.2691666666666663e+01 3999 4966 -5.3322916666666664e+00 3999 4629 -5.3322916666666664e+00 3999 4634 -6.2500000000000003e-03 3999 4635 2.1331249999999997e+01 3999 4637 5.3322916666666664e+00 3999 4001 -1.0668750000000001e+01 3999 4620 6.2500000000000003e-03 3999 4633 2.1331249999999997e+01 3999 4621 -5.3322916666666664e+00 3999 4000 -1.0666666666666666e+01 3999 3998 -1.0668750000000001e+01 4000 4000 4.2700000000333333e+01 4000 4490 -1.0416666666666666e-11 4000 4742 -1.0416666666666666e-11 4000 4748 6.2499999999999991e-11 4000 4738 -1.0416666666666666e-11 4000 4003 4.1666666666666665e-11 4000 4618 -1.0416666666666667e-03 4000 4968 1.0662499999958333e+01 4000 4011 -1.0666666666666666e+01 4000 4523 1.0416666666666667e-03 4000 4525 -1.0662499999958333e+01 4000 4009 -1.0666666666666666e+01 4000 4966 6.2500000000000003e-03 4000 4634 1.0416666666666667e-03 4000 4001 4.1666666666666666e-03 4000 4501 6.2499999999999991e-11 4000 4500 -1.0416666666666666e-11 4000 4006 4.1666666666666665e-11 4000 4967 1.0666666666583334e+01 4000 4004 -1.0666666666666666e+01 4000 4621 6.2500000000000003e-03 4000 4620 -1.0416666666666667e-03 4000 3998 4.1666666666666666e-03 4000 4633 -1.0658333333333333e+01 4000 3999 -1.0666666666666666e+01 4001 4001 3.2024999999999999e+01 4001 4524 -5.3312499999999998e+00 4001 4965 1.0668750000000001e+01 4001 4523 4.1666666666666666e-03 4001 4525 -5.3312499999999998e+00 4001 4009 -1.0668750000000001e+01 4001 4000 4.1666666666666657e-03 4001 4633 -5.3312499999999998e+00 4001 4966 1.0668750000000001e+01 4001 4634 4.1666666666666666e-03 4001 4635 -5.3312499999999998e+00 4001 4637 -1.0668750000000001e+01 4001 3999 -1.0668750000000001e+01 4001 3691 -4.1666666666666666e-03 4002 4002 2.1366666666666664e+01 4003 4003 3.2000000000249997e+01 4003 4646 5.3333333333124999e+00 4003 4742 -4.1666666666666665e-11 4003 4968 5.3333333333124999e+00 4003 4011 -1.0666666666687499e+01 4003 4000 4.1666666666666665e-11 4003 4967 5.3333333333124999e+00 4003 4748 1.0666666666687499e+01 4003 4736 -4.1666666666666665e-11 4003 4645 -1.0666666666687499e+01 4003 4738 -4.1666666666666665e-11 4003 5061 -5.3333333333124999e+00 4003 4739 1.0666666666687499e+01 4003 4004 -1.0666666666687499e+01 4004 4004 4.2666666666916662e+01 4004 4748 -5.3333333333229165e+00 4004 4507 -5.3333333333229165e+00 4004 4500 6.2499999999999991e-11 4004 4967 -2.1333333333312499e+01 4004 4501 -5.3333333333229165e+00 4004 4000 -1.0666666666666666e+01 4004 4006 -1.0666666666687499e+01 4004 4738 6.2500000000000004e-11 4004 5061 2.1333333333312499e+01 4004 4739 -5.3333333333229165e+00 4004 4003 -1.0666666666687499e+01 4005 4005 2.1333333333666662e+01 4006 4006 3.2000000000249997e+01 4006 4525 -5.3333333333124999e+00 4006 4490 -4.1666666666666665e-11 4006 4524 -5.3333333333124999e+00 4006 4009 -1.0666666666687499e+01 4006 4499 1.0666666666687499e+01 4006 4498 -4.1666666666666665e-11 4006 5061 -5.3333333333124999e+00 4006 4507 1.0666666666687499e+01 4006 4500 -4.1666666666666665e-11 4006 4000 4.1666666666666665e-11 4006 4967 5.3333333333124999e+00 4006 4501 1.0666666666687499e+01 4006 4004 -1.0666666666687499e+01 4007 4007 2.1345833333333331e+01 4008 4008 2.1350000000166663e+01 4009 4009 4.2679166666791659e+01 4009 4501 -5.3333333333229165e+00 4009 4490 6.2499999999999991e-11 4009 4499 -5.3333333333229165e+00 4009 4006 -1.0666666666687499e+01 4009 4524 2.1332291666656246e+01 4009 4965 -5.3322916666666664e+00 4009 4523 -6.2500000000000003e-03 4009 4525 2.1332291666656246e+01 4009 4966 -5.3322916666666664e+00 4009 4000 -1.0666666666666666e+01 4009 4001 -1.0668750000000001e+01 4010 4010 2.1350000000166663e+01 4011 4011 4.2679166666791659e+01 4011 4645 5.3333333333229165e+00 4011 4742 6.2499999999999991e-11 4011 4748 -5.3333333333229165e+00 4011 4003 -1.0666666666687499e+01 4011 4968 -2.1332291666656246e+01 4011 4000 -1.0666666666666666e+01 4011 4621 -5.3322916666666664e+00 4011 4618 6.2500000000000003e-03 4011 4646 -2.1332291666656246e+01 4011 4617 -5.3322916666666664e+00 4011 3998 -1.0668750000000001e+01 4012 4012 2.1345833333333331e+01 4013 4013 2.1333333333458331e+01 4014 4014 2.1333333333458331e+01 4015 4015 3.2022916666666660e+01 4015 4018 4.1666666666666657e-03 4015 4595 1.0668749999999999e+01 4015 4588 5.3291666666666666e+00 4015 4650 -5.3312499999999998e+00 4015 4590 -4.1666666666666666e-03 4015 4649 -5.3312499999999998e+00 4015 4596 1.0668750000000001e+01 4015 4016 -1.0668750000000001e+01 4015 2132 -5.3312499999999998e+00 4015 2136 2.8940292364521927e-21 4015 2133 -5.3291666666666666e+00 4015 1254 -1.0670833333333333e+01 4016 4016 4.2691666666666663e+01 4016 4627 -5.3322916666666664e+00 4016 4626 6.2500000000000003e-03 4016 4631 -5.3322916666666664e+00 4016 4023 -1.0668750000000001e+01 4016 4650 2.1331249999999997e+01 4016 4018 -1.0666666666666666e+01 4016 4595 -5.3322916666666664e+00 4016 4590 6.2500000000000003e-03 4016 4649 2.1331249999999997e+01 4016 4596 -5.3322916666666664e+00 4016 4015 -1.0668750000000001e+01 4017 4017 2.1366666666666664e+01 4018 4018 4.2727083333333326e+01 4018 4595 6.2499999999999995e-03 4018 4015 4.1666666666666657e-03 4018 4654 -1.0657291666666666e+01 4018 4021 -1.0666666666666666e+01 4018 4626 -1.0416666666666667e-03 4018 4952 -1.0416666666666667e-03 4018 4631 6.2500000000000003e-03 4018 4622 -1.0416666666666667e-03 4018 4023 4.1666666666666666e-03 4018 4655 1.0658333333333333e+01 4018 4024 -1.0666666666666666e+01 4018 4653 -6.2500000000000003e-03 4018 4946 -1.0416666666666667e-03 4018 4020 4.1666666666666666e-03 4018 4590 -1.0416666666666667e-03 4018 4650 -1.0658333333333333e+01 4018 4016 -1.0666666666666666e+01 4018 2133 1.0416666666666664e-03 4018 1793 5.0116116045879435e-20 4018 2132 -1.0657291666666666e+01 4018 1254 -1.0666666666666666e+01 4019 4019 2.1352083333333333e+01 4020 4020 3.2022916666666667e+01 4020 4972 -5.3312499999999998e+00 4020 4952 -4.1666666666666666e-03 4020 4655 5.3312499999999998e+00 4020 4024 -1.0668750000000001e+01 4020 4953 1.0668750000000001e+01 4020 4018 4.1666666666666657e-03 4020 4654 -5.3312499999999998e+00 4020 4653 -1.0668750000000001e+01 4020 4962 -2.8940292364521927e-21 4020 4955 5.3291666666666666e+00 4020 4946 5.3291666666666666e+00 4020 4021 -1.0670833333333333e+01 4021 4021 4.2710416666666660e+01 4021 4962 5.3322916666666664e+00 4021 4654 1.5998958333333331e+01 4021 4018 -1.0666666666666666e+01 4021 4653 5.3322916666666664e+00 4021 4946 1.0416666666666666e-02 4021 4955 -5.3281250000000000e+00 4021 4020 -1.0670833333333333e+01 4021 2130 5.3281250000000000e+00 4021 1789 -1.4583333333333332e-02 4021 2145 -5.3281250000000000e+00 4021 1255 -1.0672916666666666e+01 4021 2132 -2.1684043449710089e-19 4021 1793 5.3322916666666664e+00 4021 1254 6.2499999999999995e-03 4021 1791 5.3322916666666664e+00 4021 1792 1.0666666666666666e+01 4022 4022 2.1352083333333333e+01 4023 4023 3.2024999999999999e+01 4023 4649 -5.3312499999999998e+00 4023 4626 -4.1666666666666666e-03 4023 4650 -5.3312499999999998e+00 4023 4016 -1.0668750000000001e+01 4023 4627 1.0668750000000001e+01 4023 4624 -4.1666666666666666e-03 4023 4018 4.1666666666666657e-03 4023 4655 5.3312499999999998e+00 4023 4631 1.0668750000000001e+01 4023 4622 -4.1666666666666666e-03 4023 4972 -5.3312499999999998e+00 4023 4632 1.0668750000000001e+01 4023 4024 -1.0668750000000001e+01 4024 4024 4.2691666666666663e+01 4024 4953 -5.3322916666666664e+00 4024 4952 6.2500000000000003e-03 4024 4653 5.3322916666666664e+00 4024 4020 -1.0668750000000001e+01 4024 4655 -2.1331249999999997e+01 4024 4018 -1.0666666666666666e+01 4024 4631 -5.3322916666666664e+00 4024 4622 6.2500000000000003e-03 4024 4972 2.1331249999999997e+01 4024 4632 -5.3322916666666664e+00 4024 4023 -1.0668750000000001e+01 4025 4025 2.1366666666666664e+01 4026 4026 2.1345833333333331e+01 4027 4027 3.2024999999999999e+01 4027 4614 -5.3312499999999998e+00 4027 4586 -4.1666666666666666e-03 4027 4613 -5.3312499999999998e+00 4027 4041 -1.0668750000000001e+01 4027 4589 1.0668750000000001e+01 4027 4588 -4.1666666666666666e-03 4027 4649 -5.3312499999999998e+00 4027 4596 1.0668750000000001e+01 4027 4590 -4.1666666666666666e-03 4027 4029 4.1666666666666657e-03 4027 4648 -5.3312499999999998e+00 4027 4591 1.0668750000000001e+01 4027 4028 -1.0668750000000001e+01 4028 4028 4.2691666666666663e+01 4028 4630 -5.3322916666666664e+00 4028 4596 -5.3322916666666664e+00 4028 4626 6.2500000000000003e-03 4028 4649 2.1331249999999997e+01 4028 4627 -5.3322916666666664e+00 4028 4030 -1.0668750000000001e+01 4028 4590 6.2500000000000003e-03 4028 4648 2.1331249999999997e+01 4028 4591 -5.3322916666666664e+00 4028 4029 -1.0666666666666666e+01 4028 4027 -1.0668750000000001e+01 4029 4029 4.2700000000333333e+01 4029 4742 -1.0416666666666666e-11 4029 4612 1.0416666666666666e-11 4029 4892 6.2499999999999991e-11 4029 4750 1.0416666666666666e-11 4029 4034 4.1666666666666665e-11 4029 4586 -1.0416666666666667e-03 4029 4614 -1.0662499999958333e+01 4029 4041 -1.0666666666666666e+01 4029 4618 -1.0416666666666667e-03 4029 4970 1.0662499999958333e+01 4029 4040 -1.0666666666666666e+01 4029 4630 6.2500000000000003e-03 4029 4626 -1.0416666666666667e-03 4029 4030 4.1666666666666666e-03 4029 4744 6.2499999999999991e-11 4029 4743 -1.0416666666666666e-11 4029 4032 4.1666666666666665e-11 4029 4749 -1.0666666666583334e+01 4029 4033 -1.0666666666666666e+01 4029 4591 6.2500000000000003e-03 4029 4590 -1.0416666666666667e-03 4029 4027 4.1666666666666666e-03 4029 4648 -1.0658333333333333e+01 4029 4028 -1.0666666666666666e+01 4030 4030 3.2024999999999999e+01 4030 4624 -4.1666666666666666e-03 4030 4758 5.3312499999999998e+00 4030 4619 1.0668750000000001e+01 4030 4618 -4.1666666666666666e-03 4030 4970 5.3312499999999998e+00 4030 4040 -1.0668750000000001e+01 4030 4029 4.1666666666666657e-03 4030 4648 -5.3312499999999998e+00 4030 4630 1.0668750000000001e+01 4030 4626 -4.1666666666666666e-03 4030 4649 -5.3312499999999998e+00 4030 4627 1.0668750000000001e+01 4030 4028 -1.0668750000000001e+01 4031 4031 2.1366666666666664e+01 4032 4032 3.2000000000249997e+01 4032 4970 5.3333333333124999e+00 4032 4742 -4.1666666666666665e-11 4032 4758 5.3333333333124999e+00 4032 4040 -1.0666666666687499e+01 4032 4735 1.0666666666687499e+01 4032 4734 -4.1666666666666665e-11 4032 4751 -5.3333333333124999e+00 4032 4745 1.0666666666687499e+01 4032 4743 -4.1666666666666665e-11 4032 4029 4.1666666666666665e-11 4032 4749 -5.3333333333124999e+00 4032 4744 1.0666666666687499e+01 4032 4033 -1.0666666666687499e+01 4033 4033 4.2666666666916662e+01 4033 4892 -5.3333333333229165e+00 4033 4745 -5.3333333333229165e+00 4033 4750 -6.2500000000000004e-11 4033 4751 2.1333333333312499e+01 4033 4752 5.3333333333229165e+00 4033 4034 -1.0666666666687499e+01 4033 4743 6.2500000000000004e-11 4033 4749 2.1333333333312499e+01 4033 4744 -5.3333333333229165e+00 4033 4029 -1.0666666666666666e+01 4033 4032 -1.0666666666687499e+01 4034 4034 3.2000000000249997e+01 4034 4890 -4.1666666666666665e-11 4034 4613 -5.3333333333124999e+00 4034 4657 -1.0666666666687499e+01 4034 4612 4.1666666666666665e-11 4034 4614 -5.3333333333124999e+00 4034 4041 -1.0666666666687499e+01 4034 4029 4.1666666666666665e-11 4034 4749 -5.3333333333124999e+00 4034 4892 1.0666666666687499e+01 4034 4750 4.1666666666666665e-11 4034 4751 -5.3333333333124999e+00 4034 4752 -1.0666666666687499e+01 4034 4033 -1.0666666666687499e+01 4035 4035 2.1333333333666662e+01 4036 4036 2.1345833333333331e+01 4037 4037 2.1350000000166663e+01 4038 4038 2.1333333333458331e+01 4039 4039 2.1350000000166663e+01 4040 4040 4.2679166666791659e+01 4040 4744 -5.3333333333229165e+00 4040 4742 6.2499999999999991e-11 4040 4735 -5.3333333333229165e+00 4040 4032 -1.0666666666687499e+01 4040 4758 -2.1332291666656246e+01 4040 4619 -5.3322916666666664e+00 4040 4618 6.2500000000000003e-03 4040 4970 -2.1332291666656246e+01 4040 4630 -5.3322916666666664e+00 4040 4029 -1.0666666666666666e+01 4040 4030 -1.0668750000000001e+01 4041 4041 4.2679166666791659e+01 4041 4657 5.3333333333229165e+00 4041 4612 -6.2499999999999991e-11 4041 4892 -5.3333333333229165e+00 4041 4034 -1.0666666666687499e+01 4041 4614 2.1332291666656246e+01 4041 4029 -1.0666666666666666e+01 4041 4591 -5.3322916666666664e+00 4041 4586 6.2500000000000003e-03 4041 4613 2.1332291666656246e+01 4041 4589 -5.3322916666666664e+00 4041 4027 -1.0668750000000001e+01 4042 4042 2.1345833333333331e+01 4043 4043 2.1333333333458331e+01 4044 4044 3.2000000000249997e+01 4044 4694 5.3333333333124999e+00 4044 4665 -4.1666666666666665e-11 4044 4666 1.0666666666687499e+01 4044 4661 -4.1666666666666665e-11 4044 4995 -5.3333333333124999e+00 4044 4662 1.0666666666687499e+01 4044 4047 -1.0666666666687499e+01 4044 4659 -4.1666666666666665e-11 4044 4660 1.0666666666687499e+01 4045 4045 2.1333333333458331e+01 4046 4046 2.1350000000166663e+01 4047 4047 5.3358333333458333e+01 4047 4793 -1.0662500000000000e+01 4047 4056 -5.3343749999999996e+00 4047 4789 1.0679166666666665e+01 4047 4787 -5.3302083333333332e+00 4047 4996 1.0662499999999998e+01 4047 4695 5.3322916666666664e+00 4047 4055 -1.0664583333333333e+01 4047 4694 -2.1332291666656250e+01 4047 4660 -5.3333333333229165e+00 4047 4661 6.2500000000000004e-11 4047 4995 3.2001041666656249e+01 4047 4662 -5.3333333333229165e+00 4047 4044 -1.0666666666687499e+01 4048 4048 3.2029166666833333e+01 4049 4049 2.1333333333458331e+01 4050 4050 1.0666666666833333e+01 4051 4051 2.1349999999999998e+01 4051 5073 -5.3322916666666664e+00 4051 4562 -2.0833333333333346e-03 4051 5075 -5.3322916666666664e+00 4051 4055 -1.0672916666666666e+01 4051 4555 5.3343749999999996e+00 4051 4563 5.3343749999999996e+00 4051 4564 1.0672916666666666e+01 4052 4052 3.2024999999999999e+01 4053 4053 2.1362499999999997e+01 4054 4054 4.2704166666666659e+01 4055 4055 5.3383333333333326e+01 4055 4788 -1.0662500000000000e+01 4055 4789 -1.0662500000000000e+01 4055 4787 1.0683333333333334e+01 4055 4056 -1.0672916666666666e+01 4055 4996 -1.5995833333333334e+01 4055 4694 5.3312499999999998e+00 4055 4047 -1.0664583333333333e+01 4055 4695 -1.0668750000000001e+01 4055 4563 -1.0662500000000000e+01 4055 5073 1.5995833333333334e+01 4055 4555 -1.0662500000000000e+01 4055 5075 3.1995833333333334e+01 4055 4562 1.0683333333333334e+01 4055 4051 -1.0672916666666666e+01 4056 4056 2.1349999999999998e+01 4056 4995 -5.3322916666666664e+00 4056 4793 1.0672916666666666e+01 4056 4788 5.3343749999999996e+00 4056 5075 -5.3322916666666664e+00 4056 4787 -2.0833333333333342e-03 4056 4047 -5.3343749999999996e+00 4056 4789 5.3343749999999996e+00 4056 4996 5.3322916666666664e+00 4056 4055 -1.0672916666666666e+01 4057 4057 3.2000000000249997e+01 4057 4690 5.3333333333124999e+00 4057 4776 5.3333333333124999e+00 4057 4669 -4.1666666666666665e-11 4057 4063 4.1666666666666665e-11 4057 4777 5.3333333333124999e+00 4057 4675 1.0666666666687499e+01 4057 4069 -1.0666666666687499e+01 4057 4681 -5.3333333333124999e+00 4057 4667 -4.1666666666666665e-11 4057 4991 5.3333333333124999e+00 4057 4673 1.0666666666687499e+01 4057 4065 -1.0666666666687499e+01 4057 4663 -4.1666666666666665e-11 4057 4059 4.1666666666666665e-11 4057 4680 -5.3333333333124999e+00 4057 4671 1.0666666666687499e+01 4057 4058 -1.0666666666687499e+01 4057 3022 4.1666666666666665e-11 4058 4058 4.2666666666916662e+01 4058 4687 5.3333333333229165e+00 4058 4673 -5.3333333333229165e+00 4058 4678 -6.2499999999999991e-11 4058 4681 2.1333333333312499e+01 4058 4983 -5.3333333333229165e+00 4058 4064 -1.0666666666687499e+01 4058 4663 6.2500000000000004e-11 4058 4680 2.1333333333312499e+01 4058 4671 -5.3333333333229165e+00 4058 4059 -1.0666666666666666e+01 4058 4057 -1.0666666666687499e+01 4058 3022 -1.0666666666666666e+01 4059 4059 4.2666666667333331e+01 4059 4707 1.0416666666666666e-11 4059 4669 -1.0416666666666666e-11 4059 4689 -6.2499999999999991e-11 4059 5013 1.0416666666666666e-11 4059 4070 4.1666666666666665e-11 4059 4690 1.0666666666583334e+01 4059 4069 -1.0666666666666666e+01 4059 4678 1.0416666666666666e-11 4059 4699 -1.0416666666666666e-11 4059 4687 -6.2499999999999991e-11 4059 4985 -1.0416666666666666e-11 4059 4064 4.1666666666666665e-11 4059 4688 1.0666666666583334e+01 4059 4066 -1.0666666666666666e+01 4059 4685 -6.2499999999999991e-11 4059 4701 -1.0416666666666666e-11 4059 4060 4.1666666666666665e-11 4059 4686 1.0666666666583334e+01 4059 4061 -1.0666666666666666e+01 4059 4671 6.2499999999999991e-11 4059 4663 -1.0416666666666666e-11 4059 4057 4.1666666666666665e-11 4059 4680 -1.0666666666583334e+01 4059 4058 -1.0666666666666666e+01 4060 4060 3.2000000000249997e+01 4060 4071 4.1666666666666665e-11 4060 4706 1.0666666666687499e+01 4060 4699 -4.1666666666666665e-11 4060 4068 4.1666666666666665e-11 4060 4066 -1.0666666666687499e+01 4060 4710 -5.3333333333124999e+00 4060 4688 5.3333333333124999e+00 4060 4701 -4.1666666666666665e-11 4060 4059 4.1666666666666665e-11 4060 4686 5.3333333333124999e+00 4060 4685 -1.0666666666687499e+01 4060 4061 -1.0666666666687499e+01 4060 2321 -5.3333333333124999e+00 4060 1979 -4.1666666666666665e-11 4060 1992 5.3333333333124999e+00 4060 1523 -1.0666666666687499e+01 4060 1986 -5.3333333333124999e+00 4060 1982 1.0666666666687499e+01 4061 4061 4.2666666666916662e+01 4061 4706 -5.3333333333229165e+00 4061 4710 2.1333333333312499e+01 4061 5027 -5.3333333333229165e+00 4061 4071 -1.0666666666666666e+01 4061 4707 -6.2499999999999991e-11 4061 4689 5.3333333333229165e+00 4061 4070 -1.0666666666687499e+01 4061 4701 6.2500000000000004e-11 4061 4686 -2.1333333333312499e+01 4061 4685 5.3333333333229165e+00 4061 4059 -1.0666666666666666e+01 4061 4060 -1.0666666666687499e+01 4062 4062 4.2666666666895829e+01 4062 4774 7.2691577219103583e-29 4062 4779 2.0194839173657902e-27 4062 4772 5.3333333333229165e+00 4062 4072 -5.3333333333229165e+00 4062 4770 1.5999999999989583e+01 4062 4063 -1.0666666666666666e+01 4062 4766 -5.3333333333229165e+00 4062 4760 6.2500000000000004e-11 4062 4771 2.1333333333333332e+01 4062 3704 -5.3333333333229165e+00 4062 441 -1.6000000000010417e+01 4062 3021 -1.0666666666687499e+01 4063 4063 4.2666666667270825e+01 4063 5024 -1.0416666666666665e-11 4063 4772 3.6295685768920020e-28 4063 4779 1.0666666666572915e+01 4063 4072 -1.0666666666666666e+01 4063 4667 -1.0416666666666666e-11 4063 4778 -6.2499999999999991e-11 4063 5013 1.0416666666666666e-11 4063 4070 4.1666666666666665e-11 4063 4675 6.2499999999999991e-11 4063 4669 -1.0416666666666666e-11 4063 4057 4.1666666666666665e-11 4063 4777 1.0666666666583334e+01 4063 4069 -1.0666666666666666e+01 4063 4761 -1.0416666666666666e-11 4063 4776 1.0666666666583334e+01 4063 4065 -1.0666666666666666e+01 4063 4766 6.2499999999999991e-11 4063 4760 -1.0416666666666666e-11 4063 4770 -1.0666666666572917e+01 4063 4062 -1.0666666666666666e+01 4063 3021 4.1666666666666665e-11 4064 4064 3.2000000000249997e+01 4064 4068 4.1666666666666665e-11 4064 4985 -4.1666666666666665e-11 4064 4066 -1.0666666666687499e+01 4064 4987 1.0666666666687499e+01 4064 5007 -5.3333333333124999e+00 4064 4981 -4.1666666666666665e-11 4064 4992 5.3333333333124999e+00 4064 4067 -1.0666666666687499e+01 4064 4680 -5.3333333333124999e+00 4064 4059 4.1666666666666665e-11 4064 4688 5.3333333333124999e+00 4064 4687 -1.0666666666687499e+01 4064 4678 4.1666666666666665e-11 4064 4681 -5.3333333333124999e+00 4064 4983 1.0666666666687499e+01 4064 4058 -1.0666666666687499e+01 4064 1986 -5.3333333333124999e+00 4064 3022 4.1666666666666665e-11 4065 4065 4.2666666666916662e+01 4065 4675 -5.3333333333229165e+00 4065 4776 -2.1333333333312499e+01 4065 4766 -5.3333333333229165e+00 4065 4063 -1.0666666666666666e+01 4065 4761 6.2499999999999991e-11 4065 4767 -5.3333333333229165e+00 4065 4667 6.2499999999999991e-11 4065 4991 -2.1333333333312499e+01 4065 4673 -5.3333333333229165e+00 4065 4057 -1.0666666666687499e+01 4065 3021 -1.0666666666687499e+01 4065 3022 -1.0666666666666666e+01 4066 4066 4.2666666666916662e+01 4066 4985 6.2500000000000004e-11 4066 4987 -5.3333333333229165e+00 4066 4064 -1.0666666666687499e+01 4066 4699 6.2500000000000004e-11 4066 4068 -1.0666666666666666e+01 4066 4060 -1.0666666666687499e+01 4066 4685 5.3333333333229165e+00 4066 4688 -2.1333333333312499e+01 4066 4687 5.3333333333229165e+00 4066 4059 -1.0666666666666666e+01 4066 1986 2.1333333333312499e+01 4066 1982 -5.3333333333229165e+00 4067 4067 4.2666666666916662e+01 4067 5005 -5.3333333333229165e+00 4067 5007 2.1333333333312499e+01 4067 4987 -5.3333333333229165e+00 4067 4068 -1.0666666666666666e+01 4067 4981 6.2499999999999991e-11 4067 4983 -5.3333333333229165e+00 4067 4064 -1.0666666666687499e+01 4067 5002 6.2499999999999991e-11 4067 4992 -2.1333333333312499e+01 4067 3700 -5.3333333333229165e+00 4067 3022 -1.0666666666666666e+01 4067 442 -1.0666666666687499e+01 4068 4068 4.2666666667333331e+01 4068 5005 6.2499999999999991e-11 4068 4987 6.2499999999999991e-11 4068 4985 -1.0416666666666666e-11 4068 4064 4.1666666666666665e-11 4068 4699 -1.0416666666666666e-11 4068 4060 4.1666666666666665e-11 4068 4066 -1.0666666666666666e+01 4068 5002 -1.0416666666666666e-11 4068 4981 -1.0416666666666666e-11 4068 5007 -1.0666666666583334e+01 4068 4067 -1.0666666666666666e+01 4068 816 1.0416666666666666e-11 4068 442 4.1666666666666665e-11 4068 1993 -1.0666666666583334e+01 4068 1524 -1.0666666666666666e+01 4068 2315 -1.0416666666666666e-11 4068 1979 -1.0416666666666666e-11 4068 1991 -6.2499999999999991e-11 4068 2316 -1.0416666666666666e-11 4068 1522 4.1666666666666665e-11 4068 1992 1.0666666666583334e+01 4068 1523 -1.0666666666666666e+01 4068 1982 6.2499999999999991e-11 4068 1986 -1.0666666666583334e+01 4069 4069 4.2666666666916662e+01 4069 4671 -5.3333333333229165e+00 4069 4690 -2.1333333333312499e+01 4069 4689 5.3333333333229165e+00 4069 4059 -1.0666666666666666e+01 4069 5013 -6.2500000000000004e-11 4069 4778 5.3333333333229165e+00 4069 4070 -1.0666666666687499e+01 4069 4669 6.2500000000000004e-11 4069 4777 -2.1333333333312499e+01 4069 4675 -5.3333333333229165e+00 4069 4063 -1.0666666666666666e+01 4069 4057 -1.0666666666687499e+01 4070 4070 3.2000000000249997e+01 4070 4779 5.3333333333124999e+00 4070 5024 -4.1666666666666665e-11 4070 5041 -5.3333333333124999e+00 4070 4072 -1.0666666666687499e+01 4070 4071 4.1666666666666665e-11 4070 4710 -5.3333333333124999e+00 4070 5027 1.0666666666687499e+01 4070 4707 4.1666666666666665e-11 4070 4686 5.3333333333124999e+00 4070 4061 -1.0666666666687499e+01 4070 4059 4.1666666666666665e-11 4070 4690 5.3333333333124999e+00 4070 4689 -1.0666666666687499e+01 4070 4063 4.1666666666666665e-11 4070 5013 4.1666666666666665e-11 4070 4777 5.3333333333124999e+00 4070 4069 -1.0666666666687499e+01 4070 4778 -1.0666666666687499e+01 4071 4071 4.2666666667270825e+01 4071 5059 -1.0666666666572915e+01 4071 4073 -1.0666666666666666e+01 4071 4706 6.2499999999999991e-11 4071 4060 4.1666666666666665e-11 4071 5040 -2.2851328271989659e-27 4071 5024 -1.0416666666666666e-11 4071 5041 -1.0666666666572917e+01 4071 4072 -1.0666666666666666e+01 4071 4701 -1.0416666666666666e-11 4071 5027 6.2499999999999991e-11 4071 4707 1.0416666666666666e-11 4071 4070 4.1666666666666665e-11 4071 4710 -1.0666666666583334e+01 4071 4061 -1.0666666666666666e+01 4071 2319 6.2499999999999991e-11 4071 813 -1.0416666666666666e-11 4071 1522 4.1666666666666665e-11 4071 2316 -1.0416666666666666e-11 4071 1979 -1.0416666666666666e-11 4071 2321 -1.0666666666583334e+01 4071 1523 -1.0666666666666666e+01 4072 4072 4.2666666667041660e+01 4072 4778 5.3333333333229165e+00 4072 4771 -5.3333333332812494e+00 4072 4770 -2.0194839173657902e-27 4072 4772 6.2500000000000004e-11 4072 4062 -5.3333333333229165e+00 4072 4779 -1.5999999999989583e+01 4072 4063 -1.0666666666666666e+01 4072 5059 2.0194839173657902e-27 4072 5040 -6.2500000000000004e-11 4072 4775 -5.3333333332812494e+00 4072 4774 -1.0666666666729165e+01 4072 4073 -5.3333333333229165e+00 4072 5024 6.2499999999999991e-11 4072 5027 -5.3333333333229165e+00 4072 5041 1.5999999999989583e+01 4072 4071 -1.0666666666666666e+01 4072 4070 -1.0666666666687499e+01 4072 441 1.4583333333333335e-10 4073 4073 4.2666666666895829e+01 4073 4775 2.1333333333333332e+01 4073 5059 1.5999999999989583e+01 4073 4071 -1.0666666666666666e+01 4073 5041 -2.2470898404921788e-28 4073 4774 2.0194839173657902e-27 4073 5040 -5.3333333333229165e+00 4073 4072 -5.3333333333229165e+00 4073 441 -1.6000000000010417e+01 4073 814 -5.3333333333229165e+00 4073 813 6.2499999999999991e-11 4073 2319 -5.3333333333229165e+00 4073 1522 -1.0666666666687499e+01 4074 4074 3.2000000000249997e+01 4074 5015 -5.3333333333124999e+00 4074 4669 -4.1666666666666665e-11 4074 4690 5.3333333333124999e+00 4074 4088 -1.0666666666687499e+01 4074 4670 1.0666666666687499e+01 4074 4659 -4.1666666666666665e-11 4074 4077 4.1666666666666665e-11 4074 4680 -5.3333333333124999e+00 4074 4671 1.0666666666687499e+01 4074 4663 -4.1666666666666665e-11 4074 4679 -5.3333333333124999e+00 4074 4672 1.0666666666687499e+01 4074 4075 -1.0666666666687499e+01 4075 4075 4.2666666666916662e+01 4075 4682 5.3333333333229165e+00 4075 4678 -6.2500000000000004e-11 4075 4687 5.3333333333229165e+00 4075 4083 -1.0666666666687499e+01 4075 4680 2.1333333333312499e+01 4075 4077 -1.0666666666666666e+01 4075 4671 -5.3333333333229165e+00 4075 4663 6.2499999999999991e-11 4075 4679 2.1333333333312499e+01 4075 4672 -5.3333333333229165e+00 4075 4074 -1.0666666666687499e+01 4076 4076 2.1333333333666662e+01 4077 4077 4.2666666667333331e+01 4077 4707 1.0416666666666666e-11 4077 4669 -1.0416666666666666e-11 4077 4689 -6.2499999999999991e-11 4077 5013 1.0416666666666666e-11 4077 4087 4.1666666666666665e-11 4077 4690 1.0666666666583334e+01 4077 4088 -1.0666666666666666e+01 4077 4678 1.0416666666666666e-11 4077 4699 -1.0416666666666666e-11 4077 4687 -6.2499999999999991e-11 4077 4985 -1.0416666666666666e-11 4077 4083 4.1666666666666665e-11 4077 4688 1.0666666666583334e+01 4077 4084 -1.0666666666666666e+01 4077 4685 -6.2499999999999991e-11 4077 4701 -1.0416666666666666e-11 4077 4079 4.1666666666666665e-11 4077 4686 1.0666666666583334e+01 4077 4080 -1.0666666666666666e+01 4077 4671 6.2499999999999991e-11 4077 4663 -1.0416666666666666e-11 4077 4074 4.1666666666666665e-11 4077 4680 -1.0666666666583334e+01 4077 4075 -1.0666666666666666e+01 4078 4078 2.1333333333458331e+01 4079 4079 3.2000000000249997e+01 4079 4999 -5.3333333333124999e+00 4079 4699 -4.1666666666666665e-11 4079 4688 5.3333333333124999e+00 4079 4084 -1.0666666666687499e+01 4079 4700 1.0666666666687499e+01 4079 4697 -4.1666666666666665e-11 4079 4077 4.1666666666666665e-11 4079 4686 5.3333333333124999e+00 4079 4685 -1.0666666666687499e+01 4079 4701 -4.1666666666666665e-11 4079 4708 -5.3333333333124999e+00 4079 4703 1.0666666666687499e+01 4079 4080 -1.0666666666687499e+01 4080 4080 4.2666666666916662e+01 4080 4711 5.3333333333229165e+00 4080 4707 -6.2500000000000004e-11 4080 4689 5.3333333333229165e+00 4080 4087 -1.0666666666687499e+01 4080 4686 -2.1333333333312499e+01 4080 4077 -1.0666666666666666e+01 4080 4685 5.3333333333229165e+00 4080 4701 6.2499999999999991e-11 4080 4708 2.1333333333312499e+01 4080 4703 -5.3333333333229165e+00 4080 4079 -1.0666666666687499e+01 4081 4081 2.1333333333666662e+01 4082 4082 2.1333333333458331e+01 4083 4083 3.2000000000249997e+01 4083 4679 -5.3333333333124999e+00 4083 4678 4.1666666666666665e-11 4083 4680 -5.3333333333124999e+00 4083 4075 -1.0666666666687499e+01 4083 4682 -1.0666666666687499e+01 4083 4979 -4.1666666666666665e-11 4083 4077 4.1666666666666665e-11 4083 4688 5.3333333333124999e+00 4083 4687 -1.0666666666687499e+01 4083 4985 -4.1666666666666665e-11 4083 4999 -5.3333333333124999e+00 4083 4986 1.0666666666687499e+01 4083 4084 -1.0666666666687499e+01 4084 4084 4.2666666666916662e+01 4084 4700 -5.3333333333229165e+00 4084 4699 6.2500000000000004e-11 4084 4685 5.3333333333229165e+00 4084 4079 -1.0666666666687499e+01 4084 4688 -2.1333333333312499e+01 4084 4077 -1.0666666666666666e+01 4084 4687 5.3333333333229165e+00 4084 4985 6.2500000000000004e-11 4084 4999 2.1333333333312499e+01 4084 4986 -5.3333333333229165e+00 4084 4083 -1.0666666666687499e+01 4085 4085 2.1333333333666662e+01 4086 4086 2.1333333333458331e+01 4087 4087 3.2000000000249997e+01 4087 4708 -5.3333333333124999e+00 4087 4707 4.1666666666666665e-11 4087 4686 5.3333333333124999e+00 4087 4080 -1.0666666666687499e+01 4087 4711 -1.0666666666687499e+01 4087 5020 -4.1666666666666665e-11 4087 4077 4.1666666666666665e-11 4087 4690 5.3333333333124999e+00 4087 4689 -1.0666666666687499e+01 4087 5013 4.1666666666666665e-11 4087 5015 -5.3333333333124999e+00 4087 5026 1.0666666666687499e+01 4087 4088 -1.0666666666687499e+01 4088 4088 4.2666666666916662e+01 4088 4670 -5.3333333333229165e+00 4088 4669 6.2500000000000004e-11 4088 4671 -5.3333333333229165e+00 4088 4074 -1.0666666666687499e+01 4088 4690 -2.1333333333312499e+01 4088 4077 -1.0666666666666666e+01 4088 4689 5.3333333333229165e+00 4088 5013 -6.2500000000000004e-11 4088 5015 2.1333333333312499e+01 4088 5026 -5.3333333333229165e+00 4088 4087 -1.0666666666687499e+01 4089 4089 2.1333333333666662e+01 4090 4090 2.1333333333458331e+01 4091 4091 3.2000000000249997e+01 4091 4990 5.3333333333124999e+00 4091 4661 -4.1666666666666665e-11 4091 4694 5.3333333333124999e+00 4091 4102 -1.0666666666687499e+01 4091 4660 1.0666666666687499e+01 4091 4659 -4.1666666666666665e-11 4091 4679 -5.3333333333124999e+00 4091 4672 1.0666666666687499e+01 4091 4663 -4.1666666666666665e-11 4091 4093 4.1666666666666665e-11 4091 4677 -5.3333333333124999e+00 4091 4664 1.0666666666687499e+01 4091 4092 -1.0666666666687499e+01 4092 4092 4.2666666666916662e+01 4092 4984 -5.3333333333229165e+00 4092 4672 -5.3333333333229165e+00 4092 4678 -6.2499999999999991e-11 4092 4679 2.1333333333312499e+01 4092 4682 5.3333333333229165e+00 4092 4094 -1.0666666666687499e+01 4092 4663 6.2500000000000004e-11 4092 4677 2.1333333333312499e+01 4092 4664 -5.3333333333229165e+00 4092 4093 -1.0666666666666666e+01 4092 4091 -1.0666666666687499e+01 4093 4093 4.2693750000333324e+01 4093 4912 -2.1705219273391446e-19 4093 4996 1.0416666666666667e-03 4093 4661 -1.0416666666666666e-11 4093 4990 1.0662499999958333e+01 4093 4102 -1.0666666666666666e+01 4093 4914 1.0416666666666666e-11 4093 4917 -1.0661458333291666e+01 4093 4100 -1.0666666666666666e+01 4093 4984 6.2499999999999991e-11 4093 4678 1.0416666666666666e-11 4093 4094 4.1666666666666665e-11 4093 4989 -6.2499999999999995e-03 4093 4910 1.0416666666666667e-03 4093 4097 4.1666666666666666e-03 4093 4911 -1.0657291666666666e+01 4093 4096 -1.0666666666666666e+01 4093 4664 6.2499999999999991e-11 4093 4663 -1.0416666666666666e-11 4093 4091 4.1666666666666665e-11 4093 4677 -1.0666666666583334e+01 4093 4092 -1.0666666666666666e+01 4094 4094 3.2000000000249997e+01 4094 4979 -4.1666666666666665e-11 4094 4915 -5.3333333333124999e+00 4094 4978 1.0666666666687499e+01 4094 4914 4.1666666666666665e-11 4094 4917 -5.3333333333124999e+00 4094 4100 -1.0666666666687499e+01 4094 4093 4.1666666666666665e-11 4094 4677 -5.3333333333124999e+00 4094 4984 1.0666666666687499e+01 4094 4678 4.1666666666666665e-11 4094 4679 -5.3333333333124999e+00 4094 4682 -1.0666666666687499e+01 4094 4092 -1.0666666666687499e+01 4095 4095 2.1333333333666662e+01 4096 4096 4.2704166666666673e+01 4096 4917 2.1684043449710089e-19 4096 4912 -6.2499999999999986e-03 4096 4915 -5.3281250000000000e+00 4096 4100 -5.3322916666666664e+00 4096 4909 1.0672916666666666e+01 4096 4908 -6.2500000000000003e-03 4096 5074 -5.3322916666666664e+00 4096 4913 1.5998958333333331e+01 4096 4910 -6.2499999999999995e-03 4096 4989 5.3322916666666664e+00 4096 4911 1.5998958333333331e+01 4096 4093 -1.0666666666666666e+01 4096 4097 -1.0668750000000001e+01 4097 4097 3.2024999999999999e+01 4097 4694 5.3312499999999998e+00 4097 4996 4.1666666666666666e-03 4097 4990 5.3312499999999998e+00 4097 4102 -1.0668750000000001e+01 4097 5073 -4.1666666666666666e-03 4097 4695 -1.0668750000000001e+01 4097 5074 1.0668750000000001e+01 4097 4913 -5.3312499999999998e+00 4097 4910 4.1666666666666675e-03 4097 4093 4.1666666666666657e-03 4097 4989 -1.0668750000000001e+01 4097 4911 -5.3312499999999998e+00 4097 4096 -1.0668750000000001e+01 4098 4098 2.1333333333458331e+01 4099 4099 2.1350000000166663e+01 4100 4100 4.2677083333458334e+01 4100 4911 3.2249014814734037e-20 4100 4909 -2.1684043449710089e-19 4100 4912 -5.3322916666666664e+00 4100 4096 -5.3322916666666664e+00 4100 4915 2.1334374999989581e+01 4100 4978 -5.3333333333229165e+00 4100 4914 -6.2500000000000004e-11 4100 4917 1.5999999999989583e+01 4100 4984 -5.3333333333229165e+00 4100 4093 -1.0666666666666666e+01 4100 4094 -1.0666666666687499e+01 4101 4101 3.2029166666833333e+01 4102 4102 4.2679166666791666e+01 4102 4695 5.3322916666666664e+00 4102 4996 -6.2500000000000003e-03 4102 4989 5.3322916666666664e+00 4102 4097 -1.0668750000000001e+01 4102 4990 -2.1332291666656250e+01 4102 4093 -1.0666666666666666e+01 4102 4664 -5.3333333333229165e+00 4102 4661 6.2500000000000004e-11 4102 4694 -2.1332291666656250e+01 4102 4660 -5.3333333333229165e+00 4102 4091 -1.0666666666687499e+01 4103 4103 2.1333333333458331e+01 4104 4104 2.1360416666666666e+01 4105 4105 2.1343750000000000e+01 4106 4106 2.1345833333333331e+01 4107 4107 3.2000000000249997e+01 4107 4705 -4.1666666666666665e-11 4107 4704 1.0666666666687499e+01 4107 4697 -4.1666666666666665e-11 4107 4698 1.0666666666687499e+01 4107 1997 -5.3333333333124999e+00 4107 1981 1.0666666666687499e+01 4107 1978 -4.1666666666666665e-11 4107 1994 -5.3333333333124999e+00 4107 1515 -1.0666666666687499e+01 4108 4108 2.1333333333458331e+01 4109 4109 1.0666666666833333e+01 4110 4110 3.2000000000458328e+01 4111 4111 2.1333333333458331e+01 4112 4112 3.2000000000249997e+01 4112 5022 -4.1666666666666665e-11 4112 4709 -5.3333333333124999e+00 4112 5028 1.0666666666687499e+01 4112 5020 -4.1666666666666665e-11 4112 5023 1.0666666666687499e+01 4112 4707 4.1666666666666665e-11 4112 4708 -5.3333333333124999e+00 4112 4711 -1.0666666666687499e+01 4112 4113 -1.0666666666687499e+01 4113 4113 4.2666666666916662e+01 4113 5028 -5.3333333333229165e+00 4113 4703 -5.3333333333229165e+00 4113 4701 6.2500000000000004e-11 4113 4709 2.1333333333312499e+01 4113 4702 -5.3333333333229165e+00 4113 4115 -1.0666666666687499e+01 4113 4707 -6.2499999999999991e-11 4113 4708 2.1333333333312499e+01 4113 4711 5.3333333333229165e+00 4113 4112 -1.0666666666687499e+01 4114 4114 2.1333333333666662e+01 4115 4115 3.2000000000249997e+01 4115 4705 -4.1666666666666665e-11 4115 4698 1.0666666666687499e+01 4115 4697 -4.1666666666666665e-11 4115 4708 -5.3333333333124999e+00 4115 4703 1.0666666666687499e+01 4115 4701 -4.1666666666666665e-11 4115 4709 -5.3333333333124999e+00 4115 4702 1.0666666666687499e+01 4115 4113 -1.0666666666687499e+01 4116 4116 2.1333333333666662e+01 4117 4117 2.1333333333458331e+01 4118 4118 1.0666666666833333e+01 4119 4119 2.1333333333458331e+01 4120 4120 1.0666666666833333e+01 4121 4121 2.1333333333458331e+01 4122 4122 2.1333333333458331e+01 4123 4123 3.2000000000249997e+01 4123 5069 -5.3333333333124999e+00 4123 4475 -4.1666666666666665e-11 4123 4730 5.3333333333124999e+00 4123 4137 -1.0666666666687499e+01 4123 4476 1.0666666666687499e+01 4123 4471 -4.1666666666666665e-11 4123 4126 4.1666666666666665e-11 4123 4721 -5.3333333333124999e+00 4123 4479 1.0666666666687499e+01 4123 4473 -4.1666666666666665e-11 4123 4720 -5.3333333333124999e+00 4123 4480 1.0666666666687499e+01 4123 4124 -1.0666666666687499e+01 4124 4124 4.2666666666916662e+01 4124 4722 5.3333333333229165e+00 4124 4719 -6.2500000000000004e-11 4124 4727 5.3333333333229165e+00 4124 4132 -1.0666666666687499e+01 4124 4721 2.1333333333312499e+01 4124 4126 -1.0666666666666666e+01 4124 4479 -5.3333333333229165e+00 4124 4473 6.2500000000000004e-11 4124 4720 2.1333333333312499e+01 4124 4480 -5.3333333333229165e+00 4124 4123 -1.0666666666687499e+01 4125 4125 2.1333333333666662e+01 4126 4126 4.2666666667333331e+01 4126 4750 1.0416666666666666e-11 4126 4475 -1.0416666666666666e-11 4126 4729 -6.2499999999999991e-11 4126 4893 -1.0416666666666666e-11 4126 4136 4.1666666666666665e-11 4126 4730 1.0666666666583334e+01 4126 4137 -1.0666666666666666e+01 4126 4719 1.0416666666666666e-11 4126 4740 -1.0416666666666666e-11 4126 4727 -6.2499999999999991e-11 4126 4805 -1.0416666666666666e-11 4126 4132 4.1666666666666665e-11 4126 4728 1.0666666666583334e+01 4126 4133 -1.0666666666666666e+01 4126 4725 -6.2499999999999991e-11 4126 4743 -1.0416666666666666e-11 4126 4128 4.1666666666666665e-11 4126 4726 1.0666666666583334e+01 4126 4129 -1.0666666666666666e+01 4126 4479 6.2499999999999991e-11 4126 4473 -1.0416666666666666e-11 4126 4123 4.1666666666666665e-11 4126 4721 -1.0666666666583334e+01 4126 4124 -1.0666666666666666e+01 4127 4127 2.1333333333458331e+01 4128 4128 3.2000000000249997e+01 4128 5064 -5.3333333333124999e+00 4128 4740 -4.1666666666666665e-11 4128 4728 5.3333333333124999e+00 4128 4133 -1.0666666666687499e+01 4128 4741 1.0666666666687499e+01 4128 4734 -4.1666666666666665e-11 4128 4126 4.1666666666666665e-11 4128 4726 5.3333333333124999e+00 4128 4725 -1.0666666666687499e+01 4128 4743 -4.1666666666666665e-11 4128 4751 -5.3333333333124999e+00 4128 4745 1.0666666666687499e+01 4128 4129 -1.0666666666687499e+01 4129 4129 4.2666666666916662e+01 4129 4752 5.3333333333229165e+00 4129 4750 -6.2500000000000004e-11 4129 4729 5.3333333333229165e+00 4129 4136 -1.0666666666687499e+01 4129 4726 -2.1333333333312499e+01 4129 4126 -1.0666666666666666e+01 4129 4725 5.3333333333229165e+00 4129 4743 6.2500000000000004e-11 4129 4751 2.1333333333312499e+01 4129 4745 -5.3333333333229165e+00 4129 4128 -1.0666666666687499e+01 4130 4130 2.1333333333666662e+01 4131 4131 2.1333333333458331e+01 4132 4132 3.2000000000249997e+01 4132 4720 -5.3333333333124999e+00 4132 4719 4.1666666666666665e-11 4132 4721 -5.3333333333124999e+00 4132 4124 -1.0666666666687499e+01 4132 4722 -1.0666666666687499e+01 4132 4807 -4.1666666666666665e-11 4132 4126 4.1666666666666665e-11 4132 4728 5.3333333333124999e+00 4132 4727 -1.0666666666687499e+01 4132 4805 -4.1666666666666665e-11 4132 5064 -5.3333333333124999e+00 4132 4812 1.0666666666687499e+01 4132 4133 -1.0666666666687499e+01 4133 4133 4.2666666666916662e+01 4133 4741 -5.3333333333229165e+00 4133 4740 6.2499999999999991e-11 4133 4725 5.3333333333229165e+00 4133 4128 -1.0666666666687499e+01 4133 4728 -2.1333333333312499e+01 4133 4126 -1.0666666666666666e+01 4133 4727 5.3333333333229165e+00 4133 4805 6.2499999999999991e-11 4133 5064 2.1333333333312499e+01 4133 4812 -5.3333333333229165e+00 4133 4132 -1.0666666666687499e+01 4134 4134 2.1333333333666662e+01 4135 4135 2.1333333333458331e+01 4136 4136 3.2000000000249997e+01 4136 4751 -5.3333333333124999e+00 4136 4750 4.1666666666666665e-11 4136 4726 5.3333333333124999e+00 4136 4129 -1.0666666666687499e+01 4136 4752 -1.0666666666687499e+01 4136 4890 -4.1666666666666665e-11 4136 4126 4.1666666666666665e-11 4136 4730 5.3333333333124999e+00 4136 4729 -1.0666666666687499e+01 4136 4893 -4.1666666666666665e-11 4136 5069 -5.3333333333124999e+00 4136 4894 1.0666666666687499e+01 4136 4137 -1.0666666666687499e+01 4137 4137 4.2666666666916662e+01 4137 4476 -5.3333333333229165e+00 4137 4475 6.2499999999999991e-11 4137 4479 -5.3333333333229165e+00 4137 4123 -1.0666666666687499e+01 4137 4730 -2.1333333333312499e+01 4137 4126 -1.0666666666666666e+01 4137 4729 5.3333333333229165e+00 4137 4893 6.2499999999999991e-11 4137 5069 2.1333333333312499e+01 4137 4894 -5.3333333333229165e+00 4137 4136 -1.0666666666687499e+01 4138 4138 2.1333333333666662e+01 4139 4139 2.1333333333458331e+01 4140 4140 3.2000000000249997e+01 4140 4469 -4.1666666666666665e-11 4140 4472 1.0666666666687499e+01 4140 4471 -4.1666666666666665e-11 4140 4720 -5.3333333333124999e+00 4140 4480 1.0666666666687499e+01 4140 4473 -4.1666666666666665e-11 4140 4718 -5.3333333333124999e+00 4140 4474 1.0666666666687499e+01 4140 4141 -1.0666666666687499e+01 4141 4141 4.2666666666916662e+01 4141 4811 -5.3333333333229165e+00 4141 4480 -5.3333333333229165e+00 4141 4719 -6.2500000000000004e-11 4141 4720 2.1333333333312499e+01 4141 4722 5.3333333333229165e+00 4141 4143 -1.0666666666687499e+01 4141 4473 6.2500000000000004e-11 4141 4718 2.1333333333312499e+01 4141 4474 -5.3333333333229165e+00 4141 4140 -1.0666666666687499e+01 4142 4142 2.1333333333666662e+01 4143 4143 3.2000000000249997e+01 4143 4807 -4.1666666666666665e-11 4143 4804 1.0666666666687499e+01 4143 4803 -4.1666666666666665e-11 4143 4718 -5.3333333333124999e+00 4143 4811 1.0666666666687499e+01 4143 4719 4.1666666666666665e-11 4143 4720 -5.3333333333124999e+00 4143 4722 -1.0666666666687499e+01 4143 4141 -1.0666666666687499e+01 4144 4144 2.1333333333666662e+01 4145 4145 2.1333333333458331e+01 4146 4146 1.0666666666833333e+01 4147 4147 2.1333333333458331e+01 4148 4148 1.0666666666833333e+01 4149 4149 2.1333333333458331e+01 4150 4150 2.1333333333458331e+01 4151 4151 3.2029166666833333e+01 4152 4152 2.1349999999999998e+01 4152 4786 -2.0833333333333342e-03 4152 4782 5.3343749999999996e+00 4152 4791 5.3343749999999996e+00 4152 4794 -5.3322916666666664e+00 4152 4792 1.0672916666666666e+01 4152 3635 -5.3322916666666664e+00 4152 3630 -5.3322916666666664e+00 4152 2340 -1.0672916666666666e+01 4152 2348 -5.3343749999999996e+00 4153 4153 4.2666666666999994e+01 4153 5040 -1.0666666666625000e+01 4153 4773 -2.1333333333291666e+01 4153 4772 1.0666666666625000e+01 4153 5038 1.0666666666833333e+01 4153 4155 -1.0666666666729165e+01 4153 5053 -2.8940292364521930e-29 4153 5047 1.0666666666625000e+01 4153 5046 2.1333333333291666e+01 4153 4154 -1.0666666666666666e+01 4153 3463 -3.1495832401145651e-28 4153 2487 -1.0666666666666666e+01 4153 111 -1.0666666666729165e+01 4154 4154 5.3333333333833323e+01 4154 5053 5.3333333333229165e+00 4154 4775 3.2000000000000000e+01 4154 4774 1.0666666666625000e+01 4154 4155 -5.3333333333437496e+00 4154 5040 1.0666666666791667e+01 4154 5038 -5.3333333333020834e+00 4154 5046 -1.0666666666583334e+01 4154 5047 -5.3333333332812494e+00 4154 4153 -1.0666666666666666e+01 4154 552 5.3333333332812494e+00 4154 562 -2.0194839173657902e-27 4154 111 6.2500000000000004e-11 4154 813 1.0416666666666667e-10 4154 814 -5.3333333333229165e+00 4154 115 -1.5999999999947917e+01 4154 114 -1.0666666666708332e+01 4154 555 -2.0194839173657902e-27 4154 554 -5.3333333333229165e+00 4154 109 6.2500000000000004e-11 4154 560 -1.0666666666666666e+01 4154 110 -1.0666666666666666e+01 4155 4155 2.1333333333499997e+01 4155 4771 -5.3333333333229165e+00 4155 4775 -5.3333333333229165e+00 4155 4774 -1.0666666666729165e+01 4155 4154 -5.3333333333437496e+00 4155 5046 -5.3333333333229165e+00 4155 5040 5.3333333333437496e+00 4155 5038 -2.0833333333333339e-11 4155 4773 5.3333333333229165e+00 4155 4772 -5.3333333333437496e+00 4155 4153 -1.0666666666729165e+01 4155 115 2.0833333333333339e-11 4155 2487 -5.3333333333437496e+00 4156 4156 3.2000000000208331e+01 4156 4772 1.8812360437258079e-27 4156 4773 -1.0666666666625000e+01 4156 5038 -5.3333333332916668e+00 4156 5042 -5.3333333333124999e+00 4156 4168 -1.0666666666708332e+01 4156 5044 5.3333333332916668e+00 4156 5045 1.0666666666687499e+01 4156 3707 -4.3283707583767993e-28 4156 3023 -1.0666666666729165e+01 4157 4157 2.1333333333604166e+01 4158 4158 3.2000000000229164e+01 4158 4776 5.3333333333124999e+00 4158 4761 -4.1666666666666665e-11 4158 4994 -5.3333333333124999e+00 4158 4769 1.0666666666687499e+01 4158 4160 -1.0666666666687499e+01 4158 4764 5.3333333332916668e+00 4158 4760 5.3333333332916668e+00 4158 4159 4.1666666666666665e-11 4158 4770 -5.3333333333124999e+00 4158 4766 1.0666666666687499e+01 4158 3705 8.8938459461701536e-29 4158 3023 -1.0666666666708332e+01 4159 4159 4.2666666667270825e+01 4159 5024 -1.0416666666666666e-11 4159 4772 2.2851328271989659e-27 4159 4779 1.0666666666572915e+01 4159 4168 -1.0666666666666666e+01 4159 4667 -1.0416666666666666e-11 4159 4778 -6.2499999999999991e-11 4159 5013 1.0416666666666666e-11 4159 4166 4.1666666666666665e-11 4159 4675 6.2499999999999991e-11 4159 4669 -1.0416666666666666e-11 4159 4162 4.1666666666666665e-11 4159 4777 1.0666666666583334e+01 4159 4163 -1.0666666666666666e+01 4159 4761 -1.0416666666666666e-11 4159 4776 1.0666666666583334e+01 4159 4160 -1.0666666666666666e+01 4159 4766 6.2499999999999991e-11 4159 4760 -1.0416666666666666e-11 4159 4158 4.1666666666666665e-11 4159 4770 -1.0666666666572917e+01 4159 3023 -1.0666666666666666e+01 4160 4160 4.2666666666916662e+01 4160 4668 -5.3333333333229165e+00 4160 4667 6.2499999999999991e-11 4160 4675 -5.3333333333229165e+00 4160 4162 -1.0666666666687499e+01 4160 4776 -2.1333333333312499e+01 4160 4159 -1.0666666666666666e+01 4160 4766 -5.3333333333229165e+00 4160 4761 6.2499999999999991e-11 4160 4994 2.1333333333312499e+01 4160 4769 -5.3333333333229165e+00 4160 4158 -1.0666666666687499e+01 4161 4161 2.1333333333666662e+01 4162 4162 3.2000000000249997e+01 4162 4994 -5.3333333333124999e+00 4162 4667 -4.1666666666666665e-11 4162 4776 5.3333333333124999e+00 4162 4160 -1.0666666666687499e+01 4162 4668 1.0666666666687499e+01 4162 4665 -4.1666666666666665e-11 4162 4159 4.1666666666666665e-11 4162 4777 5.3333333333124999e+00 4162 4675 1.0666666666687499e+01 4162 4669 -4.1666666666666665e-11 4162 5014 -5.3333333333124999e+00 4162 4676 1.0666666666687499e+01 4162 4163 -1.0666666666687499e+01 4163 4163 4.2666666666916662e+01 4163 5016 5.3333333333229165e+00 4163 5013 -6.2500000000000004e-11 4163 4778 5.3333333333229165e+00 4163 4166 -1.0666666666687499e+01 4163 4777 -2.1333333333312499e+01 4163 4159 -1.0666666666666666e+01 4163 4675 -5.3333333333229165e+00 4163 4669 6.2500000000000004e-11 4163 5014 2.1333333333312499e+01 4163 4676 -5.3333333333229165e+00 4163 4162 -1.0666666666687499e+01 4164 4164 2.1333333333666662e+01 4165 4165 2.1333333333458331e+01 4166 4166 3.2000000000229164e+01 4166 5029 1.8812360437258079e-27 4166 5024 5.3333333332916668e+00 4166 4779 5.3333333333124999e+00 4166 4168 -1.0666666666708332e+01 4166 5014 -5.3333333333124999e+00 4166 5013 4.1666666666666665e-11 4166 4159 4.1666666666666665e-11 4166 4777 5.3333333333124999e+00 4166 4778 -1.0666666666687499e+01 4166 4163 -1.0666666666687499e+01 4166 5025 5.3333333332916668e+00 4166 5016 -1.0666666666687499e+01 4167 4167 2.1333333333520830e+01 4168 4168 4.2666666667041660e+01 4168 5025 -5.3333333332812494e+00 4168 5024 1.0416666666666667e-10 4168 4778 5.3333333333229165e+00 4168 4166 -1.0666666666708332e+01 4168 4770 2.0194839173657902e-27 4168 4159 -1.0666666666666666e+01 4168 4779 -1.5999999999989583e+01 4168 5029 -5.3333333333229165e+00 4168 4773 5.3333333332812494e+00 4168 4772 -5.3333333333229165e+00 4168 5038 -1.0416666666666667e-10 4168 5045 -5.3333333333229165e+00 4168 5042 1.5999999999989583e+01 4168 4156 -1.0666666666708332e+01 4168 3023 6.2500000000000004e-11 4169 4169 4.2704166666666666e+01 4169 4989 5.3322916666666664e+00 4169 4910 -1.0416666666666664e-02 4169 4787 5.3281250000000000e+00 4169 4184 -1.0670833333333333e+01 4169 4917 -2.1684043449710089e-19 4169 4911 1.5998958333333333e+01 4169 4179 -1.0666666666666666e+01 4169 4905 -5.3322916666666664e+00 4169 4900 1.0416666666666664e-02 4169 4174 6.2499999999999995e-03 4169 4904 -5.3281250000000000e+00 4169 4912 5.3322916666666664e+00 4169 4173 -1.0670833333333333e+01 4169 4785 -2.1684043449710089e-19 4169 4784 -5.3322916666666664e+00 4169 4170 6.2499999999999995e-03 4169 4907 1.5998958333333333e+01 4169 2997 -1.0666666666666666e+01 4170 4170 4.2710416666666667e+01 4170 4910 5.3281250000000000e+00 4170 4787 -1.4583333333333330e-02 4170 4996 5.3281250000000000e+00 4170 4184 -1.0672916666666666e+01 4170 4786 -1.0416666666666664e-02 4170 4795 2.1684043449710089e-19 4170 4791 5.3322916666666664e+00 4170 4797 2.1684043449710089e-19 4170 4789 5.3322916666666664e+00 4170 4171 6.2499999999999986e-03 4170 4790 1.0666666666666666e+01 4170 4172 -1.0666666666666666e+01 4170 4907 -2.1684043449710089e-19 4170 4784 5.3322916666666664e+00 4170 4169 6.2499999999999995e-03 4170 4785 1.5998958333333333e+01 4170 3636 -5.3322916666666664e+00 4170 3635 -5.3281250000000000e+00 4170 2999 -1.0670833333333333e+01 4170 3000 6.2500000000000003e-03 4170 2997 -1.0666666666666666e+01 4171 4171 4.2685416666791667e+01 4171 4787 5.3281250000000000e+00 4171 4996 -1.0416666666666666e-02 4171 4989 5.3322916666666664e+00 4171 4184 -1.0670833333333334e+01 4171 4990 -2.1332291666656250e+01 4171 4664 -5.3333333333229165e+00 4171 4179 -1.0666666666666666e+01 4171 4661 6.2500000000000004e-11 4171 4674 -5.3333333333229165e+00 4171 4180 -1.0666666666687499e+01 4171 4790 -2.1684043449710089e-19 4171 4789 -5.3322916666666664e+00 4171 4170 6.2499999999999986e-03 4171 4797 -1.5999999999989583e+01 4171 4172 -1.0666666666666666e+01 4172 4172 4.2687500000333337e+01 4172 4761 -1.0416666666666666e-11 4172 4762 6.2499999999999991e-11 4172 4763 -1.0416666666666666e-11 4172 4182 4.1666666666666665e-11 4172 4661 -1.0416666666666666e-11 4172 4674 6.2499999999999991e-11 4172 4667 -1.0416666666666666e-11 4172 4180 4.1666666666666665e-11 4172 4796 1.0666666666583334e+01 4172 4181 -1.0666666666666666e+01 4172 4791 -2.1705219273391446e-19 4172 4795 -1.0661458333291666e+01 4172 4789 -5.0116116045879435e-20 4172 4797 1.0661458333291666e+01 4172 4790 -1.0656249999999998e+01 4172 4171 -1.0666666666666666e+01 4172 4170 -1.0666666666666666e+01 4172 3000 -1.0666666666666666e+01 4173 4173 3.2022916666666667e+01 4173 4916 -5.3312499999999998e+00 4173 4899 -5.3312499999999998e+00 4173 4897 4.1666666666666666e-03 4173 4176 4.1666666666666657e-03 4173 4898 -5.3312499999999998e+00 4173 4906 1.0668750000000001e+01 4173 4175 -1.0668750000000001e+01 4173 4905 1.0668750000000001e+01 4173 4907 -5.3312499999999998e+00 4173 4912 2.8940292364521927e-21 4173 4904 5.3291666666666666e+00 4173 4900 5.3291666666666666e+00 4173 4174 -1.0670833333333333e+01 4173 4169 -1.0670833333333333e+01 4173 2997 4.1666666666666657e-03 4174 4174 4.2685416666791667e+01 4174 4911 -2.1684043449710089e-19 4174 4940 5.3333333333229165e+00 4174 4914 -6.2500000000000004e-11 4174 4917 1.5999999999989583e+01 4174 4179 -1.0666666666666666e+01 4174 4984 -5.3333333333229165e+00 4174 4177 -1.0666666666687499e+01 4174 4916 2.1332291666656246e+01 4174 4176 -1.0666666666666666e+01 4174 4906 -5.3322916666666664e+00 4174 4904 1.0416666666666666e-02 4174 4169 6.2499999999999995e-03 4174 4912 -5.3322916666666664e+00 4174 4900 -5.3281250000000000e+00 4174 4173 -1.0670833333333333e+01 4175 4175 4.2691666666666663e+01 4175 4896 -5.3322916666666664e+00 4175 4895 6.2500000000000003e-03 4175 4899 2.1331249999999997e+01 4175 4905 -5.3322916666666664e+00 4175 4897 -6.2500000000000003e-03 4175 4898 2.1331249999999997e+01 4175 4906 -5.3322916666666664e+00 4175 4176 -1.0666666666666666e+01 4175 4173 -1.0668750000000001e+01 4175 3626 -5.3322916666666664e+00 4175 2994 -1.0668750000000001e+01 4175 2997 -1.0666666666666666e+01 4176 4176 4.2700000000333333e+01 4176 4981 -1.0416666666666666e-11 4176 4940 -6.2499999999999991e-11 4176 4914 1.0416666666666666e-11 4176 4177 4.1666666666666665e-11 4176 4943 -6.2499999999999991e-11 4176 5002 -1.0416666666666666e-11 4176 4941 1.0666666666583334e+01 4176 4183 -1.0666666666666666e+01 4176 4895 -1.0416666666666667e-03 4176 4896 6.2500000000000003e-03 4176 4942 1.0662499999958333e+01 4176 4904 -1.0416666666666667e-03 4176 4916 -1.0662499999958333e+01 4176 4174 -1.0666666666666666e+01 4176 4906 6.2500000000000003e-03 4176 4897 1.0416666666666667e-03 4176 4173 4.1666666666666666e-03 4176 4898 -1.0658333333333333e+01 4176 4175 -1.0666666666666666e+01 4176 3661 -1.0416666666666666e-11 4176 3001 4.1666666666666665e-11 4176 3623 -1.0416666666666667e-03 4176 2994 4.1666666666666666e-03 4176 2998 -1.0666666666666666e+01 4177 4177 3.2000000000249997e+01 4177 4941 5.3333333333124999e+00 4177 4981 -4.1666666666666665e-11 4177 4992 5.3333333333124999e+00 4177 4183 -1.0666666666687499e+01 4177 4176 4.1666666666666665e-11 4177 4916 -5.3333333333124999e+00 4177 4940 -1.0666666666687499e+01 4177 4914 4.1666666666666665e-11 4177 4917 -5.3333333333124999e+00 4177 4174 -1.0666666666687499e+01 4177 4681 -5.3333333333124999e+00 4177 4983 1.0666666666687499e+01 4177 4678 4.1666666666666665e-11 4177 4179 4.1666666666666665e-11 4177 4677 -5.3333333333124999e+00 4177 4984 1.0666666666687499e+01 4177 4178 -1.0666666666687499e+01 4177 3003 4.1666666666666665e-11 4178 4178 4.2666666666916662e+01 4178 4664 -5.3333333333229165e+00 4178 4663 6.2499999999999991e-11 4178 4673 -5.3333333333229165e+00 4178 4180 -1.0666666666687499e+01 4178 4681 2.1333333333312499e+01 4178 4983 -5.3333333333229165e+00 4178 4678 -6.2500000000000004e-11 4178 4677 2.1333333333312499e+01 4178 4984 -5.3333333333229165e+00 4178 4179 -1.0666666666666666e+01 4178 4177 -1.0666666666687499e+01 4178 3003 -1.0666666666666666e+01 4179 4179 4.2693750000333324e+01 4179 4910 1.0416666666666664e-03 4179 4912 -5.0116116045879435e-20 4179 4911 -1.0657291666666666e+01 4179 4169 -1.0666666666666666e+01 4179 4989 -6.2499999999999995e-03 4179 4996 1.0416666666666667e-03 4179 4184 4.1666666666666657e-03 4179 4663 -1.0416666666666666e-11 4179 4664 6.2499999999999991e-11 4179 4661 -1.0416666666666666e-11 4179 4180 4.1666666666666665e-11 4179 4990 1.0662499999958333e+01 4179 4171 -1.0666666666666666e+01 4179 4914 1.0416666666666666e-11 4179 4917 -1.0661458333291666e+01 4179 4174 -1.0666666666666666e+01 4179 4984 6.2499999999999991e-11 4179 4678 1.0416666666666666e-11 4179 4177 4.1666666666666665e-11 4179 4677 -1.0666666666583334e+01 4179 4178 -1.0666666666666666e+01 4180 4180 3.2000000000249997e+01 4180 4677 -5.3333333333124999e+00 4180 4663 -4.1666666666666665e-11 4180 4681 -5.3333333333124999e+00 4180 4178 -1.0666666666687499e+01 4180 4179 4.1666666666666665e-11 4180 4990 5.3333333333124999e+00 4180 4664 1.0666666666687499e+01 4180 4661 -4.1666666666666665e-11 4180 4797 5.3333333333124999e+00 4180 4171 -1.0666666666687499e+01 4180 4991 5.3333333333124999e+00 4180 4673 1.0666666666687499e+01 4180 4667 -4.1666666666666665e-11 4180 4172 4.1666666666666665e-11 4180 4796 5.3333333333124999e+00 4180 4674 1.0666666666687499e+01 4180 4181 -1.0666666666687499e+01 4180 3003 4.1666666666666665e-11 4181 4181 4.2666666666916662e+01 4181 4762 -5.3333333333229165e+00 4181 4761 6.2499999999999991e-11 4181 4767 -5.3333333333229165e+00 4181 4182 -1.0666666666687499e+01 4181 4991 -2.1333333333312499e+01 4181 4673 -5.3333333333229165e+00 4181 4667 6.2499999999999991e-11 4181 4796 -2.1333333333312499e+01 4181 4674 -5.3333333333229165e+00 4181 4172 -1.0666666666666666e+01 4181 4180 -1.0666666666687499e+01 4181 3003 -1.0666666666666666e+01 4182 4182 3.2000000000249997e+01 4182 4768 1.0666666666687499e+01 4182 4796 5.3333333333124999e+00 4182 4761 -4.1666666666666665e-11 4182 4991 5.3333333333124999e+00 4182 4767 1.0666666666687499e+01 4182 4181 -1.0666666666687499e+01 4182 4763 -4.1666666666666665e-11 4182 4172 4.1666666666666665e-11 4182 4795 -5.3333333333124999e+00 4182 4762 1.0666666666687499e+01 4182 3660 -5.3333333333124999e+00 4182 3703 -5.3333333333124999e+00 4182 3701 -4.1666666666666665e-11 4182 2996 4.1666666666666665e-11 4182 3658 -5.3333333333124999e+00 4182 3002 -1.0666666666687499e+01 4182 3003 4.1666666666666665e-11 4182 3000 -1.0666666666687499e+01 4183 4183 4.2666666666916662e+01 4183 4940 5.3333333333229165e+00 4183 4981 6.2499999999999991e-11 4183 4983 -5.3333333333229165e+00 4183 4177 -1.0666666666687499e+01 4183 4992 -2.1333333333312499e+01 4183 5002 6.2499999999999991e-11 4183 4941 -2.1333333333312499e+01 4183 4943 5.3333333333229165e+00 4183 4176 -1.0666666666666666e+01 4183 3003 -1.0666666666666666e+01 4183 3700 -5.3333333333229165e+00 4183 3001 -1.0666666666687499e+01 4184 4184 3.2020833333333343e+01 4184 4911 -5.3312499999999998e+00 4184 4784 2.8940292364521927e-21 4184 4910 -5.3291666666666666e+00 4184 4169 -1.0670833333333333e+01 4184 4789 4.5316262678105068e-20 4184 4170 -1.0672916666666666e+01 4184 4787 -1.0662500000000000e+01 4184 4179 4.1666666666666657e-03 4184 4996 -5.3291666666666666e+00 4184 4990 5.3312499999999998e+00 4184 4171 -1.0670833333333334e+01 4184 4989 -1.0668750000000001e+01 4185 4185 3.2000000000249997e+01 4185 4764 -4.1666666666666665e-11 4185 4994 -5.3333333333124999e+00 4185 4769 1.0666666666687499e+01 4185 4795 -5.3333333333124999e+00 4185 4763 -4.1666666666666665e-11 4185 4794 -5.3333333333124999e+00 4185 4765 1.0666666666687499e+01 4185 4190 -1.0666666666687499e+01 4185 4761 -4.1666666666666665e-11 4185 4187 4.1666666666666665e-11 4185 4796 5.3333333333124999e+00 4185 4762 1.0666666666687499e+01 4185 4186 -1.0666666666687499e+01 4186 4186 4.2666666666916662e+01 4186 4769 -5.3333333333229165e+00 4186 4674 -5.3333333333229165e+00 4186 4667 6.2499999999999991e-11 4186 4994 2.1333333333312499e+01 4186 4668 -5.3333333333229165e+00 4186 4188 -1.0666666666687499e+01 4186 4761 6.2499999999999991e-11 4186 4796 -2.1333333333312499e+01 4186 4762 -5.3333333333229165e+00 4186 4187 -1.0666666666666666e+01 4186 4185 -1.0666666666687499e+01 4187 4187 4.2687500000333323e+01 4187 4789 -5.0116116045879435e-20 4187 4763 -1.0416666666666666e-11 4187 4661 -1.0416666666666666e-11 4187 4797 1.0661458333291666e+01 4187 4195 -1.0666666666666666e+01 4187 4674 6.2499999999999991e-11 4187 4667 -1.0416666666666666e-11 4187 4188 4.1666666666666665e-11 4187 4791 2.1705219273391446e-19 4187 4790 -1.0656249999999998e+01 4187 4191 -1.0666666666666666e+01 4187 4795 -1.0661458333291666e+01 4187 4190 -1.0666666666666666e+01 4187 4762 6.2499999999999991e-11 4187 4761 -1.0416666666666666e-11 4187 4185 4.1666666666666665e-11 4187 4796 1.0666666666583334e+01 4187 4186 -1.0666666666666666e+01 4188 4188 3.2000000000249997e+01 4188 4665 -4.1666666666666665e-11 4188 4995 -5.3333333333124999e+00 4188 4662 1.0666666666687499e+01 4188 4661 -4.1666666666666665e-11 4188 4797 5.3333333333124999e+00 4188 4195 -1.0666666666687499e+01 4188 4187 4.1666666666666665e-11 4188 4796 5.3333333333124999e+00 4188 4674 1.0666666666687499e+01 4188 4667 -4.1666666666666665e-11 4188 4994 -5.3333333333124999e+00 4188 4668 1.0666666666687499e+01 4188 4186 -1.0666666666687499e+01 4189 4189 2.1333333333666662e+01 4190 4190 4.2677083333458327e+01 4190 4762 -5.3333333333229165e+00 4190 4763 6.2500000000000004e-11 4190 4765 -5.3333333333229165e+00 4190 4185 -1.0666666666687499e+01 4190 4792 -1.6263032587282567e-19 4190 4794 2.1334374999989585e+01 4190 4790 2.1684043449710089e-19 4190 4191 -5.3322916666666664e+00 4190 4791 -5.3322916666666664e+00 4190 4187 -1.0666666666666666e+01 4190 4795 1.5999999999989583e+01 4191 4191 4.2716666666666669e+01 4191 4797 2.1684043449710089e-19 4191 4789 -6.2499999999999986e-03 4191 4995 -5.3281250000000000e+00 4191 4195 -5.3322916666666664e+00 4191 4793 1.0672916666666666e+01 4191 4788 -6.2499999999999986e-03 4191 4783 1.0666666666666666e+01 4191 4782 -6.2499999999999986e-03 4191 4792 1.0672916666666666e+01 4191 4794 -5.3281250000000000e+00 4191 4795 3.2249014814734037e-20 4191 4791 -6.2499999999999986e-03 4191 4190 -5.3322916666666664e+00 4191 4790 1.0666666666666666e+01 4191 4187 -1.0666666666666666e+01 4192 4192 3.2029166666833326e+01 4193 4193 2.1343750000000000e+01 4194 4194 2.1354166666666668e+01 4195 4195 4.2677083333458334e+01 4195 4790 -2.1684043449710089e-19 4195 4793 2.1684043449710089e-19 4195 4191 -5.3322916666666664e+00 4195 4789 -5.3322916666666664e+00 4195 4995 2.1334374999989581e+01 4195 4662 -5.3333333333229165e+00 4195 4661 6.2500000000000004e-11 4195 4797 -1.5999999999989583e+01 4195 4674 -5.3333333333229165e+00 4195 4187 -1.0666666666666666e+01 4195 4188 -1.0666666666687499e+01 4196 4196 3.2029166666833333e+01 4197 4197 2.1333333333458331e+01 4198 4198 2.1333333333458331e+01 4199 4199 2.1343750000000000e+01 4200 4200 3.2000000000249997e+01 4200 4807 -4.1666666666666665e-11 4200 4808 1.0666666666687499e+01 4200 4803 -4.1666666666666665e-11 4200 4804 1.0666666666687499e+01 4200 4801 -4.1666666666666665e-11 4200 4802 1.0666666666687499e+01 4201 4201 2.1333333333458331e+01 4202 4202 1.0666666666833333e+01 4203 4203 2.1333333333458331e+01 4204 4204 1.0666666666833333e+01 4205 4205 2.1333333333458331e+01 4206 4206 1.0666666666833333e+01 4207 4207 3.2000000000249997e+01 4207 5063 -5.3333333333124999e+00 4207 4805 -4.1666666666666665e-11 4207 4817 5.3333333333124999e+00 4207 4221 -1.0666666666687499e+01 4207 4806 1.0666666666687499e+01 4207 4801 -4.1666666666666665e-11 4207 4210 4.1666666666666665e-11 4207 4416 -5.3333333333124999e+00 4207 4809 1.0666666666687499e+01 4207 4413 4.1666666666666665e-11 4207 4412 -5.3333333333124999e+00 4207 4810 1.0666666666687499e+01 4207 4208 -1.0666666666687499e+01 4208 4208 4.2666666666916662e+01 4208 4399 -5.3333333333229165e+00 4208 4398 6.2499999999999991e-11 4208 4408 -5.3333333333229165e+00 4208 4212 -1.0666666666687499e+01 4208 4416 2.1333333333312499e+01 4208 4210 -1.0666666666666666e+01 4208 4809 -5.3333333333229165e+00 4208 4413 -6.2500000000000004e-11 4208 4412 2.1333333333312499e+01 4208 4810 -5.3333333333229165e+00 4208 4207 -1.0666666666687499e+01 4209 4209 2.1333333333666662e+01 4210 4210 4.2666666667333331e+01 4210 4738 -1.0416666666666666e-11 4210 4805 -1.0416666666666666e-11 4210 4746 6.2499999999999991e-11 4210 4740 -1.0416666666666666e-11 4210 4220 4.1666666666666665e-11 4210 4817 1.0666666666583334e+01 4210 4221 -1.0666666666666666e+01 4210 4500 -1.0416666666666666e-11 4210 4816 1.0666666666583334e+01 4210 4218 -1.0666666666666666e+01 4210 4398 -1.0416666666666666e-11 4210 4504 6.2499999999999991e-11 4210 4492 -1.0416666666666666e-11 4210 4216 4.1666666666666665e-11 4210 4408 6.2499999999999991e-11 4210 4402 -1.0416666666666666e-11 4210 4212 4.1666666666666665e-11 4210 4815 1.0666666666583334e+01 4210 4213 -1.0666666666666666e+01 4210 4809 6.2499999999999991e-11 4210 4413 1.0416666666666666e-11 4210 4207 4.1666666666666665e-11 4210 4416 -1.0666666666583334e+01 4210 4208 -1.0666666666666666e+01 4211 4211 2.1333333333458331e+01 4212 4212 3.2000000000249997e+01 4212 4412 -5.3333333333124999e+00 4212 4398 -4.1666666666666665e-11 4212 4416 -5.3333333333124999e+00 4212 4208 -1.0666666666687499e+01 4212 4399 1.0666666666687499e+01 4212 4396 -4.1666666666666665e-11 4212 4210 4.1666666666666665e-11 4212 4815 5.3333333333124999e+00 4212 4408 1.0666666666687499e+01 4212 4402 -4.1666666666666665e-11 4212 4822 -5.3333333333124999e+00 4212 4409 1.0666666666687499e+01 4212 4213 -1.0666666666687499e+01 4213 4213 4.2666666666916662e+01 4213 4493 -5.3333333333229165e+00 4213 4492 6.2499999999999991e-11 4213 4504 -5.3333333333229165e+00 4213 4216 -1.0666666666687499e+01 4213 4815 -2.1333333333312499e+01 4213 4210 -1.0666666666666666e+01 4213 4408 -5.3333333333229165e+00 4213 4402 6.2499999999999991e-11 4213 4822 2.1333333333312499e+01 4213 4409 -5.3333333333229165e+00 4213 4212 -1.0666666666687499e+01 4214 4214 2.1333333333666662e+01 4215 4215 2.1333333333458331e+01 4216 4216 3.2000000000249997e+01 4216 4816 5.3333333333124999e+00 4216 4500 -4.1666666666666665e-11 4216 5061 -5.3333333333124999e+00 4216 4507 1.0666666666687499e+01 4216 4218 -1.0666666666687499e+01 4216 4822 -5.3333333333124999e+00 4216 4492 -4.1666666666666665e-11 4216 4210 4.1666666666666665e-11 4216 4815 5.3333333333124999e+00 4216 4504 1.0666666666687499e+01 4216 4213 -1.0666666666687499e+01 4216 4498 -4.1666666666666665e-11 4216 4493 1.0666666666687499e+01 4217 4217 2.1333333333458331e+01 4218 4218 4.2666666666916662e+01 4218 4739 -5.3333333333229165e+00 4218 4738 6.2499999999999991e-11 4218 4746 -5.3333333333229165e+00 4218 4220 -1.0666666666687499e+01 4218 4816 -2.1333333333312499e+01 4218 4210 -1.0666666666666666e+01 4218 4504 -5.3333333333229165e+00 4218 4500 6.2500000000000004e-11 4218 5061 2.1333333333312499e+01 4218 4507 -5.3333333333229165e+00 4218 4216 -1.0666666666687499e+01 4219 4219 2.1333333333666662e+01 4220 4220 3.2000000000249997e+01 4220 5061 -5.3333333333124999e+00 4220 4738 -4.1666666666666665e-11 4220 4816 5.3333333333124999e+00 4220 4218 -1.0666666666687499e+01 4220 4739 1.0666666666687499e+01 4220 4736 -4.1666666666666665e-11 4220 4210 4.1666666666666665e-11 4220 4817 5.3333333333124999e+00 4220 4746 1.0666666666687499e+01 4220 4740 -4.1666666666666665e-11 4220 5063 -5.3333333333124999e+00 4220 4747 1.0666666666687499e+01 4220 4221 -1.0666666666687499e+01 4221 4221 4.2666666666916662e+01 4221 4806 -5.3333333333229165e+00 4221 4805 6.2499999999999991e-11 4221 4809 -5.3333333333229165e+00 4221 4207 -1.0666666666687499e+01 4221 4817 -2.1333333333312499e+01 4221 4210 -1.0666666666666666e+01 4221 4746 -5.3333333333229165e+00 4221 4740 6.2499999999999991e-11 4221 5063 2.1333333333312499e+01 4221 4747 -5.3333333333229165e+00 4221 4220 -1.0666666666687499e+01 4222 4222 2.1333333333666662e+01 4223 4223 2.1333333333458331e+01 4224 4224 3.2000000000249997e+01 4224 4545 -5.3333333333124999e+00 4224 4496 -4.1666666666666665e-11 4224 4546 -5.3333333333124999e+00 4224 4237 -1.0666666666687499e+01 4224 4228 4.1666666666666665e-11 4224 4823 -5.3333333333124999e+00 4224 4506 1.0666666666687499e+01 4224 4498 -4.1666666666666665e-11 4224 4497 1.0666666666687499e+01 4224 4492 -4.1666666666666665e-11 4224 4822 -5.3333333333124999e+00 4224 4493 1.0666666666687499e+01 4224 4225 -1.0666666666687499e+01 4225 4225 4.2666666666916662e+01 4225 4506 -5.3333333333229165e+00 4225 4409 -5.3333333333229165e+00 4225 4402 6.2499999999999991e-11 4225 4823 2.1333333333312499e+01 4225 4403 -5.3333333333229165e+00 4225 4228 -1.0666666666666666e+01 4225 4227 -1.0666666666687499e+01 4225 4492 6.2499999999999991e-11 4225 4822 2.1333333333312499e+01 4225 4493 -5.3333333333229165e+00 4225 4224 -1.0666666666687499e+01 4226 4226 2.1333333333666662e+01 4227 4227 3.2000000000249997e+01 4227 4868 5.3333333333124999e+00 4227 4400 -4.1666666666666665e-11 4227 4829 5.3333333333124999e+00 4227 4238 -1.0666666666687499e+01 4227 4397 1.0666666666687499e+01 4227 4396 -4.1666666666666665e-11 4227 4822 -5.3333333333124999e+00 4227 4409 1.0666666666687499e+01 4227 4402 -4.1666666666666665e-11 4227 4228 4.1666666666666665e-11 4227 4823 -5.3333333333124999e+00 4227 4403 1.0666666666687499e+01 4227 4225 -1.0666666666687499e+01 4228 4228 4.2700000000333333e+01 4228 4527 -1.0416666666666667e-03 4228 4877 1.0416666666666667e-03 4228 4869 -6.2500000000000003e-03 4228 4925 -1.0416666666666667e-03 4228 4231 4.1666666666666666e-03 4228 4400 -1.0416666666666666e-11 4228 4868 1.0662499999958333e+01 4228 4238 -1.0666666666666666e+01 4228 4496 -1.0416666666666666e-11 4228 4546 -1.0662499999958333e+01 4228 4237 -1.0666666666666666e+01 4228 4506 6.2499999999999991e-11 4228 4492 -1.0416666666666666e-11 4228 4224 4.1666666666666665e-11 4228 4529 6.2500000000000003e-03 4228 4528 -1.0416666666666667e-03 4228 4229 4.1666666666666666e-03 4228 4867 1.0658333333333333e+01 4228 4230 -1.0666666666666666e+01 4228 4403 6.2499999999999991e-11 4228 4402 -1.0416666666666666e-11 4228 4227 4.1666666666666665e-11 4228 4823 -1.0666666666583334e+01 4228 4225 -1.0666666666666666e+01 4229 4229 3.2024999999999999e+01 4229 4938 -5.3312499999999998e+00 4229 4533 1.0668750000000001e+01 4229 4546 -5.3312499999999998e+00 4229 4527 -4.1666666666666666e-03 4229 4545 -5.3312499999999998e+00 4229 4530 1.0668750000000001e+01 4229 4237 -1.0668750000000001e+01 4229 4528 -4.1666666666666666e-03 4229 4228 4.1666666666666657e-03 4229 4867 5.3312499999999998e+00 4229 4529 1.0668750000000001e+01 4229 4230 -1.0668750000000001e+01 4229 3629 -4.1666666666666666e-03 4230 4230 4.2691666666666663e+01 4230 4533 -5.3322916666666664e+00 4230 4869 5.3322916666666664e+00 4230 4925 6.2500000000000003e-03 4230 4938 2.1331249999999997e+01 4230 4926 -5.3322916666666664e+00 4230 4231 -1.0668750000000001e+01 4230 4528 6.2500000000000003e-03 4230 4867 -2.1331249999999997e+01 4230 4529 -5.3322916666666664e+00 4230 4228 -1.0666666666666666e+01 4230 4229 -1.0668750000000001e+01 4231 4231 3.2024999999999999e+01 4231 4921 -4.1666666666666666e-03 4231 4829 5.3312499999999998e+00 4231 4828 -1.0668750000000001e+01 4231 4877 4.1666666666666666e-03 4231 4868 5.3312499999999998e+00 4231 4238 -1.0668750000000001e+01 4231 4228 4.1666666666666657e-03 4231 4867 5.3312499999999998e+00 4231 4869 -1.0668750000000001e+01 4231 4925 -4.1666666666666666e-03 4231 4938 -5.3312499999999998e+00 4231 4926 1.0668750000000001e+01 4231 4230 -1.0668750000000001e+01 4232 4232 2.1366666666666664e+01 4233 4233 2.1333333333458331e+01 4234 4234 2.1350000000166663e+01 4235 4235 2.1333333333458331e+01 4236 4236 2.1350000000166663e+01 4237 4237 4.2679166666791666e+01 4237 4529 -5.3322916666666664e+00 4237 4527 6.2500000000000003e-03 4237 4530 -5.3322916666666664e+00 4237 4229 -1.0668750000000001e+01 4237 4545 2.1332291666656250e+01 4237 4497 -5.3333333333229165e+00 4237 4496 6.2499999999999991e-11 4237 4546 2.1332291666656250e+01 4237 4506 -5.3333333333229165e+00 4237 4228 -1.0666666666666666e+01 4237 4224 -1.0666666666687499e+01 4238 4238 4.2679166666791666e+01 4238 4828 5.3322916666666664e+00 4238 4877 -6.2500000000000003e-03 4238 4869 5.3322916666666664e+00 4238 4231 -1.0668750000000001e+01 4238 4868 -2.1332291666656250e+01 4238 4228 -1.0666666666666666e+01 4238 4403 -5.3333333333229165e+00 4238 4400 6.2500000000000004e-11 4238 4829 -2.1332291666656250e+01 4238 4397 -5.3333333333229165e+00 4238 4227 -1.0666666666687499e+01 4239 4239 2.1345833333333331e+01 4240 4240 2.1345833333333331e+01 4241 4241 3.2000000000249997e+01 4241 4846 -4.1666666666666665e-11 4241 4848 1.0666666666687499e+01 4241 4255 -1.0666666666687499e+01 4241 4857 -5.3333333333124999e+00 4241 4863 -5.3333333333124999e+00 4241 4842 -4.1666666666666665e-11 4241 4843 1.0666666666687499e+01 4241 4838 -4.1666666666666665e-11 4241 4243 4.1666666666666665e-11 4241 4855 -5.3333333333124999e+00 4241 4839 1.0666666666687499e+01 4241 4242 -1.0666666666687499e+01 4241 2068 -5.3333333333124999e+00 4242 4242 4.2679166666791666e+01 4242 4859 5.3322916666666664e+00 4242 4843 -5.3333333333229165e+00 4242 4856 -6.2500000000000003e-03 4242 4857 2.1332291666656246e+01 4242 4881 5.3322916666666664e+00 4242 4247 -1.0668750000000001e+01 4242 4838 6.2500000000000004e-11 4242 4855 2.1332291666656250e+01 4242 4839 -5.3333333333229165e+00 4242 4243 -1.0666666666666666e+01 4242 4241 -1.0666666666687499e+01 4243 4243 5.3350000000624995e+01 4243 4862 -2.1333333333260416e+01 4243 4254 -1.5999999999947917e+01 4243 4863 -2.1333333333260416e+01 4243 4255 -1.5999999999947917e+01 4243 4914 1.0416666666666666e-11 4243 4856 1.0416666666666667e-03 4243 4846 -1.0416666666666666e-11 4243 4861 -6.2499999999999991e-11 4243 4982 -1.0416666666666666e-11 4243 4250 4.1666666666666665e-11 4243 4859 -6.2500000000000003e-03 4243 4904 -1.0416666666666667e-03 4243 4247 4.1666666666666666e-03 4243 4860 1.0662499999958333e+01 4243 4249 -1.0666666666666666e+01 4243 4839 6.2499999999999991e-11 4243 4838 -1.0416666666666666e-11 4243 4241 4.1666666666666665e-11 4243 4855 -1.0662499999958333e+01 4243 4242 -1.0666666666666666e+01 4243 1769 -5.3333333333020834e+00 4243 1598 2.0833333333333336e-11 4243 1775 1.0666666666833333e+01 4243 1774 -5.3333333333020834e+00 4244 4244 2.1333333333458331e+01 4245 4245 2.1350000000166663e+01 4246 4246 2.1349999999999998e+01 4246 4915 -5.3322916666666664e+00 4246 4249 -5.3343749999999996e+00 4246 4904 -5.3322916666666664e+00 4246 4912 5.3343749999999996e+00 4246 4909 1.0672916666666666e+01 4246 4900 2.0833333333333337e-03 4246 4901 -5.3322916666666664e+00 4246 4908 5.3343749999999996e+00 4246 4247 -1.0672916666666666e+01 4247 4247 4.2704166666666666e+01 4247 4912 -1.0662500000000000e+01 4247 4855 -5.3312499999999998e+00 4247 4904 1.5995833333333334e+01 4247 4243 4.1666666666666657e-03 4247 4860 5.3312499999999998e+00 4247 4859 -1.0668750000000001e+01 4247 4249 -1.0664583333333333e+01 4247 4856 4.1666666666666666e-03 4247 4857 -5.3312499999999998e+00 4247 4881 -1.0668750000000001e+01 4247 4242 -1.0668750000000001e+01 4247 4901 1.5995833333333334e+01 4247 4908 -1.0662500000000000e+01 4247 4900 -1.0683333333333334e+01 4247 4246 -1.0672916666666666e+01 4248 4248 3.2025000000000006e+01 4249 4249 5.3358333333458326e+01 4249 4909 -1.0662500000000000e+01 4249 4861 5.3333333333229165e+00 4249 4246 -5.3343749999999996e+00 4249 4912 1.0679166666666665e+01 4249 4900 5.3302083333333332e+00 4249 4914 -6.2500000000000004e-11 4249 4915 3.2001041666656249e+01 4249 4978 -5.3333333333229165e+00 4249 4250 -1.0666666666687499e+01 4249 4904 -1.0662499999999998e+01 4249 4860 -2.1332291666656246e+01 4249 4859 5.3322916666666664e+00 4249 4243 -1.0666666666666666e+01 4249 4247 -1.0664583333333333e+01 4250 4250 3.2000000000249997e+01 4250 4982 -4.1666666666666665e-11 4250 4254 -1.0666666666687499e+01 4250 4980 1.0666666666687499e+01 4250 4860 5.3333333333124999e+00 4250 4243 4.1666666666666665e-11 4250 4862 -5.3333333333124999e+00 4250 4861 -1.0666666666687499e+01 4250 4979 -4.1666666666666665e-11 4250 4914 4.1666666666666665e-11 4250 4915 -5.3333333333124999e+00 4250 4978 1.0666666666687499e+01 4250 4249 -1.0666666666687499e+01 4250 2323 -5.3333333333124999e+00 4251 4251 3.2029166666833333e+01 4252 4252 2.1333333333458331e+01 4253 4253 3.2000000000458328e+01 4254 4254 6.4000000000499995e+01 4254 4862 3.2000000000000000e+01 4254 4243 -1.5999999999947917e+01 4254 4982 6.2500000000000004e-11 4254 4980 -5.3333333333229165e+00 4254 4250 -1.0666666666687499e+01 4254 4861 5.3333333333229165e+00 4254 2009 -1.0666666666625000e+01 4254 1601 -5.3333333333437496e+00 4254 2005 1.0666666666791667e+01 4254 2004 -5.3333333333020834e+00 4254 2322 2.1333333333312499e+01 4254 1773 -5.3333333333020834e+00 4254 1599 -1.0666666666604167e+01 4254 1775 -1.0666666666625000e+01 4254 1769 1.0666666666791667e+01 4254 1598 -5.3333333333437496e+00 4254 2323 3.2000000000000000e+01 4255 4255 5.3333333333708325e+01 4255 4863 3.2000000000000000e+01 4255 4243 -1.5999999999947917e+01 4255 4846 6.2500000000000004e-11 4255 4848 -5.3333333333229165e+00 4255 4241 -1.0666666666687499e+01 4255 4839 -5.3333333333229165e+00 4255 2070 5.3333333333229165e+00 4255 2069 1.0666666666625000e+01 4255 1773 -5.3333333333020834e+00 4255 1599 -1.0666666666645833e+01 4255 1775 -1.0666666666625000e+01 4255 1774 1.0666666666791667e+01 4255 1598 -5.3333333333437496e+00 4255 2068 2.1333333333312499e+01 4256 4256 2.1333333333666666e+01 4257 4257 3.2000000000249997e+01 4257 4842 -4.1666666666666665e-11 4257 4871 -5.3333333333124999e+00 4257 4847 1.0666666666687499e+01 4257 4858 -5.3333333333124999e+00 4257 4838 -4.1666666666666665e-11 4257 4857 -5.3333333333124999e+00 4257 4843 1.0666666666687499e+01 4257 4268 -1.0666666666687499e+01 4257 4840 -4.1666666666666665e-11 4257 4259 4.1666666666666665e-11 4257 4870 -5.3333333333124999e+00 4257 4841 1.0666666666687499e+01 4257 4258 -1.0666666666687499e+01 4258 4258 4.2666666666916662e+01 4258 4847 -5.3333333333229165e+00 4258 4411 -5.3333333333229165e+00 4258 4404 6.2500000000000004e-11 4258 4871 2.1333333333312499e+01 4258 4405 -5.3333333333229165e+00 4258 4260 -1.0666666666687499e+01 4258 4840 6.2500000000000004e-11 4258 4870 2.1333333333312499e+01 4258 4841 -5.3333333333229165e+00 4258 4259 -1.0666666666666666e+01 4258 4257 -1.0666666666687499e+01 4259 4259 4.2700000000333333e+01 4259 4877 1.0416666666666667e-03 4259 4856 1.0416666666666667e-03 4259 4875 -6.2500000000000003e-03 4259 4902 -1.0416666666666667e-03 4259 4262 4.1666666666666666e-03 4259 4838 -1.0416666666666666e-11 4259 4858 -1.0662499999958333e+01 4259 4268 -1.0666666666666666e+01 4259 4400 -1.0416666666666666e-11 4259 4874 1.0662499999958333e+01 4259 4266 -1.0666666666666666e+01 4259 4411 6.2499999999999991e-11 4259 4404 -1.0416666666666666e-11 4259 4260 4.1666666666666665e-11 4259 4872 -6.2500000000000003e-03 4259 4924 -1.0416666666666667e-03 4259 4265 4.1666666666666666e-03 4259 4873 1.0658333333333333e+01 4259 4263 -1.0666666666666666e+01 4259 4841 6.2499999999999991e-11 4259 4840 -1.0416666666666666e-11 4259 4257 4.1666666666666665e-11 4259 4870 -1.0666666666583334e+01 4259 4258 -1.0666666666666666e+01 4260 4260 3.2000000000249997e+01 4260 4394 -4.1666666666666665e-11 4260 4876 -5.3333333333124999e+00 4260 4401 1.0666666666687499e+01 4260 4400 -4.1666666666666665e-11 4260 4874 5.3333333333124999e+00 4260 4266 -1.0666666666687499e+01 4260 4259 4.1666666666666665e-11 4260 4870 -5.3333333333124999e+00 4260 4411 1.0666666666687499e+01 4260 4404 -4.1666666666666665e-11 4260 4871 -5.3333333333124999e+00 4260 4405 1.0666666666687499e+01 4260 4258 -1.0666666666687499e+01 4261 4261 2.1333333333666662e+01 4262 4262 3.2024999999999999e+01 4262 4857 -5.3312499999999998e+00 4262 4856 4.1666666666666666e-03 4262 4858 -5.3312499999999998e+00 4262 4268 -1.0668750000000001e+01 4262 4259 4.1666666666666657e-03 4262 4873 5.3312499999999998e+00 4262 4875 -1.0668750000000001e+01 4262 4901 -4.1666666666666666e-03 4262 4881 -1.0668750000000001e+01 4262 4902 -4.1666666666666666e-03 4262 4936 -5.3312499999999998e+00 4262 4903 1.0668750000000001e+01 4262 4263 -1.0668750000000001e+01 4263 4263 4.2691666666666663e+01 4263 4875 5.3322916666666664e+00 4263 4929 -5.3322916666666664e+00 4263 4924 6.2500000000000003e-03 4263 4873 -2.1331249999999997e+01 4263 4872 5.3322916666666664e+00 4263 4259 -1.0666666666666666e+01 4263 4265 -1.0668750000000001e+01 4263 4902 6.2500000000000003e-03 4263 4936 2.1331249999999997e+01 4263 4903 -5.3322916666666664e+00 4263 4262 -1.0668750000000001e+01 4264 4264 2.1366666666666664e+01 4265 4265 3.2024999999999999e+01 4265 4874 5.3312499999999998e+00 4265 4877 4.1666666666666666e-03 4265 4876 -5.3312499999999998e+00 4265 4266 -1.0668750000000001e+01 4265 4878 -1.0668750000000001e+01 4265 4923 -4.1666666666666666e-03 4265 4936 -5.3312499999999998e+00 4265 4929 1.0668750000000001e+01 4265 4924 -4.1666666666666666e-03 4265 4259 4.1666666666666657e-03 4265 4873 5.3312499999999998e+00 4265 4872 -1.0668750000000001e+01 4265 4263 -1.0668750000000001e+01 4266 4266 4.2679166666791666e+01 4266 4872 5.3322916666666664e+00 4266 4877 -6.2500000000000003e-03 4266 4878 5.3322916666666664e+00 4266 4265 -1.0668750000000001e+01 4266 4876 2.1332291666656250e+01 4266 4401 -5.3333333333229165e+00 4266 4400 6.2500000000000004e-11 4266 4874 -2.1332291666656250e+01 4266 4411 -5.3333333333229165e+00 4266 4259 -1.0666666666666666e+01 4266 4260 -1.0666666666687499e+01 4267 4267 2.1350000000166663e+01 4268 4268 4.2679166666791666e+01 4268 4881 5.3322916666666664e+00 4268 4856 -6.2500000000000003e-03 4268 4875 5.3322916666666664e+00 4268 4262 -1.0668750000000001e+01 4268 4858 2.1332291666656250e+01 4268 4259 -1.0666666666666666e+01 4268 4841 -5.3333333333229165e+00 4268 4838 6.2499999999999991e-11 4268 4857 2.1332291666656250e+01 4268 4843 -5.3333333333229165e+00 4268 4257 -1.0666666666687499e+01 4269 4269 2.1350000000166663e+01 4270 4270 2.1333333333458331e+01 4271 4271 2.1333333333458331e+01 4272 4272 2.1345833333333331e+01 4273 4273 2.1345833333333331e+01 4274 4274 3.2024999999999999e+01 4274 4938 -5.3312499999999998e+00 4274 4925 -4.1666666666666666e-03 4274 4932 5.3312499999999998e+00 4274 4278 -1.0668750000000001e+01 4274 4926 1.0668750000000001e+01 4274 4921 -4.1666666666666666e-03 4274 4582 -5.3312499999999998e+00 4274 4927 1.0668750000000001e+01 4274 4580 4.1666666666666666e-03 4274 4579 -5.3312499999999998e+00 4274 4928 1.0668750000000001e+01 4274 4275 -1.0668750000000001e+01 4274 2784 4.1666666666666657e-03 4275 4275 4.2691666666666663e+01 4275 4551 -5.3322916666666664e+00 4275 4550 6.2500000000000003e-03 4275 4582 2.1331249999999997e+01 4275 4927 -5.3322916666666664e+00 4275 4580 -6.2500000000000003e-03 4275 4579 2.1331249999999997e+01 4275 4928 -5.3322916666666664e+00 4275 4274 -1.0668750000000001e+01 4275 3350 -5.3322916666666664e+00 4275 2786 -1.0668750000000001e+01 4275 2784 -1.0666666666666666e+01 4276 4276 2.1366666666666664e+01 4277 4277 2.1345833333333331e+01 4278 4278 4.2691666666666663e+01 4278 4926 -5.3322916666666664e+00 4278 4925 6.2500000000000003e-03 4278 4927 -5.3322916666666664e+00 4278 4274 -1.0668750000000001e+01 4278 4932 -2.1331249999999997e+01 4278 4528 6.2500000000000003e-03 4278 4938 2.1331249999999997e+01 4278 4533 -5.3322916666666664e+00 4278 2784 -1.0666666666666666e+01 4278 3352 -5.3322916666666664e+00 4278 2790 -1.0668750000000001e+01 4279 4279 2.1366666666666664e+01 4280 4280 4.2704166666666673e+01 4280 4962 -1.0662500000000000e+01 4280 4955 1.5995833333333334e+01 4280 4960 -1.0662500000000000e+01 4280 4946 -1.0683333333333334e+01 4280 4285 -1.0672916666666666e+01 4280 4948 -4.1666666666666666e-03 4280 4949 1.0668750000000001e+01 4280 4944 1.5995833333333334e+01 4280 4945 1.0668750000000001e+01 4281 4281 3.2024999999999999e+01 4282 4282 1.0683333333333334e+01 4283 4283 2.1345833333333331e+01 4284 4284 1.0683333333333334e+01 4285 4285 2.1349999999999998e+01 4285 4960 5.3343749999999996e+00 4285 4962 5.3343749999999996e+00 4285 4955 -5.3322916666666664e+00 4285 4946 2.0833333333333346e-03 4285 4944 -5.3322916666666664e+00 4285 4280 -1.0672916666666666e+01 4285 1794 1.0672916666666666e+01 4286 4286 3.2025000000000006e+01 4287 4287 3.2022916666666667e+01 4287 4960 -4.5316262678105068e-20 4287 4944 5.3291666666666666e+00 4287 4950 -4.1666666666666666e-03 4287 4954 1.0668750000000001e+01 4287 4946 5.3291666666666666e+00 4287 4958 -5.3312499999999998e+00 4287 4947 1.0668750000000001e+01 4287 4288 -1.0670833333333334e+01 4287 3395 -5.3312499999999998e+00 4287 3685 -5.3312499999999998e+00 4287 2844 -1.0668750000000001e+01 4287 1251 4.1666666666666657e-03 4288 4288 5.3383333333333326e+01 4288 4958 3.1999999999999996e+01 4288 4960 5.3322916666666664e+00 4288 4944 -5.3281250000000000e+00 4288 4946 1.0416666666666666e-02 4288 4947 -5.3322916666666664e+00 4288 4287 -1.0670833333333334e+01 4288 1251 -1.5994791666666664e+01 4288 2137 -1.0662500000000000e+01 4288 1250 -5.3343749999999996e+00 4288 1793 -1.0679166666666665e+01 4288 2130 -5.3302083333333332e+00 4288 1789 1.0658333333333331e+01 4288 1790 5.3322916666666664e+00 4288 2141 -5.3281250000000000e+00 4288 1249 -1.0666666666666664e+01 4288 1788 1.0666666666666666e+01 4289 4289 2.1352083333333329e+01 4290 4290 3.2024999999999999e+01 4290 4948 -4.1666666666666666e-03 4290 4945 1.0668750000000001e+01 4290 4944 -4.1666666666666666e-03 4290 4954 1.0668750000000001e+01 4290 4950 -4.1666666666666666e-03 4290 4951 1.0668750000000001e+01 4290 3685 -5.3312499999999998e+00 4290 3687 -5.3312499999999998e+00 4290 3005 -1.0668750000000001e+01 4291 4291 2.1345833333333331e+01 4292 4292 1.0683333333333334e+01 4293 4293 2.1345833333333331e+01 4294 4294 3.2024999999999999e+01 4294 4624 -4.1666666666666666e-03 4294 4972 -5.3312499999999998e+00 4294 4632 1.0668750000000001e+01 4294 4616 -4.1666666666666666e-03 4294 4625 1.0668750000000001e+01 4294 4622 -4.1666666666666666e-03 4294 4971 -5.3312499999999998e+00 4294 4623 1.0668750000000001e+01 4294 4295 -1.0668750000000001e+01 4295 4295 4.2691666666666663e+01 4295 4632 -5.3322916666666664e+00 4295 4956 -5.3322916666666664e+00 4295 4952 6.2500000000000003e-03 4295 4972 2.1331249999999997e+01 4295 4953 -5.3322916666666664e+00 4295 4297 -1.0668750000000001e+01 4295 4622 6.2500000000000003e-03 4295 4971 2.1331249999999997e+01 4295 4623 -5.3322916666666664e+00 4295 4294 -1.0668750000000001e+01 4296 4296 2.1366666666666664e+01 4297 4297 3.2024999999999999e+01 4297 4955 -4.1666666666666666e-03 4297 4949 1.0668750000000001e+01 4297 4948 -4.1666666666666666e-03 4297 4971 -5.3312499999999998e+00 4297 4956 1.0668750000000001e+01 4297 4952 -4.1666666666666666e-03 4297 4972 -5.3312499999999998e+00 4297 4953 1.0668750000000001e+01 4297 4295 -1.0668750000000001e+01 4298 4298 2.1366666666666664e+01 4299 4299 2.1345833333333331e+01 4300 4300 1.0683333333333334e+01 4301 4301 2.1345833333333331e+01 4302 4302 1.0683333333333334e+01 4303 4303 2.1345833333333331e+01 4304 4304 2.1345833333333331e+01 4305 4305 3.2000000000249997e+01 4305 4704 1.0666666666687499e+01 4305 4699 -4.1666666666666665e-11 4305 4306 -1.0666666666687499e+01 4305 4697 -4.1666666666666665e-11 4305 4999 -5.3333333333124999e+00 4305 4700 1.0666666666687499e+01 4305 1994 -5.3333333333124999e+00 4305 1978 -4.1666666666666665e-11 4305 1988 5.3333333333124999e+00 4305 1526 -1.0666666666687499e+01 4305 1525 4.1666666666666665e-11 4305 1985 -5.3333333333124999e+00 4305 1983 1.0666666666687499e+01 4306 4306 4.2666666666916662e+01 4306 4699 6.2500000000000004e-11 4306 4305 -1.0666666666687499e+01 4306 4985 6.2500000000000004e-11 4306 4308 -1.0666666666687499e+01 4306 4986 -5.3333333333229165e+00 4306 4999 2.1333333333312499e+01 4306 4700 -5.3333333333229165e+00 4306 1983 -5.3333333333229165e+00 4306 1985 2.1333333333312499e+01 4306 1989 5.3333333333229165e+00 4306 1525 -1.0666666666666666e+01 4307 4307 2.1333333333666662e+01 4308 4308 3.2000000000249997e+01 4308 4982 -4.1666666666666665e-11 4308 4980 1.0666666666687499e+01 4308 4985 -4.1666666666666665e-11 4308 4306 -1.0666666666687499e+01 4308 4979 -4.1666666666666665e-11 4308 4999 -5.3333333333124999e+00 4308 4986 1.0666666666687499e+01 4308 1990 5.3333333333124999e+00 4308 2323 -5.3333333333124999e+00 4308 1530 -1.0666666666687499e+01 4308 1525 4.1666666666666665e-11 4308 1985 -5.3333333333124999e+00 4308 1989 -1.0666666666687499e+01 4309 4309 2.1333333333458331e+01 4310 4310 3.2000000000458328e+01 4311 4311 2.1333333333458331e+01 4312 4312 3.2000000000458328e+01 4313 4313 3.2000000000249997e+01 4313 4985 -4.1666666666666665e-11 4313 4316 4.1666666666666665e-11 4313 4987 1.0666666666687499e+01 4313 4982 -4.1666666666666665e-11 4313 4317 -1.0666666666687499e+01 4313 5008 -5.3333333333124999e+00 4313 5007 -5.3333333333124999e+00 4313 4981 -4.1666666666666665e-11 4313 4315 4.1666666666666665e-11 4313 5006 -5.3333333333124999e+00 4313 4988 1.0666666666687499e+01 4313 4314 -1.0666666666687499e+01 4313 1985 -5.3333333333124999e+00 4313 1986 -5.3333333333124999e+00 4313 1218 -1.0666666666687499e+01 4313 1213 4.1666666666666665e-11 4313 1990 5.3333333333124999e+00 4313 1989 -1.0666666666687499e+01 4314 4314 4.2666666666916662e+01 4314 5003 -5.3333333333229165e+00 4314 5002 6.2499999999999991e-11 4314 5005 -5.3333333333229165e+00 4314 4318 -1.0666666666687499e+01 4314 5007 2.1333333333312499e+01 4314 4316 -1.0666666666666666e+01 4314 4987 -5.3333333333229165e+00 4314 4981 6.2499999999999991e-11 4314 5006 2.1333333333312499e+01 4314 4988 -5.3333333333229165e+00 4314 4315 -1.0666666666666666e+01 4314 4313 -1.0666666666687499e+01 4315 4315 4.2666666667208332e+01 4315 5008 -1.0666666666572915e+01 4315 5010 -1.0666666666562499e+01 4315 4317 -1.0666666666666666e+01 4315 4320 -1.0666666666666666e+01 4315 5011 -2.2851328271989659e-27 4315 5002 -1.0416666666666666e-11 4315 5003 6.2499999999999991e-11 4315 5004 -1.0416666666666666e-11 4315 4318 4.1666666666666665e-11 4315 5009 1.0666666666572917e+01 4315 4319 -1.0666666666666666e+01 4315 4982 -1.0416666666666666e-11 4315 4988 6.2499999999999991e-11 4315 4981 -1.0416666666666666e-11 4315 4313 4.1666666666666665e-11 4315 5006 -1.0666666666583334e+01 4315 4314 -1.0666666666666666e+01 4315 1769 -3.6295685768920020e-28 4316 4316 4.2666666667333331e+01 4316 5005 6.2499999999999991e-11 4316 4318 4.1666666666666665e-11 4316 4987 6.2499999999999991e-11 4316 4985 -1.0416666666666666e-11 4316 4313 4.1666666666666665e-11 4316 4699 -1.0416666666666666e-11 4316 5002 -1.0416666666666666e-11 4316 4981 -1.0416666666666666e-11 4316 5007 -1.0666666666583334e+01 4316 4314 -1.0666666666666666e+01 4316 816 1.0416666666666666e-11 4316 1993 -1.0666666666583334e+01 4316 1228 -1.0666666666666666e+01 4316 2315 -1.0416666666666666e-11 4316 1979 -1.0416666666666666e-11 4316 1991 -6.2499999999999991e-11 4316 2316 -1.0416666666666666e-11 4316 1226 4.1666666666666665e-11 4316 1992 1.0666666666583334e+01 4316 1227 -1.0666666666666666e+01 4316 1982 6.2499999999999991e-11 4316 1217 4.1666666666666665e-11 4316 1986 -1.0666666666583334e+01 4316 1218 -1.0666666666666666e+01 4317 4317 4.2666666667041660e+01 4317 4982 6.2500000000000004e-11 4317 4313 -1.0666666666687499e+01 4317 5010 -2.0194839173657902e-27 4317 4320 6.2499999999999991e-11 4317 5008 1.5999999999989583e+01 4317 4315 -1.0666666666666666e+01 4317 4988 -5.3333333333229165e+00 4317 1987 -4.5860624244724788e-28 4317 1773 5.3333333332812494e+00 4317 1990 -1.5999999999989583e+01 4317 1989 5.3333333333229165e+00 4317 1213 -1.0666666666666666e+01 4317 2322 -1.4583333333333332e-10 4317 1211 6.2499999999999991e-11 4317 2005 -5.3333333333229165e+00 4317 2004 5.3333333332812494e+00 4317 1216 -1.0666666666729165e+01 4317 1769 -5.3333333333229165e+00 4318 4318 3.2000000000249997e+01 4318 5004 -4.1666666666666665e-11 4318 4319 -1.0666666666687499e+01 4318 4316 4.1666666666666665e-11 4318 5005 1.0666666666687499e+01 4318 5006 -5.3333333333124999e+00 4318 5002 -4.1666666666666665e-11 4318 5007 -5.3333333333124999e+00 4318 4314 -1.0666666666687499e+01 4318 4315 4.1666666666666665e-11 4318 5009 5.3333333333124999e+00 4318 5003 1.0666666666687499e+01 4318 1786 -5.3333333333124999e+00 4318 1993 -5.3333333333124999e+00 4318 816 4.1666666666666665e-11 4318 1223 4.1666666666666665e-11 4318 2096 -5.3333333333124999e+00 4318 1075 1.0666666666687499e+01 4318 1228 -1.0666666666687499e+01 4319 4319 4.2666666666979161e+01 4319 5004 6.2499999999999991e-11 4319 4318 -1.0666666666687499e+01 4319 4320 6.2499999999999991e-11 4319 5011 -5.3333333333229165e+00 4319 5010 -2.2470898404921788e-28 4319 5009 -1.5999999999989583e+01 4319 5003 -5.3333333333229165e+00 4319 4315 -1.0666666666666666e+01 4319 1786 2.1333333333312499e+01 4319 1223 -1.0666666666666666e+01 4319 1075 -5.3333333333229165e+00 4319 1762 -5.3333333333229165e+00 4319 1758 1.0416666666666667e-10 4319 1757 -5.3333333332812494e+00 4319 1210 -1.0666666666708332e+01 4320 4320 5.3333333333833338e+01 4320 5008 -2.0194839173657902e-27 4320 4317 6.2500000000000004e-11 4320 5010 1.0666666666666666e+01 4320 4315 -1.0666666666666666e+01 4320 4319 6.2500000000000004e-11 4320 5011 5.3333333333229165e+00 4320 5009 -2.0194839173657902e-27 4320 2322 5.3333333332812494e+00 4320 1773 1.0666666666583334e+01 4320 2128 -5.3333333333020834e+00 4320 1216 -1.0666666666666666e+01 4320 1779 1.0666666666625000e+01 4320 1772 -1.0666666666791667e+01 4320 1225 -5.3333333333437496e+00 4320 1771 3.2000000000000000e+01 4320 1215 -1.5999999999947917e+01 4320 1766 -5.3333333333229165e+00 4320 1769 5.3333333333229165e+00 4320 1757 1.0416666666666667e-10 4320 1758 -5.3333333332812494e+00 4320 1210 -1.0666666666708332e+01 4321 4321 3.2000000000249997e+01 4321 5020 -4.1666666666666665e-11 4321 5015 -5.3333333333124999e+00 4321 5026 1.0666666666687499e+01 4321 5025 -4.1666666666666665e-11 4321 5021 1.0666666666687499e+01 4321 5013 4.1666666666666665e-11 4321 5014 -5.3333333333124999e+00 4321 5016 -1.0666666666687499e+01 4321 4322 -1.0666666666687499e+01 4322 4322 4.2666666666916662e+01 4322 5026 -5.3333333333229165e+00 4322 4676 -5.3333333333229165e+00 4322 4669 6.2500000000000004e-11 4322 5015 2.1333333333312499e+01 4322 4670 -5.3333333333229165e+00 4322 4324 -1.0666666666687499e+01 4322 5013 -6.2500000000000004e-11 4322 5014 2.1333333333312499e+01 4322 5016 5.3333333333229165e+00 4322 4321 -1.0666666666687499e+01 4323 4323 2.1333333333666662e+01 4324 4324 3.2000000000249997e+01 4324 4659 -4.1666666666666665e-11 4324 4666 1.0666666666687499e+01 4324 4665 -4.1666666666666665e-11 4324 5014 -5.3333333333124999e+00 4324 4676 1.0666666666687499e+01 4324 4669 -4.1666666666666665e-11 4324 5015 -5.3333333333124999e+00 4324 4670 1.0666666666687499e+01 4324 4322 -1.0666666666687499e+01 4325 4325 2.1333333333666662e+01 4326 4326 2.1333333333458331e+01 4327 4327 1.0666666666833333e+01 4328 4328 2.1333333333458331e+01 4329 4329 1.0666666666833333e+01 4330 4330 2.1333333333458331e+01 4331 4331 2.1333333333458331e+01 4332 4332 4.2666666667041660e+01 4332 5043 -1.0666666666625000e+01 4332 5025 1.5999999999958334e+01 4332 5029 1.0666666666625000e+01 4332 5024 -1.0666666666833333e+01 4332 4335 -1.0666666666729165e+01 4332 5022 1.5999999999958334e+01 4332 5023 1.0666666666687499e+01 4332 5020 -4.1666666666666665e-11 4332 5021 1.0666666666687499e+01 4333 4333 2.1333333333458331e+01 4334 4334 1.0666666666833333e+01 4335 4335 2.1333333333499997e+01 4335 5022 -5.3333333333229165e+00 4335 5043 5.3333333333437496e+00 4335 5024 2.0833333333333339e-11 4335 5025 -5.3333333333229165e+00 4335 4332 -1.0666666666729165e+01 4335 5029 -5.3333333333437496e+00 4335 5037 1.0666666666729165e+01 4336 4336 3.2000000000249997e+01 4337 4337 2.1333333333624999e+01 4338 4338 3.2000000000249997e+01 4339 4339 1.0666666666833333e+01 4340 4340 4.2666666667041667e+01 4340 5043 -6.2500000000000004e-11 4340 5037 1.0666666666729165e+01 4340 5029 6.2500000000000004e-11 4340 5045 -5.3333333333229165e+00 4340 5042 1.5999999999989583e+01 4340 5038 -6.2499999999999991e-11 4340 5048 -5.3333333333229165e+00 4340 5039 1.5999999999989583e+01 4340 4341 -1.0666666666687499e+01 4341 4341 3.2000000000249997e+01 4341 5050 -4.1666666666666665e-11 4341 5044 -4.1666666666666665e-11 4341 5049 1.0666666666687499e+01 4341 5045 1.0666666666687499e+01 4341 5042 -5.3333333333124999e+00 4341 5038 4.1666666666666665e-11 4341 5048 1.0666666666687499e+01 4341 5039 -5.3333333333124999e+00 4341 4340 -1.0666666666687499e+01 4342 4342 2.1333333333604166e+01 4343 4343 2.1333333333604163e+01 4344 4344 2.1333333333437498e+01 4345 4345 2.1333333333624999e+01 4346 4346 2.1333333333458331e+01 4347 4347 1.0666666666833333e+01 4348 4348 2.1333333333458331e+01 4349 4349 2.1333333333437498e+01 4350 4350 5.3333333333833323e+01 4350 5053 -1.0666666666625000e+01 4350 5057 -1.0666666666625000e+01 4350 5046 -1.0666666666833333e+01 4350 4353 -1.0666666666729165e+01 4350 5050 1.5999999999958334e+01 4350 5049 1.0666666666687499e+01 4350 5044 1.5999999999958334e+01 4350 5047 3.1999999999958334e+01 4350 4773 1.0666666666833333e+01 4350 3707 -1.0666666666625000e+01 4350 3463 -1.0666666666625000e+01 4350 5 -1.0666666666604167e+01 4350 2888 -1.0666666666729165e+01 4351 4351 1.0666666666833333e+01 4352 4352 3.2000000000249997e+01 4353 4353 2.1333333333499997e+01 4353 5057 5.3333333333437496e+00 4353 5053 5.3333333333437496e+00 4353 5047 -5.3333333333229165e+00 4353 5046 2.0833333333333345e-11 4353 5050 -5.3333333333229165e+00 4353 4350 -1.0666666666729165e+01 4353 517 5.3333333333229165e+00 4353 518 -1.0666666666729165e+01 4353 5 -5.3333333333437496e+00 4354 4354 4.2666666667041660e+01 4354 5027 -5.3333333333229165e+00 4354 5024 1.0416666666666667e-10 4354 5022 -5.3333333332812494e+00 4354 4361 -1.0666666666708332e+01 4354 5048 -5.3333333333229165e+00 4354 5038 -1.0416666666666667e-10 4354 5046 -5.3333333332812494e+00 4354 4357 -1.0666666666708332e+01 4354 5043 5.3333333333229165e+00 4354 5039 1.5999999999989583e+01 4354 5059 -2.0194839173657902e-27 4354 5040 5.3333333333229165e+00 4354 4355 6.2500000000000004e-11 4354 5041 1.5999999999989583e+01 4354 4356 -1.0666666666666666e+01 4355 4355 4.2666666667104160e+01 4355 5059 1.5999999999989583e+01 4355 4356 -1.0666666666666666e+01 4355 5057 5.3333333333229165e+00 4355 5038 5.3333333332812494e+00 4355 5046 1.4583333333333335e-10 4355 5050 -5.3333333332812494e+00 4355 4357 -1.0666666666729165e+01 4355 5041 -2.0194839173657902e-27 4355 5040 -5.3333333333229165e+00 4355 4354 6.2499999999999991e-11 4355 2319 -5.3333333333229165e+00 4355 813 1.0416666666666667e-10 4355 2318 -5.3333333332812494e+00 4355 1691 -1.0666666666708332e+01 4355 825 5.3333333333229165e+00 4355 824 1.0666666666666666e+01 4356 4356 4.2666666667270825e+01 4356 5059 -1.0666666666572915e+01 4356 4355 -1.0666666666666666e+01 4356 4706 6.2499999999999991e-11 4356 4364 4.1666666666666665e-11 4356 5024 -1.0416666666666665e-11 4356 4701 -1.0416666666666666e-11 4356 5027 6.2499999999999991e-11 4356 4707 1.0416666666666666e-11 4356 4361 4.1666666666666665e-11 4356 4710 -1.0666666666583334e+01 4356 4362 -1.0666666666666666e+01 4356 5040 -3.6295685768920020e-28 4356 5041 -1.0666666666572915e+01 4356 4354 -1.0666666666666666e+01 4356 2319 6.2499999999999991e-11 4356 813 -1.0416666666666666e-11 4356 1691 4.1666666666666665e-11 4356 2316 -1.0416666666666666e-11 4356 1979 -1.0416666666666666e-11 4356 2321 -1.0666666666583334e+01 4356 1689 -1.0666666666666666e+01 4357 4357 3.2000000000208331e+01 4357 5039 -5.3333333333124999e+00 4357 5040 2.8940292364521930e-29 4357 5038 -5.3333333332916668e+00 4357 4354 -1.0666666666708332e+01 4357 5057 -8.8938459461701536e-29 4357 4355 -1.0666666666729165e+01 4357 5046 1.0666666666625000e+01 4357 5050 5.3333333332916668e+00 4357 5048 1.0666666666687499e+01 4358 4358 2.1333333333520830e+01 4359 4359 2.1333333333604163e+01 4360 4360 2.1333333333520830e+01 4361 4361 3.2000000000229164e+01 4361 5041 -5.3333333333124999e+00 4361 5043 2.8940292364521930e-29 4361 5024 5.3333333332916668e+00 4361 4354 -1.0666666666708332e+01 4361 5022 5.3333333332916668e+00 4361 4356 4.1666666666666665e-11 4361 4710 -5.3333333333124999e+00 4361 5027 1.0666666666687499e+01 4361 4707 4.1666666666666665e-11 4361 4709 -5.3333333333124999e+00 4361 5028 1.0666666666687499e+01 4361 4362 -1.0666666666687499e+01 4362 4362 4.2666666666916662e+01 4362 4702 -5.3333333333229165e+00 4362 4701 6.2499999999999991e-11 4362 4706 -5.3333333333229165e+00 4362 4364 -1.0666666666687499e+01 4362 4710 2.1333333333312499e+01 4362 4356 -1.0666666666666666e+01 4362 5027 -5.3333333333229165e+00 4362 4707 -6.2500000000000004e-11 4362 4709 2.1333333333312499e+01 4362 5028 -5.3333333333229165e+00 4362 4361 -1.0666666666687499e+01 4363 4363 2.1333333333666662e+01 4364 4364 3.2000000000249997e+01 4364 4705 -4.1666666666666665e-11 4364 4356 4.1666666666666665e-11 4364 4706 1.0666666666687499e+01 4364 4709 -5.3333333333124999e+00 4364 4701 -4.1666666666666665e-11 4364 4710 -5.3333333333124999e+00 4364 4362 -1.0666666666687499e+01 4364 4702 1.0666666666687499e+01 4364 2321 -5.3333333333124999e+00 4364 1979 -4.1666666666666665e-11 4364 2320 -5.3333333333124999e+00 4364 1984 1.0666666666687499e+01 4364 1689 -1.0666666666687499e+01 4365 4365 2.1333333333458331e+01 4366 4366 3.2000000000249997e+01 4366 4807 -4.1666666666666665e-11 4366 5064 -5.3333333333124999e+00 4366 4812 1.0666666666687499e+01 4366 4801 -4.1666666666666665e-11 4366 4808 1.0666666666687499e+01 4366 4805 -4.1666666666666665e-11 4366 5063 -5.3333333333124999e+00 4366 4806 1.0666666666687499e+01 4366 4367 -1.0666666666687499e+01 4367 4367 4.2666666666916662e+01 4367 4812 -5.3333333333229165e+00 4367 4747 -5.3333333333229165e+00 4367 4740 6.2499999999999991e-11 4367 5064 2.1333333333312499e+01 4367 4741 -5.3333333333229165e+00 4367 4369 -1.0666666666687499e+01 4367 4805 6.2499999999999991e-11 4367 5063 2.1333333333312499e+01 4367 4806 -5.3333333333229165e+00 4367 4366 -1.0666666666687499e+01 4368 4368 2.1333333333666662e+01 4369 4369 3.2000000000249997e+01 4369 4734 -4.1666666666666665e-11 4369 4737 1.0666666666687499e+01 4369 4736 -4.1666666666666665e-11 4369 5063 -5.3333333333124999e+00 4369 4747 1.0666666666687499e+01 4369 4740 -4.1666666666666665e-11 4369 5064 -5.3333333333124999e+00 4369 4741 1.0666666666687499e+01 4369 4367 -1.0666666666687499e+01 4370 4370 2.1333333333666662e+01 4371 4371 2.1333333333458331e+01 4372 4372 1.0666666666833333e+01 4373 4373 2.1333333333458331e+01 4374 4374 1.0666666666833333e+01 4375 4375 2.1333333333458331e+01 4376 4376 2.1333333333458331e+01 4377 4377 3.2000000000249997e+01 4377 4481 1.0666666666687499e+01 4377 4475 -4.1666666666666665e-11 4377 4378 -1.0666666666687499e+01 4377 4471 -4.1666666666666665e-11 4377 5069 -5.3333333333124999e+00 4377 4476 1.0666666666687499e+01 4377 2033 5.3333333333124999e+00 4377 2035 4.1666666666666665e-11 4377 2034 -5.3333333333124999e+00 4377 1577 -1.0666666666687499e+01 4377 1573 4.1666666666666665e-11 4377 2041 5.3333333333124999e+00 4377 2042 -1.0666666666687499e+01 4378 4378 4.2666666666916662e+01 4378 4475 6.2499999999999991e-11 4378 4377 -1.0666666666687499e+01 4378 4893 6.2499999999999991e-11 4378 4380 -1.0666666666687499e+01 4378 4894 -5.3333333333229165e+00 4378 5069 2.1333333333312499e+01 4378 4476 -5.3333333333229165e+00 4378 2042 5.3333333333229165e+00 4378 2041 -2.1333333333312499e+01 4378 2040 5.3333333333229165e+00 4378 1573 -1.0666666666666666e+01 4379 4379 2.1333333333666662e+01 4380 4380 3.2000000000249997e+01 4380 4891 1.0666666666687499e+01 4380 4893 -4.1666666666666665e-11 4380 4378 -1.0666666666687499e+01 4380 4890 -4.1666666666666665e-11 4380 5069 -5.3333333333124999e+00 4380 4894 1.0666666666687499e+01 4380 2043 5.3333333333124999e+00 4380 2074 -4.1666666666666665e-11 4380 2078 -5.3333333333124999e+00 4380 1578 -1.0666666666687499e+01 4380 1573 4.1666666666666665e-11 4380 2041 5.3333333333124999e+00 4380 2040 -1.0666666666687499e+01 4381 4381 2.1333333333458331e+01 4382 4382 3.2000000000458328e+01 4383 4383 2.1333333333458331e+01 4384 4384 3.2000000000458328e+01 4385 4385 2.1343750000000000e+01 4386 4386 4.2716666666666669e+01 4386 4557 -6.2499999999999986e-03 4386 4565 1.0672916666666666e+01 4386 4554 -6.2499999999999986e-03 4386 4556 1.0666666666666666e+01 4386 4555 -6.2499999999999986e-03 4386 4564 1.0672916666666666e+01 4386 4563 -6.2499999999999986e-03 4386 4558 1.0666666666666666e+01 4387 4387 2.1354166666666668e+01 4388 4388 2.1362499999999997e+01 4389 4389 2.1343750000000000e+01 4390 4390 2.1354166666666668e+01 4391 4391 2.1343750000000000e+01 4392 4392 2.1362499999999997e+01 4393 4393 2.1343750000000000e+01 4394 4394 4.2666666667333331e+01 4394 4260 -4.1666666666666665e-11 4394 4401 -1.0666666666666666e+01 4394 4405 -1.0666666666666666e+01 4394 3747 -4.1666666666666665e-11 4394 3764 -4.1666666666666665e-11 4394 4407 -1.0666666666666666e+01 4394 3710 -4.1666666666666665e-11 4394 4395 -1.0666666666666666e+01 4395 4395 4.2666666666916662e+01 4395 4396 -1.0666666666666666e+01 4395 3764 1.0666666666687499e+01 4395 4394 -1.0666666666666666e+01 4395 3710 1.0666666666687499e+01 4396 4396 4.2666666667333331e+01 4396 3764 -4.1666666666666665e-11 4396 4395 -1.0666666666666666e+01 4396 4399 -1.0666666666666666e+01 4396 4212 -4.1666666666666665e-11 4396 4227 -4.1666666666666665e-11 4396 4409 -1.0666666666666666e+01 4396 3710 -4.1666666666666665e-11 4396 4397 -1.0666666666666666e+01 4397 4397 4.2666666666916662e+01 4397 3715 -5.3333333333229165e+00 4397 4829 2.1333333333312499e+01 4397 4400 -1.0666666666666666e+01 4397 4238 -5.3333333333229165e+00 4397 4227 1.0666666666687499e+01 4397 4396 -1.0666666666666666e+01 4397 3710 1.0666666666687499e+01 4398 4398 4.2666666667333331e+01 4398 3737 -1.0416666666666666e-11 4398 4210 -1.0416666666666666e-11 4398 4208 6.2499999999999991e-11 4398 4212 -4.1666666666666665e-11 4398 4416 1.0666666666583334e+01 4398 4408 -1.0666666666666666e+01 4398 3750 -1.0416666666666666e-11 4398 3748 6.2499999999999991e-11 4398 3747 -4.1666666666666665e-11 4398 4414 1.0666666666583334e+01 4398 4407 -1.0666666666666666e+01 4398 3723 -1.0416666666666666e-11 4398 3722 6.2499999999999991e-11 4398 3721 -4.1666666666666665e-11 4398 4415 1.0666666666583334e+01 4398 4406 -1.0666666666666666e+01 4398 3765 6.2499999999999991e-11 4398 3764 -4.1666666666666665e-11 4398 4412 1.0666666666583334e+01 4398 4399 -1.0666666666666666e+01 4399 4399 4.2666666666916662e+01 4399 4208 -5.3333333333229165e+00 4399 4396 -1.0666666666666666e+01 4399 4212 1.0666666666687499e+01 4399 4412 -2.1333333333312499e+01 4399 4398 -1.0666666666666666e+01 4399 3765 -5.3333333333229165e+00 4399 3764 1.0666666666687499e+01 4400 4400 4.2666666667333331e+01 4400 4228 -1.0416666666666666e-11 4400 4238 6.2499999999999991e-11 4400 4227 -4.1666666666666665e-11 4400 4829 -1.0666666666583334e+01 4400 4397 -1.0666666666666666e+01 4400 3898 -1.0416666666666666e-11 4400 4868 -1.0666666666583334e+01 4400 4403 -1.0666666666666666e+01 4400 3901 -1.0416666666666666e-11 4400 3902 6.2499999999999991e-11 4400 3899 -4.1666666666666665e-11 4400 4259 -1.0416666666666666e-11 4400 4266 6.2499999999999991e-11 4400 4260 -4.1666666666666665e-11 4400 4874 -1.0666666666583334e+01 4400 4411 -1.0666666666666666e+01 4400 3715 6.2499999999999991e-11 4400 3710 -4.1666666666666665e-11 4400 4876 1.0666666666583334e+01 4400 4401 -1.0666666666666666e+01 4401 4401 4.2666666666916662e+01 4401 4394 -1.0666666666666666e+01 4401 4266 -5.3333333333229165e+00 4401 4260 1.0666666666687499e+01 4401 4876 -2.1333333333312499e+01 4401 4400 -1.0666666666666666e+01 4401 3715 -5.3333333333229165e+00 4401 3710 1.0666666666687499e+01 4402 4402 4.2666666667333331e+01 4402 3898 -1.0416666666666666e-11 4402 3740 -1.0416666666666666e-11 4402 3891 -1.0416666666666666e-11 4402 3897 6.2499999999999991e-11 4402 3899 -4.1666666666666665e-11 4402 4824 1.0666666666583334e+01 4402 4410 -1.0666666666666666e+01 4402 4210 -1.0416666666666666e-11 4402 4213 6.2499999999999991e-11 4402 4212 -4.1666666666666665e-11 4402 4822 1.0666666666583334e+01 4402 4409 -1.0666666666666666e+01 4402 3737 -1.0416666666666666e-11 4402 3738 6.2499999999999991e-11 4402 3721 -4.1666666666666665e-11 4402 4815 -1.0666666666583334e+01 4402 4408 -1.0666666666666666e+01 4402 4228 -1.0416666666666666e-11 4402 4225 6.2499999999999991e-11 4402 4227 -4.1666666666666665e-11 4402 4823 1.0666666666583334e+01 4402 4403 -1.0666666666666666e+01 4403 4403 4.2666666666916662e+01 4403 3897 -5.3333333333229165e+00 4403 4238 -5.3333333333229165e+00 4403 3898 6.2500000000000004e-11 4403 4868 2.1333333333312499e+01 4403 4400 -1.0666666666666666e+01 4403 3902 -5.3333333333229165e+00 4403 3899 1.0666666666687499e+01 4403 4228 6.2500000000000004e-11 4403 4823 -2.1333333333312499e+01 4403 4402 -1.0666666666666666e+01 4403 4225 -5.3333333333229165e+00 4403 4227 1.0666666666687499e+01 4404 4404 4.2666666667333331e+01 4404 3723 -1.0416666666666666e-11 4404 3750 -1.0416666666666666e-11 4404 3761 6.2499999999999991e-11 4404 3747 -4.1666666666666665e-11 4404 4425 -1.0666666666583334e+01 4404 4406 -1.0666666666666666e+01 4404 3891 -1.0416666666666666e-11 4404 4259 -1.0416666666666666e-11 4404 3901 -1.0416666666666666e-11 4404 3900 6.2499999999999991e-11 4404 3899 -4.1666666666666665e-11 4404 4870 1.0666666666583334e+01 4404 4411 -1.0666666666666666e+01 4404 3740 -1.0416666666666666e-11 4404 3741 6.2499999999999991e-11 4404 3721 -4.1666666666666665e-11 4404 4854 -1.0666666666583334e+01 4404 4410 -1.0666666666666666e+01 4404 4258 6.2499999999999991e-11 4404 4260 -4.1666666666666665e-11 4404 4871 1.0666666666583334e+01 4404 4405 -1.0666666666666666e+01 4405 4405 4.2666666666916662e+01 4405 3761 -5.3333333333229165e+00 4405 4394 -1.0666666666666666e+01 4405 3747 1.0666666666687499e+01 4405 4871 -2.1333333333312499e+01 4405 4404 -1.0666666666666666e+01 4405 4258 -5.3333333333229165e+00 4405 4260 1.0666666666687499e+01 4406 4406 4.2666666666916662e+01 4406 3741 -5.3333333333229165e+00 4406 4425 2.1333333333312499e+01 4406 4404 -1.0666666666666666e+01 4406 3761 -5.3333333333229165e+00 4406 3750 6.2499999999999991e-11 4406 3748 -5.3333333333229165e+00 4406 3747 1.0666666666687499e+01 4406 3723 6.2499999999999991e-11 4406 4415 -2.1333333333312499e+01 4406 4398 -1.0666666666666666e+01 4406 3722 -5.3333333333229165e+00 4406 3721 1.0666666666687499e+01 4407 4407 4.2666666666916662e+01 4407 4394 -1.0666666666666666e+01 4407 3765 -5.3333333333229165e+00 4407 3764 1.0666666666687499e+01 4407 4414 -2.1333333333312499e+01 4407 4398 -1.0666666666666666e+01 4407 3748 -5.3333333333229165e+00 4407 3747 1.0666666666687499e+01 4408 4408 4.2666666666916662e+01 4408 3722 -5.3333333333229165e+00 4408 4416 -2.1333333333312499e+01 4408 4398 -1.0666666666666666e+01 4408 4208 -5.3333333333229165e+00 4408 4210 6.2500000000000004e-11 4408 4213 -5.3333333333229165e+00 4408 4212 1.0666666666687499e+01 4408 3737 6.2500000000000004e-11 4408 4815 2.1333333333312499e+01 4408 4402 -1.0666666666666666e+01 4408 3738 -5.3333333333229165e+00 4408 3721 1.0666666666687499e+01 4409 4409 4.2666666666916662e+01 4409 4396 -1.0666666666666666e+01 4409 4225 -5.3333333333229165e+00 4409 4227 1.0666666666687499e+01 4409 4822 -2.1333333333312499e+01 4409 4402 -1.0666666666666666e+01 4409 4213 -5.3333333333229165e+00 4409 4212 1.0666666666687499e+01 4410 4410 4.2666666666916662e+01 4410 3738 -5.3333333333229165e+00 4410 4824 -2.1333333333312499e+01 4410 4402 -1.0666666666666666e+01 4410 3897 -5.3333333333229165e+00 4410 3891 6.2499999999999991e-11 4410 3900 -5.3333333333229165e+00 4410 3899 1.0666666666687499e+01 4410 3740 6.2500000000000004e-11 4410 4854 2.1333333333312499e+01 4410 4404 -1.0666666666666666e+01 4410 3741 -5.3333333333229165e+00 4410 3721 1.0666666666687499e+01 4411 4411 4.2666666666916662e+01 4411 3902 -5.3333333333229165e+00 4411 4874 2.1333333333312499e+01 4411 4400 -1.0666666666666666e+01 4411 4266 -5.3333333333229165e+00 4411 4259 6.2499999999999991e-11 4411 4258 -5.3333333333229165e+00 4411 4260 1.0666666666687499e+01 4411 3901 6.2499999999999991e-11 4411 4870 -2.1333333333312499e+01 4411 4404 -1.0666666666666666e+01 4411 3900 -5.3333333333229165e+00 4411 3899 1.0666666666687499e+01 4412 4412 6.4000000000416662e+01 4412 4212 -5.3333333333124999e+00 4412 3767 -5.3333333333124999e+00 4412 4810 -2.1333333333312499e+01 4412 4413 -1.0666666666583334e+01 4412 4208 2.1333333333312499e+01 4412 4207 -5.3333333333124999e+00 4412 4399 -2.1333333333312499e+01 4412 4398 1.0666666666583334e+01 4412 3765 2.1333333333312499e+01 4412 3764 -5.3333333333124999e+00 4413 4413 4.2666666667333331e+01 4413 3723 1.0416666666666666e-11 4413 3750 1.0416666666666666e-11 4413 3748 -6.2499999999999991e-11 4413 3756 4.1666666666666665e-11 4413 4415 -1.0666666666583334e+01 4413 4422 -1.0666666666666666e+01 4413 4210 1.0416666666666666e-11 4413 4208 -6.2499999999999991e-11 4413 4207 4.1666666666666665e-11 4413 4412 -1.0666666666583334e+01 4413 4810 1.0666666666666666e+01 4413 3737 1.0416666666666666e-11 4413 3722 -6.2499999999999991e-11 4413 3736 4.1666666666666665e-11 4413 4416 -1.0666666666583334e+01 4413 4809 1.0666666666666666e+01 4413 3765 -6.2499999999999991e-11 4413 3767 4.1666666666666665e-11 4413 4414 -1.0666666666583334e+01 4413 4417 -1.0666666666666666e+01 4414 4414 6.4000000000416662e+01 4414 3756 -5.3333333333124999e+00 4414 3764 -5.3333333333124999e+00 4414 4407 -2.1333333333312499e+01 4414 4398 1.0666666666583334e+01 4414 3748 2.1333333333312499e+01 4414 3747 -5.3333333333124999e+00 4414 4417 2.1333333333312499e+01 4414 4413 -1.0666666666583334e+01 4414 3765 2.1333333333312499e+01 4414 3767 -5.3333333333124999e+00 4415 4415 6.4000000000416662e+01 4415 3736 -5.3333333333124999e+00 4415 4422 2.1333333333312499e+01 4415 4413 -1.0666666666583334e+01 4415 3756 -5.3333333333124999e+00 4415 3750 -1.0666666666583334e+01 4415 3748 2.1333333333312499e+01 4415 3747 -5.3333333333124999e+00 4415 4406 -2.1333333333312499e+01 4415 4398 1.0666666666583334e+01 4415 3723 -1.0666666666583334e+01 4415 3722 2.1333333333312499e+01 4415 3721 -5.3333333333124999e+00 4416 4416 6.4000000000416662e+01 4416 3721 -5.3333333333124999e+00 4416 4408 -2.1333333333312499e+01 4416 4398 1.0666666666583334e+01 4416 4212 -5.3333333333124999e+00 4416 4210 -1.0666666666583334e+01 4416 4208 2.1333333333312499e+01 4416 4207 -5.3333333333124999e+00 4416 4809 -2.1333333333312499e+01 4416 4413 -1.0666666666583334e+01 4416 3737 -1.0666666666583334e+01 4416 3722 2.1333333333312499e+01 4416 3736 -5.3333333333124999e+00 4417 4417 4.2666666666916662e+01 4417 3748 5.3333333333229165e+00 4417 4803 1.0666666666666666e+01 4417 3756 -1.0666666666687499e+01 4417 4414 2.1333333333312499e+01 4417 4413 -1.0666666666666666e+01 4417 3765 5.3333333333229165e+00 4417 3767 -1.0666666666687499e+01 4418 4418 3.2000000000208331e+01 4419 4419 3.2000000000208331e+01 4420 4420 4.2666666666916662e+01 4420 3732 5.3333333333229165e+00 4420 4423 -2.1333333333312499e+01 4420 4473 1.0666666666666666e+01 4420 3757 5.3333333333229165e+00 4420 3750 -6.2499999999999991e-11 4420 3753 5.3333333333229165e+00 4420 3752 -1.0666666666687499e+01 4420 3723 -6.2499999999999991e-11 4420 4421 -2.1333333333312499e+01 4420 4477 1.0666666666666666e+01 4420 3728 5.3333333333229165e+00 4420 3727 -1.0666666666687499e+01 4421 4421 6.4000000000416662e+01 4421 3739 5.3333333333124999e+00 4421 4424 -2.1333333333312499e+01 4421 4482 -1.0666666666583334e+01 4421 3760 5.3333333333124999e+00 4421 3750 1.0666666666583334e+01 4421 3753 -2.1333333333312499e+01 4421 3752 5.3333333333124999e+00 4421 4420 -2.1333333333312499e+01 4421 4477 -1.0666666666583334e+01 4421 3723 1.0666666666583334e+01 4421 3728 -2.1333333333312499e+01 4421 3727 5.3333333333124999e+00 4422 4422 4.2666666666916662e+01 4422 3722 5.3333333333229165e+00 4422 4415 2.1333333333312499e+01 4422 4413 -1.0666666666666666e+01 4422 3748 5.3333333333229165e+00 4422 3750 -6.2499999999999991e-11 4422 3757 5.3333333333229165e+00 4422 3756 -1.0666666666687499e+01 4422 3723 -6.2499999999999991e-11 4422 4423 -2.1333333333312499e+01 4422 4719 -1.0666666666666666e+01 4422 3732 5.3333333333229165e+00 4422 3736 -1.0666666666687499e+01 4423 4423 6.4000000000416662e+01 4423 3727 5.3333333333124999e+00 4423 4420 -2.1333333333312499e+01 4423 4473 -1.0666666666583334e+01 4423 3752 5.3333333333124999e+00 4423 3750 1.0666666666583334e+01 4423 3757 -2.1333333333312499e+01 4423 3756 5.3333333333124999e+00 4423 4422 -2.1333333333312499e+01 4423 4719 1.0666666666583334e+01 4423 3723 1.0666666666583334e+01 4423 3732 -2.1333333333312499e+01 4423 3736 5.3333333333124999e+00 4424 4424 4.2666666666916662e+01 4424 3728 5.3333333333229165e+00 4424 4421 -2.1333333333312499e+01 4424 4482 1.0666666666666666e+01 4424 3753 5.3333333333229165e+00 4424 3750 -6.2499999999999991e-11 4424 3761 5.3333333333229165e+00 4424 3760 -1.0666666666687499e+01 4424 3723 -6.2499999999999991e-11 4424 4425 -2.1333333333312499e+01 4424 4840 1.0666666666666666e+01 4424 3741 5.3333333333229165e+00 4424 3739 -1.0666666666687499e+01 4425 4425 6.4000000000416662e+01 4425 3721 5.3333333333124999e+00 4425 4406 2.1333333333312499e+01 4425 4404 -1.0666666666583334e+01 4425 3747 5.3333333333124999e+00 4425 3750 1.0666666666583334e+01 4425 3761 -2.1333333333312499e+01 4425 3760 5.3333333333124999e+00 4425 4424 -2.1333333333312499e+01 4425 4840 -1.0666666666583334e+01 4425 3723 1.0666666666583334e+01 4425 3741 -2.1333333333312499e+01 4425 3739 5.3333333333124999e+00 4426 4426 3.2000000000208331e+01 4427 4427 3.2000000000208331e+01 4428 4428 3.2000000000208331e+01 4429 4429 3.2000000000208331e+01 4430 4430 4.2666666667333331e+01 4430 3968 -1.0416666666666666e-11 4430 3780 -1.0416666666666666e-11 4430 3977 -1.0416666666666666e-11 4430 3976 6.2499999999999991e-11 4430 3966 -4.1666666666666665e-11 4430 4462 1.0666666666583334e+01 4430 4439 -1.0666666666666666e+01 4430 3791 -1.0416666666666666e-11 4430 4461 1.0666666666583334e+01 4430 4437 -1.0666666666666666e+01 4430 3807 -1.0416666666666666e-11 4430 3785 -1.0416666666666666e-11 4430 3784 6.2499999999999991e-11 4430 3786 -4.1666666666666665e-11 4430 3797 -1.0416666666666666e-11 4430 3806 6.2499999999999991e-11 4430 3793 -4.1666666666666665e-11 4430 4455 -1.0666666666583334e+01 4430 4443 -1.0666666666666666e+01 4430 3777 -1.0416666666666666e-11 4430 3776 6.2499999999999991e-11 4430 3775 -4.1666666666666665e-11 4430 4459 1.0666666666583334e+01 4430 4431 -1.0666666666666666e+01 4431 4431 4.2666666666916662e+01 4431 3778 -5.3333333333229165e+00 4431 4464 2.1333333333312499e+01 4431 4432 -1.0666666666666666e+01 4431 3810 -5.3333333333229165e+00 4431 3807 6.2499999999999991e-11 4431 3806 -5.3333333333229165e+00 4431 3793 1.0666666666687499e+01 4431 3777 6.2499999999999991e-11 4431 4459 -2.1333333333312499e+01 4431 4430 -1.0666666666666666e+01 4431 3776 -5.3333333333229165e+00 4431 3775 1.0666666666687499e+01 4432 4432 4.2666666667333331e+01 4432 3795 -1.0416666666666666e-11 4432 3777 -1.0416666666666666e-11 4432 3807 -1.0416666666666666e-11 4432 3810 6.2499999999999991e-11 4432 3793 -4.1666666666666665e-11 4432 4464 -1.0666666666583334e+01 4432 4431 -1.0666666666666666e+01 4432 3890 -1.0416666666666666e-11 4432 4852 -1.0666666666583334e+01 4432 4435 -1.0666666666666666e+01 4432 3885 -1.0416666666666666e-11 4432 3895 6.2499999999999991e-11 4432 3893 -4.1666666666666665e-11 4432 3865 -1.0416666666666666e-11 4432 3870 6.2499999999999991e-11 4432 3866 -4.1666666666666665e-11 4432 4538 -1.0666666666583334e+01 4432 4445 -1.0666666666666666e+01 4432 3778 6.2499999999999991e-11 4432 3775 -4.1666666666666665e-11 4432 4864 1.0666666666583334e+01 4432 4433 -1.0666666666666666e+01 4432 2760 -1.0416666666666666e-11 4432 2409 -1.0416666666666666e-11 4433 4433 4.2666666666916662e+01 4433 3779 -5.3333333333229165e+00 4433 4866 2.1333333333312499e+01 4433 4438 -1.0666666666666666e+01 4433 3871 -5.3333333333229165e+00 4433 3870 -5.3333333333229165e+00 4433 3866 1.0666666666687499e+01 4433 4864 -2.1333333333312499e+01 4433 4432 -1.0666666666666666e+01 4433 3778 -5.3333333333229165e+00 4433 3775 1.0666666666687499e+01 4433 2760 6.2500000000000004e-11 4433 2409 6.2500000000000004e-11 4434 4434 4.2666666667333331e+01 4434 3890 -1.0416666666666666e-11 4434 3740 -1.0416666666666666e-11 4434 3891 -1.0416666666666666e-11 4434 3889 6.2499999999999991e-11 4434 3893 -4.1666666666666665e-11 4434 4452 1.0666666666583334e+01 4434 4444 -1.0666666666666666e+01 4434 3788 -1.0416666666666666e-11 4434 3797 -1.0416666666666666e-11 4434 3785 -1.0416666666666666e-11 4434 3787 6.2499999999999991e-11 4434 3786 -4.1666666666666665e-11 4434 4450 1.0666666666583334e+01 4434 4443 -1.0666666666666666e+01 4434 3726 -1.0416666666666666e-11 4434 3725 6.2499999999999991e-11 4434 3724 -4.1666666666666665e-11 4434 4451 1.0666666666583334e+01 4434 4442 -1.0666666666666666e+01 4434 3795 -1.0416666666666666e-11 4434 3794 6.2499999999999991e-11 4434 3793 -4.1666666666666665e-11 4434 4448 1.0666666666583334e+01 4434 4435 -1.0666666666666666e+01 4435 4435 4.2666666666916662e+01 4435 3889 -5.3333333333229165e+00 4435 3810 -5.3333333333229165e+00 4435 3890 6.2500000000000004e-11 4435 4852 2.1333333333312499e+01 4435 4432 -1.0666666666666666e+01 4435 3895 -5.3333333333229165e+00 4435 3893 1.0666666666687499e+01 4435 3795 6.2500000000000004e-11 4435 4448 -2.1333333333312499e+01 4435 4434 -1.0666666666666666e+01 4435 3794 -5.3333333333229165e+00 4435 3793 1.0666666666687499e+01 4436 4436 4.2666666667333331e+01 4436 3840 -1.0416666666666666e-11 4436 3970 -1.0416666666666666e-11 4436 3844 -1.0416666666666666e-11 4436 3848 6.2499999999999991e-11 4436 3847 -4.1666666666666665e-11 4436 4601 -1.0666666666583334e+01 4436 4447 -1.0666666666666666e+01 4436 3731 -1.0416666666666666e-11 4436 4517 -1.0666666666583334e+01 4436 4446 -1.0666666666666666e+01 4436 3791 -1.0416666666666666e-11 4436 3726 -1.0416666666666666e-11 4436 3742 6.2499999999999991e-11 4436 3724 -4.1666666666666665e-11 4436 3788 -1.0416666666666666e-11 4436 3792 6.2499999999999991e-11 4436 3786 -4.1666666666666665e-11 4436 4458 1.0666666666583334e+01 4436 4442 -1.0666666666666666e+01 4436 3968 -1.0416666666666666e-11 4436 3967 6.2499999999999991e-11 4436 3966 -4.1666666666666665e-11 4436 4887 1.0666666666583334e+01 4436 4437 -1.0666666666666666e+01 4437 4437 4.2666666666916662e+01 4437 3792 -5.3333333333229165e+00 4437 3976 -5.3333333333229165e+00 4437 3791 6.2499999999999991e-11 4437 4461 -2.1333333333312499e+01 4437 4430 -1.0666666666666666e+01 4437 3784 -5.3333333333229165e+00 4437 3786 1.0666666666687499e+01 4437 3968 6.2499999999999991e-11 4437 4887 -2.1333333333312499e+01 4437 4436 -1.0666666666666666e+01 4437 3967 -5.3333333333229165e+00 4437 3966 1.0666666666687499e+01 4438 4438 4.2666666667333331e+01 4438 3867 -1.0416666666666666e-11 4438 3871 6.2499999999999991e-11 4438 3866 -4.1666666666666665e-11 4438 4866 -1.0666666666583334e+01 4438 4433 -1.0666666666666666e+01 4438 3839 -1.0416666666666666e-11 4438 4515 -1.0666666666583334e+01 4438 4441 -1.0666666666666666e+01 4438 3977 -1.0416666666666666e-11 4438 3844 -1.0416666666666666e-11 4438 3849 6.2499999999999991e-11 4438 3847 -4.1666666666666665e-11 4438 3970 -1.0416666666666666e-11 4438 3978 6.2499999999999991e-11 4438 3966 -4.1666666666666665e-11 4438 4604 -1.0666666666583334e+01 4438 4447 -1.0666666666666666e+01 4438 3780 -1.0416666666666666e-11 4438 3779 6.2499999999999991e-11 4438 3775 -4.1666666666666665e-11 4438 4885 -1.0666666666583334e+01 4438 4439 -1.0666666666666666e+01 4438 2409 -1.0416666666666666e-11 4438 2760 -1.0416666666666666e-11 4439 4439 4.2666666666916662e+01 4439 3978 -5.3333333333229165e+00 4439 3776 -5.3333333333229165e+00 4439 3977 6.2500000000000004e-11 4439 4462 -2.1333333333312499e+01 4439 4430 -1.0666666666666666e+01 4439 3976 -5.3333333333229165e+00 4439 3966 1.0666666666687499e+01 4439 3780 6.2499999999999991e-11 4439 4885 2.1333333333312499e+01 4439 4438 -1.0666666666666666e+01 4439 3779 -5.3333333333229165e+00 4439 3775 1.0666666666687499e+01 4440 4440 4.2666666667333331e+01 4440 3839 -1.0416666666666666e-11 4440 3731 -1.0416666666666666e-11 4440 3840 -1.0416666666666666e-11 4440 3838 6.2499999999999991e-11 4440 3847 -4.1666666666666665e-11 4440 4510 1.0666666666583334e+01 4440 4446 -1.0666666666666666e+01 4440 3891 -1.0416666666666666e-11 4440 3865 -1.0416666666666666e-11 4440 3885 -1.0416666666666666e-11 4440 3894 6.2499999999999991e-11 4440 3893 -4.1666666666666665e-11 4440 4508 1.0666666666583334e+01 4440 4445 -1.0666666666666666e+01 4440 3740 -1.0416666666666666e-11 4440 3730 6.2499999999999991e-11 4440 3724 -4.1666666666666665e-11 4440 4511 1.0666666666583334e+01 4440 4444 -1.0666666666666666e+01 4440 3867 -1.0416666666666666e-11 4440 3864 6.2499999999999991e-11 4440 3866 -4.1666666666666665e-11 4440 4509 1.0666666666583334e+01 4440 4441 -1.0666666666666666e+01 4441 4441 4.2666666666916662e+01 4441 3838 -5.3333333333229165e+00 4441 3871 -5.3333333333229165e+00 4441 3839 6.2499999999999991e-11 4441 4515 2.1333333333312499e+01 4441 4438 -1.0666666666666666e+01 4441 3849 -5.3333333333229165e+00 4441 3847 1.0666666666687499e+01 4441 3867 6.2500000000000004e-11 4441 4509 -2.1333333333312499e+01 4441 4440 -1.0666666666666666e+01 4441 3864 -5.3333333333229165e+00 4441 3866 1.0666666666687499e+01 4442 4442 4.2666666666916662e+01 4442 3742 -5.3333333333229165e+00 4442 4458 -2.1333333333312499e+01 4442 4436 -1.0666666666666666e+01 4442 3792 -5.3333333333229165e+00 4442 3788 6.2500000000000004e-11 4442 3787 -5.3333333333229165e+00 4442 3786 1.0666666666687499e+01 4442 3726 6.2500000000000004e-11 4442 4451 -2.1333333333312499e+01 4442 4434 -1.0666666666666666e+01 4442 3725 -5.3333333333229165e+00 4442 3724 1.0666666666687499e+01 4443 4443 4.2666666666916662e+01 4443 3784 -5.3333333333229165e+00 4443 4455 2.1333333333312499e+01 4443 4430 -1.0666666666666666e+01 4443 3806 -5.3333333333229165e+00 4443 3797 6.2500000000000004e-11 4443 3794 -5.3333333333229165e+00 4443 3793 1.0666666666687499e+01 4443 3785 6.2499999999999991e-11 4443 4450 -2.1333333333312499e+01 4443 4434 -1.0666666666666666e+01 4443 3787 -5.3333333333229165e+00 4443 3786 1.0666666666687499e+01 4444 4444 4.2666666666916662e+01 4444 3725 -5.3333333333229165e+00 4444 4452 -2.1333333333312499e+01 4444 4434 -1.0666666666666666e+01 4444 3889 -5.3333333333229165e+00 4444 3891 6.2499999999999991e-11 4444 3894 -5.3333333333229165e+00 4444 3893 1.0666666666687499e+01 4444 3740 6.2500000000000004e-11 4444 4511 -2.1333333333312499e+01 4444 4440 -1.0666666666666666e+01 4444 3730 -5.3333333333229165e+00 4444 3724 1.0666666666687499e+01 4445 4445 4.2666666666916662e+01 4445 3895 -5.3333333333229165e+00 4445 4538 2.1333333333312499e+01 4445 4432 -1.0666666666666666e+01 4445 3870 -5.3333333333229165e+00 4445 3865 6.2499999999999991e-11 4445 3864 -5.3333333333229165e+00 4445 3866 1.0666666666687499e+01 4445 3885 6.2499999999999991e-11 4445 4508 -2.1333333333312499e+01 4445 4440 -1.0666666666666666e+01 4445 3894 -5.3333333333229165e+00 4445 3893 1.0666666666687499e+01 4446 4446 4.2666666666916662e+01 4446 3730 -5.3333333333229165e+00 4446 4510 -2.1333333333312499e+01 4446 4440 -1.0666666666666666e+01 4446 3838 -5.3333333333229165e+00 4446 3840 6.2499999999999991e-11 4446 3848 -5.3333333333229165e+00 4446 3847 1.0666666666687499e+01 4446 3731 6.2499999999999991e-11 4446 4517 2.1333333333312499e+01 4446 4436 -1.0666666666666666e+01 4446 3742 -5.3333333333229165e+00 4446 3724 1.0666666666687499e+01 4447 4447 4.2666666666916662e+01 4447 3849 -5.3333333333229165e+00 4447 4604 2.1333333333312499e+01 4447 4438 -1.0666666666666666e+01 4447 3978 -5.3333333333229165e+00 4447 3970 6.2500000000000004e-11 4447 3967 -5.3333333333229165e+00 4447 3966 1.0666666666687499e+01 4447 3844 6.2500000000000004e-11 4447 4601 2.1333333333312499e+01 4447 4436 -1.0666666666666666e+01 4447 3848 -5.3333333333229165e+00 4447 3847 1.0666666666687499e+01 4448 4448 6.4000000000416662e+01 4448 3893 -5.3333333333124999e+00 4448 3796 -5.3333333333124999e+00 4448 4845 -2.1333333333312499e+01 4448 4449 -1.0666666666583334e+01 4448 3890 -1.0666666666583334e+01 4448 3889 2.1333333333312499e+01 4448 3888 -5.3333333333124999e+00 4448 4435 -2.1333333333312499e+01 4448 4434 1.0666666666583334e+01 4448 3795 -1.0666666666583334e+01 4448 3794 2.1333333333312499e+01 4448 3793 -5.3333333333124999e+00 4449 4449 4.2666666667333331e+01 4449 3785 1.0416666666666666e-11 4449 3726 1.0416666666666666e-11 4449 3788 1.0416666666666666e-11 4449 3787 -6.2499999999999991e-11 4449 3789 4.1666666666666665e-11 4449 4451 -1.0666666666583334e+01 4449 4457 1.0666666666666666e+01 4449 3891 1.0416666666666666e-11 4449 3795 1.0416666666666666e-11 4449 3890 1.0416666666666666e-11 4449 3889 -6.2499999999999991e-11 4449 3888 4.1666666666666665e-11 4449 4448 -1.0666666666583334e+01 4449 4845 1.0666666666666666e+01 4449 3740 1.0416666666666666e-11 4449 3725 -6.2499999999999991e-11 4449 3739 4.1666666666666665e-11 4449 4452 -1.0666666666583334e+01 4449 4844 1.0666666666666666e+01 4449 3797 1.0416666666666666e-11 4449 3794 -6.2499999999999991e-11 4449 3796 4.1666666666666665e-11 4449 4450 -1.0666666666583334e+01 4449 4453 -1.0666666666666666e+01 4450 4450 6.4000000000416662e+01 4450 3789 -5.3333333333124999e+00 4450 3793 -5.3333333333124999e+00 4450 4443 -2.1333333333312499e+01 4450 4434 1.0666666666583334e+01 4450 3785 -1.0666666666583334e+01 4450 3787 2.1333333333312499e+01 4450 3786 -5.3333333333124999e+00 4450 4453 2.1333333333312499e+01 4450 4449 -1.0666666666583334e+01 4450 3797 -1.0666666666583334e+01 4450 3794 2.1333333333312499e+01 4450 3796 -5.3333333333124999e+00 4451 4451 6.4000000000416662e+01 4451 3739 -5.3333333333124999e+00 4451 4457 -2.1333333333312499e+01 4451 4449 -1.0666666666583334e+01 4451 3789 -5.3333333333124999e+00 4451 3788 -1.0666666666583334e+01 4451 3787 2.1333333333312499e+01 4451 3786 -5.3333333333124999e+00 4451 4442 -2.1333333333312499e+01 4451 4434 1.0666666666583334e+01 4451 3726 -1.0666666666583334e+01 4451 3725 2.1333333333312499e+01 4451 3724 -5.3333333333124999e+00 4452 4452 6.4000000000416662e+01 4452 3724 -5.3333333333124999e+00 4452 4444 -2.1333333333312499e+01 4452 4434 1.0666666666583334e+01 4452 3893 -5.3333333333124999e+00 4452 3891 -1.0666666666583334e+01 4452 3889 2.1333333333312499e+01 4452 3888 -5.3333333333124999e+00 4452 4844 -2.1333333333312499e+01 4452 4449 -1.0666666666583334e+01 4452 3740 -1.0666666666583334e+01 4452 3725 2.1333333333312499e+01 4452 3739 -5.3333333333124999e+00 4453 4453 4.2666666666916662e+01 4453 3787 5.3333333333229165e+00 4453 3811 5.3333333333229165e+00 4453 3785 -6.2500000000000004e-11 4453 4456 2.1333333333312499e+01 4453 4846 1.0666666666666666e+01 4453 3790 5.3333333333229165e+00 4453 3789 -1.0666666666687499e+01 4453 3797 -6.2499999999999991e-11 4453 4450 2.1333333333312499e+01 4453 4449 -1.0666666666666666e+01 4453 3794 5.3333333333229165e+00 4453 3796 -1.0666666666687499e+01 4454 4454 4.2666666667083334e+01 4454 3790 -3.6295685768920020e-28 4454 3785 -1.0666666666562499e+01 4454 3783 1.0666666666666666e+01 4454 3811 1.8812360437258079e-27 4454 3797 -1.0666666666562499e+01 4454 3816 1.0666666666666666e+01 4454 4456 -1.0666666666562499e+01 4454 3806 -1.8812360437258079e-27 4454 3784 -2.2851328271989659e-27 4454 4455 1.0666666666562499e+01 4454 4460 -1.0666666666666666e+01 4454 1774 -1.0666666666666666e+01 4455 4455 5.3333333333749998e+01 4455 3816 1.8812360437258079e-27 4455 3786 5.3333333333124999e+00 4455 4443 2.1333333333312499e+01 4455 4430 -1.0666666666583334e+01 4455 3797 1.0666666666572917e+01 4455 3806 -1.5999999999989583e+01 4455 3793 5.3333333333124999e+00 4455 3783 1.8812360437258079e-27 4455 4454 1.0666666666562499e+01 4455 4460 -1.0666666666666666e+01 4455 3785 1.0666666666572915e+01 4455 3784 -1.5999999999989583e+01 4456 4456 5.3333333333749998e+01 4456 3783 1.8812360437258079e-27 4456 3785 -1.0666666666572915e+01 4456 3790 1.5999999999989583e+01 4456 3816 3.6295685768920020e-28 4456 4454 -1.0666666666562499e+01 4456 3797 -1.0666666666572915e+01 4456 3811 1.5999999999989583e+01 4456 3796 -5.3333333333124999e+00 4456 4453 2.1333333333312499e+01 4456 4846 1.0666666666583334e+01 4456 3789 -5.3333333333124999e+00 4456 1774 1.0666666666666666e+01 4457 4457 4.2666666666916662e+01 4457 3788 6.2500000000000004e-11 4457 3789 1.0666666666687499e+01 4457 3726 6.2500000000000004e-11 4457 4482 -1.0666666666666666e+01 4457 3728 -5.3333333333229165e+00 4457 3739 1.0666666666687499e+01 4457 3725 -5.3333333333229165e+00 4457 4451 -2.1333333333312499e+01 4457 4449 1.0666666666666666e+01 4457 3787 -5.3333333333229165e+00 4457 1240 -5.3333333333229165e+00 4457 2060 -2.1333333333312499e+01 4458 4458 6.4000000000416662e+01 4458 3788 -1.0666666666583334e+01 4458 3792 2.1333333333312499e+01 4458 4888 1.0666666666583334e+01 4458 3726 -1.0666666666583334e+01 4458 3742 2.1333333333312499e+01 4458 3743 -5.3333333333124999e+00 4458 3724 -5.3333333333124999e+00 4458 4442 -2.1333333333312499e+01 4458 4436 1.0666666666583334e+01 4458 3786 -5.3333333333124999e+00 4458 1243 -5.3333333333124999e+00 4458 2067 2.1333333333312499e+01 4459 4459 7.4666666667124986e+01 4459 3782 -5.3333333333229165e+00 4459 4460 1.0666666666583334e+01 4459 4468 2.1333333333291666e+01 4459 3816 -5.3333333332812494e+00 4459 3807 -1.0666666666531249e+01 4459 3806 2.1333333333333332e+01 4459 3793 -5.3333333333124999e+00 4459 4431 -2.1333333333312499e+01 4459 4430 1.0666666666583334e+01 4459 3777 -2.1333333333260416e+01 4459 3776 3.2000000000000000e+01 4459 3775 -5.3333333333124999e+00 4460 4460 5.3333333333749991e+01 4460 3784 -5.3333333333229165e+00 4460 3783 5.3333333333229165e+00 4460 3776 1.0666666666791667e+01 4460 3782 5.3333333333437496e+00 4460 3797 -4.5860624244724788e-28 4460 3777 -5.3333333333020834e+00 4460 3816 -6.2500000000000004e-11 4460 4459 1.0666666666583334e+01 4460 4468 1.0666666666666666e+01 4460 3807 5.3333333332812494e+00 4460 3806 -5.3333333333229165e+00 4460 3785 -2.2470898404921788e-28 4460 4455 -1.0666666666666666e+01 4460 4454 -1.0666666666666666e+01 4460 1229 3.0430870179097285e-28 4460 1760 -3.2000000000020833e+01 4460 1757 2.1333333333291666e+01 4460 1206 -1.0666666666625000e+01 4461 4461 5.3333333333749998e+01 4461 3791 -1.0666666666572915e+01 4461 3784 1.5999999999989583e+01 4461 3968 -1.0666666666572915e+01 4461 3976 1.5999999999989583e+01 4461 3966 -5.3333333333124999e+00 4461 4437 -2.1333333333312499e+01 4461 4430 1.0666666666583334e+01 4461 3786 -5.3333333333124999e+00 4461 1230 1.8812360437258079e-27 4461 1471 3.6295685768920020e-28 4461 1803 -1.0666666666562499e+01 4461 1785 -1.0666666666666666e+01 4462 4462 7.4666666667124986e+01 4462 3977 -1.0666666666531249e+01 4462 3976 2.1333333333333332e+01 4462 3780 -2.1333333333260416e+01 4462 3776 3.2000000000000000e+01 4462 3775 -5.3333333333124999e+00 4462 4439 -2.1333333333312499e+01 4462 4430 1.0666666666583334e+01 4462 3966 -5.3333333333124999e+00 4462 1471 -5.3333333332812494e+00 4462 1811 -2.1333333333291666e+01 4462 1785 -1.0666666666583334e+01 4462 1209 -5.3333333333229165e+00 4463 4463 4.2691666666666663e+01 4463 4466 -2.1331249999999997e+01 4463 3813 5.3322916666666664e+00 4463 3807 -6.2500000000000003e-03 4463 3810 5.3322916666666664e+00 4463 3800 -1.0668750000000001e+01 4463 3777 -6.2500000000000003e-03 4463 4464 -2.1331249999999997e+01 4463 4865 -1.0666666666666666e+01 4463 3778 5.3322916666666664e+00 4463 2412 5.3322916666666664e+00 4463 3623 1.0666666666666666e+01 4463 2410 -1.0668750000000001e+01 4464 4464 6.4020833333541674e+01 4464 3800 5.3312499999999998e+00 4464 3775 5.3333333333124999e+00 4464 4431 2.1333333333312499e+01 4464 4432 -1.0666666666583334e+01 4464 3807 1.0662499999958333e+01 4464 3810 -2.1332291666656250e+01 4464 3793 5.3333333333124999e+00 4464 4463 -2.1331249999999997e+01 4464 4865 1.0658333333333333e+01 4464 3777 1.0662499999958333e+01 4464 3778 -2.1332291666656246e+01 4464 2410 5.3312499999999998e+00 4465 4465 4.2666666666916662e+01 4465 3781 5.3333333333229165e+00 4465 4467 -2.1333333333312499e+01 4465 5004 1.0666666666666666e+01 4465 3815 5.3333333333229165e+00 4465 3807 -6.2499999999999991e-11 4465 3813 5.3333333333229165e+00 4465 3804 -1.0666666666687499e+01 4465 3777 -6.2499999999999991e-11 4465 4466 -2.1333333333312499e+01 4465 3661 1.0666666666666666e+01 4465 2412 5.3333333333229165e+00 4465 290 -1.0666666666687499e+01 4466 4466 6.4020833333541660e+01 4466 3804 5.3333333333124999e+00 4466 4463 -2.1331249999999997e+01 4466 3807 1.0662499999958333e+01 4466 3813 -2.1332291666656246e+01 4466 3800 5.3312499999999998e+00 4466 4465 -2.1333333333312499e+01 4466 3777 1.0662499999958333e+01 4466 2410 5.3312499999999998e+00 4466 3623 -1.0658333333333333e+01 4466 3661 -1.0666666666583334e+01 4466 2412 -2.1332291666656250e+01 4466 290 5.3333333333124999e+00 4467 4467 7.4666666667125000e+01 4467 3816 5.3333333332812494e+00 4467 4468 -2.1333333333291666e+01 4467 5011 -1.0666666666583334e+01 4467 3782 5.3333333333229165e+00 4467 3777 2.1333333333260416e+01 4467 3781 -3.2000000000000000e+01 4467 4465 -2.1333333333312499e+01 4467 5004 -1.0666666666583334e+01 4467 3807 1.0666666666531249e+01 4467 3815 -2.1333333333333332e+01 4467 3804 5.3333333333124999e+00 4467 290 5.3333333333124999e+00 4468 4468 4.2666666666999994e+01 4468 3776 1.0666666666625000e+01 4468 3806 -2.2851328271989659e-27 4468 4459 2.1333333333291666e+01 4468 4460 1.0666666666666666e+01 4468 3815 1.8812360437258079e-27 4468 3807 1.0666666666625000e+01 4468 3816 -1.0666666666729165e+01 4468 4467 -2.1333333333291666e+01 4468 5011 1.0666666666666666e+01 4468 3777 -1.0666666666833333e+01 4468 3781 1.0666666666625000e+01 4468 3782 -1.0666666666729165e+01 4469 4469 4.2666666667333331e+01 4469 4140 -4.1666666666666665e-11 4469 4472 -1.0666666666666666e+01 4469 4474 -1.0666666666666666e+01 4469 3752 -4.1666666666666665e-11 4469 3826 -4.1666666666666665e-11 4469 4478 -1.0666666666666666e+01 4469 3817 -4.1666666666666665e-11 4469 4470 -1.0666666666666666e+01 4470 4470 4.2666666666916662e+01 4470 3817 1.0666666666687499e+01 4470 3826 1.0666666666687499e+01 4470 4469 -1.0666666666666666e+01 4470 1566 -5.3333333333229165e+00 4470 2038 -2.1333333333312499e+01 4470 2035 1.0666666666666666e+01 4470 1607 -5.3333333333229165e+00 4471 4471 4.2666666667333331e+01 4471 4377 -4.1666666666666665e-11 4471 4481 -1.0666666666666666e+01 4471 4476 -1.0666666666666666e+01 4471 4123 -4.1666666666666665e-11 4471 4140 -4.1666666666666665e-11 4471 4480 -1.0666666666666666e+01 4471 3817 -4.1666666666666665e-11 4471 4472 -1.0666666666666666e+01 4472 4472 4.2666666666916662e+01 4472 4469 -1.0666666666666666e+01 4472 4140 1.0666666666687499e+01 4472 4471 -1.0666666666666666e+01 4472 3817 1.0666666666687499e+01 4473 4473 4.2666666667333331e+01 4473 3723 -1.0416666666666666e-11 4473 3750 -1.0416666666666666e-11 4473 3757 6.2499999999999991e-11 4473 3752 -4.1666666666666665e-11 4473 4423 -1.0666666666583334e+01 4473 4420 1.0666666666666666e+01 4473 4126 -1.0416666666666666e-11 4473 4124 6.2499999999999991e-11 4473 4123 -4.1666666666666665e-11 4473 4720 1.0666666666583334e+01 4473 4480 -1.0666666666666666e+01 4473 3733 -1.0416666666666666e-11 4473 3732 6.2499999999999991e-11 4473 3727 -4.1666666666666665e-11 4473 4721 1.0666666666583334e+01 4473 4479 -1.0666666666666666e+01 4473 4141 6.2499999999999991e-11 4473 4140 -4.1666666666666665e-11 4473 4718 1.0666666666583334e+01 4473 4474 -1.0666666666666666e+01 4474 4474 4.2666666666916662e+01 4474 3757 -5.3333333333229165e+00 4474 4469 -1.0666666666666666e+01 4474 3752 1.0666666666687499e+01 4474 4718 -2.1333333333312499e+01 4474 4473 -1.0666666666666666e+01 4474 4141 -5.3333333333229165e+00 4474 4140 1.0666666666687499e+01 4475 4475 4.2666666667333324e+01 4475 3788 -1.0416666666666666e-11 4475 4378 6.2499999999999991e-11 4475 4377 -4.1666666666666665e-11 4475 3726 -1.0416666666666666e-11 4475 3746 6.2499999999999991e-11 4475 3727 -4.1666666666666665e-11 4475 3733 -1.0416666666666666e-11 4475 4126 -1.0416666666666666e-11 4475 4137 6.2499999999999991e-11 4475 4123 -4.1666666666666665e-11 4475 4730 -1.0666666666583334e+01 4475 4479 -1.0666666666666666e+01 4475 5069 1.0666666666583334e+01 4475 4476 -1.0666666666666666e+01 4475 1573 -1.0416666666666666e-11 4475 1233 -1.0416666666666666e-11 4475 1242 6.2499999999999991e-11 4475 1241 -4.1666666666666665e-11 4475 2041 -1.0666666666583334e+01 4475 2042 1.0666666666666666e+01 4475 2066 -1.0666666666583334e+01 4475 2065 1.0666666666666666e+01 4476 4476 4.2666666666916662e+01 4476 4137 -5.3333333333229165e+00 4476 4471 -1.0666666666666666e+01 4476 4123 1.0666666666687499e+01 4476 5069 -2.1333333333312499e+01 4476 4475 -1.0666666666666666e+01 4476 4378 -5.3333333333229165e+00 4476 4377 1.0666666666687499e+01 4477 4477 4.2666666667333324e+01 4477 3726 -1.0416666666666666e-11 4477 3728 6.2499999999999991e-11 4477 3727 -4.1666666666666665e-11 4477 3788 -1.0416666666666666e-11 4477 3824 6.2499999999999991e-11 4477 3826 -4.1666666666666665e-11 4477 3750 -1.0416666666666666e-11 4477 3753 6.2499999999999991e-11 4477 3752 -4.1666666666666665e-11 4477 4483 1.0666666666583334e+01 4477 4478 -1.0666666666666666e+01 4477 3723 -1.0416666666666666e-11 4477 4421 -1.0666666666583334e+01 4477 4420 1.0666666666666666e+01 4477 1237 -1.0416666666666666e-11 4477 1240 6.2499999999999991e-11 4477 1241 -4.1666666666666665e-11 4477 2060 1.0666666666583334e+01 4477 2065 1.0666666666666666e+01 4477 1602 -1.0416666666666666e-11 4477 2059 1.0666666666583334e+01 4477 2061 1.0666666666666666e+01 4478 4478 4.2666666666916662e+01 4478 4469 -1.0666666666666666e+01 4478 3824 -5.3333333333229165e+00 4478 3826 1.0666666666687499e+01 4478 4483 -2.1333333333312499e+01 4478 4477 -1.0666666666666666e+01 4478 3753 -5.3333333333229165e+00 4478 3752 1.0666666666687499e+01 4479 4479 4.2666666666916662e+01 4479 3746 -5.3333333333229165e+00 4479 4730 2.1333333333312499e+01 4479 4475 -1.0666666666666666e+01 4479 4137 -5.3333333333229165e+00 4479 4126 6.2499999999999991e-11 4479 4124 -5.3333333333229165e+00 4479 4123 1.0666666666687499e+01 4479 3733 6.2500000000000004e-11 4479 4721 -2.1333333333312499e+01 4479 4473 -1.0666666666666666e+01 4479 3732 -5.3333333333229165e+00 4479 3727 1.0666666666687499e+01 4480 4480 4.2666666666916662e+01 4480 4471 -1.0666666666666666e+01 4480 4141 -5.3333333333229165e+00 4480 4140 1.0666666666687499e+01 4480 4720 -2.1333333333312499e+01 4480 4473 -1.0666666666666666e+01 4480 4124 -5.3333333333229165e+00 4480 4123 1.0666666666687499e+01 4481 4481 4.2666666666916662e+01 4481 4377 1.0666666666687499e+01 4481 3817 1.0666666666687499e+01 4481 4471 -1.0666666666666666e+01 4481 1577 -5.3333333333229165e+00 4481 2033 2.1333333333312499e+01 4481 2035 1.0666666666666666e+01 4481 1566 -5.3333333333229165e+00 4482 4482 4.2666666667333324e+01 4482 3788 -1.0416666666666666e-11 4482 3824 6.2499999999999991e-11 4482 3823 -4.1666666666666665e-11 4482 3789 -4.1666666666666665e-11 4482 3726 -1.0416666666666666e-11 4482 3728 6.2499999999999991e-11 4482 3739 -4.1666666666666665e-11 4482 4457 -1.0666666666666666e+01 4482 3723 -1.0416666666666666e-11 4482 3750 -1.0416666666666666e-11 4482 3753 6.2499999999999991e-11 4482 3760 -4.1666666666666665e-11 4482 4421 -1.0666666666583334e+01 4482 4424 1.0666666666666666e+01 4482 4483 1.0666666666583334e+01 4482 4484 1.0666666666666666e+01 4482 1602 -1.0416666666666666e-11 4482 1237 -1.0416666666666666e-11 4482 1240 6.2499999999999991e-11 4482 2059 1.0666666666583334e+01 4482 2058 -1.0666666666666666e+01 4482 2060 1.0666666666583334e+01 4483 4483 6.4000000000416662e+01 4483 3760 -5.3333333333124999e+00 4483 3826 -5.3333333333124999e+00 4483 4478 -2.1333333333312499e+01 4483 4477 1.0666666666583334e+01 4483 3753 2.1333333333312499e+01 4483 3752 -5.3333333333124999e+00 4483 4484 2.1333333333312499e+01 4483 4482 1.0666666666583334e+01 4483 3824 2.1333333333312499e+01 4483 3823 -5.3333333333124999e+00 4484 4484 4.2666666666916662e+01 4484 3753 5.3333333333229165e+00 4484 4842 1.0666666666666666e+01 4484 3760 -1.0666666666687499e+01 4484 4483 2.1333333333312499e+01 4484 4482 1.0666666666666666e+01 4484 3824 5.3333333333229165e+00 4484 3823 -1.0666666666687499e+01 4485 4485 3.2000000000208331e+01 4486 4486 3.2000000000208331e+01 4487 4487 3.2000000000208331e+01 4488 4488 3.2000000000208331e+01 4489 4489 3.2000000000208331e+01 4490 4490 4.2666666667333331e+01 4490 4000 -1.0416666666666666e-11 4490 4009 6.2499999999999991e-11 4490 4006 -4.1666666666666665e-11 4490 4524 1.0666666666583334e+01 4490 4499 -1.0666666666666666e+01 4490 3855 -1.0416666666666666e-11 4490 4525 1.0666666666583334e+01 4490 4501 -1.0666666666666666e+01 4490 3839 -1.0416666666666666e-11 4490 3841 6.2499999999999991e-11 4490 3837 -4.1666666666666665e-11 4490 3867 -1.0416666666666666e-11 4490 3868 6.2499999999999991e-11 4490 3863 -4.1666666666666665e-11 4490 4514 -1.0666666666583334e+01 4490 4503 -1.0666666666666666e+01 4490 3832 6.2499999999999991e-11 4490 3831 -4.1666666666666665e-11 4490 4522 1.0666666666583334e+01 4490 4491 -1.0666666666666666e+01 4490 2762 -1.0416666666666666e-11 4490 2909 -1.0416666666666666e-11 4491 4491 4.2666666666916662e+01 4491 3833 -5.3333333333229165e+00 4491 4526 2.1333333333312499e+01 4491 4496 -1.0666666666666666e+01 4491 3869 -5.3333333333229165e+00 4491 3868 -5.3333333333229165e+00 4491 3863 1.0666666666687499e+01 4491 4522 -2.1333333333312499e+01 4491 4490 -1.0666666666666666e+01 4491 3832 -5.3333333333229165e+00 4491 3831 1.0666666666687499e+01 4491 2762 6.2500000000000004e-11 4491 2909 6.2500000000000004e-11 4492 4492 4.2666666667333331e+01 4492 3891 -1.0416666666666666e-11 4492 4228 -1.0416666666666666e-11 4492 3898 -1.0416666666666666e-11 4492 3897 6.2499999999999991e-11 4492 3896 -4.1666666666666665e-11 4492 4823 1.0666666666583334e+01 4492 4506 -1.0666666666666666e+01 4492 3740 -1.0416666666666666e-11 4492 4824 1.0666666666583334e+01 4492 4505 -1.0666666666666666e+01 4492 3737 -1.0416666666666666e-11 4492 3738 6.2499999999999991e-11 4492 3729 -4.1666666666666665e-11 4492 4210 -1.0416666666666666e-11 4492 4213 6.2499999999999991e-11 4492 4216 -4.1666666666666665e-11 4492 4815 -1.0666666666583334e+01 4492 4504 -1.0666666666666666e+01 4492 4225 6.2499999999999991e-11 4492 4224 -4.1666666666666665e-11 4492 4822 1.0666666666583334e+01 4492 4493 -1.0666666666666666e+01 4493 4493 4.2666666666916662e+01 4493 4213 -5.3333333333229165e+00 4493 4498 -1.0666666666666666e+01 4493 4216 1.0666666666687499e+01 4493 4822 -2.1333333333312499e+01 4493 4492 -1.0666666666666666e+01 4493 4225 -5.3333333333229165e+00 4493 4224 1.0666666666687499e+01 4494 4494 4.2666666667333331e+01 4494 3885 -1.0416666666666666e-11 4494 3740 -1.0416666666666666e-11 4494 3891 -1.0416666666666666e-11 4494 3894 6.2499999999999991e-11 4494 3896 -4.1666666666666665e-11 4494 4511 1.0666666666583334e+01 4494 4505 -1.0666666666666666e+01 4494 3840 -1.0416666666666666e-11 4494 3867 -1.0416666666666666e-11 4494 3839 -1.0416666666666666e-11 4494 3838 6.2499999999999991e-11 4494 3837 -4.1666666666666665e-11 4494 4509 1.0666666666583334e+01 4494 4503 -1.0666666666666666e+01 4494 3731 -1.0416666666666666e-11 4494 3730 6.2499999999999991e-11 4494 3729 -4.1666666666666665e-11 4494 4510 1.0666666666583334e+01 4494 4502 -1.0666666666666666e+01 4494 3865 -1.0416666666666666e-11 4494 3864 6.2499999999999991e-11 4494 3863 -4.1666666666666665e-11 4494 4508 1.0666666666583334e+01 4494 4495 -1.0666666666666666e+01 4495 4495 4.2666666666916662e+01 4495 3894 -5.3333333333229165e+00 4495 3869 -5.3333333333229165e+00 4495 3885 6.2499999999999991e-11 4495 4537 2.1333333333312499e+01 4495 4496 -1.0666666666666666e+01 4495 3887 -5.3333333333229165e+00 4495 3896 1.0666666666687499e+01 4495 3865 6.2499999999999991e-11 4495 4508 -2.1333333333312499e+01 4495 4494 -1.0666666666666666e+01 4495 3864 -5.3333333333229165e+00 4495 3863 1.0666666666687499e+01 4496 4496 4.2666666667333331e+01 4496 3898 -1.0416666666666666e-11 4496 4228 -1.0416666666666666e-11 4496 4237 6.2499999999999991e-11 4496 4224 -4.1666666666666665e-11 4496 4546 1.0666666666583334e+01 4496 4506 -1.0666666666666666e+01 4496 3865 -1.0416666666666666e-11 4496 3869 6.2499999999999991e-11 4496 3863 -4.1666666666666665e-11 4496 4526 -1.0666666666583334e+01 4496 4491 -1.0666666666666666e+01 4496 3885 -1.0416666666666666e-11 4496 3887 6.2499999999999991e-11 4496 3896 -4.1666666666666665e-11 4496 4537 -1.0666666666583334e+01 4496 4495 -1.0666666666666666e+01 4496 3833 6.2499999999999991e-11 4496 3831 -4.1666666666666665e-11 4496 4545 1.0666666666583334e+01 4496 4497 -1.0666666666666666e+01 4496 2909 -1.0416666666666666e-11 4496 2762 -1.0416666666666666e-11 4497 4497 4.2666666666916662e+01 4497 4237 -5.3333333333229165e+00 4497 4498 -1.0666666666666666e+01 4497 4224 1.0666666666687499e+01 4497 4545 -2.1333333333312499e+01 4497 4496 -1.0666666666666666e+01 4497 3833 -5.3333333333229165e+00 4497 3831 1.0666666666687499e+01 4498 4498 4.2666666667333331e+01 4498 4006 -4.1666666666666665e-11 4498 4507 -1.0666666666666666e+01 4498 4224 -4.1666666666666665e-11 4498 4497 -1.0666666666666666e+01 4498 4216 -4.1666666666666665e-11 4498 4493 -1.0666666666666666e+01 4498 3831 -4.1666666666666665e-11 4498 4499 -1.0666666666666666e+01 4499 4499 4.2666666666916662e+01 4499 3832 -5.3333333333229165e+00 4499 4524 -2.1333333333312499e+01 4499 4490 -1.0666666666666666e+01 4499 4009 -5.3333333333229165e+00 4499 4006 1.0666666666687499e+01 4499 4498 -1.0666666666666666e+01 4499 3831 1.0666666666687499e+01 4500 4500 4.2666666667333331e+01 4500 3855 -1.0416666666666666e-11 4500 3731 -1.0416666666666666e-11 4500 3840 -1.0416666666666666e-11 4500 3862 6.2499999999999991e-11 4500 3837 -4.1666666666666665e-11 4500 4521 -1.0666666666583334e+01 4500 4502 -1.0666666666666666e+01 4500 4210 -1.0416666666666666e-11 4500 4218 6.2499999999999991e-11 4500 4216 -4.1666666666666665e-11 4500 5061 1.0666666666583334e+01 4500 4507 -1.0666666666666666e+01 4500 3737 -1.0416666666666666e-11 4500 3744 6.2499999999999991e-11 4500 3729 -4.1666666666666665e-11 4500 4816 -1.0666666666583334e+01 4500 4504 -1.0666666666666666e+01 4500 4000 -1.0416666666666666e-11 4500 4004 6.2499999999999991e-11 4500 4006 -4.1666666666666665e-11 4500 4967 -1.0666666666583334e+01 4500 4501 -1.0666666666666666e+01 4501 4501 4.2666666666916662e+01 4501 3862 -5.3333333333229165e+00 4501 4009 -5.3333333333229165e+00 4501 3855 6.2500000000000004e-11 4501 4525 -2.1333333333312499e+01 4501 4490 -1.0666666666666666e+01 4501 3841 -5.3333333333229165e+00 4501 3837 1.0666666666687499e+01 4501 4000 6.2500000000000004e-11 4501 4967 2.1333333333312499e+01 4501 4500 -1.0666666666666666e+01 4501 4004 -5.3333333333229165e+00 4501 4006 1.0666666666687499e+01 4502 4502 4.2666666666916662e+01 4502 3744 -5.3333333333229165e+00 4502 4521 2.1333333333312499e+01 4502 4500 -1.0666666666666666e+01 4502 3862 -5.3333333333229165e+00 4502 3840 6.2499999999999991e-11 4502 3838 -5.3333333333229165e+00 4502 3837 1.0666666666687499e+01 4502 3731 6.2499999999999991e-11 4502 4510 -2.1333333333312499e+01 4502 4494 -1.0666666666666666e+01 4502 3730 -5.3333333333229165e+00 4502 3729 1.0666666666687499e+01 4503 4503 4.2666666666916662e+01 4503 3841 -5.3333333333229165e+00 4503 4514 2.1333333333312499e+01 4503 4490 -1.0666666666666666e+01 4503 3868 -5.3333333333229165e+00 4503 3867 6.2499999999999991e-11 4503 3864 -5.3333333333229165e+00 4503 3863 1.0666666666687499e+01 4503 3839 6.2500000000000004e-11 4503 4509 -2.1333333333312499e+01 4503 4494 -1.0666666666666666e+01 4503 3838 -5.3333333333229165e+00 4503 3837 1.0666666666687499e+01 4504 4504 4.2666666666916662e+01 4504 4218 -5.3333333333229165e+00 4504 4816 2.1333333333312499e+01 4504 4500 -1.0666666666666666e+01 4504 3744 -5.3333333333229165e+00 4504 3737 6.2500000000000004e-11 4504 3738 -5.3333333333229165e+00 4504 3729 1.0666666666687499e+01 4504 4210 6.2500000000000004e-11 4504 4815 2.1333333333312499e+01 4504 4492 -1.0666666666666666e+01 4504 4213 -5.3333333333229165e+00 4504 4216 1.0666666666687499e+01 4505 4505 4.2666666666916662e+01 4505 3897 -5.3333333333229165e+00 4505 4824 -2.1333333333312499e+01 4505 4492 -1.0666666666666666e+01 4505 3738 -5.3333333333229165e+00 4505 3740 6.2499999999999991e-11 4505 3730 -5.3333333333229165e+00 4505 3729 1.0666666666687499e+01 4505 3891 6.2500000000000004e-11 4505 4511 -2.1333333333312499e+01 4505 4494 -1.0666666666666666e+01 4505 3894 -5.3333333333229165e+00 4505 3896 1.0666666666687499e+01 4506 4506 4.2666666666916662e+01 4506 3887 -5.3333333333229165e+00 4506 4546 -2.1333333333312499e+01 4506 4496 -1.0666666666666666e+01 4506 4237 -5.3333333333229165e+00 4506 4228 6.2500000000000004e-11 4506 4225 -5.3333333333229165e+00 4506 4224 1.0666666666687499e+01 4506 3898 6.2500000000000004e-11 4506 4823 -2.1333333333312499e+01 4506 4492 -1.0666666666666666e+01 4506 3897 -5.3333333333229165e+00 4506 3896 1.0666666666687499e+01 4507 4507 4.2666666666916662e+01 4507 4498 -1.0666666666666666e+01 4507 4004 -5.3333333333229165e+00 4507 4006 1.0666666666687499e+01 4507 5061 -2.1333333333312499e+01 4507 4500 -1.0666666666666666e+01 4507 4218 -5.3333333333229165e+00 4507 4216 1.0666666666687499e+01 4508 4508 6.4000000000416662e+01 4508 3896 -5.3333333333124999e+00 4508 3866 -5.3333333333124999e+00 4508 4445 -2.1333333333312499e+01 4508 4440 1.0666666666583334e+01 4508 3885 -1.0666666666583334e+01 4508 3894 2.1333333333312499e+01 4508 3893 -5.3333333333124999e+00 4508 4495 -2.1333333333312499e+01 4508 4494 1.0666666666583334e+01 4508 3865 -1.0666666666583334e+01 4508 3864 2.1333333333312499e+01 4508 3863 -5.3333333333124999e+00 4509 4509 6.4000000000416662e+01 4509 3847 -5.3333333333124999e+00 4509 3863 -5.3333333333124999e+00 4509 4503 -2.1333333333312499e+01 4509 4494 1.0666666666583334e+01 4509 3839 -1.0666666666583334e+01 4509 3838 2.1333333333312499e+01 4509 3837 -5.3333333333124999e+00 4509 4441 -2.1333333333312499e+01 4509 4440 1.0666666666583334e+01 4509 3867 -1.0666666666583334e+01 4509 3864 2.1333333333312499e+01 4509 3866 -5.3333333333124999e+00 4510 4510 6.4000000000416662e+01 4510 3724 -5.3333333333124999e+00 4510 4446 -2.1333333333312499e+01 4510 4440 1.0666666666583334e+01 4510 3847 -5.3333333333124999e+00 4510 3840 -1.0666666666583334e+01 4510 3838 2.1333333333312499e+01 4510 3837 -5.3333333333124999e+00 4510 4502 -2.1333333333312499e+01 4510 4494 1.0666666666583334e+01 4510 3731 -1.0666666666583334e+01 4510 3730 2.1333333333312499e+01 4510 3729 -5.3333333333124999e+00 4511 4511 6.4000000000416662e+01 4511 3729 -5.3333333333124999e+00 4511 4505 -2.1333333333312499e+01 4511 4494 1.0666666666583334e+01 4511 3896 -5.3333333333124999e+00 4511 3891 -1.0666666666583334e+01 4511 3894 2.1333333333312499e+01 4511 3893 -5.3333333333124999e+00 4511 4444 -2.1333333333312499e+01 4511 4440 1.0666666666583334e+01 4511 3740 -1.0666666666583334e+01 4511 3730 2.1333333333312499e+01 4511 3724 -5.3333333333124999e+00 4512 4512 4.2691666666666663e+01 4512 3852 5.3322916666666664e+00 4512 3868 5.3322916666666664e+00 4512 3839 -6.2500000000000003e-03 4512 4514 -2.1331249999999997e+01 4512 4523 -1.0666666666666666e+01 4512 3841 5.3322916666666664e+00 4512 3853 -1.0668750000000001e+01 4512 3867 -6.2500000000000003e-03 4512 4513 -2.1331249999999997e+01 4512 3692 1.0666666666666666e+01 4512 2758 5.3322916666666664e+00 4512 2766 -1.0668750000000001e+01 4513 4513 6.4041666666666671e+01 4513 3853 5.3312499999999998e+00 4513 4516 -2.1331249999999997e+01 4513 3839 1.0658333333333333e+01 4513 3852 -2.1331249999999997e+01 4513 3851 5.3312499999999998e+00 4513 4512 -2.1331249999999997e+01 4513 3867 1.0658333333333333e+01 4513 2757 5.3312499999999998e+00 4513 3662 -1.0658333333333333e+01 4513 3692 -1.0658333333333333e+01 4513 2758 -2.1331249999999997e+01 4513 2766 5.3312499999999998e+00 4514 4514 6.4020833333541660e+01 4514 4512 -2.1331249999999997e+01 4514 4523 1.0658333333333333e+01 4514 3853 5.3312499999999998e+00 4514 3839 1.0662499999958333e+01 4514 3841 -2.1332291666656250e+01 4514 3837 5.3333333333124999e+00 4514 4503 2.1333333333312499e+01 4514 4490 -1.0666666666583334e+01 4514 3867 1.0662499999958333e+01 4514 3868 -2.1332291666656250e+01 4514 3863 5.3333333333124999e+00 4514 2766 5.3312499999999998e+00 4515 4515 6.4020833333541660e+01 4515 3851 5.3312499999999998e+00 4515 4516 -2.1331249999999997e+01 4515 4889 1.0658333333333333e+01 4515 3867 1.0662499999958333e+01 4515 3871 -2.1332291666656250e+01 4515 3866 5.3333333333124999e+00 4515 4441 2.1333333333312499e+01 4515 4438 -1.0666666666583334e+01 4515 3839 1.0662499999958333e+01 4515 3849 -2.1332291666656250e+01 4515 3847 5.3333333333124999e+00 4515 2757 5.3312499999999998e+00 4516 4516 4.2691666666666663e+01 4516 3849 5.3322916666666664e+00 4516 4515 -2.1331249999999997e+01 4516 4889 -1.0666666666666666e+01 4516 3871 5.3322916666666664e+00 4516 3867 -6.2500000000000003e-03 4516 3839 -6.2500000000000003e-03 4516 4513 -2.1331249999999997e+01 4516 3852 5.3322916666666664e+00 4516 3851 -1.0668750000000001e+01 4516 2758 5.3322916666666664e+00 4516 2757 -1.0668750000000001e+01 4516 3662 1.0666666666666666e+01 4517 4517 6.4000000000416662e+01 4517 3743 5.3333333333124999e+00 4517 4518 -2.1333333333312499e+01 4517 4888 -1.0666666666583334e+01 4517 3850 5.3333333333124999e+00 4517 3840 1.0666666666583334e+01 4517 3848 -2.1333333333312499e+01 4517 3847 5.3333333333124999e+00 4517 4446 2.1333333333312499e+01 4517 4436 -1.0666666666583334e+01 4517 3731 1.0666666666583334e+01 4517 3742 -2.1333333333312499e+01 4517 3724 5.3333333333124999e+00 4518 4518 4.2666666666916662e+01 4518 3860 5.3333333333229165e+00 4518 4519 -2.1333333333312499e+01 4518 4750 -1.0666666666666666e+01 4518 3735 5.3333333333229165e+00 4518 3731 -6.2499999999999991e-11 4518 3742 5.3333333333229165e+00 4518 3743 -1.0666666666687499e+01 4518 3840 -6.2499999999999991e-11 4518 4517 -2.1333333333312499e+01 4518 4888 1.0666666666666666e+01 4518 3848 5.3333333333229165e+00 4518 3850 -1.0666666666687499e+01 4519 4519 6.4000000000416662e+01 4519 3734 5.3333333333124999e+00 4519 4520 -2.1333333333312499e+01 4519 4743 -1.0666666666583334e+01 4519 3861 5.3333333333124999e+00 4519 3840 1.0666666666583334e+01 4519 3860 -2.1333333333312499e+01 4519 3850 5.3333333333124999e+00 4519 4518 -2.1333333333312499e+01 4519 4750 1.0666666666583334e+01 4519 3731 1.0666666666583334e+01 4519 3735 -2.1333333333312499e+01 4519 3743 5.3333333333124999e+00 4520 4520 4.2666666666916662e+01 4520 3735 5.3333333333229165e+00 4520 4519 -2.1333333333312499e+01 4520 4743 1.0666666666666666e+01 4520 3860 5.3333333333229165e+00 4520 3840 -6.2499999999999991e-11 4520 3862 5.3333333333229165e+00 4520 3861 -1.0666666666687499e+01 4520 3731 -6.2499999999999991e-11 4520 4521 -2.1333333333312499e+01 4520 4738 1.0666666666666666e+01 4520 3744 5.3333333333229165e+00 4520 3734 -1.0666666666687499e+01 4521 4521 6.4000000000416662e+01 4521 3729 5.3333333333124999e+00 4521 4502 2.1333333333312499e+01 4521 4500 -1.0666666666583334e+01 4521 3837 5.3333333333124999e+00 4521 3840 1.0666666666583334e+01 4521 3862 -2.1333333333312499e+01 4521 3861 5.3333333333124999e+00 4521 4520 -2.1333333333312499e+01 4521 4738 -1.0666666666583334e+01 4521 3731 1.0666666666583334e+01 4521 3744 -2.1333333333312499e+01 4521 3734 5.3333333333124999e+00 4522 4522 6.4020833333541660e+01 4522 4523 -1.0658333333333333e+01 4522 3868 2.1332291666656250e+01 4522 3863 -5.3333333333124999e+00 4522 4491 -2.1333333333312499e+01 4522 4490 1.0666666666583334e+01 4522 3832 2.1332291666656250e+01 4522 3831 -5.3333333333124999e+00 4522 2913 -5.3312499999999998e+00 4522 3603 -2.1331249999999997e+01 4522 2766 -5.3312499999999998e+00 4522 2762 -1.0662499999958333e+01 4522 2909 -1.0662499999958333e+01 4523 4523 4.2733333333333334e+01 4523 3855 1.0416666666666669e-03 4523 4000 1.0416666666666667e-03 4523 4009 -6.2500000000000003e-03 4523 4001 4.1666666666666666e-03 4523 4525 -1.0658333333333333e+01 4523 4966 1.0666666666666666e+01 4523 3867 1.0416666666666669e-03 4523 3868 -6.2500000000000003e-03 4523 4522 -1.0658333333333333e+01 4523 3839 1.0416666666666667e-03 4523 3841 -6.2500000000000003e-03 4523 3853 4.1666666666666666e-03 4523 4514 1.0658333333333333e+01 4523 4512 -1.0666666666666666e+01 4523 3832 -6.2500000000000003e-03 4523 4524 -1.0658333333333333e+01 4523 4965 1.0666666666666666e+01 4523 2909 1.0416666666666669e-03 4523 2762 1.0416666666666667e-03 4523 2766 4.1666666666666666e-03 4523 3603 1.0666666666666666e+01 4523 2913 4.1666666666666666e-03 4524 4524 6.4020833333541674e+01 4524 3831 -5.3333333333124999e+00 4524 4499 -2.1333333333312499e+01 4524 4490 1.0666666666583334e+01 4524 4006 -5.3333333333124999e+00 4524 4009 2.1332291666656246e+01 4524 4001 -5.3312499999999998e+00 4524 4965 -2.1331249999999997e+01 4524 4523 -1.0658333333333333e+01 4524 3832 2.1332291666656246e+01 4524 2913 -5.3312499999999998e+00 4525 4525 6.4020833333541674e+01 4525 4006 -5.3333333333124999e+00 4525 4501 -2.1333333333312499e+01 4525 4490 1.0666666666583334e+01 4525 3837 -5.3333333333124999e+00 4525 3855 -1.0662499999958333e+01 4525 3841 2.1332291666656246e+01 4525 3853 -5.3312499999999998e+00 4525 4966 -2.1331249999999997e+01 4525 4523 -1.0658333333333333e+01 4525 4000 -1.0662499999958333e+01 4525 4009 2.1332291666656246e+01 4525 4001 -5.3312499999999998e+00 4526 4526 6.4020833333541674e+01 4526 3831 5.3333333333124999e+00 4526 4491 2.1333333333312499e+01 4526 4496 -1.0666666666583334e+01 4526 3863 5.3333333333124999e+00 4526 3869 -2.1332291666656246e+01 4526 4527 -1.0658333333333333e+01 4526 3833 -2.1332291666656246e+01 4526 2762 1.0662499999958333e+01 4526 2755 5.3312499999999998e+00 4526 3605 2.1331249999999997e+01 4526 2909 1.0662499999958333e+01 4526 2912 5.3312499999999998e+00 4527 4527 4.2733333333333334e+01 4527 4228 -1.0416666666666669e-03 4527 4237 6.2500000000000003e-03 4527 4229 -4.1666666666666666e-03 4527 4545 1.0658333333333333e+01 4527 4530 -1.0666666666666666e+01 4527 3898 -1.0416666666666667e-03 4527 4546 1.0658333333333333e+01 4527 4529 -1.0666666666666666e+01 4527 3885 -1.0416666666666669e-03 4527 3887 6.2500000000000003e-03 4527 3883 -4.1666666666666666e-03 4527 3865 -1.0416666666666667e-03 4527 3869 6.2500000000000003e-03 4527 4537 -1.0658333333333333e+01 4527 4532 -1.0666666666666666e+01 4527 3833 6.2500000000000003e-03 4527 4526 -1.0658333333333333e+01 4527 2762 -1.0416666666666669e-03 4527 2755 -4.1666666666666666e-03 4527 2909 -1.0416666666666667e-03 4527 2912 -4.1666666666666666e-03 4527 3605 -1.0666666666666666e+01 4528 4528 4.2733333333333334e+01 4528 4278 6.2500000000000003e-03 4528 4938 1.0658333333333333e+01 4528 4533 -1.0666666666666666e+01 4528 4932 -1.0658333333333333e+01 4528 3898 -1.0416666666666669e-03 4528 3872 -1.0416666666666669e-03 4528 3882 6.2500000000000003e-03 4528 3886 -1.0416666666666667e-03 4528 3908 6.2500000000000003e-03 4528 3883 -4.1666666666666666e-03 4528 4544 -1.0658333333333333e+01 4528 4531 -1.0666666666666666e+01 4528 4228 -1.0416666666666667e-03 4528 4230 6.2500000000000003e-03 4528 4229 -4.1666666666666666e-03 4528 4867 -1.0658333333333333e+01 4528 4529 -1.0666666666666666e+01 4528 2784 -1.0416666666666669e-03 4528 2790 -4.1666666666666666e-03 4528 2769 -1.0416666666666667e-03 4528 3352 -1.0666666666666666e+01 4528 2774 -4.1666666666666666e-03 4529 4529 4.2691666666666663e+01 4529 3908 -5.3322916666666664e+00 4529 4237 -5.3322916666666664e+00 4529 3898 6.2500000000000003e-03 4529 4546 -2.1331249999999997e+01 4529 4527 -1.0666666666666666e+01 4529 3887 -5.3322916666666664e+00 4529 3883 1.0668750000000001e+01 4529 4228 6.2500000000000003e-03 4529 4867 2.1331249999999997e+01 4529 4528 -1.0666666666666666e+01 4529 4230 -5.3322916666666664e+00 4529 4229 1.0668750000000001e+01 4530 4530 4.2691666666666663e+01 4530 3833 -5.3322916666666664e+00 4530 4545 -2.1331249999999997e+01 4530 4527 -1.0666666666666666e+01 4530 4237 -5.3322916666666664e+00 4530 4229 1.0668750000000001e+01 4530 3629 -1.0666666666666666e+01 4530 2912 1.0668750000000001e+01 4531 4531 4.2691666666666663e+01 4531 3882 -5.3322916666666664e+00 4531 4544 2.1331249999999997e+01 4531 4528 -1.0666666666666666e+01 4531 3908 -5.3322916666666664e+00 4531 3886 6.2500000000000003e-03 4531 3884 -5.3322916666666664e+00 4531 3883 1.0668750000000001e+01 4531 3872 6.2500000000000003e-03 4531 4535 -2.1331249999999997e+01 4531 3628 -1.0666666666666666e+01 4531 2773 -5.3322916666666664e+00 4531 2774 1.0668750000000001e+01 4532 4532 4.2691666666666663e+01 4532 3887 -5.3322916666666664e+00 4532 4537 2.1331249999999997e+01 4532 4527 -1.0666666666666666e+01 4532 3869 -5.3322916666666664e+00 4532 3865 6.2500000000000003e-03 4532 3885 6.2500000000000003e-03 4532 4534 -2.1331249999999997e+01 4532 3884 -5.3322916666666664e+00 4532 3883 1.0668750000000001e+01 4532 2756 -5.3322916666666664e+00 4532 2755 1.0668750000000001e+01 4532 3628 -1.0666666666666666e+01 4533 4533 4.2691666666666663e+01 4533 4230 -5.3322916666666664e+00 4533 4229 1.0668750000000001e+01 4533 4938 -2.1331249999999997e+01 4533 4528 -1.0666666666666666e+01 4533 4278 -5.3322916666666664e+00 4533 3629 -1.0666666666666666e+01 4533 2790 1.0668750000000001e+01 4534 4534 6.4041666666666671e+01 4534 3903 -5.3312499999999998e+00 4534 4532 -2.1331249999999997e+01 4534 3885 -1.0658333333333333e+01 4534 3884 2.1331249999999997e+01 4534 3883 -5.3312499999999998e+00 4534 4536 2.1331249999999997e+01 4534 3865 -1.0658333333333333e+01 4534 2755 -5.3312499999999998e+00 4534 3628 1.0658333333333333e+01 4534 3625 1.0658333333333333e+01 4534 2756 2.1331249999999997e+01 4534 2765 -5.3312499999999998e+00 4535 4535 6.4041666666666671e+01 4535 4539 2.1331249999999997e+01 4535 3903 -5.3312499999999998e+00 4535 3886 -1.0658333333333333e+01 4535 3884 2.1331249999999997e+01 4535 3883 -5.3312499999999998e+00 4535 4531 -2.1331249999999997e+01 4535 3872 -1.0658333333333333e+01 4535 2772 -5.3312499999999998e+00 4535 3625 1.0658333333333333e+01 4535 3628 1.0658333333333333e+01 4535 2773 2.1331249999999997e+01 4535 2774 -5.3312499999999998e+00 4536 4536 4.2691666666666663e+01 4536 3884 5.3322916666666664e+00 4536 3870 5.3322916666666664e+00 4536 3885 -6.2500000000000003e-03 4536 4538 -2.1331249999999997e+01 4536 4865 -1.0666666666666666e+01 4536 3895 5.3322916666666664e+00 4536 3903 -1.0668750000000001e+01 4536 3865 -6.2500000000000003e-03 4536 4534 2.1331249999999997e+01 4536 3625 1.0666666666666666e+01 4536 2756 5.3322916666666664e+00 4536 2765 -1.0668750000000001e+01 4537 4537 6.4020833333541674e+01 4537 3863 5.3333333333124999e+00 4537 4495 2.1333333333312499e+01 4537 4496 -1.0666666666583334e+01 4537 3896 5.3333333333124999e+00 4537 3885 1.0662499999958333e+01 4537 3887 -2.1332291666656246e+01 4537 3883 5.3312499999999998e+00 4537 4532 2.1331249999999997e+01 4537 4527 -1.0658333333333333e+01 4537 3865 1.0662499999958333e+01 4537 3869 -2.1332291666656246e+01 4537 2755 5.3312499999999998e+00 4538 4538 6.4020833333541660e+01 4538 4536 -2.1331249999999997e+01 4538 4865 1.0658333333333333e+01 4538 3903 5.3312499999999998e+00 4538 3885 1.0662499999958333e+01 4538 3895 -2.1332291666656250e+01 4538 3893 5.3333333333124999e+00 4538 4445 2.1333333333312499e+01 4538 4432 -1.0666666666583334e+01 4538 3865 1.0662499999958333e+01 4538 3870 -2.1332291666656250e+01 4538 3866 5.3333333333124999e+00 4538 2765 5.3312499999999998e+00 4539 4539 4.2691666666666663e+01 4539 4535 2.1331249999999997e+01 4539 3884 5.3322916666666664e+00 4539 3886 -6.2500000000000003e-03 4539 3904 5.3322916666666664e+00 4539 3903 -1.0668750000000001e+01 4539 3872 -6.2500000000000003e-03 4539 4540 -2.1331249999999997e+01 4539 4895 1.0666666666666666e+01 4539 3876 5.3322916666666664e+00 4539 2773 5.3322916666666664e+00 4539 3625 1.0666666666666666e+01 4539 2772 -1.0668750000000001e+01 4540 4540 6.4041666666666671e+01 4540 3877 5.3312499999999998e+00 4540 4541 -2.1331249999999997e+01 4540 4897 1.0658333333333333e+01 4540 3905 5.3312499999999998e+00 4540 3886 1.0658333333333333e+01 4540 3904 -2.1331249999999997e+01 4540 3903 5.3312499999999998e+00 4540 4539 -2.1331249999999997e+01 4540 4895 -1.0658333333333333e+01 4540 3872 1.0658333333333333e+01 4540 3876 -2.1331249999999997e+01 4540 2772 5.3312499999999998e+00 4541 4541 4.2691666666666663e+01 4541 3906 5.3322916666666664e+00 4541 4542 -2.1331249999999997e+01 4541 4902 1.0666666666666666e+01 4541 3881 5.3322916666666664e+00 4541 3872 -6.2500000000000003e-03 4541 3876 5.3322916666666664e+00 4541 3877 -1.0668750000000001e+01 4541 3886 -6.2500000000000003e-03 4541 4540 -2.1331249999999997e+01 4541 4897 -1.0666666666666666e+01 4541 3904 5.3322916666666664e+00 4541 3905 -1.0668750000000001e+01 4542 4542 6.4041666666666671e+01 4542 3880 5.3312499999999998e+00 4542 4543 -2.1331249999999997e+01 4542 4924 -1.0658333333333333e+01 4542 3907 5.3312499999999998e+00 4542 3886 1.0658333333333333e+01 4542 3906 -2.1331249999999997e+01 4542 3905 5.3312499999999998e+00 4542 4541 -2.1331249999999997e+01 4542 4902 -1.0658333333333333e+01 4542 3872 1.0658333333333333e+01 4542 3881 -2.1331249999999997e+01 4542 3877 5.3312499999999998e+00 4543 4543 4.2691666666666663e+01 4543 3881 5.3322916666666664e+00 4543 4542 -2.1331249999999997e+01 4543 4924 1.0666666666666666e+01 4543 3906 5.3322916666666664e+00 4543 3886 -6.2500000000000003e-03 4543 3908 5.3322916666666664e+00 4543 3907 -1.0668750000000001e+01 4543 3872 -6.2500000000000003e-03 4543 4544 -2.1331249999999997e+01 4543 4925 1.0666666666666666e+01 4543 3882 5.3322916666666664e+00 4543 3880 -1.0668750000000001e+01 4544 4544 6.4041666666666671e+01 4544 4531 2.1331249999999997e+01 4544 4528 -1.0658333333333333e+01 4544 3883 5.3312499999999998e+00 4544 3886 1.0658333333333333e+01 4544 3908 -2.1331249999999997e+01 4544 3907 5.3312499999999998e+00 4544 4543 -2.1331249999999997e+01 4544 4925 -1.0658333333333333e+01 4544 3872 1.0658333333333333e+01 4544 3882 -2.1331249999999997e+01 4544 3880 5.3312499999999998e+00 4544 2774 5.3312499999999998e+00 4545 4545 6.4020833333541660e+01 4545 4530 -2.1331249999999997e+01 4545 4527 1.0658333333333333e+01 4545 4229 -5.3312499999999998e+00 4545 4237 2.1332291666656250e+01 4545 4224 -5.3333333333124999e+00 4545 4497 -2.1333333333312499e+01 4545 4496 1.0666666666583334e+01 4545 3833 2.1332291666656250e+01 4545 3831 -5.3333333333124999e+00 4545 2912 -5.3312499999999998e+00 4546 4546 6.4020833333541660e+01 4546 4229 -5.3312499999999998e+00 4546 4529 -2.1331249999999997e+01 4546 4527 1.0658333333333333e+01 4546 3883 -5.3312499999999998e+00 4546 3898 -1.0662499999958333e+01 4546 3887 2.1332291666656250e+01 4546 3896 -5.3333333333124999e+00 4546 4506 -2.1333333333312499e+01 4546 4496 1.0666666666583334e+01 4546 4228 -1.0662499999958333e+01 4546 4237 2.1332291666656250e+01 4546 4224 -5.3333333333124999e+00 4547 4547 6.4091666666666654e+01 4547 3911 2.0833333333333342e-03 4547 4557 2.1329166666666666e+01 4547 4548 -2.1320833333333333e+01 4547 3874 -1.0416666666666669e-03 4547 3873 6.2500000000000003e-03 4547 4560 1.0658333333333333e+01 4547 3927 -1.0416666666666667e-03 4547 3920 1.0416666666666666e-02 4547 3926 5.3291666666666666e+00 4547 4559 1.0658333333333333e+01 4547 4552 -1.0666666666666666e+01 4547 3913 1.0416666666666666e-02 4547 4554 2.1329166666666669e+01 4547 2990 -1.0683333333333334e+01 4547 2971 -1.0416666666666669e-03 4547 2776 -1.0416666666666667e-03 4547 2778 -4.1666666666666666e-03 4547 3640 -1.0666666666666666e+01 4547 3650 -2.1320833333333333e+01 4547 2977 5.3291666666666666e+00 4548 4548 6.4058333333333337e+01 4548 3937 -4.1666666666666666e-03 4548 4553 -1.0666666666666666e+01 4548 3920 -5.3281250000000000e+00 4548 3926 5.3291666666666666e+00 4548 4557 -3.2002083333333331e+01 4548 4547 -2.1320833333333333e+01 4548 3911 -5.3322916666666664e+00 4548 4549 -1.0666666666666666e+01 4548 2990 1.5995833333333334e+01 4549 4549 4.2691666666666663e+01 4549 3937 1.0668750000000001e+01 4549 4548 -1.0666666666666666e+01 4549 3648 -1.0666666666666666e+01 4549 2990 1.0668750000000001e+01 4550 4550 4.2733333333333334e+01 4550 4275 6.2500000000000003e-03 4550 4582 1.0658333333333333e+01 4550 3927 -1.0416666666666669e-03 4550 3928 6.2500000000000003e-03 4550 3926 -4.1666666666666666e-03 4550 4581 1.0658333333333333e+01 4550 4553 -1.0666666666666666e+01 4550 3874 -1.0416666666666667e-03 4550 3875 6.2500000000000003e-03 4550 4568 -1.0658333333333333e+01 4550 4552 -1.0666666666666666e+01 4550 3938 6.2500000000000003e-03 4550 3937 -4.1666666666666666e-03 4550 4579 1.0658333333333333e+01 4550 4551 -1.0666666666666666e+01 4550 2769 -1.0416666666666669e-03 4550 2784 -1.0416666666666667e-03 4550 2786 -4.1666666666666666e-03 4550 3350 -1.0666666666666666e+01 4550 2778 -4.1666666666666666e-03 4551 4551 4.2691666666666663e+01 4551 4275 -5.3322916666666664e+00 4551 4579 -2.1331249999999997e+01 4551 4550 -1.0666666666666666e+01 4551 3938 -5.3322916666666664e+00 4551 3937 1.0668750000000001e+01 4551 3648 -1.0666666666666666e+01 4551 2786 1.0668750000000001e+01 4552 4552 4.2691666666666663e+01 4552 3928 -5.3322916666666664e+00 4552 4568 2.1331249999999997e+01 4552 4550 -1.0666666666666666e+01 4552 3875 -5.3322916666666664e+00 4552 3874 6.2500000000000003e-03 4552 3873 -5.3322916666666664e+00 4552 3927 6.2500000000000003e-03 4552 4559 -2.1331249999999997e+01 4552 4547 -1.0666666666666666e+01 4552 3920 -5.3322916666666664e+00 4552 3926 1.0668750000000001e+01 4552 2778 1.0668750000000001e+01 4553 4553 4.2691666666666663e+01 4553 4548 -1.0666666666666666e+01 4553 3938 -5.3322916666666664e+00 4553 3937 1.0668750000000001e+01 4553 4581 -2.1331249999999997e+01 4553 4550 -1.0666666666666666e+01 4553 3928 -5.3322916666666664e+00 4553 3926 1.0668750000000001e+01 4554 4554 5.3375000000000014e+01 4554 4386 -6.2499999999999986e-03 4554 4556 -1.0666666666666666e+01 4554 4565 -1.0666666666666668e+01 4554 3911 5.3343749999999996e+00 4554 4547 2.1329166666666669e+01 4554 3913 5.3322916666666664e+00 4554 2990 -1.0662500000000000e+01 4554 2977 -2.0761130467597592e-20 4554 3650 -3.2002083333333331e+01 4555 4555 5.3375000000000000e+01 4555 3918 2.7157993871341005e-20 4555 5075 -3.2002083333333331e+01 4555 4562 -2.1329166666666666e+01 4555 4055 -1.0662500000000000e+01 4555 4051 5.3343749999999996e+00 4555 4386 -6.2499999999999986e-03 4555 4564 -1.0666666666666664e+01 4555 3913 5.3322916666666664e+00 4555 4556 -1.0666666666666666e+01 4556 4556 4.2708333333333329e+01 4556 4554 -1.0666666666666666e+01 4556 4386 1.0666666666666666e+01 4556 4555 -1.0666666666666666e+01 4556 3913 1.0666666666666666e+01 4557 4557 5.3375000000000007e+01 4557 4386 -6.2499999999999986e-03 4557 4565 -1.0666666666666664e+01 4557 3926 -2.7052114752934217e-20 4557 4548 -3.2002083333333331e+01 4557 4547 2.1329166666666666e+01 4557 3911 5.3343749999999996e+00 4557 3920 5.3322916666666664e+00 4557 4558 -1.0666666666666666e+01 4557 2990 -1.0662500000000000e+01 4558 4558 4.2708333333333329e+01 4558 4386 1.0666666666666666e+01 4558 4563 -1.0666666666666666e+01 4558 4557 -1.0666666666666666e+01 4558 3920 1.0666666666666666e+01 4559 4559 5.3374999999999993e+01 4559 3930 2.1705219273391446e-19 4559 3878 -2.1705219273391446e-19 4559 4569 1.0656249999999998e+01 4559 4561 -1.0666666666666666e+01 4559 3874 -1.0657291666666666e+01 4559 3873 1.5998958333333331e+01 4559 4552 -2.1331249999999997e+01 4559 4547 1.0658333333333333e+01 4559 3927 -1.0657291666666666e+01 4559 3920 1.5998958333333331e+01 4559 3926 -5.3312499999999998e+00 4559 2778 -5.3312499999999998e+00 4560 4560 7.4712500000000020e+01 4560 3878 -5.3281250000000000e+00 4560 4567 2.1329166666666666e+01 4560 4561 -1.0658333333333331e+01 4560 3919 -5.3322916666666664e+00 4560 3913 3.1999999999999996e+01 4560 4547 1.0658333333333333e+01 4560 3873 2.1333333333333329e+01 4560 2971 -2.1326041666666665e+01 4560 2977 -5.3312499999999998e+00 4560 3640 -2.1331249999999997e+01 4560 2776 -1.0653124999999999e+01 4560 2778 -5.3312499999999998e+00 4561 4561 5.3375000000000000e+01 4561 3923 1.6263032587282567e-19 4561 4562 -3.2002083333333331e+01 4561 4910 2.1329166666666666e+01 4561 3918 1.0662500000000000e+01 4561 3927 2.1684043449710089e-19 4561 3920 5.3322916666666664e+00 4561 3930 -5.3322916666666664e+00 4561 3874 4.9904357809065860e-20 4561 3873 5.3322916666666664e+00 4561 3878 6.2499999999999995e-03 4561 4559 -1.0666666666666666e+01 4561 4569 -1.0666666666666666e+01 4561 3919 -5.3343749999999996e+00 4561 4560 -1.0658333333333331e+01 4561 4567 -1.0666666666666668e+01 4561 3913 -1.0679166666666665e+01 4561 2776 -5.3281250000000000e+00 4561 2971 5.3302083333333332e+00 4562 4562 8.5416666666666671e+01 4562 4051 -2.0833333333333342e-03 4562 4555 -2.1329166666666666e+01 4562 5075 2.1320833333333333e+01 4562 4055 1.0683333333333334e+01 4562 4563 -2.1329166666666669e+01 4562 5073 2.1320833333333333e+01 4562 3920 -1.4583333333333330e-02 4562 3923 -1.0662500000000000e+01 4562 3930 5.3281250000000000e+00 4562 4561 -3.2002083333333331e+01 4562 4910 -2.1320833333333333e+01 4562 3913 1.0658333333333331e+01 4562 3918 -2.1329166666666666e+01 4562 3919 5.3322916666666664e+00 4563 4563 5.3375000000000000e+01 4563 4055 -1.0662500000000000e+01 4563 3923 -2.0761130467597592e-20 4563 5073 -3.2002083333333331e+01 4563 4562 -2.1329166666666669e+01 4563 3920 5.3322916666666664e+00 4563 4386 -6.2499999999999986e-03 4563 4558 -1.0666666666666666e+01 4563 4051 5.3343749999999996e+00 4563 4564 -1.0666666666666668e+01 4564 4564 4.2699999999999996e+01 4564 4555 -1.0666666666666664e+01 4564 4386 1.0672916666666666e+01 4564 4563 -1.0666666666666668e+01 4564 4051 1.0672916666666666e+01 4565 4565 4.2699999999999996e+01 4565 4557 -1.0666666666666664e+01 4565 4386 1.0672916666666666e+01 4565 4554 -1.0666666666666668e+01 4565 3911 1.0672916666666666e+01 4566 4566 7.4712500000000006e+01 4566 3919 5.3322916666666664e+00 4566 4784 1.0658333333333331e+01 4566 4567 -2.1329166666666666e+01 4566 3879 -2.1333333333333336e+01 4566 3878 5.3281250000000000e+00 4566 4786 1.0658333333333333e+01 4566 3914 -3.1999999999999996e+01 4566 2775 5.3312499999999998e+00 4566 2776 1.0653124999999999e+01 4566 3633 2.1331249999999997e+01 4566 2971 2.1326041666666665e+01 4566 2968 5.3312499999999998e+00 4567 4567 4.2699999999999996e+01 4567 3873 -4.0939925783957855e-21 4567 4560 2.1329166666666666e+01 4567 4561 -1.0666666666666668e+01 4567 3913 1.0662500000000000e+01 4567 3914 1.0662500000000000e+01 4567 3919 -1.0672916666666666e+01 4567 3879 1.6284208410963924e-19 4567 4566 -2.1329166666666666e+01 4567 4784 -1.0666666666666664e+01 4567 3878 -1.0672916666666666e+01 4567 2971 -1.0683333333333334e+01 4567 2776 1.0662500000000000e+01 4568 4568 6.4041666666666671e+01 4568 3880 5.3312499999999998e+00 4568 4571 -2.1331249999999997e+01 4568 4580 1.0658333333333333e+01 4568 3933 5.3312499999999998e+00 4568 3927 1.0658333333333333e+01 4568 3928 -2.1331249999999997e+01 4568 3926 5.3312499999999998e+00 4568 4552 2.1331249999999997e+01 4568 4550 -1.0658333333333333e+01 4568 3874 1.0658333333333333e+01 4568 3875 -2.1331249999999997e+01 4568 2778 5.3312499999999998e+00 4569 4569 5.3375000000000000e+01 4569 3877 5.3312499999999998e+00 4569 4570 -2.1331249999999997e+01 4569 4900 -1.0658333333333333e+01 4569 3931 5.3312499999999998e+00 4569 3920 -5.0116116045879435e-20 4569 3927 1.0657291666666666e+01 4569 3930 -1.5998958333333333e+01 4569 3873 2.1705219273391446e-19 4569 4559 1.0656249999999998e+01 4569 4561 -1.0666666666666666e+01 4569 3874 1.0657291666666666e+01 4569 3878 -1.5998958333333333e+01 4570 4570 4.2691666666666663e+01 4570 3881 5.3322916666666664e+00 4570 4572 -2.1331249999999997e+01 4570 4902 1.0666666666666666e+01 4570 3934 5.3322916666666664e+00 4570 3874 -6.2499999999999995e-03 4570 3877 -1.0668750000000001e+01 4570 3878 5.3322916666666664e+00 4570 3927 -6.2499999999999995e-03 4570 4569 -2.1331249999999997e+01 4570 4900 1.0666666666666666e+01 4570 3931 -1.0668750000000001e+01 4570 3930 5.3322916666666664e+00 4571 4571 4.2691666666666663e+01 4571 3875 5.3322916666666664e+00 4571 4568 -2.1331249999999997e+01 4571 4580 -1.0666666666666666e+01 4571 3928 5.3322916666666664e+00 4571 3927 -6.2500000000000003e-03 4571 3934 5.3322916666666664e+00 4571 3933 -1.0668750000000001e+01 4571 3874 -6.2500000000000003e-03 4571 4572 -2.1331249999999997e+01 4571 4924 1.0666666666666666e+01 4571 3881 5.3322916666666664e+00 4571 3880 -1.0668750000000001e+01 4572 4572 6.4041666666666671e+01 4572 3877 5.3312499999999998e+00 4572 4570 -2.1331249999999997e+01 4572 4902 -1.0658333333333333e+01 4572 3931 5.3312499999999998e+00 4572 3927 1.0658333333333333e+01 4572 3934 -2.1331249999999997e+01 4572 3933 5.3312499999999998e+00 4572 4571 -2.1331249999999997e+01 4572 4924 -1.0658333333333333e+01 4572 3874 1.0658333333333333e+01 4572 3881 -2.1331249999999997e+01 4572 3880 5.3312499999999998e+00 4573 4573 3.2020833333333336e+01 4574 4574 2.1354166666666668e+01 4575 4575 3.2020833333333336e+01 4576 4576 4.2691666666666663e+01 4577 4577 4.2691666666666663e+01 4578 4578 2.1354166666666668e+01 4579 4579 6.4041666666666671e+01 4579 3940 -5.3312499999999998e+00 4579 4928 -2.1331249999999997e+01 4579 4580 -1.0658333333333333e+01 4579 4275 2.1331249999999997e+01 4579 4274 -5.3312499999999998e+00 4579 4551 -2.1331249999999997e+01 4579 4550 1.0658333333333333e+01 4579 3938 2.1331249999999997e+01 4579 3937 -5.3312499999999998e+00 4579 2786 -5.3312499999999998e+00 4580 4580 4.2733333333333334e+01 4580 3874 1.0416666666666669e-03 4580 3927 1.0416666666666667e-03 4580 3928 -6.2500000000000003e-03 4580 3933 4.1666666666666666e-03 4580 4568 1.0658333333333333e+01 4580 4571 -1.0666666666666666e+01 4580 4275 -6.2500000000000003e-03 4580 4274 4.1666666666666666e-03 4580 4579 -1.0658333333333333e+01 4580 4928 1.0666666666666666e+01 4580 3875 -6.2500000000000003e-03 4580 3880 4.1666666666666666e-03 4580 4582 -1.0658333333333333e+01 4580 4927 1.0666666666666666e+01 4580 3938 -6.2500000000000003e-03 4580 3940 4.1666666666666666e-03 4580 4581 -1.0658333333333333e+01 4580 4583 -1.0666666666666666e+01 4580 2784 1.0416666666666669e-03 4580 2769 1.0416666666666667e-03 4581 4581 6.4041666666666671e+01 4581 3933 -5.3312499999999998e+00 4581 3937 -5.3312499999999998e+00 4581 4553 -2.1331249999999997e+01 4581 4550 1.0658333333333333e+01 4581 3928 2.1331249999999997e+01 4581 3926 -5.3312499999999998e+00 4581 4583 2.1331249999999997e+01 4581 4580 -1.0658333333333333e+01 4581 3938 2.1331249999999997e+01 4581 3940 -5.3312499999999998e+00 4582 4582 6.4041666666666671e+01 4582 4550 1.0658333333333333e+01 4582 4275 2.1331249999999997e+01 4582 4274 -5.3312499999999998e+00 4582 4927 -2.1331249999999997e+01 4582 4580 -1.0658333333333333e+01 4582 3875 2.1331249999999997e+01 4582 3880 -5.3312499999999998e+00 4582 2778 -5.3312499999999998e+00 4582 3350 -2.1331249999999997e+01 4582 2786 -5.3312499999999998e+00 4582 2784 -1.0658333333333333e+01 4582 2769 -1.0658333333333333e+01 4583 4583 4.2691666666666663e+01 4583 3928 5.3322916666666664e+00 4583 4923 1.0666666666666666e+01 4583 3933 -1.0668750000000001e+01 4583 4581 2.1331249999999997e+01 4583 4580 -1.0666666666666666e+01 4583 3938 5.3322916666666664e+00 4583 3940 -1.0668750000000001e+01 4584 4584 3.2020833333333336e+01 4585 4585 3.2020833333333336e+01 4586 4586 4.2733333333333334e+01 4586 4029 -1.0416666666666669e-03 4586 4041 6.2500000000000003e-03 4586 4027 -4.1666666666666666e-03 4586 4613 1.0658333333333333e+01 4586 4589 -1.0666666666666666e+01 4586 3858 -1.0416666666666667e-03 4586 4614 1.0658333333333333e+01 4586 4591 -1.0666666666666666e+01 4586 3975 -1.0416666666666669e-03 4586 3844 -1.0416666666666669e-03 4586 3846 6.2500000000000003e-03 4586 3842 -4.1666666666666666e-03 4586 3970 -1.0416666666666667e-03 4586 3974 6.2500000000000003e-03 4586 3973 -4.1666666666666666e-03 4586 4603 -1.0658333333333333e+01 4586 4594 -1.0666666666666666e+01 4586 3950 -1.0416666666666667e-03 4586 3949 6.2500000000000003e-03 4586 3948 -4.1666666666666666e-03 4586 4611 1.0658333333333333e+01 4586 4587 -1.0666666666666666e+01 4587 4587 4.2691666666666663e+01 4587 3950 6.2500000000000003e-03 4587 3948 1.0668749999999999e+01 4587 3975 6.2500000000000003e-03 4587 3973 1.0668749999999999e+01 4587 3974 -5.3322916666666664e+00 4587 4611 -2.1331249999999997e+01 4587 4586 -1.0666666666666666e+01 4587 3949 -5.3322916666666664e+00 4587 1434 -5.3322916666666664e+00 4587 1926 -2.1331249999999997e+01 4587 1930 1.0666666666666666e+01 4587 1467 -5.3322916666666664e+00 4588 4588 6.4058333333333323e+01 4588 3948 1.5995833333333334e+01 4588 4015 5.3291666666666666e+00 4588 4027 -4.1666666666666666e-03 4588 4596 -1.0666666666666666e+01 4588 4589 -1.0666666666666666e+01 4588 1439 -5.3322916666666664e+00 4588 2136 -3.2002083333333331e+01 4588 2133 2.1320833333333333e+01 4588 1254 -5.3281250000000000e+00 4589 4589 4.2691666666666663e+01 4589 3949 -5.3322916666666664e+00 4589 4613 -2.1331249999999997e+01 4589 4586 -1.0666666666666666e+01 4589 4041 -5.3322916666666664e+00 4589 4027 1.0668750000000001e+01 4589 4588 -1.0666666666666666e+01 4589 3948 1.0668750000000001e+01 4590 4590 4.2733333333333334e+01 4590 3858 -1.0416666666666669e-03 4590 3958 -1.0416666666666669e-03 4590 3845 -1.0416666666666667e-03 4590 3857 6.2500000000000003e-03 4590 3842 -4.1666666666666666e-03 4590 4610 -1.0658333333333333e+01 4590 4593 -1.0666666666666666e+01 4590 4018 -1.0416666666666669e-03 4590 4016 6.2500000000000003e-03 4590 4015 -4.1666666666666666e-03 4590 4649 1.0658333333333333e+01 4590 4596 -1.0666666666666666e+01 4590 3962 -1.0416666666666667e-03 4590 3961 6.2500000000000003e-03 4590 3956 -4.1666666666666666e-03 4590 4650 1.0658333333333333e+01 4590 4595 -1.0666666666666666e+01 4590 4029 -1.0416666666666667e-03 4590 4028 6.2500000000000003e-03 4590 4027 -4.1666666666666666e-03 4590 4648 1.0658333333333333e+01 4590 4591 -1.0666666666666666e+01 4591 4591 4.2691666666666663e+01 4591 3857 -5.3322916666666664e+00 4591 4041 -5.3322916666666664e+00 4591 3858 6.2500000000000003e-03 4591 4614 -2.1331249999999997e+01 4591 4586 -1.0666666666666666e+01 4591 3846 -5.3322916666666664e+00 4591 3842 1.0668750000000001e+01 4591 4029 6.2500000000000003e-03 4591 4648 -2.1331249999999997e+01 4591 4590 -1.0666666666666666e+01 4591 4028 -5.3322916666666664e+00 4591 4027 1.0668750000000001e+01 4592 4592 4.2733333333333327e+01 4592 3957 6.2500000000000003e-03 4592 3956 -4.1666666666666666e-03 4592 3972 6.2500000000000003e-03 4592 3973 -4.1666666666666666e-03 4592 3845 -1.0416666666666669e-03 4592 3970 -1.0416666666666669e-03 4592 3844 -1.0416666666666667e-03 4592 3843 6.2500000000000003e-03 4592 3842 -4.1666666666666666e-03 4592 4598 1.0658333333333333e+01 4592 4594 -1.0666666666666666e+01 4592 3958 -1.0416666666666667e-03 4592 4599 1.0658333333333333e+01 4592 4593 -1.0666666666666666e+01 4592 1454 -1.0416666666666669e-03 4592 1646 -1.0416666666666669e-03 4592 1458 -1.0416666666666667e-03 4592 1457 6.2500000000000003e-03 4592 1456 -4.1666666666666666e-03 4592 2194 1.0658333333333333e+01 4592 2193 -1.0666666666666666e+01 4592 1463 -1.0416666666666667e-03 4592 1937 1.0658333333333333e+01 4592 1936 1.0666666666666666e+01 4593 4593 4.2691666666666663e+01 4593 3961 -5.3322916666666664e+00 4593 4610 2.1331249999999997e+01 4593 4590 -1.0666666666666666e+01 4593 3857 -5.3322916666666664e+00 4593 3845 6.2500000000000003e-03 4593 3843 -5.3322916666666664e+00 4593 3842 1.0668750000000001e+01 4593 3958 6.2500000000000003e-03 4593 4599 -2.1331249999999997e+01 4593 4592 -1.0666666666666666e+01 4593 3957 -5.3322916666666664e+00 4593 3956 1.0668750000000001e+01 4594 4594 4.2691666666666663e+01 4594 3846 -5.3322916666666664e+00 4594 4603 2.1331249999999997e+01 4594 4586 -1.0666666666666666e+01 4594 3974 -5.3322916666666664e+00 4594 3970 6.2500000000000003e-03 4594 3972 -5.3322916666666664e+00 4594 3973 1.0668750000000001e+01 4594 3844 6.2500000000000003e-03 4594 4598 -2.1331249999999997e+01 4594 4592 -1.0666666666666666e+01 4594 3843 -5.3322916666666664e+00 4594 3842 1.0668750000000001e+01 4595 4595 4.2691666666666663e+01 4595 4018 6.2499999999999995e-03 4595 4015 1.0668749999999999e+01 4595 3962 6.2499999999999995e-03 4595 3956 1.0668749999999999e+01 4595 4016 -5.3322916666666664e+00 4595 4650 -2.1331249999999997e+01 4595 4590 -1.0666666666666666e+01 4595 3961 -5.3322916666666664e+00 4595 1254 -5.3322916666666664e+00 4595 2132 -2.1331249999999997e+01 4595 2133 1.0666666666666666e+01 4595 1647 -5.3322916666666664e+00 4596 4596 4.2691666666666663e+01 4596 4588 -1.0666666666666666e+01 4596 4028 -5.3322916666666664e+00 4596 4027 1.0668750000000001e+01 4596 4649 -2.1331249999999997e+01 4596 4590 -1.0666666666666666e+01 4596 4016 -5.3322916666666664e+00 4596 4015 1.0668750000000001e+01 4597 4597 4.2733333333333327e+01 4597 3972 6.2500000000000003e-03 4597 3971 -4.1666666666666666e-03 4597 3957 6.2500000000000003e-03 4597 3844 -1.0416666666666669e-03 4597 3958 -1.0416666666666669e-03 4597 3845 -1.0416666666666667e-03 4597 3843 6.2500000000000003e-03 4597 3851 -4.1666666666666666e-03 4597 4599 1.0658333333333333e+01 4597 4605 1.0666666666666666e+01 4597 3970 -1.0416666666666667e-03 4597 4598 1.0658333333333333e+01 4597 4602 1.0666666666666666e+01 4597 1458 -1.0416666666666669e-03 4597 1463 -1.0416666666666669e-03 4597 1454 -1.0416666666666667e-03 4597 1457 6.2500000000000003e-03 4597 431 -4.1666666666666666e-03 4597 1937 1.0658333333333333e+01 4597 1014 -1.0666666666666666e+01 4597 1646 -1.0416666666666667e-03 4597 491 -4.1666666666666666e-03 4597 2194 1.0658333333333333e+01 4597 1013 -1.0666666666666666e+01 4598 4598 6.4041666666666671e+01 4598 3851 -5.3312499999999998e+00 4598 3973 -5.3312499999999998e+00 4598 4594 -2.1331249999999997e+01 4598 4592 1.0658333333333333e+01 4598 3844 -1.0658333333333333e+01 4598 3843 2.1331249999999997e+01 4598 3842 -5.3312499999999998e+00 4598 4602 2.1331249999999997e+01 4598 4597 1.0658333333333333e+01 4598 3970 -1.0658333333333333e+01 4598 3972 2.1331249999999997e+01 4598 3971 -5.3312499999999998e+00 4599 4599 6.4041666666666671e+01 4599 4605 2.1331249999999997e+01 4599 4597 1.0658333333333333e+01 4599 3851 -5.3312499999999998e+00 4599 3845 -1.0658333333333333e+01 4599 3843 2.1331249999999997e+01 4599 3842 -5.3312499999999998e+00 4599 4593 -2.1331249999999997e+01 4599 4592 1.0658333333333333e+01 4599 3958 -1.0658333333333333e+01 4599 3957 2.1331249999999997e+01 4599 3956 -5.3312499999999998e+00 4599 491 -5.3312499999999998e+00 4600 4600 4.2666666666916662e+01 4600 3848 5.3333333333229165e+00 4600 3974 5.3333333333229165e+00 4600 3844 -6.2500000000000004e-11 4600 4603 -2.1333333333312499e+01 4600 4612 -1.0666666666666666e+01 4600 3846 5.3333333333229165e+00 4600 3850 -1.0666666666687499e+01 4600 3970 -6.2500000000000004e-11 4600 4601 -2.1333333333312499e+01 4600 4888 1.0666666666666666e+01 4600 3967 5.3333333333229165e+00 4600 3969 -1.0666666666687499e+01 4601 4601 6.4000000000416662e+01 4601 3850 5.3333333333124999e+00 4601 3966 5.3333333333124999e+00 4601 4447 2.1333333333312499e+01 4601 4436 -1.0666666666583334e+01 4601 3844 1.0666666666583334e+01 4601 3848 -2.1333333333312499e+01 4601 3847 5.3333333333124999e+00 4601 4600 -2.1333333333312499e+01 4601 4888 -1.0666666666583334e+01 4601 3970 1.0666666666583334e+01 4601 3967 -2.1333333333312499e+01 4601 3969 5.3333333333124999e+00 4602 4602 4.2691666666666663e+01 4602 3843 5.3322916666666664e+00 4602 3978 5.3322916666666664e+00 4602 3844 -6.2500000000000003e-03 4602 4604 -2.1331249999999997e+01 4602 4889 -1.0666666666666666e+01 4602 3849 5.3322916666666664e+00 4602 3851 -1.0668750000000001e+01 4602 3970 -6.2500000000000003e-03 4602 4598 2.1331249999999997e+01 4602 4597 1.0666666666666666e+01 4602 3972 5.3322916666666664e+00 4602 3971 -1.0668750000000001e+01 4603 4603 6.4020833333541674e+01 4603 3969 5.3333333333124999e+00 4603 4600 -2.1333333333312499e+01 4603 4612 1.0666666666583334e+01 4603 3850 5.3333333333124999e+00 4603 3844 1.0662499999958333e+01 4603 3846 -2.1332291666656246e+01 4603 3842 5.3312499999999998e+00 4603 4594 2.1331249999999997e+01 4603 4586 -1.0658333333333333e+01 4603 3970 1.0662499999958333e+01 4603 3974 -2.1332291666656246e+01 4603 3973 5.3312499999999998e+00 4604 4604 6.4020833333541660e+01 4604 3971 5.3312499999999998e+00 4604 4602 -2.1331249999999997e+01 4604 4889 1.0658333333333333e+01 4604 3851 5.3312499999999998e+00 4604 3844 1.0662499999958333e+01 4604 3849 -2.1332291666656250e+01 4604 3847 5.3333333333124999e+00 4604 4447 2.1333333333312499e+01 4604 4438 -1.0666666666583334e+01 4604 3970 1.0662499999958333e+01 4604 3978 -2.1332291666656250e+01 4604 3966 5.3333333333124999e+00 4605 4605 4.2691666666666663e+01 4605 3957 5.3322916666666664e+00 4605 4599 2.1331249999999997e+01 4605 4597 1.0666666666666666e+01 4605 3843 5.3322916666666664e+00 4605 3845 -6.2500000000000003e-03 4605 3852 5.3322916666666664e+00 4605 3851 -1.0668750000000001e+01 4605 3958 -6.2500000000000003e-03 4605 4606 -2.1331249999999997e+01 4605 3662 1.0666666666666666e+01 4605 2830 5.3322916666666664e+00 4605 491 -1.0668750000000001e+01 4606 4606 6.4041666666666671e+01 4606 4607 -2.1331249999999997e+01 4606 3853 5.3312499999999998e+00 4606 3845 1.0658333333333333e+01 4606 3852 -2.1331249999999997e+01 4606 3851 5.3312499999999998e+00 4606 4605 -2.1331249999999997e+01 4606 3958 1.0658333333333333e+01 4606 2829 5.3312499999999998e+00 4606 3692 -1.0658333333333333e+01 4606 3662 -1.0658333333333333e+01 4606 2830 -2.1331249999999997e+01 4606 491 5.3312499999999998e+00 4607 4607 4.2691666666666663e+01 4607 3854 5.3322916666666664e+00 4607 4608 -2.1331249999999997e+01 4607 4634 -1.0666666666666666e+01 4607 3960 5.3322916666666664e+00 4607 3958 -6.2500000000000003e-03 4607 3845 -6.2500000000000003e-03 4607 4606 -2.1331249999999997e+01 4607 3852 5.3322916666666664e+00 4607 3853 -1.0668750000000001e+01 4607 2830 5.3322916666666664e+00 4607 2829 -1.0668750000000001e+01 4607 3692 1.0666666666666666e+01 4608 4608 6.4041666666666671e+01 4608 3959 5.3312499999999998e+00 4608 4609 -2.1331249999999997e+01 4608 4620 -1.0658333333333333e+01 4608 3856 5.3312499999999998e+00 4608 3845 1.0658333333333333e+01 4608 3854 -2.1331249999999997e+01 4608 3853 5.3312499999999998e+00 4608 4607 -2.1331249999999997e+01 4608 4634 1.0658333333333333e+01 4608 3958 1.0658333333333333e+01 4608 3960 -2.1331249999999997e+01 4608 2829 5.3312499999999998e+00 4609 4609 4.2691666666666663e+01 4609 3960 5.3322916666666664e+00 4609 4608 -2.1331249999999997e+01 4609 4620 1.0666666666666666e+01 4609 3854 5.3322916666666664e+00 4609 3845 -6.2500000000000003e-03 4609 3857 5.3322916666666664e+00 4609 3856 -1.0668750000000001e+01 4609 3958 -6.2500000000000003e-03 4609 4610 -2.1331249999999997e+01 4609 4626 1.0666666666666666e+01 4609 3961 5.3322916666666664e+00 4609 3959 -1.0668750000000001e+01 4610 4610 6.4041666666666671e+01 4610 3956 5.3312499999999998e+00 4610 4593 2.1331249999999997e+01 4610 4590 -1.0658333333333333e+01 4610 3842 5.3312499999999998e+00 4610 3845 1.0658333333333333e+01 4610 3857 -2.1331249999999997e+01 4610 3856 5.3312499999999998e+00 4610 4609 -2.1331249999999997e+01 4610 4626 -1.0658333333333333e+01 4610 3958 1.0658333333333333e+01 4610 3961 -2.1331249999999997e+01 4610 3959 5.3312499999999998e+00 4611 4611 6.4020833333541674e+01 4611 3953 -5.3333333333124999e+00 4611 4615 -2.1333333333312499e+01 4611 4612 -1.0666666666583334e+01 4611 3969 -5.3333333333124999e+00 4611 3975 -1.0662499999958333e+01 4611 3974 2.1332291666656246e+01 4611 3973 -5.3312499999999998e+00 4611 4587 -2.1331249999999997e+01 4611 4586 1.0658333333333333e+01 4611 3950 -1.0662499999958333e+01 4611 3949 2.1332291666656246e+01 4611 3948 -5.3312499999999998e+00 4612 4612 4.2666666667333331e+01 4612 3858 1.0416666666666666e-11 4612 4029 1.0416666666666666e-11 4612 4041 -6.2499999999999991e-11 4612 4034 4.1666666666666665e-11 4612 4614 -1.0666666666583334e+01 4612 4892 1.0666666666666666e+01 4612 3970 1.0416666666666666e-11 4612 3950 1.0416666666666666e-11 4612 3975 1.0416666666666666e-11 4612 3974 -6.2499999999999991e-11 4612 3969 4.1666666666666665e-11 4612 4611 -1.0666666666583334e+01 4612 4615 1.0666666666666666e+01 4612 3844 1.0416666666666666e-11 4612 3846 -6.2499999999999991e-11 4612 3850 4.1666666666666665e-11 4612 4603 1.0666666666583334e+01 4612 4600 -1.0666666666666666e+01 4612 3949 -6.2499999999999991e-11 4612 3953 4.1666666666666665e-11 4612 4613 -1.0666666666583334e+01 4612 4657 -1.0666666666666666e+01 4613 4613 6.4020833333541660e+01 4613 4034 -5.3333333333124999e+00 4613 3948 -5.3312499999999998e+00 4613 4589 -2.1331249999999997e+01 4613 4586 1.0658333333333333e+01 4613 4041 2.1332291666656246e+01 4613 4027 -5.3312499999999998e+00 4613 4657 2.1333333333312499e+01 4613 4612 -1.0666666666583334e+01 4613 3949 2.1332291666656250e+01 4613 3953 -5.3333333333124999e+00 4614 4614 6.4020833333541674e+01 4614 3850 -5.3333333333124999e+00 4614 4892 -2.1333333333312499e+01 4614 4612 -1.0666666666583334e+01 4614 4034 -5.3333333333124999e+00 4614 4029 -1.0662499999958333e+01 4614 4041 2.1332291666656246e+01 4614 4027 -5.3312499999999998e+00 4614 4591 -2.1331249999999997e+01 4614 4586 1.0658333333333333e+01 4614 3858 -1.0662499999958333e+01 4614 3846 2.1332291666656246e+01 4614 3842 -5.3312499999999998e+00 4615 4615 4.2666666666916662e+01 4615 3975 6.2499999999999991e-11 4615 3969 1.0666666666687499e+01 4615 3950 6.2500000000000004e-11 4615 3953 1.0666666666687499e+01 4615 3949 -5.3333333333229165e+00 4615 4611 -2.1333333333312499e+01 4615 4612 1.0666666666666666e+01 4615 3974 -5.3333333333229165e+00 4615 1468 -5.3333333333229165e+00 4615 1950 2.1333333333312499e+01 4615 2074 -1.0666666666666666e+01 4615 1438 -5.3333333333229165e+00 4616 4616 4.2733333333333334e+01 4616 4294 -4.1666666666666666e-03 4616 4625 -1.0666666666666666e+01 4616 4623 -1.0666666666666666e+01 4616 3990 -4.1666666666666666e-03 4616 3998 -4.1666666666666666e-03 4616 4629 -1.0666666666666666e+01 4616 3979 -4.1666666666666666e-03 4616 4617 -1.0666666666666666e+01 4617 4617 4.2691666666666663e+01 4617 3985 -5.3322916666666664e+00 4617 4646 2.1331249999999997e+01 4617 4618 -1.0666666666666666e+01 4617 4011 -5.3322916666666664e+00 4617 3998 1.0668750000000001e+01 4617 4616 -1.0666666666666666e+01 4617 3979 1.0668750000000001e+01 4618 4618 4.2733333333333334e+01 4618 4000 -1.0416666666666669e-03 4618 4011 6.2500000000000003e-03 4618 3998 -4.1666666666666666e-03 4618 4646 -1.0658333333333333e+01 4618 4617 -1.0666666666666666e+01 4618 3855 -1.0416666666666667e-03 4618 4968 -1.0658333333333333e+01 4618 4621 -1.0666666666666666e+01 4618 3858 -1.0416666666666669e-03 4618 3859 6.2500000000000003e-03 4618 3856 -4.1666666666666666e-03 4618 4029 -1.0416666666666667e-03 4618 4040 6.2500000000000003e-03 4618 4030 -4.1666666666666666e-03 4618 4970 -1.0658333333333333e+01 4618 4630 -1.0666666666666666e+01 4618 3985 6.2500000000000003e-03 4618 3979 -4.1666666666666666e-03 4618 4758 -1.0658333333333333e+01 4618 4619 -1.0666666666666666e+01 4619 4619 4.2691666666666663e+01 4619 4624 -1.0666666666666666e+01 4619 4040 -5.3322916666666664e+00 4619 4030 1.0668750000000001e+01 4619 4758 2.1331249999999997e+01 4619 4618 -1.0666666666666666e+01 4619 3985 -5.3322916666666664e+00 4619 3979 1.0668750000000001e+01 4620 4620 4.2733333333333334e+01 4620 3855 -1.0416666666666669e-03 4620 3958 -1.0416666666666669e-03 4620 3845 -1.0416666666666667e-03 4620 3854 6.2500000000000003e-03 4620 3856 -4.1666666666666666e-03 4620 4608 -1.0658333333333333e+01 4620 4609 1.0666666666666666e+01 4620 3991 6.2500000000000003e-03 4620 3990 -4.1666666666666666e-03 4620 4635 1.0658333333333333e+01 4620 4629 -1.0666666666666666e+01 4620 3960 6.2500000000000003e-03 4620 3959 -4.1666666666666666e-03 4620 4636 1.0658333333333333e+01 4620 4628 -1.0666666666666666e+01 4620 4000 -1.0416666666666667e-03 4620 3999 6.2500000000000003e-03 4620 3998 -4.1666666666666666e-03 4620 4633 1.0658333333333333e+01 4620 4621 -1.0666666666666666e+01 4620 3014 -1.0416666666666669e-03 4620 2831 -1.0416666666666667e-03 4621 4621 4.2691666666666663e+01 4621 3854 -5.3322916666666664e+00 4621 4011 -5.3322916666666664e+00 4621 3855 6.2500000000000003e-03 4621 4968 2.1331249999999997e+01 4621 4618 -1.0666666666666666e+01 4621 3859 -5.3322916666666664e+00 4621 3856 1.0668750000000001e+01 4621 4000 6.2500000000000003e-03 4621 4633 -2.1331249999999997e+01 4621 4620 -1.0666666666666666e+01 4621 3999 -5.3322916666666664e+00 4621 3998 1.0668750000000001e+01 4622 4622 4.2733333333333334e+01 4622 4018 -1.0416666666666669e-03 4622 4024 6.2500000000000003e-03 4622 4023 -4.1666666666666666e-03 4622 4972 1.0658333333333333e+01 4622 4632 -1.0666666666666666e+01 4622 3962 -1.0416666666666667e-03 4622 4655 -1.0658333333333333e+01 4622 4631 -1.0666666666666666e+01 4622 3965 6.2500000000000003e-03 4622 3959 -4.1666666666666666e-03 4622 3995 6.2500000000000003e-03 4622 3990 -4.1666666666666666e-03 4622 4641 -1.0658333333333333e+01 4622 4628 -1.0666666666666666e+01 4622 4295 6.2500000000000003e-03 4622 4294 -4.1666666666666666e-03 4622 4971 1.0658333333333333e+01 4622 4623 -1.0666666666666666e+01 4622 2831 -1.0416666666666669e-03 4622 3014 -1.0416666666666667e-03 4623 4623 4.2691666666666663e+01 4623 3995 -5.3322916666666664e+00 4623 4616 -1.0666666666666666e+01 4623 3990 1.0668750000000001e+01 4623 4971 -2.1331249999999997e+01 4623 4622 -1.0666666666666666e+01 4623 4295 -5.3322916666666664e+00 4623 4294 1.0668750000000001e+01 4624 4624 4.2733333333333334e+01 4624 4030 -4.1666666666666666e-03 4624 4619 -1.0666666666666666e+01 4624 4627 -1.0666666666666666e+01 4624 4023 -4.1666666666666666e-03 4624 4294 -4.1666666666666666e-03 4624 4632 -1.0666666666666666e+01 4624 3979 -4.1666666666666666e-03 4624 4625 -1.0666666666666666e+01 4625 4625 4.2691666666666663e+01 4625 4616 -1.0666666666666666e+01 4625 4294 1.0668750000000001e+01 4625 4624 -1.0666666666666666e+01 4625 3979 1.0668750000000001e+01 4626 4626 4.2733333333333334e+01 4626 3962 -1.0416666666666669e-03 4626 4018 -1.0416666666666667e-03 4626 4016 6.2500000000000003e-03 4626 4023 -4.1666666666666666e-03 4626 4650 1.0658333333333333e+01 4626 4631 -1.0666666666666666e+01 4626 3845 -1.0416666666666669e-03 4626 4029 -1.0416666666666669e-03 4626 3858 -1.0416666666666667e-03 4626 3857 6.2500000000000003e-03 4626 3856 -4.1666666666666666e-03 4626 4648 1.0658333333333333e+01 4626 4630 -1.0666666666666666e+01 4626 3958 -1.0416666666666667e-03 4626 3961 6.2500000000000003e-03 4626 3959 -4.1666666666666666e-03 4626 4610 -1.0658333333333333e+01 4626 4609 1.0666666666666666e+01 4626 4028 6.2500000000000003e-03 4626 4030 -4.1666666666666666e-03 4626 4649 1.0658333333333333e+01 4626 4627 -1.0666666666666666e+01 4627 4627 4.2691666666666663e+01 4627 4016 -5.3322916666666664e+00 4627 4624 -1.0666666666666666e+01 4627 4023 1.0668750000000001e+01 4627 4649 -2.1331249999999997e+01 4627 4626 -1.0666666666666666e+01 4627 4028 -5.3322916666666664e+00 4627 4030 1.0668750000000001e+01 4628 4628 4.2691666666666663e+01 4628 3965 -5.3322916666666664e+00 4628 4641 2.1331249999999997e+01 4628 4622 -1.0666666666666666e+01 4628 3995 -5.3322916666666664e+00 4628 3991 -5.3322916666666664e+00 4628 3990 1.0668750000000001e+01 4628 4636 -2.1331249999999997e+01 4628 4620 -1.0666666666666666e+01 4628 3960 -5.3322916666666664e+00 4628 3959 1.0668750000000001e+01 4628 3014 6.2500000000000003e-03 4628 2831 6.2500000000000003e-03 4629 4629 4.2691666666666663e+01 4629 4616 -1.0666666666666666e+01 4629 3999 -5.3322916666666664e+00 4629 3998 1.0668750000000001e+01 4629 4635 -2.1331249999999997e+01 4629 4620 -1.0666666666666666e+01 4629 3991 -5.3322916666666664e+00 4629 3990 1.0668750000000001e+01 4630 4630 4.2691666666666663e+01 4630 3859 -5.3322916666666664e+00 4630 4970 2.1331249999999997e+01 4630 4618 -1.0666666666666666e+01 4630 4040 -5.3322916666666664e+00 4630 4029 6.2500000000000003e-03 4630 4028 -5.3322916666666664e+00 4630 4030 1.0668750000000001e+01 4630 3858 6.2500000000000003e-03 4630 4648 -2.1331249999999997e+01 4630 4626 -1.0666666666666666e+01 4630 3857 -5.3322916666666664e+00 4630 3856 1.0668750000000001e+01 4631 4631 4.2691666666666663e+01 4631 3961 -5.3322916666666664e+00 4631 4650 -2.1331249999999997e+01 4631 4626 -1.0666666666666666e+01 4631 4016 -5.3322916666666664e+00 4631 4018 6.2500000000000003e-03 4631 4024 -5.3322916666666664e+00 4631 4023 1.0668750000000001e+01 4631 3962 6.2500000000000003e-03 4631 4655 2.1331249999999997e+01 4631 4622 -1.0666666666666666e+01 4631 3965 -5.3322916666666664e+00 4631 3959 1.0668750000000001e+01 4632 4632 4.2691666666666663e+01 4632 4624 -1.0666666666666666e+01 4632 4295 -5.3322916666666664e+00 4632 4294 1.0668750000000001e+01 4632 4972 -2.1331249999999997e+01 4632 4622 -1.0666666666666666e+01 4632 4024 -5.3322916666666664e+00 4632 4023 1.0668750000000001e+01 4633 4633 6.4041666666666671e+01 4633 3856 -5.3312499999999998e+00 4633 4001 -5.3312499999999998e+00 4633 4966 -2.1331249999999997e+01 4633 4634 -1.0658333333333333e+01 4633 3855 -1.0658333333333333e+01 4633 3854 2.1331249999999997e+01 4633 3853 -5.3312499999999998e+00 4633 4621 -2.1331249999999997e+01 4633 4620 1.0658333333333333e+01 4633 4000 -1.0658333333333333e+01 4633 3999 2.1331249999999997e+01 4633 3998 -5.3312499999999998e+00 4634 4634 4.2733333333333334e+01 4634 3991 -6.2500000000000003e-03 4634 4636 -1.0658333333333333e+01 4634 3845 1.0416666666666669e-03 4634 4000 1.0416666666666669e-03 4634 3855 1.0416666666666667e-03 4634 3854 -6.2500000000000003e-03 4634 3853 4.1666666666666666e-03 4634 4633 -1.0658333333333333e+01 4634 4966 1.0666666666666666e+01 4634 3958 1.0416666666666667e-03 4634 3960 -6.2500000000000003e-03 4634 4608 1.0658333333333333e+01 4634 4607 -1.0666666666666666e+01 4634 3999 -6.2500000000000003e-03 4634 4001 4.1666666666666666e-03 4634 4635 -1.0658333333333333e+01 4634 4637 -1.0666666666666666e+01 4634 2831 1.0416666666666669e-03 4634 3014 1.0416666666666667e-03 4634 3011 4.1666666666666666e-03 4634 3693 1.0666666666666666e+01 4634 2829 4.1666666666666666e-03 4635 4635 6.4041666666666671e+01 4635 3998 -5.3312499999999998e+00 4635 4629 -2.1331249999999997e+01 4635 4620 1.0658333333333333e+01 4635 3991 2.1331249999999997e+01 4635 3990 -5.3312499999999998e+00 4635 4637 2.1331249999999997e+01 4635 4634 -1.0658333333333333e+01 4635 3999 2.1331249999999997e+01 4635 4001 -5.3312499999999998e+00 4635 3011 -5.3312499999999998e+00 4636 4636 6.4041666666666671e+01 4636 4634 -1.0658333333333333e+01 4636 3991 2.1331249999999997e+01 4636 3990 -5.3312499999999998e+00 4636 4628 -2.1331249999999997e+01 4636 4620 1.0658333333333333e+01 4636 3960 2.1331249999999997e+01 4636 3959 -5.3312499999999998e+00 4636 2829 -5.3312499999999998e+00 4636 3693 -2.1331249999999997e+01 4636 3011 -5.3312499999999998e+00 4636 3014 -1.0658333333333333e+01 4636 2831 -1.0658333333333333e+01 4637 4637 4.2691666666666663e+01 4637 3991 5.3322916666666664e+00 4637 4635 2.1331249999999997e+01 4637 4634 -1.0666666666666666e+01 4637 3999 5.3322916666666664e+00 4637 4001 -1.0668750000000001e+01 4637 3691 1.0666666666666666e+01 4637 3011 -1.0668750000000001e+01 4638 4638 3.2020833333333336e+01 4639 4639 3.2020833333333336e+01 4640 4640 4.2691666666666663e+01 4640 4950 1.0666666666666666e+01 4640 3995 5.3322916666666664e+00 4640 3994 -1.0668750000000001e+01 4640 4641 -2.1331249999999997e+01 4640 4952 1.0666666666666666e+01 4640 3965 5.3322916666666664e+00 4640 3963 -1.0668750000000001e+01 4640 2827 5.3322916666666664e+00 4640 3686 2.1331249999999997e+01 4640 3018 5.3322916666666664e+00 4640 3014 -6.2500000000000003e-03 4640 2831 -6.2500000000000003e-03 4641 4641 6.4041666666666671e+01 4641 3959 5.3312499999999998e+00 4641 4628 2.1331249999999997e+01 4641 4622 -1.0658333333333333e+01 4641 3990 5.3312499999999998e+00 4641 3995 -2.1331249999999997e+01 4641 3994 5.3312499999999998e+00 4641 4640 -2.1331249999999997e+01 4641 4952 -1.0658333333333333e+01 4641 3965 -2.1331249999999997e+01 4641 3963 5.3312499999999998e+00 4641 3014 1.0658333333333333e+01 4641 2831 1.0658333333333333e+01 4642 4642 3.2020833333333336e+01 4643 4643 3.2020833333333336e+01 4644 4644 3.2020833333333336e+01 4645 4645 4.2666666666916662e+01 4645 4011 5.3333333333229165e+00 4645 4736 1.0666666666666666e+01 4645 4003 -1.0666666666687499e+01 4645 4646 -2.1333333333312499e+01 4645 4742 1.0666666666666666e+01 4645 3985 5.3333333333229165e+00 4645 3982 -1.0666666666687499e+01 4646 4646 6.4020833333541660e+01 4646 4003 5.3333333333124999e+00 4646 3979 5.3312499999999998e+00 4646 4617 2.1331249999999997e+01 4646 4618 -1.0658333333333333e+01 4646 4011 -2.1332291666656246e+01 4646 3998 5.3312499999999998e+00 4646 4645 -2.1333333333312499e+01 4646 4742 -1.0666666666583334e+01 4646 3985 -2.1332291666656250e+01 4646 3982 5.3333333333124999e+00 4647 4647 3.2000000000208331e+01 4648 4648 6.4041666666666671e+01 4648 3842 -5.3312499999999998e+00 4648 4030 -5.3312499999999998e+00 4648 4630 -2.1331249999999997e+01 4648 4626 1.0658333333333333e+01 4648 3858 -1.0658333333333333e+01 4648 3857 2.1331249999999997e+01 4648 3856 -5.3312499999999998e+00 4648 4591 -2.1331249999999997e+01 4648 4590 1.0658333333333333e+01 4648 4029 -1.0658333333333333e+01 4648 4028 2.1331249999999997e+01 4648 4027 -5.3312499999999998e+00 4649 4649 6.4041666666666671e+01 4649 4023 -5.3312499999999998e+00 4649 4027 -5.3312499999999998e+00 4649 4596 -2.1331249999999997e+01 4649 4590 1.0658333333333333e+01 4649 4016 2.1331249999999997e+01 4649 4015 -5.3312499999999998e+00 4649 4627 -2.1331249999999997e+01 4649 4626 1.0658333333333333e+01 4649 4028 2.1331249999999997e+01 4649 4030 -5.3312499999999998e+00 4650 4650 6.4041666666666671e+01 4650 3959 -5.3312499999999998e+00 4650 4631 -2.1331249999999997e+01 4650 4626 1.0658333333333333e+01 4650 4023 -5.3312499999999998e+00 4650 4018 -1.0658333333333333e+01 4650 4016 2.1331249999999997e+01 4650 4015 -5.3312499999999998e+00 4650 4595 -2.1331249999999997e+01 4650 4590 1.0658333333333333e+01 4650 3962 -1.0658333333333333e+01 4650 3961 2.1331249999999997e+01 4650 3956 -5.3312499999999998e+00 4651 4651 3.2020833333333336e+01 4652 4652 3.2020833333333336e+01 4653 4653 4.2691666666666663e+01 4653 3965 5.3322916666666664e+00 4653 4655 -2.1331249999999997e+01 4653 4952 1.0666666666666666e+01 4653 4024 5.3322916666666664e+00 4653 4018 -6.2500000000000003e-03 4653 4021 5.3322916666666664e+00 4653 4020 -1.0668750000000001e+01 4653 3962 -6.2500000000000003e-03 4653 4654 2.1331249999999997e+01 4653 4946 1.0666666666666666e+01 4653 3964 5.3322916666666664e+00 4653 3963 -1.0668750000000001e+01 4654 4654 5.3375000000000000e+01 4654 3962 -1.0657291666666666e+01 4654 3964 1.5998958333333331e+01 4654 4018 -1.0657291666666666e+01 4654 4021 1.5998958333333331e+01 4654 4020 -5.3312499999999998e+00 4654 4653 2.1331249999999997e+01 4654 4946 1.0658333333333333e+01 4654 3963 -5.3312499999999998e+00 4654 1647 2.1705219273391446e-19 4654 1254 -2.1705219273391446e-19 4654 2132 -1.0656249999999998e+01 4654 1793 -1.0666666666666666e+01 4655 4655 6.4041666666666671e+01 4655 3963 5.3312499999999998e+00 4655 4653 -2.1331249999999997e+01 4655 4952 -1.0658333333333333e+01 4655 4020 5.3312499999999998e+00 4655 4018 1.0658333333333333e+01 4655 4024 -2.1331249999999997e+01 4655 4023 5.3312499999999998e+00 4655 4631 2.1331249999999997e+01 4655 4622 -1.0658333333333333e+01 4655 3962 1.0658333333333333e+01 4655 3965 -2.1331249999999997e+01 4655 3959 5.3312499999999998e+00 4656 4656 3.2020833333333336e+01 4657 4657 4.2666666666916662e+01 4657 4890 1.0666666666666666e+01 4657 4041 5.3333333333229165e+00 4657 4034 -1.0666666666687499e+01 4657 4613 2.1333333333312499e+01 4657 4612 -1.0666666666666666e+01 4657 3949 5.3333333333229165e+00 4657 3953 -1.0666666666687499e+01 4658 4658 3.2000000000208331e+01 4659 4659 4.2666666667333331e+01 4659 4324 -4.1666666666666665e-11 4659 4666 -1.0666666666666666e+01 4659 4670 -1.0666666666666666e+01 4659 4074 -4.1666666666666665e-11 4659 4091 -4.1666666666666665e-11 4659 4672 -1.0666666666666666e+01 4659 4044 -4.1666666666666665e-11 4659 4660 -1.0666666666666666e+01 4660 4660 4.2666666666916662e+01 4660 4047 -5.3333333333229165e+00 4660 4694 2.1333333333312499e+01 4660 4661 -1.0666666666666666e+01 4660 4102 -5.3333333333229165e+00 4660 4091 1.0666666666687499e+01 4660 4659 -1.0666666666666666e+01 4660 4044 1.0666666666687499e+01 4661 4661 4.2666666667333331e+01 4661 4093 -1.0416666666666666e-11 4661 4102 6.2499999999999991e-11 4661 4091 -4.1666666666666665e-11 4661 4694 -1.0666666666583334e+01 4661 4660 -1.0666666666666666e+01 4661 4179 -1.0416666666666666e-11 4661 4990 -1.0666666666583334e+01 4661 4664 -1.0666666666666666e+01 4661 4172 -1.0416666666666666e-11 4661 4171 6.2499999999999991e-11 4661 4180 -4.1666666666666665e-11 4661 4187 -1.0416666666666666e-11 4661 4195 6.2499999999999991e-11 4661 4188 -4.1666666666666665e-11 4661 4797 -1.0666666666583334e+01 4661 4674 -1.0666666666666666e+01 4661 4047 6.2499999999999991e-11 4661 4044 -4.1666666666666665e-11 4661 4995 1.0666666666583334e+01 4661 4662 -1.0666666666666666e+01 4662 4662 4.2666666666916662e+01 4662 4665 -1.0666666666666666e+01 4662 4195 -5.3333333333229165e+00 4662 4188 1.0666666666687499e+01 4662 4995 -2.1333333333312499e+01 4662 4661 -1.0666666666666666e+01 4662 4047 -5.3333333333229165e+00 4662 4044 1.0666666666687499e+01 4663 4663 4.2666666667333331e+01 4663 4179 -1.0416666666666666e-11 4663 4178 6.2499999999999991e-11 4663 4180 -4.1666666666666665e-11 4663 4681 1.0666666666583334e+01 4663 4673 -1.0666666666666666e+01 4663 4077 -1.0416666666666666e-11 4663 4075 6.2499999999999991e-11 4663 4074 -4.1666666666666665e-11 4663 4679 1.0666666666583334e+01 4663 4672 -1.0666666666666666e+01 4663 4059 -1.0416666666666666e-11 4663 4058 6.2499999999999991e-11 4663 4057 -4.1666666666666665e-11 4663 4680 1.0666666666583334e+01 4663 4671 -1.0666666666666666e+01 4663 4093 -1.0416666666666666e-11 4663 4092 6.2499999999999991e-11 4663 4091 -4.1666666666666665e-11 4663 4677 1.0666666666583334e+01 4663 4664 -1.0666666666666666e+01 4663 3022 -1.0416666666666666e-11 4663 3003 -1.0416666666666666e-11 4664 4664 4.2666666666916662e+01 4664 4178 -5.3333333333229165e+00 4664 4102 -5.3333333333229165e+00 4664 4179 6.2499999999999991e-11 4664 4990 2.1333333333312499e+01 4664 4661 -1.0666666666666666e+01 4664 4171 -5.3333333333229165e+00 4664 4180 1.0666666666687499e+01 4664 4093 6.2499999999999991e-11 4664 4677 -2.1333333333312499e+01 4664 4663 -1.0666666666666666e+01 4664 4092 -5.3333333333229165e+00 4664 4091 1.0666666666687499e+01 4665 4665 4.2666666667333331e+01 4665 4188 -4.1666666666666665e-11 4665 4662 -1.0666666666666666e+01 4665 4668 -1.0666666666666666e+01 4665 4162 -4.1666666666666665e-11 4665 4324 -4.1666666666666665e-11 4665 4676 -1.0666666666666666e+01 4665 4044 -4.1666666666666665e-11 4665 4666 -1.0666666666666666e+01 4666 4666 4.2666666666916662e+01 4666 4659 -1.0666666666666666e+01 4666 4324 1.0666666666687499e+01 4666 4665 -1.0666666666666666e+01 4666 4044 1.0666666666687499e+01 4667 4667 4.2666666667333331e+01 4667 4063 -1.0416666666666666e-11 4667 4159 -1.0416666666666666e-11 4667 4160 6.2499999999999991e-11 4667 4162 -4.1666666666666665e-11 4667 4776 -1.0666666666583334e+01 4667 4675 -1.0666666666666666e+01 4667 4187 -1.0416666666666666e-11 4667 4172 -1.0416666666666666e-11 4667 4181 6.2499999999999991e-11 4667 4180 -4.1666666666666665e-11 4667 4796 -1.0666666666583334e+01 4667 4674 -1.0666666666666666e+01 4667 4065 6.2499999999999991e-11 4667 4057 -4.1666666666666665e-11 4667 4991 -1.0666666666583334e+01 4667 4673 -1.0666666666666666e+01 4667 4186 6.2499999999999991e-11 4667 4188 -4.1666666666666665e-11 4667 4994 1.0666666666583334e+01 4667 4668 -1.0666666666666666e+01 4667 3003 -1.0416666666666666e-11 4667 3022 -1.0416666666666666e-11 4668 4668 4.2666666666916662e+01 4668 4160 -5.3333333333229165e+00 4668 4665 -1.0666666666666666e+01 4668 4162 1.0666666666687499e+01 4668 4994 -2.1333333333312499e+01 4668 4667 -1.0666666666666666e+01 4668 4186 -5.3333333333229165e+00 4668 4188 1.0666666666687499e+01 4669 4669 4.2666666667333331e+01 4669 4059 -1.0416666666666666e-11 4669 4077 -1.0416666666666666e-11 4669 4088 6.2499999999999991e-11 4669 4074 -4.1666666666666665e-11 4669 4690 -1.0666666666583334e+01 4669 4671 -1.0666666666666666e+01 4669 4159 -1.0416666666666666e-11 4669 4163 6.2499999999999991e-11 4669 4162 -4.1666666666666665e-11 4669 5014 1.0666666666583334e+01 4669 4676 -1.0666666666666666e+01 4669 4063 -1.0416666666666666e-11 4669 4069 6.2499999999999991e-11 4669 4057 -4.1666666666666665e-11 4669 4777 -1.0666666666583334e+01 4669 4675 -1.0666666666666666e+01 4669 4322 6.2499999999999991e-11 4669 4324 -4.1666666666666665e-11 4669 5015 1.0666666666583334e+01 4669 4670 -1.0666666666666666e+01 4670 4670 4.2666666666916662e+01 4670 4088 -5.3333333333229165e+00 4670 4659 -1.0666666666666666e+01 4670 4074 1.0666666666687499e+01 4670 5015 -2.1333333333312499e+01 4670 4669 -1.0666666666666666e+01 4670 4322 -5.3333333333229165e+00 4670 4324 1.0666666666687499e+01 4671 4671 4.2666666666916662e+01 4671 4069 -5.3333333333229165e+00 4671 4690 2.1333333333312499e+01 4671 4669 -1.0666666666666666e+01 4671 4088 -5.3333333333229165e+00 4671 4077 6.2499999999999991e-11 4671 4075 -5.3333333333229165e+00 4671 4074 1.0666666666687499e+01 4671 4059 6.2499999999999991e-11 4671 4680 -2.1333333333312499e+01 4671 4663 -1.0666666666666666e+01 4671 4058 -5.3333333333229165e+00 4671 4057 1.0666666666687499e+01 4672 4672 4.2666666666916662e+01 4672 4659 -1.0666666666666666e+01 4672 4092 -5.3333333333229165e+00 4672 4091 1.0666666666687499e+01 4672 4679 -2.1333333333312499e+01 4672 4663 -1.0666666666666666e+01 4672 4075 -5.3333333333229165e+00 4672 4074 1.0666666666687499e+01 4673 4673 4.2666666666916662e+01 4673 4058 -5.3333333333229165e+00 4673 4681 -2.1333333333312499e+01 4673 4663 -1.0666666666666666e+01 4673 4178 -5.3333333333229165e+00 4673 4181 -5.3333333333229165e+00 4673 4180 1.0666666666687499e+01 4673 4991 2.1333333333312499e+01 4673 4667 -1.0666666666666666e+01 4673 4065 -5.3333333333229165e+00 4673 4057 1.0666666666687499e+01 4673 3003 6.2500000000000004e-11 4673 3022 6.2500000000000004e-11 4674 4674 4.2666666666916662e+01 4674 4171 -5.3333333333229165e+00 4674 4797 2.1333333333312499e+01 4674 4661 -1.0666666666666666e+01 4674 4195 -5.3333333333229165e+00 4674 4187 6.2500000000000004e-11 4674 4186 -5.3333333333229165e+00 4674 4188 1.0666666666687499e+01 4674 4172 6.2499999999999991e-11 4674 4796 2.1333333333312499e+01 4674 4667 -1.0666666666666666e+01 4674 4181 -5.3333333333229165e+00 4674 4180 1.0666666666687499e+01 4675 4675 4.2666666666916662e+01 4675 4065 -5.3333333333229165e+00 4675 4776 2.1333333333312499e+01 4675 4667 -1.0666666666666666e+01 4675 4160 -5.3333333333229165e+00 4675 4159 6.2499999999999991e-11 4675 4163 -5.3333333333229165e+00 4675 4162 1.0666666666687499e+01 4675 4063 6.2500000000000004e-11 4675 4777 2.1333333333312499e+01 4675 4669 -1.0666666666666666e+01 4675 4069 -5.3333333333229165e+00 4675 4057 1.0666666666687499e+01 4676 4676 4.2666666666916662e+01 4676 4665 -1.0666666666666666e+01 4676 4322 -5.3333333333229165e+00 4676 4324 1.0666666666687499e+01 4676 5014 -2.1333333333312499e+01 4676 4669 -1.0666666666666666e+01 4676 4163 -5.3333333333229165e+00 4676 4162 1.0666666666687499e+01 4677 4677 6.4000000000416662e+01 4677 4180 -5.3333333333124999e+00 4677 4094 -5.3333333333124999e+00 4677 4984 -2.1333333333312499e+01 4677 4678 -1.0666666666583334e+01 4677 4179 -1.0666666666583334e+01 4677 4178 2.1333333333312499e+01 4677 4177 -5.3333333333124999e+00 4677 4664 -2.1333333333312499e+01 4677 4663 1.0666666666583334e+01 4677 4093 -1.0666666666583334e+01 4677 4092 2.1333333333312499e+01 4677 4091 -5.3333333333124999e+00 4678 4678 4.2666666667333331e+01 4678 4059 1.0416666666666666e-11 4678 4077 1.0416666666666666e-11 4678 4075 -6.2499999999999991e-11 4678 4083 4.1666666666666665e-11 4678 4680 -1.0666666666583334e+01 4678 4687 -1.0666666666666666e+01 4678 4093 1.0416666666666666e-11 4678 4179 1.0416666666666666e-11 4678 4178 -6.2499999999999991e-11 4678 4177 4.1666666666666665e-11 4678 4677 -1.0666666666583334e+01 4678 4984 1.0666666666666666e+01 4678 4058 -6.2499999999999991e-11 4678 4064 4.1666666666666665e-11 4678 4681 -1.0666666666583334e+01 4678 4983 1.0666666666666666e+01 4678 4092 -6.2499999999999991e-11 4678 4094 4.1666666666666665e-11 4678 4679 -1.0666666666583334e+01 4678 4682 -1.0666666666666666e+01 4678 3003 1.0416666666666666e-11 4678 3022 1.0416666666666666e-11 4679 4679 6.4000000000416662e+01 4679 4083 -5.3333333333124999e+00 4679 4091 -5.3333333333124999e+00 4679 4672 -2.1333333333312499e+01 4679 4663 1.0666666666583334e+01 4679 4075 2.1333333333312499e+01 4679 4074 -5.3333333333124999e+00 4679 4682 2.1333333333312499e+01 4679 4678 -1.0666666666583334e+01 4679 4092 2.1333333333312499e+01 4679 4094 -5.3333333333124999e+00 4680 4680 6.4000000000416662e+01 4680 4064 -5.3333333333124999e+00 4680 4687 2.1333333333312499e+01 4680 4678 -1.0666666666583334e+01 4680 4083 -5.3333333333124999e+00 4680 4077 -1.0666666666583334e+01 4680 4075 2.1333333333312499e+01 4680 4074 -5.3333333333124999e+00 4680 4671 -2.1333333333312499e+01 4680 4663 1.0666666666583334e+01 4680 4059 -1.0666666666583334e+01 4680 4058 2.1333333333312499e+01 4680 4057 -5.3333333333124999e+00 4681 4681 6.4000000000416662e+01 4681 4057 -5.3333333333124999e+00 4681 4673 -2.1333333333312499e+01 4681 4663 1.0666666666583334e+01 4681 4180 -5.3333333333124999e+00 4681 4178 2.1333333333312499e+01 4681 4177 -5.3333333333124999e+00 4681 4983 -2.1333333333312499e+01 4681 4678 -1.0666666666583334e+01 4681 4058 2.1333333333312499e+01 4681 4064 -5.3333333333124999e+00 4681 3003 -1.0666666666583334e+01 4681 3022 -1.0666666666583334e+01 4682 4682 4.2666666666916662e+01 4682 4075 5.3333333333229165e+00 4682 4979 1.0666666666666666e+01 4682 4083 -1.0666666666687499e+01 4682 4679 2.1333333333312499e+01 4682 4678 -1.0666666666666666e+01 4682 4092 5.3333333333229165e+00 4682 4094 -1.0666666666687499e+01 4683 4683 3.2000000000208331e+01 4684 4684 3.2000000000208331e+01 4685 4685 4.2666666666916662e+01 4685 4066 5.3333333333229165e+00 4685 4688 -2.1333333333312499e+01 4685 4699 1.0666666666666666e+01 4685 4084 5.3333333333229165e+00 4685 4077 -6.2499999999999991e-11 4685 4080 5.3333333333229165e+00 4685 4079 -1.0666666666687499e+01 4685 4059 -6.2499999999999991e-11 4685 4686 -2.1333333333312499e+01 4685 4701 1.0666666666666666e+01 4685 4061 5.3333333333229165e+00 4685 4060 -1.0666666666687499e+01 4686 4686 6.4000000000416662e+01 4686 4070 5.3333333333124999e+00 4686 4689 -2.1333333333312499e+01 4686 4707 1.0666666666583334e+01 4686 4087 5.3333333333124999e+00 4686 4077 1.0666666666583334e+01 4686 4080 -2.1333333333312499e+01 4686 4079 5.3333333333124999e+00 4686 4685 -2.1333333333312499e+01 4686 4701 -1.0666666666583334e+01 4686 4059 1.0666666666583334e+01 4686 4061 -2.1333333333312499e+01 4686 4060 5.3333333333124999e+00 4687 4687 4.2666666666916662e+01 4687 4058 5.3333333333229165e+00 4687 4680 2.1333333333312499e+01 4687 4678 -1.0666666666666666e+01 4687 4075 5.3333333333229165e+00 4687 4077 -6.2499999999999991e-11 4687 4084 5.3333333333229165e+00 4687 4083 -1.0666666666687499e+01 4687 4059 -6.2499999999999991e-11 4687 4688 -2.1333333333312499e+01 4687 4985 1.0666666666666666e+01 4687 4066 5.3333333333229165e+00 4687 4064 -1.0666666666687499e+01 4688 4688 6.4000000000416662e+01 4688 4060 5.3333333333124999e+00 4688 4685 -2.1333333333312499e+01 4688 4699 -1.0666666666583334e+01 4688 4079 5.3333333333124999e+00 4688 4077 1.0666666666583334e+01 4688 4084 -2.1333333333312499e+01 4688 4083 5.3333333333124999e+00 4688 4687 -2.1333333333312499e+01 4688 4985 -1.0666666666583334e+01 4688 4059 1.0666666666583334e+01 4688 4066 -2.1333333333312499e+01 4688 4064 5.3333333333124999e+00 4689 4689 4.2666666666916662e+01 4689 4061 5.3333333333229165e+00 4689 4686 -2.1333333333312499e+01 4689 4707 -1.0666666666666666e+01 4689 4080 5.3333333333229165e+00 4689 4077 -6.2499999999999991e-11 4689 4088 5.3333333333229165e+00 4689 4087 -1.0666666666687499e+01 4689 4059 -6.2499999999999991e-11 4689 4690 -2.1333333333312499e+01 4689 5013 -1.0666666666666666e+01 4689 4069 5.3333333333229165e+00 4689 4070 -1.0666666666687499e+01 4690 4690 6.4000000000416662e+01 4690 4057 5.3333333333124999e+00 4690 4671 2.1333333333312499e+01 4690 4669 -1.0666666666583334e+01 4690 4074 5.3333333333124999e+00 4690 4077 1.0666666666583334e+01 4690 4088 -2.1333333333312499e+01 4690 4087 5.3333333333124999e+00 4690 4689 -2.1333333333312499e+01 4690 5013 1.0666666666583334e+01 4690 4059 1.0666666666583334e+01 4690 4069 -2.1333333333312499e+01 4690 4070 5.3333333333124999e+00 4691 4691 3.2000000000208331e+01 4692 4692 3.2000000000208331e+01 4693 4693 3.2000000000208331e+01 4694 4694 6.4020833333541660e+01 4694 4097 5.3312499999999998e+00 4694 4695 -2.1331249999999997e+01 4694 4996 1.0658333333333333e+01 4694 4055 5.3312499999999998e+00 4694 4047 -2.1332291666656250e+01 4694 4044 5.3333333333124999e+00 4694 4660 2.1333333333312499e+01 4694 4661 -1.0666666666583334e+01 4694 4102 -2.1332291666656250e+01 4694 4091 5.3333333333124999e+00 4695 4695 4.2691666666666663e+01 4695 4102 5.3322916666666664e+00 4695 4694 -2.1331249999999997e+01 4695 4996 -1.0666666666666666e+01 4695 4047 5.3322916666666664e+00 4695 4055 -1.0668750000000001e+01 4695 5073 1.0666666666666666e+01 4695 4097 -1.0668750000000001e+01 4696 4696 3.2020833333333336e+01 4697 4697 4.2666666667333331e+01 4697 4305 -4.1666666666666665e-11 4697 4704 -1.0666666666666666e+01 4697 4700 -1.0666666666666666e+01 4697 4079 -4.1666666666666665e-11 4697 4115 -4.1666666666666665e-11 4697 4703 -1.0666666666666666e+01 4697 4107 -4.1666666666666665e-11 4697 4698 -1.0666666666666666e+01 4698 4698 4.2666666666916662e+01 4698 4705 -1.0666666666666666e+01 4698 4115 1.0666666666687499e+01 4698 4697 -1.0666666666666666e+01 4698 4107 1.0666666666687499e+01 4699 4699 4.2666666667333324e+01 4699 4316 -1.0416666666666666e-11 4699 4306 6.2499999999999991e-11 4699 4305 -4.1666666666666665e-11 4699 4068 -1.0416666666666666e-11 4699 4066 6.2499999999999991e-11 4699 4060 -4.1666666666666665e-11 4699 4059 -1.0416666666666666e-11 4699 4077 -1.0416666666666666e-11 4699 4084 6.2499999999999991e-11 4699 4079 -4.1666666666666665e-11 4699 4688 -1.0666666666583334e+01 4699 4685 1.0666666666666666e+01 4699 4999 1.0666666666583334e+01 4699 4700 -1.0666666666666666e+01 4699 1525 -1.0416666666666666e-11 4699 1213 -1.0416666666666666e-11 4699 1218 6.2499999999999991e-11 4699 1217 -4.1666666666666665e-11 4699 1985 1.0666666666583334e+01 4699 1983 -1.0666666666666666e+01 4699 1986 1.0666666666583334e+01 4699 1982 -1.0666666666666666e+01 4700 4700 4.2666666666916662e+01 4700 4084 -5.3333333333229165e+00 4700 4697 -1.0666666666666666e+01 4700 4079 1.0666666666687499e+01 4700 4999 -2.1333333333312499e+01 4700 4699 -1.0666666666666666e+01 4700 4306 -5.3333333333229165e+00 4700 4305 1.0666666666687499e+01 4701 4701 4.2666666667333331e+01 4701 4071 -1.0416666666666666e-11 4701 4356 -1.0416666666666666e-11 4701 4362 6.2499999999999991e-11 4701 4364 -4.1666666666666665e-11 4701 4710 1.0666666666583334e+01 4701 4706 -1.0666666666666666e+01 4701 4077 -1.0416666666666666e-11 4701 4080 6.2499999999999991e-11 4701 4079 -4.1666666666666665e-11 4701 4708 1.0666666666583334e+01 4701 4703 -1.0666666666666666e+01 4701 4059 -1.0416666666666666e-11 4701 4061 6.2499999999999991e-11 4701 4060 -4.1666666666666665e-11 4701 4686 -1.0666666666583334e+01 4701 4685 1.0666666666666666e+01 4701 4113 6.2499999999999991e-11 4701 4115 -4.1666666666666665e-11 4701 4709 1.0666666666583334e+01 4701 4702 -1.0666666666666666e+01 4702 4702 4.2666666666916662e+01 4702 4362 -5.3333333333229165e+00 4702 4705 -1.0666666666666666e+01 4702 4364 1.0666666666687499e+01 4702 4709 -2.1333333333312499e+01 4702 4701 -1.0666666666666666e+01 4702 4113 -5.3333333333229165e+00 4702 4115 1.0666666666687499e+01 4703 4703 4.2666666666916662e+01 4703 4697 -1.0666666666666666e+01 4703 4113 -5.3333333333229165e+00 4703 4115 1.0666666666687499e+01 4703 4708 -2.1333333333312499e+01 4703 4701 -1.0666666666666666e+01 4703 4080 -5.3333333333229165e+00 4703 4079 1.0666666666687499e+01 4704 4704 4.2666666666916662e+01 4704 4305 1.0666666666687499e+01 4704 4107 1.0666666666687499e+01 4704 4697 -1.0666666666666666e+01 4704 1526 -5.3333333333229165e+00 4704 1994 -2.1333333333312499e+01 4704 1978 -1.0666666666666666e+01 4704 1515 -5.3333333333229165e+00 4705 4705 4.2666666667333324e+01 4705 4364 -4.1666666666666665e-11 4705 4107 -4.1666666666666665e-11 4705 4115 -4.1666666666666665e-11 4705 4698 -1.0666666666666666e+01 4705 4702 -1.0666666666666666e+01 4705 1194 -4.1666666666666665e-11 4705 1984 -1.0666666666666666e+01 4705 1981 -1.0666666666666666e+01 4706 4706 4.2666666666916662e+01 4706 4356 6.2500000000000004e-11 4706 4364 1.0666666666687499e+01 4706 4071 6.2500000000000004e-11 4706 4060 1.0666666666687499e+01 4706 4061 -5.3333333333229165e+00 4706 4710 -2.1333333333312499e+01 4706 4701 -1.0666666666666666e+01 4706 4362 -5.3333333333229165e+00 4706 1689 -5.3333333333229165e+00 4706 2321 -2.1333333333312499e+01 4706 1979 -1.0666666666666666e+01 4706 1523 -5.3333333333229165e+00 4707 4707 4.2666666667333331e+01 4707 4356 1.0416666666666666e-11 4707 4362 -6.2499999999999991e-11 4707 4361 4.1666666666666665e-11 4707 4709 -1.0666666666583334e+01 4707 5028 1.0666666666666666e+01 4707 4071 1.0416666666666666e-11 4707 4710 -1.0666666666583334e+01 4707 5027 1.0666666666666666e+01 4707 4059 1.0416666666666666e-11 4707 4061 -6.2499999999999991e-11 4707 4070 4.1666666666666665e-11 4707 4077 1.0416666666666666e-11 4707 4080 -6.2499999999999991e-11 4707 4087 4.1666666666666665e-11 4707 4686 1.0666666666583334e+01 4707 4689 -1.0666666666666666e+01 4707 4113 -6.2499999999999991e-11 4707 4112 4.1666666666666665e-11 4707 4708 -1.0666666666583334e+01 4707 4711 -1.0666666666666666e+01 4708 4708 6.4000000000416662e+01 4708 4087 -5.3333333333124999e+00 4708 4115 -5.3333333333124999e+00 4708 4703 -2.1333333333312499e+01 4708 4701 1.0666666666583334e+01 4708 4080 2.1333333333312499e+01 4708 4079 -5.3333333333124999e+00 4708 4711 2.1333333333312499e+01 4708 4707 -1.0666666666583334e+01 4708 4113 2.1333333333312499e+01 4708 4112 -5.3333333333124999e+00 4709 4709 6.4000000000416662e+01 4709 4364 -5.3333333333124999e+00 4709 4112 -5.3333333333124999e+00 4709 5028 -2.1333333333312499e+01 4709 4707 -1.0666666666583334e+01 4709 4362 2.1333333333312499e+01 4709 4361 -5.3333333333124999e+00 4709 4702 -2.1333333333312499e+01 4709 4701 1.0666666666583334e+01 4709 4113 2.1333333333312499e+01 4709 4115 -5.3333333333124999e+00 4710 4710 6.4000000000416662e+01 4710 4060 -5.3333333333124999e+00 4710 4706 -2.1333333333312499e+01 4710 4701 1.0666666666583334e+01 4710 4364 -5.3333333333124999e+00 4710 4356 -1.0666666666583334e+01 4710 4362 2.1333333333312499e+01 4710 4361 -5.3333333333124999e+00 4710 5027 -2.1333333333312499e+01 4710 4707 -1.0666666666583334e+01 4710 4071 -1.0666666666583334e+01 4710 4061 2.1333333333312499e+01 4710 4070 -5.3333333333124999e+00 4711 4711 4.2666666666916662e+01 4711 4080 5.3333333333229165e+00 4711 5020 1.0666666666666666e+01 4711 4087 -1.0666666666687499e+01 4711 4708 2.1333333333312499e+01 4711 4707 -1.0666666666666666e+01 4711 4113 5.3333333333229165e+00 4711 4112 -1.0666666666687499e+01 4712 4712 3.2000000000208331e+01 4713 4713 3.2000000000208331e+01 4714 4714 3.2000000000208331e+01 4715 4715 3.2000000000208331e+01 4716 4716 3.2000000000208331e+01 4717 4717 3.2000000000208331e+01 4718 4718 6.4000000000416662e+01 4718 3752 -5.3333333333124999e+00 4718 4143 -5.3333333333124999e+00 4718 4811 -2.1333333333312499e+01 4718 4719 -1.0666666666583334e+01 4718 3757 2.1333333333312499e+01 4718 3756 -5.3333333333124999e+00 4718 4474 -2.1333333333312499e+01 4718 4473 1.0666666666583334e+01 4718 4141 2.1333333333312499e+01 4718 4140 -5.3333333333124999e+00 4719 4719 4.2666666667333331e+01 4719 3733 1.0416666666666666e-11 4719 4126 1.0416666666666666e-11 4719 4124 -6.2499999999999991e-11 4719 4132 4.1666666666666665e-11 4719 4721 -1.0666666666583334e+01 4719 4727 -1.0666666666666666e+01 4719 3750 1.0416666666666666e-11 4719 3757 -6.2499999999999991e-11 4719 3756 4.1666666666666665e-11 4719 4718 -1.0666666666583334e+01 4719 4811 1.0666666666666666e+01 4719 3723 1.0416666666666666e-11 4719 3732 -6.2499999999999991e-11 4719 3736 4.1666666666666665e-11 4719 4423 1.0666666666583334e+01 4719 4422 -1.0666666666666666e+01 4719 4141 -6.2499999999999991e-11 4719 4143 4.1666666666666665e-11 4719 4720 -1.0666666666583334e+01 4719 4722 -1.0666666666666666e+01 4720 4720 6.4000000000416662e+01 4720 4132 -5.3333333333124999e+00 4720 4140 -5.3333333333124999e+00 4720 4480 -2.1333333333312499e+01 4720 4473 1.0666666666583334e+01 4720 4124 2.1333333333312499e+01 4720 4123 -5.3333333333124999e+00 4720 4722 2.1333333333312499e+01 4720 4719 -1.0666666666583334e+01 4720 4141 2.1333333333312499e+01 4720 4143 -5.3333333333124999e+00 4721 4721 6.4000000000416662e+01 4721 3736 -5.3333333333124999e+00 4721 4727 2.1333333333312499e+01 4721 4719 -1.0666666666583334e+01 4721 4132 -5.3333333333124999e+00 4721 4126 -1.0666666666583334e+01 4721 4124 2.1333333333312499e+01 4721 4123 -5.3333333333124999e+00 4721 4479 -2.1333333333312499e+01 4721 4473 1.0666666666583334e+01 4721 3733 -1.0666666666583334e+01 4721 3732 2.1333333333312499e+01 4721 3727 -5.3333333333124999e+00 4722 4722 4.2666666666916662e+01 4722 4124 5.3333333333229165e+00 4722 4807 1.0666666666666666e+01 4722 4132 -1.0666666666687499e+01 4722 4720 2.1333333333312499e+01 4722 4719 -1.0666666666666666e+01 4722 4141 5.3333333333229165e+00 4722 4143 -1.0666666666687499e+01 4723 4723 3.2000000000208331e+01 4724 4724 3.2000000000208331e+01 4725 4725 4.2666666666916662e+01 4725 3745 5.3333333333229165e+00 4725 4728 -2.1333333333312499e+01 4725 4740 1.0666666666666666e+01 4725 4133 5.3333333333229165e+00 4725 4126 -6.2499999999999991e-11 4725 4129 5.3333333333229165e+00 4725 4128 -1.0666666666687499e+01 4725 3733 -6.2500000000000004e-11 4725 4726 -2.1333333333312499e+01 4725 4743 1.0666666666666666e+01 4725 3735 5.3333333333229165e+00 4725 3734 -1.0666666666687499e+01 4726 4726 6.4000000000416662e+01 4726 3743 5.3333333333124999e+00 4726 4729 -2.1333333333312499e+01 4726 4750 1.0666666666583334e+01 4726 4136 5.3333333333124999e+00 4726 4126 1.0666666666583334e+01 4726 4129 -2.1333333333312499e+01 4726 4128 5.3333333333124999e+00 4726 4725 -2.1333333333312499e+01 4726 4743 -1.0666666666583334e+01 4726 3733 1.0666666666583334e+01 4726 3735 -2.1333333333312499e+01 4726 3734 5.3333333333124999e+00 4727 4727 4.2666666666916662e+01 4727 3732 5.3333333333229165e+00 4727 4721 2.1333333333312499e+01 4727 4719 -1.0666666666666666e+01 4727 4124 5.3333333333229165e+00 4727 4126 -6.2500000000000004e-11 4727 4133 5.3333333333229165e+00 4727 4132 -1.0666666666687499e+01 4727 3733 -6.2499999999999991e-11 4727 4728 -2.1333333333312499e+01 4727 4805 1.0666666666666666e+01 4727 3745 5.3333333333229165e+00 4727 3736 -1.0666666666687499e+01 4728 4728 6.4000000000416662e+01 4728 3734 5.3333333333124999e+00 4728 4725 -2.1333333333312499e+01 4728 4740 -1.0666666666583334e+01 4728 4128 5.3333333333124999e+00 4728 4126 1.0666666666583334e+01 4728 4133 -2.1333333333312499e+01 4728 4132 5.3333333333124999e+00 4728 4727 -2.1333333333312499e+01 4728 4805 -1.0666666666583334e+01 4728 3733 1.0666666666583334e+01 4728 3745 -2.1333333333312499e+01 4728 3736 5.3333333333124999e+00 4729 4729 4.2666666666916662e+01 4729 3735 5.3333333333229165e+00 4729 4726 -2.1333333333312499e+01 4729 4750 -1.0666666666666666e+01 4729 4129 5.3333333333229165e+00 4729 4126 -6.2500000000000004e-11 4729 4137 5.3333333333229165e+00 4729 4136 -1.0666666666687499e+01 4729 3733 -6.2499999999999991e-11 4729 4730 -2.1333333333312499e+01 4729 4893 1.0666666666666666e+01 4729 3746 5.3333333333229165e+00 4729 3743 -1.0666666666687499e+01 4730 4730 6.4000000000416662e+01 4730 3727 5.3333333333124999e+00 4730 4479 2.1333333333312499e+01 4730 4475 -1.0666666666583334e+01 4730 4123 5.3333333333124999e+00 4730 4126 1.0666666666583334e+01 4730 4137 -2.1333333333312499e+01 4730 4136 5.3333333333124999e+00 4730 4729 -2.1333333333312499e+01 4730 4893 -1.0666666666583334e+01 4730 3733 1.0666666666583334e+01 4730 3746 -2.1333333333312499e+01 4730 3743 5.3333333333124999e+00 4731 4731 3.2000000000208331e+01 4732 4732 3.2000000000208331e+01 4733 4733 3.2000000000208331e+01 4734 4734 4.2666666667333331e+01 4734 4369 -4.1666666666666665e-11 4734 4737 -1.0666666666666666e+01 4734 4741 -1.0666666666666666e+01 4734 4128 -4.1666666666666665e-11 4734 4032 -4.1666666666666665e-11 4734 4745 -1.0666666666666666e+01 4734 3982 -4.1666666666666665e-11 4734 4735 -1.0666666666666666e+01 4735 4735 4.2666666666916662e+01 4735 3985 -5.3333333333229165e+00 4735 4758 2.1333333333312499e+01 4735 4742 -1.0666666666666666e+01 4735 4040 -5.3333333333229165e+00 4735 4032 1.0666666666687499e+01 4735 4734 -1.0666666666666666e+01 4735 3982 1.0666666666687499e+01 4736 4736 4.2666666667333331e+01 4736 4003 -4.1666666666666665e-11 4736 4645 1.0666666666666666e+01 4736 4739 -1.0666666666666666e+01 4736 4220 -4.1666666666666665e-11 4736 4369 -4.1666666666666665e-11 4736 4747 -1.0666666666666666e+01 4736 3982 -4.1666666666666665e-11 4736 4737 -1.0666666666666666e+01 4737 4737 4.2666666666916662e+01 4737 4734 -1.0666666666666666e+01 4737 4369 1.0666666666687499e+01 4737 4736 -1.0666666666666666e+01 4737 3982 1.0666666666687499e+01 4738 4738 4.2666666667333331e+01 4738 3840 -1.0416666666666666e-11 4738 4000 -1.0416666666666666e-11 4738 3855 -1.0416666666666666e-11 4738 3862 6.2499999999999991e-11 4738 3861 -4.1666666666666665e-11 4738 4967 -1.0666666666583334e+01 4738 4748 -1.0666666666666666e+01 4738 3731 -1.0416666666666666e-11 4738 4521 -1.0666666666583334e+01 4738 4520 1.0666666666666666e+01 4738 3737 -1.0416666666666666e-11 4738 3744 6.2499999999999991e-11 4738 3734 -4.1666666666666665e-11 4738 4210 -1.0416666666666666e-11 4738 4218 6.2499999999999991e-11 4738 4220 -4.1666666666666665e-11 4738 4816 -1.0666666666583334e+01 4738 4746 -1.0666666666666666e+01 4738 4004 6.2499999999999991e-11 4738 4003 -4.1666666666666665e-11 4738 5061 1.0666666666583334e+01 4738 4739 -1.0666666666666666e+01 4739 4739 4.2666666666916662e+01 4739 4218 -5.3333333333229165e+00 4739 4736 -1.0666666666666666e+01 4739 4220 1.0666666666687499e+01 4739 5061 -2.1333333333312499e+01 4739 4738 -1.0666666666666666e+01 4739 4004 -5.3333333333229165e+00 4739 4003 1.0666666666687499e+01 4740 4740 4.2666666667333331e+01 4740 3733 -1.0416666666666666e-11 4740 4126 -1.0416666666666666e-11 4740 4133 6.2499999999999991e-11 4740 4128 -4.1666666666666665e-11 4740 4728 -1.0666666666583334e+01 4740 4725 1.0666666666666666e+01 4740 4210 -1.0416666666666666e-11 4740 4221 6.2499999999999991e-11 4740 4220 -4.1666666666666665e-11 4740 5063 1.0666666666583334e+01 4740 4747 -1.0666666666666666e+01 4740 3737 -1.0416666666666666e-11 4740 3745 6.2499999999999991e-11 4740 3734 -4.1666666666666665e-11 4740 4817 -1.0666666666583334e+01 4740 4746 -1.0666666666666666e+01 4740 4367 6.2499999999999991e-11 4740 4369 -4.1666666666666665e-11 4740 5064 1.0666666666583334e+01 4740 4741 -1.0666666666666666e+01 4741 4741 4.2666666666916662e+01 4741 4133 -5.3333333333229165e+00 4741 4734 -1.0666666666666666e+01 4741 4128 1.0666666666687499e+01 4741 5064 -2.1333333333312499e+01 4741 4740 -1.0666666666666666e+01 4741 4367 -5.3333333333229165e+00 4741 4369 1.0666666666687499e+01 4742 4742 4.2666666667333331e+01 4742 4029 -1.0416666666666666e-11 4742 4040 6.2499999999999991e-11 4742 4032 -4.1666666666666665e-11 4742 4758 -1.0666666666583334e+01 4742 4735 -1.0666666666666666e+01 4742 3858 -1.0416666666666666e-11 4742 4970 -1.0666666666583334e+01 4742 4744 -1.0666666666666666e+01 4742 3855 -1.0416666666666666e-11 4742 3859 6.2499999999999991e-11 4742 3861 -4.1666666666666665e-11 4742 4000 -1.0416666666666666e-11 4742 4011 6.2499999999999991e-11 4742 4003 -4.1666666666666665e-11 4742 4968 -1.0666666666583334e+01 4742 4748 -1.0666666666666666e+01 4742 3985 6.2499999999999991e-11 4742 3982 -4.1666666666666665e-11 4742 4646 -1.0666666666583334e+01 4742 4645 1.0666666666666666e+01 4743 4743 4.2666666667333331e+01 4743 3858 -1.0416666666666666e-11 4743 3731 -1.0416666666666666e-11 4743 3840 -1.0416666666666666e-11 4743 3860 6.2499999999999991e-11 4743 3861 -4.1666666666666665e-11 4743 4519 -1.0666666666583334e+01 4743 4520 1.0666666666666666e+01 4743 4126 -1.0416666666666666e-11 4743 4129 6.2499999999999991e-11 4743 4128 -4.1666666666666665e-11 4743 4751 1.0666666666583334e+01 4743 4745 -1.0666666666666666e+01 4743 3733 -1.0416666666666666e-11 4743 3735 6.2499999999999991e-11 4743 3734 -4.1666666666666665e-11 4743 4726 -1.0666666666583334e+01 4743 4725 1.0666666666666666e+01 4743 4029 -1.0416666666666666e-11 4743 4033 6.2499999999999991e-11 4743 4032 -4.1666666666666665e-11 4743 4749 1.0666666666583334e+01 4743 4744 -1.0666666666666666e+01 4744 4744 4.2666666666916662e+01 4744 3860 -5.3333333333229165e+00 4744 4040 -5.3333333333229165e+00 4744 3858 6.2499999999999991e-11 4744 4970 2.1333333333312499e+01 4744 4742 -1.0666666666666666e+01 4744 3859 -5.3333333333229165e+00 4744 3861 1.0666666666687499e+01 4744 4029 6.2500000000000004e-11 4744 4749 -2.1333333333312499e+01 4744 4743 -1.0666666666666666e+01 4744 4033 -5.3333333333229165e+00 4744 4032 1.0666666666687499e+01 4745 4745 4.2666666666916662e+01 4745 4734 -1.0666666666666666e+01 4745 4033 -5.3333333333229165e+00 4745 4032 1.0666666666687499e+01 4745 4751 -2.1333333333312499e+01 4745 4743 -1.0666666666666666e+01 4745 4129 -5.3333333333229165e+00 4745 4128 1.0666666666687499e+01 4746 4746 4.2666666666916662e+01 4746 3744 -5.3333333333229165e+00 4746 4816 2.1333333333312499e+01 4746 4738 -1.0666666666666666e+01 4746 4218 -5.3333333333229165e+00 4746 4210 6.2500000000000004e-11 4746 4221 -5.3333333333229165e+00 4746 4220 1.0666666666687499e+01 4746 3737 6.2500000000000004e-11 4746 4817 2.1333333333312499e+01 4746 4740 -1.0666666666666666e+01 4746 3745 -5.3333333333229165e+00 4746 3734 1.0666666666687499e+01 4747 4747 4.2666666666916662e+01 4747 4736 -1.0666666666666666e+01 4747 4367 -5.3333333333229165e+00 4747 4369 1.0666666666687499e+01 4747 5063 -2.1333333333312499e+01 4747 4740 -1.0666666666666666e+01 4747 4221 -5.3333333333229165e+00 4747 4220 1.0666666666687499e+01 4748 4748 4.2666666666916662e+01 4748 3859 -5.3333333333229165e+00 4748 4968 2.1333333333312499e+01 4748 4742 -1.0666666666666666e+01 4748 4011 -5.3333333333229165e+00 4748 4000 6.2500000000000004e-11 4748 4004 -5.3333333333229165e+00 4748 4003 1.0666666666687499e+01 4748 3855 6.2500000000000004e-11 4748 4967 2.1333333333312499e+01 4748 4738 -1.0666666666666666e+01 4748 3862 -5.3333333333229165e+00 4748 3861 1.0666666666687499e+01 4749 4749 6.4000000000416662e+01 4749 3861 -5.3333333333124999e+00 4749 4034 -5.3333333333124999e+00 4749 4892 -2.1333333333312499e+01 4749 4750 -1.0666666666583334e+01 4749 3858 -1.0666666666583334e+01 4749 3860 2.1333333333312499e+01 4749 3850 -5.3333333333124999e+00 4749 4744 -2.1333333333312499e+01 4749 4743 1.0666666666583334e+01 4749 4029 -1.0666666666583334e+01 4749 4033 2.1333333333312499e+01 4749 4032 -5.3333333333124999e+00 4750 4750 4.2666666667333331e+01 4750 3733 1.0416666666666666e-11 4750 4126 1.0416666666666666e-11 4750 4129 -6.2499999999999991e-11 4750 4136 4.1666666666666665e-11 4750 4726 1.0666666666583334e+01 4750 4729 -1.0666666666666666e+01 4750 3840 1.0416666666666666e-11 4750 4029 1.0416666666666666e-11 4750 3858 1.0416666666666666e-11 4750 3860 -6.2499999999999991e-11 4750 3850 4.1666666666666665e-11 4750 4749 -1.0666666666583334e+01 4750 4892 1.0666666666666666e+01 4750 3731 1.0416666666666666e-11 4750 3735 -6.2499999999999991e-11 4750 3743 4.1666666666666665e-11 4750 4519 1.0666666666583334e+01 4750 4518 -1.0666666666666666e+01 4750 4033 -6.2499999999999991e-11 4750 4034 4.1666666666666665e-11 4750 4751 -1.0666666666583334e+01 4750 4752 -1.0666666666666666e+01 4751 4751 6.4000000000416662e+01 4751 4136 -5.3333333333124999e+00 4751 4032 -5.3333333333124999e+00 4751 4745 -2.1333333333312499e+01 4751 4743 1.0666666666583334e+01 4751 4129 2.1333333333312499e+01 4751 4128 -5.3333333333124999e+00 4751 4752 2.1333333333312499e+01 4751 4750 -1.0666666666583334e+01 4751 4033 2.1333333333312499e+01 4751 4034 -5.3333333333124999e+00 4752 4752 4.2666666666916662e+01 4752 4129 5.3333333333229165e+00 4752 4890 1.0666666666666666e+01 4752 4136 -1.0666666666687499e+01 4752 4751 2.1333333333312499e+01 4752 4750 -1.0666666666666666e+01 4752 4033 5.3333333333229165e+00 4752 4034 -1.0666666666687499e+01 4753 4753 3.2000000000208331e+01 4754 4754 3.2000000000208331e+01 4755 4755 3.2000000000208331e+01 4756 4756 3.2000000000208331e+01 4757 4757 3.2000000000208331e+01 4758 4758 6.4020833333541674e+01 4758 3982 5.3333333333124999e+00 4758 4735 2.1333333333312499e+01 4758 4742 -1.0666666666583334e+01 4758 4032 5.3333333333124999e+00 4758 4040 -2.1332291666656246e+01 4758 4030 5.3312499999999998e+00 4758 4619 2.1331249999999997e+01 4758 4618 -1.0658333333333333e+01 4758 3985 -2.1332291666656246e+01 4758 3979 5.3312499999999998e+00 4759 4759 3.2020833333333336e+01 4760 4760 6.4000000000916657e+01 4760 4764 -2.1333333333208333e+01 4760 4063 -1.0416666666666666e-11 4760 4062 6.2499999999999991e-11 4760 4771 1.0666666666583334e+01 4760 4159 -1.0416666666666666e-11 4760 4158 5.3333333332916668e+00 4760 4770 1.0666666666583334e+01 4760 4766 -1.0666666666666666e+01 4760 2336 5.3333333333020834e+00 4760 2350 2.0833333333333342e-11 4760 3705 2.1333333333291666e+01 4760 2349 -1.0666666666833333e+01 4760 115 -1.0416666666666666e-11 4760 441 -1.0416666666666666e-11 4760 3021 -4.1666666666666665e-11 4760 3704 -1.0666666666666666e+01 4760 3023 1.0416666666666667e-10 4760 2487 1.0416666666666666e-10 4760 3096 2.1333333333291666e+01 4760 3095 -2.1333333333208333e+01 4760 2481 -5.3333333332812494e+00 4760 2494 5.3333333332916668e+00 4761 4761 4.2666666667333331e+01 4761 4159 -1.0416666666666666e-11 4761 4160 6.2499999999999991e-11 4761 4158 -4.1666666666666665e-11 4761 4994 1.0666666666583334e+01 4761 4769 -1.0666666666666666e+01 4761 4063 -1.0416666666666666e-11 4761 4776 -1.0666666666583334e+01 4761 4766 -1.0666666666666666e+01 4761 4172 -1.0416666666666666e-11 4761 4065 6.2499999999999991e-11 4761 4181 6.2499999999999991e-11 4761 4182 -4.1666666666666665e-11 4761 4991 -1.0666666666583334e+01 4761 4767 -1.0666666666666666e+01 4761 4187 -1.0416666666666666e-11 4761 4186 6.2499999999999991e-11 4761 4185 -4.1666666666666665e-11 4761 4796 -1.0666666666583334e+01 4761 4762 -1.0666666666666666e+01 4761 3022 -1.0416666666666666e-11 4761 3021 -4.1666666666666665e-11 4761 3003 -1.0416666666666666e-11 4762 4762 4.2666666666916662e+01 4762 4181 -5.3333333333229165e+00 4762 4190 -5.3333333333229165e+00 4762 4172 6.2500000000000004e-11 4762 4795 -2.1333333333312499e+01 4762 4763 -1.0666666666666666e+01 4762 4182 1.0666666666687499e+01 4762 4187 6.2499999999999991e-11 4762 4796 2.1333333333312499e+01 4762 4761 -1.0666666666666666e+01 4762 4186 -5.3333333333229165e+00 4762 4185 1.0666666666687499e+01 4762 3000 -5.3333333333229165e+00 4763 4763 4.2666666667333331e+01 4763 4768 -1.0666666666666666e+01 4763 4187 -1.0416666666666666e-11 4763 4190 6.2499999999999991e-11 4763 4185 -4.1666666666666665e-11 4763 4794 1.0666666666583334e+01 4763 4765 -1.0666666666666666e+01 4763 4172 -1.0416666666666666e-11 4763 4182 -4.1666666666666665e-11 4763 4795 1.0666666666583334e+01 4763 4762 -1.0666666666666666e+01 4763 2457 -1.0416666666666666e-11 4763 2996 -1.0416666666666666e-11 4763 2448 -1.0416666666666666e-11 4763 2464 6.2499999999999991e-11 4763 2451 -4.1666666666666665e-11 4763 3660 1.0666666666583334e+01 4763 3000 6.2499999999999991e-11 4763 2337 -1.0416666666666666e-11 4763 2348 6.2499999999999991e-11 4763 2349 -4.1666666666666665e-11 4763 3116 1.0666666666583334e+01 4763 3117 -1.0666666666666666e+01 4764 4764 6.4000000000583327e+01 4764 4185 -4.1666666666666665e-11 4764 4769 -1.0666666666666666e+01 4764 4158 5.3333333332916668e+00 4764 4760 -2.1333333333208333e+01 4764 4765 -1.0666666666666666e+01 4764 3023 -5.3333333332812494e+00 4764 3705 -3.2000000000020833e+01 4764 2350 -5.3333333333229165e+00 4764 2349 1.5999999999958334e+01 4765 4765 4.2666666666916662e+01 4765 4794 -2.1333333333312499e+01 4765 4763 -1.0666666666666666e+01 4765 4190 -5.3333333333229165e+00 4765 4185 1.0666666666687499e+01 4765 4764 -1.0666666666666666e+01 4765 2348 -5.3333333333229165e+00 4765 2349 1.0666666666687499e+01 4766 4766 4.2666666666916662e+01 4766 4160 -5.3333333333229165e+00 4766 4776 2.1333333333312499e+01 4766 4761 -1.0666666666666666e+01 4766 4065 -5.3333333333229165e+00 4766 4063 6.2499999999999991e-11 4766 4062 -5.3333333333229165e+00 4766 4159 6.2500000000000004e-11 4766 4770 -2.1333333333312499e+01 4766 4760 -1.0666666666666666e+01 4766 4158 1.0666666666687499e+01 4766 3021 1.0666666666687499e+01 4766 3023 -5.3333333333229165e+00 4767 4767 4.2666666666916662e+01 4767 4065 -5.3333333333229165e+00 4767 4991 2.1333333333312499e+01 4767 4761 -1.0666666666666666e+01 4767 4181 -5.3333333333229165e+00 4767 4182 1.0666666666687499e+01 4767 3002 -5.3333333333229165e+00 4767 3703 -2.1333333333312499e+01 4767 3701 -1.0666666666666666e+01 4767 3020 -5.3333333333229165e+00 4767 3022 6.2500000000000004e-11 4767 3021 1.0666666666687499e+01 4767 3003 6.2500000000000004e-11 4768 4768 4.2666666666916662e+01 4768 4763 -1.0666666666666666e+01 4768 4182 1.0666666666687499e+01 4768 3000 -5.3333333333229165e+00 4768 3660 -2.1333333333312499e+01 4768 2464 -5.3333333333229165e+00 4768 2448 6.2499999999999991e-11 4768 2452 -5.3333333333229165e+00 4768 2451 1.0666666666687499e+01 4768 2996 6.2499999999999991e-11 4768 3658 -2.1333333333312499e+01 4768 3701 -1.0666666666666666e+01 4768 3002 -5.3333333333229165e+00 4769 4769 4.2666666666916662e+01 4769 4764 -1.0666666666666666e+01 4769 4186 -5.3333333333229165e+00 4769 4185 1.0666666666687499e+01 4769 4994 -2.1333333333312499e+01 4769 4761 -1.0666666666666666e+01 4769 4160 -5.3333333333229165e+00 4769 4158 1.0666666666687499e+01 4770 4770 5.3333333333749991e+01 4770 4168 1.8812360437258079e-27 4770 4072 -1.8812360437258079e-27 4770 4779 1.0666666666562499e+01 4770 4772 -1.0666666666666666e+01 4770 4063 -1.0666666666572917e+01 4770 4062 1.5999999999989583e+01 4770 4766 -2.1333333333312499e+01 4770 4760 1.0666666666583334e+01 4770 4159 -1.0666666666572917e+01 4770 4158 -5.3333333333124999e+00 4770 3021 -5.3333333333124999e+00 4770 3023 1.5999999999989583e+01 4771 4771 7.4666666667125000e+01 4771 4072 -5.3333333332812494e+00 4771 4774 2.1333333333291666e+01 4771 4772 -1.0666666666583334e+01 4771 4155 -5.3333333333229165e+00 4771 4760 1.0666666666583334e+01 4771 4062 2.1333333333333332e+01 4771 115 -2.1333333333260416e+01 4771 2487 3.2000000000000000e+01 4771 2494 -5.3333333333124999e+00 4771 3704 -2.1333333333312499e+01 4771 441 -1.0666666666531249e+01 4771 3021 -5.3333333333124999e+00 4772 4772 5.3333333333750005e+01 4772 4159 2.0194839173657902e-27 4772 4063 2.2470898404921788e-28 4772 4062 5.3333333333229165e+00 4772 4072 6.2499999999999991e-11 4772 4770 -1.0666666666666666e+01 4772 4779 -1.0666666666666666e+01 4772 4771 -1.0666666666583334e+01 4772 4774 -1.0666666666666666e+01 4772 4156 2.0194839173657902e-27 4772 4168 -5.3333333333229165e+00 4772 4773 -3.2000000000020833e+01 4772 5038 2.1333333333291666e+01 4772 4153 1.0666666666625000e+01 4772 4155 -5.3333333333437496e+00 4772 441 -5.3333333332812494e+00 4772 115 5.3333333333020834e+00 4772 3023 5.3333333333229165e+00 4772 2487 -1.0666666666791667e+01 4773 4773 8.5333333334166667e+01 4773 5047 2.1333333333208333e+01 4773 4350 1.0666666666833333e+01 4773 5044 2.1333333333208333e+01 4773 4156 -1.0666666666625000e+01 4773 4168 5.3333333332812494e+00 4773 4772 -3.2000000000020833e+01 4773 5038 -2.1333333333208333e+01 4773 4153 -2.1333333333291666e+01 4773 4155 5.3333333333229165e+00 4773 111 5.3333333332812494e+00 4773 2888 -2.0833333333333342e-11 4773 3463 -2.1333333333291666e+01 4773 5 -5.3333333333020834e+00 4773 3707 -2.1333333333291666e+01 4773 3023 -1.4583333333333332e-10 4773 2487 1.0666666666583334e+01 4774 4774 4.2666666666999994e+01 4774 4062 4.0939925783957852e-29 4774 4771 2.1333333333291666e+01 4774 4772 -1.0666666666666666e+01 4774 4154 1.0666666666625000e+01 4774 4155 -1.0666666666729165e+01 4774 4073 1.8812360437258079e-27 4774 4775 2.1333333333291666e+01 4774 5040 1.0666666666666666e+01 4774 4072 -1.0666666666729165e+01 4774 2487 1.0666666666625000e+01 4774 115 -1.0666666666833333e+01 4774 441 1.0666666666625000e+01 4775 4775 7.4666666667125000e+01 4775 4073 2.1333333333333332e+01 4775 4154 3.2000000000000000e+01 4775 4155 -5.3333333333229165e+00 4775 5040 1.0666666666583334e+01 4775 4774 2.1333333333291666e+01 4775 4072 -5.3333333332812494e+00 4775 441 -1.0666666666531249e+01 4775 1522 -5.3333333333124999e+00 4775 814 -2.1333333333312499e+01 4775 813 1.0666666666583334e+01 4775 115 -2.1333333333260416e+01 4775 114 -5.3333333333124999e+00 4776 4776 6.4000000000416662e+01 4776 4057 5.3333333333124999e+00 4776 4675 2.1333333333312499e+01 4776 4667 -1.0666666666583334e+01 4776 4162 5.3333333333124999e+00 4776 4159 1.0666666666583334e+01 4776 4160 -2.1333333333312499e+01 4776 4158 5.3333333333124999e+00 4776 4766 2.1333333333312499e+01 4776 4761 -1.0666666666583334e+01 4776 4063 1.0666666666583334e+01 4776 4065 -2.1333333333312499e+01 4776 3021 5.3333333333124999e+00 4777 4777 6.4000000000416662e+01 4777 4070 5.3333333333124999e+00 4777 4778 -2.1333333333312499e+01 4777 5013 1.0666666666583334e+01 4777 4166 5.3333333333124999e+00 4777 4159 1.0666666666583334e+01 4777 4163 -2.1333333333312499e+01 4777 4162 5.3333333333124999e+00 4777 4675 2.1333333333312499e+01 4777 4669 -1.0666666666583334e+01 4777 4063 1.0666666666583334e+01 4777 4069 -2.1333333333312499e+01 4777 4057 5.3333333333124999e+00 4778 4778 4.2666666666916662e+01 4778 4072 5.3333333333229165e+00 4778 4779 -2.1333333333312499e+01 4778 5024 1.0666666666666666e+01 4778 4168 5.3333333333229165e+00 4778 4063 -6.2499999999999991e-11 4778 4069 5.3333333333229165e+00 4778 4070 -1.0666666666687499e+01 4778 4159 -6.2499999999999991e-11 4778 4777 -2.1333333333312499e+01 4778 5013 -1.0666666666666666e+01 4778 4163 5.3333333333229165e+00 4778 4166 -1.0666666666687499e+01 4779 4779 5.3333333333749998e+01 4779 4070 5.3333333333124999e+00 4779 4778 -2.1333333333312499e+01 4779 5024 -1.0666666666583334e+01 4779 4166 5.3333333333124999e+00 4779 4159 1.0666666666572915e+01 4779 4168 -1.5999999999989583e+01 4779 4062 2.2851328271989659e-27 4779 4770 1.0666666666562499e+01 4779 4772 -1.0666666666666666e+01 4779 4063 1.0666666666572915e+01 4779 4072 -1.5999999999989583e+01 4779 3023 3.6295685768920020e-28 4780 4780 3.2000000000208331e+01 4781 4781 3.2000000000208331e+01 4782 4782 5.3375000000000000e+01 4782 4786 -2.1329166666666666e+01 4782 4152 5.3343749999999996e+00 4782 4191 -6.2499999999999986e-03 4782 4792 -1.0666666666666664e+01 4782 3914 5.3322916666666664e+00 4782 4783 -1.0666666666666666e+01 4782 2968 4.5528020914918643e-20 4782 3630 -3.2002083333333331e+01 4782 2340 -1.0662500000000000e+01 4783 4783 4.2708333333333329e+01 4783 4788 -1.0666666666666666e+01 4783 4191 1.0666666666666666e+01 4783 4782 -1.0666666666666666e+01 4783 3914 1.0666666666666666e+01 4784 4784 5.3375000000000000e+01 4784 3918 1.0662500000000000e+01 4784 4184 2.0761130467597592e-20 4784 4787 -3.2002083333333331e+01 4784 4910 2.1329166666666669e+01 4784 3919 -5.3343749999999996e+00 4784 3914 -1.0679166666666665e+01 4784 4566 1.0658333333333331e+01 4784 3878 6.2499999999999995e-03 4784 4567 -1.0666666666666664e+01 4784 3879 5.3322916666666664e+00 4784 4170 5.3322916666666664e+00 4784 4169 -5.3322916666666664e+00 4784 4785 -1.0666666666666666e+01 4784 4907 1.0666666666666666e+01 4784 2780 2.1684043449710089e-19 4784 2971 5.3302083333333332e+00 4784 2776 -5.3281250000000000e+00 4784 2997 -3.2249014814734037e-20 4785 4785 5.3375000000000000e+01 4785 4786 -1.0658333333333333e+01 4785 3878 2.1705219273391446e-19 4785 3879 1.5998958333333333e+01 4785 4169 -2.1705219273391446e-19 4785 4907 -1.0656249999999998e+01 4785 4784 -1.0666666666666666e+01 4785 4170 1.5998958333333333e+01 4785 2999 -5.3312499999999998e+00 4785 3636 -2.1331249999999997e+01 4785 2775 -5.3312499999999998e+00 4785 2780 -1.0657291666666666e+01 4785 2997 -1.0657291666666666e+01 4786 4786 6.4091666666666669e+01 4786 3879 -6.2500000000000003e-03 4786 4785 -1.0658333333333333e+01 4786 4152 -2.0833333333333342e-03 4786 4782 -2.1329166666666666e+01 4786 4170 -1.0416666666666664e-02 4786 4791 -2.1329166666666669e+01 4786 3914 -1.0416666666666666e-02 4786 4566 1.0658333333333333e+01 4786 2776 1.0416666666666669e-03 4786 2997 1.0416666666666669e-03 4786 2780 1.0416666666666667e-03 4786 2775 4.1666666666666666e-03 4786 3636 1.0666666666666666e+01 4786 2348 -5.3302083333333332e+00 4786 3630 2.1320833333333333e+01 4786 2340 1.0683333333333334e+01 4786 3635 2.1320833333333333e+01 4786 3000 5.3281250000000000e+00 4786 2999 -5.3291666666666666e+00 4786 2971 1.0416666666666667e-03 4786 2968 -5.3291666666666666e+00 4786 3633 1.0666666666666666e+01 4787 4787 8.5416666666666671e+01 4787 3919 5.3322916666666664e+00 4787 4784 -3.2002083333333331e+01 4787 4910 -2.1320833333333333e+01 4787 4169 5.3281250000000000e+00 4787 4170 -1.4583333333333332e-02 4787 4171 5.3281250000000000e+00 4787 4184 -1.0662500000000000e+01 4787 4056 -2.0833333333333342e-03 4787 4789 -2.1329166666666666e+01 4787 4996 -2.1320833333333333e+01 4787 4047 -5.3302083333333332e+00 4787 4055 1.0683333333333334e+01 4787 3914 1.0658333333333331e+01 4787 4788 -2.1329166666666669e+01 4787 5075 2.1320833333333333e+01 4787 3918 -2.1329166666666666e+01 4788 4788 5.3375000000000014e+01 4788 4191 -6.2499999999999986e-03 4788 4783 -1.0666666666666666e+01 4788 4793 -1.0666666666666668e+01 4788 4056 5.3343749999999996e+00 4788 4055 -1.0662500000000000e+01 4788 3918 -1.4973071994693204e-20 4788 5075 -3.2002083333333331e+01 4788 4787 -2.1329166666666669e+01 4788 3914 5.3322916666666664e+00 4789 4789 5.3375000000000007e+01 4789 4187 -3.2249014814734037e-20 4789 4191 -6.2499999999999986e-03 4789 4995 1.0658333333333331e+01 4789 4793 -1.0666666666666664e+01 4789 4195 -5.3322916666666664e+00 4789 4184 4.5528020914918643e-20 4789 4996 3.2002083333333331e+01 4789 4787 -2.1329166666666666e+01 4789 4047 1.0679166666666665e+01 4789 4056 5.3343749999999996e+00 4789 4055 -1.0662500000000000e+01 4789 4172 -4.9904357809065860e-20 4789 4171 -5.3322916666666664e+00 4789 4170 5.3322916666666664e+00 4789 4797 -1.0666666666666666e+01 4789 4790 -1.0666666666666666e+01 4790 4790 4.2708333333333329e+01 4790 4195 -2.1705219273391446e-19 4790 4190 2.1705219273391446e-19 4790 4187 -1.0656249999999998e+01 4790 4191 1.0666666666666666e+01 4790 4795 -1.0656249999999998e+01 4790 4791 -1.0666666666666666e+01 4790 4171 -2.1705219273391446e-19 4790 4797 1.0656249999999998e+01 4790 4789 -1.0666666666666666e+01 4790 4172 -1.0656249999999998e+01 4790 4170 1.0666666666666666e+01 4790 3000 -5.0116116045879435e-20 4791 4791 5.3375000000000000e+01 4791 4786 -2.1329166666666669e+01 4791 4172 -2.1684043449710089e-19 4791 4170 5.3322916666666664e+00 4791 4187 2.1684043449710089e-19 4791 4191 -6.2499999999999986e-03 4791 4190 -5.3322916666666664e+00 4791 4790 -1.0666666666666666e+01 4791 4795 1.0666666666666666e+01 4791 4152 5.3343749999999996e+00 4791 4794 1.0658333333333331e+01 4791 4792 -1.0666666666666668e+01 4791 2340 -1.0662500000000000e+01 4791 2999 -1.4973071994693204e-20 4791 3635 -3.2002083333333331e+01 4791 3000 -5.3322916666666664e+00 4791 2348 1.0679166666666665e+01 4792 4792 4.2699999999999996e+01 4792 4782 -1.0666666666666664e+01 4792 4190 -1.6284208410963924e-19 4792 4191 1.0672916666666666e+01 4792 4794 -2.1329166666666666e+01 4792 4791 -1.0666666666666668e+01 4792 4152 1.0672916666666666e+01 4792 2348 -1.0662500000000000e+01 4793 4793 4.2699999999999996e+01 4793 4047 -1.0662500000000000e+01 4793 4195 2.1705219273391446e-19 4793 4995 -2.1329166666666666e+01 4793 4789 -1.0666666666666664e+01 4793 4191 1.0672916666666666e+01 4793 4788 -1.0666666666666668e+01 4793 4056 1.0672916666666666e+01 4794 4794 7.4691666666874994e+01 4794 4765 -2.1333333333312499e+01 4794 4763 1.0666666666583334e+01 4794 4185 -5.3333333333124999e+00 4794 4191 -5.3281250000000000e+00 4794 4190 2.1334374999989585e+01 4794 4792 -2.1329166666666666e+01 4794 4791 1.0658333333333331e+01 4794 4152 -5.3322916666666664e+00 4794 2349 -5.3333333333124999e+00 4794 2348 3.2001041666656249e+01 4795 4795 5.3354166666875003e+01 4795 4185 -5.3333333333124999e+00 4795 4762 -2.1333333333312499e+01 4795 4763 1.0666666666583334e+01 4795 4182 -5.3333333333124999e+00 4795 4170 2.1705219273391446e-19 4795 4172 -1.0661458333291666e+01 4795 4191 5.0116116045879435e-20 4795 4790 -1.0656249999999998e+01 4795 4187 -1.0661458333291666e+01 4795 4791 1.0666666666666666e+01 4795 4190 1.5999999999989583e+01 4795 3000 1.5999999999989583e+01 4796 4796 6.4000000000416662e+01 4796 4182 5.3333333333124999e+00 4796 4188 5.3333333333124999e+00 4796 4674 2.1333333333312499e+01 4796 4667 -1.0666666666583334e+01 4796 4172 1.0666666666583334e+01 4796 4181 -2.1333333333312499e+01 4796 4180 5.3333333333124999e+00 4796 4762 2.1333333333312499e+01 4796 4761 -1.0666666666583334e+01 4796 4187 1.0666666666583334e+01 4796 4186 -2.1333333333312499e+01 4796 4185 5.3333333333124999e+00 4797 4797 5.3354166666874988e+01 4797 4191 2.1705219273391446e-19 4797 4180 5.3333333333124999e+00 4797 4674 2.1333333333312499e+01 4797 4661 -1.0666666666583334e+01 4797 4187 1.0661458333291666e+01 4797 4195 -1.5999999999989583e+01 4797 4188 5.3333333333124999e+00 4797 4170 2.1705219273391446e-19 4797 4790 1.0656249999999998e+01 4797 4789 -1.0666666666666666e+01 4797 4172 1.0661458333291666e+01 4797 4171 -1.5999999999989583e+01 4798 4798 4.2691666666666663e+01 4799 4799 2.1354166666666668e+01 4800 4800 2.1354166666666668e+01 4801 4801 4.2666666667333331e+01 4801 4366 -4.1666666666666665e-11 4801 4808 -1.0666666666666666e+01 4801 4806 -1.0666666666666666e+01 4801 4207 -4.1666666666666665e-11 4801 3767 -4.1666666666666665e-11 4801 4810 -1.0666666666666666e+01 4801 4200 -4.1666666666666665e-11 4801 4802 -1.0666666666666666e+01 4802 4802 4.2666666666916662e+01 4802 4803 -1.0666666666666666e+01 4802 3767 1.0666666666687499e+01 4802 4801 -1.0666666666666666e+01 4802 4200 1.0666666666687499e+01 4803 4803 4.2666666667333331e+01 4803 3767 -4.1666666666666665e-11 4803 4802 -1.0666666666666666e+01 4803 4417 1.0666666666666666e+01 4803 3756 -4.1666666666666665e-11 4803 4143 -4.1666666666666665e-11 4803 4811 -1.0666666666666666e+01 4803 4200 -4.1666666666666665e-11 4803 4804 -1.0666666666666666e+01 4804 4804 4.2666666666916662e+01 4804 4807 -1.0666666666666666e+01 4804 4143 1.0666666666687499e+01 4804 4803 -1.0666666666666666e+01 4804 4200 1.0666666666687499e+01 4805 4805 4.2666666667333331e+01 4805 4126 -1.0416666666666666e-11 4805 4133 6.2499999999999991e-11 4805 4132 -4.1666666666666665e-11 4805 5064 1.0666666666583334e+01 4805 4812 -1.0666666666666666e+01 4805 3733 -1.0416666666666666e-11 4805 4728 -1.0666666666583334e+01 4805 4727 1.0666666666666666e+01 4805 3737 -1.0416666666666666e-11 4805 3745 6.2499999999999991e-11 4805 3736 -4.1666666666666665e-11 4805 4210 -1.0416666666666666e-11 4805 4221 6.2499999999999991e-11 4805 4207 -4.1666666666666665e-11 4805 4817 -1.0666666666583334e+01 4805 4809 -1.0666666666666666e+01 4805 4367 6.2499999999999991e-11 4805 4366 -4.1666666666666665e-11 4805 5063 1.0666666666583334e+01 4805 4806 -1.0666666666666666e+01 4806 4806 4.2666666666916662e+01 4806 4221 -5.3333333333229165e+00 4806 4801 -1.0666666666666666e+01 4806 4207 1.0666666666687499e+01 4806 5063 -2.1333333333312499e+01 4806 4805 -1.0666666666666666e+01 4806 4367 -5.3333333333229165e+00 4806 4366 1.0666666666687499e+01 4807 4807 4.2666666667333331e+01 4807 4143 -4.1666666666666665e-11 4807 4804 -1.0666666666666666e+01 4807 4722 1.0666666666666666e+01 4807 4132 -4.1666666666666665e-11 4807 4366 -4.1666666666666665e-11 4807 4812 -1.0666666666666666e+01 4807 4200 -4.1666666666666665e-11 4807 4808 -1.0666666666666666e+01 4808 4808 4.2666666666916662e+01 4808 4801 -1.0666666666666666e+01 4808 4366 1.0666666666687499e+01 4808 4807 -1.0666666666666666e+01 4808 4200 1.0666666666687499e+01 4809 4809 4.2666666666916662e+01 4809 3745 -5.3333333333229165e+00 4809 4817 2.1333333333312499e+01 4809 4805 -1.0666666666666666e+01 4809 4221 -5.3333333333229165e+00 4809 4210 6.2500000000000004e-11 4809 4208 -5.3333333333229165e+00 4809 4207 1.0666666666687499e+01 4809 3737 6.2500000000000004e-11 4809 4416 -2.1333333333312499e+01 4809 4413 1.0666666666666666e+01 4809 3722 -5.3333333333229165e+00 4809 3736 1.0666666666687499e+01 4810 4810 4.2666666666916662e+01 4810 4801 -1.0666666666666666e+01 4810 3765 -5.3333333333229165e+00 4810 3767 1.0666666666687499e+01 4810 4412 -2.1333333333312499e+01 4810 4413 1.0666666666666666e+01 4810 4208 -5.3333333333229165e+00 4810 4207 1.0666666666687499e+01 4811 4811 4.2666666666916662e+01 4811 4803 -1.0666666666666666e+01 4811 4141 -5.3333333333229165e+00 4811 4143 1.0666666666687499e+01 4811 4718 -2.1333333333312499e+01 4811 4719 1.0666666666666666e+01 4811 3757 -5.3333333333229165e+00 4811 3756 1.0666666666687499e+01 4812 4812 4.2666666666916662e+01 4812 4807 -1.0666666666666666e+01 4812 4367 -5.3333333333229165e+00 4812 4366 1.0666666666687499e+01 4812 5064 -2.1333333333312499e+01 4812 4805 -1.0666666666666666e+01 4812 4133 -5.3333333333229165e+00 4812 4132 1.0666666666687499e+01 4813 4813 3.2000000000208331e+01 4814 4814 3.2000000000208331e+01 4815 4815 6.4000000000416662e+01 4815 3729 5.3333333333124999e+00 4815 4504 2.1333333333312499e+01 4815 4492 -1.0666666666583334e+01 4815 4216 5.3333333333124999e+00 4815 4210 1.0666666666583334e+01 4815 4213 -2.1333333333312499e+01 4815 4212 5.3333333333124999e+00 4815 4408 2.1333333333312499e+01 4815 4402 -1.0666666666583334e+01 4815 3737 1.0666666666583334e+01 4815 3738 -2.1333333333312499e+01 4815 3721 5.3333333333124999e+00 4816 4816 6.4000000000416662e+01 4816 3734 5.3333333333124999e+00 4816 4746 2.1333333333312499e+01 4816 4738 -1.0666666666583334e+01 4816 4220 5.3333333333124999e+00 4816 4210 1.0666666666583334e+01 4816 4218 -2.1333333333312499e+01 4816 4216 5.3333333333124999e+00 4816 4504 2.1333333333312499e+01 4816 4500 -1.0666666666583334e+01 4816 3737 1.0666666666583334e+01 4816 3744 -2.1333333333312499e+01 4816 3729 5.3333333333124999e+00 4817 4817 6.4000000000416662e+01 4817 3736 5.3333333333124999e+00 4817 4809 2.1333333333312499e+01 4817 4805 -1.0666666666583334e+01 4817 4207 5.3333333333124999e+00 4817 4210 1.0666666666583334e+01 4817 4221 -2.1333333333312499e+01 4817 4220 5.3333333333124999e+00 4817 4746 2.1333333333312499e+01 4817 4740 -1.0666666666583334e+01 4817 3737 1.0666666666583334e+01 4817 3745 -2.1333333333312499e+01 4817 3734 5.3333333333124999e+00 4818 4818 3.2000000000208331e+01 4819 4819 3.2000000000208331e+01 4820 4820 3.2000000000208331e+01 4821 4821 3.2000000000208331e+01 4822 4822 6.4000000000416662e+01 4822 4216 -5.3333333333124999e+00 4822 4227 -5.3333333333124999e+00 4822 4409 -2.1333333333312499e+01 4822 4402 1.0666666666583334e+01 4822 4213 2.1333333333312499e+01 4822 4212 -5.3333333333124999e+00 4822 4493 -2.1333333333312499e+01 4822 4492 1.0666666666583334e+01 4822 4225 2.1333333333312499e+01 4822 4224 -5.3333333333124999e+00 4823 4823 6.4000000000416662e+01 4823 3899 -5.3333333333124999e+00 4823 4224 -5.3333333333124999e+00 4823 4506 -2.1333333333312499e+01 4823 4492 1.0666666666583334e+01 4823 3898 -1.0666666666583334e+01 4823 3897 2.1333333333312499e+01 4823 3896 -5.3333333333124999e+00 4823 4403 -2.1333333333312499e+01 4823 4402 1.0666666666583334e+01 4823 4228 -1.0666666666583334e+01 4823 4225 2.1333333333312499e+01 4823 4227 -5.3333333333124999e+00 4824 4824 6.4000000000416662e+01 4824 3721 -5.3333333333124999e+00 4824 4410 -2.1333333333312499e+01 4824 4402 1.0666666666583334e+01 4824 3899 -5.3333333333124999e+00 4824 3891 -1.0666666666583334e+01 4824 3897 2.1333333333312499e+01 4824 3896 -5.3333333333124999e+00 4824 4505 -2.1333333333312499e+01 4824 4492 1.0666666666583334e+01 4824 3740 -1.0666666666583334e+01 4824 3738 2.1333333333312499e+01 4824 3729 -5.3333333333124999e+00 4825 4825 3.2000000000208331e+01 4826 4826 3.2000000000208331e+01 4827 4827 3.2000000000208331e+01 4828 4828 4.2691666666666663e+01 4828 4921 1.0666666666666666e+01 4828 4238 5.3322916666666664e+00 4828 4231 -1.0668750000000001e+01 4828 4829 -2.1331249999999997e+01 4828 4877 -1.0666666666666666e+01 4828 3715 5.3322916666666664e+00 4828 3717 -1.0668750000000001e+01 4829 4829 6.4020833333541674e+01 4829 4231 5.3312499999999998e+00 4829 3710 5.3333333333124999e+00 4829 4397 2.1333333333312499e+01 4829 4400 -1.0666666666583334e+01 4829 4238 -2.1332291666656250e+01 4829 4227 5.3333333333124999e+00 4829 4828 -2.1331249999999997e+01 4829 4877 1.0658333333333333e+01 4829 3715 -2.1332291666656246e+01 4829 3717 5.3312499999999998e+00 4830 4830 3.2020833333333336e+01 4831 4831 3.2000000000208331e+01 4832 4832 3.2000000000208331e+01 4833 4833 3.2000000000208331e+01 4834 4834 3.2020833333333336e+01 4835 4835 3.2000000000208331e+01 4836 4836 3.2000000000208331e+01 4837 4837 3.2000000000208331e+01 4838 4838 4.2666666667333331e+01 4838 4259 -1.0416666666666666e-11 4838 4268 6.2499999999999991e-11 4838 4257 -4.1666666666666665e-11 4838 4857 1.0666666666583334e+01 4838 4843 -1.0666666666666666e+01 4838 3901 -1.0416666666666666e-11 4838 4858 1.0666666666583334e+01 4838 4841 -1.0666666666666666e+01 4838 3809 -1.0416666666666666e-11 4838 3890 -1.0416666666666666e-11 4838 3892 6.2499999999999991e-11 4838 3888 -4.1666666666666665e-11 4838 3795 -1.0416666666666666e-11 4838 3808 6.2499999999999991e-11 4838 3796 -4.1666666666666665e-11 4838 4851 -1.0666666666583334e+01 4838 4845 -1.0666666666666666e+01 4838 4243 -1.0416666666666666e-11 4838 4242 6.2499999999999991e-11 4838 4241 -4.1666666666666665e-11 4838 4855 1.0666666666583334e+01 4838 4839 -1.0666666666666666e+01 4839 4839 4.2666666666916662e+01 4839 4255 -5.3333333333229165e+00 4839 4863 -2.1333333333312499e+01 4839 4846 -1.0666666666666666e+01 4839 3811 -5.3333333333229165e+00 4839 3809 6.2499999999999991e-11 4839 3808 -5.3333333333229165e+00 4839 3796 1.0666666666687499e+01 4839 4243 6.2499999999999991e-11 4839 4855 -2.1333333333312499e+01 4839 4838 -1.0666666666666666e+01 4839 4242 -5.3333333333229165e+00 4839 4241 1.0666666666687499e+01 4840 4840 4.2666666667333331e+01 4840 3750 -1.0416666666666666e-11 4840 3761 6.2499999999999991e-11 4840 3760 -4.1666666666666665e-11 4840 4871 1.0666666666583334e+01 4840 4847 -1.0666666666666666e+01 4840 3723 -1.0416666666666666e-11 4840 4425 -1.0666666666583334e+01 4840 4424 1.0666666666666666e+01 4840 3901 -1.0416666666666666e-11 4840 3740 -1.0416666666666666e-11 4840 3741 6.2499999999999991e-11 4840 3739 -4.1666666666666665e-11 4840 3891 -1.0416666666666666e-11 4840 3900 6.2499999999999991e-11 4840 3888 -4.1666666666666665e-11 4840 4854 -1.0666666666583334e+01 4840 4844 -1.0666666666666666e+01 4840 4259 -1.0416666666666666e-11 4840 4258 6.2499999999999991e-11 4840 4257 -4.1666666666666665e-11 4840 4870 1.0666666666583334e+01 4840 4841 -1.0666666666666666e+01 4841 4841 4.2666666666916662e+01 4841 3900 -5.3333333333229165e+00 4841 4268 -5.3333333333229165e+00 4841 3901 6.2499999999999991e-11 4841 4858 -2.1333333333312499e+01 4841 4838 -1.0666666666666666e+01 4841 3892 -5.3333333333229165e+00 4841 3888 1.0666666666687499e+01 4841 4259 6.2499999999999991e-11 4841 4870 -2.1333333333312499e+01 4841 4840 -1.0666666666666666e+01 4841 4258 -5.3333333333229165e+00 4841 4257 1.0666666666687499e+01 4842 4842 4.2666666667333331e+01 4842 3823 -4.1666666666666665e-11 4842 4848 -1.0666666666666666e+01 4842 4484 1.0666666666666666e+01 4842 3760 -4.1666666666666665e-11 4842 4257 -4.1666666666666665e-11 4842 4847 -1.0666666666666666e+01 4842 4241 -4.1666666666666665e-11 4842 4843 -1.0666666666666666e+01 4843 4843 4.2666666666916662e+01 4843 4242 -5.3333333333229165e+00 4843 4857 -2.1333333333312499e+01 4843 4838 -1.0666666666666666e+01 4843 4268 -5.3333333333229165e+00 4843 4257 1.0666666666687499e+01 4843 4842 -1.0666666666666666e+01 4843 4241 1.0666666666687499e+01 4844 4844 4.2666666666916662e+01 4844 3741 -5.3333333333229165e+00 4844 4854 2.1333333333312499e+01 4844 4840 -1.0666666666666666e+01 4844 3900 -5.3333333333229165e+00 4844 3891 6.2500000000000004e-11 4844 3889 -5.3333333333229165e+00 4844 3888 1.0666666666687499e+01 4844 3740 6.2499999999999991e-11 4844 4452 -2.1333333333312499e+01 4844 4449 1.0666666666666666e+01 4844 3725 -5.3333333333229165e+00 4844 3739 1.0666666666687499e+01 4845 4845 4.2666666666916662e+01 4845 3892 -5.3333333333229165e+00 4845 4851 2.1333333333312499e+01 4845 4838 -1.0666666666666666e+01 4845 3808 -5.3333333333229165e+00 4845 3795 6.2500000000000004e-11 4845 3794 -5.3333333333229165e+00 4845 3796 1.0666666666687499e+01 4845 3890 6.2500000000000004e-11 4845 4448 -2.1333333333312499e+01 4845 4449 1.0666666666666666e+01 4845 3889 -5.3333333333229165e+00 4845 3888 1.0666666666687499e+01 4846 4846 4.2666666667333324e+01 4846 3790 6.2499999999999991e-11 4846 3789 -4.1666666666666665e-11 4846 3823 -4.1666666666666665e-11 4846 4255 6.2499999999999991e-11 4846 4241 -4.1666666666666665e-11 4846 4848 -1.0666666666666666e+01 4846 3797 -1.0416666666666666e-11 4846 4243 -1.0416666666666666e-11 4846 3809 -1.0416666666666666e-11 4846 3811 6.2499999999999991e-11 4846 3796 -4.1666666666666665e-11 4846 4863 1.0666666666583334e+01 4846 4839 -1.0666666666666666e+01 4846 3785 -1.0416666666666666e-11 4846 4456 1.0666666666583334e+01 4846 4453 1.0666666666666666e+01 4846 1237 -1.0416666666666666e-11 4846 1602 -1.0416666666666666e-11 4846 1606 6.2499999999999991e-11 4846 2063 -1.0666666666583334e+01 4846 2058 -1.0666666666666666e+01 4846 2068 1.0666666666583334e+01 4847 4847 4.2666666666916662e+01 4847 4842 -1.0666666666666666e+01 4847 4258 -5.3333333333229165e+00 4847 4257 1.0666666666687499e+01 4847 4871 -2.1333333333312499e+01 4847 4840 -1.0666666666666666e+01 4847 3761 -5.3333333333229165e+00 4847 3760 1.0666666666687499e+01 4848 4848 4.2666666666916662e+01 4848 3823 1.0666666666687499e+01 4848 4846 -1.0666666666666666e+01 4848 4255 -5.3333333333229165e+00 4848 4241 1.0666666666687499e+01 4848 4842 -1.0666666666666666e+01 4848 1606 -5.3333333333229165e+00 4848 2068 -2.1333333333312499e+01 4849 4849 4.2691666666666663e+01 4849 3904 5.3322916666666664e+00 4849 3808 5.3322916666666664e+00 4849 3890 -6.2500000000000003e-03 4849 4851 -2.1331249999999997e+01 4849 4856 -1.0666666666666666e+01 4849 3892 5.3322916666666664e+00 4849 3905 -1.0668750000000001e+01 4849 3795 -6.2500000000000003e-03 4849 4850 -2.1331249999999997e+01 4849 4897 -1.0666666666666666e+01 4849 3799 5.3322916666666664e+00 4849 3798 -1.0668750000000001e+01 4850 4850 6.4041666666666671e+01 4850 3905 5.3312499999999998e+00 4850 3800 5.3312499999999998e+00 4850 4853 -2.1331249999999997e+01 4850 4895 -1.0658333333333333e+01 4850 3890 1.0658333333333333e+01 4850 3904 -2.1331249999999997e+01 4850 3903 5.3312499999999998e+00 4850 4849 -2.1331249999999997e+01 4850 4897 1.0658333333333333e+01 4850 3795 1.0658333333333333e+01 4850 3799 -2.1331249999999997e+01 4850 3798 5.3312499999999998e+00 4851 4851 6.4020833333541660e+01 4851 3798 5.3312499999999998e+00 4851 4849 -2.1331249999999997e+01 4851 4856 1.0658333333333333e+01 4851 3905 5.3312499999999998e+00 4851 3890 1.0662499999958333e+01 4851 3892 -2.1332291666656250e+01 4851 3888 5.3333333333124999e+00 4851 4845 2.1333333333312499e+01 4851 4838 -1.0666666666583334e+01 4851 3795 1.0662499999958333e+01 4851 3808 -2.1332291666656250e+01 4851 3796 5.3333333333124999e+00 4852 4852 6.4020833333541660e+01 4852 3903 5.3312499999999998e+00 4852 4853 -2.1331249999999997e+01 4852 4865 1.0658333333333333e+01 4852 3800 5.3312499999999998e+00 4852 3795 1.0662499999958333e+01 4852 3810 -2.1332291666656250e+01 4852 3793 5.3333333333124999e+00 4852 4435 2.1333333333312499e+01 4852 4432 -1.0666666666583334e+01 4852 3890 1.0662499999958333e+01 4852 3895 -2.1332291666656250e+01 4852 3893 5.3333333333124999e+00 4853 4853 4.2691666666666663e+01 4853 3895 5.3322916666666664e+00 4853 4852 -2.1331249999999997e+01 4853 4865 -1.0666666666666666e+01 4853 3810 5.3322916666666664e+00 4853 3795 -6.2500000000000003e-03 4853 3799 5.3322916666666664e+00 4853 3800 -1.0668750000000001e+01 4853 3890 -6.2500000000000003e-03 4853 4850 -2.1331249999999997e+01 4853 4895 1.0666666666666666e+01 4853 3904 5.3322916666666664e+00 4853 3903 -1.0668750000000001e+01 4854 4854 6.4000000000416662e+01 4854 3739 5.3333333333124999e+00 4854 4844 2.1333333333312499e+01 4854 4840 -1.0666666666583334e+01 4854 3888 5.3333333333124999e+00 4854 3891 1.0666666666583334e+01 4854 3900 -2.1333333333312499e+01 4854 3899 5.3333333333124999e+00 4854 4410 2.1333333333312499e+01 4854 4404 -1.0666666666583334e+01 4854 3740 1.0666666666583334e+01 4854 3741 -2.1333333333312499e+01 4854 3721 5.3333333333124999e+00 4855 4855 6.4020833333541660e+01 4855 4247 -5.3312499999999998e+00 4855 4859 2.1331249999999997e+01 4855 4856 -1.0658333333333333e+01 4855 3798 -5.3312499999999998e+00 4855 3809 -1.0662499999958333e+01 4855 3808 2.1332291666656250e+01 4855 3796 -5.3333333333124999e+00 4855 4839 -2.1333333333312499e+01 4855 4838 1.0666666666583334e+01 4855 4243 -1.0662499999958333e+01 4855 4242 2.1332291666656250e+01 4855 4241 -5.3333333333124999e+00 4856 4856 4.2733333333333334e+01 4856 3901 1.0416666666666669e-03 4856 4259 1.0416666666666667e-03 4856 4268 -6.2500000000000003e-03 4856 4262 4.1666666666666666e-03 4856 4858 -1.0658333333333333e+01 4856 4875 -1.0666666666666666e+01 4856 3795 1.0416666666666669e-03 4856 4243 1.0416666666666669e-03 4856 3809 1.0416666666666667e-03 4856 3808 -6.2500000000000003e-03 4856 3798 4.1666666666666666e-03 4856 4855 -1.0658333333333333e+01 4856 4859 -1.0666666666666666e+01 4856 3890 1.0416666666666667e-03 4856 3892 -6.2500000000000003e-03 4856 3905 4.1666666666666666e-03 4856 4851 1.0658333333333333e+01 4856 4849 -1.0666666666666666e+01 4856 4242 -6.2500000000000003e-03 4856 4247 4.1666666666666666e-03 4856 4857 -1.0658333333333333e+01 4856 4881 -1.0666666666666666e+01 4857 4857 6.4020833333541674e+01 4857 4262 -5.3312499999999998e+00 4857 4241 -5.3333333333124999e+00 4857 4843 -2.1333333333312499e+01 4857 4838 1.0666666666583334e+01 4857 4268 2.1332291666656250e+01 4857 4257 -5.3333333333124999e+00 4857 4881 2.1331249999999997e+01 4857 4856 -1.0658333333333333e+01 4857 4242 2.1332291666656246e+01 4857 4247 -5.3312499999999998e+00 4858 4858 6.4020833333541660e+01 4858 3905 -5.3312499999999998e+00 4858 4875 2.1331249999999997e+01 4858 4856 -1.0658333333333333e+01 4858 4262 -5.3312499999999998e+00 4858 4259 -1.0662499999958333e+01 4858 4268 2.1332291666656250e+01 4858 4257 -5.3333333333124999e+00 4858 4841 -2.1333333333312499e+01 4858 4838 1.0666666666583334e+01 4858 3901 -1.0662499999958333e+01 4858 3892 2.1332291666656250e+01 4858 3888 -5.3333333333124999e+00 4859 4859 4.2691666666666663e+01 4859 3812 5.3322916666666664e+00 4859 4242 5.3322916666666664e+00 4859 3809 -6.2500000000000003e-03 4859 4855 2.1331249999999997e+01 4859 4856 -1.0666666666666666e+01 4859 3808 5.3322916666666664e+00 4859 3798 -1.0668750000000001e+01 4859 4243 -6.2500000000000003e-03 4859 4860 -2.1331249999999997e+01 4859 4904 1.0666666666666666e+01 4859 4249 5.3322916666666664e+00 4859 4247 -1.0668750000000001e+01 4860 4860 6.4020833333541674e+01 4860 4250 5.3333333333124999e+00 4860 4861 -2.1333333333312499e+01 4860 4914 1.0666666666583334e+01 4860 3802 5.3333333333124999e+00 4860 3809 1.0662499999958333e+01 4860 3812 -2.1332291666656246e+01 4860 3798 5.3312499999999998e+00 4860 4859 -2.1331249999999997e+01 4860 4904 -1.0658333333333333e+01 4860 4243 1.0662499999958333e+01 4860 4249 -2.1332291666656246e+01 4860 4247 5.3312499999999998e+00 4861 4861 4.2666666666916662e+01 4861 3814 5.3333333333229165e+00 4861 4249 5.3333333333229165e+00 4861 3809 -6.2499999999999991e-11 4861 4860 -2.1333333333312499e+01 4861 4914 -1.0666666666666666e+01 4861 3812 5.3333333333229165e+00 4861 3802 -1.0666666666687499e+01 4861 4243 -6.2499999999999991e-11 4861 4862 2.1333333333312499e+01 4861 4982 1.0666666666666666e+01 4861 4254 5.3333333333229165e+00 4861 4250 -1.0666666666687499e+01 4862 4862 7.4666666667125000e+01 4862 4243 -2.1333333333260416e+01 4862 4254 3.2000000000000000e+01 4862 3809 -1.0666666666531249e+01 4862 3816 -5.3333333332812494e+00 4862 3814 2.1333333333333332e+01 4862 3802 -5.3333333333124999e+00 4862 4861 2.1333333333312499e+01 4862 4982 1.0666666666583334e+01 4862 4250 -5.3333333333124999e+00 4862 1598 -5.3333333333229165e+00 4862 1769 1.0666666666583334e+01 4862 1775 -2.1333333333291666e+01 4863 4863 7.4666666667124986e+01 4863 3809 -1.0666666666531249e+01 4863 3816 -5.3333333332812494e+00 4863 3811 2.1333333333333332e+01 4863 4243 -2.1333333333260416e+01 4863 4255 3.2000000000000000e+01 4863 4241 -5.3333333333124999e+00 4863 4839 -2.1333333333312499e+01 4863 4846 1.0666666666583334e+01 4863 3796 -5.3333333333124999e+00 4863 1775 -2.1333333333291666e+01 4863 1774 1.0666666666583334e+01 4863 1598 -5.3333333333229165e+00 4864 4864 6.4020833333541660e+01 4864 4865 -1.0658333333333333e+01 4864 3870 2.1332291666656250e+01 4864 3866 -5.3333333333124999e+00 4864 4433 -2.1333333333312499e+01 4864 4432 1.0666666666583334e+01 4864 3778 2.1332291666656250e+01 4864 3775 -5.3333333333124999e+00 4864 2410 -5.3312499999999998e+00 4864 3325 -2.1331249999999997e+01 4864 2765 -5.3312499999999998e+00 4864 2760 -1.0662499999958333e+01 4864 2409 -1.0662499999958333e+01 4865 4865 4.2733333333333334e+01 4865 3865 1.0416666666666669e-03 4865 3870 -6.2500000000000003e-03 4865 4864 -1.0658333333333333e+01 4865 3885 1.0416666666666667e-03 4865 4538 1.0658333333333333e+01 4865 4536 -1.0666666666666666e+01 4865 3807 1.0416666666666669e-03 4865 3890 1.0416666666666669e-03 4865 3895 -6.2500000000000003e-03 4865 3903 4.1666666666666666e-03 4865 3795 1.0416666666666667e-03 4865 3810 -6.2500000000000003e-03 4865 3800 4.1666666666666666e-03 4865 4852 1.0658333333333333e+01 4865 4853 -1.0666666666666666e+01 4865 3777 1.0416666666666667e-03 4865 3778 -6.2500000000000003e-03 4865 4464 1.0658333333333333e+01 4865 4463 -1.0666666666666666e+01 4865 2409 1.0416666666666669e-03 4865 2760 1.0416666666666667e-03 4865 2765 4.1666666666666666e-03 4865 3325 1.0666666666666666e+01 4865 2410 4.1666666666666666e-03 4866 4866 6.4020833333541674e+01 4866 3775 5.3333333333124999e+00 4866 4433 2.1333333333312499e+01 4866 4438 -1.0666666666583334e+01 4866 3871 -2.1332291666656250e+01 4866 3866 5.3333333333124999e+00 4866 4889 1.0658333333333333e+01 4866 3779 -2.1332291666656246e+01 4866 2757 5.3312499999999998e+00 4866 2760 1.0662499999958333e+01 4866 3326 2.1331249999999997e+01 4866 2409 1.0662499999958333e+01 4866 288 5.3312499999999998e+00 4867 4867 6.4041666666666671e+01 4867 3883 5.3312499999999998e+00 4867 4231 5.3312499999999998e+00 4867 4869 -2.1331249999999997e+01 4867 4925 -1.0658333333333333e+01 4867 3898 1.0658333333333333e+01 4867 3908 -2.1331249999999997e+01 4867 3907 5.3312499999999998e+00 4867 4529 2.1331249999999997e+01 4867 4528 -1.0658333333333333e+01 4867 4228 1.0658333333333333e+01 4867 4230 -2.1331249999999997e+01 4867 4229 5.3312499999999998e+00 4868 4868 6.4020833333541660e+01 4868 3907 5.3312499999999998e+00 4868 4869 -2.1331249999999997e+01 4868 4877 1.0658333333333333e+01 4868 4231 5.3312499999999998e+00 4868 4228 1.0662499999958333e+01 4868 4238 -2.1332291666656250e+01 4868 4227 5.3333333333124999e+00 4868 4403 2.1333333333312499e+01 4868 4400 -1.0666666666583334e+01 4868 3898 1.0662499999958333e+01 4868 3902 -2.1332291666656250e+01 4868 3899 5.3333333333124999e+00 4869 4869 4.2691666666666663e+01 4869 3902 5.3322916666666664e+00 4869 4868 -2.1331249999999997e+01 4869 4877 -1.0666666666666666e+01 4869 4238 5.3322916666666664e+00 4869 4228 -6.2500000000000003e-03 4869 4230 5.3322916666666664e+00 4869 4231 -1.0668750000000001e+01 4869 3898 -6.2500000000000003e-03 4869 4867 -2.1331249999999997e+01 4869 4925 1.0666666666666666e+01 4869 3908 5.3322916666666664e+00 4869 3907 -1.0668750000000001e+01 4870 4870 6.4000000000416662e+01 4870 3888 -5.3333333333124999e+00 4870 4260 -5.3333333333124999e+00 4870 4411 -2.1333333333312499e+01 4870 4404 1.0666666666583334e+01 4870 3901 -1.0666666666583334e+01 4870 3900 2.1333333333312499e+01 4870 3899 -5.3333333333124999e+00 4870 4841 -2.1333333333312499e+01 4870 4840 1.0666666666583334e+01 4870 4259 -1.0666666666583334e+01 4870 4258 2.1333333333312499e+01 4870 4257 -5.3333333333124999e+00 4871 4871 6.4000000000416662e+01 4871 3747 -5.3333333333124999e+00 4871 4257 -5.3333333333124999e+00 4871 4847 -2.1333333333312499e+01 4871 4840 1.0666666666583334e+01 4871 3761 2.1333333333312499e+01 4871 3760 -5.3333333333124999e+00 4871 4405 -2.1333333333312499e+01 4871 4404 1.0666666666583334e+01 4871 4258 2.1333333333312499e+01 4871 4260 -5.3333333333124999e+00 4872 4872 4.2691666666666663e+01 4872 3906 5.3322916666666664e+00 4872 4266 5.3322916666666664e+00 4872 3901 -6.2500000000000003e-03 4872 4874 -2.1331249999999997e+01 4872 4877 -1.0666666666666666e+01 4872 3902 5.3322916666666664e+00 4872 3907 -1.0668750000000001e+01 4872 4259 -6.2500000000000003e-03 4872 4873 -2.1331249999999997e+01 4872 4924 1.0666666666666666e+01 4872 4263 5.3322916666666664e+00 4872 4265 -1.0668750000000001e+01 4873 4873 6.4041666666666671e+01 4873 3907 5.3312499999999998e+00 4873 4262 5.3312499999999998e+00 4873 4875 -2.1331249999999997e+01 4873 4902 -1.0658333333333333e+01 4873 3901 1.0658333333333333e+01 4873 3906 -2.1331249999999997e+01 4873 3905 5.3312499999999998e+00 4873 4872 -2.1331249999999997e+01 4873 4924 -1.0658333333333333e+01 4873 4259 1.0658333333333333e+01 4873 4263 -2.1331249999999997e+01 4873 4265 5.3312499999999998e+00 4874 4874 6.4020833333541660e+01 4874 4265 5.3312499999999998e+00 4874 4872 -2.1331249999999997e+01 4874 4877 1.0658333333333333e+01 4874 3907 5.3312499999999998e+00 4874 3901 1.0662499999958333e+01 4874 3902 -2.1332291666656250e+01 4874 3899 5.3333333333124999e+00 4874 4411 2.1333333333312499e+01 4874 4400 -1.0666666666583334e+01 4874 4259 1.0662499999958333e+01 4874 4266 -2.1332291666656250e+01 4874 4260 5.3333333333124999e+00 4875 4875 4.2691666666666663e+01 4875 3892 5.3322916666666664e+00 4875 4858 2.1331249999999997e+01 4875 4856 -1.0666666666666666e+01 4875 4268 5.3322916666666664e+00 4875 4259 -6.2500000000000003e-03 4875 4263 5.3322916666666664e+00 4875 4262 -1.0668750000000001e+01 4875 3901 -6.2500000000000003e-03 4875 4873 -2.1331249999999997e+01 4875 4902 1.0666666666666666e+01 4875 3906 5.3322916666666664e+00 4875 3905 -1.0668750000000001e+01 4876 4876 6.4020833333541660e+01 4876 3717 -5.3312499999999998e+00 4876 4878 2.1331249999999997e+01 4876 4877 -1.0658333333333333e+01 4876 4265 -5.3312499999999998e+00 4876 4266 2.1332291666656250e+01 4876 4260 -5.3333333333124999e+00 4876 4401 -2.1333333333312499e+01 4876 4400 1.0666666666583334e+01 4876 3715 2.1332291666656250e+01 4876 3710 -5.3333333333124999e+00 4877 4877 4.2733333333333334e+01 4877 4259 1.0416666666666669e-03 4877 4266 -6.2500000000000003e-03 4877 4265 4.1666666666666666e-03 4877 4876 -1.0658333333333333e+01 4877 4878 -1.0666666666666666e+01 4877 3901 1.0416666666666667e-03 4877 4874 1.0658333333333333e+01 4877 4872 -1.0666666666666666e+01 4877 3898 1.0416666666666669e-03 4877 3902 -6.2500000000000003e-03 4877 3907 4.1666666666666666e-03 4877 4228 1.0416666666666667e-03 4877 4238 -6.2500000000000003e-03 4877 4231 4.1666666666666666e-03 4877 4868 1.0658333333333333e+01 4877 4869 -1.0666666666666666e+01 4877 3715 -6.2500000000000003e-03 4877 3717 4.1666666666666666e-03 4877 4829 1.0658333333333333e+01 4877 4828 -1.0666666666666666e+01 4878 4878 4.2691666666666663e+01 4878 3715 5.3322916666666664e+00 4878 4876 2.1331249999999997e+01 4878 4877 -1.0666666666666666e+01 4878 4266 5.3322916666666664e+00 4878 4265 -1.0668750000000001e+01 4878 4923 1.0666666666666666e+01 4878 3717 -1.0668750000000001e+01 4879 4879 3.2020833333333336e+01 4880 4880 3.2000000000208331e+01 4881 4881 4.2691666666666663e+01 4881 4268 5.3322916666666664e+00 4881 4901 1.0666666666666666e+01 4881 4262 -1.0668750000000001e+01 4881 4857 2.1331249999999997e+01 4881 4856 -1.0666666666666666e+01 4881 4242 5.3322916666666664e+00 4881 4247 -1.0668750000000001e+01 4882 4882 3.2020833333333336e+01 4883 4883 3.2000000000208331e+01 4884 4884 3.2000000000208331e+01 4885 4885 6.4020833333541660e+01 4885 4886 2.1331249999999997e+01 4885 4889 1.0658333333333333e+01 4885 3971 5.3312499999999998e+00 4885 3977 1.0662499999958333e+01 4885 3978 -2.1332291666656250e+01 4885 3966 5.3333333333124999e+00 4885 4439 2.1333333333312499e+01 4885 4438 -1.0666666666583334e+01 4885 3780 1.0662499999958333e+01 4885 3779 -2.1332291666656250e+01 4885 3775 5.3333333333124999e+00 4885 288 5.3312499999999998e+00 4886 4886 4.2691666666666663e+01 4886 3977 6.2500000000000003e-03 4886 3971 1.0668749999999999e+01 4886 3780 6.2500000000000003e-03 4886 3779 -5.3322916666666664e+00 4886 4885 2.1331249999999997e+01 4886 4889 1.0666666666666666e+01 4886 3978 -5.3322916666666664e+00 4886 293 -5.3322916666666664e+00 4886 708 2.1331249999999997e+01 4886 1011 -1.0666666666666666e+01 4886 289 -5.3322916666666664e+00 4886 288 1.0668749999999999e+01 4887 4887 6.4000000000416662e+01 4887 3968 -1.0666666666583334e+01 4887 3967 2.1333333333312499e+01 4887 3969 -5.3333333333124999e+00 4887 4888 1.0666666666583334e+01 4887 3791 -1.0666666666583334e+01 4887 3792 2.1333333333312499e+01 4887 3786 -5.3333333333124999e+00 4887 4437 -2.1333333333312499e+01 4887 4436 1.0666666666583334e+01 4887 3966 -5.3333333333124999e+00 4887 2075 -2.1333333333312499e+01 4887 1243 -5.3333333333124999e+00 4888 4888 4.2666666667333324e+01 4888 3788 -1.0416666666666666e-11 4888 3968 -1.0416666666666666e-11 4888 3967 6.2499999999999991e-11 4888 3969 -4.1666666666666665e-11 4888 3791 -1.0416666666666666e-11 4888 3792 6.2499999999999991e-11 4888 4887 1.0666666666583334e+01 4888 3726 -1.0416666666666666e-11 4888 3742 6.2499999999999991e-11 4888 3743 -4.1666666666666665e-11 4888 4458 1.0666666666583334e+01 4888 3844 -1.0416666666666666e-11 4888 3731 -1.0416666666666666e-11 4888 3840 -1.0416666666666666e-11 4888 3848 6.2499999999999991e-11 4888 3850 -4.1666666666666665e-11 4888 4517 -1.0666666666583334e+01 4888 4518 1.0666666666666666e+01 4888 3970 -1.0416666666666666e-11 4888 4601 -1.0666666666583334e+01 4888 4600 1.0666666666666666e+01 4888 1243 -4.1666666666666665e-11 4888 2075 -1.0666666666666666e+01 4888 2067 1.0666666666666666e+01 4889 4889 4.2733333333333334e+01 4889 3970 1.0416666666666669e-03 4889 3780 1.0416666666666669e-03 4889 3977 1.0416666666666667e-03 4889 3978 -6.2500000000000003e-03 4889 3971 4.1666666666666666e-03 4889 4885 1.0658333333333333e+01 4889 4886 1.0666666666666666e+01 4889 3844 1.0416666666666667e-03 4889 4604 1.0658333333333333e+01 4889 4602 -1.0666666666666666e+01 4889 3839 1.0416666666666669e-03 4889 3849 -6.2500000000000003e-03 4889 3851 4.1666666666666666e-03 4889 3867 1.0416666666666667e-03 4889 3871 -6.2500000000000003e-03 4889 4515 1.0658333333333333e+01 4889 4516 -1.0666666666666666e+01 4889 3779 -6.2500000000000003e-03 4889 4866 1.0658333333333333e+01 4889 2760 1.0416666666666669e-03 4889 2757 4.1666666666666666e-03 4889 2409 1.0416666666666667e-03 4889 288 4.1666666666666666e-03 4889 3326 1.0666666666666666e+01 4890 4890 4.2666666667333331e+01 4890 4034 -4.1666666666666665e-11 4890 4657 1.0666666666666666e+01 4890 4752 1.0666666666666666e+01 4890 4136 -4.1666666666666665e-11 4890 4380 -4.1666666666666665e-11 4890 4894 -1.0666666666666666e+01 4890 3953 -4.1666666666666665e-11 4890 4891 -1.0666666666666666e+01 4891 4891 4.2666666666916662e+01 4891 3953 1.0666666666687499e+01 4891 4380 1.0666666666687499e+01 4891 4890 -1.0666666666666666e+01 4891 1438 -5.3333333333229165e+00 4891 2078 -2.1333333333312499e+01 4891 2074 -1.0666666666666666e+01 4891 1578 -5.3333333333229165e+00 4892 4892 4.2666666666916662e+01 4892 3846 -5.3333333333229165e+00 4892 4614 -2.1333333333312499e+01 4892 4612 1.0666666666666666e+01 4892 4041 -5.3333333333229165e+00 4892 4029 6.2499999999999991e-11 4892 4033 -5.3333333333229165e+00 4892 4034 1.0666666666687499e+01 4892 3858 6.2500000000000004e-11 4892 4749 -2.1333333333312499e+01 4892 4750 1.0666666666666666e+01 4892 3860 -5.3333333333229165e+00 4892 3850 1.0666666666687499e+01 4893 4893 4.2666666667333324e+01 4893 3726 -1.0416666666666666e-11 4893 3746 6.2499999999999991e-11 4893 3743 -4.1666666666666665e-11 4893 3788 -1.0416666666666666e-11 4893 4378 6.2499999999999991e-11 4893 4380 -4.1666666666666665e-11 4893 4126 -1.0416666666666666e-11 4893 4137 6.2499999999999991e-11 4893 4136 -4.1666666666666665e-11 4893 5069 1.0666666666583334e+01 4893 4894 -1.0666666666666666e+01 4893 3733 -1.0416666666666666e-11 4893 4730 -1.0666666666583334e+01 4893 4729 1.0666666666666666e+01 4893 1233 -1.0416666666666666e-11 4893 1242 6.2499999999999991e-11 4893 1243 -4.1666666666666665e-11 4893 2066 -1.0666666666583334e+01 4893 2067 1.0666666666666666e+01 4893 1573 -1.0416666666666666e-11 4893 2041 -1.0666666666583334e+01 4893 2040 1.0666666666666666e+01 4894 4894 4.2666666666916662e+01 4894 4890 -1.0666666666666666e+01 4894 4378 -5.3333333333229165e+00 4894 4380 1.0666666666687499e+01 4894 5069 -2.1333333333312499e+01 4894 4893 -1.0666666666666666e+01 4894 4137 -5.3333333333229165e+00 4894 4136 1.0666666666687499e+01 4895 4895 4.2733333333333334e+01 4895 4176 -1.0416666666666669e-03 4895 4175 6.2500000000000003e-03 4895 4899 1.0658333333333333e+01 4895 3886 -1.0416666666666669e-03 4895 3795 -1.0416666666666669e-03 4895 3890 -1.0416666666666667e-03 4895 3904 6.2500000000000003e-03 4895 3903 -4.1666666666666666e-03 4895 4850 -1.0658333333333333e+01 4895 4853 1.0666666666666666e+01 4895 3872 -1.0416666666666667e-03 4895 3876 6.2500000000000003e-03 4895 4540 -1.0658333333333333e+01 4895 4539 1.0666666666666666e+01 4895 3801 -1.0416666666666667e-03 4895 3799 6.2500000000000003e-03 4895 3800 -4.1666666666666666e-03 4895 4898 1.0658333333333333e+01 4895 4896 -1.0666666666666666e+01 4895 2780 -1.0416666666666669e-03 4895 2997 -1.0416666666666667e-03 4895 2994 -4.1666666666666666e-03 4895 3626 -1.0666666666666666e+01 4895 2772 -4.1666666666666666e-03 4896 4896 4.2691666666666663e+01 4896 4175 -5.3322916666666664e+00 4896 3813 -5.3322916666666664e+00 4896 4176 6.2500000000000003e-03 4896 4942 2.1331249999999997e+01 4896 3801 6.2500000000000003e-03 4896 4898 -2.1331249999999997e+01 4896 4895 -1.0666666666666666e+01 4896 3799 -5.3322916666666664e+00 4896 3800 1.0668750000000001e+01 4896 3623 -1.0666666666666666e+01 4896 2998 -5.3322916666666664e+00 4896 2994 1.0668750000000001e+01 4897 4897 4.2733333333333334e+01 4897 3801 1.0416666666666669e-03 4897 4176 1.0416666666666667e-03 4897 4175 -6.2500000000000003e-03 4897 4173 4.1666666666666666e-03 4897 4898 -1.0658333333333333e+01 4897 4906 1.0666666666666666e+01 4897 4899 -1.0658333333333333e+01 4897 4905 1.0666666666666666e+01 4897 3890 1.0416666666666669e-03 4897 3872 1.0416666666666669e-03 4897 3876 -6.2500000000000003e-03 4897 3877 4.1666666666666666e-03 4897 3886 1.0416666666666667e-03 4897 3904 -6.2500000000000003e-03 4897 3905 4.1666666666666666e-03 4897 4540 1.0658333333333333e+01 4897 4541 -1.0666666666666666e+01 4897 3795 1.0416666666666667e-03 4897 3799 -6.2500000000000003e-03 4897 3798 4.1666666666666666e-03 4897 4850 1.0658333333333333e+01 4897 4849 -1.0666666666666666e+01 4897 2997 1.0416666666666669e-03 4897 2780 1.0416666666666667e-03 4898 4898 6.4041666666666671e+01 4898 3798 -5.3312499999999998e+00 4898 4906 -2.1331249999999997e+01 4898 4897 -1.0658333333333333e+01 4898 4176 -1.0658333333333333e+01 4898 4175 2.1331249999999997e+01 4898 4173 -5.3312499999999998e+00 4898 4896 -2.1331249999999997e+01 4898 4895 1.0658333333333333e+01 4898 3801 -1.0658333333333333e+01 4898 3799 2.1331249999999997e+01 4898 3800 -5.3312499999999998e+00 4898 2994 -5.3312499999999998e+00 4899 4899 6.4041666666666671e+01 4899 4895 1.0658333333333333e+01 4899 4175 2.1331249999999997e+01 4899 4173 -5.3312499999999998e+00 4899 4905 -2.1331249999999997e+01 4899 4897 -1.0658333333333333e+01 4899 3876 2.1331249999999997e+01 4899 3877 -5.3312499999999998e+00 4899 2772 -5.3312499999999998e+00 4899 3626 -2.1331249999999997e+01 4899 2994 -5.3312499999999998e+00 4899 2997 -1.0658333333333333e+01 4899 2780 -1.0658333333333333e+01 4900 4900 6.4091666666666669e+01 4900 3874 -1.0416666666666664e-03 4900 3927 -1.0416666666666667e-03 4900 3931 5.3291666666666666e+00 4900 3930 1.0416666666666666e-02 4900 4570 1.0666666666666666e+01 4900 4569 -1.0658333333333333e+01 4900 4249 5.3302083333333332e+00 4900 4169 1.0416666666666664e-02 4900 4904 -2.1320833333333333e+01 4900 4912 2.1329166666666669e+01 4900 4174 -5.3281250000000000e+00 4900 4173 5.3291666666666666e+00 4900 3877 -4.1666666666666657e-03 4900 3878 6.2499999999999995e-03 4900 4905 -1.0666666666666666e+01 4900 4907 1.0658333333333333e+01 4900 4246 2.0833333333333337e-03 4900 4901 -2.1320833333333333e+01 4900 4908 2.1329166666666666e+01 4900 4247 -1.0683333333333334e+01 4900 2997 -1.0416666666666664e-03 4900 2780 -1.0416666666666667e-03 4901 4901 6.4058333333333337e+01 4901 4262 -4.1666666666666666e-03 4901 4881 1.0666666666666666e+01 4901 4903 -1.0666666666666666e+01 4901 3931 5.3291666666666666e+00 4901 3930 -5.3281250000000000e+00 4901 4908 -3.2002083333333331e+01 4901 4900 -2.1320833333333333e+01 4901 4247 1.5995833333333334e+01 4901 4246 -5.3322916666666664e+00 4902 4902 4.2733333333333334e+01 4902 3886 -1.0416666666666669e-03 4902 4259 -1.0416666666666669e-03 4902 3901 -1.0416666666666667e-03 4902 3906 6.2500000000000003e-03 4902 3905 -4.1666666666666666e-03 4902 4873 -1.0658333333333333e+01 4902 4875 1.0666666666666666e+01 4902 3872 -1.0416666666666667e-03 4902 4542 -1.0658333333333333e+01 4902 4541 1.0666666666666666e+01 4902 3874 -1.0416666666666669e-03 4902 3881 6.2500000000000003e-03 4902 3877 -4.1666666666666666e-03 4902 3927 -1.0416666666666667e-03 4902 3934 6.2500000000000003e-03 4902 3931 -4.1666666666666666e-03 4902 4572 -1.0658333333333333e+01 4902 4570 1.0666666666666666e+01 4902 4263 6.2500000000000003e-03 4902 4262 -4.1666666666666666e-03 4902 4936 1.0658333333333333e+01 4902 4903 -1.0666666666666666e+01 4903 4903 4.2691666666666663e+01 4903 3934 -5.3322916666666664e+00 4903 4901 -1.0666666666666666e+01 4903 3931 1.0668750000000001e+01 4903 4936 -2.1331249999999997e+01 4903 4902 -1.0666666666666666e+01 4903 4263 -5.3322916666666664e+00 4903 4262 1.0668750000000001e+01 4904 4904 6.4058333333333337e+01 4904 3809 -1.0416666666666669e-03 4904 4176 -1.0416666666666669e-03 4904 3801 -1.0416666666666667e-03 4904 3812 6.2500000000000003e-03 4904 3798 -4.1666666666666666e-03 4904 4916 1.0658333333333333e+01 4904 4906 -1.0666666666666666e+01 4904 4246 -5.3322916666666664e+00 4904 4174 1.0416666666666666e-02 4904 4912 -3.2002083333333331e+01 4904 4900 -2.1320833333333333e+01 4904 4173 5.3291666666666666e+00 4904 4169 -5.3281250000000000e+00 4904 4243 -1.0416666666666667e-03 4904 4249 -1.0662499999999998e+01 4904 4247 1.5995833333333334e+01 4904 4860 -1.0658333333333333e+01 4904 4859 1.0666666666666666e+01 4905 4905 4.2691666666666663e+01 4905 4175 -5.3322916666666664e+00 4905 4899 -2.1331249999999997e+01 4905 4897 1.0666666666666666e+01 4905 3876 -5.3322916666666664e+00 4905 4173 1.0668750000000001e+01 4905 4169 -5.3322916666666664e+00 4905 4907 -2.1331249999999997e+01 4905 4900 -1.0666666666666666e+01 4905 3877 1.0668750000000001e+01 4905 3878 -5.3322916666666664e+00 4905 2997 6.2499999999999995e-03 4905 2780 6.2499999999999995e-03 4906 4906 4.2691666666666663e+01 4906 4174 -5.3322916666666664e+00 4906 4916 -2.1331249999999997e+01 4906 4904 -1.0666666666666666e+01 4906 3812 -5.3322916666666664e+00 4906 3801 6.2500000000000003e-03 4906 3799 -5.3322916666666664e+00 4906 3798 1.0668750000000001e+01 4906 4176 6.2500000000000003e-03 4906 4898 -2.1331249999999997e+01 4906 4897 1.0666666666666666e+01 4906 4175 -5.3322916666666664e+00 4906 4173 1.0668750000000001e+01 4907 4907 5.3374999999999993e+01 4907 3879 -5.0116116045879435e-20 4907 4173 -5.3312499999999998e+00 4907 4905 -2.1331249999999997e+01 4907 4900 1.0658333333333333e+01 4907 3877 -5.3312499999999998e+00 4907 3878 1.5998958333333331e+01 4907 4170 -2.1705219273391446e-19 4907 4785 -1.0656249999999998e+01 4907 4784 1.0666666666666666e+01 4907 4169 1.5998958333333333e+01 4907 2780 -1.0657291666666666e+01 4907 2997 -1.0657291666666666e+01 4908 4908 5.3375000000000014e+01 4908 4096 -6.2499999999999995e-03 4908 4913 -1.0666666666666666e+01 4908 3931 -2.1684043449710089e-19 4908 3930 5.3322916666666664e+00 4908 4909 -1.0666666666666668e+01 4908 4901 -3.2002083333333331e+01 4908 4900 2.1329166666666666e+01 4908 4247 -1.0662500000000000e+01 4908 4246 5.3343749999999996e+00 4909 4909 4.2699999999999996e+01 4909 4249 -1.0662500000000000e+01 4909 4100 -2.1705219273391446e-19 4909 4915 -2.1329166666666666e+01 4909 4912 -1.0666666666666664e+01 4909 4096 1.0672916666666666e+01 4909 4908 -1.0666666666666668e+01 4909 4246 1.0672916666666666e+01 4910 4910 6.4091666666666669e+01 4910 4179 1.0416666666666664e-03 4910 3914 -5.3302083333333332e+00 4910 4169 -1.0416666666666664e-02 4910 4787 -2.1320833333333333e+01 4910 4784 2.1329166666666669e+01 4910 4170 5.3281250000000000e+00 4910 4184 -5.3291666666666666e+00 4910 3920 5.3281250000000000e+00 4910 3923 -5.3291666666666666e+00 4910 3930 -1.0416666666666666e-02 4910 5074 1.0666666666666666e+01 4910 4913 -1.0658333333333333e+01 4910 3919 -2.0833333333333337e-03 4910 4562 -2.1320833333333333e+01 4910 4561 2.1329166666666666e+01 4910 3913 -5.3302083333333332e+00 4910 3918 1.0683333333333334e+01 4910 4093 1.0416666666666667e-03 4910 4097 4.1666666666666657e-03 4910 4096 -6.2499999999999995e-03 4910 4989 -1.0666666666666666e+01 4910 4911 -1.0658333333333333e+01 4911 4911 5.3375000000000000e+01 4911 4184 -5.3312499999999998e+00 4911 4100 5.0116116045879435e-20 4911 4174 -2.1705219273391446e-19 4911 4917 -1.0656249999999998e+01 4911 4912 -1.0666666666666666e+01 4911 4179 -1.0657291666666666e+01 4911 4169 1.5998958333333333e+01 4911 4989 2.1331249999999997e+01 4911 4910 -1.0658333333333333e+01 4911 4093 -1.0657291666666666e+01 4911 4097 -5.3312499999999998e+00 4911 4096 1.5998958333333331e+01 4912 4912 5.3375000000000014e+01 4912 4093 -2.1684043449710089e-19 4912 4915 1.0658333333333331e+01 4912 4096 -6.2499999999999995e-03 4912 4909 -1.0666666666666664e+01 4912 4100 -5.3322916666666664e+00 4912 4179 -4.9904357809065860e-20 4912 4917 1.0666666666666666e+01 4912 4911 -1.0666666666666666e+01 4912 4249 1.0679166666666665e+01 4912 4247 -1.0662500000000000e+01 4912 4246 5.3343749999999996e+00 4912 4173 2.1158177161623045e-20 4912 4904 -3.2002083333333331e+01 4912 4900 2.1329166666666669e+01 4912 4174 -5.3322916666666664e+00 4912 4169 5.3322916666666664e+00 4913 4913 5.3374999999999993e+01 4913 4908 -1.0666666666666666e+01 4913 4097 -5.3312499999999998e+00 4913 4096 1.5998958333333331e+01 4913 5074 -2.1331249999999997e+01 4913 4910 -1.0658333333333333e+01 4913 3923 -5.3312499999999998e+00 4913 3930 1.5998958333333331e+01 4914 4914 4.2666666667333331e+01 4914 3801 1.0416666666666666e-11 4914 4243 1.0416666666666666e-11 4914 3809 1.0416666666666666e-11 4914 3812 -6.2499999999999991e-11 4914 3802 4.1666666666666665e-11 4914 4860 1.0666666666583334e+01 4914 4861 -1.0666666666666666e+01 4914 4176 1.0416666666666666e-11 4914 4916 -1.0666666666583334e+01 4914 4940 -1.0666666666666666e+01 4914 4179 1.0416666666666666e-11 4914 4174 -6.2499999999999991e-11 4914 4177 4.1666666666666665e-11 4914 4093 1.0416666666666666e-11 4914 4100 -6.2499999999999991e-11 4914 4094 4.1666666666666665e-11 4914 4917 -1.0666666666583334e+01 4914 4984 1.0666666666666666e+01 4914 4249 -6.2499999999999991e-11 4914 4250 4.1666666666666665e-11 4914 4915 -1.0666666666583334e+01 4914 4978 1.0666666666666666e+01 4915 4915 7.4691666666875008e+01 4915 4246 -5.3322916666666664e+00 4915 4912 1.0658333333333331e+01 4915 4909 -2.1329166666666666e+01 4915 4096 -5.3281250000000000e+00 4915 4100 2.1334374999989581e+01 4915 4094 -5.3333333333124999e+00 4915 4978 -2.1333333333312499e+01 4915 4914 -1.0666666666583334e+01 4915 4249 3.2001041666656249e+01 4915 4250 -5.3333333333124999e+00 4916 4916 6.4020833333541674e+01 4916 3802 -5.3333333333124999e+00 4916 4940 2.1333333333312499e+01 4916 4914 -1.0666666666583334e+01 4916 4177 -5.3333333333124999e+00 4916 4176 -1.0662499999958333e+01 4916 4174 2.1332291666656246e+01 4916 4173 -5.3312499999999998e+00 4916 4906 -2.1331249999999997e+01 4916 4904 1.0658333333333333e+01 4916 3801 -1.0662499999958333e+01 4916 3812 2.1332291666656246e+01 4916 3798 -5.3312499999999998e+00 4917 4917 5.3354166666874988e+01 4917 4096 2.1705219273391446e-19 4917 4169 -2.1705219273391446e-19 4917 4911 -1.0656249999999998e+01 4917 4912 1.0666666666666666e+01 4917 4179 -1.0661458333291666e+01 4917 4174 1.5999999999989583e+01 4917 4177 -5.3333333333124999e+00 4917 4984 -2.1333333333312499e+01 4917 4914 -1.0666666666583334e+01 4917 4093 -1.0661458333291666e+01 4917 4100 1.5999999999989583e+01 4917 4094 -5.3333333333124999e+00 4918 4918 4.2691666666666663e+01 4919 4919 3.2020833333333336e+01 4920 4920 2.1354166666666668e+01 4921 4921 4.2733333333333334e+01 4921 4231 -4.1666666666666666e-03 4921 4828 1.0666666666666666e+01 4921 4926 -1.0666666666666666e+01 4921 4274 -4.1666666666666666e-03 4921 3940 -4.1666666666666666e-03 4921 4928 -1.0666666666666666e+01 4921 3717 -4.1666666666666666e-03 4921 4922 -1.0666666666666666e+01 4922 4922 4.2691666666666663e+01 4922 4923 -1.0666666666666666e+01 4922 3940 1.0668750000000001e+01 4922 4921 -1.0666666666666666e+01 4922 3717 1.0668750000000001e+01 4923 4923 4.2733333333333334e+01 4923 3940 -4.1666666666666666e-03 4923 4922 -1.0666666666666666e+01 4923 4583 1.0666666666666666e+01 4923 3933 -4.1666666666666666e-03 4923 4265 -4.1666666666666666e-03 4923 4929 -1.0666666666666666e+01 4923 3717 -4.1666666666666666e-03 4923 4878 1.0666666666666666e+01 4924 4924 4.2733333333333334e+01 4924 3901 -1.0416666666666669e-03 4924 3872 -1.0416666666666669e-03 4924 3886 -1.0416666666666667e-03 4924 3906 6.2500000000000003e-03 4924 3907 -4.1666666666666666e-03 4924 4542 -1.0658333333333333e+01 4924 4543 1.0666666666666666e+01 4924 3927 -1.0416666666666669e-03 4924 3934 6.2500000000000003e-03 4924 3933 -4.1666666666666666e-03 4924 4936 1.0658333333333333e+01 4924 4929 -1.0666666666666666e+01 4924 3874 -1.0416666666666667e-03 4924 3881 6.2500000000000003e-03 4924 3880 -4.1666666666666666e-03 4924 4572 -1.0658333333333333e+01 4924 4571 1.0666666666666666e+01 4924 4259 -1.0416666666666667e-03 4924 4263 6.2500000000000003e-03 4924 4265 -4.1666666666666666e-03 4924 4873 -1.0658333333333333e+01 4924 4872 1.0666666666666666e+01 4925 4925 4.2733333333333334e+01 4925 4278 6.2500000000000003e-03 4925 4274 -4.1666666666666666e-03 4925 4932 -1.0658333333333333e+01 4925 4927 -1.0666666666666666e+01 4925 3886 -1.0416666666666669e-03 4925 4228 -1.0416666666666669e-03 4925 3898 -1.0416666666666667e-03 4925 3908 6.2500000000000003e-03 4925 3907 -4.1666666666666666e-03 4925 4867 -1.0658333333333333e+01 4925 4869 1.0666666666666666e+01 4925 3872 -1.0416666666666667e-03 4925 3882 6.2500000000000003e-03 4925 3880 -4.1666666666666666e-03 4925 4544 -1.0658333333333333e+01 4925 4543 1.0666666666666666e+01 4925 4230 6.2500000000000003e-03 4925 4231 -4.1666666666666666e-03 4925 4938 1.0658333333333333e+01 4925 4926 -1.0666666666666666e+01 4925 2769 -1.0416666666666669e-03 4925 2784 -1.0416666666666667e-03 4926 4926 4.2691666666666663e+01 4926 4278 -5.3322916666666664e+00 4926 4921 -1.0666666666666666e+01 4926 4274 1.0668750000000001e+01 4926 4938 -2.1331249999999997e+01 4926 4925 -1.0666666666666666e+01 4926 4230 -5.3322916666666664e+00 4926 4231 1.0668750000000001e+01 4927 4927 4.2691666666666663e+01 4927 3882 -5.3322916666666664e+00 4927 4932 2.1331249999999997e+01 4927 4925 -1.0666666666666666e+01 4927 4278 -5.3322916666666664e+00 4927 4275 -5.3322916666666664e+00 4927 4274 1.0668750000000001e+01 4927 4582 -2.1331249999999997e+01 4927 4580 1.0666666666666666e+01 4927 3875 -5.3322916666666664e+00 4927 3880 1.0668750000000001e+01 4927 2784 6.2500000000000003e-03 4927 2769 6.2500000000000003e-03 4928 4928 4.2691666666666663e+01 4928 4921 -1.0666666666666666e+01 4928 3938 -5.3322916666666664e+00 4928 3940 1.0668750000000001e+01 4928 4579 -2.1331249999999997e+01 4928 4580 1.0666666666666666e+01 4928 4275 -5.3322916666666664e+00 4928 4274 1.0668750000000001e+01 4929 4929 4.2691666666666663e+01 4929 4923 -1.0666666666666666e+01 4929 4263 -5.3322916666666664e+00 4929 4265 1.0668750000000001e+01 4929 4936 -2.1331249999999997e+01 4929 4924 -1.0666666666666666e+01 4929 3934 -5.3322916666666664e+00 4929 3933 1.0668750000000001e+01 4930 4930 3.2020833333333336e+01 4931 4931 3.2020833333333336e+01 4932 4932 6.4041666666666671e+01 4932 3880 5.3312499999999998e+00 4932 4927 2.1331249999999997e+01 4932 4925 -1.0658333333333333e+01 4932 4274 5.3312499999999998e+00 4932 4278 -2.1331249999999997e+01 4932 4528 -1.0658333333333333e+01 4932 3882 -2.1331249999999997e+01 4932 2784 1.0658333333333333e+01 4932 2790 5.3312499999999998e+00 4932 3352 2.1331249999999997e+01 4932 2769 1.0658333333333333e+01 4932 2774 5.3312499999999998e+00 4933 4933 3.2020833333333336e+01 4934 4934 3.2020833333333336e+01 4935 4935 3.2020833333333336e+01 4936 4936 6.4041666666666671e+01 4936 3931 -5.3312499999999998e+00 4936 4265 -5.3312499999999998e+00 4936 4929 -2.1331249999999997e+01 4936 4924 1.0658333333333333e+01 4936 3934 2.1331249999999997e+01 4936 3933 -5.3312499999999998e+00 4936 4903 -2.1331249999999997e+01 4936 4902 1.0658333333333333e+01 4936 4263 2.1331249999999997e+01 4936 4262 -5.3312499999999998e+00 4937 4937 3.2020833333333336e+01 4938 4938 6.4041666666666671e+01 4938 4274 -5.3312499999999998e+00 4938 4229 -5.3312499999999998e+00 4938 4533 -2.1331249999999997e+01 4938 4528 1.0658333333333333e+01 4938 4278 2.1331249999999997e+01 4938 4926 -2.1331249999999997e+01 4938 4925 1.0658333333333333e+01 4938 4230 2.1331249999999997e+01 4938 4231 -5.3312499999999998e+00 4938 2790 -5.3312499999999998e+00 4939 4939 3.2020833333333336e+01 4940 4940 4.2666666666916662e+01 4940 4183 5.3333333333229165e+00 4940 3812 5.3333333333229165e+00 4940 4176 -6.2500000000000004e-11 4940 4916 2.1333333333312499e+01 4940 4914 -1.0666666666666666e+01 4940 4174 5.3333333333229165e+00 4940 4177 -1.0666666666687499e+01 4940 3801 -6.2499999999999991e-11 4940 4941 -2.1333333333312499e+01 4940 4981 1.0666666666666666e+01 4940 3803 5.3333333333229165e+00 4940 3802 -1.0666666666687499e+01 4941 4941 6.4000000000416662e+01 4941 4177 5.3333333333124999e+00 4941 3804 5.3333333333124999e+00 4941 4943 -2.1333333333312499e+01 4941 5002 -1.0666666666583334e+01 4941 4176 1.0666666666583334e+01 4941 4183 -2.1333333333312499e+01 4941 4940 -2.1333333333312499e+01 4941 4981 -1.0666666666583334e+01 4941 3801 1.0666666666583334e+01 4941 3803 -2.1333333333312499e+01 4941 3802 5.3333333333124999e+00 4941 3001 5.3333333333124999e+00 4942 4942 6.4020833333541674e+01 4942 4943 -2.1333333333312499e+01 4942 3804 5.3333333333124999e+00 4942 3801 1.0662499999958333e+01 4942 3813 -2.1332291666656246e+01 4942 3800 5.3312499999999998e+00 4942 4896 2.1331249999999997e+01 4942 4176 1.0662499999958333e+01 4942 3001 5.3333333333124999e+00 4942 3661 -1.0666666666583334e+01 4942 3623 -1.0658333333333333e+01 4942 2998 -2.1332291666656246e+01 4942 2994 5.3312499999999998e+00 4943 4943 4.2666666666916662e+01 4943 4942 -2.1333333333312499e+01 4943 3813 5.3333333333229165e+00 4943 3801 -6.2500000000000004e-11 4943 3803 5.3333333333229165e+00 4943 3804 -1.0666666666687499e+01 4943 4176 -6.2499999999999991e-11 4943 4941 -2.1333333333312499e+01 4943 5002 1.0666666666666666e+01 4943 4183 5.3333333333229165e+00 4943 2998 5.3333333333229165e+00 4943 3661 1.0666666666666666e+01 4943 3001 -1.0666666666687499e+01 4944 4944 6.4058333333333323e+01 4944 4288 -5.3281250000000000e+00 4944 4960 -3.2002083333333331e+01 4944 4946 -2.1320833333333333e+01 4944 4285 -5.3322916666666664e+00 4944 4287 5.3291666666666666e+00 4944 4290 -4.1666666666666666e-03 4944 4954 -1.0666666666666666e+01 4944 4280 1.5995833333333334e+01 4944 4945 -1.0666666666666666e+01 4945 4945 4.2691666666666663e+01 4945 4948 -1.0666666666666666e+01 4945 4290 1.0668750000000001e+01 4945 4944 -1.0666666666666666e+01 4945 4280 1.0668750000000001e+01 4946 4946 6.4091666666666669e+01 4946 4018 -1.0416666666666669e-03 4946 3962 -1.0416666666666667e-03 4946 3964 6.2500000000000003e-03 4946 3963 -4.1666666666666666e-03 4946 4654 1.0658333333333333e+01 4946 4653 1.0666666666666666e+01 4946 4285 2.0833333333333342e-03 4946 4960 2.1329166666666666e+01 4946 4944 -2.1320833333333333e+01 4946 4280 -1.0683333333333334e+01 4946 4021 1.0416666666666666e-02 4946 4962 2.1329166666666669e+01 4946 4955 -2.1320833333333333e+01 4946 4020 5.3291666666666666e+00 4946 4288 1.0416666666666666e-02 4946 4287 5.3291666666666666e+00 4946 4958 1.0658333333333333e+01 4946 4947 -1.0666666666666666e+01 4946 1648 -1.0416666666666669e-03 4946 1251 -1.0416666666666667e-03 4947 4947 4.2691666666666663e+01 4947 3964 -5.3322916666666664e+00 4947 4950 -1.0666666666666666e+01 4947 3963 1.0668750000000001e+01 4947 4958 -2.1331249999999997e+01 4947 4946 -1.0666666666666666e+01 4947 4288 -5.3322916666666664e+00 4947 4287 1.0668750000000001e+01 4947 2844 -5.3322916666666664e+00 4947 1648 6.2500000000000003e-03 4947 3395 -2.1331249999999997e+01 4947 2827 -5.3322916666666664e+00 4947 1251 6.2500000000000003e-03 4948 4948 4.2733333333333334e+01 4948 4290 -4.1666666666666666e-03 4948 4945 -1.0666666666666666e+01 4948 4951 -1.0666666666666666e+01 4948 3994 -4.1666666666666666e-03 4948 4297 -4.1666666666666666e-03 4948 4956 -1.0666666666666666e+01 4948 4280 -4.1666666666666666e-03 4948 4949 -1.0666666666666666e+01 4949 4949 4.2691666666666663e+01 4949 4955 -1.0666666666666666e+01 4949 4297 1.0668750000000001e+01 4949 4948 -1.0666666666666666e+01 4949 4280 1.0668750000000001e+01 4950 4950 4.2733333333333334e+01 4950 3994 -4.1666666666666666e-03 4950 4640 1.0666666666666666e+01 4950 4287 -4.1666666666666666e-03 4950 4954 -1.0666666666666666e+01 4950 3963 -4.1666666666666666e-03 4950 4947 -1.0666666666666666e+01 4950 4290 -4.1666666666666666e-03 4950 4951 -1.0666666666666666e+01 4950 2831 -1.0416666666666669e-03 4950 3014 -1.0416666666666667e-03 4950 3018 6.2500000000000003e-03 4950 3686 1.0658333333333333e+01 4950 1251 -1.0416666666666669e-03 4950 2844 6.2500000000000003e-03 4950 3685 1.0658333333333333e+01 4950 1648 -1.0416666666666667e-03 4950 2827 6.2500000000000003e-03 4950 3395 1.0658333333333333e+01 4950 3005 6.2500000000000003e-03 4950 3687 1.0658333333333333e+01 4951 4951 4.2691666666666663e+01 4951 4948 -1.0666666666666666e+01 4951 3994 1.0668750000000001e+01 4951 4950 -1.0666666666666666e+01 4951 4290 1.0668750000000001e+01 4951 3018 -5.3322916666666664e+00 4951 3687 -2.1331249999999997e+01 4951 3005 -5.3322916666666664e+00 4952 4952 4.2733333333333334e+01 4952 3962 -1.0416666666666669e-03 4952 4018 -1.0416666666666667e-03 4952 4024 6.2500000000000003e-03 4952 4020 -4.1666666666666666e-03 4952 4655 -1.0658333333333333e+01 4952 4653 1.0666666666666666e+01 4952 3995 6.2500000000000003e-03 4952 3994 -4.1666666666666666e-03 4952 4971 1.0658333333333333e+01 4952 4956 -1.0666666666666666e+01 4952 3965 6.2500000000000003e-03 4952 3963 -4.1666666666666666e-03 4952 4641 -1.0658333333333333e+01 4952 4640 1.0666666666666666e+01 4952 4295 6.2500000000000003e-03 4952 4297 -4.1666666666666666e-03 4952 4972 1.0658333333333333e+01 4952 4953 -1.0666666666666666e+01 4952 3014 -1.0416666666666669e-03 4952 2831 -1.0416666666666667e-03 4953 4953 4.2691666666666663e+01 4953 4024 -5.3322916666666664e+00 4953 4955 -1.0666666666666666e+01 4953 4020 1.0668750000000001e+01 4953 4972 -2.1331249999999997e+01 4953 4952 -1.0666666666666666e+01 4953 4295 -5.3322916666666664e+00 4953 4297 1.0668750000000001e+01 4954 4954 4.2691666666666663e+01 4954 4944 -1.0666666666666666e+01 4954 4290 1.0668750000000001e+01 4954 4950 -1.0666666666666666e+01 4954 4287 1.0668750000000001e+01 4954 3005 -5.3322916666666664e+00 4954 3685 -2.1331249999999997e+01 4954 2844 -5.3322916666666664e+00 4955 4955 6.4058333333333337e+01 4955 4297 -4.1666666666666666e-03 4955 4949 -1.0666666666666666e+01 4955 4953 -1.0666666666666666e+01 4955 4285 -5.3322916666666664e+00 4955 4280 1.5995833333333334e+01 4955 4962 -3.2002083333333331e+01 4955 4946 -2.1320833333333333e+01 4955 4021 -5.3281250000000000e+00 4955 4020 5.3291666666666666e+00 4956 4956 4.2691666666666663e+01 4956 4948 -1.0666666666666666e+01 4956 4295 -5.3322916666666664e+00 4956 4297 1.0668750000000001e+01 4956 4971 -2.1331249999999997e+01 4956 4952 -1.0666666666666666e+01 4956 3995 -5.3322916666666664e+00 4956 3994 1.0668750000000001e+01 4957 4957 3.2020833333333336e+01 4958 4958 7.4712500000000006e+01 4958 4288 3.1999999999999996e+01 4958 3964 2.1333333333333332e+01 4958 3963 -5.3312499999999998e+00 4958 4947 -2.1331249999999997e+01 4958 4946 1.0658333333333333e+01 4958 4287 -5.3312499999999998e+00 4958 1251 -2.1326041666666665e+01 4958 1250 -5.3322916666666664e+00 4958 1793 -1.0658333333333331e+01 4958 2137 -2.1329166666666666e+01 4958 1648 -1.0653124999999999e+01 4958 1647 -5.3281250000000000e+00 4959 4959 3.2020833333333336e+01 4960 4960 5.3375000000000000e+01 4960 4285 5.3343749999999996e+00 4960 4288 5.3322916666666664e+00 4960 4287 -2.7052114752934217e-20 4960 4944 -3.2002083333333331e+01 4960 4946 2.1329166666666666e+01 4960 4280 -1.0662500000000000e+01 4960 1259 -6.2499999999999986e-03 4960 1794 -1.0666666666666664e+01 4960 1788 -1.0666666666666666e+01 4961 4961 3.2020833333333336e+01 4962 4962 5.3375000000000000e+01 4962 4021 5.3322916666666664e+00 4962 4285 5.3343749999999996e+00 4962 4280 -1.0662500000000000e+01 4962 4020 -2.0761130467597592e-20 4962 4955 -3.2002083333333331e+01 4962 4946 2.1329166666666669e+01 4962 1259 -6.2499999999999986e-03 4962 1792 -1.0666666666666666e+01 4962 1794 -1.0666666666666668e+01 4963 4963 3.2020833333333336e+01 4964 4964 3.2020833333333336e+01 4965 4965 4.2691666666666663e+01 4965 4009 -5.3322916666666664e+00 4965 4001 1.0668750000000001e+01 4965 4524 -2.1331249999999997e+01 4965 4523 1.0666666666666666e+01 4965 3832 -5.3322916666666664e+00 4965 3691 -1.0666666666666666e+01 4965 2913 1.0668750000000001e+01 4966 4966 4.2691666666666663e+01 4966 3841 -5.3322916666666664e+00 4966 4525 -2.1331249999999997e+01 4966 4523 1.0666666666666666e+01 4966 4009 -5.3322916666666664e+00 4966 4000 6.2500000000000003e-03 4966 3999 -5.3322916666666664e+00 4966 4001 1.0668750000000001e+01 4966 3855 6.2500000000000003e-03 4966 4633 -2.1331249999999997e+01 4966 4634 1.0666666666666666e+01 4966 3854 -5.3322916666666664e+00 4966 3853 1.0668750000000001e+01 4967 4967 6.4000000000416662e+01 4967 3837 5.3333333333124999e+00 4967 4003 5.3333333333124999e+00 4967 4748 2.1333333333312499e+01 4967 4738 -1.0666666666583334e+01 4967 3855 1.0666666666583334e+01 4967 3862 -2.1333333333312499e+01 4967 3861 5.3333333333124999e+00 4967 4501 2.1333333333312499e+01 4967 4500 -1.0666666666583334e+01 4967 4000 1.0666666666583334e+01 4967 4004 -2.1333333333312499e+01 4967 4006 5.3333333333124999e+00 4968 4968 6.4020833333541674e+01 4968 3861 5.3333333333124999e+00 4968 4748 2.1333333333312499e+01 4968 4742 -1.0666666666583334e+01 4968 4003 5.3333333333124999e+00 4968 4000 1.0662499999958333e+01 4968 4011 -2.1332291666656246e+01 4968 3998 5.3312499999999998e+00 4968 4621 2.1331249999999997e+01 4968 4618 -1.0658333333333333e+01 4968 3855 1.0662499999958333e+01 4968 3859 -2.1332291666656246e+01 4968 3856 5.3312499999999998e+00 4969 4969 3.2020833333333336e+01 4970 4970 6.4020833333541674e+01 4970 4032 5.3333333333124999e+00 4970 4744 2.1333333333312499e+01 4970 4742 -1.0666666666583334e+01 4970 3861 5.3333333333124999e+00 4970 3858 1.0662499999958333e+01 4970 3859 -2.1332291666656246e+01 4970 3856 5.3312499999999998e+00 4970 4630 2.1331249999999997e+01 4970 4618 -1.0658333333333333e+01 4970 4029 1.0662499999958333e+01 4970 4040 -2.1332291666656246e+01 4970 4030 5.3312499999999998e+00 4971 4971 6.4041666666666671e+01 4971 3990 -5.3312499999999998e+00 4971 4297 -5.3312499999999998e+00 4971 4956 -2.1331249999999997e+01 4971 4952 1.0658333333333333e+01 4971 3995 2.1331249999999997e+01 4971 3994 -5.3312499999999998e+00 4971 4623 -2.1331249999999997e+01 4971 4622 1.0658333333333333e+01 4971 4295 2.1331249999999997e+01 4971 4294 -5.3312499999999998e+00 4972 4972 6.4041666666666671e+01 4972 4020 -5.3312499999999998e+00 4972 4294 -5.3312499999999998e+00 4972 4632 -2.1331249999999997e+01 4972 4622 1.0658333333333333e+01 4972 4024 2.1331249999999997e+01 4972 4023 -5.3312499999999998e+00 4972 4953 -2.1331249999999997e+01 4972 4952 1.0658333333333333e+01 4972 4295 2.1331249999999997e+01 4972 4297 -5.3312499999999998e+00 4973 4973 3.2020833333333336e+01 4974 4974 3.2020833333333336e+01 4975 4975 3.2020833333333336e+01 4976 4976 3.2020833333333336e+01 4977 4977 3.2020833333333336e+01 4978 4978 4.2666666666916662e+01 4978 4979 -1.0666666666666666e+01 4978 4100 -5.3333333333229165e+00 4978 4094 1.0666666666687499e+01 4978 4915 -2.1333333333312499e+01 4978 4914 1.0666666666666666e+01 4978 4249 -5.3333333333229165e+00 4978 4250 1.0666666666687499e+01 4979 4979 4.2666666667333331e+01 4979 4094 -4.1666666666666665e-11 4979 4978 -1.0666666666666666e+01 4979 4682 1.0666666666666666e+01 4979 4083 -4.1666666666666665e-11 4979 4308 -4.1666666666666665e-11 4979 4986 -1.0666666666666666e+01 4979 4250 -4.1666666666666665e-11 4979 4980 -1.0666666666666666e+01 4980 4980 4.2666666666916662e+01 4980 4254 -5.3333333333229165e+00 4980 4250 1.0666666666687499e+01 4980 4982 -1.0666666666666666e+01 4980 4308 1.0666666666687499e+01 4980 4979 -1.0666666666666666e+01 4980 2323 -2.1333333333312499e+01 4980 1530 -5.3333333333229165e+00 4981 4981 4.2666666667333331e+01 4981 4316 -1.0416666666666666e-11 4981 3805 -1.0416666666666666e-11 4981 4315 -1.0416666666666666e-11 4981 4314 6.2499999999999991e-11 4981 4313 -4.1666666666666665e-11 4981 5006 1.0666666666583334e+01 4981 4988 -1.0666666666666666e+01 4981 4068 -1.0416666666666666e-11 4981 5007 1.0666666666583334e+01 4981 4987 -1.0666666666666666e+01 4981 4176 -1.0416666666666666e-11 4981 4067 6.2499999999999991e-11 4981 4064 -4.1666666666666665e-11 4981 4183 6.2499999999999991e-11 4981 4177 -4.1666666666666665e-11 4981 4992 -1.0666666666583334e+01 4981 4983 -1.0666666666666666e+01 4981 3801 -1.0416666666666666e-11 4981 3803 6.2499999999999991e-11 4981 3802 -4.1666666666666665e-11 4981 4941 -1.0666666666583334e+01 4981 4940 1.0666666666666666e+01 4981 3022 -1.0416666666666666e-11 4981 3003 -1.0416666666666666e-11 4982 4982 4.2666666667333324e+01 4982 4254 6.2499999999999991e-11 4982 4250 -4.1666666666666665e-11 4982 4308 -4.1666666666666665e-11 4982 4980 -1.0666666666666666e+01 4982 4317 6.2499999999999991e-11 4982 4313 -4.1666666666666665e-11 4982 3809 -1.0416666666666666e-11 4982 4315 -1.0416666666666666e-11 4982 3805 -1.0416666666666666e-11 4982 3814 6.2499999999999991e-11 4982 3802 -4.1666666666666665e-11 4982 5008 1.0666666666583334e+01 4982 4988 -1.0666666666666666e+01 4982 4243 -1.0416666666666666e-11 4982 4862 1.0666666666583334e+01 4982 4861 1.0666666666666666e+01 4982 1525 -1.0416666666666666e-11 4982 1530 6.2499999999999991e-11 4982 2323 1.0666666666583334e+01 4982 1213 -1.0416666666666666e-11 4982 1990 -1.0666666666583334e+01 4982 1989 1.0666666666666666e+01 4983 4983 4.2666666666916662e+01 4983 4067 -5.3333333333229165e+00 4983 4992 2.1333333333312499e+01 4983 4981 -1.0666666666666666e+01 4983 4183 -5.3333333333229165e+00 4983 4178 -5.3333333333229165e+00 4983 4177 1.0666666666687499e+01 4983 4681 -2.1333333333312499e+01 4983 4678 1.0666666666666666e+01 4983 4058 -5.3333333333229165e+00 4983 4064 1.0666666666687499e+01 4983 3003 6.2500000000000004e-11 4983 3022 6.2500000000000004e-11 4984 4984 4.2666666666916662e+01 4984 4174 -5.3333333333229165e+00 4984 4917 -2.1333333333312499e+01 4984 4914 1.0666666666666666e+01 4984 4100 -5.3333333333229165e+00 4984 4093 6.2499999999999991e-11 4984 4092 -5.3333333333229165e+00 4984 4094 1.0666666666687499e+01 4984 4179 6.2499999999999991e-11 4984 4677 -2.1333333333312499e+01 4984 4678 1.0666666666666666e+01 4984 4178 -5.3333333333229165e+00 4984 4177 1.0666666666687499e+01 4985 4985 4.2666666667333324e+01 4985 4068 -1.0416666666666666e-11 4985 4066 6.2499999999999991e-11 4985 4064 -4.1666666666666665e-11 4985 4316 -1.0416666666666666e-11 4985 4313 -4.1666666666666665e-11 4985 4987 -1.0666666666666666e+01 4985 4306 6.2499999999999991e-11 4985 4308 -4.1666666666666665e-11 4985 4077 -1.0416666666666666e-11 4985 4084 6.2499999999999991e-11 4985 4083 -4.1666666666666665e-11 4985 4999 1.0666666666583334e+01 4985 4986 -1.0666666666666666e+01 4985 4059 -1.0416666666666666e-11 4985 4688 -1.0666666666583334e+01 4985 4687 1.0666666666666666e+01 4985 1213 -1.0416666666666666e-11 4985 1218 6.2499999999999991e-11 4985 1986 1.0666666666583334e+01 4985 1525 -1.0416666666666666e-11 4985 1985 1.0666666666583334e+01 4985 1989 1.0666666666666666e+01 4986 4986 4.2666666666916662e+01 4986 4979 -1.0666666666666666e+01 4986 4306 -5.3333333333229165e+00 4986 4308 1.0666666666687499e+01 4986 4999 -2.1333333333312499e+01 4986 4985 -1.0666666666666666e+01 4986 4084 -5.3333333333229165e+00 4986 4083 1.0666666666687499e+01 4987 4987 4.2666666666916662e+01 4987 4068 6.2499999999999991e-11 4987 4066 -5.3333333333229165e+00 4987 4064 1.0666666666687499e+01 4987 4316 6.2500000000000004e-11 4987 4985 -1.0666666666666666e+01 4987 4313 1.0666666666687499e+01 4987 4314 -5.3333333333229165e+00 4987 5007 -2.1333333333312499e+01 4987 4981 -1.0666666666666666e+01 4987 4067 -5.3333333333229165e+00 4987 1986 -2.1333333333312499e+01 4987 1218 -5.3333333333229165e+00 4988 4988 4.2666666666916662e+01 4988 4317 -5.3333333333229165e+00 4988 5008 -2.1333333333312499e+01 4988 4982 -1.0666666666666666e+01 4988 3814 -5.3333333333229165e+00 4988 3805 6.2500000000000004e-11 4988 3803 -5.3333333333229165e+00 4988 3802 1.0666666666687499e+01 4988 4315 6.2500000000000004e-11 4988 5006 -2.1333333333312499e+01 4988 4981 -1.0666666666666666e+01 4988 4314 -5.3333333333229165e+00 4988 4313 1.0666666666687499e+01 4989 4989 4.2691666666666663e+01 4989 4169 5.3322916666666664e+00 4989 4179 -6.2499999999999995e-03 4989 4171 5.3322916666666664e+00 4989 4184 -1.0668750000000001e+01 4989 4990 -2.1331249999999997e+01 4989 4996 -1.0666666666666666e+01 4989 4102 5.3322916666666664e+00 4989 4093 -6.2499999999999995e-03 4989 4911 2.1331249999999997e+01 4989 4910 -1.0666666666666666e+01 4989 4097 -1.0668750000000001e+01 4989 4096 5.3322916666666664e+00 4990 4990 6.4020833333541660e+01 4990 4184 5.3312499999999998e+00 4990 4989 -2.1331249999999997e+01 4990 4996 1.0658333333333333e+01 4990 4097 5.3312499999999998e+00 4990 4093 1.0662499999958333e+01 4990 4102 -2.1332291666656250e+01 4990 4091 5.3333333333124999e+00 4990 4664 2.1333333333312499e+01 4990 4661 -1.0666666666583334e+01 4990 4179 1.0662499999958333e+01 4990 4171 -2.1332291666656250e+01 4990 4180 5.3333333333124999e+00 4991 4991 6.4000000000416662e+01 4991 4767 2.1333333333312499e+01 4991 4761 -1.0666666666583334e+01 4991 4182 5.3333333333124999e+00 4991 4181 -2.1333333333312499e+01 4991 4180 5.3333333333124999e+00 4991 4673 2.1333333333312499e+01 4991 4667 -1.0666666666583334e+01 4991 4065 -2.1333333333312499e+01 4991 4057 5.3333333333124999e+00 4991 3021 5.3333333333124999e+00 4991 3003 1.0666666666583334e+01 4991 3022 1.0666666666583334e+01 4992 4992 6.4000000000416662e+01 4992 4064 5.3333333333124999e+00 4992 4983 2.1333333333312499e+01 4992 4981 -1.0666666666583334e+01 4992 4177 5.3333333333124999e+00 4992 4183 -2.1333333333312499e+01 4992 5002 -1.0666666666583334e+01 4992 4067 -2.1333333333312499e+01 4992 3003 1.0666666666583334e+01 4992 3001 5.3333333333124999e+00 4992 3700 2.1333333333312499e+01 4992 3022 1.0666666666583334e+01 4992 442 5.3333333333124999e+00 4993 4993 3.2000000000208331e+01 4994 4994 6.4000000000416662e+01 4994 4162 -5.3333333333124999e+00 4994 4185 -5.3333333333124999e+00 4994 4769 -2.1333333333312499e+01 4994 4761 1.0666666666583334e+01 4994 4160 2.1333333333312499e+01 4994 4158 -5.3333333333124999e+00 4994 4668 -2.1333333333312499e+01 4994 4667 1.0666666666583334e+01 4994 4186 2.1333333333312499e+01 4994 4188 -5.3333333333124999e+00 4995 4995 7.4691666666875008e+01 4995 4056 -5.3322916666666664e+00 4995 4789 1.0658333333333331e+01 4995 4793 -2.1329166666666666e+01 4995 4191 -5.3281250000000000e+00 4995 4195 2.1334374999989581e+01 4995 4188 -5.3333333333124999e+00 4995 4662 -2.1333333333312499e+01 4995 4661 1.0666666666583334e+01 4995 4047 3.2001041666656249e+01 4995 4044 -5.3333333333124999e+00 4996 4996 6.4058333333333323e+01 4996 4170 5.3281250000000000e+00 4996 4789 3.2002083333333331e+01 4996 4787 -2.1320833333333333e+01 4996 4056 5.3322916666666664e+00 4996 4179 1.0416666666666669e-03 4996 4171 -1.0416666666666666e-02 4996 4184 -5.3291666666666666e+00 4996 4093 1.0416666666666667e-03 4996 4102 -6.2500000000000003e-03 4996 4097 4.1666666666666666e-03 4996 4990 1.0658333333333333e+01 4996 4989 -1.0666666666666666e+01 4996 4047 1.0662499999999998e+01 4996 4055 -1.5995833333333334e+01 4996 4694 1.0658333333333333e+01 4996 4695 -1.0666666666666666e+01 4997 4997 3.2000000000208331e+01 4998 4998 4.2691666666666663e+01 4999 4999 6.4000000000416662e+01 4999 4079 -5.3333333333124999e+00 4999 4308 -5.3333333333124999e+00 4999 4986 -2.1333333333312499e+01 4999 4985 1.0666666666583334e+01 4999 4084 2.1333333333312499e+01 4999 4083 -5.3333333333124999e+00 4999 4700 -2.1333333333312499e+01 4999 4699 1.0666666666583334e+01 4999 4306 2.1333333333312499e+01 4999 4305 -5.3333333333124999e+00 5000 5000 3.2000000000208331e+01 5001 5001 3.2000000000208331e+01 5002 5002 4.2666666667333331e+01 5002 4315 -1.0416666666666666e-11 5002 4068 -1.0416666666666666e-11 5002 4316 -1.0416666666666666e-11 5002 4314 6.2499999999999991e-11 5002 4318 -4.1666666666666665e-11 5002 5007 1.0666666666583334e+01 5002 5005 -1.0666666666666666e+01 5002 3801 -1.0416666666666666e-11 5002 4176 -1.0416666666666666e-11 5002 4183 6.2499999999999991e-11 5002 4941 -1.0666666666583334e+01 5002 4943 1.0666666666666666e+01 5002 4067 6.2499999999999991e-11 5002 4992 -1.0666666666583334e+01 5002 3805 -1.0416666666666666e-11 5002 3803 6.2499999999999991e-11 5002 3804 -4.1666666666666665e-11 5002 5006 1.0666666666583334e+01 5002 5003 -1.0666666666666666e+01 5002 3003 -1.0416666666666666e-11 5002 3001 -4.1666666666666665e-11 5002 3022 -1.0416666666666666e-11 5002 442 -4.1666666666666665e-11 5002 3700 -1.0666666666666666e+01 5003 5003 4.2666666666916662e+01 5003 4314 -5.3333333333229165e+00 5003 3815 -5.3333333333229165e+00 5003 4315 6.2500000000000004e-11 5003 5009 2.1333333333312499e+01 5003 5004 -1.0666666666666666e+01 5003 4319 -5.3333333333229165e+00 5003 4318 1.0666666666687499e+01 5003 3805 6.2500000000000004e-11 5003 5006 -2.1333333333312499e+01 5003 5002 -1.0666666666666666e+01 5003 3803 -5.3333333333229165e+00 5003 3804 1.0666666666687499e+01 5004 5004 4.2666666667333324e+01 5004 4319 6.2499999999999991e-11 5004 4318 -4.1666666666666665e-11 5004 3781 6.2499999999999991e-11 5004 3805 -1.0416666666666666e-11 5004 3777 -1.0416666666666666e-11 5004 3807 -1.0416666666666666e-11 5004 3815 6.2499999999999991e-11 5004 3804 -4.1666666666666665e-11 5004 4467 -1.0666666666583334e+01 5004 4465 1.0666666666666666e+01 5004 4315 -1.0416666666666666e-11 5004 5009 -1.0666666666583334e+01 5004 5003 -1.0666666666666666e+01 5004 1619 -1.0416666666666666e-11 5004 1223 -1.0416666666666666e-11 5004 1612 -1.0416666666666666e-11 5004 1618 6.2499999999999991e-11 5004 228 -4.1666666666666665e-11 5004 1786 1.0666666666583334e+01 5004 1075 -1.0666666666666666e+01 5004 1208 -1.0416666666666666e-11 5004 290 -4.1666666666666665e-11 5004 1787 1.0666666666583334e+01 5004 947 1.0666666666666666e+01 5005 5005 4.2666666666916662e+01 5005 4316 6.2499999999999991e-11 5005 4318 1.0666666666687499e+01 5005 4068 6.2500000000000004e-11 5005 4067 -5.3333333333229165e+00 5005 5007 -2.1333333333312499e+01 5005 5002 -1.0666666666666666e+01 5005 4314 -5.3333333333229165e+00 5005 1228 -5.3333333333229165e+00 5005 1993 -2.1333333333312499e+01 5005 816 1.0666666666666666e+01 5005 1524 -5.3333333333229165e+00 5005 442 1.0666666666687499e+01 5006 5006 6.4000000000416662e+01 5006 4318 -5.3333333333124999e+00 5006 3802 -5.3333333333124999e+00 5006 4988 -2.1333333333312499e+01 5006 4981 1.0666666666583334e+01 5006 4315 -1.0666666666583334e+01 5006 4314 2.1333333333312499e+01 5006 4313 -5.3333333333124999e+00 5006 5003 -2.1333333333312499e+01 5006 5002 1.0666666666583334e+01 5006 3805 -1.0666666666583334e+01 5006 3803 2.1333333333312499e+01 5006 3804 -5.3333333333124999e+00 5007 5007 6.4000000000416662e+01 5007 5005 -2.1333333333312499e+01 5007 5002 1.0666666666583334e+01 5007 4318 -5.3333333333124999e+00 5007 4316 -1.0666666666583334e+01 5007 4314 2.1333333333312499e+01 5007 4313 -5.3333333333124999e+00 5007 4987 -2.1333333333312499e+01 5007 4981 1.0666666666583334e+01 5007 4068 -1.0666666666583334e+01 5007 4067 2.1333333333312499e+01 5007 4064 -5.3333333333124999e+00 5007 442 -5.3333333333124999e+00 5008 5008 5.3333333333749998e+01 5008 3816 -2.2851328271989659e-27 5008 3805 -1.0666666666572915e+01 5008 3814 1.5999999999989583e+01 5008 4320 -1.8812360437258079e-27 5008 5010 -1.0666666666562499e+01 5008 4315 -1.0666666666572915e+01 5008 4317 1.5999999999989583e+01 5008 4313 -5.3333333333124999e+00 5008 4988 -2.1333333333312499e+01 5008 4982 1.0666666666583334e+01 5008 3802 -5.3333333333124999e+00 5008 1769 1.0666666666666666e+01 5009 5009 5.3333333333749991e+01 5009 4320 -1.8812360437258079e-27 5009 3816 3.6295685768920020e-28 5009 5010 1.0666666666562499e+01 5009 5011 -1.0666666666666666e+01 5009 3805 1.0666666666572917e+01 5009 3815 -1.5999999999989583e+01 5009 3804 5.3333333333124999e+00 5009 5003 2.1333333333312499e+01 5009 5004 -1.0666666666583334e+01 5009 4315 1.0666666666572917e+01 5009 4319 -1.5999999999989583e+01 5009 4318 5.3333333333124999e+00 5010 5010 4.2666666667083334e+01 5010 3814 -1.8812360437258079e-27 5010 3805 -1.0666666666562499e+01 5010 3816 1.0666666666666666e+01 5010 4317 -2.2851328271989659e-27 5010 5008 -1.0666666666562499e+01 5010 4315 -1.0666666666562499e+01 5010 4320 1.0666666666666666e+01 5010 4319 -3.6295685768920020e-28 5010 3815 1.8812360437258079e-27 5010 5009 1.0666666666562499e+01 5010 5011 -1.0666666666666666e+01 5010 1769 -1.0666666666666666e+01 5011 5011 5.3333333333749991e+01 5011 3781 1.0666666666791667e+01 5011 3782 5.3333333333437496e+00 5011 4319 -5.3333333333229165e+00 5011 4320 5.3333333333229165e+00 5011 3807 5.3333333332812494e+00 5011 4315 -2.0194839173657902e-27 5011 3805 2.0194839173657902e-27 5011 3816 -6.2499999999999991e-11 5011 3815 -5.3333333333229165e+00 5011 5010 -1.0666666666666666e+01 5011 5009 -1.0666666666666666e+01 5011 4467 -1.0666666666583334e+01 5011 4468 1.0666666666666666e+01 5011 3777 -5.3333333333020834e+00 5011 1206 -1.0666666666625000e+01 5011 1210 -2.8113590706237963e-30 5011 1758 -3.2000000000020833e+01 5011 1757 2.1333333333291666e+01 5012 5012 3.2000000000208331e+01 5013 5013 4.2666666667333331e+01 5013 4077 1.0416666666666666e-11 5013 4088 -6.2499999999999991e-11 5013 4087 4.1666666666666665e-11 5013 5015 -1.0666666666583334e+01 5013 5026 1.0666666666666666e+01 5013 4059 1.0416666666666666e-11 5013 4690 1.0666666666583334e+01 5013 4689 -1.0666666666666666e+01 5013 4063 1.0416666666666666e-11 5013 4069 -6.2499999999999991e-11 5013 4070 4.1666666666666665e-11 5013 4159 1.0416666666666666e-11 5013 4163 -6.2499999999999991e-11 5013 4166 4.1666666666666665e-11 5013 4777 1.0666666666583334e+01 5013 4778 -1.0666666666666666e+01 5013 4322 -6.2499999999999991e-11 5013 4321 4.1666666666666665e-11 5013 5014 -1.0666666666583334e+01 5013 5016 -1.0666666666666666e+01 5014 5014 6.4000000000416662e+01 5014 4166 -5.3333333333124999e+00 5014 4324 -5.3333333333124999e+00 5014 4676 -2.1333333333312499e+01 5014 4669 1.0666666666583334e+01 5014 4163 2.1333333333312499e+01 5014 4162 -5.3333333333124999e+00 5014 5016 2.1333333333312499e+01 5014 5013 -1.0666666666583334e+01 5014 4322 2.1333333333312499e+01 5014 4321 -5.3333333333124999e+00 5015 5015 6.4000000000416662e+01 5015 4074 -5.3333333333124999e+00 5015 4321 -5.3333333333124999e+00 5015 5026 -2.1333333333312499e+01 5015 5013 -1.0666666666583334e+01 5015 4088 2.1333333333312499e+01 5015 4087 -5.3333333333124999e+00 5015 4670 -2.1333333333312499e+01 5015 4669 1.0666666666583334e+01 5015 4322 2.1333333333312499e+01 5015 4324 -5.3333333333124999e+00 5016 5016 4.2666666666916662e+01 5016 4163 5.3333333333229165e+00 5016 5025 1.0666666666666666e+01 5016 4166 -1.0666666666687499e+01 5016 5014 2.1333333333312499e+01 5016 5013 -1.0666666666666666e+01 5016 4322 5.3333333333229165e+00 5016 4321 -1.0666666666687499e+01 5017 5017 3.2000000000208331e+01 5018 5018 3.2000000000208331e+01 5019 5019 3.2000000000208331e+01 5020 5020 4.2666666667333331e+01 5020 4112 -4.1666666666666665e-11 5020 5023 -1.0666666666666666e+01 5020 4711 1.0666666666666666e+01 5020 4087 -4.1666666666666665e-11 5020 4321 -4.1666666666666665e-11 5020 5026 -1.0666666666666666e+01 5020 4332 -4.1666666666666665e-11 5020 5021 -1.0666666666666666e+01 5021 5021 4.2666666666916662e+01 5021 5025 -1.0666666666666666e+01 5021 4321 1.0666666666687499e+01 5021 5020 -1.0666666666666666e+01 5021 4332 1.0666666666687499e+01 5022 5022 6.4000000000583327e+01 5022 4335 -5.3333333333229165e+00 5022 5043 -3.2000000000020833e+01 5022 5024 -2.1333333333208333e+01 5022 4354 -5.3333333332812494e+00 5022 4361 5.3333333332916668e+00 5022 4112 -4.1666666666666665e-11 5022 5028 -1.0666666666666666e+01 5022 4332 1.5999999999958334e+01 5022 5023 -1.0666666666666666e+01 5023 5023 4.2666666666916662e+01 5023 5020 -1.0666666666666666e+01 5023 4112 1.0666666666687499e+01 5023 5022 -1.0666666666666666e+01 5023 4332 1.0666666666687499e+01 5024 5024 6.4000000000916657e+01 5024 4063 -1.0416666666666665e-11 5024 4159 -1.0416666666666668e-11 5024 4166 5.3333333332916668e+00 5024 4168 1.0416666666666667e-10 5024 4778 1.0666666666666666e+01 5024 4779 -1.0666666666583334e+01 5024 4356 -1.0416666666666665e-11 5024 4354 1.0416666666666667e-10 5024 5022 -2.1333333333208333e+01 5024 5043 2.1333333333291666e+01 5024 4361 5.3333333332916668e+00 5024 4071 -1.0416666666666668e-11 5024 4070 -4.1666666666666665e-11 5024 4072 6.2499999999999991e-11 5024 5027 -1.0666666666666666e+01 5024 5041 1.0666666666583334e+01 5024 4335 2.0833333333333336e-11 5024 5025 -2.1333333333208333e+01 5024 5029 -2.1333333333291666e+01 5024 4332 -1.0666666666833333e+01 5025 5025 6.4000000000583341e+01 5025 4168 -5.3333333332812494e+00 5025 4321 -4.1666666666666665e-11 5025 5021 -1.0666666666666666e+01 5025 4166 5.3333333332916668e+00 5025 5016 1.0666666666666666e+01 5025 5029 3.2000000000020833e+01 5025 5024 -2.1333333333208333e+01 5025 4332 1.5999999999958334e+01 5025 4335 -5.3333333333229165e+00 5026 5026 4.2666666666916662e+01 5026 5020 -1.0666666666666666e+01 5026 4322 -5.3333333333229165e+00 5026 4321 1.0666666666687499e+01 5026 5015 -2.1333333333312499e+01 5026 5013 1.0666666666666666e+01 5026 4088 -5.3333333333229165e+00 5026 4087 1.0666666666687499e+01 5027 5027 4.2666666666916662e+01 5027 4354 -5.3333333333229165e+00 5027 5041 -2.1333333333312499e+01 5027 5024 -1.0666666666666666e+01 5027 4072 -5.3333333333229165e+00 5027 4356 6.2499999999999991e-11 5027 4362 -5.3333333333229165e+00 5027 4361 1.0666666666687499e+01 5027 4071 6.2500000000000004e-11 5027 4710 -2.1333333333312499e+01 5027 4707 1.0666666666666666e+01 5027 4061 -5.3333333333229165e+00 5027 4070 1.0666666666687499e+01 5028 5028 4.2666666666916662e+01 5028 5022 -1.0666666666666666e+01 5028 4113 -5.3333333333229165e+00 5028 4112 1.0666666666687499e+01 5028 4709 -2.1333333333312499e+01 5028 4707 1.0666666666666666e+01 5028 4362 -5.3333333333229165e+00 5028 4361 1.0666666666687499e+01 5029 5029 5.3333333333749998e+01 5029 4166 2.0194839173657902e-27 5029 4168 -5.3333333333229165e+00 5029 4340 6.2499999999999991e-11 5029 5042 1.0666666666666666e+01 5029 5025 3.2000000000020833e+01 5029 5024 -2.1333333333291666e+01 5029 4332 1.0666666666625000e+01 5029 4335 -5.3333333333437496e+00 5029 5037 1.0666666666666666e+01 5030 5030 4.2666666666916662e+01 5031 5031 3.2000000000208331e+01 5032 5032 2.1333333333541667e+01 5033 5033 3.2000000000208331e+01 5034 5034 3.2000000000208331e+01 5035 5035 3.2000000000208331e+01 5036 5036 3.2000000000208331e+01 5037 5037 4.2666666666999994e+01 5037 5043 -1.0666666666666666e+01 5037 4340 1.0666666666729165e+01 5037 5029 1.0666666666666666e+01 5037 4335 1.0666666666729165e+01 5038 5038 6.4000000000916643e+01 5038 4154 -5.3333333333020834e+00 5038 4354 -1.0416666666666667e-10 5038 5046 2.1333333333208333e+01 5038 5040 -2.1333333333291666e+01 5038 4355 5.3333333332812494e+00 5038 4357 -5.3333333332916668e+00 5038 4156 -5.3333333332916668e+00 5038 4168 -1.0416666666666667e-10 5038 5045 1.0666666666666666e+01 5038 5042 -1.0666666666583334e+01 5038 4155 -2.0833333333333336e-11 5038 4773 -2.1333333333208333e+01 5038 4772 2.1333333333291666e+01 5038 4153 1.0666666666833333e+01 5038 4341 4.1666666666666665e-11 5038 4340 -6.2499999999999991e-11 5038 5048 1.0666666666666666e+01 5038 5039 -1.0666666666583334e+01 5038 3023 5.3333333332812494e+00 5038 2487 -5.3333333333020834e+00 5039 5039 5.3333333333749991e+01 5039 4357 -5.3333333333124999e+00 5039 5043 -1.0666666666666666e+01 5039 4354 1.5999999999989583e+01 5039 5048 -2.1333333333312499e+01 5039 5038 -1.0666666666583334e+01 5039 4341 -5.3333333333124999e+00 5039 4340 1.5999999999989583e+01 5040 5040 5.3333333333749998e+01 5040 4071 -2.0194839173657902e-27 5040 4775 1.0666666666583334e+01 5040 4072 -6.2499999999999991e-11 5040 4774 1.0666666666666666e+01 5040 4073 -5.3333333333229165e+00 5040 4154 1.0666666666791667e+01 5040 4153 -1.0666666666625000e+01 5040 4155 5.3333333333437496e+00 5040 4357 -2.8113590706237963e-30 5040 5046 -3.2000000000020833e+01 5040 5038 -2.1333333333291666e+01 5040 4356 -2.2470898404921788e-28 5040 4355 -5.3333333333229165e+00 5040 4354 5.3333333333229165e+00 5040 5059 1.0666666666666666e+01 5040 5041 -1.0666666666666666e+01 5040 115 -5.3333333333020834e+00 5040 441 5.3333333332812494e+00 5041 5041 5.3333333333749998e+01 5041 4073 -3.6295685768920020e-28 5041 4361 -5.3333333333124999e+00 5041 5027 -2.1333333333312499e+01 5041 5024 1.0666666666583334e+01 5041 4071 -1.0666666666572917e+01 5041 4070 -5.3333333333124999e+00 5041 4072 1.5999999999989583e+01 5041 4355 -2.2851328271989659e-27 5041 5059 -1.0666666666562499e+01 5041 5040 -1.0666666666666666e+01 5041 4356 -1.0666666666572915e+01 5041 4354 1.5999999999989583e+01 5042 5042 5.3333333333749991e+01 5042 5029 1.0666666666666666e+01 5042 4341 -5.3333333333124999e+00 5042 4340 1.5999999999989583e+01 5042 5045 -2.1333333333312499e+01 5042 5038 -1.0666666666583334e+01 5042 4156 -5.3333333333124999e+00 5042 4168 1.5999999999989583e+01 5043 5043 5.3333333333749991e+01 5043 4332 -1.0666666666625000e+01 5043 4361 -2.8113590706237963e-30 5043 5022 -3.2000000000020833e+01 5043 5024 2.1333333333291666e+01 5043 4335 5.3333333333437496e+00 5043 4340 -6.2499999999999991e-11 5043 5037 -1.0666666666666666e+01 5043 4354 5.3333333333229165e+00 5043 5039 -1.0666666666666666e+01 5044 5044 6.4000000000583327e+01 5044 4341 -4.1666666666666665e-11 5044 5049 -1.0666666666666666e+01 5044 4350 1.5999999999958334e+01 5044 4773 2.1333333333208333e+01 5044 4156 5.3333333332916668e+00 5044 5045 -1.0666666666666666e+01 5044 2888 -5.3333333333229165e+00 5044 3707 -3.2000000000020833e+01 5044 3023 -5.3333333332812494e+00 5045 5045 4.2666666666916662e+01 5045 4341 1.0666666666687499e+01 5045 4340 -5.3333333333229165e+00 5045 5042 -2.1333333333312499e+01 5045 5038 1.0666666666666666e+01 5045 4168 -5.3333333333229165e+00 5045 5044 -1.0666666666666666e+01 5045 4156 1.0666666666687499e+01 5046 5046 8.5333333334166653e+01 5046 4155 -5.3333333333229165e+00 5046 5040 -3.2000000000020833e+01 5046 5038 2.1333333333208333e+01 5046 4354 -5.3333333332812494e+00 5046 4355 1.4583333333333335e-10 5046 4357 1.0666666666625000e+01 5046 4353 2.0833333333333339e-11 5046 5057 2.1333333333291666e+01 5046 5050 -2.1333333333208333e+01 5046 4350 -1.0666666666833333e+01 5046 4154 -1.0666666666583334e+01 5046 5053 2.1333333333291666e+01 5046 5047 -2.1333333333208333e+01 5046 4153 2.1333333333291666e+01 5046 5 5.3333333333020834e+00 5046 111 -5.3333333332812494e+00 5047 5047 8.5333333333833338e+01 5047 4353 -5.3333333333229165e+00 5047 4773 2.1333333333208333e+01 5047 4350 3.1999999999958334e+01 5047 5053 -3.2000000000020833e+01 5047 5046 -2.1333333333208333e+01 5047 4154 -5.3333333332812494e+00 5047 4153 1.0666666666625000e+01 5047 2487 -5.3333333332812494e+00 5047 3463 -3.2000000000020833e+01 5047 5 -2.1333333333312499e+01 5047 2888 -5.3333333333229165e+00 5047 111 1.4583333333333335e-10 5048 5048 4.2666666666916662e+01 5048 4354 -5.3333333333229165e+00 5048 4357 1.0666666666687499e+01 5048 5050 -1.0666666666666666e+01 5048 5039 -2.1333333333312499e+01 5048 5038 1.0666666666666666e+01 5048 4341 1.0666666666687499e+01 5048 4340 -5.3333333333229165e+00 5049 5049 4.2666666666916662e+01 5049 5050 -1.0666666666666666e+01 5049 4350 1.0666666666687499e+01 5049 5044 -1.0666666666666666e+01 5049 4341 1.0666666666687499e+01 5050 5050 6.4000000000583327e+01 5050 4355 -5.3333333332812494e+00 5050 5057 -3.2000000000020833e+01 5050 5046 -2.1333333333208333e+01 5050 4353 -5.3333333333229165e+00 5050 4357 5.3333333332916668e+00 5050 4341 -4.1666666666666665e-11 5050 5048 -1.0666666666666666e+01 5050 4350 1.5999999999958334e+01 5050 5049 -1.0666666666666666e+01 5051 5051 3.2000000000208331e+01 5052 5052 4.2666666666916669e+01 5053 5053 5.3333333333749991e+01 5053 4154 5.3333333333229165e+00 5053 4353 5.3333333333437496e+00 5053 4350 -1.0666666666625000e+01 5053 4153 -6.0691943799667649e-29 5053 5047 -3.2000000000020833e+01 5053 5046 2.1333333333291666e+01 5053 110 -2.0194839173657902e-27 5053 111 -5.3333333333229165e+00 5053 26 2.0194839173657902e-27 5053 33 -6.2499999999999991e-11 5053 36 -5.3333333333229165e+00 5053 560 1.0666666666666666e+01 5053 562 -1.0666666666666666e+01 5053 517 -1.0666666666583334e+01 5053 518 1.0666666666666666e+01 5053 5 1.0666666666791667e+01 5054 5054 3.2000000000208331e+01 5055 5055 3.2000000000208331e+01 5056 5056 3.2000000000208331e+01 5057 5057 5.3333333333749991e+01 5057 4353 5.3333333333437496e+00 5057 4355 5.3333333333229165e+00 5057 4357 -5.7186808026555811e-29 5057 5050 -3.2000000000020833e+01 5057 5046 2.1333333333291666e+01 5057 4350 -1.0666666666625000e+01 5057 33 -6.2500000000000004e-11 5057 518 1.0666666666666666e+01 5057 824 -1.0666666666666666e+01 5058 5058 2.1333333333541667e+01 5059 5059 5.3333333333749998e+01 5059 4356 -1.0666666666572915e+01 5059 4355 1.5999999999989583e+01 5059 4071 -1.0666666666572915e+01 5059 4073 1.5999999999989583e+01 5059 4072 1.8812360437258079e-27 5059 4354 -1.8812360437258079e-27 5059 5041 -1.0666666666562499e+01 5059 5040 1.0666666666666666e+01 5059 1691 -5.3333333333124999e+00 5059 2319 -2.1333333333312499e+01 5059 813 1.0666666666583334e+01 5059 1522 -5.3333333333124999e+00 5060 5060 3.2000000000208331e+01 5061 5061 6.4000000000416662e+01 5061 4220 -5.3333333333124999e+00 5061 4006 -5.3333333333124999e+00 5061 4507 -2.1333333333312499e+01 5061 4500 1.0666666666583334e+01 5061 4218 2.1333333333312499e+01 5061 4216 -5.3333333333124999e+00 5061 4739 -2.1333333333312499e+01 5061 4738 1.0666666666583334e+01 5061 4004 2.1333333333312499e+01 5061 4003 -5.3333333333124999e+00 5062 5062 3.2000000000208331e+01 5063 5063 6.4000000000416662e+01 5063 4207 -5.3333333333124999e+00 5063 4369 -5.3333333333124999e+00 5063 4747 -2.1333333333312499e+01 5063 4740 1.0666666666583334e+01 5063 4221 2.1333333333312499e+01 5063 4220 -5.3333333333124999e+00 5063 4806 -2.1333333333312499e+01 5063 4805 1.0666666666583334e+01 5063 4367 2.1333333333312499e+01 5063 4366 -5.3333333333124999e+00 5064 5064 6.4000000000416662e+01 5064 4128 -5.3333333333124999e+00 5064 4366 -5.3333333333124999e+00 5064 4812 -2.1333333333312499e+01 5064 4805 1.0666666666583334e+01 5064 4133 2.1333333333312499e+01 5064 4132 -5.3333333333124999e+00 5064 4741 -2.1333333333312499e+01 5064 4740 1.0666666666583334e+01 5064 4367 2.1333333333312499e+01 5064 4369 -5.3333333333124999e+00 5065 5065 3.2000000000208331e+01 5066 5066 3.2000000000208331e+01 5067 5067 3.2000000000208331e+01 5068 5068 3.2000000000208331e+01 5069 5069 6.4000000000416662e+01 5069 4123 -5.3333333333124999e+00 5069 4380 -5.3333333333124999e+00 5069 4894 -2.1333333333312499e+01 5069 4893 1.0666666666583334e+01 5069 4137 2.1333333333312499e+01 5069 4136 -5.3333333333124999e+00 5069 4476 -2.1333333333312499e+01 5069 4475 1.0666666666583334e+01 5069 4378 2.1333333333312499e+01 5069 4377 -5.3333333333124999e+00 5070 5070 3.2000000000208331e+01 5071 5071 3.2000000000208331e+01 5072 5072 3.2000000000208331e+01 5073 5073 6.4058333333333337e+01 5073 4097 -4.1666666666666666e-03 5073 4695 1.0666666666666666e+01 5073 4051 -5.3322916666666664e+00 5073 4055 1.5995833333333334e+01 5073 4563 -3.2002083333333331e+01 5073 4562 2.1320833333333333e+01 5073 3920 -5.3281250000000000e+00 5073 3923 5.3291666666666666e+00 5073 5074 -1.0666666666666666e+01 5074 5074 4.2691666666666663e+01 5074 4097 1.0668750000000001e+01 5074 4096 -5.3322916666666664e+00 5074 4913 -2.1331249999999997e+01 5074 4910 1.0666666666666666e+01 5074 3930 -5.3322916666666664e+00 5074 5073 -1.0666666666666666e+01 5074 3923 1.0668750000000001e+01 5075 5075 8.5383333333333340e+01 5075 4056 -5.3322916666666664e+00 5075 3913 -5.3281250000000000e+00 5075 4555 -3.2002083333333331e+01 5075 4562 2.1320833333333333e+01 5075 4051 -5.3322916666666664e+00 5075 4055 3.1995833333333334e+01 5075 4788 -3.2002083333333331e+01 5075 4787 2.1320833333333333e+01 5075 3914 -5.3281250000000000e+00 5075 3918 1.0662500000000000e+01 5076 5076 3.2020833333333336e+01 5077 5077 4.2691666666666663e+01 5078 5078 2.1354166666666668e+01 5079 5079 4.2691666666666663e+01 5080 5080 2.1354166666666668e+01 hypre-2.33.0/src/test/TEST_ams/mfem.Aalpha.00000000066400000000000000000001053251477326011500206210ustar00rootroot000000000000001 152 1 152 1 1 3.0000000000000000e+00 2 2 1.0000000000000000e+00 3 3 1.0000000000000000e+00 4 4 1.0000000000000000e+00 5 5 1.0000000000000000e+00 6 6 1.0000000000000007e+00 6 40 4.1666666666666664e-02 6 122 -8.3333333333333329e-02 6 121 4.1666666666666664e-02 6 120 -1.2499999999999999e-01 6 119 -8.3333333333333329e-02 6 64 4.1666666666666664e-02 6 103 -8.3333333333333329e-02 6 91 -1.2499999999999999e-01 6 90 -1.2499999999999999e-01 6 88 -8.3333333333333329e-02 6 89 4.1666666666666664e-02 6 57 -1.2499999999999999e-01 6 56 -1.2499999999999999e-01 6 32 -1.2499999999999999e-01 6 30 -1.2499999999999999e-01 6 29 -1.2499999999999999e-01 6 513 4.1666666666666664e-02 7 7 1.0833333333333330e+00 7 82 -2.0833333333333331e-01 7 116 -2.0833333333333336e-02 7 118 4.1666666666666664e-02 7 93 4.1666666666666664e-02 7 35 -1.2499999999999999e-01 7 81 -1.2499999999999999e-01 7 34 -8.3333333333333329e-02 7 499 4.1666666666666664e-02 7 505 -8.3333333333333329e-02 7 483 4.1666666666666664e-02 7 502 -1.2500000000000000e-01 7 506 -1.2500000000000000e-01 7 422 -1.2499999999999999e-01 7 507 2.0833333333333332e-02 7 423 -1.2499999999999999e-01 7 501 -8.3333333333333329e-02 7 421 0.0000000000000000e+00 7 824 8.3333333333333329e-02 7 831 -8.3333333333333329e-02 7 611 -8.3333333333333329e-02 7 609 2.0833333333333332e-02 7 355 2.0833333333333332e-02 8 8 1.0000000000000007e+00 8 64 4.1666666666666664e-02 8 121 4.1666666666666664e-02 8 81 4.1666666666666664e-02 8 118 -8.3333333333333329e-02 8 93 -8.3333333333333329e-02 8 92 -1.2499999999999999e-01 8 89 4.1666666666666664e-02 8 88 -8.3333333333333329e-02 8 87 -1.2499999999999999e-01 8 86 -1.2499999999999999e-01 8 48 -1.2499999999999999e-01 8 47 -1.2499999999999999e-01 8 45 -8.3333333333333329e-02 8 46 4.1666666666666664e-02 8 38 -1.2499999999999999e-01 8 36 -1.2499999999999999e-01 8 35 -1.2499999999999999e-01 8 33 -8.3333333333333329e-02 8 34 4.1666666666666664e-02 8 505 4.1666666666666664e-02 8 262 4.1666666666666664e-02 9 9 1.0000000000000007e+00 9 149 4.1666666666666664e-02 9 110 4.1666666666666664e-02 9 145 4.1666666666666664e-02 9 147 -8.3333333333333329e-02 9 139 4.1666666666666664e-02 9 118 4.1666666666666664e-02 9 126 4.1666666666666664e-02 9 122 4.1666666666666664e-02 9 121 -8.3333333333333329e-02 9 88 4.1666666666666664e-02 9 148 -1.2499999999999999e-01 9 61 -1.2499999999999999e-01 9 146 -1.2499999999999999e-01 9 65 -1.2499999999999999e-01 9 125 -1.2499999999999999e-01 9 46 -8.3333333333333329e-02 9 124 4.1666666666666664e-02 9 41 -1.2499999999999999e-01 9 60 -8.3333333333333329e-02 9 39 4.1666666666666664e-02 9 120 -1.2499999999999999e-01 9 40 -8.3333333333333329e-02 9 119 4.1666666666666664e-02 9 47 -1.2499999999999999e-01 9 64 -8.3333333333333329e-02 9 45 4.1666666666666664e-02 10 10 1.0000000000000000e+00 11 11 1.0000000000000007e+00 11 134 -1.2499999999999999e-01 11 133 -1.2499999999999999e-01 11 132 -1.2499999999999999e-01 11 127 -1.2499999999999999e-01 11 60 4.1666666666666664e-02 11 126 -8.3333333333333329e-02 11 123 -1.2499999999999999e-01 11 121 4.1666666666666664e-02 11 122 -8.3333333333333329e-02 11 44 -1.2499999999999999e-01 11 42 -1.2499999999999999e-01 11 41 -1.2499999999999999e-01 11 39 -8.3333333333333329e-02 11 40 4.1666666666666664e-02 11 433 4.1666666666666664e-02 11 495 4.1666666666666664e-02 11 537 -8.3333333333333329e-02 11 444 4.1666666666666664e-02 11 513 4.1666666666666664e-02 11 514 -8.3333333333333329e-02 11 480 4.1666666666666664e-02 12 12 1.0000000000000000e+00 13 13 1.0000000000000007e+00 13 130 -1.2499999999999999e-01 13 104 -1.2499999999999999e-01 13 103 -8.3333333333333329e-02 13 102 -1.2499999999999999e-01 13 89 4.1666666666666664e-02 13 99 -8.3333333333333329e-02 13 97 -1.2499999999999999e-01 13 96 -1.2499999999999999e-01 13 53 -1.2499999999999999e-01 13 51 -1.2499999999999999e-01 13 50 -1.2499999999999999e-01 13 513 4.1666666666666664e-02 13 511 -8.3333333333333329e-02 13 484 4.1666666666666664e-02 14 14 1.3333333333333333e+00 14 136 2.0833333333333332e-02 14 124 4.1666666666666664e-02 14 59 -1.2499999999999999e-01 14 760 -1.8749999999999997e-01 14 208 -2.0833333333333332e-02 14 206 8.3333333333333329e-02 14 811 -4.1666666666666664e-02 14 667 -8.3333333333333329e-02 14 812 8.3333333333333329e-02 14 200 -8.3333333333333329e-02 14 263 -1.2500000000000000e-01 14 507 2.0833333333333332e-02 14 458 -4.1666666666666664e-02 14 455 8.3333333333333329e-02 14 454 -8.3333333333333329e-02 14 446 -4.1666666666666664e-02 14 443 8.3333333333333329e-02 14 445 -1.6666666666666666e-01 14 468 -1.6666666666666666e-01 14 420 -1.2500000000000000e-01 14 419 -1.8750000000000000e-01 14 415 -6.2500000000000000e-02 14 668 -2.0833333333333331e-01 15 15 1.0000000000000007e+00 15 40 4.1666666666666664e-02 15 147 4.1666666666666664e-02 15 145 -8.3333333333333329e-02 15 113 -1.2499999999999999e-01 15 110 -8.3333333333333329e-02 15 109 -1.2499999999999999e-01 15 108 -1.2499999999999999e-01 15 75 -1.2499999999999999e-01 15 74 -1.2499999999999999e-01 15 63 -1.2499999999999999e-01 15 62 -1.2499999999999999e-01 15 61 -1.2499999999999999e-01 15 39 -8.3333333333333329e-02 15 60 4.1666666666666664e-02 15 479 4.1666666666666664e-02 15 338 4.1666666666666664e-02 15 251 -8.3333333333333329e-02 15 252 4.1666666666666664e-02 15 287 -8.3333333333333329e-02 15 283 4.1666666666666664e-02 15 480 4.1666666666666664e-02 16 16 1.0000000000000000e+00 17 17 1.0000000000000007e+00 17 151 -1.2499999999999999e-01 17 149 -8.3333333333333329e-02 17 46 4.1666666666666664e-02 17 147 4.1666666666666664e-02 17 142 -1.2499999999999999e-01 17 141 -1.2499999999999999e-01 17 139 -8.3333333333333329e-02 17 138 -1.2499999999999999e-01 17 137 -1.2499999999999999e-01 17 68 -1.2499999999999999e-01 17 66 -1.2499999999999999e-01 17 65 -1.2499999999999999e-01 17 45 -8.3333333333333329e-02 17 64 4.1666666666666664e-02 17 327 4.1666666666666664e-02 17 227 4.1666666666666664e-02 17 328 -8.3333333333333329e-02 17 329 4.1666666666666664e-02 17 262 4.1666666666666664e-02 17 303 -8.3333333333333329e-02 17 301 4.1666666666666664e-02 18 18 1.0000000000000007e+00 18 64 4.1666666666666664e-02 18 149 -8.3333333333333329e-02 18 147 4.1666666666666664e-02 18 148 -1.2499999999999999e-01 18 119 -8.3333333333333329e-02 18 40 4.1666666666666664e-02 18 112 -1.2499999999999999e-01 18 111 -1.2499999999999999e-01 18 110 -8.3333333333333329e-02 18 79 -1.2499999999999999e-01 18 78 -1.2499999999999999e-01 18 73 -1.2499999999999999e-01 18 71 -1.2499999999999999e-01 18 70 -1.2499999999999999e-01 18 326 -8.3333333333333329e-02 18 327 4.1666666666666664e-02 18 252 4.1666666666666664e-02 19 19 9.9999999999999989e-01 19 82 -2.0833333333333331e-01 19 848 -1.4583333333333334e-01 19 809 -1.6666666666666666e-01 19 610 -1.6666666666666666e-01 19 611 2.0833333333333332e-02 19 831 2.0833333333333332e-02 19 824 -4.1666666666666664e-02 19 725 -1.4583333333333331e-01 19 707 -1.6666666666666666e-01 20 20 1.0000000000000000e+00 21 21 9.9999999999999967e-01 21 481 2.0833333333333332e-02 21 307 -2.0833333333333331e-01 21 783 2.0833333333333332e-02 21 279 -4.1666666666666664e-02 21 701 -1.4583333333333331e-01 21 300 -1.4583333333333331e-01 21 604 -1.6666666666666666e-01 21 592 -1.6666666666666666e-01 21 691 -1.6666666666666666e-01 22 22 1.0000000000000000e+00 23 23 1.0000000000000000e+00 24 24 5.0000000000000000e-01 24 99 -4.1666666666666664e-02 24 89 -4.1666666666666664e-02 24 93 -4.1666666666666664e-02 24 394 -1.2499999999999999e-01 25 25 5.0000000000000000e-01 25 116 -4.1666666666666664e-02 25 34 -4.1666666666666664e-02 25 93 -4.1666666666666664e-02 25 394 -1.2499999999999999e-01 26 26 1.0000000000000000e+00 27 27 1.0000000000000000e+00 28 28 1.0000000000000000e+00 29 29 5.0000000000000000e-01 29 103 -4.1666666666666664e-02 29 89 -4.1666666666666664e-02 29 88 -4.1666666666666664e-02 29 6 -1.2499999999999999e-01 30 30 5.0000000000000000e-01 30 6 -1.2499999999999999e-01 30 103 -4.1666666666666664e-02 31 31 1.0000000000000000e+00 32 32 5.0000000000000000e-01 32 6 -1.2499999999999999e-01 32 119 -4.1666666666666664e-02 33 33 7.0833333333333359e-01 33 48 -4.1666666666666664e-02 33 8 -8.3333333333333329e-02 33 36 -4.1666666666666664e-02 33 35 -4.1666666666666664e-02 33 81 -8.3333333333333329e-02 33 34 -8.3333333333333329e-02 33 38 -4.1666666666666664e-02 33 180 2.0833333333333332e-02 33 831 -4.1666666666666671e-02 33 262 -8.3333333333333329e-02 33 355 -1.2500000000000000e-01 34 34 5.8333333333333315e-01 34 25 -4.1666666666666664e-02 34 36 -4.1666666666666664e-02 34 35 -4.1666666666666664e-02 34 8 4.1666666666666664e-02 34 116 -8.3333333333333329e-02 34 93 -8.3333333333333329e-02 34 33 -8.3333333333333329e-02 34 7 -8.3333333333333329e-02 34 502 -4.1666666666666664e-02 34 394 4.1666666666666664e-02 34 831 -8.3333333333333329e-02 35 35 5.0000000000000000e-01 35 81 -4.1666666666666664e-02 35 118 -4.1666666666666664e-02 35 93 -4.1666666666666664e-02 35 8 -1.2499999999999999e-01 35 34 -4.1666666666666664e-02 35 33 -4.1666666666666664e-02 35 7 -1.2499999999999999e-01 35 505 -4.1666666666666664e-02 36 36 5.0000000000000000e-01 36 34 -4.1666666666666664e-02 36 8 -1.2499999999999999e-01 36 33 -4.1666666666666664e-02 36 93 -4.1666666666666664e-02 37 37 1.0000000000000000e+00 38 38 5.0000000000000000e-01 38 8 -1.2499999999999999e-01 38 45 -4.1666666666666664e-02 38 33 -4.1666666666666664e-02 38 262 -4.1666666666666664e-02 39 39 6.6666666666666674e-01 39 109 -4.1666666666666664e-02 39 127 -4.1666666666666664e-02 39 15 -8.3333333333333329e-02 39 62 -4.1666666666666664e-02 39 11 -8.3333333333333329e-02 39 42 -4.1666666666666664e-02 39 61 -4.1666666666666664e-02 39 40 -8.3333333333333329e-02 39 41 -4.1666666666666664e-02 39 60 -8.3333333333333329e-02 39 9 4.1666666666666664e-02 39 63 -4.1666666666666664e-02 39 44 -4.1666666666666664e-02 39 383 4.1666666666666664e-02 39 480 -8.3333333333333329e-02 40 40 6.6666666666666674e-01 40 109 -4.1666666666666664e-02 40 61 -4.1666666666666664e-02 40 15 4.1666666666666664e-02 40 112 -4.1666666666666664e-02 40 148 -4.1666666666666664e-02 40 18 4.1666666666666664e-02 40 57 -4.1666666666666664e-02 40 120 -4.1666666666666664e-02 40 6 4.1666666666666664e-02 40 42 -4.1666666666666664e-02 40 41 -4.1666666666666664e-02 40 11 4.1666666666666664e-02 40 39 -8.3333333333333329e-02 40 110 -8.3333333333333329e-02 40 119 -8.3333333333333329e-02 40 9 -8.3333333333333329e-02 40 122 -8.3333333333333329e-02 41 41 5.0000000000000000e-01 41 60 -4.1666666666666664e-02 41 126 -4.1666666666666664e-02 41 121 -4.1666666666666664e-02 41 122 -4.1666666666666664e-02 41 11 -1.2499999999999999e-01 41 40 -4.1666666666666664e-02 41 39 -4.1666666666666664e-02 41 9 -1.2499999999999999e-01 42 42 5.0000000000000000e-01 42 40 -4.1666666666666664e-02 42 11 -1.2499999999999999e-01 42 39 -4.1666666666666664e-02 42 122 -4.1666666666666664e-02 43 43 1.0000000000000000e+00 44 44 5.0000000000000000e-01 44 11 -1.2499999999999999e-01 44 39 -4.1666666666666664e-02 44 480 -4.1666666666666664e-02 44 537 -4.1666666666666664e-02 45 45 6.6666666666666674e-01 45 138 -4.1666666666666664e-02 45 87 -4.1666666666666664e-02 45 17 -8.3333333333333329e-02 45 66 -4.1666666666666664e-02 45 8 -8.3333333333333329e-02 45 48 -4.1666666666666664e-02 45 65 -4.1666666666666664e-02 45 46 -8.3333333333333329e-02 45 47 -4.1666666666666664e-02 45 64 -8.3333333333333329e-02 45 9 4.1666666666666664e-02 45 68 -4.1666666666666664e-02 45 38 -4.1666666666666664e-02 45 180 4.1666666666666664e-02 45 262 -8.3333333333333329e-02 46 46 6.6666666666666674e-01 46 138 -4.1666666666666664e-02 46 65 -4.1666666666666664e-02 46 17 4.1666666666666664e-02 46 140 -4.1666666666666664e-02 46 146 -4.1666666666666664e-02 46 117 -4.1666666666666664e-02 46 125 -4.1666666666666664e-02 46 48 -4.1666666666666664e-02 46 47 -4.1666666666666664e-02 46 8 4.1666666666666664e-02 46 45 -8.3333333333333329e-02 46 139 -8.3333333333333329e-02 46 124 -8.3333333333333329e-02 46 9 -8.3333333333333329e-02 46 118 -8.3333333333333329e-02 46 186 4.1666666666666664e-02 46 372 4.1666666666666664e-02 46 180 -8.3333333333333329e-02 47 47 5.0000000000000000e-01 47 118 -4.1666666666666664e-02 47 64 -4.1666666666666664e-02 47 121 -4.1666666666666664e-02 47 88 -4.1666666666666664e-02 47 8 -1.2499999999999999e-01 47 46 -4.1666666666666664e-02 47 45 -4.1666666666666664e-02 47 9 -1.2499999999999999e-01 48 48 5.0000000000000000e-01 48 33 -4.1666666666666664e-02 48 81 -4.1666666666666664e-02 48 46 -4.1666666666666664e-02 48 8 -1.2499999999999999e-01 48 45 -4.1666666666666664e-02 48 118 -4.1666666666666664e-02 48 262 -4.1666666666666664e-02 48 180 -1.2499999999999999e-01 49 49 1.0000000000000000e+00 50 50 5.0000000000000000e-01 50 99 -4.1666666666666664e-02 50 13 -1.2499999999999999e-01 50 511 -4.1666666666666664e-02 50 484 -4.1666666666666664e-02 51 51 5.0000000000000000e-01 51 13 -1.2499999999999999e-01 51 511 -4.1666666666666664e-02 52 52 1.0000000000000000e+00 53 53 5.0000000000000000e-01 53 13 -1.2499999999999999e-01 54 54 1.0000000000000000e+00 55 55 1.0000000000000000e+00 56 56 5.0000000000000000e-01 56 122 -4.1666666666666664e-02 56 103 -4.1666666666666664e-02 56 6 -1.2499999999999999e-01 56 513 -4.1666666666666664e-02 57 57 5.0000000000000000e-01 57 119 -4.1666666666666664e-02 57 40 -4.1666666666666664e-02 57 6 -1.2499999999999999e-01 57 122 -4.1666666666666664e-02 58 58 1.0000000000000000e+00 59 59 5.0000000000000000e-01 59 124 -4.1666666666666664e-02 59 136 -4.1666666666666664e-02 59 14 -1.2499999999999999e-01 59 445 -4.1666666666666664e-02 59 263 -4.1666666666666664e-02 59 760 -4.1666666666666664e-02 59 186 -1.2499999999999999e-01 59 208 -4.1666666666666664e-02 60 60 6.6666666666666674e-01 60 144 -4.1666666666666664e-02 60 146 -4.1666666666666664e-02 60 127 -4.1666666666666664e-02 60 41 -4.1666666666666664e-02 60 11 4.1666666666666664e-02 60 125 -4.1666666666666664e-02 60 62 -4.1666666666666664e-02 60 61 -4.1666666666666664e-02 60 15 4.1666666666666664e-02 60 124 -8.3333333333333329e-02 60 145 -8.3333333333333329e-02 60 39 -8.3333333333333329e-02 60 9 -8.3333333333333329e-02 60 126 -8.3333333333333329e-02 60 186 4.1666666666666664e-02 60 516 -4.1666666666666664e-02 60 372 4.1666666666666664e-02 60 383 -8.3333333333333329e-02 61 61 5.0000000000000000e-01 61 40 -4.1666666666666664e-02 61 110 -4.1666666666666664e-02 61 147 -4.1666666666666664e-02 61 145 -4.1666666666666664e-02 61 15 -1.2499999999999999e-01 61 60 -4.1666666666666664e-02 61 39 -4.1666666666666664e-02 61 9 -1.2499999999999999e-01 62 62 5.0000000000000000e-01 62 60 -4.1666666666666664e-02 62 15 -1.2499999999999999e-01 62 39 -4.1666666666666664e-02 62 145 -4.1666666666666664e-02 62 287 -4.1666666666666664e-02 62 479 -4.1666666666666664e-02 62 480 -4.1666666666666664e-02 62 383 -1.2499999999999999e-01 63 63 5.0000000000000000e-01 63 15 -1.2499999999999999e-01 63 39 -4.1666666666666664e-02 63 480 -4.1666666666666664e-02 63 287 -4.1666666666666664e-02 64 64 6.6666666666666674e-01 64 79 -4.1666666666666664e-02 64 148 -4.1666666666666664e-02 64 18 4.1666666666666664e-02 64 87 -4.1666666666666664e-02 64 47 -4.1666666666666664e-02 64 8 4.1666666666666664e-02 64 91 -4.1666666666666664e-02 64 120 -4.1666666666666664e-02 64 6 4.1666666666666664e-02 64 66 -4.1666666666666664e-02 64 65 -4.1666666666666664e-02 64 17 4.1666666666666664e-02 64 119 -8.3333333333333329e-02 64 149 -8.3333333333333329e-02 64 45 -8.3333333333333329e-02 64 9 -8.3333333333333329e-02 64 88 -8.3333333333333329e-02 65 65 5.0000000000000000e-01 65 149 -4.1666666666666664e-02 65 46 -4.1666666666666664e-02 65 147 -4.1666666666666664e-02 65 139 -4.1666666666666664e-02 65 17 -1.2499999999999999e-01 65 64 -4.1666666666666664e-02 65 45 -4.1666666666666664e-02 65 9 -1.2499999999999999e-01 66 66 5.0000000000000000e-01 66 64 -4.1666666666666664e-02 66 17 -1.2499999999999999e-01 66 45 -4.1666666666666664e-02 66 149 -4.1666666666666664e-02 67 67 1.0000000000000000e+00 68 68 5.0000000000000000e-01 68 17 -1.2499999999999999e-01 68 45 -4.1666666666666664e-02 68 262 -4.1666666666666664e-02 68 303 -4.1666666666666664e-02 69 69 1.0000000000000000e+00 70 70 5.0000000000000000e-01 70 110 -4.1666666666666664e-02 70 18 -1.2499999999999999e-01 70 326 -4.1666666666666664e-02 70 252 -4.1666666666666664e-02 71 71 5.0000000000000000e-01 71 18 -1.2499999999999999e-01 71 326 -4.1666666666666664e-02 72 72 1.0000000000000000e+00 73 73 5.0000000000000000e-01 73 18 -1.2499999999999999e-01 73 119 -4.1666666666666664e-02 74 74 5.0000000000000000e-01 74 145 -4.1666666666666664e-02 74 15 -1.2499999999999999e-01 74 251 -4.1666666666666664e-02 74 479 -4.1666666666666664e-02 74 338 -4.1666666666666664e-02 74 283 -4.1666666666666664e-02 74 287 -4.1666666666666664e-02 74 174 -1.2499999999999999e-01 75 75 5.0000000000000000e-01 75 15 -1.2499999999999999e-01 75 283 -4.1666666666666664e-02 75 287 -4.1666666666666664e-02 75 251 -4.1666666666666664e-02 76 76 1.0000000000000000e+00 77 77 1.0000000000000000e+00 78 78 5.0000000000000000e-01 78 149 -4.1666666666666664e-02 78 18 -1.2499999999999999e-01 78 327 -4.1666666666666664e-02 78 326 -4.1666666666666664e-02 79 79 5.0000000000000000e-01 79 119 -4.1666666666666664e-02 79 64 -4.1666666666666664e-02 79 18 -1.2499999999999999e-01 79 149 -4.1666666666666664e-02 80 80 1.0000000000000000e+00 81 81 6.6666666666666641e-01 81 48 -4.1666666666666664e-02 81 35 -4.1666666666666664e-02 81 8 4.1666666666666664e-02 81 117 -4.1666666666666664e-02 81 33 -8.3333333333333329e-02 81 7 -1.2499999999999999e-01 81 118 -8.3333333333333329e-02 81 506 -4.1666666666666664e-02 81 372 4.1666666666666664e-02 81 507 -8.3333333333333329e-02 81 357 -8.3333333333333329e-02 81 180 -1.2500000000000000e-01 82 82 7.5000000000000000e-01 82 7 -2.0833333333333331e-01 82 19 -2.0833333333333331e-01 82 608 -8.3333333333333329e-02 82 831 -8.3333333333333329e-02 82 611 -8.3333333333333329e-02 82 357 -8.3333333333333329e-02 83 83 1.0000000000000000e+00 84 84 1.0000000000000000e+00 85 85 1.0000000000000000e+00 86 86 5.0000000000000000e-01 86 93 -4.1666666666666664e-02 86 89 -4.1666666666666664e-02 86 88 -4.1666666666666664e-02 86 8 -1.2499999999999999e-01 87 87 5.0000000000000000e-01 87 45 -4.1666666666666664e-02 87 64 -4.1666666666666664e-02 87 8 -1.2499999999999999e-01 87 88 -4.1666666666666664e-02 88 88 6.6666666666666674e-01 88 120 -4.1666666666666664e-02 88 47 -4.1666666666666664e-02 88 9 4.1666666666666664e-02 88 8 -8.3333333333333329e-02 88 86 -4.1666666666666664e-02 88 6 -8.3333333333333329e-02 88 29 -4.1666666666666664e-02 88 90 -4.1666666666666664e-02 88 121 -8.3333333333333329e-02 88 87 -4.1666666666666664e-02 88 64 -8.3333333333333329e-02 88 92 -4.1666666666666664e-02 88 89 -8.3333333333333329e-02 88 91 -4.1666666666666664e-02 88 393 4.1666666666666664e-02 89 89 6.6666666666666674e-01 89 102 -4.1666666666666664e-02 89 96 -4.1666666666666664e-02 89 13 4.1666666666666664e-02 89 24 -4.1666666666666664e-02 89 92 -4.1666666666666664e-02 89 86 -4.1666666666666664e-02 89 8 4.1666666666666664e-02 89 29 -4.1666666666666664e-02 89 90 -4.1666666666666664e-02 89 6 4.1666666666666664e-02 89 103 -8.3333333333333329e-02 89 99 -8.3333333333333329e-02 89 93 -8.3333333333333329e-02 89 88 -8.3333333333333329e-02 89 485 -4.1666666666666664e-02 89 394 4.1666666666666664e-02 89 393 -8.3333333333333329e-02 90 90 5.0000000000000000e-01 90 121 -4.1666666666666664e-02 90 6 -1.2499999999999999e-01 90 89 -4.1666666666666664e-02 90 122 -4.1666666666666664e-02 90 88 -4.1666666666666664e-02 90 103 -4.1666666666666664e-02 90 513 -4.1666666666666664e-02 90 393 -1.2499999999999999e-01 91 91 5.0000000000000000e-01 91 64 -4.1666666666666664e-02 91 119 -4.1666666666666664e-02 91 6 -1.2499999999999999e-01 91 88 -4.1666666666666664e-02 92 92 5.0000000000000000e-01 92 121 -4.1666666666666664e-02 92 89 -4.1666666666666664e-02 92 8 -1.2499999999999999e-01 92 118 -4.1666666666666664e-02 92 93 -4.1666666666666664e-02 92 88 -4.1666666666666664e-02 92 505 -4.1666666666666664e-02 92 393 -1.2499999999999999e-01 93 93 6.6666666666666674e-01 93 35 -4.1666666666666664e-02 93 7 4.1666666666666664e-02 93 24 -4.1666666666666664e-02 93 8 -8.3333333333333329e-02 93 86 -4.1666666666666664e-02 93 92 -4.1666666666666664e-02 93 25 -4.1666666666666664e-02 93 34 -8.3333333333333329e-02 93 89 -8.3333333333333329e-02 93 36 -4.1666666666666664e-02 93 502 -4.1666666666666664e-02 93 394 -8.3333333333333329e-02 93 505 -8.3333333333333329e-02 93 485 -4.1666666666666664e-02 93 393 4.1666666666666664e-02 94 94 1.0000000000000000e+00 95 95 1.0000000000000000e+00 96 96 5.0000000000000000e-01 96 103 -4.1666666666666664e-02 96 89 -4.1666666666666664e-02 96 99 -4.1666666666666664e-02 96 13 -1.2499999999999999e-01 97 97 5.0000000000000000e-01 97 13 -1.2499999999999999e-01 97 99 -4.1666666666666664e-02 98 98 1.0000000000000000e+00 99 99 6.6666666666666674e-01 99 50 -4.1666666666666664e-02 99 13 -8.3333333333333329e-02 99 96 -4.1666666666666664e-02 99 24 -4.1666666666666664e-02 99 97 -4.1666666666666664e-02 99 102 -4.1666666666666664e-02 99 89 -8.3333333333333329e-02 99 100 -4.1666666666666664e-02 99 486 -4.1666666666666664e-02 99 394 -8.3333333333333329e-02 99 485 -4.1666666666666664e-02 99 484 -8.3333333333333329e-02 99 393 4.1666666666666664e-02 100 100 5.0000000000000000e-01 100 99 -4.1666666666666664e-02 100 394 -1.2499999999999999e-01 101 101 1.0000000000000000e+00 102 102 5.0000000000000000e-01 102 89 -4.1666666666666664e-02 102 13 -1.2499999999999999e-01 102 103 -4.1666666666666664e-02 102 99 -4.1666666666666664e-02 102 513 -4.1666666666666664e-02 102 484 -4.1666666666666664e-02 102 511 -4.1666666666666664e-02 102 393 -1.2499999999999999e-01 103 103 6.6666666666666674e-01 103 130 -4.1666666666666664e-02 103 56 -4.1666666666666664e-02 103 6 -8.3333333333333329e-02 103 29 -4.1666666666666664e-02 103 13 -8.3333333333333329e-02 103 96 -4.1666666666666664e-02 103 102 -4.1666666666666664e-02 103 30 -4.1666666666666664e-02 103 90 -4.1666666666666664e-02 103 89 -8.3333333333333329e-02 103 104 -4.1666666666666664e-02 103 513 -8.3333333333333329e-02 103 393 4.1666666666666664e-02 104 104 5.0000000000000000e-01 104 13 -1.2499999999999999e-01 104 103 -4.1666666666666664e-02 105 105 1.0000000000000000e+00 106 106 1.0000000000000000e+00 107 107 1.0000000000000000e+00 108 108 5.0000000000000000e-01 108 110 -4.1666666666666664e-02 108 15 -1.2499999999999999e-01 108 251 -4.1666666666666664e-02 108 252 -4.1666666666666664e-02 109 109 5.0000000000000000e-01 109 39 -4.1666666666666664e-02 109 40 -4.1666666666666664e-02 109 15 -1.2499999999999999e-01 109 110 -4.1666666666666664e-02 110 110 6.6666666666666674e-01 110 148 -4.1666666666666664e-02 110 61 -4.1666666666666664e-02 110 9 4.1666666666666664e-02 110 15 -8.3333333333333329e-02 110 108 -4.1666666666666664e-02 110 18 -8.3333333333333329e-02 110 70 -4.1666666666666664e-02 110 111 -4.1666666666666664e-02 110 147 -8.3333333333333329e-02 110 109 -4.1666666666666664e-02 110 40 -8.3333333333333329e-02 110 113 -4.1666666666666664e-02 110 112 -4.1666666666666664e-02 110 252 -8.3333333333333329e-02 110 179 4.1666666666666664e-02 111 111 5.0000000000000000e-01 111 147 -4.1666666666666664e-02 111 18 -1.2499999999999999e-01 111 149 -4.1666666666666664e-02 111 110 -4.1666666666666664e-02 111 327 -4.1666666666666664e-02 111 252 -4.1666666666666664e-02 111 326 -4.1666666666666664e-02 111 179 -1.2499999999999999e-01 112 112 5.0000000000000000e-01 112 40 -4.1666666666666664e-02 112 119 -4.1666666666666664e-02 112 18 -1.2499999999999999e-01 112 110 -4.1666666666666664e-02 113 113 5.0000000000000000e-01 113 147 -4.1666666666666664e-02 113 15 -1.2499999999999999e-01 113 145 -4.1666666666666664e-02 113 110 -4.1666666666666664e-02 113 338 -4.1666666666666664e-02 113 252 -4.1666666666666664e-02 113 251 -4.1666666666666664e-02 113 179 -1.2499999999999999e-01 114 114 1.0000000000000000e+00 115 115 1.0000000000000000e+00 116 116 7.5000000000000000e-01 116 7 -2.0833333333333336e-02 116 25 -4.1666666666666664e-02 116 34 -8.3333333333333329e-02 116 611 -4.1666666666666664e-02 116 502 -4.1666666666666664e-02 116 394 -8.3333333333333329e-02 116 487 -4.1666666666666664e-02 116 501 -8.3333333333333329e-02 116 504 -4.1666666666666664e-02 116 825 -8.3333333333333329e-02 116 831 -4.1666666666666664e-02 117 117 5.0000000000000000e-01 117 124 -4.1666666666666664e-02 117 46 -4.1666666666666664e-02 117 81 -4.1666666666666664e-02 117 118 -4.1666666666666664e-02 117 263 -4.1666666666666664e-02 117 372 -1.2499999999999999e-01 117 507 -4.1666666666666664e-02 117 180 -1.2499999999999999e-01 118 118 6.6666666666666674e-01 118 47 -4.1666666666666664e-02 118 125 -4.1666666666666664e-02 118 9 4.1666666666666664e-02 118 8 -8.3333333333333329e-02 118 35 -4.1666666666666664e-02 118 7 4.1666666666666664e-02 118 92 -4.1666666666666664e-02 118 121 -8.3333333333333329e-02 118 117 -4.1666666666666664e-02 118 46 -8.3333333333333329e-02 118 48 -4.1666666666666664e-02 118 81 -8.3333333333333329e-02 118 372 -8.3333333333333329e-02 118 506 -4.1666666666666664e-02 118 500 -4.1666666666666664e-02 118 505 -8.3333333333333329e-02 118 393 4.1666666666666664e-02 118 180 4.1666666666666664e-02 119 119 6.6666666666666674e-01 119 79 -4.1666666666666664e-02 119 18 -8.3333333333333329e-02 119 112 -4.1666666666666664e-02 119 57 -4.1666666666666664e-02 119 6 -8.3333333333333329e-02 119 91 -4.1666666666666664e-02 119 148 -4.1666666666666664e-02 119 64 -8.3333333333333329e-02 119 73 -4.1666666666666664e-02 119 120 -4.1666666666666664e-02 119 40 -8.3333333333333329e-02 119 9 4.1666666666666664e-02 119 32 -4.1666666666666664e-02 120 120 5.0000000000000000e-01 120 40 -4.1666666666666664e-02 120 122 -4.1666666666666664e-02 120 121 -4.1666666666666664e-02 120 88 -4.1666666666666664e-02 120 6 -1.2499999999999999e-01 120 64 -4.1666666666666664e-02 120 119 -4.1666666666666664e-02 120 9 -1.2499999999999999e-01 121 121 6.6666666666666674e-01 121 125 -4.1666666666666664e-02 121 123 -4.1666666666666664e-02 121 41 -4.1666666666666664e-02 121 11 4.1666666666666664e-02 121 90 -4.1666666666666664e-02 121 120 -4.1666666666666664e-02 121 6 4.1666666666666664e-02 121 47 -4.1666666666666664e-02 121 92 -4.1666666666666664e-02 121 8 4.1666666666666664e-02 121 9 -8.3333333333333329e-02 121 118 -8.3333333333333329e-02 121 126 -8.3333333333333329e-02 121 122 -8.3333333333333329e-02 121 88 -8.3333333333333329e-02 121 500 -4.1666666666666664e-02 121 372 4.1666666666666664e-02 121 393 -8.3333333333333329e-02 122 122 6.6666666666666674e-01 122 56 -4.1666666666666664e-02 122 132 -4.1666666666666664e-02 122 11 -8.3333333333333329e-02 122 41 -4.1666666666666664e-02 122 6 -8.3333333333333329e-02 122 120 -4.1666666666666664e-02 122 9 4.1666666666666664e-02 122 90 -4.1666666666666664e-02 122 42 -4.1666666666666664e-02 122 123 -4.1666666666666664e-02 122 121 -8.3333333333333329e-02 122 57 -4.1666666666666664e-02 122 40 -8.3333333333333329e-02 122 513 -8.3333333333333329e-02 122 393 4.1666666666666664e-02 123 123 5.0000000000000000e-01 123 121 -4.1666666666666664e-02 123 11 -1.2499999999999999e-01 123 126 -4.1666666666666664e-02 123 122 -4.1666666666666664e-02 123 495 -4.1666666666666664e-02 123 513 -4.1666666666666664e-02 123 514 -4.1666666666666664e-02 123 393 -1.2499999999999999e-01 124 124 6.6666666666666674e-01 124 144 -4.1666666666666664e-02 124 140 -4.1666666666666664e-02 124 117 -4.1666666666666664e-02 124 146 -4.1666666666666664e-02 124 60 -8.3333333333333329e-02 124 59 -4.1666666666666664e-02 124 125 -4.1666666666666664e-02 124 46 -8.3333333333333329e-02 124 9 4.1666666666666664e-02 124 14 4.1666666666666664e-02 124 186 -8.3333333333333329e-02 124 180 4.1666666666666664e-02 124 372 -8.3333333333333329e-02 124 516 -4.1666666666666664e-02 124 383 4.1666666666666664e-02 124 263 -8.3333333333333329e-02 124 420 -4.1666666666666664e-02 124 445 -8.3333333333333329e-02 125 125 5.0000000000000000e-01 125 46 -4.1666666666666664e-02 125 118 -4.1666666666666664e-02 125 121 -4.1666666666666664e-02 125 126 -4.1666666666666664e-02 125 60 -4.1666666666666664e-02 125 124 -4.1666666666666664e-02 125 9 -1.2499999999999999e-01 125 372 -1.2499999999999999e-01 126 126 6.6666666666666674e-01 126 134 -4.1666666666666664e-02 126 125 -4.1666666666666664e-02 126 11 -8.3333333333333329e-02 126 41 -4.1666666666666664e-02 126 9 4.1666666666666664e-02 126 123 -4.1666666666666664e-02 126 121 -8.3333333333333329e-02 126 127 -4.1666666666666664e-02 126 60 -8.3333333333333329e-02 126 417 -4.1666666666666664e-02 126 370 4.1666666666666664e-02 126 372 -8.3333333333333329e-02 126 495 -8.3333333333333329e-02 126 516 -4.1666666666666664e-02 126 444 -8.3333333333333329e-02 126 500 -4.1666666666666664e-02 126 393 4.1666666666666664e-02 126 383 4.1666666666666664e-02 127 127 5.0000000000000000e-01 127 39 -4.1666666666666664e-02 127 60 -4.1666666666666664e-02 127 11 -1.2499999999999999e-01 127 126 -4.1666666666666664e-02 127 444 -4.1666666666666664e-02 127 537 -4.1666666666666664e-02 127 480 -4.1666666666666664e-02 127 383 -1.2499999999999999e-01 128 128 1.0000000000000000e+00 129 129 1.0000000000000000e+00 130 130 5.0000000000000000e-01 130 103 -4.1666666666666664e-02 130 13 -1.2499999999999999e-01 130 511 -4.1666666666666664e-02 130 513 -4.1666666666666664e-02 131 131 1.0000000000000000e+00 132 132 5.0000000000000000e-01 132 122 -4.1666666666666664e-02 132 11 -1.2499999999999999e-01 132 513 -4.1666666666666664e-02 132 514 -4.1666666666666664e-02 133 133 5.0000000000000000e-01 133 11 -1.2499999999999999e-01 133 537 -4.1666666666666664e-02 133 433 -4.1666666666666664e-02 133 514 -4.1666666666666664e-02 134 134 5.0000000000000000e-01 134 126 -4.1666666666666664e-02 134 11 -1.2499999999999999e-01 134 433 -4.1666666666666664e-02 134 514 -4.1666666666666664e-02 134 495 -4.1666666666666664e-02 134 444 -4.1666666666666664e-02 134 537 -4.1666666666666664e-02 134 370 -1.2499999999999999e-01 135 135 9.9999999999999978e-01 135 136 -1.6666666666666666e-01 135 478 -1.6666666666666666e-01 135 602 -1.6666666666666666e-01 135 446 -1.6666666666666666e-01 135 689 -1.6666666666666666e-01 135 763 -1.6666666666666666e-01 136 136 6.6666666666666685e-01 136 144 -4.1666666666666664e-02 136 143 -4.1666666666666664e-02 136 59 -4.1666666666666664e-02 136 14 2.0833333333333332e-02 136 135 -1.6666666666666666e-01 136 335 -4.1666666666666664e-02 136 628 2.0833333333333332e-02 136 186 -8.3333333333333329e-02 136 383 2.0833333333333332e-02 136 479 -8.3333333333333329e-02 136 232 -8.3333333333333329e-02 136 174 2.0833333333333332e-02 136 445 -8.3333333333333329e-02 136 760 -8.3333333333333329e-02 137 137 5.0000000000000000e-01 137 139 -4.1666666666666664e-02 137 17 -1.2499999999999999e-01 137 227 -4.1666666666666664e-02 137 328 -4.1666666666666664e-02 137 329 -4.1666666666666664e-02 137 301 -4.1666666666666664e-02 137 303 -4.1666666666666664e-02 137 163 -1.2499999999999999e-01 138 138 5.0000000000000000e-01 138 45 -4.1666666666666664e-02 138 46 -4.1666666666666664e-02 138 17 -1.2499999999999999e-01 138 139 -4.1666666666666664e-02 138 262 -4.1666666666666664e-02 138 301 -4.1666666666666664e-02 138 303 -4.1666666666666664e-02 138 180 -1.2499999999999999e-01 139 139 6.6666666666666674e-01 139 146 -4.1666666666666664e-02 139 65 -4.1666666666666664e-02 139 9 4.1666666666666664e-02 139 17 -8.3333333333333329e-02 139 137 -4.1666666666666664e-02 139 147 -8.3333333333333329e-02 139 138 -4.1666666666666664e-02 139 46 -8.3333333333333329e-02 139 141 -4.1666666666666664e-02 139 140 -4.1666666666666664e-02 139 186 -8.3333333333333329e-02 139 336 -4.1666666666666664e-02 139 163 4.1666666666666664e-02 139 337 -4.1666666666666664e-02 139 329 -8.3333333333333329e-02 139 179 4.1666666666666664e-02 139 301 -8.3333333333333329e-02 139 180 4.1666666666666664e-02 140 140 5.0000000000000000e-01 140 46 -4.1666666666666664e-02 140 124 -4.1666666666666664e-02 140 139 -4.1666666666666664e-02 140 263 -4.1666666666666664e-02 140 208 -4.1666666666666664e-02 140 301 -4.1666666666666664e-02 140 186 -1.2499999999999999e-01 140 180 -1.2499999999999999e-01 141 141 5.0000000000000000e-01 141 147 -4.1666666666666664e-02 141 17 -1.2499999999999999e-01 141 149 -4.1666666666666664e-02 141 139 -4.1666666666666664e-02 141 327 -4.1666666666666664e-02 141 329 -4.1666666666666664e-02 141 328 -4.1666666666666664e-02 141 179 -1.2499999999999999e-01 142 142 5.0000000000000000e-01 142 17 -1.2499999999999999e-01 142 303 -4.1666666666666664e-02 142 227 -4.1666666666666664e-02 142 328 -4.1666666666666664e-02 143 143 5.0000000000000000e-01 143 145 -4.1666666666666664e-02 143 136 -4.1666666666666664e-02 143 232 -4.1666666666666664e-02 143 333 -4.1666666666666664e-02 143 338 -4.1666666666666664e-02 143 186 -1.2499999999999999e-01 143 479 -4.1666666666666664e-02 143 174 -1.2499999999999999e-01 144 144 5.0000000000000000e-01 144 124 -4.1666666666666664e-02 144 60 -4.1666666666666664e-02 144 136 -4.1666666666666664e-02 144 145 -4.1666666666666664e-02 144 445 -4.1666666666666664e-02 144 479 -4.1666666666666664e-02 144 186 -1.2499999999999999e-01 144 383 -1.2499999999999999e-01 145 145 6.6666666666666674e-01 145 61 -4.1666666666666664e-02 145 146 -4.1666666666666664e-02 145 9 4.1666666666666664e-02 145 143 -4.1666666666666664e-02 145 15 -8.3333333333333329e-02 145 74 -4.1666666666666664e-02 145 113 -4.1666666666666664e-02 145 147 -8.3333333333333329e-02 145 144 -4.1666666666666664e-02 145 60 -8.3333333333333329e-02 145 62 -4.1666666666666664e-02 145 186 -8.3333333333333329e-02 145 174 4.1666666666666664e-02 145 337 -4.1666666666666664e-02 145 338 -8.3333333333333329e-02 145 179 4.1666666666666664e-02 145 479 -8.3333333333333329e-02 145 383 4.1666666666666664e-02 146 146 5.0000000000000000e-01 146 60 -4.1666666666666664e-02 146 145 -4.1666666666666664e-02 146 147 -4.1666666666666664e-02 146 139 -4.1666666666666664e-02 146 46 -4.1666666666666664e-02 146 124 -4.1666666666666664e-02 146 9 -1.2499999999999999e-01 146 186 -1.2499999999999999e-01 147 147 6.6666666666666674e-01 147 111 -4.1666666666666664e-02 147 148 -4.1666666666666664e-02 147 18 4.1666666666666664e-02 147 113 -4.1666666666666664e-02 147 61 -4.1666666666666664e-02 147 15 4.1666666666666664e-02 147 146 -4.1666666666666664e-02 147 65 -4.1666666666666664e-02 147 141 -4.1666666666666664e-02 147 17 4.1666666666666664e-02 147 9 -8.3333333333333329e-02 147 149 -8.3333333333333329e-02 147 110 -8.3333333333333329e-02 147 145 -8.3333333333333329e-02 147 139 -8.3333333333333329e-02 147 337 -4.1666666666666664e-02 147 186 4.1666666666666664e-02 147 179 -8.3333333333333329e-02 148 148 5.0000000000000000e-01 148 64 -4.1666666666666664e-02 148 149 -4.1666666666666664e-02 148 147 -4.1666666666666664e-02 148 110 -4.1666666666666664e-02 148 18 -1.2499999999999999e-01 148 40 -4.1666666666666664e-02 148 119 -4.1666666666666664e-02 148 9 -1.2499999999999999e-01 149 149 6.6666666666666674e-01 149 78 -4.1666666666666664e-02 149 151 -4.1666666666666664e-02 149 17 -8.3333333333333329e-02 149 65 -4.1666666666666664e-02 149 18 -8.3333333333333329e-02 149 148 -4.1666666666666664e-02 149 9 4.1666666666666664e-02 149 111 -4.1666666666666664e-02 149 66 -4.1666666666666664e-02 149 141 -4.1666666666666664e-02 149 147 -8.3333333333333329e-02 149 79 -4.1666666666666664e-02 149 64 -8.3333333333333329e-02 149 327 -8.3333333333333329e-02 149 179 4.1666666666666664e-02 150 150 1.0000000000000000e+00 151 151 5.0000000000000000e-01 151 149 -4.1666666666666664e-02 151 17 -1.2499999999999999e-01 151 327 -4.1666666666666664e-02 151 328 -4.1666666666666664e-02 152 152 9.9999999999999978e-01 152 590 -1.6666666666666666e-01 152 608 -1.6666666666666666e-01 152 507 -1.6666666666666666e-01 152 811 -1.6666666666666666e-01 152 807 -1.6666666666666666e-01 152 357 -1.6666666666666666e-01 hypre-2.33.0/src/test/TEST_ams/mfem.Aalpha.00001000066400000000000000000001134451477326011500206240ustar00rootroot00000000000000153 365 153 365 153 153 1.0000000000000000e+00 154 154 2.0000000000000000e+00 155 155 2.0000000000000000e+00 156 156 1.0000000000000007e+00 156 283 4.1666666666666664e-02 156 338 4.1666666666666664e-02 156 353 -1.2499999999999999e-01 156 282 -8.3333333333333329e-02 156 281 4.1666666666666664e-02 156 348 -1.2499999999999999e-01 156 347 -8.3333333333333329e-02 156 314 4.1666666666666664e-02 156 344 -8.3333333333333329e-02 156 342 -1.2499999999999999e-01 156 341 -1.2499999999999999e-01 156 253 -1.2499999999999999e-01 156 252 4.1666666666666664e-02 156 251 -8.3333333333333329e-02 156 193 -1.2499999999999999e-01 156 191 -1.2499999999999999e-01 156 190 -1.2499999999999999e-01 157 157 2.0000000000000000e+00 158 158 1.0000000000000004e+00 158 207 -1.4583333333333331e-01 158 206 2.0833333333333332e-02 158 246 2.0833333333333332e-02 158 299 -4.1666666666666664e-02 158 294 -1.4583333333333331e-01 158 243 2.0833333333333332e-02 158 278 -4.1666666666666664e-02 158 272 -1.4583333333333331e-01 158 202 -1.8750000000000000e-01 158 201 -2.0833333333333331e-01 158 197 -1.6666666666666666e-01 158 812 2.0833333333333332e-02 159 159 1.0000000000000000e+00 160 160 1.0000000000000000e+00 161 161 3.0000000000000000e+00 162 162 1.0000000000000000e+00 163 163 1.0000000000000002e+00 163 328 4.1666666666666664e-02 163 329 -8.3333333333333329e-02 163 207 -1.4583333333333331e-01 163 334 -8.3333333333333329e-02 163 227 -1.2499999999999999e-01 163 303 2.0833333333333332e-02 163 336 -1.2500000000000000e-01 163 301 -1.2500000000000000e-01 163 208 0.0000000000000000e+00 163 361 4.1666666666666664e-02 163 333 4.1666666666666664e-02 163 313 4.1666666666666664e-02 163 292 2.0833333333333332e-02 163 299 -4.1666666666666664e-02 163 206 -6.2500000000000000e-02 163 200 2.0833333333333332e-02 163 332 -1.2499999999999999e-01 163 228 -1.2499999999999999e-01 163 331 -1.0416666666666666e-01 163 139 4.1666666666666664e-02 163 137 -1.2499999999999999e-01 164 164 1.0000000000000000e+00 165 165 1.0000000000000000e+00 166 166 1.0000000000000000e+00 167 167 1.0000000000000000e+00 168 168 1.0000000000000000e+00 169 169 1.0000000000000007e+00 169 252 4.1666666666666664e-02 169 351 -1.2499999999999999e-01 169 345 -1.2499999999999999e-01 169 344 -8.3333333333333329e-02 169 327 4.1666666666666664e-02 169 326 -8.3333333333333329e-02 169 324 -1.2499999999999999e-01 169 323 -1.2499999999999999e-01 169 320 -1.2499999999999999e-01 169 314 4.1666666666666664e-02 169 319 -8.3333333333333329e-02 169 219 -1.2499999999999999e-01 169 217 -1.2499999999999999e-01 169 216 -1.2499999999999999e-01 170 170 1.0000000000000000e+00 171 171 2.0000000000000000e+00 172 172 1.0000000000000007e+00 172 331 4.1666666666666664e-02 172 329 4.1666666666666664e-02 172 328 -8.3333333333333329e-02 172 327 4.1666666666666664e-02 172 319 -8.3333333333333329e-02 172 318 -1.2499999999999999e-01 172 314 4.1666666666666664e-02 172 313 -8.3333333333333329e-02 172 311 -1.2499999999999999e-01 172 310 -1.2499999999999999e-01 172 229 -1.2499999999999999e-01 172 228 -1.2499999999999999e-01 172 226 -8.3333333333333329e-02 172 227 4.1666666666666664e-02 172 225 -1.2499999999999999e-01 172 223 -1.2499999999999999e-01 172 222 -1.2499999999999999e-01 173 173 2.0000000000000000e+00 174 174 9.9999999999999967e-01 174 251 4.1666666666666664e-02 174 333 4.1666666666666664e-02 174 338 -8.3333333333333329e-02 174 300 -1.4583333333333331e-01 174 283 -8.3333333333333329e-02 174 232 -1.2499999999999999e-01 174 287 0.0000000000000000e+00 174 347 4.1666666666666664e-02 174 280 4.1666666666666664e-02 174 279 -4.1666666666666664e-02 174 353 -1.2499999999999999e-01 174 233 -1.2499999999999999e-01 174 281 -1.0416666666666667e-01 174 145 4.1666666666666664e-02 174 143 -1.2499999999999999e-01 174 136 2.0833333333333332e-02 174 74 -1.2499999999999999e-01 174 479 -1.2500000000000000e-01 174 481 -6.2500000000000000e-02 174 477 2.0833333333333332e-02 174 688 2.0833333333333332e-02 175 175 1.0000000000000007e+00 175 281 4.1666666666666664e-02 175 347 -8.3333333333333329e-02 175 338 4.1666666666666664e-02 175 334 4.1666666666666664e-02 175 333 -8.3333333333333329e-02 175 329 4.1666666666666664e-02 175 332 -1.2499999999999999e-01 175 330 -8.3333333333333329e-02 175 331 4.1666666666666664e-02 175 316 -1.2499999999999999e-01 175 315 -1.2499999999999999e-01 175 313 -8.3333333333333329e-02 175 314 4.1666666666666664e-02 175 239 -1.2499999999999999e-01 175 238 -1.2499999999999999e-01 175 235 -1.2499999999999999e-01 175 234 -1.2499999999999999e-01 175 233 -1.2499999999999999e-01 175 231 -8.3333333333333329e-02 175 232 4.1666666666666664e-02 175 693 4.1666666666666664e-02 176 176 1.0000000000000000e+00 177 177 1.0000000000000000e+00 178 178 1.0000000000000000e+00 179 179 9.9999999999999956e-01 179 333 4.1666666666666664e-02 179 327 -8.3333333333333329e-02 179 328 4.1666666666666664e-02 179 251 4.1666666666666664e-02 179 326 4.1666666666666664e-02 179 337 -1.2499999999999999e-01 179 338 -8.3333333333333329e-02 179 329 -8.3333333333333329e-02 179 252 -8.3333333333333329e-02 179 347 4.1666666666666664e-02 179 344 4.1666666666666664e-02 179 315 -1.2499999999999999e-01 179 320 -1.2499999999999999e-01 179 319 4.1666666666666664e-02 179 318 -1.2499999999999999e-01 179 314 -8.3333333333333329e-02 179 313 4.1666666666666664e-02 179 253 -1.2499999999999999e-01 179 149 4.1666666666666664e-02 179 111 -1.2499999999999999e-01 179 147 -8.3333333333333329e-02 179 145 4.1666666666666664e-02 179 141 -1.2499999999999999e-01 179 139 4.1666666666666664e-02 179 113 -1.2499999999999999e-01 179 110 4.1666666666666664e-02 180 180 1.0000000000000002e+00 180 260 -1.6666666666666666e-01 180 208 2.0833333333333332e-02 180 303 2.0833333333333332e-02 180 263 -1.2500000000000000e-01 180 262 -1.2500000000000000e-01 180 301 -1.2500000000000000e-01 180 124 4.1666666666666664e-02 180 33 2.0833333333333332e-02 180 507 2.0833333333333332e-02 180 45 4.1666666666666664e-02 180 138 -1.2499999999999999e-01 180 140 -1.2499999999999999e-01 180 139 4.1666666666666664e-02 180 117 -1.2499999999999999e-01 180 46 -8.3333333333333329e-02 180 48 -1.2499999999999999e-01 180 81 -1.2500000000000000e-01 180 118 4.1666666666666664e-02 181 181 1.0000000000000000e+00 182 182 1.0000000000000000e+00 183 183 3.0000000000000000e+00 184 184 1.0000000000000000e+00 185 185 2.0000000000000000e+00 186 186 1.0000000000000004e+00 186 232 4.1666666666666664e-02 186 333 -8.3333333333333329e-02 186 338 4.1666666666666664e-02 186 263 4.1666666666666664e-02 186 301 4.1666666666666664e-02 186 337 -1.2499999999999999e-01 186 329 4.1666666666666664e-02 186 335 -1.2499999999999999e-01 186 336 -1.2500000000000000e-01 186 208 -8.3333333333333329e-02 186 334 4.1666666666666664e-02 186 60 4.1666666666666664e-02 186 147 4.1666666666666664e-02 186 146 -1.2499999999999999e-01 186 124 -8.3333333333333329e-02 186 46 4.1666666666666664e-02 186 145 -8.3333333333333329e-02 186 445 4.1666666666666664e-02 186 144 -1.2499999999999999e-01 186 143 -1.2499999999999999e-01 186 136 -8.3333333333333329e-02 186 479 4.1666666666666664e-02 186 140 -1.2499999999999999e-01 186 139 -8.3333333333333329e-02 186 59 -1.2499999999999999e-01 186 760 4.1666666666666664e-02 187 187 1.0000000000000000e+00 188 188 1.0000000000000000e+00 189 189 2.0000000000000000e+00 190 190 5.0000000000000000e-01 190 344 -4.1666666666666664e-02 190 252 -4.1666666666666664e-02 190 251 -4.1666666666666664e-02 190 156 -1.2499999999999999e-01 191 191 5.0000000000000000e-01 191 282 -4.1666666666666664e-02 191 283 -4.1666666666666664e-02 191 156 -1.2499999999999999e-01 191 251 -4.1666666666666664e-02 192 192 1.0000000000000000e+00 193 193 5.0000000000000000e-01 193 156 -1.2499999999999999e-01 193 282 -4.1666666666666664e-02 194 194 1.0000000000000004e+00 194 303 -1.6666666666666666e-01 194 259 -1.6666666666666666e-01 194 302 -1.6666666666666666e-01 194 195 -1.6666666666666666e-01 194 261 -1.6666666666666666e-01 195 195 6.6666666666666652e-01 195 201 -8.3333333333333329e-02 195 197 -8.3333333333333329e-02 195 256 -1.6666666666666666e-01 195 257 -8.3333333333333329e-02 195 194 -1.6666666666666666e-01 196 196 1.0000000000000000e+00 197 197 6.6666666666666652e-01 197 302 -8.3333333333333329e-02 197 264 -8.3333333333333329e-02 197 210 -8.3333333333333329e-02 197 195 -8.3333333333333329e-02 197 158 -1.6666666666666666e-01 198 198 1.0000000000000000e+00 199 199 1.0000000000000000e+00 200 200 1.0000000000000004e+00 200 163 2.0833333333333332e-02 200 208 -1.2499999999999999e-01 200 259 -1.6666666666666666e-01 200 206 -2.4999999999999997e-01 200 14 -8.3333333333333329e-02 200 667 -8.3333333333333329e-02 200 619 4.1666666666666664e-02 200 811 -1.2499999999999999e-01 200 812 -2.4999999999999997e-01 200 649 2.0833333333333332e-02 201 201 7.5000000000000000e-01 201 259 -8.3333333333333329e-02 201 195 -8.3333333333333329e-02 201 158 -2.0833333333333331e-01 201 243 -8.3333333333333329e-02 201 812 -8.3333333333333329e-02 201 649 -2.0833333333333331e-01 202 202 7.0833333333333337e-01 202 278 -8.3333333333333329e-02 202 206 -8.3333333333333329e-02 202 158 -1.8750000000000000e-01 202 246 -8.3333333333333329e-02 202 812 -8.3333333333333329e-02 202 619 -1.8749999999999997e-01 203 203 1.0000000000000000e+00 204 204 1.0000000000000000e+00 205 205 1.0000000000000000e+00 206 206 1.0416666666666672e+00 206 255 -4.1666666666666671e-02 206 330 -4.1666666666666664e-02 206 361 -2.0833333333333331e-01 206 158 2.0833333333333332e-02 206 299 -4.1666666666666671e-02 206 163 -6.2500000000000000e-02 206 208 -4.1666666666666664e-02 206 202 -8.3333333333333329e-02 206 207 -8.3333333333333329e-02 206 334 -8.3333333333333329e-02 206 200 -2.4999999999999997e-01 206 628 -8.3333333333333329e-02 206 14 8.3333333333333329e-02 206 761 -8.3333333333333329e-02 206 667 -4.1666666666666664e-02 206 619 -8.3333333333333329e-02 207 207 6.2500000000000000e-01 207 158 -1.4583333333333331e-01 207 259 -8.3333333333333329e-02 207 163 -1.4583333333333331e-01 207 302 -8.3333333333333329e-02 207 299 -8.3333333333333329e-02 207 206 -8.3333333333333329e-02 208 208 7.0833333333333326e-01 208 263 -8.3333333333333329e-02 208 180 2.0833333333333332e-02 208 186 -8.3333333333333329e-02 208 335 -4.1666666666666664e-02 208 334 -8.3333333333333329e-02 208 336 -4.1666666666666664e-02 208 301 -8.3333333333333329e-02 208 163 0.0000000000000000e+00 208 206 -4.1666666666666664e-02 208 200 -1.2499999999999999e-01 208 140 -4.1666666666666664e-02 208 628 4.1666666666666664e-02 208 59 -4.1666666666666664e-02 208 760 -8.3333333333333329e-02 208 14 -2.0833333333333332e-02 209 209 1.0000000000000007e+00 209 210 -1.6666666666666666e-01 209 270 -1.6666666666666666e-01 209 264 -1.6666666666666666e-01 210 210 6.6666666666666652e-01 210 294 -8.3333333333333329e-02 210 197 -8.3333333333333329e-02 210 292 -1.6666666666666666e-01 210 209 -1.6666666666666666e-01 211 211 1.0000000000000000e+00 212 212 1.0000000000000000e+00 213 213 1.0000000000000000e+00 214 214 1.0000000000000000e+00 215 215 1.0000000000000000e+00 216 216 5.0000000000000000e-01 216 344 -4.1666666666666664e-02 216 314 -4.1666666666666664e-02 216 319 -4.1666666666666664e-02 216 169 -1.2499999999999999e-01 217 217 5.0000000000000000e-01 217 169 -1.2499999999999999e-01 217 319 -4.1666666666666664e-02 218 218 1.0000000000000000e+00 219 219 5.0000000000000000e-01 219 169 -1.2499999999999999e-01 220 220 1.0000000000000000e+00 221 221 1.0000000000000000e+00 222 222 5.0000000000000000e-01 222 328 -4.1666666666666664e-02 222 327 -4.1666666666666664e-02 222 319 -4.1666666666666664e-02 222 172 -1.2499999999999999e-01 223 223 5.0000000000000000e-01 223 172 -1.2499999999999999e-01 223 319 -4.1666666666666664e-02 224 224 1.0000000000000000e+00 225 225 5.0000000000000000e-01 225 172 -1.2499999999999999e-01 225 226 -4.1666666666666664e-02 226 226 7.0833333333333370e-01 226 311 -4.1666666666666664e-02 226 292 -1.2499999999999999e-01 226 172 -8.3333333333333329e-02 226 229 -4.1666666666666664e-02 226 227 -8.3333333333333329e-02 226 228 -4.1666666666666664e-02 226 331 -8.3333333333333329e-02 226 299 -4.1666666666666664e-02 226 225 -4.1666666666666664e-02 227 227 6.6666666666666663e-01 227 303 -8.3333333333333329e-02 227 163 -1.2499999999999999e-01 227 328 -8.3333333333333329e-02 227 229 -4.1666666666666664e-02 227 228 -4.1666666666666664e-02 227 172 4.1666666666666664e-02 227 226 -8.3333333333333329e-02 227 302 -8.3333333333333329e-02 227 142 -4.1666666666666664e-02 227 137 -4.1666666666666664e-02 227 17 4.1666666666666664e-02 228 228 5.0000000000000000e-01 228 331 -4.1666666666666664e-02 228 313 -4.1666666666666664e-02 228 329 -4.1666666666666664e-02 228 328 -4.1666666666666664e-02 228 172 -1.2499999999999999e-01 228 227 -4.1666666666666664e-02 228 226 -4.1666666666666664e-02 228 163 -1.2499999999999999e-01 229 229 5.0000000000000000e-01 229 227 -4.1666666666666664e-02 229 172 -1.2499999999999999e-01 229 226 -4.1666666666666664e-02 229 328 -4.1666666666666664e-02 230 230 1.0000000000000000e+00 231 231 7.0833333333333359e-01 231 239 -4.1666666666666664e-02 231 175 -8.3333333333333329e-02 231 234 -4.1666666666666664e-02 231 232 -8.3333333333333329e-02 231 233 -4.1666666666666664e-02 231 281 -8.3333333333333329e-02 231 279 -4.1666666666666671e-02 231 235 -4.1666666666666664e-02 231 688 -1.2500000000000000e-01 231 628 2.0833333333333332e-02 231 693 -8.3333333333333329e-02 232 232 6.6666666666666652e-01 232 335 -4.1666666666666664e-02 232 186 4.1666666666666664e-02 232 174 -1.2499999999999999e-01 232 333 -8.3333333333333329e-02 232 234 -4.1666666666666664e-02 232 233 -4.1666666666666664e-02 232 175 4.1666666666666664e-02 232 231 -8.3333333333333329e-02 232 143 -4.1666666666666664e-02 232 689 -8.3333333333333329e-02 232 136 -8.3333333333333329e-02 232 628 -1.2499999999999999e-01 233 233 5.0000000000000000e-01 233 281 -4.1666666666666664e-02 233 347 -4.1666666666666664e-02 233 338 -4.1666666666666664e-02 233 333 -4.1666666666666664e-02 233 175 -1.2499999999999999e-01 233 232 -4.1666666666666664e-02 233 231 -4.1666666666666664e-02 233 174 -1.2499999999999999e-01 234 234 5.0000000000000000e-01 234 330 -4.1666666666666664e-02 234 334 -4.1666666666666664e-02 234 232 -4.1666666666666664e-02 234 175 -1.2499999999999999e-01 234 231 -4.1666666666666664e-02 234 333 -4.1666666666666664e-02 234 693 -4.1666666666666664e-02 234 628 -1.2499999999999999e-01 235 235 5.0000000000000000e-01 235 175 -1.2499999999999999e-01 235 330 -4.1666666666666664e-02 235 231 -4.1666666666666664e-02 235 693 -4.1666666666666664e-02 236 236 1.0000000000000000e+00 237 237 1.0000000000000000e+00 238 238 5.0000000000000000e-01 238 347 -4.1666666666666664e-02 238 314 -4.1666666666666664e-02 238 313 -4.1666666666666664e-02 238 175 -1.2499999999999999e-01 239 239 5.0000000000000000e-01 239 231 -4.1666666666666664e-02 239 281 -4.1666666666666664e-02 239 175 -1.2499999999999999e-01 239 347 -4.1666666666666664e-02 240 240 1.0000000000000000e+00 241 241 5.8333333333333337e-01 241 242 -8.3333333333333329e-02 241 243 -8.3333333333333329e-02 241 810 -8.3333333333333329e-02 241 802 -8.3333333333333329e-02 241 649 -1.2499999999999999e-01 242 242 7.0833333333333315e-01 242 257 -8.3333333333333329e-02 242 243 -4.1666666666666671e-02 242 256 -1.2500000000000000e-01 242 241 -8.3333333333333329e-02 242 649 -2.0833333333333332e-02 242 710 -1.6666666666666666e-01 243 243 1.0416666666666665e+00 243 278 -4.1666666666666664e-02 243 158 2.0833333333333332e-02 243 242 -4.1666666666666671e-02 243 358 -2.0833333333333331e-01 243 201 -8.3333333333333329e-02 243 256 -2.5000000000000000e-01 243 272 -8.3333333333333329e-02 243 241 -8.3333333333333329e-02 243 810 -4.1666666666666664e-02 243 649 -8.3333333333333329e-02 244 244 1.0000000000000000e+00 245 245 1.0000000000000000e+00 246 246 1.0416666666666665e+00 246 299 -4.1666666666666664e-02 246 158 2.0833333333333332e-02 246 249 -4.1666666666666671e-02 246 255 -4.1666666666666664e-02 246 361 -2.0833333333333331e-01 246 202 -8.3333333333333329e-02 246 269 -2.5000000000000000e-01 246 294 -8.3333333333333329e-02 246 250 -8.3333333333333329e-02 246 619 -8.3333333333333329e-02 247 247 1.0000000000000000e+00 248 248 1.0000000000000000e+00 249 249 7.4999999999999989e-01 249 269 -8.3333333333333329e-02 249 254 -8.3333333333333329e-02 249 246 -4.1666666666666671e-02 249 278 -4.1666666666666664e-02 249 250 -8.3333333333333329e-02 249 619 -4.1666666666666664e-02 249 669 -1.6666666666666666e-01 250 250 5.8333333333333337e-01 250 255 -8.3333333333333329e-02 250 249 -8.3333333333333329e-02 250 246 -8.3333333333333329e-02 250 842 -8.3333333333333329e-02 250 619 -1.2499999999999999e-01 251 251 6.6666666666666652e-01 251 283 -8.3333333333333329e-02 251 174 4.1666666666666664e-02 251 252 -8.3333333333333329e-02 251 338 -8.3333333333333329e-02 251 179 4.1666666666666664e-02 251 353 -4.1666666666666664e-02 251 156 -8.3333333333333329e-02 251 190 -4.1666666666666664e-02 251 191 -4.1666666666666664e-02 251 253 -4.1666666666666664e-02 251 74 -4.1666666666666664e-02 251 15 -8.3333333333333329e-02 251 108 -4.1666666666666664e-02 251 113 -4.1666666666666664e-02 251 75 -4.1666666666666664e-02 252 252 6.6666666666666652e-01 252 251 -8.3333333333333329e-02 252 326 -8.3333333333333329e-02 252 179 -8.3333333333333329e-02 252 320 -4.1666666666666664e-02 252 351 -4.1666666666666664e-02 252 169 4.1666666666666664e-02 252 253 -4.1666666666666664e-02 252 190 -4.1666666666666664e-02 252 156 4.1666666666666664e-02 252 344 -8.3333333333333329e-02 252 113 -4.1666666666666664e-02 252 108 -4.1666666666666664e-02 252 15 4.1666666666666664e-02 252 70 -4.1666666666666664e-02 252 111 -4.1666666666666664e-02 252 18 4.1666666666666664e-02 252 110 -8.3333333333333329e-02 253 253 5.0000000000000000e-01 253 338 -4.1666666666666664e-02 253 314 -4.1666666666666664e-02 253 252 -4.1666666666666664e-02 253 156 -1.2499999999999999e-01 253 347 -4.1666666666666664e-02 253 344 -4.1666666666666664e-02 253 251 -4.1666666666666664e-02 253 179 -1.2499999999999999e-01 254 254 6.2500000000000000e-01 254 278 -8.3333333333333329e-02 254 249 -8.3333333333333329e-02 254 750 -8.3333333333333329e-02 254 619 -1.4583333333333331e-01 254 670 -8.3333333333333329e-02 255 255 7.5000000000000000e-01 255 206 -4.1666666666666671e-02 255 250 -8.3333333333333329e-02 255 246 -4.1666666666666664e-02 255 361 -8.3333333333333329e-02 255 628 2.0833333333333332e-02 255 619 -4.1666666666666664e-02 255 761 -8.3333333333333329e-02 255 693 -8.3333333333333329e-02 255 764 -1.6666666666666666e-01 256 256 1.0000000000000002e+00 256 243 -2.5000000000000000e-01 256 264 -1.6666666666666666e-01 256 195 -1.6666666666666666e-01 256 242 -1.2500000000000000e-01 256 649 2.0833333333333332e-02 257 257 6.6666666666666652e-01 257 261 -8.3333333333333329e-02 257 242 -8.3333333333333329e-02 257 356 -8.3333333333333329e-02 257 195 -8.3333333333333329e-02 257 649 -1.6666666666666666e-01 258 258 1.0000000000000000e+00 259 259 6.6666666666666663e-01 259 207 -8.3333333333333329e-02 259 301 -8.3333333333333329e-02 259 194 -1.6666666666666666e-01 259 201 -8.3333333333333329e-02 259 260 -8.3333333333333329e-02 259 200 -1.6666666666666666e-01 260 260 6.6666666666666663e-01 260 180 -1.6666666666666666e-01 260 357 -8.3333333333333329e-02 260 261 -8.3333333333333329e-02 260 259 -8.3333333333333329e-02 260 811 -8.3333333333333329e-02 260 649 -1.6666666666666666e-01 261 261 6.6666666666666652e-01 261 257 -8.3333333333333329e-02 261 260 -8.3333333333333329e-02 261 355 -1.6666666666666666e-01 261 262 -8.3333333333333329e-02 261 194 -1.6666666666666666e-01 262 262 6.6666666666666652e-01 262 180 -1.2500000000000000e-01 262 303 -8.3333333333333329e-02 262 261 -8.3333333333333329e-02 262 68 -4.1666666666666664e-02 262 138 -4.1666666666666664e-02 262 17 4.1666666666666664e-02 262 38 -4.1666666666666664e-02 262 48 -4.1666666666666664e-02 262 8 4.1666666666666664e-02 262 33 -8.3333333333333329e-02 262 45 -8.3333333333333329e-02 263 263 6.6666666666666663e-01 263 186 4.1666666666666664e-02 263 208 -8.3333333333333329e-02 263 180 -1.2500000000000000e-01 263 140 -4.1666666666666664e-02 263 59 -4.1666666666666664e-02 263 420 -4.1666666666666664e-02 263 117 -4.1666666666666664e-02 263 372 4.1666666666666664e-02 263 811 -8.3333333333333329e-02 263 124 -8.3333333333333329e-02 263 507 -8.3333333333333329e-02 263 14 -1.2500000000000000e-01 264 264 6.6666666666666652e-01 264 272 -8.3333333333333329e-02 264 197 -8.3333333333333329e-02 264 256 -1.6666666666666666e-01 264 209 -1.6666666666666666e-01 265 265 1.0000000000000000e+00 266 266 1.0000000000000000e+00 267 267 1.0000000000000000e+00 268 268 1.0000000000000000e+00 269 269 1.0000000000000002e+00 269 249 -8.3333333333333329e-02 269 246 -2.5000000000000000e-01 269 270 -1.6666666666666666e-01 269 278 -2.5000000000000000e-01 269 619 4.1666666666666664e-02 270 270 6.6666666666666652e-01 270 294 -8.3333333333333329e-02 270 272 -8.3333333333333329e-02 270 269 -1.6666666666666666e-01 270 209 -1.6666666666666666e-01 271 271 1.0000000000000000e+00 272 272 6.2500000000000000e-01 272 264 -8.3333333333333329e-02 272 270 -8.3333333333333329e-02 272 158 -1.4583333333333331e-01 272 243 -8.3333333333333329e-02 272 278 -8.3333333333333329e-02 273 273 1.0000000000000000e+00 274 274 1.0000000000000000e+00 275 275 1.0000000000000000e+00 276 276 1.0000000000000000e+00 277 277 1.0000000000000000e+00 278 278 9.9999999999999978e-01 278 254 -8.3333333333333329e-02 278 202 -8.3333333333333329e-02 278 243 -4.1666666666666664e-02 278 158 -4.1666666666666664e-02 278 358 -2.4999999999999997e-01 278 249 -4.1666666666666664e-02 278 269 -2.5000000000000000e-01 278 272 -8.3333333333333329e-02 278 619 -4.1666666666666664e-02 278 812 -4.1666666666666671e-02 278 649 8.3333333333333329e-02 279 279 9.9999999999999978e-01 279 300 -8.3333333333333329e-02 279 174 -4.1666666666666664e-02 279 281 -8.3333333333333329e-02 279 280 -2.4999999999999997e-01 279 231 -4.1666666666666671e-02 279 21 -4.1666666666666664e-02 279 783 -4.1666666666666664e-02 279 481 -4.1666666666666664e-02 279 688 -2.5000000000000000e-01 279 701 -8.3333333333333329e-02 280 280 1.0000000000000002e+00 280 174 4.1666666666666664e-02 280 279 -2.4999999999999997e-01 280 282 -1.2499999999999999e-01 280 481 -2.0833333333333331e-01 280 783 -2.0833333333333331e-01 281 281 6.2500000000000000e-01 281 239 -4.1666666666666664e-02 281 233 -4.1666666666666664e-02 281 175 4.1666666666666664e-02 281 348 -4.1666666666666664e-02 281 353 -4.1666666666666664e-02 281 156 4.1666666666666664e-02 281 279 -8.3333333333333329e-02 281 231 -8.3333333333333329e-02 281 347 -8.3333333333333329e-02 281 282 -8.3333333333333329e-02 281 174 -1.0416666666666667e-01 282 282 7.0833333333333370e-01 282 191 -4.1666666666666664e-02 282 156 -8.3333333333333329e-02 282 348 -4.1666666666666664e-02 282 353 -4.1666666666666664e-02 282 283 -8.3333333333333329e-02 282 193 -4.1666666666666664e-02 282 281 -8.3333333333333329e-02 282 280 -1.2499999999999999e-01 282 481 -4.1666666666666664e-02 283 283 5.8333333333333315e-01 283 251 -8.3333333333333329e-02 283 174 -8.3333333333333329e-02 283 287 -8.3333333333333329e-02 283 191 -4.1666666666666664e-02 283 353 -4.1666666666666664e-02 283 156 4.1666666666666664e-02 283 282 -8.3333333333333329e-02 283 75 -4.1666666666666664e-02 283 74 -4.1666666666666664e-02 283 15 4.1666666666666664e-02 283 481 -8.3333333333333329e-02 284 284 1.0000000000000000e+00 285 285 1.0000000000000000e+00 286 286 2.0000000000000000e+00 287 287 7.0833333333333326e-01 287 283 -8.3333333333333329e-02 287 174 0.0000000000000000e+00 287 62 -4.1666666666666664e-02 287 480 -8.3333333333333329e-02 287 383 2.0833333333333332e-02 287 15 -8.3333333333333329e-02 287 75 -4.1666666666666664e-02 287 74 -4.1666666666666664e-02 287 479 -8.3333333333333329e-02 287 63 -4.1666666666666664e-02 287 477 -1.2500000000000000e-01 287 481 -4.1666666666666664e-02 288 288 1.0000000000000000e+00 289 289 1.0000000000000000e+00 290 290 1.0000000000000000e+00 291 291 1.0000000000000000e+00 292 292 1.0000000000000007e+00 292 226 -1.2499999999999999e-01 292 163 2.0833333333333332e-02 292 210 -1.6666666666666666e-01 292 302 -1.6666666666666666e-01 292 299 -2.5000000000000000e-01 293 293 1.0000000000000000e+00 294 294 6.2500000000000000e-01 294 270 -8.3333333333333329e-02 294 210 -8.3333333333333329e-02 294 158 -1.4583333333333331e-01 294 246 -8.3333333333333329e-02 294 299 -8.3333333333333329e-02 295 295 1.0000000000000000e+00 296 296 1.0000000000000000e+00 297 297 1.0000000000000000e+00 298 298 1.0000000000000000e+00 299 299 9.9999999999999978e-01 299 331 -8.3333333333333329e-02 299 163 -4.1666666666666664e-02 299 207 -8.3333333333333329e-02 299 206 -4.1666666666666671e-02 299 246 -4.1666666666666664e-02 299 158 -4.1666666666666664e-02 299 361 -2.4999999999999997e-01 299 226 -4.1666666666666664e-02 299 292 -2.5000000000000000e-01 299 294 -8.3333333333333329e-02 299 619 8.3333333333333329e-02 300 300 6.2500000000000000e-01 300 174 -1.4583333333333331e-01 300 279 -8.3333333333333329e-02 300 478 -8.3333333333333329e-02 300 689 -8.3333333333333329e-02 300 21 -1.4583333333333331e-01 300 481 -8.3333333333333329e-02 301 301 6.6666666666666641e-01 301 336 -4.1666666666666664e-02 301 186 4.1666666666666664e-02 301 303 -8.3333333333333329e-02 301 208 -8.3333333333333329e-02 301 163 -1.2500000000000000e-01 301 259 -8.3333333333333329e-02 301 180 -1.2500000000000000e-01 301 140 -4.1666666666666664e-02 301 138 -4.1666666666666664e-02 301 137 -4.1666666666666664e-02 301 17 4.1666666666666664e-02 301 139 -8.3333333333333329e-02 302 302 6.6666666666666652e-01 302 197 -8.3333333333333329e-02 302 207 -8.3333333333333329e-02 302 194 -1.6666666666666666e-01 302 227 -8.3333333333333329e-02 302 292 -1.6666666666666666e-01 303 303 6.6666666666666641e-01 303 180 2.0833333333333332e-02 303 301 -8.3333333333333329e-02 303 194 -1.6666666666666666e-01 303 227 -8.3333333333333329e-02 303 163 2.0833333333333332e-02 303 262 -8.3333333333333329e-02 303 142 -4.1666666666666664e-02 303 17 -8.3333333333333329e-02 303 138 -4.1666666666666664e-02 303 137 -4.1666666666666664e-02 303 68 -4.1666666666666664e-02 304 304 2.0000000000000000e+00 305 305 1.0000000000000000e+00 306 306 1.0000000000000000e+00 307 307 7.5000000000000000e-01 307 599 -8.3333333333333329e-02 307 593 -8.3333333333333329e-02 307 481 -8.3333333333333329e-02 307 21 -2.0833333333333331e-01 307 783 -8.3333333333333329e-02 308 308 1.0000000000000000e+00 309 309 1.0000000000000000e+00 310 310 5.0000000000000000e-01 310 319 -4.1666666666666664e-02 310 314 -4.1666666666666664e-02 310 313 -4.1666666666666664e-02 310 172 -1.2499999999999999e-01 311 311 5.0000000000000000e-01 311 226 -4.1666666666666664e-02 311 331 -4.1666666666666664e-02 311 172 -1.2499999999999999e-01 311 313 -4.1666666666666664e-02 312 312 1.0000000000000000e+00 313 313 6.6666666666666674e-01 313 332 -4.1666666666666664e-02 313 228 -4.1666666666666664e-02 313 163 4.1666666666666664e-02 313 172 -8.3333333333333329e-02 313 310 -4.1666666666666664e-02 313 175 -8.3333333333333329e-02 313 238 -4.1666666666666664e-02 313 315 -4.1666666666666664e-02 313 329 -8.3333333333333329e-02 313 311 -4.1666666666666664e-02 313 331 -8.3333333333333329e-02 313 318 -4.1666666666666664e-02 313 314 -8.3333333333333329e-02 313 179 4.1666666666666664e-02 313 316 -4.1666666666666664e-02 314 314 6.6666666666666674e-01 314 253 -4.1666666666666664e-02 314 341 -4.1666666666666664e-02 314 156 4.1666666666666664e-02 314 320 -4.1666666666666664e-02 314 216 -4.1666666666666664e-02 314 169 4.1666666666666664e-02 314 318 -4.1666666666666664e-02 314 310 -4.1666666666666664e-02 314 172 4.1666666666666664e-02 314 238 -4.1666666666666664e-02 314 315 -4.1666666666666664e-02 314 175 4.1666666666666664e-02 314 347 -8.3333333333333329e-02 314 344 -8.3333333333333329e-02 314 319 -8.3333333333333329e-02 314 313 -8.3333333333333329e-02 314 179 -8.3333333333333329e-02 315 315 5.0000000000000000e-01 315 338 -4.1666666666666664e-02 315 329 -4.1666666666666664e-02 315 175 -1.2499999999999999e-01 315 314 -4.1666666666666664e-02 315 347 -4.1666666666666664e-02 315 333 -4.1666666666666664e-02 315 313 -4.1666666666666664e-02 315 179 -1.2499999999999999e-01 316 316 5.0000000000000000e-01 316 331 -4.1666666666666664e-02 316 330 -4.1666666666666664e-02 316 175 -1.2499999999999999e-01 316 313 -4.1666666666666664e-02 317 317 1.0000000000000000e+00 318 318 5.0000000000000000e-01 318 329 -4.1666666666666664e-02 318 327 -4.1666666666666664e-02 318 314 -4.1666666666666664e-02 318 172 -1.2499999999999999e-01 318 328 -4.1666666666666664e-02 318 319 -4.1666666666666664e-02 318 313 -4.1666666666666664e-02 318 179 -1.2499999999999999e-01 319 319 6.6666666666666674e-01 319 222 -4.1666666666666664e-02 319 323 -4.1666666666666664e-02 319 169 -8.3333333333333329e-02 319 216 -4.1666666666666664e-02 319 172 -8.3333333333333329e-02 319 310 -4.1666666666666664e-02 319 318 -4.1666666666666664e-02 319 327 -8.3333333333333329e-02 319 217 -4.1666666666666664e-02 319 320 -4.1666666666666664e-02 319 314 -8.3333333333333329e-02 319 179 4.1666666666666664e-02 319 223 -4.1666666666666664e-02 320 320 5.0000000000000000e-01 320 252 -4.1666666666666664e-02 320 327 -4.1666666666666664e-02 320 314 -4.1666666666666664e-02 320 169 -1.2499999999999999e-01 320 344 -4.1666666666666664e-02 320 326 -4.1666666666666664e-02 320 319 -4.1666666666666664e-02 320 179 -1.2499999999999999e-01 321 321 1.0000000000000000e+00 322 322 2.0000000000000000e+00 323 323 5.0000000000000000e-01 323 319 -4.1666666666666664e-02 323 327 -4.1666666666666664e-02 323 326 -4.1666666666666664e-02 323 169 -1.2499999999999999e-01 324 324 5.0000000000000000e-01 324 169 -1.2499999999999999e-01 324 326 -4.1666666666666664e-02 325 325 1.0000000000000000e+00 326 326 6.6666666666666652e-01 326 327 -8.3333333333333329e-02 326 252 -8.3333333333333329e-02 326 179 4.1666666666666664e-02 326 351 -4.1666666666666664e-02 326 169 -8.3333333333333329e-02 326 323 -4.1666666666666664e-02 326 324 -4.1666666666666664e-02 326 320 -4.1666666666666664e-02 326 70 -4.1666666666666664e-02 326 18 -8.3333333333333329e-02 326 78 -4.1666666666666664e-02 326 111 -4.1666666666666664e-02 326 71 -4.1666666666666664e-02 327 327 6.6666666666666652e-01 327 326 -8.3333333333333329e-02 327 328 -8.3333333333333329e-02 327 179 -8.3333333333333329e-02 327 318 -4.1666666666666664e-02 327 222 -4.1666666666666664e-02 327 172 4.1666666666666664e-02 327 320 -4.1666666666666664e-02 327 323 -4.1666666666666664e-02 327 169 4.1666666666666664e-02 327 319 -8.3333333333333329e-02 327 141 -4.1666666666666664e-02 327 151 -4.1666666666666664e-02 327 17 4.1666666666666664e-02 327 78 -4.1666666666666664e-02 327 111 -4.1666666666666664e-02 327 18 4.1666666666666664e-02 327 149 -8.3333333333333329e-02 328 328 6.6666666666666652e-01 328 329 -8.3333333333333329e-02 328 163 4.1666666666666664e-02 328 327 -8.3333333333333329e-02 328 179 4.1666666666666664e-02 328 227 -8.3333333333333329e-02 328 222 -4.1666666666666664e-02 328 172 -8.3333333333333329e-02 328 228 -4.1666666666666664e-02 328 229 -4.1666666666666664e-02 328 318 -4.1666666666666664e-02 328 151 -4.1666666666666664e-02 328 17 -8.3333333333333329e-02 328 137 -4.1666666666666664e-02 328 141 -4.1666666666666664e-02 328 142 -4.1666666666666664e-02 329 329 6.6666666666666652e-01 329 328 -8.3333333333333329e-02 329 336 -4.1666666666666664e-02 329 337 -4.1666666666666664e-02 329 186 4.1666666666666664e-02 329 163 -8.3333333333333329e-02 329 179 -8.3333333333333329e-02 329 315 -4.1666666666666664e-02 329 332 -4.1666666666666664e-02 329 175 4.1666666666666664e-02 329 318 -4.1666666666666664e-02 329 228 -4.1666666666666664e-02 329 172 4.1666666666666664e-02 329 333 -8.3333333333333329e-02 329 313 -8.3333333333333329e-02 329 141 -4.1666666666666664e-02 329 137 -4.1666666666666664e-02 329 17 4.1666666666666664e-02 329 139 -8.3333333333333329e-02 330 330 7.0833333333333304e-01 330 206 -4.1666666666666664e-02 330 234 -4.1666666666666664e-02 330 175 -8.3333333333333329e-02 330 316 -4.1666666666666664e-02 330 331 -8.3333333333333329e-02 330 361 -1.2499999999999999e-01 330 332 -4.1666666666666664e-02 330 334 -8.3333333333333329e-02 330 235 -4.1666666666666664e-02 330 693 -8.3333333333333329e-02 330 628 4.1666666666666664e-02 331 331 6.2499999999999989e-01 331 299 -8.3333333333333329e-02 331 311 -4.1666666666666664e-02 331 228 -4.1666666666666664e-02 331 172 4.1666666666666664e-02 331 316 -4.1666666666666664e-02 331 332 -4.1666666666666664e-02 331 175 4.1666666666666664e-02 331 330 -8.3333333333333329e-02 331 226 -8.3333333333333329e-02 331 163 -1.0416666666666666e-01 331 313 -8.3333333333333329e-02 332 332 5.0000000000000000e-01 332 334 -4.1666666666666664e-02 332 333 -4.1666666666666664e-02 332 329 -4.1666666666666664e-02 332 313 -4.1666666666666664e-02 332 175 -1.2499999999999999e-01 332 331 -4.1666666666666664e-02 332 330 -4.1666666666666664e-02 332 163 -1.2499999999999999e-01 333 333 6.6666666666666641e-01 333 337 -4.1666666666666664e-02 333 179 4.1666666666666664e-02 333 186 -8.3333333333333329e-02 333 338 -8.3333333333333329e-02 333 174 4.1666666666666664e-02 333 335 -4.1666666666666664e-02 333 232 -8.3333333333333329e-02 333 233 -4.1666666666666664e-02 333 336 -4.1666666666666664e-02 333 175 -8.3333333333333329e-02 333 332 -4.1666666666666664e-02 333 163 4.1666666666666664e-02 333 315 -4.1666666666666664e-02 333 329 -8.3333333333333329e-02 333 234 -4.1666666666666664e-02 333 334 -8.3333333333333329e-02 333 143 -4.1666666666666664e-02 333 628 4.1666666666666664e-02 334 334 5.8333333333333326e-01 334 335 -4.1666666666666664e-02 334 163 -8.3333333333333329e-02 334 336 -4.1666666666666664e-02 334 186 4.1666666666666664e-02 334 208 -8.3333333333333329e-02 334 234 -4.1666666666666664e-02 334 332 -4.1666666666666664e-02 334 175 4.1666666666666664e-02 334 206 -8.3333333333333329e-02 334 330 -8.3333333333333329e-02 334 333 -8.3333333333333329e-02 334 628 -8.3333333333333329e-02 335 335 5.0000000000000000e-01 335 232 -4.1666666666666664e-02 335 334 -4.1666666666666664e-02 335 186 -1.2499999999999999e-01 335 208 -4.1666666666666664e-02 335 333 -4.1666666666666664e-02 335 136 -4.1666666666666664e-02 335 760 -4.1666666666666664e-02 335 628 -1.2499999999999999e-01 336 336 5.0000000000000000e-01 336 301 -4.1666666666666664e-02 336 329 -4.1666666666666664e-02 336 186 -1.2500000000000000e-01 336 334 -4.1666666666666664e-02 336 208 -4.1666666666666664e-02 336 163 -1.2500000000000000e-01 336 333 -4.1666666666666664e-02 336 139 -4.1666666666666664e-02 337 337 5.0000000000000000e-01 337 333 -4.1666666666666664e-02 337 338 -4.1666666666666664e-02 337 186 -1.2499999999999999e-01 337 329 -4.1666666666666664e-02 337 179 -1.2499999999999999e-01 337 147 -4.1666666666666664e-02 337 139 -4.1666666666666664e-02 337 145 -4.1666666666666664e-02 338 338 6.6666666666666652e-01 338 333 -8.3333333333333329e-02 338 337 -4.1666666666666664e-02 338 186 4.1666666666666664e-02 338 174 -8.3333333333333329e-02 338 251 -8.3333333333333329e-02 338 179 -8.3333333333333329e-02 338 253 -4.1666666666666664e-02 338 353 -4.1666666666666664e-02 338 156 4.1666666666666664e-02 338 315 -4.1666666666666664e-02 338 233 -4.1666666666666664e-02 338 175 4.1666666666666664e-02 338 347 -8.3333333333333329e-02 338 143 -4.1666666666666664e-02 338 74 -4.1666666666666664e-02 338 113 -4.1666666666666664e-02 338 15 4.1666666666666664e-02 338 145 -8.3333333333333329e-02 339 339 1.0000000000000000e+00 340 340 1.0000000000000000e+00 341 341 5.0000000000000000e-01 341 347 -4.1666666666666664e-02 341 314 -4.1666666666666664e-02 341 344 -4.1666666666666664e-02 341 156 -1.2499999999999999e-01 342 342 5.0000000000000000e-01 342 156 -1.2499999999999999e-01 342 344 -4.1666666666666664e-02 343 343 1.0000000000000000e+00 344 344 6.6666666666666674e-01 344 351 -4.1666666666666664e-02 344 190 -4.1666666666666664e-02 344 156 -8.3333333333333329e-02 344 341 -4.1666666666666664e-02 344 169 -8.3333333333333329e-02 344 216 -4.1666666666666664e-02 344 320 -4.1666666666666664e-02 344 252 -8.3333333333333329e-02 344 342 -4.1666666666666664e-02 344 253 -4.1666666666666664e-02 344 314 -8.3333333333333329e-02 344 179 4.1666666666666664e-02 344 345 -4.1666666666666664e-02 345 345 5.0000000000000000e-01 345 169 -1.2499999999999999e-01 345 344 -4.1666666666666664e-02 346 346 1.0000000000000000e+00 347 347 6.6666666666666674e-01 347 353 -4.1666666666666664e-02 347 233 -4.1666666666666664e-02 347 174 4.1666666666666664e-02 347 175 -8.3333333333333329e-02 347 238 -4.1666666666666664e-02 347 156 -8.3333333333333329e-02 347 341 -4.1666666666666664e-02 347 253 -4.1666666666666664e-02 347 338 -8.3333333333333329e-02 347 239 -4.1666666666666664e-02 347 281 -8.3333333333333329e-02 347 315 -4.1666666666666664e-02 347 314 -8.3333333333333329e-02 347 179 4.1666666666666664e-02 347 348 -4.1666666666666664e-02 348 348 5.0000000000000000e-01 348 281 -4.1666666666666664e-02 348 282 -4.1666666666666664e-02 348 156 -1.2499999999999999e-01 348 347 -4.1666666666666664e-02 349 349 1.0000000000000000e+00 350 350 1.0000000000000000e+00 351 351 5.0000000000000000e-01 351 326 -4.1666666666666664e-02 351 252 -4.1666666666666664e-02 351 344 -4.1666666666666664e-02 351 169 -1.2499999999999999e-01 352 352 2.0000000000000000e+00 353 353 5.0000000000000000e-01 353 283 -4.1666666666666664e-02 353 251 -4.1666666666666664e-02 353 338 -4.1666666666666664e-02 353 347 -4.1666666666666664e-02 353 156 -1.2499999999999999e-01 353 281 -4.1666666666666664e-02 353 282 -4.1666666666666664e-02 353 174 -1.2499999999999999e-01 354 354 2.0000000000000000e+00 355 355 9.9999999999999978e-01 355 357 -1.6666666666666666e-01 355 356 -1.6666666666666666e-01 355 261 -1.6666666666666666e-01 355 7 2.0833333333333332e-02 355 831 -2.5000000000000000e-01 355 33 -1.2500000000000000e-01 356 356 6.6666666666666652e-01 356 355 -1.6666666666666666e-01 356 257 -8.3333333333333329e-02 356 848 -8.3333333333333329e-02 356 809 -8.3333333333333329e-02 356 710 -1.6666666666666666e-01 357 357 6.6666666666666663e-01 357 260 -8.3333333333333329e-02 357 355 -1.6666666666666666e-01 357 809 -8.3333333333333329e-02 357 82 -8.3333333333333329e-02 357 81 -8.3333333333333329e-02 357 152 -1.6666666666666666e-01 358 358 1.0000000000000002e+00 358 278 -2.4999999999999997e-01 358 243 -2.0833333333333331e-01 358 812 -2.0833333333333331e-01 358 619 4.1666666666666664e-02 358 810 -8.3333333333333329e-02 358 750 -1.2499999999999999e-01 359 359 1.0000000000000000e+00 360 360 1.0000000000000000e+00 361 361 1.0000000000000002e+00 361 206 -2.0833333333333331e-01 361 163 4.1666666666666664e-02 361 299 -2.4999999999999997e-01 361 255 -8.3333333333333329e-02 361 246 -2.0833333333333331e-01 361 330 -1.2499999999999999e-01 362 362 1.0000000000000000e+00 363 363 1.0000000000000000e+00 364 364 1.0000000000000000e+00 365 365 2.0000000000000000e+00 hypre-2.33.0/src/test/TEST_ams/mfem.Aalpha.00002000066400000000000000000001324131477326011500206210ustar00rootroot00000000000000366 614 366 614 366 366 2.0000000000000000e+00 367 367 2.0000000000000000e+00 368 368 2.0000000000000000e+00 369 369 1.0000000000000007e+00 369 501 4.1666666666666664e-02 369 505 4.1666666666666664e-02 369 416 4.1666666666666664e-02 369 499 -8.3333333333333329e-02 369 495 4.1666666666666664e-02 369 494 -8.3333333333333329e-02 369 492 -1.2499999999999999e-01 369 491 -1.2499999999999999e-01 369 489 -8.3333333333333329e-02 369 490 4.1666666666666664e-02 369 488 -1.2499999999999999e-01 369 484 4.1666666666666664e-02 369 483 -8.3333333333333329e-02 369 425 4.1666666666666664e-02 369 424 -1.2499999999999999e-01 369 423 -1.2499999999999999e-01 369 421 -8.3333333333333329e-02 369 422 4.1666666666666664e-02 369 414 -1.2499999999999999e-01 369 412 -1.2499999999999999e-01 369 411 -1.2499999999999999e-01 370 370 1.0000000000000004e+00 370 514 4.1666666666666664e-02 370 417 -1.2500000000000000e-01 370 495 -8.3333333333333329e-02 370 444 -8.3333333333333329e-02 370 433 -1.0416666666666666e-01 370 537 0.0000000000000000e+00 370 448 4.1666666666666664e-02 370 524 -4.1666666666666664e-02 370 443 -6.2500000000000000e-02 370 525 4.1666666666666664e-02 370 518 4.1666666666666664e-02 370 517 -4.1666666666666664e-02 370 499 4.1666666666666664e-02 370 494 4.1666666666666664e-02 370 455 -6.2500000000000000e-02 370 454 4.1666666666666664e-02 370 457 -1.2499999999999999e-01 370 415 -2.0833333333333332e-02 370 491 -1.2499999999999999e-01 370 416 -8.3333333333333329e-02 370 434 -1.2499999999999999e-01 370 490 -1.0416666666666666e-01 370 432 -2.0833333333333332e-02 370 126 4.1666666666666664e-02 370 134 -1.2499999999999999e-01 371 371 1.0000000000000004e+00 371 425 -1.8750000000000000e-01 371 588 -1.6666666666666666e-01 371 458 2.0833333333333332e-02 371 519 2.0833333333333332e-02 371 455 -8.3333333333333329e-02 371 507 2.0833333333333332e-02 371 489 4.1666666666666664e-02 371 421 2.0833333333333332e-02 371 419 -1.8750000000000000e-01 371 415 4.1666666666666664e-02 371 520 -1.2499999999999999e-01 371 418 -1.2499999999999999e-01 371 422 -1.2499999999999999e-01 371 424 -1.2499999999999999e-01 371 416 -8.3333333333333329e-02 371 499 4.1666666666666664e-02 372 372 9.9999999999999978e-01 372 444 4.1666666666666664e-02 372 417 -1.2500000000000000e-01 372 495 4.1666666666666664e-02 372 445 4.1666666666666664e-02 372 516 -1.2500000000000000e-01 372 500 -1.2500000000000000e-01 372 505 4.1666666666666664e-02 372 420 -1.2500000000000000e-01 372 506 -1.2500000000000000e-01 372 507 -8.3333333333333329e-02 372 422 4.1666666666666664e-02 372 499 -8.3333333333333329e-02 372 419 4.1666666666666664e-02 372 418 -1.2499999999999999e-01 372 415 -8.3333333333333329e-02 372 416 4.1666666666666664e-02 372 46 4.1666666666666664e-02 372 121 4.1666666666666664e-02 372 126 -8.3333333333333329e-02 372 125 -1.2499999999999999e-01 372 124 -8.3333333333333329e-02 372 60 4.1666666666666664e-02 372 118 -8.3333333333333329e-02 372 263 4.1666666666666664e-02 372 117 -1.2499999999999999e-01 372 81 4.1666666666666664e-02 373 373 1.0000000000000000e+00 374 374 2.0000000000000000e+00 375 375 2.0000000000000000e+00 376 376 1.0000000000000007e+00 376 514 -8.3333333333333329e-02 376 513 4.1666666666666664e-02 376 511 -8.3333333333333329e-02 376 484 4.1666666666666664e-02 376 510 -1.2499999999999999e-01 376 497 -1.2499999999999999e-01 376 490 4.1666666666666664e-02 376 496 -1.2499999999999999e-01 376 494 -8.3333333333333329e-02 376 495 4.1666666666666664e-02 376 435 -1.2499999999999999e-01 376 434 -1.2499999999999999e-01 376 432 -8.3333333333333329e-02 376 433 4.1666666666666664e-02 376 431 -1.2499999999999999e-01 376 429 -1.2499999999999999e-01 376 428 -1.2499999999999999e-01 377 377 2.0000000000000000e+00 378 378 1.0833333333333335e+00 378 441 -2.0833333333333332e-02 378 544 2.0833333333333332e-02 378 556 -1.6666666666666666e-01 378 555 -1.6666666666666666e-01 378 517 8.3333333333333329e-02 378 476 -1.6666666666666666e-01 378 456 -2.0833333333333331e-01 378 519 -4.1666666666666664e-02 378 437 -8.3333333333333329e-02 378 520 -1.2499999999999999e-01 378 458 -2.0833333333333332e-02 378 455 -8.3333333333333329e-02 378 454 2.0833333333333332e-02 378 442 -1.2499999999999999e-01 379 379 1.0000000000000000e+00 380 380 1.0000000000000000e+00 381 381 1.0000000000000000e+00 382 382 1.0833333333333337e+00 382 592 -1.6666666666666666e-01 382 568 -1.6666666666666666e-01 382 446 -2.0833333333333332e-02 382 454 2.0833333333333332e-02 382 524 8.3333333333333329e-02 382 466 -1.6666666666666666e-01 382 467 -2.0833333333333334e-01 382 534 -2.0833333333333332e-02 382 527 -8.3333333333333329e-02 382 459 2.0833333333333332e-02 382 532 -4.1666666666666664e-02 382 443 -8.3333333333333329e-02 382 533 -1.2499999999999999e-01 382 447 -1.2499999999999999e-01 383 383 9.9999999999999978e-01 383 537 4.1666666666666664e-02 383 445 -1.6666666666666666e-01 383 480 -1.6666666666666666e-01 383 479 -1.2500000000000000e-01 383 516 -1.2500000000000000e-01 383 444 -8.3333333333333329e-02 383 532 2.0833333333333332e-02 383 446 2.0833333333333332e-02 383 443 -8.3333333333333329e-02 383 415 4.1666666666666664e-02 383 447 -1.2499999999999999e-01 383 287 2.0833333333333332e-02 383 136 2.0833333333333332e-02 383 124 4.1666666666666664e-02 383 39 4.1666666666666664e-02 383 144 -1.2499999999999999e-01 383 62 -1.2499999999999999e-01 383 145 4.1666666666666664e-02 383 127 -1.2499999999999999e-01 383 60 -8.3333333333333329e-02 383 126 4.1666666666666664e-02 384 384 1.0000000000000004e+00 384 527 2.0833333333333332e-02 384 443 2.0833333333333332e-02 384 524 -4.1666666666666664e-02 384 455 2.0833333333333332e-02 384 437 2.0833333333333332e-02 384 517 -4.1666666666666664e-02 384 541 -1.6666666666666666e-01 384 467 -2.0833333333333334e-01 384 462 -1.4583333333333331e-01 384 457 -1.2499999999999999e-01 384 456 -2.0833333333333331e-01 384 451 -1.4583333333333331e-01 385 385 1.0000000000000000e+00 386 386 1.0000000000000000e+00 387 387 1.0000000000000000e+00 388 388 1.0000000000000000e+00 389 389 9.9999999999999956e-01 389 468 -1.6666666666666666e-01 389 558 -1.6666666666666666e-01 389 466 -1.6666666666666666e-01 389 556 -1.6666666666666666e-01 389 676 -1.6666666666666666e-01 389 679 -1.6666666666666666e-01 390 390 9.9999999999999989e-01 390 472 -1.6666666666666666e-01 390 589 -1.4583333333333331e-01 390 575 -2.0833333333333331e-01 390 476 -1.6666666666666666e-01 390 682 2.0833333333333332e-02 390 726 2.0833333333333332e-02 390 767 -4.1666666666666664e-02 390 683 -1.4583333333333331e-01 390 680 -1.6666666666666666e-01 391 391 2.0000000000000000e+00 392 392 1.0000000000000000e+00 393 393 1.0000000000000000e+00 393 495 -8.3333333333333329e-02 393 514 4.1666666666666664e-02 393 513 -8.3333333333333329e-02 393 511 4.1666666666666664e-02 393 500 -1.2500000000000000e-01 393 505 -8.3333333333333329e-02 393 484 -8.3333333333333329e-02 393 485 -1.2500000000000000e-01 393 496 -1.2499999999999999e-01 393 499 4.1666666666666664e-02 393 494 4.1666666666666664e-02 393 488 -1.2499999999999999e-01 393 483 4.1666666666666664e-02 393 126 4.1666666666666664e-02 393 123 -1.2499999999999999e-01 393 122 4.1666666666666664e-02 393 121 -8.3333333333333329e-02 393 118 4.1666666666666664e-02 393 90 -1.2499999999999999e-01 393 103 4.1666666666666664e-02 393 102 -1.2499999999999999e-01 393 99 4.1666666666666664e-02 393 93 4.1666666666666664e-02 393 92 -1.2499999999999999e-01 393 89 -8.3333333333333329e-02 393 88 4.1666666666666664e-02 394 394 1.0000000000000002e+00 394 502 -1.2500000000000000e-01 394 505 4.1666666666666664e-02 394 487 -1.2500000000000000e-01 394 484 4.1666666666666664e-02 394 486 -1.2500000000000000e-01 394 485 -1.2500000000000000e-01 394 504 -1.2499999999999999e-01 394 501 4.1666666666666664e-02 394 483 -8.3333333333333329e-02 394 116 -8.3333333333333329e-02 394 34 4.1666666666666664e-02 394 100 -1.2499999999999999e-01 394 99 -8.3333333333333329e-02 394 89 4.1666666666666664e-02 394 93 -8.3333333333333329e-02 394 25 -1.2499999999999999e-01 394 24 -1.2499999999999999e-01 395 395 1.0000000000000000e+00 396 396 1.0000000000000000e+00 397 397 2.0000000000000000e+00 398 398 1.0000000000000000e+00 399 399 1.0000000000000000e+00 400 400 1.0000000000000000e+00 401 401 1.0000000000000000e+00 402 402 2.0000000000000000e+00 403 403 1.0000000000000000e+00 404 404 2.0000000000000000e+00 405 405 1.0000000000000004e+00 405 588 -1.6666666666666666e-01 405 610 -1.6666666666666666e-01 405 591 -2.0833333333333332e-02 405 573 2.0833333333333332e-02 405 589 -1.4583333333333331e-01 405 800 -2.0833333333333332e-02 405 850 4.1666666666666664e-02 405 797 -1.4583333333333331e-01 405 779 -1.6666666666666666e-01 405 726 -6.2500000000000000e-02 405 768 -2.0833333333333332e-02 405 766 2.0833333333333332e-02 405 767 -4.1666666666666664e-02 405 727 -1.2499999999999999e-01 406 406 2.0000000000000000e+00 407 407 2.0000000000000000e+00 408 408 2.0000000000000000e+00 409 409 1.0000000000000000e+00 410 410 2.0000000000000000e+00 411 411 5.0000000000000000e-01 411 494 -4.1666666666666664e-02 411 484 -4.1666666666666664e-02 411 483 -4.1666666666666664e-02 411 369 -1.2499999999999999e-01 412 412 5.0000000000000000e-01 412 421 -4.1666666666666664e-02 412 501 -4.1666666666666664e-02 412 369 -1.2499999999999999e-01 412 483 -4.1666666666666664e-02 413 413 1.0000000000000000e+00 414 414 5.0000000000000000e-01 414 425 -4.1666666666666664e-02 414 369 -1.2499999999999999e-01 414 489 -4.1666666666666664e-02 414 421 -4.1666666666666664e-02 415 415 7.4999999999999989e-01 415 516 -4.1666666666666664e-02 415 454 -8.3333333333333329e-02 415 455 -4.1666666666666664e-02 415 445 -8.3333333333333329e-02 415 383 4.1666666666666664e-02 415 443 -4.1666666666666664e-02 415 372 -8.3333333333333329e-02 415 418 -4.1666666666666664e-02 415 371 4.1666666666666664e-02 415 416 -8.3333333333333329e-02 415 417 -4.1666666666666664e-02 415 444 -8.3333333333333329e-02 415 370 -2.0833333333333332e-02 415 420 -4.1666666666666664e-02 415 419 -8.3333333333333329e-02 415 14 -6.2500000000000000e-02 416 416 5.8333333333333326e-01 416 424 -4.1666666666666664e-02 416 491 -4.1666666666666664e-02 416 369 4.1666666666666664e-02 416 418 -4.1666666666666664e-02 416 417 -4.1666666666666664e-02 416 372 4.1666666666666664e-02 416 415 -8.3333333333333329e-02 416 455 -8.3333333333333329e-02 416 489 -8.3333333333333329e-02 416 370 -8.3333333333333329e-02 416 499 -8.3333333333333329e-02 416 371 -8.3333333333333329e-02 417 417 5.0000000000000000e-01 417 444 -4.1666666666666664e-02 417 495 -4.1666666666666664e-02 417 372 -1.2500000000000000e-01 417 370 -1.2500000000000000e-01 417 499 -4.1666666666666664e-02 417 416 -4.1666666666666664e-02 417 415 -4.1666666666666664e-02 417 126 -4.1666666666666664e-02 418 418 5.0000000000000000e-01 418 507 -4.1666666666666664e-02 418 422 -4.1666666666666664e-02 418 419 -4.1666666666666664e-02 418 416 -4.1666666666666664e-02 418 372 -1.2499999999999999e-01 418 415 -4.1666666666666664e-02 418 499 -4.1666666666666664e-02 418 371 -1.2499999999999999e-01 419 419 7.4999999999999978e-01 419 458 -8.3333333333333329e-02 419 420 -4.1666666666666664e-02 419 371 -1.8750000000000000e-01 419 418 -4.1666666666666664e-02 419 372 4.1666666666666664e-02 419 507 -8.3333333333333329e-02 419 590 -8.3333333333333329e-02 419 415 -8.3333333333333329e-02 419 14 -1.8750000000000000e-01 420 420 4.9999999999999994e-01 420 445 -4.1666666666666664e-02 420 372 -1.2500000000000000e-01 420 507 -4.1666666666666664e-02 420 419 -4.1666666666666664e-02 420 415 -4.1666666666666664e-02 420 263 -4.1666666666666664e-02 420 124 -4.1666666666666664e-02 420 14 -1.2500000000000000e-01 421 421 7.0833333333333337e-01 421 609 -1.2500000000000000e-01 421 611 -4.1666666666666664e-02 421 412 -4.1666666666666664e-02 421 369 -8.3333333333333329e-02 421 424 -4.1666666666666664e-02 421 422 -8.3333333333333329e-02 421 371 2.0833333333333332e-02 421 423 -4.1666666666666664e-02 421 501 -8.3333333333333329e-02 421 414 -4.1666666666666664e-02 421 425 -8.3333333333333329e-02 421 7 0.0000000000000000e+00 422 422 6.6666666666666652e-01 422 418 -4.1666666666666664e-02 422 506 -4.1666666666666664e-02 422 372 4.1666666666666664e-02 422 424 -4.1666666666666664e-02 422 423 -4.1666666666666664e-02 422 369 4.1666666666666664e-02 422 421 -8.3333333333333329e-02 422 608 -8.3333333333333329e-02 422 507 -8.3333333333333329e-02 422 499 -8.3333333333333329e-02 422 371 -1.2499999999999999e-01 422 7 -1.2499999999999999e-01 423 423 5.0000000000000000e-01 423 499 -4.1666666666666664e-02 423 501 -4.1666666666666664e-02 423 505 -4.1666666666666664e-02 423 483 -4.1666666666666664e-02 423 369 -1.2499999999999999e-01 423 422 -4.1666666666666664e-02 423 421 -4.1666666666666664e-02 423 7 -1.2499999999999999e-01 424 424 5.0000000000000000e-01 424 489 -4.1666666666666664e-02 424 416 -4.1666666666666664e-02 424 425 -4.1666666666666664e-02 424 422 -4.1666666666666664e-02 424 369 -1.2499999999999999e-01 424 421 -4.1666666666666664e-02 424 499 -4.1666666666666664e-02 424 371 -1.2499999999999999e-01 425 425 7.4999999999999989e-01 425 371 -1.8750000000000000e-01 425 591 -8.3333333333333329e-02 425 489 -8.3333333333333329e-02 425 414 -4.1666666666666664e-02 425 424 -4.1666666666666664e-02 425 369 4.1666666666666664e-02 425 519 -8.3333333333333329e-02 425 421 -8.3333333333333329e-02 426 426 1.0000000000000000e+00 427 427 2.0000000000000000e+00 428 428 5.0000000000000000e-01 428 514 -4.1666666666666664e-02 428 513 -4.1666666666666664e-02 428 511 -4.1666666666666664e-02 428 376 -1.2499999999999999e-01 429 429 5.0000000000000000e-01 429 376 -1.2499999999999999e-01 429 511 -4.1666666666666664e-02 430 430 1.0000000000000000e+00 431 431 5.0000000000000000e-01 431 376 -1.2499999999999999e-01 431 432 -4.1666666666666664e-02 432 432 7.4999999999999978e-01 432 448 -8.3333333333333329e-02 432 524 -4.1666666666666664e-02 432 497 -4.1666666666666664e-02 432 376 -8.3333333333333329e-02 432 435 -4.1666666666666664e-02 432 433 -8.3333333333333329e-02 432 517 -4.1666666666666671e-02 432 434 -4.1666666666666664e-02 432 490 -8.3333333333333329e-02 432 370 -2.0833333333333332e-02 432 431 -4.1666666666666664e-02 433 433 6.2500000000000000e-01 433 537 -8.3333333333333329e-02 433 370 -1.0416666666666666e-01 433 514 -8.3333333333333329e-02 433 435 -4.1666666666666664e-02 433 434 -4.1666666666666664e-02 433 376 4.1666666666666664e-02 433 432 -8.3333333333333329e-02 433 524 -8.3333333333333329e-02 433 133 -4.1666666666666664e-02 433 134 -4.1666666666666664e-02 433 11 4.1666666666666664e-02 434 434 5.0000000000000000e-01 434 514 -4.1666666666666664e-02 434 490 -4.1666666666666664e-02 434 495 -4.1666666666666664e-02 434 494 -4.1666666666666664e-02 434 376 -1.2499999999999999e-01 434 433 -4.1666666666666664e-02 434 432 -4.1666666666666664e-02 434 370 -1.2499999999999999e-01 435 435 5.0000000000000000e-01 435 433 -4.1666666666666664e-02 435 376 -1.2499999999999999e-01 435 432 -4.1666666666666664e-02 435 514 -4.1666666666666664e-02 436 436 1.0000000000000000e+00 437 437 1.0416666666666667e+00 437 384 2.0833333333333332e-02 437 517 -4.1666666666666664e-02 437 441 -4.1666666666666671e-02 437 456 -8.3333333333333329e-02 437 544 -2.5000000000000000e-01 437 451 -8.3333333333333329e-02 437 519 -4.1666666666666664e-02 437 518 -2.0833333333333331e-01 437 378 -8.3333333333333329e-02 437 442 -8.3333333333333329e-02 438 438 1.0000000000000000e+00 439 439 1.0000000000000000e+00 440 440 1.0000000000000000e+00 441 441 7.0833333333333315e-01 441 378 -2.0833333333333332e-02 441 555 -8.3333333333333329e-02 441 437 -4.1666666666666671e-02 441 544 -1.2500000000000000e-01 441 469 -1.6666666666666666e-01 441 442 -8.3333333333333329e-02 442 442 5.8333333333333326e-01 442 519 -8.3333333333333329e-02 442 475 -8.3333333333333329e-02 442 441 -8.3333333333333329e-02 442 437 -8.3333333333333329e-02 442 378 -1.2499999999999999e-01 443 443 1.0416666666666667e+00 443 384 2.0833333333333332e-02 443 524 -4.1666666666666664e-02 443 370 -6.2500000000000000e-02 443 537 -4.1666666666666664e-02 443 446 -4.1666666666666671e-02 443 383 -8.3333333333333329e-02 443 415 -4.1666666666666664e-02 443 467 -8.3333333333333329e-02 443 454 -2.5000000000000000e-01 443 457 -8.3333333333333329e-02 443 444 -8.3333333333333329e-02 443 532 -4.1666666666666664e-02 443 525 -2.0833333333333331e-01 443 382 -8.3333333333333329e-02 443 447 -8.3333333333333329e-02 443 14 8.3333333333333329e-02 444 444 5.8333333333333326e-01 444 516 -4.1666666666666664e-02 444 417 -4.1666666666666664e-02 444 372 4.1666666666666664e-02 444 370 -8.3333333333333329e-02 444 537 -8.3333333333333329e-02 444 383 -8.3333333333333329e-02 444 443 -8.3333333333333329e-02 444 415 -8.3333333333333329e-02 444 127 -4.1666666666666664e-02 444 134 -4.1666666666666664e-02 444 11 4.1666666666666664e-02 444 126 -8.3333333333333329e-02 445 445 7.4999999999999978e-01 445 420 -4.1666666666666664e-02 445 383 -1.6666666666666666e-01 445 516 -4.1666666666666664e-02 445 372 4.1666666666666664e-02 445 415 -8.3333333333333329e-02 445 446 -8.3333333333333329e-02 445 59 -4.1666666666666664e-02 445 144 -4.1666666666666664e-02 445 186 4.1666666666666664e-02 445 136 -8.3333333333333329e-02 445 124 -8.3333333333333329e-02 445 14 -1.6666666666666666e-01 446 446 7.0833333333333315e-01 446 382 -2.0833333333333332e-02 446 466 -8.3333333333333329e-02 446 443 -4.1666666666666671e-02 446 383 2.0833333333333332e-02 446 445 -8.3333333333333329e-02 446 468 -8.3333333333333329e-02 446 454 -1.2500000000000000e-01 446 447 -8.3333333333333329e-02 446 14 -4.1666666666666664e-02 446 135 -1.6666666666666666e-01 447 447 5.8333333333333326e-01 447 532 -8.3333333333333329e-02 447 478 -8.3333333333333329e-02 447 383 -1.2499999999999999e-01 447 446 -8.3333333333333329e-02 447 443 -8.3333333333333329e-02 447 382 -1.2499999999999999e-01 448 448 1.0000000000000004e+00 448 432 -8.3333333333333329e-02 448 370 4.1666666666666664e-02 448 524 -2.5000000000000000e-01 448 449 -1.6666666666666666e-01 448 517 -2.5000000000000000e-01 449 449 6.6666666666666652e-01 449 462 -8.3333333333333329e-02 449 451 -8.3333333333333329e-02 449 448 -1.6666666666666666e-01 449 549 -1.6666666666666666e-01 450 450 1.0000000000000000e+00 451 451 6.2500000000000000e-01 451 545 -8.3333333333333329e-02 451 449 -8.3333333333333329e-02 451 384 -1.4583333333333331e-01 451 437 -8.3333333333333329e-02 451 517 -8.3333333333333329e-02 452 452 1.0000000000000000e+00 453 453 1.0000000000000000e+00 454 454 1.0000000000000002e+00 454 382 2.0833333333333332e-02 454 415 -8.3333333333333329e-02 454 370 4.1666666666666664e-02 454 443 -2.5000000000000000e-01 454 465 -1.6666666666666666e-01 454 446 -1.2500000000000000e-01 454 458 -1.2499999999999999e-01 454 455 -2.4999999999999997e-01 454 378 2.0833333333333332e-02 454 14 -8.3333333333333329e-02 455 455 1.0416666666666670e+00 455 384 2.0833333333333332e-02 455 519 -4.1666666666666671e-02 455 371 -8.3333333333333329e-02 455 489 -4.1666666666666664e-02 455 518 -2.0833333333333331e-01 455 517 -4.1666666666666664e-02 455 370 -6.2500000000000000e-02 455 415 -4.1666666666666664e-02 455 456 -8.3333333333333329e-02 455 457 -8.3333333333333329e-02 455 416 -8.3333333333333329e-02 455 520 -8.3333333333333329e-02 455 458 -4.1666666666666664e-02 455 454 -2.4999999999999997e-01 455 378 -8.3333333333333329e-02 455 14 8.3333333333333329e-02 456 456 7.5000000000000000e-01 456 465 -8.3333333333333329e-02 456 539 -8.3333333333333329e-02 456 455 -8.3333333333333329e-02 456 384 -2.0833333333333331e-01 456 437 -8.3333333333333329e-02 456 378 -2.0833333333333331e-01 457 457 5.8333333333333326e-01 457 517 -8.3333333333333329e-02 457 384 -1.2499999999999999e-01 457 455 -8.3333333333333329e-02 457 443 -8.3333333333333329e-02 457 524 -8.3333333333333329e-02 457 370 -1.2499999999999999e-01 458 458 7.0833333333333326e-01 458 556 -8.3333333333333329e-02 458 419 -8.3333333333333329e-02 458 371 2.0833333333333332e-02 458 520 -8.3333333333333329e-02 458 468 -8.3333333333333329e-02 458 570 -1.6666666666666666e-01 458 455 -4.1666666666666664e-02 458 454 -1.2499999999999999e-01 458 378 -2.0833333333333332e-02 458 14 -4.1666666666666664e-02 459 459 1.0000000000000002e+00 459 561 -1.6666666666666666e-01 459 534 -1.2499999999999999e-01 459 527 -2.4999999999999997e-01 459 382 2.0833333333333332e-02 459 460 -1.6666666666666666e-01 460 460 6.6666666666666652e-01 460 541 -8.3333333333333329e-02 460 462 -8.3333333333333329e-02 460 549 -1.6666666666666666e-01 460 459 -1.6666666666666666e-01 461 461 1.0000000000000000e+00 462 462 6.2500000000000000e-01 462 524 -8.3333333333333329e-02 462 527 -8.3333333333333329e-02 462 449 -8.3333333333333329e-02 462 460 -8.3333333333333329e-02 462 384 -1.4583333333333331e-01 463 463 1.0000000000000000e+00 464 464 1.0000000000000000e+00 465 465 6.6666666666666652e-01 465 456 -8.3333333333333329e-02 465 467 -8.3333333333333329e-02 465 466 -8.3333333333333329e-02 465 538 -1.6666666666666666e-01 465 556 -8.3333333333333329e-02 465 454 -1.6666666666666666e-01 466 466 6.6666666666666652e-01 466 569 -8.3333333333333329e-02 466 446 -8.3333333333333329e-02 466 382 -1.6666666666666666e-01 466 602 -8.3333333333333329e-02 466 465 -8.3333333333333329e-02 466 389 -1.6666666666666666e-01 467 467 7.4999999999999978e-01 467 561 -8.3333333333333329e-02 467 527 -8.3333333333333329e-02 467 465 -8.3333333333333329e-02 467 384 -2.0833333333333334e-01 467 443 -8.3333333333333329e-02 467 382 -2.0833333333333334e-01 468 468 6.6666666666666663e-01 468 389 -1.6666666666666666e-01 468 458 -8.3333333333333329e-02 468 446 -8.3333333333333329e-02 468 763 -8.3333333333333329e-02 468 749 -8.3333333333333329e-02 468 14 -1.6666666666666666e-01 469 469 1.0000000000000007e+00 469 577 -1.6666666666666666e-01 469 475 -1.6666666666666666e-01 469 470 -1.6666666666666666e-01 469 441 -1.6666666666666666e-01 470 470 6.6666666666666652e-01 470 476 -8.3333333333333329e-02 470 472 -8.3333333333333329e-02 470 572 -1.6666666666666666e-01 470 555 -8.3333333333333329e-02 470 469 -1.6666666666666666e-01 471 471 1.0000000000000000e+00 472 472 6.6666666666666663e-01 472 390 -1.6666666666666666e-01 472 577 -8.3333333333333329e-02 472 470 -8.3333333333333329e-02 472 777 -8.3333333333333329e-02 472 685 -8.3333333333333329e-02 473 473 1.0000000000000000e+00 474 474 1.0000000000000000e+00 475 475 6.6666666666666652e-01 475 575 -8.3333333333333329e-02 475 476 -8.3333333333333329e-02 475 442 -8.3333333333333329e-02 475 573 -1.6666666666666666e-01 475 469 -1.6666666666666666e-01 476 476 6.6666666666666652e-01 476 587 -8.3333333333333329e-02 476 470 -8.3333333333333329e-02 476 571 -8.3333333333333329e-02 476 378 -1.6666666666666666e-01 476 475 -8.3333333333333329e-02 476 390 -1.6666666666666666e-01 477 477 1.0000000000000007e+00 477 593 -1.6666666666666666e-01 477 478 -1.6666666666666666e-01 477 532 -1.6666666666666666e-01 477 481 -2.4999999999999997e-01 477 174 2.0833333333333332e-02 477 287 -1.2500000000000000e-01 478 478 6.6666666666666663e-01 478 479 -8.3333333333333329e-02 478 592 -8.3333333333333329e-02 478 447 -8.3333333333333329e-02 478 477 -1.6666666666666666e-01 478 300 -8.3333333333333329e-02 478 135 -1.6666666666666666e-01 479 479 6.6666666666666641e-01 479 478 -8.3333333333333329e-02 479 383 -1.2500000000000000e-01 479 62 -4.1666666666666664e-02 479 74 -4.1666666666666664e-02 479 15 4.1666666666666664e-02 479 144 -4.1666666666666664e-02 479 143 -4.1666666666666664e-02 479 186 4.1666666666666664e-02 479 136 -8.3333333333333329e-02 479 287 -8.3333333333333329e-02 479 174 -1.2500000000000000e-01 479 145 -8.3333333333333329e-02 480 480 7.5000000000000000e-01 480 383 -1.6666666666666666e-01 480 537 -8.3333333333333329e-02 480 532 -8.3333333333333329e-02 480 287 -8.3333333333333329e-02 480 127 -4.1666666666666664e-02 480 44 -4.1666666666666664e-02 480 11 4.1666666666666664e-02 480 63 -4.1666666666666664e-02 480 62 -4.1666666666666664e-02 480 15 4.1666666666666664e-02 480 39 -8.3333333333333329e-02 481 481 1.0416666666666665e+00 481 477 -2.4999999999999997e-01 481 307 -8.3333333333333329e-02 481 21 2.0833333333333332e-02 481 300 -8.3333333333333329e-02 481 287 -4.1666666666666664e-02 481 282 -4.1666666666666664e-02 481 280 -2.0833333333333331e-01 481 174 -6.2500000000000000e-02 481 279 -4.1666666666666664e-02 481 283 -8.3333333333333329e-02 482 482 2.0000000000000000e+00 483 483 6.6666666666666674e-01 483 502 -4.1666666666666664e-02 483 423 -4.1666666666666664e-02 483 369 -8.3333333333333329e-02 483 411 -4.1666666666666664e-02 483 394 -8.3333333333333329e-02 483 486 -4.1666666666666664e-02 483 485 -4.1666666666666664e-02 483 505 -8.3333333333333329e-02 483 412 -4.1666666666666664e-02 483 501 -8.3333333333333329e-02 483 488 -4.1666666666666664e-02 483 484 -8.3333333333333329e-02 483 393 4.1666666666666664e-02 483 487 -4.1666666666666664e-02 483 7 4.1666666666666664e-02 484 484 6.6666666666666652e-01 484 485 -4.1666666666666664e-02 484 486 -4.1666666666666664e-02 484 394 4.1666666666666664e-02 484 511 -8.3333333333333329e-02 484 393 -8.3333333333333329e-02 484 496 -4.1666666666666664e-02 484 510 -4.1666666666666664e-02 484 376 4.1666666666666664e-02 484 488 -4.1666666666666664e-02 484 411 -4.1666666666666664e-02 484 369 4.1666666666666664e-02 484 494 -8.3333333333333329e-02 484 483 -8.3333333333333329e-02 484 50 -4.1666666666666664e-02 484 102 -4.1666666666666664e-02 484 13 4.1666666666666664e-02 484 99 -8.3333333333333329e-02 485 485 5.0000000000000000e-01 485 505 -4.1666666666666664e-02 485 484 -4.1666666666666664e-02 485 394 -1.2500000000000000e-01 485 393 -1.2500000000000000e-01 485 483 -4.1666666666666664e-02 485 89 -4.1666666666666664e-02 485 99 -4.1666666666666664e-02 485 93 -4.1666666666666664e-02 486 486 5.0000000000000000e-01 486 484 -4.1666666666666664e-02 486 394 -1.2500000000000000e-01 486 483 -4.1666666666666664e-02 486 99 -4.1666666666666664e-02 487 487 5.0000000000000000e-01 487 394 -1.2500000000000000e-01 487 501 -4.1666666666666664e-02 487 483 -4.1666666666666664e-02 487 116 -4.1666666666666664e-02 488 488 5.0000000000000000e-01 488 505 -4.1666666666666664e-02 488 495 -4.1666666666666664e-02 488 484 -4.1666666666666664e-02 488 369 -1.2499999999999999e-01 488 499 -4.1666666666666664e-02 488 494 -4.1666666666666664e-02 488 483 -4.1666666666666664e-02 488 393 -1.2499999999999999e-01 489 489 7.0833333333333304e-01 489 455 -4.1666666666666664e-02 489 424 -4.1666666666666664e-02 489 425 -8.3333333333333329e-02 489 371 4.1666666666666664e-02 489 369 -8.3333333333333329e-02 489 492 -4.1666666666666664e-02 489 490 -8.3333333333333329e-02 489 518 -1.2499999999999999e-01 489 491 -4.1666666666666664e-02 489 416 -8.3333333333333329e-02 489 414 -4.1666666666666664e-02 490 490 6.2499999999999989e-01 490 517 -8.3333333333333329e-02 490 497 -4.1666666666666664e-02 490 434 -4.1666666666666664e-02 490 376 4.1666666666666664e-02 490 492 -4.1666666666666664e-02 490 491 -4.1666666666666664e-02 490 369 4.1666666666666664e-02 490 489 -8.3333333333333329e-02 490 432 -8.3333333333333329e-02 490 370 -1.0416666666666666e-01 490 494 -8.3333333333333329e-02 491 491 5.0000000000000000e-01 491 416 -4.1666666666666664e-02 491 499 -4.1666666666666664e-02 491 495 -4.1666666666666664e-02 491 494 -4.1666666666666664e-02 491 369 -1.2499999999999999e-01 491 490 -4.1666666666666664e-02 491 489 -4.1666666666666664e-02 491 370 -1.2499999999999999e-01 492 492 5.0000000000000000e-01 492 490 -4.1666666666666664e-02 492 369 -1.2499999999999999e-01 492 489 -4.1666666666666664e-02 492 494 -4.1666666666666664e-02 493 493 1.0000000000000000e+00 494 494 6.6666666666666674e-01 494 510 -4.1666666666666664e-02 494 411 -4.1666666666666664e-02 494 369 -8.3333333333333329e-02 494 491 -4.1666666666666664e-02 494 376 -8.3333333333333329e-02 494 434 -4.1666666666666664e-02 494 370 4.1666666666666664e-02 494 496 -4.1666666666666664e-02 494 484 -8.3333333333333329e-02 494 492 -4.1666666666666664e-02 494 488 -4.1666666666666664e-02 494 495 -8.3333333333333329e-02 494 393 4.1666666666666664e-02 494 497 -4.1666666666666664e-02 494 490 -8.3333333333333329e-02 495 495 6.6666666666666652e-01 495 514 -8.3333333333333329e-02 495 417 -4.1666666666666664e-02 495 500 -4.1666666666666664e-02 495 372 4.1666666666666664e-02 495 370 -8.3333333333333329e-02 495 393 -8.3333333333333329e-02 495 488 -4.1666666666666664e-02 495 491 -4.1666666666666664e-02 495 369 4.1666666666666664e-02 495 434 -4.1666666666666664e-02 495 496 -4.1666666666666664e-02 495 376 4.1666666666666664e-02 495 499 -8.3333333333333329e-02 495 494 -8.3333333333333329e-02 495 123 -4.1666666666666664e-02 495 134 -4.1666666666666664e-02 495 11 4.1666666666666664e-02 495 126 -8.3333333333333329e-02 496 496 5.0000000000000000e-01 496 513 -4.1666666666666664e-02 496 484 -4.1666666666666664e-02 496 376 -1.2499999999999999e-01 496 495 -4.1666666666666664e-02 496 514 -4.1666666666666664e-02 496 511 -4.1666666666666664e-02 496 494 -4.1666666666666664e-02 496 393 -1.2499999999999999e-01 497 497 5.0000000000000000e-01 497 432 -4.1666666666666664e-02 497 490 -4.1666666666666664e-02 497 376 -1.2499999999999999e-01 497 494 -4.1666666666666664e-02 498 498 1.0000000000000000e+00 499 499 6.6666666666666674e-01 499 423 -4.1666666666666664e-02 499 506 -4.1666666666666664e-02 499 372 -8.3333333333333329e-02 499 417 -4.1666666666666664e-02 499 369 -8.3333333333333329e-02 499 491 -4.1666666666666664e-02 499 370 4.1666666666666664e-02 499 488 -4.1666666666666664e-02 499 505 -8.3333333333333329e-02 499 418 -4.1666666666666664e-02 499 422 -8.3333333333333329e-02 499 500 -4.1666666666666664e-02 499 495 -8.3333333333333329e-02 499 393 4.1666666666666664e-02 499 424 -4.1666666666666664e-02 499 416 -8.3333333333333329e-02 499 371 4.1666666666666664e-02 499 7 4.1666666666666664e-02 500 500 5.0000000000000000e-01 500 495 -4.1666666666666664e-02 500 505 -4.1666666666666664e-02 500 372 -1.2500000000000000e-01 500 393 -1.2500000000000000e-01 500 499 -4.1666666666666664e-02 500 121 -4.1666666666666664e-02 500 126 -4.1666666666666664e-02 500 118 -4.1666666666666664e-02 501 501 5.8333333333333326e-01 501 412 -4.1666666666666664e-02 501 423 -4.1666666666666664e-02 501 369 4.1666666666666664e-02 501 487 -4.1666666666666664e-02 501 502 -4.1666666666666664e-02 501 394 4.1666666666666664e-02 501 611 -8.3333333333333329e-02 501 421 -8.3333333333333329e-02 501 483 -8.3333333333333329e-02 501 116 -8.3333333333333329e-02 501 7 -8.3333333333333329e-02 502 502 4.9999999999999994e-01 502 505 -4.1666666666666664e-02 502 394 -1.2500000000000000e-01 502 483 -4.1666666666666664e-02 502 501 -4.1666666666666664e-02 502 34 -4.1666666666666664e-02 502 93 -4.1666666666666664e-02 502 116 -4.1666666666666664e-02 502 7 -1.2500000000000000e-01 503 503 2.0000000000000000e+00 504 504 5.0000000000000000e-01 504 394 -1.2499999999999999e-01 504 116 -4.1666666666666664e-02 505 505 6.6666666666666652e-01 505 500 -4.1666666666666664e-02 505 506 -4.1666666666666664e-02 505 372 4.1666666666666664e-02 505 502 -4.1666666666666664e-02 505 485 -4.1666666666666664e-02 505 394 4.1666666666666664e-02 505 393 -8.3333333333333329e-02 505 423 -4.1666666666666664e-02 505 488 -4.1666666666666664e-02 505 369 4.1666666666666664e-02 505 499 -8.3333333333333329e-02 505 483 -8.3333333333333329e-02 505 92 -4.1666666666666664e-02 505 35 -4.1666666666666664e-02 505 8 4.1666666666666664e-02 505 7 -8.3333333333333329e-02 505 118 -8.3333333333333329e-02 505 93 -8.3333333333333329e-02 506 506 4.9999999999999994e-01 506 505 -4.1666666666666664e-02 506 507 -4.1666666666666664e-02 506 372 -1.2500000000000000e-01 506 422 -4.1666666666666664e-02 506 499 -4.1666666666666664e-02 506 118 -4.1666666666666664e-02 506 7 -1.2500000000000000e-01 506 81 -4.1666666666666664e-02 507 507 6.6666666666666674e-01 507 506 -4.1666666666666664e-02 507 372 -8.3333333333333329e-02 507 420 -4.1666666666666664e-02 507 418 -4.1666666666666664e-02 507 371 2.0833333333333332e-02 507 419 -8.3333333333333329e-02 507 422 -8.3333333333333329e-02 507 152 -1.6666666666666666e-01 507 7 2.0833333333333332e-02 507 117 -4.1666666666666664e-02 507 81 -8.3333333333333329e-02 507 180 2.0833333333333332e-02 507 263 -8.3333333333333329e-02 507 14 2.0833333333333332e-02 508 508 1.0000000000000000e+00 509 509 1.0000000000000000e+00 510 510 5.0000000000000000e-01 510 511 -4.1666666666666664e-02 510 484 -4.1666666666666664e-02 510 494 -4.1666666666666664e-02 510 376 -1.2499999999999999e-01 511 511 6.6666666666666652e-01 511 513 -8.3333333333333329e-02 511 484 -8.3333333333333329e-02 511 393 4.1666666666666664e-02 511 428 -4.1666666666666664e-02 511 376 -8.3333333333333329e-02 511 510 -4.1666666666666664e-02 511 496 -4.1666666666666664e-02 511 429 -4.1666666666666664e-02 511 130 -4.1666666666666664e-02 511 13 -8.3333333333333329e-02 511 50 -4.1666666666666664e-02 511 51 -4.1666666666666664e-02 511 102 -4.1666666666666664e-02 512 512 2.0000000000000000e+00 513 513 6.6666666666666641e-01 513 511 -8.3333333333333329e-02 513 514 -8.3333333333333329e-02 513 393 -8.3333333333333329e-02 513 496 -4.1666666666666664e-02 513 428 -4.1666666666666664e-02 513 376 4.1666666666666664e-02 513 123 -4.1666666666666664e-02 513 132 -4.1666666666666664e-02 513 11 4.1666666666666664e-02 513 102 -4.1666666666666664e-02 513 130 -4.1666666666666664e-02 513 13 4.1666666666666664e-02 513 56 -4.1666666666666664e-02 513 90 -4.1666666666666664e-02 513 6 4.1666666666666664e-02 513 122 -8.3333333333333329e-02 513 103 -8.3333333333333329e-02 514 514 6.6666666666666652e-01 514 495 -8.3333333333333329e-02 514 370 4.1666666666666664e-02 514 433 -8.3333333333333329e-02 514 513 -8.3333333333333329e-02 514 393 4.1666666666666664e-02 514 434 -4.1666666666666664e-02 514 376 -8.3333333333333329e-02 514 428 -4.1666666666666664e-02 514 496 -4.1666666666666664e-02 514 435 -4.1666666666666664e-02 514 134 -4.1666666666666664e-02 514 11 -8.3333333333333329e-02 514 132 -4.1666666666666664e-02 514 133 -4.1666666666666664e-02 514 123 -4.1666666666666664e-02 515 515 2.0000000000000000e+00 516 516 5.0000000000000000e-01 516 444 -4.1666666666666664e-02 516 445 -4.1666666666666664e-02 516 372 -1.2500000000000000e-01 516 383 -1.2500000000000000e-01 516 415 -4.1666666666666664e-02 516 60 -4.1666666666666664e-02 516 124 -4.1666666666666664e-02 516 126 -4.1666666666666664e-02 517 517 9.9999999999999978e-01 517 457 -8.3333333333333329e-02 517 384 -4.1666666666666664e-02 517 437 -4.1666666666666664e-02 517 370 -4.1666666666666664e-02 517 490 -8.3333333333333329e-02 517 455 -4.1666666666666664e-02 517 378 8.3333333333333329e-02 517 448 -2.5000000000000000e-01 517 451 -8.3333333333333329e-02 517 518 -2.4999999999999997e-01 517 432 -4.1666666666666671e-02 518 518 1.0000000000000002e+00 518 455 -2.0833333333333331e-01 518 370 4.1666666666666664e-02 518 517 -2.4999999999999997e-01 518 519 -8.3333333333333329e-02 518 437 -2.0833333333333331e-01 518 489 -1.2499999999999999e-01 519 519 7.4999999999999978e-01 519 442 -8.3333333333333329e-02 519 455 -4.1666666666666671e-02 519 371 2.0833333333333332e-02 519 425 -8.3333333333333329e-02 519 573 -1.6666666666666666e-01 519 437 -4.1666666666666664e-02 519 518 -8.3333333333333329e-02 519 378 -4.1666666666666664e-02 519 520 -8.3333333333333329e-02 520 520 5.8333333333333326e-01 520 458 -8.3333333333333329e-02 520 587 -8.3333333333333329e-02 520 371 -1.2499999999999999e-01 520 519 -8.3333333333333329e-02 520 455 -8.3333333333333329e-02 520 378 -1.2499999999999999e-01 521 521 1.0000000000000000e+00 522 522 1.0000000000000000e+00 523 523 1.0000000000000000e+00 524 524 9.9999999999999978e-01 524 462 -8.3333333333333329e-02 524 384 -4.1666666666666664e-02 524 443 -4.1666666666666664e-02 524 370 -4.1666666666666664e-02 524 432 -4.1666666666666664e-02 524 527 -4.1666666666666664e-02 524 382 8.3333333333333329e-02 524 448 -2.5000000000000000e-01 524 457 -8.3333333333333329e-02 524 433 -8.3333333333333329e-02 524 525 -2.4999999999999997e-01 525 525 1.0000000000000002e+00 525 370 4.1666666666666664e-02 525 537 -1.2500000000000000e-01 525 527 -2.0833333333333331e-01 525 524 -2.4999999999999997e-01 525 532 -8.3333333333333329e-02 525 443 -2.0833333333333331e-01 526 526 1.0000000000000000e+00 527 527 1.0416666666666663e+00 527 384 2.0833333333333332e-02 527 467 -8.3333333333333329e-02 527 462 -8.3333333333333329e-02 527 532 -4.1666666666666671e-02 527 525 -2.0833333333333331e-01 527 524 -4.1666666666666664e-02 527 534 -4.1666666666666664e-02 527 459 -2.4999999999999997e-01 527 382 -8.3333333333333329e-02 527 533 -8.3333333333333329e-02 528 528 1.0000000000000000e+00 529 529 1.0000000000000000e+00 530 530 1.0000000000000000e+00 531 531 1.0000000000000000e+00 532 532 7.4999999999999978e-01 532 480 -8.3333333333333329e-02 532 383 2.0833333333333332e-02 532 447 -8.3333333333333329e-02 532 527 -4.1666666666666671e-02 532 477 -1.6666666666666666e-01 532 443 -4.1666666666666664e-02 532 525 -8.3333333333333329e-02 532 382 -4.1666666666666664e-02 532 533 -8.3333333333333329e-02 533 533 5.8333333333333326e-01 533 534 -8.3333333333333329e-02 533 593 -8.3333333333333329e-02 533 532 -8.3333333333333329e-02 533 527 -8.3333333333333329e-02 533 382 -1.2499999999999999e-01 534 534 7.0833333333333326e-01 534 568 -8.3333333333333329e-02 534 533 -8.3333333333333329e-02 534 594 -1.6666666666666666e-01 534 527 -4.1666666666666664e-02 534 459 -1.2499999999999999e-01 534 382 -2.0833333333333332e-02 535 535 1.0000000000000000e+00 536 536 2.0000000000000000e+00 537 537 7.0833333333333326e-01 537 444 -8.3333333333333329e-02 537 383 4.1666666666666664e-02 537 433 -8.3333333333333329e-02 537 370 0.0000000000000000e+00 537 480 -8.3333333333333329e-02 537 443 -4.1666666666666664e-02 537 525 -1.2500000000000000e-01 537 133 -4.1666666666666664e-02 537 11 -8.3333333333333329e-02 537 127 -4.1666666666666664e-02 537 134 -4.1666666666666664e-02 537 44 -4.1666666666666664e-02 538 538 1.0000000000000007e+00 538 465 -1.6666666666666666e-01 538 569 -1.6666666666666666e-01 538 561 -1.6666666666666666e-01 538 539 -1.6666666666666666e-01 538 557 -1.6666666666666666e-01 539 539 6.6666666666666652e-01 539 456 -8.3333333333333329e-02 539 541 -8.3333333333333329e-02 539 555 -8.3333333333333329e-02 539 538 -1.6666666666666666e-01 539 544 -1.6666666666666666e-01 540 540 1.0000000000000000e+00 541 541 6.6666666666666652e-01 541 561 -8.3333333333333329e-02 541 460 -8.3333333333333329e-02 541 545 -8.3333333333333329e-02 541 539 -8.3333333333333329e-02 541 384 -1.6666666666666666e-01 542 542 1.0000000000000000e+00 543 543 1.0000000000000000e+00 544 544 1.0000000000000002e+00 544 378 2.0833333333333332e-02 544 437 -2.5000000000000000e-01 544 441 -1.2500000000000000e-01 544 545 -1.6666666666666666e-01 544 539 -1.6666666666666666e-01 545 545 6.6666666666666652e-01 545 451 -8.3333333333333329e-02 545 541 -8.3333333333333329e-02 545 544 -1.6666666666666666e-01 545 549 -1.6666666666666666e-01 546 546 1.0000000000000000e+00 547 547 1.0000000000000000e+00 548 548 1.0000000000000000e+00 549 549 1.0000000000000007e+00 549 460 -1.6666666666666666e-01 549 449 -1.6666666666666666e-01 549 545 -1.6666666666666666e-01 550 550 1.0000000000000000e+00 551 551 1.0000000000000000e+00 552 552 1.0000000000000000e+00 553 553 1.0000000000000000e+00 554 554 1.0000000000000000e+00 555 555 6.6666666666666652e-01 555 557 -8.3333333333333329e-02 555 441 -8.3333333333333329e-02 555 378 -1.6666666666666666e-01 555 470 -8.3333333333333329e-02 555 539 -8.3333333333333329e-02 556 556 6.6666666666666652e-01 556 458 -8.3333333333333329e-02 556 557 -8.3333333333333329e-02 556 378 -1.6666666666666666e-01 556 571 -8.3333333333333329e-02 556 465 -8.3333333333333329e-02 556 389 -1.6666666666666666e-01 557 557 6.6666666666666652e-01 557 555 -8.3333333333333329e-02 557 556 -8.3333333333333329e-02 557 572 -1.6666666666666666e-01 557 558 -8.3333333333333329e-02 557 538 -1.6666666666666666e-01 558 558 6.6666666666666663e-01 558 389 -1.6666666666666666e-01 558 569 -8.3333333333333329e-02 558 557 -8.3333333333333329e-02 558 681 -8.3333333333333329e-02 558 678 -8.3333333333333329e-02 559 559 1.0000000000000000e+00 560 560 1.0000000000000000e+00 561 561 6.6666666666666652e-01 561 467 -8.3333333333333329e-02 561 541 -8.3333333333333329e-02 561 568 -8.3333333333333329e-02 561 459 -1.6666666666666666e-01 561 538 -1.6666666666666666e-01 562 562 1.0000000000000000e+00 563 563 1.0000000000000000e+00 564 564 1.0000000000000000e+00 565 565 1.0000000000000000e+00 566 566 1.0000000000000000e+00 567 567 1.0000000000000000e+00 568 568 6.6666666666666652e-01 568 534 -8.3333333333333329e-02 568 569 -8.3333333333333329e-02 568 382 -1.6666666666666666e-01 568 600 -8.3333333333333329e-02 568 561 -8.3333333333333329e-02 569 569 6.6666666666666652e-01 569 466 -8.3333333333333329e-02 569 568 -8.3333333333333329e-02 569 558 -8.3333333333333329e-02 569 601 -1.6666666666666666e-01 569 538 -1.6666666666666666e-01 570 570 9.9999999999999956e-01 570 590 -1.6666666666666666e-01 570 571 -1.6666666666666666e-01 570 587 -1.6666666666666666e-01 570 458 -1.6666666666666666e-01 570 765 -1.6666666666666666e-01 570 749 -1.6666666666666666e-01 571 571 6.6666666666666663e-01 571 572 -1.6666666666666666e-01 571 570 -1.6666666666666666e-01 571 476 -8.3333333333333329e-02 571 556 -8.3333333333333329e-02 571 680 -8.3333333333333329e-02 571 679 -8.3333333333333329e-02 572 572 9.9999999999999956e-01 572 571 -1.6666666666666666e-01 572 470 -1.6666666666666666e-01 572 557 -1.6666666666666666e-01 572 777 -1.6666666666666666e-01 572 681 -1.6666666666666666e-01 573 573 1.0000000000000000e+00 573 591 -1.2500000000000000e-01 573 405 2.0833333333333332e-02 573 475 -1.6666666666666666e-01 573 519 -1.6666666666666666e-01 573 587 -1.6666666666666666e-01 573 726 -2.5000000000000000e-01 574 574 1.0000000000000000e+00 575 575 7.5000000000000000e-01 575 390 -2.0833333333333331e-01 575 577 -8.3333333333333329e-02 575 475 -8.3333333333333329e-02 575 682 -8.3333333333333329e-02 575 726 -8.3333333333333329e-02 576 576 2.0000000000000000e+00 577 577 6.6666666666666652e-01 577 472 -8.3333333333333329e-02 577 575 -8.3333333333333329e-02 577 469 -1.6666666666666666e-01 577 581 -1.6666666666666666e-01 578 578 1.0000000000000000e+00 579 579 1.0000000000000000e+00 580 580 1.0000000000000000e+00 581 581 1.0000000000000000e+00 581 577 -1.6666666666666666e-01 581 685 -1.6666666666666666e-01 581 682 -2.4999999999999997e-01 582 582 2.0000000000000000e+00 583 583 1.0000000000000000e+00 584 584 1.0000000000000000e+00 585 585 2.0000000000000000e+00 586 586 2.0000000000000000e+00 587 587 6.6666666666666652e-01 587 476 -8.3333333333333329e-02 587 589 -8.3333333333333329e-02 587 520 -8.3333333333333329e-02 587 570 -1.6666666666666666e-01 587 588 -8.3333333333333329e-02 587 573 -1.6666666666666666e-01 588 588 6.6666666666666663e-01 588 591 -8.3333333333333329e-02 588 371 -1.6666666666666666e-01 588 608 -8.3333333333333329e-02 588 405 -1.6666666666666666e-01 588 590 -8.3333333333333329e-02 588 587 -8.3333333333333329e-02 589 589 6.2500000000000000e-01 589 390 -1.4583333333333331e-01 589 405 -1.4583333333333331e-01 589 587 -8.3333333333333329e-02 589 765 -8.3333333333333329e-02 589 726 -8.3333333333333329e-02 589 767 -8.3333333333333329e-02 590 590 6.6666666666666663e-01 590 570 -1.6666666666666666e-01 590 588 -8.3333333333333329e-02 590 419 -8.3333333333333329e-02 590 779 -8.3333333333333329e-02 590 668 -8.3333333333333329e-02 590 152 -1.6666666666666666e-01 591 591 7.0833333333333326e-01 591 588 -8.3333333333333329e-02 591 573 -1.2500000000000000e-01 591 405 -2.0833333333333332e-02 591 425 -8.3333333333333329e-02 591 609 -1.6666666666666666e-01 591 727 -8.3333333333333329e-02 591 726 -4.1666666666666664e-02 592 592 6.6666666666666652e-01 592 602 -8.3333333333333329e-02 592 600 -8.3333333333333329e-02 592 593 -8.3333333333333329e-02 592 382 -1.6666666666666666e-01 592 478 -8.3333333333333329e-02 592 21 -1.6666666666666666e-01 593 593 6.6666666666666652e-01 593 592 -8.3333333333333329e-02 593 477 -1.6666666666666666e-01 593 533 -8.3333333333333329e-02 593 594 -1.6666666666666666e-01 593 307 -8.3333333333333329e-02 594 594 1.0000000000000007e+00 594 600 -1.6666666666666666e-01 594 534 -1.6666666666666666e-01 594 599 -1.6666666666666666e-01 594 593 -1.6666666666666666e-01 595 595 1.0000000000000000e+00 596 596 1.0000000000000000e+00 597 597 1.0000000000000000e+00 598 598 2.0000000000000000e+00 599 599 6.6666666666666663e-01 599 604 -8.3333333333333329e-02 599 594 -1.6666666666666666e-01 599 307 -8.3333333333333329e-02 599 780 -1.6666666666666666e-01 600 600 6.6666666666666652e-01 600 604 -8.3333333333333329e-02 600 592 -8.3333333333333329e-02 600 594 -1.6666666666666666e-01 600 568 -8.3333333333333329e-02 600 601 -1.6666666666666666e-01 601 601 9.9999999999999956e-01 601 602 -1.6666666666666666e-01 601 600 -1.6666666666666666e-01 601 569 -1.6666666666666666e-01 601 695 -1.6666666666666666e-01 601 678 -1.6666666666666666e-01 602 602 6.6666666666666663e-01 602 601 -1.6666666666666666e-01 602 592 -8.3333333333333329e-02 602 466 -8.3333333333333329e-02 602 691 -8.3333333333333329e-02 602 135 -1.6666666666666666e-01 602 676 -8.3333333333333329e-02 603 603 1.0000000000000000e+00 604 604 6.6666666666666663e-01 604 599 -8.3333333333333329e-02 604 600 -8.3333333333333329e-02 604 789 -8.3333333333333329e-02 604 695 -8.3333333333333329e-02 604 21 -1.6666666666666666e-01 605 605 2.0000000000000000e+00 606 606 1.0000000000000000e+00 607 607 2.0000000000000000e+00 608 608 6.6666666666666663e-01 608 588 -8.3333333333333329e-02 608 610 -8.3333333333333329e-02 608 609 -1.6666666666666666e-01 608 422 -8.3333333333333329e-02 608 82 -8.3333333333333329e-02 608 152 -1.6666666666666666e-01 609 609 1.0000000000000004e+00 609 608 -1.6666666666666666e-01 609 591 -1.6666666666666666e-01 609 421 -1.2500000000000000e-01 609 611 -2.4999999999999997e-01 609 799 -1.6666666666666666e-01 609 7 2.0833333333333332e-02 610 610 6.6666666666666663e-01 610 608 -8.3333333333333329e-02 610 405 -1.6666666666666666e-01 610 807 -8.3333333333333329e-02 610 799 -8.3333333333333329e-02 610 705 -8.3333333333333329e-02 610 19 -1.6666666666666666e-01 611 611 1.0416666666666665e+00 611 609 -2.4999999999999997e-01 611 421 -4.1666666666666664e-02 611 501 -8.3333333333333329e-02 611 19 2.0833333333333332e-02 611 825 -2.0833333333333331e-01 611 824 -4.1666666666666664e-02 611 82 -8.3333333333333329e-02 611 725 -8.3333333333333329e-02 611 7 -8.3333333333333329e-02 611 116 -4.1666666666666664e-02 612 612 2.0000000000000000e+00 613 613 1.0000000000000000e+00 614 614 2.0000000000000000e+00 hypre-2.33.0/src/test/TEST_ams/mfem.Aalpha.00003000066400000000000000000000660041477326011500206240ustar00rootroot00000000000000615 857 615 857 615 615 1.0000000000000000e+00 616 616 1.0000000000000004e+00 616 666 -1.6666666666666666e-01 616 746 -1.6666666666666666e-01 616 732 -1.6666666666666666e-01 616 717 -1.6666666666666666e-01 616 677 -1.6666666666666666e-01 616 660 -1.6666666666666666e-01 617 617 1.0000000000000000e+00 618 618 1.0000000000000000e+00 619 619 1.0833333333333335e+00 619 750 -2.0833333333333332e-02 619 665 -1.2499999999999999e-01 619 666 -1.6666666666666666e-01 619 812 -6.2500000000000000e-02 619 761 -1.2500000000000000e-01 619 667 -4.1666666666666664e-02 619 358 4.1666666666666664e-02 619 299 8.3333333333333329e-02 619 249 -4.1666666666666664e-02 619 269 4.1666666666666664e-02 619 278 -4.1666666666666664e-02 619 255 -4.1666666666666664e-02 619 246 -8.3333333333333329e-02 619 254 -1.4583333333333331e-01 619 202 -1.8749999999999997e-01 619 250 -1.2499999999999999e-01 619 206 -8.3333333333333329e-02 619 200 4.1666666666666664e-02 620 620 1.0000000000000002e+00 620 808 -1.2499999999999999e-01 620 810 2.0833333333333332e-02 620 748 -2.0833333333333331e-01 620 812 -8.3333333333333329e-02 620 750 2.0833333333333332e-02 620 665 -1.2499999999999999e-01 620 667 2.0833333333333332e-02 620 811 2.0833333333333332e-02 620 668 -2.0833333333333331e-01 620 779 -1.6666666666666666e-01 620 745 -1.6666666666666666e-01 621 621 2.0000000000000000e+00 622 622 2.0000000000000000e+00 623 623 1.0000000000000007e+00 623 787 -1.6666666666666666e-01 623 785 -1.6666666666666666e-01 623 691 -1.6666666666666666e-01 623 690 -1.6666666666666666e-01 623 677 -1.6666666666666666e-01 623 676 -1.6666666666666666e-01 624 624 1.0000000000000007e+00 624 753 -1.6666666666666666e-01 624 751 -1.6666666666666666e-01 624 746 -1.6666666666666666e-01 624 745 -1.6666666666666666e-01 624 680 -1.6666666666666666e-01 624 679 -1.6666666666666666e-01 625 625 1.0000000000000000e+00 626 626 1.0000000000000000e+00 627 627 2.0000000000000000e+00 628 628 1.0000000000000000e+00 628 760 -1.8750000000000000e-01 628 667 2.0833333333333332e-02 628 761 -1.2500000000000000e-01 628 693 -1.8749999999999997e-01 628 690 -1.6666666666666666e-01 628 136 2.0833333333333332e-02 628 334 -8.3333333333333329e-02 628 208 4.1666666666666664e-02 628 335 -1.2499999999999999e-01 628 232 -1.2499999999999999e-01 628 333 4.1666666666666664e-02 628 255 2.0833333333333332e-02 628 206 -8.3333333333333329e-02 628 330 4.1666666666666664e-02 628 231 2.0833333333333332e-02 628 234 -1.2499999999999999e-01 629 629 1.0000000000000000e+00 630 630 1.0000000000000000e+00 631 631 2.0000000000000000e+00 632 632 1.0000000000000000e+00 633 633 1.0000000000000000e+00 634 634 1.0000000000000000e+00 635 635 1.0000000000000000e+00 636 636 2.0000000000000000e+00 637 637 1.0000000000000000e+00 638 638 1.0000000000000000e+00 639 639 1.0000000000000000e+00 640 640 1.0000000000000000e+00 641 641 1.0000000000000000e+00 642 642 1.0000000000000000e+00 643 643 1.0000000000000000e+00 644 644 2.0000000000000000e+00 645 645 1.0000000000000000e+00 646 646 2.0000000000000000e+00 647 647 1.0000000000000000e+00 648 648 2.0000000000000000e+00 649 649 1.0833333333333337e+00 649 809 -1.6666666666666666e-01 649 810 -4.1666666666666664e-02 649 808 -1.2499999999999999e-01 649 811 -2.0833333333333332e-02 649 812 -8.3333333333333329e-02 649 260 -1.6666666666666666e-01 649 242 -2.0833333333333332e-02 649 256 2.0833333333333332e-02 649 278 8.3333333333333329e-02 649 257 -1.6666666666666666e-01 649 243 -8.3333333333333329e-02 649 201 -2.0833333333333331e-01 649 241 -1.2499999999999999e-01 649 200 2.0833333333333332e-02 650 650 1.0000000000000000e+00 651 651 1.0000000000000000e+00 652 652 1.0000000000000000e+00 653 653 3.0000000000000000e+00 654 654 1.0000000000000000e+00 655 655 2.0000000000000000e+00 656 656 1.0000000000000000e+00 657 657 1.0000000000000007e+00 657 752 -1.6666666666666666e-01 657 735 -1.6666666666666666e-01 657 754 -1.6666666666666666e-01 657 658 -1.6666666666666666e-01 658 658 6.6666666666666652e-01 658 732 -8.3333333333333329e-02 658 660 -8.3333333333333329e-02 658 730 -1.6666666666666666e-01 658 657 -1.6666666666666666e-01 659 659 1.0000000000000000e+00 660 660 6.6666666666666652e-01 660 752 -8.3333333333333329e-02 660 715 -8.3333333333333329e-02 660 670 -8.3333333333333329e-02 660 658 -8.3333333333333329e-02 660 616 -1.6666666666666666e-01 661 661 1.0000000000000000e+00 662 662 1.0000000000000000e+00 663 663 1.0000000000000007e+00 663 675 -1.6666666666666666e-01 663 763 -1.6666666666666666e-01 663 762 -1.6666666666666666e-01 663 664 -1.6666666666666666e-01 663 749 -1.6666666666666666e-01 663 667 -1.6666666666666666e-01 664 664 6.6666666666666652e-01 664 746 -8.3333333333333329e-02 664 666 -8.3333333333333329e-02 664 665 -8.3333333333333329e-02 664 744 -1.6666666666666666e-01 664 745 -8.3333333333333329e-02 664 663 -1.6666666666666666e-01 665 665 5.8333333333333337e-01 665 619 -1.2499999999999999e-01 665 812 -8.3333333333333329e-02 665 620 -1.2499999999999999e-01 665 750 -8.3333333333333329e-02 665 667 -8.3333333333333329e-02 665 664 -8.3333333333333329e-02 666 666 6.6666666666666663e-01 666 762 -8.3333333333333329e-02 666 842 -8.3333333333333329e-02 666 619 -1.6666666666666666e-01 666 670 -8.3333333333333329e-02 666 616 -1.6666666666666666e-01 666 664 -8.3333333333333329e-02 667 667 7.5000000000000000e-01 667 760 -8.3333333333333329e-02 667 628 2.0833333333333332e-02 667 761 -8.3333333333333329e-02 667 619 -4.1666666666666664e-02 667 812 -4.1666666666666664e-02 667 620 2.0833333333333332e-02 667 665 -8.3333333333333329e-02 667 668 -8.3333333333333329e-02 667 663 -1.6666666666666666e-01 667 14 -8.3333333333333329e-02 667 206 -4.1666666666666664e-02 667 200 -8.3333333333333329e-02 668 668 7.5000000000000000e-01 668 811 -8.3333333333333329e-02 668 620 -2.0833333333333331e-01 668 749 -8.3333333333333329e-02 668 667 -8.3333333333333329e-02 668 590 -8.3333333333333329e-02 668 14 -2.0833333333333331e-01 669 669 1.0000000000000000e+00 669 842 -1.6666666666666666e-01 669 670 -1.6666666666666666e-01 669 715 -1.6666666666666666e-01 669 249 -1.6666666666666666e-01 670 670 6.6666666666666663e-01 670 666 -8.3333333333333329e-02 670 744 -1.6666666666666666e-01 670 669 -1.6666666666666666e-01 670 660 -8.3333333333333329e-02 670 254 -8.3333333333333329e-02 671 671 1.0000000000000000e+00 672 672 1.0000000000000000e+00 673 673 2.0000000000000000e+00 674 674 1.0000000000000007e+00 674 833 -1.6666666666666666e-01 674 681 -1.6666666666666666e-01 674 675 -1.6666666666666666e-01 674 735 -1.6666666666666666e-01 674 678 -1.6666666666666666e-01 675 675 6.6666666666666652e-01 675 746 -8.3333333333333329e-02 675 677 -8.3333333333333329e-02 675 676 -8.3333333333333329e-02 675 663 -1.6666666666666666e-01 675 679 -8.3333333333333329e-02 675 674 -1.6666666666666666e-01 676 676 6.6666666666666652e-01 676 763 -8.3333333333333329e-02 676 678 -8.3333333333333329e-02 676 623 -1.6666666666666666e-01 676 675 -8.3333333333333329e-02 676 602 -8.3333333333333329e-02 676 389 -1.6666666666666666e-01 677 677 6.6666666666666652e-01 677 833 -8.3333333333333329e-02 677 721 -8.3333333333333329e-02 677 762 -8.3333333333333329e-02 677 623 -1.6666666666666666e-01 677 675 -8.3333333333333329e-02 677 616 -1.6666666666666666e-01 678 678 6.6666666666666652e-01 678 785 -8.3333333333333329e-02 678 676 -8.3333333333333329e-02 678 674 -1.6666666666666666e-01 678 601 -1.6666666666666666e-01 678 558 -8.3333333333333329e-02 679 679 6.6666666666666652e-01 679 749 -8.3333333333333329e-02 679 681 -8.3333333333333329e-02 679 624 -1.6666666666666666e-01 679 675 -8.3333333333333329e-02 679 571 -8.3333333333333329e-02 679 389 -1.6666666666666666e-01 680 680 6.6666666666666652e-01 680 777 -8.3333333333333329e-02 680 774 -8.3333333333333329e-02 680 765 -8.3333333333333329e-02 680 624 -1.6666666666666666e-01 680 571 -8.3333333333333329e-02 680 390 -1.6666666666666666e-01 681 681 6.6666666666666652e-01 681 751 -8.3333333333333329e-02 681 679 -8.3333333333333329e-02 681 674 -1.6666666666666666e-01 681 558 -8.3333333333333329e-02 681 572 -1.6666666666666666e-01 682 682 1.0416666666666672e+00 682 850 -2.0833333333333331e-01 682 767 -4.1666666666666671e-02 682 683 -8.3333333333333329e-02 682 390 2.0833333333333332e-02 682 575 -8.3333333333333329e-02 682 581 -2.4999999999999997e-01 683 683 6.2499999999999989e-01 683 774 -8.3333333333333329e-02 683 767 -8.3333333333333329e-02 683 685 -8.3333333333333329e-02 683 682 -8.3333333333333329e-02 683 390 -1.4583333333333331e-01 684 684 1.0000000000000000e+00 685 685 6.6666666666666652e-01 685 683 -8.3333333333333329e-02 685 770 -1.6666666666666666e-01 685 472 -8.3333333333333329e-02 685 581 -1.6666666666666666e-01 686 686 1.0000000000000000e+00 687 687 1.0000000000000000e+00 688 688 9.9999999999999978e-01 688 689 -1.6666666666666666e-01 688 699 -1.6666666666666666e-01 688 692 -1.6666666666666666e-01 688 174 2.0833333333333332e-02 688 231 -1.2500000000000000e-01 688 279 -2.5000000000000000e-01 689 689 6.6666666666666663e-01 689 688 -1.6666666666666666e-01 689 691 -8.3333333333333329e-02 689 690 -8.3333333333333329e-02 689 232 -8.3333333333333329e-02 689 300 -8.3333333333333329e-02 689 135 -1.6666666666666666e-01 690 690 6.6666666666666652e-01 690 763 -8.3333333333333329e-02 690 692 -8.3333333333333329e-02 690 623 -1.6666666666666666e-01 690 689 -8.3333333333333329e-02 690 762 -8.3333333333333329e-02 690 628 -1.6666666666666666e-01 691 691 6.6666666666666652e-01 691 699 -8.3333333333333329e-02 691 695 -8.3333333333333329e-02 691 623 -1.6666666666666666e-01 691 689 -8.3333333333333329e-02 691 602 -8.3333333333333329e-02 691 21 -1.6666666666666666e-01 692 692 6.6666666666666652e-01 692 787 -8.3333333333333329e-02 692 690 -8.3333333333333329e-02 692 764 -1.6666666666666666e-01 692 693 -8.3333333333333329e-02 692 688 -1.6666666666666666e-01 693 693 7.4999999999999989e-01 693 628 -1.8749999999999997e-01 693 692 -8.3333333333333329e-02 693 330 -8.3333333333333329e-02 693 235 -4.1666666666666664e-02 693 234 -4.1666666666666664e-02 693 175 4.1666666666666664e-02 693 255 -8.3333333333333329e-02 693 231 -8.3333333333333329e-02 694 694 1.0000000000000007e+00 694 699 -1.6666666666666666e-01 694 789 -1.6666666666666666e-01 694 695 -1.6666666666666666e-01 694 788 -1.6666666666666666e-01 695 695 6.6666666666666652e-01 695 691 -8.3333333333333329e-02 695 785 -8.3333333333333329e-02 695 694 -1.6666666666666666e-01 695 604 -8.3333333333333329e-02 695 601 -1.6666666666666666e-01 696 696 1.0000000000000000e+00 697 697 1.0000000000000000e+00 698 698 1.0000000000000000e+00 699 699 6.6666666666666652e-01 699 691 -8.3333333333333329e-02 699 701 -8.3333333333333329e-02 699 694 -1.6666666666666666e-01 699 787 -8.3333333333333329e-02 699 688 -1.6666666666666666e-01 700 700 1.0000000000000000e+00 701 701 6.2500000000000000e-01 701 783 -8.3333333333333329e-02 701 789 -8.3333333333333329e-02 701 699 -8.3333333333333329e-02 701 21 -1.4583333333333331e-01 701 279 -8.3333333333333329e-02 702 702 2.0000000000000000e+00 703 703 1.0000000000000000e+00 704 704 1.0000000000000007e+00 704 814 -1.6666666666666666e-01 704 799 -1.6666666666666666e-01 704 705 -1.6666666666666666e-01 704 800 -1.6666666666666666e-01 705 705 6.6666666666666652e-01 705 707 -8.3333333333333329e-02 705 796 -1.6666666666666666e-01 705 797 -8.3333333333333329e-02 705 704 -1.6666666666666666e-01 705 610 -8.3333333333333329e-02 706 706 1.0000000000000000e+00 707 707 6.6666666666666652e-01 707 814 -8.3333333333333329e-02 707 802 -8.3333333333333329e-02 707 711 -8.3333333333333329e-02 707 705 -8.3333333333333329e-02 707 19 -1.6666666666666666e-01 708 708 1.0000000000000000e+00 709 709 1.0000000000000000e+00 710 710 9.9999999999999956e-01 710 802 -1.6666666666666666e-01 710 711 -1.6666666666666666e-01 710 356 -1.6666666666666666e-01 710 242 -1.6666666666666666e-01 711 711 6.6666666666666652e-01 711 848 -8.3333333333333329e-02 711 707 -8.3333333333333329e-02 711 710 -1.6666666666666666e-01 711 818 -1.6666666666666666e-01 712 712 1.0000000000000000e+00 713 713 1.0000000000000000e+00 714 714 1.0000000000000000e+00 715 715 6.6666666666666652e-01 715 660 -8.3333333333333329e-02 715 717 -8.3333333333333329e-02 715 730 -1.6666666666666666e-01 715 669 -1.6666666666666666e-01 716 716 1.0000000000000000e+00 717 717 6.6666666666666652e-01 717 842 -8.3333333333333329e-02 717 835 -8.3333333333333329e-02 717 721 -8.3333333333333329e-02 717 715 -8.3333333333333329e-02 717 616 -1.6666666666666666e-01 718 718 1.0000000000000000e+00 719 719 1.0000000000000000e+00 720 720 1.0000000000000007e+00 720 721 -1.6666666666666666e-01 720 788 -1.6666666666666666e-01 720 835 -1.6666666666666666e-01 720 833 -1.6666666666666666e-01 721 721 6.6666666666666652e-01 721 677 -8.3333333333333329e-02 721 717 -8.3333333333333329e-02 721 764 -1.6666666666666666e-01 721 787 -8.3333333333333329e-02 721 720 -1.6666666666666666e-01 722 722 1.0000000000000000e+00 723 723 1.0000000000000000e+00 724 724 1.0000000000000000e+00 725 725 6.2500000000000000e-01 725 824 -8.3333333333333329e-02 725 814 -8.3333333333333329e-02 725 799 -8.3333333333333329e-02 725 19 -1.4583333333333331e-01 725 611 -8.3333333333333329e-02 726 726 1.0416666666666665e+00 726 800 -4.1666666666666664e-02 726 767 -4.1666666666666664e-02 726 727 -8.3333333333333329e-02 726 850 -2.0833333333333331e-01 726 405 -6.2500000000000000e-02 726 390 2.0833333333333332e-02 726 591 -4.1666666666666664e-02 726 575 -8.3333333333333329e-02 726 573 -2.5000000000000000e-01 726 589 -8.3333333333333329e-02 727 727 5.8333333333333337e-01 727 800 -8.3333333333333329e-02 727 726 -8.3333333333333329e-02 727 799 -8.3333333333333329e-02 727 591 -8.3333333333333329e-02 727 405 -1.2499999999999999e-01 728 728 1.0000000000000000e+00 729 729 1.0000000000000000e+00 730 730 1.0000000000000007e+00 730 715 -1.6666666666666666e-01 730 835 -1.6666666666666666e-01 730 658 -1.6666666666666666e-01 731 731 1.0000000000000000e+00 732 732 6.6666666666666652e-01 732 835 -8.3333333333333329e-02 732 833 -8.3333333333333329e-02 732 735 -8.3333333333333329e-02 732 658 -8.3333333333333329e-02 732 616 -1.6666666666666666e-01 733 733 1.0000000000000000e+00 734 734 1.0000000000000000e+00 735 735 6.6666666666666652e-01 735 746 -8.3333333333333329e-02 735 732 -8.3333333333333329e-02 735 751 -8.3333333333333329e-02 735 657 -1.6666666666666666e-01 735 674 -1.6666666666666666e-01 736 736 1.0000000000000000e+00 737 737 1.0000000000000000e+00 738 738 1.0000000000000000e+00 739 739 1.0000000000000000e+00 740 740 1.0000000000000000e+00 741 741 1.0000000000000000e+00 742 742 1.0000000000000000e+00 743 743 1.0000000000000000e+00 744 744 1.0000000000000004e+00 744 670 -1.6666666666666666e-01 744 750 -1.6666666666666666e-01 744 752 -1.6666666666666666e-01 744 664 -1.6666666666666666e-01 744 747 -1.6666666666666666e-01 745 745 6.6666666666666652e-01 745 749 -8.3333333333333329e-02 745 747 -8.3333333333333329e-02 745 624 -1.6666666666666666e-01 745 765 -8.3333333333333329e-02 745 664 -8.3333333333333329e-02 745 620 -1.6666666666666666e-01 746 746 6.6666666666666652e-01 746 752 -8.3333333333333329e-02 746 735 -8.3333333333333329e-02 746 675 -8.3333333333333329e-02 746 624 -1.6666666666666666e-01 746 664 -8.3333333333333329e-02 746 616 -1.6666666666666666e-01 747 747 6.6666666666666652e-01 747 753 -8.3333333333333329e-02 747 745 -8.3333333333333329e-02 747 766 -1.6666666666666666e-01 747 748 -8.3333333333333329e-02 747 744 -1.6666666666666666e-01 748 748 7.5000000000000000e-01 748 810 -8.3333333333333329e-02 748 750 -8.3333333333333329e-02 748 620 -2.0833333333333331e-01 748 768 -8.3333333333333329e-02 748 747 -8.3333333333333329e-02 749 749 6.6666666666666652e-01 749 745 -8.3333333333333329e-02 749 679 -8.3333333333333329e-02 749 668 -8.3333333333333329e-02 749 663 -1.6666666666666666e-01 749 570 -1.6666666666666666e-01 749 468 -8.3333333333333329e-02 750 750 7.0833333333333326e-01 750 619 -2.0833333333333332e-02 750 748 -8.3333333333333329e-02 750 620 2.0833333333333332e-02 750 665 -8.3333333333333329e-02 750 812 -4.1666666666666664e-02 750 744 -1.6666666666666666e-01 750 254 -8.3333333333333329e-02 750 358 -1.2499999999999999e-01 751 751 6.6666666666666652e-01 751 754 -8.3333333333333329e-02 751 681 -8.3333333333333329e-02 751 624 -1.6666666666666666e-01 751 777 -8.3333333333333329e-02 751 735 -8.3333333333333329e-02 752 752 6.6666666666666652e-01 752 660 -8.3333333333333329e-02 752 746 -8.3333333333333329e-02 752 657 -1.6666666666666666e-01 752 753 -8.3333333333333329e-02 752 744 -1.6666666666666666e-01 753 753 6.6666666666666652e-01 753 747 -8.3333333333333329e-02 753 754 -8.3333333333333329e-02 753 624 -1.6666666666666666e-01 753 774 -8.3333333333333329e-02 753 752 -8.3333333333333329e-02 754 754 6.6666666666666652e-01 754 751 -8.3333333333333329e-02 754 753 -8.3333333333333329e-02 754 770 -1.6666666666666666e-01 754 657 -1.6666666666666666e-01 755 755 1.0000000000000000e+00 756 756 1.0000000000000000e+00 757 757 1.0000000000000000e+00 758 758 1.0000000000000000e+00 759 759 2.0000000000000000e+00 760 760 7.5000000000000000e-01 760 628 -1.8750000000000000e-01 760 667 -8.3333333333333329e-02 760 763 -8.3333333333333329e-02 760 59 -4.1666666666666664e-02 760 335 -4.1666666666666664e-02 760 186 4.1666666666666664e-02 760 136 -8.3333333333333329e-02 760 208 -8.3333333333333329e-02 760 14 -1.8750000000000000e-01 761 761 5.8333333333333326e-01 761 667 -8.3333333333333329e-02 761 628 -1.2500000000000000e-01 761 762 -8.3333333333333329e-02 761 619 -1.2500000000000000e-01 761 255 -8.3333333333333329e-02 761 206 -8.3333333333333329e-02 762 762 6.6666666666666663e-01 762 761 -8.3333333333333329e-02 762 666 -8.3333333333333329e-02 762 764 -1.6666666666666666e-01 762 677 -8.3333333333333329e-02 762 690 -8.3333333333333329e-02 762 663 -1.6666666666666666e-01 763 763 6.6666666666666652e-01 763 676 -8.3333333333333329e-02 763 690 -8.3333333333333329e-02 763 760 -8.3333333333333329e-02 763 663 -1.6666666666666666e-01 763 468 -8.3333333333333329e-02 763 135 -1.6666666666666666e-01 764 764 1.0000000000000000e+00 764 762 -1.6666666666666666e-01 764 842 -1.6666666666666666e-01 764 721 -1.6666666666666666e-01 764 692 -1.6666666666666666e-01 764 255 -1.6666666666666666e-01 765 765 6.6666666666666652e-01 765 680 -8.3333333333333329e-02 765 779 -8.3333333333333329e-02 765 745 -8.3333333333333329e-02 765 766 -1.6666666666666666e-01 765 589 -8.3333333333333329e-02 765 570 -1.6666666666666666e-01 766 766 1.0000000000000007e+00 766 768 -1.2499999999999999e-01 766 747 -1.6666666666666666e-01 766 774 -1.6666666666666666e-01 766 767 -2.5000000000000000e-01 766 765 -1.6666666666666666e-01 766 405 2.0833333333333332e-02 767 767 9.9999999999999978e-01 767 683 -8.3333333333333329e-02 767 682 -4.1666666666666671e-02 767 726 -4.1666666666666664e-02 767 768 -4.1666666666666664e-02 767 797 -8.3333333333333329e-02 767 850 -2.4999999999999997e-01 767 766 -2.5000000000000000e-01 767 390 -4.1666666666666664e-02 767 405 -4.1666666666666664e-02 767 589 -8.3333333333333329e-02 768 768 7.0833333333333326e-01 768 797 -8.3333333333333329e-02 768 779 -8.3333333333333329e-02 768 767 -4.1666666666666664e-02 768 796 -1.6666666666666666e-01 768 748 -8.3333333333333329e-02 768 766 -1.2499999999999999e-01 768 405 -2.0833333333333332e-02 769 769 1.0000000000000000e+00 770 770 1.0000000000000007e+00 770 777 -1.6666666666666666e-01 770 774 -1.6666666666666666e-01 770 754 -1.6666666666666666e-01 770 685 -1.6666666666666666e-01 771 771 1.0000000000000000e+00 772 772 1.0000000000000000e+00 773 773 1.0000000000000000e+00 774 774 6.6666666666666652e-01 774 680 -8.3333333333333329e-02 774 683 -8.3333333333333329e-02 774 753 -8.3333333333333329e-02 774 770 -1.6666666666666666e-01 774 766 -1.6666666666666666e-01 775 775 1.0000000000000000e+00 776 776 1.0000000000000000e+00 777 777 6.6666666666666652e-01 777 680 -8.3333333333333329e-02 777 770 -1.6666666666666666e-01 777 751 -8.3333333333333329e-02 777 472 -8.3333333333333329e-02 777 572 -1.6666666666666666e-01 778 778 1.0000000000000000e+00 779 779 6.6666666666666652e-01 779 768 -8.3333333333333329e-02 779 807 -8.3333333333333329e-02 779 765 -8.3333333333333329e-02 779 620 -1.6666666666666666e-01 779 590 -8.3333333333333329e-02 779 405 -1.6666666666666666e-01 780 780 1.0000000000000009e+00 780 789 -1.6666666666666666e-01 780 783 -2.5000000000000000e-01 780 599 -1.6666666666666666e-01 781 781 2.0000000000000000e+00 782 782 1.0000000000000000e+00 783 783 1.0416666666666670e+00 783 701 -8.3333333333333329e-02 783 780 -2.5000000000000000e-01 783 307 -8.3333333333333329e-02 783 21 2.0833333333333332e-02 783 279 -4.1666666666666664e-02 783 280 -2.0833333333333331e-01 784 784 2.0000000000000000e+00 785 785 6.6666666666666652e-01 785 788 -8.3333333333333329e-02 785 678 -8.3333333333333329e-02 785 623 -1.6666666666666666e-01 785 833 -8.3333333333333329e-02 785 695 -8.3333333333333329e-02 786 786 1.0000000000000000e+00 787 787 6.6666666666666652e-01 787 692 -8.3333333333333329e-02 787 788 -8.3333333333333329e-02 787 623 -1.6666666666666666e-01 787 721 -8.3333333333333329e-02 787 699 -8.3333333333333329e-02 788 788 6.6666666666666652e-01 788 785 -8.3333333333333329e-02 788 787 -8.3333333333333329e-02 788 720 -1.6666666666666666e-01 788 694 -1.6666666666666666e-01 789 789 6.6666666666666652e-01 789 701 -8.3333333333333329e-02 789 780 -1.6666666666666666e-01 789 694 -1.6666666666666666e-01 789 604 -8.3333333333333329e-02 790 790 1.0000000000000000e+00 791 791 1.0000000000000000e+00 792 792 1.0000000000000000e+00 793 793 1.0000000000000000e+00 794 794 1.0000000000000000e+00 795 795 1.0000000000000000e+00 796 796 1.0000000000000004e+00 796 810 -1.6666666666666666e-01 796 802 -1.6666666666666666e-01 796 807 -1.6666666666666666e-01 796 705 -1.6666666666666666e-01 796 768 -1.6666666666666666e-01 797 797 6.2500000000000000e-01 797 800 -8.3333333333333329e-02 797 768 -8.3333333333333329e-02 797 767 -8.3333333333333329e-02 797 705 -8.3333333333333329e-02 797 405 -1.4583333333333331e-01 798 798 1.0000000000000000e+00 799 799 6.6666666666666652e-01 799 725 -8.3333333333333329e-02 799 704 -1.6666666666666666e-01 799 727 -8.3333333333333329e-02 799 610 -8.3333333333333329e-02 799 609 -1.6666666666666666e-01 800 800 7.0833333333333326e-01 800 726 -4.1666666666666664e-02 800 850 -1.2500000000000000e-01 800 797 -8.3333333333333329e-02 800 727 -8.3333333333333329e-02 800 704 -1.6666666666666666e-01 800 405 -2.0833333333333332e-02 801 801 1.0000000000000000e+00 802 802 6.6666666666666663e-01 802 809 -8.3333333333333329e-02 802 710 -1.6666666666666666e-01 802 796 -1.6666666666666666e-01 802 707 -8.3333333333333329e-02 802 241 -8.3333333333333329e-02 803 803 1.0000000000000000e+00 804 804 1.0000000000000000e+00 805 805 2.0000000000000000e+00 806 806 2.0000000000000000e+00 807 807 6.6666666666666652e-01 807 809 -8.3333333333333329e-02 807 808 -8.3333333333333329e-02 807 779 -8.3333333333333329e-02 807 796 -1.6666666666666666e-01 807 610 -8.3333333333333329e-02 807 152 -1.6666666666666666e-01 808 808 5.8333333333333326e-01 808 620 -1.2499999999999999e-01 808 810 -8.3333333333333329e-02 808 812 -8.3333333333333329e-02 808 649 -1.2499999999999999e-01 808 811 -8.3333333333333329e-02 808 807 -8.3333333333333329e-02 809 809 6.6666666666666663e-01 809 649 -1.6666666666666666e-01 809 802 -8.3333333333333329e-02 809 807 -8.3333333333333329e-02 809 357 -8.3333333333333329e-02 809 19 -1.6666666666666666e-01 809 356 -8.3333333333333329e-02 810 810 7.5000000000000000e-01 810 748 -8.3333333333333329e-02 810 812 -4.1666666666666671e-02 810 620 2.0833333333333332e-02 810 796 -1.6666666666666666e-01 810 649 -4.1666666666666664e-02 810 808 -8.3333333333333329e-02 810 241 -8.3333333333333329e-02 810 243 -4.1666666666666664e-02 810 358 -8.3333333333333329e-02 811 811 7.0833333333333326e-01 811 649 -2.0833333333333332e-02 811 620 2.0833333333333332e-02 811 812 -4.1666666666666664e-02 811 668 -8.3333333333333329e-02 811 808 -8.3333333333333329e-02 811 260 -8.3333333333333329e-02 811 263 -8.3333333333333329e-02 811 152 -1.6666666666666666e-01 811 14 -4.1666666666666664e-02 811 200 -1.2499999999999999e-01 812 812 1.0416666666666667e+00 812 810 -4.1666666666666671e-02 812 620 -8.3333333333333329e-02 812 665 -8.3333333333333329e-02 812 750 -4.1666666666666664e-02 812 619 -6.2500000000000000e-02 812 808 -8.3333333333333329e-02 812 649 -8.3333333333333329e-02 812 667 -4.1666666666666664e-02 812 811 -4.1666666666666664e-02 812 358 -2.0833333333333331e-01 812 158 2.0833333333333332e-02 812 278 -4.1666666666666671e-02 812 14 8.3333333333333329e-02 812 201 -8.3333333333333329e-02 812 202 -8.3333333333333329e-02 812 200 -2.4999999999999997e-01 813 813 1.0000000000000000e+00 814 814 6.6666666666666652e-01 814 707 -8.3333333333333329e-02 814 725 -8.3333333333333329e-02 814 704 -1.6666666666666666e-01 814 818 -1.6666666666666666e-01 815 815 1.0000000000000000e+00 816 816 1.0000000000000000e+00 817 817 1.0000000000000000e+00 818 818 1.0000000000000004e+00 818 824 -2.5000000000000000e-01 818 711 -1.6666666666666666e-01 818 814 -1.6666666666666666e-01 819 819 1.0000000000000000e+00 820 820 1.0000000000000000e+00 821 821 1.0000000000000000e+00 822 822 1.0000000000000000e+00 823 823 1.0000000000000000e+00 824 824 9.9999999999999978e-01 824 725 -8.3333333333333329e-02 824 831 -4.1666666666666664e-02 824 818 -2.5000000000000000e-01 824 848 -8.3333333333333329e-02 824 825 -2.4999999999999997e-01 824 19 -4.1666666666666664e-02 824 611 -4.1666666666666664e-02 824 7 8.3333333333333329e-02 825 825 1.0000000000000002e+00 825 824 -2.4999999999999997e-01 825 831 -2.0833333333333331e-01 825 611 -2.0833333333333331e-01 825 116 -8.3333333333333329e-02 826 826 1.0000000000000000e+00 827 827 1.0000000000000000e+00 828 828 1.0000000000000000e+00 829 829 2.0000000000000000e+00 830 830 1.0000000000000000e+00 831 831 1.0416666666666665e+00 831 848 -8.3333333333333329e-02 831 824 -4.1666666666666664e-02 831 825 -2.0833333333333331e-01 831 7 -8.3333333333333329e-02 831 116 -4.1666666666666664e-02 831 33 -4.1666666666666671e-02 831 82 -8.3333333333333329e-02 831 355 -2.5000000000000000e-01 831 34 -8.3333333333333329e-02 831 19 2.0833333333333332e-02 832 832 1.0000000000000000e+00 833 833 6.6666666666666652e-01 833 677 -8.3333333333333329e-02 833 732 -8.3333333333333329e-02 833 785 -8.3333333333333329e-02 833 674 -1.6666666666666666e-01 833 720 -1.6666666666666666e-01 834 834 1.0000000000000000e+00 835 835 6.6666666666666652e-01 835 717 -8.3333333333333329e-02 835 732 -8.3333333333333329e-02 835 720 -1.6666666666666666e-01 835 730 -1.6666666666666666e-01 836 836 1.0000000000000000e+00 837 837 1.0000000000000000e+00 838 838 1.0000000000000000e+00 839 839 1.0000000000000000e+00 840 840 1.0000000000000000e+00 841 841 1.0000000000000000e+00 842 842 6.6666666666666663e-01 842 666 -8.3333333333333329e-02 842 669 -1.6666666666666666e-01 842 764 -1.6666666666666666e-01 842 717 -8.3333333333333329e-02 842 250 -8.3333333333333329e-02 843 843 1.0000000000000000e+00 844 844 1.0000000000000000e+00 845 845 2.0000000000000000e+00 846 846 2.0000000000000000e+00 847 847 1.0000000000000000e+00 848 848 6.2500000000000000e-01 848 831 -8.3333333333333329e-02 848 711 -8.3333333333333329e-02 848 824 -8.3333333333333329e-02 848 19 -1.4583333333333331e-01 848 356 -8.3333333333333329e-02 849 849 2.0000000000000000e+00 850 850 1.0000000000000002e+00 850 800 -1.2500000000000000e-01 850 682 -2.0833333333333331e-01 850 767 -2.4999999999999997e-01 850 726 -2.0833333333333331e-01 850 405 4.1666666666666664e-02 851 851 1.0000000000000000e+00 852 852 1.0000000000000000e+00 853 853 1.0000000000000000e+00 854 854 1.0000000000000000e+00 855 855 1.0000000000000000e+00 856 856 1.0000000000000000e+00 857 857 1.0000000000000000e+00 hypre-2.33.0/src/test/TEST_ams/mfem.Abeta.00000000066400000000000000000001054131477326011500204450ustar00rootroot000000000000001 152 1 152 1 1 3.0000000000000000e+00 2 2 1.0000000000000000e+00 3 3 1.0000000000000000e+00 4 4 1.0000000000000000e+00 5 5 1.0000000000000000e+00 6 6 1.0000000000000007e+00 6 40 4.1666666666666664e-02 6 122 -8.3333333333333329e-02 6 121 4.1666666666666664e-02 6 120 -1.2499999999999999e-01 6 119 -8.3333333333333329e-02 6 64 4.1666666666666664e-02 6 103 -8.3333333333333329e-02 6 91 -1.2499999999999999e-01 6 90 -1.2499999999999999e-01 6 88 -8.3333333333333329e-02 6 89 4.1666666666666664e-02 6 57 -1.2499999999999999e-01 6 56 -1.2499999999999999e-01 6 32 -1.2499999999999999e-01 6 30 -1.2499999999999999e-01 6 29 -1.2499999999999999e-01 6 513 4.1666666666666664e-02 7 7 5.0000000583333359e-01 7 82 -2.0833333333333334e-09 7 116 2.0833332916666666e-02 7 118 4.1666666666666664e-02 7 93 4.1666666666666664e-02 7 35 -1.2499999999999999e-01 7 81 -4.1666667500000004e-02 7 33 2.0833333124999999e-02 7 34 -4.1666667083333331e-02 7 499 4.1666666666666664e-02 7 505 -8.3333333333333329e-02 7 483 4.1666666666666664e-02 7 502 -1.2500000000000000e-01 7 506 -1.2500000000000000e-01 7 422 -4.1666667500000011e-02 7 507 2.0833333333333332e-02 7 423 -1.2499999999999999e-01 7 501 -4.1666667083333331e-02 7 421 2.0833333124999999e-02 7 824 8.3333333333333335e-10 7 831 -8.3333333333333335e-10 7 611 -8.3333333333333335e-10 7 609 2.0833333333333334e-10 7 355 2.0833333333333334e-10 8 8 1.0000000000000007e+00 8 64 4.1666666666666664e-02 8 121 4.1666666666666664e-02 8 81 4.1666666666666664e-02 8 118 -8.3333333333333329e-02 8 93 -8.3333333333333329e-02 8 92 -1.2499999999999999e-01 8 89 4.1666666666666664e-02 8 88 -8.3333333333333329e-02 8 87 -1.2499999999999999e-01 8 86 -1.2499999999999999e-01 8 48 -1.2499999999999999e-01 8 47 -1.2499999999999999e-01 8 45 -8.3333333333333329e-02 8 46 4.1666666666666664e-02 8 38 -1.2499999999999999e-01 8 36 -1.2499999999999999e-01 8 35 -1.2499999999999999e-01 8 33 -8.3333333333333329e-02 8 34 4.1666666666666664e-02 8 505 4.1666666666666664e-02 8 262 4.1666666666666664e-02 9 9 5.0000000500000019e-01 9 149 4.1666666666666668e-10 9 110 4.1666666666666668e-10 9 145 4.1666666666666668e-10 9 147 -8.3333333333333335e-10 9 139 4.1666666666666668e-10 9 118 4.1666666666666664e-02 9 126 4.1666666666666664e-02 9 122 4.1666666666666664e-02 9 121 -8.3333333333333329e-02 9 88 4.1666666666666664e-02 9 148 -1.2500000000000000e-09 9 61 -1.2500000000000000e-09 9 146 -1.2500000000000000e-09 9 65 -1.2500000000000000e-09 9 125 -1.2499999999999999e-01 9 46 -4.1666667083333331e-02 9 124 2.0833333541666665e-02 9 41 -1.2499999999999999e-01 9 60 -4.1666667083333331e-02 9 39 2.0833333541666665e-02 9 120 -1.2499999999999999e-01 9 40 -4.1666667083333331e-02 9 119 2.0833333541666665e-02 9 47 -1.2499999999999999e-01 9 64 -4.1666667083333331e-02 9 45 2.0833333541666665e-02 10 10 1.0000000000000000e+00 11 11 1.0000000000000007e+00 11 134 -1.2499999999999999e-01 11 133 -1.2499999999999999e-01 11 132 -1.2499999999999999e-01 11 127 -1.2499999999999999e-01 11 60 4.1666666666666664e-02 11 126 -8.3333333333333329e-02 11 123 -1.2499999999999999e-01 11 121 4.1666666666666664e-02 11 122 -8.3333333333333329e-02 11 44 -1.2499999999999999e-01 11 42 -1.2499999999999999e-01 11 41 -1.2499999999999999e-01 11 39 -8.3333333333333329e-02 11 40 4.1666666666666664e-02 11 433 4.1666666666666664e-02 11 495 4.1666666666666664e-02 11 537 -8.3333333333333329e-02 11 444 4.1666666666666664e-02 11 513 4.1666666666666664e-02 11 514 -8.3333333333333329e-02 11 480 4.1666666666666664e-02 12 12 1.0000000000000000e+00 13 13 1.0000000000000007e+00 13 130 -1.2499999999999999e-01 13 104 -1.2499999999999999e-01 13 103 -8.3333333333333329e-02 13 102 -1.2499999999999999e-01 13 89 4.1666666666666664e-02 13 99 -8.3333333333333329e-02 13 97 -1.2499999999999999e-01 13 96 -1.2499999999999999e-01 13 53 -1.2499999999999999e-01 13 51 -1.2499999999999999e-01 13 50 -1.2499999999999999e-01 13 513 4.1666666666666664e-02 13 511 -8.3333333333333329e-02 13 484 4.1666666666666664e-02 14 14 6.6666667333333329e-01 14 136 2.0833333333333334e-10 14 124 2.0833333541666665e-02 14 59 -1.2500000000000000e-09 14 760 -4.1666668125000000e-02 14 208 -2.0833333333333334e-10 14 206 8.3333333333333335e-10 14 811 -4.1666666666666668e-10 14 667 -8.3333333333333335e-10 14 812 8.3333333333333335e-10 14 200 -8.3333333333333335e-10 14 263 -2.0833334375000002e-02 14 507 2.0833333333333332e-02 14 458 -4.1666666666666664e-02 14 455 8.3333333333333329e-02 14 454 -8.3333333333333329e-02 14 446 -4.1666666666666664e-02 14 443 8.3333333333333329e-02 14 445 -1.4583333354166667e-01 14 468 -1.2500000041666665e-01 14 420 -1.2500000000000000e-01 14 419 -1.4583333374999999e-01 14 415 -6.2500000000000000e-02 14 668 -4.1666668333333337e-02 15 15 1.0000000000000008e-08 15 40 4.1666666666666668e-10 15 147 4.1666666666666668e-10 15 145 -8.3333333333333335e-10 15 113 -1.2500000000000000e-09 15 110 -8.3333333333333335e-10 15 109 -1.2500000000000000e-09 15 108 -1.2500000000000000e-09 15 75 -1.2500000000000000e-09 15 74 -1.2500000000000000e-09 15 63 -1.2500000000000000e-09 15 62 -1.2500000000000000e-09 15 61 -1.2500000000000000e-09 15 39 -8.3333333333333335e-10 15 60 4.1666666666666668e-10 15 479 4.1666666666666668e-10 15 338 4.1666666666666668e-10 15 251 -8.3333333333333335e-10 15 252 4.1666666666666668e-10 15 287 -8.3333333333333335e-10 15 283 4.1666666666666668e-10 15 480 4.1666666666666668e-10 16 16 1.0000000000000000e+00 17 17 1.0000000000000008e-08 17 151 -1.2500000000000000e-09 17 149 -8.3333333333333335e-10 17 46 4.1666666666666668e-10 17 147 4.1666666666666668e-10 17 142 -1.2500000000000000e-09 17 141 -1.2500000000000000e-09 17 139 -8.3333333333333335e-10 17 138 -1.2500000000000000e-09 17 137 -1.2500000000000000e-09 17 68 -1.2500000000000000e-09 17 66 -1.2500000000000000e-09 17 65 -1.2500000000000000e-09 17 45 -8.3333333333333335e-10 17 64 4.1666666666666668e-10 17 327 4.1666666666666668e-10 17 227 4.1666666666666668e-10 17 328 -8.3333333333333335e-10 17 329 4.1666666666666668e-10 17 262 4.1666666666666668e-10 17 303 -8.3333333333333335e-10 17 301 4.1666666666666668e-10 18 18 1.0000000000000008e-08 18 64 4.1666666666666668e-10 18 149 -8.3333333333333335e-10 18 147 4.1666666666666668e-10 18 148 -1.2500000000000000e-09 18 119 -8.3333333333333335e-10 18 40 4.1666666666666668e-10 18 112 -1.2500000000000000e-09 18 111 -1.2500000000000000e-09 18 110 -8.3333333333333335e-10 18 79 -1.2500000000000000e-09 18 78 -1.2500000000000000e-09 18 73 -1.2500000000000000e-09 18 71 -1.2500000000000000e-09 18 70 -1.2500000000000000e-09 18 326 -8.3333333333333335e-10 18 327 4.1666666666666668e-10 18 252 4.1666666666666668e-10 19 19 1.0000000000000005e-08 19 82 -2.0833333333333334e-09 19 848 -1.4583333333333334e-09 19 809 -1.6666666666666667e-09 19 610 -1.6666666666666667e-09 19 611 2.0833333333333334e-10 19 831 2.0833333333333334e-10 19 824 -4.1666666666666668e-10 19 725 -1.4583333333333334e-09 19 707 -1.6666666666666667e-09 20 20 1.0000000000000000e+00 21 21 9.9999999999999967e-01 21 481 2.0833333333333332e-02 21 307 -2.0833333333333331e-01 21 783 2.0833333333333332e-02 21 279 -4.1666666666666664e-02 21 701 -1.4583333333333331e-01 21 300 -1.4583333333333331e-01 21 604 -1.6666666666666666e-01 21 592 -1.6666666666666666e-01 21 691 -1.6666666666666666e-01 22 22 1.0000000000000000e+00 23 23 1.0000000000000000e+00 24 24 5.0000000000000000e-01 24 99 -4.1666666666666664e-02 24 89 -4.1666666666666664e-02 24 93 -4.1666666666666664e-02 24 394 -1.2499999999999999e-01 25 25 5.0000000000000000e-01 25 116 -4.1666666666666664e-02 25 34 -4.1666666666666664e-02 25 93 -4.1666666666666664e-02 25 394 -1.2499999999999999e-01 26 26 1.0000000000000000e+00 27 27 1.0000000000000000e+00 28 28 1.0000000000000000e+00 29 29 5.0000000000000000e-01 29 103 -4.1666666666666664e-02 29 89 -4.1666666666666664e-02 29 88 -4.1666666666666664e-02 29 6 -1.2499999999999999e-01 30 30 5.0000000000000000e-01 30 6 -1.2499999999999999e-01 30 103 -4.1666666666666664e-02 31 31 1.0000000000000000e+00 32 32 5.0000000000000000e-01 32 6 -1.2499999999999999e-01 32 119 -4.1666666666666664e-02 33 33 3.3333333708333329e-01 33 48 -4.1666666666666664e-02 33 8 -8.3333333333333329e-02 33 36 -4.1666666666666664e-02 33 35 -4.1666666666666664e-02 33 81 -4.1666667083333331e-02 33 7 2.0833333124999999e-02 33 34 -4.1666667083333331e-02 33 38 -4.1666666666666664e-02 33 180 2.0833333333333332e-02 33 831 -4.1666666666666668e-10 33 262 -4.1666667083333331e-02 33 355 -1.2500000000000000e-09 34 34 3.3333333583333330e-01 34 25 -4.1666666666666664e-02 34 36 -4.1666666666666664e-02 34 35 -4.1666666666666664e-02 34 8 4.1666666666666664e-02 34 116 -4.1666667083333338e-02 34 93 -8.3333333333333329e-02 34 33 -4.1666667083333331e-02 34 7 -4.1666667083333331e-02 34 502 -4.1666666666666664e-02 34 394 4.1666666666666664e-02 34 831 -8.3333333333333335e-10 35 35 5.0000000000000000e-01 35 81 -4.1666666666666664e-02 35 118 -4.1666666666666664e-02 35 93 -4.1666666666666664e-02 35 8 -1.2499999999999999e-01 35 34 -4.1666666666666664e-02 35 33 -4.1666666666666664e-02 35 7 -1.2499999999999999e-01 35 505 -4.1666666666666664e-02 36 36 5.0000000000000000e-01 36 34 -4.1666666666666664e-02 36 8 -1.2499999999999999e-01 36 33 -4.1666666666666664e-02 36 93 -4.1666666666666664e-02 37 37 1.0000000000000000e+00 38 38 5.0000000000000000e-01 38 8 -1.2499999999999999e-01 38 45 -4.1666666666666664e-02 38 33 -4.1666666666666664e-02 38 262 -4.1666666666666664e-02 39 39 3.3333333666666665e-01 39 109 -4.1666666666666668e-10 39 127 -4.1666666666666664e-02 39 15 -8.3333333333333335e-10 39 62 -4.1666666666666668e-10 39 11 -8.3333333333333329e-02 39 42 -4.1666666666666664e-02 39 61 -4.1666666666666668e-10 39 40 -4.1666667083333331e-02 39 41 -4.1666666666666664e-02 39 60 -4.1666667083333331e-02 39 9 2.0833333541666665e-02 39 63 -4.1666666666666668e-10 39 44 -4.1666666666666664e-02 39 383 2.0833333541666665e-02 39 480 -4.1666667083333331e-02 40 40 3.3333333666666687e-01 40 109 -4.1666666666666668e-10 40 61 -4.1666666666666668e-10 40 15 4.1666666666666668e-10 40 112 -4.1666666666666668e-10 40 148 -4.1666666666666668e-10 40 18 4.1666666666666668e-10 40 57 -4.1666666666666664e-02 40 120 -4.1666666666666664e-02 40 6 4.1666666666666664e-02 40 42 -4.1666666666666664e-02 40 41 -4.1666666666666664e-02 40 11 4.1666666666666664e-02 40 39 -4.1666667083333331e-02 40 110 -8.3333333333333335e-10 40 119 -4.1666667083333338e-02 40 9 -4.1666667083333331e-02 40 122 -8.3333333333333329e-02 41 41 5.0000000000000000e-01 41 60 -4.1666666666666664e-02 41 126 -4.1666666666666664e-02 41 121 -4.1666666666666664e-02 41 122 -4.1666666666666664e-02 41 11 -1.2499999999999999e-01 41 40 -4.1666666666666664e-02 41 39 -4.1666666666666664e-02 41 9 -1.2499999999999999e-01 42 42 5.0000000000000000e-01 42 40 -4.1666666666666664e-02 42 11 -1.2499999999999999e-01 42 39 -4.1666666666666664e-02 42 122 -4.1666666666666664e-02 43 43 1.0000000000000000e+00 44 44 5.0000000000000000e-01 44 11 -1.2499999999999999e-01 44 39 -4.1666666666666664e-02 44 480 -4.1666666666666664e-02 44 537 -4.1666666666666664e-02 45 45 3.3333333666666665e-01 45 138 -4.1666666666666668e-10 45 87 -4.1666666666666664e-02 45 17 -8.3333333333333335e-10 45 66 -4.1666666666666668e-10 45 8 -8.3333333333333329e-02 45 48 -4.1666666666666664e-02 45 65 -4.1666666666666668e-10 45 46 -4.1666667083333331e-02 45 47 -4.1666666666666664e-02 45 64 -4.1666667083333331e-02 45 9 2.0833333541666665e-02 45 68 -4.1666666666666668e-10 45 38 -4.1666666666666664e-02 45 180 2.0833333541666669e-02 45 262 -4.1666667083333338e-02 46 46 3.3333333666666687e-01 46 138 -4.1666666666666668e-10 46 65 -4.1666666666666668e-10 46 17 4.1666666666666668e-10 46 140 -4.1666666666666668e-10 46 146 -4.1666666666666668e-10 46 117 -4.1666666666666664e-02 46 125 -4.1666666666666664e-02 46 48 -4.1666666666666664e-02 46 47 -4.1666666666666664e-02 46 8 4.1666666666666664e-02 46 45 -4.1666667083333331e-02 46 139 -8.3333333333333335e-10 46 124 -4.1666667083333338e-02 46 9 -4.1666667083333331e-02 46 118 -8.3333333333333329e-02 46 186 4.1666666666666668e-10 46 372 4.1666666666666664e-02 46 180 -4.1666667083333331e-02 47 47 5.0000000000000000e-01 47 118 -4.1666666666666664e-02 47 64 -4.1666666666666664e-02 47 121 -4.1666666666666664e-02 47 88 -4.1666666666666664e-02 47 8 -1.2499999999999999e-01 47 46 -4.1666666666666664e-02 47 45 -4.1666666666666664e-02 47 9 -1.2499999999999999e-01 48 48 5.0000000000000000e-01 48 33 -4.1666666666666664e-02 48 81 -4.1666666666666664e-02 48 46 -4.1666666666666664e-02 48 8 -1.2499999999999999e-01 48 45 -4.1666666666666664e-02 48 118 -4.1666666666666664e-02 48 262 -4.1666666666666664e-02 48 180 -1.2499999999999999e-01 49 49 1.0000000000000000e+00 50 50 5.0000000000000000e-01 50 99 -4.1666666666666664e-02 50 13 -1.2499999999999999e-01 50 511 -4.1666666666666664e-02 50 484 -4.1666666666666664e-02 51 51 5.0000000000000000e-01 51 13 -1.2499999999999999e-01 51 511 -4.1666666666666664e-02 52 52 1.0000000000000000e+00 53 53 5.0000000000000000e-01 53 13 -1.2499999999999999e-01 54 54 1.0000000000000000e+00 55 55 1.0000000000000000e+00 56 56 5.0000000000000000e-01 56 122 -4.1666666666666664e-02 56 103 -4.1666666666666664e-02 56 6 -1.2499999999999999e-01 56 513 -4.1666666666666664e-02 57 57 5.0000000000000000e-01 57 119 -4.1666666666666664e-02 57 40 -4.1666666666666664e-02 57 6 -1.2499999999999999e-01 57 122 -4.1666666666666664e-02 58 58 1.0000000000000000e+00 59 59 5.0000000000000018e-09 59 124 -4.1666666666666668e-10 59 136 -4.1666666666666668e-10 59 14 -1.2500000000000000e-09 59 445 -4.1666666666666668e-10 59 263 -4.1666666666666668e-10 59 760 -4.1666666666666668e-10 59 186 -1.2500000000000000e-09 59 208 -4.1666666666666668e-10 60 60 3.3333333666666681e-01 60 144 -4.1666666666666668e-10 60 146 -4.1666666666666668e-10 60 127 -4.1666666666666664e-02 60 41 -4.1666666666666664e-02 60 11 4.1666666666666664e-02 60 125 -4.1666666666666664e-02 60 62 -4.1666666666666668e-10 60 61 -4.1666666666666668e-10 60 15 4.1666666666666668e-10 60 124 -4.1666667083333331e-02 60 145 -8.3333333333333335e-10 60 39 -4.1666667083333331e-02 60 9 -4.1666667083333331e-02 60 126 -8.3333333333333329e-02 60 186 4.1666666666666668e-10 60 516 -4.1666666666666664e-02 60 372 4.1666666666666664e-02 60 383 -4.1666667083333331e-02 61 61 5.0000000000000018e-09 61 40 -4.1666666666666668e-10 61 110 -4.1666666666666668e-10 61 147 -4.1666666666666668e-10 61 145 -4.1666666666666668e-10 61 15 -1.2500000000000000e-09 61 60 -4.1666666666666668e-10 61 39 -4.1666666666666668e-10 61 9 -1.2500000000000000e-09 62 62 5.0000000000000018e-09 62 60 -4.1666666666666668e-10 62 15 -1.2500000000000000e-09 62 39 -4.1666666666666668e-10 62 145 -4.1666666666666668e-10 62 287 -4.1666666666666668e-10 62 479 -4.1666666666666668e-10 62 480 -4.1666666666666668e-10 62 383 -1.2500000000000000e-09 63 63 5.0000000000000018e-09 63 15 -1.2500000000000000e-09 63 39 -4.1666666666666668e-10 63 480 -4.1666666666666668e-10 63 287 -4.1666666666666668e-10 64 64 3.3333333666666681e-01 64 79 -4.1666666666666668e-10 64 148 -4.1666666666666668e-10 64 18 4.1666666666666668e-10 64 87 -4.1666666666666664e-02 64 47 -4.1666666666666664e-02 64 8 4.1666666666666664e-02 64 91 -4.1666666666666664e-02 64 120 -4.1666666666666664e-02 64 6 4.1666666666666664e-02 64 66 -4.1666666666666668e-10 64 65 -4.1666666666666668e-10 64 17 4.1666666666666668e-10 64 119 -4.1666667083333331e-02 64 149 -8.3333333333333335e-10 64 45 -4.1666667083333331e-02 64 9 -4.1666667083333331e-02 64 88 -8.3333333333333329e-02 65 65 5.0000000000000018e-09 65 149 -4.1666666666666668e-10 65 46 -4.1666666666666668e-10 65 147 -4.1666666666666668e-10 65 139 -4.1666666666666668e-10 65 17 -1.2500000000000000e-09 65 64 -4.1666666666666668e-10 65 45 -4.1666666666666668e-10 65 9 -1.2500000000000000e-09 66 66 5.0000000000000018e-09 66 64 -4.1666666666666668e-10 66 17 -1.2500000000000000e-09 66 45 -4.1666666666666668e-10 66 149 -4.1666666666666668e-10 67 67 1.0000000000000000e+00 68 68 5.0000000000000018e-09 68 17 -1.2500000000000000e-09 68 45 -4.1666666666666668e-10 68 262 -4.1666666666666668e-10 68 303 -4.1666666666666668e-10 69 69 1.0000000000000000e+00 70 70 5.0000000000000018e-09 70 110 -4.1666666666666668e-10 70 18 -1.2500000000000000e-09 70 326 -4.1666666666666668e-10 70 252 -4.1666666666666668e-10 71 71 5.0000000000000018e-09 71 18 -1.2500000000000000e-09 71 326 -4.1666666666666668e-10 72 72 1.0000000000000000e+00 73 73 5.0000000000000018e-09 73 18 -1.2500000000000000e-09 73 119 -4.1666666666666668e-10 74 74 5.0000000000000018e-09 74 145 -4.1666666666666668e-10 74 15 -1.2500000000000000e-09 74 251 -4.1666666666666668e-10 74 479 -4.1666666666666668e-10 74 338 -4.1666666666666668e-10 74 283 -4.1666666666666668e-10 74 287 -4.1666666666666668e-10 74 174 -1.2500000000000000e-09 75 75 5.0000000000000018e-09 75 15 -1.2500000000000000e-09 75 283 -4.1666666666666668e-10 75 287 -4.1666666666666668e-10 75 251 -4.1666666666666668e-10 76 76 1.0000000000000000e+00 77 77 1.0000000000000000e+00 78 78 5.0000000000000018e-09 78 149 -4.1666666666666668e-10 78 18 -1.2500000000000000e-09 78 327 -4.1666666666666668e-10 78 326 -4.1666666666666668e-10 79 79 5.0000000000000018e-09 79 119 -4.1666666666666668e-10 79 64 -4.1666666666666668e-10 79 18 -1.2500000000000000e-09 79 149 -4.1666666666666668e-10 80 80 1.0000000000000000e+00 81 81 3.3333333666666654e-01 81 48 -4.1666666666666664e-02 81 35 -4.1666666666666664e-02 81 8 4.1666666666666664e-02 81 117 -4.1666666666666664e-02 81 33 -4.1666667083333331e-02 81 7 -4.1666667500000004e-02 81 118 -8.3333333333333329e-02 81 506 -4.1666666666666664e-02 81 372 4.1666666666666664e-02 81 507 -4.1666667083333338e-02 81 357 -8.3333333333333335e-10 81 180 -4.1666667499999997e-02 82 82 7.5000000000000010e-09 82 7 -2.0833333333333334e-09 82 19 -2.0833333333333334e-09 82 608 -8.3333333333333335e-10 82 831 -8.3333333333333335e-10 82 611 -8.3333333333333335e-10 82 357 -8.3333333333333335e-10 83 83 1.0000000000000000e+00 84 84 1.0000000000000000e+00 85 85 1.0000000000000000e+00 86 86 5.0000000000000000e-01 86 93 -4.1666666666666664e-02 86 89 -4.1666666666666664e-02 86 88 -4.1666666666666664e-02 86 8 -1.2499999999999999e-01 87 87 5.0000000000000000e-01 87 45 -4.1666666666666664e-02 87 64 -4.1666666666666664e-02 87 8 -1.2499999999999999e-01 87 88 -4.1666666666666664e-02 88 88 6.6666666666666674e-01 88 120 -4.1666666666666664e-02 88 47 -4.1666666666666664e-02 88 9 4.1666666666666664e-02 88 8 -8.3333333333333329e-02 88 86 -4.1666666666666664e-02 88 6 -8.3333333333333329e-02 88 29 -4.1666666666666664e-02 88 90 -4.1666666666666664e-02 88 121 -8.3333333333333329e-02 88 87 -4.1666666666666664e-02 88 64 -8.3333333333333329e-02 88 92 -4.1666666666666664e-02 88 89 -8.3333333333333329e-02 88 91 -4.1666666666666664e-02 88 393 4.1666666666666664e-02 89 89 6.6666666666666674e-01 89 102 -4.1666666666666664e-02 89 96 -4.1666666666666664e-02 89 13 4.1666666666666664e-02 89 24 -4.1666666666666664e-02 89 92 -4.1666666666666664e-02 89 86 -4.1666666666666664e-02 89 8 4.1666666666666664e-02 89 29 -4.1666666666666664e-02 89 90 -4.1666666666666664e-02 89 6 4.1666666666666664e-02 89 103 -8.3333333333333329e-02 89 99 -8.3333333333333329e-02 89 93 -8.3333333333333329e-02 89 88 -8.3333333333333329e-02 89 485 -4.1666666666666664e-02 89 394 4.1666666666666664e-02 89 393 -8.3333333333333329e-02 90 90 5.0000000000000000e-01 90 121 -4.1666666666666664e-02 90 6 -1.2499999999999999e-01 90 89 -4.1666666666666664e-02 90 122 -4.1666666666666664e-02 90 88 -4.1666666666666664e-02 90 103 -4.1666666666666664e-02 90 513 -4.1666666666666664e-02 90 393 -1.2499999999999999e-01 91 91 5.0000000000000000e-01 91 64 -4.1666666666666664e-02 91 119 -4.1666666666666664e-02 91 6 -1.2499999999999999e-01 91 88 -4.1666666666666664e-02 92 92 5.0000000000000000e-01 92 121 -4.1666666666666664e-02 92 89 -4.1666666666666664e-02 92 8 -1.2499999999999999e-01 92 118 -4.1666666666666664e-02 92 93 -4.1666666666666664e-02 92 88 -4.1666666666666664e-02 92 505 -4.1666666666666664e-02 92 393 -1.2499999999999999e-01 93 93 6.6666666666666674e-01 93 35 -4.1666666666666664e-02 93 7 4.1666666666666664e-02 93 24 -4.1666666666666664e-02 93 8 -8.3333333333333329e-02 93 86 -4.1666666666666664e-02 93 92 -4.1666666666666664e-02 93 25 -4.1666666666666664e-02 93 34 -8.3333333333333329e-02 93 89 -8.3333333333333329e-02 93 36 -4.1666666666666664e-02 93 502 -4.1666666666666664e-02 93 394 -8.3333333333333329e-02 93 505 -8.3333333333333329e-02 93 485 -4.1666666666666664e-02 93 393 4.1666666666666664e-02 94 94 1.0000000000000000e+00 95 95 1.0000000000000000e+00 96 96 5.0000000000000000e-01 96 103 -4.1666666666666664e-02 96 89 -4.1666666666666664e-02 96 99 -4.1666666666666664e-02 96 13 -1.2499999999999999e-01 97 97 5.0000000000000000e-01 97 13 -1.2499999999999999e-01 97 99 -4.1666666666666664e-02 98 98 1.0000000000000000e+00 99 99 6.6666666666666674e-01 99 50 -4.1666666666666664e-02 99 13 -8.3333333333333329e-02 99 96 -4.1666666666666664e-02 99 24 -4.1666666666666664e-02 99 97 -4.1666666666666664e-02 99 102 -4.1666666666666664e-02 99 89 -8.3333333333333329e-02 99 100 -4.1666666666666664e-02 99 486 -4.1666666666666664e-02 99 394 -8.3333333333333329e-02 99 485 -4.1666666666666664e-02 99 484 -8.3333333333333329e-02 99 393 4.1666666666666664e-02 100 100 5.0000000000000000e-01 100 99 -4.1666666666666664e-02 100 394 -1.2499999999999999e-01 101 101 1.0000000000000000e+00 102 102 5.0000000000000000e-01 102 89 -4.1666666666666664e-02 102 13 -1.2499999999999999e-01 102 103 -4.1666666666666664e-02 102 99 -4.1666666666666664e-02 102 513 -4.1666666666666664e-02 102 484 -4.1666666666666664e-02 102 511 -4.1666666666666664e-02 102 393 -1.2499999999999999e-01 103 103 6.6666666666666674e-01 103 130 -4.1666666666666664e-02 103 56 -4.1666666666666664e-02 103 6 -8.3333333333333329e-02 103 29 -4.1666666666666664e-02 103 13 -8.3333333333333329e-02 103 96 -4.1666666666666664e-02 103 102 -4.1666666666666664e-02 103 30 -4.1666666666666664e-02 103 90 -4.1666666666666664e-02 103 89 -8.3333333333333329e-02 103 104 -4.1666666666666664e-02 103 513 -8.3333333333333329e-02 103 393 4.1666666666666664e-02 104 104 5.0000000000000000e-01 104 13 -1.2499999999999999e-01 104 103 -4.1666666666666664e-02 105 105 1.0000000000000000e+00 106 106 1.0000000000000000e+00 107 107 1.0000000000000000e+00 108 108 5.0000000000000018e-09 108 110 -4.1666666666666668e-10 108 15 -1.2500000000000000e-09 108 251 -4.1666666666666668e-10 108 252 -4.1666666666666668e-10 109 109 5.0000000000000018e-09 109 39 -4.1666666666666668e-10 109 40 -4.1666666666666668e-10 109 15 -1.2500000000000000e-09 109 110 -4.1666666666666668e-10 110 110 6.6666666666666718e-09 110 148 -4.1666666666666668e-10 110 61 -4.1666666666666668e-10 110 9 4.1666666666666668e-10 110 15 -8.3333333333333335e-10 110 108 -4.1666666666666668e-10 110 18 -8.3333333333333335e-10 110 70 -4.1666666666666668e-10 110 111 -4.1666666666666668e-10 110 147 -8.3333333333333335e-10 110 109 -4.1666666666666668e-10 110 40 -8.3333333333333335e-10 110 113 -4.1666666666666668e-10 110 112 -4.1666666666666668e-10 110 252 -8.3333333333333335e-10 110 179 4.1666666666666668e-10 111 111 5.0000000000000018e-09 111 147 -4.1666666666666668e-10 111 18 -1.2500000000000000e-09 111 149 -4.1666666666666668e-10 111 110 -4.1666666666666668e-10 111 327 -4.1666666666666668e-10 111 252 -4.1666666666666668e-10 111 326 -4.1666666666666668e-10 111 179 -1.2500000000000000e-09 112 112 5.0000000000000018e-09 112 40 -4.1666666666666668e-10 112 119 -4.1666666666666668e-10 112 18 -1.2500000000000000e-09 112 110 -4.1666666666666668e-10 113 113 5.0000000000000018e-09 113 147 -4.1666666666666668e-10 113 15 -1.2500000000000000e-09 113 145 -4.1666666666666668e-10 113 110 -4.1666666666666668e-10 113 338 -4.1666666666666668e-10 113 252 -4.1666666666666668e-10 113 251 -4.1666666666666668e-10 113 179 -1.2500000000000000e-09 114 114 1.0000000000000000e+00 115 115 1.0000000000000000e+00 116 116 3.3333333749999999e-01 116 7 2.0833332916666666e-02 116 25 -4.1666666666666664e-02 116 34 -4.1666667083333338e-02 116 611 -4.1666666666666668e-10 116 502 -4.1666666666666664e-02 116 394 -8.3333333333333329e-02 116 487 -4.1666666666666664e-02 116 501 -4.1666667083333331e-02 116 504 -4.1666666666666664e-02 116 825 -8.3333333333333335e-10 116 831 -4.1666666666666668e-10 117 117 5.0000000000000000e-01 117 124 -4.1666666666666664e-02 117 46 -4.1666666666666664e-02 117 81 -4.1666666666666664e-02 117 118 -4.1666666666666664e-02 117 263 -4.1666666666666664e-02 117 372 -1.2499999999999999e-01 117 507 -4.1666666666666664e-02 117 180 -1.2499999999999999e-01 118 118 6.6666666666666674e-01 118 47 -4.1666666666666664e-02 118 125 -4.1666666666666664e-02 118 9 4.1666666666666664e-02 118 8 -8.3333333333333329e-02 118 35 -4.1666666666666664e-02 118 7 4.1666666666666664e-02 118 92 -4.1666666666666664e-02 118 121 -8.3333333333333329e-02 118 117 -4.1666666666666664e-02 118 46 -8.3333333333333329e-02 118 48 -4.1666666666666664e-02 118 81 -8.3333333333333329e-02 118 372 -8.3333333333333329e-02 118 506 -4.1666666666666664e-02 118 500 -4.1666666666666664e-02 118 505 -8.3333333333333329e-02 118 393 4.1666666666666664e-02 118 180 4.1666666666666664e-02 119 119 3.3333333666666687e-01 119 79 -4.1666666666666668e-10 119 18 -8.3333333333333335e-10 119 112 -4.1666666666666668e-10 119 57 -4.1666666666666664e-02 119 6 -8.3333333333333329e-02 119 91 -4.1666666666666664e-02 119 148 -4.1666666666666668e-10 119 64 -4.1666667083333331e-02 119 73 -4.1666666666666668e-10 119 120 -4.1666666666666664e-02 119 40 -4.1666667083333338e-02 119 9 2.0833333541666665e-02 119 32 -4.1666666666666664e-02 120 120 5.0000000000000000e-01 120 40 -4.1666666666666664e-02 120 122 -4.1666666666666664e-02 120 121 -4.1666666666666664e-02 120 88 -4.1666666666666664e-02 120 6 -1.2499999999999999e-01 120 64 -4.1666666666666664e-02 120 119 -4.1666666666666664e-02 120 9 -1.2499999999999999e-01 121 121 6.6666666666666674e-01 121 125 -4.1666666666666664e-02 121 123 -4.1666666666666664e-02 121 41 -4.1666666666666664e-02 121 11 4.1666666666666664e-02 121 90 -4.1666666666666664e-02 121 120 -4.1666666666666664e-02 121 6 4.1666666666666664e-02 121 47 -4.1666666666666664e-02 121 92 -4.1666666666666664e-02 121 8 4.1666666666666664e-02 121 9 -8.3333333333333329e-02 121 118 -8.3333333333333329e-02 121 126 -8.3333333333333329e-02 121 122 -8.3333333333333329e-02 121 88 -8.3333333333333329e-02 121 500 -4.1666666666666664e-02 121 372 4.1666666666666664e-02 121 393 -8.3333333333333329e-02 122 122 6.6666666666666674e-01 122 56 -4.1666666666666664e-02 122 132 -4.1666666666666664e-02 122 11 -8.3333333333333329e-02 122 41 -4.1666666666666664e-02 122 6 -8.3333333333333329e-02 122 120 -4.1666666666666664e-02 122 9 4.1666666666666664e-02 122 90 -4.1666666666666664e-02 122 42 -4.1666666666666664e-02 122 123 -4.1666666666666664e-02 122 121 -8.3333333333333329e-02 122 57 -4.1666666666666664e-02 122 40 -8.3333333333333329e-02 122 513 -8.3333333333333329e-02 122 393 4.1666666666666664e-02 123 123 5.0000000000000000e-01 123 121 -4.1666666666666664e-02 123 11 -1.2499999999999999e-01 123 126 -4.1666666666666664e-02 123 122 -4.1666666666666664e-02 123 495 -4.1666666666666664e-02 123 513 -4.1666666666666664e-02 123 514 -4.1666666666666664e-02 123 393 -1.2499999999999999e-01 124 124 3.3333333666666687e-01 124 144 -4.1666666666666668e-10 124 140 -4.1666666666666668e-10 124 117 -4.1666666666666664e-02 124 146 -4.1666666666666668e-10 124 60 -4.1666667083333331e-02 124 59 -4.1666666666666668e-10 124 125 -4.1666666666666664e-02 124 46 -4.1666667083333338e-02 124 9 2.0833333541666665e-02 124 14 2.0833333541666665e-02 124 186 -8.3333333333333335e-10 124 180 2.0833333541666669e-02 124 372 -8.3333333333333329e-02 124 516 -4.1666666666666664e-02 124 383 2.0833333541666669e-02 124 263 -4.1666667083333331e-02 124 420 -4.1666666666666664e-02 124 445 -4.1666667083333338e-02 125 125 5.0000000000000000e-01 125 46 -4.1666666666666664e-02 125 118 -4.1666666666666664e-02 125 121 -4.1666666666666664e-02 125 126 -4.1666666666666664e-02 125 60 -4.1666666666666664e-02 125 124 -4.1666666666666664e-02 125 9 -1.2499999999999999e-01 125 372 -1.2499999999999999e-01 126 126 6.6666666666666674e-01 126 134 -4.1666666666666664e-02 126 125 -4.1666666666666664e-02 126 11 -8.3333333333333329e-02 126 41 -4.1666666666666664e-02 126 9 4.1666666666666664e-02 126 123 -4.1666666666666664e-02 126 121 -8.3333333333333329e-02 126 127 -4.1666666666666664e-02 126 60 -8.3333333333333329e-02 126 417 -4.1666666666666664e-02 126 370 4.1666666666666664e-02 126 372 -8.3333333333333329e-02 126 495 -8.3333333333333329e-02 126 516 -4.1666666666666664e-02 126 444 -8.3333333333333329e-02 126 500 -4.1666666666666664e-02 126 393 4.1666666666666664e-02 126 383 4.1666666666666664e-02 127 127 5.0000000000000000e-01 127 39 -4.1666666666666664e-02 127 60 -4.1666666666666664e-02 127 11 -1.2499999999999999e-01 127 126 -4.1666666666666664e-02 127 444 -4.1666666666666664e-02 127 537 -4.1666666666666664e-02 127 480 -4.1666666666666664e-02 127 383 -1.2499999999999999e-01 128 128 1.0000000000000000e+00 129 129 1.0000000000000000e+00 130 130 5.0000000000000000e-01 130 103 -4.1666666666666664e-02 130 13 -1.2499999999999999e-01 130 511 -4.1666666666666664e-02 130 513 -4.1666666666666664e-02 131 131 1.0000000000000000e+00 132 132 5.0000000000000000e-01 132 122 -4.1666666666666664e-02 132 11 -1.2499999999999999e-01 132 513 -4.1666666666666664e-02 132 514 -4.1666666666666664e-02 133 133 5.0000000000000000e-01 133 11 -1.2499999999999999e-01 133 537 -4.1666666666666664e-02 133 433 -4.1666666666666664e-02 133 514 -4.1666666666666664e-02 134 134 5.0000000000000000e-01 134 126 -4.1666666666666664e-02 134 11 -1.2499999999999999e-01 134 433 -4.1666666666666664e-02 134 514 -4.1666666666666664e-02 134 495 -4.1666666666666664e-02 134 444 -4.1666666666666664e-02 134 537 -4.1666666666666664e-02 134 370 -1.2499999999999999e-01 135 135 9.9999999999999978e-01 135 136 -1.6666666666666666e-01 135 478 -1.6666666666666666e-01 135 602 -1.6666666666666666e-01 135 446 -1.6666666666666666e-01 135 689 -1.6666666666666666e-01 135 763 -1.6666666666666666e-01 136 136 3.3333333666666692e-01 136 144 -4.1666666666666668e-10 136 143 -4.1666666666666668e-10 136 59 -4.1666666666666668e-10 136 14 2.0833333333333334e-10 136 135 -1.6666666666666666e-01 136 335 -4.1666666666666668e-10 136 628 2.0833333333333334e-10 136 186 -8.3333333333333335e-10 136 383 2.0833333333333334e-10 136 479 -4.1666667083333338e-02 136 232 -4.1666667083333338e-02 136 174 2.0833333333333334e-10 136 445 -4.1666667083333338e-02 136 760 -4.1666667083333338e-02 137 137 5.0000000000000018e-09 137 139 -4.1666666666666668e-10 137 17 -1.2500000000000000e-09 137 227 -4.1666666666666668e-10 137 328 -4.1666666666666668e-10 137 329 -4.1666666666666668e-10 137 301 -4.1666666666666668e-10 137 303 -4.1666666666666668e-10 137 163 -1.2500000000000000e-09 138 138 5.0000000000000018e-09 138 45 -4.1666666666666668e-10 138 46 -4.1666666666666668e-10 138 17 -1.2500000000000000e-09 138 139 -4.1666666666666668e-10 138 262 -4.1666666666666668e-10 138 301 -4.1666666666666668e-10 138 303 -4.1666666666666668e-10 138 180 -1.2500000000000000e-09 139 139 6.6666666666666718e-09 139 146 -4.1666666666666668e-10 139 65 -4.1666666666666668e-10 139 9 4.1666666666666668e-10 139 17 -8.3333333333333335e-10 139 137 -4.1666666666666668e-10 139 147 -8.3333333333333335e-10 139 138 -4.1666666666666668e-10 139 46 -8.3333333333333335e-10 139 141 -4.1666666666666668e-10 139 140 -4.1666666666666668e-10 139 186 -8.3333333333333335e-10 139 336 -4.1666666666666668e-10 139 163 4.1666666666666668e-10 139 337 -4.1666666666666668e-10 139 329 -8.3333333333333335e-10 139 179 4.1666666666666668e-10 139 301 -8.3333333333333335e-10 139 180 4.1666666666666668e-10 140 140 5.0000000000000018e-09 140 46 -4.1666666666666668e-10 140 124 -4.1666666666666668e-10 140 139 -4.1666666666666668e-10 140 263 -4.1666666666666668e-10 140 208 -4.1666666666666668e-10 140 301 -4.1666666666666668e-10 140 186 -1.2500000000000000e-09 140 180 -1.2500000000000000e-09 141 141 5.0000000000000018e-09 141 147 -4.1666666666666668e-10 141 17 -1.2500000000000000e-09 141 149 -4.1666666666666668e-10 141 139 -4.1666666666666668e-10 141 327 -4.1666666666666668e-10 141 329 -4.1666666666666668e-10 141 328 -4.1666666666666668e-10 141 179 -1.2500000000000000e-09 142 142 5.0000000000000018e-09 142 17 -1.2500000000000000e-09 142 303 -4.1666666666666668e-10 142 227 -4.1666666666666668e-10 142 328 -4.1666666666666668e-10 143 143 5.0000000000000018e-09 143 145 -4.1666666666666668e-10 143 136 -4.1666666666666668e-10 143 232 -4.1666666666666668e-10 143 333 -4.1666666666666668e-10 143 338 -4.1666666666666668e-10 143 186 -1.2500000000000000e-09 143 479 -4.1666666666666668e-10 143 174 -1.2500000000000000e-09 144 144 5.0000000000000018e-09 144 124 -4.1666666666666668e-10 144 60 -4.1666666666666668e-10 144 136 -4.1666666666666668e-10 144 145 -4.1666666666666668e-10 144 445 -4.1666666666666668e-10 144 479 -4.1666666666666668e-10 144 186 -1.2500000000000000e-09 144 383 -1.2500000000000000e-09 145 145 6.6666666666666718e-09 145 61 -4.1666666666666668e-10 145 146 -4.1666666666666668e-10 145 9 4.1666666666666668e-10 145 143 -4.1666666666666668e-10 145 15 -8.3333333333333335e-10 145 74 -4.1666666666666668e-10 145 113 -4.1666666666666668e-10 145 147 -8.3333333333333335e-10 145 144 -4.1666666666666668e-10 145 60 -8.3333333333333335e-10 145 62 -4.1666666666666668e-10 145 186 -8.3333333333333335e-10 145 174 4.1666666666666668e-10 145 337 -4.1666666666666668e-10 145 338 -8.3333333333333335e-10 145 179 4.1666666666666668e-10 145 479 -8.3333333333333335e-10 145 383 4.1666666666666668e-10 146 146 5.0000000000000018e-09 146 60 -4.1666666666666668e-10 146 145 -4.1666666666666668e-10 146 147 -4.1666666666666668e-10 146 139 -4.1666666666666668e-10 146 46 -4.1666666666666668e-10 146 124 -4.1666666666666668e-10 146 9 -1.2500000000000000e-09 146 186 -1.2500000000000000e-09 147 147 6.6666666666666718e-09 147 111 -4.1666666666666668e-10 147 148 -4.1666666666666668e-10 147 18 4.1666666666666668e-10 147 113 -4.1666666666666668e-10 147 61 -4.1666666666666668e-10 147 15 4.1666666666666668e-10 147 146 -4.1666666666666668e-10 147 65 -4.1666666666666668e-10 147 141 -4.1666666666666668e-10 147 17 4.1666666666666668e-10 147 9 -8.3333333333333335e-10 147 149 -8.3333333333333335e-10 147 110 -8.3333333333333335e-10 147 145 -8.3333333333333335e-10 147 139 -8.3333333333333335e-10 147 337 -4.1666666666666668e-10 147 186 4.1666666666666668e-10 147 179 -8.3333333333333335e-10 148 148 5.0000000000000018e-09 148 64 -4.1666666666666668e-10 148 149 -4.1666666666666668e-10 148 147 -4.1666666666666668e-10 148 110 -4.1666666666666668e-10 148 18 -1.2500000000000000e-09 148 40 -4.1666666666666668e-10 148 119 -4.1666666666666668e-10 148 9 -1.2500000000000000e-09 149 149 6.6666666666666718e-09 149 78 -4.1666666666666668e-10 149 151 -4.1666666666666668e-10 149 17 -8.3333333333333335e-10 149 65 -4.1666666666666668e-10 149 18 -8.3333333333333335e-10 149 148 -4.1666666666666668e-10 149 9 4.1666666666666668e-10 149 111 -4.1666666666666668e-10 149 66 -4.1666666666666668e-10 149 141 -4.1666666666666668e-10 149 147 -8.3333333333333335e-10 149 79 -4.1666666666666668e-10 149 64 -8.3333333333333335e-10 149 327 -8.3333333333333335e-10 149 179 4.1666666666666668e-10 150 150 1.0000000000000000e+00 151 151 5.0000000000000018e-09 151 149 -4.1666666666666668e-10 151 17 -1.2500000000000000e-09 151 327 -4.1666666666666668e-10 151 328 -4.1666666666666668e-10 152 152 1.0000000000000005e-08 152 590 -1.6666666666666667e-09 152 608 -1.6666666666666667e-09 152 507 -1.6666666666666667e-09 152 811 -1.6666666666666667e-09 152 807 -1.6666666666666667e-09 152 357 -1.6666666666666667e-09 hypre-2.33.0/src/test/TEST_ams/mfem.Abeta.00001000066400000000000000000001136471477326011500204560ustar00rootroot00000000000000153 365 153 365 153 153 1.0000000000000000e+00 154 154 2.0000000000000000e+00 155 155 2.0000000000000000e+00 156 156 1.0000000000000008e-08 156 283 4.1666666666666668e-10 156 338 4.1666666666666668e-10 156 353 -1.2500000000000000e-09 156 282 -8.3333333333333335e-10 156 281 4.1666666666666668e-10 156 348 -1.2500000000000000e-09 156 347 -8.3333333333333335e-10 156 314 4.1666666666666668e-10 156 344 -8.3333333333333335e-10 156 342 -1.2500000000000000e-09 156 341 -1.2500000000000000e-09 156 253 -1.2500000000000000e-09 156 252 4.1666666666666668e-10 156 251 -8.3333333333333335e-10 156 193 -1.2500000000000000e-09 156 191 -1.2500000000000000e-09 156 190 -1.2500000000000000e-09 157 157 2.0000000000000000e+00 158 158 1.0000000000000008e-08 158 207 -1.4583333333333334e-09 158 206 2.0833333333333334e-10 158 246 2.0833333333333334e-10 158 299 -4.1666666666666668e-10 158 294 -1.4583333333333334e-09 158 243 2.0833333333333334e-10 158 278 -4.1666666666666668e-10 158 272 -1.4583333333333334e-09 158 202 -1.8750000000000002e-09 158 201 -2.0833333333333334e-09 158 197 -1.6666666666666667e-09 158 812 2.0833333333333334e-10 159 159 1.0000000000000000e+00 160 160 1.0000000000000000e+00 161 161 3.0000000000000000e+00 162 162 1.0000000000000000e+00 163 163 1.0000000000000007e-08 163 328 4.1666666666666668e-10 163 329 -8.3333333333333335e-10 163 207 -1.4583333333333334e-09 163 334 -8.3333333333333335e-10 163 227 -1.2500000000000002e-09 163 303 2.0833333333333334e-10 163 336 -1.2500000000000000e-09 163 301 -1.2500000000000000e-09 163 208 0.0000000000000000e+00 163 361 4.1666666666666668e-10 163 333 4.1666666666666668e-10 163 313 4.1666666666666668e-10 163 292 2.0833333333333334e-10 163 299 -4.1666666666666668e-10 163 206 -6.2500000000000001e-10 163 200 2.0833333333333334e-10 163 332 -1.2500000000000000e-09 163 228 -1.2500000000000000e-09 163 331 -1.0416666666666667e-09 163 139 4.1666666666666668e-10 163 137 -1.2500000000000000e-09 164 164 1.0000000000000000e+00 165 165 1.0000000000000000e+00 166 166 1.0000000000000000e+00 167 167 1.0000000000000000e+00 168 168 1.0000000000000000e+00 169 169 1.0000000000000008e-08 169 252 4.1666666666666668e-10 169 351 -1.2500000000000000e-09 169 345 -1.2500000000000000e-09 169 344 -8.3333333333333335e-10 169 327 4.1666666666666668e-10 169 326 -8.3333333333333335e-10 169 324 -1.2500000000000000e-09 169 323 -1.2500000000000000e-09 169 320 -1.2500000000000000e-09 169 314 4.1666666666666668e-10 169 319 -8.3333333333333335e-10 169 219 -1.2500000000000000e-09 169 217 -1.2500000000000000e-09 169 216 -1.2500000000000000e-09 170 170 1.0000000000000000e+00 171 171 2.0000000000000000e+00 172 172 1.0000000000000008e-08 172 331 4.1666666666666668e-10 172 329 4.1666666666666668e-10 172 328 -8.3333333333333335e-10 172 327 4.1666666666666668e-10 172 319 -8.3333333333333335e-10 172 318 -1.2500000000000000e-09 172 314 4.1666666666666668e-10 172 313 -8.3333333333333335e-10 172 311 -1.2500000000000000e-09 172 310 -1.2500000000000000e-09 172 229 -1.2500000000000000e-09 172 228 -1.2500000000000000e-09 172 226 -8.3333333333333335e-10 172 227 4.1666666666666668e-10 172 225 -1.2500000000000000e-09 172 223 -1.2500000000000000e-09 172 222 -1.2500000000000000e-09 173 173 2.0000000000000000e+00 174 174 5.0000000500000008e-01 174 251 4.1666666666666668e-10 174 333 4.1666666666666668e-10 174 338 -8.3333333333333335e-10 174 300 -1.4583333333333331e-01 174 283 -4.1666667083333338e-02 174 232 -8.3333333750000002e-02 174 287 -2.0833333124999999e-02 174 347 4.1666666666666668e-10 174 280 4.1666666666666664e-02 174 279 -4.1666666666666664e-02 174 353 -1.2500000000000000e-09 174 282 -2.0833333124999995e-02 174 233 -1.2500000000000000e-09 174 231 -2.0833333124999999e-02 174 281 -6.2500000416666646e-02 174 145 4.1666666666666668e-10 174 143 -1.2500000000000000e-09 174 136 2.0833333333333334e-10 174 74 -1.2500000000000000e-09 174 479 -8.3333333750000002e-02 174 481 -6.2500000000000000e-02 174 477 2.0833333333333332e-02 174 688 2.0833333333333332e-02 175 175 1.0000000000000008e-08 175 281 4.1666666666666668e-10 175 347 -8.3333333333333335e-10 175 338 4.1666666666666668e-10 175 334 4.1666666666666668e-10 175 333 -8.3333333333333335e-10 175 329 4.1666666666666668e-10 175 332 -1.2500000000000000e-09 175 330 -8.3333333333333335e-10 175 331 4.1666666666666668e-10 175 316 -1.2500000000000000e-09 175 315 -1.2500000000000000e-09 175 313 -8.3333333333333335e-10 175 314 4.1666666666666668e-10 175 239 -1.2500000000000000e-09 175 238 -1.2500000000000000e-09 175 235 -1.2500000000000000e-09 175 234 -1.2500000000000000e-09 175 233 -1.2500000000000000e-09 175 231 -8.3333333333333335e-10 175 232 4.1666666666666668e-10 175 693 4.1666666666666668e-10 176 176 1.0000000000000000e+00 177 177 1.0000000000000000e+00 178 178 1.0000000000000000e+00 179 179 1.0000000000000007e-08 179 333 4.1666666666666668e-10 179 327 -8.3333333333333335e-10 179 328 4.1666666666666668e-10 179 251 4.1666666666666668e-10 179 326 4.1666666666666668e-10 179 337 -1.2500000000000000e-09 179 338 -8.3333333333333335e-10 179 329 -8.3333333333333335e-10 179 252 -8.3333333333333335e-10 179 347 4.1666666666666668e-10 179 344 4.1666666666666668e-10 179 315 -1.2500000000000000e-09 179 320 -1.2500000000000000e-09 179 319 4.1666666666666668e-10 179 318 -1.2500000000000000e-09 179 314 -8.3333333333333335e-10 179 313 4.1666666666666668e-10 179 253 -1.2500000000000000e-09 179 149 4.1666666666666668e-10 179 111 -1.2500000000000000e-09 179 147 -8.3333333333333335e-10 179 145 4.1666666666666668e-10 179 141 -1.2500000000000000e-09 179 139 4.1666666666666668e-10 179 113 -1.2500000000000000e-09 179 110 4.1666666666666668e-10 180 180 2.5000000750000034e-01 180 260 -1.6666666666666667e-09 180 208 2.0833333333333334e-10 180 303 2.0833333333333334e-10 180 263 -2.0833334375000002e-02 180 262 -2.0833334375000002e-02 180 301 -1.2500000000000000e-09 180 124 2.0833333541666669e-02 180 33 2.0833333333333332e-02 180 507 2.0833333333333332e-02 180 45 2.0833333541666669e-02 180 138 -1.2500000000000000e-09 180 140 -1.2500000000000000e-09 180 139 4.1666666666666668e-10 180 117 -1.2499999999999999e-01 180 46 -4.1666667083333331e-02 180 48 -1.2499999999999999e-01 180 81 -4.1666667499999997e-02 180 118 4.1666666666666664e-02 181 181 1.0000000000000000e+00 182 182 1.0000000000000000e+00 183 183 3.0000000000000000e+00 184 184 1.0000000000000000e+00 185 185 2.0000000000000000e+00 186 186 1.0000000000000007e-08 186 232 4.1666666666666668e-10 186 333 -8.3333333333333335e-10 186 338 4.1666666666666668e-10 186 263 4.1666666666666668e-10 186 301 4.1666666666666668e-10 186 337 -1.2500000000000000e-09 186 329 4.1666666666666668e-10 186 335 -1.2500000000000000e-09 186 336 -1.2500000000000000e-09 186 208 -8.3333333333333335e-10 186 334 4.1666666666666668e-10 186 60 4.1666666666666668e-10 186 147 4.1666666666666668e-10 186 146 -1.2500000000000000e-09 186 124 -8.3333333333333335e-10 186 46 4.1666666666666668e-10 186 145 -8.3333333333333335e-10 186 445 4.1666666666666668e-10 186 144 -1.2500000000000000e-09 186 143 -1.2500000000000000e-09 186 136 -8.3333333333333335e-10 186 479 4.1666666666666668e-10 186 140 -1.2500000000000000e-09 186 139 -8.3333333333333335e-10 186 59 -1.2500000000000000e-09 186 760 4.1666666666666668e-10 187 187 1.0000000000000000e+00 188 188 1.0000000000000000e+00 189 189 2.0000000000000000e+00 190 190 5.0000000000000018e-09 190 344 -4.1666666666666668e-10 190 252 -4.1666666666666668e-10 190 251 -4.1666666666666668e-10 190 156 -1.2500000000000000e-09 191 191 5.0000000000000018e-09 191 282 -4.1666666666666668e-10 191 283 -4.1666666666666668e-10 191 156 -1.2500000000000000e-09 191 251 -4.1666666666666668e-10 192 192 1.0000000000000000e+00 193 193 5.0000000000000018e-09 193 156 -1.2500000000000000e-09 193 282 -4.1666666666666668e-10 194 194 1.0000000000000007e-08 194 303 -1.6666666666666667e-09 194 259 -1.6666666666666667e-09 194 302 -1.6666666666666667e-09 194 195 -1.6666666666666667e-09 194 261 -1.6666666666666667e-09 195 195 6.6666666666666701e-09 195 201 -8.3333333333333335e-10 195 197 -8.3333333333333335e-10 195 256 -1.6666666666666667e-09 195 257 -8.3333333333333335e-10 195 194 -1.6666666666666667e-09 196 196 1.0000000000000000e+00 197 197 6.6666666666666701e-09 197 302 -8.3333333333333335e-10 197 264 -8.3333333333333335e-10 197 210 -8.3333333333333335e-10 197 195 -8.3333333333333335e-10 197 158 -1.6666666666666667e-09 198 198 1.0000000000000000e+00 199 199 1.0000000000000000e+00 200 200 1.0000000000000004e-08 200 163 2.0833333333333334e-10 200 208 -1.2500000000000000e-09 200 259 -1.6666666666666667e-09 200 206 -2.5000000000000001e-09 200 14 -8.3333333333333335e-10 200 667 -8.3333333333333335e-10 200 619 4.1666666666666668e-10 200 811 -1.2500000000000000e-09 200 812 -2.5000000000000001e-09 200 649 2.0833333333333334e-10 201 201 7.5000000000000010e-09 201 259 -8.3333333333333335e-10 201 195 -8.3333333333333335e-10 201 158 -2.0833333333333334e-09 201 243 -8.3333333333333335e-10 201 812 -8.3333333333333335e-10 201 649 -2.0833333333333334e-09 202 202 7.0833333333333339e-09 202 278 -8.3333333333333335e-10 202 206 -8.3333333333333335e-10 202 158 -1.8750000000000002e-09 202 246 -8.3333333333333335e-10 202 812 -8.3333333333333335e-10 202 619 -1.8750000000000002e-09 203 203 1.0000000000000000e+00 204 204 1.0000000000000000e+00 205 205 1.0000000000000000e+00 206 206 1.0416666666666674e-08 206 255 -4.1666666666666668e-10 206 330 -4.1666666666666668e-10 206 361 -2.0833333333333334e-09 206 158 2.0833333333333334e-10 206 299 -4.1666666666666668e-10 206 163 -6.2500000000000001e-10 206 208 -4.1666666666666668e-10 206 202 -8.3333333333333335e-10 206 207 -8.3333333333333335e-10 206 334 -8.3333333333333335e-10 206 200 -2.5000000000000001e-09 206 628 -8.3333333333333335e-10 206 14 8.3333333333333335e-10 206 761 -8.3333333333333335e-10 206 667 -4.1666666666666668e-10 206 619 -8.3333333333333335e-10 207 207 6.2500000000000022e-09 207 158 -1.4583333333333334e-09 207 259 -8.3333333333333335e-10 207 163 -1.4583333333333334e-09 207 302 -8.3333333333333335e-10 207 299 -8.3333333333333335e-10 207 206 -8.3333333333333335e-10 208 208 7.0833333333333355e-09 208 263 -8.3333333333333335e-10 208 180 2.0833333333333334e-10 208 186 -8.3333333333333335e-10 208 335 -4.1666666666666668e-10 208 334 -8.3333333333333335e-10 208 336 -4.1666666666666668e-10 208 301 -8.3333333333333335e-10 208 163 0.0000000000000000e+00 208 206 -4.1666666666666668e-10 208 200 -1.2500000000000000e-09 208 140 -4.1666666666666668e-10 208 628 4.1666666666666668e-10 208 59 -4.1666666666666668e-10 208 760 -8.3333333333333335e-10 208 14 -2.0833333333333334e-10 209 209 1.0000000000000008e-08 209 210 -1.6666666666666667e-09 209 270 -1.6666666666666667e-09 209 264 -1.6666666666666667e-09 210 210 6.6666666666666701e-09 210 294 -8.3333333333333335e-10 210 197 -8.3333333333333335e-10 210 292 -1.6666666666666667e-09 210 209 -1.6666666666666667e-09 211 211 1.0000000000000000e+00 212 212 1.0000000000000000e+00 213 213 1.0000000000000000e+00 214 214 1.0000000000000000e+00 215 215 1.0000000000000000e+00 216 216 5.0000000000000018e-09 216 344 -4.1666666666666668e-10 216 314 -4.1666666666666668e-10 216 319 -4.1666666666666668e-10 216 169 -1.2500000000000000e-09 217 217 5.0000000000000018e-09 217 169 -1.2500000000000000e-09 217 319 -4.1666666666666668e-10 218 218 1.0000000000000000e+00 219 219 5.0000000000000018e-09 219 169 -1.2500000000000000e-09 220 220 1.0000000000000000e+00 221 221 1.0000000000000000e+00 222 222 5.0000000000000018e-09 222 328 -4.1666666666666668e-10 222 327 -4.1666666666666668e-10 222 319 -4.1666666666666668e-10 222 172 -1.2500000000000000e-09 223 223 5.0000000000000018e-09 223 172 -1.2500000000000000e-09 223 319 -4.1666666666666668e-10 224 224 1.0000000000000000e+00 225 225 5.0000000000000018e-09 225 172 -1.2500000000000000e-09 225 226 -4.1666666666666668e-10 226 226 7.0833333333333372e-09 226 311 -4.1666666666666668e-10 226 292 -1.2500000000000000e-09 226 172 -8.3333333333333335e-10 226 229 -4.1666666666666668e-10 226 227 -8.3333333333333335e-10 226 228 -4.1666666666666668e-10 226 331 -8.3333333333333335e-10 226 299 -4.1666666666666668e-10 226 225 -4.1666666666666668e-10 227 227 6.6666666666666685e-09 227 303 -8.3333333333333335e-10 227 163 -1.2500000000000002e-09 227 328 -8.3333333333333335e-10 227 229 -4.1666666666666668e-10 227 228 -4.1666666666666668e-10 227 172 4.1666666666666668e-10 227 226 -8.3333333333333335e-10 227 302 -8.3333333333333335e-10 227 142 -4.1666666666666668e-10 227 137 -4.1666666666666668e-10 227 17 4.1666666666666668e-10 228 228 5.0000000000000018e-09 228 331 -4.1666666666666668e-10 228 313 -4.1666666666666668e-10 228 329 -4.1666666666666668e-10 228 328 -4.1666666666666668e-10 228 172 -1.2500000000000000e-09 228 227 -4.1666666666666668e-10 228 226 -4.1666666666666668e-10 228 163 -1.2500000000000000e-09 229 229 5.0000000000000018e-09 229 227 -4.1666666666666668e-10 229 172 -1.2500000000000000e-09 229 226 -4.1666666666666668e-10 229 328 -4.1666666666666668e-10 230 230 1.0000000000000000e+00 231 231 3.7500000333333350e-01 231 239 -4.1666666666666668e-10 231 175 -8.3333333333333335e-10 231 234 -4.1666666666666668e-10 231 232 -4.1666667083333331e-02 231 233 -4.1666666666666668e-10 231 281 -4.1666667083333338e-02 231 174 -2.0833333124999999e-02 231 279 -4.1666666666666671e-02 231 235 -4.1666666666666668e-10 231 688 -1.2500000000000000e-01 231 628 2.0833333333333334e-10 231 693 -4.1666667083333331e-02 232 232 3.3333333666666654e-01 232 335 -4.1666666666666668e-10 232 186 4.1666666666666668e-10 232 174 -8.3333333750000002e-02 232 333 -8.3333333333333335e-10 232 234 -4.1666666666666668e-10 232 233 -4.1666666666666668e-10 232 175 4.1666666666666668e-10 232 231 -4.1666667083333331e-02 232 143 -4.1666666666666668e-10 232 689 -8.3333333333333329e-02 232 136 -4.1666667083333338e-02 232 628 -8.3333333750000002e-02 233 233 5.0000000000000018e-09 233 281 -4.1666666666666668e-10 233 347 -4.1666666666666668e-10 233 338 -4.1666666666666668e-10 233 333 -4.1666666666666668e-10 233 175 -1.2500000000000000e-09 233 232 -4.1666666666666668e-10 233 231 -4.1666666666666668e-10 233 174 -1.2500000000000000e-09 234 234 5.0000000000000018e-09 234 330 -4.1666666666666668e-10 234 334 -4.1666666666666668e-10 234 232 -4.1666666666666668e-10 234 175 -1.2500000000000000e-09 234 231 -4.1666666666666668e-10 234 333 -4.1666666666666668e-10 234 693 -4.1666666666666668e-10 234 628 -1.2500000000000000e-09 235 235 5.0000000000000018e-09 235 175 -1.2500000000000000e-09 235 330 -4.1666666666666668e-10 235 231 -4.1666666666666668e-10 235 693 -4.1666666666666668e-10 236 236 1.0000000000000000e+00 237 237 1.0000000000000000e+00 238 238 5.0000000000000018e-09 238 347 -4.1666666666666668e-10 238 314 -4.1666666666666668e-10 238 313 -4.1666666666666668e-10 238 175 -1.2500000000000000e-09 239 239 5.0000000000000018e-09 239 231 -4.1666666666666668e-10 239 281 -4.1666666666666668e-10 239 175 -1.2500000000000000e-09 239 347 -4.1666666666666668e-10 240 240 1.0000000000000000e+00 241 241 5.8333333333333343e-09 241 242 -8.3333333333333335e-10 241 243 -8.3333333333333335e-10 241 810 -8.3333333333333335e-10 241 802 -8.3333333333333335e-10 241 649 -1.2500000000000000e-09 242 242 7.0833333333333372e-09 242 257 -8.3333333333333335e-10 242 243 -4.1666666666666668e-10 242 256 -1.2500000000000000e-09 242 241 -8.3333333333333335e-10 242 649 -2.0833333333333334e-10 242 710 -1.6666666666666667e-09 243 243 1.0416666666666674e-08 243 278 -4.1666666666666668e-10 243 158 2.0833333333333334e-10 243 242 -4.1666666666666668e-10 243 358 -2.0833333333333334e-09 243 201 -8.3333333333333335e-10 243 256 -2.5000000000000009e-09 243 272 -8.3333333333333335e-10 243 241 -8.3333333333333335e-10 243 810 -4.1666666666666668e-10 243 649 -8.3333333333333335e-10 244 244 1.0000000000000000e+00 245 245 1.0000000000000000e+00 246 246 1.0416666666666674e-08 246 299 -4.1666666666666668e-10 246 158 2.0833333333333334e-10 246 249 -4.1666666666666668e-10 246 255 -4.1666666666666668e-10 246 361 -2.0833333333333334e-09 246 202 -8.3333333333333335e-10 246 269 -2.5000000000000009e-09 246 294 -8.3333333333333335e-10 246 250 -8.3333333333333335e-10 246 619 -8.3333333333333335e-10 247 247 1.0000000000000000e+00 248 248 1.0000000000000000e+00 249 249 7.5000000000000043e-09 249 269 -8.3333333333333335e-10 249 254 -8.3333333333333335e-10 249 246 -4.1666666666666668e-10 249 278 -4.1666666666666668e-10 249 250 -8.3333333333333335e-10 249 619 -4.1666666666666668e-10 249 669 -1.6666666666666667e-09 250 250 5.8333333333333343e-09 250 255 -8.3333333333333335e-10 250 249 -8.3333333333333335e-10 250 246 -8.3333333333333335e-10 250 842 -8.3333333333333335e-10 250 619 -1.2500000000000000e-09 251 251 6.6666666666666701e-09 251 283 -8.3333333333333335e-10 251 174 4.1666666666666668e-10 251 252 -8.3333333333333335e-10 251 338 -8.3333333333333335e-10 251 179 4.1666666666666668e-10 251 353 -4.1666666666666668e-10 251 156 -8.3333333333333335e-10 251 190 -4.1666666666666668e-10 251 191 -4.1666666666666668e-10 251 253 -4.1666666666666668e-10 251 74 -4.1666666666666668e-10 251 15 -8.3333333333333335e-10 251 108 -4.1666666666666668e-10 251 113 -4.1666666666666668e-10 251 75 -4.1666666666666668e-10 252 252 6.6666666666666701e-09 252 251 -8.3333333333333335e-10 252 326 -8.3333333333333335e-10 252 179 -8.3333333333333335e-10 252 320 -4.1666666666666668e-10 252 351 -4.1666666666666668e-10 252 169 4.1666666666666668e-10 252 253 -4.1666666666666668e-10 252 190 -4.1666666666666668e-10 252 156 4.1666666666666668e-10 252 344 -8.3333333333333335e-10 252 113 -4.1666666666666668e-10 252 108 -4.1666666666666668e-10 252 15 4.1666666666666668e-10 252 70 -4.1666666666666668e-10 252 111 -4.1666666666666668e-10 252 18 4.1666666666666668e-10 252 110 -8.3333333333333335e-10 253 253 5.0000000000000018e-09 253 338 -4.1666666666666668e-10 253 314 -4.1666666666666668e-10 253 252 -4.1666666666666668e-10 253 156 -1.2500000000000000e-09 253 347 -4.1666666666666668e-10 253 344 -4.1666666666666668e-10 253 251 -4.1666666666666668e-10 253 179 -1.2500000000000000e-09 254 254 6.2500000000000014e-09 254 278 -8.3333333333333335e-10 254 249 -8.3333333333333335e-10 254 750 -8.3333333333333335e-10 254 619 -1.4583333333333334e-09 254 670 -8.3333333333333335e-10 255 255 7.5000000000000043e-09 255 206 -4.1666666666666668e-10 255 250 -8.3333333333333335e-10 255 246 -4.1666666666666668e-10 255 361 -8.3333333333333335e-10 255 628 2.0833333333333334e-10 255 619 -4.1666666666666668e-10 255 761 -8.3333333333333335e-10 255 693 -8.3333333333333335e-10 255 764 -1.6666666666666667e-09 256 256 1.0000000000000008e-08 256 243 -2.5000000000000009e-09 256 264 -1.6666666666666667e-09 256 195 -1.6666666666666667e-09 256 242 -1.2500000000000000e-09 256 649 2.0833333333333334e-10 257 257 6.6666666666666701e-09 257 261 -8.3333333333333335e-10 257 242 -8.3333333333333335e-10 257 356 -8.3333333333333335e-10 257 195 -8.3333333333333335e-10 257 649 -1.6666666666666667e-09 258 258 1.0000000000000000e+00 259 259 6.6666666666666685e-09 259 207 -8.3333333333333335e-10 259 301 -8.3333333333333335e-10 259 194 -1.6666666666666667e-09 259 201 -8.3333333333333335e-10 259 260 -8.3333333333333335e-10 259 200 -1.6666666666666667e-09 260 260 6.6666666666666685e-09 260 180 -1.6666666666666667e-09 260 357 -8.3333333333333335e-10 260 261 -8.3333333333333335e-10 260 259 -8.3333333333333335e-10 260 811 -8.3333333333333335e-10 260 649 -1.6666666666666667e-09 261 261 6.6666666666666701e-09 261 257 -8.3333333333333335e-10 261 260 -8.3333333333333335e-10 261 355 -1.6666666666666667e-09 261 262 -8.3333333333333335e-10 261 194 -1.6666666666666667e-09 262 262 1.6666667166666663e-01 262 180 -2.0833334375000002e-02 262 303 -8.3333333333333335e-10 262 261 -8.3333333333333335e-10 262 68 -4.1666666666666668e-10 262 138 -4.1666666666666668e-10 262 17 4.1666666666666668e-10 262 38 -4.1666666666666664e-02 262 48 -4.1666666666666664e-02 262 8 4.1666666666666664e-02 262 33 -4.1666667083333331e-02 262 45 -4.1666667083333338e-02 263 263 1.6666667166666663e-01 263 186 4.1666666666666668e-10 263 208 -8.3333333333333335e-10 263 180 -2.0833334375000002e-02 263 140 -4.1666666666666668e-10 263 59 -4.1666666666666668e-10 263 420 -4.1666666666666664e-02 263 117 -4.1666666666666664e-02 263 372 4.1666666666666664e-02 263 811 -8.3333333333333335e-10 263 124 -4.1666667083333331e-02 263 507 -4.1666667083333338e-02 263 14 -2.0833334375000002e-02 264 264 6.6666666666666701e-09 264 272 -8.3333333333333335e-10 264 197 -8.3333333333333335e-10 264 256 -1.6666666666666667e-09 264 209 -1.6666666666666667e-09 265 265 1.0000000000000000e+00 266 266 1.0000000000000000e+00 267 267 1.0000000000000000e+00 268 268 1.0000000000000000e+00 269 269 1.0000000000000005e-08 269 249 -8.3333333333333335e-10 269 246 -2.5000000000000009e-09 269 270 -1.6666666666666667e-09 269 278 -2.5000000000000005e-09 269 619 4.1666666666666668e-10 270 270 6.6666666666666701e-09 270 294 -8.3333333333333335e-10 270 272 -8.3333333333333335e-10 270 269 -1.6666666666666667e-09 270 209 -1.6666666666666667e-09 271 271 1.0000000000000000e+00 272 272 6.2500000000000014e-09 272 264 -8.3333333333333335e-10 272 270 -8.3333333333333335e-10 272 158 -1.4583333333333334e-09 272 243 -8.3333333333333335e-10 272 278 -8.3333333333333335e-10 273 273 1.0000000000000000e+00 274 274 1.0000000000000000e+00 275 275 1.0000000000000000e+00 276 276 1.0000000000000000e+00 277 277 1.0000000000000000e+00 278 278 1.0000000000000007e-08 278 254 -8.3333333333333335e-10 278 202 -8.3333333333333335e-10 278 243 -4.1666666666666668e-10 278 158 -4.1666666666666668e-10 278 358 -2.5000000000000001e-09 278 249 -4.1666666666666668e-10 278 269 -2.5000000000000005e-09 278 272 -8.3333333333333335e-10 278 619 -4.1666666666666668e-10 278 812 -4.1666666666666668e-10 278 649 8.3333333333333335e-10 279 279 9.9999999999999978e-01 279 300 -8.3333333333333329e-02 279 174 -4.1666666666666664e-02 279 281 -8.3333333333333329e-02 279 280 -2.4999999999999997e-01 279 231 -4.1666666666666671e-02 279 21 -4.1666666666666664e-02 279 783 -4.1666666666666664e-02 279 481 -4.1666666666666664e-02 279 688 -2.5000000000000000e-01 279 701 -8.3333333333333329e-02 280 280 1.0000000000000002e+00 280 174 4.1666666666666664e-02 280 279 -2.4999999999999997e-01 280 282 -1.2499999999999999e-01 280 481 -2.0833333333333331e-01 280 783 -2.0833333333333331e-01 281 281 2.9166667000000029e-01 281 239 -4.1666666666666668e-10 281 233 -4.1666666666666668e-10 281 175 4.1666666666666668e-10 281 348 -4.1666666666666668e-10 281 353 -4.1666666666666668e-10 281 156 4.1666666666666668e-10 281 279 -8.3333333333333329e-02 281 231 -4.1666667083333338e-02 281 347 -8.3333333333333335e-10 281 282 -4.1666667083333338e-02 281 174 -6.2500000416666646e-02 282 282 3.7500000333333361e-01 282 191 -4.1666666666666668e-10 282 156 -8.3333333333333335e-10 282 348 -4.1666666666666668e-10 282 353 -4.1666666666666668e-10 282 283 -4.1666667083333338e-02 282 174 -2.0833333124999995e-02 282 193 -4.1666666666666668e-10 282 281 -4.1666667083333338e-02 282 280 -1.2499999999999999e-01 282 481 -4.1666666666666664e-02 283 283 2.5000000333333350e-01 283 251 -8.3333333333333335e-10 283 174 -4.1666667083333338e-02 283 287 -4.1666667083333331e-02 283 191 -4.1666666666666668e-10 283 353 -4.1666666666666668e-10 283 156 4.1666666666666668e-10 283 282 -4.1666667083333338e-02 283 75 -4.1666666666666668e-10 283 74 -4.1666666666666668e-10 283 15 4.1666666666666668e-10 283 481 -8.3333333333333329e-02 284 284 1.0000000000000000e+00 285 285 1.0000000000000000e+00 286 286 2.0000000000000000e+00 287 287 3.7500000333333333e-01 287 283 -4.1666667083333331e-02 287 174 -2.0833333124999999e-02 287 62 -4.1666666666666668e-10 287 480 -4.1666667083333331e-02 287 383 2.0833333333333334e-10 287 15 -8.3333333333333335e-10 287 75 -4.1666666666666668e-10 287 74 -4.1666666666666668e-10 287 479 -4.1666667083333331e-02 287 63 -4.1666666666666668e-10 287 477 -1.2500000000000000e-01 287 481 -4.1666666666666664e-02 288 288 1.0000000000000000e+00 289 289 1.0000000000000000e+00 290 290 1.0000000000000000e+00 291 291 1.0000000000000000e+00 292 292 1.0000000000000005e-08 292 226 -1.2500000000000000e-09 292 163 2.0833333333333334e-10 292 210 -1.6666666666666667e-09 292 302 -1.6666666666666667e-09 292 299 -2.5000000000000005e-09 293 293 1.0000000000000000e+00 294 294 6.2500000000000014e-09 294 270 -8.3333333333333335e-10 294 210 -8.3333333333333335e-10 294 158 -1.4583333333333334e-09 294 246 -8.3333333333333335e-10 294 299 -8.3333333333333335e-10 295 295 1.0000000000000000e+00 296 296 1.0000000000000000e+00 297 297 1.0000000000000000e+00 298 298 1.0000000000000000e+00 299 299 1.0000000000000007e-08 299 331 -8.3333333333333335e-10 299 163 -4.1666666666666668e-10 299 207 -8.3333333333333335e-10 299 206 -4.1666666666666668e-10 299 246 -4.1666666666666668e-10 299 158 -4.1666666666666668e-10 299 361 -2.5000000000000001e-09 299 226 -4.1666666666666668e-10 299 292 -2.5000000000000005e-09 299 294 -8.3333333333333335e-10 299 619 8.3333333333333335e-10 300 300 6.2500000000000000e-01 300 174 -1.4583333333333331e-01 300 279 -8.3333333333333329e-02 300 478 -8.3333333333333329e-02 300 689 -8.3333333333333329e-02 300 21 -1.4583333333333331e-01 300 481 -8.3333333333333329e-02 301 301 6.6666666666666693e-09 301 336 -4.1666666666666668e-10 301 186 4.1666666666666668e-10 301 303 -8.3333333333333335e-10 301 208 -8.3333333333333335e-10 301 163 -1.2500000000000000e-09 301 259 -8.3333333333333335e-10 301 180 -1.2500000000000000e-09 301 140 -4.1666666666666668e-10 301 138 -4.1666666666666668e-10 301 137 -4.1666666666666668e-10 301 17 4.1666666666666668e-10 301 139 -8.3333333333333335e-10 302 302 6.6666666666666701e-09 302 197 -8.3333333333333335e-10 302 207 -8.3333333333333335e-10 302 194 -1.6666666666666667e-09 302 227 -8.3333333333333335e-10 302 292 -1.6666666666666667e-09 303 303 6.6666666666666693e-09 303 180 2.0833333333333334e-10 303 301 -8.3333333333333335e-10 303 194 -1.6666666666666667e-09 303 227 -8.3333333333333335e-10 303 163 2.0833333333333334e-10 303 262 -8.3333333333333335e-10 303 142 -4.1666666666666668e-10 303 17 -8.3333333333333335e-10 303 138 -4.1666666666666668e-10 303 137 -4.1666666666666668e-10 303 68 -4.1666666666666668e-10 304 304 2.0000000000000000e+00 305 305 1.0000000000000000e+00 306 306 1.0000000000000000e+00 307 307 7.5000000000000000e-01 307 599 -8.3333333333333329e-02 307 593 -8.3333333333333329e-02 307 481 -8.3333333333333329e-02 307 21 -2.0833333333333331e-01 307 783 -8.3333333333333329e-02 308 308 1.0000000000000000e+00 309 309 1.0000000000000000e+00 310 310 5.0000000000000018e-09 310 319 -4.1666666666666668e-10 310 314 -4.1666666666666668e-10 310 313 -4.1666666666666668e-10 310 172 -1.2500000000000000e-09 311 311 5.0000000000000018e-09 311 226 -4.1666666666666668e-10 311 331 -4.1666666666666668e-10 311 172 -1.2500000000000000e-09 311 313 -4.1666666666666668e-10 312 312 1.0000000000000000e+00 313 313 6.6666666666666718e-09 313 332 -4.1666666666666668e-10 313 228 -4.1666666666666668e-10 313 163 4.1666666666666668e-10 313 172 -8.3333333333333335e-10 313 310 -4.1666666666666668e-10 313 175 -8.3333333333333335e-10 313 238 -4.1666666666666668e-10 313 315 -4.1666666666666668e-10 313 329 -8.3333333333333335e-10 313 311 -4.1666666666666668e-10 313 331 -8.3333333333333335e-10 313 318 -4.1666666666666668e-10 313 314 -8.3333333333333335e-10 313 179 4.1666666666666668e-10 313 316 -4.1666666666666668e-10 314 314 6.6666666666666718e-09 314 253 -4.1666666666666668e-10 314 341 -4.1666666666666668e-10 314 156 4.1666666666666668e-10 314 320 -4.1666666666666668e-10 314 216 -4.1666666666666668e-10 314 169 4.1666666666666668e-10 314 318 -4.1666666666666668e-10 314 310 -4.1666666666666668e-10 314 172 4.1666666666666668e-10 314 238 -4.1666666666666668e-10 314 315 -4.1666666666666668e-10 314 175 4.1666666666666668e-10 314 347 -8.3333333333333335e-10 314 344 -8.3333333333333335e-10 314 319 -8.3333333333333335e-10 314 313 -8.3333333333333335e-10 314 179 -8.3333333333333335e-10 315 315 5.0000000000000018e-09 315 338 -4.1666666666666668e-10 315 329 -4.1666666666666668e-10 315 175 -1.2500000000000000e-09 315 314 -4.1666666666666668e-10 315 347 -4.1666666666666668e-10 315 333 -4.1666666666666668e-10 315 313 -4.1666666666666668e-10 315 179 -1.2500000000000000e-09 316 316 5.0000000000000018e-09 316 331 -4.1666666666666668e-10 316 330 -4.1666666666666668e-10 316 175 -1.2500000000000000e-09 316 313 -4.1666666666666668e-10 317 317 1.0000000000000000e+00 318 318 5.0000000000000018e-09 318 329 -4.1666666666666668e-10 318 327 -4.1666666666666668e-10 318 314 -4.1666666666666668e-10 318 172 -1.2500000000000000e-09 318 328 -4.1666666666666668e-10 318 319 -4.1666666666666668e-10 318 313 -4.1666666666666668e-10 318 179 -1.2500000000000000e-09 319 319 6.6666666666666718e-09 319 222 -4.1666666666666668e-10 319 323 -4.1666666666666668e-10 319 169 -8.3333333333333335e-10 319 216 -4.1666666666666668e-10 319 172 -8.3333333333333335e-10 319 310 -4.1666666666666668e-10 319 318 -4.1666666666666668e-10 319 327 -8.3333333333333335e-10 319 217 -4.1666666666666668e-10 319 320 -4.1666666666666668e-10 319 314 -8.3333333333333335e-10 319 179 4.1666666666666668e-10 319 223 -4.1666666666666668e-10 320 320 5.0000000000000018e-09 320 252 -4.1666666666666668e-10 320 327 -4.1666666666666668e-10 320 314 -4.1666666666666668e-10 320 169 -1.2500000000000000e-09 320 344 -4.1666666666666668e-10 320 326 -4.1666666666666668e-10 320 319 -4.1666666666666668e-10 320 179 -1.2500000000000000e-09 321 321 1.0000000000000000e+00 322 322 2.0000000000000000e+00 323 323 5.0000000000000018e-09 323 319 -4.1666666666666668e-10 323 327 -4.1666666666666668e-10 323 326 -4.1666666666666668e-10 323 169 -1.2500000000000000e-09 324 324 5.0000000000000018e-09 324 169 -1.2500000000000000e-09 324 326 -4.1666666666666668e-10 325 325 1.0000000000000000e+00 326 326 6.6666666666666701e-09 326 327 -8.3333333333333335e-10 326 252 -8.3333333333333335e-10 326 179 4.1666666666666668e-10 326 351 -4.1666666666666668e-10 326 169 -8.3333333333333335e-10 326 323 -4.1666666666666668e-10 326 324 -4.1666666666666668e-10 326 320 -4.1666666666666668e-10 326 70 -4.1666666666666668e-10 326 18 -8.3333333333333335e-10 326 78 -4.1666666666666668e-10 326 111 -4.1666666666666668e-10 326 71 -4.1666666666666668e-10 327 327 6.6666666666666701e-09 327 326 -8.3333333333333335e-10 327 328 -8.3333333333333335e-10 327 179 -8.3333333333333335e-10 327 318 -4.1666666666666668e-10 327 222 -4.1666666666666668e-10 327 172 4.1666666666666668e-10 327 320 -4.1666666666666668e-10 327 323 -4.1666666666666668e-10 327 169 4.1666666666666668e-10 327 319 -8.3333333333333335e-10 327 141 -4.1666666666666668e-10 327 151 -4.1666666666666668e-10 327 17 4.1666666666666668e-10 327 78 -4.1666666666666668e-10 327 111 -4.1666666666666668e-10 327 18 4.1666666666666668e-10 327 149 -8.3333333333333335e-10 328 328 6.6666666666666701e-09 328 329 -8.3333333333333335e-10 328 163 4.1666666666666668e-10 328 327 -8.3333333333333335e-10 328 179 4.1666666666666668e-10 328 227 -8.3333333333333335e-10 328 222 -4.1666666666666668e-10 328 172 -8.3333333333333335e-10 328 228 -4.1666666666666668e-10 328 229 -4.1666666666666668e-10 328 318 -4.1666666666666668e-10 328 151 -4.1666666666666668e-10 328 17 -8.3333333333333335e-10 328 137 -4.1666666666666668e-10 328 141 -4.1666666666666668e-10 328 142 -4.1666666666666668e-10 329 329 6.6666666666666701e-09 329 328 -8.3333333333333335e-10 329 336 -4.1666666666666668e-10 329 337 -4.1666666666666668e-10 329 186 4.1666666666666668e-10 329 163 -8.3333333333333335e-10 329 179 -8.3333333333333335e-10 329 315 -4.1666666666666668e-10 329 332 -4.1666666666666668e-10 329 175 4.1666666666666668e-10 329 318 -4.1666666666666668e-10 329 228 -4.1666666666666668e-10 329 172 4.1666666666666668e-10 329 333 -8.3333333333333335e-10 329 313 -8.3333333333333335e-10 329 141 -4.1666666666666668e-10 329 137 -4.1666666666666668e-10 329 17 4.1666666666666668e-10 329 139 -8.3333333333333335e-10 330 330 7.0833333333333389e-09 330 206 -4.1666666666666668e-10 330 234 -4.1666666666666668e-10 330 175 -8.3333333333333335e-10 330 316 -4.1666666666666668e-10 330 331 -8.3333333333333335e-10 330 361 -1.2500000000000000e-09 330 332 -4.1666666666666668e-10 330 334 -8.3333333333333335e-10 330 235 -4.1666666666666668e-10 330 693 -8.3333333333333335e-10 330 628 4.1666666666666668e-10 331 331 6.2500000000000030e-09 331 299 -8.3333333333333335e-10 331 311 -4.1666666666666668e-10 331 228 -4.1666666666666668e-10 331 172 4.1666666666666668e-10 331 316 -4.1666666666666668e-10 331 332 -4.1666666666666668e-10 331 175 4.1666666666666668e-10 331 330 -8.3333333333333335e-10 331 226 -8.3333333333333335e-10 331 163 -1.0416666666666667e-09 331 313 -8.3333333333333335e-10 332 332 5.0000000000000018e-09 332 334 -4.1666666666666668e-10 332 333 -4.1666666666666668e-10 332 329 -4.1666666666666668e-10 332 313 -4.1666666666666668e-10 332 175 -1.2500000000000000e-09 332 331 -4.1666666666666668e-10 332 330 -4.1666666666666668e-10 332 163 -1.2500000000000000e-09 333 333 6.6666666666666701e-09 333 337 -4.1666666666666668e-10 333 179 4.1666666666666668e-10 333 186 -8.3333333333333335e-10 333 338 -8.3333333333333335e-10 333 174 4.1666666666666668e-10 333 335 -4.1666666666666668e-10 333 232 -8.3333333333333335e-10 333 233 -4.1666666666666668e-10 333 336 -4.1666666666666668e-10 333 175 -8.3333333333333335e-10 333 332 -4.1666666666666668e-10 333 163 4.1666666666666668e-10 333 315 -4.1666666666666668e-10 333 329 -8.3333333333333335e-10 333 234 -4.1666666666666668e-10 333 334 -8.3333333333333335e-10 333 143 -4.1666666666666668e-10 333 628 4.1666666666666668e-10 334 334 5.8333333333333343e-09 334 335 -4.1666666666666668e-10 334 163 -8.3333333333333335e-10 334 336 -4.1666666666666668e-10 334 186 4.1666666666666668e-10 334 208 -8.3333333333333335e-10 334 234 -4.1666666666666668e-10 334 332 -4.1666666666666668e-10 334 175 4.1666666666666668e-10 334 206 -8.3333333333333335e-10 334 330 -8.3333333333333335e-10 334 333 -8.3333333333333335e-10 334 628 -8.3333333333333335e-10 335 335 5.0000000000000009e-09 335 232 -4.1666666666666668e-10 335 334 -4.1666666666666668e-10 335 186 -1.2500000000000000e-09 335 208 -4.1666666666666668e-10 335 333 -4.1666666666666668e-10 335 136 -4.1666666666666668e-10 335 760 -4.1666666666666668e-10 335 628 -1.2500000000000000e-09 336 336 5.0000000000000001e-09 336 301 -4.1666666666666668e-10 336 329 -4.1666666666666668e-10 336 186 -1.2500000000000000e-09 336 334 -4.1666666666666668e-10 336 208 -4.1666666666666668e-10 336 163 -1.2500000000000000e-09 336 333 -4.1666666666666668e-10 336 139 -4.1666666666666668e-10 337 337 5.0000000000000009e-09 337 333 -4.1666666666666668e-10 337 338 -4.1666666666666668e-10 337 186 -1.2500000000000000e-09 337 329 -4.1666666666666668e-10 337 179 -1.2500000000000000e-09 337 147 -4.1666666666666668e-10 337 139 -4.1666666666666668e-10 337 145 -4.1666666666666668e-10 338 338 6.6666666666666701e-09 338 333 -8.3333333333333335e-10 338 337 -4.1666666666666668e-10 338 186 4.1666666666666668e-10 338 174 -8.3333333333333335e-10 338 251 -8.3333333333333335e-10 338 179 -8.3333333333333335e-10 338 253 -4.1666666666666668e-10 338 353 -4.1666666666666668e-10 338 156 4.1666666666666668e-10 338 315 -4.1666666666666668e-10 338 233 -4.1666666666666668e-10 338 175 4.1666666666666668e-10 338 347 -8.3333333333333335e-10 338 143 -4.1666666666666668e-10 338 74 -4.1666666666666668e-10 338 113 -4.1666666666666668e-10 338 15 4.1666666666666668e-10 338 145 -8.3333333333333335e-10 339 339 1.0000000000000000e+00 340 340 1.0000000000000000e+00 341 341 5.0000000000000018e-09 341 347 -4.1666666666666668e-10 341 314 -4.1666666666666668e-10 341 344 -4.1666666666666668e-10 341 156 -1.2500000000000000e-09 342 342 5.0000000000000018e-09 342 156 -1.2500000000000000e-09 342 344 -4.1666666666666668e-10 343 343 1.0000000000000000e+00 344 344 6.6666666666666718e-09 344 351 -4.1666666666666668e-10 344 190 -4.1666666666666668e-10 344 156 -8.3333333333333335e-10 344 341 -4.1666666666666668e-10 344 169 -8.3333333333333335e-10 344 216 -4.1666666666666668e-10 344 320 -4.1666666666666668e-10 344 252 -8.3333333333333335e-10 344 342 -4.1666666666666668e-10 344 253 -4.1666666666666668e-10 344 314 -8.3333333333333335e-10 344 179 4.1666666666666668e-10 344 345 -4.1666666666666668e-10 345 345 5.0000000000000018e-09 345 169 -1.2500000000000000e-09 345 344 -4.1666666666666668e-10 346 346 1.0000000000000000e+00 347 347 6.6666666666666718e-09 347 353 -4.1666666666666668e-10 347 233 -4.1666666666666668e-10 347 174 4.1666666666666668e-10 347 175 -8.3333333333333335e-10 347 238 -4.1666666666666668e-10 347 156 -8.3333333333333335e-10 347 341 -4.1666666666666668e-10 347 253 -4.1666666666666668e-10 347 338 -8.3333333333333335e-10 347 239 -4.1666666666666668e-10 347 281 -8.3333333333333335e-10 347 315 -4.1666666666666668e-10 347 314 -8.3333333333333335e-10 347 179 4.1666666666666668e-10 347 348 -4.1666666666666668e-10 348 348 5.0000000000000018e-09 348 281 -4.1666666666666668e-10 348 282 -4.1666666666666668e-10 348 156 -1.2500000000000000e-09 348 347 -4.1666666666666668e-10 349 349 1.0000000000000000e+00 350 350 1.0000000000000000e+00 351 351 5.0000000000000018e-09 351 326 -4.1666666666666668e-10 351 252 -4.1666666666666668e-10 351 344 -4.1666666666666668e-10 351 169 -1.2500000000000000e-09 352 352 2.0000000000000000e+00 353 353 5.0000000000000018e-09 353 283 -4.1666666666666668e-10 353 251 -4.1666666666666668e-10 353 338 -4.1666666666666668e-10 353 347 -4.1666666666666668e-10 353 156 -1.2500000000000000e-09 353 281 -4.1666666666666668e-10 353 282 -4.1666666666666668e-10 353 174 -1.2500000000000000e-09 354 354 2.0000000000000000e+00 355 355 1.0000000000000004e-08 355 357 -1.6666666666666667e-09 355 356 -1.6666666666666667e-09 355 261 -1.6666666666666667e-09 355 7 2.0833333333333334e-10 355 831 -2.5000000000000009e-09 355 33 -1.2500000000000000e-09 356 356 6.6666666666666701e-09 356 355 -1.6666666666666667e-09 356 257 -8.3333333333333335e-10 356 848 -8.3333333333333335e-10 356 809 -8.3333333333333335e-10 356 710 -1.6666666666666667e-09 357 357 6.6666666666666685e-09 357 260 -8.3333333333333335e-10 357 355 -1.6666666666666667e-09 357 809 -8.3333333333333335e-10 357 82 -8.3333333333333335e-10 357 81 -8.3333333333333335e-10 357 152 -1.6666666666666667e-09 358 358 1.0000000000000004e-08 358 278 -2.5000000000000001e-09 358 243 -2.0833333333333334e-09 358 812 -2.0833333333333334e-09 358 619 4.1666666666666668e-10 358 810 -8.3333333333333335e-10 358 750 -1.2500000000000000e-09 359 359 1.0000000000000000e+00 360 360 1.0000000000000000e+00 361 361 1.0000000000000004e-08 361 206 -2.0833333333333334e-09 361 163 4.1666666666666668e-10 361 299 -2.5000000000000001e-09 361 255 -8.3333333333333335e-10 361 246 -2.0833333333333334e-09 361 330 -1.2500000000000000e-09 362 362 1.0000000000000000e+00 363 363 1.0000000000000000e+00 364 364 1.0000000000000000e+00 365 365 2.0000000000000000e+00 hypre-2.33.0/src/test/TEST_ams/mfem.Abeta.00002000066400000000000000000001324131477326011500204470ustar00rootroot00000000000000366 614 366 614 366 366 2.0000000000000000e+00 367 367 2.0000000000000000e+00 368 368 2.0000000000000000e+00 369 369 1.0000000000000007e+00 369 501 4.1666666666666664e-02 369 505 4.1666666666666664e-02 369 416 4.1666666666666664e-02 369 499 -8.3333333333333329e-02 369 495 4.1666666666666664e-02 369 494 -8.3333333333333329e-02 369 492 -1.2499999999999999e-01 369 491 -1.2499999999999999e-01 369 489 -8.3333333333333329e-02 369 490 4.1666666666666664e-02 369 488 -1.2499999999999999e-01 369 484 4.1666666666666664e-02 369 483 -8.3333333333333329e-02 369 425 4.1666666666666664e-02 369 424 -1.2499999999999999e-01 369 423 -1.2499999999999999e-01 369 421 -8.3333333333333329e-02 369 422 4.1666666666666664e-02 369 414 -1.2499999999999999e-01 369 412 -1.2499999999999999e-01 369 411 -1.2499999999999999e-01 370 370 1.0000000000000004e+00 370 514 4.1666666666666664e-02 370 417 -1.2500000000000000e-01 370 495 -8.3333333333333329e-02 370 444 -8.3333333333333329e-02 370 433 -1.0416666666666666e-01 370 537 0.0000000000000000e+00 370 448 4.1666666666666664e-02 370 524 -4.1666666666666664e-02 370 443 -6.2500000000000000e-02 370 525 4.1666666666666664e-02 370 518 4.1666666666666664e-02 370 517 -4.1666666666666664e-02 370 499 4.1666666666666664e-02 370 494 4.1666666666666664e-02 370 455 -6.2500000000000000e-02 370 454 4.1666666666666664e-02 370 457 -1.2499999999999999e-01 370 415 -2.0833333333333332e-02 370 491 -1.2499999999999999e-01 370 416 -8.3333333333333329e-02 370 434 -1.2499999999999999e-01 370 490 -1.0416666666666666e-01 370 432 -2.0833333333333332e-02 370 126 4.1666666666666664e-02 370 134 -1.2499999999999999e-01 371 371 7.5000000250000054e-01 371 425 -1.4583333374999996e-01 371 588 -8.3333334166666662e-02 371 458 2.0833333333333332e-02 371 519 2.0833333333333332e-02 371 455 -8.3333333333333329e-02 371 507 2.0833333333333332e-02 371 489 4.1666666666666664e-02 371 421 2.0833333333333332e-02 371 419 -1.4583333374999996e-01 371 415 4.1666666666666664e-02 371 520 -1.2499999999999999e-01 371 418 -1.2499999999999999e-01 371 422 -4.1666667500000004e-02 371 424 -1.2499999999999999e-01 371 416 -8.3333333333333329e-02 371 499 4.1666666666666664e-02 372 372 9.9999999999999978e-01 372 444 4.1666666666666664e-02 372 417 -1.2500000000000000e-01 372 495 4.1666666666666664e-02 372 445 4.1666666666666664e-02 372 516 -1.2500000000000000e-01 372 500 -1.2500000000000000e-01 372 505 4.1666666666666664e-02 372 420 -1.2500000000000000e-01 372 506 -1.2500000000000000e-01 372 507 -8.3333333333333329e-02 372 422 4.1666666666666664e-02 372 499 -8.3333333333333329e-02 372 419 4.1666666666666664e-02 372 418 -1.2499999999999999e-01 372 415 -8.3333333333333329e-02 372 416 4.1666666666666664e-02 372 46 4.1666666666666664e-02 372 121 4.1666666666666664e-02 372 126 -8.3333333333333329e-02 372 125 -1.2499999999999999e-01 372 124 -8.3333333333333329e-02 372 60 4.1666666666666664e-02 372 118 -8.3333333333333329e-02 372 263 4.1666666666666664e-02 372 117 -1.2499999999999999e-01 372 81 4.1666666666666664e-02 373 373 1.0000000000000000e+00 374 374 2.0000000000000000e+00 375 375 2.0000000000000000e+00 376 376 1.0000000000000007e+00 376 514 -8.3333333333333329e-02 376 513 4.1666666666666664e-02 376 511 -8.3333333333333329e-02 376 484 4.1666666666666664e-02 376 510 -1.2499999999999999e-01 376 497 -1.2499999999999999e-01 376 490 4.1666666666666664e-02 376 496 -1.2499999999999999e-01 376 494 -8.3333333333333329e-02 376 495 4.1666666666666664e-02 376 435 -1.2499999999999999e-01 376 434 -1.2499999999999999e-01 376 432 -8.3333333333333329e-02 376 433 4.1666666666666664e-02 376 431 -1.2499999999999999e-01 376 429 -1.2499999999999999e-01 376 428 -1.2499999999999999e-01 377 377 2.0000000000000000e+00 378 378 1.0833333333333335e+00 378 441 -2.0833333333333332e-02 378 544 2.0833333333333332e-02 378 556 -1.6666666666666666e-01 378 555 -1.6666666666666666e-01 378 517 8.3333333333333329e-02 378 476 -1.6666666666666666e-01 378 456 -2.0833333333333331e-01 378 519 -4.1666666666666664e-02 378 437 -8.3333333333333329e-02 378 520 -1.2499999999999999e-01 378 458 -2.0833333333333332e-02 378 455 -8.3333333333333329e-02 378 454 2.0833333333333332e-02 378 442 -1.2499999999999999e-01 379 379 1.0000000000000000e+00 380 380 1.0000000000000000e+00 381 381 1.0000000000000000e+00 382 382 1.0833333333333337e+00 382 592 -1.6666666666666666e-01 382 568 -1.6666666666666666e-01 382 446 -2.0833333333333332e-02 382 454 2.0833333333333332e-02 382 524 8.3333333333333329e-02 382 466 -1.6666666666666666e-01 382 467 -2.0833333333333334e-01 382 534 -2.0833333333333332e-02 382 527 -8.3333333333333329e-02 382 459 2.0833333333333332e-02 382 532 -4.1666666666666664e-02 382 443 -8.3333333333333329e-02 382 533 -1.2499999999999999e-01 382 447 -1.2499999999999999e-01 383 383 7.5000000250000021e-01 383 537 4.1666666666666664e-02 383 445 -1.4583333354166667e-01 383 480 -1.4583333354166667e-01 383 479 -8.3333333750000002e-02 383 516 -1.2500000000000000e-01 383 444 -8.3333333333333329e-02 383 532 2.0833333333333332e-02 383 446 2.0833333333333332e-02 383 443 -8.3333333333333329e-02 383 415 4.1666666666666664e-02 383 447 -1.2499999999999999e-01 383 287 2.0833333333333334e-10 383 136 2.0833333333333334e-10 383 124 2.0833333541666669e-02 383 39 2.0833333541666665e-02 383 144 -1.2500000000000000e-09 383 62 -1.2500000000000000e-09 383 145 4.1666666666666668e-10 383 127 -1.2499999999999999e-01 383 60 -4.1666667083333331e-02 383 126 4.1666666666666664e-02 384 384 1.0000000000000004e+00 384 527 2.0833333333333332e-02 384 443 2.0833333333333332e-02 384 524 -4.1666666666666664e-02 384 455 2.0833333333333332e-02 384 437 2.0833333333333332e-02 384 517 -4.1666666666666664e-02 384 541 -1.6666666666666666e-01 384 467 -2.0833333333333334e-01 384 462 -1.4583333333333331e-01 384 457 -1.2499999999999999e-01 384 456 -2.0833333333333331e-01 384 451 -1.4583333333333331e-01 385 385 1.0000000000000000e+00 386 386 1.0000000000000000e+00 387 387 1.0000000000000000e+00 388 388 1.0000000000000000e+00 389 389 7.5000000249999976e-01 389 468 -1.2500000041666665e-01 389 558 -1.2500000041666665e-01 389 466 -1.6666666666666666e-01 389 556 -1.6666666666666666e-01 389 676 -8.3333334166666662e-02 389 679 -8.3333334166666662e-02 390 390 9.9999999999999989e-01 390 472 -1.6666666666666666e-01 390 589 -1.4583333333333331e-01 390 575 -2.0833333333333331e-01 390 476 -1.6666666666666666e-01 390 682 2.0833333333333332e-02 390 726 2.0833333333333332e-02 390 767 -4.1666666666666664e-02 390 683 -1.4583333333333331e-01 390 680 -1.6666666666666666e-01 391 391 2.0000000000000000e+00 392 392 1.0000000000000000e+00 393 393 1.0000000000000000e+00 393 495 -8.3333333333333329e-02 393 514 4.1666666666666664e-02 393 513 -8.3333333333333329e-02 393 511 4.1666666666666664e-02 393 500 -1.2500000000000000e-01 393 505 -8.3333333333333329e-02 393 484 -8.3333333333333329e-02 393 485 -1.2500000000000000e-01 393 496 -1.2499999999999999e-01 393 499 4.1666666666666664e-02 393 494 4.1666666666666664e-02 393 488 -1.2499999999999999e-01 393 483 4.1666666666666664e-02 393 126 4.1666666666666664e-02 393 123 -1.2499999999999999e-01 393 122 4.1666666666666664e-02 393 121 -8.3333333333333329e-02 393 118 4.1666666666666664e-02 393 90 -1.2499999999999999e-01 393 103 4.1666666666666664e-02 393 102 -1.2499999999999999e-01 393 99 4.1666666666666664e-02 393 93 4.1666666666666664e-02 393 92 -1.2499999999999999e-01 393 89 -8.3333333333333329e-02 393 88 4.1666666666666664e-02 394 394 1.0000000000000002e+00 394 502 -1.2500000000000000e-01 394 505 4.1666666666666664e-02 394 487 -1.2500000000000000e-01 394 484 4.1666666666666664e-02 394 486 -1.2500000000000000e-01 394 485 -1.2500000000000000e-01 394 504 -1.2499999999999999e-01 394 501 4.1666666666666664e-02 394 483 -8.3333333333333329e-02 394 116 -8.3333333333333329e-02 394 34 4.1666666666666664e-02 394 100 -1.2499999999999999e-01 394 99 -8.3333333333333329e-02 394 89 4.1666666666666664e-02 394 93 -8.3333333333333329e-02 394 25 -1.2499999999999999e-01 394 24 -1.2499999999999999e-01 395 395 1.0000000000000000e+00 396 396 1.0000000000000000e+00 397 397 2.0000000000000000e+00 398 398 1.0000000000000000e+00 399 399 1.0000000000000000e+00 400 400 1.0000000000000000e+00 401 401 1.0000000000000000e+00 402 402 2.0000000000000000e+00 403 403 1.0000000000000000e+00 404 404 2.0000000000000000e+00 405 405 5.0000000500000019e-01 405 588 -8.3333334166666675e-02 405 610 -1.6666666666666667e-09 405 591 -2.0833333333333332e-02 405 573 2.0833333333333332e-02 405 589 -1.4583333333333331e-01 405 800 -2.0833333333333332e-02 405 850 4.1666666666666664e-02 405 797 -6.2500000833333333e-02 405 779 -8.3333334166666675e-02 405 726 -6.2500000000000000e-02 405 768 -2.0833333333333332e-02 405 766 2.0833333333333332e-02 405 767 -4.1666666666666664e-02 405 727 -4.1666667500000011e-02 406 406 2.0000000000000000e+00 407 407 2.0000000000000000e+00 408 408 2.0000000000000000e+00 409 409 1.0000000000000000e+00 410 410 2.0000000000000000e+00 411 411 5.0000000000000000e-01 411 494 -4.1666666666666664e-02 411 484 -4.1666666666666664e-02 411 483 -4.1666666666666664e-02 411 369 -1.2499999999999999e-01 412 412 5.0000000000000000e-01 412 421 -4.1666666666666664e-02 412 501 -4.1666666666666664e-02 412 369 -1.2499999999999999e-01 412 483 -4.1666666666666664e-02 413 413 1.0000000000000000e+00 414 414 5.0000000000000000e-01 414 425 -4.1666666666666664e-02 414 369 -1.2499999999999999e-01 414 489 -4.1666666666666664e-02 414 421 -4.1666666666666664e-02 415 415 7.4999999999999989e-01 415 516 -4.1666666666666664e-02 415 454 -8.3333333333333329e-02 415 455 -4.1666666666666664e-02 415 445 -8.3333333333333329e-02 415 383 4.1666666666666664e-02 415 443 -4.1666666666666664e-02 415 372 -8.3333333333333329e-02 415 418 -4.1666666666666664e-02 415 371 4.1666666666666664e-02 415 416 -8.3333333333333329e-02 415 417 -4.1666666666666664e-02 415 444 -8.3333333333333329e-02 415 370 -2.0833333333333332e-02 415 420 -4.1666666666666664e-02 415 419 -8.3333333333333329e-02 415 14 -6.2500000000000000e-02 416 416 5.8333333333333326e-01 416 424 -4.1666666666666664e-02 416 491 -4.1666666666666664e-02 416 369 4.1666666666666664e-02 416 418 -4.1666666666666664e-02 416 417 -4.1666666666666664e-02 416 372 4.1666666666666664e-02 416 415 -8.3333333333333329e-02 416 455 -8.3333333333333329e-02 416 489 -8.3333333333333329e-02 416 370 -8.3333333333333329e-02 416 499 -8.3333333333333329e-02 416 371 -8.3333333333333329e-02 417 417 5.0000000000000000e-01 417 444 -4.1666666666666664e-02 417 495 -4.1666666666666664e-02 417 372 -1.2500000000000000e-01 417 370 -1.2500000000000000e-01 417 499 -4.1666666666666664e-02 417 416 -4.1666666666666664e-02 417 415 -4.1666666666666664e-02 417 126 -4.1666666666666664e-02 418 418 5.0000000000000000e-01 418 507 -4.1666666666666664e-02 418 422 -4.1666666666666664e-02 418 419 -4.1666666666666664e-02 418 416 -4.1666666666666664e-02 418 372 -1.2499999999999999e-01 418 415 -4.1666666666666664e-02 418 499 -4.1666666666666664e-02 418 371 -1.2499999999999999e-01 419 419 5.8333333500000006e-01 419 458 -8.3333333333333329e-02 419 420 -4.1666666666666664e-02 419 371 -1.4583333374999996e-01 419 418 -4.1666666666666664e-02 419 372 4.1666666666666664e-02 419 507 -4.1666667083333331e-02 419 590 -4.1666667083333338e-02 419 415 -8.3333333333333329e-02 419 14 -1.4583333374999999e-01 420 420 4.9999999999999994e-01 420 445 -4.1666666666666664e-02 420 372 -1.2500000000000000e-01 420 507 -4.1666666666666664e-02 420 419 -4.1666666666666664e-02 420 415 -4.1666666666666664e-02 420 263 -4.1666666666666664e-02 420 124 -4.1666666666666664e-02 420 14 -1.2500000000000000e-01 421 421 3.3333333708333318e-01 421 609 -1.2500000000000000e-09 421 611 -4.1666666666666668e-10 421 412 -4.1666666666666664e-02 421 369 -8.3333333333333329e-02 421 424 -4.1666666666666664e-02 421 422 -4.1666667083333338e-02 421 371 2.0833333333333332e-02 421 423 -4.1666666666666664e-02 421 501 -4.1666667083333338e-02 421 414 -4.1666666666666664e-02 421 425 -4.1666667083333338e-02 421 7 2.0833333124999999e-02 422 422 3.3333333666666648e-01 422 418 -4.1666666666666664e-02 422 506 -4.1666666666666664e-02 422 372 4.1666666666666664e-02 422 424 -4.1666666666666664e-02 422 423 -4.1666666666666664e-02 422 369 4.1666666666666664e-02 422 421 -4.1666667083333338e-02 422 608 -8.3333333333333335e-10 422 507 -4.1666667083333338e-02 422 499 -8.3333333333333329e-02 422 371 -4.1666667500000004e-02 422 7 -4.1666667500000011e-02 423 423 5.0000000000000000e-01 423 499 -4.1666666666666664e-02 423 501 -4.1666666666666664e-02 423 505 -4.1666666666666664e-02 423 483 -4.1666666666666664e-02 423 369 -1.2499999999999999e-01 423 422 -4.1666666666666664e-02 423 421 -4.1666666666666664e-02 423 7 -1.2499999999999999e-01 424 424 5.0000000000000000e-01 424 489 -4.1666666666666664e-02 424 416 -4.1666666666666664e-02 424 425 -4.1666666666666664e-02 424 422 -4.1666666666666664e-02 424 369 -1.2499999999999999e-01 424 421 -4.1666666666666664e-02 424 499 -4.1666666666666664e-02 424 371 -1.2499999999999999e-01 425 425 5.8333333499999995e-01 425 371 -1.4583333374999996e-01 425 591 -4.1666667083333331e-02 425 489 -8.3333333333333329e-02 425 414 -4.1666666666666664e-02 425 424 -4.1666666666666664e-02 425 369 4.1666666666666664e-02 425 519 -8.3333333333333329e-02 425 421 -4.1666667083333338e-02 426 426 1.0000000000000000e+00 427 427 2.0000000000000000e+00 428 428 5.0000000000000000e-01 428 514 -4.1666666666666664e-02 428 513 -4.1666666666666664e-02 428 511 -4.1666666666666664e-02 428 376 -1.2499999999999999e-01 429 429 5.0000000000000000e-01 429 376 -1.2499999999999999e-01 429 511 -4.1666666666666664e-02 430 430 1.0000000000000000e+00 431 431 5.0000000000000000e-01 431 376 -1.2499999999999999e-01 431 432 -4.1666666666666664e-02 432 432 7.4999999999999978e-01 432 448 -8.3333333333333329e-02 432 524 -4.1666666666666664e-02 432 497 -4.1666666666666664e-02 432 376 -8.3333333333333329e-02 432 435 -4.1666666666666664e-02 432 433 -8.3333333333333329e-02 432 517 -4.1666666666666671e-02 432 434 -4.1666666666666664e-02 432 490 -8.3333333333333329e-02 432 370 -2.0833333333333332e-02 432 431 -4.1666666666666664e-02 433 433 6.2500000000000000e-01 433 537 -8.3333333333333329e-02 433 370 -1.0416666666666666e-01 433 514 -8.3333333333333329e-02 433 435 -4.1666666666666664e-02 433 434 -4.1666666666666664e-02 433 376 4.1666666666666664e-02 433 432 -8.3333333333333329e-02 433 524 -8.3333333333333329e-02 433 133 -4.1666666666666664e-02 433 134 -4.1666666666666664e-02 433 11 4.1666666666666664e-02 434 434 5.0000000000000000e-01 434 514 -4.1666666666666664e-02 434 490 -4.1666666666666664e-02 434 495 -4.1666666666666664e-02 434 494 -4.1666666666666664e-02 434 376 -1.2499999999999999e-01 434 433 -4.1666666666666664e-02 434 432 -4.1666666666666664e-02 434 370 -1.2499999999999999e-01 435 435 5.0000000000000000e-01 435 433 -4.1666666666666664e-02 435 376 -1.2499999999999999e-01 435 432 -4.1666666666666664e-02 435 514 -4.1666666666666664e-02 436 436 1.0000000000000000e+00 437 437 1.0416666666666667e+00 437 384 2.0833333333333332e-02 437 517 -4.1666666666666664e-02 437 441 -4.1666666666666671e-02 437 456 -8.3333333333333329e-02 437 544 -2.5000000000000000e-01 437 451 -8.3333333333333329e-02 437 519 -4.1666666666666664e-02 437 518 -2.0833333333333331e-01 437 378 -8.3333333333333329e-02 437 442 -8.3333333333333329e-02 438 438 1.0000000000000000e+00 439 439 1.0000000000000000e+00 440 440 1.0000000000000000e+00 441 441 7.0833333333333315e-01 441 378 -2.0833333333333332e-02 441 555 -8.3333333333333329e-02 441 437 -4.1666666666666671e-02 441 544 -1.2500000000000000e-01 441 469 -1.6666666666666666e-01 441 442 -8.3333333333333329e-02 442 442 5.8333333333333326e-01 442 519 -8.3333333333333329e-02 442 475 -8.3333333333333329e-02 442 441 -8.3333333333333329e-02 442 437 -8.3333333333333329e-02 442 378 -1.2499999999999999e-01 443 443 1.0416666666666667e+00 443 384 2.0833333333333332e-02 443 524 -4.1666666666666664e-02 443 370 -6.2500000000000000e-02 443 537 -4.1666666666666664e-02 443 446 -4.1666666666666671e-02 443 383 -8.3333333333333329e-02 443 415 -4.1666666666666664e-02 443 467 -8.3333333333333329e-02 443 454 -2.5000000000000000e-01 443 457 -8.3333333333333329e-02 443 444 -8.3333333333333329e-02 443 532 -4.1666666666666664e-02 443 525 -2.0833333333333331e-01 443 382 -8.3333333333333329e-02 443 447 -8.3333333333333329e-02 443 14 8.3333333333333329e-02 444 444 5.8333333333333326e-01 444 516 -4.1666666666666664e-02 444 417 -4.1666666666666664e-02 444 372 4.1666666666666664e-02 444 370 -8.3333333333333329e-02 444 537 -8.3333333333333329e-02 444 383 -8.3333333333333329e-02 444 443 -8.3333333333333329e-02 444 415 -8.3333333333333329e-02 444 127 -4.1666666666666664e-02 444 134 -4.1666666666666664e-02 444 11 4.1666666666666664e-02 444 126 -8.3333333333333329e-02 445 445 5.8333333499999984e-01 445 420 -4.1666666666666664e-02 445 383 -1.4583333354166667e-01 445 516 -4.1666666666666664e-02 445 372 4.1666666666666664e-02 445 415 -8.3333333333333329e-02 445 446 -8.3333333333333329e-02 445 59 -4.1666666666666668e-10 445 144 -4.1666666666666668e-10 445 186 4.1666666666666668e-10 445 136 -4.1666667083333338e-02 445 124 -4.1666667083333338e-02 445 14 -1.4583333354166667e-01 446 446 7.0833333333333315e-01 446 382 -2.0833333333333332e-02 446 466 -8.3333333333333329e-02 446 443 -4.1666666666666671e-02 446 383 2.0833333333333332e-02 446 445 -8.3333333333333329e-02 446 468 -8.3333333333333329e-02 446 454 -1.2500000000000000e-01 446 447 -8.3333333333333329e-02 446 14 -4.1666666666666664e-02 446 135 -1.6666666666666666e-01 447 447 5.8333333333333326e-01 447 532 -8.3333333333333329e-02 447 478 -8.3333333333333329e-02 447 383 -1.2499999999999999e-01 447 446 -8.3333333333333329e-02 447 443 -8.3333333333333329e-02 447 382 -1.2499999999999999e-01 448 448 1.0000000000000004e+00 448 432 -8.3333333333333329e-02 448 370 4.1666666666666664e-02 448 524 -2.5000000000000000e-01 448 449 -1.6666666666666666e-01 448 517 -2.5000000000000000e-01 449 449 6.6666666666666652e-01 449 462 -8.3333333333333329e-02 449 451 -8.3333333333333329e-02 449 448 -1.6666666666666666e-01 449 549 -1.6666666666666666e-01 450 450 1.0000000000000000e+00 451 451 6.2500000000000000e-01 451 545 -8.3333333333333329e-02 451 449 -8.3333333333333329e-02 451 384 -1.4583333333333331e-01 451 437 -8.3333333333333329e-02 451 517 -8.3333333333333329e-02 452 452 1.0000000000000000e+00 453 453 1.0000000000000000e+00 454 454 1.0000000000000002e+00 454 382 2.0833333333333332e-02 454 415 -8.3333333333333329e-02 454 370 4.1666666666666664e-02 454 443 -2.5000000000000000e-01 454 465 -1.6666666666666666e-01 454 446 -1.2500000000000000e-01 454 458 -1.2499999999999999e-01 454 455 -2.4999999999999997e-01 454 378 2.0833333333333332e-02 454 14 -8.3333333333333329e-02 455 455 1.0416666666666670e+00 455 384 2.0833333333333332e-02 455 519 -4.1666666666666671e-02 455 371 -8.3333333333333329e-02 455 489 -4.1666666666666664e-02 455 518 -2.0833333333333331e-01 455 517 -4.1666666666666664e-02 455 370 -6.2500000000000000e-02 455 415 -4.1666666666666664e-02 455 456 -8.3333333333333329e-02 455 457 -8.3333333333333329e-02 455 416 -8.3333333333333329e-02 455 520 -8.3333333333333329e-02 455 458 -4.1666666666666664e-02 455 454 -2.4999999999999997e-01 455 378 -8.3333333333333329e-02 455 14 8.3333333333333329e-02 456 456 7.5000000000000000e-01 456 465 -8.3333333333333329e-02 456 539 -8.3333333333333329e-02 456 455 -8.3333333333333329e-02 456 384 -2.0833333333333331e-01 456 437 -8.3333333333333329e-02 456 378 -2.0833333333333331e-01 457 457 5.8333333333333326e-01 457 517 -8.3333333333333329e-02 457 384 -1.2499999999999999e-01 457 455 -8.3333333333333329e-02 457 443 -8.3333333333333329e-02 457 524 -8.3333333333333329e-02 457 370 -1.2499999999999999e-01 458 458 7.0833333333333326e-01 458 556 -8.3333333333333329e-02 458 419 -8.3333333333333329e-02 458 371 2.0833333333333332e-02 458 520 -8.3333333333333329e-02 458 468 -8.3333333333333329e-02 458 570 -1.6666666666666666e-01 458 455 -4.1666666666666664e-02 458 454 -1.2499999999999999e-01 458 378 -2.0833333333333332e-02 458 14 -4.1666666666666664e-02 459 459 1.0000000000000002e+00 459 561 -1.6666666666666666e-01 459 534 -1.2499999999999999e-01 459 527 -2.4999999999999997e-01 459 382 2.0833333333333332e-02 459 460 -1.6666666666666666e-01 460 460 6.6666666666666652e-01 460 541 -8.3333333333333329e-02 460 462 -8.3333333333333329e-02 460 549 -1.6666666666666666e-01 460 459 -1.6666666666666666e-01 461 461 1.0000000000000000e+00 462 462 6.2500000000000000e-01 462 524 -8.3333333333333329e-02 462 527 -8.3333333333333329e-02 462 449 -8.3333333333333329e-02 462 460 -8.3333333333333329e-02 462 384 -1.4583333333333331e-01 463 463 1.0000000000000000e+00 464 464 1.0000000000000000e+00 465 465 6.6666666666666652e-01 465 456 -8.3333333333333329e-02 465 467 -8.3333333333333329e-02 465 466 -8.3333333333333329e-02 465 538 -1.6666666666666666e-01 465 556 -8.3333333333333329e-02 465 454 -1.6666666666666666e-01 466 466 6.6666666666666652e-01 466 569 -8.3333333333333329e-02 466 446 -8.3333333333333329e-02 466 382 -1.6666666666666666e-01 466 602 -8.3333333333333329e-02 466 465 -8.3333333333333329e-02 466 389 -1.6666666666666666e-01 467 467 7.4999999999999978e-01 467 561 -8.3333333333333329e-02 467 527 -8.3333333333333329e-02 467 465 -8.3333333333333329e-02 467 384 -2.0833333333333334e-01 467 443 -8.3333333333333329e-02 467 382 -2.0833333333333334e-01 468 468 5.0000000166666658e-01 468 389 -1.2500000041666665e-01 468 458 -8.3333333333333329e-02 468 446 -8.3333333333333329e-02 468 763 -4.1666667083333331e-02 468 749 -4.1666667083333331e-02 468 14 -1.2500000041666665e-01 469 469 1.0000000000000007e+00 469 577 -1.6666666666666666e-01 469 475 -1.6666666666666666e-01 469 470 -1.6666666666666666e-01 469 441 -1.6666666666666666e-01 470 470 6.6666666666666652e-01 470 476 -8.3333333333333329e-02 470 472 -8.3333333333333329e-02 470 572 -1.6666666666666666e-01 470 555 -8.3333333333333329e-02 470 469 -1.6666666666666666e-01 471 471 1.0000000000000000e+00 472 472 6.6666666666666663e-01 472 390 -1.6666666666666666e-01 472 577 -8.3333333333333329e-02 472 470 -8.3333333333333329e-02 472 777 -8.3333333333333329e-02 472 685 -8.3333333333333329e-02 473 473 1.0000000000000000e+00 474 474 1.0000000000000000e+00 475 475 6.6666666666666652e-01 475 575 -8.3333333333333329e-02 475 476 -8.3333333333333329e-02 475 442 -8.3333333333333329e-02 475 573 -1.6666666666666666e-01 475 469 -1.6666666666666666e-01 476 476 6.6666666666666652e-01 476 587 -8.3333333333333329e-02 476 470 -8.3333333333333329e-02 476 571 -8.3333333333333329e-02 476 378 -1.6666666666666666e-01 476 475 -8.3333333333333329e-02 476 390 -1.6666666666666666e-01 477 477 1.0000000000000007e+00 477 593 -1.6666666666666666e-01 477 478 -1.6666666666666666e-01 477 532 -1.6666666666666666e-01 477 481 -2.4999999999999997e-01 477 174 2.0833333333333332e-02 477 287 -1.2500000000000000e-01 478 478 6.6666666666666663e-01 478 479 -8.3333333333333329e-02 478 592 -8.3333333333333329e-02 478 447 -8.3333333333333329e-02 478 477 -1.6666666666666666e-01 478 300 -8.3333333333333329e-02 478 135 -1.6666666666666666e-01 479 479 3.3333333666666654e-01 479 478 -8.3333333333333329e-02 479 383 -8.3333333750000002e-02 479 62 -4.1666666666666668e-10 479 74 -4.1666666666666668e-10 479 15 4.1666666666666668e-10 479 144 -4.1666666666666668e-10 479 143 -4.1666666666666668e-10 479 186 4.1666666666666668e-10 479 136 -4.1666667083333338e-02 479 287 -4.1666667083333331e-02 479 174 -8.3333333750000002e-02 479 145 -8.3333333333333335e-10 480 480 5.8333333499999995e-01 480 383 -1.4583333354166667e-01 480 537 -8.3333333333333329e-02 480 532 -8.3333333333333329e-02 480 287 -4.1666667083333331e-02 480 127 -4.1666666666666664e-02 480 44 -4.1666666666666664e-02 480 11 4.1666666666666664e-02 480 63 -4.1666666666666668e-10 480 62 -4.1666666666666668e-10 480 15 4.1666666666666668e-10 480 39 -4.1666667083333331e-02 481 481 1.0416666666666665e+00 481 477 -2.4999999999999997e-01 481 307 -8.3333333333333329e-02 481 21 2.0833333333333332e-02 481 300 -8.3333333333333329e-02 481 287 -4.1666666666666664e-02 481 282 -4.1666666666666664e-02 481 280 -2.0833333333333331e-01 481 174 -6.2500000000000000e-02 481 279 -4.1666666666666664e-02 481 283 -8.3333333333333329e-02 482 482 2.0000000000000000e+00 483 483 6.6666666666666674e-01 483 502 -4.1666666666666664e-02 483 423 -4.1666666666666664e-02 483 369 -8.3333333333333329e-02 483 411 -4.1666666666666664e-02 483 394 -8.3333333333333329e-02 483 486 -4.1666666666666664e-02 483 485 -4.1666666666666664e-02 483 505 -8.3333333333333329e-02 483 412 -4.1666666666666664e-02 483 501 -8.3333333333333329e-02 483 488 -4.1666666666666664e-02 483 484 -8.3333333333333329e-02 483 393 4.1666666666666664e-02 483 487 -4.1666666666666664e-02 483 7 4.1666666666666664e-02 484 484 6.6666666666666652e-01 484 485 -4.1666666666666664e-02 484 486 -4.1666666666666664e-02 484 394 4.1666666666666664e-02 484 511 -8.3333333333333329e-02 484 393 -8.3333333333333329e-02 484 496 -4.1666666666666664e-02 484 510 -4.1666666666666664e-02 484 376 4.1666666666666664e-02 484 488 -4.1666666666666664e-02 484 411 -4.1666666666666664e-02 484 369 4.1666666666666664e-02 484 494 -8.3333333333333329e-02 484 483 -8.3333333333333329e-02 484 50 -4.1666666666666664e-02 484 102 -4.1666666666666664e-02 484 13 4.1666666666666664e-02 484 99 -8.3333333333333329e-02 485 485 5.0000000000000000e-01 485 505 -4.1666666666666664e-02 485 484 -4.1666666666666664e-02 485 394 -1.2500000000000000e-01 485 393 -1.2500000000000000e-01 485 483 -4.1666666666666664e-02 485 89 -4.1666666666666664e-02 485 99 -4.1666666666666664e-02 485 93 -4.1666666666666664e-02 486 486 5.0000000000000000e-01 486 484 -4.1666666666666664e-02 486 394 -1.2500000000000000e-01 486 483 -4.1666666666666664e-02 486 99 -4.1666666666666664e-02 487 487 5.0000000000000000e-01 487 394 -1.2500000000000000e-01 487 501 -4.1666666666666664e-02 487 483 -4.1666666666666664e-02 487 116 -4.1666666666666664e-02 488 488 5.0000000000000000e-01 488 505 -4.1666666666666664e-02 488 495 -4.1666666666666664e-02 488 484 -4.1666666666666664e-02 488 369 -1.2499999999999999e-01 488 499 -4.1666666666666664e-02 488 494 -4.1666666666666664e-02 488 483 -4.1666666666666664e-02 488 393 -1.2499999999999999e-01 489 489 7.0833333333333304e-01 489 455 -4.1666666666666664e-02 489 424 -4.1666666666666664e-02 489 425 -8.3333333333333329e-02 489 371 4.1666666666666664e-02 489 369 -8.3333333333333329e-02 489 492 -4.1666666666666664e-02 489 490 -8.3333333333333329e-02 489 518 -1.2499999999999999e-01 489 491 -4.1666666666666664e-02 489 416 -8.3333333333333329e-02 489 414 -4.1666666666666664e-02 490 490 6.2499999999999989e-01 490 517 -8.3333333333333329e-02 490 497 -4.1666666666666664e-02 490 434 -4.1666666666666664e-02 490 376 4.1666666666666664e-02 490 492 -4.1666666666666664e-02 490 491 -4.1666666666666664e-02 490 369 4.1666666666666664e-02 490 489 -8.3333333333333329e-02 490 432 -8.3333333333333329e-02 490 370 -1.0416666666666666e-01 490 494 -8.3333333333333329e-02 491 491 5.0000000000000000e-01 491 416 -4.1666666666666664e-02 491 499 -4.1666666666666664e-02 491 495 -4.1666666666666664e-02 491 494 -4.1666666666666664e-02 491 369 -1.2499999999999999e-01 491 490 -4.1666666666666664e-02 491 489 -4.1666666666666664e-02 491 370 -1.2499999999999999e-01 492 492 5.0000000000000000e-01 492 490 -4.1666666666666664e-02 492 369 -1.2499999999999999e-01 492 489 -4.1666666666666664e-02 492 494 -4.1666666666666664e-02 493 493 1.0000000000000000e+00 494 494 6.6666666666666674e-01 494 510 -4.1666666666666664e-02 494 411 -4.1666666666666664e-02 494 369 -8.3333333333333329e-02 494 491 -4.1666666666666664e-02 494 376 -8.3333333333333329e-02 494 434 -4.1666666666666664e-02 494 370 4.1666666666666664e-02 494 496 -4.1666666666666664e-02 494 484 -8.3333333333333329e-02 494 492 -4.1666666666666664e-02 494 488 -4.1666666666666664e-02 494 495 -8.3333333333333329e-02 494 393 4.1666666666666664e-02 494 497 -4.1666666666666664e-02 494 490 -8.3333333333333329e-02 495 495 6.6666666666666652e-01 495 514 -8.3333333333333329e-02 495 417 -4.1666666666666664e-02 495 500 -4.1666666666666664e-02 495 372 4.1666666666666664e-02 495 370 -8.3333333333333329e-02 495 393 -8.3333333333333329e-02 495 488 -4.1666666666666664e-02 495 491 -4.1666666666666664e-02 495 369 4.1666666666666664e-02 495 434 -4.1666666666666664e-02 495 496 -4.1666666666666664e-02 495 376 4.1666666666666664e-02 495 499 -8.3333333333333329e-02 495 494 -8.3333333333333329e-02 495 123 -4.1666666666666664e-02 495 134 -4.1666666666666664e-02 495 11 4.1666666666666664e-02 495 126 -8.3333333333333329e-02 496 496 5.0000000000000000e-01 496 513 -4.1666666666666664e-02 496 484 -4.1666666666666664e-02 496 376 -1.2499999999999999e-01 496 495 -4.1666666666666664e-02 496 514 -4.1666666666666664e-02 496 511 -4.1666666666666664e-02 496 494 -4.1666666666666664e-02 496 393 -1.2499999999999999e-01 497 497 5.0000000000000000e-01 497 432 -4.1666666666666664e-02 497 490 -4.1666666666666664e-02 497 376 -1.2499999999999999e-01 497 494 -4.1666666666666664e-02 498 498 1.0000000000000000e+00 499 499 6.6666666666666674e-01 499 423 -4.1666666666666664e-02 499 506 -4.1666666666666664e-02 499 372 -8.3333333333333329e-02 499 417 -4.1666666666666664e-02 499 369 -8.3333333333333329e-02 499 491 -4.1666666666666664e-02 499 370 4.1666666666666664e-02 499 488 -4.1666666666666664e-02 499 505 -8.3333333333333329e-02 499 418 -4.1666666666666664e-02 499 422 -8.3333333333333329e-02 499 500 -4.1666666666666664e-02 499 495 -8.3333333333333329e-02 499 393 4.1666666666666664e-02 499 424 -4.1666666666666664e-02 499 416 -8.3333333333333329e-02 499 371 4.1666666666666664e-02 499 7 4.1666666666666664e-02 500 500 5.0000000000000000e-01 500 495 -4.1666666666666664e-02 500 505 -4.1666666666666664e-02 500 372 -1.2500000000000000e-01 500 393 -1.2500000000000000e-01 500 499 -4.1666666666666664e-02 500 121 -4.1666666666666664e-02 500 126 -4.1666666666666664e-02 500 118 -4.1666666666666664e-02 501 501 3.3333333583333330e-01 501 412 -4.1666666666666664e-02 501 423 -4.1666666666666664e-02 501 369 4.1666666666666664e-02 501 487 -4.1666666666666664e-02 501 502 -4.1666666666666664e-02 501 394 4.1666666666666664e-02 501 611 -8.3333333333333335e-10 501 421 -4.1666667083333338e-02 501 483 -8.3333333333333329e-02 501 116 -4.1666667083333331e-02 501 7 -4.1666667083333331e-02 502 502 4.9999999999999994e-01 502 505 -4.1666666666666664e-02 502 394 -1.2500000000000000e-01 502 483 -4.1666666666666664e-02 502 501 -4.1666666666666664e-02 502 34 -4.1666666666666664e-02 502 93 -4.1666666666666664e-02 502 116 -4.1666666666666664e-02 502 7 -1.2500000000000000e-01 503 503 2.0000000000000000e+00 504 504 5.0000000000000000e-01 504 394 -1.2499999999999999e-01 504 116 -4.1666666666666664e-02 505 505 6.6666666666666652e-01 505 500 -4.1666666666666664e-02 505 506 -4.1666666666666664e-02 505 372 4.1666666666666664e-02 505 502 -4.1666666666666664e-02 505 485 -4.1666666666666664e-02 505 394 4.1666666666666664e-02 505 393 -8.3333333333333329e-02 505 423 -4.1666666666666664e-02 505 488 -4.1666666666666664e-02 505 369 4.1666666666666664e-02 505 499 -8.3333333333333329e-02 505 483 -8.3333333333333329e-02 505 92 -4.1666666666666664e-02 505 35 -4.1666666666666664e-02 505 8 4.1666666666666664e-02 505 7 -8.3333333333333329e-02 505 118 -8.3333333333333329e-02 505 93 -8.3333333333333329e-02 506 506 4.9999999999999994e-01 506 505 -4.1666666666666664e-02 506 507 -4.1666666666666664e-02 506 372 -1.2500000000000000e-01 506 422 -4.1666666666666664e-02 506 499 -4.1666666666666664e-02 506 118 -4.1666666666666664e-02 506 7 -1.2500000000000000e-01 506 81 -4.1666666666666664e-02 507 507 3.3333333666666670e-01 507 506 -4.1666666666666664e-02 507 372 -8.3333333333333329e-02 507 420 -4.1666666666666664e-02 507 418 -4.1666666666666664e-02 507 371 2.0833333333333332e-02 507 419 -4.1666667083333331e-02 507 422 -4.1666667083333338e-02 507 152 -1.6666666666666667e-09 507 7 2.0833333333333332e-02 507 117 -4.1666666666666664e-02 507 81 -4.1666667083333338e-02 507 180 2.0833333333333332e-02 507 263 -4.1666667083333338e-02 507 14 2.0833333333333332e-02 508 508 1.0000000000000000e+00 509 509 1.0000000000000000e+00 510 510 5.0000000000000000e-01 510 511 -4.1666666666666664e-02 510 484 -4.1666666666666664e-02 510 494 -4.1666666666666664e-02 510 376 -1.2499999999999999e-01 511 511 6.6666666666666652e-01 511 513 -8.3333333333333329e-02 511 484 -8.3333333333333329e-02 511 393 4.1666666666666664e-02 511 428 -4.1666666666666664e-02 511 376 -8.3333333333333329e-02 511 510 -4.1666666666666664e-02 511 496 -4.1666666666666664e-02 511 429 -4.1666666666666664e-02 511 130 -4.1666666666666664e-02 511 13 -8.3333333333333329e-02 511 50 -4.1666666666666664e-02 511 51 -4.1666666666666664e-02 511 102 -4.1666666666666664e-02 512 512 2.0000000000000000e+00 513 513 6.6666666666666641e-01 513 511 -8.3333333333333329e-02 513 514 -8.3333333333333329e-02 513 393 -8.3333333333333329e-02 513 496 -4.1666666666666664e-02 513 428 -4.1666666666666664e-02 513 376 4.1666666666666664e-02 513 123 -4.1666666666666664e-02 513 132 -4.1666666666666664e-02 513 11 4.1666666666666664e-02 513 102 -4.1666666666666664e-02 513 130 -4.1666666666666664e-02 513 13 4.1666666666666664e-02 513 56 -4.1666666666666664e-02 513 90 -4.1666666666666664e-02 513 6 4.1666666666666664e-02 513 122 -8.3333333333333329e-02 513 103 -8.3333333333333329e-02 514 514 6.6666666666666652e-01 514 495 -8.3333333333333329e-02 514 370 4.1666666666666664e-02 514 433 -8.3333333333333329e-02 514 513 -8.3333333333333329e-02 514 393 4.1666666666666664e-02 514 434 -4.1666666666666664e-02 514 376 -8.3333333333333329e-02 514 428 -4.1666666666666664e-02 514 496 -4.1666666666666664e-02 514 435 -4.1666666666666664e-02 514 134 -4.1666666666666664e-02 514 11 -8.3333333333333329e-02 514 132 -4.1666666666666664e-02 514 133 -4.1666666666666664e-02 514 123 -4.1666666666666664e-02 515 515 2.0000000000000000e+00 516 516 5.0000000000000000e-01 516 444 -4.1666666666666664e-02 516 445 -4.1666666666666664e-02 516 372 -1.2500000000000000e-01 516 383 -1.2500000000000000e-01 516 415 -4.1666666666666664e-02 516 60 -4.1666666666666664e-02 516 124 -4.1666666666666664e-02 516 126 -4.1666666666666664e-02 517 517 9.9999999999999978e-01 517 457 -8.3333333333333329e-02 517 384 -4.1666666666666664e-02 517 437 -4.1666666666666664e-02 517 370 -4.1666666666666664e-02 517 490 -8.3333333333333329e-02 517 455 -4.1666666666666664e-02 517 378 8.3333333333333329e-02 517 448 -2.5000000000000000e-01 517 451 -8.3333333333333329e-02 517 518 -2.4999999999999997e-01 517 432 -4.1666666666666671e-02 518 518 1.0000000000000002e+00 518 455 -2.0833333333333331e-01 518 370 4.1666666666666664e-02 518 517 -2.4999999999999997e-01 518 519 -8.3333333333333329e-02 518 437 -2.0833333333333331e-01 518 489 -1.2499999999999999e-01 519 519 7.4999999999999978e-01 519 442 -8.3333333333333329e-02 519 455 -4.1666666666666671e-02 519 371 2.0833333333333332e-02 519 425 -8.3333333333333329e-02 519 573 -1.6666666666666666e-01 519 437 -4.1666666666666664e-02 519 518 -8.3333333333333329e-02 519 378 -4.1666666666666664e-02 519 520 -8.3333333333333329e-02 520 520 5.8333333333333326e-01 520 458 -8.3333333333333329e-02 520 587 -8.3333333333333329e-02 520 371 -1.2499999999999999e-01 520 519 -8.3333333333333329e-02 520 455 -8.3333333333333329e-02 520 378 -1.2499999999999999e-01 521 521 1.0000000000000000e+00 522 522 1.0000000000000000e+00 523 523 1.0000000000000000e+00 524 524 9.9999999999999978e-01 524 462 -8.3333333333333329e-02 524 384 -4.1666666666666664e-02 524 443 -4.1666666666666664e-02 524 370 -4.1666666666666664e-02 524 432 -4.1666666666666664e-02 524 527 -4.1666666666666664e-02 524 382 8.3333333333333329e-02 524 448 -2.5000000000000000e-01 524 457 -8.3333333333333329e-02 524 433 -8.3333333333333329e-02 524 525 -2.4999999999999997e-01 525 525 1.0000000000000002e+00 525 370 4.1666666666666664e-02 525 537 -1.2500000000000000e-01 525 527 -2.0833333333333331e-01 525 524 -2.4999999999999997e-01 525 532 -8.3333333333333329e-02 525 443 -2.0833333333333331e-01 526 526 1.0000000000000000e+00 527 527 1.0416666666666663e+00 527 384 2.0833333333333332e-02 527 467 -8.3333333333333329e-02 527 462 -8.3333333333333329e-02 527 532 -4.1666666666666671e-02 527 525 -2.0833333333333331e-01 527 524 -4.1666666666666664e-02 527 534 -4.1666666666666664e-02 527 459 -2.4999999999999997e-01 527 382 -8.3333333333333329e-02 527 533 -8.3333333333333329e-02 528 528 1.0000000000000000e+00 529 529 1.0000000000000000e+00 530 530 1.0000000000000000e+00 531 531 1.0000000000000000e+00 532 532 7.4999999999999978e-01 532 480 -8.3333333333333329e-02 532 383 2.0833333333333332e-02 532 447 -8.3333333333333329e-02 532 527 -4.1666666666666671e-02 532 477 -1.6666666666666666e-01 532 443 -4.1666666666666664e-02 532 525 -8.3333333333333329e-02 532 382 -4.1666666666666664e-02 532 533 -8.3333333333333329e-02 533 533 5.8333333333333326e-01 533 534 -8.3333333333333329e-02 533 593 -8.3333333333333329e-02 533 532 -8.3333333333333329e-02 533 527 -8.3333333333333329e-02 533 382 -1.2499999999999999e-01 534 534 7.0833333333333326e-01 534 568 -8.3333333333333329e-02 534 533 -8.3333333333333329e-02 534 594 -1.6666666666666666e-01 534 527 -4.1666666666666664e-02 534 459 -1.2499999999999999e-01 534 382 -2.0833333333333332e-02 535 535 1.0000000000000000e+00 536 536 2.0000000000000000e+00 537 537 7.0833333333333326e-01 537 444 -8.3333333333333329e-02 537 383 4.1666666666666664e-02 537 433 -8.3333333333333329e-02 537 370 0.0000000000000000e+00 537 480 -8.3333333333333329e-02 537 443 -4.1666666666666664e-02 537 525 -1.2500000000000000e-01 537 133 -4.1666666666666664e-02 537 11 -8.3333333333333329e-02 537 127 -4.1666666666666664e-02 537 134 -4.1666666666666664e-02 537 44 -4.1666666666666664e-02 538 538 1.0000000000000007e+00 538 465 -1.6666666666666666e-01 538 569 -1.6666666666666666e-01 538 561 -1.6666666666666666e-01 538 539 -1.6666666666666666e-01 538 557 -1.6666666666666666e-01 539 539 6.6666666666666652e-01 539 456 -8.3333333333333329e-02 539 541 -8.3333333333333329e-02 539 555 -8.3333333333333329e-02 539 538 -1.6666666666666666e-01 539 544 -1.6666666666666666e-01 540 540 1.0000000000000000e+00 541 541 6.6666666666666652e-01 541 561 -8.3333333333333329e-02 541 460 -8.3333333333333329e-02 541 545 -8.3333333333333329e-02 541 539 -8.3333333333333329e-02 541 384 -1.6666666666666666e-01 542 542 1.0000000000000000e+00 543 543 1.0000000000000000e+00 544 544 1.0000000000000002e+00 544 378 2.0833333333333332e-02 544 437 -2.5000000000000000e-01 544 441 -1.2500000000000000e-01 544 545 -1.6666666666666666e-01 544 539 -1.6666666666666666e-01 545 545 6.6666666666666652e-01 545 451 -8.3333333333333329e-02 545 541 -8.3333333333333329e-02 545 544 -1.6666666666666666e-01 545 549 -1.6666666666666666e-01 546 546 1.0000000000000000e+00 547 547 1.0000000000000000e+00 548 548 1.0000000000000000e+00 549 549 1.0000000000000007e+00 549 460 -1.6666666666666666e-01 549 449 -1.6666666666666666e-01 549 545 -1.6666666666666666e-01 550 550 1.0000000000000000e+00 551 551 1.0000000000000000e+00 552 552 1.0000000000000000e+00 553 553 1.0000000000000000e+00 554 554 1.0000000000000000e+00 555 555 6.6666666666666652e-01 555 557 -8.3333333333333329e-02 555 441 -8.3333333333333329e-02 555 378 -1.6666666666666666e-01 555 470 -8.3333333333333329e-02 555 539 -8.3333333333333329e-02 556 556 6.6666666666666652e-01 556 458 -8.3333333333333329e-02 556 557 -8.3333333333333329e-02 556 378 -1.6666666666666666e-01 556 571 -8.3333333333333329e-02 556 465 -8.3333333333333329e-02 556 389 -1.6666666666666666e-01 557 557 6.6666666666666652e-01 557 555 -8.3333333333333329e-02 557 556 -8.3333333333333329e-02 557 572 -1.6666666666666666e-01 557 558 -8.3333333333333329e-02 557 538 -1.6666666666666666e-01 558 558 5.0000000166666658e-01 558 389 -1.2500000041666665e-01 558 569 -8.3333333333333329e-02 558 557 -8.3333333333333329e-02 558 681 -4.1666667083333338e-02 558 678 -4.1666667083333331e-02 559 559 1.0000000000000000e+00 560 560 1.0000000000000000e+00 561 561 6.6666666666666652e-01 561 467 -8.3333333333333329e-02 561 541 -8.3333333333333329e-02 561 568 -8.3333333333333329e-02 561 459 -1.6666666666666666e-01 561 538 -1.6666666666666666e-01 562 562 1.0000000000000000e+00 563 563 1.0000000000000000e+00 564 564 1.0000000000000000e+00 565 565 1.0000000000000000e+00 566 566 1.0000000000000000e+00 567 567 1.0000000000000000e+00 568 568 6.6666666666666652e-01 568 534 -8.3333333333333329e-02 568 569 -8.3333333333333329e-02 568 382 -1.6666666666666666e-01 568 600 -8.3333333333333329e-02 568 561 -8.3333333333333329e-02 569 569 6.6666666666666652e-01 569 466 -8.3333333333333329e-02 569 568 -8.3333333333333329e-02 569 558 -8.3333333333333329e-02 569 601 -1.6666666666666666e-01 569 538 -1.6666666666666666e-01 570 570 9.9999999999999956e-01 570 590 -1.6666666666666666e-01 570 571 -1.6666666666666666e-01 570 587 -1.6666666666666666e-01 570 458 -1.6666666666666666e-01 570 765 -1.6666666666666666e-01 570 749 -1.6666666666666666e-01 571 571 6.6666666666666663e-01 571 572 -1.6666666666666666e-01 571 570 -1.6666666666666666e-01 571 476 -8.3333333333333329e-02 571 556 -8.3333333333333329e-02 571 680 -8.3333333333333329e-02 571 679 -8.3333333333333329e-02 572 572 9.9999999999999956e-01 572 571 -1.6666666666666666e-01 572 470 -1.6666666666666666e-01 572 557 -1.6666666666666666e-01 572 777 -1.6666666666666666e-01 572 681 -1.6666666666666666e-01 573 573 1.0000000000000000e+00 573 591 -1.2500000000000000e-01 573 405 2.0833333333333332e-02 573 475 -1.6666666666666666e-01 573 519 -1.6666666666666666e-01 573 587 -1.6666666666666666e-01 573 726 -2.5000000000000000e-01 574 574 1.0000000000000000e+00 575 575 7.5000000000000000e-01 575 390 -2.0833333333333331e-01 575 577 -8.3333333333333329e-02 575 475 -8.3333333333333329e-02 575 682 -8.3333333333333329e-02 575 726 -8.3333333333333329e-02 576 576 2.0000000000000000e+00 577 577 6.6666666666666652e-01 577 472 -8.3333333333333329e-02 577 575 -8.3333333333333329e-02 577 469 -1.6666666666666666e-01 577 581 -1.6666666666666666e-01 578 578 1.0000000000000000e+00 579 579 1.0000000000000000e+00 580 580 1.0000000000000000e+00 581 581 1.0000000000000000e+00 581 577 -1.6666666666666666e-01 581 685 -1.6666666666666666e-01 581 682 -2.4999999999999997e-01 582 582 2.0000000000000000e+00 583 583 1.0000000000000000e+00 584 584 1.0000000000000000e+00 585 585 2.0000000000000000e+00 586 586 2.0000000000000000e+00 587 587 6.6666666666666652e-01 587 476 -8.3333333333333329e-02 587 589 -8.3333333333333329e-02 587 520 -8.3333333333333329e-02 587 570 -1.6666666666666666e-01 587 588 -8.3333333333333329e-02 587 573 -1.6666666666666666e-01 588 588 3.3333333666666665e-01 588 591 -4.1666667083333331e-02 588 371 -8.3333334166666662e-02 588 608 -8.3333333333333335e-10 588 405 -8.3333334166666675e-02 588 590 -4.1666667083333338e-02 588 587 -8.3333333333333329e-02 589 589 6.2500000000000000e-01 589 390 -1.4583333333333331e-01 589 405 -1.4583333333333331e-01 589 587 -8.3333333333333329e-02 589 765 -8.3333333333333329e-02 589 726 -8.3333333333333329e-02 589 767 -8.3333333333333329e-02 590 590 3.3333333666666665e-01 590 570 -1.6666666666666666e-01 590 588 -4.1666667083333338e-02 590 419 -4.1666667083333338e-02 590 779 -4.1666667083333338e-02 590 668 -4.1666667083333331e-02 590 152 -1.6666666666666667e-09 591 591 3.7500000333333333e-01 591 588 -4.1666667083333331e-02 591 573 -1.2500000000000000e-01 591 405 -2.0833333333333332e-02 591 425 -4.1666667083333331e-02 591 609 -1.6666666666666667e-09 591 727 -4.1666667083333338e-02 591 726 -4.1666666666666664e-02 592 592 6.6666666666666652e-01 592 602 -8.3333333333333329e-02 592 600 -8.3333333333333329e-02 592 593 -8.3333333333333329e-02 592 382 -1.6666666666666666e-01 592 478 -8.3333333333333329e-02 592 21 -1.6666666666666666e-01 593 593 6.6666666666666652e-01 593 592 -8.3333333333333329e-02 593 477 -1.6666666666666666e-01 593 533 -8.3333333333333329e-02 593 594 -1.6666666666666666e-01 593 307 -8.3333333333333329e-02 594 594 1.0000000000000007e+00 594 600 -1.6666666666666666e-01 594 534 -1.6666666666666666e-01 594 599 -1.6666666666666666e-01 594 593 -1.6666666666666666e-01 595 595 1.0000000000000000e+00 596 596 1.0000000000000000e+00 597 597 1.0000000000000000e+00 598 598 2.0000000000000000e+00 599 599 6.6666666666666663e-01 599 604 -8.3333333333333329e-02 599 594 -1.6666666666666666e-01 599 307 -8.3333333333333329e-02 599 780 -1.6666666666666666e-01 600 600 6.6666666666666652e-01 600 604 -8.3333333333333329e-02 600 592 -8.3333333333333329e-02 600 594 -1.6666666666666666e-01 600 568 -8.3333333333333329e-02 600 601 -1.6666666666666666e-01 601 601 9.9999999999999956e-01 601 602 -1.6666666666666666e-01 601 600 -1.6666666666666666e-01 601 569 -1.6666666666666666e-01 601 695 -1.6666666666666666e-01 601 678 -1.6666666666666666e-01 602 602 6.6666666666666663e-01 602 601 -1.6666666666666666e-01 602 592 -8.3333333333333329e-02 602 466 -8.3333333333333329e-02 602 691 -8.3333333333333329e-02 602 135 -1.6666666666666666e-01 602 676 -8.3333333333333329e-02 603 603 1.0000000000000000e+00 604 604 6.6666666666666663e-01 604 599 -8.3333333333333329e-02 604 600 -8.3333333333333329e-02 604 789 -8.3333333333333329e-02 604 695 -8.3333333333333329e-02 604 21 -1.6666666666666666e-01 605 605 2.0000000000000000e+00 606 606 1.0000000000000000e+00 607 607 2.0000000000000000e+00 608 608 6.6666666666666685e-09 608 588 -8.3333333333333335e-10 608 610 -8.3333333333333335e-10 608 609 -1.6666666666666667e-09 608 422 -8.3333333333333335e-10 608 82 -8.3333333333333335e-10 608 152 -1.6666666666666667e-09 609 609 1.0000000000000004e-08 609 608 -1.6666666666666667e-09 609 591 -1.6666666666666667e-09 609 421 -1.2500000000000000e-09 609 611 -2.5000000000000001e-09 609 799 -1.6666666666666667e-09 609 7 2.0833333333333334e-10 610 610 6.6666666666666693e-09 610 608 -8.3333333333333335e-10 610 405 -1.6666666666666667e-09 610 807 -8.3333333333333335e-10 610 799 -8.3333333333333335e-10 610 705 -8.3333333333333335e-10 610 19 -1.6666666666666667e-09 611 611 1.0416666666666672e-08 611 609 -2.5000000000000001e-09 611 421 -4.1666666666666668e-10 611 501 -8.3333333333333335e-10 611 19 2.0833333333333334e-10 611 825 -2.0833333333333334e-09 611 824 -4.1666666666666668e-10 611 82 -8.3333333333333335e-10 611 725 -8.3333333333333335e-10 611 7 -8.3333333333333335e-10 611 116 -4.1666666666666668e-10 612 612 2.0000000000000000e+00 613 613 1.0000000000000000e+00 614 614 2.0000000000000000e+00 hypre-2.33.0/src/test/TEST_ams/mfem.Abeta.00003000066400000000000000000000660041477326011500204520ustar00rootroot00000000000000615 857 615 857 615 615 1.0000000000000000e+00 616 616 1.0000000000000007e-08 616 666 -1.6666666666666667e-09 616 746 -1.6666666666666667e-09 616 732 -1.6666666666666667e-09 616 717 -1.6666666666666667e-09 616 677 -1.6666666666666667e-09 616 660 -1.6666666666666667e-09 617 617 1.0000000000000000e+00 618 618 1.0000000000000000e+00 619 619 1.0833333333333341e-08 619 750 -2.0833333333333334e-10 619 665 -1.2500000000000000e-09 619 666 -1.6666666666666667e-09 619 812 -6.2500000000000001e-10 619 761 -1.2500000000000000e-09 619 667 -4.1666666666666668e-10 619 358 4.1666666666666668e-10 619 299 8.3333333333333335e-10 619 249 -4.1666666666666668e-10 619 269 4.1666666666666668e-10 619 278 -4.1666666666666668e-10 619 255 -4.1666666666666668e-10 619 246 -8.3333333333333335e-10 619 254 -1.4583333333333334e-09 619 202 -1.8750000000000002e-09 619 250 -1.2500000000000000e-09 619 206 -8.3333333333333335e-10 619 200 4.1666666666666668e-10 620 620 2.5000000750000023e-01 620 808 -1.2500000000000000e-09 620 810 2.0833333333333334e-10 620 748 -4.1666668333333337e-02 620 812 -8.3333333333333335e-10 620 750 2.0833333333333334e-10 620 665 -1.2500000000000000e-09 620 667 2.0833333333333334e-10 620 811 2.0833333333333334e-10 620 668 -4.1666668333333337e-02 620 779 -8.3333334166666662e-02 620 745 -8.3333334166666662e-02 621 621 2.0000000000000000e+00 622 622 2.0000000000000000e+00 623 623 5.0000000500000008e-01 623 787 -8.3333334166666675e-02 623 785 -8.3333334166666675e-02 623 691 -1.6666666666666666e-01 623 690 -8.3333334166666675e-02 623 677 -1.6666666666666667e-09 623 676 -8.3333334166666662e-02 624 624 5.0000000499999997e-01 624 753 -8.3333334166666662e-02 624 751 -8.3333334166666662e-02 624 746 -1.6666666666666667e-09 624 745 -8.3333334166666662e-02 624 680 -1.6666666666666666e-01 624 679 -8.3333334166666675e-02 625 625 1.0000000000000000e+00 626 626 1.0000000000000000e+00 627 627 2.0000000000000000e+00 628 628 2.5000000750000007e-01 628 760 -4.1666668125000000e-02 628 667 2.0833333333333334e-10 628 761 -1.2500000000000000e-09 628 693 -4.1666668125000000e-02 628 690 -8.3333334166666662e-02 628 136 2.0833333333333334e-10 628 334 -8.3333333333333335e-10 628 208 4.1666666666666668e-10 628 335 -1.2500000000000000e-09 628 232 -8.3333333750000002e-02 628 333 4.1666666666666668e-10 628 255 2.0833333333333334e-10 628 206 -8.3333333333333335e-10 628 330 4.1666666666666668e-10 628 231 2.0833333333333334e-10 628 234 -1.2500000000000000e-09 629 629 1.0000000000000000e+00 630 630 1.0000000000000000e+00 631 631 2.0000000000000000e+00 632 632 1.0000000000000000e+00 633 633 1.0000000000000000e+00 634 634 1.0000000000000000e+00 635 635 1.0000000000000000e+00 636 636 2.0000000000000000e+00 637 637 1.0000000000000000e+00 638 638 1.0000000000000000e+00 639 639 1.0000000000000000e+00 640 640 1.0000000000000000e+00 641 641 1.0000000000000000e+00 642 642 1.0000000000000000e+00 643 643 1.0000000000000000e+00 644 644 2.0000000000000000e+00 645 645 1.0000000000000000e+00 646 646 2.0000000000000000e+00 647 647 1.0000000000000000e+00 648 648 2.0000000000000000e+00 649 649 1.0833333333333341e-08 649 809 -1.6666666666666667e-09 649 810 -4.1666666666666668e-10 649 808 -1.2500000000000000e-09 649 811 -2.0833333333333334e-10 649 812 -8.3333333333333335e-10 649 260 -1.6666666666666667e-09 649 242 -2.0833333333333334e-10 649 256 2.0833333333333334e-10 649 278 8.3333333333333335e-10 649 257 -1.6666666666666667e-09 649 243 -8.3333333333333335e-10 649 201 -2.0833333333333334e-09 649 241 -1.2500000000000000e-09 649 200 2.0833333333333334e-10 650 650 1.0000000000000000e+00 651 651 1.0000000000000000e+00 652 652 1.0000000000000000e+00 653 653 3.0000000000000000e+00 654 654 1.0000000000000000e+00 655 655 2.0000000000000000e+00 656 656 1.0000000000000000e+00 657 657 1.0000000000000008e-08 657 752 -1.6666666666666667e-09 657 735 -1.6666666666666667e-09 657 754 -1.6666666666666667e-09 657 658 -1.6666666666666667e-09 658 658 6.6666666666666701e-09 658 732 -8.3333333333333335e-10 658 660 -8.3333333333333335e-10 658 730 -1.6666666666666667e-09 658 657 -1.6666666666666667e-09 659 659 1.0000000000000000e+00 660 660 6.6666666666666701e-09 660 752 -8.3333333333333335e-10 660 715 -8.3333333333333335e-10 660 670 -8.3333333333333335e-10 660 658 -8.3333333333333335e-10 660 616 -1.6666666666666667e-09 661 661 1.0000000000000000e+00 662 662 1.0000000000000000e+00 663 663 1.0000000000000008e-08 663 675 -1.6666666666666667e-09 663 763 -1.6666666666666667e-09 663 762 -1.6666666666666667e-09 663 664 -1.6666666666666667e-09 663 749 -1.6666666666666667e-09 663 667 -1.6666666666666667e-09 664 664 6.6666666666666701e-09 664 746 -8.3333333333333335e-10 664 666 -8.3333333333333335e-10 664 665 -8.3333333333333335e-10 664 744 -1.6666666666666667e-09 664 745 -8.3333333333333335e-10 664 663 -1.6666666666666667e-09 665 665 5.8333333333333343e-09 665 619 -1.2500000000000000e-09 665 812 -8.3333333333333335e-10 665 620 -1.2500000000000000e-09 665 750 -8.3333333333333335e-10 665 667 -8.3333333333333335e-10 665 664 -8.3333333333333335e-10 666 666 6.6666666666666676e-09 666 762 -8.3333333333333335e-10 666 842 -8.3333333333333335e-10 666 619 -1.6666666666666667e-09 666 670 -8.3333333333333335e-10 666 616 -1.6666666666666667e-09 666 664 -8.3333333333333335e-10 667 667 7.5000000000000010e-09 667 760 -8.3333333333333335e-10 667 628 2.0833333333333334e-10 667 761 -8.3333333333333335e-10 667 619 -4.1666666666666668e-10 667 812 -4.1666666666666668e-10 667 620 2.0833333333333334e-10 667 665 -8.3333333333333335e-10 667 668 -8.3333333333333335e-10 667 663 -1.6666666666666667e-09 667 14 -8.3333333333333335e-10 667 206 -4.1666666666666668e-10 667 200 -8.3333333333333335e-10 668 668 1.6666667249999997e-01 668 811 -8.3333333333333335e-10 668 620 -4.1666668333333337e-02 668 749 -4.1666667083333331e-02 668 667 -8.3333333333333335e-10 668 590 -4.1666667083333331e-02 668 14 -4.1666668333333337e-02 669 669 1.0000000000000007e-08 669 842 -1.6666666666666667e-09 669 670 -1.6666666666666667e-09 669 715 -1.6666666666666667e-09 669 249 -1.6666666666666667e-09 670 670 6.6666666666666668e-09 670 666 -8.3333333333333335e-10 670 744 -1.6666666666666667e-09 670 669 -1.6666666666666667e-09 670 660 -8.3333333333333335e-10 670 254 -8.3333333333333335e-10 671 671 1.0000000000000000e+00 672 672 1.0000000000000000e+00 673 673 2.0000000000000000e+00 674 674 1.0000000000000008e-08 674 833 -1.6666666666666667e-09 674 681 -1.6666666666666667e-09 674 675 -1.6666666666666667e-09 674 735 -1.6666666666666667e-09 674 678 -1.6666666666666667e-09 675 675 6.6666666666666701e-09 675 746 -8.3333333333333335e-10 675 677 -8.3333333333333335e-10 675 676 -8.3333333333333335e-10 675 663 -1.6666666666666667e-09 675 679 -8.3333333333333335e-10 675 674 -1.6666666666666667e-09 676 676 3.3333333666666670e-01 676 763 -4.1666667083333331e-02 676 678 -4.1666667083333331e-02 676 623 -8.3333334166666662e-02 676 675 -8.3333333333333335e-10 676 602 -8.3333333333333329e-02 676 389 -8.3333334166666662e-02 677 677 6.6666666666666701e-09 677 833 -8.3333333333333335e-10 677 721 -8.3333333333333335e-10 677 762 -8.3333333333333335e-10 677 623 -1.6666666666666667e-09 677 675 -8.3333333333333335e-10 677 616 -1.6666666666666667e-09 678 678 3.3333333666666659e-01 678 785 -4.1666667083333338e-02 678 676 -4.1666667083333331e-02 678 674 -1.6666666666666667e-09 678 601 -1.6666666666666666e-01 678 558 -4.1666667083333331e-02 679 679 3.3333333666666670e-01 679 749 -4.1666667083333331e-02 679 681 -4.1666667083333338e-02 679 624 -8.3333334166666675e-02 679 675 -8.3333333333333335e-10 679 571 -8.3333333333333329e-02 679 389 -8.3333334166666662e-02 680 680 6.6666666666666652e-01 680 777 -8.3333333333333329e-02 680 774 -8.3333333333333329e-02 680 765 -8.3333333333333329e-02 680 624 -1.6666666666666666e-01 680 571 -8.3333333333333329e-02 680 390 -1.6666666666666666e-01 681 681 3.3333333666666670e-01 681 751 -4.1666667083333331e-02 681 679 -4.1666667083333338e-02 681 674 -1.6666666666666667e-09 681 558 -4.1666667083333338e-02 681 572 -1.6666666666666666e-01 682 682 1.0416666666666672e+00 682 850 -2.0833333333333331e-01 682 767 -4.1666666666666671e-02 682 683 -8.3333333333333329e-02 682 390 2.0833333333333332e-02 682 575 -8.3333333333333329e-02 682 581 -2.4999999999999997e-01 683 683 6.2499999999999989e-01 683 774 -8.3333333333333329e-02 683 767 -8.3333333333333329e-02 683 685 -8.3333333333333329e-02 683 682 -8.3333333333333329e-02 683 390 -1.4583333333333331e-01 684 684 1.0000000000000000e+00 685 685 6.6666666666666652e-01 685 683 -8.3333333333333329e-02 685 770 -1.6666666666666666e-01 685 472 -8.3333333333333329e-02 685 581 -1.6666666666666666e-01 686 686 1.0000000000000000e+00 687 687 1.0000000000000000e+00 688 688 9.9999999999999978e-01 688 689 -1.6666666666666666e-01 688 699 -1.6666666666666666e-01 688 692 -1.6666666666666666e-01 688 174 2.0833333333333332e-02 688 231 -1.2500000000000000e-01 688 279 -2.5000000000000000e-01 689 689 6.6666666666666663e-01 689 688 -1.6666666666666666e-01 689 691 -8.3333333333333329e-02 689 690 -8.3333333333333329e-02 689 232 -8.3333333333333329e-02 689 300 -8.3333333333333329e-02 689 135 -1.6666666666666666e-01 690 690 3.3333333666666670e-01 690 763 -4.1666667083333331e-02 690 692 -4.1666667083333338e-02 690 623 -8.3333334166666675e-02 690 689 -8.3333333333333329e-02 690 762 -8.3333333333333335e-10 690 628 -8.3333334166666662e-02 691 691 6.6666666666666652e-01 691 699 -8.3333333333333329e-02 691 695 -8.3333333333333329e-02 691 623 -1.6666666666666666e-01 691 689 -8.3333333333333329e-02 691 602 -8.3333333333333329e-02 691 21 -1.6666666666666666e-01 692 692 3.3333333666666665e-01 692 787 -4.1666667083333338e-02 692 690 -4.1666667083333338e-02 692 764 -1.6666666666666667e-09 692 693 -4.1666667083333338e-02 692 688 -1.6666666666666666e-01 693 693 1.6666667250000000e-01 693 628 -4.1666668125000000e-02 693 692 -4.1666667083333338e-02 693 330 -8.3333333333333335e-10 693 235 -4.1666666666666668e-10 693 234 -4.1666666666666668e-10 693 175 4.1666666666666668e-10 693 255 -8.3333333333333335e-10 693 231 -4.1666667083333331e-02 694 694 1.0000000000000007e+00 694 699 -1.6666666666666666e-01 694 789 -1.6666666666666666e-01 694 695 -1.6666666666666666e-01 694 788 -1.6666666666666666e-01 695 695 6.6666666666666652e-01 695 691 -8.3333333333333329e-02 695 785 -8.3333333333333329e-02 695 694 -1.6666666666666666e-01 695 604 -8.3333333333333329e-02 695 601 -1.6666666666666666e-01 696 696 1.0000000000000000e+00 697 697 1.0000000000000000e+00 698 698 1.0000000000000000e+00 699 699 6.6666666666666652e-01 699 691 -8.3333333333333329e-02 699 701 -8.3333333333333329e-02 699 694 -1.6666666666666666e-01 699 787 -8.3333333333333329e-02 699 688 -1.6666666666666666e-01 700 700 1.0000000000000000e+00 701 701 6.2500000000000000e-01 701 783 -8.3333333333333329e-02 701 789 -8.3333333333333329e-02 701 699 -8.3333333333333329e-02 701 21 -1.4583333333333331e-01 701 279 -8.3333333333333329e-02 702 702 2.0000000000000000e+00 703 703 1.0000000000000000e+00 704 704 1.0000000000000008e-08 704 814 -1.6666666666666667e-09 704 799 -1.6666666666666667e-09 704 705 -1.6666666666666667e-09 704 800 -1.6666666666666667e-09 705 705 6.6666666666666701e-09 705 707 -8.3333333333333335e-10 705 796 -1.6666666666666667e-09 705 797 -8.3333333333333335e-10 705 704 -1.6666666666666667e-09 705 610 -8.3333333333333335e-10 706 706 1.0000000000000000e+00 707 707 6.6666666666666701e-09 707 814 -8.3333333333333335e-10 707 802 -8.3333333333333335e-10 707 711 -8.3333333333333335e-10 707 705 -8.3333333333333335e-10 707 19 -1.6666666666666667e-09 708 708 1.0000000000000000e+00 709 709 1.0000000000000000e+00 710 710 1.0000000000000007e-08 710 802 -1.6666666666666667e-09 710 711 -1.6666666666666667e-09 710 356 -1.6666666666666667e-09 710 242 -1.6666666666666667e-09 711 711 6.6666666666666701e-09 711 848 -8.3333333333333335e-10 711 707 -8.3333333333333335e-10 711 710 -1.6666666666666667e-09 711 818 -1.6666666666666667e-09 712 712 1.0000000000000000e+00 713 713 1.0000000000000000e+00 714 714 1.0000000000000000e+00 715 715 6.6666666666666701e-09 715 660 -8.3333333333333335e-10 715 717 -8.3333333333333335e-10 715 730 -1.6666666666666667e-09 715 669 -1.6666666666666667e-09 716 716 1.0000000000000000e+00 717 717 6.6666666666666701e-09 717 842 -8.3333333333333335e-10 717 835 -8.3333333333333335e-10 717 721 -8.3333333333333335e-10 717 715 -8.3333333333333335e-10 717 616 -1.6666666666666667e-09 718 718 1.0000000000000000e+00 719 719 1.0000000000000000e+00 720 720 1.0000000000000008e-08 720 721 -1.6666666666666667e-09 720 788 -1.6666666666666667e-09 720 835 -1.6666666666666667e-09 720 833 -1.6666666666666667e-09 721 721 6.6666666666666701e-09 721 677 -8.3333333333333335e-10 721 717 -8.3333333333333335e-10 721 764 -1.6666666666666667e-09 721 787 -8.3333333333333335e-10 721 720 -1.6666666666666667e-09 722 722 1.0000000000000000e+00 723 723 1.0000000000000000e+00 724 724 1.0000000000000000e+00 725 725 6.2500000000000014e-09 725 824 -8.3333333333333335e-10 725 814 -8.3333333333333335e-10 725 799 -8.3333333333333335e-10 725 19 -1.4583333333333334e-09 725 611 -8.3333333333333335e-10 726 726 1.0416666666666665e+00 726 800 -4.1666666666666664e-02 726 767 -4.1666666666666664e-02 726 727 -8.3333333333333329e-02 726 850 -2.0833333333333331e-01 726 405 -6.2500000000000000e-02 726 390 2.0833333333333332e-02 726 591 -4.1666666666666664e-02 726 575 -8.3333333333333329e-02 726 573 -2.5000000000000000e-01 726 589 -8.3333333333333329e-02 727 727 2.5000000333333339e-01 727 800 -4.1666667083333331e-02 727 726 -8.3333333333333329e-02 727 799 -8.3333333333333335e-10 727 591 -4.1666667083333338e-02 727 405 -4.1666667500000011e-02 728 728 1.0000000000000000e+00 729 729 1.0000000000000000e+00 730 730 1.0000000000000008e-08 730 715 -1.6666666666666667e-09 730 835 -1.6666666666666667e-09 730 658 -1.6666666666666667e-09 731 731 1.0000000000000000e+00 732 732 6.6666666666666701e-09 732 835 -8.3333333333333335e-10 732 833 -8.3333333333333335e-10 732 735 -8.3333333333333335e-10 732 658 -8.3333333333333335e-10 732 616 -1.6666666666666667e-09 733 733 1.0000000000000000e+00 734 734 1.0000000000000000e+00 735 735 6.6666666666666701e-09 735 746 -8.3333333333333335e-10 735 732 -8.3333333333333335e-10 735 751 -8.3333333333333335e-10 735 657 -1.6666666666666667e-09 735 674 -1.6666666666666667e-09 736 736 1.0000000000000000e+00 737 737 1.0000000000000000e+00 738 738 1.0000000000000000e+00 739 739 1.0000000000000000e+00 740 740 1.0000000000000000e+00 741 741 1.0000000000000000e+00 742 742 1.0000000000000000e+00 743 743 1.0000000000000000e+00 744 744 1.0000000000000007e-08 744 670 -1.6666666666666667e-09 744 750 -1.6666666666666667e-09 744 752 -1.6666666666666667e-09 744 664 -1.6666666666666667e-09 744 747 -1.6666666666666667e-09 745 745 3.3333333666666670e-01 745 749 -4.1666667083333331e-02 745 747 -4.1666667083333331e-02 745 624 -8.3333334166666662e-02 745 765 -8.3333333333333329e-02 745 664 -8.3333333333333335e-10 745 620 -8.3333334166666662e-02 746 746 6.6666666666666701e-09 746 752 -8.3333333333333335e-10 746 735 -8.3333333333333335e-10 746 675 -8.3333333333333335e-10 746 624 -1.6666666666666667e-09 746 664 -8.3333333333333335e-10 746 616 -1.6666666666666667e-09 747 747 3.3333333666666670e-01 747 753 -4.1666667083333331e-02 747 745 -4.1666667083333331e-02 747 766 -1.6666666666666666e-01 747 748 -4.1666667083333331e-02 747 744 -1.6666666666666667e-09 748 748 1.6666667250000000e-01 748 810 -8.3333333333333335e-10 748 750 -8.3333333333333335e-10 748 620 -4.1666668333333337e-02 748 768 -4.1666667083333338e-02 748 747 -4.1666667083333331e-02 749 749 3.3333333666666670e-01 749 745 -4.1666667083333331e-02 749 679 -4.1666667083333331e-02 749 668 -4.1666667083333331e-02 749 663 -1.6666666666666667e-09 749 570 -1.6666666666666666e-01 749 468 -4.1666667083333331e-02 750 750 7.0833333333333355e-09 750 619 -2.0833333333333334e-10 750 748 -8.3333333333333335e-10 750 620 2.0833333333333334e-10 750 665 -8.3333333333333335e-10 750 812 -4.1666666666666668e-10 750 744 -1.6666666666666667e-09 750 254 -8.3333333333333335e-10 750 358 -1.2500000000000000e-09 751 751 3.3333333666666670e-01 751 754 -4.1666667083333331e-02 751 681 -4.1666667083333331e-02 751 624 -8.3333334166666662e-02 751 777 -8.3333333333333329e-02 751 735 -8.3333333333333335e-10 752 752 6.6666666666666701e-09 752 660 -8.3333333333333335e-10 752 746 -8.3333333333333335e-10 752 657 -1.6666666666666667e-09 752 753 -8.3333333333333335e-10 752 744 -1.6666666666666667e-09 753 753 3.3333333666666670e-01 753 747 -4.1666667083333331e-02 753 754 -4.1666667083333331e-02 753 624 -8.3333334166666662e-02 753 774 -8.3333333333333329e-02 753 752 -8.3333333333333335e-10 754 754 3.3333333666666670e-01 754 751 -4.1666667083333331e-02 754 753 -4.1666667083333331e-02 754 770 -1.6666666666666666e-01 754 657 -1.6666666666666667e-09 755 755 1.0000000000000000e+00 756 756 1.0000000000000000e+00 757 757 1.0000000000000000e+00 758 758 1.0000000000000000e+00 759 759 2.0000000000000000e+00 760 760 1.6666667250000000e-01 760 628 -4.1666668125000000e-02 760 667 -8.3333333333333335e-10 760 763 -4.1666667083333331e-02 760 59 -4.1666666666666668e-10 760 335 -4.1666666666666668e-10 760 186 4.1666666666666668e-10 760 136 -4.1666667083333338e-02 760 208 -8.3333333333333335e-10 760 14 -4.1666668125000000e-02 761 761 5.8333333333333335e-09 761 667 -8.3333333333333335e-10 761 628 -1.2500000000000000e-09 761 762 -8.3333333333333335e-10 761 619 -1.2500000000000000e-09 761 255 -8.3333333333333335e-10 761 206 -8.3333333333333335e-10 762 762 6.6666666666666685e-09 762 761 -8.3333333333333335e-10 762 666 -8.3333333333333335e-10 762 764 -1.6666666666666667e-09 762 677 -8.3333333333333335e-10 762 690 -8.3333333333333335e-10 762 663 -1.6666666666666667e-09 763 763 3.3333333666666670e-01 763 676 -4.1666667083333331e-02 763 690 -4.1666667083333331e-02 763 760 -4.1666667083333331e-02 763 663 -1.6666666666666667e-09 763 468 -4.1666667083333331e-02 763 135 -1.6666666666666666e-01 764 764 1.0000000000000007e-08 764 762 -1.6666666666666667e-09 764 842 -1.6666666666666667e-09 764 721 -1.6666666666666667e-09 764 692 -1.6666666666666667e-09 764 255 -1.6666666666666667e-09 765 765 6.6666666666666652e-01 765 680 -8.3333333333333329e-02 765 779 -8.3333333333333329e-02 765 745 -8.3333333333333329e-02 765 766 -1.6666666666666666e-01 765 589 -8.3333333333333329e-02 765 570 -1.6666666666666666e-01 766 766 1.0000000000000007e+00 766 768 -1.2499999999999999e-01 766 747 -1.6666666666666666e-01 766 774 -1.6666666666666666e-01 766 767 -2.5000000000000000e-01 766 765 -1.6666666666666666e-01 766 405 2.0833333333333332e-02 767 767 9.9999999999999978e-01 767 683 -8.3333333333333329e-02 767 682 -4.1666666666666671e-02 767 726 -4.1666666666666664e-02 767 768 -4.1666666666666664e-02 767 797 -8.3333333333333329e-02 767 850 -2.4999999999999997e-01 767 766 -2.5000000000000000e-01 767 390 -4.1666666666666664e-02 767 405 -4.1666666666666664e-02 767 589 -8.3333333333333329e-02 768 768 3.7500000333333317e-01 768 797 -4.1666667083333331e-02 768 779 -4.1666667083333338e-02 768 767 -4.1666666666666664e-02 768 796 -1.6666666666666667e-09 768 748 -4.1666667083333338e-02 768 766 -1.2499999999999999e-01 768 405 -2.0833333333333332e-02 769 769 1.0000000000000000e+00 770 770 1.0000000000000007e+00 770 777 -1.6666666666666666e-01 770 774 -1.6666666666666666e-01 770 754 -1.6666666666666666e-01 770 685 -1.6666666666666666e-01 771 771 1.0000000000000000e+00 772 772 1.0000000000000000e+00 773 773 1.0000000000000000e+00 774 774 6.6666666666666652e-01 774 680 -8.3333333333333329e-02 774 683 -8.3333333333333329e-02 774 753 -8.3333333333333329e-02 774 770 -1.6666666666666666e-01 774 766 -1.6666666666666666e-01 775 775 1.0000000000000000e+00 776 776 1.0000000000000000e+00 777 777 6.6666666666666652e-01 777 680 -8.3333333333333329e-02 777 770 -1.6666666666666666e-01 777 751 -8.3333333333333329e-02 777 472 -8.3333333333333329e-02 777 572 -1.6666666666666666e-01 778 778 1.0000000000000000e+00 779 779 3.3333333666666654e-01 779 768 -4.1666667083333338e-02 779 807 -8.3333333333333335e-10 779 765 -8.3333333333333329e-02 779 620 -8.3333334166666662e-02 779 590 -4.1666667083333338e-02 779 405 -8.3333334166666675e-02 780 780 1.0000000000000009e+00 780 789 -1.6666666666666666e-01 780 783 -2.5000000000000000e-01 780 599 -1.6666666666666666e-01 781 781 2.0000000000000000e+00 782 782 1.0000000000000000e+00 783 783 1.0416666666666670e+00 783 701 -8.3333333333333329e-02 783 780 -2.5000000000000000e-01 783 307 -8.3333333333333329e-02 783 21 2.0833333333333332e-02 783 279 -4.1666666666666664e-02 783 280 -2.0833333333333331e-01 784 784 2.0000000000000000e+00 785 785 3.3333333666666654e-01 785 788 -4.1666667083333338e-02 785 678 -4.1666667083333338e-02 785 623 -8.3333334166666675e-02 785 833 -8.3333333333333335e-10 785 695 -8.3333333333333329e-02 786 786 1.0000000000000000e+00 787 787 3.3333333666666654e-01 787 692 -4.1666667083333338e-02 787 788 -4.1666667083333338e-02 787 623 -8.3333334166666675e-02 787 721 -8.3333333333333335e-10 787 699 -8.3333333333333329e-02 788 788 3.3333333666666654e-01 788 785 -4.1666667083333338e-02 788 787 -4.1666667083333338e-02 788 720 -1.6666666666666667e-09 788 694 -1.6666666666666666e-01 789 789 6.6666666666666652e-01 789 701 -8.3333333333333329e-02 789 780 -1.6666666666666666e-01 789 694 -1.6666666666666666e-01 789 604 -8.3333333333333329e-02 790 790 1.0000000000000000e+00 791 791 1.0000000000000000e+00 792 792 1.0000000000000000e+00 793 793 1.0000000000000000e+00 794 794 1.0000000000000000e+00 795 795 1.0000000000000000e+00 796 796 1.0000000000000007e-08 796 810 -1.6666666666666667e-09 796 802 -1.6666666666666667e-09 796 807 -1.6666666666666667e-09 796 705 -1.6666666666666667e-09 796 768 -1.6666666666666667e-09 797 797 2.9166667000000002e-01 797 800 -4.1666667083333331e-02 797 768 -4.1666667083333331e-02 797 767 -8.3333333333333329e-02 797 705 -8.3333333333333335e-10 797 405 -6.2500000833333333e-02 798 798 1.0000000000000000e+00 799 799 6.6666666666666701e-09 799 725 -8.3333333333333335e-10 799 704 -1.6666666666666667e-09 799 727 -8.3333333333333335e-10 799 610 -8.3333333333333335e-10 799 609 -1.6666666666666667e-09 800 800 3.7500000333333333e-01 800 726 -4.1666666666666664e-02 800 850 -1.2500000000000000e-01 800 797 -4.1666667083333331e-02 800 727 -4.1666667083333331e-02 800 704 -1.6666666666666667e-09 800 405 -2.0833333333333332e-02 801 801 1.0000000000000000e+00 802 802 6.6666666666666668e-09 802 809 -8.3333333333333335e-10 802 710 -1.6666666666666667e-09 802 796 -1.6666666666666667e-09 802 707 -8.3333333333333335e-10 802 241 -8.3333333333333335e-10 803 803 1.0000000000000000e+00 804 804 1.0000000000000000e+00 805 805 2.0000000000000000e+00 806 806 2.0000000000000000e+00 807 807 6.6666666666666701e-09 807 809 -8.3333333333333335e-10 807 808 -8.3333333333333335e-10 807 779 -8.3333333333333335e-10 807 796 -1.6666666666666667e-09 807 610 -8.3333333333333335e-10 807 152 -1.6666666666666667e-09 808 808 5.8333333333333326e-09 808 620 -1.2500000000000000e-09 808 810 -8.3333333333333335e-10 808 812 -8.3333333333333335e-10 808 649 -1.2500000000000000e-09 808 811 -8.3333333333333335e-10 808 807 -8.3333333333333335e-10 809 809 6.6666666666666676e-09 809 649 -1.6666666666666667e-09 809 802 -8.3333333333333335e-10 809 807 -8.3333333333333335e-10 809 357 -8.3333333333333335e-10 809 19 -1.6666666666666667e-09 809 356 -8.3333333333333335e-10 810 810 7.5000000000000026e-09 810 748 -8.3333333333333335e-10 810 812 -4.1666666666666668e-10 810 620 2.0833333333333334e-10 810 796 -1.6666666666666667e-09 810 649 -4.1666666666666668e-10 810 808 -8.3333333333333335e-10 810 241 -8.3333333333333335e-10 810 243 -4.1666666666666668e-10 810 358 -8.3333333333333335e-10 811 811 7.0833333333333339e-09 811 649 -2.0833333333333334e-10 811 620 2.0833333333333334e-10 811 812 -4.1666666666666668e-10 811 668 -8.3333333333333335e-10 811 808 -8.3333333333333335e-10 811 260 -8.3333333333333335e-10 811 263 -8.3333333333333335e-10 811 152 -1.6666666666666667e-09 811 14 -4.1666666666666668e-10 811 200 -1.2500000000000000e-09 812 812 1.0416666666666672e-08 812 810 -4.1666666666666668e-10 812 620 -8.3333333333333335e-10 812 665 -8.3333333333333335e-10 812 750 -4.1666666666666668e-10 812 619 -6.2500000000000001e-10 812 808 -8.3333333333333335e-10 812 649 -8.3333333333333335e-10 812 667 -4.1666666666666668e-10 812 811 -4.1666666666666668e-10 812 358 -2.0833333333333334e-09 812 158 2.0833333333333334e-10 812 278 -4.1666666666666668e-10 812 14 8.3333333333333335e-10 812 201 -8.3333333333333335e-10 812 202 -8.3333333333333335e-10 812 200 -2.5000000000000001e-09 813 813 1.0000000000000000e+00 814 814 6.6666666666666701e-09 814 707 -8.3333333333333335e-10 814 725 -8.3333333333333335e-10 814 704 -1.6666666666666667e-09 814 818 -1.6666666666666667e-09 815 815 1.0000000000000000e+00 816 816 1.0000000000000000e+00 817 817 1.0000000000000000e+00 818 818 1.0000000000000008e-08 818 824 -2.5000000000000005e-09 818 711 -1.6666666666666667e-09 818 814 -1.6666666666666667e-09 819 819 1.0000000000000000e+00 820 820 1.0000000000000000e+00 821 821 1.0000000000000000e+00 822 822 1.0000000000000000e+00 823 823 1.0000000000000000e+00 824 824 1.0000000000000007e-08 824 725 -8.3333333333333335e-10 824 831 -4.1666666666666668e-10 824 818 -2.5000000000000005e-09 824 848 -8.3333333333333335e-10 824 825 -2.5000000000000001e-09 824 19 -4.1666666666666668e-10 824 611 -4.1666666666666668e-10 824 7 8.3333333333333335e-10 825 825 1.0000000000000004e-08 825 824 -2.5000000000000001e-09 825 831 -2.0833333333333334e-09 825 611 -2.0833333333333334e-09 825 116 -8.3333333333333335e-10 826 826 1.0000000000000000e+00 827 827 1.0000000000000000e+00 828 828 1.0000000000000000e+00 829 829 2.0000000000000000e+00 830 830 1.0000000000000000e+00 831 831 1.0416666666666672e-08 831 848 -8.3333333333333335e-10 831 824 -4.1666666666666668e-10 831 825 -2.0833333333333334e-09 831 7 -8.3333333333333335e-10 831 116 -4.1666666666666668e-10 831 33 -4.1666666666666668e-10 831 82 -8.3333333333333335e-10 831 355 -2.5000000000000009e-09 831 34 -8.3333333333333335e-10 831 19 2.0833333333333334e-10 832 832 1.0000000000000000e+00 833 833 6.6666666666666701e-09 833 677 -8.3333333333333335e-10 833 732 -8.3333333333333335e-10 833 785 -8.3333333333333335e-10 833 674 -1.6666666666666667e-09 833 720 -1.6666666666666667e-09 834 834 1.0000000000000000e+00 835 835 6.6666666666666701e-09 835 717 -8.3333333333333335e-10 835 732 -8.3333333333333335e-10 835 720 -1.6666666666666667e-09 835 730 -1.6666666666666667e-09 836 836 1.0000000000000000e+00 837 837 1.0000000000000000e+00 838 838 1.0000000000000000e+00 839 839 1.0000000000000000e+00 840 840 1.0000000000000000e+00 841 841 1.0000000000000000e+00 842 842 6.6666666666666668e-09 842 666 -8.3333333333333335e-10 842 669 -1.6666666666666667e-09 842 764 -1.6666666666666667e-09 842 717 -8.3333333333333335e-10 842 250 -8.3333333333333335e-10 843 843 1.0000000000000000e+00 844 844 1.0000000000000000e+00 845 845 2.0000000000000000e+00 846 846 2.0000000000000000e+00 847 847 1.0000000000000000e+00 848 848 6.2500000000000005e-09 848 831 -8.3333333333333335e-10 848 711 -8.3333333333333335e-10 848 824 -8.3333333333333335e-10 848 19 -1.4583333333333334e-09 848 356 -8.3333333333333335e-10 849 849 2.0000000000000000e+00 850 850 1.0000000000000002e+00 850 800 -1.2500000000000000e-01 850 682 -2.0833333333333331e-01 850 767 -2.4999999999999997e-01 850 726 -2.0833333333333331e-01 850 405 4.1666666666666664e-02 851 851 1.0000000000000000e+00 852 852 1.0000000000000000e+00 853 853 1.0000000000000000e+00 854 854 1.0000000000000000e+00 855 855 1.0000000000000000e+00 856 856 1.0000000000000000e+00 857 857 1.0000000000000000e+00 hypre-2.33.0/src/test/TEST_ams/mfem.G.00000000066400000000000000000002015241477326011500176170ustar00rootroot000000000000001 1075 1 152 1 22 1.0000000000000000e+00 1 1 -1.0000000000000000e+00 2 26 1.0000000000000000e+00 2 1 -1.0000000000000000e+00 3 114 1.0000000000000000e+00 3 1 -1.0000000000000000e+00 4 101 1.0000000000000000e+00 4 1 -1.0000000000000000e+00 5 116 1.0000000000000000e+00 5 1 -1.0000000000000000e+00 6 27 1.0000000000000000e+00 6 2 -1.0000000000000000e+00 7 85 1.0000000000000000e+00 7 2 -1.0000000000000000e+00 8 29 1.0000000000000000e+00 8 2 -1.0000000000000000e+00 9 84 1.0000000000000000e+00 9 2 -1.0000000000000000e+00 10 23 1.0000000000000000e+00 10 2 -1.0000000000000000e+00 11 86 1.0000000000000000e+00 11 2 -1.0000000000000000e+00 12 22 1.0000000000000000e+00 12 2 -1.0000000000000000e+00 13 95 1.0000000000000000e+00 13 2 -1.0000000000000000e+00 14 24 1.0000000000000000e+00 14 2 -1.0000000000000000e+00 15 94 1.0000000000000000e+00 15 2 -1.0000000000000000e+00 16 28 1.0000000000000000e+00 16 2 -1.0000000000000000e+00 17 96 1.0000000000000000e+00 17 2 -1.0000000000000000e+00 18 88 1.0000000000000000e+00 18 2 -1.0000000000000000e+00 19 89 1.0000000000000000e+00 19 2 -1.0000000000000000e+00 20 93 1.0000000000000000e+00 20 2 -1.0000000000000000e+00 21 99 1.0000000000000000e+00 21 2 -1.0000000000000000e+00 22 103 1.0000000000000000e+00 22 2 -1.0000000000000000e+00 23 93 1.0000000000000000e+00 23 3 -1.0000000000000000e+00 24 23 1.0000000000000000e+00 24 3 -1.0000000000000000e+00 25 36 1.0000000000000000e+00 25 3 -1.0000000000000000e+00 26 34 1.0000000000000000e+00 26 3 -1.0000000000000000e+00 27 25 1.0000000000000000e+00 27 3 -1.0000000000000000e+00 28 22 1.0000000000000000e+00 28 3 -1.0000000000000000e+00 29 26 1.0000000000000000e+00 29 3 -1.0000000000000000e+00 30 33 1.0000000000000000e+00 30 3 -1.0000000000000000e+00 31 37 1.0000000000000000e+00 31 3 -1.0000000000000000e+00 32 3 -1.0000000000000000e+00 32 365 1.0000000000000000e+00 33 3 -1.0000000000000000e+00 33 831 1.0000000000000000e+00 34 83 1.0000000000000000e+00 34 3 -1.0000000000000000e+00 35 84 1.0000000000000000e+00 35 3 -1.0000000000000000e+00 36 116 1.0000000000000000e+00 36 3 -1.0000000000000000e+00 37 3 -1.0000000000000000e+00 37 829 1.0000000000000000e+00 38 23 1.0000000000000000e+00 38 394 -1.0000000000000000e+00 39 22 1.0000000000000000e+00 39 394 -1.0000000000000000e+00 40 24 1.0000000000000000e+00 40 394 -1.0000000000000000e+00 41 25 1.0000000000000000e+00 41 394 -1.0000000000000000e+00 42 26 1.0000000000000000e+00 42 394 -1.0000000000000000e+00 43 93 1.0000000000000000e+00 43 394 -1.0000000000000000e+00 44 89 1.0000000000000000e+00 44 394 -1.0000000000000000e+00 45 99 1.0000000000000000e+00 45 394 -1.0000000000000000e+00 46 95 1.0000000000000000e+00 46 394 -1.0000000000000000e+00 47 100 1.0000000000000000e+00 47 394 -1.0000000000000000e+00 48 101 1.0000000000000000e+00 48 394 -1.0000000000000000e+00 49 115 1.0000000000000000e+00 49 394 -1.0000000000000000e+00 50 114 1.0000000000000000e+00 50 394 -1.0000000000000000e+00 51 34 1.0000000000000000e+00 51 394 -1.0000000000000000e+00 52 27 1.0000000000000000e+00 52 4 -1.0000000000000000e+00 53 31 1.0000000000000000e+00 53 4 -1.0000000000000000e+00 54 32 1.0000000000000000e+00 54 4 -1.0000000000000000e+00 55 54 1.0000000000000000e+00 55 4 -1.0000000000000000e+00 56 58 1.0000000000000000e+00 56 4 -1.0000000000000000e+00 57 69 1.0000000000000000e+00 57 4 -1.0000000000000000e+00 58 72 1.0000000000000000e+00 58 4 -1.0000000000000000e+00 59 73 1.0000000000000000e+00 59 4 -1.0000000000000000e+00 60 76 1.0000000000000000e+00 60 4 -1.0000000000000000e+00 61 80 1.0000000000000000e+00 61 4 -1.0000000000000000e+00 62 119 1.0000000000000000e+00 62 4 -1.0000000000000000e+00 63 103 1.0000000000000000e+00 63 5 -1.0000000000000000e+00 64 28 1.0000000000000000e+00 64 5 -1.0000000000000000e+00 65 104 1.0000000000000000e+00 65 5 -1.0000000000000000e+00 66 129 1.0000000000000000e+00 66 5 -1.0000000000000000e+00 67 30 1.0000000000000000e+00 67 5 -1.0000000000000000e+00 68 27 1.0000000000000000e+00 68 5 -1.0000000000000000e+00 69 31 1.0000000000000000e+00 69 5 -1.0000000000000000e+00 70 94 1.0000000000000000e+00 70 5 -1.0000000000000000e+00 71 105 1.0000000000000000e+00 71 5 -1.0000000000000000e+00 72 128 1.0000000000000000e+00 72 5 -1.0000000000000000e+00 73 54 1.0000000000000000e+00 73 5 -1.0000000000000000e+00 74 28 1.0000000000000000e+00 74 6 -1.0000000000000000e+00 75 27 1.0000000000000000e+00 75 6 -1.0000000000000000e+00 76 29 1.0000000000000000e+00 76 6 -1.0000000000000000e+00 77 30 1.0000000000000000e+00 77 6 -1.0000000000000000e+00 78 31 1.0000000000000000e+00 78 6 -1.0000000000000000e+00 79 32 1.0000000000000000e+00 79 6 -1.0000000000000000e+00 80 55 1.0000000000000000e+00 80 6 -1.0000000000000000e+00 81 54 1.0000000000000000e+00 81 6 -1.0000000000000000e+00 82 56 1.0000000000000000e+00 82 6 -1.0000000000000000e+00 83 57 1.0000000000000000e+00 83 6 -1.0000000000000000e+00 84 58 1.0000000000000000e+00 84 6 -1.0000000000000000e+00 85 89 1.0000000000000000e+00 85 6 -1.0000000000000000e+00 86 88 1.0000000000000000e+00 86 6 -1.0000000000000000e+00 87 90 1.0000000000000000e+00 87 6 -1.0000000000000000e+00 88 85 1.0000000000000000e+00 88 6 -1.0000000000000000e+00 89 91 1.0000000000000000e+00 89 6 -1.0000000000000000e+00 90 80 1.0000000000000000e+00 90 6 -1.0000000000000000e+00 91 103 1.0000000000000000e+00 91 6 -1.0000000000000000e+00 92 64 1.0000000000000000e+00 92 6 -1.0000000000000000e+00 93 119 1.0000000000000000e+00 93 6 -1.0000000000000000e+00 94 120 1.0000000000000000e+00 94 6 -1.0000000000000000e+00 95 121 1.0000000000000000e+00 95 6 -1.0000000000000000e+00 96 122 1.0000000000000000e+00 96 6 -1.0000000000000000e+00 97 40 1.0000000000000000e+00 97 6 -1.0000000000000000e+00 98 6 -1.0000000000000000e+00 98 513 1.0000000000000000e+00 99 129 1.0000000000000000e+00 99 6 -1.0000000000000000e+00 100 33 1.0000000000000000e+00 100 157 -1.0000000000000000e+00 101 37 1.0000000000000000e+00 101 157 -1.0000000000000000e+00 102 38 1.0000000000000000e+00 102 157 -1.0000000000000000e+00 103 45 1.0000000000000000e+00 103 157 -1.0000000000000000e+00 104 67 1.0000000000000000e+00 104 157 -1.0000000000000000e+00 105 68 1.0000000000000000e+00 105 157 -1.0000000000000000e+00 106 84 1.0000000000000000e+00 106 157 -1.0000000000000000e+00 107 150 1.0000000000000000e+00 107 157 -1.0000000000000000e+00 108 831 1.0000000000000000e+00 108 157 -1.0000000000000000e+00 109 33 1.0000000000000000e+00 109 7 -1.0000000000000000e+00 110 34 1.0000000000000000e+00 110 7 -1.0000000000000000e+00 111 116 1.0000000000000000e+00 111 7 -1.0000000000000000e+00 112 81 1.0000000000000000e+00 112 7 -1.0000000000000000e+00 113 35 1.0000000000000000e+00 113 7 -1.0000000000000000e+00 114 7 -1.0000000000000000e+00 114 355 1.0000000000000000e+00 115 82 1.0000000000000000e+00 115 7 -1.0000000000000000e+00 116 7 -1.0000000000000000e+00 116 357 1.0000000000000000e+00 117 93 1.0000000000000000e+00 117 7 -1.0000000000000000e+00 118 118 1.0000000000000000e+00 118 7 -1.0000000000000000e+00 119 34 1.0000000000000000e+00 119 8 -1.0000000000000000e+00 120 33 1.0000000000000000e+00 120 8 -1.0000000000000000e+00 121 35 1.0000000000000000e+00 121 8 -1.0000000000000000e+00 122 36 1.0000000000000000e+00 122 8 -1.0000000000000000e+00 123 37 1.0000000000000000e+00 123 8 -1.0000000000000000e+00 124 38 1.0000000000000000e+00 124 8 -1.0000000000000000e+00 125 46 1.0000000000000000e+00 125 8 -1.0000000000000000e+00 126 45 1.0000000000000000e+00 126 8 -1.0000000000000000e+00 127 47 1.0000000000000000e+00 127 8 -1.0000000000000000e+00 128 48 1.0000000000000000e+00 128 8 -1.0000000000000000e+00 129 8 -1.0000000000000000e+00 129 262 1.0000000000000000e+00 130 85 1.0000000000000000e+00 130 8 -1.0000000000000000e+00 131 84 1.0000000000000000e+00 131 8 -1.0000000000000000e+00 132 86 1.0000000000000000e+00 132 8 -1.0000000000000000e+00 133 87 1.0000000000000000e+00 133 8 -1.0000000000000000e+00 134 67 1.0000000000000000e+00 134 8 -1.0000000000000000e+00 135 88 1.0000000000000000e+00 135 8 -1.0000000000000000e+00 136 89 1.0000000000000000e+00 136 8 -1.0000000000000000e+00 137 92 1.0000000000000000e+00 137 8 -1.0000000000000000e+00 138 93 1.0000000000000000e+00 138 8 -1.0000000000000000e+00 139 23 1.0000000000000000e+00 139 8 -1.0000000000000000e+00 140 8 -1.0000000000000000e+00 140 505 1.0000000000000000e+00 141 118 1.0000000000000000e+00 141 8 -1.0000000000000000e+00 142 81 1.0000000000000000e+00 142 8 -1.0000000000000000e+00 143 121 1.0000000000000000e+00 143 8 -1.0000000000000000e+00 144 64 1.0000000000000000e+00 144 8 -1.0000000000000000e+00 145 39 1.0000000000000000e+00 145 183 -1.0000000000000000e+00 146 43 1.0000000000000000e+00 146 183 -1.0000000000000000e+00 147 44 1.0000000000000000e+00 147 183 -1.0000000000000000e+00 148 63 1.0000000000000000e+00 148 183 -1.0000000000000000e+00 149 106 1.0000000000000000e+00 149 183 -1.0000000000000000e+00 150 131 1.0000000000000000e+00 150 183 -1.0000000000000000e+00 151 45 1.0000000000000000e+00 151 9 -1.0000000000000000e+00 152 64 1.0000000000000000e+00 152 9 -1.0000000000000000e+00 153 47 1.0000000000000000e+00 153 9 -1.0000000000000000e+00 154 119 1.0000000000000000e+00 154 9 -1.0000000000000000e+00 155 40 1.0000000000000000e+00 155 9 -1.0000000000000000e+00 156 120 1.0000000000000000e+00 156 9 -1.0000000000000000e+00 157 39 1.0000000000000000e+00 157 9 -1.0000000000000000e+00 158 60 1.0000000000000000e+00 158 9 -1.0000000000000000e+00 159 41 1.0000000000000000e+00 159 9 -1.0000000000000000e+00 160 124 1.0000000000000000e+00 160 9 -1.0000000000000000e+00 161 46 1.0000000000000000e+00 161 9 -1.0000000000000000e+00 162 125 1.0000000000000000e+00 162 9 -1.0000000000000000e+00 163 65 1.0000000000000000e+00 163 9 -1.0000000000000000e+00 164 146 1.0000000000000000e+00 164 9 -1.0000000000000000e+00 165 61 1.0000000000000000e+00 165 9 -1.0000000000000000e+00 166 148 1.0000000000000000e+00 166 9 -1.0000000000000000e+00 167 88 1.0000000000000000e+00 167 9 -1.0000000000000000e+00 168 121 1.0000000000000000e+00 168 9 -1.0000000000000000e+00 169 122 1.0000000000000000e+00 169 9 -1.0000000000000000e+00 170 126 1.0000000000000000e+00 170 9 -1.0000000000000000e+00 171 118 1.0000000000000000e+00 171 9 -1.0000000000000000e+00 172 139 1.0000000000000000e+00 172 9 -1.0000000000000000e+00 173 147 1.0000000000000000e+00 173 9 -1.0000000000000000e+00 174 145 1.0000000000000000e+00 174 9 -1.0000000000000000e+00 175 110 1.0000000000000000e+00 175 9 -1.0000000000000000e+00 176 149 1.0000000000000000e+00 176 9 -1.0000000000000000e+00 177 110 1.0000000000000000e+00 177 10 -1.0000000000000000e+00 178 107 1.0000000000000000e+00 178 10 -1.0000000000000000e+00 179 112 1.0000000000000000e+00 179 10 -1.0000000000000000e+00 180 122 1.0000000000000000e+00 180 10 -1.0000000000000000e+00 181 40 1.0000000000000000e+00 181 10 -1.0000000000000000e+00 182 57 1.0000000000000000e+00 182 10 -1.0000000000000000e+00 183 55 1.0000000000000000e+00 183 10 -1.0000000000000000e+00 184 42 1.0000000000000000e+00 184 10 -1.0000000000000000e+00 185 109 1.0000000000000000e+00 185 10 -1.0000000000000000e+00 186 39 1.0000000000000000e+00 186 10 -1.0000000000000000e+00 187 43 1.0000000000000000e+00 187 10 -1.0000000000000000e+00 188 54 1.0000000000000000e+00 188 10 -1.0000000000000000e+00 189 58 1.0000000000000000e+00 189 10 -1.0000000000000000e+00 190 106 1.0000000000000000e+00 190 10 -1.0000000000000000e+00 191 69 1.0000000000000000e+00 191 10 -1.0000000000000000e+00 192 119 1.0000000000000000e+00 192 10 -1.0000000000000000e+00 193 131 1.0000000000000000e+00 193 10 -1.0000000000000000e+00 194 40 1.0000000000000000e+00 194 11 -1.0000000000000000e+00 195 39 1.0000000000000000e+00 195 11 -1.0000000000000000e+00 196 41 1.0000000000000000e+00 196 11 -1.0000000000000000e+00 197 42 1.0000000000000000e+00 197 11 -1.0000000000000000e+00 198 43 1.0000000000000000e+00 198 11 -1.0000000000000000e+00 199 44 1.0000000000000000e+00 199 11 -1.0000000000000000e+00 200 122 1.0000000000000000e+00 200 11 -1.0000000000000000e+00 201 121 1.0000000000000000e+00 201 11 -1.0000000000000000e+00 202 123 1.0000000000000000e+00 202 11 -1.0000000000000000e+00 203 126 1.0000000000000000e+00 203 11 -1.0000000000000000e+00 204 60 1.0000000000000000e+00 204 11 -1.0000000000000000e+00 205 127 1.0000000000000000e+00 205 11 -1.0000000000000000e+00 206 11 -1.0000000000000000e+00 206 480 1.0000000000000000e+00 207 11 -1.0000000000000000e+00 207 515 1.0000000000000000e+00 208 131 1.0000000000000000e+00 208 11 -1.0000000000000000e+00 209 132 1.0000000000000000e+00 209 11 -1.0000000000000000e+00 210 133 1.0000000000000000e+00 210 11 -1.0000000000000000e+00 211 11 -1.0000000000000000e+00 211 536 1.0000000000000000e+00 212 11 -1.0000000000000000e+00 212 514 1.0000000000000000e+00 213 11 -1.0000000000000000e+00 213 513 1.0000000000000000e+00 214 55 1.0000000000000000e+00 214 11 -1.0000000000000000e+00 215 11 -1.0000000000000000e+00 215 444 1.0000000000000000e+00 216 11 -1.0000000000000000e+00 216 537 1.0000000000000000e+00 217 134 1.0000000000000000e+00 217 11 -1.0000000000000000e+00 218 11 -1.0000000000000000e+00 218 495 1.0000000000000000e+00 219 11 -1.0000000000000000e+00 219 433 1.0000000000000000e+00 220 118 1.0000000000000000e+00 220 180 -1.0000000000000000e+00 221 81 1.0000000000000000e+00 221 180 -1.0000000000000000e+00 222 48 1.0000000000000000e+00 222 180 -1.0000000000000000e+00 223 46 1.0000000000000000e+00 223 180 -1.0000000000000000e+00 224 117 1.0000000000000000e+00 224 180 -1.0000000000000000e+00 225 139 1.0000000000000000e+00 225 180 -1.0000000000000000e+00 226 140 1.0000000000000000e+00 226 180 -1.0000000000000000e+00 227 138 1.0000000000000000e+00 227 180 -1.0000000000000000e+00 228 152 1.0000000000000000e+00 228 180 -1.0000000000000000e+00 229 45 1.0000000000000000e+00 229 180 -1.0000000000000000e+00 230 33 1.0000000000000000e+00 230 180 -1.0000000000000000e+00 231 507 1.0000000000000000e+00 231 180 -1.0000000000000000e+00 232 124 1.0000000000000000e+00 232 180 -1.0000000000000000e+00 233 303 1.0000000000000000e+00 233 180 -1.0000000000000000e+00 234 49 1.0000000000000000e+00 234 12 -1.0000000000000000e+00 235 52 1.0000000000000000e+00 235 12 -1.0000000000000000e+00 236 53 1.0000000000000000e+00 236 12 -1.0000000000000000e+00 237 94 1.0000000000000000e+00 237 12 -1.0000000000000000e+00 238 98 1.0000000000000000e+00 238 12 -1.0000000000000000e+00 239 128 1.0000000000000000e+00 239 12 -1.0000000000000000e+00 240 105 1.0000000000000000e+00 240 12 -1.0000000000000000e+00 241 49 1.0000000000000000e+00 241 367 -1.0000000000000000e+00 242 115 1.0000000000000000e+00 242 367 -1.0000000000000000e+00 243 50 1.0000000000000000e+00 243 367 -1.0000000000000000e+00 244 114 1.0000000000000000e+00 244 367 -1.0000000000000000e+00 245 99 1.0000000000000000e+00 245 367 -1.0000000000000000e+00 246 51 1.0000000000000000e+00 246 375 -1.0000000000000000e+00 247 49 1.0000000000000000e+00 247 375 -1.0000000000000000e+00 248 52 1.0000000000000000e+00 248 375 -1.0000000000000000e+00 249 128 1.0000000000000000e+00 249 375 -1.0000000000000000e+00 250 13 -1.0000000000000000e+00 250 512 1.0000000000000000e+00 251 49 1.0000000000000000e+00 251 13 -1.0000000000000000e+00 252 50 1.0000000000000000e+00 252 13 -1.0000000000000000e+00 253 51 1.0000000000000000e+00 253 13 -1.0000000000000000e+00 254 52 1.0000000000000000e+00 254 13 -1.0000000000000000e+00 255 53 1.0000000000000000e+00 255 13 -1.0000000000000000e+00 256 95 1.0000000000000000e+00 256 13 -1.0000000000000000e+00 257 94 1.0000000000000000e+00 257 13 -1.0000000000000000e+00 258 96 1.0000000000000000e+00 258 13 -1.0000000000000000e+00 259 97 1.0000000000000000e+00 259 13 -1.0000000000000000e+00 260 98 1.0000000000000000e+00 260 13 -1.0000000000000000e+00 261 99 1.0000000000000000e+00 261 13 -1.0000000000000000e+00 262 89 1.0000000000000000e+00 262 13 -1.0000000000000000e+00 263 102 1.0000000000000000e+00 263 13 -1.0000000000000000e+00 264 103 1.0000000000000000e+00 264 13 -1.0000000000000000e+00 265 28 1.0000000000000000e+00 265 13 -1.0000000000000000e+00 266 104 1.0000000000000000e+00 266 13 -1.0000000000000000e+00 267 105 1.0000000000000000e+00 267 13 -1.0000000000000000e+00 268 13 -1.0000000000000000e+00 268 484 1.0000000000000000e+00 269 115 1.0000000000000000e+00 269 13 -1.0000000000000000e+00 270 13 -1.0000000000000000e+00 270 511 1.0000000000000000e+00 271 129 1.0000000000000000e+00 271 13 -1.0000000000000000e+00 272 128 1.0000000000000000e+00 272 13 -1.0000000000000000e+00 273 130 1.0000000000000000e+00 273 13 -1.0000000000000000e+00 274 13 -1.0000000000000000e+00 274 513 1.0000000000000000e+00 275 13 -1.0000000000000000e+00 275 427 1.0000000000000000e+00 276 54 1.0000000000000000e+00 276 374 -1.0000000000000000e+00 277 129 1.0000000000000000e+00 277 374 -1.0000000000000000e+00 278 56 1.0000000000000000e+00 278 374 -1.0000000000000000e+00 279 128 1.0000000000000000e+00 279 374 -1.0000000000000000e+00 280 130 1.0000000000000000e+00 280 374 -1.0000000000000000e+00 281 131 1.0000000000000000e+00 281 374 -1.0000000000000000e+00 282 55 1.0000000000000000e+00 282 374 -1.0000000000000000e+00 283 132 1.0000000000000000e+00 283 374 -1.0000000000000000e+00 284 103 1.0000000000000000e+00 284 374 -1.0000000000000000e+00 285 122 1.0000000000000000e+00 285 374 -1.0000000000000000e+00 286 59 1.0000000000000000e+00 286 14 -1.0000000000000000e+00 287 124 1.0000000000000000e+00 287 14 -1.0000000000000000e+00 288 135 1.0000000000000000e+00 288 14 -1.0000000000000000e+00 289 136 1.0000000000000000e+00 289 14 -1.0000000000000000e+00 290 152 1.0000000000000000e+00 290 14 -1.0000000000000000e+00 291 137 1.0000000000000000e+00 291 163 -1.0000000000000000e+00 292 139 1.0000000000000000e+00 292 163 -1.0000000000000000e+00 293 136 1.0000000000000000e+00 293 628 -1.0000000000000000e+00 294 208 1.0000000000000000e+00 294 186 -1.0000000000000000e+00 295 760 1.0000000000000000e+00 295 186 -1.0000000000000000e+00 296 59 1.0000000000000000e+00 296 186 -1.0000000000000000e+00 297 139 1.0000000000000000e+00 297 186 -1.0000000000000000e+00 298 301 1.0000000000000000e+00 298 186 -1.0000000000000000e+00 299 140 1.0000000000000000e+00 299 186 -1.0000000000000000e+00 300 263 1.0000000000000000e+00 300 186 -1.0000000000000000e+00 301 479 1.0000000000000000e+00 301 186 -1.0000000000000000e+00 302 136 1.0000000000000000e+00 302 186 -1.0000000000000000e+00 303 143 1.0000000000000000e+00 303 186 -1.0000000000000000e+00 304 144 1.0000000000000000e+00 304 186 -1.0000000000000000e+00 305 445 1.0000000000000000e+00 305 186 -1.0000000000000000e+00 306 145 1.0000000000000000e+00 306 186 -1.0000000000000000e+00 307 338 1.0000000000000000e+00 307 186 -1.0000000000000000e+00 308 232 1.0000000000000000e+00 308 186 -1.0000000000000000e+00 309 46 1.0000000000000000e+00 309 186 -1.0000000000000000e+00 310 124 1.0000000000000000e+00 310 186 -1.0000000000000000e+00 311 146 1.0000000000000000e+00 311 186 -1.0000000000000000e+00 312 147 1.0000000000000000e+00 312 186 -1.0000000000000000e+00 313 60 1.0000000000000000e+00 313 186 -1.0000000000000000e+00 314 126 1.0000000000000000e+00 314 383 -1.0000000000000000e+00 315 60 1.0000000000000000e+00 315 383 -1.0000000000000000e+00 316 127 1.0000000000000000e+00 316 383 -1.0000000000000000e+00 317 145 1.0000000000000000e+00 317 383 -1.0000000000000000e+00 318 62 1.0000000000000000e+00 318 383 -1.0000000000000000e+00 319 144 1.0000000000000000e+00 319 383 -1.0000000000000000e+00 320 39 1.0000000000000000e+00 320 383 -1.0000000000000000e+00 321 124 1.0000000000000000e+00 321 383 -1.0000000000000000e+00 322 136 1.0000000000000000e+00 322 383 -1.0000000000000000e+00 323 60 1.0000000000000000e+00 323 15 -1.0000000000000000e+00 324 39 1.0000000000000000e+00 324 15 -1.0000000000000000e+00 325 61 1.0000000000000000e+00 325 15 -1.0000000000000000e+00 326 62 1.0000000000000000e+00 326 15 -1.0000000000000000e+00 327 15 -1.0000000000000000e+00 327 480 1.0000000000000000e+00 328 63 1.0000000000000000e+00 328 15 -1.0000000000000000e+00 329 15 -1.0000000000000000e+00 329 283 1.0000000000000000e+00 330 15 -1.0000000000000000e+00 330 287 1.0000000000000000e+00 331 74 1.0000000000000000e+00 331 15 -1.0000000000000000e+00 332 75 1.0000000000000000e+00 332 15 -1.0000000000000000e+00 333 15 -1.0000000000000000e+00 333 286 1.0000000000000000e+00 334 107 1.0000000000000000e+00 334 15 -1.0000000000000000e+00 335 106 1.0000000000000000e+00 335 15 -1.0000000000000000e+00 336 108 1.0000000000000000e+00 336 15 -1.0000000000000000e+00 337 109 1.0000000000000000e+00 337 15 -1.0000000000000000e+00 338 43 1.0000000000000000e+00 338 15 -1.0000000000000000e+00 339 110 1.0000000000000000e+00 339 15 -1.0000000000000000e+00 340 15 -1.0000000000000000e+00 340 252 1.0000000000000000e+00 341 113 1.0000000000000000e+00 341 15 -1.0000000000000000e+00 342 15 -1.0000000000000000e+00 342 251 1.0000000000000000e+00 343 15 -1.0000000000000000e+00 343 189 1.0000000000000000e+00 344 15 -1.0000000000000000e+00 344 338 1.0000000000000000e+00 345 145 1.0000000000000000e+00 345 15 -1.0000000000000000e+00 346 15 -1.0000000000000000e+00 346 479 1.0000000000000000e+00 347 147 1.0000000000000000e+00 347 15 -1.0000000000000000e+00 348 40 1.0000000000000000e+00 348 15 -1.0000000000000000e+00 349 88 1.0000000000000000e+00 349 16 -1.0000000000000000e+00 350 85 1.0000000000000000e+00 350 16 -1.0000000000000000e+00 351 91 1.0000000000000000e+00 351 16 -1.0000000000000000e+00 352 64 1.0000000000000000e+00 352 16 -1.0000000000000000e+00 353 87 1.0000000000000000e+00 353 16 -1.0000000000000000e+00 354 149 1.0000000000000000e+00 354 16 -1.0000000000000000e+00 355 79 1.0000000000000000e+00 355 16 -1.0000000000000000e+00 356 77 1.0000000000000000e+00 356 16 -1.0000000000000000e+00 357 66 1.0000000000000000e+00 357 16 -1.0000000000000000e+00 358 45 1.0000000000000000e+00 358 16 -1.0000000000000000e+00 359 67 1.0000000000000000e+00 359 16 -1.0000000000000000e+00 360 76 1.0000000000000000e+00 360 16 -1.0000000000000000e+00 361 80 1.0000000000000000e+00 361 16 -1.0000000000000000e+00 362 84 1.0000000000000000e+00 362 16 -1.0000000000000000e+00 363 27 1.0000000000000000e+00 363 16 -1.0000000000000000e+00 364 119 1.0000000000000000e+00 364 16 -1.0000000000000000e+00 365 150 1.0000000000000000e+00 365 16 -1.0000000000000000e+00 366 64 1.0000000000000000e+00 366 17 -1.0000000000000000e+00 367 45 1.0000000000000000e+00 367 17 -1.0000000000000000e+00 368 65 1.0000000000000000e+00 368 17 -1.0000000000000000e+00 369 66 1.0000000000000000e+00 369 17 -1.0000000000000000e+00 370 67 1.0000000000000000e+00 370 17 -1.0000000000000000e+00 371 68 1.0000000000000000e+00 371 17 -1.0000000000000000e+00 372 17 -1.0000000000000000e+00 372 301 1.0000000000000000e+00 373 17 -1.0000000000000000e+00 373 303 1.0000000000000000e+00 374 137 1.0000000000000000e+00 374 17 -1.0000000000000000e+00 375 138 1.0000000000000000e+00 375 17 -1.0000000000000000e+00 376 17 -1.0000000000000000e+00 376 262 1.0000000000000000e+00 377 139 1.0000000000000000e+00 377 17 -1.0000000000000000e+00 378 17 -1.0000000000000000e+00 378 329 1.0000000000000000e+00 379 141 1.0000000000000000e+00 379 17 -1.0000000000000000e+00 380 17 -1.0000000000000000e+00 380 328 1.0000000000000000e+00 381 17 -1.0000000000000000e+00 381 227 1.0000000000000000e+00 382 142 1.0000000000000000e+00 382 17 -1.0000000000000000e+00 383 17 -1.0000000000000000e+00 383 304 1.0000000000000000e+00 384 147 1.0000000000000000e+00 384 17 -1.0000000000000000e+00 385 46 1.0000000000000000e+00 385 17 -1.0000000000000000e+00 386 149 1.0000000000000000e+00 386 17 -1.0000000000000000e+00 387 17 -1.0000000000000000e+00 387 354 1.0000000000000000e+00 388 150 1.0000000000000000e+00 388 17 -1.0000000000000000e+00 389 151 1.0000000000000000e+00 389 17 -1.0000000000000000e+00 390 17 -1.0000000000000000e+00 390 327 1.0000000000000000e+00 391 77 1.0000000000000000e+00 391 17 -1.0000000000000000e+00 392 69 1.0000000000000000e+00 392 154 -1.0000000000000000e+00 393 107 1.0000000000000000e+00 393 154 -1.0000000000000000e+00 394 70 1.0000000000000000e+00 394 154 -1.0000000000000000e+00 395 106 1.0000000000000000e+00 395 154 -1.0000000000000000e+00 396 108 1.0000000000000000e+00 396 154 -1.0000000000000000e+00 397 110 1.0000000000000000e+00 397 154 -1.0000000000000000e+00 398 71 1.0000000000000000e+00 398 185 -1.0000000000000000e+00 399 69 1.0000000000000000e+00 399 185 -1.0000000000000000e+00 400 72 1.0000000000000000e+00 400 185 -1.0000000000000000e+00 401 76 1.0000000000000000e+00 401 185 -1.0000000000000000e+00 402 18 -1.0000000000000000e+00 402 352 1.0000000000000000e+00 403 69 1.0000000000000000e+00 403 18 -1.0000000000000000e+00 404 70 1.0000000000000000e+00 404 18 -1.0000000000000000e+00 405 71 1.0000000000000000e+00 405 18 -1.0000000000000000e+00 406 72 1.0000000000000000e+00 406 18 -1.0000000000000000e+00 407 73 1.0000000000000000e+00 407 18 -1.0000000000000000e+00 408 77 1.0000000000000000e+00 408 18 -1.0000000000000000e+00 409 76 1.0000000000000000e+00 409 18 -1.0000000000000000e+00 410 78 1.0000000000000000e+00 410 18 -1.0000000000000000e+00 411 79 1.0000000000000000e+00 411 18 -1.0000000000000000e+00 412 80 1.0000000000000000e+00 412 18 -1.0000000000000000e+00 413 18 -1.0000000000000000e+00 413 252 1.0000000000000000e+00 414 110 1.0000000000000000e+00 414 18 -1.0000000000000000e+00 415 111 1.0000000000000000e+00 415 18 -1.0000000000000000e+00 416 107 1.0000000000000000e+00 416 18 -1.0000000000000000e+00 417 112 1.0000000000000000e+00 417 18 -1.0000000000000000e+00 418 58 1.0000000000000000e+00 418 18 -1.0000000000000000e+00 419 18 -1.0000000000000000e+00 419 327 1.0000000000000000e+00 420 18 -1.0000000000000000e+00 420 326 1.0000000000000000e+00 421 18 -1.0000000000000000e+00 421 322 1.0000000000000000e+00 422 40 1.0000000000000000e+00 422 18 -1.0000000000000000e+00 423 119 1.0000000000000000e+00 423 18 -1.0000000000000000e+00 424 148 1.0000000000000000e+00 424 18 -1.0000000000000000e+00 425 147 1.0000000000000000e+00 425 18 -1.0000000000000000e+00 426 149 1.0000000000000000e+00 426 18 -1.0000000000000000e+00 427 64 1.0000000000000000e+00 427 18 -1.0000000000000000e+00 428 74 1.0000000000000000e+00 428 174 -1.0000000000000000e+00 429 136 1.0000000000000000e+00 429 174 -1.0000000000000000e+00 430 143 1.0000000000000000e+00 430 174 -1.0000000000000000e+00 431 135 1.0000000000000000e+00 431 174 -1.0000000000000000e+00 432 145 1.0000000000000000e+00 432 174 -1.0000000000000000e+00 433 75 1.0000000000000000e+00 433 155 -1.0000000000000000e+00 434 106 1.0000000000000000e+00 434 155 -1.0000000000000000e+00 435 76 1.0000000000000000e+00 435 171 -1.0000000000000000e+00 436 78 1.0000000000000000e+00 436 171 -1.0000000000000000e+00 437 150 1.0000000000000000e+00 437 171 -1.0000000000000000e+00 438 77 1.0000000000000000e+00 438 171 -1.0000000000000000e+00 439 151 1.0000000000000000e+00 439 171 -1.0000000000000000e+00 440 149 1.0000000000000000e+00 440 171 -1.0000000000000000e+00 441 82 1.0000000000000000e+00 441 19 -1.0000000000000000e+00 442 152 1.0000000000000000e+00 442 19 -1.0000000000000000e+00 443 83 1.0000000000000000e+00 443 653 -1.0000000000000000e+00 444 88 1.0000000000000000e+00 444 393 -1.0000000000000000e+00 445 89 1.0000000000000000e+00 445 393 -1.0000000000000000e+00 446 92 1.0000000000000000e+00 446 393 -1.0000000000000000e+00 447 93 1.0000000000000000e+00 447 393 -1.0000000000000000e+00 448 99 1.0000000000000000e+00 448 393 -1.0000000000000000e+00 449 102 1.0000000000000000e+00 449 393 -1.0000000000000000e+00 450 103 1.0000000000000000e+00 450 393 -1.0000000000000000e+00 451 90 1.0000000000000000e+00 451 393 -1.0000000000000000e+00 452 118 1.0000000000000000e+00 452 393 -1.0000000000000000e+00 453 121 1.0000000000000000e+00 453 393 -1.0000000000000000e+00 454 122 1.0000000000000000e+00 454 393 -1.0000000000000000e+00 455 123 1.0000000000000000e+00 455 393 -1.0000000000000000e+00 456 126 1.0000000000000000e+00 456 393 -1.0000000000000000e+00 457 99 1.0000000000000000e+00 457 20 -1.0000000000000000e+00 458 95 1.0000000000000000e+00 458 20 -1.0000000000000000e+00 459 100 1.0000000000000000e+00 459 20 -1.0000000000000000e+00 460 115 1.0000000000000000e+00 460 20 -1.0000000000000000e+00 461 97 1.0000000000000000e+00 461 20 -1.0000000000000000e+00 462 94 1.0000000000000000e+00 462 20 -1.0000000000000000e+00 463 98 1.0000000000000000e+00 463 20 -1.0000000000000000e+00 464 22 1.0000000000000000e+00 464 20 -1.0000000000000000e+00 465 101 1.0000000000000000e+00 465 20 -1.0000000000000000e+00 466 114 1.0000000000000000e+00 466 20 -1.0000000000000000e+00 467 49 1.0000000000000000e+00 467 20 -1.0000000000000000e+00 468 110 1.0000000000000000e+00 468 179 -1.0000000000000000e+00 469 113 1.0000000000000000e+00 469 179 -1.0000000000000000e+00 470 139 1.0000000000000000e+00 470 179 -1.0000000000000000e+00 471 141 1.0000000000000000e+00 471 179 -1.0000000000000000e+00 472 145 1.0000000000000000e+00 472 179 -1.0000000000000000e+00 473 147 1.0000000000000000e+00 473 179 -1.0000000000000000e+00 474 111 1.0000000000000000e+00 474 179 -1.0000000000000000e+00 475 149 1.0000000000000000e+00 475 179 -1.0000000000000000e+00 476 114 1.0000000000000000e+00 476 368 -1.0000000000000000e+00 477 81 1.0000000000000000e+00 477 372 -1.0000000000000000e+00 478 117 1.0000000000000000e+00 478 372 -1.0000000000000000e+00 479 263 1.0000000000000000e+00 479 372 -1.0000000000000000e+00 480 118 1.0000000000000000e+00 480 372 -1.0000000000000000e+00 481 60 1.0000000000000000e+00 481 372 -1.0000000000000000e+00 482 124 1.0000000000000000e+00 482 372 -1.0000000000000000e+00 483 125 1.0000000000000000e+00 483 372 -1.0000000000000000e+00 484 126 1.0000000000000000e+00 484 372 -1.0000000000000000e+00 485 121 1.0000000000000000e+00 485 372 -1.0000000000000000e+00 486 46 1.0000000000000000e+00 486 372 -1.0000000000000000e+00 487 133 1.0000000000000000e+00 487 377 -1.0000000000000000e+00 488 131 1.0000000000000000e+00 488 377 -1.0000000000000000e+00 489 134 1.0000000000000000e+00 489 370 -1.0000000000000000e+00 490 126 1.0000000000000000e+00 490 370 -1.0000000000000000e+00 491 135 1.0000000000000000e+00 491 21 -1.0000000000000000e+00 492 142 1.0000000000000000e+00 492 173 -1.0000000000000000e+00 493 150 1.0000000000000000e+00 493 173 -1.0000000000000000e+00 494 26 1.0000000000000000e+00 494 22 -1.0000000000000000e+00 495 22 -1.0000000000000000e+00 495 504 1.0000000000000000e+00 496 95 1.0000000000000000e+00 496 22 -1.0000000000000000e+00 497 24 1.0000000000000000e+00 497 22 -1.0000000000000000e+00 498 23 1.0000000000000000e+00 498 22 -1.0000000000000000e+00 499 25 1.0000000000000000e+00 499 22 -1.0000000000000000e+00 500 101 1.0000000000000000e+00 500 22 -1.0000000000000000e+00 501 100 1.0000000000000000e+00 501 22 -1.0000000000000000e+00 502 93 1.0000000000000000e+00 502 23 -1.0000000000000000e+00 503 36 1.0000000000000000e+00 503 23 -1.0000000000000000e+00 504 84 1.0000000000000000e+00 504 23 -1.0000000000000000e+00 505 86 1.0000000000000000e+00 505 23 -1.0000000000000000e+00 506 25 1.0000000000000000e+00 506 23 -1.0000000000000000e+00 507 24 1.0000000000000000e+00 507 23 -1.0000000000000000e+00 508 95 1.0000000000000000e+00 508 24 -1.0000000000000000e+00 509 93 1.0000000000000000e+00 509 24 -1.0000000000000000e+00 510 89 1.0000000000000000e+00 510 24 -1.0000000000000000e+00 511 99 1.0000000000000000e+00 511 24 -1.0000000000000000e+00 512 93 1.0000000000000000e+00 512 25 -1.0000000000000000e+00 513 34 1.0000000000000000e+00 513 25 -1.0000000000000000e+00 514 26 1.0000000000000000e+00 514 25 -1.0000000000000000e+00 515 116 1.0000000000000000e+00 515 25 -1.0000000000000000e+00 516 26 -1.0000000000000000e+00 516 504 1.0000000000000000e+00 517 116 1.0000000000000000e+00 517 26 -1.0000000000000000e+00 518 26 -1.0000000000000000e+00 518 831 1.0000000000000000e+00 519 26 -1.0000000000000000e+00 519 829 1.0000000000000000e+00 520 114 1.0000000000000000e+00 520 504 -1.0000000000000000e+00 521 101 1.0000000000000000e+00 521 504 -1.0000000000000000e+00 522 31 1.0000000000000000e+00 522 27 -1.0000000000000000e+00 523 32 1.0000000000000000e+00 523 27 -1.0000000000000000e+00 524 85 1.0000000000000000e+00 524 27 -1.0000000000000000e+00 525 29 1.0000000000000000e+00 525 27 -1.0000000000000000e+00 526 28 1.0000000000000000e+00 526 27 -1.0000000000000000e+00 527 30 1.0000000000000000e+00 527 27 -1.0000000000000000e+00 528 80 1.0000000000000000e+00 528 27 -1.0000000000000000e+00 529 91 1.0000000000000000e+00 529 27 -1.0000000000000000e+00 530 103 1.0000000000000000e+00 530 28 -1.0000000000000000e+00 531 104 1.0000000000000000e+00 531 28 -1.0000000000000000e+00 532 94 1.0000000000000000e+00 532 28 -1.0000000000000000e+00 533 96 1.0000000000000000e+00 533 28 -1.0000000000000000e+00 534 30 1.0000000000000000e+00 534 28 -1.0000000000000000e+00 535 29 1.0000000000000000e+00 535 28 -1.0000000000000000e+00 536 85 1.0000000000000000e+00 536 29 -1.0000000000000000e+00 537 88 1.0000000000000000e+00 537 29 -1.0000000000000000e+00 538 89 1.0000000000000000e+00 538 29 -1.0000000000000000e+00 539 103 1.0000000000000000e+00 539 29 -1.0000000000000000e+00 540 103 1.0000000000000000e+00 540 30 -1.0000000000000000e+00 541 129 1.0000000000000000e+00 541 30 -1.0000000000000000e+00 542 31 1.0000000000000000e+00 542 30 -1.0000000000000000e+00 543 54 1.0000000000000000e+00 543 30 -1.0000000000000000e+00 544 32 1.0000000000000000e+00 544 31 -1.0000000000000000e+00 545 54 1.0000000000000000e+00 545 31 -1.0000000000000000e+00 546 54 1.0000000000000000e+00 546 32 -1.0000000000000000e+00 547 58 1.0000000000000000e+00 547 32 -1.0000000000000000e+00 548 119 1.0000000000000000e+00 548 32 -1.0000000000000000e+00 549 80 1.0000000000000000e+00 549 32 -1.0000000000000000e+00 550 37 1.0000000000000000e+00 550 33 -1.0000000000000000e+00 551 38 1.0000000000000000e+00 551 33 -1.0000000000000000e+00 552 33 -1.0000000000000000e+00 552 355 1.0000000000000000e+00 553 33 -1.0000000000000000e+00 553 262 1.0000000000000000e+00 554 33 -1.0000000000000000e+00 554 831 1.0000000000000000e+00 555 34 1.0000000000000000e+00 555 33 -1.0000000000000000e+00 556 81 1.0000000000000000e+00 556 33 -1.0000000000000000e+00 557 35 1.0000000000000000e+00 557 33 -1.0000000000000000e+00 558 36 1.0000000000000000e+00 558 33 -1.0000000000000000e+00 559 48 1.0000000000000000e+00 559 33 -1.0000000000000000e+00 560 34 -1.0000000000000000e+00 560 831 1.0000000000000000e+00 561 93 1.0000000000000000e+00 561 34 -1.0000000000000000e+00 562 116 1.0000000000000000e+00 562 34 -1.0000000000000000e+00 563 34 -1.0000000000000000e+00 563 502 1.0000000000000000e+00 564 36 1.0000000000000000e+00 564 34 -1.0000000000000000e+00 565 35 1.0000000000000000e+00 565 34 -1.0000000000000000e+00 566 81 1.0000000000000000e+00 566 35 -1.0000000000000000e+00 567 93 1.0000000000000000e+00 567 35 -1.0000000000000000e+00 568 35 -1.0000000000000000e+00 568 505 1.0000000000000000e+00 569 118 1.0000000000000000e+00 569 35 -1.0000000000000000e+00 570 93 1.0000000000000000e+00 570 36 -1.0000000000000000e+00 571 37 1.0000000000000000e+00 571 36 -1.0000000000000000e+00 572 84 1.0000000000000000e+00 572 36 -1.0000000000000000e+00 573 38 1.0000000000000000e+00 573 37 -1.0000000000000000e+00 574 37 -1.0000000000000000e+00 574 831 1.0000000000000000e+00 575 37 -1.0000000000000000e+00 575 365 1.0000000000000000e+00 576 84 1.0000000000000000e+00 576 37 -1.0000000000000000e+00 577 45 1.0000000000000000e+00 577 38 -1.0000000000000000e+00 578 38 -1.0000000000000000e+00 578 262 1.0000000000000000e+00 579 84 1.0000000000000000e+00 579 38 -1.0000000000000000e+00 580 67 1.0000000000000000e+00 580 38 -1.0000000000000000e+00 581 43 1.0000000000000000e+00 581 39 -1.0000000000000000e+00 582 44 1.0000000000000000e+00 582 39 -1.0000000000000000e+00 583 39 -1.0000000000000000e+00 583 480 1.0000000000000000e+00 584 63 1.0000000000000000e+00 584 39 -1.0000000000000000e+00 585 60 1.0000000000000000e+00 585 39 -1.0000000000000000e+00 586 41 1.0000000000000000e+00 586 39 -1.0000000000000000e+00 587 40 1.0000000000000000e+00 587 39 -1.0000000000000000e+00 588 61 1.0000000000000000e+00 588 39 -1.0000000000000000e+00 589 42 1.0000000000000000e+00 589 39 -1.0000000000000000e+00 590 62 1.0000000000000000e+00 590 39 -1.0000000000000000e+00 591 127 1.0000000000000000e+00 591 39 -1.0000000000000000e+00 592 109 1.0000000000000000e+00 592 39 -1.0000000000000000e+00 593 122 1.0000000000000000e+00 593 40 -1.0000000000000000e+00 594 57 1.0000000000000000e+00 594 40 -1.0000000000000000e+00 595 119 1.0000000000000000e+00 595 40 -1.0000000000000000e+00 596 120 1.0000000000000000e+00 596 40 -1.0000000000000000e+00 597 110 1.0000000000000000e+00 597 40 -1.0000000000000000e+00 598 109 1.0000000000000000e+00 598 40 -1.0000000000000000e+00 599 61 1.0000000000000000e+00 599 40 -1.0000000000000000e+00 600 42 1.0000000000000000e+00 600 40 -1.0000000000000000e+00 601 41 1.0000000000000000e+00 601 40 -1.0000000000000000e+00 602 112 1.0000000000000000e+00 602 40 -1.0000000000000000e+00 603 148 1.0000000000000000e+00 603 40 -1.0000000000000000e+00 604 60 1.0000000000000000e+00 604 41 -1.0000000000000000e+00 605 122 1.0000000000000000e+00 605 41 -1.0000000000000000e+00 606 121 1.0000000000000000e+00 606 41 -1.0000000000000000e+00 607 126 1.0000000000000000e+00 607 41 -1.0000000000000000e+00 608 122 1.0000000000000000e+00 608 42 -1.0000000000000000e+00 609 55 1.0000000000000000e+00 609 42 -1.0000000000000000e+00 610 43 1.0000000000000000e+00 610 42 -1.0000000000000000e+00 611 131 1.0000000000000000e+00 611 42 -1.0000000000000000e+00 612 44 1.0000000000000000e+00 612 43 -1.0000000000000000e+00 613 106 1.0000000000000000e+00 613 43 -1.0000000000000000e+00 614 63 1.0000000000000000e+00 614 43 -1.0000000000000000e+00 615 109 1.0000000000000000e+00 615 43 -1.0000000000000000e+00 616 131 1.0000000000000000e+00 616 43 -1.0000000000000000e+00 617 131 1.0000000000000000e+00 617 44 -1.0000000000000000e+00 618 44 -1.0000000000000000e+00 618 536 1.0000000000000000e+00 619 44 -1.0000000000000000e+00 619 537 1.0000000000000000e+00 620 44 -1.0000000000000000e+00 620 480 1.0000000000000000e+00 621 45 -1.0000000000000000e+00 621 262 1.0000000000000000e+00 622 67 1.0000000000000000e+00 622 45 -1.0000000000000000e+00 623 68 1.0000000000000000e+00 623 45 -1.0000000000000000e+00 624 64 1.0000000000000000e+00 624 45 -1.0000000000000000e+00 625 47 1.0000000000000000e+00 625 45 -1.0000000000000000e+00 626 46 1.0000000000000000e+00 626 45 -1.0000000000000000e+00 627 65 1.0000000000000000e+00 627 45 -1.0000000000000000e+00 628 48 1.0000000000000000e+00 628 45 -1.0000000000000000e+00 629 66 1.0000000000000000e+00 629 45 -1.0000000000000000e+00 630 87 1.0000000000000000e+00 630 45 -1.0000000000000000e+00 631 138 1.0000000000000000e+00 631 45 -1.0000000000000000e+00 632 118 1.0000000000000000e+00 632 46 -1.0000000000000000e+00 633 117 1.0000000000000000e+00 633 46 -1.0000000000000000e+00 634 124 1.0000000000000000e+00 634 46 -1.0000000000000000e+00 635 125 1.0000000000000000e+00 635 46 -1.0000000000000000e+00 636 139 1.0000000000000000e+00 636 46 -1.0000000000000000e+00 637 138 1.0000000000000000e+00 637 46 -1.0000000000000000e+00 638 65 1.0000000000000000e+00 638 46 -1.0000000000000000e+00 639 48 1.0000000000000000e+00 639 46 -1.0000000000000000e+00 640 47 1.0000000000000000e+00 640 46 -1.0000000000000000e+00 641 140 1.0000000000000000e+00 641 46 -1.0000000000000000e+00 642 146 1.0000000000000000e+00 642 46 -1.0000000000000000e+00 643 64 1.0000000000000000e+00 643 47 -1.0000000000000000e+00 644 88 1.0000000000000000e+00 644 47 -1.0000000000000000e+00 645 121 1.0000000000000000e+00 645 47 -1.0000000000000000e+00 646 118 1.0000000000000000e+00 646 47 -1.0000000000000000e+00 647 118 1.0000000000000000e+00 647 48 -1.0000000000000000e+00 648 81 1.0000000000000000e+00 648 48 -1.0000000000000000e+00 649 48 -1.0000000000000000e+00 649 262 1.0000000000000000e+00 650 303 1.0000000000000000e+00 650 262 -1.0000000000000000e+00 651 68 1.0000000000000000e+00 651 262 -1.0000000000000000e+00 652 138 1.0000000000000000e+00 652 262 -1.0000000000000000e+00 653 52 1.0000000000000000e+00 653 49 -1.0000000000000000e+00 654 53 1.0000000000000000e+00 654 49 -1.0000000000000000e+00 655 115 1.0000000000000000e+00 655 49 -1.0000000000000000e+00 656 50 1.0000000000000000e+00 656 49 -1.0000000000000000e+00 657 49 -1.0000000000000000e+00 657 512 1.0000000000000000e+00 658 51 1.0000000000000000e+00 658 49 -1.0000000000000000e+00 659 98 1.0000000000000000e+00 659 49 -1.0000000000000000e+00 660 97 1.0000000000000000e+00 660 49 -1.0000000000000000e+00 661 51 1.0000000000000000e+00 661 512 -1.0000000000000000e+00 662 50 1.0000000000000000e+00 662 512 -1.0000000000000000e+00 663 115 1.0000000000000000e+00 663 50 -1.0000000000000000e+00 664 99 1.0000000000000000e+00 664 50 -1.0000000000000000e+00 665 50 -1.0000000000000000e+00 665 484 1.0000000000000000e+00 666 50 -1.0000000000000000e+00 666 511 1.0000000000000000e+00 667 51 -1.0000000000000000e+00 667 511 1.0000000000000000e+00 668 51 -1.0000000000000000e+00 668 427 1.0000000000000000e+00 669 52 1.0000000000000000e+00 669 51 -1.0000000000000000e+00 670 128 1.0000000000000000e+00 670 51 -1.0000000000000000e+00 671 53 1.0000000000000000e+00 671 52 -1.0000000000000000e+00 672 128 1.0000000000000000e+00 672 52 -1.0000000000000000e+00 673 94 1.0000000000000000e+00 673 53 -1.0000000000000000e+00 674 98 1.0000000000000000e+00 674 53 -1.0000000000000000e+00 675 128 1.0000000000000000e+00 675 53 -1.0000000000000000e+00 676 105 1.0000000000000000e+00 676 53 -1.0000000000000000e+00 677 58 1.0000000000000000e+00 677 54 -1.0000000000000000e+00 678 129 1.0000000000000000e+00 678 54 -1.0000000000000000e+00 679 56 1.0000000000000000e+00 679 54 -1.0000000000000000e+00 680 55 1.0000000000000000e+00 680 54 -1.0000000000000000e+00 681 57 1.0000000000000000e+00 681 54 -1.0000000000000000e+00 682 122 1.0000000000000000e+00 682 55 -1.0000000000000000e+00 683 131 1.0000000000000000e+00 683 55 -1.0000000000000000e+00 684 132 1.0000000000000000e+00 684 55 -1.0000000000000000e+00 685 57 1.0000000000000000e+00 685 55 -1.0000000000000000e+00 686 56 1.0000000000000000e+00 686 55 -1.0000000000000000e+00 687 129 1.0000000000000000e+00 687 56 -1.0000000000000000e+00 688 103 1.0000000000000000e+00 688 56 -1.0000000000000000e+00 689 56 -1.0000000000000000e+00 689 513 1.0000000000000000e+00 690 122 1.0000000000000000e+00 690 56 -1.0000000000000000e+00 691 122 1.0000000000000000e+00 691 57 -1.0000000000000000e+00 692 58 1.0000000000000000e+00 692 57 -1.0000000000000000e+00 693 119 1.0000000000000000e+00 693 57 -1.0000000000000000e+00 694 119 1.0000000000000000e+00 694 58 -1.0000000000000000e+00 695 73 1.0000000000000000e+00 695 58 -1.0000000000000000e+00 696 69 1.0000000000000000e+00 696 58 -1.0000000000000000e+00 697 112 1.0000000000000000e+00 697 58 -1.0000000000000000e+00 698 59 1.0000000000000000e+00 698 208 -1.0000000000000000e+00 699 336 1.0000000000000000e+00 699 208 -1.0000000000000000e+00 700 335 1.0000000000000000e+00 700 208 -1.0000000000000000e+00 701 140 1.0000000000000000e+00 701 208 -1.0000000000000000e+00 702 301 1.0000000000000000e+00 702 336 -1.0000000000000000e+00 703 139 1.0000000000000000e+00 703 336 -1.0000000000000000e+00 704 232 1.0000000000000000e+00 704 335 -1.0000000000000000e+00 705 760 1.0000000000000000e+00 705 335 -1.0000000000000000e+00 706 136 1.0000000000000000e+00 706 335 -1.0000000000000000e+00 707 59 1.0000000000000000e+00 707 760 -1.0000000000000000e+00 708 136 1.0000000000000000e+00 708 760 -1.0000000000000000e+00 709 136 1.0000000000000000e+00 709 59 -1.0000000000000000e+00 710 59 -1.0000000000000000e+00 710 445 1.0000000000000000e+00 711 124 1.0000000000000000e+00 711 59 -1.0000000000000000e+00 712 59 -1.0000000000000000e+00 712 263 1.0000000000000000e+00 713 126 1.0000000000000000e+00 713 60 -1.0000000000000000e+00 714 127 1.0000000000000000e+00 714 60 -1.0000000000000000e+00 715 145 1.0000000000000000e+00 715 60 -1.0000000000000000e+00 716 144 1.0000000000000000e+00 716 60 -1.0000000000000000e+00 717 124 1.0000000000000000e+00 717 60 -1.0000000000000000e+00 718 146 1.0000000000000000e+00 718 60 -1.0000000000000000e+00 719 62 1.0000000000000000e+00 719 60 -1.0000000000000000e+00 720 61 1.0000000000000000e+00 720 60 -1.0000000000000000e+00 721 60 -1.0000000000000000e+00 721 516 1.0000000000000000e+00 722 125 1.0000000000000000e+00 722 60 -1.0000000000000000e+00 723 145 1.0000000000000000e+00 723 61 -1.0000000000000000e+00 724 147 1.0000000000000000e+00 724 61 -1.0000000000000000e+00 725 110 1.0000000000000000e+00 725 61 -1.0000000000000000e+00 726 145 1.0000000000000000e+00 726 62 -1.0000000000000000e+00 727 62 -1.0000000000000000e+00 727 479 1.0000000000000000e+00 728 62 -1.0000000000000000e+00 728 480 1.0000000000000000e+00 729 62 -1.0000000000000000e+00 729 287 1.0000000000000000e+00 730 63 1.0000000000000000e+00 730 480 -1.0000000000000000e+00 731 127 1.0000000000000000e+00 731 480 -1.0000000000000000e+00 732 63 -1.0000000000000000e+00 732 287 1.0000000000000000e+00 733 63 -1.0000000000000000e+00 733 286 1.0000000000000000e+00 734 106 1.0000000000000000e+00 734 63 -1.0000000000000000e+00 735 88 1.0000000000000000e+00 735 64 -1.0000000000000000e+00 736 87 1.0000000000000000e+00 736 64 -1.0000000000000000e+00 737 149 1.0000000000000000e+00 737 64 -1.0000000000000000e+00 738 79 1.0000000000000000e+00 738 64 -1.0000000000000000e+00 739 119 1.0000000000000000e+00 739 64 -1.0000000000000000e+00 740 148 1.0000000000000000e+00 740 64 -1.0000000000000000e+00 741 66 1.0000000000000000e+00 741 64 -1.0000000000000000e+00 742 65 1.0000000000000000e+00 742 64 -1.0000000000000000e+00 743 91 1.0000000000000000e+00 743 64 -1.0000000000000000e+00 744 120 1.0000000000000000e+00 744 64 -1.0000000000000000e+00 745 139 1.0000000000000000e+00 745 65 -1.0000000000000000e+00 746 147 1.0000000000000000e+00 746 65 -1.0000000000000000e+00 747 149 1.0000000000000000e+00 747 65 -1.0000000000000000e+00 748 149 1.0000000000000000e+00 748 66 -1.0000000000000000e+00 749 77 1.0000000000000000e+00 749 66 -1.0000000000000000e+00 750 67 1.0000000000000000e+00 750 66 -1.0000000000000000e+00 751 150 1.0000000000000000e+00 751 66 -1.0000000000000000e+00 752 68 1.0000000000000000e+00 752 67 -1.0000000000000000e+00 753 84 1.0000000000000000e+00 753 67 -1.0000000000000000e+00 754 87 1.0000000000000000e+00 754 67 -1.0000000000000000e+00 755 150 1.0000000000000000e+00 755 67 -1.0000000000000000e+00 756 68 -1.0000000000000000e+00 756 303 1.0000000000000000e+00 757 150 1.0000000000000000e+00 757 68 -1.0000000000000000e+00 758 68 -1.0000000000000000e+00 758 304 1.0000000000000000e+00 759 72 1.0000000000000000e+00 759 69 -1.0000000000000000e+00 760 73 1.0000000000000000e+00 760 69 -1.0000000000000000e+00 761 107 1.0000000000000000e+00 761 69 -1.0000000000000000e+00 762 70 1.0000000000000000e+00 762 69 -1.0000000000000000e+00 763 69 -1.0000000000000000e+00 763 352 1.0000000000000000e+00 764 71 1.0000000000000000e+00 764 69 -1.0000000000000000e+00 765 112 1.0000000000000000e+00 765 69 -1.0000000000000000e+00 766 71 1.0000000000000000e+00 766 352 -1.0000000000000000e+00 767 70 1.0000000000000000e+00 767 352 -1.0000000000000000e+00 768 107 1.0000000000000000e+00 768 70 -1.0000000000000000e+00 769 110 1.0000000000000000e+00 769 70 -1.0000000000000000e+00 770 70 -1.0000000000000000e+00 770 252 1.0000000000000000e+00 771 70 -1.0000000000000000e+00 771 326 1.0000000000000000e+00 772 71 -1.0000000000000000e+00 772 326 1.0000000000000000e+00 773 71 -1.0000000000000000e+00 773 322 1.0000000000000000e+00 774 72 1.0000000000000000e+00 774 71 -1.0000000000000000e+00 775 76 1.0000000000000000e+00 775 71 -1.0000000000000000e+00 776 73 1.0000000000000000e+00 776 72 -1.0000000000000000e+00 777 76 1.0000000000000000e+00 777 72 -1.0000000000000000e+00 778 76 1.0000000000000000e+00 778 73 -1.0000000000000000e+00 779 80 1.0000000000000000e+00 779 73 -1.0000000000000000e+00 780 119 1.0000000000000000e+00 780 73 -1.0000000000000000e+00 781 74 1.0000000000000000e+00 781 287 -1.0000000000000000e+00 782 75 1.0000000000000000e+00 782 287 -1.0000000000000000e+00 783 75 1.0000000000000000e+00 783 283 -1.0000000000000000e+00 784 74 1.0000000000000000e+00 784 283 -1.0000000000000000e+00 785 74 -1.0000000000000000e+00 785 479 1.0000000000000000e+00 786 145 1.0000000000000000e+00 786 74 -1.0000000000000000e+00 787 74 -1.0000000000000000e+00 787 338 1.0000000000000000e+00 788 74 -1.0000000000000000e+00 788 251 1.0000000000000000e+00 789 75 -1.0000000000000000e+00 789 251 1.0000000000000000e+00 790 75 -1.0000000000000000e+00 790 189 1.0000000000000000e+00 791 75 -1.0000000000000000e+00 791 286 1.0000000000000000e+00 792 106 1.0000000000000000e+00 792 75 -1.0000000000000000e+00 793 106 1.0000000000000000e+00 793 286 -1.0000000000000000e+00 794 80 1.0000000000000000e+00 794 76 -1.0000000000000000e+00 795 76 -1.0000000000000000e+00 795 322 1.0000000000000000e+00 796 78 1.0000000000000000e+00 796 76 -1.0000000000000000e+00 797 77 1.0000000000000000e+00 797 76 -1.0000000000000000e+00 798 79 1.0000000000000000e+00 798 76 -1.0000000000000000e+00 799 149 1.0000000000000000e+00 799 77 -1.0000000000000000e+00 800 150 1.0000000000000000e+00 800 77 -1.0000000000000000e+00 801 151 1.0000000000000000e+00 801 77 -1.0000000000000000e+00 802 79 1.0000000000000000e+00 802 77 -1.0000000000000000e+00 803 78 1.0000000000000000e+00 803 77 -1.0000000000000000e+00 804 78 -1.0000000000000000e+00 804 322 1.0000000000000000e+00 805 78 -1.0000000000000000e+00 805 326 1.0000000000000000e+00 806 78 -1.0000000000000000e+00 806 327 1.0000000000000000e+00 807 149 1.0000000000000000e+00 807 78 -1.0000000000000000e+00 808 149 1.0000000000000000e+00 808 79 -1.0000000000000000e+00 809 80 1.0000000000000000e+00 809 79 -1.0000000000000000e+00 810 119 1.0000000000000000e+00 810 79 -1.0000000000000000e+00 811 119 1.0000000000000000e+00 811 80 -1.0000000000000000e+00 812 91 1.0000000000000000e+00 812 80 -1.0000000000000000e+00 813 831 1.0000000000000000e+00 813 355 -1.0000000000000000e+00 814 82 1.0000000000000000e+00 814 355 -1.0000000000000000e+00 815 81 1.0000000000000000e+00 815 355 -1.0000000000000000e+00 816 152 1.0000000000000000e+00 816 357 -1.0000000000000000e+00 817 81 1.0000000000000000e+00 817 357 -1.0000000000000000e+00 818 82 1.0000000000000000e+00 818 357 -1.0000000000000000e+00 819 118 1.0000000000000000e+00 819 81 -1.0000000000000000e+00 820 152 1.0000000000000000e+00 820 81 -1.0000000000000000e+00 821 81 -1.0000000000000000e+00 821 507 1.0000000000000000e+00 822 117 1.0000000000000000e+00 822 81 -1.0000000000000000e+00 823 81 -1.0000000000000000e+00 823 506 1.0000000000000000e+00 824 83 1.0000000000000000e+00 824 831 -1.0000000000000000e+00 825 365 1.0000000000000000e+00 825 831 -1.0000000000000000e+00 826 83 1.0000000000000000e+00 826 365 -1.0000000000000000e+00 827 83 -1.0000000000000000e+00 827 829 1.0000000000000000e+00 828 86 1.0000000000000000e+00 828 84 -1.0000000000000000e+00 829 85 1.0000000000000000e+00 829 84 -1.0000000000000000e+00 830 87 1.0000000000000000e+00 830 84 -1.0000000000000000e+00 831 88 1.0000000000000000e+00 831 85 -1.0000000000000000e+00 832 91 1.0000000000000000e+00 832 85 -1.0000000000000000e+00 833 87 1.0000000000000000e+00 833 85 -1.0000000000000000e+00 834 86 1.0000000000000000e+00 834 85 -1.0000000000000000e+00 835 88 1.0000000000000000e+00 835 86 -1.0000000000000000e+00 836 89 1.0000000000000000e+00 836 86 -1.0000000000000000e+00 837 93 1.0000000000000000e+00 837 86 -1.0000000000000000e+00 838 88 1.0000000000000000e+00 838 87 -1.0000000000000000e+00 839 91 1.0000000000000000e+00 839 88 -1.0000000000000000e+00 840 89 1.0000000000000000e+00 840 88 -1.0000000000000000e+00 841 92 1.0000000000000000e+00 841 88 -1.0000000000000000e+00 842 121 1.0000000000000000e+00 842 88 -1.0000000000000000e+00 843 90 1.0000000000000000e+00 843 88 -1.0000000000000000e+00 844 120 1.0000000000000000e+00 844 88 -1.0000000000000000e+00 845 92 1.0000000000000000e+00 845 89 -1.0000000000000000e+00 846 93 1.0000000000000000e+00 846 89 -1.0000000000000000e+00 847 89 -1.0000000000000000e+00 847 485 1.0000000000000000e+00 848 99 1.0000000000000000e+00 848 89 -1.0000000000000000e+00 849 102 1.0000000000000000e+00 849 89 -1.0000000000000000e+00 850 103 1.0000000000000000e+00 850 89 -1.0000000000000000e+00 851 90 1.0000000000000000e+00 851 89 -1.0000000000000000e+00 852 96 1.0000000000000000e+00 852 89 -1.0000000000000000e+00 853 103 1.0000000000000000e+00 853 90 -1.0000000000000000e+00 854 121 1.0000000000000000e+00 854 90 -1.0000000000000000e+00 855 122 1.0000000000000000e+00 855 90 -1.0000000000000000e+00 856 90 -1.0000000000000000e+00 856 513 1.0000000000000000e+00 857 119 1.0000000000000000e+00 857 91 -1.0000000000000000e+00 858 93 1.0000000000000000e+00 858 92 -1.0000000000000000e+00 859 92 -1.0000000000000000e+00 859 505 1.0000000000000000e+00 860 118 1.0000000000000000e+00 860 92 -1.0000000000000000e+00 861 121 1.0000000000000000e+00 861 92 -1.0000000000000000e+00 862 93 -1.0000000000000000e+00 862 485 1.0000000000000000e+00 863 93 -1.0000000000000000e+00 863 505 1.0000000000000000e+00 864 93 -1.0000000000000000e+00 864 502 1.0000000000000000e+00 865 99 1.0000000000000000e+00 865 485 -1.0000000000000000e+00 866 98 1.0000000000000000e+00 866 94 -1.0000000000000000e+00 867 96 1.0000000000000000e+00 867 94 -1.0000000000000000e+00 868 95 1.0000000000000000e+00 868 94 -1.0000000000000000e+00 869 97 1.0000000000000000e+00 869 94 -1.0000000000000000e+00 870 105 1.0000000000000000e+00 870 94 -1.0000000000000000e+00 871 104 1.0000000000000000e+00 871 94 -1.0000000000000000e+00 872 99 1.0000000000000000e+00 872 95 -1.0000000000000000e+00 873 100 1.0000000000000000e+00 873 95 -1.0000000000000000e+00 874 97 1.0000000000000000e+00 874 95 -1.0000000000000000e+00 875 96 1.0000000000000000e+00 875 95 -1.0000000000000000e+00 876 99 1.0000000000000000e+00 876 96 -1.0000000000000000e+00 877 103 1.0000000000000000e+00 877 96 -1.0000000000000000e+00 878 99 1.0000000000000000e+00 878 97 -1.0000000000000000e+00 879 115 1.0000000000000000e+00 879 97 -1.0000000000000000e+00 880 98 1.0000000000000000e+00 880 97 -1.0000000000000000e+00 881 100 1.0000000000000000e+00 881 99 -1.0000000000000000e+00 882 102 1.0000000000000000e+00 882 99 -1.0000000000000000e+00 883 115 1.0000000000000000e+00 883 99 -1.0000000000000000e+00 884 99 -1.0000000000000000e+00 884 484 1.0000000000000000e+00 885 99 -1.0000000000000000e+00 885 486 1.0000000000000000e+00 886 101 1.0000000000000000e+00 886 100 -1.0000000000000000e+00 887 114 1.0000000000000000e+00 887 100 -1.0000000000000000e+00 888 115 1.0000000000000000e+00 888 100 -1.0000000000000000e+00 889 114 1.0000000000000000e+00 889 101 -1.0000000000000000e+00 890 102 -1.0000000000000000e+00 890 511 1.0000000000000000e+00 891 102 -1.0000000000000000e+00 891 484 1.0000000000000000e+00 892 103 1.0000000000000000e+00 892 102 -1.0000000000000000e+00 893 102 -1.0000000000000000e+00 893 513 1.0000000000000000e+00 894 104 1.0000000000000000e+00 894 103 -1.0000000000000000e+00 895 129 1.0000000000000000e+00 895 103 -1.0000000000000000e+00 896 103 -1.0000000000000000e+00 896 513 1.0000000000000000e+00 897 130 1.0000000000000000e+00 897 103 -1.0000000000000000e+00 898 105 1.0000000000000000e+00 898 104 -1.0000000000000000e+00 899 128 1.0000000000000000e+00 899 104 -1.0000000000000000e+00 900 129 1.0000000000000000e+00 900 104 -1.0000000000000000e+00 901 128 1.0000000000000000e+00 901 105 -1.0000000000000000e+00 902 106 -1.0000000000000000e+00 902 189 1.0000000000000000e+00 903 108 1.0000000000000000e+00 903 106 -1.0000000000000000e+00 904 107 1.0000000000000000e+00 904 106 -1.0000000000000000e+00 905 109 1.0000000000000000e+00 905 106 -1.0000000000000000e+00 906 110 1.0000000000000000e+00 906 107 -1.0000000000000000e+00 907 112 1.0000000000000000e+00 907 107 -1.0000000000000000e+00 908 109 1.0000000000000000e+00 908 107 -1.0000000000000000e+00 909 108 1.0000000000000000e+00 909 107 -1.0000000000000000e+00 910 108 -1.0000000000000000e+00 910 189 1.0000000000000000e+00 911 110 1.0000000000000000e+00 911 108 -1.0000000000000000e+00 912 108 -1.0000000000000000e+00 912 252 1.0000000000000000e+00 913 108 -1.0000000000000000e+00 913 251 1.0000000000000000e+00 914 110 1.0000000000000000e+00 914 109 -1.0000000000000000e+00 915 112 1.0000000000000000e+00 915 110 -1.0000000000000000e+00 916 110 -1.0000000000000000e+00 916 252 1.0000000000000000e+00 917 113 1.0000000000000000e+00 917 110 -1.0000000000000000e+00 918 147 1.0000000000000000e+00 918 110 -1.0000000000000000e+00 919 111 1.0000000000000000e+00 919 110 -1.0000000000000000e+00 920 148 1.0000000000000000e+00 920 110 -1.0000000000000000e+00 921 113 1.0000000000000000e+00 921 252 -1.0000000000000000e+00 922 111 1.0000000000000000e+00 922 252 -1.0000000000000000e+00 923 147 1.0000000000000000e+00 923 111 -1.0000000000000000e+00 924 111 -1.0000000000000000e+00 924 326 1.0000000000000000e+00 925 149 1.0000000000000000e+00 925 111 -1.0000000000000000e+00 926 111 -1.0000000000000000e+00 926 327 1.0000000000000000e+00 927 119 1.0000000000000000e+00 927 112 -1.0000000000000000e+00 928 145 1.0000000000000000e+00 928 113 -1.0000000000000000e+00 929 147 1.0000000000000000e+00 929 113 -1.0000000000000000e+00 930 113 -1.0000000000000000e+00 930 251 1.0000000000000000e+00 931 113 -1.0000000000000000e+00 931 338 1.0000000000000000e+00 932 114 -1.0000000000000000e+00 932 410 1.0000000000000000e+00 933 114 -1.0000000000000000e+00 933 486 1.0000000000000000e+00 934 115 1.0000000000000000e+00 934 114 -1.0000000000000000e+00 935 114 -1.0000000000000000e+00 935 503 1.0000000000000000e+00 936 114 -1.0000000000000000e+00 936 487 1.0000000000000000e+00 937 115 -1.0000000000000000e+00 937 486 1.0000000000000000e+00 938 118 1.0000000000000000e+00 938 505 -1.0000000000000000e+00 939 263 1.0000000000000000e+00 939 507 -1.0000000000000000e+00 940 117 1.0000000000000000e+00 940 507 -1.0000000000000000e+00 941 118 1.0000000000000000e+00 941 506 -1.0000000000000000e+00 942 118 1.0000000000000000e+00 942 117 -1.0000000000000000e+00 943 117 -1.0000000000000000e+00 943 263 1.0000000000000000e+00 944 124 1.0000000000000000e+00 944 117 -1.0000000000000000e+00 945 420 1.0000000000000000e+00 945 263 -1.0000000000000000e+00 946 124 1.0000000000000000e+00 946 263 -1.0000000000000000e+00 947 152 1.0000000000000000e+00 947 263 -1.0000000000000000e+00 948 140 1.0000000000000000e+00 948 263 -1.0000000000000000e+00 949 124 1.0000000000000000e+00 949 420 -1.0000000000000000e+00 950 118 -1.0000000000000000e+00 950 500 1.0000000000000000e+00 951 121 1.0000000000000000e+00 951 118 -1.0000000000000000e+00 952 125 1.0000000000000000e+00 952 118 -1.0000000000000000e+00 953 126 1.0000000000000000e+00 953 500 -1.0000000000000000e+00 954 121 1.0000000000000000e+00 954 500 -1.0000000000000000e+00 955 120 1.0000000000000000e+00 955 119 -1.0000000000000000e+00 956 148 1.0000000000000000e+00 956 119 -1.0000000000000000e+00 957 121 1.0000000000000000e+00 957 120 -1.0000000000000000e+00 958 122 1.0000000000000000e+00 958 120 -1.0000000000000000e+00 959 122 1.0000000000000000e+00 959 121 -1.0000000000000000e+00 960 123 1.0000000000000000e+00 960 121 -1.0000000000000000e+00 961 126 1.0000000000000000e+00 961 121 -1.0000000000000000e+00 962 125 1.0000000000000000e+00 962 121 -1.0000000000000000e+00 963 123 1.0000000000000000e+00 963 122 -1.0000000000000000e+00 964 122 -1.0000000000000000e+00 964 513 1.0000000000000000e+00 965 132 1.0000000000000000e+00 965 122 -1.0000000000000000e+00 966 123 -1.0000000000000000e+00 966 514 1.0000000000000000e+00 967 123 -1.0000000000000000e+00 967 513 1.0000000000000000e+00 968 126 1.0000000000000000e+00 968 123 -1.0000000000000000e+00 969 123 -1.0000000000000000e+00 969 495 1.0000000000000000e+00 970 124 -1.0000000000000000e+00 970 445 1.0000000000000000e+00 971 125 1.0000000000000000e+00 971 124 -1.0000000000000000e+00 972 146 1.0000000000000000e+00 972 124 -1.0000000000000000e+00 973 124 -1.0000000000000000e+00 973 516 1.0000000000000000e+00 974 140 1.0000000000000000e+00 974 124 -1.0000000000000000e+00 975 144 1.0000000000000000e+00 975 124 -1.0000000000000000e+00 976 126 1.0000000000000000e+00 976 125 -1.0000000000000000e+00 977 126 1.0000000000000000e+00 977 516 -1.0000000000000000e+00 978 136 1.0000000000000000e+00 978 445 -1.0000000000000000e+00 979 144 1.0000000000000000e+00 979 445 -1.0000000000000000e+00 980 127 1.0000000000000000e+00 980 126 -1.0000000000000000e+00 981 126 -1.0000000000000000e+00 981 444 1.0000000000000000e+00 982 126 -1.0000000000000000e+00 982 495 1.0000000000000000e+00 983 126 -1.0000000000000000e+00 983 417 1.0000000000000000e+00 984 134 1.0000000000000000e+00 984 126 -1.0000000000000000e+00 985 127 -1.0000000000000000e+00 985 537 1.0000000000000000e+00 986 127 -1.0000000000000000e+00 986 444 1.0000000000000000e+00 987 130 1.0000000000000000e+00 987 511 -1.0000000000000000e+00 988 128 -1.0000000000000000e+00 988 427 1.0000000000000000e+00 989 130 1.0000000000000000e+00 989 128 -1.0000000000000000e+00 990 129 1.0000000000000000e+00 990 128 -1.0000000000000000e+00 991 130 1.0000000000000000e+00 991 129 -1.0000000000000000e+00 992 130 -1.0000000000000000e+00 992 427 1.0000000000000000e+00 993 130 -1.0000000000000000e+00 993 513 1.0000000000000000e+00 994 132 1.0000000000000000e+00 994 513 -1.0000000000000000e+00 995 131 -1.0000000000000000e+00 995 536 1.0000000000000000e+00 996 132 1.0000000000000000e+00 996 131 -1.0000000000000000e+00 997 131 -1.0000000000000000e+00 997 515 1.0000000000000000e+00 998 133 1.0000000000000000e+00 998 131 -1.0000000000000000e+00 999 133 1.0000000000000000e+00 999 515 -1.0000000000000000e+00 1000 132 1.0000000000000000e+00 1000 515 -1.0000000000000000e+00 1001 132 -1.0000000000000000e+00 1001 514 1.0000000000000000e+00 1002 133 -1.0000000000000000e+00 1002 514 1.0000000000000000e+00 1003 133 -1.0000000000000000e+00 1003 433 1.0000000000000000e+00 1004 133 -1.0000000000000000e+00 1004 536 1.0000000000000000e+00 1005 133 -1.0000000000000000e+00 1005 537 1.0000000000000000e+00 1006 134 1.0000000000000000e+00 1006 514 -1.0000000000000000e+00 1007 134 1.0000000000000000e+00 1007 537 -1.0000000000000000e+00 1008 134 1.0000000000000000e+00 1008 444 -1.0000000000000000e+00 1009 134 -1.0000000000000000e+00 1009 433 1.0000000000000000e+00 1010 134 -1.0000000000000000e+00 1010 495 1.0000000000000000e+00 1011 136 1.0000000000000000e+00 1011 135 -1.0000000000000000e+00 1012 135 -1.0000000000000000e+00 1012 479 1.0000000000000000e+00 1013 135 -1.0000000000000000e+00 1013 300 1.0000000000000000e+00 1014 135 -1.0000000000000000e+00 1014 232 1.0000000000000000e+00 1015 136 1.0000000000000000e+00 1015 232 -1.0000000000000000e+00 1016 143 1.0000000000000000e+00 1016 232 -1.0000000000000000e+00 1017 143 1.0000000000000000e+00 1017 136 -1.0000000000000000e+00 1018 136 -1.0000000000000000e+00 1018 479 1.0000000000000000e+00 1019 144 1.0000000000000000e+00 1019 136 -1.0000000000000000e+00 1020 145 1.0000000000000000e+00 1020 479 -1.0000000000000000e+00 1021 144 1.0000000000000000e+00 1021 479 -1.0000000000000000e+00 1022 143 1.0000000000000000e+00 1022 479 -1.0000000000000000e+00 1023 301 1.0000000000000000e+00 1023 194 -1.0000000000000000e+00 1024 137 1.0000000000000000e+00 1024 303 -1.0000000000000000e+00 1025 301 1.0000000000000000e+00 1025 303 -1.0000000000000000e+00 1026 138 1.0000000000000000e+00 1026 303 -1.0000000000000000e+00 1027 142 1.0000000000000000e+00 1027 303 -1.0000000000000000e+00 1028 139 1.0000000000000000e+00 1028 301 -1.0000000000000000e+00 1029 140 1.0000000000000000e+00 1029 301 -1.0000000000000000e+00 1030 138 1.0000000000000000e+00 1030 301 -1.0000000000000000e+00 1031 137 1.0000000000000000e+00 1031 301 -1.0000000000000000e+00 1032 141 1.0000000000000000e+00 1032 327 -1.0000000000000000e+00 1033 149 1.0000000000000000e+00 1033 327 -1.0000000000000000e+00 1034 151 1.0000000000000000e+00 1034 327 -1.0000000000000000e+00 1035 137 -1.0000000000000000e+00 1035 227 1.0000000000000000e+00 1036 139 1.0000000000000000e+00 1036 137 -1.0000000000000000e+00 1037 137 -1.0000000000000000e+00 1037 329 1.0000000000000000e+00 1038 137 -1.0000000000000000e+00 1038 328 1.0000000000000000e+00 1039 139 1.0000000000000000e+00 1039 138 -1.0000000000000000e+00 1040 140 1.0000000000000000e+00 1040 139 -1.0000000000000000e+00 1041 139 -1.0000000000000000e+00 1041 329 1.0000000000000000e+00 1042 141 1.0000000000000000e+00 1042 139 -1.0000000000000000e+00 1043 147 1.0000000000000000e+00 1043 139 -1.0000000000000000e+00 1044 139 -1.0000000000000000e+00 1044 337 1.0000000000000000e+00 1045 146 1.0000000000000000e+00 1045 139 -1.0000000000000000e+00 1046 141 1.0000000000000000e+00 1046 329 -1.0000000000000000e+00 1047 145 1.0000000000000000e+00 1047 337 -1.0000000000000000e+00 1048 338 1.0000000000000000e+00 1048 337 -1.0000000000000000e+00 1049 147 1.0000000000000000e+00 1049 337 -1.0000000000000000e+00 1050 149 1.0000000000000000e+00 1050 141 -1.0000000000000000e+00 1051 147 1.0000000000000000e+00 1051 141 -1.0000000000000000e+00 1052 141 -1.0000000000000000e+00 1052 328 1.0000000000000000e+00 1053 142 1.0000000000000000e+00 1053 328 -1.0000000000000000e+00 1054 151 1.0000000000000000e+00 1054 328 -1.0000000000000000e+00 1055 142 1.0000000000000000e+00 1055 227 -1.0000000000000000e+00 1056 142 -1.0000000000000000e+00 1056 304 1.0000000000000000e+00 1057 150 1.0000000000000000e+00 1057 142 -1.0000000000000000e+00 1058 142 -1.0000000000000000e+00 1058 354 1.0000000000000000e+00 1059 150 1.0000000000000000e+00 1059 304 -1.0000000000000000e+00 1060 145 1.0000000000000000e+00 1060 143 -1.0000000000000000e+00 1061 143 -1.0000000000000000e+00 1061 338 1.0000000000000000e+00 1062 143 -1.0000000000000000e+00 1062 333 1.0000000000000000e+00 1063 145 1.0000000000000000e+00 1063 144 -1.0000000000000000e+00 1064 145 -1.0000000000000000e+00 1064 338 1.0000000000000000e+00 1065 147 1.0000000000000000e+00 1065 145 -1.0000000000000000e+00 1066 146 1.0000000000000000e+00 1066 145 -1.0000000000000000e+00 1067 147 1.0000000000000000e+00 1067 146 -1.0000000000000000e+00 1068 149 1.0000000000000000e+00 1068 147 -1.0000000000000000e+00 1069 148 1.0000000000000000e+00 1069 147 -1.0000000000000000e+00 1070 149 1.0000000000000000e+00 1070 148 -1.0000000000000000e+00 1071 151 1.0000000000000000e+00 1071 149 -1.0000000000000000e+00 1072 151 1.0000000000000000e+00 1072 150 -1.0000000000000000e+00 1073 150 -1.0000000000000000e+00 1073 354 1.0000000000000000e+00 1074 151 1.0000000000000000e+00 1074 354 -1.0000000000000000e+00 1075 152 -1.0000000000000000e+00 1075 260 1.0000000000000000e+00 hypre-2.33.0/src/test/TEST_ams/mfem.G.00001000066400000000000000000002374611477326011500176310ustar00rootroot000000000000001076 2332 153 365 1076 188 1.0000000000000000e+00 1076 153 -1.0000000000000000e+00 1077 192 1.0000000000000000e+00 1077 153 -1.0000000000000000e+00 1078 193 1.0000000000000000e+00 1078 153 -1.0000000000000000e+00 1079 339 1.0000000000000000e+00 1079 153 -1.0000000000000000e+00 1080 343 1.0000000000000000e+00 1080 153 -1.0000000000000000e+00 1081 282 1.0000000000000000e+00 1081 153 -1.0000000000000000e+00 1082 288 1.0000000000000000e+00 1082 153 -1.0000000000000000e+00 1083 153 -1.0000000000000000e+00 1083 481 1.0000000000000000e+00 1084 284 1.0000000000000000e+00 1084 153 -1.0000000000000000e+00 1085 280 1.0000000000000000e+00 1085 153 -1.0000000000000000e+00 1086 289 1.0000000000000000e+00 1086 153 -1.0000000000000000e+00 1087 153 -1.0000000000000000e+00 1087 783 1.0000000000000000e+00 1088 291 1.0000000000000000e+00 1088 153 -1.0000000000000000e+00 1089 188 1.0000000000000000e+00 1089 154 -1.0000000000000000e+00 1090 350 1.0000000000000000e+00 1090 154 -1.0000000000000000e+00 1091 190 1.0000000000000000e+00 1091 154 -1.0000000000000000e+00 1092 349 1.0000000000000000e+00 1092 154 -1.0000000000000000e+00 1093 352 1.0000000000000000e+00 1093 154 -1.0000000000000000e+00 1094 351 1.0000000000000000e+00 1094 154 -1.0000000000000000e+00 1095 189 1.0000000000000000e+00 1095 154 -1.0000000000000000e+00 1096 251 1.0000000000000000e+00 1096 154 -1.0000000000000000e+00 1097 252 1.0000000000000000e+00 1097 154 -1.0000000000000000e+00 1098 344 1.0000000000000000e+00 1098 154 -1.0000000000000000e+00 1099 326 1.0000000000000000e+00 1099 154 -1.0000000000000000e+00 1100 251 1.0000000000000000e+00 1100 155 -1.0000000000000000e+00 1101 283 1.0000000000000000e+00 1101 155 -1.0000000000000000e+00 1102 191 1.0000000000000000e+00 1102 155 -1.0000000000000000e+00 1103 188 1.0000000000000000e+00 1103 155 -1.0000000000000000e+00 1104 189 1.0000000000000000e+00 1104 155 -1.0000000000000000e+00 1105 192 1.0000000000000000e+00 1105 155 -1.0000000000000000e+00 1106 282 1.0000000000000000e+00 1106 155 -1.0000000000000000e+00 1107 155 -1.0000000000000000e+00 1107 481 1.0000000000000000e+00 1108 284 1.0000000000000000e+00 1108 155 -1.0000000000000000e+00 1109 285 1.0000000000000000e+00 1109 155 -1.0000000000000000e+00 1110 155 -1.0000000000000000e+00 1110 482 1.0000000000000000e+00 1111 286 1.0000000000000000e+00 1111 155 -1.0000000000000000e+00 1112 287 1.0000000000000000e+00 1112 155 -1.0000000000000000e+00 1113 189 1.0000000000000000e+00 1113 156 -1.0000000000000000e+00 1114 188 1.0000000000000000e+00 1114 156 -1.0000000000000000e+00 1115 190 1.0000000000000000e+00 1115 156 -1.0000000000000000e+00 1116 191 1.0000000000000000e+00 1116 156 -1.0000000000000000e+00 1117 192 1.0000000000000000e+00 1117 156 -1.0000000000000000e+00 1118 193 1.0000000000000000e+00 1118 156 -1.0000000000000000e+00 1119 251 1.0000000000000000e+00 1119 156 -1.0000000000000000e+00 1120 252 1.0000000000000000e+00 1120 156 -1.0000000000000000e+00 1121 253 1.0000000000000000e+00 1121 156 -1.0000000000000000e+00 1122 340 1.0000000000000000e+00 1122 156 -1.0000000000000000e+00 1123 339 1.0000000000000000e+00 1123 156 -1.0000000000000000e+00 1124 341 1.0000000000000000e+00 1124 156 -1.0000000000000000e+00 1125 342 1.0000000000000000e+00 1125 156 -1.0000000000000000e+00 1126 343 1.0000000000000000e+00 1126 156 -1.0000000000000000e+00 1127 344 1.0000000000000000e+00 1127 156 -1.0000000000000000e+00 1128 314 1.0000000000000000e+00 1128 156 -1.0000000000000000e+00 1129 347 1.0000000000000000e+00 1129 156 -1.0000000000000000e+00 1130 237 1.0000000000000000e+00 1130 156 -1.0000000000000000e+00 1131 348 1.0000000000000000e+00 1131 156 -1.0000000000000000e+00 1132 288 1.0000000000000000e+00 1132 156 -1.0000000000000000e+00 1133 350 1.0000000000000000e+00 1133 156 -1.0000000000000000e+00 1134 281 1.0000000000000000e+00 1134 156 -1.0000000000000000e+00 1135 282 1.0000000000000000e+00 1135 156 -1.0000000000000000e+00 1136 353 1.0000000000000000e+00 1136 156 -1.0000000000000000e+00 1137 338 1.0000000000000000e+00 1137 156 -1.0000000000000000e+00 1138 283 1.0000000000000000e+00 1138 156 -1.0000000000000000e+00 1139 194 1.0000000000000000e+00 1139 157 -1.0000000000000000e+00 1140 198 1.0000000000000000e+00 1140 157 -1.0000000000000000e+00 1141 199 1.0000000000000000e+00 1141 157 -1.0000000000000000e+00 1142 261 1.0000000000000000e+00 1142 157 -1.0000000000000000e+00 1143 262 1.0000000000000000e+00 1143 157 -1.0000000000000000e+00 1144 303 1.0000000000000000e+00 1144 157 -1.0000000000000000e+00 1145 304 1.0000000000000000e+00 1145 157 -1.0000000000000000e+00 1146 355 1.0000000000000000e+00 1146 157 -1.0000000000000000e+00 1147 365 1.0000000000000000e+00 1147 157 -1.0000000000000000e+00 1148 194 1.0000000000000000e+00 1148 158 -1.0000000000000000e+00 1149 195 1.0000000000000000e+00 1149 158 -1.0000000000000000e+00 1150 197 1.0000000000000000e+00 1150 158 -1.0000000000000000e+00 1151 200 1.0000000000000000e+00 1151 158 -1.0000000000000000e+00 1152 158 -1.0000000000000000e+00 1152 812 1.0000000000000000e+00 1153 201 1.0000000000000000e+00 1153 158 -1.0000000000000000e+00 1154 202 1.0000000000000000e+00 1154 158 -1.0000000000000000e+00 1155 206 1.0000000000000000e+00 1155 158 -1.0000000000000000e+00 1156 207 1.0000000000000000e+00 1156 158 -1.0000000000000000e+00 1157 209 1.0000000000000000e+00 1157 158 -1.0000000000000000e+00 1158 210 1.0000000000000000e+00 1158 158 -1.0000000000000000e+00 1159 256 1.0000000000000000e+00 1159 158 -1.0000000000000000e+00 1160 259 1.0000000000000000e+00 1160 158 -1.0000000000000000e+00 1161 264 1.0000000000000000e+00 1161 158 -1.0000000000000000e+00 1162 269 1.0000000000000000e+00 1162 158 -1.0000000000000000e+00 1163 270 1.0000000000000000e+00 1163 158 -1.0000000000000000e+00 1164 272 1.0000000000000000e+00 1164 158 -1.0000000000000000e+00 1165 278 1.0000000000000000e+00 1165 158 -1.0000000000000000e+00 1166 243 1.0000000000000000e+00 1166 158 -1.0000000000000000e+00 1167 292 1.0000000000000000e+00 1167 158 -1.0000000000000000e+00 1168 294 1.0000000000000000e+00 1168 158 -1.0000000000000000e+00 1169 299 1.0000000000000000e+00 1169 158 -1.0000000000000000e+00 1170 246 1.0000000000000000e+00 1170 158 -1.0000000000000000e+00 1171 302 1.0000000000000000e+00 1171 158 -1.0000000000000000e+00 1172 194 1.0000000000000000e+00 1172 159 -1.0000000000000000e+00 1173 195 1.0000000000000000e+00 1173 159 -1.0000000000000000e+00 1174 196 1.0000000000000000e+00 1174 159 -1.0000000000000000e+00 1175 197 1.0000000000000000e+00 1175 159 -1.0000000000000000e+00 1176 198 1.0000000000000000e+00 1176 159 -1.0000000000000000e+00 1177 209 1.0000000000000000e+00 1177 159 -1.0000000000000000e+00 1178 210 1.0000000000000000e+00 1178 159 -1.0000000000000000e+00 1179 211 1.0000000000000000e+00 1179 159 -1.0000000000000000e+00 1180 212 1.0000000000000000e+00 1180 159 -1.0000000000000000e+00 1181 256 1.0000000000000000e+00 1181 159 -1.0000000000000000e+00 1182 264 1.0000000000000000e+00 1182 159 -1.0000000000000000e+00 1183 265 1.0000000000000000e+00 1183 159 -1.0000000000000000e+00 1184 266 1.0000000000000000e+00 1184 159 -1.0000000000000000e+00 1185 292 1.0000000000000000e+00 1185 159 -1.0000000000000000e+00 1186 302 1.0000000000000000e+00 1186 159 -1.0000000000000000e+00 1187 305 1.0000000000000000e+00 1187 159 -1.0000000000000000e+00 1188 306 1.0000000000000000e+00 1188 159 -1.0000000000000000e+00 1189 194 1.0000000000000000e+00 1189 160 -1.0000000000000000e+00 1190 195 1.0000000000000000e+00 1190 160 -1.0000000000000000e+00 1191 257 1.0000000000000000e+00 1191 160 -1.0000000000000000e+00 1192 256 1.0000000000000000e+00 1192 160 -1.0000000000000000e+00 1193 196 1.0000000000000000e+00 1193 160 -1.0000000000000000e+00 1194 160 -1.0000000000000000e+00 1194 710 1.0000000000000000e+00 1195 356 1.0000000000000000e+00 1195 160 -1.0000000000000000e+00 1196 355 1.0000000000000000e+00 1196 160 -1.0000000000000000e+00 1197 364 1.0000000000000000e+00 1197 160 -1.0000000000000000e+00 1198 198 1.0000000000000000e+00 1198 160 -1.0000000000000000e+00 1199 199 1.0000000000000000e+00 1199 160 -1.0000000000000000e+00 1200 242 1.0000000000000000e+00 1200 160 -1.0000000000000000e+00 1201 258 1.0000000000000000e+00 1201 160 -1.0000000000000000e+00 1202 261 1.0000000000000000e+00 1202 160 -1.0000000000000000e+00 1203 266 1.0000000000000000e+00 1203 160 -1.0000000000000000e+00 1204 160 -1.0000000000000000e+00 1204 849 1.0000000000000000e+00 1205 365 1.0000000000000000e+00 1205 160 -1.0000000000000000e+00 1206 200 1.0000000000000000e+00 1206 14 -1.0000000000000000e+00 1207 208 1.0000000000000000e+00 1207 14 -1.0000000000000000e+00 1208 263 1.0000000000000000e+00 1208 14 -1.0000000000000000e+00 1209 206 1.0000000000000000e+00 1209 14 -1.0000000000000000e+00 1210 200 1.0000000000000000e+00 1210 649 -1.0000000000000000e+00 1211 243 1.0000000000000000e+00 1211 649 -1.0000000000000000e+00 1212 242 1.0000000000000000e+00 1212 649 -1.0000000000000000e+00 1213 241 1.0000000000000000e+00 1213 649 -1.0000000000000000e+00 1214 256 1.0000000000000000e+00 1214 649 -1.0000000000000000e+00 1215 201 1.0000000000000000e+00 1215 649 -1.0000000000000000e+00 1216 358 1.0000000000000000e+00 1216 649 -1.0000000000000000e+00 1217 710 1.0000000000000000e+00 1217 649 -1.0000000000000000e+00 1218 802 1.0000000000000000e+00 1218 649 -1.0000000000000000e+00 1219 195 1.0000000000000000e+00 1219 649 -1.0000000000000000e+00 1220 257 1.0000000000000000e+00 1220 649 -1.0000000000000000e+00 1221 194 1.0000000000000000e+00 1221 649 -1.0000000000000000e+00 1222 259 1.0000000000000000e+00 1222 649 -1.0000000000000000e+00 1223 260 1.0000000000000000e+00 1223 649 -1.0000000000000000e+00 1224 261 1.0000000000000000e+00 1224 649 -1.0000000000000000e+00 1225 278 1.0000000000000000e+00 1225 649 -1.0000000000000000e+00 1226 355 1.0000000000000000e+00 1226 649 -1.0000000000000000e+00 1227 356 1.0000000000000000e+00 1227 649 -1.0000000000000000e+00 1228 357 1.0000000000000000e+00 1228 649 -1.0000000000000000e+00 1229 200 1.0000000000000000e+00 1229 619 -1.0000000000000000e+00 1230 206 1.0000000000000000e+00 1230 619 -1.0000000000000000e+00 1231 246 1.0000000000000000e+00 1231 619 -1.0000000000000000e+00 1232 249 1.0000000000000000e+00 1232 619 -1.0000000000000000e+00 1233 250 1.0000000000000000e+00 1233 619 -1.0000000000000000e+00 1234 269 1.0000000000000000e+00 1234 619 -1.0000000000000000e+00 1235 202 1.0000000000000000e+00 1235 619 -1.0000000000000000e+00 1236 358 1.0000000000000000e+00 1236 619 -1.0000000000000000e+00 1237 254 1.0000000000000000e+00 1237 619 -1.0000000000000000e+00 1238 255 1.0000000000000000e+00 1238 619 -1.0000000000000000e+00 1239 361 1.0000000000000000e+00 1239 619 -1.0000000000000000e+00 1240 670 1.0000000000000000e+00 1240 619 -1.0000000000000000e+00 1241 669 1.0000000000000000e+00 1241 619 -1.0000000000000000e+00 1242 842 1.0000000000000000e+00 1242 619 -1.0000000000000000e+00 1243 764 1.0000000000000000e+00 1243 619 -1.0000000000000000e+00 1244 278 1.0000000000000000e+00 1244 619 -1.0000000000000000e+00 1245 299 1.0000000000000000e+00 1245 619 -1.0000000000000000e+00 1246 205 1.0000000000000000e+00 1246 161 -1.0000000000000000e+00 1247 284 1.0000000000000000e+00 1247 161 -1.0000000000000000e+00 1248 285 1.0000000000000000e+00 1248 161 -1.0000000000000000e+00 1249 280 1.0000000000000000e+00 1249 161 -1.0000000000000000e+00 1250 279 1.0000000000000000e+00 1250 161 -1.0000000000000000e+00 1251 307 1.0000000000000000e+00 1251 161 -1.0000000000000000e+00 1252 289 1.0000000000000000e+00 1252 631 -1.0000000000000000e+00 1253 203 1.0000000000000000e+00 1253 631 -1.0000000000000000e+00 1254 279 1.0000000000000000e+00 1254 631 -1.0000000000000000e+00 1255 280 1.0000000000000000e+00 1255 631 -1.0000000000000000e+00 1256 290 1.0000000000000000e+00 1256 631 -1.0000000000000000e+00 1257 204 1.0000000000000000e+00 1257 646 -1.0000000000000000e+00 1258 162 -1.0000000000000000e+00 1258 784 1.0000000000000000e+00 1259 162 -1.0000000000000000e+00 1259 783 1.0000000000000000e+00 1260 203 1.0000000000000000e+00 1260 162 -1.0000000000000000e+00 1261 204 1.0000000000000000e+00 1261 162 -1.0000000000000000e+00 1262 162 -1.0000000000000000e+00 1262 781 1.0000000000000000e+00 1263 205 1.0000000000000000e+00 1263 162 -1.0000000000000000e+00 1264 284 1.0000000000000000e+00 1264 162 -1.0000000000000000e+00 1265 291 1.0000000000000000e+00 1265 162 -1.0000000000000000e+00 1266 289 1.0000000000000000e+00 1266 162 -1.0000000000000000e+00 1267 226 1.0000000000000000e+00 1267 163 -1.0000000000000000e+00 1268 331 1.0000000000000000e+00 1268 163 -1.0000000000000000e+00 1269 228 1.0000000000000000e+00 1269 163 -1.0000000000000000e+00 1270 330 1.0000000000000000e+00 1270 163 -1.0000000000000000e+00 1271 334 1.0000000000000000e+00 1271 163 -1.0000000000000000e+00 1272 332 1.0000000000000000e+00 1272 163 -1.0000000000000000e+00 1273 206 1.0000000000000000e+00 1273 163 -1.0000000000000000e+00 1274 208 1.0000000000000000e+00 1274 163 -1.0000000000000000e+00 1275 361 1.0000000000000000e+00 1275 163 -1.0000000000000000e+00 1276 200 1.0000000000000000e+00 1276 163 -1.0000000000000000e+00 1277 207 1.0000000000000000e+00 1277 163 -1.0000000000000000e+00 1278 227 1.0000000000000000e+00 1278 163 -1.0000000000000000e+00 1279 299 1.0000000000000000e+00 1279 163 -1.0000000000000000e+00 1280 292 1.0000000000000000e+00 1280 163 -1.0000000000000000e+00 1281 259 1.0000000000000000e+00 1281 163 -1.0000000000000000e+00 1282 301 1.0000000000000000e+00 1282 163 -1.0000000000000000e+00 1283 194 1.0000000000000000e+00 1283 163 -1.0000000000000000e+00 1284 302 1.0000000000000000e+00 1284 163 -1.0000000000000000e+00 1285 303 1.0000000000000000e+00 1285 163 -1.0000000000000000e+00 1286 328 1.0000000000000000e+00 1286 163 -1.0000000000000000e+00 1287 329 1.0000000000000000e+00 1287 163 -1.0000000000000000e+00 1288 313 1.0000000000000000e+00 1288 163 -1.0000000000000000e+00 1289 333 1.0000000000000000e+00 1289 163 -1.0000000000000000e+00 1290 336 1.0000000000000000e+00 1290 163 -1.0000000000000000e+00 1291 209 1.0000000000000000e+00 1291 164 -1.0000000000000000e+00 1292 212 1.0000000000000000e+00 1292 164 -1.0000000000000000e+00 1293 213 1.0000000000000000e+00 1293 164 -1.0000000000000000e+00 1294 276 1.0000000000000000e+00 1294 164 -1.0000000000000000e+00 1295 268 1.0000000000000000e+00 1295 164 -1.0000000000000000e+00 1296 298 1.0000000000000000e+00 1296 164 -1.0000000000000000e+00 1297 277 1.0000000000000000e+00 1297 164 -1.0000000000000000e+00 1298 209 1.0000000000000000e+00 1298 165 -1.0000000000000000e+00 1299 210 1.0000000000000000e+00 1299 165 -1.0000000000000000e+00 1300 293 1.0000000000000000e+00 1300 165 -1.0000000000000000e+00 1301 292 1.0000000000000000e+00 1301 165 -1.0000000000000000e+00 1302 211 1.0000000000000000e+00 1302 165 -1.0000000000000000e+00 1303 212 1.0000000000000000e+00 1303 165 -1.0000000000000000e+00 1304 213 1.0000000000000000e+00 1304 165 -1.0000000000000000e+00 1305 295 1.0000000000000000e+00 1305 165 -1.0000000000000000e+00 1306 296 1.0000000000000000e+00 1306 165 -1.0000000000000000e+00 1307 298 1.0000000000000000e+00 1307 165 -1.0000000000000000e+00 1308 306 1.0000000000000000e+00 1308 165 -1.0000000000000000e+00 1309 214 1.0000000000000000e+00 1309 166 -1.0000000000000000e+00 1310 218 1.0000000000000000e+00 1310 166 -1.0000000000000000e+00 1311 219 1.0000000000000000e+00 1311 166 -1.0000000000000000e+00 1312 321 1.0000000000000000e+00 1312 166 -1.0000000000000000e+00 1313 325 1.0000000000000000e+00 1313 166 -1.0000000000000000e+00 1314 349 1.0000000000000000e+00 1314 166 -1.0000000000000000e+00 1315 346 1.0000000000000000e+00 1315 166 -1.0000000000000000e+00 1316 236 1.0000000000000000e+00 1316 167 -1.0000000000000000e+00 1317 309 1.0000000000000000e+00 1317 167 -1.0000000000000000e+00 1318 238 1.0000000000000000e+00 1318 167 -1.0000000000000000e+00 1319 308 1.0000000000000000e+00 1319 167 -1.0000000000000000e+00 1320 215 1.0000000000000000e+00 1320 167 -1.0000000000000000e+00 1321 310 1.0000000000000000e+00 1321 167 -1.0000000000000000e+00 1322 214 1.0000000000000000e+00 1322 167 -1.0000000000000000e+00 1323 340 1.0000000000000000e+00 1323 167 -1.0000000000000000e+00 1324 216 1.0000000000000000e+00 1324 167 -1.0000000000000000e+00 1325 339 1.0000000000000000e+00 1325 167 -1.0000000000000000e+00 1326 237 1.0000000000000000e+00 1326 167 -1.0000000000000000e+00 1327 341 1.0000000000000000e+00 1327 167 -1.0000000000000000e+00 1328 313 1.0000000000000000e+00 1328 167 -1.0000000000000000e+00 1329 314 1.0000000000000000e+00 1329 167 -1.0000000000000000e+00 1330 319 1.0000000000000000e+00 1330 167 -1.0000000000000000e+00 1331 344 1.0000000000000000e+00 1331 167 -1.0000000000000000e+00 1332 347 1.0000000000000000e+00 1332 167 -1.0000000000000000e+00 1333 319 1.0000000000000000e+00 1333 168 -1.0000000000000000e+00 1334 215 1.0000000000000000e+00 1334 168 -1.0000000000000000e+00 1335 223 1.0000000000000000e+00 1335 168 -1.0000000000000000e+00 1336 221 1.0000000000000000e+00 1336 168 -1.0000000000000000e+00 1337 217 1.0000000000000000e+00 1337 168 -1.0000000000000000e+00 1338 214 1.0000000000000000e+00 1338 168 -1.0000000000000000e+00 1339 218 1.0000000000000000e+00 1339 168 -1.0000000000000000e+00 1340 220 1.0000000000000000e+00 1340 168 -1.0000000000000000e+00 1341 224 1.0000000000000000e+00 1341 168 -1.0000000000000000e+00 1342 308 1.0000000000000000e+00 1342 168 -1.0000000000000000e+00 1343 321 1.0000000000000000e+00 1343 168 -1.0000000000000000e+00 1344 215 1.0000000000000000e+00 1344 169 -1.0000000000000000e+00 1345 214 1.0000000000000000e+00 1345 169 -1.0000000000000000e+00 1346 216 1.0000000000000000e+00 1346 169 -1.0000000000000000e+00 1347 217 1.0000000000000000e+00 1347 169 -1.0000000000000000e+00 1348 218 1.0000000000000000e+00 1348 169 -1.0000000000000000e+00 1349 219 1.0000000000000000e+00 1349 169 -1.0000000000000000e+00 1350 319 1.0000000000000000e+00 1350 169 -1.0000000000000000e+00 1351 314 1.0000000000000000e+00 1351 169 -1.0000000000000000e+00 1352 320 1.0000000000000000e+00 1352 169 -1.0000000000000000e+00 1353 322 1.0000000000000000e+00 1353 169 -1.0000000000000000e+00 1354 321 1.0000000000000000e+00 1354 169 -1.0000000000000000e+00 1355 323 1.0000000000000000e+00 1355 169 -1.0000000000000000e+00 1356 324 1.0000000000000000e+00 1356 169 -1.0000000000000000e+00 1357 325 1.0000000000000000e+00 1357 169 -1.0000000000000000e+00 1358 326 1.0000000000000000e+00 1358 169 -1.0000000000000000e+00 1359 327 1.0000000000000000e+00 1359 169 -1.0000000000000000e+00 1360 221 1.0000000000000000e+00 1360 169 -1.0000000000000000e+00 1361 344 1.0000000000000000e+00 1361 169 -1.0000000000000000e+00 1362 340 1.0000000000000000e+00 1362 169 -1.0000000000000000e+00 1363 345 1.0000000000000000e+00 1363 169 -1.0000000000000000e+00 1364 346 1.0000000000000000e+00 1364 169 -1.0000000000000000e+00 1365 350 1.0000000000000000e+00 1365 169 -1.0000000000000000e+00 1366 349 1.0000000000000000e+00 1366 169 -1.0000000000000000e+00 1367 351 1.0000000000000000e+00 1367 169 -1.0000000000000000e+00 1368 252 1.0000000000000000e+00 1368 169 -1.0000000000000000e+00 1369 352 1.0000000000000000e+00 1369 169 -1.0000000000000000e+00 1370 220 1.0000000000000000e+00 1370 170 -1.0000000000000000e+00 1371 224 1.0000000000000000e+00 1371 170 -1.0000000000000000e+00 1372 225 1.0000000000000000e+00 1372 170 -1.0000000000000000e+00 1373 226 1.0000000000000000e+00 1373 170 -1.0000000000000000e+00 1374 230 1.0000000000000000e+00 1374 170 -1.0000000000000000e+00 1375 292 1.0000000000000000e+00 1375 170 -1.0000000000000000e+00 1376 295 1.0000000000000000e+00 1376 170 -1.0000000000000000e+00 1377 296 1.0000000000000000e+00 1377 170 -1.0000000000000000e+00 1378 299 1.0000000000000000e+00 1378 170 -1.0000000000000000e+00 1379 306 1.0000000000000000e+00 1379 170 -1.0000000000000000e+00 1380 308 1.0000000000000000e+00 1380 170 -1.0000000000000000e+00 1381 312 1.0000000000000000e+00 1381 170 -1.0000000000000000e+00 1382 321 1.0000000000000000e+00 1382 171 -1.0000000000000000e+00 1383 221 1.0000000000000000e+00 1383 171 -1.0000000000000000e+00 1384 323 1.0000000000000000e+00 1384 171 -1.0000000000000000e+00 1385 220 1.0000000000000000e+00 1385 171 -1.0000000000000000e+00 1386 354 1.0000000000000000e+00 1386 171 -1.0000000000000000e+00 1387 222 1.0000000000000000e+00 1387 171 -1.0000000000000000e+00 1388 322 1.0000000000000000e+00 1388 171 -1.0000000000000000e+00 1389 326 1.0000000000000000e+00 1389 171 -1.0000000000000000e+00 1390 327 1.0000000000000000e+00 1390 171 -1.0000000000000000e+00 1391 319 1.0000000000000000e+00 1391 171 -1.0000000000000000e+00 1392 328 1.0000000000000000e+00 1392 171 -1.0000000000000000e+00 1393 221 1.0000000000000000e+00 1393 172 -1.0000000000000000e+00 1394 220 1.0000000000000000e+00 1394 172 -1.0000000000000000e+00 1395 222 1.0000000000000000e+00 1395 172 -1.0000000000000000e+00 1396 223 1.0000000000000000e+00 1396 172 -1.0000000000000000e+00 1397 224 1.0000000000000000e+00 1397 172 -1.0000000000000000e+00 1398 225 1.0000000000000000e+00 1398 172 -1.0000000000000000e+00 1399 227 1.0000000000000000e+00 1399 172 -1.0000000000000000e+00 1400 226 1.0000000000000000e+00 1400 172 -1.0000000000000000e+00 1401 228 1.0000000000000000e+00 1401 172 -1.0000000000000000e+00 1402 229 1.0000000000000000e+00 1402 172 -1.0000000000000000e+00 1403 230 1.0000000000000000e+00 1403 172 -1.0000000000000000e+00 1404 309 1.0000000000000000e+00 1404 172 -1.0000000000000000e+00 1405 308 1.0000000000000000e+00 1405 172 -1.0000000000000000e+00 1406 310 1.0000000000000000e+00 1406 172 -1.0000000000000000e+00 1407 311 1.0000000000000000e+00 1407 172 -1.0000000000000000e+00 1408 312 1.0000000000000000e+00 1408 172 -1.0000000000000000e+00 1409 313 1.0000000000000000e+00 1409 172 -1.0000000000000000e+00 1410 314 1.0000000000000000e+00 1410 172 -1.0000000000000000e+00 1411 318 1.0000000000000000e+00 1411 172 -1.0000000000000000e+00 1412 319 1.0000000000000000e+00 1412 172 -1.0000000000000000e+00 1413 215 1.0000000000000000e+00 1413 172 -1.0000000000000000e+00 1414 327 1.0000000000000000e+00 1414 172 -1.0000000000000000e+00 1415 328 1.0000000000000000e+00 1415 172 -1.0000000000000000e+00 1416 329 1.0000000000000000e+00 1416 172 -1.0000000000000000e+00 1417 331 1.0000000000000000e+00 1417 172 -1.0000000000000000e+00 1418 354 1.0000000000000000e+00 1418 172 -1.0000000000000000e+00 1419 292 1.0000000000000000e+00 1419 173 -1.0000000000000000e+00 1420 302 1.0000000000000000e+00 1420 173 -1.0000000000000000e+00 1421 227 1.0000000000000000e+00 1421 173 -1.0000000000000000e+00 1422 194 1.0000000000000000e+00 1422 173 -1.0000000000000000e+00 1423 305 1.0000000000000000e+00 1423 173 -1.0000000000000000e+00 1424 328 1.0000000000000000e+00 1424 173 -1.0000000000000000e+00 1425 354 1.0000000000000000e+00 1425 173 -1.0000000000000000e+00 1426 229 1.0000000000000000e+00 1426 173 -1.0000000000000000e+00 1427 226 1.0000000000000000e+00 1427 173 -1.0000000000000000e+00 1428 230 1.0000000000000000e+00 1428 173 -1.0000000000000000e+00 1429 303 1.0000000000000000e+00 1429 173 -1.0000000000000000e+00 1430 304 1.0000000000000000e+00 1430 173 -1.0000000000000000e+00 1431 306 1.0000000000000000e+00 1431 173 -1.0000000000000000e+00 1432 198 1.0000000000000000e+00 1432 173 -1.0000000000000000e+00 1433 220 1.0000000000000000e+00 1433 173 -1.0000000000000000e+00 1434 231 1.0000000000000000e+00 1434 627 -1.0000000000000000e+00 1435 235 1.0000000000000000e+00 1435 627 -1.0000000000000000e+00 1436 236 1.0000000000000000e+00 1436 627 -1.0000000000000000e+00 1437 240 1.0000000000000000e+00 1437 627 -1.0000000000000000e+00 1438 255 1.0000000000000000e+00 1438 627 -1.0000000000000000e+00 1439 279 1.0000000000000000e+00 1439 627 -1.0000000000000000e+00 1440 330 1.0000000000000000e+00 1440 627 -1.0000000000000000e+00 1441 317 1.0000000000000000e+00 1441 627 -1.0000000000000000e+00 1442 206 1.0000000000000000e+00 1442 627 -1.0000000000000000e+00 1443 361 1.0000000000000000e+00 1443 627 -1.0000000000000000e+00 1444 362 1.0000000000000000e+00 1444 627 -1.0000000000000000e+00 1445 246 1.0000000000000000e+00 1445 627 -1.0000000000000000e+00 1446 287 1.0000000000000000e+00 1446 174 -1.0000000000000000e+00 1447 283 1.0000000000000000e+00 1447 174 -1.0000000000000000e+00 1448 280 1.0000000000000000e+00 1448 174 -1.0000000000000000e+00 1449 282 1.0000000000000000e+00 1449 174 -1.0000000000000000e+00 1450 281 1.0000000000000000e+00 1450 174 -1.0000000000000000e+00 1451 231 1.0000000000000000e+00 1451 174 -1.0000000000000000e+00 1452 233 1.0000000000000000e+00 1452 174 -1.0000000000000000e+00 1453 353 1.0000000000000000e+00 1453 174 -1.0000000000000000e+00 1454 232 1.0000000000000000e+00 1454 174 -1.0000000000000000e+00 1455 279 1.0000000000000000e+00 1455 174 -1.0000000000000000e+00 1456 174 -1.0000000000000000e+00 1456 688 1.0000000000000000e+00 1457 174 -1.0000000000000000e+00 1457 689 1.0000000000000000e+00 1458 300 1.0000000000000000e+00 1458 174 -1.0000000000000000e+00 1459 333 1.0000000000000000e+00 1459 174 -1.0000000000000000e+00 1460 338 1.0000000000000000e+00 1460 174 -1.0000000000000000e+00 1461 347 1.0000000000000000e+00 1461 174 -1.0000000000000000e+00 1462 251 1.0000000000000000e+00 1462 174 -1.0000000000000000e+00 1463 232 1.0000000000000000e+00 1463 628 -1.0000000000000000e+00 1464 333 1.0000000000000000e+00 1464 628 -1.0000000000000000e+00 1465 334 1.0000000000000000e+00 1465 628 -1.0000000000000000e+00 1466 234 1.0000000000000000e+00 1466 628 -1.0000000000000000e+00 1467 231 1.0000000000000000e+00 1467 628 -1.0000000000000000e+00 1468 255 1.0000000000000000e+00 1468 628 -1.0000000000000000e+00 1469 330 1.0000000000000000e+00 1469 628 -1.0000000000000000e+00 1470 335 1.0000000000000000e+00 1470 628 -1.0000000000000000e+00 1471 206 1.0000000000000000e+00 1471 628 -1.0000000000000000e+00 1472 208 1.0000000000000000e+00 1472 628 -1.0000000000000000e+00 1473 232 1.0000000000000000e+00 1473 175 -1.0000000000000000e+00 1474 231 1.0000000000000000e+00 1474 175 -1.0000000000000000e+00 1475 233 1.0000000000000000e+00 1475 175 -1.0000000000000000e+00 1476 234 1.0000000000000000e+00 1476 175 -1.0000000000000000e+00 1477 175 -1.0000000000000000e+00 1477 693 1.0000000000000000e+00 1478 235 1.0000000000000000e+00 1478 175 -1.0000000000000000e+00 1479 237 1.0000000000000000e+00 1479 175 -1.0000000000000000e+00 1480 236 1.0000000000000000e+00 1480 175 -1.0000000000000000e+00 1481 238 1.0000000000000000e+00 1481 175 -1.0000000000000000e+00 1482 239 1.0000000000000000e+00 1482 175 -1.0000000000000000e+00 1483 240 1.0000000000000000e+00 1483 175 -1.0000000000000000e+00 1484 314 1.0000000000000000e+00 1484 175 -1.0000000000000000e+00 1485 313 1.0000000000000000e+00 1485 175 -1.0000000000000000e+00 1486 315 1.0000000000000000e+00 1486 175 -1.0000000000000000e+00 1487 309 1.0000000000000000e+00 1487 175 -1.0000000000000000e+00 1488 316 1.0000000000000000e+00 1488 175 -1.0000000000000000e+00 1489 317 1.0000000000000000e+00 1489 175 -1.0000000000000000e+00 1490 331 1.0000000000000000e+00 1490 175 -1.0000000000000000e+00 1491 330 1.0000000000000000e+00 1491 175 -1.0000000000000000e+00 1492 332 1.0000000000000000e+00 1492 175 -1.0000000000000000e+00 1493 329 1.0000000000000000e+00 1493 175 -1.0000000000000000e+00 1494 333 1.0000000000000000e+00 1494 175 -1.0000000000000000e+00 1495 334 1.0000000000000000e+00 1495 175 -1.0000000000000000e+00 1496 338 1.0000000000000000e+00 1496 175 -1.0000000000000000e+00 1497 347 1.0000000000000000e+00 1497 175 -1.0000000000000000e+00 1498 281 1.0000000000000000e+00 1498 175 -1.0000000000000000e+00 1499 279 1.0000000000000000e+00 1499 176 -1.0000000000000000e+00 1500 280 1.0000000000000000e+00 1500 176 -1.0000000000000000e+00 1501 290 1.0000000000000000e+00 1501 176 -1.0000000000000000e+00 1502 347 1.0000000000000000e+00 1502 176 -1.0000000000000000e+00 1503 237 1.0000000000000000e+00 1503 176 -1.0000000000000000e+00 1504 348 1.0000000000000000e+00 1504 176 -1.0000000000000000e+00 1505 281 1.0000000000000000e+00 1505 176 -1.0000000000000000e+00 1506 239 1.0000000000000000e+00 1506 176 -1.0000000000000000e+00 1507 236 1.0000000000000000e+00 1507 176 -1.0000000000000000e+00 1508 240 1.0000000000000000e+00 1508 176 -1.0000000000000000e+00 1509 231 1.0000000000000000e+00 1509 176 -1.0000000000000000e+00 1510 282 1.0000000000000000e+00 1510 176 -1.0000000000000000e+00 1511 288 1.0000000000000000e+00 1511 176 -1.0000000000000000e+00 1512 289 1.0000000000000000e+00 1512 176 -1.0000000000000000e+00 1513 176 -1.0000000000000000e+00 1513 702 1.0000000000000000e+00 1514 339 1.0000000000000000e+00 1514 176 -1.0000000000000000e+00 1515 242 1.0000000000000000e+00 1515 636 -1.0000000000000000e+00 1516 256 1.0000000000000000e+00 1516 636 -1.0000000000000000e+00 1517 258 1.0000000000000000e+00 1517 636 -1.0000000000000000e+00 1518 266 1.0000000000000000e+00 1518 636 -1.0000000000000000e+00 1519 267 1.0000000000000000e+00 1519 636 -1.0000000000000000e+00 1520 243 1.0000000000000000e+00 1520 636 -1.0000000000000000e+00 1521 244 1.0000000000000000e+00 1521 636 -1.0000000000000000e+00 1522 355 1.0000000000000000e+00 1522 19 -1.0000000000000000e+00 1523 356 1.0000000000000000e+00 1523 19 -1.0000000000000000e+00 1524 357 1.0000000000000000e+00 1524 19 -1.0000000000000000e+00 1525 241 1.0000000000000000e+00 1525 648 -1.0000000000000000e+00 1526 242 1.0000000000000000e+00 1526 648 -1.0000000000000000e+00 1527 244 1.0000000000000000e+00 1527 648 -1.0000000000000000e+00 1528 243 1.0000000000000000e+00 1528 648 -1.0000000000000000e+00 1529 245 1.0000000000000000e+00 1529 648 -1.0000000000000000e+00 1530 810 1.0000000000000000e+00 1530 648 -1.0000000000000000e+00 1531 359 1.0000000000000000e+00 1531 648 -1.0000000000000000e+00 1532 278 1.0000000000000000e+00 1532 177 -1.0000000000000000e+00 1533 243 1.0000000000000000e+00 1533 177 -1.0000000000000000e+00 1534 272 1.0000000000000000e+00 1534 177 -1.0000000000000000e+00 1535 359 1.0000000000000000e+00 1535 177 -1.0000000000000000e+00 1536 245 1.0000000000000000e+00 1536 177 -1.0000000000000000e+00 1537 244 1.0000000000000000e+00 1537 177 -1.0000000000000000e+00 1538 269 1.0000000000000000e+00 1538 177 -1.0000000000000000e+00 1539 270 1.0000000000000000e+00 1539 177 -1.0000000000000000e+00 1540 271 1.0000000000000000e+00 1540 177 -1.0000000000000000e+00 1541 273 1.0000000000000000e+00 1541 177 -1.0000000000000000e+00 1542 209 1.0000000000000000e+00 1542 177 -1.0000000000000000e+00 1543 264 1.0000000000000000e+00 1543 177 -1.0000000000000000e+00 1544 275 1.0000000000000000e+00 1544 177 -1.0000000000000000e+00 1545 276 1.0000000000000000e+00 1545 177 -1.0000000000000000e+00 1546 256 1.0000000000000000e+00 1546 177 -1.0000000000000000e+00 1547 358 1.0000000000000000e+00 1547 177 -1.0000000000000000e+00 1548 360 1.0000000000000000e+00 1548 177 -1.0000000000000000e+00 1549 299 1.0000000000000000e+00 1549 178 -1.0000000000000000e+00 1550 246 1.0000000000000000e+00 1550 178 -1.0000000000000000e+00 1551 294 1.0000000000000000e+00 1551 178 -1.0000000000000000e+00 1552 362 1.0000000000000000e+00 1552 178 -1.0000000000000000e+00 1553 248 1.0000000000000000e+00 1553 178 -1.0000000000000000e+00 1554 247 1.0000000000000000e+00 1554 178 -1.0000000000000000e+00 1555 292 1.0000000000000000e+00 1555 178 -1.0000000000000000e+00 1556 210 1.0000000000000000e+00 1556 178 -1.0000000000000000e+00 1557 293 1.0000000000000000e+00 1557 178 -1.0000000000000000e+00 1558 295 1.0000000000000000e+00 1558 178 -1.0000000000000000e+00 1559 209 1.0000000000000000e+00 1559 178 -1.0000000000000000e+00 1560 270 1.0000000000000000e+00 1560 178 -1.0000000000000000e+00 1561 297 1.0000000000000000e+00 1561 178 -1.0000000000000000e+00 1562 298 1.0000000000000000e+00 1562 178 -1.0000000000000000e+00 1563 269 1.0000000000000000e+00 1563 178 -1.0000000000000000e+00 1564 361 1.0000000000000000e+00 1564 178 -1.0000000000000000e+00 1565 363 1.0000000000000000e+00 1565 178 -1.0000000000000000e+00 1566 249 1.0000000000000000e+00 1566 621 -1.0000000000000000e+00 1567 269 1.0000000000000000e+00 1567 621 -1.0000000000000000e+00 1568 273 1.0000000000000000e+00 1568 621 -1.0000000000000000e+00 1569 274 1.0000000000000000e+00 1569 621 -1.0000000000000000e+00 1570 278 1.0000000000000000e+00 1570 621 -1.0000000000000000e+00 1571 246 1.0000000000000000e+00 1571 621 -1.0000000000000000e+00 1572 247 1.0000000000000000e+00 1572 621 -1.0000000000000000e+00 1573 250 1.0000000000000000e+00 1573 655 -1.0000000000000000e+00 1574 247 1.0000000000000000e+00 1574 655 -1.0000000000000000e+00 1575 246 1.0000000000000000e+00 1575 655 -1.0000000000000000e+00 1576 248 1.0000000000000000e+00 1576 655 -1.0000000000000000e+00 1577 249 1.0000000000000000e+00 1577 655 -1.0000000000000000e+00 1578 255 1.0000000000000000e+00 1578 655 -1.0000000000000000e+00 1579 362 1.0000000000000000e+00 1579 655 -1.0000000000000000e+00 1580 251 1.0000000000000000e+00 1580 179 -1.0000000000000000e+00 1581 252 1.0000000000000000e+00 1581 179 -1.0000000000000000e+00 1582 253 1.0000000000000000e+00 1582 179 -1.0000000000000000e+00 1583 313 1.0000000000000000e+00 1583 179 -1.0000000000000000e+00 1584 314 1.0000000000000000e+00 1584 179 -1.0000000000000000e+00 1585 318 1.0000000000000000e+00 1585 179 -1.0000000000000000e+00 1586 319 1.0000000000000000e+00 1586 179 -1.0000000000000000e+00 1587 320 1.0000000000000000e+00 1587 179 -1.0000000000000000e+00 1588 326 1.0000000000000000e+00 1588 179 -1.0000000000000000e+00 1589 327 1.0000000000000000e+00 1589 179 -1.0000000000000000e+00 1590 328 1.0000000000000000e+00 1590 179 -1.0000000000000000e+00 1591 329 1.0000000000000000e+00 1591 179 -1.0000000000000000e+00 1592 315 1.0000000000000000e+00 1592 179 -1.0000000000000000e+00 1593 333 1.0000000000000000e+00 1593 179 -1.0000000000000000e+00 1594 337 1.0000000000000000e+00 1594 179 -1.0000000000000000e+00 1595 338 1.0000000000000000e+00 1595 179 -1.0000000000000000e+00 1596 344 1.0000000000000000e+00 1596 179 -1.0000000000000000e+00 1597 347 1.0000000000000000e+00 1597 179 -1.0000000000000000e+00 1598 812 1.0000000000000000e+00 1598 644 -1.0000000000000000e+00 1599 358 1.0000000000000000e+00 1599 644 -1.0000000000000000e+00 1600 359 1.0000000000000000e+00 1600 644 -1.0000000000000000e+00 1601 243 1.0000000000000000e+00 1601 644 -1.0000000000000000e+00 1602 254 1.0000000000000000e+00 1602 622 -1.0000000000000000e+00 1603 278 1.0000000000000000e+00 1603 622 -1.0000000000000000e+00 1604 358 1.0000000000000000e+00 1604 622 -1.0000000000000000e+00 1605 360 1.0000000000000000e+00 1605 622 -1.0000000000000000e+00 1606 750 1.0000000000000000e+00 1606 622 -1.0000000000000000e+00 1607 249 1.0000000000000000e+00 1607 622 -1.0000000000000000e+00 1608 359 1.0000000000000000e+00 1608 622 -1.0000000000000000e+00 1609 273 1.0000000000000000e+00 1609 622 -1.0000000000000000e+00 1610 200 1.0000000000000000e+00 1610 180 -1.0000000000000000e+00 1611 259 1.0000000000000000e+00 1611 180 -1.0000000000000000e+00 1612 260 1.0000000000000000e+00 1612 180 -1.0000000000000000e+00 1613 355 1.0000000000000000e+00 1613 180 -1.0000000000000000e+00 1614 357 1.0000000000000000e+00 1614 180 -1.0000000000000000e+00 1615 194 1.0000000000000000e+00 1615 180 -1.0000000000000000e+00 1616 261 1.0000000000000000e+00 1616 180 -1.0000000000000000e+00 1617 262 1.0000000000000000e+00 1617 180 -1.0000000000000000e+00 1618 180 -1.0000000000000000e+00 1618 811 1.0000000000000000e+00 1619 263 1.0000000000000000e+00 1619 180 -1.0000000000000000e+00 1620 301 1.0000000000000000e+00 1620 180 -1.0000000000000000e+00 1621 208 1.0000000000000000e+00 1621 180 -1.0000000000000000e+00 1622 209 1.0000000000000000e+00 1622 181 -1.0000000000000000e+00 1623 264 1.0000000000000000e+00 1623 181 -1.0000000000000000e+00 1624 265 1.0000000000000000e+00 1624 181 -1.0000000000000000e+00 1625 256 1.0000000000000000e+00 1625 181 -1.0000000000000000e+00 1626 275 1.0000000000000000e+00 1626 181 -1.0000000000000000e+00 1627 266 1.0000000000000000e+00 1627 181 -1.0000000000000000e+00 1628 267 1.0000000000000000e+00 1628 181 -1.0000000000000000e+00 1629 212 1.0000000000000000e+00 1629 181 -1.0000000000000000e+00 1630 268 1.0000000000000000e+00 1630 181 -1.0000000000000000e+00 1631 276 1.0000000000000000e+00 1631 181 -1.0000000000000000e+00 1632 244 1.0000000000000000e+00 1632 181 -1.0000000000000000e+00 1633 209 1.0000000000000000e+00 1633 182 -1.0000000000000000e+00 1634 270 1.0000000000000000e+00 1634 182 -1.0000000000000000e+00 1635 271 1.0000000000000000e+00 1635 182 -1.0000000000000000e+00 1636 269 1.0000000000000000e+00 1636 182 -1.0000000000000000e+00 1637 297 1.0000000000000000e+00 1637 182 -1.0000000000000000e+00 1638 273 1.0000000000000000e+00 1638 182 -1.0000000000000000e+00 1639 274 1.0000000000000000e+00 1639 182 -1.0000000000000000e+00 1640 276 1.0000000000000000e+00 1640 182 -1.0000000000000000e+00 1641 277 1.0000000000000000e+00 1641 182 -1.0000000000000000e+00 1642 298 1.0000000000000000e+00 1642 182 -1.0000000000000000e+00 1643 247 1.0000000000000000e+00 1643 182 -1.0000000000000000e+00 1644 286 1.0000000000000000e+00 1644 183 -1.0000000000000000e+00 1645 287 1.0000000000000000e+00 1645 183 -1.0000000000000000e+00 1646 300 1.0000000000000000e+00 1646 21 -1.0000000000000000e+00 1647 279 1.0000000000000000e+00 1647 21 -1.0000000000000000e+00 1648 307 1.0000000000000000e+00 1648 21 -1.0000000000000000e+00 1649 313 1.0000000000000000e+00 1649 184 -1.0000000000000000e+00 1650 309 1.0000000000000000e+00 1650 184 -1.0000000000000000e+00 1651 316 1.0000000000000000e+00 1651 184 -1.0000000000000000e+00 1652 331 1.0000000000000000e+00 1652 184 -1.0000000000000000e+00 1653 311 1.0000000000000000e+00 1653 184 -1.0000000000000000e+00 1654 299 1.0000000000000000e+00 1654 184 -1.0000000000000000e+00 1655 361 1.0000000000000000e+00 1655 184 -1.0000000000000000e+00 1656 363 1.0000000000000000e+00 1656 184 -1.0000000000000000e+00 1657 308 1.0000000000000000e+00 1657 184 -1.0000000000000000e+00 1658 312 1.0000000000000000e+00 1658 184 -1.0000000000000000e+00 1659 236 1.0000000000000000e+00 1659 184 -1.0000000000000000e+00 1660 317 1.0000000000000000e+00 1660 184 -1.0000000000000000e+00 1661 330 1.0000000000000000e+00 1661 184 -1.0000000000000000e+00 1662 226 1.0000000000000000e+00 1662 184 -1.0000000000000000e+00 1663 362 1.0000000000000000e+00 1663 184 -1.0000000000000000e+00 1664 295 1.0000000000000000e+00 1664 184 -1.0000000000000000e+00 1665 326 1.0000000000000000e+00 1665 185 -1.0000000000000000e+00 1666 352 1.0000000000000000e+00 1666 185 -1.0000000000000000e+00 1667 324 1.0000000000000000e+00 1667 185 -1.0000000000000000e+00 1668 321 1.0000000000000000e+00 1668 185 -1.0000000000000000e+00 1669 322 1.0000000000000000e+00 1669 185 -1.0000000000000000e+00 1670 325 1.0000000000000000e+00 1670 185 -1.0000000000000000e+00 1671 349 1.0000000000000000e+00 1671 185 -1.0000000000000000e+00 1672 334 1.0000000000000000e+00 1672 186 -1.0000000000000000e+00 1673 333 1.0000000000000000e+00 1673 186 -1.0000000000000000e+00 1674 335 1.0000000000000000e+00 1674 186 -1.0000000000000000e+00 1675 336 1.0000000000000000e+00 1675 186 -1.0000000000000000e+00 1676 329 1.0000000000000000e+00 1676 186 -1.0000000000000000e+00 1677 337 1.0000000000000000e+00 1677 186 -1.0000000000000000e+00 1678 344 1.0000000000000000e+00 1678 187 -1.0000000000000000e+00 1679 340 1.0000000000000000e+00 1679 187 -1.0000000000000000e+00 1680 345 1.0000000000000000e+00 1680 187 -1.0000000000000000e+00 1681 350 1.0000000000000000e+00 1681 187 -1.0000000000000000e+00 1682 342 1.0000000000000000e+00 1682 187 -1.0000000000000000e+00 1683 339 1.0000000000000000e+00 1683 187 -1.0000000000000000e+00 1684 343 1.0000000000000000e+00 1684 187 -1.0000000000000000e+00 1685 214 1.0000000000000000e+00 1685 187 -1.0000000000000000e+00 1686 346 1.0000000000000000e+00 1686 187 -1.0000000000000000e+00 1687 349 1.0000000000000000e+00 1687 187 -1.0000000000000000e+00 1688 188 1.0000000000000000e+00 1688 187 -1.0000000000000000e+00 1689 356 1.0000000000000000e+00 1689 653 -1.0000000000000000e+00 1690 364 1.0000000000000000e+00 1690 653 -1.0000000000000000e+00 1691 355 1.0000000000000000e+00 1691 653 -1.0000000000000000e+00 1692 365 1.0000000000000000e+00 1692 653 -1.0000000000000000e+00 1693 192 1.0000000000000000e+00 1693 188 -1.0000000000000000e+00 1694 193 1.0000000000000000e+00 1694 188 -1.0000000000000000e+00 1695 350 1.0000000000000000e+00 1695 188 -1.0000000000000000e+00 1696 190 1.0000000000000000e+00 1696 188 -1.0000000000000000e+00 1697 189 1.0000000000000000e+00 1697 188 -1.0000000000000000e+00 1698 191 1.0000000000000000e+00 1698 188 -1.0000000000000000e+00 1699 343 1.0000000000000000e+00 1699 188 -1.0000000000000000e+00 1700 342 1.0000000000000000e+00 1700 188 -1.0000000000000000e+00 1701 191 1.0000000000000000e+00 1701 189 -1.0000000000000000e+00 1702 190 1.0000000000000000e+00 1702 189 -1.0000000000000000e+00 1703 189 1.0000000000000000e+00 1703 251 -1.0000000000000000e+00 1704 350 1.0000000000000000e+00 1704 190 -1.0000000000000000e+00 1705 251 1.0000000000000000e+00 1705 190 -1.0000000000000000e+00 1706 252 1.0000000000000000e+00 1706 190 -1.0000000000000000e+00 1707 344 1.0000000000000000e+00 1707 190 -1.0000000000000000e+00 1708 251 1.0000000000000000e+00 1708 191 -1.0000000000000000e+00 1709 283 1.0000000000000000e+00 1709 191 -1.0000000000000000e+00 1710 192 1.0000000000000000e+00 1710 191 -1.0000000000000000e+00 1711 282 1.0000000000000000e+00 1711 191 -1.0000000000000000e+00 1712 193 1.0000000000000000e+00 1712 192 -1.0000000000000000e+00 1713 192 -1.0000000000000000e+00 1713 481 1.0000000000000000e+00 1714 282 1.0000000000000000e+00 1714 192 -1.0000000000000000e+00 1715 284 1.0000000000000000e+00 1715 192 -1.0000000000000000e+00 1716 339 1.0000000000000000e+00 1716 193 -1.0000000000000000e+00 1717 343 1.0000000000000000e+00 1717 193 -1.0000000000000000e+00 1718 282 1.0000000000000000e+00 1718 193 -1.0000000000000000e+00 1719 288 1.0000000000000000e+00 1719 193 -1.0000000000000000e+00 1720 198 1.0000000000000000e+00 1720 194 -1.0000000000000000e+00 1721 199 1.0000000000000000e+00 1721 194 -1.0000000000000000e+00 1722 261 1.0000000000000000e+00 1722 194 -1.0000000000000000e+00 1723 194 -1.0000000000000000e+00 1723 262 1.0000000000000000e+00 1724 195 1.0000000000000000e+00 1724 194 -1.0000000000000000e+00 1725 257 1.0000000000000000e+00 1725 194 -1.0000000000000000e+00 1726 303 1.0000000000000000e+00 1726 194 -1.0000000000000000e+00 1727 304 1.0000000000000000e+00 1727 194 -1.0000000000000000e+00 1728 302 1.0000000000000000e+00 1728 194 -1.0000000000000000e+00 1729 305 1.0000000000000000e+00 1729 194 -1.0000000000000000e+00 1730 197 1.0000000000000000e+00 1730 194 -1.0000000000000000e+00 1731 196 1.0000000000000000e+00 1731 194 -1.0000000000000000e+00 1732 259 1.0000000000000000e+00 1732 194 -1.0000000000000000e+00 1733 201 1.0000000000000000e+00 1733 194 -1.0000000000000000e+00 1734 260 1.0000000000000000e+00 1734 194 -1.0000000000000000e+00 1735 207 1.0000000000000000e+00 1735 194 -1.0000000000000000e+00 1736 227 1.0000000000000000e+00 1736 194 -1.0000000000000000e+00 1737 257 1.0000000000000000e+00 1737 195 -1.0000000000000000e+00 1738 256 1.0000000000000000e+00 1738 195 -1.0000000000000000e+00 1739 196 1.0000000000000000e+00 1739 195 -1.0000000000000000e+00 1740 197 1.0000000000000000e+00 1740 195 -1.0000000000000000e+00 1741 201 1.0000000000000000e+00 1741 195 -1.0000000000000000e+00 1742 256 1.0000000000000000e+00 1742 196 -1.0000000000000000e+00 1743 198 1.0000000000000000e+00 1743 196 -1.0000000000000000e+00 1744 266 1.0000000000000000e+00 1744 196 -1.0000000000000000e+00 1745 209 1.0000000000000000e+00 1745 197 -1.0000000000000000e+00 1746 210 1.0000000000000000e+00 1746 197 -1.0000000000000000e+00 1747 256 1.0000000000000000e+00 1747 197 -1.0000000000000000e+00 1748 264 1.0000000000000000e+00 1748 197 -1.0000000000000000e+00 1749 292 1.0000000000000000e+00 1749 197 -1.0000000000000000e+00 1750 302 1.0000000000000000e+00 1750 197 -1.0000000000000000e+00 1751 199 1.0000000000000000e+00 1751 198 -1.0000000000000000e+00 1752 305 1.0000000000000000e+00 1752 198 -1.0000000000000000e+00 1753 304 1.0000000000000000e+00 1753 198 -1.0000000000000000e+00 1754 355 1.0000000000000000e+00 1754 199 -1.0000000000000000e+00 1755 261 1.0000000000000000e+00 1755 199 -1.0000000000000000e+00 1756 365 1.0000000000000000e+00 1756 199 -1.0000000000000000e+00 1757 200 -1.0000000000000000e+00 1757 812 1.0000000000000000e+00 1758 200 -1.0000000000000000e+00 1758 811 1.0000000000000000e+00 1759 206 1.0000000000000000e+00 1759 200 -1.0000000000000000e+00 1760 200 -1.0000000000000000e+00 1760 667 1.0000000000000000e+00 1761 259 1.0000000000000000e+00 1761 200 -1.0000000000000000e+00 1762 260 1.0000000000000000e+00 1762 200 -1.0000000000000000e+00 1763 208 1.0000000000000000e+00 1763 200 -1.0000000000000000e+00 1764 263 1.0000000000000000e+00 1764 200 -1.0000000000000000e+00 1765 202 1.0000000000000000e+00 1765 200 -1.0000000000000000e+00 1766 201 1.0000000000000000e+00 1766 200 -1.0000000000000000e+00 1767 207 1.0000000000000000e+00 1767 200 -1.0000000000000000e+00 1768 301 1.0000000000000000e+00 1768 200 -1.0000000000000000e+00 1769 810 1.0000000000000000e+00 1769 812 -1.0000000000000000e+00 1770 202 1.0000000000000000e+00 1770 812 -1.0000000000000000e+00 1771 201 1.0000000000000000e+00 1771 812 -1.0000000000000000e+00 1772 278 1.0000000000000000e+00 1772 812 -1.0000000000000000e+00 1773 358 1.0000000000000000e+00 1773 812 -1.0000000000000000e+00 1774 750 1.0000000000000000e+00 1774 812 -1.0000000000000000e+00 1775 748 1.0000000000000000e+00 1775 812 -1.0000000000000000e+00 1776 256 1.0000000000000000e+00 1776 201 -1.0000000000000000e+00 1777 243 1.0000000000000000e+00 1777 201 -1.0000000000000000e+00 1778 259 1.0000000000000000e+00 1778 201 -1.0000000000000000e+00 1779 278 1.0000000000000000e+00 1779 201 -1.0000000000000000e+00 1780 269 1.0000000000000000e+00 1780 202 -1.0000000000000000e+00 1781 246 1.0000000000000000e+00 1781 202 -1.0000000000000000e+00 1782 206 1.0000000000000000e+00 1782 202 -1.0000000000000000e+00 1783 278 1.0000000000000000e+00 1783 202 -1.0000000000000000e+00 1784 299 1.0000000000000000e+00 1784 202 -1.0000000000000000e+00 1785 206 1.0000000000000000e+00 1785 667 -1.0000000000000000e+00 1786 260 1.0000000000000000e+00 1786 811 -1.0000000000000000e+00 1787 263 1.0000000000000000e+00 1787 811 -1.0000000000000000e+00 1788 205 1.0000000000000000e+00 1788 783 -1.0000000000000000e+00 1789 280 1.0000000000000000e+00 1789 783 -1.0000000000000000e+00 1790 284 1.0000000000000000e+00 1790 783 -1.0000000000000000e+00 1791 289 1.0000000000000000e+00 1791 783 -1.0000000000000000e+00 1792 203 1.0000000000000000e+00 1792 783 -1.0000000000000000e+00 1793 279 1.0000000000000000e+00 1793 783 -1.0000000000000000e+00 1794 204 1.0000000000000000e+00 1794 783 -1.0000000000000000e+00 1795 291 1.0000000000000000e+00 1795 783 -1.0000000000000000e+00 1796 204 1.0000000000000000e+00 1796 784 -1.0000000000000000e+00 1797 203 1.0000000000000000e+00 1797 784 -1.0000000000000000e+00 1798 289 1.0000000000000000e+00 1798 203 -1.0000000000000000e+00 1799 204 -1.0000000000000000e+00 1799 781 1.0000000000000000e+00 1800 205 1.0000000000000000e+00 1800 781 -1.0000000000000000e+00 1801 284 1.0000000000000000e+00 1801 205 -1.0000000000000000e+00 1802 255 1.0000000000000000e+00 1802 206 -1.0000000000000000e+00 1803 206 -1.0000000000000000e+00 1803 761 1.0000000000000000e+00 1804 208 1.0000000000000000e+00 1804 206 -1.0000000000000000e+00 1805 334 1.0000000000000000e+00 1805 206 -1.0000000000000000e+00 1806 207 1.0000000000000000e+00 1806 206 -1.0000000000000000e+00 1807 299 1.0000000000000000e+00 1807 206 -1.0000000000000000e+00 1808 361 1.0000000000000000e+00 1808 206 -1.0000000000000000e+00 1809 330 1.0000000000000000e+00 1809 206 -1.0000000000000000e+00 1810 206 -1.0000000000000000e+00 1810 693 1.0000000000000000e+00 1811 206 -1.0000000000000000e+00 1811 760 1.0000000000000000e+00 1812 299 1.0000000000000000e+00 1812 207 -1.0000000000000000e+00 1813 292 1.0000000000000000e+00 1813 207 -1.0000000000000000e+00 1814 207 1.0000000000000000e+00 1814 259 -1.0000000000000000e+00 1815 302 1.0000000000000000e+00 1815 207 -1.0000000000000000e+00 1816 263 1.0000000000000000e+00 1816 208 -1.0000000000000000e+00 1817 334 1.0000000000000000e+00 1817 208 -1.0000000000000000e+00 1818 301 1.0000000000000000e+00 1818 208 -1.0000000000000000e+00 1819 208 -1.0000000000000000e+00 1819 760 1.0000000000000000e+00 1820 212 1.0000000000000000e+00 1820 209 -1.0000000000000000e+00 1821 213 1.0000000000000000e+00 1821 209 -1.0000000000000000e+00 1822 264 1.0000000000000000e+00 1822 209 -1.0000000000000000e+00 1823 265 1.0000000000000000e+00 1823 209 -1.0000000000000000e+00 1824 276 1.0000000000000000e+00 1824 209 -1.0000000000000000e+00 1825 268 1.0000000000000000e+00 1825 209 -1.0000000000000000e+00 1826 270 1.0000000000000000e+00 1826 209 -1.0000000000000000e+00 1827 271 1.0000000000000000e+00 1827 209 -1.0000000000000000e+00 1828 298 1.0000000000000000e+00 1828 209 -1.0000000000000000e+00 1829 277 1.0000000000000000e+00 1829 209 -1.0000000000000000e+00 1830 210 1.0000000000000000e+00 1830 209 -1.0000000000000000e+00 1831 293 1.0000000000000000e+00 1831 209 -1.0000000000000000e+00 1832 211 1.0000000000000000e+00 1832 209 -1.0000000000000000e+00 1833 272 1.0000000000000000e+00 1833 209 -1.0000000000000000e+00 1834 275 1.0000000000000000e+00 1834 209 -1.0000000000000000e+00 1835 294 1.0000000000000000e+00 1835 209 -1.0000000000000000e+00 1836 297 1.0000000000000000e+00 1836 209 -1.0000000000000000e+00 1837 293 1.0000000000000000e+00 1837 210 -1.0000000000000000e+00 1838 292 1.0000000000000000e+00 1838 210 -1.0000000000000000e+00 1839 211 1.0000000000000000e+00 1839 210 -1.0000000000000000e+00 1840 294 1.0000000000000000e+00 1840 210 -1.0000000000000000e+00 1841 292 1.0000000000000000e+00 1841 211 -1.0000000000000000e+00 1842 212 1.0000000000000000e+00 1842 211 -1.0000000000000000e+00 1843 306 1.0000000000000000e+00 1843 211 -1.0000000000000000e+00 1844 213 1.0000000000000000e+00 1844 212 -1.0000000000000000e+00 1845 265 1.0000000000000000e+00 1845 212 -1.0000000000000000e+00 1846 268 1.0000000000000000e+00 1846 212 -1.0000000000000000e+00 1847 298 1.0000000000000000e+00 1847 213 -1.0000000000000000e+00 1848 218 1.0000000000000000e+00 1848 214 -1.0000000000000000e+00 1849 219 1.0000000000000000e+00 1849 214 -1.0000000000000000e+00 1850 340 1.0000000000000000e+00 1850 214 -1.0000000000000000e+00 1851 216 1.0000000000000000e+00 1851 214 -1.0000000000000000e+00 1852 215 1.0000000000000000e+00 1852 214 -1.0000000000000000e+00 1853 217 1.0000000000000000e+00 1853 214 -1.0000000000000000e+00 1854 346 1.0000000000000000e+00 1854 214 -1.0000000000000000e+00 1855 345 1.0000000000000000e+00 1855 214 -1.0000000000000000e+00 1856 319 1.0000000000000000e+00 1856 215 -1.0000000000000000e+00 1857 223 1.0000000000000000e+00 1857 215 -1.0000000000000000e+00 1858 308 1.0000000000000000e+00 1858 215 -1.0000000000000000e+00 1859 310 1.0000000000000000e+00 1859 215 -1.0000000000000000e+00 1860 217 1.0000000000000000e+00 1860 215 -1.0000000000000000e+00 1861 216 1.0000000000000000e+00 1861 215 -1.0000000000000000e+00 1862 340 1.0000000000000000e+00 1862 216 -1.0000000000000000e+00 1863 319 1.0000000000000000e+00 1863 216 -1.0000000000000000e+00 1864 314 1.0000000000000000e+00 1864 216 -1.0000000000000000e+00 1865 344 1.0000000000000000e+00 1865 216 -1.0000000000000000e+00 1866 319 1.0000000000000000e+00 1866 217 -1.0000000000000000e+00 1867 221 1.0000000000000000e+00 1867 217 -1.0000000000000000e+00 1868 218 1.0000000000000000e+00 1868 217 -1.0000000000000000e+00 1869 321 1.0000000000000000e+00 1869 217 -1.0000000000000000e+00 1870 219 1.0000000000000000e+00 1870 218 -1.0000000000000000e+00 1871 321 1.0000000000000000e+00 1871 218 -1.0000000000000000e+00 1872 321 1.0000000000000000e+00 1872 219 -1.0000000000000000e+00 1873 325 1.0000000000000000e+00 1873 219 -1.0000000000000000e+00 1874 349 1.0000000000000000e+00 1874 219 -1.0000000000000000e+00 1875 346 1.0000000000000000e+00 1875 219 -1.0000000000000000e+00 1876 224 1.0000000000000000e+00 1876 220 -1.0000000000000000e+00 1877 225 1.0000000000000000e+00 1877 220 -1.0000000000000000e+00 1878 354 1.0000000000000000e+00 1878 220 -1.0000000000000000e+00 1879 222 1.0000000000000000e+00 1879 220 -1.0000000000000000e+00 1880 221 1.0000000000000000e+00 1880 220 -1.0000000000000000e+00 1881 223 1.0000000000000000e+00 1881 220 -1.0000000000000000e+00 1882 230 1.0000000000000000e+00 1882 220 -1.0000000000000000e+00 1883 229 1.0000000000000000e+00 1883 220 -1.0000000000000000e+00 1884 319 1.0000000000000000e+00 1884 221 -1.0000000000000000e+00 1885 321 1.0000000000000000e+00 1885 221 -1.0000000000000000e+00 1886 323 1.0000000000000000e+00 1886 221 -1.0000000000000000e+00 1887 223 1.0000000000000000e+00 1887 221 -1.0000000000000000e+00 1888 222 1.0000000000000000e+00 1888 221 -1.0000000000000000e+00 1889 354 1.0000000000000000e+00 1889 222 -1.0000000000000000e+00 1890 319 1.0000000000000000e+00 1890 222 -1.0000000000000000e+00 1891 327 1.0000000000000000e+00 1891 222 -1.0000000000000000e+00 1892 328 1.0000000000000000e+00 1892 222 -1.0000000000000000e+00 1893 319 1.0000000000000000e+00 1893 223 -1.0000000000000000e+00 1894 224 1.0000000000000000e+00 1894 223 -1.0000000000000000e+00 1895 308 1.0000000000000000e+00 1895 223 -1.0000000000000000e+00 1896 225 1.0000000000000000e+00 1896 224 -1.0000000000000000e+00 1897 308 1.0000000000000000e+00 1897 224 -1.0000000000000000e+00 1898 226 1.0000000000000000e+00 1898 225 -1.0000000000000000e+00 1899 230 1.0000000000000000e+00 1899 225 -1.0000000000000000e+00 1900 308 1.0000000000000000e+00 1900 225 -1.0000000000000000e+00 1901 312 1.0000000000000000e+00 1901 225 -1.0000000000000000e+00 1902 230 1.0000000000000000e+00 1902 226 -1.0000000000000000e+00 1903 299 1.0000000000000000e+00 1903 226 -1.0000000000000000e+00 1904 292 1.0000000000000000e+00 1904 226 -1.0000000000000000e+00 1905 331 1.0000000000000000e+00 1905 226 -1.0000000000000000e+00 1906 228 1.0000000000000000e+00 1906 226 -1.0000000000000000e+00 1907 312 1.0000000000000000e+00 1907 226 -1.0000000000000000e+00 1908 227 1.0000000000000000e+00 1908 226 -1.0000000000000000e+00 1909 229 1.0000000000000000e+00 1909 226 -1.0000000000000000e+00 1910 311 1.0000000000000000e+00 1910 226 -1.0000000000000000e+00 1911 292 1.0000000000000000e+00 1911 227 -1.0000000000000000e+00 1912 302 1.0000000000000000e+00 1912 227 -1.0000000000000000e+00 1913 229 1.0000000000000000e+00 1913 227 -1.0000000000000000e+00 1914 228 1.0000000000000000e+00 1914 227 -1.0000000000000000e+00 1915 227 1.0000000000000000e+00 1915 303 -1.0000000000000000e+00 1916 227 1.0000000000000000e+00 1916 328 -1.0000000000000000e+00 1917 331 1.0000000000000000e+00 1917 228 -1.0000000000000000e+00 1918 328 1.0000000000000000e+00 1918 228 -1.0000000000000000e+00 1919 329 1.0000000000000000e+00 1919 228 -1.0000000000000000e+00 1920 313 1.0000000000000000e+00 1920 228 -1.0000000000000000e+00 1921 328 1.0000000000000000e+00 1921 229 -1.0000000000000000e+00 1922 354 1.0000000000000000e+00 1922 229 -1.0000000000000000e+00 1923 230 1.0000000000000000e+00 1923 229 -1.0000000000000000e+00 1924 292 1.0000000000000000e+00 1924 230 -1.0000000000000000e+00 1925 306 1.0000000000000000e+00 1925 230 -1.0000000000000000e+00 1926 231 -1.0000000000000000e+00 1926 693 1.0000000000000000e+00 1927 235 1.0000000000000000e+00 1927 231 -1.0000000000000000e+00 1928 279 1.0000000000000000e+00 1928 231 -1.0000000000000000e+00 1929 240 1.0000000000000000e+00 1929 231 -1.0000000000000000e+00 1930 231 -1.0000000000000000e+00 1930 688 1.0000000000000000e+00 1931 281 1.0000000000000000e+00 1931 231 -1.0000000000000000e+00 1932 233 1.0000000000000000e+00 1932 231 -1.0000000000000000e+00 1933 232 1.0000000000000000e+00 1933 231 -1.0000000000000000e+00 1934 234 1.0000000000000000e+00 1934 231 -1.0000000000000000e+00 1935 239 1.0000000000000000e+00 1935 231 -1.0000000000000000e+00 1936 232 -1.0000000000000000e+00 1936 688 1.0000000000000000e+00 1937 232 1.0000000000000000e+00 1937 689 -1.0000000000000000e+00 1938 234 1.0000000000000000e+00 1938 232 -1.0000000000000000e+00 1939 233 1.0000000000000000e+00 1939 232 -1.0000000000000000e+00 1940 333 -1.0000000000000000e+00 1940 232 1.0000000000000000e+00 1941 281 1.0000000000000000e+00 1941 233 -1.0000000000000000e+00 1942 333 1.0000000000000000e+00 1942 233 -1.0000000000000000e+00 1943 338 1.0000000000000000e+00 1943 233 -1.0000000000000000e+00 1944 347 1.0000000000000000e+00 1944 233 -1.0000000000000000e+00 1945 333 1.0000000000000000e+00 1945 234 -1.0000000000000000e+00 1946 334 1.0000000000000000e+00 1946 234 -1.0000000000000000e+00 1947 234 -1.0000000000000000e+00 1947 693 1.0000000000000000e+00 1948 330 1.0000000000000000e+00 1948 234 -1.0000000000000000e+00 1949 235 1.0000000000000000e+00 1949 693 -1.0000000000000000e+00 1950 255 1.0000000000000000e+00 1950 693 -1.0000000000000000e+00 1951 330 1.0000000000000000e+00 1951 693 -1.0000000000000000e+00 1952 236 1.0000000000000000e+00 1952 235 -1.0000000000000000e+00 1953 240 1.0000000000000000e+00 1953 235 -1.0000000000000000e+00 1954 330 1.0000000000000000e+00 1954 235 -1.0000000000000000e+00 1955 317 1.0000000000000000e+00 1955 235 -1.0000000000000000e+00 1956 240 1.0000000000000000e+00 1956 236 -1.0000000000000000e+00 1957 309 1.0000000000000000e+00 1957 236 -1.0000000000000000e+00 1958 238 1.0000000000000000e+00 1958 236 -1.0000000000000000e+00 1959 237 1.0000000000000000e+00 1959 236 -1.0000000000000000e+00 1960 239 1.0000000000000000e+00 1960 236 -1.0000000000000000e+00 1961 317 1.0000000000000000e+00 1961 236 -1.0000000000000000e+00 1962 316 1.0000000000000000e+00 1962 236 -1.0000000000000000e+00 1963 347 1.0000000000000000e+00 1963 237 -1.0000000000000000e+00 1964 348 1.0000000000000000e+00 1964 237 -1.0000000000000000e+00 1965 339 1.0000000000000000e+00 1965 237 -1.0000000000000000e+00 1966 341 1.0000000000000000e+00 1966 237 -1.0000000000000000e+00 1967 239 1.0000000000000000e+00 1967 237 -1.0000000000000000e+00 1968 238 1.0000000000000000e+00 1968 237 -1.0000000000000000e+00 1969 309 1.0000000000000000e+00 1969 238 -1.0000000000000000e+00 1970 313 1.0000000000000000e+00 1970 238 -1.0000000000000000e+00 1971 314 1.0000000000000000e+00 1971 238 -1.0000000000000000e+00 1972 347 1.0000000000000000e+00 1972 238 -1.0000000000000000e+00 1973 347 1.0000000000000000e+00 1973 239 -1.0000000000000000e+00 1974 281 1.0000000000000000e+00 1974 239 -1.0000000000000000e+00 1975 240 1.0000000000000000e+00 1975 239 -1.0000000000000000e+00 1976 279 1.0000000000000000e+00 1976 240 -1.0000000000000000e+00 1977 240 -1.0000000000000000e+00 1977 702 1.0000000000000000e+00 1978 242 1.0000000000000000e+00 1978 710 -1.0000000000000000e+00 1979 356 1.0000000000000000e+00 1979 710 -1.0000000000000000e+00 1980 257 1.0000000000000000e+00 1980 710 -1.0000000000000000e+00 1981 258 1.0000000000000000e+00 1981 710 -1.0000000000000000e+00 1982 809 1.0000000000000000e+00 1982 710 -1.0000000000000000e+00 1983 241 1.0000000000000000e+00 1983 710 -1.0000000000000000e+00 1984 364 1.0000000000000000e+00 1984 710 -1.0000000000000000e+00 1985 241 1.0000000000000000e+00 1985 802 -1.0000000000000000e+00 1986 809 1.0000000000000000e+00 1986 802 -1.0000000000000000e+00 1987 243 1.0000000000000000e+00 1987 241 -1.0000000000000000e+00 1988 242 1.0000000000000000e+00 1988 241 -1.0000000000000000e+00 1989 241 -1.0000000000000000e+00 1989 796 1.0000000000000000e+00 1990 241 -1.0000000000000000e+00 1990 810 1.0000000000000000e+00 1991 355 1.0000000000000000e+00 1991 809 -1.0000000000000000e+00 1992 356 1.0000000000000000e+00 1992 809 -1.0000000000000000e+00 1993 357 -1.0000000000000000e+00 1993 809 1.0000000000000000e+00 1994 242 -1.0000000000000000e+00 1994 806 1.0000000000000000e+00 1995 243 1.0000000000000000e+00 1995 242 -1.0000000000000000e+00 1996 256 1.0000000000000000e+00 1996 242 -1.0000000000000000e+00 1997 258 1.0000000000000000e+00 1997 242 -1.0000000000000000e+00 1998 257 1.0000000000000000e+00 1998 242 -1.0000000000000000e+00 1999 243 1.0000000000000000e+00 1999 806 -1.0000000000000000e+00 2000 244 1.0000000000000000e+00 2000 806 -1.0000000000000000e+00 2001 278 1.0000000000000000e+00 2001 243 -1.0000000000000000e+00 2002 272 1.0000000000000000e+00 2002 243 -1.0000000000000000e+00 2003 256 1.0000000000000000e+00 2003 243 -1.0000000000000000e+00 2004 358 1.0000000000000000e+00 2004 243 -1.0000000000000000e+00 2005 243 -1.0000000000000000e+00 2005 810 1.0000000000000000e+00 2006 359 1.0000000000000000e+00 2006 243 -1.0000000000000000e+00 2007 245 1.0000000000000000e+00 2007 243 -1.0000000000000000e+00 2008 244 1.0000000000000000e+00 2008 243 -1.0000000000000000e+00 2009 243 -1.0000000000000000e+00 2009 805 1.0000000000000000e+00 2010 245 1.0000000000000000e+00 2010 244 -1.0000000000000000e+00 2011 256 1.0000000000000000e+00 2011 244 -1.0000000000000000e+00 2012 275 1.0000000000000000e+00 2012 244 -1.0000000000000000e+00 2013 267 1.0000000000000000e+00 2013 244 -1.0000000000000000e+00 2014 359 1.0000000000000000e+00 2014 245 -1.0000000000000000e+00 2015 249 1.0000000000000000e+00 2015 246 -1.0000000000000000e+00 2016 250 1.0000000000000000e+00 2016 246 -1.0000000000000000e+00 2017 299 1.0000000000000000e+00 2017 246 -1.0000000000000000e+00 2018 294 1.0000000000000000e+00 2018 246 -1.0000000000000000e+00 2019 269 1.0000000000000000e+00 2019 246 -1.0000000000000000e+00 2020 361 1.0000000000000000e+00 2020 246 -1.0000000000000000e+00 2021 255 1.0000000000000000e+00 2021 246 -1.0000000000000000e+00 2022 362 1.0000000000000000e+00 2022 246 -1.0000000000000000e+00 2023 248 1.0000000000000000e+00 2023 246 -1.0000000000000000e+00 2024 247 1.0000000000000000e+00 2024 246 -1.0000000000000000e+00 2025 246 -1.0000000000000000e+00 2025 846 1.0000000000000000e+00 2026 246 -1.0000000000000000e+00 2026 845 1.0000000000000000e+00 2027 247 -1.0000000000000000e+00 2027 846 1.0000000000000000e+00 2028 248 1.0000000000000000e+00 2028 247 -1.0000000000000000e+00 2029 269 1.0000000000000000e+00 2029 247 -1.0000000000000000e+00 2030 297 1.0000000000000000e+00 2030 247 -1.0000000000000000e+00 2031 274 1.0000000000000000e+00 2031 247 -1.0000000000000000e+00 2032 362 1.0000000000000000e+00 2032 248 -1.0000000000000000e+00 2033 249 1.0000000000000000e+00 2033 846 -1.0000000000000000e+00 2034 250 1.0000000000000000e+00 2034 249 -1.0000000000000000e+00 2035 249 -1.0000000000000000e+00 2035 669 1.0000000000000000e+00 2036 278 1.0000000000000000e+00 2036 249 -1.0000000000000000e+00 2037 269 1.0000000000000000e+00 2037 249 -1.0000000000000000e+00 2038 249 -1.0000000000000000e+00 2038 673 1.0000000000000000e+00 2039 254 1.0000000000000000e+00 2039 249 -1.0000000000000000e+00 2040 250 -1.0000000000000000e+00 2040 764 1.0000000000000000e+00 2041 250 -1.0000000000000000e+00 2041 842 1.0000000000000000e+00 2042 250 -1.0000000000000000e+00 2042 669 1.0000000000000000e+00 2043 255 1.0000000000000000e+00 2043 250 -1.0000000000000000e+00 2044 251 -1.0000000000000000e+00 2044 252 1.0000000000000000e+00 2045 253 1.0000000000000000e+00 2045 251 -1.0000000000000000e+00 2046 251 -1.0000000000000000e+00 2046 283 1.0000000000000000e+00 2047 338 1.0000000000000000e+00 2047 251 -1.0000000000000000e+00 2048 353 1.0000000000000000e+00 2048 251 -1.0000000000000000e+00 2049 253 1.0000000000000000e+00 2049 252 -1.0000000000000000e+00 2050 344 1.0000000000000000e+00 2050 252 -1.0000000000000000e+00 2051 320 1.0000000000000000e+00 2051 252 -1.0000000000000000e+00 2052 351 1.0000000000000000e+00 2052 252 -1.0000000000000000e+00 2053 326 -1.0000000000000000e+00 2053 252 1.0000000000000000e+00 2054 344 1.0000000000000000e+00 2054 253 -1.0000000000000000e+00 2055 314 1.0000000000000000e+00 2055 253 -1.0000000000000000e+00 2056 347 1.0000000000000000e+00 2056 253 -1.0000000000000000e+00 2057 338 1.0000000000000000e+00 2057 253 -1.0000000000000000e+00 2058 254 1.0000000000000000e+00 2058 744 -1.0000000000000000e+00 2059 254 1.0000000000000000e+00 2059 670 -1.0000000000000000e+00 2060 666 1.0000000000000000e+00 2060 670 -1.0000000000000000e+00 2061 254 -1.0000000000000000e+00 2061 669 1.0000000000000000e+00 2062 358 1.0000000000000000e+00 2062 254 -1.0000000000000000e+00 2063 254 -1.0000000000000000e+00 2063 750 1.0000000000000000e+00 2064 278 1.0000000000000000e+00 2064 254 -1.0000000000000000e+00 2065 669 1.0000000000000000e+00 2065 666 -1.0000000000000000e+00 2066 842 1.0000000000000000e+00 2066 666 -1.0000000000000000e+00 2067 764 1.0000000000000000e+00 2067 666 -1.0000000000000000e+00 2068 759 1.0000000000000000e+00 2068 750 -1.0000000000000000e+00 2069 358 1.0000000000000000e+00 2069 750 -1.0000000000000000e+00 2070 358 1.0000000000000000e+00 2070 759 -1.0000000000000000e+00 2071 359 1.0000000000000000e+00 2071 759 -1.0000000000000000e+00 2072 278 1.0000000000000000e+00 2072 673 -1.0000000000000000e+00 2073 273 1.0000000000000000e+00 2073 673 -1.0000000000000000e+00 2074 255 1.0000000000000000e+00 2074 764 -1.0000000000000000e+00 2075 761 1.0000000000000000e+00 2075 764 -1.0000000000000000e+00 2076 255 1.0000000000000000e+00 2076 761 -1.0000000000000000e+00 2077 361 1.0000000000000000e+00 2077 255 -1.0000000000000000e+00 2078 255 -1.0000000000000000e+00 2078 845 1.0000000000000000e+00 2079 362 1.0000000000000000e+00 2079 845 -1.0000000000000000e+00 2080 258 1.0000000000000000e+00 2080 256 -1.0000000000000000e+00 2081 266 1.0000000000000000e+00 2081 256 -1.0000000000000000e+00 2082 267 1.0000000000000000e+00 2082 256 -1.0000000000000000e+00 2083 264 1.0000000000000000e+00 2083 256 -1.0000000000000000e+00 2084 275 1.0000000000000000e+00 2084 256 -1.0000000000000000e+00 2085 257 1.0000000000000000e+00 2085 256 -1.0000000000000000e+00 2086 265 1.0000000000000000e+00 2086 256 -1.0000000000000000e+00 2087 272 1.0000000000000000e+00 2087 256 -1.0000000000000000e+00 2088 356 1.0000000000000000e+00 2088 257 -1.0000000000000000e+00 2089 261 1.0000000000000000e+00 2089 257 -1.0000000000000000e+00 2090 355 1.0000000000000000e+00 2090 257 -1.0000000000000000e+00 2091 258 -1.0000000000000000e+00 2091 849 1.0000000000000000e+00 2092 266 1.0000000000000000e+00 2092 258 -1.0000000000000000e+00 2093 260 1.0000000000000000e+00 2093 259 -1.0000000000000000e+00 2094 259 -1.0000000000000000e+00 2094 301 1.0000000000000000e+00 2095 355 1.0000000000000000e+00 2095 260 -1.0000000000000000e+00 2096 260 1.0000000000000000e+00 2096 357 -1.0000000000000000e+00 2097 261 1.0000000000000000e+00 2097 260 -1.0000000000000000e+00 2098 262 1.0000000000000000e+00 2098 261 -1.0000000000000000e+00 2099 355 1.0000000000000000e+00 2099 261 -1.0000000000000000e+00 2100 355 -1.0000000000000000e+00 2100 262 1.0000000000000000e+00 2101 265 1.0000000000000000e+00 2101 264 -1.0000000000000000e+00 2102 275 1.0000000000000000e+00 2102 264 -1.0000000000000000e+00 2103 272 1.0000000000000000e+00 2103 264 -1.0000000000000000e+00 2104 266 1.0000000000000000e+00 2104 265 -1.0000000000000000e+00 2105 267 1.0000000000000000e+00 2105 266 -1.0000000000000000e+00 2106 276 1.0000000000000000e+00 2106 268 -1.0000000000000000e+00 2107 273 1.0000000000000000e+00 2107 269 -1.0000000000000000e+00 2108 274 1.0000000000000000e+00 2108 269 -1.0000000000000000e+00 2109 278 1.0000000000000000e+00 2109 269 -1.0000000000000000e+00 2110 270 1.0000000000000000e+00 2110 269 -1.0000000000000000e+00 2111 297 1.0000000000000000e+00 2111 269 -1.0000000000000000e+00 2112 272 1.0000000000000000e+00 2112 269 -1.0000000000000000e+00 2113 271 1.0000000000000000e+00 2113 269 -1.0000000000000000e+00 2114 294 1.0000000000000000e+00 2114 269 -1.0000000000000000e+00 2115 271 1.0000000000000000e+00 2115 270 -1.0000000000000000e+00 2116 297 1.0000000000000000e+00 2116 270 -1.0000000000000000e+00 2117 272 1.0000000000000000e+00 2117 270 -1.0000000000000000e+00 2118 294 1.0000000000000000e+00 2118 270 -1.0000000000000000e+00 2119 273 1.0000000000000000e+00 2119 271 -1.0000000000000000e+00 2120 276 1.0000000000000000e+00 2120 271 -1.0000000000000000e+00 2121 278 1.0000000000000000e+00 2121 272 -1.0000000000000000e+00 2122 274 1.0000000000000000e+00 2122 273 -1.0000000000000000e+00 2123 278 1.0000000000000000e+00 2123 273 -1.0000000000000000e+00 2124 360 1.0000000000000000e+00 2124 273 -1.0000000000000000e+00 2125 276 1.0000000000000000e+00 2125 275 -1.0000000000000000e+00 2126 277 1.0000000000000000e+00 2126 276 -1.0000000000000000e+00 2127 298 1.0000000000000000e+00 2127 277 -1.0000000000000000e+00 2128 358 1.0000000000000000e+00 2128 278 -1.0000000000000000e+00 2129 360 1.0000000000000000e+00 2129 278 -1.0000000000000000e+00 2130 280 1.0000000000000000e+00 2130 279 -1.0000000000000000e+00 2131 290 1.0000000000000000e+00 2131 279 -1.0000000000000000e+00 2132 279 -1.0000000000000000e+00 2132 701 1.0000000000000000e+00 2133 279 -1.0000000000000000e+00 2133 688 1.0000000000000000e+00 2134 279 -1.0000000000000000e+00 2134 481 1.0000000000000000e+00 2135 281 1.0000000000000000e+00 2135 279 -1.0000000000000000e+00 2136 279 -1.0000000000000000e+00 2136 702 1.0000000000000000e+00 2137 307 1.0000000000000000e+00 2137 279 -1.0000000000000000e+00 2138 300 1.0000000000000000e+00 2138 279 -1.0000000000000000e+00 2139 282 1.0000000000000000e+00 2139 280 -1.0000000000000000e+00 2140 281 1.0000000000000000e+00 2140 280 -1.0000000000000000e+00 2141 284 1.0000000000000000e+00 2141 280 -1.0000000000000000e+00 2142 290 1.0000000000000000e+00 2142 280 -1.0000000000000000e+00 2143 280 -1.0000000000000000e+00 2143 481 1.0000000000000000e+00 2144 288 1.0000000000000000e+00 2144 280 -1.0000000000000000e+00 2145 289 1.0000000000000000e+00 2145 280 -1.0000000000000000e+00 2146 282 1.0000000000000000e+00 2146 281 -1.0000000000000000e+00 2147 347 1.0000000000000000e+00 2147 281 -1.0000000000000000e+00 2148 348 1.0000000000000000e+00 2148 281 -1.0000000000000000e+00 2149 353 1.0000000000000000e+00 2149 281 -1.0000000000000000e+00 2150 284 1.0000000000000000e+00 2150 481 -1.0000000000000000e+00 2151 285 1.0000000000000000e+00 2151 481 -1.0000000000000000e+00 2152 283 1.0000000000000000e+00 2152 481 -1.0000000000000000e+00 2153 282 1.0000000000000000e+00 2153 481 -1.0000000000000000e+00 2154 286 1.0000000000000000e+00 2154 481 -1.0000000000000000e+00 2155 288 1.0000000000000000e+00 2155 282 -1.0000000000000000e+00 2156 283 1.0000000000000000e+00 2156 282 -1.0000000000000000e+00 2157 353 1.0000000000000000e+00 2157 282 -1.0000000000000000e+00 2158 348 1.0000000000000000e+00 2158 282 -1.0000000000000000e+00 2159 283 1.0000000000000000e+00 2159 287 -1.0000000000000000e+00 2160 353 1.0000000000000000e+00 2160 283 -1.0000000000000000e+00 2161 285 1.0000000000000000e+00 2161 284 -1.0000000000000000e+00 2162 291 1.0000000000000000e+00 2162 284 -1.0000000000000000e+00 2163 285 -1.0000000000000000e+00 2163 482 1.0000000000000000e+00 2164 286 1.0000000000000000e+00 2164 482 -1.0000000000000000e+00 2165 286 1.0000000000000000e+00 2165 287 -1.0000000000000000e+00 2166 289 1.0000000000000000e+00 2166 288 -1.0000000000000000e+00 2167 339 1.0000000000000000e+00 2167 288 -1.0000000000000000e+00 2168 348 1.0000000000000000e+00 2168 288 -1.0000000000000000e+00 2169 290 1.0000000000000000e+00 2169 289 -1.0000000000000000e+00 2170 291 1.0000000000000000e+00 2170 289 -1.0000000000000000e+00 2171 290 -1.0000000000000000e+00 2171 702 1.0000000000000000e+00 2172 295 1.0000000000000000e+00 2172 292 -1.0000000000000000e+00 2173 296 1.0000000000000000e+00 2173 292 -1.0000000000000000e+00 2174 299 1.0000000000000000e+00 2174 292 -1.0000000000000000e+00 2175 302 1.0000000000000000e+00 2175 292 -1.0000000000000000e+00 2176 306 1.0000000000000000e+00 2176 292 -1.0000000000000000e+00 2177 294 1.0000000000000000e+00 2177 292 -1.0000000000000000e+00 2178 293 1.0000000000000000e+00 2178 292 -1.0000000000000000e+00 2179 305 1.0000000000000000e+00 2179 292 -1.0000000000000000e+00 2180 295 1.0000000000000000e+00 2180 293 -1.0000000000000000e+00 2181 298 1.0000000000000000e+00 2181 293 -1.0000000000000000e+00 2182 299 1.0000000000000000e+00 2182 294 -1.0000000000000000e+00 2183 296 1.0000000000000000e+00 2183 295 -1.0000000000000000e+00 2184 299 1.0000000000000000e+00 2184 295 -1.0000000000000000e+00 2185 363 1.0000000000000000e+00 2185 295 -1.0000000000000000e+00 2186 312 1.0000000000000000e+00 2186 295 -1.0000000000000000e+00 2187 306 1.0000000000000000e+00 2187 296 -1.0000000000000000e+00 2188 298 1.0000000000000000e+00 2188 297 -1.0000000000000000e+00 2189 312 1.0000000000000000e+00 2189 299 -1.0000000000000000e+00 2190 361 1.0000000000000000e+00 2190 299 -1.0000000000000000e+00 2191 363 1.0000000000000000e+00 2191 299 -1.0000000000000000e+00 2192 331 1.0000000000000000e+00 2192 299 -1.0000000000000000e+00 2193 300 1.0000000000000000e+00 2193 688 -1.0000000000000000e+00 2194 300 1.0000000000000000e+00 2194 689 -1.0000000000000000e+00 2195 305 1.0000000000000000e+00 2195 302 -1.0000000000000000e+00 2196 304 1.0000000000000000e+00 2196 303 -1.0000000000000000e+00 2197 306 1.0000000000000000e+00 2197 305 -1.0000000000000000e+00 2198 312 1.0000000000000000e+00 2198 308 -1.0000000000000000e+00 2199 310 1.0000000000000000e+00 2199 308 -1.0000000000000000e+00 2200 309 1.0000000000000000e+00 2200 308 -1.0000000000000000e+00 2201 311 1.0000000000000000e+00 2201 308 -1.0000000000000000e+00 2202 313 1.0000000000000000e+00 2202 309 -1.0000000000000000e+00 2203 316 1.0000000000000000e+00 2203 309 -1.0000000000000000e+00 2204 311 1.0000000000000000e+00 2204 309 -1.0000000000000000e+00 2205 310 1.0000000000000000e+00 2205 309 -1.0000000000000000e+00 2206 313 1.0000000000000000e+00 2206 310 -1.0000000000000000e+00 2207 314 1.0000000000000000e+00 2207 310 -1.0000000000000000e+00 2208 319 1.0000000000000000e+00 2208 310 -1.0000000000000000e+00 2209 313 1.0000000000000000e+00 2209 311 -1.0000000000000000e+00 2210 331 1.0000000000000000e+00 2210 311 -1.0000000000000000e+00 2211 312 1.0000000000000000e+00 2211 311 -1.0000000000000000e+00 2212 316 1.0000000000000000e+00 2212 313 -1.0000000000000000e+00 2213 314 1.0000000000000000e+00 2213 313 -1.0000000000000000e+00 2214 318 1.0000000000000000e+00 2214 313 -1.0000000000000000e+00 2215 331 1.0000000000000000e+00 2215 313 -1.0000000000000000e+00 2216 329 1.0000000000000000e+00 2216 313 -1.0000000000000000e+00 2217 315 1.0000000000000000e+00 2217 313 -1.0000000000000000e+00 2218 332 1.0000000000000000e+00 2218 313 -1.0000000000000000e+00 2219 318 1.0000000000000000e+00 2219 314 -1.0000000000000000e+00 2220 319 1.0000000000000000e+00 2220 314 -1.0000000000000000e+00 2221 320 1.0000000000000000e+00 2221 314 -1.0000000000000000e+00 2222 344 1.0000000000000000e+00 2222 314 -1.0000000000000000e+00 2223 347 1.0000000000000000e+00 2223 314 -1.0000000000000000e+00 2224 315 1.0000000000000000e+00 2224 314 -1.0000000000000000e+00 2225 341 1.0000000000000000e+00 2225 314 -1.0000000000000000e+00 2226 329 1.0000000000000000e+00 2226 315 -1.0000000000000000e+00 2227 333 1.0000000000000000e+00 2227 315 -1.0000000000000000e+00 2228 338 1.0000000000000000e+00 2228 315 -1.0000000000000000e+00 2229 347 1.0000000000000000e+00 2229 315 -1.0000000000000000e+00 2230 317 1.0000000000000000e+00 2230 316 -1.0000000000000000e+00 2231 330 1.0000000000000000e+00 2231 316 -1.0000000000000000e+00 2232 331 1.0000000000000000e+00 2232 316 -1.0000000000000000e+00 2233 330 1.0000000000000000e+00 2233 317 -1.0000000000000000e+00 2234 361 1.0000000000000000e+00 2234 317 -1.0000000000000000e+00 2235 362 1.0000000000000000e+00 2235 317 -1.0000000000000000e+00 2236 319 1.0000000000000000e+00 2236 318 -1.0000000000000000e+00 2237 327 1.0000000000000000e+00 2237 318 -1.0000000000000000e+00 2238 328 1.0000000000000000e+00 2238 318 -1.0000000000000000e+00 2239 329 1.0000000000000000e+00 2239 318 -1.0000000000000000e+00 2240 320 1.0000000000000000e+00 2240 319 -1.0000000000000000e+00 2241 327 1.0000000000000000e+00 2241 319 -1.0000000000000000e+00 2242 323 1.0000000000000000e+00 2242 319 -1.0000000000000000e+00 2243 326 1.0000000000000000e+00 2243 320 -1.0000000000000000e+00 2244 327 1.0000000000000000e+00 2244 320 -1.0000000000000000e+00 2245 344 1.0000000000000000e+00 2245 320 -1.0000000000000000e+00 2246 325 1.0000000000000000e+00 2246 321 -1.0000000000000000e+00 2247 323 1.0000000000000000e+00 2247 321 -1.0000000000000000e+00 2248 322 1.0000000000000000e+00 2248 321 -1.0000000000000000e+00 2249 324 1.0000000000000000e+00 2249 321 -1.0000000000000000e+00 2250 324 1.0000000000000000e+00 2250 322 -1.0000000000000000e+00 2251 323 1.0000000000000000e+00 2251 322 -1.0000000000000000e+00 2252 322 1.0000000000000000e+00 2252 326 -1.0000000000000000e+00 2253 326 1.0000000000000000e+00 2253 323 -1.0000000000000000e+00 2254 327 1.0000000000000000e+00 2254 323 -1.0000000000000000e+00 2255 326 1.0000000000000000e+00 2255 324 -1.0000000000000000e+00 2256 352 1.0000000000000000e+00 2256 324 -1.0000000000000000e+00 2257 325 1.0000000000000000e+00 2257 324 -1.0000000000000000e+00 2258 349 1.0000000000000000e+00 2258 324 -1.0000000000000000e+00 2259 349 1.0000000000000000e+00 2259 325 -1.0000000000000000e+00 2260 327 1.0000000000000000e+00 2260 326 -1.0000000000000000e+00 2261 326 -1.0000000000000000e+00 2261 352 1.0000000000000000e+00 2262 351 1.0000000000000000e+00 2262 326 -1.0000000000000000e+00 2263 328 -1.0000000000000000e+00 2263 327 1.0000000000000000e+00 2264 328 -1.0000000000000000e+00 2264 329 1.0000000000000000e+00 2265 354 1.0000000000000000e+00 2265 328 -1.0000000000000000e+00 2266 333 1.0000000000000000e+00 2266 329 -1.0000000000000000e+00 2267 337 1.0000000000000000e+00 2267 329 -1.0000000000000000e+00 2268 332 1.0000000000000000e+00 2268 329 -1.0000000000000000e+00 2269 329 -1.0000000000000000e+00 2269 336 1.0000000000000000e+00 2270 334 1.0000000000000000e+00 2270 330 -1.0000000000000000e+00 2271 332 1.0000000000000000e+00 2271 330 -1.0000000000000000e+00 2272 361 1.0000000000000000e+00 2272 330 -1.0000000000000000e+00 2273 331 1.0000000000000000e+00 2273 330 -1.0000000000000000e+00 2274 361 1.0000000000000000e+00 2274 331 -1.0000000000000000e+00 2275 332 1.0000000000000000e+00 2275 331 -1.0000000000000000e+00 2276 334 1.0000000000000000e+00 2276 332 -1.0000000000000000e+00 2277 333 1.0000000000000000e+00 2277 332 -1.0000000000000000e+00 2278 334 1.0000000000000000e+00 2278 333 -1.0000000000000000e+00 2279 333 -1.0000000000000000e+00 2279 337 1.0000000000000000e+00 2280 333 -1.0000000000000000e+00 2280 338 1.0000000000000000e+00 2281 336 1.0000000000000000e+00 2281 333 -1.0000000000000000e+00 2282 333 -1.0000000000000000e+00 2282 335 1.0000000000000000e+00 2283 336 1.0000000000000000e+00 2283 334 -1.0000000000000000e+00 2284 335 1.0000000000000000e+00 2284 334 -1.0000000000000000e+00 2285 347 1.0000000000000000e+00 2285 338 -1.0000000000000000e+00 2286 353 1.0000000000000000e+00 2286 338 -1.0000000000000000e+00 2287 343 1.0000000000000000e+00 2287 339 -1.0000000000000000e+00 2288 341 1.0000000000000000e+00 2288 339 -1.0000000000000000e+00 2289 340 1.0000000000000000e+00 2289 339 -1.0000000000000000e+00 2290 342 1.0000000000000000e+00 2290 339 -1.0000000000000000e+00 2291 348 1.0000000000000000e+00 2291 339 -1.0000000000000000e+00 2292 344 1.0000000000000000e+00 2292 340 -1.0000000000000000e+00 2293 345 1.0000000000000000e+00 2293 340 -1.0000000000000000e+00 2294 342 1.0000000000000000e+00 2294 340 -1.0000000000000000e+00 2295 341 1.0000000000000000e+00 2295 340 -1.0000000000000000e+00 2296 344 1.0000000000000000e+00 2296 341 -1.0000000000000000e+00 2297 347 1.0000000000000000e+00 2297 341 -1.0000000000000000e+00 2298 344 1.0000000000000000e+00 2298 342 -1.0000000000000000e+00 2299 350 1.0000000000000000e+00 2299 342 -1.0000000000000000e+00 2300 343 1.0000000000000000e+00 2300 342 -1.0000000000000000e+00 2301 345 1.0000000000000000e+00 2301 344 -1.0000000000000000e+00 2302 350 1.0000000000000000e+00 2302 344 -1.0000000000000000e+00 2303 351 1.0000000000000000e+00 2303 344 -1.0000000000000000e+00 2304 346 1.0000000000000000e+00 2304 345 -1.0000000000000000e+00 2305 349 1.0000000000000000e+00 2305 345 -1.0000000000000000e+00 2306 350 1.0000000000000000e+00 2306 345 -1.0000000000000000e+00 2307 349 1.0000000000000000e+00 2307 346 -1.0000000000000000e+00 2308 348 1.0000000000000000e+00 2308 347 -1.0000000000000000e+00 2309 353 1.0000000000000000e+00 2309 347 -1.0000000000000000e+00 2310 352 1.0000000000000000e+00 2310 349 -1.0000000000000000e+00 2311 351 1.0000000000000000e+00 2311 349 -1.0000000000000000e+00 2312 350 1.0000000000000000e+00 2312 349 -1.0000000000000000e+00 2313 351 1.0000000000000000e+00 2313 350 -1.0000000000000000e+00 2314 352 1.0000000000000000e+00 2314 351 -1.0000000000000000e+00 2315 357 1.0000000000000000e+00 2315 355 -1.0000000000000000e+00 2316 356 1.0000000000000000e+00 2316 355 -1.0000000000000000e+00 2317 364 1.0000000000000000e+00 2317 355 -1.0000000000000000e+00 2318 365 1.0000000000000000e+00 2318 355 -1.0000000000000000e+00 2319 355 -1.0000000000000000e+00 2319 848 1.0000000000000000e+00 2320 364 1.0000000000000000e+00 2320 356 -1.0000000000000000e+00 2321 356 -1.0000000000000000e+00 2321 848 1.0000000000000000e+00 2322 358 1.0000000000000000e+00 2322 810 -1.0000000000000000e+00 2323 805 1.0000000000000000e+00 2323 810 -1.0000000000000000e+00 2324 359 1.0000000000000000e+00 2324 805 -1.0000000000000000e+00 2325 360 1.0000000000000000e+00 2325 358 -1.0000000000000000e+00 2326 359 1.0000000000000000e+00 2326 358 -1.0000000000000000e+00 2327 360 1.0000000000000000e+00 2327 359 -1.0000000000000000e+00 2328 363 1.0000000000000000e+00 2328 361 -1.0000000000000000e+00 2329 362 1.0000000000000000e+00 2329 361 -1.0000000000000000e+00 2330 363 1.0000000000000000e+00 2330 362 -1.0000000000000000e+00 2331 364 -1.0000000000000000e+00 2331 849 1.0000000000000000e+00 2332 365 1.0000000000000000e+00 2332 364 -1.0000000000000000e+00 hypre-2.33.0/src/test/TEST_ams/mfem.G.00002000066400000000000000000002565611477326011500176340ustar00rootroot000000000000002333 3709 366 614 2333 409 1.0000000000000000e+00 2333 366 -1.0000000000000000e+00 2334 413 1.0000000000000000e+00 2334 366 -1.0000000000000000e+00 2335 414 1.0000000000000000e+00 2335 366 -1.0000000000000000e+00 2336 421 1.0000000000000000e+00 2336 366 -1.0000000000000000e+00 2337 425 1.0000000000000000e+00 2337 366 -1.0000000000000000e+00 2338 489 1.0000000000000000e+00 2338 366 -1.0000000000000000e+00 2339 493 1.0000000000000000e+00 2339 366 -1.0000000000000000e+00 2340 573 1.0000000000000000e+00 2340 366 -1.0000000000000000e+00 2341 576 1.0000000000000000e+00 2341 366 -1.0000000000000000e+00 2342 523 1.0000000000000000e+00 2342 366 -1.0000000000000000e+00 2343 519 1.0000000000000000e+00 2343 366 -1.0000000000000000e+00 2344 455 1.0000000000000000e+00 2344 366 -1.0000000000000000e+00 2345 518 1.0000000000000000e+00 2345 366 -1.0000000000000000e+00 2346 521 1.0000000000000000e+00 2346 366 -1.0000000000000000e+00 2347 437 1.0000000000000000e+00 2347 366 -1.0000000000000000e+00 2348 591 1.0000000000000000e+00 2348 366 -1.0000000000000000e+00 2349 609 1.0000000000000000e+00 2349 366 -1.0000000000000000e+00 2350 611 1.0000000000000000e+00 2350 366 -1.0000000000000000e+00 2351 614 1.0000000000000000e+00 2351 366 -1.0000000000000000e+00 2352 409 1.0000000000000000e+00 2352 367 -1.0000000000000000e+00 2353 509 1.0000000000000000e+00 2353 367 -1.0000000000000000e+00 2354 411 1.0000000000000000e+00 2354 367 -1.0000000000000000e+00 2355 508 1.0000000000000000e+00 2355 367 -1.0000000000000000e+00 2356 512 1.0000000000000000e+00 2356 367 -1.0000000000000000e+00 2357 510 1.0000000000000000e+00 2357 367 -1.0000000000000000e+00 2358 410 1.0000000000000000e+00 2358 367 -1.0000000000000000e+00 2359 483 1.0000000000000000e+00 2359 367 -1.0000000000000000e+00 2360 484 1.0000000000000000e+00 2360 367 -1.0000000000000000e+00 2361 486 1.0000000000000000e+00 2361 367 -1.0000000000000000e+00 2362 494 1.0000000000000000e+00 2362 367 -1.0000000000000000e+00 2363 511 1.0000000000000000e+00 2363 367 -1.0000000000000000e+00 2364 483 1.0000000000000000e+00 2364 368 -1.0000000000000000e+00 2365 410 1.0000000000000000e+00 2365 368 -1.0000000000000000e+00 2366 487 1.0000000000000000e+00 2366 368 -1.0000000000000000e+00 2367 501 1.0000000000000000e+00 2367 368 -1.0000000000000000e+00 2368 412 1.0000000000000000e+00 2368 368 -1.0000000000000000e+00 2369 409 1.0000000000000000e+00 2369 368 -1.0000000000000000e+00 2370 413 1.0000000000000000e+00 2370 368 -1.0000000000000000e+00 2371 368 -1.0000000000000000e+00 2371 116 1.0000000000000000e+00 2372 503 1.0000000000000000e+00 2372 368 -1.0000000000000000e+00 2373 421 1.0000000000000000e+00 2373 368 -1.0000000000000000e+00 2374 612 1.0000000000000000e+00 2374 368 -1.0000000000000000e+00 2375 611 1.0000000000000000e+00 2375 368 -1.0000000000000000e+00 2376 613 1.0000000000000000e+00 2376 368 -1.0000000000000000e+00 2377 614 1.0000000000000000e+00 2377 368 -1.0000000000000000e+00 2378 410 1.0000000000000000e+00 2378 369 -1.0000000000000000e+00 2379 409 1.0000000000000000e+00 2379 369 -1.0000000000000000e+00 2380 411 1.0000000000000000e+00 2380 369 -1.0000000000000000e+00 2381 412 1.0000000000000000e+00 2381 369 -1.0000000000000000e+00 2382 413 1.0000000000000000e+00 2382 369 -1.0000000000000000e+00 2383 414 1.0000000000000000e+00 2383 369 -1.0000000000000000e+00 2384 422 1.0000000000000000e+00 2384 369 -1.0000000000000000e+00 2385 421 1.0000000000000000e+00 2385 369 -1.0000000000000000e+00 2386 423 1.0000000000000000e+00 2386 369 -1.0000000000000000e+00 2387 424 1.0000000000000000e+00 2387 369 -1.0000000000000000e+00 2388 425 1.0000000000000000e+00 2388 369 -1.0000000000000000e+00 2389 483 1.0000000000000000e+00 2389 369 -1.0000000000000000e+00 2390 484 1.0000000000000000e+00 2390 369 -1.0000000000000000e+00 2391 488 1.0000000000000000e+00 2391 369 -1.0000000000000000e+00 2392 490 1.0000000000000000e+00 2392 369 -1.0000000000000000e+00 2393 489 1.0000000000000000e+00 2393 369 -1.0000000000000000e+00 2394 491 1.0000000000000000e+00 2394 369 -1.0000000000000000e+00 2395 492 1.0000000000000000e+00 2395 369 -1.0000000000000000e+00 2396 493 1.0000000000000000e+00 2396 369 -1.0000000000000000e+00 2397 494 1.0000000000000000e+00 2397 369 -1.0000000000000000e+00 2398 495 1.0000000000000000e+00 2398 369 -1.0000000000000000e+00 2399 499 1.0000000000000000e+00 2399 369 -1.0000000000000000e+00 2400 416 1.0000000000000000e+00 2400 369 -1.0000000000000000e+00 2401 505 1.0000000000000000e+00 2401 369 -1.0000000000000000e+00 2402 501 1.0000000000000000e+00 2402 369 -1.0000000000000000e+00 2403 509 1.0000000000000000e+00 2403 369 -1.0000000000000000e+00 2404 415 1.0000000000000000e+00 2404 14 -1.0000000000000000e+00 2405 419 1.0000000000000000e+00 2405 14 -1.0000000000000000e+00 2406 420 1.0000000000000000e+00 2406 14 -1.0000000000000000e+00 2407 454 1.0000000000000000e+00 2407 14 -1.0000000000000000e+00 2408 446 1.0000000000000000e+00 2408 14 -1.0000000000000000e+00 2409 468 1.0000000000000000e+00 2409 14 -1.0000000000000000e+00 2410 570 1.0000000000000000e+00 2410 14 -1.0000000000000000e+00 2411 458 1.0000000000000000e+00 2411 14 -1.0000000000000000e+00 2412 590 1.0000000000000000e+00 2412 14 -1.0000000000000000e+00 2413 445 1.0000000000000000e+00 2413 14 -1.0000000000000000e+00 2414 507 1.0000000000000000e+00 2414 14 -1.0000000000000000e+00 2415 443 1.0000000000000000e+00 2415 14 -1.0000000000000000e+00 2416 455 1.0000000000000000e+00 2416 14 -1.0000000000000000e+00 2417 432 1.0000000000000000e+00 2417 370 -1.0000000000000000e+00 2418 490 1.0000000000000000e+00 2418 370 -1.0000000000000000e+00 2419 434 1.0000000000000000e+00 2419 370 -1.0000000000000000e+00 2420 489 1.0000000000000000e+00 2420 370 -1.0000000000000000e+00 2421 416 1.0000000000000000e+00 2421 370 -1.0000000000000000e+00 2422 491 1.0000000000000000e+00 2422 370 -1.0000000000000000e+00 2423 415 1.0000000000000000e+00 2423 370 -1.0000000000000000e+00 2424 444 1.0000000000000000e+00 2424 370 -1.0000000000000000e+00 2425 417 1.0000000000000000e+00 2425 370 -1.0000000000000000e+00 2426 455 1.0000000000000000e+00 2426 370 -1.0000000000000000e+00 2427 518 1.0000000000000000e+00 2427 370 -1.0000000000000000e+00 2428 443 1.0000000000000000e+00 2428 370 -1.0000000000000000e+00 2429 537 1.0000000000000000e+00 2429 370 -1.0000000000000000e+00 2430 524 1.0000000000000000e+00 2430 370 -1.0000000000000000e+00 2431 457 1.0000000000000000e+00 2431 370 -1.0000000000000000e+00 2432 433 1.0000000000000000e+00 2432 370 -1.0000000000000000e+00 2433 454 1.0000000000000000e+00 2433 370 -1.0000000000000000e+00 2434 494 1.0000000000000000e+00 2434 370 -1.0000000000000000e+00 2435 495 1.0000000000000000e+00 2435 370 -1.0000000000000000e+00 2436 499 1.0000000000000000e+00 2436 370 -1.0000000000000000e+00 2437 514 1.0000000000000000e+00 2437 370 -1.0000000000000000e+00 2438 517 1.0000000000000000e+00 2438 370 -1.0000000000000000e+00 2439 525 1.0000000000000000e+00 2439 370 -1.0000000000000000e+00 2440 448 1.0000000000000000e+00 2440 370 -1.0000000000000000e+00 2441 499 1.0000000000000000e+00 2441 371 -1.0000000000000000e+00 2442 416 1.0000000000000000e+00 2442 371 -1.0000000000000000e+00 2443 424 1.0000000000000000e+00 2443 371 -1.0000000000000000e+00 2444 422 1.0000000000000000e+00 2444 371 -1.0000000000000000e+00 2445 418 1.0000000000000000e+00 2445 371 -1.0000000000000000e+00 2446 573 1.0000000000000000e+00 2446 371 -1.0000000000000000e+00 2447 587 1.0000000000000000e+00 2447 371 -1.0000000000000000e+00 2448 588 1.0000000000000000e+00 2448 371 -1.0000000000000000e+00 2449 570 1.0000000000000000e+00 2449 371 -1.0000000000000000e+00 2450 520 1.0000000000000000e+00 2450 371 -1.0000000000000000e+00 2451 609 1.0000000000000000e+00 2451 371 -1.0000000000000000e+00 2452 608 1.0000000000000000e+00 2452 371 -1.0000000000000000e+00 2453 371 -1.0000000000000000e+00 2453 152 1.0000000000000000e+00 2454 415 1.0000000000000000e+00 2454 371 -1.0000000000000000e+00 2455 419 1.0000000000000000e+00 2455 371 -1.0000000000000000e+00 2456 421 1.0000000000000000e+00 2456 371 -1.0000000000000000e+00 2457 425 1.0000000000000000e+00 2457 371 -1.0000000000000000e+00 2458 489 1.0000000000000000e+00 2458 371 -1.0000000000000000e+00 2459 507 1.0000000000000000e+00 2459 371 -1.0000000000000000e+00 2460 455 1.0000000000000000e+00 2460 371 -1.0000000000000000e+00 2461 519 1.0000000000000000e+00 2461 371 -1.0000000000000000e+00 2462 458 1.0000000000000000e+00 2462 371 -1.0000000000000000e+00 2463 590 1.0000000000000000e+00 2463 371 -1.0000000000000000e+00 2464 591 1.0000000000000000e+00 2464 371 -1.0000000000000000e+00 2465 416 1.0000000000000000e+00 2465 372 -1.0000000000000000e+00 2466 415 1.0000000000000000e+00 2466 372 -1.0000000000000000e+00 2467 417 1.0000000000000000e+00 2467 372 -1.0000000000000000e+00 2468 418 1.0000000000000000e+00 2468 372 -1.0000000000000000e+00 2469 419 1.0000000000000000e+00 2469 372 -1.0000000000000000e+00 2470 420 1.0000000000000000e+00 2470 372 -1.0000000000000000e+00 2471 499 1.0000000000000000e+00 2471 372 -1.0000000000000000e+00 2472 495 1.0000000000000000e+00 2472 372 -1.0000000000000000e+00 2473 500 1.0000000000000000e+00 2473 372 -1.0000000000000000e+00 2474 505 1.0000000000000000e+00 2474 372 -1.0000000000000000e+00 2475 506 1.0000000000000000e+00 2475 372 -1.0000000000000000e+00 2476 422 1.0000000000000000e+00 2476 372 -1.0000000000000000e+00 2477 507 1.0000000000000000e+00 2477 372 -1.0000000000000000e+00 2478 445 1.0000000000000000e+00 2478 372 -1.0000000000000000e+00 2479 516 1.0000000000000000e+00 2479 372 -1.0000000000000000e+00 2480 444 1.0000000000000000e+00 2480 372 -1.0000000000000000e+00 2481 421 1.0000000000000000e+00 2481 7 -1.0000000000000000e+00 2482 501 1.0000000000000000e+00 2482 7 -1.0000000000000000e+00 2483 423 1.0000000000000000e+00 2483 7 -1.0000000000000000e+00 2484 507 1.0000000000000000e+00 2484 7 -1.0000000000000000e+00 2485 422 1.0000000000000000e+00 2485 7 -1.0000000000000000e+00 2486 506 1.0000000000000000e+00 2486 7 -1.0000000000000000e+00 2487 611 1.0000000000000000e+00 2487 7 -1.0000000000000000e+00 2488 502 1.0000000000000000e+00 2488 7 -1.0000000000000000e+00 2489 483 1.0000000000000000e+00 2489 7 -1.0000000000000000e+00 2490 505 1.0000000000000000e+00 2490 7 -1.0000000000000000e+00 2491 499 1.0000000000000000e+00 2491 7 -1.0000000000000000e+00 2492 152 1.0000000000000000e+00 2492 7 -1.0000000000000000e+00 2493 608 1.0000000000000000e+00 2493 7 -1.0000000000000000e+00 2494 609 1.0000000000000000e+00 2494 7 -1.0000000000000000e+00 2495 426 1.0000000000000000e+00 2495 373 -1.0000000000000000e+00 2496 430 1.0000000000000000e+00 2496 373 -1.0000000000000000e+00 2497 431 1.0000000000000000e+00 2497 373 -1.0000000000000000e+00 2498 432 1.0000000000000000e+00 2498 373 -1.0000000000000000e+00 2499 436 1.0000000000000000e+00 2499 373 -1.0000000000000000e+00 2500 448 1.0000000000000000e+00 2500 373 -1.0000000000000000e+00 2501 452 1.0000000000000000e+00 2501 373 -1.0000000000000000e+00 2502 453 1.0000000000000000e+00 2502 373 -1.0000000000000000e+00 2503 508 1.0000000000000000e+00 2503 373 -1.0000000000000000e+00 2504 498 1.0000000000000000e+00 2504 373 -1.0000000000000000e+00 2505 517 1.0000000000000000e+00 2505 373 -1.0000000000000000e+00 2506 524 1.0000000000000000e+00 2506 373 -1.0000000000000000e+00 2507 528 1.0000000000000000e+00 2507 373 -1.0000000000000000e+00 2508 426 1.0000000000000000e+00 2508 374 -1.0000000000000000e+00 2509 515 1.0000000000000000e+00 2509 374 -1.0000000000000000e+00 2510 428 1.0000000000000000e+00 2510 374 -1.0000000000000000e+00 2511 427 1.0000000000000000e+00 2511 374 -1.0000000000000000e+00 2512 511 1.0000000000000000e+00 2512 374 -1.0000000000000000e+00 2513 513 1.0000000000000000e+00 2513 374 -1.0000000000000000e+00 2514 514 1.0000000000000000e+00 2514 374 -1.0000000000000000e+00 2515 511 1.0000000000000000e+00 2515 375 -1.0000000000000000e+00 2516 512 1.0000000000000000e+00 2516 375 -1.0000000000000000e+00 2517 429 1.0000000000000000e+00 2517 375 -1.0000000000000000e+00 2518 426 1.0000000000000000e+00 2518 375 -1.0000000000000000e+00 2519 427 1.0000000000000000e+00 2519 375 -1.0000000000000000e+00 2520 430 1.0000000000000000e+00 2520 375 -1.0000000000000000e+00 2521 508 1.0000000000000000e+00 2521 375 -1.0000000000000000e+00 2522 427 1.0000000000000000e+00 2522 376 -1.0000000000000000e+00 2523 426 1.0000000000000000e+00 2523 376 -1.0000000000000000e+00 2524 428 1.0000000000000000e+00 2524 376 -1.0000000000000000e+00 2525 429 1.0000000000000000e+00 2525 376 -1.0000000000000000e+00 2526 430 1.0000000000000000e+00 2526 376 -1.0000000000000000e+00 2527 431 1.0000000000000000e+00 2527 376 -1.0000000000000000e+00 2528 433 1.0000000000000000e+00 2528 376 -1.0000000000000000e+00 2529 432 1.0000000000000000e+00 2529 376 -1.0000000000000000e+00 2530 434 1.0000000000000000e+00 2530 376 -1.0000000000000000e+00 2531 435 1.0000000000000000e+00 2531 376 -1.0000000000000000e+00 2532 436 1.0000000000000000e+00 2532 376 -1.0000000000000000e+00 2533 495 1.0000000000000000e+00 2533 376 -1.0000000000000000e+00 2534 494 1.0000000000000000e+00 2534 376 -1.0000000000000000e+00 2535 496 1.0000000000000000e+00 2535 376 -1.0000000000000000e+00 2536 490 1.0000000000000000e+00 2536 376 -1.0000000000000000e+00 2537 497 1.0000000000000000e+00 2537 376 -1.0000000000000000e+00 2538 498 1.0000000000000000e+00 2538 376 -1.0000000000000000e+00 2539 509 1.0000000000000000e+00 2539 376 -1.0000000000000000e+00 2540 508 1.0000000000000000e+00 2540 376 -1.0000000000000000e+00 2541 510 1.0000000000000000e+00 2541 376 -1.0000000000000000e+00 2542 484 1.0000000000000000e+00 2542 376 -1.0000000000000000e+00 2543 511 1.0000000000000000e+00 2543 376 -1.0000000000000000e+00 2544 512 1.0000000000000000e+00 2544 376 -1.0000000000000000e+00 2545 513 1.0000000000000000e+00 2545 376 -1.0000000000000000e+00 2546 514 1.0000000000000000e+00 2546 376 -1.0000000000000000e+00 2547 515 1.0000000000000000e+00 2547 376 -1.0000000000000000e+00 2548 514 1.0000000000000000e+00 2548 377 -1.0000000000000000e+00 2549 515 1.0000000000000000e+00 2549 377 -1.0000000000000000e+00 2550 435 1.0000000000000000e+00 2550 377 -1.0000000000000000e+00 2551 524 1.0000000000000000e+00 2551 377 -1.0000000000000000e+00 2552 525 1.0000000000000000e+00 2552 377 -1.0000000000000000e+00 2553 433 1.0000000000000000e+00 2553 377 -1.0000000000000000e+00 2554 432 1.0000000000000000e+00 2554 377 -1.0000000000000000e+00 2555 436 1.0000000000000000e+00 2555 377 -1.0000000000000000e+00 2556 426 1.0000000000000000e+00 2556 377 -1.0000000000000000e+00 2557 526 1.0000000000000000e+00 2557 377 -1.0000000000000000e+00 2558 528 1.0000000000000000e+00 2558 377 -1.0000000000000000e+00 2559 529 1.0000000000000000e+00 2559 377 -1.0000000000000000e+00 2560 536 1.0000000000000000e+00 2560 377 -1.0000000000000000e+00 2561 537 1.0000000000000000e+00 2561 377 -1.0000000000000000e+00 2562 437 1.0000000000000000e+00 2562 378 -1.0000000000000000e+00 2563 441 1.0000000000000000e+00 2563 378 -1.0000000000000000e+00 2564 442 1.0000000000000000e+00 2564 378 -1.0000000000000000e+00 2565 454 1.0000000000000000e+00 2565 378 -1.0000000000000000e+00 2566 455 1.0000000000000000e+00 2566 378 -1.0000000000000000e+00 2567 458 1.0000000000000000e+00 2567 378 -1.0000000000000000e+00 2568 519 1.0000000000000000e+00 2568 378 -1.0000000000000000e+00 2569 520 1.0000000000000000e+00 2569 378 -1.0000000000000000e+00 2570 518 1.0000000000000000e+00 2570 378 -1.0000000000000000e+00 2571 544 1.0000000000000000e+00 2571 378 -1.0000000000000000e+00 2572 456 1.0000000000000000e+00 2572 378 -1.0000000000000000e+00 2573 469 1.0000000000000000e+00 2573 378 -1.0000000000000000e+00 2574 475 1.0000000000000000e+00 2574 378 -1.0000000000000000e+00 2575 476 1.0000000000000000e+00 2575 378 -1.0000000000000000e+00 2576 517 1.0000000000000000e+00 2576 378 -1.0000000000000000e+00 2577 539 1.0000000000000000e+00 2577 378 -1.0000000000000000e+00 2578 555 1.0000000000000000e+00 2578 378 -1.0000000000000000e+00 2579 538 1.0000000000000000e+00 2579 378 -1.0000000000000000e+00 2580 465 1.0000000000000000e+00 2580 378 -1.0000000000000000e+00 2581 556 1.0000000000000000e+00 2581 378 -1.0000000000000000e+00 2582 557 1.0000000000000000e+00 2582 378 -1.0000000000000000e+00 2583 570 1.0000000000000000e+00 2583 378 -1.0000000000000000e+00 2584 571 1.0000000000000000e+00 2584 378 -1.0000000000000000e+00 2585 572 1.0000000000000000e+00 2585 378 -1.0000000000000000e+00 2586 470 1.0000000000000000e+00 2586 378 -1.0000000000000000e+00 2587 573 1.0000000000000000e+00 2587 378 -1.0000000000000000e+00 2588 587 1.0000000000000000e+00 2588 378 -1.0000000000000000e+00 2589 437 1.0000000000000000e+00 2589 379 -1.0000000000000000e+00 2590 521 1.0000000000000000e+00 2590 379 -1.0000000000000000e+00 2591 439 1.0000000000000000e+00 2591 379 -1.0000000000000000e+00 2592 517 1.0000000000000000e+00 2592 379 -1.0000000000000000e+00 2593 451 1.0000000000000000e+00 2593 379 -1.0000000000000000e+00 2594 438 1.0000000000000000e+00 2594 379 -1.0000000000000000e+00 2595 448 1.0000000000000000e+00 2595 379 -1.0000000000000000e+00 2596 449 1.0000000000000000e+00 2596 379 -1.0000000000000000e+00 2597 450 1.0000000000000000e+00 2597 379 -1.0000000000000000e+00 2598 452 1.0000000000000000e+00 2598 379 -1.0000000000000000e+00 2599 518 1.0000000000000000e+00 2599 379 -1.0000000000000000e+00 2600 522 1.0000000000000000e+00 2600 379 -1.0000000000000000e+00 2601 549 1.0000000000000000e+00 2601 379 -1.0000000000000000e+00 2602 545 1.0000000000000000e+00 2602 379 -1.0000000000000000e+00 2603 552 1.0000000000000000e+00 2603 379 -1.0000000000000000e+00 2604 553 1.0000000000000000e+00 2604 379 -1.0000000000000000e+00 2605 544 1.0000000000000000e+00 2605 379 -1.0000000000000000e+00 2606 469 1.0000000000000000e+00 2606 380 -1.0000000000000000e+00 2607 473 1.0000000000000000e+00 2607 380 -1.0000000000000000e+00 2608 474 1.0000000000000000e+00 2608 380 -1.0000000000000000e+00 2609 441 1.0000000000000000e+00 2609 380 -1.0000000000000000e+00 2610 440 1.0000000000000000e+00 2610 380 -1.0000000000000000e+00 2611 544 1.0000000000000000e+00 2611 380 -1.0000000000000000e+00 2612 547 1.0000000000000000e+00 2612 380 -1.0000000000000000e+00 2613 548 1.0000000000000000e+00 2613 380 -1.0000000000000000e+00 2614 579 1.0000000000000000e+00 2614 380 -1.0000000000000000e+00 2615 580 1.0000000000000000e+00 2615 380 -1.0000000000000000e+00 2616 437 1.0000000000000000e+00 2616 380 -1.0000000000000000e+00 2617 438 1.0000000000000000e+00 2617 380 -1.0000000000000000e+00 2618 469 1.0000000000000000e+00 2618 381 -1.0000000000000000e+00 2619 475 1.0000000000000000e+00 2619 381 -1.0000000000000000e+00 2620 574 1.0000000000000000e+00 2620 381 -1.0000000000000000e+00 2621 573 1.0000000000000000e+00 2621 381 -1.0000000000000000e+00 2622 442 1.0000000000000000e+00 2622 381 -1.0000000000000000e+00 2623 438 1.0000000000000000e+00 2623 381 -1.0000000000000000e+00 2624 437 1.0000000000000000e+00 2624 381 -1.0000000000000000e+00 2625 439 1.0000000000000000e+00 2625 381 -1.0000000000000000e+00 2626 440 1.0000000000000000e+00 2626 381 -1.0000000000000000e+00 2627 441 1.0000000000000000e+00 2627 381 -1.0000000000000000e+00 2628 519 1.0000000000000000e+00 2628 381 -1.0000000000000000e+00 2629 523 1.0000000000000000e+00 2629 381 -1.0000000000000000e+00 2630 521 1.0000000000000000e+00 2630 381 -1.0000000000000000e+00 2631 576 1.0000000000000000e+00 2631 381 -1.0000000000000000e+00 2632 579 1.0000000000000000e+00 2632 381 -1.0000000000000000e+00 2633 443 1.0000000000000000e+00 2633 382 -1.0000000000000000e+00 2634 446 1.0000000000000000e+00 2634 382 -1.0000000000000000e+00 2635 447 1.0000000000000000e+00 2635 382 -1.0000000000000000e+00 2636 527 1.0000000000000000e+00 2636 382 -1.0000000000000000e+00 2637 532 1.0000000000000000e+00 2637 382 -1.0000000000000000e+00 2638 533 1.0000000000000000e+00 2638 382 -1.0000000000000000e+00 2639 525 1.0000000000000000e+00 2639 382 -1.0000000000000000e+00 2640 459 1.0000000000000000e+00 2640 382 -1.0000000000000000e+00 2641 534 1.0000000000000000e+00 2641 382 -1.0000000000000000e+00 2642 454 1.0000000000000000e+00 2642 382 -1.0000000000000000e+00 2643 467 1.0000000000000000e+00 2643 382 -1.0000000000000000e+00 2644 465 1.0000000000000000e+00 2644 382 -1.0000000000000000e+00 2645 466 1.0000000000000000e+00 2645 382 -1.0000000000000000e+00 2646 524 1.0000000000000000e+00 2646 382 -1.0000000000000000e+00 2647 538 1.0000000000000000e+00 2647 382 -1.0000000000000000e+00 2648 561 1.0000000000000000e+00 2648 382 -1.0000000000000000e+00 2649 568 1.0000000000000000e+00 2649 382 -1.0000000000000000e+00 2650 569 1.0000000000000000e+00 2650 382 -1.0000000000000000e+00 2651 382 -1.0000000000000000e+00 2651 135 1.0000000000000000e+00 2652 478 1.0000000000000000e+00 2652 382 -1.0000000000000000e+00 2653 592 1.0000000000000000e+00 2653 382 -1.0000000000000000e+00 2654 477 1.0000000000000000e+00 2654 382 -1.0000000000000000e+00 2655 593 1.0000000000000000e+00 2655 382 -1.0000000000000000e+00 2656 594 1.0000000000000000e+00 2656 382 -1.0000000000000000e+00 2657 600 1.0000000000000000e+00 2657 382 -1.0000000000000000e+00 2658 601 1.0000000000000000e+00 2658 382 -1.0000000000000000e+00 2659 602 1.0000000000000000e+00 2659 382 -1.0000000000000000e+00 2660 477 1.0000000000000000e+00 2660 383 -1.0000000000000000e+00 2661 478 1.0000000000000000e+00 2661 383 -1.0000000000000000e+00 2662 447 1.0000000000000000e+00 2662 383 -1.0000000000000000e+00 2663 415 1.0000000000000000e+00 2663 383 -1.0000000000000000e+00 2664 443 1.0000000000000000e+00 2664 383 -1.0000000000000000e+00 2665 444 1.0000000000000000e+00 2665 383 -1.0000000000000000e+00 2666 445 1.0000000000000000e+00 2666 383 -1.0000000000000000e+00 2667 446 1.0000000000000000e+00 2667 383 -1.0000000000000000e+00 2668 479 1.0000000000000000e+00 2668 383 -1.0000000000000000e+00 2669 383 -1.0000000000000000e+00 2669 287 1.0000000000000000e+00 2670 480 1.0000000000000000e+00 2670 383 -1.0000000000000000e+00 2671 516 1.0000000000000000e+00 2671 383 -1.0000000000000000e+00 2672 532 1.0000000000000000e+00 2672 383 -1.0000000000000000e+00 2673 537 1.0000000000000000e+00 2673 383 -1.0000000000000000e+00 2674 383 -1.0000000000000000e+00 2674 135 1.0000000000000000e+00 2675 448 1.0000000000000000e+00 2675 384 -1.0000000000000000e+00 2676 449 1.0000000000000000e+00 2676 384 -1.0000000000000000e+00 2677 451 1.0000000000000000e+00 2677 384 -1.0000000000000000e+00 2678 454 1.0000000000000000e+00 2678 384 -1.0000000000000000e+00 2679 455 1.0000000000000000e+00 2679 384 -1.0000000000000000e+00 2680 456 1.0000000000000000e+00 2680 384 -1.0000000000000000e+00 2681 457 1.0000000000000000e+00 2681 384 -1.0000000000000000e+00 2682 459 1.0000000000000000e+00 2682 384 -1.0000000000000000e+00 2683 460 1.0000000000000000e+00 2683 384 -1.0000000000000000e+00 2684 462 1.0000000000000000e+00 2684 384 -1.0000000000000000e+00 2685 465 1.0000000000000000e+00 2685 384 -1.0000000000000000e+00 2686 467 1.0000000000000000e+00 2686 384 -1.0000000000000000e+00 2687 538 1.0000000000000000e+00 2687 384 -1.0000000000000000e+00 2688 539 1.0000000000000000e+00 2688 384 -1.0000000000000000e+00 2689 541 1.0000000000000000e+00 2689 384 -1.0000000000000000e+00 2690 544 1.0000000000000000e+00 2690 384 -1.0000000000000000e+00 2691 545 1.0000000000000000e+00 2691 384 -1.0000000000000000e+00 2692 549 1.0000000000000000e+00 2692 384 -1.0000000000000000e+00 2693 517 1.0000000000000000e+00 2693 384 -1.0000000000000000e+00 2694 437 1.0000000000000000e+00 2694 384 -1.0000000000000000e+00 2695 561 1.0000000000000000e+00 2695 384 -1.0000000000000000e+00 2696 527 1.0000000000000000e+00 2696 384 -1.0000000000000000e+00 2697 524 1.0000000000000000e+00 2697 384 -1.0000000000000000e+00 2698 443 1.0000000000000000e+00 2698 384 -1.0000000000000000e+00 2699 549 1.0000000000000000e+00 2699 385 -1.0000000000000000e+00 2700 449 1.0000000000000000e+00 2700 385 -1.0000000000000000e+00 2701 450 1.0000000000000000e+00 2701 385 -1.0000000000000000e+00 2702 448 1.0000000000000000e+00 2702 385 -1.0000000000000000e+00 2703 566 1.0000000000000000e+00 2703 385 -1.0000000000000000e+00 2704 452 1.0000000000000000e+00 2704 385 -1.0000000000000000e+00 2705 453 1.0000000000000000e+00 2705 385 -1.0000000000000000e+00 2706 553 1.0000000000000000e+00 2706 385 -1.0000000000000000e+00 2707 554 1.0000000000000000e+00 2707 385 -1.0000000000000000e+00 2708 567 1.0000000000000000e+00 2708 385 -1.0000000000000000e+00 2709 528 1.0000000000000000e+00 2709 385 -1.0000000000000000e+00 2710 459 1.0000000000000000e+00 2710 386 -1.0000000000000000e+00 2711 463 1.0000000000000000e+00 2711 386 -1.0000000000000000e+00 2712 464 1.0000000000000000e+00 2712 386 -1.0000000000000000e+00 2713 563 1.0000000000000000e+00 2713 386 -1.0000000000000000e+00 2714 564 1.0000000000000000e+00 2714 386 -1.0000000000000000e+00 2715 594 1.0000000000000000e+00 2715 386 -1.0000000000000000e+00 2716 596 1.0000000000000000e+00 2716 386 -1.0000000000000000e+00 2717 535 1.0000000000000000e+00 2717 386 -1.0000000000000000e+00 2718 534 1.0000000000000000e+00 2718 386 -1.0000000000000000e+00 2719 606 1.0000000000000000e+00 2719 386 -1.0000000000000000e+00 2720 597 1.0000000000000000e+00 2720 386 -1.0000000000000000e+00 2721 527 1.0000000000000000e+00 2721 386 -1.0000000000000000e+00 2722 527 1.0000000000000000e+00 2722 387 -1.0000000000000000e+00 2723 463 1.0000000000000000e+00 2723 387 -1.0000000000000000e+00 2724 530 1.0000000000000000e+00 2724 387 -1.0000000000000000e+00 2725 525 1.0000000000000000e+00 2725 387 -1.0000000000000000e+00 2726 529 1.0000000000000000e+00 2726 387 -1.0000000000000000e+00 2727 526 1.0000000000000000e+00 2727 387 -1.0000000000000000e+00 2728 459 1.0000000000000000e+00 2728 387 -1.0000000000000000e+00 2729 460 1.0000000000000000e+00 2729 387 -1.0000000000000000e+00 2730 461 1.0000000000000000e+00 2730 387 -1.0000000000000000e+00 2731 462 1.0000000000000000e+00 2731 387 -1.0000000000000000e+00 2732 524 1.0000000000000000e+00 2732 387 -1.0000000000000000e+00 2733 528 1.0000000000000000e+00 2733 387 -1.0000000000000000e+00 2734 549 1.0000000000000000e+00 2734 387 -1.0000000000000000e+00 2735 449 1.0000000000000000e+00 2735 387 -1.0000000000000000e+00 2736 566 1.0000000000000000e+00 2736 387 -1.0000000000000000e+00 2737 567 1.0000000000000000e+00 2737 387 -1.0000000000000000e+00 2738 448 1.0000000000000000e+00 2738 387 -1.0000000000000000e+00 2739 459 1.0000000000000000e+00 2739 388 -1.0000000000000000e+00 2740 460 1.0000000000000000e+00 2740 388 -1.0000000000000000e+00 2741 559 1.0000000000000000e+00 2741 388 -1.0000000000000000e+00 2742 549 1.0000000000000000e+00 2742 388 -1.0000000000000000e+00 2743 461 1.0000000000000000e+00 2743 388 -1.0000000000000000e+00 2744 463 1.0000000000000000e+00 2744 388 -1.0000000000000000e+00 2745 464 1.0000000000000000e+00 2745 388 -1.0000000000000000e+00 2746 550 1.0000000000000000e+00 2746 388 -1.0000000000000000e+00 2747 560 1.0000000000000000e+00 2747 388 -1.0000000000000000e+00 2748 563 1.0000000000000000e+00 2748 388 -1.0000000000000000e+00 2749 567 1.0000000000000000e+00 2749 388 -1.0000000000000000e+00 2750 454 1.0000000000000000e+00 2750 389 -1.0000000000000000e+00 2751 465 1.0000000000000000e+00 2751 389 -1.0000000000000000e+00 2752 556 1.0000000000000000e+00 2752 389 -1.0000000000000000e+00 2753 538 1.0000000000000000e+00 2753 389 -1.0000000000000000e+00 2754 466 1.0000000000000000e+00 2754 389 -1.0000000000000000e+00 2755 572 1.0000000000000000e+00 2755 389 -1.0000000000000000e+00 2756 571 1.0000000000000000e+00 2756 389 -1.0000000000000000e+00 2757 389 -1.0000000000000000e+00 2757 135 1.0000000000000000e+00 2758 602 1.0000000000000000e+00 2758 389 -1.0000000000000000e+00 2759 446 1.0000000000000000e+00 2759 389 -1.0000000000000000e+00 2760 468 1.0000000000000000e+00 2760 389 -1.0000000000000000e+00 2761 557 1.0000000000000000e+00 2761 389 -1.0000000000000000e+00 2762 558 1.0000000000000000e+00 2762 389 -1.0000000000000000e+00 2763 458 1.0000000000000000e+00 2763 389 -1.0000000000000000e+00 2764 569 1.0000000000000000e+00 2764 389 -1.0000000000000000e+00 2765 570 1.0000000000000000e+00 2765 389 -1.0000000000000000e+00 2766 601 1.0000000000000000e+00 2766 389 -1.0000000000000000e+00 2767 469 1.0000000000000000e+00 2767 390 -1.0000000000000000e+00 2768 470 1.0000000000000000e+00 2768 390 -1.0000000000000000e+00 2769 472 1.0000000000000000e+00 2769 390 -1.0000000000000000e+00 2770 475 1.0000000000000000e+00 2770 390 -1.0000000000000000e+00 2771 476 1.0000000000000000e+00 2771 390 -1.0000000000000000e+00 2772 570 1.0000000000000000e+00 2772 390 -1.0000000000000000e+00 2773 571 1.0000000000000000e+00 2773 390 -1.0000000000000000e+00 2774 572 1.0000000000000000e+00 2774 390 -1.0000000000000000e+00 2775 573 1.0000000000000000e+00 2775 390 -1.0000000000000000e+00 2776 575 1.0000000000000000e+00 2776 390 -1.0000000000000000e+00 2777 577 1.0000000000000000e+00 2777 390 -1.0000000000000000e+00 2778 581 1.0000000000000000e+00 2778 390 -1.0000000000000000e+00 2779 587 1.0000000000000000e+00 2779 390 -1.0000000000000000e+00 2780 589 1.0000000000000000e+00 2780 390 -1.0000000000000000e+00 2781 469 1.0000000000000000e+00 2781 391 -1.0000000000000000e+00 2782 470 1.0000000000000000e+00 2782 391 -1.0000000000000000e+00 2783 471 1.0000000000000000e+00 2783 391 -1.0000000000000000e+00 2784 472 1.0000000000000000e+00 2784 391 -1.0000000000000000e+00 2785 473 1.0000000000000000e+00 2785 391 -1.0000000000000000e+00 2786 581 1.0000000000000000e+00 2786 391 -1.0000000000000000e+00 2787 577 1.0000000000000000e+00 2787 391 -1.0000000000000000e+00 2788 584 1.0000000000000000e+00 2788 391 -1.0000000000000000e+00 2789 585 1.0000000000000000e+00 2789 391 -1.0000000000000000e+00 2790 572 1.0000000000000000e+00 2790 391 -1.0000000000000000e+00 2791 586 1.0000000000000000e+00 2791 391 -1.0000000000000000e+00 2792 544 1.0000000000000000e+00 2792 392 -1.0000000000000000e+00 2793 539 1.0000000000000000e+00 2793 392 -1.0000000000000000e+00 2794 540 1.0000000000000000e+00 2794 392 -1.0000000000000000e+00 2795 538 1.0000000000000000e+00 2795 392 -1.0000000000000000e+00 2796 555 1.0000000000000000e+00 2796 392 -1.0000000000000000e+00 2797 469 1.0000000000000000e+00 2797 392 -1.0000000000000000e+00 2798 470 1.0000000000000000e+00 2798 392 -1.0000000000000000e+00 2799 572 1.0000000000000000e+00 2799 392 -1.0000000000000000e+00 2800 471 1.0000000000000000e+00 2800 392 -1.0000000000000000e+00 2801 473 1.0000000000000000e+00 2801 392 -1.0000000000000000e+00 2802 474 1.0000000000000000e+00 2802 392 -1.0000000000000000e+00 2803 542 1.0000000000000000e+00 2803 392 -1.0000000000000000e+00 2804 543 1.0000000000000000e+00 2804 392 -1.0000000000000000e+00 2805 547 1.0000000000000000e+00 2805 392 -1.0000000000000000e+00 2806 441 1.0000000000000000e+00 2806 392 -1.0000000000000000e+00 2807 557 1.0000000000000000e+00 2807 392 -1.0000000000000000e+00 2808 586 1.0000000000000000e+00 2808 392 -1.0000000000000000e+00 2809 477 1.0000000000000000e+00 2809 183 -1.0000000000000000e+00 2810 480 1.0000000000000000e+00 2810 183 -1.0000000000000000e+00 2811 532 1.0000000000000000e+00 2811 183 -1.0000000000000000e+00 2812 531 1.0000000000000000e+00 2812 183 -1.0000000000000000e+00 2813 481 1.0000000000000000e+00 2813 183 -1.0000000000000000e+00 2814 482 1.0000000000000000e+00 2814 183 -1.0000000000000000e+00 2815 527 1.0000000000000000e+00 2815 183 -1.0000000000000000e+00 2816 529 1.0000000000000000e+00 2816 183 -1.0000000000000000e+00 2817 525 1.0000000000000000e+00 2817 183 -1.0000000000000000e+00 2818 536 1.0000000000000000e+00 2818 183 -1.0000000000000000e+00 2819 537 1.0000000000000000e+00 2819 183 -1.0000000000000000e+00 2820 443 1.0000000000000000e+00 2820 183 -1.0000000000000000e+00 2821 477 1.0000000000000000e+00 2821 21 -1.0000000000000000e+00 2822 478 1.0000000000000000e+00 2822 21 -1.0000000000000000e+00 2823 481 1.0000000000000000e+00 2823 21 -1.0000000000000000e+00 2824 592 1.0000000000000000e+00 2824 21 -1.0000000000000000e+00 2825 593 1.0000000000000000e+00 2825 21 -1.0000000000000000e+00 2826 594 1.0000000000000000e+00 2826 21 -1.0000000000000000e+00 2827 599 1.0000000000000000e+00 2827 21 -1.0000000000000000e+00 2828 600 1.0000000000000000e+00 2828 21 -1.0000000000000000e+00 2829 601 1.0000000000000000e+00 2829 21 -1.0000000000000000e+00 2830 602 1.0000000000000000e+00 2830 21 -1.0000000000000000e+00 2831 604 1.0000000000000000e+00 2831 21 -1.0000000000000000e+00 2832 477 1.0000000000000000e+00 2832 174 -1.0000000000000000e+00 2833 478 1.0000000000000000e+00 2833 174 -1.0000000000000000e+00 2834 479 1.0000000000000000e+00 2834 174 -1.0000000000000000e+00 2835 481 1.0000000000000000e+00 2835 174 -1.0000000000000000e+00 2836 477 1.0000000000000000e+00 2836 161 -1.0000000000000000e+00 2837 481 1.0000000000000000e+00 2837 161 -1.0000000000000000e+00 2838 482 1.0000000000000000e+00 2838 161 -1.0000000000000000e+00 2839 594 1.0000000000000000e+00 2839 161 -1.0000000000000000e+00 2840 593 1.0000000000000000e+00 2840 161 -1.0000000000000000e+00 2841 595 1.0000000000000000e+00 2841 161 -1.0000000000000000e+00 2842 596 1.0000000000000000e+00 2842 161 -1.0000000000000000e+00 2843 598 1.0000000000000000e+00 2843 161 -1.0000000000000000e+00 2844 599 1.0000000000000000e+00 2844 161 -1.0000000000000000e+00 2845 483 1.0000000000000000e+00 2845 393 -1.0000000000000000e+00 2846 484 1.0000000000000000e+00 2846 393 -1.0000000000000000e+00 2847 488 1.0000000000000000e+00 2847 393 -1.0000000000000000e+00 2848 494 1.0000000000000000e+00 2848 393 -1.0000000000000000e+00 2849 495 1.0000000000000000e+00 2849 393 -1.0000000000000000e+00 2850 499 1.0000000000000000e+00 2850 393 -1.0000000000000000e+00 2851 500 1.0000000000000000e+00 2851 393 -1.0000000000000000e+00 2852 505 1.0000000000000000e+00 2852 393 -1.0000000000000000e+00 2853 485 1.0000000000000000e+00 2853 393 -1.0000000000000000e+00 2854 496 1.0000000000000000e+00 2854 393 -1.0000000000000000e+00 2855 511 1.0000000000000000e+00 2855 393 -1.0000000000000000e+00 2856 513 1.0000000000000000e+00 2856 393 -1.0000000000000000e+00 2857 514 1.0000000000000000e+00 2857 393 -1.0000000000000000e+00 2858 484 1.0000000000000000e+00 2858 394 -1.0000000000000000e+00 2859 483 1.0000000000000000e+00 2859 394 -1.0000000000000000e+00 2860 485 1.0000000000000000e+00 2860 394 -1.0000000000000000e+00 2861 486 1.0000000000000000e+00 2861 394 -1.0000000000000000e+00 2862 410 1.0000000000000000e+00 2862 394 -1.0000000000000000e+00 2863 487 1.0000000000000000e+00 2863 394 -1.0000000000000000e+00 2864 501 1.0000000000000000e+00 2864 394 -1.0000000000000000e+00 2865 394 -1.0000000000000000e+00 2865 116 1.0000000000000000e+00 2866 502 1.0000000000000000e+00 2866 394 -1.0000000000000000e+00 2867 503 1.0000000000000000e+00 2867 394 -1.0000000000000000e+00 2868 504 1.0000000000000000e+00 2868 394 -1.0000000000000000e+00 2869 505 1.0000000000000000e+00 2869 394 -1.0000000000000000e+00 2870 494 1.0000000000000000e+00 2870 395 -1.0000000000000000e+00 2871 490 1.0000000000000000e+00 2871 395 -1.0000000000000000e+00 2872 497 1.0000000000000000e+00 2872 395 -1.0000000000000000e+00 2873 509 1.0000000000000000e+00 2873 395 -1.0000000000000000e+00 2874 492 1.0000000000000000e+00 2874 395 -1.0000000000000000e+00 2875 517 1.0000000000000000e+00 2875 395 -1.0000000000000000e+00 2876 518 1.0000000000000000e+00 2876 395 -1.0000000000000000e+00 2877 522 1.0000000000000000e+00 2877 395 -1.0000000000000000e+00 2878 489 1.0000000000000000e+00 2878 395 -1.0000000000000000e+00 2879 493 1.0000000000000000e+00 2879 395 -1.0000000000000000e+00 2880 432 1.0000000000000000e+00 2880 395 -1.0000000000000000e+00 2881 498 1.0000000000000000e+00 2881 395 -1.0000000000000000e+00 2882 508 1.0000000000000000e+00 2882 395 -1.0000000000000000e+00 2883 409 1.0000000000000000e+00 2883 395 -1.0000000000000000e+00 2884 521 1.0000000000000000e+00 2884 395 -1.0000000000000000e+00 2885 452 1.0000000000000000e+00 2885 395 -1.0000000000000000e+00 2886 503 1.0000000000000000e+00 2886 1 -1.0000000000000000e+00 2887 504 1.0000000000000000e+00 2887 1 -1.0000000000000000e+00 2888 611 1.0000000000000000e+00 2888 1 -1.0000000000000000e+00 2889 612 1.0000000000000000e+00 2889 1 -1.0000000000000000e+00 2890 594 1.0000000000000000e+00 2890 396 -1.0000000000000000e+00 2891 593 1.0000000000000000e+00 2891 396 -1.0000000000000000e+00 2892 533 1.0000000000000000e+00 2892 396 -1.0000000000000000e+00 2893 477 1.0000000000000000e+00 2893 396 -1.0000000000000000e+00 2894 595 1.0000000000000000e+00 2894 396 -1.0000000000000000e+00 2895 529 1.0000000000000000e+00 2895 396 -1.0000000000000000e+00 2896 527 1.0000000000000000e+00 2896 396 -1.0000000000000000e+00 2897 530 1.0000000000000000e+00 2897 396 -1.0000000000000000e+00 2898 531 1.0000000000000000e+00 2898 396 -1.0000000000000000e+00 2899 532 1.0000000000000000e+00 2899 396 -1.0000000000000000e+00 2900 534 1.0000000000000000e+00 2900 396 -1.0000000000000000e+00 2901 535 1.0000000000000000e+00 2901 396 -1.0000000000000000e+00 2902 463 1.0000000000000000e+00 2902 396 -1.0000000000000000e+00 2903 596 1.0000000000000000e+00 2903 396 -1.0000000000000000e+00 2904 482 1.0000000000000000e+00 2904 396 -1.0000000000000000e+00 2905 538 1.0000000000000000e+00 2905 397 -1.0000000000000000e+00 2906 542 1.0000000000000000e+00 2906 397 -1.0000000000000000e+00 2907 543 1.0000000000000000e+00 2907 397 -1.0000000000000000e+00 2908 557 1.0000000000000000e+00 2908 397 -1.0000000000000000e+00 2909 558 1.0000000000000000e+00 2909 397 -1.0000000000000000e+00 2910 569 1.0000000000000000e+00 2910 397 -1.0000000000000000e+00 2911 565 1.0000000000000000e+00 2911 397 -1.0000000000000000e+00 2912 572 1.0000000000000000e+00 2912 397 -1.0000000000000000e+00 2913 601 1.0000000000000000e+00 2913 397 -1.0000000000000000e+00 2914 605 1.0000000000000000e+00 2914 397 -1.0000000000000000e+00 2915 586 1.0000000000000000e+00 2915 397 -1.0000000000000000e+00 2916 538 1.0000000000000000e+00 2916 398 -1.0000000000000000e+00 2917 539 1.0000000000000000e+00 2917 398 -1.0000000000000000e+00 2918 540 1.0000000000000000e+00 2918 398 -1.0000000000000000e+00 2919 541 1.0000000000000000e+00 2919 398 -1.0000000000000000e+00 2920 542 1.0000000000000000e+00 2920 398 -1.0000000000000000e+00 2921 544 1.0000000000000000e+00 2921 398 -1.0000000000000000e+00 2922 545 1.0000000000000000e+00 2922 398 -1.0000000000000000e+00 2923 546 1.0000000000000000e+00 2923 398 -1.0000000000000000e+00 2924 547 1.0000000000000000e+00 2924 398 -1.0000000000000000e+00 2925 549 1.0000000000000000e+00 2925 398 -1.0000000000000000e+00 2926 550 1.0000000000000000e+00 2926 398 -1.0000000000000000e+00 2927 460 1.0000000000000000e+00 2927 398 -1.0000000000000000e+00 2928 559 1.0000000000000000e+00 2928 398 -1.0000000000000000e+00 2929 459 1.0000000000000000e+00 2929 398 -1.0000000000000000e+00 2930 561 1.0000000000000000e+00 2930 398 -1.0000000000000000e+00 2931 562 1.0000000000000000e+00 2931 398 -1.0000000000000000e+00 2932 563 1.0000000000000000e+00 2932 398 -1.0000000000000000e+00 2933 549 1.0000000000000000e+00 2933 399 -1.0000000000000000e+00 2934 545 1.0000000000000000e+00 2934 399 -1.0000000000000000e+00 2935 546 1.0000000000000000e+00 2935 399 -1.0000000000000000e+00 2936 544 1.0000000000000000e+00 2936 399 -1.0000000000000000e+00 2937 552 1.0000000000000000e+00 2937 399 -1.0000000000000000e+00 2938 547 1.0000000000000000e+00 2938 399 -1.0000000000000000e+00 2939 548 1.0000000000000000e+00 2939 399 -1.0000000000000000e+00 2940 550 1.0000000000000000e+00 2940 399 -1.0000000000000000e+00 2941 551 1.0000000000000000e+00 2941 399 -1.0000000000000000e+00 2942 553 1.0000000000000000e+00 2942 399 -1.0000000000000000e+00 2943 438 1.0000000000000000e+00 2943 399 -1.0000000000000000e+00 2944 549 1.0000000000000000e+00 2944 400 -1.0000000000000000e+00 2945 553 1.0000000000000000e+00 2945 400 -1.0000000000000000e+00 2946 551 1.0000000000000000e+00 2946 400 -1.0000000000000000e+00 2947 550 1.0000000000000000e+00 2947 400 -1.0000000000000000e+00 2948 560 1.0000000000000000e+00 2948 400 -1.0000000000000000e+00 2949 567 1.0000000000000000e+00 2949 400 -1.0000000000000000e+00 2950 554 1.0000000000000000e+00 2950 400 -1.0000000000000000e+00 2951 538 1.0000000000000000e+00 2951 401 -1.0000000000000000e+00 2952 561 1.0000000000000000e+00 2952 401 -1.0000000000000000e+00 2953 562 1.0000000000000000e+00 2953 401 -1.0000000000000000e+00 2954 459 1.0000000000000000e+00 2954 401 -1.0000000000000000e+00 2955 568 1.0000000000000000e+00 2955 401 -1.0000000000000000e+00 2956 601 1.0000000000000000e+00 2956 401 -1.0000000000000000e+00 2957 600 1.0000000000000000e+00 2957 401 -1.0000000000000000e+00 2958 594 1.0000000000000000e+00 2958 401 -1.0000000000000000e+00 2959 603 1.0000000000000000e+00 2959 401 -1.0000000000000000e+00 2960 563 1.0000000000000000e+00 2960 401 -1.0000000000000000e+00 2961 564 1.0000000000000000e+00 2961 401 -1.0000000000000000e+00 2962 542 1.0000000000000000e+00 2962 401 -1.0000000000000000e+00 2963 565 1.0000000000000000e+00 2963 401 -1.0000000000000000e+00 2964 569 1.0000000000000000e+00 2964 401 -1.0000000000000000e+00 2965 534 1.0000000000000000e+00 2965 401 -1.0000000000000000e+00 2966 605 1.0000000000000000e+00 2966 401 -1.0000000000000000e+00 2967 606 1.0000000000000000e+00 2967 401 -1.0000000000000000e+00 2968 573 1.0000000000000000e+00 2968 402 -1.0000000000000000e+00 2969 475 1.0000000000000000e+00 2969 402 -1.0000000000000000e+00 2970 574 1.0000000000000000e+00 2970 402 -1.0000000000000000e+00 2971 575 1.0000000000000000e+00 2971 402 -1.0000000000000000e+00 2972 576 1.0000000000000000e+00 2972 402 -1.0000000000000000e+00 2973 469 1.0000000000000000e+00 2973 402 -1.0000000000000000e+00 2974 577 1.0000000000000000e+00 2974 402 -1.0000000000000000e+00 2975 578 1.0000000000000000e+00 2975 402 -1.0000000000000000e+00 2976 579 1.0000000000000000e+00 2976 402 -1.0000000000000000e+00 2977 581 1.0000000000000000e+00 2977 402 -1.0000000000000000e+00 2978 582 1.0000000000000000e+00 2978 402 -1.0000000000000000e+00 2979 581 1.0000000000000000e+00 2979 403 -1.0000000000000000e+00 2980 577 1.0000000000000000e+00 2980 403 -1.0000000000000000e+00 2981 578 1.0000000000000000e+00 2981 403 -1.0000000000000000e+00 2982 469 1.0000000000000000e+00 2982 403 -1.0000000000000000e+00 2983 584 1.0000000000000000e+00 2983 403 -1.0000000000000000e+00 2984 579 1.0000000000000000e+00 2984 403 -1.0000000000000000e+00 2985 580 1.0000000000000000e+00 2985 403 -1.0000000000000000e+00 2986 582 1.0000000000000000e+00 2986 403 -1.0000000000000000e+00 2987 583 1.0000000000000000e+00 2987 403 -1.0000000000000000e+00 2988 585 1.0000000000000000e+00 2988 403 -1.0000000000000000e+00 2989 473 1.0000000000000000e+00 2989 403 -1.0000000000000000e+00 2990 581 1.0000000000000000e+00 2990 404 -1.0000000000000000e+00 2991 585 1.0000000000000000e+00 2991 404 -1.0000000000000000e+00 2992 583 1.0000000000000000e+00 2992 404 -1.0000000000000000e+00 2993 582 1.0000000000000000e+00 2993 404 -1.0000000000000000e+00 2994 570 1.0000000000000000e+00 2994 405 -1.0000000000000000e+00 2995 587 1.0000000000000000e+00 2995 405 -1.0000000000000000e+00 2996 588 1.0000000000000000e+00 2996 405 -1.0000000000000000e+00 2997 589 1.0000000000000000e+00 2997 405 -1.0000000000000000e+00 2998 590 1.0000000000000000e+00 2998 405 -1.0000000000000000e+00 2999 573 1.0000000000000000e+00 2999 405 -1.0000000000000000e+00 3000 591 1.0000000000000000e+00 3000 405 -1.0000000000000000e+00 3001 405 -1.0000000000000000e+00 3001 152 1.0000000000000000e+00 3002 608 1.0000000000000000e+00 3002 405 -1.0000000000000000e+00 3003 610 1.0000000000000000e+00 3003 405 -1.0000000000000000e+00 3004 594 1.0000000000000000e+00 3004 406 -1.0000000000000000e+00 3005 599 1.0000000000000000e+00 3005 406 -1.0000000000000000e+00 3006 598 1.0000000000000000e+00 3006 406 -1.0000000000000000e+00 3007 596 1.0000000000000000e+00 3007 406 -1.0000000000000000e+00 3008 597 1.0000000000000000e+00 3008 406 -1.0000000000000000e+00 3009 607 1.0000000000000000e+00 3009 406 -1.0000000000000000e+00 3010 606 1.0000000000000000e+00 3010 406 -1.0000000000000000e+00 3011 601 1.0000000000000000e+00 3011 407 -1.0000000000000000e+00 3012 600 1.0000000000000000e+00 3012 407 -1.0000000000000000e+00 3013 603 1.0000000000000000e+00 3013 407 -1.0000000000000000e+00 3014 604 1.0000000000000000e+00 3014 407 -1.0000000000000000e+00 3015 605 1.0000000000000000e+00 3015 407 -1.0000000000000000e+00 3016 594 1.0000000000000000e+00 3016 407 -1.0000000000000000e+00 3017 606 1.0000000000000000e+00 3017 407 -1.0000000000000000e+00 3018 599 1.0000000000000000e+00 3018 407 -1.0000000000000000e+00 3019 607 1.0000000000000000e+00 3019 407 -1.0000000000000000e+00 3020 608 1.0000000000000000e+00 3020 19 -1.0000000000000000e+00 3021 609 1.0000000000000000e+00 3021 19 -1.0000000000000000e+00 3022 610 1.0000000000000000e+00 3022 19 -1.0000000000000000e+00 3023 611 1.0000000000000000e+00 3023 408 -1.0000000000000000e+00 3024 614 1.0000000000000000e+00 3024 408 -1.0000000000000000e+00 3025 613 1.0000000000000000e+00 3025 408 -1.0000000000000000e+00 3026 612 1.0000000000000000e+00 3026 408 -1.0000000000000000e+00 3027 413 1.0000000000000000e+00 3027 409 -1.0000000000000000e+00 3028 414 1.0000000000000000e+00 3028 409 -1.0000000000000000e+00 3029 509 1.0000000000000000e+00 3029 409 -1.0000000000000000e+00 3030 411 1.0000000000000000e+00 3030 409 -1.0000000000000000e+00 3031 410 1.0000000000000000e+00 3031 409 -1.0000000000000000e+00 3032 412 1.0000000000000000e+00 3032 409 -1.0000000000000000e+00 3033 493 1.0000000000000000e+00 3033 409 -1.0000000000000000e+00 3034 492 1.0000000000000000e+00 3034 409 -1.0000000000000000e+00 3035 483 1.0000000000000000e+00 3035 410 -1.0000000000000000e+00 3036 410 -1.0000000000000000e+00 3036 487 1.0000000000000000e+00 3037 412 1.0000000000000000e+00 3037 410 -1.0000000000000000e+00 3038 411 1.0000000000000000e+00 3038 410 -1.0000000000000000e+00 3039 410 -1.0000000000000000e+00 3039 486 1.0000000000000000e+00 3040 509 1.0000000000000000e+00 3040 411 -1.0000000000000000e+00 3041 483 1.0000000000000000e+00 3041 411 -1.0000000000000000e+00 3042 484 1.0000000000000000e+00 3042 411 -1.0000000000000000e+00 3043 494 1.0000000000000000e+00 3043 411 -1.0000000000000000e+00 3044 483 1.0000000000000000e+00 3044 412 -1.0000000000000000e+00 3045 501 1.0000000000000000e+00 3045 412 -1.0000000000000000e+00 3046 413 1.0000000000000000e+00 3046 412 -1.0000000000000000e+00 3047 421 1.0000000000000000e+00 3047 412 -1.0000000000000000e+00 3048 414 1.0000000000000000e+00 3048 413 -1.0000000000000000e+00 3049 421 1.0000000000000000e+00 3049 413 -1.0000000000000000e+00 3050 611 1.0000000000000000e+00 3050 413 -1.0000000000000000e+00 3051 614 1.0000000000000000e+00 3051 413 -1.0000000000000000e+00 3052 421 1.0000000000000000e+00 3052 414 -1.0000000000000000e+00 3053 425 1.0000000000000000e+00 3053 414 -1.0000000000000000e+00 3054 489 1.0000000000000000e+00 3054 414 -1.0000000000000000e+00 3055 493 1.0000000000000000e+00 3055 414 -1.0000000000000000e+00 3056 419 1.0000000000000000e+00 3056 415 -1.0000000000000000e+00 3057 420 1.0000000000000000e+00 3057 415 -1.0000000000000000e+00 3058 444 1.0000000000000000e+00 3058 415 -1.0000000000000000e+00 3059 417 1.0000000000000000e+00 3059 415 -1.0000000000000000e+00 3060 455 1.0000000000000000e+00 3060 415 -1.0000000000000000e+00 3061 416 1.0000000000000000e+00 3061 415 -1.0000000000000000e+00 3062 418 1.0000000000000000e+00 3062 415 -1.0000000000000000e+00 3063 443 1.0000000000000000e+00 3063 415 -1.0000000000000000e+00 3064 445 1.0000000000000000e+00 3064 415 -1.0000000000000000e+00 3065 454 1.0000000000000000e+00 3065 415 -1.0000000000000000e+00 3066 516 1.0000000000000000e+00 3066 415 -1.0000000000000000e+00 3067 499 1.0000000000000000e+00 3067 416 -1.0000000000000000e+00 3068 424 1.0000000000000000e+00 3068 416 -1.0000000000000000e+00 3069 489 1.0000000000000000e+00 3069 416 -1.0000000000000000e+00 3070 491 1.0000000000000000e+00 3070 416 -1.0000000000000000e+00 3071 455 1.0000000000000000e+00 3071 416 -1.0000000000000000e+00 3072 418 1.0000000000000000e+00 3072 416 -1.0000000000000000e+00 3073 417 1.0000000000000000e+00 3073 416 -1.0000000000000000e+00 3074 417 1.0000000000000000e+00 3074 444 -1.0000000000000000e+00 3075 499 1.0000000000000000e+00 3075 417 -1.0000000000000000e+00 3076 417 1.0000000000000000e+00 3076 495 -1.0000000000000000e+00 3077 499 1.0000000000000000e+00 3077 418 -1.0000000000000000e+00 3078 422 1.0000000000000000e+00 3078 418 -1.0000000000000000e+00 3079 419 1.0000000000000000e+00 3079 418 -1.0000000000000000e+00 3080 507 1.0000000000000000e+00 3080 418 -1.0000000000000000e+00 3081 420 1.0000000000000000e+00 3081 419 -1.0000000000000000e+00 3082 570 1.0000000000000000e+00 3082 419 -1.0000000000000000e+00 3083 590 1.0000000000000000e+00 3083 419 -1.0000000000000000e+00 3084 419 -1.0000000000000000e+00 3084 152 1.0000000000000000e+00 3085 507 1.0000000000000000e+00 3085 419 -1.0000000000000000e+00 3086 455 1.0000000000000000e+00 3086 419 -1.0000000000000000e+00 3087 458 1.0000000000000000e+00 3087 419 -1.0000000000000000e+00 3088 420 1.0000000000000000e+00 3088 507 -1.0000000000000000e+00 3089 445 -1.0000000000000000e+00 3089 420 1.0000000000000000e+00 3090 425 1.0000000000000000e+00 3090 421 -1.0000000000000000e+00 3091 501 1.0000000000000000e+00 3091 421 -1.0000000000000000e+00 3092 423 1.0000000000000000e+00 3092 421 -1.0000000000000000e+00 3093 422 1.0000000000000000e+00 3093 421 -1.0000000000000000e+00 3094 424 1.0000000000000000e+00 3094 421 -1.0000000000000000e+00 3095 421 1.0000000000000000e+00 3095 609 -1.0000000000000000e+00 3096 421 1.0000000000000000e+00 3096 611 -1.0000000000000000e+00 3097 499 1.0000000000000000e+00 3097 422 -1.0000000000000000e+00 3098 507 1.0000000000000000e+00 3098 422 -1.0000000000000000e+00 3099 506 1.0000000000000000e+00 3099 422 -1.0000000000000000e+00 3100 609 1.0000000000000000e+00 3100 422 -1.0000000000000000e+00 3101 608 1.0000000000000000e+00 3101 422 -1.0000000000000000e+00 3102 424 1.0000000000000000e+00 3102 422 -1.0000000000000000e+00 3103 423 1.0000000000000000e+00 3103 422 -1.0000000000000000e+00 3104 422 -1.0000000000000000e+00 3104 152 1.0000000000000000e+00 3105 501 1.0000000000000000e+00 3105 423 -1.0000000000000000e+00 3106 483 1.0000000000000000e+00 3106 423 -1.0000000000000000e+00 3107 505 1.0000000000000000e+00 3107 423 -1.0000000000000000e+00 3108 499 1.0000000000000000e+00 3108 423 -1.0000000000000000e+00 3109 499 1.0000000000000000e+00 3109 424 -1.0000000000000000e+00 3110 425 1.0000000000000000e+00 3110 424 -1.0000000000000000e+00 3111 489 1.0000000000000000e+00 3111 424 -1.0000000000000000e+00 3112 573 1.0000000000000000e+00 3112 425 -1.0000000000000000e+00 3113 519 1.0000000000000000e+00 3113 425 -1.0000000000000000e+00 3114 489 1.0000000000000000e+00 3114 425 -1.0000000000000000e+00 3115 455 1.0000000000000000e+00 3115 425 -1.0000000000000000e+00 3116 425 1.0000000000000000e+00 3116 591 -1.0000000000000000e+00 3117 425 1.0000000000000000e+00 3117 609 -1.0000000000000000e+00 3118 430 1.0000000000000000e+00 3118 426 -1.0000000000000000e+00 3119 431 1.0000000000000000e+00 3119 426 -1.0000000000000000e+00 3120 515 1.0000000000000000e+00 3120 426 -1.0000000000000000e+00 3121 428 1.0000000000000000e+00 3121 426 -1.0000000000000000e+00 3122 427 1.0000000000000000e+00 3122 426 -1.0000000000000000e+00 3123 429 1.0000000000000000e+00 3123 426 -1.0000000000000000e+00 3124 436 1.0000000000000000e+00 3124 426 -1.0000000000000000e+00 3125 435 1.0000000000000000e+00 3125 426 -1.0000000000000000e+00 3126 429 1.0000000000000000e+00 3126 427 -1.0000000000000000e+00 3127 428 1.0000000000000000e+00 3127 427 -1.0000000000000000e+00 3128 427 1.0000000000000000e+00 3128 511 -1.0000000000000000e+00 3129 515 1.0000000000000000e+00 3129 428 -1.0000000000000000e+00 3130 511 1.0000000000000000e+00 3130 428 -1.0000000000000000e+00 3131 513 1.0000000000000000e+00 3131 428 -1.0000000000000000e+00 3132 514 1.0000000000000000e+00 3132 428 -1.0000000000000000e+00 3133 511 1.0000000000000000e+00 3133 429 -1.0000000000000000e+00 3134 512 1.0000000000000000e+00 3134 429 -1.0000000000000000e+00 3135 430 1.0000000000000000e+00 3135 429 -1.0000000000000000e+00 3136 508 1.0000000000000000e+00 3136 429 -1.0000000000000000e+00 3137 431 1.0000000000000000e+00 3137 430 -1.0000000000000000e+00 3138 508 1.0000000000000000e+00 3138 430 -1.0000000000000000e+00 3139 432 1.0000000000000000e+00 3139 431 -1.0000000000000000e+00 3140 436 1.0000000000000000e+00 3140 431 -1.0000000000000000e+00 3141 508 1.0000000000000000e+00 3141 431 -1.0000000000000000e+00 3142 498 1.0000000000000000e+00 3142 431 -1.0000000000000000e+00 3143 436 1.0000000000000000e+00 3143 432 -1.0000000000000000e+00 3144 490 1.0000000000000000e+00 3144 432 -1.0000000000000000e+00 3145 434 1.0000000000000000e+00 3145 432 -1.0000000000000000e+00 3146 517 1.0000000000000000e+00 3146 432 -1.0000000000000000e+00 3147 498 1.0000000000000000e+00 3147 432 -1.0000000000000000e+00 3148 448 1.0000000000000000e+00 3148 432 -1.0000000000000000e+00 3149 433 1.0000000000000000e+00 3149 432 -1.0000000000000000e+00 3150 435 1.0000000000000000e+00 3150 432 -1.0000000000000000e+00 3151 497 1.0000000000000000e+00 3151 432 -1.0000000000000000e+00 3152 524 1.0000000000000000e+00 3152 432 -1.0000000000000000e+00 3153 524 1.0000000000000000e+00 3153 433 -1.0000000000000000e+00 3154 525 1.0000000000000000e+00 3154 433 -1.0000000000000000e+00 3155 435 1.0000000000000000e+00 3155 433 -1.0000000000000000e+00 3156 434 1.0000000000000000e+00 3156 433 -1.0000000000000000e+00 3157 433 1.0000000000000000e+00 3157 514 -1.0000000000000000e+00 3158 433 1.0000000000000000e+00 3158 537 -1.0000000000000000e+00 3159 490 1.0000000000000000e+00 3159 434 -1.0000000000000000e+00 3160 494 1.0000000000000000e+00 3160 434 -1.0000000000000000e+00 3161 495 1.0000000000000000e+00 3161 434 -1.0000000000000000e+00 3162 514 1.0000000000000000e+00 3162 434 -1.0000000000000000e+00 3163 514 1.0000000000000000e+00 3163 435 -1.0000000000000000e+00 3164 515 1.0000000000000000e+00 3164 435 -1.0000000000000000e+00 3165 436 1.0000000000000000e+00 3165 435 -1.0000000000000000e+00 3166 524 1.0000000000000000e+00 3166 436 -1.0000000000000000e+00 3167 528 1.0000000000000000e+00 3167 436 -1.0000000000000000e+00 3168 441 1.0000000000000000e+00 3168 437 -1.0000000000000000e+00 3169 442 1.0000000000000000e+00 3169 437 -1.0000000000000000e+00 3170 518 1.0000000000000000e+00 3170 437 -1.0000000000000000e+00 3171 519 1.0000000000000000e+00 3171 437 -1.0000000000000000e+00 3172 521 1.0000000000000000e+00 3172 437 -1.0000000000000000e+00 3173 439 1.0000000000000000e+00 3173 437 -1.0000000000000000e+00 3174 517 1.0000000000000000e+00 3174 437 -1.0000000000000000e+00 3175 451 1.0000000000000000e+00 3175 437 -1.0000000000000000e+00 3176 544 1.0000000000000000e+00 3176 437 -1.0000000000000000e+00 3177 456 1.0000000000000000e+00 3177 437 -1.0000000000000000e+00 3178 438 1.0000000000000000e+00 3178 437 -1.0000000000000000e+00 3179 440 1.0000000000000000e+00 3179 437 -1.0000000000000000e+00 3180 523 1.0000000000000000e+00 3180 437 -1.0000000000000000e+00 3181 440 1.0000000000000000e+00 3181 438 -1.0000000000000000e+00 3182 439 1.0000000000000000e+00 3182 438 -1.0000000000000000e+00 3183 544 1.0000000000000000e+00 3183 438 -1.0000000000000000e+00 3184 552 1.0000000000000000e+00 3184 438 -1.0000000000000000e+00 3185 548 1.0000000000000000e+00 3185 438 -1.0000000000000000e+00 3186 521 1.0000000000000000e+00 3186 439 -1.0000000000000000e+00 3187 469 1.0000000000000000e+00 3187 440 -1.0000000000000000e+00 3188 441 1.0000000000000000e+00 3188 440 -1.0000000000000000e+00 3189 579 1.0000000000000000e+00 3189 440 -1.0000000000000000e+00 3190 442 1.0000000000000000e+00 3190 441 -1.0000000000000000e+00 3191 469 1.0000000000000000e+00 3191 441 -1.0000000000000000e+00 3192 544 1.0000000000000000e+00 3192 441 -1.0000000000000000e+00 3193 474 1.0000000000000000e+00 3193 441 -1.0000000000000000e+00 3194 555 1.0000000000000000e+00 3194 441 -1.0000000000000000e+00 3195 573 1.0000000000000000e+00 3195 442 -1.0000000000000000e+00 3196 475 1.0000000000000000e+00 3196 442 -1.0000000000000000e+00 3197 469 1.0000000000000000e+00 3197 442 -1.0000000000000000e+00 3198 519 1.0000000000000000e+00 3198 442 -1.0000000000000000e+00 3199 446 1.0000000000000000e+00 3199 443 -1.0000000000000000e+00 3200 447 1.0000000000000000e+00 3200 443 -1.0000000000000000e+00 3201 525 1.0000000000000000e+00 3201 443 -1.0000000000000000e+00 3202 532 1.0000000000000000e+00 3202 443 -1.0000000000000000e+00 3203 537 1.0000000000000000e+00 3203 443 -1.0000000000000000e+00 3204 444 1.0000000000000000e+00 3204 443 -1.0000000000000000e+00 3205 524 1.0000000000000000e+00 3205 443 -1.0000000000000000e+00 3206 457 1.0000000000000000e+00 3206 443 -1.0000000000000000e+00 3207 454 1.0000000000000000e+00 3207 443 -1.0000000000000000e+00 3208 467 1.0000000000000000e+00 3208 443 -1.0000000000000000e+00 3209 445 1.0000000000000000e+00 3209 443 -1.0000000000000000e+00 3210 480 1.0000000000000000e+00 3210 443 -1.0000000000000000e+00 3211 444 1.0000000000000000e+00 3211 537 -1.0000000000000000e+00 3212 444 -1.0000000000000000e+00 3212 516 1.0000000000000000e+00 3213 445 1.0000000000000000e+00 3213 135 -1.0000000000000000e+00 3214 446 1.0000000000000000e+00 3214 445 -1.0000000000000000e+00 3215 445 -1.0000000000000000e+00 3215 516 1.0000000000000000e+00 3216 447 1.0000000000000000e+00 3216 446 -1.0000000000000000e+00 3217 454 1.0000000000000000e+00 3217 446 -1.0000000000000000e+00 3218 468 1.0000000000000000e+00 3218 446 -1.0000000000000000e+00 3219 446 -1.0000000000000000e+00 3219 135 1.0000000000000000e+00 3220 466 1.0000000000000000e+00 3220 446 -1.0000000000000000e+00 3221 477 1.0000000000000000e+00 3221 447 -1.0000000000000000e+00 3222 478 1.0000000000000000e+00 3222 447 -1.0000000000000000e+00 3223 532 1.0000000000000000e+00 3223 447 -1.0000000000000000e+00 3224 447 -1.0000000000000000e+00 3224 135 1.0000000000000000e+00 3225 452 1.0000000000000000e+00 3225 448 -1.0000000000000000e+00 3226 453 1.0000000000000000e+00 3226 448 -1.0000000000000000e+00 3227 517 1.0000000000000000e+00 3227 448 -1.0000000000000000e+00 3228 449 1.0000000000000000e+00 3228 448 -1.0000000000000000e+00 3229 566 1.0000000000000000e+00 3229 448 -1.0000000000000000e+00 3230 524 1.0000000000000000e+00 3230 448 -1.0000000000000000e+00 3231 528 1.0000000000000000e+00 3231 448 -1.0000000000000000e+00 3232 451 1.0000000000000000e+00 3232 448 -1.0000000000000000e+00 3233 450 1.0000000000000000e+00 3233 448 -1.0000000000000000e+00 3234 457 1.0000000000000000e+00 3234 448 -1.0000000000000000e+00 3235 462 1.0000000000000000e+00 3235 448 -1.0000000000000000e+00 3236 549 1.0000000000000000e+00 3236 449 -1.0000000000000000e+00 3237 450 1.0000000000000000e+00 3237 449 -1.0000000000000000e+00 3238 566 1.0000000000000000e+00 3238 449 -1.0000000000000000e+00 3239 451 1.0000000000000000e+00 3239 449 -1.0000000000000000e+00 3240 462 1.0000000000000000e+00 3240 449 -1.0000000000000000e+00 3241 549 1.0000000000000000e+00 3241 450 -1.0000000000000000e+00 3242 452 1.0000000000000000e+00 3242 450 -1.0000000000000000e+00 3243 553 1.0000000000000000e+00 3243 450 -1.0000000000000000e+00 3244 517 1.0000000000000000e+00 3244 451 -1.0000000000000000e+00 3245 549 1.0000000000000000e+00 3245 451 -1.0000000000000000e+00 3246 545 1.0000000000000000e+00 3246 451 -1.0000000000000000e+00 3247 544 1.0000000000000000e+00 3247 451 -1.0000000000000000e+00 3248 453 1.0000000000000000e+00 3248 452 -1.0000000000000000e+00 3249 517 1.0000000000000000e+00 3249 452 -1.0000000000000000e+00 3250 522 1.0000000000000000e+00 3250 452 -1.0000000000000000e+00 3251 498 1.0000000000000000e+00 3251 452 -1.0000000000000000e+00 3252 528 1.0000000000000000e+00 3252 453 -1.0000000000000000e+00 3253 455 1.0000000000000000e+00 3253 454 -1.0000000000000000e+00 3254 458 1.0000000000000000e+00 3254 454 -1.0000000000000000e+00 3255 468 1.0000000000000000e+00 3255 454 -1.0000000000000000e+00 3256 465 1.0000000000000000e+00 3256 454 -1.0000000000000000e+00 3257 556 1.0000000000000000e+00 3257 454 -1.0000000000000000e+00 3258 467 1.0000000000000000e+00 3258 454 -1.0000000000000000e+00 3259 457 1.0000000000000000e+00 3259 454 -1.0000000000000000e+00 3260 456 1.0000000000000000e+00 3260 454 -1.0000000000000000e+00 3261 466 1.0000000000000000e+00 3261 454 -1.0000000000000000e+00 3262 458 1.0000000000000000e+00 3262 455 -1.0000000000000000e+00 3263 519 1.0000000000000000e+00 3263 455 -1.0000000000000000e+00 3264 520 1.0000000000000000e+00 3264 455 -1.0000000000000000e+00 3265 457 1.0000000000000000e+00 3265 455 -1.0000000000000000e+00 3266 456 1.0000000000000000e+00 3266 455 -1.0000000000000000e+00 3267 517 1.0000000000000000e+00 3267 455 -1.0000000000000000e+00 3268 518 1.0000000000000000e+00 3268 455 -1.0000000000000000e+00 3269 489 1.0000000000000000e+00 3269 455 -1.0000000000000000e+00 3270 544 1.0000000000000000e+00 3270 456 -1.0000000000000000e+00 3271 539 1.0000000000000000e+00 3271 456 -1.0000000000000000e+00 3272 538 1.0000000000000000e+00 3272 456 -1.0000000000000000e+00 3273 465 1.0000000000000000e+00 3273 456 -1.0000000000000000e+00 3274 517 1.0000000000000000e+00 3274 456 -1.0000000000000000e+00 3275 524 1.0000000000000000e+00 3275 457 -1.0000000000000000e+00 3276 517 1.0000000000000000e+00 3276 457 -1.0000000000000000e+00 3277 570 1.0000000000000000e+00 3277 458 -1.0000000000000000e+00 3278 468 1.0000000000000000e+00 3278 458 -1.0000000000000000e+00 3279 520 1.0000000000000000e+00 3279 458 -1.0000000000000000e+00 3280 556 1.0000000000000000e+00 3280 458 -1.0000000000000000e+00 3281 463 1.0000000000000000e+00 3281 459 -1.0000000000000000e+00 3282 464 1.0000000000000000e+00 3282 459 -1.0000000000000000e+00 3283 563 1.0000000000000000e+00 3283 459 -1.0000000000000000e+00 3284 564 1.0000000000000000e+00 3284 459 -1.0000000000000000e+00 3285 460 1.0000000000000000e+00 3285 459 -1.0000000000000000e+00 3286 559 1.0000000000000000e+00 3286 459 -1.0000000000000000e+00 3287 527 1.0000000000000000e+00 3287 459 -1.0000000000000000e+00 3288 534 1.0000000000000000e+00 3288 459 -1.0000000000000000e+00 3289 561 1.0000000000000000e+00 3289 459 -1.0000000000000000e+00 3290 568 1.0000000000000000e+00 3290 459 -1.0000000000000000e+00 3291 462 1.0000000000000000e+00 3291 459 -1.0000000000000000e+00 3292 461 1.0000000000000000e+00 3292 459 -1.0000000000000000e+00 3293 541 1.0000000000000000e+00 3293 459 -1.0000000000000000e+00 3294 562 1.0000000000000000e+00 3294 459 -1.0000000000000000e+00 3295 467 1.0000000000000000e+00 3295 459 -1.0000000000000000e+00 3296 559 1.0000000000000000e+00 3296 460 -1.0000000000000000e+00 3297 549 1.0000000000000000e+00 3297 460 -1.0000000000000000e+00 3298 461 1.0000000000000000e+00 3298 460 -1.0000000000000000e+00 3299 462 1.0000000000000000e+00 3299 460 -1.0000000000000000e+00 3300 541 1.0000000000000000e+00 3300 460 -1.0000000000000000e+00 3301 549 1.0000000000000000e+00 3301 461 -1.0000000000000000e+00 3302 463 1.0000000000000000e+00 3302 461 -1.0000000000000000e+00 3303 567 1.0000000000000000e+00 3303 461 -1.0000000000000000e+00 3304 549 1.0000000000000000e+00 3304 462 -1.0000000000000000e+00 3305 527 1.0000000000000000e+00 3305 462 -1.0000000000000000e+00 3306 524 1.0000000000000000e+00 3306 462 -1.0000000000000000e+00 3307 464 1.0000000000000000e+00 3307 463 -1.0000000000000000e+00 3308 527 1.0000000000000000e+00 3308 463 -1.0000000000000000e+00 3309 530 1.0000000000000000e+00 3309 463 -1.0000000000000000e+00 3310 535 1.0000000000000000e+00 3310 463 -1.0000000000000000e+00 3311 563 1.0000000000000000e+00 3311 464 -1.0000000000000000e+00 3312 556 1.0000000000000000e+00 3312 465 -1.0000000000000000e+00 3313 538 1.0000000000000000e+00 3313 465 -1.0000000000000000e+00 3314 466 1.0000000000000000e+00 3314 465 -1.0000000000000000e+00 3315 467 1.0000000000000000e+00 3315 465 -1.0000000000000000e+00 3316 538 1.0000000000000000e+00 3316 466 -1.0000000000000000e+00 3317 466 -1.0000000000000000e+00 3317 135 1.0000000000000000e+00 3318 602 1.0000000000000000e+00 3318 466 -1.0000000000000000e+00 3319 569 1.0000000000000000e+00 3319 466 -1.0000000000000000e+00 3320 601 1.0000000000000000e+00 3320 466 -1.0000000000000000e+00 3321 527 1.0000000000000000e+00 3321 467 -1.0000000000000000e+00 3322 524 1.0000000000000000e+00 3322 467 -1.0000000000000000e+00 3323 538 1.0000000000000000e+00 3323 467 -1.0000000000000000e+00 3324 561 1.0000000000000000e+00 3324 467 -1.0000000000000000e+00 3325 570 -1.0000000000000000e+00 3325 468 1.0000000000000000e+00 3326 468 1.0000000000000000e+00 3326 135 -1.0000000000000000e+00 3327 473 1.0000000000000000e+00 3327 469 -1.0000000000000000e+00 3328 474 1.0000000000000000e+00 3328 469 -1.0000000000000000e+00 3329 470 1.0000000000000000e+00 3329 469 -1.0000000000000000e+00 3330 555 1.0000000000000000e+00 3330 469 -1.0000000000000000e+00 3331 579 1.0000000000000000e+00 3331 469 -1.0000000000000000e+00 3332 580 1.0000000000000000e+00 3332 469 -1.0000000000000000e+00 3333 475 1.0000000000000000e+00 3333 469 -1.0000000000000000e+00 3334 574 1.0000000000000000e+00 3334 469 -1.0000000000000000e+00 3335 577 1.0000000000000000e+00 3335 469 -1.0000000000000000e+00 3336 584 1.0000000000000000e+00 3336 469 -1.0000000000000000e+00 3337 472 1.0000000000000000e+00 3337 469 -1.0000000000000000e+00 3338 471 1.0000000000000000e+00 3338 469 -1.0000000000000000e+00 3339 476 1.0000000000000000e+00 3339 469 -1.0000000000000000e+00 3340 575 1.0000000000000000e+00 3340 469 -1.0000000000000000e+00 3341 578 1.0000000000000000e+00 3341 469 -1.0000000000000000e+00 3342 555 1.0000000000000000e+00 3342 470 -1.0000000000000000e+00 3343 572 1.0000000000000000e+00 3343 470 -1.0000000000000000e+00 3344 471 1.0000000000000000e+00 3344 470 -1.0000000000000000e+00 3345 472 1.0000000000000000e+00 3345 470 -1.0000000000000000e+00 3346 476 1.0000000000000000e+00 3346 470 -1.0000000000000000e+00 3347 572 1.0000000000000000e+00 3347 471 -1.0000000000000000e+00 3348 473 1.0000000000000000e+00 3348 471 -1.0000000000000000e+00 3349 586 1.0000000000000000e+00 3349 471 -1.0000000000000000e+00 3350 472 1.0000000000000000e+00 3350 581 -1.0000000000000000e+00 3351 577 1.0000000000000000e+00 3351 472 -1.0000000000000000e+00 3352 472 1.0000000000000000e+00 3352 572 -1.0000000000000000e+00 3353 474 1.0000000000000000e+00 3353 473 -1.0000000000000000e+00 3354 584 1.0000000000000000e+00 3354 473 -1.0000000000000000e+00 3355 580 1.0000000000000000e+00 3355 473 -1.0000000000000000e+00 3356 544 1.0000000000000000e+00 3356 474 -1.0000000000000000e+00 3357 547 1.0000000000000000e+00 3357 474 -1.0000000000000000e+00 3358 574 1.0000000000000000e+00 3358 475 -1.0000000000000000e+00 3359 573 1.0000000000000000e+00 3359 475 -1.0000000000000000e+00 3360 476 1.0000000000000000e+00 3360 475 -1.0000000000000000e+00 3361 575 1.0000000000000000e+00 3361 475 -1.0000000000000000e+00 3362 570 1.0000000000000000e+00 3362 476 -1.0000000000000000e+00 3363 571 1.0000000000000000e+00 3363 476 -1.0000000000000000e+00 3364 572 1.0000000000000000e+00 3364 476 -1.0000000000000000e+00 3365 573 1.0000000000000000e+00 3365 476 -1.0000000000000000e+00 3366 587 1.0000000000000000e+00 3366 476 -1.0000000000000000e+00 3367 477 -1.0000000000000000e+00 3367 287 1.0000000000000000e+00 3368 480 1.0000000000000000e+00 3368 477 -1.0000000000000000e+00 3369 481 1.0000000000000000e+00 3369 477 -1.0000000000000000e+00 3370 482 1.0000000000000000e+00 3370 477 -1.0000000000000000e+00 3371 532 1.0000000000000000e+00 3371 477 -1.0000000000000000e+00 3372 531 1.0000000000000000e+00 3372 477 -1.0000000000000000e+00 3373 478 1.0000000000000000e+00 3373 477 -1.0000000000000000e+00 3374 593 1.0000000000000000e+00 3374 477 -1.0000000000000000e+00 3375 595 1.0000000000000000e+00 3375 477 -1.0000000000000000e+00 3376 477 -1.0000000000000000e+00 3376 300 1.0000000000000000e+00 3377 479 1.0000000000000000e+00 3377 477 -1.0000000000000000e+00 3378 477 -1.0000000000000000e+00 3378 307 1.0000000000000000e+00 3379 592 1.0000000000000000e+00 3379 477 -1.0000000000000000e+00 3380 533 1.0000000000000000e+00 3380 477 -1.0000000000000000e+00 3381 478 -1.0000000000000000e+00 3381 300 1.0000000000000000e+00 3382 478 -1.0000000000000000e+00 3382 479 1.0000000000000000e+00 3383 478 1.0000000000000000e+00 3383 135 -1.0000000000000000e+00 3384 592 1.0000000000000000e+00 3384 478 -1.0000000000000000e+00 3385 479 1.0000000000000000e+00 3385 287 -1.0000000000000000e+00 3386 481 -1.0000000000000000e+00 3386 300 1.0000000000000000e+00 3387 480 1.0000000000000000e+00 3387 287 -1.0000000000000000e+00 3388 481 -1.0000000000000000e+00 3388 287 1.0000000000000000e+00 3389 532 1.0000000000000000e+00 3389 480 -1.0000000000000000e+00 3390 537 -1.0000000000000000e+00 3390 480 1.0000000000000000e+00 3391 482 1.0000000000000000e+00 3391 481 -1.0000000000000000e+00 3392 481 -1.0000000000000000e+00 3392 307 1.0000000000000000e+00 3393 594 1.0000000000000000e+00 3393 307 -1.0000000000000000e+00 3394 593 1.0000000000000000e+00 3394 307 -1.0000000000000000e+00 3395 599 -1.0000000000000000e+00 3395 307 1.0000000000000000e+00 3396 595 1.0000000000000000e+00 3396 482 -1.0000000000000000e+00 3397 531 1.0000000000000000e+00 3397 482 -1.0000000000000000e+00 3398 487 1.0000000000000000e+00 3398 483 -1.0000000000000000e+00 3399 484 1.0000000000000000e+00 3399 483 -1.0000000000000000e+00 3400 488 1.0000000000000000e+00 3400 483 -1.0000000000000000e+00 3401 501 1.0000000000000000e+00 3401 483 -1.0000000000000000e+00 3402 505 1.0000000000000000e+00 3402 483 -1.0000000000000000e+00 3403 485 1.0000000000000000e+00 3403 483 -1.0000000000000000e+00 3404 486 1.0000000000000000e+00 3404 483 -1.0000000000000000e+00 3405 502 1.0000000000000000e+00 3405 483 -1.0000000000000000e+00 3406 488 1.0000000000000000e+00 3406 484 -1.0000000000000000e+00 3407 494 1.0000000000000000e+00 3407 484 -1.0000000000000000e+00 3408 496 1.0000000000000000e+00 3408 484 -1.0000000000000000e+00 3409 484 -1.0000000000000000e+00 3409 486 1.0000000000000000e+00 3410 484 -1.0000000000000000e+00 3410 485 1.0000000000000000e+00 3411 510 1.0000000000000000e+00 3411 484 -1.0000000000000000e+00 3412 511 -1.0000000000000000e+00 3412 484 1.0000000000000000e+00 3413 505 -1.0000000000000000e+00 3413 485 1.0000000000000000e+00 3414 487 -1.0000000000000000e+00 3414 116 1.0000000000000000e+00 3415 501 1.0000000000000000e+00 3415 487 -1.0000000000000000e+00 3416 487 1.0000000000000000e+00 3416 503 -1.0000000000000000e+00 3417 494 1.0000000000000000e+00 3417 488 -1.0000000000000000e+00 3418 495 1.0000000000000000e+00 3418 488 -1.0000000000000000e+00 3419 499 1.0000000000000000e+00 3419 488 -1.0000000000000000e+00 3420 505 1.0000000000000000e+00 3420 488 -1.0000000000000000e+00 3421 493 1.0000000000000000e+00 3421 489 -1.0000000000000000e+00 3422 491 1.0000000000000000e+00 3422 489 -1.0000000000000000e+00 3423 518 1.0000000000000000e+00 3423 489 -1.0000000000000000e+00 3424 490 1.0000000000000000e+00 3424 489 -1.0000000000000000e+00 3425 492 1.0000000000000000e+00 3425 489 -1.0000000000000000e+00 3426 494 1.0000000000000000e+00 3426 490 -1.0000000000000000e+00 3427 497 1.0000000000000000e+00 3427 490 -1.0000000000000000e+00 3428 518 1.0000000000000000e+00 3428 490 -1.0000000000000000e+00 3429 492 1.0000000000000000e+00 3429 490 -1.0000000000000000e+00 3430 491 1.0000000000000000e+00 3430 490 -1.0000000000000000e+00 3431 517 1.0000000000000000e+00 3431 490 -1.0000000000000000e+00 3432 494 1.0000000000000000e+00 3432 491 -1.0000000000000000e+00 3433 495 1.0000000000000000e+00 3433 491 -1.0000000000000000e+00 3434 499 1.0000000000000000e+00 3434 491 -1.0000000000000000e+00 3435 494 1.0000000000000000e+00 3435 492 -1.0000000000000000e+00 3436 509 1.0000000000000000e+00 3436 492 -1.0000000000000000e+00 3437 493 1.0000000000000000e+00 3437 492 -1.0000000000000000e+00 3438 518 1.0000000000000000e+00 3438 493 -1.0000000000000000e+00 3439 521 1.0000000000000000e+00 3439 493 -1.0000000000000000e+00 3440 497 1.0000000000000000e+00 3440 494 -1.0000000000000000e+00 3441 495 1.0000000000000000e+00 3441 494 -1.0000000000000000e+00 3442 509 1.0000000000000000e+00 3442 494 -1.0000000000000000e+00 3443 496 1.0000000000000000e+00 3443 494 -1.0000000000000000e+00 3444 510 1.0000000000000000e+00 3444 494 -1.0000000000000000e+00 3445 499 1.0000000000000000e+00 3445 495 -1.0000000000000000e+00 3446 495 -1.0000000000000000e+00 3446 500 1.0000000000000000e+00 3447 495 1.0000000000000000e+00 3447 514 -1.0000000000000000e+00 3448 496 1.0000000000000000e+00 3448 495 -1.0000000000000000e+00 3449 511 1.0000000000000000e+00 3449 496 -1.0000000000000000e+00 3450 513 1.0000000000000000e+00 3450 496 -1.0000000000000000e+00 3451 514 1.0000000000000000e+00 3451 496 -1.0000000000000000e+00 3452 498 1.0000000000000000e+00 3452 497 -1.0000000000000000e+00 3453 508 1.0000000000000000e+00 3453 497 -1.0000000000000000e+00 3454 509 1.0000000000000000e+00 3454 497 -1.0000000000000000e+00 3455 508 1.0000000000000000e+00 3455 498 -1.0000000000000000e+00 3456 517 1.0000000000000000e+00 3456 498 -1.0000000000000000e+00 3457 500 1.0000000000000000e+00 3457 499 -1.0000000000000000e+00 3458 505 1.0000000000000000e+00 3458 499 -1.0000000000000000e+00 3459 506 1.0000000000000000e+00 3459 499 -1.0000000000000000e+00 3460 500 1.0000000000000000e+00 3460 505 -1.0000000000000000e+00 3461 503 1.0000000000000000e+00 3461 116 -1.0000000000000000e+00 3462 504 1.0000000000000000e+00 3462 116 -1.0000000000000000e+00 3463 611 -1.0000000000000000e+00 3463 116 1.0000000000000000e+00 3464 501 1.0000000000000000e+00 3464 116 -1.0000000000000000e+00 3465 502 1.0000000000000000e+00 3465 116 -1.0000000000000000e+00 3466 611 1.0000000000000000e+00 3466 501 -1.0000000000000000e+00 3467 502 1.0000000000000000e+00 3467 501 -1.0000000000000000e+00 3468 502 1.0000000000000000e+00 3468 505 -1.0000000000000000e+00 3469 503 -1.0000000000000000e+00 3469 504 1.0000000000000000e+00 3470 611 1.0000000000000000e+00 3470 503 -1.0000000000000000e+00 3471 612 1.0000000000000000e+00 3471 503 -1.0000000000000000e+00 3472 506 1.0000000000000000e+00 3472 505 -1.0000000000000000e+00 3473 506 1.0000000000000000e+00 3473 507 -1.0000000000000000e+00 3474 507 1.0000000000000000e+00 3474 152 -1.0000000000000000e+00 3475 512 1.0000000000000000e+00 3475 508 -1.0000000000000000e+00 3476 510 1.0000000000000000e+00 3476 508 -1.0000000000000000e+00 3477 509 1.0000000000000000e+00 3477 508 -1.0000000000000000e+00 3478 510 1.0000000000000000e+00 3478 509 -1.0000000000000000e+00 3479 512 1.0000000000000000e+00 3479 510 -1.0000000000000000e+00 3480 511 1.0000000000000000e+00 3480 510 -1.0000000000000000e+00 3481 511 -1.0000000000000000e+00 3481 512 1.0000000000000000e+00 3482 513 1.0000000000000000e+00 3482 511 -1.0000000000000000e+00 3483 514 -1.0000000000000000e+00 3483 513 1.0000000000000000e+00 3484 514 -1.0000000000000000e+00 3484 515 1.0000000000000000e+00 3485 518 1.0000000000000000e+00 3485 517 -1.0000000000000000e+00 3486 522 1.0000000000000000e+00 3486 517 -1.0000000000000000e+00 3487 519 1.0000000000000000e+00 3487 518 -1.0000000000000000e+00 3488 522 1.0000000000000000e+00 3488 518 -1.0000000000000000e+00 3489 521 1.0000000000000000e+00 3489 518 -1.0000000000000000e+00 3490 520 1.0000000000000000e+00 3490 519 -1.0000000000000000e+00 3491 573 1.0000000000000000e+00 3491 519 -1.0000000000000000e+00 3492 523 1.0000000000000000e+00 3492 519 -1.0000000000000000e+00 3493 570 1.0000000000000000e+00 3493 520 -1.0000000000000000e+00 3494 587 1.0000000000000000e+00 3494 520 -1.0000000000000000e+00 3495 573 1.0000000000000000e+00 3495 520 -1.0000000000000000e+00 3496 522 1.0000000000000000e+00 3496 521 -1.0000000000000000e+00 3497 523 1.0000000000000000e+00 3497 521 -1.0000000000000000e+00 3498 573 1.0000000000000000e+00 3498 523 -1.0000000000000000e+00 3499 576 1.0000000000000000e+00 3499 523 -1.0000000000000000e+00 3500 528 1.0000000000000000e+00 3500 524 -1.0000000000000000e+00 3501 525 1.0000000000000000e+00 3501 524 -1.0000000000000000e+00 3502 527 1.0000000000000000e+00 3502 524 -1.0000000000000000e+00 3503 526 1.0000000000000000e+00 3503 524 -1.0000000000000000e+00 3504 529 1.0000000000000000e+00 3504 525 -1.0000000000000000e+00 3505 526 1.0000000000000000e+00 3505 525 -1.0000000000000000e+00 3506 532 1.0000000000000000e+00 3506 525 -1.0000000000000000e+00 3507 527 1.0000000000000000e+00 3507 525 -1.0000000000000000e+00 3508 536 1.0000000000000000e+00 3508 525 -1.0000000000000000e+00 3509 537 1.0000000000000000e+00 3509 525 -1.0000000000000000e+00 3510 529 1.0000000000000000e+00 3510 526 -1.0000000000000000e+00 3511 528 1.0000000000000000e+00 3511 526 -1.0000000000000000e+00 3512 532 1.0000000000000000e+00 3512 527 -1.0000000000000000e+00 3513 533 1.0000000000000000e+00 3513 527 -1.0000000000000000e+00 3514 530 1.0000000000000000e+00 3514 527 -1.0000000000000000e+00 3515 534 1.0000000000000000e+00 3515 527 -1.0000000000000000e+00 3516 529 1.0000000000000000e+00 3516 527 -1.0000000000000000e+00 3517 531 1.0000000000000000e+00 3517 527 -1.0000000000000000e+00 3518 535 1.0000000000000000e+00 3518 527 -1.0000000000000000e+00 3519 566 1.0000000000000000e+00 3519 528 -1.0000000000000000e+00 3520 531 1.0000000000000000e+00 3520 529 -1.0000000000000000e+00 3521 530 1.0000000000000000e+00 3521 529 -1.0000000000000000e+00 3522 536 1.0000000000000000e+00 3522 529 -1.0000000000000000e+00 3523 532 1.0000000000000000e+00 3523 531 -1.0000000000000000e+00 3524 533 1.0000000000000000e+00 3524 532 -1.0000000000000000e+00 3525 594 1.0000000000000000e+00 3525 533 -1.0000000000000000e+00 3526 593 1.0000000000000000e+00 3526 533 -1.0000000000000000e+00 3527 534 1.0000000000000000e+00 3527 533 -1.0000000000000000e+00 3528 594 1.0000000000000000e+00 3528 534 -1.0000000000000000e+00 3529 564 1.0000000000000000e+00 3529 534 -1.0000000000000000e+00 3530 535 1.0000000000000000e+00 3530 534 -1.0000000000000000e+00 3531 568 1.0000000000000000e+00 3531 534 -1.0000000000000000e+00 3532 594 1.0000000000000000e+00 3532 535 -1.0000000000000000e+00 3533 596 1.0000000000000000e+00 3533 535 -1.0000000000000000e+00 3534 537 -1.0000000000000000e+00 3534 536 1.0000000000000000e+00 3535 542 1.0000000000000000e+00 3535 538 -1.0000000000000000e+00 3536 543 1.0000000000000000e+00 3536 538 -1.0000000000000000e+00 3537 557 1.0000000000000000e+00 3537 538 -1.0000000000000000e+00 3538 558 1.0000000000000000e+00 3538 538 -1.0000000000000000e+00 3539 539 1.0000000000000000e+00 3539 538 -1.0000000000000000e+00 3540 555 1.0000000000000000e+00 3540 538 -1.0000000000000000e+00 3541 561 1.0000000000000000e+00 3541 538 -1.0000000000000000e+00 3542 562 1.0000000000000000e+00 3542 538 -1.0000000000000000e+00 3543 569 1.0000000000000000e+00 3543 538 -1.0000000000000000e+00 3544 565 1.0000000000000000e+00 3544 538 -1.0000000000000000e+00 3545 541 1.0000000000000000e+00 3545 538 -1.0000000000000000e+00 3546 540 1.0000000000000000e+00 3546 538 -1.0000000000000000e+00 3547 556 1.0000000000000000e+00 3547 538 -1.0000000000000000e+00 3548 568 1.0000000000000000e+00 3548 538 -1.0000000000000000e+00 3549 544 1.0000000000000000e+00 3549 539 -1.0000000000000000e+00 3550 540 1.0000000000000000e+00 3550 539 -1.0000000000000000e+00 3551 555 1.0000000000000000e+00 3551 539 -1.0000000000000000e+00 3552 541 1.0000000000000000e+00 3552 539 -1.0000000000000000e+00 3553 544 1.0000000000000000e+00 3553 540 -1.0000000000000000e+00 3554 542 1.0000000000000000e+00 3554 540 -1.0000000000000000e+00 3555 547 1.0000000000000000e+00 3555 540 -1.0000000000000000e+00 3556 544 1.0000000000000000e+00 3556 541 -1.0000000000000000e+00 3557 545 1.0000000000000000e+00 3557 541 -1.0000000000000000e+00 3558 549 1.0000000000000000e+00 3558 541 -1.0000000000000000e+00 3559 561 1.0000000000000000e+00 3559 541 -1.0000000000000000e+00 3560 543 1.0000000000000000e+00 3560 542 -1.0000000000000000e+00 3561 562 1.0000000000000000e+00 3561 542 -1.0000000000000000e+00 3562 565 1.0000000000000000e+00 3562 542 -1.0000000000000000e+00 3563 572 1.0000000000000000e+00 3563 543 -1.0000000000000000e+00 3564 557 1.0000000000000000e+00 3564 543 -1.0000000000000000e+00 3565 586 1.0000000000000000e+00 3565 543 -1.0000000000000000e+00 3566 547 1.0000000000000000e+00 3566 544 -1.0000000000000000e+00 3567 548 1.0000000000000000e+00 3567 544 -1.0000000000000000e+00 3568 545 1.0000000000000000e+00 3568 544 -1.0000000000000000e+00 3569 552 1.0000000000000000e+00 3569 544 -1.0000000000000000e+00 3570 546 1.0000000000000000e+00 3570 544 -1.0000000000000000e+00 3571 555 1.0000000000000000e+00 3571 544 -1.0000000000000000e+00 3572 549 1.0000000000000000e+00 3572 545 -1.0000000000000000e+00 3573 546 1.0000000000000000e+00 3573 545 -1.0000000000000000e+00 3574 552 1.0000000000000000e+00 3574 545 -1.0000000000000000e+00 3575 549 1.0000000000000000e+00 3575 546 -1.0000000000000000e+00 3576 547 1.0000000000000000e+00 3576 546 -1.0000000000000000e+00 3577 550 1.0000000000000000e+00 3577 546 -1.0000000000000000e+00 3578 548 1.0000000000000000e+00 3578 547 -1.0000000000000000e+00 3579 553 1.0000000000000000e+00 3579 549 -1.0000000000000000e+00 3580 551 1.0000000000000000e+00 3580 549 -1.0000000000000000e+00 3581 550 1.0000000000000000e+00 3581 549 -1.0000000000000000e+00 3582 560 1.0000000000000000e+00 3582 549 -1.0000000000000000e+00 3583 567 1.0000000000000000e+00 3583 549 -1.0000000000000000e+00 3584 554 1.0000000000000000e+00 3584 549 -1.0000000000000000e+00 3585 552 1.0000000000000000e+00 3585 549 -1.0000000000000000e+00 3586 559 1.0000000000000000e+00 3586 549 -1.0000000000000000e+00 3587 566 1.0000000000000000e+00 3587 549 -1.0000000000000000e+00 3588 560 1.0000000000000000e+00 3588 550 -1.0000000000000000e+00 3589 551 1.0000000000000000e+00 3589 550 -1.0000000000000000e+00 3590 559 1.0000000000000000e+00 3590 550 -1.0000000000000000e+00 3591 553 1.0000000000000000e+00 3591 551 -1.0000000000000000e+00 3592 553 1.0000000000000000e+00 3592 552 -1.0000000000000000e+00 3593 554 1.0000000000000000e+00 3593 553 -1.0000000000000000e+00 3594 567 1.0000000000000000e+00 3594 554 -1.0000000000000000e+00 3595 557 1.0000000000000000e+00 3595 555 -1.0000000000000000e+00 3596 572 1.0000000000000000e+00 3596 555 -1.0000000000000000e+00 3597 572 1.0000000000000000e+00 3597 556 -1.0000000000000000e+00 3598 571 1.0000000000000000e+00 3598 556 -1.0000000000000000e+00 3599 557 1.0000000000000000e+00 3599 556 -1.0000000000000000e+00 3600 570 1.0000000000000000e+00 3600 556 -1.0000000000000000e+00 3601 558 1.0000000000000000e+00 3601 557 -1.0000000000000000e+00 3602 572 1.0000000000000000e+00 3602 557 -1.0000000000000000e+00 3603 601 -1.0000000000000000e+00 3603 558 1.0000000000000000e+00 3604 569 1.0000000000000000e+00 3604 558 -1.0000000000000000e+00 3605 572 -1.0000000000000000e+00 3605 558 1.0000000000000000e+00 3606 563 1.0000000000000000e+00 3606 559 -1.0000000000000000e+00 3607 567 1.0000000000000000e+00 3607 560 -1.0000000000000000e+00 3608 562 1.0000000000000000e+00 3608 561 -1.0000000000000000e+00 3609 568 1.0000000000000000e+00 3609 561 -1.0000000000000000e+00 3610 563 1.0000000000000000e+00 3610 562 -1.0000000000000000e+00 3611 564 1.0000000000000000e+00 3611 563 -1.0000000000000000e+00 3612 594 1.0000000000000000e+00 3612 564 -1.0000000000000000e+00 3613 606 1.0000000000000000e+00 3613 564 -1.0000000000000000e+00 3614 569 1.0000000000000000e+00 3614 565 -1.0000000000000000e+00 3615 601 1.0000000000000000e+00 3615 565 -1.0000000000000000e+00 3616 605 1.0000000000000000e+00 3616 565 -1.0000000000000000e+00 3617 567 1.0000000000000000e+00 3617 566 -1.0000000000000000e+00 3618 601 1.0000000000000000e+00 3618 568 -1.0000000000000000e+00 3619 600 1.0000000000000000e+00 3619 568 -1.0000000000000000e+00 3620 569 1.0000000000000000e+00 3620 568 -1.0000000000000000e+00 3621 594 1.0000000000000000e+00 3621 568 -1.0000000000000000e+00 3622 601 1.0000000000000000e+00 3622 569 -1.0000000000000000e+00 3623 590 1.0000000000000000e+00 3623 570 -1.0000000000000000e+00 3624 587 1.0000000000000000e+00 3624 570 -1.0000000000000000e+00 3625 570 -1.0000000000000000e+00 3625 571 1.0000000000000000e+00 3626 589 1.0000000000000000e+00 3626 570 -1.0000000000000000e+00 3627 588 1.0000000000000000e+00 3627 570 -1.0000000000000000e+00 3628 571 1.0000000000000000e+00 3628 572 -1.0000000000000000e+00 3629 586 1.0000000000000000e+00 3629 572 -1.0000000000000000e+00 3630 573 -1.0000000000000000e+00 3630 576 1.0000000000000000e+00 3631 587 1.0000000000000000e+00 3631 573 -1.0000000000000000e+00 3632 588 1.0000000000000000e+00 3632 573 -1.0000000000000000e+00 3633 573 -1.0000000000000000e+00 3633 575 1.0000000000000000e+00 3634 574 1.0000000000000000e+00 3634 573 -1.0000000000000000e+00 3635 573 -1.0000000000000000e+00 3635 591 1.0000000000000000e+00 3636 573 -1.0000000000000000e+00 3636 589 1.0000000000000000e+00 3637 576 1.0000000000000000e+00 3637 574 -1.0000000000000000e+00 3638 579 1.0000000000000000e+00 3638 574 -1.0000000000000000e+00 3639 577 1.0000000000000000e+00 3639 575 -1.0000000000000000e+00 3640 575 1.0000000000000000e+00 3640 581 -1.0000000000000000e+00 3641 581 1.0000000000000000e+00 3641 577 -1.0000000000000000e+00 3642 578 1.0000000000000000e+00 3642 577 -1.0000000000000000e+00 3643 584 1.0000000000000000e+00 3643 577 -1.0000000000000000e+00 3644 581 1.0000000000000000e+00 3644 578 -1.0000000000000000e+00 3645 579 1.0000000000000000e+00 3645 578 -1.0000000000000000e+00 3646 582 1.0000000000000000e+00 3646 578 -1.0000000000000000e+00 3647 580 1.0000000000000000e+00 3647 579 -1.0000000000000000e+00 3648 585 1.0000000000000000e+00 3648 581 -1.0000000000000000e+00 3649 583 1.0000000000000000e+00 3649 581 -1.0000000000000000e+00 3650 582 1.0000000000000000e+00 3650 581 -1.0000000000000000e+00 3651 584 1.0000000000000000e+00 3651 581 -1.0000000000000000e+00 3652 583 1.0000000000000000e+00 3652 582 -1.0000000000000000e+00 3653 585 1.0000000000000000e+00 3653 583 -1.0000000000000000e+00 3654 585 1.0000000000000000e+00 3654 584 -1.0000000000000000e+00 3655 588 1.0000000000000000e+00 3655 587 -1.0000000000000000e+00 3656 589 1.0000000000000000e+00 3656 587 -1.0000000000000000e+00 3657 588 -1.0000000000000000e+00 3657 152 1.0000000000000000e+00 3658 588 1.0000000000000000e+00 3658 608 -1.0000000000000000e+00 3659 590 1.0000000000000000e+00 3659 588 -1.0000000000000000e+00 3660 588 1.0000000000000000e+00 3660 591 -1.0000000000000000e+00 3661 590 1.0000000000000000e+00 3661 152 -1.0000000000000000e+00 3662 602 1.0000000000000000e+00 3662 135 -1.0000000000000000e+00 3663 592 1.0000000000000000e+00 3663 135 -1.0000000000000000e+00 3664 593 1.0000000000000000e+00 3664 592 -1.0000000000000000e+00 3665 594 1.0000000000000000e+00 3665 592 -1.0000000000000000e+00 3666 600 1.0000000000000000e+00 3666 592 -1.0000000000000000e+00 3667 601 1.0000000000000000e+00 3667 592 -1.0000000000000000e+00 3668 602 1.0000000000000000e+00 3668 592 -1.0000000000000000e+00 3669 594 1.0000000000000000e+00 3669 593 -1.0000000000000000e+00 3670 595 1.0000000000000000e+00 3670 593 -1.0000000000000000e+00 3671 596 1.0000000000000000e+00 3671 594 -1.0000000000000000e+00 3672 599 1.0000000000000000e+00 3672 594 -1.0000000000000000e+00 3673 598 1.0000000000000000e+00 3673 594 -1.0000000000000000e+00 3674 600 1.0000000000000000e+00 3674 594 -1.0000000000000000e+00 3675 603 1.0000000000000000e+00 3675 594 -1.0000000000000000e+00 3676 606 1.0000000000000000e+00 3676 594 -1.0000000000000000e+00 3677 597 1.0000000000000000e+00 3677 594 -1.0000000000000000e+00 3678 595 1.0000000000000000e+00 3678 594 -1.0000000000000000e+00 3679 604 1.0000000000000000e+00 3679 594 -1.0000000000000000e+00 3680 607 1.0000000000000000e+00 3680 594 -1.0000000000000000e+00 3681 596 1.0000000000000000e+00 3681 595 -1.0000000000000000e+00 3682 598 1.0000000000000000e+00 3682 596 -1.0000000000000000e+00 3683 597 1.0000000000000000e+00 3683 596 -1.0000000000000000e+00 3684 606 1.0000000000000000e+00 3684 597 -1.0000000000000000e+00 3685 598 1.0000000000000000e+00 3685 599 -1.0000000000000000e+00 3686 599 -1.0000000000000000e+00 3686 604 1.0000000000000000e+00 3687 607 1.0000000000000000e+00 3687 599 -1.0000000000000000e+00 3688 601 1.0000000000000000e+00 3688 600 -1.0000000000000000e+00 3689 603 1.0000000000000000e+00 3689 600 -1.0000000000000000e+00 3690 604 1.0000000000000000e+00 3690 600 -1.0000000000000000e+00 3691 605 1.0000000000000000e+00 3691 601 -1.0000000000000000e+00 3692 601 -1.0000000000000000e+00 3692 602 1.0000000000000000e+00 3693 601 -1.0000000000000000e+00 3693 604 1.0000000000000000e+00 3694 603 1.0000000000000000e+00 3694 601 -1.0000000000000000e+00 3695 605 1.0000000000000000e+00 3695 603 -1.0000000000000000e+00 3696 606 1.0000000000000000e+00 3696 603 -1.0000000000000000e+00 3697 607 1.0000000000000000e+00 3697 606 -1.0000000000000000e+00 3698 608 1.0000000000000000e+00 3698 152 -1.0000000000000000e+00 3699 152 -1.0000000000000000e+00 3699 82 1.0000000000000000e+00 3700 610 1.0000000000000000e+00 3700 152 -1.0000000000000000e+00 3701 608 1.0000000000000000e+00 3701 609 -1.0000000000000000e+00 3702 608 -1.0000000000000000e+00 3702 82 1.0000000000000000e+00 3703 608 -1.0000000000000000e+00 3703 610 1.0000000000000000e+00 3704 609 -1.0000000000000000e+00 3704 82 1.0000000000000000e+00 3705 614 1.0000000000000000e+00 3705 611 -1.0000000000000000e+00 3706 613 1.0000000000000000e+00 3706 611 -1.0000000000000000e+00 3707 612 1.0000000000000000e+00 3707 611 -1.0000000000000000e+00 3708 613 1.0000000000000000e+00 3708 612 -1.0000000000000000e+00 3709 614 1.0000000000000000e+00 3709 613 -1.0000000000000000e+00 hypre-2.33.0/src/test/TEST_ams/mfem.G.00003000066400000000000000000002557711477326011500176370ustar00rootroot000000000000003710 5080 615 857 3710 657 1.0000000000000000e+00 3710 615 -1.0000000000000000e+00 3711 661 1.0000000000000000e+00 3711 615 -1.0000000000000000e+00 3712 662 1.0000000000000000e+00 3712 615 -1.0000000000000000e+00 3713 737 1.0000000000000000e+00 3713 615 -1.0000000000000000e+00 3714 738 1.0000000000000000e+00 3714 615 -1.0000000000000000e+00 3715 754 1.0000000000000000e+00 3715 615 -1.0000000000000000e+00 3716 755 1.0000000000000000e+00 3716 615 -1.0000000000000000e+00 3717 770 1.0000000000000000e+00 3717 615 -1.0000000000000000e+00 3718 772 1.0000000000000000e+00 3718 615 -1.0000000000000000e+00 3719 773 1.0000000000000000e+00 3719 615 -1.0000000000000000e+00 3720 776 1.0000000000000000e+00 3720 615 -1.0000000000000000e+00 3721 657 1.0000000000000000e+00 3721 616 -1.0000000000000000e+00 3722 658 1.0000000000000000e+00 3722 616 -1.0000000000000000e+00 3723 660 1.0000000000000000e+00 3723 616 -1.0000000000000000e+00 3724 663 1.0000000000000000e+00 3724 616 -1.0000000000000000e+00 3725 664 1.0000000000000000e+00 3725 616 -1.0000000000000000e+00 3726 666 1.0000000000000000e+00 3726 616 -1.0000000000000000e+00 3727 669 1.0000000000000000e+00 3727 616 -1.0000000000000000e+00 3728 670 1.0000000000000000e+00 3728 616 -1.0000000000000000e+00 3729 674 1.0000000000000000e+00 3729 616 -1.0000000000000000e+00 3730 675 1.0000000000000000e+00 3730 616 -1.0000000000000000e+00 3731 677 1.0000000000000000e+00 3731 616 -1.0000000000000000e+00 3732 715 1.0000000000000000e+00 3732 616 -1.0000000000000000e+00 3733 717 1.0000000000000000e+00 3733 616 -1.0000000000000000e+00 3734 720 1.0000000000000000e+00 3734 616 -1.0000000000000000e+00 3735 721 1.0000000000000000e+00 3735 616 -1.0000000000000000e+00 3736 730 1.0000000000000000e+00 3736 616 -1.0000000000000000e+00 3737 732 1.0000000000000000e+00 3737 616 -1.0000000000000000e+00 3738 735 1.0000000000000000e+00 3738 616 -1.0000000000000000e+00 3739 744 1.0000000000000000e+00 3739 616 -1.0000000000000000e+00 3740 746 1.0000000000000000e+00 3740 616 -1.0000000000000000e+00 3741 752 1.0000000000000000e+00 3741 616 -1.0000000000000000e+00 3742 762 1.0000000000000000e+00 3742 616 -1.0000000000000000e+00 3743 764 1.0000000000000000e+00 3743 616 -1.0000000000000000e+00 3744 833 1.0000000000000000e+00 3744 616 -1.0000000000000000e+00 3745 835 1.0000000000000000e+00 3745 616 -1.0000000000000000e+00 3746 842 1.0000000000000000e+00 3746 616 -1.0000000000000000e+00 3747 657 1.0000000000000000e+00 3747 617 -1.0000000000000000e+00 3748 658 1.0000000000000000e+00 3748 617 -1.0000000000000000e+00 3749 659 1.0000000000000000e+00 3749 617 -1.0000000000000000e+00 3750 660 1.0000000000000000e+00 3750 617 -1.0000000000000000e+00 3751 661 1.0000000000000000e+00 3751 617 -1.0000000000000000e+00 3752 669 1.0000000000000000e+00 3752 617 -1.0000000000000000e+00 3753 670 1.0000000000000000e+00 3753 617 -1.0000000000000000e+00 3754 671 1.0000000000000000e+00 3754 617 -1.0000000000000000e+00 3755 672 1.0000000000000000e+00 3755 617 -1.0000000000000000e+00 3756 730 1.0000000000000000e+00 3756 617 -1.0000000000000000e+00 3757 715 1.0000000000000000e+00 3757 617 -1.0000000000000000e+00 3758 741 1.0000000000000000e+00 3758 617 -1.0000000000000000e+00 3759 742 1.0000000000000000e+00 3759 617 -1.0000000000000000e+00 3760 744 1.0000000000000000e+00 3760 617 -1.0000000000000000e+00 3761 752 1.0000000000000000e+00 3761 617 -1.0000000000000000e+00 3762 757 1.0000000000000000e+00 3762 617 -1.0000000000000000e+00 3763 758 1.0000000000000000e+00 3763 617 -1.0000000000000000e+00 3764 657 1.0000000000000000e+00 3764 618 -1.0000000000000000e+00 3765 658 1.0000000000000000e+00 3765 618 -1.0000000000000000e+00 3766 731 1.0000000000000000e+00 3766 618 -1.0000000000000000e+00 3767 730 1.0000000000000000e+00 3767 618 -1.0000000000000000e+00 3768 659 1.0000000000000000e+00 3768 618 -1.0000000000000000e+00 3769 661 1.0000000000000000e+00 3769 618 -1.0000000000000000e+00 3770 662 1.0000000000000000e+00 3770 618 -1.0000000000000000e+00 3771 733 1.0000000000000000e+00 3771 618 -1.0000000000000000e+00 3772 734 1.0000000000000000e+00 3772 618 -1.0000000000000000e+00 3773 737 1.0000000000000000e+00 3773 618 -1.0000000000000000e+00 3774 742 1.0000000000000000e+00 3774 618 -1.0000000000000000e+00 3775 663 1.0000000000000000e+00 3775 14 -1.0000000000000000e+00 3776 667 1.0000000000000000e+00 3776 14 -1.0000000000000000e+00 3777 668 1.0000000000000000e+00 3777 14 -1.0000000000000000e+00 3778 749 1.0000000000000000e+00 3778 14 -1.0000000000000000e+00 3779 763 1.0000000000000000e+00 3779 14 -1.0000000000000000e+00 3780 760 1.0000000000000000e+00 3780 14 -1.0000000000000000e+00 3781 811 1.0000000000000000e+00 3781 14 -1.0000000000000000e+00 3782 812 1.0000000000000000e+00 3782 14 -1.0000000000000000e+00 3783 812 1.0000000000000000e+00 3783 619 -1.0000000000000000e+00 3784 667 1.0000000000000000e+00 3784 619 -1.0000000000000000e+00 3785 665 1.0000000000000000e+00 3785 619 -1.0000000000000000e+00 3786 663 1.0000000000000000e+00 3786 619 -1.0000000000000000e+00 3787 664 1.0000000000000000e+00 3787 619 -1.0000000000000000e+00 3788 666 1.0000000000000000e+00 3788 619 -1.0000000000000000e+00 3789 744 1.0000000000000000e+00 3789 619 -1.0000000000000000e+00 3790 750 1.0000000000000000e+00 3790 619 -1.0000000000000000e+00 3791 761 1.0000000000000000e+00 3791 619 -1.0000000000000000e+00 3792 762 1.0000000000000000e+00 3792 619 -1.0000000000000000e+00 3793 663 1.0000000000000000e+00 3793 620 -1.0000000000000000e+00 3794 664 1.0000000000000000e+00 3794 620 -1.0000000000000000e+00 3795 745 1.0000000000000000e+00 3795 620 -1.0000000000000000e+00 3796 744 1.0000000000000000e+00 3796 620 -1.0000000000000000e+00 3797 665 1.0000000000000000e+00 3797 620 -1.0000000000000000e+00 3798 766 1.0000000000000000e+00 3798 620 -1.0000000000000000e+00 3799 765 1.0000000000000000e+00 3799 620 -1.0000000000000000e+00 3800 620 -1.0000000000000000e+00 3800 570 1.0000000000000000e+00 3801 779 1.0000000000000000e+00 3801 620 -1.0000000000000000e+00 3802 796 1.0000000000000000e+00 3802 620 -1.0000000000000000e+00 3803 807 1.0000000000000000e+00 3803 620 -1.0000000000000000e+00 3804 620 -1.0000000000000000e+00 3804 152 1.0000000000000000e+00 3805 808 1.0000000000000000e+00 3805 620 -1.0000000000000000e+00 3806 667 1.0000000000000000e+00 3806 620 -1.0000000000000000e+00 3807 668 1.0000000000000000e+00 3807 620 -1.0000000000000000e+00 3808 747 1.0000000000000000e+00 3808 620 -1.0000000000000000e+00 3809 748 1.0000000000000000e+00 3809 620 -1.0000000000000000e+00 3810 749 1.0000000000000000e+00 3810 620 -1.0000000000000000e+00 3811 750 1.0000000000000000e+00 3811 620 -1.0000000000000000e+00 3812 768 1.0000000000000000e+00 3812 620 -1.0000000000000000e+00 3813 620 -1.0000000000000000e+00 3813 590 1.0000000000000000e+00 3814 810 1.0000000000000000e+00 3814 620 -1.0000000000000000e+00 3815 811 1.0000000000000000e+00 3815 620 -1.0000000000000000e+00 3816 812 1.0000000000000000e+00 3816 620 -1.0000000000000000e+00 3817 669 1.0000000000000000e+00 3817 621 -1.0000000000000000e+00 3818 672 1.0000000000000000e+00 3818 621 -1.0000000000000000e+00 3819 673 1.0000000000000000e+00 3819 621 -1.0000000000000000e+00 3820 718 1.0000000000000000e+00 3820 621 -1.0000000000000000e+00 3821 719 1.0000000000000000e+00 3821 621 -1.0000000000000000e+00 3822 846 1.0000000000000000e+00 3822 621 -1.0000000000000000e+00 3823 744 1.0000000000000000e+00 3823 622 -1.0000000000000000e+00 3824 670 1.0000000000000000e+00 3824 622 -1.0000000000000000e+00 3825 671 1.0000000000000000e+00 3825 622 -1.0000000000000000e+00 3826 669 1.0000000000000000e+00 3826 622 -1.0000000000000000e+00 3827 672 1.0000000000000000e+00 3827 622 -1.0000000000000000e+00 3828 673 1.0000000000000000e+00 3828 622 -1.0000000000000000e+00 3829 758 1.0000000000000000e+00 3829 622 -1.0000000000000000e+00 3830 759 1.0000000000000000e+00 3830 622 -1.0000000000000000e+00 3831 674 1.0000000000000000e+00 3831 397 -1.0000000000000000e+00 3832 678 1.0000000000000000e+00 3832 397 -1.0000000000000000e+00 3833 681 1.0000000000000000e+00 3833 397 -1.0000000000000000e+00 3834 740 1.0000000000000000e+00 3834 397 -1.0000000000000000e+00 3835 786 1.0000000000000000e+00 3835 397 -1.0000000000000000e+00 3836 739 1.0000000000000000e+00 3836 397 -1.0000000000000000e+00 3837 674 1.0000000000000000e+00 3837 623 -1.0000000000000000e+00 3838 675 1.0000000000000000e+00 3838 623 -1.0000000000000000e+00 3839 676 1.0000000000000000e+00 3839 623 -1.0000000000000000e+00 3840 677 1.0000000000000000e+00 3840 623 -1.0000000000000000e+00 3841 678 1.0000000000000000e+00 3841 623 -1.0000000000000000e+00 3842 688 1.0000000000000000e+00 3842 623 -1.0000000000000000e+00 3843 689 1.0000000000000000e+00 3843 623 -1.0000000000000000e+00 3844 690 1.0000000000000000e+00 3844 623 -1.0000000000000000e+00 3845 691 1.0000000000000000e+00 3845 623 -1.0000000000000000e+00 3846 692 1.0000000000000000e+00 3846 623 -1.0000000000000000e+00 3847 663 1.0000000000000000e+00 3847 623 -1.0000000000000000e+00 3848 762 1.0000000000000000e+00 3848 623 -1.0000000000000000e+00 3849 763 1.0000000000000000e+00 3849 623 -1.0000000000000000e+00 3850 764 1.0000000000000000e+00 3850 623 -1.0000000000000000e+00 3851 623 -1.0000000000000000e+00 3851 135 1.0000000000000000e+00 3852 623 -1.0000000000000000e+00 3852 602 1.0000000000000000e+00 3853 623 -1.0000000000000000e+00 3853 601 1.0000000000000000e+00 3854 695 1.0000000000000000e+00 3854 623 -1.0000000000000000e+00 3855 785 1.0000000000000000e+00 3855 623 -1.0000000000000000e+00 3856 694 1.0000000000000000e+00 3856 623 -1.0000000000000000e+00 3857 699 1.0000000000000000e+00 3857 623 -1.0000000000000000e+00 3858 787 1.0000000000000000e+00 3858 623 -1.0000000000000000e+00 3859 788 1.0000000000000000e+00 3859 623 -1.0000000000000000e+00 3860 721 1.0000000000000000e+00 3860 623 -1.0000000000000000e+00 3861 720 1.0000000000000000e+00 3861 623 -1.0000000000000000e+00 3862 833 1.0000000000000000e+00 3862 623 -1.0000000000000000e+00 3863 674 1.0000000000000000e+00 3863 389 -1.0000000000000000e+00 3864 675 1.0000000000000000e+00 3864 389 -1.0000000000000000e+00 3865 679 1.0000000000000000e+00 3865 389 -1.0000000000000000e+00 3866 663 1.0000000000000000e+00 3866 389 -1.0000000000000000e+00 3867 676 1.0000000000000000e+00 3867 389 -1.0000000000000000e+00 3868 678 1.0000000000000000e+00 3868 389 -1.0000000000000000e+00 3869 681 1.0000000000000000e+00 3869 389 -1.0000000000000000e+00 3870 749 1.0000000000000000e+00 3870 389 -1.0000000000000000e+00 3871 763 1.0000000000000000e+00 3871 389 -1.0000000000000000e+00 3872 680 1.0000000000000000e+00 3872 390 -1.0000000000000000e+00 3873 682 1.0000000000000000e+00 3873 390 -1.0000000000000000e+00 3874 683 1.0000000000000000e+00 3874 390 -1.0000000000000000e+00 3875 685 1.0000000000000000e+00 3875 390 -1.0000000000000000e+00 3876 765 1.0000000000000000e+00 3876 390 -1.0000000000000000e+00 3877 766 1.0000000000000000e+00 3877 390 -1.0000000000000000e+00 3878 767 1.0000000000000000e+00 3878 390 -1.0000000000000000e+00 3879 726 1.0000000000000000e+00 3879 390 -1.0000000000000000e+00 3880 770 1.0000000000000000e+00 3880 390 -1.0000000000000000e+00 3881 774 1.0000000000000000e+00 3881 390 -1.0000000000000000e+00 3882 777 1.0000000000000000e+00 3882 390 -1.0000000000000000e+00 3883 624 -1.0000000000000000e+00 3883 572 1.0000000000000000e+00 3884 624 -1.0000000000000000e+00 3884 571 1.0000000000000000e+00 3885 679 1.0000000000000000e+00 3885 624 -1.0000000000000000e+00 3886 680 1.0000000000000000e+00 3886 624 -1.0000000000000000e+00 3887 681 1.0000000000000000e+00 3887 624 -1.0000000000000000e+00 3888 744 1.0000000000000000e+00 3888 624 -1.0000000000000000e+00 3889 664 1.0000000000000000e+00 3889 624 -1.0000000000000000e+00 3890 745 1.0000000000000000e+00 3890 624 -1.0000000000000000e+00 3891 746 1.0000000000000000e+00 3891 624 -1.0000000000000000e+00 3892 747 1.0000000000000000e+00 3892 624 -1.0000000000000000e+00 3893 663 1.0000000000000000e+00 3893 624 -1.0000000000000000e+00 3894 675 1.0000000000000000e+00 3894 624 -1.0000000000000000e+00 3895 749 1.0000000000000000e+00 3895 624 -1.0000000000000000e+00 3896 674 1.0000000000000000e+00 3896 624 -1.0000000000000000e+00 3897 735 1.0000000000000000e+00 3897 624 -1.0000000000000000e+00 3898 751 1.0000000000000000e+00 3898 624 -1.0000000000000000e+00 3899 657 1.0000000000000000e+00 3899 624 -1.0000000000000000e+00 3900 752 1.0000000000000000e+00 3900 624 -1.0000000000000000e+00 3901 753 1.0000000000000000e+00 3901 624 -1.0000000000000000e+00 3902 754 1.0000000000000000e+00 3902 624 -1.0000000000000000e+00 3903 624 -1.0000000000000000e+00 3903 570 1.0000000000000000e+00 3904 765 1.0000000000000000e+00 3904 624 -1.0000000000000000e+00 3905 766 1.0000000000000000e+00 3905 624 -1.0000000000000000e+00 3906 774 1.0000000000000000e+00 3906 624 -1.0000000000000000e+00 3907 770 1.0000000000000000e+00 3907 624 -1.0000000000000000e+00 3908 777 1.0000000000000000e+00 3908 624 -1.0000000000000000e+00 3909 684 1.0000000000000000e+00 3909 404 -1.0000000000000000e+00 3910 687 1.0000000000000000e+00 3910 404 -1.0000000000000000e+00 3911 682 1.0000000000000000e+00 3911 404 -1.0000000000000000e+00 3912 857 1.0000000000000000e+00 3912 404 -1.0000000000000000e+00 3913 682 1.0000000000000000e+00 3913 402 -1.0000000000000000e+00 3914 726 1.0000000000000000e+00 3914 402 -1.0000000000000000e+00 3915 729 1.0000000000000000e+00 3915 402 -1.0000000000000000e+00 3916 855 1.0000000000000000e+00 3916 402 -1.0000000000000000e+00 3917 856 1.0000000000000000e+00 3917 402 -1.0000000000000000e+00 3918 850 1.0000000000000000e+00 3918 402 -1.0000000000000000e+00 3919 767 1.0000000000000000e+00 3919 402 -1.0000000000000000e+00 3920 682 1.0000000000000000e+00 3920 625 -1.0000000000000000e+00 3921 684 1.0000000000000000e+00 3921 625 -1.0000000000000000e+00 3922 853 1.0000000000000000e+00 3922 625 -1.0000000000000000e+00 3923 850 1.0000000000000000e+00 3923 625 -1.0000000000000000e+00 3924 852 1.0000000000000000e+00 3924 625 -1.0000000000000000e+00 3925 851 1.0000000000000000e+00 3925 625 -1.0000000000000000e+00 3926 625 -1.0000000000000000e+00 3926 581 1.0000000000000000e+00 3927 683 1.0000000000000000e+00 3927 625 -1.0000000000000000e+00 3928 685 1.0000000000000000e+00 3928 625 -1.0000000000000000e+00 3929 686 1.0000000000000000e+00 3929 625 -1.0000000000000000e+00 3930 767 1.0000000000000000e+00 3930 625 -1.0000000000000000e+00 3931 766 1.0000000000000000e+00 3931 625 -1.0000000000000000e+00 3932 769 1.0000000000000000e+00 3932 625 -1.0000000000000000e+00 3933 770 1.0000000000000000e+00 3933 625 -1.0000000000000000e+00 3934 774 1.0000000000000000e+00 3934 625 -1.0000000000000000e+00 3935 775 1.0000000000000000e+00 3935 625 -1.0000000000000000e+00 3936 776 1.0000000000000000e+00 3936 625 -1.0000000000000000e+00 3937 626 -1.0000000000000000e+00 3937 581 1.0000000000000000e+00 3938 685 1.0000000000000000e+00 3938 626 -1.0000000000000000e+00 3939 771 1.0000000000000000e+00 3939 626 -1.0000000000000000e+00 3940 770 1.0000000000000000e+00 3940 626 -1.0000000000000000e+00 3941 686 1.0000000000000000e+00 3941 626 -1.0000000000000000e+00 3942 684 1.0000000000000000e+00 3942 626 -1.0000000000000000e+00 3943 687 1.0000000000000000e+00 3943 626 -1.0000000000000000e+00 3944 772 1.0000000000000000e+00 3944 626 -1.0000000000000000e+00 3945 773 1.0000000000000000e+00 3945 626 -1.0000000000000000e+00 3946 626 -1.0000000000000000e+00 3946 585 1.0000000000000000e+00 3947 776 1.0000000000000000e+00 3947 626 -1.0000000000000000e+00 3948 688 1.0000000000000000e+00 3948 627 -1.0000000000000000e+00 3949 692 1.0000000000000000e+00 3949 627 -1.0000000000000000e+00 3950 693 1.0000000000000000e+00 3950 627 -1.0000000000000000e+00 3951 702 1.0000000000000000e+00 3951 627 -1.0000000000000000e+00 3952 703 1.0000000000000000e+00 3952 627 -1.0000000000000000e+00 3953 764 1.0000000000000000e+00 3953 627 -1.0000000000000000e+00 3954 844 1.0000000000000000e+00 3954 627 -1.0000000000000000e+00 3955 845 1.0000000000000000e+00 3955 627 -1.0000000000000000e+00 3956 688 1.0000000000000000e+00 3956 21 -1.0000000000000000e+00 3957 689 1.0000000000000000e+00 3957 21 -1.0000000000000000e+00 3958 691 1.0000000000000000e+00 3958 21 -1.0000000000000000e+00 3959 694 1.0000000000000000e+00 3959 21 -1.0000000000000000e+00 3960 695 1.0000000000000000e+00 3960 21 -1.0000000000000000e+00 3961 699 1.0000000000000000e+00 3961 21 -1.0000000000000000e+00 3962 701 1.0000000000000000e+00 3962 21 -1.0000000000000000e+00 3963 780 1.0000000000000000e+00 3963 21 -1.0000000000000000e+00 3964 783 1.0000000000000000e+00 3964 21 -1.0000000000000000e+00 3965 789 1.0000000000000000e+00 3965 21 -1.0000000000000000e+00 3966 663 1.0000000000000000e+00 3966 628 -1.0000000000000000e+00 3967 762 1.0000000000000000e+00 3967 628 -1.0000000000000000e+00 3968 761 1.0000000000000000e+00 3968 628 -1.0000000000000000e+00 3969 764 1.0000000000000000e+00 3969 628 -1.0000000000000000e+00 3970 690 1.0000000000000000e+00 3970 628 -1.0000000000000000e+00 3971 628 -1.0000000000000000e+00 3971 135 1.0000000000000000e+00 3972 689 1.0000000000000000e+00 3972 628 -1.0000000000000000e+00 3973 688 1.0000000000000000e+00 3973 628 -1.0000000000000000e+00 3974 692 1.0000000000000000e+00 3974 628 -1.0000000000000000e+00 3975 693 1.0000000000000000e+00 3975 628 -1.0000000000000000e+00 3976 667 1.0000000000000000e+00 3976 628 -1.0000000000000000e+00 3977 760 1.0000000000000000e+00 3977 628 -1.0000000000000000e+00 3978 763 1.0000000000000000e+00 3978 628 -1.0000000000000000e+00 3979 694 1.0000000000000000e+00 3979 629 -1.0000000000000000e+00 3980 697 1.0000000000000000e+00 3980 629 -1.0000000000000000e+00 3981 698 1.0000000000000000e+00 3981 629 -1.0000000000000000e+00 3982 720 1.0000000000000000e+00 3982 629 -1.0000000000000000e+00 3983 723 1.0000000000000000e+00 3983 629 -1.0000000000000000e+00 3984 724 1.0000000000000000e+00 3984 629 -1.0000000000000000e+00 3985 788 1.0000000000000000e+00 3985 629 -1.0000000000000000e+00 3986 795 1.0000000000000000e+00 3986 629 -1.0000000000000000e+00 3987 793 1.0000000000000000e+00 3987 629 -1.0000000000000000e+00 3988 837 1.0000000000000000e+00 3988 629 -1.0000000000000000e+00 3989 838 1.0000000000000000e+00 3989 629 -1.0000000000000000e+00 3990 694 1.0000000000000000e+00 3990 407 -1.0000000000000000e+00 3991 695 1.0000000000000000e+00 3991 407 -1.0000000000000000e+00 3992 696 1.0000000000000000e+00 3992 407 -1.0000000000000000e+00 3993 697 1.0000000000000000e+00 3993 407 -1.0000000000000000e+00 3994 780 1.0000000000000000e+00 3994 407 -1.0000000000000000e+00 3995 789 1.0000000000000000e+00 3995 407 -1.0000000000000000e+00 3996 790 1.0000000000000000e+00 3996 407 -1.0000000000000000e+00 3997 791 1.0000000000000000e+00 3997 407 -1.0000000000000000e+00 3998 694 1.0000000000000000e+00 3998 630 -1.0000000000000000e+00 3999 695 1.0000000000000000e+00 3999 630 -1.0000000000000000e+00 4000 785 1.0000000000000000e+00 4000 630 -1.0000000000000000e+00 4001 630 -1.0000000000000000e+00 4001 601 1.0000000000000000e+00 4002 696 1.0000000000000000e+00 4002 630 -1.0000000000000000e+00 4003 720 1.0000000000000000e+00 4003 630 -1.0000000000000000e+00 4004 833 1.0000000000000000e+00 4004 630 -1.0000000000000000e+00 4005 834 1.0000000000000000e+00 4005 630 -1.0000000000000000e+00 4006 674 1.0000000000000000e+00 4006 630 -1.0000000000000000e+00 4007 697 1.0000000000000000e+00 4007 630 -1.0000000000000000e+00 4008 698 1.0000000000000000e+00 4008 630 -1.0000000000000000e+00 4009 678 1.0000000000000000e+00 4009 630 -1.0000000000000000e+00 4010 786 1.0000000000000000e+00 4010 630 -1.0000000000000000e+00 4011 788 1.0000000000000000e+00 4011 630 -1.0000000000000000e+00 4012 630 -1.0000000000000000e+00 4012 605 1.0000000000000000e+00 4013 739 1.0000000000000000e+00 4013 630 -1.0000000000000000e+00 4014 837 1.0000000000000000e+00 4014 630 -1.0000000000000000e+00 4015 688 1.0000000000000000e+00 4015 631 -1.0000000000000000e+00 4016 699 1.0000000000000000e+00 4016 631 -1.0000000000000000e+00 4017 700 1.0000000000000000e+00 4017 631 -1.0000000000000000e+00 4018 701 1.0000000000000000e+00 4018 631 -1.0000000000000000e+00 4019 702 1.0000000000000000e+00 4019 631 -1.0000000000000000e+00 4020 780 1.0000000000000000e+00 4020 631 -1.0000000000000000e+00 4021 783 1.0000000000000000e+00 4021 631 -1.0000000000000000e+00 4022 784 1.0000000000000000e+00 4022 631 -1.0000000000000000e+00 4023 694 1.0000000000000000e+00 4023 631 -1.0000000000000000e+00 4024 789 1.0000000000000000e+00 4024 631 -1.0000000000000000e+00 4025 794 1.0000000000000000e+00 4025 631 -1.0000000000000000e+00 4026 795 1.0000000000000000e+00 4026 631 -1.0000000000000000e+00 4027 688 1.0000000000000000e+00 4027 632 -1.0000000000000000e+00 4028 699 1.0000000000000000e+00 4028 632 -1.0000000000000000e+00 4029 787 1.0000000000000000e+00 4029 632 -1.0000000000000000e+00 4030 694 1.0000000000000000e+00 4030 632 -1.0000000000000000e+00 4031 700 1.0000000000000000e+00 4031 632 -1.0000000000000000e+00 4032 720 1.0000000000000000e+00 4032 632 -1.0000000000000000e+00 4033 721 1.0000000000000000e+00 4033 632 -1.0000000000000000e+00 4034 764 1.0000000000000000e+00 4034 632 -1.0000000000000000e+00 4035 722 1.0000000000000000e+00 4035 632 -1.0000000000000000e+00 4036 702 1.0000000000000000e+00 4036 632 -1.0000000000000000e+00 4037 703 1.0000000000000000e+00 4037 632 -1.0000000000000000e+00 4038 723 1.0000000000000000e+00 4038 632 -1.0000000000000000e+00 4039 724 1.0000000000000000e+00 4039 632 -1.0000000000000000e+00 4040 788 1.0000000000000000e+00 4040 632 -1.0000000000000000e+00 4041 692 1.0000000000000000e+00 4041 632 -1.0000000000000000e+00 4042 795 1.0000000000000000e+00 4042 632 -1.0000000000000000e+00 4043 844 1.0000000000000000e+00 4043 632 -1.0000000000000000e+00 4044 704 1.0000000000000000e+00 4044 633 -1.0000000000000000e+00 4045 708 1.0000000000000000e+00 4045 633 -1.0000000000000000e+00 4046 709 1.0000000000000000e+00 4046 633 -1.0000000000000000e+00 4047 800 1.0000000000000000e+00 4047 633 -1.0000000000000000e+00 4048 801 1.0000000000000000e+00 4048 633 -1.0000000000000000e+00 4049 816 1.0000000000000000e+00 4049 633 -1.0000000000000000e+00 4050 817 1.0000000000000000e+00 4050 633 -1.0000000000000000e+00 4051 682 1.0000000000000000e+00 4051 633 -1.0000000000000000e+00 4052 852 1.0000000000000000e+00 4052 633 -1.0000000000000000e+00 4053 854 1.0000000000000000e+00 4053 633 -1.0000000000000000e+00 4054 855 1.0000000000000000e+00 4054 633 -1.0000000000000000e+00 4055 850 1.0000000000000000e+00 4055 633 -1.0000000000000000e+00 4056 726 1.0000000000000000e+00 4056 633 -1.0000000000000000e+00 4057 704 1.0000000000000000e+00 4057 19 -1.0000000000000000e+00 4058 705 1.0000000000000000e+00 4058 19 -1.0000000000000000e+00 4059 707 1.0000000000000000e+00 4059 19 -1.0000000000000000e+00 4060 710 1.0000000000000000e+00 4060 19 -1.0000000000000000e+00 4061 711 1.0000000000000000e+00 4061 19 -1.0000000000000000e+00 4062 611 1.0000000000000000e+00 4062 19 -1.0000000000000000e+00 4063 725 1.0000000000000000e+00 4063 19 -1.0000000000000000e+00 4064 796 1.0000000000000000e+00 4064 19 -1.0000000000000000e+00 4065 799 1.0000000000000000e+00 4065 19 -1.0000000000000000e+00 4066 802 1.0000000000000000e+00 4066 19 -1.0000000000000000e+00 4067 807 1.0000000000000000e+00 4067 19 -1.0000000000000000e+00 4068 809 1.0000000000000000e+00 4068 19 -1.0000000000000000e+00 4069 814 1.0000000000000000e+00 4069 19 -1.0000000000000000e+00 4070 818 1.0000000000000000e+00 4070 19 -1.0000000000000000e+00 4071 848 1.0000000000000000e+00 4071 19 -1.0000000000000000e+00 4072 824 1.0000000000000000e+00 4072 19 -1.0000000000000000e+00 4073 831 1.0000000000000000e+00 4073 19 -1.0000000000000000e+00 4074 704 1.0000000000000000e+00 4074 634 -1.0000000000000000e+00 4075 705 1.0000000000000000e+00 4075 634 -1.0000000000000000e+00 4076 706 1.0000000000000000e+00 4076 634 -1.0000000000000000e+00 4077 707 1.0000000000000000e+00 4077 634 -1.0000000000000000e+00 4078 708 1.0000000000000000e+00 4078 634 -1.0000000000000000e+00 4079 710 1.0000000000000000e+00 4079 634 -1.0000000000000000e+00 4080 711 1.0000000000000000e+00 4080 634 -1.0000000000000000e+00 4081 712 1.0000000000000000e+00 4081 634 -1.0000000000000000e+00 4082 713 1.0000000000000000e+00 4082 634 -1.0000000000000000e+00 4083 796 1.0000000000000000e+00 4083 634 -1.0000000000000000e+00 4084 802 1.0000000000000000e+00 4084 634 -1.0000000000000000e+00 4085 803 1.0000000000000000e+00 4085 634 -1.0000000000000000e+00 4086 804 1.0000000000000000e+00 4086 634 -1.0000000000000000e+00 4087 818 1.0000000000000000e+00 4087 634 -1.0000000000000000e+00 4088 814 1.0000000000000000e+00 4088 634 -1.0000000000000000e+00 4089 821 1.0000000000000000e+00 4089 634 -1.0000000000000000e+00 4090 822 1.0000000000000000e+00 4090 634 -1.0000000000000000e+00 4091 704 1.0000000000000000e+00 4091 635 -1.0000000000000000e+00 4092 705 1.0000000000000000e+00 4092 635 -1.0000000000000000e+00 4093 797 1.0000000000000000e+00 4093 635 -1.0000000000000000e+00 4094 796 1.0000000000000000e+00 4094 635 -1.0000000000000000e+00 4095 706 1.0000000000000000e+00 4095 635 -1.0000000000000000e+00 4096 767 1.0000000000000000e+00 4096 635 -1.0000000000000000e+00 4097 850 1.0000000000000000e+00 4097 635 -1.0000000000000000e+00 4098 708 1.0000000000000000e+00 4098 635 -1.0000000000000000e+00 4099 709 1.0000000000000000e+00 4099 635 -1.0000000000000000e+00 4100 768 1.0000000000000000e+00 4100 635 -1.0000000000000000e+00 4101 798 1.0000000000000000e+00 4101 635 -1.0000000000000000e+00 4102 800 1.0000000000000000e+00 4102 635 -1.0000000000000000e+00 4103 804 1.0000000000000000e+00 4103 635 -1.0000000000000000e+00 4104 851 1.0000000000000000e+00 4104 635 -1.0000000000000000e+00 4105 769 1.0000000000000000e+00 4105 635 -1.0000000000000000e+00 4106 852 1.0000000000000000e+00 4106 635 -1.0000000000000000e+00 4107 710 1.0000000000000000e+00 4107 636 -1.0000000000000000e+00 4108 713 1.0000000000000000e+00 4108 636 -1.0000000000000000e+00 4109 714 1.0000000000000000e+00 4109 636 -1.0000000000000000e+00 4110 806 1.0000000000000000e+00 4110 636 -1.0000000000000000e+00 4111 849 1.0000000000000000e+00 4111 636 -1.0000000000000000e+00 4112 818 1.0000000000000000e+00 4112 637 -1.0000000000000000e+00 4113 711 1.0000000000000000e+00 4113 637 -1.0000000000000000e+00 4114 712 1.0000000000000000e+00 4114 637 -1.0000000000000000e+00 4115 710 1.0000000000000000e+00 4115 637 -1.0000000000000000e+00 4116 847 1.0000000000000000e+00 4116 637 -1.0000000000000000e+00 4117 713 1.0000000000000000e+00 4117 637 -1.0000000000000000e+00 4118 714 1.0000000000000000e+00 4118 637 -1.0000000000000000e+00 4119 822 1.0000000000000000e+00 4119 637 -1.0000000000000000e+00 4120 823 1.0000000000000000e+00 4120 637 -1.0000000000000000e+00 4121 832 1.0000000000000000e+00 4121 637 -1.0000000000000000e+00 4122 849 1.0000000000000000e+00 4122 637 -1.0000000000000000e+00 4123 669 1.0000000000000000e+00 4123 638 -1.0000000000000000e+00 4124 715 1.0000000000000000e+00 4124 638 -1.0000000000000000e+00 4125 716 1.0000000000000000e+00 4125 638 -1.0000000000000000e+00 4126 717 1.0000000000000000e+00 4126 638 -1.0000000000000000e+00 4127 718 1.0000000000000000e+00 4127 638 -1.0000000000000000e+00 4128 720 1.0000000000000000e+00 4128 638 -1.0000000000000000e+00 4129 721 1.0000000000000000e+00 4129 638 -1.0000000000000000e+00 4130 722 1.0000000000000000e+00 4130 638 -1.0000000000000000e+00 4131 723 1.0000000000000000e+00 4131 638 -1.0000000000000000e+00 4132 730 1.0000000000000000e+00 4132 638 -1.0000000000000000e+00 4133 835 1.0000000000000000e+00 4133 638 -1.0000000000000000e+00 4134 840 1.0000000000000000e+00 4134 638 -1.0000000000000000e+00 4135 841 1.0000000000000000e+00 4135 638 -1.0000000000000000e+00 4136 764 1.0000000000000000e+00 4136 638 -1.0000000000000000e+00 4137 842 1.0000000000000000e+00 4137 638 -1.0000000000000000e+00 4138 843 1.0000000000000000e+00 4138 638 -1.0000000000000000e+00 4139 844 1.0000000000000000e+00 4139 638 -1.0000000000000000e+00 4140 669 1.0000000000000000e+00 4140 639 -1.0000000000000000e+00 4141 715 1.0000000000000000e+00 4141 639 -1.0000000000000000e+00 4142 741 1.0000000000000000e+00 4142 639 -1.0000000000000000e+00 4143 730 1.0000000000000000e+00 4143 639 -1.0000000000000000e+00 4144 716 1.0000000000000000e+00 4144 639 -1.0000000000000000e+00 4145 718 1.0000000000000000e+00 4145 639 -1.0000000000000000e+00 4146 719 1.0000000000000000e+00 4146 639 -1.0000000000000000e+00 4147 742 1.0000000000000000e+00 4147 639 -1.0000000000000000e+00 4148 743 1.0000000000000000e+00 4148 639 -1.0000000000000000e+00 4149 672 1.0000000000000000e+00 4149 639 -1.0000000000000000e+00 4150 841 1.0000000000000000e+00 4150 639 -1.0000000000000000e+00 4151 728 1.0000000000000000e+00 4151 366 -1.0000000000000000e+00 4152 726 1.0000000000000000e+00 4152 366 -1.0000000000000000e+00 4153 825 1.0000000000000000e+00 4153 7 -1.0000000000000000e+00 4154 831 1.0000000000000000e+00 4154 7 -1.0000000000000000e+00 4155 824 1.0000000000000000e+00 4155 7 -1.0000000000000000e+00 4156 825 1.0000000000000000e+00 4156 408 -1.0000000000000000e+00 4157 826 1.0000000000000000e+00 4157 408 -1.0000000000000000e+00 4158 609 1.0000000000000000e+00 4158 408 -1.0000000000000000e+00 4159 725 1.0000000000000000e+00 4159 408 -1.0000000000000000e+00 4160 799 1.0000000000000000e+00 4160 408 -1.0000000000000000e+00 4161 813 1.0000000000000000e+00 4161 408 -1.0000000000000000e+00 4162 704 1.0000000000000000e+00 4162 408 -1.0000000000000000e+00 4163 814 1.0000000000000000e+00 4163 408 -1.0000000000000000e+00 4164 815 1.0000000000000000e+00 4164 408 -1.0000000000000000e+00 4165 816 1.0000000000000000e+00 4165 408 -1.0000000000000000e+00 4166 818 1.0000000000000000e+00 4166 408 -1.0000000000000000e+00 4167 819 1.0000000000000000e+00 4167 408 -1.0000000000000000e+00 4168 824 1.0000000000000000e+00 4168 408 -1.0000000000000000e+00 4169 767 1.0000000000000000e+00 4169 405 -1.0000000000000000e+00 4170 726 1.0000000000000000e+00 4170 405 -1.0000000000000000e+00 4171 800 1.0000000000000000e+00 4171 405 -1.0000000000000000e+00 4172 727 1.0000000000000000e+00 4172 405 -1.0000000000000000e+00 4173 766 1.0000000000000000e+00 4173 405 -1.0000000000000000e+00 4174 768 1.0000000000000000e+00 4174 405 -1.0000000000000000e+00 4175 765 1.0000000000000000e+00 4175 405 -1.0000000000000000e+00 4176 779 1.0000000000000000e+00 4176 405 -1.0000000000000000e+00 4177 796 1.0000000000000000e+00 4177 405 -1.0000000000000000e+00 4178 705 1.0000000000000000e+00 4178 405 -1.0000000000000000e+00 4179 797 1.0000000000000000e+00 4179 405 -1.0000000000000000e+00 4180 704 1.0000000000000000e+00 4180 405 -1.0000000000000000e+00 4181 799 1.0000000000000000e+00 4181 405 -1.0000000000000000e+00 4182 609 1.0000000000000000e+00 4182 405 -1.0000000000000000e+00 4183 807 1.0000000000000000e+00 4183 405 -1.0000000000000000e+00 4184 850 1.0000000000000000e+00 4184 405 -1.0000000000000000e+00 4185 640 -1.0000000000000000e+00 4185 609 1.0000000000000000e+00 4186 799 1.0000000000000000e+00 4186 640 -1.0000000000000000e+00 4187 727 1.0000000000000000e+00 4187 640 -1.0000000000000000e+00 4188 704 1.0000000000000000e+00 4188 640 -1.0000000000000000e+00 4189 813 1.0000000000000000e+00 4189 640 -1.0000000000000000e+00 4190 640 -1.0000000000000000e+00 4190 591 1.0000000000000000e+00 4191 726 1.0000000000000000e+00 4191 640 -1.0000000000000000e+00 4192 728 1.0000000000000000e+00 4192 640 -1.0000000000000000e+00 4193 640 -1.0000000000000000e+00 4193 576 1.0000000000000000e+00 4194 729 1.0000000000000000e+00 4194 640 -1.0000000000000000e+00 4195 800 1.0000000000000000e+00 4195 640 -1.0000000000000000e+00 4196 801 1.0000000000000000e+00 4196 640 -1.0000000000000000e+00 4197 640 -1.0000000000000000e+00 4197 614 1.0000000000000000e+00 4198 816 1.0000000000000000e+00 4198 640 -1.0000000000000000e+00 4199 855 1.0000000000000000e+00 4199 640 -1.0000000000000000e+00 4200 730 1.0000000000000000e+00 4200 641 -1.0000000000000000e+00 4201 733 1.0000000000000000e+00 4201 641 -1.0000000000000000e+00 4202 734 1.0000000000000000e+00 4202 641 -1.0000000000000000e+00 4203 742 1.0000000000000000e+00 4203 641 -1.0000000000000000e+00 4204 743 1.0000000000000000e+00 4204 641 -1.0000000000000000e+00 4205 841 1.0000000000000000e+00 4205 641 -1.0000000000000000e+00 4206 839 1.0000000000000000e+00 4206 641 -1.0000000000000000e+00 4207 730 1.0000000000000000e+00 4207 642 -1.0000000000000000e+00 4208 658 1.0000000000000000e+00 4208 642 -1.0000000000000000e+00 4209 731 1.0000000000000000e+00 4209 642 -1.0000000000000000e+00 4210 732 1.0000000000000000e+00 4210 642 -1.0000000000000000e+00 4211 733 1.0000000000000000e+00 4211 642 -1.0000000000000000e+00 4212 657 1.0000000000000000e+00 4212 642 -1.0000000000000000e+00 4213 735 1.0000000000000000e+00 4213 642 -1.0000000000000000e+00 4214 736 1.0000000000000000e+00 4214 642 -1.0000000000000000e+00 4215 737 1.0000000000000000e+00 4215 642 -1.0000000000000000e+00 4216 674 1.0000000000000000e+00 4216 642 -1.0000000000000000e+00 4217 739 1.0000000000000000e+00 4217 642 -1.0000000000000000e+00 4218 833 1.0000000000000000e+00 4218 642 -1.0000000000000000e+00 4219 834 1.0000000000000000e+00 4219 642 -1.0000000000000000e+00 4220 720 1.0000000000000000e+00 4220 642 -1.0000000000000000e+00 4221 835 1.0000000000000000e+00 4221 642 -1.0000000000000000e+00 4222 836 1.0000000000000000e+00 4222 642 -1.0000000000000000e+00 4223 837 1.0000000000000000e+00 4223 642 -1.0000000000000000e+00 4224 674 1.0000000000000000e+00 4224 643 -1.0000000000000000e+00 4225 735 1.0000000000000000e+00 4225 643 -1.0000000000000000e+00 4226 736 1.0000000000000000e+00 4226 643 -1.0000000000000000e+00 4227 657 1.0000000000000000e+00 4227 643 -1.0000000000000000e+00 4228 751 1.0000000000000000e+00 4228 643 -1.0000000000000000e+00 4229 643 -1.0000000000000000e+00 4229 572 1.0000000000000000e+00 4230 777 1.0000000000000000e+00 4230 643 -1.0000000000000000e+00 4231 770 1.0000000000000000e+00 4231 643 -1.0000000000000000e+00 4232 778 1.0000000000000000e+00 4232 643 -1.0000000000000000e+00 4233 737 1.0000000000000000e+00 4233 643 -1.0000000000000000e+00 4234 738 1.0000000000000000e+00 4234 643 -1.0000000000000000e+00 4235 739 1.0000000000000000e+00 4235 643 -1.0000000000000000e+00 4236 740 1.0000000000000000e+00 4236 643 -1.0000000000000000e+00 4237 681 1.0000000000000000e+00 4237 643 -1.0000000000000000e+00 4238 754 1.0000000000000000e+00 4238 643 -1.0000000000000000e+00 4239 643 -1.0000000000000000e+00 4239 586 1.0000000000000000e+00 4240 772 1.0000000000000000e+00 4240 643 -1.0000000000000000e+00 4241 744 1.0000000000000000e+00 4241 644 -1.0000000000000000e+00 4242 747 1.0000000000000000e+00 4242 644 -1.0000000000000000e+00 4243 748 1.0000000000000000e+00 4243 644 -1.0000000000000000e+00 4244 758 1.0000000000000000e+00 4244 644 -1.0000000000000000e+00 4245 756 1.0000000000000000e+00 4245 644 -1.0000000000000000e+00 4246 767 1.0000000000000000e+00 4246 644 -1.0000000000000000e+00 4247 766 1.0000000000000000e+00 4247 644 -1.0000000000000000e+00 4248 769 1.0000000000000000e+00 4248 644 -1.0000000000000000e+00 4249 768 1.0000000000000000e+00 4249 644 -1.0000000000000000e+00 4250 796 1.0000000000000000e+00 4250 644 -1.0000000000000000e+00 4251 798 1.0000000000000000e+00 4251 644 -1.0000000000000000e+00 4252 804 1.0000000000000000e+00 4252 644 -1.0000000000000000e+00 4253 805 1.0000000000000000e+00 4253 644 -1.0000000000000000e+00 4254 810 1.0000000000000000e+00 4254 644 -1.0000000000000000e+00 4255 750 1.0000000000000000e+00 4255 644 -1.0000000000000000e+00 4256 759 1.0000000000000000e+00 4256 644 -1.0000000000000000e+00 4257 744 1.0000000000000000e+00 4257 645 -1.0000000000000000e+00 4258 752 1.0000000000000000e+00 4258 645 -1.0000000000000000e+00 4259 753 1.0000000000000000e+00 4259 645 -1.0000000000000000e+00 4260 657 1.0000000000000000e+00 4260 645 -1.0000000000000000e+00 4261 757 1.0000000000000000e+00 4261 645 -1.0000000000000000e+00 4262 766 1.0000000000000000e+00 4262 645 -1.0000000000000000e+00 4263 774 1.0000000000000000e+00 4263 645 -1.0000000000000000e+00 4264 775 1.0000000000000000e+00 4264 645 -1.0000000000000000e+00 4265 770 1.0000000000000000e+00 4265 645 -1.0000000000000000e+00 4266 754 1.0000000000000000e+00 4266 645 -1.0000000000000000e+00 4267 755 1.0000000000000000e+00 4267 645 -1.0000000000000000e+00 4268 747 1.0000000000000000e+00 4268 645 -1.0000000000000000e+00 4269 756 1.0000000000000000e+00 4269 645 -1.0000000000000000e+00 4270 758 1.0000000000000000e+00 4270 645 -1.0000000000000000e+00 4271 661 1.0000000000000000e+00 4271 645 -1.0000000000000000e+00 4272 776 1.0000000000000000e+00 4272 645 -1.0000000000000000e+00 4273 769 1.0000000000000000e+00 4273 645 -1.0000000000000000e+00 4274 770 1.0000000000000000e+00 4274 391 -1.0000000000000000e+00 4275 685 1.0000000000000000e+00 4275 391 -1.0000000000000000e+00 4276 771 1.0000000000000000e+00 4276 391 -1.0000000000000000e+00 4277 772 1.0000000000000000e+00 4277 391 -1.0000000000000000e+00 4278 777 1.0000000000000000e+00 4278 391 -1.0000000000000000e+00 4279 778 1.0000000000000000e+00 4279 391 -1.0000000000000000e+00 4280 780 1.0000000000000000e+00 4280 646 -1.0000000000000000e+00 4281 781 1.0000000000000000e+00 4281 646 -1.0000000000000000e+00 4282 782 1.0000000000000000e+00 4282 646 -1.0000000000000000e+00 4283 791 1.0000000000000000e+00 4283 646 -1.0000000000000000e+00 4284 792 1.0000000000000000e+00 4284 646 -1.0000000000000000e+00 4285 783 1.0000000000000000e+00 4285 646 -1.0000000000000000e+00 4286 784 1.0000000000000000e+00 4286 646 -1.0000000000000000e+00 4287 780 1.0000000000000000e+00 4287 161 -1.0000000000000000e+00 4288 783 1.0000000000000000e+00 4288 161 -1.0000000000000000e+00 4289 781 1.0000000000000000e+00 4289 161 -1.0000000000000000e+00 4290 780 1.0000000000000000e+00 4290 406 -1.0000000000000000e+00 4291 781 1.0000000000000000e+00 4291 406 -1.0000000000000000e+00 4292 782 1.0000000000000000e+00 4292 406 -1.0000000000000000e+00 4293 791 1.0000000000000000e+00 4293 406 -1.0000000000000000e+00 4294 694 1.0000000000000000e+00 4294 647 -1.0000000000000000e+00 4295 789 1.0000000000000000e+00 4295 647 -1.0000000000000000e+00 4296 790 1.0000000000000000e+00 4296 647 -1.0000000000000000e+00 4297 780 1.0000000000000000e+00 4297 647 -1.0000000000000000e+00 4298 794 1.0000000000000000e+00 4298 647 -1.0000000000000000e+00 4299 791 1.0000000000000000e+00 4299 647 -1.0000000000000000e+00 4300 792 1.0000000000000000e+00 4300 647 -1.0000000000000000e+00 4301 697 1.0000000000000000e+00 4301 647 -1.0000000000000000e+00 4302 793 1.0000000000000000e+00 4302 647 -1.0000000000000000e+00 4303 795 1.0000000000000000e+00 4303 647 -1.0000000000000000e+00 4304 784 1.0000000000000000e+00 4304 647 -1.0000000000000000e+00 4305 710 1.0000000000000000e+00 4305 648 -1.0000000000000000e+00 4306 802 1.0000000000000000e+00 4306 648 -1.0000000000000000e+00 4307 803 1.0000000000000000e+00 4307 648 -1.0000000000000000e+00 4308 796 1.0000000000000000e+00 4308 648 -1.0000000000000000e+00 4309 804 1.0000000000000000e+00 4309 648 -1.0000000000000000e+00 4310 805 1.0000000000000000e+00 4310 648 -1.0000000000000000e+00 4311 713 1.0000000000000000e+00 4311 648 -1.0000000000000000e+00 4312 806 1.0000000000000000e+00 4312 648 -1.0000000000000000e+00 4313 796 1.0000000000000000e+00 4313 649 -1.0000000000000000e+00 4314 807 1.0000000000000000e+00 4314 649 -1.0000000000000000e+00 4315 808 1.0000000000000000e+00 4315 649 -1.0000000000000000e+00 4316 809 1.0000000000000000e+00 4316 649 -1.0000000000000000e+00 4317 810 1.0000000000000000e+00 4317 649 -1.0000000000000000e+00 4318 649 -1.0000000000000000e+00 4318 152 1.0000000000000000e+00 4319 811 1.0000000000000000e+00 4319 649 -1.0000000000000000e+00 4320 812 1.0000000000000000e+00 4320 649 -1.0000000000000000e+00 4321 818 1.0000000000000000e+00 4321 650 -1.0000000000000000e+00 4322 814 1.0000000000000000e+00 4322 650 -1.0000000000000000e+00 4323 815 1.0000000000000000e+00 4323 650 -1.0000000000000000e+00 4324 704 1.0000000000000000e+00 4324 650 -1.0000000000000000e+00 4325 821 1.0000000000000000e+00 4325 650 -1.0000000000000000e+00 4326 816 1.0000000000000000e+00 4326 650 -1.0000000000000000e+00 4327 817 1.0000000000000000e+00 4327 650 -1.0000000000000000e+00 4328 819 1.0000000000000000e+00 4328 650 -1.0000000000000000e+00 4329 820 1.0000000000000000e+00 4329 650 -1.0000000000000000e+00 4330 822 1.0000000000000000e+00 4330 650 -1.0000000000000000e+00 4331 708 1.0000000000000000e+00 4331 650 -1.0000000000000000e+00 4332 818 1.0000000000000000e+00 4332 651 -1.0000000000000000e+00 4333 822 1.0000000000000000e+00 4333 651 -1.0000000000000000e+00 4334 820 1.0000000000000000e+00 4334 651 -1.0000000000000000e+00 4335 824 1.0000000000000000e+00 4335 651 -1.0000000000000000e+00 4336 819 1.0000000000000000e+00 4336 651 -1.0000000000000000e+00 4337 827 1.0000000000000000e+00 4337 651 -1.0000000000000000e+00 4338 832 1.0000000000000000e+00 4338 651 -1.0000000000000000e+00 4339 823 1.0000000000000000e+00 4339 651 -1.0000000000000000e+00 4340 824 1.0000000000000000e+00 4340 652 -1.0000000000000000e+00 4341 825 1.0000000000000000e+00 4341 652 -1.0000000000000000e+00 4342 830 1.0000000000000000e+00 4342 652 -1.0000000000000000e+00 4343 826 1.0000000000000000e+00 4343 652 -1.0000000000000000e+00 4344 819 1.0000000000000000e+00 4344 652 -1.0000000000000000e+00 4345 827 1.0000000000000000e+00 4345 652 -1.0000000000000000e+00 4346 652 -1.0000000000000000e+00 4346 612 1.0000000000000000e+00 4347 828 1.0000000000000000e+00 4347 652 -1.0000000000000000e+00 4348 829 1.0000000000000000e+00 4348 652 -1.0000000000000000e+00 4349 832 1.0000000000000000e+00 4349 652 -1.0000000000000000e+00 4350 825 1.0000000000000000e+00 4350 1 -1.0000000000000000e+00 4351 828 1.0000000000000000e+00 4351 1 -1.0000000000000000e+00 4352 829 1.0000000000000000e+00 4352 1 -1.0000000000000000e+00 4353 831 1.0000000000000000e+00 4353 1 -1.0000000000000000e+00 4354 824 1.0000000000000000e+00 4354 653 -1.0000000000000000e+00 4355 831 1.0000000000000000e+00 4355 653 -1.0000000000000000e+00 4356 848 1.0000000000000000e+00 4356 653 -1.0000000000000000e+00 4357 825 1.0000000000000000e+00 4357 653 -1.0000000000000000e+00 4358 829 1.0000000000000000e+00 4358 653 -1.0000000000000000e+00 4359 830 1.0000000000000000e+00 4359 653 -1.0000000000000000e+00 4360 832 1.0000000000000000e+00 4360 653 -1.0000000000000000e+00 4361 818 1.0000000000000000e+00 4361 653 -1.0000000000000000e+00 4362 711 1.0000000000000000e+00 4362 653 -1.0000000000000000e+00 4363 847 1.0000000000000000e+00 4363 653 -1.0000000000000000e+00 4364 710 1.0000000000000000e+00 4364 653 -1.0000000000000000e+00 4365 849 1.0000000000000000e+00 4365 653 -1.0000000000000000e+00 4366 730 1.0000000000000000e+00 4366 654 -1.0000000000000000e+00 4367 835 1.0000000000000000e+00 4367 654 -1.0000000000000000e+00 4368 836 1.0000000000000000e+00 4368 654 -1.0000000000000000e+00 4369 720 1.0000000000000000e+00 4369 654 -1.0000000000000000e+00 4370 840 1.0000000000000000e+00 4370 654 -1.0000000000000000e+00 4371 837 1.0000000000000000e+00 4371 654 -1.0000000000000000e+00 4372 838 1.0000000000000000e+00 4372 654 -1.0000000000000000e+00 4373 733 1.0000000000000000e+00 4373 654 -1.0000000000000000e+00 4374 839 1.0000000000000000e+00 4374 654 -1.0000000000000000e+00 4375 841 1.0000000000000000e+00 4375 654 -1.0000000000000000e+00 4376 723 1.0000000000000000e+00 4376 654 -1.0000000000000000e+00 4377 669 1.0000000000000000e+00 4377 655 -1.0000000000000000e+00 4378 842 1.0000000000000000e+00 4378 655 -1.0000000000000000e+00 4379 843 1.0000000000000000e+00 4379 655 -1.0000000000000000e+00 4380 764 1.0000000000000000e+00 4380 655 -1.0000000000000000e+00 4381 844 1.0000000000000000e+00 4381 655 -1.0000000000000000e+00 4382 845 1.0000000000000000e+00 4382 655 -1.0000000000000000e+00 4383 718 1.0000000000000000e+00 4383 655 -1.0000000000000000e+00 4384 846 1.0000000000000000e+00 4384 655 -1.0000000000000000e+00 4385 852 1.0000000000000000e+00 4385 656 -1.0000000000000000e+00 4386 682 1.0000000000000000e+00 4386 656 -1.0000000000000000e+00 4387 853 1.0000000000000000e+00 4387 656 -1.0000000000000000e+00 4388 854 1.0000000000000000e+00 4388 656 -1.0000000000000000e+00 4389 855 1.0000000000000000e+00 4389 656 -1.0000000000000000e+00 4390 856 1.0000000000000000e+00 4390 656 -1.0000000000000000e+00 4391 656 -1.0000000000000000e+00 4391 582 1.0000000000000000e+00 4392 857 1.0000000000000000e+00 4392 656 -1.0000000000000000e+00 4393 684 1.0000000000000000e+00 4393 656 -1.0000000000000000e+00 4394 661 1.0000000000000000e+00 4394 657 -1.0000000000000000e+00 4395 662 1.0000000000000000e+00 4395 657 -1.0000000000000000e+00 4396 737 1.0000000000000000e+00 4396 657 -1.0000000000000000e+00 4397 738 1.0000000000000000e+00 4397 657 -1.0000000000000000e+00 4398 658 1.0000000000000000e+00 4398 657 -1.0000000000000000e+00 4399 731 1.0000000000000000e+00 4399 657 -1.0000000000000000e+00 4400 754 1.0000000000000000e+00 4400 657 -1.0000000000000000e+00 4401 755 1.0000000000000000e+00 4401 657 -1.0000000000000000e+00 4402 735 1.0000000000000000e+00 4402 657 -1.0000000000000000e+00 4403 751 1.0000000000000000e+00 4403 657 -1.0000000000000000e+00 4404 752 1.0000000000000000e+00 4404 657 -1.0000000000000000e+00 4405 757 1.0000000000000000e+00 4405 657 -1.0000000000000000e+00 4406 660 1.0000000000000000e+00 4406 657 -1.0000000000000000e+00 4407 659 1.0000000000000000e+00 4407 657 -1.0000000000000000e+00 4408 732 1.0000000000000000e+00 4408 657 -1.0000000000000000e+00 4409 736 1.0000000000000000e+00 4409 657 -1.0000000000000000e+00 4410 746 1.0000000000000000e+00 4410 657 -1.0000000000000000e+00 4411 753 1.0000000000000000e+00 4411 657 -1.0000000000000000e+00 4412 731 1.0000000000000000e+00 4412 658 -1.0000000000000000e+00 4413 730 1.0000000000000000e+00 4413 658 -1.0000000000000000e+00 4414 659 1.0000000000000000e+00 4414 658 -1.0000000000000000e+00 4415 660 1.0000000000000000e+00 4415 658 -1.0000000000000000e+00 4416 732 1.0000000000000000e+00 4416 658 -1.0000000000000000e+00 4417 730 1.0000000000000000e+00 4417 659 -1.0000000000000000e+00 4418 661 1.0000000000000000e+00 4418 659 -1.0000000000000000e+00 4419 742 1.0000000000000000e+00 4419 659 -1.0000000000000000e+00 4420 669 1.0000000000000000e+00 4420 660 -1.0000000000000000e+00 4421 670 1.0000000000000000e+00 4421 660 -1.0000000000000000e+00 4422 730 1.0000000000000000e+00 4422 660 -1.0000000000000000e+00 4423 715 1.0000000000000000e+00 4423 660 -1.0000000000000000e+00 4424 744 1.0000000000000000e+00 4424 660 -1.0000000000000000e+00 4425 752 1.0000000000000000e+00 4425 660 -1.0000000000000000e+00 4426 662 1.0000000000000000e+00 4426 661 -1.0000000000000000e+00 4427 757 1.0000000000000000e+00 4427 661 -1.0000000000000000e+00 4428 755 1.0000000000000000e+00 4428 661 -1.0000000000000000e+00 4429 737 1.0000000000000000e+00 4429 662 -1.0000000000000000e+00 4430 667 1.0000000000000000e+00 4430 663 -1.0000000000000000e+00 4431 668 1.0000000000000000e+00 4431 663 -1.0000000000000000e+00 4432 749 1.0000000000000000e+00 4432 663 -1.0000000000000000e+00 4433 663 -1.0000000000000000e+00 4433 468 1.0000000000000000e+00 4434 664 1.0000000000000000e+00 4434 663 -1.0000000000000000e+00 4435 745 1.0000000000000000e+00 4435 663 -1.0000000000000000e+00 4436 762 1.0000000000000000e+00 4436 663 -1.0000000000000000e+00 4437 761 1.0000000000000000e+00 4437 663 -1.0000000000000000e+00 4438 763 1.0000000000000000e+00 4438 663 -1.0000000000000000e+00 4439 760 1.0000000000000000e+00 4439 663 -1.0000000000000000e+00 4440 675 1.0000000000000000e+00 4440 663 -1.0000000000000000e+00 4441 676 1.0000000000000000e+00 4441 663 -1.0000000000000000e+00 4442 666 1.0000000000000000e+00 4442 663 -1.0000000000000000e+00 4443 665 1.0000000000000000e+00 4443 663 -1.0000000000000000e+00 4444 746 1.0000000000000000e+00 4444 663 -1.0000000000000000e+00 4445 679 1.0000000000000000e+00 4445 663 -1.0000000000000000e+00 4446 677 1.0000000000000000e+00 4446 663 -1.0000000000000000e+00 4447 690 1.0000000000000000e+00 4447 663 -1.0000000000000000e+00 4448 745 1.0000000000000000e+00 4448 664 -1.0000000000000000e+00 4449 744 1.0000000000000000e+00 4449 664 -1.0000000000000000e+00 4450 665 1.0000000000000000e+00 4450 664 -1.0000000000000000e+00 4451 666 1.0000000000000000e+00 4451 664 -1.0000000000000000e+00 4452 746 1.0000000000000000e+00 4452 664 -1.0000000000000000e+00 4453 744 1.0000000000000000e+00 4453 665 -1.0000000000000000e+00 4454 665 1.0000000000000000e+00 4454 812 -1.0000000000000000e+00 4455 667 1.0000000000000000e+00 4455 665 -1.0000000000000000e+00 4456 665 1.0000000000000000e+00 4456 750 -1.0000000000000000e+00 4457 666 1.0000000000000000e+00 4457 744 -1.0000000000000000e+00 4458 762 -1.0000000000000000e+00 4458 666 1.0000000000000000e+00 4459 668 1.0000000000000000e+00 4459 667 -1.0000000000000000e+00 4460 667 1.0000000000000000e+00 4460 812 -1.0000000000000000e+00 4461 761 1.0000000000000000e+00 4461 667 -1.0000000000000000e+00 4462 760 1.0000000000000000e+00 4462 667 -1.0000000000000000e+00 4463 668 -1.0000000000000000e+00 4463 570 1.0000000000000000e+00 4464 749 1.0000000000000000e+00 4464 668 -1.0000000000000000e+00 4465 668 -1.0000000000000000e+00 4465 152 1.0000000000000000e+00 4466 668 -1.0000000000000000e+00 4466 590 1.0000000000000000e+00 4467 811 1.0000000000000000e+00 4467 668 -1.0000000000000000e+00 4468 812 1.0000000000000000e+00 4468 668 -1.0000000000000000e+00 4469 672 1.0000000000000000e+00 4469 669 -1.0000000000000000e+00 4470 673 1.0000000000000000e+00 4470 669 -1.0000000000000000e+00 4471 718 1.0000000000000000e+00 4471 669 -1.0000000000000000e+00 4472 719 1.0000000000000000e+00 4472 669 -1.0000000000000000e+00 4473 715 1.0000000000000000e+00 4473 669 -1.0000000000000000e+00 4474 741 1.0000000000000000e+00 4474 669 -1.0000000000000000e+00 4475 842 1.0000000000000000e+00 4475 669 -1.0000000000000000e+00 4476 843 1.0000000000000000e+00 4476 669 -1.0000000000000000e+00 4477 669 -1.0000000000000000e+00 4477 670 1.0000000000000000e+00 4478 671 1.0000000000000000e+00 4478 669 -1.0000000000000000e+00 4479 717 1.0000000000000000e+00 4479 669 -1.0000000000000000e+00 4480 716 1.0000000000000000e+00 4480 669 -1.0000000000000000e+00 4481 669 -1.0000000000000000e+00 4481 846 1.0000000000000000e+00 4482 670 1.0000000000000000e+00 4482 744 -1.0000000000000000e+00 4483 671 1.0000000000000000e+00 4483 670 -1.0000000000000000e+00 4484 744 1.0000000000000000e+00 4484 671 -1.0000000000000000e+00 4485 672 1.0000000000000000e+00 4485 671 -1.0000000000000000e+00 4486 758 1.0000000000000000e+00 4486 671 -1.0000000000000000e+00 4487 673 1.0000000000000000e+00 4487 672 -1.0000000000000000e+00 4488 741 1.0000000000000000e+00 4488 672 -1.0000000000000000e+00 4489 719 1.0000000000000000e+00 4489 672 -1.0000000000000000e+00 4490 678 1.0000000000000000e+00 4490 674 -1.0000000000000000e+00 4491 674 -1.0000000000000000e+00 4491 558 1.0000000000000000e+00 4492 735 1.0000000000000000e+00 4492 674 -1.0000000000000000e+00 4493 736 1.0000000000000000e+00 4493 674 -1.0000000000000000e+00 4494 675 1.0000000000000000e+00 4494 674 -1.0000000000000000e+00 4495 679 1.0000000000000000e+00 4495 674 -1.0000000000000000e+00 4496 681 1.0000000000000000e+00 4496 674 -1.0000000000000000e+00 4497 740 1.0000000000000000e+00 4497 674 -1.0000000000000000e+00 4498 739 1.0000000000000000e+00 4498 674 -1.0000000000000000e+00 4499 786 1.0000000000000000e+00 4499 674 -1.0000000000000000e+00 4500 833 1.0000000000000000e+00 4500 674 -1.0000000000000000e+00 4501 785 1.0000000000000000e+00 4501 674 -1.0000000000000000e+00 4502 677 1.0000000000000000e+00 4502 674 -1.0000000000000000e+00 4503 676 1.0000000000000000e+00 4503 674 -1.0000000000000000e+00 4504 732 1.0000000000000000e+00 4504 674 -1.0000000000000000e+00 4505 746 1.0000000000000000e+00 4505 674 -1.0000000000000000e+00 4506 751 1.0000000000000000e+00 4506 674 -1.0000000000000000e+00 4507 834 1.0000000000000000e+00 4507 674 -1.0000000000000000e+00 4508 679 1.0000000000000000e+00 4508 675 -1.0000000000000000e+00 4509 676 1.0000000000000000e+00 4509 675 -1.0000000000000000e+00 4510 677 1.0000000000000000e+00 4510 675 -1.0000000000000000e+00 4511 746 1.0000000000000000e+00 4511 675 -1.0000000000000000e+00 4512 676 -1.0000000000000000e+00 4512 601 1.0000000000000000e+00 4513 676 -1.0000000000000000e+00 4513 602 1.0000000000000000e+00 4514 678 1.0000000000000000e+00 4514 676 -1.0000000000000000e+00 4515 763 1.0000000000000000e+00 4515 676 -1.0000000000000000e+00 4516 676 -1.0000000000000000e+00 4516 135 1.0000000000000000e+00 4517 762 1.0000000000000000e+00 4517 677 -1.0000000000000000e+00 4518 764 1.0000000000000000e+00 4518 677 -1.0000000000000000e+00 4519 721 1.0000000000000000e+00 4519 677 -1.0000000000000000e+00 4520 720 1.0000000000000000e+00 4520 677 -1.0000000000000000e+00 4521 833 1.0000000000000000e+00 4521 677 -1.0000000000000000e+00 4522 678 -1.0000000000000000e+00 4522 558 1.0000000000000000e+00 4523 678 -1.0000000000000000e+00 4523 601 1.0000000000000000e+00 4524 786 1.0000000000000000e+00 4524 678 -1.0000000000000000e+00 4525 785 1.0000000000000000e+00 4525 678 -1.0000000000000000e+00 4526 681 1.0000000000000000e+00 4526 558 -1.0000000000000000e+00 4527 681 1.0000000000000000e+00 4527 572 -1.0000000000000000e+00 4528 777 1.0000000000000000e+00 4528 572 -1.0000000000000000e+00 4529 751 1.0000000000000000e+00 4529 572 -1.0000000000000000e+00 4530 740 1.0000000000000000e+00 4530 572 -1.0000000000000000e+00 4531 680 1.0000000000000000e+00 4531 572 -1.0000000000000000e+00 4532 679 1.0000000000000000e+00 4532 572 -1.0000000000000000e+00 4533 778 1.0000000000000000e+00 4533 572 -1.0000000000000000e+00 4534 679 1.0000000000000000e+00 4534 571 -1.0000000000000000e+00 4535 680 1.0000000000000000e+00 4535 571 -1.0000000000000000e+00 4536 679 -1.0000000000000000e+00 4536 570 1.0000000000000000e+00 4537 681 1.0000000000000000e+00 4537 679 -1.0000000000000000e+00 4538 749 1.0000000000000000e+00 4538 679 -1.0000000000000000e+00 4539 680 -1.0000000000000000e+00 4539 570 1.0000000000000000e+00 4540 765 1.0000000000000000e+00 4540 680 -1.0000000000000000e+00 4541 766 1.0000000000000000e+00 4541 680 -1.0000000000000000e+00 4542 774 1.0000000000000000e+00 4542 680 -1.0000000000000000e+00 4543 770 1.0000000000000000e+00 4543 680 -1.0000000000000000e+00 4544 777 1.0000000000000000e+00 4544 680 -1.0000000000000000e+00 4545 740 1.0000000000000000e+00 4545 681 -1.0000000000000000e+00 4546 751 1.0000000000000000e+00 4546 681 -1.0000000000000000e+00 4547 682 1.0000000000000000e+00 4547 581 -1.0000000000000000e+00 4548 684 1.0000000000000000e+00 4548 581 -1.0000000000000000e+00 4549 687 1.0000000000000000e+00 4549 581 -1.0000000000000000e+00 4550 685 1.0000000000000000e+00 4550 581 -1.0000000000000000e+00 4551 771 1.0000000000000000e+00 4551 581 -1.0000000000000000e+00 4552 683 1.0000000000000000e+00 4552 581 -1.0000000000000000e+00 4553 686 1.0000000000000000e+00 4553 581 -1.0000000000000000e+00 4554 682 -1.0000000000000000e+00 4554 582 1.0000000000000000e+00 4555 855 1.0000000000000000e+00 4555 682 -1.0000000000000000e+00 4556 856 1.0000000000000000e+00 4556 682 -1.0000000000000000e+00 4557 684 1.0000000000000000e+00 4557 682 -1.0000000000000000e+00 4558 853 1.0000000000000000e+00 4558 682 -1.0000000000000000e+00 4559 683 1.0000000000000000e+00 4559 682 -1.0000000000000000e+00 4560 682 -1.0000000000000000e+00 4560 575 1.0000000000000000e+00 4561 767 1.0000000000000000e+00 4561 682 -1.0000000000000000e+00 4562 850 1.0000000000000000e+00 4562 682 -1.0000000000000000e+00 4563 852 1.0000000000000000e+00 4563 682 -1.0000000000000000e+00 4564 854 1.0000000000000000e+00 4564 682 -1.0000000000000000e+00 4565 857 1.0000000000000000e+00 4565 682 -1.0000000000000000e+00 4566 726 1.0000000000000000e+00 4566 575 -1.0000000000000000e+00 4567 767 1.0000000000000000e+00 4567 575 -1.0000000000000000e+00 4568 685 1.0000000000000000e+00 4568 683 -1.0000000000000000e+00 4569 767 1.0000000000000000e+00 4569 683 -1.0000000000000000e+00 4570 766 1.0000000000000000e+00 4570 683 -1.0000000000000000e+00 4571 770 1.0000000000000000e+00 4571 683 -1.0000000000000000e+00 4572 774 1.0000000000000000e+00 4572 683 -1.0000000000000000e+00 4573 687 1.0000000000000000e+00 4573 684 -1.0000000000000000e+00 4574 853 1.0000000000000000e+00 4574 684 -1.0000000000000000e+00 4575 686 1.0000000000000000e+00 4575 684 -1.0000000000000000e+00 4576 857 1.0000000000000000e+00 4576 684 -1.0000000000000000e+00 4577 857 1.0000000000000000e+00 4577 582 -1.0000000000000000e+00 4578 856 1.0000000000000000e+00 4578 582 -1.0000000000000000e+00 4579 771 1.0000000000000000e+00 4579 685 -1.0000000000000000e+00 4580 770 1.0000000000000000e+00 4580 685 -1.0000000000000000e+00 4581 686 1.0000000000000000e+00 4581 685 -1.0000000000000000e+00 4582 685 -1.0000000000000000e+00 4582 472 1.0000000000000000e+00 4583 770 1.0000000000000000e+00 4583 686 -1.0000000000000000e+00 4584 776 1.0000000000000000e+00 4584 686 -1.0000000000000000e+00 4585 687 -1.0000000000000000e+00 4585 585 1.0000000000000000e+00 4586 692 1.0000000000000000e+00 4586 688 -1.0000000000000000e+00 4587 688 -1.0000000000000000e+00 4587 693 1.0000000000000000e+00 4588 688 -1.0000000000000000e+00 4588 702 1.0000000000000000e+00 4589 703 1.0000000000000000e+00 4589 688 -1.0000000000000000e+00 4590 699 1.0000000000000000e+00 4590 688 -1.0000000000000000e+00 4591 787 1.0000000000000000e+00 4591 688 -1.0000000000000000e+00 4592 689 1.0000000000000000e+00 4592 688 -1.0000000000000000e+00 4593 691 1.0000000000000000e+00 4593 688 -1.0000000000000000e+00 4594 690 1.0000000000000000e+00 4594 688 -1.0000000000000000e+00 4595 701 1.0000000000000000e+00 4595 688 -1.0000000000000000e+00 4596 700 1.0000000000000000e+00 4596 688 -1.0000000000000000e+00 4597 689 1.0000000000000000e+00 4597 135 -1.0000000000000000e+00 4598 690 1.0000000000000000e+00 4598 689 -1.0000000000000000e+00 4599 691 1.0000000000000000e+00 4599 689 -1.0000000000000000e+00 4600 764 1.0000000000000000e+00 4600 690 -1.0000000000000000e+00 4601 762 1.0000000000000000e+00 4601 690 -1.0000000000000000e+00 4602 690 -1.0000000000000000e+00 4602 135 1.0000000000000000e+00 4603 692 1.0000000000000000e+00 4603 690 -1.0000000000000000e+00 4604 763 1.0000000000000000e+00 4604 690 -1.0000000000000000e+00 4605 691 -1.0000000000000000e+00 4605 135 1.0000000000000000e+00 4606 691 -1.0000000000000000e+00 4606 602 1.0000000000000000e+00 4607 691 -1.0000000000000000e+00 4607 601 1.0000000000000000e+00 4608 695 1.0000000000000000e+00 4608 691 -1.0000000000000000e+00 4609 694 1.0000000000000000e+00 4609 691 -1.0000000000000000e+00 4610 699 1.0000000000000000e+00 4610 691 -1.0000000000000000e+00 4611 693 1.0000000000000000e+00 4611 692 -1.0000000000000000e+00 4612 764 1.0000000000000000e+00 4612 692 -1.0000000000000000e+00 4613 703 1.0000000000000000e+00 4613 692 -1.0000000000000000e+00 4614 787 1.0000000000000000e+00 4614 692 -1.0000000000000000e+00 4615 764 -1.0000000000000000e+00 4615 693 1.0000000000000000e+00 4616 697 1.0000000000000000e+00 4616 694 -1.0000000000000000e+00 4617 698 1.0000000000000000e+00 4617 694 -1.0000000000000000e+00 4618 788 1.0000000000000000e+00 4618 694 -1.0000000000000000e+00 4619 724 1.0000000000000000e+00 4619 694 -1.0000000000000000e+00 4620 695 1.0000000000000000e+00 4620 694 -1.0000000000000000e+00 4621 785 1.0000000000000000e+00 4621 694 -1.0000000000000000e+00 4622 789 1.0000000000000000e+00 4622 694 -1.0000000000000000e+00 4623 790 1.0000000000000000e+00 4623 694 -1.0000000000000000e+00 4624 795 1.0000000000000000e+00 4624 694 -1.0000000000000000e+00 4625 793 1.0000000000000000e+00 4625 694 -1.0000000000000000e+00 4626 699 1.0000000000000000e+00 4626 694 -1.0000000000000000e+00 4627 700 1.0000000000000000e+00 4627 694 -1.0000000000000000e+00 4628 694 -1.0000000000000000e+00 4628 604 1.0000000000000000e+00 4629 696 1.0000000000000000e+00 4629 694 -1.0000000000000000e+00 4630 787 1.0000000000000000e+00 4630 694 -1.0000000000000000e+00 4631 701 1.0000000000000000e+00 4631 694 -1.0000000000000000e+00 4632 794 1.0000000000000000e+00 4632 694 -1.0000000000000000e+00 4633 785 1.0000000000000000e+00 4633 695 -1.0000000000000000e+00 4634 695 -1.0000000000000000e+00 4634 601 1.0000000000000000e+00 4635 696 1.0000000000000000e+00 4635 695 -1.0000000000000000e+00 4636 695 -1.0000000000000000e+00 4636 604 1.0000000000000000e+00 4637 696 -1.0000000000000000e+00 4637 601 1.0000000000000000e+00 4638 697 1.0000000000000000e+00 4638 696 -1.0000000000000000e+00 4639 696 -1.0000000000000000e+00 4639 605 1.0000000000000000e+00 4640 780 1.0000000000000000e+00 4640 604 -1.0000000000000000e+00 4641 789 1.0000000000000000e+00 4641 604 -1.0000000000000000e+00 4642 698 1.0000000000000000e+00 4642 697 -1.0000000000000000e+00 4643 790 1.0000000000000000e+00 4643 697 -1.0000000000000000e+00 4644 793 1.0000000000000000e+00 4644 697 -1.0000000000000000e+00 4645 720 1.0000000000000000e+00 4645 698 -1.0000000000000000e+00 4646 788 1.0000000000000000e+00 4646 698 -1.0000000000000000e+00 4647 837 1.0000000000000000e+00 4647 698 -1.0000000000000000e+00 4648 787 1.0000000000000000e+00 4648 699 -1.0000000000000000e+00 4649 700 1.0000000000000000e+00 4649 699 -1.0000000000000000e+00 4650 701 1.0000000000000000e+00 4650 699 -1.0000000000000000e+00 4651 702 1.0000000000000000e+00 4651 700 -1.0000000000000000e+00 4652 795 1.0000000000000000e+00 4652 700 -1.0000000000000000e+00 4653 780 1.0000000000000000e+00 4653 701 -1.0000000000000000e+00 4654 701 1.0000000000000000e+00 4654 783 -1.0000000000000000e+00 4655 789 1.0000000000000000e+00 4655 701 -1.0000000000000000e+00 4656 703 1.0000000000000000e+00 4656 702 -1.0000000000000000e+00 4657 764 1.0000000000000000e+00 4657 703 -1.0000000000000000e+00 4658 844 1.0000000000000000e+00 4658 703 -1.0000000000000000e+00 4659 708 1.0000000000000000e+00 4659 704 -1.0000000000000000e+00 4660 709 1.0000000000000000e+00 4660 704 -1.0000000000000000e+00 4661 800 1.0000000000000000e+00 4661 704 -1.0000000000000000e+00 4662 801 1.0000000000000000e+00 4662 704 -1.0000000000000000e+00 4663 705 1.0000000000000000e+00 4663 704 -1.0000000000000000e+00 4664 797 1.0000000000000000e+00 4664 704 -1.0000000000000000e+00 4665 816 1.0000000000000000e+00 4665 704 -1.0000000000000000e+00 4666 817 1.0000000000000000e+00 4666 704 -1.0000000000000000e+00 4667 799 1.0000000000000000e+00 4667 704 -1.0000000000000000e+00 4668 813 1.0000000000000000e+00 4668 704 -1.0000000000000000e+00 4669 814 1.0000000000000000e+00 4669 704 -1.0000000000000000e+00 4670 821 1.0000000000000000e+00 4670 704 -1.0000000000000000e+00 4671 707 1.0000000000000000e+00 4671 704 -1.0000000000000000e+00 4672 706 1.0000000000000000e+00 4672 704 -1.0000000000000000e+00 4673 704 -1.0000000000000000e+00 4673 610 1.0000000000000000e+00 4674 727 1.0000000000000000e+00 4674 704 -1.0000000000000000e+00 4675 725 1.0000000000000000e+00 4675 704 -1.0000000000000000e+00 4676 815 1.0000000000000000e+00 4676 704 -1.0000000000000000e+00 4677 797 1.0000000000000000e+00 4677 705 -1.0000000000000000e+00 4678 796 1.0000000000000000e+00 4678 705 -1.0000000000000000e+00 4679 706 1.0000000000000000e+00 4679 705 -1.0000000000000000e+00 4680 707 1.0000000000000000e+00 4680 705 -1.0000000000000000e+00 4681 705 -1.0000000000000000e+00 4681 610 1.0000000000000000e+00 4682 796 1.0000000000000000e+00 4682 706 -1.0000000000000000e+00 4683 708 1.0000000000000000e+00 4683 706 -1.0000000000000000e+00 4684 804 1.0000000000000000e+00 4684 706 -1.0000000000000000e+00 4685 710 1.0000000000000000e+00 4685 707 -1.0000000000000000e+00 4686 711 1.0000000000000000e+00 4686 707 -1.0000000000000000e+00 4687 796 1.0000000000000000e+00 4687 707 -1.0000000000000000e+00 4688 802 1.0000000000000000e+00 4688 707 -1.0000000000000000e+00 4689 818 1.0000000000000000e+00 4689 707 -1.0000000000000000e+00 4690 814 1.0000000000000000e+00 4690 707 -1.0000000000000000e+00 4691 709 1.0000000000000000e+00 4691 708 -1.0000000000000000e+00 4692 821 1.0000000000000000e+00 4692 708 -1.0000000000000000e+00 4693 817 1.0000000000000000e+00 4693 708 -1.0000000000000000e+00 4694 800 1.0000000000000000e+00 4694 709 -1.0000000000000000e+00 4695 850 1.0000000000000000e+00 4695 709 -1.0000000000000000e+00 4696 852 1.0000000000000000e+00 4696 709 -1.0000000000000000e+00 4697 713 1.0000000000000000e+00 4697 710 -1.0000000000000000e+00 4698 714 1.0000000000000000e+00 4698 710 -1.0000000000000000e+00 4699 802 1.0000000000000000e+00 4699 710 -1.0000000000000000e+00 4700 803 1.0000000000000000e+00 4700 710 -1.0000000000000000e+00 4701 711 1.0000000000000000e+00 4701 710 -1.0000000000000000e+00 4702 847 1.0000000000000000e+00 4702 710 -1.0000000000000000e+00 4703 712 1.0000000000000000e+00 4703 710 -1.0000000000000000e+00 4704 806 1.0000000000000000e+00 4704 710 -1.0000000000000000e+00 4705 849 1.0000000000000000e+00 4705 710 -1.0000000000000000e+00 4706 848 1.0000000000000000e+00 4706 710 -1.0000000000000000e+00 4707 818 1.0000000000000000e+00 4707 711 -1.0000000000000000e+00 4708 712 1.0000000000000000e+00 4708 711 -1.0000000000000000e+00 4709 847 1.0000000000000000e+00 4709 711 -1.0000000000000000e+00 4710 848 1.0000000000000000e+00 4710 711 -1.0000000000000000e+00 4711 818 1.0000000000000000e+00 4711 712 -1.0000000000000000e+00 4712 713 1.0000000000000000e+00 4712 712 -1.0000000000000000e+00 4713 822 1.0000000000000000e+00 4713 712 -1.0000000000000000e+00 4714 714 1.0000000000000000e+00 4714 713 -1.0000000000000000e+00 4715 803 1.0000000000000000e+00 4715 713 -1.0000000000000000e+00 4716 806 1.0000000000000000e+00 4716 713 -1.0000000000000000e+00 4717 849 1.0000000000000000e+00 4717 714 -1.0000000000000000e+00 4718 741 1.0000000000000000e+00 4718 715 -1.0000000000000000e+00 4719 730 1.0000000000000000e+00 4719 715 -1.0000000000000000e+00 4720 716 1.0000000000000000e+00 4720 715 -1.0000000000000000e+00 4721 717 1.0000000000000000e+00 4721 715 -1.0000000000000000e+00 4722 730 1.0000000000000000e+00 4722 716 -1.0000000000000000e+00 4723 718 1.0000000000000000e+00 4723 716 -1.0000000000000000e+00 4724 841 1.0000000000000000e+00 4724 716 -1.0000000000000000e+00 4725 720 1.0000000000000000e+00 4725 717 -1.0000000000000000e+00 4726 721 1.0000000000000000e+00 4726 717 -1.0000000000000000e+00 4727 730 1.0000000000000000e+00 4727 717 -1.0000000000000000e+00 4728 835 1.0000000000000000e+00 4728 717 -1.0000000000000000e+00 4729 764 1.0000000000000000e+00 4729 717 -1.0000000000000000e+00 4730 842 1.0000000000000000e+00 4730 717 -1.0000000000000000e+00 4731 719 1.0000000000000000e+00 4731 718 -1.0000000000000000e+00 4732 843 1.0000000000000000e+00 4732 718 -1.0000000000000000e+00 4733 846 1.0000000000000000e+00 4733 718 -1.0000000000000000e+00 4734 723 1.0000000000000000e+00 4734 720 -1.0000000000000000e+00 4735 724 1.0000000000000000e+00 4735 720 -1.0000000000000000e+00 4736 837 1.0000000000000000e+00 4736 720 -1.0000000000000000e+00 4737 838 1.0000000000000000e+00 4737 720 -1.0000000000000000e+00 4738 833 1.0000000000000000e+00 4738 720 -1.0000000000000000e+00 4739 834 1.0000000000000000e+00 4739 720 -1.0000000000000000e+00 4740 835 1.0000000000000000e+00 4740 720 -1.0000000000000000e+00 4741 840 1.0000000000000000e+00 4741 720 -1.0000000000000000e+00 4742 788 1.0000000000000000e+00 4742 720 -1.0000000000000000e+00 4743 721 1.0000000000000000e+00 4743 720 -1.0000000000000000e+00 4744 787 1.0000000000000000e+00 4744 720 -1.0000000000000000e+00 4745 722 1.0000000000000000e+00 4745 720 -1.0000000000000000e+00 4746 732 1.0000000000000000e+00 4746 720 -1.0000000000000000e+00 4747 836 1.0000000000000000e+00 4747 720 -1.0000000000000000e+00 4748 785 1.0000000000000000e+00 4748 720 -1.0000000000000000e+00 4749 787 1.0000000000000000e+00 4749 721 -1.0000000000000000e+00 4750 764 1.0000000000000000e+00 4750 721 -1.0000000000000000e+00 4751 722 1.0000000000000000e+00 4751 721 -1.0000000000000000e+00 4752 764 1.0000000000000000e+00 4752 722 -1.0000000000000000e+00 4753 723 1.0000000000000000e+00 4753 722 -1.0000000000000000e+00 4754 844 1.0000000000000000e+00 4754 722 -1.0000000000000000e+00 4755 724 1.0000000000000000e+00 4755 723 -1.0000000000000000e+00 4756 840 1.0000000000000000e+00 4756 723 -1.0000000000000000e+00 4757 838 1.0000000000000000e+00 4757 723 -1.0000000000000000e+00 4758 788 1.0000000000000000e+00 4758 724 -1.0000000000000000e+00 4759 795 1.0000000000000000e+00 4759 724 -1.0000000000000000e+00 4760 611 1.0000000000000000e+00 4760 609 -1.0000000000000000e+00 4761 799 1.0000000000000000e+00 4761 609 -1.0000000000000000e+00 4762 727 1.0000000000000000e+00 4762 609 -1.0000000000000000e+00 4763 591 1.0000000000000000e+00 4763 609 -1.0000000000000000e+00 4764 614 1.0000000000000000e+00 4764 609 -1.0000000000000000e+00 4765 728 1.0000000000000000e+00 4765 609 -1.0000000000000000e+00 4766 725 1.0000000000000000e+00 4766 609 -1.0000000000000000e+00 4767 610 1.0000000000000000e+00 4767 609 -1.0000000000000000e+00 4768 588 1.0000000000000000e+00 4768 609 -1.0000000000000000e+00 4769 813 1.0000000000000000e+00 4769 609 -1.0000000000000000e+00 4770 725 1.0000000000000000e+00 4770 611 -1.0000000000000000e+00 4771 82 1.0000000000000000e+00 4771 611 -1.0000000000000000e+00 4772 824 1.0000000000000000e+00 4772 611 -1.0000000000000000e+00 4773 825 1.0000000000000000e+00 4773 611 -1.0000000000000000e+00 4774 824 1.0000000000000000e+00 4774 82 -1.0000000000000000e+00 4775 831 -1.0000000000000000e+00 4775 82 1.0000000000000000e+00 4776 799 1.0000000000000000e+00 4776 725 -1.0000000000000000e+00 4777 814 1.0000000000000000e+00 4777 725 -1.0000000000000000e+00 4778 818 1.0000000000000000e+00 4778 725 -1.0000000000000000e+00 4779 824 1.0000000000000000e+00 4779 725 -1.0000000000000000e+00 4780 728 1.0000000000000000e+00 4780 614 -1.0000000000000000e+00 4781 813 1.0000000000000000e+00 4781 614 -1.0000000000000000e+00 4782 726 -1.0000000000000000e+00 4782 576 1.0000000000000000e+00 4783 729 1.0000000000000000e+00 4783 726 -1.0000000000000000e+00 4784 767 1.0000000000000000e+00 4784 726 -1.0000000000000000e+00 4785 726 -1.0000000000000000e+00 4785 589 1.0000000000000000e+00 4786 726 -1.0000000000000000e+00 4786 573 1.0000000000000000e+00 4787 850 1.0000000000000000e+00 4787 726 -1.0000000000000000e+00 4788 855 1.0000000000000000e+00 4788 726 -1.0000000000000000e+00 4789 800 1.0000000000000000e+00 4789 726 -1.0000000000000000e+00 4790 727 1.0000000000000000e+00 4790 726 -1.0000000000000000e+00 4791 726 -1.0000000000000000e+00 4791 591 1.0000000000000000e+00 4792 728 1.0000000000000000e+00 4792 726 -1.0000000000000000e+00 4793 801 1.0000000000000000e+00 4793 726 -1.0000000000000000e+00 4794 728 1.0000000000000000e+00 4794 591 -1.0000000000000000e+00 4795 727 1.0000000000000000e+00 4795 591 -1.0000000000000000e+00 4796 799 1.0000000000000000e+00 4796 727 -1.0000000000000000e+00 4797 800 1.0000000000000000e+00 4797 727 -1.0000000000000000e+00 4798 728 -1.0000000000000000e+00 4798 576 1.0000000000000000e+00 4799 729 1.0000000000000000e+00 4799 576 -1.0000000000000000e+00 4800 855 1.0000000000000000e+00 4800 729 -1.0000000000000000e+00 4801 733 1.0000000000000000e+00 4801 730 -1.0000000000000000e+00 4802 734 1.0000000000000000e+00 4802 730 -1.0000000000000000e+00 4803 742 1.0000000000000000e+00 4803 730 -1.0000000000000000e+00 4804 743 1.0000000000000000e+00 4804 730 -1.0000000000000000e+00 4805 835 1.0000000000000000e+00 4805 730 -1.0000000000000000e+00 4806 836 1.0000000000000000e+00 4806 730 -1.0000000000000000e+00 4807 841 1.0000000000000000e+00 4807 730 -1.0000000000000000e+00 4808 839 1.0000000000000000e+00 4808 730 -1.0000000000000000e+00 4809 732 1.0000000000000000e+00 4809 730 -1.0000000000000000e+00 4810 731 1.0000000000000000e+00 4810 730 -1.0000000000000000e+00 4811 741 1.0000000000000000e+00 4811 730 -1.0000000000000000e+00 4812 840 1.0000000000000000e+00 4812 730 -1.0000000000000000e+00 4813 733 1.0000000000000000e+00 4813 731 -1.0000000000000000e+00 4814 737 1.0000000000000000e+00 4814 731 -1.0000000000000000e+00 4815 735 1.0000000000000000e+00 4815 732 -1.0000000000000000e+00 4816 833 1.0000000000000000e+00 4816 732 -1.0000000000000000e+00 4817 835 1.0000000000000000e+00 4817 732 -1.0000000000000000e+00 4818 734 1.0000000000000000e+00 4818 733 -1.0000000000000000e+00 4819 836 1.0000000000000000e+00 4819 733 -1.0000000000000000e+00 4820 839 1.0000000000000000e+00 4820 733 -1.0000000000000000e+00 4821 742 1.0000000000000000e+00 4821 734 -1.0000000000000000e+00 4822 736 1.0000000000000000e+00 4822 735 -1.0000000000000000e+00 4823 751 1.0000000000000000e+00 4823 735 -1.0000000000000000e+00 4824 746 1.0000000000000000e+00 4824 735 -1.0000000000000000e+00 4825 737 1.0000000000000000e+00 4825 736 -1.0000000000000000e+00 4826 739 1.0000000000000000e+00 4826 736 -1.0000000000000000e+00 4827 738 1.0000000000000000e+00 4827 737 -1.0000000000000000e+00 4828 770 1.0000000000000000e+00 4828 738 -1.0000000000000000e+00 4829 754 1.0000000000000000e+00 4829 738 -1.0000000000000000e+00 4830 772 1.0000000000000000e+00 4830 738 -1.0000000000000000e+00 4831 786 1.0000000000000000e+00 4831 739 -1.0000000000000000e+00 4832 740 1.0000000000000000e+00 4832 739 -1.0000000000000000e+00 4833 834 1.0000000000000000e+00 4833 739 -1.0000000000000000e+00 4834 740 -1.0000000000000000e+00 4834 586 1.0000000000000000e+00 4835 742 1.0000000000000000e+00 4835 741 -1.0000000000000000e+00 4836 743 1.0000000000000000e+00 4836 742 -1.0000000000000000e+00 4837 841 1.0000000000000000e+00 4837 743 -1.0000000000000000e+00 4838 747 1.0000000000000000e+00 4838 744 -1.0000000000000000e+00 4839 748 1.0000000000000000e+00 4839 744 -1.0000000000000000e+00 4840 752 1.0000000000000000e+00 4840 744 -1.0000000000000000e+00 4841 753 1.0000000000000000e+00 4841 744 -1.0000000000000000e+00 4842 758 1.0000000000000000e+00 4842 744 -1.0000000000000000e+00 4843 756 1.0000000000000000e+00 4843 744 -1.0000000000000000e+00 4844 746 1.0000000000000000e+00 4844 744 -1.0000000000000000e+00 4845 745 1.0000000000000000e+00 4845 744 -1.0000000000000000e+00 4846 750 1.0000000000000000e+00 4846 744 -1.0000000000000000e+00 4847 757 1.0000000000000000e+00 4847 744 -1.0000000000000000e+00 4848 759 1.0000000000000000e+00 4848 744 -1.0000000000000000e+00 4849 766 1.0000000000000000e+00 4849 745 -1.0000000000000000e+00 4850 765 1.0000000000000000e+00 4850 745 -1.0000000000000000e+00 4851 747 1.0000000000000000e+00 4851 745 -1.0000000000000000e+00 4852 749 1.0000000000000000e+00 4852 745 -1.0000000000000000e+00 4853 745 -1.0000000000000000e+00 4853 570 1.0000000000000000e+00 4854 752 1.0000000000000000e+00 4854 746 -1.0000000000000000e+00 4855 748 1.0000000000000000e+00 4855 747 -1.0000000000000000e+00 4856 766 1.0000000000000000e+00 4856 747 -1.0000000000000000e+00 4857 756 1.0000000000000000e+00 4857 747 -1.0000000000000000e+00 4858 753 1.0000000000000000e+00 4858 747 -1.0000000000000000e+00 4859 766 1.0000000000000000e+00 4859 748 -1.0000000000000000e+00 4860 768 1.0000000000000000e+00 4860 748 -1.0000000000000000e+00 4861 796 1.0000000000000000e+00 4861 748 -1.0000000000000000e+00 4862 748 1.0000000000000000e+00 4862 810 -1.0000000000000000e+00 4863 748 1.0000000000000000e+00 4863 750 -1.0000000000000000e+00 4864 749 -1.0000000000000000e+00 4864 468 1.0000000000000000e+00 4865 749 -1.0000000000000000e+00 4865 570 1.0000000000000000e+00 4866 763 1.0000000000000000e+00 4866 468 -1.0000000000000000e+00 4867 777 1.0000000000000000e+00 4867 751 -1.0000000000000000e+00 4868 754 1.0000000000000000e+00 4868 751 -1.0000000000000000e+00 4869 770 1.0000000000000000e+00 4869 751 -1.0000000000000000e+00 4870 753 1.0000000000000000e+00 4870 752 -1.0000000000000000e+00 4871 757 1.0000000000000000e+00 4871 752 -1.0000000000000000e+00 4872 770 1.0000000000000000e+00 4872 753 -1.0000000000000000e+00 4873 774 1.0000000000000000e+00 4873 753 -1.0000000000000000e+00 4874 754 1.0000000000000000e+00 4874 753 -1.0000000000000000e+00 4875 766 1.0000000000000000e+00 4875 753 -1.0000000000000000e+00 4876 755 1.0000000000000000e+00 4876 754 -1.0000000000000000e+00 4877 770 1.0000000000000000e+00 4877 754 -1.0000000000000000e+00 4878 770 1.0000000000000000e+00 4878 755 -1.0000000000000000e+00 4879 776 1.0000000000000000e+00 4879 755 -1.0000000000000000e+00 4880 758 1.0000000000000000e+00 4880 756 -1.0000000000000000e+00 4881 766 1.0000000000000000e+00 4881 756 -1.0000000000000000e+00 4882 769 1.0000000000000000e+00 4882 756 -1.0000000000000000e+00 4883 758 1.0000000000000000e+00 4883 757 -1.0000000000000000e+00 4884 759 1.0000000000000000e+00 4884 758 -1.0000000000000000e+00 4885 763 1.0000000000000000e+00 4885 760 -1.0000000000000000e+00 4886 760 1.0000000000000000e+00 4886 135 -1.0000000000000000e+00 4887 761 1.0000000000000000e+00 4887 762 -1.0000000000000000e+00 4888 762 1.0000000000000000e+00 4888 764 -1.0000000000000000e+00 4889 763 -1.0000000000000000e+00 4889 135 1.0000000000000000e+00 4890 844 1.0000000000000000e+00 4890 764 -1.0000000000000000e+00 4891 845 1.0000000000000000e+00 4891 764 -1.0000000000000000e+00 4892 787 1.0000000000000000e+00 4892 764 -1.0000000000000000e+00 4893 764 -1.0000000000000000e+00 4893 842 1.0000000000000000e+00 4894 843 1.0000000000000000e+00 4894 764 -1.0000000000000000e+00 4895 765 1.0000000000000000e+00 4895 570 -1.0000000000000000e+00 4896 779 1.0000000000000000e+00 4896 570 -1.0000000000000000e+00 4897 766 1.0000000000000000e+00 4897 765 -1.0000000000000000e+00 4898 779 1.0000000000000000e+00 4898 765 -1.0000000000000000e+00 4899 765 -1.0000000000000000e+00 4899 589 1.0000000000000000e+00 4900 767 1.0000000000000000e+00 4900 766 -1.0000000000000000e+00 4901 769 1.0000000000000000e+00 4901 766 -1.0000000000000000e+00 4902 774 1.0000000000000000e+00 4902 766 -1.0000000000000000e+00 4903 775 1.0000000000000000e+00 4903 766 -1.0000000000000000e+00 4904 768 1.0000000000000000e+00 4904 766 -1.0000000000000000e+00 4905 766 -1.0000000000000000e+00 4905 589 1.0000000000000000e+00 4906 779 1.0000000000000000e+00 4906 766 -1.0000000000000000e+00 4907 767 -1.0000000000000000e+00 4907 589 1.0000000000000000e+00 4908 769 1.0000000000000000e+00 4908 767 -1.0000000000000000e+00 4909 798 1.0000000000000000e+00 4909 767 -1.0000000000000000e+00 4910 850 1.0000000000000000e+00 4910 767 -1.0000000000000000e+00 4911 797 1.0000000000000000e+00 4911 767 -1.0000000000000000e+00 4912 768 1.0000000000000000e+00 4912 767 -1.0000000000000000e+00 4913 851 1.0000000000000000e+00 4913 767 -1.0000000000000000e+00 4914 796 1.0000000000000000e+00 4914 768 -1.0000000000000000e+00 4915 798 1.0000000000000000e+00 4915 768 -1.0000000000000000e+00 4916 779 1.0000000000000000e+00 4916 768 -1.0000000000000000e+00 4917 797 1.0000000000000000e+00 4917 768 -1.0000000000000000e+00 4918 798 1.0000000000000000e+00 4918 769 -1.0000000000000000e+00 4919 775 1.0000000000000000e+00 4919 769 -1.0000000000000000e+00 4920 851 1.0000000000000000e+00 4920 769 -1.0000000000000000e+00 4921 772 1.0000000000000000e+00 4921 770 -1.0000000000000000e+00 4922 773 1.0000000000000000e+00 4922 770 -1.0000000000000000e+00 4923 776 1.0000000000000000e+00 4923 770 -1.0000000000000000e+00 4924 774 1.0000000000000000e+00 4924 770 -1.0000000000000000e+00 4925 777 1.0000000000000000e+00 4925 770 -1.0000000000000000e+00 4926 778 1.0000000000000000e+00 4926 770 -1.0000000000000000e+00 4927 770 -1.0000000000000000e+00 4927 472 1.0000000000000000e+00 4928 771 1.0000000000000000e+00 4928 770 -1.0000000000000000e+00 4929 775 1.0000000000000000e+00 4929 770 -1.0000000000000000e+00 4930 772 1.0000000000000000e+00 4930 771 -1.0000000000000000e+00 4931 771 -1.0000000000000000e+00 4931 585 1.0000000000000000e+00 4932 777 1.0000000000000000e+00 4932 472 -1.0000000000000000e+00 4933 773 1.0000000000000000e+00 4933 772 -1.0000000000000000e+00 4934 778 1.0000000000000000e+00 4934 772 -1.0000000000000000e+00 4935 776 1.0000000000000000e+00 4935 773 -1.0000000000000000e+00 4936 775 1.0000000000000000e+00 4936 774 -1.0000000000000000e+00 4937 776 1.0000000000000000e+00 4937 775 -1.0000000000000000e+00 4938 778 1.0000000000000000e+00 4938 777 -1.0000000000000000e+00 4939 778 -1.0000000000000000e+00 4939 586 1.0000000000000000e+00 4940 796 1.0000000000000000e+00 4940 779 -1.0000000000000000e+00 4941 807 1.0000000000000000e+00 4941 779 -1.0000000000000000e+00 4942 779 -1.0000000000000000e+00 4942 590 1.0000000000000000e+00 4943 779 -1.0000000000000000e+00 4943 152 1.0000000000000000e+00 4944 781 1.0000000000000000e+00 4944 780 -1.0000000000000000e+00 4945 782 1.0000000000000000e+00 4945 780 -1.0000000000000000e+00 4946 783 1.0000000000000000e+00 4946 780 -1.0000000000000000e+00 4947 780 -1.0000000000000000e+00 4947 307 1.0000000000000000e+00 4948 791 1.0000000000000000e+00 4948 780 -1.0000000000000000e+00 4949 792 1.0000000000000000e+00 4949 780 -1.0000000000000000e+00 4950 780 -1.0000000000000000e+00 4950 599 1.0000000000000000e+00 4951 780 -1.0000000000000000e+00 4951 607 1.0000000000000000e+00 4952 789 1.0000000000000000e+00 4952 780 -1.0000000000000000e+00 4953 794 1.0000000000000000e+00 4953 780 -1.0000000000000000e+00 4954 780 -1.0000000000000000e+00 4954 598 1.0000000000000000e+00 4955 784 1.0000000000000000e+00 4955 780 -1.0000000000000000e+00 4956 790 1.0000000000000000e+00 4956 780 -1.0000000000000000e+00 4957 781 1.0000000000000000e+00 4957 598 -1.0000000000000000e+00 4958 783 -1.0000000000000000e+00 4958 307 1.0000000000000000e+00 4959 782 1.0000000000000000e+00 4959 781 -1.0000000000000000e+00 4960 781 1.0000000000000000e+00 4960 783 -1.0000000000000000e+00 4961 791 1.0000000000000000e+00 4961 782 -1.0000000000000000e+00 4962 784 1.0000000000000000e+00 4962 783 -1.0000000000000000e+00 4963 794 1.0000000000000000e+00 4963 784 -1.0000000000000000e+00 4964 792 1.0000000000000000e+00 4964 784 -1.0000000000000000e+00 4965 786 1.0000000000000000e+00 4965 601 -1.0000000000000000e+00 4966 785 1.0000000000000000e+00 4966 601 -1.0000000000000000e+00 4967 833 1.0000000000000000e+00 4967 785 -1.0000000000000000e+00 4968 788 1.0000000000000000e+00 4968 785 -1.0000000000000000e+00 4969 786 -1.0000000000000000e+00 4969 605 1.0000000000000000e+00 4970 788 1.0000000000000000e+00 4970 787 -1.0000000000000000e+00 4971 790 1.0000000000000000e+00 4971 789 -1.0000000000000000e+00 4972 794 1.0000000000000000e+00 4972 789 -1.0000000000000000e+00 4973 791 1.0000000000000000e+00 4973 790 -1.0000000000000000e+00 4974 792 1.0000000000000000e+00 4974 791 -1.0000000000000000e+00 4975 791 -1.0000000000000000e+00 4975 607 1.0000000000000000e+00 4976 795 1.0000000000000000e+00 4976 793 -1.0000000000000000e+00 4977 795 1.0000000000000000e+00 4977 794 -1.0000000000000000e+00 4978 798 1.0000000000000000e+00 4978 796 -1.0000000000000000e+00 4979 804 1.0000000000000000e+00 4979 796 -1.0000000000000000e+00 4980 805 1.0000000000000000e+00 4980 796 -1.0000000000000000e+00 4981 807 1.0000000000000000e+00 4981 796 -1.0000000000000000e+00 4982 810 1.0000000000000000e+00 4982 796 -1.0000000000000000e+00 4983 796 -1.0000000000000000e+00 4983 610 1.0000000000000000e+00 4984 797 1.0000000000000000e+00 4984 796 -1.0000000000000000e+00 4985 796 -1.0000000000000000e+00 4985 802 1.0000000000000000e+00 4986 803 1.0000000000000000e+00 4986 796 -1.0000000000000000e+00 4987 796 -1.0000000000000000e+00 4987 809 1.0000000000000000e+00 4988 808 1.0000000000000000e+00 4988 796 -1.0000000000000000e+00 4989 850 1.0000000000000000e+00 4989 797 -1.0000000000000000e+00 4990 800 1.0000000000000000e+00 4990 797 -1.0000000000000000e+00 4991 799 1.0000000000000000e+00 4991 610 -1.0000000000000000e+00 4992 807 1.0000000000000000e+00 4992 610 -1.0000000000000000e+00 4993 804 1.0000000000000000e+00 4993 798 -1.0000000000000000e+00 4994 813 1.0000000000000000e+00 4994 799 -1.0000000000000000e+00 4995 801 1.0000000000000000e+00 4995 800 -1.0000000000000000e+00 4996 850 1.0000000000000000e+00 4996 800 -1.0000000000000000e+00 4997 816 1.0000000000000000e+00 4997 801 -1.0000000000000000e+00 4998 855 1.0000000000000000e+00 4998 801 -1.0000000000000000e+00 4999 803 1.0000000000000000e+00 4999 802 -1.0000000000000000e+00 5000 804 1.0000000000000000e+00 5000 803 -1.0000000000000000e+00 5001 805 1.0000000000000000e+00 5001 804 -1.0000000000000000e+00 5002 807 1.0000000000000000e+00 5002 152 -1.0000000000000000e+00 5003 808 1.0000000000000000e+00 5003 152 -1.0000000000000000e+00 5004 811 1.0000000000000000e+00 5004 152 -1.0000000000000000e+00 5005 809 1.0000000000000000e+00 5005 152 -1.0000000000000000e+00 5006 808 1.0000000000000000e+00 5006 807 -1.0000000000000000e+00 5007 809 1.0000000000000000e+00 5007 807 -1.0000000000000000e+00 5008 808 1.0000000000000000e+00 5008 810 -1.0000000000000000e+00 5009 811 1.0000000000000000e+00 5009 808 -1.0000000000000000e+00 5010 808 1.0000000000000000e+00 5010 812 -1.0000000000000000e+00 5011 811 1.0000000000000000e+00 5011 812 -1.0000000000000000e+00 5012 816 1.0000000000000000e+00 5012 813 -1.0000000000000000e+00 5013 818 1.0000000000000000e+00 5013 814 -1.0000000000000000e+00 5014 815 1.0000000000000000e+00 5014 814 -1.0000000000000000e+00 5015 821 1.0000000000000000e+00 5015 814 -1.0000000000000000e+00 5016 818 1.0000000000000000e+00 5016 815 -1.0000000000000000e+00 5017 816 1.0000000000000000e+00 5017 815 -1.0000000000000000e+00 5018 819 1.0000000000000000e+00 5018 815 -1.0000000000000000e+00 5019 817 1.0000000000000000e+00 5019 816 -1.0000000000000000e+00 5020 822 1.0000000000000000e+00 5020 818 -1.0000000000000000e+00 5021 820 1.0000000000000000e+00 5021 818 -1.0000000000000000e+00 5022 832 1.0000000000000000e+00 5022 818 -1.0000000000000000e+00 5023 823 1.0000000000000000e+00 5023 818 -1.0000000000000000e+00 5024 824 1.0000000000000000e+00 5024 818 -1.0000000000000000e+00 5025 819 1.0000000000000000e+00 5025 818 -1.0000000000000000e+00 5026 821 1.0000000000000000e+00 5026 818 -1.0000000000000000e+00 5027 848 1.0000000000000000e+00 5027 818 -1.0000000000000000e+00 5028 847 1.0000000000000000e+00 5028 818 -1.0000000000000000e+00 5029 824 1.0000000000000000e+00 5029 819 -1.0000000000000000e+00 5030 827 1.0000000000000000e+00 5030 819 -1.0000000000000000e+00 5031 820 1.0000000000000000e+00 5031 819 -1.0000000000000000e+00 5032 826 1.0000000000000000e+00 5032 819 -1.0000000000000000e+00 5033 822 1.0000000000000000e+00 5033 820 -1.0000000000000000e+00 5034 822 1.0000000000000000e+00 5034 821 -1.0000000000000000e+00 5035 823 1.0000000000000000e+00 5035 822 -1.0000000000000000e+00 5036 832 1.0000000000000000e+00 5036 823 -1.0000000000000000e+00 5037 827 1.0000000000000000e+00 5037 824 -1.0000000000000000e+00 5038 825 1.0000000000000000e+00 5038 824 -1.0000000000000000e+00 5039 830 1.0000000000000000e+00 5039 824 -1.0000000000000000e+00 5040 831 1.0000000000000000e+00 5040 824 -1.0000000000000000e+00 5041 848 1.0000000000000000e+00 5041 824 -1.0000000000000000e+00 5042 826 1.0000000000000000e+00 5042 824 -1.0000000000000000e+00 5043 832 1.0000000000000000e+00 5043 824 -1.0000000000000000e+00 5044 825 -1.0000000000000000e+00 5044 612 1.0000000000000000e+00 5045 826 1.0000000000000000e+00 5045 825 -1.0000000000000000e+00 5046 831 1.0000000000000000e+00 5046 825 -1.0000000000000000e+00 5047 825 -1.0000000000000000e+00 5047 116 1.0000000000000000e+00 5048 830 1.0000000000000000e+00 5048 825 -1.0000000000000000e+00 5049 828 1.0000000000000000e+00 5049 825 -1.0000000000000000e+00 5050 829 1.0000000000000000e+00 5050 825 -1.0000000000000000e+00 5051 826 -1.0000000000000000e+00 5051 612 1.0000000000000000e+00 5052 832 1.0000000000000000e+00 5052 827 -1.0000000000000000e+00 5053 831 -1.0000000000000000e+00 5053 116 1.0000000000000000e+00 5054 828 1.0000000000000000e+00 5054 612 -1.0000000000000000e+00 5055 829 1.0000000000000000e+00 5055 828 -1.0000000000000000e+00 5056 830 1.0000000000000000e+00 5056 829 -1.0000000000000000e+00 5057 829 1.0000000000000000e+00 5057 831 -1.0000000000000000e+00 5058 832 1.0000000000000000e+00 5058 830 -1.0000000000000000e+00 5059 848 1.0000000000000000e+00 5059 831 -1.0000000000000000e+00 5060 847 1.0000000000000000e+00 5060 832 -1.0000000000000000e+00 5061 834 1.0000000000000000e+00 5061 833 -1.0000000000000000e+00 5062 837 1.0000000000000000e+00 5062 834 -1.0000000000000000e+00 5063 836 1.0000000000000000e+00 5063 835 -1.0000000000000000e+00 5064 840 1.0000000000000000e+00 5064 835 -1.0000000000000000e+00 5065 837 1.0000000000000000e+00 5065 836 -1.0000000000000000e+00 5066 838 1.0000000000000000e+00 5066 837 -1.0000000000000000e+00 5067 841 1.0000000000000000e+00 5067 839 -1.0000000000000000e+00 5068 841 1.0000000000000000e+00 5068 840 -1.0000000000000000e+00 5069 843 1.0000000000000000e+00 5069 842 -1.0000000000000000e+00 5070 844 1.0000000000000000e+00 5070 843 -1.0000000000000000e+00 5071 845 1.0000000000000000e+00 5071 844 -1.0000000000000000e+00 5072 849 1.0000000000000000e+00 5072 847 -1.0000000000000000e+00 5073 852 1.0000000000000000e+00 5073 850 -1.0000000000000000e+00 5074 851 1.0000000000000000e+00 5074 850 -1.0000000000000000e+00 5075 855 1.0000000000000000e+00 5075 850 -1.0000000000000000e+00 5076 852 1.0000000000000000e+00 5076 851 -1.0000000000000000e+00 5077 854 1.0000000000000000e+00 5077 852 -1.0000000000000000e+00 5078 853 1.0000000000000000e+00 5078 852 -1.0000000000000000e+00 5079 855 1.0000000000000000e+00 5079 854 -1.0000000000000000e+00 5080 856 1.0000000000000000e+00 5080 855 -1.0000000000000000e+00 hypre-2.33.0/src/test/TEST_ams/mfem.Gx.00000000066400000000000000000000712641477326011500200150ustar00rootroot000000000000001 1075 1 0.0000000000000000e+00 2 0.0000000000000000e+00 3 1.2500000000000000e-01 4 0.0000000000000000e+00 5 1.2500000000000000e-01 6 0.0000000000000000e+00 7 0.0000000000000000e+00 8 6.2500000000000000e-02 9 0.0000000000000000e+00 10 0.0000000000000000e+00 11 6.2500000000000000e-02 12 0.0000000000000000e+00 13 0.0000000000000000e+00 14 6.2500000000000000e-02 15 0.0000000000000000e+00 16 0.0000000000000000e+00 17 6.2500000000000000e-02 18 1.2500000000000000e-01 19 1.2500000000000000e-01 20 1.2500000000000000e-01 21 1.2500000000000000e-01 22 1.2500000000000000e-01 23 1.2500000000000000e-01 24 0.0000000000000000e+00 25 6.2500000000000000e-02 26 1.2500000000000000e-01 27 6.2500000000000000e-02 28 0.0000000000000000e+00 29 0.0000000000000000e+00 30 1.2500000000000000e-01 31 0.0000000000000000e+00 32 0.0000000000000000e+00 33 1.2500000000000000e-01 34 0.0000000000000000e+00 35 0.0000000000000000e+00 36 1.2500000000000000e-01 37 0.0000000000000000e+00 38 -1.2500000000000000e-01 39 -1.2500000000000000e-01 40 -6.2500000000000000e-02 41 -6.2500000000000000e-02 42 -1.2500000000000000e-01 43 0.0000000000000000e+00 44 0.0000000000000000e+00 45 0.0000000000000000e+00 46 -1.2500000000000000e-01 47 -6.2500000000000000e-02 48 -1.2500000000000000e-01 49 0.0000000000000000e+00 50 0.0000000000000000e+00 51 0.0000000000000000e+00 52 0.0000000000000000e+00 53 0.0000000000000000e+00 54 6.2500000000000000e-02 55 1.2500000000000000e-01 56 1.2500000000000000e-01 57 1.2500000000000000e-01 58 0.0000000000000000e+00 59 6.2500000000000000e-02 60 0.0000000000000000e+00 61 0.0000000000000000e+00 62 1.2500000000000000e-01 63 1.2500000000000000e-01 64 0.0000000000000000e+00 65 6.2500000000000000e-02 66 1.2500000000000000e-01 67 6.2500000000000000e-02 68 0.0000000000000000e+00 69 0.0000000000000000e+00 70 0.0000000000000000e+00 71 0.0000000000000000e+00 72 1.2500000000000000e-01 73 1.2500000000000000e-01 74 -1.2500000000000000e-01 75 -1.2500000000000000e-01 76 -6.2500000000000000e-02 77 -6.2500000000000000e-02 78 -1.2500000000000000e-01 79 -6.2500000000000000e-02 80 1.2500000000000000e-01 81 0.0000000000000000e+00 82 6.2500000000000000e-02 83 6.2500000000000000e-02 84 0.0000000000000000e+00 85 0.0000000000000000e+00 86 0.0000000000000000e+00 87 6.2500000000000000e-02 88 -1.2500000000000000e-01 89 -6.2500000000000000e-02 90 -1.2500000000000000e-01 91 0.0000000000000000e+00 92 0.0000000000000000e+00 93 0.0000000000000000e+00 94 6.2500000000000000e-02 95 1.2500000000000000e-01 96 1.2500000000000000e-01 97 1.2500000000000000e-01 98 1.2500000000000000e-01 99 0.0000000000000000e+00 100 1.2500000000000000e-01 101 0.0000000000000000e+00 102 6.2500000000000000e-02 103 1.2500000000000000e-01 104 0.0000000000000000e+00 105 6.2500000000000000e-02 106 0.0000000000000000e+00 107 0.0000000000000000e+00 108 1.2500000000000000e-01 109 -1.2500000000000000e-01 110 -1.2500000000000000e-01 111 -1.2500000000000000e-01 112 0.0000000000000000e+00 113 -6.2500000000000000e-02 114 -1.2500000000000000e-01 115 0.0000000000000000e+00 116 0.0000000000000000e+00 117 -1.2500000000000000e-01 118 0.0000000000000000e+00 119 0.0000000000000000e+00 120 0.0000000000000000e+00 121 6.2500000000000000e-02 122 -6.2500000000000000e-02 123 -1.2500000000000000e-01 124 -6.2500000000000000e-02 125 1.2500000000000000e-01 126 0.0000000000000000e+00 127 6.2500000000000000e-02 128 6.2500000000000000e-02 129 0.0000000000000000e+00 130 -1.2500000000000000e-01 131 -1.2500000000000000e-01 132 -6.2500000000000000e-02 133 -6.2500000000000000e-02 134 -1.2500000000000000e-01 135 0.0000000000000000e+00 136 0.0000000000000000e+00 137 6.2500000000000000e-02 138 0.0000000000000000e+00 139 -1.2500000000000000e-01 140 1.2500000000000000e-01 141 1.2500000000000000e-01 142 1.2500000000000000e-01 143 1.2500000000000000e-01 144 0.0000000000000000e+00 145 -1.2500000000000000e-01 146 -1.2500000000000000e-01 147 -6.2500000000000000e-02 148 -6.2500000000000000e-02 149 -1.2500000000000000e-01 150 -1.2500000000000000e-01 151 -1.2500000000000000e-01 152 -1.2500000000000000e-01 153 -6.2500000000000000e-02 154 -1.2500000000000000e-01 155 0.0000000000000000e+00 156 -6.2500000000000000e-02 157 1.2500000000000000e-01 158 1.2500000000000000e-01 159 6.2500000000000000e-02 160 1.2500000000000000e-01 161 0.0000000000000000e+00 162 6.2500000000000000e-02 163 -6.2500000000000000e-02 164 6.2500000000000000e-02 165 6.2500000000000000e-02 166 -6.2500000000000000e-02 167 -1.2500000000000000e-01 168 0.0000000000000000e+00 169 0.0000000000000000e+00 170 1.2500000000000000e-01 171 0.0000000000000000e+00 172 0.0000000000000000e+00 173 0.0000000000000000e+00 174 1.2500000000000000e-01 175 0.0000000000000000e+00 176 -1.2500000000000000e-01 177 0.0000000000000000e+00 178 0.0000000000000000e+00 179 -6.2500000000000000e-02 180 0.0000000000000000e+00 181 0.0000000000000000e+00 182 -6.2500000000000000e-02 183 0.0000000000000000e+00 184 6.2500000000000000e-02 185 6.2500000000000000e-02 186 1.2500000000000000e-01 187 1.2500000000000000e-01 188 -1.2500000000000000e-01 189 -1.2500000000000000e-01 190 1.2500000000000000e-01 191 -1.2500000000000000e-01 192 -1.2500000000000000e-01 193 1.2500000000000000e-01 194 -1.2500000000000000e-01 195 0.0000000000000000e+00 196 -6.2500000000000000e-02 197 -6.2500000000000000e-02 198 0.0000000000000000e+00 199 6.2500000000000000e-02 200 -1.2500000000000000e-01 201 -1.2500000000000000e-01 202 -6.2500000000000000e-02 203 0.0000000000000000e+00 204 0.0000000000000000e+00 205 6.2500000000000000e-02 206 1.2500000000000000e-01 207 0.0000000000000000e+00 208 0.0000000000000000e+00 209 -6.2500000000000000e-02 210 6.2500000000000000e-02 211 1.2500000000000000e-01 212 0.0000000000000000e+00 213 -1.2500000000000000e-01 214 -1.2500000000000000e-01 215 1.2500000000000000e-01 216 1.2500000000000000e-01 217 6.2500000000000000e-02 218 0.0000000000000000e+00 219 1.2500000000000000e-01 220 0.0000000000000000e+00 221 0.0000000000000000e+00 222 -6.2500000000000000e-02 223 0.0000000000000000e+00 224 6.2500000000000000e-02 225 0.0000000000000000e+00 226 6.2500000000000000e-02 227 -6.2500000000000000e-02 228 1.2500000000000000e-01 229 -1.2500000000000000e-01 230 -1.2500000000000000e-01 231 1.2500000000000000e-01 232 1.2500000000000000e-01 233 -1.2500000000000000e-01 234 1.2500000000000000e-01 235 1.2500000000000000e-01 236 6.2500000000000000e-02 237 0.0000000000000000e+00 238 0.0000000000000000e+00 239 1.2500000000000000e-01 240 0.0000000000000000e+00 241 -1.2500000000000000e-01 242 -1.2500000000000000e-01 243 -6.2500000000000000e-02 244 -1.2500000000000000e-01 245 -1.2500000000000000e-01 246 -6.2500000000000000e-02 247 -1.2500000000000000e-01 248 -1.2500000000000000e-01 249 -1.2500000000000000e-01 250 1.2500000000000000e-01 251 0.0000000000000000e+00 252 6.2500000000000000e-02 253 6.2500000000000000e-02 254 0.0000000000000000e+00 255 -6.2500000000000000e-02 256 -1.2500000000000000e-01 257 -1.2500000000000000e-01 258 -6.2500000000000000e-02 259 -6.2500000000000000e-02 260 -1.2500000000000000e-01 261 0.0000000000000000e+00 262 0.0000000000000000e+00 263 6.2500000000000000e-02 264 0.0000000000000000e+00 265 -1.2500000000000000e-01 266 -6.2500000000000000e-02 267 -1.2500000000000000e-01 268 1.2500000000000000e-01 269 0.0000000000000000e+00 270 1.2500000000000000e-01 271 0.0000000000000000e+00 272 0.0000000000000000e+00 273 6.2500000000000000e-02 274 1.2500000000000000e-01 275 1.2500000000000000e-01 276 -1.2500000000000000e-01 277 -1.2500000000000000e-01 278 -6.2500000000000000e-02 279 -1.2500000000000000e-01 280 -6.2500000000000000e-02 281 1.2500000000000000e-01 282 0.0000000000000000e+00 283 6.2500000000000000e-02 284 -1.2500000000000000e-01 285 0.0000000000000000e+00 286 -6.2500000000000000e-02 287 -1.2500000000000000e-01 288 1.2500000000000000e-01 289 0.0000000000000000e+00 290 -1.2500000000000000e-01 291 -6.2500000000000000e-02 292 0.0000000000000000e+00 293 0.0000000000000000e+00 294 0.0000000000000000e+00 295 1.2500000000000000e-01 296 6.2500000000000000e-02 297 -1.2500000000000000e-01 298 -1.2500000000000000e-01 299 -6.2500000000000000e-02 300 0.0000000000000000e+00 301 1.2500000000000000e-01 302 1.2500000000000000e-01 303 6.2500000000000000e-02 304 6.2500000000000000e-02 305 1.2500000000000000e-01 306 0.0000000000000000e+00 307 0.0000000000000000e+00 308 1.2500000000000000e-01 309 -1.2500000000000000e-01 310 0.0000000000000000e+00 311 -6.2500000000000000e-02 312 -1.2500000000000000e-01 313 0.0000000000000000e+00 314 -1.2500000000000000e-01 315 -1.2500000000000000e-01 316 -6.2500000000000000e-02 317 -1.2500000000000000e-01 318 -6.2500000000000000e-02 319 -6.2500000000000000e-02 320 -1.2500000000000000e-01 321 -1.2500000000000000e-01 322 0.0000000000000000e+00 323 0.0000000000000000e+00 324 0.0000000000000000e+00 325 -6.2500000000000000e-02 326 6.2500000000000000e-02 327 1.2500000000000000e-01 328 6.2500000000000000e-02 329 1.2500000000000000e-01 330 1.2500000000000000e-01 331 6.2500000000000000e-02 332 6.2500000000000000e-02 333 1.2500000000000000e-01 334 -1.2500000000000000e-01 335 0.0000000000000000e+00 336 -6.2500000000000000e-02 337 -6.2500000000000000e-02 338 0.0000000000000000e+00 339 -1.2500000000000000e-01 340 -1.2500000000000000e-01 341 -6.2500000000000000e-02 342 0.0000000000000000e+00 343 0.0000000000000000e+00 344 0.0000000000000000e+00 345 0.0000000000000000e+00 346 1.2500000000000000e-01 347 -1.2500000000000000e-01 348 -1.2500000000000000e-01 349 1.2500000000000000e-01 350 0.0000000000000000e+00 351 6.2500000000000000e-02 352 1.2500000000000000e-01 353 6.2500000000000000e-02 354 1.2500000000000000e-01 355 6.2500000000000000e-02 356 0.0000000000000000e+00 357 6.2500000000000000e-02 358 1.2500000000000000e-01 359 0.0000000000000000e+00 360 0.0000000000000000e+00 361 0.0000000000000000e+00 362 0.0000000000000000e+00 363 0.0000000000000000e+00 364 1.2500000000000000e-01 365 0.0000000000000000e+00 366 0.0000000000000000e+00 367 0.0000000000000000e+00 368 6.2500000000000000e-02 369 -6.2500000000000000e-02 370 -1.2500000000000000e-01 371 -6.2500000000000000e-02 372 1.2500000000000000e-01 373 0.0000000000000000e+00 374 6.2500000000000000e-02 375 6.2500000000000000e-02 376 0.0000000000000000e+00 377 1.2500000000000000e-01 378 1.2500000000000000e-01 379 6.2500000000000000e-02 380 0.0000000000000000e+00 381 0.0000000000000000e+00 382 -6.2500000000000000e-02 383 -1.2500000000000000e-01 384 1.2500000000000000e-01 385 1.2500000000000000e-01 386 0.0000000000000000e+00 387 -1.2500000000000000e-01 388 -1.2500000000000000e-01 389 -6.2500000000000000e-02 390 0.0000000000000000e+00 391 -1.2500000000000000e-01 392 -1.2500000000000000e-01 393 0.0000000000000000e+00 394 -6.2500000000000000e-02 395 1.2500000000000000e-01 396 6.2500000000000000e-02 397 0.0000000000000000e+00 398 6.2500000000000000e-02 399 1.2500000000000000e-01 400 0.0000000000000000e+00 401 0.0000000000000000e+00 402 0.0000000000000000e+00 403 0.0000000000000000e+00 404 6.2500000000000000e-02 405 -6.2500000000000000e-02 406 -1.2500000000000000e-01 407 -6.2500000000000000e-02 408 -1.2500000000000000e-01 409 -1.2500000000000000e-01 410 -6.2500000000000000e-02 411 -6.2500000000000000e-02 412 -1.2500000000000000e-01 413 1.2500000000000000e-01 414 1.2500000000000000e-01 415 6.2500000000000000e-02 416 1.2500000000000000e-01 417 6.2500000000000000e-02 418 0.0000000000000000e+00 419 0.0000000000000000e+00 420 0.0000000000000000e+00 421 -1.2500000000000000e-01 422 1.2500000000000000e-01 423 0.0000000000000000e+00 424 6.2500000000000000e-02 425 1.2500000000000000e-01 426 0.0000000000000000e+00 427 0.0000000000000000e+00 428 -6.2500000000000000e-02 429 0.0000000000000000e+00 430 -6.2500000000000000e-02 431 1.2500000000000000e-01 432 -1.2500000000000000e-01 433 -6.2500000000000000e-02 434 -1.2500000000000000e-01 435 0.0000000000000000e+00 436 6.2500000000000000e-02 437 0.0000000000000000e+00 438 0.0000000000000000e+00 439 6.2500000000000000e-02 440 1.2500000000000000e-01 441 0.0000000000000000e+00 442 1.2500000000000000e-01 443 0.0000000000000000e+00 444 -1.2500000000000000e-01 445 -1.2500000000000000e-01 446 -6.2500000000000000e-02 447 -1.2500000000000000e-01 448 -1.2500000000000000e-01 449 -6.2500000000000000e-02 450 -1.2500000000000000e-01 451 -6.2500000000000000e-02 452 0.0000000000000000e+00 453 0.0000000000000000e+00 454 0.0000000000000000e+00 455 6.2500000000000000e-02 456 1.2500000000000000e-01 457 1.2500000000000000e-01 458 0.0000000000000000e+00 459 6.2500000000000000e-02 460 1.2500000000000000e-01 461 6.2500000000000000e-02 462 0.0000000000000000e+00 463 0.0000000000000000e+00 464 0.0000000000000000e+00 465 0.0000000000000000e+00 466 1.2500000000000000e-01 467 1.2500000000000000e-01 468 0.0000000000000000e+00 469 6.2500000000000000e-02 470 0.0000000000000000e+00 471 -6.2500000000000000e-02 472 1.2500000000000000e-01 473 0.0000000000000000e+00 474 -6.2500000000000000e-02 475 -1.2500000000000000e-01 476 -1.2500000000000000e-01 477 -1.2500000000000000e-01 478 -6.2500000000000000e-02 479 0.0000000000000000e+00 480 -1.2500000000000000e-01 481 0.0000000000000000e+00 482 0.0000000000000000e+00 483 -6.2500000000000000e-02 484 0.0000000000000000e+00 485 -1.2500000000000000e-01 486 -1.2500000000000000e-01 487 -6.2500000000000000e-02 488 -1.2500000000000000e-01 489 -6.2500000000000000e-02 490 -1.2500000000000000e-01 491 -1.2500000000000000e-01 492 6.2500000000000000e-02 493 0.0000000000000000e+00 494 0.0000000000000000e+00 495 6.2500000000000000e-02 496 0.0000000000000000e+00 497 6.2500000000000000e-02 498 0.0000000000000000e+00 499 6.2500000000000000e-02 500 0.0000000000000000e+00 501 6.2500000000000000e-02 502 1.2500000000000000e-01 503 6.2500000000000000e-02 504 0.0000000000000000e+00 505 6.2500000000000000e-02 506 6.2500000000000000e-02 507 6.2500000000000000e-02 508 -6.2500000000000000e-02 509 6.2500000000000000e-02 510 6.2500000000000000e-02 511 6.2500000000000000e-02 512 6.2500000000000000e-02 513 6.2500000000000000e-02 514 -6.2500000000000000e-02 515 6.2500000000000000e-02 516 6.2500000000000000e-02 517 1.2500000000000000e-01 518 1.2500000000000000e-01 519 0.0000000000000000e+00 520 6.2500000000000000e-02 521 -6.2500000000000000e-02 522 0.0000000000000000e+00 523 6.2500000000000000e-02 524 0.0000000000000000e+00 525 6.2500000000000000e-02 526 0.0000000000000000e+00 527 6.2500000000000000e-02 528 0.0000000000000000e+00 529 6.2500000000000000e-02 530 1.2500000000000000e-01 531 6.2500000000000000e-02 532 0.0000000000000000e+00 533 6.2500000000000000e-02 534 6.2500000000000000e-02 535 6.2500000000000000e-02 536 -6.2500000000000000e-02 537 6.2500000000000000e-02 538 6.2500000000000000e-02 539 6.2500000000000000e-02 540 6.2500000000000000e-02 541 6.2500000000000000e-02 542 -6.2500000000000000e-02 543 6.2500000000000000e-02 544 6.2500000000000000e-02 545 1.2500000000000000e-01 546 6.2500000000000000e-02 547 6.2500000000000000e-02 548 6.2500000000000000e-02 549 -6.2500000000000000e-02 550 -1.2500000000000000e-01 551 -6.2500000000000000e-02 552 0.0000000000000000e+00 553 0.0000000000000000e+00 554 0.0000000000000000e+00 555 0.0000000000000000e+00 556 1.2500000000000000e-01 557 6.2500000000000000e-02 558 -6.2500000000000000e-02 559 6.2500000000000000e-02 560 0.0000000000000000e+00 561 0.0000000000000000e+00 562 0.0000000000000000e+00 563 6.2500000000000000e-02 564 -6.2500000000000000e-02 565 6.2500000000000000e-02 566 6.2500000000000000e-02 567 -6.2500000000000000e-02 568 6.2500000000000000e-02 569 6.2500000000000000e-02 570 6.2500000000000000e-02 571 -6.2500000000000000e-02 572 -6.2500000000000000e-02 573 6.2500000000000000e-02 574 1.2500000000000000e-01 575 0.0000000000000000e+00 576 0.0000000000000000e+00 577 6.2500000000000000e-02 578 6.2500000000000000e-02 579 -6.2500000000000000e-02 580 -6.2500000000000000e-02 581 0.0000000000000000e+00 582 6.2500000000000000e-02 583 1.2500000000000000e-01 584 6.2500000000000000e-02 585 0.0000000000000000e+00 586 -6.2500000000000000e-02 587 -1.2500000000000000e-01 588 -6.2500000000000000e-02 589 -6.2500000000000000e-02 590 6.2500000000000000e-02 591 6.2500000000000000e-02 592 -6.2500000000000000e-02 593 0.0000000000000000e+00 594 -6.2500000000000000e-02 595 -1.2500000000000000e-01 596 -6.2500000000000000e-02 597 0.0000000000000000e+00 598 6.2500000000000000e-02 599 6.2500000000000000e-02 600 6.2500000000000000e-02 601 6.2500000000000000e-02 602 -6.2500000000000000e-02 603 -6.2500000000000000e-02 604 6.2500000000000000e-02 605 -6.2500000000000000e-02 606 -6.2500000000000000e-02 607 6.2500000000000000e-02 608 -6.2500000000000000e-02 609 -6.2500000000000000e-02 610 6.2500000000000000e-02 611 6.2500000000000000e-02 612 6.2500000000000000e-02 613 0.0000000000000000e+00 614 6.2500000000000000e-02 615 -6.2500000000000000e-02 616 0.0000000000000000e+00 617 -6.2500000000000000e-02 618 6.2500000000000000e-02 619 6.2500000000000000e-02 620 6.2500000000000000e-02 621 0.0000000000000000e+00 622 -1.2500000000000000e-01 623 -6.2500000000000000e-02 624 0.0000000000000000e+00 625 6.2500000000000000e-02 626 1.2500000000000000e-01 627 6.2500000000000000e-02 628 6.2500000000000000e-02 629 -6.2500000000000000e-02 630 -6.2500000000000000e-02 631 6.2500000000000000e-02 632 0.0000000000000000e+00 633 6.2500000000000000e-02 634 1.2500000000000000e-01 635 6.2500000000000000e-02 636 0.0000000000000000e+00 637 -6.2500000000000000e-02 638 -6.2500000000000000e-02 639 -6.2500000000000000e-02 640 -6.2500000000000000e-02 641 6.2500000000000000e-02 642 6.2500000000000000e-02 643 -6.2500000000000000e-02 644 -6.2500000000000000e-02 645 6.2500000000000000e-02 646 6.2500000000000000e-02 647 6.2500000000000000e-02 648 6.2500000000000000e-02 649 -6.2500000000000000e-02 650 0.0000000000000000e+00 651 -6.2500000000000000e-02 652 6.2500000000000000e-02 653 0.0000000000000000e+00 654 -6.2500000000000000e-02 655 0.0000000000000000e+00 656 6.2500000000000000e-02 657 1.2500000000000000e-01 658 6.2500000000000000e-02 659 -1.2500000000000000e-01 660 -6.2500000000000000e-02 661 -6.2500000000000000e-02 662 -6.2500000000000000e-02 663 -6.2500000000000000e-02 664 -6.2500000000000000e-02 665 6.2500000000000000e-02 666 6.2500000000000000e-02 667 6.2500000000000000e-02 668 6.2500000000000000e-02 669 -6.2500000000000000e-02 670 -6.2500000000000000e-02 671 -6.2500000000000000e-02 672 0.0000000000000000e+00 673 -6.2500000000000000e-02 674 -6.2500000000000000e-02 675 6.2500000000000000e-02 676 -6.2500000000000000e-02 677 0.0000000000000000e+00 678 0.0000000000000000e+00 679 6.2500000000000000e-02 680 1.2500000000000000e-01 681 6.2500000000000000e-02 682 0.0000000000000000e+00 683 1.2500000000000000e-01 684 6.2500000000000000e-02 685 -6.2500000000000000e-02 686 -6.2500000000000000e-02 687 -6.2500000000000000e-02 688 -6.2500000000000000e-02 689 6.2500000000000000e-02 690 6.2500000000000000e-02 691 6.2500000000000000e-02 692 -6.2500000000000000e-02 693 -6.2500000000000000e-02 694 0.0000000000000000e+00 695 -6.2500000000000000e-02 696 0.0000000000000000e+00 697 6.2500000000000000e-02 698 6.2500000000000000e-02 699 -6.2500000000000000e-02 700 6.2500000000000000e-02 701 -6.2500000000000000e-02 702 -6.2500000000000000e-02 703 -6.2500000000000000e-02 704 6.2500000000000000e-02 705 6.2500000000000000e-02 706 6.2500000000000000e-02 707 -6.2500000000000000e-02 708 0.0000000000000000e+00 709 6.2500000000000000e-02 710 6.2500000000000000e-02 711 -6.2500000000000000e-02 712 -6.2500000000000000e-02 713 0.0000000000000000e+00 714 6.2500000000000000e-02 715 0.0000000000000000e+00 716 6.2500000000000000e-02 717 0.0000000000000000e+00 718 -6.2500000000000000e-02 719 6.2500000000000000e-02 720 -6.2500000000000000e-02 721 6.2500000000000000e-02 722 -6.2500000000000000e-02 723 6.2500000000000000e-02 724 -6.2500000000000000e-02 725 -6.2500000000000000e-02 726 -6.2500000000000000e-02 727 6.2500000000000000e-02 728 6.2500000000000000e-02 729 6.2500000000000000e-02 730 -6.2500000000000000e-02 731 -6.2500000000000000e-02 732 6.2500000000000000e-02 733 6.2500000000000000e-02 734 -6.2500000000000000e-02 735 0.0000000000000000e+00 736 -6.2500000000000000e-02 737 0.0000000000000000e+00 738 -6.2500000000000000e-02 739 0.0000000000000000e+00 740 6.2500000000000000e-02 741 -6.2500000000000000e-02 742 6.2500000000000000e-02 743 -6.2500000000000000e-02 744 6.2500000000000000e-02 745 6.2500000000000000e-02 746 6.2500000000000000e-02 747 -6.2500000000000000e-02 748 6.2500000000000000e-02 749 -6.2500000000000000e-02 750 -6.2500000000000000e-02 751 -6.2500000000000000e-02 752 6.2500000000000000e-02 753 0.0000000000000000e+00 754 6.2500000000000000e-02 755 0.0000000000000000e+00 756 6.2500000000000000e-02 757 -6.2500000000000000e-02 758 -6.2500000000000000e-02 759 -1.2500000000000000e-01 760 -6.2500000000000000e-02 761 1.2500000000000000e-01 762 6.2500000000000000e-02 763 0.0000000000000000e+00 764 -6.2500000000000000e-02 765 6.2500000000000000e-02 766 -6.2500000000000000e-02 767 6.2500000000000000e-02 768 6.2500000000000000e-02 769 6.2500000000000000e-02 770 6.2500000000000000e-02 771 -6.2500000000000000e-02 772 6.2500000000000000e-02 773 -6.2500000000000000e-02 774 -6.2500000000000000e-02 775 -6.2500000000000000e-02 776 6.2500000000000000e-02 777 0.0000000000000000e+00 778 -6.2500000000000000e-02 779 -6.2500000000000000e-02 780 6.2500000000000000e-02 781 -6.2500000000000000e-02 782 -6.2500000000000000e-02 783 -6.2500000000000000e-02 784 -6.2500000000000000e-02 785 6.2500000000000000e-02 786 -6.2500000000000000e-02 787 -6.2500000000000000e-02 788 -6.2500000000000000e-02 789 -6.2500000000000000e-02 790 -6.2500000000000000e-02 791 6.2500000000000000e-02 792 -6.2500000000000000e-02 793 -1.2500000000000000e-01 794 0.0000000000000000e+00 795 0.0000000000000000e+00 796 6.2500000000000000e-02 797 0.0000000000000000e+00 798 6.2500000000000000e-02 799 1.2500000000000000e-01 800 0.0000000000000000e+00 801 6.2500000000000000e-02 802 6.2500000000000000e-02 803 6.2500000000000000e-02 804 -6.2500000000000000e-02 805 6.2500000000000000e-02 806 6.2500000000000000e-02 807 6.2500000000000000e-02 808 6.2500000000000000e-02 809 -6.2500000000000000e-02 810 6.2500000000000000e-02 811 1.2500000000000000e-01 812 6.2500000000000000e-02 813 0.0000000000000000e+00 814 1.2500000000000000e-01 815 1.2500000000000000e-01 816 1.2500000000000000e-01 817 0.0000000000000000e+00 818 0.0000000000000000e+00 819 0.0000000000000000e+00 820 1.2500000000000000e-01 821 1.2500000000000000e-01 822 6.2500000000000000e-02 823 6.2500000000000000e-02 824 -1.2500000000000000e-01 825 -1.2500000000000000e-01 826 0.0000000000000000e+00 827 0.0000000000000000e+00 828 6.2500000000000000e-02 829 0.0000000000000000e+00 830 6.2500000000000000e-02 831 1.2500000000000000e-01 832 6.2500000000000000e-02 833 6.2500000000000000e-02 834 6.2500000000000000e-02 835 6.2500000000000000e-02 836 6.2500000000000000e-02 837 6.2500000000000000e-02 838 6.2500000000000000e-02 839 -6.2500000000000000e-02 840 0.0000000000000000e+00 841 6.2500000000000000e-02 842 1.2500000000000000e-01 843 6.2500000000000000e-02 844 6.2500000000000000e-02 845 6.2500000000000000e-02 846 0.0000000000000000e+00 847 6.2500000000000000e-02 848 0.0000000000000000e+00 849 6.2500000000000000e-02 850 0.0000000000000000e+00 851 6.2500000000000000e-02 852 -6.2500000000000000e-02 853 -6.2500000000000000e-02 854 6.2500000000000000e-02 855 6.2500000000000000e-02 856 6.2500000000000000e-02 857 6.2500000000000000e-02 858 -6.2500000000000000e-02 859 6.2500000000000000e-02 860 6.2500000000000000e-02 861 6.2500000000000000e-02 862 6.2500000000000000e-02 863 1.2500000000000000e-01 864 6.2500000000000000e-02 865 -6.2500000000000000e-02 866 0.0000000000000000e+00 867 6.2500000000000000e-02 868 0.0000000000000000e+00 869 6.2500000000000000e-02 870 0.0000000000000000e+00 871 6.2500000000000000e-02 872 1.2500000000000000e-01 873 6.2500000000000000e-02 874 6.2500000000000000e-02 875 6.2500000000000000e-02 876 6.2500000000000000e-02 877 6.2500000000000000e-02 878 6.2500000000000000e-02 879 6.2500000000000000e-02 880 -6.2500000000000000e-02 881 -6.2500000000000000e-02 882 6.2500000000000000e-02 883 0.0000000000000000e+00 884 1.2500000000000000e-01 885 6.2500000000000000e-02 886 -6.2500000000000000e-02 887 6.2500000000000000e-02 888 6.2500000000000000e-02 889 1.2500000000000000e-01 890 6.2500000000000000e-02 891 6.2500000000000000e-02 892 -6.2500000000000000e-02 893 6.2500000000000000e-02 894 -6.2500000000000000e-02 895 0.0000000000000000e+00 896 1.2500000000000000e-01 897 6.2500000000000000e-02 898 -6.2500000000000000e-02 899 6.2500000000000000e-02 900 6.2500000000000000e-02 901 1.2500000000000000e-01 902 0.0000000000000000e+00 903 -6.2500000000000000e-02 904 -1.2500000000000000e-01 905 -6.2500000000000000e-02 906 0.0000000000000000e+00 907 -6.2500000000000000e-02 908 6.2500000000000000e-02 909 6.2500000000000000e-02 910 6.2500000000000000e-02 911 -6.2500000000000000e-02 912 -6.2500000000000000e-02 913 6.2500000000000000e-02 914 -6.2500000000000000e-02 915 -6.2500000000000000e-02 916 0.0000000000000000e+00 917 6.2500000000000000e-02 918 0.0000000000000000e+00 919 -6.2500000000000000e-02 920 -6.2500000000000000e-02 921 6.2500000000000000e-02 922 -6.2500000000000000e-02 923 6.2500000000000000e-02 924 -6.2500000000000000e-02 925 -6.2500000000000000e-02 926 -6.2500000000000000e-02 927 -6.2500000000000000e-02 928 6.2500000000000000e-02 929 -6.2500000000000000e-02 930 6.2500000000000000e-02 931 6.2500000000000000e-02 932 1.2500000000000000e-01 933 6.2500000000000000e-02 934 0.0000000000000000e+00 935 0.0000000000000000e+00 936 6.2500000000000000e-02 937 6.2500000000000000e-02 938 0.0000000000000000e+00 939 0.0000000000000000e+00 940 -6.2500000000000000e-02 941 -6.2500000000000000e-02 942 -6.2500000000000000e-02 943 6.2500000000000000e-02 944 6.2500000000000000e-02 945 6.2500000000000000e-02 946 0.0000000000000000e+00 947 0.0000000000000000e+00 948 -6.2500000000000000e-02 949 -6.2500000000000000e-02 950 6.2500000000000000e-02 951 0.0000000000000000e+00 952 6.2500000000000000e-02 953 6.2500000000000000e-02 954 -6.2500000000000000e-02 955 6.2500000000000000e-02 956 6.2500000000000000e-02 957 6.2500000000000000e-02 958 6.2500000000000000e-02 959 0.0000000000000000e+00 960 6.2500000000000000e-02 961 1.2500000000000000e-01 962 6.2500000000000000e-02 963 6.2500000000000000e-02 964 0.0000000000000000e+00 965 6.2500000000000000e-02 966 6.2500000000000000e-02 967 -6.2500000000000000e-02 968 6.2500000000000000e-02 969 6.2500000000000000e-02 970 1.2500000000000000e-01 971 -6.2500000000000000e-02 972 -6.2500000000000000e-02 973 6.2500000000000000e-02 974 -6.2500000000000000e-02 975 6.2500000000000000e-02 976 6.2500000000000000e-02 977 -6.2500000000000000e-02 978 0.0000000000000000e+00 979 -6.2500000000000000e-02 980 6.2500000000000000e-02 981 1.2500000000000000e-01 982 0.0000000000000000e+00 983 6.2500000000000000e-02 984 6.2500000000000000e-02 985 6.2500000000000000e-02 986 6.2500000000000000e-02 987 -6.2500000000000000e-02 988 1.2500000000000000e-01 989 6.2500000000000000e-02 990 0.0000000000000000e+00 991 6.2500000000000000e-02 992 6.2500000000000000e-02 993 6.2500000000000000e-02 994 6.2500000000000000e-02 995 1.2500000000000000e-01 996 -6.2500000000000000e-02 997 0.0000000000000000e+00 998 6.2500000000000000e-02 999 6.2500000000000000e-02 1000 -6.2500000000000000e-02 1001 6.2500000000000000e-02 1002 -6.2500000000000000e-02 1003 6.2500000000000000e-02 1004 6.2500000000000000e-02 1005 6.2500000000000000e-02 1006 6.2500000000000000e-02 1007 -6.2500000000000000e-02 1008 -6.2500000000000000e-02 1009 6.2500000000000000e-02 1010 -6.2500000000000000e-02 1011 -1.2500000000000000e-01 1012 -1.2500000000000000e-01 1013 0.0000000000000000e+00 1014 -1.2500000000000000e-01 1015 0.0000000000000000e+00 1016 -6.2500000000000000e-02 1017 -6.2500000000000000e-02 1018 0.0000000000000000e+00 1019 -6.2500000000000000e-02 1020 -1.2500000000000000e-01 1021 -6.2500000000000000e-02 1022 -6.2500000000000000e-02 1023 1.2500000000000000e-01 1024 6.2500000000000000e-02 1025 1.2500000000000000e-01 1026 6.2500000000000000e-02 1027 -6.2500000000000000e-02 1028 0.0000000000000000e+00 1029 6.2500000000000000e-02 1030 -6.2500000000000000e-02 1031 -6.2500000000000000e-02 1032 6.2500000000000000e-02 1033 0.0000000000000000e+00 1034 -6.2500000000000000e-02 1035 -6.2500000000000000e-02 1036 6.2500000000000000e-02 1037 6.2500000000000000e-02 1038 -6.2500000000000000e-02 1039 6.2500000000000000e-02 1040 6.2500000000000000e-02 1041 0.0000000000000000e+00 1042 -6.2500000000000000e-02 1043 0.0000000000000000e+00 1044 6.2500000000000000e-02 1045 6.2500000000000000e-02 1046 -6.2500000000000000e-02 1047 6.2500000000000000e-02 1048 6.2500000000000000e-02 1049 -6.2500000000000000e-02 1050 -6.2500000000000000e-02 1051 6.2500000000000000e-02 1052 -6.2500000000000000e-02 1053 -6.2500000000000000e-02 1054 -6.2500000000000000e-02 1055 -6.2500000000000000e-02 1056 -6.2500000000000000e-02 1057 -6.2500000000000000e-02 1058 -6.2500000000000000e-02 1059 0.0000000000000000e+00 1060 -6.2500000000000000e-02 1061 -6.2500000000000000e-02 1062 -6.2500000000000000e-02 1063 -6.2500000000000000e-02 1064 0.0000000000000000e+00 1065 -1.2500000000000000e-01 1066 -6.2500000000000000e-02 1067 -6.2500000000000000e-02 1068 -1.2500000000000000e-01 1069 -6.2500000000000000e-02 1070 -6.2500000000000000e-02 1071 -6.2500000000000000e-02 1072 6.2500000000000000e-02 1073 0.0000000000000000e+00 1074 6.2500000000000000e-02 1075 -1.2500000000000000e-01 hypre-2.33.0/src/test/TEST_ams/mfem.Gx.00001000066400000000000000000001054271477326011500200150ustar00rootroot000000000000001076 2332 1076 -1.2500000000000000e-01 1077 0.0000000000000000e+00 1078 -6.2500000000000000e-02 1079 -1.2500000000000000e-01 1080 -1.2500000000000000e-01 1081 0.0000000000000000e+00 1082 0.0000000000000000e+00 1083 1.2500000000000000e-01 1084 1.2500000000000000e-01 1085 1.2500000000000000e-01 1086 1.2500000000000000e-01 1087 2.5000000000000000e-01 1088 1.2500000000000000e-01 1089 1.2500000000000000e-01 1090 0.0000000000000000e+00 1091 6.2500000000000000e-02 1092 -1.2500000000000000e-01 1093 -1.2500000000000000e-01 1094 -6.2500000000000000e-02 1095 1.2500000000000000e-01 1096 1.2500000000000000e-01 1097 0.0000000000000000e+00 1098 0.0000000000000000e+00 1099 -1.2500000000000000e-01 1100 -1.2500000000000000e-01 1101 0.0000000000000000e+00 1102 -6.2500000000000000e-02 1103 -1.2500000000000000e-01 1104 -1.2500000000000000e-01 1105 0.0000000000000000e+00 1106 0.0000000000000000e+00 1107 1.2500000000000000e-01 1108 1.2500000000000000e-01 1109 1.2500000000000000e-01 1110 1.2500000000000000e-01 1111 0.0000000000000000e+00 1112 0.0000000000000000e+00 1113 0.0000000000000000e+00 1114 0.0000000000000000e+00 1115 -6.2500000000000000e-02 1116 6.2500000000000000e-02 1117 1.2500000000000000e-01 1118 6.2500000000000000e-02 1119 0.0000000000000000e+00 1120 -1.2500000000000000e-01 1121 -6.2500000000000000e-02 1122 -1.2500000000000000e-01 1123 0.0000000000000000e+00 1124 -6.2500000000000000e-02 1125 -6.2500000000000000e-02 1126 0.0000000000000000e+00 1127 -1.2500000000000000e-01 1128 -1.2500000000000000e-01 1129 0.0000000000000000e+00 1130 0.0000000000000000e+00 1131 6.2500000000000000e-02 1132 1.2500000000000000e-01 1133 -1.2500000000000000e-01 1134 1.2500000000000000e-01 1135 1.2500000000000000e-01 1136 6.2500000000000000e-02 1137 0.0000000000000000e+00 1138 1.2500000000000000e-01 1139 1.2500000000000000e-01 1140 0.0000000000000000e+00 1141 0.0000000000000000e+00 1142 1.2500000000000000e-01 1143 1.2500000000000000e-01 1144 1.2500000000000000e-01 1145 0.0000000000000000e+00 1146 1.2500000000000000e-01 1147 0.0000000000000000e+00 1148 -1.2500000000000000e-01 1149 -1.2500000000000000e-01 1150 -1.2500000000000000e-01 1151 1.2500000000000000e-01 1152 1.2500000000000000e-01 1153 0.0000000000000000e+00 1154 1.2500000000000000e-01 1155 1.2500000000000000e-01 1156 0.0000000000000000e+00 1157 -1.2500000000000000e-01 1158 -1.2500000000000000e-01 1159 -1.2500000000000000e-01 1160 0.0000000000000000e+00 1161 -1.2500000000000000e-01 1162 1.2500000000000000e-01 1163 0.0000000000000000e+00 1164 0.0000000000000000e+00 1165 1.2500000000000000e-01 1166 0.0000000000000000e+00 1167 -1.2500000000000000e-01 1168 0.0000000000000000e+00 1169 0.0000000000000000e+00 1170 1.2500000000000000e-01 1171 -1.2500000000000000e-01 1172 1.2500000000000000e-01 1173 1.2500000000000000e-01 1174 0.0000000000000000e+00 1175 1.2500000000000000e-01 1176 0.0000000000000000e+00 1177 1.2500000000000000e-01 1178 1.2500000000000000e-01 1179 0.0000000000000000e+00 1180 0.0000000000000000e+00 1181 1.2500000000000000e-01 1182 1.2500000000000000e-01 1183 0.0000000000000000e+00 1184 0.0000000000000000e+00 1185 1.2500000000000000e-01 1186 1.2500000000000000e-01 1187 0.0000000000000000e+00 1188 0.0000000000000000e+00 1189 1.2500000000000000e-01 1190 1.2500000000000000e-01 1191 1.2500000000000000e-01 1192 1.2500000000000000e-01 1193 0.0000000000000000e+00 1194 1.2500000000000000e-01 1195 1.2500000000000000e-01 1196 1.2500000000000000e-01 1197 0.0000000000000000e+00 1198 0.0000000000000000e+00 1199 0.0000000000000000e+00 1200 1.2500000000000000e-01 1201 0.0000000000000000e+00 1202 1.2500000000000000e-01 1203 0.0000000000000000e+00 1204 0.0000000000000000e+00 1205 0.0000000000000000e+00 1206 -1.2500000000000000e-01 1207 -1.2500000000000000e-01 1208 -1.2500000000000000e-01 1209 -1.2500000000000000e-01 1210 1.2500000000000000e-01 1211 0.0000000000000000e+00 1212 -1.2500000000000000e-01 1213 0.0000000000000000e+00 1214 -1.2500000000000000e-01 1215 0.0000000000000000e+00 1216 1.2500000000000000e-01 1217 -1.2500000000000000e-01 1218 0.0000000000000000e+00 1219 -1.2500000000000000e-01 1220 -1.2500000000000000e-01 1221 -1.2500000000000000e-01 1222 0.0000000000000000e+00 1223 0.0000000000000000e+00 1224 -1.2500000000000000e-01 1225 1.2500000000000000e-01 1226 -1.2500000000000000e-01 1227 -1.2500000000000000e-01 1228 0.0000000000000000e+00 1229 -1.2500000000000000e-01 1230 -1.2500000000000000e-01 1231 -1.2500000000000000e-01 1232 0.0000000000000000e+00 1233 0.0000000000000000e+00 1234 -1.2500000000000000e-01 1235 -1.2500000000000000e-01 1236 -1.2500000000000000e-01 1237 0.0000000000000000e+00 1238 0.0000000000000000e+00 1239 -1.2500000000000000e-01 1240 1.2500000000000000e-01 1241 1.2500000000000000e-01 1242 1.2500000000000000e-01 1243 1.2500000000000000e-01 1244 -1.2500000000000000e-01 1245 -2.5000000000000000e-01 1246 0.0000000000000000e+00 1247 -1.2500000000000000e-01 1248 -1.2500000000000000e-01 1249 -1.2500000000000000e-01 1250 -1.2500000000000000e-01 1251 0.0000000000000000e+00 1252 -1.2500000000000000e-01 1253 0.0000000000000000e+00 1254 -1.2500000000000000e-01 1255 -1.2500000000000000e-01 1256 -1.2500000000000000e-01 1257 -1.2500000000000000e-01 1258 1.2500000000000000e-01 1259 0.0000000000000000e+00 1260 0.0000000000000000e+00 1261 1.2500000000000000e-01 1262 1.2500000000000000e-01 1263 0.0000000000000000e+00 1264 -1.2500000000000000e-01 1265 -1.2500000000000000e-01 1266 -1.2500000000000000e-01 1267 -1.2500000000000000e-01 1268 0.0000000000000000e+00 1269 -6.2500000000000000e-02 1270 1.2500000000000000e-01 1271 1.2500000000000000e-01 1272 6.2500000000000000e-02 1273 1.2500000000000000e-01 1274 1.2500000000000000e-01 1275 1.2500000000000000e-01 1276 1.2500000000000000e-01 1277 0.0000000000000000e+00 1278 -1.2500000000000000e-01 1279 0.0000000000000000e+00 1280 -1.2500000000000000e-01 1281 0.0000000000000000e+00 1282 0.0000000000000000e+00 1283 -1.2500000000000000e-01 1284 -1.2500000000000000e-01 1285 -1.2500000000000000e-01 1286 -1.2500000000000000e-01 1287 0.0000000000000000e+00 1288 0.0000000000000000e+00 1289 1.2500000000000000e-01 1290 6.2500000000000000e-02 1291 1.2500000000000000e-01 1292 0.0000000000000000e+00 1293 0.0000000000000000e+00 1294 1.2500000000000000e-01 1295 0.0000000000000000e+00 1296 1.2500000000000000e-01 1297 1.2500000000000000e-01 1298 1.2500000000000000e-01 1299 1.2500000000000000e-01 1300 1.2500000000000000e-01 1301 1.2500000000000000e-01 1302 0.0000000000000000e+00 1303 0.0000000000000000e+00 1304 0.0000000000000000e+00 1305 1.2500000000000000e-01 1306 0.0000000000000000e+00 1307 1.2500000000000000e-01 1308 0.0000000000000000e+00 1309 1.2500000000000000e-01 1310 0.0000000000000000e+00 1311 6.2500000000000000e-02 1312 0.0000000000000000e+00 1313 0.0000000000000000e+00 1314 1.2500000000000000e-01 1315 1.2500000000000000e-01 1316 1.2500000000000000e-01 1317 0.0000000000000000e+00 1318 6.2500000000000000e-02 1319 -1.2500000000000000e-01 1320 -1.2500000000000000e-01 1321 -6.2500000000000000e-02 1322 -1.2500000000000000e-01 1323 0.0000000000000000e+00 1324 -6.2500000000000000e-02 1325 1.2500000000000000e-01 1326 1.2500000000000000e-01 1327 6.2500000000000000e-02 1328 0.0000000000000000e+00 1329 0.0000000000000000e+00 1330 -1.2500000000000000e-01 1331 0.0000000000000000e+00 1332 1.2500000000000000e-01 1333 1.2500000000000000e-01 1334 1.2500000000000000e-01 1335 6.2500000000000000e-02 1336 0.0000000000000000e+00 1337 6.2500000000000000e-02 1338 1.2500000000000000e-01 1339 0.0000000000000000e+00 1340 0.0000000000000000e+00 1341 0.0000000000000000e+00 1342 1.2500000000000000e-01 1343 0.0000000000000000e+00 1344 0.0000000000000000e+00 1345 0.0000000000000000e+00 1346 6.2500000000000000e-02 1347 -6.2500000000000000e-02 1348 -1.2500000000000000e-01 1349 -6.2500000000000000e-02 1350 0.0000000000000000e+00 1351 1.2500000000000000e-01 1352 6.2500000000000000e-02 1353 -1.2500000000000000e-01 1354 -1.2500000000000000e-01 1355 -6.2500000000000000e-02 1356 -6.2500000000000000e-02 1357 -1.2500000000000000e-01 1358 0.0000000000000000e+00 1359 0.0000000000000000e+00 1360 -1.2500000000000000e-01 1361 1.2500000000000000e-01 1362 1.2500000000000000e-01 1363 6.2500000000000000e-02 1364 0.0000000000000000e+00 1365 1.2500000000000000e-01 1366 0.0000000000000000e+00 1367 6.2500000000000000e-02 1368 1.2500000000000000e-01 1369 0.0000000000000000e+00 1370 0.0000000000000000e+00 1371 0.0000000000000000e+00 1372 6.2500000000000000e-02 1373 1.2500000000000000e-01 1374 0.0000000000000000e+00 1375 1.2500000000000000e-01 1376 1.2500000000000000e-01 1377 0.0000000000000000e+00 1378 2.5000000000000000e-01 1379 0.0000000000000000e+00 1380 1.2500000000000000e-01 1381 1.2500000000000000e-01 1382 0.0000000000000000e+00 1383 0.0000000000000000e+00 1384 6.2500000000000000e-02 1385 0.0000000000000000e+00 1386 0.0000000000000000e+00 1387 6.2500000000000000e-02 1388 0.0000000000000000e+00 1389 1.2500000000000000e-01 1390 1.2500000000000000e-01 1391 1.2500000000000000e-01 1392 1.2500000000000000e-01 1393 -1.2500000000000000e-01 1394 -1.2500000000000000e-01 1395 -6.2500000000000000e-02 1396 -6.2500000000000000e-02 1397 -1.2500000000000000e-01 1398 -6.2500000000000000e-02 1399 0.0000000000000000e+00 1400 0.0000000000000000e+00 1401 6.2500000000000000e-02 1402 -6.2500000000000000e-02 1403 -1.2500000000000000e-01 1404 1.2500000000000000e-01 1405 0.0000000000000000e+00 1406 6.2500000000000000e-02 1407 6.2500000000000000e-02 1408 0.0000000000000000e+00 1409 1.2500000000000000e-01 1410 1.2500000000000000e-01 1411 6.2500000000000000e-02 1412 0.0000000000000000e+00 1413 0.0000000000000000e+00 1414 0.0000000000000000e+00 1415 0.0000000000000000e+00 1416 1.2500000000000000e-01 1417 1.2500000000000000e-01 1418 -1.2500000000000000e-01 1419 1.2500000000000000e-01 1420 1.2500000000000000e-01 1421 1.2500000000000000e-01 1422 1.2500000000000000e-01 1423 0.0000000000000000e+00 1424 1.2500000000000000e-01 1425 0.0000000000000000e+00 1426 6.2500000000000000e-02 1427 1.2500000000000000e-01 1428 0.0000000000000000e+00 1429 1.2500000000000000e-01 1430 0.0000000000000000e+00 1431 0.0000000000000000e+00 1432 0.0000000000000000e+00 1433 0.0000000000000000e+00 1434 0.0000000000000000e+00 1435 -6.2500000000000000e-02 1436 -1.2500000000000000e-01 1437 0.0000000000000000e+00 1438 0.0000000000000000e+00 1439 1.2500000000000000e-01 1440 -1.2500000000000000e-01 1441 -1.2500000000000000e-01 1442 -1.2500000000000000e-01 1443 -1.2500000000000000e-01 1444 -1.2500000000000000e-01 1445 -1.2500000000000000e-01 1446 0.0000000000000000e+00 1447 0.0000000000000000e+00 1448 1.2500000000000000e-01 1449 0.0000000000000000e+00 1450 0.0000000000000000e+00 1451 0.0000000000000000e+00 1452 -6.2500000000000000e-02 1453 -6.2500000000000000e-02 1454 0.0000000000000000e+00 1455 1.2500000000000000e-01 1456 1.2500000000000000e-01 1457 1.2500000000000000e-01 1458 1.2500000000000000e-01 1459 -1.2500000000000000e-01 1460 -1.2500000000000000e-01 1461 -1.2500000000000000e-01 1462 -1.2500000000000000e-01 1463 0.0000000000000000e+00 1464 -1.2500000000000000e-01 1465 -1.2500000000000000e-01 1466 -6.2500000000000000e-02 1467 0.0000000000000000e+00 1468 0.0000000000000000e+00 1469 -1.2500000000000000e-01 1470 -6.2500000000000000e-02 1471 -1.2500000000000000e-01 1472 -1.2500000000000000e-01 1473 1.2500000000000000e-01 1474 1.2500000000000000e-01 1475 6.2500000000000000e-02 1476 6.2500000000000000e-02 1477 1.2500000000000000e-01 1478 6.2500000000000000e-02 1479 0.0000000000000000e+00 1480 0.0000000000000000e+00 1481 -6.2500000000000000e-02 1482 6.2500000000000000e-02 1483 1.2500000000000000e-01 1484 -1.2500000000000000e-01 1485 -1.2500000000000000e-01 1486 -6.2500000000000000e-02 1487 -1.2500000000000000e-01 1488 -6.2500000000000000e-02 1489 0.0000000000000000e+00 1490 -1.2500000000000000e-01 1491 0.0000000000000000e+00 1492 -6.2500000000000000e-02 1493 -1.2500000000000000e-01 1494 0.0000000000000000e+00 1495 0.0000000000000000e+00 1496 0.0000000000000000e+00 1497 0.0000000000000000e+00 1498 1.2500000000000000e-01 1499 1.2500000000000000e-01 1500 1.2500000000000000e-01 1501 1.2500000000000000e-01 1502 -1.2500000000000000e-01 1503 -1.2500000000000000e-01 1504 -6.2500000000000000e-02 1505 0.0000000000000000e+00 1506 -6.2500000000000000e-02 1507 -1.2500000000000000e-01 1508 0.0000000000000000e+00 1509 0.0000000000000000e+00 1510 0.0000000000000000e+00 1511 0.0000000000000000e+00 1512 1.2500000000000000e-01 1513 1.2500000000000000e-01 1514 -1.2500000000000000e-01 1515 1.2500000000000000e-01 1516 1.2500000000000000e-01 1517 0.0000000000000000e+00 1518 0.0000000000000000e+00 1519 0.0000000000000000e+00 1520 2.5000000000000000e-01 1521 1.2500000000000000e-01 1522 -1.2500000000000000e-01 1523 -1.2500000000000000e-01 1524 0.0000000000000000e+00 1525 0.0000000000000000e+00 1526 -1.2500000000000000e-01 1527 -1.2500000000000000e-01 1528 0.0000000000000000e+00 1529 0.0000000000000000e+00 1530 1.2500000000000000e-01 1531 1.2500000000000000e-01 1532 1.2500000000000000e-01 1533 0.0000000000000000e+00 1534 0.0000000000000000e+00 1535 1.2500000000000000e-01 1536 0.0000000000000000e+00 1537 -1.2500000000000000e-01 1538 1.2500000000000000e-01 1539 0.0000000000000000e+00 1540 0.0000000000000000e+00 1541 1.2500000000000000e-01 1542 -1.2500000000000000e-01 1543 -1.2500000000000000e-01 1544 -1.2500000000000000e-01 1545 -1.2500000000000000e-01 1546 -1.2500000000000000e-01 1547 1.2500000000000000e-01 1548 1.2500000000000000e-01 1549 0.0000000000000000e+00 1550 1.2500000000000000e-01 1551 0.0000000000000000e+00 1552 1.2500000000000000e-01 1553 1.2500000000000000e-01 1554 1.2500000000000000e-01 1555 -1.2500000000000000e-01 1556 -1.2500000000000000e-01 1557 -1.2500000000000000e-01 1558 -1.2500000000000000e-01 1559 -1.2500000000000000e-01 1560 0.0000000000000000e+00 1561 0.0000000000000000e+00 1562 -1.2500000000000000e-01 1563 1.2500000000000000e-01 1564 1.2500000000000000e-01 1565 0.0000000000000000e+00 1566 0.0000000000000000e+00 1567 -1.2500000000000000e-01 1568 -1.2500000000000000e-01 1569 -1.2500000000000000e-01 1570 -1.2500000000000000e-01 1571 -1.2500000000000000e-01 1572 -1.2500000000000000e-01 1573 0.0000000000000000e+00 1574 -1.2500000000000000e-01 1575 -1.2500000000000000e-01 1576 -1.2500000000000000e-01 1577 0.0000000000000000e+00 1578 0.0000000000000000e+00 1579 -1.2500000000000000e-01 1580 1.2500000000000000e-01 1581 0.0000000000000000e+00 1582 6.2500000000000000e-02 1583 0.0000000000000000e+00 1584 0.0000000000000000e+00 1585 -6.2500000000000000e-02 1586 -1.2500000000000000e-01 1587 -6.2500000000000000e-02 1588 -1.2500000000000000e-01 1589 -1.2500000000000000e-01 1590 -1.2500000000000000e-01 1591 0.0000000000000000e+00 1592 6.2500000000000000e-02 1593 1.2500000000000000e-01 1594 6.2500000000000000e-02 1595 1.2500000000000000e-01 1596 0.0000000000000000e+00 1597 1.2500000000000000e-01 1598 -1.2500000000000000e-01 1599 -1.2500000000000000e-01 1600 -1.2500000000000000e-01 1601 -2.5000000000000000e-01 1602 0.0000000000000000e+00 1603 -1.2500000000000000e-01 1604 -1.2500000000000000e-01 1605 -1.2500000000000000e-01 1606 0.0000000000000000e+00 1607 0.0000000000000000e+00 1608 -1.2500000000000000e-01 1609 -1.2500000000000000e-01 1610 1.2500000000000000e-01 1611 0.0000000000000000e+00 1612 0.0000000000000000e+00 1613 -1.2500000000000000e-01 1614 0.0000000000000000e+00 1615 -1.2500000000000000e-01 1616 -1.2500000000000000e-01 1617 -1.2500000000000000e-01 1618 1.2500000000000000e-01 1619 1.2500000000000000e-01 1620 0.0000000000000000e+00 1621 1.2500000000000000e-01 1622 1.2500000000000000e-01 1623 1.2500000000000000e-01 1624 0.0000000000000000e+00 1625 1.2500000000000000e-01 1626 1.2500000000000000e-01 1627 0.0000000000000000e+00 1628 0.0000000000000000e+00 1629 0.0000000000000000e+00 1630 0.0000000000000000e+00 1631 1.2500000000000000e-01 1632 1.2500000000000000e-01 1633 -1.2500000000000000e-01 1634 0.0000000000000000e+00 1635 0.0000000000000000e+00 1636 1.2500000000000000e-01 1637 0.0000000000000000e+00 1638 1.2500000000000000e-01 1639 1.2500000000000000e-01 1640 -1.2500000000000000e-01 1641 -1.2500000000000000e-01 1642 -1.2500000000000000e-01 1643 1.2500000000000000e-01 1644 0.0000000000000000e+00 1645 0.0000000000000000e+00 1646 -1.2500000000000000e-01 1647 -1.2500000000000000e-01 1648 0.0000000000000000e+00 1649 0.0000000000000000e+00 1650 0.0000000000000000e+00 1651 6.2500000000000000e-02 1652 0.0000000000000000e+00 1653 -6.2500000000000000e-02 1654 0.0000000000000000e+00 1655 1.2500000000000000e-01 1656 0.0000000000000000e+00 1657 -1.2500000000000000e-01 1658 -1.2500000000000000e-01 1659 1.2500000000000000e-01 1660 1.2500000000000000e-01 1661 1.2500000000000000e-01 1662 -1.2500000000000000e-01 1663 1.2500000000000000e-01 1664 -1.2500000000000000e-01 1665 1.2500000000000000e-01 1666 1.2500000000000000e-01 1667 6.2500000000000000e-02 1668 0.0000000000000000e+00 1669 0.0000000000000000e+00 1670 0.0000000000000000e+00 1671 1.2500000000000000e-01 1672 0.0000000000000000e+00 1673 0.0000000000000000e+00 1674 6.2500000000000000e-02 1675 -6.2500000000000000e-02 1676 -1.2500000000000000e-01 1677 -6.2500000000000000e-02 1678 0.0000000000000000e+00 1679 0.0000000000000000e+00 1680 -6.2500000000000000e-02 1681 0.0000000000000000e+00 1682 6.2500000000000000e-02 1683 1.2500000000000000e-01 1684 1.2500000000000000e-01 1685 -1.2500000000000000e-01 1686 -1.2500000000000000e-01 1687 -1.2500000000000000e-01 1688 1.2500000000000000e-01 1689 1.2500000000000000e-01 1690 0.0000000000000000e+00 1691 1.2500000000000000e-01 1692 0.0000000000000000e+00 1693 1.2500000000000000e-01 1694 6.2500000000000000e-02 1695 -1.2500000000000000e-01 1696 -6.2500000000000000e-02 1697 0.0000000000000000e+00 1698 6.2500000000000000e-02 1699 0.0000000000000000e+00 1700 -6.2500000000000000e-02 1701 6.2500000000000000e-02 1702 -6.2500000000000000e-02 1703 0.0000000000000000e+00 1704 -6.2500000000000000e-02 1705 6.2500000000000000e-02 1706 -6.2500000000000000e-02 1707 -6.2500000000000000e-02 1708 -6.2500000000000000e-02 1709 6.2500000000000000e-02 1710 6.2500000000000000e-02 1711 6.2500000000000000e-02 1712 -6.2500000000000000e-02 1713 1.2500000000000000e-01 1714 0.0000000000000000e+00 1715 1.2500000000000000e-01 1716 -6.2500000000000000e-02 1717 -6.2500000000000000e-02 1718 6.2500000000000000e-02 1719 6.2500000000000000e-02 1720 -1.2500000000000000e-01 1721 -1.2500000000000000e-01 1722 0.0000000000000000e+00 1723 0.0000000000000000e+00 1724 0.0000000000000000e+00 1725 0.0000000000000000e+00 1726 0.0000000000000000e+00 1727 -1.2500000000000000e-01 1728 0.0000000000000000e+00 1729 -1.2500000000000000e-01 1730 0.0000000000000000e+00 1731 -1.2500000000000000e-01 1732 1.2500000000000000e-01 1733 1.2500000000000000e-01 1734 1.2500000000000000e-01 1735 1.2500000000000000e-01 1736 0.0000000000000000e+00 1737 0.0000000000000000e+00 1738 0.0000000000000000e+00 1739 -1.2500000000000000e-01 1740 0.0000000000000000e+00 1741 1.2500000000000000e-01 1742 1.2500000000000000e-01 1743 0.0000000000000000e+00 1744 0.0000000000000000e+00 1745 0.0000000000000000e+00 1746 0.0000000000000000e+00 1747 0.0000000000000000e+00 1748 0.0000000000000000e+00 1749 0.0000000000000000e+00 1750 0.0000000000000000e+00 1751 0.0000000000000000e+00 1752 0.0000000000000000e+00 1753 0.0000000000000000e+00 1754 1.2500000000000000e-01 1755 1.2500000000000000e-01 1756 0.0000000000000000e+00 1757 0.0000000000000000e+00 1758 0.0000000000000000e+00 1759 0.0000000000000000e+00 1760 1.2500000000000000e-01 1761 -1.2500000000000000e-01 1762 -1.2500000000000000e-01 1763 0.0000000000000000e+00 1764 0.0000000000000000e+00 1765 0.0000000000000000e+00 1766 -1.2500000000000000e-01 1767 -1.2500000000000000e-01 1768 -1.2500000000000000e-01 1769 0.0000000000000000e+00 1770 0.0000000000000000e+00 1771 -1.2500000000000000e-01 1772 0.0000000000000000e+00 1773 0.0000000000000000e+00 1774 1.2500000000000000e-01 1775 1.2500000000000000e-01 1776 -1.2500000000000000e-01 1777 0.0000000000000000e+00 1778 0.0000000000000000e+00 1779 1.2500000000000000e-01 1780 0.0000000000000000e+00 1781 0.0000000000000000e+00 1782 0.0000000000000000e+00 1783 0.0000000000000000e+00 1784 -1.2500000000000000e-01 1785 -1.2500000000000000e-01 1786 -1.2500000000000000e-01 1787 0.0000000000000000e+00 1788 0.0000000000000000e+00 1789 -1.2500000000000000e-01 1790 -1.2500000000000000e-01 1791 -1.2500000000000000e-01 1792 0.0000000000000000e+00 1793 -1.2500000000000000e-01 1794 1.2500000000000000e-01 1795 -1.2500000000000000e-01 1796 0.0000000000000000e+00 1797 -1.2500000000000000e-01 1798 -1.2500000000000000e-01 1799 0.0000000000000000e+00 1800 -1.2500000000000000e-01 1801 -1.2500000000000000e-01 1802 1.2500000000000000e-01 1803 1.2500000000000000e-01 1804 0.0000000000000000e+00 1805 0.0000000000000000e+00 1806 -1.2500000000000000e-01 1807 -1.2500000000000000e-01 1808 0.0000000000000000e+00 1809 0.0000000000000000e+00 1810 1.2500000000000000e-01 1811 1.2500000000000000e-01 1812 0.0000000000000000e+00 1813 -1.2500000000000000e-01 1814 0.0000000000000000e+00 1815 -1.2500000000000000e-01 1816 0.0000000000000000e+00 1817 0.0000000000000000e+00 1818 -1.2500000000000000e-01 1819 1.2500000000000000e-01 1820 -1.2500000000000000e-01 1821 -1.2500000000000000e-01 1822 0.0000000000000000e+00 1823 -1.2500000000000000e-01 1824 0.0000000000000000e+00 1825 -1.2500000000000000e-01 1826 1.2500000000000000e-01 1827 1.2500000000000000e-01 1828 0.0000000000000000e+00 1829 0.0000000000000000e+00 1830 0.0000000000000000e+00 1831 0.0000000000000000e+00 1832 -1.2500000000000000e-01 1833 1.2500000000000000e-01 1834 0.0000000000000000e+00 1835 1.2500000000000000e-01 1836 1.2500000000000000e-01 1837 0.0000000000000000e+00 1838 0.0000000000000000e+00 1839 -1.2500000000000000e-01 1840 1.2500000000000000e-01 1841 1.2500000000000000e-01 1842 0.0000000000000000e+00 1843 0.0000000000000000e+00 1844 0.0000000000000000e+00 1845 0.0000000000000000e+00 1846 0.0000000000000000e+00 1847 1.2500000000000000e-01 1848 -1.2500000000000000e-01 1849 -6.2500000000000000e-02 1850 1.2500000000000000e-01 1851 6.2500000000000000e-02 1852 0.0000000000000000e+00 1853 -6.2500000000000000e-02 1854 0.0000000000000000e+00 1855 6.2500000000000000e-02 1856 0.0000000000000000e+00 1857 -6.2500000000000000e-02 1858 0.0000000000000000e+00 1859 6.2500000000000000e-02 1860 -6.2500000000000000e-02 1861 6.2500000000000000e-02 1862 6.2500000000000000e-02 1863 -6.2500000000000000e-02 1864 6.2500000000000000e-02 1865 6.2500000000000000e-02 1866 6.2500000000000000e-02 1867 -6.2500000000000000e-02 1868 -6.2500000000000000e-02 1869 -6.2500000000000000e-02 1870 6.2500000000000000e-02 1871 0.0000000000000000e+00 1872 -6.2500000000000000e-02 1873 -6.2500000000000000e-02 1874 6.2500000000000000e-02 1875 6.2500000000000000e-02 1876 0.0000000000000000e+00 1877 6.2500000000000000e-02 1878 0.0000000000000000e+00 1879 6.2500000000000000e-02 1880 0.0000000000000000e+00 1881 6.2500000000000000e-02 1882 0.0000000000000000e+00 1883 6.2500000000000000e-02 1884 1.2500000000000000e-01 1885 0.0000000000000000e+00 1886 6.2500000000000000e-02 1887 6.2500000000000000e-02 1888 6.2500000000000000e-02 1889 -6.2500000000000000e-02 1890 6.2500000000000000e-02 1891 6.2500000000000000e-02 1892 6.2500000000000000e-02 1893 6.2500000000000000e-02 1894 -6.2500000000000000e-02 1895 6.2500000000000000e-02 1896 6.2500000000000000e-02 1897 1.2500000000000000e-01 1898 6.2500000000000000e-02 1899 -6.2500000000000000e-02 1900 6.2500000000000000e-02 1901 6.2500000000000000e-02 1902 -1.2500000000000000e-01 1903 1.2500000000000000e-01 1904 0.0000000000000000e+00 1905 1.2500000000000000e-01 1906 6.2500000000000000e-02 1907 0.0000000000000000e+00 1908 0.0000000000000000e+00 1909 -6.2500000000000000e-02 1910 6.2500000000000000e-02 1911 0.0000000000000000e+00 1912 0.0000000000000000e+00 1913 -6.2500000000000000e-02 1914 6.2500000000000000e-02 1915 0.0000000000000000e+00 1916 0.0000000000000000e+00 1917 6.2500000000000000e-02 1918 -6.2500000000000000e-02 1919 6.2500000000000000e-02 1920 6.2500000000000000e-02 1921 6.2500000000000000e-02 1922 -6.2500000000000000e-02 1923 -6.2500000000000000e-02 1924 1.2500000000000000e-01 1925 0.0000000000000000e+00 1926 0.0000000000000000e+00 1927 -6.2500000000000000e-02 1928 1.2500000000000000e-01 1929 0.0000000000000000e+00 1930 1.2500000000000000e-01 1931 0.0000000000000000e+00 1932 -6.2500000000000000e-02 1933 0.0000000000000000e+00 1934 -6.2500000000000000e-02 1935 -6.2500000000000000e-02 1936 1.2500000000000000e-01 1937 -1.2500000000000000e-01 1938 -6.2500000000000000e-02 1939 -6.2500000000000000e-02 1940 1.2500000000000000e-01 1941 6.2500000000000000e-02 1942 -6.2500000000000000e-02 1943 -6.2500000000000000e-02 1944 -6.2500000000000000e-02 1945 -6.2500000000000000e-02 1946 -6.2500000000000000e-02 1947 6.2500000000000000e-02 1948 -6.2500000000000000e-02 1949 -6.2500000000000000e-02 1950 0.0000000000000000e+00 1951 -1.2500000000000000e-01 1952 -6.2500000000000000e-02 1953 6.2500000000000000e-02 1954 -6.2500000000000000e-02 1955 -6.2500000000000000e-02 1956 1.2500000000000000e-01 1957 -1.2500000000000000e-01 1958 -6.2500000000000000e-02 1959 0.0000000000000000e+00 1960 6.2500000000000000e-02 1961 0.0000000000000000e+00 1962 -6.2500000000000000e-02 1963 0.0000000000000000e+00 1964 6.2500000000000000e-02 1965 0.0000000000000000e+00 1966 -6.2500000000000000e-02 1967 6.2500000000000000e-02 1968 -6.2500000000000000e-02 1969 -6.2500000000000000e-02 1970 -6.2500000000000000e-02 1971 -6.2500000000000000e-02 1972 6.2500000000000000e-02 1973 -6.2500000000000000e-02 1974 6.2500000000000000e-02 1975 6.2500000000000000e-02 1976 1.2500000000000000e-01 1977 1.2500000000000000e-01 1978 0.0000000000000000e+00 1979 0.0000000000000000e+00 1980 0.0000000000000000e+00 1981 -1.2500000000000000e-01 1982 1.2500000000000000e-01 1983 1.2500000000000000e-01 1984 -1.2500000000000000e-01 1985 0.0000000000000000e+00 1986 0.0000000000000000e+00 1987 0.0000000000000000e+00 1988 -1.2500000000000000e-01 1989 1.2500000000000000e-01 1990 1.2500000000000000e-01 1991 -1.2500000000000000e-01 1992 -1.2500000000000000e-01 1993 0.0000000000000000e+00 1994 0.0000000000000000e+00 1995 1.2500000000000000e-01 1996 0.0000000000000000e+00 1997 -1.2500000000000000e-01 1998 0.0000000000000000e+00 1999 1.2500000000000000e-01 2000 0.0000000000000000e+00 2001 1.2500000000000000e-01 2002 0.0000000000000000e+00 2003 -1.2500000000000000e-01 2004 1.2500000000000000e-01 2005 1.2500000000000000e-01 2006 1.2500000000000000e-01 2007 0.0000000000000000e+00 2008 -1.2500000000000000e-01 2009 1.2500000000000000e-01 2010 1.2500000000000000e-01 2011 0.0000000000000000e+00 2012 0.0000000000000000e+00 2013 -1.2500000000000000e-01 2014 1.2500000000000000e-01 2015 1.2500000000000000e-01 2016 1.2500000000000000e-01 2017 -1.2500000000000000e-01 2018 -1.2500000000000000e-01 2019 0.0000000000000000e+00 2020 0.0000000000000000e+00 2021 1.2500000000000000e-01 2022 0.0000000000000000e+00 2023 0.0000000000000000e+00 2024 0.0000000000000000e+00 2025 1.2500000000000000e-01 2026 1.2500000000000000e-01 2027 1.2500000000000000e-01 2028 0.0000000000000000e+00 2029 0.0000000000000000e+00 2030 -1.2500000000000000e-01 2031 0.0000000000000000e+00 2032 0.0000000000000000e+00 2033 0.0000000000000000e+00 2034 0.0000000000000000e+00 2035 1.2500000000000000e-01 2036 -1.2500000000000000e-01 2037 -1.2500000000000000e-01 2038 0.0000000000000000e+00 2039 0.0000000000000000e+00 2040 1.2500000000000000e-01 2041 1.2500000000000000e-01 2042 1.2500000000000000e-01 2043 0.0000000000000000e+00 2044 -1.2500000000000000e-01 2045 -6.2500000000000000e-02 2046 1.2500000000000000e-01 2047 0.0000000000000000e+00 2048 6.2500000000000000e-02 2049 6.2500000000000000e-02 2050 0.0000000000000000e+00 2051 -6.2500000000000000e-02 2052 -6.2500000000000000e-02 2053 1.2500000000000000e-01 2054 -6.2500000000000000e-02 2055 -6.2500000000000000e-02 2056 6.2500000000000000e-02 2057 6.2500000000000000e-02 2058 -1.2500000000000000e-01 2059 -1.2500000000000000e-01 2060 0.0000000000000000e+00 2061 1.2500000000000000e-01 2062 -1.2500000000000000e-01 2063 0.0000000000000000e+00 2064 -1.2500000000000000e-01 2065 0.0000000000000000e+00 2066 0.0000000000000000e+00 2067 0.0000000000000000e+00 2068 0.0000000000000000e+00 2069 -1.2500000000000000e-01 2070 -1.2500000000000000e-01 2071 -1.2500000000000000e-01 2072 -1.2500000000000000e-01 2073 -1.2500000000000000e-01 2074 -1.2500000000000000e-01 2075 -1.2500000000000000e-01 2076 0.0000000000000000e+00 2077 -1.2500000000000000e-01 2078 0.0000000000000000e+00 2079 -1.2500000000000000e-01 2080 -1.2500000000000000e-01 2081 -1.2500000000000000e-01 2082 -1.2500000000000000e-01 2083 0.0000000000000000e+00 2084 0.0000000000000000e+00 2085 0.0000000000000000e+00 2086 -1.2500000000000000e-01 2087 1.2500000000000000e-01 2088 0.0000000000000000e+00 2089 0.0000000000000000e+00 2090 0.0000000000000000e+00 2091 0.0000000000000000e+00 2092 0.0000000000000000e+00 2093 0.0000000000000000e+00 2094 0.0000000000000000e+00 2095 -1.2500000000000000e-01 2096 0.0000000000000000e+00 2097 -1.2500000000000000e-01 2098 0.0000000000000000e+00 2099 0.0000000000000000e+00 2100 0.0000000000000000e+00 2101 -1.2500000000000000e-01 2102 0.0000000000000000e+00 2103 1.2500000000000000e-01 2104 0.0000000000000000e+00 2105 0.0000000000000000e+00 2106 1.2500000000000000e-01 2107 0.0000000000000000e+00 2108 0.0000000000000000e+00 2109 0.0000000000000000e+00 2110 -1.2500000000000000e-01 2111 -1.2500000000000000e-01 2112 -1.2500000000000000e-01 2113 -1.2500000000000000e-01 2114 -1.2500000000000000e-01 2115 0.0000000000000000e+00 2116 0.0000000000000000e+00 2117 0.0000000000000000e+00 2118 0.0000000000000000e+00 2119 1.2500000000000000e-01 2120 -1.2500000000000000e-01 2121 1.2500000000000000e-01 2122 0.0000000000000000e+00 2123 0.0000000000000000e+00 2124 0.0000000000000000e+00 2125 0.0000000000000000e+00 2126 0.0000000000000000e+00 2127 0.0000000000000000e+00 2128 0.0000000000000000e+00 2129 0.0000000000000000e+00 2130 0.0000000000000000e+00 2131 0.0000000000000000e+00 2132 1.2500000000000000e-01 2133 0.0000000000000000e+00 2134 0.0000000000000000e+00 2135 -1.2500000000000000e-01 2136 0.0000000000000000e+00 2137 1.2500000000000000e-01 2138 0.0000000000000000e+00 2139 -1.2500000000000000e-01 2140 -1.2500000000000000e-01 2141 0.0000000000000000e+00 2142 0.0000000000000000e+00 2143 0.0000000000000000e+00 2144 -1.2500000000000000e-01 2145 0.0000000000000000e+00 2146 0.0000000000000000e+00 2147 -1.2500000000000000e-01 2148 -6.2500000000000000e-02 2149 -6.2500000000000000e-02 2150 0.0000000000000000e+00 2151 0.0000000000000000e+00 2152 -1.2500000000000000e-01 2153 -1.2500000000000000e-01 2154 -1.2500000000000000e-01 2155 0.0000000000000000e+00 2156 0.0000000000000000e+00 2157 -6.2500000000000000e-02 2158 -6.2500000000000000e-02 2159 0.0000000000000000e+00 2160 -6.2500000000000000e-02 2161 0.0000000000000000e+00 2162 0.0000000000000000e+00 2163 0.0000000000000000e+00 2164 -1.2500000000000000e-01 2165 0.0000000000000000e+00 2166 1.2500000000000000e-01 2167 -1.2500000000000000e-01 2168 -6.2500000000000000e-02 2169 0.0000000000000000e+00 2170 0.0000000000000000e+00 2171 0.0000000000000000e+00 2172 0.0000000000000000e+00 2173 -1.2500000000000000e-01 2174 1.2500000000000000e-01 2175 0.0000000000000000e+00 2176 -1.2500000000000000e-01 2177 1.2500000000000000e-01 2178 0.0000000000000000e+00 2179 -1.2500000000000000e-01 2180 0.0000000000000000e+00 2181 0.0000000000000000e+00 2182 0.0000000000000000e+00 2183 -1.2500000000000000e-01 2184 1.2500000000000000e-01 2185 1.2500000000000000e-01 2186 0.0000000000000000e+00 2187 0.0000000000000000e+00 2188 -1.2500000000000000e-01 2189 -1.2500000000000000e-01 2190 1.2500000000000000e-01 2191 0.0000000000000000e+00 2192 0.0000000000000000e+00 2193 0.0000000000000000e+00 2194 0.0000000000000000e+00 2195 -1.2500000000000000e-01 2196 -1.2500000000000000e-01 2197 0.0000000000000000e+00 2198 0.0000000000000000e+00 2199 6.2500000000000000e-02 2200 1.2500000000000000e-01 2201 6.2500000000000000e-02 2202 0.0000000000000000e+00 2203 6.2500000000000000e-02 2204 -6.2500000000000000e-02 2205 -6.2500000000000000e-02 2206 6.2500000000000000e-02 2207 6.2500000000000000e-02 2208 -6.2500000000000000e-02 2209 6.2500000000000000e-02 2210 6.2500000000000000e-02 2211 -6.2500000000000000e-02 2212 6.2500000000000000e-02 2213 0.0000000000000000e+00 2214 -6.2500000000000000e-02 2215 0.0000000000000000e+00 2216 0.0000000000000000e+00 2217 6.2500000000000000e-02 2218 6.2500000000000000e-02 2219 -6.2500000000000000e-02 2220 -1.2500000000000000e-01 2221 -6.2500000000000000e-02 2222 0.0000000000000000e+00 2223 1.2500000000000000e-01 2224 6.2500000000000000e-02 2225 6.2500000000000000e-02 2226 -6.2500000000000000e-02 2227 6.2500000000000000e-02 2228 6.2500000000000000e-02 2229 6.2500000000000000e-02 2230 6.2500000000000000e-02 2231 6.2500000000000000e-02 2232 -6.2500000000000000e-02 2233 0.0000000000000000e+00 2234 0.0000000000000000e+00 2235 0.0000000000000000e+00 2236 -6.2500000000000000e-02 2237 -6.2500000000000000e-02 2238 -6.2500000000000000e-02 2239 6.2500000000000000e-02 2240 6.2500000000000000e-02 2241 0.0000000000000000e+00 2242 -6.2500000000000000e-02 2243 -6.2500000000000000e-02 2244 -6.2500000000000000e-02 2245 6.2500000000000000e-02 2246 0.0000000000000000e+00 2247 6.2500000000000000e-02 2248 0.0000000000000000e+00 2249 6.2500000000000000e-02 2250 6.2500000000000000e-02 2251 6.2500000000000000e-02 2252 -1.2500000000000000e-01 2253 6.2500000000000000e-02 2254 6.2500000000000000e-02 2255 6.2500000000000000e-02 2256 6.2500000000000000e-02 2257 -6.2500000000000000e-02 2258 6.2500000000000000e-02 2259 1.2500000000000000e-01 2260 0.0000000000000000e+00 2261 0.0000000000000000e+00 2262 6.2500000000000000e-02 2263 0.0000000000000000e+00 2264 1.2500000000000000e-01 2265 -1.2500000000000000e-01 2266 1.2500000000000000e-01 2267 6.2500000000000000e-02 2268 6.2500000000000000e-02 2269 6.2500000000000000e-02 2270 0.0000000000000000e+00 2271 -6.2500000000000000e-02 2272 0.0000000000000000e+00 2273 -1.2500000000000000e-01 2274 1.2500000000000000e-01 2275 6.2500000000000000e-02 2276 6.2500000000000000e-02 2277 6.2500000000000000e-02 2278 0.0000000000000000e+00 2279 -6.2500000000000000e-02 2280 0.0000000000000000e+00 2281 -6.2500000000000000e-02 2282 6.2500000000000000e-02 2283 -6.2500000000000000e-02 2284 6.2500000000000000e-02 2285 0.0000000000000000e+00 2286 6.2500000000000000e-02 2287 0.0000000000000000e+00 2288 -6.2500000000000000e-02 2289 -1.2500000000000000e-01 2290 -6.2500000000000000e-02 2291 6.2500000000000000e-02 2292 0.0000000000000000e+00 2293 -6.2500000000000000e-02 2294 6.2500000000000000e-02 2295 6.2500000000000000e-02 2296 -6.2500000000000000e-02 2297 6.2500000000000000e-02 2298 -6.2500000000000000e-02 2299 -6.2500000000000000e-02 2300 6.2500000000000000e-02 2301 -6.2500000000000000e-02 2302 0.0000000000000000e+00 2303 -6.2500000000000000e-02 2304 -6.2500000000000000e-02 2305 -6.2500000000000000e-02 2306 6.2500000000000000e-02 2307 0.0000000000000000e+00 2308 6.2500000000000000e-02 2309 6.2500000000000000e-02 2310 0.0000000000000000e+00 2311 6.2500000000000000e-02 2312 1.2500000000000000e-01 2313 -6.2500000000000000e-02 2314 -6.2500000000000000e-02 2315 1.2500000000000000e-01 2316 0.0000000000000000e+00 2317 -1.2500000000000000e-01 2318 -1.2500000000000000e-01 2319 0.0000000000000000e+00 2320 -1.2500000000000000e-01 2321 0.0000000000000000e+00 2322 0.0000000000000000e+00 2323 0.0000000000000000e+00 2324 0.0000000000000000e+00 2325 0.0000000000000000e+00 2326 0.0000000000000000e+00 2327 0.0000000000000000e+00 2328 -1.2500000000000000e-01 2329 0.0000000000000000e+00 2330 -1.2500000000000000e-01 2331 0.0000000000000000e+00 2332 0.0000000000000000e+00 hypre-2.33.0/src/test/TEST_ams/mfem.Gx.00002000066400000000000000000001141001477326011500200020ustar00rootroot000000000000002333 3709 2333 -1.2500000000000000e-01 2334 -1.2500000000000000e-01 2335 -6.2500000000000000e-02 2336 -1.2500000000000000e-01 2337 0.0000000000000000e+00 2338 0.0000000000000000e+00 2339 0.0000000000000000e+00 2340 1.2500000000000000e-01 2341 1.2500000000000000e-01 2342 1.2500000000000000e-01 2343 1.2500000000000000e-01 2344 1.2500000000000000e-01 2345 1.2500000000000000e-01 2346 1.2500000000000000e-01 2347 2.5000000000000000e-01 2348 0.0000000000000000e+00 2349 -1.2500000000000000e-01 2350 -2.5000000000000000e-01 2351 -1.2500000000000000e-01 2352 1.2500000000000000e-01 2353 1.2500000000000000e-01 2354 6.2500000000000000e-02 2355 1.2500000000000000e-01 2356 0.0000000000000000e+00 2357 6.2500000000000000e-02 2358 0.0000000000000000e+00 2359 0.0000000000000000e+00 2360 0.0000000000000000e+00 2361 -6.2500000000000000e-02 2362 1.2500000000000000e-01 2363 0.0000000000000000e+00 2364 0.0000000000000000e+00 2365 0.0000000000000000e+00 2366 -6.2500000000000000e-02 2367 0.0000000000000000e+00 2368 6.2500000000000000e-02 2369 1.2500000000000000e-01 2370 1.2500000000000000e-01 2371 -1.2500000000000000e-01 2372 -1.2500000000000000e-01 2373 1.2500000000000000e-01 2374 -1.2500000000000000e-01 2375 0.0000000000000000e+00 2376 0.0000000000000000e+00 2377 1.2500000000000000e-01 2378 -1.2500000000000000e-01 2379 0.0000000000000000e+00 2380 -6.2500000000000000e-02 2381 -6.2500000000000000e-02 2382 0.0000000000000000e+00 2383 6.2500000000000000e-02 2384 0.0000000000000000e+00 2385 0.0000000000000000e+00 2386 -6.2500000000000000e-02 2387 6.2500000000000000e-02 2388 1.2500000000000000e-01 2389 -1.2500000000000000e-01 2390 -1.2500000000000000e-01 2391 -6.2500000000000000e-02 2392 1.2500000000000000e-01 2393 1.2500000000000000e-01 2394 6.2500000000000000e-02 2395 6.2500000000000000e-02 2396 1.2500000000000000e-01 2397 0.0000000000000000e+00 2398 0.0000000000000000e+00 2399 0.0000000000000000e+00 2400 1.2500000000000000e-01 2401 -1.2500000000000000e-01 2402 -1.2500000000000000e-01 2403 0.0000000000000000e+00 2404 0.0000000000000000e+00 2405 0.0000000000000000e+00 2406 -6.2500000000000000e-02 2407 1.2500000000000000e-01 2408 1.2500000000000000e-01 2409 1.2500000000000000e-01 2410 1.2500000000000000e-01 2411 1.2500000000000000e-01 2412 0.0000000000000000e+00 2413 0.0000000000000000e+00 2414 -1.2500000000000000e-01 2415 1.2500000000000000e-01 2416 1.2500000000000000e-01 2417 0.0000000000000000e+00 2418 0.0000000000000000e+00 2419 -6.2500000000000000e-02 2420 0.0000000000000000e+00 2421 0.0000000000000000e+00 2422 -6.2500000000000000e-02 2423 0.0000000000000000e+00 2424 0.0000000000000000e+00 2425 -6.2500000000000000e-02 2426 1.2500000000000000e-01 2427 1.2500000000000000e-01 2428 1.2500000000000000e-01 2429 0.0000000000000000e+00 2430 1.2500000000000000e-01 2431 1.2500000000000000e-01 2432 0.0000000000000000e+00 2433 1.2500000000000000e-01 2434 -1.2500000000000000e-01 2435 -1.2500000000000000e-01 2436 -1.2500000000000000e-01 2437 -1.2500000000000000e-01 2438 1.2500000000000000e-01 2439 1.2500000000000000e-01 2440 1.2500000000000000e-01 2441 -1.2500000000000000e-01 2442 0.0000000000000000e+00 2443 -6.2500000000000000e-02 2444 -1.2500000000000000e-01 2445 -6.2500000000000000e-02 2446 1.2500000000000000e-01 2447 1.2500000000000000e-01 2448 0.0000000000000000e+00 2449 1.2500000000000000e-01 2450 1.2500000000000000e-01 2451 -1.2500000000000000e-01 2452 -1.2500000000000000e-01 2453 -1.2500000000000000e-01 2454 0.0000000000000000e+00 2455 0.0000000000000000e+00 2456 -1.2500000000000000e-01 2457 0.0000000000000000e+00 2458 0.0000000000000000e+00 2459 -1.2500000000000000e-01 2460 1.2500000000000000e-01 2461 1.2500000000000000e-01 2462 1.2500000000000000e-01 2463 0.0000000000000000e+00 2464 0.0000000000000000e+00 2465 1.2500000000000000e-01 2466 1.2500000000000000e-01 2467 6.2500000000000000e-02 2468 6.2500000000000000e-02 2469 1.2500000000000000e-01 2470 6.2500000000000000e-02 2471 0.0000000000000000e+00 2472 0.0000000000000000e+00 2473 -6.2500000000000000e-02 2474 -1.2500000000000000e-01 2475 -6.2500000000000000e-02 2476 0.0000000000000000e+00 2477 0.0000000000000000e+00 2478 1.2500000000000000e-01 2479 6.2500000000000000e-02 2480 1.2500000000000000e-01 2481 1.2500000000000000e-01 2482 0.0000000000000000e+00 2483 6.2500000000000000e-02 2484 1.2500000000000000e-01 2485 1.2500000000000000e-01 2486 6.2500000000000000e-02 2487 0.0000000000000000e+00 2488 -6.2500000000000000e-02 2489 0.0000000000000000e+00 2490 0.0000000000000000e+00 2491 1.2500000000000000e-01 2492 1.2500000000000000e-01 2493 1.2500000000000000e-01 2494 1.2500000000000000e-01 2495 -1.2500000000000000e-01 2496 -1.2500000000000000e-01 2497 -6.2500000000000000e-02 2498 0.0000000000000000e+00 2499 0.0000000000000000e+00 2500 1.2500000000000000e-01 2501 1.2500000000000000e-01 2502 1.2500000000000000e-01 2503 -1.2500000000000000e-01 2504 0.0000000000000000e+00 2505 1.2500000000000000e-01 2506 1.2500000000000000e-01 2507 1.2500000000000000e-01 2508 1.2500000000000000e-01 2509 1.2500000000000000e-01 2510 6.2500000000000000e-02 2511 0.0000000000000000e+00 2512 0.0000000000000000e+00 2513 0.0000000000000000e+00 2514 1.2500000000000000e-01 2515 0.0000000000000000e+00 2516 0.0000000000000000e+00 2517 6.2500000000000000e-02 2518 1.2500000000000000e-01 2519 0.0000000000000000e+00 2520 1.2500000000000000e-01 2521 1.2500000000000000e-01 2522 -1.2500000000000000e-01 2523 0.0000000000000000e+00 2524 -6.2500000000000000e-02 2525 -6.2500000000000000e-02 2526 0.0000000000000000e+00 2527 6.2500000000000000e-02 2528 1.2500000000000000e-01 2529 1.2500000000000000e-01 2530 6.2500000000000000e-02 2531 6.2500000000000000e-02 2532 1.2500000000000000e-01 2533 0.0000000000000000e+00 2534 0.0000000000000000e+00 2535 -6.2500000000000000e-02 2536 1.2500000000000000e-01 2537 6.2500000000000000e-02 2538 1.2500000000000000e-01 2539 0.0000000000000000e+00 2540 0.0000000000000000e+00 2541 -6.2500000000000000e-02 2542 -1.2500000000000000e-01 2543 -1.2500000000000000e-01 2544 -1.2500000000000000e-01 2545 -1.2500000000000000e-01 2546 0.0000000000000000e+00 2547 0.0000000000000000e+00 2548 -1.2500000000000000e-01 2549 -1.2500000000000000e-01 2550 -6.2500000000000000e-02 2551 1.2500000000000000e-01 2552 1.2500000000000000e-01 2553 0.0000000000000000e+00 2554 0.0000000000000000e+00 2555 0.0000000000000000e+00 2556 -1.2500000000000000e-01 2557 1.2500000000000000e-01 2558 1.2500000000000000e-01 2559 1.2500000000000000e-01 2560 0.0000000000000000e+00 2561 0.0000000000000000e+00 2562 0.0000000000000000e+00 2563 1.2500000000000000e-01 2564 0.0000000000000000e+00 2565 -1.2500000000000000e-01 2566 -1.2500000000000000e-01 2567 -1.2500000000000000e-01 2568 -1.2500000000000000e-01 2569 -1.2500000000000000e-01 2570 -1.2500000000000000e-01 2571 1.2500000000000000e-01 2572 0.0000000000000000e+00 2573 1.2500000000000000e-01 2574 0.0000000000000000e+00 2575 0.0000000000000000e+00 2576 -1.2500000000000000e-01 2577 1.2500000000000000e-01 2578 1.2500000000000000e-01 2579 1.2500000000000000e-01 2580 0.0000000000000000e+00 2581 0.0000000000000000e+00 2582 1.2500000000000000e-01 2583 -1.2500000000000000e-01 2584 0.0000000000000000e+00 2585 1.2500000000000000e-01 2586 1.2500000000000000e-01 2587 -1.2500000000000000e-01 2588 -1.2500000000000000e-01 2589 0.0000000000000000e+00 2590 -1.2500000000000000e-01 2591 0.0000000000000000e+00 2592 -1.2500000000000000e-01 2593 0.0000000000000000e+00 2594 1.2500000000000000e-01 2595 -1.2500000000000000e-01 2596 0.0000000000000000e+00 2597 0.0000000000000000e+00 2598 -1.2500000000000000e-01 2599 -1.2500000000000000e-01 2600 -1.2500000000000000e-01 2601 1.2500000000000000e-01 2602 1.2500000000000000e-01 2603 1.2500000000000000e-01 2604 1.2500000000000000e-01 2605 1.2500000000000000e-01 2606 -1.2500000000000000e-01 2607 0.0000000000000000e+00 2608 0.0000000000000000e+00 2609 -1.2500000000000000e-01 2610 -1.2500000000000000e-01 2611 -1.2500000000000000e-01 2612 0.0000000000000000e+00 2613 0.0000000000000000e+00 2614 -1.2500000000000000e-01 2615 0.0000000000000000e+00 2616 -2.5000000000000000e-01 2617 -1.2500000000000000e-01 2618 1.2500000000000000e-01 2619 0.0000000000000000e+00 2620 0.0000000000000000e+00 2621 -1.2500000000000000e-01 2622 0.0000000000000000e+00 2623 1.2500000000000000e-01 2624 0.0000000000000000e+00 2625 0.0000000000000000e+00 2626 1.2500000000000000e-01 2627 1.2500000000000000e-01 2628 -1.2500000000000000e-01 2629 -1.2500000000000000e-01 2630 -1.2500000000000000e-01 2631 -1.2500000000000000e-01 2632 1.2500000000000000e-01 2633 -1.2500000000000000e-01 2634 -1.2500000000000000e-01 2635 -1.2500000000000000e-01 2636 0.0000000000000000e+00 2637 -1.2500000000000000e-01 2638 0.0000000000000000e+00 2639 -1.2500000000000000e-01 2640 1.2500000000000000e-01 2641 1.2500000000000000e-01 2642 -1.2500000000000000e-01 2643 0.0000000000000000e+00 2644 0.0000000000000000e+00 2645 0.0000000000000000e+00 2646 -1.2500000000000000e-01 2647 1.2500000000000000e-01 2648 1.2500000000000000e-01 2649 1.2500000000000000e-01 2650 1.2500000000000000e-01 2651 -1.2500000000000000e-01 2652 -1.2500000000000000e-01 2653 0.0000000000000000e+00 2654 -1.2500000000000000e-01 2655 0.0000000000000000e+00 2656 1.2500000000000000e-01 2657 1.2500000000000000e-01 2658 1.2500000000000000e-01 2659 0.0000000000000000e+00 2660 1.2500000000000000e-01 2661 1.2500000000000000e-01 2662 1.2500000000000000e-01 2663 0.0000000000000000e+00 2664 1.2500000000000000e-01 2665 0.0000000000000000e+00 2666 0.0000000000000000e+00 2667 1.2500000000000000e-01 2668 0.0000000000000000e+00 2669 0.0000000000000000e+00 2670 0.0000000000000000e+00 2671 -6.2500000000000000e-02 2672 1.2500000000000000e-01 2673 0.0000000000000000e+00 2674 1.2500000000000000e-01 2675 -1.2500000000000000e-01 2676 0.0000000000000000e+00 2677 0.0000000000000000e+00 2678 -1.2500000000000000e-01 2679 -1.2500000000000000e-01 2680 0.0000000000000000e+00 2681 -1.2500000000000000e-01 2682 1.2500000000000000e-01 2683 1.2500000000000000e-01 2684 0.0000000000000000e+00 2685 0.0000000000000000e+00 2686 0.0000000000000000e+00 2687 1.2500000000000000e-01 2688 1.2500000000000000e-01 2689 1.2500000000000000e-01 2690 1.2500000000000000e-01 2691 1.2500000000000000e-01 2692 1.2500000000000000e-01 2693 -1.2500000000000000e-01 2694 0.0000000000000000e+00 2695 1.2500000000000000e-01 2696 0.0000000000000000e+00 2697 -1.2500000000000000e-01 2698 -1.2500000000000000e-01 2699 1.2500000000000000e-01 2700 0.0000000000000000e+00 2701 0.0000000000000000e+00 2702 -1.2500000000000000e-01 2703 0.0000000000000000e+00 2704 -1.2500000000000000e-01 2705 -1.2500000000000000e-01 2706 1.2500000000000000e-01 2707 1.2500000000000000e-01 2708 1.2500000000000000e-01 2709 -1.2500000000000000e-01 2710 -1.2500000000000000e-01 2711 -1.2500000000000000e-01 2712 0.0000000000000000e+00 2713 0.0000000000000000e+00 2714 0.0000000000000000e+00 2715 -1.2500000000000000e-01 2716 -1.2500000000000000e-01 2717 -1.2500000000000000e-01 2718 -1.2500000000000000e-01 2719 0.0000000000000000e+00 2720 0.0000000000000000e+00 2721 -2.5000000000000000e-01 2722 0.0000000000000000e+00 2723 1.2500000000000000e-01 2724 0.0000000000000000e+00 2725 -1.2500000000000000e-01 2726 -1.2500000000000000e-01 2727 -1.2500000000000000e-01 2728 1.2500000000000000e-01 2729 1.2500000000000000e-01 2730 1.2500000000000000e-01 2731 0.0000000000000000e+00 2732 -1.2500000000000000e-01 2733 -1.2500000000000000e-01 2734 1.2500000000000000e-01 2735 0.0000000000000000e+00 2736 0.0000000000000000e+00 2737 1.2500000000000000e-01 2738 -1.2500000000000000e-01 2739 -1.2500000000000000e-01 2740 -1.2500000000000000e-01 2741 0.0000000000000000e+00 2742 -1.2500000000000000e-01 2743 -1.2500000000000000e-01 2744 -1.2500000000000000e-01 2745 0.0000000000000000e+00 2746 0.0000000000000000e+00 2747 0.0000000000000000e+00 2748 0.0000000000000000e+00 2749 -1.2500000000000000e-01 2750 -1.2500000000000000e-01 2751 0.0000000000000000e+00 2752 0.0000000000000000e+00 2753 1.2500000000000000e-01 2754 0.0000000000000000e+00 2755 1.2500000000000000e-01 2756 0.0000000000000000e+00 2757 -1.2500000000000000e-01 2758 0.0000000000000000e+00 2759 -1.2500000000000000e-01 2760 -1.2500000000000000e-01 2761 1.2500000000000000e-01 2762 1.2500000000000000e-01 2763 -1.2500000000000000e-01 2764 1.2500000000000000e-01 2765 -1.2500000000000000e-01 2766 1.2500000000000000e-01 2767 1.2500000000000000e-01 2768 1.2500000000000000e-01 2769 1.2500000000000000e-01 2770 0.0000000000000000e+00 2771 0.0000000000000000e+00 2772 -1.2500000000000000e-01 2773 0.0000000000000000e+00 2774 1.2500000000000000e-01 2775 -1.2500000000000000e-01 2776 0.0000000000000000e+00 2777 1.2500000000000000e-01 2778 1.2500000000000000e-01 2779 -1.2500000000000000e-01 2780 -1.2500000000000000e-01 2781 -1.2500000000000000e-01 2782 -1.2500000000000000e-01 2783 0.0000000000000000e+00 2784 -1.2500000000000000e-01 2785 0.0000000000000000e+00 2786 -1.2500000000000000e-01 2787 -1.2500000000000000e-01 2788 0.0000000000000000e+00 2789 0.0000000000000000e+00 2790 -1.2500000000000000e-01 2791 0.0000000000000000e+00 2792 -1.2500000000000000e-01 2793 -1.2500000000000000e-01 2794 0.0000000000000000e+00 2795 -1.2500000000000000e-01 2796 -1.2500000000000000e-01 2797 -1.2500000000000000e-01 2798 -1.2500000000000000e-01 2799 -1.2500000000000000e-01 2800 0.0000000000000000e+00 2801 0.0000000000000000e+00 2802 0.0000000000000000e+00 2803 0.0000000000000000e+00 2804 0.0000000000000000e+00 2805 0.0000000000000000e+00 2806 -1.2500000000000000e-01 2807 -1.2500000000000000e-01 2808 0.0000000000000000e+00 2809 1.2500000000000000e-01 2810 0.0000000000000000e+00 2811 1.2500000000000000e-01 2812 1.2500000000000000e-01 2813 1.2500000000000000e-01 2814 1.2500000000000000e-01 2815 2.5000000000000000e-01 2816 1.2500000000000000e-01 2817 1.2500000000000000e-01 2818 0.0000000000000000e+00 2819 0.0000000000000000e+00 2820 1.2500000000000000e-01 2821 -1.2500000000000000e-01 2822 -1.2500000000000000e-01 2823 -1.2500000000000000e-01 2824 0.0000000000000000e+00 2825 0.0000000000000000e+00 2826 1.2500000000000000e-01 2827 1.2500000000000000e-01 2828 1.2500000000000000e-01 2829 1.2500000000000000e-01 2830 0.0000000000000000e+00 2831 1.2500000000000000e-01 2832 1.2500000000000000e-01 2833 1.2500000000000000e-01 2834 0.0000000000000000e+00 2835 1.2500000000000000e-01 2836 -1.2500000000000000e-01 2837 -1.2500000000000000e-01 2838 -1.2500000000000000e-01 2839 1.2500000000000000e-01 2840 0.0000000000000000e+00 2841 0.0000000000000000e+00 2842 1.2500000000000000e-01 2843 1.2500000000000000e-01 2844 1.2500000000000000e-01 2845 0.0000000000000000e+00 2846 0.0000000000000000e+00 2847 6.2500000000000000e-02 2848 1.2500000000000000e-01 2849 1.2500000000000000e-01 2850 1.2500000000000000e-01 2851 6.2500000000000000e-02 2852 0.0000000000000000e+00 2853 -6.2500000000000000e-02 2854 6.2500000000000000e-02 2855 0.0000000000000000e+00 2856 0.0000000000000000e+00 2857 1.2500000000000000e-01 2858 1.2500000000000000e-01 2859 1.2500000000000000e-01 2860 6.2500000000000000e-02 2861 6.2500000000000000e-02 2862 1.2500000000000000e-01 2863 6.2500000000000000e-02 2864 1.2500000000000000e-01 2865 0.0000000000000000e+00 2866 6.2500000000000000e-02 2867 0.0000000000000000e+00 2868 -6.2500000000000000e-02 2869 1.2500000000000000e-01 2870 -1.2500000000000000e-01 2871 0.0000000000000000e+00 2872 -6.2500000000000000e-02 2873 -1.2500000000000000e-01 2874 -6.2500000000000000e-02 2875 1.2500000000000000e-01 2876 1.2500000000000000e-01 2877 1.2500000000000000e-01 2878 0.0000000000000000e+00 2879 0.0000000000000000e+00 2880 0.0000000000000000e+00 2881 0.0000000000000000e+00 2882 -1.2500000000000000e-01 2883 -1.2500000000000000e-01 2884 1.2500000000000000e-01 2885 1.2500000000000000e-01 2886 1.2500000000000000e-01 2887 6.2500000000000000e-02 2888 2.5000000000000000e-01 2889 1.2500000000000000e-01 2890 1.2500000000000000e-01 2891 0.0000000000000000e+00 2892 0.0000000000000000e+00 2893 -1.2500000000000000e-01 2894 0.0000000000000000e+00 2895 -1.2500000000000000e-01 2896 0.0000000000000000e+00 2897 0.0000000000000000e+00 2898 -1.2500000000000000e-01 2899 -1.2500000000000000e-01 2900 1.2500000000000000e-01 2901 1.2500000000000000e-01 2902 1.2500000000000000e-01 2903 1.2500000000000000e-01 2904 -1.2500000000000000e-01 2905 -1.2500000000000000e-01 2906 0.0000000000000000e+00 2907 0.0000000000000000e+00 2908 -1.2500000000000000e-01 2909 -1.2500000000000000e-01 2910 -1.2500000000000000e-01 2911 0.0000000000000000e+00 2912 -1.2500000000000000e-01 2913 -1.2500000000000000e-01 2914 0.0000000000000000e+00 2915 0.0000000000000000e+00 2916 -1.2500000000000000e-01 2917 -1.2500000000000000e-01 2918 0.0000000000000000e+00 2919 -1.2500000000000000e-01 2920 0.0000000000000000e+00 2921 -1.2500000000000000e-01 2922 -1.2500000000000000e-01 2923 0.0000000000000000e+00 2924 0.0000000000000000e+00 2925 -1.2500000000000000e-01 2926 0.0000000000000000e+00 2927 -1.2500000000000000e-01 2928 0.0000000000000000e+00 2929 -1.2500000000000000e-01 2930 -1.2500000000000000e-01 2931 0.0000000000000000e+00 2932 0.0000000000000000e+00 2933 -1.2500000000000000e-01 2934 -1.2500000000000000e-01 2935 0.0000000000000000e+00 2936 -1.2500000000000000e-01 2937 -1.2500000000000000e-01 2938 0.0000000000000000e+00 2939 0.0000000000000000e+00 2940 0.0000000000000000e+00 2941 0.0000000000000000e+00 2942 -1.2500000000000000e-01 2943 -1.2500000000000000e-01 2944 -1.2500000000000000e-01 2945 -1.2500000000000000e-01 2946 0.0000000000000000e+00 2947 0.0000000000000000e+00 2948 0.0000000000000000e+00 2949 -1.2500000000000000e-01 2950 -1.2500000000000000e-01 2951 -1.2500000000000000e-01 2952 -1.2500000000000000e-01 2953 0.0000000000000000e+00 2954 -1.2500000000000000e-01 2955 -1.2500000000000000e-01 2956 -1.2500000000000000e-01 2957 -1.2500000000000000e-01 2958 -1.2500000000000000e-01 2959 0.0000000000000000e+00 2960 0.0000000000000000e+00 2961 0.0000000000000000e+00 2962 0.0000000000000000e+00 2963 0.0000000000000000e+00 2964 -1.2500000000000000e-01 2965 -1.2500000000000000e-01 2966 0.0000000000000000e+00 2967 0.0000000000000000e+00 2968 -1.2500000000000000e-01 2969 0.0000000000000000e+00 2970 0.0000000000000000e+00 2971 0.0000000000000000e+00 2972 -1.2500000000000000e-01 2973 1.2500000000000000e-01 2974 1.2500000000000000e-01 2975 1.2500000000000000e-01 2976 1.2500000000000000e-01 2977 1.2500000000000000e-01 2978 1.2500000000000000e-01 2979 -1.2500000000000000e-01 2980 -1.2500000000000000e-01 2981 -1.2500000000000000e-01 2982 -1.2500000000000000e-01 2983 0.0000000000000000e+00 2984 -1.2500000000000000e-01 2985 0.0000000000000000e+00 2986 -1.2500000000000000e-01 2987 0.0000000000000000e+00 2988 0.0000000000000000e+00 2989 0.0000000000000000e+00 2990 -1.2500000000000000e-01 2991 0.0000000000000000e+00 2992 0.0000000000000000e+00 2993 -1.2500000000000000e-01 2994 1.2500000000000000e-01 2995 1.2500000000000000e-01 2996 0.0000000000000000e+00 2997 1.2500000000000000e-01 2998 0.0000000000000000e+00 2999 1.2500000000000000e-01 3000 0.0000000000000000e+00 3001 -1.2500000000000000e-01 3002 -1.2500000000000000e-01 3003 -1.2500000000000000e-01 3004 -1.2500000000000000e-01 3005 -1.2500000000000000e-01 3006 -1.2500000000000000e-01 3007 -1.2500000000000000e-01 3008 0.0000000000000000e+00 3009 0.0000000000000000e+00 3010 0.0000000000000000e+00 3011 -1.2500000000000000e-01 3012 -1.2500000000000000e-01 3013 0.0000000000000000e+00 3014 -1.2500000000000000e-01 3015 0.0000000000000000e+00 3016 -1.2500000000000000e-01 3017 0.0000000000000000e+00 3018 -1.2500000000000000e-01 3019 0.0000000000000000e+00 3020 1.2500000000000000e-01 3021 1.2500000000000000e-01 3022 1.2500000000000000e-01 3023 0.0000000000000000e+00 3024 1.2500000000000000e-01 3025 0.0000000000000000e+00 3026 -1.2500000000000000e-01 3027 0.0000000000000000e+00 3028 6.2500000000000000e-02 3029 0.0000000000000000e+00 3030 -6.2500000000000000e-02 3031 -1.2500000000000000e-01 3032 -6.2500000000000000e-02 3033 1.2500000000000000e-01 3034 6.2500000000000000e-02 3035 0.0000000000000000e+00 3036 -6.2500000000000000e-02 3037 6.2500000000000000e-02 3038 6.2500000000000000e-02 3039 -6.2500000000000000e-02 3040 6.2500000000000000e-02 3041 -6.2500000000000000e-02 3042 -6.2500000000000000e-02 3043 6.2500000000000000e-02 3044 -6.2500000000000000e-02 3045 -6.2500000000000000e-02 3046 6.2500000000000000e-02 3047 6.2500000000000000e-02 3048 6.2500000000000000e-02 3049 0.0000000000000000e+00 3050 -1.2500000000000000e-01 3051 0.0000000000000000e+00 3052 -6.2500000000000000e-02 3053 6.2500000000000000e-02 3054 6.2500000000000000e-02 3055 6.2500000000000000e-02 3056 0.0000000000000000e+00 3057 -6.2500000000000000e-02 3058 0.0000000000000000e+00 3059 -6.2500000000000000e-02 3060 1.2500000000000000e-01 3061 0.0000000000000000e+00 3062 -6.2500000000000000e-02 3063 1.2500000000000000e-01 3064 0.0000000000000000e+00 3065 1.2500000000000000e-01 3066 -6.2500000000000000e-02 3067 -1.2500000000000000e-01 3068 -6.2500000000000000e-02 3069 0.0000000000000000e+00 3070 -6.2500000000000000e-02 3071 1.2500000000000000e-01 3072 -6.2500000000000000e-02 3073 -6.2500000000000000e-02 3074 -6.2500000000000000e-02 3075 -6.2500000000000000e-02 3076 6.2500000000000000e-02 3077 -6.2500000000000000e-02 3078 -6.2500000000000000e-02 3079 6.2500000000000000e-02 3080 -6.2500000000000000e-02 3081 -6.2500000000000000e-02 3082 1.2500000000000000e-01 3083 0.0000000000000000e+00 3084 -1.2500000000000000e-01 3085 -1.2500000000000000e-01 3086 1.2500000000000000e-01 3087 1.2500000000000000e-01 3088 6.2500000000000000e-02 3089 -6.2500000000000000e-02 3090 1.2500000000000000e-01 3091 -1.2500000000000000e-01 3092 -6.2500000000000000e-02 3093 0.0000000000000000e+00 3094 6.2500000000000000e-02 3095 0.0000000000000000e+00 3096 1.2500000000000000e-01 3097 0.0000000000000000e+00 3098 0.0000000000000000e+00 3099 -6.2500000000000000e-02 3100 0.0000000000000000e+00 3101 0.0000000000000000e+00 3102 6.2500000000000000e-02 3103 -6.2500000000000000e-02 3104 0.0000000000000000e+00 3105 -6.2500000000000000e-02 3106 -6.2500000000000000e-02 3107 -6.2500000000000000e-02 3108 6.2500000000000000e-02 3109 -6.2500000000000000e-02 3110 6.2500000000000000e-02 3111 6.2500000000000000e-02 3112 1.2500000000000000e-01 3113 1.2500000000000000e-01 3114 0.0000000000000000e+00 3115 1.2500000000000000e-01 3116 0.0000000000000000e+00 3117 1.2500000000000000e-01 3118 0.0000000000000000e+00 3119 6.2500000000000000e-02 3120 0.0000000000000000e+00 3121 -6.2500000000000000e-02 3122 -1.2500000000000000e-01 3123 -6.2500000000000000e-02 3124 1.2500000000000000e-01 3125 6.2500000000000000e-02 3126 6.2500000000000000e-02 3127 6.2500000000000000e-02 3128 0.0000000000000000e+00 3129 6.2500000000000000e-02 3130 -6.2500000000000000e-02 3131 -6.2500000000000000e-02 3132 6.2500000000000000e-02 3133 -6.2500000000000000e-02 3134 -6.2500000000000000e-02 3135 6.2500000000000000e-02 3136 6.2500000000000000e-02 3137 6.2500000000000000e-02 3138 0.0000000000000000e+00 3139 6.2500000000000000e-02 3140 6.2500000000000000e-02 3141 -6.2500000000000000e-02 3142 6.2500000000000000e-02 3143 0.0000000000000000e+00 3144 0.0000000000000000e+00 3145 -6.2500000000000000e-02 3146 1.2500000000000000e-01 3147 0.0000000000000000e+00 3148 1.2500000000000000e-01 3149 0.0000000000000000e+00 3150 -6.2500000000000000e-02 3151 -6.2500000000000000e-02 3152 1.2500000000000000e-01 3153 1.2500000000000000e-01 3154 1.2500000000000000e-01 3155 -6.2500000000000000e-02 3156 -6.2500000000000000e-02 3157 1.2500000000000000e-01 3158 0.0000000000000000e+00 3159 6.2500000000000000e-02 3160 -6.2500000000000000e-02 3161 -6.2500000000000000e-02 3162 -6.2500000000000000e-02 3163 -6.2500000000000000e-02 3164 -6.2500000000000000e-02 3165 6.2500000000000000e-02 3166 1.2500000000000000e-01 3167 1.2500000000000000e-01 3168 1.2500000000000000e-01 3169 0.0000000000000000e+00 3170 -1.2500000000000000e-01 3171 -1.2500000000000000e-01 3172 -1.2500000000000000e-01 3173 0.0000000000000000e+00 3174 -1.2500000000000000e-01 3175 0.0000000000000000e+00 3176 1.2500000000000000e-01 3177 0.0000000000000000e+00 3178 1.2500000000000000e-01 3179 1.2500000000000000e-01 3180 -1.2500000000000000e-01 3181 0.0000000000000000e+00 3182 -1.2500000000000000e-01 3183 0.0000000000000000e+00 3184 0.0000000000000000e+00 3185 1.2500000000000000e-01 3186 -1.2500000000000000e-01 3187 0.0000000000000000e+00 3188 0.0000000000000000e+00 3189 0.0000000000000000e+00 3190 -1.2500000000000000e-01 3191 0.0000000000000000e+00 3192 0.0000000000000000e+00 3193 1.2500000000000000e-01 3194 0.0000000000000000e+00 3195 -1.2500000000000000e-01 3196 0.0000000000000000e+00 3197 1.2500000000000000e-01 3198 -1.2500000000000000e-01 3199 0.0000000000000000e+00 3200 0.0000000000000000e+00 3201 0.0000000000000000e+00 3202 0.0000000000000000e+00 3203 -1.2500000000000000e-01 3204 -1.2500000000000000e-01 3205 0.0000000000000000e+00 3206 0.0000000000000000e+00 3207 0.0000000000000000e+00 3208 1.2500000000000000e-01 3209 -1.2500000000000000e-01 3210 -1.2500000000000000e-01 3211 0.0000000000000000e+00 3212 -6.2500000000000000e-02 3213 -1.2500000000000000e-01 3214 1.2500000000000000e-01 3215 -6.2500000000000000e-02 3216 0.0000000000000000e+00 3217 0.0000000000000000e+00 3218 0.0000000000000000e+00 3219 0.0000000000000000e+00 3220 1.2500000000000000e-01 3221 0.0000000000000000e+00 3222 0.0000000000000000e+00 3223 0.0000000000000000e+00 3224 0.0000000000000000e+00 3225 0.0000000000000000e+00 3226 0.0000000000000000e+00 3227 0.0000000000000000e+00 3228 1.2500000000000000e-01 3229 1.2500000000000000e-01 3230 0.0000000000000000e+00 3231 0.0000000000000000e+00 3232 1.2500000000000000e-01 3233 1.2500000000000000e-01 3234 0.0000000000000000e+00 3235 1.2500000000000000e-01 3236 1.2500000000000000e-01 3237 0.0000000000000000e+00 3238 0.0000000000000000e+00 3239 0.0000000000000000e+00 3240 0.0000000000000000e+00 3241 1.2500000000000000e-01 3242 -1.2500000000000000e-01 3243 1.2500000000000000e-01 3244 -1.2500000000000000e-01 3245 1.2500000000000000e-01 3246 1.2500000000000000e-01 3247 1.2500000000000000e-01 3248 0.0000000000000000e+00 3249 0.0000000000000000e+00 3250 0.0000000000000000e+00 3251 -1.2500000000000000e-01 3252 0.0000000000000000e+00 3253 0.0000000000000000e+00 3254 0.0000000000000000e+00 3255 0.0000000000000000e+00 3256 1.2500000000000000e-01 3257 1.2500000000000000e-01 3258 1.2500000000000000e-01 3259 0.0000000000000000e+00 3260 1.2500000000000000e-01 3261 1.2500000000000000e-01 3262 0.0000000000000000e+00 3263 0.0000000000000000e+00 3264 0.0000000000000000e+00 3265 0.0000000000000000e+00 3266 1.2500000000000000e-01 3267 0.0000000000000000e+00 3268 0.0000000000000000e+00 3269 -1.2500000000000000e-01 3270 1.2500000000000000e-01 3271 1.2500000000000000e-01 3272 1.2500000000000000e-01 3273 0.0000000000000000e+00 3274 -1.2500000000000000e-01 3275 0.0000000000000000e+00 3276 0.0000000000000000e+00 3277 0.0000000000000000e+00 3278 0.0000000000000000e+00 3279 0.0000000000000000e+00 3280 1.2500000000000000e-01 3281 0.0000000000000000e+00 3282 1.2500000000000000e-01 3283 1.2500000000000000e-01 3284 1.2500000000000000e-01 3285 0.0000000000000000e+00 3286 1.2500000000000000e-01 3287 -1.2500000000000000e-01 3288 0.0000000000000000e+00 3289 0.0000000000000000e+00 3290 0.0000000000000000e+00 3291 -1.2500000000000000e-01 3292 0.0000000000000000e+00 3293 0.0000000000000000e+00 3294 1.2500000000000000e-01 3295 -1.2500000000000000e-01 3296 1.2500000000000000e-01 3297 0.0000000000000000e+00 3298 0.0000000000000000e+00 3299 -1.2500000000000000e-01 3300 0.0000000000000000e+00 3301 0.0000000000000000e+00 3302 0.0000000000000000e+00 3303 0.0000000000000000e+00 3304 1.2500000000000000e-01 3305 0.0000000000000000e+00 3306 -1.2500000000000000e-01 3307 1.2500000000000000e-01 3308 -1.2500000000000000e-01 3309 -1.2500000000000000e-01 3310 0.0000000000000000e+00 3311 0.0000000000000000e+00 3312 0.0000000000000000e+00 3313 1.2500000000000000e-01 3314 0.0000000000000000e+00 3315 0.0000000000000000e+00 3316 1.2500000000000000e-01 3317 -1.2500000000000000e-01 3318 0.0000000000000000e+00 3319 1.2500000000000000e-01 3320 1.2500000000000000e-01 3321 0.0000000000000000e+00 3322 -1.2500000000000000e-01 3323 1.2500000000000000e-01 3324 1.2500000000000000e-01 3325 0.0000000000000000e+00 3326 0.0000000000000000e+00 3327 1.2500000000000000e-01 3328 1.2500000000000000e-01 3329 0.0000000000000000e+00 3330 0.0000000000000000e+00 3331 0.0000000000000000e+00 3332 1.2500000000000000e-01 3333 -1.2500000000000000e-01 3334 -1.2500000000000000e-01 3335 0.0000000000000000e+00 3336 1.2500000000000000e-01 3337 0.0000000000000000e+00 3338 1.2500000000000000e-01 3339 -1.2500000000000000e-01 3340 -1.2500000000000000e-01 3341 0.0000000000000000e+00 3342 0.0000000000000000e+00 3343 0.0000000000000000e+00 3344 1.2500000000000000e-01 3345 0.0000000000000000e+00 3346 -1.2500000000000000e-01 3347 -1.2500000000000000e-01 3348 0.0000000000000000e+00 3349 0.0000000000000000e+00 3350 0.0000000000000000e+00 3351 0.0000000000000000e+00 3352 0.0000000000000000e+00 3353 0.0000000000000000e+00 3354 0.0000000000000000e+00 3355 0.0000000000000000e+00 3356 -1.2500000000000000e-01 3357 0.0000000000000000e+00 3358 0.0000000000000000e+00 3359 -1.2500000000000000e-01 3360 0.0000000000000000e+00 3361 0.0000000000000000e+00 3362 -1.2500000000000000e-01 3363 0.0000000000000000e+00 3364 1.2500000000000000e-01 3365 -1.2500000000000000e-01 3366 -1.2500000000000000e-01 3367 -1.2500000000000000e-01 3368 -1.2500000000000000e-01 3369 0.0000000000000000e+00 3370 0.0000000000000000e+00 3371 0.0000000000000000e+00 3372 0.0000000000000000e+00 3373 0.0000000000000000e+00 3374 1.2500000000000000e-01 3375 1.2500000000000000e-01 3376 0.0000000000000000e+00 3377 -1.2500000000000000e-01 3378 1.2500000000000000e-01 3379 1.2500000000000000e-01 3380 1.2500000000000000e-01 3381 0.0000000000000000e+00 3382 -1.2500000000000000e-01 3383 0.0000000000000000e+00 3384 1.2500000000000000e-01 3385 0.0000000000000000e+00 3386 0.0000000000000000e+00 3387 0.0000000000000000e+00 3388 -1.2500000000000000e-01 3389 1.2500000000000000e-01 3390 0.0000000000000000e+00 3391 0.0000000000000000e+00 3392 1.2500000000000000e-01 3393 1.2500000000000000e-01 3394 0.0000000000000000e+00 3395 -1.2500000000000000e-01 3396 1.2500000000000000e-01 3397 0.0000000000000000e+00 3398 -6.2500000000000000e-02 3399 0.0000000000000000e+00 3400 6.2500000000000000e-02 3401 0.0000000000000000e+00 3402 0.0000000000000000e+00 3403 -6.2500000000000000e-02 3404 -6.2500000000000000e-02 3405 -6.2500000000000000e-02 3406 6.2500000000000000e-02 3407 1.2500000000000000e-01 3408 6.2500000000000000e-02 3409 -6.2500000000000000e-02 3410 -6.2500000000000000e-02 3411 6.2500000000000000e-02 3412 0.0000000000000000e+00 3413 -6.2500000000000000e-02 3414 -6.2500000000000000e-02 3415 6.2500000000000000e-02 3416 6.2500000000000000e-02 3417 6.2500000000000000e-02 3418 6.2500000000000000e-02 3419 6.2500000000000000e-02 3420 -6.2500000000000000e-02 3421 0.0000000000000000e+00 3422 -6.2500000000000000e-02 3423 1.2500000000000000e-01 3424 0.0000000000000000e+00 3425 -6.2500000000000000e-02 3426 -1.2500000000000000e-01 3427 -6.2500000000000000e-02 3428 1.2500000000000000e-01 3429 -6.2500000000000000e-02 3430 -6.2500000000000000e-02 3431 1.2500000000000000e-01 3432 -6.2500000000000000e-02 3433 -6.2500000000000000e-02 3434 -6.2500000000000000e-02 3435 -6.2500000000000000e-02 3436 -6.2500000000000000e-02 3437 6.2500000000000000e-02 3438 1.2500000000000000e-01 3439 1.2500000000000000e-01 3440 6.2500000000000000e-02 3441 0.0000000000000000e+00 3442 0.0000000000000000e+00 3443 -6.2500000000000000e-02 3444 -6.2500000000000000e-02 3445 0.0000000000000000e+00 3446 -6.2500000000000000e-02 3447 0.0000000000000000e+00 3448 -6.2500000000000000e-02 3449 -6.2500000000000000e-02 3450 -6.2500000000000000e-02 3451 6.2500000000000000e-02 3452 6.2500000000000000e-02 3453 -6.2500000000000000e-02 3454 -6.2500000000000000e-02 3455 -1.2500000000000000e-01 3456 1.2500000000000000e-01 3457 -6.2500000000000000e-02 3458 -1.2500000000000000e-01 3459 -6.2500000000000000e-02 3460 6.2500000000000000e-02 3461 0.0000000000000000e+00 3462 -6.2500000000000000e-02 3463 -1.2500000000000000e-01 3464 1.2500000000000000e-01 3465 6.2500000000000000e-02 3466 0.0000000000000000e+00 3467 -6.2500000000000000e-02 3468 -6.2500000000000000e-02 3469 -6.2500000000000000e-02 3470 1.2500000000000000e-01 3471 0.0000000000000000e+00 3472 6.2500000000000000e-02 3473 -6.2500000000000000e-02 3474 0.0000000000000000e+00 3475 -1.2500000000000000e-01 3476 -6.2500000000000000e-02 3477 0.0000000000000000e+00 3478 -6.2500000000000000e-02 3479 -6.2500000000000000e-02 3480 -6.2500000000000000e-02 3481 0.0000000000000000e+00 3482 0.0000000000000000e+00 3483 -1.2500000000000000e-01 3484 0.0000000000000000e+00 3485 0.0000000000000000e+00 3486 0.0000000000000000e+00 3487 0.0000000000000000e+00 3488 0.0000000000000000e+00 3489 0.0000000000000000e+00 3490 0.0000000000000000e+00 3491 0.0000000000000000e+00 3492 0.0000000000000000e+00 3493 0.0000000000000000e+00 3494 0.0000000000000000e+00 3495 0.0000000000000000e+00 3496 0.0000000000000000e+00 3497 0.0000000000000000e+00 3498 0.0000000000000000e+00 3499 0.0000000000000000e+00 3500 0.0000000000000000e+00 3501 0.0000000000000000e+00 3502 1.2500000000000000e-01 3503 0.0000000000000000e+00 3504 0.0000000000000000e+00 3505 0.0000000000000000e+00 3506 0.0000000000000000e+00 3507 1.2500000000000000e-01 3508 -1.2500000000000000e-01 3509 -1.2500000000000000e-01 3510 0.0000000000000000e+00 3511 0.0000000000000000e+00 3512 -1.2500000000000000e-01 3513 0.0000000000000000e+00 3514 0.0000000000000000e+00 3515 1.2500000000000000e-01 3516 -1.2500000000000000e-01 3517 -1.2500000000000000e-01 3518 1.2500000000000000e-01 3519 1.2500000000000000e-01 3520 0.0000000000000000e+00 3521 1.2500000000000000e-01 3522 -1.2500000000000000e-01 3523 0.0000000000000000e+00 3524 1.2500000000000000e-01 3525 1.2500000000000000e-01 3526 0.0000000000000000e+00 3527 1.2500000000000000e-01 3528 0.0000000000000000e+00 3529 1.2500000000000000e-01 3530 0.0000000000000000e+00 3531 0.0000000000000000e+00 3532 0.0000000000000000e+00 3533 0.0000000000000000e+00 3534 0.0000000000000000e+00 3535 1.2500000000000000e-01 3536 1.2500000000000000e-01 3537 0.0000000000000000e+00 3538 0.0000000000000000e+00 3539 0.0000000000000000e+00 3540 0.0000000000000000e+00 3541 0.0000000000000000e+00 3542 1.2500000000000000e-01 3543 0.0000000000000000e+00 3544 1.2500000000000000e-01 3545 0.0000000000000000e+00 3546 1.2500000000000000e-01 3547 -1.2500000000000000e-01 3548 0.0000000000000000e+00 3549 0.0000000000000000e+00 3550 1.2500000000000000e-01 3551 0.0000000000000000e+00 3552 0.0000000000000000e+00 3553 -1.2500000000000000e-01 3554 0.0000000000000000e+00 3555 0.0000000000000000e+00 3556 0.0000000000000000e+00 3557 0.0000000000000000e+00 3558 0.0000000000000000e+00 3559 0.0000000000000000e+00 3560 0.0000000000000000e+00 3561 0.0000000000000000e+00 3562 0.0000000000000000e+00 3563 -1.2500000000000000e-01 3564 -1.2500000000000000e-01 3565 0.0000000000000000e+00 3566 1.2500000000000000e-01 3567 1.2500000000000000e-01 3568 0.0000000000000000e+00 3569 0.0000000000000000e+00 3570 1.2500000000000000e-01 3571 0.0000000000000000e+00 3572 0.0000000000000000e+00 3573 1.2500000000000000e-01 3574 0.0000000000000000e+00 3575 -1.2500000000000000e-01 3576 0.0000000000000000e+00 3577 0.0000000000000000e+00 3578 0.0000000000000000e+00 3579 0.0000000000000000e+00 3580 1.2500000000000000e-01 3581 1.2500000000000000e-01 3582 1.2500000000000000e-01 3583 0.0000000000000000e+00 3584 0.0000000000000000e+00 3585 0.0000000000000000e+00 3586 1.2500000000000000e-01 3587 -1.2500000000000000e-01 3588 0.0000000000000000e+00 3589 0.0000000000000000e+00 3590 0.0000000000000000e+00 3591 -1.2500000000000000e-01 3592 0.0000000000000000e+00 3593 0.0000000000000000e+00 3594 0.0000000000000000e+00 3595 0.0000000000000000e+00 3596 0.0000000000000000e+00 3597 1.2500000000000000e-01 3598 0.0000000000000000e+00 3599 1.2500000000000000e-01 3600 -1.2500000000000000e-01 3601 0.0000000000000000e+00 3602 0.0000000000000000e+00 3603 0.0000000000000000e+00 3604 0.0000000000000000e+00 3605 0.0000000000000000e+00 3606 0.0000000000000000e+00 3607 -1.2500000000000000e-01 3608 1.2500000000000000e-01 3609 0.0000000000000000e+00 3610 0.0000000000000000e+00 3611 0.0000000000000000e+00 3612 -1.2500000000000000e-01 3613 0.0000000000000000e+00 3614 -1.2500000000000000e-01 3615 -1.2500000000000000e-01 3616 0.0000000000000000e+00 3617 1.2500000000000000e-01 3618 0.0000000000000000e+00 3619 0.0000000000000000e+00 3620 0.0000000000000000e+00 3621 0.0000000000000000e+00 3622 0.0000000000000000e+00 3623 -1.2500000000000000e-01 3624 0.0000000000000000e+00 3625 1.2500000000000000e-01 3626 0.0000000000000000e+00 3627 -1.2500000000000000e-01 3628 -1.2500000000000000e-01 3629 1.2500000000000000e-01 3630 0.0000000000000000e+00 3631 0.0000000000000000e+00 3632 -1.2500000000000000e-01 3633 1.2500000000000000e-01 3634 1.2500000000000000e-01 3635 -1.2500000000000000e-01 3636 0.0000000000000000e+00 3637 -1.2500000000000000e-01 3638 1.2500000000000000e-01 3639 1.2500000000000000e-01 3640 -1.2500000000000000e-01 3641 0.0000000000000000e+00 3642 0.0000000000000000e+00 3643 1.2500000000000000e-01 3644 0.0000000000000000e+00 3645 0.0000000000000000e+00 3646 0.0000000000000000e+00 3647 1.2500000000000000e-01 3648 1.2500000000000000e-01 3649 1.2500000000000000e-01 3650 0.0000000000000000e+00 3651 1.2500000000000000e-01 3652 1.2500000000000000e-01 3653 0.0000000000000000e+00 3654 0.0000000000000000e+00 3655 -1.2500000000000000e-01 3656 0.0000000000000000e+00 3657 -1.2500000000000000e-01 3658 1.2500000000000000e-01 3659 0.0000000000000000e+00 3660 0.0000000000000000e+00 3661 1.2500000000000000e-01 3662 1.2500000000000000e-01 3663 1.2500000000000000e-01 3664 0.0000000000000000e+00 3665 1.2500000000000000e-01 3666 1.2500000000000000e-01 3667 1.2500000000000000e-01 3668 0.0000000000000000e+00 3669 1.2500000000000000e-01 3670 0.0000000000000000e+00 3671 0.0000000000000000e+00 3672 0.0000000000000000e+00 3673 0.0000000000000000e+00 3674 0.0000000000000000e+00 3675 1.2500000000000000e-01 3676 1.2500000000000000e-01 3677 1.2500000000000000e-01 3678 -1.2500000000000000e-01 3679 0.0000000000000000e+00 3680 1.2500000000000000e-01 3681 1.2500000000000000e-01 3682 0.0000000000000000e+00 3683 1.2500000000000000e-01 3684 0.0000000000000000e+00 3685 0.0000000000000000e+00 3686 0.0000000000000000e+00 3687 1.2500000000000000e-01 3688 0.0000000000000000e+00 3689 1.2500000000000000e-01 3690 0.0000000000000000e+00 3691 1.2500000000000000e-01 3692 -1.2500000000000000e-01 3693 0.0000000000000000e+00 3694 1.2500000000000000e-01 3695 0.0000000000000000e+00 3696 0.0000000000000000e+00 3697 0.0000000000000000e+00 3698 0.0000000000000000e+00 3699 -1.2500000000000000e-01 3700 0.0000000000000000e+00 3701 0.0000000000000000e+00 3702 -1.2500000000000000e-01 3703 0.0000000000000000e+00 3704 -1.2500000000000000e-01 3705 1.2500000000000000e-01 3706 0.0000000000000000e+00 3707 -1.2500000000000000e-01 3708 1.2500000000000000e-01 3709 1.2500000000000000e-01 hypre-2.33.0/src/test/TEST_ams/mfem.Gx.00003000066400000000000000000001136041477326011500200130ustar00rootroot000000000000003710 5080 3710 -1.2500000000000000e-01 3711 -1.2500000000000000e-01 3712 0.0000000000000000e+00 3713 0.0000000000000000e+00 3714 0.0000000000000000e+00 3715 -1.2500000000000000e-01 3716 -1.2500000000000000e-01 3717 -1.2500000000000000e-01 3718 0.0000000000000000e+00 3719 0.0000000000000000e+00 3720 -1.2500000000000000e-01 3721 1.2500000000000000e-01 3722 1.2500000000000000e-01 3723 0.0000000000000000e+00 3724 -1.2500000000000000e-01 3725 -1.2500000000000000e-01 3726 -1.2500000000000000e-01 3727 -1.2500000000000000e-01 3728 -1.2500000000000000e-01 3729 1.2500000000000000e-01 3730 0.0000000000000000e+00 3731 0.0000000000000000e+00 3732 0.0000000000000000e+00 3733 0.0000000000000000e+00 3734 1.2500000000000000e-01 3735 0.0000000000000000e+00 3736 1.2500000000000000e-01 3737 1.2500000000000000e-01 3738 1.2500000000000000e-01 3739 -1.2500000000000000e-01 3740 0.0000000000000000e+00 3741 0.0000000000000000e+00 3742 -1.2500000000000000e-01 3743 -1.2500000000000000e-01 3744 1.2500000000000000e-01 3745 1.2500000000000000e-01 3746 -1.2500000000000000e-01 3747 1.2500000000000000e-01 3748 1.2500000000000000e-01 3749 1.2500000000000000e-01 3750 0.0000000000000000e+00 3751 1.2500000000000000e-01 3752 -1.2500000000000000e-01 3753 -1.2500000000000000e-01 3754 -1.2500000000000000e-01 3755 -1.2500000000000000e-01 3756 1.2500000000000000e-01 3757 0.0000000000000000e+00 3758 0.0000000000000000e+00 3759 1.2500000000000000e-01 3760 -1.2500000000000000e-01 3761 0.0000000000000000e+00 3762 0.0000000000000000e+00 3763 -1.2500000000000000e-01 3764 -1.2500000000000000e-01 3765 -1.2500000000000000e-01 3766 0.0000000000000000e+00 3767 -1.2500000000000000e-01 3768 -1.2500000000000000e-01 3769 -1.2500000000000000e-01 3770 0.0000000000000000e+00 3771 0.0000000000000000e+00 3772 0.0000000000000000e+00 3773 0.0000000000000000e+00 3774 -1.2500000000000000e-01 3775 1.2500000000000000e-01 3776 0.0000000000000000e+00 3777 0.0000000000000000e+00 3778 1.2500000000000000e-01 3779 1.2500000000000000e-01 3780 0.0000000000000000e+00 3781 -1.2500000000000000e-01 3782 -1.2500000000000000e-01 3783 -1.2500000000000000e-01 3784 0.0000000000000000e+00 3785 0.0000000000000000e+00 3786 1.2500000000000000e-01 3787 1.2500000000000000e-01 3788 1.2500000000000000e-01 3789 1.2500000000000000e-01 3790 0.0000000000000000e+00 3791 0.0000000000000000e+00 3792 1.2500000000000000e-01 3793 1.2500000000000000e-01 3794 1.2500000000000000e-01 3795 1.2500000000000000e-01 3796 1.2500000000000000e-01 3797 0.0000000000000000e+00 3798 1.2500000000000000e-01 3799 1.2500000000000000e-01 3800 1.2500000000000000e-01 3801 0.0000000000000000e+00 3802 -1.2500000000000000e-01 3803 -1.2500000000000000e-01 3804 -1.2500000000000000e-01 3805 -1.2500000000000000e-01 3806 0.0000000000000000e+00 3807 0.0000000000000000e+00 3808 1.2500000000000000e-01 3809 0.0000000000000000e+00 3810 1.2500000000000000e-01 3811 0.0000000000000000e+00 3812 0.0000000000000000e+00 3813 0.0000000000000000e+00 3814 -1.2500000000000000e-01 3815 -1.2500000000000000e-01 3816 -1.2500000000000000e-01 3817 1.2500000000000000e-01 3818 1.2500000000000000e-01 3819 0.0000000000000000e+00 3820 1.2500000000000000e-01 3821 1.2500000000000000e-01 3822 0.0000000000000000e+00 3823 1.2500000000000000e-01 3824 1.2500000000000000e-01 3825 1.2500000000000000e-01 3826 1.2500000000000000e-01 3827 1.2500000000000000e-01 3828 0.0000000000000000e+00 3829 1.2500000000000000e-01 3830 0.0000000000000000e+00 3831 -1.2500000000000000e-01 3832 -1.2500000000000000e-01 3833 -1.2500000000000000e-01 3834 0.0000000000000000e+00 3835 0.0000000000000000e+00 3836 0.0000000000000000e+00 3837 1.2500000000000000e-01 3838 0.0000000000000000e+00 3839 0.0000000000000000e+00 3840 0.0000000000000000e+00 3841 1.2500000000000000e-01 3842 -1.2500000000000000e-01 3843 -1.2500000000000000e-01 3844 -1.2500000000000000e-01 3845 0.0000000000000000e+00 3846 -1.2500000000000000e-01 3847 -1.2500000000000000e-01 3848 -1.2500000000000000e-01 3849 -1.2500000000000000e-01 3850 -1.2500000000000000e-01 3851 -1.2500000000000000e-01 3852 0.0000000000000000e+00 3853 1.2500000000000000e-01 3854 1.2500000000000000e-01 3855 1.2500000000000000e-01 3856 1.2500000000000000e-01 3857 0.0000000000000000e+00 3858 0.0000000000000000e+00 3859 1.2500000000000000e-01 3860 0.0000000000000000e+00 3861 1.2500000000000000e-01 3862 1.2500000000000000e-01 3863 1.2500000000000000e-01 3864 0.0000000000000000e+00 3865 0.0000000000000000e+00 3866 -1.2500000000000000e-01 3867 0.0000000000000000e+00 3868 1.2500000000000000e-01 3869 1.2500000000000000e-01 3870 -1.2500000000000000e-01 3871 -1.2500000000000000e-01 3872 0.0000000000000000e+00 3873 0.0000000000000000e+00 3874 0.0000000000000000e+00 3875 1.2500000000000000e-01 3876 -1.2500000000000000e-01 3877 -1.2500000000000000e-01 3878 -1.2500000000000000e-01 3879 -1.2500000000000000e-01 3880 1.2500000000000000e-01 3881 0.0000000000000000e+00 3882 1.2500000000000000e-01 3883 1.2500000000000000e-01 3884 0.0000000000000000e+00 3885 0.0000000000000000e+00 3886 0.0000000000000000e+00 3887 1.2500000000000000e-01 3888 -1.2500000000000000e-01 3889 -1.2500000000000000e-01 3890 -1.2500000000000000e-01 3891 0.0000000000000000e+00 3892 -1.2500000000000000e-01 3893 -1.2500000000000000e-01 3894 0.0000000000000000e+00 3895 -1.2500000000000000e-01 3896 1.2500000000000000e-01 3897 1.2500000000000000e-01 3898 1.2500000000000000e-01 3899 1.2500000000000000e-01 3900 0.0000000000000000e+00 3901 0.0000000000000000e+00 3902 1.2500000000000000e-01 3903 -1.2500000000000000e-01 3904 -1.2500000000000000e-01 3905 -1.2500000000000000e-01 3906 0.0000000000000000e+00 3907 1.2500000000000000e-01 3908 1.2500000000000000e-01 3909 -1.2500000000000000e-01 3910 0.0000000000000000e+00 3911 -2.5000000000000000e-01 3912 -1.2500000000000000e-01 3913 0.0000000000000000e+00 3914 -1.2500000000000000e-01 3915 -1.2500000000000000e-01 3916 -1.2500000000000000e-01 3917 0.0000000000000000e+00 3918 -1.2500000000000000e-01 3919 -1.2500000000000000e-01 3920 0.0000000000000000e+00 3921 1.2500000000000000e-01 3922 0.0000000000000000e+00 3923 -1.2500000000000000e-01 3924 -1.2500000000000000e-01 3925 -1.2500000000000000e-01 3926 1.2500000000000000e-01 3927 0.0000000000000000e+00 3928 1.2500000000000000e-01 3929 1.2500000000000000e-01 3930 -1.2500000000000000e-01 3931 -1.2500000000000000e-01 3932 -1.2500000000000000e-01 3933 1.2500000000000000e-01 3934 0.0000000000000000e+00 3935 0.0000000000000000e+00 3936 1.2500000000000000e-01 3937 -1.2500000000000000e-01 3938 -1.2500000000000000e-01 3939 0.0000000000000000e+00 3940 -1.2500000000000000e-01 3941 -1.2500000000000000e-01 3942 -1.2500000000000000e-01 3943 0.0000000000000000e+00 3944 0.0000000000000000e+00 3945 0.0000000000000000e+00 3946 0.0000000000000000e+00 3947 -1.2500000000000000e-01 3948 1.2500000000000000e-01 3949 1.2500000000000000e-01 3950 0.0000000000000000e+00 3951 1.2500000000000000e-01 3952 1.2500000000000000e-01 3953 1.2500000000000000e-01 3954 1.2500000000000000e-01 3955 0.0000000000000000e+00 3956 -1.2500000000000000e-01 3957 -1.2500000000000000e-01 3958 0.0000000000000000e+00 3959 1.2500000000000000e-01 3960 1.2500000000000000e-01 3961 0.0000000000000000e+00 3962 0.0000000000000000e+00 3963 1.2500000000000000e-01 3964 0.0000000000000000e+00 3965 1.2500000000000000e-01 3966 1.2500000000000000e-01 3967 1.2500000000000000e-01 3968 0.0000000000000000e+00 3969 1.2500000000000000e-01 3970 1.2500000000000000e-01 3971 1.2500000000000000e-01 3972 1.2500000000000000e-01 3973 1.2500000000000000e-01 3974 1.2500000000000000e-01 3975 0.0000000000000000e+00 3976 0.0000000000000000e+00 3977 0.0000000000000000e+00 3978 1.2500000000000000e-01 3979 -1.2500000000000000e-01 3980 0.0000000000000000e+00 3981 0.0000000000000000e+00 3982 -1.2500000000000000e-01 3983 -1.2500000000000000e-01 3984 -1.2500000000000000e-01 3985 -1.2500000000000000e-01 3986 -1.2500000000000000e-01 3987 0.0000000000000000e+00 3988 0.0000000000000000e+00 3989 0.0000000000000000e+00 3990 -1.2500000000000000e-01 3991 -1.2500000000000000e-01 3992 0.0000000000000000e+00 3993 0.0000000000000000e+00 3994 -1.2500000000000000e-01 3995 -1.2500000000000000e-01 3996 0.0000000000000000e+00 3997 0.0000000000000000e+00 3998 -1.2500000000000000e-01 3999 -1.2500000000000000e-01 4000 -1.2500000000000000e-01 4001 -1.2500000000000000e-01 4002 0.0000000000000000e+00 4003 -1.2500000000000000e-01 4004 -1.2500000000000000e-01 4005 0.0000000000000000e+00 4006 -1.2500000000000000e-01 4007 0.0000000000000000e+00 4008 0.0000000000000000e+00 4009 -1.2500000000000000e-01 4010 0.0000000000000000e+00 4011 -1.2500000000000000e-01 4012 0.0000000000000000e+00 4013 0.0000000000000000e+00 4014 0.0000000000000000e+00 4015 -1.2500000000000000e-01 4016 0.0000000000000000e+00 4017 0.0000000000000000e+00 4018 0.0000000000000000e+00 4019 -1.2500000000000000e-01 4020 1.2500000000000000e-01 4021 0.0000000000000000e+00 4022 1.2500000000000000e-01 4023 1.2500000000000000e-01 4024 1.2500000000000000e-01 4025 1.2500000000000000e-01 4026 1.2500000000000000e-01 4027 -1.2500000000000000e-01 4028 0.0000000000000000e+00 4029 0.0000000000000000e+00 4030 1.2500000000000000e-01 4031 0.0000000000000000e+00 4032 1.2500000000000000e-01 4033 0.0000000000000000e+00 4034 -1.2500000000000000e-01 4035 0.0000000000000000e+00 4036 -1.2500000000000000e-01 4037 -1.2500000000000000e-01 4038 1.2500000000000000e-01 4039 1.2500000000000000e-01 4040 1.2500000000000000e-01 4041 -1.2500000000000000e-01 4042 1.2500000000000000e-01 4043 -1.2500000000000000e-01 4044 -1.2500000000000000e-01 4045 -1.2500000000000000e-01 4046 0.0000000000000000e+00 4047 0.0000000000000000e+00 4048 0.0000000000000000e+00 4049 -1.2500000000000000e-01 4050 -1.2500000000000000e-01 4051 2.5000000000000000e-01 4052 1.2500000000000000e-01 4053 1.2500000000000000e-01 4054 1.2500000000000000e-01 4055 1.2500000000000000e-01 4056 1.2500000000000000e-01 4057 1.2500000000000000e-01 4058 1.2500000000000000e-01 4059 0.0000000000000000e+00 4060 -1.2500000000000000e-01 4061 -1.2500000000000000e-01 4062 0.0000000000000000e+00 4063 0.0000000000000000e+00 4064 1.2500000000000000e-01 4065 1.2500000000000000e-01 4066 0.0000000000000000e+00 4067 1.2500000000000000e-01 4068 0.0000000000000000e+00 4069 0.0000000000000000e+00 4070 -1.2500000000000000e-01 4071 -1.2500000000000000e-01 4072 -1.2500000000000000e-01 4073 -1.2500000000000000e-01 4074 1.2500000000000000e-01 4075 1.2500000000000000e-01 4076 1.2500000000000000e-01 4077 0.0000000000000000e+00 4078 1.2500000000000000e-01 4079 -1.2500000000000000e-01 4080 -1.2500000000000000e-01 4081 -1.2500000000000000e-01 4082 -1.2500000000000000e-01 4083 1.2500000000000000e-01 4084 0.0000000000000000e+00 4085 0.0000000000000000e+00 4086 1.2500000000000000e-01 4087 -1.2500000000000000e-01 4088 0.0000000000000000e+00 4089 0.0000000000000000e+00 4090 -1.2500000000000000e-01 4091 -1.2500000000000000e-01 4092 -1.2500000000000000e-01 4093 0.0000000000000000e+00 4094 -1.2500000000000000e-01 4095 -1.2500000000000000e-01 4096 1.2500000000000000e-01 4097 1.2500000000000000e-01 4098 -1.2500000000000000e-01 4099 0.0000000000000000e+00 4100 0.0000000000000000e+00 4101 0.0000000000000000e+00 4102 0.0000000000000000e+00 4103 -1.2500000000000000e-01 4104 1.2500000000000000e-01 4105 1.2500000000000000e-01 4106 1.2500000000000000e-01 4107 1.2500000000000000e-01 4108 1.2500000000000000e-01 4109 0.0000000000000000e+00 4110 1.2500000000000000e-01 4111 0.0000000000000000e+00 4112 1.2500000000000000e-01 4113 1.2500000000000000e-01 4114 1.2500000000000000e-01 4115 1.2500000000000000e-01 4116 0.0000000000000000e+00 4117 1.2500000000000000e-01 4118 0.0000000000000000e+00 4119 1.2500000000000000e-01 4120 0.0000000000000000e+00 4121 0.0000000000000000e+00 4122 0.0000000000000000e+00 4123 -1.2500000000000000e-01 4124 0.0000000000000000e+00 4125 0.0000000000000000e+00 4126 0.0000000000000000e+00 4127 -1.2500000000000000e-01 4128 1.2500000000000000e-01 4129 0.0000000000000000e+00 4130 0.0000000000000000e+00 4131 1.2500000000000000e-01 4132 1.2500000000000000e-01 4133 1.2500000000000000e-01 4134 1.2500000000000000e-01 4135 1.2500000000000000e-01 4136 -1.2500000000000000e-01 4137 -1.2500000000000000e-01 4138 -1.2500000000000000e-01 4139 -1.2500000000000000e-01 4140 -1.2500000000000000e-01 4141 0.0000000000000000e+00 4142 0.0000000000000000e+00 4143 1.2500000000000000e-01 4144 0.0000000000000000e+00 4145 -1.2500000000000000e-01 4146 -1.2500000000000000e-01 4147 1.2500000000000000e-01 4148 1.2500000000000000e-01 4149 -1.2500000000000000e-01 4150 1.2500000000000000e-01 4151 0.0000000000000000e+00 4152 1.2500000000000000e-01 4153 -1.2500000000000000e-01 4154 -1.2500000000000000e-01 4155 -1.2500000000000000e-01 4156 -1.2500000000000000e-01 4157 -1.2500000000000000e-01 4158 1.2500000000000000e-01 4159 0.0000000000000000e+00 4160 1.2500000000000000e-01 4161 1.2500000000000000e-01 4162 1.2500000000000000e-01 4163 0.0000000000000000e+00 4164 0.0000000000000000e+00 4165 1.2500000000000000e-01 4166 -1.2500000000000000e-01 4167 -1.2500000000000000e-01 4168 -1.2500000000000000e-01 4169 1.2500000000000000e-01 4170 1.2500000000000000e-01 4171 0.0000000000000000e+00 4172 0.0000000000000000e+00 4173 1.2500000000000000e-01 4174 0.0000000000000000e+00 4175 1.2500000000000000e-01 4176 0.0000000000000000e+00 4177 -1.2500000000000000e-01 4178 -1.2500000000000000e-01 4179 0.0000000000000000e+00 4180 -1.2500000000000000e-01 4181 -1.2500000000000000e-01 4182 -1.2500000000000000e-01 4183 -1.2500000000000000e-01 4184 1.2500000000000000e-01 4185 -1.2500000000000000e-01 4186 -1.2500000000000000e-01 4187 0.0000000000000000e+00 4188 -1.2500000000000000e-01 4189 -1.2500000000000000e-01 4190 0.0000000000000000e+00 4191 1.2500000000000000e-01 4192 0.0000000000000000e+00 4193 1.2500000000000000e-01 4194 1.2500000000000000e-01 4195 0.0000000000000000e+00 4196 0.0000000000000000e+00 4197 -1.2500000000000000e-01 4198 -1.2500000000000000e-01 4199 1.2500000000000000e-01 4200 -1.2500000000000000e-01 4201 0.0000000000000000e+00 4202 0.0000000000000000e+00 4203 -1.2500000000000000e-01 4204 -1.2500000000000000e-01 4205 -1.2500000000000000e-01 4206 0.0000000000000000e+00 4207 -1.2500000000000000e-01 4208 -1.2500000000000000e-01 4209 0.0000000000000000e+00 4210 -1.2500000000000000e-01 4211 0.0000000000000000e+00 4212 -1.2500000000000000e-01 4213 -1.2500000000000000e-01 4214 0.0000000000000000e+00 4215 0.0000000000000000e+00 4216 -1.2500000000000000e-01 4217 0.0000000000000000e+00 4218 -1.2500000000000000e-01 4219 0.0000000000000000e+00 4220 -1.2500000000000000e-01 4221 -1.2500000000000000e-01 4222 0.0000000000000000e+00 4223 0.0000000000000000e+00 4224 -1.2500000000000000e-01 4225 -1.2500000000000000e-01 4226 0.0000000000000000e+00 4227 -1.2500000000000000e-01 4228 -1.2500000000000000e-01 4229 -1.2500000000000000e-01 4230 -1.2500000000000000e-01 4231 -1.2500000000000000e-01 4232 0.0000000000000000e+00 4233 0.0000000000000000e+00 4234 0.0000000000000000e+00 4235 0.0000000000000000e+00 4236 0.0000000000000000e+00 4237 -1.2500000000000000e-01 4238 -1.2500000000000000e-01 4239 0.0000000000000000e+00 4240 0.0000000000000000e+00 4241 1.2500000000000000e-01 4242 1.2500000000000000e-01 4243 0.0000000000000000e+00 4244 1.2500000000000000e-01 4245 1.2500000000000000e-01 4246 1.2500000000000000e-01 4247 1.2500000000000000e-01 4248 1.2500000000000000e-01 4249 0.0000000000000000e+00 4250 -1.2500000000000000e-01 4251 0.0000000000000000e+00 4252 -1.2500000000000000e-01 4253 -1.2500000000000000e-01 4254 -1.2500000000000000e-01 4255 0.0000000000000000e+00 4256 0.0000000000000000e+00 4257 -1.2500000000000000e-01 4258 0.0000000000000000e+00 4259 0.0000000000000000e+00 4260 1.2500000000000000e-01 4261 0.0000000000000000e+00 4262 -1.2500000000000000e-01 4263 0.0000000000000000e+00 4264 0.0000000000000000e+00 4265 1.2500000000000000e-01 4266 1.2500000000000000e-01 4267 1.2500000000000000e-01 4268 -1.2500000000000000e-01 4269 -1.2500000000000000e-01 4270 -1.2500000000000000e-01 4271 1.2500000000000000e-01 4272 1.2500000000000000e-01 4273 -1.2500000000000000e-01 4274 -1.2500000000000000e-01 4275 -1.2500000000000000e-01 4276 0.0000000000000000e+00 4277 0.0000000000000000e+00 4278 -1.2500000000000000e-01 4279 0.0000000000000000e+00 4280 -1.2500000000000000e-01 4281 -1.2500000000000000e-01 4282 0.0000000000000000e+00 4283 0.0000000000000000e+00 4284 0.0000000000000000e+00 4285 -2.5000000000000000e-01 4286 -1.2500000000000000e-01 4287 1.2500000000000000e-01 4288 0.0000000000000000e+00 4289 1.2500000000000000e-01 4290 -1.2500000000000000e-01 4291 -1.2500000000000000e-01 4292 0.0000000000000000e+00 4293 0.0000000000000000e+00 4294 -1.2500000000000000e-01 4295 -1.2500000000000000e-01 4296 0.0000000000000000e+00 4297 -1.2500000000000000e-01 4298 -1.2500000000000000e-01 4299 0.0000000000000000e+00 4300 0.0000000000000000e+00 4301 0.0000000000000000e+00 4302 0.0000000000000000e+00 4303 -1.2500000000000000e-01 4304 -1.2500000000000000e-01 4305 -1.2500000000000000e-01 4306 0.0000000000000000e+00 4307 0.0000000000000000e+00 4308 1.2500000000000000e-01 4309 1.2500000000000000e-01 4310 1.2500000000000000e-01 4311 -1.2500000000000000e-01 4312 -1.2500000000000000e-01 4313 1.2500000000000000e-01 4314 1.2500000000000000e-01 4315 1.2500000000000000e-01 4316 0.0000000000000000e+00 4317 1.2500000000000000e-01 4318 1.2500000000000000e-01 4319 1.2500000000000000e-01 4320 1.2500000000000000e-01 4321 -1.2500000000000000e-01 4322 0.0000000000000000e+00 4323 0.0000000000000000e+00 4324 1.2500000000000000e-01 4325 0.0000000000000000e+00 4326 1.2500000000000000e-01 4327 1.2500000000000000e-01 4328 -1.2500000000000000e-01 4329 -1.2500000000000000e-01 4330 -1.2500000000000000e-01 4331 1.2500000000000000e-01 4332 1.2500000000000000e-01 4333 1.2500000000000000e-01 4334 1.2500000000000000e-01 4335 1.2500000000000000e-01 4336 1.2500000000000000e-01 4337 0.0000000000000000e+00 4338 0.0000000000000000e+00 4339 0.0000000000000000e+00 4340 1.2500000000000000e-01 4341 1.2500000000000000e-01 4342 0.0000000000000000e+00 4343 1.2500000000000000e-01 4344 1.2500000000000000e-01 4345 0.0000000000000000e+00 4346 1.2500000000000000e-01 4347 0.0000000000000000e+00 4348 0.0000000000000000e+00 4349 0.0000000000000000e+00 4350 1.2500000000000000e-01 4351 0.0000000000000000e+00 4352 0.0000000000000000e+00 4353 1.2500000000000000e-01 4354 1.2500000000000000e-01 4355 1.2500000000000000e-01 4356 1.2500000000000000e-01 4357 1.2500000000000000e-01 4358 0.0000000000000000e+00 4359 0.0000000000000000e+00 4360 0.0000000000000000e+00 4361 1.2500000000000000e-01 4362 1.2500000000000000e-01 4363 0.0000000000000000e+00 4364 1.2500000000000000e-01 4365 0.0000000000000000e+00 4366 -1.2500000000000000e-01 4367 -1.2500000000000000e-01 4368 0.0000000000000000e+00 4369 -1.2500000000000000e-01 4370 -1.2500000000000000e-01 4371 0.0000000000000000e+00 4372 0.0000000000000000e+00 4373 0.0000000000000000e+00 4374 0.0000000000000000e+00 4375 -1.2500000000000000e-01 4376 -1.2500000000000000e-01 4377 1.2500000000000000e-01 4378 1.2500000000000000e-01 4379 1.2500000000000000e-01 4380 1.2500000000000000e-01 4381 1.2500000000000000e-01 4382 0.0000000000000000e+00 4383 1.2500000000000000e-01 4384 0.0000000000000000e+00 4385 -1.2500000000000000e-01 4386 0.0000000000000000e+00 4387 0.0000000000000000e+00 4388 -1.2500000000000000e-01 4389 -1.2500000000000000e-01 4390 0.0000000000000000e+00 4391 1.2500000000000000e-01 4392 1.2500000000000000e-01 4393 1.2500000000000000e-01 4394 0.0000000000000000e+00 4395 1.2500000000000000e-01 4396 1.2500000000000000e-01 4397 1.2500000000000000e-01 4398 0.0000000000000000e+00 4399 1.2500000000000000e-01 4400 0.0000000000000000e+00 4401 0.0000000000000000e+00 4402 0.0000000000000000e+00 4403 0.0000000000000000e+00 4404 -1.2500000000000000e-01 4405 -1.2500000000000000e-01 4406 -1.2500000000000000e-01 4407 0.0000000000000000e+00 4408 0.0000000000000000e+00 4409 1.2500000000000000e-01 4410 -1.2500000000000000e-01 4411 -1.2500000000000000e-01 4412 1.2500000000000000e-01 4413 0.0000000000000000e+00 4414 0.0000000000000000e+00 4415 -1.2500000000000000e-01 4416 0.0000000000000000e+00 4417 0.0000000000000000e+00 4418 0.0000000000000000e+00 4419 0.0000000000000000e+00 4420 -1.2500000000000000e-01 4421 -1.2500000000000000e-01 4422 1.2500000000000000e-01 4423 0.0000000000000000e+00 4424 -1.2500000000000000e-01 4425 0.0000000000000000e+00 4426 1.2500000000000000e-01 4427 -1.2500000000000000e-01 4428 0.0000000000000000e+00 4429 0.0000000000000000e+00 4430 -1.2500000000000000e-01 4431 -1.2500000000000000e-01 4432 0.0000000000000000e+00 4433 0.0000000000000000e+00 4434 0.0000000000000000e+00 4435 0.0000000000000000e+00 4436 0.0000000000000000e+00 4437 -1.2500000000000000e-01 4438 0.0000000000000000e+00 4439 -1.2500000000000000e-01 4440 1.2500000000000000e-01 4441 1.2500000000000000e-01 4442 0.0000000000000000e+00 4443 -1.2500000000000000e-01 4444 1.2500000000000000e-01 4445 1.2500000000000000e-01 4446 1.2500000000000000e-01 4447 0.0000000000000000e+00 4448 0.0000000000000000e+00 4449 0.0000000000000000e+00 4450 -1.2500000000000000e-01 4451 0.0000000000000000e+00 4452 1.2500000000000000e-01 4453 1.2500000000000000e-01 4454 1.2500000000000000e-01 4455 0.0000000000000000e+00 4456 0.0000000000000000e+00 4457 0.0000000000000000e+00 4458 0.0000000000000000e+00 4459 0.0000000000000000e+00 4460 1.2500000000000000e-01 4461 0.0000000000000000e+00 4462 0.0000000000000000e+00 4463 1.2500000000000000e-01 4464 1.2500000000000000e-01 4465 -1.2500000000000000e-01 4466 0.0000000000000000e+00 4467 -1.2500000000000000e-01 4468 -1.2500000000000000e-01 4469 0.0000000000000000e+00 4470 -1.2500000000000000e-01 4471 0.0000000000000000e+00 4472 0.0000000000000000e+00 4473 1.2500000000000000e-01 4474 1.2500000000000000e-01 4475 0.0000000000000000e+00 4476 0.0000000000000000e+00 4477 0.0000000000000000e+00 4478 0.0000000000000000e+00 4479 1.2500000000000000e-01 4480 1.2500000000000000e-01 4481 -1.2500000000000000e-01 4482 0.0000000000000000e+00 4483 0.0000000000000000e+00 4484 0.0000000000000000e+00 4485 0.0000000000000000e+00 4486 0.0000000000000000e+00 4487 -1.2500000000000000e-01 4488 1.2500000000000000e-01 4489 0.0000000000000000e+00 4490 0.0000000000000000e+00 4491 0.0000000000000000e+00 4492 0.0000000000000000e+00 4493 1.2500000000000000e-01 4494 -1.2500000000000000e-01 4495 -1.2500000000000000e-01 4496 0.0000000000000000e+00 4497 1.2500000000000000e-01 4498 1.2500000000000000e-01 4499 1.2500000000000000e-01 4500 0.0000000000000000e+00 4501 0.0000000000000000e+00 4502 -1.2500000000000000e-01 4503 -1.2500000000000000e-01 4504 0.0000000000000000e+00 4505 -1.2500000000000000e-01 4506 0.0000000000000000e+00 4507 1.2500000000000000e-01 4508 0.0000000000000000e+00 4509 0.0000000000000000e+00 4510 0.0000000000000000e+00 4511 0.0000000000000000e+00 4512 1.2500000000000000e-01 4513 0.0000000000000000e+00 4514 1.2500000000000000e-01 4515 -1.2500000000000000e-01 4516 -1.2500000000000000e-01 4517 -1.2500000000000000e-01 4518 -1.2500000000000000e-01 4519 0.0000000000000000e+00 4520 1.2500000000000000e-01 4521 1.2500000000000000e-01 4522 0.0000000000000000e+00 4523 0.0000000000000000e+00 4524 1.2500000000000000e-01 4525 0.0000000000000000e+00 4526 0.0000000000000000e+00 4527 0.0000000000000000e+00 4528 0.0000000000000000e+00 4529 0.0000000000000000e+00 4530 1.2500000000000000e-01 4531 -1.2500000000000000e-01 4532 -1.2500000000000000e-01 4533 1.2500000000000000e-01 4534 0.0000000000000000e+00 4535 0.0000000000000000e+00 4536 -1.2500000000000000e-01 4537 1.2500000000000000e-01 4538 -1.2500000000000000e-01 4539 -1.2500000000000000e-01 4540 -1.2500000000000000e-01 4541 -1.2500000000000000e-01 4542 0.0000000000000000e+00 4543 1.2500000000000000e-01 4544 1.2500000000000000e-01 4545 1.2500000000000000e-01 4546 0.0000000000000000e+00 4547 -1.2500000000000000e-01 4548 0.0000000000000000e+00 4549 1.2500000000000000e-01 4550 0.0000000000000000e+00 4551 1.2500000000000000e-01 4552 -1.2500000000000000e-01 4553 0.0000000000000000e+00 4554 1.2500000000000000e-01 4555 -1.2500000000000000e-01 4556 0.0000000000000000e+00 4557 1.2500000000000000e-01 4558 0.0000000000000000e+00 4559 0.0000000000000000e+00 4560 0.0000000000000000e+00 4561 -1.2500000000000000e-01 4562 -1.2500000000000000e-01 4563 -1.2500000000000000e-01 4564 -1.2500000000000000e-01 4565 1.2500000000000000e-01 4566 -1.2500000000000000e-01 4567 -1.2500000000000000e-01 4568 1.2500000000000000e-01 4569 -1.2500000000000000e-01 4570 -1.2500000000000000e-01 4571 1.2500000000000000e-01 4572 0.0000000000000000e+00 4573 1.2500000000000000e-01 4574 -1.2500000000000000e-01 4575 0.0000000000000000e+00 4576 0.0000000000000000e+00 4577 0.0000000000000000e+00 4578 -1.2500000000000000e-01 4579 1.2500000000000000e-01 4580 0.0000000000000000e+00 4581 0.0000000000000000e+00 4582 0.0000000000000000e+00 4583 0.0000000000000000e+00 4584 0.0000000000000000e+00 4585 0.0000000000000000e+00 4586 0.0000000000000000e+00 4587 -1.2500000000000000e-01 4588 0.0000000000000000e+00 4589 0.0000000000000000e+00 4590 1.2500000000000000e-01 4591 1.2500000000000000e-01 4592 0.0000000000000000e+00 4593 1.2500000000000000e-01 4594 0.0000000000000000e+00 4595 1.2500000000000000e-01 4596 1.2500000000000000e-01 4597 0.0000000000000000e+00 4598 0.0000000000000000e+00 4599 1.2500000000000000e-01 4600 0.0000000000000000e+00 4601 0.0000000000000000e+00 4602 0.0000000000000000e+00 4603 0.0000000000000000e+00 4604 0.0000000000000000e+00 4605 -1.2500000000000000e-01 4606 0.0000000000000000e+00 4607 1.2500000000000000e-01 4608 1.2500000000000000e-01 4609 1.2500000000000000e-01 4610 0.0000000000000000e+00 4611 -1.2500000000000000e-01 4612 0.0000000000000000e+00 4613 0.0000000000000000e+00 4614 1.2500000000000000e-01 4615 -1.2500000000000000e-01 4616 1.2500000000000000e-01 4617 1.2500000000000000e-01 4618 0.0000000000000000e+00 4619 0.0000000000000000e+00 4620 0.0000000000000000e+00 4621 0.0000000000000000e+00 4622 0.0000000000000000e+00 4623 1.2500000000000000e-01 4624 0.0000000000000000e+00 4625 1.2500000000000000e-01 4626 -1.2500000000000000e-01 4627 -1.2500000000000000e-01 4628 0.0000000000000000e+00 4629 1.2500000000000000e-01 4630 -1.2500000000000000e-01 4631 -1.2500000000000000e-01 4632 0.0000000000000000e+00 4633 0.0000000000000000e+00 4634 0.0000000000000000e+00 4635 1.2500000000000000e-01 4636 0.0000000000000000e+00 4637 -1.2500000000000000e-01 4638 0.0000000000000000e+00 4639 0.0000000000000000e+00 4640 0.0000000000000000e+00 4641 0.0000000000000000e+00 4642 0.0000000000000000e+00 4643 0.0000000000000000e+00 4644 0.0000000000000000e+00 4645 -1.2500000000000000e-01 4646 -1.2500000000000000e-01 4647 0.0000000000000000e+00 4648 0.0000000000000000e+00 4649 0.0000000000000000e+00 4650 0.0000000000000000e+00 4651 -1.2500000000000000e-01 4652 1.2500000000000000e-01 4653 1.2500000000000000e-01 4654 0.0000000000000000e+00 4655 1.2500000000000000e-01 4656 0.0000000000000000e+00 4657 0.0000000000000000e+00 4658 0.0000000000000000e+00 4659 0.0000000000000000e+00 4660 1.2500000000000000e-01 4661 1.2500000000000000e-01 4662 1.2500000000000000e-01 4663 0.0000000000000000e+00 4664 1.2500000000000000e-01 4665 0.0000000000000000e+00 4666 0.0000000000000000e+00 4667 0.0000000000000000e+00 4668 0.0000000000000000e+00 4669 -1.2500000000000000e-01 4670 -1.2500000000000000e-01 4671 -1.2500000000000000e-01 4672 0.0000000000000000e+00 4673 0.0000000000000000e+00 4674 1.2500000000000000e-01 4675 -1.2500000000000000e-01 4676 -1.2500000000000000e-01 4677 1.2500000000000000e-01 4678 0.0000000000000000e+00 4679 0.0000000000000000e+00 4680 -1.2500000000000000e-01 4681 0.0000000000000000e+00 4682 0.0000000000000000e+00 4683 0.0000000000000000e+00 4684 0.0000000000000000e+00 4685 -1.2500000000000000e-01 4686 -1.2500000000000000e-01 4687 1.2500000000000000e-01 4688 0.0000000000000000e+00 4689 -1.2500000000000000e-01 4690 0.0000000000000000e+00 4691 1.2500000000000000e-01 4692 -1.2500000000000000e-01 4693 0.0000000000000000e+00 4694 0.0000000000000000e+00 4695 1.2500000000000000e-01 4696 1.2500000000000000e-01 4697 0.0000000000000000e+00 4698 -1.2500000000000000e-01 4699 1.2500000000000000e-01 4700 1.2500000000000000e-01 4701 0.0000000000000000e+00 4702 -1.2500000000000000e-01 4703 0.0000000000000000e+00 4704 0.0000000000000000e+00 4705 -1.2500000000000000e-01 4706 0.0000000000000000e+00 4707 0.0000000000000000e+00 4708 0.0000000000000000e+00 4709 -1.2500000000000000e-01 4710 0.0000000000000000e+00 4711 0.0000000000000000e+00 4712 0.0000000000000000e+00 4713 0.0000000000000000e+00 4714 -1.2500000000000000e-01 4715 1.2500000000000000e-01 4716 0.0000000000000000e+00 4717 0.0000000000000000e+00 4718 0.0000000000000000e+00 4719 1.2500000000000000e-01 4720 0.0000000000000000e+00 4721 0.0000000000000000e+00 4722 1.2500000000000000e-01 4723 -1.2500000000000000e-01 4724 1.2500000000000000e-01 4725 1.2500000000000000e-01 4726 0.0000000000000000e+00 4727 1.2500000000000000e-01 4728 1.2500000000000000e-01 4729 -1.2500000000000000e-01 4730 -1.2500000000000000e-01 4731 0.0000000000000000e+00 4732 0.0000000000000000e+00 4733 -1.2500000000000000e-01 4734 0.0000000000000000e+00 4735 0.0000000000000000e+00 4736 1.2500000000000000e-01 4737 1.2500000000000000e-01 4738 0.0000000000000000e+00 4739 1.2500000000000000e-01 4740 0.0000000000000000e+00 4741 0.0000000000000000e+00 4742 0.0000000000000000e+00 4743 -1.2500000000000000e-01 4744 -1.2500000000000000e-01 4745 -1.2500000000000000e-01 4746 0.0000000000000000e+00 4747 1.2500000000000000e-01 4748 0.0000000000000000e+00 4749 0.0000000000000000e+00 4750 -1.2500000000000000e-01 4751 0.0000000000000000e+00 4752 -1.2500000000000000e-01 4753 1.2500000000000000e-01 4754 -1.2500000000000000e-01 4755 0.0000000000000000e+00 4756 0.0000000000000000e+00 4757 1.2500000000000000e-01 4758 0.0000000000000000e+00 4759 0.0000000000000000e+00 4760 -1.2500000000000000e-01 4761 0.0000000000000000e+00 4762 1.2500000000000000e-01 4763 1.2500000000000000e-01 4764 0.0000000000000000e+00 4765 1.2500000000000000e-01 4766 -1.2500000000000000e-01 4767 0.0000000000000000e+00 4768 1.2500000000000000e-01 4769 0.0000000000000000e+00 4770 0.0000000000000000e+00 4771 0.0000000000000000e+00 4772 -1.2500000000000000e-01 4773 -1.2500000000000000e-01 4774 -1.2500000000000000e-01 4775 1.2500000000000000e-01 4776 1.2500000000000000e-01 4777 0.0000000000000000e+00 4778 -1.2500000000000000e-01 4779 -1.2500000000000000e-01 4780 1.2500000000000000e-01 4781 0.0000000000000000e+00 4782 0.0000000000000000e+00 4783 0.0000000000000000e+00 4784 0.0000000000000000e+00 4785 0.0000000000000000e+00 4786 0.0000000000000000e+00 4787 0.0000000000000000e+00 4788 0.0000000000000000e+00 4789 -1.2500000000000000e-01 4790 -1.2500000000000000e-01 4791 -1.2500000000000000e-01 4792 -1.2500000000000000e-01 4793 -1.2500000000000000e-01 4794 0.0000000000000000e+00 4795 0.0000000000000000e+00 4796 -1.2500000000000000e-01 4797 0.0000000000000000e+00 4798 1.2500000000000000e-01 4799 0.0000000000000000e+00 4800 0.0000000000000000e+00 4801 1.2500000000000000e-01 4802 1.2500000000000000e-01 4803 0.0000000000000000e+00 4804 0.0000000000000000e+00 4805 0.0000000000000000e+00 4806 1.2500000000000000e-01 4807 0.0000000000000000e+00 4808 1.2500000000000000e-01 4809 0.0000000000000000e+00 4810 1.2500000000000000e-01 4811 -1.2500000000000000e-01 4812 0.0000000000000000e+00 4813 0.0000000000000000e+00 4814 0.0000000000000000e+00 4815 0.0000000000000000e+00 4816 0.0000000000000000e+00 4817 0.0000000000000000e+00 4818 0.0000000000000000e+00 4819 0.0000000000000000e+00 4820 0.0000000000000000e+00 4821 -1.2500000000000000e-01 4822 1.2500000000000000e-01 4823 0.0000000000000000e+00 4824 -1.2500000000000000e-01 4825 0.0000000000000000e+00 4826 0.0000000000000000e+00 4827 0.0000000000000000e+00 4828 -1.2500000000000000e-01 4829 -1.2500000000000000e-01 4830 0.0000000000000000e+00 4831 0.0000000000000000e+00 4832 0.0000000000000000e+00 4833 0.0000000000000000e+00 4834 0.0000000000000000e+00 4835 1.2500000000000000e-01 4836 0.0000000000000000e+00 4837 0.0000000000000000e+00 4838 0.0000000000000000e+00 4839 -1.2500000000000000e-01 4840 1.2500000000000000e-01 4841 1.2500000000000000e-01 4842 0.0000000000000000e+00 4843 0.0000000000000000e+00 4844 1.2500000000000000e-01 4845 0.0000000000000000e+00 4846 -1.2500000000000000e-01 4847 1.2500000000000000e-01 4848 -1.2500000000000000e-01 4849 0.0000000000000000e+00 4850 0.0000000000000000e+00 4851 0.0000000000000000e+00 4852 0.0000000000000000e+00 4853 0.0000000000000000e+00 4854 0.0000000000000000e+00 4855 -1.2500000000000000e-01 4856 0.0000000000000000e+00 4857 0.0000000000000000e+00 4858 1.2500000000000000e-01 4859 1.2500000000000000e-01 4860 0.0000000000000000e+00 4861 -1.2500000000000000e-01 4862 1.2500000000000000e-01 4863 0.0000000000000000e+00 4864 0.0000000000000000e+00 4865 0.0000000000000000e+00 4866 0.0000000000000000e+00 4867 0.0000000000000000e+00 4868 0.0000000000000000e+00 4869 0.0000000000000000e+00 4870 0.0000000000000000e+00 4871 0.0000000000000000e+00 4872 1.2500000000000000e-01 4873 0.0000000000000000e+00 4874 1.2500000000000000e-01 4875 -1.2500000000000000e-01 4876 0.0000000000000000e+00 4877 0.0000000000000000e+00 4878 0.0000000000000000e+00 4879 0.0000000000000000e+00 4880 0.0000000000000000e+00 4881 0.0000000000000000e+00 4882 0.0000000000000000e+00 4883 -1.2500000000000000e-01 4884 -1.2500000000000000e-01 4885 1.2500000000000000e-01 4886 -1.2500000000000000e-01 4887 -1.2500000000000000e-01 4888 0.0000000000000000e+00 4889 0.0000000000000000e+00 4890 0.0000000000000000e+00 4891 -1.2500000000000000e-01 4892 1.2500000000000000e-01 4893 0.0000000000000000e+00 4894 0.0000000000000000e+00 4895 0.0000000000000000e+00 4896 -1.2500000000000000e-01 4897 0.0000000000000000e+00 4898 -1.2500000000000000e-01 4899 0.0000000000000000e+00 4900 0.0000000000000000e+00 4901 0.0000000000000000e+00 4902 1.2500000000000000e-01 4903 1.2500000000000000e-01 4904 -1.2500000000000000e-01 4905 0.0000000000000000e+00 4906 -1.2500000000000000e-01 4907 0.0000000000000000e+00 4908 0.0000000000000000e+00 4909 -1.2500000000000000e-01 4910 0.0000000000000000e+00 4911 -1.2500000000000000e-01 4912 -1.2500000000000000e-01 4913 0.0000000000000000e+00 4914 -1.2500000000000000e-01 4915 0.0000000000000000e+00 4916 0.0000000000000000e+00 4917 0.0000000000000000e+00 4918 -1.2500000000000000e-01 4919 1.2500000000000000e-01 4920 0.0000000000000000e+00 4921 1.2500000000000000e-01 4922 1.2500000000000000e-01 4923 0.0000000000000000e+00 4924 -1.2500000000000000e-01 4925 0.0000000000000000e+00 4926 1.2500000000000000e-01 4927 0.0000000000000000e+00 4928 1.2500000000000000e-01 4929 -1.2500000000000000e-01 4930 0.0000000000000000e+00 4931 0.0000000000000000e+00 4932 0.0000000000000000e+00 4933 0.0000000000000000e+00 4934 0.0000000000000000e+00 4935 -1.2500000000000000e-01 4936 0.0000000000000000e+00 4937 1.2500000000000000e-01 4938 1.2500000000000000e-01 4939 0.0000000000000000e+00 4940 -1.2500000000000000e-01 4941 -1.2500000000000000e-01 4942 0.0000000000000000e+00 4943 -1.2500000000000000e-01 4944 0.0000000000000000e+00 4945 1.2500000000000000e-01 4946 -1.2500000000000000e-01 4947 -1.2500000000000000e-01 4948 1.2500000000000000e-01 4949 1.2500000000000000e-01 4950 0.0000000000000000e+00 4951 1.2500000000000000e-01 4952 0.0000000000000000e+00 4953 0.0000000000000000e+00 4954 0.0000000000000000e+00 4955 0.0000000000000000e+00 4956 1.2500000000000000e-01 4957 0.0000000000000000e+00 4958 0.0000000000000000e+00 4959 1.2500000000000000e-01 4960 1.2500000000000000e-01 4961 0.0000000000000000e+00 4962 1.2500000000000000e-01 4963 0.0000000000000000e+00 4964 1.2500000000000000e-01 4965 1.2500000000000000e-01 4966 0.0000000000000000e+00 4967 0.0000000000000000e+00 4968 0.0000000000000000e+00 4969 0.0000000000000000e+00 4970 1.2500000000000000e-01 4971 1.2500000000000000e-01 4972 0.0000000000000000e+00 4973 0.0000000000000000e+00 4974 0.0000000000000000e+00 4975 0.0000000000000000e+00 4976 -1.2500000000000000e-01 4977 0.0000000000000000e+00 4978 1.2500000000000000e-01 4979 0.0000000000000000e+00 4980 0.0000000000000000e+00 4981 0.0000000000000000e+00 4982 0.0000000000000000e+00 4983 0.0000000000000000e+00 4984 1.2500000000000000e-01 4985 -1.2500000000000000e-01 4986 -1.2500000000000000e-01 4987 -1.2500000000000000e-01 4988 0.0000000000000000e+00 4989 1.2500000000000000e-01 4990 0.0000000000000000e+00 4991 0.0000000000000000e+00 4992 0.0000000000000000e+00 4993 -1.2500000000000000e-01 4994 0.0000000000000000e+00 4995 0.0000000000000000e+00 4996 1.2500000000000000e-01 4997 -1.2500000000000000e-01 4998 1.2500000000000000e-01 4999 0.0000000000000000e+00 5000 1.2500000000000000e-01 5001 0.0000000000000000e+00 5002 0.0000000000000000e+00 5003 0.0000000000000000e+00 5004 0.0000000000000000e+00 5005 -1.2500000000000000e-01 5006 0.0000000000000000e+00 5007 -1.2500000000000000e-01 5008 0.0000000000000000e+00 5009 0.0000000000000000e+00 5010 0.0000000000000000e+00 5011 0.0000000000000000e+00 5012 0.0000000000000000e+00 5013 -1.2500000000000000e-01 5014 0.0000000000000000e+00 5015 0.0000000000000000e+00 5016 -1.2500000000000000e-01 5017 1.2500000000000000e-01 5018 -1.2500000000000000e-01 5019 0.0000000000000000e+00 5020 0.0000000000000000e+00 5021 0.0000000000000000e+00 5022 -1.2500000000000000e-01 5023 -1.2500000000000000e-01 5024 0.0000000000000000e+00 5025 0.0000000000000000e+00 5026 1.2500000000000000e-01 5027 0.0000000000000000e+00 5028 -1.2500000000000000e-01 5029 0.0000000000000000e+00 5030 -1.2500000000000000e-01 5031 0.0000000000000000e+00 5032 0.0000000000000000e+00 5033 0.0000000000000000e+00 5034 -1.2500000000000000e-01 5035 -1.2500000000000000e-01 5036 0.0000000000000000e+00 5037 -1.2500000000000000e-01 5038 0.0000000000000000e+00 5039 -1.2500000000000000e-01 5040 0.0000000000000000e+00 5041 0.0000000000000000e+00 5042 0.0000000000000000e+00 5043 -1.2500000000000000e-01 5044 0.0000000000000000e+00 5045 0.0000000000000000e+00 5046 0.0000000000000000e+00 5047 0.0000000000000000e+00 5048 -1.2500000000000000e-01 5049 -1.2500000000000000e-01 5050 -1.2500000000000000e-01 5051 0.0000000000000000e+00 5052 0.0000000000000000e+00 5053 0.0000000000000000e+00 5054 -1.2500000000000000e-01 5055 0.0000000000000000e+00 5056 0.0000000000000000e+00 5057 -1.2500000000000000e-01 5058 0.0000000000000000e+00 5059 0.0000000000000000e+00 5060 0.0000000000000000e+00 5061 1.2500000000000000e-01 5062 0.0000000000000000e+00 5063 1.2500000000000000e-01 5064 0.0000000000000000e+00 5065 0.0000000000000000e+00 5066 0.0000000000000000e+00 5067 -1.2500000000000000e-01 5068 0.0000000000000000e+00 5069 0.0000000000000000e+00 5070 0.0000000000000000e+00 5071 -1.2500000000000000e-01 5072 0.0000000000000000e+00 5073 0.0000000000000000e+00 5074 0.0000000000000000e+00 5075 0.0000000000000000e+00 5076 0.0000000000000000e+00 5077 0.0000000000000000e+00 5078 1.2500000000000000e-01 5079 0.0000000000000000e+00 5080 1.2500000000000000e-01 hypre-2.33.0/src/test/TEST_ams/mfem.Gy.00000000066400000000000000000000713531477326011500200150ustar00rootroot000000000000001 1075 1 1.2500000000000000e-01 2 1.2500000000000000e-01 3 0.0000000000000000e+00 4 0.0000000000000000e+00 5 1.2500000000000000e-01 6 1.2500000000000000e-01 7 1.2500000000000000e-01 8 6.2500000000000000e-02 9 1.2500000000000000e-01 10 0.0000000000000000e+00 11 6.2500000000000000e-02 12 -1.2500000000000000e-01 13 -1.2500000000000000e-01 14 -6.2500000000000000e-02 15 -1.2500000000000000e-01 16 0.0000000000000000e+00 17 -6.2500000000000000e-02 18 1.2500000000000000e-01 19 0.0000000000000000e+00 20 0.0000000000000000e+00 21 -1.2500000000000000e-01 22 0.0000000000000000e+00 23 0.0000000000000000e+00 24 0.0000000000000000e+00 25 6.2500000000000000e-02 26 0.0000000000000000e+00 27 -6.2500000000000000e-02 28 -1.2500000000000000e-01 29 -1.2500000000000000e-01 30 1.2500000000000000e-01 31 1.2500000000000000e-01 32 1.2500000000000000e-01 33 0.0000000000000000e+00 34 0.0000000000000000e+00 35 1.2500000000000000e-01 36 -1.2500000000000000e-01 37 -1.2500000000000000e-01 38 1.2500000000000000e-01 39 0.0000000000000000e+00 40 6.2500000000000000e-02 41 6.2500000000000000e-02 42 0.0000000000000000e+00 43 1.2500000000000000e-01 44 1.2500000000000000e-01 45 0.0000000000000000e+00 46 0.0000000000000000e+00 47 -6.2500000000000000e-02 48 -1.2500000000000000e-01 49 -1.2500000000000000e-01 50 -1.2500000000000000e-01 51 1.2500000000000000e-01 52 -1.2500000000000000e-01 53 -1.2500000000000000e-01 54 -6.2500000000000000e-02 55 -1.2500000000000000e-01 56 0.0000000000000000e+00 57 1.2500000000000000e-01 58 1.2500000000000000e-01 59 6.2500000000000000e-02 60 1.2500000000000000e-01 61 0.0000000000000000e+00 62 0.0000000000000000e+00 63 0.0000000000000000e+00 64 0.0000000000000000e+00 65 -6.2500000000000000e-02 66 0.0000000000000000e+00 67 6.2500000000000000e-02 68 1.2500000000000000e-01 69 1.2500000000000000e-01 70 -1.2500000000000000e-01 71 -1.2500000000000000e-01 72 -1.2500000000000000e-01 73 1.2500000000000000e-01 74 -1.2500000000000000e-01 75 0.0000000000000000e+00 76 -6.2500000000000000e-02 77 -6.2500000000000000e-02 78 0.0000000000000000e+00 79 6.2500000000000000e-02 80 0.0000000000000000e+00 81 0.0000000000000000e+00 82 -6.2500000000000000e-02 83 6.2500000000000000e-02 84 1.2500000000000000e-01 85 -1.2500000000000000e-01 86 0.0000000000000000e+00 87 -6.2500000000000000e-02 88 0.0000000000000000e+00 89 6.2500000000000000e-02 90 1.2500000000000000e-01 91 -1.2500000000000000e-01 92 1.2500000000000000e-01 93 1.2500000000000000e-01 94 6.2500000000000000e-02 95 0.0000000000000000e+00 96 0.0000000000000000e+00 97 1.2500000000000000e-01 98 -1.2500000000000000e-01 99 -1.2500000000000000e-01 100 -1.2500000000000000e-01 101 -1.2500000000000000e-01 102 -6.2500000000000000e-02 103 0.0000000000000000e+00 104 0.0000000000000000e+00 105 6.2500000000000000e-02 106 -1.2500000000000000e-01 107 1.2500000000000000e-01 108 -2.5000000000000000e-01 109 1.2500000000000000e-01 110 0.0000000000000000e+00 111 -1.2500000000000000e-01 112 1.2500000000000000e-01 113 6.2500000000000000e-02 114 1.2500000000000000e-01 115 0.0000000000000000e+00 116 1.2500000000000000e-01 117 0.0000000000000000e+00 118 1.2500000000000000e-01 119 -1.2500000000000000e-01 120 0.0000000000000000e+00 121 -6.2500000000000000e-02 122 -6.2500000000000000e-02 123 0.0000000000000000e+00 124 6.2500000000000000e-02 125 1.2500000000000000e-01 126 1.2500000000000000e-01 127 6.2500000000000000e-02 128 6.2500000000000000e-02 129 1.2500000000000000e-01 130 0.0000000000000000e+00 131 0.0000000000000000e+00 132 -6.2500000000000000e-02 133 6.2500000000000000e-02 134 1.2500000000000000e-01 135 0.0000000000000000e+00 136 -1.2500000000000000e-01 137 -6.2500000000000000e-02 138 -1.2500000000000000e-01 139 -1.2500000000000000e-01 140 -1.2500000000000000e-01 141 0.0000000000000000e+00 142 0.0000000000000000e+00 143 0.0000000000000000e+00 144 1.2500000000000000e-01 145 0.0000000000000000e+00 146 0.0000000000000000e+00 147 -6.2500000000000000e-02 148 6.2500000000000000e-02 149 1.2500000000000000e-01 150 -1.2500000000000000e-01 151 0.0000000000000000e+00 152 0.0000000000000000e+00 153 -6.2500000000000000e-02 154 0.0000000000000000e+00 155 0.0000000000000000e+00 156 -6.2500000000000000e-02 157 0.0000000000000000e+00 158 0.0000000000000000e+00 159 -6.2500000000000000e-02 160 0.0000000000000000e+00 161 0.0000000000000000e+00 162 -6.2500000000000000e-02 163 6.2500000000000000e-02 164 6.2500000000000000e-02 165 6.2500000000000000e-02 166 6.2500000000000000e-02 167 -1.2500000000000000e-01 168 -1.2500000000000000e-01 169 -1.2500000000000000e-01 170 -1.2500000000000000e-01 171 -1.2500000000000000e-01 172 1.2500000000000000e-01 173 1.2500000000000000e-01 174 1.2500000000000000e-01 175 1.2500000000000000e-01 176 1.2500000000000000e-01 177 1.2500000000000000e-01 178 1.2500000000000000e-01 179 6.2500000000000000e-02 180 -1.2500000000000000e-01 181 0.0000000000000000e+00 182 -6.2500000000000000e-02 183 -1.2500000000000000e-01 184 -6.2500000000000000e-02 185 6.2500000000000000e-02 186 0.0000000000000000e+00 187 0.0000000000000000e+00 188 -1.2500000000000000e-01 189 0.0000000000000000e+00 190 1.2500000000000000e-01 191 1.2500000000000000e-01 192 0.0000000000000000e+00 193 -1.2500000000000000e-01 194 1.2500000000000000e-01 195 1.2500000000000000e-01 196 6.2500000000000000e-02 197 6.2500000000000000e-02 198 1.2500000000000000e-01 199 6.2500000000000000e-02 200 0.0000000000000000e+00 201 0.0000000000000000e+00 202 -6.2500000000000000e-02 203 0.0000000000000000e+00 204 1.2500000000000000e-01 205 6.2500000000000000e-02 206 1.2500000000000000e-01 207 -1.2500000000000000e-01 208 0.0000000000000000e+00 209 -6.2500000000000000e-02 210 -6.2500000000000000e-02 211 0.0000000000000000e+00 212 -1.2500000000000000e-01 213 -1.2500000000000000e-01 214 0.0000000000000000e+00 215 0.0000000000000000e+00 216 0.0000000000000000e+00 217 -6.2500000000000000e-02 218 -1.2500000000000000e-01 219 -1.2500000000000000e-01 220 -1.2500000000000000e-01 221 -1.2500000000000000e-01 222 -6.2500000000000000e-02 223 0.0000000000000000e+00 224 -6.2500000000000000e-02 225 1.2500000000000000e-01 226 6.2500000000000000e-02 227 6.2500000000000000e-02 228 -1.2500000000000000e-01 229 0.0000000000000000e+00 230 -1.2500000000000000e-01 231 -1.2500000000000000e-01 232 0.0000000000000000e+00 233 1.2500000000000000e-01 234 0.0000000000000000e+00 235 0.0000000000000000e+00 236 6.2500000000000000e-02 237 1.2500000000000000e-01 238 0.0000000000000000e+00 239 1.2500000000000000e-01 240 1.2500000000000000e-01 241 0.0000000000000000e+00 242 0.0000000000000000e+00 243 6.2500000000000000e-02 244 0.0000000000000000e+00 245 1.2500000000000000e-01 246 6.2500000000000000e-02 247 0.0000000000000000e+00 248 0.0000000000000000e+00 249 1.2500000000000000e-01 250 -1.2500000000000000e-01 251 -1.2500000000000000e-01 252 -6.2500000000000000e-02 253 -6.2500000000000000e-02 254 -1.2500000000000000e-01 255 -6.2500000000000000e-02 256 0.0000000000000000e+00 257 0.0000000000000000e+00 258 6.2500000000000000e-02 259 -6.2500000000000000e-02 260 -1.2500000000000000e-01 261 0.0000000000000000e+00 262 1.2500000000000000e-01 263 6.2500000000000000e-02 264 1.2500000000000000e-01 265 1.2500000000000000e-01 266 6.2500000000000000e-02 267 0.0000000000000000e+00 268 0.0000000000000000e+00 269 -1.2500000000000000e-01 270 0.0000000000000000e+00 271 1.2500000000000000e-01 272 0.0000000000000000e+00 273 6.2500000000000000e-02 274 1.2500000000000000e-01 275 0.0000000000000000e+00 276 1.2500000000000000e-01 277 0.0000000000000000e+00 278 6.2500000000000000e-02 279 -1.2500000000000000e-01 280 -6.2500000000000000e-02 281 1.2500000000000000e-01 282 1.2500000000000000e-01 283 6.2500000000000000e-02 284 0.0000000000000000e+00 285 1.2500000000000000e-01 286 6.2500000000000000e-02 287 0.0000000000000000e+00 288 1.2500000000000000e-01 289 1.2500000000000000e-01 290 -1.2500000000000000e-01 291 -6.2500000000000000e-02 292 -1.2500000000000000e-01 293 -1.2500000000000000e-01 294 0.0000000000000000e+00 295 0.0000000000000000e+00 296 -6.2500000000000000e-02 297 0.0000000000000000e+00 298 0.0000000000000000e+00 299 -6.2500000000000000e-02 300 -1.2500000000000000e-01 301 0.0000000000000000e+00 302 0.0000000000000000e+00 303 6.2500000000000000e-02 304 -6.2500000000000000e-02 305 -1.2500000000000000e-01 306 0.0000000000000000e+00 307 1.2500000000000000e-01 308 1.2500000000000000e-01 309 -1.2500000000000000e-01 310 -1.2500000000000000e-01 311 -6.2500000000000000e-02 312 0.0000000000000000e+00 313 -1.2500000000000000e-01 314 -1.2500000000000000e-01 315 0.0000000000000000e+00 316 -6.2500000000000000e-02 317 1.2500000000000000e-01 318 6.2500000000000000e-02 319 6.2500000000000000e-02 320 0.0000000000000000e+00 321 0.0000000000000000e+00 322 1.2500000000000000e-01 323 -1.2500000000000000e-01 324 -1.2500000000000000e-01 325 -6.2500000000000000e-02 326 -6.2500000000000000e-02 327 -1.2500000000000000e-01 328 -6.2500000000000000e-02 329 1.2500000000000000e-01 330 0.0000000000000000e+00 331 6.2500000000000000e-02 332 6.2500000000000000e-02 333 0.0000000000000000e+00 334 0.0000000000000000e+00 335 0.0000000000000000e+00 336 6.2500000000000000e-02 337 -6.2500000000000000e-02 338 -1.2500000000000000e-01 339 0.0000000000000000e+00 340 1.2500000000000000e-01 341 6.2500000000000000e-02 342 1.2500000000000000e-01 343 1.2500000000000000e-01 344 1.2500000000000000e-01 345 0.0000000000000000e+00 346 0.0000000000000000e+00 347 0.0000000000000000e+00 348 -1.2500000000000000e-01 349 -1.2500000000000000e-01 350 -1.2500000000000000e-01 351 -6.2500000000000000e-02 352 0.0000000000000000e+00 353 -6.2500000000000000e-02 354 1.2500000000000000e-01 355 6.2500000000000000e-02 356 1.2500000000000000e-01 357 6.2500000000000000e-02 358 0.0000000000000000e+00 359 0.0000000000000000e+00 360 1.2500000000000000e-01 361 0.0000000000000000e+00 362 -1.2500000000000000e-01 363 -1.2500000000000000e-01 364 0.0000000000000000e+00 365 1.2500000000000000e-01 366 -1.2500000000000000e-01 367 -1.2500000000000000e-01 368 -6.2500000000000000e-02 369 -6.2500000000000000e-02 370 -1.2500000000000000e-01 371 -6.2500000000000000e-02 372 0.0000000000000000e+00 373 0.0000000000000000e+00 374 6.2500000000000000e-02 375 -6.2500000000000000e-02 376 -1.2500000000000000e-01 377 0.0000000000000000e+00 378 1.2500000000000000e-01 379 6.2500000000000000e-02 380 1.2500000000000000e-01 381 1.2500000000000000e-01 382 6.2500000000000000e-02 383 0.0000000000000000e+00 384 0.0000000000000000e+00 385 -1.2500000000000000e-01 386 0.0000000000000000e+00 387 1.2500000000000000e-01 388 0.0000000000000000e+00 389 6.2500000000000000e-02 390 1.2500000000000000e-01 391 0.0000000000000000e+00 392 -1.2500000000000000e-01 393 -1.2500000000000000e-01 394 -6.2500000000000000e-02 395 -1.2500000000000000e-01 396 -6.2500000000000000e-02 397 -1.2500000000000000e-01 398 -6.2500000000000000e-02 399 -1.2500000000000000e-01 400 -1.2500000000000000e-01 401 -1.2500000000000000e-01 402 1.2500000000000000e-01 403 0.0000000000000000e+00 404 6.2500000000000000e-02 405 6.2500000000000000e-02 406 0.0000000000000000e+00 407 -6.2500000000000000e-02 408 0.0000000000000000e+00 409 0.0000000000000000e+00 410 6.2500000000000000e-02 411 -6.2500000000000000e-02 412 -1.2500000000000000e-01 413 1.2500000000000000e-01 414 0.0000000000000000e+00 415 6.2500000000000000e-02 416 0.0000000000000000e+00 417 -6.2500000000000000e-02 418 -1.2500000000000000e-01 419 1.2500000000000000e-01 420 1.2500000000000000e-01 421 1.2500000000000000e-01 422 -1.2500000000000000e-01 423 -1.2500000000000000e-01 424 -6.2500000000000000e-02 425 0.0000000000000000e+00 426 0.0000000000000000e+00 427 -1.2500000000000000e-01 428 -6.2500000000000000e-02 429 -1.2500000000000000e-01 430 -6.2500000000000000e-02 431 -1.2500000000000000e-01 432 -1.2500000000000000e-01 433 -6.2500000000000000e-02 434 -1.2500000000000000e-01 435 -1.2500000000000000e-01 436 -6.2500000000000000e-02 437 -1.2500000000000000e-01 438 -1.2500000000000000e-01 439 -6.2500000000000000e-02 440 -1.2500000000000000e-01 441 0.0000000000000000e+00 442 1.2500000000000000e-01 443 0.0000000000000000e+00 444 1.2500000000000000e-01 445 0.0000000000000000e+00 446 6.2500000000000000e-02 447 0.0000000000000000e+00 448 -1.2500000000000000e-01 449 -6.2500000000000000e-02 450 0.0000000000000000e+00 451 6.2500000000000000e-02 452 1.2500000000000000e-01 453 1.2500000000000000e-01 454 1.2500000000000000e-01 455 6.2500000000000000e-02 456 1.2500000000000000e-01 457 1.2500000000000000e-01 458 1.2500000000000000e-01 459 6.2500000000000000e-02 460 0.0000000000000000e+00 461 6.2500000000000000e-02 462 1.2500000000000000e-01 463 0.0000000000000000e+00 464 1.2500000000000000e-01 465 0.0000000000000000e+00 466 0.0000000000000000e+00 467 0.0000000000000000e+00 468 -1.2500000000000000e-01 469 -6.2500000000000000e-02 470 -1.2500000000000000e-01 471 -6.2500000000000000e-02 472 -1.2500000000000000e-01 473 -1.2500000000000000e-01 474 -6.2500000000000000e-02 475 -1.2500000000000000e-01 476 0.0000000000000000e+00 477 0.0000000000000000e+00 478 6.2500000000000000e-02 479 1.2500000000000000e-01 480 0.0000000000000000e+00 481 1.2500000000000000e-01 482 1.2500000000000000e-01 483 6.2500000000000000e-02 484 0.0000000000000000e+00 485 0.0000000000000000e+00 486 1.2500000000000000e-01 487 6.2500000000000000e-02 488 1.2500000000000000e-01 489 6.2500000000000000e-02 490 1.2500000000000000e-01 491 -1.2500000000000000e-01 492 -6.2500000000000000e-02 493 -1.2500000000000000e-01 494 0.0000000000000000e+00 495 -6.2500000000000000e-02 496 0.0000000000000000e+00 497 6.2500000000000000e-02 498 1.2500000000000000e-01 499 6.2500000000000000e-02 500 -1.2500000000000000e-01 501 -6.2500000000000000e-02 502 0.0000000000000000e+00 503 6.2500000000000000e-02 504 1.2500000000000000e-01 505 6.2500000000000000e-02 506 -6.2500000000000000e-02 507 -6.2500000000000000e-02 508 -6.2500000000000000e-02 509 6.2500000000000000e-02 510 6.2500000000000000e-02 511 -6.2500000000000000e-02 512 6.2500000000000000e-02 513 6.2500000000000000e-02 514 -6.2500000000000000e-02 515 -6.2500000000000000e-02 516 -6.2500000000000000e-02 517 0.0000000000000000e+00 518 1.2500000000000000e-01 519 0.0000000000000000e+00 520 -6.2500000000000000e-02 521 -6.2500000000000000e-02 522 0.0000000000000000e+00 523 6.2500000000000000e-02 524 0.0000000000000000e+00 525 -6.2500000000000000e-02 526 -1.2500000000000000e-01 527 -6.2500000000000000e-02 528 1.2500000000000000e-01 529 6.2500000000000000e-02 530 0.0000000000000000e+00 531 -6.2500000000000000e-02 532 -1.2500000000000000e-01 533 -6.2500000000000000e-02 534 6.2500000000000000e-02 535 6.2500000000000000e-02 536 6.2500000000000000e-02 537 6.2500000000000000e-02 538 -6.2500000000000000e-02 539 -6.2500000000000000e-02 540 -6.2500000000000000e-02 541 -6.2500000000000000e-02 542 6.2500000000000000e-02 543 6.2500000000000000e-02 544 6.2500000000000000e-02 545 0.0000000000000000e+00 546 -6.2500000000000000e-02 547 6.2500000000000000e-02 548 6.2500000000000000e-02 549 6.2500000000000000e-02 550 0.0000000000000000e+00 551 6.2500000000000000e-02 552 0.0000000000000000e+00 553 1.2500000000000000e-01 554 -1.2500000000000000e-01 555 -1.2500000000000000e-01 556 0.0000000000000000e+00 557 -6.2500000000000000e-02 558 -6.2500000000000000e-02 559 6.2500000000000000e-02 560 0.0000000000000000e+00 561 0.0000000000000000e+00 562 -1.2500000000000000e-01 563 -6.2500000000000000e-02 564 6.2500000000000000e-02 565 6.2500000000000000e-02 566 6.2500000000000000e-02 567 -6.2500000000000000e-02 568 -6.2500000000000000e-02 569 6.2500000000000000e-02 570 -6.2500000000000000e-02 571 6.2500000000000000e-02 572 6.2500000000000000e-02 573 6.2500000000000000e-02 574 -1.2500000000000000e-01 575 0.0000000000000000e+00 576 0.0000000000000000e+00 577 6.2500000000000000e-02 578 6.2500000000000000e-02 579 -6.2500000000000000e-02 580 6.2500000000000000e-02 581 0.0000000000000000e+00 582 -6.2500000000000000e-02 583 0.0000000000000000e+00 584 6.2500000000000000e-02 585 0.0000000000000000e+00 586 -6.2500000000000000e-02 587 0.0000000000000000e+00 588 6.2500000000000000e-02 589 -6.2500000000000000e-02 590 6.2500000000000000e-02 591 -6.2500000000000000e-02 592 6.2500000000000000e-02 593 -1.2500000000000000e-01 594 -6.2500000000000000e-02 595 0.0000000000000000e+00 596 -6.2500000000000000e-02 597 1.2500000000000000e-01 598 6.2500000000000000e-02 599 6.2500000000000000e-02 600 -6.2500000000000000e-02 601 -6.2500000000000000e-02 602 6.2500000000000000e-02 603 6.2500000000000000e-02 604 6.2500000000000000e-02 605 -6.2500000000000000e-02 606 -6.2500000000000000e-02 607 -6.2500000000000000e-02 608 -6.2500000000000000e-02 609 -6.2500000000000000e-02 610 6.2500000000000000e-02 611 -6.2500000000000000e-02 612 -6.2500000000000000e-02 613 1.2500000000000000e-01 614 6.2500000000000000e-02 615 6.2500000000000000e-02 616 -1.2500000000000000e-01 617 -6.2500000000000000e-02 618 -6.2500000000000000e-02 619 -6.2500000000000000e-02 620 6.2500000000000000e-02 621 0.0000000000000000e+00 622 0.0000000000000000e+00 623 6.2500000000000000e-02 624 0.0000000000000000e+00 625 -6.2500000000000000e-02 626 0.0000000000000000e+00 627 6.2500000000000000e-02 628 -6.2500000000000000e-02 629 6.2500000000000000e-02 630 -6.2500000000000000e-02 631 6.2500000000000000e-02 632 -1.2500000000000000e-01 633 -6.2500000000000000e-02 634 0.0000000000000000e+00 635 -6.2500000000000000e-02 636 1.2500000000000000e-01 637 6.2500000000000000e-02 638 6.2500000000000000e-02 639 -6.2500000000000000e-02 640 -6.2500000000000000e-02 641 6.2500000000000000e-02 642 6.2500000000000000e-02 643 6.2500000000000000e-02 644 -6.2500000000000000e-02 645 -6.2500000000000000e-02 646 -6.2500000000000000e-02 647 -6.2500000000000000e-02 648 -6.2500000000000000e-02 649 6.2500000000000000e-02 650 1.2500000000000000e-01 651 6.2500000000000000e-02 652 6.2500000000000000e-02 653 0.0000000000000000e+00 654 6.2500000000000000e-02 655 0.0000000000000000e+00 656 6.2500000000000000e-02 657 0.0000000000000000e+00 658 6.2500000000000000e-02 659 0.0000000000000000e+00 660 6.2500000000000000e-02 661 6.2500000000000000e-02 662 6.2500000000000000e-02 663 -6.2500000000000000e-02 664 6.2500000000000000e-02 665 6.2500000000000000e-02 666 6.2500000000000000e-02 667 6.2500000000000000e-02 668 6.2500000000000000e-02 669 -6.2500000000000000e-02 670 6.2500000000000000e-02 671 6.2500000000000000e-02 672 1.2500000000000000e-01 673 6.2500000000000000e-02 674 -6.2500000000000000e-02 675 6.2500000000000000e-02 676 6.2500000000000000e-02 677 1.2500000000000000e-01 678 -1.2500000000000000e-01 679 -6.2500000000000000e-02 680 0.0000000000000000e+00 681 6.2500000000000000e-02 682 0.0000000000000000e+00 683 0.0000000000000000e+00 684 -6.2500000000000000e-02 685 6.2500000000000000e-02 686 -6.2500000000000000e-02 687 -6.2500000000000000e-02 688 -6.2500000000000000e-02 689 -6.2500000000000000e-02 690 6.2500000000000000e-02 691 -6.2500000000000000e-02 692 6.2500000000000000e-02 693 6.2500000000000000e-02 694 0.0000000000000000e+00 695 6.2500000000000000e-02 696 1.2500000000000000e-01 697 6.2500000000000000e-02 698 -6.2500000000000000e-02 699 6.2500000000000000e-02 700 6.2500000000000000e-02 701 -6.2500000000000000e-02 702 -6.2500000000000000e-02 703 -6.2500000000000000e-02 704 6.2500000000000000e-02 705 -6.2500000000000000e-02 706 -6.2500000000000000e-02 707 -6.2500000000000000e-02 708 0.0000000000000000e+00 709 6.2500000000000000e-02 710 -6.2500000000000000e-02 711 -6.2500000000000000e-02 712 -6.2500000000000000e-02 713 -1.2500000000000000e-01 714 -6.2500000000000000e-02 715 1.2500000000000000e-01 716 6.2500000000000000e-02 717 0.0000000000000000e+00 718 6.2500000000000000e-02 719 6.2500000000000000e-02 720 6.2500000000000000e-02 721 -6.2500000000000000e-02 722 -6.2500000000000000e-02 723 6.2500000000000000e-02 724 6.2500000000000000e-02 725 6.2500000000000000e-02 726 6.2500000000000000e-02 727 6.2500000000000000e-02 728 -6.2500000000000000e-02 729 6.2500000000000000e-02 730 6.2500000000000000e-02 731 -6.2500000000000000e-02 732 6.2500000000000000e-02 733 6.2500000000000000e-02 734 6.2500000000000000e-02 735 -1.2500000000000000e-01 736 -6.2500000000000000e-02 737 1.2500000000000000e-01 738 6.2500000000000000e-02 739 0.0000000000000000e+00 740 6.2500000000000000e-02 741 6.2500000000000000e-02 742 6.2500000000000000e-02 743 -6.2500000000000000e-02 744 -6.2500000000000000e-02 745 6.2500000000000000e-02 746 6.2500000000000000e-02 747 6.2500000000000000e-02 748 6.2500000000000000e-02 749 6.2500000000000000e-02 750 -6.2500000000000000e-02 751 6.2500000000000000e-02 752 6.2500000000000000e-02 753 -1.2500000000000000e-01 754 -6.2500000000000000e-02 755 1.2500000000000000e-01 756 6.2500000000000000e-02 757 6.2500000000000000e-02 758 6.2500000000000000e-02 759 0.0000000000000000e+00 760 -6.2500000000000000e-02 761 0.0000000000000000e+00 762 6.2500000000000000e-02 763 1.2500000000000000e-01 764 6.2500000000000000e-02 765 -6.2500000000000000e-02 766 -6.2500000000000000e-02 767 -6.2500000000000000e-02 768 -6.2500000000000000e-02 769 -6.2500000000000000e-02 770 6.2500000000000000e-02 771 6.2500000000000000e-02 772 6.2500000000000000e-02 773 6.2500000000000000e-02 774 -6.2500000000000000e-02 775 -6.2500000000000000e-02 776 -6.2500000000000000e-02 777 0.0000000000000000e+00 778 6.2500000000000000e-02 779 -6.2500000000000000e-02 780 -6.2500000000000000e-02 781 6.2500000000000000e-02 782 6.2500000000000000e-02 783 -6.2500000000000000e-02 784 -6.2500000000000000e-02 785 -6.2500000000000000e-02 786 -6.2500000000000000e-02 787 6.2500000000000000e-02 788 6.2500000000000000e-02 789 6.2500000000000000e-02 790 6.2500000000000000e-02 791 -6.2500000000000000e-02 792 -6.2500000000000000e-02 793 0.0000000000000000e+00 794 -1.2500000000000000e-01 795 1.2500000000000000e-01 796 6.2500000000000000e-02 797 0.0000000000000000e+00 798 -6.2500000000000000e-02 799 0.0000000000000000e+00 800 0.0000000000000000e+00 801 6.2500000000000000e-02 802 -6.2500000000000000e-02 803 6.2500000000000000e-02 804 6.2500000000000000e-02 805 6.2500000000000000e-02 806 6.2500000000000000e-02 807 -6.2500000000000000e-02 808 6.2500000000000000e-02 809 -6.2500000000000000e-02 810 -6.2500000000000000e-02 811 0.0000000000000000e+00 812 -6.2500000000000000e-02 813 -1.2500000000000000e-01 814 -1.2500000000000000e-01 815 0.0000000000000000e+00 816 0.0000000000000000e+00 817 0.0000000000000000e+00 818 -1.2500000000000000e-01 819 0.0000000000000000e+00 820 0.0000000000000000e+00 821 0.0000000000000000e+00 822 6.2500000000000000e-02 823 -6.2500000000000000e-02 824 0.0000000000000000e+00 825 1.2500000000000000e-01 826 -1.2500000000000000e-01 827 -1.2500000000000000e-01 828 -6.2500000000000000e-02 829 0.0000000000000000e+00 830 6.2500000000000000e-02 831 0.0000000000000000e+00 832 6.2500000000000000e-02 833 6.2500000000000000e-02 834 -6.2500000000000000e-02 835 6.2500000000000000e-02 836 -6.2500000000000000e-02 837 -6.2500000000000000e-02 838 -6.2500000000000000e-02 839 6.2500000000000000e-02 840 -1.2500000000000000e-01 841 -6.2500000000000000e-02 842 0.0000000000000000e+00 843 -6.2500000000000000e-02 844 6.2500000000000000e-02 845 6.2500000000000000e-02 846 0.0000000000000000e+00 847 -6.2500000000000000e-02 848 -1.2500000000000000e-01 849 -6.2500000000000000e-02 850 0.0000000000000000e+00 851 6.2500000000000000e-02 852 -6.2500000000000000e-02 853 -6.2500000000000000e-02 854 6.2500000000000000e-02 855 6.2500000000000000e-02 856 -6.2500000000000000e-02 857 6.2500000000000000e-02 858 -6.2500000000000000e-02 859 -6.2500000000000000e-02 860 6.2500000000000000e-02 861 6.2500000000000000e-02 862 -6.2500000000000000e-02 863 0.0000000000000000e+00 864 -6.2500000000000000e-02 865 -6.2500000000000000e-02 866 -1.2500000000000000e-01 867 6.2500000000000000e-02 868 0.0000000000000000e+00 869 -6.2500000000000000e-02 870 0.0000000000000000e+00 871 6.2500000000000000e-02 872 0.0000000000000000e+00 873 -6.2500000000000000e-02 874 -6.2500000000000000e-02 875 6.2500000000000000e-02 876 -6.2500000000000000e-02 877 6.2500000000000000e-02 878 6.2500000000000000e-02 879 -6.2500000000000000e-02 880 -6.2500000000000000e-02 881 -6.2500000000000000e-02 882 6.2500000000000000e-02 883 -1.2500000000000000e-01 884 0.0000000000000000e+00 885 -6.2500000000000000e-02 886 -6.2500000000000000e-02 887 -6.2500000000000000e-02 888 -6.2500000000000000e-02 889 0.0000000000000000e+00 890 -6.2500000000000000e-02 891 -6.2500000000000000e-02 892 6.2500000000000000e-02 893 6.2500000000000000e-02 894 -6.2500000000000000e-02 895 0.0000000000000000e+00 896 0.0000000000000000e+00 897 -6.2500000000000000e-02 898 -6.2500000000000000e-02 899 -6.2500000000000000e-02 900 6.2500000000000000e-02 901 0.0000000000000000e+00 902 1.2500000000000000e-01 903 6.2500000000000000e-02 904 0.0000000000000000e+00 905 -6.2500000000000000e-02 906 0.0000000000000000e+00 907 -6.2500000000000000e-02 908 -6.2500000000000000e-02 909 6.2500000000000000e-02 910 6.2500000000000000e-02 911 -6.2500000000000000e-02 912 6.2500000000000000e-02 913 6.2500000000000000e-02 914 6.2500000000000000e-02 915 -6.2500000000000000e-02 916 1.2500000000000000e-01 917 6.2500000000000000e-02 918 0.0000000000000000e+00 919 6.2500000000000000e-02 920 -6.2500000000000000e-02 921 -6.2500000000000000e-02 922 -6.2500000000000000e-02 923 -6.2500000000000000e-02 924 6.2500000000000000e-02 925 -6.2500000000000000e-02 926 6.2500000000000000e-02 927 -6.2500000000000000e-02 928 -6.2500000000000000e-02 929 -6.2500000000000000e-02 930 6.2500000000000000e-02 931 6.2500000000000000e-02 932 0.0000000000000000e+00 933 6.2500000000000000e-02 934 0.0000000000000000e+00 935 0.0000000000000000e+00 936 6.2500000000000000e-02 937 6.2500000000000000e-02 938 1.2500000000000000e-01 939 1.2500000000000000e-01 940 6.2500000000000000e-02 941 6.2500000000000000e-02 942 -6.2500000000000000e-02 943 6.2500000000000000e-02 944 6.2500000000000000e-02 945 -6.2500000000000000e-02 946 0.0000000000000000e+00 947 -1.2500000000000000e-01 948 6.2500000000000000e-02 949 6.2500000000000000e-02 950 -6.2500000000000000e-02 951 0.0000000000000000e+00 952 6.2500000000000000e-02 953 6.2500000000000000e-02 954 6.2500000000000000e-02 955 -6.2500000000000000e-02 956 6.2500000000000000e-02 957 -6.2500000000000000e-02 958 -6.2500000000000000e-02 959 0.0000000000000000e+00 960 -6.2500000000000000e-02 961 0.0000000000000000e+00 962 6.2500000000000000e-02 963 -6.2500000000000000e-02 964 -1.2500000000000000e-01 965 -6.2500000000000000e-02 966 -6.2500000000000000e-02 967 -6.2500000000000000e-02 968 6.2500000000000000e-02 969 -6.2500000000000000e-02 970 0.0000000000000000e+00 971 -6.2500000000000000e-02 972 6.2500000000000000e-02 973 -6.2500000000000000e-02 974 6.2500000000000000e-02 975 6.2500000000000000e-02 976 -6.2500000000000000e-02 977 -6.2500000000000000e-02 978 1.2500000000000000e-01 979 6.2500000000000000e-02 980 6.2500000000000000e-02 981 0.0000000000000000e+00 982 -1.2500000000000000e-01 983 -6.2500000000000000e-02 984 -6.2500000000000000e-02 985 -6.2500000000000000e-02 986 -6.2500000000000000e-02 987 6.2500000000000000e-02 988 0.0000000000000000e+00 989 6.2500000000000000e-02 990 1.2500000000000000e-01 991 -6.2500000000000000e-02 992 -6.2500000000000000e-02 993 6.2500000000000000e-02 994 6.2500000000000000e-02 995 0.0000000000000000e+00 996 -6.2500000000000000e-02 997 -1.2500000000000000e-01 998 -6.2500000000000000e-02 999 6.2500000000000000e-02 1000 6.2500000000000000e-02 1001 -6.2500000000000000e-02 1002 -6.2500000000000000e-02 1003 -6.2500000000000000e-02 1004 6.2500000000000000e-02 1005 6.2500000000000000e-02 1006 6.2500000000000000e-02 1007 -6.2500000000000000e-02 1008 -6.2500000000000000e-02 1009 -6.2500000000000000e-02 1010 -6.2500000000000000e-02 1011 0.0000000000000000e+00 1012 0.0000000000000000e+00 1013 1.2500000000000000e-01 1014 1.2500000000000000e-01 1015 -1.2500000000000000e-01 1016 -6.2500000000000000e-02 1017 6.2500000000000000e-02 1018 0.0000000000000000e+00 1019 -6.2500000000000000e-02 1020 0.0000000000000000e+00 1021 -6.2500000000000000e-02 1022 6.2500000000000000e-02 1023 0.0000000000000000e+00 1024 6.2500000000000000e-02 1025 0.0000000000000000e+00 1026 -6.2500000000000000e-02 1027 6.2500000000000000e-02 1028 0.0000000000000000e+00 1029 -6.2500000000000000e-02 1030 -6.2500000000000000e-02 1031 6.2500000000000000e-02 1032 -6.2500000000000000e-02 1033 -1.2500000000000000e-01 1034 -6.2500000000000000e-02 1035 6.2500000000000000e-02 1036 -6.2500000000000000e-02 1037 6.2500000000000000e-02 1038 6.2500000000000000e-02 1039 6.2500000000000000e-02 1040 -6.2500000000000000e-02 1041 1.2500000000000000e-01 1042 6.2500000000000000e-02 1043 0.0000000000000000e+00 1044 6.2500000000000000e-02 1045 -6.2500000000000000e-02 1046 -6.2500000000000000e-02 1047 -6.2500000000000000e-02 1048 6.2500000000000000e-02 1049 -6.2500000000000000e-02 1050 -6.2500000000000000e-02 1051 -6.2500000000000000e-02 1052 6.2500000000000000e-02 1053 -6.2500000000000000e-02 1054 -6.2500000000000000e-02 1055 -6.2500000000000000e-02 1056 -6.2500000000000000e-02 1057 -6.2500000000000000e-02 1058 6.2500000000000000e-02 1059 0.0000000000000000e+00 1060 -6.2500000000000000e-02 1061 6.2500000000000000e-02 1062 6.2500000000000000e-02 1063 6.2500000000000000e-02 1064 1.2500000000000000e-01 1065 0.0000000000000000e+00 1066 -6.2500000000000000e-02 1067 6.2500000000000000e-02 1068 0.0000000000000000e+00 1069 -6.2500000000000000e-02 1070 6.2500000000000000e-02 1071 6.2500000000000000e-02 1072 6.2500000000000000e-02 1073 1.2500000000000000e-01 1074 -6.2500000000000000e-02 1075 1.2500000000000000e-01 hypre-2.33.0/src/test/TEST_ams/mfem.Gy.00001000066400000000000000000001054431477326011500200140ustar00rootroot000000000000001076 2332 1076 -1.2500000000000000e-01 1077 -1.2500000000000000e-01 1078 -6.2500000000000000e-02 1079 0.0000000000000000e+00 1080 0.0000000000000000e+00 1081 -1.2500000000000000e-01 1082 0.0000000000000000e+00 1083 -2.5000000000000000e-01 1084 -1.2500000000000000e-01 1085 -1.2500000000000000e-01 1086 0.0000000000000000e+00 1087 -1.2500000000000000e-01 1088 0.0000000000000000e+00 1089 1.2500000000000000e-01 1090 1.2500000000000000e-01 1091 6.2500000000000000e-02 1092 1.2500000000000000e-01 1093 0.0000000000000000e+00 1094 6.2500000000000000e-02 1095 0.0000000000000000e+00 1096 0.0000000000000000e+00 1097 0.0000000000000000e+00 1098 1.2500000000000000e-01 1099 0.0000000000000000e+00 1100 0.0000000000000000e+00 1101 0.0000000000000000e+00 1102 6.2500000000000000e-02 1103 1.2500000000000000e-01 1104 0.0000000000000000e+00 1105 1.2500000000000000e-01 1106 1.2500000000000000e-01 1107 0.0000000000000000e+00 1108 1.2500000000000000e-01 1109 0.0000000000000000e+00 1110 -1.2500000000000000e-01 1111 -1.2500000000000000e-01 1112 -1.2500000000000000e-01 1113 -1.2500000000000000e-01 1114 0.0000000000000000e+00 1115 -6.2500000000000000e-02 1116 -6.2500000000000000e-02 1117 0.0000000000000000e+00 1118 6.2500000000000000e-02 1119 -1.2500000000000000e-01 1120 -1.2500000000000000e-01 1121 -6.2500000000000000e-02 1122 1.2500000000000000e-01 1123 1.2500000000000000e-01 1124 6.2500000000000000e-02 1125 6.2500000000000000e-02 1126 1.2500000000000000e-01 1127 0.0000000000000000e+00 1128 0.0000000000000000e+00 1129 0.0000000000000000e+00 1130 1.2500000000000000e-01 1131 6.2500000000000000e-02 1132 1.2500000000000000e-01 1133 0.0000000000000000e+00 1134 0.0000000000000000e+00 1135 0.0000000000000000e+00 1136 -6.2500000000000000e-02 1137 -1.2500000000000000e-01 1138 -1.2500000000000000e-01 1139 1.2500000000000000e-01 1140 1.2500000000000000e-01 1141 0.0000000000000000e+00 1142 0.0000000000000000e+00 1143 0.0000000000000000e+00 1144 1.2500000000000000e-01 1145 1.2500000000000000e-01 1146 -1.2500000000000000e-01 1147 -1.2500000000000000e-01 1148 -1.2500000000000000e-01 1149 -1.2500000000000000e-01 1150 0.0000000000000000e+00 1151 -1.2500000000000000e-01 1152 -1.2500000000000000e-01 1153 -1.2500000000000000e-01 1154 0.0000000000000000e+00 1155 0.0000000000000000e+00 1156 0.0000000000000000e+00 1157 1.2500000000000000e-01 1158 1.2500000000000000e-01 1159 -1.2500000000000000e-01 1160 -1.2500000000000000e-01 1161 0.0000000000000000e+00 1162 1.2500000000000000e-01 1163 1.2500000000000000e-01 1164 0.0000000000000000e+00 1165 0.0000000000000000e+00 1166 -1.2500000000000000e-01 1167 1.2500000000000000e-01 1168 1.2500000000000000e-01 1169 1.2500000000000000e-01 1170 1.2500000000000000e-01 1171 0.0000000000000000e+00 1172 -1.2500000000000000e-01 1173 -1.2500000000000000e-01 1174 -1.2500000000000000e-01 1175 0.0000000000000000e+00 1176 -1.2500000000000000e-01 1177 1.2500000000000000e-01 1178 1.2500000000000000e-01 1179 1.2500000000000000e-01 1180 1.2500000000000000e-01 1181 -1.2500000000000000e-01 1182 0.0000000000000000e+00 1183 0.0000000000000000e+00 1184 -1.2500000000000000e-01 1185 1.2500000000000000e-01 1186 0.0000000000000000e+00 1187 0.0000000000000000e+00 1188 1.2500000000000000e-01 1189 1.2500000000000000e-01 1190 1.2500000000000000e-01 1191 0.0000000000000000e+00 1192 1.2500000000000000e-01 1193 1.2500000000000000e-01 1194 -1.2500000000000000e-01 1195 -1.2500000000000000e-01 1196 -1.2500000000000000e-01 1197 -1.2500000000000000e-01 1198 1.2500000000000000e-01 1199 0.0000000000000000e+00 1200 0.0000000000000000e+00 1201 0.0000000000000000e+00 1202 0.0000000000000000e+00 1203 1.2500000000000000e-01 1204 -1.2500000000000000e-01 1205 -1.2500000000000000e-01 1206 1.2500000000000000e-01 1207 1.2500000000000000e-01 1208 0.0000000000000000e+00 1209 2.5000000000000000e-01 1210 1.2500000000000000e-01 1211 1.2500000000000000e-01 1212 0.0000000000000000e+00 1213 0.0000000000000000e+00 1214 1.2500000000000000e-01 1215 1.2500000000000000e-01 1216 1.2500000000000000e-01 1217 -1.2500000000000000e-01 1218 -1.2500000000000000e-01 1219 1.2500000000000000e-01 1220 0.0000000000000000e+00 1221 1.2500000000000000e-01 1222 1.2500000000000000e-01 1223 0.0000000000000000e+00 1224 0.0000000000000000e+00 1225 2.5000000000000000e-01 1226 -1.2500000000000000e-01 1227 -1.2500000000000000e-01 1228 -1.2500000000000000e-01 1229 -1.2500000000000000e-01 1230 0.0000000000000000e+00 1231 1.2500000000000000e-01 1232 1.2500000000000000e-01 1233 1.2500000000000000e-01 1234 1.2500000000000000e-01 1235 0.0000000000000000e+00 1236 -1.2500000000000000e-01 1237 0.0000000000000000e+00 1238 1.2500000000000000e-01 1239 1.2500000000000000e-01 1240 0.0000000000000000e+00 1241 1.2500000000000000e-01 1242 1.2500000000000000e-01 1243 1.2500000000000000e-01 1244 0.0000000000000000e+00 1245 1.2500000000000000e-01 1246 1.2500000000000000e-01 1247 1.2500000000000000e-01 1248 0.0000000000000000e+00 1249 1.2500000000000000e-01 1250 1.2500000000000000e-01 1251 0.0000000000000000e+00 1252 0.0000000000000000e+00 1253 0.0000000000000000e+00 1254 -1.2500000000000000e-01 1255 -1.2500000000000000e-01 1256 0.0000000000000000e+00 1257 0.0000000000000000e+00 1258 0.0000000000000000e+00 1259 -1.2500000000000000e-01 1260 0.0000000000000000e+00 1261 0.0000000000000000e+00 1262 -1.2500000000000000e-01 1263 -1.2500000000000000e-01 1264 -1.2500000000000000e-01 1265 0.0000000000000000e+00 1266 0.0000000000000000e+00 1267 1.2500000000000000e-01 1268 1.2500000000000000e-01 1269 6.2500000000000000e-02 1270 1.2500000000000000e-01 1271 0.0000000000000000e+00 1272 6.2500000000000000e-02 1273 0.0000000000000000e+00 1274 -1.2500000000000000e-01 1275 1.2500000000000000e-01 1276 -1.2500000000000000e-01 1277 0.0000000000000000e+00 1278 0.0000000000000000e+00 1279 1.2500000000000000e-01 1280 1.2500000000000000e-01 1281 -1.2500000000000000e-01 1282 -1.2500000000000000e-01 1283 -1.2500000000000000e-01 1284 0.0000000000000000e+00 1285 -1.2500000000000000e-01 1286 0.0000000000000000e+00 1287 0.0000000000000000e+00 1288 1.2500000000000000e-01 1289 0.0000000000000000e+00 1290 -6.2500000000000000e-02 1291 -1.2500000000000000e-01 1292 -1.2500000000000000e-01 1293 0.0000000000000000e+00 1294 -1.2500000000000000e-01 1295 -1.2500000000000000e-01 1296 0.0000000000000000e+00 1297 0.0000000000000000e+00 1298 -1.2500000000000000e-01 1299 -1.2500000000000000e-01 1300 0.0000000000000000e+00 1301 -1.2500000000000000e-01 1302 -1.2500000000000000e-01 1303 -1.2500000000000000e-01 1304 0.0000000000000000e+00 1305 0.0000000000000000e+00 1306 0.0000000000000000e+00 1307 0.0000000000000000e+00 1308 -1.2500000000000000e-01 1309 0.0000000000000000e+00 1310 0.0000000000000000e+00 1311 -6.2500000000000000e-02 1312 -1.2500000000000000e-01 1313 -1.2500000000000000e-01 1314 -1.2500000000000000e-01 1315 0.0000000000000000e+00 1316 0.0000000000000000e+00 1317 0.0000000000000000e+00 1318 -6.2500000000000000e-02 1319 0.0000000000000000e+00 1320 0.0000000000000000e+00 1321 -6.2500000000000000e-02 1322 0.0000000000000000e+00 1323 0.0000000000000000e+00 1324 -6.2500000000000000e-02 1325 0.0000000000000000e+00 1326 0.0000000000000000e+00 1327 -6.2500000000000000e-02 1328 -1.2500000000000000e-01 1329 -1.2500000000000000e-01 1330 -1.2500000000000000e-01 1331 -1.2500000000000000e-01 1332 -1.2500000000000000e-01 1333 -1.2500000000000000e-01 1334 0.0000000000000000e+00 1335 -6.2500000000000000e-02 1336 -1.2500000000000000e-01 1337 -6.2500000000000000e-02 1338 0.0000000000000000e+00 1339 0.0000000000000000e+00 1340 -1.2500000000000000e-01 1341 0.0000000000000000e+00 1342 0.0000000000000000e+00 1343 -1.2500000000000000e-01 1344 1.2500000000000000e-01 1345 1.2500000000000000e-01 1346 6.2500000000000000e-02 1347 6.2500000000000000e-02 1348 1.2500000000000000e-01 1349 6.2500000000000000e-02 1350 0.0000000000000000e+00 1351 0.0000000000000000e+00 1352 -6.2500000000000000e-02 1353 -1.2500000000000000e-01 1354 0.0000000000000000e+00 1355 -6.2500000000000000e-02 1356 -6.2500000000000000e-02 1357 0.0000000000000000e+00 1358 -1.2500000000000000e-01 1359 -1.2500000000000000e-01 1360 0.0000000000000000e+00 1361 0.0000000000000000e+00 1362 1.2500000000000000e-01 1363 6.2500000000000000e-02 1364 1.2500000000000000e-01 1365 0.0000000000000000e+00 1366 0.0000000000000000e+00 1367 -6.2500000000000000e-02 1368 -1.2500000000000000e-01 1369 -1.2500000000000000e-01 1370 -1.2500000000000000e-01 1371 0.0000000000000000e+00 1372 -6.2500000000000000e-02 1373 -1.2500000000000000e-01 1374 -1.2500000000000000e-01 1375 -1.2500000000000000e-01 1376 0.0000000000000000e+00 1377 0.0000000000000000e+00 1378 -1.2500000000000000e-01 1379 -1.2500000000000000e-01 1380 0.0000000000000000e+00 1381 0.0000000000000000e+00 1382 1.2500000000000000e-01 1383 1.2500000000000000e-01 1384 6.2500000000000000e-02 1385 1.2500000000000000e-01 1386 0.0000000000000000e+00 1387 6.2500000000000000e-02 1388 0.0000000000000000e+00 1389 0.0000000000000000e+00 1390 0.0000000000000000e+00 1391 1.2500000000000000e-01 1392 0.0000000000000000e+00 1393 0.0000000000000000e+00 1394 0.0000000000000000e+00 1395 -6.2500000000000000e-02 1396 6.2500000000000000e-02 1397 1.2500000000000000e-01 1398 6.2500000000000000e-02 1399 -1.2500000000000000e-01 1400 0.0000000000000000e+00 1401 -6.2500000000000000e-02 1402 -6.2500000000000000e-02 1403 0.0000000000000000e+00 1404 1.2500000000000000e-01 1405 1.2500000000000000e-01 1406 6.2500000000000000e-02 1407 6.2500000000000000e-02 1408 1.2500000000000000e-01 1409 0.0000000000000000e+00 1410 0.0000000000000000e+00 1411 -6.2500000000000000e-02 1412 0.0000000000000000e+00 1413 1.2500000000000000e-01 1414 -1.2500000000000000e-01 1415 -1.2500000000000000e-01 1416 -1.2500000000000000e-01 1417 0.0000000000000000e+00 1418 -1.2500000000000000e-01 1419 1.2500000000000000e-01 1420 0.0000000000000000e+00 1421 0.0000000000000000e+00 1422 -1.2500000000000000e-01 1423 0.0000000000000000e+00 1424 0.0000000000000000e+00 1425 0.0000000000000000e+00 1426 6.2500000000000000e-02 1427 1.2500000000000000e-01 1428 1.2500000000000000e-01 1429 -1.2500000000000000e-01 1430 -1.2500000000000000e-01 1431 1.2500000000000000e-01 1432 -1.2500000000000000e-01 1433 1.2500000000000000e-01 1434 -1.2500000000000000e-01 1435 -6.2500000000000000e-02 1436 0.0000000000000000e+00 1437 0.0000000000000000e+00 1438 -1.2500000000000000e-01 1439 -1.2500000000000000e-01 1440 -1.2500000000000000e-01 1441 0.0000000000000000e+00 1442 -2.5000000000000000e-01 1443 -1.2500000000000000e-01 1444 0.0000000000000000e+00 1445 -1.2500000000000000e-01 1446 -1.2500000000000000e-01 1447 0.0000000000000000e+00 1448 1.2500000000000000e-01 1449 1.2500000000000000e-01 1450 1.2500000000000000e-01 1451 1.2500000000000000e-01 1452 6.2500000000000000e-02 1453 6.2500000000000000e-02 1454 0.0000000000000000e+00 1455 1.2500000000000000e-01 1456 1.2500000000000000e-01 1457 0.0000000000000000e+00 1458 0.0000000000000000e+00 1459 0.0000000000000000e+00 1460 0.0000000000000000e+00 1461 1.2500000000000000e-01 1462 0.0000000000000000e+00 1463 0.0000000000000000e+00 1464 0.0000000000000000e+00 1465 0.0000000000000000e+00 1466 6.2500000000000000e-02 1467 1.2500000000000000e-01 1468 1.2500000000000000e-01 1469 1.2500000000000000e-01 1470 -6.2500000000000000e-02 1471 0.0000000000000000e+00 1472 -1.2500000000000000e-01 1473 -1.2500000000000000e-01 1474 0.0000000000000000e+00 1475 -6.2500000000000000e-02 1476 -6.2500000000000000e-02 1477 0.0000000000000000e+00 1478 6.2500000000000000e-02 1479 1.2500000000000000e-01 1480 1.2500000000000000e-01 1481 6.2500000000000000e-02 1482 6.2500000000000000e-02 1483 1.2500000000000000e-01 1484 0.0000000000000000e+00 1485 0.0000000000000000e+00 1486 -6.2500000000000000e-02 1487 1.2500000000000000e-01 1488 6.2500000000000000e-02 1489 1.2500000000000000e-01 1490 0.0000000000000000e+00 1491 0.0000000000000000e+00 1492 -6.2500000000000000e-02 1493 -1.2500000000000000e-01 1494 -1.2500000000000000e-01 1495 -1.2500000000000000e-01 1496 -1.2500000000000000e-01 1497 0.0000000000000000e+00 1498 0.0000000000000000e+00 1499 -1.2500000000000000e-01 1500 -1.2500000000000000e-01 1501 0.0000000000000000e+00 1502 -1.2500000000000000e-01 1503 0.0000000000000000e+00 1504 -6.2500000000000000e-02 1505 -1.2500000000000000e-01 1506 -6.2500000000000000e-02 1507 0.0000000000000000e+00 1508 0.0000000000000000e+00 1509 -1.2500000000000000e-01 1510 -1.2500000000000000e-01 1511 0.0000000000000000e+00 1512 0.0000000000000000e+00 1513 0.0000000000000000e+00 1514 0.0000000000000000e+00 1515 0.0000000000000000e+00 1516 1.2500000000000000e-01 1517 0.0000000000000000e+00 1518 1.2500000000000000e-01 1519 1.2500000000000000e-01 1520 1.2500000000000000e-01 1521 1.2500000000000000e-01 1522 1.2500000000000000e-01 1523 1.2500000000000000e-01 1524 1.2500000000000000e-01 1525 0.0000000000000000e+00 1526 0.0000000000000000e+00 1527 1.2500000000000000e-01 1528 1.2500000000000000e-01 1529 1.2500000000000000e-01 1530 0.0000000000000000e+00 1531 1.2500000000000000e-01 1532 0.0000000000000000e+00 1533 -1.2500000000000000e-01 1534 0.0000000000000000e+00 1535 -1.2500000000000000e-01 1536 -1.2500000000000000e-01 1537 -1.2500000000000000e-01 1538 1.2500000000000000e-01 1539 1.2500000000000000e-01 1540 1.2500000000000000e-01 1541 1.2500000000000000e-01 1542 1.2500000000000000e-01 1543 0.0000000000000000e+00 1544 0.0000000000000000e+00 1545 1.2500000000000000e-01 1546 -1.2500000000000000e-01 1547 -1.2500000000000000e-01 1548 0.0000000000000000e+00 1549 -1.2500000000000000e-01 1550 -1.2500000000000000e-01 1551 -1.2500000000000000e-01 1552 0.0000000000000000e+00 1553 0.0000000000000000e+00 1554 0.0000000000000000e+00 1555 -1.2500000000000000e-01 1556 -1.2500000000000000e-01 1557 0.0000000000000000e+00 1558 0.0000000000000000e+00 1559 -1.2500000000000000e-01 1560 -1.2500000000000000e-01 1561 0.0000000000000000e+00 1562 0.0000000000000000e+00 1563 -1.2500000000000000e-01 1564 -1.2500000000000000e-01 1565 0.0000000000000000e+00 1566 -1.2500000000000000e-01 1567 -1.2500000000000000e-01 1568 -1.2500000000000000e-01 1569 0.0000000000000000e+00 1570 -2.5000000000000000e-01 1571 -1.2500000000000000e-01 1572 0.0000000000000000e+00 1573 -1.2500000000000000e-01 1574 0.0000000000000000e+00 1575 -1.2500000000000000e-01 1576 0.0000000000000000e+00 1577 -1.2500000000000000e-01 1578 -1.2500000000000000e-01 1579 0.0000000000000000e+00 1580 0.0000000000000000e+00 1581 0.0000000000000000e+00 1582 6.2500000000000000e-02 1583 1.2500000000000000e-01 1584 1.2500000000000000e-01 1585 6.2500000000000000e-02 1586 1.2500000000000000e-01 1587 6.2500000000000000e-02 1588 0.0000000000000000e+00 1589 0.0000000000000000e+00 1590 0.0000000000000000e+00 1591 0.0000000000000000e+00 1592 6.2500000000000000e-02 1593 0.0000000000000000e+00 1594 -6.2500000000000000e-02 1595 0.0000000000000000e+00 1596 1.2500000000000000e-01 1597 1.2500000000000000e-01 1598 1.2500000000000000e-01 1599 1.2500000000000000e-01 1600 1.2500000000000000e-01 1601 1.2500000000000000e-01 1602 0.0000000000000000e+00 1603 0.0000000000000000e+00 1604 -1.2500000000000000e-01 1605 0.0000000000000000e+00 1606 -1.2500000000000000e-01 1607 1.2500000000000000e-01 1608 -1.2500000000000000e-01 1609 1.2500000000000000e-01 1610 1.2500000000000000e-01 1611 1.2500000000000000e-01 1612 0.0000000000000000e+00 1613 -1.2500000000000000e-01 1614 -1.2500000000000000e-01 1615 1.2500000000000000e-01 1616 0.0000000000000000e+00 1617 0.0000000000000000e+00 1618 0.0000000000000000e+00 1619 0.0000000000000000e+00 1620 1.2500000000000000e-01 1621 1.2500000000000000e-01 1622 1.2500000000000000e-01 1623 0.0000000000000000e+00 1624 0.0000000000000000e+00 1625 -1.2500000000000000e-01 1626 0.0000000000000000e+00 1627 -1.2500000000000000e-01 1628 -1.2500000000000000e-01 1629 1.2500000000000000e-01 1630 1.2500000000000000e-01 1631 1.2500000000000000e-01 1632 -1.2500000000000000e-01 1633 -1.2500000000000000e-01 1634 -1.2500000000000000e-01 1635 -1.2500000000000000e-01 1636 -1.2500000000000000e-01 1637 0.0000000000000000e+00 1638 -1.2500000000000000e-01 1639 0.0000000000000000e+00 1640 -1.2500000000000000e-01 1641 0.0000000000000000e+00 1642 0.0000000000000000e+00 1643 0.0000000000000000e+00 1644 1.2500000000000000e-01 1645 1.2500000000000000e-01 1646 0.0000000000000000e+00 1647 1.2500000000000000e-01 1648 0.0000000000000000e+00 1649 -1.2500000000000000e-01 1650 0.0000000000000000e+00 1651 -6.2500000000000000e-02 1652 -1.2500000000000000e-01 1653 -6.2500000000000000e-02 1654 -1.2500000000000000e-01 1655 -1.2500000000000000e-01 1656 0.0000000000000000e+00 1657 0.0000000000000000e+00 1658 0.0000000000000000e+00 1659 0.0000000000000000e+00 1660 0.0000000000000000e+00 1661 -1.2500000000000000e-01 1662 -1.2500000000000000e-01 1663 0.0000000000000000e+00 1664 0.0000000000000000e+00 1665 0.0000000000000000e+00 1666 0.0000000000000000e+00 1667 6.2500000000000000e-02 1668 1.2500000000000000e-01 1669 0.0000000000000000e+00 1670 1.2500000000000000e-01 1671 1.2500000000000000e-01 1672 1.2500000000000000e-01 1673 1.2500000000000000e-01 1674 6.2500000000000000e-02 1675 6.2500000000000000e-02 1676 1.2500000000000000e-01 1677 6.2500000000000000e-02 1678 -1.2500000000000000e-01 1679 0.0000000000000000e+00 1680 -6.2500000000000000e-02 1681 -1.2500000000000000e-01 1682 -6.2500000000000000e-02 1683 0.0000000000000000e+00 1684 0.0000000000000000e+00 1685 0.0000000000000000e+00 1686 0.0000000000000000e+00 1687 -1.2500000000000000e-01 1688 -1.2500000000000000e-01 1689 1.2500000000000000e-01 1690 1.2500000000000000e-01 1691 1.2500000000000000e-01 1692 1.2500000000000000e-01 1693 0.0000000000000000e+00 1694 6.2500000000000000e-02 1695 0.0000000000000000e+00 1696 -6.2500000000000000e-02 1697 -1.2500000000000000e-01 1698 -6.2500000000000000e-02 1699 1.2500000000000000e-01 1700 6.2500000000000000e-02 1701 6.2500000000000000e-02 1702 6.2500000000000000e-02 1703 0.0000000000000000e+00 1704 6.2500000000000000e-02 1705 -6.2500000000000000e-02 1706 -6.2500000000000000e-02 1707 6.2500000000000000e-02 1708 -6.2500000000000000e-02 1709 -6.2500000000000000e-02 1710 6.2500000000000000e-02 1711 6.2500000000000000e-02 1712 6.2500000000000000e-02 1713 -1.2500000000000000e-01 1714 0.0000000000000000e+00 1715 0.0000000000000000e+00 1716 6.2500000000000000e-02 1717 6.2500000000000000e-02 1718 -6.2500000000000000e-02 1719 6.2500000000000000e-02 1720 0.0000000000000000e+00 1721 -1.2500000000000000e-01 1722 -1.2500000000000000e-01 1723 -1.2500000000000000e-01 1724 0.0000000000000000e+00 1725 -1.2500000000000000e-01 1726 0.0000000000000000e+00 1727 0.0000000000000000e+00 1728 1.2500000000000000e-01 1729 1.2500000000000000e-01 1730 1.2500000000000000e-01 1731 0.0000000000000000e+00 1732 0.0000000000000000e+00 1733 0.0000000000000000e+00 1734 -1.2500000000000000e-01 1735 1.2500000000000000e-01 1736 1.2500000000000000e-01 1737 -1.2500000000000000e-01 1738 0.0000000000000000e+00 1739 0.0000000000000000e+00 1740 1.2500000000000000e-01 1741 0.0000000000000000e+00 1742 0.0000000000000000e+00 1743 0.0000000000000000e+00 1744 0.0000000000000000e+00 1745 1.2500000000000000e-01 1746 1.2500000000000000e-01 1747 -1.2500000000000000e-01 1748 0.0000000000000000e+00 1749 1.2500000000000000e-01 1750 0.0000000000000000e+00 1751 -1.2500000000000000e-01 1752 1.2500000000000000e-01 1753 0.0000000000000000e+00 1754 -1.2500000000000000e-01 1755 0.0000000000000000e+00 1756 -1.2500000000000000e-01 1757 0.0000000000000000e+00 1758 -1.2500000000000000e-01 1759 1.2500000000000000e-01 1760 0.0000000000000000e+00 1761 0.0000000000000000e+00 1762 -1.2500000000000000e-01 1763 0.0000000000000000e+00 1764 -1.2500000000000000e-01 1765 1.2500000000000000e-01 1766 0.0000000000000000e+00 1767 1.2500000000000000e-01 1768 0.0000000000000000e+00 1769 -1.2500000000000000e-01 1770 1.2500000000000000e-01 1771 0.0000000000000000e+00 1772 1.2500000000000000e-01 1773 0.0000000000000000e+00 1774 0.0000000000000000e+00 1775 -1.2500000000000000e-01 1776 0.0000000000000000e+00 1777 0.0000000000000000e+00 1778 0.0000000000000000e+00 1779 1.2500000000000000e-01 1780 1.2500000000000000e-01 1781 1.2500000000000000e-01 1782 0.0000000000000000e+00 1783 0.0000000000000000e+00 1784 1.2500000000000000e-01 1785 1.2500000000000000e-01 1786 0.0000000000000000e+00 1787 0.0000000000000000e+00 1788 0.0000000000000000e+00 1789 0.0000000000000000e+00 1790 0.0000000000000000e+00 1791 1.2500000000000000e-01 1792 1.2500000000000000e-01 1793 0.0000000000000000e+00 1794 1.2500000000000000e-01 1795 1.2500000000000000e-01 1796 0.0000000000000000e+00 1797 0.0000000000000000e+00 1798 0.0000000000000000e+00 1799 -1.2500000000000000e-01 1800 0.0000000000000000e+00 1801 0.0000000000000000e+00 1802 1.2500000000000000e-01 1803 0.0000000000000000e+00 1804 -1.2500000000000000e-01 1805 0.0000000000000000e+00 1806 0.0000000000000000e+00 1807 1.2500000000000000e-01 1808 1.2500000000000000e-01 1809 1.2500000000000000e-01 1810 1.2500000000000000e-01 1811 -1.2500000000000000e-01 1812 1.2500000000000000e-01 1813 1.2500000000000000e-01 1814 1.2500000000000000e-01 1815 0.0000000000000000e+00 1816 -1.2500000000000000e-01 1817 1.2500000000000000e-01 1818 0.0000000000000000e+00 1819 0.0000000000000000e+00 1820 0.0000000000000000e+00 1821 1.2500000000000000e-01 1822 -1.2500000000000000e-01 1823 -1.2500000000000000e-01 1824 0.0000000000000000e+00 1825 0.0000000000000000e+00 1826 0.0000000000000000e+00 1827 0.0000000000000000e+00 1828 1.2500000000000000e-01 1829 1.2500000000000000e-01 1830 0.0000000000000000e+00 1831 1.2500000000000000e-01 1832 0.0000000000000000e+00 1833 -1.2500000000000000e-01 1834 -1.2500000000000000e-01 1835 0.0000000000000000e+00 1836 1.2500000000000000e-01 1837 1.2500000000000000e-01 1838 0.0000000000000000e+00 1839 0.0000000000000000e+00 1840 0.0000000000000000e+00 1841 0.0000000000000000e+00 1842 0.0000000000000000e+00 1843 0.0000000000000000e+00 1844 1.2500000000000000e-01 1845 -1.2500000000000000e-01 1846 0.0000000000000000e+00 1847 0.0000000000000000e+00 1848 0.0000000000000000e+00 1849 -6.2500000000000000e-02 1850 0.0000000000000000e+00 1851 -6.2500000000000000e-02 1852 0.0000000000000000e+00 1853 -6.2500000000000000e-02 1854 0.0000000000000000e+00 1855 -6.2500000000000000e-02 1856 -1.2500000000000000e-01 1857 -6.2500000000000000e-02 1858 0.0000000000000000e+00 1859 -6.2500000000000000e-02 1860 -6.2500000000000000e-02 1861 -6.2500000000000000e-02 1862 6.2500000000000000e-02 1863 -6.2500000000000000e-02 1864 -6.2500000000000000e-02 1865 -6.2500000000000000e-02 1866 -6.2500000000000000e-02 1867 -6.2500000000000000e-02 1868 6.2500000000000000e-02 1869 -6.2500000000000000e-02 1870 -6.2500000000000000e-02 1871 -1.2500000000000000e-01 1872 -6.2500000000000000e-02 1873 -6.2500000000000000e-02 1874 -6.2500000000000000e-02 1875 6.2500000000000000e-02 1876 1.2500000000000000e-01 1877 6.2500000000000000e-02 1878 -1.2500000000000000e-01 1879 -6.2500000000000000e-02 1880 0.0000000000000000e+00 1881 6.2500000000000000e-02 1882 0.0000000000000000e+00 1883 -6.2500000000000000e-02 1884 0.0000000000000000e+00 1885 0.0000000000000000e+00 1886 -6.2500000000000000e-02 1887 6.2500000000000000e-02 1888 -6.2500000000000000e-02 1889 -6.2500000000000000e-02 1890 6.2500000000000000e-02 1891 -6.2500000000000000e-02 1892 -6.2500000000000000e-02 1893 -6.2500000000000000e-02 1894 6.2500000000000000e-02 1895 6.2500000000000000e-02 1896 -6.2500000000000000e-02 1897 0.0000000000000000e+00 1898 -6.2500000000000000e-02 1899 -6.2500000000000000e-02 1900 6.2500000000000000e-02 1901 6.2500000000000000e-02 1902 0.0000000000000000e+00 1903 0.0000000000000000e+00 1904 0.0000000000000000e+00 1905 0.0000000000000000e+00 1906 -6.2500000000000000e-02 1907 1.2500000000000000e-01 1908 -1.2500000000000000e-01 1909 -6.2500000000000000e-02 1910 6.2500000000000000e-02 1911 1.2500000000000000e-01 1912 0.0000000000000000e+00 1913 6.2500000000000000e-02 1914 6.2500000000000000e-02 1915 1.2500000000000000e-01 1916 0.0000000000000000e+00 1917 6.2500000000000000e-02 1918 -6.2500000000000000e-02 1919 -6.2500000000000000e-02 1920 6.2500000000000000e-02 1921 -6.2500000000000000e-02 1922 -6.2500000000000000e-02 1923 6.2500000000000000e-02 1924 0.0000000000000000e+00 1925 0.0000000000000000e+00 1926 0.0000000000000000e+00 1927 6.2500000000000000e-02 1928 0.0000000000000000e+00 1929 1.2500000000000000e-01 1930 0.0000000000000000e+00 1931 0.0000000000000000e+00 1932 -6.2500000000000000e-02 1933 -1.2500000000000000e-01 1934 -6.2500000000000000e-02 1935 6.2500000000000000e-02 1936 1.2500000000000000e-01 1937 0.0000000000000000e+00 1938 6.2500000000000000e-02 1939 6.2500000000000000e-02 1940 0.0000000000000000e+00 1941 6.2500000000000000e-02 1942 -6.2500000000000000e-02 1943 -6.2500000000000000e-02 1944 6.2500000000000000e-02 1945 -6.2500000000000000e-02 1946 -6.2500000000000000e-02 1947 6.2500000000000000e-02 1948 6.2500000000000000e-02 1949 6.2500000000000000e-02 1950 0.0000000000000000e+00 1951 0.0000000000000000e+00 1952 6.2500000000000000e-02 1953 6.2500000000000000e-02 1954 -6.2500000000000000e-02 1955 6.2500000000000000e-02 1956 0.0000000000000000e+00 1957 0.0000000000000000e+00 1958 -6.2500000000000000e-02 1959 0.0000000000000000e+00 1960 -6.2500000000000000e-02 1961 0.0000000000000000e+00 1962 -6.2500000000000000e-02 1963 -1.2500000000000000e-01 1964 -6.2500000000000000e-02 1965 0.0000000000000000e+00 1966 -6.2500000000000000e-02 1967 -6.2500000000000000e-02 1968 -6.2500000000000000e-02 1969 6.2500000000000000e-02 1970 -6.2500000000000000e-02 1971 -6.2500000000000000e-02 1972 -6.2500000000000000e-02 1973 -6.2500000000000000e-02 1974 -6.2500000000000000e-02 1975 6.2500000000000000e-02 1976 -1.2500000000000000e-01 1977 0.0000000000000000e+00 1978 1.2500000000000000e-01 1979 0.0000000000000000e+00 1980 1.2500000000000000e-01 1981 1.2500000000000000e-01 1982 0.0000000000000000e+00 1983 1.2500000000000000e-01 1984 0.0000000000000000e+00 1985 1.2500000000000000e-01 1986 0.0000000000000000e+00 1987 1.2500000000000000e-01 1988 0.0000000000000000e+00 1989 -1.2500000000000000e-01 1990 0.0000000000000000e+00 1991 0.0000000000000000e+00 1992 0.0000000000000000e+00 1993 0.0000000000000000e+00 1994 0.0000000000000000e+00 1995 1.2500000000000000e-01 1996 1.2500000000000000e-01 1997 0.0000000000000000e+00 1998 0.0000000000000000e+00 1999 1.2500000000000000e-01 2000 1.2500000000000000e-01 2001 1.2500000000000000e-01 2002 1.2500000000000000e-01 2003 0.0000000000000000e+00 2004 0.0000000000000000e+00 2005 -1.2500000000000000e-01 2006 0.0000000000000000e+00 2007 0.0000000000000000e+00 2008 0.0000000000000000e+00 2009 -1.2500000000000000e-01 2010 0.0000000000000000e+00 2011 0.0000000000000000e+00 2012 1.2500000000000000e-01 2013 0.0000000000000000e+00 2014 0.0000000000000000e+00 2015 0.0000000000000000e+00 2016 0.0000000000000000e+00 2017 0.0000000000000000e+00 2018 0.0000000000000000e+00 2019 0.0000000000000000e+00 2020 0.0000000000000000e+00 2021 0.0000000000000000e+00 2022 1.2500000000000000e-01 2023 1.2500000000000000e-01 2024 1.2500000000000000e-01 2025 1.2500000000000000e-01 2026 1.2500000000000000e-01 2027 0.0000000000000000e+00 2028 0.0000000000000000e+00 2029 -1.2500000000000000e-01 2030 0.0000000000000000e+00 2031 0.0000000000000000e+00 2032 0.0000000000000000e+00 2033 -1.2500000000000000e-01 2034 0.0000000000000000e+00 2035 0.0000000000000000e+00 2036 -1.2500000000000000e-01 2037 0.0000000000000000e+00 2038 0.0000000000000000e+00 2039 -1.2500000000000000e-01 2040 0.0000000000000000e+00 2041 0.0000000000000000e+00 2042 0.0000000000000000e+00 2043 0.0000000000000000e+00 2044 0.0000000000000000e+00 2045 6.2500000000000000e-02 2046 0.0000000000000000e+00 2047 0.0000000000000000e+00 2048 6.2500000000000000e-02 2049 6.2500000000000000e-02 2050 1.2500000000000000e-01 2051 6.2500000000000000e-02 2052 6.2500000000000000e-02 2053 0.0000000000000000e+00 2054 6.2500000000000000e-02 2055 6.2500000000000000e-02 2056 6.2500000000000000e-02 2057 -6.2500000000000000e-02 2058 1.2500000000000000e-01 2059 0.0000000000000000e+00 2060 0.0000000000000000e+00 2061 1.2500000000000000e-01 2062 -1.2500000000000000e-01 2063 -1.2500000000000000e-01 2064 0.0000000000000000e+00 2065 1.2500000000000000e-01 2066 1.2500000000000000e-01 2067 1.2500000000000000e-01 2068 0.0000000000000000e+00 2069 0.0000000000000000e+00 2070 0.0000000000000000e+00 2071 0.0000000000000000e+00 2072 -1.2500000000000000e-01 2073 0.0000000000000000e+00 2074 0.0000000000000000e+00 2075 -1.2500000000000000e-01 2076 1.2500000000000000e-01 2077 0.0000000000000000e+00 2078 1.2500000000000000e-01 2079 0.0000000000000000e+00 2080 -1.2500000000000000e-01 2081 0.0000000000000000e+00 2082 0.0000000000000000e+00 2083 1.2500000000000000e-01 2084 1.2500000000000000e-01 2085 -1.2500000000000000e-01 2086 1.2500000000000000e-01 2087 1.2500000000000000e-01 2088 -1.2500000000000000e-01 2089 0.0000000000000000e+00 2090 -1.2500000000000000e-01 2091 -1.2500000000000000e-01 2092 1.2500000000000000e-01 2093 -1.2500000000000000e-01 2094 0.0000000000000000e+00 2095 -1.2500000000000000e-01 2096 1.2500000000000000e-01 2097 0.0000000000000000e+00 2098 0.0000000000000000e+00 2099 -1.2500000000000000e-01 2100 1.2500000000000000e-01 2101 0.0000000000000000e+00 2102 0.0000000000000000e+00 2103 0.0000000000000000e+00 2104 -1.2500000000000000e-01 2105 0.0000000000000000e+00 2106 0.0000000000000000e+00 2107 0.0000000000000000e+00 2108 1.2500000000000000e-01 2109 -1.2500000000000000e-01 2110 0.0000000000000000e+00 2111 1.2500000000000000e-01 2112 -1.2500000000000000e-01 2113 0.0000000000000000e+00 2114 0.0000000000000000e+00 2115 0.0000000000000000e+00 2116 1.2500000000000000e-01 2117 -1.2500000000000000e-01 2118 0.0000000000000000e+00 2119 0.0000000000000000e+00 2120 0.0000000000000000e+00 2121 0.0000000000000000e+00 2122 1.2500000000000000e-01 2123 -1.2500000000000000e-01 2124 -1.2500000000000000e-01 2125 1.2500000000000000e-01 2126 1.2500000000000000e-01 2127 0.0000000000000000e+00 2128 -1.2500000000000000e-01 2129 0.0000000000000000e+00 2130 0.0000000000000000e+00 2131 1.2500000000000000e-01 2132 0.0000000000000000e+00 2133 0.0000000000000000e+00 2134 -1.2500000000000000e-01 2135 0.0000000000000000e+00 2136 1.2500000000000000e-01 2137 -1.2500000000000000e-01 2138 -1.2500000000000000e-01 2139 0.0000000000000000e+00 2140 0.0000000000000000e+00 2141 0.0000000000000000e+00 2142 1.2500000000000000e-01 2143 -1.2500000000000000e-01 2144 1.2500000000000000e-01 2145 1.2500000000000000e-01 2146 0.0000000000000000e+00 2147 0.0000000000000000e+00 2148 6.2500000000000000e-02 2149 -6.2500000000000000e-02 2150 1.2500000000000000e-01 2151 0.0000000000000000e+00 2152 0.0000000000000000e+00 2153 1.2500000000000000e-01 2154 -1.2500000000000000e-01 2155 1.2500000000000000e-01 2156 -1.2500000000000000e-01 2157 -6.2500000000000000e-02 2158 6.2500000000000000e-02 2159 1.2500000000000000e-01 2160 6.2500000000000000e-02 2161 -1.2500000000000000e-01 2162 1.2500000000000000e-01 2163 -1.2500000000000000e-01 2164 0.0000000000000000e+00 2165 0.0000000000000000e+00 2166 0.0000000000000000e+00 2167 0.0000000000000000e+00 2168 -6.2500000000000000e-02 2169 0.0000000000000000e+00 2170 0.0000000000000000e+00 2171 0.0000000000000000e+00 2172 1.2500000000000000e-01 2173 1.2500000000000000e-01 2174 0.0000000000000000e+00 2175 -1.2500000000000000e-01 2176 0.0000000000000000e+00 2177 0.0000000000000000e+00 2178 1.2500000000000000e-01 2179 -1.2500000000000000e-01 2180 0.0000000000000000e+00 2181 0.0000000000000000e+00 2182 0.0000000000000000e+00 2183 0.0000000000000000e+00 2184 -1.2500000000000000e-01 2185 0.0000000000000000e+00 2186 0.0000000000000000e+00 2187 -1.2500000000000000e-01 2188 0.0000000000000000e+00 2189 1.2500000000000000e-01 2190 0.0000000000000000e+00 2191 1.2500000000000000e-01 2192 0.0000000000000000e+00 2193 -1.2500000000000000e-01 2194 0.0000000000000000e+00 2195 0.0000000000000000e+00 2196 0.0000000000000000e+00 2197 1.2500000000000000e-01 2198 0.0000000000000000e+00 2199 -6.2500000000000000e-02 2200 0.0000000000000000e+00 2201 -6.2500000000000000e-02 2202 -1.2500000000000000e-01 2203 -6.2500000000000000e-02 2204 -6.2500000000000000e-02 2205 -6.2500000000000000e-02 2206 -6.2500000000000000e-02 2207 -6.2500000000000000e-02 2208 -6.2500000000000000e-02 2209 -6.2500000000000000e-02 2210 -6.2500000000000000e-02 2211 6.2500000000000000e-02 2212 6.2500000000000000e-02 2213 0.0000000000000000e+00 2214 -6.2500000000000000e-02 2215 0.0000000000000000e+00 2216 -1.2500000000000000e-01 2217 -6.2500000000000000e-02 2218 -6.2500000000000000e-02 2219 -6.2500000000000000e-02 2220 0.0000000000000000e+00 2221 -6.2500000000000000e-02 2222 0.0000000000000000e+00 2223 0.0000000000000000e+00 2224 -6.2500000000000000e-02 2225 6.2500000000000000e-02 2226 -6.2500000000000000e-02 2227 -6.2500000000000000e-02 2228 -6.2500000000000000e-02 2229 6.2500000000000000e-02 2230 6.2500000000000000e-02 2231 -6.2500000000000000e-02 2232 -6.2500000000000000e-02 2233 -1.2500000000000000e-01 2234 -1.2500000000000000e-01 2235 0.0000000000000000e+00 2236 6.2500000000000000e-02 2237 -6.2500000000000000e-02 2238 -6.2500000000000000e-02 2239 -6.2500000000000000e-02 2240 -6.2500000000000000e-02 2241 -1.2500000000000000e-01 2242 -6.2500000000000000e-02 2243 -6.2500000000000000e-02 2244 -6.2500000000000000e-02 2245 6.2500000000000000e-02 2246 0.0000000000000000e+00 2247 -6.2500000000000000e-02 2248 -1.2500000000000000e-01 2249 -6.2500000000000000e-02 2250 6.2500000000000000e-02 2251 6.2500000000000000e-02 2252 0.0000000000000000e+00 2253 -6.2500000000000000e-02 2254 -6.2500000000000000e-02 2255 -6.2500000000000000e-02 2256 -6.2500000000000000e-02 2257 6.2500000000000000e-02 2258 6.2500000000000000e-02 2259 0.0000000000000000e+00 2260 0.0000000000000000e+00 2261 0.0000000000000000e+00 2262 6.2500000000000000e-02 2263 0.0000000000000000e+00 2264 0.0000000000000000e+00 2265 0.0000000000000000e+00 2266 0.0000000000000000e+00 2267 -6.2500000000000000e-02 2268 6.2500000000000000e-02 2269 -6.2500000000000000e-02 2270 -1.2500000000000000e-01 2271 -6.2500000000000000e-02 2272 0.0000000000000000e+00 2273 0.0000000000000000e+00 2274 0.0000000000000000e+00 2275 -6.2500000000000000e-02 2276 -6.2500000000000000e-02 2277 -6.2500000000000000e-02 2278 0.0000000000000000e+00 2279 -6.2500000000000000e-02 2280 0.0000000000000000e+00 2281 -6.2500000000000000e-02 2282 -6.2500000000000000e-02 2283 -6.2500000000000000e-02 2284 -6.2500000000000000e-02 2285 1.2500000000000000e-01 2286 6.2500000000000000e-02 2287 0.0000000000000000e+00 2288 -6.2500000000000000e-02 2289 0.0000000000000000e+00 2290 -6.2500000000000000e-02 2291 -6.2500000000000000e-02 2292 -1.2500000000000000e-01 2293 -6.2500000000000000e-02 2294 -6.2500000000000000e-02 2295 -6.2500000000000000e-02 2296 -6.2500000000000000e-02 2297 -6.2500000000000000e-02 2298 -6.2500000000000000e-02 2299 -6.2500000000000000e-02 2300 6.2500000000000000e-02 2301 6.2500000000000000e-02 2302 0.0000000000000000e+00 2303 -6.2500000000000000e-02 2304 6.2500000000000000e-02 2305 -6.2500000000000000e-02 2306 -6.2500000000000000e-02 2307 -1.2500000000000000e-01 2308 6.2500000000000000e-02 2309 -6.2500000000000000e-02 2310 -1.2500000000000000e-01 2311 -6.2500000000000000e-02 2312 0.0000000000000000e+00 2313 -6.2500000000000000e-02 2314 -6.2500000000000000e-02 2315 0.0000000000000000e+00 2316 0.0000000000000000e+00 2317 0.0000000000000000e+00 2318 0.0000000000000000e+00 2319 -1.2500000000000000e-01 2320 0.0000000000000000e+00 2321 -1.2500000000000000e-01 2322 1.2500000000000000e-01 2323 0.0000000000000000e+00 2324 1.2500000000000000e-01 2325 1.2500000000000000e-01 2326 0.0000000000000000e+00 2327 1.2500000000000000e-01 2328 1.2500000000000000e-01 2329 1.2500000000000000e-01 2330 0.0000000000000000e+00 2331 0.0000000000000000e+00 2332 0.0000000000000000e+00 hypre-2.33.0/src/test/TEST_ams/mfem.Gy.00002000066400000000000000000001140441477326011500200120ustar00rootroot000000000000002333 3709 2333 0.0000000000000000e+00 2334 0.0000000000000000e+00 2335 6.2500000000000000e-02 2336 1.2500000000000000e-01 2337 1.2500000000000000e-01 2338 1.2500000000000000e-01 2339 0.0000000000000000e+00 2340 1.2500000000000000e-01 2341 0.0000000000000000e+00 2342 0.0000000000000000e+00 2343 1.2500000000000000e-01 2344 2.5000000000000000e-01 2345 1.2500000000000000e-01 2346 0.0000000000000000e+00 2347 1.2500000000000000e-01 2348 1.2500000000000000e-01 2349 1.2500000000000000e-01 2350 1.2500000000000000e-01 2351 0.0000000000000000e+00 2352 0.0000000000000000e+00 2353 0.0000000000000000e+00 2354 6.2500000000000000e-02 2355 0.0000000000000000e+00 2356 0.0000000000000000e+00 2357 6.2500000000000000e-02 2358 0.0000000000000000e+00 2359 1.2500000000000000e-01 2360 1.2500000000000000e-01 2361 6.2500000000000000e-02 2362 1.2500000000000000e-01 2363 1.2500000000000000e-01 2364 1.2500000000000000e-01 2365 0.0000000000000000e+00 2366 6.2500000000000000e-02 2367 1.2500000000000000e-01 2368 6.2500000000000000e-02 2369 0.0000000000000000e+00 2370 0.0000000000000000e+00 2371 1.2500000000000000e-01 2372 0.0000000000000000e+00 2373 1.2500000000000000e-01 2374 0.0000000000000000e+00 2375 1.2500000000000000e-01 2376 0.0000000000000000e+00 2377 0.0000000000000000e+00 2378 -1.2500000000000000e-01 2379 -1.2500000000000000e-01 2380 -6.2500000000000000e-02 2381 -6.2500000000000000e-02 2382 -1.2500000000000000e-01 2383 -6.2500000000000000e-02 2384 1.2500000000000000e-01 2385 0.0000000000000000e+00 2386 6.2500000000000000e-02 2387 6.2500000000000000e-02 2388 0.0000000000000000e+00 2389 0.0000000000000000e+00 2390 0.0000000000000000e+00 2391 6.2500000000000000e-02 2392 0.0000000000000000e+00 2393 0.0000000000000000e+00 2394 6.2500000000000000e-02 2395 -6.2500000000000000e-02 2396 -1.2500000000000000e-01 2397 0.0000000000000000e+00 2398 1.2500000000000000e-01 2399 1.2500000000000000e-01 2400 1.2500000000000000e-01 2401 1.2500000000000000e-01 2402 0.0000000000000000e+00 2403 -1.2500000000000000e-01 2404 -1.2500000000000000e-01 2405 -1.2500000000000000e-01 2406 -6.2500000000000000e-02 2407 -1.2500000000000000e-01 2408 0.0000000000000000e+00 2409 0.0000000000000000e+00 2410 -1.2500000000000000e-01 2411 -1.2500000000000000e-01 2412 -1.2500000000000000e-01 2413 0.0000000000000000e+00 2414 -1.2500000000000000e-01 2415 -1.2500000000000000e-01 2416 -2.5000000000000000e-01 2417 -1.2500000000000000e-01 2418 -1.2500000000000000e-01 2419 -6.2500000000000000e-02 2420 -1.2500000000000000e-01 2421 0.0000000000000000e+00 2422 -6.2500000000000000e-02 2423 1.2500000000000000e-01 2424 1.2500000000000000e-01 2425 6.2500000000000000e-02 2426 0.0000000000000000e+00 2427 -1.2500000000000000e-01 2428 1.2500000000000000e-01 2429 1.2500000000000000e-01 2430 0.0000000000000000e+00 2431 0.0000000000000000e+00 2432 0.0000000000000000e+00 2433 1.2500000000000000e-01 2434 -1.2500000000000000e-01 2435 0.0000000000000000e+00 2436 0.0000000000000000e+00 2437 0.0000000000000000e+00 2438 -1.2500000000000000e-01 2439 1.2500000000000000e-01 2440 -1.2500000000000000e-01 2441 0.0000000000000000e+00 2442 0.0000000000000000e+00 2443 -6.2500000000000000e-02 2444 0.0000000000000000e+00 2445 6.2500000000000000e-02 2446 -1.2500000000000000e-01 2447 0.0000000000000000e+00 2448 0.0000000000000000e+00 2449 1.2500000000000000e-01 2450 0.0000000000000000e+00 2451 -1.2500000000000000e-01 2452 0.0000000000000000e+00 2453 1.2500000000000000e-01 2454 1.2500000000000000e-01 2455 1.2500000000000000e-01 2456 -1.2500000000000000e-01 2457 -1.2500000000000000e-01 2458 -1.2500000000000000e-01 2459 1.2500000000000000e-01 2460 0.0000000000000000e+00 2461 -1.2500000000000000e-01 2462 1.2500000000000000e-01 2463 1.2500000000000000e-01 2464 -1.2500000000000000e-01 2465 -1.2500000000000000e-01 2466 0.0000000000000000e+00 2467 -6.2500000000000000e-02 2468 -6.2500000000000000e-02 2469 0.0000000000000000e+00 2470 6.2500000000000000e-02 2471 -1.2500000000000000e-01 2472 -1.2500000000000000e-01 2473 -6.2500000000000000e-02 2474 -1.2500000000000000e-01 2475 -6.2500000000000000e-02 2476 -1.2500000000000000e-01 2477 0.0000000000000000e+00 2478 1.2500000000000000e-01 2479 6.2500000000000000e-02 2480 0.0000000000000000e+00 2481 -1.2500000000000000e-01 2482 -1.2500000000000000e-01 2483 -6.2500000000000000e-02 2484 1.2500000000000000e-01 2485 0.0000000000000000e+00 2486 6.2500000000000000e-02 2487 -1.2500000000000000e-01 2488 -6.2500000000000000e-02 2489 -1.2500000000000000e-01 2490 0.0000000000000000e+00 2491 0.0000000000000000e+00 2492 1.2500000000000000e-01 2493 0.0000000000000000e+00 2494 -1.2500000000000000e-01 2495 1.2500000000000000e-01 2496 0.0000000000000000e+00 2497 6.2500000000000000e-02 2498 1.2500000000000000e-01 2499 1.2500000000000000e-01 2500 1.2500000000000000e-01 2501 0.0000000000000000e+00 2502 0.0000000000000000e+00 2503 0.0000000000000000e+00 2504 0.0000000000000000e+00 2505 1.2500000000000000e-01 2506 2.5000000000000000e-01 2507 1.2500000000000000e-01 2508 -1.2500000000000000e-01 2509 0.0000000000000000e+00 2510 -6.2500000000000000e-02 2511 -1.2500000000000000e-01 2512 -1.2500000000000000e-01 2513 0.0000000000000000e+00 2514 0.0000000000000000e+00 2515 1.2500000000000000e-01 2516 0.0000000000000000e+00 2517 6.2500000000000000e-02 2518 1.2500000000000000e-01 2519 1.2500000000000000e-01 2520 0.0000000000000000e+00 2521 0.0000000000000000e+00 2522 0.0000000000000000e+00 2523 0.0000000000000000e+00 2524 6.2500000000000000e-02 2525 -6.2500000000000000e-02 2526 -1.2500000000000000e-01 2527 -6.2500000000000000e-02 2528 1.2500000000000000e-01 2529 0.0000000000000000e+00 2530 6.2500000000000000e-02 2531 6.2500000000000000e-02 2532 0.0000000000000000e+00 2533 1.2500000000000000e-01 2534 0.0000000000000000e+00 2535 6.2500000000000000e-02 2536 0.0000000000000000e+00 2537 -6.2500000000000000e-02 2538 -1.2500000000000000e-01 2539 -1.2500000000000000e-01 2540 -1.2500000000000000e-01 2541 -6.2500000000000000e-02 2542 0.0000000000000000e+00 2543 0.0000000000000000e+00 2544 -1.2500000000000000e-01 2545 1.2500000000000000e-01 2546 1.2500000000000000e-01 2547 1.2500000000000000e-01 2548 0.0000000000000000e+00 2549 0.0000000000000000e+00 2550 -6.2500000000000000e-02 2551 0.0000000000000000e+00 2552 1.2500000000000000e-01 2553 0.0000000000000000e+00 2554 -1.2500000000000000e-01 2555 -1.2500000000000000e-01 2556 -1.2500000000000000e-01 2557 0.0000000000000000e+00 2558 -1.2500000000000000e-01 2559 1.2500000000000000e-01 2560 1.2500000000000000e-01 2561 1.2500000000000000e-01 2562 -1.2500000000000000e-01 2563 -1.2500000000000000e-01 2564 -1.2500000000000000e-01 2565 1.2500000000000000e-01 2566 0.0000000000000000e+00 2567 1.2500000000000000e-01 2568 -1.2500000000000000e-01 2569 0.0000000000000000e+00 2570 -1.2500000000000000e-01 2571 -1.2500000000000000e-01 2572 0.0000000000000000e+00 2573 -1.2500000000000000e-01 2574 -1.2500000000000000e-01 2575 0.0000000000000000e+00 2576 -1.2500000000000000e-01 2577 0.0000000000000000e+00 2578 0.0000000000000000e+00 2579 1.2500000000000000e-01 2580 1.2500000000000000e-01 2581 1.2500000000000000e-01 2582 1.2500000000000000e-01 2583 1.2500000000000000e-01 2584 1.2500000000000000e-01 2585 1.2500000000000000e-01 2586 0.0000000000000000e+00 2587 -1.2500000000000000e-01 2588 0.0000000000000000e+00 2589 1.2500000000000000e-01 2590 0.0000000000000000e+00 2591 0.0000000000000000e+00 2592 1.2500000000000000e-01 2593 1.2500000000000000e-01 2594 0.0000000000000000e+00 2595 1.2500000000000000e-01 2596 1.2500000000000000e-01 2597 0.0000000000000000e+00 2598 0.0000000000000000e+00 2599 1.2500000000000000e-01 2600 0.0000000000000000e+00 2601 1.2500000000000000e-01 2602 1.2500000000000000e-01 2603 0.0000000000000000e+00 2604 0.0000000000000000e+00 2605 1.2500000000000000e-01 2606 1.2500000000000000e-01 2607 1.2500000000000000e-01 2608 1.2500000000000000e-01 2609 1.2500000000000000e-01 2610 0.0000000000000000e+00 2611 1.2500000000000000e-01 2612 1.2500000000000000e-01 2613 0.0000000000000000e+00 2614 0.0000000000000000e+00 2615 0.0000000000000000e+00 2616 1.2500000000000000e-01 2617 0.0000000000000000e+00 2618 1.2500000000000000e-01 2619 1.2500000000000000e-01 2620 0.0000000000000000e+00 2621 1.2500000000000000e-01 2622 1.2500000000000000e-01 2623 0.0000000000000000e+00 2624 1.2500000000000000e-01 2625 0.0000000000000000e+00 2626 0.0000000000000000e+00 2627 1.2500000000000000e-01 2628 1.2500000000000000e-01 2629 0.0000000000000000e+00 2630 0.0000000000000000e+00 2631 0.0000000000000000e+00 2632 0.0000000000000000e+00 2633 -1.2500000000000000e-01 2634 0.0000000000000000e+00 2635 0.0000000000000000e+00 2636 -1.2500000000000000e-01 2637 0.0000000000000000e+00 2638 0.0000000000000000e+00 2639 -1.2500000000000000e-01 2640 -1.2500000000000000e-01 2641 0.0000000000000000e+00 2642 -1.2500000000000000e-01 2643 -1.2500000000000000e-01 2644 -1.2500000000000000e-01 2645 0.0000000000000000e+00 2646 -2.5000000000000000e-01 2647 -1.2500000000000000e-01 2648 -1.2500000000000000e-01 2649 0.0000000000000000e+00 2650 0.0000000000000000e+00 2651 1.2500000000000000e-01 2652 1.2500000000000000e-01 2653 1.2500000000000000e-01 2654 1.2500000000000000e-01 2655 1.2500000000000000e-01 2656 1.2500000000000000e-01 2657 1.2500000000000000e-01 2658 1.2500000000000000e-01 2659 1.2500000000000000e-01 2660 1.2500000000000000e-01 2661 1.2500000000000000e-01 2662 0.0000000000000000e+00 2663 -1.2500000000000000e-01 2664 -1.2500000000000000e-01 2665 -1.2500000000000000e-01 2666 0.0000000000000000e+00 2667 0.0000000000000000e+00 2668 1.2500000000000000e-01 2669 1.2500000000000000e-01 2670 0.0000000000000000e+00 2671 -6.2500000000000000e-02 2672 0.0000000000000000e+00 2673 -1.2500000000000000e-01 2674 1.2500000000000000e-01 2675 -1.2500000000000000e-01 2676 -1.2500000000000000e-01 2677 -1.2500000000000000e-01 2678 1.2500000000000000e-01 2679 0.0000000000000000e+00 2680 0.0000000000000000e+00 2681 0.0000000000000000e+00 2682 1.2500000000000000e-01 2683 0.0000000000000000e+00 2684 0.0000000000000000e+00 2685 1.2500000000000000e-01 2686 1.2500000000000000e-01 2687 1.2500000000000000e-01 2688 0.0000000000000000e+00 2689 0.0000000000000000e+00 2690 -1.2500000000000000e-01 2691 -1.2500000000000000e-01 2692 -1.2500000000000000e-01 2693 -1.2500000000000000e-01 2694 -1.2500000000000000e-01 2695 1.2500000000000000e-01 2696 1.2500000000000000e-01 2697 0.0000000000000000e+00 2698 1.2500000000000000e-01 2699 1.2500000000000000e-01 2700 1.2500000000000000e-01 2701 0.0000000000000000e+00 2702 1.2500000000000000e-01 2703 1.2500000000000000e-01 2704 0.0000000000000000e+00 2705 0.0000000000000000e+00 2706 0.0000000000000000e+00 2707 0.0000000000000000e+00 2708 1.2500000000000000e-01 2709 1.2500000000000000e-01 2710 -1.2500000000000000e-01 2711 -1.2500000000000000e-01 2712 -1.2500000000000000e-01 2713 -1.2500000000000000e-01 2714 0.0000000000000000e+00 2715 1.2500000000000000e-01 2716 1.2500000000000000e-01 2717 0.0000000000000000e+00 2718 0.0000000000000000e+00 2719 1.2500000000000000e-01 2720 1.2500000000000000e-01 2721 -1.2500000000000000e-01 2722 1.2500000000000000e-01 2723 1.2500000000000000e-01 2724 1.2500000000000000e-01 2725 1.2500000000000000e-01 2726 1.2500000000000000e-01 2727 0.0000000000000000e+00 2728 1.2500000000000000e-01 2729 0.0000000000000000e+00 2730 0.0000000000000000e+00 2731 0.0000000000000000e+00 2732 0.0000000000000000e+00 2733 -1.2500000000000000e-01 2734 -1.2500000000000000e-01 2735 -1.2500000000000000e-01 2736 -1.2500000000000000e-01 2737 -1.2500000000000000e-01 2738 -1.2500000000000000e-01 2739 1.2500000000000000e-01 2740 0.0000000000000000e+00 2741 0.0000000000000000e+00 2742 -1.2500000000000000e-01 2743 0.0000000000000000e+00 2744 1.2500000000000000e-01 2745 1.2500000000000000e-01 2746 -1.2500000000000000e-01 2747 -1.2500000000000000e-01 2748 1.2500000000000000e-01 2749 -1.2500000000000000e-01 2750 -1.2500000000000000e-01 2751 -1.2500000000000000e-01 2752 -1.2500000000000000e-01 2753 -1.2500000000000000e-01 2754 0.0000000000000000e+00 2755 -1.2500000000000000e-01 2756 -1.2500000000000000e-01 2757 1.2500000000000000e-01 2758 1.2500000000000000e-01 2759 0.0000000000000000e+00 2760 0.0000000000000000e+00 2761 -1.2500000000000000e-01 2762 0.0000000000000000e+00 2763 -1.2500000000000000e-01 2764 0.0000000000000000e+00 2765 -1.2500000000000000e-01 2766 1.2500000000000000e-01 2767 -1.2500000000000000e-01 2768 0.0000000000000000e+00 2769 0.0000000000000000e+00 2770 -1.2500000000000000e-01 2771 0.0000000000000000e+00 2772 1.2500000000000000e-01 2773 1.2500000000000000e-01 2774 1.2500000000000000e-01 2775 -1.2500000000000000e-01 2776 -1.2500000000000000e-01 2777 -1.2500000000000000e-01 2778 -1.2500000000000000e-01 2779 0.0000000000000000e+00 2780 0.0000000000000000e+00 2781 -1.2500000000000000e-01 2782 0.0000000000000000e+00 2783 0.0000000000000000e+00 2784 0.0000000000000000e+00 2785 -1.2500000000000000e-01 2786 -1.2500000000000000e-01 2787 -1.2500000000000000e-01 2788 -1.2500000000000000e-01 2789 -1.2500000000000000e-01 2790 1.2500000000000000e-01 2791 1.2500000000000000e-01 2792 -1.2500000000000000e-01 2793 0.0000000000000000e+00 2794 0.0000000000000000e+00 2795 1.2500000000000000e-01 2796 0.0000000000000000e+00 2797 -1.2500000000000000e-01 2798 0.0000000000000000e+00 2799 1.2500000000000000e-01 2800 0.0000000000000000e+00 2801 -1.2500000000000000e-01 2802 -1.2500000000000000e-01 2803 1.2500000000000000e-01 2804 1.2500000000000000e-01 2805 -1.2500000000000000e-01 2806 -1.2500000000000000e-01 2807 1.2500000000000000e-01 2808 1.2500000000000000e-01 2809 1.2500000000000000e-01 2810 0.0000000000000000e+00 2811 0.0000000000000000e+00 2812 0.0000000000000000e+00 2813 2.5000000000000000e-01 2814 1.2500000000000000e-01 2815 -1.2500000000000000e-01 2816 -1.2500000000000000e-01 2817 -1.2500000000000000e-01 2818 -1.2500000000000000e-01 2819 -1.2500000000000000e-01 2820 -1.2500000000000000e-01 2821 -1.2500000000000000e-01 2822 -1.2500000000000000e-01 2823 0.0000000000000000e+00 2824 -1.2500000000000000e-01 2825 -1.2500000000000000e-01 2826 -1.2500000000000000e-01 2827 0.0000000000000000e+00 2828 -1.2500000000000000e-01 2829 -1.2500000000000000e-01 2830 -1.2500000000000000e-01 2831 0.0000000000000000e+00 2832 -1.2500000000000000e-01 2833 -1.2500000000000000e-01 2834 -1.2500000000000000e-01 2835 0.0000000000000000e+00 2836 -1.2500000000000000e-01 2837 0.0000000000000000e+00 2838 -1.2500000000000000e-01 2839 -1.2500000000000000e-01 2840 -1.2500000000000000e-01 2841 -1.2500000000000000e-01 2842 -1.2500000000000000e-01 2843 0.0000000000000000e+00 2844 0.0000000000000000e+00 2845 -1.2500000000000000e-01 2846 -1.2500000000000000e-01 2847 -6.2500000000000000e-02 2848 -1.2500000000000000e-01 2849 0.0000000000000000e+00 2850 0.0000000000000000e+00 2851 6.2500000000000000e-02 2852 0.0000000000000000e+00 2853 -6.2500000000000000e-02 2854 -6.2500000000000000e-02 2855 -1.2500000000000000e-01 2856 0.0000000000000000e+00 2857 0.0000000000000000e+00 2858 0.0000000000000000e+00 2859 0.0000000000000000e+00 2860 6.2500000000000000e-02 2861 -6.2500000000000000e-02 2862 -1.2500000000000000e-01 2863 -6.2500000000000000e-02 2864 0.0000000000000000e+00 2865 0.0000000000000000e+00 2866 6.2500000000000000e-02 2867 -1.2500000000000000e-01 2868 -6.2500000000000000e-02 2869 1.2500000000000000e-01 2870 1.2500000000000000e-01 2871 1.2500000000000000e-01 2872 6.2500000000000000e-02 2873 0.0000000000000000e+00 2874 6.2500000000000000e-02 2875 1.2500000000000000e-01 2876 1.2500000000000000e-01 2877 0.0000000000000000e+00 2878 1.2500000000000000e-01 2879 0.0000000000000000e+00 2880 1.2500000000000000e-01 2881 0.0000000000000000e+00 2882 0.0000000000000000e+00 2883 0.0000000000000000e+00 2884 0.0000000000000000e+00 2885 0.0000000000000000e+00 2886 0.0000000000000000e+00 2887 6.2500000000000000e-02 2888 1.2500000000000000e-01 2889 0.0000000000000000e+00 2890 1.2500000000000000e-01 2891 1.2500000000000000e-01 2892 0.0000000000000000e+00 2893 1.2500000000000000e-01 2894 1.2500000000000000e-01 2895 -1.2500000000000000e-01 2896 -1.2500000000000000e-01 2897 -1.2500000000000000e-01 2898 0.0000000000000000e+00 2899 0.0000000000000000e+00 2900 0.0000000000000000e+00 2901 0.0000000000000000e+00 2902 -1.2500000000000000e-01 2903 1.2500000000000000e-01 2904 1.2500000000000000e-01 2905 -1.2500000000000000e-01 2906 -1.2500000000000000e-01 2907 -1.2500000000000000e-01 2908 -1.2500000000000000e-01 2909 0.0000000000000000e+00 2910 0.0000000000000000e+00 2911 0.0000000000000000e+00 2912 -1.2500000000000000e-01 2913 1.2500000000000000e-01 2914 1.2500000000000000e-01 2915 -1.2500000000000000e-01 2916 1.2500000000000000e-01 2917 0.0000000000000000e+00 2918 0.0000000000000000e+00 2919 0.0000000000000000e+00 2920 1.2500000000000000e-01 2921 -1.2500000000000000e-01 2922 -1.2500000000000000e-01 2923 -1.2500000000000000e-01 2924 -1.2500000000000000e-01 2925 -1.2500000000000000e-01 2926 -1.2500000000000000e-01 2927 0.0000000000000000e+00 2928 0.0000000000000000e+00 2929 1.2500000000000000e-01 2930 1.2500000000000000e-01 2931 1.2500000000000000e-01 2932 1.2500000000000000e-01 2933 1.2500000000000000e-01 2934 1.2500000000000000e-01 2935 1.2500000000000000e-01 2936 1.2500000000000000e-01 2937 0.0000000000000000e+00 2938 1.2500000000000000e-01 2939 0.0000000000000000e+00 2940 1.2500000000000000e-01 2941 0.0000000000000000e+00 2942 0.0000000000000000e+00 2943 0.0000000000000000e+00 2944 1.2500000000000000e-01 2945 0.0000000000000000e+00 2946 0.0000000000000000e+00 2947 1.2500000000000000e-01 2948 1.2500000000000000e-01 2949 1.2500000000000000e-01 2950 0.0000000000000000e+00 2951 -1.2500000000000000e-01 2952 -1.2500000000000000e-01 2953 -1.2500000000000000e-01 2954 -1.2500000000000000e-01 2955 0.0000000000000000e+00 2956 1.2500000000000000e-01 2957 1.2500000000000000e-01 2958 1.2500000000000000e-01 2959 1.2500000000000000e-01 2960 -1.2500000000000000e-01 2961 0.0000000000000000e+00 2962 -1.2500000000000000e-01 2963 0.0000000000000000e+00 2964 0.0000000000000000e+00 2965 0.0000000000000000e+00 2966 1.2500000000000000e-01 2967 1.2500000000000000e-01 2968 1.2500000000000000e-01 2969 1.2500000000000000e-01 2970 0.0000000000000000e+00 2971 1.2500000000000000e-01 2972 0.0000000000000000e+00 2973 1.2500000000000000e-01 2974 1.2500000000000000e-01 2975 0.0000000000000000e+00 2976 0.0000000000000000e+00 2977 1.2500000000000000e-01 2978 0.0000000000000000e+00 2979 1.2500000000000000e-01 2980 1.2500000000000000e-01 2981 0.0000000000000000e+00 2982 1.2500000000000000e-01 2983 1.2500000000000000e-01 2984 0.0000000000000000e+00 2985 0.0000000000000000e+00 2986 0.0000000000000000e+00 2987 0.0000000000000000e+00 2988 1.2500000000000000e-01 2989 1.2500000000000000e-01 2990 1.2500000000000000e-01 2991 1.2500000000000000e-01 2992 0.0000000000000000e+00 2993 0.0000000000000000e+00 2994 1.2500000000000000e-01 2995 0.0000000000000000e+00 2996 0.0000000000000000e+00 2997 0.0000000000000000e+00 2998 1.2500000000000000e-01 2999 -1.2500000000000000e-01 3000 -1.2500000000000000e-01 3001 1.2500000000000000e-01 3002 0.0000000000000000e+00 3003 0.0000000000000000e+00 3004 -1.2500000000000000e-01 3005 0.0000000000000000e+00 3006 0.0000000000000000e+00 3007 -1.2500000000000000e-01 3008 -1.2500000000000000e-01 3009 0.0000000000000000e+00 3010 -1.2500000000000000e-01 3011 -1.2500000000000000e-01 3012 -1.2500000000000000e-01 3013 -1.2500000000000000e-01 3014 0.0000000000000000e+00 3015 -1.2500000000000000e-01 3016 -1.2500000000000000e-01 3017 -1.2500000000000000e-01 3018 0.0000000000000000e+00 3019 0.0000000000000000e+00 3020 0.0000000000000000e+00 3021 -1.2500000000000000e-01 3022 0.0000000000000000e+00 3023 1.2500000000000000e-01 3024 0.0000000000000000e+00 3025 0.0000000000000000e+00 3026 0.0000000000000000e+00 3027 0.0000000000000000e+00 3028 6.2500000000000000e-02 3029 0.0000000000000000e+00 3030 6.2500000000000000e-02 3031 0.0000000000000000e+00 3032 6.2500000000000000e-02 3033 0.0000000000000000e+00 3034 6.2500000000000000e-02 3035 1.2500000000000000e-01 3036 6.2500000000000000e-02 3037 6.2500000000000000e-02 3038 6.2500000000000000e-02 3039 6.2500000000000000e-02 3040 -6.2500000000000000e-02 3041 6.2500000000000000e-02 3042 6.2500000000000000e-02 3043 6.2500000000000000e-02 3044 6.2500000000000000e-02 3045 6.2500000000000000e-02 3046 -6.2500000000000000e-02 3047 6.2500000000000000e-02 3048 6.2500000000000000e-02 3049 1.2500000000000000e-01 3050 1.2500000000000000e-01 3051 0.0000000000000000e+00 3052 6.2500000000000000e-02 3053 6.2500000000000000e-02 3054 6.2500000000000000e-02 3055 -6.2500000000000000e-02 3056 0.0000000000000000e+00 3057 6.2500000000000000e-02 3058 0.0000000000000000e+00 3059 -6.2500000000000000e-02 3060 -1.2500000000000000e-01 3061 -1.2500000000000000e-01 3062 -6.2500000000000000e-02 3063 0.0000000000000000e+00 3064 1.2500000000000000e-01 3065 0.0000000000000000e+00 3066 6.2500000000000000e-02 3067 0.0000000000000000e+00 3068 -6.2500000000000000e-02 3069 -1.2500000000000000e-01 3070 -6.2500000000000000e-02 3071 0.0000000000000000e+00 3072 6.2500000000000000e-02 3073 6.2500000000000000e-02 3074 -6.2500000000000000e-02 3075 -6.2500000000000000e-02 3076 6.2500000000000000e-02 3077 -6.2500000000000000e-02 3078 -6.2500000000000000e-02 3079 6.2500000000000000e-02 3080 6.2500000000000000e-02 3081 6.2500000000000000e-02 3082 0.0000000000000000e+00 3083 0.0000000000000000e+00 3084 0.0000000000000000e+00 3085 0.0000000000000000e+00 3086 -1.2500000000000000e-01 3087 0.0000000000000000e+00 3088 6.2500000000000000e-02 3089 -6.2500000000000000e-02 3090 0.0000000000000000e+00 3091 0.0000000000000000e+00 3092 6.2500000000000000e-02 3093 1.2500000000000000e-01 3094 6.2500000000000000e-02 3095 0.0000000000000000e+00 3096 0.0000000000000000e+00 3097 0.0000000000000000e+00 3098 1.2500000000000000e-01 3099 6.2500000000000000e-02 3100 -1.2500000000000000e-01 3101 0.0000000000000000e+00 3102 -6.2500000000000000e-02 3103 -6.2500000000000000e-02 3104 1.2500000000000000e-01 3105 -6.2500000000000000e-02 3106 -6.2500000000000000e-02 3107 6.2500000000000000e-02 3108 6.2500000000000000e-02 3109 6.2500000000000000e-02 3110 -6.2500000000000000e-02 3111 -6.2500000000000000e-02 3112 0.0000000000000000e+00 3113 0.0000000000000000e+00 3114 0.0000000000000000e+00 3115 1.2500000000000000e-01 3116 0.0000000000000000e+00 3117 0.0000000000000000e+00 3118 -1.2500000000000000e-01 3119 -6.2500000000000000e-02 3120 1.2500000000000000e-01 3121 6.2500000000000000e-02 3122 0.0000000000000000e+00 3123 -6.2500000000000000e-02 3124 0.0000000000000000e+00 3125 6.2500000000000000e-02 3126 -6.2500000000000000e-02 3127 6.2500000000000000e-02 3128 0.0000000000000000e+00 3129 6.2500000000000000e-02 3130 -6.2500000000000000e-02 3131 6.2500000000000000e-02 3132 6.2500000000000000e-02 3133 6.2500000000000000e-02 3134 -6.2500000000000000e-02 3135 -6.2500000000000000e-02 3136 -6.2500000000000000e-02 3137 6.2500000000000000e-02 3138 0.0000000000000000e+00 3139 6.2500000000000000e-02 3140 6.2500000000000000e-02 3141 -6.2500000000000000e-02 3142 -6.2500000000000000e-02 3143 0.0000000000000000e+00 3144 0.0000000000000000e+00 3145 6.2500000000000000e-02 3146 0.0000000000000000e+00 3147 -1.2500000000000000e-01 3148 0.0000000000000000e+00 3149 1.2500000000000000e-01 3150 6.2500000000000000e-02 3151 -6.2500000000000000e-02 3152 1.2500000000000000e-01 3153 0.0000000000000000e+00 3154 1.2500000000000000e-01 3155 -6.2500000000000000e-02 3156 -6.2500000000000000e-02 3157 0.0000000000000000e+00 3158 -1.2500000000000000e-01 3159 -6.2500000000000000e-02 3160 -6.2500000000000000e-02 3161 6.2500000000000000e-02 3162 6.2500000000000000e-02 3163 6.2500000000000000e-02 3164 6.2500000000000000e-02 3165 -6.2500000000000000e-02 3166 1.2500000000000000e-01 3167 0.0000000000000000e+00 3168 0.0000000000000000e+00 3169 0.0000000000000000e+00 3170 0.0000000000000000e+00 3171 0.0000000000000000e+00 3172 -1.2500000000000000e-01 3173 -1.2500000000000000e-01 3174 0.0000000000000000e+00 3175 0.0000000000000000e+00 3176 0.0000000000000000e+00 3177 1.2500000000000000e-01 3178 -1.2500000000000000e-01 3179 -1.2500000000000000e-01 3180 -1.2500000000000000e-01 3181 0.0000000000000000e+00 3182 0.0000000000000000e+00 3183 1.2500000000000000e-01 3184 0.0000000000000000e+00 3185 0.0000000000000000e+00 3186 0.0000000000000000e+00 3187 1.2500000000000000e-01 3188 1.2500000000000000e-01 3189 0.0000000000000000e+00 3190 0.0000000000000000e+00 3191 0.0000000000000000e+00 3192 0.0000000000000000e+00 3193 0.0000000000000000e+00 3194 1.2500000000000000e-01 3195 0.0000000000000000e+00 3196 0.0000000000000000e+00 3197 0.0000000000000000e+00 3198 0.0000000000000000e+00 3199 1.2500000000000000e-01 3200 1.2500000000000000e-01 3201 0.0000000000000000e+00 3202 1.2500000000000000e-01 3203 0.0000000000000000e+00 3204 0.0000000000000000e+00 3205 -1.2500000000000000e-01 3206 -1.2500000000000000e-01 3207 0.0000000000000000e+00 3208 0.0000000000000000e+00 3209 1.2500000000000000e-01 3210 1.2500000000000000e-01 3211 0.0000000000000000e+00 3212 6.2500000000000000e-02 3213 -1.2500000000000000e-01 3214 0.0000000000000000e+00 3215 -6.2500000000000000e-02 3216 0.0000000000000000e+00 3217 -1.2500000000000000e-01 3218 0.0000000000000000e+00 3219 1.2500000000000000e-01 3220 0.0000000000000000e+00 3221 1.2500000000000000e-01 3222 1.2500000000000000e-01 3223 0.0000000000000000e+00 3224 1.2500000000000000e-01 3225 -1.2500000000000000e-01 3226 -1.2500000000000000e-01 3227 0.0000000000000000e+00 3228 0.0000000000000000e+00 3229 0.0000000000000000e+00 3230 1.2500000000000000e-01 3231 0.0000000000000000e+00 3232 0.0000000000000000e+00 3233 -1.2500000000000000e-01 3234 1.2500000000000000e-01 3235 1.2500000000000000e-01 3236 0.0000000000000000e+00 3237 -1.2500000000000000e-01 3238 0.0000000000000000e+00 3239 0.0000000000000000e+00 3240 1.2500000000000000e-01 3241 1.2500000000000000e-01 3242 0.0000000000000000e+00 3243 0.0000000000000000e+00 3244 0.0000000000000000e+00 3245 0.0000000000000000e+00 3246 0.0000000000000000e+00 3247 0.0000000000000000e+00 3248 0.0000000000000000e+00 3249 1.2500000000000000e-01 3250 0.0000000000000000e+00 3251 0.0000000000000000e+00 3252 1.2500000000000000e-01 3253 -1.2500000000000000e-01 3254 0.0000000000000000e+00 3255 1.2500000000000000e-01 3256 0.0000000000000000e+00 3257 0.0000000000000000e+00 3258 0.0000000000000000e+00 3259 -1.2500000000000000e-01 3260 -1.2500000000000000e-01 3261 1.2500000000000000e-01 3262 1.2500000000000000e-01 3263 -1.2500000000000000e-01 3264 0.0000000000000000e+00 3265 0.0000000000000000e+00 3266 0.0000000000000000e+00 3267 -1.2500000000000000e-01 3268 -1.2500000000000000e-01 3269 -1.2500000000000000e-01 3270 -1.2500000000000000e-01 3271 0.0000000000000000e+00 3272 1.2500000000000000e-01 3273 1.2500000000000000e-01 3274 -1.2500000000000000e-01 3275 0.0000000000000000e+00 3276 -1.2500000000000000e-01 3277 0.0000000000000000e+00 3278 1.2500000000000000e-01 3279 -1.2500000000000000e-01 3280 0.0000000000000000e+00 3281 0.0000000000000000e+00 3282 0.0000000000000000e+00 3283 0.0000000000000000e+00 3284 1.2500000000000000e-01 3285 -1.2500000000000000e-01 3286 -1.2500000000000000e-01 3287 0.0000000000000000e+00 3288 1.2500000000000000e-01 3289 0.0000000000000000e+00 3290 1.2500000000000000e-01 3291 -1.2500000000000000e-01 3292 -1.2500000000000000e-01 3293 -1.2500000000000000e-01 3294 0.0000000000000000e+00 3295 0.0000000000000000e+00 3296 0.0000000000000000e+00 3297 -1.2500000000000000e-01 3298 0.0000000000000000e+00 3299 0.0000000000000000e+00 3300 0.0000000000000000e+00 3301 -1.2500000000000000e-01 3302 1.2500000000000000e-01 3303 -1.2500000000000000e-01 3304 -1.2500000000000000e-01 3305 1.2500000000000000e-01 3306 0.0000000000000000e+00 3307 0.0000000000000000e+00 3308 0.0000000000000000e+00 3309 0.0000000000000000e+00 3310 1.2500000000000000e-01 3311 0.0000000000000000e+00 3312 0.0000000000000000e+00 3313 0.0000000000000000e+00 3314 1.2500000000000000e-01 3315 0.0000000000000000e+00 3316 -1.2500000000000000e-01 3317 1.2500000000000000e-01 3318 1.2500000000000000e-01 3319 0.0000000000000000e+00 3320 1.2500000000000000e-01 3321 0.0000000000000000e+00 3322 -1.2500000000000000e-01 3323 0.0000000000000000e+00 3324 0.0000000000000000e+00 3325 1.2500000000000000e-01 3326 -1.2500000000000000e-01 3327 0.0000000000000000e+00 3328 0.0000000000000000e+00 3329 1.2500000000000000e-01 3330 1.2500000000000000e-01 3331 -1.2500000000000000e-01 3332 -1.2500000000000000e-01 3333 0.0000000000000000e+00 3334 -1.2500000000000000e-01 3335 0.0000000000000000e+00 3336 0.0000000000000000e+00 3337 1.2500000000000000e-01 3338 1.2500000000000000e-01 3339 1.2500000000000000e-01 3340 0.0000000000000000e+00 3341 -1.2500000000000000e-01 3342 0.0000000000000000e+00 3343 1.2500000000000000e-01 3344 0.0000000000000000e+00 3345 0.0000000000000000e+00 3346 0.0000000000000000e+00 3347 1.2500000000000000e-01 3348 -1.2500000000000000e-01 3349 1.2500000000000000e-01 3350 1.2500000000000000e-01 3351 -1.2500000000000000e-01 3352 -1.2500000000000000e-01 3353 0.0000000000000000e+00 3354 0.0000000000000000e+00 3355 -1.2500000000000000e-01 3356 0.0000000000000000e+00 3357 0.0000000000000000e+00 3358 -1.2500000000000000e-01 3359 0.0000000000000000e+00 3360 1.2500000000000000e-01 3361 0.0000000000000000e+00 3362 1.2500000000000000e-01 3363 1.2500000000000000e-01 3364 1.2500000000000000e-01 3365 -1.2500000000000000e-01 3366 0.0000000000000000e+00 3367 0.0000000000000000e+00 3368 -1.2500000000000000e-01 3369 1.2500000000000000e-01 3370 0.0000000000000000e+00 3371 -1.2500000000000000e-01 3372 -1.2500000000000000e-01 3373 0.0000000000000000e+00 3374 0.0000000000000000e+00 3375 0.0000000000000000e+00 3376 1.2500000000000000e-01 3377 0.0000000000000000e+00 3378 1.2500000000000000e-01 3379 0.0000000000000000e+00 3380 -1.2500000000000000e-01 3381 1.2500000000000000e-01 3382 0.0000000000000000e+00 3383 0.0000000000000000e+00 3384 0.0000000000000000e+00 3385 0.0000000000000000e+00 3386 0.0000000000000000e+00 3387 -1.2500000000000000e-01 3388 -1.2500000000000000e-01 3389 0.0000000000000000e+00 3390 1.2500000000000000e-01 3391 -1.2500000000000000e-01 3392 0.0000000000000000e+00 3393 -1.2500000000000000e-01 3394 -1.2500000000000000e-01 3395 0.0000000000000000e+00 3396 0.0000000000000000e+00 3397 -1.2500000000000000e-01 3398 -6.2500000000000000e-02 3399 0.0000000000000000e+00 3400 6.2500000000000000e-02 3401 0.0000000000000000e+00 3402 1.2500000000000000e-01 3403 6.2500000000000000e-02 3404 -6.2500000000000000e-02 3405 6.2500000000000000e-02 3406 6.2500000000000000e-02 3407 0.0000000000000000e+00 3408 6.2500000000000000e-02 3409 -6.2500000000000000e-02 3410 6.2500000000000000e-02 3411 -6.2500000000000000e-02 3412 0.0000000000000000e+00 3413 -6.2500000000000000e-02 3414 6.2500000000000000e-02 3415 6.2500000000000000e-02 3416 6.2500000000000000e-02 3417 -6.2500000000000000e-02 3418 6.2500000000000000e-02 3419 6.2500000000000000e-02 3420 6.2500000000000000e-02 3421 -1.2500000000000000e-01 3422 6.2500000000000000e-02 3423 0.0000000000000000e+00 3424 0.0000000000000000e+00 3425 -6.2500000000000000e-02 3426 0.0000000000000000e+00 3427 -6.2500000000000000e-02 3428 0.0000000000000000e+00 3429 -6.2500000000000000e-02 3430 6.2500000000000000e-02 3431 0.0000000000000000e+00 3432 -6.2500000000000000e-02 3433 6.2500000000000000e-02 3434 6.2500000000000000e-02 3435 6.2500000000000000e-02 3436 -6.2500000000000000e-02 3437 -6.2500000000000000e-02 3438 1.2500000000000000e-01 3439 0.0000000000000000e+00 3440 -6.2500000000000000e-02 3441 1.2500000000000000e-01 3442 -1.2500000000000000e-01 3443 6.2500000000000000e-02 3444 -6.2500000000000000e-02 3445 0.0000000000000000e+00 3446 6.2500000000000000e-02 3447 0.0000000000000000e+00 3448 -6.2500000000000000e-02 3449 -6.2500000000000000e-02 3450 6.2500000000000000e-02 3451 6.2500000000000000e-02 3452 -6.2500000000000000e-02 3453 -6.2500000000000000e-02 3454 -6.2500000000000000e-02 3455 0.0000000000000000e+00 3456 1.2500000000000000e-01 3457 6.2500000000000000e-02 3458 0.0000000000000000e+00 3459 6.2500000000000000e-02 3460 6.2500000000000000e-02 3461 -1.2500000000000000e-01 3462 -6.2500000000000000e-02 3463 0.0000000000000000e+00 3464 0.0000000000000000e+00 3465 6.2500000000000000e-02 3466 0.0000000000000000e+00 3467 6.2500000000000000e-02 3468 -6.2500000000000000e-02 3469 6.2500000000000000e-02 3470 1.2500000000000000e-01 3471 0.0000000000000000e+00 3472 6.2500000000000000e-02 3473 -6.2500000000000000e-02 3474 0.0000000000000000e+00 3475 0.0000000000000000e+00 3476 6.2500000000000000e-02 3477 0.0000000000000000e+00 3478 6.2500000000000000e-02 3479 -6.2500000000000000e-02 3480 6.2500000000000000e-02 3481 -1.2500000000000000e-01 3482 1.2500000000000000e-01 3483 0.0000000000000000e+00 3484 0.0000000000000000e+00 3485 0.0000000000000000e+00 3486 -1.2500000000000000e-01 3487 0.0000000000000000e+00 3488 -1.2500000000000000e-01 3489 -1.2500000000000000e-01 3490 1.2500000000000000e-01 3491 0.0000000000000000e+00 3492 -1.2500000000000000e-01 3493 1.2500000000000000e-01 3494 0.0000000000000000e+00 3495 -1.2500000000000000e-01 3496 0.0000000000000000e+00 3497 0.0000000000000000e+00 3498 1.2500000000000000e-01 3499 0.0000000000000000e+00 3500 -1.2500000000000000e-01 3501 1.2500000000000000e-01 3502 1.2500000000000000e-01 3503 0.0000000000000000e+00 3504 0.0000000000000000e+00 3505 -1.2500000000000000e-01 3506 1.2500000000000000e-01 3507 0.0000000000000000e+00 3508 0.0000000000000000e+00 3509 0.0000000000000000e+00 3510 1.2500000000000000e-01 3511 -1.2500000000000000e-01 3512 1.2500000000000000e-01 3513 1.2500000000000000e-01 3514 0.0000000000000000e+00 3515 1.2500000000000000e-01 3516 0.0000000000000000e+00 3517 1.2500000000000000e-01 3518 1.2500000000000000e-01 3519 0.0000000000000000e+00 3520 1.2500000000000000e-01 3521 0.0000000000000000e+00 3522 0.0000000000000000e+00 3523 0.0000000000000000e+00 3524 0.0000000000000000e+00 3525 1.2500000000000000e-01 3526 1.2500000000000000e-01 3527 0.0000000000000000e+00 3528 1.2500000000000000e-01 3529 0.0000000000000000e+00 3530 0.0000000000000000e+00 3531 0.0000000000000000e+00 3532 1.2500000000000000e-01 3533 1.2500000000000000e-01 3534 0.0000000000000000e+00 3535 0.0000000000000000e+00 3536 0.0000000000000000e+00 3537 0.0000000000000000e+00 3538 1.2500000000000000e-01 3539 -1.2500000000000000e-01 3540 -1.2500000000000000e-01 3541 0.0000000000000000e+00 3542 0.0000000000000000e+00 3543 1.2500000000000000e-01 3544 1.2500000000000000e-01 3545 -1.2500000000000000e-01 3546 -1.2500000000000000e-01 3547 0.0000000000000000e+00 3548 1.2500000000000000e-01 3549 -1.2500000000000000e-01 3550 0.0000000000000000e+00 3551 0.0000000000000000e+00 3552 0.0000000000000000e+00 3553 -1.2500000000000000e-01 3554 1.2500000000000000e-01 3555 -1.2500000000000000e-01 3556 -1.2500000000000000e-01 3557 -1.2500000000000000e-01 3558 -1.2500000000000000e-01 3559 1.2500000000000000e-01 3560 0.0000000000000000e+00 3561 0.0000000000000000e+00 3562 1.2500000000000000e-01 3563 0.0000000000000000e+00 3564 0.0000000000000000e+00 3565 0.0000000000000000e+00 3566 0.0000000000000000e+00 3567 -1.2500000000000000e-01 3568 0.0000000000000000e+00 3569 -1.2500000000000000e-01 3570 0.0000000000000000e+00 3571 1.2500000000000000e-01 3572 0.0000000000000000e+00 3573 0.0000000000000000e+00 3574 -1.2500000000000000e-01 3575 0.0000000000000000e+00 3576 0.0000000000000000e+00 3577 0.0000000000000000e+00 3578 -1.2500000000000000e-01 3579 -1.2500000000000000e-01 3580 -1.2500000000000000e-01 3581 0.0000000000000000e+00 3582 0.0000000000000000e+00 3583 0.0000000000000000e+00 3584 -1.2500000000000000e-01 3585 -1.2500000000000000e-01 3586 1.2500000000000000e-01 3587 0.0000000000000000e+00 3588 0.0000000000000000e+00 3589 -1.2500000000000000e-01 3590 1.2500000000000000e-01 3591 0.0000000000000000e+00 3592 0.0000000000000000e+00 3593 0.0000000000000000e+00 3594 1.2500000000000000e-01 3595 1.2500000000000000e-01 3596 1.2500000000000000e-01 3597 0.0000000000000000e+00 3598 0.0000000000000000e+00 3599 0.0000000000000000e+00 3600 0.0000000000000000e+00 3601 1.2500000000000000e-01 3602 0.0000000000000000e+00 3603 -1.2500000000000000e-01 3604 0.0000000000000000e+00 3605 1.2500000000000000e-01 3606 1.2500000000000000e-01 3607 0.0000000000000000e+00 3608 0.0000000000000000e+00 3609 1.2500000000000000e-01 3610 0.0000000000000000e+00 3611 1.2500000000000000e-01 3612 1.2500000000000000e-01 3613 1.2500000000000000e-01 3614 0.0000000000000000e+00 3615 1.2500000000000000e-01 3616 1.2500000000000000e-01 3617 0.0000000000000000e+00 3618 1.2500000000000000e-01 3619 1.2500000000000000e-01 3620 0.0000000000000000e+00 3621 1.2500000000000000e-01 3622 1.2500000000000000e-01 3623 0.0000000000000000e+00 3624 -1.2500000000000000e-01 3625 0.0000000000000000e+00 3626 -1.2500000000000000e-01 3627 -1.2500000000000000e-01 3628 0.0000000000000000e+00 3629 0.0000000000000000e+00 3630 -1.2500000000000000e-01 3631 1.2500000000000000e-01 3632 1.2500000000000000e-01 3633 0.0000000000000000e+00 3634 -1.2500000000000000e-01 3635 0.0000000000000000e+00 3636 1.2500000000000000e-01 3637 0.0000000000000000e+00 3638 0.0000000000000000e+00 3639 0.0000000000000000e+00 3640 0.0000000000000000e+00 3641 0.0000000000000000e+00 3642 -1.2500000000000000e-01 3643 0.0000000000000000e+00 3644 1.2500000000000000e-01 3645 0.0000000000000000e+00 3646 0.0000000000000000e+00 3647 0.0000000000000000e+00 3648 0.0000000000000000e+00 3649 -1.2500000000000000e-01 3650 -1.2500000000000000e-01 3651 0.0000000000000000e+00 3652 0.0000000000000000e+00 3653 1.2500000000000000e-01 3654 0.0000000000000000e+00 3655 0.0000000000000000e+00 3656 0.0000000000000000e+00 3657 1.2500000000000000e-01 3658 0.0000000000000000e+00 3659 1.2500000000000000e-01 3660 1.2500000000000000e-01 3661 0.0000000000000000e+00 3662 0.0000000000000000e+00 3663 0.0000000000000000e+00 3664 0.0000000000000000e+00 3665 0.0000000000000000e+00 3666 0.0000000000000000e+00 3667 0.0000000000000000e+00 3668 0.0000000000000000e+00 3669 0.0000000000000000e+00 3670 0.0000000000000000e+00 3671 0.0000000000000000e+00 3672 1.2500000000000000e-01 3673 1.2500000000000000e-01 3674 0.0000000000000000e+00 3675 0.0000000000000000e+00 3676 0.0000000000000000e+00 3677 0.0000000000000000e+00 3678 0.0000000000000000e+00 3679 1.2500000000000000e-01 3680 1.2500000000000000e-01 3681 0.0000000000000000e+00 3682 1.2500000000000000e-01 3683 0.0000000000000000e+00 3684 0.0000000000000000e+00 3685 0.0000000000000000e+00 3686 0.0000000000000000e+00 3687 0.0000000000000000e+00 3688 0.0000000000000000e+00 3689 0.0000000000000000e+00 3690 1.2500000000000000e-01 3691 0.0000000000000000e+00 3692 0.0000000000000000e+00 3693 1.2500000000000000e-01 3694 0.0000000000000000e+00 3695 0.0000000000000000e+00 3696 0.0000000000000000e+00 3697 1.2500000000000000e-01 3698 -1.2500000000000000e-01 3699 -1.2500000000000000e-01 3700 -1.2500000000000000e-01 3701 1.2500000000000000e-01 3702 0.0000000000000000e+00 3703 0.0000000000000000e+00 3704 1.2500000000000000e-01 3705 -1.2500000000000000e-01 3706 -1.2500000000000000e-01 3707 -1.2500000000000000e-01 3708 0.0000000000000000e+00 3709 0.0000000000000000e+00 hypre-2.33.0/src/test/TEST_ams/mfem.Gy.00003000066400000000000000000001136011477326011500200110ustar00rootroot000000000000003710 5080 3710 1.2500000000000000e-01 3711 1.2500000000000000e-01 3712 1.2500000000000000e-01 3713 1.2500000000000000e-01 3714 0.0000000000000000e+00 3715 0.0000000000000000e+00 3716 0.0000000000000000e+00 3717 -1.2500000000000000e-01 3718 -1.2500000000000000e-01 3719 -1.2500000000000000e-01 3720 -1.2500000000000000e-01 3721 -1.2500000000000000e-01 3722 0.0000000000000000e+00 3723 0.0000000000000000e+00 3724 -1.2500000000000000e-01 3725 -1.2500000000000000e-01 3726 0.0000000000000000e+00 3727 1.2500000000000000e-01 3728 0.0000000000000000e+00 3729 -1.2500000000000000e-01 3730 -1.2500000000000000e-01 3731 0.0000000000000000e+00 3732 1.2500000000000000e-01 3733 1.2500000000000000e-01 3734 1.2500000000000000e-01 3735 1.2500000000000000e-01 3736 1.2500000000000000e-01 3737 0.0000000000000000e+00 3738 -1.2500000000000000e-01 3739 -1.2500000000000000e-01 3740 -1.2500000000000000e-01 3741 -1.2500000000000000e-01 3742 0.0000000000000000e+00 3743 1.2500000000000000e-01 3744 0.0000000000000000e+00 3745 1.2500000000000000e-01 3746 1.2500000000000000e-01 3747 -1.2500000000000000e-01 3748 0.0000000000000000e+00 3749 0.0000000000000000e+00 3750 0.0000000000000000e+00 3751 -1.2500000000000000e-01 3752 1.2500000000000000e-01 3753 0.0000000000000000e+00 3754 0.0000000000000000e+00 3755 1.2500000000000000e-01 3756 1.2500000000000000e-01 3757 1.2500000000000000e-01 3758 1.2500000000000000e-01 3759 1.2500000000000000e-01 3760 -1.2500000000000000e-01 3761 -1.2500000000000000e-01 3762 -1.2500000000000000e-01 3763 -1.2500000000000000e-01 3764 -1.2500000000000000e-01 3765 0.0000000000000000e+00 3766 0.0000000000000000e+00 3767 1.2500000000000000e-01 3768 0.0000000000000000e+00 3769 -1.2500000000000000e-01 3770 -1.2500000000000000e-01 3771 1.2500000000000000e-01 3772 1.2500000000000000e-01 3773 -1.2500000000000000e-01 3774 1.2500000000000000e-01 3775 1.2500000000000000e-01 3776 1.2500000000000000e-01 3777 0.0000000000000000e+00 3778 0.0000000000000000e+00 3779 1.2500000000000000e-01 3780 1.2500000000000000e-01 3781 0.0000000000000000e+00 3782 1.2500000000000000e-01 3783 -1.2500000000000000e-01 3784 -1.2500000000000000e-01 3785 -1.2500000000000000e-01 3786 -1.2500000000000000e-01 3787 -1.2500000000000000e-01 3788 0.0000000000000000e+00 3789 -1.2500000000000000e-01 3790 -1.2500000000000000e-01 3791 0.0000000000000000e+00 3792 0.0000000000000000e+00 3793 1.2500000000000000e-01 3794 1.2500000000000000e-01 3795 0.0000000000000000e+00 3796 1.2500000000000000e-01 3797 1.2500000000000000e-01 3798 -1.2500000000000000e-01 3799 -1.2500000000000000e-01 3800 -1.2500000000000000e-01 3801 -1.2500000000000000e-01 3802 -1.2500000000000000e-01 3803 -1.2500000000000000e-01 3804 -1.2500000000000000e-01 3805 0.0000000000000000e+00 3806 1.2500000000000000e-01 3807 0.0000000000000000e+00 3808 0.0000000000000000e+00 3809 0.0000000000000000e+00 3810 0.0000000000000000e+00 3811 1.2500000000000000e-01 3812 -1.2500000000000000e-01 3813 -1.2500000000000000e-01 3814 0.0000000000000000e+00 3815 0.0000000000000000e+00 3816 1.2500000000000000e-01 3817 -1.2500000000000000e-01 3818 -1.2500000000000000e-01 3819 -1.2500000000000000e-01 3820 0.0000000000000000e+00 3821 0.0000000000000000e+00 3822 0.0000000000000000e+00 3823 -1.2500000000000000e-01 3824 0.0000000000000000e+00 3825 0.0000000000000000e+00 3826 1.2500000000000000e-01 3827 1.2500000000000000e-01 3828 1.2500000000000000e-01 3829 -1.2500000000000000e-01 3830 -1.2500000000000000e-01 3831 1.2500000000000000e-01 3832 1.2500000000000000e-01 3833 0.0000000000000000e+00 3834 0.0000000000000000e+00 3835 1.2500000000000000e-01 3836 1.2500000000000000e-01 3837 -1.2500000000000000e-01 3838 -1.2500000000000000e-01 3839 -1.2500000000000000e-01 3840 0.0000000000000000e+00 3841 -1.2500000000000000e-01 3842 1.2500000000000000e-01 3843 0.0000000000000000e+00 3844 0.0000000000000000e+00 3845 0.0000000000000000e+00 3846 1.2500000000000000e-01 3847 -1.2500000000000000e-01 3848 0.0000000000000000e+00 3849 -1.2500000000000000e-01 3850 1.2500000000000000e-01 3851 -1.2500000000000000e-01 3852 -1.2500000000000000e-01 3853 -1.2500000000000000e-01 3854 0.0000000000000000e+00 3855 0.0000000000000000e+00 3856 1.2500000000000000e-01 3857 1.2500000000000000e-01 3858 1.2500000000000000e-01 3859 1.2500000000000000e-01 3860 1.2500000000000000e-01 3861 1.2500000000000000e-01 3862 0.0000000000000000e+00 3863 1.2500000000000000e-01 3864 1.2500000000000000e-01 3865 0.0000000000000000e+00 3866 1.2500000000000000e-01 3867 1.2500000000000000e-01 3868 1.2500000000000000e-01 3869 0.0000000000000000e+00 3870 0.0000000000000000e+00 3871 1.2500000000000000e-01 3872 1.2500000000000000e-01 3873 -1.2500000000000000e-01 3874 0.0000000000000000e+00 3875 0.0000000000000000e+00 3876 1.2500000000000000e-01 3877 1.2500000000000000e-01 3878 0.0000000000000000e+00 3879 -1.2500000000000000e-01 3880 1.2500000000000000e-01 3881 1.2500000000000000e-01 3882 1.2500000000000000e-01 3883 -1.2500000000000000e-01 3884 -1.2500000000000000e-01 3885 0.0000000000000000e+00 3886 -1.2500000000000000e-01 3887 0.0000000000000000e+00 3888 1.2500000000000000e-01 3889 1.2500000000000000e-01 3890 0.0000000000000000e+00 3891 1.2500000000000000e-01 3892 0.0000000000000000e+00 3893 1.2500000000000000e-01 3894 1.2500000000000000e-01 3895 0.0000000000000000e+00 3896 1.2500000000000000e-01 3897 1.2500000000000000e-01 3898 0.0000000000000000e+00 3899 1.2500000000000000e-01 3900 1.2500000000000000e-01 3901 0.0000000000000000e+00 3902 0.0000000000000000e+00 3903 -1.2500000000000000e-01 3904 -1.2500000000000000e-01 3905 -1.2500000000000000e-01 3906 -1.2500000000000000e-01 3907 -1.2500000000000000e-01 3908 -1.2500000000000000e-01 3909 1.2500000000000000e-01 3910 1.2500000000000000e-01 3911 1.2500000000000000e-01 3912 0.0000000000000000e+00 3913 1.2500000000000000e-01 3914 1.2500000000000000e-01 3915 0.0000000000000000e+00 3916 0.0000000000000000e+00 3917 0.0000000000000000e+00 3918 1.2500000000000000e-01 3919 2.5000000000000000e-01 3920 -1.2500000000000000e-01 3921 -1.2500000000000000e-01 3922 -1.2500000000000000e-01 3923 -1.2500000000000000e-01 3924 -1.2500000000000000e-01 3925 0.0000000000000000e+00 3926 -1.2500000000000000e-01 3927 0.0000000000000000e+00 3928 0.0000000000000000e+00 3929 0.0000000000000000e+00 3930 0.0000000000000000e+00 3931 1.2500000000000000e-01 3932 1.2500000000000000e-01 3933 1.2500000000000000e-01 3934 1.2500000000000000e-01 3935 1.2500000000000000e-01 3936 1.2500000000000000e-01 3937 -1.2500000000000000e-01 3938 0.0000000000000000e+00 3939 0.0000000000000000e+00 3940 1.2500000000000000e-01 3941 0.0000000000000000e+00 3942 -1.2500000000000000e-01 3943 -1.2500000000000000e-01 3944 1.2500000000000000e-01 3945 1.2500000000000000e-01 3946 -1.2500000000000000e-01 3947 1.2500000000000000e-01 3948 -1.2500000000000000e-01 3949 -1.2500000000000000e-01 3950 -1.2500000000000000e-01 3951 0.0000000000000000e+00 3952 0.0000000000000000e+00 3953 -1.2500000000000000e-01 3954 0.0000000000000000e+00 3955 0.0000000000000000e+00 3956 1.2500000000000000e-01 3957 0.0000000000000000e+00 3958 0.0000000000000000e+00 3959 1.2500000000000000e-01 3960 0.0000000000000000e+00 3961 1.2500000000000000e-01 3962 1.2500000000000000e-01 3963 1.2500000000000000e-01 3964 1.2500000000000000e-01 3965 1.2500000000000000e-01 3966 -1.2500000000000000e-01 3967 0.0000000000000000e+00 3968 0.0000000000000000e+00 3969 1.2500000000000000e-01 3970 0.0000000000000000e+00 3971 -1.2500000000000000e-01 3972 0.0000000000000000e+00 3973 1.2500000000000000e-01 3974 1.2500000000000000e-01 3975 1.2500000000000000e-01 3976 -1.2500000000000000e-01 3977 -1.2500000000000000e-01 3978 -1.2500000000000000e-01 3979 -1.2500000000000000e-01 3980 -1.2500000000000000e-01 3981 -1.2500000000000000e-01 3982 -1.2500000000000000e-01 3983 0.0000000000000000e+00 3984 0.0000000000000000e+00 3985 -1.2500000000000000e-01 3986 0.0000000000000000e+00 3987 0.0000000000000000e+00 3988 -1.2500000000000000e-01 3989 0.0000000000000000e+00 3990 1.2500000000000000e-01 3991 0.0000000000000000e+00 3992 0.0000000000000000e+00 3993 1.2500000000000000e-01 3994 1.2500000000000000e-01 3995 1.2500000000000000e-01 3996 1.2500000000000000e-01 3997 1.2500000000000000e-01 3998 1.2500000000000000e-01 3999 0.0000000000000000e+00 4000 0.0000000000000000e+00 4001 -1.2500000000000000e-01 4002 0.0000000000000000e+00 4003 1.2500000000000000e-01 4004 0.0000000000000000e+00 4005 0.0000000000000000e+00 4006 -1.2500000000000000e-01 4007 1.2500000000000000e-01 4008 1.2500000000000000e-01 4009 -1.2500000000000000e-01 4010 -1.2500000000000000e-01 4011 1.2500000000000000e-01 4012 -1.2500000000000000e-01 4013 -1.2500000000000000e-01 4014 1.2500000000000000e-01 4015 -1.2500000000000000e-01 4016 -1.2500000000000000e-01 4017 0.0000000000000000e+00 4018 -1.2500000000000000e-01 4019 0.0000000000000000e+00 4020 -1.2500000000000000e-01 4021 -1.2500000000000000e-01 4022 0.0000000000000000e+00 4023 -1.2500000000000000e-01 4024 -1.2500000000000000e-01 4025 0.0000000000000000e+00 4026 0.0000000000000000e+00 4027 -1.2500000000000000e-01 4028 -1.2500000000000000e-01 4029 -1.2500000000000000e-01 4030 -1.2500000000000000e-01 4031 0.0000000000000000e+00 4032 -1.2500000000000000e-01 4033 -1.2500000000000000e-01 4034 -1.2500000000000000e-01 4035 0.0000000000000000e+00 4036 0.0000000000000000e+00 4037 0.0000000000000000e+00 4038 0.0000000000000000e+00 4039 0.0000000000000000e+00 4040 -1.2500000000000000e-01 4041 -1.2500000000000000e-01 4042 0.0000000000000000e+00 4043 0.0000000000000000e+00 4044 1.2500000000000000e-01 4045 1.2500000000000000e-01 4046 1.2500000000000000e-01 4047 1.2500000000000000e-01 4048 0.0000000000000000e+00 4049 0.0000000000000000e+00 4050 0.0000000000000000e+00 4051 1.2500000000000000e-01 4052 1.2500000000000000e-01 4053 0.0000000000000000e+00 4054 0.0000000000000000e+00 4055 1.2500000000000000e-01 4056 1.2500000000000000e-01 4057 -1.2500000000000000e-01 4058 0.0000000000000000e+00 4059 0.0000000000000000e+00 4060 1.2500000000000000e-01 4061 0.0000000000000000e+00 4062 -1.2500000000000000e-01 4063 -1.2500000000000000e-01 4064 1.2500000000000000e-01 4065 -1.2500000000000000e-01 4066 1.2500000000000000e-01 4067 1.2500000000000000e-01 4068 1.2500000000000000e-01 4069 -1.2500000000000000e-01 4070 -1.2500000000000000e-01 4071 0.0000000000000000e+00 4072 -1.2500000000000000e-01 4073 0.0000000000000000e+00 4074 -1.2500000000000000e-01 4075 0.0000000000000000e+00 4076 0.0000000000000000e+00 4077 0.0000000000000000e+00 4078 -1.2500000000000000e-01 4079 1.2500000000000000e-01 4080 0.0000000000000000e+00 4081 0.0000000000000000e+00 4082 1.2500000000000000e-01 4083 1.2500000000000000e-01 4084 1.2500000000000000e-01 4085 1.2500000000000000e-01 4086 1.2500000000000000e-01 4087 -1.2500000000000000e-01 4088 -1.2500000000000000e-01 4089 -1.2500000000000000e-01 4090 -1.2500000000000000e-01 4091 -1.2500000000000000e-01 4092 0.0000000000000000e+00 4093 0.0000000000000000e+00 4094 1.2500000000000000e-01 4095 0.0000000000000000e+00 4096 0.0000000000000000e+00 4097 -1.2500000000000000e-01 4098 -1.2500000000000000e-01 4099 -1.2500000000000000e-01 4100 1.2500000000000000e-01 4101 1.2500000000000000e-01 4102 -1.2500000000000000e-01 4103 1.2500000000000000e-01 4104 0.0000000000000000e+00 4105 1.2500000000000000e-01 4106 -1.2500000000000000e-01 4107 -1.2500000000000000e-01 4108 -1.2500000000000000e-01 4109 -1.2500000000000000e-01 4110 0.0000000000000000e+00 4111 -1.2500000000000000e-01 4112 -1.2500000000000000e-01 4113 0.0000000000000000e+00 4114 0.0000000000000000e+00 4115 1.2500000000000000e-01 4116 0.0000000000000000e+00 4117 1.2500000000000000e-01 4118 1.2500000000000000e-01 4119 -1.2500000000000000e-01 4120 -1.2500000000000000e-01 4121 -1.2500000000000000e-01 4122 1.2500000000000000e-01 4123 -1.2500000000000000e-01 4124 -1.2500000000000000e-01 4125 0.0000000000000000e+00 4126 -1.2500000000000000e-01 4127 0.0000000000000000e+00 4128 -1.2500000000000000e-01 4129 -1.2500000000000000e-01 4130 0.0000000000000000e+00 4131 0.0000000000000000e+00 4132 -1.2500000000000000e-01 4133 -1.2500000000000000e-01 4134 0.0000000000000000e+00 4135 0.0000000000000000e+00 4136 -1.2500000000000000e-01 4137 -1.2500000000000000e-01 4138 0.0000000000000000e+00 4139 0.0000000000000000e+00 4140 -1.2500000000000000e-01 4141 -1.2500000000000000e-01 4142 -1.2500000000000000e-01 4143 -1.2500000000000000e-01 4144 0.0000000000000000e+00 4145 0.0000000000000000e+00 4146 0.0000000000000000e+00 4147 -1.2500000000000000e-01 4148 0.0000000000000000e+00 4149 -1.2500000000000000e-01 4150 0.0000000000000000e+00 4151 0.0000000000000000e+00 4152 1.2500000000000000e-01 4153 -1.2500000000000000e-01 4154 0.0000000000000000e+00 4155 -1.2500000000000000e-01 4156 1.2500000000000000e-01 4157 0.0000000000000000e+00 4158 1.2500000000000000e-01 4159 1.2500000000000000e-01 4160 1.2500000000000000e-01 4161 0.0000000000000000e+00 4162 1.2500000000000000e-01 4163 1.2500000000000000e-01 4164 0.0000000000000000e+00 4165 0.0000000000000000e+00 4166 1.2500000000000000e-01 4167 0.0000000000000000e+00 4168 1.2500000000000000e-01 4169 0.0000000000000000e+00 4170 -1.2500000000000000e-01 4171 -1.2500000000000000e-01 4172 -1.2500000000000000e-01 4173 1.2500000000000000e-01 4174 1.2500000000000000e-01 4175 1.2500000000000000e-01 4176 1.2500000000000000e-01 4177 1.2500000000000000e-01 4178 0.0000000000000000e+00 4179 0.0000000000000000e+00 4180 -1.2500000000000000e-01 4181 -1.2500000000000000e-01 4182 -1.2500000000000000e-01 4183 1.2500000000000000e-01 4184 -1.2500000000000000e-01 4185 1.2500000000000000e-01 4186 1.2500000000000000e-01 4187 1.2500000000000000e-01 4188 1.2500000000000000e-01 4189 0.0000000000000000e+00 4190 1.2500000000000000e-01 4191 1.2500000000000000e-01 4192 0.0000000000000000e+00 4193 0.0000000000000000e+00 4194 0.0000000000000000e+00 4195 1.2500000000000000e-01 4196 0.0000000000000000e+00 4197 0.0000000000000000e+00 4198 0.0000000000000000e+00 4199 0.0000000000000000e+00 4200 -1.2500000000000000e-01 4201 -1.2500000000000000e-01 4202 -1.2500000000000000e-01 4203 -1.2500000000000000e-01 4204 0.0000000000000000e+00 4205 0.0000000000000000e+00 4206 0.0000000000000000e+00 4207 1.2500000000000000e-01 4208 0.0000000000000000e+00 4209 0.0000000000000000e+00 4210 0.0000000000000000e+00 4211 1.2500000000000000e-01 4212 -1.2500000000000000e-01 4213 -1.2500000000000000e-01 4214 -1.2500000000000000e-01 4215 -1.2500000000000000e-01 4216 -1.2500000000000000e-01 4217 -1.2500000000000000e-01 4218 0.0000000000000000e+00 4219 0.0000000000000000e+00 4220 1.2500000000000000e-01 4221 1.2500000000000000e-01 4222 1.2500000000000000e-01 4223 1.2500000000000000e-01 4224 1.2500000000000000e-01 4225 1.2500000000000000e-01 4226 1.2500000000000000e-01 4227 1.2500000000000000e-01 4228 0.0000000000000000e+00 4229 -1.2500000000000000e-01 4230 -1.2500000000000000e-01 4231 -1.2500000000000000e-01 4232 -1.2500000000000000e-01 4233 1.2500000000000000e-01 4234 0.0000000000000000e+00 4235 1.2500000000000000e-01 4236 0.0000000000000000e+00 4237 0.0000000000000000e+00 4238 0.0000000000000000e+00 4239 -1.2500000000000000e-01 4240 -1.2500000000000000e-01 4241 1.2500000000000000e-01 4242 0.0000000000000000e+00 4243 0.0000000000000000e+00 4244 1.2500000000000000e-01 4245 0.0000000000000000e+00 4246 -2.5000000000000000e-01 4247 -1.2500000000000000e-01 4248 -1.2500000000000000e-01 4249 -1.2500000000000000e-01 4250 -1.2500000000000000e-01 4251 -1.2500000000000000e-01 4252 -1.2500000000000000e-01 4253 0.0000000000000000e+00 4254 0.0000000000000000e+00 4255 1.2500000000000000e-01 4256 1.2500000000000000e-01 4257 1.2500000000000000e-01 4258 1.2500000000000000e-01 4259 0.0000000000000000e+00 4260 1.2500000000000000e-01 4261 1.2500000000000000e-01 4262 -1.2500000000000000e-01 4263 -1.2500000000000000e-01 4264 -1.2500000000000000e-01 4265 -1.2500000000000000e-01 4266 0.0000000000000000e+00 4267 0.0000000000000000e+00 4268 0.0000000000000000e+00 4269 0.0000000000000000e+00 4270 1.2500000000000000e-01 4271 1.2500000000000000e-01 4272 -1.2500000000000000e-01 4273 -1.2500000000000000e-01 4274 1.2500000000000000e-01 4275 0.0000000000000000e+00 4276 0.0000000000000000e+00 4277 1.2500000000000000e-01 4278 1.2500000000000000e-01 4279 1.2500000000000000e-01 4280 -1.2500000000000000e-01 4281 -1.2500000000000000e-01 4282 -1.2500000000000000e-01 4283 -1.2500000000000000e-01 4284 0.0000000000000000e+00 4285 -1.2500000000000000e-01 4286 0.0000000000000000e+00 4287 1.2500000000000000e-01 4288 1.2500000000000000e-01 4289 1.2500000000000000e-01 4290 1.2500000000000000e-01 4291 1.2500000000000000e-01 4292 1.2500000000000000e-01 4293 1.2500000000000000e-01 4294 -1.2500000000000000e-01 4295 -1.2500000000000000e-01 4296 -1.2500000000000000e-01 4297 -1.2500000000000000e-01 4298 0.0000000000000000e+00 4299 -1.2500000000000000e-01 4300 0.0000000000000000e+00 4301 -1.2500000000000000e-01 4302 0.0000000000000000e+00 4303 0.0000000000000000e+00 4304 0.0000000000000000e+00 4305 -1.2500000000000000e-01 4306 -1.2500000000000000e-01 4307 -1.2500000000000000e-01 4308 -1.2500000000000000e-01 4309 -1.2500000000000000e-01 4310 0.0000000000000000e+00 4311 -1.2500000000000000e-01 4312 0.0000000000000000e+00 4313 -1.2500000000000000e-01 4314 -1.2500000000000000e-01 4315 0.0000000000000000e+00 4316 -1.2500000000000000e-01 4317 0.0000000000000000e+00 4318 -1.2500000000000000e-01 4319 0.0000000000000000e+00 4320 1.2500000000000000e-01 4321 1.2500000000000000e-01 4322 1.2500000000000000e-01 4323 0.0000000000000000e+00 4324 1.2500000000000000e-01 4325 1.2500000000000000e-01 4326 0.0000000000000000e+00 4327 0.0000000000000000e+00 4328 0.0000000000000000e+00 4329 0.0000000000000000e+00 4330 1.2500000000000000e-01 4331 1.2500000000000000e-01 4332 1.2500000000000000e-01 4333 1.2500000000000000e-01 4334 0.0000000000000000e+00 4335 1.2500000000000000e-01 4336 0.0000000000000000e+00 4337 0.0000000000000000e+00 4338 1.2500000000000000e-01 4339 1.2500000000000000e-01 4340 1.2500000000000000e-01 4341 1.2500000000000000e-01 4342 1.2500000000000000e-01 4343 0.0000000000000000e+00 4344 0.0000000000000000e+00 4345 0.0000000000000000e+00 4346 0.0000000000000000e+00 4347 0.0000000000000000e+00 4348 1.2500000000000000e-01 4349 1.2500000000000000e-01 4350 1.2500000000000000e-01 4351 0.0000000000000000e+00 4352 1.2500000000000000e-01 4353 2.5000000000000000e-01 4354 -1.2500000000000000e-01 4355 0.0000000000000000e+00 4356 0.0000000000000000e+00 4357 -1.2500000000000000e-01 4358 -1.2500000000000000e-01 4359 -1.2500000000000000e-01 4360 -1.2500000000000000e-01 4361 -1.2500000000000000e-01 4362 0.0000000000000000e+00 4363 0.0000000000000000e+00 4364 1.2500000000000000e-01 4365 1.2500000000000000e-01 4366 -1.2500000000000000e-01 4367 -1.2500000000000000e-01 4368 -1.2500000000000000e-01 4369 -1.2500000000000000e-01 4370 0.0000000000000000e+00 4371 -1.2500000000000000e-01 4372 0.0000000000000000e+00 4373 -1.2500000000000000e-01 4374 0.0000000000000000e+00 4375 0.0000000000000000e+00 4376 0.0000000000000000e+00 4377 -1.2500000000000000e-01 4378 -1.2500000000000000e-01 4379 0.0000000000000000e+00 4380 -1.2500000000000000e-01 4381 0.0000000000000000e+00 4382 0.0000000000000000e+00 4383 0.0000000000000000e+00 4384 0.0000000000000000e+00 4385 1.2500000000000000e-01 4386 1.2500000000000000e-01 4387 1.2500000000000000e-01 4388 0.0000000000000000e+00 4389 0.0000000000000000e+00 4390 0.0000000000000000e+00 4391 0.0000000000000000e+00 4392 0.0000000000000000e+00 4393 1.2500000000000000e-01 4394 0.0000000000000000e+00 4395 0.0000000000000000e+00 4396 0.0000000000000000e+00 4397 -1.2500000000000000e-01 4398 1.2500000000000000e-01 4399 1.2500000000000000e-01 4400 -1.2500000000000000e-01 4401 -1.2500000000000000e-01 4402 0.0000000000000000e+00 4403 -1.2500000000000000e-01 4404 0.0000000000000000e+00 4405 0.0000000000000000e+00 4406 1.2500000000000000e-01 4407 1.2500000000000000e-01 4408 1.2500000000000000e-01 4409 0.0000000000000000e+00 4410 0.0000000000000000e+00 4411 -1.2500000000000000e-01 4412 0.0000000000000000e+00 4413 1.2500000000000000e-01 4414 0.0000000000000000e+00 4415 0.0000000000000000e+00 4416 0.0000000000000000e+00 4417 1.2500000000000000e-01 4418 -1.2500000000000000e-01 4419 1.2500000000000000e-01 4420 1.2500000000000000e-01 4421 0.0000000000000000e+00 4422 1.2500000000000000e-01 4423 1.2500000000000000e-01 4424 -1.2500000000000000e-01 4425 -1.2500000000000000e-01 4426 0.0000000000000000e+00 4427 0.0000000000000000e+00 4428 -1.2500000000000000e-01 4429 0.0000000000000000e+00 4430 0.0000000000000000e+00 4431 -1.2500000000000000e-01 4432 -1.2500000000000000e-01 4433 -1.2500000000000000e-01 4434 0.0000000000000000e+00 4435 -1.2500000000000000e-01 4436 1.2500000000000000e-01 4437 1.2500000000000000e-01 4438 0.0000000000000000e+00 4439 0.0000000000000000e+00 4440 0.0000000000000000e+00 4441 0.0000000000000000e+00 4442 1.2500000000000000e-01 4443 0.0000000000000000e+00 4444 0.0000000000000000e+00 4445 -1.2500000000000000e-01 4446 1.2500000000000000e-01 4447 1.2500000000000000e-01 4448 -1.2500000000000000e-01 4449 0.0000000000000000e+00 4450 0.0000000000000000e+00 4451 1.2500000000000000e-01 4452 0.0000000000000000e+00 4453 0.0000000000000000e+00 4454 0.0000000000000000e+00 4455 0.0000000000000000e+00 4456 0.0000000000000000e+00 4457 1.2500000000000000e-01 4458 0.0000000000000000e+00 4459 -1.2500000000000000e-01 4460 0.0000000000000000e+00 4461 1.2500000000000000e-01 4462 0.0000000000000000e+00 4463 -1.2500000000000000e-01 4464 0.0000000000000000e+00 4465 -1.2500000000000000e-01 4466 -1.2500000000000000e-01 4467 0.0000000000000000e+00 4468 1.2500000000000000e-01 4469 0.0000000000000000e+00 4470 0.0000000000000000e+00 4471 1.2500000000000000e-01 4472 1.2500000000000000e-01 4473 0.0000000000000000e+00 4474 0.0000000000000000e+00 4475 0.0000000000000000e+00 4476 1.2500000000000000e-01 4477 -1.2500000000000000e-01 4478 -1.2500000000000000e-01 4479 0.0000000000000000e+00 4480 1.2500000000000000e-01 4481 1.2500000000000000e-01 4482 1.2500000000000000e-01 4483 0.0000000000000000e+00 4484 -1.2500000000000000e-01 4485 1.2500000000000000e-01 4486 -1.2500000000000000e-01 4487 0.0000000000000000e+00 4488 0.0000000000000000e+00 4489 1.2500000000000000e-01 4490 0.0000000000000000e+00 4491 -1.2500000000000000e-01 4492 0.0000000000000000e+00 4493 0.0000000000000000e+00 4494 0.0000000000000000e+00 4495 -1.2500000000000000e-01 4496 -1.2500000000000000e-01 4497 -1.2500000000000000e-01 4498 0.0000000000000000e+00 4499 0.0000000000000000e+00 4500 1.2500000000000000e-01 4501 1.2500000000000000e-01 4502 1.2500000000000000e-01 4503 0.0000000000000000e+00 4504 1.2500000000000000e-01 4505 0.0000000000000000e+00 4506 -1.2500000000000000e-01 4507 1.2500000000000000e-01 4508 -1.2500000000000000e-01 4509 0.0000000000000000e+00 4510 1.2500000000000000e-01 4511 0.0000000000000000e+00 4512 0.0000000000000000e+00 4513 0.0000000000000000e+00 4514 0.0000000000000000e+00 4515 0.0000000000000000e+00 4516 0.0000000000000000e+00 4517 0.0000000000000000e+00 4518 1.2500000000000000e-01 4519 1.2500000000000000e-01 4520 1.2500000000000000e-01 4521 0.0000000000000000e+00 4522 -1.2500000000000000e-01 4523 0.0000000000000000e+00 4524 0.0000000000000000e+00 4525 1.2500000000000000e-01 4526 0.0000000000000000e+00 4527 1.2500000000000000e-01 4528 0.0000000000000000e+00 4529 1.2500000000000000e-01 4530 1.2500000000000000e-01 4531 0.0000000000000000e+00 4532 1.2500000000000000e-01 4533 0.0000000000000000e+00 4534 1.2500000000000000e-01 4535 0.0000000000000000e+00 4536 -1.2500000000000000e-01 4537 0.0000000000000000e+00 4538 0.0000000000000000e+00 4539 0.0000000000000000e+00 4540 0.0000000000000000e+00 4541 0.0000000000000000e+00 4542 0.0000000000000000e+00 4543 0.0000000000000000e+00 4544 0.0000000000000000e+00 4545 0.0000000000000000e+00 4546 0.0000000000000000e+00 4547 0.0000000000000000e+00 4548 0.0000000000000000e+00 4549 0.0000000000000000e+00 4550 1.2500000000000000e-01 4551 1.2500000000000000e-01 4552 1.2500000000000000e-01 4553 1.2500000000000000e-01 4554 -1.2500000000000000e-01 4555 -1.2500000000000000e-01 4556 -1.2500000000000000e-01 4557 0.0000000000000000e+00 4558 0.0000000000000000e+00 4559 1.2500000000000000e-01 4560 0.0000000000000000e+00 4561 1.2500000000000000e-01 4562 0.0000000000000000e+00 4563 0.0000000000000000e+00 4564 -1.2500000000000000e-01 4565 -1.2500000000000000e-01 4566 0.0000000000000000e+00 4567 1.2500000000000000e-01 4568 0.0000000000000000e+00 4569 0.0000000000000000e+00 4570 1.2500000000000000e-01 4571 1.2500000000000000e-01 4572 1.2500000000000000e-01 4573 0.0000000000000000e+00 4574 0.0000000000000000e+00 4575 1.2500000000000000e-01 4576 -1.2500000000000000e-01 4577 0.0000000000000000e+00 4578 0.0000000000000000e+00 4579 0.0000000000000000e+00 4580 1.2500000000000000e-01 4581 0.0000000000000000e+00 4582 0.0000000000000000e+00 4583 1.2500000000000000e-01 4584 1.2500000000000000e-01 4585 0.0000000000000000e+00 4586 0.0000000000000000e+00 4587 0.0000000000000000e+00 4588 1.2500000000000000e-01 4589 1.2500000000000000e-01 4590 0.0000000000000000e+00 4591 0.0000000000000000e+00 4592 -1.2500000000000000e-01 4593 -1.2500000000000000e-01 4594 -1.2500000000000000e-01 4595 0.0000000000000000e+00 4596 1.2500000000000000e-01 4597 1.2500000000000000e-01 4598 0.0000000000000000e+00 4599 0.0000000000000000e+00 4600 1.2500000000000000e-01 4601 0.0000000000000000e+00 4602 -1.2500000000000000e-01 4603 1.2500000000000000e-01 4604 -1.2500000000000000e-01 4605 -1.2500000000000000e-01 4606 -1.2500000000000000e-01 4607 -1.2500000000000000e-01 4608 0.0000000000000000e+00 4609 1.2500000000000000e-01 4610 1.2500000000000000e-01 4611 0.0000000000000000e+00 4612 0.0000000000000000e+00 4613 1.2500000000000000e-01 4614 0.0000000000000000e+00 4615 0.0000000000000000e+00 4616 0.0000000000000000e+00 4617 0.0000000000000000e+00 4618 0.0000000000000000e+00 4619 1.2500000000000000e-01 4620 -1.2500000000000000e-01 4621 -1.2500000000000000e-01 4622 0.0000000000000000e+00 4623 0.0000000000000000e+00 4624 1.2500000000000000e-01 4625 1.2500000000000000e-01 4626 0.0000000000000000e+00 4627 1.2500000000000000e-01 4628 -1.2500000000000000e-01 4629 -1.2500000000000000e-01 4630 0.0000000000000000e+00 4631 0.0000000000000000e+00 4632 1.2500000000000000e-01 4633 0.0000000000000000e+00 4634 -1.2500000000000000e-01 4635 0.0000000000000000e+00 4636 0.0000000000000000e+00 4637 -1.2500000000000000e-01 4638 1.2500000000000000e-01 4639 -1.2500000000000000e-01 4640 1.2500000000000000e-01 4641 1.2500000000000000e-01 4642 0.0000000000000000e+00 4643 0.0000000000000000e+00 4644 1.2500000000000000e-01 4645 0.0000000000000000e+00 4646 0.0000000000000000e+00 4647 0.0000000000000000e+00 4648 0.0000000000000000e+00 4649 1.2500000000000000e-01 4650 0.0000000000000000e+00 4651 0.0000000000000000e+00 4652 0.0000000000000000e+00 4653 0.0000000000000000e+00 4654 0.0000000000000000e+00 4655 0.0000000000000000e+00 4656 0.0000000000000000e+00 4657 -1.2500000000000000e-01 4658 0.0000000000000000e+00 4659 0.0000000000000000e+00 4660 0.0000000000000000e+00 4661 0.0000000000000000e+00 4662 -1.2500000000000000e-01 4663 1.2500000000000000e-01 4664 1.2500000000000000e-01 4665 -1.2500000000000000e-01 4666 -1.2500000000000000e-01 4667 0.0000000000000000e+00 4668 -1.2500000000000000e-01 4669 0.0000000000000000e+00 4670 0.0000000000000000e+00 4671 1.2500000000000000e-01 4672 1.2500000000000000e-01 4673 1.2500000000000000e-01 4674 0.0000000000000000e+00 4675 0.0000000000000000e+00 4676 -1.2500000000000000e-01 4677 0.0000000000000000e+00 4678 1.2500000000000000e-01 4679 0.0000000000000000e+00 4680 0.0000000000000000e+00 4681 0.0000000000000000e+00 4682 1.2500000000000000e-01 4683 -1.2500000000000000e-01 4684 1.2500000000000000e-01 4685 1.2500000000000000e-01 4686 0.0000000000000000e+00 4687 1.2500000000000000e-01 4688 1.2500000000000000e-01 4689 -1.2500000000000000e-01 4690 -1.2500000000000000e-01 4691 0.0000000000000000e+00 4692 0.0000000000000000e+00 4693 -1.2500000000000000e-01 4694 0.0000000000000000e+00 4695 0.0000000000000000e+00 4696 0.0000000000000000e+00 4697 0.0000000000000000e+00 4698 0.0000000000000000e+00 4699 0.0000000000000000e+00 4700 0.0000000000000000e+00 4701 -1.2500000000000000e-01 4702 -1.2500000000000000e-01 4703 -1.2500000000000000e-01 4704 1.2500000000000000e-01 4705 0.0000000000000000e+00 4706 -1.2500000000000000e-01 4707 -1.2500000000000000e-01 4708 0.0000000000000000e+00 4709 0.0000000000000000e+00 4710 0.0000000000000000e+00 4711 -1.2500000000000000e-01 4712 1.2500000000000000e-01 4713 -1.2500000000000000e-01 4714 0.0000000000000000e+00 4715 0.0000000000000000e+00 4716 1.2500000000000000e-01 4717 0.0000000000000000e+00 4718 0.0000000000000000e+00 4719 0.0000000000000000e+00 4720 1.2500000000000000e-01 4721 0.0000000000000000e+00 4722 -1.2500000000000000e-01 4723 0.0000000000000000e+00 4724 0.0000000000000000e+00 4725 0.0000000000000000e+00 4726 0.0000000000000000e+00 4727 0.0000000000000000e+00 4728 0.0000000000000000e+00 4729 0.0000000000000000e+00 4730 0.0000000000000000e+00 4731 0.0000000000000000e+00 4732 0.0000000000000000e+00 4733 0.0000000000000000e+00 4734 1.2500000000000000e-01 4735 1.2500000000000000e-01 4736 0.0000000000000000e+00 4737 1.2500000000000000e-01 4738 -1.2500000000000000e-01 4739 -1.2500000000000000e-01 4740 0.0000000000000000e+00 4741 1.2500000000000000e-01 4742 0.0000000000000000e+00 4743 0.0000000000000000e+00 4744 0.0000000000000000e+00 4745 1.2500000000000000e-01 4746 -1.2500000000000000e-01 4747 0.0000000000000000e+00 4748 -1.2500000000000000e-01 4749 0.0000000000000000e+00 4750 0.0000000000000000e+00 4751 1.2500000000000000e-01 4752 -1.2500000000000000e-01 4753 0.0000000000000000e+00 4754 0.0000000000000000e+00 4755 0.0000000000000000e+00 4756 0.0000000000000000e+00 4757 0.0000000000000000e+00 4758 -1.2500000000000000e-01 4759 0.0000000000000000e+00 4760 0.0000000000000000e+00 4761 0.0000000000000000e+00 4762 0.0000000000000000e+00 4763 0.0000000000000000e+00 4764 -1.2500000000000000e-01 4765 -1.2500000000000000e-01 4766 0.0000000000000000e+00 4767 1.2500000000000000e-01 4768 1.2500000000000000e-01 4769 -1.2500000000000000e-01 4770 0.0000000000000000e+00 4771 1.2500000000000000e-01 4772 0.0000000000000000e+00 4773 0.0000000000000000e+00 4774 -1.2500000000000000e-01 4775 0.0000000000000000e+00 4776 0.0000000000000000e+00 4777 0.0000000000000000e+00 4778 0.0000000000000000e+00 4779 0.0000000000000000e+00 4780 0.0000000000000000e+00 4781 0.0000000000000000e+00 4782 -1.2500000000000000e-01 4783 -1.2500000000000000e-01 4784 1.2500000000000000e-01 4785 1.2500000000000000e-01 4786 0.0000000000000000e+00 4787 0.0000000000000000e+00 4788 -1.2500000000000000e-01 4789 0.0000000000000000e+00 4790 0.0000000000000000e+00 4791 0.0000000000000000e+00 4792 -1.2500000000000000e-01 4793 -1.2500000000000000e-01 4794 -1.2500000000000000e-01 4795 0.0000000000000000e+00 4796 0.0000000000000000e+00 4797 0.0000000000000000e+00 4798 0.0000000000000000e+00 4799 0.0000000000000000e+00 4800 0.0000000000000000e+00 4801 0.0000000000000000e+00 4802 0.0000000000000000e+00 4803 0.0000000000000000e+00 4804 1.2500000000000000e-01 4805 0.0000000000000000e+00 4806 0.0000000000000000e+00 4807 1.2500000000000000e-01 4808 1.2500000000000000e-01 4809 -1.2500000000000000e-01 4810 -1.2500000000000000e-01 4811 0.0000000000000000e+00 4812 1.2500000000000000e-01 4813 1.2500000000000000e-01 4814 -1.2500000000000000e-01 4815 -1.2500000000000000e-01 4816 0.0000000000000000e+00 4817 1.2500000000000000e-01 4818 0.0000000000000000e+00 4819 0.0000000000000000e+00 4820 1.2500000000000000e-01 4821 0.0000000000000000e+00 4822 0.0000000000000000e+00 4823 -1.2500000000000000e-01 4824 0.0000000000000000e+00 4825 0.0000000000000000e+00 4826 0.0000000000000000e+00 4827 -1.2500000000000000e-01 4828 -1.2500000000000000e-01 4829 0.0000000000000000e+00 4830 -1.2500000000000000e-01 4831 0.0000000000000000e+00 4832 -1.2500000000000000e-01 4833 1.2500000000000000e-01 4834 -1.2500000000000000e-01 4835 0.0000000000000000e+00 4836 1.2500000000000000e-01 4837 0.0000000000000000e+00 4838 -1.2500000000000000e-01 4839 -1.2500000000000000e-01 4840 0.0000000000000000e+00 4841 -1.2500000000000000e-01 4842 0.0000000000000000e+00 4843 -1.2500000000000000e-01 4844 0.0000000000000000e+00 4845 -1.2500000000000000e-01 4846 0.0000000000000000e+00 4847 0.0000000000000000e+00 4848 0.0000000000000000e+00 4849 -1.2500000000000000e-01 4850 -1.2500000000000000e-01 4851 0.0000000000000000e+00 4852 0.0000000000000000e+00 4853 -1.2500000000000000e-01 4854 0.0000000000000000e+00 4855 0.0000000000000000e+00 4856 -1.2500000000000000e-01 4857 0.0000000000000000e+00 4858 0.0000000000000000e+00 4859 -1.2500000000000000e-01 4860 -1.2500000000000000e-01 4861 -1.2500000000000000e-01 4862 0.0000000000000000e+00 4863 -1.2500000000000000e-01 4864 0.0000000000000000e+00 4865 -1.2500000000000000e-01 4866 1.2500000000000000e-01 4867 -1.2500000000000000e-01 4868 0.0000000000000000e+00 4869 -1.2500000000000000e-01 4870 -1.2500000000000000e-01 4871 0.0000000000000000e+00 4872 -1.2500000000000000e-01 4873 -1.2500000000000000e-01 4874 0.0000000000000000e+00 4875 -1.2500000000000000e-01 4876 0.0000000000000000e+00 4877 -1.2500000000000000e-01 4878 -1.2500000000000000e-01 4879 -1.2500000000000000e-01 4880 1.2500000000000000e-01 4881 -1.2500000000000000e-01 4882 -1.2500000000000000e-01 4883 0.0000000000000000e+00 4884 0.0000000000000000e+00 4885 0.0000000000000000e+00 4886 0.0000000000000000e+00 4887 0.0000000000000000e+00 4888 -1.2500000000000000e-01 4889 0.0000000000000000e+00 4890 1.2500000000000000e-01 4891 1.2500000000000000e-01 4892 0.0000000000000000e+00 4893 0.0000000000000000e+00 4894 1.2500000000000000e-01 4895 0.0000000000000000e+00 4896 0.0000000000000000e+00 4897 0.0000000000000000e+00 4898 0.0000000000000000e+00 4899 -1.2500000000000000e-01 4900 -1.2500000000000000e-01 4901 0.0000000000000000e+00 4902 0.0000000000000000e+00 4903 0.0000000000000000e+00 4904 0.0000000000000000e+00 4905 -1.2500000000000000e-01 4906 0.0000000000000000e+00 4907 0.0000000000000000e+00 4908 1.2500000000000000e-01 4909 1.2500000000000000e-01 4910 -1.2500000000000000e-01 4911 0.0000000000000000e+00 4912 1.2500000000000000e-01 4913 0.0000000000000000e+00 4914 0.0000000000000000e+00 4915 0.0000000000000000e+00 4916 0.0000000000000000e+00 4917 -1.2500000000000000e-01 4918 0.0000000000000000e+00 4919 0.0000000000000000e+00 4920 -1.2500000000000000e-01 4921 0.0000000000000000e+00 4922 0.0000000000000000e+00 4923 0.0000000000000000e+00 4924 0.0000000000000000e+00 4925 0.0000000000000000e+00 4926 0.0000000000000000e+00 4927 -1.2500000000000000e-01 4928 -1.2500000000000000e-01 4929 0.0000000000000000e+00 4930 1.2500000000000000e-01 4931 -1.2500000000000000e-01 4932 1.2500000000000000e-01 4933 0.0000000000000000e+00 4934 0.0000000000000000e+00 4935 0.0000000000000000e+00 4936 0.0000000000000000e+00 4937 0.0000000000000000e+00 4938 0.0000000000000000e+00 4939 0.0000000000000000e+00 4940 0.0000000000000000e+00 4941 0.0000000000000000e+00 4942 0.0000000000000000e+00 4943 0.0000000000000000e+00 4944 0.0000000000000000e+00 4945 0.0000000000000000e+00 4946 0.0000000000000000e+00 4947 -1.2500000000000000e-01 4948 0.0000000000000000e+00 4949 1.2500000000000000e-01 4950 -1.2500000000000000e-01 4951 -1.2500000000000000e-01 4952 0.0000000000000000e+00 4953 1.2500000000000000e-01 4954 -1.2500000000000000e-01 4955 1.2500000000000000e-01 4956 0.0000000000000000e+00 4957 1.2500000000000000e-01 4958 -1.2500000000000000e-01 4959 0.0000000000000000e+00 4960 0.0000000000000000e+00 4961 0.0000000000000000e+00 4962 1.2500000000000000e-01 4963 0.0000000000000000e+00 4964 0.0000000000000000e+00 4965 0.0000000000000000e+00 4966 1.2500000000000000e-01 4967 0.0000000000000000e+00 4968 1.2500000000000000e-01 4969 0.0000000000000000e+00 4970 0.0000000000000000e+00 4971 0.0000000000000000e+00 4972 1.2500000000000000e-01 4973 0.0000000000000000e+00 4974 1.2500000000000000e-01 4975 -1.2500000000000000e-01 4976 0.0000000000000000e+00 4977 0.0000000000000000e+00 4978 0.0000000000000000e+00 4979 0.0000000000000000e+00 4980 1.2500000000000000e-01 4981 0.0000000000000000e+00 4982 1.2500000000000000e-01 4983 -1.2500000000000000e-01 4984 -1.2500000000000000e-01 4985 0.0000000000000000e+00 4986 0.0000000000000000e+00 4987 0.0000000000000000e+00 4988 1.2500000000000000e-01 4989 -1.2500000000000000e-01 4990 -1.2500000000000000e-01 4991 -1.2500000000000000e-01 4992 1.2500000000000000e-01 4993 0.0000000000000000e+00 4994 -1.2500000000000000e-01 4995 -1.2500000000000000e-01 4996 0.0000000000000000e+00 4997 0.0000000000000000e+00 4998 0.0000000000000000e+00 4999 0.0000000000000000e+00 5000 0.0000000000000000e+00 5001 1.2500000000000000e-01 5002 0.0000000000000000e+00 5003 1.2500000000000000e-01 5004 1.2500000000000000e-01 5005 0.0000000000000000e+00 5006 1.2500000000000000e-01 5007 0.0000000000000000e+00 5008 0.0000000000000000e+00 5009 0.0000000000000000e+00 5010 -1.2500000000000000e-01 5011 -1.2500000000000000e-01 5012 0.0000000000000000e+00 5013 0.0000000000000000e+00 5014 -1.2500000000000000e-01 5015 0.0000000000000000e+00 5016 1.2500000000000000e-01 5017 0.0000000000000000e+00 5018 0.0000000000000000e+00 5019 0.0000000000000000e+00 5020 0.0000000000000000e+00 5021 -1.2500000000000000e-01 5022 0.0000000000000000e+00 5023 0.0000000000000000e+00 5024 0.0000000000000000e+00 5025 -1.2500000000000000e-01 5026 0.0000000000000000e+00 5027 1.2500000000000000e-01 5028 1.2500000000000000e-01 5029 1.2500000000000000e-01 5030 0.0000000000000000e+00 5031 0.0000000000000000e+00 5032 0.0000000000000000e+00 5033 1.2500000000000000e-01 5034 0.0000000000000000e+00 5035 0.0000000000000000e+00 5036 0.0000000000000000e+00 5037 -1.2500000000000000e-01 5038 0.0000000000000000e+00 5039 0.0000000000000000e+00 5040 1.2500000000000000e-01 5041 1.2500000000000000e-01 5042 -1.2500000000000000e-01 5043 0.0000000000000000e+00 5044 -1.2500000000000000e-01 5045 -1.2500000000000000e-01 5046 1.2500000000000000e-01 5047 0.0000000000000000e+00 5048 0.0000000000000000e+00 5049 -1.2500000000000000e-01 5050 0.0000000000000000e+00 5051 0.0000000000000000e+00 5052 1.2500000000000000e-01 5053 -1.2500000000000000e-01 5054 0.0000000000000000e+00 5055 1.2500000000000000e-01 5056 0.0000000000000000e+00 5057 -1.2500000000000000e-01 5058 0.0000000000000000e+00 5059 0.0000000000000000e+00 5060 1.2500000000000000e-01 5061 0.0000000000000000e+00 5062 1.2500000000000000e-01 5063 0.0000000000000000e+00 5064 1.2500000000000000e-01 5065 0.0000000000000000e+00 5066 1.2500000000000000e-01 5067 0.0000000000000000e+00 5068 0.0000000000000000e+00 5069 1.2500000000000000e-01 5070 0.0000000000000000e+00 5071 0.0000000000000000e+00 5072 1.2500000000000000e-01 5073 0.0000000000000000e+00 5074 1.2500000000000000e-01 5075 -1.2500000000000000e-01 5076 -1.2500000000000000e-01 5077 -1.2500000000000000e-01 5078 0.0000000000000000e+00 5079 0.0000000000000000e+00 5080 0.0000000000000000e+00 hypre-2.33.0/src/test/TEST_ams/mfem.Gz.00000000066400000000000000000000713501477326011500200130ustar00rootroot000000000000001 1075 1 -1.2500000000000000e-01 2 0.0000000000000000e+00 3 -1.2500000000000000e-01 4 -1.2500000000000000e-01 5 0.0000000000000000e+00 6 -1.2500000000000000e-01 7 0.0000000000000000e+00 8 -6.2500000000000000e-02 9 1.2500000000000000e-01 10 1.2500000000000000e-01 11 6.2500000000000000e-02 12 1.2500000000000000e-01 13 0.0000000000000000e+00 14 6.2500000000000000e-02 15 -1.2500000000000000e-01 16 -1.2500000000000000e-01 17 -6.2500000000000000e-02 18 0.0000000000000000e+00 19 0.0000000000000000e+00 20 1.2500000000000000e-01 21 0.0000000000000000e+00 22 -1.2500000000000000e-01 23 -1.2500000000000000e-01 24 -1.2500000000000000e-01 25 -6.2500000000000000e-02 26 0.0000000000000000e+00 27 -6.2500000000000000e-02 28 -1.2500000000000000e-01 29 0.0000000000000000e+00 30 0.0000000000000000e+00 31 0.0000000000000000e+00 32 1.2500000000000000e-01 33 1.2500000000000000e-01 34 1.2500000000000000e-01 35 -1.2500000000000000e-01 36 0.0000000000000000e+00 37 1.2500000000000000e-01 38 0.0000000000000000e+00 39 0.0000000000000000e+00 40 -6.2500000000000000e-02 41 6.2500000000000000e-02 42 1.2500000000000000e-01 43 0.0000000000000000e+00 44 -1.2500000000000000e-01 45 -1.2500000000000000e-01 46 -1.2500000000000000e-01 47 -6.2500000000000000e-02 48 0.0000000000000000e+00 49 -1.2500000000000000e-01 50 0.0000000000000000e+00 51 1.2500000000000000e-01 52 1.2500000000000000e-01 53 0.0000000000000000e+00 54 6.2500000000000000e-02 55 0.0000000000000000e+00 56 0.0000000000000000e+00 57 0.0000000000000000e+00 58 0.0000000000000000e+00 59 6.2500000000000000e-02 60 1.2500000000000000e-01 61 1.2500000000000000e-01 62 1.2500000000000000e-01 63 1.2500000000000000e-01 64 1.2500000000000000e-01 65 6.2500000000000000e-02 66 0.0000000000000000e+00 67 6.2500000000000000e-02 68 1.2500000000000000e-01 69 0.0000000000000000e+00 70 1.2500000000000000e-01 71 0.0000000000000000e+00 72 0.0000000000000000e+00 73 0.0000000000000000e+00 74 0.0000000000000000e+00 75 0.0000000000000000e+00 76 6.2500000000000000e-02 77 -6.2500000000000000e-02 78 -1.2500000000000000e-01 79 -6.2500000000000000e-02 80 -1.2500000000000000e-01 81 -1.2500000000000000e-01 82 -6.2500000000000000e-02 83 -6.2500000000000000e-02 84 -1.2500000000000000e-01 85 1.2500000000000000e-01 86 1.2500000000000000e-01 87 6.2500000000000000e-02 88 1.2500000000000000e-01 89 6.2500000000000000e-02 90 0.0000000000000000e+00 91 0.0000000000000000e+00 92 1.2500000000000000e-01 93 0.0000000000000000e+00 94 6.2500000000000000e-02 95 1.2500000000000000e-01 96 0.0000000000000000e+00 97 0.0000000000000000e+00 98 0.0000000000000000e+00 99 -1.2500000000000000e-01 100 0.0000000000000000e+00 101 0.0000000000000000e+00 102 -6.2500000000000000e-02 103 -1.2500000000000000e-01 104 -1.2500000000000000e-01 105 -6.2500000000000000e-02 106 -1.2500000000000000e-01 107 -1.2500000000000000e-01 108 1.2500000000000000e-01 109 0.0000000000000000e+00 110 0.0000000000000000e+00 111 0.0000000000000000e+00 112 0.0000000000000000e+00 113 -6.2500000000000000e-02 114 1.2500000000000000e-01 115 1.2500000000000000e-01 116 1.2500000000000000e-01 117 -1.2500000000000000e-01 118 -1.2500000000000000e-01 119 1.2500000000000000e-01 120 1.2500000000000000e-01 121 6.2500000000000000e-02 122 6.2500000000000000e-02 123 1.2500000000000000e-01 124 6.2500000000000000e-02 125 0.0000000000000000e+00 126 0.0000000000000000e+00 127 -6.2500000000000000e-02 128 6.2500000000000000e-02 129 1.2500000000000000e-01 130 -1.2500000000000000e-01 131 0.0000000000000000e+00 132 -6.2500000000000000e-02 133 -6.2500000000000000e-02 134 0.0000000000000000e+00 135 -1.2500000000000000e-01 136 -1.2500000000000000e-01 137 -6.2500000000000000e-02 138 0.0000000000000000e+00 139 0.0000000000000000e+00 140 0.0000000000000000e+00 141 0.0000000000000000e+00 142 1.2500000000000000e-01 143 -1.2500000000000000e-01 144 -1.2500000000000000e-01 145 1.2500000000000000e-01 146 0.0000000000000000e+00 147 6.2500000000000000e-02 148 6.2500000000000000e-02 149 0.0000000000000000e+00 150 0.0000000000000000e+00 151 1.2500000000000000e-01 152 0.0000000000000000e+00 153 6.2500000000000000e-02 154 -1.2500000000000000e-01 155 -1.2500000000000000e-01 156 -6.2500000000000000e-02 157 -1.2500000000000000e-01 158 0.0000000000000000e+00 159 -6.2500000000000000e-02 160 1.2500000000000000e-01 161 1.2500000000000000e-01 162 6.2500000000000000e-02 163 6.2500000000000000e-02 164 6.2500000000000000e-02 165 -6.2500000000000000e-02 166 -6.2500000000000000e-02 167 0.0000000000000000e+00 168 0.0000000000000000e+00 169 -1.2500000000000000e-01 170 0.0000000000000000e+00 171 1.2500000000000000e-01 172 1.2500000000000000e-01 173 0.0000000000000000e+00 174 0.0000000000000000e+00 175 -1.2500000000000000e-01 176 0.0000000000000000e+00 177 1.2500000000000000e-01 178 0.0000000000000000e+00 179 6.2500000000000000e-02 180 1.2500000000000000e-01 181 1.2500000000000000e-01 182 6.2500000000000000e-02 183 0.0000000000000000e+00 184 6.2500000000000000e-02 185 6.2500000000000000e-02 186 1.2500000000000000e-01 187 0.0000000000000000e+00 188 0.0000000000000000e+00 189 0.0000000000000000e+00 190 0.0000000000000000e+00 191 0.0000000000000000e+00 192 1.2500000000000000e-01 193 0.0000000000000000e+00 194 0.0000000000000000e+00 195 0.0000000000000000e+00 196 6.2500000000000000e-02 197 -6.2500000000000000e-02 198 -1.2500000000000000e-01 199 -6.2500000000000000e-02 200 0.0000000000000000e+00 201 1.2500000000000000e-01 202 6.2500000000000000e-02 203 1.2500000000000000e-01 204 1.2500000000000000e-01 205 6.2500000000000000e-02 206 0.0000000000000000e+00 207 -1.2500000000000000e-01 208 -1.2500000000000000e-01 209 -6.2500000000000000e-02 210 -6.2500000000000000e-02 211 -1.2500000000000000e-01 212 0.0000000000000000e+00 213 0.0000000000000000e+00 214 -1.2500000000000000e-01 215 1.2500000000000000e-01 216 0.0000000000000000e+00 217 6.2500000000000000e-02 218 1.2500000000000000e-01 219 0.0000000000000000e+00 220 -1.2500000000000000e-01 221 0.0000000000000000e+00 222 -6.2500000000000000e-02 223 -1.2500000000000000e-01 224 -6.2500000000000000e-02 225 -1.2500000000000000e-01 226 -6.2500000000000000e-02 227 -6.2500000000000000e-02 228 1.2500000000000000e-01 229 -1.2500000000000000e-01 230 0.0000000000000000e+00 231 0.0000000000000000e+00 232 -1.2500000000000000e-01 233 0.0000000000000000e+00 234 1.2500000000000000e-01 235 0.0000000000000000e+00 236 6.2500000000000000e-02 237 1.2500000000000000e-01 238 1.2500000000000000e-01 239 0.0000000000000000e+00 240 0.0000000000000000e+00 241 -1.2500000000000000e-01 242 0.0000000000000000e+00 243 -6.2500000000000000e-02 244 1.2500000000000000e-01 245 0.0000000000000000e+00 246 6.2500000000000000e-02 247 1.2500000000000000e-01 248 0.0000000000000000e+00 249 0.0000000000000000e+00 250 0.0000000000000000e+00 251 0.0000000000000000e+00 252 6.2500000000000000e-02 253 -6.2500000000000000e-02 254 -1.2500000000000000e-01 255 -6.2500000000000000e-02 256 1.2500000000000000e-01 257 0.0000000000000000e+00 258 6.2500000000000000e-02 259 6.2500000000000000e-02 260 0.0000000000000000e+00 261 1.2500000000000000e-01 262 1.2500000000000000e-01 263 6.2500000000000000e-02 264 0.0000000000000000e+00 265 0.0000000000000000e+00 266 -6.2500000000000000e-02 267 -1.2500000000000000e-01 268 1.2500000000000000e-01 269 1.2500000000000000e-01 270 0.0000000000000000e+00 271 -1.2500000000000000e-01 272 -1.2500000000000000e-01 273 -6.2500000000000000e-02 274 0.0000000000000000e+00 275 -1.2500000000000000e-01 276 0.0000000000000000e+00 277 0.0000000000000000e+00 278 6.2500000000000000e-02 279 0.0000000000000000e+00 280 6.2500000000000000e-02 281 0.0000000000000000e+00 282 0.0000000000000000e+00 283 6.2500000000000000e-02 284 1.2500000000000000e-01 285 1.2500000000000000e-01 286 -6.2500000000000000e-02 287 -1.2500000000000000e-01 288 -1.2500000000000000e-01 289 -1.2500000000000000e-01 290 1.2500000000000000e-01 291 -6.2500000000000000e-02 292 -1.2500000000000000e-01 293 -1.2500000000000000e-01 294 1.2500000000000000e-01 295 1.2500000000000000e-01 296 6.2500000000000000e-02 297 0.0000000000000000e+00 298 1.2500000000000000e-01 299 6.2500000000000000e-02 300 1.2500000000000000e-01 301 -1.2500000000000000e-01 302 0.0000000000000000e+00 303 -6.2500000000000000e-02 304 -6.2500000000000000e-02 305 0.0000000000000000e+00 306 -1.2500000000000000e-01 307 -1.2500000000000000e-01 308 0.0000000000000000e+00 309 0.0000000000000000e+00 310 0.0000000000000000e+00 311 -6.2500000000000000e-02 312 -1.2500000000000000e-01 313 -1.2500000000000000e-01 314 0.0000000000000000e+00 315 0.0000000000000000e+00 316 -6.2500000000000000e-02 317 0.0000000000000000e+00 318 -6.2500000000000000e-02 319 6.2500000000000000e-02 320 -1.2500000000000000e-01 321 1.2500000000000000e-01 322 1.2500000000000000e-01 323 1.2500000000000000e-01 324 0.0000000000000000e+00 325 6.2500000000000000e-02 326 6.2500000000000000e-02 327 0.0000000000000000e+00 328 -6.2500000000000000e-02 329 0.0000000000000000e+00 330 0.0000000000000000e+00 331 6.2500000000000000e-02 332 -6.2500000000000000e-02 333 -1.2500000000000000e-01 334 -1.2500000000000000e-01 335 -1.2500000000000000e-01 336 -6.2500000000000000e-02 337 -6.2500000000000000e-02 338 -1.2500000000000000e-01 339 0.0000000000000000e+00 340 0.0000000000000000e+00 341 6.2500000000000000e-02 342 0.0000000000000000e+00 343 -1.2500000000000000e-01 344 1.2500000000000000e-01 345 1.2500000000000000e-01 346 1.2500000000000000e-01 347 1.2500000000000000e-01 348 0.0000000000000000e+00 349 0.0000000000000000e+00 350 0.0000000000000000e+00 351 -6.2500000000000000e-02 352 0.0000000000000000e+00 353 6.2500000000000000e-02 354 0.0000000000000000e+00 355 -6.2500000000000000e-02 356 0.0000000000000000e+00 357 6.2500000000000000e-02 358 1.2500000000000000e-01 359 1.2500000000000000e-01 360 -1.2500000000000000e-01 361 -1.2500000000000000e-01 362 1.2500000000000000e-01 363 -1.2500000000000000e-01 364 -1.2500000000000000e-01 365 1.2500000000000000e-01 366 -1.2500000000000000e-01 367 0.0000000000000000e+00 368 -6.2500000000000000e-02 369 -6.2500000000000000e-02 370 0.0000000000000000e+00 371 6.2500000000000000e-02 372 1.2500000000000000e-01 373 1.2500000000000000e-01 374 6.2500000000000000e-02 375 6.2500000000000000e-02 376 1.2500000000000000e-01 377 0.0000000000000000e+00 378 0.0000000000000000e+00 379 -6.2500000000000000e-02 380 0.0000000000000000e+00 381 1.2500000000000000e-01 382 6.2500000000000000e-02 383 1.2500000000000000e-01 384 -1.2500000000000000e-01 385 0.0000000000000000e+00 386 -1.2500000000000000e-01 387 0.0000000000000000e+00 388 0.0000000000000000e+00 389 -6.2500000000000000e-02 390 -1.2500000000000000e-01 391 -1.2500000000000000e-01 392 0.0000000000000000e+00 393 0.0000000000000000e+00 394 6.2500000000000000e-02 395 0.0000000000000000e+00 396 6.2500000000000000e-02 397 1.2500000000000000e-01 398 6.2500000000000000e-02 399 0.0000000000000000e+00 400 0.0000000000000000e+00 401 1.2500000000000000e-01 402 -1.2500000000000000e-01 403 -1.2500000000000000e-01 404 -6.2500000000000000e-02 405 -6.2500000000000000e-02 406 -1.2500000000000000e-01 407 -6.2500000000000000e-02 408 1.2500000000000000e-01 409 0.0000000000000000e+00 410 6.2500000000000000e-02 411 6.2500000000000000e-02 412 0.0000000000000000e+00 413 0.0000000000000000e+00 414 0.0000000000000000e+00 415 6.2500000000000000e-02 416 -1.2500000000000000e-01 417 -6.2500000000000000e-02 418 -1.2500000000000000e-01 419 1.2500000000000000e-01 420 0.0000000000000000e+00 421 0.0000000000000000e+00 422 0.0000000000000000e+00 423 0.0000000000000000e+00 424 6.2500000000000000e-02 425 1.2500000000000000e-01 426 1.2500000000000000e-01 427 1.2500000000000000e-01 428 -6.2500000000000000e-02 429 1.2500000000000000e-01 430 6.2500000000000000e-02 431 1.2500000000000000e-01 432 0.0000000000000000e+00 433 6.2500000000000000e-02 434 0.0000000000000000e+00 435 -1.2500000000000000e-01 436 -6.2500000000000000e-02 437 1.2500000000000000e-01 438 0.0000000000000000e+00 439 6.2500000000000000e-02 440 0.0000000000000000e+00 441 -1.2500000000000000e-01 442 -1.2500000000000000e-01 443 -1.2500000000000000e-01 444 0.0000000000000000e+00 445 0.0000000000000000e+00 446 6.2500000000000000e-02 447 1.2500000000000000e-01 448 0.0000000000000000e+00 449 -6.2500000000000000e-02 450 -1.2500000000000000e-01 451 -6.2500000000000000e-02 452 1.2500000000000000e-01 453 0.0000000000000000e+00 454 -1.2500000000000000e-01 455 -6.2500000000000000e-02 456 0.0000000000000000e+00 457 0.0000000000000000e+00 458 0.0000000000000000e+00 459 6.2500000000000000e-02 460 0.0000000000000000e+00 461 -6.2500000000000000e-02 462 -1.2500000000000000e-01 463 -1.2500000000000000e-01 464 1.2500000000000000e-01 465 1.2500000000000000e-01 466 1.2500000000000000e-01 467 -1.2500000000000000e-01 468 -1.2500000000000000e-01 469 -6.2500000000000000e-02 470 1.2500000000000000e-01 471 6.2500000000000000e-02 472 0.0000000000000000e+00 473 0.0000000000000000e+00 474 -6.2500000000000000e-02 475 0.0000000000000000e+00 476 -1.2500000000000000e-01 477 1.2500000000000000e-01 478 6.2500000000000000e-02 479 1.2500000000000000e-01 480 0.0000000000000000e+00 481 -1.2500000000000000e-01 482 0.0000000000000000e+00 483 -6.2500000000000000e-02 484 -1.2500000000000000e-01 485 -1.2500000000000000e-01 486 0.0000000000000000e+00 487 6.2500000000000000e-02 488 0.0000000000000000e+00 489 -6.2500000000000000e-02 490 0.0000000000000000e+00 491 1.2500000000000000e-01 492 -6.2500000000000000e-02 493 -1.2500000000000000e-01 494 1.2500000000000000e-01 495 6.2500000000000000e-02 496 -1.2500000000000000e-01 497 -6.2500000000000000e-02 498 0.0000000000000000e+00 499 6.2500000000000000e-02 500 0.0000000000000000e+00 501 -6.2500000000000000e-02 502 0.0000000000000000e+00 503 6.2500000000000000e-02 504 0.0000000000000000e+00 505 -6.2500000000000000e-02 506 6.2500000000000000e-02 507 -6.2500000000000000e-02 508 -6.2500000000000000e-02 509 6.2500000000000000e-02 510 -6.2500000000000000e-02 511 -6.2500000000000000e-02 512 -6.2500000000000000e-02 513 6.2500000000000000e-02 514 6.2500000000000000e-02 515 6.2500000000000000e-02 516 -6.2500000000000000e-02 517 0.0000000000000000e+00 518 1.2500000000000000e-01 519 1.2500000000000000e-01 520 -6.2500000000000000e-02 521 -6.2500000000000000e-02 522 -1.2500000000000000e-01 523 -6.2500000000000000e-02 524 1.2500000000000000e-01 525 6.2500000000000000e-02 526 0.0000000000000000e+00 527 -6.2500000000000000e-02 528 0.0000000000000000e+00 529 6.2500000000000000e-02 530 0.0000000000000000e+00 531 -6.2500000000000000e-02 532 0.0000000000000000e+00 533 6.2500000000000000e-02 534 -6.2500000000000000e-02 535 6.2500000000000000e-02 536 6.2500000000000000e-02 537 6.2500000000000000e-02 538 6.2500000000000000e-02 539 -6.2500000000000000e-02 540 6.2500000000000000e-02 541 -6.2500000000000000e-02 542 -6.2500000000000000e-02 543 -6.2500000000000000e-02 544 6.2500000000000000e-02 545 0.0000000000000000e+00 546 -6.2500000000000000e-02 547 -6.2500000000000000e-02 548 6.2500000000000000e-02 549 6.2500000000000000e-02 550 0.0000000000000000e+00 551 -6.2500000000000000e-02 552 1.2500000000000000e-01 553 0.0000000000000000e+00 554 1.2500000000000000e-01 555 0.0000000000000000e+00 556 0.0000000000000000e+00 557 -6.2500000000000000e-02 558 -6.2500000000000000e-02 559 -6.2500000000000000e-02 560 1.2500000000000000e-01 561 -1.2500000000000000e-01 562 0.0000000000000000e+00 563 -6.2500000000000000e-02 564 -6.2500000000000000e-02 565 -6.2500000000000000e-02 566 6.2500000000000000e-02 567 -6.2500000000000000e-02 568 -6.2500000000000000e-02 569 -6.2500000000000000e-02 570 -6.2500000000000000e-02 571 6.2500000000000000e-02 572 -6.2500000000000000e-02 573 -6.2500000000000000e-02 574 1.2500000000000000e-01 575 1.2500000000000000e-01 576 -1.2500000000000000e-01 577 -6.2500000000000000e-02 578 6.2500000000000000e-02 579 -6.2500000000000000e-02 580 -6.2500000000000000e-02 581 -1.2500000000000000e-01 582 -6.2500000000000000e-02 583 0.0000000000000000e+00 584 -6.2500000000000000e-02 585 1.2500000000000000e-01 586 6.2500000000000000e-02 587 0.0000000000000000e+00 588 6.2500000000000000e-02 589 -6.2500000000000000e-02 590 6.2500000000000000e-02 591 6.2500000000000000e-02 592 -6.2500000000000000e-02 593 0.0000000000000000e+00 594 -6.2500000000000000e-02 595 0.0000000000000000e+00 596 6.2500000000000000e-02 597 0.0000000000000000e+00 598 -6.2500000000000000e-02 599 6.2500000000000000e-02 600 -6.2500000000000000e-02 601 6.2500000000000000e-02 602 -6.2500000000000000e-02 603 6.2500000000000000e-02 604 6.2500000000000000e-02 605 -6.2500000000000000e-02 606 6.2500000000000000e-02 607 6.2500000000000000e-02 608 6.2500000000000000e-02 609 -6.2500000000000000e-02 610 -6.2500000000000000e-02 611 -6.2500000000000000e-02 612 6.2500000000000000e-02 613 0.0000000000000000e+00 614 6.2500000000000000e-02 615 6.2500000000000000e-02 616 0.0000000000000000e+00 617 -6.2500000000000000e-02 618 -6.2500000000000000e-02 619 6.2500000000000000e-02 620 6.2500000000000000e-02 621 1.2500000000000000e-01 622 0.0000000000000000e+00 623 6.2500000000000000e-02 624 -1.2500000000000000e-01 625 -6.2500000000000000e-02 626 0.0000000000000000e+00 627 -6.2500000000000000e-02 628 6.2500000000000000e-02 629 -6.2500000000000000e-02 630 -6.2500000000000000e-02 631 6.2500000000000000e-02 632 0.0000000000000000e+00 633 6.2500000000000000e-02 634 0.0000000000000000e+00 635 -6.2500000000000000e-02 636 0.0000000000000000e+00 637 6.2500000000000000e-02 638 -6.2500000000000000e-02 639 6.2500000000000000e-02 640 -6.2500000000000000e-02 641 6.2500000000000000e-02 642 -6.2500000000000000e-02 643 -6.2500000000000000e-02 644 -6.2500000000000000e-02 645 -6.2500000000000000e-02 646 6.2500000000000000e-02 647 -6.2500000000000000e-02 648 6.2500000000000000e-02 649 6.2500000000000000e-02 650 0.0000000000000000e+00 651 -6.2500000000000000e-02 652 -6.2500000000000000e-02 653 -1.2500000000000000e-01 654 -6.2500000000000000e-02 655 1.2500000000000000e-01 656 6.2500000000000000e-02 657 0.0000000000000000e+00 658 -6.2500000000000000e-02 659 0.0000000000000000e+00 660 6.2500000000000000e-02 661 -6.2500000000000000e-02 662 6.2500000000000000e-02 663 6.2500000000000000e-02 664 6.2500000000000000e-02 665 6.2500000000000000e-02 666 -6.2500000000000000e-02 667 6.2500000000000000e-02 668 -6.2500000000000000e-02 669 -6.2500000000000000e-02 670 -6.2500000000000000e-02 671 6.2500000000000000e-02 672 0.0000000000000000e+00 673 6.2500000000000000e-02 674 6.2500000000000000e-02 675 -6.2500000000000000e-02 676 -6.2500000000000000e-02 677 0.0000000000000000e+00 678 0.0000000000000000e+00 679 6.2500000000000000e-02 680 0.0000000000000000e+00 681 6.2500000000000000e-02 682 1.2500000000000000e-01 683 0.0000000000000000e+00 684 6.2500000000000000e-02 685 6.2500000000000000e-02 686 6.2500000000000000e-02 687 -6.2500000000000000e-02 688 6.2500000000000000e-02 689 6.2500000000000000e-02 690 6.2500000000000000e-02 691 6.2500000000000000e-02 692 -6.2500000000000000e-02 693 6.2500000000000000e-02 694 1.2500000000000000e-01 695 6.2500000000000000e-02 696 0.0000000000000000e+00 697 6.2500000000000000e-02 698 -6.2500000000000000e-02 699 -6.2500000000000000e-02 700 -6.2500000000000000e-02 701 -6.2500000000000000e-02 702 6.2500000000000000e-02 703 -6.2500000000000000e-02 704 -6.2500000000000000e-02 705 6.2500000000000000e-02 706 -6.2500000000000000e-02 707 -6.2500000000000000e-02 708 -1.2500000000000000e-01 709 -6.2500000000000000e-02 710 -6.2500000000000000e-02 711 -6.2500000000000000e-02 712 6.2500000000000000e-02 713 0.0000000000000000e+00 714 -6.2500000000000000e-02 715 0.0000000000000000e+00 716 6.2500000000000000e-02 717 1.2500000000000000e-01 718 6.2500000000000000e-02 719 -6.2500000000000000e-02 720 -6.2500000000000000e-02 721 6.2500000000000000e-02 722 6.2500000000000000e-02 723 6.2500000000000000e-02 724 6.2500000000000000e-02 725 -6.2500000000000000e-02 726 6.2500000000000000e-02 727 6.2500000000000000e-02 728 -6.2500000000000000e-02 729 -6.2500000000000000e-02 730 -6.2500000000000000e-02 731 6.2500000000000000e-02 732 6.2500000000000000e-02 733 -6.2500000000000000e-02 734 -6.2500000000000000e-02 735 0.0000000000000000e+00 736 6.2500000000000000e-02 737 0.0000000000000000e+00 738 -6.2500000000000000e-02 739 -1.2500000000000000e-01 740 -6.2500000000000000e-02 741 6.2500000000000000e-02 742 6.2500000000000000e-02 743 -6.2500000000000000e-02 744 -6.2500000000000000e-02 745 6.2500000000000000e-02 746 -6.2500000000000000e-02 747 -6.2500000000000000e-02 748 -6.2500000000000000e-02 749 -6.2500000000000000e-02 750 6.2500000000000000e-02 751 6.2500000000000000e-02 752 6.2500000000000000e-02 753 0.0000000000000000e+00 754 -6.2500000000000000e-02 755 0.0000000000000000e+00 756 6.2500000000000000e-02 757 -6.2500000000000000e-02 758 6.2500000000000000e-02 759 0.0000000000000000e+00 760 6.2500000000000000e-02 761 0.0000000000000000e+00 762 6.2500000000000000e-02 763 0.0000000000000000e+00 764 6.2500000000000000e-02 765 6.2500000000000000e-02 766 6.2500000000000000e-02 767 6.2500000000000000e-02 768 -6.2500000000000000e-02 769 6.2500000000000000e-02 770 6.2500000000000000e-02 771 6.2500000000000000e-02 772 6.2500000000000000e-02 773 6.2500000000000000e-02 774 -6.2500000000000000e-02 775 6.2500000000000000e-02 776 6.2500000000000000e-02 777 1.2500000000000000e-01 778 6.2500000000000000e-02 779 6.2500000000000000e-02 780 6.2500000000000000e-02 781 6.2500000000000000e-02 782 -6.2500000000000000e-02 783 -6.2500000000000000e-02 784 6.2500000000000000e-02 785 6.2500000000000000e-02 786 6.2500000000000000e-02 787 6.2500000000000000e-02 788 -6.2500000000000000e-02 789 6.2500000000000000e-02 790 -6.2500000000000000e-02 791 -6.2500000000000000e-02 792 -6.2500000000000000e-02 793 0.0000000000000000e+00 794 0.0000000000000000e+00 795 0.0000000000000000e+00 796 6.2500000000000000e-02 797 1.2500000000000000e-01 798 6.2500000000000000e-02 799 0.0000000000000000e+00 800 1.2500000000000000e-01 801 6.2500000000000000e-02 802 -6.2500000000000000e-02 803 -6.2500000000000000e-02 804 -6.2500000000000000e-02 805 -6.2500000000000000e-02 806 6.2500000000000000e-02 807 6.2500000000000000e-02 808 6.2500000000000000e-02 809 -6.2500000000000000e-02 810 -6.2500000000000000e-02 811 0.0000000000000000e+00 812 6.2500000000000000e-02 813 0.0000000000000000e+00 814 0.0000000000000000e+00 815 -1.2500000000000000e-01 816 0.0000000000000000e+00 817 -1.2500000000000000e-01 818 0.0000000000000000e+00 819 -1.2500000000000000e-01 820 1.2500000000000000e-01 821 0.0000000000000000e+00 822 -6.2500000000000000e-02 823 -6.2500000000000000e-02 824 0.0000000000000000e+00 825 0.0000000000000000e+00 826 0.0000000000000000e+00 827 0.0000000000000000e+00 828 -6.2500000000000000e-02 829 -1.2500000000000000e-01 830 -6.2500000000000000e-02 831 0.0000000000000000e+00 832 -6.2500000000000000e-02 833 6.2500000000000000e-02 834 6.2500000000000000e-02 835 -6.2500000000000000e-02 836 -6.2500000000000000e-02 837 6.2500000000000000e-02 838 -6.2500000000000000e-02 839 -6.2500000000000000e-02 840 0.0000000000000000e+00 841 6.2500000000000000e-02 842 0.0000000000000000e+00 843 -6.2500000000000000e-02 844 -6.2500000000000000e-02 845 6.2500000000000000e-02 846 1.2500000000000000e-01 847 6.2500000000000000e-02 848 0.0000000000000000e+00 849 -6.2500000000000000e-02 850 -1.2500000000000000e-01 851 -6.2500000000000000e-02 852 -6.2500000000000000e-02 853 -6.2500000000000000e-02 854 6.2500000000000000e-02 855 -6.2500000000000000e-02 856 -6.2500000000000000e-02 857 -6.2500000000000000e-02 858 6.2500000000000000e-02 859 6.2500000000000000e-02 860 6.2500000000000000e-02 861 -6.2500000000000000e-02 862 -6.2500000000000000e-02 863 0.0000000000000000e+00 864 6.2500000000000000e-02 865 -6.2500000000000000e-02 866 0.0000000000000000e+00 867 6.2500000000000000e-02 868 1.2500000000000000e-01 869 6.2500000000000000e-02 870 -1.2500000000000000e-01 871 -6.2500000000000000e-02 872 0.0000000000000000e+00 873 6.2500000000000000e-02 874 -6.2500000000000000e-02 875 -6.2500000000000000e-02 876 6.2500000000000000e-02 877 -6.2500000000000000e-02 878 6.2500000000000000e-02 879 6.2500000000000000e-02 880 -6.2500000000000000e-02 881 6.2500000000000000e-02 882 -6.2500000000000000e-02 883 0.0000000000000000e+00 884 0.0000000000000000e+00 885 6.2500000000000000e-02 886 6.2500000000000000e-02 887 6.2500000000000000e-02 888 -6.2500000000000000e-02 889 0.0000000000000000e+00 890 -6.2500000000000000e-02 891 6.2500000000000000e-02 892 -6.2500000000000000e-02 893 -6.2500000000000000e-02 894 -6.2500000000000000e-02 895 -1.2500000000000000e-01 896 0.0000000000000000e+00 897 -6.2500000000000000e-02 898 -6.2500000000000000e-02 899 -6.2500000000000000e-02 900 -6.2500000000000000e-02 901 0.0000000000000000e+00 902 0.0000000000000000e+00 903 6.2500000000000000e-02 904 0.0000000000000000e+00 905 6.2500000000000000e-02 906 1.2500000000000000e-01 907 6.2500000000000000e-02 908 6.2500000000000000e-02 909 6.2500000000000000e-02 910 -6.2500000000000000e-02 911 6.2500000000000000e-02 912 6.2500000000000000e-02 913 6.2500000000000000e-02 914 6.2500000000000000e-02 915 -6.2500000000000000e-02 916 0.0000000000000000e+00 917 6.2500000000000000e-02 918 1.2500000000000000e-01 919 6.2500000000000000e-02 920 6.2500000000000000e-02 921 6.2500000000000000e-02 922 6.2500000000000000e-02 923 6.2500000000000000e-02 924 -6.2500000000000000e-02 925 6.2500000000000000e-02 926 6.2500000000000000e-02 927 6.2500000000000000e-02 928 6.2500000000000000e-02 929 6.2500000000000000e-02 930 -6.2500000000000000e-02 931 6.2500000000000000e-02 932 0.0000000000000000e+00 933 -6.2500000000000000e-02 934 -1.2500000000000000e-01 935 1.2500000000000000e-01 936 6.2500000000000000e-02 937 6.2500000000000000e-02 938 0.0000000000000000e+00 939 0.0000000000000000e+00 940 -6.2500000000000000e-02 941 -6.2500000000000000e-02 942 -6.2500000000000000e-02 943 6.2500000000000000e-02 944 -6.2500000000000000e-02 945 -6.2500000000000000e-02 946 -1.2500000000000000e-01 947 1.2500000000000000e-01 948 -6.2500000000000000e-02 949 -6.2500000000000000e-02 950 -6.2500000000000000e-02 951 -1.2500000000000000e-01 952 -6.2500000000000000e-02 953 -6.2500000000000000e-02 954 -6.2500000000000000e-02 955 6.2500000000000000e-02 956 6.2500000000000000e-02 957 6.2500000000000000e-02 958 -6.2500000000000000e-02 959 -1.2500000000000000e-01 960 -6.2500000000000000e-02 961 0.0000000000000000e+00 962 6.2500000000000000e-02 963 6.2500000000000000e-02 964 0.0000000000000000e+00 965 -6.2500000000000000e-02 966 -6.2500000000000000e-02 967 -6.2500000000000000e-02 968 6.2500000000000000e-02 969 6.2500000000000000e-02 970 0.0000000000000000e+00 971 -6.2500000000000000e-02 972 -6.2500000000000000e-02 973 -6.2500000000000000e-02 974 6.2500000000000000e-02 975 -6.2500000000000000e-02 976 -6.2500000000000000e-02 977 -6.2500000000000000e-02 978 0.0000000000000000e+00 979 -6.2500000000000000e-02 980 -6.2500000000000000e-02 981 0.0000000000000000e+00 982 0.0000000000000000e+00 983 6.2500000000000000e-02 984 -6.2500000000000000e-02 985 -6.2500000000000000e-02 986 6.2500000000000000e-02 987 -6.2500000000000000e-02 988 0.0000000000000000e+00 989 6.2500000000000000e-02 990 0.0000000000000000e+00 991 6.2500000000000000e-02 992 -6.2500000000000000e-02 993 6.2500000000000000e-02 994 -6.2500000000000000e-02 995 0.0000000000000000e+00 996 6.2500000000000000e-02 997 0.0000000000000000e+00 998 6.2500000000000000e-02 999 6.2500000000000000e-02 1000 6.2500000000000000e-02 1001 6.2500000000000000e-02 1002 6.2500000000000000e-02 1003 6.2500000000000000e-02 1004 -6.2500000000000000e-02 1005 6.2500000000000000e-02 1006 6.2500000000000000e-02 1007 6.2500000000000000e-02 1008 -6.2500000000000000e-02 1009 -6.2500000000000000e-02 1010 6.2500000000000000e-02 1011 0.0000000000000000e+00 1012 -1.2500000000000000e-01 1013 -1.2500000000000000e-01 1014 0.0000000000000000e+00 1015 0.0000000000000000e+00 1016 -6.2500000000000000e-02 1017 -6.2500000000000000e-02 1018 -1.2500000000000000e-01 1019 -6.2500000000000000e-02 1020 0.0000000000000000e+00 1021 6.2500000000000000e-02 1022 6.2500000000000000e-02 1023 -1.2500000000000000e-01 1024 -6.2500000000000000e-02 1025 0.0000000000000000e+00 1026 -6.2500000000000000e-02 1027 -6.2500000000000000e-02 1028 -1.2500000000000000e-01 1029 -6.2500000000000000e-02 1030 -6.2500000000000000e-02 1031 -6.2500000000000000e-02 1032 6.2500000000000000e-02 1033 0.0000000000000000e+00 1034 6.2500000000000000e-02 1035 6.2500000000000000e-02 1036 -6.2500000000000000e-02 1037 -6.2500000000000000e-02 1038 -6.2500000000000000e-02 1039 -6.2500000000000000e-02 1040 6.2500000000000000e-02 1041 0.0000000000000000e+00 1042 -6.2500000000000000e-02 1043 -1.2500000000000000e-01 1044 -6.2500000000000000e-02 1045 -6.2500000000000000e-02 1046 -6.2500000000000000e-02 1047 -6.2500000000000000e-02 1048 -6.2500000000000000e-02 1049 -6.2500000000000000e-02 1050 -6.2500000000000000e-02 1051 -6.2500000000000000e-02 1052 6.2500000000000000e-02 1053 6.2500000000000000e-02 1054 -6.2500000000000000e-02 1055 -6.2500000000000000e-02 1056 6.2500000000000000e-02 1057 -6.2500000000000000e-02 1058 -6.2500000000000000e-02 1059 -1.2500000000000000e-01 1060 -6.2500000000000000e-02 1061 -6.2500000000000000e-02 1062 6.2500000000000000e-02 1063 -6.2500000000000000e-02 1064 0.0000000000000000e+00 1065 0.0000000000000000e+00 1066 6.2500000000000000e-02 1067 -6.2500000000000000e-02 1068 0.0000000000000000e+00 1069 -6.2500000000000000e-02 1070 6.2500000000000000e-02 1071 6.2500000000000000e-02 1072 -6.2500000000000000e-02 1073 0.0000000000000000e+00 1074 -6.2500000000000000e-02 1075 0.0000000000000000e+00 hypre-2.33.0/src/test/TEST_ams/mfem.Gz.00001000066400000000000000000001054261477326011500200160ustar00rootroot000000000000001076 2332 1076 0.0000000000000000e+00 1077 0.0000000000000000e+00 1078 6.2500000000000000e-02 1079 1.2500000000000000e-01 1080 0.0000000000000000e+00 1081 1.2500000000000000e-01 1082 1.2500000000000000e-01 1083 1.2500000000000000e-01 1084 0.0000000000000000e+00 1085 1.2500000000000000e-01 1086 1.2500000000000000e-01 1087 1.2500000000000000e-01 1088 0.0000000000000000e+00 1089 0.0000000000000000e+00 1090 0.0000000000000000e+00 1091 6.2500000000000000e-02 1092 0.0000000000000000e+00 1093 0.0000000000000000e+00 1094 6.2500000000000000e-02 1095 0.0000000000000000e+00 1096 1.2500000000000000e-01 1097 1.2500000000000000e-01 1098 1.2500000000000000e-01 1099 1.2500000000000000e-01 1100 1.2500000000000000e-01 1101 1.2500000000000000e-01 1102 6.2500000000000000e-02 1103 0.0000000000000000e+00 1104 0.0000000000000000e+00 1105 0.0000000000000000e+00 1106 1.2500000000000000e-01 1107 1.2500000000000000e-01 1108 0.0000000000000000e+00 1109 0.0000000000000000e+00 1110 0.0000000000000000e+00 1111 0.0000000000000000e+00 1112 1.2500000000000000e-01 1113 -1.2500000000000000e-01 1114 -1.2500000000000000e-01 1115 -6.2500000000000000e-02 1116 -6.2500000000000000e-02 1117 -1.2500000000000000e-01 1118 -6.2500000000000000e-02 1119 0.0000000000000000e+00 1120 0.0000000000000000e+00 1121 6.2500000000000000e-02 1122 0.0000000000000000e+00 1123 0.0000000000000000e+00 1124 6.2500000000000000e-02 1125 -6.2500000000000000e-02 1126 -1.2500000000000000e-01 1127 0.0000000000000000e+00 1128 1.2500000000000000e-01 1129 1.2500000000000000e-01 1130 1.2500000000000000e-01 1131 6.2500000000000000e-02 1132 0.0000000000000000e+00 1133 -1.2500000000000000e-01 1134 1.2500000000000000e-01 1135 0.0000000000000000e+00 1136 6.2500000000000000e-02 1137 1.2500000000000000e-01 1138 0.0000000000000000e+00 1139 1.2500000000000000e-01 1140 1.2500000000000000e-01 1141 1.2500000000000000e-01 1142 1.2500000000000000e-01 1143 0.0000000000000000e+00 1144 0.0000000000000000e+00 1145 0.0000000000000000e+00 1146 1.2500000000000000e-01 1147 1.2500000000000000e-01 1148 -1.2500000000000000e-01 1149 0.0000000000000000e+00 1150 0.0000000000000000e+00 1151 -1.2500000000000000e-01 1152 0.0000000000000000e+00 1153 0.0000000000000000e+00 1154 0.0000000000000000e+00 1155 -1.2500000000000000e-01 1156 -1.2500000000000000e-01 1157 1.2500000000000000e-01 1158 0.0000000000000000e+00 1159 1.2500000000000000e-01 1160 -1.2500000000000000e-01 1161 1.2500000000000000e-01 1162 1.2500000000000000e-01 1163 1.2500000000000000e-01 1164 1.2500000000000000e-01 1165 1.2500000000000000e-01 1166 1.2500000000000000e-01 1167 -1.2500000000000000e-01 1168 0.0000000000000000e+00 1169 -1.2500000000000000e-01 1170 0.0000000000000000e+00 1171 -1.2500000000000000e-01 1172 -1.2500000000000000e-01 1173 0.0000000000000000e+00 1174 0.0000000000000000e+00 1175 0.0000000000000000e+00 1176 -1.2500000000000000e-01 1177 1.2500000000000000e-01 1178 0.0000000000000000e+00 1179 0.0000000000000000e+00 1180 1.2500000000000000e-01 1181 1.2500000000000000e-01 1182 1.2500000000000000e-01 1183 1.2500000000000000e-01 1184 1.2500000000000000e-01 1185 -1.2500000000000000e-01 1186 -1.2500000000000000e-01 1187 -1.2500000000000000e-01 1188 -1.2500000000000000e-01 1189 -1.2500000000000000e-01 1190 0.0000000000000000e+00 1191 0.0000000000000000e+00 1192 1.2500000000000000e-01 1193 0.0000000000000000e+00 1194 1.2500000000000000e-01 1195 0.0000000000000000e+00 1196 -1.2500000000000000e-01 1197 0.0000000000000000e+00 1198 -1.2500000000000000e-01 1199 -1.2500000000000000e-01 1200 1.2500000000000000e-01 1201 1.2500000000000000e-01 1202 -1.2500000000000000e-01 1203 1.2500000000000000e-01 1204 1.2500000000000000e-01 1205 -1.2500000000000000e-01 1206 1.2500000000000000e-01 1207 0.0000000000000000e+00 1208 0.0000000000000000e+00 1209 1.2500000000000000e-01 1210 -1.2500000000000000e-01 1211 1.2500000000000000e-01 1212 1.2500000000000000e-01 1213 1.2500000000000000e-01 1214 1.2500000000000000e-01 1215 0.0000000000000000e+00 1216 1.2500000000000000e-01 1217 1.2500000000000000e-01 1218 1.2500000000000000e-01 1219 0.0000000000000000e+00 1220 0.0000000000000000e+00 1221 -1.2500000000000000e-01 1222 -1.2500000000000000e-01 1223 -1.2500000000000000e-01 1224 -1.2500000000000000e-01 1225 1.2500000000000000e-01 1226 -1.2500000000000000e-01 1227 0.0000000000000000e+00 1228 -1.2500000000000000e-01 1229 -1.2500000000000000e-01 1230 -1.2500000000000000e-01 1231 0.0000000000000000e+00 1232 1.2500000000000000e-01 1233 0.0000000000000000e+00 1234 1.2500000000000000e-01 1235 0.0000000000000000e+00 1236 1.2500000000000000e-01 1237 1.2500000000000000e-01 1238 -1.2500000000000000e-01 1239 -1.2500000000000000e-01 1240 1.2500000000000000e-01 1241 1.2500000000000000e-01 1242 0.0000000000000000e+00 1243 -1.2500000000000000e-01 1244 1.2500000000000000e-01 1245 -1.2500000000000000e-01 1246 0.0000000000000000e+00 1247 0.0000000000000000e+00 1248 0.0000000000000000e+00 1249 1.2500000000000000e-01 1250 2.5000000000000000e-01 1251 1.2500000000000000e-01 1252 -1.2500000000000000e-01 1253 -1.2500000000000000e-01 1254 0.0000000000000000e+00 1255 -1.2500000000000000e-01 1256 0.0000000000000000e+00 1257 0.0000000000000000e+00 1258 1.2500000000000000e-01 1259 1.2500000000000000e-01 1260 1.2500000000000000e-01 1261 0.0000000000000000e+00 1262 0.0000000000000000e+00 1263 0.0000000000000000e+00 1264 0.0000000000000000e+00 1265 0.0000000000000000e+00 1266 1.2500000000000000e-01 1267 0.0000000000000000e+00 1268 0.0000000000000000e+00 1269 -6.2500000000000000e-02 1270 0.0000000000000000e+00 1271 0.0000000000000000e+00 1272 -6.2500000000000000e-02 1273 1.2500000000000000e-01 1274 0.0000000000000000e+00 1275 1.2500000000000000e-01 1276 1.2500000000000000e-01 1277 1.2500000000000000e-01 1278 0.0000000000000000e+00 1279 1.2500000000000000e-01 1280 1.2500000000000000e-01 1281 1.2500000000000000e-01 1282 0.0000000000000000e+00 1283 1.2500000000000000e-01 1284 1.2500000000000000e-01 1285 0.0000000000000000e+00 1286 -1.2500000000000000e-01 1287 -1.2500000000000000e-01 1288 -1.2500000000000000e-01 1289 -1.2500000000000000e-01 1290 -6.2500000000000000e-02 1291 -1.2500000000000000e-01 1292 -1.2500000000000000e-01 1293 -1.2500000000000000e-01 1294 0.0000000000000000e+00 1295 0.0000000000000000e+00 1296 -1.2500000000000000e-01 1297 0.0000000000000000e+00 1298 1.2500000000000000e-01 1299 0.0000000000000000e+00 1300 0.0000000000000000e+00 1301 -1.2500000000000000e-01 1302 0.0000000000000000e+00 1303 1.2500000000000000e-01 1304 1.2500000000000000e-01 1305 -1.2500000000000000e-01 1306 -1.2500000000000000e-01 1307 1.2500000000000000e-01 1308 -1.2500000000000000e-01 1309 1.2500000000000000e-01 1310 1.2500000000000000e-01 1311 6.2500000000000000e-02 1312 1.2500000000000000e-01 1313 0.0000000000000000e+00 1314 0.0000000000000000e+00 1315 0.0000000000000000e+00 1316 1.2500000000000000e-01 1317 1.2500000000000000e-01 1318 6.2500000000000000e-02 1319 1.2500000000000000e-01 1320 0.0000000000000000e+00 1321 6.2500000000000000e-02 1322 -1.2500000000000000e-01 1323 -1.2500000000000000e-01 1324 -6.2500000000000000e-02 1325 -1.2500000000000000e-01 1326 0.0000000000000000e+00 1327 -6.2500000000000000e-02 1328 1.2500000000000000e-01 1329 0.0000000000000000e+00 1330 0.0000000000000000e+00 1331 -1.2500000000000000e-01 1332 0.0000000000000000e+00 1333 0.0000000000000000e+00 1334 0.0000000000000000e+00 1335 6.2500000000000000e-02 1336 0.0000000000000000e+00 1337 -6.2500000000000000e-02 1338 -1.2500000000000000e-01 1339 -1.2500000000000000e-01 1340 1.2500000000000000e-01 1341 1.2500000000000000e-01 1342 1.2500000000000000e-01 1343 -1.2500000000000000e-01 1344 1.2500000000000000e-01 1345 0.0000000000000000e+00 1346 6.2500000000000000e-02 1347 6.2500000000000000e-02 1348 0.0000000000000000e+00 1349 -6.2500000000000000e-02 1350 1.2500000000000000e-01 1351 1.2500000000000000e-01 1352 6.2500000000000000e-02 1353 0.0000000000000000e+00 1354 0.0000000000000000e+00 1355 6.2500000000000000e-02 1356 -6.2500000000000000e-02 1357 -1.2500000000000000e-01 1358 0.0000000000000000e+00 1359 1.2500000000000000e-01 1360 1.2500000000000000e-01 1361 0.0000000000000000e+00 1362 0.0000000000000000e+00 1363 -6.2500000000000000e-02 1364 -1.2500000000000000e-01 1365 -1.2500000000000000e-01 1366 -1.2500000000000000e-01 1367 -6.2500000000000000e-02 1368 0.0000000000000000e+00 1369 -1.2500000000000000e-01 1370 -1.2500000000000000e-01 1371 -1.2500000000000000e-01 1372 -6.2500000000000000e-02 1373 0.0000000000000000e+00 1374 0.0000000000000000e+00 1375 1.2500000000000000e-01 1376 1.2500000000000000e-01 1377 1.2500000000000000e-01 1378 1.2500000000000000e-01 1379 1.2500000000000000e-01 1380 -1.2500000000000000e-01 1381 0.0000000000000000e+00 1382 -1.2500000000000000e-01 1383 0.0000000000000000e+00 1384 -6.2500000000000000e-02 1385 1.2500000000000000e-01 1386 1.2500000000000000e-01 1387 6.2500000000000000e-02 1388 -1.2500000000000000e-01 1389 -1.2500000000000000e-01 1390 0.0000000000000000e+00 1391 0.0000000000000000e+00 1392 1.2500000000000000e-01 1393 -1.2500000000000000e-01 1394 0.0000000000000000e+00 1395 -6.2500000000000000e-02 1396 -6.2500000000000000e-02 1397 0.0000000000000000e+00 1398 6.2500000000000000e-02 1399 1.2500000000000000e-01 1400 1.2500000000000000e-01 1401 6.2500000000000000e-02 1402 6.2500000000000000e-02 1403 1.2500000000000000e-01 1404 0.0000000000000000e+00 1405 0.0000000000000000e+00 1406 -6.2500000000000000e-02 1407 6.2500000000000000e-02 1408 1.2500000000000000e-01 1409 0.0000000000000000e+00 1410 -1.2500000000000000e-01 1411 -6.2500000000000000e-02 1412 -1.2500000000000000e-01 1413 -1.2500000000000000e-01 1414 -1.2500000000000000e-01 1415 0.0000000000000000e+00 1416 0.0000000000000000e+00 1417 1.2500000000000000e-01 1418 0.0000000000000000e+00 1419 1.2500000000000000e-01 1420 1.2500000000000000e-01 1421 0.0000000000000000e+00 1422 1.2500000000000000e-01 1423 1.2500000000000000e-01 1424 -1.2500000000000000e-01 1425 -1.2500000000000000e-01 1426 -6.2500000000000000e-02 1427 0.0000000000000000e+00 1428 0.0000000000000000e+00 1429 0.0000000000000000e+00 1430 0.0000000000000000e+00 1431 1.2500000000000000e-01 1432 1.2500000000000000e-01 1433 -1.2500000000000000e-01 1434 -1.2500000000000000e-01 1435 -6.2500000000000000e-02 1436 -1.2500000000000000e-01 1437 -1.2500000000000000e-01 1438 1.2500000000000000e-01 1439 -2.5000000000000000e-01 1440 0.0000000000000000e+00 1441 0.0000000000000000e+00 1442 1.2500000000000000e-01 1443 1.2500000000000000e-01 1444 1.2500000000000000e-01 1445 2.5000000000000000e-01 1446 -1.2500000000000000e-01 1447 -1.2500000000000000e-01 1448 -1.2500000000000000e-01 1449 -1.2500000000000000e-01 1450 0.0000000000000000e+00 1451 1.2500000000000000e-01 1452 6.2500000000000000e-02 1453 -6.2500000000000000e-02 1454 1.2500000000000000e-01 1455 0.0000000000000000e+00 1456 1.2500000000000000e-01 1457 1.2500000000000000e-01 1458 0.0000000000000000e+00 1459 1.2500000000000000e-01 1460 0.0000000000000000e+00 1461 0.0000000000000000e+00 1462 -1.2500000000000000e-01 1463 -1.2500000000000000e-01 1464 -1.2500000000000000e-01 1465 0.0000000000000000e+00 1466 -6.2500000000000000e-02 1467 -1.2500000000000000e-01 1468 1.2500000000000000e-01 1469 0.0000000000000000e+00 1470 -6.2500000000000000e-02 1471 1.2500000000000000e-01 1472 0.0000000000000000e+00 1473 0.0000000000000000e+00 1474 0.0000000000000000e+00 1475 -6.2500000000000000e-02 1476 6.2500000000000000e-02 1477 1.2500000000000000e-01 1478 6.2500000000000000e-02 1479 -1.2500000000000000e-01 1480 0.0000000000000000e+00 1481 -6.2500000000000000e-02 1482 -6.2500000000000000e-02 1483 0.0000000000000000e+00 1484 -1.2500000000000000e-01 1485 0.0000000000000000e+00 1486 -6.2500000000000000e-02 1487 0.0000000000000000e+00 1488 6.2500000000000000e-02 1489 1.2500000000000000e-01 1490 1.2500000000000000e-01 1491 1.2500000000000000e-01 1492 6.2500000000000000e-02 1493 0.0000000000000000e+00 1494 0.0000000000000000e+00 1495 1.2500000000000000e-01 1496 -1.2500000000000000e-01 1497 -1.2500000000000000e-01 1498 -1.2500000000000000e-01 1499 0.0000000000000000e+00 1500 -1.2500000000000000e-01 1501 0.0000000000000000e+00 1502 0.0000000000000000e+00 1503 0.0000000000000000e+00 1504 -6.2500000000000000e-02 1505 0.0000000000000000e+00 1506 6.2500000000000000e-02 1507 1.2500000000000000e-01 1508 1.2500000000000000e-01 1509 1.2500000000000000e-01 1510 -1.2500000000000000e-01 1511 -1.2500000000000000e-01 1512 -1.2500000000000000e-01 1513 1.2500000000000000e-01 1514 -1.2500000000000000e-01 1515 -1.2500000000000000e-01 1516 -1.2500000000000000e-01 1517 -1.2500000000000000e-01 1518 -1.2500000000000000e-01 1519 0.0000000000000000e+00 1520 -1.2500000000000000e-01 1521 0.0000000000000000e+00 1522 -1.2500000000000000e-01 1523 0.0000000000000000e+00 1524 -1.2500000000000000e-01 1525 -1.2500000000000000e-01 1526 -1.2500000000000000e-01 1527 0.0000000000000000e+00 1528 -1.2500000000000000e-01 1529 0.0000000000000000e+00 1530 -1.2500000000000000e-01 1531 0.0000000000000000e+00 1532 -1.2500000000000000e-01 1533 -1.2500000000000000e-01 1534 -1.2500000000000000e-01 1535 0.0000000000000000e+00 1536 0.0000000000000000e+00 1537 0.0000000000000000e+00 1538 -1.2500000000000000e-01 1539 -1.2500000000000000e-01 1540 0.0000000000000000e+00 1541 0.0000000000000000e+00 1542 -1.2500000000000000e-01 1543 -1.2500000000000000e-01 1544 0.0000000000000000e+00 1545 0.0000000000000000e+00 1546 -1.2500000000000000e-01 1547 -1.2500000000000000e-01 1548 0.0000000000000000e+00 1549 -1.2500000000000000e-01 1550 0.0000000000000000e+00 1551 0.0000000000000000e+00 1552 -1.2500000000000000e-01 1553 0.0000000000000000e+00 1554 1.2500000000000000e-01 1555 -1.2500000000000000e-01 1556 0.0000000000000000e+00 1557 0.0000000000000000e+00 1558 -1.2500000000000000e-01 1559 1.2500000000000000e-01 1560 1.2500000000000000e-01 1561 1.2500000000000000e-01 1562 1.2500000000000000e-01 1563 1.2500000000000000e-01 1564 -1.2500000000000000e-01 1565 -1.2500000000000000e-01 1566 -1.2500000000000000e-01 1567 -1.2500000000000000e-01 1568 0.0000000000000000e+00 1569 0.0000000000000000e+00 1570 -1.2500000000000000e-01 1571 -2.5000000000000000e-01 1572 -1.2500000000000000e-01 1573 0.0000000000000000e+00 1574 1.2500000000000000e-01 1575 0.0000000000000000e+00 1576 0.0000000000000000e+00 1577 1.2500000000000000e-01 1578 -1.2500000000000000e-01 1579 -1.2500000000000000e-01 1580 -1.2500000000000000e-01 1581 -1.2500000000000000e-01 1582 -6.2500000000000000e-02 1583 1.2500000000000000e-01 1584 0.0000000000000000e+00 1585 6.2500000000000000e-02 1586 0.0000000000000000e+00 1587 -6.2500000000000000e-02 1588 -1.2500000000000000e-01 1589 0.0000000000000000e+00 1590 1.2500000000000000e-01 1591 1.2500000000000000e-01 1592 6.2500000000000000e-02 1593 1.2500000000000000e-01 1594 6.2500000000000000e-02 1595 0.0000000000000000e+00 1596 -1.2500000000000000e-01 1597 0.0000000000000000e+00 1598 -2.5000000000000000e-01 1599 -1.2500000000000000e-01 1600 0.0000000000000000e+00 1601 -1.2500000000000000e-01 1602 -1.2500000000000000e-01 1603 -1.2500000000000000e-01 1604 -1.2500000000000000e-01 1605 0.0000000000000000e+00 1606 -1.2500000000000000e-01 1607 -1.2500000000000000e-01 1608 0.0000000000000000e+00 1609 0.0000000000000000e+00 1610 1.2500000000000000e-01 1611 1.2500000000000000e-01 1612 1.2500000000000000e-01 1613 1.2500000000000000e-01 1614 1.2500000000000000e-01 1615 1.2500000000000000e-01 1616 1.2500000000000000e-01 1617 0.0000000000000000e+00 1618 1.2500000000000000e-01 1619 0.0000000000000000e+00 1620 0.0000000000000000e+00 1621 0.0000000000000000e+00 1622 -1.2500000000000000e-01 1623 -1.2500000000000000e-01 1624 -1.2500000000000000e-01 1625 -1.2500000000000000e-01 1626 0.0000000000000000e+00 1627 -1.2500000000000000e-01 1628 0.0000000000000000e+00 1629 -1.2500000000000000e-01 1630 0.0000000000000000e+00 1631 0.0000000000000000e+00 1632 0.0000000000000000e+00 1633 -1.2500000000000000e-01 1634 -1.2500000000000000e-01 1635 0.0000000000000000e+00 1636 -1.2500000000000000e-01 1637 -1.2500000000000000e-01 1638 0.0000000000000000e+00 1639 0.0000000000000000e+00 1640 0.0000000000000000e+00 1641 0.0000000000000000e+00 1642 -1.2500000000000000e-01 1643 -1.2500000000000000e-01 1644 0.0000000000000000e+00 1645 1.2500000000000000e-01 1646 0.0000000000000000e+00 1647 0.0000000000000000e+00 1648 -1.2500000000000000e-01 1649 -1.2500000000000000e-01 1650 -1.2500000000000000e-01 1651 -6.2500000000000000e-02 1652 0.0000000000000000e+00 1653 -6.2500000000000000e-02 1654 1.2500000000000000e-01 1655 1.2500000000000000e-01 1656 1.2500000000000000e-01 1657 -1.2500000000000000e-01 1658 0.0000000000000000e+00 1659 -1.2500000000000000e-01 1660 0.0000000000000000e+00 1661 0.0000000000000000e+00 1662 0.0000000000000000e+00 1663 1.2500000000000000e-01 1664 1.2500000000000000e-01 1665 1.2500000000000000e-01 1666 0.0000000000000000e+00 1667 6.2500000000000000e-02 1668 1.2500000000000000e-01 1669 1.2500000000000000e-01 1670 0.0000000000000000e+00 1671 0.0000000000000000e+00 1672 1.2500000000000000e-01 1673 0.0000000000000000e+00 1674 6.2500000000000000e-02 1675 6.2500000000000000e-02 1676 0.0000000000000000e+00 1677 -6.2500000000000000e-02 1678 1.2500000000000000e-01 1679 1.2500000000000000e-01 1680 6.2500000000000000e-02 1681 0.0000000000000000e+00 1682 6.2500000000000000e-02 1683 1.2500000000000000e-01 1684 0.0000000000000000e+00 1685 1.2500000000000000e-01 1686 0.0000000000000000e+00 1687 0.0000000000000000e+00 1688 0.0000000000000000e+00 1689 0.0000000000000000e+00 1690 0.0000000000000000e+00 1691 -1.2500000000000000e-01 1692 -1.2500000000000000e-01 1693 0.0000000000000000e+00 1694 6.2500000000000000e-02 1695 0.0000000000000000e+00 1696 6.2500000000000000e-02 1697 0.0000000000000000e+00 1698 6.2500000000000000e-02 1699 0.0000000000000000e+00 1700 6.2500000000000000e-02 1701 6.2500000000000000e-02 1702 6.2500000000000000e-02 1703 -1.2500000000000000e-01 1704 -6.2500000000000000e-02 1705 6.2500000000000000e-02 1706 6.2500000000000000e-02 1707 6.2500000000000000e-02 1708 6.2500000000000000e-02 1709 6.2500000000000000e-02 1710 -6.2500000000000000e-02 1711 6.2500000000000000e-02 1712 6.2500000000000000e-02 1713 1.2500000000000000e-01 1714 1.2500000000000000e-01 1715 0.0000000000000000e+00 1716 6.2500000000000000e-02 1717 -6.2500000000000000e-02 1718 6.2500000000000000e-02 1719 6.2500000000000000e-02 1720 0.0000000000000000e+00 1721 0.0000000000000000e+00 1722 0.0000000000000000e+00 1723 -1.2500000000000000e-01 1724 1.2500000000000000e-01 1725 1.2500000000000000e-01 1726 -1.2500000000000000e-01 1727 -1.2500000000000000e-01 1728 0.0000000000000000e+00 1729 0.0000000000000000e+00 1730 1.2500000000000000e-01 1731 1.2500000000000000e-01 1732 0.0000000000000000e+00 1733 1.2500000000000000e-01 1734 0.0000000000000000e+00 1735 0.0000000000000000e+00 1736 -1.2500000000000000e-01 1737 0.0000000000000000e+00 1738 1.2500000000000000e-01 1739 0.0000000000000000e+00 1740 0.0000000000000000e+00 1741 0.0000000000000000e+00 1742 1.2500000000000000e-01 1743 -1.2500000000000000e-01 1744 1.2500000000000000e-01 1745 1.2500000000000000e-01 1746 0.0000000000000000e+00 1747 1.2500000000000000e-01 1748 1.2500000000000000e-01 1749 -1.2500000000000000e-01 1750 -1.2500000000000000e-01 1751 0.0000000000000000e+00 1752 0.0000000000000000e+00 1753 -1.2500000000000000e-01 1754 0.0000000000000000e+00 1755 0.0000000000000000e+00 1756 0.0000000000000000e+00 1757 1.2500000000000000e-01 1758 0.0000000000000000e+00 1759 0.0000000000000000e+00 1760 0.0000000000000000e+00 1761 0.0000000000000000e+00 1762 0.0000000000000000e+00 1763 -1.2500000000000000e-01 1764 -1.2500000000000000e-01 1765 1.2500000000000000e-01 1766 1.2500000000000000e-01 1767 0.0000000000000000e+00 1768 -1.2500000000000000e-01 1769 1.2500000000000000e-01 1770 0.0000000000000000e+00 1771 0.0000000000000000e+00 1772 1.2500000000000000e-01 1773 1.2500000000000000e-01 1774 1.2500000000000000e-01 1775 1.2500000000000000e-01 1776 1.2500000000000000e-01 1777 1.2500000000000000e-01 1778 -1.2500000000000000e-01 1779 1.2500000000000000e-01 1780 1.2500000000000000e-01 1781 0.0000000000000000e+00 1782 -1.2500000000000000e-01 1783 1.2500000000000000e-01 1784 -1.2500000000000000e-01 1785 0.0000000000000000e+00 1786 0.0000000000000000e+00 1787 -1.2500000000000000e-01 1788 -1.2500000000000000e-01 1789 0.0000000000000000e+00 1790 -1.2500000000000000e-01 1791 0.0000000000000000e+00 1792 0.0000000000000000e+00 1793 1.2500000000000000e-01 1794 -1.2500000000000000e-01 1795 -1.2500000000000000e-01 1796 -1.2500000000000000e-01 1797 0.0000000000000000e+00 1798 0.0000000000000000e+00 1799 0.0000000000000000e+00 1800 0.0000000000000000e+00 1801 0.0000000000000000e+00 1802 0.0000000000000000e+00 1803 0.0000000000000000e+00 1804 -1.2500000000000000e-01 1805 -1.2500000000000000e-01 1806 0.0000000000000000e+00 1807 0.0000000000000000e+00 1808 0.0000000000000000e+00 1809 -1.2500000000000000e-01 1810 -1.2500000000000000e-01 1811 -1.2500000000000000e-01 1812 0.0000000000000000e+00 1813 0.0000000000000000e+00 1814 0.0000000000000000e+00 1815 0.0000000000000000e+00 1816 0.0000000000000000e+00 1817 0.0000000000000000e+00 1818 0.0000000000000000e+00 1819 0.0000000000000000e+00 1820 0.0000000000000000e+00 1821 0.0000000000000000e+00 1822 0.0000000000000000e+00 1823 0.0000000000000000e+00 1824 1.2500000000000000e-01 1825 1.2500000000000000e-01 1826 0.0000000000000000e+00 1827 1.2500000000000000e-01 1828 0.0000000000000000e+00 1829 1.2500000000000000e-01 1830 -1.2500000000000000e-01 1831 -1.2500000000000000e-01 1832 -1.2500000000000000e-01 1833 0.0000000000000000e+00 1834 1.2500000000000000e-01 1835 -1.2500000000000000e-01 1836 0.0000000000000000e+00 1837 0.0000000000000000e+00 1838 -1.2500000000000000e-01 1839 0.0000000000000000e+00 1840 0.0000000000000000e+00 1841 -1.2500000000000000e-01 1842 1.2500000000000000e-01 1843 -1.2500000000000000e-01 1844 0.0000000000000000e+00 1845 0.0000000000000000e+00 1846 1.2500000000000000e-01 1847 0.0000000000000000e+00 1848 0.0000000000000000e+00 1849 -6.2500000000000000e-02 1850 0.0000000000000000e+00 1851 6.2500000000000000e-02 1852 1.2500000000000000e-01 1853 6.2500000000000000e-02 1854 -1.2500000000000000e-01 1855 -6.2500000000000000e-02 1856 0.0000000000000000e+00 1857 6.2500000000000000e-02 1858 1.2500000000000000e-01 1859 6.2500000000000000e-02 1860 -6.2500000000000000e-02 1861 -6.2500000000000000e-02 1862 -6.2500000000000000e-02 1863 6.2500000000000000e-02 1864 6.2500000000000000e-02 1865 -6.2500000000000000e-02 1866 6.2500000000000000e-02 1867 6.2500000000000000e-02 1868 -6.2500000000000000e-02 1869 -6.2500000000000000e-02 1870 -6.2500000000000000e-02 1871 0.0000000000000000e+00 1872 6.2500000000000000e-02 1873 -6.2500000000000000e-02 1874 -6.2500000000000000e-02 1875 -6.2500000000000000e-02 1876 0.0000000000000000e+00 1877 6.2500000000000000e-02 1878 0.0000000000000000e+00 1879 -6.2500000000000000e-02 1880 -1.2500000000000000e-01 1881 -6.2500000000000000e-02 1882 1.2500000000000000e-01 1883 6.2500000000000000e-02 1884 0.0000000000000000e+00 1885 -1.2500000000000000e-01 1886 -6.2500000000000000e-02 1887 6.2500000000000000e-02 1888 6.2500000000000000e-02 1889 6.2500000000000000e-02 1890 -6.2500000000000000e-02 1891 -6.2500000000000000e-02 1892 6.2500000000000000e-02 1893 -6.2500000000000000e-02 1894 6.2500000000000000e-02 1895 6.2500000000000000e-02 1896 6.2500000000000000e-02 1897 0.0000000000000000e+00 1898 6.2500000000000000e-02 1899 6.2500000000000000e-02 1900 -6.2500000000000000e-02 1901 6.2500000000000000e-02 1902 0.0000000000000000e+00 1903 1.2500000000000000e-01 1904 1.2500000000000000e-01 1905 0.0000000000000000e+00 1906 -6.2500000000000000e-02 1907 0.0000000000000000e+00 1908 0.0000000000000000e+00 1909 -6.2500000000000000e-02 1910 -6.2500000000000000e-02 1911 1.2500000000000000e-01 1912 1.2500000000000000e-01 1913 -6.2500000000000000e-02 1914 -6.2500000000000000e-02 1915 0.0000000000000000e+00 1916 1.2500000000000000e-01 1917 6.2500000000000000e-02 1918 -6.2500000000000000e-02 1919 -6.2500000000000000e-02 1920 -6.2500000000000000e-02 1921 -6.2500000000000000e-02 1922 -6.2500000000000000e-02 1923 6.2500000000000000e-02 1924 1.2500000000000000e-01 1925 1.2500000000000000e-01 1926 1.2500000000000000e-01 1927 6.2500000000000000e-02 1928 -1.2500000000000000e-01 1929 0.0000000000000000e+00 1930 0.0000000000000000e+00 1931 -1.2500000000000000e-01 1932 -6.2500000000000000e-02 1933 0.0000000000000000e+00 1934 6.2500000000000000e-02 1935 -6.2500000000000000e-02 1936 0.0000000000000000e+00 1937 0.0000000000000000e+00 1938 6.2500000000000000e-02 1939 -6.2500000000000000e-02 1940 0.0000000000000000e+00 1941 -6.2500000000000000e-02 1942 6.2500000000000000e-02 1943 -6.2500000000000000e-02 1944 -6.2500000000000000e-02 1945 -6.2500000000000000e-02 1946 6.2500000000000000e-02 1947 6.2500000000000000e-02 1948 6.2500000000000000e-02 1949 -6.2500000000000000e-02 1950 1.2500000000000000e-01 1951 0.0000000000000000e+00 1952 -6.2500000000000000e-02 1953 -6.2500000000000000e-02 1954 6.2500000000000000e-02 1955 6.2500000000000000e-02 1956 0.0000000000000000e+00 1957 0.0000000000000000e+00 1958 -6.2500000000000000e-02 1959 -1.2500000000000000e-01 1960 -6.2500000000000000e-02 1961 1.2500000000000000e-01 1962 6.2500000000000000e-02 1963 0.0000000000000000e+00 1964 -6.2500000000000000e-02 1965 -1.2500000000000000e-01 1966 -6.2500000000000000e-02 1967 6.2500000000000000e-02 1968 6.2500000000000000e-02 1969 6.2500000000000000e-02 1970 6.2500000000000000e-02 1971 -6.2500000000000000e-02 1972 -6.2500000000000000e-02 1973 -6.2500000000000000e-02 1974 -6.2500000000000000e-02 1975 6.2500000000000000e-02 1976 -1.2500000000000000e-01 1977 0.0000000000000000e+00 1978 0.0000000000000000e+00 1979 -1.2500000000000000e-01 1980 -1.2500000000000000e-01 1981 0.0000000000000000e+00 1982 -1.2500000000000000e-01 1983 0.0000000000000000e+00 1984 -1.2500000000000000e-01 1985 0.0000000000000000e+00 1986 -1.2500000000000000e-01 1987 0.0000000000000000e+00 1988 0.0000000000000000e+00 1989 0.0000000000000000e+00 1990 0.0000000000000000e+00 1991 -1.2500000000000000e-01 1992 0.0000000000000000e+00 1993 1.2500000000000000e-01 1994 1.2500000000000000e-01 1995 0.0000000000000000e+00 1996 0.0000000000000000e+00 1997 0.0000000000000000e+00 1998 -1.2500000000000000e-01 1999 -1.2500000000000000e-01 2000 0.0000000000000000e+00 2001 0.0000000000000000e+00 2002 0.0000000000000000e+00 2003 0.0000000000000000e+00 2004 0.0000000000000000e+00 2005 0.0000000000000000e+00 2006 1.2500000000000000e-01 2007 1.2500000000000000e-01 2008 1.2500000000000000e-01 2009 1.2500000000000000e-01 2010 0.0000000000000000e+00 2011 -1.2500000000000000e-01 2012 0.0000000000000000e+00 2013 0.0000000000000000e+00 2014 0.0000000000000000e+00 2015 1.2500000000000000e-01 2016 0.0000000000000000e+00 2017 -1.2500000000000000e-01 2018 0.0000000000000000e+00 2019 1.2500000000000000e-01 2020 -1.2500000000000000e-01 2021 -1.2500000000000000e-01 2022 -1.2500000000000000e-01 2023 0.0000000000000000e+00 2024 1.2500000000000000e-01 2025 1.2500000000000000e-01 2026 -1.2500000000000000e-01 2027 0.0000000000000000e+00 2028 -1.2500000000000000e-01 2029 0.0000000000000000e+00 2030 0.0000000000000000e+00 2031 1.2500000000000000e-01 2032 -1.2500000000000000e-01 2033 0.0000000000000000e+00 2034 -1.2500000000000000e-01 2035 0.0000000000000000e+00 2036 0.0000000000000000e+00 2037 0.0000000000000000e+00 2038 1.2500000000000000e-01 2039 0.0000000000000000e+00 2040 -1.2500000000000000e-01 2041 0.0000000000000000e+00 2042 1.2500000000000000e-01 2043 -1.2500000000000000e-01 2044 0.0000000000000000e+00 2045 6.2500000000000000e-02 2046 0.0000000000000000e+00 2047 1.2500000000000000e-01 2048 6.2500000000000000e-02 2049 6.2500000000000000e-02 2050 0.0000000000000000e+00 2051 6.2500000000000000e-02 2052 -6.2500000000000000e-02 2053 0.0000000000000000e+00 2054 -6.2500000000000000e-02 2055 6.2500000000000000e-02 2056 6.2500000000000000e-02 2057 6.2500000000000000e-02 2058 0.0000000000000000e+00 2059 0.0000000000000000e+00 2060 -1.2500000000000000e-01 2061 0.0000000000000000e+00 2062 0.0000000000000000e+00 2063 0.0000000000000000e+00 2064 0.0000000000000000e+00 2065 1.2500000000000000e-01 2066 0.0000000000000000e+00 2067 -1.2500000000000000e-01 2068 1.2500000000000000e-01 2069 0.0000000000000000e+00 2070 -1.2500000000000000e-01 2071 0.0000000000000000e+00 2072 -1.2500000000000000e-01 2073 0.0000000000000000e+00 2074 0.0000000000000000e+00 2075 0.0000000000000000e+00 2076 0.0000000000000000e+00 2077 0.0000000000000000e+00 2078 0.0000000000000000e+00 2079 0.0000000000000000e+00 2080 0.0000000000000000e+00 2081 0.0000000000000000e+00 2082 1.2500000000000000e-01 2083 0.0000000000000000e+00 2084 1.2500000000000000e-01 2085 -1.2500000000000000e-01 2086 0.0000000000000000e+00 2087 0.0000000000000000e+00 2088 0.0000000000000000e+00 2089 -1.2500000000000000e-01 2090 -1.2500000000000000e-01 2091 0.0000000000000000e+00 2092 0.0000000000000000e+00 2093 0.0000000000000000e+00 2094 -1.2500000000000000e-01 2095 0.0000000000000000e+00 2096 0.0000000000000000e+00 2097 0.0000000000000000e+00 2098 -1.2500000000000000e-01 2099 0.0000000000000000e+00 2100 -1.2500000000000000e-01 2101 0.0000000000000000e+00 2102 1.2500000000000000e-01 2103 0.0000000000000000e+00 2104 0.0000000000000000e+00 2105 1.2500000000000000e-01 2106 0.0000000000000000e+00 2107 1.2500000000000000e-01 2108 1.2500000000000000e-01 2109 0.0000000000000000e+00 2110 0.0000000000000000e+00 2111 0.0000000000000000e+00 2112 0.0000000000000000e+00 2113 1.2500000000000000e-01 2114 -1.2500000000000000e-01 2115 1.2500000000000000e-01 2116 0.0000000000000000e+00 2117 0.0000000000000000e+00 2118 -1.2500000000000000e-01 2119 0.0000000000000000e+00 2120 0.0000000000000000e+00 2121 0.0000000000000000e+00 2122 0.0000000000000000e+00 2123 -1.2500000000000000e-01 2124 0.0000000000000000e+00 2125 0.0000000000000000e+00 2126 0.0000000000000000e+00 2127 -1.2500000000000000e-01 2128 0.0000000000000000e+00 2129 1.2500000000000000e-01 2130 -1.2500000000000000e-01 2131 0.0000000000000000e+00 2132 0.0000000000000000e+00 2133 1.2500000000000000e-01 2134 -1.2500000000000000e-01 2135 0.0000000000000000e+00 2136 1.2500000000000000e-01 2137 -1.2500000000000000e-01 2138 0.0000000000000000e+00 2139 0.0000000000000000e+00 2140 1.2500000000000000e-01 2141 -1.2500000000000000e-01 2142 1.2500000000000000e-01 2143 0.0000000000000000e+00 2144 0.0000000000000000e+00 2145 0.0000000000000000e+00 2146 -1.2500000000000000e-01 2147 0.0000000000000000e+00 2148 -6.2500000000000000e-02 2149 -6.2500000000000000e-02 2150 -1.2500000000000000e-01 2151 -1.2500000000000000e-01 2152 0.0000000000000000e+00 2153 0.0000000000000000e+00 2154 -1.2500000000000000e-01 2155 0.0000000000000000e+00 2156 0.0000000000000000e+00 2157 6.2500000000000000e-02 2158 6.2500000000000000e-02 2159 0.0000000000000000e+00 2160 6.2500000000000000e-02 2161 0.0000000000000000e+00 2162 0.0000000000000000e+00 2163 0.0000000000000000e+00 2164 0.0000000000000000e+00 2165 -1.2500000000000000e-01 2166 0.0000000000000000e+00 2167 0.0000000000000000e+00 2168 6.2500000000000000e-02 2169 1.2500000000000000e-01 2170 -1.2500000000000000e-01 2171 1.2500000000000000e-01 2172 0.0000000000000000e+00 2173 0.0000000000000000e+00 2174 0.0000000000000000e+00 2175 0.0000000000000000e+00 2176 0.0000000000000000e+00 2177 1.2500000000000000e-01 2178 1.2500000000000000e-01 2179 0.0000000000000000e+00 2180 -1.2500000000000000e-01 2181 1.2500000000000000e-01 2182 -1.2500000000000000e-01 2183 0.0000000000000000e+00 2184 0.0000000000000000e+00 2185 0.0000000000000000e+00 2186 -1.2500000000000000e-01 2187 0.0000000000000000e+00 2188 0.0000000000000000e+00 2189 -1.2500000000000000e-01 2190 0.0000000000000000e+00 2191 0.0000000000000000e+00 2192 -1.2500000000000000e-01 2193 -1.2500000000000000e-01 2194 -1.2500000000000000e-01 2195 0.0000000000000000e+00 2196 0.0000000000000000e+00 2197 0.0000000000000000e+00 2198 1.2500000000000000e-01 2199 -6.2500000000000000e-02 2200 0.0000000000000000e+00 2201 6.2500000000000000e-02 2202 0.0000000000000000e+00 2203 6.2500000000000000e-02 2204 6.2500000000000000e-02 2205 -6.2500000000000000e-02 2206 6.2500000000000000e-02 2207 -6.2500000000000000e-02 2208 -6.2500000000000000e-02 2209 -6.2500000000000000e-02 2210 6.2500000000000000e-02 2211 6.2500000000000000e-02 2212 6.2500000000000000e-02 2213 -1.2500000000000000e-01 2214 -6.2500000000000000e-02 2215 1.2500000000000000e-01 2216 0.0000000000000000e+00 2217 -6.2500000000000000e-02 2218 6.2500000000000000e-02 2219 6.2500000000000000e-02 2220 0.0000000000000000e+00 2221 -6.2500000000000000e-02 2222 -1.2500000000000000e-01 2223 0.0000000000000000e+00 2224 6.2500000000000000e-02 2225 -6.2500000000000000e-02 2226 6.2500000000000000e-02 2227 6.2500000000000000e-02 2228 -6.2500000000000000e-02 2229 -6.2500000000000000e-02 2230 6.2500000000000000e-02 2231 6.2500000000000000e-02 2232 6.2500000000000000e-02 2233 0.0000000000000000e+00 2234 1.2500000000000000e-01 2235 1.2500000000000000e-01 2236 -6.2500000000000000e-02 2237 -6.2500000000000000e-02 2238 6.2500000000000000e-02 2239 6.2500000000000000e-02 2240 -6.2500000000000000e-02 2241 0.0000000000000000e+00 2242 -6.2500000000000000e-02 2243 -6.2500000000000000e-02 2244 6.2500000000000000e-02 2245 -6.2500000000000000e-02 2246 -1.2500000000000000e-01 2247 6.2500000000000000e-02 2248 0.0000000000000000e+00 2249 -6.2500000000000000e-02 2250 -6.2500000000000000e-02 2251 6.2500000000000000e-02 2252 0.0000000000000000e+00 2253 -6.2500000000000000e-02 2254 6.2500000000000000e-02 2255 6.2500000000000000e-02 2256 -6.2500000000000000e-02 2257 -6.2500000000000000e-02 2258 -6.2500000000000000e-02 2259 0.0000000000000000e+00 2260 1.2500000000000000e-01 2261 -1.2500000000000000e-01 2262 -6.2500000000000000e-02 2263 -1.2500000000000000e-01 2264 0.0000000000000000e+00 2265 0.0000000000000000e+00 2266 0.0000000000000000e+00 2267 -6.2500000000000000e-02 2268 6.2500000000000000e-02 2269 6.2500000000000000e-02 2270 0.0000000000000000e+00 2271 -6.2500000000000000e-02 2272 1.2500000000000000e-01 2273 0.0000000000000000e+00 2274 1.2500000000000000e-01 2275 -6.2500000000000000e-02 2276 6.2500000000000000e-02 2277 -6.2500000000000000e-02 2278 1.2500000000000000e-01 2279 -6.2500000000000000e-02 2280 -1.2500000000000000e-01 2281 6.2500000000000000e-02 2282 6.2500000000000000e-02 2283 -6.2500000000000000e-02 2284 -6.2500000000000000e-02 2285 0.0000000000000000e+00 2286 -6.2500000000000000e-02 2287 -1.2500000000000000e-01 2288 6.2500000000000000e-02 2289 0.0000000000000000e+00 2290 -6.2500000000000000e-02 2291 6.2500000000000000e-02 2292 0.0000000000000000e+00 2293 -6.2500000000000000e-02 2294 -6.2500000000000000e-02 2295 6.2500000000000000e-02 2296 -6.2500000000000000e-02 2297 6.2500000000000000e-02 2298 6.2500000000000000e-02 2299 -6.2500000000000000e-02 2300 -6.2500000000000000e-02 2301 -6.2500000000000000e-02 2302 -1.2500000000000000e-01 2303 -6.2500000000000000e-02 2304 -6.2500000000000000e-02 2305 -6.2500000000000000e-02 2306 -6.2500000000000000e-02 2307 0.0000000000000000e+00 2308 -6.2500000000000000e-02 2309 -6.2500000000000000e-02 2310 0.0000000000000000e+00 2311 6.2500000000000000e-02 2312 0.0000000000000000e+00 2313 6.2500000000000000e-02 2314 -6.2500000000000000e-02 2315 0.0000000000000000e+00 2316 1.2500000000000000e-01 2317 1.2500000000000000e-01 2318 0.0000000000000000e+00 2319 1.2500000000000000e-01 2320 0.0000000000000000e+00 2321 0.0000000000000000e+00 2322 0.0000000000000000e+00 2323 1.2500000000000000e-01 2324 0.0000000000000000e+00 2325 1.2500000000000000e-01 2326 1.2500000000000000e-01 2327 0.0000000000000000e+00 2328 0.0000000000000000e+00 2329 0.0000000000000000e+00 2330 0.0000000000000000e+00 2331 1.2500000000000000e-01 2332 -1.2500000000000000e-01 hypre-2.33.0/src/test/TEST_ams/mfem.Gz.00002000066400000000000000000001140741477326011500200160ustar00rootroot000000000000002333 3709 2333 -1.2500000000000000e-01 2334 0.0000000000000000e+00 2335 -6.2500000000000000e-02 2336 0.0000000000000000e+00 2337 0.0000000000000000e+00 2338 -1.2500000000000000e-01 2339 -1.2500000000000000e-01 2340 1.2500000000000000e-01 2341 1.2500000000000000e-01 2342 0.0000000000000000e+00 2343 0.0000000000000000e+00 2344 -1.2500000000000000e-01 2345 -1.2500000000000000e-01 2346 -1.2500000000000000e-01 2347 -1.2500000000000000e-01 2348 1.2500000000000000e-01 2349 1.2500000000000000e-01 2350 1.2500000000000000e-01 2351 1.2500000000000000e-01 2352 1.2500000000000000e-01 2353 0.0000000000000000e+00 2354 6.2500000000000000e-02 2355 -1.2500000000000000e-01 2356 -1.2500000000000000e-01 2357 -6.2500000000000000e-02 2358 1.2500000000000000e-01 2359 1.2500000000000000e-01 2360 0.0000000000000000e+00 2361 6.2500000000000000e-02 2362 0.0000000000000000e+00 2363 -1.2500000000000000e-01 2364 -1.2500000000000000e-01 2365 -1.2500000000000000e-01 2366 -6.2500000000000000e-02 2367 0.0000000000000000e+00 2368 -6.2500000000000000e-02 2369 -1.2500000000000000e-01 2370 0.0000000000000000e+00 2371 0.0000000000000000e+00 2372 0.0000000000000000e+00 2373 0.0000000000000000e+00 2374 1.2500000000000000e-01 2375 1.2500000000000000e-01 2376 1.2500000000000000e-01 2377 1.2500000000000000e-01 2378 0.0000000000000000e+00 2379 0.0000000000000000e+00 2380 -6.2500000000000000e-02 2381 6.2500000000000000e-02 2382 1.2500000000000000e-01 2383 6.2500000000000000e-02 2384 1.2500000000000000e-01 2385 1.2500000000000000e-01 2386 6.2500000000000000e-02 2387 6.2500000000000000e-02 2388 1.2500000000000000e-01 2389 0.0000000000000000e+00 2390 -1.2500000000000000e-01 2391 -6.2500000000000000e-02 2392 -1.2500000000000000e-01 2393 0.0000000000000000e+00 2394 -6.2500000000000000e-02 2395 -6.2500000000000000e-02 2396 0.0000000000000000e+00 2397 -1.2500000000000000e-01 2398 -1.2500000000000000e-01 2399 0.0000000000000000e+00 2400 0.0000000000000000e+00 2401 0.0000000000000000e+00 2402 1.2500000000000000e-01 2403 -1.2500000000000000e-01 2404 -1.2500000000000000e-01 2405 0.0000000000000000e+00 2406 -6.2500000000000000e-02 2407 -1.2500000000000000e-01 2408 -1.2500000000000000e-01 2409 0.0000000000000000e+00 2410 1.2500000000000000e-01 2411 0.0000000000000000e+00 2412 1.2500000000000000e-01 2413 -1.2500000000000000e-01 2414 0.0000000000000000e+00 2415 -2.5000000000000000e-01 2416 -1.2500000000000000e-01 2417 -1.2500000000000000e-01 2418 0.0000000000000000e+00 2419 -6.2500000000000000e-02 2420 1.2500000000000000e-01 2421 1.2500000000000000e-01 2422 6.2500000000000000e-02 2423 1.2500000000000000e-01 2424 0.0000000000000000e+00 2425 6.2500000000000000e-02 2426 1.2500000000000000e-01 2427 1.2500000000000000e-01 2428 0.0000000000000000e+00 2429 -1.2500000000000000e-01 2430 -1.2500000000000000e-01 2431 0.0000000000000000e+00 2432 -1.2500000000000000e-01 2433 1.2500000000000000e-01 2434 0.0000000000000000e+00 2435 0.0000000000000000e+00 2436 1.2500000000000000e-01 2437 -1.2500000000000000e-01 2438 0.0000000000000000e+00 2439 -1.2500000000000000e-01 2440 -1.2500000000000000e-01 2441 -1.2500000000000000e-01 2442 -1.2500000000000000e-01 2443 -6.2500000000000000e-02 2444 0.0000000000000000e+00 2445 -6.2500000000000000e-02 2446 1.2500000000000000e-01 2447 1.2500000000000000e-01 2448 1.2500000000000000e-01 2449 1.2500000000000000e-01 2450 0.0000000000000000e+00 2451 1.2500000000000000e-01 2452 1.2500000000000000e-01 2453 1.2500000000000000e-01 2454 -1.2500000000000000e-01 2455 0.0000000000000000e+00 2456 0.0000000000000000e+00 2457 0.0000000000000000e+00 2458 -1.2500000000000000e-01 2459 0.0000000000000000e+00 2460 -1.2500000000000000e-01 2461 0.0000000000000000e+00 2462 0.0000000000000000e+00 2463 1.2500000000000000e-01 2464 1.2500000000000000e-01 2465 0.0000000000000000e+00 2466 0.0000000000000000e+00 2467 -6.2500000000000000e-02 2468 6.2500000000000000e-02 2469 1.2500000000000000e-01 2470 6.2500000000000000e-02 2471 0.0000000000000000e+00 2472 -1.2500000000000000e-01 2473 -6.2500000000000000e-02 2474 0.0000000000000000e+00 2475 6.2500000000000000e-02 2476 1.2500000000000000e-01 2477 1.2500000000000000e-01 2478 0.0000000000000000e+00 2479 -6.2500000000000000e-02 2480 -1.2500000000000000e-01 2481 0.0000000000000000e+00 2482 0.0000000000000000e+00 2483 -6.2500000000000000e-02 2484 0.0000000000000000e+00 2485 0.0000000000000000e+00 2486 -6.2500000000000000e-02 2487 1.2500000000000000e-01 2488 -6.2500000000000000e-02 2489 -1.2500000000000000e-01 2490 -1.2500000000000000e-01 2491 -1.2500000000000000e-01 2492 1.2500000000000000e-01 2493 1.2500000000000000e-01 2494 1.2500000000000000e-01 2495 0.0000000000000000e+00 2496 0.0000000000000000e+00 2497 6.2500000000000000e-02 2498 1.2500000000000000e-01 2499 0.0000000000000000e+00 2500 1.2500000000000000e-01 2501 1.2500000000000000e-01 2502 0.0000000000000000e+00 2503 1.2500000000000000e-01 2504 1.2500000000000000e-01 2505 2.5000000000000000e-01 2506 1.2500000000000000e-01 2507 0.0000000000000000e+00 2508 0.0000000000000000e+00 2509 0.0000000000000000e+00 2510 6.2500000000000000e-02 2511 0.0000000000000000e+00 2512 1.2500000000000000e-01 2513 1.2500000000000000e-01 2514 1.2500000000000000e-01 2515 1.2500000000000000e-01 2516 1.2500000000000000e-01 2517 6.2500000000000000e-02 2518 0.0000000000000000e+00 2519 0.0000000000000000e+00 2520 0.0000000000000000e+00 2521 1.2500000000000000e-01 2522 -1.2500000000000000e-01 2523 -1.2500000000000000e-01 2524 -6.2500000000000000e-02 2525 -6.2500000000000000e-02 2526 -1.2500000000000000e-01 2527 -6.2500000000000000e-02 2528 0.0000000000000000e+00 2529 0.0000000000000000e+00 2530 6.2500000000000000e-02 2531 -6.2500000000000000e-02 2532 -1.2500000000000000e-01 2533 1.2500000000000000e-01 2534 1.2500000000000000e-01 2535 6.2500000000000000e-02 2536 1.2500000000000000e-01 2537 6.2500000000000000e-02 2538 0.0000000000000000e+00 2539 1.2500000000000000e-01 2540 0.0000000000000000e+00 2541 6.2500000000000000e-02 2542 1.2500000000000000e-01 2543 0.0000000000000000e+00 2544 0.0000000000000000e+00 2545 0.0000000000000000e+00 2546 0.0000000000000000e+00 2547 -1.2500000000000000e-01 2548 1.2500000000000000e-01 2549 0.0000000000000000e+00 2550 6.2500000000000000e-02 2551 1.2500000000000000e-01 2552 1.2500000000000000e-01 2553 1.2500000000000000e-01 2554 1.2500000000000000e-01 2555 0.0000000000000000e+00 2556 0.0000000000000000e+00 2557 0.0000000000000000e+00 2558 0.0000000000000000e+00 2559 0.0000000000000000e+00 2560 0.0000000000000000e+00 2561 1.2500000000000000e-01 2562 -1.2500000000000000e-01 2563 0.0000000000000000e+00 2564 0.0000000000000000e+00 2565 -1.2500000000000000e-01 2566 -1.2500000000000000e-01 2567 0.0000000000000000e+00 2568 0.0000000000000000e+00 2569 0.0000000000000000e+00 2570 -1.2500000000000000e-01 2571 -1.2500000000000000e-01 2572 -1.2500000000000000e-01 2573 1.2500000000000000e-01 2574 1.2500000000000000e-01 2575 1.2500000000000000e-01 2576 -2.5000000000000000e-01 2577 -1.2500000000000000e-01 2578 0.0000000000000000e+00 2579 -1.2500000000000000e-01 2580 -1.2500000000000000e-01 2581 0.0000000000000000e+00 2582 0.0000000000000000e+00 2583 1.2500000000000000e-01 2584 1.2500000000000000e-01 2585 1.2500000000000000e-01 2586 1.2500000000000000e-01 2587 1.2500000000000000e-01 2588 1.2500000000000000e-01 2589 1.2500000000000000e-01 2590 1.2500000000000000e-01 2591 1.2500000000000000e-01 2592 0.0000000000000000e+00 2593 0.0000000000000000e+00 2594 1.2500000000000000e-01 2595 -1.2500000000000000e-01 2596 -1.2500000000000000e-01 2597 -1.2500000000000000e-01 2598 -1.2500000000000000e-01 2599 1.2500000000000000e-01 2600 0.0000000000000000e+00 2601 -1.2500000000000000e-01 2602 0.0000000000000000e+00 2603 0.0000000000000000e+00 2604 -1.2500000000000000e-01 2605 1.2500000000000000e-01 2606 1.2500000000000000e-01 2607 1.2500000000000000e-01 2608 0.0000000000000000e+00 2609 0.0000000000000000e+00 2610 0.0000000000000000e+00 2611 -1.2500000000000000e-01 2612 -1.2500000000000000e-01 2613 -1.2500000000000000e-01 2614 1.2500000000000000e-01 2615 1.2500000000000000e-01 2616 -1.2500000000000000e-01 2617 -1.2500000000000000e-01 2618 1.2500000000000000e-01 2619 1.2500000000000000e-01 2620 1.2500000000000000e-01 2621 1.2500000000000000e-01 2622 0.0000000000000000e+00 2623 -1.2500000000000000e-01 2624 -1.2500000000000000e-01 2625 -1.2500000000000000e-01 2626 0.0000000000000000e+00 2627 0.0000000000000000e+00 2628 0.0000000000000000e+00 2629 0.0000000000000000e+00 2630 -1.2500000000000000e-01 2631 1.2500000000000000e-01 2632 1.2500000000000000e-01 2633 0.0000000000000000e+00 2634 1.2500000000000000e-01 2635 0.0000000000000000e+00 2636 -1.2500000000000000e-01 2637 -1.2500000000000000e-01 2638 -1.2500000000000000e-01 2639 -1.2500000000000000e-01 2640 -1.2500000000000000e-01 2641 -1.2500000000000000e-01 2642 1.2500000000000000e-01 2643 0.0000000000000000e+00 2644 1.2500000000000000e-01 2645 1.2500000000000000e-01 2646 -1.2500000000000000e-01 2647 1.2500000000000000e-01 2648 0.0000000000000000e+00 2649 0.0000000000000000e+00 2650 1.2500000000000000e-01 2651 1.2500000000000000e-01 2652 0.0000000000000000e+00 2653 0.0000000000000000e+00 2654 -1.2500000000000000e-01 2655 -1.2500000000000000e-01 2656 -1.2500000000000000e-01 2657 0.0000000000000000e+00 2658 1.2500000000000000e-01 2659 1.2500000000000000e-01 2660 -1.2500000000000000e-01 2661 0.0000000000000000e+00 2662 0.0000000000000000e+00 2663 1.2500000000000000e-01 2664 0.0000000000000000e+00 2665 0.0000000000000000e+00 2666 1.2500000000000000e-01 2667 1.2500000000000000e-01 2668 0.0000000000000000e+00 2669 -1.2500000000000000e-01 2670 -1.2500000000000000e-01 2671 6.2500000000000000e-02 2672 -1.2500000000000000e-01 2673 -1.2500000000000000e-01 2674 1.2500000000000000e-01 2675 -1.2500000000000000e-01 2676 -1.2500000000000000e-01 2677 0.0000000000000000e+00 2678 1.2500000000000000e-01 2679 1.2500000000000000e-01 2680 1.2500000000000000e-01 2681 0.0000000000000000e+00 2682 -1.2500000000000000e-01 2683 -1.2500000000000000e-01 2684 -1.2500000000000000e-01 2685 1.2500000000000000e-01 2686 0.0000000000000000e+00 2687 1.2500000000000000e-01 2688 1.2500000000000000e-01 2689 0.0000000000000000e+00 2690 1.2500000000000000e-01 2691 0.0000000000000000e+00 2692 -1.2500000000000000e-01 2693 0.0000000000000000e+00 2694 1.2500000000000000e-01 2695 0.0000000000000000e+00 2696 -1.2500000000000000e-01 2697 -1.2500000000000000e-01 2698 0.0000000000000000e+00 2699 1.2500000000000000e-01 2700 1.2500000000000000e-01 2701 1.2500000000000000e-01 2702 1.2500000000000000e-01 2703 0.0000000000000000e+00 2704 1.2500000000000000e-01 2705 0.0000000000000000e+00 2706 1.2500000000000000e-01 2707 0.0000000000000000e+00 2708 0.0000000000000000e+00 2709 0.0000000000000000e+00 2710 1.2500000000000000e-01 2711 0.0000000000000000e+00 2712 0.0000000000000000e+00 2713 1.2500000000000000e-01 2714 1.2500000000000000e-01 2715 1.2500000000000000e-01 2716 0.0000000000000000e+00 2717 0.0000000000000000e+00 2718 1.2500000000000000e-01 2719 1.2500000000000000e-01 2720 0.0000000000000000e+00 2721 1.2500000000000000e-01 2722 1.2500000000000000e-01 2723 0.0000000000000000e+00 2724 0.0000000000000000e+00 2725 1.2500000000000000e-01 2726 0.0000000000000000e+00 2727 0.0000000000000000e+00 2728 1.2500000000000000e-01 2729 1.2500000000000000e-01 2730 0.0000000000000000e+00 2731 1.2500000000000000e-01 2732 1.2500000000000000e-01 2733 0.0000000000000000e+00 2734 1.2500000000000000e-01 2735 1.2500000000000000e-01 2736 0.0000000000000000e+00 2737 0.0000000000000000e+00 2738 1.2500000000000000e-01 2739 1.2500000000000000e-01 2740 1.2500000000000000e-01 2741 1.2500000000000000e-01 2742 1.2500000000000000e-01 2743 0.0000000000000000e+00 2744 0.0000000000000000e+00 2745 0.0000000000000000e+00 2746 1.2500000000000000e-01 2747 0.0000000000000000e+00 2748 1.2500000000000000e-01 2749 0.0000000000000000e+00 2750 -1.2500000000000000e-01 2751 -1.2500000000000000e-01 2752 0.0000000000000000e+00 2753 -1.2500000000000000e-01 2754 -1.2500000000000000e-01 2755 1.2500000000000000e-01 2756 1.2500000000000000e-01 2757 -1.2500000000000000e-01 2758 -1.2500000000000000e-01 2759 -1.2500000000000000e-01 2760 0.0000000000000000e+00 2761 0.0000000000000000e+00 2762 0.0000000000000000e+00 2763 0.0000000000000000e+00 2764 -1.2500000000000000e-01 2765 1.2500000000000000e-01 2766 -1.2500000000000000e-01 2767 -1.2500000000000000e-01 2768 -1.2500000000000000e-01 2769 0.0000000000000000e+00 2770 -1.2500000000000000e-01 2771 -1.2500000000000000e-01 2772 -1.2500000000000000e-01 2773 -1.2500000000000000e-01 2774 -1.2500000000000000e-01 2775 -1.2500000000000000e-01 2776 0.0000000000000000e+00 2777 0.0000000000000000e+00 2778 1.2500000000000000e-01 2779 -1.2500000000000000e-01 2780 0.0000000000000000e+00 2781 -1.2500000000000000e-01 2782 -1.2500000000000000e-01 2783 -1.2500000000000000e-01 2784 0.0000000000000000e+00 2785 -1.2500000000000000e-01 2786 1.2500000000000000e-01 2787 0.0000000000000000e+00 2788 0.0000000000000000e+00 2789 1.2500000000000000e-01 2790 -1.2500000000000000e-01 2791 -1.2500000000000000e-01 2792 -1.2500000000000000e-01 2793 -1.2500000000000000e-01 2794 -1.2500000000000000e-01 2795 -1.2500000000000000e-01 2796 0.0000000000000000e+00 2797 1.2500000000000000e-01 2798 1.2500000000000000e-01 2799 1.2500000000000000e-01 2800 1.2500000000000000e-01 2801 1.2500000000000000e-01 2802 0.0000000000000000e+00 2803 -1.2500000000000000e-01 2804 0.0000000000000000e+00 2805 -1.2500000000000000e-01 2806 0.0000000000000000e+00 2807 0.0000000000000000e+00 2808 1.2500000000000000e-01 2809 1.2500000000000000e-01 2810 1.2500000000000000e-01 2811 1.2500000000000000e-01 2812 0.0000000000000000e+00 2813 1.2500000000000000e-01 2814 0.0000000000000000e+00 2815 1.2500000000000000e-01 2816 0.0000000000000000e+00 2817 1.2500000000000000e-01 2818 0.0000000000000000e+00 2819 1.2500000000000000e-01 2820 2.5000000000000000e-01 2821 -1.2500000000000000e-01 2822 0.0000000000000000e+00 2823 -1.2500000000000000e-01 2824 0.0000000000000000e+00 2825 -1.2500000000000000e-01 2826 -1.2500000000000000e-01 2827 -1.2500000000000000e-01 2828 0.0000000000000000e+00 2829 1.2500000000000000e-01 2830 1.2500000000000000e-01 2831 0.0000000000000000e+00 2832 -1.2500000000000000e-01 2833 0.0000000000000000e+00 2834 0.0000000000000000e+00 2835 -1.2500000000000000e-01 2836 1.2500000000000000e-01 2837 1.2500000000000000e-01 2838 0.0000000000000000e+00 2839 1.2500000000000000e-01 2840 1.2500000000000000e-01 2841 0.0000000000000000e+00 2842 0.0000000000000000e+00 2843 0.0000000000000000e+00 2844 1.2500000000000000e-01 2845 1.2500000000000000e-01 2846 0.0000000000000000e+00 2847 6.2500000000000000e-02 2848 0.0000000000000000e+00 2849 0.0000000000000000e+00 2850 1.2500000000000000e-01 2851 6.2500000000000000e-02 2852 1.2500000000000000e-01 2853 6.2500000000000000e-02 2854 -6.2500000000000000e-02 2855 -1.2500000000000000e-01 2856 -1.2500000000000000e-01 2857 -1.2500000000000000e-01 2858 -1.2500000000000000e-01 2859 0.0000000000000000e+00 2860 -6.2500000000000000e-02 2861 -6.2500000000000000e-02 2862 0.0000000000000000e+00 2863 6.2500000000000000e-02 2864 1.2500000000000000e-01 2865 1.2500000000000000e-01 2866 6.2500000000000000e-02 2867 1.2500000000000000e-01 2868 6.2500000000000000e-02 2869 0.0000000000000000e+00 2870 0.0000000000000000e+00 2871 0.0000000000000000e+00 2872 -6.2500000000000000e-02 2873 0.0000000000000000e+00 2874 6.2500000000000000e-02 2875 0.0000000000000000e+00 2876 1.2500000000000000e-01 2877 0.0000000000000000e+00 2878 1.2500000000000000e-01 2879 1.2500000000000000e-01 2880 -1.2500000000000000e-01 2881 -1.2500000000000000e-01 2882 -1.2500000000000000e-01 2883 1.2500000000000000e-01 2884 1.2500000000000000e-01 2885 -1.2500000000000000e-01 2886 0.0000000000000000e+00 2887 -6.2500000000000000e-02 2888 1.2500000000000000e-01 2889 1.2500000000000000e-01 2890 1.2500000000000000e-01 2891 1.2500000000000000e-01 2892 1.2500000000000000e-01 2893 1.2500000000000000e-01 2894 0.0000000000000000e+00 2895 0.0000000000000000e+00 2896 1.2500000000000000e-01 2897 0.0000000000000000e+00 2898 0.0000000000000000e+00 2899 1.2500000000000000e-01 2900 1.2500000000000000e-01 2901 0.0000000000000000e+00 2902 0.0000000000000000e+00 2903 0.0000000000000000e+00 2904 0.0000000000000000e+00 2905 -1.2500000000000000e-01 2906 -1.2500000000000000e-01 2907 0.0000000000000000e+00 2908 0.0000000000000000e+00 2909 0.0000000000000000e+00 2910 -1.2500000000000000e-01 2911 -1.2500000000000000e-01 2912 1.2500000000000000e-01 2913 -1.2500000000000000e-01 2914 -1.2500000000000000e-01 2915 1.2500000000000000e-01 2916 1.2500000000000000e-01 2917 1.2500000000000000e-01 2918 1.2500000000000000e-01 2919 0.0000000000000000e+00 2920 1.2500000000000000e-01 2921 1.2500000000000000e-01 2922 0.0000000000000000e+00 2923 0.0000000000000000e+00 2924 1.2500000000000000e-01 2925 -1.2500000000000000e-01 2926 -1.2500000000000000e-01 2927 -1.2500000000000000e-01 2928 -1.2500000000000000e-01 2929 -1.2500000000000000e-01 2930 0.0000000000000000e+00 2931 0.0000000000000000e+00 2932 -1.2500000000000000e-01 2933 -1.2500000000000000e-01 2934 0.0000000000000000e+00 2935 0.0000000000000000e+00 2936 1.2500000000000000e-01 2937 0.0000000000000000e+00 2938 1.2500000000000000e-01 2939 1.2500000000000000e-01 2940 -1.2500000000000000e-01 2941 -1.2500000000000000e-01 2942 -1.2500000000000000e-01 2943 1.2500000000000000e-01 2944 1.2500000000000000e-01 2945 1.2500000000000000e-01 2946 1.2500000000000000e-01 2947 1.2500000000000000e-01 2948 0.0000000000000000e+00 2949 0.0000000000000000e+00 2950 0.0000000000000000e+00 2951 1.2500000000000000e-01 2952 0.0000000000000000e+00 2953 0.0000000000000000e+00 2954 -1.2500000000000000e-01 2955 0.0000000000000000e+00 2956 1.2500000000000000e-01 2957 0.0000000000000000e+00 2958 -1.2500000000000000e-01 2959 0.0000000000000000e+00 2960 -1.2500000000000000e-01 2961 -1.2500000000000000e-01 2962 1.2500000000000000e-01 2963 1.2500000000000000e-01 2964 1.2500000000000000e-01 2965 -1.2500000000000000e-01 2966 1.2500000000000000e-01 2967 -1.2500000000000000e-01 2968 -1.2500000000000000e-01 2969 -1.2500000000000000e-01 2970 -1.2500000000000000e-01 2971 0.0000000000000000e+00 2972 -1.2500000000000000e-01 2973 -1.2500000000000000e-01 2974 0.0000000000000000e+00 2975 0.0000000000000000e+00 2976 -1.2500000000000000e-01 2977 1.2500000000000000e-01 2978 1.2500000000000000e-01 2979 1.2500000000000000e-01 2980 0.0000000000000000e+00 2981 0.0000000000000000e+00 2982 -1.2500000000000000e-01 2983 0.0000000000000000e+00 2984 -1.2500000000000000e-01 2985 -1.2500000000000000e-01 2986 1.2500000000000000e-01 2987 1.2500000000000000e-01 2988 1.2500000000000000e-01 2989 -1.2500000000000000e-01 2990 -1.2500000000000000e-01 2991 -1.2500000000000000e-01 2992 -1.2500000000000000e-01 2993 -1.2500000000000000e-01 2994 -1.2500000000000000e-01 2995 -1.2500000000000000e-01 2996 -1.2500000000000000e-01 2997 0.0000000000000000e+00 2998 -1.2500000000000000e-01 2999 -1.2500000000000000e-01 3000 -1.2500000000000000e-01 3001 -1.2500000000000000e-01 3002 -1.2500000000000000e-01 3003 0.0000000000000000e+00 3004 1.2500000000000000e-01 3005 1.2500000000000000e-01 3006 0.0000000000000000e+00 3007 0.0000000000000000e+00 3008 0.0000000000000000e+00 3009 1.2500000000000000e-01 3010 1.2500000000000000e-01 3011 1.2500000000000000e-01 3012 0.0000000000000000e+00 3013 0.0000000000000000e+00 3014 0.0000000000000000e+00 3015 1.2500000000000000e-01 3016 -1.2500000000000000e-01 3017 -1.2500000000000000e-01 3018 -1.2500000000000000e-01 3019 -1.2500000000000000e-01 3020 -1.2500000000000000e-01 3021 -1.2500000000000000e-01 3022 0.0000000000000000e+00 3023 -1.2500000000000000e-01 3024 -1.2500000000000000e-01 3025 -1.2500000000000000e-01 3026 -1.2500000000000000e-01 3027 1.2500000000000000e-01 3028 6.2500000000000000e-02 3029 -1.2500000000000000e-01 3030 -6.2500000000000000e-02 3031 0.0000000000000000e+00 3032 6.2500000000000000e-02 3033 0.0000000000000000e+00 3034 -6.2500000000000000e-02 3035 0.0000000000000000e+00 3036 6.2500000000000000e-02 3037 6.2500000000000000e-02 3038 -6.2500000000000000e-02 3039 -6.2500000000000000e-02 3040 -6.2500000000000000e-02 3041 6.2500000000000000e-02 3042 -6.2500000000000000e-02 3043 -6.2500000000000000e-02 3044 -6.2500000000000000e-02 3045 6.2500000000000000e-02 3046 6.2500000000000000e-02 3047 6.2500000000000000e-02 3048 -6.2500000000000000e-02 3049 0.0000000000000000e+00 3050 1.2500000000000000e-01 3051 1.2500000000000000e-01 3052 6.2500000000000000e-02 3053 6.2500000000000000e-02 3054 -6.2500000000000000e-02 3055 -6.2500000000000000e-02 3056 1.2500000000000000e-01 3057 6.2500000000000000e-02 3058 -1.2500000000000000e-01 3059 -6.2500000000000000e-02 3060 0.0000000000000000e+00 3061 0.0000000000000000e+00 3062 6.2500000000000000e-02 3063 -1.2500000000000000e-01 3064 0.0000000000000000e+00 3065 0.0000000000000000e+00 3066 -6.2500000000000000e-02 3067 0.0000000000000000e+00 3068 6.2500000000000000e-02 3069 0.0000000000000000e+00 3070 -6.2500000000000000e-02 3071 0.0000000000000000e+00 3072 6.2500000000000000e-02 3073 -6.2500000000000000e-02 3074 6.2500000000000000e-02 3075 6.2500000000000000e-02 3076 6.2500000000000000e-02 3077 -6.2500000000000000e-02 3078 6.2500000000000000e-02 3079 6.2500000000000000e-02 3080 6.2500000000000000e-02 3081 -6.2500000000000000e-02 3082 1.2500000000000000e-01 3083 1.2500000000000000e-01 3084 1.2500000000000000e-01 3085 0.0000000000000000e+00 3086 -1.2500000000000000e-01 3087 0.0000000000000000e+00 3088 -6.2500000000000000e-02 3089 6.2500000000000000e-02 3090 0.0000000000000000e+00 3091 0.0000000000000000e+00 3092 -6.2500000000000000e-02 3093 0.0000000000000000e+00 3094 -6.2500000000000000e-02 3095 -1.2500000000000000e-01 3096 -1.2500000000000000e-01 3097 -1.2500000000000000e-01 3098 0.0000000000000000e+00 3099 -6.2500000000000000e-02 3100 1.2500000000000000e-01 3101 1.2500000000000000e-01 3102 -6.2500000000000000e-02 3103 -6.2500000000000000e-02 3104 1.2500000000000000e-01 3105 6.2500000000000000e-02 3106 -6.2500000000000000e-02 3107 -6.2500000000000000e-02 3108 -6.2500000000000000e-02 3109 -6.2500000000000000e-02 3110 6.2500000000000000e-02 3111 -6.2500000000000000e-02 3112 1.2500000000000000e-01 3113 0.0000000000000000e+00 3114 -1.2500000000000000e-01 3115 -1.2500000000000000e-01 3116 -1.2500000000000000e-01 3117 -1.2500000000000000e-01 3118 0.0000000000000000e+00 3119 6.2500000000000000e-02 3120 0.0000000000000000e+00 3121 6.2500000000000000e-02 3122 0.0000000000000000e+00 3123 6.2500000000000000e-02 3124 0.0000000000000000e+00 3125 6.2500000000000000e-02 3126 6.2500000000000000e-02 3127 6.2500000000000000e-02 3128 -1.2500000000000000e-01 3129 -6.2500000000000000e-02 3130 6.2500000000000000e-02 3131 6.2500000000000000e-02 3132 6.2500000000000000e-02 3133 6.2500000000000000e-02 3134 6.2500000000000000e-02 3135 -6.2500000000000000e-02 3136 6.2500000000000000e-02 3137 6.2500000000000000e-02 3138 1.2500000000000000e-01 3139 6.2500000000000000e-02 3140 -6.2500000000000000e-02 3141 6.2500000000000000e-02 3142 6.2500000000000000e-02 3143 -1.2500000000000000e-01 3144 1.2500000000000000e-01 3145 6.2500000000000000e-02 3146 1.2500000000000000e-01 3147 0.0000000000000000e+00 3148 0.0000000000000000e+00 3149 0.0000000000000000e+00 3150 -6.2500000000000000e-02 3151 6.2500000000000000e-02 3152 0.0000000000000000e+00 3153 0.0000000000000000e+00 3154 0.0000000000000000e+00 3155 -6.2500000000000000e-02 3156 6.2500000000000000e-02 3157 0.0000000000000000e+00 3158 0.0000000000000000e+00 3159 6.2500000000000000e-02 3160 6.2500000000000000e-02 3161 6.2500000000000000e-02 3162 -6.2500000000000000e-02 3163 6.2500000000000000e-02 3164 -6.2500000000000000e-02 3165 -6.2500000000000000e-02 3166 1.2500000000000000e-01 3167 0.0000000000000000e+00 3168 1.2500000000000000e-01 3169 1.2500000000000000e-01 3170 0.0000000000000000e+00 3171 1.2500000000000000e-01 3172 0.0000000000000000e+00 3173 0.0000000000000000e+00 3174 -1.2500000000000000e-01 3175 -1.2500000000000000e-01 3176 0.0000000000000000e+00 3177 0.0000000000000000e+00 3178 0.0000000000000000e+00 3179 1.2500000000000000e-01 3180 1.2500000000000000e-01 3181 1.2500000000000000e-01 3182 0.0000000000000000e+00 3183 0.0000000000000000e+00 3184 -1.2500000000000000e-01 3185 0.0000000000000000e+00 3186 0.0000000000000000e+00 3187 1.2500000000000000e-01 3188 0.0000000000000000e+00 3189 1.2500000000000000e-01 3190 0.0000000000000000e+00 3191 1.2500000000000000e-01 3192 -1.2500000000000000e-01 3193 0.0000000000000000e+00 3194 0.0000000000000000e+00 3195 1.2500000000000000e-01 3196 1.2500000000000000e-01 3197 1.2500000000000000e-01 3198 0.0000000000000000e+00 3199 1.2500000000000000e-01 3200 0.0000000000000000e+00 3201 -1.2500000000000000e-01 3202 -1.2500000000000000e-01 3203 -1.2500000000000000e-01 3204 0.0000000000000000e+00 3205 -1.2500000000000000e-01 3206 0.0000000000000000e+00 3207 1.2500000000000000e-01 3208 0.0000000000000000e+00 3209 1.2500000000000000e-01 3210 -1.2500000000000000e-01 3211 1.2500000000000000e-01 3212 6.2500000000000000e-02 3213 0.0000000000000000e+00 3214 0.0000000000000000e+00 3215 -6.2500000000000000e-02 3216 -1.2500000000000000e-01 3217 0.0000000000000000e+00 3218 1.2500000000000000e-01 3219 0.0000000000000000e+00 3220 0.0000000000000000e+00 3221 -1.2500000000000000e-01 3222 0.0000000000000000e+00 3223 -1.2500000000000000e-01 3224 1.2500000000000000e-01 3225 0.0000000000000000e+00 3226 -1.2500000000000000e-01 3227 1.2500000000000000e-01 3228 0.0000000000000000e+00 3229 -1.2500000000000000e-01 3230 0.0000000000000000e+00 3231 -1.2500000000000000e-01 3232 1.2500000000000000e-01 3233 0.0000000000000000e+00 3234 1.2500000000000000e-01 3235 0.0000000000000000e+00 3236 0.0000000000000000e+00 3237 0.0000000000000000e+00 3238 -1.2500000000000000e-01 3239 1.2500000000000000e-01 3240 0.0000000000000000e+00 3241 0.0000000000000000e+00 3242 0.0000000000000000e+00 3243 0.0000000000000000e+00 3244 0.0000000000000000e+00 3245 -1.2500000000000000e-01 3246 0.0000000000000000e+00 3247 1.2500000000000000e-01 3248 -1.2500000000000000e-01 3249 1.2500000000000000e-01 3250 1.2500000000000000e-01 3251 0.0000000000000000e+00 3252 0.0000000000000000e+00 3253 0.0000000000000000e+00 3254 1.2500000000000000e-01 3255 1.2500000000000000e-01 3256 0.0000000000000000e+00 3257 1.2500000000000000e-01 3258 -1.2500000000000000e-01 3259 -1.2500000000000000e-01 3260 0.0000000000000000e+00 3261 0.0000000000000000e+00 3262 1.2500000000000000e-01 3263 1.2500000000000000e-01 3264 1.2500000000000000e-01 3265 -1.2500000000000000e-01 3266 0.0000000000000000e+00 3267 -1.2500000000000000e-01 3268 0.0000000000000000e+00 3269 0.0000000000000000e+00 3270 0.0000000000000000e+00 3271 0.0000000000000000e+00 3272 0.0000000000000000e+00 3273 0.0000000000000000e+00 3274 -1.2500000000000000e-01 3275 -1.2500000000000000e-01 3276 0.0000000000000000e+00 3277 1.2500000000000000e-01 3278 0.0000000000000000e+00 3279 0.0000000000000000e+00 3280 0.0000000000000000e+00 3281 -1.2500000000000000e-01 3282 -1.2500000000000000e-01 3283 0.0000000000000000e+00 3284 0.0000000000000000e+00 3285 0.0000000000000000e+00 3286 0.0000000000000000e+00 3287 0.0000000000000000e+00 3288 0.0000000000000000e+00 3289 1.2500000000000000e-01 3290 1.2500000000000000e-01 3291 0.0000000000000000e+00 3292 -1.2500000000000000e-01 3293 1.2500000000000000e-01 3294 1.2500000000000000e-01 3295 1.2500000000000000e-01 3296 0.0000000000000000e+00 3297 0.0000000000000000e+00 3298 -1.2500000000000000e-01 3299 0.0000000000000000e+00 3300 1.2500000000000000e-01 3301 1.2500000000000000e-01 3302 0.0000000000000000e+00 3303 0.0000000000000000e+00 3304 0.0000000000000000e+00 3305 0.0000000000000000e+00 3306 0.0000000000000000e+00 3307 0.0000000000000000e+00 3308 1.2500000000000000e-01 3309 0.0000000000000000e+00 3310 0.0000000000000000e+00 3311 1.2500000000000000e-01 3312 1.2500000000000000e-01 3313 0.0000000000000000e+00 3314 0.0000000000000000e+00 3315 -1.2500000000000000e-01 3316 0.0000000000000000e+00 3317 0.0000000000000000e+00 3318 0.0000000000000000e+00 3319 0.0000000000000000e+00 3320 0.0000000000000000e+00 3321 -1.2500000000000000e-01 3322 -1.2500000000000000e-01 3323 1.2500000000000000e-01 3324 0.0000000000000000e+00 3325 -1.2500000000000000e-01 3326 1.2500000000000000e-01 3327 0.0000000000000000e+00 3328 -1.2500000000000000e-01 3329 0.0000000000000000e+00 3330 -1.2500000000000000e-01 3331 0.0000000000000000e+00 3332 0.0000000000000000e+00 3333 0.0000000000000000e+00 3334 0.0000000000000000e+00 3335 1.2500000000000000e-01 3336 1.2500000000000000e-01 3337 1.2500000000000000e-01 3338 0.0000000000000000e+00 3339 0.0000000000000000e+00 3340 1.2500000000000000e-01 3341 1.2500000000000000e-01 3342 -1.2500000000000000e-01 3343 0.0000000000000000e+00 3344 0.0000000000000000e+00 3345 1.2500000000000000e-01 3346 0.0000000000000000e+00 3347 0.0000000000000000e+00 3348 0.0000000000000000e+00 3349 0.0000000000000000e+00 3350 -1.2500000000000000e-01 3351 0.0000000000000000e+00 3352 1.2500000000000000e-01 3353 -1.2500000000000000e-01 3354 1.2500000000000000e-01 3355 0.0000000000000000e+00 3356 -1.2500000000000000e-01 3357 -1.2500000000000000e-01 3358 0.0000000000000000e+00 3359 0.0000000000000000e+00 3360 0.0000000000000000e+00 3361 1.2500000000000000e-01 3362 0.0000000000000000e+00 3363 0.0000000000000000e+00 3364 0.0000000000000000e+00 3365 0.0000000000000000e+00 3366 0.0000000000000000e+00 3367 0.0000000000000000e+00 3368 0.0000000000000000e+00 3369 0.0000000000000000e+00 3370 -1.2500000000000000e-01 3371 0.0000000000000000e+00 3372 -1.2500000000000000e-01 3373 1.2500000000000000e-01 3374 0.0000000000000000e+00 3375 -1.2500000000000000e-01 3376 1.2500000000000000e-01 3377 1.2500000000000000e-01 3378 0.0000000000000000e+00 3379 1.2500000000000000e-01 3380 0.0000000000000000e+00 3381 0.0000000000000000e+00 3382 0.0000000000000000e+00 3383 -1.2500000000000000e-01 3384 0.0000000000000000e+00 3385 1.2500000000000000e-01 3386 1.2500000000000000e-01 3387 0.0000000000000000e+00 3388 0.0000000000000000e+00 3389 0.0000000000000000e+00 3390 0.0000000000000000e+00 3391 -1.2500000000000000e-01 3392 0.0000000000000000e+00 3393 0.0000000000000000e+00 3394 0.0000000000000000e+00 3395 0.0000000000000000e+00 3396 0.0000000000000000e+00 3397 0.0000000000000000e+00 3398 6.2500000000000000e-02 3399 -1.2500000000000000e-01 3400 -6.2500000000000000e-02 3401 1.2500000000000000e-01 3402 0.0000000000000000e+00 3403 -6.2500000000000000e-02 3404 -6.2500000000000000e-02 3405 6.2500000000000000e-02 3406 6.2500000000000000e-02 3407 0.0000000000000000e+00 3408 -6.2500000000000000e-02 3409 6.2500000000000000e-02 3410 6.2500000000000000e-02 3411 -6.2500000000000000e-02 3412 1.2500000000000000e-01 3413 -6.2500000000000000e-02 3414 6.2500000000000000e-02 3415 6.2500000000000000e-02 3416 -6.2500000000000000e-02 3417 -6.2500000000000000e-02 3418 -6.2500000000000000e-02 3419 6.2500000000000000e-02 3420 6.2500000000000000e-02 3421 0.0000000000000000e+00 3422 -6.2500000000000000e-02 3423 0.0000000000000000e+00 3424 -1.2500000000000000e-01 3425 -6.2500000000000000e-02 3426 0.0000000000000000e+00 3427 -6.2500000000000000e-02 3428 1.2500000000000000e-01 3429 6.2500000000000000e-02 3430 6.2500000000000000e-02 3431 0.0000000000000000e+00 3432 -6.2500000000000000e-02 3433 -6.2500000000000000e-02 3434 6.2500000000000000e-02 3435 -6.2500000000000000e-02 3436 -6.2500000000000000e-02 3437 6.2500000000000000e-02 3438 0.0000000000000000e+00 3439 0.0000000000000000e+00 3440 -6.2500000000000000e-02 3441 0.0000000000000000e+00 3442 0.0000000000000000e+00 3443 -6.2500000000000000e-02 3444 -6.2500000000000000e-02 3445 1.2500000000000000e-01 3446 6.2500000000000000e-02 3447 1.2500000000000000e-01 3448 -6.2500000000000000e-02 3449 -6.2500000000000000e-02 3450 -6.2500000000000000e-02 3451 -6.2500000000000000e-02 3452 -6.2500000000000000e-02 3453 -6.2500000000000000e-02 3454 6.2500000000000000e-02 3455 0.0000000000000000e+00 3456 1.2500000000000000e-01 3457 -6.2500000000000000e-02 3458 0.0000000000000000e+00 3459 6.2500000000000000e-02 3460 -6.2500000000000000e-02 3461 0.0000000000000000e+00 3462 -6.2500000000000000e-02 3463 -1.2500000000000000e-01 3464 0.0000000000000000e+00 3465 -6.2500000000000000e-02 3466 1.2500000000000000e-01 3467 -6.2500000000000000e-02 3468 6.2500000000000000e-02 3469 -6.2500000000000000e-02 3470 1.2500000000000000e-01 3471 1.2500000000000000e-01 3472 6.2500000000000000e-02 3473 -6.2500000000000000e-02 3474 -1.2500000000000000e-01 3475 0.0000000000000000e+00 3476 6.2500000000000000e-02 3477 1.2500000000000000e-01 3478 -6.2500000000000000e-02 3479 -6.2500000000000000e-02 3480 -6.2500000000000000e-02 3481 0.0000000000000000e+00 3482 0.0000000000000000e+00 3483 0.0000000000000000e+00 3484 -1.2500000000000000e-01 3485 1.2500000000000000e-01 3486 0.0000000000000000e+00 3487 1.2500000000000000e-01 3488 -1.2500000000000000e-01 3489 0.0000000000000000e+00 3490 0.0000000000000000e+00 3491 1.2500000000000000e-01 3492 0.0000000000000000e+00 3493 1.2500000000000000e-01 3494 1.2500000000000000e-01 3495 1.2500000000000000e-01 3496 -1.2500000000000000e-01 3497 1.2500000000000000e-01 3498 1.2500000000000000e-01 3499 1.2500000000000000e-01 3500 -1.2500000000000000e-01 3501 0.0000000000000000e+00 3502 0.0000000000000000e+00 3503 -1.2500000000000000e-01 3504 -1.2500000000000000e-01 3505 -1.2500000000000000e-01 3506 0.0000000000000000e+00 3507 0.0000000000000000e+00 3508 -1.2500000000000000e-01 3509 0.0000000000000000e+00 3510 0.0000000000000000e+00 3511 0.0000000000000000e+00 3512 0.0000000000000000e+00 3513 0.0000000000000000e+00 3514 -1.2500000000000000e-01 3515 0.0000000000000000e+00 3516 -1.2500000000000000e-01 3517 -1.2500000000000000e-01 3518 -1.2500000000000000e-01 3519 0.0000000000000000e+00 3520 0.0000000000000000e+00 3521 0.0000000000000000e+00 3522 0.0000000000000000e+00 3523 1.2500000000000000e-01 3524 0.0000000000000000e+00 3525 0.0000000000000000e+00 3526 0.0000000000000000e+00 3527 0.0000000000000000e+00 3528 0.0000000000000000e+00 3529 0.0000000000000000e+00 3530 -1.2500000000000000e-01 3531 1.2500000000000000e-01 3532 1.2500000000000000e-01 3533 0.0000000000000000e+00 3534 -1.2500000000000000e-01 3535 0.0000000000000000e+00 3536 1.2500000000000000e-01 3537 1.2500000000000000e-01 3538 1.2500000000000000e-01 3539 0.0000000000000000e+00 3540 1.2500000000000000e-01 3541 -1.2500000000000000e-01 3542 -1.2500000000000000e-01 3543 0.0000000000000000e+00 3544 0.0000000000000000e+00 3545 -1.2500000000000000e-01 3546 0.0000000000000000e+00 3547 1.2500000000000000e-01 3548 -1.2500000000000000e-01 3549 0.0000000000000000e+00 3550 0.0000000000000000e+00 3551 1.2500000000000000e-01 3552 -1.2500000000000000e-01 3553 0.0000000000000000e+00 3554 0.0000000000000000e+00 3555 0.0000000000000000e+00 3556 1.2500000000000000e-01 3557 0.0000000000000000e+00 3558 -1.2500000000000000e-01 3559 0.0000000000000000e+00 3560 1.2500000000000000e-01 3561 -1.2500000000000000e-01 3562 0.0000000000000000e+00 3563 1.2500000000000000e-01 3564 0.0000000000000000e+00 3565 1.2500000000000000e-01 3566 0.0000000000000000e+00 3567 0.0000000000000000e+00 3568 -1.2500000000000000e-01 3569 -1.2500000000000000e-01 3570 -1.2500000000000000e-01 3571 1.2500000000000000e-01 3572 -1.2500000000000000e-01 3573 0.0000000000000000e+00 3574 0.0000000000000000e+00 3575 -1.2500000000000000e-01 3576 1.2500000000000000e-01 3577 -1.2500000000000000e-01 3578 0.0000000000000000e+00 3579 0.0000000000000000e+00 3580 0.0000000000000000e+00 3581 0.0000000000000000e+00 3582 -1.2500000000000000e-01 3583 -1.2500000000000000e-01 3584 -1.2500000000000000e-01 3585 1.2500000000000000e-01 3586 0.0000000000000000e+00 3587 -1.2500000000000000e-01 3588 -1.2500000000000000e-01 3589 0.0000000000000000e+00 3590 0.0000000000000000e+00 3591 0.0000000000000000e+00 3592 -1.2500000000000000e-01 3593 -1.2500000000000000e-01 3594 0.0000000000000000e+00 3595 0.0000000000000000e+00 3596 1.2500000000000000e-01 3597 1.2500000000000000e-01 3598 1.2500000000000000e-01 3599 0.0000000000000000e+00 3600 1.2500000000000000e-01 3601 0.0000000000000000e+00 3602 1.2500000000000000e-01 3603 1.2500000000000000e-01 3604 -1.2500000000000000e-01 3605 -1.2500000000000000e-01 3606 0.0000000000000000e+00 3607 0.0000000000000000e+00 3608 0.0000000000000000e+00 3609 0.0000000000000000e+00 3610 -1.2500000000000000e-01 3611 0.0000000000000000e+00 3612 0.0000000000000000e+00 3613 0.0000000000000000e+00 3614 0.0000000000000000e+00 3615 0.0000000000000000e+00 3616 0.0000000000000000e+00 3617 0.0000000000000000e+00 3618 1.2500000000000000e-01 3619 0.0000000000000000e+00 3620 1.2500000000000000e-01 3621 -1.2500000000000000e-01 3622 0.0000000000000000e+00 3623 0.0000000000000000e+00 3624 0.0000000000000000e+00 3625 0.0000000000000000e+00 3626 1.2500000000000000e-01 3627 0.0000000000000000e+00 3628 0.0000000000000000e+00 3629 0.0000000000000000e+00 3630 0.0000000000000000e+00 3631 0.0000000000000000e+00 3632 0.0000000000000000e+00 3633 1.2500000000000000e-01 3634 0.0000000000000000e+00 3635 0.0000000000000000e+00 3636 1.2500000000000000e-01 3637 0.0000000000000000e+00 3638 0.0000000000000000e+00 3639 0.0000000000000000e+00 3640 -1.2500000000000000e-01 3641 1.2500000000000000e-01 3642 0.0000000000000000e+00 3643 0.0000000000000000e+00 3644 1.2500000000000000e-01 3645 -1.2500000000000000e-01 3646 1.2500000000000000e-01 3647 0.0000000000000000e+00 3648 0.0000000000000000e+00 3649 0.0000000000000000e+00 3650 0.0000000000000000e+00 3651 -1.2500000000000000e-01 3652 0.0000000000000000e+00 3653 0.0000000000000000e+00 3654 1.2500000000000000e-01 3655 0.0000000000000000e+00 3656 1.2500000000000000e-01 3657 0.0000000000000000e+00 3658 0.0000000000000000e+00 3659 0.0000000000000000e+00 3660 0.0000000000000000e+00 3661 0.0000000000000000e+00 3662 0.0000000000000000e+00 3663 -1.2500000000000000e-01 3664 -1.2500000000000000e-01 3665 -1.2500000000000000e-01 3666 0.0000000000000000e+00 3667 1.2500000000000000e-01 3668 1.2500000000000000e-01 3669 0.0000000000000000e+00 3670 -1.2500000000000000e-01 3671 -1.2500000000000000e-01 3672 0.0000000000000000e+00 3673 -1.2500000000000000e-01 3674 1.2500000000000000e-01 3675 1.2500000000000000e-01 3676 0.0000000000000000e+00 3677 -1.2500000000000000e-01 3678 -1.2500000000000000e-01 3679 1.2500000000000000e-01 3680 0.0000000000000000e+00 3681 0.0000000000000000e+00 3682 0.0000000000000000e+00 3683 0.0000000000000000e+00 3684 1.2500000000000000e-01 3685 -1.2500000000000000e-01 3686 1.2500000000000000e-01 3687 0.0000000000000000e+00 3688 1.2500000000000000e-01 3689 0.0000000000000000e+00 3690 0.0000000000000000e+00 3691 0.0000000000000000e+00 3692 0.0000000000000000e+00 3693 -1.2500000000000000e-01 3694 -1.2500000000000000e-01 3695 1.2500000000000000e-01 3696 -1.2500000000000000e-01 3697 0.0000000000000000e+00 3698 0.0000000000000000e+00 3699 0.0000000000000000e+00 3700 1.2500000000000000e-01 3701 0.0000000000000000e+00 3702 0.0000000000000000e+00 3703 1.2500000000000000e-01 3704 0.0000000000000000e+00 3705 0.0000000000000000e+00 3706 0.0000000000000000e+00 3707 0.0000000000000000e+00 3708 0.0000000000000000e+00 3709 0.0000000000000000e+00 hypre-2.33.0/src/test/TEST_ams/mfem.Gz.00003000066400000000000000000001135611477326011500200170ustar00rootroot000000000000003710 5080 3710 -1.2500000000000000e-01 3711 0.0000000000000000e+00 3712 0.0000000000000000e+00 3713 -1.2500000000000000e-01 3714 -1.2500000000000000e-01 3715 -1.2500000000000000e-01 3716 0.0000000000000000e+00 3717 -1.2500000000000000e-01 3718 -1.2500000000000000e-01 3719 0.0000000000000000e+00 3720 0.0000000000000000e+00 3721 1.2500000000000000e-01 3722 1.2500000000000000e-01 3723 1.2500000000000000e-01 3724 -1.2500000000000000e-01 3725 0.0000000000000000e+00 3726 0.0000000000000000e+00 3727 1.2500000000000000e-01 3728 1.2500000000000000e-01 3729 -1.2500000000000000e-01 3730 -1.2500000000000000e-01 3731 -1.2500000000000000e-01 3732 1.2500000000000000e-01 3733 0.0000000000000000e+00 3734 -1.2500000000000000e-01 3735 -1.2500000000000000e-01 3736 1.2500000000000000e-01 3737 0.0000000000000000e+00 3738 0.0000000000000000e+00 3739 1.2500000000000000e-01 3740 0.0000000000000000e+00 3741 1.2500000000000000e-01 3742 -1.2500000000000000e-01 3743 -1.2500000000000000e-01 3744 -1.2500000000000000e-01 3745 0.0000000000000000e+00 3746 0.0000000000000000e+00 3747 -1.2500000000000000e-01 3748 -1.2500000000000000e-01 3749 0.0000000000000000e+00 3750 -1.2500000000000000e-01 3751 0.0000000000000000e+00 3752 -1.2500000000000000e-01 3753 -1.2500000000000000e-01 3754 0.0000000000000000e+00 3755 0.0000000000000000e+00 3756 -1.2500000000000000e-01 3757 -1.2500000000000000e-01 3758 0.0000000000000000e+00 3759 0.0000000000000000e+00 3760 -1.2500000000000000e-01 3761 -1.2500000000000000e-01 3762 0.0000000000000000e+00 3763 0.0000000000000000e+00 3764 -1.2500000000000000e-01 3765 -1.2500000000000000e-01 3766 -1.2500000000000000e-01 3767 -1.2500000000000000e-01 3768 0.0000000000000000e+00 3769 0.0000000000000000e+00 3770 0.0000000000000000e+00 3771 -1.2500000000000000e-01 3772 0.0000000000000000e+00 3773 -1.2500000000000000e-01 3774 0.0000000000000000e+00 3775 1.2500000000000000e-01 3776 1.2500000000000000e-01 3777 1.2500000000000000e-01 3778 1.2500000000000000e-01 3779 0.0000000000000000e+00 3780 0.0000000000000000e+00 3781 1.2500000000000000e-01 3782 2.5000000000000000e-01 3783 0.0000000000000000e+00 3784 -1.2500000000000000e-01 3785 0.0000000000000000e+00 3786 -1.2500000000000000e-01 3787 0.0000000000000000e+00 3788 0.0000000000000000e+00 3789 1.2500000000000000e-01 3790 1.2500000000000000e-01 3791 -1.2500000000000000e-01 3792 -1.2500000000000000e-01 3793 -1.2500000000000000e-01 3794 0.0000000000000000e+00 3795 0.0000000000000000e+00 3796 1.2500000000000000e-01 3797 0.0000000000000000e+00 3798 1.2500000000000000e-01 3799 0.0000000000000000e+00 3800 -1.2500000000000000e-01 3801 0.0000000000000000e+00 3802 1.2500000000000000e-01 3803 0.0000000000000000e+00 3804 -1.2500000000000000e-01 3805 0.0000000000000000e+00 3806 -1.2500000000000000e-01 3807 -1.2500000000000000e-01 3808 1.2500000000000000e-01 3809 1.2500000000000000e-01 3810 -1.2500000000000000e-01 3811 1.2500000000000000e-01 3812 1.2500000000000000e-01 3813 -1.2500000000000000e-01 3814 1.2500000000000000e-01 3815 -1.2500000000000000e-01 3816 0.0000000000000000e+00 3817 -1.2500000000000000e-01 3818 0.0000000000000000e+00 3819 0.0000000000000000e+00 3820 -1.2500000000000000e-01 3821 0.0000000000000000e+00 3822 -1.2500000000000000e-01 3823 -1.2500000000000000e-01 3824 -1.2500000000000000e-01 3825 0.0000000000000000e+00 3826 -1.2500000000000000e-01 3827 0.0000000000000000e+00 3828 0.0000000000000000e+00 3829 0.0000000000000000e+00 3830 0.0000000000000000e+00 3831 1.2500000000000000e-01 3832 0.0000000000000000e+00 3833 1.2500000000000000e-01 3834 1.2500000000000000e-01 3835 0.0000000000000000e+00 3836 1.2500000000000000e-01 3837 1.2500000000000000e-01 3838 1.2500000000000000e-01 3839 0.0000000000000000e+00 3840 1.2500000000000000e-01 3841 0.0000000000000000e+00 3842 -1.2500000000000000e-01 3843 -1.2500000000000000e-01 3844 0.0000000000000000e+00 3845 -1.2500000000000000e-01 3846 0.0000000000000000e+00 3847 1.2500000000000000e-01 3848 1.2500000000000000e-01 3849 0.0000000000000000e+00 3850 1.2500000000000000e-01 3851 -1.2500000000000000e-01 3852 -1.2500000000000000e-01 3853 -1.2500000000000000e-01 3854 -1.2500000000000000e-01 3855 0.0000000000000000e+00 3856 -1.2500000000000000e-01 3857 -1.2500000000000000e-01 3858 0.0000000000000000e+00 3859 0.0000000000000000e+00 3860 1.2500000000000000e-01 3861 1.2500000000000000e-01 3862 1.2500000000000000e-01 3863 1.2500000000000000e-01 3864 1.2500000000000000e-01 3865 1.2500000000000000e-01 3866 1.2500000000000000e-01 3867 0.0000000000000000e+00 3868 0.0000000000000000e+00 3869 1.2500000000000000e-01 3870 1.2500000000000000e-01 3871 0.0000000000000000e+00 3872 0.0000000000000000e+00 3873 1.2500000000000000e-01 3874 1.2500000000000000e-01 3875 1.2500000000000000e-01 3876 0.0000000000000000e+00 3877 1.2500000000000000e-01 3878 1.2500000000000000e-01 3879 0.0000000000000000e+00 3880 1.2500000000000000e-01 3881 1.2500000000000000e-01 3882 0.0000000000000000e+00 3883 -1.2500000000000000e-01 3884 -1.2500000000000000e-01 3885 -1.2500000000000000e-01 3886 0.0000000000000000e+00 3887 -1.2500000000000000e-01 3888 1.2500000000000000e-01 3889 0.0000000000000000e+00 3890 0.0000000000000000e+00 3891 0.0000000000000000e+00 3892 1.2500000000000000e-01 3893 -1.2500000000000000e-01 3894 -1.2500000000000000e-01 3895 -1.2500000000000000e-01 3896 -1.2500000000000000e-01 3897 0.0000000000000000e+00 3898 0.0000000000000000e+00 3899 1.2500000000000000e-01 3900 1.2500000000000000e-01 3901 1.2500000000000000e-01 3902 1.2500000000000000e-01 3903 -1.2500000000000000e-01 3904 0.0000000000000000e+00 3905 1.2500000000000000e-01 3906 1.2500000000000000e-01 3907 1.2500000000000000e-01 3908 0.0000000000000000e+00 3909 0.0000000000000000e+00 3910 0.0000000000000000e+00 3911 -1.2500000000000000e-01 3912 0.0000000000000000e+00 3913 1.2500000000000000e-01 3914 0.0000000000000000e+00 3915 0.0000000000000000e+00 3916 1.2500000000000000e-01 3917 1.2500000000000000e-01 3918 1.2500000000000000e-01 3919 1.2500000000000000e-01 3920 -1.2500000000000000e-01 3921 0.0000000000000000e+00 3922 0.0000000000000000e+00 3923 -1.2500000000000000e-01 3924 0.0000000000000000e+00 3925 0.0000000000000000e+00 3926 -1.2500000000000000e-01 3927 -1.2500000000000000e-01 3928 -1.2500000000000000e-01 3929 0.0000000000000000e+00 3930 -1.2500000000000000e-01 3931 -1.2500000000000000e-01 3932 0.0000000000000000e+00 3933 -1.2500000000000000e-01 3934 -1.2500000000000000e-01 3935 0.0000000000000000e+00 3936 0.0000000000000000e+00 3937 -1.2500000000000000e-01 3938 -1.2500000000000000e-01 3939 -1.2500000000000000e-01 3940 -1.2500000000000000e-01 3941 0.0000000000000000e+00 3942 0.0000000000000000e+00 3943 0.0000000000000000e+00 3944 -1.2500000000000000e-01 3945 0.0000000000000000e+00 3946 -1.2500000000000000e-01 3947 0.0000000000000000e+00 3948 -1.2500000000000000e-01 3949 0.0000000000000000e+00 3950 0.0000000000000000e+00 3951 -1.2500000000000000e-01 3952 0.0000000000000000e+00 3953 1.2500000000000000e-01 3954 1.2500000000000000e-01 3955 1.2500000000000000e-01 3956 1.2500000000000000e-01 3957 1.2500000000000000e-01 3958 1.2500000000000000e-01 3959 1.2500000000000000e-01 3960 1.2500000000000000e-01 3961 1.2500000000000000e-01 3962 0.0000000000000000e+00 3963 -1.2500000000000000e-01 3964 -1.2500000000000000e-01 3965 0.0000000000000000e+00 3966 1.2500000000000000e-01 3967 1.2500000000000000e-01 3968 1.2500000000000000e-01 3969 1.2500000000000000e-01 3970 0.0000000000000000e+00 3971 -1.2500000000000000e-01 3972 -1.2500000000000000e-01 3973 -1.2500000000000000e-01 3974 0.0000000000000000e+00 3975 0.0000000000000000e+00 3976 1.2500000000000000e-01 3977 0.0000000000000000e+00 3978 0.0000000000000000e+00 3979 -1.2500000000000000e-01 3980 -1.2500000000000000e-01 3981 0.0000000000000000e+00 3982 1.2500000000000000e-01 3983 1.2500000000000000e-01 3984 0.0000000000000000e+00 3985 0.0000000000000000e+00 3986 -1.2500000000000000e-01 3987 -1.2500000000000000e-01 3988 1.2500000000000000e-01 3989 1.2500000000000000e-01 3990 1.2500000000000000e-01 3991 1.2500000000000000e-01 3992 1.2500000000000000e-01 3993 1.2500000000000000e-01 3994 -1.2500000000000000e-01 3995 0.0000000000000000e+00 3996 0.0000000000000000e+00 3997 -1.2500000000000000e-01 3998 -1.2500000000000000e-01 3999 -1.2500000000000000e-01 4000 0.0000000000000000e+00 4001 -1.2500000000000000e-01 4002 -1.2500000000000000e-01 4003 1.2500000000000000e-01 4004 1.2500000000000000e-01 4005 1.2500000000000000e-01 4006 1.2500000000000000e-01 4007 -1.2500000000000000e-01 4008 0.0000000000000000e+00 4009 0.0000000000000000e+00 4010 0.0000000000000000e+00 4011 0.0000000000000000e+00 4012 -1.2500000000000000e-01 4013 1.2500000000000000e-01 4014 1.2500000000000000e-01 4015 1.2500000000000000e-01 4016 1.2500000000000000e-01 4017 1.2500000000000000e-01 4018 0.0000000000000000e+00 4019 1.2500000000000000e-01 4020 -1.2500000000000000e-01 4021 -1.2500000000000000e-01 4022 -1.2500000000000000e-01 4023 1.2500000000000000e-01 4024 0.0000000000000000e+00 4025 0.0000000000000000e+00 4026 1.2500000000000000e-01 4027 -1.2500000000000000e-01 4028 -1.2500000000000000e-01 4029 0.0000000000000000e+00 4030 -1.2500000000000000e-01 4031 -1.2500000000000000e-01 4032 1.2500000000000000e-01 4033 1.2500000000000000e-01 4034 1.2500000000000000e-01 4035 1.2500000000000000e-01 4036 -1.2500000000000000e-01 4037 0.0000000000000000e+00 4038 1.2500000000000000e-01 4039 0.0000000000000000e+00 4040 0.0000000000000000e+00 4041 0.0000000000000000e+00 4042 -1.2500000000000000e-01 4043 1.2500000000000000e-01 4044 -1.2500000000000000e-01 4045 0.0000000000000000e+00 4046 0.0000000000000000e+00 4047 -1.2500000000000000e-01 4048 -1.2500000000000000e-01 4049 -1.2500000000000000e-01 4050 0.0000000000000000e+00 4051 -1.2500000000000000e-01 4052 0.0000000000000000e+00 4053 0.0000000000000000e+00 4054 -1.2500000000000000e-01 4055 -1.2500000000000000e-01 4056 -2.5000000000000000e-01 4057 1.2500000000000000e-01 4058 1.2500000000000000e-01 4059 1.2500000000000000e-01 4060 1.2500000000000000e-01 4061 1.2500000000000000e-01 4062 -1.2500000000000000e-01 4063 0.0000000000000000e+00 4064 1.2500000000000000e-01 4065 0.0000000000000000e+00 4066 1.2500000000000000e-01 4067 0.0000000000000000e+00 4068 0.0000000000000000e+00 4069 1.2500000000000000e-01 4070 1.2500000000000000e-01 4071 0.0000000000000000e+00 4072 0.0000000000000000e+00 4073 -1.2500000000000000e-01 4074 -1.2500000000000000e-01 4075 -1.2500000000000000e-01 4076 0.0000000000000000e+00 4077 -1.2500000000000000e-01 4078 0.0000000000000000e+00 4079 -1.2500000000000000e-01 4080 -1.2500000000000000e-01 4081 0.0000000000000000e+00 4082 0.0000000000000000e+00 4083 -1.2500000000000000e-01 4084 -1.2500000000000000e-01 4085 0.0000000000000000e+00 4086 0.0000000000000000e+00 4087 -1.2500000000000000e-01 4088 -1.2500000000000000e-01 4089 0.0000000000000000e+00 4090 0.0000000000000000e+00 4091 -1.2500000000000000e-01 4092 -1.2500000000000000e-01 4093 -1.2500000000000000e-01 4094 -1.2500000000000000e-01 4095 0.0000000000000000e+00 4096 -1.2500000000000000e-01 4097 -1.2500000000000000e-01 4098 0.0000000000000000e+00 4099 0.0000000000000000e+00 4100 -1.2500000000000000e-01 4101 0.0000000000000000e+00 4102 -1.2500000000000000e-01 4103 0.0000000000000000e+00 4104 0.0000000000000000e+00 4105 0.0000000000000000e+00 4106 0.0000000000000000e+00 4107 -1.2500000000000000e-01 4108 0.0000000000000000e+00 4109 0.0000000000000000e+00 4110 0.0000000000000000e+00 4111 -1.2500000000000000e-01 4112 -1.2500000000000000e-01 4113 -1.2500000000000000e-01 4114 0.0000000000000000e+00 4115 -1.2500000000000000e-01 4116 -1.2500000000000000e-01 4117 0.0000000000000000e+00 4118 0.0000000000000000e+00 4119 0.0000000000000000e+00 4120 0.0000000000000000e+00 4121 -1.2500000000000000e-01 4122 -1.2500000000000000e-01 4123 1.2500000000000000e-01 4124 1.2500000000000000e-01 4125 1.2500000000000000e-01 4126 0.0000000000000000e+00 4127 1.2500000000000000e-01 4128 -1.2500000000000000e-01 4129 -1.2500000000000000e-01 4130 -1.2500000000000000e-01 4131 -1.2500000000000000e-01 4132 1.2500000000000000e-01 4133 0.0000000000000000e+00 4134 0.0000000000000000e+00 4135 1.2500000000000000e-01 4136 -1.2500000000000000e-01 4137 0.0000000000000000e+00 4138 0.0000000000000000e+00 4139 -1.2500000000000000e-01 4140 -1.2500000000000000e-01 4141 -1.2500000000000000e-01 4142 0.0000000000000000e+00 4143 -1.2500000000000000e-01 4144 -1.2500000000000000e-01 4145 -1.2500000000000000e-01 4146 0.0000000000000000e+00 4147 0.0000000000000000e+00 4148 0.0000000000000000e+00 4149 0.0000000000000000e+00 4150 -1.2500000000000000e-01 4151 1.2500000000000000e-01 4152 2.5000000000000000e-01 4153 1.2500000000000000e-01 4154 1.2500000000000000e-01 4155 2.5000000000000000e-01 4156 -1.2500000000000000e-01 4157 0.0000000000000000e+00 4158 -1.2500000000000000e-01 4159 0.0000000000000000e+00 4160 0.0000000000000000e+00 4161 0.0000000000000000e+00 4162 1.2500000000000000e-01 4163 1.2500000000000000e-01 4164 1.2500000000000000e-01 4165 1.2500000000000000e-01 4166 1.2500000000000000e-01 4167 1.2500000000000000e-01 4168 0.0000000000000000e+00 4169 1.2500000000000000e-01 4170 0.0000000000000000e+00 4171 1.2500000000000000e-01 4172 0.0000000000000000e+00 4173 1.2500000000000000e-01 4174 1.2500000000000000e-01 4175 0.0000000000000000e+00 4176 0.0000000000000000e+00 4177 1.2500000000000000e-01 4178 1.2500000000000000e-01 4179 1.2500000000000000e-01 4180 1.2500000000000000e-01 4181 0.0000000000000000e+00 4182 -1.2500000000000000e-01 4183 0.0000000000000000e+00 4184 1.2500000000000000e-01 4185 -1.2500000000000000e-01 4186 0.0000000000000000e+00 4187 0.0000000000000000e+00 4188 1.2500000000000000e-01 4189 0.0000000000000000e+00 4190 -1.2500000000000000e-01 4191 0.0000000000000000e+00 4192 -1.2500000000000000e-01 4193 -1.2500000000000000e-01 4194 0.0000000000000000e+00 4195 1.2500000000000000e-01 4196 1.2500000000000000e-01 4197 -1.2500000000000000e-01 4198 1.2500000000000000e-01 4199 1.2500000000000000e-01 4200 -1.2500000000000000e-01 4201 -1.2500000000000000e-01 4202 0.0000000000000000e+00 4203 0.0000000000000000e+00 4204 0.0000000000000000e+00 4205 -1.2500000000000000e-01 4206 -1.2500000000000000e-01 4207 1.2500000000000000e-01 4208 1.2500000000000000e-01 4209 1.2500000000000000e-01 4210 0.0000000000000000e+00 4211 1.2500000000000000e-01 4212 1.2500000000000000e-01 4213 0.0000000000000000e+00 4214 0.0000000000000000e+00 4215 1.2500000000000000e-01 4216 -1.2500000000000000e-01 4217 -1.2500000000000000e-01 4218 -1.2500000000000000e-01 4219 -1.2500000000000000e-01 4220 -1.2500000000000000e-01 4221 0.0000000000000000e+00 4222 0.0000000000000000e+00 4223 -1.2500000000000000e-01 4224 -1.2500000000000000e-01 4225 0.0000000000000000e+00 4226 0.0000000000000000e+00 4227 1.2500000000000000e-01 4228 0.0000000000000000e+00 4229 -1.2500000000000000e-01 4230 0.0000000000000000e+00 4231 1.2500000000000000e-01 4232 0.0000000000000000e+00 4233 1.2500000000000000e-01 4234 1.2500000000000000e-01 4235 -1.2500000000000000e-01 4236 -1.2500000000000000e-01 4237 -1.2500000000000000e-01 4238 1.2500000000000000e-01 4239 -1.2500000000000000e-01 4240 1.2500000000000000e-01 4241 -1.2500000000000000e-01 4242 -1.2500000000000000e-01 4243 -1.2500000000000000e-01 4244 0.0000000000000000e+00 4245 0.0000000000000000e+00 4246 -1.2500000000000000e-01 4247 -1.2500000000000000e-01 4248 0.0000000000000000e+00 4249 -1.2500000000000000e-01 4250 -1.2500000000000000e-01 4251 0.0000000000000000e+00 4252 0.0000000000000000e+00 4253 0.0000000000000000e+00 4254 -1.2500000000000000e-01 4255 -1.2500000000000000e-01 4256 0.0000000000000000e+00 4257 -1.2500000000000000e-01 4258 -1.2500000000000000e-01 4259 -1.2500000000000000e-01 4260 -1.2500000000000000e-01 4261 0.0000000000000000e+00 4262 -1.2500000000000000e-01 4263 -1.2500000000000000e-01 4264 0.0000000000000000e+00 4265 -1.2500000000000000e-01 4266 -1.2500000000000000e-01 4267 0.0000000000000000e+00 4268 -1.2500000000000000e-01 4269 0.0000000000000000e+00 4270 0.0000000000000000e+00 4271 0.0000000000000000e+00 4272 0.0000000000000000e+00 4273 0.0000000000000000e+00 4274 1.2500000000000000e-01 4275 1.2500000000000000e-01 4276 1.2500000000000000e-01 4277 1.2500000000000000e-01 4278 0.0000000000000000e+00 4279 0.0000000000000000e+00 4280 1.2500000000000000e-01 4281 0.0000000000000000e+00 4282 0.0000000000000000e+00 4283 1.2500000000000000e-01 4284 1.2500000000000000e-01 4285 1.2500000000000000e-01 4286 1.2500000000000000e-01 4287 1.2500000000000000e-01 4288 1.2500000000000000e-01 4289 0.0000000000000000e+00 4290 1.2500000000000000e-01 4291 0.0000000000000000e+00 4292 0.0000000000000000e+00 4293 1.2500000000000000e-01 4294 1.2500000000000000e-01 4295 0.0000000000000000e+00 4296 0.0000000000000000e+00 4297 -1.2500000000000000e-01 4298 0.0000000000000000e+00 4299 -1.2500000000000000e-01 4300 -1.2500000000000000e-01 4301 1.2500000000000000e-01 4302 1.2500000000000000e-01 4303 1.2500000000000000e-01 4304 -1.2500000000000000e-01 4305 -1.2500000000000000e-01 4306 -1.2500000000000000e-01 4307 0.0000000000000000e+00 4308 -1.2500000000000000e-01 4309 0.0000000000000000e+00 4310 0.0000000000000000e+00 4311 0.0000000000000000e+00 4312 0.0000000000000000e+00 4313 1.2500000000000000e-01 4314 0.0000000000000000e+00 4315 0.0000000000000000e+00 4316 0.0000000000000000e+00 4317 1.2500000000000000e-01 4318 -1.2500000000000000e-01 4319 -1.2500000000000000e-01 4320 0.0000000000000000e+00 4321 -1.2500000000000000e-01 4322 -1.2500000000000000e-01 4323 -1.2500000000000000e-01 4324 -1.2500000000000000e-01 4325 0.0000000000000000e+00 4326 -1.2500000000000000e-01 4327 0.0000000000000000e+00 4328 -1.2500000000000000e-01 4329 0.0000000000000000e+00 4330 0.0000000000000000e+00 4331 0.0000000000000000e+00 4332 -1.2500000000000000e-01 4333 0.0000000000000000e+00 4334 0.0000000000000000e+00 4335 -2.5000000000000000e-01 4336 -1.2500000000000000e-01 4337 -1.2500000000000000e-01 4338 -1.2500000000000000e-01 4339 0.0000000000000000e+00 4340 0.0000000000000000e+00 4341 -1.2500000000000000e-01 4342 0.0000000000000000e+00 4343 0.0000000000000000e+00 4344 1.2500000000000000e-01 4345 1.2500000000000000e-01 4346 -1.2500000000000000e-01 4347 -1.2500000000000000e-01 4348 -1.2500000000000000e-01 4349 1.2500000000000000e-01 4350 1.2500000000000000e-01 4351 1.2500000000000000e-01 4352 1.2500000000000000e-01 4353 1.2500000000000000e-01 4354 0.0000000000000000e+00 4355 -1.2500000000000000e-01 4356 0.0000000000000000e+00 4357 -1.2500000000000000e-01 4358 -1.2500000000000000e-01 4359 0.0000000000000000e+00 4360 1.2500000000000000e-01 4361 1.2500000000000000e-01 4362 1.2500000000000000e-01 4363 1.2500000000000000e-01 4364 1.2500000000000000e-01 4365 1.2500000000000000e-01 4366 1.2500000000000000e-01 4367 0.0000000000000000e+00 4368 0.0000000000000000e+00 4369 -1.2500000000000000e-01 4370 0.0000000000000000e+00 4371 -1.2500000000000000e-01 4372 -1.2500000000000000e-01 4373 1.2500000000000000e-01 4374 1.2500000000000000e-01 4375 1.2500000000000000e-01 4376 -1.2500000000000000e-01 4377 1.2500000000000000e-01 4378 0.0000000000000000e+00 4379 0.0000000000000000e+00 4380 -1.2500000000000000e-01 4381 -1.2500000000000000e-01 4382 -1.2500000000000000e-01 4383 1.2500000000000000e-01 4384 1.2500000000000000e-01 4385 0.0000000000000000e+00 4386 -1.2500000000000000e-01 4387 0.0000000000000000e+00 4388 0.0000000000000000e+00 4389 -1.2500000000000000e-01 4390 -1.2500000000000000e-01 4391 -1.2500000000000000e-01 4392 0.0000000000000000e+00 4393 0.0000000000000000e+00 4394 1.2500000000000000e-01 4395 1.2500000000000000e-01 4396 0.0000000000000000e+00 4397 0.0000000000000000e+00 4398 0.0000000000000000e+00 4399 0.0000000000000000e+00 4400 0.0000000000000000e+00 4401 1.2500000000000000e-01 4402 -1.2500000000000000e-01 4403 -1.2500000000000000e-01 4404 0.0000000000000000e+00 4405 1.2500000000000000e-01 4406 0.0000000000000000e+00 4407 1.2500000000000000e-01 4408 -1.2500000000000000e-01 4409 -1.2500000000000000e-01 4410 -1.2500000000000000e-01 4411 0.0000000000000000e+00 4412 0.0000000000000000e+00 4413 0.0000000000000000e+00 4414 1.2500000000000000e-01 4415 0.0000000000000000e+00 4416 -1.2500000000000000e-01 4417 -1.2500000000000000e-01 4418 0.0000000000000000e+00 4419 0.0000000000000000e+00 4420 0.0000000000000000e+00 4421 0.0000000000000000e+00 4422 0.0000000000000000e+00 4423 0.0000000000000000e+00 4424 0.0000000000000000e+00 4425 0.0000000000000000e+00 4426 0.0000000000000000e+00 4427 0.0000000000000000e+00 4428 0.0000000000000000e+00 4429 -1.2500000000000000e-01 4430 0.0000000000000000e+00 4431 0.0000000000000000e+00 4432 0.0000000000000000e+00 4433 -1.2500000000000000e-01 4434 1.2500000000000000e-01 4435 1.2500000000000000e-01 4436 0.0000000000000000e+00 4437 0.0000000000000000e+00 4438 -1.2500000000000000e-01 4439 -1.2500000000000000e-01 4440 0.0000000000000000e+00 4441 -1.2500000000000000e-01 4442 1.2500000000000000e-01 4443 1.2500000000000000e-01 4444 1.2500000000000000e-01 4445 0.0000000000000000e+00 4446 0.0000000000000000e+00 4447 -1.2500000000000000e-01 4448 0.0000000000000000e+00 4449 1.2500000000000000e-01 4450 0.0000000000000000e+00 4451 0.0000000000000000e+00 4452 0.0000000000000000e+00 4453 1.2500000000000000e-01 4454 0.0000000000000000e+00 4455 -1.2500000000000000e-01 4456 -1.2500000000000000e-01 4457 -1.2500000000000000e-01 4458 1.2500000000000000e-01 4459 0.0000000000000000e+00 4460 -1.2500000000000000e-01 4461 0.0000000000000000e+00 4462 -1.2500000000000000e-01 4463 0.0000000000000000e+00 4464 0.0000000000000000e+00 4465 0.0000000000000000e+00 4466 0.0000000000000000e+00 4467 0.0000000000000000e+00 4468 1.2500000000000000e-01 4469 1.2500000000000000e-01 4470 1.2500000000000000e-01 4471 0.0000000000000000e+00 4472 1.2500000000000000e-01 4473 0.0000000000000000e+00 4474 1.2500000000000000e-01 4475 -1.2500000000000000e-01 4476 -1.2500000000000000e-01 4477 0.0000000000000000e+00 4478 1.2500000000000000e-01 4479 -1.2500000000000000e-01 4480 0.0000000000000000e+00 4481 0.0000000000000000e+00 4482 0.0000000000000000e+00 4483 1.2500000000000000e-01 4484 -1.2500000000000000e-01 4485 0.0000000000000000e+00 4486 0.0000000000000000e+00 4487 0.0000000000000000e+00 4488 0.0000000000000000e+00 4489 0.0000000000000000e+00 4490 -1.2500000000000000e-01 4491 -1.2500000000000000e-01 4492 1.2500000000000000e-01 4493 1.2500000000000000e-01 4494 0.0000000000000000e+00 4495 0.0000000000000000e+00 4496 0.0000000000000000e+00 4497 0.0000000000000000e+00 4498 0.0000000000000000e+00 4499 -1.2500000000000000e-01 4500 0.0000000000000000e+00 4501 -1.2500000000000000e-01 4502 0.0000000000000000e+00 4503 -1.2500000000000000e-01 4504 1.2500000000000000e-01 4505 1.2500000000000000e-01 4506 1.2500000000000000e-01 4507 0.0000000000000000e+00 4508 0.0000000000000000e+00 4509 -1.2500000000000000e-01 4510 0.0000000000000000e+00 4511 1.2500000000000000e-01 4512 -1.2500000000000000e-01 4513 -1.2500000000000000e-01 4514 0.0000000000000000e+00 4515 0.0000000000000000e+00 4516 -1.2500000000000000e-01 4517 0.0000000000000000e+00 4518 0.0000000000000000e+00 4519 0.0000000000000000e+00 4520 0.0000000000000000e+00 4521 0.0000000000000000e+00 4522 0.0000000000000000e+00 4523 -1.2500000000000000e-01 4524 0.0000000000000000e+00 4525 0.0000000000000000e+00 4526 1.2500000000000000e-01 4527 0.0000000000000000e+00 4528 1.2500000000000000e-01 4529 1.2500000000000000e-01 4530 0.0000000000000000e+00 4531 1.2500000000000000e-01 4532 0.0000000000000000e+00 4533 1.2500000000000000e-01 4534 0.0000000000000000e+00 4535 1.2500000000000000e-01 4536 0.0000000000000000e+00 4537 0.0000000000000000e+00 4538 0.0000000000000000e+00 4539 -1.2500000000000000e-01 4540 0.0000000000000000e+00 4541 1.2500000000000000e-01 4542 1.2500000000000000e-01 4543 1.2500000000000000e-01 4544 0.0000000000000000e+00 4545 0.0000000000000000e+00 4546 1.2500000000000000e-01 4547 0.0000000000000000e+00 4548 1.2500000000000000e-01 4549 1.2500000000000000e-01 4550 0.0000000000000000e+00 4551 0.0000000000000000e+00 4552 0.0000000000000000e+00 4553 1.2500000000000000e-01 4554 0.0000000000000000e+00 4555 0.0000000000000000e+00 4556 0.0000000000000000e+00 4557 1.2500000000000000e-01 4558 1.2500000000000000e-01 4559 0.0000000000000000e+00 4560 -1.2500000000000000e-01 4561 0.0000000000000000e+00 4562 0.0000000000000000e+00 4563 1.2500000000000000e-01 4564 1.2500000000000000e-01 4565 1.2500000000000000e-01 4566 0.0000000000000000e+00 4567 1.2500000000000000e-01 4568 0.0000000000000000e+00 4569 0.0000000000000000e+00 4570 0.0000000000000000e+00 4571 0.0000000000000000e+00 4572 0.0000000000000000e+00 4573 0.0000000000000000e+00 4574 0.0000000000000000e+00 4575 0.0000000000000000e+00 4576 0.0000000000000000e+00 4577 1.2500000000000000e-01 4578 0.0000000000000000e+00 4579 0.0000000000000000e+00 4580 0.0000000000000000e+00 4581 1.2500000000000000e-01 4582 -1.2500000000000000e-01 4583 -1.2500000000000000e-01 4584 0.0000000000000000e+00 4585 -1.2500000000000000e-01 4586 1.2500000000000000e-01 4587 1.2500000000000000e-01 4588 0.0000000000000000e+00 4589 1.2500000000000000e-01 4590 0.0000000000000000e+00 4591 1.2500000000000000e-01 4592 0.0000000000000000e+00 4593 0.0000000000000000e+00 4594 1.2500000000000000e-01 4595 -1.2500000000000000e-01 4596 0.0000000000000000e+00 4597 0.0000000000000000e+00 4598 1.2500000000000000e-01 4599 0.0000000000000000e+00 4600 1.2500000000000000e-01 4601 1.2500000000000000e-01 4602 -1.2500000000000000e-01 4603 0.0000000000000000e+00 4604 0.0000000000000000e+00 4605 0.0000000000000000e+00 4606 0.0000000000000000e+00 4607 0.0000000000000000e+00 4608 0.0000000000000000e+00 4609 0.0000000000000000e+00 4610 0.0000000000000000e+00 4611 0.0000000000000000e+00 4612 1.2500000000000000e-01 4613 0.0000000000000000e+00 4614 0.0000000000000000e+00 4615 -1.2500000000000000e-01 4616 0.0000000000000000e+00 4617 1.2500000000000000e-01 4618 1.2500000000000000e-01 4619 1.2500000000000000e-01 4620 0.0000000000000000e+00 4621 1.2500000000000000e-01 4622 -1.2500000000000000e-01 4623 -1.2500000000000000e-01 4624 0.0000000000000000e+00 4625 0.0000000000000000e+00 4626 0.0000000000000000e+00 4627 0.0000000000000000e+00 4628 -1.2500000000000000e-01 4629 0.0000000000000000e+00 4630 1.2500000000000000e-01 4631 -1.2500000000000000e-01 4632 -1.2500000000000000e-01 4633 1.2500000000000000e-01 4634 0.0000000000000000e+00 4635 0.0000000000000000e+00 4636 -1.2500000000000000e-01 4637 0.0000000000000000e+00 4638 0.0000000000000000e+00 4639 0.0000000000000000e+00 4640 -1.2500000000000000e-01 4641 0.0000000000000000e+00 4642 1.2500000000000000e-01 4643 -1.2500000000000000e-01 4644 0.0000000000000000e+00 4645 1.2500000000000000e-01 4646 0.0000000000000000e+00 4647 1.2500000000000000e-01 4648 1.2500000000000000e-01 4649 0.0000000000000000e+00 4650 -1.2500000000000000e-01 4651 0.0000000000000000e+00 4652 0.0000000000000000e+00 4653 -1.2500000000000000e-01 4654 1.2500000000000000e-01 4655 0.0000000000000000e+00 4656 1.2500000000000000e-01 4657 1.2500000000000000e-01 4658 1.2500000000000000e-01 4659 1.2500000000000000e-01 4660 1.2500000000000000e-01 4661 0.0000000000000000e+00 4662 0.0000000000000000e+00 4663 0.0000000000000000e+00 4664 0.0000000000000000e+00 4665 0.0000000000000000e+00 4666 1.2500000000000000e-01 4667 -1.2500000000000000e-01 4668 -1.2500000000000000e-01 4669 0.0000000000000000e+00 4670 1.2500000000000000e-01 4671 0.0000000000000000e+00 4672 1.2500000000000000e-01 4673 -1.2500000000000000e-01 4674 -1.2500000000000000e-01 4675 -1.2500000000000000e-01 4676 0.0000000000000000e+00 4677 0.0000000000000000e+00 4678 0.0000000000000000e+00 4679 1.2500000000000000e-01 4680 0.0000000000000000e+00 4681 -1.2500000000000000e-01 4682 -1.2500000000000000e-01 4683 0.0000000000000000e+00 4684 0.0000000000000000e+00 4685 0.0000000000000000e+00 4686 0.0000000000000000e+00 4687 0.0000000000000000e+00 4688 0.0000000000000000e+00 4689 0.0000000000000000e+00 4690 0.0000000000000000e+00 4691 0.0000000000000000e+00 4692 0.0000000000000000e+00 4693 0.0000000000000000e+00 4694 -1.2500000000000000e-01 4695 -1.2500000000000000e-01 4696 0.0000000000000000e+00 4697 1.2500000000000000e-01 4698 1.2500000000000000e-01 4699 0.0000000000000000e+00 4700 1.2500000000000000e-01 4701 0.0000000000000000e+00 4702 0.0000000000000000e+00 4703 1.2500000000000000e-01 4704 1.2500000000000000e-01 4705 0.0000000000000000e+00 4706 -1.2500000000000000e-01 4707 0.0000000000000000e+00 4708 1.2500000000000000e-01 4709 0.0000000000000000e+00 4710 -1.2500000000000000e-01 4711 -1.2500000000000000e-01 4712 0.0000000000000000e+00 4713 0.0000000000000000e+00 4714 0.0000000000000000e+00 4715 0.0000000000000000e+00 4716 0.0000000000000000e+00 4717 -1.2500000000000000e-01 4718 1.2500000000000000e-01 4719 0.0000000000000000e+00 4720 0.0000000000000000e+00 4721 -1.2500000000000000e-01 4722 0.0000000000000000e+00 4723 0.0000000000000000e+00 4724 0.0000000000000000e+00 4725 -1.2500000000000000e-01 4726 -1.2500000000000000e-01 4727 1.2500000000000000e-01 4728 0.0000000000000000e+00 4729 -1.2500000000000000e-01 4730 0.0000000000000000e+00 4731 1.2500000000000000e-01 4732 -1.2500000000000000e-01 4733 0.0000000000000000e+00 4734 0.0000000000000000e+00 4735 -1.2500000000000000e-01 4736 0.0000000000000000e+00 4737 0.0000000000000000e+00 4738 0.0000000000000000e+00 4739 0.0000000000000000e+00 4740 1.2500000000000000e-01 4741 1.2500000000000000e-01 4742 -1.2500000000000000e-01 4743 0.0000000000000000e+00 4744 -1.2500000000000000e-01 4745 0.0000000000000000e+00 4746 1.2500000000000000e-01 4747 1.2500000000000000e-01 4748 -1.2500000000000000e-01 4749 -1.2500000000000000e-01 4750 0.0000000000000000e+00 4751 0.0000000000000000e+00 4752 0.0000000000000000e+00 4753 0.0000000000000000e+00 4754 0.0000000000000000e+00 4755 -1.2500000000000000e-01 4756 1.2500000000000000e-01 4757 0.0000000000000000e+00 4758 0.0000000000000000e+00 4759 -1.2500000000000000e-01 4760 0.0000000000000000e+00 4761 1.2500000000000000e-01 4762 1.2500000000000000e-01 4763 0.0000000000000000e+00 4764 0.0000000000000000e+00 4765 0.0000000000000000e+00 4766 1.2500000000000000e-01 4767 1.2500000000000000e-01 4768 0.0000000000000000e+00 4769 1.2500000000000000e-01 4770 1.2500000000000000e-01 4771 0.0000000000000000e+00 4772 1.2500000000000000e-01 4773 0.0000000000000000e+00 4774 1.2500000000000000e-01 4775 0.0000000000000000e+00 4776 0.0000000000000000e+00 4777 1.2500000000000000e-01 4778 1.2500000000000000e-01 4779 0.0000000000000000e+00 4780 0.0000000000000000e+00 4781 1.2500000000000000e-01 4782 -1.2500000000000000e-01 4783 0.0000000000000000e+00 4784 1.2500000000000000e-01 4785 0.0000000000000000e+00 4786 -1.2500000000000000e-01 4787 1.2500000000000000e-01 4788 1.2500000000000000e-01 4789 1.2500000000000000e-01 4790 0.0000000000000000e+00 4791 -1.2500000000000000e-01 4792 -1.2500000000000000e-01 4793 1.2500000000000000e-01 4794 0.0000000000000000e+00 4795 1.2500000000000000e-01 4796 0.0000000000000000e+00 4797 1.2500000000000000e-01 4798 0.0000000000000000e+00 4799 1.2500000000000000e-01 4800 1.2500000000000000e-01 4801 0.0000000000000000e+00 4802 1.2500000000000000e-01 4803 1.2500000000000000e-01 4804 1.2500000000000000e-01 4805 -1.2500000000000000e-01 4806 -1.2500000000000000e-01 4807 0.0000000000000000e+00 4808 0.0000000000000000e+00 4809 -1.2500000000000000e-01 4810 0.0000000000000000e+00 4811 1.2500000000000000e-01 4812 -1.2500000000000000e-01 4813 0.0000000000000000e+00 4814 0.0000000000000000e+00 4815 0.0000000000000000e+00 4816 -1.2500000000000000e-01 4817 0.0000000000000000e+00 4818 1.2500000000000000e-01 4819 -1.2500000000000000e-01 4820 0.0000000000000000e+00 4821 0.0000000000000000e+00 4822 0.0000000000000000e+00 4823 0.0000000000000000e+00 4824 0.0000000000000000e+00 4825 1.2500000000000000e-01 4826 -1.2500000000000000e-01 4827 0.0000000000000000e+00 4828 0.0000000000000000e+00 4829 0.0000000000000000e+00 4830 0.0000000000000000e+00 4831 -1.2500000000000000e-01 4832 0.0000000000000000e+00 4833 0.0000000000000000e+00 4834 0.0000000000000000e+00 4835 0.0000000000000000e+00 4836 0.0000000000000000e+00 4837 -1.2500000000000000e-01 4838 0.0000000000000000e+00 4839 0.0000000000000000e+00 4840 0.0000000000000000e+00 4841 0.0000000000000000e+00 4842 1.2500000000000000e-01 4843 1.2500000000000000e-01 4844 -1.2500000000000000e-01 4845 -1.2500000000000000e-01 4846 0.0000000000000000e+00 4847 1.2500000000000000e-01 4848 1.2500000000000000e-01 4849 1.2500000000000000e-01 4850 0.0000000000000000e+00 4851 1.2500000000000000e-01 4852 -1.2500000000000000e-01 4853 -1.2500000000000000e-01 4854 1.2500000000000000e-01 4855 0.0000000000000000e+00 4856 0.0000000000000000e+00 4857 1.2500000000000000e-01 4858 0.0000000000000000e+00 4859 0.0000000000000000e+00 4860 0.0000000000000000e+00 4861 0.0000000000000000e+00 4862 0.0000000000000000e+00 4863 0.0000000000000000e+00 4864 -1.2500000000000000e-01 4865 0.0000000000000000e+00 4866 0.0000000000000000e+00 4867 0.0000000000000000e+00 4868 1.2500000000000000e-01 4869 1.2500000000000000e-01 4870 0.0000000000000000e+00 4871 1.2500000000000000e-01 4872 0.0000000000000000e+00 4873 0.0000000000000000e+00 4874 0.0000000000000000e+00 4875 0.0000000000000000e+00 4876 1.2500000000000000e-01 4877 0.0000000000000000e+00 4878 -1.2500000000000000e-01 4879 0.0000000000000000e+00 4880 0.0000000000000000e+00 4881 -1.2500000000000000e-01 4882 0.0000000000000000e+00 4883 0.0000000000000000e+00 4884 0.0000000000000000e+00 4885 0.0000000000000000e+00 4886 1.2500000000000000e-01 4887 0.0000000000000000e+00 4888 0.0000000000000000e+00 4889 -1.2500000000000000e-01 4890 0.0000000000000000e+00 4891 0.0000000000000000e+00 4892 -1.2500000000000000e-01 4893 1.2500000000000000e-01 4894 1.2500000000000000e-01 4895 1.2500000000000000e-01 4896 1.2500000000000000e-01 4897 1.2500000000000000e-01 4898 0.0000000000000000e+00 4899 0.0000000000000000e+00 4900 0.0000000000000000e+00 4901 1.2500000000000000e-01 4902 0.0000000000000000e+00 4903 1.2500000000000000e-01 4904 0.0000000000000000e+00 4905 -1.2500000000000000e-01 4906 -1.2500000000000000e-01 4907 -1.2500000000000000e-01 4908 1.2500000000000000e-01 4909 1.2500000000000000e-01 4910 0.0000000000000000e+00 4911 0.0000000000000000e+00 4912 0.0000000000000000e+00 4913 1.2500000000000000e-01 4914 0.0000000000000000e+00 4915 1.2500000000000000e-01 4916 -1.2500000000000000e-01 4917 0.0000000000000000e+00 4918 0.0000000000000000e+00 4919 0.0000000000000000e+00 4920 0.0000000000000000e+00 4921 0.0000000000000000e+00 4922 1.2500000000000000e-01 4923 1.2500000000000000e-01 4924 0.0000000000000000e+00 4925 -1.2500000000000000e-01 4926 -1.2500000000000000e-01 4927 -1.2500000000000000e-01 4928 0.0000000000000000e+00 4929 1.2500000000000000e-01 4930 0.0000000000000000e+00 4931 0.0000000000000000e+00 4932 0.0000000000000000e+00 4933 1.2500000000000000e-01 4934 -1.2500000000000000e-01 4935 0.0000000000000000e+00 4936 1.2500000000000000e-01 4937 0.0000000000000000e+00 4938 0.0000000000000000e+00 4939 -1.2500000000000000e-01 4940 1.2500000000000000e-01 4941 0.0000000000000000e+00 4942 -1.2500000000000000e-01 4943 -1.2500000000000000e-01 4944 -1.2500000000000000e-01 4945 -1.2500000000000000e-01 4946 0.0000000000000000e+00 4947 0.0000000000000000e+00 4948 0.0000000000000000e+00 4949 0.0000000000000000e+00 4950 0.0000000000000000e+00 4951 0.0000000000000000e+00 4952 1.2500000000000000e-01 4953 1.2500000000000000e-01 4954 -1.2500000000000000e-01 4955 0.0000000000000000e+00 4956 1.2500000000000000e-01 4957 0.0000000000000000e+00 4958 0.0000000000000000e+00 4959 0.0000000000000000e+00 4960 -1.2500000000000000e-01 4961 1.2500000000000000e-01 4962 0.0000000000000000e+00 4963 1.2500000000000000e-01 4964 0.0000000000000000e+00 4965 1.2500000000000000e-01 4966 1.2500000000000000e-01 4967 1.2500000000000000e-01 4968 0.0000000000000000e+00 4969 -1.2500000000000000e-01 4970 0.0000000000000000e+00 4971 0.0000000000000000e+00 4972 0.0000000000000000e+00 4973 -1.2500000000000000e-01 4974 0.0000000000000000e+00 4975 0.0000000000000000e+00 4976 0.0000000000000000e+00 4977 1.2500000000000000e-01 4978 1.2500000000000000e-01 4979 1.2500000000000000e-01 4980 1.2500000000000000e-01 4981 -1.2500000000000000e-01 4982 0.0000000000000000e+00 4983 -1.2500000000000000e-01 4984 0.0000000000000000e+00 4985 0.0000000000000000e+00 4986 1.2500000000000000e-01 4987 -1.2500000000000000e-01 4988 -1.2500000000000000e-01 4989 0.0000000000000000e+00 4990 0.0000000000000000e+00 4991 0.0000000000000000e+00 4992 0.0000000000000000e+00 4993 0.0000000000000000e+00 4994 0.0000000000000000e+00 4995 0.0000000000000000e+00 4996 0.0000000000000000e+00 4997 0.0000000000000000e+00 4998 0.0000000000000000e+00 4999 1.2500000000000000e-01 5000 0.0000000000000000e+00 5001 0.0000000000000000e+00 5002 1.2500000000000000e-01 5003 1.2500000000000000e-01 5004 0.0000000000000000e+00 5005 1.2500000000000000e-01 5006 0.0000000000000000e+00 5007 0.0000000000000000e+00 5008 -1.2500000000000000e-01 5009 -1.2500000000000000e-01 5010 0.0000000000000000e+00 5011 -1.2500000000000000e-01 5012 1.2500000000000000e-01 5013 0.0000000000000000e+00 5014 0.0000000000000000e+00 5015 1.2500000000000000e-01 5016 0.0000000000000000e+00 5017 0.0000000000000000e+00 5018 0.0000000000000000e+00 5019 1.2500000000000000e-01 5020 1.2500000000000000e-01 5021 1.2500000000000000e-01 5022 0.0000000000000000e+00 5023 1.2500000000000000e-01 5024 -1.2500000000000000e-01 5025 0.0000000000000000e+00 5026 1.2500000000000000e-01 5027 -1.2500000000000000e-01 5028 0.0000000000000000e+00 5029 -1.2500000000000000e-01 5030 0.0000000000000000e+00 5031 1.2500000000000000e-01 5032 -1.2500000000000000e-01 5033 0.0000000000000000e+00 5034 0.0000000000000000e+00 5035 0.0000000000000000e+00 5036 -1.2500000000000000e-01 5037 1.2500000000000000e-01 5038 -1.2500000000000000e-01 5039 0.0000000000000000e+00 5040 -1.2500000000000000e-01 5041 0.0000000000000000e+00 5042 0.0000000000000000e+00 5043 1.2500000000000000e-01 5044 0.0000000000000000e+00 5045 1.2500000000000000e-01 5046 0.0000000000000000e+00 5047 -1.2500000000000000e-01 5048 1.2500000000000000e-01 5049 0.0000000000000000e+00 5050 0.0000000000000000e+00 5051 -1.2500000000000000e-01 5052 0.0000000000000000e+00 5053 -1.2500000000000000e-01 5054 0.0000000000000000e+00 5055 0.0000000000000000e+00 5056 1.2500000000000000e-01 5057 0.0000000000000000e+00 5058 1.2500000000000000e-01 5059 1.2500000000000000e-01 5060 0.0000000000000000e+00 5061 0.0000000000000000e+00 5062 0.0000000000000000e+00 5063 0.0000000000000000e+00 5064 0.0000000000000000e+00 5065 -1.2500000000000000e-01 5066 0.0000000000000000e+00 5067 0.0000000000000000e+00 5068 1.2500000000000000e-01 5069 0.0000000000000000e+00 5070 -1.2500000000000000e-01 5071 0.0000000000000000e+00 5072 0.0000000000000000e+00 5073 1.2500000000000000e-01 5074 1.2500000000000000e-01 5075 0.0000000000000000e+00 5076 0.0000000000000000e+00 5077 0.0000000000000000e+00 5078 0.0000000000000000e+00 5079 -1.2500000000000000e-01 5080 0.0000000000000000e+00 hypre-2.33.0/src/test/TEST_ams/mfem.M.00000000066400000000000000000015030611477326011500176270ustar00rootroot000000000000001 1075 1 1075 1 1 6.2499999999999986e-03 2 2 1.0416666958333331e-02 3 3 6.2499999999999986e-03 4 4 1.0416666666666666e-02 5 5 6.2500003749999984e-03 5 518 -4.1666666666666665e-11 5 516 1.3552527156068805e-19 5 517 -1.0416666666666657e-11 5 3470 -4.1666666666666658e-11 5 3463 1.2499999999999998e-10 5 2888 -1.0416666666666665e-11 5 3469 -1.3552527156068805e-19 5 3462 1.0416666666666664e-03 5 3461 1.0416666341406014e-11 5 2887 -1.0416666666666664e-03 5 5053 1.2499999999999998e-10 5 4353 -1.0416666666666668e-11 5 5046 -3.1250000000000002e-11 5 5047 2.0833333333333339e-11 5 4773 3.1250000000000002e-11 5 4350 6.2500000000000004e-11 6 6 6.2499999999999986e-03 7 7 2.0833333333333329e-02 8 8 4.9999999999999989e-02 8 850 -2.0833333333333329e-03 8 539 -1.0416666666666664e-02 8 530 -2.0833333333333329e-03 8 22 -1.0416666666666662e-03 8 831 -2.0833333333333329e-03 8 538 -4.1666666666666657e-03 8 537 -1.0416666666666664e-02 8 840 2.0833333333333329e-03 8 19 5.2083333333333322e-03 8 18 -1.0416666666666664e-03 8 535 4.1666666666666657e-03 8 536 -4.1666666666666657e-03 8 525 1.0416666666666664e-02 9 9 6.2499999999999986e-03 10 10 2.0833333333333332e-02 11 11 4.9999999999999989e-02 11 502 -2.0833333333333329e-03 11 837 -1.0416666666666664e-02 11 846 -2.0833333333333329e-03 11 20 -1.0416666666666664e-03 11 836 -4.1666666666666657e-03 11 19 5.2083333333333322e-03 11 840 2.0833333333333329e-03 11 835 -1.0416666666666664e-02 11 831 -2.0833333333333329e-03 11 18 -1.0416666666666664e-03 11 834 4.1666666666666657e-03 11 505 4.1666666666666657e-03 11 828 1.0416666666666664e-02 12 12 6.2499999999999986e-03 13 13 2.0833333333333329e-02 14 14 4.9999999999999989e-02 14 872 -2.0833333333333329e-03 14 511 -1.0416666666666664e-02 14 848 -2.0833333333333329e-03 14 21 -1.0416666666666664e-03 14 510 -4.1666666666666657e-03 14 19 5.2083333333333322e-03 14 846 -2.0833333333333329e-03 14 509 -1.0416666666666664e-02 14 502 -2.0833333333333329e-03 14 20 -1.0416666666666662e-03 14 507 4.1666666666666657e-03 14 508 -4.1666666666666657e-03 14 497 1.0416666666666664e-02 15 15 6.2499999999999986e-03 16 16 2.0833333333333332e-02 17 17 4.9999999999999989e-02 17 530 -2.0833333333333329e-03 17 877 -1.0416666666666664e-02 17 850 -2.0833333333333329e-03 17 22 -1.0416666666666664e-03 17 852 4.1666666666666657e-03 17 19 5.2083333333333322e-03 17 848 -2.0833333333333329e-03 17 876 -1.0416666666666664e-02 17 872 -2.0833333333333329e-03 17 21 -1.0416666666666664e-03 17 875 4.1666666666666657e-03 17 533 4.1666666666666657e-03 17 867 1.0416666666666664e-02 18 18 1.2499999999999997e-02 18 836 -1.3552527156068805e-19 18 834 -1.3552527156068805e-19 18 835 -1.0416666666666664e-03 18 11 -1.0416666666666664e-03 18 536 -1.3552527156068805e-19 18 831 4.3368086899420177e-19 18 538 1.3552527156068805e-19 18 537 -1.0416666666666664e-03 18 840 -2.1684043449710089e-19 18 8 -1.0416666666666664e-03 18 19 4.3368086899420177e-19 19 19 4.1666666666666664e-02 19 539 -2.0833333333333333e-03 19 877 -2.0833333333333329e-03 19 850 -6.2499999999999986e-03 19 22 4.1202858928001372e-19 19 852 1.0416666666666660e-03 19 17 5.2083333333333330e-03 19 876 -2.0833333333333333e-03 19 511 -2.0833333333333329e-03 19 848 -6.2499999999999995e-03 19 21 4.1202858928001372e-19 19 510 -1.0416666666666660e-03 19 14 5.2083333333333330e-03 19 509 -2.0833333333333333e-03 19 837 -2.0833333333333329e-03 19 846 -6.2499999999999986e-03 19 20 4.1202858928001372e-19 19 836 -1.0416666666666660e-03 19 11 5.2083333333333330e-03 19 835 -2.0833333333333333e-03 19 538 -1.0416666666666660e-03 19 537 -2.0833333333333329e-03 19 840 6.2499999999999995e-03 19 8 5.2083333333333330e-03 19 18 4.1202858928001372e-19 20 20 1.2499999999999997e-02 20 510 -1.3552527156068805e-19 20 507 -1.3552527156068805e-19 20 509 -1.0416666666666662e-03 20 14 -1.0416666666666662e-03 20 505 1.3552527156068805e-19 20 502 4.3368086899420177e-19 20 836 1.3552527156068805e-19 20 837 -1.0416666666666664e-03 20 846 2.1684043449710089e-19 20 11 -1.0416666666666664e-03 20 19 4.3368086899420177e-19 21 21 1.2499999999999997e-02 21 852 1.3552527156068805e-19 21 875 -1.3552527156068805e-19 21 876 -1.0416666666666664e-03 21 17 -1.0416666666666664e-03 21 508 -1.3552527156068805e-19 21 872 4.3368086899420177e-19 21 510 1.3552527156068805e-19 21 511 -1.0416666666666664e-03 21 848 2.1684043449710089e-19 21 14 -1.0416666666666664e-03 21 19 4.3368086899420177e-19 22 22 1.2499999999999997e-02 22 538 -1.3552527156068805e-19 22 535 -1.3552527156068805e-19 22 539 -1.0416666666666662e-03 22 8 -1.0416666666666662e-03 22 533 1.3552527156068805e-19 22 530 4.3368086899420177e-19 22 852 -1.3552527156068805e-19 22 877 -1.0416666666666664e-03 22 850 2.1684043449710089e-19 22 17 -1.0416666666666664e-03 22 19 4.3368086899420177e-19 23 23 1.2499999999999997e-02 23 564 1.3552527156068805e-19 23 506 1.3552527156068805e-19 23 513 1.3552527156068805e-19 23 512 -1.0416666666666664e-03 23 561 2.1684043449710089e-19 23 27 -1.0416666666666664e-03 23 26 4.3368086899420177e-19 23 503 -1.3552527156068805e-19 23 570 -1.0416666666666662e-03 23 502 4.3368086899420177e-19 23 25 -1.0416666666666662e-03 24 24 2.0833333333333332e-02 25 25 4.9999999999999996e-02 25 561 -2.0833333333333329e-03 25 572 -1.0416666666666664e-02 25 571 -4.1666666666666657e-03 25 550 2.0833333333333329e-03 25 564 4.1666666666666657e-03 25 558 1.0416666666666664e-02 25 555 2.0833333333333329e-03 25 26 5.2083333333333322e-03 25 30 -1.0416666666666664e-03 25 503 4.1666666666666657e-03 25 570 -1.0416666666666664e-02 25 502 -2.0833333333333329e-03 25 23 -1.0416666666666662e-03 26 26 2.0833333541666665e-02 26 570 -2.0833333333333333e-03 26 515 -2.0833333333333333e-03 26 562 -3.1250000520833335e-03 26 36 4.0414059911758274e-19 26 560 -1.0416666666666667e-10 26 554 -3.6295685768920020e-28 26 33 9.5018296033870872e-28 26 564 1.0416666666666660e-03 26 558 2.0833333333333329e-03 26 555 3.1250000520833326e-03 26 25 5.2083333333333330e-03 26 30 7.8879958422294972e-21 26 513 -1.0416666666666660e-03 26 512 -2.0833333333333329e-03 26 561 -6.2499999999999986e-03 26 27 5.2083333333333330e-03 26 23 4.1202858928001372e-19 26 5053 2.2851328271989659e-27 27 27 4.9999999999999989e-02 27 562 -2.0833333333333329e-03 27 515 -1.0416666666666664e-02 27 517 -2.0833333333333329e-03 27 36 -1.0416666666666664e-03 27 502 -2.0833333333333329e-03 27 514 -4.1666666666666657e-03 27 506 4.1666666666666657e-03 27 499 1.0416666666666664e-02 27 513 -4.1666666666666657e-03 27 512 -1.0416666666666664e-02 27 561 -2.0833333333333329e-03 27 26 5.2083333333333322e-03 27 23 -1.0416666666666664e-03 28 28 6.2499999999999986e-03 29 29 1.0416666958333331e-02 30 30 6.2500001041666652e-03 30 560 2.0194839173657902e-27 30 574 -2.0194839173657902e-27 30 33 1.0416666666666671e-11 30 554 -1.0416666666666663e-11 30 571 -1.3552527156068805e-19 30 550 1.0416666666666666e-11 30 564 -1.3552527156068805e-19 30 558 1.0416666666666664e-03 30 555 -3.2526065497682560e-19 30 25 -1.0416666666666664e-03 31 31 1.0416666958333331e-02 32 32 1.0416666666666666e-10 33 33 4.9999999999999993e-10 33 518 -6.2499999999999991e-11 33 517 -5.2083333333333334e-11 33 562 2.2470898404921788e-28 33 36 1.0416666666666663e-11 33 560 2.2214323091023692e-27 33 555 -2.0194839173657902e-27 33 26 1.6155871338926322e-27 33 550 5.2083333333333334e-11 33 554 6.2499999999999991e-11 33 30 1.0416666666666671e-11 33 574 -6.2499999999999991e-11 33 824 -8.0779356694631609e-27 33 825 -6.2500000000000004e-11 33 5057 -6.2499999999999991e-11 33 5053 -6.2500000000000004e-11 34 34 2.0833333333333334e-10 35 35 6.2499999999999986e-03 36 36 6.2500001041666652e-03 36 518 2.0194839173657902e-27 36 560 -2.0194839173657902e-27 36 33 1.0416666666666663e-11 36 513 -1.3552527156068805e-19 36 26 4.3368087545655031e-19 36 562 -1.0842021886413758e-19 36 514 1.3552527156068805e-19 36 515 -1.0416666666666664e-03 36 517 -1.0416666232985788e-11 36 27 -1.0416666666666664e-03 36 5053 1.0416666666666671e-11 37 37 1.0416666666666666e-10 38 38 1.2499999999999997e-02 38 509 1.3552527156068805e-19 38 512 -1.3552527156068805e-19 38 43 2.1684043449710089e-19 38 502 -4.3368086899420177e-19 38 499 -1.3552527156068805e-19 38 506 1.0416666666666664e-03 38 41 -1.0416666666666664e-03 38 497 1.3552527156068805e-19 38 40 -1.0416666666666664e-03 38 39 4.3368086899420177e-19 38 507 1.0416666666666664e-03 39 39 4.1666666666666657e-02 39 508 -2.0833333333333329e-03 39 873 2.0833333333333333e-03 39 46 4.1202858928001372e-19 39 501 1.0416666666666660e-03 39 886 -2.0833333333333329e-03 39 47 5.2083333333333330e-03 39 521 -2.0833333333333333e-03 39 48 4.1202858928001372e-19 39 495 1.0416666666666660e-03 39 516 2.0833333333333329e-03 39 514 -2.0833333333333333e-03 39 42 4.1202858928001372e-19 39 499 1.0416666666666660e-03 39 506 2.0833333333333329e-03 39 41 5.2083333333333330e-03 39 497 1.0416666666666660e-03 39 40 5.2083333333333330e-03 39 507 2.0833333333333333e-03 39 38 4.1202858928001372e-19 39 2868 5.2083333333333330e-03 40 40 4.9999999999999989e-02 40 508 -1.0416666666666664e-02 40 872 2.0833333333333329e-03 40 46 -1.0416666666666664e-03 40 511 -4.1666666666666657e-03 40 848 2.0833333333333329e-03 40 45 5.2083333333333322e-03 40 510 -1.0416666666666664e-02 40 846 2.0833333333333329e-03 40 44 -1.0416666666666662e-03 40 509 -4.1666666666666657e-03 40 502 2.0833333333333329e-03 40 43 5.2083333333333322e-03 40 497 4.1666666666666657e-03 40 39 5.2083333333333322e-03 40 507 1.0416666666666664e-02 40 38 -1.0416666666666664e-03 41 41 4.9999999999999989e-02 41 562 2.0833333333333329e-03 41 515 -4.1666666666666657e-03 41 517 2.0833333333333329e-03 41 513 -1.0416666666666664e-02 41 561 2.0833333333333329e-03 41 51 -1.0416666666666662e-03 41 512 -4.1666666666666657e-03 41 43 5.2083333333333322e-03 41 502 2.0833333333333329e-03 41 514 -1.0416666666666664e-02 41 42 -1.0416666666666662e-03 41 499 4.1666666666666657e-03 41 506 1.0416666666666664e-02 41 39 5.2083333333333322e-03 41 38 -1.0416666666666664e-03 41 2865 5.2083333333333322e-03 42 42 1.2499999999999997e-02 42 515 1.3552527156068805e-19 42 517 -4.3368086899420177e-19 42 495 -1.3552527156068805e-19 42 516 1.0416666666666664e-03 42 499 1.3552527156068805e-19 42 41 -1.0416666666666662e-03 42 39 4.3368086899420177e-19 42 514 -1.0416666666666662e-03 42 3462 1.3552527156068805e-19 42 2865 2.1684043449710089e-19 42 2868 -1.0416666666666664e-03 43 43 4.1666666666666657e-02 43 513 -2.0833333333333329e-03 43 563 2.0833333333333333e-03 43 561 6.2499999999999995e-03 43 51 4.1202858928001372e-19 43 864 1.0416666666666664e-03 43 863 -6.2500000000000003e-03 43 862 1.0416666666666664e-03 43 847 2.0833333333333329e-03 43 510 -2.0833333333333333e-03 43 846 6.2499999999999995e-03 43 44 4.1202858928001372e-19 43 509 -1.0416666666666664e-03 43 507 2.0833333333333329e-03 43 40 5.2083333333333330e-03 43 512 -1.0416666666666664e-03 43 41 5.2083333333333330e-03 43 506 2.0833333333333333e-03 43 502 6.2500000000000003e-03 43 38 2.6745065309554533e-19 43 3468 2.0833333333333329e-03 43 2866 5.2083333333333330e-03 43 3413 2.0833333333333333e-03 43 2869 2.6745065309554533e-19 43 2860 5.2083333333333330e-03 44 44 1.2499999999999997e-02 44 511 1.3552527156068805e-19 44 865 -1.0842021724855044e-19 44 45 4.3368086899420177e-19 44 848 -4.3368086899420177e-19 44 862 -1.0842021724855044e-19 44 847 1.0416666666666662e-03 44 509 -1.3552527156068805e-19 44 40 -1.0416666666666662e-03 44 43 4.3368086899420177e-19 44 510 -1.0416666666666662e-03 44 846 -4.3368086899420177e-19 44 2860 -1.0416666666666662e-03 45 45 4.1666666666666664e-02 45 884 -6.2499999999999986e-03 45 885 1.0416666666666664e-03 45 937 2.0833333333333329e-03 45 888 -2.0833333333333333e-03 45 883 -6.2500000000000003e-03 45 49 3.7587087034409578e-19 45 881 1.0416666666666664e-03 45 873 2.0833333333333329e-03 45 47 5.2083333333333330e-03 45 508 -2.0833333333333333e-03 45 872 6.2499999999999986e-03 45 46 2.6745065309554533e-19 45 511 -1.0416666666666664e-03 45 510 -2.0833333333333329e-03 45 40 5.2083333333333330e-03 45 865 -1.0416666666666664e-03 45 847 2.0833333333333333e-03 45 848 6.2500000000000003e-03 45 44 3.7587087034409578e-19 45 3410 2.0833333333333329e-03 45 3409 2.0833333333333333e-03 45 2858 2.6745065309554533e-19 45 2861 5.2083333333333330e-03 45 2860 5.2083333333333330e-03 46 46 1.2499999999999997e-02 46 497 -1.3552527156068805e-19 46 501 1.3552527156068805e-19 46 39 4.3368086899420177e-19 46 881 -1.3552527156068805e-19 46 873 1.0416666666666662e-03 46 47 -1.0416666666666662e-03 46 511 -1.3552527156068805e-19 46 40 -1.0416666666666664e-03 46 45 2.1684043449710089e-19 46 508 -1.0416666666666664e-03 46 872 -4.3368086899420177e-19 47 47 4.9999999999999996e-02 47 883 -2.0833333333333329e-03 47 887 -4.1666666666666657e-03 47 888 -1.0416666666666664e-02 47 50 5.2083333333333322e-03 47 49 -1.0416666666666662e-03 47 501 4.1666666666666657e-03 47 886 -1.0416666666666664e-02 47 39 5.2083333333333322e-03 47 48 -1.0416666666666664e-03 47 881 4.1666666666666657e-03 47 873 1.0416666666666664e-02 47 872 2.0833333333333329e-03 47 45 5.2083333333333322e-03 47 46 -1.0416666666666662e-03 48 48 1.2499999999999997e-02 48 520 1.3552527156068805e-19 48 887 -1.3552527156068805e-19 48 50 2.1684043449710089e-19 48 501 -1.3552527156068805e-19 48 886 -1.0416666666666664e-03 48 47 -1.0416666666666664e-03 48 495 1.3552527156068805e-19 48 39 4.3368086899420177e-19 48 521 -1.0416666666666664e-03 48 2868 -1.0416666666666664e-03 49 49 1.2499999999999997e-02 49 885 -1.3552527156068805e-19 49 881 1.0842021724855044e-19 49 45 4.3368086899420177e-19 49 883 4.3368086899420177e-19 49 887 1.0842021724855044e-19 49 888 -1.0416666666666662e-03 49 47 -1.0416666666666662e-03 49 933 1.3552527156068805e-19 49 50 4.3368086899420177e-19 49 937 1.0416666666666662e-03 49 2861 -1.0416666666666662e-03 50 50 4.1666666666666657e-02 50 936 1.0416666666666664e-03 50 520 -1.0416666666666664e-03 50 521 -2.0833333333333329e-03 50 886 -2.0833333333333333e-03 50 48 2.6745065309554533e-19 50 887 -1.0416666666666664e-03 50 888 -2.0833333333333329e-03 50 47 5.2083333333333330e-03 50 933 1.0416666666666664e-03 50 937 2.0833333333333333e-03 50 49 4.1202858928001372e-19 50 3039 2.0833333333333329e-03 50 3036 2.0833333333333333e-03 50 2862 2.6745065309554533e-19 50 3416 2.0833333333333329e-03 50 2863 5.2083333333333330e-03 50 3469 2.0833333333333333e-03 50 2867 4.1202858928001372e-19 50 2868 5.2083333333333330e-03 50 2861 5.2083333333333330e-03 51 51 1.2499999999999997e-02 51 515 -1.0842021724855044e-19 51 562 -4.3368086899420177e-19 51 512 1.0842021724855044e-19 51 513 -1.0416666666666662e-03 51 41 -1.0416666666666662e-03 51 864 1.3552527156068805e-19 51 43 4.3368086899420177e-19 51 563 1.0416666666666662e-03 51 561 -4.3368086899420177e-19 51 3465 -1.3552527156068805e-19 51 2865 4.3368086899420177e-19 51 2866 -1.0416666666666662e-03 52 52 6.2499999999999986e-03 53 53 1.0416666666666664e-02 54 54 4.9999999999999996e-02 54 694 -2.0833333333333329e-03 54 549 -4.1666666666666657e-03 54 548 -1.0416666666666664e-02 54 811 -2.0833333333333329e-03 54 62 -1.0416666666666662e-03 54 547 -4.1666666666666657e-03 54 546 -1.0416666666666664e-02 54 544 4.1666666666666657e-03 54 523 1.0416666666666664e-02 55 55 6.2499999999999986e-03 56 56 1.0416666770833333e-02 57 57 6.2499999999999991e-11 58 58 1.0416666666666666e-10 59 59 4.9999999999999993e-10 59 811 -2.0833333333333329e-11 59 695 4.1666666666666658e-11 59 780 -1.0416666666666666e-10 59 694 -2.0833333333333332e-11 59 62 -1.0416666666666663e-11 59 779 -4.1666666666666665e-11 59 778 -1.0416666666666666e-10 59 776 4.1666666666666658e-11 59 760 1.0416666666666666e-10 60 60 6.2499999999999991e-11 61 61 1.0416666770833333e-02 62 62 6.2500000624999986e-03 62 779 -1.4136387421560532e-27 62 547 -1.3552527156068805e-19 62 695 -1.4136387421560532e-27 62 780 -1.0416666666666665e-11 62 694 -1.0842021401737618e-19 62 59 -1.0416666666666665e-11 62 549 1.3552527156068805e-19 62 548 -1.0416666666666662e-03 62 811 4.3368086899420177e-19 62 54 -1.0416666666666662e-03 63 63 1.2499999999999997e-02 63 900 -1.3552527156068805e-19 63 534 1.3552527156068805e-19 63 541 1.3552527156068805e-19 63 540 -1.0416666666666664e-03 63 895 -2.1684043449710089e-19 63 67 -1.0416666666666664e-03 63 531 -1.3552527156068805e-19 63 894 1.0416666666666662e-03 63 530 4.3368086899420177e-19 63 65 -1.0416666666666662e-03 64 64 2.0833333333333332e-02 65 65 4.9999999999999989e-02 65 895 2.0833333333333329e-03 65 900 -4.1666666666666657e-03 65 899 -1.0416666666666664e-02 65 898 -4.1666666666666657e-03 65 871 1.0416666666666664e-02 65 531 4.1666666666666657e-03 65 894 1.0416666666666664e-02 65 530 -2.0833333333333329e-03 65 63 -1.0416666666666662e-03 66 66 2.0833333333333329e-02 67 67 4.9999999999999989e-02 67 543 -1.0416666666666664e-02 67 530 -2.0833333333333329e-03 67 542 -4.1666666666666657e-03 67 534 4.1666666666666657e-03 67 527 1.0416666666666664e-02 67 541 -4.1666666666666657e-03 67 540 -1.0416666666666664e-02 67 895 2.0833333333333329e-03 67 63 -1.0416666666666664e-03 68 68 6.2499999999999986e-03 69 69 1.0416666666666664e-02 70 70 6.2499999999999986e-03 71 71 1.0416666666666664e-02 72 72 6.2499999999999986e-03 73 73 6.2499999999999986e-03 74 74 1.2499999999999997e-02 74 539 1.3552527156068805e-19 74 540 -1.3552527156068805e-19 74 91 2.1684043449710089e-19 74 530 -4.3368086899420177e-19 74 527 -1.3552527156068805e-19 74 534 1.0416666666666664e-03 74 77 -1.0416666666666664e-03 74 525 1.3552527156068805e-19 74 76 -1.0416666666666664e-03 74 75 4.3368086899420177e-19 74 535 1.0416666666666664e-03 75 75 4.1666666666666657e-02 75 536 -2.0833333333333329e-03 75 832 2.0833333333333333e-03 75 88 4.1202858928001372e-19 75 529 1.0416666666666660e-03 75 812 2.0833333333333329e-03 75 89 5.2083333333333330e-03 75 549 -2.0833333333333333e-03 75 90 4.1202858928001372e-19 75 523 1.0416666666666660e-03 75 544 2.0833333333333329e-03 75 79 5.2083333333333330e-03 75 542 -2.0833333333333333e-03 75 78 4.1202858928001372e-19 75 527 1.0416666666666660e-03 75 534 2.0833333333333329e-03 75 77 5.2083333333333330e-03 75 525 1.0416666666666660e-03 75 76 5.2083333333333330e-03 75 535 2.0833333333333333e-03 75 74 4.1202858928001372e-19 76 76 4.9999999999999989e-02 76 850 2.0833333333333329e-03 76 539 -4.1666666666666657e-03 76 530 2.0833333333333329e-03 76 91 5.2083333333333322e-03 76 536 -1.0416666666666664e-02 76 831 2.0833333333333329e-03 76 88 -1.0416666666666664e-03 76 537 -4.1666666666666657e-03 76 538 -1.0416666666666664e-02 76 840 -2.0833333333333329e-03 76 86 5.2083333333333322e-03 76 85 -1.0416666666666662e-03 76 525 4.1666666666666657e-03 76 75 5.2083333333333322e-03 76 535 1.0416666666666664e-02 76 74 -1.0416666666666664e-03 77 77 4.9999999999999989e-02 77 543 -4.1666666666666657e-03 77 81 5.2083333333333322e-03 77 541 -1.0416666666666664e-02 77 895 -2.0833333333333329e-03 77 99 -1.0416666666666662e-03 77 540 -4.1666666666666657e-03 77 91 5.2083333333333322e-03 77 530 2.0833333333333329e-03 77 542 -1.0416666666666664e-02 77 78 -1.0416666666666662e-03 77 527 4.1666666666666657e-03 77 534 1.0416666666666664e-02 77 75 5.2083333333333322e-03 77 74 -1.0416666666666664e-03 78 78 1.2499999999999997e-02 78 543 1.3552527156068805e-19 78 546 -1.3552527156068805e-19 78 81 2.1684043449710089e-19 78 523 -1.3552527156068805e-19 78 544 1.0416666666666664e-03 78 79 -1.0416666666666664e-03 78 527 1.3552527156068805e-19 78 77 -1.0416666666666662e-03 78 75 4.3368086899420177e-19 78 542 -1.0416666666666662e-03 79 79 4.9999999999999996e-02 79 694 2.0833333333333329e-03 79 548 -4.1666666666666657e-03 79 811 2.0833333333333329e-03 79 93 5.2083333333333322e-03 79 549 -1.0416666666666664e-02 79 90 -1.0416666666666664e-03 79 546 -4.1666666666666657e-03 79 547 -1.0416666666666664e-02 79 81 5.2083333333333322e-03 79 84 -1.0416666666666662e-03 79 523 4.1666666666666657e-03 79 544 1.0416666666666664e-02 79 75 5.2083333333333322e-03 79 78 -1.0416666666666664e-03 80 80 1.2499999999999997e-02 80 690 1.3552527156068805e-19 80 691 -1.3552527156068805e-19 80 96 4.3368086899420177e-19 80 682 -2.1684043449710089e-19 80 681 -1.3552527156068805e-19 80 685 1.0416666666666662e-03 80 83 -1.0416666666666662e-03 80 679 1.3552527156068805e-19 80 82 -1.0416666666666664e-03 80 81 2.1684043449710089e-19 80 686 1.0416666666666664e-03 81 81 4.1666666666666664e-02 81 687 -2.0833333333333329e-03 81 541 -2.0833333333333333e-03 81 99 3.7587087034409578e-19 81 543 -1.0416666666666664e-03 81 542 -2.0833333333333329e-03 81 77 5.2083333333333330e-03 81 544 2.0833333333333333e-03 81 78 2.6745065309554533e-19 81 546 -1.0416666666666664e-03 81 547 -2.0833333333333329e-03 81 79 5.2083333333333330e-03 81 692 -2.0833333333333333e-03 81 84 3.7587087034409578e-19 81 681 1.0416666666666664e-03 81 685 2.0833333333333329e-03 81 83 5.2083333333333330e-03 81 679 1.0416666666666664e-03 81 82 5.2083333333333330e-03 81 686 2.0833333333333333e-03 81 80 2.6745065309554533e-19 82 82 4.9999999999999989e-02 82 964 -2.0833333333333329e-03 82 690 -4.1666666666666657e-03 82 682 2.0833333333333329e-03 82 96 5.2083333333333322e-03 82 687 -1.0416666666666664e-02 82 895 -2.0833333333333329e-03 82 99 -1.0416666666666662e-03 82 688 -4.1666666666666657e-03 82 689 -1.0416666666666664e-02 82 896 -2.0833333333333329e-03 82 91 5.2083333333333322e-03 82 98 -1.0416666666666664e-03 82 679 4.1666666666666657e-03 82 81 5.2083333333333322e-03 82 686 1.0416666666666664e-02 82 80 -1.0416666666666664e-03 83 83 4.9999999999999989e-02 83 682 2.0833333333333329e-03 83 595 2.0833333333333329e-03 83 693 -4.1666666666666657e-03 83 694 2.0833333333333329e-03 83 93 5.2083333333333322e-03 83 691 -4.1666666666666657e-03 83 594 1.0416666666666664e-02 83 593 2.0833333333333329e-03 83 96 5.2083333333333322e-03 83 97 -1.0416666666666664e-03 83 692 -1.0416666666666664e-02 83 84 -1.0416666666666662e-03 83 681 4.1666666666666657e-03 83 685 1.0416666666666664e-02 83 81 5.2083333333333322e-03 83 80 -1.0416666666666662e-03 84 84 1.2499999999999997e-02 84 693 1.0842021724855044e-19 84 548 -1.3552527156068805e-19 84 93 4.3368086899420177e-19 84 694 -4.3368086899420177e-19 84 546 1.3552527156068805e-19 84 547 -1.0416666666666662e-03 84 79 -1.0416666666666662e-03 84 681 1.0842021724855044e-19 84 83 -1.0416666666666662e-03 84 81 4.3368086899420177e-19 84 692 -1.0416666666666662e-03 85 85 1.2499999999999997e-02 85 853 1.0842021724855044e-19 85 539 -1.3552527156068805e-19 85 91 4.3368086899420177e-19 85 850 -4.3368086899420177e-19 85 537 1.3552527156068805e-19 85 538 -1.0416666666666662e-03 85 76 -1.0416666666666662e-03 85 843 1.0842021724855044e-19 85 87 -1.0416666666666662e-03 85 86 4.3368086899420177e-19 85 851 1.0416666666666662e-03 85 840 4.3368086899420177e-19 86 86 4.1666666666666664e-02 86 854 -2.0833333333333329e-03 86 957 -2.0833333333333333e-03 86 842 -6.2499999999999986e-03 86 95 2.6745065309554533e-19 86 844 1.0416666666666664e-03 86 744 2.0833333333333329e-03 86 94 5.2083333333333330e-03 86 743 2.0833333333333333e-03 86 735 6.2500000000000003e-03 86 92 3.7587087034409578e-19 86 839 1.0416666666666664e-03 86 832 2.0833333333333329e-03 86 89 5.2083333333333330e-03 86 536 -2.0833333333333333e-03 86 831 6.2499999999999986e-03 86 88 2.6745065309554533e-19 86 537 -1.0416666666666664e-03 86 538 -2.0833333333333329e-03 86 76 5.2083333333333330e-03 86 843 1.0416666666666664e-03 86 87 5.2083333333333330e-03 86 851 2.0833333333333333e-03 86 840 -6.2500000000000003e-03 86 85 3.7587087034409578e-19 87 87 4.9999999999999989e-02 87 964 -2.0833333333333329e-03 87 856 -1.0416666666666664e-02 87 896 -2.0833333333333329e-03 87 98 -1.0416666666666664e-03 87 855 -4.1666666666666657e-03 87 96 5.2083333333333322e-03 87 959 2.0833333333333329e-03 87 854 -1.0416666666666664e-02 87 842 -2.0833333333333329e-03 87 95 -1.0416666666666662e-03 87 853 -4.1666666666666657e-03 87 850 2.0833333333333329e-03 87 91 5.2083333333333322e-03 87 843 4.1666666666666657e-03 87 86 5.2083333333333322e-03 87 851 1.0416666666666664e-02 87 840 -2.0833333333333329e-03 87 85 -1.0416666666666662e-03 88 88 1.2499999999999997e-02 88 525 -1.3552527156068805e-19 88 529 1.3552527156068805e-19 88 75 4.3368086899420177e-19 88 839 -1.3552527156068805e-19 88 832 1.0416666666666662e-03 88 89 -1.0416666666666662e-03 88 537 -1.3552527156068805e-19 88 76 -1.0416666666666664e-03 88 86 2.1684043449710089e-19 88 536 -1.0416666666666664e-03 88 831 -4.3368086899420177e-19 89 89 4.9999999999999996e-02 89 735 2.0833333333333329e-03 89 811 2.0833333333333329e-03 89 857 -4.1666666666666657e-03 89 743 1.0416666666666664e-02 89 739 2.0833333333333329e-03 89 93 5.2083333333333322e-03 89 92 -1.0416666666666662e-03 89 529 4.1666666666666657e-03 89 812 1.0416666666666664e-02 89 75 5.2083333333333322e-03 89 90 -1.0416666666666664e-03 89 839 4.1666666666666657e-03 89 832 1.0416666666666664e-02 89 831 2.0833333333333329e-03 89 86 5.2083333333333322e-03 89 88 -1.0416666666666662e-03 90 90 1.2499999999999997e-02 90 548 1.3552527156068805e-19 90 857 -1.3552527156068805e-19 90 93 2.1684043449710089e-19 90 811 -4.3368086899420177e-19 90 529 -1.3552527156068805e-19 90 812 1.0416666666666664e-03 90 89 -1.0416666666666664e-03 90 523 1.3552527156068805e-19 90 79 -1.0416666666666664e-03 90 75 4.3368086899420177e-19 90 549 -1.0416666666666664e-03 91 91 4.1666666666666657e-02 91 541 -2.0833333333333329e-03 91 687 -2.0833333333333333e-03 91 895 -6.2499999999999995e-03 91 99 4.1202858928001372e-19 91 688 -1.0416666666666664e-03 91 689 -2.0833333333333329e-03 91 82 5.2083333333333330e-03 91 856 -2.0833333333333333e-03 91 896 -6.2500000000000003e-03 91 98 2.6745065309554533e-19 91 853 -1.0416666666666664e-03 91 851 2.0833333333333329e-03 91 87 5.2083333333333330e-03 91 538 -2.0833333333333333e-03 91 850 6.2499999999999995e-03 91 85 4.1202858928001372e-19 91 539 -1.0416666666666664e-03 91 535 2.0833333333333329e-03 91 76 5.2083333333333330e-03 91 540 -1.0416666666666664e-03 91 77 5.2083333333333330e-03 91 534 2.0833333333333333e-03 91 530 6.2500000000000003e-03 91 74 2.6745065309554533e-19 92 92 1.2499999999999997e-02 92 844 -1.3552527156068805e-19 92 839 1.0842021724855044e-19 92 86 4.3368086899420177e-19 92 735 -4.3368086899420177e-19 92 857 1.0842021724855044e-19 92 743 1.0416666666666662e-03 92 89 -1.0416666666666662e-03 92 955 1.3552527156068805e-19 92 94 -1.0416666666666662e-03 92 93 4.3368086899420177e-19 92 744 1.0416666666666662e-03 92 739 -4.3368086899420177e-19 93 93 4.1666666666666657e-02 93 596 2.0833333333333329e-03 93 594 2.0833333333333333e-03 93 595 6.2500000000000003e-03 93 97 2.6745065309554533e-19 93 693 -1.0416666666666664e-03 93 692 -2.0833333333333329e-03 93 83 5.2083333333333330e-03 93 547 -2.0833333333333333e-03 93 694 6.2499999999999995e-03 93 84 4.1202858928001372e-19 93 548 -1.0416666666666664e-03 93 549 -2.0833333333333329e-03 93 79 5.2083333333333330e-03 93 812 2.0833333333333333e-03 93 811 6.2500000000000003e-03 93 90 2.6745065309554533e-19 93 857 -1.0416666666666664e-03 93 743 2.0833333333333329e-03 93 89 5.2083333333333330e-03 93 955 1.0416666666666664e-03 93 94 5.2083333333333330e-03 93 744 2.0833333333333333e-03 93 739 6.2499999999999995e-03 93 92 4.1202858928001372e-19 94 94 4.9999999999999989e-02 94 595 2.0833333333333329e-03 94 596 1.0416666666666664e-02 94 593 2.0833333333333329e-03 94 97 -1.0416666666666664e-03 94 958 -4.1666666666666657e-03 94 959 2.0833333333333329e-03 94 96 5.2083333333333322e-03 94 957 -1.0416666666666664e-02 94 842 -2.0833333333333329e-03 94 95 -1.0416666666666664e-03 94 844 4.1666666666666657e-03 94 735 2.0833333333333329e-03 94 86 5.2083333333333322e-03 94 955 4.1666666666666657e-03 94 93 5.2083333333333322e-03 94 744 1.0416666666666664e-02 94 739 2.0833333333333329e-03 94 92 -1.0416666666666662e-03 95 95 1.2499999999999997e-02 95 958 1.3552527156068805e-19 95 855 -1.3552527156068805e-19 95 96 4.3368086899420177e-19 95 959 -2.1684043449710089e-19 95 843 -1.3552527156068805e-19 95 854 -1.0416666666666662e-03 95 87 -1.0416666666666662e-03 95 844 1.3552527156068805e-19 95 94 -1.0416666666666664e-03 95 86 2.1684043449710089e-19 95 957 -1.0416666666666664e-03 95 842 4.3368086899420177e-19 96 96 4.1666666666666657e-02 96 856 -2.0833333333333329e-03 96 689 -2.0833333333333333e-03 96 964 -6.2499999999999995e-03 96 98 4.1202858928001372e-19 96 690 -1.0416666666666660e-03 96 686 2.0833333333333329e-03 96 82 5.2083333333333330e-03 96 685 2.0833333333333333e-03 96 682 6.2499999999999986e-03 96 80 4.1202858928001372e-19 96 691 -1.0416666666666660e-03 96 594 2.0833333333333329e-03 96 83 5.2083333333333330e-03 96 596 2.0833333333333333e-03 96 593 6.2499999999999995e-03 96 97 4.1202858928001372e-19 96 958 -1.0416666666666660e-03 96 957 -2.0833333333333329e-03 96 94 5.2083333333333330e-03 96 855 -1.0416666666666660e-03 96 87 5.2083333333333330e-03 96 854 -2.0833333333333333e-03 96 959 6.2499999999999986e-03 96 95 4.1202858928001372e-19 97 97 1.2499999999999997e-02 97 955 -1.3552527156068805e-19 97 693 -1.3552527156068805e-19 97 93 2.1684043449710089e-19 97 595 -4.3368086899420177e-19 97 691 1.3552527156068805e-19 97 594 1.0416666666666664e-03 97 83 -1.0416666666666664e-03 97 958 -1.3552527156068805e-19 97 94 -1.0416666666666664e-03 97 96 4.3368086899420177e-19 97 596 1.0416666666666664e-03 97 593 -2.1684043449710089e-19 98 98 1.2499999999999997e-02 98 855 1.3552527156068805e-19 98 690 -1.3552527156068805e-19 98 96 4.3368086899420177e-19 98 964 2.1684043449710089e-19 98 688 1.3552527156068805e-19 98 689 -1.0416666666666664e-03 98 82 -1.0416666666666664e-03 98 853 -1.3552527156068805e-19 98 87 -1.0416666666666664e-03 98 91 2.1684043449710089e-19 98 856 -1.0416666666666664e-03 98 896 4.3368086899420177e-19 99 99 1.2499999999999997e-02 99 679 -1.3552527156068805e-19 99 543 -1.0842021724855044e-19 99 81 4.3368086899420177e-19 99 540 1.0842021724855044e-19 99 541 -1.0416666666666662e-03 99 77 -1.0416666666666662e-03 99 688 -1.3552527156068805e-19 99 82 -1.0416666666666662e-03 99 91 4.3368086899420177e-19 99 687 -1.0416666666666662e-03 99 895 4.3368086899420177e-19 100 100 6.2500002499999985e-03 100 813 -3.1250000000000002e-11 100 578 -1.3552527156068805e-19 100 574 -4.1666666666666665e-11 100 554 -1.2499999999999998e-10 100 108 -1.0416666666666665e-11 100 553 -1.0416666558246452e-11 100 552 -4.1666666666666671e-11 100 573 -1.3552527156068805e-19 100 551 1.0416666666666664e-03 100 550 1.0416666232985797e-11 100 102 -1.0416666666666664e-03 100 2100 1.0416666666666665e-11 100 1143 4.3368086899420177e-19 100 1146 2.0833333333333336e-11 101 101 1.0416666958333331e-02 102 102 4.9999999999999996e-02 102 622 2.0833333333333329e-03 102 553 2.0833333333333329e-03 102 580 -4.1666666666666657e-03 102 579 -1.0416666666666664e-02 102 578 -4.1666666666666657e-03 102 577 -1.0416666666666664e-02 102 621 2.0833333333333329e-03 102 103 -1.0416666666666664e-03 102 573 4.1666666666666657e-03 102 551 1.0416666666666664e-02 102 550 2.0833333333333329e-03 102 100 -1.0416666666666664e-03 102 1143 5.2083333333333322e-03 103 103 6.2500000624999986e-03 103 651 1.0097419586828951e-27 103 580 -1.3552527156068805e-19 103 752 -1.0097419586828951e-27 103 623 1.0416666666666663e-11 103 622 -4.0389678347315804e-27 103 105 -1.0416666666666663e-11 103 578 1.3552527156068805e-19 103 577 -1.0416666666666664e-03 103 621 -3.2526065013006420e-19 103 102 -1.0416666666666664e-03 103 1143 4.0389678347315804e-27 104 104 1.0416666770833333e-02 105 105 4.9999999999999993e-10 105 621 2.0833333333333329e-11 105 758 -4.1666666666666665e-11 105 757 -1.0416666666666666e-10 105 651 4.1666666666666658e-11 105 756 -1.0416666666666666e-10 105 650 -2.0833333333333332e-11 105 752 4.1666666666666665e-11 105 623 1.0416666666666666e-10 105 622 2.0833333333333332e-11 105 103 -1.0416666666666661e-11 105 2196 2.0833333333333329e-11 105 1143 5.2083333333333328e-11 105 1144 -1.0416666666666663e-11 106 106 6.2499999999999986e-03 107 107 6.2499999999999991e-11 108 108 1.6666666666666663e-10 108 552 -1.0416666666666666e-11 108 813 2.0833333333333345e-11 108 550 1.0416666666666666e-11 108 100 -1.0416666666666663e-11 108 554 -1.0416666666666665e-11 108 574 -6.2499999999999991e-11 108 825 1.0416666666666660e-11 108 2318 1.0416666666666666e-11 108 1146 -6.2500000000000004e-11 109 109 6.2500001874999985e-03 109 813 5.2083333333333334e-11 109 815 1.0416666666666666e-11 109 552 -1.0416666666666666e-10 109 114 -4.1666666666666665e-11 109 565 1.3552527156068805e-19 109 566 1.3552527156068805e-19 109 557 1.0416666666666664e-03 109 556 -1.0416667100347535e-11 109 113 -1.0416666666666664e-03 109 112 -1.0842021825829240e-19 109 555 1.0842021401737618e-19 109 560 2.0194839173657902e-27 109 554 -1.0416666666666666e-11 109 110 4.3368086899420177e-19 109 4154 6.2499999999999991e-11 110 110 2.0833333541666665e-02 110 567 -2.0833333333333329e-03 110 864 2.0833333333333333e-03 110 561 -6.2499999999999986e-03 110 117 4.1202858928001372e-19 110 565 1.0416666666666660e-03 110 113 5.2083333333333330e-03 110 557 2.0833333333333333e-03 110 563 1.0416666666666660e-03 110 562 -3.1250000520833326e-03 110 111 7.8879953661519409e-21 110 555 3.1250000520833335e-03 110 560 -1.0416666666666668e-10 110 554 -3.6295685768920020e-28 110 109 4.0414059486404474e-19 110 5053 -1.8812360437258079e-27 110 3465 2.0833333333333329e-03 110 2488 5.2083333333333330e-03 110 4154 5.6797985175912850e-27 111 111 6.2500002499999985e-03 111 560 2.2470898404921788e-28 111 563 -1.3552527156068805e-19 111 562 3.2526065073590937e-19 111 110 1.6155871338926322e-27 111 3467 1.3552527156068805e-19 111 2488 -1.0416666666666664e-03 111 3465 1.0416666666666664e-03 111 3464 -6.4623485355705287e-27 111 3466 2.0194839173657902e-27 111 3463 1.0416666666666666e-11 111 2482 3.2526065013006420e-19 111 2487 6.2499999999999991e-11 111 4773 -5.2083333333333334e-11 111 5053 1.0416666666666669e-11 111 5047 1.4583333333333335e-10 111 5046 5.2083333333333334e-11 111 4154 6.2499999999999991e-11 111 4153 -6.2500000000000004e-11 112 112 2.0833333666666662e-02 112 816 1.0416666666666666e-11 112 820 -6.2499999999999991e-11 112 941 -2.0833333333333329e-03 112 569 -2.0833333333333333e-03 112 819 -6.2499999999999995e-03 112 118 4.1202858928001372e-19 112 823 1.0416666666666664e-03 112 821 -3.1250000416666664e-03 112 552 1.0416666666666666e-11 112 817 8.3333333333333330e-11 112 815 6.2499999999999991e-11 112 116 9.5018296033870872e-28 112 114 4.1666666666666665e-11 112 566 -1.0416666666666664e-03 112 557 2.0833333333333329e-03 112 556 3.1250000416666668e-03 112 113 5.2083333333333330e-03 112 109 -1.3668994342244490e-19 112 3474 -1.0416666666666666e-11 112 2492 4.1666666666666665e-11 112 2486 5.2083333333333330e-03 112 3473 2.0833333333333333e-03 112 2484 4.0414059341885156e-19 112 2315 -1.0416666666666666e-11 113 113 4.9999999999999989e-02 113 819 -2.0833333333333329e-03 113 569 -1.0416666666666664e-02 113 938 -2.0833333333333329e-03 113 118 -1.0416666666666662e-03 113 568 -4.1666666666666657e-03 113 863 2.0833333333333329e-03 113 567 -1.0416666666666664e-02 113 561 -2.0833333333333329e-03 113 117 -1.0416666666666664e-03 113 565 4.1666666666666657e-03 113 110 5.2083333333333322e-03 113 555 2.0833333333333329e-03 113 566 -4.1666666666666657e-03 113 557 1.0416666666666664e-02 113 556 2.0833333333333329e-03 113 112 5.2083333333333322e-03 113 109 -1.0416666666666664e-03 113 2490 5.2083333333333322e-03 114 114 2.2916666666666665e-10 114 554 3.1495832401145651e-28 114 556 2.0833333333333329e-11 114 109 -4.1666666666666658e-11 114 552 4.1666666666666665e-11 114 818 2.0833333333333332e-11 114 817 2.0833333333333332e-11 114 815 2.0833333333333326e-11 114 112 4.1666666666666665e-11 114 116 -2.0833333333333326e-11 114 814 2.0833333333333326e-11 114 813 -4.1666666666666665e-11 114 115 4.1666666666666665e-11 114 2315 -4.1666666666666665e-11 114 4775 2.0833333333333332e-11 114 4154 -4.1666666666666665e-11 115 115 7.9166666666666652e-10 115 816 1.0416666666666666e-11 115 818 8.3333333333333330e-11 115 116 -3.0991386737738975e-27 115 814 6.2499999999999991e-11 115 813 -1.0416666666666666e-11 115 114 4.1666666666666665e-11 115 3704 6.2499999999999991e-11 115 3701 -1.0416666666666666e-11 115 2494 4.1666666666666665e-11 115 3702 8.3333333333333330e-11 115 2493 -3.0991386737738975e-27 115 3699 6.2499999999999991e-11 115 3698 -1.0416666666666666e-11 115 2492 4.1666666666666665e-11 115 4772 -3.1250000000000002e-11 115 4775 7.2916666666666673e-11 115 4154 5.2083333333333328e-11 115 4774 -1.6666666666666666e-10 115 5040 3.1249999999999995e-11 115 4155 2.0833333333333336e-11 115 4771 7.2916666666666673e-11 115 2487 5.2083333333333334e-11 115 4760 -1.0416666666666666e-11 115 2315 -1.0416666666666666e-11 116 116 2.4999999999999996e-10 116 820 -1.0416666666666665e-11 116 816 -6.2500000000000004e-11 116 818 -2.0833333333333339e-11 116 115 -2.6253290925755273e-27 116 814 1.0416666666666665e-11 116 817 -2.0833333333333339e-11 116 815 1.0416666666666663e-11 116 112 1.6155871338926322e-27 116 114 -2.0833333333333326e-11 116 3699 1.0416666666666663e-11 116 2492 -2.0833333333333326e-11 116 2315 6.2500000000000004e-11 117 117 1.2499999999999997e-02 117 568 -1.3552527156068805e-19 117 565 -1.3552527156068805e-19 117 567 -1.0416666666666664e-03 117 113 -1.0416666666666664e-03 117 563 1.3552527156068805e-19 117 110 4.3368086899420177e-19 117 561 2.1684043449710089e-19 117 864 1.0416666666666662e-03 117 863 -4.3368086899420177e-19 117 3468 -1.3552527156068805e-19 117 2488 -1.0416666666666662e-03 117 2490 2.1684043449710089e-19 118 118 1.2499999999999997e-02 118 823 -1.0842021724855044e-19 118 941 -1.0416666666666662e-03 118 566 -1.3552527156068805e-19 118 112 4.3368086899420177e-19 118 819 4.3368086899420177e-19 118 568 1.3552527156068805e-19 118 569 -1.0416666666666662e-03 118 938 4.3368086899420177e-19 118 113 -1.0416666666666662e-03 118 3472 1.0842021724855044e-19 118 2486 -1.0416666666666662e-03 118 2490 4.3368086899420177e-19 119 119 1.2499999999999997e-02 119 567 1.0842021724855044e-19 119 570 -1.3552527156068805e-19 119 138 4.3368086899420177e-19 119 561 -4.3368086899420177e-19 119 558 -1.3552527156068805e-19 119 564 1.0416666666666662e-03 119 122 -1.0416666666666662e-03 119 557 1.0842021724855044e-19 119 121 -1.0416666666666662e-03 119 120 4.3368086899420177e-19 119 565 1.0416666666666662e-03 119 555 4.3368086899420177e-19 120 120 4.1666666666666664e-02 120 566 -2.0833333333333329e-03 120 648 -2.0833333333333333e-03 120 556 -6.2499999999999986e-03 120 142 2.6745065309554533e-19 120 559 1.0416666666666664e-03 120 649 -2.0833333333333329e-03 120 128 5.2083333333333330e-03 120 578 -2.0833333333333333e-03 120 553 -6.2500000000000003e-03 120 129 3.7587087034409578e-19 120 551 1.0416666666666664e-03 120 573 2.0833333333333329e-03 120 124 5.2083333333333330e-03 120 571 -2.0833333333333333e-03 120 550 -6.2499999999999986e-03 120 123 2.6745065309554533e-19 120 558 1.0416666666666664e-03 120 564 2.0833333333333329e-03 120 122 5.2083333333333330e-03 120 557 1.0416666666666664e-03 120 121 5.2083333333333330e-03 120 565 2.0833333333333333e-03 120 555 -6.2500000000000003e-03 120 119 3.7587087034409578e-19 121 121 4.9999999999999989e-02 121 556 -2.0833333333333329e-03 121 566 -1.0416666666666664e-02 121 819 2.0833333333333329e-03 121 142 -1.0416666666666662e-03 121 569 -4.1666666666666657e-03 121 938 2.0833333333333329e-03 121 141 5.2083333333333322e-03 121 568 -1.0416666666666664e-02 121 863 -2.0833333333333329e-03 121 140 -1.0416666666666664e-03 121 567 -4.1666666666666657e-03 121 561 2.0833333333333329e-03 121 138 5.2083333333333322e-03 121 557 4.1666666666666657e-03 121 120 5.2083333333333322e-03 121 565 1.0416666666666664e-02 121 555 -2.0833333333333329e-03 121 119 -1.0416666666666662e-03 122 122 4.9999999999999989e-02 122 561 2.0833333333333329e-03 122 572 -4.1666666666666657e-03 122 131 5.2083333333333322e-03 122 570 -4.1666666666666657e-03 122 503 1.0416666666666664e-02 122 502 2.0833333333333329e-03 122 138 5.2083333333333322e-03 122 139 -1.0416666666666664e-03 122 571 -1.0416666666666664e-02 122 550 -2.0833333333333329e-03 122 123 -1.0416666666666664e-03 122 558 4.1666666666666657e-03 122 564 1.0416666666666664e-02 122 555 -2.0833333333333329e-03 122 120 5.2083333333333322e-03 122 119 -1.0416666666666662e-03 123 123 1.2499999999999997e-02 123 572 1.3552527156068805e-19 123 579 -1.3552527156068805e-19 123 131 4.3368086899420177e-19 123 551 -1.3552527156068805e-19 123 573 1.0416666666666662e-03 123 124 -1.0416666666666662e-03 123 558 1.3552527156068805e-19 123 122 -1.0416666666666664e-03 123 120 2.1684043449710089e-19 123 571 -1.0416666666666664e-03 123 550 4.3368086899420177e-19 124 124 4.9999999999999996e-02 124 622 -2.0833333333333329e-03 124 553 -2.0833333333333329e-03 124 579 -4.1666666666666657e-03 124 580 -1.0416666666666664e-02 124 131 5.2083333333333322e-03 124 134 -1.0416666666666664e-03 124 577 -4.1666666666666657e-03 124 578 -1.0416666666666664e-02 124 621 -2.0833333333333329e-03 124 126 5.2083333333333322e-03 124 129 -1.0416666666666662e-03 124 551 4.1666666666666657e-03 124 573 1.0416666666666664e-02 124 550 -2.0833333333333329e-03 124 120 5.2083333333333322e-03 124 123 -1.0416666666666662e-03 125 125 1.2499999999999997e-02 125 646 1.3552527156068805e-19 125 647 -1.3552527156068805e-19 125 141 4.3368086899420177e-19 125 632 -2.1684043449710089e-19 125 628 -1.3552527156068805e-19 125 639 1.0416666666666664e-03 125 128 -1.0416666666666664e-03 125 625 1.3552527156068805e-19 125 127 -1.0416666666666664e-03 125 126 2.1684043449710089e-19 125 640 1.0416666666666664e-03 125 626 4.3368086899420177e-19 126 126 4.1666666666666657e-02 126 643 -2.0833333333333329e-03 126 736 2.0833333333333333e-03 126 624 -6.2499999999999995e-03 126 144 4.1202858928001372e-19 126 630 1.0416666666666664e-03 126 754 2.0833333333333329e-03 126 133 5.2083333333333330e-03 126 580 -2.0833333333333333e-03 126 622 -6.2500000000000003e-03 126 134 2.6745065309554533e-19 126 577 -1.0416666666666664e-03 126 578 -2.0833333333333329e-03 126 124 5.2083333333333330e-03 126 649 -2.0833333333333333e-03 126 621 -6.2499999999999995e-03 126 129 4.1202858928001372e-19 126 628 1.0416666666666664e-03 126 639 2.0833333333333329e-03 126 128 5.2083333333333330e-03 126 625 1.0416666666666664e-03 126 127 5.2083333333333330e-03 126 640 2.0833333333333333e-03 126 626 -6.2500000000000003e-03 126 125 2.6745065309554533e-19 127 127 4.9999999999999989e-02 127 951 -2.0833333333333329e-03 127 646 -4.1666666666666657e-03 127 632 2.0833333333333329e-03 127 141 5.2083333333333322e-03 127 624 -2.0833333333333329e-03 127 643 -1.0416666666666664e-02 127 735 2.0833333333333329e-03 127 144 -1.0416666666666662e-03 127 644 -4.1666666666666657e-03 127 645 -1.0416666666666664e-02 127 842 -2.0833333333333329e-03 127 135 5.2083333333333322e-03 127 143 -1.0416666666666662e-03 127 625 4.1666666666666657e-03 127 126 5.2083333333333322e-03 127 640 1.0416666666666664e-02 127 626 -2.0833333333333329e-03 127 125 -1.0416666666666664e-03 128 128 4.9999999999999989e-02 128 632 2.0833333333333329e-03 128 556 -2.0833333333333329e-03 128 559 4.1666666666666657e-03 128 553 -2.0833333333333329e-03 128 120 5.2083333333333322e-03 128 647 -4.1666666666666657e-03 128 648 -1.0416666666666664e-02 128 819 2.0833333333333329e-03 128 141 5.2083333333333322e-03 128 142 -1.0416666666666664e-03 128 649 -1.0416666666666664e-02 128 621 -2.0833333333333329e-03 128 129 -1.0416666666666662e-03 128 628 4.1666666666666657e-03 128 639 1.0416666666666664e-02 128 626 -2.0833333333333329e-03 128 126 5.2083333333333322e-03 128 125 -1.0416666666666664e-03 129 129 1.2499999999999997e-02 129 559 -1.3552527156068805e-19 129 551 1.0842021724855044e-19 129 120 4.3368086899420177e-19 129 553 4.3368086899420177e-19 129 577 1.0842021724855044e-19 129 578 -1.0416666666666662e-03 129 124 -1.0416666666666662e-03 129 628 1.3552527156068805e-19 129 128 -1.0416666666666662e-03 129 126 4.3368086899420177e-19 129 649 -1.0416666666666662e-03 129 621 4.3368086899420177e-19 130 130 1.2499999999999997e-02 130 835 1.3552527156068805e-19 130 838 -1.3552527156068805e-19 130 135 2.1684043449710089e-19 130 831 -4.3368086899420177e-19 130 830 -1.3552527156068805e-19 130 833 1.0416666666666664e-03 130 133 -1.0416666666666664e-03 130 828 1.3552527156068805e-19 130 132 -1.0416666666666662e-03 130 131 4.3368086899420177e-19 130 834 1.0416666666666662e-03 131 131 4.1666666666666657e-02 131 505 2.0833333333333329e-03 131 503 2.0833333333333333e-03 131 139 4.1202858928001372e-19 131 572 -1.0416666666666660e-03 131 571 -2.0833333333333329e-03 131 122 5.2083333333333330e-03 131 573 2.0833333333333333e-03 131 123 4.1202858928001372e-19 131 579 -1.0416666666666660e-03 131 580 -2.0833333333333329e-03 131 124 5.2083333333333330e-03 131 754 2.0833333333333333e-03 131 134 4.1202858928001372e-19 131 830 1.0416666666666660e-03 131 833 2.0833333333333329e-03 131 133 5.2083333333333330e-03 131 828 1.0416666666666660e-03 131 132 5.2083333333333330e-03 131 834 2.0833333333333333e-03 131 130 4.1202858928001372e-19 132 132 4.9999999999999989e-02 132 505 1.0416666666666664e-02 132 502 2.0833333333333329e-03 132 139 -1.0416666666666664e-03 132 837 -4.1666666666666657e-03 132 846 2.0833333333333329e-03 132 138 5.2083333333333322e-03 132 836 -1.0416666666666664e-02 132 840 -2.0833333333333329e-03 132 136 -1.0416666666666662e-03 132 835 -4.1666666666666657e-03 132 831 2.0833333333333329e-03 132 135 5.2083333333333322e-03 132 828 4.1666666666666657e-03 132 131 5.2083333333333322e-03 132 834 1.0416666666666664e-02 132 130 -1.0416666666666662e-03 133 133 4.9999999999999989e-02 133 624 -2.0833333333333329e-03 133 630 4.1666666666666657e-03 133 622 -2.0833333333333329e-03 133 126 5.2083333333333322e-03 133 736 1.0416666666666664e-02 133 735 2.0833333333333329e-03 133 144 -1.0416666666666662e-03 133 838 -4.1666666666666657e-03 133 135 5.2083333333333322e-03 133 831 2.0833333333333329e-03 133 754 1.0416666666666664e-02 133 134 -1.0416666666666664e-03 133 830 4.1666666666666657e-03 133 833 1.0416666666666664e-02 133 131 5.2083333333333322e-03 133 130 -1.0416666666666664e-03 134 134 1.2499999999999997e-02 134 630 -1.3552527156068805e-19 134 577 -1.3552527156068805e-19 134 126 2.1684043449710089e-19 134 622 4.3368086899420177e-19 134 579 1.3552527156068805e-19 134 580 -1.0416666666666664e-03 134 124 -1.0416666666666664e-03 134 830 1.3552527156068805e-19 134 133 -1.0416666666666664e-03 134 131 4.3368086899420177e-19 134 754 1.0416666666666664e-03 135 135 4.1666666666666664e-02 135 736 2.0833333333333329e-03 135 643 -2.0833333333333333e-03 135 735 6.2500000000000003e-03 135 144 3.7587087034409578e-19 135 644 -1.0416666666666664e-03 135 645 -2.0833333333333329e-03 135 127 5.2083333333333330e-03 135 861 -2.0833333333333333e-03 135 842 -6.2499999999999986e-03 135 143 2.6745065309554533e-19 135 841 1.0416666666666664e-03 135 845 2.0833333333333329e-03 135 137 5.2083333333333330e-03 135 836 -2.0833333333333333e-03 135 840 -6.2500000000000003e-03 135 136 3.7587087034409578e-19 135 835 -1.0416666666666664e-03 135 834 2.0833333333333329e-03 135 132 5.2083333333333330e-03 135 838 -1.0416666666666664e-03 135 133 5.2083333333333330e-03 135 833 2.0833333333333333e-03 135 831 6.2499999999999986e-03 135 130 2.6745065309554533e-19 136 136 1.2499999999999997e-02 136 837 1.0842021724855044e-19 136 858 -1.3552527156068805e-19 136 138 4.3368086899420177e-19 136 846 -4.3368086899420177e-19 136 841 -1.3552527156068805e-19 136 845 1.0416666666666662e-03 136 137 -1.0416666666666662e-03 136 835 -1.0842021724855044e-19 136 132 -1.0416666666666662e-03 136 135 4.3368086899420177e-19 136 836 -1.0416666666666662e-03 136 840 4.3368086899420177e-19 137 137 4.9999999999999989e-02 137 951 -2.0833333333333329e-03 137 861 -1.0416666666666664e-02 137 842 -2.0833333333333329e-03 137 143 -1.0416666666666664e-03 137 860 -4.1666666666666657e-03 137 141 5.2083333333333322e-03 137 938 2.0833333333333329e-03 137 859 -1.0416666666666664e-02 137 863 -2.0833333333333329e-03 137 140 -1.0416666666666664e-03 137 858 -4.1666666666666657e-03 137 138 5.2083333333333322e-03 137 846 2.0833333333333329e-03 137 841 4.1666666666666657e-03 137 845 1.0416666666666664e-02 137 840 -2.0833333333333329e-03 137 135 5.2083333333333322e-03 137 136 -1.0416666666666662e-03 138 138 4.1666666666666657e-02 138 859 -2.0833333333333329e-03 138 568 -2.0833333333333333e-03 138 863 -6.2500000000000003e-03 138 140 2.6745065309554533e-19 138 567 -1.0416666666666664e-03 138 565 2.0833333333333329e-03 138 121 5.2083333333333330e-03 138 564 2.0833333333333333e-03 138 561 6.2499999999999995e-03 138 119 4.1202858928001372e-19 138 570 -1.0416666666666664e-03 138 503 2.0833333333333329e-03 138 122 5.2083333333333330e-03 138 505 2.0833333333333333e-03 138 502 6.2500000000000003e-03 138 139 2.6745065309554533e-19 138 837 -1.0416666666666664e-03 138 836 -2.0833333333333329e-03 138 132 5.2083333333333330e-03 138 858 -1.0416666666666664e-03 138 137 5.2083333333333330e-03 138 845 2.0833333333333333e-03 138 846 6.2499999999999995e-03 138 136 4.1202858928001372e-19 139 139 1.2499999999999997e-02 139 828 -1.3552527156068805e-19 139 572 -1.3552527156068805e-19 139 131 4.3368086899420177e-19 139 570 1.3552527156068805e-19 139 503 1.0416666666666664e-03 139 122 -1.0416666666666664e-03 139 837 -1.3552527156068805e-19 139 132 -1.0416666666666664e-03 139 138 2.1684043449710089e-19 139 505 1.0416666666666664e-03 139 502 -4.3368086899420177e-19 140 140 1.2499999999999997e-02 140 569 1.3552527156068805e-19 140 860 -1.3552527156068805e-19 140 141 4.3368086899420177e-19 140 938 -2.1684043449710089e-19 140 858 1.3552527156068805e-19 140 859 -1.0416666666666664e-03 140 137 -1.0416666666666664e-03 140 567 -1.3552527156068805e-19 140 121 -1.0416666666666664e-03 140 138 2.1684043449710089e-19 140 568 -1.0416666666666664e-03 140 863 4.3368086899420177e-19 141 141 4.1666666666666657e-02 141 861 -2.0833333333333329e-03 141 645 -2.0833333333333333e-03 141 951 -6.2499999999999986e-03 141 143 4.1202858928001372e-19 141 646 -1.0416666666666660e-03 141 640 2.0833333333333329e-03 141 127 5.2083333333333330e-03 141 639 2.0833333333333333e-03 141 632 6.2499999999999995e-03 141 125 4.1202858928001372e-19 141 647 -1.0416666666666660e-03 141 648 -2.0833333333333329e-03 141 128 5.2083333333333330e-03 141 566 -2.0833333333333333e-03 141 819 6.2499999999999986e-03 141 142 4.1202858928001372e-19 141 569 -1.0416666666666660e-03 141 568 -2.0833333333333329e-03 141 121 5.2083333333333330e-03 141 860 -1.0416666666666660e-03 141 137 5.2083333333333330e-03 141 859 -2.0833333333333333e-03 141 938 6.2499999999999995e-03 141 140 4.1202858928001372e-19 142 142 1.2499999999999997e-02 142 557 -1.3552527156068805e-19 142 559 1.3552527156068805e-19 142 120 2.1684043449710089e-19 142 556 4.3368086899420177e-19 142 647 1.3552527156068805e-19 142 648 -1.0416666666666664e-03 142 128 -1.0416666666666664e-03 142 569 -1.3552527156068805e-19 142 121 -1.0416666666666662e-03 142 141 4.3368086899420177e-19 142 566 -1.0416666666666662e-03 142 819 -2.1684043449710089e-19 143 143 1.2499999999999997e-02 143 860 1.3552527156068805e-19 143 646 -1.3552527156068805e-19 143 141 4.3368086899420177e-19 143 951 2.1684043449710089e-19 143 644 1.3552527156068805e-19 143 645 -1.0416666666666662e-03 143 127 -1.0416666666666662e-03 143 841 1.3552527156068805e-19 143 137 -1.0416666666666664e-03 143 135 2.1684043449710089e-19 143 861 -1.0416666666666664e-03 143 842 4.3368086899420177e-19 144 144 1.2499999999999997e-02 144 625 -1.0842021724855044e-19 144 630 1.3552527156068805e-19 144 126 4.3368086899420177e-19 144 624 4.3368086899420177e-19 144 838 1.3552527156068805e-19 144 736 1.0416666666666662e-03 144 133 -1.0416666666666662e-03 144 644 -1.0842021724855044e-19 144 127 -1.0416666666666662e-03 144 135 4.3368086899420177e-19 144 643 -1.0416666666666662e-03 144 735 -4.3368086899420177e-19 145 145 6.2500000624999986e-03 145 614 1.0097419586828951e-27 145 620 -1.3552527156068805e-19 145 730 -1.0097419586828951e-27 145 584 1.0416666666666663e-11 145 583 -4.0389678347315804e-27 145 148 -1.0416666666666663e-11 145 612 -1.3552527156068805e-19 145 582 1.0416666666666664e-03 145 581 -3.2526065013006420e-19 145 147 -1.0416666666666664e-03 145 2810 3.2526065013006420e-19 146 146 1.0416666770833333e-02 147 147 4.9999999999999996e-02 147 583 2.0833333333333329e-03 147 620 -4.1666666666666657e-03 147 619 -1.0416666666666664e-02 147 618 -4.1666666666666657e-03 147 617 -1.0416666666666664e-02 147 612 4.1666666666666657e-03 147 582 1.0416666666666664e-02 147 581 2.0833333333333329e-03 147 145 -1.0416666666666664e-03 147 3534 2.0833333333333329e-03 147 3390 2.0833333333333329e-03 147 2810 5.2083333333333322e-03 147 2819 -1.0416666666666662e-03 148 148 4.9999999999999993e-10 148 581 2.0833333333333329e-11 148 614 4.1666666666666658e-11 148 734 -1.0416666666666666e-10 148 733 -4.1666666666666665e-11 148 732 -1.0416666666666666e-10 148 730 4.1666666666666665e-11 148 584 1.0416666666666666e-10 148 583 2.0833333333333332e-11 148 145 -1.0416666666666661e-11 148 3387 2.0833333333333329e-11 148 2165 2.0833333333333332e-11 148 1645 -1.0416666666666661e-11 148 2810 5.2083333333333328e-11 149 149 6.2499999999999991e-11 150 150 6.2499999999999986e-03 151 151 6.2500000624999986e-03 151 742 1.0097419586828951e-27 151 640 1.3552527156068805e-19 151 638 -1.0097419586828951e-27 151 627 1.0416666666666663e-11 151 626 -4.0389678347315804e-27 151 163 -1.0416666666666663e-11 151 161 3.2526065013006420e-19 151 643 1.3552527156068805e-19 151 625 1.0416666666666664e-03 151 624 -3.2526065013006420e-19 151 153 -1.0416666666666664e-03 151 152 4.0389678347315804e-27 152 152 2.0833333541666665e-02 152 747 -2.0833333333333326e-11 152 1070 -2.0833333333333329e-11 152 737 -6.2499999999999991e-11 152 176 3.5628902784306998e-27 152 844 2.0833333333333329e-03 152 644 -2.0833333333333333e-03 152 735 -6.2499999999999995e-03 152 167 4.1202858928001372e-19 152 744 1.0416666666666660e-03 152 156 5.2083333333333330e-03 152 955 2.0833333333333333e-03 152 742 1.0416666666666661e-11 152 163 5.2083333333333328e-11 152 627 2.0833333333333329e-11 152 740 1.0416666666666661e-11 152 956 2.0833333333333329e-11 152 739 -3.1250000312499997e-03 152 166 5.2083333333333328e-11 152 154 4.0414059491689842e-19 152 643 -1.0416666666666660e-03 152 625 2.0833333333333329e-03 152 624 3.1250000312499993e-03 152 153 5.2083333333333330e-03 152 151 7.8879979260055783e-21 153 153 4.9999999999999989e-02 153 951 2.0833333333333329e-03 153 646 -1.0416666666666664e-02 153 632 -2.0833333333333329e-03 153 171 -1.0416666666666662e-03 153 735 -2.0833333333333329e-03 153 645 -4.1666666666666657e-03 153 644 -1.0416666666666664e-02 153 842 2.0833333333333329e-03 153 168 5.2083333333333322e-03 153 167 -1.0416666666666664e-03 153 640 4.1666666666666657e-03 153 161 5.2083333333333322e-03 153 626 2.0833333333333329e-03 153 643 -4.1666666666666657e-03 153 625 1.0416666666666664e-02 153 624 2.0833333333333329e-03 153 152 5.2083333333333322e-03 153 151 -1.0416666666666664e-03 154 154 6.2500000624999986e-03 154 603 1.4136387421560532e-27 154 744 1.3552527156068805e-19 154 740 -1.4136387421560532e-27 154 956 1.0416666666666665e-11 154 739 -1.0842021401737618e-19 154 166 -1.0416666666666665e-11 154 152 4.3368086899420177e-19 154 596 -1.3552527156068805e-19 154 955 1.0416666666666662e-03 154 595 4.3368086899420177e-19 154 156 -1.0416666666666662e-03 154 155 -1.0842021401737618e-19 155 155 2.0833333541666665e-02 155 920 2.0833333333333329e-11 155 725 -2.0833333333333329e-11 155 597 -6.2500000000000004e-11 155 175 3.7324953730532174e-27 155 603 1.0416666666666665e-11 155 166 5.2083333333333328e-11 155 956 2.0833333333333329e-11 155 605 -2.0833333333333329e-03 155 958 -2.0833333333333333e-03 155 593 -6.2500000000000003e-03 155 169 3.7587087034409578e-19 155 601 1.0416666666666664e-03 155 159 5.2083333333333330e-03 155 586 2.0833333333333333e-03 155 599 1.0416666666666665e-11 155 588 2.0833333333333326e-11 155 587 3.1250000312499997e-03 155 165 5.2083333333333328e-11 155 157 4.0414059347091638e-19 155 596 1.0416666666666664e-03 155 955 2.0833333333333329e-03 155 595 -3.1250000312499993e-03 155 156 5.2083333333333330e-03 155 154 -1.3668993825846281e-19 156 156 4.9999999999999989e-02 156 593 -2.0833333333333329e-03 156 958 -1.0416666666666664e-02 156 959 -2.0833333333333329e-03 156 169 -1.0416666666666662e-03 156 957 -4.1666666666666657e-03 156 168 5.2083333333333322e-03 156 842 2.0833333333333329e-03 156 844 1.0416666666666664e-02 156 735 -2.0833333333333329e-03 156 167 -1.0416666666666664e-03 156 744 4.1666666666666657e-03 156 152 5.2083333333333322e-03 156 739 -2.0833333333333329e-03 156 596 4.1666666666666657e-03 156 955 1.0416666666666664e-02 156 595 -2.0833333333333329e-03 156 155 5.2083333333333322e-03 156 154 -1.0416666666666662e-03 157 157 6.2500000624999986e-03 157 720 1.0097419586828951e-27 157 601 1.3552527156068805e-19 157 599 -1.0097419586828951e-27 157 588 1.0416666666666663e-11 157 587 -4.0389678347315804e-27 157 165 -1.0416666666666663e-11 157 155 3.2526065013006420e-19 157 604 1.3552527156068805e-19 157 586 1.0416666666666664e-03 157 585 -3.2526065013006420e-19 157 159 -1.0416666666666664e-03 157 158 4.0389678347315804e-27 158 158 2.0833333541666665e-02 158 723 -2.0833333333333326e-11 158 1066 2.0833333333333329e-11 158 715 -6.2499999999999991e-11 158 174 3.5628902784306998e-27 158 976 -2.0833333333333329e-03 158 607 -2.0833333333333333e-03 158 713 -6.2499999999999995e-03 158 170 4.1202858928001372e-19 158 722 1.0416666666666660e-03 158 162 5.2083333333333330e-03 158 971 2.0833333333333333e-03 158 720 1.0416666666666661e-11 158 165 5.2083333333333328e-11 158 588 2.0833333333333329e-11 158 718 1.0416666666666661e-11 158 972 2.0833333333333329e-11 158 717 -3.1250000312499997e-03 158 164 5.2083333333333328e-11 158 160 4.0414059491689842e-19 158 604 -1.0416666666666660e-03 158 586 2.0833333333333329e-03 158 585 3.1250000312499993e-03 158 159 5.2083333333333330e-03 158 157 7.8879979260055783e-21 159 159 4.9999999999999989e-02 159 713 -2.0833333333333329e-03 159 607 -1.0416666666666664e-02 159 961 -2.0833333333333329e-03 159 170 -1.0416666666666664e-03 159 606 -4.1666666666666657e-03 159 168 5.2083333333333322e-03 159 959 -2.0833333333333329e-03 159 605 -1.0416666666666664e-02 159 593 -2.0833333333333329e-03 159 169 -1.0416666666666662e-03 159 601 4.1666666666666657e-03 159 155 5.2083333333333322e-03 159 587 2.0833333333333329e-03 159 604 -4.1666666666666657e-03 159 586 1.0416666666666664e-02 159 585 2.0833333333333329e-03 159 158 5.2083333333333322e-03 159 157 -1.0416666666666664e-03 160 160 6.2500000624999986e-03 160 642 1.4136387421560532e-27 160 722 1.3552527156068805e-19 160 718 -1.4136387421560532e-27 160 972 1.0416666666666665e-11 160 717 -1.0842021401737618e-19 160 164 -1.0416666666666665e-11 160 158 4.3368086899420177e-19 160 635 -1.3552527156068805e-19 160 971 1.0416666666666662e-03 160 634 4.3368086899420177e-19 160 162 -1.0416666666666662e-03 160 161 -1.0842021401737618e-19 161 161 2.0833333541666665e-02 161 1045 2.0833333333333329e-11 161 745 -2.0833333333333329e-11 161 636 -6.2500000000000004e-11 161 172 3.7324953730532174e-27 161 642 1.0416666666666665e-11 161 164 5.2083333333333328e-11 161 972 2.0833333333333329e-11 161 646 -2.0833333333333329e-03 161 952 2.0833333333333333e-03 161 632 -6.2500000000000003e-03 161 171 3.7587087034409578e-19 161 640 1.0416666666666664e-03 161 153 5.2083333333333330e-03 161 625 2.0833333333333333e-03 161 638 1.0416666666666665e-11 161 627 2.0833333333333326e-11 161 626 3.1250000312499997e-03 161 163 5.2083333333333328e-11 161 151 4.0414059347091638e-19 161 635 1.0416666666666664e-03 161 971 2.0833333333333329e-03 161 634 -3.1250000312499993e-03 161 162 5.2083333333333330e-03 161 160 -1.3668993825846281e-19 162 162 4.9999999999999989e-02 162 632 -2.0833333333333329e-03 162 952 1.0416666666666664e-02 162 951 2.0833333333333329e-03 162 171 -1.0416666666666662e-03 162 962 4.1666666666666657e-03 162 168 5.2083333333333322e-03 162 961 -2.0833333333333329e-03 162 976 -1.0416666666666664e-02 162 713 -2.0833333333333329e-03 162 170 -1.0416666666666664e-03 162 722 4.1666666666666657e-03 162 158 5.2083333333333322e-03 162 717 -2.0833333333333329e-03 162 635 4.1666666666666657e-03 162 971 1.0416666666666664e-02 162 634 -2.0833333333333329e-03 162 161 5.2083333333333322e-03 162 160 -1.0416666666666662e-03 163 163 4.9999999999999993e-10 163 1068 -2.0833333333333329e-11 163 747 -1.0416666666666666e-10 163 737 -2.0833333333333332e-11 163 176 -1.0416666666666663e-11 163 636 -2.0833333333333329e-11 163 746 -4.1666666666666665e-11 163 745 -1.0416666666666666e-10 163 1043 2.0833333333333332e-11 163 173 5.2083333333333328e-11 163 172 -1.0416666666666661e-11 163 742 4.1666666666666658e-11 163 152 5.2083333333333328e-11 163 624 2.0833333333333329e-11 163 638 4.1666666666666665e-11 163 627 1.0416666666666666e-10 163 626 2.0833333333333332e-11 163 161 5.2083333333333328e-11 163 151 -1.0416666666666661e-11 164 164 4.9999999999999993e-10 164 715 -2.0833333333333329e-11 164 1066 1.0416666666666666e-10 164 1065 2.0833333333333332e-11 164 174 -1.0416666666666663e-11 164 1067 -4.1666666666666658e-11 164 173 5.2083333333333328e-11 164 1043 2.0833333333333329e-11 164 1045 1.0416666666666666e-10 164 636 -2.0833333333333332e-11 164 172 -1.0416666666666661e-11 164 642 4.1666666666666665e-11 164 161 5.2083333333333328e-11 164 634 -2.0833333333333329e-11 164 718 4.1666666666666658e-11 164 972 1.0416666666666666e-10 164 717 -2.0833333333333332e-11 164 158 5.2083333333333328e-11 164 160 -1.0416666666666663e-11 165 165 5.0000000000000003e-10 165 597 -2.0833333333333329e-11 165 725 -1.0416666666666666e-10 165 918 2.0833333333333332e-11 165 175 -1.0416666666666661e-11 165 724 -4.1666666666666665e-11 165 173 5.2083333333333328e-11 165 1065 2.0833333333333329e-11 165 723 -1.0416666666666666e-10 165 715 -2.0833333333333332e-11 165 174 -1.0416666666666663e-11 165 720 4.1666666666666658e-11 165 158 5.2083333333333328e-11 165 585 2.0833333333333329e-11 165 599 4.1666666666666665e-11 165 588 1.0416666666666666e-10 165 587 2.0833333333333332e-11 165 155 5.2083333333333328e-11 165 157 -1.0416666666666661e-11 166 166 4.9999999999999993e-10 166 737 -2.0833333333333329e-11 166 1070 -1.0416666666666666e-10 166 1068 -2.0833333333333332e-11 166 176 -1.0416666666666663e-11 166 1069 4.1666666666666658e-11 166 173 5.2083333333333328e-11 166 918 2.0833333333333329e-11 166 920 1.0416666666666666e-10 166 597 -2.0833333333333332e-11 166 175 -1.0416666666666661e-11 166 603 4.1666666666666665e-11 166 155 5.2083333333333328e-11 166 595 -2.0833333333333329e-11 166 740 4.1666666666666658e-11 166 956 1.0416666666666666e-10 166 739 -2.0833333333333332e-11 166 152 5.2083333333333328e-11 166 154 -1.0416666666666663e-11 167 167 1.2499999999999997e-02 167 957 -1.3552527156068805e-19 167 744 -1.3552527156068805e-19 167 844 1.0416666666666664e-03 167 156 -1.0416666666666664e-03 167 643 -1.3552527156068805e-19 167 152 4.3368086899420177e-19 167 735 2.1684043449710089e-19 167 645 1.3552527156068805e-19 167 644 -1.0416666666666664e-03 167 842 -4.3368086899420177e-19 167 153 -1.0416666666666664e-03 167 168 2.1684043449710089e-19 168 168 4.1666666666666664e-02 168 646 -2.0833333333333333e-03 168 952 2.0833333333333329e-03 168 951 6.2499999999999995e-03 168 171 4.1202858928001372e-19 168 962 1.0416666666666664e-03 168 162 5.2083333333333330e-03 168 976 -2.0833333333333333e-03 168 607 -2.0833333333333329e-03 168 961 -6.2500000000000003e-03 168 170 2.6745065309554533e-19 168 606 -1.0416666666666664e-03 168 159 5.2083333333333330e-03 168 605 -2.0833333333333333e-03 168 958 -2.0833333333333329e-03 168 959 -6.2499999999999995e-03 168 169 4.1202858928001372e-19 168 957 -1.0416666666666664e-03 168 156 5.2083333333333330e-03 168 844 2.0833333333333333e-03 168 645 -1.0416666666666664e-03 168 644 -2.0833333333333329e-03 168 842 6.2500000000000003e-03 168 153 5.2083333333333330e-03 168 167 2.6745065309554533e-19 169 169 1.2499999999999997e-02 169 606 -1.3552527156068805e-19 169 601 -1.3552527156068805e-19 169 605 -1.0416666666666662e-03 169 159 -1.0416666666666662e-03 169 596 1.0842021724855044e-19 169 155 4.3368086899420177e-19 169 593 4.3368086899420177e-19 169 957 1.0842021724855044e-19 169 958 -1.0416666666666662e-03 169 959 4.3368086899420177e-19 169 156 -1.0416666666666662e-03 169 168 4.3368086899420177e-19 170 170 1.2499999999999997e-02 170 962 1.3552527156068805e-19 170 722 -1.3552527156068805e-19 170 976 -1.0416666666666664e-03 170 162 -1.0416666666666664e-03 170 604 -1.3552527156068805e-19 170 158 4.3368086899420177e-19 170 713 2.1684043449710089e-19 170 606 1.3552527156068805e-19 170 607 -1.0416666666666664e-03 170 961 4.3368086899420177e-19 170 159 -1.0416666666666664e-03 170 168 2.1684043449710089e-19 171 171 1.2499999999999997e-02 171 645 -1.3552527156068805e-19 171 640 -1.3552527156068805e-19 171 646 -1.0416666666666662e-03 171 153 -1.0416666666666662e-03 171 635 1.0842021724855044e-19 171 161 4.3368086899420177e-19 171 632 4.3368086899420177e-19 171 962 -1.0842021724855044e-19 171 952 1.0416666666666662e-03 171 951 -4.3368086899420177e-19 171 162 -1.0416666666666662e-03 171 168 4.3368086899420177e-19 172 172 1.2499999999999998e-10 172 1067 -1.0097419586828951e-27 172 642 -1.0097419586828951e-27 172 1045 1.0416666666666661e-11 172 164 -1.0416666666666661e-11 172 638 1.2116903504194741e-27 172 161 4.0389678347315804e-27 172 636 4.0389678347315804e-27 172 746 1.2116903504194741e-27 172 745 -1.0416666666666661e-11 172 1043 -4.0389678347315804e-27 172 163 -1.0416666666666661e-11 172 173 4.0389678347315804e-27 173 173 4.1666666666666662e-10 173 747 -2.0833333333333329e-11 173 1070 -2.0833333333333326e-11 173 1068 -6.2499999999999991e-11 173 176 2.1169082391605852e-27 173 1069 1.0416666666666665e-11 173 166 5.2083333333333328e-11 173 920 2.0833333333333329e-11 173 725 -2.0833333333333329e-11 173 918 6.2499999999999991e-11 173 175 3.5628902784306998e-27 173 724 -1.0416666666666665e-11 173 165 5.2083333333333328e-11 173 723 -2.0833333333333329e-11 173 1066 2.0833333333333326e-11 173 1065 6.2499999999999991e-11 173 174 2.1169082391605852e-27 173 1067 -1.0416666666666665e-11 173 164 5.2083333333333328e-11 173 1045 2.0833333333333329e-11 173 746 -1.0416666666666665e-11 173 745 -2.0833333333333329e-11 173 1043 6.2499999999999991e-11 173 163 5.2083333333333328e-11 173 172 3.5628902784306998e-27 174 174 1.2499999999999998e-10 174 724 -1.4136387421560532e-27 174 720 -1.4136387421560532e-27 174 723 -1.0416666666666666e-11 174 165 -1.0416666666666666e-11 174 718 1.2116903504194741e-27 174 158 4.0389678347315804e-27 174 715 1.6155871338926322e-27 174 1067 1.2116903504194741e-27 174 1066 1.0416666666666666e-11 174 1065 -4.0389678347315804e-27 174 164 -1.0416666666666666e-11 174 173 1.6155871338926322e-27 175 175 1.2499999999999998e-10 175 1069 1.0097419586828951e-27 175 603 -1.0097419586828951e-27 175 920 1.0416666666666661e-11 175 166 -1.0416666666666661e-11 175 599 1.2116903504194741e-27 175 155 4.0389678347315804e-27 175 597 4.0389678347315804e-27 175 724 1.2116903504194741e-27 175 725 -1.0416666666666661e-11 175 918 -4.0389678347315804e-27 175 165 -1.0416666666666661e-11 175 173 4.0389678347315804e-27 176 176 1.2499999999999998e-10 176 746 -1.4136387421560532e-27 176 742 -1.4136387421560532e-27 176 747 -1.0416666666666666e-11 176 163 -1.0416666666666666e-11 176 740 1.2116903504194741e-27 176 152 4.0389678347315804e-27 176 737 1.6155871338926322e-27 176 1069 -1.2116903504194741e-27 176 1070 -1.0416666666666666e-11 176 1068 4.0389678347315804e-27 176 166 -1.0416666666666666e-11 176 173 1.6155871338926322e-27 177 177 1.2499999999999998e-10 177 602 1.2116903504194741e-27 177 908 1.0097419586828951e-27 177 598 -1.0097419586828951e-27 177 914 -1.0416666666666661e-11 177 597 4.0389678347315804e-27 177 185 -1.0416666666666661e-11 177 181 4.0389678347315804e-27 177 907 -1.2116903504194741e-27 177 915 1.0416666666666661e-11 177 906 4.0389678347315804e-27 177 179 -1.0416666666666661e-11 178 178 2.0833333333333331e-10 179 179 4.9999999999999993e-10 179 597 -2.0833333333333329e-11 179 694 -2.0833333333333329e-11 179 602 4.1666666666666665e-11 179 927 -1.0416666666666666e-10 179 595 -2.0833333333333332e-11 179 181 5.2083333333333328e-11 179 192 -1.0416666666666661e-11 179 697 4.1666666666666658e-11 179 765 1.0416666666666666e-10 179 907 4.1666666666666665e-11 179 915 1.0416666666666666e-10 179 906 -2.0833333333333332e-11 179 177 -1.0416666666666661e-11 180 180 1.2499999999999997e-02 180 685 1.3552527156068805e-19 180 600 1.0842021724855044e-19 180 609 1.0842021724855044e-19 180 608 -1.0416666666666662e-03 180 682 4.3368086899420177e-19 180 184 -1.0416666666666662e-03 180 594 -1.3552527156068805e-19 180 691 -1.0416666666666662e-03 180 593 4.3368086899420177e-19 180 182 -1.0416666666666662e-03 180 181 4.3368086899420177e-19 181 181 2.0833333541666665e-02 181 915 2.0833333333333329e-11 181 592 2.0833333333333329e-11 181 602 1.0416666666666665e-11 181 927 -2.0833333333333326e-11 181 179 5.2083333333333328e-11 181 608 -2.0833333333333333e-03 181 693 -2.0833333333333333e-03 181 595 -3.1250000312499997e-03 181 192 4.0414059347091638e-19 181 600 1.0416666666666664e-03 181 589 2.0833333333333329e-03 181 587 3.1250000312499993e-03 181 184 5.2083333333333330e-03 181 186 -1.3668993825846281e-19 181 598 1.0416666666666665e-11 181 914 -2.0833333333333329e-11 181 597 -6.2500000000000004e-11 181 185 5.2083333333333328e-11 181 177 3.7324953730532174e-27 181 594 1.0416666666666664e-03 181 691 -2.0833333333333329e-03 181 593 -6.2500000000000003e-03 181 182 5.2083333333333330e-03 181 180 3.7587087034409578e-19 182 182 4.9999999999999996e-02 182 682 -2.0833333333333329e-03 182 595 -2.0833333333333329e-03 182 693 -1.0416666666666664e-02 182 694 -2.0833333333333329e-03 182 192 -1.0416666666666664e-03 182 692 -4.1666666666666657e-03 182 685 4.1666666666666657e-03 182 681 1.0416666666666664e-02 182 594 4.1666666666666657e-03 182 691 -1.0416666666666664e-02 182 593 -2.0833333333333329e-03 182 181 5.2083333333333322e-03 182 180 -1.0416666666666662e-03 183 183 2.0833333333333329e-02 184 184 4.9999999999999989e-02 184 611 -1.0416666666666664e-02 184 593 -2.0833333333333329e-03 184 610 -4.1666666666666657e-03 184 581 2.0833333333333329e-03 184 600 4.1666666666666657e-03 184 589 1.0416666666666664e-02 184 587 2.0833333333333329e-03 184 181 5.2083333333333322e-03 184 186 -1.0416666666666662e-03 184 609 -4.1666666666666657e-03 184 608 -1.0416666666666664e-02 184 682 -2.0833333333333329e-03 184 180 -1.0416666666666662e-03 185 185 4.9999999999999993e-10 185 587 2.0833333333333329e-11 185 592 1.0416666666666666e-10 185 581 2.0833333333333332e-11 185 186 -1.0416666666666663e-11 185 906 -2.0833333333333329e-11 185 615 4.1666666666666658e-11 185 908 4.1666666666666658e-11 185 905 1.0416666666666666e-10 185 598 4.1666666666666665e-11 185 914 -1.0416666666666666e-10 185 597 -2.0833333333333332e-11 185 181 5.2083333333333328e-11 185 177 -1.0416666666666661e-11 186 186 6.2500000624999986e-03 186 598 1.4136387421560532e-27 186 615 -1.4136387421560532e-27 186 592 1.0416666666666665e-11 186 185 -1.0416666666666665e-11 186 610 -1.3552527156068805e-19 186 581 1.0842021401737618e-19 186 600 -1.3552527156068805e-19 186 589 1.0416666666666662e-03 186 587 -4.3368086899420177e-19 186 184 -1.0416666666666662e-03 186 181 -1.0842021401737618e-19 187 187 1.0416666770833333e-02 188 188 6.2499999999999986e-03 189 189 1.0416666770833333e-02 190 190 6.2499999999999991e-11 191 191 6.2499999999999991e-11 192 192 6.2500000624999986e-03 192 697 1.0097419586828951e-27 192 602 -1.0097419586828951e-27 192 927 -1.0416666666666663e-11 192 179 -1.0416666666666663e-11 192 594 1.3552527156068805e-19 192 181 3.2526065013006420e-19 192 595 4.0389678347315804e-27 192 692 1.3552527156068805e-19 192 693 -1.0416666666666664e-03 192 694 3.2526065013006420e-19 192 182 -1.0416666666666664e-03 193 193 6.2499999999999986e-03 194 194 1.2499999999999997e-02 194 605 1.3552527156068805e-19 194 608 -1.3552527156068805e-19 194 200 4.3368086899420177e-19 194 593 -2.1684043449710089e-19 194 589 -1.3552527156068805e-19 194 600 1.0416666666666664e-03 194 197 -1.0416666666666664e-03 194 586 1.3552527156068805e-19 194 196 -1.0416666666666664e-03 194 195 2.1684043449710089e-19 194 601 1.0416666666666664e-03 194 587 4.3368086899420177e-19 195 195 4.1666666666666657e-02 195 604 -2.0833333333333329e-03 195 714 2.0833333333333333e-03 195 585 -6.2499999999999995e-03 195 204 4.1202858928001372e-19 195 591 1.0416666666666664e-03 195 731 2.0833333333333329e-03 195 205 5.2083333333333330e-03 195 620 -2.0833333333333333e-03 195 583 -6.2500000000000003e-03 195 206 2.6745065309554533e-19 195 582 1.0416666666666664e-03 195 612 2.0833333333333329e-03 195 199 5.2083333333333330e-03 195 610 -2.0833333333333333e-03 195 581 -6.2499999999999995e-03 195 198 4.1202858928001372e-19 195 589 1.0416666666666664e-03 195 600 2.0833333333333329e-03 195 197 5.2083333333333330e-03 195 586 1.0416666666666664e-03 195 196 5.2083333333333330e-03 195 601 2.0833333333333333e-03 195 587 -6.2500000000000003e-03 195 194 2.6745065309554533e-19 196 196 4.9999999999999989e-02 196 585 -2.0833333333333329e-03 196 604 -1.0416666666666664e-02 196 713 2.0833333333333329e-03 196 204 -1.0416666666666662e-03 196 607 -4.1666666666666657e-03 196 961 2.0833333333333329e-03 196 203 5.2083333333333322e-03 196 606 -1.0416666666666664e-02 196 959 2.0833333333333329e-03 196 201 -1.0416666666666662e-03 196 605 -4.1666666666666657e-03 196 593 2.0833333333333329e-03 196 200 5.2083333333333322e-03 196 586 4.1666666666666657e-03 196 195 5.2083333333333322e-03 196 601 1.0416666666666664e-02 196 587 -2.0833333333333329e-03 196 194 -1.0416666666666664e-03 197 197 4.9999999999999989e-02 197 611 -4.1666666666666657e-03 197 208 5.2083333333333322e-03 197 609 -1.0416666666666664e-02 197 682 2.0833333333333329e-03 197 214 -1.0416666666666664e-03 197 608 -4.1666666666666657e-03 197 200 5.2083333333333322e-03 197 593 2.0833333333333329e-03 197 610 -1.0416666666666664e-02 197 581 -2.0833333333333329e-03 197 198 -1.0416666666666662e-03 197 589 4.1666666666666657e-03 197 600 1.0416666666666664e-02 197 587 -2.0833333333333329e-03 197 195 5.2083333333333322e-03 197 194 -1.0416666666666664e-03 198 198 1.2499999999999997e-02 198 611 1.3552527156068805e-19 198 617 -1.0842021724855044e-19 198 208 4.3368086899420177e-19 198 582 -1.0842021724855044e-19 198 612 1.0416666666666662e-03 198 199 -1.0416666666666662e-03 198 589 1.3552527156068805e-19 198 197 -1.0416666666666662e-03 198 195 4.3368086899420177e-19 198 610 -1.0416666666666662e-03 198 581 4.3368086899420177e-19 199 199 4.9999999999999989e-02 199 619 -4.1666666666666657e-03 199 216 5.2083333333333322e-03 199 617 -4.1666666666666657e-03 199 618 -1.0416666666666664e-02 199 208 5.2083333333333322e-03 199 211 -1.0416666666666662e-03 199 620 -1.0416666666666664e-02 199 583 -2.0833333333333329e-03 199 206 -1.0416666666666664e-03 199 582 4.1666666666666657e-03 199 612 1.0416666666666664e-02 199 581 -2.0833333333333329e-03 199 195 5.2083333333333322e-03 199 198 -1.0416666666666662e-03 199 3534 -2.0833333333333329e-03 199 3390 -2.0833333333333329e-03 200 200 4.1666666666666657e-02 200 609 -2.0833333333333329e-03 200 684 2.0833333333333333e-03 200 682 6.2499999999999986e-03 200 214 4.1202858928001372e-19 200 965 1.0416666666666660e-03 200 994 2.0833333333333329e-03 200 209 5.2083333333333330e-03 200 967 -2.0833333333333333e-03 200 964 -6.2499999999999995e-03 200 213 4.1202858928001372e-19 200 963 1.0416666666666660e-03 200 960 2.0833333333333329e-03 200 202 5.2083333333333330e-03 200 606 -2.0833333333333333e-03 200 959 6.2499999999999986e-03 200 201 4.1202858928001372e-19 200 605 -1.0416666666666660e-03 200 601 2.0833333333333329e-03 200 196 5.2083333333333330e-03 200 608 -1.0416666666666660e-03 200 197 5.2083333333333330e-03 200 600 2.0833333333333333e-03 200 593 6.2499999999999995e-03 200 194 4.1202858928001372e-19 201 201 1.2499999999999997e-02 201 607 1.3552527156068805e-19 201 968 -1.3552527156068805e-19 201 203 2.1684043449710089e-19 201 961 -4.3368086899420177e-19 201 963 -1.3552527156068805e-19 201 960 1.0416666666666664e-03 201 202 -1.0416666666666664e-03 201 605 -1.3552527156068805e-19 201 196 -1.0416666666666662e-03 201 200 4.3368086899420177e-19 201 606 -1.0416666666666662e-03 201 959 -2.1684043449710089e-19 202 202 4.9999999999999989e-02 202 969 -1.0416666666666664e-02 202 982 -2.0833333333333329e-03 202 218 -1.0416666666666662e-03 202 964 -2.0833333333333329e-03 202 966 -4.1666666666666657e-03 202 967 -1.0416666666666664e-02 202 212 5.2083333333333322e-03 202 213 -1.0416666666666664e-03 202 968 -4.1666666666666657e-03 202 203 5.2083333333333322e-03 202 961 2.0833333333333329e-03 202 963 4.1666666666666657e-03 202 960 1.0416666666666664e-02 202 959 2.0833333333333329e-03 202 200 5.2083333333333322e-03 202 201 -1.0416666666666664e-03 202 3447 -2.0833333333333329e-03 202 3483 -2.0833333333333329e-03 203 203 4.1666666666666664e-02 203 969 -2.0833333333333329e-03 203 1010 -2.0833333333333333e-03 203 982 -6.2500000000000003e-03 203 218 3.7587087034409578e-19 203 984 1.0416666666666664e-03 203 1008 2.0833333333333329e-03 203 217 5.2083333333333330e-03 203 986 -2.0833333333333333e-03 203 981 -6.2499999999999986e-03 203 215 2.6745065309554533e-19 203 980 1.0416666666666664e-03 203 714 2.0833333333333329e-03 203 205 5.2083333333333330e-03 203 604 -2.0833333333333333e-03 203 713 6.2500000000000003e-03 203 204 3.7587087034409578e-19 203 607 -1.0416666666666664e-03 203 606 -2.0833333333333329e-03 203 196 5.2083333333333330e-03 203 968 -1.0416666666666664e-03 203 202 5.2083333333333330e-03 203 960 2.0833333333333333e-03 203 961 6.2499999999999986e-03 203 201 2.6745065309554533e-19 204 204 1.2499999999999997e-02 204 586 -1.0842021724855044e-19 204 591 1.3552527156068805e-19 204 195 4.3368086899420177e-19 204 585 4.3368086899420177e-19 204 980 -1.3552527156068805e-19 204 714 1.0416666666666662e-03 204 205 -1.0416666666666662e-03 204 607 -1.0842021724855044e-19 204 196 -1.0416666666666662e-03 204 203 4.3368086899420177e-19 204 604 -1.0416666666666662e-03 204 713 -4.3368086899420177e-19 205 205 4.9999999999999989e-02 205 981 -2.0833333333333329e-03 205 985 -4.1666666666666657e-03 205 986 -1.0416666666666664e-02 205 216 5.2083333333333322e-03 205 215 -1.0416666666666664e-03 205 585 -2.0833333333333329e-03 205 591 4.1666666666666657e-03 205 731 1.0416666666666664e-02 205 583 -2.0833333333333329e-03 205 195 5.2083333333333322e-03 205 206 -1.0416666666666664e-03 205 980 4.1666666666666657e-03 205 714 1.0416666666666664e-02 205 713 2.0833333333333329e-03 205 203 5.2083333333333322e-03 205 204 -1.0416666666666662e-03 205 3390 -2.0833333333333329e-03 205 3211 -2.0833333333333329e-03 206 206 1.2499999999999997e-02 206 619 1.3552527156068805e-19 206 985 -1.3552527156068805e-19 206 216 4.3368086899420177e-19 206 591 -1.3552527156068805e-19 206 731 1.0416666666666664e-03 206 205 -1.0416666666666664e-03 206 582 1.3552527156068805e-19 206 199 -1.0416666666666664e-03 206 195 2.1684043449710089e-19 206 620 -1.0416666666666664e-03 206 583 4.3368086899420177e-19 206 3390 2.1684043449710089e-19 207 207 1.2499999999999997e-02 207 1001 1.0842021724855044e-19 207 1002 -1.3552527156068805e-19 207 212 4.3368086899420177e-19 207 998 -1.3552527156068805e-19 207 999 1.0416666666666662e-03 207 210 -1.0416666666666662e-03 207 996 1.0842021724855044e-19 207 209 -1.0416666666666662e-03 207 208 4.3368086899420177e-19 207 1000 1.0416666666666662e-03 207 3484 4.3368086899420177e-19 208 208 4.1666666666666664e-02 208 684 2.0833333333333329e-03 208 609 -2.0833333333333333e-03 208 214 2.6745065309554533e-19 208 611 -1.0416666666666664e-03 208 610 -2.0833333333333329e-03 208 197 5.2083333333333330e-03 208 612 2.0833333333333333e-03 208 198 3.7587087034409578e-19 208 617 -1.0416666666666664e-03 208 618 -2.0833333333333329e-03 208 199 5.2083333333333330e-03 208 1004 -2.0833333333333333e-03 208 211 2.6745065309554533e-19 208 998 1.0416666666666664e-03 208 999 2.0833333333333329e-03 208 210 5.2083333333333330e-03 208 996 1.0416666666666664e-03 208 209 5.2083333333333330e-03 208 1000 2.0833333333333333e-03 208 207 3.7587087034409578e-19 209 209 4.9999999999999989e-02 209 684 1.0416666666666664e-02 209 682 2.0833333333333329e-03 209 214 -1.0416666666666662e-03 209 965 4.1666666666666657e-03 209 964 -2.0833333333333329e-03 209 200 5.2083333333333322e-03 209 994 1.0416666666666664e-02 209 213 -1.0416666666666664e-03 209 1001 -4.1666666666666657e-03 209 212 5.2083333333333322e-03 209 996 4.1666666666666657e-03 209 208 5.2083333333333322e-03 209 1000 1.0416666666666664e-02 209 207 -1.0416666666666662e-03 209 3483 -2.0833333333333329e-03 209 3484 -2.0833333333333329e-03 210 210 4.9999999999999989e-02 210 1005 -4.1666666666666657e-03 210 216 5.2083333333333322e-03 210 1003 -1.0416666666666664e-02 210 219 -1.0416666666666664e-03 210 1002 -4.1666666666666657e-03 210 212 5.2083333333333322e-03 210 1004 -1.0416666666666664e-02 210 211 -1.0416666666666664e-03 210 998 4.1666666666666657e-03 210 999 1.0416666666666664e-02 210 208 5.2083333333333322e-03 210 207 -1.0416666666666662e-03 210 3158 -2.0833333333333329e-03 210 3534 -2.0833333333333329e-03 210 3157 -2.0833333333333329e-03 210 3484 -2.0833333333333329e-03 211 211 1.2499999999999997e-02 211 1005 1.3552527156068805e-19 211 619 -1.3552527156068805e-19 211 216 4.3368086899420177e-19 211 617 1.3552527156068805e-19 211 618 -1.0416666666666662e-03 211 199 -1.0416666666666662e-03 211 998 1.3552527156068805e-19 211 210 -1.0416666666666664e-03 211 208 2.1684043449710089e-19 211 1004 -1.0416666666666664e-03 211 3534 2.1684043449710089e-19 212 212 4.1666666666666657e-02 212 1003 -2.0833333333333329e-03 212 1009 -2.0833333333333333e-03 212 219 2.6745065309554533e-19 212 1006 1.0416666666666664e-03 212 1010 -2.0833333333333329e-03 212 217 5.2083333333333330e-03 212 969 -2.0833333333333333e-03 212 218 4.1202858928001372e-19 212 966 -1.0416666666666664e-03 212 967 -2.0833333333333329e-03 212 202 5.2083333333333330e-03 212 994 2.0833333333333333e-03 212 213 2.6745065309554533e-19 212 1001 -1.0416666666666664e-03 212 1000 2.0833333333333329e-03 212 209 5.2083333333333330e-03 212 1002 -1.0416666666666664e-03 212 210 5.2083333333333330e-03 212 999 2.0833333333333333e-03 212 207 4.1202858928001372e-19 212 3157 -6.2500000000000003e-03 212 3447 -6.2499999999999995e-03 212 3483 -6.2500000000000003e-03 212 3484 -6.2499999999999995e-03 213 213 1.2499999999999997e-02 213 965 -1.3552527156068805e-19 213 963 1.3552527156068805e-19 213 200 4.3368086899420177e-19 213 964 2.1684043449710089e-19 213 966 1.3552527156068805e-19 213 967 -1.0416666666666664e-03 213 202 -1.0416666666666664e-03 213 1001 -1.3552527156068805e-19 213 209 -1.0416666666666664e-03 213 212 2.1684043449710089e-19 213 994 1.0416666666666664e-03 213 3483 4.3368086899420177e-19 214 214 1.2499999999999997e-02 214 996 -1.3552527156068805e-19 214 611 -1.3552527156068805e-19 214 208 2.1684043449710089e-19 214 608 1.3552527156068805e-19 214 609 -1.0416666666666664e-03 214 197 -1.0416666666666664e-03 214 965 1.3552527156068805e-19 214 209 -1.0416666666666662e-03 214 200 4.3368086899420177e-19 214 684 1.0416666666666662e-03 214 682 -2.1684043449710089e-19 215 215 1.2499999999999997e-02 215 984 -1.3552527156068805e-19 215 980 1.3552527156068805e-19 215 203 2.1684043449710089e-19 215 981 4.3368086899420177e-19 215 985 1.3552527156068805e-19 215 986 -1.0416666666666664e-03 215 205 -1.0416666666666664e-03 215 1007 1.3552527156068805e-19 215 217 -1.0416666666666662e-03 215 216 4.3368086899420177e-19 215 1008 1.0416666666666662e-03 215 3211 2.1684043449710089e-19 216 216 4.1666666666666657e-02 216 1009 -2.0833333333333329e-03 216 1003 -2.0833333333333333e-03 216 219 4.1202858928001372e-19 216 1005 -1.0416666666666660e-03 216 1004 -2.0833333333333329e-03 216 210 5.2083333333333330e-03 216 618 -2.0833333333333333e-03 216 211 4.1202858928001372e-19 216 619 -1.0416666666666660e-03 216 620 -2.0833333333333329e-03 216 199 5.2083333333333330e-03 216 731 2.0833333333333333e-03 216 206 4.1202858928001372e-19 216 985 -1.0416666666666660e-03 216 986 -2.0833333333333329e-03 216 205 5.2083333333333330e-03 216 1007 1.0416666666666660e-03 216 217 5.2083333333333330e-03 216 1008 2.0833333333333333e-03 216 215 4.1202858928001372e-19 216 3158 -6.2499999999999995e-03 216 3534 -6.2499999999999986e-03 216 3390 -6.2499999999999995e-03 216 3211 -6.2499999999999986e-03 217 217 4.9999999999999989e-02 217 1009 -1.0416666666666664e-02 217 219 -1.0416666666666664e-03 217 1006 4.1666666666666657e-03 217 212 5.2083333333333322e-03 217 1010 -1.0416666666666664e-02 217 982 -2.0833333333333329e-03 217 218 -1.0416666666666662e-03 217 984 4.1666666666666657e-03 217 981 -2.0833333333333329e-03 217 203 5.2083333333333322e-03 217 1007 4.1666666666666657e-03 217 216 5.2083333333333322e-03 217 1008 1.0416666666666664e-02 217 215 -1.0416666666666662e-03 217 3158 -2.0833333333333329e-03 217 3157 -2.0833333333333329e-03 217 3447 -2.0833333333333329e-03 217 3211 -2.0833333333333329e-03 218 218 1.2499999999999997e-02 218 1006 -1.0842021724855044e-19 218 966 -1.3552527156068805e-19 218 212 4.3368086899420177e-19 218 968 1.3552527156068805e-19 218 969 -1.0416666666666662e-03 218 202 -1.0416666666666662e-03 218 984 1.0842021724855044e-19 218 217 -1.0416666666666662e-03 218 203 4.3368086899420177e-19 218 1010 -1.0416666666666662e-03 218 982 4.3368086899420177e-19 218 3447 4.3368086899420177e-19 219 219 1.2499999999999997e-02 219 1007 -1.3552527156068805e-19 219 1005 -1.3552527156068805e-19 219 216 4.3368086899420177e-19 219 1002 1.3552527156068805e-19 219 1003 -1.0416666666666664e-03 219 210 -1.0416666666666664e-03 219 1006 1.3552527156068805e-19 219 217 -1.0416666666666664e-03 219 212 2.1684043449710089e-19 219 1009 -1.0416666666666664e-03 219 3158 2.1684043449710089e-19 219 3157 4.3368086899420177e-19 220 220 1.2499999999999997e-02 220 639 1.0842021724855044e-19 220 822 1.3552527156068805e-19 220 633 -1.3552527156068805e-19 220 942 -1.0416666666666662e-03 220 632 4.3368086899420177e-19 220 224 -1.0416666666666662e-03 220 223 4.3368086899420177e-19 220 648 1.0842021724855044e-19 220 647 -1.0416666666666662e-03 220 819 4.3368086899420177e-19 220 222 -1.0416666666666662e-03 220 221 4.3368086899420177e-19 221 221 2.0833333666666662e-02 221 942 -2.0833333333333333e-03 221 559 2.0833333333333333e-03 221 822 1.0416666666666664e-03 221 940 2.0833333333333329e-03 221 821 -3.1250000416666668e-03 221 224 5.2083333333333330e-03 221 231 -1.3668994342244490e-19 221 556 3.1250000416666664e-03 221 552 1.0416666666666666e-11 221 230 4.0414059341885156e-19 221 815 6.2499999999999991e-11 221 817 8.3333333333333330e-11 221 820 -6.2499999999999991e-11 221 816 1.0416666666666666e-11 221 228 4.1666666666666665e-11 221 648 -1.0416666666666664e-03 221 647 -2.0833333333333329e-03 221 819 -6.2499999999999995e-03 221 222 5.2083333333333330e-03 221 220 4.1202858928001372e-19 221 3474 -1.0416666666666666e-11 221 2315 -1.0416666666666666e-11 221 1613 4.1666666666666665e-11 221 1614 9.5018296033870872e-28 222 222 4.9999999999999996e-02 222 632 -2.0833333333333329e-03 222 556 2.0833333333333329e-03 222 559 1.0416666666666664e-02 222 553 2.0833333333333329e-03 222 230 -1.0416666666666664e-03 222 649 -4.1666666666666657e-03 222 621 2.0833333333333329e-03 222 639 4.1666666666666657e-03 222 628 1.0416666666666664e-02 222 626 2.0833333333333329e-03 222 223 5.2083333333333322e-03 222 229 -1.0416666666666662e-03 222 648 -4.1666666666666657e-03 222 647 -1.0416666666666664e-02 222 819 -2.0833333333333329e-03 222 221 5.2083333333333322e-03 222 220 -1.0416666666666662e-03 222 1617 5.2083333333333322e-03 223 223 2.0833333541666665e-02 223 1040 2.0833333333333329e-11 223 631 2.0833333333333329e-11 223 641 1.0416666666666665e-11 223 974 2.0833333333333326e-11 223 226 5.2083333333333328e-11 223 647 -2.0833333333333333e-03 223 944 -2.0833333333333333e-03 223 634 -3.1250000312499997e-03 223 232 4.0414059347091638e-19 223 639 1.0416666666666664e-03 223 628 2.0833333333333329e-03 223 626 3.1250000312499993e-03 223 222 5.2083333333333330e-03 223 229 -1.3668993825846281e-19 223 637 1.0416666666666665e-11 223 1039 -2.0833333333333329e-11 223 636 -6.2500000000000004e-11 223 227 5.2083333333333328e-11 223 225 3.7324953730532174e-27 223 633 1.0416666666666664e-03 223 942 -2.0833333333333329e-03 223 632 -6.2500000000000003e-03 223 224 5.2083333333333330e-03 223 220 3.7587087034409578e-19 224 224 4.9999999999999989e-02 224 634 -2.0833333333333329e-03 224 944 -1.0416666666666664e-02 224 946 -2.0833333333333329e-03 224 232 -1.0416666666666664e-03 224 819 -2.0833333333333329e-03 224 943 -4.1666666666666657e-03 224 939 2.0833333333333329e-03 224 822 4.1666666666666657e-03 224 940 1.0416666666666664e-02 224 821 -2.0833333333333329e-03 224 221 5.2083333333333322e-03 224 231 -1.0416666666666664e-03 224 633 4.1666666666666657e-03 224 942 -1.0416666666666664e-02 224 632 -2.0833333333333329e-03 224 223 5.2083333333333322e-03 224 220 -1.0416666666666662e-03 224 1619 5.2083333333333322e-03 225 225 1.2499999999999998e-10 225 641 1.2116903504194741e-27 225 1030 1.0097419586828951e-27 225 637 -1.0097419586828951e-27 225 1039 -1.0416666666666661e-11 225 636 4.0389678347315804e-27 225 227 -1.0416666666666661e-11 225 223 4.0389678347315804e-27 225 1029 -1.2116903504194741e-27 225 1040 1.0416666666666661e-11 225 1028 4.0389678347315804e-27 225 226 -1.0416666666666661e-11 225 1620 4.0389678347315804e-27 226 226 4.9999999999999993e-10 226 636 -2.0833333333333329e-11 226 946 -2.0833333333333329e-11 226 641 4.1666666666666665e-11 226 974 1.0416666666666666e-10 226 634 -2.0833333333333332e-11 226 223 5.2083333333333328e-11 226 232 -1.0416666666666661e-11 226 948 4.1666666666666658e-11 226 701 1.0416666666666666e-10 226 1029 4.1666666666666665e-11 226 1040 1.0416666666666666e-10 226 1028 -2.0833333333333332e-11 226 225 -1.0416666666666661e-11 226 1818 2.0833333333333329e-11 226 1816 2.0833333333333332e-11 226 1619 5.2083333333333328e-11 226 1621 -1.0416666666666663e-11 226 1620 5.2083333333333328e-11 227 227 4.9999999999999993e-10 227 626 2.0833333333333329e-11 227 631 1.0416666666666666e-10 227 621 2.0833333333333332e-11 227 229 -1.0416666666666663e-11 227 1028 -2.0833333333333329e-11 227 652 4.1666666666666658e-11 227 650 -2.0833333333333329e-11 227 1030 4.1666666666666658e-11 227 1026 1.0416666666666666e-10 227 1025 2.0833333333333332e-11 227 233 -1.0416666666666663e-11 227 637 4.1666666666666665e-11 227 1039 -1.0416666666666666e-10 227 636 -2.0833333333333332e-11 227 223 5.2083333333333328e-11 227 225 -1.0416666666666661e-11 227 1617 5.2083333333333328e-11 227 1620 5.2083333333333328e-11 228 228 2.5000000000000002e-10 228 821 -2.0833333333333329e-11 228 939 2.0833333333333332e-11 228 231 -2.0833333333333326e-11 228 947 -2.0833333333333326e-11 228 1075 2.0833333333333326e-11 228 817 2.0833333333333332e-11 228 820 -2.0833333333333326e-11 228 816 4.1666666666666665e-11 228 221 4.1666666666666665e-11 228 3474 -4.1666666666666665e-11 228 1787 2.0833333333333329e-11 228 1619 4.1666666666666665e-11 228 1786 2.0833333333333332e-11 228 5004 -4.1666666666666665e-11 228 1618 -2.0833333333333326e-11 228 2096 2.0833333333333332e-11 228 1612 4.1666666666666665e-11 228 1614 -2.0833333333333326e-11 229 229 6.2500000624999986e-03 229 637 1.4136387421560532e-27 229 652 -1.4136387421560532e-27 229 631 1.0416666666666665e-11 229 227 -1.0416666666666665e-11 229 649 -1.3552527156068805e-19 229 621 1.0842021401737618e-19 229 639 -1.3552527156068805e-19 229 628 1.0416666666666662e-03 229 626 -4.3368086899420177e-19 229 222 -1.0416666666666662e-03 229 223 -1.0842021401737618e-19 229 1617 4.3368086899420177e-19 230 230 6.2500001249999985e-03 230 648 -1.3552527156068805e-19 230 649 1.3552527156068805e-19 230 559 1.0416666666666664e-03 230 222 -1.0416666666666664e-03 230 553 -1.0416666991927315e-11 230 556 -1.0416666666666673e-11 230 815 1.0416666666666666e-11 230 552 -6.2499999999999991e-11 230 221 3.2526065013006420e-19 230 1617 1.6155871338926322e-27 230 2100 1.0416666666666665e-11 230 1613 -2.0833333333333326e-11 231 231 6.2500001249999985e-03 231 820 -1.0416666666666666e-11 231 947 -1.0416666666666665e-11 231 228 -2.0833333333333326e-11 231 943 -1.3552527156068805e-19 231 939 -1.0416666558246452e-11 231 822 -1.3552527156068805e-19 231 940 1.0416666666666664e-03 231 821 1.0416667100347535e-11 231 224 -1.0416666666666664e-03 231 221 -1.0842021825829240e-19 231 3474 6.2499999999999991e-11 231 1619 4.3368086899420177e-19 232 232 6.2500000624999986e-03 232 948 1.0097419586828951e-27 232 641 -1.0097419586828951e-27 232 974 1.0416666666666663e-11 232 226 -1.0416666666666663e-11 232 633 1.3552527156068805e-19 232 223 3.2526065013006420e-19 232 634 4.0389678347315804e-27 232 943 1.3552527156068805e-19 232 944 -1.0416666666666664e-03 232 946 3.2526065013006420e-19 232 224 -1.0416666666666664e-03 232 1619 4.0389678347315804e-27 233 233 1.8749999999999997e-10 233 652 1.2116903504194741e-27 233 1030 -1.2116903504194741e-27 233 1026 1.0416666666666666e-11 233 227 -1.0416666666666666e-11 233 1025 -1.0416666666666669e-11 233 1023 1.0416666666666666e-11 233 650 1.0416666666666668e-11 233 1620 -2.6253290925755273e-27 233 1723 1.0416666666666665e-11 233 1726 6.2499999999999991e-11 233 1617 4.0389678347315804e-27 233 1615 -2.0833333333333326e-11 234 234 6.2499999999999986e-03 235 235 1.0416666666666664e-02 236 236 4.9999999999999996e-02 236 676 -4.1666666666666657e-03 236 675 -1.0416666666666664e-02 236 674 -4.1666666666666657e-03 236 673 -1.0416666666666664e-02 236 671 4.1666666666666657e-03 236 654 1.0416666666666664e-02 237 237 6.2499999999999986e-03 238 238 1.0416666666666666e-02 239 239 6.2499999999999986e-03 240 240 1.0416666666666664e-02 241 241 6.2499999999999986e-03 242 242 2.0833333333333329e-02 243 243 4.9999999999999989e-02 243 666 -1.0416666666666664e-02 243 883 2.0833333333333329e-03 243 665 -4.1666666666666657e-03 243 664 -1.0416666666666664e-02 243 884 2.0833333333333329e-03 243 245 -1.0416666666666664e-03 243 662 4.1666666666666657e-03 243 663 -4.1666666666666657e-03 243 656 1.0416666666666664e-02 243 3412 2.0833333333333329e-03 243 3481 2.0833333333333329e-03 243 2363 -1.0416666666666662e-03 243 2360 5.2083333333333322e-03 244 244 6.2499999999999986e-03 245 245 1.2499999999999997e-02 245 937 -1.3552527156068805e-19 245 885 1.0416666666666664e-03 245 663 -1.3552527156068805e-19 245 883 -2.1684043449710089e-19 245 665 1.3552527156068805e-19 245 664 -1.0416666666666664e-03 245 884 -4.3368086899420177e-19 245 243 -1.0416666666666664e-03 245 3409 1.3552527156068805e-19 245 2361 -1.0416666666666664e-03 245 2360 2.1684043449710089e-19 246 246 4.9999999999999989e-02 246 670 -1.0416666666666664e-02 246 669 -4.1666666666666657e-03 246 661 4.1666666666666657e-03 246 658 1.0416666666666664e-02 246 668 -4.1666666666666657e-03 246 667 -1.0416666666666664e-02 246 3481 2.0833333333333329e-03 246 3128 2.0833333333333329e-03 246 2515 -1.0416666666666662e-03 247 247 6.2499999999999986e-03 248 248 1.0416666666666664e-02 249 249 6.2499999999999986e-03 250 250 1.2499999999999997e-02 250 666 1.3552527156068805e-19 250 667 -1.3552527156068805e-19 250 270 4.3368086899420177e-19 250 658 -1.3552527156068805e-19 250 661 1.0416666666666664e-03 250 253 -1.0416666666666664e-03 250 656 1.3552527156068805e-19 250 252 -1.0416666666666664e-03 250 251 2.1684043449710089e-19 250 662 1.0416666666666664e-03 250 3481 2.1684043449710089e-19 251 251 4.1666666666666657e-02 251 663 -2.0833333333333329e-03 251 879 -2.0833333333333333e-03 251 269 4.1202858928001372e-19 251 660 1.0416666666666664e-03 251 880 -2.0833333333333329e-03 251 259 5.2083333333333330e-03 251 674 -2.0833333333333333e-03 251 260 2.6745065309554533e-19 251 654 1.0416666666666664e-03 251 671 2.0833333333333329e-03 251 255 5.2083333333333330e-03 251 669 -2.0833333333333333e-03 251 254 4.1202858928001372e-19 251 658 1.0416666666666664e-03 251 661 2.0833333333333329e-03 251 253 5.2083333333333330e-03 251 656 1.0416666666666664e-03 251 252 5.2083333333333330e-03 251 662 2.0833333333333333e-03 251 250 2.6745065309554533e-19 252 252 4.9999999999999989e-02 252 666 -4.1666666666666657e-03 252 270 5.2083333333333322e-03 252 663 -1.0416666666666664e-02 252 883 -2.0833333333333329e-03 252 269 -1.0416666666666662e-03 252 664 -4.1666666666666657e-03 252 665 -1.0416666666666664e-02 252 884 -2.0833333333333329e-03 252 261 5.2083333333333322e-03 252 268 -1.0416666666666662e-03 252 656 4.1666666666666657e-03 252 251 5.2083333333333322e-03 252 662 1.0416666666666664e-02 252 250 -1.0416666666666664e-03 252 3412 -2.0833333333333329e-03 252 3481 -2.0833333333333329e-03 253 253 4.9999999999999989e-02 253 670 -4.1666666666666657e-03 253 272 5.2083333333333322e-03 253 668 -1.0416666666666664e-02 253 275 -1.0416666666666664e-03 253 667 -4.1666666666666657e-03 253 270 5.2083333333333322e-03 253 669 -1.0416666666666664e-02 253 254 -1.0416666666666662e-03 253 658 4.1666666666666657e-03 253 661 1.0416666666666664e-02 253 251 5.2083333333333322e-03 253 250 -1.0416666666666664e-03 253 3128 -2.0833333333333329e-03 253 3481 -2.0833333333333329e-03 254 254 1.2499999999999997e-02 254 670 1.3552527156068805e-19 254 675 -1.0842021724855044e-19 254 272 4.3368086899420177e-19 254 654 -1.0842021724855044e-19 254 671 1.0416666666666662e-03 254 255 -1.0416666666666662e-03 254 658 1.3552527156068805e-19 254 253 -1.0416666666666662e-03 254 251 4.3368086899420177e-19 254 669 -1.0416666666666662e-03 255 255 4.9999999999999989e-02 255 675 -4.1666666666666657e-03 255 272 5.2083333333333322e-03 255 676 -1.0416666666666664e-02 255 267 -1.0416666666666662e-03 255 673 -4.1666666666666657e-03 255 674 -1.0416666666666664e-02 255 257 5.2083333333333322e-03 255 260 -1.0416666666666664e-03 255 654 4.1666666666666657e-03 255 671 1.0416666666666664e-02 255 251 5.2083333333333322e-03 255 254 -1.0416666666666662e-03 256 256 1.2499999999999997e-02 256 876 1.3552527156068805e-19 256 878 -1.3552527156068805e-19 256 261 2.1684043449710089e-19 256 872 -4.3368086899420177e-19 256 869 -1.3552527156068805e-19 256 874 1.0416666666666664e-03 256 259 -1.0416666666666664e-03 256 867 1.3552527156068805e-19 256 258 -1.0416666666666662e-03 256 257 4.3368086899420177e-19 256 875 1.0416666666666662e-03 257 257 4.1666666666666657e-02 257 533 2.0833333333333329e-03 257 531 2.0833333333333333e-03 257 265 4.1202858928001372e-19 257 871 1.0416666666666660e-03 257 898 -2.0833333333333329e-03 257 266 5.2083333333333330e-03 257 676 -2.0833333333333333e-03 257 267 4.1202858928001372e-19 257 673 -1.0416666666666660e-03 257 674 -2.0833333333333329e-03 257 255 5.2083333333333330e-03 257 880 -2.0833333333333333e-03 257 260 4.1202858928001372e-19 257 869 1.0416666666666660e-03 257 874 2.0833333333333329e-03 257 259 5.2083333333333330e-03 257 867 1.0416666666666660e-03 257 258 5.2083333333333330e-03 257 875 2.0833333333333333e-03 257 256 4.1202858928001372e-19 258 258 4.9999999999999989e-02 258 533 1.0416666666666664e-02 258 530 2.0833333333333329e-03 258 265 -1.0416666666666664e-03 258 877 -4.1666666666666657e-03 258 850 2.0833333333333329e-03 258 264 5.2083333333333322e-03 258 852 1.0416666666666664e-02 258 848 2.0833333333333329e-03 258 262 -1.0416666666666662e-03 258 876 -4.1666666666666657e-03 258 872 2.0833333333333329e-03 258 261 5.2083333333333322e-03 258 867 4.1666666666666657e-03 258 257 5.2083333333333322e-03 258 875 1.0416666666666664e-02 258 256 -1.0416666666666662e-03 259 259 4.9999999999999989e-02 259 660 4.1666666666666657e-03 259 251 5.2083333333333322e-03 259 879 -1.0416666666666664e-02 259 883 -2.0833333333333329e-03 259 269 -1.0416666666666662e-03 259 878 -4.1666666666666657e-03 259 261 5.2083333333333322e-03 259 872 2.0833333333333329e-03 259 880 -1.0416666666666664e-02 259 260 -1.0416666666666664e-03 259 869 4.1666666666666657e-03 259 874 1.0416666666666664e-02 259 257 5.2083333333333322e-03 259 256 -1.0416666666666664e-03 260 260 1.2499999999999997e-02 260 660 -1.3552527156068805e-19 260 654 1.3552527156068805e-19 260 251 2.1684043449710089e-19 260 673 1.3552527156068805e-19 260 674 -1.0416666666666664e-03 260 255 -1.0416666666666664e-03 260 869 1.3552527156068805e-19 260 259 -1.0416666666666664e-03 260 257 4.3368086899420177e-19 260 880 -1.0416666666666664e-03 261 261 4.1666666666666664e-02 261 879 -2.0833333333333329e-03 261 663 -2.0833333333333333e-03 261 883 -6.2500000000000003e-03 261 269 3.7587087034409578e-19 261 664 -1.0416666666666664e-03 261 665 -2.0833333333333329e-03 261 252 5.2083333333333330e-03 261 891 -2.0833333333333333e-03 261 884 -6.2499999999999986e-03 261 268 2.6745065309554533e-19 261 882 1.0416666666666664e-03 261 849 2.0833333333333329e-03 261 263 5.2083333333333330e-03 261 852 2.0833333333333333e-03 261 848 6.2500000000000003e-03 261 262 3.7587087034409578e-19 261 876 -1.0416666666666664e-03 261 875 2.0833333333333329e-03 261 258 5.2083333333333330e-03 261 878 -1.0416666666666664e-03 261 259 5.2083333333333330e-03 261 874 2.0833333333333333e-03 261 872 6.2499999999999986e-03 261 256 2.6745065309554533e-19 262 262 1.2499999999999997e-02 262 877 1.0842021724855044e-19 262 892 -1.3552527156068805e-19 262 264 4.3368086899420177e-19 262 850 -4.3368086899420177e-19 262 882 -1.3552527156068805e-19 262 849 1.0416666666666662e-03 262 263 -1.0416666666666662e-03 262 876 -1.0842021724855044e-19 262 258 -1.0416666666666662e-03 262 261 4.3368086899420177e-19 262 852 1.0416666666666662e-03 262 848 -4.3368086899420177e-19 263 263 4.9999999999999989e-02 263 893 -1.0416666666666664e-02 263 896 -2.0833333333333329e-03 263 274 -1.0416666666666664e-03 263 890 -4.1666666666666657e-03 263 270 5.2083333333333322e-03 263 891 -1.0416666666666664e-02 263 884 -2.0833333333333329e-03 263 268 -1.0416666666666664e-03 263 892 -4.1666666666666657e-03 263 264 5.2083333333333322e-03 263 850 2.0833333333333329e-03 263 882 4.1666666666666657e-03 263 849 1.0416666666666664e-02 263 848 2.0833333333333329e-03 263 261 5.2083333333333322e-03 263 262 -1.0416666666666662e-03 263 3482 -2.0833333333333329e-03 263 3412 -2.0833333333333329e-03 264 264 4.1666666666666657e-02 264 893 -2.0833333333333329e-03 264 993 -2.0833333333333333e-03 264 896 -6.2500000000000003e-03 264 274 2.6745065309554533e-19 264 897 1.0416666666666664e-03 264 991 2.0833333333333329e-03 264 273 5.2083333333333330e-03 264 900 -2.0833333333333333e-03 264 895 -6.2499999999999995e-03 264 271 4.1202858928001372e-19 264 894 1.0416666666666664e-03 264 531 2.0833333333333329e-03 264 266 5.2083333333333330e-03 264 533 2.0833333333333333e-03 264 530 6.2500000000000003e-03 264 265 2.6745065309554533e-19 264 877 -1.0416666666666664e-03 264 852 2.0833333333333329e-03 264 258 5.2083333333333330e-03 264 892 -1.0416666666666664e-03 264 263 5.2083333333333330e-03 264 849 2.0833333333333333e-03 264 850 6.2499999999999995e-03 264 262 4.1202858928001372e-19 265 265 1.2499999999999997e-02 265 867 -1.3552527156068805e-19 265 871 1.3552527156068805e-19 265 257 4.3368086899420177e-19 265 894 -1.3552527156068805e-19 265 531 1.0416666666666664e-03 265 266 -1.0416666666666664e-03 265 877 -1.3552527156068805e-19 265 258 -1.0416666666666664e-03 265 264 2.1684043449710089e-19 265 533 1.0416666666666664e-03 265 530 -4.3368086899420177e-19 266 266 4.9999999999999996e-02 266 895 -2.0833333333333329e-03 266 899 -4.1666666666666657e-03 266 900 -1.0416666666666664e-02 266 272 5.2083333333333322e-03 266 271 -1.0416666666666662e-03 266 871 4.1666666666666657e-03 266 898 -1.0416666666666664e-02 266 257 5.2083333333333322e-03 266 267 -1.0416666666666664e-03 266 894 4.1666666666666657e-03 266 531 1.0416666666666664e-02 266 530 2.0833333333333329e-03 266 264 5.2083333333333322e-03 266 265 -1.0416666666666664e-03 267 267 1.2499999999999997e-02 267 675 1.3552527156068805e-19 267 899 -1.3552527156068805e-19 267 272 2.1684043449710089e-19 267 871 -1.3552527156068805e-19 267 898 -1.0416666666666664e-03 267 266 -1.0416666666666664e-03 267 673 -1.3552527156068805e-19 267 255 -1.0416666666666662e-03 267 257 4.3368086899420177e-19 267 676 -1.0416666666666662e-03 268 268 1.2499999999999997e-02 268 890 1.3552527156068805e-19 268 666 -1.3552527156068805e-19 268 270 4.3368086899420177e-19 268 664 1.3552527156068805e-19 268 665 -1.0416666666666662e-03 268 252 -1.0416666666666662e-03 268 882 1.3552527156068805e-19 268 263 -1.0416666666666664e-03 268 261 2.1684043449710089e-19 268 891 -1.0416666666666664e-03 268 884 4.3368086899420177e-19 268 3412 2.1684043449710089e-19 269 269 1.2499999999999997e-02 269 656 -1.0842021724855044e-19 269 660 1.3552527156068805e-19 269 251 4.3368086899420177e-19 269 878 1.3552527156068805e-19 269 879 -1.0416666666666662e-03 269 259 -1.0416666666666662e-03 269 664 -1.0842021724855044e-19 269 252 -1.0416666666666662e-03 269 261 4.3368086899420177e-19 269 663 -1.0416666666666662e-03 269 883 4.3368086899420177e-19 270 270 4.1666666666666657e-02 270 668 -2.0833333333333329e-03 270 992 -2.0833333333333333e-03 270 275 4.1202858928001372e-19 270 987 1.0416666666666660e-03 270 993 -2.0833333333333329e-03 270 273 5.2083333333333330e-03 270 893 -2.0833333333333333e-03 270 274 4.1202858928001372e-19 270 890 -1.0416666666666660e-03 270 891 -2.0833333333333329e-03 270 263 5.2083333333333330e-03 270 665 -2.0833333333333333e-03 270 268 4.1202858928001372e-19 270 666 -1.0416666666666660e-03 270 662 2.0833333333333329e-03 270 252 5.2083333333333330e-03 270 667 -1.0416666666666660e-03 270 253 5.2083333333333330e-03 270 661 2.0833333333333333e-03 270 250 4.1202858928001372e-19 270 3128 -6.2499999999999986e-03 270 3482 -6.2499999999999995e-03 270 3412 -6.2499999999999986e-03 270 3481 -6.2499999999999995e-03 271 271 1.2499999999999997e-02 271 897 -1.0842021724855044e-19 271 894 1.3552527156068805e-19 271 264 4.3368086899420177e-19 271 895 4.3368086899420177e-19 271 899 1.3552527156068805e-19 271 900 -1.0416666666666662e-03 271 266 -1.0416666666666662e-03 271 989 1.0842021724855044e-19 271 273 -1.0416666666666662e-03 271 272 4.3368086899420177e-19 271 991 1.0416666666666662e-03 272 272 4.1666666666666664e-02 272 992 -2.0833333333333329e-03 272 668 -2.0833333333333333e-03 272 275 2.6745065309554533e-19 272 670 -1.0416666666666664e-03 272 669 -2.0833333333333329e-03 272 253 5.2083333333333330e-03 272 671 2.0833333333333333e-03 272 254 3.7587087034409578e-19 272 675 -1.0416666666666664e-03 272 676 -2.0833333333333329e-03 272 255 5.2083333333333330e-03 272 898 -2.0833333333333333e-03 272 267 2.6745065309554533e-19 272 899 -1.0416666666666664e-03 272 900 -2.0833333333333329e-03 272 266 5.2083333333333330e-03 272 989 1.0416666666666664e-03 272 273 5.2083333333333330e-03 272 991 2.0833333333333333e-03 272 271 3.7587087034409578e-19 273 273 4.9999999999999989e-02 273 992 -1.0416666666666664e-02 273 275 -1.0416666666666662e-03 273 987 4.1666666666666657e-03 273 270 5.2083333333333322e-03 273 993 -1.0416666666666664e-02 273 896 -2.0833333333333329e-03 273 274 -1.0416666666666664e-03 273 897 4.1666666666666657e-03 273 895 -2.0833333333333329e-03 273 264 5.2083333333333322e-03 273 989 4.1666666666666657e-03 273 272 5.2083333333333322e-03 273 991 1.0416666666666664e-02 273 271 -1.0416666666666662e-03 273 3128 -2.0833333333333329e-03 273 3482 -2.0833333333333329e-03 274 274 1.2499999999999997e-02 274 987 -1.3552527156068805e-19 274 890 -1.3552527156068805e-19 274 270 4.3368086899420177e-19 274 892 1.3552527156068805e-19 274 893 -1.0416666666666664e-03 274 263 -1.0416666666666664e-03 274 897 1.3552527156068805e-19 274 273 -1.0416666666666664e-03 274 264 2.1684043449710089e-19 274 993 -1.0416666666666664e-03 274 896 4.3368086899420177e-19 274 3482 2.1684043449710089e-19 275 275 1.2499999999999997e-02 275 989 -1.3552527156068805e-19 275 670 -1.3552527156068805e-19 275 272 2.1684043449710089e-19 275 667 1.3552527156068805e-19 275 668 -1.0416666666666664e-03 275 253 -1.0416666666666664e-03 275 987 1.3552527156068805e-19 275 273 -1.0416666666666662e-03 275 270 4.3368086899420177e-19 275 992 -1.0416666666666662e-03 275 3128 2.1684043449710089e-19 276 276 6.2499999999999986e-03 277 277 2.0833333333333329e-02 278 278 4.9999999999999989e-02 278 964 2.0833333333333329e-03 278 690 -1.0416666666666664e-02 278 682 -2.0833333333333329e-03 278 285 -1.0416666666666662e-03 278 895 2.0833333333333329e-03 278 689 -4.1666666666666657e-03 278 688 -1.0416666666666664e-02 278 896 2.0833333333333329e-03 278 284 -1.0416666666666662e-03 278 686 4.1666666666666657e-03 278 687 -4.1666666666666657e-03 278 679 1.0416666666666664e-02 278 2513 5.2083333333333322e-03 279 279 6.2499999999999986e-03 280 280 4.9999999999999989e-02 280 987 1.0416666666666664e-02 280 993 -4.1666666666666657e-03 280 896 2.0833333333333329e-03 280 897 1.0416666666666664e-02 280 895 2.0833333333333329e-03 280 284 -1.0416666666666664e-03 280 991 4.1666666666666657e-03 280 992 -4.1666666666666657e-03 280 989 1.0416666666666664e-02 280 3128 2.0833333333333329e-03 280 3482 2.0833333333333329e-03 280 2512 -1.0416666666666662e-03 280 2513 5.2083333333333322e-03 281 281 6.2499999999999986e-03 282 282 2.0833333333333329e-02 283 283 4.9999999999999989e-02 283 682 -2.0833333333333329e-03 283 965 1.0416666666666664e-02 283 964 2.0833333333333329e-03 283 285 -1.0416666666666662e-03 283 994 4.1666666666666657e-03 283 1001 -1.0416666666666664e-02 283 1000 4.1666666666666657e-03 283 684 4.1666666666666657e-03 283 996 1.0416666666666664e-02 283 2513 5.2083333333333322e-03 283 3483 2.0833333333333329e-03 283 3484 2.0833333333333329e-03 283 2514 -1.0416666666666664e-03 284 284 1.2499999999999997e-02 284 993 -1.3552527156068805e-19 284 991 -1.3552527156068805e-19 284 897 1.0416666666666664e-03 284 280 -1.0416666666666664e-03 284 687 -1.3552527156068805e-19 284 895 -2.1684043449710089e-19 284 689 1.3552527156068805e-19 284 688 -1.0416666666666662e-03 284 896 -4.3368086899420177e-19 284 278 -1.0416666666666662e-03 284 2513 2.1684043449710089e-19 285 285 1.2499999999999997e-02 285 689 -1.0842021724855044e-19 285 686 -1.0842021724855044e-19 285 690 -1.0416666666666662e-03 285 278 -1.0416666666666662e-03 285 684 1.3552527156068805e-19 285 682 4.3368086899420177e-19 285 994 -1.3552527156068805e-19 285 965 1.0416666666666662e-03 285 964 -4.3368086899420177e-19 285 283 -1.0416666666666662e-03 285 2513 4.3368086899420177e-19 286 286 4.9999999999999993e-10 286 970 2.0833333333333329e-11 286 708 -2.0833333333333329e-11 286 712 -4.1666666666666658e-11 286 711 -1.0416666666666666e-10 286 946 -2.0833333333333332e-11 286 287 -1.0416666666666663e-11 286 710 -4.1666666666666665e-11 286 709 -1.0416666666666666e-10 286 978 -2.0833333333333332e-11 286 289 -1.0416666666666661e-11 286 707 4.1666666666666658e-11 286 698 1.0416666666666666e-10 286 1816 2.0833333333333329e-11 286 1208 5.2083333333333328e-11 286 2413 5.2083333333333328e-11 286 1819 2.0833333333333332e-11 286 3780 5.2083333333333328e-11 286 1207 -1.0416666666666663e-11 287 287 6.2500000624999986e-03 287 710 -1.4136387421560532e-27 287 945 1.3552527156068805e-19 287 712 1.4136387421560532e-27 287 711 -1.0416666666666665e-11 287 946 -1.0842021401737618e-19 287 286 -1.0416666666666665e-11 287 949 -1.0416666666666662e-03 287 970 -4.3368086899420177e-19 287 1208 4.3368086899420177e-19 287 3089 -1.3552527156068805e-19 287 2406 -1.0416666666666662e-03 287 2413 -1.0842021401737618e-19 288 288 2.4999999999999994e-02 288 978 -2.0833333333333329e-03 288 708 -2.0833333333333329e-03 288 1011 -4.1666666666666666e-03 288 289 -2.0833333333333333e-03 288 3218 2.0833333333333329e-03 288 2409 4.1666666666666657e-03 288 3326 2.0833333333333329e-03 288 3214 -2.0833333333333329e-03 288 3213 2.0833333333333329e-03 288 3219 4.1666666666666666e-03 288 2413 4.1666666666666657e-03 288 2408 -2.0833333333333333e-03 288 4885 -2.0833333333333329e-03 288 3780 4.1666666666666657e-03 288 4886 2.0833333333333329e-03 288 4866 -2.0833333333333329e-03 288 4889 4.1666666666666666e-03 288 3779 -2.0833333333333333e-03 289 289 1.2500000062500001e-02 289 707 1.0097419586828951e-27 289 710 1.0097419586828951e-27 289 709 -1.0416666666666661e-11 289 978 1.0416666666666664e-03 289 286 -1.0416666666666661e-11 289 708 1.0416666666666673e-03 289 1011 6.2500000000000003e-03 289 288 -2.0833333333333329e-03 289 3213 1.0416666666666664e-03 289 2413 1.3552525540481672e-20 289 4886 1.0416666666666664e-03 289 3780 4.0389678347315804e-27 290 290 2.4999999999999996e-10 290 939 2.0833333333333329e-11 290 947 -2.0833333333333326e-11 290 3083 -2.0833333333333332e-11 290 2412 -2.0833333333333326e-11 290 3661 -4.1666666666666665e-11 290 3085 -2.0833333333333332e-11 290 3084 -2.0833333333333326e-11 290 3474 -4.1666666666666665e-11 290 2405 4.1666666666666665e-11 290 2414 -2.0833333333333326e-11 290 4467 -2.0833333333333332e-11 290 3781 -2.0833333333333326e-11 290 5004 -4.1666666666666665e-11 290 4466 -2.0833333333333332e-11 290 4465 -2.0833333333333326e-11 290 3777 4.1666666666666665e-11 290 1787 2.0833333333333332e-11 290 1208 4.1666666666666665e-11 291 291 4.9999999999999993e-10 291 1038 -1.0416666666666666e-10 291 1037 -4.1666666666666665e-11 291 1041 2.0833333333333329e-11 291 1036 -1.0416666666666666e-10 291 1028 -2.0833333333333332e-11 291 292 -1.0416666666666661e-11 291 1031 4.1666666666666665e-11 291 1025 2.0833333333333329e-11 291 1035 -4.1666666666666658e-11 291 1024 1.0416666666666666e-10 291 1916 2.0833333333333329e-11 291 2264 2.0833333333333332e-11 291 1286 -1.0416666666666661e-11 291 1287 5.2083333333333328e-11 291 1282 5.2083333333333328e-11 291 1915 2.0833333333333332e-11 291 1278 5.2083333333333328e-11 291 1285 -1.0416666666666663e-11 292 292 1.2499999999999998e-10 292 1037 -1.2116903504194741e-27 292 1031 -1.2116903504194741e-27 292 1036 -1.0416666666666661e-11 292 291 -1.0416666666666661e-11 292 702 -1.0097419586828951e-27 292 1028 4.0389678347315804e-27 292 703 -1.0416666666666661e-11 292 1041 -4.0389678347315804e-27 292 1282 4.0389678347315804e-27 292 2269 -1.0097419586828951e-27 292 1290 -1.0416666666666661e-11 292 1287 4.0389678347315804e-27 293 293 1.2500000062500002e-02 293 704 -1.2116903504194741e-27 293 705 1.2116903504194741e-27 293 706 -1.0416666666666661e-11 293 708 1.0416666666666664e-03 293 1015 1.0416666666666673e-03 293 1014 1.0416666666666664e-03 293 1011 6.2500000000000003e-03 293 1470 -1.0416666666666661e-11 293 3977 8.1315162936412833e-20 293 4886 1.0416666666666664e-03 293 1463 5.6545549686242126e-27 293 3971 -2.0833333333333329e-03 294 294 4.1666666666666662e-10 294 702 -2.0833333333333326e-11 294 1029 2.0833333333333329e-11 294 298 2.1169082391605852e-27 294 701 1.0416666666666665e-11 294 948 2.0833333333333329e-11 294 299 5.2083333333333328e-11 294 712 -2.0833333333333329e-11 294 300 3.7324953730532174e-27 294 698 1.0416666666666665e-11 294 707 2.0833333333333326e-11 294 296 5.2083333333333328e-11 294 705 -2.0833333333333329e-11 294 295 2.1169082391605852e-27 294 700 1.0416666666666665e-11 294 699 1.0416666666666665e-11 294 1818 -6.2499999999999991e-11 294 1816 -6.2500000000000004e-11 294 1819 -6.2499999999999991e-11 294 2284 2.0833333333333329e-11 294 1674 5.2083333333333328e-11 294 1675 5.2083333333333328e-11 294 2283 2.0833333333333329e-11 294 1817 -6.2500000000000004e-11 294 1672 3.7324953730532174e-27 295 295 1.2499999999999998e-10 295 706 1.4136387421560532e-27 295 709 -1.0097419586828951e-27 295 302 4.0389678347315804e-27 295 708 -1.6155871338926322e-27 295 698 -1.0097419586828951e-27 295 707 1.0416666666666663e-11 295 296 -1.0416666666666663e-11 295 700 1.4136387421560532e-27 295 294 1.6155871338926322e-27 295 705 -1.0416666666666665e-11 295 1674 -1.0416666666666665e-11 295 1819 4.0389678347315804e-27 296 296 5.0000000000000003e-10 296 970 -2.0833333333333329e-11 296 711 -4.1666666666666665e-11 296 946 2.0833333333333332e-11 296 310 5.2083333333333328e-11 296 708 2.0833333333333329e-11 296 709 -4.1666666666666658e-11 296 710 -1.0416666666666666e-10 296 978 2.0833333333333332e-11 296 302 5.2083333333333328e-11 296 305 -1.0416666666666663e-11 296 712 -1.0416666666666666e-10 296 300 -1.0416666666666661e-11 296 698 4.1666666666666665e-11 296 707 1.0416666666666666e-10 296 294 5.2083333333333328e-11 296 295 -1.0416666666666661e-11 296 1816 -2.0833333333333329e-11 296 1819 -2.0833333333333332e-11 297 297 4.1666666666666662e-10 297 1049 -2.0833333333333329e-11 297 1067 -2.0833333333333329e-11 297 1043 -6.2499999999999991e-11 297 312 3.5628902784306998e-27 297 1045 1.0416666666666661e-11 297 642 2.0833333333333326e-11 297 311 5.2083333333333328e-11 297 641 2.0833333333333329e-11 297 636 6.2499999999999991e-11 297 309 3.5628902784306998e-27 297 1040 1.0416666666666661e-11 297 1029 2.0833333333333329e-11 297 299 5.2083333333333328e-11 297 702 -2.0833333333333329e-11 297 1028 6.2499999999999991e-11 297 298 3.5628902784306998e-27 297 703 -1.0416666666666661e-11 297 1044 1.0416666666666661e-11 297 1041 -6.2499999999999991e-11 297 2269 2.0833333333333326e-11 297 1675 5.2083333333333328e-11 297 1677 5.2083333333333328e-11 297 2267 2.0833333333333329e-11 297 1676 3.5628902784306998e-27 298 298 1.2499999999999998e-10 298 699 -1.0097419586828951e-27 298 701 1.4136387421560532e-27 298 294 1.6155871338926322e-27 298 1040 -1.4136387421560532e-27 298 1029 1.0416666666666665e-11 298 299 -1.0416666666666665e-11 298 703 -1.0097419586828951e-27 298 297 4.0389678347315804e-27 298 702 -1.0416666666666663e-11 298 1028 -1.6155871338926322e-27 298 1818 4.0389678347315804e-27 298 1675 -1.0416666666666663e-11 299 299 4.9999999999999993e-10 299 636 2.0833333333333329e-11 299 946 2.0833333333333329e-11 299 974 4.1666666666666658e-11 299 641 1.0416666666666666e-10 299 634 2.0833333333333332e-11 299 310 5.2083333333333328e-11 299 309 -1.0416666666666663e-11 299 701 4.1666666666666665e-11 299 948 1.0416666666666666e-10 299 294 5.2083333333333328e-11 299 300 -1.0416666666666661e-11 299 1040 4.1666666666666658e-11 299 1029 1.0416666666666666e-10 299 1028 2.0833333333333332e-11 299 297 5.2083333333333328e-11 299 298 -1.0416666666666663e-11 299 1818 -2.0833333333333329e-11 299 1816 -2.0833333333333332e-11 300 300 1.2499999999999998e-10 300 711 1.2116903504194741e-27 300 974 1.0097419586828951e-27 300 310 4.0389678347315804e-27 300 946 -4.0389678347315804e-27 300 701 -1.0097419586828951e-27 300 948 1.0416666666666661e-11 300 299 -1.0416666666666661e-11 300 698 1.2116903504194741e-27 300 296 -1.0416666666666661e-11 300 294 4.0389678347315804e-27 300 712 -1.0416666666666661e-11 300 1816 4.0389678347315804e-27 301 301 1.2499999999999998e-10 301 1060 1.0097419586828951e-27 301 1063 -1.4136387421560532e-27 301 306 1.6155871338926322e-27 301 1020 -4.0389678347315804e-27 301 1019 -1.4136387421560532e-27 301 1021 1.0416666666666665e-11 301 304 -1.0416666666666665e-11 301 1017 1.0097419586828951e-27 301 303 -1.0416666666666663e-11 301 302 4.0389678347315804e-27 301 1022 1.0416666666666663e-11 301 1018 1.6155871338926322e-27 302 302 4.1666666666666662e-10 302 1016 2.0833333333333326e-11 302 704 -2.0833333333333329e-11 302 1015 6.2499999999999991e-11 302 308 3.5628902784306998e-27 302 706 -1.0416666666666661e-11 302 705 -2.0833333333333329e-11 302 707 2.0833333333333329e-11 302 708 6.2499999999999991e-11 302 295 3.5628902784306998e-27 302 709 -1.0416666666666661e-11 302 710 -2.0833333333333326e-11 302 296 5.2083333333333328e-11 302 979 2.0833333333333329e-11 302 978 6.2499999999999991e-11 302 305 3.5628902784306998e-27 302 1019 1.0416666666666661e-11 302 1021 2.0833333333333329e-11 302 304 5.2083333333333328e-11 302 1017 1.0416666666666661e-11 302 303 5.2083333333333328e-11 302 1022 2.0833333333333329e-11 302 1018 -6.2499999999999991e-11 302 301 3.5628902784306998e-27 302 1674 5.2083333333333328e-11 303 303 4.9999999999999993e-10 303 1015 2.0833333333333332e-11 303 1016 1.0416666666666666e-10 303 308 -1.0416666666666663e-11 303 1062 -4.1666666666666665e-11 303 1061 -1.0416666666666666e-10 303 1064 -2.0833333333333329e-11 303 307 -1.0416666666666661e-11 303 1060 -4.1666666666666665e-11 303 1020 2.0833333333333332e-11 303 306 5.2083333333333328e-11 303 1017 4.1666666666666658e-11 303 302 5.2083333333333328e-11 303 1022 1.0416666666666666e-10 303 1018 -2.0833333333333329e-11 303 301 -1.0416666666666661e-11 303 1940 -2.0833333333333329e-11 303 2280 -2.0833333333333332e-11 303 1673 5.2083333333333328e-11 304 304 5.0000000000000003e-10 304 717 2.0833333333333329e-11 304 975 4.1666666666666658e-11 304 970 -2.0833333333333332e-11 304 310 5.2083333333333328e-11 304 716 1.0416666666666666e-10 304 715 2.0833333333333332e-11 304 313 -1.0416666666666661e-11 304 1063 -4.1666666666666665e-11 304 306 5.2083333333333328e-11 304 1020 2.0833333333333329e-11 304 979 1.0416666666666666e-10 304 978 2.0833333333333329e-11 304 305 -1.0416666666666663e-11 304 1019 4.1666666666666658e-11 304 1021 1.0416666666666666e-10 304 1018 -2.0833333333333332e-11 304 302 5.2083333333333328e-11 304 301 -1.0416666666666663e-11 305 305 1.2499999999999998e-10 305 975 -1.2116903504194741e-27 305 711 -1.4136387421560532e-27 305 310 1.6155871338926322e-27 305 970 4.0389678347315804e-27 305 709 1.4136387421560532e-27 305 710 -1.0416666666666666e-11 305 296 -1.0416666666666666e-11 305 1019 1.2116903504194741e-27 305 304 -1.0416666666666666e-11 305 302 4.0389678347315804e-27 305 979 1.0416666666666666e-11 305 978 -1.6155871338926322e-27 306 306 4.1666666666666662e-10 306 716 2.0833333333333329e-11 306 718 2.0833333333333329e-11 306 715 6.2500000000000004e-11 306 313 3.7324953730532174e-27 306 1066 1.0416666666666665e-11 306 1067 -2.0833333333333326e-11 306 311 5.2083333333333328e-11 306 1049 -2.0833333333333329e-11 306 1065 -6.2499999999999991e-11 306 312 2.1169082391605852e-27 306 1047 -1.0416666666666665e-11 306 1048 -2.0833333333333329e-11 306 1061 -2.0833333333333329e-11 306 1064 -6.2500000000000004e-11 306 307 3.7324953730532174e-27 306 1060 -1.0416666666666665e-11 306 1022 2.0833333333333326e-11 306 303 5.2083333333333328e-11 306 1063 -1.0416666666666665e-11 306 304 5.2083333333333328e-11 306 1021 2.0833333333333329e-11 306 1020 6.2499999999999991e-11 306 301 2.1169082391605852e-27 306 1677 5.2083333333333328e-11 307 307 1.2499999999999998e-10 307 1062 1.2116903504194741e-27 307 1047 1.0097419586828951e-27 307 1048 -1.0416666666666661e-11 307 1060 -1.2116903504194741e-27 307 303 -1.0416666666666661e-11 307 306 4.0389678347315804e-27 307 1061 -1.0416666666666661e-11 307 1064 4.0389678347315804e-27 307 2279 1.0097419586828951e-27 307 1673 4.0389678347315804e-27 307 2280 4.0389678347315804e-27 307 1677 -1.0416666666666661e-11 308 308 1.2499999999999998e-10 308 1017 -1.4136387421560532e-27 308 706 -1.2116903504194741e-27 308 302 4.0389678347315804e-27 308 1015 -1.6155871338926322e-27 308 704 -1.0416666666666666e-11 308 1062 -1.4136387421560532e-27 308 303 -1.0416666666666666e-11 308 1016 1.0416666666666666e-11 308 2282 -1.2116903504194741e-27 308 1674 -1.0416666666666666e-11 308 1673 1.6155871338926322e-27 308 1940 4.0389678347315804e-27 309 309 1.2499999999999998e-10 309 1045 -1.4136387421560532e-27 309 1040 1.2116903504194741e-27 309 297 4.0389678347315804e-27 309 636 -1.6155871338926322e-27 309 974 -1.2116903504194741e-27 309 641 1.0416666666666666e-11 309 299 -1.0416666666666666e-11 309 972 1.4136387421560532e-27 309 311 -1.0416666666666666e-11 309 310 1.6155871338926322e-27 309 642 1.0416666666666666e-11 309 634 -4.0389678347315804e-27 310 310 4.1666666666666662e-10 310 718 2.0833333333333329e-11 310 716 2.0833333333333329e-11 310 717 6.2499999999999991e-11 310 313 3.5628902784306998e-27 310 975 1.0416666666666665e-11 310 979 2.0833333333333326e-11 310 304 5.2083333333333328e-11 310 710 -2.0833333333333329e-11 310 970 -6.2499999999999991e-11 310 305 2.1169082391605852e-27 310 711 -1.0416666666666665e-11 310 712 -2.0833333333333329e-11 310 296 5.2083333333333328e-11 310 948 2.0833333333333329e-11 310 946 6.2499999999999991e-11 310 300 3.5628902784306998e-27 310 974 1.0416666666666665e-11 310 641 2.0833333333333326e-11 310 299 5.2083333333333328e-11 310 972 1.0416666666666665e-11 310 311 5.2083333333333328e-11 310 642 2.0833333333333329e-11 310 634 6.2499999999999991e-11 310 309 2.1169082391605852e-27 311 311 4.9999999999999993e-10 311 717 2.0833333333333332e-11 311 718 1.0416666666666666e-10 311 715 2.0833333333333329e-11 311 313 -1.0416666666666661e-11 311 1066 4.1666666666666665e-11 311 1065 -2.0833333333333332e-11 311 306 5.2083333333333328e-11 311 1067 -1.0416666666666666e-10 311 1043 -2.0833333333333329e-11 311 312 -1.0416666666666661e-11 311 1045 4.1666666666666658e-11 311 636 2.0833333333333332e-11 311 297 5.2083333333333328e-11 311 972 4.1666666666666665e-11 311 310 5.2083333333333328e-11 311 642 1.0416666666666666e-10 311 634 2.0833333333333329e-11 311 309 -1.0416666666666663e-11 312 312 1.2499999999999998e-10 312 1066 -1.0097419586828951e-27 312 1047 -1.4136387421560532e-27 312 306 1.6155871338926322e-27 312 1065 4.0389678347315804e-27 312 1044 -1.4136387421560532e-27 312 1049 -1.0416666666666665e-11 312 1045 1.0097419586828951e-27 312 311 -1.0416666666666663e-11 312 297 4.0389678347315804e-27 312 1067 -1.0416666666666663e-11 312 1043 1.6155871338926322e-27 312 1677 -1.0416666666666665e-11 313 313 1.2499999999999998e-10 313 972 -1.2116903504194741e-27 313 975 1.0097419586828951e-27 313 310 4.0389678347315804e-27 313 717 -4.0389678347315804e-27 313 1063 1.0097419586828951e-27 313 716 1.0416666666666661e-11 313 304 -1.0416666666666661e-11 313 1066 1.2116903504194741e-27 313 311 -1.0416666666666661e-11 313 306 4.0389678347315804e-27 313 718 1.0416666666666661e-11 313 715 -4.0389678347315804e-27 314 314 1.2499999999999997e-02 314 986 -1.3552527156068805e-19 314 721 1.3552527156068805e-19 314 977 -1.0416666666666664e-03 314 981 -4.3368086899420177e-19 314 714 -1.3552527156068805e-19 314 980 1.0416666666666664e-03 314 713 2.1684043449710089e-19 314 316 -1.0416666666666664e-03 314 315 4.3368086899420177e-19 314 3212 -1.3552527156068805e-19 314 2671 -1.0416666666666664e-03 314 2665 2.1684043449710089e-19 315 315 2.0833333541666665e-02 315 726 -2.0833333333333329e-11 315 975 2.0833333333333329e-11 315 977 -2.0833333333333333e-03 315 591 2.0833333333333333e-03 315 721 1.0416666666666660e-03 315 973 2.0833333333333329e-03 315 717 -3.1250000312499993e-03 315 321 7.8879979260055783e-21 315 719 1.0416666666666661e-11 315 590 2.0833333333333329e-11 315 585 3.1250000312499997e-03 315 318 5.2083333333333328e-11 315 320 4.0414059491689842e-19 315 716 1.0416666666666661e-11 315 1063 -2.0833333333333326e-11 315 715 -6.2499999999999991e-11 315 319 5.2083333333333328e-11 315 317 3.5628902784306998e-27 315 714 1.0416666666666660e-03 315 980 2.0833333333333329e-03 315 713 -6.2499999999999995e-03 315 316 5.2083333333333330e-03 315 314 4.1202858928001372e-19 315 2671 5.2083333333333330e-03 316 316 4.9999999999999996e-02 316 981 2.0833333333333329e-03 316 986 -4.1666666666666657e-03 316 985 -1.0416666666666664e-02 316 585 2.0833333333333329e-03 316 731 4.1666666666666657e-03 316 591 1.0416666666666664e-02 316 583 2.0833333333333329e-03 316 320 -1.0416666666666662e-03 316 714 4.1666666666666657e-03 316 980 1.0416666666666664e-02 316 713 -2.0833333333333329e-03 316 315 5.2083333333333322e-03 316 314 -1.0416666666666664e-03 316 3390 2.0833333333333329e-03 316 3211 2.0833333333333329e-03 316 2665 5.2083333333333322e-03 316 2673 -1.0416666666666662e-03 316 2670 5.2083333333333322e-03 317 317 1.2499999999999998e-10 317 719 1.2116903504194741e-27 317 1021 1.4136387421560532e-27 317 716 -1.4136387421560532e-27 317 1063 -1.0416666666666666e-11 317 715 1.6155871338926322e-27 317 319 -1.0416666666666666e-11 317 315 4.0389678347315804e-27 317 727 1.2116903504194741e-27 317 726 -1.0416666666666666e-11 317 1020 4.0389678347315804e-27 317 318 -1.0416666666666666e-11 317 2668 1.6155871338926322e-27 318 318 4.9999999999999993e-10 318 715 -2.0833333333333329e-11 318 729 -1.0416666666666666e-10 318 728 -4.1666666666666665e-11 318 583 2.0833333333333329e-11 318 719 4.1666666666666658e-11 318 590 1.0416666666666666e-10 318 585 2.0833333333333332e-11 318 315 5.2083333333333328e-11 318 320 -1.0416666666666663e-11 318 727 -4.1666666666666658e-11 318 726 -1.0416666666666666e-10 318 1020 -2.0833333333333332e-11 318 317 -1.0416666666666663e-11 318 3385 2.0833333333333329e-11 318 3387 2.0833333333333332e-11 318 2669 -1.0416666666666661e-11 318 2670 5.2083333333333328e-11 318 2668 5.2083333333333328e-11 319 319 4.9999999999999993e-10 319 717 -2.0833333333333329e-11 319 975 1.0416666666666666e-10 319 970 2.0833333333333332e-11 319 321 -1.0416666666666661e-11 319 1020 -2.0833333333333329e-11 319 979 4.1666666666666665e-11 319 978 -2.0833333333333329e-11 319 1021 4.1666666666666665e-11 319 1019 1.0416666666666666e-10 319 1018 2.0833333333333332e-11 319 322 -1.0416666666666661e-11 319 716 4.1666666666666658e-11 319 1063 -1.0416666666666666e-10 319 715 -2.0833333333333332e-11 319 315 5.2083333333333328e-11 319 317 -1.0416666666666663e-11 319 2666 5.2083333333333328e-11 319 2668 5.2083333333333328e-11 320 320 6.2500000624999986e-03 320 714 1.3552527156068805e-19 320 731 -1.3552527156068805e-19 320 591 1.0416666666666662e-03 320 316 -1.0416666666666662e-03 320 728 -1.4136387421560532e-27 320 583 -4.3368086899420177e-19 320 719 -1.4136387421560532e-27 320 590 1.0416666666666665e-11 320 585 1.0842021401737618e-19 320 318 -1.0416666666666665e-11 320 315 4.3368086899420177e-19 320 2670 -1.0842021401737618e-19 321 321 6.2500000624999986e-03 321 716 1.0097419586828951e-27 321 979 -1.0097419586828951e-27 321 975 1.0416666666666663e-11 321 319 -1.0416666666666663e-11 321 970 -4.0389678347315804e-27 321 721 -1.3552527156068805e-19 321 973 1.0416666666666664e-03 321 717 3.2526065013006420e-19 321 315 4.0389678347315804e-27 321 3215 1.3552527156068805e-19 321 2666 3.2526065013006420e-19 321 2671 -1.0416666666666664e-03 322 322 1.2500000062500002e-02 322 979 1.2116903504194741e-27 322 1021 -1.2116903504194741e-27 322 1019 1.0416666666666661e-11 322 319 -1.0416666666666661e-11 322 1018 -1.0416666666666664e-03 322 1012 1.0416666666666664e-03 322 978 1.0416666666666673e-03 322 1011 6.2500000000000003e-03 322 2668 8.1315162936412833e-20 322 3213 1.0416666666666664e-03 322 2666 5.6545549686242126e-27 322 2674 -2.0833333333333329e-03 323 323 1.2499999999999998e-10 323 723 1.0097419586828951e-27 323 726 -1.2116903504194741e-27 323 345 4.0389678347315804e-27 323 715 -4.0389678347315804e-27 323 590 -1.2116903504194741e-27 323 719 1.0416666666666661e-11 323 326 -1.0416666666666661e-11 323 588 1.0097419586828951e-27 323 325 -1.0416666666666661e-11 323 324 4.0389678347315804e-27 323 720 1.0416666666666661e-11 323 585 4.0389678347315804e-27 324 324 4.1666666666666662e-10 324 599 2.0833333333333326e-11 324 598 2.0833333333333329e-11 324 587 -6.2499999999999991e-11 324 348 2.1169082391605852e-27 324 592 1.0416666666666665e-11 324 615 2.0833333333333329e-11 324 337 5.2083333333333328e-11 324 614 2.0833333333333329e-11 324 581 -6.2499999999999991e-11 324 338 3.5628902784306998e-27 324 584 1.0416666666666665e-11 324 730 2.0833333333333326e-11 324 328 5.2083333333333328e-11 324 728 -2.0833333333333329e-11 324 583 -6.2499999999999991e-11 324 327 2.1169082391605852e-27 324 590 1.0416666666666665e-11 324 719 2.0833333333333329e-11 324 326 5.2083333333333328e-11 324 588 1.0416666666666665e-11 324 325 5.2083333333333328e-11 324 720 2.0833333333333329e-11 324 585 -6.2499999999999991e-11 324 323 3.5628902784306998e-27 325 325 4.9999999999999993e-10 325 587 -2.0833333333333332e-11 325 599 1.0416666666666666e-10 325 597 2.0833333333333329e-11 325 348 -1.0416666666666663e-11 325 725 -4.1666666666666658e-11 325 918 -2.0833333333333332e-11 325 339 5.2083333333333328e-11 325 724 -1.0416666666666666e-10 325 1065 -2.0833333333333329e-11 325 347 -1.0416666666666663e-11 325 723 -4.1666666666666665e-11 325 715 2.0833333333333332e-11 325 345 5.2083333333333328e-11 325 588 4.1666666666666658e-11 325 324 5.2083333333333328e-11 325 720 1.0416666666666666e-10 325 585 -2.0833333333333329e-11 325 323 -1.0416666666666661e-11 326 326 4.9999999999999993e-10 326 715 2.0833333333333329e-11 326 729 -4.1666666666666658e-11 326 330 5.2083333333333328e-11 326 726 -4.1666666666666665e-11 326 727 -1.0416666666666666e-10 326 1020 2.0833333333333332e-11 326 345 5.2083333333333328e-11 326 346 -1.0416666666666661e-11 326 728 -1.0416666666666666e-10 326 583 -2.0833333333333329e-11 326 327 -1.0416666666666663e-11 326 590 4.1666666666666665e-11 326 719 1.0416666666666666e-10 326 585 -2.0833333333333332e-11 326 324 5.2083333333333328e-11 326 323 -1.0416666666666661e-11 326 3385 -2.0833333333333329e-11 326 3387 -2.0833333333333332e-11 327 327 1.2499999999999998e-10 327 729 1.4136387421560532e-27 327 732 -1.2116903504194741e-27 327 330 4.0389678347315804e-27 327 584 -1.2116903504194741e-27 327 730 1.0416666666666666e-11 327 328 -1.0416666666666666e-11 327 590 1.4136387421560532e-27 327 326 -1.0416666666666666e-11 327 324 1.6155871338926322e-27 327 728 -1.0416666666666666e-11 327 583 4.0389678347315804e-27 327 3387 1.6155871338926322e-27 328 328 4.9999999999999993e-10 328 581 -2.0833333333333329e-11 328 734 -4.1666666666666665e-11 328 614 1.0416666666666666e-10 328 335 5.2083333333333328e-11 328 338 -1.0416666666666661e-11 328 732 -4.1666666666666658e-11 328 733 -1.0416666666666666e-10 328 330 5.2083333333333328e-11 328 333 -1.0416666666666663e-11 328 584 4.1666666666666658e-11 328 730 1.0416666666666666e-10 328 583 -2.0833333333333332e-11 328 324 5.2083333333333328e-11 328 327 -1.0416666666666663e-11 328 3387 -2.0833333333333329e-11 328 2165 -2.0833333333333332e-11 329 329 1.2499999999999998e-10 329 788 1.2116903504194741e-27 329 789 -1.4136387421560532e-27 329 342 1.6155871338926322e-27 329 782 -1.4136387421560532e-27 329 783 1.0416666666666666e-11 329 332 -1.0416666666666666e-11 329 781 1.2116903504194741e-27 329 331 -1.0416666666666666e-11 329 330 4.0389678347315804e-27 329 784 1.0416666666666666e-11 329 2046 4.0389678347315804e-27 329 2159 1.6155871338926322e-27 330 330 4.1666666666666662e-10 330 785 -2.0833333333333329e-11 330 727 -2.0833333333333329e-11 330 346 3.5628902784306998e-27 330 729 -1.0416666666666661e-11 330 728 -2.0833333333333326e-11 330 326 5.2083333333333328e-11 330 730 2.0833333333333329e-11 330 327 3.5628902784306998e-27 330 732 -1.0416666666666661e-11 330 733 -2.0833333333333329e-11 330 328 5.2083333333333328e-11 330 791 -2.0833333333333329e-11 330 333 3.5628902784306998e-27 330 782 1.0416666666666661e-11 330 783 2.0833333333333326e-11 330 332 5.2083333333333328e-11 330 781 1.0416666666666661e-11 330 331 5.2083333333333328e-11 330 784 2.0833333333333329e-11 330 329 3.5628902784306998e-27 330 3385 -6.2499999999999991e-11 330 3387 -6.2499999999999991e-11 330 2165 -6.2499999999999991e-11 330 2159 -6.2499999999999991e-11 331 331 5.0000000000000003e-10 331 788 -4.1666666666666658e-11 331 342 5.2083333333333328e-11 331 785 -1.0416666666666666e-10 331 1020 2.0833333333333329e-11 331 346 -1.0416666666666663e-11 331 786 -4.1666666666666665e-11 331 787 -1.0416666666666666e-10 331 1064 -2.0833333333333332e-11 331 345 5.2083333333333328e-11 331 344 -1.0416666666666661e-11 331 781 4.1666666666666658e-11 331 330 5.2083333333333328e-11 331 784 1.0416666666666666e-10 331 329 -1.0416666666666663e-11 331 2047 -2.0833333333333329e-11 331 2046 -2.0833333333333332e-11 331 3385 -2.0833333333333332e-11 331 2159 -2.0833333333333329e-11 332 332 4.9999999999999993e-10 332 792 -4.1666666666666665e-11 332 335 5.2083333333333328e-11 332 789 -4.1666666666666665e-11 332 790 -1.0416666666666666e-10 332 342 5.2083333333333328e-11 332 343 -1.0416666666666661e-11 332 791 -1.0416666666666666e-10 332 333 -1.0416666666666661e-11 332 782 4.1666666666666658e-11 332 783 1.0416666666666666e-10 332 330 5.2083333333333328e-11 332 329 -1.0416666666666663e-11 332 2046 -2.0833333333333329e-11 332 1703 -2.0833333333333332e-11 332 2165 -2.0833333333333329e-11 332 2159 -2.0833333333333332e-11 333 333 1.2499999999999998e-10 333 792 1.0097419586828951e-27 333 734 -1.4136387421560532e-27 333 335 1.6155871338926322e-27 333 732 1.4136387421560532e-27 333 733 -1.0416666666666665e-11 333 328 -1.0416666666666665e-11 333 782 1.0097419586828951e-27 333 332 -1.0416666666666663e-11 333 330 4.0389678347315804e-27 333 791 -1.0416666666666663e-11 333 2165 1.6155871338926322e-27 334 334 1.2499999999999998e-10 334 911 1.4136387421560532e-27 334 914 -1.0097419586828951e-27 334 339 4.0389678347315804e-27 334 906 -1.6155871338926322e-27 334 905 -1.0097419586828951e-27 334 908 1.0416666666666663e-11 334 337 -1.0416666666666663e-11 334 903 1.4136387421560532e-27 334 336 -1.0416666666666665e-11 334 335 1.6155871338926322e-27 334 909 1.0416666666666665e-11 335 335 4.1666666666666662e-10 335 910 -2.0833333333333329e-11 335 790 -2.0833333333333329e-11 335 343 3.7324953730532174e-27 335 792 -1.0416666666666665e-11 335 791 -2.0833333333333326e-11 335 332 5.2083333333333328e-11 335 733 -2.0833333333333329e-11 335 333 2.1169082391605852e-27 335 734 -1.0416666666666665e-11 335 614 2.0833333333333329e-11 335 328 5.2083333333333328e-11 335 615 2.0833333333333329e-11 335 338 3.7324953730532174e-27 335 905 1.0416666666666665e-11 335 908 2.0833333333333326e-11 335 337 5.2083333333333328e-11 335 903 1.0416666666666665e-11 335 336 5.2083333333333328e-11 335 909 2.0833333333333329e-11 335 334 2.1169082391605852e-27 336 336 4.9999999999999993e-10 336 910 -1.0416666666666666e-10 336 343 -1.0416666666666661e-11 336 913 -4.1666666666666658e-11 336 342 5.2083333333333328e-11 336 912 -1.0416666666666666e-10 336 916 -2.0833333333333329e-11 336 340 -1.0416666666666663e-11 336 911 -4.1666666666666658e-11 336 906 2.0833333333333332e-11 336 339 5.2083333333333328e-11 336 903 4.1666666666666665e-11 336 335 5.2083333333333328e-11 336 909 1.0416666666666666e-10 336 334 -1.0416666666666663e-11 336 1703 -2.0833333333333329e-11 336 2044 -2.0833333333333332e-11 337 337 5.0000000000000003e-10 337 587 -2.0833333333333329e-11 337 592 4.1666666666666665e-11 337 581 -2.0833333333333332e-11 337 324 5.2083333333333328e-11 337 598 1.0416666666666666e-10 337 597 2.0833333333333332e-11 337 348 -1.0416666666666663e-11 337 914 -4.1666666666666658e-11 337 339 5.2083333333333328e-11 337 906 2.0833333333333329e-11 337 615 1.0416666666666666e-10 337 338 -1.0416666666666661e-11 337 905 4.1666666666666665e-11 337 908 1.0416666666666666e-10 337 335 5.2083333333333328e-11 337 334 -1.0416666666666661e-11 338 338 1.2499999999999998e-10 338 592 -1.2116903504194741e-27 338 584 1.0097419586828951e-27 338 324 4.0389678347315804e-27 338 581 4.0389678347315804e-27 338 734 1.0097419586828951e-27 338 614 1.0416666666666661e-11 338 328 -1.0416666666666661e-11 338 905 1.2116903504194741e-27 338 337 -1.0416666666666661e-11 338 335 4.0389678347315804e-27 338 615 1.0416666666666661e-11 339 339 4.1666666666666662e-10 339 598 2.0833333333333326e-11 339 599 2.0833333333333329e-11 339 597 6.2499999999999991e-11 339 348 3.5628902784306998e-27 339 725 -1.0416666666666661e-11 339 724 -2.0833333333333329e-11 339 325 5.2083333333333328e-11 339 929 -2.0833333333333329e-11 339 918 -6.2499999999999991e-11 339 347 3.5628902784306998e-27 339 917 1.0416666666666661e-11 339 921 2.0833333333333326e-11 339 341 5.2083333333333328e-11 339 912 -2.0833333333333329e-11 339 916 -6.2499999999999991e-11 339 340 3.5628902784306998e-27 339 911 -1.0416666666666661e-11 339 909 2.0833333333333329e-11 339 336 5.2083333333333328e-11 339 914 -1.0416666666666661e-11 339 337 5.2083333333333328e-11 339 908 2.0833333333333329e-11 339 906 6.2499999999999991e-11 339 334 3.5628902784306998e-27 340 340 1.2499999999999998e-10 340 913 1.2116903504194741e-27 340 930 -1.4136387421560532e-27 340 342 1.6155871338926322e-27 340 917 -1.4136387421560532e-27 340 921 1.0416666666666666e-11 340 341 -1.0416666666666666e-11 340 911 -1.2116903504194741e-27 340 336 -1.0416666666666666e-11 340 339 4.0389678347315804e-27 340 912 -1.0416666666666666e-11 340 916 1.6155871338926322e-27 340 2044 4.0389678347315804e-27 341 341 4.9999999999999993e-10 341 918 -2.0833333333333329e-11 341 929 -1.0416666666666666e-10 341 1065 -2.0833333333333332e-11 341 347 -1.0416666666666661e-11 341 928 -4.1666666666666665e-11 341 345 5.2083333333333328e-11 341 931 -1.0416666666666666e-10 341 1064 -2.0833333333333329e-11 341 344 -1.0416666666666661e-11 341 930 -4.1666666666666665e-11 341 342 5.2083333333333328e-11 341 917 4.1666666666666658e-11 341 921 1.0416666666666666e-10 341 916 -2.0833333333333332e-11 341 339 5.2083333333333328e-11 341 340 -1.0416666666666663e-11 341 2047 -2.0833333333333332e-11 341 2044 -2.0833333333333329e-11 342 342 4.1666666666666662e-10 342 931 -2.0833333333333329e-11 342 787 -2.0833333333333329e-11 342 344 3.5628902784306998e-27 342 788 -1.0416666666666665e-11 342 784 2.0833333333333326e-11 342 331 5.2083333333333328e-11 342 783 2.0833333333333329e-11 342 329 2.1169082391605852e-27 342 789 -1.0416666666666665e-11 342 790 -2.0833333333333329e-11 342 332 5.2083333333333328e-11 342 910 -2.0833333333333329e-11 342 343 3.5628902784306998e-27 342 913 -1.0416666666666665e-11 342 912 -2.0833333333333326e-11 342 336 5.2083333333333328e-11 342 930 -1.0416666666666665e-11 342 341 5.2083333333333328e-11 342 921 2.0833333333333329e-11 342 340 2.1169082391605852e-27 342 2047 -6.2499999999999991e-11 342 2046 -6.2499999999999991e-11 342 1703 -6.2499999999999991e-11 342 2044 -6.2499999999999991e-11 343 343 1.2499999999999998e-10 343 903 -1.0097419586828951e-27 343 792 -1.2116903504194741e-27 343 335 4.0389678347315804e-27 343 789 1.2116903504194741e-27 343 790 -1.0416666666666661e-11 343 332 -1.0416666666666661e-11 343 913 -1.0097419586828951e-27 343 336 -1.0416666666666661e-11 343 342 4.0389678347315804e-27 343 910 -1.0416666666666661e-11 343 1703 4.0389678347315804e-27 344 344 1.2499999999999998e-10 344 930 1.2116903504194741e-27 344 788 -1.0097419586828951e-27 344 342 4.0389678347315804e-27 344 786 1.0097419586828951e-27 344 787 -1.0416666666666661e-11 344 331 -1.0416666666666661e-11 344 928 -1.2116903504194741e-27 344 341 -1.0416666666666661e-11 344 345 4.0389678347315804e-27 344 931 -1.0416666666666661e-11 344 1064 4.0389678347315804e-27 344 2047 4.0389678347315804e-27 345 345 4.1666666666666662e-10 345 929 -2.0833333333333326e-11 345 724 -2.0833333333333329e-11 345 1065 -6.2499999999999991e-11 345 347 2.1169082391605852e-27 345 723 -1.0416666666666665e-11 345 720 2.0833333333333329e-11 345 325 5.2083333333333328e-11 345 719 2.0833333333333329e-11 345 715 6.2500000000000004e-11 345 323 3.7324953730532174e-27 345 726 -1.0416666666666665e-11 345 727 -2.0833333333333326e-11 345 326 5.2083333333333328e-11 345 785 -2.0833333333333329e-11 345 1020 6.2499999999999991e-11 345 346 2.1169082391605852e-27 345 786 -1.0416666666666665e-11 345 787 -2.0833333333333329e-11 345 331 5.2083333333333328e-11 345 928 -1.0416666666666665e-11 345 341 5.2083333333333328e-11 345 931 -2.0833333333333329e-11 345 1064 -6.2500000000000004e-11 345 344 3.7324953730532174e-27 346 346 1.2499999999999998e-10 346 781 -1.4136387421560532e-27 346 729 -1.0097419586828951e-27 346 330 4.0389678347315804e-27 346 726 1.0097419586828951e-27 346 727 -1.0416666666666663e-11 346 326 -1.0416666666666663e-11 346 786 -1.4136387421560532e-27 346 331 -1.0416666666666665e-11 346 345 1.6155871338926322e-27 346 785 -1.0416666666666665e-11 346 1020 -4.0389678347315804e-27 346 3385 1.6155871338926322e-27 347 347 1.2499999999999998e-10 347 725 1.4136387421560532e-27 347 917 1.0097419586828951e-27 347 339 4.0389678347315804e-27 347 918 1.6155871338926322e-27 347 928 1.0097419586828951e-27 347 929 -1.0416666666666663e-11 347 341 -1.0416666666666663e-11 347 723 -1.4136387421560532e-27 347 325 -1.0416666666666665e-11 347 345 1.6155871338926322e-27 347 724 -1.0416666666666665e-11 347 1065 4.0389678347315804e-27 348 348 1.2499999999999998e-10 348 588 -1.2116903504194741e-27 348 592 1.4136387421560532e-27 348 324 1.6155871338926322e-27 348 587 4.0389678347315804e-27 348 914 1.4136387421560532e-27 348 598 1.0416666666666666e-11 348 337 -1.0416666666666666e-11 348 725 -1.2116903504194741e-27 348 325 -1.0416666666666666e-11 348 339 4.0389678347315804e-27 348 599 1.0416666666666666e-11 348 597 -1.6155871338926322e-27 349 349 1.2499999999999997e-02 349 743 1.3552527156068805e-19 349 833 1.3552527156068805e-19 349 736 -1.3552527156068805e-19 349 838 -1.0416666666666664e-03 349 735 2.1684043449710089e-19 349 353 -1.0416666666666664e-03 349 352 4.3368086899420177e-19 349 832 -1.3552527156068805e-19 349 839 1.0416666666666664e-03 349 831 4.3368086899420177e-19 349 351 -1.0416666666666664e-03 350 350 2.0833333333333329e-02 351 351 4.9999999999999989e-02 351 735 -2.0833333333333329e-03 351 811 -2.0833333333333329e-03 351 743 4.1666666666666657e-03 351 857 -1.0416666666666664e-02 351 739 -2.0833333333333329e-03 351 352 5.2083333333333322e-03 351 364 -1.0416666666666664e-03 351 812 4.1666666666666657e-03 351 529 1.0416666666666664e-02 351 832 4.1666666666666657e-03 351 839 1.0416666666666664e-02 351 831 -2.0833333333333329e-03 351 349 -1.0416666666666664e-03 352 352 2.0833333541666665e-02 352 748 -2.0833333333333329e-11 352 810 -2.0833333333333329e-11 352 839 2.0833333333333333e-03 352 630 2.0833333333333333e-03 352 743 1.0416666666666660e-03 352 857 -2.0833333333333329e-03 352 739 -3.1250000312499993e-03 352 351 5.2083333333333330e-03 352 364 7.8879979260055783e-21 352 741 1.0416666666666661e-11 352 629 2.0833333333333329e-11 352 624 3.1250000312499997e-03 352 357 5.2083333333333328e-11 352 358 4.0414059491689842e-19 352 738 1.0416666666666661e-11 352 808 -2.0833333333333326e-11 352 737 -6.2499999999999991e-11 352 355 5.2083333333333328e-11 352 354 3.5628902784306998e-27 352 736 1.0416666666666660e-03 352 838 -2.0833333333333329e-03 352 735 -6.2499999999999995e-03 352 353 5.2083333333333330e-03 352 349 4.1202858928001372e-19 353 353 4.9999999999999989e-02 353 624 2.0833333333333329e-03 353 630 1.0416666666666664e-02 353 622 2.0833333333333329e-03 353 358 -1.0416666666666662e-03 353 831 -2.0833333333333329e-03 353 754 4.1666666666666657e-03 353 833 4.1666666666666657e-03 353 830 1.0416666666666664e-02 353 736 4.1666666666666657e-03 353 838 -1.0416666666666664e-02 353 735 -2.0833333333333329e-03 353 352 5.2083333333333322e-03 353 349 -1.0416666666666664e-03 354 354 1.2499999999999998e-10 354 802 1.4136387421560532e-27 354 741 1.2116903504194741e-27 354 749 1.2116903504194741e-27 354 748 -1.0416666666666666e-11 354 799 4.0389678347315804e-27 354 357 -1.0416666666666666e-11 354 738 -1.4136387421560532e-27 354 808 -1.0416666666666666e-11 354 737 1.6155871338926322e-27 354 355 -1.0416666666666666e-11 354 352 4.0389678347315804e-27 355 355 4.9999999999999993e-10 355 799 -2.0833333333333329e-11 355 739 -2.0833333333333329e-11 355 810 -1.0416666666666666e-10 355 811 -2.0833333333333332e-11 355 364 -1.0416666666666661e-11 355 809 -4.1666666666666665e-11 355 802 4.1666666666666665e-11 355 798 1.0416666666666666e-10 355 738 4.1666666666666658e-11 355 808 -1.0416666666666666e-10 355 737 -2.0833333333333332e-11 355 352 5.2083333333333328e-11 355 354 -1.0416666666666663e-11 356 356 2.0833333333333331e-10 357 357 5.0000000000000003e-10 357 751 -1.0416666666666666e-10 357 737 -2.0833333333333329e-11 357 750 -4.1666666666666665e-11 357 622 2.0833333333333329e-11 357 741 4.1666666666666658e-11 357 629 1.0416666666666666e-10 357 624 2.0833333333333332e-11 357 352 5.2083333333333328e-11 357 358 -1.0416666666666663e-11 357 749 -4.1666666666666658e-11 357 748 -1.0416666666666666e-10 357 799 -2.0833333333333332e-11 357 354 -1.0416666666666663e-11 358 358 6.2500000624999986e-03 358 736 1.3552527156068805e-19 358 754 -1.3552527156068805e-19 358 630 1.0416666666666662e-03 358 353 -1.0416666666666662e-03 358 750 -1.4136387421560532e-27 358 622 -4.3368086899420177e-19 358 741 -1.4136387421560532e-27 358 629 1.0416666666666665e-11 358 624 1.0842021401737618e-19 358 357 -1.0416666666666665e-11 358 352 4.3368086899420177e-19 359 359 1.0416666770833333e-02 360 360 6.2499999999999991e-11 361 361 1.0416666770833333e-02 362 362 6.2499999999999986e-03 363 363 6.2499999999999986e-03 364 364 6.2500000624999986e-03 364 738 1.0097419586828951e-27 364 809 1.0097419586828951e-27 364 810 -1.0416666666666663e-11 364 355 -1.0416666666666663e-11 364 812 1.3552527156068805e-19 364 811 4.0389678347315804e-27 364 743 -1.3552527156068805e-19 364 857 -1.0416666666666664e-03 364 739 3.2526065013006420e-19 364 351 -1.0416666666666664e-03 364 352 4.0389678347315804e-27 365 365 6.2499999999999991e-11 366 366 1.2499999999999998e-10 366 747 1.0097419586828951e-27 366 748 -1.2116903504194741e-27 366 386 4.0389678347315804e-27 366 737 -4.0389678347315804e-27 366 629 -1.2116903504194741e-27 366 741 1.0416666666666661e-11 366 369 -1.0416666666666661e-11 366 627 1.0097419586828951e-27 366 368 -1.0416666666666661e-11 366 367 4.0389678347315804e-27 366 742 1.0416666666666661e-11 366 624 4.0389678347315804e-27 367 367 4.1666666666666662e-10 367 638 2.0833333333333326e-11 367 637 2.0833333333333329e-11 367 626 -6.2499999999999991e-11 367 385 2.1169082391605852e-27 367 631 1.0416666666666665e-11 367 652 2.0833333333333329e-11 367 375 5.2083333333333328e-11 367 651 2.0833333333333329e-11 367 621 -6.2499999999999991e-11 367 376 3.5628902784306998e-27 367 623 1.0416666666666665e-11 367 752 2.0833333333333326e-11 367 371 5.2083333333333328e-11 367 750 -2.0833333333333329e-11 367 622 -6.2499999999999991e-11 367 370 2.1169082391605852e-27 367 629 1.0416666666666665e-11 367 741 2.0833333333333329e-11 367 369 5.2083333333333328e-11 367 627 1.0416666666666665e-11 367 368 5.2083333333333328e-11 367 742 2.0833333333333329e-11 367 624 -6.2499999999999991e-11 367 366 3.5628902784306998e-27 368 368 5.0000000000000003e-10 368 1068 2.0833333333333329e-11 368 747 -4.1666666666666665e-11 368 737 2.0833333333333332e-11 368 386 5.2083333333333328e-11 368 626 -2.0833333333333332e-11 368 638 1.0416666666666666e-10 368 636 2.0833333333333329e-11 368 385 -1.0416666666666663e-11 368 745 -4.1666666666666658e-11 368 746 -1.0416666666666666e-10 368 1043 -2.0833333333333332e-11 368 377 5.2083333333333328e-11 368 384 -1.0416666666666663e-11 368 627 4.1666666666666658e-11 368 367 5.2083333333333328e-11 368 742 1.0416666666666666e-10 368 624 -2.0833333333333329e-11 368 366 -1.0416666666666661e-11 369 369 5.0000000000000003e-10 369 751 -4.1666666666666658e-11 369 388 5.2083333333333328e-11 369 749 -1.0416666666666666e-10 369 799 2.0833333333333332e-11 369 391 -1.0416666666666661e-11 369 748 -4.1666666666666665e-11 369 386 5.2083333333333328e-11 369 737 2.0833333333333329e-11 369 750 -1.0416666666666666e-10 369 622 -2.0833333333333329e-11 369 370 -1.0416666666666663e-11 369 629 4.1666666666666665e-11 369 741 1.0416666666666666e-10 369 624 -2.0833333333333332e-11 369 367 5.2083333333333328e-11 369 366 -1.0416666666666661e-11 370 370 1.2499999999999998e-10 370 751 1.4136387421560532e-27 370 757 -1.2116903504194741e-27 370 388 4.0389678347315804e-27 370 623 -1.2116903504194741e-27 370 752 1.0416666666666666e-11 370 371 -1.0416666666666666e-11 370 629 1.4136387421560532e-27 370 369 -1.0416666666666666e-11 370 367 1.6155871338926322e-27 370 750 -1.0416666666666666e-11 370 622 4.0389678347315804e-27 371 371 4.9999999999999993e-10 371 757 -4.1666666666666658e-11 371 388 5.2083333333333328e-11 371 621 -2.0833333333333329e-11 371 758 -1.0416666666666666e-10 371 383 -1.0416666666666663e-11 371 756 -4.1666666666666665e-11 371 651 1.0416666666666666e-10 371 650 2.0833333333333332e-11 371 373 5.2083333333333328e-11 371 376 -1.0416666666666661e-11 371 623 4.1666666666666658e-11 371 752 1.0416666666666666e-10 371 622 -2.0833333333333332e-11 371 367 5.2083333333333328e-11 371 370 -1.0416666666666663e-11 371 2196 -2.0833333333333329e-11 372 372 1.2499999999999998e-10 372 1036 1.4136387421560532e-27 372 1039 -1.0097419586828951e-27 372 377 4.0389678347315804e-27 372 1028 -1.6155871338926322e-27 372 1026 -1.0097419586828951e-27 372 1030 1.0416666666666663e-11 372 375 -1.0416666666666663e-11 372 1024 1.4136387421560532e-27 372 374 -1.0416666666666665e-11 372 373 1.6155871338926322e-27 372 1031 1.0416666666666665e-11 372 1025 4.0389678347315804e-27 373 373 4.1666666666666662e-10 373 1035 -2.0833333333333329e-11 373 1055 2.0833333333333329e-11 373 381 3.7324953730532174e-27 373 1027 1.0416666666666665e-11 373 1056 -2.0833333333333326e-11 373 382 5.2083333333333328e-11 373 758 -2.0833333333333329e-11 373 383 2.1169082391605852e-27 373 756 -1.0416666666666665e-11 373 651 2.0833333333333329e-11 373 371 5.2083333333333328e-11 373 652 2.0833333333333329e-11 373 650 6.2500000000000004e-11 373 376 3.7324953730532174e-27 373 1026 1.0416666666666665e-11 373 1030 2.0833333333333326e-11 373 375 5.2083333333333328e-11 373 1024 1.0416666666666665e-11 373 374 5.2083333333333328e-11 373 1031 2.0833333333333329e-11 373 1025 -6.2499999999999991e-11 373 372 2.1169082391605852e-27 373 1915 -6.2500000000000004e-11 373 2196 -6.2499999999999991e-11 374 374 4.9999999999999993e-10 374 1035 -1.0416666666666666e-10 374 381 -1.0416666666666661e-11 374 1038 -4.1666666666666658e-11 374 380 5.2083333333333328e-11 374 1037 -1.0416666666666666e-10 374 1041 -2.0833333333333329e-11 374 378 -1.0416666666666663e-11 374 1036 -4.1666666666666658e-11 374 1028 2.0833333333333332e-11 374 377 5.2083333333333328e-11 374 1024 4.1666666666666665e-11 374 373 5.2083333333333328e-11 374 1031 1.0416666666666666e-10 374 1025 -2.0833333333333329e-11 374 372 -1.0416666666666663e-11 374 1915 -2.0833333333333332e-11 374 1916 -2.0833333333333329e-11 374 2264 -2.0833333333333332e-11 375 375 5.0000000000000003e-10 375 626 -2.0833333333333329e-11 375 631 4.1666666666666665e-11 375 621 -2.0833333333333332e-11 375 367 5.2083333333333328e-11 375 637 1.0416666666666666e-10 375 636 2.0833333333333332e-11 375 385 -1.0416666666666663e-11 375 1039 -4.1666666666666658e-11 375 377 5.2083333333333328e-11 375 1028 2.0833333333333329e-11 375 652 1.0416666666666666e-10 375 650 2.0833333333333329e-11 375 376 -1.0416666666666661e-11 375 1026 4.1666666666666665e-11 375 1030 1.0416666666666666e-10 375 1025 -2.0833333333333332e-11 375 373 5.2083333333333328e-11 375 372 -1.0416666666666661e-11 376 376 1.2499999999999998e-10 376 631 -1.2116903504194741e-27 376 623 1.0097419586828951e-27 376 367 4.0389678347315804e-27 376 621 4.0389678347315804e-27 376 756 1.0097419586828951e-27 376 651 1.0416666666666661e-11 376 371 -1.0416666666666661e-11 376 1026 1.2116903504194741e-27 376 375 -1.0416666666666661e-11 376 373 4.0389678347315804e-27 376 652 1.0416666666666661e-11 376 650 -4.0389678347315804e-27 377 377 4.1666666666666662e-10 377 637 2.0833333333333326e-11 377 638 2.0833333333333329e-11 377 636 6.2499999999999991e-11 377 385 3.5628902784306998e-27 377 745 -1.0416666666666661e-11 377 746 -2.0833333333333329e-11 377 368 5.2083333333333328e-11 377 1051 -2.0833333333333329e-11 377 1043 -6.2499999999999991e-11 377 384 3.5628902784306998e-27 377 1042 1.0416666666666661e-11 377 1046 2.0833333333333326e-11 377 379 5.2083333333333328e-11 377 1037 -2.0833333333333329e-11 377 1041 -6.2499999999999991e-11 377 378 3.5628902784306998e-27 377 1036 -1.0416666666666661e-11 377 1031 2.0833333333333329e-11 377 374 5.2083333333333328e-11 377 1039 -1.0416666666666661e-11 377 375 5.2083333333333328e-11 377 1030 2.0833333333333329e-11 377 1028 6.2499999999999991e-11 377 372 3.5628902784306998e-27 378 378 1.2499999999999998e-10 378 1038 1.2116903504194741e-27 378 1052 -1.4136387421560532e-27 378 380 1.6155871338926322e-27 378 1042 -1.4136387421560532e-27 378 1046 1.0416666666666666e-11 378 379 -1.0416666666666666e-11 378 1036 -1.2116903504194741e-27 378 374 -1.0416666666666666e-11 378 377 4.0389678347315804e-27 378 1037 -1.0416666666666666e-11 378 1041 1.6155871338926322e-27 378 2264 4.0389678347315804e-27 379 379 5.0000000000000003e-10 379 1033 2.0833333333333329e-11 379 1032 1.0416666666666666e-10 379 390 -1.0416666666666661e-11 379 1050 -4.1666666666666665e-11 379 1068 2.0833333333333332e-11 379 386 5.2083333333333328e-11 379 1051 -1.0416666666666666e-10 379 1043 -2.0833333333333329e-11 379 384 -1.0416666666666661e-11 379 1052 -4.1666666666666665e-11 379 380 5.2083333333333328e-11 379 1042 4.1666666666666658e-11 379 1046 1.0416666666666666e-10 379 1041 -2.0833333333333332e-11 379 377 5.2083333333333328e-11 379 378 -1.0416666666666663e-11 379 2263 -2.0833333333333332e-11 379 2264 -2.0833333333333329e-11 380 380 4.1666666666666662e-10 380 1032 2.0833333333333329e-11 380 1034 2.0833333333333329e-11 380 390 3.5628902784306998e-27 380 1054 1.0416666666666665e-11 380 1074 2.0833333333333326e-11 380 389 5.2083333333333328e-11 380 1058 -2.0833333333333329e-11 380 387 2.1169082391605852e-27 380 1053 1.0416666666666665e-11 380 1055 2.0833333333333329e-11 380 382 5.2083333333333328e-11 380 1035 -2.0833333333333329e-11 380 381 3.5628902784306998e-27 380 1038 -1.0416666666666665e-11 380 1037 -2.0833333333333326e-11 380 374 5.2083333333333328e-11 380 1052 -1.0416666666666665e-11 380 379 5.2083333333333328e-11 380 1046 2.0833333333333329e-11 380 378 2.1169082391605852e-27 380 2263 -6.2499999999999991e-11 380 2265 -6.2499999999999991e-11 380 1916 -6.2499999999999991e-11 380 2264 -6.2499999999999991e-11 381 381 1.2499999999999998e-10 381 1024 -1.0097419586828951e-27 381 1027 1.2116903504194741e-27 381 373 4.0389678347315804e-27 381 1053 -1.2116903504194741e-27 381 1055 1.0416666666666661e-11 381 382 -1.0416666666666661e-11 381 1038 -1.0097419586828951e-27 381 374 -1.0416666666666661e-11 381 380 4.0389678347315804e-27 381 1035 -1.0416666666666661e-11 381 1915 4.0389678347315804e-27 381 1916 4.0389678347315804e-27 382 382 4.9999999999999993e-10 382 1057 -4.1666666666666658e-11 382 1058 -1.0416666666666666e-10 382 388 5.2083333333333328e-11 382 387 -1.0416666666666663e-11 382 1027 4.1666666666666665e-11 382 1056 -1.0416666666666666e-10 382 373 5.2083333333333328e-11 382 383 -1.0416666666666661e-11 382 1053 4.1666666666666665e-11 382 1055 1.0416666666666666e-10 382 380 5.2083333333333328e-11 382 381 -1.0416666666666661e-11 382 2265 -2.0833333333333329e-11 382 1915 -2.0833333333333329e-11 382 2196 -2.0833333333333332e-11 382 1916 -2.0833333333333332e-11 383 383 1.2499999999999998e-10 383 757 1.4136387421560532e-27 383 1057 -1.0097419586828951e-27 383 388 4.0389678347315804e-27 383 1027 -1.0097419586828951e-27 383 1056 -1.0416666666666663e-11 383 382 -1.0416666666666663e-11 383 756 -1.4136387421560532e-27 383 371 -1.0416666666666665e-11 383 373 1.6155871338926322e-27 383 758 -1.0416666666666665e-11 383 2196 4.0389678347315804e-27 384 384 1.2499999999999998e-10 384 1050 1.0097419586828951e-27 384 747 -1.4136387421560532e-27 384 386 1.6155871338926322e-27 384 1068 -4.0389678347315804e-27 384 745 1.4136387421560532e-27 384 746 -1.0416666666666665e-11 384 368 -1.0416666666666665e-11 384 1042 1.0097419586828951e-27 384 379 -1.0416666666666663e-11 384 377 4.0389678347315804e-27 384 1051 -1.0416666666666663e-11 384 1043 1.6155871338926322e-27 385 385 1.2499999999999998e-10 385 627 -1.2116903504194741e-27 385 631 1.4136387421560532e-27 385 367 1.6155871338926322e-27 385 626 4.0389678347315804e-27 385 1039 1.4136387421560532e-27 385 637 1.0416666666666666e-11 385 375 -1.0416666666666666e-11 385 745 -1.2116903504194741e-27 385 368 -1.0416666666666666e-11 385 377 4.0389678347315804e-27 385 638 1.0416666666666666e-11 385 636 -1.6155871338926322e-27 386 386 4.1666666666666662e-10 386 749 -2.0833333333333326e-11 386 801 2.0833333333333329e-11 386 799 6.2499999999999991e-11 386 391 2.1169082391605852e-27 386 1071 1.0416666666666665e-11 386 1034 2.0833333333333329e-11 386 389 5.2083333333333328e-11 386 1032 2.0833333333333329e-11 386 1033 6.2500000000000004e-11 386 390 3.7324953730532174e-27 386 1050 -1.0416666666666665e-11 386 1051 -2.0833333333333326e-11 386 379 5.2083333333333328e-11 386 746 -2.0833333333333329e-11 386 1068 6.2499999999999991e-11 386 384 2.1169082391605852e-27 386 747 -1.0416666666666665e-11 386 742 2.0833333333333329e-11 386 368 5.2083333333333328e-11 386 748 -1.0416666666666665e-11 386 369 5.2083333333333328e-11 386 741 2.0833333333333329e-11 386 737 6.2500000000000004e-11 386 366 3.7324953730532174e-27 387 387 1.2499999999999998e-10 387 1054 -1.2116903504194741e-27 387 1053 1.4136387421560532e-27 387 380 1.6155871338926322e-27 387 1057 1.4136387421560532e-27 387 1058 -1.0416666666666666e-11 387 382 -1.0416666666666666e-11 387 1072 1.2116903504194741e-27 387 389 -1.0416666666666666e-11 387 388 4.0389678347315804e-27 387 1074 1.0416666666666666e-11 387 2265 4.0389678347315804e-27 388 388 4.1666666666666662e-10 388 801 2.0833333333333329e-11 388 749 -2.0833333333333329e-11 388 391 3.5628902784306998e-27 388 751 -1.0416666666666661e-11 388 750 -2.0833333333333326e-11 388 369 5.2083333333333328e-11 388 752 2.0833333333333329e-11 388 370 3.5628902784306998e-27 388 757 -1.0416666666666661e-11 388 758 -2.0833333333333329e-11 388 371 5.2083333333333328e-11 388 1056 -2.0833333333333329e-11 388 383 3.5628902784306998e-27 388 1057 -1.0416666666666661e-11 388 1058 -2.0833333333333326e-11 388 382 5.2083333333333328e-11 388 1072 1.0416666666666661e-11 388 389 5.2083333333333328e-11 388 1074 2.0833333333333329e-11 388 387 3.5628902784306998e-27 389 389 4.9999999999999993e-10 389 801 1.0416666666666666e-10 389 799 2.0833333333333329e-11 389 391 -1.0416666666666663e-11 389 1071 4.1666666666666665e-11 389 1033 2.0833333333333332e-11 389 386 5.2083333333333328e-11 389 1034 1.0416666666666666e-10 389 390 -1.0416666666666661e-11 389 1054 4.1666666666666658e-11 389 380 5.2083333333333328e-11 389 1072 4.1666666666666658e-11 389 388 5.2083333333333328e-11 389 1074 1.0416666666666666e-10 389 387 -1.0416666666666663e-11 389 2263 -2.0833333333333329e-11 389 2265 -2.0833333333333332e-11 390 390 1.2499999999999998e-10 390 1071 -1.0097419586828951e-27 390 1050 -1.2116903504194741e-27 390 386 4.0389678347315804e-27 390 1033 -4.0389678347315804e-27 390 1052 1.2116903504194741e-27 390 1032 1.0416666666666661e-11 390 379 -1.0416666666666661e-11 390 1054 1.0097419586828951e-27 390 389 -1.0416666666666661e-11 390 380 4.0389678347315804e-27 390 1034 1.0416666666666661e-11 390 2263 4.0389678347315804e-27 391 391 1.2499999999999998e-10 391 1072 -1.4136387421560532e-27 391 751 -1.0097419586828951e-27 391 388 4.0389678347315804e-27 391 748 1.0097419586828951e-27 391 749 -1.0416666666666663e-11 391 369 -1.0416666666666663e-11 391 1071 1.4136387421560532e-27 391 389 -1.0416666666666665e-11 391 386 1.6155871338926322e-27 391 801 1.0416666666666665e-11 391 799 -4.0389678347315804e-27 392 392 6.2499999999999991e-11 393 393 2.0833333333333331e-10 394 394 4.9999999999999993e-10 394 771 -1.0416666666666666e-10 394 906 -2.0833333333333329e-11 394 770 -4.1666666666666665e-11 394 769 -1.0416666666666666e-10 394 916 2.0833333333333332e-11 394 397 -1.0416666666666661e-11 394 767 4.1666666666666658e-11 394 768 -4.1666666666666658e-11 394 762 1.0416666666666666e-10 394 2053 2.0833333333333329e-11 394 2261 2.0833333333333332e-11 394 1099 -1.0416666666666663e-11 394 1097 5.2083333333333328e-11 395 395 6.2499999999999991e-11 396 396 4.9999999999999993e-10 396 913 -1.0416666666666666e-10 396 912 -4.1666666666666665e-11 396 916 2.0833333333333329e-11 396 911 -1.0416666666666666e-10 396 906 -2.0833333333333332e-11 396 397 -1.0416666666666661e-11 396 909 4.1666666666666665e-11 396 910 -4.1666666666666658e-11 396 903 1.0416666666666666e-10 396 1703 2.0833333333333329e-11 396 2044 2.0833333333333332e-11 396 1096 -1.0416666666666661e-11 396 1097 5.2083333333333328e-11 397 397 1.2499999999999998e-10 397 912 -1.2116903504194741e-27 397 909 -1.2116903504194741e-27 397 911 -1.0416666666666661e-11 397 396 -1.0416666666666661e-11 397 768 -1.0097419586828951e-27 397 906 4.0389678347315804e-27 397 770 1.0097419586828951e-27 397 769 -1.0416666666666661e-11 397 916 -4.0389678347315804e-27 397 394 -1.0416666666666661e-11 397 1097 4.0389678347315804e-27 398 398 4.9999999999999993e-10 398 775 -1.0416666666666666e-10 398 774 -4.1666666666666665e-11 398 766 4.1666666666666658e-11 398 764 1.0416666666666666e-10 398 773 -4.1666666666666665e-11 398 772 -1.0416666666666666e-10 398 2261 2.0833333333333329e-11 398 2252 2.0833333333333332e-11 398 1665 -1.0416666666666661e-11 399 399 6.2499999999999991e-11 400 400 1.0416666666666666e-10 401 401 6.2499999999999991e-11 402 402 1.2499999999999998e-10 402 771 1.2116903504194741e-27 402 772 -1.0097419586828951e-27 402 420 4.0389678347315804e-27 402 764 -1.0097419586828951e-27 402 766 1.0416666666666661e-11 402 405 -1.0416666666666661e-11 402 762 1.2116903504194741e-27 402 404 -1.0416666666666661e-11 402 403 4.0389678347315804e-27 402 767 1.0416666666666661e-11 402 2261 4.0389678347315804e-27 403 403 4.1666666666666662e-10 403 768 -2.0833333333333326e-11 403 907 2.0833333333333329e-11 403 416 2.1169082391605852e-27 403 765 1.0416666666666665e-11 403 697 2.0833333333333329e-11 403 417 5.2083333333333328e-11 403 695 2.0833333333333329e-11 403 418 3.7324953730532174e-27 403 760 1.0416666666666665e-11 403 776 2.0833333333333326e-11 403 407 5.2083333333333328e-11 403 774 -2.0833333333333329e-11 403 406 2.1169082391605852e-27 403 764 1.0416666666666665e-11 403 766 2.0833333333333329e-11 403 405 5.2083333333333328e-11 403 762 1.0416666666666665e-11 403 404 5.2083333333333328e-11 403 767 2.0833333333333329e-11 403 402 3.7324953730532174e-27 404 404 5.0000000000000003e-10 404 771 -4.1666666666666665e-11 404 420 5.2083333333333328e-11 404 768 -1.0416666666666666e-10 404 906 2.0833333333333329e-11 404 416 -1.0416666666666661e-11 404 769 -4.1666666666666658e-11 404 770 -1.0416666666666666e-10 404 916 -2.0833333333333332e-11 404 414 5.2083333333333328e-11 404 413 -1.0416666666666663e-11 404 762 4.1666666666666665e-11 404 403 5.2083333333333328e-11 404 767 1.0416666666666666e-10 404 402 -1.0416666666666661e-11 404 2053 -2.0833333333333329e-11 404 2261 -2.0833333333333332e-11 405 405 5.0000000000000003e-10 405 775 -4.1666666666666658e-11 405 409 5.2083333333333328e-11 405 772 -4.1666666666666658e-11 405 773 -1.0416666666666666e-10 405 420 5.2083333333333328e-11 405 421 -1.0416666666666663e-11 405 774 -1.0416666666666666e-10 405 406 -1.0416666666666663e-11 405 764 4.1666666666666665e-11 405 766 1.0416666666666666e-10 405 403 5.2083333333333328e-11 405 402 -1.0416666666666661e-11 405 2261 -2.0833333333333329e-11 405 2252 -2.0833333333333332e-11 406 406 1.2499999999999998e-10 406 775 1.4136387421560532e-27 406 778 -1.0097419586828951e-27 406 409 4.0389678347315804e-27 406 760 -1.0097419586828951e-27 406 776 1.0416666666666663e-11 406 407 -1.0416666666666663e-11 406 764 1.4136387421560532e-27 406 405 -1.0416666666666665e-11 406 403 1.6155871338926322e-27 406 774 -1.0416666666666665e-11 407 407 4.9999999999999993e-10 407 811 2.0833333333333329e-11 407 780 -4.1666666666666665e-11 407 694 2.0833333333333332e-11 407 423 5.2083333333333328e-11 407 695 1.0416666666666666e-10 407 418 -1.0416666666666661e-11 407 778 -4.1666666666666658e-11 407 779 -1.0416666666666666e-10 407 409 5.2083333333333328e-11 407 412 -1.0416666666666663e-11 407 760 4.1666666666666665e-11 407 776 1.0416666666666666e-10 407 403 5.2083333333333328e-11 407 406 -1.0416666666666661e-11 408 408 1.2499999999999998e-10 408 807 1.0097419586828951e-27 408 808 -1.4136387421560532e-27 408 426 1.6155871338926322e-27 408 799 -4.0389678347315804e-27 408 798 -1.4136387421560532e-27 408 802 1.0416666666666665e-11 408 411 -1.0416666666666665e-11 408 796 1.0097419586828951e-27 408 410 -1.0416666666666663e-11 408 409 4.0389678347315804e-27 408 803 1.0416666666666663e-11 409 409 4.1666666666666662e-10 409 804 -2.0833333333333326e-11 409 773 -2.0833333333333329e-11 409 421 3.5628902784306998e-27 409 775 -1.0416666666666661e-11 409 774 -2.0833333333333329e-11 409 405 5.2083333333333328e-11 409 776 2.0833333333333329e-11 409 406 3.5628902784306998e-27 409 778 -1.0416666666666661e-11 409 779 -2.0833333333333326e-11 409 407 5.2083333333333328e-11 409 809 -2.0833333333333329e-11 409 412 3.5628902784306998e-27 409 798 1.0416666666666661e-11 409 802 2.0833333333333329e-11 409 411 5.2083333333333328e-11 409 796 1.0416666666666661e-11 409 410 5.2083333333333328e-11 409 803 2.0833333333333329e-11 409 408 3.5628902784306998e-27 410 410 5.0000000000000003e-10 410 1033 2.0833333333333329e-11 410 807 -4.1666666666666665e-11 410 799 2.0833333333333332e-11 410 426 5.2083333333333328e-11 410 804 -1.0416666666666666e-10 410 421 -1.0416666666666663e-11 410 805 -4.1666666666666665e-11 410 806 -1.0416666666666666e-10 410 420 5.2083333333333328e-11 410 419 -1.0416666666666661e-11 410 796 4.1666666666666658e-11 410 409 5.2083333333333328e-11 410 803 1.0416666666666666e-10 410 408 -1.0416666666666661e-11 410 2252 -2.0833333333333329e-11 410 2260 -2.0833333333333332e-11 411 411 4.9999999999999993e-10 411 799 2.0833333333333329e-11 411 739 2.0833333333333329e-11 411 810 -4.1666666666666658e-11 411 811 2.0833333333333332e-11 411 423 5.2083333333333328e-11 411 808 -4.1666666666666665e-11 411 738 1.0416666666666666e-10 411 737 2.0833333333333332e-11 411 426 5.2083333333333328e-11 411 427 -1.0416666666666661e-11 411 809 -1.0416666666666666e-10 411 412 -1.0416666666666663e-11 411 798 4.1666666666666658e-11 411 802 1.0416666666666666e-10 411 409 5.2083333333333328e-11 411 408 -1.0416666666666663e-11 412 412 1.2499999999999998e-10 412 810 1.2116903504194741e-27 412 780 -1.4136387421560532e-27 412 423 1.6155871338926322e-27 412 811 -4.0389678347315804e-27 412 778 1.4136387421560532e-27 412 779 -1.0416666666666666e-11 412 407 -1.0416666666666666e-11 412 798 1.2116903504194741e-27 412 411 -1.0416666666666666e-11 412 409 4.0389678347315804e-27 412 809 -1.0416666666666666e-11 413 413 1.2499999999999998e-10 413 924 1.2116903504194741e-27 413 771 -1.4136387421560532e-27 413 420 1.6155871338926322e-27 413 769 1.4136387421560532e-27 413 770 -1.0416666666666666e-11 413 404 -1.0416666666666666e-11 413 919 1.2116903504194741e-27 413 415 -1.0416666666666666e-11 413 414 4.0389678347315804e-27 413 922 1.0416666666666666e-11 413 916 1.6155871338926322e-27 413 2053 4.0389678347315804e-27 414 414 4.1666666666666662e-10 414 923 -2.0833333333333329e-11 414 1069 2.0833333333333329e-11 414 918 -6.2499999999999991e-11 414 425 3.5628902784306998e-27 414 920 1.0416666666666661e-11 414 603 2.0833333333333326e-11 414 424 5.2083333333333328e-11 414 602 2.0833333333333329e-11 414 597 6.2499999999999991e-11 414 422 3.5628902784306998e-27 414 915 1.0416666666666661e-11 414 907 2.0833333333333329e-11 414 417 5.2083333333333328e-11 414 768 -2.0833333333333329e-11 414 906 6.2499999999999991e-11 414 416 3.5628902784306998e-27 414 769 -1.0416666666666661e-11 414 770 -2.0833333333333326e-11 414 404 5.2083333333333328e-11 414 919 1.0416666666666661e-11 414 415 5.2083333333333328e-11 414 922 2.0833333333333329e-11 414 916 -6.2499999999999991e-11 414 413 3.5628902784306998e-27 415 415 4.9999999999999993e-10 415 1033 2.0833333333333332e-11 415 925 -4.1666666666666665e-11 415 426 5.2083333333333328e-11 415 1068 2.0833333333333329e-11 415 923 -1.0416666666666666e-10 415 918 -2.0833333333333332e-11 415 425 -1.0416666666666663e-11 415 924 -4.1666666666666658e-11 415 420 5.2083333333333328e-11 415 926 -1.0416666666666666e-10 415 419 -1.0416666666666661e-11 415 919 4.1666666666666658e-11 415 414 5.2083333333333328e-11 415 922 1.0416666666666666e-10 415 916 -2.0833333333333329e-11 415 413 -1.0416666666666663e-11 415 2053 -2.0833333333333332e-11 415 2260 -2.0833333333333329e-11 416 416 1.2499999999999998e-10 416 762 -1.0097419586828951e-27 416 765 1.4136387421560532e-27 416 403 1.6155871338926322e-27 416 915 -1.4136387421560532e-27 416 907 1.0416666666666665e-11 416 417 -1.0416666666666665e-11 416 769 -1.0097419586828951e-27 416 404 -1.0416666666666663e-11 416 414 4.0389678347315804e-27 416 768 -1.0416666666666663e-11 416 906 -1.6155871338926322e-27 417 417 4.9999999999999993e-10 417 597 2.0833333333333329e-11 417 694 2.0833333333333329e-11 417 927 -4.1666666666666658e-11 417 602 1.0416666666666666e-10 417 595 2.0833333333333332e-11 417 423 5.2083333333333328e-11 417 422 -1.0416666666666663e-11 417 765 4.1666666666666665e-11 417 697 1.0416666666666666e-10 417 403 5.2083333333333328e-11 417 418 -1.0416666666666661e-11 417 915 4.1666666666666658e-11 417 907 1.0416666666666666e-10 417 906 2.0833333333333332e-11 417 414 5.2083333333333328e-11 417 416 -1.0416666666666663e-11 418 418 1.2499999999999998e-10 418 780 1.2116903504194741e-27 418 927 -1.0097419586828951e-27 418 423 4.0389678347315804e-27 418 694 -4.0389678347315804e-27 418 765 -1.0097419586828951e-27 418 697 1.0416666666666661e-11 418 417 -1.0416666666666661e-11 418 760 1.2116903504194741e-27 418 407 -1.0416666666666661e-11 418 403 4.0389678347315804e-27 418 695 1.0416666666666661e-11 419 419 1.2499999999999998e-10 419 925 1.0097419586828951e-27 419 807 -1.2116903504194741e-27 419 426 4.0389678347315804e-27 419 1033 -4.0389678347315804e-27 419 805 1.2116903504194741e-27 419 806 -1.0416666666666661e-11 419 410 -1.0416666666666661e-11 419 924 -1.0097419586828951e-27 419 415 -1.0416666666666661e-11 419 420 4.0389678347315804e-27 419 926 -1.0416666666666661e-11 419 2260 4.0389678347315804e-27 420 420 4.1666666666666662e-10 420 922 2.0833333333333326e-11 420 770 -2.0833333333333329e-11 420 413 2.1169082391605852e-27 420 771 -1.0416666666666665e-11 420 767 2.0833333333333329e-11 420 404 5.2083333333333328e-11 420 766 2.0833333333333329e-11 420 402 3.5628902784306998e-27 420 772 -1.0416666666666665e-11 420 773 -2.0833333333333326e-11 420 405 5.2083333333333328e-11 420 804 -2.0833333333333329e-11 420 421 2.1169082391605852e-27 420 805 -1.0416666666666665e-11 420 806 -2.0833333333333329e-11 420 410 5.2083333333333328e-11 420 924 -1.0416666666666665e-11 420 415 5.2083333333333328e-11 420 926 -2.0833333333333329e-11 420 419 3.5628902784306998e-27 420 2053 -6.2499999999999991e-11 420 2261 -6.2499999999999991e-11 420 2252 -6.2499999999999991e-11 420 2260 -6.2499999999999991e-11 421 421 1.2499999999999998e-10 421 796 -1.4136387421560532e-27 421 775 -1.2116903504194741e-27 421 409 4.0389678347315804e-27 421 772 1.2116903504194741e-27 421 773 -1.0416666666666666e-11 421 405 -1.0416666666666666e-11 421 805 -1.4136387421560532e-27 421 410 -1.0416666666666666e-11 421 420 1.6155871338926322e-27 421 804 -1.0416666666666666e-11 421 2252 4.0389678347315804e-27 422 422 1.2499999999999998e-10 422 920 -1.4136387421560532e-27 422 915 1.2116903504194741e-27 422 414 4.0389678347315804e-27 422 597 -1.6155871338926322e-27 422 927 1.2116903504194741e-27 422 602 1.0416666666666666e-11 422 417 -1.0416666666666666e-11 422 956 1.4136387421560532e-27 422 424 -1.0416666666666666e-11 422 423 1.6155871338926322e-27 422 603 1.0416666666666666e-11 422 595 -4.0389678347315804e-27 423 423 4.1666666666666662e-10 423 740 2.0833333333333329e-11 423 738 2.0833333333333329e-11 423 739 6.2499999999999991e-11 423 427 3.5628902784306998e-27 423 810 -1.0416666666666665e-11 423 809 -2.0833333333333326e-11 423 411 5.2083333333333328e-11 423 779 -2.0833333333333329e-11 423 811 6.2499999999999991e-11 423 412 2.1169082391605852e-27 423 780 -1.0416666666666665e-11 423 695 2.0833333333333329e-11 423 407 5.2083333333333328e-11 423 697 2.0833333333333329e-11 423 694 6.2499999999999991e-11 423 418 3.5628902784306998e-27 423 927 -1.0416666666666665e-11 423 602 2.0833333333333326e-11 423 417 5.2083333333333328e-11 423 956 1.0416666666666665e-11 423 424 5.2083333333333328e-11 423 603 2.0833333333333329e-11 423 595 6.2499999999999991e-11 423 422 2.1169082391605852e-27 424 424 4.9999999999999993e-10 424 739 2.0833333333333332e-11 424 740 1.0416666666666666e-10 424 737 2.0833333333333329e-11 424 427 -1.0416666666666661e-11 424 1070 -4.1666666666666665e-11 424 1068 2.0833333333333332e-11 424 426 5.2083333333333328e-11 424 1069 1.0416666666666666e-10 424 918 -2.0833333333333329e-11 424 425 -1.0416666666666661e-11 424 920 4.1666666666666658e-11 424 597 2.0833333333333332e-11 424 414 5.2083333333333328e-11 424 956 4.1666666666666665e-11 424 423 5.2083333333333328e-11 424 603 1.0416666666666666e-10 424 595 2.0833333333333329e-11 424 422 -1.0416666666666663e-11 425 425 1.2499999999999998e-10 425 1070 1.0097419586828951e-27 425 925 -1.4136387421560532e-27 425 426 1.6155871338926322e-27 425 1068 -4.0389678347315804e-27 425 919 -1.4136387421560532e-27 425 923 -1.0416666666666665e-11 425 415 -1.0416666666666665e-11 425 920 1.0097419586828951e-27 425 424 -1.0416666666666663e-11 425 414 4.0389678347315804e-27 425 1069 1.0416666666666663e-11 425 918 1.6155871338926322e-27 426 426 4.1666666666666662e-10 426 926 -2.0833333333333329e-11 426 806 -2.0833333333333329e-11 426 1033 6.2500000000000004e-11 426 419 3.7324953730532174e-27 426 807 -1.0416666666666665e-11 426 803 2.0833333333333326e-11 426 410 5.2083333333333328e-11 426 802 2.0833333333333329e-11 426 799 6.2499999999999991e-11 426 408 2.1169082391605852e-27 426 808 -1.0416666666666665e-11 426 738 2.0833333333333329e-11 426 411 5.2083333333333328e-11 426 740 2.0833333333333329e-11 426 737 6.2500000000000004e-11 426 427 3.7324953730532174e-27 426 1070 -1.0416666666666665e-11 426 1069 2.0833333333333326e-11 426 424 5.2083333333333328e-11 426 925 -1.0416666666666665e-11 426 415 5.2083333333333328e-11 426 923 -2.0833333333333329e-11 426 1068 6.2499999999999991e-11 426 425 2.1169082391605852e-27 427 427 1.2499999999999998e-10 427 956 -1.2116903504194741e-27 427 810 -1.0097419586828951e-27 427 423 4.0389678347315804e-27 427 739 -4.0389678347315804e-27 427 808 1.0097419586828951e-27 427 738 1.0416666666666661e-11 427 411 -1.0416666666666661e-11 427 1070 -1.2116903504194741e-27 427 424 -1.0416666666666661e-11 427 426 4.0389678347315804e-27 427 740 1.0416666666666661e-11 427 737 -4.0389678347315804e-27 428 428 5.0000000000000003e-10 428 788 -1.0416666666666666e-10 428 1020 -2.0833333333333329e-11 428 787 -4.1666666666666658e-11 428 786 -1.0416666666666666e-10 428 1064 2.0833333333333332e-11 428 432 -1.0416666666666663e-11 428 784 4.1666666666666665e-11 428 785 -4.1666666666666665e-11 428 781 1.0416666666666666e-10 428 2047 2.0833333333333329e-11 428 2046 2.0833333333333332e-11 428 1462 -1.0416666666666661e-11 428 1460 5.2083333333333328e-11 428 1447 5.2083333333333328e-11 428 2159 2.0833333333333329e-11 428 3385 2.0833333333333332e-11 428 2834 5.2083333333333328e-11 428 1446 -1.0416666666666661e-11 429 429 1.2500000062500001e-02 429 1022 1.0097419586828951e-27 429 1018 -1.0416666666666673e-03 429 1012 1.0416666666666664e-03 429 1014 1.0416666666666664e-03 429 1011 6.2500000000000003e-03 429 431 -2.0833333333333329e-03 429 1016 -1.0097419586828951e-27 429 1017 1.0416666666666661e-11 429 1015 1.0416666666666664e-03 429 430 -1.0416666666666661e-11 429 2834 4.0389678347315804e-27 429 1454 1.3552525540481672e-20 430 430 5.0000000000000003e-10 430 1062 -1.0416666666666666e-10 430 1061 -4.1666666666666658e-11 430 1064 2.0833333333333329e-11 430 1060 -1.0416666666666666e-10 430 1020 -2.0833333333333332e-11 430 432 -1.0416666666666663e-11 430 1022 4.1666666666666658e-11 430 1018 2.0833333333333329e-11 430 1016 4.1666666666666665e-11 430 1017 1.0416666666666666e-10 430 1015 -2.0833333333333332e-11 430 429 -1.0416666666666661e-11 430 1940 2.0833333333333329e-11 430 2280 2.0833333333333332e-11 430 1459 -1.0416666666666663e-11 430 1460 5.2083333333333328e-11 430 2834 5.2083333333333328e-11 430 1454 5.2083333333333328e-11 431 431 2.4999999999999994e-02 431 1018 2.0833333333333329e-03 431 1012 2.0833333333333329e-03 431 1015 -2.0833333333333329e-03 431 429 -2.0833333333333333e-03 431 1011 -4.1666666666666666e-03 431 1013 2.0833333333333329e-03 431 1014 2.0833333333333329e-03 431 3382 2.0833333333333329e-03 431 3381 2.0833333333333329e-03 431 3383 -4.1666666666666666e-03 431 2833 -2.0833333333333333e-03 431 2834 4.1666666666666657e-03 431 2194 2.0833333333333329e-03 431 1458 4.1666666666666657e-03 431 1937 2.0833333333333329e-03 431 4597 -4.1666666666666666e-03 431 1454 4.1666666666666657e-03 431 1457 -2.0833333333333333e-03 432 432 1.2499999999999998e-10 432 1061 -1.2116903504194741e-27 432 1022 -1.2116903504194741e-27 432 1060 -1.0416666666666666e-11 432 430 -1.0416666666666666e-11 432 785 -1.4136387421560532e-27 432 1020 4.0389678347315804e-27 432 787 1.4136387421560532e-27 432 786 -1.0416666666666666e-11 432 1064 -1.6155871338926322e-27 432 428 -1.0416666666666666e-11 432 2834 1.6155871338926322e-27 432 1460 4.0389678347315804e-27 433 433 4.9999999999999993e-10 433 792 -1.0416666666666666e-10 433 791 -4.1666666666666658e-11 433 783 4.1666666666666665e-11 433 782 1.0416666666666666e-10 433 790 -4.1666666666666658e-11 433 789 -1.0416666666666666e-10 433 2046 2.0833333333333329e-11 433 2165 2.0833333333333329e-11 433 2159 2.0833333333333332e-11 433 1101 5.2083333333333328e-11 433 1112 -1.0416666666666661e-11 433 1703 2.0833333333333332e-11 433 1100 -1.0416666666666663e-11 434 434 6.2499999999999991e-11 435 435 6.2499999999999991e-11 436 436 5.0000000000000003e-10 436 1033 -2.0833333333333329e-11 436 807 -1.0416666666666666e-10 436 799 -2.0833333333333332e-11 436 440 -1.0416666666666663e-11 436 806 -4.1666666666666658e-11 436 805 -1.0416666666666666e-10 436 803 4.1666666666666658e-11 436 804 -4.1666666666666665e-11 436 796 1.0416666666666666e-10 436 2252 2.0833333333333329e-11 436 2260 2.0833333333333332e-11 436 1390 5.2083333333333328e-11 436 1389 -1.0416666666666663e-11 437 437 6.2499999999999991e-11 438 438 2.0833333333333331e-10 439 439 4.9999999999999993e-10 439 799 -2.0833333333333329e-11 439 1071 1.0416666666666666e-10 439 1033 -2.0833333333333332e-11 439 440 -1.0416666666666663e-11 439 1034 4.1666666666666658e-11 439 1054 1.0416666666666666e-10 439 1074 4.1666666666666665e-11 439 801 4.1666666666666665e-11 439 1072 1.0416666666666666e-10 439 1390 5.2083333333333328e-11 439 2263 2.0833333333333329e-11 439 2265 2.0833333333333332e-11 439 1392 -1.0416666666666661e-11 440 440 1.2499999999999998e-10 440 806 -1.2116903504194741e-27 440 803 -1.2116903504194741e-27 440 807 -1.0416666666666666e-11 440 436 -1.0416666666666666e-11 440 801 1.4136387421560532e-27 440 799 4.0389678347315804e-27 440 1034 -1.4136387421560532e-27 440 1071 1.0416666666666666e-11 440 1033 1.6155871338926322e-27 440 439 -1.0416666666666666e-11 440 1390 4.0389678347315804e-27 441 441 7.9166666666666652e-10 441 442 4.1666666666666665e-11 441 813 -1.0416666666666666e-11 441 816 1.0416666666666666e-11 441 818 8.3333333333333330e-11 441 814 6.2499999999999991e-11 441 3704 6.2499999999999991e-11 441 3701 -1.0416666666666666e-11 441 3021 4.1666666666666665e-11 441 3702 8.3333333333333330e-11 441 3699 6.2499999999999991e-11 441 3698 -1.0416666666666666e-11 441 3020 -3.0991386737738975e-27 441 4772 5.2083333333333334e-11 441 4775 1.3541666666666669e-10 441 4774 -4.1666666666666678e-11 441 5040 -5.2083333333333334e-11 441 4073 -1.0416666666666671e-11 441 4072 1.4583333333333335e-10 441 4771 1.3541666666666664e-10 441 4760 -1.0416666666666666e-11 441 4062 -1.0416666666666669e-11 441 2315 -1.0416666666666666e-11 441 1524 -3.0991386737738975e-27 441 1522 4.1666666666666665e-11 442 442 2.4999999999999996e-10 442 441 4.1666666666666665e-11 442 818 2.0833333333333332e-11 442 816 4.1666666666666665e-11 442 3703 2.0833333333333329e-11 442 3022 4.1666666666666665e-11 442 3700 2.0833333333333326e-11 442 3702 2.0833333333333332e-11 442 3699 2.0833333333333326e-11 442 3698 -4.1666666666666665e-11 442 3020 -2.0833333333333326e-11 442 5007 2.0833333333333329e-11 442 4068 4.1666666666666665e-11 442 5005 2.0833333333333326e-11 442 4992 -2.0833333333333332e-11 442 5002 -4.1666666666666665e-11 442 4067 -2.0833333333333326e-11 442 1993 2.0833333333333332e-11 442 1524 -2.0833333333333326e-11 443 443 2.0833333333333334e-10 444 444 1.2499999999999997e-02 444 861 -1.3552527156068805e-19 444 851 1.3552527156068805e-19 444 854 1.3552527156068805e-19 444 843 1.0416666666666664e-03 444 842 -4.3368086899420177e-19 444 451 -1.0416666666666664e-03 444 453 2.1684043449710089e-19 444 845 -1.3552527156068805e-19 444 841 1.0416666666666664e-03 444 840 -2.1684043449710089e-19 444 446 -1.0416666666666664e-03 444 445 4.3368086899420177e-19 445 445 4.1666666666666664e-02 445 892 -2.0833333333333333e-03 445 865 -2.0833333333333333e-03 445 858 -2.0833333333333333e-03 445 843 2.0833333333333333e-03 445 851 1.0416666666666660e-03 445 853 -2.0833333333333329e-03 445 850 -6.2499999999999986e-03 445 451 5.2083333333333330e-03 445 450 4.1202858928001372e-19 445 849 1.0416666666666660e-03 445 882 2.0833333333333329e-03 445 848 -6.2499999999999995e-03 445 449 5.2083333333333330e-03 445 448 4.1202858928001372e-19 445 847 1.0416666666666660e-03 445 862 2.0833333333333329e-03 445 846 -6.2499999999999986e-03 445 447 4.1202858928001372e-19 445 845 1.0416666666666660e-03 445 841 2.0833333333333329e-03 445 840 6.2499999999999995e-03 445 446 5.2083333333333330e-03 445 444 4.1202858928001372e-19 445 2853 5.2083333333333330e-03 446 446 4.9999999999999996e-02 446 842 2.0833333333333329e-03 446 938 -2.0833333333333329e-03 446 846 -2.0833333333333329e-03 446 861 -4.1666666666666657e-03 446 860 -1.0416666666666664e-02 446 951 2.0833333333333329e-03 446 453 5.2083333333333322e-03 446 452 -1.0416666666666662e-03 446 859 -4.1666666666666657e-03 446 858 -1.0416666666666664e-02 446 863 2.0833333333333329e-03 446 447 -1.0416666666666662e-03 446 845 4.1666666666666657e-03 446 841 1.0416666666666664e-02 446 840 2.0833333333333329e-03 446 445 5.2083333333333322e-03 446 444 -1.0416666666666664e-03 446 2852 5.2083333333333322e-03 447 447 1.2499999999999997e-02 447 845 1.3552527156068805e-19 447 859 1.3552527156068805e-19 447 858 -1.0416666666666662e-03 447 863 -4.3368086899420177e-19 447 446 -1.0416666666666662e-03 447 847 -1.3552527156068805e-19 447 862 1.0416666666666664e-03 447 846 2.1684043449710089e-19 447 445 4.3368086899420177e-19 447 3413 1.3552527156068805e-19 447 2852 2.1684043449710089e-19 447 2853 -1.0416666666666664e-03 448 448 1.2499999999999997e-02 448 891 -1.3552527156068805e-19 448 847 1.3552527156068805e-19 448 865 -1.0416666666666664e-03 448 884 -4.3368086899420177e-19 448 849 -1.3552527156068805e-19 448 882 1.0416666666666664e-03 448 848 2.1684043449710089e-19 448 449 -1.0416666666666664e-03 448 445 4.3368086899420177e-19 448 3410 -1.3552527156068805e-19 448 2853 -1.0416666666666664e-03 448 2846 2.1684043449710089e-19 449 449 4.9999999999999996e-02 449 884 2.0833333333333329e-03 449 850 -2.0833333333333329e-03 449 893 -4.1666666666666657e-03 449 892 -1.0416666666666664e-02 449 896 2.0833333333333329e-03 449 450 -1.0416666666666662e-03 449 891 -4.1666666666666657e-03 449 890 -1.0416666666666664e-02 449 849 4.1666666666666657e-03 449 882 1.0416666666666664e-02 449 848 -2.0833333333333329e-03 449 445 5.2083333333333322e-03 449 448 -1.0416666666666664e-03 449 3482 2.0833333333333329e-03 449 2856 5.2083333333333322e-03 449 3412 2.0833333333333329e-03 449 2846 5.2083333333333322e-03 449 2855 -1.0416666666666662e-03 450 450 1.2499999999999997e-02 450 856 -1.3552527156068805e-19 450 849 1.3552527156068805e-19 450 893 1.3552527156068805e-19 450 892 -1.0416666666666662e-03 450 896 -4.3368086899420177e-19 450 449 -1.0416666666666662e-03 450 851 -1.3552527156068805e-19 450 853 -1.0416666666666664e-03 450 850 2.1684043449710089e-19 450 451 -1.0416666666666664e-03 450 445 4.3368086899420177e-19 450 2856 2.1684043449710089e-19 451 451 4.9999999999999996e-02 451 896 2.0833333333333329e-03 451 959 -2.0833333333333329e-03 451 840 2.0833333333333329e-03 451 856 -4.1666666666666657e-03 451 855 -1.0416666666666664e-02 451 964 2.0833333333333329e-03 451 454 -1.0416666666666662e-03 451 854 -4.1666666666666657e-03 451 843 1.0416666666666664e-02 451 842 2.0833333333333329e-03 451 453 5.2083333333333322e-03 451 444 -1.0416666666666664e-03 451 851 4.1666666666666657e-03 451 853 -1.0416666666666664e-02 451 850 -2.0833333333333329e-03 451 445 5.2083333333333322e-03 451 450 -1.0416666666666664e-03 451 2856 5.2083333333333322e-03 452 452 1.2499999999999997e-02 452 954 -1.3552527156068805e-19 452 859 -1.0842021724855044e-19 452 861 1.0842021724855044e-19 452 860 -1.0416666666666662e-03 452 951 -4.3368086899420177e-19 452 446 -1.0416666666666662e-03 452 453 4.3368086899420177e-19 452 950 1.0416666666666662e-03 452 938 4.3368086899420177e-19 452 3460 -1.3552527156068805e-19 452 2851 -1.0416666666666662e-03 452 2852 4.3368086899420177e-19 453 453 4.1666666666666664e-02 453 950 2.0833333333333333e-03 453 968 -2.0833333333333333e-03 453 855 -2.0833333333333333e-03 453 841 2.0833333333333333e-03 453 861 -1.0416666666666664e-03 453 860 -2.0833333333333329e-03 453 951 6.2499999999999995e-03 453 446 5.2083333333333330e-03 453 452 4.1202858928001372e-19 453 954 -1.0416666666666664e-03 453 953 -2.0833333333333329e-03 453 961 -6.2500000000000003e-03 453 456 2.6745065309554533e-19 453 960 1.0416666666666664e-03 453 963 2.0833333333333329e-03 453 959 -6.2499999999999995e-03 453 455 5.2083333333333330e-03 453 454 4.1202858928001372e-19 453 854 -1.0416666666666664e-03 453 843 2.0833333333333329e-03 453 842 6.2500000000000003e-03 453 451 5.2083333333333330e-03 453 444 2.6745065309554533e-19 453 2851 5.2083333333333330e-03 454 454 1.2499999999999997e-02 454 967 -1.0842021724855044e-19 454 854 -1.3552527156068805e-19 454 856 1.3552527156068805e-19 454 855 -1.0416666666666662e-03 454 964 -4.3368086899420177e-19 454 451 -1.0416666666666662e-03 454 960 -1.0842021724855044e-19 454 963 1.0416666666666662e-03 454 959 4.3368086899420177e-19 454 455 -1.0416666666666662e-03 454 453 4.3368086899420177e-19 454 2856 4.3368086899420177e-19 455 455 4.9999999999999996e-02 455 964 2.0833333333333329e-03 455 961 -2.0833333333333329e-03 455 969 -4.1666666666666657e-03 455 968 -1.0416666666666664e-02 455 982 2.0833333333333329e-03 455 456 -1.0416666666666664e-03 455 967 -4.1666666666666657e-03 455 966 -1.0416666666666664e-02 455 960 4.1666666666666657e-03 455 963 1.0416666666666664e-02 455 959 -2.0833333333333329e-03 455 453 5.2083333333333322e-03 455 454 -1.0416666666666662e-03 455 3447 2.0833333333333329e-03 455 2849 5.2083333333333322e-03 455 3483 2.0833333333333329e-03 455 2856 5.2083333333333322e-03 455 2857 -1.0416666666666662e-03 456 456 1.2499999999999997e-02 456 960 1.3552527156068805e-19 456 969 1.3552527156068805e-19 456 968 -1.0416666666666664e-03 456 982 -2.1684043449710089e-19 456 455 -1.0416666666666664e-03 456 954 1.3552527156068805e-19 456 953 -1.0416666666666664e-03 456 961 4.3368086899420177e-19 456 453 2.1684043449710089e-19 456 3446 1.3552527156068805e-19 456 2849 4.3368086899420177e-19 456 2851 -1.0416666666666664e-03 457 457 1.2499999999999997e-02 457 888 -1.3552527156068805e-19 457 874 1.3552527156068805e-19 457 879 1.3552527156068805e-19 457 878 -1.0416666666666664e-03 457 883 -2.1684043449710089e-19 457 461 -1.0416666666666664e-03 457 873 -1.3552527156068805e-19 457 881 1.0416666666666664e-03 457 872 4.3368086899420177e-19 457 459 -1.0416666666666664e-03 458 458 2.0833333333333329e-02 459 459 4.9999999999999989e-02 459 883 2.0833333333333329e-03 459 888 -4.1666666666666657e-03 459 887 -1.0416666666666664e-02 459 886 -4.1666666666666657e-03 459 501 1.0416666666666664e-02 459 873 4.1666666666666657e-03 459 881 1.0416666666666664e-02 459 872 -2.0833333333333329e-03 459 457 -1.0416666666666664e-03 460 460 2.0833333333333329e-02 461 461 4.9999999999999989e-02 461 660 1.0416666666666664e-02 461 872 -2.0833333333333329e-03 461 880 -4.1666666666666657e-03 461 874 4.1666666666666657e-03 461 869 1.0416666666666664e-02 461 879 -4.1666666666666657e-03 461 878 -1.0416666666666664e-02 461 883 2.0833333333333329e-03 461 457 -1.0416666666666664e-03 462 462 6.2499999999999986e-03 463 463 1.0416666666666666e-02 464 464 6.2499999999999986e-03 465 465 1.0416666666666666e-02 466 466 6.2499999999999986e-03 467 467 6.2499999999999986e-03 468 468 1.2499999999999998e-10 468 929 -1.0097419586828951e-27 468 922 1.2116903504194741e-27 468 923 1.2116903504194741e-27 468 919 1.0416666666666661e-11 468 918 -4.0389678347315804e-27 468 474 -1.0416666666666661e-11 468 473 4.0389678347315804e-27 468 921 -1.0097419586828951e-27 468 917 1.0416666666666661e-11 468 916 -4.0389678347315804e-27 468 469 -1.0416666666666661e-11 468 1581 4.0389678347315804e-27 469 469 4.9999999999999993e-10 469 918 2.0833333333333329e-11 469 1064 2.0833333333333329e-11 469 931 -4.1666666666666658e-11 469 930 -1.0416666666666666e-10 469 929 -4.1666666666666658e-11 469 928 -1.0416666666666666e-10 469 1065 2.0833333333333332e-11 469 473 5.2083333333333328e-11 469 472 -1.0416666666666663e-11 469 921 4.1666666666666665e-11 469 917 1.0416666666666666e-10 469 916 2.0833333333333332e-11 469 468 -1.0416666666666661e-11 469 2044 2.0833333333333329e-11 469 2047 2.0833333333333332e-11 469 1595 5.2083333333333328e-11 469 1580 -1.0416666666666663e-11 469 1581 5.2083333333333328e-11 470 470 1.2499999999999998e-10 470 1051 -1.0097419586828951e-27 470 1049 1.2116903504194741e-27 470 1044 1.0416666666666661e-11 470 1043 -4.0389678347315804e-27 470 473 4.0389678347315804e-27 470 1046 -1.0097419586828951e-27 470 1042 1.0416666666666661e-11 470 1041 -4.0389678347315804e-27 470 471 -1.0416666666666661e-11 470 2267 1.2116903504194741e-27 470 1594 -1.0416666666666661e-11 470 1591 4.0389678347315804e-27 471 471 4.9999999999999993e-10 471 1033 -2.0833333333333329e-11 471 1043 2.0833333333333329e-11 471 1032 4.1666666666666658e-11 471 1052 -1.0416666666666666e-10 471 1051 -4.1666666666666658e-11 471 1050 -1.0416666666666666e-10 471 1068 -2.0833333333333332e-11 471 473 5.2083333333333328e-11 471 475 -1.0416666666666663e-11 471 1046 4.1666666666666665e-11 471 1042 1.0416666666666666e-10 471 1041 2.0833333333333332e-11 471 470 -1.0416666666666661e-11 471 2264 2.0833333333333329e-11 471 2263 2.0833333333333332e-11 471 1589 5.2083333333333328e-11 471 1590 -1.0416666666666663e-11 471 1591 5.2083333333333328e-11 472 472 1.2499999999999998e-10 472 1049 -1.4136387421560532e-27 472 931 -1.2116903504194741e-27 472 929 1.2116903504194741e-27 472 928 -1.0416666666666666e-11 472 1065 -4.0389678347315804e-27 472 469 -1.0416666666666666e-11 472 473 1.6155871338926322e-27 472 1048 1.4136387421560532e-27 472 1047 -1.0416666666666666e-11 472 1064 -1.6155871338926322e-27 472 1594 -1.0416666666666666e-11 472 1595 4.0389678347315804e-27 473 473 4.1666666666666662e-10 473 925 -2.0833333333333329e-11 473 917 2.0833333333333329e-11 473 1047 -2.0833333333333329e-11 473 1042 2.0833333333333329e-11 473 1051 -1.0416666666666665e-11 473 1050 -2.0833333333333326e-11 473 1068 -6.2499999999999991e-11 473 471 5.2083333333333328e-11 473 475 2.1169082391605852e-27 473 923 -1.0416666666666665e-11 473 919 2.0833333333333329e-11 473 918 6.2499999999999991e-11 473 474 5.2083333333333328e-11 473 468 3.5628902784306998e-27 473 929 -1.0416666666666665e-11 473 928 -2.0833333333333326e-11 473 1065 6.2499999999999991e-11 473 469 5.2083333333333328e-11 473 472 2.1169082391605852e-27 473 1049 -1.0416666666666665e-11 473 1044 2.0833333333333329e-11 473 1043 6.2499999999999991e-11 473 470 3.5628902784306998e-27 473 1594 5.2083333333333328e-11 474 474 4.9999999999999993e-10 474 1068 -2.0833333333333329e-11 474 916 2.0833333333333329e-11 474 926 -4.1666666666666658e-11 474 925 -1.0416666666666666e-10 474 1033 -2.0833333333333332e-11 474 475 -1.0416666666666663e-11 474 922 4.1666666666666665e-11 474 924 -1.0416666666666666e-10 474 923 -4.1666666666666665e-11 474 919 1.0416666666666666e-10 474 918 2.0833333333333332e-11 474 473 5.2083333333333328e-11 474 468 -1.0416666666666661e-11 474 2260 2.0833333333333329e-11 474 1589 5.2083333333333328e-11 474 2053 2.0833333333333332e-11 474 1581 5.2083333333333328e-11 474 1588 -1.0416666666666661e-11 475 475 1.2499999999999998e-10 475 1032 1.2116903504194741e-27 475 923 -1.4136387421560532e-27 475 926 1.4136387421560532e-27 475 925 -1.0416666666666666e-11 475 1033 1.6155871338926322e-27 475 474 -1.0416666666666666e-11 475 1051 1.2116903504194741e-27 475 1050 -1.0416666666666666e-11 475 1068 4.0389678347315804e-27 475 471 -1.0416666666666666e-11 475 473 1.6155871338926322e-27 475 1589 4.0389678347315804e-27 476 476 6.2499999999999986e-03 477 477 1.2499999999999997e-02 477 941 1.3552527156068805e-19 477 942 -1.3552527156068805e-19 477 480 4.3368086899420177e-19 477 819 -2.1684043449710089e-19 477 940 -1.3552527156068805e-19 477 822 1.0416666666666662e-03 477 478 -1.0416666666666662e-03 477 823 1.0416666666666664e-03 477 821 -4.3368086899420177e-19 477 3473 1.3552527156068805e-19 477 2475 -1.0416666666666664e-03 477 2477 2.1684043449710089e-19 478 478 4.9999999999999989e-02 478 634 2.0833333333333329e-03 478 944 -4.1666666666666657e-03 478 946 2.0833333333333329e-03 478 482 5.2083333333333322e-03 478 633 1.0416666666666664e-02 478 632 2.0833333333333329e-03 478 486 -1.0416666666666664e-03 478 942 -4.1666666666666657e-03 478 480 5.2083333333333322e-03 478 819 2.0833333333333329e-03 478 943 -1.0416666666666664e-02 478 939 -2.0833333333333329e-03 478 479 -1.0416666666666662e-03 478 940 4.1666666666666657e-03 478 822 1.0416666666666664e-02 478 821 2.0833333333333329e-03 478 477 -1.0416666666666662e-03 478 2477 5.2083333333333322e-03 479 479 1.2499999999999997e-02 479 944 1.0842021724855044e-19 479 949 -1.3552527156068805e-19 479 482 4.3368086899420177e-19 479 946 -4.3368086899420177e-19 479 945 1.0416666666666662e-03 479 940 1.0842021724855044e-19 479 478 -1.0416666666666662e-03 479 943 -1.0416666666666662e-03 479 939 4.3368086899420177e-19 479 3088 -1.3552527156068805e-19 479 2470 -1.0416666666666662e-03 479 2477 4.3368086899420177e-19 480 480 4.1666666666666657e-02 480 633 2.0833333333333329e-03 480 635 2.0833333333333333e-03 480 632 6.2499999999999995e-03 480 486 4.1202858928001372e-19 480 952 1.0416666666666660e-03 480 962 2.0833333333333329e-03 480 483 5.2083333333333330e-03 480 954 -2.0833333333333333e-03 480 951 -6.2499999999999986e-03 480 485 4.1202858928001372e-19 480 950 1.0416666666666660e-03 480 938 6.2499999999999995e-03 480 941 -1.0416666666666660e-03 480 823 2.0833333333333329e-03 480 942 -1.0416666666666660e-03 480 478 5.2083333333333330e-03 480 822 2.0833333333333333e-03 480 819 6.2499999999999986e-03 480 477 4.1202858928001372e-19 480 3460 2.0833333333333329e-03 480 2473 5.2083333333333330e-03 480 3472 2.0833333333333333e-03 480 2474 4.1202858928001372e-19 480 2475 5.2083333333333330e-03 481 481 1.2499999999999997e-02 481 976 1.3552527156068805e-19 481 977 -1.0842021724855044e-19 481 484 4.3368086899420177e-19 481 713 -4.3368086899420177e-19 481 973 -1.0842021724855044e-19 481 721 1.0416666666666662e-03 481 971 1.3552527156068805e-19 481 483 -1.0416666666666662e-03 481 482 4.3368086899420177e-19 481 722 1.0416666666666662e-03 481 717 -4.3368086899420177e-19 481 2479 -1.0416666666666662e-03 482 482 4.1666666666666657e-02 482 635 2.0833333333333329e-03 482 633 2.0833333333333333e-03 482 634 6.2500000000000003e-03 482 486 2.6745065309554533e-19 482 944 -1.0416666666666664e-03 482 943 -2.0833333333333329e-03 482 478 5.2083333333333330e-03 482 945 2.0833333333333333e-03 482 946 6.2499999999999995e-03 482 479 4.1202858928001372e-19 482 949 -1.0416666666666664e-03 482 970 -6.2500000000000003e-03 482 973 1.0416666666666664e-03 482 721 2.0833333333333329e-03 482 971 1.0416666666666664e-03 482 483 5.2083333333333330e-03 482 722 2.0833333333333333e-03 482 717 6.2499999999999995e-03 482 481 4.1202858928001372e-19 482 3089 2.0833333333333329e-03 482 2470 5.2083333333333330e-03 482 3215 2.0833333333333333e-03 482 2478 2.6745065309554533e-19 482 2479 5.2083333333333330e-03 483 483 4.9999999999999989e-02 483 634 2.0833333333333329e-03 483 635 1.0416666666666664e-02 483 632 2.0833333333333329e-03 483 486 -1.0416666666666664e-03 483 952 4.1666666666666657e-03 483 951 -2.0833333333333329e-03 483 480 5.2083333333333322e-03 483 962 1.0416666666666664e-02 483 961 2.0833333333333329e-03 483 485 -1.0416666666666664e-03 483 976 -4.1666666666666657e-03 483 713 2.0833333333333329e-03 483 484 5.2083333333333322e-03 483 971 4.1666666666666657e-03 483 482 5.2083333333333322e-03 483 722 1.0416666666666664e-02 483 717 2.0833333333333329e-03 483 481 -1.0416666666666662e-03 484 484 4.1666666666666664e-02 484 981 -6.2499999999999986e-03 484 983 1.0416666666666664e-03 484 982 -6.2500000000000003e-03 484 953 -1.0416666666666664e-03 484 954 -2.0833333333333329e-03 484 962 2.0833333333333333e-03 484 961 6.2499999999999986e-03 484 485 2.6745065309554533e-19 484 976 -1.0416666666666664e-03 484 722 2.0833333333333329e-03 484 483 5.2083333333333330e-03 484 977 -1.0416666666666664e-03 484 721 2.0833333333333333e-03 484 713 6.2500000000000003e-03 484 481 3.7587087034409578e-19 484 3212 2.0833333333333329e-03 484 3074 2.0833333333333333e-03 484 2480 2.6745065309554533e-19 484 3076 2.0833333333333329e-03 484 2467 5.2083333333333330e-03 484 3446 2.0833333333333333e-03 484 2472 3.7587087034409578e-19 484 2473 5.2083333333333330e-03 484 2479 5.2083333333333330e-03 485 485 1.2499999999999997e-02 485 952 -1.3552527156068805e-19 485 950 1.3552527156068805e-19 485 480 4.3368086899420177e-19 485 951 2.1684043449710089e-19 485 953 1.3552527156068805e-19 485 954 -1.0416666666666662e-03 485 976 -1.3552527156068805e-19 485 483 -1.0416666666666664e-03 485 484 2.1684043449710089e-19 485 962 1.0416666666666664e-03 485 961 -4.3368086899420177e-19 485 2473 -1.0416666666666662e-03 486 486 1.2499999999999997e-02 486 971 -1.3552527156068805e-19 486 944 -1.3552527156068805e-19 486 482 2.1684043449710089e-19 486 634 -4.3368086899420177e-19 486 942 1.3552527156068805e-19 486 633 1.0416666666666664e-03 486 478 -1.0416666666666664e-03 486 952 1.3552527156068805e-19 486 483 -1.0416666666666664e-03 486 480 4.3368086899420177e-19 486 635 1.0416666666666664e-03 486 632 -2.1684043449710089e-19 487 487 4.9999999999999989e-02 487 1005 -1.0416666666666664e-02 487 1004 -4.1666666666666657e-03 487 999 4.1666666666666657e-03 487 998 1.0416666666666664e-02 487 1003 -4.1666666666666657e-03 487 1002 -1.0416666666666664e-02 487 3158 2.0833333333333329e-03 487 3534 2.0833333333333329e-03 487 2561 -1.0416666666666662e-03 487 3484 2.0833333333333329e-03 487 3157 2.0833333333333329e-03 487 2553 5.2083333333333322e-03 487 2548 -1.0416666666666662e-03 488 488 6.2499999999999986e-03 489 489 4.9999999999999989e-02 489 1006 1.0416666666666664e-02 489 1010 -4.1666666666666657e-03 489 982 2.0833333333333329e-03 489 984 1.0416666666666664e-02 489 981 2.0833333333333329e-03 489 490 -1.0416666666666664e-03 489 1008 4.1666666666666657e-03 489 1009 -4.1666666666666657e-03 489 1007 1.0416666666666664e-02 489 3157 2.0833333333333329e-03 489 3447 2.0833333333333329e-03 489 2437 -1.0416666666666664e-03 489 2435 5.2083333333333322e-03 489 2424 5.2083333333333322e-03 489 3211 2.0833333333333329e-03 489 3158 2.0833333333333329e-03 489 2432 5.2083333333333322e-03 489 2429 -1.0416666666666662e-03 490 490 1.2499999999999997e-02 490 1010 -1.3552527156068805e-19 490 1008 -1.3552527156068805e-19 490 984 1.0416666666666664e-03 490 489 -1.0416666666666664e-03 490 981 -4.3368086899420177e-19 490 983 1.0416666666666664e-03 490 982 -2.1684043449710089e-19 490 3074 1.3552527156068805e-19 490 2424 2.1684043449710089e-19 490 3076 -1.3552527156068805e-19 490 2425 -1.0416666666666664e-03 490 2435 4.3368086899420177e-19 491 491 2.4999999999999994e-02 491 1013 2.0833333333333329e-03 491 3668 -2.0833333333333329e-03 491 2830 -2.0833333333333333e-03 491 3662 -4.1666666666666666e-03 491 3384 2.0833333333333329e-03 491 3663 2.0833333333333329e-03 491 3383 -4.1666666666666666e-03 491 2824 4.1666666666666657e-03 491 2822 -2.0833333333333333e-03 491 4599 2.0833333333333329e-03 491 3957 -2.0833333333333333e-03 491 4597 -4.1666666666666666e-03 491 4606 -2.0833333333333329e-03 491 4605 -2.0833333333333329e-03 491 3958 4.1666666666666657e-03 491 3381 2.0833333333333329e-03 491 2194 2.0833333333333329e-03 491 1646 4.1666666666666657e-03 492 492 4.9999999999999993e-10 492 1058 -4.1666666666666665e-11 492 1057 -1.0416666666666666e-10 492 1056 -4.1666666666666658e-11 492 1027 1.0416666666666666e-10 492 1055 4.1666666666666658e-11 492 1053 1.0416666666666666e-10 492 2265 2.0833333333333329e-11 492 1915 2.0833333333333329e-11 492 2196 2.0833333333333332e-11 492 1429 -1.0416666666666663e-11 492 1916 2.0833333333333332e-11 492 1421 5.2083333333333328e-11 492 1424 -1.0416666666666663e-11 493 493 6.2499999999999991e-11 494 494 2.0833333333333332e-02 495 495 2.9166666666666660e-02 495 521 -4.1666666666666675e-03 495 48 1.4465734552327348e-19 495 39 1.0416666666666660e-03 495 42 -1.2659172094511536e-19 495 516 4.1666666666666649e-03 495 2868 4.1666666666666657e-03 495 2887 1.0416666666666664e-02 496 496 2.0833333333333332e-02 497 497 2.9166666666666660e-02 497 46 -1.2659172094511536e-19 497 40 4.1666666666666657e-03 497 39 1.0416666666666660e-03 497 507 4.1666666666666675e-03 497 38 1.4465734552327348e-19 497 508 -4.1666666666666649e-03 497 14 1.0416666666666664e-02 498 498 2.0833333333333329e-02 499 499 2.9166666666666660e-02 499 514 -4.1666666666666675e-03 499 42 1.4465734552327348e-19 499 41 4.1666666666666657e-03 499 39 1.0416666666666660e-03 499 38 -1.4465734552327348e-19 499 506 4.1666666666666649e-03 499 27 1.0416666666666664e-02 500 500 2.0833333333333329e-02 501 501 2.9166666666666660e-02 501 873 4.1666666666666675e-03 501 46 1.4465734552327348e-19 501 47 4.1666666666666657e-03 501 39 1.0416666666666660e-03 501 48 -1.4465734552327348e-19 501 886 -4.1666666666666649e-03 501 459 1.0416666666666664e-02 502 502 4.1666666666666664e-02 502 40 2.0833333333333333e-03 502 27 -2.0833333333333329e-03 502 512 2.0833333333333337e-03 502 41 2.0833333333333329e-03 502 43 6.2499999999999995e-03 502 506 2.0833333333333337e-03 502 38 -4.1202858928001372e-19 502 507 2.0833333333333337e-03 502 509 2.0833333333333333e-03 502 14 -2.0833333333333333e-03 502 122 2.0833333333333333e-03 502 11 -2.0833333333333329e-03 502 20 4.1202858928001372e-19 502 837 2.0833333333333337e-03 502 132 2.0833333333333329e-03 502 138 6.2499999999999995e-03 502 505 2.0833333333333337e-03 502 139 -4.1202858928001372e-19 502 503 2.0833333333333337e-03 502 570 2.0833333333333333e-03 502 25 -2.0833333333333333e-03 502 23 4.1202858928001372e-19 503 503 2.9166666666666660e-02 503 572 -4.1666666666666666e-03 503 131 2.0833333333333329e-03 503 122 1.0416666666666664e-02 503 138 2.0833333333333329e-03 503 139 1.0416666666666664e-03 503 570 -4.1666666666666649e-03 503 502 2.0833333333333329e-03 503 25 4.1666666666666657e-03 503 23 -1.4465734552327348e-19 504 504 2.0833333333333329e-02 505 505 2.9166666666666664e-02 505 131 2.0833333333333329e-03 505 20 1.2659172094511536e-19 505 837 -4.1666666666666666e-03 505 132 1.0416666666666664e-02 505 138 2.0833333333333329e-03 505 502 2.0833333333333337e-03 505 139 1.0416666666666664e-03 505 828 4.1666666666666649e-03 505 11 4.1666666666666657e-03 506 506 2.9166666666666660e-02 506 23 1.2659172094511536e-19 506 512 -4.1666666666666666e-03 506 43 2.0833333333333329e-03 506 502 2.0833333333333337e-03 506 41 1.0416666666666664e-02 506 39 2.0833333333333329e-03 506 38 1.0416666666666664e-03 506 499 4.1666666666666649e-03 506 27 4.1666666666666657e-03 507 507 2.9166666666666664e-02 507 43 2.0833333333333329e-03 507 509 -4.1666666666666649e-03 507 502 2.0833333333333329e-03 507 20 -1.4465734552327348e-19 507 14 4.1666666666666657e-03 507 497 4.1666666666666666e-03 507 40 1.0416666666666664e-02 507 39 2.0833333333333329e-03 507 38 1.0416666666666664e-03 508 508 2.9166666666666660e-02 508 39 -2.0833333333333329e-03 508 21 -1.4465734552327348e-19 508 511 4.1666666666666666e-03 508 40 -1.0416666666666664e-02 508 45 -2.0833333333333329e-03 508 872 -2.0833333333333333e-03 508 46 -1.0416666666666664e-03 508 497 -4.1666666666666649e-03 508 14 -4.1666666666666657e-03 509 509 2.9166666666666660e-02 509 19 -2.0833333333333329e-03 509 510 4.1666666666666675e-03 509 846 2.0833333333333333e-03 509 44 -1.4465734552327348e-19 509 40 -4.1666666666666657e-03 509 43 -1.0416666666666664e-03 509 38 1.4465734552327348e-19 509 507 -4.1666666666666649e-03 509 502 2.0833333333333329e-03 509 14 -1.0416666666666664e-02 509 20 -1.0416666666666662e-03 510 510 2.9166666666666660e-02 510 45 -2.0833333333333329e-03 510 511 4.1666666666666649e-03 510 848 -2.0833333333333329e-03 510 21 1.4465734552327348e-19 510 14 -4.1666666666666657e-03 510 19 -1.0416666666666660e-03 510 20 -1.4465734552327348e-19 510 509 4.1666666666666675e-03 510 40 -1.0416666666666664e-02 510 43 -2.0833333333333329e-03 510 846 -2.0833333333333333e-03 510 44 -1.0416666666666662e-03 511 511 2.9166666666666660e-02 511 508 4.1666666666666666e-03 511 872 2.0833333333333337e-03 511 46 -1.2659172094511536e-19 511 40 -4.1666666666666657e-03 511 45 -1.0416666666666664e-03 511 44 1.4465734552327348e-19 511 510 4.1666666666666649e-03 511 848 2.0833333333333329e-03 511 14 -1.0416666666666664e-02 511 19 -2.0833333333333329e-03 511 21 -1.0416666666666664e-03 512 512 2.9166666666666660e-02 512 51 9.9486666632977745e-20 512 41 -4.1666666666666657e-03 512 43 -1.0416666666666664e-03 512 506 -4.1666666666666666e-03 512 502 2.0833333333333333e-03 512 38 -1.4465734552327348e-19 512 513 4.1666666666666649e-03 512 561 2.0833333333333329e-03 512 27 -1.0416666666666664e-02 512 26 -2.0833333333333329e-03 512 23 -1.0416666666666664e-03 513 513 2.9166666666666660e-02 513 36 -1.4465734552327348e-19 513 515 4.1666666666666675e-03 513 562 -2.0833333333333333e-03 513 41 -1.0416666666666664e-02 513 43 -2.0833333333333329e-03 513 51 -1.0416666666666662e-03 513 512 4.1666666666666649e-03 513 561 -2.0833333333333329e-03 513 27 -4.1666666666666657e-03 513 26 -1.0416666666666660e-03 513 23 1.2659172094511536e-19 513 2865 -2.0833333333333329e-03 514 514 2.9166666666666664e-02 514 515 4.1666666666666649e-03 514 517 -2.0833333333333329e-03 514 36 1.4465734552327348e-19 514 27 -4.1666666666666657e-03 514 499 -4.1666666666666675e-03 514 41 -1.0416666666666664e-02 514 39 -2.0833333333333329e-03 514 42 -1.0416666666666662e-03 514 2865 -2.0833333333333329e-03 515 515 2.9166666666666660e-02 515 26 -2.0833333333333329e-03 515 513 4.1666666666666666e-03 515 562 2.0833333333333333e-03 515 51 -9.9486666632977745e-20 515 41 -4.1666666666666657e-03 515 42 1.4465734552327348e-19 515 514 4.1666666666666649e-03 515 517 2.0833333333333329e-03 515 27 -1.0416666666666664e-02 515 36 -1.0416666666666664e-03 515 2865 -1.0416666666666664e-03 516 516 2.9166666666666660e-02 516 5 1.4465734552327348e-19 516 517 2.0833333333333333e-03 516 39 2.0833333333333329e-03 516 42 1.0416666666666664e-03 516 495 4.1666666666666649e-03 516 3462 4.1666666666666666e-03 516 2865 2.0833333333333329e-03 516 2868 1.0416666666666664e-02 516 2887 4.1666666666666657e-03 517 517 2.0833333583333332e-02 517 33 -5.2083333333333334e-11 517 518 4.1666666666666665e-11 517 41 2.0833333333333333e-03 517 5 -1.0416666658778662e-11 517 516 2.0833333333333337e-03 517 42 -4.1202858928001372e-19 517 514 -2.0833333333333333e-03 517 515 2.0833333333333337e-03 517 27 -2.0833333333333333e-03 517 36 -1.0416666262526062e-11 517 5053 8.3333333333333330e-11 517 4353 -1.0416666666666665e-11 517 2887 -2.0833333333333329e-03 517 3462 -2.0833333333333337e-03 517 2868 2.0833333333333329e-03 517 2865 6.2499999999999986e-03 518 518 3.3333333333333332e-10 518 33 -6.2500000000000004e-11 518 36 1.8812360437258079e-27 518 517 4.1666666666666665e-11 518 5 -4.1666666666666665e-11 518 5057 -6.4623485355705287e-27 518 5053 6.4623485355705287e-27 518 4353 -6.2500000000000004e-11 519 519 2.4999999999999996e-10 520 520 2.9166666666666660e-02 520 50 -1.0416666666666664e-03 520 48 1.4465734552327348e-19 520 521 4.1666666666666649e-03 520 3469 -4.1666666666666675e-03 520 2867 -1.4465734552327348e-19 520 2868 -4.1666666666666657e-03 520 2887 -1.0416666666666664e-02 521 521 2.9166666666666664e-02 521 50 -2.0833333333333329e-03 521 495 -4.1666666666666666e-03 521 39 -2.0833333333333329e-03 521 48 -1.0416666666666664e-03 521 520 4.1666666666666649e-03 521 2868 -1.0416666666666664e-02 521 2887 -4.1666666666666657e-03 522 522 2.0833333333333332e-02 523 523 2.9166666666666660e-02 523 549 -4.1666666666666675e-03 523 90 1.4465734552327348e-19 523 79 4.1666666666666657e-03 523 75 1.0416666666666660e-03 523 78 -1.2659172094511536e-19 523 544 4.1666666666666649e-03 523 54 1.0416666666666664e-02 524 524 2.0833333333333332e-02 525 525 2.9166666666666660e-02 525 88 -1.2659172094511536e-19 525 76 4.1666666666666657e-03 525 75 1.0416666666666660e-03 525 535 4.1666666666666675e-03 525 74 1.4465734552327348e-19 525 536 -4.1666666666666649e-03 525 8 1.0416666666666664e-02 526 526 2.0833333333333329e-02 527 527 2.9166666666666660e-02 527 542 -4.1666666666666675e-03 527 78 1.4465734552327348e-19 527 77 4.1666666666666657e-03 527 75 1.0416666666666660e-03 527 74 -1.4465734552327348e-19 527 534 4.1666666666666649e-03 527 67 1.0416666666666664e-02 528 528 2.0833333333333329e-02 529 529 2.9166666666666660e-02 529 832 4.1666666666666675e-03 529 88 1.4465734552327348e-19 529 89 4.1666666666666657e-03 529 75 1.0416666666666660e-03 529 90 -1.4465734552327348e-19 529 812 4.1666666666666649e-03 529 351 1.0416666666666664e-02 530 530 4.1666666666666664e-02 530 76 2.0833333333333333e-03 530 67 -2.0833333333333329e-03 530 540 2.0833333333333337e-03 530 77 2.0833333333333329e-03 530 91 6.2499999999999995e-03 530 534 2.0833333333333337e-03 530 74 -4.1202858928001372e-19 530 535 2.0833333333333337e-03 530 539 2.0833333333333333e-03 530 8 -2.0833333333333333e-03 530 266 2.0833333333333333e-03 530 17 -2.0833333333333329e-03 530 22 4.1202858928001372e-19 530 877 2.0833333333333337e-03 530 258 2.0833333333333329e-03 530 264 6.2499999999999995e-03 530 533 2.0833333333333337e-03 530 265 -4.1202858928001372e-19 530 531 2.0833333333333337e-03 530 894 -2.0833333333333333e-03 530 65 -2.0833333333333333e-03 530 63 4.1202858928001372e-19 531 531 2.9166666666666660e-02 531 871 4.1666666666666666e-03 531 257 2.0833333333333329e-03 531 266 1.0416666666666664e-02 531 264 2.0833333333333329e-03 531 265 1.0416666666666664e-03 531 894 4.1666666666666649e-03 531 530 2.0833333333333329e-03 531 65 4.1666666666666657e-03 531 63 -1.4465734552327348e-19 532 532 2.0833333333333329e-02 533 533 2.9166666666666664e-02 533 257 2.0833333333333329e-03 533 22 1.2659172094511536e-19 533 877 -4.1666666666666666e-03 533 258 1.0416666666666664e-02 533 264 2.0833333333333329e-03 533 530 2.0833333333333337e-03 533 265 1.0416666666666664e-03 533 867 4.1666666666666649e-03 533 17 4.1666666666666657e-03 534 534 2.9166666666666660e-02 534 63 1.2659172094511536e-19 534 540 -4.1666666666666666e-03 534 91 2.0833333333333329e-03 534 530 2.0833333333333337e-03 534 77 1.0416666666666664e-02 534 75 2.0833333333333329e-03 534 74 1.0416666666666664e-03 534 527 4.1666666666666649e-03 534 67 4.1666666666666657e-03 535 535 2.9166666666666664e-02 535 91 2.0833333333333329e-03 535 539 -4.1666666666666649e-03 535 530 2.0833333333333329e-03 535 22 -1.4465734552327348e-19 535 8 4.1666666666666657e-03 535 525 4.1666666666666666e-03 535 76 1.0416666666666664e-02 535 75 2.0833333333333329e-03 535 74 1.0416666666666664e-03 536 536 2.9166666666666660e-02 536 75 -2.0833333333333329e-03 536 18 -1.4465734552327348e-19 536 537 4.1666666666666666e-03 536 76 -1.0416666666666664e-02 536 86 -2.0833333333333329e-03 536 831 -2.0833333333333333e-03 536 88 -1.0416666666666664e-03 536 525 -4.1666666666666649e-03 536 8 -4.1666666666666657e-03 537 537 2.9166666666666660e-02 537 536 4.1666666666666666e-03 537 831 2.0833333333333337e-03 537 88 -1.2659172094511536e-19 537 76 -4.1666666666666657e-03 537 86 -1.0416666666666664e-03 537 85 1.4465734552327348e-19 537 538 4.1666666666666649e-03 537 840 -2.0833333333333329e-03 537 8 -1.0416666666666664e-02 537 19 -2.0833333333333329e-03 537 18 -1.0416666666666664e-03 538 538 2.9166666666666660e-02 538 22 -1.4465734552327348e-19 538 539 4.1666666666666675e-03 538 91 -2.0833333333333329e-03 538 850 -2.0833333333333333e-03 538 76 -1.0416666666666664e-02 538 86 -2.0833333333333329e-03 538 85 -1.0416666666666662e-03 538 537 4.1666666666666649e-03 538 840 2.0833333333333329e-03 538 8 -4.1666666666666657e-03 538 19 -1.0416666666666660e-03 538 18 1.4465734552327348e-19 539 539 2.9166666666666660e-02 539 19 -2.0833333333333329e-03 539 538 4.1666666666666675e-03 539 850 2.0833333333333333e-03 539 85 -1.4465734552327348e-19 539 76 -4.1666666666666657e-03 539 91 -1.0416666666666664e-03 539 74 1.4465734552327348e-19 539 535 -4.1666666666666649e-03 539 530 2.0833333333333329e-03 539 8 -1.0416666666666664e-02 539 22 -1.0416666666666662e-03 540 540 2.9166666666666660e-02 540 99 9.9486666632977745e-20 540 77 -4.1666666666666657e-03 540 91 -1.0416666666666664e-03 540 534 -4.1666666666666666e-03 540 530 2.0833333333333333e-03 540 74 -1.4465734552327348e-19 540 541 4.1666666666666649e-03 540 895 -2.0833333333333329e-03 540 67 -1.0416666666666664e-02 540 63 -1.0416666666666664e-03 541 541 2.9166666666666660e-02 541 543 4.1666666666666675e-03 541 81 -2.0833333333333329e-03 541 77 -1.0416666666666664e-02 541 91 -2.0833333333333329e-03 541 99 -1.0416666666666662e-03 541 540 4.1666666666666649e-03 541 895 2.0833333333333329e-03 541 67 -4.1666666666666657e-03 541 63 1.2659172094511536e-19 542 542 2.9166666666666664e-02 542 81 -2.0833333333333329e-03 542 543 4.1666666666666649e-03 542 67 -4.1666666666666657e-03 542 527 -4.1666666666666675e-03 542 77 -1.0416666666666664e-02 542 75 -2.0833333333333329e-03 542 78 -1.0416666666666662e-03 543 543 2.9166666666666660e-02 543 541 4.1666666666666666e-03 543 99 -9.9486666632977745e-20 543 77 -4.1666666666666657e-03 543 81 -1.0416666666666664e-03 543 78 1.4465734552327348e-19 543 542 4.1666666666666649e-03 543 67 -1.0416666666666664e-02 544 544 2.9166666666666660e-02 544 546 -4.1666666666666666e-03 544 81 2.0833333333333329e-03 544 79 1.0416666666666664e-02 544 75 2.0833333333333329e-03 544 78 1.0416666666666664e-03 544 523 4.1666666666666649e-03 544 54 4.1666666666666657e-03 545 545 2.0833333333333329e-02 546 546 2.9166666666666660e-02 546 544 -4.1666666666666666e-03 546 78 -1.2659172094511536e-19 546 79 -4.1666666666666657e-03 546 81 -1.0416666666666664e-03 546 84 1.4465734552327348e-19 546 547 4.1666666666666649e-03 546 54 -1.0416666666666664e-02 547 547 2.9166666666666660e-02 547 62 -1.4465734552327348e-19 547 548 4.1666666666666675e-03 547 93 -2.0833333333333329e-03 547 694 -2.0833333333333333e-03 547 79 -1.0416666666666664e-02 547 81 -2.0833333333333329e-03 547 84 -1.0416666666666662e-03 547 546 4.1666666666666649e-03 547 54 -4.1666666666666657e-03 548 548 2.9166666666666660e-02 548 547 4.1666666666666675e-03 548 694 2.0833333333333333e-03 548 84 -1.4465734552327348e-19 548 79 -4.1666666666666657e-03 548 93 -1.0416666666666664e-03 548 90 1.4465734552327348e-19 548 549 4.1666666666666649e-03 548 811 2.0833333333333329e-03 548 54 -1.0416666666666664e-02 548 62 -1.0416666666666662e-03 549 549 2.9166666666666664e-02 549 93 -2.0833333333333329e-03 549 523 -4.1666666666666666e-03 549 79 -1.0416666666666664e-02 549 75 -2.0833333333333329e-03 549 90 -1.0416666666666664e-03 549 548 4.1666666666666649e-03 549 811 -2.0833333333333329e-03 549 54 -4.1666666666666657e-03 549 62 1.4465734552327348e-19 550 550 2.0833333583333332e-02 550 108 1.0416666666666668e-11 550 574 -4.1666666666666678e-11 550 33 5.2083333333333334e-11 550 554 8.3333333333333343e-11 550 124 -2.0833333333333333e-03 550 25 2.0833333333333329e-03 550 30 1.0416666658778672e-11 550 558 2.0833333333333337e-03 550 122 -2.0833333333333329e-03 550 120 -6.2499999999999986e-03 550 571 2.0833333333333337e-03 550 123 4.1202858928001372e-19 550 573 -2.0833333333333333e-03 550 551 2.0833333333333337e-03 550 102 2.0833333333333333e-03 550 100 1.0416666262526071e-11 551 551 2.9166666666666660e-02 551 578 -4.1666666666666666e-03 551 553 2.0833333333333333e-03 551 129 9.9486666632977745e-20 551 124 4.1666666666666657e-03 551 120 1.0416666666666664e-03 551 123 -1.4465734552327348e-19 551 573 4.1666666666666649e-03 551 550 2.0833333333333329e-03 551 102 1.0416666666666664e-02 551 100 1.0416666666666664e-03 551 1143 2.0833333333333329e-03 552 552 5.8333333333333328e-10 552 554 -2.0833333333333332e-11 552 813 -1.2499999999999998e-10 552 108 -1.0416666666666668e-11 552 112 1.0416666666666666e-11 552 109 -1.0416666666666666e-10 552 114 4.1666666666666665e-11 552 556 8.3333333333333330e-11 552 815 1.8175355256292112e-27 552 221 1.0416666666666666e-11 552 230 -6.2499999999999991e-11 552 553 8.3333333333333330e-11 552 100 -4.1666666666666671e-11 552 4154 -5.2083333333333334e-11 552 1617 1.0416666666666666e-11 552 1613 4.1666666666666665e-11 552 2100 1.8175355256292112e-27 552 1143 1.0416666666666666e-11 552 1146 4.1666666666666678e-11 553 553 2.0833333541666662e-02 553 128 -2.0833333333333333e-03 553 102 2.0833333333333329e-03 553 551 2.0833333333333333e-03 553 124 -2.0833333333333329e-03 553 120 -6.2499999999999995e-03 553 578 2.0833333333333333e-03 553 129 4.1202858928001372e-19 553 649 2.0833333333333333e-03 553 559 2.0833333333333333e-03 553 222 2.0833333333333333e-03 553 230 -1.0416667070807258e-11 553 552 8.3333333333333330e-11 553 100 -1.0416666529976728e-11 553 1617 3.1250000416666664e-03 553 1613 2.0833333333333329e-11 553 2100 2.0833333333333339e-11 553 1143 3.1250000416666668e-03 553 1146 2.0833333333333332e-11 554 554 4.1666666666666662e-10 554 114 2.8320667257631078e-28 554 552 -2.0833333333333332e-11 554 813 4.1666666666666665e-11 554 26 -2.2470898404921788e-28 554 100 -1.2499999999999998e-10 554 108 -1.0416666666666666e-11 554 574 6.4623485355705287e-27 554 33 6.2500000000000004e-11 554 550 8.3333333333333343e-11 554 30 -1.0416666666666663e-11 554 555 3.2311742677852644e-27 554 560 -2.0194839173657902e-27 554 110 -4.5860624244724788e-28 554 109 -1.0416666666666666e-11 554 1146 -4.1666666666666658e-11 554 4154 1.0416666666666668e-11 555 555 2.0833333541666665e-02 555 33 -2.2851328271989659e-27 555 122 -2.0833333333333333e-03 555 113 2.0833333333333329e-03 555 557 2.0833333333333333e-03 555 121 -2.0833333333333329e-03 555 120 -6.2499999999999995e-03 555 565 -2.0833333333333333e-03 555 119 4.1202858928001372e-19 555 564 -2.0833333333333333e-03 555 558 2.0833333333333333e-03 555 25 2.0833333333333333e-03 555 26 3.1250000520833330e-03 555 30 -4.0414059750199561e-19 555 560 -1.0416666666666667e-10 555 554 2.8974861048767764e-27 555 110 3.1250000520833335e-03 555 109 1.3668993931987516e-19 555 4154 -1.8812360437258079e-27 556 556 2.0833333541666662e-02 556 121 -2.0833333333333333e-03 556 222 2.0833333333333329e-03 556 559 2.0833333333333337e-03 556 128 -2.0833333333333329e-03 556 120 -6.2499999999999986e-03 556 648 2.0833333333333337e-03 556 142 4.1202858928001372e-19 556 114 2.0833333333333329e-11 556 815 2.0833333333333339e-11 556 552 8.3333333333333330e-11 556 221 3.1250000416666660e-03 556 230 -1.0416666674554665e-11 556 566 2.0833333333333333e-03 556 557 2.0833333333333337e-03 556 113 2.0833333333333333e-03 556 112 3.1250000416666668e-03 556 109 -1.0416667070807261e-11 556 1613 2.0833333333333332e-11 557 557 2.9166666666666660e-02 557 142 -1.4465734552327348e-19 557 110 2.0833333333333329e-03 557 121 4.1666666666666657e-03 557 120 1.0416666666666664e-03 557 565 4.1666666666666666e-03 557 555 2.0833333333333333e-03 557 119 9.9486666632977745e-20 557 566 -4.1666666666666649e-03 557 556 2.0833333333333329e-03 557 113 1.0416666666666664e-02 557 112 2.0833333333333329e-03 557 109 1.0416666666666664e-03 558 558 2.9166666666666660e-02 558 571 -4.1666666666666666e-03 558 550 2.0833333333333337e-03 558 123 1.2659172094511536e-19 558 122 4.1666666666666657e-03 558 120 1.0416666666666664e-03 558 119 -1.4465734552327348e-19 558 564 4.1666666666666649e-03 558 555 2.0833333333333329e-03 558 25 1.0416666666666664e-02 558 26 2.0833333333333329e-03 558 30 1.0416666666666664e-03 559 559 2.9166666666666660e-02 559 221 2.0833333333333329e-03 559 648 -4.1666666666666666e-03 559 556 2.0833333333333337e-03 559 142 1.2659172094511536e-19 559 128 4.1666666666666657e-03 559 120 1.0416666666666664e-03 559 129 -1.4465734552327348e-19 559 649 -4.1666666666666649e-03 559 553 2.0833333333333329e-03 559 222 1.0416666666666664e-02 559 230 1.0416666666666664e-03 559 1617 2.0833333333333329e-03 560 560 4.1666666666666662e-10 560 111 3.6295685768920020e-28 560 562 1.0416666666666667e-10 560 36 -1.8812360437258079e-27 560 26 -1.0416666666666667e-10 560 33 1.7917989385963757e-27 560 30 1.8812360437258079e-27 560 555 -1.0416666666666667e-10 560 554 -2.3107708066186488e-27 560 110 -1.0416666666666667e-10 560 109 2.2851328271989659e-27 560 5053 -1.0034310714411270e-27 560 4154 1.0034310714411270e-27 561 561 4.1666666666666664e-02 561 121 2.0833333333333333e-03 561 25 -2.0833333333333329e-03 561 570 2.0833333333333333e-03 561 122 2.0833333333333329e-03 561 138 6.2500000000000003e-03 561 564 2.0833333333333333e-03 561 119 -3.7587087034409578e-19 561 565 2.0833333333333333e-03 561 567 2.0833333333333333e-03 561 113 -2.0833333333333333e-03 561 41 2.0833333333333333e-03 561 110 -6.2499999999999986e-03 561 117 2.6745065309554533e-19 561 864 -2.0833333333333333e-03 561 43 6.2500000000000003e-03 561 563 2.0833333333333333e-03 561 51 -3.7587087034409578e-19 561 513 -2.0833333333333333e-03 561 512 2.0833333333333333e-03 561 27 -2.0833333333333333e-03 561 26 -6.2499999999999986e-03 561 23 2.6745065309554533e-19 561 2488 -2.0833333333333329e-03 561 2866 2.0833333333333329e-03 562 562 2.0833333541666665e-02 562 560 1.0416666666666668e-10 562 33 3.6295685768920020e-28 562 27 -2.0833333333333329e-03 562 26 -3.1250000520833335e-03 562 36 -1.3668994340301920e-19 562 515 2.0833333333333333e-03 562 41 2.0833333333333329e-03 562 513 -2.0833333333333333e-03 562 51 -4.1202858928001372e-19 562 563 2.0833333333333333e-03 562 110 -3.1250000520833330e-03 562 111 4.0414059420721943e-19 562 4154 -1.8812360437258079e-27 562 5053 4.0642113836986528e-27 562 2866 2.0833333333333333e-03 562 2865 6.2499999999999995e-03 562 3465 -2.0833333333333333e-03 562 2488 -2.0833333333333333e-03 563 563 2.9166666666666660e-02 563 117 1.4465734552327348e-19 563 864 4.1666666666666675e-03 563 43 2.0833333333333329e-03 563 561 2.0833333333333333e-03 563 51 1.0416666666666662e-03 563 562 2.0833333333333329e-03 563 110 1.0416666666666660e-03 563 111 -1.4465734552327348e-19 563 2865 2.0833333333333329e-03 563 2866 1.0416666666666664e-02 563 3465 4.1666666666666649e-03 563 2488 4.1666666666666657e-03 564 564 2.9166666666666660e-02 564 23 1.4465734552327348e-19 564 570 -4.1666666666666675e-03 564 138 2.0833333333333329e-03 564 561 2.0833333333333333e-03 564 122 1.0416666666666664e-02 564 120 2.0833333333333329e-03 564 119 1.0416666666666662e-03 564 558 4.1666666666666649e-03 564 555 -2.0833333333333329e-03 564 25 4.1666666666666657e-03 564 26 1.0416666666666660e-03 564 30 -1.4465734552327348e-19 565 565 2.9166666666666660e-02 565 138 2.0833333333333329e-03 565 567 -4.1666666666666649e-03 565 561 2.0833333333333329e-03 565 117 -1.2659172094511536e-19 565 113 4.1666666666666657e-03 565 110 1.0416666666666660e-03 565 109 1.4465734552327348e-19 565 557 4.1666666666666675e-03 565 121 1.0416666666666664e-02 565 120 2.0833333333333329e-03 565 555 -2.0833333333333333e-03 565 119 1.0416666666666662e-03 566 566 2.9166666666666664e-02 566 120 -2.0833333333333329e-03 566 118 -1.4465734552327348e-19 566 569 4.1666666666666675e-03 566 121 -1.0416666666666664e-02 566 141 -2.0833333333333329e-03 566 819 -2.0833333333333333e-03 566 142 -1.0416666666666662e-03 566 557 -4.1666666666666649e-03 566 556 2.0833333333333329e-03 566 113 -4.1666666666666657e-03 566 112 -1.0416666666666664e-03 566 109 1.4465734552327348e-19 567 567 2.9166666666666660e-02 567 568 4.1666666666666666e-03 567 863 -2.0833333333333333e-03 567 140 -1.4465734552327348e-19 567 121 -4.1666666666666657e-03 567 138 -1.0416666666666664e-03 567 119 9.9486666632977745e-20 567 565 -4.1666666666666649e-03 567 561 2.0833333333333329e-03 567 113 -1.0416666666666664e-02 567 110 -2.0833333333333329e-03 567 117 -1.0416666666666664e-03 567 2490 -2.0833333333333329e-03 568 568 2.9166666666666664e-02 568 141 -2.0833333333333329e-03 568 569 4.1666666666666649e-03 568 938 -2.0833333333333329e-03 568 118 1.4465734552327348e-19 568 113 -4.1666666666666657e-03 568 117 -1.2659172094511536e-19 568 567 4.1666666666666666e-03 568 121 -1.0416666666666664e-02 568 138 -2.0833333333333329e-03 568 863 2.0833333333333337e-03 568 140 -1.0416666666666664e-03 568 2490 -1.0416666666666664e-03 569 569 2.9166666666666660e-02 569 112 -2.0833333333333329e-03 569 566 4.1666666666666675e-03 569 819 2.0833333333333333e-03 569 142 -1.4465734552327348e-19 569 121 -4.1666666666666657e-03 569 141 -1.0416666666666660e-03 569 140 1.4465734552327348e-19 569 568 4.1666666666666649e-03 569 938 2.0833333333333329e-03 569 113 -1.0416666666666664e-02 569 118 -1.0416666666666662e-03 569 2490 -2.0833333333333329e-03 570 570 2.9166666666666660e-02 570 26 -2.0833333333333329e-03 570 564 -4.1666666666666675e-03 570 561 2.0833333333333333e-03 570 119 -1.4465734552327348e-19 570 122 -4.1666666666666657e-03 570 138 -1.0416666666666664e-03 570 139 1.4465734552327348e-19 570 503 -4.1666666666666649e-03 570 502 2.0833333333333329e-03 570 25 -1.0416666666666664e-02 570 23 -1.0416666666666662e-03 571 571 2.9166666666666660e-02 571 131 -2.0833333333333329e-03 571 572 4.1666666666666649e-03 571 25 -4.1666666666666657e-03 571 30 -1.4465734552327348e-19 571 558 -4.1666666666666666e-03 571 122 -1.0416666666666664e-02 571 120 -2.0833333333333329e-03 571 550 2.0833333333333333e-03 571 123 -1.0416666666666664e-03 572 572 2.9166666666666660e-02 572 503 -4.1666666666666675e-03 572 139 -1.4465734552327348e-19 572 122 -4.1666666666666657e-03 572 131 -1.0416666666666660e-03 572 123 1.2659172094511536e-19 572 571 4.1666666666666649e-03 572 25 -1.0416666666666664e-02 573 573 2.9166666666666660e-02 573 579 -4.1666666666666675e-03 573 131 2.0833333333333329e-03 573 124 1.0416666666666664e-02 573 120 2.0833333333333329e-03 573 123 1.0416666666666662e-03 573 551 4.1666666666666649e-03 573 550 -2.0833333333333329e-03 573 102 4.1666666666666657e-03 573 100 -1.4465734552327348e-19 574 574 3.3333333333333332e-10 574 100 -4.1666666666666665e-11 574 550 -4.1666666666666678e-11 574 30 -1.8812360437258079e-27 574 33 -6.2499999999999991e-11 574 108 -6.2500000000000004e-11 575 575 2.4999999999999996e-10 576 576 2.0833333333333332e-02 577 577 2.9166666666666660e-02 577 580 4.1666666666666666e-03 577 622 -2.0833333333333333e-03 577 134 -1.4465734552327348e-19 577 124 -4.1666666666666657e-03 577 126 -1.0416666666666664e-03 577 129 9.9486666632977745e-20 577 578 4.1666666666666649e-03 577 621 -2.0833333333333329e-03 577 102 -1.0416666666666664e-02 577 103 -1.0416666666666664e-03 577 1143 -2.0833333333333329e-03 578 578 2.9166666666666660e-02 578 100 -1.4465734552327348e-19 578 551 -4.1666666666666675e-03 578 120 -2.0833333333333329e-03 578 553 2.0833333333333333e-03 578 124 -1.0416666666666664e-02 578 126 -2.0833333333333329e-03 578 129 -1.0416666666666662e-03 578 577 4.1666666666666649e-03 578 621 2.0833333333333329e-03 578 102 -4.1666666666666657e-03 578 103 1.2659172094511536e-19 578 1143 -1.0416666666666660e-03 579 579 2.9166666666666660e-02 579 573 -4.1666666666666675e-03 579 123 -1.4465734552327348e-19 579 124 -4.1666666666666657e-03 579 131 -1.0416666666666660e-03 579 134 1.4465734552327348e-19 579 580 4.1666666666666649e-03 579 102 -1.0416666666666664e-02 580 580 2.9166666666666660e-02 580 103 -1.2659172094511536e-19 580 577 4.1666666666666666e-03 580 126 -2.0833333333333329e-03 580 622 2.0833333333333337e-03 580 124 -1.0416666666666664e-02 580 131 -2.0833333333333329e-03 580 134 -1.0416666666666664e-03 580 579 4.1666666666666649e-03 580 102 -4.1666666666666657e-03 581 581 2.0833333541666669e-02 581 337 -2.0833333333333329e-11 581 148 2.0833333333333326e-11 581 584 2.0833333333333336e-11 581 328 -2.0833333333333329e-11 581 324 -6.2500000000000004e-11 581 614 -2.0833333333333336e-11 581 338 3.7324953730532174e-27 581 615 -2.0833333333333326e-11 581 592 2.0833333333333326e-11 581 185 2.0833333333333329e-11 581 199 -2.0833333333333333e-03 581 184 2.0833333333333329e-03 581 186 1.3668993825846281e-19 581 589 2.0833333333333333e-03 581 197 -2.0833333333333329e-03 581 195 -6.2500000000000003e-03 581 610 2.0833333333333333e-03 581 198 3.7587087034409578e-19 581 612 -2.0833333333333333e-03 581 582 2.0833333333333333e-03 581 147 2.0833333333333333e-03 581 145 -4.0414059347091638e-19 582 582 2.9166666666666660e-02 582 620 -4.1666666666666666e-03 582 583 2.0833333333333333e-03 582 206 1.4465734552327348e-19 582 199 4.1666666666666657e-03 582 195 1.0416666666666664e-03 582 198 -9.9486666632977745e-20 582 612 4.1666666666666649e-03 582 581 2.0833333333333329e-03 582 147 1.0416666666666664e-02 582 145 1.0416666666666664e-03 582 2810 2.0833333333333329e-03 583 583 2.0833333541666662e-02 583 205 -2.0833333333333333e-03 583 147 2.0833333333333329e-03 583 582 2.0833333333333337e-03 583 199 -2.0833333333333329e-03 583 195 -6.2499999999999995e-03 583 620 2.0833333333333337e-03 583 206 4.1202858928001372e-19 583 731 -2.0833333333333337e-03 583 591 2.0833333333333333e-03 583 316 2.0833333333333333e-03 583 328 -2.0833333333333329e-11 583 318 2.0833333333333329e-11 583 320 -4.0414059491689842e-19 583 590 2.0833333333333336e-11 583 326 -2.0833333333333326e-11 583 324 -6.2499999999999991e-11 583 728 2.0833333333333339e-11 583 327 3.5628902784306998e-27 583 730 -2.0833333333333332e-11 583 584 2.0833333333333326e-11 583 148 2.0833333333333329e-11 583 145 -7.8879979260055783e-21 583 2670 3.1250000312499997e-03 583 2810 3.1250000312499993e-03 584 584 2.9166666666666659e-10 584 614 4.1666666666666665e-11 584 581 2.0833333333333336e-11 584 338 1.1000665323307010e-27 584 328 4.1666666666666665e-11 584 324 1.0416666666666665e-11 584 327 -1.3020149240672800e-27 584 730 4.1666666666666652e-11 584 583 2.0833333333333326e-11 584 148 1.0416666666666666e-10 584 145 1.0416666666666661e-11 584 2810 2.0833333333333329e-11 585 585 2.0833333541666665e-02 585 196 -2.0833333333333333e-03 585 316 2.0833333333333329e-03 585 591 2.0833333333333333e-03 585 205 -2.0833333333333329e-03 585 195 -6.2500000000000003e-03 585 714 -2.0833333333333333e-03 585 204 3.7587087034409578e-19 585 326 -2.0833333333333329e-11 585 165 2.0833333333333326e-11 585 588 2.0833333333333336e-11 585 325 -2.0833333333333329e-11 585 324 -6.2500000000000004e-11 585 720 -2.0833333333333336e-11 585 323 3.7324953730532174e-27 585 719 -2.0833333333333326e-11 585 590 2.0833333333333326e-11 585 318 2.0833333333333329e-11 585 315 3.1250000312499993e-03 585 320 1.3668993825846281e-19 585 604 2.0833333333333333e-03 585 586 2.0833333333333333e-03 585 159 2.0833333333333333e-03 585 158 3.1250000312499997e-03 585 157 -4.0414059347091638e-19 586 586 2.9166666666666660e-02 586 204 -9.9486666632977745e-20 586 155 2.0833333333333329e-03 586 196 4.1666666666666657e-03 586 195 1.0416666666666664e-03 586 601 4.1666666666666666e-03 586 587 2.0833333333333333e-03 586 194 1.4465734552327348e-19 586 604 -4.1666666666666649e-03 586 585 2.0833333333333329e-03 586 159 1.0416666666666664e-02 586 158 2.0833333333333329e-03 586 157 1.0416666666666664e-03 587 587 2.0833333541666665e-02 587 325 -2.0833333333333329e-11 587 185 2.0833333333333329e-11 587 592 2.0833333333333336e-11 587 337 -2.0833333333333326e-11 587 324 -6.2499999999999991e-11 587 598 -2.0833333333333339e-11 587 348 3.5628902784306998e-27 587 197 -2.0833333333333333e-03 587 159 2.0833333333333329e-03 587 586 2.0833333333333337e-03 587 196 -2.0833333333333329e-03 587 195 -6.2499999999999995e-03 587 601 -2.0833333333333337e-03 587 194 4.1202858928001372e-19 587 600 -2.0833333333333337e-03 587 589 2.0833333333333333e-03 587 184 2.0833333333333333e-03 587 181 3.1250000312499997e-03 587 186 -4.0414059491689842e-19 587 599 -2.0833333333333332e-11 587 588 2.0833333333333326e-11 587 165 2.0833333333333329e-11 587 155 3.1250000312499993e-03 587 157 -7.8879979260055783e-21 588 588 2.9166666666666659e-10 588 348 -1.3020149240672800e-27 588 158 2.0833333333333332e-11 588 325 4.1666666666666665e-11 588 324 1.0416666666666665e-11 588 720 4.1666666666666665e-11 588 585 2.0833333333333336e-11 588 323 1.1000665323307010e-27 588 599 4.1666666666666652e-11 588 587 2.0833333333333326e-11 588 165 1.0416666666666666e-10 588 155 2.0833333333333329e-11 588 157 1.0416666666666661e-11 589 589 2.9166666666666660e-02 589 610 -4.1666666666666675e-03 589 581 2.0833333333333333e-03 589 198 1.4465734552327348e-19 589 197 4.1666666666666657e-03 589 195 1.0416666666666664e-03 589 194 -1.4465734552327348e-19 589 600 4.1666666666666649e-03 589 587 2.0833333333333329e-03 589 184 1.0416666666666664e-02 589 181 2.0833333333333329e-03 589 186 1.0416666666666662e-03 590 590 2.9166666666666664e-10 590 728 -4.1666666666666665e-11 590 583 2.0833333333333336e-11 590 327 1.5039633158038590e-27 590 326 4.1666666666666658e-11 590 324 1.0416666666666665e-11 590 323 -1.1213657767716683e-27 590 719 4.1666666666666652e-11 590 585 2.0833333333333326e-11 590 318 1.0416666666666666e-10 590 315 2.0833333333333329e-11 590 320 1.0416666666666663e-11 590 2670 2.0833333333333332e-11 591 591 2.9166666666666660e-02 591 315 2.0833333333333329e-03 591 714 4.1666666666666675e-03 591 585 2.0833333333333333e-03 591 204 1.4465734552327348e-19 591 205 4.1666666666666657e-03 591 195 1.0416666666666664e-03 591 206 -1.4465734552327348e-19 591 731 4.1666666666666649e-03 591 583 2.0833333333333329e-03 591 316 1.0416666666666664e-02 591 320 1.0416666666666662e-03 591 2670 2.0833333333333329e-03 592 592 2.9166666666666664e-10 592 181 2.0833333333333332e-11 592 598 4.1666666666666665e-11 592 587 2.0833333333333336e-11 592 348 1.5039633158038590e-27 592 337 4.1666666666666658e-11 592 324 1.0416666666666665e-11 592 338 -1.1213657767716683e-27 592 615 4.1666666666666652e-11 592 581 2.0833333333333326e-11 592 185 1.0416666666666666e-10 592 186 1.0416666666666663e-11 593 593 4.1666666666666664e-02 593 196 2.0833333333333333e-03 593 184 -2.0833333333333329e-03 593 608 2.0833333333333333e-03 593 197 2.0833333333333329e-03 593 200 6.2500000000000003e-03 593 600 2.0833333333333333e-03 593 194 -2.6745065309554533e-19 593 601 2.0833333333333333e-03 593 605 2.0833333333333333e-03 593 159 -2.0833333333333333e-03 593 83 2.0833333333333333e-03 593 156 -2.0833333333333329e-03 593 155 -6.2499999999999995e-03 593 169 4.1202858928001372e-19 593 958 2.0833333333333333e-03 593 94 2.0833333333333329e-03 593 96 6.2500000000000003e-03 593 596 2.0833333333333333e-03 593 97 -2.6745065309554533e-19 593 594 2.0833333333333333e-03 593 691 2.0833333333333333e-03 593 182 -2.0833333333333333e-03 593 181 -6.2499999999999995e-03 593 180 4.1202858928001372e-19 594 594 2.9166666666666660e-02 594 192 1.2659172094511536e-19 594 693 -4.1666666666666666e-03 594 93 2.0833333333333329e-03 594 595 2.0833333333333337e-03 594 83 1.0416666666666664e-02 594 96 2.0833333333333329e-03 594 97 1.0416666666666664e-03 594 691 -4.1666666666666649e-03 594 593 2.0833333333333329e-03 594 182 4.1666666666666657e-03 594 181 1.0416666666666664e-03 594 180 -1.4465734552327348e-19 595 595 2.0833333541666665e-02 595 417 2.0833333333333329e-11 595 166 -2.0833333333333329e-11 595 956 -2.0833333333333336e-11 595 424 2.0833333333333326e-11 595 423 6.2499999999999991e-11 595 603 2.0833333333333339e-11 595 422 -3.5628902784306998e-27 595 602 2.0833333333333332e-11 595 927 2.0833333333333326e-11 595 179 -2.0833333333333329e-11 595 94 2.0833333333333333e-03 595 182 -2.0833333333333329e-03 595 181 -3.1250000312499993e-03 595 192 7.8879979260055783e-21 595 693 2.0833333333333337e-03 595 83 2.0833333333333329e-03 595 93 6.2499999999999995e-03 595 594 2.0833333333333337e-03 595 97 -4.1202858928001372e-19 595 596 2.0833333333333337e-03 595 955 -2.0833333333333333e-03 595 156 -2.0833333333333333e-03 595 155 -3.1250000312499997e-03 595 154 4.0414059491689842e-19 596 596 2.9166666666666664e-02 596 93 2.0833333333333329e-03 596 169 9.9486666632977745e-20 596 958 -4.1666666666666666e-03 596 94 1.0416666666666664e-02 596 96 2.0833333333333329e-03 596 593 2.0833333333333333e-03 596 97 1.0416666666666664e-03 596 955 4.1666666666666649e-03 596 595 2.0833333333333329e-03 596 156 4.1666666666666657e-03 596 155 1.0416666666666664e-03 596 154 -1.4465734552327348e-19 597 597 4.1666666666666662e-10 597 424 2.0833333333333329e-11 597 179 -2.0833333333333329e-11 597 915 -2.0833333333333336e-11 597 417 2.0833333333333326e-11 597 414 6.2499999999999991e-11 597 602 2.0833333333333336e-11 597 422 -2.1169082391605852e-27 597 603 2.0833333333333326e-11 597 920 -2.0833333333333326e-11 597 166 -2.0833333333333329e-11 597 337 2.0833333333333329e-11 597 165 -2.0833333333333329e-11 597 155 -6.2499999999999991e-11 597 175 3.5628902784306998e-27 597 725 2.0833333333333336e-11 597 325 2.0833333333333326e-11 597 339 6.2499999999999991e-11 597 599 2.0833333333333336e-11 597 348 -2.1169082391605852e-27 597 598 2.0833333333333326e-11 597 914 2.0833333333333326e-11 597 185 -2.0833333333333329e-11 597 181 -6.2499999999999991e-11 597 177 3.5628902784306998e-27 598 598 2.9166666666666664e-10 598 186 1.3233141685082473e-27 598 592 4.1666666666666665e-11 598 324 2.0833333333333332e-11 598 587 -2.0833333333333339e-11 598 337 1.0416666666666666e-10 598 339 2.0833333333333329e-11 598 348 1.0416666666666663e-11 598 914 -4.1666666666666652e-11 598 597 2.0833333333333326e-11 598 185 4.1666666666666665e-11 598 181 1.0416666666666665e-11 598 177 -1.1000665323307010e-27 599 599 2.9166666666666664e-10 599 324 2.0833333333333329e-11 599 175 1.1213657767716683e-27 599 725 -4.1666666666666665e-11 599 325 1.0416666666666666e-10 599 339 2.0833333333333332e-11 599 597 2.0833333333333336e-11 599 348 1.0416666666666663e-11 599 588 4.1666666666666652e-11 599 587 -2.0833333333333332e-11 599 165 4.1666666666666665e-11 599 155 1.0416666666666665e-11 599 157 -1.1000665323307010e-27 600 600 2.9166666666666660e-02 600 180 9.9486666632977745e-20 600 608 -4.1666666666666666e-03 600 200 2.0833333333333329e-03 600 593 2.0833333333333333e-03 600 197 1.0416666666666664e-02 600 195 2.0833333333333329e-03 600 194 1.0416666666666664e-03 600 589 4.1666666666666649e-03 600 587 -2.0833333333333329e-03 600 184 4.1666666666666657e-03 600 181 1.0416666666666664e-03 600 186 -1.4465734552327348e-19 601 601 2.9166666666666664e-02 601 200 2.0833333333333329e-03 601 605 -4.1666666666666649e-03 601 593 2.0833333333333329e-03 601 169 -1.4465734552327348e-19 601 159 4.1666666666666657e-03 601 155 1.0416666666666664e-03 601 157 1.2659172094511536e-19 601 586 4.1666666666666666e-03 601 196 1.0416666666666664e-02 601 195 2.0833333333333329e-03 601 587 -2.0833333333333337e-03 601 194 1.0416666666666664e-03 602 602 2.9166666666666664e-10 602 177 1.1213657767716683e-27 602 915 4.1666666666666665e-11 602 414 2.0833333333333332e-11 602 597 2.0833333333333336e-11 602 417 1.0416666666666666e-10 602 423 2.0833333333333329e-11 602 422 1.0416666666666663e-11 602 927 -4.1666666666666652e-11 602 595 2.0833333333333332e-11 602 179 4.1666666666666665e-11 602 181 1.0416666666666665e-11 602 192 -1.1000665323307010e-27 603 603 2.9166666666666664e-10 603 414 2.0833333333333329e-11 603 920 4.1666666666666652e-11 603 597 2.0833333333333326e-11 603 175 -1.1000665323307010e-27 603 166 4.1666666666666665e-11 603 155 1.0416666666666665e-11 603 154 1.3233141685082473e-27 603 956 4.1666666666666665e-11 603 424 1.0416666666666666e-10 603 423 2.0833333333333332e-11 603 595 2.0833333333333339e-11 603 422 1.0416666666666663e-11 604 604 2.9166666666666660e-02 604 195 -2.0833333333333329e-03 604 170 -1.4465734552327348e-19 604 607 4.1666666666666675e-03 604 196 -1.0416666666666664e-02 604 203 -2.0833333333333329e-03 604 713 -2.0833333333333333e-03 604 204 -1.0416666666666662e-03 604 586 -4.1666666666666649e-03 604 585 2.0833333333333329e-03 604 159 -4.1666666666666657e-03 604 158 -1.0416666666666660e-03 604 157 1.2659172094511536e-19 605 605 2.9166666666666660e-02 605 168 -2.0833333333333329e-03 605 606 4.1666666666666675e-03 605 959 2.0833333333333333e-03 605 201 -1.4465734552327348e-19 605 196 -4.1666666666666657e-03 605 200 -1.0416666666666660e-03 605 194 1.4465734552327348e-19 605 601 -4.1666666666666649e-03 605 593 2.0833333333333329e-03 605 159 -1.0416666666666664e-02 605 155 -2.0833333333333329e-03 605 169 -1.0416666666666662e-03 606 606 2.9166666666666664e-02 606 203 -2.0833333333333329e-03 606 607 4.1666666666666649e-03 606 961 -2.0833333333333329e-03 606 170 1.4465734552327348e-19 606 159 -4.1666666666666657e-03 606 168 -1.0416666666666664e-03 606 169 -1.4465734552327348e-19 606 605 4.1666666666666675e-03 606 196 -1.0416666666666664e-02 606 200 -2.0833333333333329e-03 606 959 -2.0833333333333333e-03 606 201 -1.0416666666666662e-03 607 607 2.9166666666666660e-02 607 158 -2.0833333333333329e-03 607 604 4.1666666666666666e-03 607 713 2.0833333333333333e-03 607 204 -9.9486666632977745e-20 607 196 -4.1666666666666657e-03 607 203 -1.0416666666666664e-03 607 201 1.4465734552327348e-19 607 606 4.1666666666666649e-03 607 961 2.0833333333333329e-03 607 159 -1.0416666666666664e-02 607 168 -2.0833333333333329e-03 607 170 -1.0416666666666664e-03 608 608 2.9166666666666660e-02 608 214 1.2659172094511536e-19 608 181 -2.0833333333333329e-03 608 197 -4.1666666666666657e-03 608 200 -1.0416666666666660e-03 608 600 -4.1666666666666675e-03 608 593 2.0833333333333333e-03 608 194 -1.4465734552327348e-19 608 609 4.1666666666666649e-03 608 682 2.0833333333333329e-03 608 184 -1.0416666666666664e-02 608 180 -1.0416666666666662e-03 609 609 2.9166666666666660e-02 609 611 4.1666666666666666e-03 609 208 -2.0833333333333329e-03 609 197 -1.0416666666666664e-02 609 200 -2.0833333333333329e-03 609 214 -1.0416666666666664e-03 609 608 4.1666666666666649e-03 609 682 -2.0833333333333329e-03 609 184 -4.1666666666666657e-03 609 180 9.9486666632977745e-20 610 610 2.9166666666666660e-02 610 208 -2.0833333333333329e-03 610 611 4.1666666666666649e-03 610 184 -4.1666666666666657e-03 610 186 -1.4465734552327348e-19 610 589 -4.1666666666666675e-03 610 197 -1.0416666666666664e-02 610 195 -2.0833333333333329e-03 610 581 2.0833333333333333e-03 610 198 -1.0416666666666662e-03 611 611 2.9166666666666660e-02 611 609 4.1666666666666666e-03 611 214 -1.2659172094511536e-19 611 197 -4.1666666666666657e-03 611 208 -1.0416666666666664e-03 611 198 1.4465734552327348e-19 611 610 4.1666666666666649e-03 611 184 -1.0416666666666664e-02 612 612 2.9166666666666660e-02 612 617 -4.1666666666666675e-03 612 208 2.0833333333333329e-03 612 199 1.0416666666666664e-02 612 195 2.0833333333333329e-03 612 198 1.0416666666666662e-03 612 582 4.1666666666666649e-03 612 581 -2.0833333333333329e-03 612 147 4.1666666666666657e-03 612 145 -1.2659172094511536e-19 613 613 2.0833333333333331e-10 614 614 2.9166666666666659e-10 614 145 1.1000665323307010e-27 614 584 4.1666666666666665e-11 614 324 2.0833333333333332e-11 614 581 -2.0833333333333336e-11 614 328 1.0416666666666666e-10 614 335 2.0833333333333329e-11 614 338 1.0416666666666661e-11 614 734 -4.1666666666666652e-11 614 148 4.1666666666666658e-11 615 615 2.9166666666666664e-10 615 324 2.0833333333333329e-11 615 592 4.1666666666666652e-11 615 581 -2.0833333333333326e-11 615 186 -1.3233141685082473e-27 615 185 4.1666666666666658e-11 615 905 4.1666666666666665e-11 615 337 1.0416666666666666e-10 615 335 2.0833333333333332e-11 615 338 1.0416666666666661e-11 616 616 2.0833333333333329e-02 617 617 2.9166666666666660e-02 617 612 -4.1666666666666666e-03 617 198 -9.9486666632977745e-20 617 199 -4.1666666666666657e-03 617 208 -1.0416666666666664e-03 617 211 1.4465734552327348e-19 617 618 4.1666666666666649e-03 617 147 -1.0416666666666664e-02 618 618 2.9166666666666660e-02 618 619 4.1666666666666675e-03 618 216 -2.0833333333333329e-03 618 199 -1.0416666666666664e-02 618 208 -2.0833333333333329e-03 618 211 -1.0416666666666662e-03 618 617 4.1666666666666649e-03 618 147 -4.1666666666666657e-03 618 2819 -1.4465734552327348e-19 618 3534 2.0833333333333333e-03 619 619 2.9166666666666660e-02 619 618 4.1666666666666675e-03 619 211 -1.4465734552327348e-19 619 199 -4.1666666666666657e-03 619 216 -1.0416666666666660e-03 619 206 1.4465734552327348e-19 619 620 4.1666666666666649e-03 619 147 -1.0416666666666664e-02 619 3534 -2.0833333333333333e-03 619 3390 -2.0833333333333329e-03 619 2810 -2.0833333333333329e-03 619 2819 -1.0416666666666662e-03 620 620 2.9166666666666664e-02 620 216 -2.0833333333333329e-03 620 145 -1.2659172094511536e-19 620 582 -4.1666666666666666e-03 620 199 -1.0416666666666664e-02 620 195 -2.0833333333333329e-03 620 583 2.0833333333333337e-03 620 206 -1.0416666666666664e-03 620 619 4.1666666666666649e-03 620 147 -4.1666666666666657e-03 620 3390 2.0833333333333329e-03 620 2810 -1.0416666666666664e-03 620 2819 1.4465734552327348e-19 621 621 2.0833333541666669e-02 621 375 -2.0833333333333329e-11 621 105 2.0833333333333326e-11 621 623 2.0833333333333336e-11 621 371 -2.0833333333333329e-11 621 367 -6.2500000000000004e-11 621 651 -2.0833333333333336e-11 621 376 3.7324953730532174e-27 621 652 -2.0833333333333326e-11 621 631 2.0833333333333326e-11 621 227 2.0833333333333329e-11 621 124 -2.0833333333333333e-03 621 222 2.0833333333333329e-03 621 229 1.3668993825846281e-19 621 628 2.0833333333333333e-03 621 128 -2.0833333333333329e-03 621 126 -6.2500000000000003e-03 621 649 2.0833333333333333e-03 621 129 3.7587087034409578e-19 621 578 2.0833333333333333e-03 621 577 -2.0833333333333333e-03 621 102 2.0833333333333333e-03 621 103 -4.0414059347091638e-19 621 1617 3.1250000312499993e-03 621 1143 3.1250000312499997e-03 622 622 2.0833333541666662e-02 622 133 -2.0833333333333333e-03 622 102 2.0833333333333329e-03 622 577 -2.0833333333333337e-03 622 124 -2.0833333333333329e-03 622 126 -6.2499999999999995e-03 622 580 2.0833333333333337e-03 622 134 4.1202858928001372e-19 622 754 -2.0833333333333337e-03 622 630 2.0833333333333333e-03 622 353 2.0833333333333333e-03 622 371 -2.0833333333333329e-11 622 357 2.0833333333333329e-11 622 358 -4.0414059491689842e-19 622 629 2.0833333333333336e-11 622 369 -2.0833333333333326e-11 622 367 -6.2499999999999991e-11 622 750 2.0833333333333339e-11 622 370 3.5628902784306998e-27 622 752 -2.0833333333333332e-11 622 623 2.0833333333333326e-11 622 105 2.0833333333333329e-11 622 103 -7.8879979260055783e-21 623 623 2.9166666666666659e-10 623 651 4.1666666666666665e-11 623 621 2.0833333333333336e-11 623 376 1.1000665323307010e-27 623 371 4.1666666666666665e-11 623 367 1.0416666666666665e-11 623 370 -1.3020149240672800e-27 623 752 4.1666666666666652e-11 623 622 2.0833333333333326e-11 623 105 1.0416666666666666e-10 623 103 1.0416666666666661e-11 623 1143 2.0833333333333332e-11 624 624 2.0833333541666665e-02 624 127 -2.0833333333333333e-03 624 353 2.0833333333333329e-03 624 630 2.0833333333333333e-03 624 133 -2.0833333333333329e-03 624 126 -6.2500000000000003e-03 624 736 -2.0833333333333333e-03 624 144 3.7587087034409578e-19 624 369 -2.0833333333333329e-11 624 163 2.0833333333333326e-11 624 627 2.0833333333333336e-11 624 368 -2.0833333333333329e-11 624 367 -6.2500000000000004e-11 624 742 -2.0833333333333336e-11 624 366 3.7324953730532174e-27 624 741 -2.0833333333333326e-11 624 629 2.0833333333333326e-11 624 357 2.0833333333333329e-11 624 352 3.1250000312499993e-03 624 358 1.3668993825846281e-19 624 643 2.0833333333333333e-03 624 625 2.0833333333333333e-03 624 153 2.0833333333333333e-03 624 152 3.1250000312499997e-03 624 151 -4.0414059347091638e-19 625 625 2.9166666666666660e-02 625 144 -9.9486666632977745e-20 625 161 2.0833333333333329e-03 625 127 4.1666666666666657e-03 625 126 1.0416666666666664e-03 625 640 4.1666666666666666e-03 625 626 2.0833333333333333e-03 625 125 1.4465734552327348e-19 625 643 -4.1666666666666649e-03 625 624 2.0833333333333329e-03 625 153 1.0416666666666664e-02 625 152 2.0833333333333329e-03 625 151 1.0416666666666664e-03 626 626 2.0833333541666665e-02 626 368 -2.0833333333333329e-11 626 227 2.0833333333333329e-11 626 631 2.0833333333333336e-11 626 375 -2.0833333333333326e-11 626 367 -6.2499999999999991e-11 626 637 -2.0833333333333339e-11 626 385 3.5628902784306998e-27 626 128 -2.0833333333333333e-03 626 153 2.0833333333333329e-03 626 625 2.0833333333333337e-03 626 127 -2.0833333333333329e-03 626 126 -6.2499999999999995e-03 626 640 -2.0833333333333337e-03 626 125 4.1202858928001372e-19 626 639 -2.0833333333333337e-03 626 628 2.0833333333333333e-03 626 222 2.0833333333333333e-03 626 223 3.1250000312499997e-03 626 229 -4.0414059491689842e-19 626 638 -2.0833333333333332e-11 626 627 2.0833333333333326e-11 626 163 2.0833333333333329e-11 626 161 3.1250000312499993e-03 626 151 -7.8879979260055783e-21 627 627 2.9166666666666659e-10 627 385 -1.3020149240672800e-27 627 152 2.0833333333333332e-11 627 368 4.1666666666666665e-11 627 367 1.0416666666666665e-11 627 742 4.1666666666666665e-11 627 624 2.0833333333333336e-11 627 366 1.1000665323307010e-27 627 638 4.1666666666666652e-11 627 626 2.0833333333333326e-11 627 163 1.0416666666666666e-10 627 161 2.0833333333333329e-11 627 151 1.0416666666666661e-11 628 628 2.9166666666666660e-02 628 649 -4.1666666666666675e-03 628 621 2.0833333333333333e-03 628 129 1.4465734552327348e-19 628 128 4.1666666666666657e-03 628 126 1.0416666666666664e-03 628 125 -1.4465734552327348e-19 628 639 4.1666666666666649e-03 628 626 2.0833333333333329e-03 628 222 1.0416666666666664e-02 628 223 2.0833333333333329e-03 628 229 1.0416666666666662e-03 628 1617 2.0833333333333329e-03 629 629 2.9166666666666664e-10 629 750 -4.1666666666666665e-11 629 622 2.0833333333333336e-11 629 370 1.5039633158038590e-27 629 369 4.1666666666666658e-11 629 367 1.0416666666666665e-11 629 366 -1.1213657767716683e-27 629 741 4.1666666666666652e-11 629 624 2.0833333333333326e-11 629 357 1.0416666666666666e-10 629 352 2.0833333333333329e-11 629 358 1.0416666666666663e-11 630 630 2.9166666666666660e-02 630 352 2.0833333333333329e-03 630 736 4.1666666666666675e-03 630 624 2.0833333333333333e-03 630 144 1.4465734552327348e-19 630 133 4.1666666666666657e-03 630 126 1.0416666666666664e-03 630 134 -1.4465734552327348e-19 630 754 4.1666666666666649e-03 630 622 2.0833333333333329e-03 630 353 1.0416666666666664e-02 630 358 1.0416666666666662e-03 631 631 2.9166666666666664e-10 631 223 2.0833333333333332e-11 631 637 4.1666666666666665e-11 631 626 2.0833333333333336e-11 631 385 1.5039633158038590e-27 631 375 4.1666666666666658e-11 631 367 1.0416666666666665e-11 631 376 -1.1213657767716683e-27 631 652 4.1666666666666652e-11 631 621 2.0833333333333326e-11 631 227 1.0416666666666666e-10 631 229 1.0416666666666663e-11 631 1617 2.0833333333333329e-11 632 632 4.1666666666666664e-02 632 127 2.0833333333333333e-03 632 222 -2.0833333333333329e-03 632 647 2.0833333333333333e-03 632 128 2.0833333333333329e-03 632 141 6.2500000000000003e-03 632 639 2.0833333333333333e-03 632 125 -2.6745065309554533e-19 632 640 2.0833333333333333e-03 632 646 2.0833333333333333e-03 632 153 -2.0833333333333333e-03 632 478 2.0833333333333333e-03 632 162 -2.0833333333333329e-03 632 161 -6.2499999999999995e-03 632 171 4.1202858928001372e-19 632 952 -2.0833333333333333e-03 632 483 2.0833333333333329e-03 632 480 6.2500000000000003e-03 632 635 2.0833333333333333e-03 632 486 -2.6745065309554533e-19 632 633 2.0833333333333333e-03 632 942 2.0833333333333333e-03 632 224 -2.0833333333333333e-03 632 223 -6.2499999999999995e-03 632 220 4.1202858928001372e-19 633 633 2.9166666666666660e-02 633 232 1.2659172094511536e-19 633 944 -4.1666666666666666e-03 633 482 2.0833333333333329e-03 633 634 2.0833333333333337e-03 633 478 1.0416666666666664e-02 633 480 2.0833333333333329e-03 633 486 1.0416666666666664e-03 633 942 -4.1666666666666649e-03 633 632 2.0833333333333329e-03 633 224 4.1666666666666657e-03 633 223 1.0416666666666664e-03 633 220 -1.4465734552327348e-19 634 634 2.0833333541666665e-02 634 299 2.0833333333333329e-11 634 164 -2.0833333333333329e-11 634 972 -2.0833333333333336e-11 634 311 2.0833333333333326e-11 634 310 6.2499999999999991e-11 634 642 2.0833333333333339e-11 634 309 -3.5628902784306998e-27 634 641 2.0833333333333332e-11 634 974 -2.0833333333333326e-11 634 226 -2.0833333333333329e-11 634 483 2.0833333333333333e-03 634 224 -2.0833333333333329e-03 634 223 -3.1250000312499993e-03 634 232 7.8879979260055783e-21 634 944 2.0833333333333337e-03 634 478 2.0833333333333329e-03 634 482 6.2499999999999995e-03 634 633 2.0833333333333337e-03 634 486 -4.1202858928001372e-19 634 635 2.0833333333333337e-03 634 971 -2.0833333333333333e-03 634 162 -2.0833333333333333e-03 634 161 -3.1250000312499997e-03 634 160 4.0414059491689842e-19 635 635 2.9166666666666664e-02 635 482 2.0833333333333329e-03 635 171 9.9486666632977745e-20 635 952 4.1666666666666666e-03 635 483 1.0416666666666664e-02 635 480 2.0833333333333329e-03 635 632 2.0833333333333333e-03 635 486 1.0416666666666664e-03 635 971 4.1666666666666649e-03 635 634 2.0833333333333329e-03 635 162 4.1666666666666657e-03 635 161 1.0416666666666664e-03 635 160 -1.4465734552327348e-19 636 636 4.1666666666666662e-10 636 311 2.0833333333333329e-11 636 226 -2.0833333333333329e-11 636 1040 -2.0833333333333336e-11 636 299 2.0833333333333326e-11 636 297 6.2499999999999991e-11 636 641 2.0833333333333336e-11 636 309 -2.1169082391605852e-27 636 642 2.0833333333333326e-11 636 1045 -2.0833333333333326e-11 636 164 -2.0833333333333329e-11 636 375 2.0833333333333329e-11 636 163 -2.0833333333333329e-11 636 161 -6.2499999999999991e-11 636 172 3.5628902784306998e-27 636 745 2.0833333333333336e-11 636 368 2.0833333333333326e-11 636 377 6.2499999999999991e-11 636 638 2.0833333333333336e-11 636 385 -2.1169082391605852e-27 636 637 2.0833333333333326e-11 636 1039 2.0833333333333326e-11 636 227 -2.0833333333333329e-11 636 223 -6.2499999999999991e-11 636 225 3.5628902784306998e-27 637 637 2.9166666666666664e-10 637 229 1.3233141685082473e-27 637 631 4.1666666666666665e-11 637 367 2.0833333333333332e-11 637 626 -2.0833333333333339e-11 637 375 1.0416666666666666e-10 637 377 2.0833333333333329e-11 637 385 1.0416666666666663e-11 637 1039 -4.1666666666666652e-11 637 636 2.0833333333333326e-11 637 227 4.1666666666666665e-11 637 223 1.0416666666666665e-11 637 225 -1.1000665323307010e-27 638 638 2.9166666666666664e-10 638 367 2.0833333333333329e-11 638 172 1.1213657767716683e-27 638 745 -4.1666666666666665e-11 638 368 1.0416666666666666e-10 638 377 2.0833333333333332e-11 638 636 2.0833333333333336e-11 638 385 1.0416666666666663e-11 638 627 4.1666666666666652e-11 638 626 -2.0833333333333332e-11 638 163 4.1666666666666665e-11 638 161 1.0416666666666665e-11 638 151 -1.1000665323307010e-27 639 639 2.9166666666666660e-02 639 220 9.9486666632977745e-20 639 647 -4.1666666666666666e-03 639 141 2.0833333333333329e-03 639 632 2.0833333333333333e-03 639 128 1.0416666666666664e-02 639 126 2.0833333333333329e-03 639 125 1.0416666666666664e-03 639 628 4.1666666666666649e-03 639 626 -2.0833333333333329e-03 639 222 4.1666666666666657e-03 639 223 1.0416666666666664e-03 639 229 -1.4465734552327348e-19 640 640 2.9166666666666664e-02 640 141 2.0833333333333329e-03 640 646 -4.1666666666666649e-03 640 632 2.0833333333333329e-03 640 171 -1.4465734552327348e-19 640 153 4.1666666666666657e-03 640 161 1.0416666666666664e-03 640 151 1.2659172094511536e-19 640 625 4.1666666666666666e-03 640 127 1.0416666666666664e-02 640 126 2.0833333333333329e-03 640 626 -2.0833333333333337e-03 640 125 1.0416666666666664e-03 641 641 2.9166666666666664e-10 641 225 1.1213657767716683e-27 641 1040 4.1666666666666665e-11 641 297 2.0833333333333332e-11 641 636 2.0833333333333336e-11 641 299 1.0416666666666666e-10 641 310 2.0833333333333329e-11 641 309 1.0416666666666663e-11 641 974 4.1666666666666652e-11 641 634 2.0833333333333332e-11 641 226 4.1666666666666665e-11 641 223 1.0416666666666665e-11 641 232 -1.1000665323307010e-27 642 642 2.9166666666666664e-10 642 297 2.0833333333333329e-11 642 1045 4.1666666666666652e-11 642 636 2.0833333333333326e-11 642 172 -1.1000665323307010e-27 642 164 4.1666666666666665e-11 642 161 1.0416666666666665e-11 642 160 1.3233141685082473e-27 642 972 4.1666666666666665e-11 642 311 1.0416666666666666e-10 642 310 2.0833333333333332e-11 642 634 2.0833333333333339e-11 642 309 1.0416666666666663e-11 643 643 2.9166666666666660e-02 643 126 -2.0833333333333329e-03 643 167 -1.4465734552327348e-19 643 644 4.1666666666666675e-03 643 127 -1.0416666666666664e-02 643 135 -2.0833333333333329e-03 643 735 -2.0833333333333333e-03 643 144 -1.0416666666666662e-03 643 625 -4.1666666666666649e-03 643 624 2.0833333333333329e-03 643 153 -4.1666666666666657e-03 643 152 -1.0416666666666660e-03 643 151 1.2659172094511536e-19 644 644 2.9166666666666660e-02 644 152 -2.0833333333333329e-03 644 643 4.1666666666666666e-03 644 735 2.0833333333333333e-03 644 144 -9.9486666632977745e-20 644 127 -4.1666666666666657e-03 644 135 -1.0416666666666664e-03 644 143 1.4465734552327348e-19 644 645 4.1666666666666649e-03 644 842 -2.0833333333333329e-03 644 153 -1.0416666666666664e-02 644 168 -2.0833333333333329e-03 644 167 -1.0416666666666664e-03 645 645 2.9166666666666660e-02 645 171 -1.4465734552327348e-19 645 646 4.1666666666666675e-03 645 141 -2.0833333333333329e-03 645 951 2.0833333333333333e-03 645 127 -1.0416666666666664e-02 645 135 -2.0833333333333329e-03 645 143 -1.0416666666666662e-03 645 644 4.1666666666666649e-03 645 842 2.0833333333333329e-03 645 153 -4.1666666666666657e-03 645 168 -1.0416666666666664e-03 645 167 1.4465734552327348e-19 646 646 2.9166666666666660e-02 646 168 -2.0833333333333329e-03 646 645 4.1666666666666675e-03 646 951 -2.0833333333333333e-03 646 143 -1.4465734552327348e-19 646 127 -4.1666666666666657e-03 646 141 -1.0416666666666660e-03 646 125 1.4465734552327348e-19 646 640 -4.1666666666666649e-03 646 632 2.0833333333333329e-03 646 153 -1.0416666666666664e-02 646 161 -2.0833333333333329e-03 646 171 -1.0416666666666662e-03 647 647 2.9166666666666660e-02 647 223 -2.0833333333333329e-03 647 639 -4.1666666666666675e-03 647 632 2.0833333333333333e-03 647 125 -1.4465734552327348e-19 647 128 -4.1666666666666657e-03 647 141 -1.0416666666666660e-03 647 142 1.2659172094511536e-19 647 648 4.1666666666666649e-03 647 819 2.0833333333333329e-03 647 222 -1.0416666666666664e-02 647 221 -2.0833333333333329e-03 647 220 -1.0416666666666662e-03 648 648 2.9166666666666660e-02 648 230 -1.4465734552327348e-19 648 559 -4.1666666666666666e-03 648 120 -2.0833333333333329e-03 648 556 2.0833333333333333e-03 648 128 -1.0416666666666664e-02 648 141 -2.0833333333333329e-03 648 142 -1.0416666666666664e-03 648 647 4.1666666666666649e-03 648 819 -2.0833333333333329e-03 648 222 -4.1666666666666657e-03 648 221 -1.0416666666666664e-03 648 220 9.9486666632977745e-20 649 649 2.9166666666666660e-02 649 120 -2.0833333333333329e-03 649 559 -4.1666666666666649e-03 649 553 2.0833333333333329e-03 649 230 1.4465734552327348e-19 649 222 -4.1666666666666657e-03 649 229 -1.4465734552327348e-19 649 628 -4.1666666666666675e-03 649 128 -1.0416666666666664e-02 649 126 -2.0833333333333329e-03 649 621 2.0833333333333333e-03 649 129 -1.0416666666666662e-03 649 1617 -1.0416666666666660e-03 650 650 4.1666666666666662e-10 650 371 2.0833333333333329e-11 650 227 -2.0833333333333326e-11 650 1026 -2.0833333333333336e-11 650 375 2.0833333333333329e-11 650 373 6.2499999999999991e-11 650 652 2.0833333333333336e-11 650 376 -3.5628902784306998e-27 650 233 1.0416666666666668e-11 650 651 2.0833333333333326e-11 650 756 2.0833333333333326e-11 650 105 -2.0833333333333329e-11 650 1139 -2.0833333333333329e-11 650 1723 -2.0833333333333339e-11 650 1726 8.3333333333333330e-11 650 1617 -7.2916666666666660e-11 650 1615 -2.0833333333333332e-11 650 1143 -7.2916666666666660e-11 650 1144 1.0416666666666666e-11 651 651 2.9166666666666659e-10 651 103 1.1000665323307010e-27 651 623 4.1666666666666665e-11 651 367 2.0833333333333332e-11 651 621 -2.0833333333333336e-11 651 371 1.0416666666666666e-10 651 373 2.0833333333333329e-11 651 376 1.0416666666666661e-11 651 756 -4.1666666666666652e-11 651 650 2.0833333333333326e-11 651 105 4.1666666666666658e-11 651 1143 1.0416666666666661e-11 651 1144 -1.5039633158038590e-27 652 652 2.9166666666666664e-10 652 367 2.0833333333333329e-11 652 631 4.1666666666666652e-11 652 621 -2.0833333333333326e-11 652 229 -1.3233141685082473e-27 652 227 4.1666666666666658e-11 652 233 1.3020149240672800e-27 652 1026 4.1666666666666665e-11 652 375 1.0416666666666666e-10 652 373 2.0833333333333332e-11 652 650 2.0833333333333336e-11 652 376 1.0416666666666661e-11 652 1617 1.0416666666666661e-11 653 653 2.0833333333333332e-02 654 654 2.9166666666666660e-02 654 674 -4.1666666666666666e-03 654 260 1.4465734552327348e-19 654 255 4.1666666666666657e-03 654 251 1.0416666666666664e-03 654 254 -9.9486666632977745e-20 654 671 4.1666666666666649e-03 654 236 1.0416666666666664e-02 655 655 2.0833333333333332e-02 656 656 2.9166666666666660e-02 656 269 -9.9486666632977745e-20 656 252 4.1666666666666657e-03 656 251 1.0416666666666664e-03 656 662 4.1666666666666666e-03 656 250 1.4465734552327348e-19 656 663 -4.1666666666666649e-03 656 243 1.0416666666666664e-02 657 657 2.0833333333333329e-02 658 658 2.9166666666666660e-02 658 669 -4.1666666666666675e-03 658 254 1.4465734552327348e-19 658 253 4.1666666666666657e-03 658 251 1.0416666666666664e-03 658 250 -1.4465734552327348e-19 658 661 4.1666666666666649e-03 658 246 1.0416666666666664e-02 659 659 2.0833333333333329e-02 660 660 2.9166666666666660e-02 660 879 -4.1666666666666675e-03 660 269 1.4465734552327348e-19 660 259 4.1666666666666657e-03 660 251 1.0416666666666664e-03 660 260 -1.4465734552327348e-19 660 880 -4.1666666666666649e-03 660 461 1.0416666666666664e-02 661 661 2.9166666666666660e-02 661 667 -4.1666666666666666e-03 661 270 2.0833333333333329e-03 661 253 1.0416666666666664e-02 661 251 2.0833333333333329e-03 661 250 1.0416666666666664e-03 661 658 4.1666666666666649e-03 661 246 4.1666666666666657e-03 661 2515 9.9486666632977745e-20 661 3481 -2.0833333333333333e-03 662 662 2.9166666666666664e-02 662 270 2.0833333333333329e-03 662 666 -4.1666666666666649e-03 662 243 4.1666666666666657e-03 662 656 4.1666666666666666e-03 662 252 1.0416666666666664e-02 662 251 2.0833333333333329e-03 662 250 1.0416666666666664e-03 662 3481 -2.0833333333333329e-03 662 2363 -1.4465734552327348e-19 663 663 2.9166666666666660e-02 663 251 -2.0833333333333329e-03 663 245 -1.4465734552327348e-19 663 664 4.1666666666666675e-03 663 252 -1.0416666666666664e-02 663 261 -2.0833333333333329e-03 663 883 2.0833333333333333e-03 663 269 -1.0416666666666662e-03 663 656 -4.1666666666666649e-03 663 243 -4.1666666666666657e-03 664 664 2.9166666666666660e-02 664 663 4.1666666666666666e-03 664 883 -2.0833333333333333e-03 664 269 -9.9486666632977745e-20 664 252 -4.1666666666666657e-03 664 261 -1.0416666666666664e-03 664 268 1.4465734552327348e-19 664 665 4.1666666666666649e-03 664 884 -2.0833333333333329e-03 664 243 -1.0416666666666664e-02 664 245 -1.0416666666666664e-03 664 2360 -2.0833333333333329e-03 665 665 2.9166666666666660e-02 665 666 4.1666666666666675e-03 665 270 -2.0833333333333329e-03 665 252 -1.0416666666666664e-02 665 261 -2.0833333333333329e-03 665 268 -1.0416666666666662e-03 665 664 4.1666666666666649e-03 665 884 2.0833333333333329e-03 665 243 -4.1666666666666657e-03 665 245 1.4465734552327348e-19 665 2363 -1.4465734552327348e-19 665 3412 2.0833333333333333e-03 665 2360 -1.0416666666666664e-03 666 666 2.9166666666666660e-02 666 665 4.1666666666666675e-03 666 268 -1.4465734552327348e-19 666 252 -4.1666666666666657e-03 666 270 -1.0416666666666660e-03 666 250 1.4465734552327348e-19 666 662 -4.1666666666666649e-03 666 243 -1.0416666666666664e-02 666 2360 -2.0833333333333329e-03 666 3412 -2.0833333333333333e-03 666 3481 -2.0833333333333329e-03 666 2363 -1.0416666666666662e-03 667 667 2.9166666666666660e-02 667 275 1.2659172094511536e-19 667 253 -4.1666666666666657e-03 667 270 -1.0416666666666660e-03 667 661 -4.1666666666666675e-03 667 250 -1.4465734552327348e-19 667 668 4.1666666666666649e-03 667 246 -1.0416666666666664e-02 667 3481 -2.0833333333333333e-03 667 3128 -2.0833333333333329e-03 667 2515 -1.0416666666666662e-03 668 668 2.9166666666666660e-02 668 670 4.1666666666666666e-03 668 272 -2.0833333333333329e-03 668 253 -1.0416666666666664e-02 668 270 -2.0833333333333329e-03 668 275 -1.0416666666666664e-03 668 667 4.1666666666666649e-03 668 246 -4.1666666666666657e-03 668 3128 2.0833333333333329e-03 668 2515 9.9486666632977745e-20 669 669 2.9166666666666660e-02 669 272 -2.0833333333333329e-03 669 670 4.1666666666666649e-03 669 246 -4.1666666666666657e-03 669 658 -4.1666666666666675e-03 669 253 -1.0416666666666664e-02 669 251 -2.0833333333333329e-03 669 254 -1.0416666666666662e-03 670 670 2.9166666666666660e-02 670 668 4.1666666666666666e-03 670 275 -1.2659172094511536e-19 670 253 -4.1666666666666657e-03 670 272 -1.0416666666666664e-03 670 254 1.4465734552327348e-19 670 669 4.1666666666666649e-03 670 246 -1.0416666666666664e-02 671 671 2.9166666666666660e-02 671 675 -4.1666666666666675e-03 671 272 2.0833333333333329e-03 671 255 1.0416666666666664e-02 671 251 2.0833333333333329e-03 671 254 1.0416666666666662e-03 671 654 4.1666666666666649e-03 671 236 4.1666666666666657e-03 672 672 2.0833333333333329e-02 673 673 2.9166666666666660e-02 673 676 4.1666666666666675e-03 673 267 -1.4465734552327348e-19 673 255 -4.1666666666666657e-03 673 257 -1.0416666666666660e-03 673 260 1.4465734552327348e-19 673 674 4.1666666666666649e-03 673 236 -1.0416666666666664e-02 674 674 2.9166666666666660e-02 674 654 -4.1666666666666666e-03 674 251 -2.0833333333333329e-03 674 255 -1.0416666666666664e-02 674 257 -2.0833333333333329e-03 674 260 -1.0416666666666664e-03 674 673 4.1666666666666649e-03 674 236 -4.1666666666666657e-03 675 675 2.9166666666666660e-02 675 671 -4.1666666666666666e-03 675 254 -9.9486666632977745e-20 675 255 -4.1666666666666657e-03 675 272 -1.0416666666666664e-03 675 267 1.4465734552327348e-19 675 676 4.1666666666666649e-03 675 236 -1.0416666666666664e-02 676 676 2.9166666666666664e-02 676 272 -2.0833333333333329e-03 676 673 4.1666666666666675e-03 676 255 -1.0416666666666664e-02 676 257 -2.0833333333333329e-03 676 267 -1.0416666666666662e-03 676 675 4.1666666666666649e-03 676 236 -4.1666666666666657e-03 677 677 2.0833333333333329e-02 678 678 2.0833333333333329e-02 679 679 2.9166666666666660e-02 679 99 -1.4465734552327348e-19 679 82 4.1666666666666657e-03 679 81 1.0416666666666664e-03 679 686 4.1666666666666666e-03 679 80 1.2659172094511536e-19 679 687 -4.1666666666666649e-03 679 278 1.0416666666666664e-02 680 680 2.0833333333333329e-02 681 681 2.9166666666666660e-02 681 692 -4.1666666666666666e-03 681 84 9.9486666632977745e-20 681 83 4.1666666666666657e-03 681 81 1.0416666666666664e-03 681 80 -1.4465734552327348e-19 681 685 4.1666666666666649e-03 681 182 1.0416666666666664e-02 682 682 4.1666666666666664e-02 682 82 2.0833333333333333e-03 682 182 -2.0833333333333329e-03 682 691 2.0833333333333333e-03 682 83 2.0833333333333329e-03 682 96 6.2499999999999986e-03 682 685 2.0833333333333333e-03 682 80 -2.6745065309554533e-19 682 686 2.0833333333333333e-03 682 690 2.0833333333333333e-03 682 278 -2.0833333333333333e-03 682 197 2.0833333333333333e-03 682 283 -2.0833333333333329e-03 682 285 3.7587087034409578e-19 682 965 -2.0833333333333333e-03 682 209 2.0833333333333329e-03 682 200 6.2499999999999986e-03 682 684 2.0833333333333333e-03 682 214 -2.6745065309554533e-19 682 609 -2.0833333333333333e-03 682 608 2.0833333333333333e-03 682 184 -2.0833333333333333e-03 682 180 3.7587087034409578e-19 683 683 2.0833333333333329e-02 684 684 2.9166666666666664e-02 684 208 2.0833333333333329e-03 684 285 1.4465734552327348e-19 684 965 4.1666666666666675e-03 684 209 1.0416666666666664e-02 684 200 2.0833333333333329e-03 684 682 2.0833333333333333e-03 684 214 1.0416666666666662e-03 684 996 4.1666666666666649e-03 684 283 4.1666666666666657e-03 685 685 2.9166666666666660e-02 685 180 1.4465734552327348e-19 685 691 -4.1666666666666675e-03 685 96 2.0833333333333329e-03 685 682 2.0833333333333333e-03 685 83 1.0416666666666664e-02 685 81 2.0833333333333329e-03 685 80 1.0416666666666662e-03 685 681 4.1666666666666649e-03 685 182 4.1666666666666657e-03 686 686 2.9166666666666660e-02 686 96 2.0833333333333329e-03 686 690 -4.1666666666666649e-03 686 682 2.0833333333333329e-03 686 285 -9.9486666632977745e-20 686 278 4.1666666666666657e-03 686 679 4.1666666666666666e-03 686 82 1.0416666666666664e-02 686 81 2.0833333333333329e-03 686 80 1.0416666666666664e-03 687 687 2.9166666666666660e-02 687 81 -2.0833333333333329e-03 687 284 -1.4465734552327348e-19 687 688 4.1666666666666675e-03 687 82 -1.0416666666666664e-02 687 91 -2.0833333333333329e-03 687 895 2.0833333333333333e-03 687 99 -1.0416666666666662e-03 687 679 -4.1666666666666649e-03 687 278 -4.1666666666666657e-03 688 688 2.9166666666666660e-02 688 687 4.1666666666666675e-03 688 895 -2.0833333333333333e-03 688 99 -1.4465734552327348e-19 688 82 -4.1666666666666657e-03 688 91 -1.0416666666666664e-03 688 98 1.4465734552327348e-19 688 689 4.1666666666666649e-03 688 896 -2.0833333333333329e-03 688 278 -1.0416666666666664e-02 688 284 -1.0416666666666662e-03 688 2513 -2.0833333333333329e-03 689 689 2.9166666666666660e-02 689 285 -9.9486666632977745e-20 689 690 4.1666666666666666e-03 689 96 -2.0833333333333329e-03 689 964 2.0833333333333333e-03 689 82 -1.0416666666666664e-02 689 91 -2.0833333333333329e-03 689 98 -1.0416666666666664e-03 689 688 4.1666666666666649e-03 689 896 2.0833333333333329e-03 689 278 -4.1666666666666657e-03 689 284 1.4465734552327348e-19 689 2513 -1.0416666666666664e-03 690 690 2.9166666666666660e-02 690 689 4.1666666666666675e-03 690 964 -2.0833333333333333e-03 690 98 -1.4465734552327348e-19 690 82 -4.1666666666666657e-03 690 96 -1.0416666666666660e-03 690 80 1.2659172094511536e-19 690 686 -4.1666666666666649e-03 690 682 2.0833333333333329e-03 690 278 -1.0416666666666664e-02 690 285 -1.0416666666666662e-03 690 2513 -2.0833333333333329e-03 691 691 2.9166666666666660e-02 691 685 -4.1666666666666675e-03 691 682 2.0833333333333333e-03 691 80 -1.4465734552327348e-19 691 83 -4.1666666666666657e-03 691 96 -1.0416666666666660e-03 691 97 1.4465734552327348e-19 691 594 -4.1666666666666649e-03 691 593 2.0833333333333329e-03 691 182 -1.0416666666666664e-02 691 181 -2.0833333333333329e-03 691 180 -1.0416666666666662e-03 692 692 2.9166666666666660e-02 692 93 -2.0833333333333329e-03 692 693 4.1666666666666649e-03 692 694 -2.0833333333333329e-03 692 192 1.2659172094511536e-19 692 182 -4.1666666666666657e-03 692 681 -4.1666666666666675e-03 692 83 -1.0416666666666664e-02 692 81 -2.0833333333333329e-03 692 84 -1.0416666666666662e-03 693 693 2.9166666666666660e-02 693 181 -2.0833333333333329e-03 693 594 -4.1666666666666666e-03 693 595 2.0833333333333333e-03 693 97 -1.4465734552327348e-19 693 83 -4.1666666666666657e-03 693 93 -1.0416666666666664e-03 693 84 9.9486666632977745e-20 693 692 4.1666666666666649e-03 693 694 2.0833333333333329e-03 693 182 -1.0416666666666664e-02 693 192 -1.0416666666666664e-03 694 694 2.0833333541666665e-02 694 407 2.0833333333333329e-11 694 179 -2.0833333333333326e-11 694 927 2.0833333333333336e-11 694 417 2.0833333333333329e-11 694 423 6.2500000000000004e-11 694 697 2.0833333333333336e-11 694 418 -3.7324953730532174e-27 694 83 2.0833333333333333e-03 694 54 -2.0833333333333329e-03 694 548 2.0833333333333333e-03 694 79 2.0833333333333329e-03 694 93 6.2500000000000003e-03 694 547 -2.0833333333333333e-03 694 84 -3.7587087034409578e-19 694 692 -2.0833333333333333e-03 694 693 2.0833333333333333e-03 694 182 -2.0833333333333333e-03 694 192 4.0414059347091638e-19 694 695 2.0833333333333326e-11 694 780 2.0833333333333326e-11 694 59 -2.0833333333333329e-11 694 62 -1.3668993825846281e-19 695 695 2.9166666666666664e-10 695 423 2.0833333333333329e-11 695 760 4.1666666666666665e-11 695 407 1.0416666666666666e-10 695 403 2.0833333333333332e-11 695 418 1.0416666666666661e-11 695 780 -4.1666666666666652e-11 695 694 2.0833333333333326e-11 695 59 4.1666666666666658e-11 695 62 -1.3233141685082473e-27 696 696 2.0833333333333331e-10 697 697 2.9166666666666659e-10 697 192 1.1000665323307010e-27 697 927 -4.1666666666666665e-11 697 423 2.0833333333333332e-11 697 694 2.0833333333333336e-11 697 417 1.0416666666666666e-10 697 403 2.0833333333333329e-11 697 418 1.0416666666666661e-11 697 765 4.1666666666666652e-11 697 179 4.1666666666666658e-11 698 698 2.9166666666666664e-10 698 712 -4.1666666666666665e-11 698 300 1.1213657767716683e-27 698 296 4.1666666666666665e-11 698 294 1.0416666666666665e-11 698 295 -1.1000665323307010e-27 698 707 4.1666666666666652e-11 698 286 1.0416666666666666e-10 698 1208 2.0833333333333332e-11 698 1816 2.0833333333333336e-11 698 1819 2.0833333333333332e-11 698 3780 2.0833333333333329e-11 698 1207 1.0416666666666663e-11 699 699 2.9166666666666664e-10 699 298 -1.1000665323307010e-27 699 294 1.0416666666666665e-11 699 702 -4.1666666666666652e-11 699 1271 2.0833333333333332e-11 699 1675 4.1666666666666665e-11 699 2283 4.1666666666666665e-11 699 1817 2.0833333333333336e-11 699 1672 1.1213657767716683e-27 699 1818 2.0833333333333332e-11 699 1290 1.0416666666666666e-10 699 1282 2.0833333333333329e-11 699 1274 1.0416666666666663e-11 700 700 2.9166666666666664e-10 700 705 -4.1666666666666665e-11 700 295 1.3233141685082473e-27 700 294 1.0416666666666665e-11 700 3977 2.0833333333333332e-11 700 1819 2.0833333333333339e-11 700 1674 4.1666666666666665e-11 700 1672 -1.1000665323307010e-27 700 2284 4.1666666666666652e-11 700 1817 2.0833333333333326e-11 700 1470 1.0416666666666666e-10 700 1465 2.0833333333333329e-11 700 1472 1.0416666666666663e-11 701 701 2.9166666666666664e-10 701 1029 4.1666666666666665e-11 701 298 1.3233141685082473e-27 701 299 4.1666666666666665e-11 701 294 1.0416666666666665e-11 701 300 -1.1000665323307010e-27 701 948 4.1666666666666652e-11 701 226 1.0416666666666666e-10 701 1620 2.0833333333333332e-11 701 1818 2.0833333333333339e-11 701 1816 2.0833333333333326e-11 701 1619 2.0833333333333329e-11 701 1621 1.0416666666666663e-11 702 702 2.9166666666666664e-10 702 294 -2.0833333333333329e-11 702 292 -1.1000665323307010e-27 702 703 4.1666666666666665e-11 702 297 -2.0833333333333332e-11 702 1028 -2.0833333333333336e-11 702 298 -1.0416666666666661e-11 702 699 -4.1666666666666652e-11 702 1675 -1.0416666666666666e-10 702 1818 2.0833333333333326e-11 702 1290 -4.1666666666666665e-11 702 1282 -1.0416666666666665e-11 702 1274 1.3020149240672800e-27 703 703 2.9166666666666659e-10 703 702 4.1666666666666665e-11 703 1028 2.0833333333333336e-11 703 298 -1.1000665323307010e-27 703 297 -1.0416666666666661e-11 703 1041 -2.0833333333333326e-11 703 292 -1.0416666666666661e-11 703 1282 -2.0833333333333332e-11 703 1675 -4.1666666666666658e-11 703 1676 1.5039633158038590e-27 703 2269 -4.1666666666666652e-11 703 1290 -1.0416666666666666e-10 703 1287 -2.0833333333333329e-11 704 704 2.9166666666666664e-10 704 293 -1.1213657767716683e-27 704 706 4.1666666666666665e-11 704 302 -2.0833333333333332e-11 704 1015 -2.0833333333333336e-11 704 308 -1.0416666666666663e-11 704 1674 -1.0416666666666666e-10 704 1673 -2.0833333333333329e-11 704 2282 -4.1666666666666652e-11 704 1940 2.0833333333333332e-11 704 1470 -4.1666666666666665e-11 704 1463 -1.0416666666666665e-11 704 1464 1.1000665323307010e-27 705 705 2.9166666666666664e-10 705 302 -2.0833333333333329e-11 705 706 4.1666666666666652e-11 705 708 -2.0833333333333326e-11 705 293 1.1213657767716683e-27 705 700 -4.1666666666666665e-11 705 294 -2.0833333333333332e-11 705 295 -1.0416666666666663e-11 705 1470 -4.1666666666666658e-11 705 3977 -1.0416666666666665e-11 705 1472 -1.5039633158038590e-27 705 1674 -1.0416666666666666e-10 705 1819 2.0833333333333336e-11 706 706 2.9166666666666659e-10 706 704 4.1666666666666665e-11 706 1015 2.0833333333333336e-11 706 308 -1.3020149240672800e-27 706 302 -1.0416666666666661e-11 706 295 1.3233141685082473e-27 706 705 4.1666666666666652e-11 706 708 2.0833333333333326e-11 706 293 -1.0416666666666661e-11 706 1463 -2.0833333333333332e-11 706 1674 -4.1666666666666658e-11 706 1470 -1.0416666666666666e-10 706 3977 -2.0833333333333329e-11 707 707 2.9166666666666659e-10 707 289 1.1000665323307010e-27 707 709 -4.1666666666666665e-11 707 302 2.0833333333333332e-11 707 708 2.0833333333333336e-11 707 296 1.0416666666666666e-10 707 294 2.0833333333333329e-11 707 295 1.0416666666666661e-11 707 698 4.1666666666666652e-11 707 286 4.1666666666666665e-11 707 1819 -2.0833333333333326e-11 707 3780 1.0416666666666665e-11 707 1207 -1.3020149240672800e-27 708 708 2.0833333541666669e-02 708 286 -2.0833333333333329e-11 708 709 2.0833333333333336e-11 708 296 2.0833333333333326e-11 708 302 6.2499999999999991e-11 708 707 2.0833333333333336e-11 708 295 -2.1169082391605852e-27 708 705 -2.0833333333333326e-11 708 706 2.0833333333333326e-11 708 293 1.0416666666666664e-03 708 1011 8.3333333333333315e-03 708 289 1.0416666666666671e-03 708 288 -2.0833333333333329e-03 708 1674 2.0833333333333329e-11 708 1470 -2.0833333333333329e-11 708 3977 -4.1666666979166657e-03 708 3971 -2.0833333333333333e-03 708 4886 -2.0833333333333337e-03 708 3780 -4.1666666979166666e-03 709 709 2.9166666666666659e-10 709 707 -4.1666666666666665e-11 709 708 2.0833333333333336e-11 709 295 -1.1000665323307010e-27 709 296 -4.1666666666666658e-11 709 302 -1.0416666666666661e-11 709 305 1.5039633158038590e-27 709 710 4.1666666666666652e-11 709 978 2.0833333333333326e-11 709 286 -1.0416666666666666e-10 709 289 -1.0416666666666661e-11 709 3780 -2.0833333333333332e-11 709 2413 -2.0833333333333329e-11 710 710 2.9166666666666664e-10 710 287 -1.3233141685082473e-27 710 711 4.1666666666666665e-11 710 310 -2.0833333333333332e-11 710 970 2.0833333333333339e-11 710 296 -1.0416666666666666e-10 710 302 -2.0833333333333329e-11 710 305 -1.0416666666666663e-11 710 709 4.1666666666666652e-11 710 978 -2.0833333333333326e-11 710 286 -4.1666666666666665e-11 710 289 1.1000665323307010e-27 710 2413 -1.0416666666666665e-11 711 711 2.9166666666666664e-10 711 710 4.1666666666666665e-11 711 970 -2.0833333333333336e-11 711 305 -1.5039633158038590e-27 711 296 -4.1666666666666658e-11 711 310 -1.0416666666666665e-11 711 300 1.1213657767716683e-27 711 712 4.1666666666666652e-11 711 946 2.0833333333333326e-11 711 286 -1.0416666666666666e-10 711 287 -1.0416666666666663e-11 711 2413 -2.0833333333333332e-11 711 1208 -2.0833333333333329e-11 712 712 2.9166666666666664e-10 712 310 -2.0833333333333329e-11 712 698 -4.1666666666666665e-11 712 296 -1.0416666666666666e-10 712 294 -2.0833333333333332e-11 712 300 -1.0416666666666661e-11 712 711 4.1666666666666652e-11 712 946 -2.0833333333333326e-11 712 286 -4.1666666666666658e-11 712 287 1.3233141685082473e-27 712 1207 -1.3020149240672800e-27 712 1816 2.0833333333333336e-11 712 1208 -1.0416666666666661e-11 713 713 4.1666666666666664e-02 713 483 2.0833333333333333e-03 713 977 2.0833333333333333e-03 713 484 6.2499999999999995e-03 713 721 2.0833333333333333e-03 713 481 -4.1202858928001372e-19 713 722 2.0833333333333333e-03 713 976 2.0833333333333333e-03 713 162 -2.0833333333333333e-03 713 205 2.0833333333333333e-03 713 159 -2.0833333333333329e-03 713 158 -6.2500000000000003e-03 713 170 2.6745065309554533e-19 713 607 2.0833333333333333e-03 713 196 2.0833333333333329e-03 713 203 6.2499999999999995e-03 713 604 -2.0833333333333333e-03 713 204 -4.1202858928001372e-19 713 714 2.0833333333333333e-03 713 980 -2.0833333333333333e-03 713 316 -2.0833333333333333e-03 713 315 -6.2500000000000003e-03 713 314 2.6745065309554533e-19 713 2671 -2.0833333333333329e-03 713 2479 2.0833333333333329e-03 714 714 2.9166666666666660e-02 714 320 1.4465734552327348e-19 714 591 4.1666666666666675e-03 714 195 2.0833333333333329e-03 714 585 -2.0833333333333333e-03 714 205 1.0416666666666664e-02 714 203 2.0833333333333329e-03 714 204 1.0416666666666662e-03 714 980 4.1666666666666649e-03 714 713 2.0833333333333329e-03 714 316 4.1666666666666657e-03 714 315 1.0416666666666660e-03 714 314 -1.4465734552327348e-19 715 715 4.1666666666666662e-10 715 325 2.0833333333333329e-11 715 318 -2.0833333333333326e-11 715 726 2.0833333333333336e-11 715 326 2.0833333333333329e-11 715 345 6.2499999999999991e-11 715 719 2.0833333333333336e-11 715 323 -3.5628902784306998e-27 715 720 2.0833333333333326e-11 715 723 2.0833333333333326e-11 715 165 -2.0833333333333329e-11 715 304 2.0833333333333329e-11 715 164 -2.0833333333333326e-11 715 158 -6.2499999999999991e-11 715 174 2.1169082391605852e-27 715 1066 -2.0833333333333336e-11 715 311 2.0833333333333329e-11 715 306 6.2499999999999991e-11 715 718 2.0833333333333336e-11 715 313 -3.5628902784306998e-27 715 716 2.0833333333333326e-11 715 1063 2.0833333333333326e-11 715 319 -2.0833333333333329e-11 715 315 -6.2499999999999991e-11 715 317 2.1169082391605852e-27 716 716 2.9166666666666659e-10 716 321 1.1000665323307010e-27 716 975 4.1666666666666665e-11 716 310 2.0833333333333332e-11 716 717 2.0833333333333336e-11 716 304 1.0416666666666666e-10 716 306 2.0833333333333329e-11 716 313 1.0416666666666661e-11 716 1063 -4.1666666666666652e-11 716 715 2.0833333333333326e-11 716 319 4.1666666666666658e-11 716 315 1.0416666666666661e-11 716 317 -1.5039633158038590e-27 717 717 2.0833333541666665e-02 717 311 2.0833333333333329e-11 717 319 -2.0833333333333326e-11 717 975 -2.0833333333333336e-11 717 304 2.0833333333333329e-11 717 310 6.2500000000000004e-11 717 716 2.0833333333333336e-11 717 313 -3.7324953730532174e-27 717 162 -2.0833333333333329e-03 717 971 -2.0833333333333333e-03 717 483 2.0833333333333329e-03 717 482 6.2500000000000003e-03 717 722 2.0833333333333333e-03 717 481 -3.7587087034409578e-19 717 721 2.0833333333333333e-03 717 973 -2.0833333333333333e-03 717 315 -3.1250000312499997e-03 717 321 4.0414059347091638e-19 717 718 2.0833333333333326e-11 717 972 -2.0833333333333326e-11 717 164 -2.0833333333333329e-11 717 158 -3.1250000312499993e-03 717 160 -1.3668993825846281e-19 717 2479 2.0833333333333333e-03 717 2671 -2.0833333333333333e-03 718 718 2.9166666666666664e-10 718 310 2.0833333333333329e-11 718 174 1.3020149240672800e-27 718 1066 4.1666666666666665e-11 718 311 1.0416666666666666e-10 718 306 2.0833333333333332e-11 718 715 2.0833333333333336e-11 718 313 1.0416666666666661e-11 718 972 4.1666666666666652e-11 718 717 2.0833333333333326e-11 718 164 4.1666666666666658e-11 718 158 1.0416666666666661e-11 718 160 -1.3233141685082473e-27 719 719 2.9166666666666659e-10 719 317 1.3020149240672800e-27 719 726 -4.1666666666666665e-11 719 345 2.0833333333333332e-11 719 715 2.0833333333333336e-11 719 326 1.0416666666666666e-10 719 324 2.0833333333333329e-11 719 323 1.0416666666666661e-11 719 590 4.1666666666666652e-11 719 585 -2.0833333333333326e-11 719 318 4.1666666666666658e-11 719 315 1.0416666666666661e-11 719 320 -1.3233141685082473e-27 720 720 2.9166666666666664e-10 720 345 2.0833333333333329e-11 720 723 -4.1666666666666652e-11 720 715 2.0833333333333326e-11 720 174 -1.5039633158038590e-27 720 165 4.1666666666666658e-11 720 158 1.0416666666666661e-11 720 157 1.1000665323307010e-27 720 588 4.1666666666666665e-11 720 325 1.0416666666666666e-10 720 324 2.0833333333333332e-11 720 585 -2.0833333333333336e-11 720 323 1.0416666666666661e-11 721 721 2.9166666666666660e-02 721 314 1.4465734552327348e-19 721 977 -4.1666666666666675e-03 721 484 2.0833333333333329e-03 721 713 2.0833333333333333e-03 721 482 2.0833333333333329e-03 721 481 1.0416666666666662e-03 721 973 4.1666666666666649e-03 721 717 2.0833333333333329e-03 721 315 1.0416666666666660e-03 721 321 -1.2659172094511536e-19 721 2479 1.0416666666666664e-02 721 2671 4.1666666666666657e-03 722 722 2.9166666666666660e-02 722 484 2.0833333333333329e-03 722 976 -4.1666666666666649e-03 722 713 2.0833333333333329e-03 722 170 -1.4465734552327348e-19 722 162 4.1666666666666657e-03 722 158 1.0416666666666660e-03 722 160 1.4465734552327348e-19 722 971 4.1666666666666675e-03 722 483 1.0416666666666664e-02 722 482 2.0833333333333329e-03 722 717 2.0833333333333333e-03 722 481 1.0416666666666662e-03 723 723 2.9166666666666664e-10 723 173 -2.0833333333333332e-11 723 724 4.1666666666666665e-11 723 1065 -2.0833333333333339e-11 723 347 -1.3233141685082473e-27 723 325 -4.1666666666666665e-11 723 345 -1.0416666666666665e-11 723 323 1.1000665323307010e-27 723 720 -4.1666666666666652e-11 723 715 2.0833333333333326e-11 723 165 -1.0416666666666666e-10 723 158 -2.0833333333333329e-11 723 174 -1.0416666666666663e-11 724 724 2.9166666666666664e-10 724 339 -2.0833333333333329e-11 724 725 4.1666666666666652e-11 724 918 2.0833333333333326e-11 724 175 1.1213657767716683e-27 724 165 -4.1666666666666658e-11 724 173 -1.0416666666666665e-11 724 174 -1.5039633158038590e-27 724 723 4.1666666666666665e-11 724 325 -1.0416666666666666e-10 724 345 -2.0833333333333332e-11 724 1065 2.0833333333333336e-11 724 347 -1.0416666666666663e-11 725 725 2.9166666666666659e-10 725 155 -2.0833333333333332e-11 725 599 -4.1666666666666665e-11 725 597 2.0833333333333336e-11 725 348 -1.3020149240672800e-27 725 325 -4.1666666666666658e-11 725 339 -1.0416666666666661e-11 725 347 1.3233141685082473e-27 725 724 4.1666666666666652e-11 725 918 -2.0833333333333326e-11 725 165 -1.0416666666666666e-10 725 173 -2.0833333333333329e-11 725 175 -1.0416666666666661e-11 726 726 2.9166666666666664e-10 726 315 -2.0833333333333332e-11 726 719 -4.1666666666666665e-11 726 715 2.0833333333333336e-11 726 323 -1.1213657767716683e-27 726 326 -4.1666666666666665e-11 726 345 -1.0416666666666665e-11 726 346 1.1000665323307010e-27 726 727 4.1666666666666652e-11 726 1020 2.0833333333333332e-11 726 318 -1.0416666666666666e-10 726 317 -1.0416666666666663e-11 726 2668 -2.0833333333333329e-11 727 727 2.9166666666666659e-10 727 729 4.1666666666666665e-11 727 330 -2.0833333333333332e-11 727 326 -1.0416666666666666e-10 727 345 -2.0833333333333329e-11 727 346 -1.0416666666666661e-11 727 726 4.1666666666666652e-11 727 1020 -2.0833333333333326e-11 727 318 -4.1666666666666665e-11 727 317 1.3020149240672800e-27 727 2669 -1.1000665323307010e-27 727 3385 2.0833333333333336e-11 727 2668 -1.0416666666666665e-11 728 728 2.9166666666666664e-10 728 330 -2.0833333333333329e-11 728 729 4.1666666666666652e-11 728 318 -4.1666666666666665e-11 728 320 -1.3233141685082473e-27 728 590 -4.1666666666666665e-11 728 326 -1.0416666666666666e-10 728 324 -2.0833333333333332e-11 728 583 2.0833333333333339e-11 728 327 -1.0416666666666663e-11 728 3387 2.0833333333333326e-11 728 2669 1.1000665323307010e-27 728 2670 -1.0416666666666665e-11 729 729 2.9166666666666659e-10 729 727 4.1666666666666665e-11 729 346 -1.1000665323307010e-27 729 326 -4.1666666666666658e-11 729 330 -1.0416666666666661e-11 729 327 1.5039633158038590e-27 729 728 4.1666666666666652e-11 729 318 -1.0416666666666666e-10 729 2668 -2.0833333333333332e-11 729 3385 -2.0833333333333336e-11 729 3387 -2.0833333333333326e-11 729 2670 -2.0833333333333329e-11 729 2669 -1.0416666666666661e-11 730 730 2.9166666666666664e-10 730 732 -4.1666666666666665e-11 730 330 2.0833333333333332e-11 730 328 1.0416666666666666e-10 730 324 2.0833333333333329e-11 730 327 1.0416666666666663e-11 730 584 4.1666666666666652e-11 730 583 -2.0833333333333332e-11 730 148 4.1666666666666665e-11 730 145 -1.1000665323307010e-27 730 1645 1.1213657767716683e-27 730 3387 -2.0833333333333336e-11 730 2810 1.0416666666666665e-11 731 731 2.9166666666666660e-02 731 985 -4.1666666666666666e-03 731 216 2.0833333333333329e-03 731 205 1.0416666666666664e-02 731 195 2.0833333333333329e-03 731 206 1.0416666666666664e-03 731 591 4.1666666666666649e-03 731 583 -2.0833333333333329e-03 731 316 4.1666666666666657e-03 731 320 -1.4465734552327348e-19 731 2673 9.9486666632977745e-20 731 3390 -2.0833333333333333e-03 731 2670 1.0416666666666664e-03 732 732 2.9166666666666659e-10 732 730 -4.1666666666666665e-11 732 327 -1.3020149240672800e-27 732 328 -4.1666666666666658e-11 732 330 -1.0416666666666661e-11 732 333 1.3233141685082473e-27 732 733 4.1666666666666652e-11 732 148 -1.0416666666666666e-10 732 2810 -2.0833333333333332e-11 732 3387 -2.0833333333333336e-11 732 2165 -2.0833333333333326e-11 732 1645 -1.0416666666666661e-11 733 733 2.9166666666666664e-10 733 734 4.1666666666666665e-11 733 335 -2.0833333333333332e-11 733 328 -1.0416666666666666e-10 733 330 -2.0833333333333329e-11 733 333 -1.0416666666666663e-11 733 732 4.1666666666666652e-11 733 148 -4.1666666666666658e-11 733 2165 2.0833333333333326e-11 733 1645 1.1213657767716683e-27 734 734 2.9166666666666664e-10 734 733 4.1666666666666665e-11 734 333 -1.3233141685082473e-27 734 328 -4.1666666666666665e-11 734 335 -1.0416666666666665e-11 734 338 1.1000665323307010e-27 734 614 -4.1666666666666652e-11 734 148 -1.0416666666666666e-10 735 735 4.1666666666666664e-02 735 94 2.0833333333333333e-03 735 351 -2.0833333333333329e-03 735 839 -2.0833333333333333e-03 735 89 2.0833333333333329e-03 735 86 6.2499999999999995e-03 735 743 2.0833333333333333e-03 735 92 -4.1202858928001372e-19 735 744 2.0833333333333333e-03 735 844 -2.0833333333333333e-03 735 156 -2.0833333333333333e-03 735 133 2.0833333333333333e-03 735 153 -2.0833333333333329e-03 735 152 -6.2500000000000003e-03 735 167 2.6745065309554533e-19 735 644 2.0833333333333333e-03 735 127 2.0833333333333329e-03 735 135 6.2499999999999995e-03 735 643 -2.0833333333333333e-03 735 144 -4.1202858928001372e-19 735 736 2.0833333333333333e-03 735 838 2.0833333333333333e-03 735 353 -2.0833333333333333e-03 735 352 -6.2500000000000003e-03 735 349 2.6745065309554533e-19 736 736 2.9166666666666660e-02 736 358 1.4465734552327348e-19 736 630 4.1666666666666675e-03 736 126 2.0833333333333329e-03 736 624 -2.0833333333333333e-03 736 133 1.0416666666666664e-02 736 135 2.0833333333333329e-03 736 144 1.0416666666666662e-03 736 838 -4.1666666666666649e-03 736 735 2.0833333333333329e-03 736 353 4.1666666666666657e-03 736 352 1.0416666666666660e-03 736 349 -1.4465734552327348e-19 737 737 4.1666666666666662e-10 737 368 2.0833333333333329e-11 737 357 -2.0833333333333326e-11 737 748 2.0833333333333336e-11 737 369 2.0833333333333329e-11 737 386 6.2499999999999991e-11 737 741 2.0833333333333336e-11 737 366 -3.5628902784306998e-27 737 742 2.0833333333333326e-11 737 747 2.0833333333333326e-11 737 163 -2.0833333333333329e-11 737 411 2.0833333333333329e-11 737 166 -2.0833333333333326e-11 737 152 -6.2499999999999991e-11 737 176 2.1169082391605852e-27 737 1070 2.0833333333333336e-11 737 424 2.0833333333333329e-11 737 426 6.2499999999999991e-11 737 740 2.0833333333333336e-11 737 427 -3.5628902784306998e-27 737 738 2.0833333333333326e-11 737 808 2.0833333333333326e-11 737 355 -2.0833333333333329e-11 737 352 -6.2499999999999991e-11 737 354 2.1169082391605852e-27 738 738 2.9166666666666659e-10 738 364 1.1000665323307010e-27 738 810 -4.1666666666666665e-11 738 423 2.0833333333333332e-11 738 739 2.0833333333333336e-11 738 411 1.0416666666666666e-10 738 426 2.0833333333333329e-11 738 427 1.0416666666666661e-11 738 808 -4.1666666666666652e-11 738 737 2.0833333333333326e-11 738 355 4.1666666666666658e-11 738 352 1.0416666666666661e-11 738 354 -1.5039633158038590e-27 739 739 2.0833333541666665e-02 739 424 2.0833333333333329e-11 739 355 -2.0833333333333326e-11 739 810 2.0833333333333336e-11 739 411 2.0833333333333329e-11 739 423 6.2500000000000004e-11 739 738 2.0833333333333336e-11 739 427 -3.7324953730532174e-27 739 89 2.0833333333333333e-03 739 156 -2.0833333333333329e-03 739 955 -2.0833333333333333e-03 739 94 2.0833333333333329e-03 739 93 6.2500000000000003e-03 739 744 2.0833333333333333e-03 739 92 -3.7587087034409578e-19 739 743 2.0833333333333333e-03 739 857 2.0833333333333333e-03 739 351 -2.0833333333333333e-03 739 352 -3.1250000312499997e-03 739 364 4.0414059347091638e-19 739 740 2.0833333333333326e-11 739 956 -2.0833333333333326e-11 739 166 -2.0833333333333329e-11 739 152 -3.1250000312499993e-03 739 154 -1.3668993825846281e-19 740 740 2.9166666666666664e-10 740 423 2.0833333333333329e-11 740 176 1.3020149240672800e-27 740 1070 -4.1666666666666665e-11 740 424 1.0416666666666666e-10 740 426 2.0833333333333332e-11 740 737 2.0833333333333336e-11 740 427 1.0416666666666661e-11 740 956 4.1666666666666652e-11 740 739 2.0833333333333326e-11 740 166 4.1666666666666658e-11 740 152 1.0416666666666661e-11 740 154 -1.3233141685082473e-27 741 741 2.9166666666666659e-10 741 354 1.3020149240672800e-27 741 748 -4.1666666666666665e-11 741 386 2.0833333333333332e-11 741 737 2.0833333333333336e-11 741 369 1.0416666666666666e-10 741 367 2.0833333333333329e-11 741 366 1.0416666666666661e-11 741 629 4.1666666666666652e-11 741 624 -2.0833333333333326e-11 741 357 4.1666666666666658e-11 741 352 1.0416666666666661e-11 741 358 -1.3233141685082473e-27 742 742 2.9166666666666664e-10 742 386 2.0833333333333329e-11 742 747 -4.1666666666666652e-11 742 737 2.0833333333333326e-11 742 176 -1.5039633158038590e-27 742 163 4.1666666666666658e-11 742 152 1.0416666666666661e-11 742 151 1.1000665323307010e-27 742 627 4.1666666666666665e-11 742 368 1.0416666666666666e-10 742 367 2.0833333333333332e-11 742 624 -2.0833333333333336e-11 742 366 1.0416666666666661e-11 743 743 2.9166666666666660e-02 743 349 1.4465734552327348e-19 743 839 4.1666666666666675e-03 743 86 2.0833333333333329e-03 743 735 2.0833333333333333e-03 743 89 1.0416666666666664e-02 743 93 2.0833333333333329e-03 743 92 1.0416666666666662e-03 743 857 -4.1666666666666649e-03 743 739 2.0833333333333329e-03 743 351 4.1666666666666657e-03 743 352 1.0416666666666660e-03 743 364 -1.2659172094511536e-19 744 744 2.9166666666666660e-02 744 86 2.0833333333333329e-03 744 844 4.1666666666666649e-03 744 735 2.0833333333333329e-03 744 167 -1.4465734552327348e-19 744 156 4.1666666666666657e-03 744 152 1.0416666666666660e-03 744 154 1.4465734552327348e-19 744 955 4.1666666666666675e-03 744 94 1.0416666666666664e-02 744 93 2.0833333333333329e-03 744 739 2.0833333333333333e-03 744 92 1.0416666666666662e-03 745 745 2.9166666666666659e-10 745 161 -2.0833333333333332e-11 745 638 -4.1666666666666665e-11 745 636 2.0833333333333336e-11 745 385 -1.3020149240672800e-27 745 368 -4.1666666666666658e-11 745 377 -1.0416666666666661e-11 745 384 1.3233141685082473e-27 745 746 4.1666666666666652e-11 745 1043 -2.0833333333333326e-11 745 163 -1.0416666666666666e-10 745 173 -2.0833333333333329e-11 745 172 -1.0416666666666661e-11 746 746 2.9166666666666664e-10 746 176 -1.5039633158038590e-27 746 747 4.1666666666666665e-11 746 386 -2.0833333333333332e-11 746 1068 -2.0833333333333336e-11 746 368 -1.0416666666666666e-10 746 377 -2.0833333333333329e-11 746 384 -1.0416666666666663e-11 746 745 4.1666666666666652e-11 746 1043 2.0833333333333326e-11 746 163 -4.1666666666666658e-11 746 173 -1.0416666666666665e-11 746 172 1.1213657767716683e-27 747 747 2.9166666666666664e-10 747 173 -2.0833333333333332e-11 747 746 4.1666666666666665e-11 747 1068 2.0833333333333339e-11 747 384 -1.3233141685082473e-27 747 368 -4.1666666666666665e-11 747 386 -1.0416666666666665e-11 747 366 1.1000665323307010e-27 747 742 -4.1666666666666652e-11 747 737 2.0833333333333326e-11 747 163 -1.0416666666666666e-10 747 152 -2.0833333333333329e-11 747 176 -1.0416666666666663e-11 748 748 2.9166666666666664e-10 748 391 1.1000665323307010e-27 748 352 -2.0833333333333332e-11 748 369 -4.1666666666666665e-11 748 386 -1.0416666666666665e-11 748 741 -4.1666666666666665e-11 748 737 2.0833333333333336e-11 748 366 -1.1213657767716683e-27 748 749 4.1666666666666652e-11 748 799 2.0833333333333332e-11 748 357 -1.0416666666666666e-10 748 354 -1.0416666666666663e-11 749 749 2.9166666666666659e-10 749 751 4.1666666666666665e-11 749 388 -2.0833333333333332e-11 749 369 -1.0416666666666666e-10 749 386 -2.0833333333333329e-11 749 391 -1.0416666666666661e-11 749 748 4.1666666666666652e-11 749 799 -2.0833333333333326e-11 749 357 -4.1666666666666665e-11 749 354 1.3020149240672800e-27 750 750 2.9166666666666664e-10 750 388 -2.0833333333333329e-11 750 751 4.1666666666666652e-11 750 357 -4.1666666666666665e-11 750 358 -1.3233141685082473e-27 750 629 -4.1666666666666665e-11 750 369 -1.0416666666666666e-10 750 367 -2.0833333333333332e-11 750 622 2.0833333333333339e-11 750 370 -1.0416666666666663e-11 751 751 2.9166666666666659e-10 751 749 4.1666666666666665e-11 751 391 -1.1000665323307010e-27 751 369 -4.1666666666666658e-11 751 388 -1.0416666666666661e-11 751 370 1.5039633158038590e-27 751 750 4.1666666666666652e-11 751 357 -1.0416666666666666e-10 752 752 2.9166666666666664e-10 752 757 -4.1666666666666665e-11 752 388 2.0833333333333332e-11 752 371 1.0416666666666666e-10 752 367 2.0833333333333329e-11 752 370 1.0416666666666663e-11 752 623 4.1666666666666652e-11 752 622 -2.0833333333333332e-11 752 105 4.1666666666666665e-11 752 103 -1.1000665323307010e-27 753 753 2.0833333333333329e-02 754 754 2.9166666666666664e-02 754 126 2.0833333333333329e-03 754 630 4.1666666666666649e-03 754 622 -2.0833333333333329e-03 754 358 -1.4465734552327348e-19 754 353 4.1666666666666657e-03 754 830 4.1666666666666666e-03 754 133 1.0416666666666664e-02 754 131 2.0833333333333329e-03 754 134 1.0416666666666664e-03 755 755 2.0833333333333331e-10 756 756 2.9166666666666664e-10 756 758 4.1666666666666665e-11 756 383 -1.3233141685082473e-27 756 371 -4.1666666666666665e-11 756 373 -1.0416666666666665e-11 756 376 1.1000665323307010e-27 756 651 -4.1666666666666652e-11 756 650 2.0833333333333326e-11 756 105 -1.0416666666666666e-10 756 2196 -2.0833333333333339e-11 756 1143 -2.0833333333333329e-11 756 1144 -1.0416666666666663e-11 757 757 2.9166666666666659e-10 757 752 -4.1666666666666665e-11 757 370 -1.3020149240672800e-27 757 371 -4.1666666666666658e-11 757 388 -1.0416666666666661e-11 757 383 1.3233141685082473e-27 757 758 4.1666666666666652e-11 757 105 -1.0416666666666666e-10 758 758 2.9166666666666664e-10 758 388 -2.0833333333333329e-11 758 756 4.1666666666666665e-11 758 371 -1.0416666666666666e-10 758 373 -2.0833333333333332e-11 758 383 -1.0416666666666663e-11 758 757 4.1666666666666652e-11 758 105 -4.1666666666666658e-11 758 1144 -1.5039633158038590e-27 758 2196 2.0833333333333336e-11 759 759 2.0833333333333331e-10 760 760 2.9166666666666664e-10 760 695 4.1666666666666665e-11 760 418 1.1213657767716683e-27 760 407 4.1666666666666665e-11 760 403 1.0416666666666665e-11 760 406 -1.1000665323307010e-27 760 776 4.1666666666666652e-11 760 59 1.0416666666666666e-10 761 761 2.0833333333333331e-10 762 762 2.9166666666666664e-10 762 416 -1.1000665323307010e-27 762 404 4.1666666666666665e-11 762 403 1.0416666666666665e-11 762 767 4.1666666666666665e-11 762 402 1.1213657767716683e-27 762 768 -4.1666666666666652e-11 762 394 1.0416666666666666e-10 763 763 2.0833333333333331e-10 764 764 2.9166666666666664e-10 764 774 -4.1666666666666665e-11 764 406 1.3233141685082473e-27 764 405 4.1666666666666665e-11 764 403 1.0416666666666665e-11 764 402 -1.1000665323307010e-27 764 766 4.1666666666666652e-11 764 398 1.0416666666666666e-10 765 765 2.9166666666666664e-10 765 907 4.1666666666666665e-11 765 416 1.3233141685082473e-27 765 417 4.1666666666666665e-11 765 403 1.0416666666666665e-11 765 418 -1.1000665323307010e-27 765 697 4.1666666666666652e-11 765 179 1.0416666666666666e-10 766 766 2.9166666666666659e-10 766 772 -4.1666666666666665e-11 766 420 2.0833333333333332e-11 766 405 1.0416666666666666e-10 766 403 2.0833333333333329e-11 766 402 1.0416666666666661e-11 766 764 4.1666666666666652e-11 766 398 4.1666666666666658e-11 766 1665 1.1000665323307010e-27 766 2261 -2.0833333333333336e-11 767 767 2.9166666666666664e-10 767 420 2.0833333333333329e-11 767 771 -4.1666666666666652e-11 767 394 4.1666666666666658e-11 767 762 4.1666666666666665e-11 767 404 1.0416666666666666e-10 767 403 2.0833333333333332e-11 767 402 1.0416666666666661e-11 767 2261 -2.0833333333333326e-11 767 1099 -1.3233141685082473e-27 768 768 2.9166666666666664e-10 768 403 -2.0833333333333329e-11 768 397 -1.1000665323307010e-27 768 769 4.1666666666666665e-11 768 404 -1.0416666666666666e-10 768 414 -2.0833333333333332e-11 768 906 -2.0833333333333336e-11 768 416 -1.0416666666666661e-11 768 762 -4.1666666666666652e-11 768 394 -4.1666666666666665e-11 769 769 2.9166666666666659e-10 769 768 4.1666666666666665e-11 769 906 2.0833333333333336e-11 769 416 -1.1000665323307010e-27 769 404 -4.1666666666666658e-11 769 414 -1.0416666666666661e-11 769 413 1.5039633158038590e-27 769 770 4.1666666666666652e-11 769 916 -2.0833333333333326e-11 769 394 -1.0416666666666666e-10 769 397 -1.0416666666666661e-11 769 1097 -2.0833333333333329e-11 770 770 2.9166666666666664e-10 770 771 4.1666666666666665e-11 770 420 -2.0833333333333332e-11 770 404 -1.0416666666666666e-10 770 414 -2.0833333333333329e-11 770 413 -1.0416666666666663e-11 770 769 4.1666666666666652e-11 770 916 2.0833333333333326e-11 770 394 -4.1666666666666665e-11 770 397 1.1000665323307010e-27 770 1099 -1.3233141685082473e-27 770 2053 2.0833333333333339e-11 770 1097 -1.0416666666666665e-11 771 771 2.9166666666666664e-10 771 770 4.1666666666666665e-11 771 413 -1.5039633158038590e-27 771 404 -4.1666666666666658e-11 771 420 -1.0416666666666665e-11 771 402 1.1213657767716683e-27 771 767 -4.1666666666666652e-11 771 394 -1.0416666666666666e-10 771 1097 -2.0833333333333332e-11 771 2053 -2.0833333333333336e-11 771 2261 -2.0833333333333326e-11 771 1099 -1.0416666666666663e-11 772 772 2.9166666666666659e-10 772 766 -4.1666666666666665e-11 772 402 -1.1000665323307010e-27 772 405 -4.1666666666666665e-11 772 420 -1.0416666666666665e-11 772 421 1.3020149240672800e-27 772 773 4.1666666666666652e-11 772 398 -1.0416666666666666e-10 772 2261 -2.0833333333333336e-11 772 2252 -2.0833333333333326e-11 772 1665 -1.0416666666666661e-11 773 773 2.9166666666666664e-10 773 775 4.1666666666666665e-11 773 409 -2.0833333333333332e-11 773 405 -1.0416666666666666e-10 773 420 -2.0833333333333329e-11 773 421 -1.0416666666666663e-11 773 772 4.1666666666666652e-11 773 398 -4.1666666666666665e-11 773 2252 2.0833333333333332e-11 773 1665 1.1000665323307010e-27 774 774 2.9166666666666664e-10 774 409 -2.0833333333333329e-11 774 775 4.1666666666666652e-11 774 398 -4.1666666666666658e-11 774 764 -4.1666666666666665e-11 774 405 -1.0416666666666666e-10 774 403 -2.0833333333333332e-11 774 406 -1.0416666666666663e-11 775 775 2.9166666666666659e-10 775 773 4.1666666666666665e-11 775 421 -1.3020149240672800e-27 775 405 -4.1666666666666658e-11 775 409 -1.0416666666666661e-11 775 406 1.3233141685082473e-27 775 774 4.1666666666666652e-11 775 398 -1.0416666666666666e-10 776 776 2.9166666666666659e-10 776 778 -4.1666666666666665e-11 776 409 2.0833333333333332e-11 776 407 1.0416666666666666e-10 776 403 2.0833333333333329e-11 776 406 1.0416666666666661e-11 776 760 4.1666666666666652e-11 776 59 4.1666666666666665e-11 777 777 2.0833333333333331e-10 778 778 2.9166666666666659e-10 778 776 -4.1666666666666665e-11 778 406 -1.1000665323307010e-27 778 407 -4.1666666666666658e-11 778 409 -1.0416666666666661e-11 778 412 1.5039633158038590e-27 778 779 4.1666666666666652e-11 778 59 -1.0416666666666666e-10 779 779 2.9166666666666664e-10 779 62 -1.3233141685082473e-27 779 780 4.1666666666666665e-11 779 423 -2.0833333333333332e-11 779 811 -2.0833333333333339e-11 779 407 -1.0416666666666666e-10 779 409 -2.0833333333333329e-11 779 412 -1.0416666666666663e-11 779 778 4.1666666666666652e-11 779 59 -4.1666666666666665e-11 780 780 2.9166666666666664e-10 780 779 4.1666666666666665e-11 780 811 2.0833333333333336e-11 780 412 -1.5039633158038590e-27 780 407 -4.1666666666666658e-11 780 423 -1.0416666666666665e-11 780 418 1.1213657767716683e-27 780 695 -4.1666666666666652e-11 780 694 2.0833333333333326e-11 780 59 -1.0416666666666666e-10 780 62 -1.0416666666666663e-11 781 781 2.9166666666666659e-10 781 346 -1.3233141685082473e-27 781 331 4.1666666666666658e-11 781 330 1.0416666666666661e-11 781 784 4.1666666666666665e-11 781 329 1.3020149240672800e-27 781 785 -4.1666666666666652e-11 781 428 1.0416666666666666e-10 781 1447 2.0833333333333332e-11 781 2159 2.0833333333333336e-11 781 3385 2.0833333333333326e-11 781 2834 2.0833333333333329e-11 781 1446 1.0416666666666661e-11 782 782 2.9166666666666659e-10 782 791 -4.1666666666666665e-11 782 333 1.1000665323307010e-27 782 332 4.1666666666666658e-11 782 330 1.0416666666666661e-11 782 329 -1.5039633158038590e-27 782 783 4.1666666666666652e-11 782 433 1.0416666666666666e-10 782 2165 2.0833333333333336e-11 782 2159 2.0833333333333326e-11 782 1101 2.0833333333333329e-11 782 1112 1.0416666666666661e-11 783 783 2.9166666666666664e-10 783 789 -4.1666666666666665e-11 783 342 2.0833333333333332e-11 783 332 1.0416666666666666e-10 783 330 2.0833333333333329e-11 783 329 1.0416666666666663e-11 783 782 4.1666666666666652e-11 783 433 4.1666666666666665e-11 783 1100 1.3233141685082473e-27 783 2046 -2.0833333333333339e-11 783 2159 -2.0833333333333326e-11 783 1101 1.0416666666666665e-11 783 1112 -1.1000665323307010e-27 784 784 2.9166666666666664e-10 784 342 2.0833333333333329e-11 784 788 -4.1666666666666652e-11 784 428 4.1666666666666665e-11 784 781 4.1666666666666665e-11 784 331 1.0416666666666666e-10 784 330 2.0833333333333332e-11 784 329 1.0416666666666663e-11 784 2046 -2.0833333333333332e-11 784 1462 -1.1000665323307010e-27 784 1447 1.0416666666666665e-11 784 1446 1.1213657767716683e-27 784 2159 -2.0833333333333336e-11 785 785 2.9166666666666664e-10 785 330 -2.0833333333333329e-11 785 432 -1.5039633158038590e-27 785 786 4.1666666666666665e-11 785 331 -1.0416666666666666e-10 785 345 -2.0833333333333332e-11 785 1020 -2.0833333333333336e-11 785 346 -1.0416666666666663e-11 785 781 -4.1666666666666652e-11 785 428 -4.1666666666666658e-11 785 3385 2.0833333333333326e-11 785 2834 -1.0416666666666665e-11 785 1446 1.1213657767716683e-27 786 786 2.9166666666666664e-10 786 785 4.1666666666666665e-11 786 1020 2.0833333333333339e-11 786 346 -1.3233141685082473e-27 786 331 -4.1666666666666665e-11 786 345 -1.0416666666666665e-11 786 344 1.1000665323307010e-27 786 787 4.1666666666666652e-11 786 1064 -2.0833333333333326e-11 786 428 -1.0416666666666666e-10 786 432 -1.0416666666666663e-11 786 2834 -2.0833333333333332e-11 786 1460 -2.0833333333333329e-11 787 787 2.9166666666666659e-10 787 788 4.1666666666666665e-11 787 342 -2.0833333333333332e-11 787 331 -1.0416666666666666e-10 787 345 -2.0833333333333329e-11 787 344 -1.0416666666666661e-11 787 786 4.1666666666666652e-11 787 1064 2.0833333333333326e-11 787 428 -4.1666666666666658e-11 787 432 1.5039633158038590e-27 787 1462 -1.1000665323307010e-27 787 2047 2.0833333333333336e-11 787 1460 -1.0416666666666661e-11 788 788 2.9166666666666659e-10 788 787 4.1666666666666665e-11 788 344 -1.1000665323307010e-27 788 331 -4.1666666666666665e-11 788 342 -1.0416666666666665e-11 788 329 1.3020149240672800e-27 788 784 -4.1666666666666652e-11 788 428 -1.0416666666666666e-10 788 1460 -2.0833333333333332e-11 788 2047 -2.0833333333333336e-11 788 2046 -2.0833333333333326e-11 788 1447 -2.0833333333333329e-11 788 1462 -1.0416666666666661e-11 789 789 2.9166666666666664e-10 789 783 -4.1666666666666665e-11 789 329 -1.5039633158038590e-27 789 332 -4.1666666666666658e-11 789 342 -1.0416666666666665e-11 789 343 1.1213657767716683e-27 789 790 4.1666666666666652e-11 789 433 -1.0416666666666666e-10 789 1101 -2.0833333333333332e-11 789 2046 -2.0833333333333336e-11 789 1703 -2.0833333333333326e-11 789 1100 -1.0416666666666663e-11 790 790 2.9166666666666659e-10 790 792 4.1666666666666665e-11 790 335 -2.0833333333333332e-11 790 332 -1.0416666666666666e-10 790 342 -2.0833333333333329e-11 790 343 -1.0416666666666661e-11 790 789 4.1666666666666652e-11 790 433 -4.1666666666666658e-11 790 1703 2.0833333333333326e-11 790 1100 1.3233141685082473e-27 791 791 2.9166666666666664e-10 791 335 -2.0833333333333329e-11 791 792 4.1666666666666652e-11 791 433 -4.1666666666666665e-11 791 782 -4.1666666666666665e-11 791 332 -1.0416666666666666e-10 791 330 -2.0833333333333332e-11 791 333 -1.0416666666666661e-11 791 1112 -1.1000665323307010e-27 791 2165 2.0833333333333336e-11 792 792 2.9166666666666664e-10 792 790 4.1666666666666665e-11 792 343 -1.1213657767716683e-27 792 332 -4.1666666666666665e-11 792 335 -1.0416666666666665e-11 792 333 1.1000665323307010e-27 792 791 4.1666666666666652e-11 792 433 -1.0416666666666666e-10 793 793 2.0833333333333331e-10 794 794 2.0833333333333331e-10 795 795 2.0833333333333331e-10 796 796 2.9166666666666659e-10 796 421 -1.5039633158038590e-27 796 410 4.1666666666666658e-11 796 409 1.0416666666666661e-11 796 803 4.1666666666666665e-11 796 408 1.1000665323307010e-27 796 804 -4.1666666666666652e-11 796 436 1.0416666666666666e-10 797 797 2.0833333333333331e-10 798 798 2.9166666666666659e-10 798 809 -4.1666666666666665e-11 798 412 1.3020149240672800e-27 798 411 4.1666666666666658e-11 798 409 1.0416666666666661e-11 798 408 -1.3233141685082473e-27 798 802 4.1666666666666652e-11 798 355 1.0416666666666666e-10 799 799 4.1666666666666662e-10 799 410 2.0833333333333329e-11 799 355 -2.0833333333333326e-11 799 808 2.0833333333333339e-11 799 411 2.0833333333333329e-11 799 426 6.2499999999999991e-11 799 802 2.0833333333333336e-11 799 408 -3.5628902784306998e-27 799 803 2.0833333333333326e-11 799 807 2.0833333333333332e-11 799 436 -2.0833333333333329e-11 799 369 2.0833333333333329e-11 799 439 -2.0833333333333326e-11 799 440 3.5628902784306998e-27 799 1071 -2.0833333333333339e-11 799 389 2.0833333333333329e-11 799 386 6.2499999999999991e-11 799 801 2.0833333333333336e-11 799 391 -3.5628902784306998e-27 799 749 -2.0833333333333326e-11 799 748 2.0833333333333332e-11 799 357 -2.0833333333333329e-11 799 354 3.5628902784306998e-27 800 800 2.0833333333333331e-10 801 801 2.9166666666666664e-10 801 388 2.0833333333333329e-11 801 440 1.5039633158038590e-27 801 1071 4.1666666666666665e-11 801 389 1.0416666666666666e-10 801 386 2.0833333333333332e-11 801 799 2.0833333333333336e-11 801 391 1.0416666666666663e-11 801 1072 4.1666666666666652e-11 801 439 4.1666666666666658e-11 802 802 2.9166666666666664e-10 802 354 1.5039633158038590e-27 802 808 -4.1666666666666665e-11 802 426 2.0833333333333332e-11 802 799 2.0833333333333336e-11 802 411 1.0416666666666666e-10 802 409 2.0833333333333329e-11 802 408 1.0416666666666663e-11 802 798 4.1666666666666652e-11 802 355 4.1666666666666658e-11 803 803 2.9166666666666664e-10 803 426 2.0833333333333329e-11 803 807 -4.1666666666666652e-11 803 799 2.0833333333333326e-11 803 440 -1.3020149240672800e-27 803 436 4.1666666666666665e-11 803 796 4.1666666666666665e-11 803 410 1.0416666666666666e-10 803 409 2.0833333333333332e-11 803 408 1.0416666666666661e-11 804 804 2.9166666666666664e-10 804 409 -2.0833333333333329e-11 804 805 4.1666666666666665e-11 804 410 -1.0416666666666666e-10 804 420 -2.0833333333333332e-11 804 421 -1.0416666666666663e-11 804 796 -4.1666666666666652e-11 804 436 -4.1666666666666665e-11 804 1389 -1.3233141685082473e-27 804 2252 2.0833333333333339e-11 805 805 2.9166666666666664e-10 805 804 4.1666666666666665e-11 805 421 -1.5039633158038590e-27 805 410 -4.1666666666666658e-11 805 420 -1.0416666666666665e-11 805 419 1.1213657767716683e-27 805 806 4.1666666666666652e-11 805 436 -1.0416666666666666e-10 805 2252 -2.0833333333333336e-11 805 2260 -2.0833333333333326e-11 805 1390 -2.0833333333333329e-11 805 1389 -1.0416666666666663e-11 806 806 2.9166666666666659e-10 806 440 -1.3020149240672800e-27 806 807 4.1666666666666665e-11 806 426 -2.0833333333333332e-11 806 1033 -2.0833333333333336e-11 806 410 -1.0416666666666666e-10 806 420 -2.0833333333333329e-11 806 419 -1.0416666666666661e-11 806 805 4.1666666666666652e-11 806 436 -4.1666666666666658e-11 806 2260 2.0833333333333326e-11 806 1390 -1.0416666666666661e-11 806 1389 1.3233141685082473e-27 807 807 2.9166666666666664e-10 807 806 4.1666666666666665e-11 807 1033 2.0833333333333336e-11 807 419 -1.1213657767716683e-27 807 410 -4.1666666666666665e-11 807 426 -1.0416666666666665e-11 807 408 1.1000665323307010e-27 807 803 -4.1666666666666652e-11 807 799 2.0833333333333332e-11 807 436 -1.0416666666666666e-10 807 440 -1.0416666666666663e-11 807 1390 -2.0833333333333332e-11 808 808 2.9166666666666664e-10 808 802 -4.1666666666666665e-11 808 799 2.0833333333333339e-11 808 408 -1.3233141685082473e-27 808 411 -4.1666666666666665e-11 808 426 -1.0416666666666665e-11 808 427 1.1000665323307010e-27 808 738 -4.1666666666666652e-11 808 737 2.0833333333333326e-11 808 355 -1.0416666666666666e-10 808 352 -2.0833333333333329e-11 808 354 -1.0416666666666663e-11 809 809 2.9166666666666664e-10 809 423 -2.0833333333333329e-11 809 810 4.1666666666666652e-11 809 811 -2.0833333333333332e-11 809 364 1.1000665323307010e-27 809 355 -4.1666666666666665e-11 809 798 -4.1666666666666665e-11 809 411 -1.0416666666666666e-10 809 409 -2.0833333333333332e-11 809 412 -1.0416666666666663e-11 810 810 2.9166666666666659e-10 810 352 -2.0833333333333332e-11 810 738 -4.1666666666666665e-11 810 739 2.0833333333333336e-11 810 427 -1.1000665323307010e-27 810 411 -4.1666666666666665e-11 810 423 -1.0416666666666665e-11 810 412 1.3020149240672800e-27 810 809 4.1666666666666652e-11 810 811 2.0833333333333326e-11 810 355 -1.0416666666666666e-10 810 364 -1.0416666666666661e-11 811 811 2.0833333541666665e-02 811 411 2.0833333333333329e-11 811 59 -2.0833333333333329e-11 811 780 2.0833333333333336e-11 811 407 2.0833333333333326e-11 811 423 6.2499999999999991e-11 811 779 -2.0833333333333339e-11 811 412 -3.5628902784306998e-27 811 809 -2.0833333333333332e-11 811 810 2.0833333333333326e-11 811 355 -2.0833333333333329e-11 811 79 2.0833333333333333e-03 811 351 -2.0833333333333329e-03 811 364 7.8879979260055783e-21 811 857 2.0833333333333337e-03 811 89 2.0833333333333329e-03 811 93 6.2499999999999995e-03 811 812 2.0833333333333337e-03 811 90 -4.1202858928001372e-19 811 549 -2.0833333333333337e-03 811 548 2.0833333333333333e-03 811 54 -2.0833333333333333e-03 811 62 4.0414059491689842e-19 812 812 2.9166666666666660e-02 812 364 1.2659172094511536e-19 812 857 -4.1666666666666666e-03 812 93 2.0833333333333329e-03 812 811 2.0833333333333337e-03 812 89 1.0416666666666664e-02 812 75 2.0833333333333329e-03 812 90 1.0416666666666664e-03 812 529 4.1666666666666649e-03 812 351 4.1666666666666657e-03 813 813 9.1666666666666660e-10 813 441 -1.0416666666666666e-11 813 109 5.2083333333333334e-11 813 554 4.1666666666666665e-11 813 552 -1.2499999999999998e-10 813 100 -3.1250000000000002e-11 813 108 2.0833333333333342e-11 813 825 -4.1666666666666665e-11 813 814 -1.8175355256292112e-27 813 115 -1.0416666666666666e-11 813 114 -4.1666666666666665e-11 813 4356 -1.0416666666666666e-11 813 5059 -8.3333333333333330e-11 813 2319 1.6155871338926322e-27 813 4071 -1.0416666666666666e-11 813 4073 6.2499999999999991e-11 813 1522 -4.1666666666666665e-11 813 1146 -1.6666666666666666e-10 813 2318 1.2499999999999998e-10 813 4355 1.0416666666666666e-10 813 1691 -4.1666666666666671e-11 813 4775 -8.3333333333333330e-11 813 4154 1.0416666666666667e-10 814 814 2.4999999999999996e-10 814 116 1.0416666666666665e-11 814 818 2.0833333333333332e-11 814 441 6.2499999999999991e-11 814 813 -2.2913451068275814e-27 814 115 6.2499999999999991e-11 814 114 2.0833333333333326e-11 814 4073 1.0416666666666666e-11 814 2315 9.5018296033870872e-28 814 1524 1.0416666666666665e-11 814 1522 2.0833333333333326e-11 814 4775 2.0833333333333339e-11 814 4154 1.0416666666666666e-11 815 815 2.4999999999999996e-10 815 109 1.0416666666666666e-11 815 556 2.0833333333333339e-11 815 552 2.2913451068275814e-27 815 230 1.0416666666666666e-11 815 221 6.2499999999999991e-11 815 817 2.0833333333333336e-11 815 112 6.2500000000000004e-11 815 116 1.0416666666666665e-11 815 114 2.0833333333333326e-11 815 1614 1.0416666666666665e-11 815 1613 2.0833333333333326e-11 815 2315 9.5018296033870872e-28 816 816 6.6666666666666664e-10 816 112 1.0416666666666666e-11 816 441 1.0416666666666666e-11 816 818 8.3333333333333330e-11 816 115 1.0416666666666666e-11 816 116 -6.2499999999999991e-11 816 1075 -1.6155871338926322e-27 816 442 4.1666666666666665e-11 816 817 8.3333333333333330e-11 816 820 1.6155871338926322e-27 816 221 1.0416666666666666e-11 816 228 4.1666666666666665e-11 816 3699 -1.6155871338926322e-27 816 2492 4.1666666666666665e-11 816 4316 1.0416666666666666e-11 816 1612 1.0416666666666666e-11 816 2096 8.3333333333333330e-11 816 1223 1.0416666666666666e-11 816 1228 -6.2499999999999991e-11 816 4318 4.1666666666666665e-11 816 1993 8.3333333333333330e-11 816 5005 -1.6155871338926322e-27 816 4068 1.0416666666666666e-11 816 1524 -6.2499999999999991e-11 816 1614 -6.2499999999999991e-11 817 817 4.1666666666666662e-10 817 815 2.0833333333333339e-11 817 112 8.3333333333333330e-11 817 116 -2.0833333333333336e-11 817 114 2.0833333333333332e-11 817 820 -2.0833333333333339e-11 817 816 8.3333333333333330e-11 817 221 8.3333333333333330e-11 817 228 2.0833333333333332e-11 817 2492 2.0833333333333332e-11 817 1613 2.0833333333333332e-11 817 2315 -8.3333333333333330e-11 817 1614 -2.0833333333333336e-11 818 818 4.1666666666666662e-10 818 442 2.0833333333333332e-11 818 816 8.3333333333333330e-11 818 115 8.3333333333333330e-11 818 116 -2.0833333333333336e-11 818 114 2.0833333333333332e-11 818 814 2.0833333333333336e-11 818 441 8.3333333333333330e-11 818 3699 2.0833333333333336e-11 818 2492 2.0833333333333332e-11 818 2315 -8.3333333333333330e-11 818 1524 -2.0833333333333336e-11 818 1522 2.0833333333333332e-11 819 819 4.1666666666666664e-02 819 224 -2.0833333333333329e-03 819 942 2.0833333333333333e-03 819 478 2.0833333333333329e-03 819 480 6.2499999999999986e-03 819 822 2.0833333333333333e-03 819 477 -2.6745065309554533e-19 819 823 2.0833333333333333e-03 819 941 2.0833333333333333e-03 819 128 2.0833333333333333e-03 819 113 -2.0833333333333329e-03 819 112 -6.2500000000000003e-03 819 118 3.7587087034409578e-19 819 569 2.0833333333333333e-03 819 121 2.0833333333333329e-03 819 141 6.2499999999999986e-03 819 566 -2.0833333333333333e-03 819 142 -2.6745065309554533e-19 819 648 -2.0833333333333333e-03 819 647 2.0833333333333333e-03 819 222 -2.0833333333333333e-03 819 221 -6.2500000000000003e-03 819 220 3.7587087034409578e-19 819 2475 2.0833333333333333e-03 819 2486 -2.0833333333333333e-03 820 820 2.4999999999999996e-10 820 116 -1.0416666666666665e-11 820 231 -1.0416666666666666e-11 820 821 2.0833333333333339e-11 820 112 -6.2499999999999991e-11 820 817 -2.0833333333333336e-11 820 816 9.5018296033870872e-28 820 221 -6.2500000000000004e-11 820 228 -2.0833333333333326e-11 820 3474 2.2913451068275814e-27 820 2484 -1.0416666666666666e-11 820 2492 -2.0833333333333326e-11 820 1614 -1.0416666666666665e-11 821 821 2.0833333541666665e-02 821 228 -2.0833333333333329e-11 821 820 2.0833333333333339e-11 821 478 2.0833333333333333e-03 821 112 -3.1250000416666660e-03 821 823 2.0833333333333337e-03 821 477 -4.1202858928001372e-19 821 822 2.0833333333333333e-03 821 940 -2.0833333333333337e-03 821 224 -2.0833333333333333e-03 821 221 -3.1250000416666668e-03 821 231 1.0416667070807261e-11 821 3474 8.3333333333333330e-11 821 2492 -2.0833333333333332e-11 821 2486 -2.0833333333333329e-03 821 2484 1.0416666674554665e-11 821 3473 -2.0833333333333337e-03 821 2475 2.0833333333333329e-03 821 2477 6.2499999999999986e-03 822 822 2.9166666666666660e-02 822 220 1.4465734552327348e-19 822 942 -4.1666666666666675e-03 822 480 2.0833333333333329e-03 822 819 2.0833333333333333e-03 822 478 1.0416666666666664e-02 822 477 1.0416666666666662e-03 822 940 4.1666666666666649e-03 822 821 2.0833333333333329e-03 822 224 4.1666666666666657e-03 822 221 1.0416666666666664e-03 822 231 -1.4465734552327348e-19 822 2477 2.0833333333333329e-03 823 823 2.9166666666666660e-02 823 480 2.0833333333333329e-03 823 941 -4.1666666666666649e-03 823 819 2.0833333333333329e-03 823 118 -9.9486666632977745e-20 823 112 1.0416666666666664e-03 823 821 2.0833333333333333e-03 823 477 1.0416666666666664e-03 823 2486 4.1666666666666657e-03 823 2484 1.4465734552327348e-19 823 3473 4.1666666666666666e-03 823 2475 1.0416666666666664e-02 823 2477 2.0833333333333329e-03 824 824 4.1666666666666657e-10 824 33 -6.0115145282367205e-27 824 825 4.0642113836986528e-27 824 5057 2.8974861048767764e-27 824 4355 -5.6797985175912850e-27 825 825 4.1666666666666662e-10 825 813 -4.1666666666666665e-11 825 824 6.4623485355705287e-27 825 33 -6.2499999999999991e-11 825 574 6.4623485355705287e-27 825 108 1.0416666666666658e-11 825 1146 4.1666666666666665e-11 825 2318 -2.0833333333333329e-11 825 1691 3.5848693552059962e-28 825 4355 -1.0416666666666668e-11 826 826 2.0833333333333329e-10 827 827 2.0833333333333329e-10 828 828 2.9166666666666660e-02 828 139 -1.4465734552327348e-19 828 132 4.1666666666666657e-03 828 131 1.0416666666666660e-03 828 834 4.1666666666666675e-03 828 130 1.4465734552327348e-19 828 505 4.1666666666666649e-03 828 11 1.0416666666666664e-02 829 829 2.0833333333333332e-02 830 830 2.9166666666666660e-02 830 754 4.1666666666666675e-03 830 134 1.4465734552327348e-19 830 133 4.1666666666666657e-03 830 131 1.0416666666666660e-03 830 130 -1.2659172094511536e-19 830 833 4.1666666666666649e-03 830 353 1.0416666666666664e-02 831 831 4.1666666666666664e-02 831 132 2.0833333333333333e-03 831 353 -2.0833333333333329e-03 831 838 2.0833333333333337e-03 831 133 2.0833333333333329e-03 831 135 6.2499999999999986e-03 831 833 2.0833333333333337e-03 831 130 -4.1202858928001372e-19 831 834 2.0833333333333333e-03 831 835 2.0833333333333337e-03 831 11 -2.0833333333333333e-03 831 89 2.0833333333333333e-03 831 8 -2.0833333333333329e-03 831 18 4.1202858928001372e-19 831 537 2.0833333333333337e-03 831 76 2.0833333333333329e-03 831 86 6.2499999999999986e-03 831 536 -2.0833333333333337e-03 831 88 -4.1202858928001372e-19 831 832 2.0833333333333333e-03 831 839 -2.0833333333333337e-03 831 351 -2.0833333333333333e-03 831 349 4.1202858928001372e-19 832 832 2.9166666666666660e-02 832 529 4.1666666666666675e-03 832 75 2.0833333333333329e-03 832 89 1.0416666666666664e-02 832 86 2.0833333333333329e-03 832 88 1.0416666666666662e-03 832 839 4.1666666666666649e-03 832 831 2.0833333333333329e-03 832 351 4.1666666666666657e-03 832 349 -1.4465734552327348e-19 833 833 2.9166666666666660e-02 833 349 1.4465734552327348e-19 833 838 -4.1666666666666666e-03 833 135 2.0833333333333329e-03 833 831 2.0833333333333333e-03 833 133 1.0416666666666664e-02 833 131 2.0833333333333329e-03 833 130 1.0416666666666664e-03 833 830 4.1666666666666649e-03 833 353 4.1666666666666657e-03 834 834 2.9166666666666664e-02 834 135 2.0833333333333329e-03 834 835 -4.1666666666666649e-03 834 831 2.0833333333333329e-03 834 18 -1.4465734552327348e-19 834 11 4.1666666666666657e-03 834 828 4.1666666666666675e-03 834 132 1.0416666666666664e-02 834 131 2.0833333333333329e-03 834 130 1.0416666666666662e-03 835 835 2.9166666666666660e-02 835 19 -2.0833333333333329e-03 835 836 4.1666666666666666e-03 835 840 -2.0833333333333333e-03 835 136 -9.9486666632977745e-20 835 132 -4.1666666666666657e-03 835 135 -1.0416666666666664e-03 835 130 1.4465734552327348e-19 835 834 -4.1666666666666649e-03 835 831 2.0833333333333329e-03 835 11 -1.0416666666666664e-02 835 18 -1.0416666666666664e-03 836 836 2.9166666666666660e-02 836 138 -2.0833333333333329e-03 836 837 4.1666666666666649e-03 836 846 -2.0833333333333329e-03 836 20 1.2659172094511536e-19 836 11 -4.1666666666666657e-03 836 19 -1.0416666666666660e-03 836 18 -1.4465734552327348e-19 836 835 4.1666666666666675e-03 836 132 -1.0416666666666664e-02 836 135 -2.0833333333333329e-03 836 840 2.0833333333333333e-03 836 136 -1.0416666666666662e-03 837 837 2.9166666666666660e-02 837 505 -4.1666666666666666e-03 837 502 2.0833333333333333e-03 837 139 -1.4465734552327348e-19 837 132 -4.1666666666666657e-03 837 138 -1.0416666666666664e-03 837 136 9.9486666632977745e-20 837 836 4.1666666666666649e-03 837 846 2.0833333333333329e-03 837 11 -1.0416666666666664e-02 837 19 -2.0833333333333329e-03 837 20 -1.0416666666666664e-03 838 838 2.9166666666666660e-02 838 144 1.4465734552327348e-19 838 133 -4.1666666666666657e-03 838 135 -1.0416666666666664e-03 838 833 -4.1666666666666666e-03 838 831 2.0833333333333337e-03 838 130 -1.2659172094511536e-19 838 736 -4.1666666666666649e-03 838 735 2.0833333333333329e-03 838 353 -1.0416666666666664e-02 838 352 -2.0833333333333329e-03 838 349 -1.0416666666666664e-03 839 839 2.9166666666666660e-02 839 352 2.0833333333333329e-03 839 743 4.1666666666666666e-03 839 735 -2.0833333333333333e-03 839 92 9.9486666632977745e-20 839 89 4.1666666666666657e-03 839 86 1.0416666666666664e-03 839 88 -1.4465734552327348e-19 839 832 4.1666666666666649e-03 839 831 -2.0833333333333329e-03 839 351 1.0416666666666664e-02 839 349 1.0416666666666664e-03 840 840 4.1666666666666664e-02 840 137 -2.0833333333333333e-03 840 11 2.0833333333333329e-03 840 835 -2.0833333333333333e-03 840 132 -2.0833333333333329e-03 840 135 -6.2499999999999995e-03 840 836 2.0833333333333333e-03 840 136 4.1202858928001372e-19 840 76 -2.0833333333333333e-03 840 451 2.0833333333333329e-03 840 843 2.0833333333333333e-03 840 87 -2.0833333333333329e-03 840 86 -6.2499999999999995e-03 840 851 -2.0833333333333333e-03 840 85 4.1202858928001372e-19 840 538 2.0833333333333333e-03 840 537 -2.0833333333333333e-03 840 8 2.0833333333333333e-03 840 19 6.2500000000000003e-03 840 18 -2.6745065309554533e-19 840 845 -2.0833333333333333e-03 840 841 2.0833333333333333e-03 840 446 2.0833333333333333e-03 840 445 6.2500000000000003e-03 840 444 -2.6745065309554533e-19 841 841 2.9166666666666660e-02 841 453 2.0833333333333329e-03 841 861 -4.1666666666666666e-03 841 842 2.0833333333333337e-03 841 143 1.2659172094511536e-19 841 137 4.1666666666666657e-03 841 135 1.0416666666666664e-03 841 136 -1.4465734552327348e-19 841 845 4.1666666666666649e-03 841 840 2.0833333333333329e-03 841 446 1.0416666666666664e-02 841 445 2.0833333333333329e-03 841 444 1.0416666666666664e-03 842 842 4.1666666666666664e-02 842 87 -2.0833333333333333e-03 842 156 2.0833333333333329e-03 842 844 2.0833333333333337e-03 842 94 -2.0833333333333329e-03 842 86 -6.2499999999999986e-03 842 957 2.0833333333333337e-03 842 95 4.1202858928001372e-19 842 127 -2.0833333333333333e-03 842 446 2.0833333333333329e-03 842 841 2.0833333333333337e-03 842 137 -2.0833333333333329e-03 842 135 -6.2499999999999986e-03 842 861 2.0833333333333337e-03 842 143 4.1202858928001372e-19 842 645 2.0833333333333333e-03 842 644 -2.0833333333333337e-03 842 153 2.0833333333333333e-03 842 168 6.2499999999999995e-03 842 167 -4.1202858928001372e-19 842 854 2.0833333333333333e-03 842 843 2.0833333333333337e-03 842 451 2.0833333333333333e-03 842 453 6.2499999999999995e-03 842 444 -4.1202858928001372e-19 843 843 2.9166666666666660e-02 843 95 -1.4465734552327348e-19 843 445 2.0833333333333329e-03 843 87 4.1666666666666657e-03 843 86 1.0416666666666664e-03 843 851 4.1666666666666666e-03 843 840 2.0833333333333333e-03 843 85 9.9486666632977745e-20 843 854 -4.1666666666666649e-03 843 842 2.0833333333333329e-03 843 451 1.0416666666666664e-02 843 453 2.0833333333333329e-03 843 444 1.0416666666666664e-03 844 844 2.9166666666666660e-02 844 168 2.0833333333333329e-03 844 957 -4.1666666666666666e-03 844 842 2.0833333333333337e-03 844 95 1.2659172094511536e-19 844 94 4.1666666666666657e-03 844 86 1.0416666666666664e-03 844 92 -1.4465734552327348e-19 844 744 4.1666666666666649e-03 844 735 -2.0833333333333329e-03 844 156 1.0416666666666664e-02 844 152 2.0833333333333329e-03 844 167 1.0416666666666664e-03 845 845 2.9166666666666660e-02 845 447 1.4465734552327348e-19 845 858 -4.1666666666666675e-03 845 138 2.0833333333333329e-03 845 846 2.0833333333333333e-03 845 137 1.0416666666666664e-02 845 135 2.0833333333333329e-03 845 136 1.0416666666666662e-03 845 841 4.1666666666666649e-03 845 840 -2.0833333333333329e-03 845 446 4.1666666666666657e-03 845 445 1.0416666666666660e-03 845 444 -1.4465734552327348e-19 846 846 4.1666666666666664e-02 846 14 -2.0833333333333329e-03 846 509 2.0833333333333333e-03 846 40 2.0833333333333329e-03 846 43 6.2500000000000003e-03 846 510 -2.0833333333333333e-03 846 44 -3.7587087034409578e-19 846 132 2.0833333333333333e-03 846 446 -2.0833333333333329e-03 846 858 2.0833333333333333e-03 846 137 2.0833333333333329e-03 846 138 6.2500000000000003e-03 846 845 2.0833333333333333e-03 846 136 -3.7587087034409578e-19 846 836 -2.0833333333333333e-03 846 837 2.0833333333333333e-03 846 11 -2.0833333333333333e-03 846 19 -6.2499999999999986e-03 846 20 2.6745065309554533e-19 846 847 2.0833333333333333e-03 846 862 -2.0833333333333333e-03 846 445 -6.2499999999999986e-03 846 447 2.6745065309554533e-19 846 2860 2.0833333333333333e-03 846 2853 -2.0833333333333333e-03 847 847 2.9166666666666660e-02 847 448 1.4465734552327348e-19 847 865 -4.1666666666666675e-03 847 45 2.0833333333333329e-03 847 848 2.0833333333333333e-03 847 43 2.0833333333333329e-03 847 44 1.0416666666666662e-03 847 862 4.1666666666666649e-03 847 846 2.0833333333333329e-03 847 445 1.0416666666666660e-03 847 447 -1.2659172094511536e-19 847 2860 1.0416666666666664e-02 847 2853 4.1666666666666657e-03 848 848 4.1666666666666664e-02 848 263 2.0833333333333333e-03 848 17 -2.0833333333333329e-03 848 876 2.0833333333333333e-03 848 258 2.0833333333333329e-03 848 261 6.2499999999999995e-03 848 852 2.0833333333333333e-03 848 262 -4.1202858928001372e-19 848 40 2.0833333333333333e-03 848 865 2.0833333333333333e-03 848 45 6.2499999999999995e-03 848 847 2.0833333333333333e-03 848 44 -4.1202858928001372e-19 848 510 -2.0833333333333333e-03 848 511 2.0833333333333333e-03 848 14 -2.0833333333333333e-03 848 19 -6.2500000000000003e-03 848 21 2.6745065309554533e-19 848 849 2.0833333333333333e-03 848 882 -2.0833333333333333e-03 848 449 -2.0833333333333333e-03 848 445 -6.2500000000000003e-03 848 448 2.6745065309554533e-19 848 2853 -2.0833333333333329e-03 848 2860 2.0833333333333329e-03 849 849 2.9166666666666660e-02 849 450 1.4465734552327348e-19 849 892 -4.1666666666666675e-03 849 264 2.0833333333333329e-03 849 850 2.0833333333333333e-03 849 263 1.0416666666666664e-02 849 261 2.0833333333333329e-03 849 262 1.0416666666666662e-03 849 882 4.1666666666666649e-03 849 848 2.0833333333333329e-03 849 449 4.1666666666666657e-03 849 445 1.0416666666666660e-03 849 448 -1.4465734552327348e-19 850 850 4.1666666666666664e-02 850 87 2.0833333333333333e-03 850 8 -2.0833333333333329e-03 850 539 2.0833333333333333e-03 850 76 2.0833333333333329e-03 850 91 6.2500000000000003e-03 850 538 -2.0833333333333333e-03 850 85 -3.7587087034409578e-19 850 258 2.0833333333333333e-03 850 449 -2.0833333333333329e-03 850 892 2.0833333333333333e-03 850 263 2.0833333333333329e-03 850 264 6.2500000000000003e-03 850 849 2.0833333333333333e-03 850 262 -3.7587087034409578e-19 850 852 2.0833333333333333e-03 850 877 2.0833333333333333e-03 850 17 -2.0833333333333333e-03 850 19 -6.2499999999999986e-03 850 22 2.6745065309554533e-19 850 851 2.0833333333333333e-03 850 853 2.0833333333333333e-03 850 451 -2.0833333333333333e-03 850 445 -6.2499999999999986e-03 850 450 2.6745065309554533e-19 851 851 2.9166666666666660e-02 851 91 2.0833333333333329e-03 851 444 1.4465734552327348e-19 851 843 4.1666666666666675e-03 851 87 1.0416666666666664e-02 851 86 2.0833333333333329e-03 851 840 -2.0833333333333333e-03 851 85 1.0416666666666662e-03 851 853 -4.1666666666666649e-03 851 850 2.0833333333333329e-03 851 451 4.1666666666666657e-03 851 445 1.0416666666666660e-03 851 450 -1.2659172094511536e-19 852 852 2.9166666666666660e-02 852 264 2.0833333333333329e-03 852 877 -4.1666666666666649e-03 852 850 2.0833333333333329e-03 852 22 -1.2659172094511536e-19 852 17 4.1666666666666657e-03 852 19 1.0416666666666660e-03 852 21 1.4465734552327348e-19 852 876 -4.1666666666666675e-03 852 258 1.0416666666666664e-02 852 261 2.0833333333333329e-03 852 848 2.0833333333333333e-03 852 262 1.0416666666666662e-03 853 853 2.9166666666666660e-02 853 856 4.1666666666666666e-03 853 896 -2.0833333333333333e-03 853 98 -1.4465734552327348e-19 853 87 -4.1666666666666657e-03 853 91 -1.0416666666666664e-03 853 85 9.9486666632977745e-20 853 851 -4.1666666666666649e-03 853 850 2.0833333333333329e-03 853 451 -1.0416666666666664e-02 853 445 -2.0833333333333329e-03 853 450 -1.0416666666666664e-03 853 2856 -2.0833333333333329e-03 854 854 2.9166666666666660e-02 854 454 -1.4465734552327348e-19 854 855 4.1666666666666675e-03 854 96 -2.0833333333333329e-03 854 959 -2.0833333333333333e-03 854 87 -1.0416666666666664e-02 854 86 -2.0833333333333329e-03 854 95 -1.0416666666666662e-03 854 843 -4.1666666666666649e-03 854 842 2.0833333333333329e-03 854 451 -4.1666666666666657e-03 854 453 -1.0416666666666664e-03 854 444 1.4465734552327348e-19 855 855 2.9166666666666660e-02 855 98 1.4465734552327348e-19 855 453 -2.0833333333333329e-03 855 87 -4.1666666666666657e-03 855 96 -1.0416666666666660e-03 855 854 4.1666666666666675e-03 855 959 2.0833333333333333e-03 855 95 -1.4465734552327348e-19 855 856 4.1666666666666649e-03 855 964 -2.0833333333333329e-03 855 451 -1.0416666666666664e-02 855 454 -1.0416666666666662e-03 855 2856 -2.0833333333333329e-03 856 856 2.9166666666666664e-02 856 96 -2.0833333333333329e-03 856 450 -1.2659172094511536e-19 856 853 4.1666666666666666e-03 856 87 -1.0416666666666664e-02 856 91 -2.0833333333333329e-03 856 896 2.0833333333333337e-03 856 98 -1.0416666666666664e-03 856 855 4.1666666666666649e-03 856 964 2.0833333333333329e-03 856 451 -4.1666666666666657e-03 856 454 1.4465734552327348e-19 856 2856 -1.0416666666666664e-03 857 857 2.9166666666666660e-02 857 812 -4.1666666666666666e-03 857 811 2.0833333333333333e-03 857 90 -1.4465734552327348e-19 857 89 -4.1666666666666657e-03 857 93 -1.0416666666666664e-03 857 92 9.9486666632977745e-20 857 743 -4.1666666666666649e-03 857 739 2.0833333333333329e-03 857 351 -1.0416666666666664e-02 857 352 -2.0833333333333329e-03 857 364 -1.0416666666666664e-03 858 858 2.9166666666666660e-02 858 140 1.4465734552327348e-19 858 445 -2.0833333333333329e-03 858 137 -4.1666666666666657e-03 858 138 -1.0416666666666664e-03 858 845 -4.1666666666666675e-03 858 846 2.0833333333333333e-03 858 136 -1.4465734552327348e-19 858 859 4.1666666666666649e-03 858 863 -2.0833333333333329e-03 858 446 -1.0416666666666664e-02 858 447 -1.0416666666666662e-03 858 2852 -2.0833333333333329e-03 859 859 2.9166666666666660e-02 859 452 -9.9486666632977745e-20 859 860 4.1666666666666666e-03 859 141 -2.0833333333333329e-03 859 938 -2.0833333333333333e-03 859 137 -1.0416666666666664e-02 859 138 -2.0833333333333329e-03 859 140 -1.0416666666666664e-03 859 858 4.1666666666666649e-03 859 863 2.0833333333333329e-03 859 446 -4.1666666666666657e-03 859 447 1.4465734552327348e-19 859 2852 -1.0416666666666664e-03 860 860 2.9166666666666660e-02 860 143 1.2659172094511536e-19 860 137 -4.1666666666666657e-03 860 141 -1.0416666666666660e-03 860 859 4.1666666666666675e-03 860 938 2.0833333333333333e-03 860 140 -1.4465734552327348e-19 860 861 4.1666666666666649e-03 860 951 -2.0833333333333329e-03 860 446 -1.0416666666666664e-02 860 453 -2.0833333333333329e-03 860 452 -1.0416666666666662e-03 860 2852 -2.0833333333333329e-03 861 861 2.9166666666666660e-02 861 141 -2.0833333333333329e-03 861 444 -1.4465734552327348e-19 861 841 -4.1666666666666666e-03 861 137 -1.0416666666666664e-02 861 135 -2.0833333333333329e-03 861 842 2.0833333333333333e-03 861 143 -1.0416666666666664e-03 861 860 4.1666666666666649e-03 861 951 2.0833333333333329e-03 861 446 -4.1666666666666657e-03 861 453 -1.0416666666666664e-03 861 452 9.9486666632977745e-20 862 862 2.9166666666666660e-02 862 863 2.0833333333333333e-03 862 43 1.0416666666666664e-03 862 44 -9.9486666632977745e-20 862 847 4.1666666666666649e-03 862 846 -2.0833333333333329e-03 862 445 2.0833333333333329e-03 862 447 1.0416666666666664e-03 862 2852 2.0833333333333329e-03 862 3413 4.1666666666666666e-03 862 2869 1.4465734552327348e-19 862 2860 4.1666666666666657e-03 862 2853 1.0416666666666664e-02 863 863 4.1666666666666664e-02 863 137 -2.0833333333333333e-03 863 113 2.0833333333333329e-03 863 567 -2.0833333333333337e-03 863 121 -2.0833333333333329e-03 863 138 -6.2499999999999995e-03 863 568 2.0833333333333337e-03 863 140 4.1202858928001372e-19 863 862 2.0833333333333337e-03 863 43 -6.2499999999999995e-03 863 864 2.0833333333333333e-03 863 117 -4.1202858928001372e-19 863 859 2.0833333333333337e-03 863 858 -2.0833333333333333e-03 863 446 2.0833333333333333e-03 863 447 -4.1202858928001372e-19 863 2866 -2.0833333333333333e-03 863 2853 2.0833333333333329e-03 863 2860 -2.0833333333333329e-03 863 3413 -2.0833333333333337e-03 863 2869 4.1202858928001372e-19 863 3468 -2.0833333333333337e-03 863 2488 2.0833333333333333e-03 863 2490 6.2499999999999986e-03 863 2852 6.2499999999999986e-03 864 864 2.9166666666666660e-02 864 110 2.0833333333333329e-03 864 563 4.1666666666666675e-03 864 561 -2.0833333333333333e-03 864 51 1.4465734552327348e-19 864 43 1.0416666666666664e-03 864 863 2.0833333333333329e-03 864 117 1.0416666666666662e-03 864 2866 4.1666666666666657e-03 864 2869 -1.4465734552327348e-19 864 3468 4.1666666666666649e-03 864 2488 1.0416666666666664e-02 864 2490 2.0833333333333329e-03 865 865 2.9166666666666660e-02 865 445 -2.0833333333333329e-03 865 45 -1.0416666666666664e-03 865 847 -4.1666666666666666e-03 865 848 2.0833333333333333e-03 865 44 -9.9486666632977745e-20 865 884 -2.0833333333333329e-03 865 448 -1.0416666666666664e-03 865 2858 1.4465734552327348e-19 865 2860 -4.1666666666666657e-03 865 3410 -4.1666666666666649e-03 865 2853 -1.0416666666666664e-02 865 2846 -2.0833333333333329e-03 866 866 2.0833333333333329e-02 867 867 2.9166666666666660e-02 867 265 -1.4465734552327348e-19 867 258 4.1666666666666657e-03 867 257 1.0416666666666660e-03 867 875 4.1666666666666675e-03 867 256 1.4465734552327348e-19 867 533 4.1666666666666649e-03 867 17 1.0416666666666664e-02 868 868 2.0833333333333332e-02 869 869 2.9166666666666660e-02 869 880 -4.1666666666666675e-03 869 260 1.4465734552327348e-19 869 259 4.1666666666666657e-03 869 257 1.0416666666666660e-03 869 256 -1.2659172094511536e-19 869 874 4.1666666666666649e-03 869 461 1.0416666666666664e-02 870 870 2.0833333333333332e-02 871 871 2.9166666666666660e-02 871 531 4.1666666666666675e-03 871 265 1.4465734552327348e-19 871 266 4.1666666666666657e-03 871 257 1.0416666666666660e-03 871 267 -1.2659172094511536e-19 871 898 -4.1666666666666649e-03 871 65 1.0416666666666664e-02 872 872 4.1666666666666664e-02 872 258 2.0833333333333333e-03 872 461 -2.0833333333333329e-03 872 878 2.0833333333333337e-03 872 259 2.0833333333333329e-03 872 261 6.2499999999999986e-03 872 874 2.0833333333333337e-03 872 256 -4.1202858928001372e-19 872 875 2.0833333333333333e-03 872 876 2.0833333333333337e-03 872 17 -2.0833333333333333e-03 872 47 2.0833333333333333e-03 872 14 -2.0833333333333329e-03 872 21 4.1202858928001372e-19 872 511 2.0833333333333337e-03 872 40 2.0833333333333329e-03 872 45 6.2499999999999986e-03 872 508 -2.0833333333333337e-03 872 46 -4.1202858928001372e-19 872 873 2.0833333333333333e-03 872 881 -2.0833333333333337e-03 872 459 -2.0833333333333333e-03 872 457 4.1202858928001372e-19 873 873 2.9166666666666660e-02 873 501 4.1666666666666675e-03 873 39 2.0833333333333329e-03 873 47 1.0416666666666664e-02 873 45 2.0833333333333329e-03 873 46 1.0416666666666662e-03 873 881 4.1666666666666649e-03 873 872 2.0833333333333329e-03 873 459 4.1666666666666657e-03 873 457 -1.4465734552327348e-19 874 874 2.9166666666666660e-02 874 457 1.4465734552327348e-19 874 878 -4.1666666666666666e-03 874 261 2.0833333333333329e-03 874 872 2.0833333333333333e-03 874 259 1.0416666666666664e-02 874 257 2.0833333333333329e-03 874 256 1.0416666666666664e-03 874 869 4.1666666666666649e-03 874 461 4.1666666666666657e-03 875 875 2.9166666666666664e-02 875 261 2.0833333333333329e-03 875 876 -4.1666666666666649e-03 875 872 2.0833333333333329e-03 875 21 -1.4465734552327348e-19 875 17 4.1666666666666657e-03 875 867 4.1666666666666675e-03 875 258 1.0416666666666664e-02 875 257 2.0833333333333329e-03 875 256 1.0416666666666662e-03 876 876 2.9166666666666660e-02 876 19 -2.0833333333333329e-03 876 852 -4.1666666666666666e-03 876 848 2.0833333333333333e-03 876 262 -9.9486666632977745e-20 876 258 -4.1666666666666657e-03 876 261 -1.0416666666666664e-03 876 256 1.4465734552327348e-19 876 875 -4.1666666666666649e-03 876 872 2.0833333333333329e-03 876 17 -1.0416666666666664e-02 876 21 -1.0416666666666664e-03 877 877 2.9166666666666660e-02 877 533 -4.1666666666666666e-03 877 530 2.0833333333333333e-03 877 265 -1.4465734552327348e-19 877 258 -4.1666666666666657e-03 877 264 -1.0416666666666664e-03 877 262 9.9486666632977745e-20 877 852 -4.1666666666666649e-03 877 850 2.0833333333333329e-03 877 17 -1.0416666666666664e-02 877 19 -2.0833333333333329e-03 877 22 -1.0416666666666664e-03 878 878 2.9166666666666660e-02 878 269 1.4465734552327348e-19 878 259 -4.1666666666666657e-03 878 261 -1.0416666666666664e-03 878 874 -4.1666666666666666e-03 878 872 2.0833333333333337e-03 878 256 -1.2659172094511536e-19 878 879 4.1666666666666649e-03 878 883 -2.0833333333333329e-03 878 461 -1.0416666666666664e-02 878 457 -1.0416666666666664e-03 879 879 2.9166666666666660e-02 879 660 -4.1666666666666675e-03 879 251 -2.0833333333333329e-03 879 259 -1.0416666666666664e-02 879 261 -2.0833333333333329e-03 879 269 -1.0416666666666662e-03 879 878 4.1666666666666649e-03 879 883 2.0833333333333329e-03 879 461 -4.1666666666666657e-03 879 457 1.4465734552327348e-19 880 880 2.9166666666666664e-02 880 251 -2.0833333333333329e-03 880 660 -4.1666666666666649e-03 880 461 -4.1666666666666657e-03 880 869 -4.1666666666666666e-03 880 259 -1.0416666666666664e-02 880 257 -2.0833333333333329e-03 880 260 -1.0416666666666664e-03 881 881 2.9166666666666660e-02 881 888 -4.1666666666666666e-03 881 883 2.0833333333333333e-03 881 49 9.9486666632977745e-20 881 47 4.1666666666666657e-03 881 45 1.0416666666666664e-03 881 46 -1.4465734552327348e-19 881 873 4.1666666666666649e-03 881 872 -2.0833333333333329e-03 881 459 1.0416666666666664e-02 881 457 1.0416666666666664e-03 882 882 2.9166666666666660e-02 882 891 -4.1666666666666666e-03 882 884 2.0833333333333337e-03 882 268 1.2659172094511536e-19 882 263 4.1666666666666657e-03 882 261 1.0416666666666664e-03 882 262 -1.4465734552327348e-19 882 849 4.1666666666666649e-03 882 848 -2.0833333333333329e-03 882 449 1.0416666666666664e-02 882 445 2.0833333333333329e-03 882 448 1.0416666666666664e-03 882 2846 2.0833333333333329e-03 883 883 4.1666666666666664e-02 883 459 2.0833333333333329e-03 883 881 2.0833333333333333e-03 883 47 -2.0833333333333329e-03 883 45 -6.2499999999999995e-03 883 888 2.0833333333333333e-03 883 49 4.1202858928001372e-19 883 937 -2.0833333333333333e-03 883 885 2.0833333333333333e-03 883 259 -2.0833333333333333e-03 883 243 2.0833333333333329e-03 883 245 -2.6745065309554533e-19 883 664 -2.0833333333333333e-03 883 252 -2.0833333333333329e-03 883 261 -6.2499999999999995e-03 883 663 2.0833333333333333e-03 883 269 4.1202858928001372e-19 883 879 2.0833333333333333e-03 883 878 -2.0833333333333333e-03 883 461 2.0833333333333333e-03 883 457 -2.6745065309554533e-19 883 2861 -2.0833333333333333e-03 883 2361 2.0833333333333333e-03 884 884 4.1666666666666664e-02 884 885 2.0833333333333337e-03 884 45 -6.2499999999999986e-03 884 252 -2.0833333333333333e-03 884 449 2.0833333333333329e-03 884 882 2.0833333333333337e-03 884 263 -2.0833333333333329e-03 884 261 -6.2499999999999986e-03 884 891 2.0833333333333337e-03 884 268 4.1202858928001372e-19 884 665 2.0833333333333333e-03 884 664 -2.0833333333333337e-03 884 243 2.0833333333333333e-03 884 245 -4.1202858928001372e-19 884 865 -2.0833333333333337e-03 884 448 -4.1202858928001372e-19 884 2860 -2.0833333333333333e-03 884 2361 2.0833333333333329e-03 884 2861 -2.0833333333333329e-03 884 3409 -2.0833333333333337e-03 884 2858 4.1202858928001372e-19 884 2360 6.2499999999999995e-03 884 3410 -2.0833333333333333e-03 884 2853 2.0833333333333333e-03 884 2846 6.2499999999999995e-03 885 885 2.9166666666666660e-02 885 884 2.0833333333333337e-03 885 45 1.0416666666666664e-03 885 49 -1.4465734552327348e-19 885 937 4.1666666666666649e-03 885 883 2.0833333333333329e-03 885 245 1.0416666666666664e-03 885 2360 2.0833333333333329e-03 885 3409 4.1666666666666666e-03 885 2858 1.2659172094511536e-19 885 2861 4.1666666666666657e-03 885 2361 1.0416666666666664e-02 886 886 2.9166666666666660e-02 886 887 4.1666666666666666e-03 886 50 -2.0833333333333329e-03 886 47 -1.0416666666666664e-02 886 39 -2.0833333333333329e-03 886 48 -1.0416666666666664e-03 886 501 -4.1666666666666649e-03 886 459 -4.1666666666666657e-03 887 887 2.9166666666666660e-02 887 886 4.1666666666666666e-03 887 48 -1.4465734552327348e-19 887 47 -4.1666666666666657e-03 887 50 -1.0416666666666664e-03 887 49 9.9486666632977745e-20 887 888 4.1666666666666649e-03 887 459 -1.0416666666666664e-02 888 888 2.9166666666666660e-02 888 457 -1.4465734552327348e-19 888 881 -4.1666666666666675e-03 888 45 -2.0833333333333329e-03 888 883 2.0833333333333333e-03 888 47 -1.0416666666666664e-02 888 50 -2.0833333333333329e-03 888 49 -1.0416666666666662e-03 888 887 4.1666666666666649e-03 888 459 -4.1666666666666657e-03 889 889 2.0833333333333329e-02 890 890 2.9166666666666660e-02 890 893 4.1666666666666675e-03 890 274 -1.4465734552327348e-19 890 263 -4.1666666666666657e-03 890 270 -1.0416666666666660e-03 890 268 1.2659172094511536e-19 890 891 4.1666666666666649e-03 890 449 -1.0416666666666664e-02 890 2856 -2.0833333333333329e-03 890 3482 -2.0833333333333333e-03 890 3412 -2.0833333333333329e-03 890 2846 -2.0833333333333329e-03 890 2855 -1.0416666666666662e-03 891 891 2.9166666666666660e-02 891 270 -2.0833333333333329e-03 891 448 -1.4465734552327348e-19 891 882 -4.1666666666666666e-03 891 263 -1.0416666666666664e-02 891 261 -2.0833333333333329e-03 891 884 2.0833333333333333e-03 891 268 -1.0416666666666664e-03 891 890 4.1666666666666649e-03 891 449 -4.1666666666666657e-03 891 3412 2.0833333333333329e-03 891 2846 -1.0416666666666664e-03 891 2855 9.9486666632977745e-20 892 892 2.9166666666666660e-02 892 274 1.4465734552327348e-19 892 445 -2.0833333333333329e-03 892 263 -4.1666666666666657e-03 892 264 -1.0416666666666664e-03 892 849 -4.1666666666666675e-03 892 850 2.0833333333333333e-03 892 262 -1.4465734552327348e-19 892 893 4.1666666666666649e-03 892 896 -2.0833333333333329e-03 892 449 -1.0416666666666664e-02 892 450 -1.0416666666666662e-03 892 2856 -2.0833333333333329e-03 893 893 2.9166666666666660e-02 893 890 4.1666666666666666e-03 893 270 -2.0833333333333329e-03 893 263 -1.0416666666666664e-02 893 264 -2.0833333333333329e-03 893 274 -1.0416666666666664e-03 893 892 4.1666666666666649e-03 893 896 2.0833333333333329e-03 893 449 -4.1666666666666657e-03 893 450 1.4465734552327348e-19 893 2855 -9.9486666632977745e-20 893 3482 2.0833333333333333e-03 893 2856 -1.0416666666666664e-03 894 894 2.9166666666666660e-02 894 900 -4.1666666666666675e-03 894 895 2.0833333333333333e-03 894 271 1.4465734552327348e-19 894 266 4.1666666666666657e-03 894 264 1.0416666666666664e-03 894 265 -1.4465734552327348e-19 894 531 4.1666666666666649e-03 894 530 -2.0833333333333329e-03 894 65 1.0416666666666664e-02 894 63 1.0416666666666662e-03 895 895 4.1666666666666664e-02 895 273 -2.0833333333333333e-03 895 65 2.0833333333333329e-03 895 894 2.0833333333333333e-03 895 266 -2.0833333333333329e-03 895 264 -6.2500000000000003e-03 895 900 2.0833333333333333e-03 895 271 3.7587087034409578e-19 895 991 -2.0833333333333333e-03 895 897 2.0833333333333333e-03 895 280 2.0833333333333333e-03 895 77 -2.0833333333333333e-03 895 278 2.0833333333333329e-03 895 284 -2.6745065309554533e-19 895 688 -2.0833333333333333e-03 895 82 -2.0833333333333329e-03 895 91 -6.2500000000000003e-03 895 687 2.0833333333333333e-03 895 99 3.7587087034409578e-19 895 541 2.0833333333333333e-03 895 540 -2.0833333333333333e-03 895 67 2.0833333333333333e-03 895 63 -2.6745065309554533e-19 896 896 4.1666666666666664e-02 896 263 -2.0833333333333333e-03 896 280 2.0833333333333329e-03 896 897 2.0833333333333337e-03 896 273 -2.0833333333333329e-03 896 264 -6.2499999999999995e-03 896 993 2.0833333333333337e-03 896 274 4.1202858928001372e-19 896 82 -2.0833333333333333e-03 896 451 2.0833333333333329e-03 896 853 -2.0833333333333337e-03 896 87 -2.0833333333333329e-03 896 91 -6.2499999999999995e-03 896 856 2.0833333333333337e-03 896 98 4.1202858928001372e-19 896 689 2.0833333333333337e-03 896 688 -2.0833333333333333e-03 896 278 2.0833333333333333e-03 896 284 -4.1202858928001372e-19 896 893 2.0833333333333337e-03 896 892 -2.0833333333333333e-03 896 449 2.0833333333333333e-03 896 450 -4.1202858928001372e-19 896 2513 6.2499999999999986e-03 896 2856 6.2499999999999986e-03 897 897 2.9166666666666660e-02 897 993 -4.1666666666666666e-03 897 896 2.0833333333333333e-03 897 274 1.4465734552327348e-19 897 273 4.1666666666666657e-03 897 264 1.0416666666666664e-03 897 271 -9.9486666632977745e-20 897 991 4.1666666666666649e-03 897 895 2.0833333333333329e-03 897 280 1.0416666666666664e-02 897 284 1.0416666666666664e-03 897 2513 2.0833333333333329e-03 898 898 2.9166666666666660e-02 898 899 4.1666666666666666e-03 898 272 -2.0833333333333329e-03 898 266 -1.0416666666666664e-02 898 257 -2.0833333333333329e-03 898 267 -1.0416666666666664e-03 898 871 -4.1666666666666649e-03 898 65 -4.1666666666666657e-03 899 899 2.9166666666666660e-02 899 898 4.1666666666666666e-03 899 267 -1.2659172094511536e-19 899 266 -4.1666666666666657e-03 899 272 -1.0416666666666664e-03 899 271 1.4465734552327348e-19 899 900 4.1666666666666649e-03 899 65 -1.0416666666666664e-02 900 900 2.9166666666666660e-02 900 63 -1.4465734552327348e-19 900 894 -4.1666666666666675e-03 900 264 -2.0833333333333329e-03 900 895 2.0833333333333333e-03 900 266 -1.0416666666666664e-02 900 272 -2.0833333333333329e-03 900 271 -1.0416666666666662e-03 900 899 4.1666666666666649e-03 900 65 -4.1666666666666657e-03 901 901 2.0833333333333329e-02 902 902 2.0833333333333331e-10 903 903 2.9166666666666664e-10 903 343 -1.1000665323307010e-27 903 336 4.1666666666666665e-11 903 335 1.0416666666666665e-11 903 909 4.1666666666666665e-11 903 334 1.3233141685082473e-27 903 910 -4.1666666666666652e-11 903 396 1.0416666666666666e-10 904 904 2.0833333333333331e-10 905 905 2.9166666666666664e-10 905 615 4.1666666666666665e-11 905 338 1.1213657767716683e-27 905 337 4.1666666666666665e-11 905 335 1.0416666666666665e-11 905 334 -1.1000665323307010e-27 905 908 4.1666666666666652e-11 905 185 1.0416666666666666e-10 906 906 4.1666666666666662e-10 906 336 2.0833333333333329e-11 906 185 -2.0833333333333329e-11 906 914 2.0833333333333336e-11 906 337 2.0833333333333326e-11 906 339 6.2499999999999991e-11 906 908 2.0833333333333336e-11 906 334 -2.1169082391605852e-27 906 909 2.0833333333333326e-11 906 911 2.0833333333333326e-11 906 396 -2.0833333333333329e-11 906 417 2.0833333333333329e-11 906 394 -2.0833333333333329e-11 906 397 3.7324953730532174e-27 906 769 2.0833333333333336e-11 906 404 2.0833333333333326e-11 906 414 6.2499999999999991e-11 906 768 -2.0833333333333336e-11 906 416 -2.1169082391605852e-27 906 907 2.0833333333333326e-11 906 915 -2.0833333333333326e-11 906 179 -2.0833333333333329e-11 906 177 3.7324953730532174e-27 907 907 2.9166666666666664e-10 907 765 4.1666666666666665e-11 907 403 2.0833333333333332e-11 907 417 1.0416666666666666e-10 907 414 2.0833333333333329e-11 907 416 1.0416666666666663e-11 907 915 4.1666666666666652e-11 907 906 2.0833333333333326e-11 907 179 4.1666666666666658e-11 907 177 -1.1213657767716683e-27 908 908 2.9166666666666659e-10 908 177 1.1000665323307010e-27 908 914 -4.1666666666666665e-11 908 339 2.0833333333333332e-11 908 906 2.0833333333333336e-11 908 337 1.0416666666666666e-10 908 335 2.0833333333333329e-11 908 334 1.0416666666666661e-11 908 905 4.1666666666666652e-11 908 185 4.1666666666666665e-11 909 909 2.9166666666666664e-10 909 339 2.0833333333333329e-11 909 911 -4.1666666666666652e-11 909 906 2.0833333333333326e-11 909 397 -1.1213657767716683e-27 909 396 4.1666666666666658e-11 909 903 4.1666666666666665e-11 909 336 1.0416666666666666e-10 909 335 2.0833333333333332e-11 909 334 1.0416666666666663e-11 910 910 2.9166666666666664e-10 910 335 -2.0833333333333329e-11 910 913 4.1666666666666665e-11 910 336 -1.0416666666666666e-10 910 342 -2.0833333333333332e-11 910 343 -1.0416666666666661e-11 910 903 -4.1666666666666652e-11 910 396 -4.1666666666666658e-11 910 1096 -1.1000665323307010e-27 910 1703 2.0833333333333336e-11 911 911 2.9166666666666659e-10 911 912 4.1666666666666665e-11 911 916 -2.0833333333333336e-11 911 340 -1.3020149240672800e-27 911 336 -4.1666666666666658e-11 911 339 -1.0416666666666661e-11 911 334 1.3233141685082473e-27 911 909 -4.1666666666666652e-11 911 906 2.0833333333333326e-11 911 396 -1.0416666666666666e-10 911 397 -1.0416666666666661e-11 911 1097 -2.0833333333333332e-11 912 912 2.9166666666666664e-10 912 342 -2.0833333333333329e-11 912 913 4.1666666666666652e-11 912 396 -4.1666666666666665e-11 912 397 -1.1213657767716683e-27 912 911 4.1666666666666665e-11 912 336 -1.0416666666666666e-10 912 339 -2.0833333333333332e-11 912 916 2.0833333333333336e-11 912 340 -1.0416666666666663e-11 912 2044 2.0833333333333332e-11 912 1096 1.1000665323307010e-27 912 1097 -1.0416666666666665e-11 913 913 2.9166666666666659e-10 913 910 4.1666666666666665e-11 913 343 -1.1000665323307010e-27 913 336 -4.1666666666666665e-11 913 342 -1.0416666666666665e-11 913 340 1.3020149240672800e-27 913 912 4.1666666666666652e-11 913 396 -1.0416666666666666e-10 913 1703 -2.0833333333333336e-11 913 2044 -2.0833333333333326e-11 913 1097 -2.0833333333333329e-11 913 1096 -1.0416666666666661e-11 914 914 2.9166666666666659e-10 914 348 1.5039633158038590e-27 914 337 -4.1666666666666658e-11 914 339 -1.0416666666666661e-11 914 908 -4.1666666666666665e-11 914 906 2.0833333333333336e-11 914 334 -1.1000665323307010e-27 914 598 -4.1666666666666652e-11 914 597 2.0833333333333326e-11 914 185 -1.0416666666666666e-10 914 181 -2.0833333333333329e-11 914 177 -1.0416666666666661e-11 915 915 2.9166666666666659e-10 915 181 2.0833333333333332e-11 915 602 4.1666666666666665e-11 915 597 -2.0833333333333336e-11 915 422 1.3020149240672800e-27 915 417 4.1666666666666658e-11 915 414 1.0416666666666661e-11 915 416 -1.3233141685082473e-27 915 907 4.1666666666666652e-11 915 906 -2.0833333333333326e-11 915 179 1.0416666666666666e-10 915 177 1.0416666666666661e-11 916 916 4.1666666666666662e-10 916 341 -2.0833333333333329e-11 916 396 2.0833333333333329e-11 916 911 -2.0833333333333336e-11 916 336 -2.0833333333333326e-11 916 339 -6.2499999999999991e-11 916 912 2.0833333333333336e-11 916 340 2.1169082391605852e-27 916 404 -2.0833333333333329e-11 916 474 2.0833333333333329e-11 916 919 2.0833333333333336e-11 916 415 -2.0833333333333326e-11 916 414 -6.2499999999999991e-11 916 922 -2.0833333333333336e-11 916 413 2.1169082391605852e-27 916 770 2.0833333333333326e-11 916 769 -2.0833333333333326e-11 916 394 2.0833333333333329e-11 916 397 -3.5628902784306998e-27 916 921 -2.0833333333333326e-11 916 917 2.0833333333333326e-11 916 469 2.0833333333333329e-11 916 468 -3.5628902784306998e-27 916 1097 6.2499999999999991e-11 916 1581 6.2499999999999991e-11 917 917 2.9166666666666659e-10 917 473 2.0833333333333332e-11 917 929 -4.1666666666666665e-11 917 918 2.0833333333333336e-11 917 347 1.1000665323307010e-27 917 341 4.1666666666666658e-11 917 339 1.0416666666666661e-11 917 340 -1.5039633158038590e-27 917 921 4.1666666666666652e-11 917 916 2.0833333333333326e-11 917 469 1.0416666666666666e-10 917 468 1.0416666666666661e-11 917 1581 2.0833333333333329e-11 918 918 4.1666666666666662e-10 918 415 -2.0833333333333329e-11 918 166 2.0833333333333329e-11 918 920 2.0833333333333336e-11 918 424 -2.0833333333333326e-11 918 414 -6.2499999999999991e-11 918 1069 -2.0833333333333336e-11 918 425 2.1169082391605852e-27 918 325 -2.0833333333333329e-11 918 469 2.0833333333333329e-11 918 917 2.0833333333333336e-11 918 341 -2.0833333333333326e-11 918 339 -6.2499999999999991e-11 918 929 2.0833333333333336e-11 918 347 2.1169082391605852e-27 918 724 2.0833333333333326e-11 918 725 -2.0833333333333326e-11 918 165 2.0833333333333329e-11 918 173 6.2500000000000004e-11 918 175 -3.7324953730532174e-27 918 923 2.0833333333333326e-11 918 919 2.0833333333333326e-11 918 474 2.0833333333333329e-11 918 473 6.2500000000000004e-11 918 468 -3.7324953730532174e-27 919 919 2.9166666666666659e-10 919 425 -1.3233141685082473e-27 919 415 4.1666666666666658e-11 919 414 1.0416666666666661e-11 919 922 4.1666666666666665e-11 919 916 2.0833333333333336e-11 919 413 1.3020149240672800e-27 919 923 -4.1666666666666652e-11 919 918 2.0833333333333326e-11 919 474 1.0416666666666666e-10 919 473 2.0833333333333329e-11 919 468 1.0416666666666661e-11 919 1581 2.0833333333333332e-11 920 920 2.9166666666666659e-10 920 173 2.0833333333333332e-11 920 1069 4.1666666666666665e-11 920 918 2.0833333333333336e-11 920 425 1.1000665323307010e-27 920 424 4.1666666666666658e-11 920 414 1.0416666666666661e-11 920 422 -1.5039633158038590e-27 920 603 4.1666666666666652e-11 920 597 -2.0833333333333326e-11 920 166 1.0416666666666666e-10 920 155 2.0833333333333329e-11 920 175 1.0416666666666661e-11 921 921 2.9166666666666664e-10 921 930 -4.1666666666666665e-11 921 342 2.0833333333333332e-11 921 341 1.0416666666666666e-10 921 339 2.0833333333333329e-11 921 340 1.0416666666666663e-11 921 917 4.1666666666666652e-11 921 916 -2.0833333333333326e-11 921 469 4.1666666666666665e-11 921 468 -1.1000665323307010e-27 921 1580 1.3233141685082473e-27 921 2044 -2.0833333333333339e-11 921 1581 1.0416666666666665e-11 922 922 2.9166666666666664e-10 922 420 2.0833333333333329e-11 922 468 1.1213657767716683e-27 922 919 4.1666666666666665e-11 922 415 1.0416666666666666e-10 922 414 2.0833333333333332e-11 922 916 -2.0833333333333336e-11 922 413 1.0416666666666663e-11 922 924 -4.1666666666666652e-11 922 474 4.1666666666666665e-11 922 2053 -2.0833333333333332e-11 922 1581 1.0416666666666665e-11 922 1588 -1.1000665323307010e-27 923 923 2.9166666666666664e-10 923 475 -1.5039633158038590e-27 923 925 4.1666666666666665e-11 923 426 -2.0833333333333332e-11 923 1068 -2.0833333333333336e-11 923 415 -1.0416666666666666e-10 923 414 -2.0833333333333329e-11 923 425 -1.0416666666666663e-11 923 919 -4.1666666666666652e-11 923 918 2.0833333333333326e-11 923 474 -4.1666666666666658e-11 923 473 -1.0416666666666665e-11 923 468 1.1213657767716683e-27 924 924 2.9166666666666659e-10 924 413 1.3020149240672800e-27 924 415 -4.1666666666666665e-11 924 420 -1.0416666666666665e-11 924 926 4.1666666666666665e-11 924 419 -1.1000665323307010e-27 924 922 -4.1666666666666652e-11 924 474 -1.0416666666666666e-10 924 1589 -2.0833333333333332e-11 924 2260 -2.0833333333333336e-11 924 2053 -2.0833333333333326e-11 924 1581 -2.0833333333333329e-11 924 1588 -1.0416666666666661e-11 925 925 2.9166666666666664e-10 925 419 1.1000665323307010e-27 925 473 -2.0833333333333332e-11 925 415 -4.1666666666666665e-11 925 426 -1.0416666666666665e-11 925 923 4.1666666666666665e-11 925 1068 2.0833333333333339e-11 925 425 -1.3233141685082473e-27 925 926 4.1666666666666652e-11 925 1033 2.0833333333333326e-11 925 474 -1.0416666666666666e-10 925 475 -1.0416666666666663e-11 925 1589 -2.0833333333333329e-11 926 926 2.9166666666666664e-10 926 426 -2.0833333333333329e-11 926 924 4.1666666666666665e-11 926 415 -1.0416666666666666e-10 926 420 -2.0833333333333332e-11 926 419 -1.0416666666666661e-11 926 925 4.1666666666666652e-11 926 1033 -2.0833333333333326e-11 926 474 -4.1666666666666658e-11 926 475 1.5039633158038590e-27 926 1588 -1.1000665323307010e-27 926 2260 2.0833333333333336e-11 926 1589 -1.0416666666666661e-11 927 927 2.9166666666666659e-10 927 697 -4.1666666666666665e-11 927 694 2.0833333333333336e-11 927 418 -1.1000665323307010e-27 927 417 -4.1666666666666665e-11 927 423 -1.0416666666666665e-11 927 422 1.3020149240672800e-27 927 602 -4.1666666666666652e-11 927 595 2.0833333333333326e-11 927 179 -1.0416666666666666e-10 927 181 -2.0833333333333329e-11 927 192 -1.0416666666666661e-11 928 928 2.9166666666666664e-10 928 347 1.1000665323307010e-27 928 341 -4.1666666666666665e-11 928 345 -1.0416666666666665e-11 928 931 4.1666666666666665e-11 928 1064 -2.0833333333333336e-11 928 344 -1.1213657767716683e-27 928 929 4.1666666666666652e-11 928 1065 -2.0833333333333332e-11 928 469 -1.0416666666666666e-10 928 473 -2.0833333333333329e-11 928 472 -1.0416666666666663e-11 928 1595 -2.0833333333333332e-11 929 929 2.9166666666666659e-10 929 468 -1.1000665323307010e-27 929 917 -4.1666666666666665e-11 929 339 -2.0833333333333332e-11 929 918 2.0833333333333336e-11 929 341 -1.0416666666666666e-10 929 345 -2.0833333333333329e-11 929 347 -1.0416666666666661e-11 929 928 4.1666666666666652e-11 929 1065 2.0833333333333326e-11 929 469 -4.1666666666666665e-11 929 473 -1.0416666666666665e-11 929 472 1.3020149240672800e-27 930 930 2.9166666666666664e-10 930 344 1.1213657767716683e-27 930 341 -4.1666666666666658e-11 930 342 -1.0416666666666665e-11 930 921 -4.1666666666666665e-11 930 340 -1.5039633158038590e-27 930 931 4.1666666666666652e-11 930 469 -1.0416666666666666e-10 930 1581 -2.0833333333333332e-11 930 2044 -2.0833333333333336e-11 930 2047 -2.0833333333333326e-11 930 1595 -2.0833333333333329e-11 930 1580 -1.0416666666666663e-11 931 931 2.9166666666666664e-10 931 342 -2.0833333333333329e-11 931 472 -1.3020149240672800e-27 931 928 4.1666666666666665e-11 931 341 -1.0416666666666666e-10 931 345 -2.0833333333333332e-11 931 1064 2.0833333333333336e-11 931 344 -1.0416666666666661e-11 931 930 4.1666666666666652e-11 931 469 -4.1666666666666658e-11 931 2047 2.0833333333333326e-11 931 1595 -1.0416666666666661e-11 931 1580 1.3233141685082473e-27 932 932 2.0833333333333329e-02 933 933 2.9166666666666660e-02 933 50 1.0416666666666664e-03 933 937 4.1666666666666675e-03 933 49 1.4465734552327348e-19 933 2862 -1.4465734552327348e-19 933 2861 4.1666666666666657e-03 933 3039 4.1666666666666649e-03 933 2361 1.0416666666666664e-02 934 934 2.0833333333333332e-02 935 935 2.0833333333333332e-02 936 936 2.9166666666666660e-02 936 50 1.0416666666666664e-03 936 3036 4.1666666666666666e-03 936 2862 1.4465734552327348e-19 936 2863 4.1666666666666657e-03 936 2867 -9.9486666632977745e-20 936 3416 4.1666666666666649e-03 936 2366 1.0416666666666664e-02 937 937 2.9166666666666660e-02 937 45 2.0833333333333329e-03 937 885 4.1666666666666649e-03 937 883 -2.0833333333333329e-03 937 245 -1.4465734552327348e-19 937 933 4.1666666666666675e-03 937 50 2.0833333333333329e-03 937 49 1.0416666666666662e-03 937 2361 4.1666666666666657e-03 937 2861 1.0416666666666664e-02 938 938 4.1666666666666664e-02 938 941 2.0833333333333333e-03 938 480 6.2500000000000003e-03 938 121 2.0833333333333333e-03 938 446 -2.0833333333333329e-03 938 860 2.0833333333333333e-03 938 137 2.0833333333333329e-03 938 141 6.2500000000000003e-03 938 859 -2.0833333333333333e-03 938 140 -2.6745065309554533e-19 938 568 -2.0833333333333333e-03 938 569 2.0833333333333333e-03 938 113 -2.0833333333333333e-03 938 118 4.1202858928001372e-19 938 950 -2.0833333333333333e-03 938 452 4.1202858928001372e-19 938 2473 2.0833333333333333e-03 938 2486 -2.0833333333333329e-03 938 2475 2.0833333333333329e-03 938 3472 2.0833333333333333e-03 938 2474 -2.6745065309554533e-19 938 2490 -6.2499999999999995e-03 938 3460 2.0833333333333333e-03 938 2851 -2.0833333333333333e-03 938 2852 -6.2499999999999995e-03 939 939 2.0833333541666665e-02 939 290 2.0833333333333329e-11 939 947 -2.0833333333333339e-11 939 228 2.0833333333333332e-11 939 224 2.0833333333333329e-03 939 231 -1.0416666529976728e-11 939 940 2.0833333333333333e-03 939 478 -2.0833333333333329e-03 939 943 2.0833333333333333e-03 939 479 4.1202858928001372e-19 939 945 -2.0833333333333333e-03 939 3474 -8.3333333333333330e-11 939 2470 -2.0833333333333333e-03 939 1619 3.1250000416666668e-03 939 2477 -6.2499999999999995e-03 939 3088 2.0833333333333333e-03 939 2406 2.0833333333333333e-03 939 1208 3.1250000416666664e-03 939 2414 -1.0416667070807258e-11 940 940 2.9166666666666660e-02 940 943 -4.1666666666666666e-03 940 939 2.0833333333333333e-03 940 479 9.9486666632977745e-20 940 478 4.1666666666666657e-03 940 477 -1.4465734552327348e-19 940 822 4.1666666666666649e-03 940 821 -2.0833333333333329e-03 940 224 1.0416666666666664e-02 940 221 2.0833333333333329e-03 940 231 1.0416666666666664e-03 940 1619 2.0833333333333329e-03 940 2477 1.0416666666666664e-03 941 941 2.9166666666666660e-02 941 938 2.0833333333333333e-03 941 480 -1.0416666666666660e-03 941 477 1.2659172094511536e-19 941 823 -4.1666666666666649e-03 941 819 2.0833333333333329e-03 941 112 -2.0833333333333329e-03 941 118 -1.0416666666666662e-03 941 2490 -2.0833333333333329e-03 941 3472 -4.1666666666666675e-03 941 2474 -1.4465734552327348e-19 941 2475 -4.1666666666666657e-03 941 2486 -1.0416666666666664e-02 942 942 2.9166666666666660e-02 942 486 1.4465734552327348e-19 942 221 -2.0833333333333329e-03 942 478 -4.1666666666666657e-03 942 480 -1.0416666666666660e-03 942 822 -4.1666666666666675e-03 942 819 2.0833333333333333e-03 942 477 -1.4465734552327348e-19 942 633 -4.1666666666666649e-03 942 632 2.0833333333333329e-03 942 224 -1.0416666666666664e-02 942 223 -2.0833333333333329e-03 942 220 -1.0416666666666662e-03 943 943 2.9166666666666660e-02 943 482 -2.0833333333333329e-03 943 944 4.1666666666666649e-03 943 946 -2.0833333333333329e-03 943 232 1.2659172094511536e-19 943 224 -4.1666666666666657e-03 943 231 -1.4465734552327348e-19 943 940 -4.1666666666666675e-03 943 478 -1.0416666666666664e-02 943 939 2.0833333333333333e-03 943 479 -1.0416666666666662e-03 943 1619 -1.0416666666666660e-03 943 2477 -2.0833333333333329e-03 944 944 2.9166666666666660e-02 944 223 -2.0833333333333329e-03 944 633 -4.1666666666666666e-03 944 634 2.0833333333333333e-03 944 486 -1.4465734552327348e-19 944 478 -4.1666666666666657e-03 944 482 -1.0416666666666664e-03 944 479 9.9486666632977745e-20 944 943 4.1666666666666649e-03 944 946 2.0833333333333329e-03 944 224 -1.0416666666666664e-02 944 232 -1.0416666666666664e-03 944 1619 -2.0833333333333329e-03 945 945 2.9166666666666660e-02 945 287 1.4465734552327348e-19 945 949 -4.1666666666666675e-03 945 482 2.0833333333333329e-03 945 946 2.0833333333333333e-03 945 479 1.0416666666666662e-03 945 939 -2.0833333333333329e-03 945 2470 1.0416666666666664e-02 945 2477 2.0833333333333329e-03 945 3088 4.1666666666666649e-03 945 2406 4.1666666666666657e-03 945 1208 1.0416666666666660e-03 945 2414 -1.4465734552327348e-19 946 946 2.0833333541666665e-02 946 296 2.0833333333333329e-11 946 226 -2.0833333333333326e-11 946 974 -2.0833333333333336e-11 946 299 2.0833333333333329e-11 946 310 6.2500000000000004e-11 946 948 2.0833333333333336e-11 946 300 -3.7324953730532174e-27 946 478 2.0833333333333333e-03 946 949 2.0833333333333333e-03 946 482 6.2500000000000003e-03 946 945 2.0833333333333333e-03 946 479 -3.7587087034409578e-19 946 943 -2.0833333333333333e-03 946 944 2.0833333333333333e-03 946 224 -2.0833333333333333e-03 946 232 4.0414059347091638e-19 946 712 -2.0833333333333326e-11 946 711 2.0833333333333326e-11 946 286 -2.0833333333333329e-11 946 287 -1.3668993825846281e-19 946 2406 -2.0833333333333329e-03 946 2470 2.0833333333333329e-03 946 1619 -3.1250000312499997e-03 946 1208 -3.1250000312499993e-03 947 947 2.4999999999999996e-10 947 939 -2.0833333333333336e-11 947 231 -1.0416666666666666e-11 947 228 -2.0833333333333326e-11 947 290 -2.0833333333333326e-11 947 2414 -1.0416666666666663e-11 947 3474 2.2913451068275814e-27 947 1619 -6.2500000000000004e-11 947 1618 -1.0416666666666663e-11 947 1787 -2.0833333333333336e-11 947 5004 -9.5018296033870872e-28 947 1208 -6.2500000000000004e-11 947 3781 -1.0416666666666666e-11 948 948 2.9166666666666659e-10 948 232 1.1000665323307010e-27 948 974 4.1666666666666665e-11 948 310 2.0833333333333332e-11 948 946 2.0833333333333336e-11 948 299 1.0416666666666666e-10 948 294 2.0833333333333329e-11 948 300 1.0416666666666661e-11 948 701 4.1666666666666652e-11 948 226 4.1666666666666658e-11 948 1816 -2.0833333333333326e-11 948 1619 1.0416666666666661e-11 948 1621 -1.5039633158038590e-27 949 949 2.9166666666666660e-02 949 945 -4.1666666666666675e-03 949 946 2.0833333333333333e-03 949 479 -1.4465734552327348e-19 949 482 -1.0416666666666664e-03 949 970 -2.0833333333333329e-03 949 287 -1.0416666666666662e-03 949 1208 -2.0833333333333329e-03 949 2470 -4.1666666666666657e-03 949 2478 1.4465734552327348e-19 949 3089 -4.1666666666666649e-03 949 2406 -1.0416666666666664e-02 949 2413 -2.0833333333333329e-03 950 950 2.9166666666666660e-02 950 453 2.0833333333333329e-03 950 954 -4.1666666666666675e-03 950 951 2.0833333333333333e-03 950 485 1.4465734552327348e-19 950 480 1.0416666666666660e-03 950 938 -2.0833333333333329e-03 950 452 1.0416666666666662e-03 950 2473 4.1666666666666657e-03 950 2474 -1.4465734552327348e-19 950 3460 4.1666666666666649e-03 950 2851 1.0416666666666664e-02 950 2852 2.0833333333333329e-03 951 951 4.1666666666666664e-02 951 137 -2.0833333333333333e-03 951 153 2.0833333333333329e-03 951 646 -2.0833333333333333e-03 951 127 -2.0833333333333329e-03 951 141 -6.2499999999999986e-03 951 645 2.0833333333333333e-03 951 143 2.6745065309554533e-19 951 483 -2.0833333333333333e-03 951 950 2.0833333333333333e-03 951 480 -6.2499999999999986e-03 951 954 2.0833333333333333e-03 951 485 2.6745065309554533e-19 951 962 -2.0833333333333333e-03 951 952 2.0833333333333333e-03 951 162 2.0833333333333333e-03 951 168 6.2500000000000003e-03 951 171 -3.7587087034409578e-19 951 861 2.0833333333333333e-03 951 860 -2.0833333333333333e-03 951 446 2.0833333333333333e-03 951 453 6.2500000000000003e-03 951 452 -3.7587087034409578e-19 951 2851 2.0833333333333329e-03 951 2473 -2.0833333333333329e-03 952 952 2.9166666666666660e-02 952 161 2.0833333333333329e-03 952 635 4.1666666666666675e-03 952 632 -2.0833333333333333e-03 952 486 1.4465734552327348e-19 952 483 4.1666666666666657e-03 952 480 1.0416666666666660e-03 952 485 -1.2659172094511536e-19 952 962 4.1666666666666649e-03 952 951 2.0833333333333329e-03 952 162 1.0416666666666664e-02 952 168 2.0833333333333329e-03 952 171 1.0416666666666662e-03 953 953 2.9166666666666660e-02 953 982 -2.0833333333333333e-03 953 484 -1.0416666666666664e-03 953 485 1.4465734552327348e-19 953 954 4.1666666666666649e-03 953 961 2.0833333333333329e-03 953 453 -2.0833333333333329e-03 953 456 -1.0416666666666664e-03 953 2849 -2.0833333333333329e-03 953 3446 -4.1666666666666666e-03 953 2472 -9.9486666632977745e-20 953 2473 -4.1666666666666657e-03 953 2851 -1.0416666666666664e-02 954 954 2.9166666666666660e-02 954 452 -1.4465734552327348e-19 954 950 -4.1666666666666675e-03 954 480 -2.0833333333333329e-03 954 951 2.0833333333333333e-03 954 484 -2.0833333333333329e-03 954 485 -1.0416666666666662e-03 954 953 4.1666666666666649e-03 954 961 -2.0833333333333329e-03 954 453 -1.0416666666666664e-03 954 456 1.4465734552327348e-19 954 2473 -1.0416666666666664e-02 954 2851 -4.1666666666666657e-03 955 955 2.9166666666666660e-02 955 97 -1.4465734552327348e-19 955 152 2.0833333333333329e-03 955 94 4.1666666666666657e-03 955 93 1.0416666666666664e-03 955 744 4.1666666666666675e-03 955 739 -2.0833333333333333e-03 955 92 1.4465734552327348e-19 955 596 4.1666666666666649e-03 955 595 -2.0833333333333329e-03 955 156 1.0416666666666664e-02 955 155 2.0833333333333329e-03 955 154 1.0416666666666662e-03 956 956 2.9166666666666664e-10 956 427 -1.1213657767716683e-27 956 155 2.0833333333333332e-11 956 424 4.1666666666666658e-11 956 423 1.0416666666666665e-11 956 603 4.1666666666666665e-11 956 595 -2.0833333333333336e-11 956 422 1.5039633158038590e-27 956 740 4.1666666666666652e-11 956 739 -2.0833333333333326e-11 956 166 1.0416666666666666e-10 956 152 2.0833333333333329e-11 956 154 1.0416666666666663e-11 957 957 2.9166666666666660e-02 957 96 -2.0833333333333329e-03 957 958 4.1666666666666649e-03 957 959 -2.0833333333333329e-03 957 169 9.9486666632977745e-20 957 156 -4.1666666666666657e-03 957 168 -1.0416666666666664e-03 957 167 -1.4465734552327348e-19 957 844 -4.1666666666666666e-03 957 94 -1.0416666666666664e-02 957 86 -2.0833333333333329e-03 957 842 2.0833333333333333e-03 957 95 -1.0416666666666664e-03 958 958 2.9166666666666660e-02 958 155 -2.0833333333333329e-03 958 596 -4.1666666666666675e-03 958 593 2.0833333333333333e-03 958 97 -1.4465734552327348e-19 958 94 -4.1666666666666657e-03 958 96 -1.0416666666666660e-03 958 95 1.2659172094511536e-19 958 957 4.1666666666666649e-03 958 959 2.0833333333333329e-03 958 156 -1.0416666666666664e-02 958 168 -2.0833333333333329e-03 958 169 -1.0416666666666662e-03 959 959 4.1666666666666664e-02 959 202 2.0833333333333333e-03 959 159 -2.0833333333333329e-03 959 605 2.0833333333333333e-03 959 196 2.0833333333333329e-03 959 200 6.2499999999999986e-03 959 606 -2.0833333333333333e-03 959 201 -2.6745065309554533e-19 959 94 2.0833333333333333e-03 959 451 -2.0833333333333329e-03 959 855 2.0833333333333333e-03 959 87 2.0833333333333329e-03 959 96 6.2499999999999986e-03 959 854 -2.0833333333333333e-03 959 95 -2.6745065309554533e-19 959 957 -2.0833333333333333e-03 959 958 2.0833333333333333e-03 959 156 -2.0833333333333333e-03 959 168 -6.2500000000000003e-03 959 169 3.7587087034409578e-19 959 960 2.0833333333333333e-03 959 963 -2.0833333333333333e-03 959 455 -2.0833333333333333e-03 959 453 -6.2500000000000003e-03 959 454 3.7587087034409578e-19 960 960 2.9166666666666660e-02 960 456 1.4465734552327348e-19 960 968 -4.1666666666666666e-03 960 203 2.0833333333333329e-03 960 961 2.0833333333333333e-03 960 202 1.0416666666666664e-02 960 200 2.0833333333333329e-03 960 201 1.0416666666666664e-03 960 963 4.1666666666666649e-03 960 959 2.0833333333333329e-03 960 455 4.1666666666666657e-03 960 453 1.0416666666666664e-03 960 454 -9.9486666632977745e-20 961 961 4.1666666666666664e-02 961 162 -2.0833333333333329e-03 961 976 2.0833333333333337e-03 961 483 2.0833333333333329e-03 961 484 6.2499999999999986e-03 961 962 2.0833333333333337e-03 961 485 -4.1202858928001372e-19 961 196 2.0833333333333333e-03 961 455 -2.0833333333333329e-03 961 968 2.0833333333333337e-03 961 202 2.0833333333333329e-03 961 203 6.2499999999999986e-03 961 960 2.0833333333333337e-03 961 201 -4.1202858928001372e-19 961 606 -2.0833333333333333e-03 961 607 2.0833333333333337e-03 961 159 -2.0833333333333333e-03 961 168 -6.2499999999999995e-03 961 170 4.1202858928001372e-19 961 954 -2.0833333333333333e-03 961 953 2.0833333333333337e-03 961 453 -6.2499999999999995e-03 961 456 4.1202858928001372e-19 961 2473 2.0833333333333333e-03 961 2851 -2.0833333333333333e-03 962 962 2.9166666666666660e-02 962 480 2.0833333333333329e-03 962 952 4.1666666666666649e-03 962 951 -2.0833333333333329e-03 962 171 -9.9486666632977745e-20 962 162 4.1666666666666657e-03 962 168 1.0416666666666664e-03 962 170 1.4465734552327348e-19 962 976 -4.1666666666666666e-03 962 483 1.0416666666666664e-02 962 484 2.0833333333333329e-03 962 961 2.0833333333333333e-03 962 485 1.0416666666666664e-03 963 963 2.9166666666666660e-02 963 967 -4.1666666666666675e-03 963 964 2.0833333333333333e-03 963 213 1.4465734552327348e-19 963 202 4.1666666666666657e-03 963 200 1.0416666666666660e-03 963 201 -1.2659172094511536e-19 963 960 4.1666666666666649e-03 963 959 -2.0833333333333329e-03 963 455 1.0416666666666664e-02 963 453 2.0833333333333329e-03 963 454 1.0416666666666662e-03 963 2856 2.0833333333333329e-03 964 964 4.1666666666666664e-02 964 87 -2.0833333333333333e-03 964 278 2.0833333333333329e-03 964 690 -2.0833333333333333e-03 964 82 -2.0833333333333329e-03 964 96 -6.2500000000000003e-03 964 689 2.0833333333333333e-03 964 98 2.6745065309554533e-19 964 209 -2.0833333333333333e-03 964 455 2.0833333333333329e-03 964 963 2.0833333333333333e-03 964 202 -2.0833333333333329e-03 964 200 -6.2500000000000003e-03 964 967 2.0833333333333333e-03 964 213 2.6745065309554533e-19 964 994 -2.0833333333333333e-03 964 965 2.0833333333333333e-03 964 283 2.0833333333333333e-03 964 285 -4.1202858928001372e-19 964 856 2.0833333333333333e-03 964 855 -2.0833333333333333e-03 964 451 2.0833333333333333e-03 964 454 -4.1202858928001372e-19 964 2513 6.2499999999999995e-03 964 2856 6.2499999999999995e-03 965 965 2.9166666666666660e-02 965 684 4.1666666666666675e-03 965 682 -2.0833333333333333e-03 965 214 1.4465734552327348e-19 965 209 4.1666666666666657e-03 965 200 1.0416666666666660e-03 965 213 -1.4465734552327348e-19 965 994 4.1666666666666649e-03 965 964 2.0833333333333329e-03 965 283 1.0416666666666664e-02 965 285 1.0416666666666662e-03 965 2513 2.0833333333333329e-03 966 966 2.9166666666666660e-02 966 969 4.1666666666666675e-03 966 218 -1.4465734552327348e-19 966 202 -4.1666666666666657e-03 966 212 -1.0416666666666664e-03 966 213 1.4465734552327348e-19 966 967 4.1666666666666649e-03 966 455 -1.0416666666666664e-02 966 2849 -2.0833333333333329e-03 966 3447 -2.0833333333333333e-03 966 3483 -2.0833333333333329e-03 966 2856 -2.0833333333333329e-03 966 2857 -1.0416666666666662e-03 967 967 2.9166666666666660e-02 967 454 -9.9486666632977745e-20 967 963 -4.1666666666666666e-03 967 200 -2.0833333333333329e-03 967 964 2.0833333333333333e-03 967 202 -1.0416666666666664e-02 967 212 -2.0833333333333329e-03 967 213 -1.0416666666666664e-03 967 966 4.1666666666666649e-03 967 455 -4.1666666666666657e-03 967 3483 2.0833333333333329e-03 967 2856 -1.0416666666666664e-03 967 2857 1.4465734552327348e-19 968 968 2.9166666666666660e-02 968 218 1.4465734552327348e-19 968 453 -2.0833333333333329e-03 968 202 -4.1666666666666657e-03 968 203 -1.0416666666666664e-03 968 960 -4.1666666666666666e-03 968 961 2.0833333333333337e-03 968 201 -1.2659172094511536e-19 968 969 4.1666666666666649e-03 968 982 -2.0833333333333329e-03 968 455 -1.0416666666666664e-02 968 456 -1.0416666666666664e-03 968 2849 -2.0833333333333329e-03 969 969 2.9166666666666660e-02 969 966 4.1666666666666675e-03 969 212 -2.0833333333333329e-03 969 202 -1.0416666666666664e-02 969 203 -2.0833333333333329e-03 969 218 -1.0416666666666662e-03 969 968 4.1666666666666649e-03 969 982 2.0833333333333329e-03 969 455 -4.1666666666666657e-03 969 456 1.4465734552327348e-19 969 2857 -1.4465734552327348e-19 969 3447 2.0833333333333333e-03 969 2849 -1.0416666666666660e-03 970 970 2.0833333541666665e-02 970 304 -2.0833333333333329e-11 970 286 2.0833333333333329e-11 970 711 -2.0833333333333336e-11 970 296 -2.0833333333333326e-11 970 310 -6.2499999999999991e-11 970 710 2.0833333333333339e-11 970 305 3.5628902784306998e-27 970 979 -2.0833333333333332e-11 970 975 2.0833333333333326e-11 970 319 2.0833333333333329e-11 970 321 -7.8879979260055783e-21 970 973 2.0833333333333337e-03 970 482 -6.2499999999999995e-03 970 949 -2.0833333333333333e-03 970 287 -4.0414059491689842e-19 970 2470 -2.0833333333333333e-03 970 2671 2.0833333333333329e-03 970 2666 3.1250000312499993e-03 970 2479 -2.0833333333333329e-03 970 3215 -2.0833333333333337e-03 970 2478 4.1202858928001372e-19 970 3089 -2.0833333333333337e-03 970 2406 2.0833333333333333e-03 970 2413 3.1250000312499997e-03 971 971 2.9166666666666660e-02 971 486 -1.4465734552327348e-19 971 158 2.0833333333333329e-03 971 483 4.1666666666666657e-03 971 482 1.0416666666666664e-03 971 722 4.1666666666666675e-03 971 717 -2.0833333333333333e-03 971 481 1.4465734552327348e-19 971 635 4.1666666666666649e-03 971 634 -2.0833333333333329e-03 971 162 1.0416666666666664e-02 971 161 2.0833333333333329e-03 971 160 1.0416666666666662e-03 972 972 2.9166666666666664e-10 972 313 -1.1213657767716683e-27 972 161 2.0833333333333332e-11 972 311 4.1666666666666658e-11 972 310 1.0416666666666665e-11 972 642 4.1666666666666665e-11 972 634 -2.0833333333333336e-11 972 309 1.5039633158038590e-27 972 718 4.1666666666666652e-11 972 717 -2.0833333333333326e-11 972 164 1.0416666666666666e-10 972 158 2.0833333333333329e-11 972 160 1.0416666666666663e-11 973 973 2.9166666666666660e-02 973 970 2.0833333333333333e-03 973 482 1.0416666666666664e-03 973 481 -9.9486666632977745e-20 973 721 4.1666666666666649e-03 973 717 -2.0833333333333329e-03 973 315 2.0833333333333329e-03 973 321 1.0416666666666664e-03 973 2666 2.0833333333333329e-03 973 3215 4.1666666666666666e-03 973 2478 1.4465734552327348e-19 973 2479 4.1666666666666657e-03 973 2671 1.0416666666666664e-02 974 974 2.9166666666666659e-10 974 948 4.1666666666666665e-11 974 946 -2.0833333333333336e-11 974 300 1.1000665323307010e-27 974 299 4.1666666666666665e-11 974 310 1.0416666666666665e-11 974 309 -1.3020149240672800e-27 974 641 4.1666666666666652e-11 974 634 -2.0833333333333326e-11 974 226 1.0416666666666666e-10 974 223 2.0833333333333329e-11 974 232 1.0416666666666661e-11 974 1619 2.0833333333333332e-11 975 975 2.9166666666666659e-10 975 315 2.0833333333333332e-11 975 716 4.1666666666666665e-11 975 717 -2.0833333333333336e-11 975 313 1.1000665323307010e-27 975 304 4.1666666666666665e-11 975 310 1.0416666666666665e-11 975 305 -1.3020149240672800e-27 975 979 4.1666666666666652e-11 975 970 2.0833333333333326e-11 975 319 1.0416666666666666e-10 975 321 1.0416666666666661e-11 975 2666 2.0833333333333329e-11 976 976 2.9166666666666660e-02 976 168 -2.0833333333333329e-03 976 962 -4.1666666666666666e-03 976 961 2.0833333333333337e-03 976 485 -1.2659172094511536e-19 976 483 -4.1666666666666657e-03 976 484 -1.0416666666666664e-03 976 481 1.4465734552327348e-19 976 722 -4.1666666666666649e-03 976 713 2.0833333333333329e-03 976 162 -1.0416666666666664e-02 976 158 -2.0833333333333329e-03 976 170 -1.0416666666666664e-03 977 977 2.9166666666666660e-02 977 315 -2.0833333333333329e-03 977 484 -1.0416666666666664e-03 977 721 -4.1666666666666666e-03 977 713 2.0833333333333333e-03 977 481 -9.9486666632977745e-20 977 981 -2.0833333333333329e-03 977 314 -1.0416666666666664e-03 977 2480 1.4465734552327348e-19 977 2479 -4.1666666666666657e-03 977 3212 -4.1666666666666649e-03 977 2671 -1.0416666666666664e-02 977 2665 -2.0833333333333329e-03 978 978 2.0833333541666669e-02 978 296 2.0833333333333329e-11 978 319 -2.0833333333333329e-11 978 1019 -2.0833333333333336e-11 978 304 2.0833333333333326e-11 978 302 6.2499999999999991e-11 978 979 2.0833333333333336e-11 978 305 -2.1169082391605852e-27 978 288 -2.0833333333333333e-03 978 1011 8.3333333333333315e-03 978 322 1.0416666666666671e-03 978 710 -2.0833333333333326e-11 978 709 2.0833333333333326e-11 978 286 -2.0833333333333329e-11 978 289 1.0416666666666664e-03 978 3213 -2.0833333333333333e-03 978 2666 -4.1666666979166666e-03 978 2674 -2.0833333333333329e-03 978 2413 -4.1666666979166657e-03 979 979 2.9166666666666664e-10 979 310 2.0833333333333329e-11 979 975 4.1666666666666652e-11 979 970 -2.0833333333333332e-11 979 321 -1.1000665323307010e-27 979 319 4.1666666666666665e-11 979 322 1.1213657767716683e-27 979 1019 4.1666666666666665e-11 979 304 1.0416666666666666e-10 979 302 2.0833333333333332e-11 979 978 2.0833333333333336e-11 979 305 1.0416666666666663e-11 979 2666 1.0416666666666665e-11 980 980 2.9166666666666660e-02 980 986 -4.1666666666666666e-03 980 981 2.0833333333333337e-03 980 215 1.2659172094511536e-19 980 205 4.1666666666666657e-03 980 203 1.0416666666666664e-03 980 204 -1.4465734552327348e-19 980 714 4.1666666666666649e-03 980 713 -2.0833333333333329e-03 980 316 1.0416666666666664e-02 980 315 2.0833333333333329e-03 980 314 1.0416666666666664e-03 980 2665 2.0833333333333329e-03 981 981 4.1666666666666664e-02 981 217 -2.0833333333333333e-03 981 316 2.0833333333333329e-03 981 980 2.0833333333333337e-03 981 205 -2.0833333333333329e-03 981 203 -6.2499999999999986e-03 981 986 2.0833333333333337e-03 981 215 4.1202858928001372e-19 981 1008 -2.0833333333333333e-03 981 984 2.0833333333333337e-03 981 489 2.0833333333333333e-03 981 490 -4.1202858928001372e-19 981 983 2.0833333333333337e-03 981 484 -6.2499999999999986e-03 981 977 -2.0833333333333337e-03 981 314 -4.1202858928001372e-19 981 2479 -2.0833333333333333e-03 981 2425 2.0833333333333329e-03 981 2424 6.2499999999999995e-03 981 2467 -2.0833333333333329e-03 981 3074 -2.0833333333333337e-03 981 2480 4.1202858928001372e-19 981 3212 -2.0833333333333333e-03 981 2671 2.0833333333333333e-03 981 2665 6.2499999999999995e-03 982 982 4.1666666666666664e-02 982 202 -2.0833333333333333e-03 982 489 2.0833333333333329e-03 982 984 2.0833333333333333e-03 982 217 -2.0833333333333329e-03 982 203 -6.2499999999999995e-03 982 1010 2.0833333333333333e-03 982 218 4.1202858928001372e-19 982 953 -2.0833333333333333e-03 982 484 -6.2499999999999995e-03 982 983 2.0833333333333333e-03 982 490 -2.6745065309554533e-19 982 969 2.0833333333333333e-03 982 968 -2.0833333333333333e-03 982 455 2.0833333333333333e-03 982 456 -2.6745065309554533e-19 982 2467 -2.0833333333333333e-03 982 2851 2.0833333333333329e-03 982 2473 -2.0833333333333329e-03 982 3446 -2.0833333333333333e-03 982 2472 4.1202858928001372e-19 982 3076 -2.0833333333333333e-03 982 2425 2.0833333333333333e-03 982 2435 6.2500000000000003e-03 982 2849 6.2500000000000003e-03 983 983 2.9166666666666660e-02 983 981 2.0833333333333337e-03 983 484 1.0416666666666664e-03 983 982 2.0833333333333329e-03 983 490 1.0416666666666664e-03 983 2424 2.0833333333333329e-03 983 3074 4.1666666666666666e-03 983 2480 1.2659172094511536e-19 983 2467 4.1666666666666657e-03 983 2472 -1.4465734552327348e-19 983 3076 4.1666666666666649e-03 983 2425 1.0416666666666664e-02 983 2435 2.0833333333333329e-03 984 984 2.9166666666666660e-02 984 1010 -4.1666666666666666e-03 984 982 2.0833333333333333e-03 984 218 9.9486666632977745e-20 984 217 4.1666666666666657e-03 984 203 1.0416666666666664e-03 984 215 -1.4465734552327348e-19 984 1008 4.1666666666666649e-03 984 981 2.0833333333333329e-03 984 489 1.0416666666666664e-02 984 490 1.0416666666666664e-03 984 2435 2.0833333333333329e-03 984 2424 2.0833333333333329e-03 985 985 2.9166666666666660e-02 985 731 -4.1666666666666675e-03 985 206 -1.4465734552327348e-19 985 205 -4.1666666666666657e-03 985 216 -1.0416666666666660e-03 985 215 1.2659172094511536e-19 985 986 4.1666666666666649e-03 985 316 -1.0416666666666664e-02 985 2670 -2.0833333333333329e-03 985 3390 -2.0833333333333333e-03 985 3211 -2.0833333333333329e-03 985 2665 -2.0833333333333329e-03 985 2673 -1.0416666666666662e-03 986 986 2.9166666666666660e-02 986 314 -1.4465734552327348e-19 986 980 -4.1666666666666666e-03 986 203 -2.0833333333333329e-03 986 981 2.0833333333333333e-03 986 205 -1.0416666666666664e-02 986 216 -2.0833333333333329e-03 986 215 -1.0416666666666664e-03 986 985 4.1666666666666649e-03 986 316 -4.1666666666666657e-03 986 3211 2.0833333333333329e-03 986 2665 -1.0416666666666664e-03 986 2673 9.9486666632977745e-20 987 987 2.9166666666666660e-02 987 992 -4.1666666666666675e-03 987 275 1.4465734552327348e-19 987 273 4.1666666666666657e-03 987 270 1.0416666666666660e-03 987 274 -1.4465734552327348e-19 987 993 -4.1666666666666649e-03 987 280 1.0416666666666664e-02 987 3128 2.0833333333333333e-03 987 3482 2.0833333333333329e-03 987 2513 2.0833333333333329e-03 987 2512 1.0416666666666662e-03 988 988 2.0833333333333329e-02 989 989 2.9166666666666660e-02 989 275 -1.4465734552327348e-19 989 273 4.1666666666666657e-03 989 272 1.0416666666666664e-03 989 991 4.1666666666666666e-03 989 271 9.9486666632977745e-20 989 992 -4.1666666666666649e-03 989 280 1.0416666666666664e-02 990 990 2.0833333333333329e-02 991 991 2.9166666666666660e-02 991 264 2.0833333333333329e-03 991 897 4.1666666666666649e-03 991 895 -2.0833333333333329e-03 991 284 -1.2659172094511536e-19 991 280 4.1666666666666657e-03 991 989 4.1666666666666675e-03 991 273 1.0416666666666664e-02 991 272 2.0833333333333329e-03 991 271 1.0416666666666662e-03 992 992 2.9166666666666664e-02 992 272 -2.0833333333333329e-03 992 987 -4.1666666666666675e-03 992 273 -1.0416666666666664e-02 992 270 -2.0833333333333329e-03 992 275 -1.0416666666666662e-03 992 989 -4.1666666666666649e-03 992 280 -4.1666666666666657e-03 992 2512 -1.4465734552327348e-19 992 3128 2.0833333333333333e-03 993 993 2.9166666666666664e-02 993 270 -2.0833333333333329e-03 993 987 -4.1666666666666649e-03 993 280 -4.1666666666666657e-03 993 284 -1.2659172094511536e-19 993 897 -4.1666666666666666e-03 993 273 -1.0416666666666664e-02 993 264 -2.0833333333333329e-03 993 896 2.0833333333333337e-03 993 274 -1.0416666666666664e-03 993 3482 2.0833333333333329e-03 993 2512 1.4465734552327348e-19 993 2513 -1.0416666666666664e-03 994 994 2.9166666666666664e-02 994 200 2.0833333333333329e-03 994 965 4.1666666666666649e-03 994 964 -2.0833333333333329e-03 994 285 -1.4465734552327348e-19 994 283 4.1666666666666657e-03 994 1001 -4.1666666666666666e-03 994 209 1.0416666666666664e-02 994 212 2.0833333333333329e-03 994 213 1.0416666666666664e-03 994 2513 1.0416666666666664e-03 994 2514 1.2659172094511536e-19 994 3483 -2.0833333333333337e-03 995 995 2.0833333333333329e-02 996 996 2.9166666666666660e-02 996 214 -1.4465734552327348e-19 996 209 4.1666666666666657e-03 996 208 1.0416666666666664e-03 996 1000 4.1666666666666666e-03 996 207 9.9486666632977745e-20 996 684 4.1666666666666649e-03 996 283 1.0416666666666664e-02 997 997 2.0833333333333329e-02 998 998 2.9166666666666660e-02 998 1004 -4.1666666666666666e-03 998 211 1.2659172094511536e-19 998 210 4.1666666666666657e-03 998 208 1.0416666666666664e-03 998 207 -1.4465734552327348e-19 998 999 4.1666666666666649e-03 998 487 1.0416666666666664e-02 999 999 2.9166666666666660e-02 999 1002 -4.1666666666666675e-03 999 212 2.0833333333333329e-03 999 210 1.0416666666666664e-02 999 208 2.0833333333333329e-03 999 207 1.0416666666666662e-03 999 998 4.1666666666666649e-03 999 487 4.1666666666666657e-03 999 2548 1.4465734552327348e-19 999 3484 -2.0833333333333333e-03 1000 1000 2.9166666666666660e-02 1000 212 2.0833333333333329e-03 1000 1001 -4.1666666666666649e-03 1000 283 4.1666666666666657e-03 1000 996 4.1666666666666675e-03 1000 209 1.0416666666666664e-02 1000 208 2.0833333333333329e-03 1000 207 1.0416666666666662e-03 1000 3484 -2.0833333333333329e-03 1000 2514 -1.2659172094511536e-19 1001 1001 2.9166666666666660e-02 1001 994 -4.1666666666666666e-03 1001 213 -1.4465734552327348e-19 1001 209 -4.1666666666666657e-03 1001 212 -1.0416666666666664e-03 1001 207 9.9486666632977745e-20 1001 1000 -4.1666666666666649e-03 1001 283 -1.0416666666666664e-02 1001 2513 -2.0833333333333329e-03 1001 3483 -2.0833333333333333e-03 1001 3484 -2.0833333333333329e-03 1001 2514 -1.0416666666666664e-03 1002 1002 2.9166666666666660e-02 1002 219 1.4465734552327348e-19 1002 210 -4.1666666666666657e-03 1002 212 -1.0416666666666664e-03 1002 999 -4.1666666666666675e-03 1002 207 -1.4465734552327348e-19 1002 1003 4.1666666666666649e-03 1002 487 -1.0416666666666664e-02 1002 3484 -2.0833333333333333e-03 1002 3157 -2.0833333333333329e-03 1002 2553 -2.0833333333333329e-03 1002 2548 -1.0416666666666662e-03 1003 1003 2.9166666666666660e-02 1003 1005 4.1666666666666666e-03 1003 216 -2.0833333333333329e-03 1003 210 -1.0416666666666664e-02 1003 212 -2.0833333333333329e-03 1003 219 -1.0416666666666664e-03 1003 1002 4.1666666666666649e-03 1003 487 -4.1666666666666657e-03 1003 2561 -9.9486666632977745e-20 1003 3158 2.0833333333333333e-03 1003 3157 2.0833333333333329e-03 1003 2553 -1.0416666666666664e-03 1003 2548 1.4465734552327348e-19 1004 1004 2.9166666666666660e-02 1004 216 -2.0833333333333329e-03 1004 1005 4.1666666666666649e-03 1004 487 -4.1666666666666657e-03 1004 998 -4.1666666666666666e-03 1004 210 -1.0416666666666664e-02 1004 208 -2.0833333333333329e-03 1004 211 -1.0416666666666664e-03 1004 3534 2.0833333333333329e-03 1004 2561 9.9486666632977745e-20 1005 1005 2.9166666666666660e-02 1005 1003 4.1666666666666675e-03 1005 219 -1.4465734552327348e-19 1005 210 -4.1666666666666657e-03 1005 216 -1.0416666666666660e-03 1005 211 1.2659172094511536e-19 1005 1004 4.1666666666666649e-03 1005 487 -1.0416666666666664e-02 1005 2553 -2.0833333333333329e-03 1005 3158 -2.0833333333333333e-03 1005 3534 -2.0833333333333329e-03 1005 2561 -1.0416666666666662e-03 1006 1006 2.9166666666666660e-02 1006 1009 -4.1666666666666666e-03 1006 219 1.4465734552327348e-19 1006 217 4.1666666666666657e-03 1006 212 1.0416666666666664e-03 1006 218 -9.9486666632977745e-20 1006 1010 -4.1666666666666649e-03 1006 489 1.0416666666666664e-02 1006 2432 2.0833333333333329e-03 1006 3157 2.0833333333333333e-03 1006 3447 2.0833333333333329e-03 1006 2435 2.0833333333333329e-03 1006 2437 1.0416666666666664e-03 1007 1007 2.9166666666666660e-02 1007 219 -1.4465734552327348e-19 1007 217 4.1666666666666657e-03 1007 216 1.0416666666666660e-03 1007 1008 4.1666666666666675e-03 1007 215 1.4465734552327348e-19 1007 1009 -4.1666666666666649e-03 1007 489 1.0416666666666664e-02 1007 2424 2.0833333333333329e-03 1007 3211 2.0833333333333333e-03 1007 3158 2.0833333333333329e-03 1007 2432 2.0833333333333329e-03 1007 2429 1.0416666666666662e-03 1008 1008 2.9166666666666664e-02 1008 203 2.0833333333333329e-03 1008 984 4.1666666666666649e-03 1008 981 -2.0833333333333329e-03 1008 490 -1.4465734552327348e-19 1008 489 4.1666666666666657e-03 1008 1007 4.1666666666666675e-03 1008 217 1.0416666666666664e-02 1008 216 2.0833333333333329e-03 1008 215 1.0416666666666662e-03 1008 2424 1.0416666666666664e-03 1008 2429 1.4465734552327348e-19 1008 3211 -2.0833333333333333e-03 1009 1009 2.9166666666666664e-02 1009 216 -2.0833333333333329e-03 1009 1006 -4.1666666666666666e-03 1009 217 -1.0416666666666664e-02 1009 212 -2.0833333333333329e-03 1009 219 -1.0416666666666664e-03 1009 1007 -4.1666666666666649e-03 1009 489 -4.1666666666666657e-03 1009 2437 -1.2659172094511536e-19 1009 3157 2.0833333333333337e-03 1009 3158 2.0833333333333329e-03 1009 2432 -1.0416666666666664e-03 1009 2429 1.4465734552327348e-19 1010 1010 2.9166666666666660e-02 1010 212 -2.0833333333333329e-03 1010 1006 -4.1666666666666649e-03 1010 489 -4.1666666666666657e-03 1010 490 -1.4465734552327348e-19 1010 984 -4.1666666666666675e-03 1010 217 -1.0416666666666664e-02 1010 203 -2.0833333333333329e-03 1010 982 2.0833333333333333e-03 1010 218 -1.0416666666666662e-03 1010 3447 2.0833333333333329e-03 1010 2437 1.2659172094511536e-19 1010 2435 -1.0416666666666660e-03 1011 1011 6.6666666666666652e-02 1011 978 8.3333333333333315e-03 1011 322 6.2500000000000003e-03 1011 1018 -8.3333333333333315e-03 1011 1012 2.7105054312137611e-20 1011 429 6.2500000000000003e-03 1011 431 -4.1666666666666666e-03 1011 1015 8.3333333333333315e-03 1011 1014 2.7105054312137611e-20 1011 293 6.2500000000000003e-03 1011 708 8.3333333333333315e-03 1011 289 6.2500000000000003e-03 1011 288 -4.1666666666666666e-03 1011 2668 -1.0416666666666669e-03 1011 2413 -1.0416666666666669e-03 1011 3213 2.7105054312137611e-20 1011 2666 -1.0416666666666667e-03 1011 2674 -4.1666666666666666e-03 1011 2834 -1.0416666666666667e-03 1011 3977 -1.0416666666666669e-03 1011 1454 -1.0416666666666669e-03 1011 1463 -1.0416666666666667e-03 1011 3971 -4.1666666666666666e-03 1011 4886 2.7105054312137611e-20 1011 3780 -1.0416666666666667e-03 1012 1012 2.4999999999999998e-02 1012 322 1.0416666666666664e-03 1012 1018 2.0833333333333337e-03 1012 1011 6.0159191589756597e-20 1012 429 1.0416666666666662e-03 1012 431 2.0833333333333329e-03 1012 2833 1.0416666666666664e-03 1012 2834 6.2500000000000003e-03 1012 3382 2.0833333333333337e-03 1012 3383 -1.0254392617697373e-19 1012 2668 6.2500000000000003e-03 1012 2661 1.0416666666666664e-03 1012 2674 2.0833333333333329e-03 1013 1013 2.5000000000000001e-02 1013 431 2.0833333333333329e-03 1013 491 2.0833333333333329e-03 1013 2822 1.0416666666666664e-03 1013 3381 2.0833333333333337e-03 1013 3383 -1.0254392617697373e-19 1013 2833 1.0416666666666664e-03 1013 1458 6.2500000000000003e-03 1013 1457 1.0416666666666664e-03 1013 2194 2.0833333333333337e-03 1013 4597 6.0159191589756597e-20 1013 1646 6.2500000000000003e-03 1013 3957 1.0416666666666664e-03 1014 1014 2.4999999999999998e-02 1014 429 1.0416666666666664e-03 1014 1015 -2.0833333333333337e-03 1014 1011 6.0159191589756597e-20 1014 293 1.0416666666666664e-03 1014 431 2.0833333333333329e-03 1014 1463 6.2500000000000003e-03 1014 3972 1.0416666666666664e-03 1014 3971 2.0833333333333329e-03 1014 1937 2.0833333333333337e-03 1014 4597 -1.0254392617697373e-19 1014 1454 6.2500000000000003e-03 1014 1457 1.0416666666666664e-03 1015 1015 2.0833333541666669e-02 1015 303 2.0833333333333329e-11 1015 706 2.0833333333333336e-11 1015 302 6.2499999999999991e-11 1015 704 -2.0833333333333336e-11 1015 308 -2.1169082391605852e-27 1015 431 -2.0833333333333333e-03 1015 1014 -2.0833333333333333e-03 1015 1011 8.3333333333333315e-03 1015 293 1.0416666666666671e-03 1015 1016 2.0833333333333326e-11 1015 1017 -2.0833333333333326e-11 1015 430 -2.0833333333333329e-11 1015 429 1.0416666666666664e-03 1015 1470 -2.0833333333333329e-11 1015 1674 2.0833333333333326e-11 1015 1463 -4.1666666979166666e-03 1015 3971 -2.0833333333333329e-03 1015 1454 -4.1666666979166657e-03 1016 1016 2.9166666666666664e-10 1016 302 2.0833333333333329e-11 1016 1062 -4.1666666666666665e-11 1016 303 1.0416666666666666e-10 1016 308 1.0416666666666663e-11 1016 1017 4.1666666666666652e-11 1016 1015 2.0833333333333326e-11 1016 430 4.1666666666666665e-11 1016 429 -1.1000665323307010e-27 1016 1459 1.3233141685082473e-27 1016 1673 2.0833333333333332e-11 1016 1940 -2.0833333333333339e-11 1016 1454 1.0416666666666665e-11 1017 1017 2.9166666666666659e-10 1017 308 -1.5039633158038590e-27 1017 303 4.1666666666666658e-11 1017 302 1.0416666666666661e-11 1017 1022 4.1666666666666665e-11 1017 1018 2.0833333333333336e-11 1017 301 1.1000665323307010e-27 1017 1016 4.1666666666666652e-11 1017 1015 -2.0833333333333326e-11 1017 430 1.0416666666666666e-10 1017 429 1.0416666666666661e-11 1017 2834 2.0833333333333332e-11 1017 1454 2.0833333333333329e-11 1018 1018 2.0833333541666669e-02 1018 304 -2.0833333333333329e-11 1018 430 2.0833333333333329e-11 1018 1017 2.0833333333333336e-11 1018 303 -2.0833333333333326e-11 1018 302 -6.2499999999999991e-11 1018 1022 -2.0833333333333336e-11 1018 301 2.1169082391605852e-27 1018 1021 -2.0833333333333326e-11 1018 1019 2.0833333333333326e-11 1018 319 2.0833333333333329e-11 1018 322 -1.0416666666666664e-03 1018 1012 2.0833333333333337e-03 1018 1011 -8.3333333333333315e-03 1018 429 -1.0416666666666671e-03 1018 431 2.0833333333333329e-03 1018 2668 4.1666666979166657e-03 1018 2674 2.0833333333333333e-03 1018 2834 4.1666666979166666e-03 1019 1019 2.9166666666666659e-10 1019 979 4.1666666666666665e-11 1019 978 -2.0833333333333336e-11 1019 305 1.3020149240672800e-27 1019 304 4.1666666666666658e-11 1019 302 1.0416666666666661e-11 1019 301 -1.3233141685082473e-27 1019 1021 4.1666666666666652e-11 1019 1018 2.0833333333333326e-11 1019 319 1.0416666666666666e-10 1019 322 1.0416666666666661e-11 1019 2666 2.0833333333333332e-11 1019 2668 2.0833333333333329e-11 1020 1020 4.1666666666666662e-10 1020 303 2.0833333333333329e-11 1020 319 -2.0833333333333326e-11 1020 1063 2.0833333333333339e-11 1020 304 2.0833333333333329e-11 1020 306 6.2499999999999991e-11 1020 1021 2.0833333333333336e-11 1020 301 -3.5628902784306998e-27 1020 1022 2.0833333333333326e-11 1020 1060 2.0833333333333332e-11 1020 430 -2.0833333333333329e-11 1020 326 2.0833333333333329e-11 1020 428 -2.0833333333333326e-11 1020 432 3.5628902784306998e-27 1020 786 2.0833333333333339e-11 1020 331 2.0833333333333329e-11 1020 345 6.2499999999999991e-11 1020 785 -2.0833333333333336e-11 1020 346 -3.5628902784306998e-27 1020 727 -2.0833333333333326e-11 1020 726 2.0833333333333332e-11 1020 318 -2.0833333333333329e-11 1020 317 3.5628902784306998e-27 1020 2834 -6.2499999999999991e-11 1020 2668 -6.2499999999999991e-11 1021 1021 2.9166666666666664e-10 1021 317 1.5039633158038590e-27 1021 1063 -4.1666666666666665e-11 1021 306 2.0833333333333332e-11 1021 1020 2.0833333333333336e-11 1021 304 1.0416666666666666e-10 1021 302 2.0833333333333329e-11 1021 301 1.0416666666666663e-11 1021 1019 4.1666666666666652e-11 1021 1018 -2.0833333333333326e-11 1021 319 4.1666666666666658e-11 1021 322 -1.1213657767716683e-27 1021 2668 1.0416666666666665e-11 1022 1022 2.9166666666666664e-10 1022 306 2.0833333333333329e-11 1022 1060 -4.1666666666666652e-11 1022 1020 2.0833333333333326e-11 1022 432 -1.3020149240672800e-27 1022 430 4.1666666666666665e-11 1022 429 1.1000665323307010e-27 1022 1017 4.1666666666666665e-11 1022 303 1.0416666666666666e-10 1022 302 2.0833333333333332e-11 1022 1018 -2.0833333333333336e-11 1022 301 1.0416666666666661e-11 1022 2834 1.0416666666666665e-11 1023 1023 2.4999999999999996e-10 1023 233 1.0416666666666666e-11 1023 1025 2.0833333333333339e-11 1023 1281 1.0416666666666665e-11 1023 1726 -2.2913451068275814e-27 1023 1282 6.2499999999999991e-11 1023 1285 1.0416666666666666e-11 1023 1283 2.0833333333333326e-11 1023 2094 2.0833333333333336e-11 1023 1732 9.5018296033870872e-28 1023 1620 6.2500000000000004e-11 1023 1611 1.0416666666666665e-11 1023 1615 2.0833333333333326e-11 1024 1024 2.9166666666666664e-10 1024 381 -1.1000665323307010e-27 1024 374 4.1666666666666665e-11 1024 373 1.0416666666666665e-11 1024 1031 4.1666666666666665e-11 1024 1025 2.0833333333333339e-11 1024 372 1.3233141685082473e-27 1024 1035 -4.1666666666666652e-11 1024 291 1.0416666666666666e-10 1024 1282 2.0833333333333332e-11 1024 1915 2.0833333333333326e-11 1024 1278 2.0833333333333329e-11 1024 1285 1.0416666666666663e-11 1025 1025 4.1666666666666662e-10 1025 375 -2.0833333333333329e-11 1025 291 2.0833333333333326e-11 1025 1024 2.0833333333333339e-11 1025 374 -2.0833333333333329e-11 1025 373 -6.2499999999999991e-11 1025 1031 -2.0833333333333336e-11 1025 372 3.5628902784306998e-27 1025 1030 -2.0833333333333326e-11 1025 1026 2.0833333333333332e-11 1025 227 2.0833333333333329e-11 1025 233 -1.0416666666666669e-11 1025 1023 2.0833333333333339e-11 1025 1620 7.2916666666666660e-11 1025 1615 2.0833333333333329e-11 1025 1726 -8.3333333333333330e-11 1025 1282 7.2916666666666660e-11 1025 1285 -1.0416666666666671e-11 1025 1283 2.0833333333333332e-11 1026 1026 2.9166666666666664e-10 1026 652 4.1666666666666665e-11 1026 650 -2.0833333333333336e-11 1026 376 1.1213657767716683e-27 1026 375 4.1666666666666665e-11 1026 373 1.0416666666666665e-11 1026 372 -1.1000665323307010e-27 1026 1030 4.1666666666666652e-11 1026 1025 2.0833333333333332e-11 1026 227 1.0416666666666666e-10 1026 233 1.0416666666666663e-11 1026 1617 2.0833333333333332e-11 1026 1620 2.0833333333333329e-11 1027 1027 2.9166666666666664e-10 1027 1055 4.1666666666666665e-11 1027 381 1.1213657767716683e-27 1027 382 4.1666666666666665e-11 1027 373 1.0416666666666665e-11 1027 383 -1.1000665323307010e-27 1027 1056 -4.1666666666666652e-11 1027 492 1.0416666666666666e-10 1027 1421 2.0833333333333332e-11 1027 1915 2.0833333333333336e-11 1027 2196 2.0833333333333332e-11 1027 1429 1.0416666666666663e-11 1028 1028 4.1666666666666662e-10 1028 374 2.0833333333333329e-11 1028 227 -2.0833333333333329e-11 1028 1039 2.0833333333333336e-11 1028 375 2.0833333333333326e-11 1028 377 6.2499999999999991e-11 1028 1030 2.0833333333333336e-11 1028 372 -2.1169082391605852e-27 1028 1031 2.0833333333333326e-11 1028 1036 2.0833333333333326e-11 1028 291 -2.0833333333333329e-11 1028 299 2.0833333333333329e-11 1028 292 3.7324953730532174e-27 1028 703 2.0833333333333336e-11 1028 297 6.2499999999999991e-11 1028 702 -2.0833333333333336e-11 1028 298 -2.1169082391605852e-27 1028 1029 2.0833333333333326e-11 1028 1040 -2.0833333333333326e-11 1028 226 -2.0833333333333329e-11 1028 225 3.7324953730532174e-27 1028 1290 -2.0833333333333329e-11 1028 1282 -6.2500000000000004e-11 1028 1675 2.0833333333333326e-11 1028 1620 -6.2500000000000004e-11 1029 1029 2.9166666666666664e-10 1029 701 4.1666666666666665e-11 1029 294 2.0833333333333332e-11 1029 299 1.0416666666666666e-10 1029 297 2.0833333333333329e-11 1029 298 1.0416666666666663e-11 1029 1040 4.1666666666666652e-11 1029 1028 2.0833333333333326e-11 1029 226 4.1666666666666658e-11 1029 225 -1.1213657767716683e-27 1029 1621 1.5039633158038590e-27 1029 1818 -2.0833333333333336e-11 1029 1620 1.0416666666666665e-11 1030 1030 2.9166666666666659e-10 1030 225 1.1000665323307010e-27 1030 1039 -4.1666666666666665e-11 1030 377 2.0833333333333332e-11 1030 1028 2.0833333333333336e-11 1030 375 1.0416666666666666e-10 1030 373 2.0833333333333329e-11 1030 372 1.0416666666666661e-11 1030 1026 4.1666666666666652e-11 1030 1025 -2.0833333333333326e-11 1030 227 4.1666666666666665e-11 1030 233 -1.3020149240672800e-27 1030 1620 1.0416666666666665e-11 1031 1031 2.9166666666666664e-10 1031 377 2.0833333333333329e-11 1031 1036 -4.1666666666666652e-11 1031 1028 2.0833333333333326e-11 1031 292 -1.1213657767716683e-27 1031 291 4.1666666666666658e-11 1031 1024 4.1666666666666665e-11 1031 374 1.0416666666666666e-10 1031 373 2.0833333333333332e-11 1031 1025 -2.0833333333333336e-11 1031 372 1.0416666666666663e-11 1031 1282 1.0416666666666665e-11 1031 1285 1.5039633158038590e-27 1032 1032 2.9166666666666659e-10 1032 475 1.3020149240672800e-27 1032 1050 -4.1666666666666665e-11 1032 386 2.0833333333333332e-11 1032 1033 2.0833333333333336e-11 1032 379 1.0416666666666666e-10 1032 380 2.0833333333333329e-11 1032 390 1.0416666666666661e-11 1032 1052 -4.1666666666666652e-11 1032 471 4.1666666666666658e-11 1032 2263 -2.0833333333333326e-11 1032 1589 1.0416666666666661e-11 1032 1590 -1.3233141685082473e-27 1033 1033 4.1666666666666662e-10 1033 415 2.0833333333333329e-11 1033 436 -2.0833333333333326e-11 1033 807 2.0833333333333336e-11 1033 410 2.0833333333333329e-11 1033 426 6.2499999999999991e-11 1033 806 -2.0833333333333336e-11 1033 419 -3.5628902784306998e-27 1033 389 2.0833333333333329e-11 1033 471 -2.0833333333333326e-11 1033 1050 2.0833333333333336e-11 1033 379 2.0833333333333329e-11 1033 386 6.2499999999999991e-11 1033 1032 2.0833333333333336e-11 1033 390 -3.5628902784306998e-27 1033 1034 2.0833333333333326e-11 1033 1071 -2.0833333333333326e-11 1033 439 -2.0833333333333329e-11 1033 440 2.1169082391605852e-27 1033 926 -2.0833333333333326e-11 1033 925 2.0833333333333326e-11 1033 474 -2.0833333333333329e-11 1033 475 2.1169082391605852e-27 1033 1390 -6.2499999999999991e-11 1033 1589 -6.2499999999999991e-11 1034 1034 2.9166666666666664e-10 1034 386 2.0833333333333329e-11 1034 1071 4.1666666666666652e-11 1034 1033 2.0833333333333326e-11 1034 440 -1.5039633158038590e-27 1034 439 4.1666666666666658e-11 1034 1054 4.1666666666666665e-11 1034 389 1.0416666666666666e-10 1034 380 2.0833333333333332e-11 1034 390 1.0416666666666661e-11 1034 1390 1.0416666666666661e-11 1034 1392 1.1000665323307010e-27 1034 2263 -2.0833333333333336e-11 1035 1035 2.9166666666666664e-10 1035 373 -2.0833333333333329e-11 1035 1038 4.1666666666666665e-11 1035 374 -1.0416666666666666e-10 1035 380 -2.0833333333333332e-11 1035 381 -1.0416666666666661e-11 1035 1024 -4.1666666666666652e-11 1035 291 -4.1666666666666658e-11 1035 1286 -1.1000665323307010e-27 1035 1916 2.0833333333333336e-11 1035 1915 2.0833333333333326e-11 1035 1278 -1.0416666666666661e-11 1035 1285 1.5039633158038590e-27 1036 1036 2.9166666666666659e-10 1036 1037 4.1666666666666665e-11 1036 1041 -2.0833333333333336e-11 1036 378 -1.3020149240672800e-27 1036 374 -4.1666666666666658e-11 1036 377 -1.0416666666666661e-11 1036 372 1.3233141685082473e-27 1036 1031 -4.1666666666666652e-11 1036 1028 2.0833333333333326e-11 1036 291 -1.0416666666666666e-10 1036 292 -1.0416666666666661e-11 1036 1287 -2.0833333333333332e-11 1036 1282 -2.0833333333333329e-11 1037 1037 2.9166666666666664e-10 1037 380 -2.0833333333333329e-11 1037 1038 4.1666666666666652e-11 1037 291 -4.1666666666666665e-11 1037 292 -1.1213657767716683e-27 1037 1036 4.1666666666666665e-11 1037 374 -1.0416666666666666e-10 1037 377 -2.0833333333333332e-11 1037 1041 2.0833333333333336e-11 1037 378 -1.0416666666666663e-11 1037 2264 2.0833333333333332e-11 1037 1286 1.1000665323307010e-27 1037 1287 -1.0416666666666665e-11 1038 1038 2.9166666666666659e-10 1038 1035 4.1666666666666665e-11 1038 381 -1.1000665323307010e-27 1038 374 -4.1666666666666665e-11 1038 380 -1.0416666666666665e-11 1038 378 1.3020149240672800e-27 1038 1037 4.1666666666666652e-11 1038 291 -1.0416666666666666e-10 1038 1278 -2.0833333333333332e-11 1038 1916 -2.0833333333333336e-11 1038 2264 -2.0833333333333326e-11 1038 1287 -2.0833333333333329e-11 1038 1286 -1.0416666666666661e-11 1039 1039 2.9166666666666659e-10 1039 385 1.5039633158038590e-27 1039 375 -4.1666666666666658e-11 1039 377 -1.0416666666666661e-11 1039 1030 -4.1666666666666665e-11 1039 1028 2.0833333333333336e-11 1039 372 -1.1000665323307010e-27 1039 637 -4.1666666666666652e-11 1039 636 2.0833333333333326e-11 1039 227 -1.0416666666666666e-10 1039 223 -2.0833333333333329e-11 1039 225 -1.0416666666666661e-11 1039 1620 -2.0833333333333332e-11 1040 1040 2.9166666666666659e-10 1040 223 2.0833333333333332e-11 1040 641 4.1666666666666665e-11 1040 636 -2.0833333333333336e-11 1040 309 1.3020149240672800e-27 1040 299 4.1666666666666658e-11 1040 297 1.0416666666666661e-11 1040 298 -1.3233141685082473e-27 1040 1029 4.1666666666666652e-11 1040 1028 -2.0833333333333326e-11 1040 226 1.0416666666666666e-10 1040 225 1.0416666666666661e-11 1040 1620 2.0833333333333329e-11 1041 1041 4.1666666666666662e-10 1041 379 -2.0833333333333329e-11 1041 291 2.0833333333333329e-11 1041 1036 -2.0833333333333336e-11 1041 374 -2.0833333333333326e-11 1041 377 -6.2499999999999991e-11 1041 1037 2.0833333333333336e-11 1041 378 2.1169082391605852e-27 1041 1044 2.0833333333333336e-11 1041 297 -6.2499999999999991e-11 1041 703 -2.0833333333333326e-11 1041 292 -3.5628902784306998e-27 1041 1046 -2.0833333333333326e-11 1041 1042 2.0833333333333326e-11 1041 471 2.0833333333333329e-11 1041 470 -3.5628902784306998e-27 1041 1675 -2.0833333333333329e-11 1041 1594 2.0833333333333329e-11 1041 1677 -2.0833333333333326e-11 1041 2267 -2.0833333333333336e-11 1041 1676 2.1169082391605852e-27 1041 2269 -2.0833333333333326e-11 1041 1290 2.0833333333333329e-11 1041 1287 6.2499999999999991e-11 1041 1591 6.2499999999999991e-11 1042 1042 2.9166666666666659e-10 1042 473 2.0833333333333332e-11 1042 1051 -4.1666666666666665e-11 1042 1043 2.0833333333333336e-11 1042 384 1.1000665323307010e-27 1042 379 4.1666666666666658e-11 1042 377 1.0416666666666661e-11 1042 378 -1.5039633158038590e-27 1042 1046 4.1666666666666652e-11 1042 1041 2.0833333333333326e-11 1042 471 1.0416666666666666e-10 1042 470 1.0416666666666661e-11 1042 1591 2.0833333333333329e-11 1043 1043 4.1666666666666662e-10 1043 164 2.0833333333333329e-11 1043 1045 2.0833333333333336e-11 1043 311 -2.0833333333333326e-11 1043 297 -6.2499999999999991e-11 1043 1067 2.0833333333333336e-11 1043 312 2.1169082391605852e-27 1043 368 -2.0833333333333329e-11 1043 471 2.0833333333333329e-11 1043 1042 2.0833333333333336e-11 1043 379 -2.0833333333333326e-11 1043 377 -6.2499999999999991e-11 1043 1051 2.0833333333333336e-11 1043 384 2.1169082391605852e-27 1043 746 2.0833333333333326e-11 1043 745 -2.0833333333333326e-11 1043 163 2.0833333333333329e-11 1043 173 6.2500000000000004e-11 1043 172 -3.7324953730532174e-27 1043 1049 2.0833333333333326e-11 1043 1044 2.0833333333333326e-11 1043 473 6.2500000000000004e-11 1043 470 -3.7324953730532174e-27 1043 1677 -2.0833333333333329e-11 1043 1594 2.0833333333333329e-11 1044 1044 2.9166666666666659e-10 1044 312 -1.3233141685082473e-27 1044 297 1.0416666666666661e-11 1044 1041 2.0833333333333336e-11 1044 1049 -4.1666666666666652e-11 1044 1043 2.0833333333333326e-11 1044 473 2.0833333333333329e-11 1044 470 1.0416666666666661e-11 1044 1591 2.0833333333333332e-11 1044 1677 4.1666666666666658e-11 1044 2267 4.1666666666666665e-11 1044 1676 1.3020149240672800e-27 1044 1594 1.0416666666666666e-10 1045 1045 2.9166666666666659e-10 1045 173 2.0833333333333332e-11 1045 1067 -4.1666666666666665e-11 1045 1043 2.0833333333333336e-11 1045 312 1.1000665323307010e-27 1045 311 4.1666666666666658e-11 1045 297 1.0416666666666661e-11 1045 309 -1.5039633158038590e-27 1045 642 4.1666666666666652e-11 1045 636 -2.0833333333333326e-11 1045 164 1.0416666666666666e-10 1045 161 2.0833333333333329e-11 1045 172 1.0416666666666661e-11 1046 1046 2.9166666666666664e-10 1046 1052 -4.1666666666666665e-11 1046 380 2.0833333333333332e-11 1046 379 1.0416666666666666e-10 1046 377 2.0833333333333329e-11 1046 378 1.0416666666666663e-11 1046 1042 4.1666666666666652e-11 1046 1041 -2.0833333333333326e-11 1046 471 4.1666666666666665e-11 1046 470 -1.1000665323307010e-27 1046 1590 1.3233141685082473e-27 1046 2264 -2.0833333333333339e-11 1046 1591 1.0416666666666665e-11 1047 1047 2.9166666666666664e-10 1047 473 -2.0833333333333332e-11 1047 1049 4.1666666666666665e-11 1047 1065 -2.0833333333333339e-11 1047 312 -1.3233141685082473e-27 1047 306 -1.0416666666666665e-11 1047 307 1.1000665323307010e-27 1047 1048 4.1666666666666652e-11 1047 1064 -2.0833333333333326e-11 1047 472 -1.0416666666666663e-11 1047 1677 -4.1666666666666665e-11 1047 1594 -1.0416666666666666e-10 1047 1595 -2.0833333333333329e-11 1048 1048 2.9166666666666659e-10 1048 306 -2.0833333333333329e-11 1048 307 -1.0416666666666661e-11 1048 1047 4.1666666666666652e-11 1048 1064 2.0833333333333326e-11 1048 472 1.5039633158038590e-27 1048 1593 -1.1000665323307010e-27 1048 2279 -4.1666666666666665e-11 1048 1673 -2.0833333333333332e-11 1048 2280 2.0833333333333336e-11 1048 1677 -1.0416666666666666e-10 1048 1594 -4.1666666666666658e-11 1048 1595 -1.0416666666666661e-11 1049 1049 2.9166666666666664e-10 1049 472 -1.5039633158038590e-27 1049 1047 4.1666666666666665e-11 1049 306 -2.0833333333333332e-11 1049 1065 2.0833333333333336e-11 1049 297 -2.0833333333333329e-11 1049 312 -1.0416666666666663e-11 1049 1044 -4.1666666666666652e-11 1049 1043 2.0833333333333326e-11 1049 473 -1.0416666666666665e-11 1049 470 1.1213657767716683e-27 1049 1677 -1.0416666666666666e-10 1049 1594 -4.1666666666666658e-11 1050 1050 2.9166666666666664e-10 1050 1032 -4.1666666666666665e-11 1050 1033 2.0833333333333336e-11 1050 390 -1.1213657767716683e-27 1050 379 -4.1666666666666665e-11 1050 386 -1.0416666666666665e-11 1050 384 1.1000665323307010e-27 1050 1051 4.1666666666666652e-11 1050 1068 2.0833333333333332e-11 1050 471 -1.0416666666666666e-10 1050 473 -2.0833333333333329e-11 1050 475 -1.0416666666666663e-11 1050 1589 -2.0833333333333332e-11 1051 1051 2.9166666666666664e-10 1051 386 -2.0833333333333329e-11 1051 470 -1.1000665323307010e-27 1051 1042 -4.1666666666666665e-11 1051 379 -1.0416666666666666e-10 1051 377 -2.0833333333333332e-11 1051 1043 2.0833333333333336e-11 1051 384 -1.0416666666666661e-11 1051 1050 4.1666666666666652e-11 1051 1068 -2.0833333333333326e-11 1051 471 -4.1666666666666665e-11 1051 473 -1.0416666666666665e-11 1051 475 1.3020149240672800e-27 1052 1052 2.9166666666666664e-10 1052 390 1.1213657767716683e-27 1052 379 -4.1666666666666658e-11 1052 380 -1.0416666666666665e-11 1052 1046 -4.1666666666666665e-11 1052 378 -1.5039633158038590e-27 1052 1032 -4.1666666666666652e-11 1052 471 -1.0416666666666666e-10 1052 1591 -2.0833333333333332e-11 1052 2264 -2.0833333333333336e-11 1052 2263 -2.0833333333333326e-11 1052 1589 -2.0833333333333329e-11 1052 1590 -1.0416666666666663e-11 1053 1053 2.9166666666666664e-10 1053 1058 -4.1666666666666665e-11 1053 387 1.5039633158038590e-27 1053 382 4.1666666666666658e-11 1053 380 1.0416666666666665e-11 1053 381 -1.1213657767716683e-27 1053 1055 4.1666666666666652e-11 1053 492 1.0416666666666666e-10 1053 2265 2.0833333333333336e-11 1053 1916 2.0833333333333326e-11 1053 1421 2.0833333333333329e-11 1053 1424 1.0416666666666663e-11 1054 1054 2.9166666666666659e-10 1054 1034 4.1666666666666665e-11 1054 390 1.1000665323307010e-27 1054 389 4.1666666666666665e-11 1054 380 1.0416666666666665e-11 1054 387 -1.3020149240672800e-27 1054 1074 4.1666666666666652e-11 1054 439 1.0416666666666666e-10 1054 1390 2.0833333333333332e-11 1054 2263 2.0833333333333336e-11 1054 2265 2.0833333333333326e-11 1054 1392 1.0416666666666661e-11 1055 1055 2.9166666666666659e-10 1055 1027 4.1666666666666665e-11 1055 373 2.0833333333333332e-11 1055 382 1.0416666666666666e-10 1055 380 2.0833333333333329e-11 1055 381 1.0416666666666661e-11 1055 1053 4.1666666666666652e-11 1055 492 4.1666666666666658e-11 1055 1429 1.3020149240672800e-27 1055 1915 -2.0833333333333336e-11 1055 1916 -2.0833333333333326e-11 1055 1421 1.0416666666666661e-11 1055 1424 -1.3233141685082473e-27 1056 1056 2.9166666666666659e-10 1056 1057 4.1666666666666665e-11 1056 388 -2.0833333333333332e-11 1056 382 -1.0416666666666666e-10 1056 373 -2.0833333333333329e-11 1056 383 -1.0416666666666661e-11 1056 1027 -4.1666666666666652e-11 1056 492 -4.1666666666666665e-11 1056 2196 2.0833333333333326e-11 1056 1429 1.3020149240672800e-27 1057 1057 2.9166666666666659e-10 1057 1056 4.1666666666666665e-11 1057 383 -1.1000665323307010e-27 1057 382 -4.1666666666666658e-11 1057 388 -1.0416666666666661e-11 1057 387 1.5039633158038590e-27 1057 1058 4.1666666666666652e-11 1057 492 -1.0416666666666666e-10 1058 1058 2.9166666666666664e-10 1058 1053 -4.1666666666666665e-11 1058 380 -2.0833333333333332e-11 1058 382 -1.0416666666666666e-10 1058 388 -2.0833333333333329e-11 1058 387 -1.0416666666666663e-11 1058 1057 4.1666666666666652e-11 1058 492 -4.1666666666666665e-11 1058 1424 -1.3233141685082473e-27 1058 2265 2.0833333333333339e-11 1059 1059 2.0833333333333331e-10 1060 1060 2.9166666666666664e-10 1060 1061 4.1666666666666665e-11 1060 1064 -2.0833333333333336e-11 1060 307 -1.1213657767716683e-27 1060 303 -4.1666666666666665e-11 1060 306 -1.0416666666666665e-11 1060 301 1.1000665323307010e-27 1060 1022 -4.1666666666666652e-11 1060 1020 2.0833333333333332e-11 1060 430 -1.0416666666666666e-10 1060 432 -1.0416666666666663e-11 1060 1460 -2.0833333333333332e-11 1060 2834 -2.0833333333333329e-11 1061 1061 2.9166666666666664e-10 1061 1062 4.1666666666666652e-11 1061 430 -4.1666666666666658e-11 1061 432 -1.3020149240672800e-27 1061 1060 4.1666666666666665e-11 1061 303 -1.0416666666666666e-10 1061 306 -2.0833333333333332e-11 1061 1064 2.0833333333333336e-11 1061 307 -1.0416666666666661e-11 1061 1673 -2.0833333333333329e-11 1061 2280 2.0833333333333326e-11 1061 1459 1.3233141685082473e-27 1061 1460 -1.0416666666666661e-11 1062 1062 2.9166666666666664e-10 1062 1016 -4.1666666666666665e-11 1062 308 -1.5039633158038590e-27 1062 303 -4.1666666666666658e-11 1062 307 1.1213657767716683e-27 1062 1061 4.1666666666666652e-11 1062 430 -1.0416666666666666e-10 1062 1454 -2.0833333333333332e-11 1062 1940 -2.0833333333333336e-11 1062 1673 -1.0416666666666665e-11 1062 2280 -2.0833333333333326e-11 1062 1460 -2.0833333333333329e-11 1062 1459 -1.0416666666666663e-11 1063 1063 2.9166666666666664e-10 1063 313 1.1000665323307010e-27 1063 304 -4.1666666666666665e-11 1063 306 -1.0416666666666665e-11 1063 1021 -4.1666666666666665e-11 1063 1020 2.0833333333333339e-11 1063 301 -1.3233141685082473e-27 1063 716 -4.1666666666666652e-11 1063 715 2.0833333333333326e-11 1063 319 -1.0416666666666666e-10 1063 315 -2.0833333333333329e-11 1063 317 -1.0416666666666663e-11 1063 2668 -2.0833333333333332e-11 1064 1064 4.1666666666666662e-10 1064 430 2.0833333333333326e-11 1064 1060 -2.0833333333333336e-11 1064 303 -2.0833333333333329e-11 1064 306 -6.2499999999999991e-11 1064 1061 2.0833333333333336e-11 1064 307 3.5628902784306998e-27 1064 331 -2.0833333333333329e-11 1064 469 2.0833333333333326e-11 1064 928 -2.0833333333333336e-11 1064 341 -2.0833333333333329e-11 1064 345 -6.2499999999999991e-11 1064 931 2.0833333333333336e-11 1064 344 3.5628902784306998e-27 1064 787 2.0833333333333326e-11 1064 786 -2.0833333333333326e-11 1064 428 2.0833333333333329e-11 1064 432 -2.1169082391605852e-27 1064 1048 2.0833333333333326e-11 1064 1047 -2.0833333333333326e-11 1064 472 -2.1169082391605852e-27 1064 1677 -2.0833333333333329e-11 1064 1460 6.2499999999999991e-11 1064 1594 2.0833333333333329e-11 1064 1595 6.2499999999999991e-11 1065 1065 4.1666666666666662e-10 1065 341 -2.0833333333333329e-11 1065 165 2.0833333333333326e-11 1065 723 -2.0833333333333339e-11 1065 325 -2.0833333333333329e-11 1065 345 -6.2499999999999991e-11 1065 724 2.0833333333333336e-11 1065 347 3.5628902784306998e-27 1065 311 -2.0833333333333329e-11 1065 1047 -2.0833333333333339e-11 1065 306 -6.2499999999999991e-11 1065 1049 2.0833333333333336e-11 1065 312 3.5628902784306998e-27 1065 1067 2.0833333333333326e-11 1065 1066 2.0833333333333332e-11 1065 164 2.0833333333333329e-11 1065 173 6.2499999999999991e-11 1065 174 -3.5628902784306998e-27 1065 929 2.0833333333333326e-11 1065 928 -2.0833333333333332e-11 1065 469 2.0833333333333329e-11 1065 473 6.2499999999999991e-11 1065 472 -3.5628902784306998e-27 1065 1594 2.0833333333333326e-11 1065 1677 -2.0833333333333329e-11 1066 1066 2.9166666666666664e-10 1066 158 2.0833333333333332e-11 1066 718 4.1666666666666665e-11 1066 715 -2.0833333333333336e-11 1066 313 1.1213657767716683e-27 1066 311 4.1666666666666665e-11 1066 306 1.0416666666666665e-11 1066 312 -1.1000665323307010e-27 1066 1067 -4.1666666666666652e-11 1066 1065 2.0833333333333332e-11 1066 164 1.0416666666666666e-10 1066 173 2.0833333333333329e-11 1066 174 1.0416666666666663e-11 1067 1067 2.9166666666666664e-10 1067 306 -2.0833333333333329e-11 1067 1066 -4.1666666666666652e-11 1067 1065 2.0833333333333326e-11 1067 174 1.3020149240672800e-27 1067 164 -4.1666666666666665e-11 1067 173 -1.0416666666666665e-11 1067 172 -1.1000665323307010e-27 1067 1045 -4.1666666666666665e-11 1067 311 -1.0416666666666666e-10 1067 297 -2.0833333333333332e-11 1067 1043 2.0833333333333336e-11 1067 312 -1.0416666666666661e-11 1068 1068 4.1666666666666662e-10 1068 379 2.0833333333333329e-11 1068 163 -2.0833333333333326e-11 1068 747 2.0833333333333339e-11 1068 368 2.0833333333333329e-11 1068 386 6.2499999999999991e-11 1068 746 -2.0833333333333336e-11 1068 384 -3.5628902784306998e-27 1068 424 2.0833333333333329e-11 1068 474 -2.0833333333333326e-11 1068 925 2.0833333333333339e-11 1068 415 2.0833333333333329e-11 1068 426 6.2499999999999991e-11 1068 923 -2.0833333333333336e-11 1068 425 -3.5628902784306998e-27 1068 1069 2.0833333333333326e-11 1068 1070 2.0833333333333332e-11 1068 166 -2.0833333333333329e-11 1068 173 -6.2499999999999991e-11 1068 176 3.5628902784306998e-27 1068 1051 -2.0833333333333326e-11 1068 1050 2.0833333333333332e-11 1068 471 -2.0833333333333329e-11 1068 473 -6.2499999999999991e-11 1068 475 3.5628902784306998e-27 1069 1069 2.9166666666666664e-10 1069 426 2.0833333333333329e-11 1069 1070 -4.1666666666666652e-11 1069 1068 2.0833333333333326e-11 1069 176 -1.3020149240672800e-27 1069 166 4.1666666666666665e-11 1069 173 1.0416666666666665e-11 1069 175 1.1000665323307010e-27 1069 920 4.1666666666666665e-11 1069 424 1.0416666666666666e-10 1069 414 2.0833333333333332e-11 1069 918 -2.0833333333333336e-11 1069 425 1.0416666666666661e-11 1070 1070 2.9166666666666664e-10 1070 152 -2.0833333333333332e-11 1070 740 -4.1666666666666665e-11 1070 737 2.0833333333333336e-11 1070 427 -1.1213657767716683e-27 1070 424 -4.1666666666666665e-11 1070 426 -1.0416666666666665e-11 1070 425 1.1000665323307010e-27 1070 1069 -4.1666666666666652e-11 1070 1068 2.0833333333333332e-11 1070 166 -1.0416666666666666e-10 1070 173 -2.0833333333333329e-11 1070 176 -1.0416666666666663e-11 1071 1071 2.9166666666666664e-10 1071 801 4.1666666666666665e-11 1071 799 -2.0833333333333339e-11 1071 391 1.3233141685082473e-27 1071 389 4.1666666666666665e-11 1071 386 1.0416666666666665e-11 1071 390 -1.1000665323307010e-27 1071 1034 4.1666666666666652e-11 1071 1033 -2.0833333333333326e-11 1071 439 1.0416666666666666e-10 1071 440 1.0416666666666663e-11 1071 1390 2.0833333333333329e-11 1072 1072 2.9166666666666659e-10 1072 391 -1.3233141685082473e-27 1072 389 4.1666666666666658e-11 1072 388 1.0416666666666661e-11 1072 1074 4.1666666666666665e-11 1072 387 1.3020149240672800e-27 1072 801 4.1666666666666652e-11 1072 439 1.0416666666666666e-10 1073 1073 2.0833333333333331e-10 1074 1074 2.9166666666666664e-10 1074 380 2.0833333333333329e-11 1074 1054 4.1666666666666652e-11 1074 439 4.1666666666666665e-11 1074 1072 4.1666666666666665e-11 1074 389 1.0416666666666666e-10 1074 388 2.0833333333333332e-11 1074 387 1.0416666666666663e-11 1074 2265 -2.0833333333333332e-11 1074 1392 -1.1000665323307010e-27 1075 1075 2.4999999999999996e-10 1075 228 2.0833333333333326e-11 1075 816 -9.5018296033870872e-28 1075 4319 1.0416666666666666e-11 1075 1786 2.0833333333333339e-11 1075 5004 -2.2913451068275814e-27 1075 1618 1.0416666666666666e-11 1075 1612 6.2499999999999991e-11 1075 1614 1.0416666666666665e-11 1075 2096 2.0833333333333332e-11 1075 1223 6.2499999999999991e-11 1075 1228 1.0416666666666665e-11 1075 4318 2.0833333333333326e-11 hypre-2.33.0/src/test/TEST_ams/mfem.M.00001000066400000000000000000016266071477326011500176440ustar00rootroot000000000000001076 2332 1076 2332 1076 1076 6.2499999999999991e-11 1077 1077 2.9166666770833325e-02 1078 1078 4.9999999999999993e-10 1078 1714 -2.0833333333333329e-11 1078 1719 -4.1666666666666665e-11 1078 1718 -1.0416666666666666e-10 1078 2155 2.0833333333333332e-11 1078 1081 -1.0416666666666661e-11 1078 1717 -4.1666666666666658e-11 1078 1716 -1.0416666666666666e-10 1078 1712 4.1666666666666658e-11 1078 1694 1.0416666666666666e-10 1079 1079 6.2499999999999991e-11 1080 1080 1.0416666666666666e-10 1081 1081 2.5000000062499996e-02 1081 1712 1.0097419586828951e-27 1081 2144 1.0416666666666664e-03 1081 2139 4.1666666666666666e-03 1081 2143 -3.1249999999999997e-03 1081 1085 2.0833333333333337e-03 1081 1714 -1.0416666666666662e-03 1081 1713 -4.1666666666666657e-03 1081 2153 1.2499999999999997e-02 1081 1083 -1.0416666666666667e-03 1081 1719 1.0097419586828951e-27 1081 1718 -1.0416666666666661e-11 1081 2155 -1.0416666666666664e-03 1081 1078 -1.0416666666666661e-11 1082 1082 1.6666666770833331e-02 1083 1083 1.6666666666666663e-02 1083 2139 1.0416666666666664e-03 1083 2141 1.0416666666666667e-03 1083 2143 2.0833333333333346e-03 1083 1085 -6.2499999999999986e-03 1083 2150 1.0416666666666660e-03 1083 1714 -1.0416666666666664e-03 1083 1713 -6.2499999999999986e-03 1083 2153 1.0416666666666662e-03 1083 1081 -1.0416666666666667e-03 1084 1084 3.7499999999999992e-02 1085 1085 4.9999999999999989e-02 1085 1790 4.1666666666666657e-03 1085 1791 4.1666666666666657e-03 1085 1789 1.6666666666666666e-02 1085 1087 -6.2499999999999986e-03 1085 2145 -4.1666666666666675e-03 1085 2155 2.0833333333333329e-03 1085 2144 2.0833333333333329e-03 1085 2153 4.1666666666666657e-03 1085 1081 2.0833333333333333e-03 1085 2139 -4.1666666666666657e-03 1085 2150 4.1666666666666657e-03 1085 2141 -4.1666666666666666e-03 1085 2143 -1.6666666666666663e-02 1085 1083 -6.2499999999999986e-03 1086 1086 2.4999999999999994e-02 1087 1087 1.6666666666666663e-02 1087 1795 6.2499999999999986e-03 1087 1790 1.0416666666666662e-03 1087 2141 1.0416666666666664e-03 1087 1791 1.0416666666666660e-03 1087 2145 1.0416666666666667e-03 1087 1789 -2.0833333333333346e-03 1087 1085 -6.2499999999999986e-03 1088 1088 2.9166666666666660e-02 1089 1089 6.2499999999999991e-11 1090 1090 2.0833333333333331e-10 1091 1091 5.0000000000000003e-10 1091 2302 2.0833333333333329e-11 1091 1707 -1.0416666666666666e-10 1091 2050 -2.0833333333333332e-11 1091 1098 -1.0416666666666661e-11 1091 1706 -4.1666666666666665e-11 1091 1097 5.2083333333333328e-11 1091 2044 2.0833333333333329e-11 1091 1705 -1.0416666666666666e-10 1091 1703 2.0833333333333332e-11 1091 1096 -1.0416666666666663e-11 1091 1702 4.1666666666666658e-11 1091 1704 -4.1666666666666658e-11 1091 1696 1.0416666666666666e-10 1092 1092 6.2499999999999991e-11 1093 1093 2.0833333333333331e-10 1094 1094 4.9999999999999993e-10 1094 2261 2.0833333333333329e-11 1094 2262 1.0416666666666666e-10 1094 2053 2.0833333333333332e-11 1094 1099 -1.0416666666666661e-11 1094 2052 4.1666666666666665e-11 1094 1097 5.2083333333333328e-11 1094 2050 -2.0833333333333329e-11 1094 2303 1.0416666666666666e-10 1094 2302 2.0833333333333332e-11 1094 1098 -1.0416666666666661e-11 1094 2313 4.1666666666666665e-11 1094 2314 -4.1666666666666658e-11 1094 2311 1.0416666666666666e-10 1095 1095 2.0833333333333331e-10 1096 1096 1.2499999999999998e-10 1096 1703 -1.6155871338926322e-27 1096 2044 -4.0389678347315804e-27 1096 1097 1.6155871338926322e-27 1096 1706 -1.4136387421560532e-27 1096 1702 -1.4136387421560532e-27 1096 1705 -1.0416666666666665e-11 1096 1091 -1.0416666666666665e-11 1096 910 -1.0097419586828951e-27 1096 912 1.0097419586828951e-27 1096 913 -1.0416666666666663e-11 1096 396 -1.0416666666666663e-11 1097 1097 4.1666666666666662e-10 1097 2053 6.2499999999999991e-11 1097 1099 2.1169082391605852e-27 1097 2044 6.2499999999999991e-11 1097 1096 2.1169082391605852e-27 1097 2262 2.0833333333333326e-11 1097 2052 1.0416666666666665e-11 1097 1094 5.2083333333333328e-11 1097 2303 2.0833333333333329e-11 1097 1707 -2.0833333333333329e-11 1097 2050 -6.2500000000000004e-11 1097 1098 3.7324953730532174e-27 1097 1706 -1.0416666666666665e-11 1097 1091 5.2083333333333328e-11 1097 1705 -2.0833333333333329e-11 1097 771 -2.0833333333333329e-11 1097 913 -2.0833333333333326e-11 1097 912 -1.0416666666666665e-11 1097 396 5.2083333333333328e-11 1097 911 -2.0833333333333329e-11 1097 770 -1.0416666666666665e-11 1097 769 -2.0833333333333329e-11 1097 916 6.2500000000000004e-11 1097 394 5.2083333333333328e-11 1097 397 3.7324953730532174e-27 1098 1098 1.2499999999999998e-10 1098 2052 1.2116903504194741e-27 1098 2313 -1.2116903504194741e-27 1098 2303 1.0416666666666661e-11 1098 1094 -1.0416666666666661e-11 1098 1704 -1.0097419586828951e-27 1098 2302 -4.0389678347315804e-27 1098 1706 1.0097419586828951e-27 1098 1707 -1.0416666666666661e-11 1098 2050 4.0389678347315804e-27 1098 1091 -1.0416666666666661e-11 1098 1097 4.0389678347315804e-27 1099 1099 1.2499999999999998e-10 1099 1097 1.6155871338926322e-27 1099 2261 -1.6155871338926322e-27 1099 2314 -1.0097419586828951e-27 1099 2052 -1.0097419586828951e-27 1099 2262 1.0416666666666663e-11 1099 2053 -4.0389678347315804e-27 1099 1094 -1.0416666666666663e-11 1099 770 -1.4136387421560532e-27 1099 767 -1.4136387421560532e-27 1099 771 -1.0416666666666665e-11 1099 394 -1.0416666666666665e-11 1100 1100 1.2499999999999998e-10 1100 1101 1.6155871338926322e-27 1100 1703 -1.6155871338926322e-27 1100 1701 1.0097419586828951e-27 1100 1709 1.0097419586828951e-27 1100 1708 -1.0416666666666663e-11 1100 2046 -4.0389678347315804e-27 1100 1102 -1.0416666666666663e-11 1100 783 1.4136387421560532e-27 1100 790 1.4136387421560532e-27 1100 789 -1.0416666666666665e-11 1100 433 -1.0416666666666665e-11 1101 1101 2.0833333541666669e-02 1101 2046 6.2499999999999991e-11 1101 1100 2.1169082391605852e-27 1101 2159 5.2083333645833339e-03 1101 1112 -7.4433021727763310e-20 1101 1711 -2.0833333333333329e-11 1101 2152 1.0416666666666668e-02 1101 1107 -8.8991399020904929e-20 1101 2156 5.2083333645833339e-03 1101 2153 2.1705219273391446e-19 1101 1106 1.7560052309794418e-19 1101 1709 -1.0416666666666665e-11 1101 1708 -2.0833333333333326e-11 1101 1102 5.2083333333333328e-11 1101 789 -2.0833333333333329e-11 1101 783 1.0416666666666665e-11 1101 782 2.0833333333333329e-11 1101 433 5.2083333333333328e-11 1101 3388 -5.0116116045879435e-20 1102 1102 4.9999999999999993e-10 1102 2156 2.0833333333333329e-11 1102 1711 -1.0416666666666666e-10 1102 1714 -2.0833333333333332e-11 1102 1106 -1.0416666666666661e-11 1102 1703 2.0833333333333329e-11 1102 1710 -4.1666666666666665e-11 1102 1701 4.1666666666666658e-11 1102 1698 1.0416666666666666e-10 1102 1709 -4.1666666666666665e-11 1102 1708 -1.0416666666666666e-10 1102 2046 2.0833333333333332e-11 1102 1101 5.2083333333333328e-11 1102 1100 -1.0416666666666661e-11 1103 1103 6.2499999999999991e-11 1104 1104 2.0833333333333331e-10 1105 1105 2.9166666770833325e-02 1106 1106 1.0416666729166666e-02 1106 1709 -1.2116903504194741e-27 1106 1710 1.2116903504194741e-27 1106 1711 -1.0416666666666661e-11 1106 1102 -1.0416666666666661e-11 1106 1713 2.1684043449710089e-19 1106 1714 -1.0416666666666660e-03 1106 2152 2.1684043449710089e-19 1106 1101 2.1684044015165586e-19 1106 1107 1.0416666666666667e-03 1106 2153 1.0416666666666671e-03 1107 1107 4.9999999999999989e-02 1107 2159 -2.1684043449710089e-19 1107 2165 5.2083333333333330e-03 1107 1112 1.0416666666666673e-03 1107 2154 6.2499999999999986e-03 1107 2151 -2.3039296165316969e-19 1107 2150 -6.2499999999999986e-03 1107 1713 -6.2499999999999986e-03 1107 1714 -5.2083333333333322e-03 1107 2152 -7.3183646642771549e-19 1107 1101 1.3552527156068805e-20 1107 2156 3.2249014814734037e-20 1107 2153 -6.2499999999999986e-03 1107 1106 1.0416666666666664e-03 1107 3388 -6.2499999999999986e-03 1107 3391 -6.2499999999999986e-03 1108 1108 1.0416666666666664e-02 1109 1109 2.0833333333333329e-02 1110 1110 1.0416666666666664e-02 1111 1111 2.9166666770833329e-02 1112 1112 1.0416666729166664e-02 1112 2165 1.0416666666666667e-03 1112 2159 -6.5052130753027050e-19 1112 1101 -1.6155871338926322e-27 1112 2152 -2.1684043449710089e-19 1112 2154 1.6263032587282567e-19 1112 1107 1.0416666666666671e-03 1112 791 -1.0097419586828951e-27 1112 783 -1.0097419586828951e-27 1112 782 1.0416666666666661e-11 1112 433 -1.0416666666666661e-11 1112 3388 1.0416666666666667e-03 1113 1113 1.2499999999999998e-10 1113 1705 1.2116903504194741e-27 1113 1708 -1.0097419586828951e-27 1113 1119 4.0389678347315804e-27 1113 1703 4.0389678347315804e-27 1113 1698 -1.0097419586828951e-27 1113 1701 1.0416666666666661e-11 1113 1116 -1.0416666666666661e-11 1113 1696 1.2116903504194741e-27 1113 1115 -1.0416666666666661e-11 1113 1114 4.0389678347315804e-27 1113 1702 1.0416666666666661e-11 1114 1114 4.1666666666666662e-10 1114 1704 -2.0833333333333326e-11 1114 2299 -2.0833333333333329e-11 1114 1133 2.1169082391605852e-27 1114 1700 1.0416666666666665e-11 1114 2300 -2.0833333333333329e-11 1114 1125 5.2083333333333328e-11 1114 1717 -2.0833333333333329e-11 1114 1126 3.7324953730532174e-27 1114 1694 1.0416666666666665e-11 1114 1712 2.0833333333333326e-11 1114 1118 5.2083333333333328e-11 1114 1710 -2.0833333333333329e-11 1114 1117 2.1169082391605852e-27 1114 1698 1.0416666666666665e-11 1114 1701 2.0833333333333329e-11 1114 1116 5.2083333333333328e-11 1114 1696 1.0416666666666665e-11 1114 1115 5.2083333333333328e-11 1114 1702 2.0833333333333329e-11 1114 1113 3.7324953730532174e-27 1115 1115 4.9999999999999993e-10 1115 1704 -1.0416666666666666e-10 1115 2302 -2.0833333333333329e-11 1115 1133 -1.0416666666666661e-11 1115 1707 -4.1666666666666658e-11 1115 2050 2.0833333333333332e-11 1115 1127 5.2083333333333328e-11 1115 1706 -1.0416666666666666e-10 1115 2044 -2.0833333333333329e-11 1115 1120 -1.0416666666666663e-11 1115 1705 -4.1666666666666665e-11 1115 1703 -2.0833333333333332e-11 1115 1119 5.2083333333333328e-11 1115 1696 4.1666666666666665e-11 1115 1114 5.2083333333333328e-11 1115 1702 1.0416666666666666e-10 1115 1113 -1.0416666666666661e-11 1116 1116 5.0000000000000003e-10 1116 2156 -2.0833333333333329e-11 1116 1711 -4.1666666666666658e-11 1116 1714 2.0833333333333332e-11 1116 1135 5.2083333333333328e-11 1116 1709 -1.0416666666666666e-10 1116 2046 -2.0833333333333332e-11 1116 1138 -1.0416666666666663e-11 1116 1708 -4.1666666666666658e-11 1116 1119 5.2083333333333328e-11 1116 1703 -2.0833333333333329e-11 1116 1710 -1.0416666666666666e-10 1116 1117 -1.0416666666666663e-11 1116 1698 4.1666666666666665e-11 1116 1701 1.0416666666666666e-10 1116 1114 5.2083333333333328e-11 1116 1113 -1.0416666666666661e-11 1117 1117 1.2499999999999998e-10 1117 1711 1.4136387421560532e-27 1117 1718 -1.0097419586828951e-27 1117 1135 4.0389678347315804e-27 1117 1714 -1.6155871338926322e-27 1117 1694 -1.0097419586828951e-27 1117 1712 1.0416666666666663e-11 1117 1118 -1.0416666666666663e-11 1117 1698 1.4136387421560532e-27 1117 1116 -1.0416666666666665e-11 1117 1114 1.6155871338926322e-27 1117 1710 -1.0416666666666665e-11 1118 1118 4.9999999999999993e-10 1118 1714 2.0833333333333329e-11 1118 1718 -4.1666666666666658e-11 1118 2155 -2.0833333333333332e-11 1118 1135 5.2083333333333328e-11 1118 1719 -1.0416666666666666e-10 1118 1132 -1.0416666666666663e-11 1118 1716 -4.1666666666666665e-11 1118 1717 -1.0416666666666666e-10 1118 1123 5.2083333333333328e-11 1118 1126 -1.0416666666666661e-11 1118 1694 4.1666666666666665e-11 1118 1712 1.0416666666666666e-10 1118 1114 5.2083333333333328e-11 1118 1117 -1.0416666666666661e-11 1119 1119 4.1666666666666662e-10 1119 1709 -2.0833333333333326e-11 1119 2160 2.0833333333333329e-11 1119 2046 -6.2499999999999991e-11 1119 1138 2.1169082391605852e-27 1119 2048 1.0416666666666665e-11 1119 2286 2.0833333333333329e-11 1119 1136 5.2083333333333328e-11 1119 2057 -2.0833333333333329e-11 1119 2047 -6.2499999999999991e-11 1119 1137 3.5628902784306998e-27 1119 2045 1.0416666666666665e-11 1119 2049 2.0833333333333326e-11 1119 1121 5.2083333333333328e-11 1119 1706 -2.0833333333333329e-11 1119 2044 -6.2499999999999991e-11 1119 1120 2.1169082391605852e-27 1119 1705 -1.0416666666666665e-11 1119 1702 2.0833333333333329e-11 1119 1115 5.2083333333333328e-11 1119 1708 -1.0416666666666665e-11 1119 1116 5.2083333333333328e-11 1119 1701 2.0833333333333329e-11 1119 1703 -6.2499999999999991e-11 1119 1113 3.5628902784306998e-27 1120 1120 1.2499999999999998e-10 1120 1707 1.4136387421560532e-27 1120 2054 -1.2116903504194741e-27 1120 1127 4.0389678347315804e-27 1120 2050 -1.6155871338926322e-27 1120 2045 -1.2116903504194741e-27 1120 2049 1.0416666666666666e-11 1120 1121 -1.0416666666666666e-11 1120 1705 -1.4136387421560532e-27 1120 1115 -1.0416666666666666e-11 1120 1119 1.6155871338926322e-27 1120 1706 -1.0416666666666666e-11 1120 2044 4.0389678347315804e-27 1121 1121 5.0000000000000003e-10 1121 2047 -2.0833333333333329e-11 1121 2057 -1.0416666666666666e-10 1121 2285 2.0833333333333332e-11 1121 1137 -1.0416666666666661e-11 1121 2050 2.0833333333333329e-11 1121 2056 -4.1666666666666665e-11 1121 1129 5.2083333333333328e-11 1121 2223 2.0833333333333329e-11 1121 2054 -4.1666666666666658e-11 1121 2055 -1.0416666666666666e-10 1121 2222 2.0833333333333332e-11 1121 1127 5.2083333333333328e-11 1121 1128 -1.0416666666666663e-11 1121 2045 4.1666666666666658e-11 1121 2049 1.0416666666666666e-10 1121 2044 -2.0833333333333332e-11 1121 1119 5.2083333333333328e-11 1121 1120 -1.0416666666666663e-11 1122 1122 1.2499999999999998e-10 1122 2296 1.4136387421560532e-27 1122 2298 -1.2116903504194741e-27 1122 1127 4.0389678347315804e-27 1122 2292 -1.6155871338926322e-27 1122 2290 -1.2116903504194741e-27 1122 2294 1.0416666666666666e-11 1122 1125 -1.0416666666666666e-11 1122 2288 1.4136387421560532e-27 1122 1124 -1.0416666666666666e-11 1122 1123 1.6155871338926322e-27 1122 2295 1.0416666666666666e-11 1123 1123 4.1666666666666662e-10 1123 1966 2.0833333333333329e-11 1123 1964 2.0833333333333329e-11 1123 1130 3.5628902784306998e-27 1123 2291 1.0416666666666665e-11 1123 2168 2.0833333333333326e-11 1123 1131 5.2083333333333328e-11 1123 1719 -2.0833333333333329e-11 1123 1132 2.1169082391605852e-27 1123 1716 -1.0416666666666665e-11 1123 1717 -2.0833333333333329e-11 1123 1118 5.2083333333333328e-11 1123 2300 -2.0833333333333329e-11 1123 1126 3.5628902784306998e-27 1123 2290 1.0416666666666665e-11 1123 2294 2.0833333333333326e-11 1123 1125 5.2083333333333328e-11 1123 2288 1.0416666666666665e-11 1123 1124 5.2083333333333328e-11 1123 2295 2.0833333333333329e-11 1123 1122 2.1169082391605852e-27 1124 1124 4.9999999999999993e-10 1124 1966 1.0416666666666666e-10 1124 1963 2.0833333333333329e-11 1124 1130 -1.0416666666666661e-11 1124 2297 -4.1666666666666665e-11 1124 2223 2.0833333333333332e-11 1124 1129 5.2083333333333328e-11 1124 2225 1.0416666666666666e-10 1124 2222 2.0833333333333329e-11 1124 1128 -1.0416666666666661e-11 1124 2296 -4.1666666666666658e-11 1124 2292 2.0833333333333332e-11 1124 1127 5.2083333333333328e-11 1124 2288 4.1666666666666665e-11 1124 1123 5.2083333333333328e-11 1124 2295 1.0416666666666666e-10 1124 1122 -1.0416666666666663e-11 1125 1125 5.0000000000000003e-10 1125 1700 4.1666666666666665e-11 1125 1114 5.2083333333333328e-11 1125 2299 -1.0416666666666666e-10 1125 2302 -2.0833333333333332e-11 1125 1133 -1.0416666666666663e-11 1125 2298 -4.1666666666666658e-11 1125 1127 5.2083333333333328e-11 1125 2292 2.0833333333333329e-11 1125 2300 -1.0416666666666666e-10 1125 1126 -1.0416666666666661e-11 1125 2290 4.1666666666666658e-11 1125 2294 1.0416666666666666e-10 1125 1123 5.2083333333333328e-11 1125 1122 -1.0416666666666663e-11 1126 1126 1.2499999999999998e-10 1126 1700 -1.0097419586828951e-27 1126 1694 1.2116903504194741e-27 1126 1114 4.0389678347315804e-27 1126 1716 1.2116903504194741e-27 1126 1717 -1.0416666666666661e-11 1126 1118 -1.0416666666666661e-11 1126 2290 1.0097419586828951e-27 1126 1125 -1.0416666666666661e-11 1126 1123 4.0389678347315804e-27 1126 2300 -1.0416666666666661e-11 1127 1127 4.1666666666666662e-10 1127 2299 -2.0833333333333329e-11 1127 1704 -2.0833333333333329e-11 1127 2302 -6.2499999999999991e-11 1127 1133 3.5628902784306998e-27 1127 1707 -1.0416666666666661e-11 1127 1706 -2.0833333333333326e-11 1127 1115 5.2083333333333328e-11 1127 2049 2.0833333333333329e-11 1127 2050 6.2499999999999991e-11 1127 1120 3.5628902784306998e-27 1127 2054 -1.0416666666666661e-11 1127 2055 -2.0833333333333329e-11 1127 1121 5.2083333333333328e-11 1127 2225 2.0833333333333329e-11 1127 2222 6.2499999999999991e-11 1127 1128 3.5628902784306998e-27 1127 2296 -1.0416666666666661e-11 1127 2295 2.0833333333333326e-11 1127 1124 5.2083333333333328e-11 1127 2298 -1.0416666666666661e-11 1127 1125 5.2083333333333328e-11 1127 2294 2.0833333333333329e-11 1127 2292 6.2499999999999991e-11 1127 1122 3.5628902784306998e-27 1128 1128 1.2499999999999998e-10 1128 2297 1.0097419586828951e-27 1128 2056 -1.4136387421560532e-27 1128 1129 1.6155871338926322e-27 1128 2223 -4.0389678347315804e-27 1128 2054 1.4136387421560532e-27 1128 2055 -1.0416666666666665e-11 1128 1121 -1.0416666666666665e-11 1128 2296 -1.0097419586828951e-27 1128 1124 -1.0416666666666663e-11 1128 1127 4.0389678347315804e-27 1128 2225 1.0416666666666663e-11 1128 2222 -1.6155871338926322e-27 1129 1129 4.1666666666666662e-10 1129 2057 -2.0833333333333329e-11 1129 2286 2.0833333333333329e-11 1129 2285 6.2500000000000004e-11 1129 1137 3.7324953730532174e-27 1129 2309 1.0416666666666665e-11 1129 2149 2.0833333333333326e-11 1129 1136 5.2083333333333328e-11 1129 2148 2.0833333333333329e-11 1129 2147 6.2499999999999991e-11 1129 1134 2.1169082391605852e-27 1129 2308 1.0416666666666665e-11 1129 1964 2.0833333333333329e-11 1129 1131 5.2083333333333328e-11 1129 1966 2.0833333333333329e-11 1129 1963 6.2500000000000004e-11 1129 1130 3.7324953730532174e-27 1129 2297 -1.0416666666666665e-11 1129 2225 2.0833333333333326e-11 1129 1124 5.2083333333333328e-11 1129 2056 -1.0416666666666665e-11 1129 1121 5.2083333333333328e-11 1129 2055 -2.0833333333333329e-11 1129 2223 6.2499999999999991e-11 1129 1128 2.1169082391605852e-27 1130 1130 1.2499999999999998e-10 1130 2288 -1.2116903504194741e-27 1130 2291 1.0097419586828951e-27 1130 1123 4.0389678347315804e-27 1130 2308 -1.0097419586828951e-27 1130 1964 1.0416666666666661e-11 1130 1131 -1.0416666666666661e-11 1130 2297 -1.2116903504194741e-27 1130 1124 -1.0416666666666661e-11 1130 1129 4.0389678347315804e-27 1130 1966 1.0416666666666661e-11 1130 1963 -4.0389678347315804e-27 1131 1131 4.9999999999999993e-10 1131 2147 2.0833333333333329e-11 1131 2155 -2.0833333333333329e-11 1131 2158 4.1666666666666658e-11 1131 2148 1.0416666666666666e-10 1131 2146 2.0833333333333332e-11 1131 1135 5.2083333333333328e-11 1131 1134 -1.0416666666666663e-11 1131 2291 4.1666666666666658e-11 1131 2168 1.0416666666666666e-10 1131 1123 5.2083333333333328e-11 1131 1132 -1.0416666666666663e-11 1131 2308 4.1666666666666665e-11 1131 1964 1.0416666666666666e-10 1131 1963 2.0833333333333332e-11 1131 1129 5.2083333333333328e-11 1131 1130 -1.0416666666666661e-11 1132 1132 1.2499999999999998e-10 1132 1718 1.4136387421560532e-27 1132 2158 1.2116903504194741e-27 1132 1135 4.0389678347315804e-27 1132 2155 1.6155871338926322e-27 1132 2291 -1.2116903504194741e-27 1132 2168 1.0416666666666666e-11 1132 1131 -1.0416666666666666e-11 1132 1716 -1.4136387421560532e-27 1132 1118 -1.0416666666666666e-11 1132 1123 1.6155871338926322e-27 1132 1719 -1.0416666666666666e-11 1133 1133 1.2499999999999998e-10 1133 1696 -1.0097419586828951e-27 1133 1700 1.4136387421560532e-27 1133 1114 1.6155871338926322e-27 1133 2298 1.4136387421560532e-27 1133 2299 -1.0416666666666665e-11 1133 1125 -1.0416666666666665e-11 1133 1707 -1.0097419586828951e-27 1133 1115 -1.0416666666666663e-11 1133 1127 4.0389678347315804e-27 1133 1704 -1.0416666666666663e-11 1133 2302 1.6155871338926322e-27 1134 1134 1.2499999999999998e-10 1134 2309 -1.0097419586828951e-27 1134 2308 1.4136387421560532e-27 1134 1129 1.6155871338926322e-27 1134 2147 -4.0389678347315804e-27 1134 2158 -1.4136387421560532e-27 1134 2148 1.0416666666666665e-11 1134 1131 -1.0416666666666665e-11 1134 2157 1.0097419586828951e-27 1134 1136 -1.0416666666666663e-11 1134 1135 4.0389678347315804e-27 1134 2149 1.0416666666666663e-11 1134 2146 -1.6155871338926322e-27 1135 1135 4.1666666666666662e-10 1135 2160 2.0833333333333326e-11 1135 1709 -2.0833333333333329e-11 1135 2156 -6.2499999999999991e-11 1135 1138 3.5628902784306998e-27 1135 1711 -1.0416666666666661e-11 1135 1710 -2.0833333333333329e-11 1135 1116 5.2083333333333328e-11 1135 1712 2.0833333333333329e-11 1135 1714 6.2499999999999991e-11 1135 1117 3.5628902784306998e-27 1135 1718 -1.0416666666666661e-11 1135 1719 -2.0833333333333326e-11 1135 1118 5.2083333333333328e-11 1135 2168 2.0833333333333329e-11 1135 2155 -6.2499999999999991e-11 1135 1132 3.5628902784306998e-27 1135 2158 1.0416666666666661e-11 1135 2148 2.0833333333333329e-11 1135 1131 5.2083333333333328e-11 1135 2157 1.0416666666666661e-11 1135 1136 5.2083333333333328e-11 1135 2149 2.0833333333333329e-11 1135 2146 6.2499999999999991e-11 1135 1134 3.5628902784306998e-27 1136 1136 4.9999999999999993e-10 1136 2156 -2.0833333333333332e-11 1136 2160 1.0416666666666666e-10 1136 2046 -2.0833333333333329e-11 1136 1138 -1.0416666666666663e-11 1136 2048 4.1666666666666665e-11 1136 2047 -2.0833333333333332e-11 1136 1119 5.2083333333333328e-11 1136 2286 1.0416666666666666e-10 1136 2285 2.0833333333333329e-11 1136 1137 -1.0416666666666661e-11 1136 2309 4.1666666666666665e-11 1136 2147 2.0833333333333332e-11 1136 1129 5.2083333333333328e-11 1136 2157 4.1666666666666658e-11 1136 1135 5.2083333333333328e-11 1136 2149 1.0416666666666666e-10 1136 2146 2.0833333333333329e-11 1136 1134 -1.0416666666666661e-11 1137 1137 1.2499999999999998e-10 1137 2048 -1.2116903504194741e-27 1137 2045 1.0097419586828951e-27 1137 1119 4.0389678347315804e-27 1137 2047 4.0389678347315804e-27 1137 2056 1.0097419586828951e-27 1137 2057 -1.0416666666666661e-11 1137 1121 -1.0416666666666661e-11 1137 2309 1.2116903504194741e-27 1137 1136 -1.0416666666666661e-11 1137 1129 4.0389678347315804e-27 1137 2286 1.0416666666666661e-11 1137 2285 -4.0389678347315804e-27 1138 1138 1.2499999999999998e-10 1138 2157 -1.4136387421560532e-27 1138 1711 -1.2116903504194741e-27 1138 1135 4.0389678347315804e-27 1138 2156 1.6155871338926322e-27 1138 1708 1.2116903504194741e-27 1138 1709 -1.0416666666666666e-11 1138 1116 -1.0416666666666666e-11 1138 2048 1.4136387421560532e-27 1138 1136 -1.0416666666666666e-11 1138 1119 1.6155871338926322e-27 1138 2160 1.0416666666666666e-11 1138 2046 4.0389678347315804e-27 1139 1139 2.5000000000000002e-10 1139 1143 4.1666666666666665e-11 1139 1144 -2.0833333333333326e-11 1139 1723 2.0833333333333326e-11 1139 1726 -4.1666666666666665e-11 1139 1755 -2.0833333333333332e-11 1139 2196 2.0833333333333332e-11 1139 1727 2.0833333333333326e-11 1139 2098 2.0833333333333332e-11 1139 1722 -4.1666666666666665e-11 1139 1142 -2.0833333333333326e-11 1139 1721 2.0833333333333326e-11 1139 1720 -4.1666666666666665e-11 1139 650 -2.0833333333333329e-11 1140 1140 1.2499999999999998e-10 1141 1141 3.3333333333333332e-10 1142 1142 2.4999999999999996e-10 1142 2100 1.0416666666666665e-11 1142 1721 1.0416666666666666e-11 1142 1755 2.0833333333333339e-11 1142 1754 -1.0416666666666666e-11 1142 2099 -6.2500000000000004e-11 1142 1146 -2.0833333333333326e-11 1142 2098 -2.0833333333333339e-11 1142 1723 1.0416666666666665e-11 1142 1722 6.2499999999999991e-11 1142 1143 1.6155871338926322e-27 1142 1139 -2.0833333333333326e-11 1143 1143 1.0416667104166666e-02 1143 1723 6.2499999999999991e-11 1143 1726 -1.0416666666666666e-11 1143 1139 4.1666666666666665e-11 1143 1144 1.0030366409885165e-27 1143 2100 6.2499999999999991e-11 1143 1146 4.1666666666666665e-11 1143 2099 1.0416666666666666e-11 1143 2098 8.3333333333333330e-11 1143 1722 -1.0416666666666666e-11 1143 1142 9.5018296033870872e-28 1143 623 2.0833333333333329e-11 1143 551 2.0833333333333333e-03 1143 651 1.0416666666666661e-11 1143 756 -2.0833333333333326e-11 1143 650 -7.2916666666666660e-11 1143 105 5.2083333333333328e-11 1143 553 3.1250000416666668e-03 1143 552 1.0416666666666666e-11 1143 100 4.0414059486404474e-19 1143 578 -1.0416666666666660e-03 1143 577 -2.0833333333333329e-03 1143 621 3.1250000312499993e-03 1143 102 5.2083333333333330e-03 1143 103 7.8879979260055783e-21 1144 1144 1.8749999999999997e-10 1144 1723 1.0416666666666665e-11 1144 1726 6.2499999999999991e-11 1144 1139 -2.0833333333333326e-11 1144 1143 1.6155871338926322e-27 1144 2196 -1.0416666666666673e-11 1144 1727 1.0416666666666666e-11 1144 758 -1.4136387421560532e-27 1144 651 -1.4136387421560532e-27 1144 756 -1.0416666666666666e-11 1144 650 1.0416666666666666e-11 1144 105 -1.0416666666666666e-11 1145 1145 2.7083333333333333e-10 1146 1146 3.7499999999999995e-10 1146 2318 -4.1666666666666665e-11 1146 2100 2.0833333333333326e-11 1146 1143 4.1666666666666665e-11 1146 2098 2.0833333333333329e-11 1146 1755 -2.0833333333333332e-11 1146 1754 -2.0833333333333326e-11 1146 2099 4.1666666666666665e-11 1146 1142 -2.0833333333333326e-11 1146 825 4.1666666666666665e-11 1146 554 -4.1666666666666665e-11 1146 813 -1.6666666666666666e-10 1146 108 -6.2499999999999991e-11 1146 553 2.0833333333333332e-11 1146 552 4.1666666666666671e-11 1146 100 2.0833333333333329e-11 1147 1147 2.4999999999999996e-10 1148 1148 2.5000000000000002e-10 1148 1814 2.0833333333333332e-11 1148 1156 4.1666666666666665e-11 1148 1160 -2.0833333333333326e-11 1148 1735 2.0833333333333326e-11 1148 1732 -4.1666666666666665e-11 1148 1750 -2.0833333333333329e-11 1148 1815 -2.0833333333333332e-11 1148 1728 -4.1666666666666665e-11 1148 1171 -2.0833333333333326e-11 1148 1741 2.0833333333333329e-11 1148 1778 -2.0833333333333332e-11 1148 1733 2.0833333333333326e-11 1148 1153 4.1666666666666665e-11 1148 1740 2.0833333333333332e-11 1148 1730 2.0833333333333326e-11 1148 1724 -4.1666666666666665e-11 1148 1150 4.1666666666666665e-11 1148 1149 -2.0833333333333326e-11 1149 1149 2.4999999999999996e-10 1149 1747 -1.0416666666666665e-11 1149 1733 1.0416666666666666e-11 1149 1741 -2.0833333333333339e-11 1149 1776 -1.0416666666666666e-11 1149 1738 -6.2499999999999991e-11 1149 1153 -2.6253290925755273e-27 1149 1159 -2.0833333333333326e-11 1149 1740 -2.0833333333333332e-11 1149 1730 1.0416666666666665e-11 1149 1724 6.2499999999999991e-11 1149 1150 1.6155871338926322e-27 1149 1148 -2.0833333333333326e-11 1150 1150 6.6666666666666674e-10 1150 1838 1.0416666666666666e-11 1150 1728 -1.0416666666666666e-11 1150 1750 -8.3333333333333330e-11 1150 1749 -6.2499999999999991e-11 1150 2175 -1.0416666666666666e-11 1150 1171 9.5018296033870872e-28 1150 1167 4.1666666666666665e-11 1150 1738 1.0416666666666666e-11 1150 1822 -1.0416666666666666e-11 1150 1748 -8.3333333333333330e-11 1150 1747 -6.2499999999999991e-11 1150 2083 -1.0416666666666666e-11 1150 1161 9.5018296033870872e-28 1150 1159 4.1666666666666665e-11 1150 1746 -8.3333333333333330e-11 1150 1745 -6.2499999999999991e-11 1150 1830 -1.0416666666666666e-11 1150 1158 9.5018296033870872e-28 1150 1157 4.1666666666666665e-11 1150 1740 8.3333333333333330e-11 1150 1730 6.2499999999999991e-11 1150 1724 -1.0416666666666666e-11 1150 1149 9.5018296033870872e-28 1150 1148 4.1666666666666665e-11 1151 1151 2.5000000000000002e-10 1151 1814 2.0833333333333332e-11 1151 1778 -2.0833333333333332e-11 1151 1160 -2.0833333333333326e-11 1151 1761 -4.1666666666666665e-11 1151 1806 2.0833333333333332e-11 1151 1156 4.1666666666666665e-11 1151 1767 2.0833333333333326e-11 1151 1782 -2.0833333333333332e-11 1151 1759 -4.1666666666666665e-11 1151 1155 -2.0833333333333326e-11 1151 1770 2.0833333333333329e-11 1151 1154 4.1666666666666665e-11 1151 1765 2.0833333333333326e-11 1151 1771 2.0833333333333332e-11 1151 1766 2.0833333333333326e-11 1151 1757 -4.1666666666666665e-11 1151 1153 4.1666666666666665e-11 1151 1152 -2.0833333333333326e-11 1152 1152 2.2916666666666665e-10 1152 1779 -2.8860671737211984e-28 1152 1783 2.0194839173657902e-27 1152 1772 -1.0416666666666669e-11 1152 1165 1.0416666666666668e-11 1152 1770 -1.0416666666666666e-11 1152 1154 1.6155871338926322e-27 1152 1765 1.0416666666666665e-11 1152 1771 -4.8467614016778965e-27 1152 1766 1.0416666666666666e-11 1152 1757 6.2499999999999991e-11 1152 1153 -1.0416666666666671e-11 1152 1151 -2.0833333333333326e-11 1153 1153 7.9166666666666662e-10 1153 1772 5.2083333333333334e-11 1153 2003 1.0416666666666666e-11 1153 1777 -1.3541666666666666e-10 1153 1779 -4.1666666666666678e-11 1153 2001 5.2083333333333334e-11 1153 1166 -1.0416666666666665e-11 1153 1165 1.4583333333333332e-10 1153 1724 -1.0416666666666666e-11 1153 1761 -1.0416666666666666e-11 1153 1778 -8.3333333333333330e-11 1153 1733 6.2499999999999991e-11 1153 1732 -1.0416666666666666e-11 1153 1160 9.5018296033870872e-28 1153 1148 4.1666666666666665e-11 1153 1741 8.3333333333333330e-11 1153 1776 -6.2499999999999991e-11 1153 1738 1.0416666666666666e-11 1153 1149 -3.0991386737738975e-27 1153 1159 4.1666666666666665e-11 1153 1771 1.3541666666666664e-10 1153 1766 6.2499999999999991e-11 1153 1757 -1.0416666666666666e-11 1153 1152 -1.0416666666666669e-11 1153 1151 4.1666666666666665e-11 1154 1154 7.2916666666666658e-10 1154 1807 5.2083333333333334e-11 1154 2019 1.0416666666666666e-11 1154 1781 -1.3541666666666664e-10 1154 1784 -4.1666666666666678e-11 1154 2017 5.2083333333333334e-11 1154 1170 -1.0416666666666665e-11 1154 1169 1.4583333333333335e-10 1154 1780 -6.2499999999999991e-11 1154 1162 4.1666666666666665e-11 1154 2109 -1.0416666666666665e-11 1154 1783 -9.3750000000000012e-11 1154 1772 -3.6295685768920020e-28 1154 1165 5.6797985175912850e-27 1154 1782 -1.3541666666666664e-10 1154 1759 -1.0416666666666666e-11 1154 1155 -1.0416666666666668e-11 1154 1770 9.3750000000000012e-11 1154 1152 9.5018296033870872e-28 1154 1765 6.2499999999999991e-11 1154 1757 -1.0416666666666666e-11 1154 1151 4.1666666666666665e-11 1155 1155 2.2916666666666665e-10 1155 1784 -9.1882743488121268e-30 1155 1812 2.0194839173657902e-27 1155 1807 -1.0416666666666671e-11 1155 1169 1.0416666666666668e-11 1155 1806 -1.0416666666666673e-11 1155 1156 -2.6253290925755273e-27 1155 1767 1.0416666666666666e-11 1155 1782 3.2311742677852644e-27 1155 1765 1.0416666666666665e-11 1155 1759 6.2499999999999991e-11 1155 1154 -1.0416666666666668e-11 1155 1151 -2.0833333333333326e-11 1156 1156 6.0416666666666670e-10 1156 1814 8.3333333333333330e-11 1156 1160 -3.0991386737738975e-27 1156 1735 6.2499999999999991e-11 1156 1732 -1.0416666666666666e-11 1156 1148 4.1666666666666665e-11 1156 2175 -1.0416666666666666e-11 1156 1815 -8.3333333333333330e-11 1156 1728 -1.0416666666666666e-11 1156 1171 -3.0991386737738975e-27 1156 1761 -1.0416666666666666e-11 1156 1813 -6.2499999999999991e-11 1156 1167 4.1666666666666665e-11 1156 2174 -1.0416666666666665e-11 1156 1812 -9.3750000000000012e-11 1156 1807 -3.6295685768920020e-28 1156 1169 1.0034310714411270e-27 1156 1806 9.3750000000000012e-11 1156 1155 -3.0991386737738975e-27 1156 1767 6.2499999999999991e-11 1156 1759 -1.0416666666666666e-11 1156 1151 4.1666666666666665e-11 1157 1157 2.5000000000000002e-10 1157 1840 2.0833333333333329e-11 1157 2118 2.0833333333333332e-11 1157 1835 2.0833333333333326e-11 1157 1168 4.1666666666666665e-11 1157 2117 2.0833333333333332e-11 1157 1163 -2.0833333333333326e-11 1157 1826 -4.1666666666666665e-11 1157 2103 2.0833333333333332e-11 1157 1833 2.0833333333333326e-11 1157 1164 4.1666666666666665e-11 1157 1748 -2.0833333333333329e-11 1157 1161 -2.0833333333333326e-11 1157 1822 -4.1666666666666665e-11 1157 1746 -2.0833333333333332e-11 1157 1745 -2.0833333333333326e-11 1157 1830 -4.1666666666666665e-11 1157 1150 4.1666666666666665e-11 1157 1158 -2.0833333333333326e-11 1158 1158 2.4999999999999996e-10 1158 1749 -1.0416666666666665e-11 1158 1835 1.0416666666666666e-11 1158 1840 -2.0833333333333339e-11 1158 2177 1.0416666666666666e-11 1158 1838 -6.2499999999999991e-11 1158 1168 -2.6253290925755273e-27 1158 1167 -2.0833333333333326e-11 1158 1746 2.0833333333333332e-11 1158 1745 -1.0416666666666665e-11 1158 1830 6.2499999999999991e-11 1158 1150 1.6155871338926322e-27 1158 1157 -2.0833333333333326e-11 1159 1159 2.5000000000000002e-10 1159 1777 -2.0833333333333332e-11 1159 2002 2.0833333333333332e-11 1159 2003 4.1666666666666665e-11 1159 1166 -2.0833333333333326e-11 1159 2103 2.0833333333333332e-11 1159 1164 4.1666666666666665e-11 1159 2087 2.0833333333333326e-11 1159 1740 2.0833333333333329e-11 1159 1748 -2.0833333333333332e-11 1159 1747 -2.0833333333333326e-11 1159 2083 -4.1666666666666665e-11 1159 1150 4.1666666666666665e-11 1159 1161 -2.0833333333333326e-11 1159 1741 2.0833333333333332e-11 1159 1776 -2.0833333333333326e-11 1159 1738 4.1666666666666665e-11 1159 1153 4.1666666666666665e-11 1159 1149 -2.0833333333333326e-11 1160 1160 2.4999999999999996e-10 1160 1814 -2.0833333333333339e-11 1160 1156 -2.6253290925755273e-27 1160 1735 1.0416666666666665e-11 1160 1732 6.2500000000000004e-11 1160 1148 -2.0833333333333326e-11 1160 1767 1.0416666666666663e-11 1160 1766 1.0416666666666665e-11 1160 1761 6.2500000000000004e-11 1160 1151 -2.0833333333333326e-11 1160 1778 2.0833333333333339e-11 1160 1733 1.0416666666666663e-11 1160 1153 1.6155871338926322e-27 1161 1161 2.4999999999999996e-10 1161 2087 1.0416666666666666e-11 1161 2103 -2.0833333333333339e-11 1161 1833 1.0416666666666666e-11 1161 1164 -2.6253290925755273e-27 1161 1745 -1.0416666666666665e-11 1161 1822 6.2500000000000004e-11 1161 1157 -2.0833333333333326e-11 1161 1748 2.0833333333333339e-11 1161 1747 -1.0416666666666665e-11 1161 2083 6.2499999999999991e-11 1161 1150 1.6155871338926322e-27 1161 1159 -2.0833333333333326e-11 1162 1162 2.5000000000000002e-10 1162 1781 -2.0833333333333329e-11 1162 2018 2.0833333333333332e-11 1162 2019 4.1666666666666665e-11 1162 1170 -2.0833333333333326e-11 1162 2118 2.0833333333333332e-11 1162 1168 4.1666666666666665e-11 1162 2114 2.0833333333333326e-11 1162 1780 -2.0833333333333329e-11 1162 1154 4.1666666666666665e-11 1162 1783 -2.0833333333333329e-11 1162 2121 -2.0833333333333332e-11 1162 2109 -4.1666666666666665e-11 1162 1165 -2.0833333333333326e-11 1162 2117 2.0833333333333332e-11 1162 2112 2.0833333333333323e-11 1162 2110 -4.1666666666666665e-11 1162 1164 4.1666666666666665e-11 1162 1163 -2.0833333333333326e-11 1163 1163 2.4999999999999996e-10 1163 2114 1.0416666666666665e-11 1163 2118 -2.0833333333333339e-11 1163 1835 1.0416666666666663e-11 1163 1168 1.6155871338926322e-27 1163 1833 1.0416666666666665e-11 1163 1826 6.2500000000000004e-11 1163 1157 -2.0833333333333326e-11 1163 2117 -2.0833333333333339e-11 1163 2112 1.0416666666666663e-11 1163 2110 6.2500000000000004e-11 1163 1164 -2.6253290925755273e-27 1163 1162 -2.0833333333333326e-11 1164 1164 6.0416666666666670e-10 1164 2003 1.0416666666666666e-11 1164 2002 9.3749999999999999e-11 1164 1166 -3.0991386737738975e-27 1164 2001 2.2851328271989659e-27 1164 2121 -9.3749999999999999e-11 1164 2109 -1.0416666666666666e-11 1164 1165 1.0034310714411270e-27 1164 1826 -1.0416666666666666e-11 1164 2087 6.2499999999999991e-11 1164 2083 -1.0416666666666666e-11 1164 1159 4.1666666666666665e-11 1164 2103 8.3333333333333330e-11 1164 1833 6.2499999999999991e-11 1164 1822 -1.0416666666666666e-11 1164 1161 -3.0991386737738975e-27 1164 1157 4.1666666666666665e-11 1164 2117 8.3333333333333330e-11 1164 2112 6.2499999999999991e-11 1164 2110 -1.0416666666666666e-11 1164 1163 -3.0991386737738975e-27 1164 1162 4.1666666666666665e-11 1165 1165 3.7499999999999995e-10 1165 1780 -1.0416666666666666e-11 1165 1771 5.2083333333333334e-11 1165 1770 -2.0194839173657902e-27 1165 1783 1.0416666666666666e-11 1165 1772 6.2500000000000004e-11 1165 1154 6.4623485355705287e-27 1165 1152 1.0416666666666666e-11 1165 2002 2.0194839173657902e-27 1165 1777 -5.2083333333333334e-11 1165 1779 -6.2499999999999991e-11 1165 2001 6.2500000000000004e-11 1165 1153 1.4583333333333335e-10 1165 1166 1.0416666666666663e-11 1165 2112 1.0416666666666666e-11 1165 2121 1.0416666666666673e-11 1165 2109 6.2500000000000004e-11 1165 1164 1.6155871338926322e-27 1165 1162 -2.0833333333333326e-11 1166 1166 2.2916666666666665e-10 1166 1776 -1.0416666666666665e-11 1166 2087 1.0416666666666663e-11 1166 2003 -6.2500000000000004e-11 1166 1159 -2.0833333333333326e-11 1166 2002 -1.0416666666666674e-11 1166 1164 -2.6253290925755273e-27 1166 2121 -4.5860624244724788e-28 1166 1777 4.8467614016778965e-27 1166 1779 2.4233807008389483e-27 1166 2001 -1.0416666666666673e-11 1166 1153 -1.0416666666666665e-11 1166 1165 1.0416666666666663e-11 1167 1167 2.5000000000000002e-10 1167 1746 -2.0833333333333329e-11 1167 1750 -2.0833333333333332e-11 1167 1749 -2.0833333333333326e-11 1167 1150 4.1666666666666665e-11 1167 1815 -2.0833333333333332e-11 1167 1171 -2.0833333333333326e-11 1167 2175 -4.1666666666666665e-11 1167 1813 -2.0833333333333329e-11 1167 1156 4.1666666666666665e-11 1167 1812 -2.0833333333333332e-11 1167 2182 -2.0833333333333332e-11 1167 2174 -4.1666666666666665e-11 1167 1169 -2.0833333333333326e-11 1167 1840 2.0833333333333332e-11 1167 2177 2.0833333333333323e-11 1167 1838 4.1666666666666665e-11 1167 1168 4.1666666666666665e-11 1167 1158 -2.0833333333333326e-11 1168 1168 6.0416666666666670e-10 1168 2019 1.0416666666666666e-11 1168 2018 9.3749999999999999e-11 1168 1170 -3.0991386737738975e-27 1168 2017 1.8812360437258079e-27 1168 2182 -9.3750000000000012e-11 1168 2174 -1.0416666666666666e-11 1168 1169 5.6797985175912850e-27 1168 1830 -1.0416666666666666e-11 1168 2114 6.2499999999999991e-11 1168 2110 -1.0416666666666666e-11 1168 1162 4.1666666666666665e-11 1168 2118 8.3333333333333330e-11 1168 1835 6.2499999999999991e-11 1168 1826 -1.0416666666666666e-11 1168 1163 9.5018296033870872e-28 1168 1157 4.1666666666666665e-11 1168 1840 8.3333333333333330e-11 1168 2177 6.2499999999999991e-11 1168 1838 1.0416666666666666e-11 1168 1158 -3.0991386737738975e-27 1168 1167 4.1666666666666665e-11 1169 1169 3.7499999999999995e-10 1169 1813 -1.0416666666666666e-11 1169 1782 -5.2083333333333334e-11 1169 1806 -2.0194839173657902e-27 1169 1812 1.0416666666666669e-11 1169 1807 6.2500000000000004e-11 1169 1156 1.6155871338926322e-27 1169 1155 1.0416666666666666e-11 1169 2018 2.0194839173657902e-27 1169 1781 -5.2083333333333334e-11 1169 1784 -6.2499999999999991e-11 1169 2017 6.2500000000000004e-11 1169 1154 1.4583333333333335e-10 1169 1170 1.0416666666666663e-11 1169 2177 1.0416666666666663e-11 1169 2182 1.0416666666666671e-11 1169 2174 6.2500000000000004e-11 1169 1168 6.4623485355705287e-27 1169 1167 -2.0833333333333326e-11 1170 1170 2.2916666666666665e-10 1170 1780 -1.0416666666666665e-11 1170 2114 1.0416666666666666e-11 1170 2019 -6.2499999999999991e-11 1170 1162 -2.0833333333333326e-11 1170 2018 -1.0416666666666674e-11 1170 1168 -2.6253290925755273e-27 1170 2182 -4.5860624244724788e-28 1170 1784 2.0194839173657902e-27 1170 2017 -1.0416666666666673e-11 1170 1154 -1.0416666666666665e-11 1170 1169 1.0416666666666663e-11 1171 1171 2.4999999999999996e-10 1171 1730 1.0416666666666665e-11 1171 1750 2.0833333333333339e-11 1171 1749 -1.0416666666666665e-11 1171 1150 1.6155871338926322e-27 1171 1813 -1.0416666666666666e-11 1171 2175 6.2499999999999991e-11 1171 1167 -2.0833333333333326e-11 1171 1815 2.0833333333333339e-11 1171 1735 1.0416666666666666e-11 1171 1728 6.2500000000000004e-11 1171 1156 -2.6253290925755273e-27 1171 1148 -2.0833333333333326e-11 1172 1172 2.5000000000000002e-10 1172 2195 2.0833333333333332e-11 1172 1750 -2.0833333333333332e-11 1172 1728 -4.1666666666666665e-11 1172 1186 -2.0833333333333326e-11 1172 1729 2.0833333333333326e-11 1172 1720 -4.1666666666666665e-11 1172 1740 2.0833333333333329e-11 1172 1175 4.1666666666666665e-11 1172 1730 2.0833333333333326e-11 1172 1739 2.0833333333333332e-11 1172 1731 2.0833333333333326e-11 1172 1724 -4.1666666666666665e-11 1172 1173 -2.0833333333333326e-11 1173 1173 2.4999999999999996e-10 1173 1742 -1.0416666666666666e-11 1173 1747 -1.0416666666666665e-11 1173 1738 -6.2499999999999991e-11 1173 1181 -2.0833333333333326e-11 1173 1740 -2.0833333333333332e-11 1173 1175 1.6155871338926322e-27 1173 1730 1.0416666666666665e-11 1173 1739 -2.0833333333333339e-11 1173 1731 1.0416666666666666e-11 1173 1724 6.2499999999999991e-11 1173 1172 -2.0833333333333326e-11 1174 1174 3.3333333333333332e-10 1175 1175 6.6666666666666674e-10 1175 1838 1.0416666666666666e-11 1175 1728 -1.0416666666666666e-11 1175 1750 -8.3333333333333330e-11 1175 1186 9.5018296033870872e-28 1175 1749 -6.2499999999999991e-11 1175 2175 -1.0416666666666666e-11 1175 1185 4.1666666666666665e-11 1175 1738 1.0416666666666666e-11 1175 1822 -1.0416666666666666e-11 1175 1748 -8.3333333333333330e-11 1175 1182 9.5018296033870872e-28 1175 1747 -6.2499999999999991e-11 1175 2083 -1.0416666666666666e-11 1175 1181 4.1666666666666665e-11 1175 1746 -8.3333333333333330e-11 1175 1178 9.5018296033870872e-28 1175 1745 -6.2499999999999991e-11 1175 1830 -1.0416666666666666e-11 1175 1177 4.1666666666666665e-11 1175 1740 8.3333333333333330e-11 1175 1173 9.5018296033870872e-28 1175 1730 6.2499999999999991e-11 1175 1724 -1.0416666666666666e-11 1175 1172 4.1666666666666665e-11 1176 1176 1.2499999999999998e-10 1177 1177 2.5000000000000002e-10 1177 2101 2.0833333333333332e-11 1177 1748 -2.0833333333333332e-11 1177 1822 -4.1666666666666665e-11 1177 1182 -2.0833333333333326e-11 1177 1823 2.0833333333333326e-11 1177 1820 -4.1666666666666665e-11 1177 1746 -2.0833333333333329e-11 1177 1175 4.1666666666666665e-11 1177 1745 -2.0833333333333326e-11 1177 1839 2.0833333333333332e-11 1177 1832 2.0833333333333326e-11 1177 1830 -4.1666666666666665e-11 1177 1178 -2.0833333333333326e-11 1178 1178 2.4999999999999996e-10 1178 1841 -1.0416666666666666e-11 1178 1749 -1.0416666666666665e-11 1178 1838 -6.2499999999999991e-11 1178 1185 -2.0833333333333326e-11 1178 1746 2.0833333333333332e-11 1178 1175 1.6155871338926322e-27 1178 1745 -1.0416666666666665e-11 1178 1839 -2.0833333333333339e-11 1178 1832 1.0416666666666666e-11 1178 1830 6.2499999999999991e-11 1178 1177 -2.0833333333333326e-11 1179 1179 3.3333333333333332e-10 1180 1180 1.2499999999999998e-10 1181 1181 2.5000000000000002e-10 1181 1739 2.0833333333333329e-11 1181 1740 2.0833333333333332e-11 1181 1738 4.1666666666666665e-11 1181 1173 -2.0833333333333326e-11 1181 1742 -2.0833333333333326e-11 1181 2081 -4.1666666666666665e-11 1181 1748 -2.0833333333333329e-11 1181 1175 4.1666666666666665e-11 1181 1747 -2.0833333333333326e-11 1181 2101 2.0833333333333332e-11 1181 2086 2.0833333333333326e-11 1181 2083 -4.1666666666666665e-11 1181 1182 -2.0833333333333326e-11 1182 1182 2.4999999999999996e-10 1182 1823 1.0416666666666666e-11 1182 1745 -1.0416666666666665e-11 1182 1822 6.2499999999999991e-11 1182 1177 -2.0833333333333326e-11 1182 1748 2.0833333333333339e-11 1182 1175 1.6155871338926322e-27 1182 1747 -1.0416666666666665e-11 1182 2101 -2.0833333333333339e-11 1182 2086 1.0416666666666666e-11 1182 2083 6.2500000000000004e-11 1182 1181 -2.0833333333333326e-11 1183 1183 3.3333333333333332e-10 1184 1184 1.2499999999999998e-10 1185 1185 2.5000000000000002e-10 1185 1839 2.0833333333333329e-11 1185 1746 -2.0833333333333332e-11 1185 1838 4.1666666666666665e-11 1185 1178 -2.0833333333333326e-11 1185 1841 -2.0833333333333326e-11 1185 2176 -4.1666666666666665e-11 1185 1750 -2.0833333333333329e-11 1185 1175 4.1666666666666665e-11 1185 1749 -2.0833333333333326e-11 1185 2195 2.0833333333333332e-11 1185 2179 2.0833333333333326e-11 1185 2175 -4.1666666666666665e-11 1185 1186 -2.0833333333333326e-11 1186 1186 2.4999999999999996e-10 1186 1729 1.0416666666666666e-11 1186 1730 1.0416666666666665e-11 1186 1728 6.2499999999999991e-11 1186 1172 -2.0833333333333326e-11 1186 1750 2.0833333333333339e-11 1186 1175 1.6155871338926322e-27 1186 1749 -1.0416666666666665e-11 1186 2195 -2.0833333333333339e-11 1186 2179 1.0416666666666666e-11 1186 2175 6.2500000000000004e-11 1186 1185 -2.0833333333333326e-11 1187 1187 3.3333333333333332e-10 1188 1188 1.2499999999999998e-10 1189 1189 2.5000000000000002e-10 1189 2089 -2.0833333333333329e-11 1189 1755 -2.0833333333333332e-11 1189 1722 -4.1666666666666665e-11 1189 1202 -2.0833333333333326e-11 1189 1721 2.0833333333333326e-11 1189 1720 -4.1666666666666665e-11 1189 1739 2.0833333333333329e-11 1189 1731 2.0833333333333326e-11 1189 1737 2.0833333333333332e-11 1189 1725 2.0833333333333326e-11 1189 1724 -4.1666666666666665e-11 1189 1191 4.1666666666666665e-11 1189 1190 -2.0833333333333326e-11 1190 1190 2.4999999999999996e-10 1190 2085 1.0416666666666665e-11 1190 1731 1.0416666666666666e-11 1190 1739 -2.0833333333333339e-11 1190 1742 -1.0416666666666666e-11 1190 1738 -6.2499999999999991e-11 1190 1192 -2.0833333333333326e-11 1190 1737 -2.0833333333333332e-11 1190 1725 1.0416666666666665e-11 1190 1724 6.2499999999999991e-11 1190 1191 1.6155871338926322e-27 1190 1189 -2.0833333333333326e-11 1191 1191 6.6666666666666674e-10 1191 1978 -1.0416666666666666e-11 1191 2099 1.0416666666666666e-11 1191 2090 -6.2499999999999991e-11 1191 2316 -1.0416666666666666e-11 1191 1196 4.1666666666666665e-11 1191 2089 -8.3333333333333330e-11 1191 1202 9.5018296033870872e-28 1191 1722 -1.0416666666666666e-11 1191 1998 8.3333333333333330e-11 1191 1996 1.0416666666666666e-11 1191 1200 9.5018296033870872e-28 1191 2085 6.2499999999999991e-11 1191 1738 1.0416666666666666e-11 1191 1192 4.1666666666666665e-11 1191 2088 -8.3333333333333330e-11 1191 1980 6.2499999999999991e-11 1191 1979 -1.0416666666666666e-11 1191 1195 9.5018296033870872e-28 1191 1194 4.1666666666666665e-11 1191 1737 8.3333333333333330e-11 1191 1725 6.2499999999999991e-11 1191 1724 -1.0416666666666666e-11 1191 1190 9.5018296033870872e-28 1191 1189 4.1666666666666665e-11 1192 1192 2.5000000000000002e-10 1192 2081 -4.1666666666666665e-11 1192 1997 2.0833333333333332e-11 1192 2080 2.0833333333333326e-11 1192 1998 2.0833333333333332e-11 1192 1996 4.1666666666666665e-11 1192 1200 -2.0833333333333326e-11 1192 1737 2.0833333333333329e-11 1192 1191 4.1666666666666665e-11 1192 2085 2.0833333333333326e-11 1192 1739 2.0833333333333332e-11 1192 1742 -2.0833333333333326e-11 1192 1738 4.1666666666666665e-11 1192 1190 -2.0833333333333326e-11 1193 1193 3.3333333333333332e-10 1194 1194 2.5000000000000002e-10 1194 2320 2.0833333333333329e-11 1194 1984 2.0833333333333326e-11 1194 1998 2.0833333333333329e-11 1194 1997 2.0833333333333332e-11 1194 1981 2.0833333333333326e-11 1194 1978 -4.1666666666666665e-11 1194 1200 -2.0833333333333326e-11 1194 2088 -2.0833333333333332e-11 1194 1980 2.0833333333333326e-11 1194 1979 -4.1666666666666665e-11 1194 1191 4.1666666666666665e-11 1194 1195 -2.0833333333333326e-11 1194 4705 -4.1666666666666665e-11 1195 1195 2.4999999999999996e-10 1195 1984 1.0416666666666666e-11 1195 2090 -1.0416666666666665e-11 1195 2320 -2.0833333333333339e-11 1195 2317 1.0416666666666666e-11 1195 2316 6.2499999999999991e-11 1195 1196 -2.0833333333333326e-11 1195 2088 2.0833333333333332e-11 1195 1980 1.0416666666666665e-11 1195 1979 6.2499999999999991e-11 1195 1191 1.6155871338926322e-27 1195 1194 -2.0833333333333326e-11 1196 1196 2.5000000000000002e-10 1196 2318 -4.1666666666666665e-11 1196 1755 -2.0833333333333332e-11 1196 1754 -2.0833333333333326e-11 1196 2089 -2.0833333333333332e-11 1196 2099 4.1666666666666665e-11 1196 1202 -2.0833333333333326e-11 1196 2088 -2.0833333333333329e-11 1196 1191 4.1666666666666665e-11 1196 2090 -2.0833333333333326e-11 1196 2320 2.0833333333333332e-11 1196 2317 2.0833333333333326e-11 1196 2316 -4.1666666666666665e-11 1196 1195 -2.0833333333333326e-11 1197 1197 3.3333333333333332e-10 1198 1198 1.2499999999999998e-10 1199 1199 3.3333333333333332e-10 1200 1200 2.4999999999999996e-10 1200 1980 1.0416666666666665e-11 1200 1981 1.0416666666666666e-11 1200 1978 6.2500000000000004e-11 1200 1194 -2.0833333333333326e-11 1200 1997 -2.0833333333333339e-11 1200 2080 1.0416666666666666e-11 1200 1998 -2.0833333333333339e-11 1200 2085 1.0416666666666665e-11 1200 1996 -6.2499999999999991e-11 1200 1191 1.6155871338926322e-27 1200 1192 -2.0833333333333326e-11 1201 1201 3.3333333333333332e-10 1202 1202 2.4999999999999996e-10 1202 1754 -1.0416666666666666e-11 1202 2090 -1.0416666666666665e-11 1202 2099 -6.2499999999999991e-11 1202 1196 -2.0833333333333326e-11 1202 2089 2.0833333333333339e-11 1202 1191 1.6155871338926322e-27 1202 1725 1.0416666666666665e-11 1202 1755 2.0833333333333339e-11 1202 1721 1.0416666666666666e-11 1202 1722 6.2500000000000004e-11 1202 1189 -2.0833333333333326e-11 1203 1203 1.2499999999999998e-10 1204 1204 1.2499999999999998e-10 1205 1205 1.2499999999999998e-10 1206 1206 4.9999999999999993e-10 1206 1787 2.0833333333333329e-11 1206 1785 -4.1666666666666665e-11 1206 1804 4.1666666666666665e-11 1206 1759 -1.6666666666666666e-10 1206 1209 -6.2499999999999991e-11 1206 1758 -4.1666666666666665e-11 1206 1760 -4.1666666666666671e-11 1206 1757 -1.6666666666666666e-10 1206 1816 2.0833333333333332e-11 1206 1764 2.0833333333333326e-11 1206 1763 -4.1666666666666671e-11 1206 1208 4.1666666666666665e-11 1206 1207 2.0833333333333329e-11 1206 5011 4.1666666666666665e-11 1206 3781 2.0833333333333332e-11 1206 4460 4.1666666666666665e-11 1206 3776 6.2499999999999991e-11 1206 3782 -6.2499999999999991e-11 1207 1207 3.1249999999999995e-10 1207 1208 4.0389678347315804e-27 1207 1816 -1.0416666666666668e-11 1207 1819 1.0416666666666663e-11 1207 1811 4.1666666666666665e-11 1207 1804 1.2499999999999998e-10 1207 1759 -3.1250000000000002e-11 1207 1209 -1.0416666666666665e-11 1207 1764 1.0416666666666665e-11 1207 1763 4.1666666666666671e-11 1207 1206 2.0833333333333336e-11 1207 712 -1.2116903504194741e-27 1207 707 -1.2116903504194741e-27 1207 698 1.0416666666666666e-11 1207 286 -1.0416666666666666e-11 1207 3780 5.2083333333333328e-11 1208 1208 1.0416667104166666e-02 1208 1816 7.2916666666666673e-11 1208 1207 3.5100365977808920e-27 1208 1787 8.3333333333333330e-11 1208 1758 -1.0416666666666666e-11 1208 1764 6.2499999999999991e-11 1208 1763 -1.0416666666666666e-11 1208 1206 4.1666666666666665e-11 1208 3474 -1.0416666666666666e-11 1208 698 2.0833333333333329e-11 1208 949 -2.0833333333333333e-03 1208 947 -6.2499999999999991e-11 1208 5004 -1.0416666666666666e-11 1208 3781 9.5018296033870872e-28 1208 290 4.1666666666666665e-11 1208 712 -1.0416666666666661e-11 1208 711 -2.0833333333333329e-11 1208 946 -3.1250000312499997e-03 1208 286 5.2083333333333328e-11 1208 287 4.0414059491689842e-19 1208 945 1.0416666666666660e-03 1208 3088 2.0833333333333329e-03 1208 939 3.1250000416666660e-03 1208 2406 5.2083333333333330e-03 1208 2414 7.8879953661519409e-21 1209 1209 1.6666666666666663e-10 1209 1819 1.0416666666666666e-11 1209 1811 6.2499999999999991e-11 1209 1785 -1.0416666666666660e-11 1209 1760 1.0416666666666666e-11 1209 1804 1.0416666666666665e-11 1209 1763 1.0416666666666666e-11 1209 1759 2.0833333333333345e-11 1209 1207 -1.0416666666666663e-11 1209 1206 -6.2500000000000004e-11 1209 4462 1.0416666666666665e-11 1209 3780 2.0833333333333339e-11 1209 3776 -1.0416666666666666e-11 1210 1210 2.2916666666666665e-10 1210 2093 2.0833333333333332e-11 1210 1778 -2.0833333333333332e-11 1210 1761 -4.1666666666666665e-11 1210 1222 -2.0833333333333326e-11 1210 1786 2.0833333333333332e-11 1210 1762 2.0833333333333326e-11 1210 1223 4.1666666666666665e-11 1210 1771 2.0833333333333329e-11 1210 1215 4.1666666666666665e-11 1210 1766 2.0833333333333326e-11 1210 1758 -4.1666666666666671e-11 1210 1757 -4.1666666666666678e-11 1210 5011 2.8940292364521930e-29 1210 4319 -4.1666666666666665e-11 1210 4320 -4.1666666666666665e-11 1211 1211 4.9999999999999993e-10 1211 1990 -2.0194839173657902e-27 1211 2128 3.1249999999999995e-11 1211 1996 -5.2083333333333328e-11 1211 1779 -4.1666666666666658e-11 1211 2001 -1.2500000000000001e-10 1211 1225 -1.0416666666666653e-11 1211 2005 -1.0416666666666666e-11 1211 2322 -5.2083333333333334e-11 1211 2004 -8.3333333333333330e-11 1211 1216 -6.4623485355705287e-27 1211 1777 6.4623485355705287e-27 1211 1776 -1.0416666666666663e-11 1211 2003 -1.0416666666666667e-10 1211 1215 5.2083333333333321e-11 1211 1214 -4.1666666666666665e-11 1211 1988 2.0194839173657902e-27 1211 1987 6.4623485355705287e-27 1211 1995 1.0416666666666666e-11 1211 1213 1.6155871338926322e-27 1211 1212 6.2500000000000004e-11 1211 4317 6.2500000000000004e-11 1212 1212 3.1249999999999995e-10 1212 1980 1.0416666666666665e-11 1212 2003 -5.2083333333333334e-11 1212 1998 -2.0833333333333339e-11 1212 1220 1.6155871338926322e-27 1212 2085 1.0416666666666665e-11 1212 1996 -1.0416666666666667e-10 1212 1214 -4.1666666666666665e-11 1212 1983 1.0416666666666666e-11 1212 1978 6.2499999999999991e-11 1212 1217 -2.0833333333333326e-11 1212 1988 1.0416666666666673e-11 1212 1987 2.0194839173657902e-27 1212 1995 -1.0416666666666666e-11 1212 1213 -2.6253290925755273e-27 1212 1211 6.2499999999999991e-11 1213 1213 5.4166666666666666e-10 1213 2005 -1.8812360437258079e-27 1213 1990 -9.3749999999999999e-11 1213 1989 -6.2499999999999991e-11 1213 1978 -1.0416666666666666e-11 1213 1985 8.3333333333333330e-11 1213 1983 6.2499999999999991e-11 1213 1218 -3.0991386737738975e-27 1213 1217 4.1666666666666665e-11 1213 1988 -9.3750000000000012e-11 1213 1987 -1.0416666666666667e-10 1213 1995 -3.6295685768920020e-28 1213 1212 -3.0991386737738975e-27 1213 1211 1.0034310714411270e-27 1213 4985 -1.0416666666666666e-11 1213 4982 -1.0416666666666666e-11 1213 4317 -3.0991386737738975e-27 1213 4313 4.1666666666666665e-11 1213 4699 -1.0416666666666666e-11 1214 1214 2.2916666666666665e-10 1214 1995 -8.8938459461701536e-29 1214 1998 2.0833333333333329e-11 1214 1212 -4.1666666666666665e-11 1214 1996 4.1666666666666658e-11 1214 1741 2.0833333333333329e-11 1214 1737 2.0833333333333332e-11 1214 2085 2.0833333333333326e-11 1214 1738 4.1666666666666665e-11 1214 1220 4.1666666666666665e-11 1214 1219 -2.0833333333333326e-11 1214 1777 -2.0833333333333332e-11 1214 1776 -2.0833333333333326e-11 1214 2003 4.1666666666666665e-11 1214 1215 4.1666666666666665e-11 1214 1211 -4.1666666666666665e-11 1215 1215 7.9166666666666662e-10 1215 1772 -3.1250000000000002e-11 1215 1779 -1.6666666666666666e-10 1215 2001 -3.1250000000000002e-11 1215 1225 2.0833333333333339e-11 1215 1724 -1.0416666666666666e-11 1215 1761 -1.0416666666666666e-11 1215 1778 -8.3333333333333330e-11 1215 1222 9.5018296033870872e-28 1215 1733 6.2499999999999991e-11 1215 1732 -1.0416666666666666e-11 1215 1221 4.1666666666666665e-11 1215 1741 8.3333333333333330e-11 1215 1219 -3.0991386737738975e-27 1215 1738 1.0416666666666666e-11 1215 1771 7.2916666666666673e-11 1215 1766 6.2499999999999991e-11 1215 1757 -1.0416666666666666e-11 1215 1210 4.1666666666666665e-11 1215 1777 -7.2916666666666660e-11 1215 1776 -6.2499999999999991e-11 1215 2003 1.0416666666666666e-11 1215 1211 5.2083333333333321e-11 1215 1214 4.1666666666666665e-11 1215 4320 5.2083333333333334e-11 1216 1216 3.3333333333333332e-10 1216 2001 -4.1666666666666665e-11 1216 1769 3.1495832401145651e-28 1216 1773 4.1666666666666671e-11 1216 1772 -4.1666666666666665e-11 1216 2128 1.6666666666666666e-10 1216 1225 -6.2500000000000004e-11 1216 2005 -4.3283707583767993e-28 1216 2322 4.1666666666666665e-11 1216 2004 4.1666666666666671e-11 1216 1211 -6.4623485355705287e-27 1216 4317 -6.2499999999999991e-11 1217 1217 2.5000000000000002e-10 1217 2088 -2.0833333333333329e-11 1217 1992 -2.0833333333333332e-11 1217 1979 -4.1666666666666665e-11 1217 1227 -2.0833333333333326e-11 1217 1998 2.0833333333333332e-11 1217 1980 2.0833333333333326e-11 1217 1220 4.1666666666666665e-11 1217 1988 -2.0833333333333332e-11 1217 1212 -2.0833333333333326e-11 1217 1978 -4.1666666666666665e-11 1217 1986 2.0833333333333332e-11 1217 1982 2.0833333333333326e-11 1217 1985 2.0833333333333332e-11 1217 1983 2.0833333333333326e-11 1217 1213 4.1666666666666665e-11 1217 1218 -2.0833333333333326e-11 1217 4316 4.1666666666666665e-11 1217 4699 -4.1666666666666665e-11 1218 1218 2.4999999999999996e-10 1218 1989 -1.0416666666666665e-11 1218 1986 -2.0833333333333339e-11 1218 1982 1.0416666666666665e-11 1218 1985 -2.0833333333333339e-11 1218 1983 1.0416666666666663e-11 1218 1213 -2.6253290925755273e-27 1218 1217 -2.0833333333333326e-11 1218 4987 1.0416666666666663e-11 1218 4985 6.2500000000000004e-11 1218 4313 -2.0833333333333326e-11 1218 4316 1.6155871338926322e-27 1218 4699 6.2500000000000004e-11 1219 1219 2.4999999999999996e-10 1219 1725 1.0416666666666665e-11 1219 1733 1.0416666666666666e-11 1219 1724 6.2499999999999991e-11 1219 1221 -2.0833333333333326e-11 1219 1741 -2.0833333333333339e-11 1219 1215 -2.6253290925755273e-27 1219 1776 -1.0416666666666666e-11 1219 1737 -2.0833333333333332e-11 1219 2085 1.0416666666666665e-11 1219 1738 -6.2499999999999991e-11 1219 1220 1.6155871338926322e-27 1219 1214 -2.0833333333333326e-11 1220 1220 6.6666666666666674e-10 1220 1979 -1.0416666666666666e-11 1220 1980 6.2499999999999991e-11 1220 1978 -1.0416666666666666e-11 1220 1217 4.1666666666666665e-11 1220 2099 1.0416666666666666e-11 1220 2088 -8.3333333333333330e-11 1220 2090 -6.2499999999999991e-11 1220 2316 -1.0416666666666666e-11 1220 1227 9.5018296033870872e-28 1220 1226 4.1666666666666665e-11 1220 1724 -1.0416666666666666e-11 1220 2089 -8.3333333333333330e-11 1220 1725 6.2499999999999991e-11 1220 1722 -1.0416666666666666e-11 1220 1224 9.5018296033870872e-28 1220 1221 4.1666666666666665e-11 1220 1998 8.3333333333333330e-11 1220 1212 9.5018296033870872e-28 1220 1996 1.0416666666666666e-11 1220 1737 8.3333333333333330e-11 1220 2085 6.2499999999999991e-11 1220 1738 1.0416666666666666e-11 1220 1219 9.5018296033870872e-28 1220 1214 4.1666666666666665e-11 1221 1221 2.5000000000000002e-10 1221 1737 2.0833333333333329e-11 1221 1741 2.0833333333333332e-11 1221 1724 -4.1666666666666665e-11 1221 1219 -2.0833333333333326e-11 1221 2089 -2.0833333333333332e-11 1221 1725 2.0833333333333326e-11 1221 1220 4.1666666666666665e-11 1221 2097 -2.0833333333333332e-11 1221 1224 -2.0833333333333326e-11 1221 1722 -4.1666666666666665e-11 1221 1778 -2.0833333333333332e-11 1221 1215 4.1666666666666665e-11 1221 1733 2.0833333333333326e-11 1221 2093 2.0833333333333332e-11 1221 1734 2.0833333333333326e-11 1221 1732 -4.1666666666666665e-11 1221 1223 4.1666666666666665e-11 1221 1222 -2.0833333333333326e-11 1222 1222 2.4999999999999996e-10 1222 1762 1.0416666666666665e-11 1222 1766 1.0416666666666663e-11 1222 1761 6.2500000000000004e-11 1222 1210 -2.0833333333333326e-11 1222 1778 2.0833333333333339e-11 1222 1215 1.6155871338926322e-27 1222 1733 1.0416666666666665e-11 1222 2093 -2.0833333333333339e-11 1222 1734 1.0416666666666663e-11 1222 1732 6.2500000000000004e-11 1222 1223 -2.6253290925755273e-27 1222 1221 -2.0833333333333326e-11 1223 1223 6.6666666666666664e-10 1223 1786 8.3333333333333330e-11 1223 2096 8.3333333333333330e-11 1223 1228 -3.0991386737738975e-27 1223 2315 -1.0416666666666666e-11 1223 2095 -6.2499999999999991e-11 1223 2099 1.0416666666666666e-11 1223 1226 4.1666666666666665e-11 1223 1761 -1.0416666666666666e-11 1223 1762 6.2499999999999991e-11 1223 1758 -1.0416666666666666e-11 1223 1210 4.1666666666666665e-11 1223 2097 -8.3333333333333330e-11 1223 1224 -3.0991386737738975e-27 1223 1722 -1.0416666666666666e-11 1223 2093 8.3333333333333330e-11 1223 1734 6.2499999999999991e-11 1223 1732 -1.0416666666666666e-11 1223 1222 -3.0991386737738975e-27 1223 1221 4.1666666666666665e-11 1223 4319 -3.0991386737738975e-27 1223 5004 -1.0416666666666666e-11 1223 1075 6.2499999999999991e-11 1223 816 1.0416666666666666e-11 1223 4318 4.1666666666666665e-11 1224 1224 2.4999999999999996e-10 1224 2095 -1.0416666666666666e-11 1224 2090 -1.0416666666666665e-11 1224 2099 -6.2500000000000004e-11 1224 1226 -2.0833333333333326e-11 1224 2089 2.0833333333333339e-11 1224 1725 1.0416666666666665e-11 1224 1220 1.6155871338926322e-27 1224 2097 2.0833333333333339e-11 1224 1223 -2.6253290925755273e-27 1224 1734 1.0416666666666666e-11 1224 1722 6.2499999999999991e-11 1224 1221 -2.0833333333333326e-11 1225 1225 1.6666666666666663e-10 1225 2004 -1.0416666666666665e-11 1225 1773 -1.0416666666666666e-11 1225 2128 -2.0833333333333339e-11 1225 1216 -6.2500000000000004e-11 1225 1771 1.0416666666666665e-11 1225 1772 -1.0416666666666655e-11 1225 1777 -1.0416666666666666e-11 1225 1215 2.0833333333333339e-11 1225 1211 -1.0416666666666653e-11 1225 1779 -6.2500000000000004e-11 1225 2001 -1.0416666666666673e-11 1225 4320 -1.0416666666666673e-11 1226 1226 2.5000000000000002e-10 1226 2096 2.0833333333333332e-11 1226 1993 2.0833333333333332e-11 1226 2315 -4.1666666666666665e-11 1226 1228 -2.0833333333333326e-11 1226 2097 -2.0833333333333332e-11 1226 2095 -2.0833333333333326e-11 1226 1223 4.1666666666666665e-11 1226 2089 -2.0833333333333329e-11 1226 1224 -2.0833333333333326e-11 1226 2099 4.1666666666666665e-11 1226 1992 -2.0833333333333329e-11 1226 1991 -2.0833333333333326e-11 1226 2088 -2.0833333333333332e-11 1226 2090 -2.0833333333333326e-11 1226 2316 -4.1666666666666665e-11 1226 1220 4.1666666666666665e-11 1226 1227 -2.0833333333333326e-11 1226 4316 4.1666666666666665e-11 1227 1227 2.4999999999999996e-10 1227 1980 1.0416666666666665e-11 1227 1982 1.0416666666666666e-11 1227 1979 6.2499999999999991e-11 1227 1217 -2.0833333333333326e-11 1227 1992 2.0833333333333339e-11 1227 1991 -1.0416666666666666e-11 1227 2088 2.0833333333333332e-11 1227 2090 -1.0416666666666665e-11 1227 2316 6.2499999999999991e-11 1227 1220 1.6155871338926322e-27 1227 1226 -2.0833333333333326e-11 1227 4316 -2.6253290925755273e-27 1228 1228 2.4999999999999996e-10 1228 1993 -2.0833333333333339e-11 1228 2096 -2.0833333333333339e-11 1228 1223 -2.6253290925755273e-27 1228 2095 -1.0416666666666665e-11 1228 1991 -1.0416666666666663e-11 1228 2315 6.2500000000000004e-11 1228 1226 -2.0833333333333326e-11 1228 4316 1.6155871338926322e-27 1228 5005 1.0416666666666665e-11 1228 1075 1.0416666666666663e-11 1228 816 -6.2500000000000004e-11 1228 4318 -2.0833333333333326e-11 1229 1229 2.0833333333333334e-10 1229 1782 -2.0833333333333329e-11 1229 1770 2.0833333333333332e-11 1229 1765 2.0833333333333326e-11 1229 1757 -4.1666666666666658e-11 1229 1235 4.1666666666666665e-11 1229 1785 -4.3283707583767993e-28 1229 1760 -4.1666666666666671e-11 1229 1759 -4.1666666666666671e-11 1229 1230 -4.1666666666666665e-11 1229 4460 3.1495832401145651e-28 1229 3783 -4.1666666666666665e-11 1229 3784 -6.2500000000000004e-11 1230 1230 4.9999999999999993e-10 1230 2077 -5.2083333333333328e-11 1230 1808 -8.3333333333333343e-11 1230 2190 3.1250000000000002e-11 1230 1784 -4.1666666666666671e-11 1230 1807 -1.2499999999999998e-10 1230 1245 -1.0416666666666674e-11 1230 1782 1.6155871338926322e-27 1230 1235 5.2083333333333334e-11 1230 1765 1.0416666666666665e-11 1230 2076 2.0194839173657902e-27 1230 1803 -6.4623485355705287e-27 1230 1802 -1.0416666666666666e-11 1230 1238 6.2500000000000004e-11 1230 1785 1.0416666666666666e-11 1230 1760 5.2083333333333334e-11 1230 1759 1.0416666666666667e-10 1230 1229 -4.1666666666666665e-11 1230 4461 2.0194839173657902e-27 1230 3791 1.6155871338926322e-27 1230 3784 6.2500000000000004e-11 1231 1231 4.9999999999999993e-10 1231 2043 -2.0194839173657902e-27 1231 2190 3.1250000000000002e-11 1231 2037 -5.2083333333333328e-11 1231 1784 -4.1666666666666658e-11 1231 2017 -1.2500000000000001e-10 1231 1245 -1.0416666666666653e-11 1231 2021 -1.0416666666666669e-11 1231 2077 -5.2083333333333334e-11 1231 2020 -8.3333333333333330e-11 1231 1238 6.2500000000000004e-11 1231 1781 3.2311742677852644e-27 1231 1780 -1.0416666666666665e-11 1231 2019 -1.0416666666666667e-10 1231 1235 5.2083333333333328e-11 1231 1234 -4.1666666666666665e-11 1231 2034 -2.0194839173657902e-27 1231 2016 -6.4623485355705287e-27 1231 2015 -1.0416666666666666e-11 1231 1233 1.6155871338926322e-27 1231 1232 6.2500000000000004e-11 1232 1232 3.7500000000000000e-10 1232 2064 -4.5860624244724788e-28 1232 2019 -5.2083333333333334e-11 1232 2037 -1.4583333333333335e-10 1232 1234 -6.2500000000000004e-11 1232 2036 -1.0416666666666671e-11 1232 2109 5.2083333333333334e-11 1232 1244 6.2499999999999991e-11 1232 2042 -1.0416666666666665e-11 1232 2039 -1.0416666666666674e-11 1232 2061 -1.0416666666666663e-11 1232 2035 -6.2500000000000004e-11 1232 1237 -2.6253290925755273e-27 1232 1241 -2.0833333333333326e-11 1232 2034 -1.0416666666666668e-11 1232 2016 -2.0194839173657902e-27 1232 2015 1.0416666666666666e-11 1232 1233 1.6155871338926322e-27 1232 1231 6.2499999999999991e-11 1233 1233 5.4166666666666666e-10 1233 2021 -2.2851328271989659e-27 1233 2043 -9.3749999999999999e-11 1233 2040 -6.2499999999999991e-11 1233 2074 -1.0416666666666666e-11 1233 1238 9.5018296033870872e-28 1233 1243 4.1666666666666665e-11 1233 2035 1.0416666666666666e-11 1233 2041 -8.3333333333333330e-11 1233 2042 -6.2499999999999991e-11 1233 1242 -3.0991386737738975e-27 1233 1241 4.1666666666666665e-11 1233 2034 9.3750000000000012e-11 1233 2016 1.0416666666666667e-10 1233 2015 -3.6295685768920020e-28 1233 1232 9.5018296033870872e-28 1233 1231 1.0034310714411270e-27 1233 4893 -1.0416666666666666e-11 1233 4475 -1.0416666666666666e-11 1234 1234 2.0833333333333331e-10 1234 2015 3.1495832401145651e-28 1234 2037 4.1666666666666665e-11 1234 1232 -6.2500000000000004e-11 1234 2036 1.8812360437258079e-27 1234 1783 -2.0833333333333332e-11 1234 2109 -4.1666666666666665e-11 1234 1244 -4.1666666666666665e-11 1234 1781 -2.0833333333333332e-11 1234 1780 -2.0833333333333323e-11 1234 2019 4.1666666666666658e-11 1234 1235 4.1666666666666665e-11 1234 1231 -4.1666666666666665e-11 1235 1235 7.2916666666666658e-10 1235 1807 -3.1250000000000002e-11 1235 1784 -1.6666666666666671e-10 1235 2017 -3.1249999999999995e-11 1235 1245 2.0833333333333339e-11 1235 2109 -1.0416666666666666e-11 1235 1783 -9.3750000000000012e-11 1235 1772 1.8812360437258079e-27 1235 1244 5.6797985175912850e-27 1235 1782 -7.2916666666666673e-11 1235 1230 5.2083333333333341e-11 1235 1759 -1.0416666666666666e-11 1235 1770 9.3749999999999999e-11 1235 1765 6.2499999999999991e-11 1235 1757 -1.0416666666666666e-11 1235 1229 4.1666666666666665e-11 1235 1781 -7.2916666666666673e-11 1235 1780 -6.2499999999999991e-11 1235 2019 1.0416666666666666e-11 1235 1231 5.2083333333333328e-11 1235 1234 4.1666666666666665e-11 1235 3783 9.5018296033870872e-28 1236 1236 2.0833333333333331e-10 1236 1774 2.8940292364521930e-29 1236 1773 4.1666666666666678e-11 1236 1772 2.2851328271989659e-27 1236 2064 -2.0833333333333332e-11 1236 2128 4.1666666666666671e-11 1236 1244 -4.1666666666666665e-11 1236 2063 -2.0833333333333332e-11 1236 2062 -2.0833333333333323e-11 1236 2069 4.1666666666666671e-11 1236 1237 4.1666666666666665e-11 1236 3783 -6.2500000000000004e-11 1236 3790 -4.1666666666666665e-11 1237 1237 6.0416666666666670e-10 1237 2036 2.2851328271989659e-27 1237 2064 -9.3749999999999999e-11 1237 2128 1.0416666666666666e-11 1237 1244 1.0034310714411270e-27 1237 2039 9.3749999999999999e-11 1237 2061 -6.2499999999999991e-11 1237 2035 1.0416666666666666e-11 1237 1232 -3.0991386737738975e-27 1237 1241 4.1666666666666665e-11 1237 2059 8.3333333333333330e-11 1237 2058 6.2499999999999991e-11 1237 1240 -3.0991386737738975e-27 1237 2063 -8.3333333333333330e-11 1237 2062 -6.2499999999999991e-11 1237 2069 1.0416666666666666e-11 1237 1236 4.1666666666666665e-11 1237 4477 -1.0416666666666666e-11 1237 4846 -1.0416666666666666e-11 1237 4482 -1.0416666666666666e-11 1237 3789 4.1666666666666665e-11 1237 3790 -3.0991386737738975e-27 1238 1238 3.7500000000000000e-10 1238 2016 -2.2470898404921788e-28 1238 1808 -5.2083333333333334e-11 1238 2043 1.0416666666666671e-11 1238 2040 -1.0416666666666663e-11 1238 1233 1.6155871338926322e-27 1238 2075 1.0416666666666665e-11 1238 2074 6.2500000000000004e-11 1238 1243 -2.0833333333333326e-11 1238 2021 1.0416666666666669e-11 1238 2077 -1.4583333333333335e-10 1238 2020 -5.2083333333333334e-11 1238 1231 6.2499999999999991e-11 1238 1239 -6.2500000000000004e-11 1238 2076 1.0416666666666671e-11 1238 1803 -2.0194839173657902e-27 1238 1802 1.0416666666666666e-11 1238 1230 6.2499999999999991e-11 1238 3791 -2.6253290925755273e-27 1239 1239 3.3333333333333332e-10 1239 2017 -4.1666666666666665e-11 1239 1802 -8.8938459461701536e-29 1239 1808 4.1666666666666665e-11 1239 1807 -4.1666666666666665e-11 1239 2190 1.6666666666666669e-10 1239 1245 -6.2500000000000004e-11 1239 2021 2.8940292364521930e-29 1239 2077 4.1666666666666671e-11 1239 2020 4.1666666666666671e-11 1239 1238 -6.2500000000000004e-11 1239 1231 -6.4623485355705287e-27 1240 1240 2.4999999999999996e-10 1240 2061 -1.0416666666666666e-11 1240 2065 -1.0416666666666665e-11 1240 1241 -2.0833333333333326e-11 1240 2060 -2.0833333333333339e-11 1240 2059 -2.0833333333333339e-11 1240 2058 1.0416666666666666e-11 1240 1237 -2.6253290925755273e-27 1240 4477 6.2499999999999991e-11 1240 3788 1.6155871338926322e-27 1240 4457 1.0416666666666665e-11 1240 4482 6.2500000000000004e-11 1240 3789 -2.0833333333333326e-11 1241 1241 2.5000000000000002e-10 1241 2034 2.0833333333333332e-11 1241 2066 -2.0833333333333329e-11 1241 2041 -2.0833333333333332e-11 1241 2042 -2.0833333333333326e-11 1241 1233 4.1666666666666665e-11 1241 1242 -2.0833333333333326e-11 1241 2059 2.0833333333333332e-11 1241 2060 2.0833333333333332e-11 1241 2065 -2.0833333333333326e-11 1241 1240 -2.0833333333333326e-11 1241 2039 2.0833333333333332e-11 1241 2061 -2.0833333333333326e-11 1241 2035 4.1666666666666665e-11 1241 1237 4.1666666666666665e-11 1241 1232 -2.0833333333333326e-11 1241 4475 -4.1666666666666665e-11 1241 4477 -4.1666666666666665e-11 1241 3788 4.1666666666666665e-11 1242 1242 2.4999999999999996e-10 1242 2040 -1.0416666666666666e-11 1242 2067 -1.0416666666666665e-11 1242 1243 -2.0833333333333326e-11 1242 2066 2.0833333333333332e-11 1242 2065 -1.0416666666666665e-11 1242 2041 2.0833333333333339e-11 1242 2042 -1.0416666666666666e-11 1242 1233 -2.6253290925755273e-27 1242 1241 -2.0833333333333326e-11 1242 4893 6.2499999999999991e-11 1242 3788 1.6155871338926322e-27 1242 4475 6.2499999999999991e-11 1243 1243 2.5000000000000002e-10 1243 2041 -2.0833333333333329e-11 1243 2066 -2.0833333333333332e-11 1243 1242 -2.0833333333333326e-11 1243 2043 -2.0833333333333332e-11 1243 2040 -2.0833333333333326e-11 1243 1233 4.1666666666666665e-11 1243 2076 -2.0833333333333332e-11 1243 1238 -2.0833333333333326e-11 1243 2074 -4.1666666666666665e-11 1243 2067 -2.0833333333333326e-11 1243 2075 2.0833333333333326e-11 1243 4893 -4.1666666666666665e-11 1243 4458 2.0833333333333329e-11 1243 3788 4.1666666666666665e-11 1243 4887 2.0833333333333332e-11 1243 4888 -4.1666666666666665e-11 1243 3791 4.1666666666666665e-11 1243 3792 -2.0833333333333326e-11 1244 1244 3.7500000000000000e-10 1244 2039 2.0194839173657902e-27 1244 1773 -5.2083333333333334e-11 1244 2062 -1.0416666666666666e-11 1244 2064 1.0416666666666673e-11 1244 2128 -1.0416666666666667e-10 1244 1237 1.6155871338926322e-27 1244 1236 -4.1666666666666665e-11 1244 2037 -5.2083333333333334e-11 1244 1232 6.2500000000000004e-11 1244 2036 1.0416666666666658e-11 1244 1780 -1.0416666666666665e-11 1244 2109 1.0416666666666667e-10 1244 1234 -4.1666666666666665e-11 1244 1770 2.0194839173657902e-27 1244 1235 6.4623485355705287e-27 1244 1783 1.0416666666666671e-11 1244 1772 1.0416666666666661e-11 1244 3783 6.2500000000000004e-11 1245 1245 1.6666666666666663e-10 1245 2020 -1.0416666666666665e-11 1245 1808 -1.0416666666666666e-11 1245 2190 -2.0833333333333339e-11 1245 1239 -6.2500000000000004e-11 1245 1782 -1.0416666666666665e-11 1245 1807 -1.0416666666666655e-11 1245 1230 -1.0416666666666673e-11 1245 1781 -1.0416666666666666e-11 1245 1235 2.0833333333333339e-11 1245 1231 -1.0416666666666653e-11 1245 1784 -6.2500000000000004e-11 1245 2017 -1.0416666666666673e-11 1246 1246 2.0833333333333329e-02 1247 1247 2.4999999999999994e-02 1248 1248 2.0833333333333329e-02 1249 1249 3.3333333333333326e-02 1249 1793 -4.1666666666666666e-03 1249 2150 -4.5316262678105068e-20 1249 2143 -4.1666666666666666e-03 1249 2134 4.1666666666666657e-03 1249 2130 1.6666666666666663e-02 1249 1250 -6.2499999999999986e-03 1249 1790 -2.8940292364521927e-21 1249 2141 -4.1666666666666675e-03 1249 1789 4.1666666666666675e-03 1249 2837 4.3368086899420177e-19 1249 4288 -4.3368086899420177e-19 1250 1250 1.6666666666666663e-02 1250 1251 2.0833333333333337e-03 1250 2137 6.2499999999999986e-03 1250 1789 -1.0416666666666664e-03 1250 1793 -1.0416666666666671e-03 1250 2143 1.0416666666666667e-03 1250 2134 1.0416666666666654e-03 1250 2130 -2.0833333333333337e-03 1250 1249 -6.2499999999999986e-03 1250 3392 1.0416666666666664e-03 1250 4958 1.0416666666666667e-03 1250 4288 -1.0416666666666656e-03 1250 2837 -1.0416666666666671e-03 1251 1251 7.9166666666666649e-02 1251 2134 3.1249999999999997e-03 1251 2137 1.6666666666666663e-02 1251 1793 -3.1249999999999997e-03 1251 1250 2.0833333333333333e-03 1251 3395 8.3333333333333315e-03 1251 3672 -1.0416666666666667e-03 1251 2844 -8.8991399020904929e-20 1251 3374 -1.0416666666666667e-03 1251 3394 -8.3333333333333315e-03 1251 2840 -8.8991399020904929e-20 1251 3393 -6.2500000000000003e-03 1251 3669 1.0416666666666667e-03 1251 2839 4.1666666666666666e-03 1251 3392 7.2916666666666659e-03 1251 2837 5.2083333333333330e-03 1251 3378 6.2500000000000003e-03 1251 3369 -1.0416666666666667e-03 1251 2836 4.1666666666666666e-03 1251 4950 -1.0416666666666667e-03 1251 4958 7.2916666666666659e-03 1251 4947 6.2500000000000003e-03 1251 4946 -1.0416666666666667e-03 1251 4288 5.2083333333333330e-03 1251 4287 4.1666666666666666e-03 1252 1252 1.8749999999999996e-02 1253 1253 2.0833333333333332e-02 1254 1254 3.7499999999999992e-02 1254 2133 -1.0416666666666664e-02 1254 2142 1.0416666666666667e-03 1254 1789 -5.2083333333333322e-03 1254 2130 -1.0416666666666664e-02 1254 1255 -4.1666666666666657e-03 1254 2131 -1.0416666666666667e-03 1254 2136 -1.0416666666666673e-03 1254 2132 -1.0416666666666671e-03 1254 1793 1.0416666666666673e-03 1254 4595 1.0416666666666667e-03 1254 4588 5.2083333333333322e-03 1254 4015 -4.1666666666666657e-03 1254 4654 -2.1684043449710089e-19 1254 4018 2.1684043449710089e-19 1254 4021 6.2499999999999995e-03 1255 1255 2.0833333333333329e-02 1255 2131 2.0833333333333329e-03 1255 1793 -2.8940292364521927e-21 1255 2130 4.1666666666666675e-03 1255 1254 -4.1666666666666657e-03 1255 1791 8.8938459461701536e-21 1255 1789 4.1666666666666666e-03 1255 2142 2.0833333333333329e-03 1255 2145 -4.1666666666666657e-03 1255 4021 -6.2499999999999986e-03 1256 1256 2.7083333333333327e-02 1257 1257 2.9166666666666660e-02 1258 1258 1.0416666666666664e-02 1259 1259 4.9999999999999989e-02 1259 1791 -6.2499999999999986e-03 1259 1795 6.2499999999999986e-03 1259 1790 -6.2499999999999986e-03 1259 1788 -2.3039296165316969e-19 1259 1794 6.2499999999999986e-03 1259 1792 -7.3183646642771549e-19 1259 4960 -6.2499999999999986e-03 1259 4962 -6.2499999999999986e-03 1260 1260 2.0833333333333332e-02 1261 1261 2.9166666666666660e-02 1262 1262 1.0416666666666664e-02 1263 1263 2.0833333333333329e-02 1264 1264 1.0416666666666664e-02 1265 1265 2.9166666666666660e-02 1266 1266 1.0416666666666664e-02 1267 1267 2.4999999999999996e-10 1267 2192 4.5860624244724788e-28 1267 1911 -1.0416666666666665e-11 1267 1904 -1.0416666666666667e-10 1267 1280 -4.1666666666666665e-11 1267 1903 -1.0416666666666671e-11 1267 2174 5.2083333333333334e-11 1267 1279 6.2499999999999991e-11 1267 1914 1.2116903504194741e-27 1267 1278 4.0389678347315804e-27 1267 1908 -1.0416666666666668e-11 1267 1917 1.2116903504194741e-27 1267 1906 1.0416666666666666e-11 1267 1905 -5.6545549686242126e-27 1267 1269 -1.0416666666666666e-11 1267 1268 -2.6253290925755273e-27 1268 1268 4.7916666666666661e-10 1268 1903 1.8812360437258079e-27 1268 2192 9.3750000000000012e-11 1268 2190 1.0416666666666666e-11 1268 1279 5.6797985175912850e-27 1268 2218 2.0833333333333329e-11 1268 1920 -2.0833333333333329e-11 1268 2215 6.2499999999999991e-11 1268 1288 3.5628902784306998e-27 1268 2275 1.0416666666666665e-11 1268 1272 5.2083333333333328e-11 1268 2271 2.0833333333333329e-11 1268 2273 7.2916666666666673e-11 1268 2274 -6.2499999999999991e-11 1268 2272 1.0416666666666666e-11 1268 1270 2.0648434194159984e-27 1268 1275 4.1666666666666665e-11 1268 1917 -1.0416666666666665e-11 1268 1906 2.0833333333333326e-11 1268 1905 8.3333333333333330e-11 1268 1269 5.2083333333333328e-11 1268 1267 -3.0470738540293107e-27 1269 1269 5.0000000000000003e-10 1269 2215 2.0833333333333329e-11 1269 1920 -1.0416666666666666e-10 1269 2216 2.0833333333333332e-11 1269 1288 -1.0416666666666661e-11 1269 1919 -4.1666666666666665e-11 1269 1287 5.2083333333333328e-11 1269 2264 2.0833333333333329e-11 1269 1918 -1.0416666666666666e-10 1269 1916 2.0833333333333332e-11 1269 1286 -1.0416666666666663e-11 1269 1914 4.1666666666666658e-11 1269 1278 5.2083333333333328e-11 1269 1908 2.0833333333333329e-11 1269 1917 -4.1666666666666658e-11 1269 1906 1.0416666666666666e-10 1269 1905 2.0833333333333332e-11 1269 1268 5.2083333333333328e-11 1269 1267 -1.0416666666666663e-11 1270 1270 2.4999999999999996e-10 1270 1808 -5.2083333333333334e-11 1270 1805 -2.2470898404921788e-28 1270 1809 1.0416666666666669e-11 1270 1273 6.2499999999999991e-11 1270 2275 1.4136387421560532e-27 1270 2273 -1.0416666666666673e-11 1270 2274 -1.0416666666666666e-11 1270 2272 -1.0416666666666667e-10 1270 1268 1.6155871338926322e-27 1270 1275 -4.1666666666666665e-11 1270 2276 1.4136387421560532e-27 1270 2271 1.0416666666666666e-11 1270 2270 -2.2214323091023692e-27 1270 1272 -1.0416666666666666e-11 1270 1271 1.6155871338926322e-27 1271 1271 4.1666666666666662e-10 1271 2283 1.0416666666666661e-11 1271 1290 5.2083333333333328e-11 1271 1817 8.3333333333333343e-11 1271 1274 3.5100365977808920e-27 1271 1809 -1.8812360437258079e-27 1271 2281 2.0833333333333329e-11 1271 2277 -2.0833333333333329e-11 1271 2278 6.2499999999999991e-11 1271 1289 3.5628902784306998e-27 1271 1805 1.0416666666666668e-10 1271 1804 3.6295685768920020e-28 1271 1273 5.6797985175912850e-27 1271 2276 -1.0416666666666661e-11 1271 2271 2.0833333333333326e-11 1271 2270 8.3333333333333330e-11 1271 1272 5.2083333333333328e-11 1271 1270 1.0030366409885165e-27 1271 699 2.0833333333333329e-11 1272 1272 4.9999999999999993e-10 1272 2278 2.0833333333333329e-11 1272 2277 -1.0416666666666666e-10 1272 2266 -2.0833333333333332e-11 1272 1289 -1.0416666666666661e-11 1272 2268 4.1666666666666665e-11 1272 1287 5.2083333333333328e-11 1272 2216 2.0833333333333329e-11 1272 2218 1.0416666666666666e-10 1272 2215 2.0833333333333332e-11 1272 1288 -1.0416666666666661e-11 1272 2275 4.1666666666666665e-11 1272 1268 5.2083333333333328e-11 1272 2273 2.0833333333333329e-11 1272 2276 -4.1666666666666658e-11 1272 2271 1.0416666666666666e-10 1272 2270 2.0833333333333332e-11 1272 1271 5.2083333333333328e-11 1272 1270 -1.0416666666666663e-11 1273 1273 4.3749999999999999e-10 1273 2272 -5.2083333333333334e-11 1273 2270 2.0194839173657902e-27 1273 1270 6.2500000000000004e-11 1273 1809 -1.0416666666666669e-11 1273 1808 -1.4583333333333335e-10 1273 1275 -6.2500000000000004e-11 1273 2190 -5.2083333333333334e-11 1273 1812 -4.5860624244724788e-28 1273 1807 -1.0416666666666671e-11 1273 1279 6.2499999999999991e-11 1273 1763 5.2083333333333328e-11 1273 1806 -1.0416666666666674e-11 1273 1767 1.0416666666666666e-11 1273 1759 1.0416666666666667e-10 1273 1277 -2.6253290925755273e-27 1273 1276 -4.1666666666666665e-11 1273 1817 -2.0194839173657902e-27 1273 1805 -1.6155871338926322e-27 1273 1804 -1.0416666666666666e-11 1273 1271 6.4623485355705287e-27 1273 1274 6.2500000000000004e-11 1274 1274 2.4999999999999996e-10 1274 2283 1.2116903504194741e-27 1274 1271 4.0389678347315804e-27 1274 1817 -1.6155871338926322e-27 1274 1818 -1.0416666666666669e-11 1274 1290 -1.0416666666666666e-11 1274 1282 -2.6253290925755273e-27 1274 1768 1.0416666666666666e-11 1274 1763 1.0416666666666666e-10 1274 1759 5.2083333333333334e-11 1274 1276 -4.1666666666666665e-11 1274 1805 -2.0194839173657902e-27 1274 1804 1.0416666666666666e-11 1274 1273 6.2499999999999991e-11 1274 702 1.2116903504194741e-27 1274 699 1.0416666666666666e-11 1275 1275 2.0833333333333331e-10 1275 1809 -2.8940292364521930e-29 1275 1808 4.1666666666666665e-11 1275 1273 -6.2500000000000004e-11 1275 1807 1.8812360437258079e-27 1275 2192 2.0833333333333332e-11 1275 2190 4.1666666666666671e-11 1275 1279 -4.1666666666666665e-11 1275 2273 2.0833333333333332e-11 1275 2274 -2.0833333333333323e-11 1275 2272 4.1666666666666671e-11 1275 1268 4.1666666666666665e-11 1275 1270 -4.1666666666666665e-11 1276 1276 2.2916666666666665e-10 1276 1818 2.0833333333333329e-11 1276 1814 2.0833333333333332e-11 1276 2094 2.0833333333333332e-11 1276 1768 2.0833333333333326e-11 1276 1761 -4.1666666666666665e-11 1276 1282 4.1666666666666665e-11 1276 1281 -2.0833333333333326e-11 1276 1804 -3.1495832401145651e-28 1276 1274 -4.1666666666666658e-11 1276 1763 -4.1666666666666665e-11 1276 1806 2.0833333333333332e-11 1276 1767 2.0833333333333326e-11 1276 1759 -4.1666666666666665e-11 1276 1277 4.1666666666666665e-11 1276 1273 -4.1666666666666665e-11 1277 1277 6.0416666666666670e-10 1277 1814 8.3333333333333330e-11 1277 1735 6.2499999999999991e-11 1277 1732 -1.0416666666666666e-11 1277 1281 -3.0991386737738975e-27 1277 1283 4.1666666666666665e-11 1277 2175 -1.0416666666666666e-11 1277 1815 -8.3333333333333330e-11 1277 1284 -3.0991386737738975e-27 1277 1728 -1.0416666666666666e-11 1277 1761 -1.0416666666666666e-11 1277 1813 -6.2499999999999991e-11 1277 2174 -1.0416666666666666e-11 1277 1280 4.1666666666666665e-11 1277 1812 -9.3749999999999999e-11 1277 1807 1.8812360437258079e-27 1277 1279 1.0034310714411270e-27 1277 1806 9.3749999999999999e-11 1277 1767 6.2499999999999991e-11 1277 1759 -1.0416666666666666e-11 1277 1273 -3.0991386737738975e-27 1277 1276 4.1666666666666665e-11 1278 1278 5.4166666666666666e-10 1278 1916 6.2499999999999991e-11 1278 1286 3.5628902784306998e-27 1278 1915 7.2916666666666660e-11 1278 1285 1.0030366409885165e-27 1278 1918 -2.0833333333333329e-11 1278 2175 -1.0416666666666666e-11 1278 1911 -6.2499999999999991e-11 1278 1904 1.0416666666666666e-11 1278 1280 4.1666666666666665e-11 1278 1726 -1.0416666666666666e-11 1278 1912 -8.3333333333333330e-11 1278 1736 6.2499999999999991e-11 1278 1728 -1.0416666666666666e-11 1278 1284 9.5018296033870872e-28 1278 1283 4.1666666666666665e-11 1278 1914 1.0416666666666661e-11 1278 1269 5.2083333333333328e-11 1278 1906 2.0833333333333329e-11 1278 1908 7.2916666666666673e-11 1278 1267 3.5100365977808920e-27 1278 1038 -2.0833333333333329e-11 1278 1035 -1.0416666666666661e-11 1278 1024 2.0833333333333326e-11 1278 291 5.2083333333333328e-11 1279 1279 3.7500000000000000e-10 1279 1905 2.0194839173657902e-27 1279 1808 -5.2083333333333334e-11 1279 2274 -1.0416666666666663e-11 1279 2192 -1.0416666666666671e-11 1279 2190 -1.0416666666666667e-10 1279 1268 6.4623485355705287e-27 1279 1275 -4.1666666666666665e-11 1279 1904 -5.2083333333333334e-11 1279 1267 6.2500000000000004e-11 1279 1903 1.0416666666666658e-11 1279 1813 -1.0416666666666663e-11 1279 2174 1.0416666666666667e-10 1279 1280 -4.1666666666666665e-11 1279 1806 2.0194839173657902e-27 1279 1277 1.6155871338926322e-27 1279 1273 6.2500000000000004e-11 1279 1812 1.0416666666666673e-11 1279 1807 1.0416666666666658e-11 1280 1280 2.2916666666666665e-10 1280 1912 -2.0833333333333329e-11 1280 1815 -2.0833333333333332e-11 1280 2175 -4.1666666666666665e-11 1280 1284 -2.0833333333333326e-11 1280 1908 2.0833333333333332e-11 1280 1911 -2.0833333333333326e-11 1280 1278 4.1666666666666665e-11 1280 1904 4.1666666666666658e-11 1280 1267 -4.1666666666666665e-11 1280 1903 2.2851328271989659e-27 1280 1813 -2.0833333333333323e-11 1280 1812 -2.0833333333333332e-11 1280 2174 -4.1666666666666671e-11 1280 1277 4.1666666666666665e-11 1280 1279 -4.1666666666666665e-11 1281 1281 2.4999999999999996e-10 1281 2094 -2.0833333333333339e-11 1281 1282 1.6155871338926322e-27 1281 1814 -2.0833333333333339e-11 1281 1735 1.0416666666666663e-11 1281 1732 6.2500000000000004e-11 1281 1277 -2.6253290925755273e-27 1281 1283 -2.0833333333333326e-11 1281 1767 1.0416666666666665e-11 1281 1768 1.0416666666666663e-11 1281 1761 6.2500000000000004e-11 1281 1276 -2.0833333333333326e-11 1281 1023 1.0416666666666665e-11 1282 1282 5.4166666666666666e-10 1282 2094 8.3333333333333330e-11 1282 1281 9.5018296033870872e-28 1282 1732 -1.0416666666666666e-11 1282 1726 -1.0416666666666666e-11 1282 1285 2.0648434194159984e-27 1282 1283 4.1666666666666665e-11 1282 1818 7.2916666666666660e-11 1282 1290 5.2083333333333328e-11 1282 1274 -3.0470738540293107e-27 1282 1763 -1.0416666666666666e-11 1282 1768 6.2499999999999991e-11 1282 1761 -1.0416666666666666e-11 1282 1276 4.1666666666666665e-11 1282 1036 -2.0833333333333329e-11 1282 703 -2.0833333333333329e-11 1282 1028 -6.2499999999999991e-11 1282 292 3.5628902784306998e-27 1282 1031 1.0416666666666665e-11 1282 291 5.2083333333333328e-11 1282 1024 2.0833333333333329e-11 1282 1025 7.2916666666666673e-11 1282 1023 6.2499999999999991e-11 1282 702 -1.0416666666666665e-11 1282 699 2.0833333333333326e-11 1283 1283 2.4999999999999996e-10 1283 2094 2.0833333333333332e-11 1283 1814 2.0833333333333332e-11 1283 1735 2.0833333333333326e-11 1283 1732 -4.1666666666666665e-11 1283 1277 4.1666666666666665e-11 1283 1281 -2.0833333333333326e-11 1283 1726 -4.1666666666666665e-11 1283 1282 4.1666666666666665e-11 1283 1285 -2.0833333333333326e-11 1283 1915 2.0833333333333329e-11 1283 1815 -2.0833333333333332e-11 1283 1912 -2.0833333333333332e-11 1283 1736 2.0833333333333326e-11 1283 1728 -4.1666666666666665e-11 1283 1278 4.1666666666666665e-11 1283 1284 -2.0833333333333326e-11 1283 1025 2.0833333333333332e-11 1283 1023 2.0833333333333326e-11 1284 1284 2.4999999999999996e-10 1284 1911 -1.0416666666666665e-11 1284 1813 -1.0416666666666666e-11 1284 2175 6.2500000000000004e-11 1284 1280 -2.0833333333333326e-11 1284 1815 2.0833333333333339e-11 1284 1277 -2.6253290925755273e-27 1284 1735 1.0416666666666666e-11 1284 1912 2.0833333333333339e-11 1284 1736 1.0416666666666665e-11 1284 1728 6.2499999999999991e-11 1284 1278 1.6155871338926322e-27 1284 1283 -2.0833333333333326e-11 1285 1285 1.8749999999999997e-10 1285 1726 6.2499999999999991e-11 1285 1282 1.6155871338926322e-27 1285 1283 -2.0833333333333326e-11 1285 1915 -1.0416666666666666e-11 1285 1278 1.6155871338926322e-27 1285 1736 1.0416666666666665e-11 1285 1031 1.4136387421560532e-27 1285 1025 -1.0416666666666673e-11 1285 1023 1.0416666666666666e-11 1285 1035 1.4136387421560532e-27 1285 1024 1.0416666666666666e-11 1285 291 -1.0416666666666666e-11 1286 1286 1.2499999999999998e-10 1286 1278 4.0389678347315804e-27 1286 1916 -1.6155871338926322e-27 1286 2264 -4.0389678347315804e-27 1286 1287 1.6155871338926322e-27 1286 1919 -1.4136387421560532e-27 1286 1914 -1.4136387421560532e-27 1286 1918 -1.0416666666666665e-11 1286 1269 -1.0416666666666665e-11 1286 1035 -1.0097419586828951e-27 1286 1037 1.0097419586828951e-27 1286 1038 -1.0416666666666663e-11 1286 291 -1.0416666666666663e-11 1287 1287 4.1666666666666657e-10 1287 2264 6.2499999999999991e-11 1287 1286 2.1169082391605852e-27 1287 2269 1.0416666666666665e-11 1287 1290 5.2083333333333328e-11 1287 2281 2.0833333333333329e-11 1287 2277 -2.0833333333333326e-11 1287 2266 -6.2499999999999991e-11 1287 1289 2.1169082391605852e-27 1287 2268 1.0416666666666665e-11 1287 1272 5.2083333333333328e-11 1287 2218 2.0833333333333329e-11 1287 1920 -2.0833333333333329e-11 1287 2216 6.2500000000000004e-11 1287 1288 3.7324953730532174e-27 1287 1919 -1.0416666666666665e-11 1287 1269 5.2083333333333328e-11 1287 1918 -2.0833333333333329e-11 1287 1038 -2.0833333333333326e-11 1287 1037 -1.0416666666666665e-11 1287 291 5.2083333333333328e-11 1287 1036 -2.0833333333333329e-11 1287 703 -2.0833333333333329e-11 1287 1041 6.2500000000000004e-11 1287 292 3.7324953730532174e-27 1288 1288 1.2499999999999998e-10 1288 2268 1.2116903504194741e-27 1288 2275 -1.2116903504194741e-27 1288 2218 1.0416666666666661e-11 1288 1272 -1.0416666666666661e-11 1288 1917 -1.0097419586828951e-27 1288 1268 4.0389678347315804e-27 1288 2215 -4.0389678347315804e-27 1288 1919 1.0097419586828951e-27 1288 1920 -1.0416666666666661e-11 1288 2216 -4.0389678347315804e-27 1288 1269 -1.0416666666666661e-11 1288 1287 4.0389678347315804e-27 1289 1289 1.2499999999999998e-10 1289 2269 1.4136387421560532e-27 1289 2283 -1.4136387421560532e-27 1289 2281 1.0416666666666665e-11 1289 1290 -1.0416666666666665e-11 1289 2276 -1.0097419586828951e-27 1289 1271 4.0389678347315804e-27 1289 2278 -1.6155871338926322e-27 1289 2268 -1.0097419586828951e-27 1289 2277 -1.0416666666666663e-11 1289 2266 4.0389678347315804e-27 1289 1272 -1.0416666666666663e-11 1289 1287 1.6155871338926322e-27 1290 1290 4.9999999999999993e-10 1290 2269 4.1666666666666665e-11 1290 1287 5.2083333333333328e-11 1290 2283 4.1666666666666658e-11 1290 1271 5.2083333333333328e-11 1290 1817 2.0833333333333329e-11 1290 1818 2.0833333333333332e-11 1290 1282 5.2083333333333328e-11 1290 1274 -1.0416666666666663e-11 1290 2266 -2.0833333333333329e-11 1290 2281 1.0416666666666666e-10 1290 2278 2.0833333333333332e-11 1290 1289 -1.0416666666666663e-11 1290 1028 -2.0833333333333329e-11 1290 703 -1.0416666666666666e-10 1290 1041 2.0833333333333332e-11 1290 292 -1.0416666666666661e-11 1290 702 -4.1666666666666658e-11 1290 699 1.0416666666666666e-10 1291 1291 2.5000000000000002e-10 1291 1829 2.0833333333333326e-11 1291 1828 -4.1666666666666665e-11 1291 1825 2.0833333333333326e-11 1291 1824 -4.1666666666666665e-11 1291 1821 2.0833333333333326e-11 1291 1820 -4.1666666666666665e-11 1292 1292 1.2499999999999998e-10 1293 1293 1.6666666666666666e-10 1294 1294 1.2499999999999998e-10 1295 1295 1.6666666666666666e-10 1296 1296 1.2499999999999998e-10 1297 1297 1.6666666666666666e-10 1298 1298 2.5000000000000002e-10 1298 1828 -4.1666666666666665e-11 1298 1821 2.0833333333333326e-11 1298 1820 -4.1666666666666665e-11 1298 1839 2.0833333333333329e-11 1298 1832 2.0833333333333326e-11 1298 1837 2.0833333333333332e-11 1298 1831 2.0833333333333326e-11 1298 1830 -4.1666666666666665e-11 1298 1299 -2.0833333333333326e-11 1299 1299 2.4999999999999996e-10 1299 2178 1.0416666666666665e-11 1299 1832 1.0416666666666666e-11 1299 1839 -2.0833333333333339e-11 1299 1841 -1.0416666666666666e-11 1299 1838 -6.2499999999999991e-11 1299 1301 -2.0833333333333326e-11 1299 1837 -2.0833333333333332e-11 1299 1831 1.0416666666666665e-11 1299 1830 6.2499999999999991e-11 1299 1298 -2.0833333333333326e-11 1300 1300 3.3333333333333332e-10 1301 1301 2.5000000000000002e-10 1301 2176 -4.1666666666666665e-11 1301 2173 2.0833333333333326e-11 1301 2172 -4.1666666666666665e-11 1301 1837 2.0833333333333329e-11 1301 2178 2.0833333333333326e-11 1301 1839 2.0833333333333332e-11 1301 1841 -2.0833333333333326e-11 1301 1838 4.1666666666666665e-11 1301 1299 -2.0833333333333326e-11 1302 1302 3.3333333333333332e-10 1303 1303 1.2499999999999998e-10 1304 1304 1.6666666666666666e-10 1305 1305 1.2499999999999998e-10 1306 1306 1.6666666666666666e-10 1307 1307 1.2499999999999998e-10 1308 1308 1.2499999999999998e-10 1309 1309 6.2499999999999991e-11 1310 1310 1.0416666666666666e-10 1311 1311 4.9999999999999993e-10 1311 1875 -4.1666666666666658e-11 1311 1874 -1.0416666666666666e-10 1311 1873 -4.1666666666666665e-11 1311 1872 -1.0416666666666666e-10 1311 1870 4.1666666666666665e-11 1311 1849 1.0416666666666666e-10 1312 1312 6.2499999999999991e-11 1313 1313 1.0416666666666666e-10 1314 1314 6.2499999999999991e-11 1315 1315 1.0416666666666666e-10 1316 1316 6.2499999999999991e-11 1317 1317 2.0833333333333331e-10 1318 1318 4.9999999999999993e-10 1318 2223 -2.0833333333333329e-11 1318 1972 -1.0416666666666666e-10 1318 1963 -2.0833333333333332e-11 1318 1332 -1.0416666666666663e-11 1318 2202 -2.0833333333333329e-11 1318 1971 -4.1666666666666665e-11 1318 1970 -1.0416666666666666e-10 1318 2213 2.0833333333333332e-11 1318 1329 5.2083333333333328e-11 1318 1328 -1.0416666666666661e-11 1318 1968 4.1666666666666658e-11 1318 1969 -4.1666666666666665e-11 1318 1958 1.0416666666666666e-10 1319 1319 6.2499999999999991e-11 1320 1320 2.0833333333333331e-10 1321 1321 4.9999999999999993e-10 1321 1856 -2.0833333333333329e-11 1321 2208 -1.0416666666666666e-10 1321 2220 -2.0833333333333332e-11 1321 1330 -1.0416666666666663e-11 1321 2207 -4.1666666666666658e-11 1321 1329 5.2083333333333328e-11 1321 2213 2.0833333333333329e-11 1321 2206 -1.0416666666666666e-10 1321 2202 -2.0833333333333332e-11 1321 1328 -1.0416666666666661e-11 1321 2205 4.1666666666666665e-11 1321 1859 4.1666666666666658e-11 1321 2199 1.0416666666666666e-10 1322 1322 6.2499999999999991e-11 1323 1323 2.0833333333333331e-10 1324 1324 5.0000000000000003e-10 1324 2292 -2.0833333333333329e-11 1324 1865 -1.0416666666666666e-10 1324 2222 -2.0833333333333332e-11 1324 1331 -1.0416666666666661e-11 1324 1864 -4.1666666666666665e-11 1324 1329 5.2083333333333328e-11 1324 2220 -2.0833333333333329e-11 1324 1863 -1.0416666666666666e-10 1324 1856 -2.0833333333333332e-11 1324 1330 -1.0416666666666663e-11 1324 1861 4.1666666666666658e-11 1324 1862 -4.1666666666666665e-11 1324 1851 1.0416666666666666e-10 1325 1325 6.2499999999999991e-11 1326 1326 2.0833333333333331e-10 1327 1327 4.9999999999999993e-10 1327 1963 -2.0833333333333329e-11 1327 2297 -1.0416666666666666e-10 1327 2223 -2.0833333333333332e-11 1327 1332 -1.0416666666666663e-11 1327 2225 4.1666666666666658e-11 1327 1329 5.2083333333333328e-11 1327 2222 -2.0833333333333329e-11 1327 2296 -1.0416666666666666e-10 1327 2292 -2.0833333333333332e-11 1327 1331 -1.0416666666666661e-11 1327 2295 4.1666666666666665e-11 1327 1966 4.1666666666666658e-11 1327 2288 1.0416666666666666e-10 1328 1328 1.2499999999999998e-10 1328 2207 -1.0097419586828951e-27 1328 2205 -1.0097419586828951e-27 1328 2206 -1.0416666666666661e-11 1328 1321 -1.0416666666666661e-11 1328 1969 -1.2116903504194741e-27 1328 2202 4.0389678347315804e-27 1328 1971 1.2116903504194741e-27 1328 1970 -1.0416666666666661e-11 1328 2213 -4.0389678347315804e-27 1328 1318 -1.0416666666666661e-11 1328 1329 4.0389678347315804e-27 1329 1329 4.1666666666666662e-10 1329 1972 -2.0833333333333329e-11 1329 2297 -2.0833333333333326e-11 1329 2223 -6.2499999999999991e-11 1329 1332 2.1169082391605852e-27 1329 2225 1.0416666666666665e-11 1329 1327 5.2083333333333328e-11 1329 2296 -2.0833333333333329e-11 1329 1865 -2.0833333333333329e-11 1329 2222 -6.2499999999999991e-11 1329 1331 3.5628902784306998e-27 1329 1864 -1.0416666666666665e-11 1329 1324 5.2083333333333328e-11 1329 1863 -2.0833333333333329e-11 1329 2208 -2.0833333333333326e-11 1329 2220 -6.2499999999999991e-11 1329 1330 2.1169082391605852e-27 1329 2207 -1.0416666666666665e-11 1329 1321 5.2083333333333328e-11 1329 2206 -2.0833333333333329e-11 1329 1971 -1.0416666666666665e-11 1329 1970 -2.0833333333333329e-11 1329 2213 6.2499999999999991e-11 1329 1318 5.2083333333333328e-11 1329 1328 3.5628902784306998e-27 1330 1330 1.2499999999999998e-10 1330 1864 -1.4136387421560532e-27 1330 1861 -1.4136387421560532e-27 1330 1863 -1.0416666666666666e-11 1330 1324 -1.0416666666666666e-11 1330 1859 1.2116903504194741e-27 1330 1856 1.6155871338926322e-27 1330 2207 1.2116903504194741e-27 1330 2208 -1.0416666666666666e-11 1330 2220 4.0389678347315804e-27 1330 1321 -1.0416666666666666e-11 1330 1329 1.6155871338926322e-27 1331 1331 1.2499999999999998e-10 1331 2225 1.0097419586828951e-27 1331 2295 -1.0097419586828951e-27 1331 2296 -1.0416666666666661e-11 1331 1327 -1.0416666666666661e-11 1331 1862 -1.2116903504194741e-27 1331 2292 4.0389678347315804e-27 1331 1864 1.2116903504194741e-27 1331 1865 -1.0416666666666661e-11 1331 2222 4.0389678347315804e-27 1331 1324 -1.0416666666666661e-11 1331 1329 4.0389678347315804e-27 1332 1332 1.2499999999999998e-10 1332 1971 -1.4136387421560532e-27 1332 1968 -1.4136387421560532e-27 1332 1972 -1.0416666666666666e-11 1332 1318 -1.0416666666666666e-11 1332 1966 1.2116903504194741e-27 1332 1963 1.6155871338926322e-27 1332 2225 -1.2116903504194741e-27 1332 2297 -1.0416666666666666e-11 1332 2223 4.0389678347315804e-27 1332 1327 -1.0416666666666666e-11 1332 1329 1.6155871338926322e-27 1333 1333 1.2499999999999998e-10 1333 1887 1.4136387421560532e-27 1333 1860 1.2116903504194741e-27 1333 1867 1.2116903504194741e-27 1333 1866 -1.0416666666666666e-11 1333 1884 4.0389678347315804e-27 1333 1337 -1.0416666666666666e-11 1333 1857 -1.4136387421560532e-27 1333 1893 -1.0416666666666666e-11 1333 1856 1.6155871338926322e-27 1333 1335 -1.0416666666666666e-11 1334 1334 2.0833333333333331e-10 1335 1335 4.9999999999999993e-10 1335 1884 -2.0833333333333329e-11 1335 1895 -1.0416666666666666e-10 1335 1894 -4.1666666666666665e-11 1335 1887 4.1666666666666665e-11 1335 1881 1.0416666666666666e-10 1335 1857 4.1666666666666658e-11 1335 1893 -1.0416666666666666e-10 1335 1856 -2.0833333333333332e-11 1335 1333 -1.0416666666666663e-11 1336 1336 2.0833333333333331e-10 1337 1337 5.0000000000000003e-10 1337 1869 -1.0416666666666666e-10 1337 1856 -2.0833333333333329e-11 1337 1868 -4.1666666666666665e-11 1337 1860 4.1666666666666658e-11 1337 1853 1.0416666666666666e-10 1337 1867 -4.1666666666666658e-11 1337 1866 -1.0416666666666666e-10 1337 1884 -2.0833333333333332e-11 1337 1333 -1.0416666666666663e-11 1338 1338 6.2499999999999991e-11 1339 1339 1.0416666666666666e-10 1340 1340 6.2499999999999991e-11 1341 1341 1.0416666666666666e-10 1342 1342 6.2499999999999991e-11 1343 1343 6.2499999999999991e-11 1344 1344 1.2499999999999998e-10 1344 1863 1.0097419586828951e-27 1344 1866 -1.2116903504194741e-27 1344 1350 4.0389678347315804e-27 1344 1856 -4.0389678347315804e-27 1344 1853 -1.2116903504194741e-27 1344 1860 1.0416666666666661e-11 1344 1347 -1.0416666666666661e-11 1344 1851 1.0097419586828951e-27 1344 1346 -1.0416666666666661e-11 1344 1345 4.0389678347315804e-27 1344 1861 1.0416666666666661e-11 1345 1345 4.1666666666666662e-10 1345 1862 -2.0833333333333326e-11 1345 2293 2.0833333333333329e-11 1345 1362 2.1169082391605852e-27 1345 1855 1.0416666666666665e-11 1345 2304 -2.0833333333333329e-11 1345 1363 5.2083333333333328e-11 1345 1875 -2.0833333333333329e-11 1345 1364 3.5628902784306998e-27 1345 1849 1.0416666666666665e-11 1345 1870 2.0833333333333326e-11 1345 1349 5.2083333333333328e-11 1345 1868 -2.0833333333333329e-11 1345 1348 2.1169082391605852e-27 1345 1853 1.0416666666666665e-11 1345 1860 2.0833333333333329e-11 1345 1347 5.2083333333333328e-11 1345 1851 1.0416666666666665e-11 1345 1346 5.2083333333333328e-11 1345 1861 2.0833333333333329e-11 1345 1344 3.5628902784306998e-27 1346 1346 4.9999999999999993e-10 1346 1862 -1.0416666666666666e-10 1346 2292 2.0833333333333329e-11 1346 1362 -1.0416666666666663e-11 1346 1865 -4.1666666666666658e-11 1346 2222 2.0833333333333332e-11 1346 1361 5.2083333333333328e-11 1346 1864 -1.0416666666666666e-10 1346 2220 2.0833333333333329e-11 1346 1351 -1.0416666666666663e-11 1346 1863 -4.1666666666666665e-11 1346 1856 2.0833333333333332e-11 1346 1350 5.2083333333333328e-11 1346 1851 4.1666666666666658e-11 1346 1345 5.2083333333333328e-11 1346 1861 1.0416666666666666e-10 1346 1344 -1.0416666666666661e-11 1347 1347 5.0000000000000003e-10 1347 1869 -4.1666666666666658e-11 1347 1354 5.2083333333333328e-11 1347 1867 -1.0416666666666666e-10 1347 1884 2.0833333333333332e-11 1347 1360 -1.0416666666666661e-11 1347 1866 -4.1666666666666665e-11 1347 1350 5.2083333333333328e-11 1347 1856 2.0833333333333329e-11 1347 1868 -1.0416666666666666e-10 1347 1348 -1.0416666666666663e-11 1347 1853 4.1666666666666665e-11 1347 1860 1.0416666666666666e-10 1347 1345 5.2083333333333328e-11 1347 1344 -1.0416666666666661e-11 1348 1348 1.2499999999999998e-10 1348 1869 1.4136387421560532e-27 1348 1872 -1.2116903504194741e-27 1348 1354 4.0389678347315804e-27 1348 1849 -1.2116903504194741e-27 1348 1870 1.0416666666666666e-11 1348 1349 -1.0416666666666666e-11 1348 1853 1.4136387421560532e-27 1348 1347 -1.0416666666666666e-11 1348 1345 1.6155871338926322e-27 1348 1868 -1.0416666666666666e-11 1349 1349 5.0000000000000003e-10 1349 1874 -4.1666666666666665e-11 1349 1366 5.2083333333333328e-11 1349 1875 -1.0416666666666666e-10 1349 1364 -1.0416666666666661e-11 1349 1872 -4.1666666666666658e-11 1349 1873 -1.0416666666666666e-10 1349 1354 5.2083333333333328e-11 1349 1357 -1.0416666666666663e-11 1349 1849 4.1666666666666658e-11 1349 1870 1.0416666666666666e-10 1349 1345 5.2083333333333328e-11 1349 1348 -1.0416666666666663e-11 1350 1350 4.1666666666666662e-10 1350 1867 -2.0833333333333326e-11 1350 1886 2.0833333333333329e-11 1350 1884 6.2499999999999991e-11 1350 1360 2.1169082391605852e-27 1350 2242 1.0416666666666665e-11 1350 2254 -2.0833333333333329e-11 1350 1355 5.2083333333333328e-11 1350 2244 -2.0833333333333329e-11 1350 2241 -6.2500000000000004e-11 1350 1359 3.7324953730532174e-27 1350 2240 1.0416666666666665e-11 1350 2221 2.0833333333333326e-11 1350 1352 5.2083333333333328e-11 1350 1864 -2.0833333333333329e-11 1350 2220 6.2499999999999991e-11 1350 1351 2.1169082391605852e-27 1350 1863 -1.0416666666666665e-11 1350 1861 2.0833333333333329e-11 1350 1346 5.2083333333333328e-11 1350 1866 -1.0416666666666665e-11 1350 1347 5.2083333333333328e-11 1350 1860 2.0833333333333329e-11 1350 1856 6.2500000000000004e-11 1350 1344 3.7324953730532174e-27 1351 1351 1.2499999999999998e-10 1351 1865 1.4136387421560532e-27 1351 2245 -1.0097419586828951e-27 1351 1361 4.0389678347315804e-27 1351 2222 -1.6155871338926322e-27 1351 2240 -1.0097419586828951e-27 1351 2221 1.0416666666666663e-11 1351 1352 -1.0416666666666663e-11 1351 1863 -1.4136387421560532e-27 1351 1346 -1.0416666666666665e-11 1351 1350 1.6155871338926322e-27 1351 1864 -1.0416666666666665e-11 1351 2220 -4.0389678347315804e-27 1352 1352 4.9999999999999993e-10 1352 2053 -2.0833333333333329e-11 1352 2051 1.0416666666666666e-10 1352 2050 2.0833333333333332e-11 1352 1368 -1.0416666666666663e-11 1352 2245 -4.1666666666666658e-11 1352 1361 5.2083333333333328e-11 1352 2222 2.0833333333333329e-11 1352 2241 -2.0833333333333329e-11 1352 2243 -4.1666666666666665e-11 1352 2244 -1.0416666666666666e-10 1352 2260 -2.0833333333333332e-11 1352 1358 5.2083333333333328e-11 1352 1359 -1.0416666666666661e-11 1352 2240 4.1666666666666665e-11 1352 2221 1.0416666666666666e-10 1352 2220 2.0833333333333332e-11 1352 1350 5.2083333333333328e-11 1352 1351 -1.0416666666666661e-11 1353 1353 1.2499999999999998e-10 1353 2253 1.2116903504194741e-27 1353 2255 -1.4136387421560532e-27 1353 1358 1.6155871338926322e-27 1353 2252 4.0389678347315804e-27 1353 2249 -1.4136387421560532e-27 1353 2250 1.0416666666666666e-11 1353 1356 -1.0416666666666666e-11 1353 2247 1.2116903504194741e-27 1353 1355 -1.0416666666666666e-11 1353 1354 4.0389678347315804e-27 1353 2251 1.0416666666666666e-11 1354 1354 4.1666666666666662e-10 1354 1886 2.0833333333333329e-11 1354 1867 -2.0833333333333329e-11 1354 1360 3.5628902784306998e-27 1354 1869 -1.0416666666666661e-11 1354 1868 -2.0833333333333326e-11 1354 1347 5.2083333333333328e-11 1354 1870 2.0833333333333329e-11 1354 1348 3.5628902784306998e-27 1354 1872 -1.0416666666666661e-11 1354 1873 -2.0833333333333329e-11 1354 1349 5.2083333333333328e-11 1354 2257 -2.0833333333333329e-11 1354 1357 3.5628902784306998e-27 1354 2249 1.0416666666666661e-11 1354 2250 2.0833333333333326e-11 1354 1356 5.2083333333333328e-11 1354 2247 1.0416666666666661e-11 1354 1355 5.2083333333333328e-11 1354 2251 2.0833333333333329e-11 1354 1353 3.5628902784306998e-27 1355 1355 4.9999999999999993e-10 1355 1886 1.0416666666666666e-10 1355 1884 2.0833333333333329e-11 1355 1360 -1.0416666666666663e-11 1355 2242 4.1666666666666665e-11 1355 2241 -2.0833333333333332e-11 1355 1350 5.2083333333333328e-11 1355 2254 -1.0416666666666666e-10 1355 2260 -2.0833333333333329e-11 1355 1359 -1.0416666666666661e-11 1355 2253 -4.1666666666666658e-11 1355 2252 -2.0833333333333332e-11 1355 1358 5.2083333333333328e-11 1355 2247 4.1666666666666658e-11 1355 1354 5.2083333333333328e-11 1355 2251 1.0416666666666666e-10 1355 1353 -1.0416666666666663e-11 1356 1356 5.0000000000000003e-10 1356 2258 -4.1666666666666665e-11 1356 1366 5.2083333333333328e-11 1356 2256 -1.0416666666666666e-10 1356 2261 -2.0833333333333332e-11 1356 1369 -1.0416666666666661e-11 1356 2255 -4.1666666666666665e-11 1356 1358 5.2083333333333328e-11 1356 2252 -2.0833333333333329e-11 1356 2257 -1.0416666666666666e-10 1356 1357 -1.0416666666666661e-11 1356 2249 4.1666666666666658e-11 1356 2250 1.0416666666666666e-10 1356 1354 5.2083333333333328e-11 1356 1353 -1.0416666666666663e-11 1357 1357 1.2499999999999998e-10 1357 2258 1.0097419586828951e-27 1357 1874 -1.4136387421560532e-27 1357 1366 1.6155871338926322e-27 1357 1872 1.4136387421560532e-27 1357 1873 -1.0416666666666665e-11 1357 1349 -1.0416666666666665e-11 1357 2249 1.0097419586828951e-27 1357 1356 -1.0416666666666663e-11 1357 1354 4.0389678347315804e-27 1357 2257 -1.0416666666666663e-11 1358 1358 4.1666666666666662e-10 1358 2256 -2.0833333333333329e-11 1358 2314 -2.0833333333333329e-11 1358 2261 -6.2499999999999991e-11 1358 1369 3.5628902784306998e-27 1358 2262 1.0416666666666665e-11 1358 2052 2.0833333333333326e-11 1358 1367 5.2083333333333328e-11 1358 2051 2.0833333333333329e-11 1358 2053 -6.2499999999999991e-11 1358 1368 2.1169082391605852e-27 1358 2243 -1.0416666666666665e-11 1358 2244 -2.0833333333333329e-11 1358 1352 5.2083333333333328e-11 1358 2254 -2.0833333333333329e-11 1358 2260 -6.2499999999999991e-11 1358 1359 3.5628902784306998e-27 1358 2253 -1.0416666666666665e-11 1358 2251 2.0833333333333326e-11 1358 1355 5.2083333333333328e-11 1358 2255 -1.0416666666666665e-11 1358 1356 5.2083333333333328e-11 1358 2250 2.0833333333333329e-11 1358 2252 -6.2499999999999991e-11 1358 1353 2.1169082391605852e-27 1359 1359 1.2499999999999998e-10 1359 2242 -1.0097419586828951e-27 1359 2240 1.2116903504194741e-27 1359 1350 4.0389678347315804e-27 1359 2241 4.0389678347315804e-27 1359 2243 1.2116903504194741e-27 1359 2244 -1.0416666666666661e-11 1359 1352 -1.0416666666666661e-11 1359 2253 -1.0097419586828951e-27 1359 1355 -1.0416666666666661e-11 1359 1358 4.0389678347315804e-27 1359 2254 -1.0416666666666661e-11 1359 2260 4.0389678347315804e-27 1360 1360 1.2499999999999998e-10 1360 2247 -1.4136387421560532e-27 1360 1869 -1.0097419586828951e-27 1360 1354 4.0389678347315804e-27 1360 1866 1.0097419586828951e-27 1360 1867 -1.0416666666666663e-11 1360 1347 -1.0416666666666663e-11 1360 2242 1.4136387421560532e-27 1360 1355 -1.0416666666666665e-11 1360 1350 1.6155871338926322e-27 1360 1886 1.0416666666666665e-11 1360 1884 -4.0389678347315804e-27 1361 1361 4.1666666666666662e-10 1361 2051 2.0833333333333326e-11 1361 2052 2.0833333333333329e-11 1361 2050 6.2499999999999991e-11 1361 1368 3.5628902784306998e-27 1361 2303 1.0416666666666661e-11 1361 2313 2.0833333333333329e-11 1361 1367 5.2083333333333328e-11 1361 2306 -2.0833333333333329e-11 1361 2302 -6.2499999999999991e-11 1361 1365 3.5628902784306998e-27 1361 2301 1.0416666666666661e-11 1361 2293 2.0833333333333326e-11 1361 1363 5.2083333333333328e-11 1361 1862 -2.0833333333333329e-11 1361 2292 6.2499999999999991e-11 1361 1362 3.5628902784306998e-27 1361 1865 -1.0416666666666661e-11 1361 1864 -2.0833333333333329e-11 1361 1346 5.2083333333333328e-11 1361 2245 -1.0416666666666661e-11 1361 1352 5.2083333333333328e-11 1361 2221 2.0833333333333329e-11 1361 2222 6.2499999999999991e-11 1361 1351 3.5628902784306998e-27 1362 1362 1.2499999999999998e-10 1362 1851 -1.2116903504194741e-27 1362 1855 1.4136387421560532e-27 1362 1345 1.6155871338926322e-27 1362 2301 -1.4136387421560532e-27 1362 2293 1.0416666666666666e-11 1362 1363 -1.0416666666666666e-11 1362 1865 -1.2116903504194741e-27 1362 1346 -1.0416666666666666e-11 1362 1361 4.0389678347315804e-27 1362 1862 -1.0416666666666666e-11 1362 2292 -1.6155871338926322e-27 1363 1363 4.9999999999999993e-10 1363 2302 -2.0833333333333329e-11 1363 2305 -4.1666666666666665e-11 1363 2306 -1.0416666666666666e-10 1363 1366 5.2083333333333328e-11 1363 1365 -1.0416666666666661e-11 1363 1855 4.1666666666666665e-11 1363 2304 -1.0416666666666666e-10 1363 1345 5.2083333333333328e-11 1363 1364 -1.0416666666666661e-11 1363 2301 4.1666666666666658e-11 1363 2293 1.0416666666666666e-10 1363 2292 2.0833333333333332e-11 1363 1361 5.2083333333333328e-11 1363 1362 -1.0416666666666663e-11 1364 1364 1.2499999999999998e-10 1364 1874 1.0097419586828951e-27 1364 2305 -1.2116903504194741e-27 1364 1366 4.0389678347315804e-27 1364 1855 -1.2116903504194741e-27 1364 2304 -1.0416666666666661e-11 1364 1363 -1.0416666666666661e-11 1364 1849 1.0097419586828951e-27 1364 1349 -1.0416666666666661e-11 1364 1345 4.0389678347315804e-27 1364 1875 -1.0416666666666661e-11 1365 1365 1.2499999999999998e-10 1365 2303 -1.4136387421560532e-27 1365 2301 1.0097419586828951e-27 1365 1361 4.0389678347315804e-27 1365 2302 1.6155871338926322e-27 1365 2305 1.0097419586828951e-27 1365 2306 -1.0416666666666663e-11 1365 1363 -1.0416666666666663e-11 1365 2311 1.4136387421560532e-27 1365 1367 -1.0416666666666665e-11 1365 1366 1.6155871338926322e-27 1365 2313 1.0416666666666665e-11 1366 1366 4.1666666666666662e-10 1366 2314 -2.0833333333333329e-11 1366 2256 -2.0833333333333329e-11 1366 1369 3.7324953730532174e-27 1366 2258 -1.0416666666666665e-11 1366 2257 -2.0833333333333326e-11 1366 1356 5.2083333333333328e-11 1366 1873 -2.0833333333333329e-11 1366 1357 2.1169082391605852e-27 1366 1874 -1.0416666666666665e-11 1366 1875 -2.0833333333333329e-11 1366 1349 5.2083333333333328e-11 1366 2304 -2.0833333333333329e-11 1366 1364 3.7324953730532174e-27 1366 2305 -1.0416666666666665e-11 1366 2306 -2.0833333333333326e-11 1366 1363 5.2083333333333328e-11 1366 2311 1.0416666666666665e-11 1366 1367 5.2083333333333328e-11 1366 2313 2.0833333333333329e-11 1366 1365 2.1169082391605852e-27 1367 1367 4.9999999999999993e-10 1367 2314 -1.0416666666666666e-10 1367 2261 -2.0833333333333329e-11 1367 1369 -1.0416666666666661e-11 1367 2262 4.1666666666666658e-11 1367 2053 -2.0833333333333332e-11 1367 1358 5.2083333333333328e-11 1367 2052 1.0416666666666666e-10 1367 2050 2.0833333333333329e-11 1367 1368 -1.0416666666666663e-11 1367 2303 4.1666666666666658e-11 1367 2302 -2.0833333333333332e-11 1367 1361 5.2083333333333328e-11 1367 2311 4.1666666666666665e-11 1367 1366 5.2083333333333328e-11 1367 2313 1.0416666666666666e-10 1367 1365 -1.0416666666666663e-11 1368 1368 1.2499999999999998e-10 1368 2262 -1.2116903504194741e-27 1368 2243 -1.4136387421560532e-27 1368 1358 1.6155871338926322e-27 1368 2053 4.0389678347315804e-27 1368 2245 1.4136387421560532e-27 1368 2051 1.0416666666666666e-11 1368 1352 -1.0416666666666666e-11 1368 2303 1.2116903504194741e-27 1368 1367 -1.0416666666666666e-11 1368 1361 4.0389678347315804e-27 1368 2052 1.0416666666666666e-11 1368 2050 -1.6155871338926322e-27 1369 1369 1.2499999999999998e-10 1369 2311 -1.0097419586828951e-27 1369 2258 -1.2116903504194741e-27 1369 1366 4.0389678347315804e-27 1369 2255 1.2116903504194741e-27 1369 2256 -1.0416666666666661e-11 1369 1356 -1.0416666666666661e-11 1369 2262 1.0097419586828951e-27 1369 1367 -1.0416666666666661e-11 1369 1358 4.0389678347315804e-27 1369 2314 -1.0416666666666661e-11 1369 2261 4.0389678347315804e-27 1370 1370 6.2499999999999991e-11 1371 1371 1.0416666666666666e-10 1372 1372 4.9999999999999993e-10 1372 1907 2.0833333333333329e-11 1372 1901 -4.1666666666666658e-11 1372 1900 -1.0416666666666666e-10 1372 1899 -4.1666666666666658e-11 1372 1898 -1.0416666666666666e-10 1372 1902 2.0833333333333332e-11 1372 1373 -1.0416666666666663e-11 1372 1896 4.1666666666666665e-11 1372 1877 1.0416666666666666e-10 1373 1373 3.1250000000000001e-10 1373 1901 -1.2116903504194741e-27 1373 1924 -1.0416666666666666e-11 1373 1907 1.0416666666666665e-11 1373 2189 4.1666666666666665e-11 1373 1904 -4.1666666666666665e-11 1373 1903 -1.2499999999999998e-10 1373 2174 -3.1250000000000002e-11 1373 1375 2.0833333333333339e-11 1373 1378 -1.0416666666666674e-11 1373 1899 1.2116903504194741e-27 1373 1898 -1.0416666666666666e-11 1373 1902 -1.0416666666666669e-11 1373 1372 -1.0416666666666666e-11 1374 1374 2.7083333333333333e-10 1375 1375 3.7500000000000000e-10 1375 1902 2.0833333333333329e-11 1375 2184 -4.1666666666666665e-11 1375 1924 -2.0833333333333326e-11 1375 2176 -4.1666666666666665e-11 1375 1904 4.1666666666666671e-11 1375 1903 -4.1666666666666665e-11 1375 2174 -1.6666666666666666e-10 1375 1373 2.0833333333333332e-11 1375 1378 -6.2500000000000004e-11 1375 2173 2.0833333333333326e-11 1375 2172 -4.1666666666666665e-11 1376 1376 2.4999999999999996e-10 1377 1377 1.6666666666666666e-10 1378 1378 1.6666666666666663e-10 1378 2172 1.0416666666666665e-11 1378 2184 -1.0416666666666673e-11 1378 1907 1.0416666666666665e-11 1378 2189 6.2500000000000004e-11 1378 1904 -1.0416666666666666e-11 1378 1903 -1.0416666666666655e-11 1378 2174 2.0833333333333339e-11 1378 1373 -1.0416666666666673e-11 1378 1375 -6.2500000000000004e-11 1379 1379 1.2499999999999998e-10 1380 1380 6.2499999999999991e-11 1381 1381 3.9583333333333326e-10 1382 1382 6.2499999999999991e-11 1383 1383 2.0833333333333331e-10 1384 1384 4.9999999999999993e-10 1384 1884 -2.0833333333333329e-11 1384 2242 1.0416666666666666e-10 1384 2241 2.0833333333333332e-11 1384 1391 -1.0416666666666663e-11 1384 2254 -4.1666666666666658e-11 1384 1390 5.2083333333333328e-11 1384 2260 2.0833333333333329e-11 1384 2253 -1.0416666666666666e-10 1384 2252 2.0833333333333332e-11 1384 1389 -1.0416666666666661e-11 1384 2251 4.1666666666666665e-11 1384 1886 4.1666666666666665e-11 1384 2247 1.0416666666666666e-10 1385 1385 6.2499999999999991e-11 1386 1386 2.0833333333333331e-10 1387 1387 5.0000000000000003e-10 1387 2265 2.0833333333333329e-11 1387 1892 -1.0416666666666666e-10 1387 2263 2.0833333333333332e-11 1387 1392 -1.0416666666666663e-11 1387 1891 -4.1666666666666658e-11 1387 1390 5.2083333333333328e-11 1387 2241 2.0833333333333329e-11 1387 1890 -1.0416666666666666e-10 1387 1884 -2.0833333333333332e-11 1387 1391 -1.0416666666666663e-11 1387 1888 4.1666666666666658e-11 1387 1889 -4.1666666666666665e-11 1387 1879 1.0416666666666666e-10 1388 1388 2.0833333333333331e-10 1389 1389 1.2499999999999998e-10 1389 2260 -1.6155871338926322e-27 1389 2254 -1.0097419586828951e-27 1389 1390 4.0389678347315804e-27 1389 2251 -1.0097419586828951e-27 1389 2253 -1.0416666666666663e-11 1389 2252 -4.0389678347315804e-27 1389 1384 -1.0416666666666663e-11 1389 804 -1.4136387421560532e-27 1389 806 1.4136387421560532e-27 1389 805 -1.0416666666666665e-11 1389 436 -1.0416666666666665e-11 1390 1390 4.1666666666666662e-10 1390 2263 6.2499999999999991e-11 1390 1392 3.5628902784306998e-27 1390 2260 6.2499999999999991e-11 1390 1389 3.5628902784306998e-27 1390 1892 -2.0833333333333329e-11 1390 1891 -1.0416666666666661e-11 1390 1387 5.2083333333333328e-11 1390 1890 -2.0833333333333329e-11 1390 2242 2.0833333333333326e-11 1390 2241 6.2499999999999991e-11 1390 1391 3.5628902784306998e-27 1390 2254 -1.0416666666666661e-11 1390 1384 5.2083333333333328e-11 1390 2253 -2.0833333333333329e-11 1390 807 -2.0833333333333329e-11 1390 1071 2.0833333333333326e-11 1390 1033 -6.2499999999999991e-11 1390 440 3.5628902784306998e-27 1390 1034 1.0416666666666661e-11 1390 439 5.2083333333333328e-11 1390 1054 2.0833333333333329e-11 1390 806 -1.0416666666666661e-11 1390 805 -2.0833333333333329e-11 1390 436 5.2083333333333328e-11 1391 1391 1.2499999999999998e-10 1391 1891 -1.2116903504194741e-27 1391 1888 -1.2116903504194741e-27 1391 1890 -1.0416666666666666e-11 1391 1387 -1.0416666666666666e-11 1391 1886 1.4136387421560532e-27 1391 1884 4.0389678347315804e-27 1391 2254 1.4136387421560532e-27 1391 2242 1.0416666666666666e-11 1391 2241 -1.6155871338926322e-27 1391 1384 -1.0416666666666666e-11 1391 1390 4.0389678347315804e-27 1392 1392 1.2499999999999998e-10 1392 1390 4.0389678347315804e-27 1392 2263 -1.6155871338926322e-27 1392 2265 -4.0389678347315804e-27 1392 1889 -1.4136387421560532e-27 1392 1891 1.4136387421560532e-27 1392 1892 -1.0416666666666665e-11 1392 1387 -1.0416666666666665e-11 1392 1034 1.0097419586828951e-27 1392 1074 -1.0097419586828951e-27 1392 1054 1.0416666666666663e-11 1392 439 -1.0416666666666663e-11 1393 1393 1.2499999999999998e-10 1393 1890 1.0097419586828951e-27 1393 1893 -1.4136387421560532e-27 1393 1412 1.6155871338926322e-27 1393 1884 -4.0389678347315804e-27 1393 1881 -1.4136387421560532e-27 1393 1887 1.0416666666666665e-11 1393 1396 -1.0416666666666665e-11 1393 1879 1.0097419586828951e-27 1393 1395 -1.0416666666666663e-11 1393 1394 4.0389678347315804e-27 1393 1888 1.0416666666666663e-11 1394 1394 4.1666666666666662e-10 1394 1889 -2.0833333333333326e-11 1394 1922 -2.0833333333333329e-11 1394 1418 3.5628902784306998e-27 1394 1883 1.0416666666666661e-11 1394 1923 -2.0833333333333329e-11 1394 1402 5.2083333333333328e-11 1394 1899 -2.0833333333333329e-11 1394 1403 3.5628902784306998e-27 1394 1877 1.0416666666666661e-11 1394 1896 2.0833333333333326e-11 1394 1398 5.2083333333333328e-11 1394 1894 -2.0833333333333329e-11 1394 1397 3.5628902784306998e-27 1394 1881 1.0416666666666661e-11 1394 1887 2.0833333333333329e-11 1394 1396 5.2083333333333328e-11 1394 1879 1.0416666666666661e-11 1394 1395 5.2083333333333328e-11 1394 1888 2.0833333333333329e-11 1394 1393 3.5628902784306998e-27 1395 1395 4.9999999999999993e-10 1395 1889 -1.0416666666666666e-10 1395 2265 -2.0833333333333329e-11 1395 1418 -1.0416666666666663e-11 1395 1892 -4.1666666666666665e-11 1395 2263 -2.0833333333333332e-11 1395 1415 5.2083333333333328e-11 1395 1891 -1.0416666666666666e-10 1395 2241 -2.0833333333333329e-11 1395 1414 -1.0416666666666661e-11 1395 1890 -4.1666666666666665e-11 1395 1884 2.0833333333333332e-11 1395 1412 5.2083333333333328e-11 1395 1879 4.1666666666666658e-11 1395 1394 5.2083333333333328e-11 1395 1888 1.0416666666666666e-10 1395 1393 -1.0416666666666661e-11 1396 1396 4.9999999999999993e-10 1396 1884 2.0833333333333329e-11 1396 1895 -4.1666666666666658e-11 1396 1405 5.2083333333333328e-11 1396 1893 -4.1666666666666665e-11 1396 1857 1.0416666666666666e-10 1396 1856 2.0833333333333332e-11 1396 1412 5.2083333333333328e-11 1396 1413 -1.0416666666666661e-11 1396 1894 -1.0416666666666666e-10 1396 1397 -1.0416666666666663e-11 1396 1881 4.1666666666666658e-11 1396 1887 1.0416666666666666e-10 1396 1394 5.2083333333333328e-11 1396 1393 -1.0416666666666663e-11 1397 1397 1.2499999999999998e-10 1397 1895 1.2116903504194741e-27 1397 1900 -1.4136387421560532e-27 1397 1405 1.6155871338926322e-27 1397 1877 -1.4136387421560532e-27 1397 1896 1.0416666666666666e-11 1397 1398 -1.0416666666666666e-11 1397 1881 1.2116903504194741e-27 1397 1396 -1.0416666666666666e-11 1397 1394 4.0389678347315804e-27 1397 1894 -1.0416666666666666e-11 1398 1398 4.9999999999999993e-10 1398 1907 -2.0833333333333329e-11 1398 1900 -4.1666666666666665e-11 1398 1901 -1.0416666666666666e-10 1398 1405 5.2083333333333328e-11 1398 1408 -1.0416666666666661e-11 1398 1898 -4.1666666666666665e-11 1398 1899 -1.0416666666666666e-10 1398 1902 -2.0833333333333332e-11 1398 1400 5.2083333333333328e-11 1398 1403 -1.0416666666666661e-11 1398 1877 4.1666666666666658e-11 1398 1896 1.0416666666666666e-10 1398 1394 5.2083333333333328e-11 1398 1397 -1.0416666666666663e-11 1399 1399 1.2499999999999998e-10 1399 1918 1.2116903504194741e-27 1399 1921 -1.0097419586828951e-27 1399 1415 4.0389678347315804e-27 1399 1916 4.0389678347315804e-27 1399 1909 -1.0097419586828951e-27 1399 1913 1.0416666666666661e-11 1399 1402 -1.0416666666666661e-11 1399 1906 1.2116903504194741e-27 1399 1401 -1.0416666666666661e-11 1399 1400 4.0389678347315804e-27 1399 1914 1.0416666666666661e-11 1399 1908 4.0389678347315804e-27 1400 1400 4.1666666666666662e-10 1400 1917 -2.0833333333333326e-11 1400 2210 -2.0833333333333329e-11 1400 1905 -6.2499999999999991e-11 1400 1417 2.1169082391605852e-27 1400 1910 1.0416666666666665e-11 1400 2211 -2.0833333333333329e-11 1400 1407 5.2083333333333328e-11 1400 1901 -2.0833333333333329e-11 1400 1907 -6.2500000000000004e-11 1400 1408 3.7324953730532174e-27 1400 1898 -1.0416666666666665e-11 1400 1899 -2.0833333333333326e-11 1400 1398 5.2083333333333328e-11 1400 1923 -2.0833333333333329e-11 1400 1902 -6.2499999999999991e-11 1400 1403 2.1169082391605852e-27 1400 1909 1.0416666666666665e-11 1400 1913 2.0833333333333329e-11 1400 1402 5.2083333333333328e-11 1400 1906 1.0416666666666665e-11 1400 1401 5.2083333333333328e-11 1400 1914 2.0833333333333329e-11 1400 1908 -6.2500000000000004e-11 1400 1399 3.7324953730532174e-27 1401 1401 4.9999999999999993e-10 1401 1905 -2.0833333333333332e-11 1401 1917 -1.0416666666666666e-10 1401 2215 -2.0833333333333329e-11 1401 1417 -1.0416666666666661e-11 1401 1920 -4.1666666666666658e-11 1401 2216 -2.0833333333333332e-11 1401 1409 5.2083333333333328e-11 1401 1919 -1.0416666666666666e-10 1401 2264 -2.0833333333333329e-11 1401 1416 -1.0416666666666663e-11 1401 1918 -4.1666666666666665e-11 1401 1916 -2.0833333333333332e-11 1401 1415 5.2083333333333328e-11 1401 1906 4.1666666666666665e-11 1401 1400 5.2083333333333328e-11 1401 1914 1.0416666666666666e-10 1401 1908 -2.0833333333333329e-11 1401 1399 -1.0416666666666661e-11 1402 1402 5.0000000000000003e-10 1402 1883 4.1666666666666658e-11 1402 1394 5.2083333333333328e-11 1402 1922 -1.0416666666666666e-10 1402 2265 -2.0833333333333332e-11 1402 1418 -1.0416666666666663e-11 1402 1921 -4.1666666666666658e-11 1402 1415 5.2083333333333328e-11 1402 1916 -2.0833333333333329e-11 1402 1923 -1.0416666666666666e-10 1402 1902 -2.0833333333333329e-11 1402 1403 -1.0416666666666663e-11 1402 1909 4.1666666666666665e-11 1402 1913 1.0416666666666666e-10 1402 1908 -2.0833333333333332e-11 1402 1400 5.2083333333333328e-11 1402 1399 -1.0416666666666661e-11 1403 1403 1.2499999999999998e-10 1403 1883 -1.4136387421560532e-27 1403 1877 1.0097419586828951e-27 1403 1394 4.0389678347315804e-27 1403 1898 1.0097419586828951e-27 1403 1899 -1.0416666666666663e-11 1403 1398 -1.0416666666666663e-11 1403 1909 1.4136387421560532e-27 1403 1402 -1.0416666666666665e-11 1403 1400 1.6155871338926322e-27 1403 1923 -1.0416666666666665e-11 1403 1902 4.0389678347315804e-27 1404 1404 1.2499999999999998e-10 1404 2206 1.4136387421560532e-27 1404 2209 -1.2116903504194741e-27 1404 1409 4.0389678347315804e-27 1404 2202 -1.6155871338926322e-27 1404 2201 -1.2116903504194741e-27 1404 2204 1.0416666666666666e-11 1404 1407 -1.0416666666666666e-11 1404 2199 1.4136387421560532e-27 1404 1406 -1.0416666666666666e-11 1404 1405 1.6155871338926322e-27 1404 2205 1.0416666666666666e-11 1405 1405 4.1666666666666662e-10 1405 1859 2.0833333333333329e-11 1405 1857 2.0833333333333329e-11 1405 1413 3.5628902784306998e-27 1405 1895 -1.0416666666666665e-11 1405 1894 -2.0833333333333326e-11 1405 1396 5.2083333333333328e-11 1405 1896 2.0833333333333329e-11 1405 1397 2.1169082391605852e-27 1405 1900 -1.0416666666666665e-11 1405 1901 -2.0833333333333329e-11 1405 1398 5.2083333333333328e-11 1405 2211 -2.0833333333333329e-11 1405 1408 3.5628902784306998e-27 1405 2201 1.0416666666666665e-11 1405 2204 2.0833333333333326e-11 1405 1407 5.2083333333333328e-11 1405 2199 1.0416666666666665e-11 1405 1406 5.2083333333333328e-11 1405 2205 2.0833333333333329e-11 1405 1404 2.1169082391605852e-27 1406 1406 4.9999999999999993e-10 1406 1859 1.0416666666666666e-10 1406 1856 2.0833333333333329e-11 1406 1413 -1.0416666666666661e-11 1406 2208 -4.1666666666666665e-11 1406 2220 2.0833333333333332e-11 1406 1412 5.2083333333333328e-11 1406 2207 -1.0416666666666666e-10 1406 2213 -2.0833333333333329e-11 1406 1410 -1.0416666666666661e-11 1406 2206 -4.1666666666666658e-11 1406 2202 2.0833333333333332e-11 1406 1409 5.2083333333333328e-11 1406 2199 4.1666666666666665e-11 1406 1405 5.2083333333333328e-11 1406 2205 1.0416666666666666e-10 1406 1404 -1.0416666666666663e-11 1407 1407 5.0000000000000003e-10 1407 1905 -2.0833333333333329e-11 1407 1910 4.1666666666666665e-11 1407 1907 -2.0833333333333332e-11 1407 1400 5.2083333333333328e-11 1407 2210 -1.0416666666666666e-10 1407 2215 -2.0833333333333332e-11 1407 1417 -1.0416666666666663e-11 1407 2209 -4.1666666666666658e-11 1407 1409 5.2083333333333328e-11 1407 2202 2.0833333333333329e-11 1407 2211 -1.0416666666666666e-10 1407 1408 -1.0416666666666661e-11 1407 2201 4.1666666666666658e-11 1407 2204 1.0416666666666666e-10 1407 1405 5.2083333333333328e-11 1407 1404 -1.0416666666666663e-11 1408 1408 1.2499999999999998e-10 1408 1910 -1.0097419586828951e-27 1408 1898 -1.2116903504194741e-27 1408 1400 4.0389678347315804e-27 1408 1907 4.0389678347315804e-27 1408 1900 1.2116903504194741e-27 1408 1901 -1.0416666666666661e-11 1408 1398 -1.0416666666666661e-11 1408 2201 1.0097419586828951e-27 1408 1407 -1.0416666666666661e-11 1408 1405 4.0389678347315804e-27 1408 2211 -1.0416666666666661e-11 1409 1409 4.1666666666666662e-10 1409 2210 -2.0833333333333329e-11 1409 1917 -2.0833333333333329e-11 1409 2215 -6.2499999999999991e-11 1409 1417 3.5628902784306998e-27 1409 1920 -1.0416666666666661e-11 1409 1919 -2.0833333333333326e-11 1409 1401 5.2083333333333328e-11 1409 2239 -2.0833333333333329e-11 1409 2216 -6.2499999999999991e-11 1409 1416 3.5628902784306998e-27 1409 2214 1.0416666666666661e-11 1409 2219 2.0833333333333329e-11 1409 1411 5.2083333333333328e-11 1409 2207 -2.0833333333333329e-11 1409 2213 -6.2499999999999991e-11 1409 1410 3.5628902784306998e-27 1409 2206 -1.0416666666666661e-11 1409 2205 2.0833333333333326e-11 1409 1406 5.2083333333333328e-11 1409 2209 -1.0416666666666661e-11 1409 1407 5.2083333333333328e-11 1409 2204 2.0833333333333329e-11 1409 2202 6.2499999999999991e-11 1409 1404 3.5628902784306998e-27 1410 1410 1.2499999999999998e-10 1410 2208 1.0097419586828951e-27 1410 2236 -1.4136387421560532e-27 1410 1412 1.6155871338926322e-27 1410 2220 -4.0389678347315804e-27 1410 2214 -1.4136387421560532e-27 1410 2219 1.0416666666666665e-11 1410 1411 -1.0416666666666665e-11 1410 2206 -1.0097419586828951e-27 1410 1406 -1.0416666666666663e-11 1410 1409 4.0389678347315804e-27 1410 2207 -1.0416666666666663e-11 1410 2213 1.6155871338926322e-27 1411 1411 4.9999999999999993e-10 1411 2263 -2.0833333333333329e-11 1411 2216 -2.0833333333333329e-11 1411 2238 -4.1666666666666658e-11 1411 2239 -1.0416666666666666e-10 1411 2264 -2.0833333333333332e-11 1411 1415 5.2083333333333328e-11 1411 1416 -1.0416666666666663e-11 1411 2237 -1.0416666666666666e-10 1411 2241 -2.0833333333333332e-11 1411 1414 -1.0416666666666661e-11 1411 2236 -4.1666666666666665e-11 1411 1412 5.2083333333333328e-11 1411 2220 2.0833333333333329e-11 1411 2214 4.1666666666666658e-11 1411 2219 1.0416666666666666e-10 1411 2213 -2.0833333333333332e-11 1411 1409 5.2083333333333328e-11 1411 1410 -1.0416666666666663e-11 1412 1412 4.1666666666666662e-10 1412 2237 -2.0833333333333329e-11 1412 1891 -2.0833333333333329e-11 1412 2241 -6.2500000000000004e-11 1412 1414 3.7324953730532174e-27 1412 1890 -1.0416666666666665e-11 1412 1888 2.0833333333333326e-11 1412 1395 5.2083333333333328e-11 1412 1887 2.0833333333333329e-11 1412 1884 6.2499999999999991e-11 1412 1393 2.1169082391605852e-27 1412 1893 -1.0416666666666665e-11 1412 1857 2.0833333333333329e-11 1412 1396 5.2083333333333328e-11 1412 1859 2.0833333333333329e-11 1412 1856 6.2500000000000004e-11 1412 1413 3.7324953730532174e-27 1412 2208 -1.0416666666666665e-11 1412 2207 -2.0833333333333326e-11 1412 1406 5.2083333333333328e-11 1412 2236 -1.0416666666666665e-11 1412 1411 5.2083333333333328e-11 1412 2219 2.0833333333333329e-11 1412 2220 6.2499999999999991e-11 1412 1410 2.1169082391605852e-27 1413 1413 1.2499999999999998e-10 1413 2199 -1.2116903504194741e-27 1413 1895 -1.0097419586828951e-27 1413 1405 4.0389678347315804e-27 1413 1893 1.0097419586828951e-27 1413 1857 1.0416666666666661e-11 1413 1396 -1.0416666666666661e-11 1413 2208 -1.2116903504194741e-27 1413 1406 -1.0416666666666661e-11 1413 1412 4.0389678347315804e-27 1413 1859 1.0416666666666661e-11 1413 1856 -4.0389678347315804e-27 1414 1414 1.2499999999999998e-10 1414 1892 1.2116903504194741e-27 1414 2238 -1.0097419586828951e-27 1414 1415 4.0389678347315804e-27 1414 2263 4.0389678347315804e-27 1414 2236 1.0097419586828951e-27 1414 2237 -1.0416666666666661e-11 1414 1411 -1.0416666666666661e-11 1414 1890 -1.2116903504194741e-27 1414 1395 -1.0416666666666661e-11 1414 1412 4.0389678347315804e-27 1414 1891 -1.0416666666666661e-11 1414 2241 4.0389678347315804e-27 1415 1415 4.1666666666666662e-10 1415 1922 -2.0833333333333326e-11 1415 1889 -2.0833333333333329e-11 1415 2265 -6.2499999999999991e-11 1415 1418 2.1169082391605852e-27 1415 1892 -1.0416666666666665e-11 1415 1891 -2.0833333333333329e-11 1415 1395 5.2083333333333328e-11 1415 2237 -2.0833333333333329e-11 1415 2263 -6.2499999999999991e-11 1415 1414 3.5628902784306998e-27 1415 2238 -1.0416666666666665e-11 1415 2239 -2.0833333333333326e-11 1415 1411 5.2083333333333328e-11 1415 1919 -2.0833333333333329e-11 1415 2264 -6.2499999999999991e-11 1415 1416 2.1169082391605852e-27 1415 1918 -1.0416666666666665e-11 1415 1914 2.0833333333333329e-11 1415 1401 5.2083333333333328e-11 1415 1921 -1.0416666666666665e-11 1415 1402 5.2083333333333328e-11 1415 1913 2.0833333333333329e-11 1415 1916 -6.2499999999999991e-11 1415 1399 3.5628902784306998e-27 1416 1416 1.2499999999999998e-10 1416 1920 1.4136387421560532e-27 1416 2214 1.2116903504194741e-27 1416 1409 4.0389678347315804e-27 1416 2216 1.6155871338926322e-27 1416 2238 1.2116903504194741e-27 1416 2239 -1.0416666666666666e-11 1416 1411 -1.0416666666666666e-11 1416 1918 -1.4136387421560532e-27 1416 1401 -1.0416666666666666e-11 1416 1415 1.6155871338926322e-27 1416 1919 -1.0416666666666666e-11 1416 2264 4.0389678347315804e-27 1417 1417 1.2499999999999998e-10 1417 1906 -1.0097419586828951e-27 1417 1910 1.4136387421560532e-27 1417 1400 1.6155871338926322e-27 1417 1905 4.0389678347315804e-27 1417 2209 1.4136387421560532e-27 1417 2210 -1.0416666666666665e-11 1417 1407 -1.0416666666666665e-11 1417 1920 -1.0097419586828951e-27 1417 1401 -1.0416666666666663e-11 1417 1409 4.0389678347315804e-27 1417 1917 -1.0416666666666663e-11 1417 2215 1.6155871338926322e-27 1418 1418 1.2499999999999998e-10 1418 1879 -1.4136387421560532e-27 1418 1883 1.2116903504194741e-27 1418 1394 4.0389678347315804e-27 1418 1921 1.2116903504194741e-27 1418 1922 -1.0416666666666666e-11 1418 1402 -1.0416666666666666e-11 1418 1892 -1.4136387421560532e-27 1418 1395 -1.0416666666666666e-11 1418 1415 1.6155871338926322e-27 1418 1889 -1.0416666666666666e-11 1418 2265 4.0389678347315804e-27 1419 1419 2.5000000000000002e-10 1419 2176 -4.1666666666666665e-11 1419 2195 2.0833333333333332e-11 1419 2179 2.0833333333333326e-11 1419 1908 2.0833333333333329e-11 1419 1902 2.0833333333333332e-11 1419 1924 -2.0833333333333326e-11 1419 1904 4.1666666666666665e-11 1419 1427 -2.0833333333333326e-11 1419 1912 -2.0833333333333332e-11 1419 1911 -2.0833333333333326e-11 1419 2175 -4.1666666666666665e-11 1419 1421 4.1666666666666665e-11 1419 1420 -2.0833333333333326e-11 1420 1420 2.4999999999999996e-10 1420 2179 1.0416666666666666e-11 1420 1736 1.0416666666666665e-11 1420 2195 -2.0833333333333339e-11 1420 1729 1.0416666666666666e-11 1420 1728 6.2500000000000004e-11 1420 1422 -2.0833333333333326e-11 1420 1912 2.0833333333333339e-11 1420 1911 -1.0416666666666665e-11 1420 2175 6.2499999999999991e-11 1420 1421 1.6155871338926322e-27 1420 1419 -2.0833333333333326e-11 1421 1421 5.4166666666666666e-10 1421 1915 7.2916666666666673e-11 1421 1429 3.5100365977808920e-27 1421 1916 6.2499999999999991e-11 1421 1424 3.5628902784306998e-27 1421 1921 -2.0833333333333329e-11 1421 1904 1.0416666666666666e-11 1421 1726 -1.0416666666666666e-11 1421 1736 6.2499999999999991e-11 1421 1728 -1.0416666666666666e-11 1421 1422 4.1666666666666665e-11 1421 1913 1.0416666666666661e-11 1421 1909 2.0833333333333326e-11 1421 1908 7.2916666666666660e-11 1421 1426 5.2083333333333328e-11 1421 1427 1.0030366409885165e-27 1421 1912 -8.3333333333333330e-11 1421 1911 -6.2499999999999991e-11 1421 2175 -1.0416666666666666e-11 1421 1420 9.5018296033870872e-28 1421 1419 4.1666666666666665e-11 1421 1027 2.0833333333333329e-11 1421 1055 1.0416666666666661e-11 1421 1053 2.0833333333333329e-11 1421 492 5.2083333333333328e-11 1422 1422 2.5000000000000002e-10 1422 1720 -4.1666666666666665e-11 1422 2196 2.0833333333333329e-11 1422 1727 2.0833333333333326e-11 1422 1915 2.0833333333333332e-11 1422 1726 -4.1666666666666665e-11 1422 1429 -2.0833333333333326e-11 1422 1912 -2.0833333333333329e-11 1422 1421 4.1666666666666665e-11 1422 1736 2.0833333333333326e-11 1422 2195 2.0833333333333332e-11 1422 1729 2.0833333333333326e-11 1422 1728 -4.1666666666666665e-11 1422 1420 -2.0833333333333326e-11 1423 1423 3.3333333333333332e-10 1424 1424 1.2499999999999998e-10 1424 1916 -1.6155871338926322e-27 1424 1913 1.0097419586828951e-27 1424 1421 4.0389678347315804e-27 1424 1922 1.0097419586828951e-27 1424 1921 -1.0416666666666663e-11 1424 2265 -4.0389678347315804e-27 1424 1426 -1.0416666666666663e-11 1424 1058 -1.4136387421560532e-27 1424 1055 -1.4136387421560532e-27 1424 1053 1.0416666666666665e-11 1424 492 -1.0416666666666665e-11 1425 1425 2.0833333333333331e-10 1426 1426 4.9999999999999993e-10 1426 1883 1.0416666666666666e-10 1426 1916 2.0833333333333329e-11 1426 1923 -4.1666666666666665e-11 1426 1902 2.0833333333333329e-11 1426 1913 4.1666666666666658e-11 1426 1909 1.0416666666666666e-10 1426 1908 2.0833333333333332e-11 1426 1421 5.2083333333333328e-11 1426 1427 -1.0416666666666663e-11 1426 1922 -4.1666666666666665e-11 1426 1921 -1.0416666666666666e-10 1426 2265 2.0833333333333332e-11 1426 1424 -1.0416666666666661e-11 1427 1427 1.8749999999999997e-10 1427 1911 -1.0416666666666665e-11 1427 1924 -1.0416666666666666e-11 1427 1904 -6.2499999999999991e-11 1427 1419 -2.0833333333333326e-11 1427 1923 -1.4136387421560532e-27 1427 1902 -1.0416666666666673e-11 1427 1913 -1.4136387421560532e-27 1427 1909 1.0416666666666666e-11 1427 1908 -1.0416666666666666e-11 1427 1426 -1.0416666666666666e-11 1427 1421 1.6155871338926322e-27 1428 1428 2.7083333333333333e-10 1429 1429 1.8749999999999997e-10 1429 1421 4.0389678347315804e-27 1429 1915 -1.0416666666666668e-11 1429 2196 -1.0416666666666669e-11 1429 1727 1.0416666666666666e-11 1429 1736 1.0416666666666665e-11 1429 1726 6.2499999999999991e-11 1429 1422 -2.0833333333333326e-11 1429 1055 1.2116903504194741e-27 1429 1056 1.2116903504194741e-27 1429 1027 1.0416666666666666e-11 1429 492 -1.0416666666666666e-11 1430 1430 2.7083333333333333e-10 1431 1431 1.2499999999999998e-10 1432 1432 1.2499999999999998e-10 1433 1433 6.2499999999999991e-11 1434 1434 2.5000000062499996e-02 1434 1953 -1.2116903504194741e-27 1434 1930 -4.1666666666666666e-03 1434 2133 3.1249999999999997e-03 1434 1929 1.0416666666666662e-03 1434 1976 -4.1666666666666657e-03 1434 1928 -1.2499999999999999e-02 1434 1439 -1.0416666666666671e-03 1434 1949 -1.2116903504194741e-27 1434 1927 1.0416666666666661e-11 1434 1926 -1.0416666666666664e-03 1434 1435 -1.0416666666666661e-11 1434 4587 1.0416666666666664e-03 1434 3948 2.0833333333333337e-03 1434 3950 8.1315162936412833e-20 1435 1435 4.9999999999999993e-10 1435 1929 2.0833333333333329e-11 1435 1951 -2.0833333333333329e-11 1435 1955 -4.1666666666666658e-11 1435 1954 -1.0416666666666666e-10 1435 2233 -2.0833333333333332e-11 1435 1440 -1.0416666666666663e-11 1435 1953 -4.1666666666666665e-11 1435 1952 -1.0416666666666666e-10 1435 1949 4.1666666666666665e-11 1435 1927 1.0416666666666666e-10 1435 1926 2.0833333333333332e-11 1435 1434 -1.0416666666666661e-11 1435 3950 5.2083333333333328e-11 1436 1436 6.2499999999999991e-11 1437 1437 2.9166666770833329e-02 1438 1438 5.0000000000000003e-10 1438 2026 4.1666666666666671e-11 1438 2021 1.2499999999999998e-10 1438 1445 -1.0416666666666668e-11 1438 2020 3.1250000000000002e-11 1438 2077 -2.0833333333333339e-11 1438 1808 3.1250000000000002e-11 1438 1443 6.2499999999999991e-11 1438 1810 4.1666666666666658e-11 1438 1802 1.2499999999999998e-10 1438 1442 -1.0416666666666665e-11 1438 2078 -1.6155871338926322e-27 1438 1950 6.4623485355705287e-27 1438 2074 6.2500000000000004e-11 1438 4891 1.0416666666666665e-11 1438 4615 1.0416666666666663e-11 1438 3950 5.2083333333333321e-11 1438 3953 -2.0833333333333326e-11 1439 1439 1.6666666666666663e-02 1439 2136 1.0416666666666671e-03 1439 1930 -1.0416666666666667e-03 1439 2133 -2.0833333333333337e-03 1439 1929 1.0416666666666664e-03 1439 1976 -6.2499999999999986e-03 1439 1928 -1.0416666666666654e-03 1439 1434 -1.0416666666666671e-03 1439 4588 1.0416666666666664e-03 1439 3948 -6.2499999999999986e-03 1440 1440 3.1249999999999995e-10 1440 2234 -1.0416666666666665e-11 1440 2272 -4.1666666666666665e-11 1440 1808 3.1250000000000002e-11 1440 1443 2.0833333333333339e-11 1440 1810 4.1666666666666665e-11 1440 1809 1.2499999999999998e-10 1440 1442 -1.0416666666666668e-11 1440 1949 1.4136387421560532e-27 1440 1951 -1.0416666666666657e-11 1440 1955 1.4136387421560532e-27 1440 1954 -1.0416666666666666e-11 1440 2233 1.0416666666666666e-11 1440 1435 -1.0416666666666666e-11 1440 3950 5.2083333333333334e-11 1441 1441 2.7083333333333328e-10 1442 1442 1.6666666666666663e-10 1442 2272 -1.0416666666666666e-11 1442 2077 -1.0416666666666666e-11 1442 1808 -2.0833333333333345e-11 1442 1443 -6.2499999999999991e-11 1442 1950 -1.0416666666666666e-11 1442 1438 -1.0416666666666663e-11 1442 1802 1.0416666666666665e-11 1442 1951 -1.0416666666666665e-11 1442 1810 6.2500000000000004e-11 1442 1809 1.0416666666666660e-11 1442 1440 -1.0416666666666666e-11 1442 3950 2.0833333333333339e-11 1443 1443 4.9999999999999993e-10 1443 2021 4.1666666666666665e-11 1443 2022 4.1666666666666665e-11 1443 2020 1.6666666666666666e-10 1443 1445 -6.2499999999999991e-11 1443 2329 -4.1666666666666671e-11 1443 2233 -2.0833333333333329e-11 1443 2234 -2.0833333333333326e-11 1443 1809 4.1666666666666665e-11 1443 1440 2.0833333333333332e-11 1443 2272 4.1666666666666665e-11 1443 1802 4.1666666666666665e-11 1443 2077 4.1666666666666671e-11 1443 1808 1.6666666666666666e-10 1443 1438 6.2499999999999991e-11 1443 1442 -6.2499999999999991e-11 1444 1444 2.4999999999999996e-10 1445 1445 1.6666666666666663e-10 1445 2078 1.0416666666666665e-11 1445 2026 6.2499999999999991e-11 1445 2021 1.0416666666666660e-11 1445 1438 -1.0416666666666666e-11 1445 2077 -1.0416666666666666e-11 1445 2022 1.0416666666666665e-11 1445 2329 1.0416666666666666e-11 1445 2020 -2.0833333333333342e-11 1445 1443 -6.2499999999999991e-11 1446 1446 1.8750000062499998e-02 1446 1447 5.6545549686242126e-27 1446 2159 -6.5052130349130266e-19 1446 2152 -2.1684043449710089e-19 1446 784 1.2116903504194741e-27 1446 785 1.2116903504194741e-27 1446 781 1.0416666666666661e-11 1446 3385 -1.0416666666666664e-03 1446 428 -1.0416666666666661e-11 1446 3388 1.0416666666666669e-03 1446 2835 6.2499999999999986e-03 1446 3369 5.2083333333333330e-03 1446 2834 8.1315162936412833e-20 1446 3377 1.0416666666666664e-03 1446 3367 1.0416666666666666e-02 1446 2832 -4.1666666666666657e-03 1447 1447 2.0833333541666669e-02 1447 2046 6.2499999999999991e-11 1447 1462 2.1169082391605852e-27 1447 2159 5.2083333645833339e-03 1447 1446 -7.4433015019684602e-20 1447 2048 2.0833333333333329e-11 1447 2153 -2.1705219273391446e-19 1447 2160 1.0416666666666665e-11 1447 2157 2.0833333333333329e-11 1447 2156 5.2083333645833330e-03 1447 1453 5.2083333333333328e-11 1447 1449 -1.4558380268724954e-20 1447 2152 1.0416666666666668e-02 1447 788 -2.0833333333333326e-11 1447 784 1.0416666666666665e-11 1447 428 5.2083333333333328e-11 1447 781 2.0833333333333329e-11 1447 3388 -5.0116116045879435e-20 1447 2835 1.0116749763768550e-19 1448 1448 2.0833333333333329e-02 1448 2153 2.8940292364521927e-21 1448 2143 -4.1666666666666666e-03 1448 2134 -2.1705219273391446e-19 1448 2135 2.0833333333333329e-03 1448 2130 4.1666666666666675e-03 1448 1455 -4.1666666666666657e-03 1448 2146 -2.0833333333333329e-03 1448 2140 2.0833333333333329e-03 1448 2139 -4.1666666666666675e-03 1448 1450 4.1666666666666657e-03 1448 1449 -4.1666666666666666e-03 1448 2835 -6.2499999999999986e-03 1449 1449 1.8750000062499998e-02 1449 2149 1.0097419586828951e-27 1449 2143 5.2083333333333330e-03 1449 2152 3.2249014814734037e-20 1449 2153 1.0416666666666669e-03 1449 2160 -1.0097419586828951e-27 1449 2157 1.0416666666666661e-11 1449 2156 -8.1315166975380667e-20 1449 1453 -1.0416666666666661e-11 1449 1447 1.3552525540481672e-20 1449 2146 1.0416666666666673e-03 1449 2140 1.0416666666666664e-03 1449 2139 1.0416666666666666e-02 1449 1450 4.0389678347315804e-27 1449 1448 -4.1666666666666666e-03 1449 2835 6.2499999999999995e-03 1450 1450 2.7083333541666664e-02 1450 2309 2.0833333333333326e-11 1450 1944 -2.0833333333333329e-11 1450 2147 -6.2499999999999991e-11 1450 1461 2.1169082391605852e-27 1450 2149 1.0416666666666665e-11 1450 1453 5.2083333333333328e-11 1450 2157 2.0833333333333329e-11 1450 1928 2.1705219273391446e-19 1450 2135 9.3750000000000014e-03 1450 2130 1.0416666666666667e-03 1450 1455 1.0116749763768550e-19 1450 1941 -1.0416666666666665e-11 1450 1932 2.0833333333333329e-11 1450 1931 5.2083333645833330e-03 1450 1452 5.2083333333333328e-11 1450 1451 8.4829026136728466e-20 1450 2146 -4.1666666979166666e-03 1450 2140 6.2499999999999995e-03 1450 2139 -1.0416666666666667e-03 1450 1449 7.0197859108400047e-20 1450 1448 4.1666666666666666e-03 1451 1451 1.8750000062499998e-02 1451 2133 -5.2083333333333330e-03 1451 1936 -1.0416666666666664e-03 1451 1930 -1.0416666666666666e-02 1451 1456 -4.1666666666666657e-03 1451 2135 -4.9904357809065860e-20 1451 1928 -1.0416666666666673e-03 1451 1455 6.2499999999999986e-03 1451 1939 1.2116903504194741e-27 1451 1454 5.6545549686242126e-27 1451 1933 -1.0416666666666673e-03 1451 1941 1.2116903504194741e-27 1451 1932 1.0416666666666661e-11 1451 1931 -1.3552532810623774e-20 1451 1452 -1.0416666666666661e-11 1451 1450 8.1315162936412833e-20 1452 1452 4.9999999999999993e-10 1452 2147 -2.0833333333333329e-11 1452 1944 -1.0416666666666666e-10 1452 2285 -2.0833333333333332e-11 1452 1461 -1.0416666666666663e-11 1452 1943 -4.1666666666666658e-11 1452 1460 5.2083333333333328e-11 1452 2280 2.0833333333333329e-11 1452 1942 -1.0416666666666666e-10 1452 1940 2.0833333333333332e-11 1452 1459 -1.0416666666666661e-11 1452 1939 4.1666666666666665e-11 1452 1454 5.2083333333333328e-11 1452 1933 2.0833333333333329e-11 1452 1941 -4.1666666666666665e-11 1452 1932 1.0416666666666666e-10 1452 1931 2.0833333333333332e-11 1452 1450 5.2083333333333328e-11 1452 1451 -1.0416666666666661e-11 1453 1453 5.0000000000000003e-10 1453 2046 2.0833333333333329e-11 1453 2048 1.0416666666666666e-10 1453 2047 2.0833333333333332e-11 1453 1462 -1.0416666666666663e-11 1453 2286 4.1666666666666658e-11 1453 1460 5.2083333333333328e-11 1453 2285 -2.0833333333333329e-11 1453 2309 1.0416666666666666e-10 1453 2147 -2.0833333333333332e-11 1453 1461 -1.0416666666666663e-11 1453 2149 4.1666666666666658e-11 1453 1450 5.2083333333333328e-11 1453 2146 -2.0833333333333329e-11 1453 2160 4.1666666666666665e-11 1453 2157 1.0416666666666666e-10 1453 2156 2.0833333333333332e-11 1453 1447 5.2083333333333328e-11 1453 1449 -1.0416666666666661e-11 1454 1454 3.3333333541666663e-02 1454 1940 6.2499999999999991e-11 1454 1459 2.1169082391605852e-27 1454 1937 8.3333333333333315e-03 1454 1457 -8.8991399020904929e-20 1454 1942 -2.0833333333333326e-11 1454 1936 -6.2500000000000003e-03 1454 1930 1.0416666666666667e-03 1454 1456 4.1666666666666666e-03 1454 1939 1.0416666666666665e-11 1454 1452 5.2083333333333328e-11 1454 1932 2.0833333333333329e-11 1454 1933 4.1666666979166666e-03 1454 1451 -7.4433015019684602e-20 1454 1062 -2.0833333333333329e-11 1454 1011 -1.0416666666666667e-03 1454 1014 6.2500000000000003e-03 1454 4597 -1.0416666666666667e-03 1454 431 4.1666666666666666e-03 1454 1016 1.0416666666666665e-11 1454 1017 2.0833333333333329e-11 1454 1015 -4.1666666979166657e-03 1454 430 5.2083333333333328e-11 1454 429 -1.4558380268724954e-20 1454 4592 -1.0416666666666667e-03 1455 1455 3.7499999999999992e-02 1455 1930 -5.2083333333333322e-03 1455 2193 1.0416666666666664e-03 1455 2133 -1.0416666666666666e-02 1455 1456 -4.1666666666666657e-03 1455 1458 6.5052130349130266e-19 1455 2138 -1.0416666666666669e-03 1455 1931 2.1684043449710089e-19 1455 1451 6.2499999999999986e-03 1455 1928 1.0416666666666662e-03 1455 2143 5.2083333333333322e-03 1455 2134 -1.0416666666666662e-03 1455 2140 1.0416666666666664e-03 1455 2135 -1.0416666666666673e-03 1455 2130 -1.0416666666666666e-02 1455 1450 2.1684043449710089e-19 1455 1448 -4.1666666666666657e-03 1455 3386 2.1684043449710089e-19 1455 2835 6.2499999999999986e-03 1456 1456 2.2916666666666662e-02 1456 1928 2.1705219273391446e-19 1456 2138 2.0833333333333329e-03 1456 2133 4.1666666666666675e-03 1456 1455 -4.1666666666666657e-03 1456 1937 2.0833333333333329e-03 1456 2194 2.0833333333333329e-03 1456 2193 2.0833333333333329e-03 1456 1458 4.1666666666666657e-03 1456 1457 -2.0833333333333333e-03 1456 1933 2.0833333333333329e-03 1456 1936 -2.0833333333333329e-03 1456 1930 4.1666666666666675e-03 1456 1454 4.1666666666666657e-03 1456 1451 -4.1666666666666657e-03 1456 4592 -4.1666666666666666e-03 1457 1457 2.5000000000000001e-02 1457 2194 -2.0833333333333337e-03 1457 1458 8.1315162936412833e-20 1457 1937 -2.0833333333333337e-03 1457 1454 1.3552527156068805e-20 1457 1936 -1.0416666666666664e-03 1457 2193 1.0416666666666664e-03 1457 1456 -2.0833333333333329e-03 1457 1013 1.0416666666666662e-03 1457 1014 1.0416666666666664e-03 1457 4597 6.2500000000000003e-03 1457 431 -2.0833333333333329e-03 1457 4592 6.2500000000000003e-03 1458 1458 6.0416666666666653e-02 1458 2194 8.3333333333333315e-03 1458 1457 1.5502688168223823e-19 1458 2133 1.0416666666666667e-03 1458 2138 9.3749999999999997e-03 1458 2134 -2.1705219273391446e-19 1458 1455 4.6263880787845817e-19 1458 2193 6.2499999999999995e-03 1458 1456 4.1666666666666666e-03 1458 3381 8.3333333333333315e-03 1458 3383 -1.0416666666666667e-03 1458 2833 1.5502688168223823e-19 1458 1013 6.2500000000000003e-03 1458 4597 -1.0416666666666667e-03 1458 431 4.1666666666666666e-03 1458 3386 9.3749999999999997e-03 1458 3369 -1.0416666666666667e-03 1458 2835 1.5502688168223823e-19 1458 3376 6.2500000000000003e-03 1458 3373 -1.0416666666666667e-03 1458 2832 4.1666666666666666e-03 1458 4592 -1.0416666666666667e-03 1459 1459 1.2499999999999998e-10 1459 1454 1.6155871338926322e-27 1459 2280 -1.6155871338926322e-27 1459 1943 -1.0097419586828951e-27 1459 1460 4.0389678347315804e-27 1459 1939 -1.0097419586828951e-27 1459 1942 -1.0416666666666663e-11 1459 1940 -4.0389678347315804e-27 1459 1452 -1.0416666666666663e-11 1459 1016 1.4136387421560532e-27 1459 1061 1.4136387421560532e-27 1459 1062 -1.0416666666666665e-11 1459 430 -1.0416666666666665e-11 1460 1460 4.1666666666666662e-10 1460 2047 6.2499999999999991e-11 1460 1462 3.5628902784306998e-27 1460 2280 6.2499999999999991e-11 1460 1459 3.5628902784306998e-27 1460 2048 2.0833333333333329e-11 1460 2286 1.0416666666666661e-11 1460 1453 5.2083333333333328e-11 1460 2309 2.0833333333333329e-11 1460 1944 -2.0833333333333326e-11 1460 2285 -6.2499999999999991e-11 1460 1461 3.5628902784306998e-27 1460 1943 -1.0416666666666661e-11 1460 1452 5.2083333333333328e-11 1460 1942 -2.0833333333333329e-11 1460 788 -2.0833333333333329e-11 1460 1062 -2.0833333333333329e-11 1460 1061 -1.0416666666666661e-11 1460 430 5.2083333333333328e-11 1460 1060 -2.0833333333333329e-11 1460 787 -1.0416666666666661e-11 1460 786 -2.0833333333333326e-11 1460 1064 6.2499999999999991e-11 1460 428 5.2083333333333328e-11 1460 432 3.5628902784306998e-27 1461 1461 1.2499999999999998e-10 1461 2286 1.2116903504194741e-27 1461 2149 -1.2116903504194741e-27 1461 2309 1.0416666666666666e-11 1461 1453 -1.0416666666666666e-11 1461 1941 -1.4136387421560532e-27 1461 1450 1.6155871338926322e-27 1461 2147 4.0389678347315804e-27 1461 1943 1.4136387421560532e-27 1461 1944 -1.0416666666666666e-11 1461 2285 1.6155871338926322e-27 1461 1452 -1.0416666666666666e-11 1461 1460 4.0389678347315804e-27 1462 1462 1.2499999999999998e-10 1462 1460 4.0389678347315804e-27 1462 2047 -1.6155871338926322e-27 1462 2046 -4.0389678347315804e-27 1462 1447 1.6155871338926322e-27 1462 2160 1.4136387421560532e-27 1462 2286 -1.4136387421560532e-27 1462 2048 1.0416666666666665e-11 1462 1453 -1.0416666666666665e-11 1462 787 -1.0097419586828951e-27 1462 784 -1.0097419586828951e-27 1462 788 -1.0416666666666663e-11 1462 428 -1.0416666666666663e-11 1463 1463 3.3333333541666663e-02 1463 1937 8.3333333333333315e-03 1463 2282 2.0833333333333326e-11 1463 1940 6.2499999999999991e-11 1463 1470 5.2083333333333328e-11 1463 1464 2.1169082391605852e-27 1463 1945 -2.0833333333333329e-11 1463 1930 1.0416666666666667e-03 1463 1938 1.0416666666666665e-11 1463 1934 2.0833333333333329e-11 1463 1933 4.1666666979166657e-03 1463 1466 5.2083333333333328e-11 1463 1467 -1.4558380268724954e-20 1463 1936 -6.2500000000000003e-03 1463 706 -2.0833333333333329e-11 1463 1015 -4.1666666979166666e-03 1463 1011 -1.0416666666666667e-03 1463 293 -7.4433015019684602e-20 1463 3972 -8.8991399020904929e-20 1463 1014 6.2500000000000003e-03 1463 4597 -1.0416666666666667e-03 1463 3971 4.1666666666666666e-03 1463 704 -1.0416666666666665e-11 1463 4592 -1.0416666666666667e-03 1463 3973 4.1666666666666666e-03 1464 1464 1.2499999999999998e-10 1464 2282 1.0416666666666663e-11 1464 1940 -4.0389678347315804e-27 1464 1470 -1.0416666666666663e-11 1464 1463 1.6155871338926322e-27 1464 1938 1.4136387421560532e-27 1464 2284 1.0097419586828951e-27 1464 1946 1.4136387421560532e-27 1464 1945 -1.0416666666666665e-11 1464 2278 -1.6155871338926322e-27 1464 1466 -1.0416666666666665e-11 1464 1465 4.0389678347315804e-27 1464 704 1.0097419586828951e-27 1465 1465 4.1666666666666662e-10 1465 2284 1.0416666666666661e-11 1465 1817 8.3333333333333330e-11 1465 1470 5.2083333333333328e-11 1465 1472 1.4791141972893971e-27 1465 1804 3.6295685768920020e-28 1465 1805 1.0416666666666667e-10 1465 1471 9.5018296033870872e-28 1465 1809 2.2851328271989659e-27 1465 2282 2.0833333333333329e-11 1465 1948 -2.0833333333333329e-11 1465 2270 8.3333333333333330e-11 1465 1469 7.7635745987325877e-27 1465 1946 -1.0416666666666661e-11 1465 1945 -2.0833333333333329e-11 1465 2278 6.2499999999999991e-11 1465 1466 5.2083333333333328e-11 1465 1464 3.5628902784306998e-27 1465 700 2.0833333333333326e-11 1466 1466 4.9999999999999993e-10 1466 1940 2.0833333333333329e-11 1466 2270 2.0833333333333329e-11 1466 1948 -1.0416666666666666e-10 1466 1951 -2.0833333333333332e-11 1466 1469 -1.0416666666666663e-11 1466 1947 -4.1666666666666658e-11 1466 1926 2.0833333333333329e-11 1466 1938 4.1666666666666665e-11 1466 1934 1.0416666666666666e-10 1466 1933 2.0833333333333332e-11 1466 1463 5.2083333333333328e-11 1466 1467 -1.0416666666666661e-11 1466 1946 -4.1666666666666658e-11 1466 1945 -1.0416666666666666e-10 1466 2278 2.0833333333333332e-11 1466 1465 5.2083333333333328e-11 1466 1464 -1.0416666666666663e-11 1466 3975 5.2083333333333328e-11 1467 1467 1.2500000062499999e-02 1467 1936 -1.0416666666666664e-03 1467 1930 -6.2500000000000003e-03 1467 1947 -1.0097419586828951e-27 1467 1926 -1.0416666666666673e-03 1467 1938 -1.0097419586828951e-27 1467 1934 1.0416666666666661e-11 1467 1933 -1.0416666666666664e-03 1467 1466 -1.0416666666666661e-11 1467 1463 1.3552525540481672e-20 1467 4587 1.0416666666666664e-03 1467 3973 -2.0833333333333329e-03 1467 3975 4.0389678347315804e-27 1468 1468 2.2916666666666665e-10 1468 1803 -2.0194839173657902e-27 1468 1810 2.0194839173657902e-27 1468 1471 1.0416666666666671e-11 1468 1802 1.0416666666666663e-11 1468 1950 -1.6155871338926322e-27 1468 2076 1.0416666666666679e-11 1468 2075 1.0416666666666663e-11 1468 2074 6.2500000000000004e-11 1468 3975 -1.0416666666666661e-11 1468 4615 1.0416666666666665e-11 1468 3968 -3.2311742677852644e-27 1468 3969 -2.0833333333333326e-11 1469 1469 1.6666666666666666e-10 1469 1810 -2.0194839173657902e-27 1469 1805 2.0194839173657902e-27 1469 1471 1.0416666666666663e-11 1469 1809 1.0416666666666671e-11 1469 1946 -1.2116903504194741e-27 1469 1465 1.0501316370302109e-26 1469 2270 3.2311742677852644e-27 1469 1947 1.2116903504194741e-27 1469 1948 -1.0416666666666666e-11 1469 1951 -1.0416666666666653e-11 1469 1466 -1.0416666666666666e-11 1469 3975 -1.0416666666666671e-11 1470 1470 4.9999999999999993e-10 1470 1819 2.0833333333333329e-11 1470 2284 4.1666666666666658e-11 1470 1817 2.0833333333333332e-11 1470 1465 5.2083333333333328e-11 1470 1472 -1.0416666666666663e-11 1470 2282 1.0416666666666666e-10 1470 1940 2.0833333333333332e-11 1470 1463 5.2083333333333328e-11 1470 1464 -1.0416666666666661e-11 1470 2278 2.0833333333333329e-11 1470 1015 -2.0833333333333329e-11 1470 706 -1.0416666666666666e-10 1470 708 -2.0833333333333332e-11 1470 293 -1.0416666666666661e-11 1470 705 -4.1666666666666665e-11 1470 3977 5.2083333333333328e-11 1470 700 1.0416666666666666e-10 1470 704 -4.1666666666666665e-11 1471 1471 4.9999999999999993e-10 1471 1817 -2.0194839173657902e-27 1471 1819 5.2083333333333334e-11 1471 1804 -6.2499999999999991e-11 1471 1472 1.0416666666666671e-11 1471 1811 6.2499999999999991e-11 1471 1785 6.2500000000000004e-11 1471 1803 -8.0779356694631609e-27 1471 2076 2.0194839173657902e-27 1471 1950 -5.2083333333333334e-11 1471 1802 -6.2499999999999991e-11 1471 1468 1.0416666666666671e-11 1471 1810 6.2499999999999991e-11 1471 1951 -5.2083333333333334e-11 1471 1805 -2.2214323091023692e-27 1471 1465 1.6155871338926322e-27 1471 2270 -2.2470898404921788e-28 1471 1809 -6.2500000000000004e-11 1471 1469 1.0416666666666663e-11 1471 4462 5.2083333333333334e-11 1471 3977 1.4583333333333335e-10 1471 4461 4.5860624244724788e-28 1471 3976 1.0416666666666663e-11 1471 3968 -2.6253290925755273e-27 1471 3975 1.4583333333333335e-10 1472 1472 1.6666666666666666e-10 1472 2284 -1.4136387421560532e-27 1472 1817 -6.4623485355705287e-27 1472 1470 -1.0416666666666666e-11 1472 1805 -2.0194839173657902e-27 1472 1811 2.0194839173657902e-27 1472 1471 1.0416666666666671e-11 1472 1819 1.0416666666666666e-11 1472 1804 1.0416666666666663e-11 1472 705 -1.4136387421560532e-27 1472 3977 -1.0416666666666660e-11 1472 700 1.0416666666666666e-11 1473 1473 1.2499999999999998e-10 1473 1942 1.2116903504194741e-27 1473 1945 -1.4136387421560532e-27 1473 1494 1.6155871338926322e-27 1473 1940 4.0389678347315804e-27 1473 1934 -1.4136387421560532e-27 1473 1938 1.0416666666666666e-11 1473 1476 -1.0416666666666666e-11 1473 1932 1.2116903504194741e-27 1473 1475 -1.0416666666666666e-11 1473 1474 4.0389678347315804e-27 1473 1939 1.0416666666666666e-11 1473 1933 1.6155871338926322e-27 1474 1474 4.1666666666666662e-10 1474 1941 -2.0833333333333329e-11 1474 1974 -2.0833333333333329e-11 1474 1931 -6.2499999999999991e-11 1474 1498 3.5628902784306998e-27 1474 1935 1.0416666666666661e-11 1474 1975 -2.0833333333333326e-11 1474 1482 5.2083333333333328e-11 1474 1953 -2.0833333333333329e-11 1474 1929 -6.2499999999999991e-11 1474 1483 3.5628902784306998e-27 1474 1927 1.0416666666666661e-11 1474 1949 2.0833333333333329e-11 1474 1478 5.2083333333333328e-11 1474 1947 -2.0833333333333329e-11 1474 1926 -6.2499999999999991e-11 1474 1477 3.5628902784306998e-27 1474 1934 1.0416666666666661e-11 1474 1938 2.0833333333333326e-11 1474 1476 5.2083333333333328e-11 1474 1932 1.0416666666666661e-11 1474 1475 5.2083333333333328e-11 1474 1939 2.0833333333333329e-11 1474 1933 -6.2499999999999991e-11 1474 1473 3.5628902784306998e-27 1475 1475 4.9999999999999993e-10 1475 1931 -2.0833333333333332e-11 1475 1941 -1.0416666666666666e-10 1475 2147 2.0833333333333329e-11 1475 1498 -1.0416666666666663e-11 1475 1944 -4.1666666666666665e-11 1475 2285 2.0833333333333332e-11 1475 1497 5.2083333333333328e-11 1475 1943 -1.0416666666666666e-10 1475 2280 -2.0833333333333329e-11 1475 1496 -1.0416666666666661e-11 1475 1942 -4.1666666666666658e-11 1475 1940 -2.0833333333333332e-11 1475 1494 5.2083333333333328e-11 1475 1932 4.1666666666666658e-11 1475 1474 5.2083333333333328e-11 1475 1939 1.0416666666666666e-10 1475 1933 -2.0833333333333329e-11 1475 1473 -1.0416666666666663e-11 1476 1476 4.9999999999999993e-10 1476 1940 -2.0833333333333329e-11 1476 2270 -2.0833333333333329e-11 1476 1948 -4.1666666666666665e-11 1476 1951 2.0833333333333332e-11 1476 1491 5.2083333333333328e-11 1476 1945 -4.1666666666666665e-11 1476 1946 -1.0416666666666666e-10 1476 2278 -2.0833333333333332e-11 1476 1494 5.2083333333333328e-11 1476 1495 -1.0416666666666661e-11 1476 1947 -1.0416666666666666e-10 1476 1926 -2.0833333333333329e-11 1476 1477 -1.0416666666666661e-11 1476 1934 4.1666666666666658e-11 1476 1938 1.0416666666666666e-10 1476 1933 -2.0833333333333332e-11 1476 1474 5.2083333333333328e-11 1476 1473 -1.0416666666666663e-11 1477 1477 1.2499999999999998e-10 1477 1948 1.0097419586828951e-27 1477 1954 -1.4136387421560532e-27 1477 1491 1.6155871338926322e-27 1477 1951 -4.0389678347315804e-27 1477 1927 -1.4136387421560532e-27 1477 1949 1.0416666666666665e-11 1477 1478 -1.0416666666666665e-11 1477 1934 1.0097419586828951e-27 1477 1476 -1.0416666666666663e-11 1477 1474 4.0389678347315804e-27 1477 1947 -1.0416666666666663e-11 1477 1926 1.6155871338926322e-27 1478 1478 4.9999999999999993e-10 1478 1929 -2.0833333333333329e-11 1478 1951 2.0833333333333329e-11 1478 1954 -4.1666666666666665e-11 1478 2233 2.0833333333333332e-11 1478 1491 5.2083333333333328e-11 1478 1955 -1.0416666666666666e-10 1478 1489 -1.0416666666666661e-11 1478 1952 -4.1666666666666658e-11 1478 1953 -1.0416666666666666e-10 1478 1480 5.2083333333333328e-11 1478 1483 -1.0416666666666663e-11 1478 1927 4.1666666666666658e-11 1478 1949 1.0416666666666666e-10 1478 1926 -2.0833333333333332e-11 1478 1474 5.2083333333333328e-11 1478 1477 -1.0416666666666663e-11 1479 1479 1.2499999999999998e-10 1479 1972 1.0097419586828951e-27 1479 1973 -1.2116903504194741e-27 1479 1497 4.0389678347315804e-27 1479 1963 -4.0389678347315804e-27 1479 1960 -1.2116903504194741e-27 1479 1967 1.0416666666666661e-11 1479 1482 -1.0416666666666661e-11 1479 1958 1.0097419586828951e-27 1479 1481 -1.0416666666666661e-11 1479 1480 4.0389678347315804e-27 1479 1968 1.0416666666666661e-11 1480 1480 4.1666666666666662e-10 1480 1969 -2.0833333333333326e-11 1480 2203 2.0833333333333329e-11 1480 1487 2.1169082391605852e-27 1480 1962 1.0416666666666665e-11 1480 2230 -2.0833333333333329e-11 1480 1488 5.2083333333333328e-11 1480 1955 -2.0833333333333329e-11 1480 1489 3.5628902784306998e-27 1480 1952 -1.0416666666666665e-11 1480 1953 -2.0833333333333326e-11 1480 1478 5.2083333333333328e-11 1480 1975 -2.0833333333333329e-11 1480 1483 2.1169082391605852e-27 1480 1960 1.0416666666666665e-11 1480 1967 2.0833333333333329e-11 1480 1482 5.2083333333333328e-11 1480 1958 1.0416666666666665e-11 1480 1481 5.2083333333333328e-11 1480 1968 2.0833333333333329e-11 1480 1479 3.5628902784306998e-27 1481 1481 5.0000000000000003e-10 1481 2223 2.0833333333333329e-11 1481 1972 -4.1666666666666665e-11 1481 1963 2.0833333333333332e-11 1481 1497 5.2083333333333328e-11 1481 1969 -1.0416666666666666e-10 1481 2202 2.0833333333333329e-11 1481 1487 -1.0416666666666663e-11 1481 1970 -4.1666666666666658e-11 1481 1971 -1.0416666666666666e-10 1481 2213 -2.0833333333333332e-11 1481 1485 5.2083333333333328e-11 1481 1484 -1.0416666666666663e-11 1481 1958 4.1666666666666658e-11 1481 1480 5.2083333333333328e-11 1481 1968 1.0416666666666666e-10 1481 1479 -1.0416666666666661e-11 1482 1482 5.0000000000000003e-10 1482 1931 -2.0833333333333329e-11 1482 1935 4.1666666666666658e-11 1482 1929 -2.0833333333333332e-11 1482 1474 5.2083333333333328e-11 1482 1974 -1.0416666666666666e-10 1482 2147 2.0833333333333332e-11 1482 1498 -1.0416666666666661e-11 1482 1973 -4.1666666666666665e-11 1482 1497 5.2083333333333328e-11 1482 1963 2.0833333333333329e-11 1482 1975 -1.0416666666666666e-10 1482 1483 -1.0416666666666663e-11 1482 1960 4.1666666666666665e-11 1482 1967 1.0416666666666666e-10 1482 1480 5.2083333333333328e-11 1482 1479 -1.0416666666666661e-11 1483 1483 1.2499999999999998e-10 1483 1935 -1.4136387421560532e-27 1483 1927 1.2116903504194741e-27 1483 1474 4.0389678347315804e-27 1483 1929 1.6155871338926322e-27 1483 1952 1.2116903504194741e-27 1483 1953 -1.0416666666666666e-11 1483 1478 -1.0416666666666666e-11 1483 1960 1.4136387421560532e-27 1483 1482 -1.0416666666666666e-11 1483 1480 1.6155871338926322e-27 1483 1975 -1.0416666666666666e-11 1484 1484 1.2499999999999998e-10 1484 2229 1.0097419586828951e-27 1484 1972 -1.4136387421560532e-27 1484 1497 1.6155871338926322e-27 1484 2223 -4.0389678347315804e-27 1484 1970 1.4136387421560532e-27 1484 1971 -1.0416666666666665e-11 1484 1481 -1.0416666666666665e-11 1484 2217 1.0097419586828951e-27 1484 1486 -1.0416666666666663e-11 1484 1485 4.0389678347315804e-27 1484 2224 1.0416666666666663e-11 1484 2213 1.6155871338926322e-27 1485 1485 4.1666666666666662e-10 1485 2226 -2.0833333333333326e-11 1485 2268 2.0833333333333329e-11 1485 2216 -6.2499999999999991e-11 1485 1493 3.5628902784306998e-27 1485 2218 1.0416666666666661e-11 1485 2275 2.0833333333333329e-11 1485 1492 5.2083333333333328e-11 1485 2232 -2.0833333333333329e-11 1485 2215 -6.2499999999999991e-11 1485 1490 3.5628902784306998e-27 1485 2212 1.0416666666666661e-11 1485 2203 2.0833333333333326e-11 1485 1488 5.2083333333333328e-11 1485 1969 -2.0833333333333329e-11 1485 2202 6.2499999999999991e-11 1485 1487 3.5628902784306998e-27 1485 1970 -1.0416666666666661e-11 1485 1971 -2.0833333333333329e-11 1485 1481 5.2083333333333328e-11 1485 2217 1.0416666666666661e-11 1485 1486 5.2083333333333328e-11 1485 2224 2.0833333333333329e-11 1485 2213 -6.2499999999999991e-11 1485 1484 3.5628902784306998e-27 1486 1486 5.0000000000000003e-10 1486 2285 2.0833333333333329e-11 1486 2229 -4.1666666666666665e-11 1486 2223 2.0833333333333332e-11 1486 1497 5.2083333333333328e-11 1486 2228 -1.0416666666666666e-10 1486 2280 -2.0833333333333332e-11 1486 1496 -1.0416666666666661e-11 1486 2227 -4.1666666666666665e-11 1486 1494 5.2083333333333328e-11 1486 2266 2.0833333333333329e-11 1486 2226 -1.0416666666666666e-10 1486 2216 -2.0833333333333332e-11 1486 1493 -1.0416666666666663e-11 1486 2217 4.1666666666666658e-11 1486 1485 5.2083333333333328e-11 1486 2224 1.0416666666666666e-10 1486 2213 -2.0833333333333329e-11 1486 1484 -1.0416666666666661e-11 1487 1487 1.2499999999999998e-10 1487 1958 -1.2116903504194741e-27 1487 1962 1.4136387421560532e-27 1487 1480 1.6155871338926322e-27 1487 2212 -1.4136387421560532e-27 1487 2203 1.0416666666666666e-11 1487 1488 -1.0416666666666666e-11 1487 1970 -1.2116903504194741e-27 1487 1481 -1.0416666666666666e-11 1487 1485 4.0389678347315804e-27 1487 1969 -1.0416666666666666e-11 1487 2202 -1.6155871338926322e-27 1488 1488 4.9999999999999993e-10 1488 2215 -2.0833333333333329e-11 1488 2233 2.0833333333333329e-11 1488 2231 -4.1666666666666665e-11 1488 2232 -1.0416666666666666e-10 1488 2273 -2.0833333333333332e-11 1488 1491 5.2083333333333328e-11 1488 1490 -1.0416666666666661e-11 1488 1962 4.1666666666666665e-11 1488 2230 -1.0416666666666666e-10 1488 1480 5.2083333333333328e-11 1488 1489 -1.0416666666666661e-11 1488 2212 4.1666666666666658e-11 1488 2203 1.0416666666666666e-10 1488 2202 2.0833333333333332e-11 1488 1485 5.2083333333333328e-11 1488 1487 -1.0416666666666663e-11 1489 1489 1.2499999999999998e-10 1489 1954 1.0097419586828951e-27 1489 2231 -1.2116903504194741e-27 1489 1491 4.0389678347315804e-27 1489 2233 -4.0389678347315804e-27 1489 1962 -1.2116903504194741e-27 1489 2230 -1.0416666666666661e-11 1489 1488 -1.0416666666666661e-11 1489 1952 -1.0097419586828951e-27 1489 1478 -1.0416666666666661e-11 1489 1480 4.0389678347315804e-27 1489 1955 -1.0416666666666661e-11 1490 1490 1.2499999999999998e-10 1490 2218 -1.4136387421560532e-27 1490 2212 1.0097419586828951e-27 1490 1485 4.0389678347315804e-27 1490 2215 1.6155871338926322e-27 1490 2231 1.0097419586828951e-27 1490 2232 -1.0416666666666663e-11 1490 1488 -1.0416666666666663e-11 1490 2271 1.4136387421560532e-27 1490 1492 -1.0416666666666665e-11 1490 1491 1.6155871338926322e-27 1490 2275 1.0416666666666665e-11 1490 2273 4.0389678347315804e-27 1491 1491 4.1666666666666662e-10 1491 2276 -2.0833333333333329e-11 1491 1946 -2.0833333333333329e-11 1491 2270 -6.2500000000000004e-11 1491 1495 3.7324953730532174e-27 1491 1948 -1.0416666666666665e-11 1491 1947 -2.0833333333333326e-11 1491 1476 5.2083333333333328e-11 1491 1949 2.0833333333333329e-11 1491 1951 6.2499999999999991e-11 1491 1477 2.1169082391605852e-27 1491 1954 -1.0416666666666665e-11 1491 1955 -2.0833333333333329e-11 1491 1478 5.2083333333333328e-11 1491 2230 -2.0833333333333329e-11 1491 2233 6.2500000000000004e-11 1491 1489 3.7324953730532174e-27 1491 2231 -1.0416666666666665e-11 1491 2232 -2.0833333333333326e-11 1491 1488 5.2083333333333328e-11 1491 2271 1.0416666666666665e-11 1491 1492 5.2083333333333328e-11 1491 2275 2.0833333333333329e-11 1491 2273 -6.2499999999999991e-11 1491 1490 2.1169082391605852e-27 1492 1492 4.9999999999999993e-10 1492 2270 -2.0833333333333332e-11 1492 2276 -1.0416666666666666e-10 1492 2278 -2.0833333333333329e-11 1492 1495 -1.0416666666666661e-11 1492 2277 -4.1666666666666658e-11 1492 2266 2.0833333333333332e-11 1492 1494 5.2083333333333328e-11 1492 2268 1.0416666666666666e-10 1492 2216 -2.0833333333333329e-11 1492 1493 -1.0416666666666663e-11 1492 2218 4.1666666666666658e-11 1492 2215 -2.0833333333333332e-11 1492 1485 5.2083333333333328e-11 1492 2271 4.1666666666666665e-11 1492 1491 5.2083333333333328e-11 1492 2275 1.0416666666666666e-10 1492 2273 -2.0833333333333329e-11 1492 1490 -1.0416666666666663e-11 1493 1493 1.2499999999999998e-10 1493 2277 1.2116903504194741e-27 1493 2227 -1.4136387421560532e-27 1493 1494 1.6155871338926322e-27 1493 2266 -4.0389678347315804e-27 1493 2217 -1.4136387421560532e-27 1493 2226 -1.0416666666666666e-11 1493 1486 -1.0416666666666666e-11 1493 2218 1.2116903504194741e-27 1493 1492 -1.0416666666666666e-11 1493 1485 4.0389678347315804e-27 1493 2268 1.0416666666666666e-11 1493 2216 1.6155871338926322e-27 1494 1494 4.1666666666666662e-10 1494 2228 -2.0833333333333329e-11 1494 1943 -2.0833333333333329e-11 1494 2280 -6.2499999999999991e-11 1494 1496 3.5628902784306998e-27 1494 1942 -1.0416666666666665e-11 1494 1939 2.0833333333333326e-11 1494 1475 5.2083333333333328e-11 1494 1938 2.0833333333333329e-11 1494 1940 -6.2499999999999991e-11 1494 1473 2.1169082391605852e-27 1494 1945 -1.0416666666666665e-11 1494 1946 -2.0833333333333329e-11 1494 1476 5.2083333333333328e-11 1494 2276 -2.0833333333333329e-11 1494 2278 -6.2499999999999991e-11 1494 1495 3.5628902784306998e-27 1494 2277 -1.0416666666666665e-11 1494 2268 2.0833333333333326e-11 1494 1492 5.2083333333333328e-11 1494 2227 -1.0416666666666665e-11 1494 1486 5.2083333333333328e-11 1494 2226 -2.0833333333333329e-11 1494 2266 6.2499999999999991e-11 1494 1493 2.1169082391605852e-27 1495 1495 1.2499999999999998e-10 1495 2271 -1.0097419586828951e-27 1495 1948 -1.2116903504194741e-27 1495 1491 4.0389678347315804e-27 1495 2270 4.0389678347315804e-27 1495 1945 1.2116903504194741e-27 1495 1946 -1.0416666666666661e-11 1495 1476 -1.0416666666666661e-11 1495 2277 -1.0097419586828951e-27 1495 1492 -1.0416666666666661e-11 1495 1494 4.0389678347315804e-27 1495 2276 -1.0416666666666661e-11 1495 2278 4.0389678347315804e-27 1496 1496 1.2499999999999998e-10 1496 1944 1.0097419586828951e-27 1496 2229 -1.2116903504194741e-27 1496 1497 4.0389678347315804e-27 1496 2285 -4.0389678347315804e-27 1496 2227 1.2116903504194741e-27 1496 2228 -1.0416666666666661e-11 1496 1486 -1.0416666666666661e-11 1496 1942 -1.0097419586828951e-27 1496 1475 -1.0416666666666661e-11 1496 1494 4.0389678347315804e-27 1496 1943 -1.0416666666666661e-11 1496 2280 4.0389678347315804e-27 1497 1497 4.1666666666666662e-10 1497 1974 -2.0833333333333326e-11 1497 1941 -2.0833333333333329e-11 1497 2147 6.2499999999999991e-11 1497 1498 2.1169082391605852e-27 1497 1944 -1.0416666666666665e-11 1497 1943 -2.0833333333333329e-11 1497 1475 5.2083333333333328e-11 1497 2228 -2.0833333333333329e-11 1497 2285 6.2500000000000004e-11 1497 1496 3.7324953730532174e-27 1497 2229 -1.0416666666666665e-11 1497 2224 2.0833333333333326e-11 1497 1486 5.2083333333333328e-11 1497 1971 -2.0833333333333329e-11 1497 2223 6.2499999999999991e-11 1497 1484 2.1169082391605852e-27 1497 1972 -1.0416666666666665e-11 1497 1968 2.0833333333333329e-11 1497 1481 5.2083333333333328e-11 1497 1973 -1.0416666666666665e-11 1497 1482 5.2083333333333328e-11 1497 1967 2.0833333333333329e-11 1497 1963 6.2500000000000004e-11 1497 1479 3.7324953730532174e-27 1498 1498 1.2499999999999998e-10 1498 1932 -1.4136387421560532e-27 1498 1935 1.0097419586828951e-27 1498 1474 4.0389678347315804e-27 1498 1931 1.6155871338926322e-27 1498 1973 1.0097419586828951e-27 1498 1974 -1.0416666666666663e-11 1498 1482 -1.0416666666666663e-11 1498 1944 -1.4136387421560532e-27 1498 1475 -1.0416666666666665e-11 1498 1497 1.6155871338926322e-27 1498 1941 -1.0416666666666665e-11 1498 2147 -4.0389678347315804e-27 1499 1499 3.7499999999999992e-02 1499 2136 -6.2499999999999986e-03 1499 1929 5.2083333333333322e-03 1499 1976 -6.2499999999999986e-03 1499 1931 -2.1684043449710089e-19 1499 1928 6.2500000000000003e-03 1499 1509 1.0416666666666669e-03 1499 2140 1.0416666666666667e-03 1499 1505 2.1684043449710089e-19 1499 2135 -1.0416666666666671e-03 1499 2142 1.0416666666666664e-03 1499 2131 -1.0416666666666669e-03 1499 2130 -6.2499999999999995e-03 1499 1500 -2.0833333333333333e-03 1500 1500 2.4999999999999994e-02 1500 2145 -4.1666666666666666e-03 1500 2146 -2.0833333333333329e-03 1500 2155 2.0833333333333329e-03 1500 2144 2.0833333333333329e-03 1500 2139 -4.1666666666666666e-03 1500 1510 -2.0833333333333333e-03 1500 2140 2.0833333333333329e-03 1500 1505 4.1666666666666657e-03 1500 2135 2.0833333333333329e-03 1500 2142 2.0833333333333329e-03 1500 2131 2.0833333333333329e-03 1500 2130 4.1666666666666675e-03 1500 1499 -2.0833333333333329e-03 1501 1501 2.7083333333333327e-02 1502 1502 1.2499999999999998e-10 1502 2148 1.4136387421560532e-27 1502 1967 1.2116903504194741e-27 1502 1974 1.2116903504194741e-27 1502 1973 -1.0416666666666666e-11 1502 2147 4.0389678347315804e-27 1502 1506 -1.0416666666666666e-11 1502 1505 1.6155871338926322e-27 1502 1964 -1.4136387421560532e-27 1502 2308 1.0416666666666666e-11 1502 1963 1.6155871338926322e-27 1502 1504 -1.0416666666666666e-11 1503 1503 2.0833333333333331e-10 1504 1504 4.9999999999999993e-10 1504 2147 -2.0833333333333329e-11 1504 2155 2.0833333333333329e-11 1504 2148 4.1666666666666665e-11 1504 2158 1.0416666666666666e-10 1504 2146 -2.0833333333333332e-11 1504 1505 5.2083333333333328e-11 1504 1510 -1.0416666666666661e-11 1504 2168 4.1666666666666665e-11 1504 2291 1.0416666666666666e-10 1504 1964 4.1666666666666658e-11 1504 2308 1.0416666666666666e-10 1504 1963 -2.0833333333333332e-11 1504 1502 -1.0416666666666663e-11 1505 1505 2.7083333541666664e-02 1505 2308 2.0833333333333329e-11 1505 1935 2.0833333333333329e-11 1505 2148 1.0416666666666665e-11 1505 2158 2.0833333333333329e-11 1505 1504 5.2083333333333328e-11 1505 2146 -4.1666666979166657e-03 1505 1510 8.4829026136728466e-20 1505 2139 -1.0416666666666667e-03 1505 1931 5.2083333645833339e-03 1505 1928 5.0116116045879435e-20 1505 1509 7.0197859108400047e-20 1505 2140 6.2499999999999995e-03 1505 1500 4.1666666666666657e-03 1505 2135 9.3749999999999997e-03 1505 2130 1.0416666666666664e-03 1505 1499 1.0116749763768550e-19 1505 1974 -1.0416666666666665e-11 1505 1973 -2.0833333333333326e-11 1505 2147 -6.2499999999999991e-11 1505 1506 5.2083333333333328e-11 1505 1502 2.1169082391605852e-27 1506 1506 5.0000000000000003e-10 1506 1931 2.0833333333333329e-11 1506 1935 1.0416666666666666e-10 1506 1929 2.0833333333333332e-11 1506 1509 -1.0416666666666661e-11 1506 1963 -2.0833333333333329e-11 1506 1975 -4.1666666666666665e-11 1506 1967 4.1666666666666658e-11 1506 1960 1.0416666666666666e-10 1506 1974 -4.1666666666666658e-11 1506 1973 -1.0416666666666666e-10 1506 2147 -2.0833333333333332e-11 1506 1505 5.2083333333333328e-11 1506 1502 -1.0416666666666663e-11 1507 1507 6.2499999999999991e-11 1508 1508 2.9166666770833329e-02 1509 1509 1.0416666729166666e-02 1509 1974 -1.0097419586828951e-27 1509 1975 1.0097419586828951e-27 1509 1935 1.0416666666666661e-11 1509 1506 -1.0416666666666661e-11 1509 1929 1.0416666666666667e-03 1509 1976 2.1961093809541182e-20 1509 1931 -2.1684043288151375e-19 1509 2135 -2.1684043449710089e-19 1509 1928 -1.0416666666666673e-03 1509 1505 4.0389678347315804e-27 1509 1499 1.0416666666666669e-03 1510 1510 1.2500000062500002e-02 1510 2168 1.2116903504194741e-27 1510 2148 -1.2116903504194741e-27 1510 2158 1.0416666666666661e-11 1510 1504 -1.0416666666666661e-11 1510 2146 1.0416666666666664e-03 1510 1505 8.1315162936412833e-20 1510 2140 1.0416666666666664e-03 1510 2155 -1.0416666666666673e-03 1510 2144 1.0416666666666664e-03 1510 2139 6.2500000000000003e-03 1510 1500 -2.0833333333333329e-03 1511 1511 1.6666666770833331e-02 1512 1512 1.2500000000000001e-02 1513 1513 1.0416666666666664e-02 1514 1514 6.2499999999999991e-11 1515 1515 3.7500000000000000e-10 1515 1981 1.0416666666666666e-11 1515 2003 3.1250000000000002e-11 1515 1999 -4.1666666666666665e-11 1515 1995 -1.2499999999999998e-10 1515 1520 -1.0416666666666665e-11 1515 1997 -2.0833333333333339e-11 1515 2080 1.0416666666666666e-11 1515 1996 -4.1666666666666671e-11 1515 1516 2.0833333333333336e-11 1515 1994 -6.4623485355705287e-27 1515 1978 6.2499999999999991e-11 1515 4704 1.0416666666666665e-11 1515 4107 -2.0833333333333326e-11 1516 1516 3.7499999999999995e-10 1516 2008 4.1666666666666665e-11 1516 1995 -4.1666666666666665e-11 1516 2003 1.6666666666666669e-10 1516 1520 -6.2499999999999991e-11 1516 2011 4.1666666666666665e-11 1516 2082 2.0833333333333326e-11 1516 2081 -4.1666666666666665e-11 1516 1997 2.0833333333333332e-11 1516 2080 2.0833333333333326e-11 1516 1996 4.1666666666666671e-11 1516 1515 2.0833333333333336e-11 1517 1517 3.3333333333333332e-10 1518 1518 1.2499999999999998e-10 1519 1519 1.6666666666666666e-10 1520 1520 1.6666666666666663e-10 1520 2011 -1.0416666666666666e-11 1520 1996 -1.0416666666666666e-11 1520 2003 -2.0833333333333345e-11 1520 1516 -6.2500000000000004e-11 1520 1994 1.0416666666666666e-11 1520 1515 -1.0416666666666663e-11 1520 1995 -1.0416666666666665e-11 1520 1999 -6.2500000000000004e-11 1520 2008 1.0416666666666660e-11 1521 1521 2.4999999999999996e-10 1522 1522 2.4999999999999996e-10 1522 2319 2.0833333333333326e-11 1522 2315 -4.1666666666666665e-11 1522 1524 -2.0833333333333326e-11 1522 2321 2.0833333333333329e-11 1522 1993 2.0833333333333332e-11 1522 1992 -2.0833333333333332e-11 1522 1991 -2.0833333333333326e-11 1522 2316 -4.1666666666666665e-11 1522 1523 -2.0833333333333326e-11 1522 4775 2.0833333333333332e-11 1522 5059 2.0833333333333332e-11 1522 813 -4.1666666666666665e-11 1522 4071 4.1666666666666665e-11 1522 4073 -2.0833333333333326e-11 1522 818 2.0833333333333332e-11 1522 814 2.0833333333333326e-11 1522 441 4.1666666666666665e-11 1522 4068 4.1666666666666665e-11 1523 1523 2.4999999999999996e-10 1523 2319 1.0416666666666665e-11 1523 2321 -2.0833333333333332e-11 1523 1982 1.0416666666666666e-11 1523 1979 6.2499999999999991e-11 1523 1992 2.0833333333333339e-11 1523 1991 -1.0416666666666666e-11 1523 2316 6.2499999999999991e-11 1523 1522 -2.0833333333333326e-11 1523 4706 1.0416666666666665e-11 1523 4071 1.6155871338926322e-27 1523 4060 -2.0833333333333326e-11 1523 4068 -2.6253290925755273e-27 1524 1524 2.4999999999999996e-10 1524 1993 -2.0833333333333339e-11 1524 2315 6.2500000000000004e-11 1524 1522 -2.0833333333333326e-11 1524 1991 -1.0416666666666665e-11 1524 3699 1.0416666666666665e-11 1524 5005 1.0416666666666663e-11 1524 816 -6.2500000000000004e-11 1524 442 -2.0833333333333326e-11 1524 818 -2.0833333333333339e-11 1524 814 1.0416666666666663e-11 1524 441 -2.6253290925755273e-27 1524 4068 1.6155871338926322e-27 1525 1525 5.4166666666666666e-10 1525 2005 2.2851328271989659e-27 1525 1990 -9.3749999999999999e-11 1525 1530 9.8400537165005960e-28 1525 1987 -1.0416666666666667e-10 1525 1995 -3.6295685768920020e-28 1525 1528 -3.0991386737738975e-27 1525 1988 -9.3750000000000012e-11 1525 1978 -1.0416666666666666e-11 1525 1526 -3.0797129739828301e-27 1525 1983 6.2499999999999991e-11 1525 1985 8.3333333333333330e-11 1525 1989 -6.2499999999999991e-11 1525 4982 -1.0416666666666666e-11 1525 4699 -1.0416666666666666e-11 1525 4305 4.1666666666666665e-11 1525 4985 -1.0416666666666666e-11 1525 4306 -3.0991386737738975e-27 1525 4308 4.1666666666666665e-11 1526 1526 2.2916666666666665e-10 1526 1987 2.0194839173657902e-27 1526 1999 -2.0194839173657902e-27 1526 1528 1.0416666666666671e-11 1526 1995 -1.0416666666666663e-11 1526 1994 4.8467614016778965e-27 1526 1988 1.0416666666666679e-11 1526 1983 1.0416666666666666e-11 1526 1978 6.2500000000000004e-11 1526 1525 -3.2311742677852644e-27 1526 4704 1.0416666666666665e-11 1526 4305 -2.0833333333333326e-11 1527 1527 1.0416666666666666e-10 1528 1528 4.9999999999999993e-10 1528 2006 -6.2499999999999991e-11 1528 2009 6.2499999999999991e-11 1528 2323 5.2083333333333334e-11 1528 1990 -4.5860624244724788e-28 1528 2005 -6.2500000000000004e-11 1528 1530 1.0416666666666663e-11 1528 1987 8.0779356694631609e-27 1528 1988 2.0194839173657902e-27 1528 1525 -2.6253290925755273e-27 1528 1994 5.2083333333333334e-11 1528 1995 6.2499999999999991e-11 1528 1526 1.0416666666666671e-11 1528 1999 -6.2499999999999991e-11 1528 2007 -2.2214323091023692e-27 1528 2008 -6.2500000000000004e-11 1529 1529 2.0833333333333329e-10 1530 1530 2.2916666666666665e-10 1530 2009 -2.4233807008389483e-27 1530 1987 -2.0194839173657902e-27 1530 1528 1.0416666666666663e-11 1530 2005 1.0416666666666671e-11 1530 1990 1.0416666666666666e-11 1530 1525 2.2214323091023692e-27 1530 1989 -1.0416666666666666e-11 1530 2323 -9.6935228033557931e-27 1530 4980 1.0416666666666665e-11 1530 4982 6.2499999999999991e-11 1530 4308 -2.0833333333333326e-11 1531 1531 1.0416666666666666e-10 1532 1532 3.7499999999999995e-10 1532 2325 1.0416666666666666e-11 1532 2004 -5.2083333333333334e-11 1532 2128 -1.0416666666666667e-10 1532 1547 -4.1666666666666665e-11 1532 2129 -1.0416666666666666e-11 1532 2112 1.0416666666666666e-11 1532 2107 5.2083333333333334e-11 1532 2123 1.0416666666666669e-11 1532 2109 1.0416666666666667e-10 1532 1538 -4.1666666666666665e-11 1532 2002 -2.0194839173657902e-27 1532 2121 1.0416666666666669e-11 1532 2001 1.0416666666666669e-11 1532 1534 1.6155871338926322e-27 1532 1533 6.2500000000000004e-11 1533 1533 4.3749999999999999e-10 1533 2128 -5.2083333333333334e-11 1533 2326 5.2083333333333328e-11 1533 2004 -1.4583333333333335e-10 1533 1547 -6.2500000000000004e-11 1533 2087 1.0416666666666665e-11 1533 2011 -5.2083333333333334e-11 1533 2003 -1.0416666666666667e-10 1533 1546 -4.1666666666666665e-11 1533 2008 -1.0416666666666666e-11 1533 2007 -1.6155871338926322e-27 1533 2006 -1.0416666666666666e-11 1533 2002 -1.0416666666666671e-11 1533 2121 2.0194839173657902e-27 1533 2001 -1.0416666666666669e-11 1533 1534 -2.6253290925755273e-27 1533 1532 6.2499999999999991e-11 1534 1534 6.0416666666666670e-10 1534 2003 1.0416666666666666e-11 1534 2109 -1.0416666666666665e-11 1534 1826 -1.0416666666666666e-11 1534 2087 6.2499999999999991e-11 1534 2083 -1.0416666666666666e-11 1534 1546 4.1666666666666665e-11 1534 2103 8.3333333333333330e-11 1534 1543 -3.0991386737738975e-27 1534 1833 6.2499999999999991e-11 1534 1822 -1.0416666666666666e-11 1534 1542 4.1666666666666665e-11 1534 2117 8.3333333333333330e-11 1534 1539 -3.0991386737738975e-27 1534 2112 6.2499999999999991e-11 1534 2110 -1.0416666666666666e-11 1534 1538 4.1666666666666665e-11 1534 2002 9.3750000000000012e-11 1534 2121 -9.3750000000000012e-11 1534 2001 3.6295685768920020e-28 1534 1533 -3.0991386737738975e-27 1534 1532 1.0034310714411270e-27 1535 1535 1.8749999999999997e-10 1536 1536 2.0833333333333329e-10 1537 1537 1.8749999999999997e-10 1538 1538 2.2916666666666665e-10 1538 2121 -2.0833333333333332e-11 1538 2123 2.8940292364521930e-29 1538 2109 -4.1666666666666671e-11 1538 1532 -4.1666666666666665e-11 1538 2107 -4.1666666666666671e-11 1538 2117 2.0833333333333332e-11 1538 1534 4.1666666666666665e-11 1538 2112 2.0833333333333329e-11 1538 2115 2.0833333333333332e-11 1538 2113 2.0833333333333326e-11 1538 2110 -4.1666666666666665e-11 1538 1539 -2.0833333333333326e-11 1539 1539 2.4999999999999996e-10 1539 1827 1.0416666666666665e-11 1539 1833 1.0416666666666663e-11 1539 1826 6.2500000000000004e-11 1539 1542 -2.0833333333333326e-11 1539 2117 -2.0833333333333339e-11 1539 1534 -2.6253290925755273e-27 1539 2112 1.0416666666666665e-11 1539 2115 -2.0833333333333339e-11 1539 2113 1.0416666666666663e-11 1539 2110 6.2500000000000004e-11 1539 1538 -2.0833333333333326e-11 1540 1540 3.3333333333333332e-10 1541 1541 1.8750000000000002e-10 1542 1542 2.5000000000000002e-10 1542 2115 2.0833333333333332e-11 1542 2117 2.0833333333333332e-11 1542 1826 -4.1666666666666665e-11 1542 1539 -2.0833333333333326e-11 1542 1827 2.0833333333333326e-11 1542 1824 -4.1666666666666665e-11 1542 2103 2.0833333333333332e-11 1542 1534 4.1666666666666665e-11 1542 1833 2.0833333333333326e-11 1542 2102 2.0833333333333332e-11 1542 1834 2.0833333333333326e-11 1542 1822 -4.1666666666666665e-11 1542 1543 -2.0833333333333326e-11 1543 1543 2.4999999999999996e-10 1543 2084 1.0416666666666665e-11 1543 2087 1.0416666666666666e-11 1543 2083 6.2500000000000004e-11 1543 1546 -2.0833333333333326e-11 1543 2103 -2.0833333333333339e-11 1543 1534 -2.6253290925755273e-27 1543 1833 1.0416666666666666e-11 1543 2102 -2.0833333333333339e-11 1543 1834 1.0416666666666665e-11 1543 1822 6.2499999999999991e-11 1543 1542 -2.0833333333333326e-11 1544 1544 3.3333333333333332e-10 1545 1545 1.2499999999999998e-10 1546 1546 2.2916666666666665e-10 1546 2002 2.0833333333333332e-11 1546 2008 -2.8940292364521930e-29 1546 2003 4.1666666666666678e-11 1546 1533 -4.1666666666666665e-11 1546 2102 2.0833333333333329e-11 1546 2103 2.0833333333333332e-11 1546 2087 2.0833333333333326e-11 1546 2083 -4.1666666666666665e-11 1546 1534 4.1666666666666665e-11 1546 1543 -2.0833333333333326e-11 1546 2084 2.0833333333333326e-11 1546 2011 4.1666666666666671e-11 1547 1547 2.0833333333333334e-10 1547 2129 2.0833333333333329e-11 1547 2001 -4.3283707583767993e-28 1547 2128 4.1666666666666671e-11 1547 1532 -4.1666666666666665e-11 1547 2006 -3.1495832401145651e-28 1547 1533 -6.2500000000000004e-11 1547 2004 4.1666666666666671e-11 1547 2325 2.0833333333333329e-11 1547 2326 -4.1666666666666658e-11 1548 1548 2.7083333333333328e-10 1549 1549 3.7499999999999995e-10 1549 2328 1.0416666666666666e-11 1549 2020 -5.2083333333333334e-11 1549 2190 -1.0416666666666667e-10 1549 1564 -4.1666666666666665e-11 1549 2191 -1.0416666666666669e-11 1549 2177 1.0416666666666669e-11 1549 2172 5.2083333333333334e-11 1549 2184 1.0416666666666669e-11 1549 2174 1.0416666666666667e-10 1549 1555 -4.1666666666666665e-11 1549 2018 -2.0194839173657902e-27 1549 2182 1.0416666666666669e-11 1549 2017 1.0416666666666669e-11 1549 1551 6.4623485355705287e-27 1549 1550 6.2500000000000004e-11 1550 1550 4.3749999999999999e-10 1550 2190 -5.2083333333333334e-11 1550 2329 5.2083333333333328e-11 1550 2020 -1.4583333333333335e-10 1550 1564 -6.2500000000000004e-11 1550 2114 1.0416666666666666e-11 1550 2029 -5.2083333333333334e-11 1550 2019 -1.0416666666666667e-10 1550 1563 -4.1666666666666665e-11 1550 2024 -1.0416666666666669e-11 1550 2023 -1.6155871338926322e-27 1550 2022 -1.0416666666666666e-11 1550 2018 -1.0416666666666673e-11 1550 2182 2.0194839173657902e-27 1550 2017 -1.0416666666666669e-11 1550 1551 -2.6253290925755273e-27 1550 1549 6.2499999999999991e-11 1551 1551 6.0416666666666670e-10 1551 2019 1.0416666666666666e-11 1551 2174 -1.0416666666666665e-11 1551 1830 -1.0416666666666666e-11 1551 2114 6.2499999999999991e-11 1551 2110 -1.0416666666666666e-11 1551 1563 4.1666666666666665e-11 1551 2118 8.3333333333333330e-11 1551 1560 9.5018296033870872e-28 1551 1835 6.2499999999999991e-11 1551 1826 -1.0416666666666666e-11 1551 1559 4.1666666666666665e-11 1551 1840 8.3333333333333330e-11 1551 1556 -3.0991386737738975e-27 1551 2177 6.2499999999999991e-11 1551 1838 1.0416666666666666e-11 1551 1555 4.1666666666666665e-11 1551 2018 9.3750000000000012e-11 1551 2182 -9.3750000000000012e-11 1551 2017 -3.6295685768920020e-28 1551 1550 -3.0991386737738975e-27 1551 1549 5.6797985175912850e-27 1552 1552 1.8750000000000000e-10 1553 1553 2.0833333333333329e-10 1554 1554 1.8749999999999997e-10 1555 1555 2.2916666666666665e-10 1555 2182 -2.0833333333333332e-11 1555 2184 4.3283707583767993e-28 1555 2174 -4.1666666666666671e-11 1555 1549 -4.1666666666666665e-11 1555 2172 -4.1666666666666671e-11 1555 1840 2.0833333333333329e-11 1555 1551 4.1666666666666665e-11 1555 2177 2.0833333333333329e-11 1555 1837 2.0833333333333332e-11 1555 2178 2.0833333333333326e-11 1555 1838 4.1666666666666665e-11 1555 1556 -2.0833333333333326e-11 1556 1556 2.4999999999999996e-10 1556 1831 1.0416666666666665e-11 1556 1835 1.0416666666666666e-11 1556 1830 6.2499999999999991e-11 1556 1559 -2.0833333333333326e-11 1556 1840 -2.0833333333333339e-11 1556 1551 -2.6253290925755273e-27 1556 2177 1.0416666666666666e-11 1556 1837 -2.0833333333333332e-11 1556 2178 1.0416666666666665e-11 1556 1838 -6.2499999999999991e-11 1556 1555 -2.0833333333333326e-11 1557 1557 3.3333333333333332e-10 1558 1558 1.8749999999999997e-10 1559 1559 2.5000000000000002e-10 1559 1837 2.0833333333333329e-11 1559 1840 2.0833333333333332e-11 1559 1830 -4.1666666666666665e-11 1559 1556 -2.0833333333333326e-11 1559 1831 2.0833333333333326e-11 1559 1828 -4.1666666666666665e-11 1559 2118 2.0833333333333332e-11 1559 1551 4.1666666666666665e-11 1559 1835 2.0833333333333326e-11 1559 2116 2.0833333333333332e-11 1559 1836 2.0833333333333326e-11 1559 1826 -4.1666666666666665e-11 1559 1560 -2.0833333333333326e-11 1560 1560 2.4999999999999996e-10 1560 2111 1.0416666666666665e-11 1560 2114 1.0416666666666663e-11 1560 2110 6.2500000000000004e-11 1560 1563 -2.0833333333333326e-11 1560 2118 -2.0833333333333339e-11 1560 1551 1.6155871338926322e-27 1560 1835 1.0416666666666665e-11 1560 2116 -2.0833333333333339e-11 1560 1836 1.0416666666666663e-11 1560 1826 6.2500000000000004e-11 1560 1559 -2.0833333333333326e-11 1561 1561 3.3333333333333332e-10 1562 1562 1.2499999999999998e-10 1563 1563 2.2916666666666665e-10 1563 2018 2.0833333333333329e-11 1563 2024 2.8940292364521930e-29 1563 2019 4.1666666666666678e-11 1563 1550 -4.1666666666666665e-11 1563 2116 2.0833333333333332e-11 1563 2118 2.0833333333333332e-11 1563 2114 2.0833333333333326e-11 1563 2110 -4.1666666666666665e-11 1563 1551 4.1666666666666665e-11 1563 1560 -2.0833333333333326e-11 1563 2111 2.0833333333333326e-11 1563 2029 4.1666666666666671e-11 1564 1564 2.0833333333333334e-10 1564 2191 2.0833333333333332e-11 1564 2017 2.8940292364521930e-29 1564 2190 4.1666666666666678e-11 1564 1549 -4.1666666666666665e-11 1564 2022 3.1495832401145651e-28 1564 1550 -6.2499999999999991e-11 1564 2020 4.1666666666666671e-11 1564 2328 2.0833333333333329e-11 1564 2329 -4.1666666666666665e-11 1565 1565 2.7083333333333333e-10 1566 1566 4.9999999999999993e-10 1566 2019 3.1250000000000002e-11 1566 2025 4.1666666666666665e-11 1566 2015 1.2499999999999998e-10 1566 1571 -1.0416666666666665e-11 1566 2038 -1.6155871338926322e-27 1566 2072 -4.1666666666666671e-11 1566 2037 -2.0833333333333339e-11 1566 2036 -1.2499999999999998e-10 1566 2109 -3.1250000000000002e-11 1566 1567 6.2500000000000004e-11 1566 1570 -1.0416666666666674e-11 1566 2033 6.4623485355705287e-27 1566 2035 -6.2500000000000004e-11 1566 4470 1.0416666666666665e-11 1566 4481 1.0416666666666663e-11 1566 3817 -2.0833333333333326e-11 1567 1567 4.9999999999999993e-10 1567 2024 4.1666666666666665e-11 1567 2015 4.1666666666666665e-11 1567 2019 1.6666666666666666e-10 1567 1571 -6.2499999999999991e-11 1567 2029 4.1666666666666665e-11 1567 2123 -4.1666666666666665e-11 1567 2037 4.1666666666666678e-11 1567 2036 -4.1666666666666665e-11 1567 2109 -1.6666666666666669e-10 1567 1566 6.2500000000000004e-11 1567 1570 -6.2500000000000004e-11 1567 2108 2.0833333333333326e-11 1567 2107 -4.1666666666666665e-11 1568 1568 2.4999999999999996e-10 1569 1569 1.6666666666666666e-10 1570 1570 1.6666666666666663e-10 1570 2107 1.0416666666666665e-11 1570 2123 -1.0416666666666673e-11 1570 2038 1.0416666666666665e-11 1570 2072 -6.2499999999999991e-11 1570 2037 -1.0416666666666666e-11 1570 2036 -1.0416666666666655e-11 1570 2109 2.0833333333333339e-11 1570 1566 -1.0416666666666673e-11 1570 1567 -6.2499999999999991e-11 1571 1571 1.6666666666666663e-10 1571 2029 -1.0416666666666666e-11 1571 2037 -1.0416666666666666e-11 1571 2019 -2.0833333333333342e-11 1571 1567 -6.2499999999999991e-11 1571 2033 -1.0416666666666666e-11 1571 1566 -1.0416666666666663e-11 1571 2015 1.0416666666666665e-11 1571 2025 6.2499999999999991e-11 1571 2024 1.0416666666666660e-11 1572 1572 2.4999999999999996e-10 1573 1573 5.4166666666666666e-10 1573 2021 1.8812360437258079e-27 1573 2043 -9.3750000000000012e-11 1573 1578 5.2037209612904044e-27 1573 2074 -1.0416666666666666e-11 1573 2035 1.0416666666666666e-11 1573 2042 -6.2499999999999991e-11 1573 2016 1.0416666666666667e-10 1573 2034 9.3750000000000012e-11 1573 2015 -3.6295685768920020e-28 1573 1575 -3.0991386737738975e-27 1573 1577 1.4262605166395893e-27 1573 2041 -8.3333333333333330e-11 1573 2040 -6.2499999999999991e-11 1573 4475 -1.0416666666666666e-11 1573 4377 4.1666666666666665e-11 1573 4893 -1.0416666666666666e-11 1573 4378 -3.0991386737738975e-27 1573 4380 4.1666666666666665e-11 1574 1574 1.0416666666666666e-10 1575 1575 4.9999999999999993e-10 1575 2022 -6.2499999999999991e-11 1575 2026 6.2499999999999991e-11 1575 2078 5.2083333333333334e-11 1575 2043 -4.5860624244724788e-28 1575 2021 -6.2500000000000004e-11 1575 1578 1.0416666666666663e-11 1575 2016 -8.0779356694631609e-27 1575 2034 -2.0194839173657902e-27 1575 1573 -2.6253290925755273e-27 1575 2033 -5.2083333333333334e-11 1575 2015 -6.2499999999999991e-11 1575 1577 1.0416666666666671e-11 1575 2025 6.2499999999999991e-11 1575 2023 -2.2214323091023692e-27 1575 2024 -6.2500000000000004e-11 1576 1576 2.0833333333333329e-10 1577 1577 2.2916666666666665e-10 1577 2042 -1.0416666666666663e-11 1577 2035 -6.2500000000000004e-11 1577 2016 -2.0194839173657902e-27 1577 2034 -1.0416666666666676e-11 1577 2025 2.4233807008389483e-27 1577 1575 1.0416666666666671e-11 1577 2033 -1.6155871338926322e-27 1577 2015 1.0416666666666663e-11 1577 4481 1.0416666666666665e-11 1577 4377 -2.0833333333333326e-11 1578 1578 2.2916666666666665e-10 1578 2026 -2.0194839173657902e-27 1578 2016 2.0194839173657902e-27 1578 1575 1.0416666666666663e-11 1578 2021 1.0416666666666671e-11 1578 2043 1.0416666666666663e-11 1578 1573 8.0779356694631609e-27 1578 2040 -1.0416666666666665e-11 1578 2078 -9.6935228033557931e-27 1578 2074 6.2500000000000004e-11 1578 4891 1.0416666666666663e-11 1578 4380 -2.0833333333333326e-11 1579 1579 1.0416666666666666e-10 1580 1580 1.2499999999999998e-10 1580 1581 1.6155871338926322e-27 1580 2047 -1.6155871338926322e-27 1580 2057 -1.0097419586828951e-27 1580 1595 4.0389678347315804e-27 1580 2049 -1.0097419586828951e-27 1580 2045 1.0416666666666663e-11 1580 2044 -4.0389678347315804e-27 1580 1582 -1.0416666666666663e-11 1580 921 1.4136387421560532e-27 1580 931 1.4136387421560532e-27 1580 930 -1.0416666666666665e-11 1580 469 -1.0416666666666665e-11 1581 1581 4.1666666666666662e-10 1581 2044 6.2499999999999991e-11 1581 1580 2.1169082391605852e-27 1581 2053 6.2499999999999991e-11 1581 1588 2.1169082391605852e-27 1581 2243 -2.0833333333333329e-11 1581 2054 -2.0833333333333329e-11 1581 2051 1.0416666666666665e-11 1581 2245 -2.0833333333333329e-11 1581 2050 -6.2500000000000004e-11 1581 1587 5.2083333333333328e-11 1581 1596 3.7324953730532174e-27 1581 2049 1.0416666666666665e-11 1581 2045 2.0833333333333326e-11 1581 1582 5.2083333333333328e-11 1581 930 -2.0833333333333329e-11 1581 919 2.0833333333333329e-11 1581 922 1.0416666666666665e-11 1581 924 -2.0833333333333326e-11 1581 474 5.2083333333333328e-11 1581 921 1.0416666666666665e-11 1581 917 2.0833333333333329e-11 1581 916 6.2500000000000004e-11 1581 469 5.2083333333333328e-11 1581 468 3.7324953730532174e-27 1582 1582 4.9999999999999993e-10 1582 2047 2.0833333333333329e-11 1582 2050 -2.0833333333333329e-11 1582 2223 -2.0833333333333329e-11 1582 2057 -4.1666666666666658e-11 1582 2056 -1.0416666666666666e-10 1582 2285 -2.0833333333333332e-11 1582 1595 5.2083333333333328e-11 1582 1597 -1.0416666666666663e-11 1582 2055 -4.1666666666666665e-11 1582 2054 -1.0416666666666666e-10 1582 2222 -2.0833333333333332e-11 1582 1584 5.2083333333333328e-11 1582 1596 -1.0416666666666661e-11 1582 2049 4.1666666666666665e-11 1582 2045 1.0416666666666666e-10 1582 2044 2.0833333333333332e-11 1582 1581 5.2083333333333328e-11 1582 1580 -1.0416666666666661e-11 1583 1583 1.2499999999999998e-10 1583 2239 -1.2116903504194741e-27 1583 2224 1.0097419586828951e-27 1583 2226 1.0097419586828951e-27 1583 2217 1.0416666666666661e-11 1583 2216 -4.0389678347315804e-27 1583 1592 -1.0416666666666661e-11 1583 1591 4.0389678347315804e-27 1583 2219 -1.2116903504194741e-27 1583 2214 1.0416666666666661e-11 1583 2213 -4.0389678347315804e-27 1583 1585 -1.0416666666666661e-11 1583 1584 4.0389678347315804e-27 1584 1584 4.1666666666666662e-10 1584 2056 -2.0833333333333329e-11 1584 2245 -2.0833333333333329e-11 1584 2236 -2.0833333333333329e-11 1584 2217 2.0833333333333329e-11 1584 2224 1.0416666666666665e-11 1584 2229 -2.0833333333333326e-11 1584 2223 -6.2499999999999991e-11 1584 1592 5.2083333333333328e-11 1584 1597 2.1169082391605852e-27 1584 2055 -1.0416666666666665e-11 1584 2054 -2.0833333333333329e-11 1584 2222 -6.2499999999999991e-11 1584 1582 5.2083333333333328e-11 1584 1596 3.5628902784306998e-27 1584 2221 1.0416666666666665e-11 1584 2240 2.0833333333333326e-11 1584 2220 -6.2499999999999991e-11 1584 1587 5.2083333333333328e-11 1584 1586 2.1169082391605852e-27 1584 2219 1.0416666666666665e-11 1584 2214 2.0833333333333329e-11 1584 2213 6.2499999999999991e-11 1584 1585 5.2083333333333328e-11 1584 1583 3.5628902784306998e-27 1585 1585 4.9999999999999993e-10 1585 2263 2.0833333333333329e-11 1585 2216 2.0833333333333329e-11 1585 2220 -2.0833333333333329e-11 1585 2239 -4.1666666666666665e-11 1585 2238 -1.0416666666666666e-10 1585 2264 2.0833333333333332e-11 1585 1591 5.2083333333333328e-11 1585 1590 -1.0416666666666661e-11 1585 2237 -4.1666666666666658e-11 1585 2236 -1.0416666666666666e-10 1585 2241 2.0833333333333332e-11 1585 1589 5.2083333333333328e-11 1585 1586 -1.0416666666666663e-11 1585 2219 4.1666666666666665e-11 1585 2214 1.0416666666666666e-10 1585 2213 2.0833333333333332e-11 1585 1584 5.2083333333333328e-11 1585 1583 -1.0416666666666661e-11 1586 1586 1.2499999999999998e-10 1586 2244 -1.2116903504194741e-27 1586 2219 1.4136387421560532e-27 1586 2237 1.4136387421560532e-27 1586 2236 -1.0416666666666666e-11 1586 2241 -1.6155871338926322e-27 1586 1585 -1.0416666666666666e-11 1586 1589 4.0389678347315804e-27 1586 2221 -1.2116903504194741e-27 1586 2240 1.0416666666666666e-11 1586 2220 4.0389678347315804e-27 1586 1587 -1.0416666666666666e-11 1586 1584 1.6155871338926322e-27 1587 1587 4.9999999999999993e-10 1587 2053 2.0833333333333329e-11 1587 2222 -2.0833333333333329e-11 1587 2241 2.0833333333333329e-11 1587 2051 4.1666666666666665e-11 1587 2245 -1.0416666666666666e-10 1587 2050 -2.0833333333333332e-11 1587 1581 5.2083333333333328e-11 1587 1596 -1.0416666666666661e-11 1587 2244 -4.1666666666666658e-11 1587 2243 -1.0416666666666666e-10 1587 2260 2.0833333333333332e-11 1587 1589 5.2083333333333328e-11 1587 1588 -1.0416666666666663e-11 1587 2221 4.1666666666666658e-11 1587 2240 1.0416666666666666e-10 1587 2220 -2.0833333333333332e-11 1587 1584 5.2083333333333328e-11 1587 1586 -1.0416666666666663e-11 1588 1588 1.2499999999999998e-10 1588 1589 4.0389678347315804e-27 1588 2260 -1.6155871338926322e-27 1588 2053 -4.0389678347315804e-27 1588 1581 1.6155871338926322e-27 1588 2051 1.4136387421560532e-27 1588 2244 1.4136387421560532e-27 1588 2243 -1.0416666666666665e-11 1588 1587 -1.0416666666666665e-11 1588 926 -1.0097419586828951e-27 1588 922 -1.0097419586828951e-27 1588 924 -1.0416666666666663e-11 1588 474 -1.0416666666666663e-11 1589 1589 4.1666666666666662e-10 1589 2260 6.2499999999999991e-11 1589 1588 3.5628902784306998e-27 1589 2263 6.2499999999999991e-11 1589 1590 3.5628902784306998e-27 1589 2238 -2.0833333333333329e-11 1589 2240 2.0833333333333329e-11 1589 2237 -1.0416666666666661e-11 1589 2236 -2.0833333333333326e-11 1589 2241 6.2499999999999991e-11 1589 1585 5.2083333333333328e-11 1589 1586 3.5628902784306998e-27 1589 2244 -1.0416666666666661e-11 1589 2243 -2.0833333333333329e-11 1589 1587 5.2083333333333328e-11 1589 1050 -2.0833333333333329e-11 1589 924 -2.0833333333333329e-11 1589 926 -1.0416666666666661e-11 1589 925 -2.0833333333333326e-11 1589 1033 -6.2499999999999991e-11 1589 474 5.2083333333333328e-11 1589 475 3.5628902784306998e-27 1589 1032 1.0416666666666661e-11 1589 1052 -2.0833333333333329e-11 1589 471 5.2083333333333328e-11 1590 1590 1.2499999999999998e-10 1590 1591 1.6155871338926322e-27 1590 2263 -1.6155871338926322e-27 1590 2237 -1.0097419586828951e-27 1590 1589 4.0389678347315804e-27 1590 2239 1.0097419586828951e-27 1590 2238 -1.0416666666666663e-11 1590 2264 -4.0389678347315804e-27 1590 1585 -1.0416666666666663e-11 1590 1046 1.4136387421560532e-27 1590 1032 -1.4136387421560532e-27 1590 1052 -1.0416666666666665e-11 1590 471 -1.0416666666666665e-11 1591 1591 4.1666666666666657e-10 1591 2264 6.2499999999999991e-11 1591 1590 2.1169082391605852e-27 1591 2267 1.0416666666666665e-11 1591 1594 5.2083333333333328e-11 1591 2227 -2.0833333333333329e-11 1591 2214 2.0833333333333329e-11 1591 2279 2.0833333333333326e-11 1591 2266 -6.2499999999999991e-11 1591 1593 2.1169082391605852e-27 1591 2226 -1.0416666666666665e-11 1591 2217 2.0833333333333329e-11 1591 2216 6.2500000000000004e-11 1591 1592 5.2083333333333328e-11 1591 1583 3.7324953730532174e-27 1591 2239 -1.0416666666666665e-11 1591 2238 -2.0833333333333326e-11 1591 1585 5.2083333333333328e-11 1591 1052 -2.0833333333333329e-11 1591 1044 2.0833333333333329e-11 1591 1046 1.0416666666666665e-11 1591 1042 2.0833333333333329e-11 1591 1041 6.2500000000000004e-11 1591 471 5.2083333333333328e-11 1591 470 3.7324953730532174e-27 1592 1592 4.9999999999999993e-10 1592 2285 -2.0833333333333329e-11 1592 2266 -2.0833333333333329e-11 1592 2213 2.0833333333333329e-11 1592 2224 4.1666666666666658e-11 1592 2229 -1.0416666666666666e-10 1592 2223 -2.0833333333333332e-11 1592 1584 5.2083333333333328e-11 1592 1597 -1.0416666666666663e-11 1592 2228 -4.1666666666666658e-11 1592 2227 -1.0416666666666666e-10 1592 2280 2.0833333333333332e-11 1592 1595 5.2083333333333328e-11 1592 1593 -1.0416666666666663e-11 1592 2226 -4.1666666666666665e-11 1592 2217 1.0416666666666666e-10 1592 2216 2.0833333333333332e-11 1592 1591 5.2083333333333328e-11 1592 1583 -1.0416666666666661e-11 1593 1593 1.2499999999999998e-10 1593 1594 -1.0416666666666663e-11 1593 1595 4.0389678347315804e-27 1593 2279 1.0416666666666663e-11 1593 2280 -1.6155871338926322e-27 1593 2226 -1.4136387421560532e-27 1593 2228 1.4136387421560532e-27 1593 2227 -1.0416666666666665e-11 1593 1592 -1.0416666666666665e-11 1593 2267 -1.0097419586828951e-27 1593 2266 4.0389678347315804e-27 1593 1591 1.6155871338926322e-27 1593 1048 -1.0097419586828951e-27 1594 1594 4.9999999999999993e-10 1594 2279 1.0416666666666666e-10 1594 2280 2.0833333333333329e-11 1594 1593 -1.0416666666666661e-11 1594 2267 4.1666666666666665e-11 1594 1591 5.2083333333333328e-11 1594 1595 5.2083333333333328e-11 1594 2266 -2.0833333333333332e-11 1594 1065 2.0833333333333329e-11 1594 1041 2.0833333333333329e-11 1594 1049 -4.1666666666666665e-11 1594 1044 1.0416666666666666e-10 1594 1043 2.0833333333333332e-11 1594 473 5.2083333333333328e-11 1594 470 -1.0416666666666661e-11 1594 1048 -4.1666666666666658e-11 1594 1047 -1.0416666666666666e-10 1594 1064 2.0833333333333332e-11 1594 472 -1.0416666666666663e-11 1595 1595 4.1666666666666662e-10 1595 2279 2.0833333333333329e-11 1595 2280 6.2499999999999991e-11 1595 1593 3.5628902784306998e-27 1595 2047 6.2499999999999991e-11 1595 1580 3.5628902784306998e-27 1595 1594 5.2083333333333328e-11 1595 2045 2.0833333333333329e-11 1595 2229 -2.0833333333333329e-11 1595 2057 -1.0416666666666661e-11 1595 2056 -2.0833333333333326e-11 1595 2285 -6.2499999999999991e-11 1595 1582 5.2083333333333328e-11 1595 1597 3.5628902784306998e-27 1595 2228 -1.0416666666666661e-11 1595 2227 -2.0833333333333329e-11 1595 1592 5.2083333333333328e-11 1595 928 -2.0833333333333329e-11 1595 931 -1.0416666666666661e-11 1595 930 -2.0833333333333329e-11 1595 469 5.2083333333333328e-11 1595 1048 -1.0416666666666661e-11 1595 1047 -2.0833333333333326e-11 1595 1064 6.2499999999999991e-11 1595 472 3.5628902784306998e-27 1596 1596 1.2499999999999998e-10 1596 2049 1.2116903504194741e-27 1596 2221 1.0097419586828951e-27 1596 2051 -1.0097419586828951e-27 1596 2245 -1.0416666666666661e-11 1596 2050 4.0389678347315804e-27 1596 1587 -1.0416666666666661e-11 1596 1581 4.0389678347315804e-27 1596 2055 1.2116903504194741e-27 1596 2054 -1.0416666666666661e-11 1596 2222 4.0389678347315804e-27 1596 1582 -1.0416666666666661e-11 1596 1584 4.0389678347315804e-27 1597 1597 1.2499999999999998e-10 1597 2228 -1.2116903504194741e-27 1597 2055 -1.4136387421560532e-27 1597 2057 1.4136387421560532e-27 1597 2056 -1.0416666666666666e-11 1597 2285 1.6155871338926322e-27 1597 1582 -1.0416666666666666e-11 1597 1595 4.0389678347315804e-27 1597 2224 -1.2116903504194741e-27 1597 2229 -1.0416666666666666e-11 1597 2223 4.0389678347315804e-27 1597 1592 -1.0416666666666666e-11 1597 1584 1.6155871338926322e-27 1598 1598 1.6666666666666663e-10 1598 2069 -1.0416666666666666e-11 1598 2322 -1.0416666666666666e-11 1598 1773 -2.0833333333333342e-11 1598 1599 -6.2499999999999991e-11 1598 1769 1.0416666666666665e-11 1598 1775 6.2499999999999991e-11 1598 1774 1.0416666666666660e-11 1598 4862 1.0416666666666666e-11 1598 4254 -1.0416666666666663e-11 1598 4863 1.0416666666666665e-11 1598 4243 2.0833333333333339e-11 1598 4255 -1.0416666666666666e-11 1599 1599 4.9999999999999993e-10 1599 2005 4.1666666666666665e-11 1599 2006 4.1666666666666665e-11 1599 2004 1.6666666666666666e-10 1599 1601 -6.2499999999999991e-11 1599 2326 -4.1666666666666671e-11 1599 2068 2.0833333333333332e-11 1599 2070 -2.0833333333333326e-11 1599 1774 4.1666666666666665e-11 1599 2069 4.1666666666666665e-11 1599 1769 4.1666666666666665e-11 1599 2322 4.1666666666666671e-11 1599 1773 1.6666666666666666e-10 1599 1598 -6.2499999999999991e-11 1599 4255 2.0833333333333332e-11 1599 4254 6.2499999999999991e-11 1600 1600 2.4999999999999996e-10 1601 1601 1.6666666666666663e-10 1601 2323 1.0416666666666665e-11 1601 2009 6.2500000000000004e-11 1601 2005 1.0416666666666660e-11 1601 2322 -1.0416666666666666e-11 1601 2006 1.0416666666666665e-11 1601 2326 1.0416666666666666e-11 1601 2004 -2.0833333333333345e-11 1601 1599 -6.2500000000000004e-11 1601 4254 -1.0416666666666666e-11 1602 1602 6.0416666666666670e-10 1602 2069 1.0416666666666666e-11 1602 2036 3.6295685768920020e-28 1602 2062 -6.2499999999999991e-11 1602 1604 4.1666666666666665e-11 1602 2064 -9.3750000000000012e-11 1602 2128 1.0416666666666665e-11 1602 1603 1.0034310714411270e-27 1602 2039 9.3750000000000012e-11 1602 1607 -3.0991386737738975e-27 1602 2035 1.0416666666666666e-11 1602 2063 -8.3333333333333330e-11 1602 1606 -3.0991386737738975e-27 1602 2058 6.2499999999999991e-11 1602 2059 8.3333333333333330e-11 1602 2061 -6.2499999999999991e-11 1602 4846 -1.0416666666666666e-11 1602 4482 -1.0416666666666666e-11 1602 3823 4.1666666666666665e-11 1602 4477 -1.0416666666666666e-11 1602 3824 -3.0991386737738975e-27 1602 3826 4.1666666666666665e-11 1603 1603 3.7500000000000000e-10 1603 2123 6.2500000000000004e-11 1603 2038 5.2083333333333334e-11 1603 2072 -6.2499999999999991e-11 1603 2039 -2.0194839173657902e-27 1603 2036 6.2500000000000004e-11 1603 1607 1.0416666666666669e-11 1603 2062 -1.0416666666666666e-11 1603 1602 1.6155871338926322e-27 1603 2064 1.0416666666666669e-11 1603 2325 1.0416666666666665e-11 1603 2129 -1.0416666666666671e-11 1603 2128 -6.2499999999999991e-11 1603 1604 -2.0833333333333326e-11 1604 1604 2.5000000000000002e-10 1604 2326 -4.1666666666666665e-11 1604 2063 -2.0833333333333332e-11 1604 2068 2.0833333333333332e-11 1604 2070 -2.0833333333333326e-11 1604 2069 4.1666666666666665e-11 1604 1606 -2.0833333333333326e-11 1604 2062 -2.0833333333333329e-11 1604 1602 4.1666666666666665e-11 1604 2064 -2.0833333333333332e-11 1604 2325 2.0833333333333323e-11 1604 2129 2.0833333333333332e-11 1604 2128 4.1666666666666665e-11 1604 1603 -2.0833333333333326e-11 1605 1605 2.7083333333333328e-10 1606 1606 2.4999999999999996e-10 1606 2062 -1.0416666666666665e-11 1606 2070 -1.0416666666666663e-11 1606 2069 -6.2500000000000004e-11 1606 1604 -2.0833333333333326e-11 1606 2068 -2.0833333333333339e-11 1606 2063 2.0833333333333339e-11 1606 2058 1.0416666666666663e-11 1606 1602 -2.6253290925755273e-27 1606 4848 1.0416666666666665e-11 1606 4846 6.2500000000000004e-11 1606 3823 -2.0833333333333326e-11 1607 1607 2.2916666666666665e-10 1607 2072 -9.1882743488121268e-30 1607 2064 2.0194839173657902e-27 1607 2036 -1.0416666666666671e-11 1607 1603 1.0416666666666669e-11 1607 2039 -1.0416666666666671e-11 1607 1602 -2.6253290925755273e-27 1607 2061 -1.0416666666666665e-11 1607 2038 -3.2311742677852644e-27 1607 2035 -6.2500000000000004e-11 1607 4470 1.0416666666666663e-11 1607 3826 -2.0833333333333326e-11 1608 1608 1.2499999999999998e-10 1609 1609 1.0416666666666666e-10 1610 1610 2.5000000000000002e-10 1610 1816 2.0833333333333329e-11 1610 1818 2.0833333333333332e-11 1610 1763 -4.1666666666666665e-11 1610 1621 -2.0833333333333326e-11 1610 2094 2.0833333333333332e-11 1610 1620 4.1666666666666665e-11 1610 1768 2.0833333333333326e-11 1610 1786 2.0833333333333332e-11 1610 1787 2.0833333333333332e-11 1610 1764 2.0833333333333326e-11 1610 1758 -4.1666666666666665e-11 1610 1619 4.1666666666666665e-11 1610 1618 -2.0833333333333326e-11 1610 2093 2.0833333333333332e-11 1610 1762 2.0833333333333326e-11 1610 1761 -4.1666666666666665e-11 1610 1612 4.1666666666666665e-11 1610 1611 -2.0833333333333326e-11 1611 1611 2.4999999999999996e-10 1611 2094 -2.0833333333333339e-11 1611 1732 6.2500000000000004e-11 1611 1615 -2.0833333333333326e-11 1611 1620 1.6155871338926322e-27 1611 1768 1.0416666666666665e-11 1611 1734 1.0416666666666665e-11 1611 2093 -2.0833333333333339e-11 1611 1762 1.0416666666666663e-11 1611 1761 6.2500000000000004e-11 1611 1612 -2.6253290925755273e-27 1611 1610 -2.0833333333333326e-11 1611 1023 1.0416666666666663e-11 1612 1612 6.6666666666666664e-10 1612 1786 8.3333333333333330e-11 1612 1618 -3.0991386737738975e-27 1612 2096 8.3333333333333330e-11 1612 1614 -3.0991386737738975e-27 1612 2099 1.0416666666666666e-11 1612 1758 -1.0416666666666666e-11 1612 2097 -8.3333333333333330e-11 1612 1722 -1.0416666666666666e-11 1612 1616 -3.0991386737738975e-27 1612 1734 6.2499999999999991e-11 1612 1732 -1.0416666666666666e-11 1612 1615 4.1666666666666665e-11 1612 2095 -6.2499999999999991e-11 1612 2315 -1.0416666666666666e-11 1612 1613 4.1666666666666665e-11 1612 2093 8.3333333333333330e-11 1612 1762 6.2499999999999991e-11 1612 1761 -1.0416666666666666e-11 1612 1611 -3.0991386737738975e-27 1612 1610 4.1666666666666665e-11 1612 5004 -1.0416666666666666e-11 1612 1075 6.2499999999999991e-11 1612 816 1.0416666666666666e-11 1612 228 4.1666666666666665e-11 1613 1613 2.4999999999999996e-10 1613 1617 4.1666666666666665e-11 1613 2100 2.0833333333333326e-11 1613 1614 -2.0833333333333326e-11 1613 2315 -4.1666666666666665e-11 1613 2097 -2.0833333333333332e-11 1613 2098 2.0833333333333332e-11 1613 2099 4.1666666666666665e-11 1613 1616 -2.0833333333333326e-11 1613 2096 2.0833333333333332e-11 1613 2095 -2.0833333333333326e-11 1613 1612 4.1666666666666665e-11 1613 553 2.0833333333333329e-11 1613 556 2.0833333333333332e-11 1613 552 4.1666666666666665e-11 1613 230 -2.0833333333333326e-11 1613 817 2.0833333333333332e-11 1613 221 4.1666666666666665e-11 1613 815 2.0833333333333326e-11 1614 1614 2.4999999999999996e-10 1614 2096 -2.0833333333333339e-11 1614 1612 -2.6253290925755273e-27 1614 2315 6.2500000000000004e-11 1614 1613 -2.0833333333333326e-11 1614 2095 -1.0416666666666663e-11 1614 1075 1.0416666666666665e-11 1614 815 1.0416666666666665e-11 1614 817 -2.0833333333333339e-11 1614 820 -1.0416666666666663e-11 1614 816 -6.2500000000000004e-11 1614 221 1.6155871338926322e-27 1614 228 -2.0833333333333326e-11 1615 1615 2.4999999999999996e-10 1615 1723 2.0833333333333326e-11 1615 1726 -4.1666666666666665e-11 1615 1617 4.1666666666666665e-11 1615 2094 2.0833333333333332e-11 1615 1732 -4.1666666666666665e-11 1615 1620 4.1666666666666665e-11 1615 1611 -2.0833333333333326e-11 1615 2098 2.0833333333333329e-11 1615 2097 -2.0833333333333332e-11 1615 1722 -4.1666666666666665e-11 1615 1616 -2.0833333333333326e-11 1615 2093 2.0833333333333332e-11 1615 1612 4.1666666666666665e-11 1615 1734 2.0833333333333326e-11 1615 1025 2.0833333333333329e-11 1615 650 -2.0833333333333332e-11 1615 233 -2.0833333333333326e-11 1615 1023 2.0833333333333326e-11 1616 1616 2.4999999999999996e-10 1616 2095 -1.0416666666666666e-11 1616 2100 1.0416666666666665e-11 1616 2099 -6.2499999999999991e-11 1616 1613 -2.0833333333333326e-11 1616 2098 -2.0833333333333339e-11 1616 1617 1.6155871338926322e-27 1616 1723 1.0416666666666665e-11 1616 2097 2.0833333333333339e-11 1616 1734 1.0416666666666666e-11 1616 1722 6.2500000000000004e-11 1616 1612 -2.6253290925755273e-27 1616 1615 -2.0833333333333326e-11 1617 1617 1.0416667104166666e-02 1617 1723 6.2499999999999991e-11 1617 1726 -1.0416666666666666e-11 1617 1615 4.1666666666666665e-11 1617 2100 6.2499999999999991e-11 1617 1613 4.1666666666666665e-11 1617 2099 1.0416666666666666e-11 1617 2098 8.3333333333333330e-11 1617 1616 9.5018296033870872e-28 1617 1722 -1.0416666666666666e-11 1617 631 2.0833333333333329e-11 1617 652 1.0416666666666661e-11 1617 227 5.2083333333333328e-11 1617 1026 2.0833333333333329e-11 1617 650 -7.2916666666666673e-11 1617 233 3.5100365977808920e-27 1617 559 2.0833333333333329e-03 1617 553 3.1250000416666660e-03 1617 230 7.8879953661519409e-21 1617 552 1.0416666666666666e-11 1617 649 -1.0416666666666660e-03 1617 222 5.2083333333333330e-03 1617 628 2.0833333333333333e-03 1617 621 3.1250000312499997e-03 1617 229 4.0414059491689842e-19 1618 1618 2.4999999999999996e-10 1618 1787 -2.0833333333333339e-11 1618 1619 1.6155871338926322e-27 1618 1786 -2.0833333333333339e-11 1618 1612 -2.6253290925755273e-27 1618 1762 1.0416666666666666e-11 1618 1764 1.0416666666666665e-11 1618 1758 6.2499999999999991e-11 1618 1610 -2.0833333333333326e-11 1618 947 -1.0416666666666665e-11 1618 1075 1.0416666666666666e-11 1618 5004 6.2500000000000004e-11 1618 228 -2.0833333333333326e-11 1619 1619 1.0416667104166666e-02 1619 1787 8.3333333333333330e-11 1619 1618 9.5018296033870872e-28 1619 1816 7.2916666666666660e-11 1619 1621 1.0030366409885165e-27 1619 1763 -1.0416666666666666e-11 1619 1764 6.2499999999999991e-11 1619 1758 -1.0416666666666666e-11 1619 1610 4.1666666666666665e-11 1619 3474 -1.0416666666666666e-11 1619 947 -6.2499999999999991e-11 1619 5004 -1.0416666666666666e-11 1619 228 4.1666666666666665e-11 1619 974 2.0833333333333329e-11 1619 948 1.0416666666666661e-11 1619 701 2.0833333333333326e-11 1619 226 5.2083333333333328e-11 1619 944 -2.0833333333333329e-03 1619 946 -3.1250000312499993e-03 1619 232 7.8879979260055783e-21 1619 943 -1.0416666666666660e-03 1619 224 5.2083333333333330e-03 1619 940 2.0833333333333333e-03 1619 939 3.1250000416666668e-03 1619 231 4.0414059486404474e-19 1620 1620 5.4166666666666666e-10 1620 1818 7.2916666666666673e-11 1620 1621 2.0648434194159984e-27 1620 1726 -1.0416666666666666e-11 1620 2094 8.3333333333333330e-11 1620 1732 -1.0416666666666666e-11 1620 1611 9.5018296033870872e-28 1620 1615 4.1666666666666665e-11 1620 1763 -1.0416666666666666e-11 1620 1768 6.2499999999999991e-11 1620 1761 -1.0416666666666666e-11 1620 1610 4.1666666666666665e-11 1620 1039 -2.0833333333333329e-11 1620 701 2.0833333333333329e-11 1620 1030 1.0416666666666665e-11 1620 1026 2.0833333333333326e-11 1620 227 5.2083333333333328e-11 1620 1025 7.2916666666666660e-11 1620 233 -3.0470738540293107e-27 1620 1029 1.0416666666666665e-11 1620 1040 2.0833333333333329e-11 1620 1028 -6.2499999999999991e-11 1620 226 5.2083333333333328e-11 1620 225 3.5628902784306998e-27 1620 1023 6.2499999999999991e-11 1621 1621 1.8749999999999997e-10 1621 1620 1.6155871338926322e-27 1621 1816 -1.0416666666666666e-11 1621 1619 1.6155871338926322e-27 1621 1764 1.0416666666666665e-11 1621 1818 -1.0416666666666673e-11 1621 1768 1.0416666666666666e-11 1621 1763 6.2499999999999991e-11 1621 1610 -2.0833333333333326e-11 1621 1029 1.4136387421560532e-27 1621 948 -1.4136387421560532e-27 1621 701 1.0416666666666666e-11 1621 226 -1.0416666666666666e-11 1622 1622 2.5000000000000002e-10 1622 1824 -4.1666666666666665e-11 1622 2102 2.0833333333333329e-11 1622 1834 2.0833333333333326e-11 1622 1825 2.0833333333333326e-11 1622 1820 -4.1666666666666665e-11 1622 2101 2.0833333333333332e-11 1622 1823 2.0833333333333326e-11 1622 1822 -4.1666666666666665e-11 1622 1623 -2.0833333333333326e-11 1623 1623 2.4999999999999996e-10 1623 1834 1.0416666666666665e-11 1623 2086 1.0416666666666666e-11 1623 2102 -2.0833333333333339e-11 1623 2084 1.0416666666666665e-11 1623 2083 6.2499999999999991e-11 1623 1625 -2.0833333333333326e-11 1623 2101 -2.0833333333333339e-11 1623 1823 1.0416666666666666e-11 1623 1822 6.2500000000000004e-11 1623 1622 -2.0833333333333326e-11 1624 1624 3.3333333333333332e-10 1625 1625 2.5000000000000002e-10 1625 2011 4.1666666666666665e-11 1625 2082 2.0833333333333326e-11 1625 2081 -4.1666666666666665e-11 1625 2101 2.0833333333333332e-11 1625 2086 2.0833333333333326e-11 1625 2102 2.0833333333333332e-11 1625 2084 2.0833333333333326e-11 1625 2083 -4.1666666666666665e-11 1625 1623 -2.0833333333333326e-11 1626 1626 3.3333333333333332e-10 1627 1627 1.2499999999999998e-10 1628 1628 1.6666666666666666e-10 1629 1629 1.2499999999999998e-10 1630 1630 1.6666666666666666e-10 1631 1631 1.2499999999999998e-10 1632 1632 1.2499999999999998e-10 1633 1633 2.5000000000000002e-10 1633 1828 -4.1666666666666665e-11 1633 2116 2.0833333333333332e-11 1633 1836 2.0833333333333326e-11 1633 1829 2.0833333333333326e-11 1633 1824 -4.1666666666666665e-11 1633 2115 2.0833333333333332e-11 1633 1827 2.0833333333333326e-11 1633 1826 -4.1666666666666665e-11 1633 1634 -2.0833333333333326e-11 1634 1634 2.4999999999999996e-10 1634 1836 1.0416666666666665e-11 1634 2113 1.0416666666666665e-11 1634 2116 -2.0833333333333339e-11 1634 2111 1.0416666666666663e-11 1634 2110 6.2500000000000004e-11 1634 1636 -2.0833333333333326e-11 1634 2115 -2.0833333333333339e-11 1634 1827 1.0416666666666663e-11 1634 1826 6.2500000000000004e-11 1634 1633 -2.0833333333333326e-11 1635 1635 3.3333333333333332e-10 1636 1636 2.5000000000000002e-10 1636 2029 4.1666666666666665e-11 1636 2108 2.0833333333333326e-11 1636 2107 -4.1666666666666665e-11 1636 2115 2.0833333333333332e-11 1636 2113 2.0833333333333326e-11 1636 2116 2.0833333333333332e-11 1636 2111 2.0833333333333326e-11 1636 2110 -4.1666666666666665e-11 1636 1634 -2.0833333333333326e-11 1637 1637 3.3333333333333332e-10 1638 1638 1.2499999999999998e-10 1639 1639 1.6666666666666666e-10 1640 1640 1.2499999999999998e-10 1641 1641 1.6666666666666666e-10 1642 1642 1.2499999999999998e-10 1643 1643 1.2499999999999998e-10 1644 1644 2.9166666770833329e-02 1645 1645 2.5000000062499996e-02 1645 2165 1.0416666666666664e-03 1645 2154 4.1666666666666666e-03 1645 730 1.2116903504194741e-27 1645 2810 5.6545549686242126e-27 1645 733 1.2116903504194741e-27 1645 732 -1.0416666666666661e-11 1645 148 -1.0416666666666661e-11 1645 3388 1.2500000000000001e-02 1645 3369 -3.1249999999999997e-03 1645 2813 -1.0416666666666660e-03 1645 3387 -1.0416666666666673e-03 1645 3368 1.0416666666666664e-03 1645 3367 4.1666666666666675e-03 1645 2809 2.0833333333333337e-03 1646 1646 6.0416666666666653e-02 1646 2194 8.3333333333333315e-03 1646 2133 1.0416666666666664e-03 1646 2138 9.3750000000000014e-03 1646 2134 -5.0116116045879435e-20 1646 1647 4.6263880787845817e-19 1646 2193 6.2499999999999995e-03 1646 3381 8.3333333333333315e-03 1646 2822 1.5502688168223823e-19 1646 3383 -1.0416666666666667e-03 1646 1013 6.2500000000000003e-03 1646 4597 -1.0416666666666667e-03 1646 3957 1.5502688168223823e-19 1646 491 4.1666666666666666e-03 1646 3386 9.3749999999999997e-03 1646 2823 1.5502688168223823e-19 1646 3369 -1.0416666666666667e-03 1646 3376 6.2500000000000003e-03 1646 3373 -1.0416666666666667e-03 1646 2821 4.1666666666666666e-03 1646 4592 -1.0416666666666667e-03 1646 3956 4.1666666666666657e-03 1647 1647 3.7499999999999992e-02 1647 2193 1.0416666666666667e-03 1647 2138 -1.0416666666666667e-03 1647 2134 -6.2500000000000003e-03 1647 1646 6.5052130349130266e-19 1647 2137 6.2499999999999986e-03 1647 1793 6.2499999999999986e-03 1647 1648 1.4583333333333332e-02 1647 2132 -1.0416666666666673e-03 1647 2133 -6.2499999999999995e-03 1647 3392 5.2083333333333322e-03 1647 3386 -2.1684043449710089e-19 1647 2823 1.0416666666666669e-03 1647 4654 2.1684043449710089e-19 1647 4958 5.2083333333333322e-03 1647 3964 1.0416666666666667e-03 1647 4595 1.0416666666666664e-03 1647 3962 2.1684043449710089e-19 1647 3956 -2.0833333333333333e-03 1648 1648 7.9166666666666649e-02 1648 2134 -5.2083333333333330e-03 1648 2137 4.1666666666666675e-03 1648 1793 5.2083333333333330e-03 1648 1647 1.4583333333333332e-02 1648 3395 8.3333333333333315e-03 1648 2827 -8.8991399020904929e-20 1648 3672 -1.0416666666666667e-03 1648 3374 -1.0416666666666667e-03 1648 3394 -8.3333333333333315e-03 1648 3393 -6.2500000000000003e-03 1648 3669 1.0416666666666667e-03 1648 2825 -8.8991399020904929e-20 1648 2826 4.1666666666666666e-03 1648 3392 1.3541666666666664e-02 1648 3378 6.2500000000000003e-03 1648 3369 -1.0416666666666667e-03 1648 2823 -1.0416666666666667e-03 1648 2821 4.1666666666666666e-03 1648 4958 1.3541666666666664e-02 1648 3964 -1.0416666666666667e-03 1648 4946 -1.0416666666666667e-03 1648 4947 6.2500000000000003e-03 1648 4950 -1.0416666666666667e-03 1648 3963 4.1666666666666666e-03 1649 1649 1.2499999999999998e-10 1649 2232 -1.0097419586828951e-27 1649 2204 1.2116903504194741e-27 1649 2210 1.2116903504194741e-27 1649 2209 -1.0416666666666661e-11 1649 2215 -4.0389678347315804e-27 1649 1653 -1.0416666666666661e-11 1649 1652 4.0389678347315804e-27 1649 2203 -1.0097419586828951e-27 1649 2212 1.0416666666666661e-11 1649 2202 4.0389678347315804e-27 1649 1651 -1.0416666666666661e-11 1650 1650 2.0833333333333331e-10 1651 1651 4.9999999999999993e-10 1651 2215 2.0833333333333329e-11 1651 2233 -2.0833333333333329e-11 1651 2232 -4.1666666666666658e-11 1651 2231 -1.0416666666666666e-10 1651 2273 2.0833333333333332e-11 1651 1652 5.2083333333333328e-11 1651 1661 -1.0416666666666663e-11 1651 2230 -4.1666666666666658e-11 1651 1962 1.0416666666666666e-10 1651 2203 4.1666666666666665e-11 1651 2212 1.0416666666666666e-10 1651 2202 -2.0833333333333332e-11 1651 1649 -1.0416666666666661e-11 1652 1652 4.7916666666666661e-10 1652 2272 1.0416666666666666e-11 1652 1903 -3.6295685768920020e-28 1652 2274 -6.2499999999999991e-11 1652 1655 4.1666666666666665e-11 1652 2192 9.3750000000000012e-11 1652 2190 1.0416666666666665e-11 1652 1654 5.6797985175912850e-27 1652 2212 2.0833333333333329e-11 1652 1910 2.0833333333333329e-11 1652 1905 8.3333333333333343e-11 1652 1662 2.0648434194159984e-27 1652 2232 -1.0416666666666665e-11 1652 2231 -2.0833333333333326e-11 1652 2273 7.2916666666666660e-11 1652 1651 5.2083333333333328e-11 1652 1661 -3.0470738540293107e-27 1652 2210 -1.0416666666666665e-11 1652 2209 -2.0833333333333329e-11 1652 2215 6.2499999999999991e-11 1652 1653 5.2083333333333328e-11 1652 1649 3.5628902784306998e-27 1653 1653 4.9999999999999993e-10 1653 1905 2.0833333333333329e-11 1653 1910 1.0416666666666666e-10 1653 1907 2.0833333333333332e-11 1653 1662 -1.0416666666666663e-11 1653 2202 -2.0833333333333329e-11 1653 2211 -4.1666666666666658e-11 1653 2204 4.1666666666666665e-11 1653 2201 1.0416666666666666e-10 1653 2210 -4.1666666666666665e-11 1653 2209 -1.0416666666666666e-10 1653 2215 2.0833333333333332e-11 1653 1652 5.2083333333333328e-11 1653 1649 -1.0416666666666661e-11 1654 1654 3.7500000000000000e-10 1654 2184 6.2500000000000004e-11 1654 1907 5.2083333333333334e-11 1654 2189 6.2499999999999991e-11 1654 1905 -2.0194839173657902e-27 1654 1903 6.2500000000000004e-11 1654 1662 1.0416666666666666e-11 1654 2274 -1.0416666666666669e-11 1654 1652 6.4623485355705287e-27 1654 2192 -1.0416666666666669e-11 1654 2328 1.0416666666666663e-11 1654 2191 -1.0416666666666673e-11 1654 2190 -6.2500000000000004e-11 1654 1655 -2.0833333333333326e-11 1655 1655 2.5000000000000002e-10 1655 2329 -4.1666666666666665e-11 1655 2273 2.0833333333333329e-11 1655 2233 -2.0833333333333332e-11 1655 2234 -2.0833333333333326e-11 1655 2272 4.1666666666666665e-11 1655 1661 -2.0833333333333326e-11 1655 2274 -2.0833333333333329e-11 1655 1652 4.1666666666666665e-11 1655 2192 2.0833333333333332e-11 1655 2328 2.0833333333333323e-11 1655 2191 2.0833333333333332e-11 1655 2190 4.1666666666666665e-11 1655 1654 -2.0833333333333326e-11 1656 1656 2.7083333333333333e-10 1657 1657 6.2499999999999991e-11 1658 1658 3.9583333333333326e-10 1659 1659 6.2499999999999991e-11 1660 1660 2.7083333333333328e-10 1661 1661 1.8749999999999997e-10 1661 2274 -1.0416666666666666e-11 1661 2234 -1.0416666666666665e-11 1661 2272 -6.2499999999999991e-11 1661 1655 -2.0833333333333326e-11 1661 2230 -1.2116903504194741e-27 1661 2233 1.0416666666666668e-11 1661 2232 1.2116903504194741e-27 1661 2231 -1.0416666666666666e-11 1661 2273 -1.0416666666666669e-11 1661 1651 -1.0416666666666666e-11 1661 1652 -2.6253290925755273e-27 1662 1662 1.6666666666666666e-10 1662 2189 -3.9470850912434592e-28 1662 2192 -2.0194839173657902e-27 1662 1903 -1.0416666666666669e-11 1662 1654 1.0416666666666668e-11 1662 2210 -1.4136387421560532e-27 1662 1652 1.6155871338926322e-27 1662 1905 -6.4623485355705287e-27 1662 2211 1.4136387421560532e-27 1662 1910 1.0416666666666666e-11 1662 1907 1.0416666666666666e-11 1662 1653 -1.0416666666666666e-11 1663 1663 1.2499999999999998e-10 1664 1664 1.0416666666666666e-10 1665 1665 1.2499999999999998e-10 1665 2261 -1.6155871338926322e-27 1665 2252 -4.0389678347315804e-27 1665 2250 1.4136387421560532e-27 1665 2256 1.4136387421560532e-27 1665 2255 -1.0416666666666665e-11 1665 1667 -1.0416666666666665e-11 1665 766 1.0097419586828951e-27 1665 773 1.0097419586828951e-27 1665 772 -1.0416666666666663e-11 1665 398 -1.0416666666666663e-11 1666 1666 2.0833333333333331e-10 1667 1667 4.9999999999999993e-10 1667 2258 -1.0416666666666666e-10 1667 2252 2.0833333333333329e-11 1667 2257 -4.1666666666666658e-11 1667 2250 4.1666666666666665e-11 1667 2249 1.0416666666666666e-10 1667 2256 -4.1666666666666658e-11 1667 2255 -1.0416666666666666e-10 1667 2261 2.0833333333333332e-11 1667 1665 -1.0416666666666663e-11 1668 1668 6.2499999999999991e-11 1669 1669 2.0833333333333331e-10 1670 1670 1.0416666666666666e-10 1671 1671 6.2499999999999991e-11 1672 1672 1.2499999999999998e-10 1672 2284 1.0416666666666661e-11 1672 1674 -1.0416666666666661e-11 1672 1675 -1.0416666666666661e-11 1672 2283 1.0416666666666661e-11 1672 1817 4.0389678347315804e-27 1672 2281 -1.2116903504194741e-27 1672 2282 1.0097419586828951e-27 1672 1673 4.0389678347315804e-27 1672 2278 4.0389678347315804e-27 1672 700 -1.0097419586828951e-27 1672 699 1.2116903504194741e-27 1672 294 4.0389678347315804e-27 1673 1673 4.1666666666666662e-10 1673 2282 1.0416666666666665e-11 1673 1674 5.2083333333333328e-11 1673 1940 -6.2499999999999991e-11 1673 2279 1.0416666666666665e-11 1673 1677 5.2083333333333328e-11 1673 2280 -6.2499999999999991e-11 1673 2267 2.0833333333333326e-11 1673 2269 2.0833333333333329e-11 1673 2266 6.2499999999999991e-11 1673 1676 2.1169082391605852e-27 1673 2281 1.0416666666666665e-11 1673 2283 2.0833333333333329e-11 1673 1675 5.2083333333333328e-11 1673 2284 2.0833333333333329e-11 1673 2278 -6.2499999999999991e-11 1673 1672 3.5628902784306998e-27 1673 704 -2.0833333333333326e-11 1673 1016 2.0833333333333329e-11 1673 308 2.1169082391605852e-27 1673 1062 -1.0416666666666665e-11 1673 1061 -2.0833333333333329e-11 1673 303 5.2083333333333328e-11 1673 1048 -2.0833333333333329e-11 1673 307 3.5628902784306998e-27 1674 1674 5.0000000000000003e-10 1674 2282 4.1666666666666658e-11 1674 1940 -2.0833333333333332e-11 1674 1673 5.2083333333333328e-11 1674 1819 -2.0833333333333329e-11 1674 2284 1.0416666666666666e-10 1674 1817 -2.0833333333333332e-11 1674 1672 -1.0416666666666661e-11 1674 2278 -2.0833333333333329e-11 1674 1015 2.0833333333333329e-11 1674 706 -4.1666666666666658e-11 1674 708 2.0833333333333332e-11 1674 302 5.2083333333333328e-11 1674 704 -1.0416666666666666e-10 1674 308 -1.0416666666666663e-11 1674 705 -1.0416666666666666e-10 1674 295 -1.0416666666666663e-11 1674 700 4.1666666666666665e-11 1674 294 5.2083333333333328e-11 1675 1675 4.9999999999999993e-10 1675 1818 -2.0833333333333332e-11 1675 2269 1.0416666666666666e-10 1675 1676 -1.0416666666666663e-11 1675 2283 1.0416666666666666e-10 1675 1817 -2.0833333333333329e-11 1675 1672 -1.0416666666666661e-11 1675 2266 2.0833333333333329e-11 1675 2281 4.1666666666666665e-11 1675 2278 -2.0833333333333332e-11 1675 1673 5.2083333333333328e-11 1675 702 -1.0416666666666666e-10 1675 1028 2.0833333333333329e-11 1675 298 -1.0416666666666661e-11 1675 703 -4.1666666666666658e-11 1675 1041 -2.0833333333333332e-11 1675 297 5.2083333333333328e-11 1675 699 4.1666666666666665e-11 1675 294 5.2083333333333328e-11 1676 1676 1.2499999999999998e-10 1676 2269 1.0416666666666666e-11 1676 1675 -1.0416666666666666e-11 1676 1677 -1.0416666666666666e-11 1676 2267 1.0416666666666666e-11 1676 2279 -1.2116903504194741e-27 1676 2281 1.4136387421560532e-27 1676 1673 1.6155871338926322e-27 1676 2266 -4.0389678347315804e-27 1676 703 1.4136387421560532e-27 1676 1044 1.2116903504194741e-27 1676 297 4.0389678347315804e-27 1676 1041 1.6155871338926322e-27 1677 1677 4.9999999999999993e-10 1677 2279 4.1666666666666658e-11 1677 1673 5.2083333333333328e-11 1677 2280 -2.0833333333333329e-11 1677 2267 1.0416666666666666e-10 1677 1676 -1.0416666666666663e-11 1677 2266 2.0833333333333332e-11 1677 1065 -2.0833333333333329e-11 1677 1049 -1.0416666666666666e-10 1677 1043 -2.0833333333333332e-11 1677 312 -1.0416666666666663e-11 1677 1047 -4.1666666666666665e-11 1677 1048 -1.0416666666666666e-10 1677 1064 -2.0833333333333332e-11 1677 306 5.2083333333333328e-11 1677 307 -1.0416666666666661e-11 1677 1044 4.1666666666666658e-11 1677 297 5.2083333333333328e-11 1677 1041 -2.0833333333333329e-11 1678 1678 1.2499999999999998e-10 1678 2306 -1.0097419586828951e-27 1678 2294 1.2116903504194741e-27 1678 2299 1.2116903504194741e-27 1678 2298 -1.0416666666666661e-11 1678 2302 -4.0389678347315804e-27 1678 1682 -1.0416666666666661e-11 1678 2293 -1.0097419586828951e-27 1678 2301 1.0416666666666661e-11 1678 2292 4.0389678347315804e-27 1678 1680 -1.0416666666666661e-11 1679 1679 2.0833333333333331e-10 1680 1680 4.9999999999999993e-10 1680 2302 2.0833333333333329e-11 1680 2306 -4.1666666666666658e-11 1680 2305 -1.0416666666666666e-10 1680 2304 -4.1666666666666658e-11 1680 1855 1.0416666666666666e-10 1680 2293 4.1666666666666665e-11 1680 2301 1.0416666666666666e-10 1680 2292 -2.0833333333333332e-11 1680 1678 -1.0416666666666661e-11 1681 1681 2.0833333333333331e-10 1682 1682 4.9999999999999993e-10 1682 1700 1.0416666666666666e-10 1682 2292 -2.0833333333333329e-11 1682 2300 -4.1666666666666658e-11 1682 2294 4.1666666666666665e-11 1682 2290 1.0416666666666666e-10 1682 2299 -4.1666666666666665e-11 1682 2298 -1.0416666666666666e-10 1682 2302 2.0833333333333332e-11 1682 1678 -1.0416666666666661e-11 1683 1683 6.2499999999999991e-11 1684 1684 1.0416666666666666e-10 1685 1685 6.2499999999999991e-11 1686 1686 1.0416666666666666e-10 1687 1687 6.2499999999999991e-11 1688 1688 6.2499999999999991e-11 1689 1689 2.4999999999999996e-10 1689 2317 1.0416666666666666e-11 1689 2319 1.0416666666666665e-11 1689 2316 6.2499999999999991e-11 1689 1691 -2.0833333333333326e-11 1689 2321 -2.0833333333333332e-11 1689 2320 -2.0833333333333339e-11 1689 1984 1.0416666666666666e-11 1689 1979 6.2499999999999991e-11 1689 4356 1.6155871338926322e-27 1689 4706 1.0416666666666665e-11 1689 4364 -2.0833333333333326e-11 1690 1690 3.3333333333333332e-10 1691 1691 2.2916666666666665e-10 1691 2319 2.0833333333333326e-11 1691 2318 -4.1666666666666671e-11 1691 2320 2.0833333333333329e-11 1691 2321 2.0833333333333332e-11 1691 2316 -4.1666666666666665e-11 1691 1689 -2.0833333333333326e-11 1691 2317 2.0833333333333326e-11 1691 5059 2.0833333333333329e-11 1691 4356 4.1666666666666665e-11 1691 825 4.3283707583767993e-28 1691 813 -4.1666666666666671e-11 1691 4355 -4.1666666666666665e-11 1692 1692 1.8749999999999997e-10 1693 1693 2.0833333333333331e-10 1694 1694 2.9166666666666664e-10 1694 1717 -4.1666666666666665e-11 1694 1126 1.1213657767716683e-27 1694 1118 4.1666666666666665e-11 1694 1114 1.0416666666666665e-11 1694 1117 -1.1000665323307010e-27 1694 1712 4.1666666666666652e-11 1694 1078 1.0416666666666666e-10 1695 1695 2.0833333333333331e-10 1696 1696 2.9166666666666664e-10 1696 1133 -1.1000665323307010e-27 1696 1115 4.1666666666666665e-11 1696 1114 1.0416666666666665e-11 1696 1702 4.1666666666666665e-11 1696 1113 1.1213657767716683e-27 1696 1704 -4.1666666666666652e-11 1696 1091 1.0416666666666666e-10 1697 1697 2.0833333333333331e-10 1698 1698 2.9166666666666664e-10 1698 1710 -4.1666666666666665e-11 1698 1117 1.3233141685082473e-27 1698 1116 4.1666666666666665e-11 1698 1114 1.0416666666666665e-11 1698 1113 -1.1000665323307010e-27 1698 1701 4.1666666666666652e-11 1698 1102 1.0416666666666666e-10 1699 1699 2.0833333333333331e-10 1700 1700 2.9166666666666664e-10 1700 2299 -4.1666666666666665e-11 1700 1133 1.3233141685082473e-27 1700 1125 4.1666666666666665e-11 1700 1114 1.0416666666666665e-11 1700 1126 -1.1000665323307010e-27 1700 2300 -4.1666666666666652e-11 1700 1682 1.0416666666666666e-10 1701 1701 2.9166666666666659e-10 1701 1100 1.1000665323307010e-27 1701 1708 -4.1666666666666665e-11 1701 1119 2.0833333333333332e-11 1701 1703 -2.0833333333333336e-11 1701 1116 1.0416666666666666e-10 1701 1114 2.0833333333333329e-11 1701 1113 1.0416666666666661e-11 1701 1698 4.1666666666666652e-11 1701 1102 4.1666666666666658e-11 1702 1702 2.9166666666666664e-10 1702 1119 2.0833333333333329e-11 1702 1705 -4.1666666666666652e-11 1702 1703 -2.0833333333333326e-11 1702 1096 -1.3233141685082473e-27 1702 1091 4.1666666666666658e-11 1702 1696 4.1666666666666665e-11 1702 1115 1.0416666666666666e-10 1702 1114 2.0833333333333332e-11 1702 1113 1.0416666666666661e-11 1703 1703 4.1666666666666662e-10 1703 1096 -2.1169082391605852e-27 1703 1100 -2.1169082391605852e-27 1703 1115 -2.0833333333333329e-11 1703 1102 2.0833333333333326e-11 1703 1708 -2.0833333333333336e-11 1703 1116 -2.0833333333333329e-11 1703 1119 -6.2500000000000004e-11 1703 1701 -2.0833333333333336e-11 1703 1113 3.7324953730532174e-27 1703 1702 -2.0833333333333326e-11 1703 1705 -2.0833333333333326e-11 1703 1091 2.0833333333333329e-11 1703 332 -2.0833333333333329e-11 1703 396 2.0833333333333326e-11 1703 913 -2.0833333333333336e-11 1703 336 -2.0833333333333329e-11 1703 342 -6.2500000000000004e-11 1703 910 2.0833333333333336e-11 1703 343 3.7324953730532174e-27 1703 790 2.0833333333333326e-11 1703 789 -2.0833333333333326e-11 1703 433 2.0833333333333329e-11 1704 1704 2.9166666666666664e-10 1704 1114 -2.0833333333333329e-11 1704 1098 -1.1000665323307010e-27 1704 1707 4.1666666666666665e-11 1704 1115 -1.0416666666666666e-10 1704 1127 -2.0833333333333332e-11 1704 2302 2.0833333333333336e-11 1704 1133 -1.0416666666666661e-11 1704 1696 -4.1666666666666652e-11 1704 1091 -4.1666666666666665e-11 1705 1705 2.9166666666666664e-10 1705 1097 -2.0833333333333332e-11 1705 1706 4.1666666666666665e-11 1705 2044 -2.0833333333333336e-11 1705 1120 -1.5039633158038590e-27 1705 1115 -4.1666666666666658e-11 1705 1119 -1.0416666666666665e-11 1705 1113 1.1213657767716683e-27 1705 1702 -4.1666666666666652e-11 1705 1703 -2.0833333333333326e-11 1705 1091 -1.0416666666666666e-10 1705 1096 -1.0416666666666663e-11 1706 1706 2.9166666666666664e-10 1706 1127 -2.0833333333333329e-11 1706 1707 4.1666666666666652e-11 1706 2050 -2.0833333333333326e-11 1706 1098 1.1000665323307010e-27 1706 1091 -4.1666666666666665e-11 1706 1097 -1.0416666666666665e-11 1706 1096 -1.3233141685082473e-27 1706 1705 4.1666666666666665e-11 1706 1115 -1.0416666666666666e-10 1706 1119 -2.0833333333333332e-11 1706 2044 2.0833333333333339e-11 1706 1120 -1.0416666666666663e-11 1707 1707 2.9166666666666659e-10 1707 1704 4.1666666666666665e-11 1707 2302 -2.0833333333333336e-11 1707 1133 -1.1000665323307010e-27 1707 1115 -4.1666666666666658e-11 1707 1127 -1.0416666666666661e-11 1707 1120 1.5039633158038590e-27 1707 1706 4.1666666666666652e-11 1707 2050 2.0833333333333326e-11 1707 1091 -1.0416666666666666e-10 1707 1097 -2.0833333333333329e-11 1707 1098 -1.0416666666666661e-11 1708 1708 2.9166666666666659e-10 1708 1138 1.3020149240672800e-27 1708 1116 -4.1666666666666665e-11 1708 1119 -1.0416666666666665e-11 1708 1701 -4.1666666666666665e-11 1708 1703 -2.0833333333333336e-11 1708 1113 -1.1000665323307010e-27 1708 1709 4.1666666666666652e-11 1708 2046 -2.0833333333333326e-11 1708 1102 -1.0416666666666666e-10 1708 1101 -2.0833333333333329e-11 1708 1100 -1.0416666666666661e-11 1709 1709 2.9166666666666664e-10 1709 1106 -1.1213657767716683e-27 1709 1711 4.1666666666666665e-11 1709 1135 -2.0833333333333332e-11 1709 2156 2.0833333333333336e-11 1709 1116 -1.0416666666666666e-10 1709 1119 -2.0833333333333329e-11 1709 1138 -1.0416666666666663e-11 1709 1708 4.1666666666666652e-11 1709 2046 2.0833333333333332e-11 1709 1102 -4.1666666666666665e-11 1709 1101 -1.0416666666666665e-11 1709 1100 1.1000665323307010e-27 1710 1710 2.9166666666666664e-10 1710 1135 -2.0833333333333329e-11 1710 1711 4.1666666666666652e-11 1710 1714 -2.0833333333333326e-11 1710 1106 1.1213657767716683e-27 1710 1102 -4.1666666666666658e-11 1710 1698 -4.1666666666666665e-11 1710 1116 -1.0416666666666666e-10 1710 1114 -2.0833333333333332e-11 1710 1117 -1.0416666666666663e-11 1711 1711 2.9166666666666659e-10 1711 1101 -2.0833333333333332e-11 1711 1709 4.1666666666666665e-11 1711 2156 -2.0833333333333336e-11 1711 1138 -1.3020149240672800e-27 1711 1116 -4.1666666666666658e-11 1711 1135 -1.0416666666666661e-11 1711 1117 1.3233141685082473e-27 1711 1710 4.1666666666666652e-11 1711 1714 2.0833333333333326e-11 1711 1102 -1.0416666666666666e-10 1711 1106 -1.0416666666666661e-11 1712 1712 2.9166666666666659e-10 1712 1081 1.1000665323307010e-27 1712 1718 -4.1666666666666665e-11 1712 1135 2.0833333333333332e-11 1712 1714 2.0833333333333336e-11 1712 1118 1.0416666666666666e-10 1712 1114 2.0833333333333329e-11 1712 1117 1.0416666666666661e-11 1712 1694 4.1666666666666652e-11 1712 1078 4.1666666666666665e-11 1713 1713 3.3333333333333326e-02 1713 2150 -8.6736173798840355e-19 1713 1107 -6.2499999999999986e-03 1713 1106 2.1705219273391446e-19 1713 1714 4.1666666666666666e-03 1713 1081 -4.1666666666666666e-03 1713 1083 -6.2499999999999986e-03 1714 1714 2.5000000208333331e-02 1714 1116 2.0833333333333329e-11 1714 1078 -2.0833333333333329e-11 1714 1718 2.0833333333333336e-11 1714 1118 2.0833333333333326e-11 1714 1135 6.2499999999999991e-11 1714 1712 2.0833333333333336e-11 1714 1117 -2.1169082391605852e-27 1714 1710 -2.0833333333333326e-11 1714 1711 2.0833333333333326e-11 1714 1102 -2.0833333333333329e-11 1714 1107 -5.2083333333333330e-03 1714 1106 -1.0416666666666660e-03 1714 1713 4.1666666666666666e-03 1714 2153 8.3333333333333315e-03 1714 1081 -1.0416666666666662e-03 1714 1083 -1.0416666666666664e-03 1715 1715 2.4999999999999994e-02 1716 1716 2.9166666666666664e-10 1716 1719 4.1666666666666665e-11 1716 1132 -1.5039633158038590e-27 1716 1118 -4.1666666666666658e-11 1716 1123 -1.0416666666666665e-11 1716 1126 1.1213657767716683e-27 1716 1717 4.1666666666666652e-11 1716 1078 -1.0416666666666666e-10 1717 1717 2.9166666666666659e-10 1717 1694 -4.1666666666666665e-11 1717 1114 -2.0833333333333332e-11 1717 1118 -1.0416666666666666e-10 1717 1123 -2.0833333333333329e-11 1717 1126 -1.0416666666666661e-11 1717 1716 4.1666666666666652e-11 1717 1078 -4.1666666666666658e-11 1718 1718 2.9166666666666659e-10 1718 1712 -4.1666666666666665e-11 1718 1714 2.0833333333333336e-11 1718 1117 -1.1000665323307010e-27 1718 1118 -4.1666666666666658e-11 1718 1135 -1.0416666666666661e-11 1718 1132 1.5039633158038590e-27 1718 1719 4.1666666666666652e-11 1718 2155 -2.0833333333333326e-11 1718 1078 -1.0416666666666666e-10 1718 1081 -1.0416666666666661e-11 1719 1719 2.9166666666666664e-10 1719 1135 -2.0833333333333329e-11 1719 1716 4.1666666666666665e-11 1719 1118 -1.0416666666666666e-10 1719 1123 -2.0833333333333332e-11 1719 1132 -1.0416666666666663e-11 1719 1718 4.1666666666666652e-11 1719 2155 2.0833333333333326e-11 1719 1078 -4.1666666666666665e-11 1719 1081 1.1000665323307010e-27 1720 1720 6.6666666666666664e-10 1720 1727 1.6155871338926322e-27 1720 1422 -4.1666666666666665e-11 1720 1729 1.6155871338926322e-27 1720 1172 -4.1666666666666665e-11 1720 1731 1.6155871338926322e-27 1720 1189 -4.1666666666666665e-11 1720 1721 1.6155871338926322e-27 1720 1139 -4.1666666666666665e-11 1721 1721 2.4999999999999996e-10 1721 1142 1.0416666666666666e-11 1721 1755 -2.0833333333333339e-11 1721 1722 -2.2913451068275814e-27 1721 1202 1.0416666666666666e-11 1721 1189 2.0833333333333326e-11 1721 1720 9.5018296033870872e-28 1721 1139 2.0833333333333326e-11 1722 1722 6.6666666666666664e-10 1722 1191 -1.0416666666666666e-11 1722 1755 8.3333333333333330e-11 1722 1721 -1.8175355256292112e-27 1722 1202 6.2499999999999991e-11 1722 1189 -4.1666666666666665e-11 1722 2089 8.3333333333333330e-11 1722 1725 1.6155871338926322e-27 1722 1220 -1.0416666666666666e-11 1722 1617 -1.0416666666666666e-11 1722 1223 -1.0416666666666666e-11 1722 1224 6.2499999999999991e-11 1722 1221 -4.1666666666666665e-11 1722 2097 8.3333333333333330e-11 1722 1734 -1.8175355256292112e-27 1722 1612 -1.0416666666666666e-11 1722 1616 6.2499999999999991e-11 1722 1615 -4.1666666666666665e-11 1722 2098 -8.3333333333333330e-11 1722 1723 1.6155871338926322e-27 1722 1143 -1.0416666666666666e-11 1722 1142 6.2499999999999991e-11 1722 1139 -4.1666666666666665e-11 1723 1723 2.4999999999999996e-10 1723 1143 6.2500000000000004e-11 1723 1144 1.0416666666666663e-11 1723 1139 2.0833333333333326e-11 1723 1726 -2.2913451068275814e-27 1723 1617 6.2500000000000004e-11 1723 1615 2.0833333333333326e-11 1723 1616 1.0416666666666663e-11 1723 2098 2.0833333333333336e-11 1723 1722 9.5018296033870872e-28 1723 1142 1.0416666666666666e-11 1723 650 -2.0833333333333336e-11 1723 233 1.0416666666666666e-11 1724 1724 6.6666666666666664e-10 1724 1220 -1.0416666666666666e-11 1724 1153 -1.0416666666666666e-11 1724 1741 -8.3333333333333330e-11 1724 1733 -1.8175355256292112e-27 1724 1215 -1.0416666666666666e-11 1724 1219 6.2499999999999991e-11 1724 1221 -4.1666666666666665e-11 1724 1175 -1.0416666666666666e-11 1724 1739 -8.3333333333333330e-11 1724 1731 -1.8175355256292112e-27 1724 1173 6.2499999999999991e-11 1724 1172 -4.1666666666666665e-11 1724 1740 -8.3333333333333330e-11 1724 1730 -1.8175355256292112e-27 1724 1150 -1.0416666666666666e-11 1724 1149 6.2499999999999991e-11 1724 1148 -4.1666666666666665e-11 1724 1737 -8.3333333333333330e-11 1724 1725 -1.8175355256292112e-27 1724 1191 -1.0416666666666666e-11 1724 1190 6.2499999999999991e-11 1724 1189 -4.1666666666666665e-11 1725 1725 2.4999999999999996e-10 1725 1219 1.0416666666666663e-11 1725 1202 1.0416666666666663e-11 1725 2089 -2.0833333333333336e-11 1725 1722 9.5018296033870872e-28 1725 1220 6.2500000000000004e-11 1725 1224 1.0416666666666666e-11 1725 1221 2.0833333333333326e-11 1725 1737 2.0833333333333336e-11 1725 1724 -2.2913451068275814e-27 1725 1191 6.2500000000000004e-11 1725 1190 1.0416666666666666e-11 1725 1189 2.0833333333333326e-11 1726 1726 6.6666666666666654e-10 1726 1620 -1.0416666666666666e-11 1726 1143 -1.0416666666666666e-11 1726 1144 6.2499999999999991e-11 1726 1139 -4.1666666666666665e-11 1726 1723 -1.8175355256292112e-27 1726 1617 -1.0416666666666666e-11 1726 1615 -4.1666666666666665e-11 1726 1282 -1.0416666666666666e-11 1726 1285 6.2499999999999991e-11 1726 1283 -4.1666666666666665e-11 1726 1278 -1.0416666666666666e-11 1726 1915 -8.3333333333333330e-11 1726 1736 -1.8175355256292112e-27 1726 1421 -1.0416666666666666e-11 1726 1429 6.2499999999999991e-11 1726 1422 -4.1666666666666665e-11 1726 2196 -8.3333333333333330e-11 1726 1727 -1.8175355256292112e-27 1726 650 8.3333333333333330e-11 1726 233 6.2499999999999991e-11 1726 1025 -8.3333333333333330e-11 1726 1023 -1.8175355256292112e-27 1727 1727 2.4999999999999996e-10 1727 1720 9.5018296033870872e-28 1727 1429 1.0416666666666666e-11 1727 1422 2.0833333333333326e-11 1727 2196 2.0833333333333339e-11 1727 1726 -2.2913451068275814e-27 1727 1144 1.0416666666666666e-11 1727 1139 2.0833333333333326e-11 1728 1728 6.6666666666666664e-10 1728 1150 -1.0416666666666666e-11 1728 1750 8.3333333333333330e-11 1728 1730 1.6155871338926322e-27 1728 1175 -1.0416666666666666e-11 1728 1186 6.2499999999999991e-11 1728 1172 -4.1666666666666665e-11 1728 1277 -1.0416666666666666e-11 1728 1421 -1.0416666666666666e-11 1728 1912 8.3333333333333330e-11 1728 1736 1.6155871338926322e-27 1728 1278 -1.0416666666666666e-11 1728 1284 6.2499999999999991e-11 1728 1283 -4.1666666666666665e-11 1728 1815 8.3333333333333330e-11 1728 1735 -1.8175355256292112e-27 1728 1156 -1.0416666666666666e-11 1728 1171 6.2499999999999991e-11 1728 1148 -4.1666666666666665e-11 1728 2195 -8.3333333333333330e-11 1728 1729 -1.8175355256292112e-27 1728 1420 6.2499999999999991e-11 1728 1422 -4.1666666666666665e-11 1729 1729 2.4999999999999996e-10 1729 1186 1.0416666666666666e-11 1729 1720 9.5018296033870872e-28 1729 1172 2.0833333333333326e-11 1729 2195 2.0833333333333339e-11 1729 1728 -2.2913451068275814e-27 1729 1420 1.0416666666666666e-11 1729 1422 2.0833333333333326e-11 1730 1730 2.4999999999999996e-10 1730 1171 1.0416666666666663e-11 1730 1750 -2.0833333333333336e-11 1730 1728 9.5018296033870872e-28 1730 1186 1.0416666666666666e-11 1730 1175 6.2500000000000004e-11 1730 1173 1.0416666666666663e-11 1730 1172 2.0833333333333326e-11 1730 1740 2.0833333333333336e-11 1730 1724 -2.2913451068275814e-27 1730 1150 6.2500000000000004e-11 1730 1149 1.0416666666666666e-11 1730 1148 2.0833333333333326e-11 1731 1731 2.4999999999999996e-10 1731 1720 9.5018296033870872e-28 1731 1190 1.0416666666666666e-11 1731 1189 2.0833333333333326e-11 1731 1739 2.0833333333333339e-11 1731 1724 -2.2913451068275814e-27 1731 1173 1.0416666666666666e-11 1731 1172 2.0833333333333326e-11 1732 1732 6.6666666666666654e-10 1732 1282 -1.0416666666666666e-11 1732 1156 -1.0416666666666666e-11 1732 1160 6.2499999999999991e-11 1732 1148 -4.1666666666666665e-11 1732 1814 -8.3333333333333330e-11 1732 1735 1.6155871338926322e-27 1732 1277 -1.0416666666666666e-11 1732 1281 6.2499999999999991e-11 1732 1283 -4.1666666666666665e-11 1732 2094 -8.3333333333333330e-11 1732 1620 -1.0416666666666666e-11 1732 1611 6.2499999999999991e-11 1732 1615 -4.1666666666666665e-11 1732 1215 -1.0416666666666666e-11 1732 1612 -1.0416666666666666e-11 1732 2093 -8.3333333333333330e-11 1732 1734 1.6155871338926322e-27 1732 1223 -1.0416666666666666e-11 1732 1222 6.2499999999999991e-11 1732 1221 -4.1666666666666665e-11 1732 1778 8.3333333333333330e-11 1732 1733 1.6155871338926322e-27 1732 1153 -1.0416666666666666e-11 1732 1023 1.6155871338926322e-27 1733 1733 2.4999999999999996e-10 1733 1149 1.0416666666666666e-11 1733 1741 2.0833333333333339e-11 1733 1724 -2.2913451068275814e-27 1733 1219 1.0416666666666666e-11 1733 1215 6.2499999999999991e-11 1733 1222 1.0416666666666665e-11 1733 1221 2.0833333333333326e-11 1733 1778 -2.0833333333333336e-11 1733 1732 9.5018296033870872e-28 1733 1153 6.2500000000000004e-11 1733 1160 1.0416666666666665e-11 1733 1148 2.0833333333333326e-11 1734 1734 2.4999999999999996e-10 1734 1224 1.0416666666666666e-11 1734 2097 -2.0833333333333339e-11 1734 1722 -2.2913451068275814e-27 1734 1616 1.0416666666666666e-11 1734 1612 6.2499999999999991e-11 1734 1611 1.0416666666666665e-11 1734 1615 2.0833333333333326e-11 1734 2093 2.0833333333333332e-11 1734 1732 9.5018296033870872e-28 1734 1223 6.2499999999999991e-11 1734 1222 1.0416666666666665e-11 1734 1221 2.0833333333333326e-11 1735 1735 2.4999999999999996e-10 1735 1156 6.2499999999999991e-11 1735 1160 1.0416666666666665e-11 1735 1148 2.0833333333333326e-11 1735 1814 2.0833333333333332e-11 1735 1732 9.5018296033870872e-28 1735 1277 6.2499999999999991e-11 1735 1281 1.0416666666666665e-11 1735 1283 2.0833333333333326e-11 1735 1284 1.0416666666666666e-11 1735 1815 -2.0833333333333339e-11 1735 1728 -2.2913451068275814e-27 1735 1171 1.0416666666666666e-11 1736 1736 2.4999999999999996e-10 1736 1285 1.0416666666666663e-11 1736 1915 2.0833333333333336e-11 1736 1726 -2.2913451068275814e-27 1736 1429 1.0416666666666666e-11 1736 1421 6.2500000000000004e-11 1736 1420 1.0416666666666663e-11 1736 1422 2.0833333333333326e-11 1736 1912 -2.0833333333333336e-11 1736 1728 9.5018296033870872e-28 1736 1278 6.2500000000000004e-11 1736 1284 1.0416666666666666e-11 1736 1283 2.0833333333333326e-11 1737 1737 4.1666666666666662e-10 1737 1221 2.0833333333333329e-11 1737 1192 2.0833333333333329e-11 1737 2085 2.0833333333333339e-11 1737 1738 8.3333333333333330e-11 1737 1220 8.3333333333333330e-11 1737 1219 -2.0833333333333332e-11 1737 1214 2.0833333333333332e-11 1737 1725 2.0833333333333339e-11 1737 1724 -8.3333333333333330e-11 1737 1191 8.3333333333333330e-11 1737 1190 -2.0833333333333332e-11 1737 1189 2.0833333333333332e-11 1738 1738 6.6666666666666664e-10 1738 1150 1.0416666666666666e-11 1738 1740 8.3333333333333330e-11 1738 1747 -1.8175355256292112e-27 1738 1175 1.0416666666666666e-11 1738 1173 -6.2499999999999991e-11 1738 1181 4.1666666666666665e-11 1738 1215 1.0416666666666666e-11 1738 1191 1.0416666666666666e-11 1738 1737 8.3333333333333330e-11 1738 2085 1.8175355256292112e-27 1738 1220 1.0416666666666666e-11 1738 1219 -6.2499999999999991e-11 1738 1214 4.1666666666666665e-11 1738 1741 8.3333333333333330e-11 1738 1776 -1.8175355256292112e-27 1738 1153 1.0416666666666666e-11 1738 1149 -6.2499999999999991e-11 1738 1159 4.1666666666666665e-11 1738 1739 8.3333333333333330e-11 1738 1742 -1.8175355256292112e-27 1738 1190 -6.2499999999999991e-11 1738 1192 4.1666666666666665e-11 1739 1739 4.1666666666666662e-10 1739 1181 2.0833333333333329e-11 1739 1189 2.0833333333333329e-11 1739 1731 2.0833333333333339e-11 1739 1724 -8.3333333333333330e-11 1739 1173 -2.0833333333333339e-11 1739 1172 2.0833333333333332e-11 1739 1742 -2.0833333333333339e-11 1739 1738 8.3333333333333330e-11 1739 1190 -2.0833333333333339e-11 1739 1192 2.0833333333333332e-11 1740 1740 4.1666666666666662e-10 1740 1159 2.0833333333333329e-11 1740 1747 -2.0833333333333339e-11 1740 1738 8.3333333333333330e-11 1740 1181 2.0833333333333332e-11 1740 1175 8.3333333333333330e-11 1740 1173 -2.0833333333333332e-11 1740 1172 2.0833333333333329e-11 1740 1730 2.0833333333333339e-11 1740 1724 -8.3333333333333330e-11 1740 1150 8.3333333333333330e-11 1740 1149 -2.0833333333333332e-11 1740 1148 2.0833333333333332e-11 1741 1741 4.1666666666666662e-10 1741 1148 2.0833333333333329e-11 1741 1733 2.0833333333333339e-11 1741 1724 -8.3333333333333330e-11 1741 1221 2.0833333333333332e-11 1741 1215 8.3333333333333330e-11 1741 1219 -2.0833333333333339e-11 1741 1214 2.0833333333333329e-11 1741 1776 -2.0833333333333339e-11 1741 1738 8.3333333333333330e-11 1741 1153 8.3333333333333330e-11 1741 1149 -2.0833333333333339e-11 1741 1159 2.0833333333333332e-11 1742 1742 2.4999999999999996e-10 1742 1173 -1.0416666666666666e-11 1742 2081 -9.5018296033870872e-28 1742 1181 -2.0833333333333326e-11 1742 1739 -2.0833333333333339e-11 1742 1738 -2.2913451068275814e-27 1742 1190 -1.0416666666666666e-11 1742 1192 -2.0833333333333326e-11 1743 1743 2.0833333333333331e-10 1744 1744 2.0833333333333331e-10 1745 1745 2.4999999999999996e-10 1745 1161 -1.0416666666666663e-11 1745 1748 2.0833333333333336e-11 1745 1822 -9.5018296033870872e-28 1745 1182 -1.0416666666666666e-11 1745 1175 -6.2500000000000004e-11 1745 1178 -1.0416666666666663e-11 1745 1177 -2.0833333333333326e-11 1745 1746 2.0833333333333336e-11 1745 1830 2.2913451068275814e-27 1745 1150 -6.2500000000000004e-11 1745 1158 -1.0416666666666666e-11 1745 1157 -2.0833333333333326e-11 1746 1746 4.1666666666666662e-10 1746 1167 -2.0833333333333329e-11 1746 1749 2.0833333333333339e-11 1746 1838 -8.3333333333333330e-11 1746 1185 -2.0833333333333332e-11 1746 1175 -8.3333333333333330e-11 1746 1178 2.0833333333333332e-11 1746 1177 -2.0833333333333329e-11 1746 1745 2.0833333333333339e-11 1746 1830 8.3333333333333330e-11 1746 1150 -8.3333333333333330e-11 1746 1158 2.0833333333333332e-11 1746 1157 -2.0833333333333332e-11 1747 1747 2.4999999999999996e-10 1747 1149 -1.0416666666666663e-11 1747 1740 -2.0833333333333336e-11 1747 1738 -2.2913451068275814e-27 1747 1173 -1.0416666666666666e-11 1747 1175 -6.2500000000000004e-11 1747 1182 -1.0416666666666663e-11 1747 1181 -2.0833333333333326e-11 1747 1748 2.0833333333333336e-11 1747 2083 -9.5018296033870872e-28 1747 1150 -6.2500000000000004e-11 1747 1161 -1.0416666666666666e-11 1747 1159 -2.0833333333333326e-11 1748 1748 4.1666666666666662e-10 1748 1157 -2.0833333333333329e-11 1748 1745 2.0833333333333339e-11 1748 1822 8.3333333333333330e-11 1748 1177 -2.0833333333333332e-11 1748 1175 -8.3333333333333330e-11 1748 1182 2.0833333333333336e-11 1748 1181 -2.0833333333333329e-11 1748 1747 2.0833333333333339e-11 1748 2083 8.3333333333333330e-11 1748 1150 -8.3333333333333330e-11 1748 1161 2.0833333333333336e-11 1748 1159 -2.0833333333333332e-11 1749 1749 2.4999999999999996e-10 1749 1158 -1.0416666666666663e-11 1749 1746 2.0833333333333336e-11 1749 1838 -2.2913451068275814e-27 1749 1178 -1.0416666666666666e-11 1749 1175 -6.2500000000000004e-11 1749 1186 -1.0416666666666663e-11 1749 1185 -2.0833333333333326e-11 1749 1750 2.0833333333333336e-11 1749 2175 -9.5018296033870872e-28 1749 1150 -6.2500000000000004e-11 1749 1171 -1.0416666666666666e-11 1749 1167 -2.0833333333333326e-11 1750 1750 4.1666666666666662e-10 1750 1148 -2.0833333333333329e-11 1750 1730 -2.0833333333333339e-11 1750 1728 8.3333333333333330e-11 1750 1172 -2.0833333333333332e-11 1750 1175 -8.3333333333333330e-11 1750 1186 2.0833333333333336e-11 1750 1185 -2.0833333333333329e-11 1750 1749 2.0833333333333339e-11 1750 2175 8.3333333333333330e-11 1750 1150 -8.3333333333333330e-11 1750 1171 2.0833333333333336e-11 1750 1167 -2.0833333333333332e-11 1751 1751 2.0833333333333331e-10 1752 1752 2.0833333333333331e-10 1753 1753 2.0833333333333331e-10 1754 1754 2.4999999999999996e-10 1754 2318 -9.5018296033870872e-28 1754 1202 -1.0416666666666666e-11 1754 1196 -2.0833333333333326e-11 1754 1755 2.0833333333333339e-11 1754 2099 -2.2913451068275814e-27 1754 1142 -1.0416666666666666e-11 1754 1146 -2.0833333333333326e-11 1755 1755 4.1666666666666662e-10 1755 1196 -2.0833333333333332e-11 1755 1139 -2.0833333333333332e-11 1755 1721 -2.0833333333333339e-11 1755 1722 8.3333333333333330e-11 1755 1202 2.0833333333333339e-11 1755 1189 -2.0833333333333332e-11 1755 1754 2.0833333333333339e-11 1755 2099 -8.3333333333333330e-11 1755 1142 2.0833333333333339e-11 1755 1146 -2.0833333333333332e-11 1756 1756 2.0833333333333331e-10 1757 1757 9.1666666666666650e-10 1757 1760 1.2499999999999998e-10 1757 1206 -1.6666666666666666e-10 1757 1154 -1.0416666666666666e-11 1757 1215 -1.0416666666666666e-11 1757 1771 -8.3333333333333330e-11 1757 1766 -1.8175355256292112e-27 1757 1153 -1.0416666666666666e-11 1757 1152 6.2499999999999991e-11 1757 1151 -4.1666666666666665e-11 1757 1770 -8.3333333333333330e-11 1757 1765 -1.8175355256292112e-27 1757 1235 -1.0416666666666666e-11 1757 1229 -4.1666666666666658e-11 1757 1758 1.2499999999999998e-10 1757 1210 -4.1666666666666678e-11 1757 3781 -3.1250000000000002e-11 1757 3784 5.2083333333333334e-11 1757 4460 -4.1666666666666665e-11 1757 3776 -3.1250000000000002e-11 1757 3782 2.0833333333333339e-11 1757 3783 1.0416666666666667e-10 1757 5011 -4.1666666666666665e-11 1757 4319 5.2083333333333334e-11 1757 4320 1.0416666666666667e-10 1758 1758 5.8333333333333339e-10 1758 1612 -1.0416666666666666e-11 1758 1208 -1.0416666666666666e-11 1758 1787 -8.3333333333333330e-11 1758 1764 1.6155871338926322e-27 1758 1619 -1.0416666666666666e-11 1758 1618 6.2499999999999991e-11 1758 1610 -4.1666666666666665e-11 1758 1786 -8.3333333333333330e-11 1758 1762 -1.8175355256292112e-27 1758 1223 -1.0416666666666666e-11 1758 1206 -4.1666666666666665e-11 1758 1757 1.2499999999999998e-10 1758 1210 -4.1666666666666678e-11 1758 3781 4.1666666666666665e-11 1758 3782 1.0416666666666666e-11 1758 5011 -2.0833333333333332e-11 1758 4319 1.0416666666666667e-10 1758 4320 5.2083333333333334e-11 1759 1759 9.1666666666666650e-10 1759 1274 5.2083333333333334e-11 1759 1804 -4.1666666666666665e-11 1759 1763 1.2499999999999998e-10 1759 1207 -3.1250000000000002e-11 1759 1209 2.0833333333333342e-11 1759 1206 -1.6666666666666666e-10 1759 1156 -1.0416666666666666e-11 1759 1235 -1.0416666666666666e-11 1759 1782 8.3333333333333330e-11 1759 1765 1.6155871338926322e-27 1759 1154 -1.0416666666666666e-11 1759 1155 6.2499999999999991e-11 1759 1151 -4.1666666666666665e-11 1759 1806 -8.3333333333333330e-11 1759 1767 -1.8175355256292112e-27 1759 1277 -1.0416666666666666e-11 1759 1273 1.0416666666666667e-10 1759 1276 -4.1666666666666665e-11 1759 1785 4.1666666666666665e-11 1759 1760 1.2499999999999998e-10 1759 1230 1.0416666666666666e-10 1759 1229 -4.1666666666666671e-11 1759 3776 -3.1249999999999995e-11 1759 3784 5.2083333333333334e-11 1760 1760 4.9999999999999993e-10 1760 1209 1.0416666666666666e-11 1760 1757 1.2500000000000001e-10 1760 1206 -4.1666666666666665e-11 1760 1785 2.0833333333333332e-11 1760 1759 1.2500000000000001e-10 1760 1230 5.2083333333333334e-11 1760 1229 -4.1666666666666665e-11 1760 3783 5.2083333333333334e-11 1760 4460 -2.0833333333333332e-11 1760 3776 2.0833333333333339e-11 1760 3782 1.0416666666666668e-11 1760 3784 1.4583333333333335e-10 1761 1761 6.6666666666666664e-10 1761 1277 -1.0416666666666666e-11 1761 1620 -1.0416666666666666e-11 1761 2094 -8.3333333333333330e-11 1761 1768 1.6155871338926322e-27 1761 1282 -1.0416666666666666e-11 1761 1281 6.2499999999999991e-11 1761 1276 -4.1666666666666665e-11 1761 1814 -8.3333333333333330e-11 1761 1767 1.6155871338926322e-27 1761 1156 -1.0416666666666666e-11 1761 1223 -1.0416666666666666e-11 1761 1153 -1.0416666666666666e-11 1761 1160 6.2499999999999991e-11 1761 1151 -4.1666666666666665e-11 1761 1778 8.3333333333333330e-11 1761 1766 1.6155871338926322e-27 1761 1215 -1.0416666666666666e-11 1761 1222 6.2499999999999991e-11 1761 1210 -4.1666666666666665e-11 1761 2093 -8.3333333333333330e-11 1761 1762 1.6155871338926322e-27 1761 1612 -1.0416666666666666e-11 1761 1611 6.2499999999999991e-11 1761 1610 -4.1666666666666665e-11 1762 1762 2.4999999999999996e-10 1762 1222 1.0416666666666665e-11 1762 1618 1.0416666666666666e-11 1762 1786 2.0833333333333339e-11 1762 1758 -2.2913451068275814e-27 1762 1223 6.2499999999999991e-11 1762 1210 2.0833333333333326e-11 1762 2093 2.0833333333333332e-11 1762 1761 9.5018296033870872e-28 1762 1612 6.2499999999999991e-11 1762 1611 1.0416666666666665e-11 1762 1610 2.0833333333333326e-11 1762 4319 1.0416666666666666e-11 1763 1763 5.8333333333333339e-10 1763 1619 -1.0416666666666666e-11 1763 1282 -1.0416666666666666e-11 1763 1818 -8.3333333333333330e-11 1763 1768 -1.8175355256292112e-27 1763 1620 -1.0416666666666666e-11 1763 1621 6.2499999999999991e-11 1763 1610 -4.1666666666666665e-11 1763 1274 1.0416666666666666e-10 1763 1273 5.2083333333333334e-11 1763 1276 -4.1666666666666665e-11 1763 1804 -2.0833333333333332e-11 1763 1759 1.2499999999999998e-10 1763 1209 1.0416666666666668e-11 1763 1816 -8.3333333333333330e-11 1763 1764 -1.8175355256292112e-27 1763 1208 -1.0416666666666666e-11 1763 1207 4.1666666666666671e-11 1763 1206 -4.1666666666666678e-11 1764 1764 2.4999999999999996e-10 1764 1621 1.0416666666666663e-11 1764 1787 2.0833333333333336e-11 1764 1758 9.5018296033870872e-28 1764 1619 6.2500000000000004e-11 1764 1618 1.0416666666666666e-11 1764 1610 2.0833333333333326e-11 1764 1816 2.0833333333333336e-11 1764 1763 -2.2913451068275814e-27 1764 1208 6.2500000000000004e-11 1764 1207 1.0416666666666666e-11 1764 1206 2.0833333333333326e-11 1764 3781 1.0416666666666663e-11 1765 1765 2.4999999999999996e-10 1765 1230 1.0416666666666663e-11 1765 1782 -2.0833333333333336e-11 1765 1759 9.5018296033870872e-28 1765 1155 1.0416666666666666e-11 1765 1154 6.2500000000000004e-11 1765 1152 1.0416666666666663e-11 1765 1151 2.0833333333333326e-11 1765 1770 2.0833333333333336e-11 1765 1757 -2.2913451068275814e-27 1765 1235 6.2500000000000004e-11 1765 1229 2.0833333333333326e-11 1765 3783 1.0416666666666666e-11 1766 1766 2.4999999999999996e-10 1766 1160 1.0416666666666665e-11 1766 1778 -2.0833333333333336e-11 1766 1761 9.5018296033870872e-28 1766 1222 1.0416666666666665e-11 1766 1215 6.2500000000000004e-11 1766 1210 2.0833333333333326e-11 1766 1771 2.0833333333333339e-11 1766 1757 -2.2913451068275814e-27 1766 1153 6.2499999999999991e-11 1766 1152 1.0416666666666666e-11 1766 1151 2.0833333333333326e-11 1766 4320 1.0416666666666666e-11 1767 1767 2.4999999999999996e-10 1767 1281 1.0416666666666665e-11 1767 1814 2.0833333333333332e-11 1767 1761 9.5018296033870872e-28 1767 1160 1.0416666666666665e-11 1767 1156 6.2499999999999991e-11 1767 1155 1.0416666666666666e-11 1767 1151 2.0833333333333326e-11 1767 1806 2.0833333333333339e-11 1767 1759 -2.2913451068275814e-27 1767 1277 6.2499999999999991e-11 1767 1273 1.0416666666666666e-11 1767 1276 2.0833333333333326e-11 1768 1768 2.4999999999999996e-10 1768 1274 1.0416666666666666e-11 1768 1818 2.0833333333333339e-11 1768 1763 -2.2913451068275814e-27 1768 1621 1.0416666666666666e-11 1768 1620 6.2499999999999991e-11 1768 1611 1.0416666666666665e-11 1768 1610 2.0833333333333326e-11 1768 2094 2.0833333333333336e-11 1768 1761 9.5018296033870872e-28 1768 1282 6.2500000000000004e-11 1768 1281 1.0416666666666665e-11 1768 1276 2.0833333333333326e-11 1769 1769 4.1666666666666662e-10 1769 1216 3.0430870179097285e-28 1769 2322 2.0833333333333332e-11 1769 1773 4.1666666666666665e-11 1769 1599 4.1666666666666665e-11 1769 1598 1.0416666666666666e-11 1769 1775 6.4623485355705287e-27 1769 3805 -4.5860624244724788e-28 1769 4243 3.1250000000000002e-11 1769 4254 1.2499999999999998e-10 1769 3809 -5.2083333333333334e-11 1769 3816 -6.2500000000000004e-11 1769 4862 -8.3333333333333343e-11 1769 3814 1.0416666666666663e-11 1769 5008 2.0194839173657902e-27 1769 5010 3.2311742677852644e-27 1769 4315 -2.2470898404921788e-28 1769 4317 1.0416666666666666e-11 1769 4320 -1.0416666666666668e-11 1770 1770 4.1666666666666657e-10 1770 1244 1.8812360437258079e-27 1770 1783 -1.0416666666666667e-10 1770 1772 6.0115145282367205e-27 1770 1165 -1.8812360437258079e-27 1770 1154 9.3749999999999986e-11 1770 1152 -1.0416666666666666e-11 1770 1151 2.0833333333333329e-11 1770 1765 2.0833333333333339e-11 1770 1757 -8.3333333333333330e-11 1770 1235 9.3749999999999986e-11 1770 1229 2.0833333333333332e-11 1770 3783 -1.0416666666666669e-11 1771 1771 4.5833333333333330e-10 1771 1165 5.2083333333333334e-11 1771 1779 -4.1666666666666671e-11 1771 1772 8.3333333333333343e-11 1771 1225 1.0416666666666665e-11 1771 1215 7.2916666666666660e-11 1771 1210 2.0833333333333329e-11 1771 1766 2.0833333333333339e-11 1771 1757 -8.3333333333333330e-11 1771 1153 1.3541666666666664e-10 1771 1152 -3.2311742677852644e-27 1771 1151 2.0833333333333332e-11 1771 4320 -9.6935228033557931e-27 1772 1772 4.1666666666666662e-10 1772 1236 2.0194839173657902e-27 1772 1773 -2.0833333333333326e-11 1772 2128 -4.1666666666666658e-11 1772 1216 -4.1666666666666658e-11 1772 1153 5.2083333333333334e-11 1772 1235 2.0194839173657902e-27 1772 1244 1.0416666666666661e-11 1772 1770 8.0779356694631609e-27 1772 1783 -2.6253290925755273e-27 1772 1154 -4.5860624244724788e-28 1772 1152 -1.0416666666666669e-11 1772 1165 6.2499999999999991e-11 1772 1771 8.3333333333333330e-11 1772 1779 -6.4623485355705287e-27 1772 1215 -3.1250000000000002e-11 1772 1225 -1.0416666666666655e-11 1772 3783 -1.0416666666666673e-11 1772 4320 -1.2500000000000001e-10 1773 1773 8.3333333333333314e-10 1773 1769 4.1666666666666665e-11 1773 2322 1.2499999999999998e-10 1773 1598 -2.0833333333333339e-11 1773 1599 1.6666666666666666e-10 1773 1774 4.1666666666666665e-11 1773 2069 1.2499999999999998e-10 1773 1236 4.1666666666666678e-11 1773 1244 -5.2083333333333328e-11 1773 1772 -2.0833333333333326e-11 1773 2128 1.2499999999999998e-10 1773 1216 4.1666666666666665e-11 1773 1225 -1.0416666666666668e-11 1773 4255 3.1249999999999995e-11 1773 4317 -5.2083333333333334e-11 1773 4254 3.1250000000000002e-11 1773 3790 -5.2083333333333334e-11 1773 3783 -1.4583333333333335e-10 1773 4320 -8.3333333333333330e-11 1774 1774 4.1666666666666662e-10 1774 1599 4.1666666666666665e-11 1774 2069 2.0833333333333329e-11 1774 1773 4.1666666666666665e-11 1774 1236 -2.8113590706237963e-30 1774 1775 -6.4623485355705287e-27 1774 1598 1.0416666666666658e-11 1774 3809 -5.2083333333333334e-11 1774 3785 -2.0194839173657902e-27 1774 3790 1.0416666666666671e-11 1774 3783 -1.0416666666666669e-11 1774 4454 6.4623485355705287e-27 1774 3797 2.0194839173657902e-27 1774 3816 -6.2499999999999991e-11 1774 4456 -1.6155871338926322e-27 1774 3811 1.0416666666666671e-11 1774 4863 -8.3333333333333330e-11 1774 4243 3.1250000000000002e-11 1774 4255 1.2499999999999998e-10 1775 1775 3.3333333333333327e-10 1775 1598 6.2500000000000004e-11 1775 4254 4.1666666666666665e-11 1775 4862 4.1666666666666678e-11 1775 3814 2.2851328271989659e-27 1775 3809 4.1666666666666665e-11 1775 3816 6.2499999999999991e-11 1775 3811 -1.8812360437258079e-27 1775 4863 4.1666666666666665e-11 1775 4243 1.6666666666666666e-10 1775 4255 4.1666666666666671e-11 1776 1776 2.4999999999999996e-10 1776 1166 -1.0416666666666665e-11 1776 1219 -1.0416666666666666e-11 1776 1741 -2.0833333333333339e-11 1776 1738 -2.2913451068275814e-27 1776 1153 -6.2499999999999991e-11 1776 1149 -1.0416666666666666e-11 1776 1159 -2.0833333333333326e-11 1776 1777 2.0833333333333336e-11 1776 2003 9.5018296033870872e-28 1776 1215 -6.2500000000000004e-11 1776 1211 -1.0416666666666665e-11 1776 1214 -2.0833333333333326e-11 1777 1777 4.5833333333333330e-10 1777 1159 -2.0833333333333332e-11 1777 1225 -1.0416666666666668e-11 1777 1779 4.1666666666666671e-11 1777 2001 -8.3333333333333330e-11 1777 1153 -1.3541666666666666e-10 1777 1166 8.0779356694631609e-27 1777 1165 -5.2083333333333334e-11 1777 1776 2.0833333333333339e-11 1777 2003 -8.3333333333333330e-11 1777 1215 -7.2916666666666660e-11 1777 1211 4.8467614016778965e-27 1777 1214 -2.0833333333333332e-11 1778 1778 4.1666666666666662e-10 1778 1151 -2.0833333333333332e-11 1778 1766 -2.0833333333333339e-11 1778 1761 8.3333333333333330e-11 1778 1210 -2.0833333333333332e-11 1778 1215 -8.3333333333333330e-11 1778 1222 2.0833333333333336e-11 1778 1221 -2.0833333333333332e-11 1778 1733 -2.0833333333333339e-11 1778 1732 8.3333333333333330e-11 1778 1153 -8.3333333333333330e-11 1778 1160 2.0833333333333336e-11 1778 1148 -2.0833333333333332e-11 1779 1779 3.3333333333333332e-10 1779 1152 -3.6295685768920020e-28 1779 1771 -4.1666666666666671e-11 1779 1772 -6.4623485355705287e-27 1779 1215 -1.6666666666666666e-10 1779 1211 -4.1666666666666665e-11 1779 1225 -6.2500000000000004e-11 1779 1777 4.1666666666666671e-11 1779 1153 -4.1666666666666678e-11 1779 1166 2.2851328271989659e-27 1779 1165 -6.2499999999999991e-11 1779 4320 -4.1666666666666665e-11 1780 1780 2.4999999999999996e-10 1780 1170 -1.0416666666666663e-11 1780 1154 -6.2499999999999991e-11 1780 1162 -2.0833333333333332e-11 1780 1165 -1.0416666666666668e-11 1780 1783 2.0833333333333336e-11 1780 2109 -3.6839804273821251e-27 1780 1244 -1.0416666666666665e-11 1780 1781 2.0833333333333336e-11 1780 2019 -2.2913451068275814e-27 1780 1235 -6.2500000000000004e-11 1780 1231 -1.0416666666666666e-11 1780 1234 -2.0833333333333323e-11 1781 1781 4.5833333333333330e-10 1781 1162 -2.0833333333333329e-11 1781 1245 -1.0416666666666668e-11 1781 1784 4.1666666666666665e-11 1781 2017 -8.3333333333333330e-11 1781 1154 -1.3541666666666666e-10 1781 1170 3.2311742677852644e-27 1781 1169 -5.2083333333333334e-11 1781 1780 2.0833333333333339e-11 1781 2019 -8.3333333333333330e-11 1781 1235 -7.2916666666666660e-11 1781 1231 3.2311742677852644e-27 1781 1234 -2.0833333333333332e-11 1782 1782 4.5833333333333330e-10 1782 1169 -5.2083333333333334e-11 1782 1784 4.1666666666666671e-11 1782 1807 -8.3333333333333343e-11 1782 1245 -1.0416666666666665e-11 1782 1235 -7.2916666666666660e-11 1782 1230 1.6155871338926322e-27 1782 1229 -2.0833333333333329e-11 1782 1765 -2.0833333333333339e-11 1782 1759 8.3333333333333330e-11 1782 1154 -1.3541666666666666e-10 1782 1155 3.2311742677852644e-27 1782 1151 -2.0833333333333332e-11 1783 1783 4.1666666666666668e-10 1783 1162 -2.0833333333333329e-11 1783 1780 2.0833333333333332e-11 1783 2109 8.3333333333333330e-11 1783 1234 -2.0833333333333332e-11 1783 1235 -9.3750000000000012e-11 1783 1244 1.0416666666666671e-11 1783 1770 -1.0416666666666667e-10 1783 1772 -3.0991386737738975e-27 1783 1154 -9.3749999999999999e-11 1783 1152 2.2851328271989659e-27 1783 1165 1.0416666666666669e-11 1783 3783 3.6295685768920020e-28 1784 1784 3.3333333333333327e-10 1784 1155 -4.0939925783957852e-29 1784 1782 4.1666666666666665e-11 1784 1230 -4.1666666666666665e-11 1784 1235 -1.6666666666666669e-10 1784 1231 -4.1666666666666665e-11 1784 1245 -6.2500000000000004e-11 1784 1781 4.1666666666666665e-11 1784 1154 -4.1666666666666678e-11 1784 1170 2.2851328271989659e-27 1784 1169 -6.2500000000000004e-11 1785 1785 4.1666666666666662e-10 1785 1803 -6.4623485355705287e-27 1785 1471 6.2499999999999991e-11 1785 1811 6.4623485355705287e-27 1785 1209 -1.0416666666666658e-11 1785 1206 -4.1666666666666665e-11 1785 1760 2.0833333333333329e-11 1785 1759 4.1666666666666665e-11 1785 1230 1.0416666666666668e-11 1785 1229 -3.5848693552059962e-28 1785 3977 5.2083333333333334e-11 1785 3791 2.0194839173657902e-27 1785 3968 -2.0194839173657902e-27 1785 4461 1.6155871338926322e-27 1785 3976 -1.0416666666666671e-11 1785 4462 8.3333333333333330e-11 1785 3780 -3.1250000000000002e-11 1785 3776 -1.2499999999999998e-10 1785 3784 -1.0416666666666671e-11 1786 1786 4.1666666666666662e-10 1786 1223 8.3333333333333330e-11 1786 1612 8.3333333333333330e-11 1786 1618 -2.0833333333333339e-11 1786 1610 2.0833333333333332e-11 1786 1762 2.0833333333333339e-11 1786 1758 -8.3333333333333330e-11 1786 1210 2.0833333333333332e-11 1786 4319 -2.0833333333333339e-11 1786 4318 2.0833333333333332e-11 1786 1075 2.0833333333333339e-11 1786 5004 -8.3333333333333330e-11 1786 228 2.0833333333333332e-11 1787 1787 4.1666666666666662e-10 1787 1619 8.3333333333333330e-11 1787 1618 -2.0833333333333336e-11 1787 1208 8.3333333333333330e-11 1787 1206 2.0833333333333329e-11 1787 1764 2.0833333333333339e-11 1787 1758 -8.3333333333333330e-11 1787 1610 2.0833333333333332e-11 1787 228 2.0833333333333329e-11 1787 947 -2.0833333333333339e-11 1787 5004 -8.3333333333333330e-11 1787 3781 -2.0833333333333336e-11 1787 290 2.0833333333333332e-11 1788 1788 4.1666666666666664e-02 1788 1790 3.1800793213478638e-19 1788 1259 -2.6946235634527430e-19 1788 4960 -1.3753697481041702e-19 1788 4288 -1.0116749763768550e-19 1789 1789 8.3333333333333301e-02 1789 1250 -1.0416666666666664e-03 1789 1793 -2.0833333333333329e-03 1789 2130 1.2499999999999997e-02 1789 1254 -5.2083333333333330e-03 1789 1255 4.1666666666666675e-03 1789 1791 4.1666666666666666e-03 1789 2145 -1.2499999999999999e-02 1789 1087 -2.0833333333333342e-03 1789 1085 1.6666666666666666e-02 1789 1790 4.1666666666666675e-03 1789 2141 -1.2499999999999997e-02 1789 1249 4.1666666666666675e-03 1789 4021 -1.4583333333333332e-02 1789 4288 -8.3333333333333332e-03 1790 1790 4.1666666666666657e-02 1790 1788 2.1684043449710089e-19 1790 1259 -6.2499999999999986e-03 1790 1795 -4.3368086899420177e-19 1790 1087 1.0416666666666662e-03 1790 1085 4.1666666666666666e-03 1790 2141 -2.0833333333333329e-03 1790 1789 4.1666666666666666e-03 1790 1249 -2.0761130467597592e-20 1790 4288 -1.0416666666666667e-03 1791 1791 4.1666666666666657e-02 1791 1795 4.3368086899420177e-19 1791 1259 -6.2499999999999986e-03 1791 1255 2.7157993871341005e-20 1791 2145 -2.0833333333333329e-03 1791 1789 4.1666666666666666e-03 1791 1087 1.0416666666666660e-03 1791 1085 4.1666666666666657e-03 1791 1792 2.7105054312137611e-20 1791 4021 -1.0416666666666667e-03 1792 1792 4.1666666666666657e-02 1792 1259 -5.8569019580184656e-19 1792 1791 -1.3753697481041702e-19 1792 4962 3.1800793213478638e-19 1792 4021 -4.6263880787845817e-19 1793 1793 4.1666666666666657e-02 1793 1251 -3.1249999999999997e-03 1793 2137 -4.3368086899420177e-19 1793 1648 5.2083333333333330e-03 1793 1647 6.2499999999999995e-03 1793 1249 -4.1666666666666657e-03 1793 1250 -1.0416666666666671e-03 1793 1789 -2.0833333333333329e-03 1793 2130 -4.1666666666666666e-03 1793 1255 1.4973071994693204e-20 1793 2132 -8.1315162936412833e-20 1793 1254 1.0416666666666671e-03 1793 3962 2.1684043449710089e-19 1793 4958 8.3333333333333315e-03 1793 3964 -1.0416666666666677e-03 1793 4288 -1.2499999999999999e-02 1793 4654 2.3039296165316969e-19 1793 4018 4.9904357809065860e-20 1793 4021 -1.0416666666666669e-03 1794 1794 3.3333333333333326e-02 1794 1259 6.2499999999999986e-03 1794 4960 8.6736173798840355e-19 1794 4285 6.2499999999999986e-03 1795 1795 3.3333333333333326e-02 1795 1791 4.3368086899420177e-19 1795 1259 6.2499999999999986e-03 1795 1087 6.2499999999999986e-03 1796 1796 2.4999999999999994e-02 1797 1797 2.0833333333333329e-02 1798 1798 2.0833333333333329e-02 1799 1799 2.4999999999999994e-02 1800 1800 2.0833333333333329e-02 1801 1801 2.0833333333333329e-02 1802 1802 4.1666666666666662e-10 1802 1239 -5.7186808026555811e-29 1802 2077 2.0833333333333332e-11 1802 1808 4.1666666666666665e-11 1802 1443 4.1666666666666665e-11 1802 1438 1.2499999999999998e-10 1802 1442 1.0416666666666666e-11 1802 1471 -6.2500000000000004e-11 1802 1950 8.3333333333333343e-11 1802 1468 1.0416666666666663e-11 1802 2076 -2.0194839173657902e-27 1802 1803 3.2311742677852644e-27 1802 1238 1.0416666666666666e-11 1802 1230 -1.0416666666666666e-11 1802 3968 -4.5860624244724788e-28 1802 3950 3.1250000000000002e-11 1802 3975 -5.2083333333333334e-11 1802 3791 -2.2470898404921788e-28 1803 1803 4.1666666666666657e-10 1803 1785 -4.0642113836986528e-27 1803 1471 -6.0115145282367205e-27 1803 1468 -1.8812360437258079e-27 1803 2076 -1.0416666666666667e-10 1803 1802 2.8974861048767764e-27 1803 1238 -1.8812360437258079e-27 1803 1230 -5.6797985175912850e-27 1803 3784 3.6295685768920020e-28 1803 4461 1.0416666666666667e-10 1803 3976 1.8812360437258079e-27 1803 3968 1.0416666666666667e-10 1803 3791 1.0416666666666668e-10 1804 1804 4.1666666666666662e-10 1804 1465 2.2470898404921788e-28 1804 1811 6.4623485355705287e-27 1804 1471 -6.2500000000000004e-11 1804 1819 -8.3333333333333343e-11 1804 1472 1.0416666666666663e-11 1804 1276 -2.8320667257631078e-28 1804 1763 -2.0833333333333332e-11 1804 1759 -4.1666666666666665e-11 1804 1207 1.2499999999999998e-10 1804 1209 1.0416666666666666e-11 1804 1206 4.1666666666666658e-11 1804 1817 -3.2311742677852644e-27 1804 1805 -2.0194839173657902e-27 1804 1271 4.5860624244724788e-28 1804 1274 1.0416666666666666e-11 1804 1273 -1.0416666666666668e-11 1804 3780 3.1250000000000002e-11 1804 3977 -5.2083333333333334e-11 1805 1805 4.1666666666666668e-10 1805 1472 -1.8812360437258079e-27 1805 1270 -3.6295685768920020e-28 1805 1465 1.0416666666666667e-10 1805 1471 -1.7917989385963757e-27 1805 2270 1.0416666666666667e-10 1805 1809 1.0034310714411270e-27 1805 1469 1.8812360437258079e-27 1805 1817 1.0416666666666667e-10 1805 1804 -2.3107708066186488e-27 1805 1271 1.0416666666666667e-10 1805 1274 -2.2851328271989659e-27 1805 1273 -1.0034310714411270e-27 1806 1806 4.1666666666666657e-10 1806 1279 1.8812360437258079e-27 1806 1812 -1.0416666666666667e-10 1806 1807 6.0115145282367205e-27 1806 1169 -1.8812360437258079e-27 1806 1156 9.3749999999999999e-11 1806 1155 -1.0416666666666671e-11 1806 1151 2.0833333333333332e-11 1806 1767 2.0833333333333339e-11 1806 1759 -8.3333333333333330e-11 1806 1277 9.3749999999999986e-11 1806 1273 -1.0416666666666673e-11 1806 1276 2.0833333333333332e-11 1807 1807 4.1666666666666662e-10 1807 1275 2.0194839173657902e-27 1807 1808 -2.0833333333333329e-11 1807 2190 -4.1666666666666658e-11 1807 1239 -4.1666666666666658e-11 1807 1154 5.2083333333333334e-11 1807 1277 2.0194839173657902e-27 1807 1273 -1.0416666666666673e-11 1807 1279 1.0416666666666661e-11 1807 1806 8.0779356694631609e-27 1807 1812 -2.6253290925755273e-27 1807 1156 -4.5860624244724788e-28 1807 1155 -1.0416666666666669e-11 1807 1169 6.2499999999999991e-11 1807 1782 -8.3333333333333343e-11 1807 1784 -6.4623485355705287e-27 1807 1235 -3.1250000000000002e-11 1807 1230 -1.2500000000000001e-10 1807 1245 -1.0416666666666655e-11 1808 1808 8.3333333333333314e-10 1808 1440 3.1250000000000002e-11 1808 1238 -5.2083333333333334e-11 1808 1802 4.1666666666666665e-11 1808 2077 1.2499999999999998e-10 1808 1438 3.1250000000000002e-11 1808 1442 -2.0833333333333339e-11 1808 1443 1.6666666666666666e-10 1808 1809 4.1666666666666665e-11 1808 2272 1.2499999999999998e-10 1808 1270 -5.2083333333333334e-11 1808 1273 -1.4583333333333335e-10 1808 1275 4.1666666666666665e-11 1808 1279 -5.2083333333333328e-11 1808 1807 -2.0833333333333329e-11 1808 2190 1.2500000000000001e-10 1808 1230 -8.3333333333333330e-11 1808 1239 4.1666666666666665e-11 1808 1245 -1.0416666666666668e-11 1809 1809 4.1666666666666662e-10 1809 1443 4.1666666666666665e-11 1809 2272 2.0833333333333332e-11 1809 1808 4.1666666666666665e-11 1809 1275 -6.0691943799667649e-29 1809 1271 -2.0194839173657902e-27 1809 1270 1.0416666666666673e-11 1809 1273 -1.0416666666666669e-11 1809 1805 1.6155871338926322e-27 1809 1465 2.0194839173657902e-27 1809 1471 -6.2499999999999991e-11 1809 2270 -6.4623485355705287e-27 1809 1469 1.0416666666666671e-11 1809 1951 8.3333333333333330e-11 1809 1810 -6.4623485355705287e-27 1809 1440 1.2499999999999998e-10 1809 1442 1.0416666666666658e-11 1809 3975 -5.2083333333333334e-11 1809 3950 3.1250000000000002e-11 1810 1810 3.3333333333333332e-10 1810 1438 4.1666666666666665e-11 1810 1950 -4.1666666666666678e-11 1810 1802 6.4623485355705287e-27 1810 1468 1.8812360437258079e-27 1810 1471 6.2500000000000004e-11 1810 1469 -1.8812360437258079e-27 1810 1951 -4.1666666666666665e-11 1810 1809 -6.4623485355705287e-27 1810 1440 4.1666666666666665e-11 1810 1442 6.2500000000000004e-11 1810 3975 4.1666666666666671e-11 1810 3950 1.6666666666666666e-10 1811 1811 3.3333333333333332e-10 1811 1207 4.1666666666666665e-11 1811 1819 4.1666666666666678e-11 1811 1472 1.8812360437258079e-27 1811 1471 6.2499999999999991e-11 1811 1209 6.2500000000000004e-11 1811 3977 4.1666666666666665e-11 1811 3976 -2.2851328271989659e-27 1811 4462 4.1666666666666665e-11 1811 3780 1.6666666666666669e-10 1811 3776 4.1666666666666665e-11 1812 1812 4.1666666666666662e-10 1812 1167 -2.0833333333333332e-11 1812 1813 2.0833333333333326e-11 1812 2174 8.3333333333333330e-11 1812 1280 -2.0833333333333332e-11 1812 1277 -9.3750000000000012e-11 1812 1273 -3.6295685768920020e-28 1812 1279 1.0416666666666674e-11 1812 1806 -1.0416666666666667e-10 1812 1807 -3.0991386737738975e-27 1812 1156 -9.3750000000000012e-11 1812 1155 1.8812360437258079e-27 1812 1169 1.0416666666666668e-11 1813 1813 2.4999999999999996e-10 1813 1171 -1.0416666666666666e-11 1813 1815 2.0833333333333339e-11 1813 2175 2.2913451068275814e-27 1813 1284 -1.0416666666666666e-11 1813 1156 -6.2499999999999991e-11 1813 1167 -2.0833333333333332e-11 1813 1169 -1.0416666666666668e-11 1813 1812 2.0833333333333332e-11 1813 2174 -3.6839804273821251e-27 1813 1277 -6.2499999999999991e-11 1813 1280 -2.0833333333333323e-11 1813 1279 -1.0416666666666665e-11 1814 1814 4.1666666666666662e-10 1814 1156 8.3333333333333330e-11 1814 1160 -2.0833333333333336e-11 1814 1148 2.0833333333333332e-11 1814 1735 2.0833333333333336e-11 1814 1732 -8.3333333333333330e-11 1814 1277 8.3333333333333330e-11 1814 1281 -2.0833333333333336e-11 1814 1283 2.0833333333333332e-11 1814 1276 2.0833333333333332e-11 1814 1767 2.0833333333333336e-11 1814 1761 -8.3333333333333330e-11 1814 1151 2.0833333333333332e-11 1815 1815 4.1666666666666662e-10 1815 1167 -2.0833333333333332e-11 1815 1813 2.0833333333333339e-11 1815 2175 8.3333333333333330e-11 1815 1280 -2.0833333333333332e-11 1815 1277 -8.3333333333333330e-11 1815 1284 2.0833333333333339e-11 1815 1283 -2.0833333333333332e-11 1815 1735 -2.0833333333333339e-11 1815 1728 8.3333333333333330e-11 1815 1156 -8.3333333333333330e-11 1815 1171 2.0833333333333339e-11 1815 1148 -2.0833333333333332e-11 1816 1816 4.1666666666666662e-10 1816 1208 7.2916666666666660e-11 1816 1207 -1.0416666666666668e-11 1816 1619 7.2916666666666660e-11 1816 1621 -1.0416666666666666e-11 1816 1610 2.0833333333333329e-11 1816 1764 2.0833333333333339e-11 1816 1763 -8.3333333333333330e-11 1816 1206 2.0833333333333332e-11 1816 299 -2.0833333333333329e-11 1816 286 2.0833333333333326e-11 1816 698 2.0833333333333336e-11 1816 296 -2.0833333333333329e-11 1816 294 -6.2499999999999991e-11 1816 712 2.0833333333333336e-11 1816 300 3.5628902784306998e-27 1816 948 -2.0833333333333326e-11 1816 701 2.0833333333333326e-11 1816 226 2.0833333333333329e-11 1817 1817 4.1666666666666657e-10 1817 1674 -2.0833333333333329e-11 1817 1290 2.0833333333333326e-11 1817 1271 8.3333333333333330e-11 1817 1274 -1.0554958911857138e-27 1817 1675 -2.0833333333333329e-11 1817 2283 -2.0833333333333336e-11 1817 1672 3.5628902784306998e-27 1817 2284 -2.0833333333333326e-11 1817 1470 2.0833333333333329e-11 1817 1465 8.3333333333333330e-11 1817 1472 -6.1479874648399555e-27 1817 1471 -2.2851328271989659e-27 1817 1805 1.0416666666666667e-10 1817 1804 -2.8974861048767764e-27 1817 1273 -1.8812360437258079e-27 1817 699 2.0833333333333336e-11 1817 294 -6.2499999999999991e-11 1817 700 2.0833333333333326e-11 1818 1818 4.1666666666666662e-10 1818 1675 -2.0833333333333329e-11 1818 1620 7.2916666666666660e-11 1818 1621 -1.0416666666666671e-11 1818 1290 2.0833333333333329e-11 1818 1282 7.2916666666666660e-11 1818 1274 -1.0416666666666669e-11 1818 1276 2.0833333333333329e-11 1818 1768 2.0833333333333339e-11 1818 1763 -8.3333333333333330e-11 1818 1610 2.0833333333333332e-11 1818 226 2.0833333333333326e-11 1818 701 2.0833333333333339e-11 1818 299 -2.0833333333333329e-11 1818 294 -6.2499999999999991e-11 1818 1029 -2.0833333333333336e-11 1818 298 3.5628902784306998e-27 1818 702 2.0833333333333326e-11 1818 699 2.0833333333333332e-11 1819 1819 4.5833333333333330e-10 1819 1470 2.0833333333333326e-11 1819 1472 1.0416666666666666e-11 1819 1674 -2.0833333333333329e-11 1819 1207 1.0416666666666663e-11 1819 1209 1.0416666666666668e-11 1819 1811 4.1666666666666678e-11 1819 1471 5.2083333333333334e-11 1819 1804 -8.3333333333333343e-11 1819 296 -2.0833333333333329e-11 1819 3977 1.2499999999999998e-10 1819 700 2.0833333333333339e-11 1819 294 -6.2499999999999991e-11 1819 705 2.0833333333333336e-11 1819 295 3.5628902784306998e-27 1819 707 -2.0833333333333326e-11 1819 698 2.0833333333333332e-11 1819 286 2.0833333333333329e-11 1819 3780 6.2499999999999991e-11 1820 1820 6.6666666666666664e-10 1820 1825 1.6155871338926322e-27 1820 1622 -4.1666666666666665e-11 1820 1823 1.6155871338926322e-27 1820 1177 -4.1666666666666665e-11 1820 1832 1.6155871338926322e-27 1820 1298 -4.1666666666666665e-11 1820 1821 1.6155871338926322e-27 1820 1291 -4.1666666666666665e-11 1821 1821 2.4999999999999996e-10 1821 1828 -2.2913451068275814e-27 1821 1298 2.0833333333333326e-11 1821 1820 9.5018296033870872e-28 1821 1291 2.0833333333333326e-11 1822 1822 6.6666666666666664e-10 1822 1534 -1.0416666666666666e-11 1822 2102 -8.3333333333333330e-11 1822 1834 1.6155871338926322e-27 1822 1543 6.2499999999999991e-11 1822 1542 -4.1666666666666665e-11 1822 2103 -8.3333333333333330e-11 1822 1833 -1.8175355256292112e-27 1822 1164 -1.0416666666666666e-11 1822 1150 -1.0416666666666666e-11 1822 1161 6.2499999999999991e-11 1822 1157 -4.1666666666666665e-11 1822 1748 8.3333333333333330e-11 1822 1745 -1.6155871338926322e-27 1822 1175 -1.0416666666666666e-11 1822 1182 6.2499999999999991e-11 1822 1177 -4.1666666666666665e-11 1822 2101 -8.3333333333333330e-11 1822 1823 -1.8175355256292112e-27 1822 1623 6.2499999999999991e-11 1822 1622 -4.1666666666666665e-11 1823 1823 2.4999999999999996e-10 1823 1182 1.0416666666666666e-11 1823 1820 9.5018296033870872e-28 1823 1177 2.0833333333333326e-11 1823 2101 2.0833333333333339e-11 1823 1822 -2.2913451068275814e-27 1823 1623 1.0416666666666666e-11 1823 1622 2.0833333333333326e-11 1824 1824 6.6666666666666664e-10 1824 1829 -1.8175355256292112e-27 1824 1633 -4.1666666666666665e-11 1824 1827 -1.8175355256292112e-27 1824 1542 -4.1666666666666665e-11 1824 1834 -1.8175355256292112e-27 1824 1622 -4.1666666666666665e-11 1824 1825 -1.8175355256292112e-27 1824 1291 -4.1666666666666665e-11 1825 1825 2.4999999999999996e-10 1825 1820 9.5018296033870872e-28 1825 1622 2.0833333333333326e-11 1825 1824 -2.2913451068275814e-27 1825 1291 2.0833333333333326e-11 1826 1826 6.6666666666666664e-10 1826 1551 -1.0416666666666666e-11 1826 2116 -8.3333333333333330e-11 1826 1836 1.6155871338926322e-27 1826 1560 6.2499999999999991e-11 1826 1559 -4.1666666666666665e-11 1826 2118 -8.3333333333333330e-11 1826 1835 1.6155871338926322e-27 1826 1168 -1.0416666666666666e-11 1826 1164 -1.0416666666666666e-11 1826 1163 6.2499999999999991e-11 1826 1157 -4.1666666666666665e-11 1826 2117 -8.3333333333333330e-11 1826 1833 1.6155871338926322e-27 1826 1534 -1.0416666666666666e-11 1826 1539 6.2499999999999991e-11 1826 1542 -4.1666666666666665e-11 1826 2115 -8.3333333333333330e-11 1826 1827 1.6155871338926322e-27 1826 1634 6.2499999999999991e-11 1826 1633 -4.1666666666666665e-11 1827 1827 2.4999999999999996e-10 1827 1539 1.0416666666666665e-11 1827 1824 -2.2913451068275814e-27 1827 1542 2.0833333333333326e-11 1827 2115 2.0833333333333336e-11 1827 1826 9.5018296033870872e-28 1827 1634 1.0416666666666665e-11 1827 1633 2.0833333333333326e-11 1828 1828 6.6666666666666664e-10 1828 1821 -1.8175355256292112e-27 1828 1298 -4.1666666666666665e-11 1828 1831 1.6155871338926322e-27 1828 1559 -4.1666666666666665e-11 1828 1836 -1.8175355256292112e-27 1828 1633 -4.1666666666666665e-11 1828 1829 1.6155871338926322e-27 1828 1291 -4.1666666666666665e-11 1829 1829 2.4999999999999996e-10 1829 1824 -2.2913451068275814e-27 1829 1633 2.0833333333333326e-11 1829 1828 9.5018296033870872e-28 1829 1291 2.0833333333333326e-11 1830 1830 6.6666666666666664e-10 1830 1168 -1.0416666666666666e-11 1830 1840 -8.3333333333333330e-11 1830 1835 -1.8175355256292112e-27 1830 1551 -1.0416666666666666e-11 1830 1556 6.2499999999999991e-11 1830 1559 -4.1666666666666665e-11 1830 1175 -1.0416666666666666e-11 1830 1839 -8.3333333333333330e-11 1830 1832 -1.8175355256292112e-27 1830 1178 6.2499999999999991e-11 1830 1177 -4.1666666666666665e-11 1830 1746 8.3333333333333330e-11 1830 1745 1.8175355256292112e-27 1830 1150 -1.0416666666666666e-11 1830 1158 6.2499999999999991e-11 1830 1157 -4.1666666666666665e-11 1830 1837 -8.3333333333333330e-11 1830 1831 -1.8175355256292112e-27 1830 1299 6.2499999999999991e-11 1830 1298 -4.1666666666666665e-11 1831 1831 2.4999999999999996e-10 1831 1556 1.0416666666666663e-11 1831 1828 9.5018296033870872e-28 1831 1559 2.0833333333333326e-11 1831 1837 2.0833333333333336e-11 1831 1830 -2.2913451068275814e-27 1831 1299 1.0416666666666666e-11 1831 1298 2.0833333333333326e-11 1832 1832 2.4999999999999996e-10 1832 1820 9.5018296033870872e-28 1832 1299 1.0416666666666666e-11 1832 1298 2.0833333333333326e-11 1832 1839 2.0833333333333339e-11 1832 1830 -2.2913451068275814e-27 1832 1178 1.0416666666666666e-11 1832 1177 2.0833333333333326e-11 1833 1833 2.4999999999999996e-10 1833 1163 1.0416666666666665e-11 1833 2117 2.0833333333333332e-11 1833 1826 9.5018296033870872e-28 1833 1539 1.0416666666666665e-11 1833 1534 6.2499999999999991e-11 1833 1543 1.0416666666666666e-11 1833 1542 2.0833333333333326e-11 1833 2103 2.0833333333333339e-11 1833 1822 -2.2913451068275814e-27 1833 1164 6.2499999999999991e-11 1833 1161 1.0416666666666666e-11 1833 1157 2.0833333333333326e-11 1834 1834 2.4999999999999996e-10 1834 1824 -2.2913451068275814e-27 1834 1623 1.0416666666666663e-11 1834 1622 2.0833333333333326e-11 1834 2102 2.0833333333333336e-11 1834 1822 9.5018296033870872e-28 1834 1543 1.0416666666666666e-11 1834 1542 2.0833333333333326e-11 1835 1835 2.4999999999999996e-10 1835 1158 1.0416666666666666e-11 1835 1840 2.0833333333333339e-11 1835 1830 -2.2913451068275814e-27 1835 1556 1.0416666666666666e-11 1835 1551 6.2499999999999991e-11 1835 1560 1.0416666666666665e-11 1835 1559 2.0833333333333326e-11 1835 2118 2.0833333333333336e-11 1835 1826 9.5018296033870872e-28 1835 1168 6.2500000000000004e-11 1835 1163 1.0416666666666665e-11 1835 1157 2.0833333333333326e-11 1836 1836 2.4999999999999996e-10 1836 1828 -2.2913451068275814e-27 1836 1634 1.0416666666666665e-11 1836 1633 2.0833333333333326e-11 1836 2116 2.0833333333333332e-11 1836 1826 9.5018296033870872e-28 1836 1560 1.0416666666666665e-11 1836 1559 2.0833333333333326e-11 1837 1837 4.1666666666666662e-10 1837 1559 2.0833333333333329e-11 1837 1301 2.0833333333333329e-11 1837 2178 2.0833333333333339e-11 1837 1838 8.3333333333333330e-11 1837 1556 -2.0833333333333332e-11 1837 1555 2.0833333333333332e-11 1837 1831 2.0833333333333339e-11 1837 1830 -8.3333333333333330e-11 1837 1299 -2.0833333333333332e-11 1837 1298 2.0833333333333332e-11 1838 1838 6.6666666666666664e-10 1838 1150 1.0416666666666666e-11 1838 1746 -8.3333333333333330e-11 1838 1749 -1.8175355256292112e-27 1838 1175 1.0416666666666666e-11 1838 1178 -6.2499999999999991e-11 1838 1185 4.1666666666666665e-11 1838 1551 1.0416666666666666e-11 1838 1837 8.3333333333333330e-11 1838 2178 1.8175355256292112e-27 1838 1556 -6.2499999999999991e-11 1838 1555 4.1666666666666665e-11 1838 1840 8.3333333333333330e-11 1838 2177 1.8175355256292112e-27 1838 1168 1.0416666666666666e-11 1838 1158 -6.2499999999999991e-11 1838 1167 4.1666666666666665e-11 1838 1839 8.3333333333333330e-11 1838 1841 -1.8175355256292112e-27 1838 1299 -6.2499999999999991e-11 1838 1301 4.1666666666666665e-11 1839 1839 4.1666666666666662e-10 1839 1185 2.0833333333333329e-11 1839 1298 2.0833333333333329e-11 1839 1832 2.0833333333333339e-11 1839 1830 -8.3333333333333330e-11 1839 1178 -2.0833333333333339e-11 1839 1177 2.0833333333333332e-11 1839 1841 -2.0833333333333339e-11 1839 1838 8.3333333333333330e-11 1839 1299 -2.0833333333333339e-11 1839 1301 2.0833333333333332e-11 1840 1840 4.1666666666666662e-10 1840 1157 2.0833333333333329e-11 1840 1835 2.0833333333333339e-11 1840 1830 -8.3333333333333330e-11 1840 1559 2.0833333333333332e-11 1840 1551 8.3333333333333330e-11 1840 1556 -2.0833333333333339e-11 1840 1555 2.0833333333333329e-11 1840 2177 2.0833333333333339e-11 1840 1838 8.3333333333333330e-11 1840 1168 8.3333333333333330e-11 1840 1158 -2.0833333333333339e-11 1840 1167 2.0833333333333332e-11 1841 1841 2.4999999999999996e-10 1841 1178 -1.0416666666666666e-11 1841 2176 -9.5018296033870872e-28 1841 1185 -2.0833333333333326e-11 1841 1839 -2.0833333333333339e-11 1841 1838 -2.2913451068275814e-27 1841 1299 -1.0416666666666666e-11 1841 1301 -2.0833333333333326e-11 1842 1842 2.0833333333333331e-10 1843 1843 2.0833333333333331e-10 1844 1844 2.0833333333333331e-10 1845 1845 2.0833333333333331e-10 1846 1846 2.0833333333333331e-10 1847 1847 2.0833333333333331e-10 1848 1848 2.0833333333333331e-10 1849 1849 2.9166666666666659e-10 1849 1875 -4.1666666666666665e-11 1849 1364 1.1000665323307010e-27 1849 1349 4.1666666666666665e-11 1849 1345 1.0416666666666665e-11 1849 1348 -1.3020149240672800e-27 1849 1870 4.1666666666666652e-11 1849 1311 1.0416666666666666e-10 1850 1850 2.0833333333333331e-10 1851 1851 2.9166666666666659e-10 1851 1362 -1.3020149240672800e-27 1851 1346 4.1666666666666665e-11 1851 1345 1.0416666666666665e-11 1851 1861 4.1666666666666665e-11 1851 1344 1.1000665323307010e-27 1851 1862 -4.1666666666666652e-11 1851 1324 1.0416666666666666e-10 1852 1852 2.0833333333333331e-10 1853 1853 2.9166666666666664e-10 1853 1868 -4.1666666666666665e-11 1853 1348 1.5039633158038590e-27 1853 1347 4.1666666666666658e-11 1853 1345 1.0416666666666665e-11 1853 1344 -1.1213657767716683e-27 1853 1860 4.1666666666666652e-11 1853 1337 1.0416666666666666e-10 1854 1854 2.0833333333333331e-10 1855 1855 2.9166666666666664e-10 1855 2293 4.1666666666666665e-11 1855 1362 1.5039633158038590e-27 1855 1363 4.1666666666666658e-11 1855 1345 1.0416666666666665e-11 1855 1364 -1.1213657767716683e-27 1855 2304 -4.1666666666666652e-11 1855 1680 1.0416666666666666e-10 1856 1856 4.1666666666666662e-10 1856 1346 2.0833333333333329e-11 1856 1337 -2.0833333333333326e-11 1856 1866 2.0833333333333336e-11 1856 1347 2.0833333333333329e-11 1856 1350 6.2499999999999991e-11 1856 1860 2.0833333333333336e-11 1856 1344 -3.5628902784306998e-27 1856 1861 2.0833333333333326e-11 1856 1863 2.0833333333333326e-11 1856 1324 -2.0833333333333329e-11 1856 1396 2.0833333333333329e-11 1856 1321 -2.0833333333333326e-11 1856 1330 2.1169082391605852e-27 1856 2208 2.0833333333333336e-11 1856 1406 2.0833333333333329e-11 1856 1412 6.2499999999999991e-11 1856 1859 2.0833333333333336e-11 1856 1413 -3.5628902784306998e-27 1856 1857 2.0833333333333326e-11 1856 1893 2.0833333333333326e-11 1856 1335 -2.0833333333333329e-11 1856 1333 2.1169082391605852e-27 1857 1857 2.9166666666666659e-10 1857 1895 -4.1666666666666665e-11 1857 1405 2.0833333333333332e-11 1857 1396 1.0416666666666666e-10 1857 1412 2.0833333333333329e-11 1857 1413 1.0416666666666661e-11 1857 1893 -4.1666666666666652e-11 1857 1856 2.0833333333333326e-11 1857 1335 4.1666666666666658e-11 1857 1333 -1.5039633158038590e-27 1858 1858 2.0833333333333331e-10 1859 1859 2.9166666666666664e-10 1859 1405 2.0833333333333329e-11 1859 1330 1.3020149240672800e-27 1859 2208 -4.1666666666666665e-11 1859 1406 1.0416666666666666e-10 1859 1412 2.0833333333333332e-11 1859 1856 2.0833333333333336e-11 1859 1413 1.0416666666666661e-11 1859 2199 4.1666666666666652e-11 1859 1321 4.1666666666666658e-11 1860 1860 2.9166666666666659e-10 1860 1333 1.3020149240672800e-27 1860 1866 -4.1666666666666665e-11 1860 1350 2.0833333333333332e-11 1860 1856 2.0833333333333336e-11 1860 1347 1.0416666666666666e-10 1860 1345 2.0833333333333329e-11 1860 1344 1.0416666666666661e-11 1860 1853 4.1666666666666652e-11 1860 1337 4.1666666666666658e-11 1861 1861 2.9166666666666664e-10 1861 1350 2.0833333333333329e-11 1861 1863 -4.1666666666666652e-11 1861 1856 2.0833333333333326e-11 1861 1330 -1.5039633158038590e-27 1861 1324 4.1666666666666658e-11 1861 1851 4.1666666666666665e-11 1861 1346 1.0416666666666666e-10 1861 1345 2.0833333333333332e-11 1861 1344 1.0416666666666661e-11 1862 1862 2.9166666666666664e-10 1862 1345 -2.0833333333333329e-11 1862 1331 -1.1213657767716683e-27 1862 1865 4.1666666666666665e-11 1862 1346 -1.0416666666666666e-10 1862 1361 -2.0833333333333332e-11 1862 2292 -2.0833333333333336e-11 1862 1362 -1.0416666666666663e-11 1862 1851 -4.1666666666666652e-11 1862 1324 -4.1666666666666665e-11 1863 1863 2.9166666666666664e-10 1863 1329 -2.0833333333333332e-11 1863 1864 4.1666666666666665e-11 1863 2220 2.0833333333333339e-11 1863 1351 -1.3233141685082473e-27 1863 1346 -4.1666666666666665e-11 1863 1350 -1.0416666666666665e-11 1863 1344 1.1000665323307010e-27 1863 1861 -4.1666666666666652e-11 1863 1856 2.0833333333333326e-11 1863 1324 -1.0416666666666666e-10 1863 1330 -1.0416666666666663e-11 1864 1864 2.9166666666666664e-10 1864 1361 -2.0833333333333329e-11 1864 1865 4.1666666666666652e-11 1864 2222 -2.0833333333333326e-11 1864 1331 1.1213657767716683e-27 1864 1324 -4.1666666666666658e-11 1864 1329 -1.0416666666666665e-11 1864 1330 -1.5039633158038590e-27 1864 1863 4.1666666666666665e-11 1864 1346 -1.0416666666666666e-10 1864 1350 -2.0833333333333332e-11 1864 2220 -2.0833333333333336e-11 1864 1351 -1.0416666666666663e-11 1865 1865 2.9166666666666659e-10 1865 1862 4.1666666666666665e-11 1865 2292 2.0833333333333336e-11 1865 1362 -1.3020149240672800e-27 1865 1346 -4.1666666666666658e-11 1865 1361 -1.0416666666666661e-11 1865 1351 1.3233141685082473e-27 1865 1864 4.1666666666666652e-11 1865 2222 2.0833333333333326e-11 1865 1324 -1.0416666666666666e-10 1865 1329 -2.0833333333333329e-11 1865 1331 -1.0416666666666661e-11 1866 1866 2.9166666666666664e-10 1866 1360 1.1000665323307010e-27 1866 1347 -4.1666666666666665e-11 1866 1350 -1.0416666666666665e-11 1866 1860 -4.1666666666666665e-11 1866 1856 2.0833333333333336e-11 1866 1344 -1.1213657767716683e-27 1866 1867 4.1666666666666652e-11 1866 1884 2.0833333333333332e-11 1866 1337 -1.0416666666666666e-10 1866 1333 -1.0416666666666663e-11 1867 1867 2.9166666666666659e-10 1867 1869 4.1666666666666665e-11 1867 1354 -2.0833333333333332e-11 1867 1347 -1.0416666666666666e-10 1867 1350 -2.0833333333333329e-11 1867 1360 -1.0416666666666661e-11 1867 1866 4.1666666666666652e-11 1867 1884 -2.0833333333333326e-11 1867 1337 -4.1666666666666665e-11 1867 1333 1.3020149240672800e-27 1868 1868 2.9166666666666664e-10 1868 1354 -2.0833333333333329e-11 1868 1869 4.1666666666666652e-11 1868 1337 -4.1666666666666665e-11 1868 1853 -4.1666666666666665e-11 1868 1347 -1.0416666666666666e-10 1868 1345 -2.0833333333333332e-11 1868 1348 -1.0416666666666663e-11 1869 1869 2.9166666666666659e-10 1869 1867 4.1666666666666665e-11 1869 1360 -1.1000665323307010e-27 1869 1347 -4.1666666666666658e-11 1869 1354 -1.0416666666666661e-11 1869 1348 1.5039633158038590e-27 1869 1868 4.1666666666666652e-11 1869 1337 -1.0416666666666666e-10 1870 1870 2.9166666666666664e-10 1870 1872 -4.1666666666666665e-11 1870 1354 2.0833333333333332e-11 1870 1349 1.0416666666666666e-10 1870 1345 2.0833333333333329e-11 1870 1348 1.0416666666666663e-11 1870 1849 4.1666666666666652e-11 1870 1311 4.1666666666666665e-11 1871 1871 2.0833333333333331e-10 1872 1872 2.9166666666666659e-10 1872 1870 -4.1666666666666665e-11 1872 1348 -1.3020149240672800e-27 1872 1349 -4.1666666666666658e-11 1872 1354 -1.0416666666666661e-11 1872 1357 1.3233141685082473e-27 1872 1873 4.1666666666666652e-11 1872 1311 -1.0416666666666666e-10 1873 1873 2.9166666666666664e-10 1873 1874 4.1666666666666665e-11 1873 1366 -2.0833333333333332e-11 1873 1349 -1.0416666666666666e-10 1873 1354 -2.0833333333333329e-11 1873 1357 -1.0416666666666663e-11 1873 1872 4.1666666666666652e-11 1873 1311 -4.1666666666666658e-11 1874 1874 2.9166666666666664e-10 1874 1873 4.1666666666666665e-11 1874 1357 -1.3233141685082473e-27 1874 1349 -4.1666666666666665e-11 1874 1366 -1.0416666666666665e-11 1874 1364 1.1000665323307010e-27 1874 1875 4.1666666666666652e-11 1874 1311 -1.0416666666666666e-10 1875 1875 2.9166666666666664e-10 1875 1366 -2.0833333333333329e-11 1875 1849 -4.1666666666666665e-11 1875 1349 -1.0416666666666666e-10 1875 1345 -2.0833333333333332e-11 1875 1364 -1.0416666666666661e-11 1875 1874 4.1666666666666652e-11 1875 1311 -4.1666666666666658e-11 1876 1876 2.0833333333333331e-10 1877 1877 2.9166666666666659e-10 1877 1899 -4.1666666666666665e-11 1877 1403 1.1000665323307010e-27 1877 1398 4.1666666666666658e-11 1877 1394 1.0416666666666661e-11 1877 1397 -1.5039633158038590e-27 1877 1896 4.1666666666666652e-11 1877 1372 1.0416666666666666e-10 1878 1878 2.0833333333333331e-10 1879 1879 2.9166666666666659e-10 1879 1418 -1.5039633158038590e-27 1879 1395 4.1666666666666658e-11 1879 1394 1.0416666666666661e-11 1879 1888 4.1666666666666665e-11 1879 1393 1.1000665323307010e-27 1879 1889 -4.1666666666666652e-11 1879 1387 1.0416666666666666e-10 1880 1880 2.0833333333333331e-10 1881 1881 2.9166666666666659e-10 1881 1894 -4.1666666666666665e-11 1881 1397 1.3020149240672800e-27 1881 1396 4.1666666666666658e-11 1881 1394 1.0416666666666661e-11 1881 1393 -1.3233141685082473e-27 1881 1887 4.1666666666666652e-11 1881 1335 1.0416666666666666e-10 1882 1882 2.0833333333333331e-10 1883 1883 2.9166666666666659e-10 1883 1922 -4.1666666666666665e-11 1883 1418 1.3020149240672800e-27 1883 1402 4.1666666666666658e-11 1883 1394 1.0416666666666661e-11 1883 1403 -1.3233141685082473e-27 1883 1923 -4.1666666666666652e-11 1883 1426 1.0416666666666666e-10 1884 1884 4.1666666666666662e-10 1884 1395 2.0833333333333329e-11 1884 1335 -2.0833333333333326e-11 1884 1893 2.0833333333333339e-11 1884 1396 2.0833333333333329e-11 1884 1412 6.2499999999999991e-11 1884 1887 2.0833333333333336e-11 1884 1393 -3.5628902784306998e-27 1884 1888 2.0833333333333326e-11 1884 1890 2.0833333333333332e-11 1884 1387 -2.0833333333333329e-11 1884 1347 2.0833333333333329e-11 1884 1384 -2.0833333333333326e-11 1884 1391 3.5628902784306998e-27 1884 2242 -2.0833333333333339e-11 1884 1355 2.0833333333333329e-11 1884 1350 6.2499999999999991e-11 1884 1886 2.0833333333333336e-11 1884 1360 -3.5628902784306998e-27 1884 1867 -2.0833333333333326e-11 1884 1866 2.0833333333333332e-11 1884 1337 -2.0833333333333329e-11 1884 1333 3.5628902784306998e-27 1885 1885 2.0833333333333331e-10 1886 1886 2.9166666666666664e-10 1886 1354 2.0833333333333329e-11 1886 1391 1.5039633158038590e-27 1886 2242 4.1666666666666665e-11 1886 1355 1.0416666666666666e-10 1886 1350 2.0833333333333332e-11 1886 1884 2.0833333333333336e-11 1886 1360 1.0416666666666663e-11 1886 2247 4.1666666666666652e-11 1886 1384 4.1666666666666658e-11 1887 1887 2.9166666666666664e-10 1887 1333 1.5039633158038590e-27 1887 1893 -4.1666666666666665e-11 1887 1412 2.0833333333333332e-11 1887 1884 2.0833333333333336e-11 1887 1396 1.0416666666666666e-10 1887 1394 2.0833333333333329e-11 1887 1393 1.0416666666666663e-11 1887 1881 4.1666666666666652e-11 1887 1335 4.1666666666666658e-11 1888 1888 2.9166666666666664e-10 1888 1412 2.0833333333333329e-11 1888 1890 -4.1666666666666652e-11 1888 1884 2.0833333333333326e-11 1888 1391 -1.3020149240672800e-27 1888 1387 4.1666666666666665e-11 1888 1879 4.1666666666666665e-11 1888 1395 1.0416666666666666e-10 1888 1394 2.0833333333333332e-11 1888 1393 1.0416666666666661e-11 1889 1889 2.9166666666666664e-10 1889 1394 -2.0833333333333329e-11 1889 1392 -1.3233141685082473e-27 1889 1892 4.1666666666666665e-11 1889 1395 -1.0416666666666666e-10 1889 1415 -2.0833333333333332e-11 1889 2265 2.0833333333333339e-11 1889 1418 -1.0416666666666663e-11 1889 1879 -4.1666666666666652e-11 1889 1387 -4.1666666666666665e-11 1890 1890 2.9166666666666664e-10 1890 1390 -2.0833333333333332e-11 1890 1891 4.1666666666666665e-11 1890 2241 -2.0833333333333336e-11 1890 1414 -1.1213657767716683e-27 1890 1395 -4.1666666666666665e-11 1890 1412 -1.0416666666666665e-11 1890 1393 1.1000665323307010e-27 1890 1888 -4.1666666666666652e-11 1890 1884 2.0833333333333332e-11 1890 1387 -1.0416666666666666e-10 1890 1391 -1.0416666666666663e-11 1891 1891 2.9166666666666664e-10 1891 1415 -2.0833333333333329e-11 1891 1892 4.1666666666666652e-11 1891 2263 2.0833333333333326e-11 1891 1392 1.3233141685082473e-27 1891 1387 -4.1666666666666658e-11 1891 1390 -1.0416666666666661e-11 1891 1391 -1.3020149240672800e-27 1891 1890 4.1666666666666665e-11 1891 1395 -1.0416666666666666e-10 1891 1412 -2.0833333333333332e-11 1891 2241 2.0833333333333336e-11 1891 1414 -1.0416666666666661e-11 1892 1892 2.9166666666666664e-10 1892 1889 4.1666666666666665e-11 1892 2265 -2.0833333333333336e-11 1892 1418 -1.5039633158038590e-27 1892 1395 -4.1666666666666658e-11 1892 1415 -1.0416666666666665e-11 1892 1414 1.1213657767716683e-27 1892 1891 4.1666666666666652e-11 1892 2263 -2.0833333333333326e-11 1892 1387 -1.0416666666666666e-10 1892 1390 -2.0833333333333329e-11 1892 1392 -1.0416666666666663e-11 1893 1893 2.9166666666666664e-10 1893 1887 -4.1666666666666665e-11 1893 1884 2.0833333333333339e-11 1893 1393 -1.3233141685082473e-27 1893 1396 -4.1666666666666665e-11 1893 1412 -1.0416666666666665e-11 1893 1413 1.1000665323307010e-27 1893 1857 -4.1666666666666652e-11 1893 1856 2.0833333333333326e-11 1893 1335 -1.0416666666666666e-10 1893 1333 -1.0416666666666663e-11 1894 1894 2.9166666666666664e-10 1894 1405 -2.0833333333333329e-11 1894 1895 4.1666666666666652e-11 1894 1335 -4.1666666666666665e-11 1894 1881 -4.1666666666666665e-11 1894 1396 -1.0416666666666666e-10 1894 1394 -2.0833333333333332e-11 1894 1397 -1.0416666666666663e-11 1895 1895 2.9166666666666659e-10 1895 1857 -4.1666666666666665e-11 1895 1413 -1.1000665323307010e-27 1895 1396 -4.1666666666666665e-11 1895 1405 -1.0416666666666665e-11 1895 1397 1.3020149240672800e-27 1895 1894 4.1666666666666652e-11 1895 1335 -1.0416666666666666e-10 1896 1896 2.9166666666666664e-10 1896 1900 -4.1666666666666665e-11 1896 1405 2.0833333333333332e-11 1896 1398 1.0416666666666666e-10 1896 1394 2.0833333333333329e-11 1896 1397 1.0416666666666663e-11 1896 1877 4.1666666666666652e-11 1896 1372 4.1666666666666665e-11 1897 1897 2.0833333333333331e-10 1898 1898 2.9166666666666664e-10 1898 1901 4.1666666666666665e-11 1898 1907 -2.0833333333333336e-11 1898 1408 -1.1213657767716683e-27 1898 1398 -4.1666666666666665e-11 1898 1400 -1.0416666666666665e-11 1898 1403 1.1000665323307010e-27 1898 1899 4.1666666666666652e-11 1898 1902 -2.0833333333333332e-11 1898 1372 -1.0416666666666666e-10 1898 1373 -1.0416666666666663e-11 1899 1899 2.9166666666666659e-10 1899 1877 -4.1666666666666665e-11 1899 1394 -2.0833333333333332e-11 1899 1398 -1.0416666666666666e-10 1899 1400 -2.0833333333333329e-11 1899 1403 -1.0416666666666661e-11 1899 1898 4.1666666666666652e-11 1899 1902 2.0833333333333326e-11 1899 1372 -4.1666666666666665e-11 1899 1373 1.3020149240672800e-27 1900 1900 2.9166666666666664e-10 1900 1896 -4.1666666666666665e-11 1900 1397 -1.5039633158038590e-27 1900 1398 -4.1666666666666658e-11 1900 1405 -1.0416666666666665e-11 1900 1408 1.1213657767716683e-27 1900 1901 4.1666666666666652e-11 1900 1372 -1.0416666666666666e-10 1901 1901 2.9166666666666659e-10 1901 1373 -1.3020149240672800e-27 1901 1898 4.1666666666666665e-11 1901 1400 -2.0833333333333332e-11 1901 1907 2.0833333333333336e-11 1901 1398 -1.0416666666666666e-10 1901 1405 -2.0833333333333329e-11 1901 1408 -1.0416666666666661e-11 1901 1900 4.1666666666666652e-11 1901 1372 -4.1666666666666658e-11 1902 1902 4.1666666666666662e-10 1902 1375 2.0833333333333329e-11 1902 1924 -2.0833333333333339e-11 1902 1904 8.3333333333333330e-11 1902 1419 2.0833333333333332e-11 1902 1398 -2.0833333333333329e-11 1902 1426 2.0833333333333326e-11 1902 1427 -1.0416666666666671e-11 1902 1909 2.0833333333333339e-11 1902 1402 -2.0833333333333329e-11 1902 1400 -6.2499999999999991e-11 1902 1923 2.0833333333333336e-11 1902 1403 3.5628902784306998e-27 1902 1899 2.0833333333333326e-11 1902 1898 -2.0833333333333332e-11 1902 1372 2.0833333333333329e-11 1902 1373 -1.0416666666666669e-11 1903 1903 4.1666666666666662e-10 1903 1268 2.0194839173657902e-27 1903 1905 8.0779356694631609e-27 1903 2192 2.6253290925755273e-27 1903 1652 -4.5860624244724788e-28 1903 1662 -1.0416666666666669e-11 1903 1654 6.2499999999999991e-11 1903 1267 -1.0416666666666673e-11 1903 1280 2.0194839173657902e-27 1903 1279 1.0416666666666661e-11 1903 1907 8.3333333333333330e-11 1903 2189 6.4623485355705287e-27 1903 1904 -2.0833333333333329e-11 1903 2174 4.1666666666666658e-11 1903 1373 -1.2500000000000001e-10 1903 1375 -4.1666666666666665e-11 1903 1378 -1.0416666666666655e-11 1904 1904 5.8333333333333339e-10 1904 1421 1.0416666666666666e-11 1904 1902 8.3333333333333330e-11 1904 1924 -1.8175355256292112e-27 1904 1427 -6.2499999999999991e-11 1904 1419 4.1666666666666665e-11 1904 1908 8.3333333333333330e-11 1904 1911 -1.8175355256292112e-27 1904 1278 1.0416666666666666e-11 1904 1267 -1.0416666666666667e-10 1904 1280 4.1666666666666665e-11 1904 1279 -5.2083333333333328e-11 1904 1903 -2.0833333333333329e-11 1904 2174 -1.2500000000000001e-10 1904 1373 -4.1666666666666665e-11 1904 1375 4.1666666666666671e-11 1904 1378 -1.0416666666666668e-11 1905 1905 4.1666666666666657e-10 1905 1279 1.8812360437258079e-27 1905 2192 1.0416666666666667e-10 1905 1903 6.0115145282367205e-27 1905 1654 -1.8812360437258079e-27 1905 1401 -2.0833333333333329e-11 1905 1653 2.0833333333333326e-11 1905 1652 8.3333333333333330e-11 1905 1662 -4.1170650643484606e-27 1905 1910 2.0833333333333339e-11 1905 1407 -2.0833333333333329e-11 1905 1400 -6.2499999999999991e-11 1905 2210 2.0833333333333336e-11 1905 1417 3.5628902784306998e-27 1905 1917 2.0833333333333326e-11 1905 1906 2.0833333333333332e-11 1905 1269 2.0833333333333329e-11 1905 1268 8.3333333333333330e-11 1905 1267 -5.4573397423189597e-27 1906 1906 2.9166666666666664e-10 1906 1417 -1.1000665323307010e-27 1906 1278 2.0833333333333332e-11 1906 1401 4.1666666666666665e-11 1906 1400 1.0416666666666665e-11 1906 1914 4.1666666666666665e-11 1906 1908 2.0833333333333336e-11 1906 1399 1.1213657767716683e-27 1906 1917 -4.1666666666666652e-11 1906 1905 2.0833333333333332e-11 1906 1269 1.0416666666666666e-10 1906 1268 2.0833333333333329e-11 1906 1267 1.0416666666666663e-11 1907 1907 4.5833333333333330e-10 1907 1654 5.2083333333333334e-11 1907 1407 -2.0833333333333329e-11 1907 1372 2.0833333333333326e-11 1907 1898 -2.0833333333333336e-11 1907 1398 -2.0833333333333329e-11 1907 1400 -6.2499999999999991e-11 1907 1901 2.0833333333333336e-11 1907 1408 3.5628902784306998e-27 1907 2211 2.0833333333333326e-11 1907 1910 2.0833333333333326e-11 1907 1653 2.0833333333333329e-11 1907 1662 1.0416666666666665e-11 1907 2189 4.1666666666666665e-11 1907 1903 8.3333333333333343e-11 1907 1373 1.0416666666666665e-11 1907 1378 1.0416666666666665e-11 1908 1908 4.1666666666666662e-10 1908 1419 2.0833333333333329e-11 1908 1911 -2.0833333333333339e-11 1908 1904 8.3333333333333330e-11 1908 1280 2.0833333333333332e-11 1908 1402 -2.0833333333333329e-11 1908 1269 2.0833333333333326e-11 1908 1278 7.2916666666666660e-11 1908 1267 -1.0416666666666668e-11 1908 1906 2.0833333333333336e-11 1908 1401 -2.0833333333333329e-11 1908 1400 -6.2499999999999991e-11 1908 1914 -2.0833333333333336e-11 1908 1399 3.5628902784306998e-27 1908 1913 -2.0833333333333326e-11 1908 1909 2.0833333333333326e-11 1908 1426 2.0833333333333329e-11 1908 1421 7.2916666666666660e-11 1908 1427 -1.0416666666666666e-11 1909 1909 2.9166666666666664e-10 1909 1923 -4.1666666666666665e-11 1909 1902 2.0833333333333339e-11 1909 1403 1.3233141685082473e-27 1909 1402 4.1666666666666665e-11 1909 1400 1.0416666666666665e-11 1909 1399 -1.1000665323307010e-27 1909 1913 4.1666666666666652e-11 1909 1908 2.0833333333333326e-11 1909 1426 1.0416666666666666e-10 1909 1421 2.0833333333333329e-11 1909 1427 1.0416666666666663e-11 1910 1910 2.9166666666666664e-10 1910 1652 2.0833333333333332e-11 1910 2210 -4.1666666666666665e-11 1910 1905 2.0833333333333339e-11 1910 1417 1.3233141685082473e-27 1910 1407 4.1666666666666665e-11 1910 1400 1.0416666666666665e-11 1910 1408 -1.1000665323307010e-27 1910 2211 -4.1666666666666652e-11 1910 1907 2.0833333333333326e-11 1910 1653 1.0416666666666666e-10 1910 1662 1.0416666666666663e-11 1911 1911 2.4999999999999996e-10 1911 1284 -1.0416666666666663e-11 1911 1427 -1.0416666666666663e-11 1911 1908 -2.0833333333333336e-11 1911 1904 -2.2913451068275814e-27 1911 1278 -6.2500000000000004e-11 1911 1267 -1.0416666666666666e-11 1911 1280 -2.0833333333333326e-11 1911 1912 2.0833333333333336e-11 1911 2175 -9.5018296033870872e-28 1911 1421 -6.2500000000000004e-11 1911 1420 -1.0416666666666666e-11 1911 1419 -2.0833333333333326e-11 1912 1912 4.1666666666666662e-10 1912 1280 -2.0833333333333329e-11 1912 1422 -2.0833333333333329e-11 1912 1736 -2.0833333333333339e-11 1912 1728 8.3333333333333330e-11 1912 1278 -8.3333333333333330e-11 1912 1284 2.0833333333333336e-11 1912 1283 -2.0833333333333332e-11 1912 1911 2.0833333333333339e-11 1912 2175 8.3333333333333330e-11 1912 1421 -8.3333333333333330e-11 1912 1420 2.0833333333333336e-11 1912 1419 -2.0833333333333332e-11 1913 1913 2.9166666666666659e-10 1913 1424 1.1000665323307010e-27 1913 1921 -4.1666666666666665e-11 1913 1415 2.0833333333333332e-11 1913 1916 -2.0833333333333336e-11 1913 1402 1.0416666666666666e-10 1913 1400 2.0833333333333329e-11 1913 1399 1.0416666666666661e-11 1913 1909 4.1666666666666652e-11 1913 1908 -2.0833333333333326e-11 1913 1426 4.1666666666666658e-11 1913 1421 1.0416666666666661e-11 1913 1427 -1.5039633158038590e-27 1914 1914 2.9166666666666664e-10 1914 1415 2.0833333333333329e-11 1914 1918 -4.1666666666666652e-11 1914 1916 -2.0833333333333326e-11 1914 1286 -1.3233141685082473e-27 1914 1269 4.1666666666666658e-11 1914 1278 1.0416666666666661e-11 1914 1267 1.3020149240672800e-27 1914 1906 4.1666666666666665e-11 1914 1401 1.0416666666666666e-10 1914 1400 2.0833333333333332e-11 1914 1908 -2.0833333333333336e-11 1914 1399 1.0416666666666661e-11 1915 1915 4.1666666666666662e-10 1915 1421 7.2916666666666660e-11 1915 1429 -1.0416666666666668e-11 1915 1278 7.2916666666666660e-11 1915 1285 -1.0416666666666666e-11 1915 1283 2.0833333333333329e-11 1915 1736 2.0833333333333339e-11 1915 1726 -8.3333333333333330e-11 1915 1422 2.0833333333333332e-11 1915 374 -2.0833333333333329e-11 1915 492 2.0833333333333326e-11 1915 1027 2.0833333333333336e-11 1915 382 -2.0833333333333329e-11 1915 373 -6.2499999999999991e-11 1915 1055 -2.0833333333333336e-11 1915 381 3.5628902784306998e-27 1915 1035 2.0833333333333326e-11 1915 1024 2.0833333333333326e-11 1915 291 2.0833333333333329e-11 1916 1916 4.1666666666666662e-10 1916 1278 6.2499999999999991e-11 1916 1286 -2.1169082391605852e-27 1916 1421 6.2499999999999991e-11 1916 1424 -2.1169082391605852e-27 1916 1401 -2.0833333333333329e-11 1916 1426 2.0833333333333326e-11 1916 1921 -2.0833333333333336e-11 1916 1402 -2.0833333333333329e-11 1916 1415 -6.2500000000000004e-11 1916 1913 -2.0833333333333336e-11 1916 1399 3.7324953730532174e-27 1916 1914 -2.0833333333333326e-11 1916 1918 -2.0833333333333326e-11 1916 1269 2.0833333333333329e-11 1916 382 -2.0833333333333329e-11 1916 291 2.0833333333333326e-11 1916 1038 -2.0833333333333336e-11 1916 374 -2.0833333333333329e-11 1916 380 -6.2500000000000004e-11 1916 1035 2.0833333333333336e-11 1916 381 3.7324953730532174e-27 1916 1055 -2.0833333333333326e-11 1916 1053 2.0833333333333326e-11 1916 492 2.0833333333333329e-11 1917 1917 2.9166666666666664e-10 1917 1400 -2.0833333333333329e-11 1917 1288 -1.1000665323307010e-27 1917 1920 4.1666666666666665e-11 1917 1401 -1.0416666666666666e-10 1917 1409 -2.0833333333333332e-11 1917 2215 2.0833333333333336e-11 1917 1417 -1.0416666666666661e-11 1917 1906 -4.1666666666666652e-11 1917 1905 2.0833333333333326e-11 1917 1269 -4.1666666666666665e-11 1917 1268 -1.0416666666666665e-11 1917 1267 1.3020149240672800e-27 1918 1918 2.9166666666666664e-10 1918 1287 -2.0833333333333332e-11 1918 1919 4.1666666666666665e-11 1918 2264 -2.0833333333333336e-11 1918 1416 -1.5039633158038590e-27 1918 1401 -4.1666666666666658e-11 1918 1415 -1.0416666666666665e-11 1918 1399 1.1213657767716683e-27 1918 1914 -4.1666666666666652e-11 1918 1916 -2.0833333333333326e-11 1918 1269 -1.0416666666666666e-10 1918 1278 -2.0833333333333329e-11 1918 1286 -1.0416666666666663e-11 1919 1919 2.9166666666666664e-10 1919 1409 -2.0833333333333329e-11 1919 1920 4.1666666666666652e-11 1919 2216 2.0833333333333326e-11 1919 1288 1.1000665323307010e-27 1919 1269 -4.1666666666666665e-11 1919 1287 -1.0416666666666665e-11 1919 1286 -1.3233141685082473e-27 1919 1918 4.1666666666666665e-11 1919 1401 -1.0416666666666666e-10 1919 1415 -2.0833333333333332e-11 1919 2264 2.0833333333333339e-11 1919 1416 -1.0416666666666663e-11 1920 1920 2.9166666666666659e-10 1920 1268 -2.0833333333333332e-11 1920 1917 4.1666666666666665e-11 1920 2215 -2.0833333333333336e-11 1920 1417 -1.1000665323307010e-27 1920 1401 -4.1666666666666658e-11 1920 1409 -1.0416666666666661e-11 1920 1416 1.5039633158038590e-27 1920 1919 4.1666666666666652e-11 1920 2216 -2.0833333333333326e-11 1920 1269 -1.0416666666666666e-10 1920 1287 -2.0833333333333329e-11 1920 1288 -1.0416666666666661e-11 1921 1921 2.9166666666666659e-10 1921 1418 1.3020149240672800e-27 1921 1421 -2.0833333333333332e-11 1921 1402 -4.1666666666666665e-11 1921 1415 -1.0416666666666665e-11 1921 1913 -4.1666666666666665e-11 1921 1916 -2.0833333333333336e-11 1921 1399 -1.1000665323307010e-27 1921 1922 4.1666666666666652e-11 1921 2265 -2.0833333333333326e-11 1921 1426 -1.0416666666666666e-10 1921 1424 -1.0416666666666661e-11 1922 1922 2.9166666666666664e-10 1922 1883 -4.1666666666666665e-11 1922 1394 -2.0833333333333332e-11 1922 1402 -1.0416666666666666e-10 1922 1415 -2.0833333333333329e-11 1922 1418 -1.0416666666666663e-11 1922 1921 4.1666666666666652e-11 1922 2265 2.0833333333333332e-11 1922 1426 -4.1666666666666665e-11 1922 1424 1.1000665323307010e-27 1923 1923 2.9166666666666664e-10 1923 1394 -2.0833333333333329e-11 1923 1883 -4.1666666666666652e-11 1923 1426 -4.1666666666666658e-11 1923 1427 -1.5039633158038590e-27 1923 1909 -4.1666666666666665e-11 1923 1402 -1.0416666666666666e-10 1923 1400 -2.0833333333333332e-11 1923 1902 2.0833333333333336e-11 1923 1403 -1.0416666666666663e-11 1924 1924 2.4999999999999996e-10 1924 1373 -1.0416666666666666e-11 1924 1902 -2.0833333333333339e-11 1924 1904 -2.2913451068275814e-27 1924 1427 -1.0416666666666666e-11 1924 1419 -2.0833333333333326e-11 1924 2176 -9.5018296033870872e-28 1924 1375 -2.0833333333333326e-11 1925 1925 2.0833333333333331e-10 1926 1926 2.0833333541666665e-02 1926 1930 8.3333333333333315e-03 1926 1478 -2.0833333333333329e-11 1926 1466 2.0833333333333329e-11 1926 1467 -1.0416666666666671e-03 1926 1934 2.0833333333333336e-11 1926 1476 -2.0833333333333326e-11 1926 1474 -6.2499999999999991e-11 1926 1947 2.0833333333333336e-11 1926 1477 2.1169082391605852e-27 1926 1949 -2.0833333333333326e-11 1926 1927 2.0833333333333326e-11 1926 1435 2.0833333333333329e-11 1926 1434 -1.0416666666666664e-03 1926 3948 2.0833333333333333e-03 1926 4587 2.0833333333333337e-03 1926 3973 2.0833333333333329e-03 1926 3975 4.1666666979166666e-03 1926 3950 4.1666666979166657e-03 1927 1927 2.9166666666666659e-10 1927 1953 -4.1666666666666665e-11 1927 1929 2.0833333333333336e-11 1927 1483 1.3020149240672800e-27 1927 1478 4.1666666666666658e-11 1927 1474 1.0416666666666661e-11 1927 1477 -1.3233141685082473e-27 1927 1949 4.1666666666666652e-11 1927 1926 2.0833333333333326e-11 1927 1435 1.0416666666666666e-10 1927 1434 1.0416666666666661e-11 1927 3950 2.0833333333333329e-11 1928 1928 4.1666666666666657e-02 1928 1456 2.1684043449710089e-19 1928 1450 2.1684043449710089e-19 1928 1451 -1.0416666666666675e-03 1928 1455 1.0416666666666662e-03 1928 1931 2.3039296165316969e-19 1928 2135 -8.1315162936412833e-20 1928 1505 4.9904357809065860e-20 1928 1509 -1.0416666666666671e-03 1928 1499 6.2499999999999995e-03 1928 1930 -2.0833333333333329e-03 1928 2133 -4.1666666666666657e-03 1928 1929 8.3333333333333315e-03 1928 1976 -4.3368086899420177e-19 1928 1434 -1.2499999999999999e-02 1928 1439 -1.0416666666666654e-03 1928 3948 -4.1666666666666666e-03 1929 1929 2.5000000208333328e-02 1929 1482 -2.0833333333333329e-11 1929 1435 2.0833333333333329e-11 1929 1927 2.0833333333333336e-11 1929 1478 -2.0833333333333326e-11 1929 1474 -6.2499999999999991e-11 1929 1953 2.0833333333333336e-11 1929 1483 2.1169082391605852e-27 1929 1975 2.0833333333333326e-11 1929 1935 2.0833333333333326e-11 1929 1506 2.0833333333333329e-11 1929 1509 1.0416666666666667e-03 1929 1499 5.2083333333333330e-03 1929 1976 -4.1666666666666675e-03 1929 1928 8.3333333333333315e-03 1929 1434 1.0416666666666662e-03 1929 1439 1.0416666666666664e-03 1930 1930 5.8333333333333313e-02 1930 1455 -5.2083333333333330e-03 1930 1463 1.0416666666666669e-03 1930 1926 8.3333333333333315e-03 1930 1467 -6.2500000000000003e-03 1930 1933 8.3333333333333315e-03 1930 1936 2.7105054312137611e-20 1930 1454 1.0416666666666667e-03 1930 1451 -1.0416666666666664e-02 1930 1456 4.1666666666666666e-03 1930 1928 -2.0833333333333320e-03 1930 2133 1.2499999999999999e-02 1930 1434 -4.1666666666666666e-03 1930 1439 -1.0416666666666667e-03 1930 3950 1.0416666666666669e-03 1930 4587 -2.7105054312137611e-20 1930 3975 1.0416666666666667e-03 1930 3973 4.1666666666666666e-03 1930 3948 4.1666666666666675e-03 1931 1931 2.0833333541666669e-02 1931 1475 -2.0833333333333329e-11 1931 1506 2.0833333333333329e-11 1931 1935 2.0833333333333336e-11 1931 1482 -2.0833333333333326e-11 1931 1474 -6.2499999999999991e-11 1931 1974 2.0833333333333336e-11 1931 1498 2.1169082391605852e-27 1931 1455 2.1705219273391446e-19 1931 2135 1.0416666666666666e-02 1931 1928 2.6946235634527430e-19 1931 1505 5.2083333645833330e-03 1931 1509 -3.9244095088696636e-19 1931 1499 -2.1705219273391446e-19 1931 1941 2.0833333333333326e-11 1931 1932 2.0833333333333326e-11 1931 1452 2.0833333333333329e-11 1931 1450 5.2083333645833330e-03 1931 1451 1.2297859080919669e-19 1932 1932 2.9166666666666659e-10 1932 1498 -1.3233141685082473e-27 1932 1454 2.0833333333333332e-11 1932 1475 4.1666666666666658e-11 1932 1474 1.0416666666666661e-11 1932 1939 4.1666666666666665e-11 1932 1933 2.0833333333333336e-11 1932 1473 1.3020149240672800e-27 1932 1941 -4.1666666666666652e-11 1932 1931 2.0833333333333326e-11 1932 1452 1.0416666666666666e-10 1932 1450 2.0833333333333329e-11 1932 1451 1.0416666666666661e-11 1933 1933 2.0833333541666665e-02 1933 1936 -2.0833333333333333e-03 1933 1930 8.3333333333333315e-03 1933 1456 2.0833333333333329e-03 1933 1476 -2.0833333333333329e-11 1933 1452 2.0833333333333329e-11 1933 1454 4.1666666979166666e-03 1933 1451 -1.0416666666666671e-03 1933 1932 2.0833333333333336e-11 1933 1475 -2.0833333333333326e-11 1933 1474 -6.2499999999999991e-11 1933 1939 -2.0833333333333336e-11 1933 1473 2.1169082391605852e-27 1933 1938 -2.0833333333333326e-11 1933 1934 2.0833333333333326e-11 1933 1466 2.0833333333333329e-11 1933 1463 4.1666666979166657e-03 1933 1467 -1.0416666666666664e-03 1933 3973 2.0833333333333333e-03 1934 1934 2.9166666666666659e-10 1934 1947 -4.1666666666666665e-11 1934 1926 2.0833333333333336e-11 1934 1477 1.1000665323307010e-27 1934 1476 4.1666666666666658e-11 1934 1474 1.0416666666666661e-11 1934 1473 -1.5039633158038590e-27 1934 1938 4.1666666666666652e-11 1934 1933 2.0833333333333326e-11 1934 1466 1.0416666666666666e-10 1934 1463 2.0833333333333329e-11 1934 1467 1.0416666666666661e-11 1934 3975 2.0833333333333332e-11 1935 1935 2.9166666666666659e-10 1935 1505 2.0833333333333332e-11 1935 1974 -4.1666666666666665e-11 1935 1931 2.0833333333333336e-11 1935 1498 1.1000665323307010e-27 1935 1482 4.1666666666666658e-11 1935 1474 1.0416666666666661e-11 1935 1483 -1.5039633158038590e-27 1935 1975 -4.1666666666666652e-11 1935 1929 2.0833333333333326e-11 1935 1506 1.0416666666666666e-10 1935 1509 1.0416666666666661e-11 1936 1936 2.4999999999999998e-02 1936 1457 -1.0416666666666664e-03 1936 1467 -1.0416666666666664e-03 1936 1933 -2.0833333333333337e-03 1936 1930 6.0159191589756597e-20 1936 1454 -6.2500000000000003e-03 1936 1451 -1.0416666666666664e-03 1936 1456 -2.0833333333333329e-03 1936 1937 -2.0833333333333337e-03 1936 1463 -6.2500000000000003e-03 1936 4592 1.0254392617697373e-19 1936 3972 -1.0416666666666664e-03 1936 3973 -2.0833333333333329e-03 1937 1937 4.1666666666666664e-02 1937 1463 8.3333333333333315e-03 1937 1454 8.3333333333333315e-03 1937 1457 -2.0833333333333337e-03 1937 1456 2.0833333333333333e-03 1937 1936 -2.0833333333333337e-03 1937 3972 -2.0833333333333337e-03 1937 3971 2.0833333333333333e-03 1937 1014 2.0833333333333337e-03 1937 4597 -8.3333333333333315e-03 1937 431 2.0833333333333329e-03 1937 4592 -8.3333333333333315e-03 1937 3973 2.0833333333333329e-03 1938 1938 2.9166666666666664e-10 1938 1464 1.3233141685082473e-27 1938 1945 -4.1666666666666665e-11 1938 1494 2.0833333333333332e-11 1938 1940 -2.0833333333333339e-11 1938 1476 1.0416666666666666e-10 1938 1474 2.0833333333333329e-11 1938 1473 1.0416666666666663e-11 1938 1934 4.1666666666666652e-11 1938 1933 -2.0833333333333326e-11 1938 1466 4.1666666666666665e-11 1938 1463 1.0416666666666665e-11 1938 1467 -1.1000665323307010e-27 1939 1939 2.9166666666666664e-10 1939 1494 2.0833333333333329e-11 1939 1942 -4.1666666666666652e-11 1939 1940 -2.0833333333333332e-11 1939 1459 -1.1000665323307010e-27 1939 1452 4.1666666666666665e-11 1939 1454 1.0416666666666665e-11 1939 1451 1.1213657767716683e-27 1939 1932 4.1666666666666665e-11 1939 1475 1.0416666666666666e-10 1939 1474 2.0833333333333332e-11 1939 1933 -2.0833333333333336e-11 1939 1473 1.0416666666666663e-11 1940 1940 4.1666666666666662e-10 1940 1674 -2.0833333333333329e-11 1940 1454 6.2499999999999991e-11 1940 1459 -3.5628902784306998e-27 1940 1673 -6.2499999999999991e-11 1940 2282 2.0833333333333326e-11 1940 1470 2.0833333333333329e-11 1940 1463 6.2499999999999991e-11 1940 1464 -3.5628902784306998e-27 1940 1475 -2.0833333333333329e-11 1940 1466 2.0833333333333329e-11 1940 1945 -2.0833333333333336e-11 1940 1476 -2.0833333333333326e-11 1940 1494 -6.2499999999999991e-11 1940 1938 -2.0833333333333339e-11 1940 1473 3.5628902784306998e-27 1940 1939 -2.0833333333333332e-11 1940 1942 -2.0833333333333326e-11 1940 1452 2.0833333333333329e-11 1940 430 2.0833333333333329e-11 1940 1062 -2.0833333333333336e-11 1940 303 -2.0833333333333326e-11 1940 1016 -2.0833333333333339e-11 1940 308 3.5628902784306998e-27 1940 704 2.0833333333333332e-11 1941 1941 2.9166666666666664e-10 1941 1474 -2.0833333333333329e-11 1941 1461 -1.5039633158038590e-27 1941 1944 4.1666666666666665e-11 1941 1475 -1.0416666666666666e-10 1941 1497 -2.0833333333333332e-11 1941 2147 -2.0833333333333336e-11 1941 1498 -1.0416666666666663e-11 1941 1932 -4.1666666666666652e-11 1941 1931 2.0833333333333326e-11 1941 1452 -4.1666666666666658e-11 1941 1450 -1.0416666666666665e-11 1941 1451 1.1213657767716683e-27 1942 1942 2.9166666666666659e-10 1942 1460 -2.0833333333333332e-11 1942 1943 4.1666666666666665e-11 1942 2280 -2.0833333333333336e-11 1942 1496 -1.1000665323307010e-27 1942 1475 -4.1666666666666665e-11 1942 1494 -1.0416666666666665e-11 1942 1473 1.3020149240672800e-27 1942 1939 -4.1666666666666652e-11 1942 1940 -2.0833333333333326e-11 1942 1452 -1.0416666666666666e-10 1942 1454 -2.0833333333333329e-11 1942 1459 -1.0416666666666661e-11 1943 1943 2.9166666666666664e-10 1943 1497 -2.0833333333333329e-11 1943 1944 4.1666666666666652e-11 1943 2285 -2.0833333333333326e-11 1943 1461 1.5039633158038590e-27 1943 1452 -4.1666666666666658e-11 1943 1460 -1.0416666666666661e-11 1943 1459 -1.1000665323307010e-27 1943 1942 4.1666666666666665e-11 1943 1475 -1.0416666666666666e-10 1943 1494 -2.0833333333333332e-11 1943 2280 2.0833333333333336e-11 1943 1496 -1.0416666666666661e-11 1944 1944 2.9166666666666664e-10 1944 1450 -2.0833333333333332e-11 1944 1941 4.1666666666666665e-11 1944 2147 2.0833333333333339e-11 1944 1498 -1.3233141685082473e-27 1944 1475 -4.1666666666666665e-11 1944 1497 -1.0416666666666665e-11 1944 1496 1.1000665323307010e-27 1944 1943 4.1666666666666652e-11 1944 2285 2.0833333333333326e-11 1944 1452 -1.0416666666666666e-10 1944 1460 -2.0833333333333329e-11 1944 1461 -1.0416666666666663e-11 1945 1945 2.9166666666666664e-10 1945 1463 -2.0833333333333332e-11 1945 1938 -4.1666666666666665e-11 1945 1940 -2.0833333333333336e-11 1945 1473 -1.5039633158038590e-27 1945 1476 -4.1666666666666658e-11 1945 1494 -1.0416666666666665e-11 1945 1495 1.1213657767716683e-27 1945 1946 4.1666666666666652e-11 1945 2278 -2.0833333333333326e-11 1945 1466 -1.0416666666666666e-10 1945 1465 -2.0833333333333329e-11 1945 1464 -1.0416666666666663e-11 1946 1946 2.9166666666666659e-10 1946 1469 -1.3020149240672800e-27 1946 1948 4.1666666666666665e-11 1946 1491 -2.0833333333333332e-11 1946 2270 2.0833333333333336e-11 1946 1476 -1.0416666666666666e-10 1946 1494 -2.0833333333333329e-11 1946 1495 -1.0416666666666661e-11 1946 1945 4.1666666666666652e-11 1946 2278 2.0833333333333326e-11 1946 1466 -4.1666666666666658e-11 1946 1465 -1.0416666666666661e-11 1946 1464 1.3233141685082473e-27 1947 1947 2.9166666666666664e-10 1947 1491 -2.0833333333333329e-11 1947 1948 4.1666666666666652e-11 1947 1951 -2.0833333333333326e-11 1947 1469 1.3020149240672800e-27 1947 1466 -4.1666666666666665e-11 1947 1467 -1.1000665323307010e-27 1947 1934 -4.1666666666666665e-11 1947 1476 -1.0416666666666666e-10 1947 1474 -2.0833333333333332e-11 1947 1926 2.0833333333333336e-11 1947 1477 -1.0416666666666661e-11 1947 3975 -1.0416666666666665e-11 1948 1948 2.9166666666666664e-10 1948 1465 -2.0833333333333332e-11 1948 1946 4.1666666666666665e-11 1948 2270 -2.0833333333333336e-11 1948 1495 -1.1213657767716683e-27 1948 1476 -4.1666666666666665e-11 1948 1491 -1.0416666666666665e-11 1948 1477 1.1000665323307010e-27 1948 1947 4.1666666666666652e-11 1948 1951 2.0833333333333332e-11 1948 1466 -1.0416666666666666e-10 1948 1469 -1.0416666666666663e-11 1948 3975 -2.0833333333333329e-11 1949 1949 2.9166666666666664e-10 1949 1440 1.5039633158038590e-27 1949 1954 -4.1666666666666665e-11 1949 1491 2.0833333333333332e-11 1949 1951 2.0833333333333336e-11 1949 1478 1.0416666666666666e-10 1949 1474 2.0833333333333329e-11 1949 1477 1.0416666666666663e-11 1949 1927 4.1666666666666652e-11 1949 1926 -2.0833333333333326e-11 1949 1435 4.1666666666666658e-11 1949 1434 -1.1213657767716683e-27 1949 3950 1.0416666666666665e-11 1950 1950 4.5833333333333330e-10 1950 1442 -1.0416666666666668e-11 1950 1810 -4.1666666666666671e-11 1950 1471 -5.2083333333333334e-11 1950 1802 8.3333333333333330e-11 1950 1468 -1.6155871338926322e-27 1950 2074 8.3333333333333330e-11 1950 1438 4.8467614016778965e-27 1950 3975 -1.3541666666666666e-10 1950 3969 -2.0833333333333332e-11 1950 4615 -2.0833333333333339e-11 1950 3950 -7.2916666666666660e-11 1950 3953 -2.0833333333333332e-11 1951 1951 4.5833333333333330e-10 1951 1471 -5.2083333333333334e-11 1951 1810 -4.1666666666666665e-11 1951 1809 8.3333333333333330e-11 1951 1442 -1.0416666666666665e-11 1951 1476 2.0833333333333329e-11 1951 1435 -2.0833333333333326e-11 1951 1440 -1.0416666666666657e-11 1951 1954 2.0833333333333339e-11 1951 1478 2.0833333333333329e-11 1951 1491 6.2499999999999991e-11 1951 1949 2.0833333333333336e-11 1951 1477 -3.5628902784306998e-27 1951 1947 -2.0833333333333326e-11 1951 1948 2.0833333333333332e-11 1951 1466 -2.0833333333333329e-11 1951 1469 -1.0416666666666653e-11 1951 3950 -6.2499999999999991e-11 1951 3975 -1.2500000000000001e-10 1952 1952 2.9166666666666659e-10 1952 1955 4.1666666666666665e-11 1952 1489 -1.1000665323307010e-27 1952 1478 -4.1666666666666665e-11 1952 1480 -1.0416666666666665e-11 1952 1483 1.3020149240672800e-27 1952 1953 4.1666666666666652e-11 1952 1435 -1.0416666666666666e-10 1953 1953 2.9166666666666664e-10 1953 1434 -1.1213657767716683e-27 1953 1927 -4.1666666666666665e-11 1953 1474 -2.0833333333333332e-11 1953 1929 2.0833333333333336e-11 1953 1478 -1.0416666666666666e-10 1953 1480 -2.0833333333333329e-11 1953 1483 -1.0416666666666663e-11 1953 1952 4.1666666666666652e-11 1953 1435 -4.1666666666666665e-11 1954 1954 2.9166666666666664e-10 1954 1949 -4.1666666666666665e-11 1954 1951 2.0833333333333339e-11 1954 1477 -1.3233141685082473e-27 1954 1478 -4.1666666666666665e-11 1954 1491 -1.0416666666666665e-11 1954 1489 1.1000665323307010e-27 1954 1955 4.1666666666666652e-11 1954 2233 2.0833333333333326e-11 1954 1435 -1.0416666666666666e-10 1954 1440 -1.0416666666666663e-11 1954 3950 -2.0833333333333332e-11 1955 1955 2.9166666666666664e-10 1955 1491 -2.0833333333333329e-11 1955 1952 4.1666666666666665e-11 1955 1478 -1.0416666666666666e-10 1955 1480 -2.0833333333333332e-11 1955 1489 -1.0416666666666661e-11 1955 1954 4.1666666666666652e-11 1955 2233 -2.0833333333333326e-11 1955 1435 -4.1666666666666658e-11 1955 1440 1.5039633158038590e-27 1956 1956 2.0833333333333331e-10 1957 1957 2.0833333333333331e-10 1958 1958 2.9166666666666659e-10 1958 1487 -1.3020149240672800e-27 1958 1481 4.1666666666666665e-11 1958 1480 1.0416666666666665e-11 1958 1968 4.1666666666666665e-11 1958 1479 1.1000665323307010e-27 1958 1969 -4.1666666666666652e-11 1958 1318 1.0416666666666666e-10 1959 1959 2.0833333333333331e-10 1960 1960 2.9166666666666664e-10 1960 1975 -4.1666666666666665e-11 1960 1483 1.5039633158038590e-27 1960 1482 4.1666666666666658e-11 1960 1480 1.0416666666666665e-11 1960 1479 -1.1213657767716683e-27 1960 1967 4.1666666666666652e-11 1960 1506 1.0416666666666666e-10 1961 1961 2.0833333333333331e-10 1962 1962 2.9166666666666664e-10 1962 2203 4.1666666666666665e-11 1962 1487 1.5039633158038590e-27 1962 1488 4.1666666666666658e-11 1962 1480 1.0416666666666665e-11 1962 1489 -1.1213657767716683e-27 1962 2230 -4.1666666666666652e-11 1962 1651 1.0416666666666666e-10 1963 1963 4.1666666666666662e-10 1963 1481 2.0833333333333329e-11 1963 1506 -2.0833333333333326e-11 1963 1973 2.0833333333333336e-11 1963 1482 2.0833333333333329e-11 1963 1497 6.2499999999999991e-11 1963 1967 2.0833333333333336e-11 1963 1479 -3.5628902784306998e-27 1963 1968 2.0833333333333326e-11 1963 1972 2.0833333333333326e-11 1963 1318 -2.0833333333333329e-11 1963 1131 2.0833333333333329e-11 1963 1327 -2.0833333333333326e-11 1963 1332 2.1169082391605852e-27 1963 2297 2.0833333333333336e-11 1963 1124 2.0833333333333329e-11 1963 1129 6.2499999999999991e-11 1963 1966 2.0833333333333336e-11 1963 1130 -3.5628902784306998e-27 1963 1964 2.0833333333333326e-11 1963 2308 -2.0833333333333326e-11 1963 1504 -2.0833333333333329e-11 1963 1502 2.1169082391605852e-27 1964 1964 2.9166666666666659e-10 1964 2291 4.1666666666666665e-11 1964 1123 2.0833333333333332e-11 1964 1131 1.0416666666666666e-10 1964 1129 2.0833333333333329e-11 1964 1130 1.0416666666666661e-11 1964 2308 4.1666666666666652e-11 1964 1963 2.0833333333333326e-11 1964 1504 4.1666666666666658e-11 1964 1502 -1.5039633158038590e-27 1965 1965 2.0833333333333331e-10 1966 1966 2.9166666666666664e-10 1966 1123 2.0833333333333329e-11 1966 1332 1.3020149240672800e-27 1966 2297 -4.1666666666666665e-11 1966 1124 1.0416666666666666e-10 1966 1129 2.0833333333333332e-11 1966 1963 2.0833333333333336e-11 1966 1130 1.0416666666666661e-11 1966 2288 4.1666666666666652e-11 1966 1327 4.1666666666666658e-11 1967 1967 2.9166666666666659e-10 1967 1502 1.3020149240672800e-27 1967 1973 -4.1666666666666665e-11 1967 1497 2.0833333333333332e-11 1967 1963 2.0833333333333336e-11 1967 1482 1.0416666666666666e-10 1967 1480 2.0833333333333329e-11 1967 1479 1.0416666666666661e-11 1967 1960 4.1666666666666652e-11 1967 1506 4.1666666666666658e-11 1968 1968 2.9166666666666664e-10 1968 1497 2.0833333333333329e-11 1968 1972 -4.1666666666666652e-11 1968 1963 2.0833333333333326e-11 1968 1332 -1.5039633158038590e-27 1968 1318 4.1666666666666658e-11 1968 1958 4.1666666666666665e-11 1968 1481 1.0416666666666666e-10 1968 1480 2.0833333333333332e-11 1968 1479 1.0416666666666661e-11 1969 1969 2.9166666666666664e-10 1969 1480 -2.0833333333333329e-11 1969 1328 -1.1213657767716683e-27 1969 1970 4.1666666666666665e-11 1969 1481 -1.0416666666666666e-10 1969 1485 -2.0833333333333332e-11 1969 2202 -2.0833333333333336e-11 1969 1487 -1.0416666666666663e-11 1969 1958 -4.1666666666666652e-11 1969 1318 -4.1666666666666665e-11 1970 1970 2.9166666666666659e-10 1970 1969 4.1666666666666665e-11 1970 2202 2.0833333333333336e-11 1970 1487 -1.3020149240672800e-27 1970 1481 -4.1666666666666658e-11 1970 1485 -1.0416666666666661e-11 1970 1484 1.3233141685082473e-27 1970 1971 4.1666666666666652e-11 1970 2213 -2.0833333333333326e-11 1970 1318 -1.0416666666666666e-10 1970 1329 -2.0833333333333329e-11 1970 1328 -1.0416666666666661e-11 1971 1971 2.9166666666666664e-10 1971 1332 -1.5039633158038590e-27 1971 1972 4.1666666666666665e-11 1971 1497 -2.0833333333333332e-11 1971 2223 -2.0833333333333336e-11 1971 1481 -1.0416666666666666e-10 1971 1485 -2.0833333333333329e-11 1971 1484 -1.0416666666666663e-11 1971 1970 4.1666666666666652e-11 1971 2213 2.0833333333333326e-11 1971 1318 -4.1666666666666658e-11 1971 1329 -1.0416666666666665e-11 1971 1328 1.1213657767716683e-27 1972 1972 2.9166666666666664e-10 1972 1329 -2.0833333333333332e-11 1972 1971 4.1666666666666665e-11 1972 2223 2.0833333333333339e-11 1972 1484 -1.3233141685082473e-27 1972 1481 -4.1666666666666665e-11 1972 1497 -1.0416666666666665e-11 1972 1479 1.1000665323307010e-27 1972 1968 -4.1666666666666652e-11 1972 1963 2.0833333333333326e-11 1972 1318 -1.0416666666666666e-10 1972 1332 -1.0416666666666663e-11 1973 1973 2.9166666666666664e-10 1973 1498 1.1000665323307010e-27 1973 1482 -4.1666666666666665e-11 1973 1497 -1.0416666666666665e-11 1973 1967 -4.1666666666666665e-11 1973 1963 2.0833333333333336e-11 1973 1479 -1.1213657767716683e-27 1973 1974 4.1666666666666652e-11 1973 2147 2.0833333333333332e-11 1973 1506 -1.0416666666666666e-10 1973 1505 -2.0833333333333329e-11 1973 1502 -1.0416666666666663e-11 1974 1974 2.9166666666666659e-10 1974 1509 -1.1000665323307010e-27 1974 1935 -4.1666666666666665e-11 1974 1474 -2.0833333333333332e-11 1974 1931 2.0833333333333336e-11 1974 1482 -1.0416666666666666e-10 1974 1497 -2.0833333333333329e-11 1974 1498 -1.0416666666666661e-11 1974 1973 4.1666666666666652e-11 1974 2147 -2.0833333333333326e-11 1974 1506 -4.1666666666666665e-11 1974 1505 -1.0416666666666665e-11 1974 1502 1.3020149240672800e-27 1975 1975 2.9166666666666664e-10 1975 1474 -2.0833333333333329e-11 1975 1935 -4.1666666666666652e-11 1975 1929 2.0833333333333326e-11 1975 1509 1.1000665323307010e-27 1975 1506 -4.1666666666666665e-11 1975 1960 -4.1666666666666665e-11 1975 1482 -1.0416666666666666e-10 1975 1480 -2.0833333333333332e-11 1975 1483 -1.0416666666666663e-11 1976 1976 3.3333333333333326e-02 1976 2136 -8.6736173798840355e-19 1976 1509 4.0939925783957855e-21 1976 1499 -6.2499999999999986e-03 1976 1929 -4.1666666666666666e-03 1976 1928 -4.3368086899420177e-19 1976 1434 -4.1666666666666666e-03 1976 1439 -6.2499999999999986e-03 1977 1977 2.4999999999999991e-02 1978 1978 6.6666666666666664e-10 1978 1191 -1.0416666666666666e-11 1978 1997 -8.3333333333333330e-11 1978 1981 -1.8175355256292112e-27 1978 1200 6.2499999999999991e-11 1978 1194 -4.1666666666666665e-11 1978 1998 -8.3333333333333330e-11 1978 1980 1.6155871338926322e-27 1978 1220 -1.0416666666666666e-11 1978 1213 -1.0416666666666666e-11 1978 1212 6.2499999999999991e-11 1978 1217 -4.1666666666666665e-11 1978 1988 8.3333333333333330e-11 1978 1983 -1.8175355256292112e-27 1978 1525 -1.0416666666666666e-11 1978 1526 6.2499999999999991e-11 1978 1994 -8.3333333333333330e-11 1978 1515 6.2499999999999991e-11 1978 4305 -4.1666666666666665e-11 1978 4704 1.6155871338926322e-27 1978 4107 -4.1666666666666665e-11 1979 1979 6.6666666666666664e-10 1979 2320 -8.3333333333333330e-11 1979 1984 -1.8175355256292112e-27 1979 1689 6.2499999999999991e-11 1979 2321 -8.3333333333333330e-11 1979 1220 -1.0416666666666666e-11 1979 1523 6.2499999999999991e-11 1979 1992 8.3333333333333330e-11 1979 1982 -1.8175355256292112e-27 1979 1227 6.2499999999999991e-11 1979 1217 -4.1666666666666665e-11 1979 2088 8.3333333333333330e-11 1979 1980 -1.8175355256292112e-27 1979 1191 -1.0416666666666666e-11 1979 1195 6.2499999999999991e-11 1979 1194 -4.1666666666666665e-11 1979 4356 -1.0416666666666666e-11 1979 4364 -4.1666666666666665e-11 1979 4706 -1.8175355256292112e-27 1979 4071 -1.0416666666666666e-11 1979 4068 -1.0416666666666666e-11 1979 4060 -4.1666666666666665e-11 1979 4316 -1.0416666666666666e-11 1980 1980 2.4999999999999996e-10 1980 1227 1.0416666666666663e-11 1980 1200 1.0416666666666663e-11 1980 1998 2.0833333333333336e-11 1980 1978 9.5018296033870872e-28 1980 1220 6.2500000000000004e-11 1980 1212 1.0416666666666666e-11 1980 1217 2.0833333333333326e-11 1980 2088 -2.0833333333333336e-11 1980 1979 -2.2913451068275814e-27 1980 1191 6.2500000000000004e-11 1980 1195 1.0416666666666666e-11 1980 1194 2.0833333333333326e-11 1981 1981 2.4999999999999996e-10 1981 1515 1.0416666666666666e-11 1981 1997 2.0833333333333339e-11 1981 1978 -2.2913451068275814e-27 1981 1200 1.0416666666666666e-11 1981 1194 2.0833333333333326e-11 1981 4705 9.5018296033870872e-28 1981 4107 2.0833333333333326e-11 1982 1982 2.4999999999999996e-10 1982 1523 1.0416666666666666e-11 1982 1992 -2.0833333333333339e-11 1982 1979 -2.2913451068275814e-27 1982 1227 1.0416666666666666e-11 1982 1218 1.0416666666666665e-11 1982 1217 2.0833333333333326e-11 1982 1986 2.0833333333333336e-11 1982 4316 6.2499999999999991e-11 1982 4699 9.5018296033870872e-28 1982 4068 6.2500000000000004e-11 1982 4066 1.0416666666666665e-11 1982 4060 2.0833333333333326e-11 1983 1983 2.4999999999999996e-10 1983 1212 1.0416666666666666e-11 1983 1988 -2.0833333333333339e-11 1983 1978 -2.2913451068275814e-27 1983 1526 1.0416666666666666e-11 1983 1525 6.2499999999999991e-11 1983 1985 2.0833333333333332e-11 1983 1213 6.2499999999999991e-11 1983 1218 1.0416666666666665e-11 1983 1217 2.0833333333333326e-11 1983 4306 1.0416666666666665e-11 1983 4305 2.0833333333333326e-11 1983 4699 9.5018296033870872e-28 1984 1984 2.4999999999999996e-10 1984 1195 1.0416666666666666e-11 1984 1194 2.0833333333333326e-11 1984 2320 2.0833333333333339e-11 1984 1979 -2.2913451068275814e-27 1984 1689 1.0416666666666666e-11 1984 4705 9.5018296033870872e-28 1984 4364 2.0833333333333326e-11 1985 1985 4.1666666666666662e-10 1985 1983 2.0833333333333336e-11 1985 1213 8.3333333333333330e-11 1985 1218 -2.0833333333333336e-11 1985 1217 2.0833333333333332e-11 1985 1989 -2.0833333333333336e-11 1985 1525 8.3333333333333330e-11 1985 4313 2.0833333333333332e-11 1985 4305 2.0833333333333332e-11 1985 4699 -8.3333333333333330e-11 1985 4985 -8.3333333333333330e-11 1985 4306 -2.0833333333333336e-11 1985 4308 2.0833333333333332e-11 1986 1986 4.1666666666666662e-10 1986 1218 -2.0833333333333336e-11 1986 1217 2.0833333333333332e-11 1986 1982 2.0833333333333339e-11 1986 4064 2.0833333333333332e-11 1986 4987 2.0833333333333339e-11 1986 4985 -8.3333333333333330e-11 1986 4313 2.0833333333333332e-11 1986 4316 8.3333333333333330e-11 1986 4699 -8.3333333333333330e-11 1986 4068 8.3333333333333330e-11 1986 4066 -2.0833333333333336e-11 1986 4060 2.0833333333333332e-11 1987 1987 4.1666666666666657e-10 1987 1990 1.0416666666666667e-10 1987 2005 -1.0034310714411270e-27 1987 1530 -1.8812360437258079e-27 1987 1525 -1.0416666666666667e-10 1987 1528 6.0115145282367205e-27 1987 1526 1.8812360437258079e-27 1987 1988 1.0416666666666667e-10 1987 1995 -2.3107708066186488e-27 1987 1213 -1.0416666666666668e-10 1987 1212 1.8812360437258079e-27 1987 1211 5.6797985175912850e-27 1987 4317 -3.6295685768920020e-28 1988 1988 4.1666666666666657e-10 1988 1528 1.8812360437258079e-27 1988 1217 -2.0833333333333332e-11 1988 1983 -2.0833333333333339e-11 1988 1978 8.3333333333333330e-11 1988 1525 -9.3750000000000012e-11 1988 1526 1.0416666666666676e-11 1988 1987 1.0416666666666667e-10 1988 1995 -2.8974861048767764e-27 1988 1213 -9.3749999999999999e-11 1988 1212 1.0416666666666671e-11 1988 1211 1.8812360437258079e-27 1988 4305 -2.0833333333333332e-11 1989 1989 2.4999999999999996e-10 1989 1218 -1.0416666666666665e-11 1989 1530 -1.0416666666666666e-11 1989 1990 2.0833333333333339e-11 1989 1213 -6.2499999999999991e-11 1989 1985 -2.0833333333333332e-11 1989 1525 -6.2499999999999991e-11 1989 4982 2.2913451068275814e-27 1989 4317 -1.0416666666666666e-11 1989 4313 -2.0833333333333326e-11 1989 4985 -9.5018296033870872e-28 1989 4306 -1.0416666666666665e-11 1989 4308 -2.0833333333333326e-11 1990 1990 4.1666666666666657e-10 1990 1211 -1.8812360437258079e-27 1990 1987 1.0416666666666667e-10 1990 1528 -3.6295685768920020e-28 1990 2005 4.0642113836986528e-27 1990 1525 -9.3749999999999999e-11 1990 1530 1.0416666666666668e-11 1990 1989 2.0833333333333339e-11 1990 1213 -9.3749999999999986e-11 1990 4308 -2.0833333333333332e-11 1990 4982 8.3333333333333330e-11 1990 4317 1.0416666666666673e-11 1990 4313 -2.0833333333333332e-11 1991 1991 2.4999999999999996e-10 1991 1524 -1.0416666666666665e-11 1991 1993 -2.0833333333333336e-11 1991 2315 -9.5018296033870872e-28 1991 1228 -1.0416666666666665e-11 1991 1227 -1.0416666666666666e-11 1991 1226 -2.0833333333333326e-11 1991 1992 2.0833333333333339e-11 1991 2316 2.2913451068275814e-27 1991 1523 -1.0416666666666666e-11 1991 1522 -2.0833333333333326e-11 1991 4316 -6.2500000000000004e-11 1991 4068 -6.2499999999999991e-11 1992 1992 4.1666666666666662e-10 1992 1982 -2.0833333333333339e-11 1992 1979 8.3333333333333330e-11 1992 1217 -2.0833333333333332e-11 1992 1227 2.0833333333333339e-11 1992 1226 -2.0833333333333329e-11 1992 1991 2.0833333333333339e-11 1992 2316 8.3333333333333330e-11 1992 1523 2.0833333333333339e-11 1992 1522 -2.0833333333333332e-11 1992 4060 -2.0833333333333329e-11 1992 4316 -8.3333333333333330e-11 1992 4068 -8.3333333333333330e-11 1993 1993 4.1666666666666662e-10 1993 1228 -2.0833333333333336e-11 1993 1524 -2.0833333333333336e-11 1993 1522 2.0833333333333332e-11 1993 1991 -2.0833333333333339e-11 1993 2315 -8.3333333333333330e-11 1993 1226 2.0833333333333332e-11 1993 4316 8.3333333333333330e-11 1993 4318 2.0833333333333332e-11 1993 5005 2.0833333333333339e-11 1993 816 8.3333333333333330e-11 1993 4068 8.3333333333333330e-11 1993 442 2.0833333333333332e-11 1994 1994 4.5833333333333330e-10 1994 1520 1.0416666666666668e-11 1994 1999 -4.1666666666666671e-11 1994 1528 5.2083333333333334e-11 1994 1995 8.3333333333333330e-11 1994 1526 4.8467614016778965e-27 1994 1978 -8.3333333333333330e-11 1994 1515 -4.8467614016778965e-27 1994 4305 2.0833333333333329e-11 1994 4704 2.0833333333333339e-11 1994 4107 2.0833333333333332e-11 1995 1995 4.1666666666666662e-10 1995 1214 -1.2069011089684726e-28 1995 1996 -2.0833333333333332e-11 1995 2003 -4.1666666666666665e-11 1995 1516 -4.1666666666666658e-11 1995 1525 -2.2470898404921788e-28 1995 1515 -1.2499999999999998e-10 1995 1520 -1.0416666666666666e-11 1995 1528 6.2500000000000004e-11 1995 1994 8.3333333333333343e-11 1995 1526 -1.0416666666666663e-11 1995 1988 -3.2311742677852644e-27 1995 1987 -2.0194839173657902e-27 1995 1213 -4.5860624244724788e-28 1995 1212 -1.0416666666666666e-11 1995 1211 1.0416666666666666e-11 1996 1996 5.8333333333333318e-10 1996 1211 -5.2083333333333334e-11 1996 1995 -2.0833333333333332e-11 1996 2003 1.2500000000000001e-10 1996 1520 -1.0416666666666668e-11 1996 1220 1.0416666666666666e-11 1996 1212 -1.0416666666666666e-10 1996 1214 4.1666666666666665e-11 1996 1998 8.3333333333333330e-11 1996 2085 -1.6155871338926322e-27 1996 1191 1.0416666666666666e-11 1996 1200 -6.2499999999999991e-11 1996 1192 4.1666666666666665e-11 1996 1997 8.3333333333333330e-11 1996 2080 1.8175355256292112e-27 1996 1515 -4.1666666666666671e-11 1996 1516 4.1666666666666678e-11 1997 1997 4.1666666666666662e-10 1997 1981 2.0833333333333339e-11 1997 1978 -8.3333333333333330e-11 1997 1194 2.0833333333333332e-11 1997 1200 -2.0833333333333339e-11 1997 1192 2.0833333333333332e-11 1997 2080 2.0833333333333339e-11 1997 1996 8.3333333333333330e-11 1997 1515 -2.0833333333333339e-11 1997 1516 2.0833333333333332e-11 1997 4107 2.0833333333333332e-11 1998 1998 4.1666666666666662e-10 1998 1194 2.0833333333333329e-11 1998 1980 2.0833333333333339e-11 1998 1978 -8.3333333333333330e-11 1998 1217 2.0833333333333332e-11 1998 1220 8.3333333333333330e-11 1998 1212 -2.0833333333333336e-11 1998 1214 2.0833333333333329e-11 1998 2085 2.0833333333333339e-11 1998 1996 8.3333333333333330e-11 1998 1191 8.3333333333333330e-11 1998 1200 -2.0833333333333336e-11 1998 1192 2.0833333333333332e-11 1999 1999 3.3333333333333332e-10 1999 1515 -4.1666666666666665e-11 1999 1994 -4.1666666666666678e-11 1999 1995 6.4623485355705287e-27 1999 1526 -1.8812360437258079e-27 1999 1528 -6.2500000000000004e-11 1999 2008 6.4623485355705287e-27 1999 1520 -6.2500000000000004e-11 2000 2000 2.4999999999999996e-10 2001 2001 4.1666666666666662e-10 2001 1216 -4.1666666666666665e-11 2001 2004 -2.0833333333333326e-11 2001 2128 -4.1666666666666665e-11 2001 1547 -3.5848693552059962e-28 2001 1164 2.0194839173657902e-27 2001 1215 -3.1250000000000002e-11 2001 1211 -1.2499999999999998e-10 2001 1225 -1.0416666666666674e-11 2001 1777 -8.3333333333333330e-11 2001 1779 -6.4623485355705287e-27 2001 1153 5.2083333333333328e-11 2001 1166 -1.0416666666666673e-11 2001 1165 6.2499999999999991e-11 2001 2002 2.2214323091023692e-27 2001 2121 1.6155871338926322e-27 2001 1534 2.2470898404921788e-28 2001 1533 -1.0416666666666669e-11 2001 1532 1.0416666666666669e-11 2002 2002 4.1666666666666662e-10 2002 1546 2.0833333333333332e-11 2002 2087 2.0833333333333336e-11 2002 2003 8.3333333333333330e-11 2002 1159 2.0833333333333332e-11 2002 1164 9.3749999999999986e-11 2002 1166 -1.0416666666666673e-11 2002 1165 1.8812360437258079e-27 2002 2121 -1.0416666666666667e-10 2002 2001 1.7917989385963757e-27 2002 1534 9.3749999999999999e-11 2002 1533 -1.0416666666666669e-11 2002 1532 -1.8812360437258079e-27 2003 2003 9.1666666666666660e-10 2003 1153 1.0416666666666666e-11 2003 1534 1.0416666666666666e-11 2003 2002 8.3333333333333330e-11 2003 2087 -1.6155871338926322e-27 2003 1164 1.0416666666666666e-11 2003 1166 -6.2499999999999991e-11 2003 1159 4.1666666666666665e-11 2003 1212 -5.2083333333333334e-11 2003 1995 -4.1666666666666665e-11 2003 1996 1.2499999999999998e-10 2003 1515 3.1250000000000002e-11 2003 1520 -2.0833333333333342e-11 2003 1516 1.6666666666666669e-10 2003 2008 4.1666666666666665e-11 2003 2011 1.2499999999999998e-10 2003 1533 -1.0416666666666666e-10 2003 1546 4.1666666666666678e-11 2003 1777 -8.3333333333333330e-11 2003 1776 1.6155871338926322e-27 2003 1215 1.0416666666666666e-11 2003 1211 -1.0416666666666667e-10 2003 1214 4.1666666666666665e-11 2004 2004 8.3333333333333314e-10 2004 1225 -1.0416666666666665e-11 2004 2001 -2.0833333333333323e-11 2004 2128 1.2500000000000001e-10 2004 1532 -5.2083333333333334e-11 2004 1533 -1.4583333333333332e-10 2004 1547 4.1666666666666665e-11 2004 2006 4.1666666666666658e-11 2004 2326 -1.2499999999999998e-10 2004 1601 -2.0833333333333342e-11 2004 1599 1.6666666666666666e-10 2004 2005 4.1666666666666665e-11 2004 2322 1.2499999999999998e-10 2004 1211 -8.3333333333333330e-11 2004 1216 4.1666666666666671e-11 2004 4254 3.1249999999999995e-11 2004 4317 -5.2083333333333334e-11 2005 2005 4.1666666666666662e-10 2005 1213 -2.0194839173657902e-27 2005 1987 -1.6155871338926322e-27 2005 1525 2.0194839173657902e-27 2005 1528 -6.2499999999999991e-11 2005 1990 6.4623485355705287e-27 2005 1530 1.0416666666666671e-11 2005 2323 -8.3333333333333330e-11 2005 2009 -6.4623485355705287e-27 2005 1601 1.0416666666666658e-11 2005 1599 4.1666666666666665e-11 2005 2322 2.0833333333333332e-11 2005 2004 4.1666666666666665e-11 2005 1211 -1.0416666666666668e-11 2005 1216 -4.6458872727282566e-28 2005 4254 1.2499999999999998e-10 2005 4317 1.0416666666666671e-11 2006 2006 4.1666666666666662e-10 2006 2009 6.4623485355705287e-27 2006 1528 -6.2500000000000004e-11 2006 1547 -2.8320667257631078e-28 2006 2326 -2.0833333333333332e-11 2006 2004 4.1666666666666665e-11 2006 1601 1.0416666666666666e-11 2006 1599 4.1666666666666665e-11 2006 2007 -2.0194839173657902e-27 2006 1533 -1.0416666666666666e-11 2007 2007 4.1666666666666668e-10 2007 1528 -1.7917989385963757e-27 2007 2008 1.0034310714411270e-27 2007 2006 -2.3107708066186488e-27 2007 1533 -1.0034310714411270e-27 2008 2008 4.1666666666666662e-10 2008 1516 4.1666666666666665e-11 2008 2011 2.0833333333333332e-11 2008 2003 4.1666666666666665e-11 2008 1546 -6.0691943799667649e-29 2008 1533 -1.0416666666666668e-11 2008 2007 1.6155871338926322e-27 2008 1528 -6.2499999999999991e-11 2008 1999 6.4623485355705287e-27 2008 1520 1.0416666666666658e-11 2009 2009 3.3333333333333332e-10 2009 1528 6.2500000000000004e-11 2009 1530 -2.2851328271989659e-27 2009 2323 4.1666666666666658e-11 2009 1601 6.2500000000000004e-11 2009 4254 4.1666666666666665e-11 2010 2010 2.0833333333333329e-10 2011 2011 5.8333333333333328e-10 2011 1520 -1.0416666666666666e-11 2011 2008 2.0833333333333332e-11 2011 2003 1.2499999999999998e-10 2011 1533 -5.2083333333333334e-11 2011 1516 4.1666666666666665e-11 2011 2082 1.8175355256292112e-27 2011 1625 4.1666666666666665e-11 2011 2084 1.8175355256292112e-27 2011 1546 4.1666666666666678e-11 2012 2012 2.0833333333333331e-10 2013 2013 2.0833333333333331e-10 2014 2014 2.0833333333333329e-10 2015 2015 4.1666666666666662e-10 2015 1234 3.0430870179097285e-28 2015 2037 2.0833333333333332e-11 2015 2019 4.1666666666666665e-11 2015 1567 4.1666666666666665e-11 2015 1573 -4.5860624244724788e-28 2015 1566 1.2499999999999998e-10 2015 1571 1.0416666666666666e-11 2015 1575 -6.2500000000000004e-11 2015 2033 8.3333333333333343e-11 2015 1577 1.0416666666666663e-11 2015 2034 2.0194839173657902e-27 2015 2016 3.2311742677852644e-27 2015 1233 -2.2470898404921788e-28 2015 1232 1.0416666666666666e-11 2015 1231 -1.0416666666666668e-11 2016 2016 4.1666666666666657e-10 2016 1238 -3.6295685768920020e-28 2016 2043 -1.0416666666666668e-10 2016 2021 4.0642113836986528e-27 2016 1578 1.8812360437258079e-27 2016 1573 1.0416666666666667e-10 2016 1575 -6.0115145282367205e-27 2016 1577 -1.8812360437258079e-27 2016 2034 1.0416666666666667e-10 2016 2015 2.8974861048767764e-27 2016 1233 1.0416666666666667e-10 2016 1232 -2.2851328271989659e-27 2016 1231 -5.6797985175912850e-27 2017 2017 4.1666666666666662e-10 2017 1239 -4.1666666666666671e-11 2017 2020 -2.0833333333333332e-11 2017 2190 -4.1666666666666678e-11 2017 1564 6.0691943799667649e-29 2017 1168 2.0194839173657902e-27 2017 1235 -3.1250000000000002e-11 2017 1231 -1.2499999999999998e-10 2017 1245 -1.0416666666666674e-11 2017 1781 -8.3333333333333330e-11 2017 1154 5.2083333333333334e-11 2017 1170 -1.0416666666666673e-11 2017 1169 6.2499999999999991e-11 2017 2018 8.0779356694631609e-27 2017 2182 -2.6253290925755273e-27 2017 1551 -4.5860624244724788e-28 2017 1550 -1.0416666666666671e-11 2017 1549 1.0416666666666669e-11 2018 2018 4.1666666666666662e-10 2018 1563 2.0833333333333329e-11 2018 2114 2.0833333333333339e-11 2018 2019 8.3333333333333330e-11 2018 1162 2.0833333333333332e-11 2018 1168 9.3749999999999986e-11 2018 1170 -1.0416666666666673e-11 2018 1169 1.8812360437258079e-27 2018 2182 -1.0416666666666667e-10 2018 2017 6.0115145282367205e-27 2018 1551 9.3749999999999986e-11 2018 1550 -1.0416666666666671e-11 2018 1549 -1.8812360437258079e-27 2019 2019 9.1666666666666660e-10 2019 1154 1.0416666666666666e-11 2019 1551 1.0416666666666666e-11 2019 2018 8.3333333333333330e-11 2019 2114 1.8175355256292112e-27 2019 1168 1.0416666666666666e-11 2019 1170 -6.2499999999999991e-11 2019 1162 4.1666666666666665e-11 2019 1232 -5.2083333333333334e-11 2019 2015 4.1666666666666665e-11 2019 2037 1.2499999999999998e-10 2019 1566 3.1250000000000002e-11 2019 1571 -2.0833333333333339e-11 2019 1567 1.6666666666666666e-10 2019 2024 4.1666666666666665e-11 2019 2029 1.2499999999999998e-10 2019 1550 -1.0416666666666667e-10 2019 1563 4.1666666666666678e-11 2019 1781 -8.3333333333333330e-11 2019 1780 -1.8175355256292112e-27 2019 1235 1.0416666666666666e-11 2019 1231 -1.0416666666666667e-10 2019 1234 4.1666666666666658e-11 2020 2020 8.3333333333333325e-10 2020 1245 -1.0416666666666665e-11 2020 2017 -2.0833333333333329e-11 2020 2190 1.2500000000000001e-10 2020 1549 -5.2083333333333334e-11 2020 1438 3.1249999999999995e-11 2020 1550 -1.4583333333333335e-10 2020 1564 4.1666666666666671e-11 2020 2022 4.1666666666666665e-11 2020 2329 -1.2499999999999998e-10 2020 1445 -2.0833333333333339e-11 2020 1443 1.6666666666666666e-10 2020 2021 4.1666666666666665e-11 2020 2077 1.2499999999999998e-10 2020 1238 -5.2083333333333334e-11 2020 1231 -8.3333333333333343e-11 2020 1239 4.1666666666666671e-11 2021 2021 4.1666666666666662e-10 2021 1233 -2.0194839173657902e-27 2021 2016 6.4623485355705287e-27 2021 1573 2.0194839173657902e-27 2021 1575 -6.2499999999999991e-11 2021 2043 1.6155871338926322e-27 2021 1578 1.0416666666666671e-11 2021 2078 -8.3333333333333330e-11 2021 2026 -6.4623485355705287e-27 2021 1438 1.2499999999999998e-10 2021 1445 1.0416666666666658e-11 2021 1443 4.1666666666666665e-11 2021 2077 2.0833333333333329e-11 2021 2020 4.1666666666666665e-11 2021 1238 1.0416666666666671e-11 2021 1231 -1.0416666666666669e-11 2021 1239 -2.8113590706237963e-30 2022 2022 4.1666666666666662e-10 2022 2026 6.4623485355705287e-27 2022 1575 -6.2500000000000004e-11 2022 1564 3.0430870179097285e-28 2022 2329 -2.0833333333333332e-11 2022 2020 4.1666666666666665e-11 2022 1445 1.0416666666666666e-11 2022 1443 4.1666666666666665e-11 2022 2023 3.2311742677852644e-27 2022 1550 -1.0416666666666668e-11 2023 2023 4.1666666666666657e-10 2023 1575 -1.7917989385963757e-27 2023 2024 4.0642113836986528e-27 2023 2022 2.8974861048767764e-27 2023 1550 -1.0034310714411270e-27 2024 2024 4.1666666666666662e-10 2024 1567 4.1666666666666665e-11 2024 2029 2.0833333333333326e-11 2024 2019 4.1666666666666665e-11 2024 1563 -2.8113590706237963e-30 2024 1550 -1.0416666666666669e-11 2024 2023 6.4623485355705287e-27 2024 1575 -6.2499999999999991e-11 2024 2025 -6.4623485355705287e-27 2024 1571 1.0416666666666658e-11 2025 2025 3.3333333333333327e-10 2025 1566 4.1666666666666665e-11 2025 2033 -4.1666666666666678e-11 2025 2015 6.4623485355705287e-27 2025 1577 2.2851328271989659e-27 2025 1575 6.2499999999999991e-11 2025 2024 -6.4623485355705287e-27 2025 1571 6.2500000000000004e-11 2026 2026 3.3333333333333327e-10 2026 1575 6.2499999999999991e-11 2026 1578 -1.8812360437258079e-27 2026 2078 4.1666666666666665e-11 2026 1438 4.1666666666666671e-11 2026 1445 6.2500000000000004e-11 2027 2027 2.4999999999999996e-10 2028 2028 2.0833333333333334e-10 2029 2029 5.8333333333333328e-10 2029 1571 -1.0416666666666666e-11 2029 2024 2.0833333333333332e-11 2029 2019 1.2499999999999998e-10 2029 1550 -5.2083333333333334e-11 2029 1567 4.1666666666666665e-11 2029 2108 -1.6155871338926322e-27 2029 1636 4.1666666666666665e-11 2029 2111 1.8175355256292112e-27 2029 1563 4.1666666666666678e-11 2030 2030 2.0833333333333331e-10 2031 2031 2.0833333333333331e-10 2032 2032 2.0833333333333331e-10 2033 2033 4.5833333333333330e-10 2033 1571 -1.0416666666666668e-11 2033 2025 -4.1666666666666671e-11 2033 1575 -5.2083333333333334e-11 2033 2015 8.3333333333333330e-11 2033 1577 -1.6155871338926322e-27 2033 2035 -8.3333333333333330e-11 2033 1566 4.8467614016778965e-27 2033 4377 -2.0833333333333332e-11 2033 4481 -2.0833333333333336e-11 2033 3817 -2.0833333333333332e-11 2034 2034 4.1666666666666662e-10 2034 1241 2.0833333333333332e-11 2034 2042 -2.0833333333333339e-11 2034 2035 8.3333333333333330e-11 2034 1573 9.3749999999999999e-11 2034 1575 -1.8812360437258079e-27 2034 1577 -1.0416666666666674e-11 2034 2016 1.0416666666666667e-10 2034 2015 2.3107708066186488e-27 2034 1233 9.3749999999999986e-11 2034 1232 -1.0416666666666668e-11 2034 1231 -1.8812360437258079e-27 2034 4377 2.0833333333333332e-11 2035 2035 6.6666666666666664e-10 2035 1233 1.0416666666666666e-11 2035 2034 8.3333333333333330e-11 2035 2042 1.6155871338926322e-27 2035 1573 1.0416666666666666e-11 2035 1577 -6.2499999999999991e-11 2035 1602 1.0416666666666666e-11 2035 2038 8.3333333333333330e-11 2035 1607 -6.2499999999999991e-11 2035 2039 8.3333333333333330e-11 2035 2061 1.6155871338926322e-27 2035 1237 1.0416666666666666e-11 2035 1232 -6.2499999999999991e-11 2035 1241 4.1666666666666665e-11 2035 2033 -8.3333333333333330e-11 2035 1566 -6.2499999999999991e-11 2035 4377 4.1666666666666665e-11 2035 4470 -1.6155871338926322e-27 2035 3826 4.1666666666666665e-11 2035 4481 -1.6155871338926322e-27 2035 3817 4.1666666666666665e-11 2036 2036 4.1666666666666662e-10 2036 1237 2.0194839173657902e-27 2036 2039 2.2214323091023692e-27 2036 2064 1.6155871338926322e-27 2036 1602 2.2470898404921788e-28 2036 1607 -1.0416666666666669e-11 2036 1603 6.2499999999999991e-11 2036 1232 -1.0416666666666673e-11 2036 1234 2.0194839173657902e-27 2036 1244 1.0416666666666661e-11 2036 2038 8.3333333333333343e-11 2036 2072 -6.4623485355705287e-27 2036 2037 -2.0833333333333320e-11 2036 2109 4.1666666666666658e-11 2036 1566 -1.2500000000000001e-10 2036 1567 -4.1666666666666665e-11 2036 1570 -1.0416666666666655e-11 2037 2037 4.9999999999999993e-10 2037 1231 -5.2083333333333334e-11 2037 2015 2.0833333333333332e-11 2037 2019 1.2500000000000001e-10 2037 1571 -1.0416666666666668e-11 2037 1232 -1.4583333333333332e-10 2037 1234 4.1666666666666658e-11 2037 1244 -5.2083333333333328e-11 2037 2036 -2.0833333333333323e-11 2037 2109 -1.2500000000000001e-10 2037 1566 -2.0833333333333339e-11 2037 1567 4.1666666666666678e-11 2037 1570 -1.0416666666666668e-11 2038 2038 4.5833333333333330e-10 2038 1603 5.2083333333333334e-11 2038 2035 8.3333333333333330e-11 2038 1607 -3.2311742677852644e-27 2038 2072 -4.1666666666666678e-11 2038 2036 8.3333333333333343e-11 2038 1566 -1.6155871338926322e-27 2038 1570 1.0416666666666665e-11 2038 3817 2.0833333333333332e-11 2038 4470 2.0833333333333339e-11 2038 3826 2.0833333333333332e-11 2039 2039 4.1666666666666657e-10 2039 1244 1.8812360437258079e-27 2039 2064 -1.0416666666666667e-10 2039 2036 1.7917989385963757e-27 2039 1603 -1.8812360437258079e-27 2039 1602 9.3749999999999999e-11 2039 1607 -1.0416666666666669e-11 2039 2061 -2.0833333333333336e-11 2039 2035 8.3333333333333330e-11 2039 1237 9.3749999999999986e-11 2039 1232 -1.0416666666666673e-11 2039 1241 2.0833333333333332e-11 2039 3826 2.0833333333333332e-11 2040 2040 2.4999999999999996e-10 2040 1242 -1.0416666666666666e-11 2040 1578 -1.0416666666666665e-11 2040 2043 2.0833333333333336e-11 2040 2074 -9.5018296033870872e-28 2040 1233 -6.2500000000000004e-11 2040 1238 -1.0416666666666665e-11 2040 1243 -2.0833333333333326e-11 2040 2041 2.0833333333333339e-11 2040 1573 -6.2499999999999991e-11 2040 4893 2.2913451068275814e-27 2040 4378 -1.0416666666666666e-11 2040 4380 -2.0833333333333326e-11 2041 2041 4.1666666666666662e-10 2041 1243 -2.0833333333333329e-11 2041 2042 2.0833333333333339e-11 2041 1233 -8.3333333333333330e-11 2041 1242 2.0833333333333339e-11 2041 1241 -2.0833333333333332e-11 2041 2040 2.0833333333333339e-11 2041 1573 -8.3333333333333330e-11 2041 4377 -2.0833333333333329e-11 2041 4475 8.3333333333333330e-11 2041 4893 8.3333333333333330e-11 2041 4378 2.0833333333333339e-11 2041 4380 -2.0833333333333332e-11 2042 2042 2.4999999999999996e-10 2042 1232 -1.0416666666666665e-11 2042 2034 -2.0833333333333336e-11 2042 2035 9.5018296033870872e-28 2042 1577 -1.0416666666666665e-11 2042 1573 -6.2500000000000004e-11 2042 2041 2.0833333333333339e-11 2042 1233 -6.2499999999999991e-11 2042 1242 -1.0416666666666666e-11 2042 1241 -2.0833333333333326e-11 2042 4378 -1.0416666666666666e-11 2042 4377 -2.0833333333333326e-11 2042 4475 2.2913451068275814e-27 2043 2043 4.1666666666666668e-10 2043 1231 -1.8812360437258079e-27 2043 2016 -1.0416666666666667e-10 2043 1575 -3.6295685768920020e-28 2043 2021 1.0034310714411270e-27 2043 1573 -9.3749999999999999e-11 2043 1578 1.0416666666666663e-11 2043 2040 2.0833333333333339e-11 2043 2074 8.3333333333333330e-11 2043 1233 -9.3749999999999986e-11 2043 1238 1.0416666666666671e-11 2043 1243 -2.0833333333333332e-11 2043 4380 -2.0833333333333332e-11 2044 2044 4.1666666666666662e-10 2044 1581 6.2499999999999991e-11 2044 1580 -3.5628902784306998e-27 2044 1097 6.2499999999999991e-11 2044 1096 -3.5628902784306998e-27 2044 1121 -2.0833333333333329e-11 2044 1091 2.0833333333333329e-11 2044 1705 -2.0833333333333336e-11 2044 1115 -2.0833333333333326e-11 2044 1119 -6.2499999999999991e-11 2044 1706 2.0833333333333339e-11 2044 1120 3.5628902784306998e-27 2044 2049 -2.0833333333333332e-11 2044 2045 2.0833333333333326e-11 2044 1582 2.0833333333333329e-11 2044 336 -2.0833333333333329e-11 2044 469 2.0833333333333329e-11 2044 930 -2.0833333333333336e-11 2044 341 -2.0833333333333326e-11 2044 342 -6.2499999999999991e-11 2044 921 -2.0833333333333339e-11 2044 340 3.5628902784306998e-27 2044 912 2.0833333333333332e-11 2044 913 -2.0833333333333326e-11 2044 396 2.0833333333333329e-11 2045 2045 2.9166666666666659e-10 2045 1595 2.0833333333333332e-11 2045 2057 -4.1666666666666665e-11 2045 2047 2.0833333333333336e-11 2045 1137 1.1000665323307010e-27 2045 1121 4.1666666666666665e-11 2045 1119 1.0416666666666665e-11 2045 1120 -1.3020149240672800e-27 2045 2049 4.1666666666666652e-11 2045 2044 2.0833333333333326e-11 2045 1582 1.0416666666666666e-10 2045 1581 2.0833333333333329e-11 2045 1580 1.0416666666666661e-11 2046 2046 4.1666666666666662e-10 2046 1101 6.2499999999999991e-11 2046 1100 -3.5628902784306998e-27 2046 1447 6.2499999999999991e-11 2046 1462 -3.5628902784306998e-27 2046 1116 -2.0833333333333329e-11 2046 1453 2.0833333333333329e-11 2046 2048 2.0833333333333336e-11 2046 1136 -2.0833333333333326e-11 2046 1119 -6.2499999999999991e-11 2046 2160 -2.0833333333333339e-11 2046 1138 3.5628902784306998e-27 2046 1709 2.0833333333333332e-11 2046 1708 -2.0833333333333326e-11 2046 1102 2.0833333333333329e-11 2046 331 -2.0833333333333329e-11 2046 433 2.0833333333333329e-11 2046 789 -2.0833333333333336e-11 2046 332 -2.0833333333333326e-11 2046 342 -6.2499999999999991e-11 2046 783 -2.0833333333333339e-11 2046 329 3.5628902784306998e-27 2046 784 -2.0833333333333332e-11 2046 788 -2.0833333333333326e-11 2046 428 2.0833333333333329e-11 2047 2047 4.1666666666666662e-10 2047 1460 6.2499999999999991e-11 2047 1462 -2.1169082391605852e-27 2047 1595 6.2499999999999991e-11 2047 1580 -2.1169082391605852e-27 2047 1136 -2.0833333333333329e-11 2047 1582 2.0833333333333326e-11 2047 2045 2.0833333333333336e-11 2047 1121 -2.0833333333333329e-11 2047 1119 -6.2500000000000004e-11 2047 2057 2.0833333333333336e-11 2047 1137 3.7324953730532174e-27 2047 2286 -2.0833333333333326e-11 2047 2048 2.0833333333333326e-11 2047 1453 2.0833333333333329e-11 2047 341 -2.0833333333333329e-11 2047 428 2.0833333333333326e-11 2047 788 -2.0833333333333336e-11 2047 331 -2.0833333333333329e-11 2047 342 -6.2500000000000004e-11 2047 787 2.0833333333333336e-11 2047 344 3.7324953730532174e-27 2047 931 2.0833333333333326e-11 2047 930 -2.0833333333333326e-11 2047 469 2.0833333333333329e-11 2048 2048 2.9166666666666664e-10 2048 1447 2.0833333333333332e-11 2048 2160 4.1666666666666665e-11 2048 2046 2.0833333333333336e-11 2048 1138 1.5039633158038590e-27 2048 1136 4.1666666666666658e-11 2048 1119 1.0416666666666665e-11 2048 1137 -1.1213657767716683e-27 2048 2286 4.1666666666666652e-11 2048 2047 2.0833333333333326e-11 2048 1453 1.0416666666666666e-10 2048 1460 2.0833333333333329e-11 2048 1462 1.0416666666666663e-11 2049 2049 2.9166666666666664e-10 2049 1596 1.1213657767716683e-27 2049 2054 -4.1666666666666665e-11 2049 1127 2.0833333333333332e-11 2049 2050 2.0833333333333336e-11 2049 1121 1.0416666666666666e-10 2049 1119 2.0833333333333329e-11 2049 1120 1.0416666666666663e-11 2049 2045 4.1666666666666652e-11 2049 2044 -2.0833333333333332e-11 2049 1582 4.1666666666666665e-11 2049 1581 1.0416666666666665e-11 2049 1580 -1.1000665323307010e-27 2050 2050 4.1666666666666662e-10 2050 1352 2.0833333333333329e-11 2050 1094 -2.0833333333333329e-11 2050 2303 -2.0833333333333336e-11 2050 1367 2.0833333333333326e-11 2050 1361 6.2499999999999991e-11 2050 2052 2.0833333333333336e-11 2050 1368 -2.1169082391605852e-27 2050 1115 2.0833333333333329e-11 2050 1582 -2.0833333333333329e-11 2050 2054 2.0833333333333336e-11 2050 1121 2.0833333333333326e-11 2050 1127 6.2499999999999991e-11 2050 2049 2.0833333333333336e-11 2050 1120 -2.1169082391605852e-27 2050 1706 -2.0833333333333326e-11 2050 1707 2.0833333333333326e-11 2050 1091 -2.0833333333333329e-11 2050 1097 -6.2499999999999991e-11 2050 1098 3.5628902784306998e-27 2050 2051 2.0833333333333326e-11 2050 2245 2.0833333333333326e-11 2050 1587 -2.0833333333333329e-11 2050 1581 -6.2499999999999991e-11 2050 1596 3.5628902784306998e-27 2051 2051 2.9166666666666664e-10 2051 1588 1.3233141685082473e-27 2051 2243 -4.1666666666666665e-11 2051 1358 2.0833333333333332e-11 2051 2053 -2.0833333333333339e-11 2051 1352 1.0416666666666666e-10 2051 1361 2.0833333333333329e-11 2051 1368 1.0416666666666663e-11 2051 2245 -4.1666666666666652e-11 2051 2050 2.0833333333333326e-11 2051 1587 4.1666666666666665e-11 2051 1581 1.0416666666666665e-11 2051 1596 -1.1000665323307010e-27 2052 2052 2.9166666666666664e-10 2052 1358 2.0833333333333329e-11 2052 2262 4.1666666666666652e-11 2052 2053 -2.0833333333333332e-11 2052 1099 -1.1000665323307010e-27 2052 1094 4.1666666666666665e-11 2052 1097 1.0416666666666665e-11 2052 1098 1.1213657767716683e-27 2052 2303 4.1666666666666665e-11 2052 1367 1.0416666666666666e-10 2052 1361 2.0833333333333332e-11 2052 2050 2.0833333333333336e-11 2052 1368 1.0416666666666663e-11 2053 2053 4.1666666666666662e-10 2053 1097 6.2499999999999991e-11 2053 1099 -3.5628902784306998e-27 2053 1581 6.2499999999999991e-11 2053 1588 -3.5628902784306998e-27 2053 1367 -2.0833333333333329e-11 2053 1587 2.0833333333333329e-11 2053 2243 -2.0833333333333336e-11 2053 1352 -2.0833333333333326e-11 2053 1358 -6.2499999999999991e-11 2053 2051 -2.0833333333333339e-11 2053 1368 3.5628902784306998e-27 2053 2052 -2.0833333333333332e-11 2053 2262 2.0833333333333326e-11 2053 1094 2.0833333333333329e-11 2053 415 -2.0833333333333329e-11 2053 394 2.0833333333333329e-11 2053 771 -2.0833333333333336e-11 2053 404 -2.0833333333333326e-11 2053 420 -6.2499999999999991e-11 2053 770 2.0833333333333339e-11 2053 413 3.5628902784306998e-27 2053 922 -2.0833333333333332e-11 2053 924 -2.0833333333333326e-11 2053 474 2.0833333333333329e-11 2054 2054 2.9166666666666659e-10 2054 1581 -2.0833333333333332e-11 2054 2049 -4.1666666666666665e-11 2054 2050 2.0833333333333336e-11 2054 1120 -1.3020149240672800e-27 2054 1121 -4.1666666666666658e-11 2054 1127 -1.0416666666666661e-11 2054 1128 1.3233141685082473e-27 2054 2055 4.1666666666666652e-11 2054 2222 2.0833333333333326e-11 2054 1582 -1.0416666666666666e-10 2054 1584 -2.0833333333333329e-11 2054 1596 -1.0416666666666661e-11 2055 2055 2.9166666666666664e-10 2055 1597 -1.5039633158038590e-27 2055 2056 4.1666666666666665e-11 2055 1129 -2.0833333333333332e-11 2055 2223 -2.0833333333333336e-11 2055 1121 -1.0416666666666666e-10 2055 1127 -2.0833333333333329e-11 2055 1128 -1.0416666666666663e-11 2055 2054 4.1666666666666652e-11 2055 2222 -2.0833333333333326e-11 2055 1582 -4.1666666666666658e-11 2055 1584 -1.0416666666666665e-11 2055 1596 1.1213657767716683e-27 2056 2056 2.9166666666666664e-10 2056 1137 1.1000665323307010e-27 2056 1584 -2.0833333333333332e-11 2056 1121 -4.1666666666666665e-11 2056 1129 -1.0416666666666665e-11 2056 2055 4.1666666666666665e-11 2056 2223 2.0833333333333339e-11 2056 1128 -1.3233141685082473e-27 2056 2057 4.1666666666666652e-11 2056 2285 2.0833333333333326e-11 2056 1582 -1.0416666666666666e-10 2056 1595 -2.0833333333333329e-11 2056 1597 -1.0416666666666663e-11 2057 2057 2.9166666666666659e-10 2057 1580 -1.1000665323307010e-27 2057 2045 -4.1666666666666665e-11 2057 1119 -2.0833333333333332e-11 2057 2047 2.0833333333333336e-11 2057 1121 -1.0416666666666666e-10 2057 1129 -2.0833333333333329e-11 2057 1137 -1.0416666666666661e-11 2057 2056 4.1666666666666652e-11 2057 2285 -2.0833333333333326e-11 2057 1582 -4.1666666666666658e-11 2057 1595 -1.0416666666666661e-11 2057 1597 1.5039633158038590e-27 2058 2058 2.4999999999999996e-10 2058 2063 -2.0833333333333332e-11 2058 1606 1.0416666666666665e-11 2058 1602 6.2499999999999991e-11 2058 2059 2.0833333333333339e-11 2058 1237 6.2499999999999991e-11 2058 1240 1.0416666666666666e-11 2058 3790 1.0416666666666665e-11 2058 4846 9.5018296033870872e-28 2058 3824 1.0416666666666666e-11 2058 3823 2.0833333333333326e-11 2058 4482 -2.2913451068275814e-27 2058 3789 2.0833333333333326e-11 2059 2059 4.1666666666666662e-10 2059 1241 2.0833333333333332e-11 2059 2058 2.0833333333333339e-11 2059 1237 8.3333333333333330e-11 2059 1240 -2.0833333333333339e-11 2059 2061 -2.0833333333333339e-11 2059 1602 8.3333333333333330e-11 2059 3823 2.0833333333333332e-11 2059 4482 -8.3333333333333330e-11 2059 3789 2.0833333333333332e-11 2059 4477 -8.3333333333333330e-11 2059 3824 -2.0833333333333339e-11 2059 3826 2.0833333333333332e-11 2060 2060 4.1666666666666662e-10 2060 2065 -2.0833333333333339e-11 2060 1241 2.0833333333333332e-11 2060 1240 -2.0833333333333336e-11 2060 3727 2.0833333333333329e-11 2060 4477 -8.3333333333333330e-11 2060 3788 8.3333333333333330e-11 2060 3789 2.0833333333333329e-11 2060 4457 2.0833333333333339e-11 2060 4482 -8.3333333333333330e-11 2060 3726 8.3333333333333330e-11 2060 3728 -2.0833333333333336e-11 2060 3739 2.0833333333333332e-11 2061 2061 2.4999999999999996e-10 2061 1240 -1.0416666666666666e-11 2061 1607 -1.0416666666666665e-11 2061 2039 -2.0833333333333332e-11 2061 2035 9.5018296033870872e-28 2061 1237 -6.2499999999999991e-11 2061 1232 -1.0416666666666665e-11 2061 1241 -2.0833333333333326e-11 2061 2059 -2.0833333333333339e-11 2061 1602 -6.2499999999999991e-11 2061 4477 2.2913451068275814e-27 2061 3824 -1.0416666666666666e-11 2061 3826 -2.0833333333333326e-11 2062 2062 2.4999999999999996e-10 2062 1606 -1.0416666666666665e-11 2062 1602 -6.2499999999999991e-11 2062 1604 -2.0833333333333332e-11 2062 1603 -1.0416666666666668e-11 2062 2064 2.0833333333333339e-11 2062 2128 -4.5053818449435037e-28 2062 1244 -1.0416666666666666e-11 2062 2063 2.0833333333333332e-11 2062 2069 9.5018296033870872e-28 2062 1237 -6.2499999999999991e-11 2062 1236 -2.0833333333333323e-11 2062 3790 -1.0416666666666665e-11 2063 2063 4.1666666666666662e-10 2063 1604 -2.0833333333333332e-11 2063 2058 -2.0833333333333336e-11 2063 1602 -8.3333333333333330e-11 2063 1606 2.0833333333333336e-11 2063 2062 2.0833333333333336e-11 2063 2069 -8.3333333333333330e-11 2063 1237 -8.3333333333333330e-11 2063 1236 -2.0833333333333332e-11 2063 3789 -2.0833333333333332e-11 2063 4846 8.3333333333333330e-11 2063 3823 -2.0833333333333332e-11 2063 3790 2.0833333333333336e-11 2064 2064 4.1666666666666662e-10 2064 1232 -3.6295685768920020e-28 2064 2039 -1.0416666666666667e-10 2064 2036 9.5018296033870872e-28 2064 1607 1.8812360437258079e-27 2064 1602 -9.3750000000000012e-11 2064 1604 -2.0833333333333332e-11 2064 1603 1.0416666666666671e-11 2064 2062 2.0833333333333336e-11 2064 2128 -8.3333333333333330e-11 2064 1237 -9.3750000000000012e-11 2064 1236 -2.0833333333333332e-11 2064 1244 1.0416666666666674e-11 2065 2065 2.4999999999999996e-10 2065 1242 -1.0416666666666663e-11 2065 2066 2.0833333333333336e-11 2065 2060 -2.0833333333333336e-11 2065 1240 -1.0416666666666666e-11 2065 1241 -2.0833333333333326e-11 2065 4475 2.2913451068275814e-27 2065 3746 -1.0416666666666666e-11 2065 3726 -6.2500000000000004e-11 2065 3728 -1.0416666666666663e-11 2065 3727 -2.0833333333333326e-11 2065 4477 -9.5018296033870872e-28 2065 3788 -6.2500000000000004e-11 2066 2066 4.1666666666666662e-10 2066 2067 2.0833333333333339e-11 2066 1243 -2.0833333333333332e-11 2066 1242 2.0833333333333332e-11 2066 1241 -2.0833333333333329e-11 2066 2065 2.0833333333333339e-11 2066 3743 -2.0833333333333329e-11 2066 4893 8.3333333333333330e-11 2066 3788 -8.3333333333333330e-11 2066 4475 8.3333333333333330e-11 2066 3726 -8.3333333333333330e-11 2066 3746 2.0833333333333332e-11 2066 3727 -2.0833333333333332e-11 2067 2067 2.4999999999999996e-10 2067 2066 2.0833333333333336e-11 2067 1242 -1.0416666666666666e-11 2067 1243 -2.0833333333333326e-11 2067 3746 -1.0416666666666663e-11 2067 4893 2.2913451068275814e-27 2067 3788 -6.2500000000000004e-11 2067 3792 -1.0416666666666663e-11 2067 4458 -2.0833333333333336e-11 2067 4888 -9.5018296033870872e-28 2067 3726 -6.2500000000000004e-11 2067 3742 -1.0416666666666666e-11 2067 3743 -2.0833333333333326e-11 2068 2068 4.1666666666666662e-10 2068 1599 2.0833333333333332e-11 2068 2070 -2.0833333333333339e-11 2068 2069 8.3333333333333330e-11 2068 1604 2.0833333333333332e-11 2068 1606 -2.0833333333333336e-11 2068 3823 2.0833333333333332e-11 2068 4848 2.0833333333333339e-11 2068 4846 -8.3333333333333330e-11 2068 4255 -2.0833333333333336e-11 2068 4241 2.0833333333333332e-11 2069 2069 5.8333333333333328e-10 2069 1602 1.0416666666666666e-11 2069 2068 8.3333333333333330e-11 2069 2070 1.6155871338926322e-27 2069 1606 -6.2499999999999991e-11 2069 1604 4.1666666666666665e-11 2069 1598 -1.0416666666666666e-11 2069 1599 4.1666666666666665e-11 2069 1774 2.0833333333333332e-11 2069 1773 1.2499999999999998e-10 2069 2063 -8.3333333333333330e-11 2069 2062 1.6155871338926322e-27 2069 1237 1.0416666666666666e-11 2069 1236 4.1666666666666678e-11 2069 4255 -4.1666666666666665e-11 2069 3783 -5.2083333333333334e-11 2069 3790 -1.0416666666666667e-10 2070 2070 2.4999999999999996e-10 2070 2326 2.2913451068275814e-27 2070 1599 -2.0833333333333326e-11 2070 2068 -2.0833333333333336e-11 2070 2069 9.5018296033870872e-28 2070 1606 -1.0416666666666665e-11 2070 1604 -2.0833333333333326e-11 2070 4255 -1.0416666666666665e-11 2071 2071 2.0833333333333331e-10 2072 2072 3.3333333333333332e-10 2072 1607 -4.0939925783957852e-29 2072 1603 -6.2500000000000004e-11 2072 2038 -4.1666666666666671e-11 2072 1566 -4.1666666666666665e-11 2072 1570 -6.2500000000000004e-11 2073 2073 2.4999999999999996e-10 2074 2074 6.6666666666666664e-10 2074 1573 -1.0416666666666666e-11 2074 2078 -8.3333333333333330e-11 2074 1578 6.2499999999999991e-11 2074 2043 8.3333333333333330e-11 2074 2040 -1.6155871338926322e-27 2074 1233 -1.0416666666666666e-11 2074 1238 6.2499999999999991e-11 2074 1243 -4.1666666666666665e-11 2074 2076 8.3333333333333330e-11 2074 2075 1.6155871338926322e-27 2074 1468 6.2499999999999991e-11 2074 1950 8.3333333333333330e-11 2074 1438 6.2499999999999991e-11 2074 4891 1.6155871338926322e-27 2074 4380 -4.1666666666666665e-11 2074 3975 -1.0416666666666666e-11 2074 3791 -1.0416666666666666e-11 2074 3968 -1.0416666666666666e-11 2074 3969 -4.1666666666666665e-11 2074 4615 1.6155871338926322e-27 2074 3950 -1.0416666666666666e-11 2074 3953 -4.1666666666666665e-11 2075 2075 2.4999999999999996e-10 2075 1238 1.0416666666666665e-11 2075 2076 -2.0833333333333332e-11 2075 2074 9.5018296033870872e-28 2075 1468 1.0416666666666665e-11 2075 1243 2.0833333333333326e-11 2075 3968 6.2499999999999991e-11 2075 3967 1.0416666666666666e-11 2075 3969 2.0833333333333326e-11 2075 4887 2.0833333333333339e-11 2075 4888 -2.2913451068275814e-27 2075 3791 6.2499999999999991e-11 2075 3792 1.0416666666666666e-11 2076 2076 4.1666666666666657e-10 2076 1471 1.8812360437258079e-27 2076 1243 -2.0833333333333332e-11 2076 2075 -2.0833333333333336e-11 2076 2074 8.3333333333333330e-11 2076 1468 1.0416666666666676e-11 2076 1803 -1.0416666666666667e-10 2076 1802 -2.3107708066186488e-27 2076 1238 1.0416666666666669e-11 2076 1230 1.8812360437258079e-27 2076 3968 -9.3750000000000012e-11 2076 3969 -2.0833333333333332e-11 2076 3791 -9.3749999999999999e-11 2077 2077 4.9999999999999993e-10 2077 1445 -1.0416666666666666e-11 2077 1230 -5.2083333333333334e-11 2077 1802 2.0833333333333332e-11 2077 1808 1.2500000000000001e-10 2077 1438 -2.0833333333333339e-11 2077 1442 -1.0416666666666668e-11 2077 1443 4.1666666666666665e-11 2077 2021 2.0833333333333332e-11 2077 2020 1.2499999999999998e-10 2077 1238 -1.4583333333333335e-10 2077 1231 -5.2083333333333334e-11 2077 1239 4.1666666666666671e-11 2078 2078 4.5833333333333325e-10 2078 1575 5.2083333333333334e-11 2078 2026 4.1666666666666665e-11 2078 2021 -8.3333333333333330e-11 2078 1445 1.0416666666666665e-11 2078 1438 -1.6155871338926322e-27 2078 2074 -8.3333333333333330e-11 2078 1578 -8.0779356694631609e-27 2078 3953 2.0833333333333332e-11 2078 4891 2.0833333333333336e-11 2078 4380 2.0833333333333332e-11 2079 2079 2.4999999999999996e-10 2080 2080 2.4999999999999996e-10 2080 2081 9.5018296033870872e-28 2080 1200 1.0416666666666666e-11 2080 1192 2.0833333333333326e-11 2080 1997 2.0833333333333339e-11 2080 1996 2.2913451068275814e-27 2080 1515 1.0416666666666666e-11 2080 1516 2.0833333333333326e-11 2081 2081 6.6666666666666664e-10 2081 2080 1.6155871338926322e-27 2081 1192 -4.1666666666666665e-11 2081 1742 -1.6155871338926322e-27 2081 1181 -4.1666666666666665e-11 2081 2086 1.6155871338926322e-27 2081 1625 -4.1666666666666665e-11 2081 2082 1.6155871338926322e-27 2081 1516 -4.1666666666666665e-11 2082 2082 2.4999999999999996e-10 2082 2011 2.2913451068275814e-27 2082 1625 2.0833333333333326e-11 2082 2081 9.5018296033870872e-28 2082 1516 2.0833333333333326e-11 2083 2083 6.6666666666666664e-10 2083 1164 -1.0416666666666666e-11 2083 2103 -8.3333333333333330e-11 2083 2087 -1.8175355256292112e-27 2083 1534 -1.0416666666666666e-11 2083 1543 6.2499999999999991e-11 2083 1546 -4.1666666666666665e-11 2083 1175 -1.0416666666666666e-11 2083 2101 -8.3333333333333330e-11 2083 2086 -1.8175355256292112e-27 2083 1182 6.2499999999999991e-11 2083 1181 -4.1666666666666665e-11 2083 1748 8.3333333333333330e-11 2083 1747 -1.6155871338926322e-27 2083 1150 -1.0416666666666666e-11 2083 1161 6.2499999999999991e-11 2083 1159 -4.1666666666666665e-11 2083 2102 -8.3333333333333330e-11 2083 2084 1.6155871338926322e-27 2083 1623 6.2499999999999991e-11 2083 1625 -4.1666666666666665e-11 2084 2084 2.4999999999999996e-10 2084 1543 1.0416666666666663e-11 2084 2011 2.2913451068275814e-27 2084 1546 2.0833333333333326e-11 2084 2102 2.0833333333333336e-11 2084 2083 9.5018296033870872e-28 2084 1623 1.0416666666666666e-11 2084 1625 2.0833333333333326e-11 2085 2085 2.4999999999999996e-10 2085 1212 1.0416666666666663e-11 2085 1998 2.0833333333333336e-11 2085 1996 -9.5018296033870872e-28 2085 1200 1.0416666666666666e-11 2085 1191 6.2500000000000004e-11 2085 1190 1.0416666666666663e-11 2085 1192 2.0833333333333326e-11 2085 1737 2.0833333333333336e-11 2085 1738 2.2913451068275814e-27 2085 1220 6.2500000000000004e-11 2085 1219 1.0416666666666666e-11 2085 1214 2.0833333333333326e-11 2086 2086 2.4999999999999996e-10 2086 2081 9.5018296033870872e-28 2086 1623 1.0416666666666666e-11 2086 1625 2.0833333333333326e-11 2086 2101 2.0833333333333339e-11 2086 2083 -2.2913451068275814e-27 2086 1182 1.0416666666666666e-11 2086 1181 2.0833333333333326e-11 2087 2087 2.4999999999999996e-10 2087 1533 1.0416666666666665e-11 2087 2002 2.0833333333333332e-11 2087 2003 -9.5018296033870872e-28 2087 1166 1.0416666666666665e-11 2087 1164 6.2499999999999991e-11 2087 1161 1.0416666666666666e-11 2087 1159 2.0833333333333326e-11 2087 2103 2.0833333333333339e-11 2087 2083 -2.2913451068275814e-27 2087 1534 6.2499999999999991e-11 2087 1543 1.0416666666666666e-11 2087 1546 2.0833333333333326e-11 2088 2088 4.1666666666666662e-10 2088 1217 -2.0833333333333329e-11 2088 1196 -2.0833333333333329e-11 2088 2090 2.0833333333333339e-11 2088 2316 8.3333333333333330e-11 2088 1220 -8.3333333333333330e-11 2088 1227 2.0833333333333332e-11 2088 1226 -2.0833333333333332e-11 2088 1980 -2.0833333333333339e-11 2088 1979 8.3333333333333330e-11 2088 1191 -8.3333333333333330e-11 2088 1195 2.0833333333333332e-11 2088 1194 -2.0833333333333332e-11 2089 2089 4.1666666666666662e-10 2089 1226 -2.0833333333333329e-11 2089 2090 2.0833333333333339e-11 2089 2099 -8.3333333333333330e-11 2089 1196 -2.0833333333333332e-11 2089 1191 -8.3333333333333330e-11 2089 1202 2.0833333333333336e-11 2089 1189 -2.0833333333333329e-11 2089 1725 -2.0833333333333339e-11 2089 1722 8.3333333333333330e-11 2089 1220 -8.3333333333333330e-11 2089 1224 2.0833333333333336e-11 2089 1221 -2.0833333333333332e-11 2090 2090 2.4999999999999996e-10 2090 1224 -1.0416666666666663e-11 2090 2089 2.0833333333333336e-11 2090 2099 9.5018296033870872e-28 2090 1202 -1.0416666666666666e-11 2090 1191 -6.2500000000000004e-11 2090 1195 -1.0416666666666663e-11 2090 1196 -2.0833333333333326e-11 2090 2088 2.0833333333333336e-11 2090 2316 2.2913451068275814e-27 2090 1220 -6.2500000000000004e-11 2090 1227 -1.0416666666666666e-11 2090 1226 -2.0833333333333326e-11 2091 2091 2.0833333333333331e-10 2092 2092 2.0833333333333331e-10 2093 2093 4.1666666666666662e-10 2093 1210 2.0833333333333332e-11 2093 1615 2.0833333333333332e-11 2093 1734 2.0833333333333336e-11 2093 1732 -8.3333333333333330e-11 2093 1223 8.3333333333333330e-11 2093 1222 -2.0833333333333336e-11 2093 1221 2.0833333333333332e-11 2093 1762 2.0833333333333336e-11 2093 1761 -8.3333333333333330e-11 2093 1612 8.3333333333333330e-11 2093 1611 -2.0833333333333336e-11 2093 1610 2.0833333333333332e-11 2094 2094 4.1666666666666662e-10 2094 1282 8.3333333333333330e-11 2094 1281 -2.0833333333333336e-11 2094 1283 2.0833333333333332e-11 2094 1732 -8.3333333333333330e-11 2094 1620 8.3333333333333330e-11 2094 1611 -2.0833333333333336e-11 2094 1615 2.0833333333333332e-11 2094 1610 2.0833333333333332e-11 2094 1768 2.0833333333333339e-11 2094 1761 -8.3333333333333330e-11 2094 1276 2.0833333333333332e-11 2094 1023 2.0833333333333339e-11 2095 2095 2.4999999999999996e-10 2095 1228 -1.0416666666666665e-11 2095 1616 -1.0416666666666666e-11 2095 2097 2.0833333333333339e-11 2095 2099 -2.2913451068275814e-27 2095 1223 -6.2499999999999991e-11 2095 1224 -1.0416666666666666e-11 2095 1226 -2.0833333333333326e-11 2095 2096 -2.0833333333333332e-11 2095 2315 -9.5018296033870872e-28 2095 1612 -6.2499999999999991e-11 2095 1614 -1.0416666666666665e-11 2095 1613 -2.0833333333333326e-11 2096 2096 4.1666666666666662e-10 2096 1612 8.3333333333333330e-11 2096 1614 -2.0833333333333336e-11 2096 1223 8.3333333333333330e-11 2096 1228 -2.0833333333333336e-11 2096 1226 2.0833333333333332e-11 2096 2095 -2.0833333333333336e-11 2096 2315 -8.3333333333333330e-11 2096 1613 2.0833333333333332e-11 2096 228 2.0833333333333332e-11 2096 1075 2.0833333333333336e-11 2096 816 8.3333333333333330e-11 2096 4318 2.0833333333333332e-11 2097 2097 4.1666666666666662e-10 2097 1613 -2.0833333333333332e-11 2097 2095 2.0833333333333339e-11 2097 2099 -8.3333333333333330e-11 2097 1226 -2.0833333333333332e-11 2097 1223 -8.3333333333333330e-11 2097 1224 2.0833333333333339e-11 2097 1221 -2.0833333333333332e-11 2097 1734 -2.0833333333333339e-11 2097 1722 8.3333333333333330e-11 2097 1612 -8.3333333333333330e-11 2097 1616 2.0833333333333339e-11 2097 1615 -2.0833333333333332e-11 2098 2098 4.1666666666666662e-10 2098 1146 2.0833333333333329e-11 2098 2100 2.0833333333333339e-11 2098 2099 8.3333333333333330e-11 2098 1613 2.0833333333333332e-11 2098 1617 8.3333333333333330e-11 2098 1616 -2.0833333333333336e-11 2098 1615 2.0833333333333329e-11 2098 1723 2.0833333333333339e-11 2098 1722 -8.3333333333333330e-11 2098 1143 8.3333333333333330e-11 2098 1142 -2.0833333333333336e-11 2098 1139 2.0833333333333332e-11 2099 2099 6.6666666666666664e-10 2099 1612 1.0416666666666666e-11 2099 1143 1.0416666666666666e-11 2099 2098 8.3333333333333330e-11 2099 2100 -1.6155871338926322e-27 2099 1617 1.0416666666666666e-11 2099 1616 -6.2499999999999991e-11 2099 1613 4.1666666666666665e-11 2099 2097 -8.3333333333333330e-11 2099 2095 -1.8175355256292112e-27 2099 1223 1.0416666666666666e-11 2099 1220 1.0416666666666666e-11 2099 1224 -6.2499999999999991e-11 2099 1226 4.1666666666666665e-11 2099 2089 -8.3333333333333330e-11 2099 2090 1.6155871338926322e-27 2099 1191 1.0416666666666666e-11 2099 1202 -6.2499999999999991e-11 2099 1196 4.1666666666666665e-11 2099 1755 -8.3333333333333330e-11 2099 1754 -1.8175355256292112e-27 2099 1142 -6.2499999999999991e-11 2099 1146 4.1666666666666665e-11 2100 2100 2.4999999999999996e-10 2100 1617 6.2500000000000004e-11 2100 1613 2.0833333333333326e-11 2100 1143 6.2500000000000004e-11 2100 1146 2.0833333333333326e-11 2100 1142 1.0416666666666663e-11 2100 2098 2.0833333333333336e-11 2100 2099 -9.5018296033870872e-28 2100 1616 1.0416666666666666e-11 2100 230 1.0416666666666663e-11 2100 553 2.0833333333333336e-11 2100 552 2.2913451068275814e-27 2100 100 1.0416666666666666e-11 2101 2101 4.1666666666666662e-10 2101 1177 2.0833333333333332e-11 2101 1625 2.0833333333333332e-11 2101 2086 2.0833333333333339e-11 2101 2083 -8.3333333333333330e-11 2101 1182 -2.0833333333333339e-11 2101 1181 2.0833333333333332e-11 2101 1823 2.0833333333333339e-11 2101 1822 -8.3333333333333330e-11 2101 1623 -2.0833333333333339e-11 2101 1622 2.0833333333333332e-11 2102 2102 4.1666666666666662e-10 2102 1546 2.0833333333333329e-11 2102 1622 2.0833333333333329e-11 2102 1834 2.0833333333333339e-11 2102 1822 -8.3333333333333330e-11 2102 1543 -2.0833333333333336e-11 2102 1542 2.0833333333333332e-11 2102 2084 2.0833333333333339e-11 2102 2083 -8.3333333333333330e-11 2102 1623 -2.0833333333333336e-11 2102 1625 2.0833333333333332e-11 2103 2103 4.1666666666666662e-10 2103 1159 2.0833333333333332e-11 2103 2087 2.0833333333333339e-11 2103 2083 -8.3333333333333330e-11 2103 1546 2.0833333333333332e-11 2103 1534 8.3333333333333330e-11 2103 1543 -2.0833333333333339e-11 2103 1542 2.0833333333333332e-11 2103 1833 2.0833333333333339e-11 2103 1822 -8.3333333333333330e-11 2103 1164 8.3333333333333330e-11 2103 1161 -2.0833333333333339e-11 2103 1157 2.0833333333333332e-11 2104 2104 2.0833333333333331e-10 2105 2105 2.0833333333333331e-10 2106 2106 2.0833333333333331e-10 2107 2107 5.8333333333333328e-10 2107 1570 1.0416666666666665e-11 2107 2123 2.0833333333333329e-11 2107 2109 1.2499999999999998e-10 2107 1532 5.2083333333333334e-11 2107 1538 -4.1666666666666678e-11 2107 2113 -1.8175355256292112e-27 2107 1636 -4.1666666666666665e-11 2107 2108 -1.8175355256292112e-27 2107 1567 -4.1666666666666665e-11 2108 2108 2.4999999999999996e-10 2108 2029 -9.5018296033870872e-28 2108 1636 2.0833333333333326e-11 2108 2107 -2.2913451068275814e-27 2108 1567 2.0833333333333326e-11 2109 2109 9.1666666666666660e-10 2109 1232 5.2083333333333334e-11 2109 1154 -1.0416666666666665e-11 2109 1780 -3.2311742677852644e-27 2109 1783 8.3333333333333330e-11 2109 1235 -1.0416666666666668e-11 2109 1234 -4.1666666666666665e-11 2109 1244 1.0416666666666667e-10 2109 1534 -1.0416666666666665e-11 2109 2107 1.2499999999999998e-10 2109 2123 4.1666666666666665e-11 2109 1538 -4.1666666666666678e-11 2109 1532 1.0416666666666667e-10 2109 2112 -1.0097419586828951e-27 2109 2121 8.3333333333333330e-11 2109 1164 -1.0416666666666668e-11 2109 1162 -4.1666666666666665e-11 2109 1165 6.2500000000000004e-11 2109 2037 -1.2499999999999998e-10 2109 2036 4.1666666666666658e-11 2109 1566 -3.1250000000000002e-11 2109 1567 -1.6666666666666666e-10 2109 1570 2.0833333333333339e-11 2110 2110 6.6666666666666664e-10 2110 1168 -1.0416666666666666e-11 2110 2118 -8.3333333333333330e-11 2110 2114 1.6155871338926322e-27 2110 1551 -1.0416666666666666e-11 2110 1560 6.2499999999999991e-11 2110 1563 -4.1666666666666665e-11 2110 1534 -1.0416666666666666e-11 2110 2115 -8.3333333333333330e-11 2110 2113 1.6155871338926322e-27 2110 1539 6.2499999999999991e-11 2110 1538 -4.1666666666666665e-11 2110 2117 -8.3333333333333330e-11 2110 2112 1.6155871338926322e-27 2110 1164 -1.0416666666666666e-11 2110 1163 6.2499999999999991e-11 2110 1162 -4.1666666666666665e-11 2110 2116 -8.3333333333333330e-11 2110 2111 1.6155871338926322e-27 2110 1634 6.2499999999999991e-11 2110 1636 -4.1666666666666665e-11 2111 2111 2.4999999999999996e-10 2111 1560 1.0416666666666665e-11 2111 2029 2.2913451068275814e-27 2111 1563 2.0833333333333326e-11 2111 2116 2.0833333333333332e-11 2111 2110 9.5018296033870872e-28 2111 1634 1.0416666666666665e-11 2111 1636 2.0833333333333326e-11 2112 2112 2.4999999999999996e-10 2112 1532 1.0416666666666668e-11 2112 2121 -2.0833333333333339e-11 2112 2109 -4.5053818449435037e-28 2112 1165 1.0416666666666666e-11 2112 1534 6.2499999999999991e-11 2112 1539 1.0416666666666665e-11 2112 1538 2.0833333333333332e-11 2112 2117 2.0833333333333332e-11 2112 2110 9.5018296033870872e-28 2112 1164 6.2499999999999991e-11 2112 1163 1.0416666666666665e-11 2112 1162 2.0833333333333323e-11 2113 2113 2.4999999999999996e-10 2113 2107 -2.2913451068275814e-27 2113 1634 1.0416666666666665e-11 2113 1636 2.0833333333333326e-11 2113 2115 2.0833333333333336e-11 2113 2110 9.5018296033870872e-28 2113 1539 1.0416666666666665e-11 2113 1538 2.0833333333333326e-11 2114 2114 2.4999999999999996e-10 2114 1550 1.0416666666666666e-11 2114 2018 2.0833333333333339e-11 2114 2019 2.2913451068275814e-27 2114 1170 1.0416666666666666e-11 2114 1168 6.2499999999999991e-11 2114 1163 1.0416666666666665e-11 2114 1162 2.0833333333333326e-11 2114 2118 2.0833333333333336e-11 2114 2110 9.5018296033870872e-28 2114 1551 6.2500000000000004e-11 2114 1560 1.0416666666666665e-11 2114 1563 2.0833333333333326e-11 2115 2115 4.1666666666666662e-10 2115 1542 2.0833333333333332e-11 2115 1636 2.0833333333333332e-11 2115 2113 2.0833333333333339e-11 2115 2110 -8.3333333333333330e-11 2115 1539 -2.0833333333333336e-11 2115 1538 2.0833333333333332e-11 2115 1827 2.0833333333333339e-11 2115 1826 -8.3333333333333330e-11 2115 1634 -2.0833333333333336e-11 2115 1633 2.0833333333333332e-11 2116 2116 4.1666666666666662e-10 2116 1563 2.0833333333333332e-11 2116 1633 2.0833333333333332e-11 2116 1836 2.0833333333333336e-11 2116 1826 -8.3333333333333330e-11 2116 1560 -2.0833333333333336e-11 2116 1559 2.0833333333333332e-11 2116 2111 2.0833333333333336e-11 2116 2110 -8.3333333333333330e-11 2116 1634 -2.0833333333333336e-11 2116 1636 2.0833333333333332e-11 2117 2117 4.1666666666666662e-10 2117 1157 2.0833333333333332e-11 2117 1833 2.0833333333333336e-11 2117 1826 -8.3333333333333330e-11 2117 1542 2.0833333333333332e-11 2117 1534 8.3333333333333330e-11 2117 1539 -2.0833333333333336e-11 2117 1538 2.0833333333333332e-11 2117 2112 2.0833333333333336e-11 2117 2110 -8.3333333333333330e-11 2117 1164 8.3333333333333330e-11 2117 1163 -2.0833333333333336e-11 2117 1162 2.0833333333333332e-11 2118 2118 4.1666666666666662e-10 2118 1162 2.0833333333333332e-11 2118 2114 2.0833333333333339e-11 2118 2110 -8.3333333333333330e-11 2118 1563 2.0833333333333332e-11 2118 1551 8.3333333333333330e-11 2118 1560 -2.0833333333333336e-11 2118 1559 2.0833333333333332e-11 2118 1835 2.0833333333333339e-11 2118 1826 -8.3333333333333330e-11 2118 1168 8.3333333333333330e-11 2118 1163 -2.0833333333333336e-11 2118 1157 2.0833333333333332e-11 2119 2119 2.0833333333333331e-10 2120 2120 2.0833333333333331e-10 2121 2121 4.1666666666666662e-10 2121 1166 -3.6295685768920020e-28 2121 1538 -2.0833333333333332e-11 2121 2112 -2.0833333333333336e-11 2121 2109 8.3333333333333330e-11 2121 1164 -9.3750000000000012e-11 2121 1162 -2.0833333333333332e-11 2121 1165 1.0416666666666674e-11 2121 2002 -1.0416666666666667e-10 2121 2001 9.5018296033870872e-28 2121 1534 -9.3750000000000012e-11 2121 1533 1.8812360437258079e-27 2121 1532 1.0416666666666671e-11 2122 2122 2.0833333333333331e-10 2123 2123 4.1666666666666668e-10 2123 1603 6.2499999999999991e-11 2123 2129 2.6253290925755273e-27 2123 1567 -4.1666666666666671e-11 2123 1570 -1.0416666666666674e-11 2123 2107 2.0833333333333332e-11 2123 2109 4.1666666666666665e-11 2123 1538 6.0691943799667649e-29 2123 1532 1.0416666666666671e-11 2124 2124 2.0833333333333329e-10 2125 2125 2.0833333333333331e-10 2126 2126 2.0833333333333331e-10 2127 2127 2.0833333333333331e-10 2128 2128 9.1666666666666650e-10 2128 1211 3.1250000000000002e-11 2128 2004 1.2499999999999998e-10 2128 2001 -4.1666666666666665e-11 2128 1533 -5.2083333333333334e-11 2128 1547 4.1666666666666671e-11 2128 1532 -1.0416666666666667e-10 2128 1602 1.0416666666666665e-11 2128 2062 -1.0097419586828951e-27 2128 2064 -8.3333333333333330e-11 2128 1237 1.0416666666666668e-11 2128 1236 4.1666666666666671e-11 2128 1244 -1.0416666666666667e-10 2128 1773 1.2499999999999998e-10 2128 1772 -4.1666666666666658e-11 2128 1216 1.6666666666666666e-10 2128 1225 -2.0833333333333339e-11 2128 2325 -3.2311742677852644e-27 2128 2129 8.3333333333333330e-11 2128 1604 4.1666666666666665e-11 2128 1603 -6.2499999999999991e-11 2128 3783 -5.2083333333333334e-11 2128 4320 3.1250000000000002e-11 2129 2129 4.1666666666666668e-10 2129 1547 2.0833333333333329e-11 2129 2123 3.0991386737738975e-27 2129 1532 -1.0416666666666669e-11 2129 2325 2.0833333333333332e-11 2129 2128 8.3333333333333330e-11 2129 1604 2.0833333333333332e-11 2129 1603 -1.0416666666666671e-11 2130 2130 9.1666666666666646e-02 2130 1789 1.2499999999999997e-02 2130 1793 -4.1666666666666675e-03 2130 1255 4.1666666666666675e-03 2130 1254 -1.0416666666666664e-02 2130 1505 1.0416666666666664e-03 2130 2140 -1.2197274440461925e-19 2130 2135 8.3333333333333315e-03 2130 1450 1.0416666666666667e-03 2130 1448 4.1666666666666675e-03 2130 1455 -1.0416666666666666e-02 2130 2143 -1.2499999999999997e-02 2130 2134 4.1666666666666657e-03 2130 1249 1.6666666666666663e-02 2130 1250 -2.0833333333333337e-03 2130 2142 -1.2197274440461925e-19 2130 2131 8.3333333333333315e-03 2130 1500 4.1666666666666657e-03 2130 1499 -6.2499999999999995e-03 2130 4288 3.1249999999999997e-03 2130 4021 -5.2083333333333330e-03 2130 2835 -5.2083333333333322e-03 2130 2837 3.1249999999999997e-03 2131 2131 4.1666666666666657e-02 2131 1255 2.0833333333333329e-03 2131 2136 1.5502688168223823e-19 2131 1254 -1.0416666666666667e-03 2131 2142 2.0833333333333333e-03 2131 2130 8.3333333333333315e-03 2131 1500 2.0833333333333333e-03 2131 1499 -1.0416666666666669e-03 2132 2132 4.1666666666666657e-02 2132 2133 8.3333333333333315e-03 2132 1647 -1.0416666666666671e-03 2132 1793 -1.5502688168223823e-19 2132 1254 -1.0416666666666669e-03 2132 3964 -5.0116116045879435e-20 2132 4015 2.0833333333333329e-03 2132 4595 2.0833333333333337e-03 2132 3962 9.3750000000000014e-03 2132 3956 2.0833333333333333e-03 2132 4654 1.0416666666666668e-02 2132 4018 9.3749999999999997e-03 2132 4021 -2.1705219273391446e-19 2133 2133 9.1666666666666646e-02 2133 1451 -5.2083333333333330e-03 2133 1646 1.0416666666666664e-03 2133 2193 -1.2197274440461925e-19 2133 2138 8.3333333333333315e-03 2133 1458 1.0416666666666667e-03 2133 1456 4.1666666666666675e-03 2133 1455 -1.0416666666666666e-02 2133 2136 4.1666666666666657e-03 2133 1254 -1.0416666666666664e-02 2133 2132 8.3333333333333315e-03 2133 1647 -6.2499999999999995e-03 2133 1930 1.2499999999999999e-02 2133 1928 -4.1666666666666657e-03 2133 1434 3.1249999999999997e-03 2133 1439 -2.0833333333333337e-03 2133 4018 1.0416666666666664e-03 2133 4588 -1.2499999999999997e-02 2133 4015 4.1666666666666675e-03 2133 4595 -1.2197274440461925e-19 2133 3962 1.0416666666666667e-03 2133 3956 4.1666666666666657e-03 2133 3948 1.6666666666666663e-02 2134 2134 4.1666666666666657e-02 2134 1648 -5.2083333333333330e-03 2134 1458 -2.1684043449710089e-19 2134 2138 8.1315162936412833e-20 2134 1646 -4.9904357809065860e-20 2134 1647 -6.2499999999999995e-03 2134 2137 -4.3368086899420177e-19 2134 1251 3.1249999999999997e-03 2134 1448 -2.1684043449710089e-19 2134 1455 -1.0416666666666662e-03 2134 2143 -2.0833333333333329e-03 2134 2130 4.1666666666666666e-03 2134 1249 4.1666666666666666e-03 2134 1250 1.0416666666666654e-03 2134 3386 -2.3039296165316969e-19 2134 2823 1.0416666666666669e-03 2134 3392 -8.3333333333333332e-03 2134 2835 1.0416666666666675e-03 2134 2837 1.2499999999999999e-02 2135 2135 4.1666666666666657e-02 2135 1451 -5.0116116045879435e-20 2135 1931 1.0416666666666668e-02 2135 1928 -1.5502688168223823e-19 2135 1509 -2.1705219273391446e-19 2135 1505 9.3749999999999997e-03 2135 1500 2.0833333333333329e-03 2135 1499 -1.0416666666666669e-03 2135 2140 2.0833333333333337e-03 2135 2130 8.3333333333333315e-03 2135 1450 9.3750000000000014e-03 2135 1448 2.0833333333333333e-03 2135 1455 -1.0416666666666671e-03 2136 2136 4.1666666666666657e-02 2136 2133 4.1666666666666666e-03 2136 1439 1.0416666666666671e-03 2136 1499 -6.2499999999999995e-03 2136 2131 8.1315162936412833e-20 2136 1254 -1.0416666666666671e-03 2136 3948 4.1666666666666657e-03 2136 4588 -2.0833333333333329e-03 2136 4015 -1.4973071994693204e-20 2137 2137 3.3333333333333326e-02 2137 2134 -4.3368086899420177e-19 2137 1251 1.6666666666666663e-02 2137 1250 6.2499999999999986e-03 2137 1793 -4.3368086899420177e-19 2137 1648 4.1666666666666675e-03 2137 1647 6.2499999999999986e-03 2137 2823 -4.0939925783957855e-21 2137 3392 4.1666666666666675e-03 2137 2837 4.1666666666666666e-03 2137 4288 4.1666666666666657e-03 2137 4958 4.1666666666666666e-03 2137 3964 -1.6284208410963924e-19 2138 2138 4.1666666666666657e-02 2138 2193 2.0833333333333333e-03 2138 2133 8.3333333333333315e-03 2138 1456 2.0833333333333333e-03 2138 1458 9.3749999999999997e-03 2138 1455 -1.0416666666666669e-03 2138 2134 1.5502688168223823e-19 2138 1646 9.3750000000000014e-03 2138 1647 -1.0416666666666667e-03 2138 3956 2.0833333333333329e-03 2138 2835 -5.0116116045879435e-20 2138 3386 1.0416666666666668e-02 2138 2823 -2.1705219273391446e-19 2139 2139 5.8333333333333320e-02 2139 1505 -1.0416666666666669e-03 2139 2155 -8.3333333333333315e-03 2139 2144 2.7105054312137611e-20 2139 1510 6.2500000000000003e-03 2139 1500 -4.1666666666666666e-03 2139 1081 4.1666666666666666e-03 2139 1083 1.0416666666666664e-03 2139 1085 -4.1666666666666657e-03 2139 2153 -2.0833333333333329e-03 2139 2143 1.2499999999999997e-02 2139 2146 8.3333333333333315e-03 2139 2140 2.7105054312137611e-20 2139 1450 -1.0416666666666667e-03 2139 1449 1.0416666666666666e-02 2139 1448 -4.1666666666666675e-03 2139 2835 5.2083333333333330e-03 2140 2140 2.4999999999999998e-02 2140 1510 1.0416666666666664e-03 2140 1505 6.2499999999999995e-03 2140 1500 2.0833333333333329e-03 2140 1499 1.0416666666666667e-03 2140 2135 2.0833333333333337e-03 2140 2130 5.1510191104902139e-20 2140 1455 1.0416666666666664e-03 2140 2146 -2.0833333333333337e-03 2140 2139 6.0159191589756597e-20 2140 1450 6.2499999999999995e-03 2140 1449 1.0416666666666662e-03 2140 1448 2.0833333333333324e-03 2141 2141 4.9999999999999989e-02 2141 1087 1.0416666666666664e-03 2141 2150 -2.0833333333333329e-03 2141 2143 1.2499999999999999e-02 2141 1083 1.0416666666666667e-03 2141 1085 -4.1666666666666666e-03 2141 1790 -2.0833333333333329e-03 2141 1789 -1.2499999999999997e-02 2141 1249 -4.1666666666666675e-03 2141 2837 5.2083333333333322e-03 2141 4288 5.2083333333333330e-03 2142 2142 2.4999999999999998e-02 2142 1254 1.0416666666666667e-03 2142 1255 2.0833333333333329e-03 2142 2145 6.0159191589756597e-20 2142 2131 2.0833333333333337e-03 2142 2130 5.1510191104902139e-20 2142 1500 2.0833333333333320e-03 2142 1499 1.0416666666666664e-03 2143 2143 8.3333333333333315e-02 2143 1081 -3.1249999999999997e-03 2143 2150 -4.1666666666666666e-03 2143 2141 1.2499999999999999e-02 2143 1083 2.0833333333333342e-03 2143 1085 -1.6666666666666666e-02 2143 2153 -4.1666666666666657e-03 2143 2139 1.2499999999999997e-02 2143 1449 5.2083333333333330e-03 2143 1448 -4.1666666666666675e-03 2143 1455 5.2083333333333330e-03 2143 2134 -2.0833333333333329e-03 2143 2130 -1.2499999999999999e-02 2143 1249 -4.1666666666666666e-03 2143 1250 1.0416666666666667e-03 2143 2835 1.4583333333333330e-02 2143 2837 8.3333333333333332e-03 2144 2144 2.4999999999999998e-02 2144 2145 -1.0254392617697373e-19 2144 1081 1.0416666666666664e-03 2144 1085 2.0833333333333329e-03 2144 2155 2.0833333333333337e-03 2144 2139 6.0159191589756597e-20 2144 1510 1.0416666666666664e-03 2144 1500 2.0833333333333329e-03 2145 2145 5.8333333333333320e-02 2145 1791 -2.0833333333333329e-03 2145 1789 -1.2499999999999999e-02 2145 1087 1.0416666666666667e-03 2145 1255 -4.1666666666666657e-03 2145 2142 2.7105054312137611e-20 2145 1500 -4.1666666666666666e-03 2145 2144 1.3552527156068805e-20 2145 1085 -4.1666666666666675e-03 2145 4021 5.2083333333333322e-03 2146 2146 2.0833333541666669e-02 2146 1131 2.0833333333333329e-11 2146 1453 -2.0833333333333329e-11 2146 2157 -2.0833333333333336e-11 2146 1136 2.0833333333333326e-11 2146 1135 6.2499999999999991e-11 2146 2149 2.0833333333333336e-11 2146 1134 -2.1169082391605852e-27 2146 2148 2.0833333333333326e-11 2146 2158 -2.0833333333333326e-11 2146 1504 -2.0833333333333329e-11 2146 1505 -4.1666666979166657e-03 2146 1510 1.0416666666666664e-03 2146 1500 -2.0833333333333333e-03 2146 2140 -2.0833333333333337e-03 2146 2139 8.3333333333333315e-03 2146 1450 -4.1666666979166666e-03 2146 1449 1.0416666666666671e-03 2146 1448 -2.0833333333333329e-03 2147 2147 4.1666666666666662e-10 2147 1136 2.0833333333333329e-11 2147 1504 -2.0833333333333326e-11 2147 2308 -2.0833333333333339e-11 2147 1131 2.0833333333333329e-11 2147 1129 6.2499999999999991e-11 2147 2148 2.0833333333333336e-11 2147 1134 -3.5628902784306998e-27 2147 2149 2.0833333333333326e-11 2147 2309 -2.0833333333333332e-11 2147 1453 -2.0833333333333329e-11 2147 1482 2.0833333333333329e-11 2147 1452 -2.0833333333333326e-11 2147 1450 -6.2499999999999991e-11 2147 1461 3.5628902784306998e-27 2147 1944 2.0833333333333339e-11 2147 1475 2.0833333333333329e-11 2147 1497 6.2499999999999991e-11 2147 1941 -2.0833333333333336e-11 2147 1498 -3.5628902784306998e-27 2147 1974 -2.0833333333333326e-11 2147 1973 2.0833333333333332e-11 2147 1506 -2.0833333333333329e-11 2147 1505 -6.2499999999999991e-11 2147 1502 3.5628902784306998e-27 2148 2148 2.9166666666666664e-10 2148 1502 1.5039633158038590e-27 2148 2308 4.1666666666666665e-11 2148 1129 2.0833333333333332e-11 2148 2147 2.0833333333333336e-11 2148 1131 1.0416666666666666e-10 2148 1135 2.0833333333333329e-11 2148 1134 1.0416666666666663e-11 2148 2158 4.1666666666666652e-11 2148 2146 2.0833333333333326e-11 2148 1504 4.1666666666666658e-11 2148 1505 1.0416666666666665e-11 2148 1510 -1.1213657767716683e-27 2149 2149 2.9166666666666664e-10 2149 1129 2.0833333333333329e-11 2149 2309 4.1666666666666652e-11 2149 2147 2.0833333333333326e-11 2149 1461 -1.3020149240672800e-27 2149 1453 4.1666666666666665e-11 2149 1450 1.0416666666666665e-11 2149 1449 1.1000665323307010e-27 2149 2157 4.1666666666666665e-11 2149 1136 1.0416666666666666e-10 2149 1135 2.0833333333333332e-11 2149 2146 2.0833333333333336e-11 2149 1134 1.0416666666666661e-11 2150 2150 4.1666666666666657e-02 2150 1249 -2.7052114752934217e-20 2150 2141 -2.0833333333333329e-03 2150 2143 -4.1666666666666657e-03 2150 1085 4.1666666666666657e-03 2150 1083 1.0416666666666660e-03 2150 1713 -4.3368086899420177e-19 2150 1107 -6.2499999999999986e-03 2150 2151 2.7105054312137611e-20 2150 2837 -1.0416666666666669e-03 2151 2151 4.1666666666666664e-02 2151 1107 -2.6946235634527430e-19 2151 2150 -1.3753697481041702e-19 2151 3391 3.1800793213478638e-19 2151 2837 -1.0116749763768550e-19 2152 2152 4.1666666666666657e-02 2152 1112 -2.1705219273391446e-19 2152 1449 5.0116116045879435e-20 2152 1101 1.0416666666666668e-02 2152 1107 -5.8569019580184656e-19 2152 2156 1.0416666666666668e-02 2152 2153 4.6263880787845817e-19 2152 1106 2.1705219273391446e-19 2152 2159 1.0416666666666666e-02 2152 1447 1.0416666666666668e-02 2152 1446 -2.1705219273391446e-19 2152 3388 2.7807826960562663e-19 2152 2835 -4.6263880787845817e-19 2153 2153 4.1666666666666657e-02 2153 1085 4.1666666666666666e-03 2153 2139 -2.0833333333333329e-03 2153 2143 -4.1666666666666666e-03 2153 1448 2.1158177161623045e-20 2153 1447 -2.1684043449710089e-19 2153 1449 1.0416666666666673e-03 2153 2152 6.5052130349130266e-19 2153 1101 2.1684043449710089e-19 2153 1107 -6.2499999999999986e-03 2153 2156 -2.1684043449710089e-19 2153 1106 1.0416666666666673e-03 2153 1714 8.3333333333333315e-03 2153 1081 1.2499999999999997e-02 2153 1083 1.0416666666666662e-03 2153 2835 -1.0416666666666667e-03 2154 2154 3.3333333333333326e-02 2154 1645 4.1666666666666657e-03 2154 2165 4.1666666666666675e-03 2154 1112 1.6284208410963924e-19 2154 1107 6.2499999999999986e-03 2154 3388 4.3368086899420177e-19 2154 2813 6.2499999999999986e-03 2155 2155 2.0833333541666669e-02 2155 1118 -2.0833333333333329e-11 2155 1504 2.0833333333333329e-11 2155 2158 2.0833333333333336e-11 2155 1131 -2.0833333333333326e-11 2155 1135 -6.2499999999999991e-11 2155 2168 -2.0833333333333336e-11 2155 1132 2.1169082391605852e-27 2155 1085 2.0833333333333333e-03 2155 2144 2.0833333333333333e-03 2155 2139 -8.3333333333333315e-03 2155 1510 -1.0416666666666671e-03 2155 1500 2.0833333333333329e-03 2155 1719 2.0833333333333326e-11 2155 1718 -2.0833333333333326e-11 2155 1078 2.0833333333333329e-11 2155 1081 -1.0416666666666664e-03 2156 2156 2.0833333541666665e-02 2156 1136 -2.0833333333333329e-11 2156 1102 2.0833333333333329e-11 2156 1711 -2.0833333333333336e-11 2156 1116 -2.0833333333333326e-11 2156 1135 -6.2499999999999991e-11 2156 1709 2.0833333333333336e-11 2156 1138 2.1169082391605852e-27 2156 2152 1.0416666666666666e-02 2156 1101 5.2083333645833339e-03 2156 1107 5.0116116045879435e-20 2156 2153 -3.1800793213478638e-19 2156 1106 -7.0197855461890513e-20 2156 2160 -2.0833333333333326e-11 2156 2157 2.0833333333333326e-11 2156 1453 2.0833333333333329e-11 2156 1447 5.2083333645833330e-03 2156 1449 -1.9324924703178844e-19 2156 2835 2.1705219273391446e-19 2157 2157 2.9166666666666659e-10 2157 1138 -1.5039633158038590e-27 2157 1450 2.0833333333333332e-11 2157 1136 4.1666666666666658e-11 2157 1135 1.0416666666666661e-11 2157 2149 4.1666666666666665e-11 2157 2146 -2.0833333333333336e-11 2157 1134 1.1000665323307010e-27 2157 2160 4.1666666666666652e-11 2157 2156 2.0833333333333326e-11 2157 1453 1.0416666666666666e-10 2157 1447 2.0833333333333329e-11 2157 1449 1.0416666666666661e-11 2158 2158 2.9166666666666659e-10 2158 2168 4.1666666666666665e-11 2158 2155 2.0833333333333336e-11 2158 1132 1.3020149240672800e-27 2158 1131 4.1666666666666658e-11 2158 1135 1.0416666666666661e-11 2158 1134 -1.3233141685082473e-27 2158 2148 4.1666666666666652e-11 2158 2146 -2.0833333333333326e-11 2158 1504 1.0416666666666666e-10 2158 1505 2.0833333333333329e-11 2158 1510 1.0416666666666661e-11 2159 2159 2.0833333541666662e-02 2159 1447 5.2083333645833339e-03 2159 1446 -3.9244095233294840e-19 2159 1101 5.2083333645833339e-03 2159 1112 -3.9244095597945793e-19 2159 1107 -2.1705219273391446e-19 2159 2152 1.0416666666666666e-02 2159 332 -2.0833333333333329e-11 2159 428 2.0833333333333329e-11 2159 781 2.0833333333333336e-11 2159 331 -2.0833333333333326e-11 2159 330 -6.2499999999999991e-11 2159 784 -2.0833333333333336e-11 2159 329 2.1169082391605852e-27 2159 783 -2.0833333333333326e-11 2159 782 2.0833333333333326e-11 2159 433 2.0833333333333329e-11 2159 3388 1.3753697481041702e-19 2159 2835 -2.1705219273391446e-19 2160 2160 2.9166666666666664e-10 2160 1135 2.0833333333333329e-11 2160 1462 1.3233141685082473e-27 2160 2048 4.1666666666666665e-11 2160 1136 1.0416666666666666e-10 2160 1119 2.0833333333333332e-11 2160 2046 -2.0833333333333339e-11 2160 1138 1.0416666666666663e-11 2160 2157 4.1666666666666652e-11 2160 2156 -2.0833333333333326e-11 2160 1453 4.1666666666666665e-11 2160 1447 1.0416666666666665e-11 2160 1449 -1.1000665323307010e-27 2161 2161 2.0833333333333329e-02 2162 2162 2.4999999999999991e-02 2163 2163 2.0833333333333329e-02 2164 2164 2.4999999999999991e-02 2165 2165 2.5000000208333328e-02 2165 1112 1.0416666666666667e-03 2165 1645 1.0416666666666664e-03 2165 2154 4.1666666666666675e-03 2165 1107 5.2083333333333330e-03 2165 328 -2.0833333333333329e-11 2165 433 2.0833333333333329e-11 2165 782 2.0833333333333336e-11 2165 332 -2.0833333333333326e-11 2165 330 -6.2499999999999991e-11 2165 791 2.0833333333333336e-11 2165 333 2.1169082391605852e-27 2165 733 2.0833333333333326e-11 2165 732 -2.0833333333333326e-11 2165 148 2.0833333333333329e-11 2165 2813 1.0416666666666667e-03 2165 3388 -8.3333333333333332e-03 2166 2166 2.0833333333333332e-02 2167 2167 2.0833333333333331e-10 2168 2168 2.9166666666666664e-10 2168 1510 1.1213657767716683e-27 2168 2158 4.1666666666666665e-11 2168 1135 2.0833333333333332e-11 2168 2155 -2.0833333333333336e-11 2168 1131 1.0416666666666666e-10 2168 1123 2.0833333333333329e-11 2168 1132 1.0416666666666663e-11 2168 2291 4.1666666666666652e-11 2168 1504 4.1666666666666665e-11 2169 2169 2.0833333333333332e-02 2170 2170 2.4999999999999994e-02 2171 2171 2.0833333333333332e-02 2172 2172 5.8333333333333328e-10 2172 1378 1.0416666666666665e-11 2172 2184 2.0833333333333329e-11 2172 2174 1.2500000000000001e-10 2172 1549 5.2083333333333334e-11 2172 1555 -4.1666666666666671e-11 2172 2178 1.6155871338926322e-27 2172 1301 -4.1666666666666665e-11 2172 2173 -1.8175355256292112e-27 2172 1375 -4.1666666666666665e-11 2173 2173 2.4999999999999996e-10 2173 2176 9.5018296033870872e-28 2173 1301 2.0833333333333326e-11 2173 2172 -2.2913451068275814e-27 2173 1375 2.0833333333333326e-11 2174 2174 9.1666666666666660e-10 2174 1267 5.2083333333333334e-11 2174 1156 -1.0416666666666665e-11 2174 1813 -3.2311742677852644e-27 2174 1812 8.3333333333333330e-11 2174 1277 -1.0416666666666668e-11 2174 1280 -4.1666666666666671e-11 2174 1279 1.0416666666666667e-10 2174 1551 -1.0416666666666665e-11 2174 2172 1.2499999999999998e-10 2174 2184 4.1666666666666665e-11 2174 1555 -4.1666666666666671e-11 2174 1549 1.0416666666666667e-10 2174 2177 3.2311742677852644e-27 2174 2182 8.3333333333333330e-11 2174 1168 -1.0416666666666668e-11 2174 1167 -4.1666666666666665e-11 2174 1169 6.2500000000000004e-11 2174 1904 -1.2499999999999998e-10 2174 1903 4.1666666666666652e-11 2174 1373 -3.1250000000000002e-11 2174 1375 -1.6666666666666666e-10 2174 1378 2.0833333333333339e-11 2175 2175 6.6666666666666664e-10 2175 1175 -1.0416666666666666e-11 2175 2195 -8.3333333333333330e-11 2175 2179 -1.8175355256292112e-27 2175 1186 6.2499999999999991e-11 2175 1185 -4.1666666666666665e-11 2175 1750 8.3333333333333330e-11 2175 1749 -1.6155871338926322e-27 2175 1150 -1.0416666666666666e-11 2175 1278 -1.0416666666666666e-11 2175 1156 -1.0416666666666666e-11 2175 1171 6.2499999999999991e-11 2175 1167 -4.1666666666666665e-11 2175 1815 8.3333333333333330e-11 2175 1813 1.8175355256292112e-27 2175 1277 -1.0416666666666666e-11 2175 1284 6.2499999999999991e-11 2175 1280 -4.1666666666666665e-11 2175 1912 8.3333333333333330e-11 2175 1911 -1.6155871338926322e-27 2175 1421 -1.0416666666666666e-11 2175 1420 6.2499999999999991e-11 2175 1419 -4.1666666666666665e-11 2176 2176 6.6666666666666664e-10 2176 2173 1.6155871338926322e-27 2176 1301 -4.1666666666666665e-11 2176 1841 -1.6155871338926322e-27 2176 1185 -4.1666666666666665e-11 2176 2179 1.6155871338926322e-27 2176 1419 -4.1666666666666665e-11 2176 1924 -1.6155871338926322e-27 2176 1375 -4.1666666666666665e-11 2177 2177 2.4999999999999996e-10 2177 1549 1.0416666666666669e-11 2177 2182 -2.0833333333333332e-11 2177 2174 3.6839804273821251e-27 2177 1169 1.0416666666666665e-11 2177 1551 6.2499999999999991e-11 2177 1556 1.0416666666666666e-11 2177 1555 2.0833333333333332e-11 2177 1840 2.0833333333333339e-11 2177 1838 2.2913451068275814e-27 2177 1168 6.2499999999999991e-11 2177 1158 1.0416666666666666e-11 2177 1167 2.0833333333333323e-11 2178 2178 2.4999999999999996e-10 2178 2172 9.5018296033870872e-28 2178 1299 1.0416666666666663e-11 2178 1301 2.0833333333333326e-11 2178 1837 2.0833333333333336e-11 2178 1838 2.2913451068275814e-27 2178 1556 1.0416666666666666e-11 2178 1555 2.0833333333333326e-11 2179 2179 2.4999999999999996e-10 2179 2176 9.5018296033870872e-28 2179 1420 1.0416666666666666e-11 2179 1419 2.0833333333333326e-11 2179 2195 2.0833333333333339e-11 2179 2175 -2.2913451068275814e-27 2179 1186 1.0416666666666666e-11 2179 1185 2.0833333333333326e-11 2180 2180 2.0833333333333331e-10 2181 2181 2.0833333333333331e-10 2182 2182 4.1666666666666662e-10 2182 1170 -3.6295685768920020e-28 2182 1555 -2.0833333333333332e-11 2182 2177 -2.0833333333333332e-11 2182 2174 8.3333333333333330e-11 2182 1168 -9.3750000000000012e-11 2182 1167 -2.0833333333333332e-11 2182 1169 1.0416666666666671e-11 2182 2018 -1.0416666666666667e-10 2182 2017 -3.0991386737738975e-27 2182 1551 -9.3749999999999999e-11 2182 1550 1.8812360437258079e-27 2182 1549 1.0416666666666669e-11 2183 2183 2.0833333333333331e-10 2184 2184 4.1666666666666668e-10 2184 2189 6.4623485355705287e-27 2184 1654 6.2499999999999991e-11 2184 2191 2.6253290925755273e-27 2184 1375 -4.1666666666666665e-11 2184 1378 -1.0416666666666674e-11 2184 2172 2.0833333333333332e-11 2184 2174 4.1666666666666665e-11 2184 1555 4.6458872727282566e-28 2184 1549 1.0416666666666669e-11 2185 2185 2.0833333333333329e-10 2186 2186 2.4999999999999996e-10 2187 2187 2.0833333333333331e-10 2188 2188 2.0833333333333331e-10 2189 2189 3.3333333333333332e-10 2189 1662 -3.6295685768920020e-28 2189 1654 6.2500000000000004e-11 2189 1907 4.1666666666666665e-11 2189 1903 6.4623485355705287e-27 2189 1373 4.1666666666666665e-11 2189 1378 6.2500000000000004e-11 2190 2190 9.1666666666666650e-10 2190 1231 3.1250000000000002e-11 2190 2020 1.2499999999999998e-10 2190 2017 -4.1666666666666665e-11 2190 1550 -5.2083333333333328e-11 2190 1564 4.1666666666666678e-11 2190 1549 -1.0416666666666667e-10 2190 1273 -5.2083333333333334e-11 2190 1652 1.0416666666666665e-11 2190 2274 3.2311742677852644e-27 2190 2192 8.3333333333333330e-11 2190 1268 1.0416666666666668e-11 2190 1275 4.1666666666666671e-11 2190 1279 -1.0416666666666667e-10 2190 1808 1.2499999999999998e-10 2190 1807 -4.1666666666666658e-11 2190 1230 3.1250000000000002e-11 2190 1239 1.6666666666666666e-10 2190 1245 -2.0833333333333339e-11 2190 2328 -3.2311742677852644e-27 2190 2191 8.3333333333333330e-11 2190 1655 4.1666666666666665e-11 2190 1654 -6.2500000000000004e-11 2191 2191 4.1666666666666662e-10 2191 1564 2.0833333333333332e-11 2191 2184 3.0991386737738975e-27 2191 1549 -1.0416666666666668e-11 2191 2328 2.0833333333333326e-11 2191 2190 8.3333333333333330e-11 2191 1655 2.0833333333333332e-11 2191 1654 -1.0416666666666674e-11 2192 2192 4.1666666666666662e-10 2192 1267 3.6295685768920020e-28 2192 1905 1.0416666666666667e-10 2192 1903 3.0991386737738975e-27 2192 1662 -1.8812360437258079e-27 2192 1652 9.3749999999999999e-11 2192 1655 2.0833333333333332e-11 2192 1654 -1.0416666666666669e-11 2192 2274 -2.0833333333333332e-11 2192 2190 8.3333333333333330e-11 2192 1268 9.3750000000000012e-11 2192 1275 2.0833333333333332e-11 2192 1279 -1.0416666666666671e-11 2193 2193 2.4999999999999998e-02 2193 1647 1.0416666666666667e-03 2193 2138 2.0833333333333337e-03 2193 2133 5.1510191104902139e-20 2193 1455 1.0416666666666664e-03 2193 1646 6.2499999999999995e-03 2193 2194 2.0833333333333337e-03 2193 1458 6.2499999999999995e-03 2193 1457 1.0416666666666664e-03 2193 1456 2.0833333333333320e-03 2193 3957 1.0416666666666664e-03 2193 3956 2.0833333333333329e-03 2193 4592 6.0159191589756597e-20 2194 2194 4.1666666666666664e-02 2194 1458 8.3333333333333315e-03 2194 1457 -2.0833333333333337e-03 2194 1646 8.3333333333333315e-03 2194 2193 2.0833333333333337e-03 2194 1456 2.0833333333333333e-03 2194 431 2.0833333333333329e-03 2194 1013 2.0833333333333337e-03 2194 4597 -8.3333333333333315e-03 2194 3957 -2.0833333333333337e-03 2194 491 2.0833333333333333e-03 2194 3956 2.0833333333333329e-03 2194 4592 -8.3333333333333315e-03 2195 2195 4.1666666666666662e-10 2195 1172 2.0833333333333332e-11 2195 1419 2.0833333333333332e-11 2195 2179 2.0833333333333339e-11 2195 2175 -8.3333333333333330e-11 2195 1186 -2.0833333333333339e-11 2195 1185 2.0833333333333332e-11 2195 1729 2.0833333333333339e-11 2195 1728 -8.3333333333333330e-11 2195 1420 -2.0833333333333339e-11 2195 1422 2.0833333333333332e-11 2196 2196 4.1666666666666662e-10 2196 1144 -1.0416666666666671e-11 2196 1429 -1.0416666666666669e-11 2196 1422 2.0833333333333329e-11 2196 1727 2.0833333333333339e-11 2196 1726 -8.3333333333333330e-11 2196 1139 2.0833333333333332e-11 2196 382 -2.0833333333333329e-11 2196 105 2.0833333333333326e-11 2196 756 -2.0833333333333339e-11 2196 371 -2.0833333333333329e-11 2196 373 -6.2499999999999991e-11 2196 758 2.0833333333333336e-11 2196 383 3.5628902784306998e-27 2196 1056 2.0833333333333326e-11 2196 1027 2.0833333333333332e-11 2196 492 2.0833333333333329e-11 2197 2197 2.0833333333333331e-10 2198 2198 2.0833333333333331e-10 2199 2199 2.9166666666666664e-10 2199 1413 -1.1213657767716683e-27 2199 1406 4.1666666666666658e-11 2199 1405 1.0416666666666665e-11 2199 2205 4.1666666666666665e-11 2199 1404 1.5039633158038590e-27 2199 1859 4.1666666666666652e-11 2199 1321 1.0416666666666666e-10 2200 2200 2.0833333333333331e-10 2201 2201 2.9166666666666659e-10 2201 2211 -4.1666666666666665e-11 2201 1408 1.1000665323307010e-27 2201 1407 4.1666666666666665e-11 2201 1405 1.0416666666666665e-11 2201 1404 -1.3020149240672800e-27 2201 2204 4.1666666666666652e-11 2201 1653 1.0416666666666666e-10 2202 2202 4.1666666666666662e-10 2202 1406 2.0833333333333329e-11 2202 1653 -2.0833333333333329e-11 2202 2209 2.0833333333333336e-11 2202 1407 2.0833333333333326e-11 2202 1409 6.2499999999999991e-11 2202 2204 2.0833333333333336e-11 2202 1404 -2.1169082391605852e-27 2202 2205 2.0833333333333326e-11 2202 2206 2.0833333333333326e-11 2202 1321 -2.0833333333333329e-11 2202 1488 2.0833333333333329e-11 2202 1318 -2.0833333333333329e-11 2202 1328 3.5628902784306998e-27 2202 1970 2.0833333333333336e-11 2202 1481 2.0833333333333326e-11 2202 1485 6.2499999999999991e-11 2202 1969 -2.0833333333333336e-11 2202 1487 -2.1169082391605852e-27 2202 2203 2.0833333333333326e-11 2202 2212 -2.0833333333333326e-11 2202 1651 -2.0833333333333329e-11 2202 1649 3.5628902784306998e-27 2203 2203 2.9166666666666664e-10 2203 1962 4.1666666666666665e-11 2203 1480 2.0833333333333332e-11 2203 1488 1.0416666666666666e-10 2203 1485 2.0833333333333329e-11 2203 1487 1.0416666666666663e-11 2203 2212 4.1666666666666652e-11 2203 2202 2.0833333333333326e-11 2203 1651 4.1666666666666665e-11 2203 1649 -1.1000665323307010e-27 2204 2204 2.9166666666666664e-10 2204 1649 1.1213657767716683e-27 2204 2209 -4.1666666666666665e-11 2204 1409 2.0833333333333332e-11 2204 2202 2.0833333333333336e-11 2204 1407 1.0416666666666666e-10 2204 1405 2.0833333333333329e-11 2204 1404 1.0416666666666663e-11 2204 2201 4.1666666666666652e-11 2204 1653 4.1666666666666665e-11 2205 2205 2.9166666666666664e-10 2205 1409 2.0833333333333329e-11 2205 2206 -4.1666666666666652e-11 2205 2202 2.0833333333333326e-11 2205 1328 -1.1000665323307010e-27 2205 1321 4.1666666666666665e-11 2205 2199 4.1666666666666665e-11 2205 1406 1.0416666666666666e-10 2205 1405 2.0833333333333332e-11 2205 1404 1.0416666666666663e-11 2206 2206 2.9166666666666659e-10 2206 1329 -2.0833333333333332e-11 2206 2207 4.1666666666666665e-11 2206 2213 -2.0833333333333336e-11 2206 1410 -1.1000665323307010e-27 2206 1406 -4.1666666666666658e-11 2206 1409 -1.0416666666666661e-11 2206 1404 1.5039633158038590e-27 2206 2205 -4.1666666666666652e-11 2206 2202 2.0833333333333326e-11 2206 1321 -1.0416666666666666e-10 2206 1328 -1.0416666666666661e-11 2207 2207 2.9166666666666664e-10 2207 1412 -2.0833333333333329e-11 2207 2208 4.1666666666666652e-11 2207 2220 -2.0833333333333326e-11 2207 1330 1.3020149240672800e-27 2207 1321 -4.1666666666666665e-11 2207 1329 -1.0416666666666665e-11 2207 1328 -1.1000665323307010e-27 2207 2206 4.1666666666666665e-11 2207 1406 -1.0416666666666666e-10 2207 1409 -2.0833333333333332e-11 2207 2213 2.0833333333333336e-11 2207 1410 -1.0416666666666661e-11 2208 2208 2.9166666666666664e-10 2208 1859 -4.1666666666666665e-11 2208 1856 2.0833333333333336e-11 2208 1413 -1.1213657767716683e-27 2208 1406 -4.1666666666666665e-11 2208 1412 -1.0416666666666665e-11 2208 1410 1.1000665323307010e-27 2208 2207 4.1666666666666652e-11 2208 2220 2.0833333333333332e-11 2208 1321 -1.0416666666666666e-10 2208 1329 -2.0833333333333329e-11 2208 1330 -1.0416666666666663e-11 2209 2209 2.9166666666666659e-10 2209 1417 1.3233141685082473e-27 2209 1407 -4.1666666666666658e-11 2209 1409 -1.0416666666666661e-11 2209 2204 -4.1666666666666665e-11 2209 2202 2.0833333333333336e-11 2209 1404 -1.3020149240672800e-27 2209 2210 4.1666666666666652e-11 2209 2215 -2.0833333333333326e-11 2209 1653 -1.0416666666666666e-10 2209 1652 -2.0833333333333329e-11 2209 1649 -1.0416666666666661e-11 2210 2210 2.9166666666666664e-10 2210 1662 -1.5039633158038590e-27 2210 1910 -4.1666666666666665e-11 2210 1400 -2.0833333333333332e-11 2210 1905 2.0833333333333336e-11 2210 1407 -1.0416666666666666e-10 2210 1409 -2.0833333333333329e-11 2210 1417 -1.0416666666666663e-11 2210 2209 4.1666666666666652e-11 2210 2215 2.0833333333333326e-11 2210 1653 -4.1666666666666658e-11 2210 1652 -1.0416666666666665e-11 2210 1649 1.1213657767716683e-27 2211 2211 2.9166666666666664e-10 2211 1400 -2.0833333333333329e-11 2211 1910 -4.1666666666666652e-11 2211 1907 2.0833333333333326e-11 2211 1662 1.5039633158038590e-27 2211 1653 -4.1666666666666658e-11 2211 2201 -4.1666666666666665e-11 2211 1407 -1.0416666666666666e-10 2211 1405 -2.0833333333333332e-11 2211 1408 -1.0416666666666661e-11 2212 2212 2.9166666666666659e-10 2212 1652 2.0833333333333332e-11 2212 2232 -4.1666666666666665e-11 2212 2215 2.0833333333333336e-11 2212 1490 1.1000665323307010e-27 2212 1488 4.1666666666666658e-11 2212 1485 1.0416666666666661e-11 2212 1487 -1.5039633158038590e-27 2212 2203 4.1666666666666652e-11 2212 2202 -2.0833333333333326e-11 2212 1651 1.0416666666666666e-10 2212 1649 1.0416666666666661e-11 2213 2213 4.1666666666666662e-10 2213 1411 -2.0833333333333329e-11 2213 1321 2.0833333333333329e-11 2213 2206 -2.0833333333333336e-11 2213 1406 -2.0833333333333326e-11 2213 1409 -6.2499999999999991e-11 2213 2207 2.0833333333333336e-11 2213 1410 2.1169082391605852e-27 2213 1481 -2.0833333333333329e-11 2213 1592 2.0833333333333329e-11 2213 2217 2.0833333333333336e-11 2213 1486 -2.0833333333333326e-11 2213 1485 -6.2499999999999991e-11 2213 2224 -2.0833333333333336e-11 2213 1484 2.1169082391605852e-27 2213 1971 2.0833333333333326e-11 2213 1970 -2.0833333333333326e-11 2213 1318 2.0833333333333329e-11 2213 1329 6.2500000000000004e-11 2213 1328 -3.7324953730532174e-27 2213 2219 -2.0833333333333326e-11 2213 2214 2.0833333333333326e-11 2213 1585 2.0833333333333329e-11 2213 1584 6.2500000000000004e-11 2213 1583 -3.7324953730532174e-27 2214 2214 2.9166666666666659e-10 2214 1591 2.0833333333333332e-11 2214 2239 -4.1666666666666665e-11 2214 2216 2.0833333333333336e-11 2214 1416 1.3020149240672800e-27 2214 1411 4.1666666666666658e-11 2214 1409 1.0416666666666661e-11 2214 1410 -1.3233141685082473e-27 2214 2219 4.1666666666666652e-11 2214 2213 2.0833333333333326e-11 2214 1585 1.0416666666666666e-10 2214 1584 2.0833333333333329e-11 2214 1583 1.0416666666666661e-11 2215 2215 4.1666666666666662e-10 2215 1492 -2.0833333333333329e-11 2215 1651 2.0833333333333329e-11 2215 2212 2.0833333333333336e-11 2215 1488 -2.0833333333333326e-11 2215 1485 -6.2499999999999991e-11 2215 2232 2.0833333333333336e-11 2215 1490 2.1169082391605852e-27 2215 2275 -2.0833333333333326e-11 2215 2218 2.0833333333333326e-11 2215 1272 2.0833333333333329e-11 2215 1407 -2.0833333333333329e-11 2215 1269 2.0833333333333329e-11 2215 1268 6.2500000000000004e-11 2215 1288 -3.7324953730532174e-27 2215 1920 -2.0833333333333336e-11 2215 1401 -2.0833333333333326e-11 2215 1409 -6.2499999999999991e-11 2215 1917 2.0833333333333336e-11 2215 1417 2.1169082391605852e-27 2215 2210 2.0833333333333326e-11 2215 2209 -2.0833333333333326e-11 2215 1653 2.0833333333333329e-11 2215 1652 6.2500000000000004e-11 2215 1649 -3.7324953730532174e-27 2216 2216 4.1666666666666662e-10 2216 1486 -2.0833333333333329e-11 2216 1272 2.0833333333333329e-11 2216 2218 2.0833333333333336e-11 2216 1492 -2.0833333333333326e-11 2216 1485 -6.2499999999999991e-11 2216 2268 -2.0833333333333336e-11 2216 1493 2.1169082391605852e-27 2216 1401 -2.0833333333333329e-11 2216 1585 2.0833333333333329e-11 2216 2214 2.0833333333333336e-11 2216 1411 -2.0833333333333326e-11 2216 1409 -6.2499999999999991e-11 2216 2239 2.0833333333333336e-11 2216 1416 2.1169082391605852e-27 2216 1919 2.0833333333333326e-11 2216 1920 -2.0833333333333326e-11 2216 1269 2.0833333333333329e-11 2216 1287 6.2499999999999991e-11 2216 1288 -3.5628902784306998e-27 2216 2226 2.0833333333333326e-11 2216 2217 2.0833333333333326e-11 2216 1592 2.0833333333333329e-11 2216 1591 6.2499999999999991e-11 2216 1583 -3.5628902784306998e-27 2217 2217 2.9166666666666659e-10 2217 1493 -1.5039633158038590e-27 2217 1584 2.0833333333333332e-11 2217 1486 4.1666666666666658e-11 2217 1485 1.0416666666666661e-11 2217 2224 4.1666666666666665e-11 2217 2213 2.0833333333333336e-11 2217 1484 1.1000665323307010e-27 2217 2226 -4.1666666666666652e-11 2217 2216 2.0833333333333326e-11 2217 1592 1.0416666666666666e-10 2217 1591 2.0833333333333329e-11 2217 1583 1.0416666666666661e-11 2218 2218 2.9166666666666659e-10 2218 1287 2.0833333333333332e-11 2218 2268 4.1666666666666665e-11 2218 2216 2.0833333333333336e-11 2218 1493 1.3020149240672800e-27 2218 1492 4.1666666666666658e-11 2218 1485 1.0416666666666661e-11 2218 1490 -1.3233141685082473e-27 2218 2275 4.1666666666666652e-11 2218 2215 2.0833333333333326e-11 2218 1272 1.0416666666666666e-10 2218 1268 2.0833333333333329e-11 2218 1288 1.0416666666666661e-11 2219 2219 2.9166666666666664e-10 2219 1586 1.5039633158038590e-27 2219 2236 -4.1666666666666665e-11 2219 1412 2.0833333333333332e-11 2219 2220 2.0833333333333336e-11 2219 1411 1.0416666666666666e-10 2219 1409 2.0833333333333329e-11 2219 1410 1.0416666666666663e-11 2219 2214 4.1666666666666652e-11 2219 2213 -2.0833333333333326e-11 2219 1585 4.1666666666666658e-11 2219 1584 1.0416666666666665e-11 2219 1583 -1.1213657767716683e-27 2220 2220 4.1666666666666662e-10 2220 1352 2.0833333333333329e-11 2220 1324 -2.0833333333333326e-11 2220 1863 2.0833333333333339e-11 2220 1346 2.0833333333333329e-11 2220 1350 6.2499999999999991e-11 2220 1864 -2.0833333333333336e-11 2220 1351 -3.5628902784306998e-27 2220 1406 2.0833333333333329e-11 2220 1585 -2.0833333333333326e-11 2220 2236 2.0833333333333339e-11 2220 1411 2.0833333333333329e-11 2220 1412 6.2499999999999991e-11 2220 2219 2.0833333333333336e-11 2220 1410 -3.5628902784306998e-27 2220 2207 -2.0833333333333326e-11 2220 2208 2.0833333333333332e-11 2220 1321 -2.0833333333333329e-11 2220 1329 -6.2499999999999991e-11 2220 1330 3.5628902784306998e-27 2220 2221 2.0833333333333326e-11 2220 2240 -2.0833333333333332e-11 2220 1587 -2.0833333333333329e-11 2220 1584 -6.2499999999999991e-11 2220 1586 3.5628902784306998e-27 2221 2221 2.9166666666666659e-10 2221 1596 1.1000665323307010e-27 2221 2245 -4.1666666666666665e-11 2221 1361 2.0833333333333332e-11 2221 2222 2.0833333333333336e-11 2221 1352 1.0416666666666666e-10 2221 1350 2.0833333333333329e-11 2221 1351 1.0416666666666661e-11 2221 2240 4.1666666666666652e-11 2221 2220 2.0833333333333326e-11 2221 1587 4.1666666666666665e-11 2221 1584 1.0416666666666665e-11 2221 1586 -1.3020149240672800e-27 2222 2222 4.1666666666666662e-10 2222 1121 2.0833333333333329e-11 2222 1327 -2.0833333333333329e-11 2222 2296 2.0833333333333336e-11 2222 1124 2.0833333333333326e-11 2222 1127 6.2499999999999991e-11 2222 2225 2.0833333333333336e-11 2222 1128 -2.1169082391605852e-27 2222 1346 2.0833333333333329e-11 2222 1587 -2.0833333333333329e-11 2222 2245 2.0833333333333336e-11 2222 1352 2.0833333333333326e-11 2222 1361 6.2499999999999991e-11 2222 2221 2.0833333333333336e-11 2222 1351 -2.1169082391605852e-27 2222 1864 -2.0833333333333326e-11 2222 1865 2.0833333333333326e-11 2222 1324 -2.0833333333333329e-11 2222 1329 -6.2500000000000004e-11 2222 1331 3.7324953730532174e-27 2222 2055 -2.0833333333333326e-11 2222 2054 2.0833333333333326e-11 2222 1582 -2.0833333333333329e-11 2222 1584 -6.2500000000000004e-11 2222 1596 3.7324953730532174e-27 2223 2223 4.1666666666666662e-10 2223 1486 2.0833333333333329e-11 2223 1318 -2.0833333333333326e-11 2223 1972 2.0833333333333339e-11 2223 1481 2.0833333333333329e-11 2223 1497 6.2499999999999991e-11 2223 1971 -2.0833333333333336e-11 2223 1484 -3.5628902784306998e-27 2223 1124 2.0833333333333329e-11 2223 1582 -2.0833333333333326e-11 2223 2056 2.0833333333333339e-11 2223 1121 2.0833333333333329e-11 2223 1129 6.2499999999999991e-11 2223 2055 -2.0833333333333336e-11 2223 1128 -3.5628902784306998e-27 2223 2225 2.0833333333333326e-11 2223 2297 2.0833333333333332e-11 2223 1327 -2.0833333333333329e-11 2223 1329 -6.2499999999999991e-11 2223 1332 3.5628902784306998e-27 2223 2224 2.0833333333333326e-11 2223 2229 2.0833333333333332e-11 2223 1592 -2.0833333333333329e-11 2223 1584 -6.2499999999999991e-11 2223 1597 3.5628902784306998e-27 2224 2224 2.9166666666666664e-10 2224 1497 2.0833333333333329e-11 2224 1583 1.1000665323307010e-27 2224 2217 4.1666666666666665e-11 2224 1486 1.0416666666666666e-10 2224 1485 2.0833333333333332e-11 2224 2213 -2.0833333333333336e-11 2224 1484 1.0416666666666661e-11 2224 2229 -4.1666666666666652e-11 2224 2223 2.0833333333333326e-11 2224 1592 4.1666666666666665e-11 2224 1584 1.0416666666666665e-11 2224 1597 -1.3020149240672800e-27 2225 2225 2.9166666666666664e-10 2225 1129 2.0833333333333329e-11 2225 2297 -4.1666666666666652e-11 2225 2223 2.0833333333333326e-11 2225 1332 -1.3020149240672800e-27 2225 1327 4.1666666666666665e-11 2225 1329 1.0416666666666665e-11 2225 1331 1.1000665323307010e-27 2225 2296 -4.1666666666666665e-11 2225 1124 1.0416666666666666e-10 2225 1127 2.0833333333333332e-11 2225 2222 2.0833333333333336e-11 2225 1128 1.0416666666666661e-11 2226 2226 2.9166666666666664e-10 2226 1593 -1.3233141685082473e-27 2226 2227 4.1666666666666665e-11 2226 1494 -2.0833333333333332e-11 2226 2266 -2.0833333333333339e-11 2226 1486 -1.0416666666666666e-10 2226 1485 -2.0833333333333329e-11 2226 1493 -1.0416666666666663e-11 2226 2217 -4.1666666666666652e-11 2226 2216 2.0833333333333326e-11 2226 1592 -4.1666666666666665e-11 2226 1591 -1.0416666666666665e-11 2226 1583 1.1000665323307010e-27 2227 2227 2.9166666666666664e-10 2227 1496 1.1213657767716683e-27 2227 1591 -2.0833333333333332e-11 2227 1486 -4.1666666666666658e-11 2227 1494 -1.0416666666666665e-11 2227 2226 4.1666666666666665e-11 2227 2266 2.0833333333333336e-11 2227 1493 -1.5039633158038590e-27 2227 2228 4.1666666666666652e-11 2227 2280 -2.0833333333333326e-11 2227 1592 -1.0416666666666666e-10 2227 1595 -2.0833333333333329e-11 2227 1593 -1.0416666666666663e-11 2228 2228 2.9166666666666659e-10 2228 1597 -1.3020149240672800e-27 2228 2229 4.1666666666666665e-11 2228 1497 -2.0833333333333332e-11 2228 2285 -2.0833333333333336e-11 2228 1486 -1.0416666666666666e-10 2228 1494 -2.0833333333333329e-11 2228 1496 -1.0416666666666661e-11 2228 2227 4.1666666666666652e-11 2228 2280 2.0833333333333326e-11 2228 1592 -4.1666666666666658e-11 2228 1595 -1.0416666666666661e-11 2228 1593 1.3233141685082473e-27 2229 2229 2.9166666666666664e-10 2229 1595 -2.0833333333333332e-11 2229 2228 4.1666666666666665e-11 2229 2285 2.0833333333333336e-11 2229 1496 -1.1213657767716683e-27 2229 1486 -4.1666666666666665e-11 2229 1497 -1.0416666666666665e-11 2229 1484 1.1000665323307010e-27 2229 2224 -4.1666666666666652e-11 2229 2223 2.0833333333333332e-11 2229 1592 -1.0416666666666666e-10 2229 1584 -2.0833333333333329e-11 2229 1597 -1.0416666666666663e-11 2230 2230 2.9166666666666659e-10 2230 1661 -1.3020149240672800e-27 2230 2231 4.1666666666666665e-11 2230 1491 -2.0833333333333332e-11 2230 2233 -2.0833333333333336e-11 2230 1488 -1.0416666666666666e-10 2230 1480 -2.0833333333333329e-11 2230 1489 -1.0416666666666661e-11 2230 1962 -4.1666666666666652e-11 2230 1651 -4.1666666666666658e-11 2231 2231 2.9166666666666664e-10 2231 2230 4.1666666666666665e-11 2231 2233 2.0833333333333336e-11 2231 1489 -1.1213657767716683e-27 2231 1488 -4.1666666666666665e-11 2231 1491 -1.0416666666666665e-11 2231 1490 1.1000665323307010e-27 2231 2232 4.1666666666666652e-11 2231 2273 -2.0833333333333332e-11 2231 1651 -1.0416666666666666e-10 2231 1652 -2.0833333333333329e-11 2231 1661 -1.0416666666666663e-11 2232 2232 2.9166666666666659e-10 2232 1649 -1.1000665323307010e-27 2232 2212 -4.1666666666666665e-11 2232 1485 -2.0833333333333332e-11 2232 2215 2.0833333333333336e-11 2232 1488 -1.0416666666666666e-10 2232 1491 -2.0833333333333329e-11 2232 1490 -1.0416666666666661e-11 2232 2231 4.1666666666666652e-11 2232 2273 2.0833333333333326e-11 2232 1651 -4.1666666666666665e-11 2232 1652 -1.0416666666666665e-11 2232 1661 1.3020149240672800e-27 2233 2233 4.1666666666666662e-10 2233 1443 -2.0833333333333329e-11 2233 2234 2.0833333333333339e-11 2233 2272 -8.3333333333333330e-11 2233 1655 -2.0833333333333332e-11 2233 1478 2.0833333333333329e-11 2233 1651 -2.0833333333333326e-11 2233 1661 1.0416666666666668e-11 2233 2231 2.0833333333333336e-11 2233 1488 2.0833333333333329e-11 2233 1491 6.2499999999999991e-11 2233 2230 -2.0833333333333336e-11 2233 1489 -3.5628902784306998e-27 2233 1955 -2.0833333333333326e-11 2233 1954 2.0833333333333326e-11 2233 1435 -2.0833333333333329e-11 2233 1440 1.0416666666666666e-11 2234 2234 2.4999999999999996e-10 2234 2329 -9.5018296033870872e-28 2234 1440 -1.0416666666666663e-11 2234 1443 -2.0833333333333326e-11 2234 2233 2.0833333333333336e-11 2234 2272 -2.2913451068275814e-27 2234 1661 -1.0416666666666666e-11 2234 1655 -2.0833333333333326e-11 2235 2235 2.0833333333333331e-10 2236 2236 2.9166666666666664e-10 2236 1414 1.1000665323307010e-27 2236 1584 -2.0833333333333332e-11 2236 1411 -4.1666666666666665e-11 2236 1412 -1.0416666666666665e-11 2236 2219 -4.1666666666666665e-11 2236 2220 2.0833333333333339e-11 2236 1410 -1.3233141685082473e-27 2236 2237 4.1666666666666652e-11 2236 2241 -2.0833333333333326e-11 2236 1585 -1.0416666666666666e-10 2236 1589 -2.0833333333333329e-11 2236 1586 -1.0416666666666663e-11 2237 2237 2.9166666666666659e-10 2237 1590 -1.1000665323307010e-27 2237 2238 4.1666666666666665e-11 2237 1415 -2.0833333333333332e-11 2237 2263 2.0833333333333336e-11 2237 1411 -1.0416666666666666e-10 2237 1412 -2.0833333333333329e-11 2237 1414 -1.0416666666666661e-11 2237 2236 4.1666666666666652e-11 2237 2241 2.0833333333333326e-11 2237 1585 -4.1666666666666658e-11 2237 1589 -1.0416666666666661e-11 2237 1586 1.5039633158038590e-27 2238 2238 2.9166666666666659e-10 2238 1589 -2.0833333333333332e-11 2238 2237 4.1666666666666665e-11 2238 2263 -2.0833333333333336e-11 2238 1414 -1.1000665323307010e-27 2238 1411 -4.1666666666666665e-11 2238 1415 -1.0416666666666665e-11 2238 1416 1.3020149240672800e-27 2238 2239 4.1666666666666652e-11 2238 2264 -2.0833333333333326e-11 2238 1585 -1.0416666666666666e-10 2238 1591 -2.0833333333333329e-11 2238 1590 -1.0416666666666661e-11 2239 2239 2.9166666666666664e-10 2239 1583 -1.1213657767716683e-27 2239 2214 -4.1666666666666665e-11 2239 1409 -2.0833333333333332e-11 2239 2216 2.0833333333333336e-11 2239 1411 -1.0416666666666666e-10 2239 1415 -2.0833333333333329e-11 2239 1416 -1.0416666666666663e-11 2239 2238 4.1666666666666652e-11 2239 2264 2.0833333333333332e-11 2239 1585 -4.1666666666666665e-11 2239 1591 -1.0416666666666665e-11 2239 1590 1.1000665323307010e-27 2240 2240 2.9166666666666664e-10 2240 1589 2.0833333333333332e-11 2240 2244 -4.1666666666666665e-11 2240 2241 2.0833333333333336e-11 2240 1359 1.1213657767716683e-27 2240 1352 4.1666666666666665e-11 2240 1350 1.0416666666666665e-11 2240 1351 -1.1000665323307010e-27 2240 2221 4.1666666666666652e-11 2240 2220 -2.0833333333333332e-11 2240 1587 1.0416666666666666e-10 2240 1584 2.0833333333333329e-11 2240 1586 1.0416666666666663e-11 2241 2241 4.1666666666666662e-10 2241 1411 -2.0833333333333329e-11 2241 1387 2.0833333333333326e-11 2241 1890 -2.0833333333333336e-11 2241 1395 -2.0833333333333329e-11 2241 1412 -6.2499999999999991e-11 2241 1891 2.0833333333333336e-11 2241 1414 3.5628902784306998e-27 2241 1355 -2.0833333333333329e-11 2241 1587 2.0833333333333326e-11 2241 2240 2.0833333333333336e-11 2241 1352 -2.0833333333333329e-11 2241 1350 -6.2499999999999991e-11 2241 2244 2.0833333333333336e-11 2241 1359 3.5628902784306998e-27 2241 2254 2.0833333333333326e-11 2241 2242 2.0833333333333326e-11 2241 1384 2.0833333333333329e-11 2241 1390 6.2499999999999991e-11 2241 1391 -2.1169082391605852e-27 2241 2237 2.0833333333333326e-11 2241 2236 -2.0833333333333326e-11 2241 1585 2.0833333333333329e-11 2241 1589 6.2499999999999991e-11 2241 1586 -2.1169082391605852e-27 2242 2242 2.9166666666666664e-10 2242 1886 4.1666666666666665e-11 2242 1884 -2.0833333333333339e-11 2242 1360 1.3233141685082473e-27 2242 1355 4.1666666666666665e-11 2242 1350 1.0416666666666665e-11 2242 1359 -1.1000665323307010e-27 2242 2254 -4.1666666666666652e-11 2242 2241 2.0833333333333326e-11 2242 1384 1.0416666666666666e-10 2242 1390 2.0833333333333329e-11 2242 1391 1.0416666666666663e-11 2243 2243 2.9166666666666664e-10 2243 1581 -2.0833333333333332e-11 2243 2051 -4.1666666666666665e-11 2243 2053 -2.0833333333333336e-11 2243 1368 -1.5039633158038590e-27 2243 1352 -4.1666666666666658e-11 2243 1358 -1.0416666666666665e-11 2243 1359 1.1213657767716683e-27 2243 2244 4.1666666666666652e-11 2243 2260 -2.0833333333333326e-11 2243 1587 -1.0416666666666666e-10 2243 1589 -2.0833333333333329e-11 2243 1588 -1.0416666666666663e-11 2244 2244 2.9166666666666659e-10 2244 1586 -1.3020149240672800e-27 2244 2240 -4.1666666666666665e-11 2244 1350 -2.0833333333333332e-11 2244 2241 2.0833333333333336e-11 2244 1352 -1.0416666666666666e-10 2244 1358 -2.0833333333333329e-11 2244 1359 -1.0416666666666661e-11 2244 2243 4.1666666666666652e-11 2244 2260 2.0833333333333326e-11 2244 1587 -4.1666666666666658e-11 2244 1589 -1.0416666666666661e-11 2244 1588 1.3233141685082473e-27 2245 2245 2.9166666666666659e-10 2245 1368 1.5039633158038590e-27 2245 1584 -2.0833333333333332e-11 2245 1352 -4.1666666666666658e-11 2245 1361 -1.0416666666666661e-11 2245 2221 -4.1666666666666665e-11 2245 2222 2.0833333333333336e-11 2245 1351 -1.1000665323307010e-27 2245 2051 -4.1666666666666652e-11 2245 2050 2.0833333333333326e-11 2245 1587 -1.0416666666666666e-10 2245 1581 -2.0833333333333329e-11 2245 1596 -1.0416666666666661e-11 2246 2246 2.0833333333333331e-10 2247 2247 2.9166666666666659e-10 2247 1360 -1.3233141685082473e-27 2247 1355 4.1666666666666658e-11 2247 1354 1.0416666666666661e-11 2247 2251 4.1666666666666665e-11 2247 1353 1.3020149240672800e-27 2247 1886 4.1666666666666652e-11 2247 1384 1.0416666666666666e-10 2248 2248 2.0833333333333331e-10 2249 2249 2.9166666666666659e-10 2249 2257 -4.1666666666666665e-11 2249 1357 1.1000665323307010e-27 2249 1356 4.1666666666666658e-11 2249 1354 1.0416666666666661e-11 2249 1353 -1.5039633158038590e-27 2249 2250 4.1666666666666652e-11 2249 1667 1.0416666666666666e-10 2250 2250 2.9166666666666664e-10 2250 1665 1.3233141685082473e-27 2250 2255 -4.1666666666666665e-11 2250 1358 2.0833333333333332e-11 2250 2252 -2.0833333333333339e-11 2250 1356 1.0416666666666666e-10 2250 1354 2.0833333333333329e-11 2250 1353 1.0416666666666663e-11 2250 2249 4.1666666666666652e-11 2250 1667 4.1666666666666665e-11 2251 2251 2.9166666666666664e-10 2251 1358 2.0833333333333329e-11 2251 2253 -4.1666666666666652e-11 2251 2252 -2.0833333333333332e-11 2251 1389 -1.1000665323307010e-27 2251 1384 4.1666666666666665e-11 2251 2247 4.1666666666666665e-11 2251 1355 1.0416666666666666e-10 2251 1354 2.0833333333333332e-11 2251 1353 1.0416666666666663e-11 2252 2252 4.1666666666666662e-10 2252 1389 -3.5628902784306998e-27 2252 1665 -3.5628902784306998e-27 2252 1355 -2.0833333333333329e-11 2252 1667 2.0833333333333329e-11 2252 2255 -2.0833333333333336e-11 2252 1356 -2.0833333333333326e-11 2252 1358 -6.2499999999999991e-11 2252 2250 -2.0833333333333339e-11 2252 1353 3.5628902784306998e-27 2252 2251 -2.0833333333333332e-11 2252 2253 -2.0833333333333326e-11 2252 1384 2.0833333333333329e-11 2252 405 -2.0833333333333329e-11 2252 436 2.0833333333333329e-11 2252 805 -2.0833333333333336e-11 2252 410 -2.0833333333333326e-11 2252 420 -6.2499999999999991e-11 2252 804 2.0833333333333339e-11 2252 421 3.5628902784306998e-27 2252 773 2.0833333333333332e-11 2252 772 -2.0833333333333326e-11 2252 398 2.0833333333333329e-11 2253 2253 2.9166666666666659e-10 2253 1390 -2.0833333333333332e-11 2253 2254 4.1666666666666665e-11 2253 2260 -2.0833333333333336e-11 2253 1359 -1.1000665323307010e-27 2253 1355 -4.1666666666666665e-11 2253 1358 -1.0416666666666665e-11 2253 1353 1.3020149240672800e-27 2253 2251 -4.1666666666666652e-11 2253 2252 -2.0833333333333326e-11 2253 1384 -1.0416666666666666e-10 2253 1389 -1.0416666666666661e-11 2254 2254 2.9166666666666664e-10 2254 1350 -2.0833333333333329e-11 2254 2242 -4.1666666666666652e-11 2254 2241 2.0833333333333326e-11 2254 1391 1.5039633158038590e-27 2254 1384 -4.1666666666666658e-11 2254 1390 -1.0416666666666661e-11 2254 1389 -1.1000665323307010e-27 2254 2253 4.1666666666666665e-11 2254 1355 -1.0416666666666666e-10 2254 1358 -2.0833333333333332e-11 2254 2260 2.0833333333333336e-11 2254 1359 -1.0416666666666661e-11 2255 2255 2.9166666666666664e-10 2255 1369 1.1213657767716683e-27 2255 1356 -4.1666666666666658e-11 2255 1358 -1.0416666666666665e-11 2255 2250 -4.1666666666666665e-11 2255 2252 -2.0833333333333336e-11 2255 1353 -1.5039633158038590e-27 2255 2256 4.1666666666666652e-11 2255 2261 -2.0833333333333326e-11 2255 1667 -1.0416666666666666e-10 2255 1665 -1.0416666666666663e-11 2256 2256 2.9166666666666659e-10 2256 2258 4.1666666666666665e-11 2256 1366 -2.0833333333333332e-11 2256 1356 -1.0416666666666666e-10 2256 1358 -2.0833333333333329e-11 2256 1369 -1.0416666666666661e-11 2256 2255 4.1666666666666652e-11 2256 2261 2.0833333333333326e-11 2256 1667 -4.1666666666666658e-11 2256 1665 1.3233141685082473e-27 2257 2257 2.9166666666666664e-10 2257 1366 -2.0833333333333329e-11 2257 2258 4.1666666666666652e-11 2257 1667 -4.1666666666666665e-11 2257 2249 -4.1666666666666665e-11 2257 1356 -1.0416666666666666e-10 2257 1354 -2.0833333333333332e-11 2257 1357 -1.0416666666666661e-11 2258 2258 2.9166666666666664e-10 2258 2256 4.1666666666666665e-11 2258 1369 -1.1213657767716683e-27 2258 1356 -4.1666666666666665e-11 2258 1366 -1.0416666666666665e-11 2258 1357 1.1000665323307010e-27 2258 2257 4.1666666666666652e-11 2258 1667 -1.0416666666666666e-10 2259 2259 2.0833333333333331e-10 2260 2260 4.1666666666666662e-10 2260 1589 6.2499999999999991e-11 2260 1588 -2.1169082391605852e-27 2260 1390 6.2499999999999991e-11 2260 1389 -2.1169082391605852e-27 2260 1352 -2.0833333333333329e-11 2260 1384 2.0833333333333326e-11 2260 2253 -2.0833333333333336e-11 2260 1355 -2.0833333333333329e-11 2260 1358 -6.2500000000000004e-11 2260 2254 2.0833333333333336e-11 2260 1359 3.7324953730532174e-27 2260 2244 2.0833333333333326e-11 2260 2243 -2.0833333333333326e-11 2260 1587 2.0833333333333329e-11 2260 410 -2.0833333333333329e-11 2260 474 2.0833333333333326e-11 2260 924 -2.0833333333333336e-11 2260 415 -2.0833333333333329e-11 2260 420 -6.2500000000000004e-11 2260 926 2.0833333333333336e-11 2260 419 3.7324953730532174e-27 2260 806 2.0833333333333326e-11 2260 805 -2.0833333333333326e-11 2260 436 2.0833333333333329e-11 2261 2261 4.1666666666666662e-10 2261 1665 -2.1169082391605852e-27 2261 1099 -2.1169082391605852e-27 2261 1356 -2.0833333333333329e-11 2261 1094 2.0833333333333326e-11 2261 2262 2.0833333333333336e-11 2261 1367 -2.0833333333333329e-11 2261 1358 -6.2500000000000004e-11 2261 2314 2.0833333333333336e-11 2261 1369 3.7324953730532174e-27 2261 2256 2.0833333333333326e-11 2261 2255 -2.0833333333333326e-11 2261 1667 2.0833333333333329e-11 2261 404 -2.0833333333333329e-11 2261 398 2.0833333333333326e-11 2261 772 -2.0833333333333336e-11 2261 405 -2.0833333333333329e-11 2261 420 -6.2500000000000004e-11 2261 766 -2.0833333333333336e-11 2261 402 3.7324953730532174e-27 2261 767 -2.0833333333333326e-11 2261 771 -2.0833333333333326e-11 2261 394 2.0833333333333329e-11 2262 2262 2.9166666666666659e-10 2262 2314 -4.1666666666666665e-11 2262 2261 2.0833333333333336e-11 2262 1369 1.1000665323307010e-27 2262 1367 4.1666666666666665e-11 2262 1358 1.0416666666666665e-11 2262 1368 -1.3020149240672800e-27 2262 2052 4.1666666666666652e-11 2262 2053 2.0833333333333326e-11 2262 1094 1.0416666666666666e-10 2262 1097 2.0833333333333329e-11 2262 1099 1.0416666666666661e-11 2263 2263 4.1666666666666662e-10 2263 1390 6.2499999999999991e-11 2263 1392 -2.1169082391605852e-27 2263 1589 6.2499999999999991e-11 2263 1590 -2.1169082391605852e-27 2263 1395 -2.0833333333333329e-11 2263 1585 2.0833333333333326e-11 2263 2238 -2.0833333333333336e-11 2263 1411 -2.0833333333333329e-11 2263 1415 -6.2500000000000004e-11 2263 2237 2.0833333333333336e-11 2263 1414 3.7324953730532174e-27 2263 1891 2.0833333333333326e-11 2263 1892 -2.0833333333333326e-11 2263 1387 2.0833333333333329e-11 2263 379 -2.0833333333333329e-11 2263 439 2.0833333333333326e-11 2263 1054 2.0833333333333336e-11 2263 389 -2.0833333333333329e-11 2263 380 -6.2500000000000004e-11 2263 1034 -2.0833333333333336e-11 2263 390 3.7324953730532174e-27 2263 1032 -2.0833333333333326e-11 2263 1052 -2.0833333333333326e-11 2263 471 2.0833333333333329e-11 2264 2264 4.1666666666666662e-10 2264 1591 6.2499999999999991e-11 2264 1590 -3.5628902784306998e-27 2264 1287 6.2499999999999991e-11 2264 1286 -3.5628902784306998e-27 2264 1411 -2.0833333333333329e-11 2264 1269 2.0833333333333329e-11 2264 1918 -2.0833333333333336e-11 2264 1401 -2.0833333333333326e-11 2264 1415 -6.2499999999999991e-11 2264 1919 2.0833333333333339e-11 2264 1416 3.5628902784306998e-27 2264 2239 2.0833333333333332e-11 2264 2238 -2.0833333333333326e-11 2264 1585 2.0833333333333329e-11 2264 374 -2.0833333333333329e-11 2264 471 2.0833333333333329e-11 2264 1052 -2.0833333333333336e-11 2264 379 -2.0833333333333326e-11 2264 380 -6.2499999999999991e-11 2264 1046 -2.0833333333333339e-11 2264 378 3.5628902784306998e-27 2264 1037 2.0833333333333332e-11 2264 1038 -2.0833333333333326e-11 2264 291 2.0833333333333329e-11 2265 2265 4.1666666666666662e-10 2265 1424 -3.5628902784306998e-27 2265 1392 -3.5628902784306998e-27 2265 1402 -2.0833333333333329e-11 2265 1387 2.0833333333333329e-11 2265 1892 -2.0833333333333336e-11 2265 1395 -2.0833333333333326e-11 2265 1415 -6.2499999999999991e-11 2265 1889 2.0833333333333339e-11 2265 1418 3.5628902784306998e-27 2265 1922 2.0833333333333332e-11 2265 1921 -2.0833333333333326e-11 2265 1426 2.0833333333333329e-11 2265 389 -2.0833333333333329e-11 2265 492 2.0833333333333329e-11 2265 1053 2.0833333333333336e-11 2265 382 -2.0833333333333326e-11 2265 380 -6.2499999999999991e-11 2265 1058 2.0833333333333339e-11 2265 387 3.5628902784306998e-27 2265 1074 -2.0833333333333332e-11 2265 1054 2.0833333333333326e-11 2265 439 2.0833333333333329e-11 2266 2266 4.1666666666666662e-10 2266 1677 2.0833333333333329e-11 2266 1290 -2.0833333333333329e-11 2266 2281 -2.0833333333333336e-11 2266 1675 2.0833333333333326e-11 2266 1673 6.2499999999999991e-11 2266 2269 2.0833333333333339e-11 2266 1676 -3.5628902784306998e-27 2266 1492 2.0833333333333329e-11 2266 1592 -2.0833333333333329e-11 2266 2227 2.0833333333333336e-11 2266 1486 2.0833333333333326e-11 2266 1494 6.2499999999999991e-11 2266 2226 -2.0833333333333339e-11 2266 1493 -3.5628902784306998e-27 2266 2268 2.0833333333333332e-11 2266 2277 2.0833333333333326e-11 2266 1272 -2.0833333333333329e-11 2266 1287 -6.2499999999999991e-11 2266 1289 3.5628902784306998e-27 2266 2267 2.0833333333333332e-11 2266 2279 -2.0833333333333326e-11 2266 1594 -2.0833333333333329e-11 2266 1591 -6.2499999999999991e-11 2266 1593 3.5628902784306998e-27 2267 2267 2.9166666666666664e-10 2267 1594 4.1666666666666665e-11 2267 1591 1.0416666666666665e-11 2267 1677 1.0416666666666666e-10 2267 1676 1.0416666666666663e-11 2267 1673 2.0833333333333329e-11 2267 2279 4.1666666666666652e-11 2267 2266 2.0833333333333332e-11 2267 1593 -1.1000665323307010e-27 2267 470 1.1213657767716683e-27 2267 1044 4.1666666666666665e-11 2267 297 2.0833333333333332e-11 2267 1041 -2.0833333333333336e-11 2268 2268 2.9166666666666664e-10 2268 1494 2.0833333333333329e-11 2268 2277 -4.1666666666666652e-11 2268 2266 2.0833333333333332e-11 2268 1289 -1.1000665323307010e-27 2268 1272 4.1666666666666665e-11 2268 1287 1.0416666666666665e-11 2268 1288 1.1213657767716683e-27 2268 2218 4.1666666666666665e-11 2268 1492 1.0416666666666666e-10 2268 1485 2.0833333333333332e-11 2268 2216 -2.0833333333333336e-11 2268 1493 1.0416666666666663e-11 2269 2269 2.9166666666666664e-10 2269 1675 1.0416666666666666e-10 2269 1676 1.0416666666666663e-11 2269 1290 4.1666666666666665e-11 2269 1287 1.0416666666666665e-11 2269 1289 1.3233141685082473e-27 2269 2281 4.1666666666666665e-11 2269 1673 2.0833333333333332e-11 2269 2266 2.0833333333333339e-11 2269 297 2.0833333333333329e-11 2269 703 -4.1666666666666652e-11 2269 1041 -2.0833333333333326e-11 2269 292 -1.1000665323307010e-27 2270 2270 4.1666666666666657e-10 2270 1273 1.8812360437258079e-27 2270 1805 1.0416666666666668e-10 2270 1471 -3.6295685768920020e-28 2270 1809 -4.0642113836986528e-27 2270 1492 -2.0833333333333329e-11 2270 1466 2.0833333333333326e-11 2270 1465 8.3333333333333330e-11 2270 1469 3.0276481542382433e-27 2270 1948 -2.0833333333333336e-11 2270 1476 -2.0833333333333329e-11 2270 1491 -6.2499999999999991e-11 2270 1946 2.0833333333333336e-11 2270 1495 3.5628902784306998e-27 2270 2276 2.0833333333333326e-11 2270 2271 2.0833333333333326e-11 2270 1272 2.0833333333333329e-11 2270 1271 8.3333333333333330e-11 2270 1270 -2.8532112865712471e-27 2271 2271 2.9166666666666664e-10 2271 1495 -1.1000665323307010e-27 2271 1268 2.0833333333333332e-11 2271 1492 4.1666666666666665e-11 2271 1491 1.0416666666666665e-11 2271 2275 4.1666666666666665e-11 2271 2273 2.0833333333333339e-11 2271 1490 1.3233141685082473e-27 2271 2276 -4.1666666666666652e-11 2271 2270 2.0833333333333326e-11 2271 1272 1.0416666666666666e-10 2271 1271 2.0833333333333329e-11 2271 1270 1.0416666666666663e-11 2272 2272 5.8333333333333339e-10 2272 1652 1.0416666666666666e-11 2272 2233 -8.3333333333333330e-11 2272 2234 -1.8175355256292112e-27 2272 1661 -6.2499999999999991e-11 2272 1655 4.1666666666666665e-11 2272 1440 -4.1666666666666665e-11 2272 1442 -1.0416666666666666e-11 2272 1443 4.1666666666666665e-11 2272 1809 2.0833333333333332e-11 2272 1808 1.2499999999999998e-10 2272 1273 -5.2083333333333334e-11 2272 2273 8.3333333333333330e-11 2272 2274 -1.8175355256292112e-27 2272 1268 1.0416666666666666e-11 2272 1270 -1.0416666666666667e-10 2272 1275 4.1666666666666678e-11 2273 2273 4.1666666666666662e-10 2273 1655 2.0833333333333329e-11 2273 1488 -2.0833333333333329e-11 2273 1272 2.0833333333333326e-11 2273 2271 2.0833333333333339e-11 2273 1492 -2.0833333333333329e-11 2273 1491 -6.2499999999999991e-11 2273 2275 -2.0833333333333336e-11 2273 1490 3.5628902784306998e-27 2273 2232 2.0833333333333326e-11 2273 2231 -2.0833333333333332e-11 2273 1651 2.0833333333333329e-11 2273 1652 7.2916666666666660e-11 2273 1661 -1.0416666666666669e-11 2273 2274 -2.0833333333333339e-11 2273 2272 8.3333333333333330e-11 2273 1268 7.2916666666666660e-11 2273 1270 -1.0416666666666671e-11 2273 1275 2.0833333333333332e-11 2274 2274 2.4999999999999996e-10 2274 1661 -1.0416666666666666e-11 2274 1652 -6.2499999999999991e-11 2274 1655 -2.0833333333333332e-11 2274 1654 -1.0416666666666669e-11 2274 2192 -2.0833333333333332e-11 2274 2190 3.6839804273821251e-27 2274 1279 -1.0416666666666665e-11 2274 2273 -2.0833333333333339e-11 2274 2272 -2.2913451068275814e-27 2274 1268 -6.2499999999999991e-11 2274 1270 -1.0416666666666666e-11 2274 1275 -2.0833333333333323e-11 2275 2275 2.9166666666666664e-10 2275 1485 2.0833333333333329e-11 2275 2218 4.1666666666666652e-11 2275 2215 -2.0833333333333326e-11 2275 1288 -1.1213657767716683e-27 2275 1272 4.1666666666666658e-11 2275 1268 1.0416666666666665e-11 2275 1270 1.5039633158038590e-27 2275 2271 4.1666666666666665e-11 2275 1492 1.0416666666666666e-10 2275 1491 2.0833333333333332e-11 2275 2273 -2.0833333333333336e-11 2275 1490 1.0416666666666663e-11 2276 2276 2.9166666666666664e-10 2276 1491 -2.0833333333333329e-11 2276 1289 -1.1000665323307010e-27 2276 2277 4.1666666666666665e-11 2276 1492 -1.0416666666666666e-10 2276 1494 -2.0833333333333332e-11 2276 2278 2.0833333333333336e-11 2276 1495 -1.0416666666666661e-11 2276 2271 -4.1666666666666652e-11 2276 2270 2.0833333333333326e-11 2276 1272 -4.1666666666666658e-11 2276 1271 -1.0416666666666661e-11 2276 1270 1.5039633158038590e-27 2277 2277 2.9166666666666659e-10 2277 1271 -2.0833333333333332e-11 2277 2276 4.1666666666666665e-11 2277 2278 -2.0833333333333336e-11 2277 1495 -1.1000665323307010e-27 2277 1492 -4.1666666666666665e-11 2277 1494 -1.0416666666666665e-11 2277 1493 1.3020149240672800e-27 2277 2268 -4.1666666666666652e-11 2277 2266 2.0833333333333326e-11 2277 1272 -1.0416666666666666e-10 2277 1287 -2.0833333333333329e-11 2277 1289 -1.0416666666666661e-11 2278 2278 4.1666666666666662e-10 2278 1675 -2.0833333333333329e-11 2278 1470 2.0833333333333326e-11 2278 2282 2.0833333333333336e-11 2278 1674 -2.0833333333333329e-11 2278 1673 -6.2500000000000004e-11 2278 2284 -2.0833333333333336e-11 2278 1672 3.7324953730532174e-27 2278 2283 -2.0833333333333326e-11 2278 2281 2.0833333333333326e-11 2278 1290 2.0833333333333329e-11 2278 1476 -2.0833333333333329e-11 2278 1272 2.0833333333333326e-11 2278 1271 6.2499999999999991e-11 2278 1289 -2.1169082391605852e-27 2278 2277 -2.0833333333333336e-11 2278 1492 -2.0833333333333329e-11 2278 1494 -6.2500000000000004e-11 2278 2276 2.0833333333333336e-11 2278 1495 3.7324953730532174e-27 2278 1946 2.0833333333333326e-11 2278 1945 -2.0833333333333326e-11 2278 1466 2.0833333333333329e-11 2278 1465 6.2499999999999991e-11 2278 1464 -2.1169082391605852e-27 2279 2279 2.9166666666666659e-10 2279 1594 1.0416666666666666e-10 2279 1595 2.0833333333333332e-11 2279 1593 1.0416666666666661e-11 2279 1677 4.1666666666666665e-11 2279 1673 1.0416666666666665e-11 2279 2280 2.0833333333333336e-11 2279 1676 -1.3020149240672800e-27 2279 2267 4.1666666666666652e-11 2279 2266 -2.0833333333333326e-11 2279 1591 2.0833333333333329e-11 2279 1048 -4.1666666666666665e-11 2279 307 1.1000665323307010e-27 2280 2280 4.1666666666666662e-10 2280 1594 2.0833333333333326e-11 2280 1595 6.2499999999999991e-11 2280 1593 -2.1169082391605852e-27 2280 2279 2.0833333333333336e-11 2280 1677 -2.0833333333333329e-11 2280 1673 -6.2500000000000004e-11 2280 1460 6.2499999999999991e-11 2280 1459 -2.1169082391605852e-27 2280 1486 -2.0833333333333329e-11 2280 1452 2.0833333333333326e-11 2280 1942 -2.0833333333333336e-11 2280 1475 -2.0833333333333329e-11 2280 1494 -6.2500000000000004e-11 2280 1943 2.0833333333333336e-11 2280 1496 3.7324953730532174e-27 2280 2228 2.0833333333333326e-11 2280 2227 -2.0833333333333326e-11 2280 1592 2.0833333333333329e-11 2280 303 -2.0833333333333329e-11 2280 1048 2.0833333333333336e-11 2280 307 3.7324953730532174e-27 2280 1061 2.0833333333333326e-11 2280 1062 -2.0833333333333326e-11 2280 430 2.0833333333333329e-11 2281 2281 2.9166666666666664e-10 2281 1287 2.0833333333333332e-11 2281 2269 4.1666666666666665e-11 2281 2266 -2.0833333333333336e-11 2281 1676 1.5039633158038590e-27 2281 1675 4.1666666666666658e-11 2281 1673 1.0416666666666665e-11 2281 1672 -1.1213657767716683e-27 2281 2283 4.1666666666666652e-11 2281 2278 2.0833333333333326e-11 2281 1290 1.0416666666666666e-10 2281 1271 2.0833333333333329e-11 2281 1289 1.0416666666666663e-11 2282 2282 2.9166666666666659e-10 2282 1674 4.1666666666666665e-11 2282 1673 1.0416666666666665e-11 2282 1940 2.0833333333333326e-11 2282 1470 1.0416666666666666e-10 2282 1463 2.0833333333333329e-11 2282 1464 1.0416666666666661e-11 2282 1465 2.0833333333333332e-11 2282 2284 4.1666666666666665e-11 2282 2278 2.0833333333333336e-11 2282 1672 1.1000665323307010e-27 2282 308 -1.3020149240672800e-27 2282 704 -4.1666666666666652e-11 2283 2283 2.9166666666666659e-10 2283 1290 4.1666666666666658e-11 2283 1271 1.0416666666666661e-11 2283 1274 1.3020149240672800e-27 2283 1675 1.0416666666666666e-10 2283 1817 -2.0833333333333336e-11 2283 1672 1.0416666666666661e-11 2283 1673 2.0833333333333329e-11 2283 2281 4.1666666666666652e-11 2283 2278 -2.0833333333333326e-11 2283 1289 -1.3233141685082473e-27 2283 699 4.1666666666666665e-11 2283 294 2.0833333333333332e-11 2284 2284 2.9166666666666659e-10 2284 1674 1.0416666666666666e-10 2284 1672 1.0416666666666661e-11 2284 1817 -2.0833333333333326e-11 2284 1470 4.1666666666666658e-11 2284 1465 1.0416666666666661e-11 2284 1472 -1.5039633158038590e-27 2284 1464 1.1000665323307010e-27 2284 2282 4.1666666666666665e-11 2284 1673 2.0833333333333332e-11 2284 2278 -2.0833333333333336e-11 2284 294 2.0833333333333329e-11 2284 700 4.1666666666666652e-11 2285 2285 4.1666666666666662e-10 2285 1121 2.0833333333333329e-11 2285 1453 -2.0833333333333326e-11 2285 2309 -2.0833333333333336e-11 2285 1136 2.0833333333333329e-11 2285 1129 6.2499999999999991e-11 2285 2286 2.0833333333333336e-11 2285 1137 -3.5628902784306998e-27 2285 1475 2.0833333333333329e-11 2285 1592 -2.0833333333333326e-11 2285 2229 2.0833333333333336e-11 2285 1486 2.0833333333333329e-11 2285 1497 6.2499999999999991e-11 2285 2228 -2.0833333333333336e-11 2285 1496 -3.5628902784306998e-27 2285 1943 -2.0833333333333326e-11 2285 1944 2.0833333333333326e-11 2285 1452 -2.0833333333333329e-11 2285 1460 -6.2499999999999991e-11 2285 1461 2.1169082391605852e-27 2285 2057 -2.0833333333333326e-11 2285 2056 2.0833333333333326e-11 2285 1582 -2.0833333333333329e-11 2285 1595 -6.2499999999999991e-11 2285 1597 2.1169082391605852e-27 2286 2286 2.9166666666666664e-10 2286 1119 2.0833333333333329e-11 2286 2048 4.1666666666666652e-11 2286 2047 -2.0833333333333326e-11 2286 1462 -1.3233141685082473e-27 2286 1453 4.1666666666666658e-11 2286 1460 1.0416666666666661e-11 2286 1461 1.3020149240672800e-27 2286 2309 4.1666666666666665e-11 2286 1136 1.0416666666666666e-10 2286 1129 2.0833333333333332e-11 2286 2285 2.0833333333333336e-11 2286 1137 1.0416666666666661e-11 2287 2287 2.0833333333333331e-10 2288 2288 2.9166666666666664e-10 2288 1130 -1.1213657767716683e-27 2288 1124 4.1666666666666658e-11 2288 1123 1.0416666666666665e-11 2288 2295 4.1666666666666665e-11 2288 1122 1.5039633158038590e-27 2288 1966 4.1666666666666652e-11 2288 1327 1.0416666666666666e-10 2289 2289 2.0833333333333331e-10 2290 2290 2.9166666666666659e-10 2290 2300 -4.1666666666666665e-11 2290 1126 1.1000665323307010e-27 2290 1125 4.1666666666666665e-11 2290 1123 1.0416666666666665e-11 2290 1122 -1.3020149240672800e-27 2290 2294 4.1666666666666652e-11 2290 1682 1.0416666666666666e-10 2291 2291 2.9166666666666659e-10 2291 1964 4.1666666666666665e-11 2291 1130 1.1000665323307010e-27 2291 1131 4.1666666666666665e-11 2291 1123 1.0416666666666665e-11 2291 1132 -1.3020149240672800e-27 2291 2168 4.1666666666666652e-11 2291 1504 1.0416666666666666e-10 2292 2292 4.1666666666666662e-10 2292 1124 2.0833333333333329e-11 2292 1682 -2.0833333333333329e-11 2292 2298 2.0833333333333336e-11 2292 1125 2.0833333333333326e-11 2292 1127 6.2499999999999991e-11 2292 2294 2.0833333333333336e-11 2292 1122 -2.1169082391605852e-27 2292 2295 2.0833333333333326e-11 2292 2296 2.0833333333333326e-11 2292 1327 -2.0833333333333329e-11 2292 1363 2.0833333333333329e-11 2292 1324 -2.0833333333333329e-11 2292 1331 3.5628902784306998e-27 2292 1865 2.0833333333333336e-11 2292 1346 2.0833333333333326e-11 2292 1361 6.2499999999999991e-11 2292 1862 -2.0833333333333336e-11 2292 1362 -2.1169082391605852e-27 2292 2293 2.0833333333333326e-11 2292 2301 -2.0833333333333326e-11 2292 1680 -2.0833333333333329e-11 2292 1678 3.5628902784306998e-27 2293 2293 2.9166666666666664e-10 2293 1855 4.1666666666666665e-11 2293 1345 2.0833333333333332e-11 2293 1363 1.0416666666666666e-10 2293 1361 2.0833333333333329e-11 2293 1362 1.0416666666666663e-11 2293 2301 4.1666666666666652e-11 2293 2292 2.0833333333333326e-11 2293 1680 4.1666666666666665e-11 2293 1678 -1.1000665323307010e-27 2294 2294 2.9166666666666664e-10 2294 1678 1.1213657767716683e-27 2294 2298 -4.1666666666666665e-11 2294 1127 2.0833333333333332e-11 2294 2292 2.0833333333333336e-11 2294 1125 1.0416666666666666e-10 2294 1123 2.0833333333333329e-11 2294 1122 1.0416666666666663e-11 2294 2290 4.1666666666666652e-11 2294 1682 4.1666666666666665e-11 2295 2295 2.9166666666666664e-10 2295 1127 2.0833333333333329e-11 2295 2296 -4.1666666666666652e-11 2295 2292 2.0833333333333326e-11 2295 1331 -1.1000665323307010e-27 2295 1327 4.1666666666666665e-11 2295 2288 4.1666666666666665e-11 2295 1124 1.0416666666666666e-10 2295 1123 2.0833333333333332e-11 2295 1122 1.0416666666666663e-11 2296 2296 2.9166666666666659e-10 2296 1329 -2.0833333333333332e-11 2296 2225 -4.1666666666666665e-11 2296 2222 2.0833333333333336e-11 2296 1128 -1.1000665323307010e-27 2296 1124 -4.1666666666666658e-11 2296 1127 -1.0416666666666661e-11 2296 1122 1.5039633158038590e-27 2296 2295 -4.1666666666666652e-11 2296 2292 2.0833333333333326e-11 2296 1327 -1.0416666666666666e-10 2296 1331 -1.0416666666666661e-11 2297 2297 2.9166666666666664e-10 2297 1966 -4.1666666666666665e-11 2297 1963 2.0833333333333336e-11 2297 1130 -1.1213657767716683e-27 2297 1124 -4.1666666666666665e-11 2297 1129 -1.0416666666666665e-11 2297 1128 1.1000665323307010e-27 2297 2225 -4.1666666666666652e-11 2297 2223 2.0833333333333332e-11 2297 1327 -1.0416666666666666e-10 2297 1329 -2.0833333333333329e-11 2297 1332 -1.0416666666666663e-11 2298 2298 2.9166666666666659e-10 2298 1133 1.3233141685082473e-27 2298 1125 -4.1666666666666658e-11 2298 1127 -1.0416666666666661e-11 2298 2294 -4.1666666666666665e-11 2298 2292 2.0833333333333336e-11 2298 1122 -1.3020149240672800e-27 2298 2299 4.1666666666666652e-11 2298 2302 -2.0833333333333326e-11 2298 1682 -1.0416666666666666e-10 2298 1678 -1.0416666666666661e-11 2299 2299 2.9166666666666664e-10 2299 1700 -4.1666666666666665e-11 2299 1114 -2.0833333333333332e-11 2299 1125 -1.0416666666666666e-10 2299 1127 -2.0833333333333329e-11 2299 1133 -1.0416666666666663e-11 2299 2298 4.1666666666666652e-11 2299 2302 2.0833333333333326e-11 2299 1682 -4.1666666666666658e-11 2299 1678 1.1213657767716683e-27 2300 2300 2.9166666666666664e-10 2300 1114 -2.0833333333333329e-11 2300 1700 -4.1666666666666652e-11 2300 1682 -4.1666666666666658e-11 2300 2290 -4.1666666666666665e-11 2300 1125 -1.0416666666666666e-10 2300 1123 -2.0833333333333332e-11 2300 1126 -1.0416666666666661e-11 2301 2301 2.9166666666666659e-10 2301 2306 -4.1666666666666665e-11 2301 2302 2.0833333333333336e-11 2301 1365 1.1000665323307010e-27 2301 1363 4.1666666666666658e-11 2301 1361 1.0416666666666661e-11 2301 1362 -1.5039633158038590e-27 2301 2293 4.1666666666666652e-11 2301 2292 -2.0833333333333326e-11 2301 1680 1.0416666666666666e-10 2301 1678 1.0416666666666661e-11 2302 2302 4.1666666666666662e-10 2302 1367 -2.0833333333333329e-11 2302 1680 2.0833333333333329e-11 2302 2301 2.0833333333333336e-11 2302 1363 -2.0833333333333326e-11 2302 1361 -6.2499999999999991e-11 2302 2306 2.0833333333333336e-11 2302 1365 2.1169082391605852e-27 2302 2313 -2.0833333333333326e-11 2302 2303 2.0833333333333326e-11 2302 1094 2.0833333333333329e-11 2302 1125 -2.0833333333333329e-11 2302 1091 2.0833333333333329e-11 2302 1098 -3.7324953730532174e-27 2302 1707 -2.0833333333333336e-11 2302 1115 -2.0833333333333326e-11 2302 1127 -6.2499999999999991e-11 2302 1704 2.0833333333333336e-11 2302 1133 2.1169082391605852e-27 2302 2299 2.0833333333333326e-11 2302 2298 -2.0833333333333326e-11 2302 1682 2.0833333333333329e-11 2302 1678 -3.7324953730532174e-27 2303 2303 2.9166666666666659e-10 2303 1097 2.0833333333333332e-11 2303 2052 4.1666666666666665e-11 2303 2050 -2.0833333333333336e-11 2303 1368 1.3020149240672800e-27 2303 1367 4.1666666666666658e-11 2303 1361 1.0416666666666661e-11 2303 1365 -1.3233141685082473e-27 2303 2313 4.1666666666666652e-11 2303 2302 2.0833333333333326e-11 2303 1094 1.0416666666666666e-10 2303 1098 1.0416666666666661e-11 2304 2304 2.9166666666666659e-10 2304 2305 4.1666666666666665e-11 2304 1366 -2.0833333333333332e-11 2304 1363 -1.0416666666666666e-10 2304 1345 -2.0833333333333329e-11 2304 1364 -1.0416666666666661e-11 2304 1855 -4.1666666666666652e-11 2304 1680 -4.1666666666666658e-11 2305 2305 2.9166666666666664e-10 2305 2304 4.1666666666666665e-11 2305 1364 -1.1213657767716683e-27 2305 1363 -4.1666666666666665e-11 2305 1366 -1.0416666666666665e-11 2305 1365 1.1000665323307010e-27 2305 2306 4.1666666666666652e-11 2305 1680 -1.0416666666666666e-10 2306 2306 2.9166666666666659e-10 2306 1678 -1.1000665323307010e-27 2306 2301 -4.1666666666666665e-11 2306 1361 -2.0833333333333332e-11 2306 2302 2.0833333333333336e-11 2306 1363 -1.0416666666666666e-10 2306 1366 -2.0833333333333329e-11 2306 1365 -1.0416666666666661e-11 2306 2305 4.1666666666666652e-11 2306 1680 -4.1666666666666665e-11 2307 2307 2.0833333333333331e-10 2308 2308 2.9166666666666664e-10 2308 1505 2.0833333333333332e-11 2308 2148 4.1666666666666665e-11 2308 2147 -2.0833333333333339e-11 2308 1134 1.3233141685082473e-27 2308 1131 4.1666666666666665e-11 2308 1129 1.0416666666666665e-11 2308 1130 -1.1000665323307010e-27 2308 1964 4.1666666666666652e-11 2308 1963 -2.0833333333333326e-11 2308 1504 1.0416666666666666e-10 2308 1502 1.0416666666666663e-11 2309 2309 2.9166666666666664e-10 2309 1460 2.0833333333333332e-11 2309 2286 4.1666666666666665e-11 2309 2285 -2.0833333333333336e-11 2309 1137 1.1213657767716683e-27 2309 1136 4.1666666666666665e-11 2309 1129 1.0416666666666665e-11 2309 1134 -1.1000665323307010e-27 2309 2149 4.1666666666666652e-11 2309 2147 -2.0833333333333332e-11 2309 1453 1.0416666666666666e-10 2309 1450 2.0833333333333329e-11 2309 1461 1.0416666666666663e-11 2310 2310 2.0833333333333331e-10 2311 2311 2.9166666666666664e-10 2311 1369 -1.1000665323307010e-27 2311 1367 4.1666666666666665e-11 2311 1366 1.0416666666666665e-11 2311 2313 4.1666666666666665e-11 2311 1365 1.3233141685082473e-27 2311 2314 -4.1666666666666652e-11 2311 1094 1.0416666666666666e-10 2312 2312 2.0833333333333331e-10 2313 2313 2.9166666666666664e-10 2313 1361 2.0833333333333329e-11 2313 2303 4.1666666666666652e-11 2313 2302 -2.0833333333333326e-11 2313 1098 -1.1213657767716683e-27 2313 1094 4.1666666666666658e-11 2313 2311 4.1666666666666665e-11 2313 1367 1.0416666666666666e-10 2313 1366 2.0833333333333332e-11 2313 1365 1.0416666666666663e-11 2314 2314 2.9166666666666664e-10 2314 1366 -2.0833333333333329e-11 2314 1099 -1.1000665323307010e-27 2314 2262 -4.1666666666666665e-11 2314 1367 -1.0416666666666666e-10 2314 1358 -2.0833333333333332e-11 2314 2261 2.0833333333333336e-11 2314 1369 -1.0416666666666661e-11 2314 2311 -4.1666666666666652e-11 2314 1094 -4.1666666666666658e-11 2315 2315 6.6666666666666654e-10 2315 1614 6.2499999999999991e-11 2315 1613 -4.1666666666666665e-11 2315 1524 6.2499999999999991e-11 2315 1522 -4.1666666666666665e-11 2315 1223 -1.0416666666666666e-11 2315 1993 -8.3333333333333330e-11 2315 1991 -1.6155871338926322e-27 2315 1228 6.2499999999999991e-11 2315 1226 -4.1666666666666665e-11 2315 2096 -8.3333333333333330e-11 2315 2095 -1.6155871338926322e-27 2315 1612 -1.0416666666666666e-11 2315 115 -1.0416666666666666e-11 2315 221 -1.0416666666666666e-11 2315 817 -8.3333333333333330e-11 2315 815 1.6155871338926322e-27 2315 112 -1.0416666666666666e-11 2315 116 6.2499999999999991e-11 2315 114 -4.1666666666666665e-11 2315 818 -8.3333333333333330e-11 2315 814 1.6155871338926322e-27 2315 441 -1.0416666666666666e-11 2315 4068 -1.0416666666666666e-11 2315 4316 -1.0416666666666666e-11 2316 2316 6.6666666666666664e-10 2316 2321 -8.3333333333333330e-11 2316 2319 -1.8175355256292112e-27 2316 1689 6.2499999999999991e-11 2316 1691 -4.1666666666666665e-11 2316 1191 -1.0416666666666666e-11 2316 2088 8.3333333333333330e-11 2316 2090 1.8175355256292112e-27 2316 1220 -1.0416666666666666e-11 2316 1227 6.2499999999999991e-11 2316 1226 -4.1666666666666665e-11 2316 1992 8.3333333333333330e-11 2316 1991 1.8175355256292112e-27 2316 1523 6.2499999999999991e-11 2316 1522 -4.1666666666666665e-11 2316 2320 -8.3333333333333330e-11 2316 2317 -1.8175355256292112e-27 2316 1195 6.2499999999999991e-11 2316 1196 -4.1666666666666665e-11 2316 4071 -1.0416666666666666e-11 2316 4356 -1.0416666666666666e-11 2316 4316 -1.0416666666666666e-11 2316 4068 -1.0416666666666666e-11 2317 2317 2.4999999999999996e-10 2317 1689 1.0416666666666666e-11 2317 2318 9.5018296033870872e-28 2317 1691 2.0833333333333326e-11 2317 2320 2.0833333333333339e-11 2317 2316 -2.2913451068275814e-27 2317 1195 1.0416666666666666e-11 2317 1196 2.0833333333333326e-11 2318 2318 5.8333333333333318e-10 2318 1146 -4.1666666666666665e-11 2318 1691 -4.1666666666666678e-11 2318 1754 -1.6155871338926322e-27 2318 1196 -4.1666666666666665e-11 2318 2317 1.6155871338926322e-27 2318 108 1.0416666666666666e-11 2318 825 -2.0833333333333332e-11 2318 813 1.2500000000000001e-10 2318 4355 5.2083333333333334e-11 2319 2319 2.4999999999999996e-10 2319 1691 2.0833333333333326e-11 2319 1522 2.0833333333333326e-11 2319 1523 1.0416666666666663e-11 2319 2321 2.0833333333333336e-11 2319 2316 -2.2913451068275814e-27 2319 1689 1.0416666666666666e-11 2319 4356 6.2500000000000004e-11 2319 4355 1.0416666666666663e-11 2319 5059 2.0833333333333336e-11 2319 813 9.5018296033870872e-28 2319 4071 6.2500000000000004e-11 2319 4073 1.0416666666666666e-11 2320 2320 4.1666666666666662e-10 2320 1691 2.0833333333333329e-11 2320 1194 2.0833333333333329e-11 2320 1984 2.0833333333333339e-11 2320 1979 -8.3333333333333330e-11 2320 1689 -2.0833333333333339e-11 2320 2317 2.0833333333333339e-11 2320 2316 -8.3333333333333330e-11 2320 1195 -2.0833333333333339e-11 2320 1196 2.0833333333333332e-11 2320 4364 2.0833333333333332e-11 2321 2321 4.1666666666666662e-10 2321 1522 2.0833333333333329e-11 2321 2319 2.0833333333333339e-11 2321 2316 -8.3333333333333330e-11 2321 1691 2.0833333333333332e-11 2321 1689 -2.0833333333333332e-11 2321 1979 -8.3333333333333330e-11 2321 1523 -2.0833333333333332e-11 2321 4356 8.3333333333333330e-11 2321 4364 2.0833333333333329e-11 2321 4706 2.0833333333333339e-11 2321 4071 8.3333333333333330e-11 2321 4060 2.0833333333333332e-11 2322 2322 4.9999999999999993e-10 2322 1601 -1.0416666666666666e-11 2322 1769 2.0833333333333332e-11 2322 1773 1.2499999999999998e-10 2322 1598 -1.0416666666666668e-11 2322 1599 4.1666666666666665e-11 2322 2005 2.0833333333333332e-11 2322 2004 1.2500000000000001e-10 2322 1211 -5.2083333333333334e-11 2322 1216 4.1666666666666665e-11 2322 4320 -5.2083333333333334e-11 2322 4254 -2.0833333333333339e-11 2322 4317 -1.4583333333333335e-10 2323 2323 4.5833333333333330e-10 2323 1528 5.2083333333333334e-11 2323 2009 4.1666666666666652e-11 2323 2005 -8.3333333333333330e-11 2323 1601 1.0416666666666665e-11 2323 1530 -8.0779356694631609e-27 2323 4254 -1.6155871338926322e-27 2323 4250 2.0833333333333329e-11 2323 4980 2.0833333333333339e-11 2323 4982 -8.3333333333333330e-11 2323 4308 2.0833333333333332e-11 2324 2324 2.4999999999999996e-10 2325 2325 2.4999999999999996e-10 2325 1532 1.0416666666666668e-11 2325 1547 2.0833333333333332e-11 2325 2326 -2.2913451068275814e-27 2325 2129 2.0833333333333336e-11 2325 2128 -3.6839804273821251e-27 2325 1604 2.0833333333333323e-11 2325 1603 1.0416666666666665e-11 2326 2326 5.8333333333333328e-10 2326 1533 5.2083333333333334e-11 2326 2006 -2.0833333333333332e-11 2326 2004 -1.2500000000000001e-10 2326 1601 1.0416666666666668e-11 2326 1547 -4.1666666666666665e-11 2326 2325 -1.8175355256292112e-27 2326 1604 -4.1666666666666665e-11 2326 2070 1.8175355256292112e-27 2326 1599 -4.1666666666666678e-11 2327 2327 2.0833333333333331e-10 2328 2328 2.4999999999999996e-10 2328 1549 1.0416666666666668e-11 2328 1564 2.0833333333333332e-11 2328 2329 -2.2913451068275814e-27 2328 2191 2.0833333333333332e-11 2328 2190 -3.6839804273821251e-27 2328 1655 2.0833333333333323e-11 2328 1654 1.0416666666666665e-11 2329 2329 5.8333333333333318e-10 2329 1550 5.2083333333333334e-11 2329 2022 -2.0833333333333332e-11 2329 2020 -1.2499999999999998e-10 2329 1445 1.0416666666666668e-11 2329 1564 -4.1666666666666665e-11 2329 2328 -1.8175355256292112e-27 2329 1655 -4.1666666666666665e-11 2329 2234 -1.6155871338926322e-27 2329 1443 -4.1666666666666678e-11 2330 2330 2.0833333333333331e-10 2331 2331 2.0833333333333331e-10 2332 2332 2.0833333333333331e-10 hypre-2.33.0/src/test/TEST_ams/mfem.M.00002000066400000000000000000020556321477326011500176400ustar00rootroot000000000000002333 3709 2333 3709 2333 2333 6.2499999999999986e-03 2334 2334 1.0416666958333331e-02 2335 2335 4.9999999999999996e-02 2335 3049 -2.0833333333333329e-03 2335 3114 -2.0833333333333329e-03 2335 3055 -4.1666666666666657e-03 2335 3054 -1.0416666666666664e-02 2335 3421 2.0833333333333329e-03 2335 2338 -1.0416666666666662e-03 2335 3053 -4.1666666666666657e-03 2335 3052 -1.0416666666666664e-02 2335 3090 2.0833333333333329e-03 2335 2337 5.2083333333333322e-03 2335 2336 -1.0416666666666664e-03 2335 3048 4.1666666666666657e-03 2335 3028 1.0416666666666664e-02 2336 2336 6.2500002499999985e-03 2336 3096 1.2499999999999998e-10 2336 2350 -1.0416666666666668e-11 2336 3095 4.1666666666666665e-11 2336 2349 2.0833333333333339e-11 2336 3050 -4.1666666666666665e-11 2336 3117 1.0416666666666666e-11 2336 3048 1.3552527156068805e-19 2336 3049 -1.0416666775086880e-11 2336 3053 1.3552527156068805e-19 2336 3052 -1.0416666666666664e-03 2336 3090 -1.0416667100347535e-11 2336 2335 -1.0416666666666664e-03 2336 2337 -1.0842021825829240e-19 2336 4760 -3.1250000000000002e-11 2337 2337 5.6250000166666654e-02 2337 3116 4.1666667083333324e-03 2337 3117 6.2499999999999991e-11 2337 2348 8.4829026083874785e-20 2337 2349 4.1666666666666665e-11 2337 3095 -1.0416666666666666e-11 2337 3635 -1.0416666666666667e-03 2337 3263 3.1249999999999997e-03 2337 3115 -1.6666666666666666e-02 2337 3269 3.1249999999999997e-03 2337 2344 2.0833333333333337e-03 2337 3054 -2.0833333333333333e-03 2337 3114 -6.2500000000000003e-03 2337 2338 5.2083333333333322e-03 2337 3113 -7.2916666666666659e-03 2337 3112 -6.2500000000000003e-03 2337 3491 1.0416666666666667e-03 2337 2343 5.2083333333333330e-03 2337 2340 4.1666666666666666e-03 2337 3053 -1.0416666666666664e-03 2337 3052 -2.0833333333333329e-03 2337 3090 3.1250000416666668e-03 2337 2335 5.2083333333333330e-03 2337 2336 -1.3668994342244490e-19 2337 4763 -1.0416666666666666e-11 2338 2338 3.1249999999999993e-02 2338 3438 -1.0416666666666664e-03 2338 3423 -4.1666666666666666e-03 2338 3268 3.1249999999999997e-03 2338 2345 2.0833333333333337e-03 2338 3115 -4.1666666666666657e-03 2338 3269 1.2499999999999997e-02 2338 2344 -1.0416666666666667e-03 2338 3053 -1.3552527156068805e-19 2338 2337 5.2083333333333339e-03 2338 3114 -1.0416666666666664e-03 2338 3055 1.3552527156068805e-19 2338 3054 -1.0416666666666662e-03 2338 3421 -1.0416666666666669e-03 2338 2335 -1.0416666666666662e-03 2339 2339 2.7083333333333327e-02 2340 2340 3.7499999999999992e-02 2340 2348 2.0833333333333333e-03 2340 3635 -4.1666666666666657e-03 2340 3630 -4.1666666666666675e-03 2340 3492 2.0833333333333329e-03 2340 3116 2.0833333333333329e-03 2340 3113 -2.0833333333333329e-03 2340 3112 -2.0833333333333329e-03 2340 3491 4.1666666666666666e-03 2340 2337 4.1666666666666657e-03 2340 2343 -2.0833333333333333e-03 2340 3498 -2.0833333333333329e-03 2340 4791 4.1666666666666657e-03 2340 4782 4.1666666666666657e-03 2340 4786 1.6666666666666663e-02 2340 4152 -6.2499999999999986e-03 2341 2341 2.4999999999999994e-02 2342 2342 4.5833333333333323e-02 2343 2343 4.9999999999999989e-02 2343 3498 -1.0416666666666664e-03 2343 3492 -2.1684043449710089e-19 2343 3180 4.1666666666666657e-03 2343 3171 1.2499999999999997e-02 2343 2347 -1.0416666666666667e-03 2343 3170 3.1250000000000002e-03 2343 3487 2.0833333333333342e-03 2343 3268 3.1249999999999997e-03 2343 2345 6.2499999999999995e-03 2343 3115 -4.1666666666666666e-03 2343 3263 1.2500000000000001e-02 2343 2344 -1.0416666666666660e-03 2343 3113 8.6736173798840355e-19 2343 3112 -1.0416666666666664e-03 2343 3491 -6.2500000000000003e-03 2343 2337 5.2083333333333330e-03 2343 2340 -2.0833333333333329e-03 2344 2344 1.6666666666666663e-02 2344 3423 -1.0416666666666664e-03 2344 3487 1.0416666666666667e-03 2344 3268 -2.0833333333333346e-03 2344 2345 -6.2499999999999986e-03 2344 3113 -1.0416666666666667e-03 2344 2343 -1.0416666666666662e-03 2344 3263 1.0416666666666660e-03 2344 3114 -1.0416666666666664e-03 2344 3115 -6.2499999999999986e-03 2344 3269 1.0416666666666662e-03 2344 2337 2.0833333333333337e-03 2344 2338 -1.0416666666666667e-03 2345 2345 4.9999999999999989e-02 2345 3171 4.1666666666666657e-03 2345 3172 4.1666666666666657e-03 2345 3170 1.6666666666666666e-02 2345 2347 -6.2499999999999986e-03 2345 3489 -4.1666666666666675e-03 2345 3421 2.0833333333333329e-03 2345 3438 -2.0833333333333329e-03 2345 3269 4.1666666666666657e-03 2345 2338 2.0833333333333333e-03 2345 3423 4.1666666666666657e-03 2345 3263 4.1666666666666657e-03 2345 3487 -4.1666666666666666e-03 2345 3268 1.6666666666666663e-02 2345 2343 6.2499999999999995e-03 2345 2344 -6.2499999999999986e-03 2346 2346 2.4999999999999994e-02 2347 2347 1.6666666666666663e-02 2347 3492 1.0416666666666664e-03 2347 3180 6.2499999999999986e-03 2347 3171 1.0416666666666662e-03 2347 2343 -1.0416666666666667e-03 2347 3487 1.0416666666666664e-03 2347 3172 1.0416666666666660e-03 2347 3489 1.0416666666666667e-03 2347 3170 -2.0833333333333346e-03 2347 2345 -6.2499999999999986e-03 2348 2348 2.5000000124999998e-02 2348 3635 4.1666666666666666e-03 2348 2340 2.0833333333333337e-03 2348 3116 -1.0416666770833331e-03 2348 3117 1.0416666666666663e-11 2348 2349 -2.0833333333333326e-11 2348 2337 8.1315162936412833e-20 2348 3112 -1.0416666666666664e-03 2348 4765 1.0416666666666665e-11 2348 4786 3.1249999999999997e-03 2348 4794 1.0416666562499996e-03 2348 4792 4.1666666666666657e-03 2348 4791 1.2499999999999997e-02 2348 4152 -1.0416666666666667e-03 2348 4763 6.2500000000000004e-11 2349 2349 3.7499999999999995e-10 2349 3096 4.1666666666666665e-11 2349 2336 2.0833333333333332e-11 2349 3095 -4.1666666666666665e-11 2349 3705 4.1666666666666665e-11 2349 2350 -6.2499999999999991e-11 2349 3116 2.0833333333333332e-11 2349 3117 2.0833333333333326e-11 2349 2337 4.1666666666666665e-11 2349 2348 -2.0833333333333326e-11 2349 3090 2.0833333333333329e-11 2349 4794 2.0833333333333332e-11 2349 4760 -1.6666666666666669e-10 2349 4765 2.0833333333333326e-11 2349 4764 -4.1666666666666671e-11 2349 4763 -4.1666666666666665e-11 2350 2350 1.6666666666666663e-10 2350 3096 1.0416666666666660e-11 2350 2336 -1.0416666666666666e-11 2350 3095 1.0416666666666666e-11 2350 3705 1.0416666666666665e-11 2350 2349 -6.2500000000000004e-11 2350 3049 -1.0416666666666665e-11 2350 3050 -6.2500000000000004e-11 2350 4764 1.0416666666666666e-11 2350 4760 2.0833333333333345e-11 2351 2351 2.4999999999999996e-10 2352 2352 6.2499999999999986e-03 2353 2353 2.0833333333333329e-02 2354 2354 4.9999999999999989e-02 2354 3442 2.0833333333333329e-03 2354 3043 -1.0416666666666664e-02 2354 3407 -2.0833333333333329e-03 2354 2362 -1.0416666666666664e-03 2354 3042 -4.1666666666666657e-03 2354 2360 5.2083333333333322e-03 2354 3399 2.0833333333333329e-03 2354 3041 -1.0416666666666664e-02 2354 3035 -2.0833333333333329e-03 2354 2359 -1.0416666666666662e-03 2354 3038 4.1666666666666657e-03 2354 3040 -4.1666666666666657e-03 2354 3030 1.0416666666666664e-02 2355 2355 6.2499999999999986e-03 2356 2356 2.0833333333333332e-02 2357 2357 4.9999999999999989e-02 2357 3481 2.0833333333333329e-03 2357 3480 -1.0416666666666664e-02 2357 3412 2.0833333333333329e-03 2357 2363 -1.0416666666666662e-03 2357 3411 4.1666666666666657e-03 2357 2360 5.2083333333333322e-03 2357 3407 -2.0833333333333329e-03 2357 3444 1.0416666666666664e-02 2357 3442 2.0833333333333329e-03 2357 2362 -1.0416666666666664e-03 2357 3478 4.1666666666666657e-03 2357 3479 -4.1666666666666657e-03 2357 3476 1.0416666666666664e-02 2358 2358 2.0833333333333332e-02 2359 2359 1.2499999999999997e-02 2359 3042 -1.3552527156068805e-19 2359 3038 -1.3552527156068805e-19 2359 3041 -1.0416666666666662e-03 2359 2354 -1.0416666666666662e-03 2359 3039 1.0842021724855044e-19 2359 3035 4.3368086899420177e-19 2359 3409 -1.0842021724855044e-19 2359 3404 1.0416666666666662e-03 2359 3399 -4.3368086899420177e-19 2359 2361 -1.0416666666666662e-03 2359 2360 4.3368086899420177e-19 2360 2360 4.1666666666666657e-02 2360 3412 6.2499999999999995e-03 2360 2363 4.1202858928001372e-19 2360 3409 1.0416666666666664e-03 2360 2361 5.2083333333333330e-03 2360 3480 -2.0833333333333329e-03 2360 3411 1.0416666666666664e-03 2360 2357 5.2083333333333330e-03 2360 3444 2.0833333333333333e-03 2360 3043 -2.0833333333333329e-03 2360 3407 -6.2500000000000003e-03 2360 2362 2.6745065309554533e-19 2360 3042 -1.0416666666666664e-03 2360 2354 5.2083333333333330e-03 2360 3041 -2.0833333333333333e-03 2360 3404 2.0833333333333329e-03 2360 3399 6.2499999999999995e-03 2360 2359 4.1202858928001372e-19 2360 666 -2.0833333333333333e-03 2360 885 2.0833333333333333e-03 2360 665 -1.0416666666666664e-03 2360 664 -2.0833333333333329e-03 2360 884 6.2500000000000003e-03 2360 243 5.2083333333333330e-03 2360 245 2.6745065309554533e-19 2361 2361 4.9999999999999989e-02 2361 3409 4.1666666666666657e-03 2361 2360 5.2083333333333322e-03 2361 3039 4.1666666666666657e-03 2361 3035 -2.0833333333333329e-03 2361 3404 1.0416666666666664e-02 2361 3399 2.0833333333333329e-03 2361 2359 -1.0416666666666662e-03 2361 884 2.0833333333333329e-03 2361 885 1.0416666666666664e-02 2361 883 2.0833333333333329e-03 2361 245 -1.0416666666666664e-03 2361 937 4.1666666666666657e-03 2361 933 1.0416666666666664e-02 2362 2362 1.2499999999999997e-02 2362 3411 1.3552527156068805e-19 2362 3478 -1.3552527156068805e-19 2362 3444 1.0416666666666664e-03 2362 2357 -1.0416666666666664e-03 2362 3040 -1.3552527156068805e-19 2362 3442 -2.1684043449710089e-19 2362 3042 1.3552527156068805e-19 2362 3043 -1.0416666666666664e-03 2362 3407 4.3368086899420177e-19 2362 2354 -1.0416666666666664e-03 2362 2360 2.1684043449710089e-19 2363 2363 1.2499999999999997e-02 2363 2360 4.3368086899420177e-19 2363 3412 -4.3368086899420177e-19 2363 3481 -4.3368086899420177e-19 2363 3479 -1.0842021724855044e-19 2363 3411 -1.0842021724855044e-19 2363 3480 -1.0416666666666662e-03 2363 2357 -1.0416666666666662e-03 2363 665 -1.3552527156068805e-19 2363 662 -1.3552527156068805e-19 2363 666 -1.0416666666666662e-03 2363 243 -1.0416666666666662e-03 2364 2364 1.2499999999999997e-02 2364 3415 -1.3552527156068805e-19 2364 3037 1.0842021724855044e-19 2364 3045 1.0842021724855044e-19 2364 3044 -1.0416666666666662e-03 2364 3401 -4.3368086899420177e-19 2364 2368 -1.0416666666666662e-03 2364 2367 4.3368086899420177e-19 2364 3036 -1.3552527156068805e-19 2364 3398 1.0416666666666662e-03 2364 3035 4.3368086899420177e-19 2364 2366 -1.0416666666666662e-03 2365 2365 2.0833333333333332e-02 2366 2366 4.9999999999999989e-02 2366 3036 4.1666666666666657e-03 2366 3416 4.1666666666666657e-03 2366 3401 2.0833333333333329e-03 2366 3461 2.0833333333333329e-03 2366 3415 -4.1666666666666657e-03 2366 3414 -1.0416666666666664e-02 2366 3464 2.0833333333333329e-03 2366 2367 5.2083333333333322e-03 2366 2371 -1.0416666666666664e-03 2366 3398 1.0416666666666664e-02 2366 3035 -2.0833333333333329e-03 2366 2364 -1.0416666666666662e-03 2366 936 1.0416666666666664e-02 2367 2367 2.0833333541666665e-02 2367 3096 2.2851328271989659e-27 2367 3466 -1.0416666666666667e-10 2367 3463 3.6295685768920020e-28 2367 2375 9.5018296033870872e-28 2367 3398 2.0833333333333333e-03 2367 3047 -2.0833333333333333e-03 2367 3091 3.1250000520833330e-03 2367 2373 4.0414059750199561e-19 2367 3415 -1.0416666666666664e-03 2367 3414 -2.0833333333333329e-03 2367 3464 3.1250000520833335e-03 2367 2366 5.2083333333333330e-03 2367 2371 -1.3668994340301920e-19 2367 3045 -1.0416666666666664e-03 2367 3044 -2.0833333333333329e-03 2367 3401 6.2499999999999995e-03 2367 2368 5.2083333333333330e-03 2367 2364 4.1202858928001372e-19 2368 2368 4.9999999999999989e-02 2368 3091 2.0833333333333329e-03 2368 3047 -1.0416666666666664e-02 2368 3049 -2.0833333333333329e-03 2368 2373 -1.0416666666666664e-03 2368 3035 -2.0833333333333329e-03 2368 3046 -4.1666666666666657e-03 2368 3037 4.1666666666666657e-03 2368 3032 1.0416666666666664e-02 2368 3045 -4.1666666666666657e-03 2368 3044 -1.0416666666666664e-02 2368 3401 2.0833333333333329e-03 2368 2367 5.2083333333333322e-03 2368 2364 -1.0416666666666662e-03 2369 2369 6.2499999999999986e-03 2370 2370 1.0416666958333331e-02 2371 2371 6.2500001041666652e-03 2371 3466 2.0194839173657902e-27 2371 3470 -2.0194839173657902e-27 2371 2375 1.0416666666666671e-11 2371 3463 1.0416666666666663e-11 2371 3416 1.3552527156068805e-19 2371 3461 1.0416666775086887e-11 2371 3415 1.3552527156068805e-19 2371 3414 -1.0416666666666664e-03 2371 3464 -4.3368087545655031e-19 2371 2366 -1.0416666666666664e-03 2371 2367 -1.0842021886413758e-19 2372 2372 1.0416666958333331e-02 2373 2373 6.2500001041666652e-03 2373 3050 2.0194839173657902e-27 2373 3466 -2.0194839173657902e-27 2373 2375 1.0416666666666663e-11 2373 3096 1.0416666666666671e-11 2373 3045 -1.3552527156068805e-19 2373 2367 3.2526065497682560e-19 2373 3046 1.3552527156068805e-19 2373 3047 -1.0416666666666664e-03 2373 3049 -1.0416666341406011e-11 2373 2368 -1.0416666666666664e-03 2374 2374 1.0416666666666666e-10 2375 2375 4.9999999999999993e-10 2375 3705 -6.2499999999999991e-11 2375 3050 -6.2499999999999991e-11 2375 3049 -5.2083333333333334e-11 2375 3091 -2.2470898404921788e-28 2375 3096 -6.2500000000000004e-11 2375 2373 1.0416666666666663e-11 2375 3466 2.2214323091023692e-27 2375 3464 -2.0194839173657902e-27 2375 2367 1.6155871338926322e-27 2375 3461 5.2083333333333334e-11 2375 3463 -6.2499999999999991e-11 2375 2371 1.0416666666666671e-11 2375 3470 -6.2499999999999991e-11 2375 3706 -8.0779356694631609e-27 2375 3707 -6.2500000000000004e-11 2376 2376 2.0833333333333334e-10 2377 2377 1.0416666666666666e-10 2378 2378 1.2499999999999997e-02 2378 3041 1.3552527156068805e-19 2378 3044 -1.3552527156068805e-19 2378 2389 4.3368086899420177e-19 2378 3035 -2.1684043449710089e-19 2378 3032 -1.3552527156068805e-19 2378 3037 1.0416666666666664e-03 2378 2381 -1.0416666666666664e-03 2378 3030 1.3552527156068805e-19 2378 2380 -1.0416666666666664e-03 2378 2379 2.1684043449710089e-19 2378 3038 1.0416666666666664e-03 2379 2379 4.1666666666666657e-02 2379 3040 -2.0833333333333329e-03 2379 3436 -2.0833333333333333e-03 2379 2403 4.1202858928001372e-19 2379 3034 1.0416666666666664e-03 2379 3437 -2.0833333333333329e-03 2379 2395 5.2083333333333330e-03 2379 3055 -2.0833333333333333e-03 2379 2396 2.6745065309554533e-19 2379 3028 1.0416666666666664e-03 2379 3048 2.0833333333333329e-03 2379 2383 5.2083333333333330e-03 2379 3046 -2.0833333333333333e-03 2379 2382 4.1202858928001372e-19 2379 3032 1.0416666666666664e-03 2379 3037 2.0833333333333329e-03 2379 2381 5.2083333333333330e-03 2379 3030 1.0416666666666664e-03 2379 2380 5.2083333333333330e-03 2379 3038 2.0833333333333333e-03 2379 2378 2.6745065309554533e-19 2380 2380 4.9999999999999989e-02 2380 3040 -1.0416666666666664e-02 2380 3442 -2.0833333333333329e-03 2380 2403 -1.0416666666666662e-03 2380 3043 -4.1666666666666657e-03 2380 3407 2.0833333333333329e-03 2380 2397 5.2083333333333322e-03 2380 3042 -1.0416666666666664e-02 2380 3399 -2.0833333333333329e-03 2380 2390 -1.0416666666666662e-03 2380 3041 -4.1666666666666657e-03 2380 3035 2.0833333333333329e-03 2380 2389 5.2083333333333322e-03 2380 3030 4.1666666666666657e-03 2380 2379 5.2083333333333322e-03 2380 3038 1.0416666666666664e-02 2380 2378 -1.0416666666666664e-03 2381 2381 4.9999999999999989e-02 2381 3091 -2.0833333333333329e-03 2381 3047 -4.1666666666666657e-03 2381 3049 2.0833333333333329e-03 2381 2385 5.2083333333333322e-03 2381 3045 -1.0416666666666664e-02 2381 3401 -2.0833333333333329e-03 2381 2402 -1.0416666666666664e-03 2381 3044 -4.1666666666666657e-03 2381 2389 5.2083333333333322e-03 2381 3035 2.0833333333333329e-03 2381 3046 -1.0416666666666664e-02 2381 2382 -1.0416666666666662e-03 2381 3032 4.1666666666666657e-03 2381 3037 1.0416666666666664e-02 2381 2379 5.2083333333333322e-03 2381 2378 -1.0416666666666664e-03 2382 2382 1.2499999999999997e-02 2382 3047 1.3552527156068805e-19 2382 3052 -1.0842021724855044e-19 2382 2385 4.3368086899420177e-19 2382 3049 -4.3368086899420177e-19 2382 3028 -1.0842021724855044e-19 2382 3048 1.0416666666666662e-03 2382 2383 -1.0416666666666662e-03 2382 3032 1.3552527156068805e-19 2382 2381 -1.0416666666666662e-03 2382 2379 4.3368086899420177e-19 2382 3046 -1.0416666666666662e-03 2383 2383 4.9999999999999996e-02 2383 3049 2.0833333333333329e-03 2383 3114 2.0833333333333329e-03 2383 3054 -4.1666666666666657e-03 2383 3055 -1.0416666666666664e-02 2383 3421 -2.0833333333333329e-03 2383 2393 5.2083333333333322e-03 2383 2396 -1.0416666666666664e-03 2383 3052 -4.1666666666666657e-03 2383 3053 -1.0416666666666664e-02 2383 3090 -2.0833333333333329e-03 2383 2385 5.2083333333333322e-03 2383 2388 -1.0416666666666662e-03 2383 3028 4.1666666666666657e-03 2383 3048 1.0416666666666664e-02 2383 2379 5.2083333333333322e-03 2383 2382 -1.0416666666666662e-03 2384 2384 1.2499999999999997e-02 2384 3108 1.0842021724855044e-19 2384 3109 -1.3552527156068805e-19 2384 2399 4.3368086899420177e-19 2384 3097 -4.3368086899420177e-19 2384 3094 -1.3552527156068805e-19 2384 3102 1.0416666666666662e-03 2384 2387 -1.0416666666666662e-03 2384 3092 1.0842021724855044e-19 2384 2386 -1.0416666666666662e-03 2384 2385 4.3368086899420177e-19 2384 3103 1.0416666666666662e-03 2384 3093 4.3368086899420177e-19 2385 2385 4.1666666666666664e-02 2385 3105 -2.0833333333333329e-03 2385 3045 -2.0833333333333333e-03 2385 3091 -6.2499999999999986e-03 2385 2402 2.6745065309554533e-19 2385 3047 -1.0416666666666664e-03 2385 3046 -2.0833333333333329e-03 2385 2381 5.2083333333333330e-03 2385 3048 2.0833333333333333e-03 2385 3049 6.2500000000000003e-03 2385 2382 3.7587087034409578e-19 2385 3052 -1.0416666666666664e-03 2385 3053 -2.0833333333333329e-03 2385 2383 5.2083333333333330e-03 2385 3110 -2.0833333333333333e-03 2385 3090 -6.2499999999999986e-03 2385 2388 2.6745065309554533e-19 2385 3094 1.0416666666666664e-03 2385 3102 2.0833333333333329e-03 2385 2387 5.2083333333333330e-03 2385 3092 1.0416666666666664e-03 2385 2386 5.2083333333333330e-03 2385 3103 2.0833333333333333e-03 2385 3093 -6.2500000000000003e-03 2385 2384 3.7587087034409578e-19 2386 2386 4.9999999999999989e-02 2386 3458 -2.0833333333333329e-03 2386 3108 -4.1666666666666657e-03 2386 3097 2.0833333333333329e-03 2386 2399 5.2083333333333322e-03 2386 3091 -2.0833333333333329e-03 2386 3105 -1.0416666666666664e-02 2386 3401 -2.0833333333333329e-03 2386 2402 -1.0416666666666662e-03 2386 3106 -4.1666666666666657e-03 2386 3107 -1.0416666666666664e-02 2386 3402 -2.0833333333333329e-03 2386 2389 5.2083333333333322e-03 2386 2401 -1.0416666666666664e-03 2386 3092 4.1666666666666657e-03 2386 2385 5.2083333333333322e-03 2386 3103 1.0416666666666664e-02 2386 3093 -2.0833333333333329e-03 2386 2384 -1.0416666666666662e-03 2387 2387 4.9999999999999989e-02 2387 3097 2.0833333333333329e-03 2387 3069 2.0833333333333329e-03 2387 3111 -4.1666666666666657e-03 2387 3114 2.0833333333333329e-03 2387 2393 5.2083333333333322e-03 2387 3109 -4.1666666666666657e-03 2387 3068 1.0416666666666664e-02 2387 3067 2.0833333333333329e-03 2387 2399 5.2083333333333322e-03 2387 2400 -1.0416666666666664e-03 2387 3110 -1.0416666666666664e-02 2387 3090 -2.0833333333333329e-03 2387 2388 -1.0416666666666664e-03 2387 3094 4.1666666666666657e-03 2387 3102 1.0416666666666664e-02 2387 3093 -2.0833333333333329e-03 2387 2385 5.2083333333333322e-03 2387 2384 -1.0416666666666662e-03 2388 2388 1.2499999999999997e-02 2388 3111 1.3552527156068805e-19 2388 3054 -1.3552527156068805e-19 2388 2393 4.3368086899420177e-19 2388 3114 -2.1684043449710089e-19 2388 3052 1.3552527156068805e-19 2388 3053 -1.0416666666666662e-03 2388 2383 -1.0416666666666662e-03 2388 3094 1.3552527156068805e-19 2388 2387 -1.0416666666666664e-03 2388 2385 2.1684043449710089e-19 2388 3110 -1.0416666666666664e-03 2388 3090 4.3368086899420177e-19 2389 2389 4.1666666666666657e-02 2389 3045 -2.0833333333333329e-03 2389 3105 -2.0833333333333333e-03 2389 3401 -6.2499999999999986e-03 2389 2402 4.1202858928001372e-19 2389 3106 -1.0416666666666660e-03 2389 3107 -2.0833333333333329e-03 2389 2386 5.2083333333333330e-03 2389 3420 -2.0833333333333333e-03 2389 3402 -6.2499999999999995e-03 2389 2401 4.1202858928001372e-19 2389 3400 1.0416666666666660e-03 2389 3406 2.0833333333333329e-03 2389 2391 5.2083333333333330e-03 2389 3042 -2.0833333333333333e-03 2389 3399 -6.2499999999999986e-03 2389 2390 4.1202858928001372e-19 2389 3041 -1.0416666666666660e-03 2389 3038 2.0833333333333329e-03 2389 2380 5.2083333333333330e-03 2389 3044 -1.0416666666666660e-03 2389 2381 5.2083333333333330e-03 2389 3037 2.0833333333333333e-03 2389 3035 6.2499999999999995e-03 2389 2378 4.1202858928001372e-19 2390 2390 1.2499999999999997e-02 2390 3043 1.3552527156068805e-19 2390 3417 -1.3552527156068805e-19 2390 2397 2.1684043449710089e-19 2390 3407 -4.3368086899420177e-19 2390 3400 -1.3552527156068805e-19 2390 3406 1.0416666666666664e-03 2390 2391 -1.0416666666666664e-03 2390 3041 -1.3552527156068805e-19 2390 2380 -1.0416666666666662e-03 2390 2389 4.3368086899420177e-19 2390 3042 -1.0416666666666662e-03 2390 3399 2.1684043449710089e-19 2391 2391 4.9999999999999989e-02 2391 3407 2.0833333333333329e-03 2391 3458 -2.0833333333333329e-03 2391 3420 -1.0416666666666664e-02 2391 3402 -2.0833333333333329e-03 2391 2401 -1.0416666666666664e-03 2391 3419 -4.1666666666666657e-03 2391 2399 5.2083333333333322e-03 2391 3445 2.0833333333333329e-03 2391 3417 -4.1666666666666657e-03 2391 3418 -1.0416666666666664e-02 2391 3441 -2.0833333333333329e-03 2391 2397 5.2083333333333322e-03 2391 2398 -1.0416666666666662e-03 2391 3400 4.1666666666666657e-03 2391 3406 1.0416666666666664e-02 2391 3399 -2.0833333333333329e-03 2391 2389 5.2083333333333322e-03 2391 2390 -1.0416666666666664e-03 2392 2392 1.2499999999999997e-02 2392 3432 1.3552527156068805e-19 2392 3435 -1.3552527156068805e-19 2392 2397 2.1684043449710089e-19 2392 3426 -4.3368086899420177e-19 2392 3425 -1.3552527156068805e-19 2392 3429 1.0416666666666664e-03 2392 2395 -1.0416666666666664e-03 2392 3422 1.3552527156068805e-19 2392 2394 -1.0416666666666662e-03 2392 2393 4.3368086899420177e-19 2392 3430 1.0416666666666662e-03 2392 3424 2.1684043449710089e-19 2393 2393 4.1666666666666657e-02 2393 3070 2.0833333333333329e-03 2393 3068 2.0833333333333333e-03 2393 3069 6.2499999999999995e-03 2393 2400 4.1202858928001372e-19 2393 3111 -1.0416666666666660e-03 2393 3110 -2.0833333333333329e-03 2393 2387 5.2083333333333330e-03 2393 3053 -2.0833333333333333e-03 2393 3114 6.2499999999999986e-03 2393 2388 4.1202858928001372e-19 2393 3054 -1.0416666666666660e-03 2393 3055 -2.0833333333333329e-03 2393 2383 5.2083333333333330e-03 2393 3437 -2.0833333333333333e-03 2393 3421 -6.2499999999999995e-03 2393 2396 4.1202858928001372e-19 2393 3425 1.0416666666666660e-03 2393 3429 2.0833333333333329e-03 2393 2395 5.2083333333333330e-03 2393 3422 1.0416666666666660e-03 2393 2394 5.2083333333333330e-03 2393 3430 2.0833333333333333e-03 2393 3424 -6.2499999999999986e-03 2393 2392 4.1202858928001372e-19 2394 2394 4.9999999999999989e-02 2394 3069 2.0833333333333329e-03 2394 3070 1.0416666666666664e-02 2394 3067 2.0833333333333329e-03 2394 2400 -1.0416666666666664e-03 2394 3434 -4.1666666666666657e-03 2394 3445 2.0833333333333329e-03 2394 2399 5.2083333333333322e-03 2394 3433 -1.0416666666666664e-02 2394 3441 -2.0833333333333329e-03 2394 2398 -1.0416666666666662e-03 2394 3432 -4.1666666666666657e-03 2394 3426 2.0833333333333329e-03 2394 2397 5.2083333333333322e-03 2394 3422 4.1666666666666657e-03 2394 2393 5.2083333333333322e-03 2394 3430 1.0416666666666664e-02 2394 3424 -2.0833333333333329e-03 2394 2392 -1.0416666666666662e-03 2395 2395 4.9999999999999989e-02 2395 3034 4.1666666666666657e-03 2395 2379 5.2083333333333322e-03 2395 3436 -1.0416666666666664e-02 2395 3442 -2.0833333333333329e-03 2395 2403 -1.0416666666666662e-03 2395 3435 -4.1666666666666657e-03 2395 2397 5.2083333333333322e-03 2395 3426 2.0833333333333329e-03 2395 3437 -1.0416666666666664e-02 2395 3421 -2.0833333333333329e-03 2395 2396 -1.0416666666666664e-03 2395 3425 4.1666666666666657e-03 2395 3429 1.0416666666666664e-02 2395 3424 -2.0833333333333329e-03 2395 2393 5.2083333333333322e-03 2395 2392 -1.0416666666666664e-03 2396 2396 1.2499999999999997e-02 2396 3034 -1.3552527156068805e-19 2396 3028 1.3552527156068805e-19 2396 2379 2.1684043449710089e-19 2396 3054 1.3552527156068805e-19 2396 3055 -1.0416666666666664e-03 2396 2383 -1.0416666666666664e-03 2396 3425 1.3552527156068805e-19 2396 2395 -1.0416666666666664e-03 2396 2393 4.3368086899420177e-19 2396 3437 -1.0416666666666664e-03 2396 3421 2.1684043449710089e-19 2397 2397 4.1666666666666664e-02 2397 3436 -2.0833333333333329e-03 2397 3040 -2.0833333333333333e-03 2397 3442 -6.2500000000000003e-03 2397 2403 3.7587087034409578e-19 2397 3043 -1.0416666666666664e-03 2397 3042 -2.0833333333333329e-03 2397 2380 5.2083333333333330e-03 2397 3406 2.0833333333333333e-03 2397 3407 6.2499999999999986e-03 2397 2390 2.6745065309554533e-19 2397 3417 -1.0416666666666664e-03 2397 3418 -2.0833333333333329e-03 2397 2391 5.2083333333333330e-03 2397 3433 -2.0833333333333333e-03 2397 3441 -6.2500000000000003e-03 2397 2398 3.7587087034409578e-19 2397 3432 -1.0416666666666664e-03 2397 3430 2.0833333333333329e-03 2397 2394 5.2083333333333330e-03 2397 3435 -1.0416666666666664e-03 2397 2395 5.2083333333333330e-03 2397 3429 2.0833333333333333e-03 2397 3426 6.2499999999999986e-03 2397 2392 2.6745065309554533e-19 2398 2398 1.2499999999999997e-02 2398 3434 1.0842021724855044e-19 2398 3419 -1.3552527156068805e-19 2398 2399 4.3368086899420177e-19 2398 3445 -4.3368086899420177e-19 2398 3417 1.3552527156068805e-19 2398 3418 -1.0416666666666662e-03 2398 2391 -1.0416666666666662e-03 2398 3432 -1.0842021724855044e-19 2398 2394 -1.0416666666666662e-03 2398 2397 4.3368086899420177e-19 2398 3433 -1.0416666666666662e-03 2398 3441 4.3368086899420177e-19 2399 2399 4.1666666666666657e-02 2399 3420 -2.0833333333333329e-03 2399 3107 -2.0833333333333333e-03 2399 3458 -6.2500000000000003e-03 2399 2401 2.6745065309554533e-19 2399 3108 -1.0416666666666664e-03 2399 3103 2.0833333333333329e-03 2399 2386 5.2083333333333330e-03 2399 3102 2.0833333333333333e-03 2399 3097 6.2499999999999995e-03 2399 2384 4.1202858928001372e-19 2399 3109 -1.0416666666666664e-03 2399 3068 2.0833333333333329e-03 2399 2387 5.2083333333333330e-03 2399 3070 2.0833333333333333e-03 2399 3067 6.2500000000000003e-03 2399 2400 2.6745065309554533e-19 2399 3434 -1.0416666666666664e-03 2399 3433 -2.0833333333333329e-03 2399 2394 5.2083333333333330e-03 2399 3419 -1.0416666666666664e-03 2399 2391 5.2083333333333330e-03 2399 3418 -2.0833333333333333e-03 2399 3445 6.2499999999999995e-03 2399 2398 4.1202858928001372e-19 2400 2400 1.2499999999999997e-02 2400 3422 -1.3552527156068805e-19 2400 3111 -1.3552527156068805e-19 2400 2393 4.3368086899420177e-19 2400 3069 -2.1684043449710089e-19 2400 3109 1.3552527156068805e-19 2400 3068 1.0416666666666664e-03 2400 2387 -1.0416666666666664e-03 2400 3434 -1.3552527156068805e-19 2400 2394 -1.0416666666666664e-03 2400 2399 2.1684043449710089e-19 2400 3070 1.0416666666666664e-03 2400 3067 -4.3368086899420177e-19 2401 2401 1.2499999999999997e-02 2401 3419 1.3552527156068805e-19 2401 3108 -1.3552527156068805e-19 2401 2399 2.1684043449710089e-19 2401 3458 4.3368086899420177e-19 2401 3106 1.3552527156068805e-19 2401 3107 -1.0416666666666664e-03 2401 2386 -1.0416666666666664e-03 2401 3400 1.3552527156068805e-19 2401 2391 -1.0416666666666664e-03 2401 2389 4.3368086899420177e-19 2401 3420 -1.0416666666666664e-03 2401 3402 2.1684043449710089e-19 2402 2402 1.2499999999999997e-02 2402 3092 -1.3552527156068805e-19 2402 3047 -1.3552527156068805e-19 2402 2385 2.1684043449710089e-19 2402 3091 4.3368086899420177e-19 2402 3044 1.3552527156068805e-19 2402 3045 -1.0416666666666664e-03 2402 2381 -1.0416666666666664e-03 2402 3106 -1.3552527156068805e-19 2402 2386 -1.0416666666666662e-03 2402 2389 4.3368086899420177e-19 2402 3105 -1.0416666666666662e-03 2402 3401 2.1684043449710089e-19 2403 2403 1.2499999999999997e-02 2403 3030 -1.0842021724855044e-19 2403 3034 1.3552527156068805e-19 2403 2379 4.3368086899420177e-19 2403 3435 1.3552527156068805e-19 2403 3436 -1.0416666666666662e-03 2403 2395 -1.0416666666666662e-03 2403 3043 -1.0842021724855044e-19 2403 2380 -1.0416666666666662e-03 2403 2397 4.3368086899420177e-19 2403 3040 -1.0416666666666662e-03 2403 3442 4.3368086899420177e-19 2404 2404 4.3749999999999990e-02 2404 3207 3.1249999999999997e-03 2404 3086 -4.1666666666666666e-03 2404 3089 1.0842021724855044e-19 2404 3060 -1.2500000000000001e-02 2404 3065 -2.0833333333333342e-03 2404 3253 -3.1249999999999997e-03 2404 2416 -1.0416666666666660e-03 2404 2407 6.2500000000000003e-03 2404 3064 1.0416666666666662e-03 2404 3209 4.1666666666666657e-03 2404 3063 -1.2499999999999997e-02 2404 2413 5.2083333333333339e-03 2404 2415 -1.0416666666666667e-03 2404 3081 -1.0842021724855044e-19 2404 3057 1.0416666666666662e-03 2404 3056 1.0416666666666660e-03 2404 2406 -1.0416666666666662e-03 2404 2405 5.2083333333333330e-03 2405 2405 5.6250000166666654e-02 2405 3661 -1.0416666666666666e-11 2405 3277 1.0416666666666667e-03 2405 3060 -3.1249999999999997e-03 2405 3087 -7.2916666666666659e-03 2405 3086 -1.6666666666666663e-02 2405 3262 3.1249999999999997e-03 2405 2411 5.2083333333333330e-03 2405 2416 2.0833333333333337e-03 2405 3088 2.0833333333333333e-03 2405 3085 -3.1250000416666664e-03 2405 3084 -6.2499999999999991e-11 2405 3474 -1.0416666666666666e-11 2405 2414 4.0414059341885156e-19 2405 3083 -4.1666667083333333e-03 2405 3082 -6.2500000000000003e-03 2405 3623 -1.0416666666666667e-03 2405 2412 7.0197856548546410e-20 2405 2410 4.1666666666666666e-03 2405 3081 1.0416666666666664e-03 2405 3057 2.0833333333333329e-03 2405 3056 6.2499999999999986e-03 2405 2406 5.2083333333333330e-03 2405 2404 5.2083333333333330e-03 2405 290 4.1666666666666665e-11 2406 2406 4.9999999999999989e-02 2406 3089 4.1666666666666657e-03 2406 2413 5.2083333333333322e-03 2406 3088 1.0416666666666664e-02 2406 2414 -1.0416666666666664e-03 2406 3064 2.0833333333333329e-03 2406 3085 -2.0833333333333329e-03 2406 3081 4.1666666666666657e-03 2406 3057 1.0416666666666664e-02 2406 3056 2.0833333333333329e-03 2406 2405 5.2083333333333322e-03 2406 2404 -1.0416666666666662e-03 2406 946 -2.0833333333333329e-03 2406 949 -1.0416666666666664e-02 2406 970 2.0833333333333329e-03 2406 287 -1.0416666666666662e-03 2406 945 4.1666666666666657e-03 2406 939 2.0833333333333329e-03 2406 1208 5.2083333333333322e-03 2407 2407 4.9999999999999989e-02 2407 3063 -4.1666666666666657e-03 2407 3199 4.1666666666666657e-03 2407 3207 1.6666666666666663e-02 2407 2415 -6.2499999999999986e-03 2407 3278 2.0833333333333329e-03 2407 3262 4.1666666666666657e-03 2407 2411 2.0833333333333333e-03 2407 3254 -4.1666666666666657e-03 2407 3060 -4.1666666666666657e-03 2407 3065 4.1666666666666666e-03 2407 3253 -1.6666666666666666e-02 2407 2404 6.2499999999999995e-03 2407 2416 -6.2499999999999986e-03 2407 3218 2.0833333333333329e-03 2407 3255 2.0833333333333329e-03 2407 3217 4.1666666666666675e-03 2407 2409 4.1666666666666657e-03 2407 2408 2.0833333333333329e-03 2408 2408 3.7499999999999999e-02 2408 3326 1.0416666666666662e-03 2408 3207 3.1249999999999997e-03 2408 3209 4.1666666666666666e-03 2408 3199 1.2500000000000001e-02 2408 2415 -1.0416666666666660e-03 2408 3214 8.6736173798840355e-19 2408 3213 1.0416666666666664e-03 2408 3219 -6.2500000000000003e-03 2408 2413 5.2083333333333330e-03 2408 3218 -2.0833333333333337e-03 2408 3255 1.0416666666666664e-03 2408 3217 -4.1666666666666675e-03 2408 2409 8.1315162936412833e-20 2408 2407 2.0833333333333329e-03 2408 288 -2.0833333333333329e-03 2409 2409 5.0000000166666655e-02 2409 3325 6.2500000000000003e-03 2409 2410 4.1666666666666666e-03 2409 3326 6.2500000000000003e-03 2409 3219 1.0416666666666667e-03 2409 3254 -1.0416666666666667e-03 2409 3278 8.3333333333333315e-03 2409 3277 1.0416666666666667e-03 2409 2411 1.5502688168223823e-19 2409 3218 8.3333333333333315e-03 2409 3255 6.2500000000000003e-03 2409 3217 1.0416666666666667e-03 2409 2408 1.5502688168223823e-19 2409 2407 4.1666666666666666e-03 2409 4865 1.0416666666666667e-03 2409 4438 -1.0416666666666666e-11 2409 4866 -4.1666667083333333e-03 2409 4889 1.0416666666666667e-03 2409 3779 7.0197856548546410e-20 2409 288 4.1666666666666666e-03 2409 4864 4.1666667083333324e-03 2409 4433 6.2499999999999991e-11 2409 4432 -1.0416666666666666e-11 2409 3778 8.4829026083874785e-20 2409 3775 4.1666666666666665e-11 2410 2410 2.4999999999999994e-02 2410 2412 -2.0833333333333333e-03 2410 3623 -4.1666666666666666e-03 2410 2409 4.1666666666666657e-03 2410 3325 2.0833333333333329e-03 2410 3087 -2.0833333333333329e-03 2410 3083 -2.0833333333333329e-03 2410 3082 -2.0833333333333329e-03 2410 2405 4.1666666666666657e-03 2410 3278 2.0833333333333329e-03 2410 3277 4.1666666666666666e-03 2410 2411 -2.0833333333333333e-03 2410 4466 -2.0833333333333329e-03 2410 4864 2.0833333333333329e-03 2410 4464 -2.0833333333333329e-03 2410 4463 -2.0833333333333329e-03 2410 4865 4.1666666666666666e-03 2410 3777 4.1666666666666657e-03 2410 3778 -2.0833333333333333e-03 2411 2411 3.7499999999999992e-02 2411 3082 -1.0416666666666664e-03 2411 3255 1.0416666666666664e-03 2411 3087 8.6736173798840355e-19 2411 3086 -4.1666666666666657e-03 2411 2405 5.2083333333333330e-03 2411 3262 1.2499999999999997e-02 2411 2416 -1.0416666666666667e-03 2411 3254 4.1666666666666666e-03 2411 3253 -3.1250000000000002e-03 2411 2407 2.0833333333333333e-03 2411 3278 -2.0833333333333333e-03 2411 3325 1.0416666666666664e-03 2411 3277 -6.2500000000000003e-03 2411 2409 8.1315162936412833e-20 2411 2410 -2.0833333333333329e-03 2412 2412 1.2500000125000001e-02 2412 3623 6.2500000000000003e-03 2412 2410 -2.0833333333333329e-03 2412 3661 6.2500000000000004e-11 2412 3084 -1.0416666666666665e-11 2412 3083 1.0416666770833340e-03 2412 3082 -1.0416666666666664e-03 2412 2405 1.6155871338926322e-27 2412 4463 -1.0416666666666664e-03 2412 4466 1.0416666770833331e-03 2412 4465 -1.0416666666666663e-11 2412 3777 1.3552525540481672e-20 2412 290 -2.0833333333333326e-11 2413 2413 5.6250000104166656e-02 2413 3213 6.2500000000000003e-03 2413 3089 1.0416666666666664e-03 2413 2406 5.2083333333333330e-03 2413 3057 2.0833333333333333e-03 2413 3199 3.1249999999999997e-03 2413 3064 6.2500000000000003e-03 2413 3209 1.6666666666666663e-02 2413 3063 -3.1249999999999997e-03 2413 2404 5.2083333333333339e-03 2413 2415 2.0833333333333333e-03 2413 3214 -7.2916666666666659e-03 2413 3219 1.0416666666666667e-03 2413 2408 5.2083333333333330e-03 2413 711 -2.0833333333333329e-11 2413 1011 -1.0416666666666667e-03 2413 288 4.1666666666666666e-03 2413 710 -1.0416666666666665e-11 2413 709 -2.0833333333333329e-11 2413 978 -4.1666666979166657e-03 2413 286 5.2083333333333328e-11 2413 289 -1.4558380268724954e-20 2413 949 -2.0833333333333329e-03 2413 970 3.1250000312499993e-03 2413 287 -1.3668993825846281e-19 2414 2414 6.2500001249999985e-03 2414 3474 6.2499999999999991e-11 2414 3088 1.0416666666666664e-03 2414 2406 -1.0416666666666664e-03 2414 3081 1.3552527156068805e-19 2414 3085 1.0416666666666673e-11 2414 3084 -1.0416666666666666e-11 2414 2405 3.2526065013006420e-19 2414 947 -1.0416666666666665e-11 2414 290 -2.0833333333333326e-11 2414 945 -1.3552527156068805e-19 2414 939 -1.0416666991927315e-11 2414 1208 1.6155871338926322e-27 2415 2415 1.6666666666666663e-02 2415 3065 -1.0416666666666664e-03 2415 3217 -1.0416666666666667e-03 2415 3207 -2.0833333333333342e-03 2415 2407 -6.2499999999999986e-03 2415 3214 -1.0416666666666667e-03 2415 2408 -1.0416666666666662e-03 2415 3199 1.0416666666666660e-03 2415 3064 1.0416666666666664e-03 2415 3209 6.2499999999999986e-03 2415 3063 -1.0416666666666660e-03 2415 2413 2.0833333333333337e-03 2415 2404 -1.0416666666666667e-03 2416 2416 1.6666666666666663e-02 2416 3056 1.0416666666666667e-03 2416 3087 -1.0416666666666664e-03 2416 3086 -6.2499999999999986e-03 2416 2405 2.0833333333333337e-03 2416 3262 1.0416666666666660e-03 2416 2411 -1.0416666666666667e-03 2416 3254 1.0416666666666664e-03 2416 3060 -1.0416666666666660e-03 2416 3065 -1.0416666666666667e-03 2416 3253 2.0833333333333342e-03 2416 2404 -1.0416666666666662e-03 2416 2407 -6.2499999999999986e-03 2417 2417 3.1249999999999993e-02 2417 3230 5.2083333333333330e-03 2417 3148 -1.4583333333333332e-02 2417 2440 -6.2499999999999986e-03 2417 3227 5.2083333333333330e-03 2417 3153 2.1684043449710089e-19 2417 3152 -1.0416666666666671e-03 2417 2430 6.2499999999999995e-03 2417 3431 4.9904357809065860e-20 2417 3146 -1.0416666666666673e-03 2417 2438 6.2499999999999986e-03 2417 3156 1.0842021724855044e-19 2417 2432 5.4210108624275222e-19 2417 3149 -6.5052130349130266e-19 2417 3159 1.0842021724855044e-19 2417 3145 1.0416666666666662e-03 2417 3144 -5.5565361339882102e-19 2417 2419 -1.0416666666666662e-03 2417 2418 8.1315162936412833e-20 2418 2418 4.7916666666666656e-02 2418 3146 2.1705219273391446e-19 2418 3431 -9.3750000000000014e-03 2418 3485 1.0416666666666667e-03 2418 2438 1.0116749763768550e-19 2418 3432 -2.0833333333333329e-03 2418 3160 -2.0833333333333333e-03 2418 3426 -6.2500000000000003e-03 2418 2434 2.6745065309554533e-19 2418 3430 1.0416666666666664e-03 2418 2422 5.2083333333333330e-03 2418 3422 2.0833333333333333e-03 2418 3424 7.2916666666666668e-03 2418 3428 -6.2499999999999995e-03 2418 3423 1.0416666666666667e-03 2418 2420 4.7433845046240819e-19 2418 2427 4.1666666666666666e-03 2418 3159 -1.0416666666666664e-03 2418 3145 2.0833333333333329e-03 2418 3144 8.3333333333333315e-03 2418 2419 5.2083333333333330e-03 2418 2417 9.2717020499843766e-20 2419 2419 4.9999999999999989e-02 2419 3447 2.0833333333333329e-03 2419 3162 -1.0416666666666664e-02 2419 3157 2.0833333333333329e-03 2419 2437 -1.0416666666666662e-03 2419 3426 -2.0833333333333329e-03 2419 3161 -4.1666666666666657e-03 2419 3160 -1.0416666666666664e-02 2419 3441 2.0833333333333329e-03 2419 2435 5.2083333333333322e-03 2419 2434 -1.0416666666666664e-03 2419 3156 4.1666666666666657e-03 2419 2432 5.2083333333333322e-03 2419 3149 2.0833333333333329e-03 2419 3159 -4.1666666666666657e-03 2419 3145 1.0416666666666664e-02 2419 3144 2.0833333333333329e-03 2419 2418 5.2083333333333322e-03 2419 2417 -1.0416666666666662e-03 2420 2420 2.4999999999999994e-02 2420 3268 -5.2083333333333330e-03 2420 3071 -3.2249014814734037e-20 2420 3269 1.0416666666666669e-03 2420 2426 6.2499999999999995e-03 2420 3430 1.3552527156068805e-19 2420 3424 -1.0416666666666673e-03 2420 3428 -1.0416666666666664e-03 2420 3423 -1.0416666666666666e-02 2420 2418 4.3368086899420177e-19 2420 2427 -4.1666666666666666e-03 2420 3070 -1.3552527156068805e-19 2420 3422 1.0416666666666662e-03 2420 3069 5.1499603193061461e-19 2420 2422 -1.0416666666666662e-03 2420 2421 -9.4867690092481638e-20 2421 2421 4.1666666666666664e-02 2421 3269 -2.1705219273391446e-19 2421 3075 -2.0833333333333329e-03 2421 3434 -2.0833333333333333e-03 2421 3067 -6.2499999999999986e-03 2421 2436 2.6745065309554533e-19 2421 3073 1.0416666666666664e-03 2421 2425 5.2083333333333330e-03 2421 3059 2.0833333333333333e-03 2421 3061 8.3333333333333332e-03 2421 3071 -1.0416666666666668e-02 2421 3060 5.0116116045879435e-20 2421 2423 4.3812779196728685e-19 2421 2426 1.0116749763768550e-19 2421 3070 1.0416666666666664e-03 2421 3422 2.0833333333333329e-03 2421 3069 -8.3333333333333332e-03 2421 2422 5.2083333333333330e-03 2421 2420 -1.5124832064409600e-19 2422 2422 4.9999999999999989e-02 2422 3067 -2.0833333333333329e-03 2422 3434 -1.0416666666666664e-02 2422 3445 -2.0833333333333329e-03 2422 2436 -1.0416666666666664e-03 2422 3433 -4.1666666666666657e-03 2422 2435 5.2083333333333322e-03 2422 3441 2.0833333333333329e-03 2422 3432 -1.0416666666666664e-02 2422 3426 -2.0833333333333329e-03 2422 2434 -1.0416666666666664e-03 2422 3430 4.1666666666666657e-03 2422 2418 5.2083333333333322e-03 2422 3424 2.0833333333333329e-03 2422 3070 4.1666666666666657e-03 2422 3422 1.0416666666666664e-02 2422 3069 -2.0833333333333329e-03 2422 2421 5.2083333333333322e-03 2422 2420 -1.0416666666666662e-03 2423 2423 3.1249999999999993e-02 2423 3207 -5.2083333333333330e-03 2423 3065 -1.4583333333333332e-02 2423 3253 5.2083333333333330e-03 2423 2433 -6.2499999999999986e-03 2423 3204 -4.9904357809065860e-20 2423 3063 -1.0416666666666669e-03 2423 2428 6.2499999999999995e-03 2423 3073 1.0842021724855044e-19 2423 3061 -6.5052130349130266e-19 2423 3071 2.1684043449710089e-19 2423 3060 -1.0416666666666669e-03 2423 2421 5.4210108624275222e-19 2423 2426 6.2499999999999986e-03 2423 3074 -1.0842021724855044e-19 2423 3059 1.0416666666666662e-03 2423 3058 -5.5565361339882102e-19 2423 2425 -1.0416666666666662e-03 2423 2424 8.1315162936412833e-20 2424 2424 4.1666666666666657e-02 2424 3074 1.0416666666666664e-03 2424 2425 5.2083333333333330e-03 2424 3211 8.3333333333333350e-03 2424 2429 4.7433845046240819e-19 2424 3063 2.1705219273391446e-19 2424 3204 1.0416666666666668e-02 2424 3203 -5.0116116045879435e-20 2424 2428 1.0116749763768550e-19 2424 3059 2.0833333333333329e-03 2424 3058 8.3333333333333315e-03 2424 2423 9.2717020499843766e-20 2424 984 2.0833333333333329e-03 2424 983 2.0833333333333333e-03 2424 981 6.2500000000000003e-03 2424 490 2.6745065309554533e-19 2424 1008 1.0416666666666664e-03 2424 489 5.2083333333333330e-03 2424 1007 2.0833333333333333e-03 2425 2425 4.9999999999999989e-02 2425 3074 4.1666666666666657e-03 2425 2424 5.2083333333333322e-03 2425 3076 4.1666666666666657e-03 2425 2435 5.2083333333333322e-03 2425 3445 -2.0833333333333329e-03 2425 3075 -1.0416666666666664e-02 2425 3067 -2.0833333333333329e-03 2425 2436 -1.0416666666666662e-03 2425 3073 4.1666666666666657e-03 2425 2421 5.2083333333333322e-03 2425 3061 2.0833333333333329e-03 2425 3059 1.0416666666666664e-02 2425 3058 2.0833333333333329e-03 2425 2423 -1.0416666666666662e-03 2425 981 2.0833333333333329e-03 2425 983 1.0416666666666664e-02 2425 982 2.0833333333333329e-03 2425 490 -1.0416666666666664e-03 2426 2426 4.3749999999999990e-02 2426 3276 4.9904357809065860e-20 2426 3423 -5.2083333333333330e-03 2426 3069 -2.1684043449710089e-19 2426 2420 6.2500000000000003e-03 2426 3269 -1.0416666666666667e-03 2426 3268 -1.4583333333333332e-02 2426 2427 -6.2499999999999986e-03 2426 3267 -1.0416666666666673e-03 2426 3485 -5.2083333333333330e-03 2426 2438 6.2499999999999986e-03 2426 3065 -5.2083333333333339e-03 2426 3265 -1.0416666666666673e-03 2426 3259 1.0416666666666664e-03 2426 3253 1.0416666666666666e-02 2426 2431 8.1315162936412833e-20 2426 2433 -4.1666666666666657e-03 2426 3061 -2.1684043449710089e-19 2426 3071 6.5052130349130266e-19 2426 3060 1.0416666666666669e-03 2426 2421 2.1684043449710089e-19 2426 2423 6.2499999999999986e-03 2427 2427 2.0833333333333329e-02 2427 3269 2.8940292364521927e-21 2427 3268 4.1666666666666666e-03 2427 2426 -6.2499999999999986e-03 2427 3267 2.1705219273391446e-19 2427 3431 -2.0833333333333329e-03 2427 3485 4.1666666666666675e-03 2427 2438 -4.1666666666666657e-03 2427 3424 2.0833333333333329e-03 2427 3428 -2.0833333333333329e-03 2427 3423 4.1666666666666675e-03 2427 2418 4.1666666666666657e-03 2427 2420 -4.1666666666666666e-03 2428 2428 4.3749999999999990e-02 2428 3259 1.0416666666666664e-03 2428 3065 -5.2083333333333322e-03 2428 3207 -1.0416666666666664e-02 2428 2433 -4.1666666666666657e-03 2428 3501 -5.2083333333333330e-03 2428 3509 5.2083333333333339e-03 2428 3201 -1.4583333333333330e-02 2428 2439 -6.2499999999999986e-03 2428 3058 2.1684043449710089e-19 2428 2423 6.2500000000000003e-03 2428 3063 1.0416666666666669e-03 2428 3206 -1.0416666666666667e-03 2428 3275 2.1684043449710089e-19 2428 3205 -1.0416666666666673e-03 2428 2431 8.1315162936412833e-20 2428 2430 6.2499999999999995e-03 2428 3211 -2.1684043449710089e-19 2428 3204 -6.5052130349130266e-19 2428 3203 -1.0416666666666671e-03 2428 2424 2.1684043449710089e-19 2428 2429 6.2499999999999986e-03 2429 2429 2.4999999999999994e-02 2429 2424 4.3368086899420177e-19 2429 3211 -1.0842021724855044e-19 2429 3158 -1.0416666666666669e-03 2429 2432 -9.4867690092481638e-20 2429 3201 -5.2083333333333330e-03 2429 3154 -1.0416666666666664e-03 2429 3509 1.0416666666666666e-02 2429 2439 -4.1666666666666657e-03 2429 3204 -2.1684043449710089e-19 2429 3203 1.0416666666666669e-03 2429 2428 6.2499999999999986e-03 2429 1008 1.3552527156068805e-19 2429 1009 1.3552527156068805e-19 2429 1007 1.0416666666666662e-03 2429 489 -1.0416666666666662e-03 2430 2430 3.7499999999999992e-02 2430 3234 1.0416666666666667e-03 2430 3148 -5.2083333333333330e-03 2430 3230 1.0416666666666664e-02 2430 2440 -4.1666666666666657e-03 2430 3154 -1.0416666666666667e-03 2430 3201 -5.2083333333333322e-03 2430 3501 -1.0416666666666664e-02 2430 2439 -4.1666666666666657e-03 2430 3149 -2.1684043449710089e-19 2430 3153 1.0416666666666671e-03 2430 3152 1.0416666666666671e-03 2430 2432 2.1684043449710089e-19 2430 2417 6.2499999999999995e-03 2430 3206 -2.1684043449710089e-19 2430 3275 1.0416666666666667e-03 2430 3205 1.0416666666666673e-03 2430 2431 6.5052130349130266e-19 2430 2428 6.2499999999999995e-03 2431 2431 5.4166666666666655e-02 2431 3207 1.0416666666666667e-03 2431 3230 -1.0416666666666664e-03 2431 3234 6.2499999999999986e-03 2431 3227 -1.0416666666666667e-03 2431 2440 4.1666666666666657e-03 2431 3276 -9.3749999999999997e-03 2431 3267 2.1705219273391446e-19 2431 2438 4.6263880787845817e-19 2431 3265 9.3749999999999997e-03 2431 3259 6.2500000000000003e-03 2431 3253 -1.0416666666666667e-03 2431 2426 1.5502688168223823e-19 2431 2433 4.1666666666666666e-03 2431 3206 9.3749999999999997e-03 2431 3275 -9.3750000000000014e-03 2431 3205 -5.0116116045879435e-20 2431 2428 1.5502688168223823e-19 2431 2430 4.6263880787845817e-19 2432 2432 4.7916666666666656e-02 2432 3157 6.2499999999999986e-03 2432 2437 2.6745065309554533e-19 2432 3158 7.2916666666666659e-03 2432 2429 -1.5124832064409600e-19 2432 3501 1.0416666666666664e-03 2432 3153 -9.3750000000000014e-03 2432 3152 5.0116116045879435e-20 2432 2430 1.0116749763768550e-19 2432 3154 -6.2499999999999995e-03 2432 3509 -1.0416666666666667e-03 2432 2439 4.1666666666666657e-03 2432 3162 -2.0833333333333329e-03 2432 3156 1.0416666666666664e-03 2432 2419 5.2083333333333330e-03 2432 3145 2.0833333333333333e-03 2432 3149 8.3333333333333332e-03 2432 2417 4.3812779196728685e-19 2432 1006 2.0833333333333333e-03 2432 1009 -1.0416666666666664e-03 2432 1007 2.0833333333333329e-03 2432 489 5.2083333333333330e-03 2433 2433 2.0833333333333329e-02 2433 3206 2.0833333333333329e-03 2433 3063 -2.8940292364521927e-21 2433 3207 4.1666666666666675e-03 2433 2428 -4.1666666666666657e-03 2433 3060 8.8938459461701536e-21 2433 2423 -6.2499999999999986e-03 2433 3065 4.1666666666666666e-03 2433 3265 2.0833333333333329e-03 2433 3259 2.0833333333333329e-03 2433 3253 -4.1666666666666666e-03 2433 2431 4.1666666666666657e-03 2433 2426 -4.1666666666666657e-03 2434 2434 1.2499999999999997e-02 2434 3433 -1.3552527156068805e-19 2434 3430 -1.3552527156068805e-19 2434 3432 -1.0416666666666664e-03 2434 2422 -1.0416666666666664e-03 2434 3159 -1.3552527156068805e-19 2434 2418 2.1684043449710089e-19 2434 3426 4.3368086899420177e-19 2434 3161 1.3552527156068805e-19 2434 3160 -1.0416666666666664e-03 2434 3441 -2.1684043449710089e-19 2434 2419 -1.0416666666666664e-03 2434 2435 4.3368086899420177e-19 2435 2435 4.1666666666666657e-02 2435 3447 6.2499999999999986e-03 2435 2437 4.1202858928001372e-19 2435 3076 1.0416666666666660e-03 2435 2425 5.2083333333333330e-03 2435 3162 -2.0833333333333333e-03 2435 3075 -2.0833333333333333e-03 2435 3434 -2.0833333333333329e-03 2435 3445 -6.2499999999999986e-03 2435 2436 4.1202858928001372e-19 2435 3433 -1.0416666666666660e-03 2435 2422 5.2083333333333330e-03 2435 3432 -2.0833333333333333e-03 2435 3161 -1.0416666666666660e-03 2435 3160 -2.0833333333333329e-03 2435 3441 6.2499999999999995e-03 2435 2419 5.2083333333333330e-03 2435 2434 4.1202858928001372e-19 2435 1006 2.0833333333333329e-03 2435 1010 -1.0416666666666660e-03 2435 489 5.2083333333333330e-03 2435 984 2.0833333333333333e-03 2435 983 2.0833333333333329e-03 2435 982 6.2499999999999995e-03 2435 490 4.1202858928001372e-19 2436 2436 1.2499999999999997e-02 2436 3076 1.3552527156068805e-19 2436 3073 -1.3552527156068805e-19 2436 3075 -1.0416666666666662e-03 2436 2425 -1.0416666666666662e-03 2436 3070 1.3552527156068805e-19 2436 2421 2.1684043449710089e-19 2436 3067 4.3368086899420177e-19 2436 3433 1.3552527156068805e-19 2436 3434 -1.0416666666666664e-03 2436 3445 2.1684043449710089e-19 2436 2422 -1.0416666666666664e-03 2436 2435 4.3368086899420177e-19 2437 2437 1.2499999999999997e-02 2437 2432 2.1684043449710089e-19 2437 3447 -2.1684043449710089e-19 2437 3161 -1.3552527156068805e-19 2437 2435 4.3368086899420177e-19 2437 3156 -1.3552527156068805e-19 2437 3162 -1.0416666666666662e-03 2437 3157 -4.3368086899420177e-19 2437 2419 -1.0416666666666662e-03 2437 1009 -1.3552527156068805e-19 2437 1010 1.3552527156068805e-19 2437 1006 1.0416666666666664e-03 2437 489 -1.0416666666666664e-03 2438 2438 3.7499999999999992e-02 2438 3148 -5.2083333333333322e-03 2438 3234 1.0416666666666664e-03 2438 3227 1.0416666666666666e-02 2438 2440 -4.1666666666666657e-03 2438 3265 2.1684043449710089e-19 2438 2431 6.5052130349130266e-19 2438 3276 1.0416666666666669e-03 2438 3144 2.1684043449710089e-19 2438 2417 6.2499999999999986e-03 2438 3146 1.0416666666666662e-03 2438 3268 -5.2083333333333322e-03 2438 2426 6.2499999999999986e-03 2438 3267 1.0416666666666662e-03 2438 3428 -1.0416666666666664e-03 2438 3431 1.0416666666666673e-03 2438 3485 -1.0416666666666666e-02 2438 2418 2.1684043449710089e-19 2438 2427 -4.1666666666666657e-03 2439 2439 2.0833333333333329e-02 2439 3153 -2.0833333333333333e-03 2439 3205 2.8940292364521927e-21 2439 3501 4.1666666666666675e-03 2439 2430 -4.1666666666666657e-03 2439 3203 4.5316262678105068e-20 2439 2428 -6.2499999999999986e-03 2439 3201 4.1666666666666675e-03 2439 3158 2.0833333333333329e-03 2439 2432 4.1666666666666657e-03 2439 2429 -4.1666666666666657e-03 2439 3154 -2.0833333333333329e-03 2439 3509 -4.1666666666666657e-03 2440 2440 2.0833333333333329e-02 2440 3275 -2.0833333333333329e-03 2440 3152 -2.8940292364521927e-21 2440 3230 -4.1666666666666675e-03 2440 2430 -4.1666666666666657e-03 2440 3148 4.1666666666666675e-03 2440 2417 -6.2499999999999986e-03 2440 3146 2.1705219273391446e-19 2440 3234 2.0833333333333329e-03 2440 3276 -2.0833333333333329e-03 2440 3227 -4.1666666666666675e-03 2440 2431 4.1666666666666657e-03 2440 2438 -4.1666666666666657e-03 2441 2441 1.2499999999999997e-02 2441 3102 1.3552527156068805e-19 2441 3072 1.3552527156068805e-19 2441 3078 1.3552527156068805e-19 2441 3077 -1.0416666666666664e-03 2441 3097 2.1684043449710089e-19 2441 2445 -1.0416666666666664e-03 2441 2444 4.3368086899420177e-19 2441 3068 -1.3552527156068805e-19 2441 3109 -1.0416666666666662e-03 2441 3067 4.3368086899420177e-19 2441 2443 -1.0416666666666662e-03 2441 2442 2.1684043449710089e-19 2442 2442 4.1666666666666664e-02 2442 3060 5.0116116045879435e-20 2442 3071 -1.0416666666666668e-02 2442 2460 -8.8991399020904929e-20 2442 3269 2.1705219273391446e-19 2442 3077 -2.0833333333333333e-03 2442 3111 -2.0833333333333333e-03 2442 3069 -8.3333333333333332e-03 2442 2458 6.8816133008491563e-19 2442 3072 1.0416666666666664e-03 2442 3062 2.0833333333333329e-03 2442 3061 8.3333333333333350e-03 2442 2445 5.2083333333333330e-03 2442 2454 -2.1112296210313436e-19 2442 3068 1.0416666666666664e-03 2442 3109 -2.0833333333333329e-03 2442 3067 -6.2499999999999986e-03 2442 2443 5.2083333333333330e-03 2442 2441 2.6745065309554533e-19 2443 2443 4.9999999999999996e-02 2443 3097 -2.0833333333333329e-03 2443 3069 -2.0833333333333329e-03 2443 3111 -1.0416666666666664e-02 2443 3114 -2.0833333333333329e-03 2443 2458 -1.0416666666666662e-03 2443 3110 -4.1666666666666657e-03 2443 2457 5.2083333333333322e-03 2443 3090 2.0833333333333329e-03 2443 3102 4.1666666666666657e-03 2443 3094 1.0416666666666664e-02 2443 3093 2.0833333333333329e-03 2443 2444 5.2083333333333322e-03 2443 2456 -1.0416666666666664e-03 2443 3068 4.1666666666666657e-03 2443 3109 -1.0416666666666664e-02 2443 3067 -2.0833333333333329e-03 2443 2442 5.2083333333333322e-03 2443 2441 -1.0416666666666662e-03 2444 2444 2.0833333666666662e-02 2444 3095 -1.0416666666666666e-11 2444 3474 -1.0416666666666666e-11 2444 3104 -6.2499999999999991e-11 2444 3698 -1.0416666666666666e-11 2444 2453 4.1666666666666665e-11 2444 3109 -2.0833333333333333e-03 2444 3080 -2.0833333333333333e-03 2444 3098 -3.1250000416666668e-03 2444 2459 4.0414059486404474e-19 2444 3102 1.0416666666666660e-03 2444 3094 2.0833333333333329e-03 2444 3093 3.1250000416666660e-03 2444 2443 5.2083333333333330e-03 2444 2456 7.8879953661519409e-21 2444 3101 -8.3333333333333330e-11 2444 3100 -6.2499999999999991e-11 2444 3701 -1.0416666666666666e-11 2444 2452 9.5018296033870872e-28 2444 2451 4.1666666666666665e-11 2444 3078 -1.0416666666666660e-03 2444 3077 -2.0833333333333329e-03 2444 3097 -6.2499999999999986e-03 2444 2445 5.2083333333333330e-03 2444 2441 4.1202858928001372e-19 2445 2445 4.9999999999999989e-02 2445 3098 -2.0833333333333329e-03 2445 3080 -1.0416666666666664e-02 2445 3085 -2.0833333333333329e-03 2445 2459 -1.0416666666666664e-03 2445 3067 -2.0833333333333329e-03 2445 3079 -4.1666666666666657e-03 2445 2455 5.2083333333333322e-03 2445 3056 2.0833333333333329e-03 2445 3072 4.1666666666666657e-03 2445 3062 1.0416666666666664e-02 2445 3061 2.0833333333333329e-03 2445 2442 5.2083333333333322e-03 2445 2454 -1.0416666666666662e-03 2445 3078 -4.1666666666666657e-03 2445 3077 -1.0416666666666664e-02 2445 3097 -2.0833333333333329e-03 2445 2444 5.2083333333333322e-03 2445 2441 -1.0416666666666664e-03 2446 2446 2.4999999999999994e-02 2446 3113 -2.0833333333333329e-03 2446 3490 2.0833333333333329e-03 2446 3491 4.1666666666666666e-03 2446 2461 -2.0833333333333333e-03 2446 3494 -2.0833333333333329e-03 2446 2450 4.1666666666666657e-03 2446 3495 -2.0833333333333329e-03 2446 3660 2.0833333333333329e-03 2446 3116 2.0833333333333329e-03 2446 3112 -2.0833333333333329e-03 2446 3635 -4.1666666666666666e-03 2446 2457 4.1666666666666657e-03 2446 2464 -2.0833333333333333e-03 2446 3655 2.0833333333333329e-03 2446 3632 2.0833333333333329e-03 2446 3631 -4.1666666666666666e-03 2446 2448 4.1666666666666657e-03 2446 2447 -2.0833333333333333e-03 2447 2447 2.4999999999999998e-02 2447 3495 -1.0416666666666662e-03 2447 3627 1.0416666666666664e-03 2447 3494 2.0833333333333337e-03 2447 3493 -1.0416666666666664e-03 2447 3624 6.2500000000000003e-03 2447 2450 8.1315162936412833e-20 2447 2449 -2.0833333333333329e-03 2447 3655 -2.0833333333333337e-03 2447 3632 1.0416666666666664e-03 2447 3631 6.2500000000000003e-03 2447 2448 1.3552527156068805e-20 2447 2446 -2.0833333333333329e-03 2448 2448 3.3333333666666659e-02 2448 3660 4.1666667083333324e-03 2448 2464 -1.4558380320789774e-20 2448 3658 8.3333333333333330e-11 2448 2452 -3.0991386737738975e-27 2448 3701 -1.0416666666666666e-11 2448 2451 4.1666666666666665e-11 2448 3661 -1.0416666666666666e-11 2448 3635 -1.0416666666666667e-03 2448 3659 -4.1666667083333333e-03 2448 3623 -1.0416666666666667e-03 2448 2463 -7.4433021799253829e-20 2448 3627 6.2500000000000003e-03 2448 3624 -1.0416666666666667e-03 2448 2449 4.1666666666666666e-03 2448 3657 -6.2499999999999991e-11 2448 3698 -1.0416666666666666e-11 2448 2453 4.1666666666666665e-11 2448 3655 8.3333333333333315e-03 2448 3632 6.2500000000000003e-03 2448 3631 -1.0416666666666667e-03 2448 2447 -8.8991399020904929e-20 2448 2446 4.1666666666666666e-03 2448 4763 -1.0416666666666666e-11 2448 4768 6.2499999999999991e-11 2449 2449 2.4999999999999994e-02 2449 3279 2.0833333333333329e-03 2449 3087 -2.0833333333333329e-03 2449 3277 4.1666666666666666e-03 2449 2462 -2.0833333333333333e-03 2449 3083 -2.0833333333333329e-03 2449 2455 4.1666666666666657e-03 2449 3082 -2.0833333333333329e-03 2449 3659 -2.0833333333333329e-03 2449 3623 -4.1666666666666666e-03 2449 2463 -2.0833333333333333e-03 2449 3655 2.0833333333333329e-03 2449 2448 4.1666666666666657e-03 2449 3627 2.0833333333333329e-03 2449 3494 -2.0833333333333329e-03 2449 3493 -2.0833333333333329e-03 2449 3624 -4.1666666666666666e-03 2449 2450 4.1666666666666657e-03 2449 2447 -2.0833333333333333e-03 2450 2450 5.4166666666666655e-02 2450 3277 1.0416666666666667e-03 2450 3491 1.0416666666666667e-03 2450 3495 -6.2500000000000003e-03 2450 3631 -1.0416666666666667e-03 2450 2446 4.1666666666666666e-03 2450 3279 9.3749999999999979e-03 2450 3262 2.1705219273391446e-19 2450 2462 4.7726997855329612e-19 2450 3264 1.0416666666666668e-02 2450 3490 9.3750000000000014e-03 2450 3263 5.0116116045879435e-20 2450 2460 1.5502688168223823e-19 2450 2461 1.4039571100740028e-19 2450 3494 -8.3333333333333315e-03 2450 3493 -6.2500000000000003e-03 2450 3624 -1.0416666666666667e-03 2450 2447 1.5502688168223823e-19 2450 2449 4.1666666666666666e-03 2451 2451 2.4999999999999996e-10 2451 3116 2.0833333333333332e-11 2451 2457 4.1666666666666665e-11 2451 3117 2.0833333333333326e-11 2451 3660 2.0833333333333332e-11 2451 2464 -2.0833333333333326e-11 2451 3658 2.0833333333333332e-11 2451 2448 4.1666666666666665e-11 2451 2452 -2.0833333333333326e-11 2451 3701 -4.1666666666666665e-11 2451 3093 2.0833333333333329e-11 2451 3090 2.0833333333333332e-11 2451 3095 -4.1666666666666665e-11 2451 2456 -2.0833333333333326e-11 2451 3101 -2.0833333333333332e-11 2451 3100 -2.0833333333333326e-11 2451 2444 4.1666666666666665e-11 2451 4763 -4.1666666666666665e-11 2451 4768 2.0833333333333326e-11 2452 2452 2.4999999999999996e-10 2452 3658 -2.0833333333333339e-11 2452 2448 -2.6253290925755273e-27 2452 3701 6.2499999999999991e-11 2452 2451 -2.0833333333333326e-11 2452 3104 -1.0416666666666665e-11 2452 3657 -1.0416666666666666e-11 2452 3698 6.2500000000000004e-11 2452 2453 -2.0833333333333326e-11 2452 3101 2.0833333333333339e-11 2452 3100 -1.0416666666666665e-11 2452 2444 1.6155871338926322e-27 2452 4768 1.0416666666666666e-11 2453 2453 2.5000000000000002e-10 2453 3659 -2.0833333333333332e-11 2453 3083 -2.0833333333333332e-11 2453 3661 -4.1666666666666665e-11 2453 2463 -2.0833333333333326e-11 2453 3085 -2.0833333333333329e-11 2453 2455 4.1666666666666665e-11 2453 3084 -2.0833333333333326e-11 2453 3098 -2.0833333333333332e-11 2453 3474 -4.1666666666666665e-11 2453 2459 -2.0833333333333326e-11 2453 3101 -2.0833333333333329e-11 2453 2444 4.1666666666666665e-11 2453 3104 -2.0833333333333326e-11 2453 3658 2.0833333333333332e-11 2453 3657 -2.0833333333333326e-11 2453 3698 -4.1666666666666665e-11 2453 2448 4.1666666666666665e-11 2453 2452 -2.0833333333333326e-11 2454 2454 1.6666666666666663e-02 2454 3071 2.1684043449710089e-19 2454 3086 -1.6263032587282567e-19 2454 2460 1.0416666666666671e-03 2454 3060 -1.0416666666666667e-03 2454 3079 -1.3552527156068805e-19 2454 2455 -1.0416666666666658e-03 2454 3056 1.0416666666666669e-03 2454 3072 -1.3552527156068805e-19 2454 3062 1.0416666666666662e-03 2454 3061 -1.0842021724855044e-18 2454 2445 -1.0416666666666662e-03 2454 2442 -1.0842021724855044e-19 2455 2455 5.6250000166666654e-02 2455 3661 -1.0416666666666666e-11 2455 3084 -6.2499999999999991e-11 2455 3474 -1.0416666666666666e-11 2455 2453 4.1666666666666665e-11 2455 3277 1.0416666666666667e-03 2455 3083 -4.1666667083333324e-03 2455 2463 8.4829026083874785e-20 2455 3082 -6.2500000000000003e-03 2455 3623 -1.0416666666666667e-03 2455 2449 4.1666666666666666e-03 2455 3060 5.2083333333333330e-03 2455 3086 -4.1666666666666666e-03 2455 3087 -1.3541666666666667e-02 2455 3262 -5.2083333333333330e-03 2455 2460 1.4583333333333330e-02 2455 2462 -1.0416666666666667e-03 2455 3080 -2.0833333333333329e-03 2455 3085 -3.1250000416666668e-03 2455 2459 -1.3668994342244490e-19 2455 3079 -1.0416666666666664e-03 2455 2445 5.2083333333333330e-03 2455 3062 2.0833333333333333e-03 2455 3056 1.2500000000000001e-02 2455 2454 -1.0416666666666658e-03 2456 2456 6.2500001249999985e-03 2456 3100 -1.0416666666666665e-11 2456 3117 1.0416666666666666e-11 2456 3095 6.2499999999999991e-11 2456 2451 -2.0833333333333326e-11 2456 3110 -1.3552527156068805e-19 2456 2457 3.2526065013006420e-19 2456 3090 -1.0416666666666673e-11 2456 3102 -1.3552527156068805e-19 2456 3094 1.0416666666666664e-03 2456 3093 -1.0416666991927315e-11 2456 2443 -1.0416666666666664e-03 2456 2444 1.6155871338926322e-27 2457 2457 5.6250000166666654e-02 2457 3116 4.1666667083333333e-03 2457 2464 7.0197856548546410e-20 2457 3117 6.2499999999999991e-11 2457 2451 4.1666666666666665e-11 2457 3095 -1.0416666666666666e-11 2457 3491 1.0416666666666667e-03 2457 3112 -6.2500000000000003e-03 2457 3635 -1.0416666666666667e-03 2457 2446 4.1666666666666666e-03 2457 3113 -1.3541666666666664e-02 2457 3263 -5.2083333333333330e-03 2457 2461 -1.0416666666666662e-03 2457 3115 -4.1666666666666666e-03 2457 3269 -5.2083333333333330e-03 2457 2460 1.4583333333333330e-02 2457 3111 -2.0833333333333329e-03 2457 3114 -1.2499999999999997e-02 2457 2458 -1.0416666666666669e-03 2457 3110 -1.0416666666666664e-03 2457 2443 5.2083333333333330e-03 2457 3094 2.0833333333333333e-03 2457 3090 3.1250000416666664e-03 2457 2456 4.0414059341885156e-19 2457 4763 -1.0416666666666666e-11 2458 2458 1.6666666666666663e-02 2458 3115 2.1684043449710089e-19 2458 3071 -2.1684043449710089e-19 2458 2460 1.0416666666666667e-03 2458 3269 1.0416666666666671e-03 2458 3068 1.0842021724855044e-19 2458 2442 7.5894152073985310e-19 2458 3110 1.0842021724855044e-19 2458 3111 -1.0416666666666662e-03 2458 3114 -1.0416666666666656e-03 2458 2443 -1.0416666666666662e-03 2458 2457 -1.0416666666666667e-03 2459 2459 6.2500001249999985e-03 2459 3084 -1.0416666666666666e-11 2459 3104 -1.0416666666666665e-11 2459 3474 6.2499999999999991e-11 2459 2453 -2.0833333333333326e-11 2459 3078 -1.3552527156068805e-19 2459 2444 4.3368086899420177e-19 2459 3098 1.0416666558246452e-11 2459 3079 1.3552527156068805e-19 2459 3080 -1.0416666666666664e-03 2459 3085 1.0416667100347535e-11 2459 2445 -1.0416666666666664e-03 2459 2455 -1.0842021825829240e-19 2460 2460 4.9999999999999989e-02 2460 3061 -2.1684043449710089e-19 2460 3056 5.2083333333333330e-03 2460 3060 6.2499999999999986e-03 2460 2454 1.0416666666666673e-03 2460 3086 -6.2499999999999986e-03 2460 3087 -5.2083333333333322e-03 2460 2455 1.4583333333333332e-02 2460 3279 -4.9904357809065860e-20 2460 3262 -6.2499999999999986e-03 2460 2462 1.0416666666666664e-03 2460 3264 -2.3039296165316969e-19 2460 3490 -2.1684043449710089e-19 2460 2450 8.1315162936412833e-20 2460 3113 -5.2083333333333330e-03 2460 3263 -6.2499999999999986e-03 2460 2461 1.0416666666666673e-03 2460 3115 -6.2499999999999986e-03 2460 3114 -5.2083333333333322e-03 2460 2457 1.4583333333333332e-02 2460 3071 7.3183646642771549e-19 2460 2442 1.3552527156068805e-20 2460 3069 -3.2249014814734037e-20 2460 3269 -6.2499999999999986e-03 2460 2458 1.0416666666666664e-03 2461 2461 2.2916666666666662e-02 2461 3112 -1.0416666666666664e-03 2461 3495 -1.0416666666666664e-03 2461 3491 -6.2500000000000003e-03 2461 2446 -2.0833333333333329e-03 2461 3264 -2.1684043449710089e-19 2461 3490 -1.0416666666666671e-03 2461 3115 -2.1684043449710089e-19 2461 2457 -1.0416666666666662e-03 2461 2460 1.0416666666666671e-03 2461 3263 1.0416666666666667e-03 2462 2462 2.2916666666666662e-02 2462 3493 -1.0416666666666664e-03 2462 3082 -1.0416666666666664e-03 2462 3277 -6.2500000000000003e-03 2462 2449 -2.0833333333333329e-03 2462 3086 1.6263032587282567e-19 2462 3087 1.5178830414797062e-18 2462 2455 -1.0416666666666669e-03 2462 3264 2.1684043449710089e-19 2462 2450 7.3183646642771549e-19 2462 2460 1.0416666666666667e-03 2462 3279 -1.0416666666666664e-03 2462 3262 1.0416666666666671e-03 2463 2463 1.2500000125000001e-02 2463 3657 -1.0416666666666665e-11 2463 3084 -1.0416666666666663e-11 2463 3661 6.2500000000000004e-11 2463 2453 -2.0833333333333326e-11 2463 3083 1.0416666770833331e-03 2463 2455 8.1315162936412833e-20 2463 3082 -1.0416666666666664e-03 2463 3659 1.0416666770833340e-03 2463 3627 1.0416666666666664e-03 2463 3623 6.2500000000000003e-03 2463 2448 -1.0097419586828951e-27 2463 2449 -2.0833333333333329e-03 2464 2464 1.2500000125000001e-02 2464 3116 -1.0416666770833340e-03 2464 2457 1.6155871338926322e-27 2464 3117 1.0416666666666665e-11 2464 3660 -1.0416666770833331e-03 2464 2448 1.3552525540481672e-20 2464 2451 -2.0833333333333326e-11 2464 3632 1.0416666666666664e-03 2464 3112 -1.0416666666666664e-03 2464 3635 6.2500000000000003e-03 2464 2446 -2.0833333333333329e-03 2464 4768 1.0416666666666663e-11 2464 4763 6.2500000000000004e-11 2465 2465 1.2499999999999997e-02 2465 3075 1.3552527156068805e-19 2465 3077 -1.3552527156068805e-19 2465 2471 2.1684043449710089e-19 2465 3067 -4.3368086899420177e-19 2465 3062 -1.3552527156068805e-19 2465 3072 1.0416666666666664e-03 2465 2468 -1.0416666666666664e-03 2465 3059 1.3552527156068805e-19 2465 2467 -1.0416666666666664e-03 2465 2466 4.3368086899420177e-19 2465 3073 1.0416666666666664e-03 2465 3061 2.1684043449710089e-19 2466 2466 4.1666666666666657e-02 2466 3074 2.0833333333333329e-03 2466 3212 2.0833333333333333e-03 2466 3058 -6.2499999999999986e-03 2466 2480 4.1202858928001372e-19 2466 3066 1.0416666666666660e-03 2466 3215 2.0833333333333329e-03 2466 2479 5.2083333333333330e-03 2466 3089 2.0833333333333333e-03 2466 3064 -6.2499999999999995e-03 2466 2478 4.1202858928001372e-19 2466 3057 1.0416666666666660e-03 2466 3081 2.0833333333333329e-03 2466 2470 5.2083333333333330e-03 2466 3079 -2.0833333333333333e-03 2466 3056 -6.2499999999999986e-03 2466 2469 4.1202858928001372e-19 2466 3062 1.0416666666666660e-03 2466 3072 2.0833333333333329e-03 2466 2468 5.2083333333333330e-03 2466 3059 1.0416666666666660e-03 2466 2467 5.2083333333333330e-03 2466 3073 2.0833333333333333e-03 2466 3061 -6.2499999999999995e-03 2466 2465 4.1202858928001372e-19 2467 2467 4.9999999999999989e-02 2467 3074 1.0416666666666664e-02 2467 2480 -1.0416666666666664e-03 2467 3076 1.0416666666666664e-02 2467 2472 -1.0416666666666662e-03 2467 3058 -2.0833333333333329e-03 2467 3445 2.0833333333333329e-03 2467 3075 -4.1666666666666657e-03 2467 3067 2.0833333333333329e-03 2467 2471 5.2083333333333322e-03 2467 3059 4.1666666666666657e-03 2467 2466 5.2083333333333322e-03 2467 3073 1.0416666666666664e-02 2467 3061 -2.0833333333333329e-03 2467 2465 -1.0416666666666664e-03 2467 981 -2.0833333333333329e-03 2467 983 4.1666666666666657e-03 2467 982 -2.0833333333333329e-03 2467 484 5.2083333333333322e-03 2468 2468 4.9999999999999989e-02 2468 3098 2.0833333333333329e-03 2468 3080 -4.1666666666666657e-03 2468 3085 2.0833333333333329e-03 2468 2477 5.2083333333333322e-03 2468 3078 -1.0416666666666664e-02 2468 3097 2.0833333333333329e-03 2468 2476 -1.0416666666666662e-03 2468 3077 -4.1666666666666657e-03 2468 2471 5.2083333333333322e-03 2468 3067 2.0833333333333329e-03 2468 3079 -1.0416666666666664e-02 2468 3056 -2.0833333333333329e-03 2468 2469 -1.0416666666666662e-03 2468 3062 4.1666666666666657e-03 2468 3072 1.0416666666666664e-02 2468 3061 -2.0833333333333329e-03 2468 2466 5.2083333333333322e-03 2468 2465 -1.0416666666666664e-03 2469 2469 1.2499999999999997e-02 2469 3080 1.3552527156068805e-19 2469 3088 1.3552527156068805e-19 2469 2477 2.1684043449710089e-19 2469 3085 -4.3368086899420177e-19 2469 3057 -1.3552527156068805e-19 2469 3081 1.0416666666666664e-03 2469 2470 -1.0416666666666664e-03 2469 3062 1.3552527156068805e-19 2469 2468 -1.0416666666666662e-03 2469 2466 4.3368086899420177e-19 2469 3079 -1.0416666666666662e-03 2469 3056 2.1684043449710089e-19 2470 2470 4.9999999999999989e-02 2470 3089 1.0416666666666664e-02 2470 2478 -1.0416666666666664e-03 2470 3088 4.1666666666666657e-03 2470 2477 5.2083333333333322e-03 2470 3064 -2.0833333333333329e-03 2470 3085 2.0833333333333329e-03 2470 3057 4.1666666666666657e-03 2470 3081 1.0416666666666664e-02 2470 3056 -2.0833333333333329e-03 2470 2466 5.2083333333333322e-03 2470 2469 -1.0416666666666664e-03 2470 946 2.0833333333333329e-03 2470 949 -4.1666666666666657e-03 2470 970 -2.0833333333333329e-03 2470 482 5.2083333333333322e-03 2470 945 1.0416666666666664e-02 2470 939 -2.0833333333333329e-03 2470 479 -1.0416666666666662e-03 2471 2471 4.1666666666666657e-02 2471 3078 -2.0833333333333329e-03 2471 3099 2.0833333333333333e-03 2471 3097 6.2499999999999995e-03 2471 2476 4.1202858928001372e-19 2471 3459 1.0416666666666664e-03 2471 3472 2.0833333333333329e-03 2471 2475 5.2083333333333330e-03 2471 3460 2.0833333333333333e-03 2471 3458 -6.2500000000000003e-03 2471 2474 2.6745065309554533e-19 2471 3457 1.0416666666666664e-03 2471 3446 2.0833333333333329e-03 2471 2473 5.2083333333333330e-03 2471 3076 2.0833333333333333e-03 2471 3445 6.2499999999999995e-03 2471 2472 4.1202858928001372e-19 2471 3075 -1.0416666666666664e-03 2471 3073 2.0833333333333329e-03 2471 2467 5.2083333333333330e-03 2471 3077 -1.0416666666666664e-03 2471 2468 5.2083333333333330e-03 2471 3072 2.0833333333333333e-03 2471 3067 6.2500000000000003e-03 2471 2465 2.6745065309554533e-19 2472 2472 1.2499999999999997e-02 2472 3076 1.0416666666666662e-03 2472 2467 -1.0416666666666662e-03 2472 2473 -1.0416666666666662e-03 2472 3446 1.0416666666666662e-03 2472 3457 -1.0842021724855044e-19 2472 3075 -1.3552527156068805e-19 2472 2471 4.3368086899420177e-19 2472 3445 -4.3368086899420177e-19 2472 983 -1.3552527156068805e-19 2472 953 -1.0842021724855044e-19 2472 484 4.3368086899420177e-19 2472 982 4.3368086899420177e-19 2473 2473 4.9999999999999989e-02 2473 3446 1.0416666666666664e-02 2473 2472 -1.0416666666666662e-03 2473 3460 1.0416666666666664e-02 2473 2474 -1.0416666666666664e-03 2473 3458 -2.0833333333333329e-03 2473 3457 4.1666666666666657e-03 2473 3445 2.0833333333333329e-03 2473 2471 5.2083333333333322e-03 2473 982 -2.0833333333333329e-03 2473 951 -2.0833333333333329e-03 2473 953 -4.1666666666666657e-03 2473 954 -1.0416666666666664e-02 2473 961 2.0833333333333329e-03 2473 484 5.2083333333333322e-03 2473 485 -1.0416666666666662e-03 2473 950 4.1666666666666657e-03 2473 938 2.0833333333333329e-03 2473 480 5.2083333333333322e-03 2474 2474 1.2499999999999997e-02 2474 3460 1.0416666666666664e-03 2474 2473 -1.0416666666666664e-03 2474 2475 -1.0416666666666664e-03 2474 3472 1.0416666666666664e-03 2474 3459 -1.3552527156068805e-19 2474 3457 1.3552527156068805e-19 2474 2471 2.1684043449710089e-19 2474 3458 4.3368086899420177e-19 2474 950 -1.3552527156068805e-19 2474 941 -1.3552527156068805e-19 2474 480 4.3368086899420177e-19 2474 938 -2.1684043449710089e-19 2475 2475 4.9999999999999989e-02 2475 3472 1.0416666666666664e-02 2475 2474 -1.0416666666666664e-03 2475 3473 4.1666666666666657e-03 2475 2477 5.2083333333333322e-03 2475 3098 2.0833333333333329e-03 2475 3099 1.0416666666666664e-02 2475 3097 2.0833333333333329e-03 2475 2476 -1.0416666666666662e-03 2475 3459 4.1666666666666657e-03 2475 3458 -2.0833333333333329e-03 2475 2471 5.2083333333333322e-03 2475 938 2.0833333333333329e-03 2475 941 -4.1666666666666657e-03 2475 819 2.0833333333333329e-03 2475 480 5.2083333333333322e-03 2475 823 1.0416666666666664e-02 2475 821 2.0833333333333329e-03 2475 477 -1.0416666666666664e-03 2476 2476 1.2499999999999997e-02 2476 3473 -1.3552527156068805e-19 2476 3080 -1.0842021724855044e-19 2476 2477 4.3368086899420177e-19 2476 3098 -4.3368086899420177e-19 2476 3077 1.0842021724855044e-19 2476 3078 -1.0416666666666662e-03 2476 2468 -1.0416666666666662e-03 2476 3459 1.3552527156068805e-19 2476 2475 -1.0416666666666662e-03 2476 2471 4.3368086899420177e-19 2476 3099 1.0416666666666662e-03 2476 3097 -4.3368086899420177e-19 2477 2477 4.1666666666666664e-02 2477 3088 1.0416666666666664e-03 2477 2470 5.2083333333333330e-03 2477 3473 1.0416666666666664e-03 2477 2475 5.2083333333333330e-03 2477 3099 2.0833333333333329e-03 2477 3078 -2.0833333333333333e-03 2477 3098 6.2500000000000003e-03 2477 2476 3.7587087034409578e-19 2477 3080 -1.0416666666666664e-03 2477 3079 -2.0833333333333329e-03 2477 2468 5.2083333333333330e-03 2477 3081 2.0833333333333333e-03 2477 3085 6.2499999999999986e-03 2477 2469 2.6745065309554533e-19 2477 945 2.0833333333333329e-03 2477 943 -2.0833333333333333e-03 2477 939 -6.2500000000000003e-03 2477 479 3.7587087034409578e-19 2477 940 1.0416666666666664e-03 2477 822 2.0833333333333329e-03 2477 478 5.2083333333333330e-03 2477 823 2.0833333333333333e-03 2477 821 6.2499999999999986e-03 2477 477 2.6745065309554533e-19 2478 2478 1.2499999999999997e-02 2478 3089 1.0416666666666664e-03 2478 2470 -1.0416666666666664e-03 2478 2479 -1.0416666666666664e-03 2478 3215 1.0416666666666664e-03 2478 3066 -1.3552527156068805e-19 2478 3057 1.3552527156068805e-19 2478 2466 4.3368086899420177e-19 2478 3064 2.1684043449710089e-19 2478 949 1.3552527156068805e-19 2478 973 1.3552527156068805e-19 2478 482 2.1684043449710089e-19 2478 970 4.3368086899420177e-19 2479 2479 4.9999999999999989e-02 2479 3212 1.0416666666666664e-02 2479 2480 -1.0416666666666662e-03 2479 3215 1.0416666666666664e-02 2479 2478 -1.0416666666666664e-03 2479 3058 -2.0833333333333329e-03 2479 3066 4.1666666666666657e-03 2479 3064 -2.0833333333333329e-03 2479 2466 5.2083333333333322e-03 2479 981 -2.0833333333333329e-03 2479 977 -4.1666666666666657e-03 2479 484 5.2083333333333322e-03 2479 713 2.0833333333333329e-03 2479 970 -2.0833333333333329e-03 2479 973 4.1666666666666657e-03 2479 721 1.0416666666666664e-02 2479 717 2.0833333333333329e-03 2479 482 5.2083333333333322e-03 2479 481 -1.0416666666666662e-03 2480 2480 1.2499999999999997e-02 2480 3212 1.0416666666666662e-03 2480 2479 -1.0416666666666662e-03 2480 2467 -1.0416666666666664e-03 2480 3074 1.0416666666666664e-03 2480 3059 -1.3552527156068805e-19 2480 3066 1.3552527156068805e-19 2480 2466 4.3368086899420177e-19 2480 3058 2.1684043449710089e-19 2480 977 1.3552527156068805e-19 2480 983 1.3552527156068805e-19 2480 484 2.1684043449710089e-19 2480 981 4.3368086899420177e-19 2481 2481 6.2500001874999985e-03 2481 3096 1.0416666666666669e-11 2481 3095 1.0416666666666667e-10 2481 2487 6.2499999999999991e-11 2481 2494 -4.1666666666666665e-11 2481 3466 -4.5860624244724788e-28 2481 3100 -1.0416666666666665e-11 2481 3103 1.3552527156068805e-19 2481 2485 4.3368086899420177e-19 2481 3093 -1.0416666558246452e-11 2481 3105 1.3552527156068805e-19 2481 3092 1.0416666666666664e-03 2481 3091 -4.3368087060978891e-19 2481 2483 -1.0416666666666664e-03 2481 2482 -1.0842021825829240e-19 2481 4760 5.2083333333333334e-11 2482 2482 2.0833333541666665e-02 2482 3096 -1.8812360437258079e-27 2482 3405 2.0833333333333329e-03 2482 3106 -2.0833333333333333e-03 2482 3401 6.2499999999999995e-03 2482 2489 4.1202858928001372e-19 2482 3467 1.0416666666666664e-03 2482 2488 5.2083333333333330e-03 2482 3465 2.0833333333333333e-03 2482 3464 3.1250000520833330e-03 2482 3466 -1.0416666666666668e-10 2482 3463 3.6295685768920020e-28 2482 2487 5.6797985175912850e-27 2482 3105 -1.0416666666666664e-03 2482 3092 2.0833333333333329e-03 2482 3091 3.1250000520833335e-03 2482 2483 5.2083333333333330e-03 2482 2481 -1.3668994342244490e-19 2482 111 4.0414059341885156e-19 2483 2483 4.9999999999999989e-02 2483 3458 2.0833333333333329e-03 2483 3108 -1.0416666666666664e-02 2483 3097 -2.0833333333333329e-03 2483 2491 -1.0416666666666664e-03 2483 3401 2.0833333333333329e-03 2483 3107 -4.1666666666666657e-03 2483 3106 -1.0416666666666664e-02 2483 3402 2.0833333333333329e-03 2483 2490 5.2083333333333322e-03 2483 2489 -1.0416666666666662e-03 2483 3103 4.1666666666666657e-03 2483 2485 5.2083333333333322e-03 2483 3093 2.0833333333333329e-03 2483 3105 -4.1666666666666657e-03 2483 3092 1.0416666666666664e-02 2483 3091 2.0833333333333329e-03 2483 2482 5.2083333333333322e-03 2483 2481 -1.0416666666666664e-03 2484 2484 6.2500001249999985e-03 2484 3474 6.2499999999999991e-11 2484 2492 -2.0833333333333326e-11 2484 2486 -1.0416666666666664e-03 2484 3473 1.0416666666666664e-03 2484 3104 -1.0416666666666665e-11 2484 3099 -1.3552527156068805e-19 2484 3098 1.0416666991927315e-11 2484 2485 1.6155871338926322e-27 2484 820 -1.0416666666666666e-11 2484 823 1.3552527156068805e-19 2484 112 3.2526065013006420e-19 2484 821 1.0416666666666673e-11 2485 2485 2.0833333666666662e-02 2485 3701 -1.0416666666666666e-11 2485 3100 -6.2499999999999991e-11 2485 3095 -1.0416666666666666e-11 2485 2494 4.1666666666666665e-11 2485 3474 -1.0416666666666666e-11 2485 3101 -8.3333333333333330e-11 2485 3104 -6.2499999999999991e-11 2485 3698 -1.0416666666666666e-11 2485 2493 9.5018296033870872e-28 2485 2492 4.1666666666666665e-11 2485 3108 -2.0833333333333329e-03 2485 3459 2.0833333333333333e-03 2485 3097 -6.2499999999999986e-03 2485 2491 4.1202858928001372e-19 2485 3103 1.0416666666666660e-03 2485 2483 5.2083333333333330e-03 2485 3092 2.0833333333333333e-03 2485 3093 3.1250000416666668e-03 2485 2481 4.0414059486404474e-19 2485 3099 1.0416666666666660e-03 2485 3473 2.0833333333333329e-03 2485 3098 -3.1250000416666660e-03 2485 2486 5.2083333333333330e-03 2485 2484 7.8879953661519409e-21 2486 2486 4.9999999999999989e-02 2486 3472 4.1666666666666657e-03 2486 2490 5.2083333333333322e-03 2486 3473 1.0416666666666664e-02 2486 2484 -1.0416666666666664e-03 2486 3097 -2.0833333333333329e-03 2486 3459 1.0416666666666664e-02 2486 3458 2.0833333333333329e-03 2486 2491 -1.0416666666666662e-03 2486 3099 4.1666666666666657e-03 2486 3098 -2.0833333333333329e-03 2486 2485 5.2083333333333322e-03 2486 938 -2.0833333333333329e-03 2486 941 -1.0416666666666664e-02 2486 819 -2.0833333333333329e-03 2486 118 -1.0416666666666662e-03 2486 823 4.1666666666666657e-03 2486 112 5.2083333333333322e-03 2486 821 -2.0833333333333329e-03 2487 2487 5.0000000000000003e-10 2487 3704 1.0416666666666665e-11 2487 3096 -1.0416666666666666e-11 2487 3095 5.2083333333333334e-11 2487 2481 6.2500000000000004e-11 2487 2494 -4.1666666666666665e-11 2487 3091 2.0194839173657902e-27 2487 3464 -2.0194839173657902e-27 2487 3466 1.6155871338926322e-27 2487 3463 -1.0416666666666666e-11 2487 2482 6.4623485355705287e-27 2487 4774 -4.1666666666666671e-11 2487 111 6.2500000000000004e-11 2487 5047 5.2083333333333328e-11 2487 4773 -8.3333333333333343e-11 2487 4772 -1.2499999999999998e-10 2487 5038 3.1250000000000002e-11 2487 4155 -1.0416666666666674e-11 2487 4771 -1.6155871338926322e-27 2487 115 5.2083333333333334e-11 2487 4760 1.0416666666666667e-10 2488 2488 4.9999999999999989e-02 2488 3468 4.1666666666666657e-03 2488 2490 5.2083333333333322e-03 2488 3465 1.0416666666666664e-02 2488 3402 2.0833333333333329e-03 2488 3405 1.0416666666666664e-02 2488 3401 2.0833333333333329e-03 2488 2489 -1.0416666666666662e-03 2488 3467 4.1666666666666657e-03 2488 2482 5.2083333333333322e-03 2488 3464 2.0833333333333329e-03 2488 561 -2.0833333333333329e-03 2488 864 1.0416666666666664e-02 2488 863 2.0833333333333329e-03 2488 117 -1.0416666666666662e-03 2488 563 4.1666666666666657e-03 2488 562 -2.0833333333333329e-03 2488 110 5.2083333333333322e-03 2488 111 -1.0416666666666664e-03 2489 2489 1.2499999999999997e-02 2489 3468 1.0842021724855044e-19 2489 3467 -1.0842021724855044e-19 2489 3405 1.0416666666666662e-03 2489 2488 -1.0416666666666662e-03 2489 3105 -1.3552527156068805e-19 2489 2482 4.3368086899420177e-19 2489 3401 -4.3368086899420177e-19 2489 3107 1.3552527156068805e-19 2489 3106 -1.0416666666666662e-03 2489 3402 -4.3368086899420177e-19 2489 2483 -1.0416666666666662e-03 2489 2490 4.3368086899420177e-19 2490 2490 4.1666666666666664e-02 2490 3472 1.0416666666666664e-03 2490 2486 5.2083333333333330e-03 2490 3468 1.0416666666666664e-03 2490 2488 5.2083333333333330e-03 2490 3108 -2.0833333333333333e-03 2490 3459 2.0833333333333329e-03 2490 3458 6.2499999999999986e-03 2490 2491 2.6745065309554533e-19 2490 3405 2.0833333333333333e-03 2490 3107 -1.0416666666666664e-03 2490 3106 -2.0833333333333329e-03 2490 3402 6.2500000000000003e-03 2490 2483 5.2083333333333330e-03 2490 2489 3.7587087034409578e-19 2490 941 -2.0833333333333333e-03 2490 569 -2.0833333333333329e-03 2490 938 -6.2500000000000003e-03 2490 118 3.7587087034409578e-19 2490 568 -1.0416666666666664e-03 2490 113 5.2083333333333330e-03 2490 567 -2.0833333333333333e-03 2490 864 2.0833333333333329e-03 2490 863 6.2499999999999986e-03 2490 117 2.6745065309554533e-19 2491 2491 1.2499999999999997e-02 2491 3107 -1.3552527156068805e-19 2491 3103 -1.3552527156068805e-19 2491 3108 -1.0416666666666664e-03 2491 2483 -1.0416666666666664e-03 2491 3099 1.3552527156068805e-19 2491 2485 4.3368086899420177e-19 2491 3097 2.1684043449710089e-19 2491 3472 -1.3552527156068805e-19 2491 3459 1.0416666666666662e-03 2491 3458 -4.3368086899420177e-19 2491 2486 -1.0416666666666662e-03 2491 2490 2.1684043449710089e-19 2492 2492 2.4999999999999996e-10 2492 3699 2.0833333333333326e-11 2492 3474 -4.1666666666666665e-11 2492 2484 -2.0833333333333326e-11 2492 3098 -2.0833333333333329e-11 2492 3702 2.0833333333333332e-11 2492 3101 -2.0833333333333332e-11 2492 3104 -2.0833333333333326e-11 2492 3698 -4.1666666666666665e-11 2492 2485 4.1666666666666665e-11 2492 2493 -2.0833333333333326e-11 2492 817 2.0833333333333332e-11 2492 818 2.0833333333333332e-11 2492 816 4.1666666666666665e-11 2492 115 4.1666666666666665e-11 2492 116 -2.0833333333333326e-11 2492 821 -2.0833333333333332e-11 2492 820 -2.0833333333333326e-11 2492 112 4.1666666666666665e-11 2493 2493 2.4999999999999996e-10 2493 3100 -1.0416666666666665e-11 2493 3704 1.0416666666666666e-11 2493 3701 6.2500000000000004e-11 2493 2494 -2.0833333333333326e-11 2493 3702 -2.0833333333333339e-11 2493 3699 1.0416666666666666e-11 2493 3101 2.0833333333333339e-11 2493 3104 -1.0416666666666665e-11 2493 3698 6.2499999999999991e-11 2493 2485 1.6155871338926322e-27 2493 2492 -2.0833333333333326e-11 2493 115 -2.6253290925755273e-27 2494 2494 2.2916666666666665e-10 2494 3704 2.0833333333333326e-11 2494 3096 -2.8940292364521930e-29 2494 3095 -4.1666666666666671e-11 2494 2481 -4.1666666666666665e-11 2494 2487 -4.1666666666666665e-11 2494 3101 -2.0833333333333329e-11 2494 3702 2.0833333333333332e-11 2494 3701 -4.1666666666666665e-11 2494 2493 -2.0833333333333326e-11 2494 3093 2.0833333333333332e-11 2494 3100 -2.0833333333333326e-11 2494 2485 4.1666666666666665e-11 2494 4771 2.0833333333333332e-11 2494 115 4.1666666666666665e-11 2494 4760 -4.1666666666666678e-11 2495 2495 6.2499999999999986e-03 2496 2496 1.0416666666666664e-02 2497 2497 4.9999999999999996e-02 2497 3147 2.0833333333333329e-03 2497 3142 -4.1666666666666657e-03 2497 3141 -1.0416666666666664e-02 2497 3140 -4.1666666666666657e-03 2497 3139 -1.0416666666666664e-02 2497 3143 2.0833333333333329e-03 2497 2498 -1.0416666666666662e-03 2497 3137 4.1666666666666657e-03 2497 3119 1.0416666666666664e-02 2498 2498 4.3749999999999990e-02 2498 3230 -3.1249999999999997e-03 2498 3166 -4.1666666666666666e-03 2498 3152 -1.2499999999999999e-02 2498 2506 -1.0416666666666654e-03 2498 3142 -1.0842021724855044e-19 2498 3148 -2.0833333333333337e-03 2498 3227 -3.1249999999999997e-03 2498 2500 6.2499999999999995e-03 2498 3147 1.0416666666666662e-03 2498 3456 -4.1666666666666657e-03 2498 3146 -1.2499999999999999e-02 2498 2505 -1.0416666666666671e-03 2498 3140 1.0842021724855044e-19 2498 3139 -1.0416666666666662e-03 2498 3143 1.0416666666666660e-03 2498 2497 -1.0416666666666662e-03 2499 2499 3.9583333333333325e-02 2500 2500 4.9999999999999989e-02 2500 3152 -4.1666666666666666e-03 2500 3249 -4.1666666666666666e-03 2500 3231 -4.1666666666666666e-03 2500 3500 4.1666666666666657e-03 2500 3230 -1.6666666666666663e-02 2500 2506 -6.2499999999999986e-03 2500 3148 4.1666666666666675e-03 2500 3146 -4.1666666666666657e-03 2500 3227 -1.6666666666666663e-02 2500 2498 6.2499999999999986e-03 2500 2505 -6.2499999999999986e-03 2500 3226 2.0833333333333329e-03 2500 3225 -4.1666666666666666e-03 2501 2501 2.4999999999999998e-02 2502 2502 1.6666666666666663e-02 2503 2503 6.2499999999999986e-03 2504 2504 3.9583333333333325e-02 2505 2505 1.6666666666666663e-02 2505 3225 1.0416666666666664e-03 2505 3249 -1.0416666666666671e-03 2505 3148 -1.0416666666666667e-03 2505 3227 2.0833333333333337e-03 2505 2500 -6.2499999999999986e-03 2505 3147 1.0416666666666664e-03 2505 3456 -6.2499999999999986e-03 2505 3146 -1.0416666666666654e-03 2505 2498 -1.0416666666666671e-03 2506 2506 1.6666666666666663e-02 2506 3148 -1.0416666666666664e-03 2506 3143 1.0416666666666667e-03 2506 2498 -1.0416666666666656e-03 2506 3152 -1.0416666666666671e-03 2506 3231 1.0416666666666667e-03 2506 3230 2.0833333333333337e-03 2506 2500 -6.2499999999999986e-03 2506 3166 -6.2499999999999986e-03 2506 3500 1.0416666666666654e-03 2507 2507 2.4999999999999994e-02 2508 2508 6.2499999999999986e-03 2509 2509 2.0833333333333329e-02 2510 2510 4.9999999999999989e-02 2510 3484 2.0833333333333329e-03 2510 3132 -1.0416666666666664e-02 2510 3483 2.0833333333333329e-03 2510 2514 -1.0416666666666662e-03 2510 3131 -4.1666666666666657e-03 2510 2513 5.2083333333333322e-03 2510 3482 2.0833333333333329e-03 2510 3130 -1.0416666666666664e-02 2510 3128 2.0833333333333329e-03 2510 2512 -1.0416666666666662e-03 2510 3127 4.1666666666666657e-03 2510 3129 -4.1666666666666657e-03 2510 3121 1.0416666666666664e-02 2511 2511 2.0833333333333329e-02 2512 2512 1.2499999999999997e-02 2512 3128 -4.3368086899420177e-19 2512 3482 -4.3368086899420177e-19 2512 2513 4.3368086899420177e-19 2512 3131 -1.0842021724855044e-19 2512 3127 -1.0842021724855044e-19 2512 3130 -1.0416666666666662e-03 2512 2510 -1.0416666666666662e-03 2512 992 -1.3552527156068805e-19 2512 993 1.3552527156068805e-19 2512 987 1.0416666666666662e-03 2512 280 -1.0416666666666662e-03 2513 2513 4.1666666666666664e-02 2513 3483 6.2499999999999986e-03 2513 2514 2.6745065309554533e-19 2513 3482 6.2500000000000003e-03 2513 2512 3.7587087034409578e-19 2513 3132 -2.0833333333333329e-03 2513 3131 -1.0416666666666664e-03 2513 2510 5.2083333333333330e-03 2513 3130 -2.0833333333333333e-03 2513 690 -2.0833333333333333e-03 2513 965 2.0833333333333329e-03 2513 964 6.2500000000000003e-03 2513 285 3.7587087034409578e-19 2513 994 1.0416666666666664e-03 2513 283 5.2083333333333330e-03 2513 1001 -2.0833333333333333e-03 2513 987 2.0833333333333329e-03 2513 993 -1.0416666666666664e-03 2513 280 5.2083333333333330e-03 2513 897 2.0833333333333333e-03 2513 689 -1.0416666666666664e-03 2513 688 -2.0833333333333329e-03 2513 896 6.2499999999999986e-03 2513 278 5.2083333333333330e-03 2513 284 2.6745065309554533e-19 2514 2514 1.2499999999999997e-02 2514 2513 2.1684043449710089e-19 2514 3484 -2.1684043449710089e-19 2514 3129 -1.3552527156068805e-19 2514 3131 1.3552527156068805e-19 2514 3132 -1.0416666666666662e-03 2514 3483 -4.3368086899420177e-19 2514 2510 -1.0416666666666662e-03 2514 994 1.3552527156068805e-19 2514 1000 -1.3552527156068805e-19 2514 1001 -1.0416666666666664e-03 2514 283 -1.0416666666666664e-03 2515 2515 1.2499999999999997e-02 2515 3128 -4.3368086899420177e-19 2515 3126 1.3552527156068805e-19 2515 3134 1.3552527156068805e-19 2515 3133 -1.0416666666666662e-03 2515 3481 -4.3368086899420177e-19 2515 2517 -1.0416666666666662e-03 2515 661 1.0842021724855044e-19 2515 668 1.0842021724855044e-19 2515 667 -1.0416666666666662e-03 2515 246 -1.0416666666666662e-03 2516 2516 2.0833333333333332e-02 2517 2517 4.9999999999999996e-02 2517 3128 2.0833333333333329e-03 2517 3136 -1.0416666666666664e-02 2517 3135 -4.1666666666666657e-03 2517 3126 4.1666666666666657e-03 2517 3123 1.0416666666666664e-02 2517 3134 -4.1666666666666657e-03 2517 3133 -1.0416666666666664e-02 2517 3481 2.0833333333333329e-03 2517 2515 -1.0416666666666662e-03 2518 2518 6.2499999999999986e-03 2519 2519 2.0833333333333329e-02 2520 2520 1.0416666666666664e-02 2521 2521 6.2499999999999986e-03 2522 2522 1.2499999999999997e-02 2522 3130 1.3552527156068805e-19 2522 3133 -1.3552527156068805e-19 2522 2543 4.3368086899420177e-19 2522 3128 2.1684043449710089e-19 2522 3123 -1.3552527156068805e-19 2522 3126 1.0416666666666662e-03 2522 2525 -1.0416666666666662e-03 2522 3121 1.3552527156068805e-19 2522 2524 -1.0416666666666664e-03 2522 2523 2.1684043449710089e-19 2522 3127 1.0416666666666664e-03 2523 2523 4.1666666666666664e-02 2523 3129 -2.0833333333333329e-03 2523 3164 -2.0833333333333333e-03 2523 2547 3.7587087034409578e-19 2523 3125 1.0416666666666664e-03 2523 3165 -2.0833333333333329e-03 2523 2531 5.2083333333333330e-03 2523 3140 -2.0833333333333333e-03 2523 2532 2.6745065309554533e-19 2523 3119 1.0416666666666664e-03 2523 3137 2.0833333333333329e-03 2523 2527 5.2083333333333330e-03 2523 3135 -2.0833333333333333e-03 2523 2526 3.7587087034409578e-19 2523 3123 1.0416666666666664e-03 2523 3126 2.0833333333333329e-03 2523 2525 5.2083333333333330e-03 2523 3121 1.0416666666666664e-03 2523 2524 5.2083333333333330e-03 2523 3127 2.0833333333333333e-03 2523 2522 2.6745065309554533e-19 2524 2524 4.9999999999999989e-02 2524 3129 -1.0416666666666664e-02 2524 3484 -2.0833333333333329e-03 2524 2547 -1.0416666666666662e-03 2524 3132 -4.1666666666666657e-03 2524 3483 -2.0833333333333329e-03 2524 2546 5.2083333333333322e-03 2524 3131 -1.0416666666666664e-02 2524 3482 -2.0833333333333329e-03 2524 2545 -1.0416666666666664e-03 2524 3130 -4.1666666666666657e-03 2524 3128 -2.0833333333333329e-03 2524 2543 5.2083333333333322e-03 2524 3121 4.1666666666666657e-03 2524 2523 5.2083333333333322e-03 2524 3127 1.0416666666666664e-02 2524 2522 -1.0416666666666664e-03 2525 2525 4.9999999999999989e-02 2525 3128 -2.0833333333333329e-03 2525 3136 -4.1666666666666657e-03 2525 2540 5.2083333333333322e-03 2525 3133 -4.1666666666666657e-03 2525 3134 -1.0416666666666664e-02 2525 3481 -2.0833333333333329e-03 2525 2543 5.2083333333333322e-03 2525 2544 -1.0416666666666664e-03 2525 3135 -1.0416666666666664e-02 2525 2526 -1.0416666666666662e-03 2525 3123 4.1666666666666657e-03 2525 3126 1.0416666666666664e-02 2525 2523 5.2083333333333322e-03 2525 2522 -1.0416666666666662e-03 2526 2526 1.2499999999999997e-02 2526 3136 1.0842021724855044e-19 2526 3141 -1.3552527156068805e-19 2526 2540 4.3368086899420177e-19 2526 3119 -1.3552527156068805e-19 2526 3137 1.0416666666666662e-03 2526 2527 -1.0416666666666662e-03 2526 3123 1.0842021724855044e-19 2526 2525 -1.0416666666666662e-03 2526 2523 4.3368086899420177e-19 2526 3135 -1.0416666666666662e-03 2527 2527 4.9999999999999996e-02 2527 3141 -4.1666666666666657e-03 2527 2540 5.2083333333333322e-03 2527 3142 -1.0416666666666664e-02 2527 3147 -2.0833333333333329e-03 2527 2538 -1.0416666666666664e-03 2527 3139 -4.1666666666666657e-03 2527 3140 -1.0416666666666664e-02 2527 3143 -2.0833333333333329e-03 2527 2529 5.2083333333333322e-03 2527 2532 -1.0416666666666664e-03 2527 3119 4.1666666666666657e-03 2527 3137 1.0416666666666664e-02 2527 2523 5.2083333333333322e-03 2527 2526 -1.0416666666666662e-03 2528 2528 1.2499999999999997e-02 2528 3162 1.3552527156068805e-19 2528 3163 -1.3552527156068805e-19 2528 2546 2.1684043449710089e-19 2528 3157 4.3368086899420177e-19 2528 3150 -1.3552527156068805e-19 2528 3155 1.0416666666666664e-03 2528 2531 -1.0416666666666664e-03 2528 3145 1.3552527156068805e-19 2528 2530 -1.0416666666666664e-03 2528 2529 4.3368086899420177e-19 2528 3156 1.0416666666666664e-03 2528 3149 2.1684043449710089e-19 2529 2529 4.1666666666666657e-02 2529 3159 -2.0833333333333329e-03 2529 3427 2.0833333333333333e-03 2529 3144 -6.2499999999999986e-03 2529 2536 4.1202858928001372e-19 2529 3151 1.0416666666666660e-03 2529 3452 -2.0833333333333329e-03 2529 2537 5.2083333333333330e-03 2529 3142 -2.0833333333333333e-03 2529 3147 -6.2499999999999995e-03 2529 2538 4.1202858928001372e-19 2529 3139 -1.0416666666666660e-03 2529 3140 -2.0833333333333329e-03 2529 2527 5.2083333333333330e-03 2529 3165 -2.0833333333333333e-03 2529 3143 -6.2499999999999986e-03 2529 2532 4.1202858928001372e-19 2529 3150 1.0416666666666660e-03 2529 3155 2.0833333333333329e-03 2529 2531 5.2083333333333330e-03 2529 3145 1.0416666666666660e-03 2529 2530 5.2083333333333330e-03 2529 3156 2.0833333333333333e-03 2529 3149 -6.2499999999999995e-03 2529 2528 4.1202858928001372e-19 2530 2530 4.9999999999999989e-02 2530 3447 -2.0833333333333329e-03 2530 3162 -4.1666666666666657e-03 2530 3157 -2.0833333333333329e-03 2530 2546 5.2083333333333322e-03 2530 3144 -2.0833333333333329e-03 2530 3159 -1.0416666666666664e-02 2530 3426 2.0833333333333329e-03 2530 2536 -1.0416666666666664e-03 2530 3160 -4.1666666666666657e-03 2530 3161 -1.0416666666666664e-02 2530 3441 -2.0833333333333329e-03 2530 2534 5.2083333333333322e-03 2530 2533 -1.0416666666666662e-03 2530 3145 4.1666666666666657e-03 2530 2529 5.2083333333333322e-03 2530 3156 1.0416666666666664e-02 2530 3149 -2.0833333333333329e-03 2530 2528 -1.0416666666666664e-03 2531 2531 4.9999999999999989e-02 2531 3157 -2.0833333333333329e-03 2531 3125 4.1666666666666657e-03 2531 2523 5.2083333333333322e-03 2531 3163 -4.1666666666666657e-03 2531 3164 -1.0416666666666664e-02 2531 3484 -2.0833333333333329e-03 2531 2546 5.2083333333333322e-03 2531 2547 -1.0416666666666662e-03 2531 3165 -1.0416666666666664e-02 2531 3143 -2.0833333333333329e-03 2531 2532 -1.0416666666666662e-03 2531 3150 4.1666666666666657e-03 2531 3155 1.0416666666666664e-02 2531 3149 -2.0833333333333329e-03 2531 2529 5.2083333333333322e-03 2531 2528 -1.0416666666666664e-03 2532 2532 1.2499999999999997e-02 2532 3125 -1.3552527156068805e-19 2532 3119 1.3552527156068805e-19 2532 2523 2.1684043449710089e-19 2532 3139 1.3552527156068805e-19 2532 3140 -1.0416666666666664e-03 2532 2527 -1.0416666666666664e-03 2532 3150 1.3552527156068805e-19 2532 2531 -1.0416666666666662e-03 2532 2529 4.3368086899420177e-19 2532 3165 -1.0416666666666662e-03 2532 3143 2.1684043449710089e-19 2533 2533 1.2499999999999997e-02 2533 3451 1.0842021724855044e-19 2533 3162 -1.3552527156068805e-19 2533 2546 4.3368086899420177e-19 2533 3447 4.3368086899420177e-19 2533 3160 1.3552527156068805e-19 2533 3161 -1.0416666666666662e-03 2533 2530 -1.0416666666666662e-03 2533 3443 1.0842021724855044e-19 2533 2535 -1.0416666666666662e-03 2533 2534 4.3368086899420177e-19 2533 3448 1.0416666666666662e-03 2533 3441 4.3368086899420177e-19 2534 2534 4.1666666666666664e-02 2534 3408 2.0833333333333329e-03 2534 3411 2.0833333333333333e-03 2534 3407 6.2499999999999986e-03 2534 2542 2.6745065309554533e-19 2534 3444 1.0416666666666664e-03 2534 3478 2.0833333333333329e-03 2534 2541 5.2083333333333330e-03 2534 3454 -2.0833333333333333e-03 2534 3442 -6.2500000000000003e-03 2534 2539 3.7587087034409578e-19 2534 3440 1.0416666666666664e-03 2534 3427 2.0833333333333329e-03 2534 2537 5.2083333333333330e-03 2534 3159 -2.0833333333333333e-03 2534 3426 6.2499999999999986e-03 2534 2536 2.6745065309554533e-19 2534 3160 -1.0416666666666664e-03 2534 3161 -2.0833333333333329e-03 2534 2530 5.2083333333333330e-03 2534 3443 1.0416666666666664e-03 2534 2535 5.2083333333333330e-03 2534 3448 2.0833333333333333e-03 2534 3441 -6.2500000000000003e-03 2534 2533 3.7587087034409578e-19 2535 2535 4.9999999999999989e-02 2535 3447 -2.0833333333333329e-03 2535 3451 -4.1666666666666657e-03 2535 2546 5.2083333333333322e-03 2535 3483 -2.0833333333333329e-03 2535 3450 -1.0416666666666664e-02 2535 3482 -2.0833333333333329e-03 2535 2545 -1.0416666666666664e-03 2535 3449 -4.1666666666666657e-03 2535 2543 5.2083333333333322e-03 2535 3412 -2.0833333333333329e-03 2535 3408 1.0416666666666664e-02 2535 3407 2.0833333333333329e-03 2535 2542 -1.0416666666666662e-03 2535 3443 4.1666666666666657e-03 2535 2534 5.2083333333333322e-03 2535 3448 1.0416666666666664e-02 2535 3441 -2.0833333333333329e-03 2535 2533 -1.0416666666666662e-03 2536 2536 1.2499999999999997e-02 2536 3145 -1.3552527156068805e-19 2536 3151 1.3552527156068805e-19 2536 2529 4.3368086899420177e-19 2536 3144 2.1684043449710089e-19 2536 3440 -1.3552527156068805e-19 2536 3427 1.0416666666666662e-03 2536 2537 -1.0416666666666662e-03 2536 3160 -1.3552527156068805e-19 2536 2530 -1.0416666666666664e-03 2536 2534 2.1684043449710089e-19 2536 3159 -1.0416666666666664e-03 2536 3426 -4.3368086899420177e-19 2537 2537 4.9999999999999996e-02 2537 3442 -2.0833333333333329e-03 2537 3453 -4.1666666666666657e-03 2537 3454 -1.0416666666666664e-02 2537 2540 5.2083333333333322e-03 2537 2539 -1.0416666666666662e-03 2537 3144 -2.0833333333333329e-03 2537 3151 4.1666666666666657e-03 2537 3452 -1.0416666666666664e-02 2537 3147 -2.0833333333333329e-03 2537 2529 5.2083333333333322e-03 2537 2538 -1.0416666666666664e-03 2537 3440 4.1666666666666657e-03 2537 3427 1.0416666666666664e-02 2537 3426 2.0833333333333329e-03 2537 2534 5.2083333333333322e-03 2537 2536 -1.0416666666666662e-03 2538 2538 1.2499999999999997e-02 2538 3141 1.3552527156068805e-19 2538 3453 -1.3552527156068805e-19 2538 2540 2.1684043449710089e-19 2538 3151 -1.3552527156068805e-19 2538 3452 -1.0416666666666664e-03 2538 2537 -1.0416666666666664e-03 2538 3139 -1.3552527156068805e-19 2538 2527 -1.0416666666666664e-03 2538 2529 4.3368086899420177e-19 2538 3142 -1.0416666666666664e-03 2538 3147 2.1684043449710089e-19 2539 2539 1.2499999999999997e-02 2539 3444 -1.3552527156068805e-19 2539 3440 1.0842021724855044e-19 2539 2534 4.3368086899420177e-19 2539 3442 4.3368086899420177e-19 2539 3453 1.0842021724855044e-19 2539 3454 -1.0416666666666662e-03 2539 2537 -1.0416666666666662e-03 2539 3476 1.3552527156068805e-19 2539 2541 -1.0416666666666662e-03 2539 2540 4.3368086899420177e-19 2539 3478 1.0416666666666662e-03 2540 2540 4.1666666666666657e-02 2540 3479 -2.0833333333333329e-03 2540 3134 -2.0833333333333333e-03 2540 2544 2.6745065309554533e-19 2540 3136 -1.0416666666666664e-03 2540 3135 -2.0833333333333329e-03 2540 2525 5.2083333333333330e-03 2540 3137 2.0833333333333333e-03 2540 2526 4.1202858928001372e-19 2540 3141 -1.0416666666666664e-03 2540 3142 -2.0833333333333329e-03 2540 2527 5.2083333333333330e-03 2540 3452 -2.0833333333333333e-03 2540 2538 2.6745065309554533e-19 2540 3453 -1.0416666666666664e-03 2540 3454 -2.0833333333333329e-03 2540 2537 5.2083333333333330e-03 2540 3476 1.0416666666666664e-03 2540 2541 5.2083333333333330e-03 2540 3478 2.0833333333333333e-03 2540 2539 4.1202858928001372e-19 2541 2541 4.9999999999999989e-02 2541 3479 -1.0416666666666664e-02 2541 3481 -2.0833333333333329e-03 2541 2544 -1.0416666666666664e-03 2541 3480 -4.1666666666666657e-03 2541 3412 -2.0833333333333329e-03 2541 2543 5.2083333333333322e-03 2541 3411 1.0416666666666664e-02 2541 3407 2.0833333333333329e-03 2541 2542 -1.0416666666666664e-03 2541 3444 4.1666666666666657e-03 2541 3442 -2.0833333333333329e-03 2541 2534 5.2083333333333322e-03 2541 3476 4.1666666666666657e-03 2541 2540 5.2083333333333322e-03 2541 3478 1.0416666666666664e-02 2541 2539 -1.0416666666666662e-03 2542 2542 1.2499999999999997e-02 2542 3480 1.3552527156068805e-19 2542 3449 -1.3552527156068805e-19 2542 2543 4.3368086899420177e-19 2542 3412 2.1684043449710089e-19 2542 3443 -1.3552527156068805e-19 2542 3408 1.0416666666666662e-03 2542 2535 -1.0416666666666662e-03 2542 3444 1.3552527156068805e-19 2542 2541 -1.0416666666666664e-03 2542 2534 2.1684043449710089e-19 2542 3411 1.0416666666666664e-03 2542 3407 -4.3368086899420177e-19 2543 2543 4.1666666666666657e-02 2543 3450 -2.0833333333333329e-03 2543 3131 -2.0833333333333333e-03 2543 3482 -6.2499999999999995e-03 2543 2545 4.1202858928001372e-19 2543 3130 -1.0416666666666660e-03 2543 3127 2.0833333333333329e-03 2543 2524 5.2083333333333330e-03 2543 3126 2.0833333333333333e-03 2543 3128 -6.2499999999999986e-03 2543 2522 4.1202858928001372e-19 2543 3133 -1.0416666666666660e-03 2543 3134 -2.0833333333333329e-03 2543 2525 5.2083333333333330e-03 2543 3479 -2.0833333333333333e-03 2543 3481 -6.2499999999999995e-03 2543 2544 4.1202858928001372e-19 2543 3480 -1.0416666666666660e-03 2543 3411 2.0833333333333329e-03 2543 2541 5.2083333333333330e-03 2543 3449 -1.0416666666666660e-03 2543 2535 5.2083333333333330e-03 2543 3408 2.0833333333333333e-03 2543 3412 -6.2499999999999986e-03 2543 2542 4.1202858928001372e-19 2544 2544 1.2499999999999997e-02 2544 3476 -1.3552527156068805e-19 2544 3136 -1.3552527156068805e-19 2544 2540 2.1684043449710089e-19 2544 3133 1.3552527156068805e-19 2544 3134 -1.0416666666666664e-03 2544 2525 -1.0416666666666664e-03 2544 3480 -1.3552527156068805e-19 2544 2541 -1.0416666666666664e-03 2544 2543 4.3368086899420177e-19 2544 3479 -1.0416666666666664e-03 2544 3481 2.1684043449710089e-19 2545 2545 1.2499999999999997e-02 2545 3132 1.3552527156068805e-19 2545 3451 -1.3552527156068805e-19 2545 2546 2.1684043449710089e-19 2545 3483 4.3368086899420177e-19 2545 3449 1.3552527156068805e-19 2545 3450 -1.0416666666666664e-03 2545 2535 -1.0416666666666664e-03 2545 3130 -1.3552527156068805e-19 2545 2524 -1.0416666666666664e-03 2545 2543 4.3368086899420177e-19 2545 3131 -1.0416666666666664e-03 2545 3482 2.1684043449710089e-19 2546 2546 4.1666666666666657e-02 2546 3448 2.0833333333333329e-03 2546 3161 -2.0833333333333333e-03 2546 3447 -6.2499999999999995e-03 2546 2533 4.1202858928001372e-19 2546 3162 -1.0416666666666664e-03 2546 3156 2.0833333333333329e-03 2546 2530 5.2083333333333330e-03 2546 3155 2.0833333333333333e-03 2546 3157 -6.2500000000000003e-03 2546 2528 2.6745065309554533e-19 2546 3163 -1.0416666666666664e-03 2546 3164 -2.0833333333333329e-03 2546 2531 5.2083333333333330e-03 2546 3129 -2.0833333333333333e-03 2546 3484 -6.2499999999999995e-03 2546 2547 4.1202858928001372e-19 2546 3132 -1.0416666666666664e-03 2546 3131 -2.0833333333333329e-03 2546 2524 5.2083333333333330e-03 2546 3451 -1.0416666666666664e-03 2546 2535 5.2083333333333330e-03 2546 3450 -2.0833333333333333e-03 2546 3483 -6.2500000000000003e-03 2546 2545 2.6745065309554533e-19 2547 2547 1.2499999999999997e-02 2547 3121 -1.3552527156068805e-19 2547 3125 1.0842021724855044e-19 2547 2523 4.3368086899420177e-19 2547 3163 1.0842021724855044e-19 2547 3164 -1.0416666666666662e-03 2547 2531 -1.0416666666666662e-03 2547 3132 -1.3552527156068805e-19 2547 2524 -1.0416666666666662e-03 2547 2546 4.3368086899420177e-19 2547 3129 -1.0416666666666662e-03 2547 3484 4.3368086899420177e-19 2548 2548 1.2499999999999997e-02 2548 3484 -2.1684043449710089e-19 2548 3157 -4.3368086899420177e-19 2548 2553 2.1684043449710089e-19 2548 3155 1.3552527156068805e-19 2548 3164 1.3552527156068805e-19 2548 3163 -1.0416666666666664e-03 2548 2550 -1.0416666666666664e-03 2548 999 1.3552527156068805e-19 2548 1003 1.3552527156068805e-19 2548 1002 -1.0416666666666662e-03 2548 487 -1.0416666666666662e-03 2549 2549 2.0833333333333329e-02 2550 2550 4.9999999999999989e-02 2550 3157 2.0833333333333329e-03 2550 3125 1.0416666666666664e-02 2550 3165 -4.1666666666666657e-03 2550 3143 2.0833333333333329e-03 2550 3155 4.1666666666666657e-03 2550 3150 1.0416666666666664e-02 2550 3149 2.0833333333333329e-03 2550 2553 5.2083333333333322e-03 2550 2554 -1.0416666666666662e-03 2550 3164 -4.1666666666666657e-03 2550 3163 -1.0416666666666664e-02 2550 3484 2.0833333333333329e-03 2550 2548 -1.0416666666666664e-03 2551 2551 3.7499999999999992e-02 2551 3149 2.1684043449710089e-19 2551 3143 5.2083333333333322e-03 2551 3152 6.2499999999999986e-03 2551 2554 1.0416666666666667e-03 2551 3166 -6.2499999999999986e-03 2551 3500 -6.2500000000000003e-03 2551 3505 1.0416666666666667e-03 2551 3503 -1.0416666666666667e-03 2551 3154 -1.0416666666666664e-03 2551 3153 1.0416666666666673e-03 2551 3501 -6.2499999999999995e-03 2551 2553 2.1684043449710089e-19 2551 2552 -2.0833333333333333e-03 2552 2552 2.4999999999999994e-02 2552 3534 2.0833333333333329e-03 2552 3158 2.0833333333333329e-03 2552 3509 -4.1666666666666666e-03 2552 2561 -2.0833333333333333e-03 2552 3508 2.0833333333333329e-03 2552 3504 -4.1666666666666666e-03 2552 3505 2.0833333333333329e-03 2552 3503 2.0833333333333329e-03 2552 3154 -2.0833333333333329e-03 2552 3153 -2.0833333333333329e-03 2552 3501 4.1666666666666675e-03 2552 2553 4.1666666666666657e-03 2552 2551 -2.0833333333333329e-03 2553 2553 4.7916666666666656e-02 2553 3158 7.2916666666666668e-03 2553 2561 4.3812779196728685e-19 2553 3157 6.2499999999999986e-03 2553 2548 2.6745065309554533e-19 2553 3152 2.1705219273391446e-19 2553 3509 -1.0416666666666667e-03 2553 3163 -2.0833333333333333e-03 2553 3155 1.0416666666666664e-03 2553 3150 2.0833333333333329e-03 2553 3149 8.3333333333333332e-03 2553 2550 5.2083333333333330e-03 2553 2554 -1.5124832064409600e-19 2553 3154 -6.2499999999999995e-03 2553 3153 -9.3750000000000014e-03 2553 3501 1.0416666666666667e-03 2553 2552 4.1666666666666666e-03 2553 2551 1.0116749763768550e-19 2553 1005 -2.0833333333333333e-03 2553 1003 -1.0416666666666664e-03 2553 1002 -2.0833333333333329e-03 2553 487 5.2083333333333330e-03 2554 2554 1.6666666666666663e-02 2554 3153 -3.2249014814734037e-20 2554 3166 2.1684043449710089e-19 2554 3152 -1.0416666666666673e-03 2554 2551 1.0416666666666664e-03 2554 3165 -1.3552527156068805e-19 2554 3143 1.0416666666666660e-03 2554 3155 -1.3552527156068805e-19 2554 3150 1.0416666666666662e-03 2554 3149 -5.1499603193061461e-19 2554 2550 -1.0416666666666662e-03 2554 2553 -9.4867690092481638e-20 2555 2555 3.9583333333333325e-02 2556 2556 6.2499999999999986e-03 2557 2557 2.7083333333333327e-02 2558 2558 1.0416666666666664e-02 2559 2559 1.2499999999999999e-02 2560 2560 2.7083333333333327e-02 2561 2561 1.8749999999999999e-02 2561 2553 5.4210108624275222e-19 2561 3534 -1.0416666666666669e-03 2561 3508 1.0416666666666664e-03 2561 3158 -1.0416666666666673e-03 2561 3154 -1.0416666666666664e-03 2561 3509 6.2500000000000003e-03 2561 2552 -2.0833333333333329e-03 2561 1003 -1.0842021724855044e-19 2561 1004 1.0842021724855044e-19 2561 1005 -1.0416666666666662e-03 2561 487 -1.0416666666666662e-03 2562 2562 4.9999999999999989e-02 2562 3192 -5.2083333333333339e-03 2562 3274 -4.1666666666666666e-03 2562 3198 -2.1684043449710089e-19 2562 3174 -1.2499999999999999e-02 2562 3485 3.1249999999999997e-03 2562 2576 -1.0416666666666654e-03 2562 3177 -8.6736173798840355e-19 2562 3270 -1.0416666666666664e-03 2562 3176 -1.0416666666666666e-02 2562 2572 5.2083333333333330e-03 2562 2571 -4.1666666666666657e-03 2562 3171 -1.0416666666666667e-03 2562 3487 5.2083333333333330e-03 2562 3170 -8.3333333333333332e-03 2562 2568 6.2500000000000003e-03 2562 2570 -4.3368086899420177e-19 2562 3190 -2.1684043449710089e-19 2562 3169 -2.1684043449710089e-19 2562 3168 -1.0416666666666669e-03 2562 2564 6.5052130349130266e-19 2562 2563 6.2499999999999986e-03 2563 2563 3.1249999999999997e-02 2563 3330 1.0416666666666664e-03 2563 3176 -5.2083333333333330e-03 2563 3194 -2.0833333333333333e-03 2563 2578 8.1315162936412833e-20 2563 3571 1.0416666666666664e-03 2563 3192 -1.0416666666666666e-02 2563 2571 -4.1666666666666657e-03 2563 3197 -1.0416666666666664e-03 2563 3191 -6.2500000000000003e-03 2563 2573 -2.0833333333333329e-03 2563 3190 -1.0416666666666673e-03 2563 3169 -2.1684043449710089e-19 2563 3168 1.0416666666666671e-03 2563 2564 1.3552527156068805e-20 2563 2562 6.2499999999999986e-03 2564 2564 5.4166666666666655e-02 2564 3359 1.0416666666666667e-03 2564 3195 -6.2500000000000003e-03 2564 3491 1.0416666666666667e-03 2564 2587 4.1666666666666666e-03 2564 3198 -9.3749999999999997e-03 2564 2568 -8.8991399020904929e-20 2564 3171 -2.1705219273391446e-19 2564 3191 1.0416666666666667e-03 2564 3196 -8.3333333333333315e-03 2564 3197 -6.2500000000000003e-03 2564 3333 -1.0416666666666667e-03 2564 2574 1.5502688168223823e-19 2564 2573 4.1666666666666666e-03 2564 3190 9.3749999999999979e-03 2564 3169 1.0416666666666668e-02 2564 3168 5.0116116045879435e-20 2564 2563 -8.8991399020904929e-20 2564 2562 4.6263880787845817e-19 2565 2565 2.2916666666666662e-02 2565 3312 2.0833333333333329e-03 2565 3273 -2.0833333333333329e-03 2565 3256 -4.1666666666666666e-03 2565 2580 -2.0833333333333333e-03 2565 3280 2.0833333333333329e-03 2565 3257 2.0833333333333329e-03 2565 2581 4.1666666666666657e-03 2565 3266 2.0833333333333329e-03 2565 2572 4.1666666666666657e-03 2565 3260 2.0833333333333329e-03 2565 3262 -2.8940292364521927e-21 2565 3254 -4.1666666666666675e-03 2565 3253 -4.1666666666666666e-03 2565 2567 -4.1666666666666666e-03 2565 2566 -4.1666666666666657e-03 2566 2566 4.9999999999999989e-02 2566 3274 -4.1666666666666657e-03 2566 3487 5.2083333333333339e-03 2566 3279 2.1684043449710089e-19 2566 3268 -8.3333333333333315e-03 2566 3267 -1.2499999999999999e-02 2566 3485 3.1249999999999997e-03 2566 2570 4.3368086899420177e-19 2566 2576 -1.0416666666666671e-03 2566 3266 -4.3368086899420177e-19 2566 2572 5.2083333333333339e-03 2566 3260 1.0416666666666664e-03 2566 3490 -2.1684043449710089e-19 2566 3264 -2.1684043449710089e-19 2566 3263 -1.0416666666666671e-03 2566 2569 6.5052130349130266e-19 2566 2568 6.2499999999999986e-03 2566 3262 -1.0416666666666669e-03 2566 3254 5.2083333333333322e-03 2566 3253 1.0416666666666664e-02 2566 2567 6.2500000000000003e-03 2566 2565 -4.1666666666666657e-03 2567 2567 3.1249999999999993e-02 2567 3493 -1.0416666666666664e-03 2567 3600 -1.0416666666666664e-03 2567 3277 -6.2500000000000003e-03 2567 2583 -2.0833333333333329e-03 2567 3280 -2.0833333333333337e-03 2567 3257 1.0416666666666664e-03 2567 2581 1.3552527156068805e-20 2567 3279 -1.0416666666666669e-03 2567 2569 8.1315162936412833e-20 2567 3264 -4.9904357809065860e-20 2567 3262 1.0416666666666671e-03 2567 3254 1.0416666666666666e-02 2567 3253 5.2083333333333330e-03 2567 2566 6.2499999999999995e-03 2567 2565 -4.1666666666666666e-03 2568 2568 3.7499999999999992e-02 2568 3195 -1.0416666666666664e-03 2568 3495 -1.0416666666666664e-03 2568 3491 -6.2500000000000003e-03 2568 2587 -2.0833333333333329e-03 2568 3198 1.0416666666666673e-03 2568 2564 1.3552527156068805e-20 2568 3169 3.2249014814734037e-20 2568 3268 -5.2083333333333330e-03 2568 3171 1.0416666666666671e-03 2568 3487 1.4583333333333332e-02 2568 3170 -5.2083333333333330e-03 2568 2562 6.2499999999999995e-03 2568 2570 -6.2499999999999986e-03 2568 3490 -1.0416666666666667e-03 2568 3264 -2.1684043449710089e-19 2568 3263 1.0416666666666671e-03 2568 2569 8.1315162936412833e-20 2568 2566 6.2499999999999986e-03 2569 2569 5.4166666666666655e-02 2569 3624 -1.0416666666666667e-03 2569 3493 -6.2500000000000003e-03 2569 3277 1.0416666666666667e-03 2569 2583 4.1666666666666666e-03 2569 3491 1.0416666666666667e-03 2569 3494 -8.3333333333333315e-03 2569 3495 -6.2500000000000003e-03 2569 3631 -1.0416666666666667e-03 2569 2588 1.5502688168223823e-19 2569 2587 4.1666666666666666e-03 2569 3279 9.3749999999999997e-03 2569 2567 1.5502688168223823e-19 2569 3262 -2.1705219273391446e-19 2569 3490 9.3749999999999997e-03 2569 3264 1.0416666666666668e-02 2569 3263 5.0116116045879435e-20 2569 2568 1.5502688168223823e-19 2569 2566 4.6263880787845817e-19 2570 2570 3.3333333333333326e-02 2570 3174 -4.1666666666666666e-03 2570 3263 -4.5316262678105068e-20 2570 3268 4.1666666666666666e-03 2570 3267 -4.1666666666666657e-03 2570 3485 1.6666666666666663e-02 2570 2566 4.3368086899420177e-19 2570 2576 -6.2499999999999986e-03 2570 3171 -2.8940292364521927e-21 2570 3487 -4.1666666666666675e-03 2570 3170 4.1666666666666675e-03 2570 2568 -6.2499999999999986e-03 2570 2562 -4.3368086899420177e-19 2571 2571 2.2916666666666662e-02 2571 3168 -4.5316262678105068e-20 2571 3194 2.0833333333333329e-03 2571 2563 -4.1666666666666657e-03 2571 3192 4.1666666666666657e-03 2571 3271 -2.0833333333333329e-03 2571 3551 2.0833333333333329e-03 2571 3571 2.0833333333333329e-03 2571 3549 4.1666666666666666e-03 2571 2578 4.1666666666666657e-03 2571 2577 -2.0833333333333333e-03 2571 3177 2.0833333333333329e-03 2571 3270 -2.0833333333333329e-03 2571 3176 4.1666666666666666e-03 2571 2572 4.1666666666666657e-03 2571 2562 -4.1666666666666657e-03 2572 2572 7.9166666666666649e-02 2572 3267 -3.1249999999999997e-03 2572 3274 -1.6666666666666663e-02 2572 3174 -3.1249999999999997e-03 2572 2576 2.0833333333333333e-03 2572 3539 -1.0416666666666667e-03 2572 3256 -1.0416666666666667e-03 2572 3273 -8.3333333333333315e-03 2572 2580 -8.8991399020904929e-20 2572 3272 -6.2500000000000003e-03 2572 3313 1.0416666666666667e-03 2572 2579 4.1666666666666666e-03 2572 3271 -8.3333333333333315e-03 2572 2577 -8.8991399020904929e-20 2572 3549 1.0416666666666667e-03 2572 3266 7.2916666666666659e-03 2572 2566 5.2083333333333330e-03 2572 3260 6.2500000000000003e-03 2572 3253 -1.0416666666666667e-03 2572 2565 4.1666666666666666e-03 2572 3177 7.2916666666666659e-03 2572 3270 -6.2500000000000003e-03 2572 3176 1.0416666666666667e-03 2572 2562 5.2083333333333330e-03 2572 2571 4.1666666666666666e-03 2573 2573 2.4999999999999994e-02 2573 3342 2.0833333333333329e-03 2573 3346 2.0833333333333329e-03 2573 3329 -4.1666666666666666e-03 2573 2586 -2.0833333333333333e-03 2573 3194 2.0833333333333329e-03 2573 3330 2.0833333333333329e-03 2573 2578 4.1666666666666657e-03 2573 3190 2.0833333333333329e-03 2573 2563 -2.0833333333333333e-03 2573 3191 4.1666666666666666e-03 2573 3360 2.0833333333333329e-03 2573 2575 4.1666666666666657e-03 2573 3339 2.0833333333333329e-03 2573 3196 -2.0833333333333329e-03 2573 3197 -2.0833333333333329e-03 2573 3333 -4.1666666666666666e-03 2573 2564 4.1666666666666657e-03 2573 2574 -2.0833333333333333e-03 2574 2574 2.5000000000000001e-02 2574 3195 -1.0416666666666664e-03 2574 3365 -1.0416666666666664e-03 2574 3359 -6.2500000000000003e-03 2574 2587 -2.0833333333333329e-03 2574 3360 -2.0833333333333337e-03 2574 2575 1.3552527156068805e-20 2574 3339 1.0416666666666664e-03 2574 3196 2.0833333333333337e-03 2574 3197 -1.0416666666666664e-03 2574 3333 6.2500000000000003e-03 2574 2564 8.1315162936412833e-20 2574 2573 -2.0833333333333329e-03 2575 2575 6.6666666666666652e-02 2575 3359 1.0416666666666667e-03 2575 3624 -1.0416666666666667e-03 2575 3366 -8.3333333333333315e-03 2575 2588 -8.8991399020904929e-20 2575 3365 -6.2500000000000003e-03 2575 3631 -1.0416666666666667e-03 2575 2587 4.1666666666666666e-03 2575 3628 -1.0416666666666667e-03 2575 3329 -1.0416666666666667e-03 2575 3346 8.3333333333333315e-03 2575 2586 -8.8991399020904929e-20 2575 3364 -6.2500000000000003e-03 2575 3343 1.0416666666666667e-03 2575 2585 4.1666666666666666e-03 2575 3363 -8.3333333333333315e-03 2575 2584 -8.8991399020904929e-20 2575 3362 -6.2500000000000003e-03 2575 3625 -1.0416666666666667e-03 2575 2583 4.1666666666666666e-03 2575 3360 8.3333333333333315e-03 2575 2574 -8.8991399020904929e-20 2575 3339 6.2500000000000003e-03 2575 3333 -1.0416666666666667e-03 2575 2573 4.1666666666666666e-03 2576 2576 1.6666666666666663e-02 2576 3266 1.0416666666666664e-03 2576 3177 1.0416666666666667e-03 2576 2572 2.0833333333333337e-03 2576 3274 -6.2499999999999986e-03 2576 3170 -1.0416666666666664e-03 2576 2562 -1.0416666666666656e-03 2576 3174 -1.0416666666666671e-03 2576 3268 -1.0416666666666667e-03 2576 3267 -1.0416666666666654e-03 2576 3485 -2.0833333333333337e-03 2576 2566 -1.0416666666666671e-03 2576 2570 -6.2499999999999986e-03 2577 2577 2.4999999999999998e-02 2577 3540 1.0416666666666662e-03 2577 3272 -1.0416666666666664e-03 2577 3539 6.2500000000000003e-03 2577 2579 -2.0833333333333329e-03 2577 3271 2.0833333333333337e-03 2577 2572 1.3552527156068805e-20 2577 3270 -1.0416666666666664e-03 2577 3551 -2.0833333333333337e-03 2577 3571 1.0416666666666664e-03 2577 3549 -6.2500000000000003e-03 2577 2578 8.1315162936412833e-20 2577 2571 -2.0833333333333329e-03 2578 2578 6.6666666666666652e-02 2578 3329 -1.0416666666666667e-03 2578 3330 6.2500000000000003e-03 2578 3191 1.0416666666666667e-03 2578 2573 4.1666666666666666e-03 2578 3602 1.0416666666666667e-03 2578 3342 8.3333333333333315e-03 2578 3596 -6.2500000000000003e-03 2578 3343 1.0416666666666667e-03 2578 2586 1.5502688168223823e-19 2578 2585 4.1666666666666666e-03 2578 3539 -1.0416666666666667e-03 2578 3595 -8.3333333333333315e-03 2578 3540 6.2500000000000003e-03 2578 3537 -1.0416666666666667e-03 2578 2582 1.5502688168223823e-19 2578 2579 4.1666666666666666e-03 2578 3194 8.3333333333333315e-03 2578 2563 1.5502688168223823e-19 2578 3192 1.0416666666666667e-03 2578 3551 8.3333333333333315e-03 2578 3571 6.2500000000000003e-03 2578 3549 1.0416666666666667e-03 2578 2577 1.5502688168223823e-19 2578 2571 4.1666666666666666e-03 2579 2579 2.4999999999999994e-02 2579 3551 2.0833333333333329e-03 2579 3271 -2.0833333333333329e-03 2579 3539 -4.1666666666666666e-03 2579 2577 -2.0833333333333333e-03 2579 3595 -2.0833333333333329e-03 2579 3540 2.0833333333333329e-03 2579 2578 4.1666666666666657e-03 2579 3599 -2.0833333333333329e-03 2579 2582 -2.0833333333333333e-03 2579 3537 -4.1666666666666666e-03 2579 3273 -2.0833333333333329e-03 2579 2572 4.1666666666666657e-03 2579 3272 -2.0833333333333329e-03 2579 3312 2.0833333333333329e-03 2579 3547 2.0833333333333329e-03 2579 3313 4.1666666666666666e-03 2579 2581 4.1666666666666657e-03 2579 2580 -2.0833333333333333e-03 2580 2580 2.5000000000000001e-02 2580 3257 1.0416666666666664e-03 2580 3260 1.0416666666666664e-03 2580 3256 6.2500000000000003e-03 2580 2565 -2.0833333333333329e-03 2580 3273 2.0833333333333337e-03 2580 2572 1.3552527156068805e-20 2580 3272 -1.0416666666666664e-03 2580 3312 -2.0833333333333337e-03 2580 3547 1.0416666666666664e-03 2580 3313 -6.2500000000000003e-03 2580 2581 8.1315162936412833e-20 2580 2579 -2.0833333333333329e-03 2581 2581 6.6666666666666652e-02 2581 3628 -1.0416666666666667e-03 2581 3597 -6.2500000000000003e-03 2581 3602 1.0416666666666667e-03 2581 2585 4.1666666666666666e-03 2581 3277 1.0416666666666667e-03 2581 3598 -8.3333333333333315e-03 2581 3600 -6.2500000000000003e-03 2581 3625 -1.0416666666666667e-03 2581 2584 1.5502688168223823e-19 2581 2583 4.1666666666666666e-03 2581 3256 -1.0416666666666667e-03 2581 3280 8.3333333333333315e-03 2581 3257 6.2500000000000003e-03 2581 3254 -1.0416666666666667e-03 2581 2567 -8.8991399020904929e-20 2581 2565 4.1666666666666666e-03 2581 3599 -8.3333333333333315e-03 2581 2582 -8.8991399020904929e-20 2581 3537 -1.0416666666666667e-03 2581 3312 8.3333333333333315e-03 2581 3547 6.2500000000000003e-03 2581 3313 1.0416666666666667e-03 2581 2580 1.5502688168223823e-19 2581 2579 4.1666666666666666e-03 2582 2582 2.4999999999999998e-02 2582 3597 -1.0416666666666664e-03 2582 3596 -1.0416666666666664e-03 2582 3602 -6.2500000000000003e-03 2582 2585 -2.0833333333333329e-03 2582 3595 2.0833333333333333e-03 2582 3540 1.0416666666666664e-03 2582 2578 8.1315162936412833e-20 2582 3599 2.0833333333333337e-03 2582 2581 1.3552527156068805e-20 2582 3547 1.0416666666666664e-03 2582 3537 6.2500000000000003e-03 2582 2579 -2.0833333333333329e-03 2583 2583 2.4999999999999994e-02 2583 3494 -2.0833333333333329e-03 2583 3366 -2.0833333333333329e-03 2583 3624 -4.1666666666666666e-03 2583 2588 -2.0833333333333333e-03 2583 3279 2.0833333333333329e-03 2583 3493 -2.0833333333333329e-03 2583 2569 4.1666666666666657e-03 2583 3280 2.0833333333333329e-03 2583 2567 -2.0833333333333333e-03 2583 3277 4.1666666666666666e-03 2583 3363 -2.0833333333333329e-03 2583 2575 4.1666666666666657e-03 2583 3362 -2.0833333333333329e-03 2583 3598 -2.0833333333333329e-03 2583 3600 -2.0833333333333329e-03 2583 3625 -4.1666666666666666e-03 2583 2581 4.1666666666666657e-03 2583 2584 -2.0833333333333333e-03 2584 2584 2.5000000000000001e-02 2584 3597 -1.0416666666666664e-03 2584 3364 -1.0416666666666664e-03 2584 3628 6.2500000000000003e-03 2584 2585 -2.0833333333333329e-03 2584 3363 2.0833333333333337e-03 2584 2575 1.3552527156068805e-20 2584 3362 -1.0416666666666664e-03 2584 3598 2.0833333333333337e-03 2584 3600 -1.0416666666666664e-03 2584 3625 6.2500000000000003e-03 2584 2581 8.1315162936412833e-20 2584 2583 -2.0833333333333329e-03 2585 2585 2.4999999999999994e-02 2585 3598 -2.0833333333333329e-03 2585 3363 -2.0833333333333329e-03 2585 3628 -4.1666666666666666e-03 2585 2584 -2.0833333333333333e-03 2585 3599 -2.0833333333333329e-03 2585 3597 -2.0833333333333329e-03 2585 2581 4.1666666666666657e-03 2585 3595 -2.0833333333333329e-03 2585 2582 -2.0833333333333333e-03 2585 3602 4.1666666666666666e-03 2585 3346 2.0833333333333329e-03 2585 2575 4.1666666666666657e-03 2585 3364 -2.0833333333333329e-03 2585 3342 2.0833333333333329e-03 2585 3596 -2.0833333333333329e-03 2585 3343 4.1666666666666666e-03 2585 2578 4.1666666666666657e-03 2585 2586 -2.0833333333333333e-03 2586 2586 2.4999999999999998e-02 2586 3330 1.0416666666666662e-03 2586 3339 1.0416666666666664e-03 2586 3329 6.2500000000000003e-03 2586 2573 -2.0833333333333329e-03 2586 3346 -2.0833333333333337e-03 2586 2575 1.3552527156068805e-20 2586 3364 -1.0416666666666664e-03 2586 3342 -2.0833333333333337e-03 2586 3596 -1.0416666666666664e-03 2586 3343 -6.2500000000000003e-03 2586 2578 8.1315162936412833e-20 2586 2585 -2.0833333333333329e-03 2587 2587 2.4999999999999994e-02 2587 3196 -2.0833333333333329e-03 2587 3360 2.0833333333333329e-03 2587 3359 4.1666666666666666e-03 2587 2574 -2.0833333333333333e-03 2587 3198 -2.0833333333333329e-03 2587 3195 -2.0833333333333329e-03 2587 2564 4.1666666666666657e-03 2587 3490 2.0833333333333329e-03 2587 2568 -2.0833333333333333e-03 2587 3491 4.1666666666666666e-03 2587 3366 -2.0833333333333329e-03 2587 2575 4.1666666666666657e-03 2587 3365 -2.0833333333333329e-03 2587 3494 -2.0833333333333329e-03 2587 3495 -2.0833333333333329e-03 2587 3631 -4.1666666666666666e-03 2587 2569 4.1666666666666657e-03 2587 2588 -2.0833333333333333e-03 2588 2588 2.4999999999999998e-02 2588 3493 -1.0416666666666662e-03 2588 3362 -1.0416666666666664e-03 2588 3624 6.2500000000000003e-03 2588 2583 -2.0833333333333329e-03 2588 3366 2.0833333333333337e-03 2588 2575 1.3552527156068805e-20 2588 3365 -1.0416666666666664e-03 2588 3494 2.0833333333333337e-03 2588 3495 -1.0416666666666664e-03 2588 3631 6.2500000000000003e-03 2588 2569 8.1315162936412833e-20 2588 2587 -2.0833333333333329e-03 2589 2589 4.3749999999999990e-02 2589 3247 -1.0416666666666664e-03 2589 3183 -5.2083333333333330e-03 2589 3176 -1.0416666666666666e-02 2589 2605 -4.1666666666666657e-03 2589 3485 -5.2083333333333330e-03 2589 3489 5.2083333333333339e-03 2589 3170 -1.4583333333333332e-02 2589 2599 -6.2499999999999986e-03 2589 3178 -1.0416666666666667e-03 2589 3175 -1.0416666666666667e-03 2589 3244 2.1684043449710089e-19 2589 3174 -1.0416666666666671e-03 2589 2593 8.1315162936412833e-20 2589 2592 6.2499999999999995e-03 2589 3173 -6.5052130349130266e-19 2589 3172 -1.0416666666666669e-03 2590 2590 1.8749999999999996e-02 2591 2591 2.0833333333333332e-02 2592 2592 3.7499999999999992e-02 2592 3232 1.0416666666666667e-03 2592 3225 5.2083333333333322e-03 2592 3227 1.0416666666666664e-02 2592 2595 -4.1666666666666657e-03 2592 3488 1.0416666666666667e-03 2592 3170 -5.2083333333333322e-03 2592 3485 -1.0416666666666664e-02 2592 2599 -4.1666666666666657e-03 2592 3486 -1.0416666666666667e-03 2592 3249 1.0416666666666673e-03 2592 3175 -2.1684043449710089e-19 2592 3244 1.0416666666666671e-03 2592 3174 1.0416666666666673e-03 2592 2593 2.1684043449710089e-19 2592 2589 6.2499999999999995e-03 2593 2593 6.0416666666666653e-02 2593 3176 1.0416666666666667e-03 2593 3227 -1.0416666666666664e-03 2593 3236 1.0416666666666667e-03 2593 3247 -6.2500000000000003e-03 2593 3568 -1.0416666666666667e-03 2593 2605 4.1666666666666666e-03 2593 3246 -8.3333333333333315e-03 2593 2602 -8.8991399020904929e-20 2593 3245 -6.2500000000000003e-03 2593 3572 1.0416666666666667e-03 2593 2601 4.1666666666666666e-03 2593 3239 8.3333333333333315e-03 2593 2596 1.5502688168223823e-19 2593 3232 6.2499999999999995e-03 2593 3228 -1.0416666666666667e-03 2593 2595 4.1666666666666657e-03 2593 3175 9.3749999999999997e-03 2593 3244 -9.3749999999999997e-03 2593 3174 5.0116116045879435e-20 2593 2589 1.5502688168223823e-19 2593 2592 1.0116749763768550e-19 2594 2594 1.8749999999999996e-02 2595 2595 2.2916666666666662e-02 2595 3244 -2.0833333333333329e-03 2595 3249 -2.8940292364521927e-21 2595 3227 -4.1666666666666675e-03 2595 2592 -4.1666666666666657e-03 2595 3225 -4.1666666666666666e-03 2595 3239 2.0833333333333329e-03 2595 2593 4.1666666666666657e-03 2595 3232 2.0833333333333329e-03 2595 3237 2.0833333333333329e-03 2595 3233 2.0833333333333329e-03 2595 3228 -4.1666666666666666e-03 2595 2596 -2.0833333333333333e-03 2596 2596 2.5000000000000001e-02 2596 3241 -1.0416666666666664e-03 2596 3245 -1.0416666666666664e-03 2596 3236 -6.2500000000000003e-03 2596 2601 -2.0833333333333329e-03 2596 3239 -2.0833333333333337e-03 2596 2593 8.1315162936412833e-20 2596 3232 1.0416666666666664e-03 2596 3237 -2.0833333333333337e-03 2596 3233 1.0416666666666664e-03 2596 3228 6.2500000000000003e-03 2596 2595 -2.0833333333333329e-03 2597 2597 3.3333333333333326e-02 2598 2598 1.8749999999999996e-02 2599 2599 2.0833333333333329e-02 2599 3486 2.0833333333333329e-03 2599 3174 -2.8940292364521927e-21 2599 3485 4.1666666666666675e-03 2599 2592 -4.1666666666666657e-03 2599 3172 8.8938459461701536e-21 2599 2589 -6.2499999999999986e-03 2599 3170 4.1666666666666666e-03 2599 3488 2.0833333333333329e-03 2599 3489 -4.1666666666666657e-03 2600 2600 2.7083333333333327e-02 2601 2601 2.4999999999999994e-02 2601 3237 2.0833333333333329e-03 2601 3239 2.0833333333333329e-03 2601 3236 4.1666666666666666e-03 2601 2596 -2.0833333333333333e-03 2601 3241 -2.0833333333333329e-03 2601 3579 -4.1666666666666666e-03 2601 3246 -2.0833333333333329e-03 2601 2593 4.1666666666666657e-03 2601 3245 -2.0833333333333329e-03 2601 3574 2.0833333333333329e-03 2601 3585 2.0833333333333329e-03 2601 3572 4.1666666666666666e-03 2601 2602 -2.0833333333333333e-03 2602 2602 2.4999999999999998e-02 2602 3569 1.0416666666666664e-03 2602 3247 -1.0416666666666664e-03 2602 3568 6.2500000000000003e-03 2602 2605 -2.0833333333333329e-03 2602 3246 2.0833333333333337e-03 2602 2593 1.3552527156068805e-20 2602 3245 -1.0416666666666664e-03 2602 3574 -2.0833333333333333e-03 2602 3585 1.0416666666666664e-03 2602 3572 -6.2500000000000003e-03 2602 2601 -2.0833333333333329e-03 2603 2603 3.3333333333333326e-02 2604 2604 1.2499999999999999e-02 2605 2605 2.2916666666666662e-02 2605 3175 2.0833333333333329e-03 2605 3178 -2.8940292364521927e-21 2605 3176 4.1666666666666666e-03 2605 2589 -4.1666666666666657e-03 2605 3574 2.0833333333333329e-03 2605 3246 -2.0833333333333329e-03 2605 3247 -2.0833333333333329e-03 2605 3568 -4.1666666666666666e-03 2605 2593 4.1666666666666657e-03 2605 2602 -2.0833333333333333e-03 2605 3569 2.0833333333333329e-03 2605 3183 4.1666666666666675e-03 2606 2606 2.4999999999999994e-02 2606 3193 2.0833333333333329e-03 2606 3332 2.0833333333333329e-03 2606 3331 -4.1666666666666666e-03 2606 3188 -2.0833333333333329e-03 2606 3187 -2.0833333333333329e-03 2606 3191 4.1666666666666666e-03 2606 2609 -2.0833333333333333e-03 2606 3328 2.0833333333333329e-03 2606 3327 -4.1666666666666666e-03 2607 2607 1.2500000000000001e-02 2608 2608 3.3333333333333326e-02 2609 2609 3.7499999999999999e-02 2609 3328 1.0416666666666664e-03 2609 3176 3.1249999999999997e-03 2609 3179 4.1666666666666666e-03 2609 3168 1.2500000000000001e-02 2609 2616 -1.0416666666666660e-03 2609 3193 -2.0833333333333337e-03 2609 3356 -1.0416666666666664e-03 2609 3192 -4.1666666666666675e-03 2609 2611 2.0833333333333329e-03 2609 3188 2.1684043449710089e-19 2609 3187 -1.0416666666666664e-03 2609 3191 -6.2500000000000003e-03 2609 2606 -2.0833333333333329e-03 2610 2610 4.5833333333333323e-02 2611 2611 3.7499999999999992e-02 2611 3178 4.1666666666666657e-03 2611 3168 4.1666666666666657e-03 2611 3176 1.6666666666666666e-02 2611 2616 -6.2499999999999986e-03 2611 3183 4.1666666666666657e-03 2611 3193 2.0833333333333329e-03 2611 3356 -2.0833333333333329e-03 2611 3192 4.1666666666666675e-03 2611 2609 2.0833333333333329e-03 2611 3567 2.0833333333333329e-03 2611 3566 -4.1666666666666666e-03 2612 2612 1.2500000000000001e-02 2613 2613 1.6666666666666663e-02 2614 2614 1.2499999999999999e-02 2615 2615 1.6666666666666663e-02 2616 2616 1.6666666666666663e-02 2616 3183 -1.0416666666666664e-03 2616 3192 -1.0416666666666667e-03 2616 3176 -2.0833333333333346e-03 2616 2611 -6.2499999999999986e-03 2616 3188 -1.0416666666666667e-03 2616 2609 -1.0416666666666662e-03 2616 3168 1.0416666666666660e-03 2616 3179 6.2499999999999986e-03 2616 3178 1.0416666666666662e-03 2617 2617 2.4999999999999994e-02 2618 2618 2.4999999999999994e-02 2618 3331 -4.1666666666666666e-03 2618 3188 -2.0833333333333329e-03 2618 3187 -2.0833333333333329e-03 2618 3190 2.0833333333333329e-03 2618 3191 4.1666666666666666e-03 2618 2627 -2.0833333333333333e-03 2618 3196 -2.0833333333333329e-03 2618 2622 4.1666666666666657e-03 2618 3197 -2.0833333333333329e-03 2618 3358 2.0833333333333329e-03 2618 3334 2.0833333333333329e-03 2618 3333 -4.1666666666666666e-03 2618 2619 -2.0833333333333333e-03 2619 2619 2.5000000000000001e-02 2619 3634 1.0416666666666664e-03 2619 3197 -1.0416666666666664e-03 2619 3196 2.0833333333333337e-03 2619 3195 -1.0416666666666664e-03 2619 3359 -6.2500000000000003e-03 2619 2622 8.1315162936412833e-20 2619 2621 -2.0833333333333329e-03 2619 3358 -2.0833333333333337e-03 2619 3334 1.0416666666666664e-03 2619 3333 6.2500000000000003e-03 2619 2618 -2.0833333333333329e-03 2620 2620 3.3333333333333326e-02 2621 2621 2.4999999999999994e-02 2621 3198 -2.0833333333333329e-03 2621 3492 2.0833333333333329e-03 2621 3491 4.1666666666666666e-03 2621 2628 -2.0833333333333333e-03 2621 3498 -2.0833333333333329e-03 2621 3630 -4.1666666666666666e-03 2621 3358 2.0833333333333329e-03 2621 3634 2.0833333333333329e-03 2621 3196 -2.0833333333333329e-03 2621 3195 -2.0833333333333329e-03 2621 3359 4.1666666666666666e-03 2621 2622 4.1666666666666657e-03 2621 2619 -2.0833333333333333e-03 2622 2622 5.4166666666666655e-02 2622 3491 1.0416666666666667e-03 2622 3198 -9.3749999999999997e-03 2622 3171 2.1705219273391446e-19 2622 2628 1.6104213909672385e-19 2622 3191 1.0416666666666667e-03 2622 3197 -6.2500000000000003e-03 2622 3333 -1.0416666666666667e-03 2622 2618 4.1666666666666666e-03 2622 3169 1.0416666666666668e-02 2622 3190 9.3749999999999997e-03 2622 3168 5.0116116045879435e-20 2622 2624 1.5502688168223823e-19 2622 2627 -1.4886604047994328e-19 2622 3196 -8.3333333333333315e-03 2622 3195 -6.2500000000000003e-03 2622 3359 1.0416666666666667e-03 2622 2619 1.5502688168223823e-19 2622 2621 4.1666666666666666e-03 2623 2623 1.0416666666666664e-02 2624 2624 4.9999999999999989e-02 2624 3172 -6.2499999999999986e-03 2624 3180 6.2499999999999986e-03 2624 3492 5.2083333333333322e-03 2624 3198 4.9904357809065860e-20 2624 3171 -6.2499999999999986e-03 2624 2628 1.0416666666666664e-03 2624 3169 -2.3039296165316969e-19 2624 3190 -2.1684043449710089e-19 2624 2622 8.1315162936412833e-20 2624 3188 -5.2083333333333330e-03 2624 3168 -6.2499999999999986e-03 2624 2627 1.0416666666666673e-03 2624 3179 6.2499999999999986e-03 2624 3173 -7.3183646642771549e-19 2624 3178 -6.2499999999999986e-03 2625 2625 2.0833333333333332e-02 2626 2626 4.5833333333333323e-02 2627 2627 2.2916666666666662e-02 2627 3187 -1.0416666666666664e-03 2627 3197 -1.0416666666666664e-03 2627 3191 -6.2500000000000003e-03 2627 2618 -2.0833333333333329e-03 2627 3169 -2.1684043449710089e-19 2627 3190 -1.0416666666666680e-03 2627 3179 1.6263032587282567e-19 2627 2624 1.0416666666666671e-03 2627 3188 -4.3368086899420177e-19 2627 3168 1.0416666666666667e-03 2628 2628 2.2916666666666662e-02 2628 3195 -1.0416666666666664e-03 2628 3498 -1.0416666666666664e-03 2628 3491 -6.2500000000000003e-03 2628 2621 -2.0833333333333329e-03 2628 3180 -2.1684043449710089e-19 2628 3492 -6.5052130349130266e-19 2628 3169 2.1684043449710089e-19 2628 2622 2.3039296165316969e-19 2628 2624 1.0416666666666667e-03 2628 3198 1.0416666666666667e-03 2628 3171 1.0416666666666671e-03 2629 2629 4.5833333333333323e-02 2630 2630 1.0416666666666664e-02 2631 2631 1.2499999999999999e-02 2632 2632 1.2500000000000001e-02 2633 2633 4.9999999999999989e-02 2633 3217 -5.2083333333333339e-03 2633 3322 -4.1666666666666666e-03 2633 3223 -2.1684043449710089e-19 2633 3205 -1.2499999999999999e-02 2633 3501 3.1249999999999997e-03 2633 2646 -1.0416666666666654e-03 2633 3208 -8.6736173798840355e-19 2633 3258 1.0416666666666664e-03 2633 3207 -1.0416666666666664e-02 2633 2643 5.2083333333333330e-03 2633 2642 -4.1666666666666657e-03 2633 3202 -1.0416666666666669e-03 2633 3506 5.2083333333333322e-03 2633 3201 -8.3333333333333315e-03 2633 2637 6.2500000000000003e-03 2633 2639 -4.3368086899420177e-19 2633 3216 -2.1684043449710089e-19 2633 3200 -2.1684043449710089e-19 2633 3199 -1.0416666666666671e-03 2633 2635 6.5052130349130266e-19 2633 2634 6.2499999999999986e-03 2634 2634 3.1249999999999993e-02 2634 3317 -1.0416666666666664e-03 2634 3224 -1.0416666666666662e-03 2634 3219 -6.2500000000000003e-03 2634 2651 -2.0833333333333329e-03 2634 3207 -5.2083333333333330e-03 2634 3220 -2.0833333333333337e-03 2634 2645 1.3552527156068805e-20 2634 3261 1.0416666666666664e-03 2634 3217 -1.0416666666666666e-02 2634 2642 -4.1666666666666657e-03 2634 3216 -1.0416666666666667e-03 2634 3200 -2.1684043449710089e-19 2634 3199 1.0416666666666671e-03 2634 2635 8.1315162936412833e-20 2634 2633 6.2499999999999986e-03 2635 2635 5.4166666666666655e-02 2635 3373 -1.0416666666666667e-03 2635 3221 -6.2500000000000003e-03 2635 3371 -1.0416666666666667e-03 2635 2654 4.1666666666666666e-03 2635 3219 1.0416666666666667e-03 2635 3222 -8.3333333333333315e-03 2635 3224 -6.2500000000000003e-03 2635 3383 -1.0416666666666667e-03 2635 2652 1.5502688168223823e-19 2635 2651 4.1666666666666666e-03 2635 3223 -9.3749999999999997e-03 2635 2637 1.5502688168223823e-19 2635 3202 -2.1705219273391446e-19 2635 3216 9.3749999999999997e-03 2635 3200 1.0416666666666668e-02 2635 3199 -5.0116116045879435e-20 2635 2634 1.5502688168223823e-19 2635 2633 4.6263880787845817e-19 2636 2636 4.9999999999999989e-02 2636 3322 -4.1666666666666657e-03 2636 3321 2.1684043449710089e-19 2636 2643 5.2083333333333330e-03 2636 3295 1.0416666666666664e-03 2636 3506 5.2083333333333339e-03 2636 3527 -2.1684043449710089e-19 2636 3507 8.3333333333333332e-03 2636 3502 1.2499999999999999e-02 2636 3501 3.1249999999999997e-03 2636 2639 8.6736173798840355e-19 2636 2646 -1.0416666666666671e-03 2636 3515 -1.0416666666666667e-03 2636 3288 5.2083333333333330e-03 2636 3287 1.0416666666666666e-02 2636 2641 6.2500000000000003e-03 2636 2640 -4.1666666666666657e-03 2636 3524 -2.1684043449710089e-19 2636 3513 -6.5052130349130266e-19 2636 3512 -1.0416666666666669e-03 2636 2638 2.1684043449710089e-19 2636 2637 6.2499999999999986e-03 2637 2637 3.7499999999999992e-02 2637 3221 -1.0416666666666664e-03 2637 3380 1.0416666666666664e-03 2637 3371 6.2500000000000003e-03 2637 2654 -2.0833333333333329e-03 2637 3223 1.0416666666666673e-03 2637 2635 8.1315162936412833e-20 2637 3200 -4.9904357809065860e-20 2637 3507 5.2083333333333330e-03 2637 3202 1.0416666666666671e-03 2637 3506 1.4583333333333332e-02 2637 3201 -5.2083333333333330e-03 2637 2633 6.2499999999999995e-03 2637 2639 -6.2499999999999986e-03 2637 3524 -1.0416666666666673e-03 2637 3513 -2.1684043449710089e-19 2637 3512 1.0416666666666669e-03 2637 2638 1.3552527156068805e-20 2637 2636 6.2499999999999986e-03 2638 2638 5.4166666666666655e-02 2638 3669 1.0416666666666667e-03 2638 3525 -6.2500000000000003e-03 2638 3528 1.0416666666666667e-03 2638 2656 4.1666666666666666e-03 2638 3371 -1.0416666666666667e-03 2638 3526 -8.3333333333333315e-03 2638 3380 6.2500000000000003e-03 2638 3374 -1.0416666666666667e-03 2638 2655 -8.8991399020904929e-20 2638 2654 4.1666666666666666e-03 2638 3527 -9.3749999999999997e-03 2638 2641 -8.8991399020904929e-20 2638 3515 -2.1705219273391446e-19 2638 3524 9.3749999999999997e-03 2638 3513 1.0416666666666668e-02 2638 3512 5.0116116045879435e-20 2638 2637 -8.8991399020904929e-20 2638 2636 1.0116749763768550e-19 2639 2639 3.3333333333333326e-02 2639 3205 -4.1666666666666666e-03 2639 3512 8.8938459461701536e-21 2639 3507 -4.1666666666666666e-03 2639 3502 4.1666666666666657e-03 2639 3501 1.6666666666666663e-02 2639 2636 4.3368086899420177e-19 2639 2646 -6.2499999999999986e-03 2639 3202 2.8940292364521927e-21 2639 3506 -4.1666666666666657e-03 2639 3201 4.1666666666666675e-03 2639 2637 -6.2499999999999986e-03 2639 2633 -4.3368086899420177e-19 2640 2640 2.2916666666666662e-02 2640 3609 2.0833333333333329e-03 2640 3324 -2.0833333333333329e-03 2640 3289 -4.1666666666666666e-03 2640 2648 -2.0833333333333333e-03 2640 3531 2.0833333333333329e-03 2640 3290 2.0833333333333329e-03 2640 2649 4.1666666666666657e-03 2640 3321 -2.0833333333333329e-03 2640 2643 4.1666666666666657e-03 2640 3295 2.0833333333333329e-03 2640 3515 -2.8940292364521927e-21 2640 3288 -4.1666666666666675e-03 2640 3287 -4.1666666666666666e-03 2640 2641 -4.1666666666666666e-03 2640 2636 -4.1666666666666657e-03 2641 2641 3.1249999999999993e-02 2641 3621 -1.0416666666666662e-03 2641 3525 -1.0416666666666664e-03 2641 3528 -6.2500000000000003e-03 2641 2656 -2.0833333333333329e-03 2641 3531 -2.0833333333333337e-03 2641 3290 1.0416666666666664e-03 2641 2649 8.1315162936412833e-20 2641 3527 1.0416666666666673e-03 2641 2638 1.3552527156068805e-20 2641 3513 3.2249014814734037e-20 2641 3515 1.0416666666666669e-03 2641 3288 1.0416666666666666e-02 2641 3287 5.2083333333333330e-03 2641 2636 6.2499999999999995e-03 2641 2640 -4.1666666666666666e-03 2642 2642 2.2916666666666662e-02 2642 3199 4.5316262678105068e-20 2642 3220 2.0833333333333329e-03 2642 2634 -4.1666666666666657e-03 2642 3217 4.1666666666666657e-03 2642 3315 2.0833333333333329e-03 2642 3314 2.0833333333333329e-03 2642 3261 2.0833333333333329e-03 2642 3256 -4.1666666666666666e-03 2642 2645 4.1666666666666657e-03 2642 2644 -2.0833333333333333e-03 2642 3208 2.0833333333333329e-03 2642 3258 2.0833333333333329e-03 2642 3207 4.1666666666666666e-03 2642 2643 4.1666666666666657e-03 2642 2633 -4.1666666666666657e-03 2643 2643 7.9166666666666649e-02 2643 3313 1.0416666666666667e-03 2643 3289 -1.0416666666666667e-03 2643 3324 -8.3333333333333315e-03 2643 2648 -8.8991399020904929e-20 2643 3323 -6.2500000000000003e-03 2643 3541 -1.0416666666666667e-03 2643 2647 4.1666666666666666e-03 2643 3502 3.1249999999999997e-03 2643 3322 -1.6666666666666666e-02 2643 3205 -3.1249999999999997e-03 2643 2646 2.0833333333333337e-03 2643 3321 -7.2916666666666659e-03 2643 2636 5.2083333333333322e-03 2643 3295 6.2500000000000003e-03 2643 3287 -1.0416666666666667e-03 2643 2640 4.1666666666666666e-03 2643 3315 8.3333333333333315e-03 2643 2644 1.5502688168223823e-19 2643 3256 -1.0416666666666667e-03 2643 3208 7.2916666666666659e-03 2643 3258 6.2500000000000003e-03 2643 3207 1.0416666666666667e-03 2643 2633 5.2083333333333330e-03 2643 2642 4.1666666666666666e-03 2644 2644 2.5000000000000001e-02 2644 3316 -1.0416666666666664e-03 2644 3323 -1.0416666666666664e-03 2644 3313 -6.2500000000000003e-03 2644 2647 -2.0833333333333329e-03 2644 3315 -2.0833333333333337e-03 2644 2643 8.1315162936412833e-20 2644 3258 1.0416666666666664e-03 2644 3314 -2.0833333333333337e-03 2644 3261 1.0416666666666664e-03 2644 3256 6.2500000000000003e-03 2644 2645 1.3552527156068805e-20 2644 2642 -2.0833333333333329e-03 2645 2645 6.6666666666666652e-02 2645 3662 -1.0416666666666667e-03 2645 3317 -6.2500000000000003e-03 2645 3219 1.0416666666666667e-03 2645 2651 4.1666666666666666e-03 2645 3622 1.0416666666666667e-03 2645 3318 -8.3333333333333315e-03 2645 3320 -6.2500000000000003e-03 2645 3692 -1.0416666666666667e-03 2645 2659 -8.8991399020904929e-20 2645 2658 4.1666666666666666e-03 2645 3313 1.0416666666666667e-03 2645 3319 -8.3333333333333315e-03 2645 3316 -6.2500000000000003e-03 2645 3543 -1.0416666666666667e-03 2645 2650 -8.8991399020904929e-20 2645 2647 4.1666666666666666e-03 2645 3220 8.3333333333333315e-03 2645 2634 -8.8991399020904929e-20 2645 3217 1.0416666666666667e-03 2645 3314 8.3333333333333315e-03 2645 3261 6.2500000000000003e-03 2645 3256 -1.0416666666666667e-03 2645 2644 -8.8991399020904929e-20 2645 2642 4.1666666666666666e-03 2646 2646 1.6666666666666663e-02 2646 3321 -1.0416666666666664e-03 2646 3208 1.0416666666666667e-03 2646 2643 2.0833333333333337e-03 2646 3322 -6.2499999999999986e-03 2646 3201 -1.0416666666666664e-03 2646 2633 -1.0416666666666656e-03 2646 3205 -1.0416666666666671e-03 2646 3507 1.0416666666666667e-03 2646 3502 1.0416666666666654e-03 2646 3501 -2.0833333333333337e-03 2646 2636 -1.0416666666666671e-03 2646 2639 -6.2499999999999986e-03 2647 2647 2.4999999999999994e-02 2647 3314 2.0833333333333329e-03 2647 3315 2.0833333333333329e-03 2647 3313 4.1666666666666666e-03 2647 2644 -2.0833333333333333e-03 2647 3319 -2.0833333333333329e-03 2647 3316 -2.0833333333333329e-03 2647 2645 4.1666666666666657e-03 2647 3620 -2.0833333333333329e-03 2647 2650 -2.0833333333333333e-03 2647 3543 -4.1666666666666666e-03 2647 3324 -2.0833333333333329e-03 2647 2643 4.1666666666666657e-03 2647 3323 -2.0833333333333329e-03 2647 3609 2.0833333333333329e-03 2647 3548 2.0833333333333329e-03 2647 3541 -4.1666666666666666e-03 2647 2649 4.1666666666666657e-03 2647 2648 -2.0833333333333333e-03 2648 2648 2.4999999999999998e-02 2648 3290 1.0416666666666664e-03 2648 3295 1.0416666666666664e-03 2648 3289 6.2500000000000003e-03 2648 2640 -2.0833333333333329e-03 2648 3324 2.0833333333333337e-03 2648 2643 1.3552527156068805e-20 2648 3323 -1.0416666666666664e-03 2648 3609 -2.0833333333333333e-03 2648 3548 1.0416666666666664e-03 2648 3541 6.2500000000000003e-03 2648 2649 8.1315162936412833e-20 2648 2647 -2.0833333333333329e-03 2649 2649 6.6666666666666652e-02 2649 3688 1.0416666666666667e-03 2649 3618 -6.2500000000000003e-03 2649 3622 1.0416666666666667e-03 2649 2658 4.1666666666666666e-03 2649 3528 1.0416666666666667e-03 2649 3619 -8.3333333333333315e-03 2649 3621 -6.2500000000000003e-03 2649 3674 -1.0416666666666667e-03 2649 2657 1.5502688168223823e-19 2649 2656 4.1666666666666666e-03 2649 3289 -1.0416666666666667e-03 2649 3531 8.3333333333333315e-03 2649 3290 6.2500000000000003e-03 2649 3288 -1.0416666666666667e-03 2649 2641 1.5502688168223823e-19 2649 2640 4.1666666666666666e-03 2649 3620 -8.3333333333333315e-03 2649 2650 1.5502688168223823e-19 2649 3543 -1.0416666666666667e-03 2649 3609 8.3333333333333315e-03 2649 3548 6.2500000000000003e-03 2649 3541 -1.0416666666666667e-03 2649 2648 1.5502688168223823e-19 2649 2647 4.1666666666666666e-03 2650 2650 2.4999999999999998e-02 2650 3618 -1.0416666666666664e-03 2650 3320 -1.0416666666666664e-03 2650 3622 -6.2500000000000003e-03 2650 2658 -2.0833333333333329e-03 2650 3319 2.0833333333333337e-03 2650 3316 -1.0416666666666664e-03 2650 2645 1.3552527156068805e-20 2650 3620 2.0833333333333337e-03 2650 2649 8.1315162936412833e-20 2650 3548 1.0416666666666662e-03 2650 3543 6.2500000000000003e-03 2650 2647 -2.0833333333333329e-03 2651 2651 2.4999999999999994e-02 2651 3318 -2.0833333333333329e-03 2651 3668 -2.0833333333333329e-03 2651 3662 -4.1666666666666666e-03 2651 2659 -2.0833333333333333e-03 2651 3220 2.0833333333333329e-03 2651 3317 -2.0833333333333329e-03 2651 2645 4.1666666666666657e-03 2651 3216 2.0833333333333329e-03 2651 2634 -2.0833333333333333e-03 2651 3219 4.1666666666666666e-03 2651 3384 2.0833333333333329e-03 2651 2653 4.1666666666666657e-03 2651 3663 2.0833333333333329e-03 2651 3222 -2.0833333333333329e-03 2651 3224 -2.0833333333333329e-03 2651 3383 -4.1666666666666666e-03 2651 2635 4.1666666666666657e-03 2651 2652 -2.0833333333333333e-03 2652 2652 2.4999999999999998e-02 2652 3221 -1.0416666666666664e-03 2652 3379 1.0416666666666664e-03 2652 3373 6.2500000000000003e-03 2652 2654 -2.0833333333333329e-03 2652 3384 -2.0833333333333337e-03 2652 2653 1.3552527156068805e-20 2652 3663 1.0416666666666664e-03 2652 3222 2.0833333333333333e-03 2652 3224 -1.0416666666666664e-03 2652 3383 6.2500000000000003e-03 2652 2635 8.1315162936412833e-20 2652 2651 -2.0833333333333329e-03 2653 2653 6.6666666666666652e-02 2653 3688 1.0416666666666667e-03 2653 3662 -1.0416666666666667e-03 2653 3668 -8.3333333333333315e-03 2653 2659 1.5502688168223823e-19 2653 3667 -6.2500000000000003e-03 2653 3692 -1.0416666666666667e-03 2653 2658 4.1666666666666666e-03 2653 3666 -8.3333333333333315e-03 2653 2657 -8.8991399020904929e-20 2653 3674 -1.0416666666666667e-03 2653 3373 -1.0416666666666667e-03 2653 3665 -6.2500000000000003e-03 2653 3669 1.0416666666666667e-03 2653 2656 4.1666666666666666e-03 2653 3664 -8.3333333333333315e-03 2653 2655 1.5502688168223823e-19 2653 3379 6.2500000000000003e-03 2653 3374 -1.0416666666666667e-03 2653 2654 4.1666666666666666e-03 2653 3384 8.3333333333333315e-03 2653 2652 -8.8991399020904929e-20 2653 3663 6.2500000000000003e-03 2653 3383 -1.0416666666666667e-03 2653 2651 4.1666666666666666e-03 2654 2654 2.4999999999999994e-02 2654 3222 -2.0833333333333329e-03 2654 3384 2.0833333333333329e-03 2654 3373 -4.1666666666666666e-03 2654 2652 -2.0833333333333333e-03 2654 3223 -2.0833333333333329e-03 2654 3221 -2.0833333333333329e-03 2654 2635 4.1666666666666657e-03 2654 3524 2.0833333333333329e-03 2654 2637 -2.0833333333333333e-03 2654 3371 -4.1666666666666666e-03 2654 3664 -2.0833333333333329e-03 2654 2653 4.1666666666666657e-03 2654 3379 2.0833333333333329e-03 2654 3526 -2.0833333333333329e-03 2654 3380 2.0833333333333329e-03 2654 3374 -4.1666666666666666e-03 2654 2638 4.1666666666666657e-03 2654 2655 -2.0833333333333333e-03 2655 2655 2.5000000000000001e-02 2655 3525 -1.0416666666666664e-03 2655 3665 -1.0416666666666664e-03 2655 3669 -6.2500000000000003e-03 2655 2656 -2.0833333333333329e-03 2655 3664 2.0833333333333337e-03 2655 2653 8.1315162936412833e-20 2655 3379 1.0416666666666664e-03 2655 3526 2.0833333333333337e-03 2655 3380 1.0416666666666664e-03 2655 3374 6.2500000000000003e-03 2655 2638 1.3552527156068805e-20 2655 2654 -2.0833333333333329e-03 2656 2656 2.4999999999999994e-02 2656 3531 2.0833333333333329e-03 2656 3666 -2.0833333333333329e-03 2656 3619 -2.0833333333333329e-03 2656 3621 -2.0833333333333329e-03 2656 3674 -4.1666666666666666e-03 2656 2649 4.1666666666666657e-03 2656 2657 -2.0833333333333333e-03 2656 3526 -2.0833333333333329e-03 2656 3664 -2.0833333333333329e-03 2656 3665 -2.0833333333333329e-03 2656 3669 4.1666666666666666e-03 2656 2653 4.1666666666666657e-03 2656 2655 -2.0833333333333333e-03 2656 3527 -2.0833333333333329e-03 2656 3525 -2.0833333333333329e-03 2656 3528 4.1666666666666666e-03 2656 2638 4.1666666666666657e-03 2656 2641 -2.0833333333333333e-03 2657 2657 2.4999999999999998e-02 2657 3618 -1.0416666666666664e-03 2657 3667 -1.0416666666666664e-03 2657 3688 -6.2500000000000003e-03 2657 2658 -2.0833333333333329e-03 2657 3666 2.0833333333333337e-03 2657 2653 1.3552527156068805e-20 2657 3665 -1.0416666666666664e-03 2657 3619 2.0833333333333333e-03 2657 3621 -1.0416666666666664e-03 2657 3674 6.2500000000000003e-03 2657 2649 8.1315162936412833e-20 2657 2656 -2.0833333333333329e-03 2658 2658 2.4999999999999994e-02 2658 3619 -2.0833333333333329e-03 2658 3666 -2.0833333333333329e-03 2658 3688 4.1666666666666666e-03 2658 2657 -2.0833333333333333e-03 2658 3620 -2.0833333333333329e-03 2658 3618 -2.0833333333333329e-03 2658 2649 4.1666666666666657e-03 2658 3319 -2.0833333333333329e-03 2658 2650 -2.0833333333333333e-03 2658 3622 4.1666666666666666e-03 2658 3668 -2.0833333333333329e-03 2658 2653 4.1666666666666657e-03 2658 3667 -2.0833333333333329e-03 2658 3318 -2.0833333333333329e-03 2658 3320 -2.0833333333333329e-03 2658 3692 -4.1666666666666666e-03 2658 2645 4.1666666666666657e-03 2658 2659 -2.0833333333333333e-03 2659 2659 2.5000000000000001e-02 2659 3317 -1.0416666666666664e-03 2659 3663 1.0416666666666664e-03 2659 3662 6.2500000000000003e-03 2659 2651 -2.0833333333333329e-03 2659 3668 2.0833333333333337e-03 2659 2653 8.1315162936412833e-20 2659 3667 -1.0416666666666664e-03 2659 3318 2.0833333333333337e-03 2659 3320 -1.0416666666666664e-03 2659 3692 6.2500000000000003e-03 2659 2645 1.3552527156068805e-20 2659 2658 -2.0833333333333329e-03 2660 2660 2.4999999999999994e-02 2660 3223 -2.0833333333333329e-03 2660 3389 -2.0833333333333329e-03 2660 3371 -4.1666666666666666e-03 2660 2672 -2.0833333333333333e-03 2660 3387 2.0833333333333329e-03 2660 2670 4.1666666666666657e-03 2660 3368 2.0833333333333329e-03 2660 3385 2.0833333333333329e-03 2660 3367 -4.1666666666666666e-03 2660 2669 -2.0833333333333333e-03 2660 3382 2.0833333333333329e-03 2660 2668 4.1666666666666657e-03 2660 3377 2.0833333333333329e-03 2660 3222 -2.0833333333333329e-03 2660 3221 -2.0833333333333329e-03 2660 3373 -4.1666666666666666e-03 2660 2662 4.1666666666666657e-03 2660 2661 -2.0833333333333333e-03 2661 2661 2.4999999999999998e-02 2661 3382 -2.0833333333333337e-03 2661 3383 6.2500000000000003e-03 2661 2674 -2.0833333333333329e-03 2661 3224 -1.0416666666666664e-03 2661 2668 1.3552527156068805e-20 2661 3377 1.0416666666666664e-03 2661 3222 2.0833333333333333e-03 2661 3221 -1.0416666666666664e-03 2661 3373 6.2500000000000003e-03 2661 2662 8.1315162936412833e-20 2661 2660 -2.0833333333333329e-03 2661 1012 1.0416666666666664e-03 2662 2662 5.4166666666666655e-02 2662 3371 -1.0416666666666667e-03 2662 3219 1.0416666666666667e-03 2662 3224 -6.2500000000000003e-03 2662 3383 -1.0416666666666667e-03 2662 2674 4.1666666666666666e-03 2662 3223 -9.3749999999999997e-03 2662 3202 2.1705219273391446e-19 2662 2672 4.7726997855329612e-19 2662 3200 1.0416666666666668e-02 2662 3216 9.3750000000000014e-03 2662 3199 -5.0116116045879435e-20 2662 2664 1.5502688168223823e-19 2662 2667 1.4039571100740028e-19 2662 3222 -8.3333333333333315e-03 2662 3221 -6.2500000000000003e-03 2662 3373 -1.0416666666666667e-03 2662 2661 1.5502688168223823e-19 2662 2660 4.1666666666666666e-03 2663 2663 1.6666666666666663e-02 2663 3212 1.3552527156068805e-19 2663 3215 -1.3552527156068805e-19 2663 3066 1.0416666666666662e-03 2663 2671 -1.0416666666666662e-03 2663 3209 -1.6263032587282567e-19 2663 3064 1.0416666666666658e-03 2663 2666 -1.0416666666666669e-03 2663 3204 2.1684043449710089e-19 2663 2665 1.0842021724855044e-18 2663 2664 1.0416666666666667e-03 2663 3058 1.0842021724855044e-19 2663 3063 -1.0416666666666671e-03 2664 2664 4.9999999999999989e-02 2664 3211 -2.1684043449710089e-19 2664 3390 5.2083333333333330e-03 2664 3203 -6.2499999999999986e-03 2664 2673 1.0416666666666673e-03 2664 3210 6.2499999999999986e-03 2664 3389 -5.2083333333333322e-03 2664 2670 1.4583333333333330e-02 2664 3223 4.9904357809065860e-20 2664 3202 -6.2499999999999986e-03 2664 2672 1.0416666666666664e-03 2664 3200 -2.3039296165316969e-19 2664 3216 -2.1684043449710089e-19 2664 2662 8.1315162936412833e-20 2664 3214 -5.2083333333333330e-03 2664 3199 -6.2499999999999986e-03 2664 2667 1.0416666666666673e-03 2664 3209 6.2499999999999986e-03 2664 3064 5.2083333333333322e-03 2664 2666 1.4583333333333330e-02 2664 3204 -7.3183646642771549e-19 2664 2665 1.3552527156068805e-20 2664 3058 3.2249014814734037e-20 2664 3063 6.2499999999999986e-03 2664 2663 1.0416666666666664e-03 2665 2665 4.1666666666666657e-02 2665 3211 8.3333333333333332e-03 2665 2673 7.8085849825005813e-20 2665 3212 1.0416666666666664e-03 2665 2671 5.2083333333333330e-03 2665 3203 -5.0116116045879435e-20 2665 3066 2.0833333333333333e-03 2665 3204 1.0416666666666666e-02 2665 2664 -8.8991399020904929e-20 2665 3058 8.3333333333333350e-03 2665 3063 -2.1705219273391446e-19 2665 2663 7.9658154733346608e-19 2665 980 2.0833333333333333e-03 2665 986 -1.0416666666666664e-03 2665 985 -2.0833333333333329e-03 2665 316 5.2083333333333330e-03 2665 977 -2.0833333333333329e-03 2665 981 6.2500000000000003e-03 2665 314 2.6745065309554533e-19 2666 2666 5.6250000104166656e-02 2666 3213 6.2500000000000003e-03 2666 2674 4.1666666666666666e-03 2666 3215 1.0416666666666664e-03 2666 2671 5.2083333333333330e-03 2666 3219 1.0416666666666667e-03 2666 3066 2.0833333333333329e-03 2666 3214 -1.3541666666666665e-02 2666 3199 -5.2083333333333330e-03 2666 2667 -1.0416666666666662e-03 2666 3209 4.1666666666666675e-03 2666 3064 1.2499999999999997e-02 2666 3063 5.2083333333333330e-03 2666 2664 1.4583333333333330e-02 2666 2663 -1.0416666666666669e-03 2666 975 2.0833333333333326e-11 2666 979 1.0416666666666665e-11 2666 319 5.2083333333333328e-11 2666 1019 2.0833333333333329e-11 2666 978 -4.1666666979166666e-03 2666 1011 -1.0416666666666667e-03 2666 322 -7.4433015019684602e-20 2666 973 2.0833333333333333e-03 2666 970 3.1250000312499997e-03 2666 321 4.0414059347091638e-19 2667 2667 2.2916666666666662e-02 2667 3213 1.0416666666666664e-03 2667 3224 -1.0416666666666664e-03 2667 3219 -6.2500000000000003e-03 2667 2674 -2.0833333333333329e-03 2667 3200 -2.1684043449710089e-19 2667 3216 -1.0416666666666675e-03 2667 3209 2.1684043449710089e-19 2667 2666 -1.0416666666666662e-03 2667 2664 1.0416666666666671e-03 2667 3199 1.0416666666666667e-03 2668 2668 3.3333333541666663e-02 2668 3385 4.1666666979166666e-03 2668 2669 7.0197859108400047e-20 2668 3382 8.3333333333333315e-03 2668 3383 -1.0416666666666667e-03 2668 2661 -8.8991399020904929e-20 2668 2674 4.1666666666666666e-03 2668 3367 -1.0416666666666667e-03 2668 3377 6.2500000000000003e-03 2668 3373 -1.0416666666666667e-03 2668 2660 4.1666666666666666e-03 2668 1063 -2.0833333333333329e-11 2668 729 -2.0833333333333329e-11 2668 1021 1.0416666666666665e-11 2668 1019 2.0833333333333329e-11 2668 319 5.2083333333333328e-11 2668 1018 4.1666666979166657e-03 2668 322 8.4829026136728466e-20 2668 1011 -1.0416666666666667e-03 2668 727 -1.0416666666666665e-11 2668 726 -2.0833333333333326e-11 2668 1020 -6.2499999999999991e-11 2668 318 5.2083333333333328e-11 2668 317 2.1169082391605852e-27 2668 1012 6.2500000000000003e-03 2669 2669 1.2500000062500001e-02 2669 2668 4.0389678347315804e-27 2669 3385 -1.0416666666666673e-03 2669 3387 -1.0416666666666664e-03 2669 2670 1.3552525540481672e-20 2669 3368 1.0416666666666664e-03 2669 3377 1.0416666666666664e-03 2669 3367 6.2500000000000003e-03 2669 2660 -2.0833333333333329e-03 2669 727 -1.0097419586828951e-27 2669 728 1.0097419586828951e-27 2669 729 -1.0416666666666661e-11 2669 318 -1.0416666666666661e-11 2670 2670 5.6250000104166656e-02 2670 3387 4.1666666979166657e-03 2670 2669 -1.4558380268724954e-20 2670 3390 1.2499999999999999e-02 2670 2673 -1.0416666666666656e-03 2670 3371 -1.0416666666666667e-03 2670 3203 -5.2083333333333330e-03 2670 3210 4.1666666666666675e-03 2670 3389 -1.3541666666666667e-02 2670 3202 -5.2083333333333330e-03 2670 2664 1.4583333333333330e-02 2670 2672 -1.0416666666666667e-03 2670 3368 6.2500000000000003e-03 2670 3367 -1.0416666666666667e-03 2670 2660 4.1666666666666666e-03 2670 729 -2.0833333333333329e-11 2670 985 -2.0833333333333333e-03 2670 731 1.0416666666666664e-03 2670 591 2.0833333333333329e-03 2670 316 5.2083333333333330e-03 2670 728 -1.0416666666666665e-11 2670 318 5.2083333333333328e-11 2670 590 2.0833333333333329e-11 2670 583 3.1250000312499993e-03 2670 320 -1.3668993825846281e-19 2671 2671 4.9999999999999989e-02 2671 3215 4.1666666666666657e-03 2671 2666 5.2083333333333322e-03 2671 3212 4.1666666666666657e-03 2671 2665 5.2083333333333322e-03 2671 3058 2.0833333333333329e-03 2671 3066 1.0416666666666664e-02 2671 3064 2.0833333333333329e-03 2671 2663 -1.0416666666666662e-03 2671 713 -2.0833333333333329e-03 2671 970 2.0833333333333329e-03 2671 721 4.1666666666666657e-03 2671 973 1.0416666666666664e-02 2671 717 -2.0833333333333329e-03 2671 315 5.2083333333333322e-03 2671 321 -1.0416666666666664e-03 2671 977 -1.0416666666666664e-02 2671 981 2.0833333333333329e-03 2671 314 -1.0416666666666664e-03 2672 2672 2.2916666666666662e-02 2672 3221 -1.0416666666666662e-03 2672 3368 1.0416666666666664e-03 2672 3371 6.2500000000000003e-03 2672 2660 -2.0833333333333329e-03 2672 3210 -1.6263032587282567e-19 2672 3389 1.0842021724855044e-18 2672 2670 -1.0416666666666669e-03 2672 3200 2.1684043449710089e-19 2672 2662 7.3183646642771549e-19 2672 2664 1.0416666666666667e-03 2672 3223 1.0416666666666664e-03 2672 3202 1.0416666666666671e-03 2673 2673 1.6666666666666663e-02 2673 2670 -1.0416666666666656e-03 2673 3211 -7.5894152073985310e-19 2673 3204 -2.1684043449710089e-19 2673 3210 2.1684043449710089e-19 2673 2664 1.0416666666666671e-03 2673 3390 1.0416666666666667e-03 2673 3203 1.0416666666666667e-03 2673 731 1.0842021724855044e-19 2673 986 1.0842021724855044e-19 2673 985 -1.0416666666666662e-03 2673 316 -1.0416666666666662e-03 2674 2674 2.4999999999999994e-02 2674 3213 2.0833333333333329e-03 2674 2666 4.1666666666666657e-03 2674 3382 2.0833333333333329e-03 2674 3383 -4.1666666666666666e-03 2674 2668 4.1666666666666657e-03 2674 2661 -2.0833333333333333e-03 2674 3214 -2.0833333333333329e-03 2674 3216 2.0833333333333329e-03 2674 3219 4.1666666666666666e-03 2674 2667 -2.0833333333333333e-03 2674 3222 -2.0833333333333329e-03 2674 2662 4.1666666666666657e-03 2674 3224 -2.0833333333333329e-03 2674 1018 2.0833333333333329e-03 2674 978 -2.0833333333333329e-03 2674 1011 -4.1666666666666666e-03 2674 322 -2.0833333333333333e-03 2674 1012 2.0833333333333329e-03 2675 2675 2.4999999999999994e-02 2675 3306 -2.0833333333333333e-03 2675 3275 -2.0833333333333329e-03 2675 3230 -4.1666666666666675e-03 2675 2697 -2.0833333333333329e-03 2675 3240 2.0833333333333329e-03 2675 2684 4.1666666666666657e-03 2675 3235 2.0833333333333329e-03 2675 3234 2.0833333333333329e-03 2675 2681 4.1666666666666657e-03 2675 3276 -2.0833333333333329e-03 2675 3244 -2.0833333333333329e-03 2675 3227 -4.1666666666666675e-03 2675 2693 -2.0833333333333329e-03 2675 3239 2.0833333333333329e-03 2675 3232 2.0833333333333329e-03 2675 3228 -4.1666666666666666e-03 2675 2677 4.1666666666666657e-03 2675 2676 -2.0833333333333333e-03 2676 2676 2.5000000000000001e-02 2676 3235 1.0416666666666664e-03 2676 3240 -2.0833333333333337e-03 2676 3304 -1.0416666666666664e-03 2676 2684 1.3552527156068805e-20 2676 3245 -1.0416666666666664e-03 2676 3236 -6.2500000000000003e-03 2676 2692 -2.0833333333333329e-03 2676 3239 -2.0833333333333337e-03 2676 3232 1.0416666666666664e-03 2676 3228 6.2500000000000003e-03 2676 2677 8.1315162936412833e-20 2676 2675 -2.0833333333333329e-03 2677 2677 6.0416666666666653e-02 2677 3176 1.0416666666666667e-03 2677 3175 9.3749999999999997e-03 2677 2694 1.5502688168223823e-19 2677 3174 2.1705219273391446e-19 2677 3244 -9.3750000000000014e-03 2677 3227 -1.0416666666666667e-03 2677 2693 1.0116749763768550e-19 2677 3236 1.0416666666666667e-03 2677 3247 -6.2500000000000003e-03 2677 3568 -1.0416666666666667e-03 2677 2690 4.1666666666666666e-03 2677 3246 -8.3333333333333315e-03 2677 3245 -6.2500000000000003e-03 2677 3572 1.0416666666666667e-03 2677 2691 -8.8991399020904929e-20 2677 2692 4.1666666666666666e-03 2677 3239 8.3333333333333315e-03 2677 3232 6.2499999999999995e-03 2677 3228 -1.0416666666666667e-03 2677 2676 1.5502688168223823e-19 2677 2675 4.1666666666666666e-03 2678 2678 2.4999999999999994e-02 2678 3208 2.0833333333333329e-03 2678 3206 2.0833333333333329e-03 2678 3207 4.1666666666666666e-03 2678 2698 -2.0833333333333333e-03 2678 3273 -2.0833333333333329e-03 2678 3315 2.0833333333333329e-03 2678 3258 2.0833333333333329e-03 2678 3256 -4.1666666666666666e-03 2678 2686 4.1666666666666657e-03 2678 2685 -2.0833333333333333e-03 2678 3265 2.0833333333333329e-03 2678 2681 4.1666666666666657e-03 2678 3259 2.0833333333333329e-03 2678 3266 2.0833333333333329e-03 2678 3260 2.0833333333333329e-03 2678 3253 -4.1666666666666666e-03 2678 2680 4.1666666666666657e-03 2678 2679 -2.0833333333333333e-03 2679 2679 2.2916666666666662e-02 2679 3274 2.1961093809541182e-20 2679 3276 2.1684043449710089e-19 2679 3267 -1.0416666666666671e-03 2679 2693 1.0416666666666669e-03 2679 3265 -1.0416666666666667e-03 2679 2681 8.1315162936412833e-20 2679 3259 1.0416666666666662e-03 2679 3266 -6.5052130349130266e-19 2679 3260 1.0416666666666664e-03 2679 3253 6.2500000000000003e-03 2679 2680 -1.0416666666666667e-03 2679 2678 -2.0833333333333329e-03 2680 2680 7.9166666666666649e-02 2680 3267 5.2083333333333330e-03 2680 3176 1.0416666666666667e-03 2680 3177 1.3541666666666664e-02 2680 3274 -4.1666666666666675e-03 2680 3174 5.2083333333333330e-03 2680 2694 -1.0416666666666667e-03 2680 2693 1.4583333333333332e-02 2680 3539 -1.0416666666666667e-03 2680 3256 -1.0416666666666667e-03 2680 3273 -8.3333333333333315e-03 2680 3272 -6.2500000000000003e-03 2680 3313 1.0416666666666667e-03 2680 2685 -8.8991399020904929e-20 2680 2687 4.1666666666666666e-03 2680 3271 -8.3333333333333315e-03 2680 3270 -6.2500000000000003e-03 2680 3549 1.0416666666666667e-03 2680 2688 -8.8991399020904929e-20 2680 2690 4.1666666666666666e-03 2680 3266 1.3541666666666664e-02 2680 3260 6.2500000000000003e-03 2680 3253 -1.0416666666666667e-03 2680 2679 -1.0416666666666667e-03 2680 2678 4.1666666666666666e-03 2681 2681 5.4166666666666655e-02 2681 3207 1.0416666666666667e-03 2681 3206 9.3749999999999997e-03 2681 2698 1.5502688168223823e-19 2681 3205 2.1705219273391446e-19 2681 3275 -9.3750000000000014e-03 2681 3230 -1.0416666666666667e-03 2681 2697 4.6263880787845817e-19 2681 3234 6.2499999999999986e-03 2681 2675 4.1666666666666657e-03 2681 3227 -1.0416666666666664e-03 2681 3276 -9.3750000000000014e-03 2681 3267 5.0116116045879435e-20 2681 2693 4.6263880787845817e-19 2681 3265 9.3749999999999997e-03 2681 2679 1.5502688168223823e-19 2681 3259 6.2500000000000003e-03 2681 3253 -1.0416666666666667e-03 2681 2678 4.1666666666666666e-03 2682 2682 2.4999999999999994e-02 2682 3324 -2.0833333333333329e-03 2682 3305 -2.0833333333333329e-03 2682 3321 -2.0833333333333329e-03 2682 3295 2.0833333333333329e-03 2682 3287 -4.1666666666666666e-03 2682 2686 4.1666666666666657e-03 2682 2696 -2.0833333333333333e-03 2682 3300 2.0833333333333329e-03 2682 3559 -2.0833333333333329e-03 2682 3293 2.0833333333333329e-03 2682 3289 -4.1666666666666666e-03 2682 2689 4.1666666666666657e-03 2682 2695 -2.0833333333333333e-03 2682 3299 2.0833333333333329e-03 2682 3291 2.0833333333333329e-03 2682 3285 -4.1666666666666666e-03 2682 2684 4.1666666666666657e-03 2682 2683 -2.0833333333333333e-03 2683 2683 2.5000000000000001e-02 2683 3304 -1.0416666666666664e-03 2683 3293 1.0416666666666662e-03 2683 3300 -2.0833333333333337e-03 2683 3558 -1.0416666666666664e-03 2683 3297 -6.2500000000000003e-03 2683 2689 8.1315162936412833e-20 2683 2692 -2.0833333333333329e-03 2683 3299 -2.0833333333333337e-03 2683 3291 1.0416666666666664e-03 2683 3285 6.2500000000000003e-03 2683 2684 1.3552527156068805e-20 2683 2682 -2.0833333333333329e-03 2684 2684 6.0416666666666653e-02 2684 3230 -1.0416666666666664e-03 2684 3306 -9.3750000000000014e-03 2684 3502 -5.0116116045879435e-20 2684 2697 1.0116749763768550e-19 2684 3305 -9.3749999999999997e-03 2684 2696 -8.8991399020904929e-20 2684 3287 -1.0416666666666667e-03 2684 3297 1.0416666666666667e-03 2684 3235 6.2499999999999995e-03 2684 3228 -1.0416666666666667e-03 2684 2675 4.1666666666666657e-03 2684 3240 8.3333333333333315e-03 2684 3304 -6.2500000000000003e-03 2684 3236 1.0416666666666667e-03 2684 2676 -8.8991399020904929e-20 2684 2692 4.1666666666666666e-03 2684 3299 8.3333333333333315e-03 2684 3291 6.2500000000000003e-03 2684 3285 -1.0416666666666667e-03 2684 2683 -8.8991399020904929e-20 2684 2682 4.1666666666666666e-03 2685 2685 2.5000000000000001e-02 2685 3323 -1.0416666666666664e-03 2685 3260 1.0416666666666664e-03 2685 3273 2.0833333333333337e-03 2685 3272 -1.0416666666666664e-03 2685 3313 -6.2500000000000003e-03 2685 2680 1.3552527156068805e-20 2685 2687 -2.0833333333333329e-03 2685 3315 -2.0833333333333337e-03 2685 3258 1.0416666666666664e-03 2685 3256 6.2500000000000003e-03 2685 2686 8.1315162936412833e-20 2685 2678 -2.0833333333333329e-03 2686 2686 7.9166666666666649e-02 2686 3313 1.0416666666666667e-03 2686 3289 -1.0416666666666667e-03 2686 3324 -8.3333333333333315e-03 2686 3323 -6.2500000000000003e-03 2686 3541 -1.0416666666666667e-03 2686 2695 -8.8991399020904929e-20 2686 2687 4.1666666666666666e-03 2686 3502 -5.2083333333333330e-03 2686 3207 1.0416666666666667e-03 2686 3208 1.3541666666666665e-02 2686 3322 -4.1666666666666675e-03 2686 3205 5.2083333333333330e-03 2686 2698 -1.0416666666666667e-03 2686 2697 1.4583333333333332e-02 2686 3321 -1.3541666666666664e-02 2686 3295 6.2500000000000003e-03 2686 3287 -1.0416666666666667e-03 2686 2696 -1.0416666666666667e-03 2686 2682 4.1666666666666666e-03 2686 3315 8.3333333333333315e-03 2686 3258 6.2500000000000003e-03 2686 3256 -1.0416666666666667e-03 2686 2685 1.5502688168223823e-19 2686 2678 4.1666666666666666e-03 2687 2687 2.4999999999999994e-02 2687 3315 2.0833333333333329e-03 2687 3324 -2.0833333333333329e-03 2687 3323 -2.0833333333333329e-03 2687 2686 4.1666666666666657e-03 2687 3559 -2.0833333333333329e-03 2687 2695 -2.0833333333333333e-03 2687 3541 -4.1666666666666666e-03 2687 3271 -2.0833333333333329e-03 2687 3273 -2.0833333333333329e-03 2687 3272 -2.0833333333333329e-03 2687 3313 4.1666666666666666e-03 2687 2680 4.1666666666666657e-03 2687 2685 -2.0833333333333333e-03 2687 3552 2.0833333333333329e-03 2687 3545 2.0833333333333329e-03 2687 3539 -4.1666666666666666e-03 2687 2689 4.1666666666666657e-03 2687 2688 -2.0833333333333333e-03 2688 2688 2.5000000000000001e-02 2688 3272 -1.0416666666666664e-03 2688 3271 2.0833333333333337e-03 2688 3270 -1.0416666666666664e-03 2688 2680 1.3552527156068805e-20 2688 3556 -1.0416666666666662e-03 2688 3549 -6.2500000000000003e-03 2688 2690 -2.0833333333333329e-03 2688 3552 -2.0833333333333337e-03 2688 3545 1.0416666666666664e-03 2688 3539 6.2500000000000003e-03 2688 2689 8.1315162936412833e-20 2688 2687 -2.0833333333333329e-03 2689 2689 6.6666666666666652e-02 2689 3285 -1.0416666666666667e-03 2689 3541 -1.0416666666666667e-03 2689 3559 -8.3333333333333315e-03 2689 3293 6.2500000000000003e-03 2689 3289 -1.0416666666666667e-03 2689 2695 1.5502688168223823e-19 2689 2682 4.1666666666666666e-03 2689 3300 8.3333333333333315e-03 2689 3297 1.0416666666666667e-03 2689 2683 1.5502688168223823e-19 2689 3549 1.0416666666666667e-03 2689 3558 -6.2500000000000003e-03 2689 3572 1.0416666666666667e-03 2689 2692 4.1666666666666666e-03 2689 3557 -8.3333333333333315e-03 2689 3556 -6.2500000000000003e-03 2689 3568 -1.0416666666666667e-03 2689 2691 1.5502688168223823e-19 2689 2690 4.1666666666666666e-03 2689 3552 8.3333333333333315e-03 2689 3545 6.2500000000000003e-03 2689 3539 -1.0416666666666667e-03 2689 2688 1.5502688168223823e-19 2689 2687 4.1666666666666666e-03 2690 2690 2.4999999999999994e-02 2690 3177 2.0833333333333329e-03 2690 3175 2.0833333333333329e-03 2690 3176 4.1666666666666666e-03 2690 2694 -2.0833333333333333e-03 2690 3271 -2.0833333333333329e-03 2690 3270 -2.0833333333333329e-03 2690 2680 4.1666666666666657e-03 2690 3246 -2.0833333333333329e-03 2690 2677 4.1666666666666657e-03 2690 3247 -2.0833333333333329e-03 2690 3552 2.0833333333333329e-03 2690 2688 -2.0833333333333333e-03 2690 3549 4.1666666666666666e-03 2690 3557 -2.0833333333333329e-03 2690 3556 -2.0833333333333329e-03 2690 3568 -4.1666666666666666e-03 2690 2689 4.1666666666666657e-03 2690 2691 -2.0833333333333333e-03 2691 2691 2.5000000000000001e-02 2691 3247 -1.0416666666666664e-03 2691 3246 2.0833333333333337e-03 2691 3245 -1.0416666666666664e-03 2691 2677 1.3552527156068805e-20 2691 3558 -1.0416666666666664e-03 2691 3572 -6.2500000000000003e-03 2691 2692 -2.0833333333333329e-03 2691 3557 2.0833333333333333e-03 2691 3556 -1.0416666666666664e-03 2691 3568 6.2500000000000003e-03 2691 2689 8.1315162936412833e-20 2691 2690 -2.0833333333333329e-03 2692 2692 2.4999999999999994e-02 2692 3299 2.0833333333333329e-03 2692 3240 2.0833333333333329e-03 2692 3304 -2.0833333333333329e-03 2692 2684 4.1666666666666657e-03 2692 3300 2.0833333333333329e-03 2692 3297 4.1666666666666666e-03 2692 2683 -2.0833333333333333e-03 2692 3239 2.0833333333333329e-03 2692 2676 -2.0833333333333333e-03 2692 3236 4.1666666666666666e-03 2692 3246 -2.0833333333333329e-03 2692 3245 -2.0833333333333329e-03 2692 2677 4.1666666666666657e-03 2692 3557 -2.0833333333333329e-03 2692 2689 4.1666666666666657e-03 2692 2691 -2.0833333333333333e-03 2692 3558 -2.0833333333333329e-03 2692 3572 4.1666666666666666e-03 2693 2693 3.7499999999999992e-02 2693 3234 1.0416666666666667e-03 2693 3266 5.2083333333333322e-03 2693 3265 -2.1684043449710089e-19 2693 3276 1.0416666666666667e-03 2693 3267 6.2500000000000003e-03 2693 2681 6.5052130349130266e-19 2693 2679 1.0416666666666669e-03 2693 3175 2.1684043449710089e-19 2693 3177 5.2083333333333322e-03 2693 3274 -6.2499999999999986e-03 2693 3174 6.2499999999999986e-03 2693 2680 1.4583333333333332e-02 2693 2694 1.0416666666666667e-03 2693 3232 1.0416666666666664e-03 2693 3244 1.0416666666666673e-03 2693 3227 6.2499999999999995e-03 2693 2677 2.1684043449710089e-19 2693 2675 -2.0833333333333333e-03 2694 2694 2.2916666666666662e-02 2694 3270 -1.0416666666666664e-03 2694 3247 -1.0416666666666664e-03 2694 3176 -6.2500000000000003e-03 2694 2690 -2.0833333333333329e-03 2694 3175 -1.0416666666666673e-03 2694 2677 8.1315162936412833e-20 2694 3244 4.9904357809065860e-20 2694 3177 -2.1684043449710089e-19 2694 3274 1.6263032587282567e-19 2694 3174 -1.0416666666666673e-03 2694 2680 -1.0416666666666667e-03 2694 2693 1.0416666666666664e-03 2695 2695 2.5000000000000001e-02 2695 3295 1.0416666666666664e-03 2695 3324 2.0833333333333337e-03 2695 3323 -1.0416666666666664e-03 2695 2686 1.3552527156068805e-20 2695 3545 1.0416666666666664e-03 2695 3541 6.2500000000000003e-03 2695 2687 -2.0833333333333329e-03 2695 3559 2.0833333333333333e-03 2695 3293 1.0416666666666664e-03 2695 3289 6.2500000000000003e-03 2695 2689 8.1315162936412833e-20 2695 2682 -2.0833333333333329e-03 2696 2696 2.2916666666666665e-02 2696 3322 1.3773108652749614e-20 2696 3306 2.1684043449710089e-19 2696 3502 1.0416666666666673e-03 2696 2697 1.0416666666666669e-03 2696 3305 1.0416666666666671e-03 2696 2684 1.3552527156068805e-20 2696 3291 1.0416666666666664e-03 2696 3321 6.5052130349130266e-19 2696 3295 1.0416666666666664e-03 2696 3287 6.2500000000000003e-03 2696 2686 -1.0416666666666667e-03 2696 2682 -2.0833333333333329e-03 2697 2697 3.7499999999999992e-02 2697 3235 1.0416666666666667e-03 2697 3321 -5.2083333333333322e-03 2697 3305 2.1684043449710089e-19 2697 3306 1.0416666666666671e-03 2697 3502 -6.2500000000000003e-03 2697 2684 2.1684043449710089e-19 2697 2696 1.0416666666666669e-03 2697 3206 2.1684043449710089e-19 2697 3208 5.2083333333333322e-03 2697 3322 -6.2499999999999986e-03 2697 3205 6.2499999999999986e-03 2697 2686 1.4583333333333334e-02 2697 2698 1.0416666666666667e-03 2697 3234 1.0416666666666664e-03 2697 3275 1.0416666666666673e-03 2697 3230 6.2499999999999995e-03 2697 2681 6.5052130349130266e-19 2697 2675 -2.0833333333333333e-03 2698 2698 2.2916666666666662e-02 2698 3258 1.0416666666666664e-03 2698 3259 1.0416666666666664e-03 2698 3207 -6.2500000000000003e-03 2698 2678 -2.0833333333333329e-03 2698 3206 -1.0416666666666669e-03 2698 2681 8.1315162936412833e-20 2698 3275 4.9904357809065860e-20 2698 3208 -8.6736173798840355e-19 2698 3322 1.6263032587282567e-19 2698 3205 -1.0416666666666673e-03 2698 2686 -1.0416666666666669e-03 2698 2697 1.0416666666666664e-03 2699 2699 2.4999999999999994e-02 2699 3583 -4.1666666666666666e-03 2699 3238 2.0833333333333329e-03 2699 3587 2.0833333333333329e-03 2699 3584 2.0833333333333329e-03 2699 3579 -4.1666666666666666e-03 2699 3237 2.0833333333333329e-03 2699 3241 -2.0833333333333329e-03 2699 3236 4.1666666666666666e-03 2699 2700 -2.0833333333333333e-03 2700 2700 2.5000000000000001e-02 2700 3587 1.0416666666666664e-03 2700 3233 1.0416666666666664e-03 2700 3238 -2.0833333333333337e-03 2700 3229 1.0416666666666664e-03 2700 3228 6.2500000000000003e-03 2700 2702 -2.0833333333333329e-03 2700 3237 -2.0833333333333337e-03 2700 3241 -1.0416666666666664e-03 2700 3236 -6.2500000000000003e-03 2700 2699 -2.0833333333333329e-03 2701 2701 3.3333333333333326e-02 2702 2702 2.4999999999999994e-02 2702 3231 -4.1666666666666666e-03 2702 3226 2.0833333333333329e-03 2702 3225 -4.1666666666666666e-03 2702 3237 2.0833333333333329e-03 2702 3233 2.0833333333333329e-03 2702 3238 2.0833333333333329e-03 2702 3229 2.0833333333333329e-03 2702 3228 -4.1666666666666666e-03 2702 2700 -2.0833333333333333e-03 2703 2703 3.3333333333333326e-02 2704 2704 1.2499999999999999e-02 2705 2705 1.6666666666666663e-02 2706 2706 1.2500000000000001e-02 2707 2707 1.6666666666666663e-02 2708 2708 1.2499999999999999e-02 2709 2709 1.2500000000000001e-02 2710 2710 3.7499999999999992e-02 2710 3529 2.0833333333333329e-03 2710 3515 4.1666666666666657e-03 2710 2718 2.0833333333333333e-03 2710 3288 -4.1666666666666657e-03 2710 3308 -4.1666666666666657e-03 2710 3287 -1.6666666666666666e-02 2710 2721 -6.2499999999999986e-03 2710 3284 2.0833333333333329e-03 2710 3283 -4.1666666666666666e-03 2710 3282 2.0833333333333329e-03 2710 3281 -4.1666666666666675e-03 2711 2711 2.4999999999999998e-02 2712 2712 1.6666666666666663e-02 2713 2713 1.2500000000000001e-02 2714 2714 3.3333333333333326e-02 2715 2715 2.4999999999999994e-02 2715 3530 2.0833333333333329e-03 2715 3677 2.0833333333333329e-03 2715 3676 -4.1666666666666666e-03 2715 3529 2.0833333333333329e-03 2715 3612 -2.0833333333333329e-03 2715 3528 4.1666666666666666e-03 2715 2718 -2.0833333333333333e-03 2715 3532 -2.0833333333333329e-03 2715 3671 -4.1666666666666666e-03 2716 2716 1.2500000000000001e-02 2717 2717 4.5833333333333323e-02 2718 2718 3.7499999999999992e-02 2718 3532 -1.0416666666666662e-03 2718 3284 1.0416666666666664e-03 2718 3288 4.1666666666666666e-03 2718 3287 -3.1249999999999997e-03 2718 2710 2.0833333333333337e-03 2718 3530 -2.1684043449710089e-19 2718 3518 4.1666666666666657e-03 2718 3515 1.2499999999999997e-02 2718 2721 -1.0416666666666667e-03 2718 3529 -2.0833333333333337e-03 2718 3612 -1.0416666666666664e-03 2718 3528 -6.2500000000000003e-03 2718 2715 -2.0833333333333329e-03 2719 2719 1.2500000000000001e-02 2720 2720 1.6666666666666663e-02 2721 2721 1.6666666666666663e-02 2721 3288 1.0416666666666664e-03 2721 3281 1.0416666666666667e-03 2721 3287 2.0833333333333346e-03 2721 2710 -6.2499999999999986e-03 2721 3308 -1.0416666666666660e-03 2721 3530 1.0416666666666664e-03 2721 3518 6.2499999999999986e-03 2721 3515 1.0416666666666662e-03 2721 2718 -1.0416666666666667e-03 2722 2722 4.3749999999999990e-02 2722 3306 -3.2249014814734037e-20 2722 3281 5.2083333333333339e-03 2722 3305 1.0416666666666673e-03 2722 3291 1.0416666666666664e-03 2722 3287 1.0416666666666666e-02 2722 2731 1.3552527156068805e-20 2722 2728 -4.1666666666666657e-03 2722 3504 5.2083333333333330e-03 2722 3516 -1.0416666666666667e-03 2722 3507 1.4583333333333332e-02 2722 2725 -6.2499999999999986e-03 2722 3502 1.0416666666666673e-03 2722 3501 -5.2083333333333330e-03 2722 2732 6.2499999999999986e-03 2722 3514 -2.1684043449710089e-19 2722 3308 1.0416666666666669e-03 2723 2723 1.8749999999999996e-02 2724 2724 2.0833333333333329e-02 2725 2725 2.0833333333333329e-02 2725 3516 -2.8940292364521927e-21 2725 3507 -4.1666666666666675e-03 2725 2722 -6.2499999999999986e-03 2725 3502 -1.6284208410963924e-19 2725 3503 2.0833333333333329e-03 2725 3501 4.1666666666666675e-03 2725 2732 -4.1666666666666657e-03 2725 3505 2.0833333333333329e-03 2725 3504 -4.1666666666666675e-03 2726 2726 1.8749999999999996e-02 2727 2727 2.7083333333333327e-02 2728 2728 2.2916666666666662e-02 2728 3308 4.5316262678105068e-20 2728 3305 -2.0833333333333329e-03 2728 3287 -4.1666666666666666e-03 2728 2722 -4.1666666666666657e-03 2728 3281 -4.1666666666666657e-03 2728 3299 2.0833333333333329e-03 2728 2731 4.1666666666666657e-03 2728 3291 2.0833333333333329e-03 2728 3298 2.0833333333333329e-03 2728 3292 2.0833333333333329e-03 2728 3285 -4.1666666666666666e-03 2728 2729 -2.0833333333333333e-03 2729 2729 2.4999999999999998e-02 2729 3301 -1.0416666666666662e-03 2729 3304 -1.0416666666666664e-03 2729 3297 -6.2500000000000003e-03 2729 2734 -2.0833333333333329e-03 2729 3299 -2.0833333333333337e-03 2729 2731 1.3552527156068805e-20 2729 3291 1.0416666666666664e-03 2729 3298 -2.0833333333333337e-03 2729 3292 1.0416666666666664e-03 2729 3285 6.2500000000000003e-03 2729 2728 -2.0833333333333329e-03 2730 2730 3.3333333333333326e-02 2731 2731 6.0416666666666653e-02 2731 3230 -1.0416666666666667e-03 2731 3306 -9.3750000000000014e-03 2731 3502 -2.1705219273391446e-19 2731 2732 1.0116749763768550e-19 2731 3305 -9.3749999999999997e-03 2731 3287 -1.0416666666666667e-03 2731 2722 -8.8991399020904929e-20 2731 3297 1.0416666666666667e-03 2731 3235 6.2499999999999995e-03 2731 3228 -1.0416666666666667e-03 2731 2738 4.1666666666666666e-03 2731 3240 8.3333333333333315e-03 2731 2735 -8.8991399020904929e-20 2731 3304 -6.2500000000000003e-03 2731 3236 1.0416666666666667e-03 2731 2734 4.1666666666666666e-03 2731 3299 8.3333333333333315e-03 2731 2729 -8.8991399020904929e-20 2731 3291 6.2500000000000003e-03 2731 3285 -1.0416666666666667e-03 2731 2728 4.1666666666666666e-03 2732 2732 3.7499999999999992e-02 2732 3231 5.2083333333333322e-03 2732 3235 1.0416666666666664e-03 2732 3230 1.0416666666666666e-02 2732 2738 -4.1666666666666657e-03 2732 3305 -2.1684043449710089e-19 2732 2731 2.1684043449710089e-19 2732 3306 1.0416666666666673e-03 2732 3500 -1.0416666666666662e-03 2732 3507 5.2083333333333322e-03 2732 2722 6.2499999999999986e-03 2732 3502 -1.0416666666666662e-03 2732 3505 1.0416666666666664e-03 2732 3503 -1.0416666666666673e-03 2732 3501 -1.0416666666666668e-02 2732 2725 -4.1666666666666657e-03 2733 2733 1.8749999999999996e-02 2734 2734 2.4999999999999994e-02 2734 3298 2.0833333333333329e-03 2734 3299 2.0833333333333329e-03 2734 3297 4.1666666666666666e-03 2734 2729 -2.0833333333333333e-03 2734 3301 -2.0833333333333329e-03 2734 3583 -4.1666666666666666e-03 2734 3240 2.0833333333333329e-03 2734 2731 4.1666666666666657e-03 2734 3304 -2.0833333333333329e-03 2734 3238 2.0833333333333329e-03 2734 3587 2.0833333333333329e-03 2734 3236 4.1666666666666666e-03 2734 2735 -2.0833333333333333e-03 2735 2735 2.5000000000000001e-02 2735 3229 1.0416666666666664e-03 2735 3235 1.0416666666666664e-03 2735 3228 6.2500000000000003e-03 2735 2738 -2.0833333333333329e-03 2735 3240 -2.0833333333333337e-03 2735 2731 1.3552527156068805e-20 2735 3304 -1.0416666666666664e-03 2735 3238 -2.0833333333333337e-03 2735 3587 1.0416666666666664e-03 2735 3236 -6.2500000000000003e-03 2735 2734 -2.0833333333333329e-03 2736 2736 3.3333333333333326e-02 2737 2737 1.2500000000000001e-02 2738 2738 2.2916666666666662e-02 2738 3500 -2.1705219273391446e-19 2738 3306 -2.0833333333333329e-03 2738 3230 -4.1666666666666675e-03 2738 2732 -4.1666666666666657e-03 2738 3238 2.0833333333333329e-03 2738 3240 2.0833333333333329e-03 2738 3235 2.0833333333333329e-03 2738 3228 -4.1666666666666666e-03 2738 2731 4.1666666666666657e-03 2738 2735 -2.0833333333333333e-03 2738 3229 2.0833333333333329e-03 2738 3231 -4.1666666666666675e-03 2739 2739 2.4999999999999994e-02 2739 3283 -4.1666666666666666e-03 2739 3282 2.0833333333333329e-03 2739 3281 -4.1666666666666666e-03 2739 3298 2.0833333333333329e-03 2739 3292 2.0833333333333329e-03 2739 3296 2.0833333333333329e-03 2739 3286 2.0833333333333329e-03 2739 3285 -4.1666666666666666e-03 2739 2740 -2.0833333333333333e-03 2740 2740 2.5000000000000001e-02 2740 3586 1.0416666666666664e-03 2740 3292 1.0416666666666662e-03 2740 3298 -2.0833333333333337e-03 2740 3301 -1.0416666666666664e-03 2740 3297 -6.2500000000000003e-03 2740 2742 -2.0833333333333329e-03 2740 3296 -2.0833333333333337e-03 2740 3286 1.0416666666666664e-03 2740 3285 6.2500000000000003e-03 2740 2739 -2.0833333333333329e-03 2741 2741 3.3333333333333326e-02 2742 2742 2.4999999999999994e-02 2742 3583 -4.1666666666666666e-03 2742 3582 2.0833333333333329e-03 2742 3581 -4.1666666666666666e-03 2742 3296 2.0833333333333329e-03 2742 3586 2.0833333333333329e-03 2742 3298 2.0833333333333329e-03 2742 3301 -2.0833333333333329e-03 2742 3297 4.1666666666666666e-03 2742 2740 -2.0833333333333333e-03 2743 2743 3.3333333333333326e-02 2744 2744 1.2500000000000001e-02 2745 2745 1.6666666666666663e-02 2746 2746 1.2500000000000001e-02 2747 2747 1.6666666666666663e-02 2748 2748 1.2500000000000001e-02 2749 2749 1.2499999999999999e-02 2750 2750 2.4999999999999994e-02 2750 3280 2.0833333333333329e-03 2750 3278 2.0833333333333329e-03 2750 3254 -4.1666666666666666e-03 2750 2763 -2.0833333333333333e-03 2750 3218 2.0833333333333329e-03 2750 2760 4.1666666666666657e-03 2750 3255 2.0833333333333329e-03 2750 3220 2.0833333333333329e-03 2750 3217 4.1666666666666666e-03 2750 2759 -2.0833333333333333e-03 2750 3314 2.0833333333333329e-03 2750 2754 4.1666666666666657e-03 2750 3261 2.0833333333333329e-03 2750 3312 2.0833333333333329e-03 2750 3257 2.0833333333333329e-03 2750 3256 -4.1666666666666666e-03 2750 2752 4.1666666666666657e-03 2750 2751 -2.0833333333333333e-03 2751 2751 2.5000000000000001e-02 2751 3547 1.0416666666666664e-03 2751 3261 1.0416666666666664e-03 2751 3314 -2.0833333333333337e-03 2751 3316 -1.0416666666666664e-03 2751 3313 -6.2500000000000003e-03 2751 2754 1.3552527156068805e-20 2751 2753 -2.0833333333333329e-03 2751 3312 -2.0833333333333337e-03 2751 3257 1.0416666666666664e-03 2751 3256 6.2500000000000003e-03 2751 2752 8.1315162936412833e-20 2751 2750 -2.0833333333333329e-03 2752 2752 6.6666666666666652e-02 2752 3602 1.0416666666666667e-03 2752 3277 1.0416666666666667e-03 2752 3600 -6.2500000000000003e-03 2752 3625 -1.0416666666666667e-03 2752 2765 4.1666666666666666e-03 2752 3280 8.3333333333333315e-03 2752 2763 -8.8991399020904929e-20 2752 3254 -1.0416666666666667e-03 2752 3599 -8.3333333333333315e-03 2752 3537 -1.0416666666666667e-03 2752 2761 -8.8991399020904929e-20 2752 3547 6.2500000000000003e-03 2752 3313 1.0416666666666667e-03 2752 2753 4.1666666666666666e-03 2752 3598 -8.3333333333333315e-03 2752 3597 -6.2500000000000003e-03 2752 3628 -1.0416666666666667e-03 2752 2756 1.5502688168223823e-19 2752 2755 4.1666666666666666e-03 2752 3312 8.3333333333333315e-03 2752 3257 6.2500000000000003e-03 2752 3256 -1.0416666666666667e-03 2752 2751 1.5502688168223823e-19 2752 2750 4.1666666666666666e-03 2753 2753 2.4999999999999994e-02 2753 3319 -2.0833333333333329e-03 2753 3604 -2.0833333333333329e-03 2753 3543 -4.1666666666666666e-03 2753 2764 -2.0833333333333333e-03 2753 3601 2.0833333333333329e-03 2753 2762 4.1666666666666657e-03 2753 3538 2.0833333333333329e-03 2753 3599 -2.0833333333333329e-03 2753 3537 -4.1666666666666666e-03 2753 2761 -2.0833333333333333e-03 2753 3312 2.0833333333333329e-03 2753 2752 4.1666666666666657e-03 2753 3547 2.0833333333333329e-03 2753 3314 2.0833333333333329e-03 2753 3316 -2.0833333333333329e-03 2753 3313 4.1666666666666666e-03 2753 2754 4.1666666666666657e-03 2753 2751 -2.0833333333333333e-03 2754 2754 6.6666666666666652e-02 2754 3219 1.0416666666666667e-03 2754 3622 1.0416666666666667e-03 2754 3320 -6.2500000000000003e-03 2754 3692 -1.0416666666666667e-03 2754 2766 4.1666666666666666e-03 2754 3319 -8.3333333333333315e-03 2754 2764 -8.8991399020904929e-20 2754 3543 -1.0416666666666667e-03 2754 3220 8.3333333333333315e-03 2754 3217 1.0416666666666667e-03 2754 2759 -8.8991399020904929e-20 2754 3261 6.2500000000000003e-03 2754 3256 -1.0416666666666667e-03 2754 2750 4.1666666666666666e-03 2754 3318 -8.3333333333333315e-03 2754 3317 -6.2500000000000003e-03 2754 3662 -1.0416666666666667e-03 2754 2758 -8.8991399020904929e-20 2754 2757 4.1666666666666666e-03 2754 3314 8.3333333333333315e-03 2754 3316 -6.2500000000000003e-03 2754 3313 1.0416666666666667e-03 2754 2751 -8.8991399020904929e-20 2754 2753 4.1666666666666666e-03 2755 2755 2.4999999999999994e-02 2755 2762 4.1666666666666657e-03 2755 3605 2.0833333333333329e-03 2755 2756 -2.0833333333333333e-03 2755 3628 -4.1666666666666666e-03 2755 3599 -2.0833333333333329e-03 2755 3601 2.0833333333333329e-03 2755 3602 4.1666666666666666e-03 2755 2761 -2.0833333333333333e-03 2755 3598 -2.0833333333333329e-03 2755 3597 -2.0833333333333329e-03 2755 2752 4.1666666666666657e-03 2755 4526 -2.0833333333333329e-03 2755 4537 -2.0833333333333329e-03 2755 4527 -4.1666666666666666e-03 2755 3869 -2.0833333333333333e-03 2755 4534 2.0833333333333329e-03 2755 3865 4.1666666666666657e-03 2755 4532 2.0833333333333329e-03 2756 2756 2.5000000000000001e-02 2756 3628 6.2500000000000003e-03 2756 2755 -2.0833333333333329e-03 2756 3625 6.2500000000000003e-03 2756 2765 -2.0833333333333329e-03 2756 3600 -1.0416666666666664e-03 2756 3598 2.0833333333333337e-03 2756 3597 -1.0416666666666664e-03 2756 2752 8.1315162936412833e-20 2756 4532 1.0416666666666664e-03 2756 4534 -2.0833333333333337e-03 2756 4536 -1.0416666666666664e-03 2756 3865 1.3552527156068805e-20 2757 2757 2.4999999999999994e-02 2757 2760 4.1666666666666657e-03 2757 3326 2.0833333333333329e-03 2757 2758 -2.0833333333333333e-03 2757 3662 -4.1666666666666666e-03 2757 3220 2.0833333333333329e-03 2757 3218 2.0833333333333329e-03 2757 3219 4.1666666666666666e-03 2757 2759 -2.0833333333333333e-03 2757 3318 -2.0833333333333329e-03 2757 3317 -2.0833333333333329e-03 2757 2754 4.1666666666666657e-03 2757 4866 -2.0833333333333329e-03 2757 4515 -2.0833333333333329e-03 2757 4889 4.1666666666666666e-03 2757 3871 -2.0833333333333333e-03 2757 4513 -2.0833333333333329e-03 2757 3867 4.1666666666666657e-03 2757 4516 -2.0833333333333329e-03 2758 2758 2.5000000000000001e-02 2758 3662 6.2500000000000003e-03 2758 2757 -2.0833333333333329e-03 2758 3692 6.2500000000000003e-03 2758 2766 -2.0833333333333329e-03 2758 3320 -1.0416666666666664e-03 2758 3318 2.0833333333333337e-03 2758 3317 -1.0416666666666664e-03 2758 2754 1.3552527156068805e-20 2758 4516 -1.0416666666666664e-03 2758 4513 2.0833333333333337e-03 2758 4512 -1.0416666666666664e-03 2758 3867 8.1315162936412833e-20 2759 2759 2.5000000000000001e-02 2759 3317 -1.0416666666666664e-03 2759 3326 1.0416666666666664e-03 2759 3219 -6.2500000000000003e-03 2759 2757 -2.0833333333333329e-03 2759 3218 -2.0833333333333337e-03 2759 2760 8.1315162936412833e-20 2759 3255 1.0416666666666662e-03 2759 3220 -2.0833333333333337e-03 2759 3261 1.0416666666666664e-03 2759 3217 -6.2500000000000003e-03 2759 2754 1.3552527156068805e-20 2759 2750 -2.0833333333333329e-03 2760 2760 5.0000000166666655e-02 2760 3326 6.2500000000000003e-03 2760 2757 4.1666666666666666e-03 2760 3325 6.2500000000000003e-03 2760 2765 4.1666666666666666e-03 2760 3219 1.0416666666666667e-03 2760 3277 1.0416666666666667e-03 2760 3278 8.3333333333333315e-03 2760 3254 -1.0416666666666667e-03 2760 2763 1.5502688168223823e-19 2760 3218 8.3333333333333315e-03 2760 2759 1.5502688168223823e-19 2760 3255 6.2500000000000003e-03 2760 3217 1.0416666666666667e-03 2760 2750 4.1666666666666666e-03 2760 4889 1.0416666666666667e-03 2760 4865 1.0416666666666667e-03 2760 4866 -4.1666667083333324e-03 2760 4438 -1.0416666666666666e-11 2760 3871 8.4829026083874785e-20 2760 4864 4.1666667083333333e-03 2760 3870 7.0197856548546410e-20 2760 4433 6.2499999999999991e-11 2760 4432 -1.0416666666666666e-11 2760 3866 4.1666666666666665e-11 2761 2761 2.5000000000000001e-02 2761 3597 -1.0416666666666664e-03 2761 3605 1.0416666666666664e-03 2761 3602 -6.2500000000000003e-03 2761 2755 -2.0833333333333329e-03 2761 3601 -2.0833333333333333e-03 2761 2762 8.1315162936412833e-20 2761 3538 1.0416666666666664e-03 2761 3599 2.0833333333333337e-03 2761 3547 1.0416666666666664e-03 2761 3537 6.2500000000000003e-03 2761 2752 1.3552527156068805e-20 2761 2753 -2.0833333333333329e-03 2762 2762 5.0000000166666655e-02 2762 3603 6.2500000000000003e-03 2762 2766 4.1666666666666666e-03 2762 3605 6.2500000000000003e-03 2762 2755 4.1666666666666666e-03 2762 3622 1.0416666666666667e-03 2762 3602 1.0416666666666667e-03 2762 3604 -8.3333333333333315e-03 2762 3543 -1.0416666666666667e-03 2762 2764 1.5502688168223823e-19 2762 3601 8.3333333333333315e-03 2762 2761 1.5502688168223823e-19 2762 3538 6.2500000000000003e-03 2762 3537 -1.0416666666666667e-03 2762 2753 4.1666666666666666e-03 2762 4523 1.0416666666666667e-03 2762 4496 -1.0416666666666666e-11 2762 4526 -4.1666667083333324e-03 2762 3869 8.4829026083874785e-20 2762 4527 -1.0416666666666667e-03 2762 4522 4.1666667083333333e-03 2762 3868 7.0197856548546410e-20 2762 4491 6.2499999999999991e-11 2762 4490 -1.0416666666666666e-11 2762 3863 4.1666666666666665e-11 2763 2763 2.4999999999999998e-02 2763 3325 1.0416666666666664e-03 2763 3600 -1.0416666666666664e-03 2763 3277 -6.2500000000000003e-03 2763 2765 -2.0833333333333329e-03 2763 3280 -2.0833333333333337e-03 2763 2752 1.3552527156068805e-20 2763 3257 1.0416666666666664e-03 2763 3278 -2.0833333333333333e-03 2763 3255 1.0416666666666664e-03 2763 3254 6.2500000000000003e-03 2763 2760 8.1315162936412833e-20 2763 2750 -2.0833333333333329e-03 2764 2764 2.4999999999999998e-02 2764 3603 1.0416666666666662e-03 2764 3320 -1.0416666666666664e-03 2764 3622 -6.2500000000000003e-03 2764 2766 -2.0833333333333329e-03 2764 3319 2.0833333333333337e-03 2764 2754 1.3552527156068805e-20 2764 3316 -1.0416666666666664e-03 2764 3604 2.0833333333333337e-03 2764 3538 1.0416666666666664e-03 2764 3543 6.2500000000000003e-03 2764 2762 8.1315162936412833e-20 2764 2753 -2.0833333333333329e-03 2765 2765 2.4999999999999994e-02 2765 3325 2.0833333333333329e-03 2765 2760 4.1666666666666657e-03 2765 3625 -4.1666666666666666e-03 2765 2756 -2.0833333333333333e-03 2765 3278 2.0833333333333329e-03 2765 3280 2.0833333333333329e-03 2765 3277 4.1666666666666666e-03 2765 2763 -2.0833333333333333e-03 2765 3598 -2.0833333333333329e-03 2765 2752 4.1666666666666657e-03 2765 3600 -2.0833333333333329e-03 2765 4538 -2.0833333333333329e-03 2765 4864 2.0833333333333329e-03 2765 4865 4.1666666666666666e-03 2765 3870 -2.0833333333333333e-03 2765 4534 2.0833333333333329e-03 2765 4536 -2.0833333333333329e-03 2765 3865 4.1666666666666657e-03 2766 2766 2.4999999999999994e-02 2766 3603 2.0833333333333329e-03 2766 2762 4.1666666666666657e-03 2766 3692 -4.1666666666666666e-03 2766 2758 -2.0833333333333333e-03 2766 3604 -2.0833333333333329e-03 2766 3319 -2.0833333333333329e-03 2766 3622 4.1666666666666666e-03 2766 2764 -2.0833333333333333e-03 2766 3318 -2.0833333333333329e-03 2766 2754 4.1666666666666657e-03 2766 3320 -2.0833333333333329e-03 2766 4514 -2.0833333333333329e-03 2766 4522 2.0833333333333329e-03 2766 4523 4.1666666666666666e-03 2766 3868 -2.0833333333333333e-03 2766 4513 -2.0833333333333329e-03 2766 4512 -2.0833333333333329e-03 2766 3867 4.1666666666666657e-03 2767 2767 2.4999999999999994e-02 2767 3351 -2.0833333333333329e-03 2767 3361 2.0833333333333329e-03 2767 3639 -2.0833333333333329e-03 2767 3340 2.0833333333333329e-03 2767 3335 -4.1666666666666666e-03 2767 2776 4.1666666666666657e-03 2767 2777 -2.0833333333333333e-03 2767 3346 2.0833333333333329e-03 2767 3360 2.0833333333333329e-03 2767 3339 2.0833333333333329e-03 2767 3333 -4.1666666666666666e-03 2767 2771 4.1666666666666657e-03 2767 2770 -2.0833333333333333e-03 2767 3345 2.0833333333333329e-03 2767 3337 2.0833333333333329e-03 2767 3329 -4.1666666666666666e-03 2767 2769 4.1666666666666657e-03 2767 2768 -2.0833333333333333e-03 2768 2768 2.4999999999999998e-02 2768 3352 1.0416666666666662e-03 2768 3339 1.0416666666666664e-03 2768 3346 -2.0833333333333337e-03 2768 3364 -1.0416666666666664e-03 2768 3343 -6.2500000000000003e-03 2768 2771 1.3552527156068805e-20 2768 2774 -2.0833333333333329e-03 2768 3345 -2.0833333333333337e-03 2768 3337 1.0416666666666664e-03 2768 3329 6.2500000000000003e-03 2768 2769 8.1315162936412833e-20 2768 2767 -2.0833333333333329e-03 2769 2769 6.6666666666666652e-02 2769 3352 6.2500000000000003e-03 2769 2774 4.1666666666666666e-03 2769 3350 6.2500000000000003e-03 2769 2778 4.1666666666666666e-03 2769 3343 1.0416666666666667e-03 2769 3335 -1.0416666666666667e-03 2769 3351 -8.3333333333333315e-03 2769 3641 1.0416666666666667e-03 2769 2777 1.5502688168223823e-19 2769 3345 8.3333333333333315e-03 2769 3337 6.2500000000000003e-03 2769 3329 -1.0416666666666667e-03 2769 2768 1.5502688168223823e-19 2769 2767 4.1666666666666666e-03 2769 4925 -1.0416666666666667e-03 2769 4932 -8.3333333333333315e-03 2769 4528 -1.0416666666666667e-03 2769 3882 1.5502688168223823e-19 2769 4550 -1.0416666666666667e-03 2769 4582 8.3333333333333315e-03 2769 4927 6.2500000000000003e-03 2769 4580 1.0416666666666667e-03 2769 3875 1.5502688168223823e-19 2769 3880 4.1666666666666666e-03 2770 2770 2.5000000000000001e-02 2770 3365 -1.0416666666666664e-03 2770 3340 1.0416666666666664e-03 2770 3361 -2.0833333333333337e-03 2770 3633 1.0416666666666664e-03 2770 3359 -6.2500000000000003e-03 2770 2776 8.1315162936412833e-20 2770 2775 -2.0833333333333329e-03 2770 3360 -2.0833333333333337e-03 2770 3339 1.0416666666666664e-03 2770 3333 6.2500000000000003e-03 2770 2771 1.3552527156068805e-20 2770 2767 -2.0833333333333329e-03 2771 2771 6.6666666666666652e-02 2771 3359 1.0416666666666667e-03 2771 3624 -1.0416666666666667e-03 2771 3366 -8.3333333333333315e-03 2771 3365 -6.2500000000000003e-03 2771 3631 -1.0416666666666667e-03 2771 2779 -8.8991399020904929e-20 2771 2775 4.1666666666666666e-03 2771 3628 -1.0416666666666667e-03 2771 3329 -1.0416666666666667e-03 2771 3346 8.3333333333333315e-03 2771 3364 -6.2500000000000003e-03 2771 3343 1.0416666666666667e-03 2771 2768 -8.8991399020904929e-20 2771 2774 4.1666666666666666e-03 2771 3363 -8.3333333333333315e-03 2771 3362 -6.2500000000000003e-03 2771 3625 -1.0416666666666667e-03 2771 2773 -8.8991399020904929e-20 2771 2772 4.1666666666666666e-03 2771 3360 8.3333333333333315e-03 2771 3339 6.2500000000000003e-03 2771 3333 -1.0416666666666667e-03 2771 2770 -8.8991399020904929e-20 2771 2767 4.1666666666666666e-03 2772 2772 2.4999999999999994e-02 2772 2780 4.1666666666666657e-03 2772 3626 2.0833333333333329e-03 2772 2773 -2.0833333333333333e-03 2772 3625 -4.1666666666666666e-03 2772 3366 -2.0833333333333329e-03 2772 3656 2.0833333333333329e-03 2772 3624 -4.1666666666666666e-03 2772 2779 -2.0833333333333333e-03 2772 3363 -2.0833333333333329e-03 2772 3362 -2.0833333333333329e-03 2772 2771 4.1666666666666657e-03 2772 4899 2.0833333333333329e-03 2772 4535 2.0833333333333329e-03 2772 4540 -2.0833333333333329e-03 2772 4539 -2.0833333333333329e-03 2772 4895 -4.1666666666666666e-03 2772 3872 4.1666666666666657e-03 2772 3876 -2.0833333333333333e-03 2773 2773 2.5000000000000001e-02 2773 3625 6.2500000000000003e-03 2773 2772 -2.0833333333333329e-03 2773 3628 6.2500000000000003e-03 2773 2774 -2.0833333333333329e-03 2773 3364 -1.0416666666666664e-03 2773 3363 2.0833333333333337e-03 2773 3362 -1.0416666666666664e-03 2773 2771 1.3552527156068805e-20 2773 4539 -1.0416666666666664e-03 2773 4535 -2.0833333333333337e-03 2773 4531 1.0416666666666664e-03 2773 3872 8.1315162936412833e-20 2774 2774 2.4999999999999994e-02 2774 3352 2.0833333333333329e-03 2774 2769 4.1666666666666657e-03 2774 3628 -4.1666666666666666e-03 2774 2773 -2.0833333333333333e-03 2774 3345 2.0833333333333329e-03 2774 3363 -2.0833333333333329e-03 2774 3346 2.0833333333333329e-03 2774 3364 -2.0833333333333329e-03 2774 3343 4.1666666666666666e-03 2774 2771 4.1666666666666657e-03 2774 2768 -2.0833333333333333e-03 2774 4932 -2.0833333333333329e-03 2774 4544 -2.0833333333333329e-03 2774 3882 -2.0833333333333333e-03 2774 4528 -4.1666666666666666e-03 2774 4535 2.0833333333333329e-03 2774 4531 2.0833333333333329e-03 2774 3872 4.1666666666666657e-03 2775 2775 2.4999999999999994e-02 2775 2776 4.1666666666666657e-03 2775 3633 2.0833333333333329e-03 2775 3636 2.0833333333333329e-03 2775 2780 4.1666666666666657e-03 2775 3360 2.0833333333333329e-03 2775 3366 -2.0833333333333329e-03 2775 3365 -2.0833333333333329e-03 2775 2771 4.1666666666666657e-03 2775 3656 2.0833333333333329e-03 2775 2779 -2.0833333333333333e-03 2775 3631 -4.1666666666666666e-03 2775 3361 2.0833333333333329e-03 2775 3359 4.1666666666666666e-03 2775 2770 -2.0833333333333333e-03 2775 4566 -2.0833333333333329e-03 2775 4785 2.0833333333333329e-03 2775 4786 4.1666666666666666e-03 2775 3879 -2.0833333333333333e-03 2776 2776 7.9166666666666649e-02 2776 3633 6.2500000000000003e-03 2776 2775 4.1666666666666666e-03 2776 3640 6.2500000000000003e-03 2776 2778 4.1666666666666666e-03 2776 3333 -1.0416666666666667e-03 2776 3641 1.0416666666666667e-03 2776 3639 -8.3333333333333315e-03 2776 3340 6.2500000000000003e-03 2776 3335 -1.0416666666666667e-03 2776 2777 -8.8991399020904929e-20 2776 2767 4.1666666666666666e-03 2776 3361 8.3333333333333315e-03 2776 3359 1.0416666666666667e-03 2776 2770 1.5502688168223823e-19 2776 4561 5.2083333333333330e-03 2776 4786 1.0416666666666667e-03 2776 4566 -1.3541666666666665e-02 2776 4567 -4.1666666666666675e-03 2776 4784 5.2083333333333330e-03 2776 3879 -1.0416666666666667e-03 2776 3878 1.4583333333333332e-02 2776 4560 1.3541666666666664e-02 2776 4547 -1.0416666666666667e-03 2776 3873 -1.0416666666666667e-03 2777 2777 2.4999999999999998e-02 2777 3337 1.0416666666666664e-03 2777 3351 2.0833333333333333e-03 2777 3350 1.0416666666666664e-03 2777 2769 8.1315162936412833e-20 2777 3640 1.0416666666666664e-03 2777 3641 -6.2500000000000003e-03 2777 2778 -2.0833333333333329e-03 2777 3639 2.0833333333333337e-03 2777 3340 1.0416666666666664e-03 2777 3335 6.2500000000000003e-03 2777 2776 1.3552527156068805e-20 2777 2767 -2.0833333333333329e-03 2778 2778 2.4999999999999994e-02 2778 2769 4.1666666666666657e-03 2778 3350 2.0833333333333329e-03 2778 3640 2.0833333333333329e-03 2778 2776 4.1666666666666657e-03 2778 3351 -2.0833333333333329e-03 2778 3639 -2.0833333333333329e-03 2778 2777 -2.0833333333333333e-03 2778 3641 4.1666666666666666e-03 2778 4582 2.0833333333333329e-03 2778 4568 -2.0833333333333329e-03 2778 4550 -4.1666666666666666e-03 2778 3875 -2.0833333333333333e-03 2778 4559 2.0833333333333329e-03 2778 3874 4.1666666666666657e-03 2778 4552 2.0833333333333329e-03 2778 4560 2.0833333333333329e-03 2778 4547 -4.1666666666666666e-03 2778 3873 -2.0833333333333333e-03 2779 2779 2.5000000000000001e-02 2779 3362 -1.0416666666666664e-03 2779 3366 2.0833333333333337e-03 2779 3365 -1.0416666666666664e-03 2779 2771 1.3552527156068805e-20 2779 3636 1.0416666666666662e-03 2779 3631 6.2500000000000003e-03 2779 2775 -2.0833333333333329e-03 2779 3656 -2.0833333333333337e-03 2779 3626 1.0416666666666664e-03 2779 3624 6.2500000000000003e-03 2779 2780 8.1315162936412833e-20 2779 2772 -2.0833333333333329e-03 2780 2780 6.0416666666666653e-02 2780 3626 6.2500000000000003e-03 2780 2772 4.1666666666666666e-03 2780 3636 6.2500000000000003e-03 2780 2775 4.1666666666666666e-03 2780 3631 -1.0416666666666667e-03 2780 3656 8.3333333333333315e-03 2780 3624 -1.0416666666666667e-03 2780 2779 1.5502688168223823e-19 2780 4895 -1.0416666666666667e-03 2780 4899 8.3333333333333315e-03 2780 4897 1.0416666666666667e-03 2780 3876 1.5502688168223823e-19 2780 4786 1.0416666666666667e-03 2780 4785 9.3749999999999997e-03 2780 3879 1.5502688168223823e-19 2780 4784 2.1705219273391446e-19 2780 4905 6.2499999999999995e-03 2780 4907 9.3750000000000014e-03 2780 4900 -1.0416666666666667e-03 2780 3877 4.1666666666666666e-03 2780 3878 4.6263880787845817e-19 2781 2781 2.4999999999999994e-02 2781 3643 2.0833333333333329e-03 2781 3351 -2.0833333333333329e-03 2781 3335 -4.1666666666666666e-03 2781 2787 -2.0833333333333333e-03 2781 3336 2.0833333333333329e-03 2781 3327 -4.1666666666666666e-03 2781 3345 2.0833333333333329e-03 2781 2784 4.1666666666666657e-03 2781 3337 2.0833333333333329e-03 2781 3344 2.0833333333333329e-03 2781 3338 2.0833333333333329e-03 2781 3329 -4.1666666666666666e-03 2781 2782 -2.0833333333333333e-03 2782 2782 2.5000000000000001e-02 2782 3347 -1.0416666666666664e-03 2782 3352 1.0416666666666664e-03 2782 3343 -6.2500000000000003e-03 2782 2790 -2.0833333333333329e-03 2782 3345 -2.0833333333333337e-03 2782 2784 8.1315162936412833e-20 2782 3337 1.0416666666666662e-03 2782 3344 -2.0833333333333337e-03 2782 3338 1.0416666666666664e-03 2782 3329 6.2500000000000003e-03 2782 2781 -2.0833333333333329e-03 2783 2783 3.3333333333333326e-02 2784 2784 6.6666666666666652e-02 2784 3352 6.2500000000000003e-03 2784 2790 4.1666666666666666e-03 2784 3350 6.2500000000000003e-03 2784 2786 4.1666666666666666e-03 2784 3343 1.0416666666666667e-03 2784 3335 -1.0416666666666667e-03 2784 3351 -8.3333333333333315e-03 2784 2787 1.5502688168223823e-19 2784 3641 1.0416666666666667e-03 2784 3345 8.3333333333333315e-03 2784 2782 1.5502688168223823e-19 2784 3337 6.2500000000000003e-03 2784 3329 -1.0416666666666667e-03 2784 2781 4.1666666666666666e-03 2784 4925 -1.0416666666666667e-03 2784 4932 -8.3333333333333315e-03 2784 4278 1.5502688168223823e-19 2784 4528 -1.0416666666666667e-03 2784 4550 -1.0416666666666667e-03 2784 4582 8.3333333333333315e-03 2784 4275 1.5502688168223823e-19 2784 4927 6.2500000000000003e-03 2784 4580 1.0416666666666667e-03 2784 4274 4.1666666666666666e-03 2785 2785 1.2500000000000001e-02 2786 2786 2.4999999999999994e-02 2786 3350 2.0833333333333329e-03 2786 2784 4.1666666666666657e-03 2786 3648 -4.1666666666666666e-03 2786 3351 -2.0833333333333329e-03 2786 3643 2.0833333333333329e-03 2786 3651 2.0833333333333329e-03 2786 3641 4.1666666666666666e-03 2786 2787 -2.0833333333333333e-03 2786 4579 2.0833333333333329e-03 2786 4582 2.0833333333333329e-03 2786 4550 -4.1666666666666666e-03 2786 4275 -2.0833333333333333e-03 2786 4551 2.0833333333333329e-03 2787 2787 2.5000000000000001e-02 2787 3336 1.0416666666666664e-03 2787 3337 1.0416666666666664e-03 2787 3335 6.2500000000000003e-03 2787 2781 -2.0833333333333329e-03 2787 3351 2.0833333333333333e-03 2787 2784 8.1315162936412833e-20 2787 3350 1.0416666666666664e-03 2787 3643 -2.0833333333333337e-03 2787 3651 1.0416666666666664e-03 2787 3641 -6.2500000000000003e-03 2787 2786 -2.0833333333333329e-03 2788 2788 3.3333333333333326e-02 2789 2789 1.2500000000000001e-02 2790 2790 2.4999999999999994e-02 2790 3629 -4.1666666666666666e-03 2790 2784 4.1666666666666657e-03 2790 3352 2.0833333333333329e-03 2790 3344 2.0833333333333329e-03 2790 3345 2.0833333333333329e-03 2790 3343 4.1666666666666666e-03 2790 2782 -2.0833333333333333e-03 2790 3347 -2.0833333333333329e-03 2790 4932 -2.0833333333333329e-03 2790 4938 2.0833333333333329e-03 2790 4533 2.0833333333333329e-03 2790 4528 -4.1666666666666666e-03 2790 4278 -2.0833333333333333e-03 2791 2791 1.2500000000000001e-02 2792 2792 2.4999999999999994e-02 2792 3193 2.0833333333333329e-03 2792 3194 2.0833333333333329e-03 2792 3192 4.1666666666666666e-03 2792 2806 -2.0833333333333333e-03 2792 3551 2.0833333333333329e-03 2792 2796 4.1666666666666657e-03 2792 3571 2.0833333333333329e-03 2792 3356 -2.0833333333333329e-03 2792 3566 -4.1666666666666666e-03 2792 3550 2.0833333333333329e-03 2792 3553 -2.0833333333333329e-03 2792 3549 4.1666666666666666e-03 2792 2793 -2.0833333333333333e-03 2793 2793 2.4999999999999998e-02 2793 3571 1.0416666666666662e-03 2793 3546 1.0416666666666664e-03 2793 3551 -2.0833333333333337e-03 2793 3540 1.0416666666666664e-03 2793 3539 6.2500000000000003e-03 2793 2796 8.1315162936412833e-20 2793 2795 -2.0833333333333329e-03 2793 3550 -2.0833333333333337e-03 2793 3553 -1.0416666666666664e-03 2793 3549 -6.2500000000000003e-03 2793 2792 -2.0833333333333329e-03 2794 2794 3.3333333333333326e-02 2795 2795 2.4999999999999994e-02 2795 3595 -2.0833333333333329e-03 2795 3564 -2.0833333333333329e-03 2795 3537 -4.1666666666666666e-03 2795 2807 -2.0833333333333333e-03 2795 3536 2.0833333333333329e-03 2795 3535 -4.1666666666666666e-03 2795 3550 2.0833333333333329e-03 2795 3546 2.0833333333333329e-03 2795 3551 2.0833333333333329e-03 2795 3540 2.0833333333333329e-03 2795 3539 -4.1666666666666666e-03 2795 2796 4.1666666666666657e-03 2795 2793 -2.0833333333333333e-03 2796 2796 6.6666666666666652e-02 2796 3191 1.0416666666666667e-03 2796 3602 1.0416666666666667e-03 2796 3596 -6.2500000000000003e-03 2796 3343 1.0416666666666667e-03 2796 2799 4.1666666666666666e-03 2796 3595 -8.3333333333333315e-03 2796 2807 1.5502688168223823e-19 2796 3537 -1.0416666666666667e-03 2796 3194 8.3333333333333315e-03 2796 3192 1.0416666666666667e-03 2796 2806 1.5502688168223823e-19 2796 3571 6.2500000000000003e-03 2796 3549 1.0416666666666667e-03 2796 2792 4.1666666666666666e-03 2796 3342 8.3333333333333315e-03 2796 3330 6.2500000000000003e-03 2796 3329 -1.0416666666666667e-03 2796 2798 1.5502688168223823e-19 2796 2797 4.1666666666666666e-03 2796 3551 8.3333333333333315e-03 2796 3540 6.2500000000000003e-03 2796 3539 -1.0416666666666667e-03 2796 2793 1.5502688168223823e-19 2796 2795 4.1666666666666666e-03 2797 2797 2.4999999999999994e-02 2797 3194 2.0833333333333329e-03 2797 3193 2.0833333333333329e-03 2797 3191 4.1666666666666666e-03 2797 2806 -2.0833333333333333e-03 2797 3328 2.0833333333333329e-03 2797 3327 -4.1666666666666666e-03 2797 3344 2.0833333333333329e-03 2797 3338 2.0833333333333329e-03 2797 3342 2.0833333333333329e-03 2797 3330 2.0833333333333329e-03 2797 3329 -4.1666666666666666e-03 2797 2796 4.1666666666666657e-03 2797 2798 -2.0833333333333333e-03 2798 2798 2.4999999999999998e-02 2798 3596 -1.0416666666666662e-03 2798 3338 1.0416666666666664e-03 2798 3344 -2.0833333333333337e-03 2798 3347 -1.0416666666666664e-03 2798 3343 -6.2500000000000003e-03 2798 2799 -2.0833333333333329e-03 2798 3342 -2.0833333333333337e-03 2798 3330 1.0416666666666664e-03 2798 3329 6.2500000000000003e-03 2798 2796 8.1315162936412833e-20 2798 2797 -2.0833333333333329e-03 2799 2799 2.4999999999999994e-02 2799 3629 -4.1666666666666666e-03 2799 3564 -2.0833333333333329e-03 2799 3563 -2.0833333333333329e-03 2799 3595 -2.0833333333333329e-03 2799 3602 4.1666666666666666e-03 2799 2807 -2.0833333333333333e-03 2799 3342 2.0833333333333329e-03 2799 2796 4.1666666666666657e-03 2799 3596 -2.0833333333333329e-03 2799 3344 2.0833333333333329e-03 2799 3347 -2.0833333333333329e-03 2799 3343 4.1666666666666666e-03 2799 2798 -2.0833333333333333e-03 2800 2800 3.3333333333333326e-02 2801 2801 1.2500000000000001e-02 2802 2802 3.3333333333333326e-02 2803 2803 1.2500000000000001e-02 2804 2804 3.3333333333333326e-02 2805 2805 1.2500000000000001e-02 2806 2806 2.4999999999999998e-02 2806 3330 1.0416666666666664e-03 2806 3328 1.0416666666666664e-03 2806 3191 -6.2500000000000003e-03 2806 2797 -2.0833333333333329e-03 2806 3193 -2.0833333333333337e-03 2806 3356 -1.0416666666666664e-03 2806 3194 -2.0833333333333333e-03 2806 3571 1.0416666666666664e-03 2806 3192 -6.2500000000000003e-03 2806 2796 8.1315162936412833e-20 2806 2792 -2.0833333333333329e-03 2807 2807 2.5000000000000001e-02 2807 3563 -1.0416666666666664e-03 2807 3596 -1.0416666666666664e-03 2807 3602 -6.2500000000000003e-03 2807 2799 -2.0833333333333329e-03 2807 3595 2.0833333333333333e-03 2807 2796 8.1315162936412833e-20 2807 3540 1.0416666666666664e-03 2807 3564 2.0833333333333337e-03 2807 3536 1.0416666666666664e-03 2807 3537 6.2500000000000003e-03 2807 2795 -2.0833333333333329e-03 2808 2808 1.2500000000000001e-02 2809 2809 3.7499999999999992e-02 2809 3389 -2.0833333333333329e-03 2809 3391 4.1666666666666657e-03 2809 3370 -4.1666666666666657e-03 2809 3388 4.1666666666666657e-03 2809 3369 -1.6666666666666666e-02 2809 2813 -6.2499999999999986e-03 2809 3523 -2.0833333333333329e-03 2809 3372 2.0833333333333329e-03 2809 3371 -4.1666666666666666e-03 2809 2811 -2.0833333333333333e-03 2809 3387 2.0833333333333329e-03 2809 3368 2.0833333333333329e-03 2809 3367 -4.1666666666666675e-03 2809 2810 4.1666666666666657e-03 2809 1645 2.0833333333333329e-03 2810 2810 5.6250000104166656e-02 2810 3387 4.1666666979166666e-03 2810 3390 6.2499999999999995e-03 2810 2819 5.2083333333333330e-03 2810 3371 -1.0416666666666667e-03 2810 3203 3.1249999999999997e-03 2810 3389 -7.2916666666666659e-03 2810 3210 1.6666666666666663e-02 2810 3202 3.1249999999999997e-03 2810 2811 5.2083333333333330e-03 2810 2820 2.0833333333333333e-03 2810 3368 6.2500000000000003e-03 2810 3367 -1.0416666666666667e-03 2810 2809 4.1666666666666666e-03 2810 732 -2.0833333333333329e-11 2810 1645 -7.4433015019684602e-20 2810 582 2.0833333333333333e-03 2810 620 -1.0416666666666664e-03 2810 619 -2.0833333333333329e-03 2810 147 5.2083333333333330e-03 2810 730 1.0416666666666665e-11 2810 584 2.0833333333333326e-11 2810 583 3.1250000312499997e-03 2810 148 5.2083333333333328e-11 2810 145 4.0414059347091638e-19 2811 2811 4.9999999999999989e-02 2811 3368 1.0416666666666664e-03 2811 3389 4.3368086899420177e-19 2811 3210 4.1666666666666657e-03 2811 2810 5.2083333333333339e-03 2811 3202 1.2499999999999997e-02 2811 2820 -1.0416666666666667e-03 2811 3201 3.1250000000000002e-03 2811 3506 2.0833333333333342e-03 2811 3507 -3.1249999999999997e-03 2811 2817 6.2500000000000003e-03 2811 3517 4.1666666666666666e-03 2811 3512 1.2500000000000001e-02 2811 2815 -1.0416666666666660e-03 2811 3523 6.5052130349130266e-19 2811 3372 1.0416666666666664e-03 2811 3371 6.2500000000000003e-03 2811 2809 -2.0833333333333329e-03 2812 2812 4.5833333333333323e-02 2813 2813 1.6666666666666663e-02 2813 3388 1.0416666666666660e-03 2813 3391 1.0416666666666660e-03 2813 3370 1.0416666666666664e-03 2813 3367 1.0416666666666667e-03 2813 3369 2.0833333333333342e-03 2813 2809 -6.2499999999999986e-03 2813 2165 1.0416666666666667e-03 2813 1645 -1.0416666666666662e-03 2813 2154 6.2499999999999986e-03 2814 2814 2.4999999999999994e-02 2815 2815 1.6666666666666663e-02 2815 3504 1.0416666666666664e-03 2815 3506 1.0416666666666667e-03 2815 3507 2.0833333333333346e-03 2815 2817 -6.2499999999999986e-03 2815 3523 -1.0416666666666667e-03 2815 2811 -1.0416666666666662e-03 2815 3512 1.0416666666666660e-03 2815 3517 6.2499999999999986e-03 2815 3516 1.0416666666666662e-03 2816 2816 2.4999999999999994e-02 2817 2817 4.9999999999999989e-02 2817 3202 4.1666666666666657e-03 2817 3203 4.1666666666666657e-03 2817 3201 1.6666666666666663e-02 2817 2820 -6.2499999999999986e-03 2817 3534 2.0833333333333329e-03 2817 3509 -4.1666666666666675e-03 2817 2819 2.0833333333333329e-03 2817 3508 2.0833333333333329e-03 2817 3516 4.1666666666666657e-03 2817 3504 -4.1666666666666657e-03 2817 3512 4.1666666666666657e-03 2817 3506 -4.1666666666666666e-03 2817 3507 -1.6666666666666666e-02 2817 2811 6.2499999999999995e-03 2817 2815 -6.2499999999999986e-03 2818 2818 2.7083333333333327e-02 2819 2819 3.1249999999999993e-02 2819 3534 -1.0416666666666673e-03 2819 3390 1.0416666666666660e-03 2819 2810 5.2083333333333330e-03 2819 3210 4.1666666666666666e-03 2819 3203 1.2500000000000001e-02 2819 3201 3.1249999999999997e-03 2819 2820 -1.0416666666666660e-03 2819 3508 1.0416666666666664e-03 2819 3509 4.1666666666666675e-03 2819 2817 2.0833333333333337e-03 2819 618 -1.3552527156068805e-19 2819 620 1.3552527156068805e-19 2819 619 -1.0416666666666662e-03 2819 147 -1.0416666666666662e-03 2820 2820 1.6666666666666663e-02 2820 3390 1.0416666666666667e-03 2820 3389 -1.0416666666666664e-03 2820 3210 6.2499999999999986e-03 2820 2810 2.0833333333333337e-03 2820 3202 1.0416666666666660e-03 2820 2811 -1.0416666666666667e-03 2820 3506 1.0416666666666664e-03 2820 3203 1.0416666666666660e-03 2820 3509 1.0416666666666667e-03 2820 3201 -2.0833333333333342e-03 2820 2819 -1.0416666666666662e-03 2820 2817 -6.2499999999999986e-03 2821 2821 2.4999999999999994e-02 2821 3394 -2.0833333333333329e-03 2821 3384 2.0833333333333329e-03 2821 3664 -2.0833333333333329e-03 2821 3379 2.0833333333333329e-03 2821 3374 -4.1666666666666666e-03 2821 2824 4.1666666666666657e-03 2821 2825 -2.0833333333333333e-03 2821 3386 2.0833333333333329e-03 2821 3392 2.0833333333333329e-03 2821 3378 2.0833333333333329e-03 2821 3369 -4.1666666666666666e-03 2821 2823 -2.0833333333333333e-03 2821 3381 2.0833333333333329e-03 2821 3376 2.0833333333333329e-03 2821 3373 -4.1666666666666666e-03 2821 2822 -2.0833333333333333e-03 2821 1648 4.1666666666666657e-03 2821 1646 4.1666666666666657e-03 2822 2822 2.4999999999999998e-02 2822 3381 -2.0833333333333333e-03 2822 3383 6.2500000000000003e-03 2822 3379 1.0416666666666664e-03 2822 3384 -2.0833333333333337e-03 2822 3663 1.0416666666666664e-03 2822 2824 1.3552527156068805e-20 2822 3376 1.0416666666666664e-03 2822 3373 6.2500000000000003e-03 2822 2821 -2.0833333333333329e-03 2822 1646 8.1315162936412833e-20 2822 1013 1.0416666666666664e-03 2822 491 -2.0833333333333329e-03 2823 2823 2.2916666666666662e-02 2823 3392 -6.5052130349130266e-19 2823 3386 -1.0416666666666667e-03 2823 3376 1.0416666666666662e-03 2823 3378 1.0416666666666664e-03 2823 3369 6.2500000000000003e-03 2823 2821 -2.0833333333333329e-03 2823 1648 -1.0416666666666667e-03 2823 2137 -2.1961093809541182e-20 2823 2138 -2.1684043449710089e-19 2823 2134 1.0416666666666671e-03 2823 1647 1.0416666666666669e-03 2823 1646 8.1315162936412833e-20 2824 2824 6.6666666666666652e-02 2824 3688 1.0416666666666667e-03 2824 3662 -1.0416666666666667e-03 2824 3668 -8.3333333333333315e-03 2824 3667 -6.2500000000000003e-03 2824 3692 -1.0416666666666667e-03 2824 2830 1.5502688168223823e-19 2824 2829 4.1666666666666666e-03 2824 3666 -8.3333333333333315e-03 2824 3674 -1.0416666666666667e-03 2824 2828 -8.8991399020904929e-20 2824 3373 -1.0416666666666667e-03 2824 3665 -6.2500000000000003e-03 2824 3669 1.0416666666666667e-03 2824 2826 4.1666666666666666e-03 2824 3664 -8.3333333333333315e-03 2824 3379 6.2500000000000003e-03 2824 3374 -1.0416666666666667e-03 2824 2825 1.5502688168223823e-19 2824 2821 4.1666666666666666e-03 2824 3384 8.3333333333333315e-03 2824 3663 6.2500000000000003e-03 2824 3383 -1.0416666666666667e-03 2824 2822 -8.8991399020904929e-20 2824 491 4.1666666666666666e-03 2825 2825 2.5000000000000001e-02 2825 3378 1.0416666666666664e-03 2825 3394 2.0833333333333337e-03 2825 3393 -1.0416666666666664e-03 2825 3665 -1.0416666666666664e-03 2825 3669 -6.2500000000000003e-03 2825 2826 -2.0833333333333329e-03 2825 3664 2.0833333333333337e-03 2825 3379 1.0416666666666664e-03 2825 3374 6.2500000000000003e-03 2825 2824 8.1315162936412833e-20 2825 2821 -2.0833333333333329e-03 2825 1648 1.3552527156068805e-20 2826 2826 2.4999999999999994e-02 2826 3686 2.0833333333333329e-03 2826 3690 2.0833333333333329e-03 2826 2831 4.1666666666666657e-03 2826 3679 2.0833333333333329e-03 2826 3666 -2.0833333333333329e-03 2826 3674 -4.1666666666666666e-03 2826 2828 -2.0833333333333333e-03 2826 3395 2.0833333333333329e-03 2826 2827 -2.0833333333333333e-03 2826 3672 -4.1666666666666666e-03 2826 3394 -2.0833333333333329e-03 2826 3393 -2.0833333333333329e-03 2826 3664 -2.0833333333333329e-03 2826 2824 4.1666666666666657e-03 2826 2825 -2.0833333333333333e-03 2826 3665 -2.0833333333333329e-03 2826 3669 4.1666666666666666e-03 2826 1648 4.1666666666666657e-03 2827 2827 2.5000000000000001e-02 2827 3686 -2.0833333333333337e-03 2827 2831 8.1315162936412833e-20 2827 3395 -2.0833333333333337e-03 2827 3679 1.0416666666666664e-03 2827 3393 -1.0416666666666664e-03 2827 3672 6.2500000000000003e-03 2827 2826 -2.0833333333333329e-03 2827 4640 -1.0416666666666662e-03 2827 4947 1.0416666666666664e-03 2827 4950 6.2500000000000003e-03 2827 3963 -2.0833333333333329e-03 2827 1648 1.3552527156068805e-20 2828 2828 2.4999999999999998e-02 2828 3679 1.0416666666666664e-03 2828 3690 -2.0833333333333333e-03 2828 3693 1.0416666666666664e-03 2828 2831 8.1315162936412833e-20 2828 3667 -1.0416666666666664e-03 2828 3688 -6.2500000000000003e-03 2828 2829 -2.0833333333333329e-03 2828 3666 2.0833333333333337e-03 2828 3665 -1.0416666666666664e-03 2828 3674 6.2500000000000003e-03 2828 2824 1.3552527156068805e-20 2828 2826 -2.0833333333333329e-03 2829 2829 2.4999999999999994e-02 2829 2831 4.1666666666666657e-03 2829 3693 2.0833333333333329e-03 2829 2830 -2.0833333333333333e-03 2829 3692 -4.1666666666666666e-03 2829 3690 2.0833333333333329e-03 2829 3666 -2.0833333333333329e-03 2829 2828 -2.0833333333333333e-03 2829 3688 4.1666666666666666e-03 2829 3668 -2.0833333333333329e-03 2829 3667 -2.0833333333333329e-03 2829 2824 4.1666666666666657e-03 2829 4636 2.0833333333333329e-03 2829 4608 -2.0833333333333329e-03 2829 4634 4.1666666666666666e-03 2829 3960 -2.0833333333333333e-03 2829 4606 -2.0833333333333329e-03 2829 3958 4.1666666666666657e-03 2829 4607 -2.0833333333333329e-03 2830 2830 2.5000000000000001e-02 2830 3692 6.2500000000000003e-03 2830 2829 -2.0833333333333329e-03 2830 3662 6.2500000000000003e-03 2830 3663 1.0416666666666664e-03 2830 3668 2.0833333333333337e-03 2830 3667 -1.0416666666666664e-03 2830 2824 8.1315162936412833e-20 2830 4607 -1.0416666666666664e-03 2830 4606 2.0833333333333337e-03 2830 4605 -1.0416666666666664e-03 2830 3958 1.3552527156068805e-20 2830 491 -2.0833333333333329e-03 2831 2831 6.6666666666666652e-02 2831 3686 8.3333333333333315e-03 2831 2827 1.5502688168223823e-19 2831 3693 6.2500000000000003e-03 2831 2829 4.1666666666666666e-03 2831 3672 -1.0416666666666667e-03 2831 3679 6.2500000000000003e-03 2831 3674 -1.0416666666666667e-03 2831 2826 4.1666666666666666e-03 2831 3690 8.3333333333333315e-03 2831 3688 1.0416666666666667e-03 2831 2828 1.5502688168223823e-19 2831 4950 -1.0416666666666667e-03 2831 4622 -1.0416666666666667e-03 2831 4641 -8.3333333333333315e-03 2831 4640 -6.2500000000000003e-03 2831 4952 -1.0416666666666667e-03 2831 3965 1.5502688168223823e-19 2831 3963 4.1666666666666666e-03 2831 4634 1.0416666666666667e-03 2831 4636 8.3333333333333315e-03 2831 4628 6.2500000000000003e-03 2831 4620 -1.0416666666666667e-03 2831 3960 1.5502688168223823e-19 2831 3959 4.1666666666666666e-03 2832 2832 2.2916666666666662e-02 2832 3388 -8.8938459461701536e-21 2832 3386 2.0833333333333329e-03 2832 3369 -4.1666666666666666e-03 2832 2835 -4.1666666666666657e-03 2832 3385 2.0833333333333329e-03 2832 3367 -4.1666666666666657e-03 2832 3381 2.0833333333333329e-03 2832 3376 2.0833333333333329e-03 2832 3382 2.0833333333333329e-03 2832 3377 2.0833333333333329e-03 2832 3373 -4.1666666666666666e-03 2832 2834 4.1666666666666657e-03 2832 2833 -2.0833333333333333e-03 2832 1446 -4.1666666666666657e-03 2832 1458 4.1666666666666657e-03 2833 2833 2.5000000000000001e-02 2833 3382 -2.0833333333333337e-03 2833 2834 1.3552527156068805e-20 2833 3381 -2.0833333333333333e-03 2833 3383 6.2500000000000003e-03 2833 3376 1.0416666666666664e-03 2833 3377 1.0416666666666664e-03 2833 3373 6.2500000000000003e-03 2833 2832 -2.0833333333333329e-03 2833 1012 1.0416666666666664e-03 2833 1013 1.0416666666666664e-03 2833 431 -2.0833333333333329e-03 2833 1458 8.1315162936412833e-20 2834 2834 3.3333333541666663e-02 2834 3382 8.3333333333333315e-03 2834 2833 -8.8991399020904929e-20 2834 3383 -1.0416666666666667e-03 2834 3385 4.1666666979166657e-03 2834 3367 -1.0416666666666667e-03 2834 3377 6.2500000000000003e-03 2834 3373 -1.0416666666666667e-03 2834 2832 4.1666666666666666e-03 2834 1060 -2.0833333333333326e-11 2834 786 -2.0833333333333329e-11 2834 1020 -6.2499999999999991e-11 2834 432 2.1169082391605852e-27 2834 1022 1.0416666666666665e-11 2834 430 5.2083333333333328e-11 2834 1017 2.0833333333333329e-11 2834 1018 4.1666666979166666e-03 2834 1012 6.2500000000000003e-03 2834 1011 -1.0416666666666667e-03 2834 429 7.0197859108400047e-20 2834 431 4.1666666666666666e-03 2834 785 -1.0416666666666665e-11 2834 781 2.0833333333333329e-11 2834 428 5.2083333333333328e-11 2834 1446 8.4829026136728466e-20 2835 2835 4.3749999999999990e-02 2835 3386 -1.0416666666666673e-03 2835 3388 -1.0416666666666669e-03 2835 3367 5.2083333333333339e-03 2835 3376 1.0416666666666664e-03 2835 3369 1.0416666666666666e-02 2835 2832 -4.1666666666666657e-03 2835 1458 8.1315162936412833e-20 2835 2138 -4.9904357809065860e-20 2835 2139 5.2083333333333330e-03 2835 2156 2.1684043449710089e-19 2835 1449 6.2500000000000003e-03 2835 2153 -1.0416666666666667e-03 2835 2143 1.4583333333333332e-02 2835 1448 -6.2499999999999986e-03 2835 2134 1.0416666666666673e-03 2835 2130 -5.2083333333333330e-03 2835 1455 6.2499999999999986e-03 2835 2159 -2.1684043449710089e-19 2835 2152 -6.5052130349130266e-19 2835 1447 2.1684043449710089e-19 2835 1446 6.2499999999999986e-03 2836 2836 2.2916666666666662e-02 2836 3670 2.0833333333333329e-03 2836 3394 -2.0833333333333329e-03 2836 3374 -4.1666666666666666e-03 2836 2840 -2.0833333333333333e-03 2836 3375 2.0833333333333329e-03 2836 3392 2.0833333333333329e-03 2836 3378 2.0833333333333329e-03 2836 3391 -2.8940292364521927e-21 2836 3370 -4.1666666666666675e-03 2836 3369 -4.1666666666666666e-03 2836 2837 -4.1666666666666657e-03 2836 1251 4.1666666666666657e-03 2837 2837 4.9999999999999989e-02 2837 3392 -4.3368086899420177e-19 2837 3391 -1.0416666666666669e-03 2837 3378 1.0416666666666664e-03 2837 3370 5.2083333333333322e-03 2837 3369 1.0416666666666664e-02 2837 2836 -4.1666666666666657e-03 2837 2137 4.1666666666666657e-03 2837 1251 5.2083333333333339e-03 2837 2141 5.2083333333333339e-03 2837 2143 8.3333333333333315e-03 2837 2134 1.2499999999999999e-02 2837 2130 3.1249999999999997e-03 2837 1249 4.3368086899420177e-19 2837 1250 -1.0416666666666671e-03 2837 2151 -2.1684043449710089e-19 2837 2150 -1.0416666666666671e-03 2838 2838 1.8749999999999996e-02 2839 2839 2.4999999999999994e-02 2839 3685 2.0833333333333329e-03 2839 3395 2.0833333333333329e-03 2839 3672 -4.1666666666666666e-03 2839 2844 -2.0833333333333333e-03 2839 3673 2.0833333333333329e-03 2839 3671 -4.1666666666666666e-03 2839 3394 -2.0833333333333329e-03 2839 3393 -2.0833333333333329e-03 2839 3670 2.0833333333333329e-03 2839 3678 2.0833333333333329e-03 2839 3669 4.1666666666666666e-03 2839 2840 -2.0833333333333333e-03 2839 1251 4.1666666666666657e-03 2840 2840 2.5000000000000001e-02 2840 3375 1.0416666666666664e-03 2840 3378 1.0416666666666664e-03 2840 3374 6.2500000000000003e-03 2840 2836 -2.0833333333333329e-03 2840 3394 2.0833333333333337e-03 2840 3393 -1.0416666666666664e-03 2840 3670 -2.0833333333333337e-03 2840 3678 1.0416666666666664e-03 2840 3669 -6.2500000000000003e-03 2840 2839 -2.0833333333333329e-03 2840 1251 1.3552527156068805e-20 2841 2841 3.3333333333333326e-02 2842 2842 1.2500000000000001e-02 2843 2843 3.3333333333333326e-02 2844 2844 2.5000000000000001e-02 2844 3395 -2.0833333333333337e-03 2844 3685 -2.0833333333333337e-03 2844 3673 1.0416666666666662e-03 2844 3393 -1.0416666666666664e-03 2844 3672 6.2500000000000003e-03 2844 2839 -2.0833333333333329e-03 2844 1251 1.3552527156068805e-20 2844 4947 1.0416666666666664e-03 2844 4954 1.0416666666666664e-03 2844 4950 6.2500000000000003e-03 2844 4287 -2.0833333333333329e-03 2845 2845 1.2499999999999997e-02 2845 3420 -1.0842021724855044e-19 2845 3410 1.3552527156068805e-19 2845 3413 -1.3552527156068805e-19 2845 3403 1.0416666666666662e-03 2845 3402 -4.3368086899420177e-19 2845 2853 -1.0416666666666662e-03 2845 2852 4.3368086899420177e-19 2845 3406 -1.0842021724855044e-19 2845 3400 1.0416666666666662e-03 2845 3399 -4.3368086899420177e-19 2845 2847 -1.0416666666666662e-03 2845 2846 4.3368086899420177e-19 2846 2846 4.1666666666666657e-02 2846 3412 6.2499999999999995e-03 2846 2855 4.1202858928001372e-19 2846 3410 1.0416666666666664e-03 2846 2853 5.2083333333333330e-03 2846 3449 -2.0833333333333333e-03 2846 3417 -2.0833333333333333e-03 2846 3403 2.0833333333333333e-03 2846 3408 1.0416666666666664e-03 2846 3443 2.0833333333333329e-03 2846 3407 -6.2500000000000003e-03 2846 2854 5.2083333333333330e-03 2846 2848 2.6745065309554533e-19 2846 3406 1.0416666666666664e-03 2846 3400 2.0833333333333329e-03 2846 3399 6.2499999999999995e-03 2846 2847 5.2083333333333330e-03 2846 2845 4.1202858928001372e-19 2846 882 2.0833333333333333e-03 2846 891 -1.0416666666666664e-03 2846 890 -2.0833333333333329e-03 2846 449 5.2083333333333330e-03 2846 865 -2.0833333333333329e-03 2846 884 6.2500000000000003e-03 2846 448 2.6745065309554533e-19 2847 2847 4.9999999999999996e-02 2847 3407 -2.0833333333333329e-03 2847 3402 2.0833333333333329e-03 2847 3445 -2.0833333333333329e-03 2847 3420 -4.1666666666666657e-03 2847 3419 -1.0416666666666664e-02 2847 3458 2.0833333333333329e-03 2847 2852 5.2083333333333322e-03 2847 2850 -1.0416666666666662e-03 2847 3418 -4.1666666666666657e-03 2847 3417 -1.0416666666666664e-02 2847 3441 2.0833333333333329e-03 2847 2849 5.2083333333333322e-03 2847 2848 -1.0416666666666664e-03 2847 3406 4.1666666666666657e-03 2847 3400 1.0416666666666664e-02 2847 3399 2.0833333333333329e-03 2847 2846 5.2083333333333322e-03 2847 2845 -1.0416666666666662e-03 2848 2848 1.2499999999999997e-02 2848 3406 1.3552527156068805e-19 2848 3448 1.3552527156068805e-19 2848 3408 -1.3552527156068805e-19 2848 3443 1.0416666666666664e-03 2848 3407 4.3368086899420177e-19 2848 2854 -1.0416666666666664e-03 2848 2846 2.1684043449710089e-19 2848 3418 1.3552527156068805e-19 2848 3417 -1.0416666666666664e-03 2848 3441 -2.1684043449710089e-19 2848 2847 -1.0416666666666664e-03 2848 2849 4.3368086899420177e-19 2849 2849 4.1666666666666657e-02 2849 3447 6.2499999999999986e-03 2849 2857 4.1202858928001372e-19 2849 3446 1.0416666666666660e-03 2849 2851 5.2083333333333330e-03 2849 3419 -2.0833333333333333e-03 2849 3443 2.0833333333333333e-03 2849 3448 1.0416666666666660e-03 2849 3451 -2.0833333333333329e-03 2849 2854 5.2083333333333330e-03 2849 3457 2.0833333333333329e-03 2849 3445 -6.2499999999999986e-03 2849 2850 4.1202858928001372e-19 2849 3418 -1.0416666666666660e-03 2849 3417 -2.0833333333333329e-03 2849 3441 6.2499999999999995e-03 2849 2847 5.2083333333333330e-03 2849 2848 4.1202858928001372e-19 2849 966 -2.0833333333333333e-03 2849 953 -2.0833333333333333e-03 2849 969 -1.0416666666666660e-03 2849 968 -2.0833333333333329e-03 2849 982 6.2499999999999995e-03 2849 455 5.2083333333333330e-03 2849 456 4.1202858928001372e-19 2850 2850 1.2499999999999997e-02 2850 3460 1.3552527156068805e-19 2850 3418 -1.3552527156068805e-19 2850 3420 1.3552527156068805e-19 2850 3419 -1.0416666666666662e-03 2850 3458 -4.3368086899420177e-19 2850 2847 -1.0416666666666662e-03 2850 2852 2.1684043449710089e-19 2850 3446 -1.3552527156068805e-19 2850 3457 1.0416666666666664e-03 2850 3445 2.1684043449710089e-19 2850 2851 -1.0416666666666664e-03 2850 2849 4.3368086899420177e-19 2851 2851 4.9999999999999989e-02 2851 3446 4.1666666666666657e-03 2851 2849 5.2083333333333322e-03 2851 3460 4.1666666666666657e-03 2851 2852 5.2083333333333322e-03 2851 3458 2.0833333333333329e-03 2851 3457 1.0416666666666664e-02 2851 3445 -2.0833333333333329e-03 2851 2850 -1.0416666666666664e-03 2851 982 2.0833333333333329e-03 2851 951 2.0833333333333329e-03 2851 954 -4.1666666666666657e-03 2851 953 -1.0416666666666664e-02 2851 961 -2.0833333333333329e-03 2851 453 5.2083333333333322e-03 2851 456 -1.0416666666666664e-03 2851 950 1.0416666666666664e-02 2851 938 -2.0833333333333329e-03 2851 452 -1.0416666666666662e-03 2852 2852 4.1666666666666664e-02 2852 3413 1.0416666666666664e-03 2852 2853 5.2083333333333330e-03 2852 3460 1.0416666666666664e-03 2852 2851 5.2083333333333330e-03 2852 3457 2.0833333333333333e-03 2852 3400 2.0833333333333333e-03 2852 3420 -1.0416666666666664e-03 2852 3419 -2.0833333333333329e-03 2852 3458 6.2499999999999986e-03 2852 2847 5.2083333333333330e-03 2852 2850 2.6745065309554533e-19 2852 3403 2.0833333333333329e-03 2852 3402 6.2500000000000003e-03 2852 2845 3.7587087034409578e-19 2852 860 -2.0833333333333333e-03 2852 862 2.0833333333333333e-03 2852 950 2.0833333333333329e-03 2852 938 -6.2500000000000003e-03 2852 452 3.7587087034409578e-19 2852 859 -1.0416666666666664e-03 2852 858 -2.0833333333333329e-03 2852 863 6.2499999999999986e-03 2852 446 5.2083333333333330e-03 2852 447 2.6745065309554533e-19 2853 2853 4.9999999999999989e-02 2853 3413 4.1666666666666657e-03 2853 2852 5.2083333333333322e-03 2853 3410 4.1666666666666657e-03 2853 2846 5.2083333333333322e-03 2853 3399 2.0833333333333329e-03 2853 3403 1.0416666666666664e-02 2853 3402 2.0833333333333329e-03 2853 2845 -1.0416666666666662e-03 2853 863 2.0833333333333329e-03 2853 848 -2.0833333333333329e-03 2853 865 -1.0416666666666664e-02 2853 884 2.0833333333333329e-03 2853 448 -1.0416666666666664e-03 2853 847 4.1666666666666657e-03 2853 862 1.0416666666666664e-02 2853 846 -2.0833333333333329e-03 2853 445 5.2083333333333322e-03 2853 447 -1.0416666666666664e-03 2854 2854 4.9999999999999996e-02 2854 3483 2.0833333333333329e-03 2854 3412 2.0833333333333329e-03 2854 3441 2.0833333333333329e-03 2854 3448 4.1666666666666657e-03 2854 3451 -1.0416666666666664e-02 2854 3447 2.0833333333333329e-03 2854 2849 5.2083333333333322e-03 2854 2857 -1.0416666666666664e-03 2854 3450 -4.1666666666666657e-03 2854 3449 -1.0416666666666664e-02 2854 3482 2.0833333333333329e-03 2854 2856 5.2083333333333322e-03 2854 2855 -1.0416666666666662e-03 2854 3408 4.1666666666666657e-03 2854 3443 1.0416666666666664e-02 2854 3407 -2.0833333333333329e-03 2854 2846 5.2083333333333322e-03 2854 2848 -1.0416666666666664e-03 2855 2855 1.2499999999999997e-02 2855 2856 4.3368086899420177e-19 2855 3412 -4.3368086899420177e-19 2855 3408 1.3552527156068805e-19 2855 2846 4.3368086899420177e-19 2855 3450 1.3552527156068805e-19 2855 3449 -1.0416666666666662e-03 2855 3482 -4.3368086899420177e-19 2855 2854 -1.0416666666666662e-03 2855 893 -1.0842021724855044e-19 2855 891 1.0842021724855044e-19 2855 890 -1.0416666666666662e-03 2855 449 -1.0416666666666662e-03 2856 2856 4.1666666666666664e-02 2856 3482 6.2500000000000003e-03 2856 2855 3.7587087034409578e-19 2856 3483 6.2499999999999986e-03 2856 2857 2.6745065309554533e-19 2856 3451 -2.0833333333333333e-03 2856 3450 -1.0416666666666664e-03 2856 3449 -2.0833333333333329e-03 2856 2854 5.2083333333333330e-03 2856 963 2.0833333333333333e-03 2856 890 -2.0833333333333333e-03 2856 853 -2.0833333333333333e-03 2856 856 -1.0416666666666664e-03 2856 855 -2.0833333333333329e-03 2856 964 6.2500000000000003e-03 2856 451 5.2083333333333330e-03 2856 454 3.7587087034409578e-19 2856 967 -1.0416666666666664e-03 2856 966 -2.0833333333333329e-03 2856 455 5.2083333333333330e-03 2856 893 -1.0416666666666664e-03 2856 892 -2.0833333333333329e-03 2856 896 6.2499999999999986e-03 2856 449 5.2083333333333330e-03 2856 450 2.6745065309554533e-19 2857 2857 1.2499999999999997e-02 2857 2849 4.3368086899420177e-19 2857 3447 -2.1684043449710089e-19 2857 3483 -4.3368086899420177e-19 2857 2856 2.1684043449710089e-19 2857 3450 -1.3552527156068805e-19 2857 3448 -1.3552527156068805e-19 2857 3451 -1.0416666666666664e-03 2857 2854 -1.0416666666666664e-03 2857 969 -1.3552527156068805e-19 2857 967 1.3552527156068805e-19 2857 966 -1.0416666666666662e-03 2857 455 -1.0416666666666662e-03 2858 2858 1.2499999999999997e-02 2858 3410 1.0416666666666662e-03 2858 2860 -1.0416666666666662e-03 2858 2861 -1.0416666666666664e-03 2858 3409 1.0416666666666664e-03 2858 3404 -1.3552527156068805e-19 2858 3403 1.3552527156068805e-19 2858 2859 4.3368086899420177e-19 2858 3399 2.1684043449710089e-19 2858 865 1.3552527156068805e-19 2858 885 1.3552527156068805e-19 2858 45 2.1684043449710089e-19 2858 884 4.3368086899420177e-19 2859 2859 4.1666666666666657e-02 2859 3413 2.0833333333333329e-03 2859 3468 2.0833333333333333e-03 2859 3402 -6.2499999999999995e-03 2859 2869 4.1202858928001372e-19 2859 3405 1.0416666666666660e-03 2859 3467 2.0833333333333329e-03 2859 2866 5.2083333333333330e-03 2859 3415 -2.0833333333333333e-03 2859 3401 -6.2499999999999986e-03 2859 2864 4.1202858928001372e-19 2859 3398 1.0416666666666660e-03 2859 3036 2.0833333333333329e-03 2859 2863 5.2083333333333330e-03 2859 3039 2.0833333333333333e-03 2859 3035 6.2499999999999995e-03 2859 2862 4.1202858928001372e-19 2859 3404 1.0416666666666660e-03 2859 3409 2.0833333333333329e-03 2859 2861 5.2083333333333330e-03 2859 3403 1.0416666666666660e-03 2859 2860 5.2083333333333330e-03 2859 3410 2.0833333333333333e-03 2859 3399 -6.2499999999999986e-03 2859 2858 4.1202858928001372e-19 2860 2860 4.9999999999999989e-02 2860 3413 1.0416666666666664e-02 2860 2869 -1.0416666666666664e-03 2860 3410 1.0416666666666664e-02 2860 2858 -1.0416666666666662e-03 2860 3402 -2.0833333333333329e-03 2860 3403 4.1666666666666657e-03 2860 2859 5.2083333333333322e-03 2860 3399 -2.0833333333333329e-03 2860 863 -2.0833333333333329e-03 2860 884 -2.0833333333333329e-03 2860 865 -4.1666666666666657e-03 2860 45 5.2083333333333322e-03 2860 848 2.0833333333333329e-03 2860 862 4.1666666666666657e-03 2860 847 1.0416666666666664e-02 2860 846 2.0833333333333329e-03 2860 43 5.2083333333333322e-03 2860 44 -1.0416666666666662e-03 2861 2861 4.9999999999999989e-02 2861 3039 1.0416666666666664e-02 2861 2862 -1.0416666666666664e-03 2861 3409 1.0416666666666664e-02 2861 2858 -1.0416666666666664e-03 2861 3035 2.0833333333333329e-03 2861 3404 4.1666666666666657e-03 2861 3399 -2.0833333333333329e-03 2861 2859 5.2083333333333322e-03 2861 884 -2.0833333333333329e-03 2861 885 4.1666666666666657e-03 2861 883 -2.0833333333333329e-03 2861 45 5.2083333333333322e-03 2861 933 4.1666666666666657e-03 2861 50 5.2083333333333322e-03 2861 937 1.0416666666666664e-02 2861 49 -1.0416666666666662e-03 2862 2862 1.2499999999999997e-02 2862 3039 1.0416666666666664e-03 2862 2861 -1.0416666666666664e-03 2862 2863 -1.0416666666666664e-03 2862 3036 1.0416666666666664e-03 2862 3398 -1.3552527156068805e-19 2862 3404 1.3552527156068805e-19 2862 2859 4.3368086899420177e-19 2862 3035 -2.1684043449710089e-19 2862 933 -1.3552527156068805e-19 2862 936 1.3552527156068805e-19 2862 50 2.1684043449710089e-19 2863 2863 4.9999999999999989e-02 2863 3036 1.0416666666666664e-02 2863 2862 -1.0416666666666664e-03 2863 3416 1.0416666666666664e-02 2863 2867 -1.0416666666666662e-03 2863 3401 -2.0833333333333329e-03 2863 3461 -2.0833333333333329e-03 2863 3414 -4.1666666666666657e-03 2863 3415 -1.0416666666666664e-02 2863 3464 -2.0833333333333329e-03 2863 2865 5.2083333333333322e-03 2863 2864 -1.0416666666666662e-03 2863 3398 4.1666666666666657e-03 2863 3035 2.0833333333333329e-03 2863 2859 5.2083333333333322e-03 2863 936 4.1666666666666657e-03 2863 50 5.2083333333333322e-03 2864 2864 1.2499999999999997e-02 2864 3405 -1.3552527156068805e-19 2864 3398 1.3552527156068805e-19 2864 2859 4.3368086899420177e-19 2864 3401 2.1684043449710089e-19 2864 3414 1.3552527156068805e-19 2864 3415 -1.0416666666666662e-03 2864 2863 -1.0416666666666662e-03 2864 3465 1.3552527156068805e-19 2864 2866 -1.0416666666666664e-03 2864 2865 2.1684043449710089e-19 2864 3467 1.0416666666666664e-03 2864 3464 4.3368086899420177e-19 2865 2865 4.1666666666666664e-02 2865 3465 1.0416666666666664e-03 2865 2866 5.2083333333333330e-03 2865 3462 1.0416666666666664e-03 2865 2868 5.2083333333333330e-03 2865 3469 2.0833333333333329e-03 2865 3416 2.0833333333333333e-03 2865 3461 -6.2500000000000003e-03 2865 2867 3.7587087034409578e-19 2865 3414 -1.0416666666666664e-03 2865 3415 -2.0833333333333329e-03 2865 2863 5.2083333333333330e-03 2865 3467 2.0833333333333333e-03 2865 3464 -6.2499999999999986e-03 2865 2864 2.6745065309554533e-19 2865 563 2.0833333333333329e-03 2865 513 -2.0833333333333333e-03 2865 562 6.2500000000000003e-03 2865 51 3.7587087034409578e-19 2865 515 -1.0416666666666664e-03 2865 514 -2.0833333333333329e-03 2865 41 5.2083333333333330e-03 2865 516 2.0833333333333333e-03 2865 517 6.2499999999999986e-03 2865 42 2.6745065309554533e-19 2866 2866 4.9999999999999989e-02 2866 3465 4.1666666666666657e-03 2866 2865 5.2083333333333322e-03 2866 3468 1.0416666666666664e-02 2866 2869 -1.0416666666666664e-03 2866 3402 -2.0833333333333329e-03 2866 3405 4.1666666666666657e-03 2866 3401 -2.0833333333333329e-03 2866 2859 5.2083333333333322e-03 2866 3467 1.0416666666666664e-02 2866 3464 -2.0833333333333329e-03 2866 2864 -1.0416666666666664e-03 2866 562 2.0833333333333329e-03 2866 563 1.0416666666666664e-02 2866 561 2.0833333333333329e-03 2866 51 -1.0416666666666662e-03 2866 864 4.1666666666666657e-03 2866 863 -2.0833333333333329e-03 2866 43 5.2083333333333322e-03 2867 2867 1.2499999999999997e-02 2867 3416 1.0416666666666662e-03 2867 2863 -1.0416666666666662e-03 2867 2868 -1.0416666666666662e-03 2867 3469 1.0416666666666662e-03 2867 3462 -1.3552527156068805e-19 2867 3414 -1.0842021724855044e-19 2867 2865 4.3368086899420177e-19 2867 3461 4.3368086899420177e-19 2867 936 -1.0842021724855044e-19 2867 520 -1.3552527156068805e-19 2867 50 4.3368086899420177e-19 2868 2868 4.9999999999999989e-02 2868 3462 4.1666666666666657e-03 2868 2865 5.2083333333333322e-03 2868 3469 1.0416666666666664e-02 2868 2867 -1.0416666666666662e-03 2868 3461 -2.0833333333333329e-03 2868 517 2.0833333333333329e-03 2868 520 -4.1666666666666657e-03 2868 50 5.2083333333333322e-03 2868 521 -1.0416666666666664e-02 2868 48 -1.0416666666666664e-03 2868 495 4.1666666666666657e-03 2868 516 1.0416666666666664e-02 2868 39 5.2083333333333322e-03 2868 42 -1.0416666666666664e-03 2869 2869 1.2499999999999997e-02 2869 3468 1.0416666666666664e-03 2869 2866 -1.0416666666666664e-03 2869 2860 -1.0416666666666664e-03 2869 3413 1.0416666666666664e-03 2869 3403 -1.3552527156068805e-19 2869 3405 1.3552527156068805e-19 2869 2859 4.3368086899420177e-19 2869 3402 2.1684043449710089e-19 2869 864 -1.3552527156068805e-19 2869 862 1.3552527156068805e-19 2869 43 2.1684043449710089e-19 2869 863 4.3368086899420177e-19 2870 2870 1.2499999999999997e-02 2870 3454 -1.3552527156068805e-19 2870 3429 1.3552527156068805e-19 2870 3436 1.3552527156068805e-19 2870 3435 -1.0416666666666664e-03 2870 3442 -2.1684043449710089e-19 2870 2874 -1.0416666666666664e-03 2870 3427 -1.3552527156068805e-19 2870 3440 1.0416666666666664e-03 2870 3426 4.3368086899420177e-19 2870 2872 -1.0416666666666664e-03 2870 2871 2.1684043449710089e-19 2871 2871 4.7916666666666656e-02 2871 3423 1.0416666666666667e-03 2871 3146 5.0116116045879435e-20 2871 3428 -6.2499999999999995e-03 2871 2876 4.1666666666666657e-03 2871 3431 -9.3749999999999997e-03 2871 3485 1.0416666666666664e-03 2871 2875 1.0116749763768550e-19 2871 3435 -2.0833333333333333e-03 2871 3151 2.0833333333333333e-03 2871 3144 8.3333333333333350e-03 2871 2880 4.7433845046240819e-19 2871 3429 1.0416666666666664e-03 2871 3425 2.0833333333333329e-03 2871 3424 7.2916666666666650e-03 2871 2874 5.2083333333333330e-03 2871 2878 9.2717020499843766e-20 2871 3427 1.0416666666666664e-03 2871 3440 2.0833333333333329e-03 2871 3426 -6.2500000000000003e-03 2871 2872 5.2083333333333330e-03 2871 2870 2.6745065309554533e-19 2872 2872 4.9999999999999989e-02 2872 3442 2.0833333333333329e-03 2872 3454 -4.1666666666666657e-03 2872 3453 -1.0416666666666664e-02 2872 3144 2.0833333333333329e-03 2872 3452 -4.1666666666666657e-03 2872 3151 1.0416666666666664e-02 2872 3147 2.0833333333333329e-03 2872 2880 -1.0416666666666662e-03 2872 3427 4.1666666666666657e-03 2872 3440 1.0416666666666664e-02 2872 3426 -2.0833333333333329e-03 2872 2871 5.2083333333333322e-03 2872 2870 -1.0416666666666664e-03 2873 2873 2.0833333333333329e-02 2874 2874 4.9999999999999989e-02 2874 3034 1.0416666666666664e-02 2874 3426 -2.0833333333333329e-03 2874 3437 -4.1666666666666657e-03 2874 3421 2.0833333333333329e-03 2874 3429 4.1666666666666657e-03 2874 3425 1.0416666666666664e-02 2874 3424 2.0833333333333329e-03 2874 2871 5.2083333333333322e-03 2874 2878 -1.0416666666666662e-03 2874 3436 -4.1666666666666657e-03 2874 3435 -1.0416666666666664e-02 2874 3442 2.0833333333333329e-03 2874 2870 -1.0416666666666664e-03 2875 2875 3.7499999999999992e-02 2875 3249 6.2499999999999986e-03 2875 3147 5.2083333333333322e-03 2875 3456 -6.2499999999999986e-03 2875 3144 -2.1684043449710089e-19 2875 3146 6.2500000000000003e-03 2875 2880 1.0416666666666669e-03 2875 3428 -1.0416666666666667e-03 2875 2871 2.1684043449710089e-19 2875 3431 1.0416666666666671e-03 2875 3488 1.0416666666666664e-03 2875 3486 -1.0416666666666669e-03 2875 3485 -6.2499999999999995e-03 2875 2876 -2.0833333333333333e-03 2876 2876 2.4999999999999994e-02 2876 3489 -4.1666666666666666e-03 2876 3424 2.0833333333333329e-03 2876 3421 2.0833333333333329e-03 2876 3438 -2.0833333333333329e-03 2876 3423 4.1666666666666666e-03 2876 2878 -2.0833333333333333e-03 2876 3428 -2.0833333333333329e-03 2876 2871 4.1666666666666657e-03 2876 3431 -2.0833333333333329e-03 2876 3488 2.0833333333333329e-03 2876 3486 2.0833333333333329e-03 2876 3485 4.1666666666666675e-03 2876 2875 -2.0833333333333329e-03 2877 2877 2.7083333333333327e-02 2878 2878 1.8749999999999996e-02 2878 3428 -1.0416666666666664e-03 2878 3438 -1.0416666666666664e-03 2878 3423 -6.2500000000000003e-03 2878 2876 -2.0833333333333329e-03 2878 3437 -1.0842021724855044e-19 2878 3421 -1.0416666666666673e-03 2878 3429 -1.0842021724855044e-19 2878 3425 1.0416666666666662e-03 2878 3424 -1.0416666666666669e-03 2878 2874 -1.0416666666666662e-03 2878 2871 8.1315162936412833e-20 2879 2879 2.7083333333333327e-02 2880 2880 1.6666666666666663e-02 2880 3456 2.1961093809541182e-20 2880 3431 2.1684043449710089e-19 2880 3146 -1.0416666666666673e-03 2880 2875 1.0416666666666669e-03 2880 3427 1.3552527156068805e-19 2880 2871 4.3368086899420177e-19 2880 3144 -1.0842021724855044e-19 2880 3452 1.3552527156068805e-19 2880 3151 1.0416666666666662e-03 2880 3147 1.0416666666666662e-03 2880 2872 -1.0416666666666662e-03 2881 2881 3.9583333333333325e-02 2882 2882 6.2499999999999986e-03 2883 2883 6.2499999999999986e-03 2884 2884 1.2500000000000001e-02 2885 2885 1.0416666666666664e-02 2886 2886 1.0416666958333331e-02 2887 2887 4.9999999999999989e-02 2887 3462 1.0416666666666664e-02 2887 3469 4.1666666666666657e-03 2887 3461 2.0833333333333329e-03 2887 517 -2.0833333333333329e-03 2887 5 -1.0416666666666664e-03 2887 521 -4.1666666666666657e-03 2887 520 -1.0416666666666664e-02 2887 516 4.1666666666666657e-03 2887 495 1.0416666666666664e-02 2888 2888 1.6666666666666663e-10 2888 3707 1.0416666666666660e-11 2888 3463 1.0416666666666665e-11 2888 3461 1.0416666666666666e-11 2888 3470 -6.2500000000000004e-11 2888 5044 1.0416666666666666e-11 2888 5047 1.0416666666666666e-11 2888 4773 -2.0833333333333345e-11 2888 5 -1.0416666666666663e-11 2888 4350 -6.2500000000000004e-11 2889 2889 2.5000000000000002e-10 2890 2890 2.4999999999999994e-02 2890 3671 -4.1666666666666666e-03 2890 3670 2.0833333333333329e-03 2890 3678 2.0833333333333329e-03 2890 3527 -2.0833333333333329e-03 2890 3530 2.0833333333333329e-03 2890 3532 -2.0833333333333329e-03 2890 3528 4.1666666666666666e-03 2890 2900 -2.0833333333333333e-03 2890 3526 -2.0833333333333329e-03 2890 3525 -2.0833333333333329e-03 2890 3669 4.1666666666666666e-03 2890 2892 4.1666666666666657e-03 2890 2891 -2.0833333333333333e-03 2891 2891 2.5000000000000001e-02 2891 3678 1.0416666666666664e-03 2891 3380 1.0416666666666664e-03 2891 3670 -2.0833333333333337e-03 2891 3375 1.0416666666666664e-03 2891 3374 6.2500000000000003e-03 2891 2893 -2.0833333333333329e-03 2891 3526 2.0833333333333337e-03 2891 3525 -1.0416666666666664e-03 2891 3669 -6.2500000000000003e-03 2891 2892 1.3552527156068805e-20 2891 2890 -2.0833333333333329e-03 2892 2892 5.4166666666666655e-02 2892 3528 1.0416666666666667e-03 2892 3371 -1.0416666666666667e-03 2892 3380 6.2500000000000003e-03 2892 3374 -1.0416666666666667e-03 2892 2893 4.1666666666666666e-03 2892 3527 -9.3749999999999997e-03 2892 3515 2.1705219273391446e-19 2892 2900 1.6104213909672385e-19 2892 3513 1.0416666666666668e-02 2892 3524 9.3750000000000014e-03 2892 3512 5.0116116045879435e-20 2892 2896 -8.8991399020904929e-20 2892 2899 -1.4886604047994328e-19 2892 3526 -8.3333333333333315e-03 2892 3525 -6.2500000000000003e-03 2892 3669 1.0416666666666667e-03 2892 2891 -8.8991399020904929e-20 2892 2890 4.1666666666666666e-03 2893 2893 2.4999999999999994e-02 2893 3370 -4.1666666666666666e-03 2893 3523 -2.0833333333333329e-03 2893 3372 2.0833333333333329e-03 2893 3524 2.0833333333333329e-03 2893 3371 -4.1666666666666666e-03 2893 2899 -2.0833333333333333e-03 2893 3526 -2.0833333333333329e-03 2893 2892 4.1666666666666657e-03 2893 3380 2.0833333333333329e-03 2893 3670 2.0833333333333329e-03 2893 3375 2.0833333333333329e-03 2893 3374 -4.1666666666666666e-03 2893 2891 -2.0833333333333333e-03 2894 2894 3.3333333333333326e-02 2895 2895 1.0416666666666664e-02 2896 2896 4.9999999999999989e-02 2896 3308 6.2499999999999986e-03 2896 3518 6.2499999999999986e-03 2896 3530 5.2083333333333322e-03 2896 3527 -3.2249014814734037e-20 2896 3515 -6.2499999999999986e-03 2896 2900 1.0416666666666664e-03 2896 3513 -7.3183646642771549e-19 2896 3524 -2.1684043449710089e-19 2896 2892 1.3552527156068805e-20 2896 3523 -5.2083333333333330e-03 2896 3512 -6.2499999999999986e-03 2896 2899 1.0416666666666673e-03 2896 3517 6.2499999999999986e-03 2896 3514 -2.3039296165316969e-19 2896 3516 -6.2499999999999986e-03 2897 2897 2.0833333333333329e-02 2898 2898 4.5833333333333323e-02 2899 2899 2.2916666666666662e-02 2899 3372 1.0416666666666662e-03 2899 3380 1.0416666666666664e-03 2899 3371 6.2500000000000003e-03 2899 2893 -2.0833333333333329e-03 2899 3513 -2.1684043449710089e-19 2899 3524 -1.0416666666666680e-03 2899 3517 1.6263032587282567e-19 2899 2896 1.0416666666666671e-03 2899 3523 -4.3368086899420177e-19 2899 3512 1.0416666666666667e-03 2900 2900 2.2916666666666662e-02 2900 3525 -1.0416666666666664e-03 2900 3532 -1.0416666666666664e-03 2900 3528 -6.2500000000000003e-03 2900 2890 -2.0833333333333329e-03 2900 3518 -2.1684043449710089e-19 2900 3530 -1.0842021724855044e-18 2900 3513 2.1684043449710089e-19 2900 2892 2.3039296165316969e-19 2900 2896 1.0416666666666667e-03 2900 3527 1.0416666666666667e-03 2900 3515 1.0416666666666671e-03 2901 2901 4.5833333333333323e-02 2902 2902 1.0416666666666664e-02 2903 2903 1.2499999999999999e-02 2904 2904 1.2500000000000001e-02 2905 2905 2.4999999999999994e-02 2905 3604 -2.0833333333333329e-03 2905 3564 -2.0833333333333329e-03 2905 3614 -2.0833333333333329e-03 2905 3544 2.0833333333333329e-03 2905 3543 -4.1666666666666666e-03 2905 2910 -2.0833333333333333e-03 2905 3601 2.0833333333333329e-03 2905 3538 2.0833333333333329e-03 2905 3537 -4.1666666666666666e-03 2905 2909 4.1666666666666657e-03 2905 2908 -2.0833333333333333e-03 2905 3536 2.0833333333333329e-03 2905 3535 -4.1666666666666666e-03 2906 2906 1.2500000000000001e-02 2907 2907 3.3333333333333326e-02 2908 2908 2.4999999999999998e-02 2908 3605 1.0416666666666664e-03 2908 3536 1.0416666666666664e-03 2908 3564 2.0833333333333337e-03 2908 3563 -1.0416666666666664e-03 2908 3602 -6.2500000000000003e-03 2908 2912 -2.0833333333333329e-03 2908 3601 -2.0833333333333333e-03 2908 3538 1.0416666666666664e-03 2908 3537 6.2500000000000003e-03 2908 2909 8.1315162936412833e-20 2908 2905 -2.0833333333333329e-03 2909 2909 5.0000000166666655e-02 2909 3603 6.2500000000000003e-03 2909 2913 4.1666666666666666e-03 2909 3605 6.2500000000000003e-03 2909 2912 4.1666666666666666e-03 2909 3602 1.0416666666666667e-03 2909 3543 -1.0416666666666667e-03 2909 3604 -8.3333333333333315e-03 2909 3622 1.0416666666666667e-03 2909 2910 1.5502688168223823e-19 2909 3601 8.3333333333333315e-03 2909 3538 6.2500000000000003e-03 2909 3537 -1.0416666666666667e-03 2909 2908 1.5502688168223823e-19 2909 2905 4.1666666666666666e-03 2909 4523 1.0416666666666667e-03 2909 4496 -1.0416666666666666e-11 2909 4526 -4.1666667083333333e-03 2909 4527 -1.0416666666666667e-03 2909 3833 7.0197856548546410e-20 2909 4522 4.1666667083333324e-03 2909 4491 6.2499999999999991e-11 2909 4490 -1.0416666666666666e-11 2909 3832 8.4829026083874785e-20 2909 3831 4.1666666666666665e-11 2910 2910 2.5000000000000001e-02 2910 3615 -1.0416666666666664e-03 2910 3538 1.0416666666666662e-03 2910 3604 2.0833333333333337e-03 2910 3603 1.0416666666666664e-03 2910 3622 -6.2500000000000003e-03 2910 2909 8.1315162936412833e-20 2910 2913 -2.0833333333333329e-03 2910 3614 2.0833333333333337e-03 2910 3544 1.0416666666666664e-03 2910 3543 6.2500000000000003e-03 2910 2905 -2.0833333333333329e-03 2911 2911 3.3333333333333326e-02 2912 2912 2.4999999999999994e-02 2912 3629 -4.1666666666666666e-03 2912 3605 2.0833333333333329e-03 2912 2909 4.1666666666666657e-03 2912 3601 2.0833333333333329e-03 2912 3564 -2.0833333333333329e-03 2912 3563 -2.0833333333333329e-03 2912 3602 4.1666666666666666e-03 2912 2908 -2.0833333333333333e-03 2912 4545 2.0833333333333329e-03 2912 4530 2.0833333333333329e-03 2912 4526 -2.0833333333333329e-03 2912 4527 -4.1666666666666666e-03 2912 3833 -2.0833333333333333e-03 2913 2913 2.4999999999999994e-02 2913 3691 -4.1666666666666666e-03 2913 2909 4.1666666666666657e-03 2913 3603 2.0833333333333329e-03 2913 3614 -2.0833333333333329e-03 2913 3615 -2.0833333333333329e-03 2913 3604 -2.0833333333333329e-03 2913 3622 4.1666666666666666e-03 2913 2910 -2.0833333333333333e-03 2913 4522 2.0833333333333329e-03 2913 4524 2.0833333333333329e-03 2913 4965 2.0833333333333329e-03 2913 4523 4.1666666666666666e-03 2913 3832 -2.0833333333333333e-03 2914 2914 1.2500000000000001e-02 2915 2915 1.2500000000000001e-02 2916 2916 2.4999999999999994e-02 2916 3608 2.0833333333333329e-03 2916 3559 -2.0833333333333329e-03 2916 3541 -4.1666666666666666e-03 2916 2930 -2.0833333333333333e-03 2916 3542 2.0833333333333329e-03 2916 3535 -4.1666666666666666e-03 2916 3552 2.0833333333333329e-03 2916 2919 4.1666666666666657e-03 2916 3545 2.0833333333333329e-03 2916 3550 2.0833333333333329e-03 2916 3546 2.0833333333333329e-03 2916 3539 -4.1666666666666666e-03 2916 2917 -2.0833333333333333e-03 2917 2917 2.5000000000000001e-02 2917 3553 -1.0416666666666664e-03 2917 3556 -1.0416666666666664e-03 2917 3549 -6.2500000000000003e-03 2917 2921 -2.0833333333333329e-03 2917 3552 -2.0833333333333337e-03 2917 2919 8.1315162936412833e-20 2917 3545 1.0416666666666662e-03 2917 3550 -2.0833333333333337e-03 2917 3546 1.0416666666666664e-03 2917 3539 6.2500000000000003e-03 2917 2916 -2.0833333333333329e-03 2918 2918 3.3333333333333326e-02 2919 2919 6.6666666666666652e-02 2919 3285 -1.0416666666666667e-03 2919 3541 -1.0416666666666667e-03 2919 3559 -8.3333333333333315e-03 2919 2930 1.5502688168223823e-19 2919 3293 6.2500000000000003e-03 2919 3289 -1.0416666666666667e-03 2919 2929 4.1666666666666666e-03 2919 3300 8.3333333333333315e-03 2919 2927 1.5502688168223823e-19 2919 3297 1.0416666666666667e-03 2919 3549 1.0416666666666667e-03 2919 3558 -6.2500000000000003e-03 2919 3572 1.0416666666666667e-03 2919 2925 4.1666666666666666e-03 2919 3557 -8.3333333333333315e-03 2919 2922 1.5502688168223823e-19 2919 3556 -6.2500000000000003e-03 2919 3568 -1.0416666666666667e-03 2919 2921 4.1666666666666666e-03 2919 3552 8.3333333333333315e-03 2919 2917 1.5502688168223823e-19 2919 3545 6.2500000000000003e-03 2919 3539 -1.0416666666666667e-03 2919 2916 4.1666666666666666e-03 2920 2920 1.2500000000000001e-02 2921 2921 2.4999999999999994e-02 2921 3550 2.0833333333333329e-03 2921 3552 2.0833333333333329e-03 2921 3549 4.1666666666666666e-03 2921 2917 -2.0833333333333333e-03 2921 3553 -2.0833333333333329e-03 2921 3566 -4.1666666666666666e-03 2921 3557 -2.0833333333333329e-03 2921 2919 4.1666666666666657e-03 2921 3556 -2.0833333333333329e-03 2921 3573 2.0833333333333329e-03 2921 3570 2.0833333333333329e-03 2921 3568 -4.1666666666666666e-03 2921 2922 -2.0833333333333333e-03 2922 2922 2.5000000000000001e-02 2922 3575 -1.0416666666666664e-03 2922 3558 -1.0416666666666664e-03 2922 3572 -6.2500000000000003e-03 2922 2925 -2.0833333333333329e-03 2922 3557 2.0833333333333333e-03 2922 2919 8.1315162936412833e-20 2922 3556 -1.0416666666666664e-03 2922 3573 -2.0833333333333337e-03 2922 3570 1.0416666666666664e-03 2922 3568 6.2500000000000003e-03 2922 2921 -2.0833333333333329e-03 2923 2923 3.3333333333333326e-02 2924 2924 1.2500000000000001e-02 2925 2925 2.4999999999999994e-02 2925 3300 2.0833333333333329e-03 2925 3296 2.0833333333333329e-03 2925 3586 2.0833333333333329e-03 2925 3297 4.1666666666666666e-03 2925 2927 -2.0833333333333333e-03 2925 3573 2.0833333333333329e-03 2925 3557 -2.0833333333333329e-03 2925 3558 -2.0833333333333329e-03 2925 3572 4.1666666666666666e-03 2925 2919 4.1666666666666657e-03 2925 2922 -2.0833333333333333e-03 2925 3575 -2.0833333333333329e-03 2925 3581 -4.1666666666666666e-03 2926 2926 1.2500000000000001e-02 2927 2927 2.5000000000000001e-02 2927 3286 1.0416666666666664e-03 2927 3293 1.0416666666666664e-03 2927 3285 6.2500000000000003e-03 2927 2929 -2.0833333333333329e-03 2927 3300 -2.0833333333333337e-03 2927 2919 8.1315162936412833e-20 2927 3558 -1.0416666666666662e-03 2927 3296 -2.0833333333333337e-03 2927 3586 1.0416666666666664e-03 2927 3297 -6.2500000000000003e-03 2927 2925 -2.0833333333333329e-03 2928 2928 3.3333333333333326e-02 2929 2929 2.4999999999999994e-02 2929 3296 2.0833333333333329e-03 2929 3300 2.0833333333333329e-03 2929 3285 -4.1666666666666666e-03 2929 2927 -2.0833333333333333e-03 2929 3286 2.0833333333333329e-03 2929 3283 -4.1666666666666666e-03 2929 3559 -2.0833333333333329e-03 2929 2919 4.1666666666666657e-03 2929 3293 2.0833333333333329e-03 2929 3608 2.0833333333333329e-03 2929 3294 2.0833333333333329e-03 2929 3289 -4.1666666666666666e-03 2929 2930 -2.0833333333333333e-03 2930 2930 2.5000000000000001e-02 2930 3542 1.0416666666666664e-03 2930 3545 1.0416666666666664e-03 2930 3541 6.2500000000000003e-03 2930 2916 -2.0833333333333329e-03 2930 3559 2.0833333333333333e-03 2930 2919 8.1315162936412833e-20 2930 3293 1.0416666666666664e-03 2930 3608 -2.0833333333333337e-03 2930 3294 1.0416666666666664e-03 2930 3289 6.2500000000000003e-03 2930 2929 -2.0833333333333329e-03 2931 2931 3.3333333333333326e-02 2932 2932 1.2500000000000001e-02 2933 2933 2.4999999999999994e-02 2933 3579 -4.1666666666666666e-03 2933 3574 2.0833333333333329e-03 2933 3585 2.0833333333333329e-03 2933 3580 2.0833333333333329e-03 2933 3581 -4.1666666666666666e-03 2933 3573 2.0833333333333329e-03 2933 3575 -2.0833333333333329e-03 2933 3572 4.1666666666666666e-03 2933 2934 -2.0833333333333333e-03 2934 2934 2.4999999999999998e-02 2934 3585 1.0416666666666664e-03 2934 3570 1.0416666666666664e-03 2934 3574 -2.0833333333333333e-03 2934 3569 1.0416666666666664e-03 2934 3568 6.2500000000000003e-03 2934 2936 -2.0833333333333329e-03 2934 3573 -2.0833333333333337e-03 2934 3575 -1.0416666666666664e-03 2934 3572 -6.2500000000000003e-03 2934 2933 -2.0833333333333329e-03 2935 2935 3.3333333333333326e-02 2936 2936 2.4999999999999994e-02 2936 3183 4.1666666666666666e-03 2936 3567 2.0833333333333329e-03 2936 3566 -4.1666666666666666e-03 2936 3573 2.0833333333333329e-03 2936 3570 2.0833333333333329e-03 2936 3574 2.0833333333333329e-03 2936 3569 2.0833333333333329e-03 2936 3568 -4.1666666666666666e-03 2936 2934 -2.0833333333333333e-03 2937 2937 3.3333333333333326e-02 2938 2938 1.2500000000000001e-02 2939 2939 1.6666666666666663e-02 2940 2940 1.2500000000000001e-02 2941 2941 1.6666666666666663e-02 2942 2942 1.2500000000000001e-02 2943 2943 1.2499999999999999e-02 2944 2944 2.4999999999999994e-02 2944 3584 2.0833333333333329e-03 2944 3583 -4.1666666666666666e-03 2944 3582 2.0833333333333329e-03 2944 3581 -4.1666666666666666e-03 2944 3580 2.0833333333333329e-03 2944 3579 -4.1666666666666666e-03 2945 2945 1.2499999999999999e-02 2946 2946 1.6666666666666663e-02 2947 2947 1.2500000000000001e-02 2948 2948 1.6666666666666663e-02 2949 2949 1.2500000000000001e-02 2950 2950 1.6666666666666663e-02 2951 2951 2.4999999999999994e-02 2951 3614 -2.0833333333333329e-03 2951 3620 -2.0833333333333329e-03 2951 3543 -4.1666666666666666e-03 2951 2964 -2.0833333333333333e-03 2951 3609 2.0833333333333329e-03 2951 2955 4.1666666666666657e-03 2951 3548 2.0833333333333329e-03 2951 3544 2.0833333333333329e-03 2951 3535 -4.1666666666666666e-03 2951 3608 2.0833333333333329e-03 2951 3542 2.0833333333333329e-03 2951 3541 -4.1666666666666666e-03 2951 2952 -2.0833333333333333e-03 2952 2952 2.4999999999999998e-02 2952 3548 1.0416666666666664e-03 2952 3294 1.0416666666666664e-03 2952 3609 -2.0833333333333333e-03 2952 3290 1.0416666666666664e-03 2952 3289 6.2500000000000003e-03 2952 2955 8.1315162936412833e-20 2952 2954 -2.0833333333333329e-03 2952 3608 -2.0833333333333337e-03 2952 3542 1.0416666666666664e-03 2952 3541 6.2500000000000003e-03 2952 2951 -2.0833333333333329e-03 2953 2953 3.3333333333333326e-02 2954 2954 2.4999999999999994e-02 2954 3531 2.0833333333333329e-03 2954 3529 2.0833333333333329e-03 2954 3288 -4.1666666666666666e-03 2954 2965 -2.0833333333333333e-03 2954 3284 2.0833333333333329e-03 2954 3283 -4.1666666666666666e-03 2954 3608 2.0833333333333329e-03 2954 3294 2.0833333333333329e-03 2954 3609 2.0833333333333329e-03 2954 3290 2.0833333333333329e-03 2954 3289 -4.1666666666666666e-03 2954 2955 4.1666666666666657e-03 2954 2952 -2.0833333333333333e-03 2955 2955 6.6666666666666652e-02 2955 3622 1.0416666666666667e-03 2955 3528 1.0416666666666667e-03 2955 3621 -6.2500000000000003e-03 2955 3674 -1.0416666666666667e-03 2955 2958 4.1666666666666666e-03 2955 3531 8.3333333333333315e-03 2955 2965 1.5502688168223823e-19 2955 3288 -1.0416666666666667e-03 2955 3620 -8.3333333333333315e-03 2955 3543 -1.0416666666666667e-03 2955 2964 1.5502688168223823e-19 2955 3548 6.2500000000000003e-03 2955 3541 -1.0416666666666667e-03 2955 2951 4.1666666666666666e-03 2955 3619 -8.3333333333333315e-03 2955 3618 -6.2500000000000003e-03 2955 3688 1.0416666666666667e-03 2955 2957 1.5502688168223823e-19 2955 2956 4.1666666666666666e-03 2955 3609 8.3333333333333315e-03 2955 3290 6.2500000000000003e-03 2955 3289 -1.0416666666666667e-03 2955 2952 1.5502688168223823e-19 2955 2954 4.1666666666666666e-03 2956 2956 2.4999999999999994e-02 2956 3691 -4.1666666666666666e-03 2956 3689 2.0833333333333329e-03 2956 3694 2.0833333333333329e-03 2956 3620 -2.0833333333333329e-03 2956 3614 -2.0833333333333329e-03 2956 3615 -2.0833333333333329e-03 2956 3622 4.1666666666666666e-03 2956 2964 -2.0833333333333333e-03 2956 3619 -2.0833333333333329e-03 2956 3618 -2.0833333333333329e-03 2956 3688 4.1666666666666666e-03 2956 2955 4.1666666666666657e-03 2956 2957 -2.0833333333333333e-03 2957 2957 2.5000000000000001e-02 2957 3694 1.0416666666666664e-03 2957 3621 -1.0416666666666664e-03 2957 3689 -2.0833333333333337e-03 2957 3675 1.0416666666666664e-03 2957 3674 6.2500000000000003e-03 2957 2958 -2.0833333333333329e-03 2957 3619 2.0833333333333333e-03 2957 3618 -1.0416666666666664e-03 2957 3688 -6.2500000000000003e-03 2957 2955 8.1315162936412833e-20 2957 2956 -2.0833333333333329e-03 2958 2958 2.4999999999999994e-02 2958 3676 -4.1666666666666666e-03 2958 3529 2.0833333333333329e-03 2958 3612 -2.0833333333333329e-03 2958 3531 2.0833333333333329e-03 2958 3528 4.1666666666666666e-03 2958 2965 -2.0833333333333333e-03 2958 3619 -2.0833333333333329e-03 2958 2955 4.1666666666666657e-03 2958 3621 -2.0833333333333329e-03 2958 3689 2.0833333333333329e-03 2958 3675 2.0833333333333329e-03 2958 3674 -4.1666666666666666e-03 2958 2957 -2.0833333333333333e-03 2959 2959 3.3333333333333326e-02 2960 2960 1.2500000000000001e-02 2961 2961 3.3333333333333326e-02 2962 2962 1.2500000000000001e-02 2963 2963 3.3333333333333326e-02 2964 2964 2.4999999999999998e-02 2964 3618 -1.0416666666666662e-03 2964 3615 -1.0416666666666664e-03 2964 3622 -6.2500000000000003e-03 2964 2956 -2.0833333333333329e-03 2964 3614 2.0833333333333337e-03 2964 3544 1.0416666666666664e-03 2964 3620 2.0833333333333337e-03 2964 3548 1.0416666666666664e-03 2964 3543 6.2500000000000003e-03 2964 2955 8.1315162936412833e-20 2964 2951 -2.0833333333333329e-03 2965 2965 2.5000000000000001e-02 2965 3612 -1.0416666666666664e-03 2965 3621 -1.0416666666666664e-03 2965 3528 -6.2500000000000003e-03 2965 2958 -2.0833333333333329e-03 2965 3531 -2.0833333333333337e-03 2965 2955 8.1315162936412833e-20 2965 3290 1.0416666666666662e-03 2965 3529 -2.0833333333333337e-03 2965 3284 1.0416666666666664e-03 2965 3288 6.2500000000000003e-03 2965 2954 -2.0833333333333329e-03 2966 2966 1.2500000000000001e-02 2967 2967 1.2500000000000001e-02 2968 2968 2.2916666666666662e-02 2968 3630 -4.1666666666666657e-03 2968 3633 2.0833333333333329e-03 2968 2971 4.1666666666666657e-03 2968 3361 2.0833333333333329e-03 2968 3358 2.0833333333333329e-03 2968 3634 2.0833333333333329e-03 2968 3359 4.1666666666666666e-03 2968 2969 -2.0833333333333333e-03 2968 4782 4.5316262678105068e-20 2968 4566 -2.0833333333333329e-03 2968 4786 4.1666666666666666e-03 2968 3914 -4.1666666666666657e-03 2969 2969 2.5000000000000001e-02 2969 3334 1.0416666666666664e-03 2969 3340 1.0416666666666664e-03 2969 3333 6.2500000000000003e-03 2969 2973 -2.0833333333333329e-03 2969 3361 -2.0833333333333337e-03 2969 2971 8.1315162936412833e-20 2969 3633 1.0416666666666664e-03 2969 3358 -2.0833333333333337e-03 2969 3634 1.0416666666666664e-03 2969 3359 -6.2500000000000003e-03 2969 2968 -2.0833333333333329e-03 2970 2970 3.3333333333333326e-02 2971 2971 7.9166666666666649e-02 2971 3640 6.2500000000000003e-03 2971 2977 4.1666666666666666e-03 2971 3633 6.2500000000000003e-03 2971 2968 4.1666666666666666e-03 2971 3333 -1.0416666666666667e-03 2971 3641 1.0416666666666667e-03 2971 3639 -8.3333333333333315e-03 2971 2974 -8.8991399020904929e-20 2971 3340 6.2500000000000003e-03 2971 3335 -1.0416666666666667e-03 2971 2973 4.1666666666666666e-03 2971 3361 8.3333333333333315e-03 2971 2969 1.5502688168223823e-19 2971 3359 1.0416666666666667e-03 2971 4561 -3.1249999999999997e-03 2971 4567 -1.6666666666666666e-02 2971 4784 -3.1249999999999997e-03 2971 3919 2.0833333333333337e-03 2971 4560 7.2916666666666659e-03 2971 3913 5.2083333333333322e-03 2971 4547 -1.0416666666666667e-03 2971 4566 -7.2916666666666659e-03 2971 4786 1.0416666666666667e-03 2971 3914 5.2083333333333330e-03 2972 2972 1.8749999999999996e-02 2973 2973 2.4999999999999994e-02 2973 3358 2.0833333333333329e-03 2973 3361 2.0833333333333329e-03 2973 3333 -4.1666666666666666e-03 2973 2969 -2.0833333333333333e-03 2973 3334 2.0833333333333329e-03 2973 3331 -4.1666666666666666e-03 2973 3639 -2.0833333333333329e-03 2973 2971 4.1666666666666657e-03 2973 3340 2.0833333333333329e-03 2973 3642 2.0833333333333329e-03 2973 3341 2.0833333333333329e-03 2973 3335 -4.1666666666666666e-03 2973 2974 -2.0833333333333333e-03 2974 2974 2.4999999999999998e-02 2974 3644 -1.0416666666666664e-03 2974 3640 1.0416666666666664e-03 2974 3641 -6.2500000000000003e-03 2974 2977 -2.0833333333333329e-03 2974 3639 2.0833333333333337e-03 2974 2971 1.3552527156068805e-20 2974 3340 1.0416666666666664e-03 2974 3642 -2.0833333333333333e-03 2974 3341 1.0416666666666664e-03 2974 3335 6.2500000000000003e-03 2974 2973 -2.0833333333333329e-03 2975 2975 3.3333333333333326e-02 2976 2976 1.2499999999999999e-02 2977 2977 2.2916666666666662e-02 2977 2971 4.1666666666666657e-03 2977 3640 2.0833333333333329e-03 2977 3650 -4.1666666666666675e-03 2977 3642 2.0833333333333329e-03 2977 3639 -2.0833333333333329e-03 2977 3641 4.1666666666666666e-03 2977 2974 -2.0833333333333333e-03 2977 3644 -2.0833333333333329e-03 2977 4560 2.0833333333333329e-03 2977 4554 -2.8940292364521927e-21 2977 4547 -4.1666666666666666e-03 2977 3913 -4.1666666666666657e-03 2978 2978 1.8749999999999996e-02 2979 2979 2.4999999999999994e-02 2979 3648 -4.1666666666666666e-03 2979 3643 2.0833333333333329e-03 2979 3651 2.0833333333333329e-03 2979 3649 2.0833333333333329e-03 2979 3650 -4.1666666666666666e-03 2979 3642 2.0833333333333329e-03 2979 3644 -2.0833333333333329e-03 2979 3641 4.1666666666666666e-03 2979 2980 -2.0833333333333333e-03 2980 2980 2.5000000000000001e-02 2980 3651 1.0416666666666664e-03 2980 3341 1.0416666666666664e-03 2980 3643 -2.0833333333333337e-03 2980 3336 1.0416666666666664e-03 2980 3335 6.2500000000000003e-03 2980 2982 -2.0833333333333329e-03 2980 3642 -2.0833333333333333e-03 2980 3644 -1.0416666666666664e-03 2980 3641 -6.2500000000000003e-03 2980 2979 -2.0833333333333329e-03 2981 2981 3.3333333333333326e-02 2982 2982 2.4999999999999994e-02 2982 3327 -4.1666666666666666e-03 2982 3332 2.0833333333333329e-03 2982 3331 -4.1666666666666666e-03 2982 3642 2.0833333333333329e-03 2982 3341 2.0833333333333329e-03 2982 3643 2.0833333333333329e-03 2982 3336 2.0833333333333329e-03 2982 3335 -4.1666666666666666e-03 2982 2980 -2.0833333333333333e-03 2983 2983 3.3333333333333326e-02 2984 2984 1.2500000000000001e-02 2985 2985 1.6666666666666663e-02 2986 2986 1.2499999999999999e-02 2987 2987 1.6666666666666663e-02 2988 2988 1.2500000000000001e-02 2989 2989 1.2500000000000001e-02 2990 2990 3.7499999999999992e-02 2990 3648 -4.1666666666666666e-03 2990 3650 -4.1666666666666657e-03 2990 3649 2.0833333333333329e-03 2990 4554 4.1666666666666657e-03 2990 4557 4.1666666666666657e-03 2990 4547 -1.6666666666666666e-02 2990 3911 -6.2499999999999986e-03 2990 4549 2.0833333333333329e-03 2990 4548 -4.1666666666666675e-03 2991 2991 1.2500000000000001e-02 2992 2992 1.6666666666666663e-02 2993 2993 2.4999999999999994e-02 2994 2994 2.4999999999999994e-02 2994 3626 2.0833333333333329e-03 2994 2997 4.1666666666666657e-03 2994 3623 -4.1666666666666666e-03 2994 2998 -2.0833333333333333e-03 2994 3659 -2.0833333333333329e-03 2994 3656 2.0833333333333329e-03 2994 3655 2.0833333333333329e-03 2994 3627 2.0833333333333329e-03 2994 3624 -4.1666666666666666e-03 2994 2996 4.1666666666666657e-03 2994 2995 -2.0833333333333333e-03 2994 4898 2.0833333333333329e-03 2994 4899 2.0833333333333329e-03 2994 4895 -4.1666666666666666e-03 2994 4175 -2.0833333333333333e-03 2994 4942 -2.0833333333333329e-03 2994 4896 2.0833333333333329e-03 2994 4176 4.1666666666666657e-03 2995 2995 2.5000000000000001e-02 2995 3632 1.0416666666666664e-03 2995 3636 1.0416666666666664e-03 2995 3631 6.2500000000000003e-03 2995 2999 -2.0833333333333329e-03 2995 3656 -2.0833333333333337e-03 2995 2997 8.1315162936412833e-20 2995 3626 1.0416666666666662e-03 2995 3655 -2.0833333333333337e-03 2995 3627 1.0416666666666664e-03 2995 3624 6.2500000000000003e-03 2995 2996 1.3552527156068805e-20 2995 2994 -2.0833333333333329e-03 2996 2996 3.3333333666666659e-02 2996 3660 4.1666667083333333e-03 2996 3000 -7.4433021799253829e-20 2996 3658 8.3333333333333330e-11 2996 3701 -1.0416666666666666e-11 2996 3002 -3.0991386737738975e-27 2996 3698 -1.0416666666666666e-11 2996 3657 -6.2499999999999991e-11 2996 3661 -1.0416666666666666e-11 2996 3001 4.1666666666666665e-11 2996 3631 -1.0416666666666667e-03 2996 3632 6.2500000000000003e-03 2996 3635 -1.0416666666666667e-03 2996 2999 4.1666666666666666e-03 2996 3659 -4.1666667083333324e-03 2996 2998 -1.4558380320789774e-20 2996 3623 -1.0416666666666667e-03 2996 3655 8.3333333333333315e-03 2996 3627 6.2500000000000003e-03 2996 3624 -1.0416666666666667e-03 2996 2995 -8.8991399020904929e-20 2996 2994 4.1666666666666666e-03 2996 4763 -1.0416666666666666e-11 2996 4768 6.2499999999999991e-11 2996 4182 4.1666666666666665e-11 2997 2997 6.0416666666666653e-02 2997 3626 6.2500000000000003e-03 2997 2994 4.1666666666666666e-03 2997 3636 6.2500000000000003e-03 2997 2999 4.1666666666666666e-03 2997 3631 -1.0416666666666667e-03 2997 3656 8.3333333333333315e-03 2997 2995 1.5502688168223823e-19 2997 3624 -1.0416666666666667e-03 2997 4895 -1.0416666666666667e-03 2997 4899 8.3333333333333315e-03 2997 4175 1.5502688168223823e-19 2997 4897 1.0416666666666667e-03 2997 4786 1.0416666666666667e-03 2997 4905 6.2499999999999995e-03 2997 4173 4.1666666666666657e-03 2997 4900 -1.0416666666666664e-03 2997 4785 9.3749999999999997e-03 2997 4907 9.3750000000000014e-03 2997 4784 -5.0116116045879435e-20 2997 4170 1.5502688168223823e-19 2997 4169 4.6263880787845817e-19 2998 2998 1.2500000125000001e-02 2998 3661 6.2500000000000004e-11 2998 3001 -2.0833333333333326e-11 2998 3623 6.2500000000000003e-03 2998 2994 -2.0833333333333329e-03 2998 3657 -1.0416666666666663e-11 2998 3659 1.0416666770833331e-03 2998 2996 1.3552525540481672e-20 2998 3627 1.0416666666666664e-03 2998 4943 -1.0416666666666665e-11 2998 4942 1.0416666770833340e-03 2998 4896 1.0416666666666664e-03 2998 4176 1.6155871338926322e-27 2999 2999 2.2916666666666662e-02 2999 2997 4.1666666666666657e-03 2999 3636 2.0833333333333329e-03 2999 3635 -4.1666666666666675e-03 2999 3000 -4.1666666666666666e-03 2999 3655 2.0833333333333329e-03 2999 3656 2.0833333333333329e-03 2999 3631 -4.1666666666666666e-03 2999 2995 -2.0833333333333333e-03 2999 3660 2.0833333333333329e-03 2999 3632 2.0833333333333329e-03 2999 2996 4.1666666666666657e-03 2999 4785 2.0833333333333329e-03 2999 4791 2.8940292364521927e-21 2999 4786 4.1666666666666675e-03 2999 4170 -4.1666666666666657e-03 3000 3000 1.8750000124999996e-02 3000 3660 -1.0416666770833340e-03 3000 2996 -1.0097419586828951e-27 3000 3635 1.0416666666666666e-02 3000 2999 -4.1666666666666666e-03 3000 3632 1.0416666666666664e-03 3000 4768 1.0416666666666665e-11 3000 4762 1.0416666666666663e-11 3000 4763 6.2500000000000004e-11 3000 4182 -2.0833333333333326e-11 3000 4786 -5.2083333333333330e-03 3000 4795 -1.0416666680219200e-11 3000 4172 8.1315162936412833e-20 3000 4790 -4.9904357809065860e-20 3000 4791 1.0416666666666669e-03 3000 4170 6.2499999999999995e-03 3001 3001 2.4999999999999996e-10 3001 2998 -2.0833333333333326e-11 3001 3661 -4.1666666666666665e-11 3001 3003 4.1666666666666665e-11 3001 3700 2.0833333333333326e-11 3001 3658 2.0833333333333332e-11 3001 3703 2.0833333333333332e-11 3001 3698 -4.1666666666666665e-11 3001 3002 -2.0833333333333326e-11 3001 3659 -2.0833333333333332e-11 3001 3657 -2.0833333333333326e-11 3001 2996 4.1666666666666665e-11 3001 4942 -2.0833333333333332e-11 3001 4992 -2.0833333333333329e-11 3001 4941 -2.0833333333333332e-11 3001 4943 -2.0833333333333326e-11 3001 5002 -4.1666666666666665e-11 3001 4176 4.1666666666666665e-11 3001 4183 -2.0833333333333326e-11 3002 3002 2.4999999999999996e-10 3002 3703 -2.0833333333333339e-11 3002 3003 1.6155871338926322e-27 3002 3658 -2.0833333333333339e-11 3002 3701 6.2500000000000004e-11 3002 2996 -2.6253290925755273e-27 3002 3657 -1.0416666666666666e-11 3002 3700 1.0416666666666665e-11 3002 3698 6.2499999999999991e-11 3002 3001 -2.0833333333333326e-11 3002 4767 1.0416666666666665e-11 3002 4768 1.0416666666666666e-11 3002 4182 -2.0833333333333326e-11 3003 3003 6.6666666666666674e-10 3003 3700 6.2499999999999991e-11 3003 3001 4.1666666666666665e-11 3003 3703 8.3333333333333330e-11 3003 3002 9.5018296033870872e-28 3003 3701 -1.0416666666666666e-11 3003 3698 -1.0416666666666666e-11 3003 4981 -1.0416666666666666e-11 3003 4992 -8.3333333333333330e-11 3003 4183 9.5018296033870872e-28 3003 5002 -1.0416666666666666e-11 3003 4663 -1.0416666666666666e-11 3003 4767 6.2499999999999991e-11 3003 4761 -1.0416666666666666e-11 3003 4182 4.1666666666666665e-11 3003 4991 -8.3333333333333330e-11 3003 4181 9.5018296033870872e-28 3003 4673 6.2499999999999991e-11 3003 4667 -1.0416666666666666e-11 3003 4180 4.1666666666666665e-11 3003 4681 8.3333333333333330e-11 3003 4178 9.5018296033870872e-28 3003 4983 6.2499999999999991e-11 3003 4678 1.0416666666666666e-11 3003 4177 4.1666666666666665e-11 3004 3004 2.4999999999999994e-02 3004 3676 -4.1666666666666666e-03 3004 3687 2.0833333333333329e-03 3004 3680 2.0833333333333329e-03 3004 3677 2.0833333333333329e-03 3004 3671 -4.1666666666666666e-03 3004 3685 2.0833333333333329e-03 3004 3673 2.0833333333333329e-03 3004 3672 -4.1666666666666666e-03 3004 3005 -2.0833333333333333e-03 3005 3005 2.5000000000000001e-02 3005 3685 -2.0833333333333337e-03 3005 3687 -2.0833333333333337e-03 3005 3680 1.0416666666666664e-03 3005 3673 1.0416666666666664e-03 3005 3672 6.2500000000000003e-03 3005 3004 -2.0833333333333329e-03 3005 4954 1.0416666666666662e-03 3005 4951 1.0416666666666664e-03 3005 4950 6.2500000000000003e-03 3005 4290 -2.0833333333333329e-03 3006 3006 3.3333333333333326e-02 3007 3007 1.2499999999999999e-02 3008 3008 1.6666666666666663e-02 3009 3009 3.3333333333333326e-02 3010 3010 1.2500000000000001e-02 3011 3011 2.4999999999999994e-02 3011 3693 2.0833333333333329e-03 3011 3014 4.1666666666666657e-03 3011 3691 -4.1666666666666666e-03 3011 3690 2.0833333333333329e-03 3011 3689 2.0833333333333329e-03 3011 3694 2.0833333333333329e-03 3011 3688 4.1666666666666666e-03 3011 3012 -2.0833333333333333e-03 3011 4635 2.0833333333333329e-03 3011 4636 2.0833333333333329e-03 3011 4634 4.1666666666666666e-03 3011 3991 -2.0833333333333333e-03 3011 4637 -2.0833333333333329e-03 3012 3012 2.5000000000000001e-02 3012 3675 1.0416666666666664e-03 3012 3679 1.0416666666666664e-03 3012 3674 6.2500000000000003e-03 3012 3016 -2.0833333333333329e-03 3012 3690 -2.0833333333333333e-03 3012 3014 8.1315162936412833e-20 3012 3693 1.0416666666666664e-03 3012 3689 -2.0833333333333337e-03 3012 3694 1.0416666666666664e-03 3012 3688 -6.2500000000000003e-03 3012 3011 -2.0833333333333329e-03 3013 3013 3.3333333333333326e-02 3014 3014 6.6666666666666652e-02 3014 3686 8.3333333333333315e-03 3014 3018 1.5502688168223823e-19 3014 3693 6.2500000000000003e-03 3014 3011 4.1666666666666666e-03 3014 3672 -1.0416666666666667e-03 3014 3679 6.2500000000000003e-03 3014 3674 -1.0416666666666667e-03 3014 3016 4.1666666666666666e-03 3014 3690 8.3333333333333315e-03 3014 3012 1.5502688168223823e-19 3014 3688 1.0416666666666667e-03 3014 4950 -1.0416666666666667e-03 3014 4622 -1.0416666666666667e-03 3014 4641 -8.3333333333333315e-03 3014 3995 1.5502688168223823e-19 3014 4640 -6.2500000000000003e-03 3014 4952 -1.0416666666666667e-03 3014 3994 4.1666666666666666e-03 3014 4634 1.0416666666666667e-03 3014 4636 8.3333333333333315e-03 3014 3991 1.5502688168223823e-19 3014 4628 6.2500000000000003e-03 3014 4620 -1.0416666666666667e-03 3014 3990 4.1666666666666666e-03 3015 3015 1.2500000000000001e-02 3016 3016 2.4999999999999994e-02 3016 3686 2.0833333333333329e-03 3016 3687 2.0833333333333329e-03 3016 3680 2.0833333333333329e-03 3016 3672 -4.1666666666666666e-03 3016 3018 -2.0833333333333333e-03 3016 3689 2.0833333333333329e-03 3016 3690 2.0833333333333329e-03 3016 3679 2.0833333333333329e-03 3016 3674 -4.1666666666666666e-03 3016 3014 4.1666666666666657e-03 3016 3012 -2.0833333333333333e-03 3016 3675 2.0833333333333329e-03 3016 3676 -4.1666666666666666e-03 3017 3017 1.2500000000000001e-02 3018 3018 2.5000000000000001e-02 3018 3687 -2.0833333333333337e-03 3018 3686 -2.0833333333333337e-03 3018 3014 8.1315162936412833e-20 3018 3679 1.0416666666666662e-03 3018 3680 1.0416666666666664e-03 3018 3672 6.2500000000000003e-03 3018 3016 -2.0833333333333329e-03 3018 4951 1.0416666666666664e-03 3018 4640 -1.0416666666666664e-03 3018 4950 6.2500000000000003e-03 3018 3994 -2.0833333333333329e-03 3019 3019 3.3333333333333326e-02 3020 3020 2.4999999999999996e-10 3020 3703 -2.0833333333333339e-11 3020 3701 6.2499999999999991e-11 3020 3021 -2.0833333333333326e-11 3020 3022 1.6155871338926322e-27 3020 3700 1.0416666666666665e-11 3020 3704 1.0416666666666666e-11 3020 3702 -2.0833333333333339e-11 3020 3699 1.0416666666666666e-11 3020 3698 6.2500000000000004e-11 3020 4767 1.0416666666666665e-11 3020 441 -2.6253290925755273e-27 3020 442 -2.0833333333333326e-11 3021 3021 2.5000000000000002e-10 3021 3703 2.0833333333333332e-11 3021 3701 -4.1666666666666665e-11 3021 3020 -2.0833333333333326e-11 3021 3022 4.1666666666666665e-11 3021 3704 2.0833333333333326e-11 3021 3702 2.0833333333333332e-11 3021 4776 -2.0833333333333332e-11 3021 4991 -2.0833333333333329e-11 3021 4065 -2.0833333333333326e-11 3021 4767 2.0833333333333326e-11 3021 4761 -4.1666666666666665e-11 3021 4770 2.0833333333333332e-11 3021 4063 4.1666666666666665e-11 3021 4766 2.0833333333333326e-11 3021 4771 2.0833333333333332e-11 3021 4760 -4.1666666666666665e-11 3021 441 4.1666666666666665e-11 3021 4062 -2.0833333333333326e-11 3022 3022 6.6666666666666674e-10 3022 3700 6.2499999999999991e-11 3022 3703 8.3333333333333330e-11 3022 3701 -1.0416666666666666e-11 3022 3020 9.5018296033870872e-28 3022 3021 4.1666666666666665e-11 3022 3698 -1.0416666666666666e-11 3022 4981 -1.0416666666666666e-11 3022 4992 -8.3333333333333330e-11 3022 5002 -1.0416666666666666e-11 3022 4067 9.5018296033870872e-28 3022 442 4.1666666666666665e-11 3022 4663 -1.0416666666666666e-11 3022 4767 6.2499999999999991e-11 3022 4761 -1.0416666666666666e-11 3022 4991 -8.3333333333333330e-11 3022 4673 6.2499999999999991e-11 3022 4667 -1.0416666666666666e-11 3022 4065 9.5018296033870872e-28 3022 4057 4.1666666666666665e-11 3022 4681 8.3333333333333330e-11 3022 4983 6.2499999999999991e-11 3022 4678 1.0416666666666666e-11 3022 4058 9.5018296033870872e-28 3022 4064 4.1666666666666665e-11 3023 3023 4.3749999999999999e-10 3023 3707 -1.0416666666666666e-11 3023 3706 -6.4623485355705287e-27 3023 3705 -1.0416666666666666e-11 3023 4779 2.2470898404921788e-28 3023 5044 5.2083333333333334e-11 3023 4773 -1.4583333333333332e-10 3023 4156 -6.2500000000000004e-11 3023 4772 -1.0416666666666671e-11 3023 5038 -5.2083333333333334e-11 3023 4168 6.2499999999999991e-11 3023 4764 5.2083333333333328e-11 3023 4770 -1.0416666666666671e-11 3023 4766 1.0416666666666663e-11 3023 4760 1.0416666666666667e-10 3023 4159 1.6155871338926322e-27 3023 4158 -4.1666666666666665e-11 3024 3024 1.8749999999999997e-10 3025 3025 2.0833333333333334e-10 3026 3026 1.8749999999999997e-10 3027 3027 2.0833333333333332e-02 3028 3028 2.9166666666666660e-02 3028 3055 -4.1666666666666666e-03 3028 2396 1.4465734552327348e-19 3028 2383 4.1666666666666657e-03 3028 2379 1.0416666666666664e-03 3028 2382 -9.9486666632977745e-20 3028 3048 4.1666666666666649e-03 3028 2335 1.0416666666666664e-02 3029 3029 2.0833333333333332e-02 3030 3030 2.9166666666666660e-02 3030 2403 -9.9486666632977745e-20 3030 2380 4.1666666666666657e-03 3030 2379 1.0416666666666664e-03 3030 3038 4.1666666666666666e-03 3030 2378 1.4465734552327348e-19 3030 3040 -4.1666666666666649e-03 3030 2354 1.0416666666666664e-02 3031 3031 2.0833333333333329e-02 3032 3032 2.9166666666666660e-02 3032 3046 -4.1666666666666675e-03 3032 2382 1.4465734552327348e-19 3032 2381 4.1666666666666657e-03 3032 2379 1.0416666666666664e-03 3032 2378 -1.4465734552327348e-19 3032 3037 4.1666666666666649e-03 3032 2368 1.0416666666666664e-02 3033 3033 2.0833333333333329e-02 3034 3034 2.9166666666666660e-02 3034 3436 -4.1666666666666675e-03 3034 2403 1.4465734552327348e-19 3034 2395 4.1666666666666657e-03 3034 2379 1.0416666666666664e-03 3034 2396 -1.4465734552327348e-19 3034 3437 -4.1666666666666649e-03 3034 2874 1.0416666666666664e-02 3035 3035 4.1666666666666664e-02 3035 2380 2.0833333333333333e-03 3035 2368 -2.0833333333333329e-03 3035 3044 2.0833333333333333e-03 3035 2381 2.0833333333333329e-03 3035 2389 6.2500000000000003e-03 3035 3037 2.0833333333333333e-03 3035 2378 -2.6745065309554533e-19 3035 3038 2.0833333333333333e-03 3035 3041 2.0833333333333333e-03 3035 2354 -2.0833333333333333e-03 3035 2863 2.0833333333333333e-03 3035 2361 -2.0833333333333329e-03 3035 2359 4.1202858928001372e-19 3035 3404 -2.0833333333333333e-03 3035 2861 2.0833333333333329e-03 3035 2859 6.2500000000000003e-03 3035 3039 2.0833333333333333e-03 3035 2862 -2.6745065309554533e-19 3035 3036 2.0833333333333333e-03 3035 3398 -2.0833333333333333e-03 3035 2366 -2.0833333333333333e-03 3035 2364 4.1202858928001372e-19 3036 3036 2.9166666666666664e-02 3036 2366 4.1666666666666657e-03 3036 2863 1.0416666666666664e-02 3036 2862 1.0416666666666664e-03 3036 2859 2.0833333333333329e-03 3036 3398 4.1666666666666649e-03 3036 3035 2.0833333333333329e-03 3036 2364 -1.4465734552327348e-19 3036 936 4.1666666666666666e-03 3036 50 2.0833333333333329e-03 3037 3037 2.9166666666666660e-02 3037 2364 9.9486666632977745e-20 3037 3044 -4.1666666666666666e-03 3037 2389 2.0833333333333329e-03 3037 3035 2.0833333333333333e-03 3037 2381 1.0416666666666664e-02 3037 2379 2.0833333333333329e-03 3037 2378 1.0416666666666664e-03 3037 3032 4.1666666666666649e-03 3037 2368 4.1666666666666657e-03 3038 3038 2.9166666666666664e-02 3038 2389 2.0833333333333329e-03 3038 3041 -4.1666666666666649e-03 3038 3035 2.0833333333333329e-03 3038 2359 -1.4465734552327348e-19 3038 2354 4.1666666666666657e-03 3038 3030 4.1666666666666666e-03 3038 2380 1.0416666666666664e-02 3038 2379 2.0833333333333329e-03 3038 2378 1.0416666666666664e-03 3039 3039 2.9166666666666664e-02 3039 2861 1.0416666666666664e-02 3039 2862 1.0416666666666664e-03 3039 2361 4.1666666666666657e-03 3039 2359 9.9486666632977745e-20 3039 3404 4.1666666666666666e-03 3039 2859 2.0833333333333329e-03 3039 3035 2.0833333333333333e-03 3039 50 2.0833333333333329e-03 3039 933 4.1666666666666649e-03 3040 3040 2.9166666666666660e-02 3040 2379 -2.0833333333333329e-03 3040 2362 -1.4465734552327348e-19 3040 3043 4.1666666666666675e-03 3040 2380 -1.0416666666666664e-02 3040 2397 -2.0833333333333329e-03 3040 3442 2.0833333333333333e-03 3040 2403 -1.0416666666666662e-03 3040 3030 -4.1666666666666649e-03 3040 2354 -4.1666666666666657e-03 3041 3041 2.9166666666666660e-02 3041 2360 -2.0833333333333329e-03 3041 3042 4.1666666666666675e-03 3041 3399 -2.0833333333333333e-03 3041 2390 -1.4465734552327348e-19 3041 2380 -4.1666666666666657e-03 3041 2389 -1.0416666666666660e-03 3041 2378 1.4465734552327348e-19 3041 3038 -4.1666666666666649e-03 3041 3035 2.0833333333333329e-03 3041 2354 -1.0416666666666664e-02 3041 2359 -1.0416666666666662e-03 3042 3042 2.9166666666666664e-02 3042 2397 -2.0833333333333329e-03 3042 3043 4.1666666666666649e-03 3042 3407 -2.0833333333333329e-03 3042 2362 1.4465734552327348e-19 3042 2354 -4.1666666666666657e-03 3042 2360 -1.0416666666666664e-03 3042 2359 -1.4465734552327348e-19 3042 3041 4.1666666666666675e-03 3042 2380 -1.0416666666666664e-02 3042 2389 -2.0833333333333329e-03 3042 3399 2.0833333333333333e-03 3042 2390 -1.0416666666666662e-03 3043 3043 2.9166666666666660e-02 3043 3040 4.1666666666666666e-03 3043 3442 -2.0833333333333333e-03 3043 2403 -9.9486666632977745e-20 3043 2380 -4.1666666666666657e-03 3043 2397 -1.0416666666666664e-03 3043 2390 1.4465734552327348e-19 3043 3042 4.1666666666666649e-03 3043 3407 2.0833333333333329e-03 3043 2354 -1.0416666666666664e-02 3043 2360 -2.0833333333333329e-03 3043 2362 -1.0416666666666664e-03 3044 3044 2.9166666666666660e-02 3044 2402 1.2659172094511536e-19 3044 2381 -4.1666666666666657e-03 3044 2389 -1.0416666666666660e-03 3044 3037 -4.1666666666666675e-03 3044 3035 2.0833333333333333e-03 3044 2378 -1.4465734552327348e-19 3044 3045 4.1666666666666649e-03 3044 3401 -2.0833333333333329e-03 3044 2368 -1.0416666666666664e-02 3044 2367 -2.0833333333333329e-03 3044 2364 -1.0416666666666662e-03 3045 3045 2.9166666666666660e-02 3045 2373 -1.4465734552327348e-19 3045 3047 4.1666666666666666e-03 3045 2385 -2.0833333333333329e-03 3045 3091 2.0833333333333333e-03 3045 2381 -1.0416666666666664e-02 3045 2389 -2.0833333333333329e-03 3045 2402 -1.0416666666666664e-03 3045 3044 4.1666666666666649e-03 3045 3401 2.0833333333333329e-03 3045 2368 -4.1666666666666657e-03 3045 2367 -1.0416666666666664e-03 3045 2364 9.9486666632977745e-20 3046 3046 2.9166666666666660e-02 3046 2385 -2.0833333333333329e-03 3046 3047 4.1666666666666649e-03 3046 3049 -2.0833333333333329e-03 3046 2373 1.4465734552327348e-19 3046 2368 -4.1666666666666657e-03 3046 3032 -4.1666666666666675e-03 3046 2381 -1.0416666666666664e-02 3046 2379 -2.0833333333333329e-03 3046 2382 -1.0416666666666662e-03 3047 3047 2.9166666666666660e-02 3047 2367 -2.0833333333333329e-03 3047 3045 4.1666666666666666e-03 3047 3091 -2.0833333333333337e-03 3047 2402 -1.2659172094511536e-19 3047 2381 -4.1666666666666657e-03 3047 2385 -1.0416666666666664e-03 3047 2382 1.4465734552327348e-19 3047 3046 4.1666666666666649e-03 3047 3049 2.0833333333333329e-03 3047 2368 -1.0416666666666664e-02 3047 2373 -1.0416666666666664e-03 3048 3048 2.9166666666666660e-02 3048 2336 1.4465734552327348e-19 3048 3052 -4.1666666666666675e-03 3048 2385 2.0833333333333329e-03 3048 3049 2.0833333333333333e-03 3048 2383 1.0416666666666664e-02 3048 2379 2.0833333333333329e-03 3048 2382 1.0416666666666662e-03 3048 3028 4.1666666666666649e-03 3048 2335 4.1666666666666657e-03 3049 3049 2.0833333583333332e-02 3049 2375 -5.2083333333333334e-11 3049 3050 4.1666666666666652e-11 3049 3096 8.3333333333333330e-11 3049 2350 -1.0416666666666665e-11 3049 2381 2.0833333333333333e-03 3049 2335 -2.0833333333333329e-03 3049 2336 -1.0416666803356605e-11 3049 3052 2.0833333333333333e-03 3049 2383 2.0833333333333329e-03 3049 2385 6.2499999999999995e-03 3049 3048 2.0833333333333333e-03 3049 2382 -4.1202858928001372e-19 3049 3046 -2.0833333333333333e-03 3049 3047 2.0833333333333333e-03 3049 2368 -2.0833333333333333e-03 3049 2373 -1.0416666262526068e-11 3050 3050 3.3333333333333332e-10 3050 3705 -6.4623485355705287e-27 3050 2375 -6.2500000000000004e-11 3050 2373 1.8812360437258079e-27 3050 3049 4.1666666666666658e-11 3050 3096 6.4623485355705287e-27 3050 2336 -4.1666666666666665e-11 3050 2350 -6.2500000000000004e-11 3051 3051 2.4999999999999996e-10 3052 3052 2.9166666666666660e-02 3052 3048 -4.1666666666666666e-03 3052 3049 2.0833333333333333e-03 3052 2382 -9.9486666632977745e-20 3052 2383 -4.1666666666666657e-03 3052 2385 -1.0416666666666664e-03 3052 2388 1.4465734552327348e-19 3052 3053 4.1666666666666649e-03 3052 3090 -2.0833333333333329e-03 3052 2335 -1.0416666666666664e-02 3052 2337 -2.0833333333333329e-03 3052 2336 -1.0416666666666664e-03 3053 3053 2.9166666666666660e-02 3053 2338 -1.4465734552327348e-19 3053 3054 4.1666666666666675e-03 3053 2393 -2.0833333333333329e-03 3053 3114 -2.0833333333333333e-03 3053 2383 -1.0416666666666664e-02 3053 2385 -2.0833333333333329e-03 3053 2388 -1.0416666666666662e-03 3053 3052 4.1666666666666649e-03 3053 3090 2.0833333333333329e-03 3053 2335 -4.1666666666666657e-03 3053 2337 -1.0416666666666664e-03 3053 2336 1.4465734552327348e-19 3054 3054 2.9166666666666660e-02 3054 2337 -2.0833333333333329e-03 3054 3053 4.1666666666666675e-03 3054 3114 2.0833333333333333e-03 3054 2388 -1.4465734552327348e-19 3054 2383 -4.1666666666666657e-03 3054 2393 -1.0416666666666660e-03 3054 2396 1.4465734552327348e-19 3054 3055 4.1666666666666649e-03 3054 3421 -2.0833333333333329e-03 3054 2335 -1.0416666666666664e-02 3054 2338 -1.0416666666666662e-03 3055 3055 2.9166666666666660e-02 3055 3028 -4.1666666666666666e-03 3055 2379 -2.0833333333333329e-03 3055 2383 -1.0416666666666664e-02 3055 2393 -2.0833333333333329e-03 3055 2396 -1.0416666666666664e-03 3055 3054 4.1666666666666649e-03 3055 3421 2.0833333333333329e-03 3055 2335 -4.1666666666666657e-03 3055 2338 1.4465734552327348e-19 3056 3056 4.5833333333333330e-02 3056 2416 1.0416666666666667e-03 3056 3086 -4.1666666666666675e-03 3056 2460 5.2083333333333330e-03 3056 3060 8.3333333333333332e-03 3056 2470 -2.0833333333333333e-03 3056 2445 2.0833333333333329e-03 3056 2455 1.2499999999999997e-02 3056 2454 1.0416666666666669e-03 3056 3062 2.0833333333333333e-03 3056 2468 -2.0833333333333329e-03 3056 2466 -6.2499999999999986e-03 3056 3079 2.0833333333333333e-03 3056 2469 2.6745065309554533e-19 3056 3081 -2.0833333333333333e-03 3056 3057 2.0833333333333333e-03 3056 2406 2.0833333333333333e-03 3056 2405 6.2499999999999986e-03 3056 2404 1.0416666666666660e-03 3057 3057 2.9166666666666660e-02 3057 2413 2.0833333333333329e-03 3057 3089 4.1666666666666675e-03 3057 3064 2.0833333333333333e-03 3057 2478 1.4465734552327348e-19 3057 2470 4.1666666666666657e-03 3057 2466 1.0416666666666660e-03 3057 2469 -1.2659172094511536e-19 3057 3081 4.1666666666666649e-03 3057 3056 2.0833333333333329e-03 3057 2406 1.0416666666666664e-02 3057 2405 2.0833333333333329e-03 3057 2404 1.0416666666666662e-03 3058 3058 4.1666666666666664e-02 3058 2467 -2.0833333333333333e-03 3058 2671 2.0833333333333329e-03 3058 3066 2.0833333333333333e-03 3058 2479 -2.0833333333333329e-03 3058 2466 -6.2499999999999986e-03 3058 3212 -2.0833333333333333e-03 3058 2480 2.6745065309554533e-19 3058 2428 2.1705219273391446e-19 3058 3204 1.0416666666666668e-02 3058 2665 8.3333333333333350e-03 3058 2664 5.0116116045879435e-20 3058 3063 3.1800793213478638e-19 3058 2663 2.1112296210313436e-19 3058 3074 -2.0833333333333333e-03 3058 3059 2.0833333333333333e-03 3058 2425 2.0833333333333333e-03 3058 2424 8.3333333333333332e-03 3058 2423 -3.8958221617777476e-19 3059 3059 2.9166666666666660e-02 3059 2480 -1.2659172094511536e-19 3059 2421 2.0833333333333329e-03 3059 2467 4.1666666666666657e-03 3059 2466 1.0416666666666660e-03 3059 3073 4.1666666666666675e-03 3059 3061 2.0833333333333333e-03 3059 2465 1.4465734552327348e-19 3059 3074 4.1666666666666649e-03 3059 3058 2.0833333333333329e-03 3059 2425 1.0416666666666664e-02 3059 2424 2.0833333333333329e-03 3059 2423 1.0416666666666662e-03 3060 3060 4.1666666666666657e-02 3060 2442 3.2249014814734037e-20 3060 2405 -3.1249999999999997e-03 3060 3086 4.3368086899420177e-19 3060 2455 5.2083333333333322e-03 3060 2460 6.2499999999999986e-03 3060 3056 8.3333333333333332e-03 3060 2454 -1.0416666666666664e-03 3060 2433 -9.3703019790006975e-21 3060 3065 -2.0833333333333329e-03 3060 3253 4.1666666666666666e-03 3060 2404 -1.2499999999999997e-02 3060 2416 -1.0416666666666660e-03 3060 2407 -4.1666666666666666e-03 3060 3061 2.7105054312137611e-20 3060 3071 1.6263032587282567e-19 3060 2421 4.9904357809065860e-20 3060 2423 -1.0416666666666667e-03 3060 2426 1.0416666666666667e-03 3061 3061 4.1666666666666657e-02 3061 2460 -2.1705219273391446e-19 3061 2468 -2.0833333333333333e-03 3061 2425 2.0833333333333329e-03 3061 3059 2.0833333333333333e-03 3061 2467 -2.0833333333333329e-03 3061 2466 -6.2500000000000003e-03 3061 3073 -2.0833333333333333e-03 3061 2465 2.6745065309554533e-19 3061 3072 -2.0833333333333333e-03 3061 3062 2.0833333333333333e-03 3061 2445 2.0833333333333333e-03 3061 2442 8.3333333333333350e-03 3061 2454 -7.9658154733346608e-19 3061 3071 -1.0416666666666666e-02 3061 3060 -1.3753697481041702e-19 3061 2421 8.3333333333333332e-03 3061 2423 -4.0032894669606370e-19 3061 2426 -2.1705219273391446e-19 3062 3062 2.9166666666666660e-02 3062 2455 2.0833333333333329e-03 3062 3079 -4.1666666666666675e-03 3062 3056 2.0833333333333333e-03 3062 2469 1.4465734552327348e-19 3062 2468 4.1666666666666657e-03 3062 2466 1.0416666666666660e-03 3062 2465 -1.4465734552327348e-19 3062 3072 4.1666666666666649e-03 3062 3061 2.0833333333333329e-03 3062 2445 1.0416666666666664e-02 3062 2442 2.0833333333333329e-03 3062 2454 1.0416666666666662e-03 3063 3063 4.1666666666666657e-02 3063 2407 -4.1666666666666657e-03 3063 3065 -2.0833333333333329e-03 3063 3207 -4.1666666666666666e-03 3063 2433 1.4973071994693204e-20 3063 2666 5.2083333333333330e-03 3063 2424 2.1684043449710089e-19 3063 2423 -1.0416666666666673e-03 3063 2428 1.0416666666666669e-03 3063 3204 -6.5052130349130266e-19 3063 2665 -2.1684043449710089e-19 3063 2664 6.2499999999999986e-03 3063 3058 2.1684043449710089e-19 3063 2663 -1.0416666666666673e-03 3063 3064 8.3333333333333315e-03 3063 2413 -3.1249999999999997e-03 3063 2404 -1.2499999999999997e-02 3063 2415 -1.0416666666666660e-03 3064 3064 4.5833333333333316e-02 3064 2479 -2.0833333333333333e-03 3064 2406 2.0833333333333329e-03 3064 3057 2.0833333333333333e-03 3064 2470 -2.0833333333333329e-03 3064 2466 -6.2500000000000003e-03 3064 3089 -2.0833333333333333e-03 3064 2478 2.6745065309554533e-19 3064 3215 -2.0833333333333333e-03 3064 3066 2.0833333333333333e-03 3064 2671 2.0833333333333333e-03 3064 2666 1.2500000000000001e-02 3064 2664 5.2083333333333330e-03 3064 2663 1.0416666666666658e-03 3064 3209 4.1666666666666657e-03 3064 3063 8.3333333333333315e-03 3064 2413 6.2499999999999995e-03 3064 2404 1.0416666666666662e-03 3064 2415 1.0416666666666664e-03 3065 3065 4.9999999999999989e-02 3065 2415 -1.0416666666666664e-03 3065 3063 -2.0833333333333329e-03 3065 3207 1.2499999999999997e-02 3065 2428 -5.2083333333333330e-03 3065 2423 -1.4583333333333334e-02 3065 2426 -5.2083333333333322e-03 3065 2433 4.1666666666666675e-03 3065 3060 -2.0833333333333329e-03 3065 3253 -1.2499999999999999e-02 3065 2404 -2.0833333333333342e-03 3065 2416 -1.0416666666666667e-03 3065 2407 4.1666666666666666e-03 3066 3066 2.9166666666666660e-02 3066 2665 2.0833333333333329e-03 3066 3212 4.1666666666666675e-03 3066 3058 2.0833333333333333e-03 3066 2480 1.4465734552327348e-19 3066 2479 4.1666666666666657e-03 3066 2466 1.0416666666666660e-03 3066 2478 -1.4465734552327348e-19 3066 3215 4.1666666666666649e-03 3066 3064 2.0833333333333329e-03 3066 2671 1.0416666666666664e-02 3066 2666 2.0833333333333329e-03 3066 2663 1.0416666666666662e-03 3067 3067 4.1666666666666664e-02 3067 2467 2.0833333333333333e-03 3067 2445 -2.0833333333333329e-03 3067 3077 2.0833333333333337e-03 3067 2468 2.0833333333333329e-03 3067 2471 6.2499999999999995e-03 3067 3072 2.0833333333333337e-03 3067 2465 -4.1202858928001372e-19 3067 3073 2.0833333333333337e-03 3067 3075 2.0833333333333333e-03 3067 2425 -2.0833333333333333e-03 3067 2387 2.0833333333333333e-03 3067 2422 -2.0833333333333329e-03 3067 2421 -6.2499999999999986e-03 3067 2436 4.1202858928001372e-19 3067 3434 2.0833333333333337e-03 3067 2394 2.0833333333333329e-03 3067 2399 6.2499999999999995e-03 3067 3070 2.0833333333333337e-03 3067 2400 -4.1202858928001372e-19 3067 3068 2.0833333333333337e-03 3067 3109 2.0833333333333333e-03 3067 2443 -2.0833333333333333e-03 3067 2442 -6.2499999999999986e-03 3067 2441 4.1202858928001372e-19 3068 3068 2.9166666666666660e-02 3068 2458 9.9486666632977745e-20 3068 3111 -4.1666666666666666e-03 3068 2393 2.0833333333333329e-03 3068 3069 2.0833333333333333e-03 3068 2387 1.0416666666666664e-02 3068 2399 2.0833333333333329e-03 3068 2400 1.0416666666666664e-03 3068 3109 -4.1666666666666649e-03 3068 3067 2.0833333333333329e-03 3068 2443 4.1666666666666657e-03 3068 2442 1.0416666666666664e-03 3068 2441 -1.4465734552327348e-19 3069 3069 4.1666666666666657e-02 3069 2426 -2.1705219273391446e-19 3069 3071 1.0416666666666666e-02 3069 2460 -5.0116116045879435e-20 3069 3269 3.1800793213478638e-19 3069 2394 2.0833333333333333e-03 3069 2443 -2.0833333333333329e-03 3069 2442 -8.3333333333333332e-03 3069 2458 7.8085849825005813e-20 3069 3111 2.0833333333333333e-03 3069 2387 2.0833333333333329e-03 3069 2393 6.2500000000000003e-03 3069 3068 2.0833333333333333e-03 3069 2400 -2.6745065309554533e-19 3069 3070 2.0833333333333333e-03 3069 3422 -2.0833333333333333e-03 3069 2422 -2.0833333333333333e-03 3069 2421 -8.3333333333333332e-03 3069 2420 5.9738983838579659e-19 3070 3070 2.9166666666666664e-02 3070 2393 2.0833333333333329e-03 3070 2436 1.2659172094511536e-19 3070 3434 -4.1666666666666666e-03 3070 2394 1.0416666666666664e-02 3070 2399 2.0833333333333329e-03 3070 3067 2.0833333333333337e-03 3070 2400 1.0416666666666664e-03 3070 3422 4.1666666666666649e-03 3070 3069 2.0833333333333329e-03 3070 2422 4.1666666666666657e-03 3070 2421 1.0416666666666664e-03 3070 2420 -1.4465734552327348e-19 3071 3071 4.1666666666666657e-02 3071 2454 2.1705219273391446e-19 3071 2420 -5.0116116045879435e-20 3071 2442 -1.0416666666666668e-02 3071 2460 5.8569019580184656e-19 3071 3069 1.0416666666666668e-02 3071 3269 -4.6263880787845817e-19 3071 2458 -2.1705219273391446e-19 3071 3061 -1.0416666666666666e-02 3071 3060 2.7807826960562663e-19 3071 2421 -1.0416666666666668e-02 3071 2423 2.1705219273391446e-19 3071 2426 4.6263880787845817e-19 3072 3072 2.9166666666666660e-02 3072 2441 1.2659172094511536e-19 3072 3077 -4.1666666666666666e-03 3072 2471 2.0833333333333329e-03 3072 3067 2.0833333333333337e-03 3072 2468 1.0416666666666664e-02 3072 2466 2.0833333333333329e-03 3072 2465 1.0416666666666664e-03 3072 3062 4.1666666666666649e-03 3072 3061 -2.0833333333333329e-03 3072 2445 4.1666666666666657e-03 3072 2442 1.0416666666666664e-03 3072 2454 -1.4465734552327348e-19 3073 3073 2.9166666666666664e-02 3073 2471 2.0833333333333329e-03 3073 3075 -4.1666666666666649e-03 3073 3067 2.0833333333333329e-03 3073 2436 -1.4465734552327348e-19 3073 2425 4.1666666666666657e-03 3073 2421 1.0416666666666664e-03 3073 2423 9.9486666632977745e-20 3073 3059 4.1666666666666666e-03 3073 2467 1.0416666666666664e-02 3073 2466 2.0833333333333329e-03 3073 3061 -2.0833333333333333e-03 3073 2465 1.0416666666666664e-03 3074 3074 2.9166666666666664e-02 3074 2425 4.1666666666666657e-03 3074 2424 1.0416666666666664e-03 3074 2467 1.0416666666666664e-02 3074 2480 1.0416666666666664e-03 3074 2466 2.0833333333333329e-03 3074 3059 4.1666666666666649e-03 3074 3058 -2.0833333333333329e-03 3074 2423 -9.9486666632977745e-20 3074 490 1.4465734552327348e-19 3074 983 4.1666666666666666e-03 3074 484 2.0833333333333329e-03 3074 981 -2.0833333333333333e-03 3075 3075 2.9166666666666660e-02 3075 2435 -2.0833333333333329e-03 3075 3076 -4.1666666666666675e-03 3075 3445 2.0833333333333333e-03 3075 2472 -1.4465734552327348e-19 3075 2467 -4.1666666666666657e-03 3075 2471 -1.0416666666666664e-03 3075 2465 1.4465734552327348e-19 3075 3073 -4.1666666666666649e-03 3075 3067 2.0833333333333329e-03 3075 2425 -1.0416666666666664e-02 3075 2421 -2.0833333333333329e-03 3075 2436 -1.0416666666666662e-03 3076 3076 2.9166666666666664e-02 3076 2467 1.0416666666666664e-02 3076 2472 1.0416666666666662e-03 3076 2425 4.1666666666666657e-03 3076 2435 1.0416666666666660e-03 3076 2436 1.4465734552327348e-19 3076 3075 -4.1666666666666675e-03 3076 2471 2.0833333333333329e-03 3076 3445 2.0833333333333333e-03 3076 484 2.0833333333333329e-03 3076 983 4.1666666666666649e-03 3076 982 -2.0833333333333329e-03 3076 490 -1.4465734552327348e-19 3077 3077 2.9166666666666660e-02 3077 2476 9.9486666632977745e-20 3077 2442 -2.0833333333333329e-03 3077 2468 -4.1666666666666657e-03 3077 2471 -1.0416666666666664e-03 3077 3072 -4.1666666666666666e-03 3077 3067 2.0833333333333333e-03 3077 2465 -1.4465734552327348e-19 3077 3078 4.1666666666666649e-03 3077 3097 2.0833333333333329e-03 3077 2445 -1.0416666666666664e-02 3077 2444 -2.0833333333333329e-03 3077 2441 -1.0416666666666664e-03 3078 3078 2.9166666666666660e-02 3078 2459 -1.4465734552327348e-19 3078 3080 4.1666666666666675e-03 3078 2477 -2.0833333333333329e-03 3078 3098 -2.0833333333333333e-03 3078 2468 -1.0416666666666664e-02 3078 2471 -2.0833333333333329e-03 3078 2476 -1.0416666666666662e-03 3078 3077 4.1666666666666649e-03 3078 3097 -2.0833333333333329e-03 3078 2445 -4.1666666666666657e-03 3078 2444 -1.0416666666666660e-03 3078 2441 1.2659172094511536e-19 3079 3079 2.9166666666666664e-02 3079 2477 -2.0833333333333329e-03 3079 3080 4.1666666666666649e-03 3079 3085 -2.0833333333333329e-03 3079 2459 1.4465734552327348e-19 3079 2445 -4.1666666666666657e-03 3079 2455 -1.0416666666666664e-03 3079 2454 -1.4465734552327348e-19 3079 3062 -4.1666666666666675e-03 3079 2468 -1.0416666666666664e-02 3079 2466 -2.0833333333333329e-03 3079 3056 2.0833333333333333e-03 3079 2469 -1.0416666666666662e-03 3080 3080 2.9166666666666660e-02 3080 2444 -2.0833333333333329e-03 3080 3078 4.1666666666666666e-03 3080 3098 2.0833333333333333e-03 3080 2476 -9.9486666632977745e-20 3080 2468 -4.1666666666666657e-03 3080 2477 -1.0416666666666664e-03 3080 2469 1.4465734552327348e-19 3080 3079 4.1666666666666649e-03 3080 3085 2.0833333333333329e-03 3080 2445 -1.0416666666666664e-02 3080 2455 -2.0833333333333329e-03 3080 2459 -1.0416666666666664e-03 3081 3081 2.9166666666666660e-02 3081 2414 1.4465734552327348e-19 3081 3088 4.1666666666666666e-03 3081 2477 2.0833333333333329e-03 3081 3085 2.0833333333333333e-03 3081 2470 1.0416666666666664e-02 3081 2466 2.0833333333333329e-03 3081 2469 1.0416666666666664e-03 3081 3057 4.1666666666666649e-03 3081 3056 -2.0833333333333329e-03 3081 2406 4.1666666666666657e-03 3081 2405 1.0416666666666664e-03 3081 2404 -9.9486666632977745e-20 3082 3082 2.4999999999999998e-02 3082 2411 -1.0416666666666664e-03 3082 3087 2.0833333333333337e-03 3082 3277 -1.0254392617697373e-19 3082 2462 -1.0416666666666664e-03 3082 2455 -6.2500000000000003e-03 3082 2463 -1.0416666666666664e-03 3082 2449 -2.0833333333333329e-03 3082 3083 2.0833333333333337e-03 3082 3623 -6.0159191589756597e-20 3082 2405 -6.2500000000000003e-03 3082 2412 -1.0416666666666662e-03 3082 2410 -2.0833333333333329e-03 3083 3083 2.0833333541666669e-02 3083 3084 2.0833333333333339e-11 3083 3661 8.3333333333333330e-11 3083 2453 -2.0833333333333332e-11 3083 2455 -4.1666667083333324e-03 3083 2463 1.0416666770833331e-03 3083 2449 -2.0833333333333333e-03 3083 3082 2.0833333333333337e-03 3083 3623 8.3333333333333315e-03 3083 2405 -4.1666667083333333e-03 3083 2412 1.0416666770833337e-03 3083 2410 -2.0833333333333329e-03 3083 290 -2.0833333333333332e-11 3084 3084 2.4999999999999996e-10 3084 2412 -1.0416666666666665e-11 3084 3083 2.0833333333333336e-11 3084 3661 -9.5018296033870872e-28 3084 2463 -1.0416666666666665e-11 3084 2455 -6.2500000000000004e-11 3084 2459 -1.0416666666666666e-11 3084 2453 -2.0833333333333326e-11 3084 3085 2.0833333333333339e-11 3084 3474 2.2913451068275814e-27 3084 2405 -6.2499999999999991e-11 3084 2414 -1.0416666666666666e-11 3084 290 -2.0833333333333326e-11 3085 3085 2.0833333541666665e-02 3085 2453 -2.0833333333333329e-11 3085 2468 2.0833333333333333e-03 3085 2406 -2.0833333333333329e-03 3085 3088 -2.0833333333333337e-03 3085 2470 2.0833333333333329e-03 3085 2477 6.2499999999999986e-03 3085 3081 2.0833333333333337e-03 3085 2469 -4.1202858928001372e-19 3085 3079 -2.0833333333333333e-03 3085 3080 2.0833333333333337e-03 3085 2445 -2.0833333333333333e-03 3085 2455 -3.1250000416666668e-03 3085 2459 1.0416667070807261e-11 3085 3084 2.0833333333333339e-11 3085 3474 8.3333333333333330e-11 3085 2405 -3.1250000416666660e-03 3085 2414 1.0416666674554665e-11 3085 290 -2.0833333333333332e-11 3086 3086 3.3333333333333326e-02 3086 2404 -4.1666666666666657e-03 3086 3056 -4.1666666666666675e-03 3086 3060 4.3368086899420177e-19 3086 2454 -1.6284208410963924e-19 3086 2455 -4.1666666666666657e-03 3086 2460 -6.2499999999999986e-03 3086 2462 1.6284208410963924e-19 3086 3087 4.1666666666666666e-03 3086 2405 -1.6666666666666663e-02 3086 2411 -4.1666666666666666e-03 3086 2416 -6.2499999999999986e-03 3087 3087 4.5833333333333323e-02 3087 2410 -2.0833333333333329e-03 3087 3082 2.0833333333333337e-03 3087 3277 -8.3333333333333315e-03 3087 2449 -2.0833333333333333e-03 3087 2455 -1.3541666666666667e-02 3087 2460 -5.2083333333333330e-03 3087 2462 1.3010426069826053e-18 3087 3086 4.1666666666666666e-03 3087 3262 8.3333333333333315e-03 3087 2405 -7.2916666666666659e-03 3087 2411 1.3010426069826053e-18 3087 2416 -1.0416666666666664e-03 3088 3088 2.9166666666666664e-02 3088 2470 4.1666666666666657e-03 3088 2477 1.0416666666666664e-03 3088 2406 1.0416666666666664e-02 3088 2414 1.0416666666666664e-03 3088 2405 2.0833333333333329e-03 3088 3081 4.1666666666666666e-03 3088 3085 -2.0833333333333337e-03 3088 2469 1.2659172094511536e-19 3088 479 -1.4465734552327348e-19 3088 945 4.1666666666666649e-03 3088 939 2.0833333333333329e-03 3088 1208 2.0833333333333329e-03 3089 3089 2.9166666666666664e-02 3089 2470 1.0416666666666664e-02 3089 2478 1.0416666666666664e-03 3089 2406 4.1666666666666657e-03 3089 2413 1.0416666666666664e-03 3089 2404 9.9486666632977745e-20 3089 3057 4.1666666666666666e-03 3089 2466 2.0833333333333329e-03 3089 3064 -2.0833333333333333e-03 3089 482 2.0833333333333329e-03 3089 949 -4.1666666666666649e-03 3089 970 -2.0833333333333329e-03 3089 287 -1.4465734552327348e-19 3090 3090 2.0833333541666665e-02 3090 2349 2.0833333333333329e-11 3090 3117 2.0833333333333339e-11 3090 3095 -8.3333333333333330e-11 3090 2451 2.0833333333333332e-11 3090 2383 -2.0833333333333333e-03 3090 2443 2.0833333333333329e-03 3090 2457 3.1250000416666660e-03 3090 2456 -1.0416666674554665e-11 3090 3094 2.0833333333333337e-03 3090 2387 -2.0833333333333329e-03 3090 2385 -6.2499999999999986e-03 3090 3110 2.0833333333333337e-03 3090 2388 4.1202858928001372e-19 3090 3053 2.0833333333333333e-03 3090 3052 -2.0833333333333337e-03 3090 2335 2.0833333333333333e-03 3090 2337 3.1250000416666668e-03 3090 2336 -1.0416667070807261e-11 3091 3091 2.0833333541666665e-02 3091 2487 1.8812360437258079e-27 3091 3466 -1.0416666666666668e-10 3091 2375 -3.6295685768920020e-28 3091 3096 -4.0642113836986528e-27 3091 2386 -2.0833333333333333e-03 3091 2368 2.0833333333333329e-03 3091 2367 3.1250000520833326e-03 3091 2373 -7.8879958422294972e-21 3091 3047 -2.0833333333333337e-03 3091 2381 -2.0833333333333329e-03 3091 2385 -6.2499999999999986e-03 3091 3045 2.0833333333333337e-03 3091 2402 4.1202858928001372e-19 3091 3105 2.0833333333333333e-03 3091 3092 2.0833333333333337e-03 3091 2483 2.0833333333333333e-03 3091 2482 3.1250000520833335e-03 3091 2481 -4.0414059681134789e-19 3092 3092 2.9166666666666660e-02 3092 2402 -1.4465734552327348e-19 3092 2485 2.0833333333333329e-03 3092 2386 4.1666666666666657e-03 3092 2385 1.0416666666666664e-03 3092 3103 4.1666666666666666e-03 3092 3093 2.0833333333333333e-03 3092 2384 9.9486666632977745e-20 3092 3105 -4.1666666666666649e-03 3092 3091 2.0833333333333329e-03 3092 2483 1.0416666666666664e-02 3092 2482 2.0833333333333329e-03 3092 2481 1.0416666666666664e-03 3093 3093 2.0833333541666665e-02 3093 2451 2.0833333333333329e-11 3093 3100 -2.0833333333333339e-11 3093 3095 -8.3333333333333330e-11 3093 2494 2.0833333333333332e-11 3093 2387 -2.0833333333333333e-03 3093 2483 2.0833333333333329e-03 3093 2485 3.1250000416666668e-03 3093 2481 -1.0416666529976728e-11 3093 3092 2.0833333333333333e-03 3093 2386 -2.0833333333333329e-03 3093 2385 -6.2499999999999995e-03 3093 3103 -2.0833333333333333e-03 3093 2384 4.1202858928001372e-19 3093 3102 -2.0833333333333333e-03 3093 3094 2.0833333333333333e-03 3093 2443 2.0833333333333333e-03 3093 2444 3.1250000416666664e-03 3093 2456 -1.0416667070807258e-11 3094 3094 2.9166666666666660e-02 3094 2457 2.0833333333333329e-03 3094 3110 -4.1666666666666666e-03 3094 3090 2.0833333333333337e-03 3094 2388 1.2659172094511536e-19 3094 2387 4.1666666666666657e-03 3094 2385 1.0416666666666664e-03 3094 2384 -1.4465734552327348e-19 3094 3102 4.1666666666666649e-03 3094 3093 2.0833333333333329e-03 3094 2443 1.0416666666666664e-02 3094 2444 2.0833333333333329e-03 3094 2456 1.0416666666666664e-03 3095 3095 5.8333333333333318e-10 3095 2336 4.1666666666666665e-11 3095 2350 1.0416666666666666e-11 3095 2349 -4.1666666666666665e-11 3095 3096 -2.0833333333333332e-11 3095 2481 1.0416666666666667e-10 3095 2487 5.2083333333333334e-11 3095 2494 -4.1666666666666678e-11 3095 2444 -1.0416666666666666e-11 3095 2337 -1.0416666666666666e-11 3095 3090 -8.3333333333333330e-11 3095 3117 -1.8175355256292112e-27 3095 2457 -1.0416666666666666e-11 3095 2456 6.2499999999999991e-11 3095 2451 -4.1666666666666665e-11 3095 3093 -8.3333333333333330e-11 3095 3100 1.8175355256292112e-27 3095 2485 -1.0416666666666666e-11 3095 4760 1.2499999999999998e-10 3096 3096 4.1666666666666662e-10 3096 2336 1.2499999999999998e-10 3096 2350 1.0416666666666658e-11 3096 2349 4.1666666666666665e-11 3096 3095 -2.0833333333333332e-11 3096 2481 1.0416666666666673e-11 3096 2487 -1.0416666666666668e-11 3096 2494 -6.0691943799667649e-29 3096 2482 -2.0194839173657902e-27 3096 3466 -1.6155871338926322e-27 3096 2367 2.0194839173657902e-27 3096 2375 -6.2499999999999991e-11 3096 3091 -6.4623485355705287e-27 3096 2373 1.0416666666666671e-11 3096 3049 8.3333333333333330e-11 3096 3050 6.4623485355705287e-27 3096 4760 -4.1666666666666665e-11 3097 3097 4.1666666666666664e-02 3097 2386 2.0833333333333333e-03 3097 2443 -2.0833333333333329e-03 3097 3109 2.0833333333333333e-03 3097 2387 2.0833333333333329e-03 3097 2399 6.2500000000000003e-03 3097 3102 2.0833333333333333e-03 3097 2384 -3.7587087034409578e-19 3097 3103 2.0833333333333333e-03 3097 3108 2.0833333333333333e-03 3097 2483 -2.0833333333333333e-03 3097 2468 2.0833333333333333e-03 3097 2486 -2.0833333333333329e-03 3097 2485 -6.2499999999999986e-03 3097 2491 2.6745065309554533e-19 3097 3459 -2.0833333333333333e-03 3097 2475 2.0833333333333329e-03 3097 2471 6.2500000000000003e-03 3097 3099 2.0833333333333333e-03 3097 2476 -3.7587087034409578e-19 3097 3078 -2.0833333333333333e-03 3097 3077 2.0833333333333333e-03 3097 2445 -2.0833333333333333e-03 3097 2444 -6.2499999999999986e-03 3097 2441 2.6745065309554533e-19 3098 3098 2.0833333541666665e-02 3098 2492 -2.0833333333333329e-11 3098 3104 2.0833333333333339e-11 3098 3474 8.3333333333333330e-11 3098 2453 -2.0833333333333332e-11 3098 2475 2.0833333333333333e-03 3098 2445 -2.0833333333333329e-03 3098 2444 -3.1250000416666668e-03 3098 2459 1.0416666529976728e-11 3098 3080 2.0833333333333333e-03 3098 2468 2.0833333333333329e-03 3098 2477 6.2499999999999995e-03 3098 3078 -2.0833333333333333e-03 3098 2476 -4.1202858928001372e-19 3098 3099 2.0833333333333333e-03 3098 3473 -2.0833333333333333e-03 3098 2486 -2.0833333333333333e-03 3098 2485 -3.1250000416666664e-03 3098 2484 1.0416667070807258e-11 3099 3099 2.9166666666666660e-02 3099 2477 2.0833333333333329e-03 3099 2491 1.4465734552327348e-19 3099 3459 4.1666666666666675e-03 3099 2475 1.0416666666666664e-02 3099 2471 2.0833333333333329e-03 3099 3097 2.0833333333333333e-03 3099 2476 1.0416666666666662e-03 3099 3473 4.1666666666666649e-03 3099 3098 2.0833333333333329e-03 3099 2486 4.1666666666666657e-03 3099 2485 1.0416666666666660e-03 3099 2484 -1.4465734552327348e-19 3100 3100 2.4999999999999996e-10 3100 2493 -1.0416666666666663e-11 3100 2456 -1.0416666666666663e-11 3100 3093 -2.0833333333333336e-11 3100 3095 2.2913451068275814e-27 3100 2485 -6.2500000000000004e-11 3100 2481 -1.0416666666666666e-11 3100 2494 -2.0833333333333326e-11 3100 3101 2.0833333333333336e-11 3100 3701 -9.5018296033870872e-28 3100 2444 -6.2500000000000004e-11 3100 2452 -1.0416666666666666e-11 3100 2451 -2.0833333333333326e-11 3101 3101 4.1666666666666662e-10 3101 2494 -2.0833333333333329e-11 3101 2453 -2.0833333333333329e-11 3101 3104 2.0833333333333339e-11 3101 3698 8.3333333333333330e-11 3101 2485 -8.3333333333333330e-11 3101 2493 2.0833333333333336e-11 3101 2492 -2.0833333333333332e-11 3101 3100 2.0833333333333339e-11 3101 3701 8.3333333333333330e-11 3101 2444 -8.3333333333333330e-11 3101 2452 2.0833333333333336e-11 3101 2451 -2.0833333333333332e-11 3102 3102 2.9166666666666660e-02 3102 2441 1.4465734552327348e-19 3102 3109 -4.1666666666666675e-03 3102 2399 2.0833333333333329e-03 3102 3097 2.0833333333333333e-03 3102 2387 1.0416666666666664e-02 3102 2385 2.0833333333333329e-03 3102 2384 1.0416666666666662e-03 3102 3094 4.1666666666666649e-03 3102 3093 -2.0833333333333329e-03 3102 2443 4.1666666666666657e-03 3102 2444 1.0416666666666660e-03 3102 2456 -1.4465734552327348e-19 3103 3103 2.9166666666666660e-02 3103 2399 2.0833333333333329e-03 3103 3108 -4.1666666666666649e-03 3103 3097 2.0833333333333329e-03 3103 2491 -1.2659172094511536e-19 3103 2483 4.1666666666666657e-03 3103 2485 1.0416666666666660e-03 3103 2481 1.4465734552327348e-19 3103 3092 4.1666666666666675e-03 3103 2386 1.0416666666666664e-02 3103 2385 2.0833333333333329e-03 3103 3093 -2.0833333333333333e-03 3103 2384 1.0416666666666662e-03 3104 3104 2.4999999999999996e-10 3104 2484 -1.0416666666666663e-11 3104 3098 2.0833333333333336e-11 3104 3474 2.2913451068275814e-27 3104 2459 -1.0416666666666666e-11 3104 2444 -6.2500000000000004e-11 3104 2452 -1.0416666666666663e-11 3104 2453 -2.0833333333333326e-11 3104 3101 2.0833333333333336e-11 3104 3698 -9.5018296033870872e-28 3104 2485 -6.2500000000000004e-11 3104 2493 -1.0416666666666666e-11 3104 2492 -2.0833333333333326e-11 3105 3105 2.9166666666666664e-02 3105 2385 -2.0833333333333329e-03 3105 2489 -1.4465734552327348e-19 3105 3106 4.1666666666666675e-03 3105 2386 -1.0416666666666664e-02 3105 2389 -2.0833333333333329e-03 3105 3401 2.0833333333333333e-03 3105 2402 -1.0416666666666662e-03 3105 3092 -4.1666666666666649e-03 3105 3091 2.0833333333333329e-03 3105 2483 -4.1666666666666657e-03 3105 2482 -1.0416666666666664e-03 3105 2481 1.4465734552327348e-19 3106 3106 2.9166666666666660e-02 3106 2482 -2.0833333333333329e-03 3106 3105 4.1666666666666675e-03 3106 3401 -2.0833333333333333e-03 3106 2402 -1.4465734552327348e-19 3106 2386 -4.1666666666666657e-03 3106 2389 -1.0416666666666660e-03 3106 2401 1.4465734552327348e-19 3106 3107 4.1666666666666649e-03 3106 3402 -2.0833333333333329e-03 3106 2483 -1.0416666666666664e-02 3106 2490 -2.0833333333333329e-03 3106 2489 -1.0416666666666662e-03 3107 3107 2.9166666666666660e-02 3107 2491 -1.2659172094511536e-19 3107 3108 4.1666666666666666e-03 3107 2399 -2.0833333333333329e-03 3107 3458 2.0833333333333337e-03 3107 2386 -1.0416666666666664e-02 3107 2389 -2.0833333333333329e-03 3107 2401 -1.0416666666666664e-03 3107 3106 4.1666666666666649e-03 3107 3402 2.0833333333333329e-03 3107 2483 -4.1666666666666657e-03 3107 2490 -1.0416666666666664e-03 3107 2489 1.4465734552327348e-19 3108 3108 2.9166666666666660e-02 3108 2490 -2.0833333333333329e-03 3108 3107 4.1666666666666666e-03 3108 3458 -2.0833333333333333e-03 3108 2401 -1.4465734552327348e-19 3108 2386 -4.1666666666666657e-03 3108 2399 -1.0416666666666664e-03 3108 2384 9.9486666632977745e-20 3108 3103 -4.1666666666666649e-03 3108 3097 2.0833333333333329e-03 3108 2483 -1.0416666666666664e-02 3108 2485 -2.0833333333333329e-03 3108 2491 -1.0416666666666664e-03 3109 3109 2.9166666666666660e-02 3109 2444 -2.0833333333333329e-03 3109 3102 -4.1666666666666675e-03 3109 3097 2.0833333333333333e-03 3109 2384 -1.4465734552327348e-19 3109 2387 -4.1666666666666657e-03 3109 2399 -1.0416666666666664e-03 3109 2400 1.4465734552327348e-19 3109 3068 -4.1666666666666649e-03 3109 3067 2.0833333333333329e-03 3109 2443 -1.0416666666666664e-02 3109 2442 -2.0833333333333329e-03 3109 2441 -1.0416666666666662e-03 3110 3110 2.9166666666666660e-02 3110 2393 -2.0833333333333329e-03 3110 3111 4.1666666666666649e-03 3110 3114 -2.0833333333333329e-03 3110 2458 9.9486666632977745e-20 3110 2443 -4.1666666666666657e-03 3110 2457 -1.0416666666666664e-03 3110 2456 -1.4465734552327348e-19 3110 3094 -4.1666666666666666e-03 3110 2387 -1.0416666666666664e-02 3110 2385 -2.0833333333333329e-03 3110 3090 2.0833333333333333e-03 3110 2388 -1.0416666666666664e-03 3111 3111 2.9166666666666660e-02 3111 2442 -2.0833333333333329e-03 3111 3068 -4.1666666666666675e-03 3111 3069 2.0833333333333333e-03 3111 2400 -1.4465734552327348e-19 3111 2387 -4.1666666666666657e-03 3111 2393 -1.0416666666666660e-03 3111 2388 1.2659172094511536e-19 3111 3110 4.1666666666666649e-03 3111 3114 2.0833333333333329e-03 3111 2443 -1.0416666666666664e-02 3111 2457 -2.0833333333333329e-03 3111 2458 -1.0416666666666662e-03 3112 3112 2.4999999999999998e-02 3112 2461 -1.0416666666666664e-03 3112 2348 -1.0416666666666664e-03 3112 3116 -2.0833333333333337e-03 3112 3635 -6.0159191589756597e-20 3112 2457 -6.2500000000000003e-03 3112 2464 -1.0416666666666662e-03 3112 2446 -2.0833333333333329e-03 3112 3113 2.0833333333333337e-03 3112 3491 -1.0254392617697373e-19 3112 2337 -6.2500000000000003e-03 3112 2343 -1.0416666666666664e-03 3112 2340 -2.0833333333333329e-03 3113 3113 4.5833333333333323e-02 3113 2446 -2.0833333333333329e-03 3113 2344 -1.0416666666666667e-03 3113 3115 4.1666666666666675e-03 3113 2457 -1.3541666666666664e-02 3113 2460 -5.2083333333333330e-03 3113 3263 8.3333333333333332e-03 3113 3112 2.0833333333333337e-03 3113 3491 -8.3333333333333315e-03 3113 2337 -7.2916666666666668e-03 3113 2343 6.5052130349130266e-19 3113 2340 -2.0833333333333333e-03 3114 3114 4.5833333333333323e-02 3114 2460 -5.2083333333333330e-03 3114 3115 4.1666666666666666e-03 3114 3269 8.3333333333333315e-03 3114 2344 -1.0416666666666664e-03 3114 2387 2.0833333333333333e-03 3114 2335 -2.0833333333333329e-03 3114 2337 -6.2500000000000003e-03 3114 2338 -1.0416666666666664e-03 3114 3054 2.0833333333333333e-03 3114 2383 2.0833333333333329e-03 3114 2393 6.2499999999999986e-03 3114 3053 -2.0833333333333333e-03 3114 2388 -2.6745065309554533e-19 3114 3110 -2.0833333333333333e-03 3114 3111 2.0833333333333333e-03 3114 2443 -2.0833333333333333e-03 3114 2457 -1.2499999999999999e-02 3114 2458 -1.0416666666666656e-03 3115 3115 3.3333333333333326e-02 3115 2343 -4.1666666666666657e-03 3115 3113 4.1666666666666675e-03 3115 3263 -8.6736173798840355e-19 3115 2461 -2.1705219273391446e-19 3115 2457 -4.1666666666666657e-03 3115 2460 -6.2499999999999986e-03 3115 2458 2.1705219273391446e-19 3115 3114 4.1666666666666666e-03 3115 2337 -1.6666666666666663e-02 3115 2338 -4.1666666666666666e-03 3115 2344 -6.2499999999999986e-03 3116 3116 2.0833333541666665e-02 3116 2457 4.1666667083333333e-03 3116 2464 -1.0416666770833337e-03 3116 2451 2.0833333333333332e-11 3116 3117 2.0833333333333339e-11 3116 2337 4.1666667083333324e-03 3116 2348 -1.0416666770833331e-03 3116 2349 2.0833333333333332e-11 3116 2340 2.0833333333333333e-03 3116 3112 -2.0833333333333337e-03 3116 3635 -8.3333333333333315e-03 3116 2446 2.0833333333333329e-03 3116 4763 -8.3333333333333330e-11 3117 3117 2.4999999999999996e-10 3117 2457 6.2499999999999991e-11 3117 2464 1.0416666666666665e-11 3117 2451 2.0833333333333326e-11 3117 3116 2.0833333333333336e-11 3117 2337 6.2500000000000004e-11 3117 2348 1.0416666666666665e-11 3117 2349 2.0833333333333326e-11 3117 2336 1.0416666666666666e-11 3117 3090 2.0833333333333339e-11 3117 3095 -2.2913451068275814e-27 3117 2456 1.0416666666666666e-11 3117 4763 9.5018296033870872e-28 3118 3118 2.0833333333333329e-02 3119 3119 2.9166666666666660e-02 3119 3140 -4.1666666666666666e-03 3119 2532 1.2659172094511536e-19 3119 2527 4.1666666666666657e-03 3119 2523 1.0416666666666664e-03 3119 2526 -1.4465734552327348e-19 3119 3137 4.1666666666666649e-03 3119 2497 1.0416666666666664e-02 3120 3120 2.0833333333333329e-02 3121 3121 2.9166666666666660e-02 3121 2547 -1.4465734552327348e-19 3121 2524 4.1666666666666657e-03 3121 2523 1.0416666666666664e-03 3121 3127 4.1666666666666666e-03 3121 2522 1.2659172094511536e-19 3121 3129 -4.1666666666666649e-03 3121 2510 1.0416666666666664e-02 3122 3122 2.0833333333333329e-02 3123 3123 2.9166666666666660e-02 3123 3135 -4.1666666666666666e-03 3123 2526 9.9486666632977745e-20 3123 2525 4.1666666666666657e-03 3123 2523 1.0416666666666664e-03 3123 2522 -1.4465734552327348e-19 3123 3126 4.1666666666666649e-03 3123 2517 1.0416666666666664e-02 3124 3124 2.0833333333333329e-02 3125 3125 2.9166666666666660e-02 3125 3164 -4.1666666666666666e-03 3125 2547 9.9486666632977745e-20 3125 2531 4.1666666666666657e-03 3125 2523 1.0416666666666664e-03 3125 2532 -1.4465734552327348e-19 3125 3165 -4.1666666666666649e-03 3125 2550 1.0416666666666664e-02 3126 3126 2.9166666666666660e-02 3126 2515 1.4465734552327348e-19 3126 3133 -4.1666666666666675e-03 3126 2543 2.0833333333333329e-03 3126 3128 -2.0833333333333333e-03 3126 2525 1.0416666666666664e-02 3126 2523 2.0833333333333329e-03 3126 2522 1.0416666666666662e-03 3126 3123 4.1666666666666649e-03 3126 2517 4.1666666666666657e-03 3127 3127 2.9166666666666660e-02 3127 2543 2.0833333333333329e-03 3127 3130 -4.1666666666666649e-03 3127 3128 -2.0833333333333329e-03 3127 2512 -9.9486666632977745e-20 3127 2510 4.1666666666666657e-03 3127 3121 4.1666666666666666e-03 3127 2524 1.0416666666666664e-02 3127 2523 2.0833333333333329e-03 3127 2522 1.0416666666666664e-03 3128 3128 4.1666666666666664e-02 3128 2512 -3.7587087034409578e-19 3128 2515 -3.7587087034409578e-19 3128 2524 -2.0833333333333333e-03 3128 2517 2.0833333333333329e-03 3128 3133 -2.0833333333333333e-03 3128 2525 -2.0833333333333329e-03 3128 2543 -6.2499999999999986e-03 3128 3126 -2.0833333333333333e-03 3128 2522 2.6745065309554533e-19 3128 3127 -2.0833333333333333e-03 3128 3130 -2.0833333333333333e-03 3128 2510 2.0833333333333333e-03 3128 253 -2.0833333333333333e-03 3128 280 2.0833333333333329e-03 3128 987 2.0833333333333333e-03 3128 273 -2.0833333333333329e-03 3128 270 -6.2499999999999986e-03 3128 992 2.0833333333333333e-03 3128 275 2.6745065309554533e-19 3128 668 2.0833333333333333e-03 3128 667 -2.0833333333333333e-03 3128 246 2.0833333333333333e-03 3129 3129 2.9166666666666660e-02 3129 2523 -2.0833333333333329e-03 3129 2514 -1.4465734552327348e-19 3129 3132 4.1666666666666675e-03 3129 2524 -1.0416666666666664e-02 3129 2546 -2.0833333333333329e-03 3129 3484 2.0833333333333333e-03 3129 2547 -1.0416666666666662e-03 3129 3121 -4.1666666666666649e-03 3129 2510 -4.1666666666666657e-03 3130 3130 2.9166666666666660e-02 3130 2513 -2.0833333333333329e-03 3130 3131 4.1666666666666675e-03 3130 3482 -2.0833333333333333e-03 3130 2545 -1.4465734552327348e-19 3130 2524 -4.1666666666666657e-03 3130 2543 -1.0416666666666660e-03 3130 2522 1.2659172094511536e-19 3130 3127 -4.1666666666666649e-03 3130 3128 -2.0833333333333329e-03 3130 2510 -1.0416666666666664e-02 3130 2512 -1.0416666666666662e-03 3131 3131 2.9166666666666664e-02 3131 2546 -2.0833333333333329e-03 3131 3132 4.1666666666666649e-03 3131 3483 2.0833333333333329e-03 3131 2514 1.4465734552327348e-19 3131 2510 -4.1666666666666657e-03 3131 2513 -1.0416666666666664e-03 3131 2512 -9.9486666632977745e-20 3131 3130 4.1666666666666666e-03 3131 2524 -1.0416666666666664e-02 3131 2543 -2.0833333333333329e-03 3131 3482 2.0833333333333333e-03 3131 2545 -1.0416666666666664e-03 3132 3132 2.9166666666666660e-02 3132 3129 4.1666666666666675e-03 3132 3484 -2.0833333333333333e-03 3132 2547 -1.4465734552327348e-19 3132 2524 -4.1666666666666657e-03 3132 2546 -1.0416666666666664e-03 3132 2545 1.4465734552327348e-19 3132 3131 4.1666666666666649e-03 3132 3483 -2.0833333333333329e-03 3132 2510 -1.0416666666666664e-02 3132 2513 -2.0833333333333329e-03 3132 2514 -1.0416666666666662e-03 3133 3133 2.9166666666666660e-02 3133 3126 -4.1666666666666675e-03 3133 3128 -2.0833333333333333e-03 3133 2522 -1.4465734552327348e-19 3133 2525 -4.1666666666666657e-03 3133 2543 -1.0416666666666660e-03 3133 2544 1.4465734552327348e-19 3133 3134 4.1666666666666649e-03 3133 3481 -2.0833333333333329e-03 3133 2517 -1.0416666666666664e-02 3133 2515 -1.0416666666666662e-03 3134 3134 2.9166666666666660e-02 3134 3136 4.1666666666666666e-03 3134 2540 -2.0833333333333329e-03 3134 2525 -1.0416666666666664e-02 3134 2543 -2.0833333333333329e-03 3134 2544 -1.0416666666666664e-03 3134 3133 4.1666666666666649e-03 3134 3481 2.0833333333333329e-03 3134 2517 -4.1666666666666657e-03 3134 2515 1.4465734552327348e-19 3135 3135 2.9166666666666660e-02 3135 2540 -2.0833333333333329e-03 3135 3136 4.1666666666666649e-03 3135 2517 -4.1666666666666657e-03 3135 3123 -4.1666666666666675e-03 3135 2525 -1.0416666666666664e-02 3135 2523 -2.0833333333333329e-03 3135 2526 -1.0416666666666662e-03 3136 3136 2.9166666666666660e-02 3136 3134 4.1666666666666666e-03 3136 2544 -1.4465734552327348e-19 3136 2525 -4.1666666666666657e-03 3136 2540 -1.0416666666666664e-03 3136 2526 9.9486666632977745e-20 3136 3135 4.1666666666666649e-03 3136 2517 -1.0416666666666664e-02 3137 3137 2.9166666666666660e-02 3137 3141 -4.1666666666666675e-03 3137 2540 2.0833333333333329e-03 3137 2527 1.0416666666666664e-02 3137 2523 2.0833333333333329e-03 3137 2526 1.0416666666666662e-03 3137 3119 4.1666666666666649e-03 3137 2497 4.1666666666666657e-03 3138 3138 2.0833333333333332e-02 3139 3139 2.9166666666666660e-02 3139 3142 4.1666666666666675e-03 3139 3147 -2.0833333333333333e-03 3139 2538 -1.4465734552327348e-19 3139 2527 -4.1666666666666657e-03 3139 2529 -1.0416666666666660e-03 3139 2532 1.2659172094511536e-19 3139 3140 4.1666666666666649e-03 3139 3143 -2.0833333333333329e-03 3139 2497 -1.0416666666666664e-02 3139 2498 -1.0416666666666662e-03 3140 3140 2.9166666666666660e-02 3140 3119 -4.1666666666666666e-03 3140 2523 -2.0833333333333329e-03 3140 2527 -1.0416666666666664e-02 3140 2529 -2.0833333333333329e-03 3140 2532 -1.0416666666666664e-03 3140 3139 4.1666666666666649e-03 3140 3143 2.0833333333333329e-03 3140 2497 -4.1666666666666657e-03 3140 2498 9.9486666632977745e-20 3141 3141 2.9166666666666660e-02 3141 3137 -4.1666666666666675e-03 3141 2526 -1.4465734552327348e-19 3141 2527 -4.1666666666666657e-03 3141 2540 -1.0416666666666664e-03 3141 2538 1.4465734552327348e-19 3141 3142 4.1666666666666649e-03 3141 2497 -1.0416666666666664e-02 3142 3142 2.9166666666666664e-02 3142 2540 -2.0833333333333329e-03 3142 2498 -9.9486666632977745e-20 3142 3139 4.1666666666666666e-03 3142 2527 -1.0416666666666664e-02 3142 2529 -2.0833333333333329e-03 3142 3147 2.0833333333333333e-03 3142 2538 -1.0416666666666664e-03 3142 3141 4.1666666666666649e-03 3142 2497 -4.1666666666666657e-03 3143 3143 4.5833333333333323e-02 3143 2506 1.0416666666666667e-03 3143 3166 -4.1666666666666675e-03 3143 3152 8.3333333333333315e-03 3143 2551 5.2083333333333330e-03 3143 2527 -2.0833333333333333e-03 3143 2550 2.0833333333333329e-03 3143 2554 1.0416666666666662e-03 3143 3150 2.0833333333333333e-03 3143 2531 -2.0833333333333329e-03 3143 2529 -6.2499999999999986e-03 3143 3165 2.0833333333333333e-03 3143 2532 2.6745065309554533e-19 3143 3140 2.0833333333333333e-03 3143 3139 -2.0833333333333333e-03 3143 2497 2.0833333333333333e-03 3143 2498 1.0416666666666660e-03 3144 3144 4.1666666666666664e-02 3144 2438 2.1705219273391446e-19 3144 3431 -1.0416666666666666e-02 3144 3146 2.6946235634527430e-19 3144 2875 -2.1705219273391446e-19 3144 2530 -2.0833333333333333e-03 3144 2872 2.0833333333333329e-03 3144 2871 8.3333333333333332e-03 3144 2880 -2.5575101051159531e-19 3144 3151 2.0833333333333333e-03 3144 2537 -2.0833333333333329e-03 3144 2529 -6.2499999999999986e-03 3144 3427 -2.0833333333333333e-03 3144 2536 2.6745065309554533e-19 3144 3159 2.0833333333333333e-03 3144 3145 2.0833333333333333e-03 3144 2419 2.0833333333333333e-03 3144 2418 8.3333333333333332e-03 3144 2417 -3.8958221617777476e-19 3145 3145 2.9166666666666660e-02 3145 2536 -1.2659172094511536e-19 3145 2432 2.0833333333333329e-03 3145 2530 4.1666666666666657e-03 3145 2529 1.0416666666666660e-03 3145 3156 4.1666666666666675e-03 3145 3149 2.0833333333333333e-03 3145 2528 1.4465734552327348e-19 3145 3159 -4.1666666666666649e-03 3145 3144 2.0833333333333329e-03 3145 2419 1.0416666666666664e-02 3145 2418 2.0833333333333329e-03 3145 2417 1.0416666666666662e-03 3146 3146 4.1666666666666657e-02 3146 2440 2.1684043449710089e-19 3146 2418 2.1684043449710089e-19 3146 2417 -1.0416666666666675e-03 3146 2438 1.0416666666666662e-03 3146 3144 2.3039296165316969e-19 3146 3431 8.1315162936412833e-20 3146 2871 4.9904357809065860e-20 3146 2880 -1.0416666666666671e-03 3146 2875 6.2499999999999995e-03 3146 3148 -2.0833333333333329e-03 3146 3227 4.1666666666666657e-03 3146 2500 -4.1666666666666666e-03 3146 3147 8.3333333333333315e-03 3146 3456 -4.3368086899420177e-19 3146 2498 -1.2499999999999999e-02 3146 2505 -1.0416666666666654e-03 3147 3147 4.5833333333333323e-02 3147 2875 5.2083333333333330e-03 3147 2537 -2.0833333333333333e-03 3147 2497 2.0833333333333329e-03 3147 3139 -2.0833333333333333e-03 3147 2527 -2.0833333333333329e-03 3147 2529 -6.2500000000000003e-03 3147 3142 2.0833333333333333e-03 3147 2538 2.6745065309554533e-19 3147 3452 2.0833333333333333e-03 3147 3151 2.0833333333333333e-03 3147 2872 2.0833333333333333e-03 3147 2880 1.0416666666666662e-03 3147 3456 -4.1666666666666675e-03 3147 3146 8.3333333333333315e-03 3147 2498 1.0416666666666662e-03 3147 2505 1.0416666666666664e-03 3148 3148 4.9999999999999982e-02 3148 2506 -1.0416666666666664e-03 3148 3152 -2.0833333333333320e-03 3148 3230 -1.2499999999999997e-02 3148 2430 -5.2083333333333330e-03 3148 2417 -1.4583333333333330e-02 3148 2440 4.1666666666666675e-03 3148 2438 -5.2083333333333330e-03 3148 3146 -2.0833333333333320e-03 3148 3227 -1.2499999999999999e-02 3148 2498 -2.0833333333333337e-03 3148 2500 4.1666666666666675e-03 3148 2505 -1.0416666666666667e-03 3149 3149 4.1666666666666657e-02 3149 2551 2.1705219273391446e-19 3149 3153 -1.0416666666666666e-02 3149 3152 2.6946235634527430e-19 3149 2430 -2.1705219273391446e-19 3149 2531 -2.0833333333333333e-03 3149 2419 2.0833333333333329e-03 3149 2432 8.3333333333333332e-03 3149 2417 -4.0032894669606370e-19 3149 3145 2.0833333333333333e-03 3149 2530 -2.0833333333333329e-03 3149 2529 -6.2500000000000003e-03 3149 3156 -2.0833333333333333e-03 3149 2528 2.6745065309554533e-19 3149 3155 -2.0833333333333333e-03 3149 3150 2.0833333333333333e-03 3149 2550 2.0833333333333333e-03 3149 2553 8.3333333333333332e-03 3149 2554 -5.9738983838579659e-19 3150 3150 2.9166666666666660e-02 3150 3165 -4.1666666666666675e-03 3150 3143 2.0833333333333333e-03 3150 2532 1.4465734552327348e-19 3150 2531 4.1666666666666657e-03 3150 2529 1.0416666666666660e-03 3150 2528 -1.4465734552327348e-19 3150 3155 4.1666666666666649e-03 3150 3149 2.0833333333333329e-03 3150 2550 1.0416666666666664e-02 3150 2553 2.0833333333333329e-03 3150 2554 1.0416666666666662e-03 3151 3151 2.9166666666666660e-02 3151 2871 2.0833333333333329e-03 3151 3427 4.1666666666666675e-03 3151 3144 2.0833333333333333e-03 3151 2536 1.4465734552327348e-19 3151 2537 4.1666666666666657e-03 3151 2529 1.0416666666666660e-03 3151 2538 -1.4465734552327348e-19 3151 3452 -4.1666666666666649e-03 3151 3147 2.0833333333333329e-03 3151 2872 1.0416666666666664e-02 3151 2880 1.0416666666666662e-03 3152 3152 4.1666666666666657e-02 3152 2500 -4.1666666666666657e-03 3152 3148 -2.0833333333333320e-03 3152 3230 4.1666666666666666e-03 3152 2440 -2.1158177161623045e-20 3152 2553 2.1684043449710089e-19 3152 2498 -1.2499999999999999e-02 3152 2506 -1.0416666666666671e-03 3152 3143 8.3333333333333315e-03 3152 3166 4.3368086899420177e-19 3152 2554 -1.0416666666666677e-03 3152 2551 6.2499999999999995e-03 3152 3149 2.3039296165316969e-19 3152 3153 8.1315162936412833e-20 3152 2432 4.9904357809065860e-20 3152 2417 -1.0416666666666669e-03 3152 2430 1.0416666666666669e-03 3153 3153 4.1666666666666657e-02 3153 2439 -2.0833333333333329e-03 3153 2554 -5.0116116045879435e-20 3153 3149 -1.0416666666666668e-02 3153 3152 1.5502688168223823e-19 3153 2432 -9.3750000000000014e-03 3153 2417 2.1705219273391446e-19 3153 2430 1.0416666666666669e-03 3153 3154 2.0833333333333333e-03 3153 3501 -8.3333333333333315e-03 3153 2553 -9.3750000000000014e-03 3153 2552 -2.0833333333333329e-03 3153 2551 1.0416666666666671e-03 3154 3154 2.4999999999999998e-02 3154 2430 -1.0416666666666667e-03 3154 2432 -6.2499999999999995e-03 3154 2429 -1.0416666666666664e-03 3154 2439 -2.0833333333333329e-03 3154 3158 -2.0833333333333337e-03 3154 3509 -6.0159191589756597e-20 3154 2561 -1.0416666666666664e-03 3154 3153 2.0833333333333337e-03 3154 3501 -5.1510191104902139e-20 3154 2553 -6.2499999999999995e-03 3154 2552 -2.0833333333333329e-03 3154 2551 -1.0416666666666664e-03 3155 3155 2.9166666666666660e-02 3155 2548 1.2659172094511536e-19 3155 3163 -4.1666666666666666e-03 3155 2546 2.0833333333333329e-03 3155 3157 -2.0833333333333337e-03 3155 2531 1.0416666666666664e-02 3155 2529 2.0833333333333329e-03 3155 2528 1.0416666666666664e-03 3155 3150 4.1666666666666649e-03 3155 3149 -2.0833333333333329e-03 3155 2550 4.1666666666666657e-03 3155 2553 1.0416666666666664e-03 3155 2554 -1.4465734552327348e-19 3156 3156 2.9166666666666664e-02 3156 2546 2.0833333333333329e-03 3156 3162 -4.1666666666666649e-03 3156 3157 -2.0833333333333329e-03 3156 2437 -1.4465734552327348e-19 3156 2419 4.1666666666666657e-03 3156 2432 1.0416666666666664e-03 3156 2417 9.9486666632977745e-20 3156 3145 4.1666666666666666e-03 3156 2530 1.0416666666666664e-02 3156 2529 2.0833333333333329e-03 3156 3149 -2.0833333333333333e-03 3156 2528 1.0416666666666664e-03 3157 3157 4.1666666666666657e-02 3157 2432 6.2499999999999986e-03 3157 2437 -4.1202858928001372e-19 3157 2553 6.2499999999999986e-03 3157 2548 -4.1202858928001372e-19 3157 2530 -2.0833333333333333e-03 3157 2550 2.0833333333333329e-03 3157 3163 -2.0833333333333337e-03 3157 2531 -2.0833333333333329e-03 3157 2546 -6.2499999999999995e-03 3157 3155 -2.0833333333333337e-03 3157 2528 4.1202858928001372e-19 3157 3156 -2.0833333333333337e-03 3157 3162 -2.0833333333333333e-03 3157 2419 2.0833333333333333e-03 3157 210 -2.0833333333333333e-03 3157 489 2.0833333333333329e-03 3157 1006 2.0833333333333337e-03 3157 217 -2.0833333333333329e-03 3157 212 -6.2499999999999995e-03 3157 1009 2.0833333333333337e-03 3157 219 4.1202858928001372e-19 3157 1003 2.0833333333333337e-03 3157 1002 -2.0833333333333333e-03 3157 487 2.0833333333333333e-03 3158 3158 4.1666666666666657e-02 3158 2553 7.2916666666666659e-03 3158 2561 -1.0416666666666671e-03 3158 2432 7.2916666666666659e-03 3158 2429 -1.0416666666666669e-03 3158 2439 2.0833333333333333e-03 3158 3154 -2.0833333333333333e-03 3158 3509 -8.3333333333333315e-03 3158 2552 2.0833333333333329e-03 3158 217 -2.0833333333333333e-03 3158 487 2.0833333333333329e-03 3158 1005 -2.0833333333333333e-03 3158 210 -2.0833333333333329e-03 3158 216 -6.2500000000000003e-03 3158 1003 2.0833333333333333e-03 3158 219 2.6745065309554533e-19 3158 1009 2.0833333333333333e-03 3158 1007 2.0833333333333333e-03 3158 489 2.0833333333333333e-03 3159 3159 2.9166666666666660e-02 3159 2529 -2.0833333333333329e-03 3159 2434 -1.4465734552327348e-19 3159 3160 4.1666666666666666e-03 3159 2530 -1.0416666666666664e-02 3159 2534 -2.0833333333333329e-03 3159 3426 -2.0833333333333333e-03 3159 2536 -1.0416666666666664e-03 3159 3145 -4.1666666666666649e-03 3159 3144 2.0833333333333329e-03 3159 2419 -4.1666666666666657e-03 3159 2418 -1.0416666666666664e-03 3159 2417 9.9486666632977745e-20 3160 3160 2.9166666666666660e-02 3160 2418 -2.0833333333333329e-03 3160 3159 4.1666666666666666e-03 3160 3426 2.0833333333333337e-03 3160 2536 -1.2659172094511536e-19 3160 2530 -4.1666666666666657e-03 3160 2534 -1.0416666666666664e-03 3160 2533 1.4465734552327348e-19 3160 3161 4.1666666666666649e-03 3160 3441 -2.0833333333333329e-03 3160 2419 -1.0416666666666664e-02 3160 2435 -2.0833333333333329e-03 3160 2434 -1.0416666666666664e-03 3161 3161 2.9166666666666660e-02 3161 2437 -1.4465734552327348e-19 3161 3162 4.1666666666666675e-03 3161 2546 -2.0833333333333329e-03 3161 3447 2.0833333333333333e-03 3161 2530 -1.0416666666666664e-02 3161 2534 -2.0833333333333329e-03 3161 2533 -1.0416666666666662e-03 3161 3160 4.1666666666666649e-03 3161 3441 2.0833333333333329e-03 3161 2419 -4.1666666666666657e-03 3161 2435 -1.0416666666666660e-03 3161 2434 1.4465734552327348e-19 3162 3162 2.9166666666666660e-02 3162 2435 -2.0833333333333329e-03 3162 3161 4.1666666666666675e-03 3162 3447 -2.0833333333333333e-03 3162 2533 -1.4465734552327348e-19 3162 2530 -4.1666666666666657e-03 3162 2546 -1.0416666666666664e-03 3162 2528 1.4465734552327348e-19 3162 3156 -4.1666666666666649e-03 3162 3157 -2.0833333333333329e-03 3162 2419 -1.0416666666666664e-02 3162 2432 -2.0833333333333329e-03 3162 2437 -1.0416666666666662e-03 3163 3163 2.9166666666666660e-02 3163 2553 -2.0833333333333329e-03 3163 3155 -4.1666666666666666e-03 3163 3157 -2.0833333333333333e-03 3163 2528 -1.4465734552327348e-19 3163 2531 -4.1666666666666657e-03 3163 2546 -1.0416666666666664e-03 3163 2547 9.9486666632977745e-20 3163 3164 4.1666666666666649e-03 3163 3484 -2.0833333333333329e-03 3163 2550 -1.0416666666666664e-02 3163 2548 -1.0416666666666664e-03 3164 3164 2.9166666666666660e-02 3164 3125 -4.1666666666666675e-03 3164 2523 -2.0833333333333329e-03 3164 2531 -1.0416666666666664e-02 3164 2546 -2.0833333333333329e-03 3164 2547 -1.0416666666666662e-03 3164 3163 4.1666666666666649e-03 3164 3484 2.0833333333333329e-03 3164 2550 -4.1666666666666657e-03 3164 2548 1.2659172094511536e-19 3165 3165 2.9166666666666664e-02 3165 2523 -2.0833333333333329e-03 3165 3125 -4.1666666666666649e-03 3165 2550 -4.1666666666666657e-03 3165 2554 -1.4465734552327348e-19 3165 3150 -4.1666666666666675e-03 3165 2531 -1.0416666666666664e-02 3165 2529 -2.0833333333333329e-03 3165 3143 2.0833333333333333e-03 3165 2532 -1.0416666666666662e-03 3166 3166 3.3333333333333326e-02 3166 2498 -4.1666666666666657e-03 3166 3143 -4.1666666666666675e-03 3166 3152 4.3368086899420177e-19 3166 2554 2.1705219273391446e-19 3166 2551 -6.2499999999999986e-03 3166 3500 4.3368086899420177e-19 3166 2506 -6.2499999999999986e-03 3167 3167 2.4999999999999991e-02 3168 3168 4.1666666666666657e-02 3168 2571 -2.7052114752934217e-20 3168 3192 2.0833333333333329e-03 3168 3176 4.1666666666666666e-03 3168 2611 4.1666666666666666e-03 3168 2622 4.9904357809065860e-20 3168 2609 1.2499999999999997e-02 3168 2616 1.0416666666666660e-03 3168 3179 4.3368086899420177e-19 3168 2624 -6.2499999999999986e-03 3168 3188 8.3333333333333332e-03 3168 2627 1.0416666666666664e-03 3168 3190 -1.6263032587282567e-19 3168 3169 2.7105054312137611e-20 3168 2564 3.2249014814734037e-20 3168 2563 1.0416666666666669e-03 3168 2562 -1.0416666666666667e-03 3169 3169 4.1666666666666664e-02 3169 2568 5.0116116045879435e-20 3169 3198 -1.0416666666666668e-02 3169 3171 3.1800793213478638e-19 3169 2628 2.1705219273391446e-19 3169 2622 1.0416666666666666e-02 3169 2624 -2.6946235634527430e-19 3169 2627 -2.1705219273391446e-19 3169 3190 1.0416666666666666e-02 3169 3168 -1.3753697481041702e-19 3169 2564 1.0416666666666668e-02 3169 2563 -2.1705219273391446e-19 3169 2562 -1.0116749763768550e-19 3170 3170 8.3333333333333301e-02 3170 2576 -1.0416666666666664e-03 3170 3174 -2.0833333333333329e-03 3170 3485 1.2499999999999997e-02 3170 2592 -5.2083333333333330e-03 3170 2343 3.1249999999999997e-03 3170 2589 -1.4583333333333332e-02 3170 2599 4.1666666666666675e-03 3170 3172 4.1666666666666666e-03 3170 3489 -1.2499999999999999e-02 3170 2347 -2.0833333333333342e-03 3170 2345 1.6666666666666666e-02 3170 3171 4.1666666666666675e-03 3170 3487 -1.2499999999999997e-02 3170 2568 -5.2083333333333330e-03 3170 2562 -8.3333333333333332e-03 3170 2570 4.1666666666666675e-03 3171 3171 4.1666666666666657e-02 3171 2564 -2.1684043449710089e-19 3171 3169 2.1684043449710089e-19 3171 2622 2.1684043449710089e-19 3171 2624 -6.2499999999999986e-03 3171 3198 6.5052130349130266e-19 3171 2628 1.0416666666666673e-03 3171 3492 -8.3333333333333332e-03 3171 3180 -4.3368086899420177e-19 3171 2343 1.2499999999999997e-02 3171 2347 1.0416666666666662e-03 3171 2345 4.1666666666666666e-03 3171 3487 -2.0833333333333329e-03 3171 3170 4.1666666666666666e-03 3171 2568 1.0416666666666673e-03 3171 2562 -1.0416666666666667e-03 3171 2570 -2.0761130467597592e-20 3172 3172 4.1666666666666657e-02 3172 3180 4.3368086899420177e-19 3172 2624 -6.2499999999999986e-03 3172 2599 2.7157993871341005e-20 3172 3489 -2.0833333333333329e-03 3172 3170 4.1666666666666666e-03 3172 2347 1.0416666666666660e-03 3172 2345 4.1666666666666657e-03 3172 3173 2.7105054312137611e-20 3172 2589 -1.0416666666666667e-03 3173 3173 4.1666666666666657e-02 3173 2624 -5.8569019580184656e-19 3173 3178 3.1800793213478638e-19 3173 3172 -1.3753697481041702e-19 3173 2589 -4.6263880787845817e-19 3174 3174 4.1666666666666657e-02 3174 2677 2.1684043449710089e-19 3174 2572 -3.1249999999999997e-03 3174 3177 8.3333333333333315e-03 3174 3274 4.3368086899420177e-19 3174 2680 5.2083333333333330e-03 3174 2694 -1.0416666666666677e-03 3174 2693 6.2499999999999995e-03 3174 2562 -1.2499999999999999e-02 3174 2570 -4.1666666666666657e-03 3174 2576 -1.0416666666666671e-03 3174 3170 -2.0833333333333329e-03 3174 3485 -4.1666666666666666e-03 3174 2599 1.4973071994693204e-20 3174 3175 2.3039296165316969e-19 3174 3244 8.1315162936412833e-20 3174 2593 4.9904357809065860e-20 3174 2589 -1.0416666666666669e-03 3174 2592 1.0416666666666671e-03 3175 3175 4.1666666666666664e-02 3175 2605 2.0833333333333333e-03 3175 3247 -2.0833333333333337e-03 3175 3176 8.3333333333333315e-03 3175 2690 2.0833333333333329e-03 3175 2677 9.3749999999999997e-03 3175 2694 -1.0416666666666669e-03 3175 2693 2.1705219273391446e-19 3175 3244 -1.0416666666666666e-02 3175 3174 2.6946235634527430e-19 3175 2593 9.3749999999999979e-03 3175 2589 -1.0416666666666669e-03 3175 2592 -2.1705219273391446e-19 3176 3176 9.1666666666666646e-02 3176 2680 1.0416666666666669e-03 3176 2593 1.0416666666666669e-03 3176 3175 8.3333333333333315e-03 3176 3247 2.7105054312137611e-20 3176 2677 1.0416666666666667e-03 3176 2694 -6.2500000000000003e-03 3176 2690 4.1666666666666666e-03 3176 2563 -5.2083333333333322e-03 3176 3168 4.1666666666666666e-03 3176 3192 1.2499999999999999e-02 3176 2609 3.1249999999999997e-03 3176 2616 -2.0833333333333342e-03 3176 2611 1.6666666666666666e-02 3176 3178 4.1666666666666657e-03 3176 3183 1.2499999999999997e-02 3176 2589 -1.0416666666666666e-02 3176 2605 4.1666666666666675e-03 3176 3177 8.3333333333333315e-03 3176 3270 2.7105054312137611e-20 3176 2572 1.0416666666666667e-03 3176 2562 -1.0416666666666666e-02 3176 2571 4.1666666666666666e-03 3177 3177 4.5833333333333323e-02 3177 2690 2.0833333333333333e-03 3177 2576 1.0416666666666667e-03 3177 3274 -4.1666666666666666e-03 3177 3174 8.3333333333333315e-03 3177 2680 1.3541666666666665e-02 3177 2694 -2.1684043449710089e-19 3177 2693 5.2083333333333330e-03 3177 3270 -2.0833333333333333e-03 3177 3176 8.3333333333333315e-03 3177 2572 7.2916666666666659e-03 3177 2562 -6.5052130349130266e-19 3177 2571 2.0833333333333329e-03 3178 3178 4.1666666666666657e-02 3178 2611 4.1666666666666666e-03 3178 3183 2.0833333333333329e-03 3178 3176 4.1666666666666666e-03 3178 2605 -2.0761130467597592e-20 3178 2589 -1.0416666666666667e-03 3178 3173 2.1684043449710089e-19 3178 2624 -6.2499999999999986e-03 3178 2616 1.0416666666666662e-03 3179 3179 3.3333333333333326e-02 3179 2609 4.1666666666666657e-03 3179 3188 -4.1666666666666675e-03 3179 3168 8.6736173798840355e-19 3179 2627 1.6284208410963924e-19 3179 2624 6.2499999999999986e-03 3179 2616 6.2499999999999986e-03 3180 3180 3.3333333333333326e-02 3180 3172 4.3368086899420177e-19 3180 2624 6.2499999999999986e-03 3180 2628 -2.1705219273391446e-19 3180 3492 4.1666666666666657e-03 3180 2343 4.1666666666666666e-03 3180 2347 6.2499999999999986e-03 3181 3181 2.4999999999999994e-02 3182 3182 2.0833333333333329e-02 3183 3183 5.8333333333333320e-02 3183 2616 -1.0416666666666664e-03 3183 3178 2.0833333333333329e-03 3183 3176 1.2499999999999997e-02 3183 2589 -5.2083333333333330e-03 3183 2611 4.1666666666666657e-03 3183 3567 -1.3552527156068805e-20 3183 2936 4.1666666666666666e-03 3183 3569 -2.7105054312137611e-20 3183 2605 4.1666666666666675e-03 3184 3184 2.0833333333333332e-02 3185 3185 2.0833333333333332e-02 3186 3186 2.0833333333333329e-02 3187 3187 2.5000000000000001e-02 3187 3331 -6.0159191589756597e-20 3187 2627 -1.0416666666666664e-03 3187 2618 -2.0833333333333329e-03 3187 3188 2.0833333333333337e-03 3187 3191 -1.0254392617697373e-19 3187 2609 -1.0416666666666664e-03 3187 2606 -2.0833333333333329e-03 3188 3188 4.5833333333333323e-02 3188 2618 -2.0833333333333329e-03 3188 2616 -1.0416666666666667e-03 3188 3179 -4.1666666666666675e-03 3188 2624 -5.2083333333333330e-03 3188 3168 8.3333333333333332e-03 3188 2627 -2.1684043449710089e-19 3188 3187 2.0833333333333337e-03 3188 3191 -8.3333333333333315e-03 3188 2609 2.1684043449710089e-19 3188 2606 -2.0833333333333333e-03 3189 3189 2.0833333333333332e-02 3190 3190 4.1666666666666657e-02 3190 2573 2.0833333333333329e-03 3190 3197 -2.0833333333333337e-03 3190 3191 8.3333333333333315e-03 3190 2618 2.0833333333333333e-03 3190 2622 9.3749999999999997e-03 3190 2624 -2.1705219273391446e-19 3190 2627 -1.0416666666666675e-03 3190 3169 1.0416666666666666e-02 3190 3168 -2.7807826960562663e-19 3190 2564 9.3749999999999979e-03 3190 2563 -1.0416666666666671e-03 3190 2562 -2.1705219273391446e-19 3191 3191 6.6666666666666652e-02 3191 2796 1.0416666666666669e-03 3191 3193 8.3333333333333315e-03 3191 3328 -1.3552527156068805e-20 3191 2806 -6.2500000000000003e-03 3191 2797 4.1666666666666666e-03 3191 3194 8.3333333333333315e-03 3191 3330 -1.3552527156068805e-20 3191 2578 1.0416666666666667e-03 3191 2564 1.0416666666666669e-03 3191 2563 -6.2500000000000003e-03 3191 2573 4.1666666666666666e-03 3191 3190 8.3333333333333315e-03 3191 3197 1.3552527156068805e-20 3191 2622 1.0416666666666667e-03 3191 2627 -6.2500000000000003e-03 3191 2618 4.1666666666666666e-03 3191 3188 -8.3333333333333315e-03 3191 3187 1.3552527156068805e-20 3191 2609 -6.2500000000000003e-03 3191 2606 4.1666666666666666e-03 3192 3192 5.8333333333333320e-02 3192 2562 -5.2083333333333322e-03 3192 3168 2.0833333333333329e-03 3192 3176 1.2499999999999999e-02 3192 2616 -1.0416666666666667e-03 3192 2578 1.0416666666666669e-03 3192 2563 -1.0416666666666666e-02 3192 2571 4.1666666666666657e-03 3192 3194 8.3333333333333315e-03 3192 3571 -1.3552527156068805e-20 3192 2796 1.0416666666666667e-03 3192 2806 -6.2500000000000003e-03 3192 2792 4.1666666666666666e-03 3192 3193 8.3333333333333315e-03 3192 3356 1.3552527156068805e-20 3192 2609 -4.1666666666666675e-03 3192 2611 4.1666666666666675e-03 3193 3193 4.1666666666666664e-02 3193 2606 2.0833333333333329e-03 3193 3328 2.0833333333333337e-03 3193 3191 8.3333333333333315e-03 3193 2797 2.0833333333333333e-03 3193 2806 -2.0833333333333337e-03 3193 2792 2.0833333333333329e-03 3193 3356 -2.0833333333333337e-03 3193 3192 8.3333333333333315e-03 3193 2609 -2.0833333333333337e-03 3193 2611 2.0833333333333333e-03 3194 3194 4.1666666666666664e-02 3194 2797 2.0833333333333329e-03 3194 3330 2.0833333333333337e-03 3194 3191 8.3333333333333315e-03 3194 2573 2.0833333333333333e-03 3194 2578 8.3333333333333315e-03 3194 2563 -2.0833333333333333e-03 3194 2571 2.0833333333333329e-03 3194 3571 2.0833333333333337e-03 3194 3192 8.3333333333333315e-03 3194 2796 8.3333333333333315e-03 3194 2806 -2.0833333333333333e-03 3194 2792 2.0833333333333333e-03 3195 3195 2.4999999999999998e-02 3195 2574 -1.0416666666666664e-03 3195 2628 -1.0416666666666664e-03 3195 3198 2.0833333333333337e-03 3195 3491 -1.0254392617697373e-19 3195 2564 -6.2500000000000003e-03 3195 2568 -1.0416666666666664e-03 3195 2587 -2.0833333333333329e-03 3195 3196 2.0833333333333337e-03 3195 3359 6.0159191589756597e-20 3195 2622 -6.2500000000000003e-03 3195 2619 -1.0416666666666662e-03 3195 2621 -2.0833333333333329e-03 3196 3196 4.1666666666666664e-02 3196 2587 -2.0833333333333333e-03 3196 2618 -2.0833333333333333e-03 3196 3197 2.0833333333333337e-03 3196 3333 8.3333333333333315e-03 3196 2564 -8.3333333333333315e-03 3196 2574 2.0833333333333337e-03 3196 2573 -2.0833333333333329e-03 3196 3195 2.0833333333333337e-03 3196 3359 -8.3333333333333315e-03 3196 2622 -8.3333333333333315e-03 3196 2619 2.0833333333333337e-03 3196 2621 -2.0833333333333329e-03 3197 3197 2.4999999999999998e-02 3197 2563 -1.0416666666666664e-03 3197 3190 -2.0833333333333337e-03 3197 3191 -1.0254392617697373e-19 3197 2627 -1.0416666666666664e-03 3197 2622 -6.2500000000000003e-03 3197 2619 -1.0416666666666664e-03 3197 2618 -2.0833333333333329e-03 3197 3196 2.0833333333333337e-03 3197 3333 -6.0159191589756597e-20 3197 2564 -6.2500000000000003e-03 3197 2574 -1.0416666666666662e-03 3197 2573 -2.0833333333333329e-03 3198 3198 4.1666666666666657e-02 3198 2621 -2.0833333333333329e-03 3198 3195 2.0833333333333337e-03 3198 3491 -8.3333333333333315e-03 3198 2587 -2.0833333333333333e-03 3198 2564 -9.3749999999999997e-03 3198 2568 1.0416666666666673e-03 3198 2562 -2.1705219273391446e-19 3198 3169 -1.0416666666666668e-02 3198 2622 -9.3749999999999997e-03 3198 2624 5.0116116045879435e-20 3198 3171 4.6263880787845817e-19 3198 2628 1.0416666666666667e-03 3199 3199 4.1666666666666657e-02 3199 2642 4.5528020914918643e-20 3199 3217 2.0833333333333329e-03 3199 3207 4.1666666666666666e-03 3199 2407 4.1666666666666666e-03 3199 2662 -3.2249014814734037e-20 3199 2413 3.1249999999999997e-03 3199 2408 1.2499999999999997e-02 3199 2415 1.0416666666666660e-03 3199 3209 4.3368086899420177e-19 3199 2666 -5.2083333333333322e-03 3199 2664 -6.2499999999999986e-03 3199 3214 8.3333333333333332e-03 3199 2667 1.0416666666666664e-03 3199 3216 -2.7105054312137611e-20 3199 3200 1.6263032587282567e-19 3199 2635 -4.9904357809065860e-20 3199 2634 1.0416666666666669e-03 3199 2633 -1.0416666666666669e-03 3200 3200 4.1666666666666657e-02 3200 2637 -5.0116116045879435e-20 3200 3223 -1.0416666666666668e-02 3200 3202 4.6263880787845817e-19 3200 2672 2.1705219273391446e-19 3200 2662 1.0416666666666666e-02 3200 2664 -2.6946235634527430e-19 3200 2667 -2.1705219273391446e-19 3200 3216 1.0416666666666666e-02 3200 3199 2.7807826960562663e-19 3200 2635 1.0416666666666668e-02 3200 2634 -2.1705219273391446e-19 3200 2633 -1.0116749763768550e-19 3201 3201 8.3333333333333315e-02 3201 2646 -1.0416666666666664e-03 3201 3205 -2.0833333333333329e-03 3201 3501 1.2499999999999997e-02 3201 2430 -5.2083333333333330e-03 3201 2811 3.1249999999999997e-03 3201 2429 -5.2083333333333322e-03 3201 2428 -1.4583333333333332e-02 3201 2439 4.1666666666666675e-03 3201 3203 4.1666666666666666e-03 3201 3509 -1.2499999999999999e-02 3201 2819 3.1249999999999997e-03 3201 2820 -2.0833333333333342e-03 3201 2817 1.6666666666666666e-02 3201 3202 4.1666666666666657e-03 3201 3506 -1.2499999999999997e-02 3201 2637 -5.2083333333333330e-03 3201 2633 -8.3333333333333315e-03 3201 2639 4.1666666666666675e-03 3202 3202 4.1666666666666657e-02 3202 2670 -5.2083333333333330e-03 3202 2635 -2.1684043449710089e-19 3202 3200 6.5052130349130266e-19 3202 2662 2.1684043449710089e-19 3202 2664 -6.2499999999999986e-03 3202 3223 2.1684043449710089e-19 3202 2672 1.0416666666666673e-03 3202 3389 8.3333333333333332e-03 3202 3210 -4.3368086899420177e-19 3202 2810 3.1249999999999997e-03 3202 2811 1.2499999999999997e-02 3202 2820 1.0416666666666660e-03 3202 2817 4.1666666666666666e-03 3202 3506 -2.0833333333333329e-03 3202 3201 4.1666666666666666e-03 3202 2637 1.0416666666666673e-03 3202 2633 -1.0416666666666669e-03 3202 2639 -1.4973071994693204e-20 3203 3203 4.1666666666666657e-02 3203 2665 -3.2249014814734037e-20 3203 2810 3.1249999999999997e-03 3203 3210 4.3368086899420177e-19 3203 2670 -5.2083333333333322e-03 3203 2664 -6.2499999999999986e-03 3203 3390 -8.3333333333333332e-03 3203 2673 1.0416666666666664e-03 3203 2439 4.5528020914918643e-20 3203 3509 -2.0833333333333329e-03 3203 3201 4.1666666666666666e-03 3203 2819 1.2499999999999997e-02 3203 2820 1.0416666666666660e-03 3203 2817 4.1666666666666666e-03 3203 3211 -2.7105054312137611e-20 3203 3204 1.6263032587282567e-19 3203 2424 -4.9904357809065860e-20 3203 2429 1.0416666666666667e-03 3203 2428 -1.0416666666666669e-03 3204 3204 4.1666666666666657e-02 3204 2673 -2.1705219273391446e-19 3204 2423 -5.0116116045879435e-20 3204 2665 1.0416666666666666e-02 3204 2664 -5.8569019580184656e-19 3204 3058 1.0416666666666668e-02 3204 3063 -4.6263880787845817e-19 3204 2663 2.1705219273391446e-19 3204 3211 1.0416666666666666e-02 3204 3203 2.7807826960562663e-19 3204 2424 1.0416666666666668e-02 3204 2429 -2.1705219273391446e-19 3204 2428 -4.6263880787845817e-19 3205 3205 4.1666666666666657e-02 3205 2681 2.1684043449710089e-19 3205 2643 -3.1249999999999997e-03 3205 3208 8.3333333333333332e-03 3205 2686 5.2083333333333330e-03 3205 2698 -1.0416666666666677e-03 3205 2697 6.2499999999999995e-03 3205 2633 -1.2499999999999999e-02 3205 2639 -4.1666666666666666e-03 3205 2646 -1.0416666666666671e-03 3205 3201 -2.0833333333333329e-03 3205 3501 -4.1666666666666666e-03 3205 2439 2.0761130467597592e-20 3205 3206 7.3183646642771549e-19 3205 3275 1.3552527156068805e-20 3205 2431 -3.2249014814734037e-20 3205 2428 -1.0416666666666671e-03 3205 2430 1.0416666666666671e-03 3206 3206 4.1666666666666657e-02 3206 2433 2.0833333333333329e-03 3206 3259 2.0833333333333337e-03 3206 3207 8.3333333333333315e-03 3206 2678 2.0833333333333333e-03 3206 2681 9.3749999999999997e-03 3206 2698 -1.0416666666666667e-03 3206 2697 2.1705219273391446e-19 3206 3275 -1.0416666666666668e-02 3206 3205 5.8569019580184656e-19 3206 2431 9.3749999999999979e-03 3206 2428 -1.0416666666666669e-03 3206 2430 -2.1705219273391446e-19 3207 3207 9.1666666666666646e-02 3207 2686 1.0416666666666669e-03 3207 2431 1.0416666666666669e-03 3207 3206 8.3333333333333315e-03 3207 3259 -1.3552527156068805e-20 3207 2681 1.0416666666666667e-03 3207 2698 -6.2500000000000003e-03 3207 2678 4.1666666666666666e-03 3207 2404 3.1249999999999997e-03 3207 2634 -5.2083333333333322e-03 3207 3199 4.1666666666666666e-03 3207 3217 1.2499999999999999e-02 3207 2408 3.1249999999999997e-03 3207 2415 -2.0833333333333342e-03 3207 2407 1.6666666666666666e-02 3207 3063 -4.1666666666666657e-03 3207 3065 1.2499999999999997e-02 3207 2423 -5.2083333333333330e-03 3207 2428 -1.0416666666666664e-02 3207 2433 4.1666666666666675e-03 3207 3208 8.3333333333333315e-03 3207 3258 -1.3552527156068805e-20 3207 2643 1.0416666666666667e-03 3207 2633 -1.0416666666666666e-02 3207 2642 4.1666666666666666e-03 3208 3208 4.5833333333333323e-02 3208 2678 2.0833333333333329e-03 3208 2646 1.0416666666666667e-03 3208 3322 -4.1666666666666675e-03 3208 3205 8.3333333333333315e-03 3208 2686 1.3541666666666665e-02 3208 2698 -1.3010426069826053e-18 3208 2697 5.2083333333333330e-03 3208 3258 2.0833333333333337e-03 3208 3207 8.3333333333333315e-03 3208 2643 7.2916666666666668e-03 3208 2633 -6.5052130349130266e-19 3208 2642 2.0833333333333333e-03 3209 3209 3.3333333333333326e-02 3209 2408 4.1666666666666657e-03 3209 3214 -4.1666666666666675e-03 3209 3199 8.6736173798840355e-19 3209 2667 2.1705219273391446e-19 3209 2666 4.1666666666666657e-03 3209 2664 6.2499999999999986e-03 3209 2663 -1.6284208410963924e-19 3209 3064 4.1666666666666657e-03 3209 2413 1.6666666666666663e-02 3209 2404 4.1666666666666666e-03 3209 2415 6.2499999999999986e-03 3210 3210 3.3333333333333326e-02 3210 2819 4.1666666666666657e-03 3210 3390 4.1666666666666675e-03 3210 3203 4.3368086899420177e-19 3210 2673 2.1705219273391446e-19 3210 2670 4.1666666666666666e-03 3210 2664 6.2499999999999986e-03 3210 2672 -1.6284208410963924e-19 3210 3389 -4.1666666666666666e-03 3210 2810 1.6666666666666663e-02 3210 2811 4.1666666666666666e-03 3210 2820 6.2499999999999986e-03 3211 3211 4.1666666666666664e-02 3211 2424 8.3333333333333332e-03 3211 2429 -2.5575101051159531e-19 3211 2665 8.3333333333333332e-03 3211 2673 -6.8816133008491563e-19 3211 2664 -2.1705219273391446e-19 3211 3204 1.0416666666666666e-02 3211 3203 1.3753697481041702e-19 3211 2428 -2.1705219273391446e-19 3211 205 -2.0833333333333333e-03 3211 489 2.0833333333333329e-03 3211 1007 2.0833333333333333e-03 3211 217 -2.0833333333333329e-03 3211 216 -6.2499999999999986e-03 3211 1008 -2.0833333333333333e-03 3211 215 2.6745065309554533e-19 3211 986 2.0833333333333333e-03 3211 985 -2.0833333333333333e-03 3211 316 2.0833333333333333e-03 3212 3212 2.9166666666666664e-02 3212 2479 1.0416666666666664e-02 3212 2480 1.0416666666666662e-03 3212 2671 4.1666666666666657e-03 3212 2665 1.0416666666666664e-03 3212 2663 1.4465734552327348e-19 3212 3066 4.1666666666666675e-03 3212 2466 2.0833333333333329e-03 3212 3058 -2.0833333333333333e-03 3212 484 2.0833333333333329e-03 3212 977 -4.1666666666666649e-03 3212 981 -2.0833333333333329e-03 3212 314 -1.4465734552327348e-19 3213 3213 2.5000000000000001e-02 3213 2413 6.2500000000000003e-03 3213 2666 6.2500000000000003e-03 3213 2674 2.0833333333333329e-03 3213 2667 1.0416666666666664e-03 3213 3214 -2.0833333333333337e-03 3213 3219 1.0254392617697373e-19 3213 2408 1.0416666666666664e-03 3213 289 1.0416666666666664e-03 3213 288 2.0833333333333329e-03 3213 978 -2.0833333333333337e-03 3213 1011 6.0159191589756597e-20 3213 322 1.0416666666666664e-03 3214 3214 4.5833333333333323e-02 3214 2674 -2.0833333333333333e-03 3214 2415 -1.0416666666666667e-03 3214 3209 -4.1666666666666675e-03 3214 2666 -1.3541666666666665e-02 3214 2664 -5.2083333333333330e-03 3214 3199 8.3333333333333332e-03 3214 3213 -2.0833333333333337e-03 3214 3219 -8.3333333333333315e-03 3214 2413 -7.2916666666666668e-03 3214 2408 6.5052130349130266e-19 3214 288 -2.0833333333333329e-03 3215 3215 2.9166666666666664e-02 3215 2671 4.1666666666666657e-03 3215 2666 1.0416666666666664e-03 3215 2479 1.0416666666666664e-02 3215 2478 1.0416666666666664e-03 3215 2466 2.0833333333333329e-03 3215 3066 4.1666666666666649e-03 3215 3064 -2.0833333333333329e-03 3215 2663 -1.4465734552327348e-19 3215 321 1.2659172094511536e-19 3215 973 4.1666666666666666e-03 3215 482 2.0833333333333329e-03 3215 970 -2.0833333333333337e-03 3216 3216 4.1666666666666664e-02 3216 2651 2.0833333333333329e-03 3216 3224 -2.0833333333333337e-03 3216 3219 8.3333333333333315e-03 3216 2674 2.0833333333333333e-03 3216 2662 9.3750000000000014e-03 3216 2664 -2.1705219273391446e-19 3216 2667 -1.0416666666666673e-03 3216 3200 1.0416666666666666e-02 3216 3199 1.3753697481041702e-19 3216 2635 9.3749999999999979e-03 3216 2634 -1.0416666666666669e-03 3216 2633 -2.1705219273391446e-19 3217 3217 5.8333333333333320e-02 3217 2633 -5.2083333333333322e-03 3217 3199 2.0833333333333329e-03 3217 3207 1.2499999999999999e-02 3217 2415 -1.0416666666666667e-03 3217 2760 1.0416666666666669e-03 3217 2645 1.0416666666666669e-03 3217 2634 -1.0416666666666666e-02 3217 2642 4.1666666666666657e-03 3217 3220 8.3333333333333315e-03 3217 3261 -1.3552527156068805e-20 3217 2754 1.0416666666666667e-03 3217 2759 -6.2500000000000003e-03 3217 2750 4.1666666666666666e-03 3217 3218 8.3333333333333315e-03 3217 3255 -2.7105054312137611e-20 3217 2409 1.0416666666666667e-03 3217 2408 -4.1666666666666675e-03 3217 2407 4.1666666666666675e-03 3218 3218 4.1666666666666664e-02 3218 3326 2.0833333333333337e-03 3218 3219 8.3333333333333315e-03 3218 2757 2.0833333333333333e-03 3218 2760 8.3333333333333315e-03 3218 2759 -2.0833333333333337e-03 3218 2750 2.0833333333333329e-03 3218 3255 2.0833333333333337e-03 3218 3217 8.3333333333333315e-03 3218 2409 8.3333333333333315e-03 3218 2408 -2.0833333333333337e-03 3218 2407 2.0833333333333333e-03 3218 288 2.0833333333333329e-03 3219 3219 6.6666666666666652e-02 3219 2754 1.0416666666666669e-03 3219 2409 1.0416666666666669e-03 3219 3218 8.3333333333333315e-03 3219 3326 -2.7105054312137611e-20 3219 2760 1.0416666666666667e-03 3219 2759 -6.2500000000000003e-03 3219 2757 4.1666666666666666e-03 3219 3220 8.3333333333333315e-03 3219 3317 1.3552527156068805e-20 3219 2645 1.0416666666666667e-03 3219 2666 1.0416666666666669e-03 3219 2635 1.0416666666666669e-03 3219 2634 -6.2500000000000003e-03 3219 2651 4.1666666666666666e-03 3219 3216 8.3333333333333315e-03 3219 3224 2.7105054312137611e-20 3219 2662 1.0416666666666667e-03 3219 2667 -6.2500000000000003e-03 3219 2674 4.1666666666666666e-03 3219 3214 -8.3333333333333315e-03 3219 3213 -1.3552527156068805e-20 3219 2413 1.0416666666666667e-03 3219 2408 -6.2500000000000003e-03 3219 288 4.1666666666666666e-03 3220 3220 4.1666666666666664e-02 3220 2757 2.0833333333333333e-03 3220 3317 -2.0833333333333337e-03 3220 3219 8.3333333333333315e-03 3220 2651 2.0833333333333329e-03 3220 2645 8.3333333333333315e-03 3220 2634 -2.0833333333333337e-03 3220 2642 2.0833333333333333e-03 3220 3261 2.0833333333333337e-03 3220 3217 8.3333333333333315e-03 3220 2754 8.3333333333333315e-03 3220 2759 -2.0833333333333337e-03 3220 2750 2.0833333333333329e-03 3221 3221 2.4999999999999998e-02 3221 2652 -1.0416666666666664e-03 3221 2672 -1.0416666666666664e-03 3221 3223 2.0833333333333337e-03 3221 3371 -6.0159191589756597e-20 3221 2635 -6.2500000000000003e-03 3221 2637 -1.0416666666666664e-03 3221 2654 -2.0833333333333329e-03 3221 3222 2.0833333333333337e-03 3221 3373 1.0254392617697373e-19 3221 2662 -6.2500000000000003e-03 3221 2661 -1.0416666666666664e-03 3221 2660 -2.0833333333333329e-03 3222 3222 4.1666666666666664e-02 3222 2654 -2.0833333333333329e-03 3222 2674 -2.0833333333333329e-03 3222 3224 2.0833333333333337e-03 3222 3383 8.3333333333333315e-03 3222 2635 -8.3333333333333315e-03 3222 2652 2.0833333333333333e-03 3222 2651 -2.0833333333333333e-03 3222 3221 2.0833333333333337e-03 3222 3373 8.3333333333333315e-03 3222 2662 -8.3333333333333315e-03 3222 2661 2.0833333333333333e-03 3222 2660 -2.0833333333333333e-03 3223 3223 4.1666666666666664e-02 3223 2660 -2.0833333333333329e-03 3223 3221 2.0833333333333337e-03 3223 3371 8.3333333333333315e-03 3223 2654 -2.0833333333333333e-03 3223 2635 -9.3749999999999997e-03 3223 2637 1.0416666666666669e-03 3223 2633 -2.1705219273391446e-19 3223 3200 -1.0416666666666668e-02 3223 2662 -9.3749999999999997e-03 3223 2664 5.0116116045879435e-20 3223 3202 3.1800793213478638e-19 3223 2672 1.0416666666666664e-03 3224 3224 2.5000000000000001e-02 3224 2634 -1.0416666666666664e-03 3224 3216 -2.0833333333333337e-03 3224 3219 6.0159191589756597e-20 3224 2667 -1.0416666666666664e-03 3224 2662 -6.2500000000000003e-03 3224 2661 -1.0416666666666664e-03 3224 2674 -2.0833333333333329e-03 3224 3222 2.0833333333333337e-03 3224 3383 1.0254392617697373e-19 3224 2635 -6.2500000000000003e-03 3224 2652 -1.0416666666666664e-03 3224 2651 -2.0833333333333329e-03 3225 3225 5.8333333333333320e-02 3225 2505 1.0416666666666664e-03 3225 3249 2.0833333333333329e-03 3225 3227 1.2499999999999997e-02 3225 2592 5.2083333333333330e-03 3225 2595 -4.1666666666666675e-03 3225 3233 1.3552527156068805e-20 3225 2702 -4.1666666666666666e-03 3225 3226 2.7105054312137611e-20 3225 2500 -4.1666666666666666e-03 3226 3226 2.5000000000000001e-02 3226 3231 -1.0254392617697373e-19 3226 2702 2.0833333333333329e-03 3226 3225 6.0159191589756597e-20 3226 2500 2.0833333333333329e-03 3227 3227 9.1666666666666646e-02 3227 2417 5.2083333333333330e-03 3227 2681 -1.0416666666666664e-03 3227 3234 1.2197274440461925e-19 3227 3276 8.3333333333333315e-03 3227 2431 -1.0416666666666667e-03 3227 2440 -4.1666666666666675e-03 3227 2438 1.0416666666666666e-02 3227 2593 -1.0416666666666664e-03 3227 3225 1.2499999999999997e-02 3227 3249 4.1666666666666657e-03 3227 2595 -4.1666666666666675e-03 3227 2592 1.0416666666666664e-02 3227 3232 1.2197274440461925e-19 3227 3244 8.3333333333333315e-03 3227 2677 -1.0416666666666667e-03 3227 2675 -4.1666666666666657e-03 3227 2693 6.2499999999999995e-03 3227 3148 -1.2499999999999999e-02 3227 3146 4.1666666666666657e-03 3227 2498 -3.1249999999999997e-03 3227 2500 -1.6666666666666663e-02 3227 2505 2.0833333333333337e-03 3228 3228 6.6666666666666652e-02 3228 2684 -1.0416666666666669e-03 3228 3240 -8.3333333333333315e-03 3228 3235 2.7105054312137611e-20 3228 2731 -1.0416666666666667e-03 3228 2735 6.2500000000000003e-03 3228 2738 -4.1666666666666666e-03 3228 2593 -1.0416666666666669e-03 3228 3237 -8.3333333333333315e-03 3228 3233 2.7105054312137611e-20 3228 2596 6.2500000000000003e-03 3228 2595 -4.1666666666666666e-03 3228 3239 -8.3333333333333315e-03 3228 3232 2.7105054312137611e-20 3228 2677 -1.0416666666666667e-03 3228 2676 6.2500000000000003e-03 3228 2675 -4.1666666666666666e-03 3228 3238 -8.3333333333333315e-03 3228 3229 2.7105054312137611e-20 3228 2700 6.2500000000000003e-03 3228 2702 -4.1666666666666666e-03 3229 3229 2.4999999999999998e-02 3229 2735 1.0416666666666664e-03 3229 3231 -1.0254392617697373e-19 3229 2738 2.0833333333333329e-03 3229 3238 2.0833333333333337e-03 3229 3228 6.0159191589756597e-20 3229 2700 1.0416666666666662e-03 3229 2702 2.0833333333333329e-03 3230 3230 9.1666666666666646e-02 3230 2684 -1.0416666666666664e-03 3230 3235 1.2197274440461925e-19 3230 3306 8.3333333333333315e-03 3230 2731 -1.0416666666666667e-03 3230 2738 -4.1666666666666675e-03 3230 2732 1.0416666666666666e-02 3230 2431 -1.0416666666666664e-03 3230 2498 -3.1249999999999997e-03 3230 3148 -1.2499999999999997e-02 3230 3152 4.1666666666666657e-03 3230 2417 5.2083333333333330e-03 3230 2440 -4.1666666666666666e-03 3230 2430 1.0416666666666664e-02 3230 3234 1.8973538018496328e-19 3230 3275 8.3333333333333315e-03 3230 2681 -1.0416666666666667e-03 3230 2675 -4.1666666666666657e-03 3230 2697 6.2499999999999995e-03 3230 3231 1.2499999999999997e-02 3230 3500 -4.1666666666666657e-03 3230 2500 -1.6666666666666663e-02 3230 2506 2.0833333333333337e-03 3231 3231 5.8333333333333320e-02 3231 2732 5.2083333333333330e-03 3231 3226 1.3552527156068805e-20 3231 2702 -4.1666666666666666e-03 3231 3229 1.3552527156068805e-20 3231 2738 -4.1666666666666666e-03 3231 3500 -2.0833333333333324e-03 3231 3230 1.2499999999999999e-02 3231 2500 -4.1666666666666675e-03 3231 2506 1.0416666666666667e-03 3232 3232 2.4999999999999998e-02 3232 2592 1.0416666666666667e-03 3232 3244 -2.0833333333333337e-03 3232 3227 -5.1510191104902139e-20 3232 2693 1.0416666666666664e-03 3232 2593 6.2499999999999995e-03 3232 2596 1.0416666666666664e-03 3232 2595 2.0833333333333329e-03 3232 3239 2.0833333333333337e-03 3232 3228 6.0159191589756597e-20 3232 2677 6.2499999999999995e-03 3232 2676 1.0416666666666662e-03 3232 2675 2.0833333333333324e-03 3233 3233 2.4999999999999998e-02 3233 3225 -1.0254392617697373e-19 3233 2700 1.0416666666666664e-03 3233 2702 2.0833333333333329e-03 3233 3237 2.0833333333333337e-03 3233 3228 6.0159191589756597e-20 3233 2596 1.0416666666666664e-03 3233 2595 2.0833333333333329e-03 3234 3234 2.4999999999999998e-02 3234 2430 1.0416666666666667e-03 3234 3275 -2.0833333333333337e-03 3234 3230 4.7253188800459238e-19 3234 2697 1.0416666666666664e-03 3234 2681 6.2499999999999986e-03 3234 2675 2.0833333333333324e-03 3234 2693 1.0416666666666667e-03 3234 3276 -2.0833333333333337e-03 3234 3227 -5.1510191104902139e-20 3234 2431 6.2499999999999986e-03 3234 2440 2.0833333333333324e-03 3234 2438 1.0416666666666664e-03 3235 3235 2.4999999999999998e-02 3235 2697 1.0416666666666667e-03 3235 3306 -2.0833333333333337e-03 3235 3230 -5.1510191104902139e-20 3235 2732 1.0416666666666664e-03 3235 2684 6.2499999999999995e-03 3235 2676 1.0416666666666664e-03 3235 2675 2.0833333333333329e-03 3235 3240 2.0833333333333337e-03 3235 3228 6.0159191589756597e-20 3235 2731 6.2499999999999995e-03 3235 2735 1.0416666666666664e-03 3235 2738 2.0833333333333329e-03 3236 3236 6.6666666666666652e-02 3236 2731 1.0416666666666669e-03 3236 3238 8.3333333333333315e-03 3236 3587 -2.7105054312137611e-20 3236 2735 -6.2500000000000003e-03 3236 2734 4.1666666666666666e-03 3236 3240 8.3333333333333315e-03 3236 3304 2.7105054312137611e-20 3236 2684 1.0416666666666667e-03 3236 2677 1.0416666666666669e-03 3236 2676 -6.2500000000000003e-03 3236 2692 4.1666666666666666e-03 3236 3239 8.3333333333333315e-03 3236 3245 2.7105054312137611e-20 3236 2593 1.0416666666666667e-03 3236 2596 -6.2500000000000003e-03 3236 2601 4.1666666666666666e-03 3236 3237 8.3333333333333315e-03 3236 3241 2.7105054312137611e-20 3236 2700 -6.2500000000000003e-03 3236 2699 4.1666666666666666e-03 3237 3237 4.1666666666666664e-02 3237 2601 2.0833333333333333e-03 3237 2702 2.0833333333333333e-03 3237 3233 2.0833333333333333e-03 3237 3228 -8.3333333333333315e-03 3237 2596 -2.0833333333333337e-03 3237 2595 2.0833333333333329e-03 3237 3241 -2.0833333333333333e-03 3237 3236 8.3333333333333315e-03 3237 2700 -2.0833333333333337e-03 3237 2699 2.0833333333333329e-03 3238 3238 4.1666666666666664e-02 3238 2738 2.0833333333333333e-03 3238 2699 2.0833333333333333e-03 3238 3587 2.0833333333333337e-03 3238 3236 8.3333333333333315e-03 3238 2735 -2.0833333333333337e-03 3238 2734 2.0833333333333329e-03 3238 3229 2.0833333333333337e-03 3238 3228 -8.3333333333333315e-03 3238 2700 -2.0833333333333337e-03 3238 2702 2.0833333333333329e-03 3239 3239 4.1666666666666664e-02 3239 2692 2.0833333333333333e-03 3239 3245 -2.0833333333333337e-03 3239 3236 8.3333333333333315e-03 3239 2601 2.0833333333333329e-03 3239 2593 8.3333333333333315e-03 3239 2596 -2.0833333333333337e-03 3239 2595 2.0833333333333333e-03 3239 3232 2.0833333333333337e-03 3239 3228 -8.3333333333333315e-03 3239 2677 8.3333333333333315e-03 3239 2676 -2.0833333333333337e-03 3239 2675 2.0833333333333329e-03 3240 3240 4.1666666666666664e-02 3240 2675 2.0833333333333333e-03 3240 3235 2.0833333333333333e-03 3240 3228 -8.3333333333333315e-03 3240 2738 2.0833333333333329e-03 3240 2731 8.3333333333333315e-03 3240 2735 -2.0833333333333337e-03 3240 2734 2.0833333333333333e-03 3240 3304 -2.0833333333333333e-03 3240 3236 8.3333333333333315e-03 3240 2684 8.3333333333333315e-03 3240 2676 -2.0833333333333337e-03 3240 2692 2.0833333333333329e-03 3241 3241 2.4999999999999998e-02 3241 2596 -1.0416666666666664e-03 3241 3579 1.0254392617697373e-19 3241 2601 -2.0833333333333329e-03 3241 3237 -2.0833333333333337e-03 3241 3236 6.0159191589756597e-20 3241 2700 -1.0416666666666664e-03 3241 2699 -2.0833333333333329e-03 3242 3242 2.0833333333333332e-02 3243 3243 2.0833333333333332e-02 3244 3244 4.1666666666666657e-02 3244 2694 5.0116116045879435e-20 3244 2595 -2.0833333333333329e-03 3244 3232 -2.0833333333333337e-03 3244 3227 8.3333333333333315e-03 3244 2677 -9.3750000000000014e-03 3244 2675 -2.0833333333333333e-03 3244 2693 1.0416666666666671e-03 3244 3175 -1.0416666666666668e-02 3244 3174 1.5502688168223823e-19 3244 2593 -9.3749999999999997e-03 3244 2589 2.1705219273391446e-19 3244 2592 1.0416666666666669e-03 3245 3245 2.4999999999999998e-02 3245 2676 -1.0416666666666664e-03 3245 3239 -2.0833333333333337e-03 3245 3236 6.0159191589756597e-20 3245 2596 -1.0416666666666662e-03 3245 2593 -6.2500000000000003e-03 3245 2602 -1.0416666666666664e-03 3245 2601 -2.0833333333333329e-03 3245 3246 2.0833333333333337e-03 3245 3572 -1.0254392617697373e-19 3245 2677 -6.2500000000000003e-03 3245 2691 -1.0416666666666664e-03 3245 2692 -2.0833333333333329e-03 3246 3246 4.1666666666666664e-02 3246 2690 -2.0833333333333329e-03 3246 3247 2.0833333333333337e-03 3246 3568 8.3333333333333315e-03 3246 2605 -2.0833333333333333e-03 3246 2593 -8.3333333333333315e-03 3246 2602 2.0833333333333337e-03 3246 2601 -2.0833333333333329e-03 3246 3245 2.0833333333333337e-03 3246 3572 -8.3333333333333315e-03 3246 2677 -8.3333333333333315e-03 3246 2691 2.0833333333333337e-03 3246 2692 -2.0833333333333333e-03 3247 3247 2.4999999999999998e-02 3247 2589 -1.0416666666666664e-03 3247 3175 -2.0833333333333337e-03 3247 3176 6.0159191589756597e-20 3247 2694 -1.0416666666666662e-03 3247 2677 -6.2500000000000003e-03 3247 2691 -1.0416666666666664e-03 3247 2690 -2.0833333333333329e-03 3247 3246 2.0833333333333337e-03 3247 3568 1.0254392617697373e-19 3247 2593 -6.2500000000000003e-03 3247 2602 -1.0416666666666664e-03 3247 2605 -2.0833333333333329e-03 3248 3248 2.0833333333333332e-02 3249 3249 4.1666666666666657e-02 3249 2500 -4.1666666666666657e-03 3249 3225 2.0833333333333329e-03 3249 3227 4.1666666666666666e-03 3249 2595 1.4973071994693204e-20 3249 2505 -1.0416666666666671e-03 3249 2875 6.2499999999999995e-03 3249 3486 -8.1315162936412833e-20 3249 2592 1.0416666666666671e-03 3250 3250 2.0833333333333332e-02 3251 3251 2.4999999999999991e-02 3252 3252 2.0833333333333332e-02 3253 3253 9.1666666666666646e-02 3253 2411 -3.1249999999999997e-03 3253 2423 5.2083333333333322e-03 3253 3060 4.1666666666666666e-03 3253 3065 -1.2499999999999999e-02 3253 2404 -3.1249999999999997e-03 3253 2416 2.0833333333333342e-03 3253 2407 -1.6666666666666666e-02 3253 2681 -1.0416666666666669e-03 3253 2572 -1.0416666666666669e-03 3253 3266 -8.3333333333333315e-03 3253 3260 1.3552527156068805e-20 3253 2680 -1.0416666666666667e-03 3253 2679 6.2500000000000003e-03 3253 2678 -4.1666666666666666e-03 3253 3265 -8.3333333333333315e-03 3253 3259 2.7105054312137611e-20 3253 2431 -1.0416666666666667e-03 3253 2426 1.0416666666666666e-02 3253 2433 -4.1666666666666657e-03 3253 3262 -4.1666666666666657e-03 3253 3254 1.2499999999999997e-02 3253 2567 5.2083333333333330e-03 3253 2566 1.0416666666666664e-02 3253 2565 -4.1666666666666675e-03 3254 3254 5.8333333333333320e-02 3254 2752 -1.0416666666666669e-03 3254 2409 -1.0416666666666669e-03 3254 3278 -8.3333333333333315e-03 3254 3255 1.3552527156068805e-20 3254 2760 -1.0416666666666667e-03 3254 2763 6.2500000000000003e-03 3254 2750 -4.1666666666666666e-03 3254 3280 -8.3333333333333315e-03 3254 3257 1.3552527156068805e-20 3254 2581 -1.0416666666666667e-03 3254 2411 4.1666666666666666e-03 3254 2416 1.0416666666666664e-03 3254 2407 -4.1666666666666657e-03 3254 3262 -2.0833333333333329e-03 3254 3253 1.2499999999999997e-02 3254 2567 1.0416666666666666e-02 3254 2566 5.2083333333333330e-03 3254 2565 -4.1666666666666675e-03 3255 3255 2.5000000000000001e-02 3255 2411 1.0416666666666664e-03 3255 3278 2.0833333333333337e-03 3255 3254 -1.0254392617697373e-19 3255 2763 1.0416666666666664e-03 3255 2760 6.2500000000000003e-03 3255 2759 1.0416666666666664e-03 3255 2750 2.0833333333333329e-03 3255 3218 2.0833333333333337e-03 3255 3217 -6.0159191589756597e-20 3255 2409 6.2500000000000003e-03 3255 2408 1.0416666666666664e-03 3255 2407 2.0833333333333329e-03 3256 3256 6.6666666666666652e-02 3256 2581 -1.0416666666666669e-03 3256 2680 -1.0416666666666669e-03 3256 3273 8.3333333333333315e-03 3256 3260 2.7105054312137611e-20 3256 2572 -1.0416666666666667e-03 3256 2580 6.2500000000000003e-03 3256 2565 -4.1666666666666666e-03 3256 2643 -1.0416666666666669e-03 3256 2754 -1.0416666666666669e-03 3256 3314 -8.3333333333333315e-03 3256 3261 2.7105054312137611e-20 3256 2645 -1.0416666666666667e-03 3256 2644 6.2500000000000003e-03 3256 2642 -4.1666666666666666e-03 3256 3315 -8.3333333333333315e-03 3256 3258 2.7105054312137611e-20 3256 2686 -1.0416666666666667e-03 3256 2685 6.2500000000000003e-03 3256 2678 -4.1666666666666666e-03 3256 3312 -8.3333333333333315e-03 3256 3257 2.7105054312137611e-20 3256 2752 -1.0416666666666667e-03 3256 2751 6.2500000000000003e-03 3256 2750 -4.1666666666666666e-03 3257 3257 2.4999999999999998e-02 3257 2580 1.0416666666666664e-03 3257 2763 1.0416666666666664e-03 3257 3280 2.0833333333333337e-03 3257 3254 -1.0254392617697373e-19 3257 2581 6.2500000000000003e-03 3257 2567 1.0416666666666664e-03 3257 2565 2.0833333333333329e-03 3257 3312 2.0833333333333337e-03 3257 3256 6.0159191589756597e-20 3257 2752 6.2500000000000003e-03 3257 2751 1.0416666666666662e-03 3257 2750 2.0833333333333329e-03 3258 3258 2.4999999999999998e-02 3258 2698 1.0416666666666664e-03 3258 2644 1.0416666666666664e-03 3258 3315 2.0833333333333337e-03 3258 3256 6.0159191589756597e-20 3258 2686 6.2500000000000003e-03 3258 2685 1.0416666666666662e-03 3258 2678 2.0833333333333329e-03 3258 3208 2.0833333333333337e-03 3258 3207 1.0254392617697373e-19 3258 2643 6.2500000000000003e-03 3258 2633 1.0416666666666664e-03 3258 2642 2.0833333333333329e-03 3259 3259 2.5000000000000001e-02 3259 2428 1.0416666666666664e-03 3259 3206 2.0833333333333337e-03 3259 3207 1.0254392617697373e-19 3259 2698 1.0416666666666664e-03 3259 2681 6.2500000000000003e-03 3259 2679 1.0416666666666664e-03 3259 2678 2.0833333333333329e-03 3259 3265 2.0833333333333337e-03 3259 3253 6.0159191589756597e-20 3259 2431 6.2500000000000003e-03 3259 2426 1.0416666666666664e-03 3259 2433 2.0833333333333329e-03 3260 3260 2.4999999999999998e-02 3260 2685 1.0416666666666664e-03 3260 3273 -2.0833333333333337e-03 3260 3256 6.0159191589756597e-20 3260 2580 1.0416666666666664e-03 3260 2572 6.2500000000000003e-03 3260 2566 1.0416666666666664e-03 3260 2565 2.0833333333333329e-03 3260 3266 2.0833333333333337e-03 3260 3253 -1.0254392617697373e-19 3260 2680 6.2500000000000003e-03 3260 2679 1.0416666666666664e-03 3260 2678 2.0833333333333329e-03 3261 3261 2.4999999999999998e-02 3261 2634 1.0416666666666664e-03 3261 3220 2.0833333333333337e-03 3261 3217 1.0254392617697373e-19 3261 2759 1.0416666666666664e-03 3261 2754 6.2500000000000003e-03 3261 2751 1.0416666666666664e-03 3261 2750 2.0833333333333329e-03 3261 3314 2.0833333333333337e-03 3261 3256 6.0159191589756597e-20 3261 2645 6.2500000000000003e-03 3261 2644 1.0416666666666664e-03 3261 2642 2.0833333333333329e-03 3262 3262 4.1666666666666657e-02 3262 2455 -5.2083333333333330e-03 3262 2569 -2.1684043449710089e-19 3262 3264 2.1684043449710089e-19 3262 2450 2.1684043449710089e-19 3262 2460 -6.2499999999999986e-03 3262 3279 -6.5052130349130266e-19 3262 2462 1.0416666666666673e-03 3262 3087 8.3333333333333332e-03 3262 3086 4.3368086899420177e-19 3262 2405 3.1249999999999997e-03 3262 2411 1.2499999999999997e-02 3262 2416 1.0416666666666660e-03 3262 2407 4.1666666666666666e-03 3262 3254 -2.0833333333333329e-03 3262 3253 -4.1666666666666666e-03 3262 2567 1.0416666666666673e-03 3262 2566 -1.0416666666666669e-03 3262 2565 -2.0761130467597592e-20 3263 3263 4.1666666666666657e-02 3263 2570 -2.7052114752934217e-20 3263 3487 -2.0833333333333329e-03 3263 3268 4.1666666666666657e-03 3263 2345 4.1666666666666657e-03 3263 2450 4.9904357809065860e-20 3263 2337 3.1249999999999997e-03 3263 2343 1.2499999999999997e-02 3263 2344 1.0416666666666660e-03 3263 3115 -4.3368086899420177e-19 3263 2457 -5.2083333333333322e-03 3263 2460 -6.2499999999999986e-03 3263 3113 8.3333333333333332e-03 3263 2461 1.0416666666666664e-03 3263 3490 -1.6263032587282567e-19 3263 3264 2.7105054312137611e-20 3263 2569 3.2249014814734037e-20 3263 2568 1.0416666666666669e-03 3263 2566 -1.0416666666666669e-03 3264 3264 4.1666666666666664e-02 3264 2567 -5.0116116045879435e-20 3264 3279 1.0416666666666668e-02 3264 3262 3.1800793213478638e-19 3264 2462 2.1705219273391446e-19 3264 2450 1.0416666666666666e-02 3264 2460 -2.6946235634527430e-19 3264 2461 -2.1705219273391446e-19 3264 3490 1.0416666666666666e-02 3264 3263 -1.3753697481041702e-19 3264 2569 1.0416666666666668e-02 3264 2568 -2.1705219273391446e-19 3264 2566 -1.0116749763768550e-19 3265 3265 4.1666666666666664e-02 3265 2438 2.1705219273391446e-19 3265 3276 -1.0416666666666666e-02 3265 3267 2.6946235634527430e-19 3265 2693 -2.1705219273391446e-19 3265 2681 9.3749999999999979e-03 3265 2679 -1.0416666666666669e-03 3265 2678 2.0833333333333329e-03 3265 3259 2.0833333333333337e-03 3265 3253 -8.3333333333333315e-03 3265 2431 9.3749999999999997e-03 3265 2426 -1.0416666666666669e-03 3265 2433 2.0833333333333333e-03 3266 3266 4.5833333333333323e-02 3266 2693 5.2083333333333330e-03 3266 3274 -4.1666666666666675e-03 3266 3267 8.3333333333333332e-03 3266 2576 1.0416666666666664e-03 3266 2572 7.2916666666666659e-03 3266 2566 -4.3368086899420177e-19 3266 2565 2.0833333333333333e-03 3266 3260 2.0833333333333337e-03 3266 3253 -8.3333333333333315e-03 3266 2680 1.3541666666666664e-02 3266 2679 -4.3368086899420177e-19 3266 2678 2.0833333333333329e-03 3267 3267 4.1666666666666657e-02 3267 2680 5.2083333333333330e-03 3267 2431 2.1684043449710089e-19 3267 3265 2.3039296165316969e-19 3267 3276 8.1315162936412833e-20 3267 2681 4.9904357809065860e-20 3267 2679 -1.0416666666666669e-03 3267 2693 6.2499999999999995e-03 3267 3266 8.3333333333333332e-03 3267 3274 -4.3368086899420177e-19 3267 2572 -3.1249999999999997e-03 3267 2426 -1.0416666666666675e-03 3267 2427 2.1684043449710089e-19 3267 2438 1.0416666666666662e-03 3267 3268 -2.0833333333333329e-03 3267 3485 -4.1666666666666666e-03 3267 2566 -1.2499999999999999e-02 3267 2570 -4.1666666666666666e-03 3267 2576 -1.0416666666666654e-03 3268 3268 8.3333333333333315e-02 3268 2338 3.1249999999999997e-03 3268 2568 -5.2083333333333322e-03 3268 3263 4.1666666666666666e-03 3268 3487 -1.2499999999999999e-02 3268 2343 3.1249999999999997e-03 3268 2344 -2.0833333333333342e-03 3268 2345 1.6666666666666666e-02 3268 3269 4.1666666666666657e-03 3268 3423 1.2499999999999997e-02 3268 2420 -5.2083333333333330e-03 3268 2426 -1.4583333333333330e-02 3268 2427 4.1666666666666675e-03 3268 2438 -5.2083333333333330e-03 3268 3267 -2.0833333333333329e-03 3268 3485 1.2499999999999999e-02 3268 2566 -8.3333333333333332e-03 3268 2570 4.1666666666666666e-03 3268 2576 -1.0416666666666667e-03 3269 3269 4.1666666666666657e-02 3269 2345 4.1666666666666666e-03 3269 3423 2.0833333333333329e-03 3269 3268 4.1666666666666666e-03 3269 2427 2.1158177161623045e-20 3269 2457 -5.2083333333333330e-03 3269 2421 -2.1684043449710089e-19 3269 2420 1.0416666666666673e-03 3269 2426 -1.0416666666666667e-03 3269 3071 -6.5052130349130266e-19 3269 2442 2.1684043449710089e-19 3269 2460 -6.2499999999999986e-03 3269 3069 2.1684043449710089e-19 3269 2458 1.0416666666666673e-03 3269 3114 8.3333333333333315e-03 3269 2337 3.1249999999999997e-03 3269 2338 1.2499999999999997e-02 3269 2344 1.0416666666666662e-03 3270 3270 2.4999999999999998e-02 3270 2694 -1.0416666666666664e-03 3270 2577 -1.0416666666666664e-03 3270 3271 2.0833333333333337e-03 3270 3549 -1.0254392617697373e-19 3270 2680 -6.2500000000000003e-03 3270 2688 -1.0416666666666664e-03 3270 2690 -2.0833333333333329e-03 3270 3177 -2.0833333333333337e-03 3270 3176 6.0159191589756597e-20 3270 2572 -6.2500000000000003e-03 3270 2562 -1.0416666666666664e-03 3270 2571 -2.0833333333333329e-03 3271 3271 4.1666666666666664e-02 3271 2687 -2.0833333333333333e-03 3271 3272 2.0833333333333337e-03 3271 3539 8.3333333333333315e-03 3271 2579 -2.0833333333333329e-03 3271 2572 -8.3333333333333315e-03 3271 2577 2.0833333333333337e-03 3271 2571 -2.0833333333333333e-03 3271 3270 2.0833333333333337e-03 3271 3549 -8.3333333333333315e-03 3271 2680 -8.3333333333333315e-03 3271 2688 2.0833333333333337e-03 3271 2690 -2.0833333333333329e-03 3272 3272 2.4999999999999998e-02 3272 2688 -1.0416666666666664e-03 3272 3271 2.0833333333333337e-03 3272 3539 1.0254392617697373e-19 3272 2577 -1.0416666666666664e-03 3272 2572 -6.2500000000000003e-03 3272 2580 -1.0416666666666664e-03 3272 2579 -2.0833333333333329e-03 3272 3273 2.0833333333333337e-03 3272 3313 6.0159191589756597e-20 3272 2680 -6.2500000000000003e-03 3272 2685 -1.0416666666666664e-03 3272 2687 -2.0833333333333329e-03 3273 3273 4.1666666666666664e-02 3273 2678 -2.0833333333333333e-03 3273 3260 -2.0833333333333333e-03 3273 3256 8.3333333333333315e-03 3273 2565 -2.0833333333333329e-03 3273 2572 -8.3333333333333315e-03 3273 2580 2.0833333333333337e-03 3273 2579 -2.0833333333333333e-03 3273 3272 2.0833333333333333e-03 3273 3313 -8.3333333333333315e-03 3273 2680 -8.3333333333333315e-03 3273 2685 2.0833333333333337e-03 3273 2687 -2.0833333333333329e-03 3274 3274 3.3333333333333326e-02 3274 2679 4.0939925783957855e-21 3274 3266 -4.1666666666666675e-03 3274 3267 -4.3368086899420177e-19 3274 2566 -4.1666666666666666e-03 3274 2572 -1.6666666666666663e-02 3274 2562 -4.1666666666666657e-03 3274 2576 -6.2499999999999986e-03 3274 3177 -4.1666666666666666e-03 3274 3174 4.3368086899420177e-19 3274 2680 -4.1666666666666675e-03 3274 2694 1.6284208410963924e-19 3274 2693 -6.2499999999999986e-03 3275 3275 4.1666666666666664e-02 3275 2698 5.0116116045879435e-20 3275 2440 -2.0833333333333329e-03 3275 3234 -2.0833333333333333e-03 3275 3230 8.3333333333333315e-03 3275 2681 -9.3750000000000014e-03 3275 2675 -2.0833333333333333e-03 3275 2697 1.0416666666666671e-03 3275 3206 -1.0416666666666668e-02 3275 3205 -8.8991399020904929e-20 3275 2431 -9.3750000000000014e-03 3275 2428 2.1705219273391446e-19 3275 2430 1.0416666666666667e-03 3276 3276 4.1666666666666657e-02 3276 2675 -2.0833333333333329e-03 3276 3234 -2.0833333333333333e-03 3276 3227 8.3333333333333315e-03 3276 2440 -2.0833333333333333e-03 3276 2431 -9.3749999999999997e-03 3276 2426 5.0116116045879435e-20 3276 2438 1.0416666666666669e-03 3276 3265 -1.0416666666666668e-02 3276 3267 1.5502688168223823e-19 3276 2681 -9.3750000000000014e-03 3276 2679 2.1705219273391446e-19 3276 2693 1.0416666666666667e-03 3277 3277 6.6666666666666652e-02 3277 2450 1.0416666666666669e-03 3277 2405 1.0416666666666669e-03 3277 3087 -8.3333333333333315e-03 3277 3082 1.3552527156068805e-20 3277 2455 1.0416666666666667e-03 3277 2462 -6.2500000000000003e-03 3277 2449 4.1666666666666666e-03 3277 3279 8.3333333333333315e-03 3277 3493 1.3552527156068805e-20 3277 2569 1.0416666666666667e-03 3277 2760 1.0416666666666669e-03 3277 2581 1.0416666666666669e-03 3277 2567 -6.2500000000000003e-03 3277 2583 4.1666666666666666e-03 3277 3280 8.3333333333333315e-03 3277 3600 1.3552527156068805e-20 3277 2752 1.0416666666666667e-03 3277 2763 -6.2500000000000003e-03 3277 2765 4.1666666666666666e-03 3277 3278 8.3333333333333315e-03 3277 3325 -1.3552527156068805e-20 3277 2409 1.0416666666666667e-03 3277 2411 -6.2500000000000003e-03 3277 2410 4.1666666666666666e-03 3278 3278 4.1666666666666664e-02 3278 2765 2.0833333333333329e-03 3278 2407 2.0833333333333329e-03 3278 3255 2.0833333333333337e-03 3278 3254 -8.3333333333333315e-03 3278 2760 8.3333333333333315e-03 3278 2763 -2.0833333333333333e-03 3278 2750 2.0833333333333333e-03 3278 3325 2.0833333333333337e-03 3278 3277 8.3333333333333315e-03 3278 2409 8.3333333333333315e-03 3278 2411 -2.0833333333333333e-03 3278 2410 2.0833333333333333e-03 3279 3279 4.1666666666666657e-02 3279 2449 2.0833333333333329e-03 3279 3493 -2.0833333333333337e-03 3279 3277 8.3333333333333315e-03 3279 2583 2.0833333333333333e-03 3279 2569 9.3749999999999997e-03 3279 2567 -1.0416666666666667e-03 3279 2566 2.1705219273391446e-19 3279 3264 1.0416666666666668e-02 3279 2450 9.3749999999999979e-03 3279 2460 -5.0116116045879435e-20 3279 3262 -4.6263880787845817e-19 3279 2462 -1.0416666666666664e-03 3280 3280 4.1666666666666664e-02 3280 2583 2.0833333333333329e-03 3280 3600 -2.0833333333333337e-03 3280 3277 8.3333333333333315e-03 3280 2765 2.0833333333333333e-03 3280 2752 8.3333333333333315e-03 3280 2763 -2.0833333333333337e-03 3280 2750 2.0833333333333329e-03 3280 3257 2.0833333333333337e-03 3280 3254 -8.3333333333333315e-03 3280 2581 8.3333333333333315e-03 3280 2567 -2.0833333333333337e-03 3280 2565 2.0833333333333333e-03 3281 3281 5.8333333333333320e-02 3281 2722 5.2083333333333322e-03 3281 3308 2.0833333333333329e-03 3281 3287 1.2499999999999999e-02 3281 2721 1.0416666666666667e-03 3281 2728 -4.1666666666666657e-03 3281 3292 1.3552527156068805e-20 3281 2739 -4.1666666666666666e-03 3281 3282 1.3552527156068805e-20 3281 2710 -4.1666666666666675e-03 3282 3282 2.4999999999999998e-02 3282 3283 6.0159191589756597e-20 3282 2739 2.0833333333333329e-03 3282 3281 -1.0254392617697373e-19 3282 2710 2.0833333333333329e-03 3283 3283 6.6666666666666652e-02 3283 3282 2.7105054312137611e-20 3283 2739 -4.1666666666666666e-03 3283 3286 2.7105054312137611e-20 3283 2929 -4.1666666666666666e-03 3283 3294 2.7105054312137611e-20 3283 2954 -4.1666666666666666e-03 3283 3284 2.7105054312137611e-20 3283 2710 -4.1666666666666666e-03 3284 3284 2.4999999999999998e-02 3284 2718 1.0416666666666664e-03 3284 3529 2.0833333333333337e-03 3284 3288 -1.0254392617697373e-19 3284 2965 1.0416666666666664e-03 3284 2954 2.0833333333333329e-03 3284 3283 6.0159191589756597e-20 3284 2710 2.0833333333333329e-03 3285 3285 6.6666666666666652e-02 3285 2689 -1.0416666666666669e-03 3285 3300 -8.3333333333333315e-03 3285 3293 2.7105054312137611e-20 3285 2919 -1.0416666666666667e-03 3285 2927 6.2500000000000003e-03 3285 2929 -4.1666666666666666e-03 3285 2731 -1.0416666666666669e-03 3285 3298 -8.3333333333333315e-03 3285 3292 2.7105054312137611e-20 3285 2729 6.2500000000000003e-03 3285 2728 -4.1666666666666666e-03 3285 3299 -8.3333333333333315e-03 3285 3291 1.3552527156068805e-20 3285 2684 -1.0416666666666667e-03 3285 2683 6.2500000000000003e-03 3285 2682 -4.1666666666666666e-03 3285 3296 -8.3333333333333315e-03 3285 3286 1.3552527156068805e-20 3285 2740 6.2500000000000003e-03 3285 2739 -4.1666666666666666e-03 3286 3286 2.4999999999999998e-02 3286 2927 1.0416666666666664e-03 3286 3283 6.0159191589756597e-20 3286 2929 2.0833333333333329e-03 3286 3296 2.0833333333333337e-03 3286 3285 -1.0254392617697373e-19 3286 2740 1.0416666666666664e-03 3286 2739 2.0833333333333329e-03 3287 3287 9.1666666666666660e-02 3287 2718 -3.1249999999999997e-03 3287 3308 4.1666666666666666e-03 3287 3281 1.2499999999999999e-02 3287 2721 2.0833333333333342e-03 3287 2710 -1.6666666666666666e-02 3287 2684 -1.0416666666666669e-03 3287 2643 -1.0416666666666669e-03 3287 3321 8.3333333333333315e-03 3287 3295 2.7105054312137611e-20 3287 2686 -1.0416666666666667e-03 3287 2696 6.2500000000000003e-03 3287 2682 -4.1666666666666666e-03 3287 3305 8.3333333333333315e-03 3287 3291 2.7105054312137611e-20 3287 2731 -1.0416666666666667e-03 3287 2722 1.0416666666666666e-02 3287 2728 -4.1666666666666666e-03 3287 3515 -4.1666666666666657e-03 3287 3288 1.2499999999999997e-02 3287 2641 5.2083333333333330e-03 3287 2636 1.0416666666666666e-02 3287 2640 -4.1666666666666675e-03 3288 3288 5.8333333333333320e-02 3288 2955 -1.0416666666666669e-03 3288 3529 -8.3333333333333315e-03 3288 3284 1.3552527156068805e-20 3288 2965 6.2500000000000003e-03 3288 2954 -4.1666666666666666e-03 3288 3531 -8.3333333333333315e-03 3288 3290 2.7105054312137611e-20 3288 2649 -1.0416666666666667e-03 3288 2718 4.1666666666666666e-03 3288 2721 1.0416666666666664e-03 3288 2710 -4.1666666666666657e-03 3288 3515 -2.0833333333333329e-03 3288 3287 1.2499999999999997e-02 3288 2641 1.0416666666666666e-02 3288 2636 5.2083333333333330e-03 3288 2640 -4.1666666666666675e-03 3289 3289 6.6666666666666652e-02 3289 2649 -1.0416666666666669e-03 3289 2686 -1.0416666666666669e-03 3289 3324 8.3333333333333315e-03 3289 3295 1.3552527156068805e-20 3289 2643 -1.0416666666666667e-03 3289 2648 6.2500000000000003e-03 3289 2640 -4.1666666666666666e-03 3289 2919 -1.0416666666666669e-03 3289 3608 -8.3333333333333315e-03 3289 3294 1.3552527156068805e-20 3289 2930 6.2500000000000003e-03 3289 2929 -4.1666666666666666e-03 3289 3559 8.3333333333333315e-03 3289 3293 1.3552527156068805e-20 3289 2689 -1.0416666666666667e-03 3289 2695 6.2500000000000003e-03 3289 2682 -4.1666666666666666e-03 3289 3609 -8.3333333333333315e-03 3289 3290 1.3552527156068805e-20 3289 2955 -1.0416666666666667e-03 3289 2952 6.2500000000000003e-03 3289 2954 -4.1666666666666666e-03 3290 3290 2.4999999999999998e-02 3290 2648 1.0416666666666664e-03 3290 2965 1.0416666666666664e-03 3290 3531 2.0833333333333337e-03 3290 3288 6.0159191589756597e-20 3290 2649 6.2500000000000003e-03 3290 2641 1.0416666666666664e-03 3290 2640 2.0833333333333329e-03 3290 3609 2.0833333333333337e-03 3290 3289 -1.0254392617697373e-19 3290 2955 6.2500000000000003e-03 3290 2952 1.0416666666666664e-03 3290 2954 2.0833333333333329e-03 3291 3291 2.4999999999999998e-02 3291 2696 1.0416666666666664e-03 3291 3305 -2.0833333333333337e-03 3291 3287 6.0159191589756597e-20 3291 2722 1.0416666666666664e-03 3291 2731 6.2500000000000003e-03 3291 2729 1.0416666666666664e-03 3291 2728 2.0833333333333329e-03 3291 3299 2.0833333333333337e-03 3291 3285 -1.0254392617697373e-19 3291 2684 6.2500000000000003e-03 3291 2683 1.0416666666666664e-03 3291 2682 2.0833333333333329e-03 3292 3292 2.5000000000000001e-02 3292 3281 -1.0254392617697373e-19 3292 2740 1.0416666666666664e-03 3292 2739 2.0833333333333329e-03 3292 3298 2.0833333333333337e-03 3292 3285 6.0159191589756597e-20 3292 2729 1.0416666666666664e-03 3292 2728 2.0833333333333329e-03 3293 3293 2.5000000000000001e-02 3293 2683 1.0416666666666664e-03 3293 3300 2.0833333333333337e-03 3293 3285 6.0159191589756597e-20 3293 2927 1.0416666666666664e-03 3293 2919 6.2500000000000003e-03 3293 2930 1.0416666666666664e-03 3293 2929 2.0833333333333329e-03 3293 3559 -2.0833333333333337e-03 3293 3289 -1.0254392617697373e-19 3293 2689 6.2500000000000003e-03 3293 2695 1.0416666666666664e-03 3293 2682 2.0833333333333329e-03 3294 3294 2.4999999999999998e-02 3294 3283 6.0159191589756597e-20 3294 2952 1.0416666666666664e-03 3294 2954 2.0833333333333329e-03 3294 3608 2.0833333333333337e-03 3294 3289 -1.0254392617697373e-19 3294 2930 1.0416666666666664e-03 3294 2929 2.0833333333333329e-03 3295 3295 2.4999999999999998e-02 3295 2695 1.0416666666666664e-03 3295 3324 -2.0833333333333337e-03 3295 3289 -1.0254392617697373e-19 3295 2648 1.0416666666666664e-03 3295 2643 6.2500000000000003e-03 3295 2636 1.0416666666666664e-03 3295 2640 2.0833333333333329e-03 3295 3321 -2.0833333333333337e-03 3295 3287 6.0159191589756597e-20 3295 2686 6.2500000000000003e-03 3295 2696 1.0416666666666662e-03 3295 2682 2.0833333333333329e-03 3296 3296 4.1666666666666664e-02 3296 2929 2.0833333333333333e-03 3296 2742 2.0833333333333333e-03 3296 3586 2.0833333333333337e-03 3296 3297 8.3333333333333315e-03 3296 2927 -2.0833333333333337e-03 3296 2925 2.0833333333333329e-03 3296 3286 2.0833333333333337e-03 3296 3285 -8.3333333333333315e-03 3296 2740 -2.0833333333333337e-03 3296 2739 2.0833333333333329e-03 3297 3297 6.6666666666666652e-02 3297 2684 1.0416666666666669e-03 3297 3299 8.3333333333333315e-03 3297 3304 1.3552527156068805e-20 3297 2731 1.0416666666666667e-03 3297 2729 -6.2500000000000003e-03 3297 2734 4.1666666666666666e-03 3297 2919 1.0416666666666669e-03 3297 3296 8.3333333333333315e-03 3297 3586 -1.3552527156068805e-20 3297 2927 -6.2500000000000003e-03 3297 2925 4.1666666666666666e-03 3297 3300 8.3333333333333315e-03 3297 3558 2.7105054312137611e-20 3297 2689 1.0416666666666667e-03 3297 2683 -6.2500000000000003e-03 3297 2692 4.1666666666666666e-03 3297 3298 8.3333333333333315e-03 3297 3301 2.7105054312137611e-20 3297 2740 -6.2500000000000003e-03 3297 2742 4.1666666666666666e-03 3298 3298 4.1666666666666664e-02 3298 2734 2.0833333333333329e-03 3298 2739 2.0833333333333329e-03 3298 3292 2.0833333333333337e-03 3298 3285 -8.3333333333333315e-03 3298 2729 -2.0833333333333337e-03 3298 2728 2.0833333333333333e-03 3298 3301 -2.0833333333333337e-03 3298 3297 8.3333333333333315e-03 3298 2740 -2.0833333333333337e-03 3298 2742 2.0833333333333333e-03 3299 3299 4.1666666666666664e-02 3299 2692 2.0833333333333333e-03 3299 3304 -2.0833333333333337e-03 3299 3297 8.3333333333333315e-03 3299 2734 2.0833333333333329e-03 3299 2731 8.3333333333333315e-03 3299 2729 -2.0833333333333337e-03 3299 2728 2.0833333333333333e-03 3299 3291 2.0833333333333337e-03 3299 3285 -8.3333333333333315e-03 3299 2684 8.3333333333333315e-03 3299 2683 -2.0833333333333337e-03 3299 2682 2.0833333333333329e-03 3300 3300 4.1666666666666664e-02 3300 2682 2.0833333333333329e-03 3300 3293 2.0833333333333337e-03 3300 3285 -8.3333333333333315e-03 3300 2929 2.0833333333333333e-03 3300 2919 8.3333333333333315e-03 3300 2927 -2.0833333333333337e-03 3300 2925 2.0833333333333329e-03 3300 3558 -2.0833333333333337e-03 3300 3297 8.3333333333333315e-03 3300 2689 8.3333333333333315e-03 3300 2683 -2.0833333333333337e-03 3300 2692 2.0833333333333333e-03 3301 3301 2.4999999999999998e-02 3301 2729 -1.0416666666666664e-03 3301 3583 1.0254392617697373e-19 3301 2734 -2.0833333333333329e-03 3301 3298 -2.0833333333333337e-03 3301 3297 6.0159191589756597e-20 3301 2740 -1.0416666666666664e-03 3301 2742 -2.0833333333333329e-03 3302 3302 2.0833333333333332e-02 3303 3303 2.0833333333333332e-02 3304 3304 2.4999999999999998e-02 3304 2683 -1.0416666666666664e-03 3304 3299 -2.0833333333333337e-03 3304 3297 -1.0254392617697373e-19 3304 2729 -1.0416666666666664e-03 3304 2731 -6.2500000000000003e-03 3304 2735 -1.0416666666666664e-03 3304 2734 -2.0833333333333329e-03 3304 3240 -2.0833333333333337e-03 3304 3236 6.0159191589756597e-20 3304 2684 -6.2500000000000003e-03 3304 2676 -1.0416666666666664e-03 3304 2692 -2.0833333333333329e-03 3305 3305 4.1666666666666657e-02 3305 2732 -2.1705219273391446e-19 3305 3306 1.0416666666666666e-02 3305 3502 2.6946235634527430e-19 3305 2697 2.1705219273391446e-19 3305 2684 -9.3749999999999997e-03 3305 2696 1.0416666666666669e-03 3305 2682 -2.0833333333333333e-03 3305 3291 -2.0833333333333333e-03 3305 3287 8.3333333333333315e-03 3305 2731 -9.3749999999999997e-03 3305 2722 1.0416666666666673e-03 3305 2728 -2.0833333333333329e-03 3306 3306 4.1666666666666657e-02 3306 2675 -2.0833333333333329e-03 3306 3235 -2.0833333333333333e-03 3306 3230 8.3333333333333315e-03 3306 2738 -2.0833333333333329e-03 3306 2731 -9.3750000000000014e-03 3306 2722 -5.0116116045879435e-20 3306 2732 1.0416666666666671e-03 3306 3305 1.0416666666666668e-02 3306 3502 -1.5502688168223823e-19 3306 2684 -9.3750000000000014e-03 3306 2696 2.1705219273391446e-19 3306 2697 1.0416666666666669e-03 3307 3307 2.0833333333333332e-02 3308 3308 4.1666666666666657e-02 3308 2728 2.7052114752934217e-20 3308 3281 2.0833333333333329e-03 3308 3287 4.1666666666666666e-03 3308 2710 -4.1666666666666666e-03 3308 2721 -1.0416666666666660e-03 3308 3518 -4.3368086899420177e-19 3308 2896 6.2499999999999986e-03 3308 3514 -2.7105054312137611e-20 3308 2722 1.0416666666666667e-03 3309 3309 2.0833333333333329e-02 3310 3310 2.4999999999999994e-02 3311 3311 2.0833333333333332e-02 3312 3312 4.1666666666666664e-02 3312 2565 2.0833333333333333e-03 3312 2753 2.0833333333333333e-03 3312 3547 2.0833333333333337e-03 3312 3313 8.3333333333333315e-03 3312 2581 8.3333333333333315e-03 3312 2580 -2.0833333333333337e-03 3312 2579 2.0833333333333329e-03 3312 3257 2.0833333333333337e-03 3312 3256 -8.3333333333333315e-03 3312 2752 8.3333333333333315e-03 3312 2751 -2.0833333333333337e-03 3312 2750 2.0833333333333329e-03 3313 3313 6.6666666666666652e-02 3313 2645 1.0416666666666669e-03 3313 2686 1.0416666666666669e-03 3313 3315 8.3333333333333315e-03 3313 3323 2.7105054312137611e-20 3313 2643 1.0416666666666667e-03 3313 2644 -6.2500000000000003e-03 3313 2647 4.1666666666666666e-03 3313 2572 1.0416666666666669e-03 3313 2752 1.0416666666666669e-03 3313 3312 8.3333333333333315e-03 3313 3547 -2.7105054312137611e-20 3313 2581 1.0416666666666667e-03 3313 2580 -6.2500000000000003e-03 3313 2579 4.1666666666666666e-03 3313 3273 -8.3333333333333315e-03 3313 3272 2.7105054312137611e-20 3313 2680 1.0416666666666667e-03 3313 2685 -6.2500000000000003e-03 3313 2687 4.1666666666666666e-03 3313 3314 8.3333333333333315e-03 3313 3316 2.7105054312137611e-20 3313 2754 1.0416666666666667e-03 3313 2751 -6.2500000000000003e-03 3313 2753 4.1666666666666666e-03 3314 3314 4.1666666666666664e-02 3314 2647 2.0833333333333333e-03 3314 2750 2.0833333333333333e-03 3314 3261 2.0833333333333333e-03 3314 3256 -8.3333333333333315e-03 3314 2645 8.3333333333333315e-03 3314 2644 -2.0833333333333337e-03 3314 2642 2.0833333333333329e-03 3314 3316 -2.0833333333333333e-03 3314 3313 8.3333333333333315e-03 3314 2754 8.3333333333333315e-03 3314 2751 -2.0833333333333337e-03 3314 2753 2.0833333333333329e-03 3315 3315 4.1666666666666664e-02 3315 2687 2.0833333333333333e-03 3315 3323 -2.0833333333333337e-03 3315 3313 8.3333333333333315e-03 3315 2647 2.0833333333333329e-03 3315 2643 8.3333333333333315e-03 3315 2644 -2.0833333333333337e-03 3315 2642 2.0833333333333333e-03 3315 3258 2.0833333333333337e-03 3315 3256 -8.3333333333333315e-03 3315 2686 8.3333333333333315e-03 3315 2685 -2.0833333333333337e-03 3315 2678 2.0833333333333329e-03 3316 3316 2.4999999999999998e-02 3316 2644 -1.0416666666666664e-03 3316 2764 -1.0416666666666664e-03 3316 3319 2.0833333333333337e-03 3316 3543 1.0254392617697373e-19 3316 2645 -6.2500000000000003e-03 3316 2650 -1.0416666666666664e-03 3316 2647 -2.0833333333333329e-03 3316 3314 -2.0833333333333337e-03 3316 3313 6.0159191589756597e-20 3316 2754 -6.2500000000000003e-03 3316 2751 -1.0416666666666664e-03 3316 2753 -2.0833333333333329e-03 3317 3317 2.4999999999999998e-02 3317 2659 -1.0416666666666664e-03 3317 2759 -1.0416666666666664e-03 3317 3220 -2.0833333333333337e-03 3317 3219 -1.0254392617697373e-19 3317 2645 -6.2500000000000003e-03 3317 2634 -1.0416666666666664e-03 3317 2651 -2.0833333333333329e-03 3317 3318 2.0833333333333337e-03 3317 3662 -6.0159191589756597e-20 3317 2754 -6.2500000000000003e-03 3317 2758 -1.0416666666666664e-03 3317 2757 -2.0833333333333329e-03 3318 3318 4.1666666666666664e-02 3318 2651 -2.0833333333333333e-03 3318 2766 -2.0833333333333333e-03 3318 3320 2.0833333333333333e-03 3318 3692 8.3333333333333315e-03 3318 2645 -8.3333333333333315e-03 3318 2659 2.0833333333333337e-03 3318 2658 -2.0833333333333329e-03 3318 3317 2.0833333333333333e-03 3318 3662 8.3333333333333315e-03 3318 2754 -8.3333333333333315e-03 3318 2758 2.0833333333333337e-03 3318 2757 -2.0833333333333329e-03 3319 3319 4.1666666666666664e-02 3319 2658 -2.0833333333333333e-03 3319 3320 2.0833333333333337e-03 3319 3622 -8.3333333333333315e-03 3319 2766 -2.0833333333333329e-03 3319 2754 -8.3333333333333315e-03 3319 2764 2.0833333333333337e-03 3319 2753 -2.0833333333333333e-03 3319 3316 2.0833333333333337e-03 3319 3543 8.3333333333333315e-03 3319 2645 -8.3333333333333315e-03 3319 2650 2.0833333333333337e-03 3319 2647 -2.0833333333333329e-03 3320 3320 2.4999999999999998e-02 3320 2650 -1.0416666666666664e-03 3320 3319 2.0833333333333337e-03 3320 3622 -1.0254392617697373e-19 3320 2764 -1.0416666666666664e-03 3320 2754 -6.2500000000000003e-03 3320 2758 -1.0416666666666664e-03 3320 2766 -2.0833333333333329e-03 3320 3318 2.0833333333333337e-03 3320 3692 -6.0159191589756597e-20 3320 2645 -6.2500000000000003e-03 3320 2659 -1.0416666666666664e-03 3320 2658 -2.0833333333333329e-03 3321 3321 4.5833333333333323e-02 3321 2697 -5.2083333333333330e-03 3321 3322 4.1666666666666675e-03 3321 3502 8.3333333333333315e-03 3321 2646 -1.0416666666666664e-03 3321 2643 -7.2916666666666659e-03 3321 2636 2.1684043449710089e-19 3321 2640 -2.0833333333333333e-03 3321 3295 -2.0833333333333337e-03 3321 3287 8.3333333333333315e-03 3321 2686 -1.3541666666666664e-02 3321 2696 4.3368086899420177e-19 3321 2682 -2.0833333333333329e-03 3322 3322 3.3333333333333326e-02 3322 2696 -4.0939925783957855e-21 3322 3321 4.1666666666666675e-03 3322 3502 4.3368086899420177e-19 3322 2636 -4.1666666666666666e-03 3322 2643 -1.6666666666666663e-02 3322 2633 -4.1666666666666657e-03 3322 2646 -6.2499999999999986e-03 3322 3208 -4.1666666666666675e-03 3322 3205 8.6736173798840355e-19 3322 2686 -4.1666666666666675e-03 3322 2698 1.6284208410963924e-19 3322 2697 -6.2499999999999986e-03 3323 3323 2.4999999999999998e-02 3323 2685 -1.0416666666666664e-03 3323 3315 -2.0833333333333337e-03 3323 3313 6.0159191589756597e-20 3323 2644 -1.0416666666666662e-03 3323 2643 -6.2500000000000003e-03 3323 2648 -1.0416666666666664e-03 3323 2647 -2.0833333333333329e-03 3323 3324 2.0833333333333337e-03 3323 3541 1.0254392617697373e-19 3323 2686 -6.2500000000000003e-03 3323 2695 -1.0416666666666664e-03 3323 2687 -2.0833333333333329e-03 3324 3324 4.1666666666666664e-02 3324 2682 -2.0833333333333329e-03 3324 3295 -2.0833333333333337e-03 3324 3289 8.3333333333333315e-03 3324 2640 -2.0833333333333333e-03 3324 2643 -8.3333333333333315e-03 3324 2648 2.0833333333333337e-03 3324 2647 -2.0833333333333329e-03 3324 3323 2.0833333333333337e-03 3324 3541 8.3333333333333315e-03 3324 2686 -8.3333333333333315e-03 3324 2695 2.0833333333333337e-03 3324 2687 -2.0833333333333333e-03 3325 3325 2.5000000000000001e-02 3325 2409 6.2500000000000003e-03 3325 2410 2.0833333333333329e-03 3325 2760 6.2500000000000003e-03 3325 2765 2.0833333333333329e-03 3325 2763 1.0416666666666664e-03 3325 3278 2.0833333333333337e-03 3325 3277 1.0254392617697373e-19 3325 2411 1.0416666666666664e-03 3325 3778 1.0416666666666664e-03 3325 4864 2.0833333333333337e-03 3325 4865 -6.0159191589756597e-20 3325 3870 1.0416666666666664e-03 3326 3326 2.5000000000000001e-02 3326 2760 6.2500000000000003e-03 3326 2757 2.0833333333333329e-03 3326 2409 6.2500000000000003e-03 3326 2408 1.0416666666666664e-03 3326 3218 2.0833333333333337e-03 3326 3219 -6.0159191589756597e-20 3326 2759 1.0416666666666664e-03 3326 3871 1.0416666666666664e-03 3326 4866 -2.0833333333333337e-03 3326 4889 1.0254392617697373e-19 3326 3779 1.0416666666666664e-03 3326 288 2.0833333333333329e-03 3327 3327 6.6666666666666652e-02 3327 3332 2.7105054312137611e-20 3327 2982 -4.1666666666666666e-03 3327 3336 2.7105054312137611e-20 3327 2781 -4.1666666666666666e-03 3327 3338 2.7105054312137611e-20 3327 2797 -4.1666666666666666e-03 3327 3328 2.7105054312137611e-20 3327 2606 -4.1666666666666666e-03 3328 3328 2.4999999999999998e-02 3328 2609 1.0416666666666664e-03 3328 3193 2.0833333333333337e-03 3328 3191 1.0254392617697373e-19 3328 2806 1.0416666666666664e-03 3328 2797 2.0833333333333329e-03 3328 3327 6.0159191589756597e-20 3328 2606 2.0833333333333329e-03 3329 3329 6.6666666666666652e-02 3329 2578 -1.0416666666666669e-03 3329 2771 -1.0416666666666669e-03 3329 3346 -8.3333333333333315e-03 3329 3339 1.3552527156068805e-20 3329 2575 -1.0416666666666667e-03 3329 2586 6.2500000000000003e-03 3329 2573 -4.1666666666666666e-03 3329 2784 -1.0416666666666669e-03 3329 3344 -8.3333333333333315e-03 3329 3338 1.3552527156068805e-20 3329 2782 6.2500000000000003e-03 3329 2781 -4.1666666666666666e-03 3329 3345 -8.3333333333333315e-03 3329 3337 2.7105054312137611e-20 3329 2769 -1.0416666666666667e-03 3329 2768 6.2500000000000003e-03 3329 2767 -4.1666666666666666e-03 3329 3342 -8.3333333333333315e-03 3329 3330 2.7105054312137611e-20 3329 2796 -1.0416666666666667e-03 3329 2798 6.2500000000000003e-03 3329 2797 -4.1666666666666666e-03 3330 3330 2.4999999999999998e-02 3330 2586 1.0416666666666664e-03 3330 2806 1.0416666666666664e-03 3330 3194 2.0833333333333337e-03 3330 3191 1.0254392617697373e-19 3330 2578 6.2500000000000003e-03 3330 2563 1.0416666666666664e-03 3330 2573 2.0833333333333329e-03 3330 3342 2.0833333333333337e-03 3330 3329 6.0159191589756597e-20 3330 2796 6.2500000000000003e-03 3330 2798 1.0416666666666664e-03 3330 2797 2.0833333333333329e-03 3331 3331 6.6666666666666652e-02 3331 3187 -2.7105054312137611e-20 3331 2618 -4.1666666666666666e-03 3331 3334 1.3552527156068805e-20 3331 2973 -4.1666666666666666e-03 3331 3341 2.7105054312137611e-20 3331 2982 -4.1666666666666666e-03 3331 3332 1.3552527156068805e-20 3331 2606 -4.1666666666666666e-03 3332 3332 2.4999999999999998e-02 3332 3327 6.0159191589756597e-20 3332 2982 2.0833333333333329e-03 3332 3331 -1.0254392617697373e-19 3332 2606 2.0833333333333329e-03 3333 3333 6.6666666666666652e-02 3333 2776 -1.0416666666666669e-03 3333 3361 -8.3333333333333315e-03 3333 3340 2.7105054312137611e-20 3333 2971 -1.0416666666666667e-03 3333 2969 6.2500000000000003e-03 3333 2973 -4.1666666666666666e-03 3333 2575 -1.0416666666666669e-03 3333 2622 -1.0416666666666669e-03 3333 3196 8.3333333333333315e-03 3333 3197 -2.7105054312137611e-20 3333 2564 -1.0416666666666667e-03 3333 2574 6.2500000000000003e-03 3333 2573 -4.1666666666666666e-03 3333 3360 -8.3333333333333315e-03 3333 3339 2.7105054312137611e-20 3333 2771 -1.0416666666666667e-03 3333 2770 6.2500000000000003e-03 3333 2767 -4.1666666666666666e-03 3333 3358 -8.3333333333333315e-03 3333 3334 2.7105054312137611e-20 3333 2619 6.2500000000000003e-03 3333 2618 -4.1666666666666666e-03 3334 3334 2.4999999999999998e-02 3334 2969 1.0416666666666664e-03 3334 3331 -1.0254392617697373e-19 3334 2973 2.0833333333333329e-03 3334 3358 2.0833333333333337e-03 3334 3333 6.0159191589756597e-20 3334 2619 1.0416666666666664e-03 3334 2618 2.0833333333333329e-03 3335 3335 6.6666666666666652e-02 3335 2769 -1.0416666666666669e-03 3335 3351 8.3333333333333315e-03 3335 3337 1.3552527156068805e-20 3335 2784 -1.0416666666666667e-03 3335 2787 6.2500000000000003e-03 3335 2781 -4.1666666666666666e-03 3335 2971 -1.0416666666666669e-03 3335 3642 -8.3333333333333315e-03 3335 3341 1.3552527156068805e-20 3335 2974 6.2500000000000003e-03 3335 2973 -4.1666666666666666e-03 3335 3639 8.3333333333333315e-03 3335 3340 1.3552527156068805e-20 3335 2776 -1.0416666666666667e-03 3335 2777 6.2500000000000003e-03 3335 2767 -4.1666666666666666e-03 3335 3643 -8.3333333333333315e-03 3335 3336 1.3552527156068805e-20 3335 2980 6.2500000000000003e-03 3335 2982 -4.1666666666666666e-03 3336 3336 2.4999999999999998e-02 3336 2787 1.0416666666666664e-03 3336 3327 6.0159191589756597e-20 3336 2781 2.0833333333333329e-03 3336 3643 2.0833333333333337e-03 3336 3335 -1.0254392617697373e-19 3336 2980 1.0416666666666664e-03 3336 2982 2.0833333333333329e-03 3337 3337 2.5000000000000001e-02 3337 2777 1.0416666666666664e-03 3337 3351 -2.0833333333333337e-03 3337 3335 -1.0254392617697373e-19 3337 2787 1.0416666666666664e-03 3337 2784 6.2500000000000003e-03 3337 2782 1.0416666666666664e-03 3337 2781 2.0833333333333329e-03 3337 3345 2.0833333333333337e-03 3337 3329 6.0159191589756597e-20 3337 2769 6.2500000000000003e-03 3337 2768 1.0416666666666664e-03 3337 2767 2.0833333333333329e-03 3338 3338 2.4999999999999998e-02 3338 3327 6.0159191589756597e-20 3338 2798 1.0416666666666664e-03 3338 2797 2.0833333333333329e-03 3338 3344 2.0833333333333337e-03 3338 3329 -1.0254392617697373e-19 3338 2782 1.0416666666666664e-03 3338 2781 2.0833333333333329e-03 3339 3339 2.4999999999999998e-02 3339 2768 1.0416666666666664e-03 3339 3346 2.0833333333333337e-03 3339 3329 -1.0254392617697373e-19 3339 2586 1.0416666666666664e-03 3339 2575 6.2500000000000003e-03 3339 2574 1.0416666666666664e-03 3339 2573 2.0833333333333329e-03 3339 3360 2.0833333333333337e-03 3339 3333 6.0159191589756597e-20 3339 2771 6.2500000000000003e-03 3339 2770 1.0416666666666664e-03 3339 2767 2.0833333333333329e-03 3340 3340 2.4999999999999998e-02 3340 2770 1.0416666666666664e-03 3340 3361 2.0833333333333337e-03 3340 3333 6.0159191589756597e-20 3340 2969 1.0416666666666662e-03 3340 2971 6.2500000000000003e-03 3340 2974 1.0416666666666664e-03 3340 2973 2.0833333333333329e-03 3340 3639 -2.0833333333333337e-03 3340 3335 -1.0254392617697373e-19 3340 2776 6.2500000000000003e-03 3340 2777 1.0416666666666664e-03 3340 2767 2.0833333333333329e-03 3341 3341 2.5000000000000001e-02 3341 3331 6.0159191589756597e-20 3341 2980 1.0416666666666664e-03 3341 2982 2.0833333333333329e-03 3341 3642 2.0833333333333337e-03 3341 3335 -1.0254392617697373e-19 3341 2974 1.0416666666666664e-03 3341 2973 2.0833333333333329e-03 3342 3342 4.1666666666666664e-02 3342 2573 2.0833333333333329e-03 3342 2799 2.0833333333333329e-03 3342 3596 -2.0833333333333337e-03 3342 3343 8.3333333333333315e-03 3342 2578 8.3333333333333315e-03 3342 2586 -2.0833333333333337e-03 3342 2585 2.0833333333333333e-03 3342 3330 2.0833333333333337e-03 3342 3329 -8.3333333333333315e-03 3342 2796 8.3333333333333315e-03 3342 2798 -2.0833333333333337e-03 3342 2797 2.0833333333333333e-03 3343 3343 6.6666666666666652e-02 3343 2769 1.0416666666666669e-03 3343 3345 8.3333333333333315e-03 3343 3352 -2.7105054312137611e-20 3343 2784 1.0416666666666667e-03 3343 2782 -6.2500000000000003e-03 3343 2790 4.1666666666666666e-03 3343 2575 1.0416666666666669e-03 3343 2796 1.0416666666666669e-03 3343 3342 8.3333333333333315e-03 3343 3596 2.7105054312137611e-20 3343 2578 1.0416666666666667e-03 3343 2586 -6.2500000000000003e-03 3343 2585 4.1666666666666666e-03 3343 3346 8.3333333333333315e-03 3343 3364 1.3552527156068805e-20 3343 2771 1.0416666666666667e-03 3343 2768 -6.2500000000000003e-03 3343 2774 4.1666666666666666e-03 3343 3344 8.3333333333333315e-03 3343 3347 1.3552527156068805e-20 3343 2798 -6.2500000000000003e-03 3343 2799 4.1666666666666666e-03 3344 3344 4.1666666666666664e-02 3344 2790 2.0833333333333333e-03 3344 2797 2.0833333333333333e-03 3344 3338 2.0833333333333337e-03 3344 3329 -8.3333333333333315e-03 3344 2782 -2.0833333333333337e-03 3344 2781 2.0833333333333329e-03 3344 3347 -2.0833333333333337e-03 3344 3343 8.3333333333333315e-03 3344 2798 -2.0833333333333337e-03 3344 2799 2.0833333333333329e-03 3345 3345 4.1666666666666664e-02 3345 2774 2.0833333333333329e-03 3345 3352 2.0833333333333337e-03 3345 3343 8.3333333333333315e-03 3345 2790 2.0833333333333333e-03 3345 2784 8.3333333333333315e-03 3345 2782 -2.0833333333333337e-03 3345 2781 2.0833333333333329e-03 3345 3337 2.0833333333333337e-03 3345 3329 -8.3333333333333315e-03 3345 2769 8.3333333333333315e-03 3345 2768 -2.0833333333333337e-03 3345 2767 2.0833333333333333e-03 3346 3346 4.1666666666666664e-02 3346 2767 2.0833333333333333e-03 3346 3339 2.0833333333333337e-03 3346 3329 -8.3333333333333315e-03 3346 2573 2.0833333333333329e-03 3346 2575 8.3333333333333315e-03 3346 2586 -2.0833333333333337e-03 3346 2585 2.0833333333333333e-03 3346 3364 -2.0833333333333337e-03 3346 3343 8.3333333333333315e-03 3346 2771 8.3333333333333315e-03 3346 2768 -2.0833333333333337e-03 3346 2774 2.0833333333333329e-03 3347 3347 2.4999999999999998e-02 3347 2782 -1.0416666666666664e-03 3347 3629 -6.0159191589756597e-20 3347 2790 -2.0833333333333329e-03 3347 3344 -2.0833333333333337e-03 3347 3343 -1.0254392617697373e-19 3347 2798 -1.0416666666666664e-03 3347 2799 -2.0833333333333329e-03 3348 3348 2.0833333333333332e-02 3349 3349 2.0833333333333332e-02 3350 3350 2.5000000000000001e-02 3350 2769 6.2500000000000003e-03 3350 2778 2.0833333333333329e-03 3350 2784 6.2500000000000003e-03 3350 2786 2.0833333333333329e-03 3350 2787 1.0416666666666664e-03 3350 3351 -2.0833333333333337e-03 3350 3641 1.0254392617697373e-19 3350 2777 1.0416666666666664e-03 3350 3875 1.0416666666666664e-03 3350 4582 2.0833333333333337e-03 3350 4550 6.0159191589756597e-20 3350 4275 1.0416666666666664e-03 3351 3351 4.1666666666666664e-02 3351 2767 -2.0833333333333329e-03 3351 3337 -2.0833333333333337e-03 3351 3335 8.3333333333333315e-03 3351 2781 -2.0833333333333333e-03 3351 2784 -8.3333333333333315e-03 3351 2787 2.0833333333333333e-03 3351 2786 -2.0833333333333329e-03 3351 3350 -2.0833333333333337e-03 3351 3641 -8.3333333333333315e-03 3351 2769 -8.3333333333333315e-03 3351 2777 2.0833333333333333e-03 3351 2778 -2.0833333333333333e-03 3352 3352 2.5000000000000001e-02 3352 2784 6.2500000000000003e-03 3352 2790 2.0833333333333329e-03 3352 2769 6.2500000000000003e-03 3352 2774 2.0833333333333329e-03 3352 2768 1.0416666666666664e-03 3352 3345 2.0833333333333337e-03 3352 3343 -6.0159191589756597e-20 3352 2782 1.0416666666666664e-03 3352 4278 1.0416666666666664e-03 3352 4932 -2.0833333333333337e-03 3352 4528 -1.0254392617697373e-19 3352 3882 1.0416666666666664e-03 3353 3353 2.0833333333333332e-02 3354 3354 2.0833333333333332e-02 3355 3355 2.0833333333333332e-02 3356 3356 2.4999999999999998e-02 3356 2806 -1.0416666666666664e-03 3356 3566 -6.0159191589756597e-20 3356 2792 -2.0833333333333329e-03 3356 3193 -2.0833333333333337e-03 3356 3192 -1.0254392617697373e-19 3356 2609 -1.0416666666666664e-03 3356 2611 -2.0833333333333329e-03 3357 3357 2.0833333333333332e-02 3358 3358 4.1666666666666664e-02 3358 2973 2.0833333333333333e-03 3358 2621 2.0833333333333333e-03 3358 3634 2.0833333333333333e-03 3358 3359 8.3333333333333315e-03 3358 2969 -2.0833333333333337e-03 3358 2968 2.0833333333333329e-03 3358 3334 2.0833333333333333e-03 3358 3333 -8.3333333333333315e-03 3358 2619 -2.0833333333333337e-03 3358 2618 2.0833333333333329e-03 3359 3359 6.6666666666666652e-02 3359 2564 1.0416666666666669e-03 3359 2771 1.0416666666666669e-03 3359 3360 8.3333333333333315e-03 3359 3365 2.7105054312137611e-20 3359 2575 1.0416666666666667e-03 3359 2574 -6.2500000000000003e-03 3359 2587 4.1666666666666666e-03 3359 2971 1.0416666666666669e-03 3359 3358 8.3333333333333315e-03 3359 3634 -2.7105054312137611e-20 3359 2969 -6.2500000000000003e-03 3359 2968 4.1666666666666666e-03 3359 3361 8.3333333333333315e-03 3359 3633 -2.7105054312137611e-20 3359 2776 1.0416666666666667e-03 3359 2770 -6.2500000000000003e-03 3359 2775 4.1666666666666666e-03 3359 3196 -8.3333333333333315e-03 3359 3195 2.7105054312137611e-20 3359 2622 1.0416666666666667e-03 3359 2619 -6.2500000000000003e-03 3359 2621 4.1666666666666666e-03 3360 3360 4.1666666666666664e-02 3360 2775 2.0833333333333333e-03 3360 3365 -2.0833333333333333e-03 3360 3359 8.3333333333333315e-03 3360 2587 2.0833333333333329e-03 3360 2575 8.3333333333333315e-03 3360 2574 -2.0833333333333337e-03 3360 2573 2.0833333333333333e-03 3360 3339 2.0833333333333333e-03 3360 3333 -8.3333333333333315e-03 3360 2771 8.3333333333333315e-03 3360 2770 -2.0833333333333337e-03 3360 2767 2.0833333333333329e-03 3361 3361 4.1666666666666664e-02 3361 2767 2.0833333333333333e-03 3361 3340 2.0833333333333337e-03 3361 3333 -8.3333333333333315e-03 3361 2973 2.0833333333333329e-03 3361 2971 8.3333333333333315e-03 3361 2969 -2.0833333333333337e-03 3361 2968 2.0833333333333333e-03 3361 3633 2.0833333333333337e-03 3361 3359 8.3333333333333315e-03 3361 2776 8.3333333333333315e-03 3361 2770 -2.0833333333333337e-03 3361 2775 2.0833333333333329e-03 3362 3362 2.4999999999999998e-02 3362 2779 -1.0416666666666664e-03 3362 3366 2.0833333333333337e-03 3362 3624 1.0254392617697373e-19 3362 2588 -1.0416666666666664e-03 3362 2575 -6.2500000000000003e-03 3362 2584 -1.0416666666666664e-03 3362 2583 -2.0833333333333329e-03 3362 3363 2.0833333333333337e-03 3362 3625 -6.0159191589756597e-20 3362 2771 -6.2500000000000003e-03 3362 2773 -1.0416666666666664e-03 3362 2772 -2.0833333333333329e-03 3363 3363 4.1666666666666664e-02 3363 2774 -2.0833333333333333e-03 3363 3364 2.0833333333333333e-03 3363 3628 8.3333333333333315e-03 3363 2585 -2.0833333333333329e-03 3363 2575 -8.3333333333333315e-03 3363 2584 2.0833333333333337e-03 3363 2583 -2.0833333333333333e-03 3363 3362 2.0833333333333333e-03 3363 3625 8.3333333333333315e-03 3363 2771 -8.3333333333333315e-03 3363 2773 2.0833333333333337e-03 3363 2772 -2.0833333333333329e-03 3364 3364 2.4999999999999998e-02 3364 2773 -1.0416666666666664e-03 3364 3363 2.0833333333333337e-03 3364 3628 -6.0159191589756597e-20 3364 2584 -1.0416666666666664e-03 3364 2575 -6.2500000000000003e-03 3364 2586 -1.0416666666666664e-03 3364 2585 -2.0833333333333329e-03 3364 3346 -2.0833333333333337e-03 3364 3343 -1.0254392617697373e-19 3364 2771 -6.2500000000000003e-03 3364 2768 -1.0416666666666664e-03 3364 2774 -2.0833333333333329e-03 3365 3365 2.4999999999999998e-02 3365 2770 -1.0416666666666664e-03 3365 3360 -2.0833333333333337e-03 3365 3359 6.0159191589756597e-20 3365 2574 -1.0416666666666664e-03 3365 2575 -6.2500000000000003e-03 3365 2588 -1.0416666666666664e-03 3365 2587 -2.0833333333333329e-03 3365 3366 2.0833333333333337e-03 3365 3631 1.0254392617697373e-19 3365 2771 -6.2500000000000003e-03 3365 2779 -1.0416666666666664e-03 3365 2775 -2.0833333333333329e-03 3366 3366 4.1666666666666664e-02 3366 2772 -2.0833333333333333e-03 3366 3362 2.0833333333333337e-03 3366 3624 8.3333333333333315e-03 3366 2583 -2.0833333333333329e-03 3366 2575 -8.3333333333333315e-03 3366 2588 2.0833333333333337e-03 3366 2587 -2.0833333333333333e-03 3366 3365 2.0833333333333337e-03 3366 3631 8.3333333333333315e-03 3366 2771 -8.3333333333333315e-03 3366 2779 2.0833333333333337e-03 3366 2775 -2.0833333333333329e-03 3367 3367 5.8333333333333320e-02 3367 2835 5.2083333333333322e-03 3367 3388 -2.0833333333333329e-03 3367 3369 1.2499999999999999e-02 3367 2813 1.0416666666666667e-03 3367 2670 -1.0416666666666669e-03 3367 2834 -1.0416666666666669e-03 3367 2832 -4.1666666666666657e-03 3367 3385 -8.3333333333333315e-03 3367 3377 2.7105054312137611e-20 3367 2668 -1.0416666666666667e-03 3367 2669 6.2500000000000003e-03 3367 2660 -4.1666666666666666e-03 3367 3387 -8.3333333333333315e-03 3367 3368 2.7105054312137611e-20 3367 2810 -1.0416666666666667e-03 3367 2809 -4.1666666666666675e-03 3367 1446 1.0416666666666666e-02 3367 1645 4.1666666666666675e-03 3368 3368 2.4999999999999998e-02 3368 2811 1.0416666666666664e-03 3368 3389 -2.0833333333333337e-03 3368 3371 -1.0254392617697373e-19 3368 2672 1.0416666666666664e-03 3368 2670 6.2500000000000003e-03 3368 2669 1.0416666666666664e-03 3368 2660 2.0833333333333329e-03 3368 3387 2.0833333333333337e-03 3368 3367 6.0159191589756597e-20 3368 2810 6.2500000000000003e-03 3368 2809 2.0833333333333329e-03 3368 1645 1.0416666666666664e-03 3369 3369 9.1666666666666646e-02 3369 3388 -4.1666666666666666e-03 3369 3367 1.2499999999999999e-02 3369 2813 2.0833333333333342e-03 3369 2809 -1.6666666666666666e-02 3369 3392 -8.3333333333333315e-03 3369 3378 1.3552527156068805e-20 3369 2823 6.2500000000000003e-03 3369 2821 -4.1666666666666666e-03 3369 3386 -8.3333333333333315e-03 3369 3376 2.7105054312137611e-20 3369 2835 1.0416666666666666e-02 3369 2832 -4.1666666666666657e-03 3369 3391 -4.1666666666666657e-03 3369 3370 1.2499999999999997e-02 3369 2837 1.0416666666666664e-02 3369 2836 -4.1666666666666675e-03 3369 1446 5.2083333333333322e-03 3369 1645 -3.1249999999999997e-03 3369 1646 -1.0416666666666669e-03 3369 1251 -1.0416666666666669e-03 3369 1648 -1.0416666666666667e-03 3369 1458 -1.0416666666666667e-03 3370 3370 5.8333333333333320e-02 3370 3372 1.3552527156068805e-20 3370 2893 -4.1666666666666666e-03 3370 3375 1.3552527156068805e-20 3370 2813 1.0416666666666664e-03 3370 2809 -4.1666666666666657e-03 3370 3391 -2.0833333333333329e-03 3370 3369 1.2499999999999997e-02 3370 2837 5.2083333333333330e-03 3370 2836 -4.1666666666666675e-03 3371 3371 6.6666666666666652e-02 3371 2662 -1.0416666666666669e-03 3371 2810 -1.0416666666666669e-03 3371 3389 8.3333333333333315e-03 3371 3368 1.3552527156068805e-20 3371 2670 -1.0416666666666667e-03 3371 2672 6.2500000000000003e-03 3371 2660 -4.1666666666666666e-03 3371 3223 8.3333333333333315e-03 3371 3221 -2.7105054312137611e-20 3371 2635 -1.0416666666666667e-03 3371 2638 -1.0416666666666669e-03 3371 2637 6.2500000000000003e-03 3371 2654 -4.1666666666666666e-03 3371 3524 -8.3333333333333315e-03 3371 3380 1.3552527156068805e-20 3371 2892 -1.0416666666666667e-03 3371 2899 6.2500000000000003e-03 3371 2893 -4.1666666666666666e-03 3371 3523 8.3333333333333315e-03 3371 3372 2.7105054312137611e-20 3371 2811 6.2500000000000003e-03 3371 2809 -4.1666666666666666e-03 3372 3372 2.5000000000000001e-02 3372 3370 -1.0254392617697373e-19 3372 2899 1.0416666666666664e-03 3372 2893 2.0833333333333329e-03 3372 3523 -2.0833333333333337e-03 3372 3371 6.0159191589756597e-20 3372 2811 1.0416666666666664e-03 3372 2809 2.0833333333333329e-03 3373 3373 6.6666666666666652e-02 3373 2635 -1.0416666666666669e-03 3373 2824 -1.0416666666666669e-03 3373 3384 -8.3333333333333315e-03 3373 3379 1.3552527156068805e-20 3373 2653 -1.0416666666666667e-03 3373 2652 6.2500000000000003e-03 3373 2654 -4.1666666666666666e-03 3373 2668 -1.0416666666666669e-03 3373 3382 -8.3333333333333315e-03 3373 3377 1.3552527156068805e-20 3373 2834 -1.0416666666666667e-03 3373 2833 6.2500000000000003e-03 3373 2832 -4.1666666666666666e-03 3373 3381 -8.3333333333333315e-03 3373 3376 1.3552527156068805e-20 3373 2822 6.2500000000000003e-03 3373 2821 -4.1666666666666666e-03 3373 3222 8.3333333333333315e-03 3373 3221 -1.3552527156068805e-20 3373 2662 -1.0416666666666667e-03 3373 2661 6.2500000000000003e-03 3373 2660 -4.1666666666666666e-03 3373 1458 -1.0416666666666669e-03 3373 1646 -1.0416666666666667e-03 3374 3374 6.6666666666666652e-02 3374 3394 8.3333333333333315e-03 3374 3378 2.7105054312137611e-20 3374 2840 6.2500000000000003e-03 3374 2836 -4.1666666666666666e-03 3374 2653 -1.0416666666666669e-03 3374 2892 -1.0416666666666669e-03 3374 3526 8.3333333333333315e-03 3374 3380 2.7105054312137611e-20 3374 2638 -1.0416666666666667e-03 3374 2655 6.2500000000000003e-03 3374 2654 -4.1666666666666666e-03 3374 3664 8.3333333333333315e-03 3374 3379 2.7105054312137611e-20 3374 2824 -1.0416666666666667e-03 3374 2825 6.2500000000000003e-03 3374 2821 -4.1666666666666666e-03 3374 3670 -8.3333333333333315e-03 3374 3375 2.7105054312137611e-20 3374 2891 6.2500000000000003e-03 3374 2893 -4.1666666666666666e-03 3374 1648 -1.0416666666666669e-03 3374 1251 -1.0416666666666667e-03 3375 3375 2.4999999999999998e-02 3375 2840 1.0416666666666664e-03 3375 3370 -1.0254392617697373e-19 3375 2836 2.0833333333333329e-03 3375 3670 2.0833333333333337e-03 3375 3374 6.0159191589756597e-20 3375 2891 1.0416666666666662e-03 3375 2893 2.0833333333333329e-03 3376 3376 2.5000000000000001e-02 3376 2823 1.0416666666666664e-03 3376 3386 2.0833333333333337e-03 3376 3369 6.0159191589756597e-20 3376 2835 1.0416666666666664e-03 3376 2833 1.0416666666666664e-03 3376 2832 2.0833333333333329e-03 3376 3381 2.0833333333333337e-03 3376 3373 -1.0254392617697373e-19 3376 2822 1.0416666666666664e-03 3376 2821 2.0833333333333329e-03 3376 1458 6.2500000000000003e-03 3376 1646 6.2500000000000003e-03 3377 3377 2.4999999999999998e-02 3377 3385 2.0833333333333337e-03 3377 3367 6.0159191589756597e-20 3377 2669 1.0416666666666662e-03 3377 2668 6.2500000000000003e-03 3377 2661 1.0416666666666664e-03 3377 2660 2.0833333333333329e-03 3377 3382 2.0833333333333337e-03 3377 3373 -1.0254392617697373e-19 3377 2834 6.2500000000000003e-03 3377 2833 1.0416666666666664e-03 3377 2832 2.0833333333333329e-03 3377 1446 1.0416666666666664e-03 3378 3378 2.4999999999999998e-02 3378 2825 1.0416666666666664e-03 3378 3394 -2.0833333333333337e-03 3378 3374 6.0159191589756597e-20 3378 2840 1.0416666666666664e-03 3378 2837 1.0416666666666664e-03 3378 2836 2.0833333333333329e-03 3378 3392 2.0833333333333337e-03 3378 3369 -1.0254392617697373e-19 3378 2823 1.0416666666666664e-03 3378 2821 2.0833333333333329e-03 3378 1251 6.2500000000000003e-03 3378 1648 6.2500000000000003e-03 3379 3379 2.4999999999999998e-02 3379 2822 1.0416666666666664e-03 3379 3384 2.0833333333333337e-03 3379 3373 -1.0254392617697373e-19 3379 2652 1.0416666666666664e-03 3379 2653 6.2500000000000003e-03 3379 2655 1.0416666666666664e-03 3379 2654 2.0833333333333329e-03 3379 3664 -2.0833333333333337e-03 3379 3374 6.0159191589756597e-20 3379 2824 6.2500000000000003e-03 3379 2825 1.0416666666666662e-03 3379 2821 2.0833333333333329e-03 3380 3380 2.4999999999999998e-02 3380 2637 1.0416666666666664e-03 3380 3524 2.0833333333333337e-03 3380 3371 -1.0254392617697373e-19 3380 2899 1.0416666666666664e-03 3380 2892 6.2500000000000003e-03 3380 2891 1.0416666666666664e-03 3380 2893 2.0833333333333329e-03 3380 3526 -2.0833333333333337e-03 3380 3374 6.0159191589756597e-20 3380 2638 6.2500000000000003e-03 3380 2655 1.0416666666666664e-03 3380 2654 2.0833333333333329e-03 3381 3381 4.1666666666666664e-02 3381 2822 -2.0833333333333333e-03 3381 3383 -8.3333333333333315e-03 3381 2833 -2.0833333333333333e-03 3381 2832 2.0833333333333329e-03 3381 3376 2.0833333333333337e-03 3381 3373 -8.3333333333333315e-03 3381 2821 2.0833333333333333e-03 3381 1646 8.3333333333333315e-03 3381 491 2.0833333333333329e-03 3381 1013 2.0833333333333337e-03 3381 1458 8.3333333333333315e-03 3381 431 2.0833333333333333e-03 3382 3382 4.1666666666666664e-02 3382 2834 8.3333333333333315e-03 3382 2833 -2.0833333333333337e-03 3382 3383 -8.3333333333333315e-03 3382 2668 8.3333333333333315e-03 3382 2661 -2.0833333333333337e-03 3382 2674 2.0833333333333333e-03 3382 2660 2.0833333333333329e-03 3382 3377 2.0833333333333337e-03 3382 3373 -8.3333333333333315e-03 3382 2832 2.0833333333333333e-03 3382 431 2.0833333333333329e-03 3382 1012 2.0833333333333337e-03 3383 3383 6.6666666666666652e-02 3383 2834 -1.0416666666666669e-03 3383 2822 6.2500000000000003e-03 3383 3381 -8.3333333333333315e-03 3383 2833 6.2500000000000003e-03 3383 3382 -8.3333333333333315e-03 3383 2668 -1.0416666666666667e-03 3383 2661 6.2500000000000003e-03 3383 2674 -4.1666666666666666e-03 3383 2653 -1.0416666666666669e-03 3383 2662 -1.0416666666666669e-03 3383 3222 8.3333333333333315e-03 3383 3224 -1.3552527156068805e-20 3383 2635 -1.0416666666666667e-03 3383 2652 6.2500000000000003e-03 3383 2651 -4.1666666666666666e-03 3383 3384 -8.3333333333333315e-03 3383 3663 1.3552527156068805e-20 3383 2824 -1.0416666666666667e-03 3383 1646 -1.0416666666666669e-03 3383 491 -4.1666666666666666e-03 3383 1013 1.3552527156068805e-20 3383 1458 -1.0416666666666667e-03 3383 431 -4.1666666666666666e-03 3383 1012 1.3552527156068805e-20 3384 3384 4.1666666666666664e-02 3384 2821 2.0833333333333329e-03 3384 3379 2.0833333333333337e-03 3384 3373 -8.3333333333333315e-03 3384 2654 2.0833333333333333e-03 3384 2653 8.3333333333333315e-03 3384 2652 -2.0833333333333337e-03 3384 2651 2.0833333333333329e-03 3384 3663 2.0833333333333337e-03 3384 3383 -8.3333333333333315e-03 3384 2824 8.3333333333333315e-03 3384 2822 -2.0833333333333337e-03 3384 491 2.0833333333333333e-03 3385 3385 2.0833333541666665e-02 3385 2668 4.1666666979166666e-03 3385 2669 -1.0416666666666671e-03 3385 2834 4.1666666979166657e-03 3385 2832 2.0833333333333333e-03 3385 3377 2.0833333333333337e-03 3385 3367 -8.3333333333333315e-03 3385 2660 2.0833333333333329e-03 3385 331 -2.0833333333333329e-11 3385 318 2.0833333333333329e-11 3385 729 -2.0833333333333336e-11 3385 326 -2.0833333333333326e-11 3385 330 -6.2499999999999991e-11 3385 727 2.0833333333333336e-11 3385 346 2.1169082391605852e-27 3385 785 2.0833333333333326e-11 3385 781 2.0833333333333326e-11 3385 428 2.0833333333333329e-11 3385 1446 -1.0416666666666664e-03 3386 3386 4.1666666666666664e-02 3386 2835 -1.0416666666666669e-03 3386 2823 -1.0416666666666669e-03 3386 2821 2.0833333333333329e-03 3386 3376 2.0833333333333337e-03 3386 3369 -8.3333333333333315e-03 3386 2832 2.0833333333333333e-03 3386 1458 9.3749999999999997e-03 3386 1455 2.1705219273391446e-19 3386 2138 1.0416666666666666e-02 3386 2134 -2.6946235634527430e-19 3386 1646 9.3749999999999979e-03 3386 1647 -2.1705219273391446e-19 3387 3387 2.0833333541666665e-02 3387 2810 4.1666666979166666e-03 3387 2670 4.1666666979166657e-03 3387 2669 -1.0416666666666664e-03 3387 2660 2.0833333333333333e-03 3387 3368 2.0833333333333333e-03 3387 3367 -8.3333333333333315e-03 3387 2809 2.0833333333333329e-03 3387 326 -2.0833333333333329e-11 3387 148 2.0833333333333329e-11 3387 1645 -1.0416666666666671e-03 3387 732 -2.0833333333333336e-11 3387 328 -2.0833333333333326e-11 3387 330 -6.2499999999999991e-11 3387 730 -2.0833333333333336e-11 3387 327 2.1169082391605852e-27 3387 728 2.0833333333333326e-11 3387 729 -2.0833333333333326e-11 3387 318 2.0833333333333329e-11 3388 3388 4.1666666666666657e-02 3388 2813 1.0416666666666660e-03 3388 2835 -1.0416666666666667e-03 3388 2832 9.3703019790006975e-21 3388 3367 -2.0833333333333329e-03 3388 3369 -4.1666666666666666e-03 3388 2809 4.1666666666666666e-03 3388 1101 -3.2249014814734037e-20 3388 1645 1.2499999999999997e-02 3388 2154 4.3368086899420177e-19 3388 1107 -6.2499999999999986e-03 3388 2165 -8.3333333333333332e-03 3388 1112 1.0416666666666664e-03 3388 2159 -2.7105054312137611e-20 3388 2152 1.6263032587282567e-19 3388 1447 -4.9904357809065860e-20 3388 1446 1.0416666666666667e-03 3389 3389 4.5833333333333323e-02 3389 2809 -2.0833333333333333e-03 3389 3368 -2.0833333333333337e-03 3389 3371 8.3333333333333315e-03 3389 2660 -2.0833333333333329e-03 3389 2670 -1.3541666666666667e-02 3389 2664 -5.2083333333333330e-03 3389 2672 8.6736173798840355e-19 3389 3210 -4.1666666666666666e-03 3389 3202 8.3333333333333315e-03 3389 2810 -7.2916666666666659e-03 3389 2811 4.3368086899420177e-19 3389 2820 -1.0416666666666664e-03 3390 3390 4.5833333333333323e-02 3390 2670 1.2499999999999997e-02 3390 2673 1.0416666666666669e-03 3390 2810 6.2499999999999995e-03 3390 2819 1.0416666666666660e-03 3390 2820 1.0416666666666667e-03 3390 3210 4.1666666666666675e-03 3390 2664 5.2083333333333330e-03 3390 3203 -8.3333333333333332e-03 3390 199 -2.0833333333333333e-03 3390 316 2.0833333333333329e-03 3390 985 -2.0833333333333333e-03 3390 205 -2.0833333333333329e-03 3390 216 -6.2500000000000003e-03 3390 731 -2.0833333333333333e-03 3390 206 2.6745065309554533e-19 3390 620 2.0833333333333333e-03 3390 619 -2.0833333333333333e-03 3390 147 2.0833333333333333e-03 3391 3391 4.1666666666666657e-02 3391 2837 -1.0416666666666669e-03 3391 2813 1.0416666666666660e-03 3391 2809 4.1666666666666666e-03 3391 3370 -2.0833333333333329e-03 3391 3369 -4.1666666666666666e-03 3391 2836 -2.0761130467597592e-20 3391 2151 2.1684043449710089e-19 3391 1107 -6.2499999999999986e-03 3391 2154 -4.3368086899420177e-19 3392 3392 4.5833333333333323e-02 3392 2823 -4.3368086899420177e-19 3392 2837 -4.3368086899420177e-19 3392 2836 2.0833333333333333e-03 3392 3378 2.0833333333333337e-03 3392 3369 -8.3333333333333315e-03 3392 2821 2.0833333333333329e-03 3392 1648 1.3541666666666664e-02 3392 1647 5.2083333333333330e-03 3392 2137 4.1666666666666675e-03 3392 2134 -8.3333333333333332e-03 3392 1251 7.2916666666666659e-03 3392 1250 1.0416666666666664e-03 3393 3393 2.4999999999999998e-02 3393 2827 -1.0416666666666664e-03 3393 3395 -2.0833333333333337e-03 3393 3672 1.0254392617697373e-19 3393 2844 -1.0416666666666664e-03 3393 2840 -1.0416666666666664e-03 3393 2839 -2.0833333333333329e-03 3393 3394 2.0833333333333337e-03 3393 3669 6.0159191589756597e-20 3393 2825 -1.0416666666666664e-03 3393 2826 -2.0833333333333329e-03 3393 1251 -6.2500000000000003e-03 3393 1648 -6.2500000000000003e-03 3394 3394 4.1666666666666664e-02 3394 2821 -2.0833333333333333e-03 3394 3378 -2.0833333333333333e-03 3394 3374 8.3333333333333315e-03 3394 2836 -2.0833333333333329e-03 3394 2840 2.0833333333333337e-03 3394 2839 -2.0833333333333333e-03 3394 3393 2.0833333333333333e-03 3394 3669 -8.3333333333333315e-03 3394 2825 2.0833333333333337e-03 3394 2826 -2.0833333333333329e-03 3394 1251 -8.3333333333333315e-03 3394 1648 -8.3333333333333315e-03 3395 3395 4.1666666666666664e-02 3395 2844 -2.0833333333333337e-03 3395 2827 -2.0833333333333337e-03 3395 2826 2.0833333333333333e-03 3395 3393 -2.0833333333333337e-03 3395 3672 -8.3333333333333315e-03 3395 2839 2.0833333333333329e-03 3395 1251 8.3333333333333315e-03 3395 4287 2.0833333333333333e-03 3395 4947 2.0833333333333337e-03 3395 4950 -8.3333333333333315e-03 3395 1648 8.3333333333333315e-03 3395 3963 2.0833333333333329e-03 3396 3396 2.0833333333333332e-02 3397 3397 2.0833333333333332e-02 3398 3398 2.9166666666666660e-02 3398 2367 2.0833333333333329e-03 3398 3415 -4.1666666666666675e-03 3398 3401 2.0833333333333333e-03 3398 2864 1.4465734552327348e-19 3398 2863 4.1666666666666657e-03 3398 2859 1.0416666666666660e-03 3398 2862 -1.4465734552327348e-19 3398 3036 4.1666666666666649e-03 3398 3035 -2.0833333333333329e-03 3398 2366 1.0416666666666664e-02 3398 2364 1.0416666666666662e-03 3399 3399 4.1666666666666664e-02 3399 2391 -2.0833333333333333e-03 3399 2354 2.0833333333333329e-03 3399 3041 -2.0833333333333333e-03 3399 2380 -2.0833333333333329e-03 3399 2389 -6.2499999999999986e-03 3399 3042 2.0833333333333333e-03 3399 2390 2.6745065309554533e-19 3399 2861 -2.0833333333333333e-03 3399 2853 2.0833333333333329e-03 3399 3403 2.0833333333333333e-03 3399 2860 -2.0833333333333329e-03 3399 2859 -6.2499999999999986e-03 3399 3410 -2.0833333333333333e-03 3399 2858 2.6745065309554533e-19 3399 3409 -2.0833333333333333e-03 3399 3404 2.0833333333333333e-03 3399 2361 2.0833333333333333e-03 3399 2360 6.2500000000000003e-03 3399 2359 -3.7587087034409578e-19 3399 3406 -2.0833333333333333e-03 3399 3400 2.0833333333333333e-03 3399 2847 2.0833333333333333e-03 3399 2846 6.2500000000000003e-03 3399 2845 -3.7587087034409578e-19 3400 3400 2.9166666666666660e-02 3400 2852 2.0833333333333329e-03 3400 3420 -4.1666666666666675e-03 3400 3402 2.0833333333333333e-03 3400 2401 1.4465734552327348e-19 3400 2391 4.1666666666666657e-03 3400 2389 1.0416666666666660e-03 3400 2390 -1.2659172094511536e-19 3400 3406 4.1666666666666649e-03 3400 3399 2.0833333333333329e-03 3400 2847 1.0416666666666664e-02 3400 2846 2.0833333333333329e-03 3400 2845 1.0416666666666662e-03 3401 3401 4.1666666666666664e-02 3401 2866 -2.0833333333333333e-03 3401 2366 2.0833333333333329e-03 3401 3398 2.0833333333333333e-03 3401 2863 -2.0833333333333329e-03 3401 2859 -6.2499999999999986e-03 3401 3415 2.0833333333333333e-03 3401 2864 2.6745065309554533e-19 3401 3467 -2.0833333333333333e-03 3401 3405 2.0833333333333333e-03 3401 2488 2.0833333333333333e-03 3401 2381 -2.0833333333333333e-03 3401 2483 2.0833333333333329e-03 3401 2482 6.2500000000000003e-03 3401 2489 -3.7587087034409578e-19 3401 3106 -2.0833333333333333e-03 3401 2386 -2.0833333333333329e-03 3401 2389 -6.2499999999999986e-03 3401 3105 2.0833333333333333e-03 3401 2402 2.6745065309554533e-19 3401 3045 2.0833333333333333e-03 3401 3044 -2.0833333333333333e-03 3401 2368 2.0833333333333333e-03 3401 2367 6.2500000000000003e-03 3401 2364 -3.7587087034409578e-19 3402 3402 4.1666666666666664e-02 3402 2860 -2.0833333333333333e-03 3402 2488 2.0833333333333329e-03 3402 3405 2.0833333333333333e-03 3402 2866 -2.0833333333333329e-03 3402 2859 -6.2500000000000003e-03 3402 3468 -2.0833333333333333e-03 3402 2869 2.6745065309554533e-19 3402 2386 -2.0833333333333333e-03 3402 2847 2.0833333333333329e-03 3402 3400 2.0833333333333333e-03 3402 2391 -2.0833333333333329e-03 3402 2389 -6.2500000000000003e-03 3402 3420 2.0833333333333333e-03 3402 2401 2.6745065309554533e-19 3402 3107 2.0833333333333333e-03 3402 3106 -2.0833333333333333e-03 3402 2483 2.0833333333333333e-03 3402 2490 6.2499999999999995e-03 3402 2489 -4.1202858928001372e-19 3402 3413 -2.0833333333333333e-03 3402 3403 2.0833333333333333e-03 3402 2853 2.0833333333333333e-03 3402 2852 6.2499999999999995e-03 3402 2845 -4.1202858928001372e-19 3403 3403 2.9166666666666660e-02 3403 2869 -1.4465734552327348e-19 3403 2846 2.0833333333333329e-03 3403 2860 4.1666666666666657e-03 3403 2859 1.0416666666666660e-03 3403 3410 4.1666666666666675e-03 3403 3399 2.0833333333333333e-03 3403 2858 1.4465734552327348e-19 3403 3413 4.1666666666666649e-03 3403 3402 2.0833333333333329e-03 3403 2853 1.0416666666666664e-02 3403 2852 2.0833333333333329e-03 3403 2845 1.0416666666666662e-03 3404 3404 2.9166666666666660e-02 3404 3039 4.1666666666666675e-03 3404 3035 -2.0833333333333333e-03 3404 2862 1.4465734552327348e-19 3404 2861 4.1666666666666657e-03 3404 2859 1.0416666666666660e-03 3404 2858 -1.2659172094511536e-19 3404 3409 4.1666666666666649e-03 3404 3399 2.0833333333333329e-03 3404 2361 1.0416666666666664e-02 3404 2360 2.0833333333333329e-03 3404 2359 1.0416666666666662e-03 3405 3405 2.9166666666666660e-02 3405 2490 2.0833333333333329e-03 3405 3468 4.1666666666666675e-03 3405 3402 2.0833333333333333e-03 3405 2869 1.4465734552327348e-19 3405 2866 4.1666666666666657e-03 3405 2859 1.0416666666666660e-03 3405 2864 -1.2659172094511536e-19 3405 3467 4.1666666666666649e-03 3405 3401 2.0833333333333329e-03 3405 2488 1.0416666666666664e-02 3405 2482 2.0833333333333329e-03 3405 2489 1.0416666666666662e-03 3406 3406 2.9166666666666660e-02 3406 2848 1.4465734552327348e-19 3406 3417 -4.1666666666666666e-03 3406 2397 2.0833333333333329e-03 3406 3407 2.0833333333333333e-03 3406 2391 1.0416666666666664e-02 3406 2389 2.0833333333333329e-03 3406 2390 1.0416666666666664e-03 3406 3400 4.1666666666666649e-03 3406 3399 -2.0833333333333329e-03 3406 2847 4.1666666666666657e-03 3406 2846 1.0416666666666664e-03 3406 2845 -9.9486666632977745e-20 3407 3407 4.1666666666666664e-02 3407 2535 2.0833333333333333e-03 3407 2357 -2.0833333333333329e-03 3407 3444 -2.0833333333333337e-03 3407 2541 2.0833333333333329e-03 3407 2534 6.2499999999999986e-03 3407 3411 2.0833333333333337e-03 3407 2542 -4.1202858928001372e-19 3407 2380 2.0833333333333333e-03 3407 2847 -2.0833333333333329e-03 3407 3417 2.0833333333333337e-03 3407 2391 2.0833333333333329e-03 3407 2397 6.2499999999999986e-03 3407 3406 2.0833333333333337e-03 3407 2390 -4.1202858928001372e-19 3407 3042 -2.0833333333333333e-03 3407 3043 2.0833333333333337e-03 3407 2354 -2.0833333333333333e-03 3407 2360 -6.2499999999999995e-03 3407 2362 4.1202858928001372e-19 3407 3408 2.0833333333333333e-03 3407 3443 -2.0833333333333337e-03 3407 2854 -2.0833333333333333e-03 3407 2846 -6.2499999999999995e-03 3407 2848 4.1202858928001372e-19 3408 3408 2.9166666666666660e-02 3408 2855 1.4465734552327348e-19 3408 3449 -4.1666666666666675e-03 3408 2543 2.0833333333333329e-03 3408 3412 -2.0833333333333333e-03 3408 2535 1.0416666666666664e-02 3408 2534 2.0833333333333329e-03 3408 2542 1.0416666666666662e-03 3408 3443 4.1666666666666649e-03 3408 3407 2.0833333333333329e-03 3408 2854 4.1666666666666657e-03 3408 2846 1.0416666666666664e-03 3408 2848 -1.4465734552327348e-19 3409 3409 2.9166666666666664e-02 3409 2361 4.1666666666666657e-03 3409 2360 1.0416666666666664e-03 3409 2861 1.0416666666666664e-02 3409 2858 1.0416666666666664e-03 3409 2859 2.0833333333333329e-03 3409 3404 4.1666666666666649e-03 3409 3399 -2.0833333333333329e-03 3409 2359 -9.9486666632977745e-20 3409 245 1.4465734552327348e-19 3409 885 4.1666666666666666e-03 3409 45 2.0833333333333329e-03 3409 884 -2.0833333333333333e-03 3410 3410 2.9166666666666664e-02 3410 2860 1.0416666666666664e-02 3410 2858 1.0416666666666662e-03 3410 2853 4.1666666666666657e-03 3410 2846 1.0416666666666664e-03 3410 2845 1.4465734552327348e-19 3410 3403 4.1666666666666675e-03 3410 2859 2.0833333333333329e-03 3410 3399 -2.0833333333333333e-03 3410 45 2.0833333333333329e-03 3410 865 -4.1666666666666649e-03 3410 884 -2.0833333333333329e-03 3410 448 -1.4465734552327348e-19 3411 3411 2.9166666666666660e-02 3411 2543 2.0833333333333329e-03 3411 3480 -4.1666666666666649e-03 3411 3412 -2.0833333333333329e-03 3411 2363 -9.9486666632977745e-20 3411 2357 4.1666666666666657e-03 3411 2360 1.0416666666666664e-03 3411 2362 1.4465734552327348e-19 3411 3444 4.1666666666666666e-03 3411 2541 1.0416666666666664e-02 3411 2534 2.0833333333333329e-03 3411 3407 2.0833333333333333e-03 3411 2542 1.0416666666666664e-03 3412 3412 4.1666666666666664e-02 3412 2360 6.2500000000000003e-03 3412 2363 -3.7587087034409578e-19 3412 2846 6.2500000000000003e-03 3412 2855 -3.7587087034409578e-19 3412 2541 -2.0833333333333333e-03 3412 2854 2.0833333333333329e-03 3412 3449 -2.0833333333333333e-03 3412 2535 -2.0833333333333329e-03 3412 2543 -6.2499999999999986e-03 3412 3408 -2.0833333333333333e-03 3412 2542 2.6745065309554533e-19 3412 3411 -2.0833333333333333e-03 3412 3480 -2.0833333333333333e-03 3412 2357 2.0833333333333333e-03 3412 263 -2.0833333333333333e-03 3412 243 2.0833333333333329e-03 3412 666 -2.0833333333333333e-03 3412 252 -2.0833333333333329e-03 3412 270 -6.2499999999999986e-03 3412 665 2.0833333333333333e-03 3412 268 2.6745065309554533e-19 3412 891 2.0833333333333333e-03 3412 890 -2.0833333333333333e-03 3412 449 2.0833333333333333e-03 3413 3413 2.9166666666666664e-02 3413 2853 4.1666666666666657e-03 3413 2852 1.0416666666666664e-03 3413 2860 1.0416666666666664e-02 3413 2869 1.0416666666666664e-03 3413 2859 2.0833333333333329e-03 3413 3403 4.1666666666666649e-03 3413 3402 -2.0833333333333329e-03 3413 2845 -1.4465734552327348e-19 3413 447 1.2659172094511536e-19 3413 862 4.1666666666666666e-03 3413 43 2.0833333333333329e-03 3413 863 -2.0833333333333337e-03 3414 3414 2.9166666666666660e-02 3414 3416 -4.1666666666666666e-03 3414 3461 -2.0833333333333333e-03 3414 2867 -9.9486666632977745e-20 3414 2863 -4.1666666666666657e-03 3414 2865 -1.0416666666666664e-03 3414 2864 1.4465734552327348e-19 3414 3415 4.1666666666666649e-03 3414 3464 -2.0833333333333329e-03 3414 2366 -1.0416666666666664e-02 3414 2367 -2.0833333333333329e-03 3414 2371 -1.0416666666666664e-03 3415 3415 2.9166666666666660e-02 3415 2364 -1.4465734552327348e-19 3415 3398 -4.1666666666666675e-03 3415 2859 -2.0833333333333329e-03 3415 3401 2.0833333333333333e-03 3415 2863 -1.0416666666666664e-02 3415 2865 -2.0833333333333329e-03 3415 2864 -1.0416666666666662e-03 3415 3414 4.1666666666666649e-03 3415 3464 2.0833333333333329e-03 3415 2366 -4.1666666666666657e-03 3415 2367 -1.0416666666666664e-03 3415 2371 1.4465734552327348e-19 3416 3416 2.9166666666666664e-02 3416 2863 1.0416666666666664e-02 3416 2867 1.0416666666666662e-03 3416 2366 4.1666666666666657e-03 3416 2371 1.4465734552327348e-19 3416 3414 -4.1666666666666675e-03 3416 2865 2.0833333333333329e-03 3416 3461 -2.0833333333333333e-03 3416 50 2.0833333333333329e-03 3416 936 4.1666666666666649e-03 3417 3417 2.9166666666666660e-02 3417 2846 -2.0833333333333329e-03 3417 3406 -4.1666666666666666e-03 3417 3407 2.0833333333333337e-03 3417 2390 -1.2659172094511536e-19 3417 2391 -4.1666666666666657e-03 3417 2397 -1.0416666666666664e-03 3417 2398 1.4465734552327348e-19 3417 3418 4.1666666666666649e-03 3417 3441 -2.0833333333333329e-03 3417 2847 -1.0416666666666664e-02 3417 2849 -2.0833333333333329e-03 3417 2848 -1.0416666666666664e-03 3418 3418 2.9166666666666660e-02 3418 2850 -1.4465734552327348e-19 3418 3419 4.1666666666666675e-03 3418 2399 -2.0833333333333329e-03 3418 3445 -2.0833333333333333e-03 3418 2391 -1.0416666666666664e-02 3418 2397 -2.0833333333333329e-03 3418 2398 -1.0416666666666662e-03 3418 3417 4.1666666666666649e-03 3418 3441 2.0833333333333329e-03 3418 2847 -4.1666666666666657e-03 3418 2849 -1.0416666666666660e-03 3418 2848 1.4465734552327348e-19 3419 3419 2.9166666666666660e-02 3419 2401 1.4465734552327348e-19 3419 2849 -2.0833333333333329e-03 3419 2391 -4.1666666666666657e-03 3419 2399 -1.0416666666666664e-03 3419 3418 4.1666666666666675e-03 3419 3445 2.0833333333333333e-03 3419 2398 -1.4465734552327348e-19 3419 3420 4.1666666666666649e-03 3419 3458 -2.0833333333333329e-03 3419 2847 -1.0416666666666664e-02 3419 2852 -2.0833333333333329e-03 3419 2850 -1.0416666666666662e-03 3420 3420 2.9166666666666664e-02 3420 2399 -2.0833333333333329e-03 3420 2845 -9.9486666632977745e-20 3420 3400 -4.1666666666666666e-03 3420 2391 -1.0416666666666664e-02 3420 2389 -2.0833333333333329e-03 3420 3402 2.0833333333333333e-03 3420 2401 -1.0416666666666664e-03 3420 3419 4.1666666666666649e-03 3420 3458 2.0833333333333329e-03 3420 2847 -4.1666666666666657e-03 3420 2852 -1.0416666666666664e-03 3420 2850 1.4465734552327348e-19 3421 3421 4.1666666666666657e-02 3421 2345 2.0833333333333333e-03 3421 3438 -2.0833333333333333e-03 3421 3423 8.3333333333333315e-03 3421 2876 2.0833333333333329e-03 3421 2383 -2.0833333333333333e-03 3421 2874 2.0833333333333329e-03 3421 2878 -1.0416666666666671e-03 3421 3425 2.0833333333333333e-03 3421 2395 -2.0833333333333329e-03 3421 2393 -6.2500000000000003e-03 3421 3437 2.0833333333333333e-03 3421 2396 2.6745065309554533e-19 3421 3055 2.0833333333333333e-03 3421 3054 -2.0833333333333333e-03 3421 2335 2.0833333333333333e-03 3421 2338 -1.0416666666666669e-03 3422 3422 2.9166666666666660e-02 3422 2400 -1.4465734552327348e-19 3422 2418 2.0833333333333329e-03 3422 2394 4.1666666666666657e-03 3422 2393 1.0416666666666660e-03 3422 3430 4.1666666666666675e-03 3422 3424 2.0833333333333333e-03 3422 2392 1.4465734552327348e-19 3422 3070 4.1666666666666649e-03 3422 3069 -2.0833333333333329e-03 3422 2422 1.0416666666666664e-02 3422 2421 2.0833333333333329e-03 3422 2420 1.0416666666666662e-03 3423 3423 5.8333333333333320e-02 3423 2871 1.0416666666666669e-03 3423 3421 8.3333333333333315e-03 3423 3438 2.7105054312137611e-20 3423 2878 -6.2500000000000003e-03 3423 2876 4.1666666666666666e-03 3423 2338 -4.1666666666666666e-03 3423 2344 -1.0416666666666664e-03 3423 2345 4.1666666666666657e-03 3423 3269 2.0833333333333329e-03 3423 3268 1.2499999999999997e-02 3423 2426 -5.2083333333333330e-03 3423 3424 8.3333333333333315e-03 3423 3428 2.7105054312137611e-20 3423 2418 1.0416666666666667e-03 3423 2420 -1.0416666666666666e-02 3423 2427 4.1666666666666675e-03 3424 3424 4.1666666666666664e-02 3424 2876 2.0833333333333333e-03 3424 2395 -2.0833333333333333e-03 3424 2422 2.0833333333333329e-03 3424 3422 2.0833333333333333e-03 3424 2394 -2.0833333333333329e-03 3424 2393 -6.2499999999999986e-03 3424 3430 -2.0833333333333333e-03 3424 2392 2.6745065309554533e-19 3424 3429 -2.0833333333333333e-03 3424 3425 2.0833333333333333e-03 3424 2874 2.0833333333333333e-03 3424 2871 7.2916666666666650e-03 3424 2878 -1.0416666666666669e-03 3424 3428 -2.0833333333333337e-03 3424 3423 8.3333333333333315e-03 3424 2418 7.2916666666666668e-03 3424 2420 -1.0416666666666669e-03 3424 2427 2.0833333333333329e-03 3425 3425 2.9166666666666660e-02 3425 3437 -4.1666666666666675e-03 3425 3421 2.0833333333333333e-03 3425 2396 1.4465734552327348e-19 3425 2395 4.1666666666666657e-03 3425 2393 1.0416666666666660e-03 3425 2392 -1.2659172094511536e-19 3425 3429 4.1666666666666649e-03 3425 3424 2.0833333333333329e-03 3425 2874 1.0416666666666664e-02 3425 2871 2.0833333333333329e-03 3425 2878 1.0416666666666662e-03 3426 3426 4.1666666666666664e-02 3426 2394 2.0833333333333333e-03 3426 2874 -2.0833333333333329e-03 3426 3435 2.0833333333333337e-03 3426 2395 2.0833333333333329e-03 3426 2397 6.2499999999999986e-03 3426 3429 2.0833333333333337e-03 3426 2392 -4.1202858928001372e-19 3426 3430 2.0833333333333333e-03 3426 3432 2.0833333333333337e-03 3426 2422 -2.0833333333333333e-03 3426 2537 2.0833333333333333e-03 3426 2419 -2.0833333333333329e-03 3426 2418 -6.2499999999999995e-03 3426 2434 4.1202858928001372e-19 3426 3160 2.0833333333333337e-03 3426 2530 2.0833333333333329e-03 3426 2534 6.2499999999999986e-03 3426 3159 -2.0833333333333337e-03 3426 2536 -4.1202858928001372e-19 3426 3427 2.0833333333333333e-03 3426 3440 -2.0833333333333337e-03 3426 2872 -2.0833333333333333e-03 3426 2871 -6.2499999999999995e-03 3426 2870 4.1202858928001372e-19 3427 3427 2.9166666666666660e-02 3427 2880 1.4465734552327348e-19 3427 3151 4.1666666666666675e-03 3427 2529 2.0833333333333329e-03 3427 3144 -2.0833333333333333e-03 3427 2537 1.0416666666666664e-02 3427 2534 2.0833333333333329e-03 3427 2536 1.0416666666666662e-03 3427 3440 4.1666666666666649e-03 3427 3426 2.0833333333333329e-03 3427 2872 4.1666666666666657e-03 3427 2871 1.0416666666666664e-03 3427 2870 -1.4465734552327348e-19 3428 3428 2.4999999999999998e-02 3428 2878 -1.0416666666666664e-03 3428 2871 -6.2499999999999995e-03 3428 2876 -2.0833333333333329e-03 3428 2875 -1.0416666666666667e-03 3428 3431 2.0833333333333337e-03 3428 3485 -5.1510191104902139e-20 3428 2438 -1.0416666666666664e-03 3428 3424 -2.0833333333333337e-03 3428 3423 6.0159191589756597e-20 3428 2418 -6.2499999999999995e-03 3428 2420 -1.0416666666666662e-03 3428 2427 -2.0833333333333324e-03 3429 3429 2.9166666666666660e-02 3429 2870 1.4465734552327348e-19 3429 3435 -4.1666666666666666e-03 3429 2397 2.0833333333333329e-03 3429 3426 2.0833333333333333e-03 3429 2395 1.0416666666666664e-02 3429 2393 2.0833333333333329e-03 3429 2392 1.0416666666666664e-03 3429 3425 4.1666666666666649e-03 3429 3424 -2.0833333333333329e-03 3429 2874 4.1666666666666657e-03 3429 2871 1.0416666666666664e-03 3429 2878 -9.9486666632977745e-20 3430 3430 2.9166666666666664e-02 3430 2397 2.0833333333333329e-03 3430 3432 -4.1666666666666649e-03 3430 3426 2.0833333333333329e-03 3430 2434 -1.4465734552327348e-19 3430 2422 4.1666666666666657e-03 3430 2418 1.0416666666666664e-03 3430 2420 1.4465734552327348e-19 3430 3422 4.1666666666666675e-03 3430 2394 1.0416666666666664e-02 3430 2393 2.0833333333333329e-03 3430 3424 -2.0833333333333333e-03 3430 2392 1.0416666666666662e-03 3431 3431 4.1666666666666657e-02 3431 2417 5.0116116045879435e-20 3431 3144 -1.0416666666666668e-02 3431 3146 1.5502688168223823e-19 3431 2880 2.1705219273391446e-19 3431 2871 -9.3749999999999997e-03 3431 2876 -2.0833333333333329e-03 3431 2875 1.0416666666666669e-03 3431 3428 2.0833333333333337e-03 3431 3485 -8.3333333333333315e-03 3431 2418 -9.3750000000000014e-03 3431 2427 -2.0833333333333333e-03 3431 2438 1.0416666666666671e-03 3432 3432 2.9166666666666660e-02 3432 2435 -2.0833333333333329e-03 3432 3433 4.1666666666666666e-03 3432 3441 -2.0833333333333333e-03 3432 2398 -9.9486666632977745e-20 3432 2394 -4.1666666666666657e-03 3432 2397 -1.0416666666666664e-03 3432 2392 1.4465734552327348e-19 3432 3430 -4.1666666666666649e-03 3432 3426 2.0833333333333329e-03 3432 2422 -1.0416666666666664e-02 3432 2418 -2.0833333333333329e-03 3432 2434 -1.0416666666666664e-03 3433 3433 2.9166666666666660e-02 3433 2399 -2.0833333333333329e-03 3433 3434 4.1666666666666649e-03 3433 3445 -2.0833333333333329e-03 3433 2436 1.2659172094511536e-19 3433 2422 -4.1666666666666657e-03 3433 2435 -1.0416666666666660e-03 3433 2434 -1.4465734552327348e-19 3433 3432 4.1666666666666675e-03 3433 2394 -1.0416666666666664e-02 3433 2397 -2.0833333333333329e-03 3433 3441 2.0833333333333333e-03 3433 2398 -1.0416666666666662e-03 3434 3434 2.9166666666666660e-02 3434 2421 -2.0833333333333329e-03 3434 3070 -4.1666666666666666e-03 3434 3067 2.0833333333333333e-03 3434 2400 -1.4465734552327348e-19 3434 2394 -4.1666666666666657e-03 3434 2399 -1.0416666666666664e-03 3434 2398 9.9486666632977745e-20 3434 3433 4.1666666666666649e-03 3434 3445 2.0833333333333329e-03 3434 2422 -1.0416666666666664e-02 3434 2435 -2.0833333333333329e-03 3434 2436 -1.0416666666666664e-03 3435 3435 2.9166666666666660e-02 3435 2403 1.4465734552327348e-19 3435 2871 -2.0833333333333329e-03 3435 2395 -4.1666666666666657e-03 3435 2397 -1.0416666666666664e-03 3435 3429 -4.1666666666666666e-03 3435 3426 2.0833333333333337e-03 3435 2392 -1.2659172094511536e-19 3435 3436 4.1666666666666649e-03 3435 3442 -2.0833333333333329e-03 3435 2874 -1.0416666666666664e-02 3435 2870 -1.0416666666666664e-03 3436 3436 2.9166666666666660e-02 3436 3034 -4.1666666666666675e-03 3436 2379 -2.0833333333333329e-03 3436 2395 -1.0416666666666664e-02 3436 2397 -2.0833333333333329e-03 3436 2403 -1.0416666666666662e-03 3436 3435 4.1666666666666649e-03 3436 3442 2.0833333333333329e-03 3436 2874 -4.1666666666666657e-03 3436 2870 1.4465734552327348e-19 3437 3437 2.9166666666666664e-02 3437 2379 -2.0833333333333329e-03 3437 3034 -4.1666666666666649e-03 3437 2874 -4.1666666666666657e-03 3437 2878 -9.9486666632977745e-20 3437 3425 -4.1666666666666666e-03 3437 2395 -1.0416666666666664e-02 3437 2393 -2.0833333333333329e-03 3437 3421 2.0833333333333333e-03 3437 2396 -1.0416666666666664e-03 3438 3438 2.4999999999999998e-02 3438 3489 1.0254392617697373e-19 3438 2338 -1.0416666666666664e-03 3438 2345 -2.0833333333333329e-03 3438 3421 -2.0833333333333337e-03 3438 3423 6.0159191589756597e-20 3438 2878 -1.0416666666666664e-03 3438 2876 -2.0833333333333329e-03 3439 3439 2.0833333333333332e-02 3440 3440 2.9166666666666660e-02 3440 3454 -4.1666666666666666e-03 3440 3442 2.0833333333333333e-03 3440 2539 9.9486666632977745e-20 3440 2537 4.1666666666666657e-03 3440 2534 1.0416666666666664e-03 3440 2536 -1.4465734552327348e-19 3440 3427 4.1666666666666649e-03 3440 3426 -2.0833333333333329e-03 3440 2872 1.0416666666666664e-02 3440 2871 2.0833333333333329e-03 3440 2870 1.0416666666666664e-03 3441 3441 4.1666666666666664e-02 3441 2391 -2.0833333333333333e-03 3441 2422 2.0833333333333329e-03 3441 3432 -2.0833333333333333e-03 3441 2394 -2.0833333333333329e-03 3441 2397 -6.2499999999999995e-03 3441 3433 2.0833333333333333e-03 3441 2398 4.1202858928001372e-19 3441 2530 -2.0833333333333333e-03 3441 2854 2.0833333333333329e-03 3441 3443 2.0833333333333333e-03 3441 2535 -2.0833333333333329e-03 3441 2534 -6.2499999999999995e-03 3441 3448 -2.0833333333333333e-03 3441 2533 4.1202858928001372e-19 3441 3161 2.0833333333333333e-03 3441 3160 -2.0833333333333333e-03 3441 2419 2.0833333333333333e-03 3441 2435 6.2500000000000003e-03 3441 2434 -2.6745065309554533e-19 3441 3418 2.0833333333333333e-03 3441 3417 -2.0833333333333333e-03 3441 2847 2.0833333333333333e-03 3441 2849 6.2500000000000003e-03 3441 2848 -2.6745065309554533e-19 3442 3442 4.1666666666666664e-02 3442 2541 -2.0833333333333333e-03 3442 2872 2.0833333333333329e-03 3442 3440 2.0833333333333333e-03 3442 2537 -2.0833333333333329e-03 3442 2534 -6.2499999999999995e-03 3442 3454 2.0833333333333333e-03 3442 2539 4.1202858928001372e-19 3442 3478 -2.0833333333333333e-03 3442 3444 2.0833333333333333e-03 3442 2357 2.0833333333333333e-03 3442 2395 -2.0833333333333333e-03 3442 2354 2.0833333333333329e-03 3442 2362 -2.6745065309554533e-19 3442 3043 -2.0833333333333333e-03 3442 2380 -2.0833333333333329e-03 3442 2397 -6.2499999999999995e-03 3442 3040 2.0833333333333333e-03 3442 2403 4.1202858928001372e-19 3442 3436 2.0833333333333333e-03 3442 3435 -2.0833333333333333e-03 3442 2874 2.0833333333333333e-03 3442 2870 -2.6745065309554533e-19 3443 3443 2.9166666666666660e-02 3443 2542 -1.4465734552327348e-19 3443 2849 2.0833333333333329e-03 3443 2535 4.1666666666666657e-03 3443 2534 1.0416666666666664e-03 3443 3448 4.1666666666666666e-03 3443 3441 2.0833333333333333e-03 3443 2533 9.9486666632977745e-20 3443 3408 4.1666666666666649e-03 3443 3407 -2.0833333333333329e-03 3443 2854 1.0416666666666664e-02 3443 2846 2.0833333333333329e-03 3443 2848 1.0416666666666664e-03 3444 3444 2.9166666666666660e-02 3444 2360 2.0833333333333329e-03 3444 3411 4.1666666666666666e-03 3444 3407 -2.0833333333333337e-03 3444 2542 1.2659172094511536e-19 3444 2541 4.1666666666666657e-03 3444 2534 1.0416666666666664e-03 3444 2539 -1.4465734552327348e-19 3444 3478 4.1666666666666649e-03 3444 3442 2.0833333333333329e-03 3444 2357 1.0416666666666664e-02 3444 2362 1.0416666666666664e-03 3445 3445 4.1666666666666664e-02 3445 2473 2.0833333333333333e-03 3445 2425 -2.0833333333333329e-03 3445 3075 2.0833333333333333e-03 3445 2467 2.0833333333333329e-03 3445 2471 6.2500000000000003e-03 3445 3076 2.0833333333333333e-03 3445 2472 -3.7587087034409578e-19 3445 2394 2.0833333333333333e-03 3445 2847 -2.0833333333333329e-03 3445 3419 2.0833333333333333e-03 3445 2391 2.0833333333333329e-03 3445 2399 6.2500000000000003e-03 3445 3418 -2.0833333333333333e-03 3445 2398 -3.7587087034409578e-19 3445 3433 -2.0833333333333333e-03 3445 3434 2.0833333333333333e-03 3445 2422 -2.0833333333333333e-03 3445 2435 -6.2499999999999986e-03 3445 2436 2.6745065309554533e-19 3445 3446 2.0833333333333333e-03 3445 3457 -2.0833333333333333e-03 3445 2851 -2.0833333333333333e-03 3445 2849 -6.2499999999999986e-03 3445 2850 2.6745065309554533e-19 3446 3446 2.9166666666666664e-02 3446 2851 4.1666666666666657e-03 3446 2849 1.0416666666666660e-03 3446 2473 1.0416666666666664e-02 3446 2472 1.0416666666666662e-03 3446 2471 2.0833333333333329e-03 3446 3457 4.1666666666666649e-03 3446 3445 2.0833333333333329e-03 3446 2850 -1.2659172094511536e-19 3446 456 1.4465734552327348e-19 3446 953 -4.1666666666666675e-03 3446 484 2.0833333333333329e-03 3446 982 -2.0833333333333333e-03 3447 3447 4.1666666666666664e-02 3447 2849 6.2499999999999986e-03 3447 2857 -2.6745065309554533e-19 3447 2435 6.2499999999999986e-03 3447 2437 -2.6745065309554533e-19 3447 2535 -2.0833333333333333e-03 3447 2419 2.0833333333333329e-03 3447 3162 -2.0833333333333333e-03 3447 2530 -2.0833333333333329e-03 3447 2546 -6.2500000000000003e-03 3447 3161 2.0833333333333333e-03 3447 2533 3.7587087034409578e-19 3447 3448 -2.0833333333333333e-03 3447 3451 -2.0833333333333333e-03 3447 2854 2.0833333333333333e-03 3447 217 -2.0833333333333333e-03 3447 455 2.0833333333333329e-03 3447 966 -2.0833333333333333e-03 3447 202 -2.0833333333333329e-03 3447 212 -6.2500000000000003e-03 3447 969 2.0833333333333333e-03 3447 218 3.7587087034409578e-19 3447 1010 2.0833333333333333e-03 3447 1006 2.0833333333333333e-03 3447 489 2.0833333333333333e-03 3448 3448 2.9166666666666660e-02 3448 2546 2.0833333333333329e-03 3448 2848 1.4465734552327348e-19 3448 3443 4.1666666666666675e-03 3448 2535 1.0416666666666664e-02 3448 2534 2.0833333333333329e-03 3448 3441 -2.0833333333333333e-03 3448 2533 1.0416666666666662e-03 3448 3451 -4.1666666666666649e-03 3448 3447 -2.0833333333333329e-03 3448 2854 4.1666666666666657e-03 3448 2849 1.0416666666666660e-03 3448 2857 -1.2659172094511536e-19 3449 3449 2.9166666666666660e-02 3449 2545 1.4465734552327348e-19 3449 2846 -2.0833333333333329e-03 3449 2535 -4.1666666666666657e-03 3449 2543 -1.0416666666666660e-03 3449 3408 -4.1666666666666675e-03 3449 3412 -2.0833333333333333e-03 3449 2542 -1.4465734552327348e-19 3449 3450 4.1666666666666649e-03 3449 3482 -2.0833333333333329e-03 3449 2854 -1.0416666666666664e-02 3449 2856 -2.0833333333333329e-03 3449 2855 -1.0416666666666662e-03 3450 3450 2.9166666666666660e-02 3450 2857 -1.2659172094511536e-19 3450 3451 4.1666666666666666e-03 3450 2546 -2.0833333333333329e-03 3450 3483 2.0833333333333337e-03 3450 2535 -1.0416666666666664e-02 3450 2543 -2.0833333333333329e-03 3450 2545 -1.0416666666666664e-03 3450 3449 4.1666666666666649e-03 3450 3482 2.0833333333333329e-03 3450 2854 -4.1666666666666657e-03 3450 2856 -1.0416666666666664e-03 3450 2855 1.4465734552327348e-19 3451 3451 2.9166666666666660e-02 3451 2533 9.9486666632977745e-20 3451 2856 -2.0833333333333329e-03 3451 2535 -4.1666666666666657e-03 3451 2546 -1.0416666666666664e-03 3451 3450 4.1666666666666666e-03 3451 3483 -2.0833333333333333e-03 3451 2545 -1.4465734552327348e-19 3451 3448 -4.1666666666666649e-03 3451 3447 -2.0833333333333329e-03 3451 2854 -1.0416666666666664e-02 3451 2849 -2.0833333333333329e-03 3451 2857 -1.0416666666666664e-03 3452 3452 2.9166666666666660e-02 3452 3453 4.1666666666666666e-03 3452 2540 -2.0833333333333329e-03 3452 2537 -1.0416666666666664e-02 3452 2529 -2.0833333333333329e-03 3452 2538 -1.0416666666666664e-03 3452 3151 -4.1666666666666649e-03 3452 3147 2.0833333333333329e-03 3452 2872 -4.1666666666666657e-03 3452 2880 1.4465734552327348e-19 3453 3453 2.9166666666666660e-02 3453 3452 4.1666666666666666e-03 3453 2538 -1.4465734552327348e-19 3453 2537 -4.1666666666666657e-03 3453 2540 -1.0416666666666664e-03 3453 2539 9.9486666632977745e-20 3453 3454 4.1666666666666649e-03 3453 2872 -1.0416666666666664e-02 3454 3454 2.9166666666666660e-02 3454 2870 -1.4465734552327348e-19 3454 3440 -4.1666666666666675e-03 3454 2534 -2.0833333333333329e-03 3454 3442 2.0833333333333333e-03 3454 2537 -1.0416666666666664e-02 3454 2540 -2.0833333333333329e-03 3454 2539 -1.0416666666666662e-03 3454 3453 4.1666666666666649e-03 3454 2872 -4.1666666666666657e-03 3455 3455 2.0833333333333329e-02 3456 3456 3.3333333333333326e-02 3456 3249 8.6736173798840355e-19 3456 2880 4.0939925783957855e-21 3456 2875 -6.2499999999999986e-03 3456 3147 -4.1666666666666666e-03 3456 3146 -4.3368086899420177e-19 3456 2498 -4.1666666666666666e-03 3456 2505 -6.2499999999999986e-03 3457 3457 2.9166666666666660e-02 3457 2852 2.0833333333333329e-03 3457 3460 4.1666666666666666e-03 3457 3458 2.0833333333333333e-03 3457 2474 1.4465734552327348e-19 3457 2473 4.1666666666666657e-03 3457 2471 1.0416666666666664e-03 3457 2472 -9.9486666632977745e-20 3457 3446 4.1666666666666649e-03 3457 3445 -2.0833333333333329e-03 3457 2851 1.0416666666666664e-02 3457 2849 2.0833333333333329e-03 3457 2850 1.0416666666666664e-03 3458 3458 4.1666666666666664e-02 3458 2391 -2.0833333333333333e-03 3458 2483 2.0833333333333329e-03 3458 3108 -2.0833333333333337e-03 3458 2386 -2.0833333333333329e-03 3458 2399 -6.2499999999999995e-03 3458 3107 2.0833333333333337e-03 3458 2401 4.1202858928001372e-19 3458 2475 -2.0833333333333333e-03 3458 2851 2.0833333333333329e-03 3458 3457 2.0833333333333337e-03 3458 2473 -2.0833333333333329e-03 3458 2471 -6.2499999999999995e-03 3458 3460 -2.0833333333333337e-03 3458 2474 4.1202858928001372e-19 3458 3472 -2.0833333333333337e-03 3458 3459 2.0833333333333333e-03 3458 2486 2.0833333333333333e-03 3458 2490 6.2499999999999986e-03 3458 2491 -4.1202858928001372e-19 3458 3420 2.0833333333333337e-03 3458 3419 -2.0833333333333333e-03 3458 2847 2.0833333333333333e-03 3458 2852 6.2499999999999986e-03 3458 2850 -4.1202858928001372e-19 3459 3459 2.9166666666666660e-02 3459 2485 2.0833333333333329e-03 3459 3099 4.1666666666666675e-03 3459 3097 -2.0833333333333333e-03 3459 2476 1.4465734552327348e-19 3459 2475 4.1666666666666657e-03 3459 2471 1.0416666666666664e-03 3459 2474 -1.4465734552327348e-19 3459 3472 4.1666666666666649e-03 3459 3458 2.0833333333333329e-03 3459 2486 1.0416666666666664e-02 3459 2490 2.0833333333333329e-03 3459 2491 1.0416666666666662e-03 3460 3460 2.9166666666666664e-02 3460 2473 1.0416666666666664e-02 3460 2474 1.0416666666666664e-03 3460 2851 4.1666666666666657e-03 3460 2852 1.0416666666666664e-03 3460 2850 1.2659172094511536e-19 3460 3457 4.1666666666666666e-03 3460 2471 2.0833333333333329e-03 3460 3458 -2.0833333333333337e-03 3460 480 2.0833333333333329e-03 3460 950 4.1666666666666649e-03 3460 938 2.0833333333333329e-03 3460 452 -1.4465734552327348e-19 3461 3461 2.0833333583333332e-02 3461 2888 1.0416666666666668e-11 3461 3470 -4.1666666666666671e-11 3461 2375 5.2083333333333334e-11 3461 3463 -8.3333333333333343e-11 3461 2868 -2.0833333333333333e-03 3461 2366 2.0833333333333329e-03 3461 2371 1.0416666803356611e-11 3461 3414 -2.0833333333333333e-03 3461 2863 -2.0833333333333329e-03 3461 2865 -6.2499999999999995e-03 3461 3416 -2.0833333333333333e-03 3461 2867 4.1202858928001372e-19 3461 3469 -2.0833333333333333e-03 3461 3462 2.0833333333333333e-03 3461 2887 2.0833333333333333e-03 3461 5 1.0416666262526071e-11 3462 3462 2.9166666666666664e-02 3462 2887 1.0416666666666664e-02 3462 2868 4.1666666666666657e-03 3462 2865 1.0416666666666664e-03 3462 2867 -1.4465734552327348e-19 3462 3469 4.1666666666666649e-03 3462 3461 2.0833333333333329e-03 3462 5 1.0416666666666664e-03 3462 516 4.1666666666666666e-03 3462 517 -2.0833333333333337e-03 3462 42 1.2659172094511536e-19 3463 3463 4.1666666666666662e-10 3463 2487 -1.0416666666666666e-11 3463 2888 1.0416666666666666e-11 3463 2367 2.2470898404921788e-28 3463 3470 -6.4623485355705287e-27 3463 2375 -6.2500000000000004e-11 3463 3461 -8.3333333333333343e-11 3463 2371 1.0416666666666663e-11 3463 3464 -3.2311742677852644e-27 3463 3466 2.0194839173657902e-27 3463 2482 4.5860624244724788e-28 3463 111 1.0416666666666666e-11 3463 4153 -2.8320667257631078e-28 3463 5047 -2.0833333333333332e-11 3463 4773 4.1666666666666665e-11 3463 5 1.2499999999999998e-10 3463 4350 4.1666666666666665e-11 3464 3464 2.0833333541666665e-02 3464 2375 -2.2851328271989659e-27 3464 2863 -2.0833333333333333e-03 3464 2488 2.0833333333333329e-03 3464 3465 2.0833333333333337e-03 3464 2866 -2.0833333333333329e-03 3464 2865 -6.2499999999999986e-03 3464 3467 -2.0833333333333337e-03 3464 2864 4.1202858928001372e-19 3464 3415 2.0833333333333333e-03 3464 3414 -2.0833333333333337e-03 3464 2366 2.0833333333333333e-03 3464 2367 3.1250000520833335e-03 3464 2371 -4.0414059911758274e-19 3464 3466 -1.0416666666666667e-10 3464 3463 -2.8974861048767764e-27 3464 2482 3.1250000520833326e-03 3464 2487 -1.8812360437258079e-27 3464 111 -7.8879984801803642e-21 3465 3465 2.9166666666666664e-02 3465 2866 4.1666666666666657e-03 3465 2865 1.0416666666666664e-03 3465 2488 1.0416666666666664e-02 3465 2482 2.0833333333333329e-03 3465 3467 4.1666666666666666e-03 3465 3464 2.0833333333333337e-03 3465 2864 1.2659172094511536e-19 3465 51 -1.4465734552327348e-19 3465 563 4.1666666666666649e-03 3465 562 -2.0833333333333329e-03 3465 110 2.0833333333333329e-03 3465 111 1.0416666666666664e-03 3466 3466 4.1666666666666662e-10 3466 2481 -3.6295685768920020e-28 3466 3091 -1.0416666666666667e-10 3466 3096 -1.0034310714411270e-27 3466 2373 -1.8812360437258079e-27 3466 2367 -1.0416666666666667e-10 3466 2375 1.7917989385963757e-27 3466 2371 1.8812360437258079e-27 3466 3464 -1.0416666666666667e-10 3466 3463 2.3107708066186488e-27 3466 2482 -1.0416666666666667e-10 3466 2487 1.0034310714411270e-27 3466 111 1.8812360437258079e-27 3467 3467 2.9166666666666660e-02 3467 2859 2.0833333333333329e-03 3467 3405 4.1666666666666649e-03 3467 3401 -2.0833333333333329e-03 3467 2489 -9.9486666632977745e-20 3467 2488 4.1666666666666657e-03 3467 2482 1.0416666666666664e-03 3467 3465 4.1666666666666666e-03 3467 2866 1.0416666666666664e-02 3467 2865 2.0833333333333329e-03 3467 3464 -2.0833333333333333e-03 3467 2864 1.0416666666666664e-03 3467 111 1.4465734552327348e-19 3468 3468 2.9166666666666664e-02 3468 2866 1.0416666666666664e-02 3468 2869 1.0416666666666664e-03 3468 2488 4.1666666666666657e-03 3468 2490 1.0416666666666664e-03 3468 2489 9.9486666632977745e-20 3468 3405 4.1666666666666666e-03 3468 2859 2.0833333333333329e-03 3468 3402 -2.0833333333333333e-03 3468 43 2.0833333333333329e-03 3468 864 4.1666666666666649e-03 3468 863 -2.0833333333333329e-03 3468 117 -1.4465734552327348e-19 3469 3469 2.9166666666666664e-02 3469 2887 4.1666666666666657e-03 3469 2868 1.0416666666666664e-02 3469 2867 1.0416666666666662e-03 3469 2865 2.0833333333333329e-03 3469 3462 4.1666666666666649e-03 3469 3461 -2.0833333333333329e-03 3469 520 -4.1666666666666675e-03 3469 50 2.0833333333333329e-03 3469 5 -1.4465734552327348e-19 3470 3470 3.3333333333333332e-10 3470 3461 -4.1666666666666678e-11 3470 2371 -1.8812360437258079e-27 3470 2375 -6.2500000000000004e-11 3470 2888 -6.2500000000000004e-11 3470 5 -4.1666666666666665e-11 3471 3471 2.4999999999999996e-10 3472 3472 2.9166666666666664e-02 3472 2486 4.1666666666666657e-03 3472 2490 1.0416666666666664e-03 3472 2475 1.0416666666666664e-02 3472 2474 1.0416666666666664e-03 3472 2471 2.0833333333333329e-03 3472 3459 4.1666666666666649e-03 3472 3458 -2.0833333333333329e-03 3472 2491 -1.4465734552327348e-19 3472 118 9.9486666632977745e-20 3472 941 -4.1666666666666666e-03 3472 480 2.0833333333333329e-03 3472 938 2.0833333333333333e-03 3473 3473 2.9166666666666664e-02 3473 2486 1.0416666666666664e-02 3473 2484 1.0416666666666664e-03 3473 2475 4.1666666666666657e-03 3473 2477 1.0416666666666664e-03 3473 2476 -1.4465734552327348e-19 3473 3099 4.1666666666666649e-03 3473 3098 -2.0833333333333329e-03 3473 2485 2.0833333333333329e-03 3473 112 2.0833333333333329e-03 3473 823 4.1666666666666666e-03 3473 821 -2.0833333333333337e-03 3473 477 1.2659172094511536e-19 3474 3474 6.6666666666666654e-10 3474 2414 6.2499999999999991e-11 3474 2484 6.2499999999999991e-11 3474 2492 -4.1666666666666665e-11 3474 2455 -1.0416666666666666e-11 3474 2485 -1.0416666666666666e-11 3474 3098 8.3333333333333330e-11 3474 3104 1.8175355256292112e-27 3474 2444 -1.0416666666666666e-11 3474 2459 6.2499999999999991e-11 3474 2453 -4.1666666666666665e-11 3474 3085 8.3333333333333330e-11 3474 3084 1.8175355256292112e-27 3474 2405 -1.0416666666666666e-11 3474 221 -1.0416666666666666e-11 3474 1208 -1.0416666666666666e-11 3474 290 -4.1666666666666665e-11 3474 939 -8.3333333333333330e-11 3474 947 1.8175355256292112e-27 3474 1619 -1.0416666666666666e-11 3474 231 6.2499999999999991e-11 3474 228 -4.1666666666666665e-11 3474 821 8.3333333333333330e-11 3474 820 1.8175355256292112e-27 3474 112 -1.0416666666666666e-11 3475 3475 2.0833333333333329e-02 3476 3476 2.9166666666666660e-02 3476 2544 -1.4465734552327348e-19 3476 2541 4.1666666666666657e-03 3476 2540 1.0416666666666664e-03 3476 3478 4.1666666666666675e-03 3476 2539 1.4465734552327348e-19 3476 3479 -4.1666666666666649e-03 3476 2357 1.0416666666666664e-02 3477 3477 2.0833333333333332e-02 3478 3478 2.9166666666666660e-02 3478 2534 2.0833333333333329e-03 3478 3444 4.1666666666666649e-03 3478 3442 -2.0833333333333329e-03 3478 2362 -1.4465734552327348e-19 3478 2357 4.1666666666666657e-03 3478 3476 4.1666666666666675e-03 3478 2541 1.0416666666666664e-02 3478 2540 2.0833333333333329e-03 3478 2539 1.0416666666666662e-03 3479 3479 2.9166666666666664e-02 3479 2540 -2.0833333333333329e-03 3479 2363 -9.9486666632977745e-20 3479 3480 4.1666666666666666e-03 3479 2541 -1.0416666666666664e-02 3479 2543 -2.0833333333333329e-03 3479 3481 2.0833333333333333e-03 3479 2544 -1.0416666666666664e-03 3479 3476 -4.1666666666666649e-03 3479 2357 -4.1666666666666657e-03 3480 3480 2.9166666666666660e-02 3480 3479 4.1666666666666675e-03 3480 3481 -2.0833333333333333e-03 3480 2544 -1.4465734552327348e-19 3480 2541 -4.1666666666666657e-03 3480 2543 -1.0416666666666660e-03 3480 2542 1.2659172094511536e-19 3480 3411 -4.1666666666666649e-03 3480 3412 -2.0833333333333329e-03 3480 2357 -1.0416666666666664e-02 3480 2360 -2.0833333333333329e-03 3480 2363 -1.0416666666666662e-03 3481 3481 4.1666666666666657e-02 3481 2515 -4.1202858928001372e-19 3481 2363 -4.1202858928001372e-19 3481 2525 -2.0833333333333333e-03 3481 2357 2.0833333333333329e-03 3481 3480 -2.0833333333333333e-03 3481 2541 -2.0833333333333329e-03 3481 2543 -6.2500000000000003e-03 3481 3479 2.0833333333333333e-03 3481 2544 2.6745065309554533e-19 3481 3134 2.0833333333333333e-03 3481 3133 -2.0833333333333333e-03 3481 2517 2.0833333333333333e-03 3481 252 -2.0833333333333333e-03 3481 246 2.0833333333333329e-03 3481 667 -2.0833333333333333e-03 3481 253 -2.0833333333333329e-03 3481 270 -6.2500000000000003e-03 3481 661 -2.0833333333333333e-03 3481 250 2.6745065309554533e-19 3481 662 -2.0833333333333333e-03 3481 666 -2.0833333333333333e-03 3481 243 2.0833333333333333e-03 3482 3482 4.1666666666666657e-02 3482 2856 6.2499999999999995e-03 3482 2855 -4.1202858928001372e-19 3482 2513 6.2499999999999995e-03 3482 2512 -4.1202858928001372e-19 3482 2535 -2.0833333333333333e-03 3482 2510 2.0833333333333329e-03 3482 3130 -2.0833333333333333e-03 3482 2524 -2.0833333333333329e-03 3482 2543 -6.2500000000000003e-03 3482 3131 2.0833333333333333e-03 3482 2545 2.6745065309554533e-19 3482 3450 2.0833333333333333e-03 3482 3449 -2.0833333333333333e-03 3482 2854 2.0833333333333333e-03 3482 273 -2.0833333333333333e-03 3482 449 2.0833333333333329e-03 3482 890 -2.0833333333333333e-03 3482 263 -2.0833333333333329e-03 3482 270 -6.2500000000000003e-03 3482 893 2.0833333333333333e-03 3482 274 2.6745065309554533e-19 3482 993 2.0833333333333333e-03 3482 987 2.0833333333333333e-03 3482 280 2.0833333333333333e-03 3483 3483 4.1666666666666657e-02 3483 2513 6.2499999999999986e-03 3483 2514 -4.1202858928001372e-19 3483 2856 6.2499999999999986e-03 3483 2857 -4.1202858928001372e-19 3483 2524 -2.0833333333333333e-03 3483 2854 2.0833333333333329e-03 3483 3451 -2.0833333333333337e-03 3483 2535 -2.0833333333333329e-03 3483 2546 -6.2499999999999995e-03 3483 3450 2.0833333333333337e-03 3483 2545 4.1202858928001372e-19 3483 3131 2.0833333333333337e-03 3483 3132 -2.0833333333333333e-03 3483 2510 2.0833333333333333e-03 3483 202 -2.0833333333333333e-03 3483 283 2.0833333333333329e-03 3483 1001 -2.0833333333333337e-03 3483 209 -2.0833333333333329e-03 3483 212 -6.2499999999999995e-03 3483 994 -2.0833333333333337e-03 3483 213 4.1202858928001372e-19 3483 967 2.0833333333333337e-03 3483 966 -2.0833333333333333e-03 3483 455 2.0833333333333333e-03 3484 3484 4.1666666666666664e-02 3484 2548 -2.6745065309554533e-19 3484 2514 -2.6745065309554533e-19 3484 2531 -2.0833333333333333e-03 3484 2510 2.0833333333333329e-03 3484 3132 -2.0833333333333333e-03 3484 2524 -2.0833333333333329e-03 3484 2546 -6.2500000000000003e-03 3484 3129 2.0833333333333333e-03 3484 2547 3.7587087034409578e-19 3484 3164 2.0833333333333333e-03 3484 3163 -2.0833333333333333e-03 3484 2550 2.0833333333333333e-03 3484 209 -2.0833333333333333e-03 3484 487 2.0833333333333329e-03 3484 1002 -2.0833333333333333e-03 3484 210 -2.0833333333333329e-03 3484 212 -6.2500000000000003e-03 3484 999 -2.0833333333333333e-03 3484 207 3.7587087034409578e-19 3484 1000 -2.0833333333333333e-03 3484 1001 -2.0833333333333333e-03 3484 283 2.0833333333333333e-03 3485 3485 9.1666666666666646e-02 3485 2562 3.1249999999999997e-03 3485 3170 1.2499999999999997e-02 3485 3174 -4.1666666666666675e-03 3485 2589 -5.2083333333333330e-03 3485 2599 4.1666666666666675e-03 3485 2592 -1.0416666666666664e-02 3485 2426 -5.2083333333333322e-03 3485 2871 1.0416666666666664e-03 3485 3428 1.2197274440461925e-19 3485 3431 -8.3333333333333315e-03 3485 2418 1.0416666666666667e-03 3485 2427 4.1666666666666675e-03 3485 2438 -1.0416666666666666e-02 3485 3268 1.2499999999999997e-02 3485 3267 -4.1666666666666657e-03 3485 2566 3.1249999999999997e-03 3485 2570 1.6666666666666663e-02 3485 2576 -2.0833333333333337e-03 3485 3488 -1.2197274440461925e-19 3485 3486 8.3333333333333315e-03 3485 2876 4.1666666666666657e-03 3485 2875 -6.2499999999999995e-03 3486 3486 4.1666666666666657e-02 3486 2599 2.0833333333333329e-03 3486 3249 -1.5502688168223823e-19 3486 2592 -1.0416666666666667e-03 3486 3488 2.0833333333333333e-03 3486 3485 8.3333333333333315e-03 3486 2876 2.0833333333333333e-03 3486 2875 -1.0416666666666669e-03 3487 3487 4.9999999999999989e-02 3487 2347 1.0416666666666664e-03 3487 2566 5.2083333333333322e-03 3487 3263 -2.0833333333333329e-03 3487 3268 -1.2499999999999999e-02 3487 2343 2.0833333333333342e-03 3487 2344 1.0416666666666667e-03 3487 2345 -4.1666666666666666e-03 3487 3171 -2.0833333333333329e-03 3487 3170 -1.2499999999999997e-02 3487 2568 1.4583333333333332e-02 3487 2562 5.2083333333333330e-03 3487 2570 -4.1666666666666675e-03 3488 3488 2.4999999999999998e-02 3488 2592 1.0416666666666667e-03 3488 2599 2.0833333333333329e-03 3488 3489 6.0159191589756597e-20 3488 3486 2.0833333333333337e-03 3488 3485 5.1510191104902139e-20 3488 2876 2.0833333333333320e-03 3488 2875 1.0416666666666664e-03 3489 3489 5.8333333333333320e-02 3489 2589 5.2083333333333322e-03 3489 3172 -2.0833333333333329e-03 3489 3170 -1.2499999999999999e-02 3489 2347 1.0416666666666667e-03 3489 2599 -4.1666666666666657e-03 3489 3488 2.7105054312137611e-20 3489 2876 -4.1666666666666666e-03 3489 3438 -1.3552527156068805e-20 3489 2345 -4.1666666666666675e-03 3490 3490 4.1666666666666657e-02 3490 2587 2.0833333333333329e-03 3490 3495 -2.0833333333333337e-03 3490 3491 8.3333333333333315e-03 3490 2446 2.0833333333333333e-03 3490 2450 9.3750000000000014e-03 3490 2460 -2.1705219273391446e-19 3490 2461 -1.0416666666666671e-03 3490 3264 1.0416666666666666e-02 3490 3263 -2.7807826960562663e-19 3490 2569 9.3749999999999979e-03 3490 2568 -1.0416666666666669e-03 3490 2566 -2.1705219273391446e-19 3491 3491 6.6666666666666652e-02 3491 2622 1.0416666666666669e-03 3491 3492 8.3333333333333315e-03 3491 3498 1.3552527156068805e-20 3491 2628 -6.2500000000000003e-03 3491 2621 4.1666666666666666e-03 3491 3198 -8.3333333333333315e-03 3491 3195 1.3552527156068805e-20 3491 2564 1.0416666666666667e-03 3491 2457 1.0416666666666669e-03 3491 2569 1.0416666666666669e-03 3491 2568 -6.2500000000000003e-03 3491 2587 4.1666666666666666e-03 3491 3490 8.3333333333333315e-03 3491 3495 1.3552527156068805e-20 3491 2450 1.0416666666666667e-03 3491 2461 -6.2500000000000003e-03 3491 2446 4.1666666666666666e-03 3491 3113 -8.3333333333333315e-03 3491 3112 1.3552527156068805e-20 3491 2337 1.0416666666666667e-03 3491 2343 -6.2500000000000003e-03 3491 2340 4.1666666666666666e-03 3492 3492 4.5833333333333323e-02 3492 2340 2.0833333333333329e-03 3492 3498 -2.0833333333333337e-03 3492 3491 8.3333333333333315e-03 3492 2621 2.0833333333333333e-03 3492 2624 5.2083333333333330e-03 3492 2628 -6.5052130349130266e-19 3492 3180 4.1666666666666657e-03 3492 3171 -8.3333333333333315e-03 3492 2343 -2.1684043449710089e-19 3492 2347 1.0416666666666664e-03 3493 3493 2.4999999999999998e-02 3493 2588 -1.0416666666666664e-03 3493 2462 -1.0416666666666664e-03 3493 3279 -2.0833333333333337e-03 3493 3277 -1.0254392617697373e-19 3493 2569 -6.2500000000000003e-03 3493 2567 -1.0416666666666664e-03 3493 2583 -2.0833333333333329e-03 3493 3494 2.0833333333333337e-03 3493 3624 -6.0159191589756597e-20 3493 2450 -6.2500000000000003e-03 3493 2447 -1.0416666666666664e-03 3493 2449 -2.0833333333333329e-03 3494 3494 4.1666666666666664e-02 3494 2583 -2.0833333333333329e-03 3494 2446 -2.0833333333333329e-03 3494 3495 2.0833333333333337e-03 3494 3631 8.3333333333333315e-03 3494 2569 -8.3333333333333315e-03 3494 2588 2.0833333333333337e-03 3494 2587 -2.0833333333333333e-03 3494 3493 2.0833333333333337e-03 3494 3624 8.3333333333333315e-03 3494 2450 -8.3333333333333315e-03 3494 2447 2.0833333333333337e-03 3494 2449 -2.0833333333333333e-03 3495 3495 2.5000000000000001e-02 3495 2568 -1.0416666666666664e-03 3495 3490 -2.0833333333333337e-03 3495 3491 -1.0254392617697373e-19 3495 2461 -1.0416666666666664e-03 3495 2450 -6.2500000000000003e-03 3495 2447 -1.0416666666666664e-03 3495 2446 -2.0833333333333329e-03 3495 3494 2.0833333333333337e-03 3495 3631 -6.0159191589756597e-20 3495 2569 -6.2500000000000003e-03 3495 2588 -1.0416666666666664e-03 3495 2587 -2.0833333333333329e-03 3496 3496 2.0833333333333332e-02 3497 3497 2.4999999999999994e-02 3498 3498 2.5000000000000001e-02 3498 2343 -1.0416666666666664e-03 3498 3492 -2.0833333333333337e-03 3498 3491 -1.0254392617697373e-19 3498 2628 -1.0416666666666664e-03 3498 2621 -2.0833333333333329e-03 3498 3630 -6.0159191589756597e-20 3498 2340 -2.0833333333333329e-03 3499 3499 2.0833333333333332e-02 3500 3500 4.1666666666666657e-02 3500 2738 -2.1684043449710089e-19 3500 2732 -1.0416666666666662e-03 3500 3503 1.3552527156068805e-20 3500 2551 -6.2499999999999995e-03 3500 3231 -2.0833333333333324e-03 3500 3230 -4.1666666666666666e-03 3500 2500 4.1666666666666666e-03 3500 3166 4.3368086899420177e-19 3500 2506 1.0416666666666654e-03 3501 3501 9.1666666666666646e-02 3501 2432 1.0416666666666664e-03 3501 2633 3.1249999999999997e-03 3501 3201 1.2499999999999997e-02 3501 3205 -4.1666666666666657e-03 3501 2428 -5.2083333333333330e-03 3501 2439 4.1666666666666666e-03 3501 2430 -1.0416666666666664e-02 3501 2722 -5.2083333333333330e-03 3501 3505 -1.8973538018496328e-19 3501 3503 8.3333333333333315e-03 3501 2725 4.1666666666666675e-03 3501 2732 -1.0416666666666666e-02 3501 3507 -1.2499999999999999e-02 3501 3502 4.1666666666666657e-03 3501 2636 3.1249999999999997e-03 3501 2639 1.6666666666666666e-02 3501 2646 -2.0833333333333337e-03 3501 3154 1.2197274440461925e-19 3501 3153 -8.3333333333333315e-03 3501 2553 1.0416666666666667e-03 3501 2552 4.1666666666666657e-03 3501 2551 -6.2499999999999995e-03 3502 3502 4.1666666666666657e-02 3502 2686 -5.2083333333333322e-03 3502 2731 -2.1684043449710089e-19 3502 3305 2.3039296165316969e-19 3502 3306 -8.1315162936412833e-20 3502 2684 -4.9904357809065860e-20 3502 2696 1.0416666666666671e-03 3502 2697 -6.2499999999999995e-03 3502 3321 8.3333333333333315e-03 3502 3322 4.3368086899420177e-19 3502 2643 3.1249999999999997e-03 3502 2722 1.0416666666666675e-03 3502 2725 -1.6263032587282567e-19 3502 2732 -1.0416666666666662e-03 3502 3507 -2.0833333333333320e-03 3502 3501 4.1666666666666657e-03 3502 2636 1.2499999999999999e-02 3502 2639 4.1666666666666666e-03 3502 2646 1.0416666666666654e-03 3503 3503 4.1666666666666664e-02 3503 3500 -8.8991399020904929e-20 3503 2552 2.0833333333333329e-03 3503 2551 -1.0416666666666667e-03 3503 3505 2.0833333333333333e-03 3503 3501 8.3333333333333315e-03 3503 2725 2.0833333333333333e-03 3503 2732 -1.0416666666666671e-03 3504 3504 5.8333333333333320e-02 3504 3508 1.3552527156068805e-20 3504 2552 -4.1666666666666666e-03 3504 2815 1.0416666666666664e-03 3504 2817 -4.1666666666666657e-03 3504 3516 -2.0833333333333329e-03 3504 3507 1.2499999999999997e-02 3504 2722 5.2083333333333330e-03 3504 3505 1.3552527156068805e-20 3504 2725 -4.1666666666666675e-03 3505 3505 2.4999999999999998e-02 3505 2552 2.0833333333333329e-03 3505 2551 1.0416666666666667e-03 3505 3503 2.0833333333333337e-03 3505 3501 -4.7253188800459238e-19 3505 2732 1.0416666666666664e-03 3505 3504 -1.0254392617697373e-19 3505 2725 2.0833333333333320e-03 3506 3506 4.9999999999999989e-02 3506 2820 1.0416666666666664e-03 3506 2636 5.2083333333333322e-03 3506 3512 -2.0833333333333329e-03 3506 3507 1.2499999999999999e-02 3506 2811 2.0833333333333342e-03 3506 2815 1.0416666666666667e-03 3506 2817 -4.1666666666666657e-03 3506 3202 -2.0833333333333329e-03 3506 3201 -1.2499999999999997e-02 3506 2637 1.4583333333333334e-02 3506 2633 5.2083333333333330e-03 3506 2639 -4.1666666666666675e-03 3507 3507 8.3333333333333329e-02 3507 2637 5.2083333333333322e-03 3507 3512 -4.1666666666666666e-03 3507 3506 1.2499999999999999e-02 3507 2811 -3.1249999999999997e-03 3507 2815 2.0833333333333342e-03 3507 2817 -1.6666666666666666e-02 3507 3516 -4.1666666666666675e-03 3507 3504 1.2499999999999997e-02 3507 2722 1.4583333333333330e-02 3507 2725 -4.1666666666666675e-03 3507 2732 5.2083333333333330e-03 3507 3502 -2.0833333333333320e-03 3507 3501 -1.2499999999999999e-02 3507 2636 8.3333333333333332e-03 3507 2639 -4.1666666666666666e-03 3507 2646 1.0416666666666667e-03 3508 3508 2.4999999999999998e-02 3508 2561 1.0416666666666664e-03 3508 3534 2.0833333333333337e-03 3508 3509 6.0159191589756597e-20 3508 2819 1.0416666666666662e-03 3508 2817 2.0833333333333329e-03 3508 3504 -1.0254392617697373e-19 3508 2552 2.0833333333333329e-03 3509 3509 5.8333333333333320e-02 3509 2428 5.2083333333333322e-03 3509 3203 -2.0833333333333329e-03 3509 3201 -1.2499999999999999e-02 3509 2820 1.0416666666666667e-03 3509 2432 -1.0416666666666669e-03 3509 2429 1.0416666666666666e-02 3509 2439 -4.1666666666666666e-03 3509 3158 -8.3333333333333315e-03 3509 3154 -2.7105054312137611e-20 3509 2553 -1.0416666666666667e-03 3509 2561 6.2500000000000003e-03 3509 2552 -4.1666666666666666e-03 3509 3534 -8.3333333333333315e-03 3509 3508 2.7105054312137611e-20 3509 2819 4.1666666666666675e-03 3509 2817 -4.1666666666666675e-03 3510 3510 2.0833333333333332e-02 3511 3511 2.0833333333333329e-02 3512 3512 4.1666666666666657e-02 3512 2639 2.7157993871341005e-20 3512 3506 -2.0833333333333329e-03 3512 3507 -4.1666666666666666e-03 3512 2817 4.1666666666666657e-03 3512 2892 4.9904357809065860e-20 3512 2811 1.2499999999999997e-02 3512 2815 1.0416666666666660e-03 3512 3517 4.3368086899420177e-19 3512 2896 -6.2499999999999986e-03 3512 3523 8.3333333333333332e-03 3512 2899 1.0416666666666664e-03 3512 3524 -1.6263032587282567e-19 3512 3513 2.7105054312137611e-20 3512 2638 3.2249014814734037e-20 3512 2637 1.0416666666666667e-03 3512 2636 -1.0416666666666667e-03 3513 3513 4.1666666666666657e-02 3513 2641 5.0116116045879435e-20 3513 3527 -1.0416666666666666e-02 3513 3515 3.1800793213478638e-19 3513 2900 2.1705219273391446e-19 3513 2892 1.0416666666666668e-02 3513 2896 -5.8569019580184656e-19 3513 2899 -2.1705219273391446e-19 3513 3524 1.0416666666666666e-02 3513 3512 -1.3753697481041702e-19 3513 2638 1.0416666666666668e-02 3513 2637 -2.1705219273391446e-19 3513 2636 -4.6263880787845817e-19 3514 3514 4.1666666666666664e-02 3514 2896 -2.6946235634527430e-19 3514 3516 3.1800793213478638e-19 3514 3308 1.3753697481041702e-19 3514 2722 -1.0116749763768550e-19 3515 3515 4.1666666666666657e-02 3515 2710 4.1666666666666666e-03 3515 2638 -2.1684043449710089e-19 3515 3513 2.1684043449710089e-19 3515 2892 2.1684043449710089e-19 3515 2896 -6.2499999999999986e-03 3515 3527 6.5052130349130266e-19 3515 2900 1.0416666666666673e-03 3515 3530 -8.3333333333333315e-03 3515 2718 1.2499999999999997e-02 3515 2721 1.0416666666666662e-03 3515 3288 -2.0833333333333329e-03 3515 3287 -4.1666666666666666e-03 3515 2641 1.0416666666666673e-03 3515 2636 -1.0416666666666667e-03 3515 2640 -2.0761130467597592e-20 3516 3516 4.1666666666666657e-02 3516 2817 4.1666666666666666e-03 3516 3504 -2.0833333333333329e-03 3516 3507 -4.1666666666666666e-03 3516 2725 -2.0761130467597592e-20 3516 2722 -1.0416666666666667e-03 3516 3514 2.1684043449710089e-19 3516 2896 -6.2499999999999986e-03 3516 3517 -4.3368086899420177e-19 3516 2815 1.0416666666666662e-03 3517 3517 3.3333333333333326e-02 3517 2811 4.1666666666666657e-03 3517 3523 -4.1666666666666675e-03 3517 3512 4.3368086899420177e-19 3517 2899 1.6284208410963924e-19 3517 2896 6.2499999999999986e-03 3517 2815 6.2499999999999986e-03 3518 3518 3.3333333333333326e-02 3518 3308 -8.6736173798840355e-19 3518 2896 6.2499999999999986e-03 3518 2900 -2.1705219273391446e-19 3518 3530 4.1666666666666657e-03 3518 2718 4.1666666666666666e-03 3518 2721 6.2499999999999986e-03 3519 3519 2.0833333333333332e-02 3520 3520 2.4999999999999991e-02 3521 3521 2.0833333333333329e-02 3522 3522 2.0833333333333332e-02 3523 3523 4.5833333333333330e-02 3523 2893 -2.0833333333333329e-03 3523 2815 -1.0416666666666667e-03 3523 3517 -4.1666666666666675e-03 3523 2896 -5.2083333333333330e-03 3523 3512 8.3333333333333332e-03 3523 2899 -2.1684043449710089e-19 3523 3372 -2.0833333333333337e-03 3523 3371 8.3333333333333315e-03 3523 2811 4.3368086899420177e-19 3523 2809 -2.0833333333333333e-03 3524 3524 4.1666666666666657e-02 3524 2654 2.0833333333333333e-03 3524 3380 2.0833333333333337e-03 3524 3371 -8.3333333333333315e-03 3524 2893 2.0833333333333329e-03 3524 2892 9.3750000000000014e-03 3524 2896 -2.1705219273391446e-19 3524 2899 -1.0416666666666675e-03 3524 3513 1.0416666666666666e-02 3524 3512 -2.7807826960562663e-19 3524 2638 9.3749999999999997e-03 3524 2637 -1.0416666666666671e-03 3524 2636 -2.1705219273391446e-19 3525 3525 2.4999999999999998e-02 3525 2655 -1.0416666666666664e-03 3525 2900 -1.0416666666666664e-03 3525 3527 2.0833333333333337e-03 3525 3528 -1.0254392617697373e-19 3525 2638 -6.2500000000000003e-03 3525 2641 -1.0416666666666664e-03 3525 2656 -2.0833333333333329e-03 3525 3526 2.0833333333333337e-03 3525 3669 6.0159191589756597e-20 3525 2892 -6.2500000000000003e-03 3525 2891 -1.0416666666666664e-03 3525 2890 -2.0833333333333329e-03 3526 3526 4.1666666666666664e-02 3526 2656 -2.0833333333333333e-03 3526 2893 -2.0833333333333333e-03 3526 3380 -2.0833333333333333e-03 3526 3374 8.3333333333333315e-03 3526 2638 -8.3333333333333315e-03 3526 2655 2.0833333333333337e-03 3526 2654 -2.0833333333333329e-03 3526 3525 2.0833333333333333e-03 3526 3669 -8.3333333333333315e-03 3526 2892 -8.3333333333333315e-03 3526 2891 2.0833333333333337e-03 3526 2890 -2.0833333333333329e-03 3527 3527 4.1666666666666657e-02 3527 2890 -2.0833333333333333e-03 3527 3525 2.0833333333333337e-03 3527 3528 -8.3333333333333315e-03 3527 2656 -2.0833333333333329e-03 3527 2638 -9.3749999999999997e-03 3527 2641 1.0416666666666673e-03 3527 2636 -2.1705219273391446e-19 3527 3513 -1.0416666666666668e-02 3527 2892 -9.3749999999999997e-03 3527 2896 -5.0116116045879435e-20 3527 3515 4.6263880787845817e-19 3527 2900 1.0416666666666667e-03 3528 3528 6.6666666666666652e-02 3528 2649 1.0416666666666669e-03 3528 3531 8.3333333333333315e-03 3528 3621 2.7105054312137611e-20 3528 2955 1.0416666666666667e-03 3528 2965 -6.2500000000000003e-03 3528 2958 4.1666666666666666e-03 3528 2892 1.0416666666666669e-03 3528 3530 8.3333333333333315e-03 3528 3532 2.7105054312137611e-20 3528 2900 -6.2500000000000003e-03 3528 2890 4.1666666666666666e-03 3528 3527 -8.3333333333333315e-03 3528 3525 1.3552527156068805e-20 3528 2638 1.0416666666666667e-03 3528 2641 -6.2500000000000003e-03 3528 2656 4.1666666666666666e-03 3528 3529 8.3333333333333315e-03 3528 3612 1.3552527156068805e-20 3528 2718 -6.2500000000000003e-03 3528 2715 4.1666666666666666e-03 3529 3529 4.1666666666666664e-02 3529 2958 2.0833333333333333e-03 3529 2710 2.0833333333333333e-03 3529 3284 2.0833333333333337e-03 3529 3288 -8.3333333333333315e-03 3529 2965 -2.0833333333333337e-03 3529 2954 2.0833333333333329e-03 3529 3612 -2.0833333333333337e-03 3529 3528 8.3333333333333315e-03 3529 2718 -2.0833333333333337e-03 3529 2715 2.0833333333333329e-03 3530 3530 4.5833333333333323e-02 3530 2715 2.0833333333333329e-03 3530 3532 -2.0833333333333337e-03 3530 3528 8.3333333333333315e-03 3530 2890 2.0833333333333333e-03 3530 2896 5.2083333333333330e-03 3530 2900 -8.6736173798840355e-19 3530 3518 4.1666666666666657e-03 3530 3515 -8.3333333333333315e-03 3530 2718 -2.1684043449710089e-19 3530 2721 1.0416666666666664e-03 3531 3531 4.1666666666666664e-02 3531 2656 2.0833333333333329e-03 3531 3621 -2.0833333333333337e-03 3531 3528 8.3333333333333315e-03 3531 2958 2.0833333333333333e-03 3531 2955 8.3333333333333315e-03 3531 2965 -2.0833333333333337e-03 3531 2954 2.0833333333333329e-03 3531 3290 2.0833333333333337e-03 3531 3288 -8.3333333333333315e-03 3531 2649 8.3333333333333315e-03 3531 2641 -2.0833333333333337e-03 3531 2640 2.0833333333333333e-03 3532 3532 2.4999999999999998e-02 3532 2718 -1.0416666666666664e-03 3532 3530 -2.0833333333333337e-03 3532 3528 6.0159191589756597e-20 3532 2900 -1.0416666666666664e-03 3532 2890 -2.0833333333333329e-03 3532 3671 1.0254392617697373e-19 3532 2715 -2.0833333333333329e-03 3533 3533 2.0833333333333332e-02 3534 3534 4.1666666666666664e-02 3534 2819 -1.0416666666666669e-03 3534 2561 -1.0416666666666669e-03 3534 2552 2.0833333333333333e-03 3534 3508 2.0833333333333337e-03 3534 3509 -8.3333333333333315e-03 3534 2817 2.0833333333333329e-03 3534 210 -2.0833333333333333e-03 3534 147 2.0833333333333329e-03 3534 619 -2.0833333333333333e-03 3534 199 -2.0833333333333329e-03 3534 216 -6.2499999999999986e-03 3534 618 2.0833333333333333e-03 3534 211 2.6745065309554533e-19 3534 1004 2.0833333333333333e-03 3534 1005 -2.0833333333333333e-03 3534 487 2.0833333333333333e-03 3535 3535 6.6666666666666652e-02 3535 3544 2.7105054312137611e-20 3535 2951 -4.1666666666666666e-03 3535 3542 2.7105054312137611e-20 3535 2916 -4.1666666666666666e-03 3535 3546 2.7105054312137611e-20 3535 2795 -4.1666666666666666e-03 3535 3536 2.7105054312137611e-20 3535 2905 -4.1666666666666666e-03 3536 3536 2.4999999999999998e-02 3536 2908 1.0416666666666664e-03 3536 3564 -2.0833333333333337e-03 3536 3537 -1.0254392617697373e-19 3536 2807 1.0416666666666664e-03 3536 2795 2.0833333333333329e-03 3536 3535 6.0159191589756597e-20 3536 2905 2.0833333333333329e-03 3537 3537 6.6666666666666652e-02 3537 2796 -1.0416666666666669e-03 3537 3564 8.3333333333333315e-03 3537 3536 1.3552527156068805e-20 3537 2807 6.2500000000000003e-03 3537 2795 -4.1666666666666666e-03 3537 3595 8.3333333333333315e-03 3537 3540 1.3552527156068805e-20 3537 2578 -1.0416666666666667e-03 3537 2762 -1.0416666666666669e-03 3537 2581 -1.0416666666666669e-03 3537 2582 6.2500000000000003e-03 3537 2579 -4.1666666666666666e-03 3537 3599 8.3333333333333315e-03 3537 3547 1.3552527156068805e-20 3537 2752 -1.0416666666666667e-03 3537 2761 6.2500000000000003e-03 3537 2753 -4.1666666666666666e-03 3537 3601 -8.3333333333333315e-03 3537 3538 1.3552527156068805e-20 3537 2909 -1.0416666666666667e-03 3537 2908 6.2500000000000003e-03 3537 2905 -4.1666666666666666e-03 3538 3538 2.5000000000000001e-02 3538 2910 1.0416666666666664e-03 3538 3604 -2.0833333333333337e-03 3538 3543 6.0159191589756597e-20 3538 2764 1.0416666666666664e-03 3538 2762 6.2500000000000003e-03 3538 2761 1.0416666666666664e-03 3538 2753 2.0833333333333329e-03 3538 3601 2.0833333333333337e-03 3538 3537 -1.0254392617697373e-19 3538 2909 6.2500000000000003e-03 3538 2908 1.0416666666666664e-03 3538 2905 2.0833333333333329e-03 3539 3539 6.6666666666666652e-02 3539 2578 -1.0416666666666669e-03 3539 2680 -1.0416666666666669e-03 3539 3271 8.3333333333333315e-03 3539 3272 -1.3552527156068805e-20 3539 2572 -1.0416666666666667e-03 3539 2577 6.2500000000000003e-03 3539 2579 -4.1666666666666666e-03 3539 2919 -1.0416666666666669e-03 3539 3550 -8.3333333333333315e-03 3539 3546 1.3552527156068805e-20 3539 2917 6.2500000000000003e-03 3539 2916 -4.1666666666666666e-03 3539 3552 -8.3333333333333315e-03 3539 3545 2.7105054312137611e-20 3539 2689 -1.0416666666666667e-03 3539 2688 6.2500000000000003e-03 3539 2687 -4.1666666666666666e-03 3539 3551 -8.3333333333333315e-03 3539 3540 2.7105054312137611e-20 3539 2796 -1.0416666666666667e-03 3539 2793 6.2500000000000003e-03 3539 2795 -4.1666666666666666e-03 3540 3540 2.4999999999999998e-02 3540 2577 1.0416666666666664e-03 3540 2807 1.0416666666666664e-03 3540 3595 -2.0833333333333337e-03 3540 3537 -1.0254392617697373e-19 3540 2578 6.2500000000000003e-03 3540 2582 1.0416666666666664e-03 3540 2579 2.0833333333333329e-03 3540 3551 2.0833333333333337e-03 3540 3539 6.0159191589756597e-20 3540 2796 6.2500000000000003e-03 3540 2793 1.0416666666666664e-03 3540 2795 2.0833333333333329e-03 3541 3541 6.6666666666666652e-02 3541 2643 -1.0416666666666669e-03 3541 2955 -1.0416666666666669e-03 3541 3609 -8.3333333333333315e-03 3541 3548 1.3552527156068805e-20 3541 2649 -1.0416666666666667e-03 3541 2648 6.2500000000000003e-03 3541 2647 -4.1666666666666666e-03 3541 3324 8.3333333333333315e-03 3541 3323 -1.3552527156068805e-20 3541 2686 -1.0416666666666667e-03 3541 2689 -1.0416666666666669e-03 3541 2695 6.2500000000000003e-03 3541 2687 -4.1666666666666666e-03 3541 3559 8.3333333333333315e-03 3541 3545 1.3552527156068805e-20 3541 2919 -1.0416666666666667e-03 3541 2930 6.2500000000000003e-03 3541 2916 -4.1666666666666666e-03 3541 3608 -8.3333333333333315e-03 3541 3542 1.3552527156068805e-20 3541 2952 6.2500000000000003e-03 3541 2951 -4.1666666666666666e-03 3542 3542 2.4999999999999998e-02 3542 2930 1.0416666666666664e-03 3542 3535 6.0159191589756597e-20 3542 2916 2.0833333333333329e-03 3542 3608 2.0833333333333337e-03 3542 3541 -1.0254392617697373e-19 3542 2952 1.0416666666666664e-03 3542 2951 2.0833333333333329e-03 3543 3543 6.6666666666666652e-02 3543 2754 -1.0416666666666669e-03 3543 2909 -1.0416666666666669e-03 3543 3604 8.3333333333333315e-03 3543 3538 2.7105054312137611e-20 3543 2762 -1.0416666666666667e-03 3543 2764 6.2500000000000003e-03 3543 2753 -4.1666666666666666e-03 3543 3319 8.3333333333333315e-03 3543 3316 -1.3552527156068805e-20 3543 2645 -1.0416666666666667e-03 3543 2649 -1.0416666666666669e-03 3543 2650 6.2500000000000003e-03 3543 2647 -4.1666666666666666e-03 3543 3620 8.3333333333333315e-03 3543 3548 2.7105054312137611e-20 3543 2955 -1.0416666666666667e-03 3543 2964 6.2500000000000003e-03 3543 2951 -4.1666666666666666e-03 3543 3614 8.3333333333333315e-03 3543 3544 1.3552527156068805e-20 3543 2910 6.2500000000000003e-03 3543 2905 -4.1666666666666666e-03 3544 3544 2.4999999999999998e-02 3544 2964 1.0416666666666664e-03 3544 3535 6.0159191589756597e-20 3544 2951 2.0833333333333329e-03 3544 3614 -2.0833333333333337e-03 3544 3543 -1.0254392617697373e-19 3544 2910 1.0416666666666664e-03 3544 2905 2.0833333333333329e-03 3545 3545 2.5000000000000001e-02 3545 2695 1.0416666666666664e-03 3545 3559 -2.0833333333333337e-03 3545 3541 -1.0254392617697373e-19 3545 2930 1.0416666666666664e-03 3545 2919 6.2500000000000003e-03 3545 2917 1.0416666666666664e-03 3545 2916 2.0833333333333329e-03 3545 3552 2.0833333333333337e-03 3545 3539 6.0159191589756597e-20 3545 2689 6.2500000000000003e-03 3545 2688 1.0416666666666664e-03 3545 2687 2.0833333333333329e-03 3546 3546 2.4999999999999998e-02 3546 3535 6.0159191589756597e-20 3546 2793 1.0416666666666664e-03 3546 2795 2.0833333333333329e-03 3546 3550 2.0833333333333337e-03 3546 3539 -1.0254392617697373e-19 3546 2917 1.0416666666666664e-03 3546 2916 2.0833333333333329e-03 3547 3547 2.4999999999999998e-02 3547 2582 1.0416666666666664e-03 3547 3599 -2.0833333333333337e-03 3547 3537 -1.0254392617697373e-19 3547 2761 1.0416666666666664e-03 3547 2752 6.2500000000000003e-03 3547 2751 1.0416666666666664e-03 3547 2753 2.0833333333333329e-03 3547 3312 2.0833333333333337e-03 3547 3313 -6.0159191589756597e-20 3547 2581 6.2500000000000003e-03 3547 2580 1.0416666666666662e-03 3547 2579 2.0833333333333329e-03 3548 3548 2.5000000000000001e-02 3548 2650 1.0416666666666664e-03 3548 3620 -2.0833333333333337e-03 3548 3543 6.0159191589756597e-20 3548 2964 1.0416666666666664e-03 3548 2955 6.2500000000000003e-03 3548 2952 1.0416666666666664e-03 3548 2951 2.0833333333333329e-03 3548 3609 2.0833333333333337e-03 3548 3541 -1.0254392617697373e-19 3548 2649 6.2500000000000003e-03 3548 2648 1.0416666666666664e-03 3548 2647 2.0833333333333329e-03 3549 3549 6.6666666666666652e-02 3549 2572 1.0416666666666669e-03 3549 2796 1.0416666666666669e-03 3549 3551 8.3333333333333315e-03 3549 3571 -2.7105054312137611e-20 3549 2578 1.0416666666666667e-03 3549 2577 -6.2500000000000003e-03 3549 2571 4.1666666666666666e-03 3549 3271 -8.3333333333333315e-03 3549 3270 1.3552527156068805e-20 3549 2680 1.0416666666666667e-03 3549 2689 1.0416666666666669e-03 3549 2688 -6.2500000000000003e-03 3549 2690 4.1666666666666666e-03 3549 3552 8.3333333333333315e-03 3549 3556 2.7105054312137611e-20 3549 2919 1.0416666666666667e-03 3549 2917 -6.2500000000000003e-03 3549 2921 4.1666666666666666e-03 3549 3550 8.3333333333333315e-03 3549 3553 1.3552527156068805e-20 3549 2793 -6.2500000000000003e-03 3549 2792 4.1666666666666666e-03 3550 3550 4.1666666666666664e-02 3550 2921 2.0833333333333333e-03 3550 2795 2.0833333333333333e-03 3550 3546 2.0833333333333337e-03 3550 3539 -8.3333333333333315e-03 3550 2917 -2.0833333333333337e-03 3550 2916 2.0833333333333329e-03 3550 3553 -2.0833333333333337e-03 3550 3549 8.3333333333333315e-03 3550 2793 -2.0833333333333337e-03 3550 2792 2.0833333333333329e-03 3551 3551 4.1666666666666664e-02 3551 2579 2.0833333333333329e-03 3551 2792 2.0833333333333329e-03 3551 3571 2.0833333333333337e-03 3551 3549 8.3333333333333315e-03 3551 2578 8.3333333333333315e-03 3551 2577 -2.0833333333333337e-03 3551 2571 2.0833333333333333e-03 3551 3540 2.0833333333333337e-03 3551 3539 -8.3333333333333315e-03 3551 2796 8.3333333333333315e-03 3551 2793 -2.0833333333333337e-03 3551 2795 2.0833333333333333e-03 3552 3552 4.1666666666666664e-02 3552 2690 2.0833333333333329e-03 3552 3556 -2.0833333333333337e-03 3552 3549 8.3333333333333315e-03 3552 2921 2.0833333333333333e-03 3552 2919 8.3333333333333315e-03 3552 2917 -2.0833333333333337e-03 3552 2916 2.0833333333333329e-03 3552 3545 2.0833333333333337e-03 3552 3539 -8.3333333333333315e-03 3552 2689 8.3333333333333315e-03 3552 2688 -2.0833333333333337e-03 3552 2687 2.0833333333333333e-03 3553 3553 2.4999999999999998e-02 3553 2917 -1.0416666666666664e-03 3553 3566 -6.0159191589756597e-20 3553 2921 -2.0833333333333329e-03 3553 3550 -2.0833333333333337e-03 3553 3549 -1.0254392617697373e-19 3553 2793 -1.0416666666666664e-03 3553 2792 -2.0833333333333329e-03 3554 3554 2.0833333333333332e-02 3555 3555 2.0833333333333332e-02 3556 3556 2.5000000000000001e-02 3556 2688 -1.0416666666666664e-03 3556 3552 -2.0833333333333337e-03 3556 3549 6.0159191589756597e-20 3556 2917 -1.0416666666666664e-03 3556 2919 -6.2500000000000003e-03 3556 2922 -1.0416666666666664e-03 3556 2921 -2.0833333333333329e-03 3556 3557 2.0833333333333337e-03 3556 3568 1.0254392617697373e-19 3556 2689 -6.2500000000000003e-03 3556 2691 -1.0416666666666664e-03 3556 2690 -2.0833333333333329e-03 3557 3557 4.1666666666666664e-02 3557 2692 -2.0833333333333329e-03 3557 3558 2.0833333333333337e-03 3557 3572 -8.3333333333333315e-03 3557 2925 -2.0833333333333333e-03 3557 2919 -8.3333333333333315e-03 3557 2922 2.0833333333333333e-03 3557 2921 -2.0833333333333329e-03 3557 3556 2.0833333333333337e-03 3557 3568 8.3333333333333315e-03 3557 2689 -8.3333333333333315e-03 3557 2691 2.0833333333333333e-03 3557 2690 -2.0833333333333333e-03 3558 3558 2.5000000000000001e-02 3558 2927 -1.0416666666666664e-03 3558 3300 -2.0833333333333337e-03 3558 3297 6.0159191589756597e-20 3558 2683 -1.0416666666666664e-03 3558 2689 -6.2500000000000003e-03 3558 2691 -1.0416666666666664e-03 3558 2692 -2.0833333333333329e-03 3558 3557 2.0833333333333337e-03 3558 3572 -1.0254392617697373e-19 3558 2919 -6.2500000000000003e-03 3558 2922 -1.0416666666666664e-03 3558 2925 -2.0833333333333329e-03 3559 3559 4.1666666666666664e-02 3559 2687 -2.0833333333333329e-03 3559 3545 -2.0833333333333337e-03 3559 3541 8.3333333333333315e-03 3559 2916 -2.0833333333333333e-03 3559 2919 -8.3333333333333315e-03 3559 2930 2.0833333333333333e-03 3559 2929 -2.0833333333333329e-03 3559 3293 -2.0833333333333337e-03 3559 3289 8.3333333333333315e-03 3559 2689 -8.3333333333333315e-03 3559 2695 2.0833333333333333e-03 3559 2682 -2.0833333333333333e-03 3560 3560 2.0833333333333332e-02 3561 3561 2.0833333333333332e-02 3562 3562 2.0833333333333332e-02 3563 3563 2.4999999999999998e-02 3563 3629 -6.0159191589756597e-20 3563 2807 -1.0416666666666664e-03 3563 2799 -2.0833333333333329e-03 3563 3564 2.0833333333333337e-03 3563 3602 -1.0254392617697373e-19 3563 2908 -1.0416666666666664e-03 3563 2912 -2.0833333333333329e-03 3564 3564 4.1666666666666664e-02 3564 2799 -2.0833333333333329e-03 3564 2905 -2.0833333333333329e-03 3564 3536 -2.0833333333333337e-03 3564 3537 8.3333333333333315e-03 3564 2807 2.0833333333333337e-03 3564 2795 -2.0833333333333333e-03 3564 3563 2.0833333333333337e-03 3564 3602 -8.3333333333333315e-03 3564 2908 2.0833333333333337e-03 3564 2912 -2.0833333333333333e-03 3565 3565 2.0833333333333332e-02 3566 3566 6.6666666666666652e-02 3566 3356 -2.7105054312137611e-20 3566 2792 -4.1666666666666666e-03 3566 3553 -2.7105054312137611e-20 3566 2921 -4.1666666666666666e-03 3566 3570 2.7105054312137611e-20 3566 2936 -4.1666666666666666e-03 3566 3567 2.7105054312137611e-20 3566 2611 -4.1666666666666666e-03 3567 3567 2.4999999999999998e-02 3567 3183 1.0254392617697373e-19 3567 2936 2.0833333333333329e-03 3567 3566 6.0159191589756597e-20 3567 2611 2.0833333333333329e-03 3568 3568 6.6666666666666652e-02 3568 2677 -1.0416666666666669e-03 3568 3246 8.3333333333333315e-03 3568 3247 -1.3552527156068805e-20 3568 2593 -1.0416666666666667e-03 3568 2602 6.2500000000000003e-03 3568 2605 -4.1666666666666666e-03 3568 2919 -1.0416666666666669e-03 3568 3573 -8.3333333333333315e-03 3568 3570 1.3552527156068805e-20 3568 2922 6.2500000000000003e-03 3568 2921 -4.1666666666666666e-03 3568 3557 8.3333333333333315e-03 3568 3556 -1.3552527156068805e-20 3568 2689 -1.0416666666666667e-03 3568 2691 6.2500000000000003e-03 3568 2690 -4.1666666666666666e-03 3568 3574 -8.3333333333333315e-03 3568 3569 1.3552527156068805e-20 3568 2934 6.2500000000000003e-03 3568 2936 -4.1666666666666666e-03 3569 3569 2.4999999999999998e-02 3569 2602 1.0416666666666664e-03 3569 3183 -6.0159191589756597e-20 3569 2605 2.0833333333333329e-03 3569 3574 2.0833333333333337e-03 3569 3568 -1.0254392617697373e-19 3569 2934 1.0416666666666664e-03 3569 2936 2.0833333333333329e-03 3570 3570 2.4999999999999998e-02 3570 3566 6.0159191589756597e-20 3570 2934 1.0416666666666664e-03 3570 2936 2.0833333333333329e-03 3570 3573 2.0833333333333337e-03 3570 3568 -1.0254392617697373e-19 3570 2922 1.0416666666666664e-03 3570 2921 2.0833333333333329e-03 3571 3571 2.5000000000000001e-02 3571 2563 1.0416666666666664e-03 3571 3194 2.0833333333333337e-03 3571 3192 1.0254392617697373e-19 3571 2806 1.0416666666666664e-03 3571 2796 6.2500000000000003e-03 3571 2793 1.0416666666666664e-03 3571 2792 2.0833333333333329e-03 3571 3551 2.0833333333333337e-03 3571 3549 -6.0159191589756597e-20 3571 2578 6.2500000000000003e-03 3571 2577 1.0416666666666664e-03 3571 2571 2.0833333333333329e-03 3572 3572 6.6666666666666652e-02 3572 2593 1.0416666666666669e-03 3572 3574 8.3333333333333315e-03 3572 3585 -1.3552527156068805e-20 3572 2602 -6.2500000000000003e-03 3572 2601 4.1666666666666666e-03 3572 3246 -8.3333333333333315e-03 3572 3245 1.3552527156068805e-20 3572 2677 1.0416666666666667e-03 3572 2689 1.0416666666666669e-03 3572 2691 -6.2500000000000003e-03 3572 2692 4.1666666666666666e-03 3572 3557 -8.3333333333333315e-03 3572 3558 1.3552527156068805e-20 3572 2919 1.0416666666666667e-03 3572 2922 -6.2500000000000003e-03 3572 2925 4.1666666666666666e-03 3572 3573 8.3333333333333315e-03 3572 3575 1.3552527156068805e-20 3572 2934 -6.2500000000000003e-03 3572 2933 4.1666666666666666e-03 3573 3573 4.1666666666666664e-02 3573 2925 2.0833333333333329e-03 3573 2936 2.0833333333333329e-03 3573 3570 2.0833333333333337e-03 3573 3568 -8.3333333333333315e-03 3573 2922 -2.0833333333333337e-03 3573 2921 2.0833333333333333e-03 3573 3575 -2.0833333333333337e-03 3573 3572 8.3333333333333315e-03 3573 2934 -2.0833333333333337e-03 3573 2933 2.0833333333333333e-03 3574 3574 4.1666666666666664e-02 3574 2605 2.0833333333333329e-03 3574 2933 2.0833333333333329e-03 3574 3585 2.0833333333333337e-03 3574 3572 8.3333333333333315e-03 3574 2602 -2.0833333333333333e-03 3574 2601 2.0833333333333333e-03 3574 3569 2.0833333333333337e-03 3574 3568 -8.3333333333333315e-03 3574 2934 -2.0833333333333333e-03 3574 2936 2.0833333333333333e-03 3575 3575 2.4999999999999998e-02 3575 2922 -1.0416666666666664e-03 3575 3581 -6.0159191589756597e-20 3575 2925 -2.0833333333333329e-03 3575 3573 -2.0833333333333337e-03 3575 3572 -1.0254392617697373e-19 3575 2934 -1.0416666666666664e-03 3575 2933 -2.0833333333333329e-03 3576 3576 2.0833333333333332e-02 3577 3577 2.0833333333333332e-02 3578 3578 2.0833333333333332e-02 3579 3579 6.6666666666666652e-02 3579 3584 2.7105054312137611e-20 3579 2699 -4.1666666666666666e-03 3579 3241 -1.3552527156068805e-20 3579 2601 -4.1666666666666666e-03 3579 3585 2.7105054312137611e-20 3579 2933 -4.1666666666666666e-03 3579 3580 1.3552527156068805e-20 3579 2944 -4.1666666666666666e-03 3580 3580 2.4999999999999998e-02 3580 3581 6.0159191589756597e-20 3580 2933 2.0833333333333329e-03 3580 3579 -1.0254392617697373e-19 3580 2944 2.0833333333333329e-03 3581 3581 6.6666666666666652e-02 3581 3586 2.7105054312137611e-20 3581 2742 -4.1666666666666666e-03 3581 3580 2.7105054312137611e-20 3581 2933 -4.1666666666666666e-03 3581 3575 -2.7105054312137611e-20 3581 2925 -4.1666666666666666e-03 3581 3582 2.7105054312137611e-20 3581 2944 -4.1666666666666666e-03 3582 3582 2.4999999999999998e-02 3582 3583 -1.0254392617697373e-19 3582 2742 2.0833333333333329e-03 3582 3581 6.0159191589756597e-20 3582 2944 2.0833333333333329e-03 3583 3583 6.6666666666666652e-02 3583 3582 1.3552527156068805e-20 3583 2742 -4.1666666666666666e-03 3583 3301 -1.3552527156068805e-20 3583 2734 -4.1666666666666666e-03 3583 3587 1.3552527156068805e-20 3583 2699 -4.1666666666666666e-03 3583 3584 1.3552527156068805e-20 3583 2944 -4.1666666666666666e-03 3584 3584 2.4999999999999998e-02 3584 3579 6.0159191589756597e-20 3584 2699 2.0833333333333329e-03 3584 3583 -1.0254392617697373e-19 3584 2944 2.0833333333333329e-03 3585 3585 2.5000000000000001e-02 3585 3579 6.0159191589756597e-20 3585 2934 1.0416666666666664e-03 3585 2933 2.0833333333333329e-03 3585 3574 2.0833333333333337e-03 3585 3572 1.0254392617697373e-19 3585 2602 1.0416666666666664e-03 3585 2601 2.0833333333333329e-03 3586 3586 2.4999999999999998e-02 3586 3581 6.0159191589756597e-20 3586 2740 1.0416666666666664e-03 3586 2742 2.0833333333333329e-03 3586 3296 2.0833333333333337e-03 3586 3297 1.0254392617697373e-19 3586 2927 1.0416666666666664e-03 3586 2925 2.0833333333333329e-03 3587 3587 2.4999999999999998e-02 3587 3583 -1.0254392617697373e-19 3587 2700 1.0416666666666664e-03 3587 2699 2.0833333333333329e-03 3587 3238 2.0833333333333337e-03 3587 3236 -6.0159191589756597e-20 3587 2735 1.0416666666666662e-03 3587 2734 2.0833333333333329e-03 3588 3588 2.0833333333333332e-02 3589 3589 2.0833333333333332e-02 3590 3590 2.0833333333333332e-02 3591 3591 2.0833333333333332e-02 3592 3592 2.0833333333333332e-02 3593 3593 2.0833333333333332e-02 3594 3594 2.0833333333333332e-02 3595 3595 4.1666666666666664e-02 3595 2585 -2.0833333333333329e-03 3595 3596 2.0833333333333337e-03 3595 3602 -8.3333333333333315e-03 3595 2799 -2.0833333333333333e-03 3595 2796 -8.3333333333333315e-03 3595 2807 2.0833333333333333e-03 3595 2795 -2.0833333333333329e-03 3595 3540 -2.0833333333333337e-03 3595 3537 8.3333333333333315e-03 3595 2578 -8.3333333333333315e-03 3595 2582 2.0833333333333333e-03 3595 2579 -2.0833333333333333e-03 3596 3596 2.5000000000000001e-02 3596 2582 -1.0416666666666664e-03 3596 3595 2.0833333333333337e-03 3596 3602 -1.0254392617697373e-19 3596 2807 -1.0416666666666664e-03 3596 2796 -6.2500000000000003e-03 3596 2798 -1.0416666666666664e-03 3596 2799 -2.0833333333333329e-03 3596 3342 -2.0833333333333337e-03 3596 3343 6.0159191589756597e-20 3596 2578 -6.2500000000000003e-03 3596 2586 -1.0416666666666664e-03 3596 2585 -2.0833333333333329e-03 3597 3597 2.4999999999999998e-02 3597 2584 -1.0416666666666664e-03 3597 2761 -1.0416666666666664e-03 3597 3599 2.0833333333333337e-03 3597 3602 -1.0254392617697373e-19 3597 2581 -6.2500000000000003e-03 3597 2582 -1.0416666666666664e-03 3597 2585 -2.0833333333333329e-03 3597 3598 2.0833333333333337e-03 3597 3628 -6.0159191589756597e-20 3597 2752 -6.2500000000000003e-03 3597 2756 -1.0416666666666662e-03 3597 2755 -2.0833333333333329e-03 3598 3598 4.1666666666666664e-02 3598 2585 -2.0833333333333333e-03 3598 2765 -2.0833333333333333e-03 3598 3600 2.0833333333333337e-03 3598 3625 8.3333333333333315e-03 3598 2581 -8.3333333333333315e-03 3598 2584 2.0833333333333337e-03 3598 2583 -2.0833333333333329e-03 3598 3597 2.0833333333333337e-03 3598 3628 8.3333333333333315e-03 3598 2752 -8.3333333333333315e-03 3598 2756 2.0833333333333337e-03 3598 2755 -2.0833333333333329e-03 3599 3599 4.1666666666666664e-02 3599 2755 -2.0833333333333329e-03 3599 3597 2.0833333333333337e-03 3599 3602 -8.3333333333333315e-03 3599 2585 -2.0833333333333333e-03 3599 2581 -8.3333333333333315e-03 3599 2582 2.0833333333333337e-03 3599 2579 -2.0833333333333329e-03 3599 3547 -2.0833333333333337e-03 3599 3537 8.3333333333333315e-03 3599 2752 -8.3333333333333315e-03 3599 2761 2.0833333333333337e-03 3599 2753 -2.0833333333333333e-03 3600 3600 2.4999999999999998e-02 3600 2567 -1.0416666666666664e-03 3600 3280 -2.0833333333333337e-03 3600 3277 -1.0254392617697373e-19 3600 2763 -1.0416666666666664e-03 3600 2752 -6.2500000000000003e-03 3600 2756 -1.0416666666666664e-03 3600 2765 -2.0833333333333329e-03 3600 3598 2.0833333333333337e-03 3600 3625 -6.0159191589756597e-20 3600 2581 -6.2500000000000003e-03 3600 2584 -1.0416666666666662e-03 3600 2583 -2.0833333333333329e-03 3601 3601 4.1666666666666664e-02 3601 2912 2.0833333333333329e-03 3601 3605 2.0833333333333337e-03 3601 3602 8.3333333333333315e-03 3601 2755 2.0833333333333333e-03 3601 2762 8.3333333333333315e-03 3601 2761 -2.0833333333333333e-03 3601 2753 2.0833333333333329e-03 3601 3538 2.0833333333333337e-03 3601 3537 -8.3333333333333315e-03 3601 2909 8.3333333333333315e-03 3601 2908 -2.0833333333333333e-03 3601 2905 2.0833333333333333e-03 3602 3602 6.6666666666666652e-02 3602 2752 1.0416666666666669e-03 3602 2909 1.0416666666666669e-03 3602 3601 8.3333333333333315e-03 3602 3605 -1.3552527156068805e-20 3602 2762 1.0416666666666667e-03 3602 2761 -6.2500000000000003e-03 3602 2755 4.1666666666666666e-03 3602 3599 -8.3333333333333315e-03 3602 3597 1.3552527156068805e-20 3602 2581 1.0416666666666667e-03 3602 2578 1.0416666666666669e-03 3602 2582 -6.2500000000000003e-03 3602 2585 4.1666666666666666e-03 3602 3595 -8.3333333333333315e-03 3602 3596 1.3552527156068805e-20 3602 2796 1.0416666666666667e-03 3602 2807 -6.2500000000000003e-03 3602 2799 4.1666666666666666e-03 3602 3564 -8.3333333333333315e-03 3602 3563 1.3552527156068805e-20 3602 2908 -6.2500000000000003e-03 3602 2912 4.1666666666666666e-03 3603 3603 2.5000000000000001e-02 3603 2909 6.2500000000000003e-03 3603 2913 2.0833333333333329e-03 3603 2762 6.2500000000000003e-03 3603 2766 2.0833333333333329e-03 3603 2764 1.0416666666666664e-03 3603 3604 -2.0833333333333337e-03 3603 3622 -6.0159191589756597e-20 3603 2910 1.0416666666666664e-03 3603 3832 1.0416666666666664e-03 3603 4522 2.0833333333333337e-03 3603 4523 1.0254392617697373e-19 3603 3868 1.0416666666666664e-03 3604 3604 4.1666666666666664e-02 3604 2766 -2.0833333333333329e-03 3604 2905 -2.0833333333333329e-03 3604 3538 -2.0833333333333337e-03 3604 3543 8.3333333333333315e-03 3604 2762 -8.3333333333333315e-03 3604 2764 2.0833333333333337e-03 3604 2753 -2.0833333333333333e-03 3604 3603 -2.0833333333333337e-03 3604 3622 -8.3333333333333315e-03 3604 2909 -8.3333333333333315e-03 3604 2910 2.0833333333333337e-03 3604 2913 -2.0833333333333333e-03 3605 3605 2.5000000000000001e-02 3605 2762 6.2500000000000003e-03 3605 2755 2.0833333333333329e-03 3605 2909 6.2500000000000003e-03 3605 2912 2.0833333333333329e-03 3605 2908 1.0416666666666664e-03 3605 3601 2.0833333333333337e-03 3605 3602 1.0254392617697373e-19 3605 2761 1.0416666666666664e-03 3605 3869 1.0416666666666664e-03 3605 4526 -2.0833333333333337e-03 3605 4527 6.0159191589756597e-20 3605 3833 1.0416666666666664e-03 3606 3606 2.0833333333333332e-02 3607 3607 2.0833333333333332e-02 3608 3608 4.1666666666666664e-02 3608 2916 2.0833333333333329e-03 3608 2954 2.0833333333333329e-03 3608 3294 2.0833333333333337e-03 3608 3289 -8.3333333333333315e-03 3608 2930 -2.0833333333333337e-03 3608 2929 2.0833333333333333e-03 3608 3542 2.0833333333333337e-03 3608 3541 -8.3333333333333315e-03 3608 2952 -2.0833333333333337e-03 3608 2951 2.0833333333333333e-03 3609 3609 4.1666666666666664e-02 3609 2640 2.0833333333333329e-03 3609 2951 2.0833333333333329e-03 3609 3548 2.0833333333333337e-03 3609 3541 -8.3333333333333315e-03 3609 2649 8.3333333333333315e-03 3609 2648 -2.0833333333333333e-03 3609 2647 2.0833333333333333e-03 3609 3290 2.0833333333333337e-03 3609 3289 -8.3333333333333315e-03 3609 2955 8.3333333333333315e-03 3609 2952 -2.0833333333333333e-03 3609 2954 2.0833333333333333e-03 3610 3610 2.0833333333333332e-02 3611 3611 2.0833333333333332e-02 3612 3612 2.4999999999999998e-02 3612 3676 -6.0159191589756597e-20 3612 2965 -1.0416666666666664e-03 3612 2958 -2.0833333333333329e-03 3612 3529 -2.0833333333333337e-03 3612 3528 -1.0254392617697373e-19 3612 2718 -1.0416666666666664e-03 3612 2715 -2.0833333333333329e-03 3613 3613 2.0833333333333332e-02 3614 3614 4.1666666666666664e-02 3614 2913 -2.0833333333333333e-03 3614 3615 2.0833333333333337e-03 3614 3622 -8.3333333333333315e-03 3614 2956 -2.0833333333333329e-03 3614 2964 2.0833333333333337e-03 3614 2951 -2.0833333333333333e-03 3614 3544 -2.0833333333333337e-03 3614 3543 8.3333333333333315e-03 3614 2910 2.0833333333333337e-03 3614 2905 -2.0833333333333329e-03 3615 3615 2.4999999999999998e-02 3615 2910 -1.0416666666666664e-03 3615 3614 2.0833333333333337e-03 3615 3622 -1.0254392617697373e-19 3615 2964 -1.0416666666666664e-03 3615 2956 -2.0833333333333329e-03 3615 3691 -6.0159191589756597e-20 3615 2913 -2.0833333333333329e-03 3616 3616 2.0833333333333332e-02 3617 3617 2.0833333333333332e-02 3618 3618 2.4999999999999998e-02 3618 2657 -1.0416666666666664e-03 3618 2964 -1.0416666666666664e-03 3618 3620 2.0833333333333337e-03 3618 3622 6.0159191589756597e-20 3618 2649 -6.2500000000000003e-03 3618 2650 -1.0416666666666664e-03 3618 2658 -2.0833333333333329e-03 3618 3619 2.0833333333333337e-03 3618 3688 -1.0254392617697373e-19 3618 2955 -6.2500000000000003e-03 3618 2957 -1.0416666666666664e-03 3618 2956 -2.0833333333333329e-03 3619 3619 4.1666666666666664e-02 3619 2658 -2.0833333333333329e-03 3619 2958 -2.0833333333333329e-03 3619 3621 2.0833333333333337e-03 3619 3674 8.3333333333333315e-03 3619 2649 -8.3333333333333315e-03 3619 2657 2.0833333333333333e-03 3619 2656 -2.0833333333333333e-03 3619 3618 2.0833333333333337e-03 3619 3688 -8.3333333333333315e-03 3619 2955 -8.3333333333333315e-03 3619 2957 2.0833333333333333e-03 3619 2956 -2.0833333333333333e-03 3620 3620 4.1666666666666664e-02 3620 2956 -2.0833333333333329e-03 3620 3618 2.0833333333333337e-03 3620 3622 -8.3333333333333315e-03 3620 2658 -2.0833333333333333e-03 3620 2649 -8.3333333333333315e-03 3620 2650 2.0833333333333337e-03 3620 2647 -2.0833333333333329e-03 3620 3548 -2.0833333333333337e-03 3620 3543 8.3333333333333315e-03 3620 2955 -8.3333333333333315e-03 3620 2964 2.0833333333333337e-03 3620 2951 -2.0833333333333333e-03 3621 3621 2.5000000000000001e-02 3621 2641 -1.0416666666666664e-03 3621 3531 -2.0833333333333337e-03 3621 3528 6.0159191589756597e-20 3621 2965 -1.0416666666666664e-03 3621 2955 -6.2500000000000003e-03 3621 2957 -1.0416666666666664e-03 3621 2958 -2.0833333333333329e-03 3621 3619 2.0833333333333337e-03 3621 3674 1.0254392617697373e-19 3621 2649 -6.2500000000000003e-03 3621 2657 -1.0416666666666664e-03 3621 2656 -2.0833333333333329e-03 3622 3622 6.6666666666666652e-02 3622 2955 1.0416666666666669e-03 3622 3614 -8.3333333333333315e-03 3622 3615 1.3552527156068805e-20 3622 2964 -6.2500000000000003e-03 3622 2956 4.1666666666666666e-03 3622 3620 -8.3333333333333315e-03 3622 3618 2.7105054312137611e-20 3622 2649 1.0416666666666667e-03 3622 2762 1.0416666666666669e-03 3622 2645 1.0416666666666669e-03 3622 2650 -6.2500000000000003e-03 3622 2658 4.1666666666666666e-03 3622 3319 -8.3333333333333315e-03 3622 3320 1.3552527156068805e-20 3622 2754 1.0416666666666667e-03 3622 2764 -6.2500000000000003e-03 3622 2766 4.1666666666666666e-03 3622 3604 -8.3333333333333315e-03 3622 3603 -2.7105054312137611e-20 3622 2909 1.0416666666666667e-03 3622 2910 -6.2500000000000003e-03 3622 2913 4.1666666666666666e-03 3623 3623 6.6666666666666652e-02 3623 2412 6.2500000000000003e-03 3623 2410 -4.1666666666666666e-03 3623 2998 6.2500000000000003e-03 3623 2994 -4.1666666666666666e-03 3623 2455 -1.0416666666666669e-03 3623 2996 -1.0416666666666669e-03 3623 3659 8.3333333333333315e-03 3623 3627 2.7105054312137611e-20 3623 2448 -1.0416666666666667e-03 3623 2463 6.2500000000000003e-03 3623 2449 -4.1666666666666666e-03 3623 3083 8.3333333333333315e-03 3623 3082 -2.7105054312137611e-20 3623 2405 -1.0416666666666667e-03 3623 3801 -1.0416666666666669e-03 3623 3777 -1.0416666666666669e-03 3623 4466 8.3333333333333315e-03 3623 4463 -2.7105054312137611e-20 3623 3807 -1.0416666666666667e-03 3623 3813 6.2500000000000003e-03 3623 3800 -4.1666666666666666e-03 3623 4942 8.3333333333333315e-03 3623 4896 2.7105054312137611e-20 3623 4176 -1.0416666666666667e-03 3624 3624 6.6666666666666652e-02 3624 2569 -1.0416666666666669e-03 3624 2771 -1.0416666666666669e-03 3624 3366 8.3333333333333315e-03 3624 3362 -1.3552527156068805e-20 3624 2575 -1.0416666666666667e-03 3624 2588 6.2500000000000003e-03 3624 2583 -4.1666666666666666e-03 3624 2997 -1.0416666666666669e-03 3624 2448 -1.0416666666666669e-03 3624 3655 -8.3333333333333315e-03 3624 3627 1.3552527156068805e-20 3624 2996 -1.0416666666666667e-03 3624 2995 6.2500000000000003e-03 3624 2994 -4.1666666666666666e-03 3624 3656 -8.3333333333333315e-03 3624 3626 2.7105054312137611e-20 3624 2780 -1.0416666666666667e-03 3624 2779 6.2500000000000003e-03 3624 2772 -4.1666666666666666e-03 3624 3494 8.3333333333333315e-03 3624 3493 -2.7105054312137611e-20 3624 2450 -1.0416666666666667e-03 3624 2447 6.2500000000000003e-03 3624 2449 -4.1666666666666666e-03 3625 3625 6.6666666666666652e-02 3625 2773 6.2500000000000003e-03 3625 2772 -4.1666666666666666e-03 3625 2756 6.2500000000000003e-03 3625 2765 -4.1666666666666666e-03 3625 2575 -1.0416666666666669e-03 3625 2752 -1.0416666666666669e-03 3625 3598 8.3333333333333315e-03 3625 3600 -2.7105054312137611e-20 3625 2581 -1.0416666666666667e-03 3625 2584 6.2500000000000003e-03 3625 2583 -4.1666666666666666e-03 3625 3363 8.3333333333333315e-03 3625 3362 -2.7105054312137611e-20 3625 2771 -1.0416666666666667e-03 3625 3885 -1.0416666666666669e-03 3625 3872 -1.0416666666666669e-03 3625 4535 -8.3333333333333315e-03 3625 4539 -2.7105054312137611e-20 3625 3886 -1.0416666666666667e-03 3625 3884 6.2500000000000003e-03 3625 3903 -4.1666666666666666e-03 3625 4534 -8.3333333333333315e-03 3625 4536 -2.7105054312137611e-20 3625 3865 -1.0416666666666667e-03 3626 3626 2.5000000000000001e-02 3626 2780 6.2500000000000003e-03 3626 2772 2.0833333333333329e-03 3626 2997 6.2500000000000003e-03 3626 2994 2.0833333333333329e-03 3626 2995 1.0416666666666664e-03 3626 3656 2.0833333333333337e-03 3626 3624 6.0159191589756597e-20 3626 2779 1.0416666666666664e-03 3626 3876 1.0416666666666664e-03 3626 4899 2.0833333333333337e-03 3626 4895 -1.0254392617697373e-19 3626 4175 1.0416666666666664e-03 3627 3627 2.4999999999999998e-02 3627 2998 1.0416666666666664e-03 3627 3659 -2.0833333333333337e-03 3627 3623 6.0159191589756597e-20 3627 2463 1.0416666666666664e-03 3627 2448 6.2500000000000003e-03 3627 2447 1.0416666666666664e-03 3627 2449 2.0833333333333329e-03 3627 3655 2.0833333333333337e-03 3627 3624 -1.0254392617697373e-19 3627 2996 6.2500000000000003e-03 3627 2995 1.0416666666666664e-03 3627 2994 2.0833333333333329e-03 3628 3628 6.6666666666666652e-02 3628 2756 6.2500000000000003e-03 3628 2755 -4.1666666666666666e-03 3628 2773 6.2500000000000003e-03 3628 2774 -4.1666666666666666e-03 3628 2581 -1.0416666666666669e-03 3628 2771 -1.0416666666666669e-03 3628 3363 8.3333333333333315e-03 3628 3364 -2.7105054312137611e-20 3628 2575 -1.0416666666666667e-03 3628 2584 6.2500000000000003e-03 3628 2585 -4.1666666666666666e-03 3628 3598 8.3333333333333315e-03 3628 3597 -2.7105054312137611e-20 3628 2752 -1.0416666666666667e-03 3628 3886 -1.0416666666666669e-03 3628 3865 -1.0416666666666669e-03 3628 4534 -8.3333333333333315e-03 3628 4532 2.7105054312137611e-20 3628 3885 -1.0416666666666667e-03 3628 3884 6.2500000000000003e-03 3628 3883 -4.1666666666666666e-03 3628 4535 -8.3333333333333315e-03 3628 4531 2.7105054312137611e-20 3628 3872 -1.0416666666666667e-03 3629 3629 6.6666666666666652e-02 3629 2790 -4.1666666666666666e-03 3629 2912 -4.1666666666666666e-03 3629 3563 -2.7105054312137611e-20 3629 2799 -4.1666666666666666e-03 3629 3347 -2.7105054312137611e-20 3629 4533 2.7105054312137611e-20 3629 4229 -4.1666666666666666e-03 3629 4530 2.7105054312137611e-20 3630 3630 5.8333333333333320e-02 3630 2968 -4.1666666666666657e-03 3630 2340 -4.1666666666666675e-03 3630 3634 1.3552527156068805e-20 3630 2621 -4.1666666666666666e-03 3630 3498 -2.7105054312137611e-20 3630 3914 5.2083333333333322e-03 3630 4782 -2.0833333333333329e-03 3630 4786 -1.2499999999999999e-02 3630 4152 1.0416666666666667e-03 3631 3631 6.6666666666666652e-02 3631 2575 -1.0416666666666669e-03 3631 2450 -1.0416666666666669e-03 3631 3494 8.3333333333333315e-03 3631 3495 -2.7105054312137611e-20 3631 2569 -1.0416666666666667e-03 3631 2588 6.2500000000000003e-03 3631 2587 -4.1666666666666666e-03 3631 3366 8.3333333333333315e-03 3631 3365 -1.3552527156068805e-20 3631 2771 -1.0416666666666667e-03 3631 2996 -1.0416666666666669e-03 3631 2780 -1.0416666666666669e-03 3631 2779 6.2500000000000003e-03 3631 2775 -4.1666666666666666e-03 3631 3656 -8.3333333333333315e-03 3631 3636 2.7105054312137611e-20 3631 2997 -1.0416666666666667e-03 3631 2995 6.2500000000000003e-03 3631 2999 -4.1666666666666666e-03 3631 3655 -8.3333333333333315e-03 3631 3632 1.3552527156068805e-20 3631 2448 -1.0416666666666667e-03 3631 2447 6.2500000000000003e-03 3631 2446 -4.1666666666666666e-03 3632 3632 2.4999999999999998e-02 3632 2995 1.0416666666666664e-03 3632 2464 1.0416666666666664e-03 3632 3660 2.0833333333333337e-03 3632 3635 6.0159191589756597e-20 3632 2996 6.2500000000000003e-03 3632 3000 1.0416666666666664e-03 3632 2999 2.0833333333333329e-03 3632 3655 2.0833333333333337e-03 3632 3631 -1.0254392617697373e-19 3632 2448 6.2500000000000003e-03 3632 2447 1.0416666666666664e-03 3632 2446 2.0833333333333329e-03 3633 3633 2.5000000000000001e-02 3633 2776 6.2500000000000003e-03 3633 2775 2.0833333333333329e-03 3633 2971 6.2500000000000003e-03 3633 2968 2.0833333333333329e-03 3633 2969 1.0416666666666664e-03 3633 3361 2.0833333333333337e-03 3633 3359 -6.0159191589756597e-20 3633 2770 1.0416666666666662e-03 3633 3879 1.0416666666666664e-03 3633 4566 -2.0833333333333337e-03 3633 4786 1.0254392617697373e-19 3633 3914 1.0416666666666664e-03 3634 3634 2.4999999999999998e-02 3634 3630 -1.0254392617697373e-19 3634 2619 1.0416666666666664e-03 3634 2621 2.0833333333333329e-03 3634 3358 2.0833333333333337e-03 3634 3359 -6.0159191589756597e-20 3634 2969 1.0416666666666664e-03 3634 2968 2.0833333333333329e-03 3635 3635 5.8333333333333320e-02 3635 2348 4.1666666666666666e-03 3635 2340 -4.1666666666666657e-03 3635 3000 1.0416666666666666e-02 3635 2999 -4.1666666666666675e-03 3635 2448 -1.0416666666666669e-03 3635 2337 -1.0416666666666669e-03 3635 3116 -8.3333333333333315e-03 3635 3112 -2.7105054312137611e-20 3635 2457 -1.0416666666666667e-03 3635 2464 6.2500000000000003e-03 3635 2446 -4.1666666666666666e-03 3635 3660 -8.3333333333333315e-03 3635 3632 2.7105054312137611e-20 3635 2996 -1.0416666666666667e-03 3635 4152 1.0416666666666664e-03 3635 4791 -2.0833333333333329e-03 3635 4786 -1.2499999999999997e-02 3635 4170 5.2083333333333330e-03 3636 3636 2.5000000000000001e-02 3636 2997 6.2500000000000003e-03 3636 2999 2.0833333333333329e-03 3636 2780 6.2500000000000003e-03 3636 2775 2.0833333333333329e-03 3636 2779 1.0416666666666664e-03 3636 3656 2.0833333333333337e-03 3636 3631 6.0159191589756597e-20 3636 2995 1.0416666666666664e-03 3636 4170 1.0416666666666664e-03 3636 4785 2.0833333333333337e-03 3636 4786 1.0254392617697373e-19 3636 3879 1.0416666666666664e-03 3637 3637 2.0833333333333332e-02 3638 3638 2.0833333333333332e-02 3639 3639 4.1666666666666664e-02 3639 2778 -2.0833333333333329e-03 3639 3640 -2.0833333333333337e-03 3639 3641 -8.3333333333333315e-03 3639 2977 -2.0833333333333333e-03 3639 2971 -8.3333333333333315e-03 3639 2974 2.0833333333333337e-03 3639 2973 -2.0833333333333329e-03 3639 3340 -2.0833333333333337e-03 3639 3335 8.3333333333333315e-03 3639 2776 -8.3333333333333315e-03 3639 2777 2.0833333333333337e-03 3639 2767 -2.0833333333333333e-03 3640 3640 2.5000000000000001e-02 3640 2971 6.2500000000000003e-03 3640 2977 2.0833333333333329e-03 3640 2776 6.2500000000000003e-03 3640 2778 2.0833333333333329e-03 3640 2777 1.0416666666666664e-03 3640 3639 -2.0833333333333337e-03 3640 3641 1.0254392617697373e-19 3640 2974 1.0416666666666664e-03 3640 3913 1.0416666666666664e-03 3640 4560 2.0833333333333337e-03 3640 4547 6.0159191589756597e-20 3640 3873 1.0416666666666662e-03 3641 3641 6.6666666666666652e-02 3641 2784 1.0416666666666669e-03 3641 3643 8.3333333333333315e-03 3641 3651 -1.3552527156068805e-20 3641 2787 -6.2500000000000003e-03 3641 2786 4.1666666666666666e-03 3641 3351 -8.3333333333333315e-03 3641 3350 -1.3552527156068805e-20 3641 2769 1.0416666666666667e-03 3641 2776 1.0416666666666669e-03 3641 2777 -6.2500000000000003e-03 3641 2778 4.1666666666666666e-03 3641 3639 -8.3333333333333315e-03 3641 3640 -1.3552527156068805e-20 3641 2971 1.0416666666666667e-03 3641 2974 -6.2500000000000003e-03 3641 2977 4.1666666666666666e-03 3641 3642 8.3333333333333315e-03 3641 3644 1.3552527156068805e-20 3641 2980 -6.2500000000000003e-03 3641 2979 4.1666666666666666e-03 3642 3642 4.1666666666666664e-02 3642 2977 2.0833333333333329e-03 3642 2982 2.0833333333333329e-03 3642 3341 2.0833333333333337e-03 3642 3335 -8.3333333333333315e-03 3642 2974 -2.0833333333333333e-03 3642 2973 2.0833333333333333e-03 3642 3644 -2.0833333333333337e-03 3642 3641 8.3333333333333315e-03 3642 2980 -2.0833333333333333e-03 3642 2979 2.0833333333333333e-03 3643 3643 4.1666666666666664e-02 3643 2781 2.0833333333333329e-03 3643 2979 2.0833333333333329e-03 3643 3651 2.0833333333333337e-03 3643 3641 8.3333333333333315e-03 3643 2787 -2.0833333333333337e-03 3643 2786 2.0833333333333333e-03 3643 3336 2.0833333333333337e-03 3643 3335 -8.3333333333333315e-03 3643 2980 -2.0833333333333337e-03 3643 2982 2.0833333333333333e-03 3644 3644 2.4999999999999998e-02 3644 2974 -1.0416666666666664e-03 3644 3650 -6.0159191589756597e-20 3644 2977 -2.0833333333333329e-03 3644 3642 -2.0833333333333337e-03 3644 3641 -1.0254392617697373e-19 3644 2980 -1.0416666666666664e-03 3644 2979 -2.0833333333333329e-03 3645 3645 2.0833333333333332e-02 3646 3646 2.0833333333333332e-02 3647 3647 2.0833333333333332e-02 3648 3648 6.6666666666666652e-02 3648 2990 -4.1666666666666666e-03 3648 2786 -4.1666666666666666e-03 3648 3651 2.7105054312137611e-20 3648 2979 -4.1666666666666666e-03 3648 3649 2.7105054312137611e-20 3648 4549 2.7105054312137611e-20 3648 3937 -4.1666666666666666e-03 3648 4551 2.7105054312137611e-20 3649 3649 2.4999999999999998e-02 3649 3650 -1.0254392617697373e-19 3649 2979 2.0833333333333329e-03 3649 3648 6.0159191589756597e-20 3649 2990 2.0833333333333329e-03 3650 3650 5.8333333333333320e-02 3650 2990 -4.1666666666666657e-03 3650 2977 -4.1666666666666675e-03 3650 3649 1.3552527156068805e-20 3650 2979 -4.1666666666666666e-03 3650 3644 -2.7105054312137611e-20 3650 3911 1.0416666666666664e-03 3650 4554 -2.0833333333333329e-03 3650 4547 1.2499999999999997e-02 3650 3913 5.2083333333333330e-03 3651 3651 2.4999999999999998e-02 3651 3648 6.0159191589756597e-20 3651 2980 1.0416666666666664e-03 3651 2979 2.0833333333333329e-03 3651 3643 2.0833333333333337e-03 3651 3641 1.0254392617697373e-19 3651 2787 1.0416666666666664e-03 3651 2786 2.0833333333333329e-03 3652 3652 2.0833333333333332e-02 3653 3653 2.0833333333333332e-02 3654 3654 2.0833333333333332e-02 3655 3655 4.1666666666666664e-02 3655 2999 2.0833333333333333e-03 3655 2449 2.0833333333333333e-03 3655 3627 2.0833333333333337e-03 3655 3624 -8.3333333333333315e-03 3655 2996 8.3333333333333315e-03 3655 2995 -2.0833333333333337e-03 3655 2994 2.0833333333333329e-03 3655 3632 2.0833333333333337e-03 3655 3631 -8.3333333333333315e-03 3655 2448 8.3333333333333315e-03 3655 2447 -2.0833333333333337e-03 3655 2446 2.0833333333333329e-03 3656 3656 4.1666666666666664e-02 3656 2775 2.0833333333333329e-03 3656 3636 2.0833333333333337e-03 3656 3631 -8.3333333333333315e-03 3656 2999 2.0833333333333333e-03 3656 2997 8.3333333333333315e-03 3656 2995 -2.0833333333333337e-03 3656 2994 2.0833333333333329e-03 3656 3626 2.0833333333333337e-03 3656 3624 -8.3333333333333315e-03 3656 2780 8.3333333333333315e-03 3656 2779 -2.0833333333333337e-03 3656 2772 2.0833333333333333e-03 3657 3657 2.4999999999999996e-10 3657 3002 -1.0416666666666666e-11 3657 2463 -1.0416666666666665e-11 3657 3659 2.0833333333333332e-11 3657 3661 -9.5018296033870872e-28 3657 2996 -6.2499999999999991e-11 3657 2998 -1.0416666666666665e-11 3657 3001 -2.0833333333333326e-11 3657 3658 -2.0833333333333339e-11 3657 3698 2.2913451068275814e-27 3657 2448 -6.2499999999999991e-11 3657 2452 -1.0416666666666666e-11 3657 2453 -2.0833333333333326e-11 3658 3658 4.1666666666666662e-10 3658 2448 8.3333333333333330e-11 3658 2452 -2.0833333333333339e-11 3658 2451 2.0833333333333332e-11 3658 3701 -8.3333333333333330e-11 3658 2996 8.3333333333333330e-11 3658 3002 -2.0833333333333339e-11 3658 3001 2.0833333333333332e-11 3658 3657 -2.0833333333333339e-11 3658 3698 -8.3333333333333330e-11 3658 2453 2.0833333333333332e-11 3658 4768 2.0833333333333339e-11 3658 4182 2.0833333333333332e-11 3659 3659 2.0833333541666669e-02 3659 2453 -2.0833333333333332e-11 3659 3657 2.0833333333333336e-11 3659 3661 8.3333333333333330e-11 3659 3001 -2.0833333333333332e-11 3659 2996 -4.1666667083333324e-03 3659 2998 1.0416666770833331e-03 3659 2994 -2.0833333333333333e-03 3659 3627 -2.0833333333333333e-03 3659 3623 8.3333333333333315e-03 3659 2448 -4.1666667083333333e-03 3659 2463 1.0416666770833337e-03 3659 2449 -2.0833333333333329e-03 3660 3660 2.0833333541666665e-02 3660 2996 4.1666667083333333e-03 3660 3000 -1.0416666770833337e-03 3660 2448 4.1666667083333324e-03 3660 2464 -1.0416666770833331e-03 3660 2451 2.0833333333333332e-11 3660 2446 2.0833333333333333e-03 3660 3632 2.0833333333333333e-03 3660 3635 -8.3333333333333315e-03 3660 2999 2.0833333333333329e-03 3660 4182 2.0833333333333332e-11 3660 4768 2.0833333333333336e-11 3660 4763 -8.3333333333333330e-11 3661 3661 6.6666666666666654e-10 3661 2998 6.2499999999999991e-11 3661 3001 -4.1666666666666665e-11 3661 2412 6.2499999999999991e-11 3661 2448 -1.0416666666666666e-11 3661 2405 -1.0416666666666666e-11 3661 3083 8.3333333333333330e-11 3661 3084 -1.6155871338926322e-27 3661 2455 -1.0416666666666666e-11 3661 2463 6.2499999999999991e-11 3661 2453 -4.1666666666666665e-11 3661 3659 8.3333333333333330e-11 3661 3657 -1.6155871338926322e-27 3661 2996 -1.0416666666666666e-11 3661 3807 -1.0416666666666666e-11 3661 4176 -1.0416666666666666e-11 3661 4942 8.3333333333333330e-11 3661 4943 -1.6155871338926322e-27 3661 3801 -1.0416666666666666e-11 3661 3813 6.2499999999999991e-11 3661 3804 -4.1666666666666665e-11 3661 4466 8.3333333333333330e-11 3661 4465 -1.6155871338926322e-27 3661 3777 -1.0416666666666666e-11 3661 290 -4.1666666666666665e-11 3662 3662 6.6666666666666652e-02 3662 2758 6.2500000000000003e-03 3662 2757 -4.1666666666666666e-03 3662 2830 6.2500000000000003e-03 3662 2645 -1.0416666666666669e-03 3662 2824 -1.0416666666666669e-03 3662 3668 8.3333333333333315e-03 3662 3663 2.7105054312137611e-20 3662 2653 -1.0416666666666667e-03 3662 2659 6.2500000000000003e-03 3662 2651 -4.1666666666666666e-03 3662 3318 8.3333333333333315e-03 3662 3317 -2.7105054312137611e-20 3662 2754 -1.0416666666666667e-03 3662 3845 -1.0416666666666669e-03 3662 3867 -1.0416666666666669e-03 3662 4513 8.3333333333333315e-03 3662 4516 -2.7105054312137611e-20 3662 3839 -1.0416666666666667e-03 3662 3852 6.2500000000000003e-03 3662 3851 -4.1666666666666666e-03 3662 4606 8.3333333333333315e-03 3662 4605 -2.7105054312137611e-20 3662 3958 -1.0416666666666667e-03 3662 491 -4.1666666666666666e-03 3663 3663 2.4999999999999998e-02 3663 2830 1.0416666666666664e-03 3663 3668 -2.0833333333333337e-03 3663 3662 6.0159191589756597e-20 3663 2659 1.0416666666666662e-03 3663 2653 6.2500000000000003e-03 3663 2652 1.0416666666666664e-03 3663 2651 2.0833333333333329e-03 3663 3384 2.0833333333333337e-03 3663 3383 -1.0254392617697373e-19 3663 2824 6.2500000000000003e-03 3663 2822 1.0416666666666664e-03 3663 491 2.0833333333333329e-03 3664 3664 4.1666666666666664e-02 3664 2826 -2.0833333333333333e-03 3664 3665 2.0833333333333337e-03 3664 3669 -8.3333333333333315e-03 3664 2656 -2.0833333333333329e-03 3664 2653 -8.3333333333333315e-03 3664 2655 2.0833333333333337e-03 3664 2654 -2.0833333333333333e-03 3664 3379 -2.0833333333333337e-03 3664 3374 8.3333333333333315e-03 3664 2824 -8.3333333333333315e-03 3664 2825 2.0833333333333337e-03 3664 2821 -2.0833333333333329e-03 3665 3665 2.4999999999999998e-02 3665 2657 -1.0416666666666664e-03 3665 3666 2.0833333333333337e-03 3665 3674 1.0254392617697373e-19 3665 2828 -1.0416666666666664e-03 3665 2824 -6.2500000000000003e-03 3665 2825 -1.0416666666666664e-03 3665 2826 -2.0833333333333329e-03 3665 3664 2.0833333333333337e-03 3665 3669 6.0159191589756597e-20 3665 2653 -6.2500000000000003e-03 3665 2655 -1.0416666666666662e-03 3665 2656 -2.0833333333333329e-03 3666 3666 4.1666666666666664e-02 3666 2829 -2.0833333333333329e-03 3666 3667 2.0833333333333337e-03 3666 3688 -8.3333333333333315e-03 3666 2658 -2.0833333333333333e-03 3666 2653 -8.3333333333333315e-03 3666 2657 2.0833333333333337e-03 3666 2656 -2.0833333333333329e-03 3666 3665 2.0833333333333337e-03 3666 3674 8.3333333333333315e-03 3666 2824 -8.3333333333333315e-03 3666 2828 2.0833333333333337e-03 3666 2826 -2.0833333333333333e-03 3667 3667 2.4999999999999998e-02 3667 2828 -1.0416666666666664e-03 3667 3666 2.0833333333333337e-03 3667 3688 -1.0254392617697373e-19 3667 2657 -1.0416666666666664e-03 3667 2653 -6.2500000000000003e-03 3667 2659 -1.0416666666666664e-03 3667 2658 -2.0833333333333329e-03 3667 3668 2.0833333333333337e-03 3667 3692 -6.0159191589756597e-20 3667 2824 -6.2500000000000003e-03 3667 2830 -1.0416666666666662e-03 3667 2829 -2.0833333333333329e-03 3668 3668 4.1666666666666664e-02 3668 3663 -2.0833333333333337e-03 3668 3662 8.3333333333333315e-03 3668 2651 -2.0833333333333329e-03 3668 2653 -8.3333333333333315e-03 3668 2659 2.0833333333333337e-03 3668 2658 -2.0833333333333333e-03 3668 3667 2.0833333333333337e-03 3668 3692 8.3333333333333315e-03 3668 2824 -8.3333333333333315e-03 3668 2830 2.0833333333333337e-03 3668 2829 -2.0833333333333329e-03 3668 491 -2.0833333333333333e-03 3669 3669 6.6666666666666652e-02 3669 3670 8.3333333333333315e-03 3669 3678 -2.7105054312137611e-20 3669 2840 -6.2500000000000003e-03 3669 2839 4.1666666666666666e-03 3669 3394 -8.3333333333333315e-03 3669 3393 2.7105054312137611e-20 3669 2638 1.0416666666666669e-03 3669 2824 1.0416666666666669e-03 3669 2825 -6.2500000000000003e-03 3669 2826 4.1666666666666666e-03 3669 3664 -8.3333333333333315e-03 3669 3665 2.7105054312137611e-20 3669 2653 1.0416666666666667e-03 3669 2655 -6.2500000000000003e-03 3669 2656 4.1666666666666666e-03 3669 3526 -8.3333333333333315e-03 3669 3525 2.7105054312137611e-20 3669 2892 1.0416666666666667e-03 3669 2891 -6.2500000000000003e-03 3669 2890 4.1666666666666666e-03 3669 1251 1.0416666666666669e-03 3669 1648 1.0416666666666667e-03 3670 3670 4.1666666666666664e-02 3670 2836 2.0833333333333333e-03 3670 2890 2.0833333333333333e-03 3670 3678 2.0833333333333337e-03 3670 3669 8.3333333333333315e-03 3670 2840 -2.0833333333333337e-03 3670 2839 2.0833333333333329e-03 3670 3375 2.0833333333333337e-03 3670 3374 -8.3333333333333315e-03 3670 2891 -2.0833333333333337e-03 3670 2893 2.0833333333333329e-03 3671 3671 6.6666666666666652e-02 3671 3677 1.3552527156068805e-20 3671 3004 -4.1666666666666666e-03 3671 3673 1.3552527156068805e-20 3671 2839 -4.1666666666666666e-03 3671 3678 1.3552527156068805e-20 3671 2890 -4.1666666666666666e-03 3671 3532 -1.3552527156068805e-20 3671 2715 -4.1666666666666666e-03 3672 3672 6.6666666666666652e-02 3672 3014 -1.0416666666666669e-03 3672 3687 -8.3333333333333315e-03 3672 3680 1.3552527156068805e-20 3672 3018 6.2500000000000003e-03 3672 3016 -4.1666666666666666e-03 3672 3686 -8.3333333333333315e-03 3672 3679 2.7105054312137611e-20 3672 2831 -1.0416666666666667e-03 3672 2827 6.2500000000000003e-03 3672 2826 -4.1666666666666666e-03 3672 3395 -8.3333333333333315e-03 3672 3393 -1.3552527156068805e-20 3672 2844 6.2500000000000003e-03 3672 2839 -4.1666666666666666e-03 3672 3685 -8.3333333333333315e-03 3672 3673 2.7105054312137611e-20 3672 3005 6.2500000000000003e-03 3672 3004 -4.1666666666666666e-03 3672 1648 -1.0416666666666669e-03 3672 1251 -1.0416666666666667e-03 3673 3673 2.4999999999999998e-02 3673 2844 1.0416666666666664e-03 3673 3671 -1.0254392617697373e-19 3673 2839 2.0833333333333329e-03 3673 3685 2.0833333333333337e-03 3673 3672 6.0159191589756597e-20 3673 3005 1.0416666666666664e-03 3673 3004 2.0833333333333329e-03 3674 3674 6.6666666666666652e-02 3674 2831 -1.0416666666666669e-03 3674 3690 -8.3333333333333315e-03 3674 3679 1.3552527156068805e-20 3674 3014 -1.0416666666666667e-03 3674 3012 6.2500000000000003e-03 3674 3016 -4.1666666666666666e-03 3674 2653 -1.0416666666666669e-03 3674 2955 -1.0416666666666669e-03 3674 3619 8.3333333333333315e-03 3674 3621 -1.3552527156068805e-20 3674 2649 -1.0416666666666667e-03 3674 2657 6.2500000000000003e-03 3674 2656 -4.1666666666666666e-03 3674 3666 8.3333333333333315e-03 3674 3665 -1.3552527156068805e-20 3674 2824 -1.0416666666666667e-03 3674 2828 6.2500000000000003e-03 3674 2826 -4.1666666666666666e-03 3674 3689 -8.3333333333333315e-03 3674 3675 1.3552527156068805e-20 3674 2957 6.2500000000000003e-03 3674 2958 -4.1666666666666666e-03 3675 3675 2.4999999999999998e-02 3675 3012 1.0416666666666664e-03 3675 3676 6.0159191589756597e-20 3675 3016 2.0833333333333329e-03 3675 3689 2.0833333333333337e-03 3675 3674 -1.0254392617697373e-19 3675 2957 1.0416666666666664e-03 3675 2958 2.0833333333333329e-03 3676 3676 6.6666666666666652e-02 3676 3680 2.7105054312137611e-20 3676 3004 -4.1666666666666666e-03 3676 3612 -2.7105054312137611e-20 3676 2958 -4.1666666666666666e-03 3676 3675 2.7105054312137611e-20 3676 3016 -4.1666666666666666e-03 3676 3677 2.7105054312137611e-20 3676 2715 -4.1666666666666666e-03 3677 3677 2.4999999999999998e-02 3677 3671 -1.0254392617697373e-19 3677 3004 2.0833333333333329e-03 3677 3676 6.0159191589756597e-20 3677 2715 2.0833333333333329e-03 3678 3678 2.4999999999999998e-02 3678 3671 -1.0254392617697373e-19 3678 2891 1.0416666666666664e-03 3678 2890 2.0833333333333329e-03 3678 3670 2.0833333333333337e-03 3678 3669 -6.0159191589756597e-20 3678 2840 1.0416666666666662e-03 3678 2839 2.0833333333333329e-03 3679 3679 2.5000000000000001e-02 3679 3018 1.0416666666666664e-03 3679 3686 2.0833333333333337e-03 3679 3672 6.0159191589756597e-20 3679 2827 1.0416666666666664e-03 3679 2831 6.2500000000000003e-03 3679 2828 1.0416666666666664e-03 3679 2826 2.0833333333333329e-03 3679 3690 2.0833333333333337e-03 3679 3674 -1.0254392617697373e-19 3679 3014 6.2500000000000003e-03 3679 3012 1.0416666666666664e-03 3679 3016 2.0833333333333329e-03 3680 3680 2.4999999999999998e-02 3680 3676 6.0159191589756597e-20 3680 3005 1.0416666666666664e-03 3680 3004 2.0833333333333329e-03 3680 3687 2.0833333333333337e-03 3680 3672 -1.0254392617697373e-19 3680 3018 1.0416666666666664e-03 3680 3016 2.0833333333333329e-03 3681 3681 2.0833333333333332e-02 3682 3682 2.0833333333333332e-02 3683 3683 2.0833333333333332e-02 3684 3684 2.0833333333333332e-02 3685 3685 4.1666666666666664e-02 3685 3005 -2.0833333333333337e-03 3685 2844 -2.0833333333333337e-03 3685 2839 2.0833333333333329e-03 3685 3673 2.0833333333333337e-03 3685 3672 -8.3333333333333315e-03 3685 3004 2.0833333333333333e-03 3685 4290 2.0833333333333329e-03 3685 4954 2.0833333333333337e-03 3685 4950 -8.3333333333333315e-03 3685 4287 2.0833333333333333e-03 3686 3686 4.1666666666666664e-02 3686 2831 8.3333333333333315e-03 3686 2827 -2.0833333333333337e-03 3686 3014 8.3333333333333315e-03 3686 3018 -2.0833333333333337e-03 3686 3016 2.0833333333333329e-03 3686 3679 2.0833333333333337e-03 3686 3672 -8.3333333333333315e-03 3686 2826 2.0833333333333333e-03 3686 3963 2.0833333333333329e-03 3686 4640 -2.0833333333333337e-03 3686 4950 -8.3333333333333315e-03 3686 3994 2.0833333333333333e-03 3687 3687 4.1666666666666664e-02 3687 3018 -2.0833333333333337e-03 3687 3005 -2.0833333333333337e-03 3687 3004 2.0833333333333333e-03 3687 3680 2.0833333333333337e-03 3687 3672 -8.3333333333333315e-03 3687 3016 2.0833333333333329e-03 3687 3994 2.0833333333333333e-03 3687 4951 2.0833333333333337e-03 3687 4950 -8.3333333333333315e-03 3687 4290 2.0833333333333329e-03 3688 3688 6.6666666666666652e-02 3688 3014 1.0416666666666669e-03 3688 3689 8.3333333333333315e-03 3688 3694 -1.3552527156068805e-20 3688 3012 -6.2500000000000003e-03 3688 3011 4.1666666666666666e-03 3688 3690 8.3333333333333315e-03 3688 3693 -1.3552527156068805e-20 3688 2831 1.0416666666666667e-03 3688 2649 1.0416666666666669e-03 3688 2824 1.0416666666666669e-03 3688 2828 -6.2500000000000003e-03 3688 2829 4.1666666666666666e-03 3688 3666 -8.3333333333333315e-03 3688 3667 1.3552527156068805e-20 3688 2653 1.0416666666666667e-03 3688 2657 -6.2500000000000003e-03 3688 2658 4.1666666666666666e-03 3688 3619 -8.3333333333333315e-03 3688 3618 1.3552527156068805e-20 3688 2955 1.0416666666666667e-03 3688 2957 -6.2500000000000003e-03 3688 2956 4.1666666666666666e-03 3689 3689 4.1666666666666664e-02 3689 3016 2.0833333333333329e-03 3689 2956 2.0833333333333329e-03 3689 3694 2.0833333333333337e-03 3689 3688 8.3333333333333315e-03 3689 3012 -2.0833333333333337e-03 3689 3011 2.0833333333333333e-03 3689 3675 2.0833333333333337e-03 3689 3674 -8.3333333333333315e-03 3689 2957 -2.0833333333333337e-03 3689 2958 2.0833333333333333e-03 3690 3690 4.1666666666666664e-02 3690 2826 2.0833333333333329e-03 3690 3679 2.0833333333333337e-03 3690 3674 -8.3333333333333315e-03 3690 3016 2.0833333333333333e-03 3690 3014 8.3333333333333315e-03 3690 3012 -2.0833333333333333e-03 3690 3011 2.0833333333333329e-03 3690 3693 2.0833333333333337e-03 3690 3688 8.3333333333333315e-03 3690 2831 8.3333333333333315e-03 3690 2828 -2.0833333333333333e-03 3690 2829 2.0833333333333333e-03 3691 3691 6.6666666666666652e-02 3691 2913 -4.1666666666666666e-03 3691 3011 -4.1666666666666666e-03 3691 3694 2.7105054312137611e-20 3691 2956 -4.1666666666666666e-03 3691 3615 -2.7105054312137611e-20 3691 4965 2.7105054312137611e-20 3691 4001 -4.1666666666666666e-03 3691 4637 -2.7105054312137611e-20 3692 3692 6.6666666666666652e-02 3692 2830 6.2500000000000003e-03 3692 2829 -4.1666666666666666e-03 3692 2758 6.2500000000000003e-03 3692 2766 -4.1666666666666666e-03 3692 2653 -1.0416666666666669e-03 3692 2754 -1.0416666666666669e-03 3692 3318 8.3333333333333315e-03 3692 3320 -2.7105054312137611e-20 3692 2645 -1.0416666666666667e-03 3692 2659 6.2500000000000003e-03 3692 2658 -4.1666666666666666e-03 3692 3668 8.3333333333333315e-03 3692 3667 -2.7105054312137611e-20 3692 2824 -1.0416666666666667e-03 3692 3839 -1.0416666666666669e-03 3692 3958 -1.0416666666666669e-03 3692 4606 8.3333333333333315e-03 3692 4607 -2.7105054312137611e-20 3692 3845 -1.0416666666666667e-03 3692 3852 6.2500000000000003e-03 3692 3853 -4.1666666666666666e-03 3692 4513 8.3333333333333315e-03 3692 4512 -2.7105054312137611e-20 3692 3867 -1.0416666666666667e-03 3693 3693 2.5000000000000001e-02 3693 2831 6.2500000000000003e-03 3693 2829 2.0833333333333329e-03 3693 3014 6.2500000000000003e-03 3693 3011 2.0833333333333329e-03 3693 3012 1.0416666666666664e-03 3693 3690 2.0833333333333337e-03 3693 3688 1.0254392617697373e-19 3693 2828 1.0416666666666664e-03 3693 3960 1.0416666666666664e-03 3693 4636 2.0833333333333337e-03 3693 4634 -6.0159191589756597e-20 3693 3991 1.0416666666666664e-03 3694 3694 2.4999999999999998e-02 3694 3691 6.0159191589756597e-20 3694 2957 1.0416666666666664e-03 3694 2956 2.0833333333333329e-03 3694 3689 2.0833333333333337e-03 3694 3688 1.0254392617697373e-19 3694 3012 1.0416666666666664e-03 3694 3011 2.0833333333333329e-03 3695 3695 2.0833333333333332e-02 3696 3696 2.0833333333333332e-02 3697 3697 2.0833333333333332e-02 3698 3698 6.6666666666666664e-10 3698 2996 -1.0416666666666666e-11 3698 3022 -1.0416666666666666e-11 3698 3703 -8.3333333333333330e-11 3698 3700 1.6155871338926322e-27 3698 3003 -1.0416666666666666e-11 3698 3002 6.2499999999999991e-11 3698 3001 -4.1666666666666665e-11 3698 2444 -1.0416666666666666e-11 3698 3101 8.3333333333333330e-11 3698 3104 -1.6155871338926322e-27 3698 2485 -1.0416666666666666e-11 3698 2493 6.2499999999999991e-11 3698 2492 -4.1666666666666665e-11 3698 3702 -8.3333333333333330e-11 3698 3699 -1.8175355256292112e-27 3698 3020 6.2499999999999991e-11 3698 3658 -8.3333333333333330e-11 3698 3657 1.8175355256292112e-27 3698 2448 -1.0416666666666666e-11 3698 2452 6.2499999999999991e-11 3698 2453 -4.1666666666666665e-11 3698 115 -1.0416666666666666e-11 3698 441 -1.0416666666666666e-11 3698 442 -4.1666666666666665e-11 3699 3699 2.4999999999999996e-10 3699 2492 2.0833333333333326e-11 3699 2493 1.0416666666666666e-11 3699 3702 2.0833333333333339e-11 3699 3698 -2.2913451068275814e-27 3699 3020 1.0416666666666666e-11 3699 441 6.2499999999999991e-11 3699 1524 1.0416666666666665e-11 3699 442 2.0833333333333326e-11 3699 818 2.0833333333333332e-11 3699 816 -9.5018296033870872e-28 3699 115 6.2499999999999991e-11 3699 116 1.0416666666666665e-11 3700 3700 2.4999999999999996e-10 3700 3003 6.2500000000000004e-11 3700 3001 2.0833333333333326e-11 3700 3022 6.2500000000000004e-11 3700 3020 1.0416666666666663e-11 3700 3703 2.0833333333333336e-11 3700 3698 9.5018296033870872e-28 3700 3002 1.0416666666666666e-11 3700 4183 1.0416666666666663e-11 3700 4992 -2.0833333333333336e-11 3700 5002 -2.2913451068275814e-27 3700 4067 1.0416666666666666e-11 3700 442 2.0833333333333326e-11 3701 3701 6.6666666666666654e-10 3701 3003 -1.0416666666666666e-11 3701 2448 -1.0416666666666666e-11 3701 2452 6.2499999999999991e-11 3701 2451 -4.1666666666666665e-11 3701 3658 -8.3333333333333330e-11 3701 2996 -1.0416666666666666e-11 3701 3002 6.2499999999999991e-11 3701 3703 -8.3333333333333330e-11 3701 3022 -1.0416666666666666e-11 3701 3020 6.2499999999999991e-11 3701 3021 -4.1666666666666665e-11 3701 2485 -1.0416666666666666e-11 3701 3702 -8.3333333333333330e-11 3701 3704 -1.8175355256292112e-27 3701 2493 6.2499999999999991e-11 3701 2494 -4.1666666666666665e-11 3701 3101 8.3333333333333330e-11 3701 3100 -1.6155871338926322e-27 3701 2444 -1.0416666666666666e-11 3701 4768 -1.8175355256292112e-27 3701 4182 -4.1666666666666665e-11 3701 4767 1.6155871338926322e-27 3701 441 -1.0416666666666666e-11 3701 115 -1.0416666666666666e-11 3702 3702 4.1666666666666662e-10 3702 3021 2.0833333333333332e-11 3702 3704 2.0833333333333339e-11 3702 3701 -8.3333333333333330e-11 3702 2494 2.0833333333333332e-11 3702 2493 -2.0833333333333339e-11 3702 2492 2.0833333333333332e-11 3702 3699 2.0833333333333339e-11 3702 3698 -8.3333333333333330e-11 3702 3020 -2.0833333333333339e-11 3702 115 8.3333333333333330e-11 3702 441 8.3333333333333330e-11 3702 442 2.0833333333333332e-11 3703 3703 4.1666666666666662e-10 3703 3003 8.3333333333333330e-11 3703 3002 -2.0833333333333336e-11 3703 3701 -8.3333333333333330e-11 3703 3022 8.3333333333333330e-11 3703 3020 -2.0833333333333336e-11 3703 3021 2.0833333333333332e-11 3703 3700 2.0833333333333339e-11 3703 3698 -8.3333333333333330e-11 3703 3001 2.0833333333333332e-11 3703 4182 2.0833333333333329e-11 3703 4767 2.0833333333333339e-11 3703 442 2.0833333333333329e-11 3704 3704 2.4999999999999996e-10 3704 2487 1.0416666666666665e-11 3704 2494 2.0833333333333326e-11 3704 3021 2.0833333333333326e-11 3704 3020 1.0416666666666666e-11 3704 3702 2.0833333333333339e-11 3704 3701 -2.2913451068275814e-27 3704 2493 1.0416666666666666e-11 3704 115 6.2499999999999991e-11 3704 4771 2.0833333333333332e-11 3704 4760 9.5018296033870872e-28 3704 441 6.2499999999999991e-11 3704 4062 1.0416666666666665e-11 3705 3705 4.1666666666666662e-10 3705 3023 -1.0416666666666666e-11 3705 2350 1.0416666666666666e-11 3705 2349 4.1666666666666658e-11 3705 2375 -6.2500000000000004e-11 3705 3706 -2.0194839173657902e-27 3705 4158 1.2069011089684726e-28 3705 4764 -2.0833333333333332e-11 3705 4760 -4.1666666666666665e-11 3706 3706 4.1666666666666657e-10 3706 2375 -6.0115145282367205e-27 3706 3707 1.0034310714411270e-27 3706 3705 -2.3107708066186488e-27 3706 3023 -5.6797985175912850e-27 3707 3707 4.1666666666666662e-10 3707 2888 1.0416666666666658e-11 3707 3023 -1.0416666666666668e-11 3707 3706 1.6155871338926322e-27 3707 2375 -6.2499999999999991e-11 3707 3470 6.4623485355705287e-27 3707 4350 4.1666666666666665e-11 3707 5044 -2.0833333333333332e-11 3707 4773 4.1666666666666665e-11 3707 4156 -4.6458872727282566e-28 3708 3708 2.0833333333333329e-10 3709 3709 2.0833333333333329e-10 hypre-2.33.0/src/test/TEST_ams/mfem.M.00003000066400000000000000000016147451477326011500176460ustar00rootroot000000000000003710 5080 3710 5080 3710 3710 2.5000000000000002e-10 3710 4829 -2.0833333333333332e-11 3710 4876 2.0833333333333332e-11 3710 4401 2.0833333333333326e-11 3710 4400 -4.1666666666666665e-11 3710 3715 -2.0833333333333326e-11 3710 4397 2.0833333333333326e-11 3710 4396 -4.1666666666666665e-11 3710 4395 2.0833333333333326e-11 3710 4394 -4.1666666666666665e-11 3711 3711 1.2499999999999998e-10 3712 3712 1.6666666666666666e-10 3713 3713 1.2499999999999998e-10 3714 3714 1.6666666833333330e-02 3715 3715 1.2500000124999999e-02 3715 4878 -1.0416666666666662e-03 3715 4397 1.0416666666666666e-11 3715 4829 1.0416666770833340e-03 3715 4828 -1.0416666666666664e-03 3715 4877 -6.2500000000000003e-03 3715 3717 -2.0833333333333329e-03 3715 4876 -1.0416666770833331e-03 3715 4401 1.0416666666666665e-11 3715 4400 6.2499999999999991e-11 3715 3710 -2.0833333333333326e-11 3716 3716 1.6666666833333330e-02 3717 3717 2.4999999999999994e-02 3717 4876 2.0833333333333329e-03 3717 4829 -2.0833333333333329e-03 3717 4828 -2.0833333333333329e-03 3717 4877 4.1666666666666666e-03 3717 3715 -2.0833333333333333e-03 3717 4878 -2.0833333333333329e-03 3717 4923 -4.1666666666666666e-03 3717 4922 2.0833333333333329e-03 3717 4921 -4.1666666666666666e-03 3718 3718 1.2500000000000001e-02 3719 3719 1.6666666666666663e-02 3720 3720 1.2500000000000001e-02 3721 3721 2.5000000000000002e-10 3721 4425 -2.0833333333333332e-11 3721 4824 2.0833333333333329e-11 3721 4854 -2.0833333333333332e-11 3721 4410 2.0833333333333326e-11 3721 4404 -4.1666666666666665e-11 3721 3740 4.1666666666666665e-11 3721 3741 -2.0833333333333326e-11 3721 4416 2.0833333333333329e-11 3721 4815 -2.0833333333333332e-11 3721 4408 2.0833333333333326e-11 3721 4402 -4.1666666666666665e-11 3721 3737 4.1666666666666665e-11 3721 3738 -2.0833333333333326e-11 3721 4415 2.0833333333333332e-11 3721 4406 2.0833333333333326e-11 3721 4398 -4.1666666666666665e-11 3721 3723 4.1666666666666665e-11 3721 3722 -2.0833333333333326e-11 3722 3722 2.4999999999999996e-10 3722 4422 -1.0416666666666666e-11 3722 4408 1.0416666666666665e-11 3722 4416 -2.0833333333333339e-11 3722 4809 1.0416666666666665e-11 3722 4413 -6.2499999999999991e-11 3722 3737 1.6155871338926322e-27 3722 3736 -2.0833333333333326e-11 3722 4415 -2.0833333333333339e-11 3722 4406 1.0416666666666666e-11 3722 4398 6.2500000000000004e-11 3722 3723 -2.6253290925755273e-27 3722 3721 -2.0833333333333326e-11 3723 3723 6.6666666666666674e-10 3723 4482 -1.0416666666666666e-11 3723 4404 -1.0416666666666666e-11 3723 4425 -8.3333333333333330e-11 3723 4424 -6.2499999999999991e-11 3723 4840 -1.0416666666666666e-11 3723 3741 -3.0991386737738975e-27 3723 3739 4.1666666666666665e-11 3723 4413 1.0416666666666666e-11 3723 4473 -1.0416666666666666e-11 3723 4423 -8.3333333333333330e-11 3723 4422 -6.2499999999999991e-11 3723 4719 1.0416666666666666e-11 3723 3732 -3.0991386737738975e-27 3723 3736 4.1666666666666665e-11 3723 4421 -8.3333333333333330e-11 3723 4420 -6.2499999999999991e-11 3723 4477 -1.0416666666666666e-11 3723 3728 -3.0991386737738975e-27 3723 3727 4.1666666666666665e-11 3723 4415 8.3333333333333330e-11 3723 4406 6.2499999999999991e-11 3723 4398 -1.0416666666666666e-11 3723 3722 -3.0991386737738975e-27 3723 3721 4.1666666666666665e-11 3724 3724 2.5000000000000002e-10 3724 4510 2.0833333333333332e-11 3724 4517 -2.0833333333333332e-11 3724 4446 2.0833333333333326e-11 3724 3731 4.1666666666666665e-11 3724 4458 2.0833333333333329e-11 3724 3742 -2.0833333333333326e-11 3724 4436 -4.1666666666666665e-11 3724 4452 2.0833333333333329e-11 3724 4511 2.0833333333333332e-11 3724 4444 2.0833333333333326e-11 3724 4440 -4.1666666666666665e-11 3724 3740 4.1666666666666665e-11 3724 3730 -2.0833333333333326e-11 3724 4451 2.0833333333333332e-11 3724 4442 2.0833333333333326e-11 3724 4434 -4.1666666666666665e-11 3724 3726 4.1666666666666665e-11 3724 3725 -2.0833333333333326e-11 3725 3725 2.4999999999999996e-10 3725 4457 1.0416666666666665e-11 3725 4444 1.0416666666666666e-11 3725 4452 -2.0833333333333339e-11 3725 4844 1.0416666666666666e-11 3725 4449 -6.2499999999999991e-11 3725 3740 -2.6253290925755273e-27 3725 3739 -2.0833333333333326e-11 3725 4451 -2.0833333333333332e-11 3725 4442 1.0416666666666665e-11 3725 4434 6.2499999999999991e-11 3725 3726 1.6155871338926322e-27 3725 3724 -2.0833333333333326e-11 3726 3726 6.6666666666666664e-10 3726 4893 -1.0416666666666666e-11 3726 4458 8.3333333333333330e-11 3726 4888 -1.0416666666666666e-11 3726 3742 9.5018296033870872e-28 3726 3743 4.1666666666666665e-11 3726 4475 -1.0416666666666666e-11 3726 3746 9.5018296033870872e-28 3726 4477 -1.0416666666666666e-11 3726 3727 4.1666666666666665e-11 3726 4457 6.2499999999999991e-11 3726 4482 -1.0416666666666666e-11 3726 3728 9.5018296033870872e-28 3726 3739 4.1666666666666665e-11 3726 4436 -1.0416666666666666e-11 3726 4449 1.0416666666666666e-11 3726 4451 8.3333333333333330e-11 3726 4442 6.2499999999999991e-11 3726 4434 -1.0416666666666666e-11 3726 3725 9.5018296033870872e-28 3726 3724 4.1666666666666665e-11 3726 2067 -6.2499999999999991e-11 3726 2066 -8.3333333333333330e-11 3726 2065 -6.2499999999999991e-11 3726 2060 8.3333333333333330e-11 3727 3727 2.4999999999999996e-10 3727 4475 -4.1666666666666665e-11 3727 3746 -2.0833333333333326e-11 3727 3726 4.1666666666666665e-11 3727 3728 -2.0833333333333326e-11 3727 4477 -4.1666666666666665e-11 3727 4730 -2.0833333333333329e-11 3727 4423 -2.0833333333333332e-11 3727 4721 2.0833333333333332e-11 3727 4479 2.0833333333333326e-11 3727 4473 -4.1666666666666665e-11 3727 3733 4.1666666666666665e-11 3727 3732 -2.0833333333333326e-11 3727 4421 -2.0833333333333332e-11 3727 4420 -2.0833333333333326e-11 3727 3723 4.1666666666666665e-11 3727 2066 -2.0833333333333332e-11 3727 2060 2.0833333333333329e-11 3727 2065 -2.0833333333333326e-11 3728 3728 2.4999999999999996e-10 3728 4477 6.2500000000000004e-11 3728 3727 -2.0833333333333326e-11 3728 4457 1.0416666666666665e-11 3728 4482 6.2499999999999991e-11 3728 3726 1.6155871338926322e-27 3728 3739 -2.0833333333333326e-11 3728 4424 -1.0416666666666666e-11 3728 4421 2.0833333333333339e-11 3728 4420 -1.0416666666666666e-11 3728 3723 -2.6253290925755273e-27 3728 2065 -1.0416666666666665e-11 3728 2060 -2.0833333333333339e-11 3729 3729 2.5000000000000002e-10 3729 4521 -2.0833333333333332e-11 3729 4816 -2.0833333333333332e-11 3729 4500 -4.1666666666666665e-11 3729 3744 -2.0833333333333326e-11 3729 4824 2.0833333333333332e-11 3729 4511 2.0833333333333332e-11 3729 3740 4.1666666666666665e-11 3729 4505 2.0833333333333326e-11 3729 4815 -2.0833333333333329e-11 3729 3737 4.1666666666666665e-11 3729 3738 -2.0833333333333326e-11 3729 4504 2.0833333333333326e-11 3729 4492 -4.1666666666666665e-11 3729 4510 2.0833333333333332e-11 3729 4502 2.0833333333333326e-11 3729 4494 -4.1666666666666665e-11 3729 3731 4.1666666666666665e-11 3729 3730 -2.0833333333333326e-11 3730 3730 2.4999999999999996e-10 3730 4446 1.0416666666666665e-11 3730 4505 1.0416666666666665e-11 3730 4511 -2.0833333333333339e-11 3730 4444 1.0416666666666663e-11 3730 4440 6.2500000000000004e-11 3730 3740 1.6155871338926322e-27 3730 3724 -2.0833333333333326e-11 3730 4510 -2.0833333333333339e-11 3730 4502 1.0416666666666663e-11 3730 4494 6.2500000000000004e-11 3730 3731 -2.6253290925755273e-27 3730 3729 -2.0833333333333326e-11 3731 3731 6.6666666666666674e-10 3731 4743 -1.0416666666666666e-11 3731 4500 -1.0416666666666666e-11 3731 4521 -8.3333333333333330e-11 3731 4520 -6.2499999999999991e-11 3731 4738 -1.0416666666666666e-11 3731 3744 -3.0991386737738975e-27 3731 3734 4.1666666666666665e-11 3731 4519 -8.3333333333333330e-11 3731 4750 1.0416666666666666e-11 3731 3735 -3.0991386737738975e-27 3731 4440 -1.0416666666666666e-11 3731 4518 -6.2499999999999991e-11 3731 4888 -1.0416666666666666e-11 3731 3743 4.1666666666666665e-11 3731 4517 -8.3333333333333330e-11 3731 4446 6.2499999999999991e-11 3731 4436 -1.0416666666666666e-11 3731 3742 -3.0991386737738975e-27 3731 3724 4.1666666666666665e-11 3731 4510 8.3333333333333330e-11 3731 4502 6.2499999999999991e-11 3731 4494 -1.0416666666666666e-11 3731 3730 -3.0991386737738975e-27 3731 3729 4.1666666666666665e-11 3732 3732 2.4999999999999996e-10 3732 4727 -1.0416666666666665e-11 3732 4420 -1.0416666666666665e-11 3732 4423 2.0833333333333339e-11 3732 4422 -1.0416666666666663e-11 3732 4719 -6.2500000000000004e-11 3732 3723 -2.6253290925755273e-27 3732 3736 -2.0833333333333326e-11 3732 4721 -2.0833333333333339e-11 3732 4479 1.0416666666666663e-11 3732 4473 6.2500000000000004e-11 3732 3733 1.6155871338926322e-27 3732 3727 -2.0833333333333326e-11 3733 3733 6.6666666666666674e-10 3733 4750 1.0416666666666666e-11 3733 4475 -1.0416666666666666e-11 3733 4730 -8.3333333333333330e-11 3733 4729 -6.2499999999999991e-11 3733 4893 -1.0416666666666666e-11 3733 3746 -3.0991386737738975e-27 3733 3743 4.1666666666666665e-11 3733 4719 1.0416666666666666e-11 3733 4740 -1.0416666666666666e-11 3733 4728 -8.3333333333333330e-11 3733 4727 -6.2499999999999991e-11 3733 4805 -1.0416666666666666e-11 3733 3745 -3.0991386737738975e-27 3733 3736 4.1666666666666665e-11 3733 4726 -8.3333333333333330e-11 3733 4725 -6.2499999999999991e-11 3733 4743 -1.0416666666666666e-11 3733 3735 9.5018296033870872e-28 3733 3734 4.1666666666666665e-11 3733 4721 8.3333333333333330e-11 3733 4479 6.2499999999999991e-11 3733 4473 -1.0416666666666666e-11 3733 3732 9.5018296033870872e-28 3733 3727 4.1666666666666665e-11 3734 3734 2.5000000000000002e-10 3734 4519 -2.0833333333333332e-11 3734 4521 -2.0833333333333332e-11 3734 4520 -2.0833333333333326e-11 3734 3731 4.1666666666666665e-11 3734 4728 -2.0833333333333329e-11 3734 4816 -2.0833333333333329e-11 3734 3744 -2.0833333333333326e-11 3734 4738 -4.1666666666666665e-11 3734 4817 -2.0833333333333332e-11 3734 4746 2.0833333333333326e-11 3734 4740 -4.1666666666666665e-11 3734 3737 4.1666666666666665e-11 3734 3745 -2.0833333333333326e-11 3734 4726 -2.0833333333333332e-11 3734 4725 -2.0833333333333326e-11 3734 4743 -4.1666666666666665e-11 3734 3733 4.1666666666666665e-11 3734 3735 -2.0833333333333326e-11 3735 3735 2.4999999999999996e-10 3735 4729 -1.0416666666666665e-11 3735 4520 -1.0416666666666665e-11 3735 4519 2.0833333333333339e-11 3735 4518 -1.0416666666666663e-11 3735 4750 -6.2500000000000004e-11 3735 3731 -2.6253290925755273e-27 3735 3743 -2.0833333333333326e-11 3735 4726 2.0833333333333339e-11 3735 4725 -1.0416666666666663e-11 3735 4743 6.2500000000000004e-11 3735 3733 1.6155871338926322e-27 3735 3734 -2.0833333333333326e-11 3736 3736 2.5000000000000002e-10 3736 4721 2.0833333333333332e-11 3736 4728 -2.0833333333333332e-11 3736 4727 -2.0833333333333326e-11 3736 3733 4.1666666666666665e-11 3736 4817 -2.0833333333333329e-11 3736 3745 -2.0833333333333326e-11 3736 4805 -4.1666666666666665e-11 3736 4415 2.0833333333333332e-11 3736 4423 -2.0833333333333332e-11 3736 4422 -2.0833333333333326e-11 3736 4719 4.1666666666666665e-11 3736 3723 4.1666666666666665e-11 3736 3732 -2.0833333333333326e-11 3736 4416 2.0833333333333332e-11 3736 4809 2.0833333333333326e-11 3736 4413 4.1666666666666665e-11 3736 3737 4.1666666666666665e-11 3736 3722 -2.0833333333333326e-11 3737 3737 6.6666666666666674e-10 3737 4738 -1.0416666666666666e-11 3737 4805 -1.0416666666666666e-11 3737 4817 -8.3333333333333330e-11 3737 4746 6.2499999999999991e-11 3737 4740 -1.0416666666666666e-11 3737 3745 9.5018296033870872e-28 3737 3734 4.1666666666666665e-11 3737 4816 -8.3333333333333330e-11 3737 4500 -1.0416666666666666e-11 3737 3744 9.5018296033870872e-28 3737 4398 -1.0416666666666666e-11 3737 4504 6.2499999999999991e-11 3737 4492 -1.0416666666666666e-11 3737 3729 4.1666666666666665e-11 3737 4815 -8.3333333333333330e-11 3737 4408 6.2499999999999991e-11 3737 4402 -1.0416666666666666e-11 3737 3738 9.5018296033870872e-28 3737 3721 4.1666666666666665e-11 3737 4416 8.3333333333333330e-11 3737 4809 6.2499999999999991e-11 3737 4413 1.0416666666666666e-11 3737 3722 9.5018296033870872e-28 3737 3736 4.1666666666666665e-11 3738 3738 2.4999999999999996e-10 3738 4410 1.0416666666666666e-11 3738 4824 -2.0833333333333339e-11 3738 4505 1.0416666666666666e-11 3738 3740 -2.6253290925755273e-27 3738 4504 1.0416666666666665e-11 3738 4492 6.2499999999999991e-11 3738 3729 -2.0833333333333326e-11 3738 4815 2.0833333333333332e-11 3738 4408 1.0416666666666665e-11 3738 4402 6.2499999999999991e-11 3738 3737 1.6155871338926322e-27 3738 3721 -2.0833333333333326e-11 3739 3739 2.5000000000000002e-10 3739 4457 2.0833333333333326e-11 3739 4482 -4.1666666666666665e-11 3739 3726 4.1666666666666665e-11 3739 3728 -2.0833333333333326e-11 3739 4421 -2.0833333333333332e-11 3739 4425 -2.0833333333333332e-11 3739 4424 -2.0833333333333326e-11 3739 3723 4.1666666666666665e-11 3739 4854 -2.0833333333333332e-11 3739 3741 -2.0833333333333326e-11 3739 4840 -4.1666666666666665e-11 3739 4451 2.0833333333333329e-11 3739 4452 2.0833333333333332e-11 3739 4844 2.0833333333333326e-11 3739 4449 4.1666666666666665e-11 3739 3740 4.1666666666666665e-11 3739 3725 -2.0833333333333326e-11 3739 2060 2.0833333333333332e-11 3740 3740 6.6666666666666674e-10 3740 4402 -1.0416666666666666e-11 3740 4840 -1.0416666666666666e-11 3740 4854 -8.3333333333333330e-11 3740 4410 6.2499999999999991e-11 3740 4404 -1.0416666666666666e-11 3740 3741 9.5018296033870872e-28 3740 3721 4.1666666666666665e-11 3740 4824 8.3333333333333330e-11 3740 4492 -1.0416666666666666e-11 3740 3738 -3.0991386737738975e-27 3740 4434 -1.0416666666666666e-11 3740 4505 6.2499999999999991e-11 3740 4494 -1.0416666666666666e-11 3740 3729 4.1666666666666665e-11 3740 4511 8.3333333333333330e-11 3740 4444 6.2499999999999991e-11 3740 4440 -1.0416666666666666e-11 3740 3730 9.5018296033870872e-28 3740 3724 4.1666666666666665e-11 3740 4452 8.3333333333333330e-11 3740 4844 6.2499999999999991e-11 3740 4449 1.0416666666666666e-11 3740 3725 -3.0991386737738975e-27 3740 3739 4.1666666666666665e-11 3741 3741 2.4999999999999996e-10 3741 4406 1.0416666666666665e-11 3741 4425 2.0833333333333339e-11 3741 4424 -1.0416666666666663e-11 3741 3723 -2.6253290925755273e-27 3741 4844 1.0416666666666665e-11 3741 4840 6.2500000000000004e-11 3741 3739 -2.0833333333333326e-11 3741 4854 2.0833333333333339e-11 3741 4410 1.0416666666666663e-11 3741 4404 6.2500000000000004e-11 3741 3740 1.6155871338926322e-27 3741 3721 -2.0833333333333326e-11 3742 3742 2.4999999999999996e-10 3742 4458 -2.0833333333333339e-11 3742 4888 6.2499999999999991e-11 3742 3743 -2.0833333333333326e-11 3742 4518 -1.0416666666666666e-11 3742 4517 2.0833333333333339e-11 3742 4446 1.0416666666666666e-11 3742 3731 -2.6253290925755273e-27 3742 3726 1.6155871338926322e-27 3742 4442 1.0416666666666665e-11 3742 4436 6.2500000000000004e-11 3742 3724 -2.0833333333333326e-11 3742 2067 -1.0416666666666665e-11 3743 3743 2.4999999999999996e-10 3743 3746 -2.0833333333333326e-11 3743 4893 -4.1666666666666665e-11 3743 4458 2.0833333333333332e-11 3743 4888 -4.1666666666666665e-11 3743 3726 4.1666666666666665e-11 3743 3742 -2.0833333333333326e-11 3743 4726 -2.0833333333333332e-11 3743 4730 -2.0833333333333332e-11 3743 4729 -2.0833333333333326e-11 3743 3733 4.1666666666666665e-11 3743 4519 -2.0833333333333332e-11 3743 4750 4.1666666666666665e-11 3743 3735 -2.0833333333333326e-11 3743 4517 -2.0833333333333332e-11 3743 3731 4.1666666666666665e-11 3743 4518 -2.0833333333333326e-11 3743 2066 -2.0833333333333329e-11 3743 2067 -2.0833333333333326e-11 3744 3744 2.4999999999999996e-10 3744 4502 1.0416666666666666e-11 3744 4521 2.0833333333333339e-11 3744 4520 -1.0416666666666666e-11 3744 3731 -2.6253290925755273e-27 3744 4746 1.0416666666666665e-11 3744 4738 6.2500000000000004e-11 3744 3734 -2.0833333333333326e-11 3744 4816 2.0833333333333339e-11 3744 4504 1.0416666666666665e-11 3744 4500 6.2499999999999991e-11 3744 3737 1.6155871338926322e-27 3744 3729 -2.0833333333333326e-11 3745 3745 2.4999999999999996e-10 3745 4725 -1.0416666666666666e-11 3745 4728 2.0833333333333339e-11 3745 4727 -1.0416666666666666e-11 3745 3733 -2.6253290925755273e-27 3745 4809 1.0416666666666665e-11 3745 4805 6.2499999999999991e-11 3745 3736 -2.0833333333333326e-11 3745 4817 2.0833333333333332e-11 3745 4746 1.0416666666666665e-11 3745 4740 6.2499999999999991e-11 3745 3737 1.6155871338926322e-27 3745 3734 -2.0833333333333326e-11 3746 3746 2.4999999999999996e-10 3746 4893 6.2499999999999991e-11 3746 3743 -2.0833333333333326e-11 3746 4475 6.2499999999999991e-11 3746 3726 1.6155871338926322e-27 3746 3727 -2.0833333333333326e-11 3746 4479 1.0416666666666666e-11 3746 4730 2.0833333333333339e-11 3746 4729 -1.0416666666666666e-11 3746 3733 -2.6253290925755273e-27 3746 2067 -1.0416666666666665e-11 3746 2066 2.0833333333333332e-11 3746 2065 -1.0416666666666665e-11 3747 3747 2.5000000000000002e-10 3747 4871 2.0833333333333332e-11 3747 4425 -2.0833333333333332e-11 3747 4404 -4.1666666666666665e-11 3747 3761 -2.0833333333333326e-11 3747 4405 2.0833333333333326e-11 3747 4394 -4.1666666666666665e-11 3747 4415 2.0833333333333332e-11 3747 3750 4.1666666666666665e-11 3747 4406 2.0833333333333326e-11 3747 4414 2.0833333333333332e-11 3747 4407 2.0833333333333326e-11 3747 4398 -4.1666666666666665e-11 3747 3748 -2.0833333333333326e-11 3748 3748 2.4999999999999996e-10 3748 4417 -1.0416666666666665e-11 3748 4422 -1.0416666666666666e-11 3748 4413 -6.2500000000000004e-11 3748 3756 -2.0833333333333326e-11 3748 4415 -2.0833333333333339e-11 3748 3750 -2.6253290925755273e-27 3748 4406 1.0416666666666666e-11 3748 4414 -2.0833333333333339e-11 3748 4407 1.0416666666666665e-11 3748 4398 6.2499999999999991e-11 3748 3747 -2.0833333333333326e-11 3749 3749 3.3333333333333332e-10 3750 3750 6.6666666666666674e-10 3750 4482 -1.0416666666666666e-11 3750 4404 -1.0416666666666666e-11 3750 4425 -8.3333333333333330e-11 3750 3761 -3.0991386737738975e-27 3750 4424 -6.2499999999999991e-11 3750 4840 -1.0416666666666666e-11 3750 3760 4.1666666666666665e-11 3750 4413 1.0416666666666666e-11 3750 4473 -1.0416666666666666e-11 3750 4423 -8.3333333333333330e-11 3750 3757 -3.0991386737738975e-27 3750 4422 -6.2499999999999991e-11 3750 4719 1.0416666666666666e-11 3750 3756 4.1666666666666665e-11 3750 4421 -8.3333333333333330e-11 3750 3753 -3.0991386737738975e-27 3750 4420 -6.2499999999999991e-11 3750 4477 -1.0416666666666666e-11 3750 3752 4.1666666666666665e-11 3750 4415 8.3333333333333330e-11 3750 3748 -3.0991386737738975e-27 3750 4406 6.2499999999999991e-11 3750 4398 -1.0416666666666666e-11 3750 3747 4.1666666666666665e-11 3751 3751 1.2499999999999998e-10 3752 3752 2.5000000000000002e-10 3752 4718 2.0833333333333332e-11 3752 4423 -2.0833333333333332e-11 3752 4473 -4.1666666666666665e-11 3752 3757 -2.0833333333333326e-11 3752 4474 2.0833333333333326e-11 3752 4469 -4.1666666666666665e-11 3752 4421 -2.0833333333333332e-11 3752 3750 4.1666666666666665e-11 3752 4420 -2.0833333333333326e-11 3752 4483 2.0833333333333332e-11 3752 4478 2.0833333333333326e-11 3752 4477 -4.1666666666666665e-11 3752 3753 -2.0833333333333326e-11 3753 3753 2.4999999999999996e-10 3753 4484 -1.0416666666666665e-11 3753 4424 -1.0416666666666666e-11 3753 4482 6.2500000000000004e-11 3753 3760 -2.0833333333333326e-11 3753 4421 2.0833333333333339e-11 3753 3750 -2.6253290925755273e-27 3753 4420 -1.0416666666666666e-11 3753 4483 -2.0833333333333339e-11 3753 4478 1.0416666666666665e-11 3753 4477 6.2499999999999991e-11 3753 3752 -2.0833333333333326e-11 3754 3754 3.3333333333333332e-10 3755 3755 1.2499999999999998e-10 3756 3756 2.5000000000000002e-10 3756 4414 2.0833333333333329e-11 3756 4415 2.0833333333333332e-11 3756 4413 4.1666666666666665e-11 3756 3748 -2.0833333333333326e-11 3756 4417 -2.0833333333333326e-11 3756 4803 -4.1666666666666665e-11 3756 4423 -2.0833333333333332e-11 3756 3750 4.1666666666666665e-11 3756 4422 -2.0833333333333326e-11 3756 4718 2.0833333333333332e-11 3756 4811 2.0833333333333326e-11 3756 4719 4.1666666666666665e-11 3756 3757 -2.0833333333333326e-11 3757 3757 2.4999999999999996e-10 3757 4474 1.0416666666666665e-11 3757 4420 -1.0416666666666663e-11 3757 4473 6.2500000000000004e-11 3757 3752 -2.0833333333333326e-11 3757 4423 2.0833333333333339e-11 3757 3750 -2.6253290925755273e-27 3757 4422 -1.0416666666666665e-11 3757 4718 -2.0833333333333339e-11 3757 4811 1.0416666666666663e-11 3757 4719 -6.2500000000000004e-11 3757 3756 -2.0833333333333326e-11 3758 3758 3.3333333333333332e-10 3759 3759 1.2499999999999998e-10 3760 3760 2.5000000000000002e-10 3760 4483 2.0833333333333329e-11 3760 4421 -2.0833333333333332e-11 3760 4482 -4.1666666666666665e-11 3760 3753 -2.0833333333333326e-11 3760 4484 -2.0833333333333326e-11 3760 4842 -4.1666666666666665e-11 3760 4425 -2.0833333333333332e-11 3760 3750 4.1666666666666665e-11 3760 4424 -2.0833333333333326e-11 3760 4871 2.0833333333333332e-11 3760 4847 2.0833333333333326e-11 3760 4840 -4.1666666666666665e-11 3760 3761 -2.0833333333333326e-11 3761 3761 2.4999999999999996e-10 3761 4405 1.0416666666666665e-11 3761 4406 1.0416666666666663e-11 3761 4404 6.2500000000000004e-11 3761 3747 -2.0833333333333326e-11 3761 4425 2.0833333333333339e-11 3761 3750 -2.6253290925755273e-27 3761 4424 -1.0416666666666665e-11 3761 4871 -2.0833333333333339e-11 3761 4847 1.0416666666666663e-11 3761 4840 6.2500000000000004e-11 3761 3760 -2.0833333333333326e-11 3762 3762 3.3333333333333332e-10 3763 3763 1.2499999999999998e-10 3764 3764 2.5000000000000002e-10 3764 4396 -4.1666666666666665e-11 3764 4395 2.0833333333333326e-11 3764 4394 -4.1666666666666665e-11 3764 4414 2.0833333333333329e-11 3764 4407 2.0833333333333326e-11 3764 4412 2.0833333333333332e-11 3764 4399 2.0833333333333326e-11 3764 4398 -4.1666666666666665e-11 3764 3765 -2.0833333333333326e-11 3765 3765 2.4999999999999996e-10 3765 4810 1.0416666666666666e-11 3765 4407 1.0416666666666665e-11 3765 4414 -2.0833333333333339e-11 3765 4417 -1.0416666666666665e-11 3765 4413 -6.2499999999999991e-11 3765 3767 -2.0833333333333326e-11 3765 4412 -2.0833333333333339e-11 3765 4399 1.0416666666666666e-11 3765 4398 6.2500000000000004e-11 3765 3764 -2.0833333333333326e-11 3766 3766 3.3333333333333332e-10 3767 3767 2.5000000000000002e-10 3767 4803 -4.1666666666666665e-11 3767 4802 2.0833333333333326e-11 3767 4801 -4.1666666666666665e-11 3767 4412 2.0833333333333332e-11 3767 4810 2.0833333333333326e-11 3767 4414 2.0833333333333332e-11 3767 4417 -2.0833333333333326e-11 3767 4413 4.1666666666666665e-11 3767 3765 -2.0833333333333326e-11 3768 3768 3.3333333333333332e-10 3769 3769 1.2499999999999998e-10 3770 3770 1.6666666666666666e-10 3771 3771 1.2499999999999998e-10 3772 3772 1.6666666666666666e-10 3773 3773 1.2499999999999998e-10 3774 3774 1.2499999999999998e-10 3775 3775 2.5000000000000002e-10 3775 4866 -2.0833333333333329e-11 3775 4462 2.0833333333333332e-11 3775 4464 -2.0833333333333332e-11 3775 4885 -2.0833333333333332e-11 3775 4439 2.0833333333333326e-11 3775 4438 -4.1666666666666665e-11 3775 3780 4.1666666666666665e-11 3775 3779 -2.0833333333333326e-11 3775 4864 2.0833333333333332e-11 3775 4433 2.0833333333333326e-11 3775 4432 -4.1666666666666665e-11 3775 3778 -2.0833333333333326e-11 3775 4459 2.0833333333333332e-11 3775 4431 2.0833333333333326e-11 3775 4430 -4.1666666666666665e-11 3775 3777 4.1666666666666665e-11 3775 3776 -2.0833333333333326e-11 3775 2409 4.1666666666666665e-11 3776 3776 4.9999999999999993e-10 3776 4462 -1.6155871338926322e-27 3776 3780 5.2083333333333334e-11 3776 4460 1.2499999999999998e-10 3776 3782 -1.0416666666666665e-11 3776 4468 -4.1666666666666665e-11 3776 4439 1.0416666666666665e-11 3776 4459 -6.4623485355705287e-27 3776 4431 1.0416666666666663e-11 3776 4430 6.2500000000000004e-11 3776 3777 5.2083333333333328e-11 3776 3775 -2.0833333333333326e-11 3776 1811 4.1666666666666671e-11 3776 1785 -1.2499999999999998e-10 3776 1209 -1.0416666666666668e-11 3776 1759 -3.1250000000000002e-11 3776 1760 2.0833333333333339e-11 3776 1757 -3.1250000000000002e-11 3776 1206 6.2499999999999991e-11 3777 3777 1.6666667291666666e-02 3777 4460 3.1250000000000002e-11 3777 4468 -1.6666666666666666e-10 3777 5011 3.1250000000000002e-11 3777 3782 2.0833333333333336e-11 3777 4467 -7.2916666666666673e-11 3777 3781 5.2083333333333334e-11 3777 5004 -1.0416666666666666e-11 3777 4432 -1.0416666666666666e-11 3777 4466 -4.1666667083333324e-03 3777 4465 -6.2499999999999991e-11 3777 4464 -4.1666667083333333e-03 3777 4463 -6.2500000000000003e-03 3777 4865 1.0416666666666667e-03 3777 3778 -7.4433021799253829e-20 3777 4459 7.2916666666666660e-11 3777 4431 6.2499999999999991e-11 3777 4430 -1.0416666666666666e-11 3777 3776 5.2083333333333328e-11 3777 3775 4.1666666666666665e-11 3777 3623 -1.0416666666666667e-03 3777 3661 -1.0416666666666666e-11 3777 2412 -1.4558380320789774e-20 3777 290 4.1666666666666665e-11 3777 2410 4.1666666666666666e-03 3778 3778 1.2500000124999999e-02 3778 4431 1.0416666666666666e-11 3778 4464 1.0416666770833340e-03 3778 4463 -1.0416666666666664e-03 3778 4865 -6.2500000000000003e-03 3778 3777 -1.0097419586828951e-27 3778 4864 -1.0416666770833331e-03 3778 4433 1.0416666666666665e-11 3778 4432 6.2499999999999991e-11 3778 3775 -2.0833333333333326e-11 3778 3325 1.0416666666666662e-03 3778 2410 -2.0833333333333329e-03 3778 2409 8.1315162936412833e-20 3779 3779 1.2500000125000001e-02 3779 4886 1.0416666666666664e-03 3779 4433 1.0416666666666665e-11 3779 4866 1.0416666770833335e-03 3779 4889 -6.2500000000000003e-03 3779 4885 1.0416666770833333e-03 3779 4439 1.0416666666666666e-11 3779 4438 6.2499999999999991e-11 3779 3780 1.3552525540481672e-20 3779 3775 -2.0833333333333326e-11 3779 3326 1.0416666666666664e-03 3779 2409 1.6155871338926322e-27 3779 288 -2.0833333333333329e-03 3780 3780 1.6666667229166664e-02 3780 4886 6.2500000000000003e-03 3780 4462 7.2916666666666673e-11 3780 3776 5.2083333333333334e-11 3780 4889 1.0416666666666667e-03 3780 4430 -1.0416666666666666e-11 3780 4885 -4.1666667083333324e-03 3780 4439 6.2499999999999991e-11 3780 4438 -1.0416666666666666e-11 3780 3779 -1.4558380320789774e-20 3780 3775 4.1666666666666665e-11 3780 709 -2.0833333333333329e-11 3780 708 -4.1666666979166666e-03 3780 1011 -1.0416666666666667e-03 3780 289 7.0197859108400047e-20 3780 288 4.1666666666666666e-03 3780 707 1.0416666666666665e-11 3780 698 2.0833333333333326e-11 3780 1819 6.2499999999999991e-11 3780 286 5.2083333333333328e-11 3780 1207 5.2083333333333328e-11 3780 1804 3.1249999999999995e-11 3780 1811 1.6666666666666666e-10 3780 1785 -3.1250000000000002e-11 3780 1209 2.0833333333333339e-11 3781 3781 3.7499999999999995e-10 3781 5004 6.2499999999999991e-11 3781 5011 1.2499999999999998e-10 3781 3782 -1.0416666666666668e-11 3781 4468 -4.1666666666666665e-11 3781 4467 3.2311742677852644e-27 3781 3777 5.2083333333333334e-11 3781 4465 -1.0416666666666666e-11 3781 1787 -2.0833333333333339e-11 3781 947 -1.0416666666666665e-11 3781 290 -2.0833333333333326e-11 3781 1208 1.6155871338926322e-27 3781 1764 1.0416666666666665e-11 3781 1758 4.1666666666666671e-11 3781 1757 -3.1250000000000002e-11 3781 1206 2.0833333333333339e-11 3782 3782 1.6666666666666663e-10 3782 5011 1.0416666666666660e-11 3782 3781 -1.0416666666666666e-11 3782 4460 1.0416666666666665e-11 3782 3776 -1.0416666666666663e-11 3782 4459 1.0416666666666666e-11 3782 4467 -1.0416666666666665e-11 3782 4468 -6.2499999999999991e-11 3782 3777 2.0833333333333339e-11 3782 1758 1.0416666666666666e-11 3782 1760 1.0416666666666666e-11 3782 1757 2.0833333333333342e-11 3782 1206 -6.2499999999999991e-11 3783 3783 4.3749999999999994e-10 3783 4456 2.0194839173657902e-27 3783 3785 1.6155871338926322e-27 3783 3790 6.2500000000000004e-11 3783 3784 6.2500000000000004e-11 3783 4455 2.0194839173657902e-27 3783 4454 -6.4623485355705287e-27 3783 4460 -1.0416666666666666e-11 3783 2069 -5.2083333333333334e-11 3783 1774 -1.0416666666666669e-11 3783 1773 -1.4583333333333335e-10 3783 1236 -6.2500000000000004e-11 3783 2128 -5.2083333333333334e-11 3783 1783 2.2470898404921788e-28 3783 1772 -1.0416666666666671e-11 3783 1244 6.2499999999999991e-11 3783 1760 5.2083333333333328e-11 3783 1770 -1.0416666666666668e-11 3783 1765 1.0416666666666665e-11 3783 1757 1.0416666666666667e-10 3783 1235 1.6155871338926322e-27 3783 1229 -4.1666666666666665e-11 3784 3784 3.7500000000000000e-10 3784 4461 -1.0416666666666674e-11 3784 3791 -2.6253290925755273e-27 3784 3783 6.2499999999999991e-11 3784 4437 1.0416666666666663e-11 3784 4443 1.0416666666666665e-11 3784 4430 6.2500000000000004e-11 3784 3786 -2.0833333333333326e-11 3784 4455 1.0416666666666668e-11 3784 4454 -2.0194839173657902e-27 3784 4460 1.0416666666666666e-11 3784 3785 1.6155871338926322e-27 3784 1803 4.5860624244724788e-28 3784 1757 5.2083333333333334e-11 3784 1785 -1.0416666666666669e-11 3784 1760 1.4583333333333335e-10 3784 1759 5.2083333333333334e-11 3784 1230 6.2499999999999991e-11 3784 1229 -6.2500000000000004e-11 3785 3785 5.4166666666666666e-10 3785 4456 9.3749999999999999e-11 3785 3790 9.5018296033870872e-28 3785 4454 1.0416666666666667e-10 3785 3783 1.0034310714411270e-27 3785 4449 1.0416666666666666e-11 3785 4453 -6.2499999999999991e-11 3785 4846 -1.0416666666666666e-11 3785 3789 4.1666666666666665e-11 3785 4430 -1.0416666666666666e-11 3785 4450 8.3333333333333330e-11 3785 4443 6.2499999999999991e-11 3785 4434 -1.0416666666666666e-11 3785 3787 -3.0991386737738975e-27 3785 3786 4.1666666666666665e-11 3785 4455 -9.3750000000000012e-11 3785 4460 -3.6295685768920020e-28 3785 3784 9.5018296033870872e-28 3785 1774 -2.2851328271989659e-27 3786 3786 2.5000000000000002e-10 3786 4887 2.0833333333333332e-11 3786 4458 2.0833333333333332e-11 3786 4436 -4.1666666666666665e-11 3786 3792 -2.0833333333333326e-11 3786 4461 2.0833333333333332e-11 3786 4437 2.0833333333333326e-11 3786 3791 4.1666666666666665e-11 3786 4455 -2.0833333333333332e-11 3786 3784 -2.0833333333333326e-11 3786 4430 -4.1666666666666665e-11 3786 4451 2.0833333333333329e-11 3786 3788 4.1666666666666665e-11 3786 4442 2.0833333333333326e-11 3786 4450 2.0833333333333332e-11 3786 4443 2.0833333333333326e-11 3786 4434 -4.1666666666666665e-11 3786 3785 4.1666666666666665e-11 3786 3787 -2.0833333333333326e-11 3787 3787 2.4999999999999996e-10 3787 4453 -1.0416666666666666e-11 3787 4457 1.0416666666666665e-11 3787 4449 -6.2499999999999991e-11 3787 3789 -2.0833333333333326e-11 3787 4451 -2.0833333333333332e-11 3787 3788 1.6155871338926322e-27 3787 4442 1.0416666666666665e-11 3787 4450 -2.0833333333333339e-11 3787 4443 1.0416666666666666e-11 3787 4434 6.2499999999999991e-11 3787 3785 -2.6253290925755273e-27 3787 3786 -2.0833333333333326e-11 3788 3788 6.6666666666666664e-10 3788 4893 -1.0416666666666666e-11 3788 4458 8.3333333333333330e-11 3788 3792 9.5018296033870872e-28 3788 4888 -1.0416666666666666e-11 3788 4475 -1.0416666666666666e-11 3788 4477 -1.0416666666666666e-11 3788 4457 6.2499999999999991e-11 3788 4482 -1.0416666666666666e-11 3788 3789 4.1666666666666665e-11 3788 4436 -1.0416666666666666e-11 3788 4449 1.0416666666666666e-11 3788 4451 8.3333333333333330e-11 3788 3787 9.5018296033870872e-28 3788 4442 6.2499999999999991e-11 3788 4434 -1.0416666666666666e-11 3788 3786 4.1666666666666665e-11 3788 2067 -6.2499999999999991e-11 3788 1243 4.1666666666666665e-11 3788 2066 -8.3333333333333330e-11 3788 1242 9.5018296033870872e-28 3788 2065 -6.2499999999999991e-11 3788 1241 4.1666666666666665e-11 3788 2060 8.3333333333333330e-11 3788 1240 9.5018296033870872e-28 3789 3789 2.4999999999999996e-10 3789 3790 -2.0833333333333326e-11 3789 4846 -4.1666666666666665e-11 3789 3788 4.1666666666666665e-11 3789 4457 2.0833333333333326e-11 3789 4482 -4.1666666666666665e-11 3789 4450 2.0833333333333329e-11 3789 4451 2.0833333333333332e-11 3789 4449 4.1666666666666665e-11 3789 3787 -2.0833333333333326e-11 3789 4456 2.0833333333333332e-11 3789 4453 -2.0833333333333326e-11 3789 3785 4.1666666666666665e-11 3789 2063 -2.0833333333333332e-11 3789 2060 2.0833333333333329e-11 3789 2059 2.0833333333333332e-11 3789 2058 2.0833333333333326e-11 3789 1237 4.1666666666666665e-11 3789 1240 -2.0833333333333326e-11 3790 3790 3.1249999999999995e-10 3790 4456 -1.0416666666666671e-11 3790 3785 1.6155871338926322e-27 3790 4454 -2.2470898404921788e-28 3790 3783 6.2499999999999991e-11 3790 4846 6.2500000000000004e-11 3790 3789 -2.0833333333333326e-11 3790 4453 -1.0416666666666663e-11 3790 1773 -5.2083333333333334e-11 3790 1774 1.0416666666666669e-11 3790 2058 1.0416666666666665e-11 3790 2063 2.0833333333333339e-11 3790 2062 -1.0416666666666663e-11 3790 2069 -1.0416666666666667e-10 3790 1237 -2.6253290925755273e-27 3790 1236 -4.1666666666666665e-11 3791 3791 5.4166666666666666e-10 3791 4461 9.3749999999999999e-11 3791 3784 -3.0991386737738975e-27 3791 4887 8.3333333333333330e-11 3791 4888 -1.0416666666666666e-11 3791 3792 -3.0991386737738975e-27 3791 4436 -1.0416666666666666e-11 3791 4437 6.2499999999999991e-11 3791 4430 -1.0416666666666666e-11 3791 3786 4.1666666666666665e-11 3791 1785 2.2851328271989659e-27 3791 2074 -1.0416666666666666e-11 3791 2075 6.2499999999999991e-11 3791 1243 4.1666666666666665e-11 3791 2076 -9.3750000000000012e-11 3791 1803 1.0416666666666667e-10 3791 1802 -3.6295685768920020e-28 3791 1238 -3.0991386737738975e-27 3791 1230 1.0034310714411270e-27 3792 3792 2.4999999999999996e-10 3792 4458 -2.0833333333333339e-11 3792 3788 1.6155871338926322e-27 3792 4887 -2.0833333333333339e-11 3792 4888 6.2500000000000004e-11 3792 3791 -2.6253290925755273e-27 3792 4437 1.0416666666666666e-11 3792 4442 1.0416666666666665e-11 3792 4436 6.2499999999999991e-11 3792 3786 -2.0833333333333326e-11 3792 2067 -1.0416666666666665e-11 3792 2075 1.0416666666666666e-11 3792 1243 -2.0833333333333326e-11 3793 3793 2.5000000000000002e-10 3793 4852 -2.0833333333333329e-11 3793 4464 -2.0833333333333332e-11 3793 4432 -4.1666666666666665e-11 3793 3810 -2.0833333333333326e-11 3793 4459 2.0833333333333332e-11 3793 3807 4.1666666666666665e-11 3793 4431 2.0833333333333326e-11 3793 4455 -2.0833333333333332e-11 3793 4430 -4.1666666666666665e-11 3793 3806 -2.0833333333333326e-11 3793 4450 2.0833333333333329e-11 3793 3797 4.1666666666666665e-11 3793 4443 2.0833333333333326e-11 3793 4448 2.0833333333333332e-11 3793 4435 2.0833333333333326e-11 3793 4434 -4.1666666666666665e-11 3793 3795 4.1666666666666665e-11 3793 3794 -2.0833333333333326e-11 3794 3794 2.4999999999999996e-10 3794 4845 1.0416666666666665e-11 3794 4443 1.0416666666666666e-11 3794 4450 -2.0833333333333339e-11 3794 4453 -1.0416666666666666e-11 3794 4449 -6.2499999999999991e-11 3794 3797 -2.6253290925755273e-27 3794 3796 -2.0833333333333326e-11 3794 4448 -2.0833333333333332e-11 3794 4435 1.0416666666666665e-11 3794 4434 6.2499999999999991e-11 3794 3795 1.6155871338926322e-27 3794 3793 -2.0833333333333326e-11 3795 3795 3.3333333666666659e-02 3795 4856 1.0416666666666667e-03 3795 4865 1.0416666666666667e-03 3795 4853 -6.2500000000000003e-03 3795 4895 -1.0416666666666667e-03 3795 3800 4.1666666666666666e-03 3795 4852 -4.1666667083333333e-03 3795 3810 7.0197856548546410e-20 3795 4432 -1.0416666666666666e-11 3795 4851 -4.1666667083333324e-03 3795 4838 -1.0416666666666666e-11 3795 3808 8.4829026083874785e-20 3795 4845 6.2499999999999991e-11 3795 4449 1.0416666666666666e-11 3795 3796 4.1666666666666665e-11 3795 4850 -8.3333333333333315e-03 3795 4849 -6.2500000000000003e-03 3795 4897 1.0416666666666667e-03 3795 3799 1.5502688168223823e-19 3795 3798 4.1666666666666666e-03 3795 4448 8.3333333333333330e-11 3795 4435 6.2499999999999991e-11 3795 4434 -1.0416666666666666e-11 3795 3794 9.5018296033870872e-28 3795 3793 4.1666666666666665e-11 3796 3796 2.5000000000000002e-10 3796 4456 2.0833333333333332e-11 3796 4863 2.0833333333333332e-11 3796 4846 -4.1666666666666665e-11 3796 3811 -2.0833333333333326e-11 3796 4855 2.0833333333333332e-11 3796 3809 4.1666666666666665e-11 3796 4839 2.0833333333333326e-11 3796 4851 -2.0833333333333332e-11 3796 4838 -4.1666666666666665e-11 3796 3808 -2.0833333333333326e-11 3796 4448 2.0833333333333329e-11 3796 3795 4.1666666666666665e-11 3796 4845 2.0833333333333326e-11 3796 4450 2.0833333333333332e-11 3796 4453 -2.0833333333333326e-11 3796 4449 4.1666666666666665e-11 3796 3797 4.1666666666666665e-11 3796 3794 -2.0833333333333326e-11 3797 3797 5.4166666666666666e-10 3797 4454 1.0416666666666667e-10 3797 3816 -3.0991386737738975e-27 3797 4456 9.3750000000000012e-11 3797 3811 5.2037209612904044e-27 3797 4460 -3.6295685768920020e-28 3797 4846 -1.0416666666666666e-11 3797 4455 -9.3750000000000012e-11 3797 4430 -1.0416666666666666e-11 3797 3806 1.4262605166395893e-27 3797 4443 6.2499999999999991e-11 3797 4434 -1.0416666666666666e-11 3797 3793 4.1666666666666665e-11 3797 4450 8.3333333333333330e-11 3797 4453 -6.2499999999999991e-11 3797 4449 1.0416666666666666e-11 3797 3794 -3.0991386737738975e-27 3797 3796 4.1666666666666665e-11 3797 1774 1.8812360437258079e-27 3798 3798 2.4999999999999994e-02 3798 4860 -2.0833333333333329e-03 3798 4916 2.0833333333333329e-03 3798 4904 -4.1666666666666666e-03 3798 3812 -2.0833333333333333e-03 3798 4898 2.0833333333333329e-03 3798 3801 4.1666666666666657e-03 3798 4906 2.0833333333333329e-03 3798 4851 -2.0833333333333329e-03 3798 4855 2.0833333333333329e-03 3798 4859 -2.0833333333333329e-03 3798 4856 4.1666666666666666e-03 3798 3809 4.1666666666666657e-03 3798 3808 -2.0833333333333333e-03 3798 4850 -2.0833333333333329e-03 3798 4849 -2.0833333333333329e-03 3798 4897 4.1666666666666666e-03 3798 3795 4.1666666666666657e-03 3798 3799 -2.0833333333333333e-03 3799 3799 2.5000000000000001e-02 3799 4906 1.0416666666666664e-03 3799 4853 -1.0416666666666664e-03 3799 4898 -2.0833333333333337e-03 3799 4896 1.0416666666666664e-03 3799 4895 6.2500000000000003e-03 3799 3801 1.3552527156068805e-20 3799 3800 -2.0833333333333329e-03 3799 4850 2.0833333333333333e-03 3799 4849 -1.0416666666666664e-03 3799 4897 -6.2500000000000003e-03 3799 3795 8.1315162936412833e-20 3799 3798 -2.0833333333333329e-03 3800 3800 2.4999999999999994e-02 3800 4942 -2.0833333333333329e-03 3800 4466 -2.0833333333333329e-03 3800 3813 -2.0833333333333333e-03 3800 4464 -2.0833333333333329e-03 3800 3807 4.1666666666666657e-03 3800 4463 -2.0833333333333329e-03 3800 4852 -2.0833333333333329e-03 3800 4865 4.1666666666666666e-03 3800 3810 -2.0833333333333333e-03 3800 4850 -2.0833333333333329e-03 3800 3795 4.1666666666666657e-03 3800 4853 -2.0833333333333329e-03 3800 4898 2.0833333333333329e-03 3800 4896 2.0833333333333329e-03 3800 4895 -4.1666666666666666e-03 3800 3801 4.1666666666666657e-03 3800 3799 -2.0833333333333333e-03 3800 3623 -4.1666666666666666e-03 3801 3801 3.3333333666666659e-02 3801 4914 1.0416666666666666e-11 3801 4943 -6.2499999999999991e-11 3801 5002 -1.0416666666666666e-11 3801 3804 4.1666666666666665e-11 3801 4942 -4.1666667083333324e-03 3801 3813 8.4829026083874785e-20 3801 4916 4.1666667083333333e-03 3801 4904 -1.0416666666666667e-03 3801 3812 7.0197856548546410e-20 3801 4906 6.2500000000000003e-03 3801 4897 1.0416666666666667e-03 3801 3798 4.1666666666666666e-03 3801 4941 -8.3333333333333330e-11 3801 4940 -6.2499999999999991e-11 3801 4981 -1.0416666666666666e-11 3801 3803 -3.0991386737738975e-27 3801 3802 4.1666666666666665e-11 3801 4898 8.3333333333333315e-03 3801 4896 6.2500000000000003e-03 3801 4895 -1.0416666666666667e-03 3801 3799 -8.8991399020904929e-20 3801 3800 4.1666666666666666e-03 3801 3661 -1.0416666666666666e-11 3801 3623 -1.0416666666666667e-03 3802 3802 2.5000000000000002e-10 3802 4862 2.0833333333333332e-11 3802 5008 2.0833333333333332e-11 3802 4982 -4.1666666666666665e-11 3802 3814 -2.0833333333333326e-11 3802 5006 2.0833333333333329e-11 3802 3805 4.1666666666666665e-11 3802 4988 2.0833333333333326e-11 3802 4916 2.0833333333333332e-11 3802 4860 -2.0833333333333332e-11 3802 4861 -2.0833333333333326e-11 3802 4914 4.1666666666666665e-11 3802 3809 4.1666666666666665e-11 3802 3812 -2.0833333333333326e-11 3802 4941 -2.0833333333333332e-11 3802 4940 -2.0833333333333326e-11 3802 4981 -4.1666666666666665e-11 3802 3801 4.1666666666666665e-11 3802 3803 -2.0833333333333326e-11 3803 3803 2.4999999999999996e-10 3803 4988 1.0416666666666665e-11 3803 4943 -1.0416666666666666e-11 3803 5006 -2.0833333333333332e-11 3803 5003 1.0416666666666665e-11 3803 5002 6.2499999999999991e-11 3803 3805 1.6155871338926322e-27 3803 3804 -2.0833333333333326e-11 3803 4941 2.0833333333333339e-11 3803 4940 -1.0416666666666666e-11 3803 4981 6.2499999999999991e-11 3803 3801 -2.6253290925755273e-27 3803 3802 -2.0833333333333326e-11 3804 3804 2.5000000000000002e-10 3804 5009 -2.0833333333333329e-11 3804 4467 -2.0833333333333332e-11 3804 5004 -4.1666666666666665e-11 3804 3815 -2.0833333333333326e-11 3804 4466 -2.0833333333333332e-11 3804 3807 4.1666666666666665e-11 3804 4465 -2.0833333333333326e-11 3804 4942 -2.0833333333333332e-11 3804 3813 -2.0833333333333326e-11 3804 4941 -2.0833333333333329e-11 3804 3801 4.1666666666666665e-11 3804 4943 -2.0833333333333326e-11 3804 5006 2.0833333333333332e-11 3804 5003 2.0833333333333326e-11 3804 5002 -4.1666666666666665e-11 3804 3805 4.1666666666666665e-11 3804 3803 -2.0833333333333326e-11 3804 3661 -4.1666666666666665e-11 3805 3805 5.4166666666666666e-10 3805 5010 1.0416666666666667e-10 3805 5008 9.3750000000000012e-11 3805 3816 9.5018296033870872e-28 3805 3814 1.4262605166395893e-27 3805 5011 1.8812360437258079e-27 3805 5009 -9.3750000000000012e-11 3805 3815 5.2037209612904044e-27 3805 5004 -1.0416666666666666e-11 3805 4982 -1.0416666666666666e-11 3805 4988 6.2499999999999991e-11 3805 4981 -1.0416666666666666e-11 3805 3802 4.1666666666666665e-11 3805 5006 8.3333333333333330e-11 3805 5003 6.2499999999999991e-11 3805 5002 -1.0416666666666666e-11 3805 3803 9.5018296033870872e-28 3805 3804 4.1666666666666665e-11 3805 1769 -3.6295685768920020e-28 3806 3806 2.2916666666666665e-10 3806 4454 -2.0194839173657902e-27 3806 4468 -2.4233807008389483e-27 3806 3816 1.0416666666666671e-11 3806 4460 1.0416666666666663e-11 3806 4459 1.6155871338926322e-27 3806 3807 -1.0416666666666661e-11 3806 4431 1.0416666666666665e-11 3806 4455 1.0416666666666676e-11 3806 4443 1.0416666666666663e-11 3806 4430 6.2500000000000004e-11 3806 3793 -2.0833333333333326e-11 3807 3807 1.6666667291666666e-02 3807 4460 -5.2083333333333334e-11 3807 4468 -4.1666666666666665e-11 3807 5011 -5.2083333333333334e-11 3807 3816 1.4583333333333332e-10 3807 4467 -1.3541666666666669e-10 3807 5004 -1.0416666666666666e-11 3807 3815 -1.0416666666666671e-11 3807 4465 -6.2499999999999991e-11 3807 3804 4.1666666666666665e-11 3807 4466 -4.1666667083333333e-03 3807 3813 -7.4433021799253829e-20 3807 4463 -6.2500000000000003e-03 3807 4865 1.0416666666666667e-03 3807 3800 4.1666666666666666e-03 3807 4464 -4.1666667083333324e-03 3807 4432 -1.0416666666666666e-11 3807 3810 -1.4558380320789774e-20 3807 4459 1.3541666666666666e-10 3807 3806 -1.0416666666666661e-11 3807 4431 6.2499999999999991e-11 3807 4430 -1.0416666666666666e-11 3807 3793 4.1666666666666665e-11 3807 3661 -1.0416666666666666e-11 3807 3623 -1.0416666666666667e-03 3808 3808 1.2500000124999999e-02 3808 4849 -1.0416666666666662e-03 3808 4859 -1.0416666666666664e-03 3808 4856 -6.2500000000000003e-03 3808 3798 -2.0833333333333329e-03 3808 4855 -1.0416666770833340e-03 3808 3809 -1.0097419586828951e-27 3808 4839 1.0416666666666666e-11 3808 4851 1.0416666770833331e-03 3808 4845 1.0416666666666665e-11 3808 4838 6.2499999999999991e-11 3808 3795 8.1315162936412833e-20 3808 3796 -2.0833333333333326e-11 3809 3809 1.6666667291666663e-02 3809 4862 1.3541666666666669e-10 3809 3814 -1.0416666666666665e-11 3809 4863 1.3541666666666666e-10 3809 3816 1.4583333333333332e-10 3809 3811 -1.0416666666666668e-11 3809 4982 -1.0416666666666666e-11 3809 4861 -6.2499999999999991e-11 3809 4914 1.0416666666666666e-11 3809 3802 4.1666666666666665e-11 3809 4860 -4.1666667083333324e-03 3809 3812 -1.4558380320789774e-20 3809 4904 -1.0416666666666667e-03 3809 4859 -6.2500000000000003e-03 3809 4856 1.0416666666666667e-03 3809 3798 4.1666666666666666e-03 3809 4846 -1.0416666666666666e-11 3809 4855 4.1666667083333333e-03 3809 3808 -7.4433021799253829e-20 3809 4839 6.2499999999999991e-11 3809 4838 -1.0416666666666666e-11 3809 3796 4.1666666666666665e-11 3809 1769 -5.2083333333333334e-11 3809 1775 4.1666666666666658e-11 3809 1774 -5.2083333333333334e-11 3810 3810 1.2500000125000001e-02 3810 4463 -1.0416666666666664e-03 3810 4853 -1.0416666666666664e-03 3810 4865 -6.2500000000000003e-03 3810 3800 -2.0833333333333329e-03 3810 4852 1.0416666770833340e-03 3810 3795 1.6155871338926322e-27 3810 4435 1.0416666666666665e-11 3810 4464 1.0416666770833333e-03 3810 4431 1.0416666666666666e-11 3810 4432 6.2500000000000004e-11 3810 3807 1.3552525540481672e-20 3810 3793 -2.0833333333333326e-11 3811 3811 2.2916666666666665e-10 3811 4863 -9.6935228033557931e-27 3811 3809 -1.0416666666666668e-11 3811 4454 2.0194839173657902e-27 3811 3797 8.0779356694631609e-27 3811 3816 1.0416666666666663e-11 3811 4456 -1.0416666666666663e-11 3811 4453 -1.0416666666666665e-11 3811 4839 1.0416666666666663e-11 3811 4846 6.2500000000000004e-11 3811 3796 -2.0833333333333326e-11 3811 1775 -2.0194839173657902e-27 3811 1774 1.0416666666666671e-11 3812 3812 1.2500000125000001e-02 3812 4940 -1.0416666666666665e-11 3812 4861 -1.0416666666666663e-11 3812 4914 -6.2500000000000004e-11 3812 3802 -2.0833333333333326e-11 3812 4860 1.0416666770833331e-03 3812 3809 1.3552525540481672e-20 3812 4859 -1.0416666666666664e-03 3812 4916 -1.0416666770833340e-03 3812 4906 1.0416666666666664e-03 3812 4904 6.2500000000000003e-03 3812 3801 1.6155871338926322e-27 3812 3798 -2.0833333333333329e-03 3813 3813 1.2500000125000001e-02 3813 4465 -1.0416666666666665e-11 3813 4943 -1.0416666666666663e-11 3813 3804 -2.0833333333333326e-11 3813 4942 1.0416666770833331e-03 3813 3801 8.1315162936412833e-20 3813 4896 1.0416666666666664e-03 3813 4466 1.0416666770833340e-03 3813 4463 -1.0416666666666664e-03 3813 3807 -1.0097419586828951e-27 3813 3800 -2.0833333333333329e-03 3813 3661 6.2500000000000004e-11 3813 3623 6.2500000000000003e-03 3814 3814 2.2916666666666665e-10 3814 5010 -2.0194839173657902e-27 3814 5008 -1.0416666666666676e-11 3814 3809 -1.0416666666666665e-11 3814 3816 1.0416666666666671e-11 3814 4862 0.0000000000000000e+00 3814 4861 -1.0416666666666666e-11 3814 4988 1.0416666666666665e-11 3814 4982 6.2499999999999991e-11 3814 3802 -2.0833333333333326e-11 3814 1775 2.4233807008389483e-27 3814 1769 1.0416666666666663e-11 3815 3815 2.2916666666666665e-10 3815 4468 2.0194839173657902e-27 3815 5010 2.0194839173657902e-27 3815 3816 1.0416666666666663e-11 3815 5011 1.0416666666666671e-11 3815 5009 1.0416666666666663e-11 3815 3805 8.0779356694631609e-27 3815 5003 1.0416666666666665e-11 3815 4467 9.6935228033557931e-27 3815 4465 -1.0416666666666666e-11 3815 5004 6.2500000000000004e-11 3815 3807 -1.0416666666666671e-11 3815 3804 -2.0833333333333326e-11 3816 3816 4.9999999999999993e-10 3816 5010 -2.2214323091023692e-27 3816 5008 -2.0194839173657902e-27 3816 4862 5.2083333333333334e-11 3816 3814 1.0416666666666671e-11 3816 4863 5.2083333333333334e-11 3816 3809 1.4583333333333335e-10 3816 4454 -8.0779356694631609e-27 3816 3797 -2.6253290925755273e-27 3816 4456 4.5860624244724788e-28 3816 3811 1.0416666666666663e-11 3816 4455 2.0194839173657902e-27 3816 4459 5.2083333333333334e-11 3816 4460 -6.2499999999999991e-11 3816 3806 1.0416666666666671e-11 3816 4468 -6.2499999999999991e-11 3816 4467 -5.2083333333333334e-11 3816 3807 1.4583333333333335e-10 3816 3805 1.6155871338926322e-27 3816 5009 2.2470898404921788e-28 3816 5011 -6.2500000000000004e-11 3816 3815 1.0416666666666663e-11 3816 1769 -6.2499999999999991e-11 3816 1775 6.2499999999999991e-11 3816 1774 -6.2500000000000004e-11 3817 3817 2.4999999999999996e-10 3817 4470 2.0833333333333326e-11 3817 4481 2.0833333333333326e-11 3817 4472 2.0833333333333326e-11 3817 4471 -4.1666666666666665e-11 3817 4469 -4.1666666666666665e-11 3817 2038 2.0833333333333332e-11 3817 2033 -2.0833333333333332e-11 3817 2035 4.1666666666666665e-11 3817 1566 -2.0833333333333326e-11 3818 3818 1.2499999999999998e-10 3819 3819 4.5833333333333330e-10 3820 3820 1.2499999999999998e-10 3821 3821 1.6666666666666666e-10 3822 3822 4.5833333333333330e-10 3823 3823 2.4999999999999996e-10 3823 4848 2.0833333333333326e-11 3823 4846 -4.1666666666666665e-11 3823 3824 -2.0833333333333326e-11 3823 4482 -4.1666666666666665e-11 3823 4842 -4.1666666666666665e-11 3823 4483 2.0833333333333332e-11 3823 4484 -2.0833333333333326e-11 3823 2068 2.0833333333333332e-11 3823 2063 -2.0833333333333332e-11 3823 1606 -2.0833333333333326e-11 3823 2059 2.0833333333333332e-11 3823 1602 4.1666666666666665e-11 3823 2058 2.0833333333333326e-11 3824 3824 2.4999999999999996e-10 3824 4482 6.2499999999999991e-11 3824 3823 -2.0833333333333326e-11 3824 4477 6.2500000000000004e-11 3824 3826 -2.0833333333333326e-11 3824 4478 1.0416666666666665e-11 3824 4483 -2.0833333333333339e-11 3824 4484 -1.0416666666666665e-11 3824 2058 1.0416666666666666e-11 3824 2059 -2.0833333333333339e-11 3824 2061 -1.0416666666666666e-11 3824 1602 -2.6253290925755273e-27 3825 3825 3.3333333333333332e-10 3826 3826 2.4999999999999996e-10 3826 4470 2.0833333333333326e-11 3826 4477 -4.1666666666666665e-11 3826 3824 -2.0833333333333326e-11 3826 4469 -4.1666666666666665e-11 3826 4483 2.0833333333333329e-11 3826 4478 2.0833333333333326e-11 3826 2039 2.0833333333333332e-11 3826 2038 2.0833333333333332e-11 3826 2035 4.1666666666666665e-11 3826 1607 -2.0833333333333326e-11 3826 2059 2.0833333333333332e-11 3826 2061 -2.0833333333333326e-11 3826 1602 4.1666666666666665e-11 3827 3827 1.2499999999999998e-10 3828 3828 4.5833333333333330e-10 3829 3829 1.2499999999999998e-10 3830 3830 3.3333333333333332e-10 3831 3831 2.5000000000000002e-10 3831 4524 2.0833333333333329e-11 3831 4526 -2.0833333333333329e-11 3831 4499 2.0833333333333326e-11 3831 4498 -4.1666666666666665e-11 3831 4545 2.0833333333333332e-11 3831 4497 2.0833333333333326e-11 3831 4496 -4.1666666666666665e-11 3831 3833 -2.0833333333333326e-11 3831 4522 2.0833333333333332e-11 3831 4491 2.0833333333333326e-11 3831 4490 -4.1666666666666665e-11 3831 3832 -2.0833333333333326e-11 3831 2909 4.1666666666666665e-11 3832 3832 1.2500000124999999e-02 3832 4499 1.0416666666666666e-11 3832 4524 -1.0416666770833340e-03 3832 4965 1.0416666666666664e-03 3832 4523 -6.2500000000000003e-03 3832 4522 -1.0416666770833331e-03 3832 4491 1.0416666666666665e-11 3832 4490 6.2499999999999991e-11 3832 3831 -2.0833333333333326e-11 3832 3603 1.0416666666666664e-03 3832 2913 -2.0833333333333329e-03 3832 2909 8.1315162936412833e-20 3833 3833 1.2500000125000001e-02 3833 4530 1.0416666666666664e-03 3833 4491 1.0416666666666665e-11 3833 4545 -1.0416666770833333e-03 3833 4497 1.0416666666666666e-11 3833 4496 6.2500000000000004e-11 3833 3831 -2.0833333333333326e-11 3833 4526 1.0416666770833340e-03 3833 4527 6.2500000000000003e-03 3833 3605 1.0416666666666664e-03 3833 2909 1.6155871338926322e-27 3833 2912 -2.0833333333333329e-03 3834 3834 1.6666666833333330e-02 3835 3835 1.6666666833333330e-02 3836 3836 1.2499999999999998e-10 3837 3837 2.5000000000000002e-10 3837 4967 -2.0833333333333329e-11 3837 4521 -2.0833333333333332e-11 3837 4500 -4.1666666666666665e-11 3837 3862 -2.0833333333333326e-11 3837 4525 2.0833333333333332e-11 3837 4501 2.0833333333333326e-11 3837 3855 4.1666666666666665e-11 3837 4514 -2.0833333333333329e-11 3837 3841 -2.0833333333333326e-11 3837 4490 -4.1666666666666665e-11 3837 4510 2.0833333333333332e-11 3837 3840 4.1666666666666665e-11 3837 4502 2.0833333333333326e-11 3837 4509 2.0833333333333332e-11 3837 4503 2.0833333333333326e-11 3837 4494 -4.1666666666666665e-11 3837 3839 4.1666666666666665e-11 3837 3838 -2.0833333333333326e-11 3838 3838 2.4999999999999996e-10 3838 4441 1.0416666666666665e-11 3838 4446 1.0416666666666663e-11 3838 4440 6.2500000000000004e-11 3838 3847 -2.0833333333333326e-11 3838 4510 -2.0833333333333339e-11 3838 3840 -2.6253290925755273e-27 3838 4502 1.0416666666666665e-11 3838 4509 -2.0833333333333339e-11 3838 4503 1.0416666666666663e-11 3838 4494 6.2500000000000004e-11 3838 3839 1.6155871338926322e-27 3838 3837 -2.0833333333333326e-11 3839 3839 3.3333333666666659e-02 3839 4512 -6.2500000000000003e-03 3839 4523 1.0416666666666667e-03 3839 3853 4.1666666666666666e-03 3839 4889 1.0416666666666667e-03 3839 4513 -8.3333333333333315e-03 3839 4516 -6.2500000000000003e-03 3839 3852 1.5502688168223823e-19 3839 3851 4.1666666666666666e-03 3839 4440 -1.0416666666666666e-11 3839 4515 -4.1666667083333324e-03 3839 4441 6.2499999999999991e-11 3839 4438 -1.0416666666666666e-11 3839 3849 -1.4558380320789774e-20 3839 3847 4.1666666666666665e-11 3839 4514 -4.1666667083333333e-03 3839 3841 -7.4433021799253829e-20 3839 4490 -1.0416666666666666e-11 3839 4509 8.3333333333333330e-11 3839 4503 6.2499999999999991e-11 3839 4494 -1.0416666666666666e-11 3839 3838 9.5018296033870872e-28 3839 3837 4.1666666666666665e-11 3839 3692 -1.0416666666666667e-03 3839 3662 -1.0416666666666667e-03 3840 3840 6.6666666666666674e-10 3840 4743 -1.0416666666666666e-11 3840 4500 -1.0416666666666666e-11 3840 4521 -8.3333333333333330e-11 3840 3862 -3.0991386737738975e-27 3840 4520 -6.2499999999999991e-11 3840 4738 -1.0416666666666666e-11 3840 3861 4.1666666666666665e-11 3840 4519 -8.3333333333333330e-11 3840 3860 -3.0991386737738975e-27 3840 4750 1.0416666666666666e-11 3840 4440 -1.0416666666666666e-11 3840 4518 -6.2499999999999991e-11 3840 4888 -1.0416666666666666e-11 3840 3850 4.1666666666666665e-11 3840 4517 -8.3333333333333330e-11 3840 3848 -3.0991386737738975e-27 3840 4446 6.2499999999999991e-11 3840 4436 -1.0416666666666666e-11 3840 3847 4.1666666666666665e-11 3840 4510 8.3333333333333330e-11 3840 3838 -3.0991386737738975e-27 3840 4502 6.2499999999999991e-11 3840 4494 -1.0416666666666666e-11 3840 3837 4.1666666666666665e-11 3841 3841 1.2500000124999999e-02 3841 4501 1.0416666666666665e-11 3841 4525 -1.0416666770833331e-03 3841 3855 8.1315162936412833e-20 3841 4966 1.0416666666666664e-03 3841 4512 -1.0416666666666664e-03 3841 4523 -6.2500000000000003e-03 3841 3853 -2.0833333333333329e-03 3841 4514 1.0416666770833340e-03 3841 3839 -1.0097419586828951e-27 3841 4503 1.0416666666666666e-11 3841 4490 6.2499999999999991e-11 3841 3837 -2.0833333333333326e-11 3842 3842 2.4999999999999994e-02 3842 4648 2.0833333333333329e-03 3842 4610 -2.0833333333333329e-03 3842 4590 -4.1666666666666666e-03 3842 3857 -2.0833333333333333e-03 3842 4614 2.0833333333333329e-03 3842 4591 2.0833333333333329e-03 3842 3858 4.1666666666666657e-03 3842 4603 -2.0833333333333329e-03 3842 3846 -2.0833333333333333e-03 3842 4586 -4.1666666666666666e-03 3842 4599 2.0833333333333329e-03 3842 3845 4.1666666666666657e-03 3842 4593 2.0833333333333329e-03 3842 4598 2.0833333333333329e-03 3842 4594 2.0833333333333329e-03 3842 4592 -4.1666666666666666e-03 3842 3844 4.1666666666666657e-03 3842 3843 -2.0833333333333333e-03 3843 3843 2.4999999999999998e-02 3843 4602 -1.0416666666666662e-03 3843 4605 -1.0416666666666664e-03 3843 4597 6.2500000000000003e-03 3843 3851 -2.0833333333333329e-03 3843 4599 -2.0833333333333337e-03 3843 3845 1.3552527156068805e-20 3843 4593 1.0416666666666664e-03 3843 4598 -2.0833333333333337e-03 3843 4594 1.0416666666666664e-03 3843 4592 6.2500000000000003e-03 3843 3844 8.1315162936412833e-20 3843 3842 -2.0833333333333329e-03 3844 3844 3.3333333666666659e-02 3844 4597 -1.0416666666666667e-03 3844 4602 -6.2500000000000003e-03 3844 4889 1.0416666666666667e-03 3844 3851 4.1666666666666666e-03 3844 4888 -1.0416666666666666e-11 3844 4600 -6.2499999999999991e-11 3844 4612 1.0416666666666666e-11 3844 3850 4.1666666666666665e-11 3844 4604 -4.1666667083333333e-03 3844 3849 7.0197856548546410e-20 3844 4438 -1.0416666666666666e-11 3844 4601 -8.3333333333333330e-11 3844 4447 6.2499999999999991e-11 3844 4436 -1.0416666666666666e-11 3844 3848 9.5018296033870872e-28 3844 3847 4.1666666666666665e-11 3844 4603 -4.1666667083333324e-03 3844 3846 8.4829026083874785e-20 3844 4586 -1.0416666666666667e-03 3844 4598 8.3333333333333315e-03 3844 4594 6.2500000000000003e-03 3844 4592 -1.0416666666666667e-03 3844 3843 1.5502688168223823e-19 3844 3842 4.1666666666666666e-03 3845 3845 6.6666666666666652e-02 3845 4620 -1.0416666666666667e-03 3845 4590 -1.0416666666666667e-03 3845 4610 -8.3333333333333315e-03 3845 3857 -8.8991399020904929e-20 3845 4609 -6.2500000000000003e-03 3845 4626 -1.0416666666666667e-03 3845 3856 4.1666666666666666e-03 3845 4608 -8.3333333333333315e-03 3845 3854 -8.8991399020904929e-20 3845 4634 1.0416666666666667e-03 3845 4597 -1.0416666666666667e-03 3845 4607 -6.2500000000000003e-03 3845 3853 4.1666666666666666e-03 3845 4606 -8.3333333333333315e-03 3845 3852 -8.8991399020904929e-20 3845 4605 -6.2500000000000003e-03 3845 3851 4.1666666666666666e-03 3845 4599 8.3333333333333315e-03 3845 3843 -8.8991399020904929e-20 3845 4593 6.2500000000000003e-03 3845 4592 -1.0416666666666667e-03 3845 3842 4.1666666666666666e-03 3845 3692 -1.0416666666666667e-03 3845 3662 -1.0416666666666667e-03 3846 3846 1.2500000124999999e-02 3846 4892 1.0416666666666666e-11 3846 4614 -1.0416666770833340e-03 3846 4591 1.0416666666666664e-03 3846 3858 -1.0097419586828951e-27 3846 4600 -1.0416666666666665e-11 3846 4612 -6.2499999999999991e-11 3846 3850 -2.0833333333333326e-11 3846 4603 1.0416666770833331e-03 3846 3844 8.1315162936412833e-20 3846 4594 1.0416666666666664e-03 3846 4586 6.2500000000000003e-03 3846 3842 -2.0833333333333329e-03 3847 3847 2.5000000000000002e-10 3847 4509 2.0833333333333332e-11 3847 4510 2.0833333333333332e-11 3847 4440 -4.1666666666666665e-11 3847 3838 -2.0833333333333326e-11 3847 4515 -2.0833333333333332e-11 3847 4441 2.0833333333333326e-11 3847 3839 4.1666666666666665e-11 3847 4604 -2.0833333333333329e-11 3847 3849 -2.0833333333333326e-11 3847 4438 -4.1666666666666665e-11 3847 4517 -2.0833333333333332e-11 3847 3840 4.1666666666666665e-11 3847 4446 2.0833333333333326e-11 3847 4601 -2.0833333333333332e-11 3847 4447 2.0833333333333326e-11 3847 4436 -4.1666666666666665e-11 3847 3844 4.1666666666666665e-11 3847 3848 -2.0833333333333326e-11 3848 3848 2.4999999999999996e-10 3848 4600 -1.0416666666666665e-11 3848 4518 -1.0416666666666666e-11 3848 4888 6.2500000000000004e-11 3848 3850 -2.0833333333333326e-11 3848 4517 2.0833333333333339e-11 3848 3840 -2.6253290925755273e-27 3848 4446 1.0416666666666666e-11 3848 4601 2.0833333333333339e-11 3848 4447 1.0416666666666665e-11 3848 4436 6.2499999999999991e-11 3848 3844 1.6155871338926322e-27 3848 3847 -2.0833333333333326e-11 3849 3849 1.2500000125000001e-02 3849 4602 -1.0416666666666664e-03 3849 4516 -1.0416666666666664e-03 3849 4889 -6.2500000000000003e-03 3849 3851 -2.0833333333333329e-03 3849 4515 1.0416666770833333e-03 3849 4441 1.0416666666666666e-11 3849 3839 1.3552525540481672e-20 3849 4604 1.0416666770833335e-03 3849 3844 1.6155871338926322e-27 3849 4447 1.0416666666666665e-11 3849 4438 6.2499999999999991e-11 3849 3847 -2.0833333333333326e-11 3850 3850 2.5000000000000002e-10 3850 4614 2.0833333333333329e-11 3850 4519 -2.0833333333333332e-11 3850 4749 2.0833333333333332e-11 3850 4892 2.0833333333333326e-11 3850 4750 4.1666666666666665e-11 3850 3858 4.1666666666666665e-11 3850 3860 -2.0833333333333326e-11 3850 4601 -2.0833333333333329e-11 3850 4517 -2.0833333333333332e-11 3850 4518 -2.0833333333333326e-11 3850 4888 -4.1666666666666665e-11 3850 3840 4.1666666666666665e-11 3850 3848 -2.0833333333333326e-11 3850 4603 -2.0833333333333332e-11 3850 4600 -2.0833333333333326e-11 3850 4612 4.1666666666666665e-11 3850 3844 4.1666666666666665e-11 3850 3846 -2.0833333333333326e-11 3851 3851 2.4999999999999994e-02 3851 4598 2.0833333333333329e-03 3851 4599 2.0833333333333329e-03 3851 4597 -4.1666666666666666e-03 3851 3843 -2.0833333333333333e-03 3851 4604 -2.0833333333333329e-03 3851 4602 -2.0833333333333329e-03 3851 3844 4.1666666666666657e-03 3851 4515 -2.0833333333333329e-03 3851 3849 -2.0833333333333333e-03 3851 4889 4.1666666666666666e-03 3851 4606 -2.0833333333333329e-03 3851 3845 4.1666666666666657e-03 3851 4605 -2.0833333333333329e-03 3851 4513 -2.0833333333333329e-03 3851 4516 -2.0833333333333329e-03 3851 3839 4.1666666666666657e-03 3851 3852 -2.0833333333333333e-03 3851 3662 -4.1666666666666666e-03 3852 3852 2.5000000000000001e-02 3852 4512 -1.0416666666666664e-03 3852 4607 -1.0416666666666664e-03 3852 3853 -2.0833333333333329e-03 3852 4606 2.0833333333333337e-03 3852 3845 1.3552527156068805e-20 3852 4605 -1.0416666666666664e-03 3852 4513 2.0833333333333337e-03 3852 4516 -1.0416666666666664e-03 3852 3839 8.1315162936412833e-20 3852 3851 -2.0833333333333329e-03 3852 3692 6.2500000000000003e-03 3852 3662 6.2500000000000003e-03 3853 3853 2.4999999999999994e-02 3853 4525 2.0833333333333329e-03 3853 4608 -2.0833333333333329e-03 3853 4633 2.0833333333333329e-03 3853 4966 2.0833333333333329e-03 3853 4634 4.1666666666666666e-03 3853 3855 4.1666666666666657e-03 3853 3854 -2.0833333333333333e-03 3853 4513 -2.0833333333333329e-03 3853 4606 -2.0833333333333329e-03 3853 4607 -2.0833333333333329e-03 3853 3845 4.1666666666666657e-03 3853 3852 -2.0833333333333333e-03 3853 4514 -2.0833333333333329e-03 3853 4512 -2.0833333333333329e-03 3853 4523 4.1666666666666666e-03 3853 3839 4.1666666666666657e-03 3853 3841 -2.0833333333333333e-03 3853 3692 -4.1666666666666666e-03 3854 3854 2.4999999999999998e-02 3854 4621 1.0416666666666662e-03 3854 4609 -1.0416666666666664e-03 3854 4620 6.2500000000000003e-03 3854 3856 -2.0833333333333329e-03 3854 4608 2.0833333333333337e-03 3854 3845 1.3552527156068805e-20 3854 4607 -1.0416666666666664e-03 3854 4633 -2.0833333333333337e-03 3854 4966 1.0416666666666664e-03 3854 4634 -6.2500000000000003e-03 3854 3855 8.1315162936412833e-20 3854 3853 -2.0833333333333329e-03 3855 3855 3.3333333666666659e-02 3855 4500 -1.0416666666666666e-11 3855 4501 6.2499999999999991e-11 3855 4490 -1.0416666666666666e-11 3855 3837 4.1666666666666665e-11 3855 4742 -1.0416666666666666e-11 3855 4967 -8.3333333333333330e-11 3855 4748 6.2499999999999991e-11 3855 4738 -1.0416666666666666e-11 3855 3862 9.5018296033870872e-28 3855 3861 4.1666666666666665e-11 3855 4620 -1.0416666666666667e-03 3855 4968 -4.1666667083333333e-03 3855 4621 6.2500000000000003e-03 3855 4618 -1.0416666666666667e-03 3855 3859 7.0197856548546410e-20 3855 3856 4.1666666666666666e-03 3855 4525 4.1666667083333324e-03 3855 3841 8.4829026083874785e-20 3855 4523 1.0416666666666667e-03 3855 4633 8.3333333333333315e-03 3855 4966 6.2500000000000003e-03 3855 4634 1.0416666666666667e-03 3855 3854 1.5502688168223823e-19 3855 3853 4.1666666666666666e-03 3856 3856 2.4999999999999994e-02 3856 4633 2.0833333333333329e-03 3856 4608 -2.0833333333333329e-03 3856 4620 -4.1666666666666666e-03 3856 3854 -2.0833333333333333e-03 3856 4968 -2.0833333333333329e-03 3856 4621 2.0833333333333329e-03 3856 3855 4.1666666666666657e-03 3856 4970 -2.0833333333333329e-03 3856 3859 -2.0833333333333333e-03 3856 4618 -4.1666666666666666e-03 3856 4610 -2.0833333333333329e-03 3856 3845 4.1666666666666657e-03 3856 4609 -2.0833333333333329e-03 3856 4648 2.0833333333333329e-03 3856 4630 2.0833333333333329e-03 3856 4626 -4.1666666666666666e-03 3856 3858 4.1666666666666657e-03 3856 3857 -2.0833333333333333e-03 3857 3857 2.5000000000000001e-02 3857 4591 1.0416666666666664e-03 3857 4593 1.0416666666666664e-03 3857 4590 6.2500000000000003e-03 3857 3842 -2.0833333333333329e-03 3857 4610 2.0833333333333337e-03 3857 3845 1.3552527156068805e-20 3857 4609 -1.0416666666666664e-03 3857 4648 -2.0833333333333337e-03 3857 4630 1.0416666666666664e-03 3857 4626 6.2500000000000003e-03 3857 3858 8.1315162936412833e-20 3857 3856 -2.0833333333333329e-03 3858 3858 3.3333333666666659e-02 3858 4743 -1.0416666666666666e-11 3858 4744 6.2499999999999991e-11 3858 4742 -1.0416666666666666e-11 3858 3861 4.1666666666666665e-11 3858 4612 1.0416666666666666e-11 3858 4749 8.3333333333333330e-11 3858 4892 6.2499999999999991e-11 3858 4750 1.0416666666666666e-11 3858 3860 9.5018296033870872e-28 3858 3850 4.1666666666666665e-11 3858 4590 -1.0416666666666667e-03 3858 4614 4.1666667083333333e-03 3858 4591 6.2500000000000003e-03 3858 4586 -1.0416666666666667e-03 3858 3846 -7.4433021799253829e-20 3858 3842 4.1666666666666666e-03 3858 4970 -4.1666667083333324e-03 3858 3859 -1.4558380320789774e-20 3858 4618 -1.0416666666666667e-03 3858 4648 8.3333333333333315e-03 3858 4630 6.2500000000000003e-03 3858 4626 -1.0416666666666667e-03 3858 3857 1.5502688168223823e-19 3858 3856 4.1666666666666666e-03 3859 3859 1.2500000125000001e-02 3859 4744 1.0416666666666666e-11 3859 4748 1.0416666666666665e-11 3859 4742 6.2499999999999991e-11 3859 3861 -2.0833333333333326e-11 3859 4968 1.0416666770833335e-03 3859 4621 1.0416666666666664e-03 3859 3855 1.6155871338926322e-27 3859 4970 1.0416666770833333e-03 3859 3858 1.3552525540481672e-20 3859 4630 1.0416666666666664e-03 3859 4618 6.2500000000000003e-03 3859 3856 -2.0833333333333329e-03 3860 3860 2.4999999999999996e-10 3860 4744 1.0416666666666665e-11 3860 4520 -1.0416666666666663e-11 3860 4743 6.2500000000000004e-11 3860 3861 -2.0833333333333326e-11 3860 4519 2.0833333333333339e-11 3860 3840 -2.6253290925755273e-27 3860 4518 -1.0416666666666665e-11 3860 4749 -2.0833333333333339e-11 3860 4892 1.0416666666666663e-11 3860 4750 -6.2500000000000004e-11 3860 3858 1.6155871338926322e-27 3860 3850 -2.0833333333333326e-11 3861 3861 2.5000000000000002e-10 3861 4749 2.0833333333333332e-11 3861 4519 -2.0833333333333332e-11 3861 4743 -4.1666666666666665e-11 3861 3860 -2.0833333333333326e-11 3861 4970 -2.0833333333333332e-11 3861 4744 2.0833333333333326e-11 3861 3858 4.1666666666666665e-11 3861 4968 -2.0833333333333329e-11 3861 3859 -2.0833333333333326e-11 3861 4742 -4.1666666666666665e-11 3861 4521 -2.0833333333333332e-11 3861 3840 4.1666666666666665e-11 3861 4520 -2.0833333333333326e-11 3861 4967 -2.0833333333333332e-11 3861 4748 2.0833333333333326e-11 3861 4738 -4.1666666666666665e-11 3861 3855 4.1666666666666665e-11 3861 3862 -2.0833333333333326e-11 3862 3862 2.4999999999999996e-10 3862 4501 1.0416666666666665e-11 3862 4502 1.0416666666666666e-11 3862 4500 6.2500000000000004e-11 3862 3837 -2.0833333333333326e-11 3862 4521 2.0833333333333339e-11 3862 3840 -2.6253290925755273e-27 3862 4520 -1.0416666666666666e-11 3862 4967 2.0833333333333339e-11 3862 4748 1.0416666666666665e-11 3862 4738 6.2499999999999991e-11 3862 3855 1.6155871338926322e-27 3862 3861 -2.0833333333333326e-11 3863 3863 2.5000000000000002e-10 3863 4537 -2.0833333333333332e-11 3863 4526 -2.0833333333333332e-11 3863 4496 -4.1666666666666665e-11 3863 3869 -2.0833333333333326e-11 3863 4522 2.0833333333333329e-11 3863 4491 2.0833333333333326e-11 3863 4514 -2.0833333333333332e-11 3863 4490 -4.1666666666666665e-11 3863 3868 -2.0833333333333326e-11 3863 4509 2.0833333333333332e-11 3863 3867 4.1666666666666665e-11 3863 4503 2.0833333333333326e-11 3863 4508 2.0833333333333332e-11 3863 4495 2.0833333333333326e-11 3863 4494 -4.1666666666666665e-11 3863 3865 4.1666666666666665e-11 3863 3864 -2.0833333333333326e-11 3863 2762 4.1666666666666665e-11 3864 3864 2.4999999999999996e-10 3864 4445 1.0416666666666665e-11 3864 4503 1.0416666666666665e-11 3864 4509 -2.0833333333333339e-11 3864 4441 1.0416666666666663e-11 3864 4440 6.2500000000000004e-11 3864 3867 1.6155871338926322e-27 3864 3866 -2.0833333333333326e-11 3864 4508 -2.0833333333333339e-11 3864 4495 1.0416666666666663e-11 3864 4494 6.2500000000000004e-11 3864 3865 -2.6253290925755273e-27 3864 3863 -2.0833333333333326e-11 3865 3865 3.3333333666666659e-02 3865 4865 1.0416666666666667e-03 3865 4496 -1.0416666666666666e-11 3865 4538 -4.1666667083333324e-03 3865 4432 -1.0416666666666666e-11 3865 3870 -1.4558380320789774e-20 3865 4445 6.2499999999999991e-11 3865 4440 -1.0416666666666666e-11 3865 3866 4.1666666666666665e-11 3865 4537 -4.1666667083333333e-03 3865 4527 -1.0416666666666667e-03 3865 3869 -7.4433021799253829e-20 3865 4532 6.2500000000000003e-03 3865 4534 8.3333333333333315e-03 3865 4536 -6.2500000000000003e-03 3865 4508 8.3333333333333330e-11 3865 4495 6.2499999999999991e-11 3865 4494 -1.0416666666666666e-11 3865 3864 -3.0991386737738975e-27 3865 3863 4.1666666666666665e-11 3865 3628 -1.0416666666666667e-03 3865 2755 4.1666666666666666e-03 3865 3625 -1.0416666666666667e-03 3865 2756 -8.8991399020904929e-20 3865 2765 4.1666666666666666e-03 3866 3866 2.5000000000000002e-10 3866 4515 -2.0833333333333329e-11 3866 4866 -2.0833333333333332e-11 3866 4438 -4.1666666666666665e-11 3866 3871 -2.0833333333333326e-11 3866 4864 2.0833333333333329e-11 3866 4433 2.0833333333333326e-11 3866 4538 -2.0833333333333332e-11 3866 4432 -4.1666666666666665e-11 3866 3870 -2.0833333333333326e-11 3866 4508 2.0833333333333332e-11 3866 3865 4.1666666666666665e-11 3866 4445 2.0833333333333326e-11 3866 4509 2.0833333333333332e-11 3866 4441 2.0833333333333326e-11 3866 4440 -4.1666666666666665e-11 3866 3867 4.1666666666666665e-11 3866 3864 -2.0833333333333326e-11 3866 2760 4.1666666666666665e-11 3867 3867 3.3333333666666659e-02 3867 4523 1.0416666666666667e-03 3867 4889 1.0416666666666667e-03 3867 4516 -6.2500000000000003e-03 3867 4515 -4.1666667083333333e-03 3867 3871 -7.4433021799253829e-20 3867 4438 -1.0416666666666666e-11 3867 4514 -4.1666667083333324e-03 3867 4490 -1.0416666666666666e-11 3867 3868 -1.4558380320789774e-20 3867 4503 6.2499999999999991e-11 3867 4494 -1.0416666666666666e-11 3867 3863 4.1666666666666665e-11 3867 4513 -8.3333333333333315e-03 3867 4512 -6.2500000000000003e-03 3867 4509 8.3333333333333330e-11 3867 4441 6.2499999999999991e-11 3867 4440 -1.0416666666666666e-11 3867 3864 9.5018296033870872e-28 3867 3866 4.1666666666666665e-11 3867 3662 -1.0416666666666667e-03 3867 2757 4.1666666666666666e-03 3867 3692 -1.0416666666666667e-03 3867 2758 1.5502688168223823e-19 3867 2766 4.1666666666666666e-03 3868 3868 1.2500000125000001e-02 3868 4512 -1.0416666666666664e-03 3868 4523 -6.2500000000000003e-03 3868 4522 -1.0416666770833335e-03 3868 4491 1.0416666666666665e-11 3868 4514 1.0416666770833333e-03 3868 4503 1.0416666666666666e-11 3868 4490 6.2499999999999991e-11 3868 3867 1.3552525540481672e-20 3868 3863 -2.0833333333333326e-11 3868 3603 1.0416666666666664e-03 3868 2766 -2.0833333333333329e-03 3868 2762 1.6155871338926322e-27 3869 3869 1.2500000124999999e-02 3869 4495 1.0416666666666666e-11 3869 4491 1.0416666666666665e-11 3869 4496 6.2499999999999991e-11 3869 3863 -2.0833333333333326e-11 3869 4526 1.0416666770833331e-03 3869 4537 1.0416666770833340e-03 3869 4532 1.0416666666666664e-03 3869 4527 6.2500000000000003e-03 3869 3865 -1.0097419586828951e-27 3869 2762 8.1315162936412833e-20 3869 3605 1.0416666666666662e-03 3869 2755 -2.0833333333333329e-03 3870 3870 1.2500000125000001e-02 3870 4536 -1.0416666666666664e-03 3870 4865 -6.2500000000000003e-03 3870 4864 -1.0416666770833340e-03 3870 4433 1.0416666666666665e-11 3870 4538 1.0416666770833333e-03 3870 4445 1.0416666666666666e-11 3870 4432 6.2500000000000004e-11 3870 3865 1.3552525540481672e-20 3870 3866 -2.0833333333333326e-11 3870 3325 1.0416666666666664e-03 3870 2765 -2.0833333333333329e-03 3870 2760 1.6155871338926322e-27 3871 3871 1.2500000124999999e-02 3871 4516 -1.0416666666666664e-03 3871 4889 -6.2500000000000003e-03 3871 4515 1.0416666770833340e-03 3871 3867 -1.0097419586828951e-27 3871 4441 1.0416666666666666e-11 3871 4866 1.0416666770833331e-03 3871 4433 1.0416666666666665e-11 3871 4438 6.2499999999999991e-11 3871 3866 -2.0833333333333326e-11 3871 3326 1.0416666666666664e-03 3871 2757 -2.0833333333333329e-03 3871 2760 8.1315162936412833e-20 3872 3872 6.6666666666666652e-02 3872 4924 -1.0416666666666667e-03 3872 4528 -1.0416666666666667e-03 3872 4544 -8.3333333333333315e-03 3872 4543 -6.2500000000000003e-03 3872 4925 -1.0416666666666667e-03 3872 3882 -8.8991399020904929e-20 3872 3880 4.1666666666666666e-03 3872 4542 -8.3333333333333315e-03 3872 4902 -1.0416666666666667e-03 3872 3881 1.5502688168223823e-19 3872 4541 -6.2500000000000003e-03 3872 4897 1.0416666666666667e-03 3872 3877 4.1666666666666666e-03 3872 4540 -8.3333333333333315e-03 3872 4539 -6.2500000000000003e-03 3872 4895 -1.0416666666666667e-03 3872 3876 -8.8991399020904929e-20 3872 4535 8.3333333333333315e-03 3872 4531 6.2500000000000003e-03 3872 3625 -1.0416666666666667e-03 3872 2772 4.1666666666666666e-03 3872 3628 -1.0416666666666667e-03 3872 2773 1.5502688168223823e-19 3872 2774 4.1666666666666666e-03 3873 3873 2.2916666666666665e-02 3873 4567 1.3773108652749614e-20 3873 4569 2.1684043449710089e-19 3873 4561 -1.0416666666666673e-03 3873 3878 1.0416666666666669e-03 3873 4559 -1.0416666666666671e-03 3873 3874 1.3552527156068805e-20 3873 4552 1.0416666666666664e-03 3873 4560 -6.5052130349130266e-19 3873 4547 6.2500000000000003e-03 3873 3640 1.0416666666666664e-03 3873 2776 -1.0416666666666667e-03 3873 2778 -2.0833333333333329e-03 3874 3874 6.0416666666666653e-02 3874 4580 1.0416666666666667e-03 3874 4902 -1.0416666666666667e-03 3874 4572 -8.3333333333333315e-03 3874 4571 -6.2500000000000003e-03 3874 4924 -1.0416666666666667e-03 3874 3881 -8.8991399020904929e-20 3874 3880 4.1666666666666666e-03 3874 4570 -6.2499999999999995e-03 3874 3877 4.1666666666666657e-03 3874 4900 -1.0416666666666664e-03 3874 4569 -9.3750000000000014e-03 3874 4561 5.0116116045879435e-20 3874 3878 1.0116749763768550e-19 3874 4568 -8.3333333333333315e-03 3874 4550 -1.0416666666666667e-03 3874 3875 -8.8991399020904929e-20 3874 4559 9.3749999999999997e-03 3874 3873 -8.8991399020904929e-20 3874 4552 6.2500000000000003e-03 3874 4547 -1.0416666666666667e-03 3874 2778 4.1666666666666666e-03 3875 3875 2.5000000000000001e-02 3875 4571 -1.0416666666666664e-03 3875 4582 -2.0833333333333337e-03 3875 4927 1.0416666666666664e-03 3875 4580 -6.2500000000000003e-03 3875 3880 -2.0833333333333329e-03 3875 4568 2.0833333333333337e-03 3875 4552 1.0416666666666664e-03 3875 4550 6.2500000000000003e-03 3875 3874 1.3552527156068805e-20 3875 3350 1.0416666666666662e-03 3875 2769 8.1315162936412833e-20 3875 2778 -2.0833333333333329e-03 3876 3876 2.4999999999999998e-02 3876 4899 -2.0833333333333333e-03 3876 4905 1.0416666666666664e-03 3876 4541 -1.0416666666666664e-03 3876 4897 -6.2500000000000003e-03 3876 3877 -2.0833333333333329e-03 3876 4540 2.0833333333333337e-03 3876 4539 -1.0416666666666664e-03 3876 4895 6.2500000000000003e-03 3876 3872 1.3552527156068805e-20 3876 3626 1.0416666666666664e-03 3876 2780 8.1315162936412833e-20 3876 2772 -2.0833333333333329e-03 3877 3877 2.4999999999999994e-02 3877 4899 2.0833333333333329e-03 3877 4542 -2.0833333333333329e-03 3877 4572 -2.0833333333333329e-03 3877 3881 -2.0833333333333333e-03 3877 4902 -4.1666666666666666e-03 3877 4570 -2.0833333333333329e-03 3877 3874 4.1666666666666657e-03 3877 4569 -2.0833333333333333e-03 3877 4905 2.0833333333333329e-03 3877 4907 2.0833333333333329e-03 3877 4900 -4.1666666666666675e-03 3877 3878 -2.0833333333333329e-03 3877 4540 -2.0833333333333329e-03 3877 3872 4.1666666666666657e-03 3877 3876 -2.0833333333333333e-03 3877 4541 -2.0833333333333329e-03 3877 4897 4.1666666666666666e-03 3877 2780 4.1666666666666657e-03 3878 3878 3.7499999999999992e-02 3878 4570 -1.0416666666666667e-03 3878 4560 5.2083333333333322e-03 3878 4559 -2.1684043449710089e-19 3878 4569 1.0416666666666671e-03 3878 4561 6.2500000000000003e-03 3878 3874 2.1684043449710089e-19 3878 3873 1.0416666666666669e-03 3878 4785 2.1684043449710089e-19 3878 4566 -5.2083333333333322e-03 3878 4567 -6.2499999999999986e-03 3878 4784 6.2499999999999986e-03 3878 3879 1.0416666666666667e-03 3878 4905 1.0416666666666664e-03 3878 4907 -1.0416666666666673e-03 3878 4900 6.2499999999999995e-03 3878 3877 -2.0833333333333333e-03 3878 2776 1.4583333333333334e-02 3878 2780 6.5052130349130266e-19 3879 3879 2.2916666666666662e-02 3879 4786 -6.2500000000000003e-03 3879 4785 -1.0416666666666669e-03 3879 4907 -4.9904357809065860e-20 3879 4566 8.6736173798840355e-19 3879 4567 1.6263032587282567e-19 3879 4784 -1.0416666666666673e-03 3879 3878 1.0416666666666664e-03 3879 3633 1.0416666666666664e-03 3879 3636 1.0416666666666664e-03 3879 2775 -2.0833333333333329e-03 3879 2780 8.1315162936412833e-20 3879 2776 -1.0416666666666669e-03 3880 3880 2.4999999999999994e-02 3880 4932 -2.0833333333333329e-03 3880 4542 -2.0833333333333329e-03 3880 4544 -2.0833333333333329e-03 3880 4543 -2.0833333333333329e-03 3880 4925 -4.1666666666666666e-03 3880 3872 4.1666666666666657e-03 3880 3882 -2.0833333333333333e-03 3880 4568 -2.0833333333333329e-03 3880 4572 -2.0833333333333329e-03 3880 4571 -2.0833333333333329e-03 3880 4924 -4.1666666666666666e-03 3880 3874 4.1666666666666657e-03 3880 3881 -2.0833333333333333e-03 3880 4582 2.0833333333333329e-03 3880 4927 2.0833333333333329e-03 3880 4580 4.1666666666666666e-03 3880 3875 -2.0833333333333333e-03 3880 2769 4.1666666666666657e-03 3881 3881 2.5000000000000001e-02 3881 4543 -1.0416666666666664e-03 3881 4542 2.0833333333333337e-03 3881 4541 -1.0416666666666664e-03 3881 3872 8.1315162936412833e-20 3881 4570 -1.0416666666666664e-03 3881 4902 6.2500000000000003e-03 3881 3877 -2.0833333333333329e-03 3881 4572 2.0833333333333337e-03 3881 4571 -1.0416666666666664e-03 3881 4924 6.2500000000000003e-03 3881 3874 1.3552527156068805e-20 3881 3880 -2.0833333333333329e-03 3882 3882 2.4999999999999998e-02 3882 4927 1.0416666666666664e-03 3882 4932 2.0833333333333333e-03 3882 4531 1.0416666666666664e-03 3882 4528 6.2500000000000003e-03 3882 4544 2.0833333333333337e-03 3882 4543 -1.0416666666666664e-03 3882 4925 6.2500000000000003e-03 3882 3872 1.3552527156068805e-20 3882 3880 -2.0833333333333329e-03 3882 3352 1.0416666666666664e-03 3882 2769 8.1315162936412833e-20 3882 2774 -2.0833333333333329e-03 3883 3883 2.4999999999999994e-02 3883 4867 -2.0833333333333329e-03 3883 4544 -2.0833333333333329e-03 3883 4528 -4.1666666666666666e-03 3883 3908 -2.0833333333333333e-03 3883 4546 2.0833333333333329e-03 3883 4529 2.0833333333333329e-03 3883 3898 4.1666666666666657e-03 3883 4537 -2.0833333333333329e-03 3883 3887 -2.0833333333333333e-03 3883 4527 -4.1666666666666666e-03 3883 4535 2.0833333333333329e-03 3883 3886 4.1666666666666657e-03 3883 4531 2.0833333333333329e-03 3883 4534 2.0833333333333329e-03 3883 4532 2.0833333333333329e-03 3883 3885 4.1666666666666657e-03 3883 3884 -2.0833333333333333e-03 3883 3628 -4.1666666666666666e-03 3884 3884 2.5000000000000001e-02 3884 4536 -1.0416666666666664e-03 3884 4539 -1.0416666666666664e-03 3884 3903 -2.0833333333333329e-03 3884 4535 -2.0833333333333337e-03 3884 3886 8.1315162936412833e-20 3884 4531 1.0416666666666664e-03 3884 4534 -2.0833333333333337e-03 3884 4532 1.0416666666666664e-03 3884 3885 1.3552527156068805e-20 3884 3883 -2.0833333333333329e-03 3884 3625 6.2500000000000003e-03 3884 3628 6.2500000000000003e-03 3885 3885 3.3333333666666659e-02 3885 4536 -6.2500000000000003e-03 3885 4865 1.0416666666666667e-03 3885 3903 4.1666666666666666e-03 3885 4494 -1.0416666666666666e-11 3885 4495 6.2499999999999991e-11 3885 4496 -1.0416666666666666e-11 3885 3896 4.1666666666666665e-11 3885 4538 -4.1666667083333333e-03 3885 3895 -7.4433021799253829e-20 3885 4432 -1.0416666666666666e-11 3885 4508 8.3333333333333330e-11 3885 4445 6.2499999999999991e-11 3885 4440 -1.0416666666666666e-11 3885 3894 -3.0991386737738975e-27 3885 3893 4.1666666666666665e-11 3885 4537 -4.1666667083333324e-03 3885 3887 -1.4558380320789774e-20 3885 4527 -1.0416666666666667e-03 3885 4534 8.3333333333333315e-03 3885 4532 6.2500000000000003e-03 3885 3884 -8.8991399020904929e-20 3885 3883 4.1666666666666666e-03 3885 3625 -1.0416666666666667e-03 3885 3628 -1.0416666666666667e-03 3886 3886 6.6666666666666652e-02 3886 4924 -1.0416666666666667e-03 3886 4528 -1.0416666666666667e-03 3886 4544 -8.3333333333333315e-03 3886 3908 -8.8991399020904929e-20 3886 4543 -6.2500000000000003e-03 3886 4925 -1.0416666666666667e-03 3886 3907 4.1666666666666666e-03 3886 4542 -8.3333333333333315e-03 3886 3906 1.5502688168223823e-19 3886 4902 -1.0416666666666667e-03 3886 4541 -6.2500000000000003e-03 3886 4897 1.0416666666666667e-03 3886 3905 4.1666666666666666e-03 3886 4540 -8.3333333333333315e-03 3886 3904 -8.8991399020904929e-20 3886 4539 -6.2500000000000003e-03 3886 4895 -1.0416666666666667e-03 3886 3903 4.1666666666666666e-03 3886 4535 8.3333333333333315e-03 3886 3884 1.5502688168223823e-19 3886 4531 6.2500000000000003e-03 3886 3883 4.1666666666666666e-03 3886 3625 -1.0416666666666667e-03 3886 3628 -1.0416666666666667e-03 3887 3887 1.2500000125000001e-02 3887 4529 1.0416666666666664e-03 3887 4546 -1.0416666770833340e-03 3887 3898 1.6155871338926322e-27 3887 4506 1.0416666666666665e-11 3887 4495 1.0416666666666666e-11 3887 4496 6.2500000000000004e-11 3887 3896 -2.0833333333333326e-11 3887 4537 1.0416666770833333e-03 3887 3885 1.3552525540481672e-20 3887 4532 1.0416666666666664e-03 3887 4527 6.2500000000000003e-03 3887 3883 -2.0833333333333329e-03 3888 3888 2.5000000000000002e-10 3888 4870 2.0833333333333332e-11 3888 4854 -2.0833333333333332e-11 3888 4840 -4.1666666666666665e-11 3888 3900 -2.0833333333333326e-11 3888 4858 2.0833333333333332e-11 3888 4841 2.0833333333333326e-11 3888 3901 4.1666666666666665e-11 3888 4851 -2.0833333333333329e-11 3888 3892 -2.0833333333333326e-11 3888 4838 -4.1666666666666665e-11 3888 4452 2.0833333333333329e-11 3888 3891 4.1666666666666665e-11 3888 4844 2.0833333333333326e-11 3888 4448 2.0833333333333332e-11 3888 4845 2.0833333333333326e-11 3888 4449 4.1666666666666665e-11 3888 3890 4.1666666666666665e-11 3888 3889 -2.0833333333333326e-11 3889 3889 2.4999999999999996e-10 3889 4435 1.0416666666666665e-11 3889 4444 1.0416666666666666e-11 3889 4434 6.2499999999999991e-11 3889 3893 -2.0833333333333326e-11 3889 4452 -2.0833333333333339e-11 3889 3891 -2.6253290925755273e-27 3889 4844 1.0416666666666666e-11 3889 4448 -2.0833333333333332e-11 3889 4845 1.0416666666666665e-11 3889 4449 -6.2499999999999991e-11 3889 3890 1.6155871338926322e-27 3889 3888 -2.0833333333333326e-11 3890 3890 3.3333333666666659e-02 3890 4897 1.0416666666666667e-03 3890 4849 -6.2500000000000003e-03 3890 4856 1.0416666666666667e-03 3890 3905 4.1666666666666666e-03 3890 4865 1.0416666666666667e-03 3890 4850 -8.3333333333333315e-03 3890 4853 -6.2500000000000003e-03 3890 4895 -1.0416666666666667e-03 3890 3904 1.5502688168223823e-19 3890 3903 4.1666666666666666e-03 3890 4434 -1.0416666666666666e-11 3890 4852 -4.1666667083333324e-03 3890 4435 6.2499999999999991e-11 3890 4432 -1.0416666666666666e-11 3890 3895 8.4829026083874785e-20 3890 3893 4.1666666666666665e-11 3890 4851 -4.1666667083333333e-03 3890 3892 7.0197856548546410e-20 3890 4838 -1.0416666666666666e-11 3890 4448 8.3333333333333330e-11 3890 4845 6.2499999999999991e-11 3890 4449 1.0416666666666666e-11 3890 3889 9.5018296033870872e-28 3890 3888 4.1666666666666665e-11 3891 3891 6.6666666666666674e-10 3891 4402 -1.0416666666666666e-11 3891 4840 -1.0416666666666666e-11 3891 4854 -8.3333333333333330e-11 3891 3900 9.5018296033870872e-28 3891 4410 6.2499999999999991e-11 3891 4404 -1.0416666666666666e-11 3891 3899 4.1666666666666665e-11 3891 4824 8.3333333333333330e-11 3891 3897 -3.0991386737738975e-27 3891 4492 -1.0416666666666666e-11 3891 4434 -1.0416666666666666e-11 3891 4505 6.2499999999999991e-11 3891 4494 -1.0416666666666666e-11 3891 3896 4.1666666666666665e-11 3891 4511 8.3333333333333330e-11 3891 3894 9.5018296033870872e-28 3891 4444 6.2499999999999991e-11 3891 4440 -1.0416666666666666e-11 3891 3893 4.1666666666666665e-11 3891 4452 8.3333333333333330e-11 3891 3889 -3.0991386737738975e-27 3891 4844 6.2499999999999991e-11 3891 4449 1.0416666666666666e-11 3891 3888 4.1666666666666665e-11 3892 3892 1.2500000125000001e-02 3892 4875 -1.0416666666666664e-03 3892 4849 -1.0416666666666664e-03 3892 4856 -6.2500000000000003e-03 3892 3905 -2.0833333333333329e-03 3892 4858 -1.0416666770833333e-03 3892 4841 1.0416666666666666e-11 3892 3901 1.3552525540481672e-20 3892 4851 1.0416666770833340e-03 3892 3890 1.6155871338926322e-27 3892 4845 1.0416666666666665e-11 3892 4838 6.2500000000000004e-11 3892 3888 -2.0833333333333326e-11 3893 3893 2.5000000000000002e-10 3893 4448 2.0833333333333329e-11 3893 4452 2.0833333333333332e-11 3893 4434 -4.1666666666666665e-11 3893 3889 -2.0833333333333326e-11 3893 4852 -2.0833333333333332e-11 3893 4435 2.0833333333333326e-11 3893 3890 4.1666666666666665e-11 3893 4538 -2.0833333333333332e-11 3893 3895 -2.0833333333333326e-11 3893 4432 -4.1666666666666665e-11 3893 4511 2.0833333333333332e-11 3893 3891 4.1666666666666665e-11 3893 4444 2.0833333333333326e-11 3893 4508 2.0833333333333332e-11 3893 4445 2.0833333333333326e-11 3893 4440 -4.1666666666666665e-11 3893 3885 4.1666666666666665e-11 3893 3894 -2.0833333333333326e-11 3894 3894 2.4999999999999996e-10 3894 4495 1.0416666666666665e-11 3894 4505 1.0416666666666663e-11 3894 4494 6.2500000000000004e-11 3894 3896 -2.0833333333333326e-11 3894 4511 -2.0833333333333339e-11 3894 3891 1.6155871338926322e-27 3894 4444 1.0416666666666665e-11 3894 4508 -2.0833333333333339e-11 3894 4445 1.0416666666666663e-11 3894 4440 6.2500000000000004e-11 3894 3885 -2.6253290925755273e-27 3894 3893 -2.0833333333333326e-11 3895 3895 1.2500000124999999e-02 3895 4536 -1.0416666666666664e-03 3895 4853 -1.0416666666666662e-03 3895 4865 -6.2500000000000003e-03 3895 3903 -2.0833333333333329e-03 3895 4852 1.0416666770833331e-03 3895 4435 1.0416666666666665e-11 3895 3890 8.1315162936412833e-20 3895 4538 1.0416666770833340e-03 3895 3885 -1.0097419586828951e-27 3895 4445 1.0416666666666666e-11 3895 4432 6.2499999999999991e-11 3895 3893 -2.0833333333333326e-11 3896 3896 2.5000000000000002e-10 3896 4546 2.0833333333333329e-11 3896 4824 2.0833333333333329e-11 3896 4823 2.0833333333333332e-11 3896 4506 2.0833333333333326e-11 3896 4492 -4.1666666666666665e-11 3896 3898 4.1666666666666665e-11 3896 3897 -2.0833333333333326e-11 3896 4508 2.0833333333333332e-11 3896 4511 2.0833333333333332e-11 3896 4505 2.0833333333333326e-11 3896 4494 -4.1666666666666665e-11 3896 3891 4.1666666666666665e-11 3896 3894 -2.0833333333333326e-11 3896 4537 -2.0833333333333332e-11 3896 4495 2.0833333333333326e-11 3896 4496 -4.1666666666666665e-11 3896 3885 4.1666666666666665e-11 3896 3887 -2.0833333333333326e-11 3897 3897 2.4999999999999996e-10 3897 4403 1.0416666666666665e-11 3897 4410 1.0416666666666666e-11 3897 4402 6.2499999999999991e-11 3897 3899 -2.0833333333333326e-11 3897 4824 -2.0833333333333339e-11 3897 3891 -2.6253290925755273e-27 3897 4505 1.0416666666666666e-11 3897 4823 -2.0833333333333332e-11 3897 4506 1.0416666666666665e-11 3897 4492 6.2499999999999991e-11 3897 3898 1.6155871338926322e-27 3897 3896 -2.0833333333333326e-11 3898 3898 3.3333333666666659e-02 3898 4528 -1.0416666666666667e-03 3898 4529 6.2500000000000003e-03 3898 4527 -1.0416666666666667e-03 3898 3883 4.1666666666666666e-03 3898 4877 1.0416666666666667e-03 3898 4867 -8.3333333333333315e-03 3898 4869 -6.2500000000000003e-03 3898 4925 -1.0416666666666667e-03 3898 3908 1.5502688168223823e-19 3898 3907 4.1666666666666666e-03 3898 4402 -1.0416666666666666e-11 3898 4868 -4.1666667083333324e-03 3898 4403 6.2499999999999991e-11 3898 4400 -1.0416666666666666e-11 3898 3902 8.4829026083874785e-20 3898 3899 4.1666666666666665e-11 3898 4546 4.1666667083333333e-03 3898 3887 7.0197856548546410e-20 3898 4496 -1.0416666666666666e-11 3898 4823 8.3333333333333330e-11 3898 4506 6.2499999999999991e-11 3898 4492 -1.0416666666666666e-11 3898 3897 9.5018296033870872e-28 3898 3896 4.1666666666666665e-11 3899 3899 2.5000000000000002e-10 3899 4823 2.0833333333333329e-11 3899 4824 2.0833333333333332e-11 3899 4402 -4.1666666666666665e-11 3899 3897 -2.0833333333333326e-11 3899 4868 -2.0833333333333332e-11 3899 4403 2.0833333333333326e-11 3899 3898 4.1666666666666665e-11 3899 4874 -2.0833333333333332e-11 3899 3902 -2.0833333333333326e-11 3899 4400 -4.1666666666666665e-11 3899 4854 -2.0833333333333332e-11 3899 3891 4.1666666666666665e-11 3899 4410 2.0833333333333326e-11 3899 4870 2.0833333333333332e-11 3899 4411 2.0833333333333326e-11 3899 4404 -4.1666666666666665e-11 3899 3901 4.1666666666666665e-11 3899 3900 -2.0833333333333326e-11 3900 3900 2.4999999999999996e-10 3900 4841 1.0416666666666665e-11 3900 4844 1.0416666666666663e-11 3900 4840 6.2500000000000004e-11 3900 3888 -2.0833333333333326e-11 3900 4854 2.0833333333333339e-11 3900 3891 1.6155871338926322e-27 3900 4410 1.0416666666666665e-11 3900 4870 -2.0833333333333339e-11 3900 4411 1.0416666666666663e-11 3900 4404 6.2500000000000004e-11 3900 3901 -2.6253290925755273e-27 3900 3899 -2.0833333333333326e-11 3901 3901 3.3333333666666659e-02 3901 4924 -1.0416666666666667e-03 3901 4872 -6.2500000000000003e-03 3901 4877 1.0416666666666667e-03 3901 3907 4.1666666666666666e-03 3901 4856 1.0416666666666667e-03 3901 4873 -8.3333333333333315e-03 3901 4875 -6.2500000000000003e-03 3901 4902 -1.0416666666666667e-03 3901 3906 -8.8991399020904929e-20 3901 3905 4.1666666666666666e-03 3901 4840 -1.0416666666666666e-11 3901 4858 4.1666667083333324e-03 3901 4841 6.2499999999999991e-11 3901 4838 -1.0416666666666666e-11 3901 3892 -1.4558380320789774e-20 3901 3888 4.1666666666666665e-11 3901 4874 -4.1666667083333333e-03 3901 3902 -7.4433021799253829e-20 3901 4400 -1.0416666666666666e-11 3901 4870 8.3333333333333330e-11 3901 4411 6.2499999999999991e-11 3901 4404 -1.0416666666666666e-11 3901 3900 -3.0991386737738975e-27 3901 3899 4.1666666666666665e-11 3902 3902 1.2500000124999999e-02 3902 4872 -1.0416666666666664e-03 3902 4869 -1.0416666666666662e-03 3902 4877 -6.2500000000000003e-03 3902 3907 -2.0833333333333329e-03 3902 4868 1.0416666770833331e-03 3902 4403 1.0416666666666665e-11 3902 3898 8.1315162936412833e-20 3902 4874 1.0416666770833340e-03 3902 3901 -1.0097419586828951e-27 3902 4411 1.0416666666666666e-11 3902 4400 6.2499999999999991e-11 3902 3899 -2.0833333333333326e-11 3903 3903 2.4999999999999994e-02 3903 4534 2.0833333333333329e-03 3903 4535 2.0833333333333329e-03 3903 3884 -2.0833333333333333e-03 3903 4538 -2.0833333333333329e-03 3903 4536 -2.0833333333333329e-03 3903 3885 4.1666666666666657e-03 3903 4852 -2.0833333333333329e-03 3903 3895 -2.0833333333333333e-03 3903 4865 4.1666666666666666e-03 3903 4540 -2.0833333333333329e-03 3903 3886 4.1666666666666657e-03 3903 4539 -2.0833333333333329e-03 3903 4850 -2.0833333333333329e-03 3903 4853 -2.0833333333333329e-03 3903 4895 -4.1666666666666666e-03 3903 3890 4.1666666666666657e-03 3903 3904 -2.0833333333333333e-03 3903 3625 -4.1666666666666666e-03 3904 3904 2.4999999999999998e-02 3904 4849 -1.0416666666666664e-03 3904 4541 -1.0416666666666664e-03 3904 4897 -6.2500000000000003e-03 3904 3905 -2.0833333333333329e-03 3904 4540 2.0833333333333337e-03 3904 3886 1.3552527156068805e-20 3904 4539 -1.0416666666666664e-03 3904 4850 2.0833333333333333e-03 3904 4853 -1.0416666666666664e-03 3904 4895 6.2500000000000003e-03 3904 3890 8.1315162936412833e-20 3904 3903 -2.0833333333333329e-03 3905 3905 2.4999999999999994e-02 3905 4858 2.0833333333333329e-03 3905 4542 -2.0833333333333329e-03 3905 4873 -2.0833333333333329e-03 3905 4875 -2.0833333333333329e-03 3905 4902 -4.1666666666666666e-03 3905 3901 4.1666666666666657e-03 3905 3906 -2.0833333333333333e-03 3905 4850 -2.0833333333333329e-03 3905 4540 -2.0833333333333329e-03 3905 4541 -2.0833333333333329e-03 3905 4897 4.1666666666666666e-03 3905 3886 4.1666666666666657e-03 3905 3904 -2.0833333333333333e-03 3905 4851 -2.0833333333333329e-03 3905 4849 -2.0833333333333329e-03 3905 4856 4.1666666666666666e-03 3905 3890 4.1666666666666657e-03 3905 3892 -2.0833333333333333e-03 3906 3906 2.5000000000000001e-02 3906 4872 -1.0416666666666664e-03 3906 4543 -1.0416666666666664e-03 3906 4924 6.2500000000000003e-03 3906 3907 -2.0833333333333329e-03 3906 4542 2.0833333333333337e-03 3906 3886 8.1315162936412833e-20 3906 4541 -1.0416666666666664e-03 3906 4873 2.0833333333333337e-03 3906 4875 -1.0416666666666664e-03 3906 4902 6.2500000000000003e-03 3906 3901 1.3552527156068805e-20 3906 3905 -2.0833333333333329e-03 3907 3907 2.4999999999999994e-02 3907 4873 -2.0833333333333329e-03 3907 4542 -2.0833333333333329e-03 3907 4924 -4.1666666666666666e-03 3907 3906 -2.0833333333333333e-03 3907 4874 -2.0833333333333329e-03 3907 4872 -2.0833333333333329e-03 3907 3901 4.1666666666666657e-03 3907 4868 -2.0833333333333329e-03 3907 3902 -2.0833333333333333e-03 3907 4877 4.1666666666666666e-03 3907 4544 -2.0833333333333329e-03 3907 3886 4.1666666666666657e-03 3907 4543 -2.0833333333333329e-03 3907 4867 -2.0833333333333329e-03 3907 4869 -2.0833333333333329e-03 3907 4925 -4.1666666666666666e-03 3907 3898 4.1666666666666657e-03 3907 3908 -2.0833333333333333e-03 3908 3908 2.4999999999999998e-02 3908 4529 1.0416666666666664e-03 3908 4531 1.0416666666666664e-03 3908 4528 6.2500000000000003e-03 3908 3883 -2.0833333333333329e-03 3908 4544 2.0833333333333337e-03 3908 3886 1.3552527156068805e-20 3908 4543 -1.0416666666666664e-03 3908 4867 2.0833333333333333e-03 3908 4869 -1.0416666666666664e-03 3908 4925 6.2500000000000003e-03 3908 3898 8.1315162936412833e-20 3908 3907 -2.0833333333333329e-03 3909 3909 2.4999999999999994e-02 3910 3910 1.6666666666666663e-02 3911 3911 1.6666666666666663e-02 3911 4565 6.2499999999999986e-03 3911 4554 1.0416666666666662e-03 3911 4557 1.0416666666666660e-03 3911 4548 1.0416666666666667e-03 3911 4547 2.0833333333333346e-03 3911 3650 1.0416666666666664e-03 3911 2990 -6.2499999999999986e-03 3912 3912 2.9166666666666660e-02 3913 3913 4.9999999999999989e-02 3913 5075 5.2083333333333339e-03 3913 4562 -8.3333333333333332e-03 3913 4910 3.1249999999999997e-03 3913 3918 8.6736173798840355e-19 3913 4567 -4.1666666666666657e-03 3913 4561 -1.2499999999999999e-02 3913 3919 -1.0416666666666671e-03 3913 4560 -2.1684043449710089e-19 3913 4556 -6.5052130349130266e-19 3913 4555 -1.0416666666666669e-03 3913 4554 -1.0416666666666667e-03 3913 4547 1.0416666666666666e-02 3913 2971 5.2083333333333330e-03 3913 3640 1.0416666666666664e-03 3913 3650 5.2083333333333330e-03 3913 2977 -4.1666666666666657e-03 3914 3914 4.9999999999999989e-02 3914 4910 3.1249999999999997e-03 3914 4567 -4.1666666666666666e-03 3914 4784 -1.2499999999999999e-02 3914 3919 -1.0416666666666654e-03 3914 4788 -1.0416666666666669e-03 3914 5075 5.2083333333333322e-03 3914 4787 -8.3333333333333315e-03 3914 3918 -4.3368086899420177e-19 3914 4566 8.6736173798840355e-19 3914 4786 -1.0416666666666664e-02 3914 4783 -2.1684043449710089e-19 3914 4782 -1.0416666666666671e-03 3914 3630 5.2083333333333339e-03 3914 3633 1.0416666666666664e-03 3914 2971 5.2083333333333330e-03 3914 2968 -4.1666666666666657e-03 3915 3915 2.0833333333333329e-02 3916 3916 2.4999999999999994e-02 3917 3917 2.0833333333333332e-02 3918 3918 3.3333333333333326e-02 3918 4784 -4.1666666666666666e-03 3918 4555 8.8938459461701536e-21 3918 4562 4.1666666666666666e-03 3918 4561 -4.1666666666666657e-03 3918 4910 1.6666666666666663e-02 3918 3913 4.3368086899420177e-19 3918 3919 -6.2499999999999986e-03 3918 4788 2.8940292364521927e-21 3918 5075 -4.1666666666666657e-03 3918 4787 4.1666666666666675e-03 3918 3914 -4.3368086899420177e-19 3919 3919 1.6666666666666663e-02 3919 4787 -1.0416666666666664e-03 3919 4562 -1.0416666666666667e-03 3919 4910 -2.0833333333333337e-03 3919 3918 -6.2499999999999986e-03 3919 4560 1.0416666666666664e-03 3919 4561 -1.0416666666666654e-03 3919 3913 -1.0416666666666671e-03 3919 4566 -1.0416666666666667e-03 3919 3914 -1.0416666666666656e-03 3919 4567 -6.2499999999999986e-03 3919 4784 -1.0416666666666671e-03 3919 2971 2.0833333333333337e-03 3920 3920 4.3749999999999990e-02 3920 5073 5.2083333333333330e-03 3920 4563 -1.0416666666666667e-03 3920 4562 -1.4583333333333332e-02 3920 3923 -6.2499999999999986e-03 3920 4910 -5.2083333333333330e-03 3920 4569 -3.2249014814734037e-20 3920 4561 -1.0416666666666673e-03 3920 3930 6.2499999999999986e-03 3920 4548 5.2083333333333339e-03 3920 4559 -1.0416666666666673e-03 3920 4552 1.0416666666666664e-03 3920 4547 1.0416666666666666e-02 3920 3927 1.3552527156068805e-20 3920 3926 -4.1666666666666657e-03 3920 4558 -2.1684043449710089e-19 3920 4557 -1.0416666666666669e-03 3921 3921 1.8749999999999996e-02 3922 3922 2.0833333333333329e-02 3923 3923 2.0833333333333329e-02 3923 4563 -2.8940292364521927e-21 3923 4562 4.1666666666666675e-03 3923 3920 -6.2499999999999986e-03 3923 4561 1.6284208410963924e-19 3923 4913 2.0833333333333329e-03 3923 4910 4.1666666666666675e-03 3923 3930 -4.1666666666666657e-03 3923 5074 2.0833333333333329e-03 3923 5073 -4.1666666666666675e-03 3924 3924 1.8749999999999996e-02 3925 3925 2.7083333333333327e-02 3926 3926 2.2916666666666662e-02 3926 4568 -2.0833333333333329e-03 3926 4581 2.0833333333333329e-03 3926 4553 2.0833333333333329e-03 3926 4550 -4.1666666666666666e-03 3926 3928 -2.0833333333333333e-03 3926 4557 -4.5316262678105068e-20 3926 4548 -4.1666666666666657e-03 3926 4559 2.0833333333333329e-03 3926 4552 2.0833333333333329e-03 3926 4547 -4.1666666666666666e-03 3926 3927 4.1666666666666657e-03 3926 3920 -4.1666666666666657e-03 3927 3927 6.0416666666666653e-02 3927 4580 1.0416666666666667e-03 3927 4902 -1.0416666666666667e-03 3927 4572 -8.3333333333333315e-03 3927 3934 -8.8991399020904929e-20 3927 4571 -6.2500000000000003e-03 3927 4924 -1.0416666666666667e-03 3927 3933 4.1666666666666666e-03 3927 4570 -6.2499999999999995e-03 3927 4900 -1.0416666666666667e-03 3927 3931 4.1666666666666666e-03 3927 4569 -9.3750000000000014e-03 3927 4561 2.1705219273391446e-19 3927 3930 1.0116749763768550e-19 3927 4568 -8.3333333333333315e-03 3927 3928 -8.8991399020904929e-20 3927 4550 -1.0416666666666667e-03 3927 4559 9.3749999999999997e-03 3927 4552 6.2500000000000003e-03 3927 4547 -1.0416666666666667e-03 3927 3920 -8.8991399020904929e-20 3927 3926 4.1666666666666666e-03 3928 3928 2.4999999999999998e-02 3928 4583 -1.0416666666666662e-03 3928 4571 -1.0416666666666664e-03 3928 4580 -6.2500000000000003e-03 3928 3933 -2.0833333333333329e-03 3928 4568 2.0833333333333337e-03 3928 3927 1.3552527156068805e-20 3928 4552 1.0416666666666664e-03 3928 4581 -2.0833333333333337e-03 3928 4553 1.0416666666666664e-03 3928 4550 6.2500000000000003e-03 3928 3926 -2.0833333333333329e-03 3929 3929 3.3333333333333326e-02 3930 3930 3.7499999999999992e-02 3930 4562 -5.2083333333333322e-03 3930 5074 1.0416666666666664e-03 3930 4913 -1.0416666666666673e-03 3930 4910 -1.0416666666666668e-02 3930 3923 -4.1666666666666657e-03 3930 4901 5.2083333333333322e-03 3930 4908 -1.0416666666666662e-03 3930 4570 -1.0416666666666664e-03 3930 4900 1.0416666666666666e-02 3930 3931 -4.1666666666666657e-03 3930 4559 2.1684043449710089e-19 3930 3927 2.1684043449710089e-19 3930 3920 6.2499999999999986e-03 3930 4569 1.0416666666666673e-03 3930 4561 1.0416666666666662e-03 3931 3931 2.2916666666666662e-02 3931 4936 2.0833333333333329e-03 3931 4572 -2.0833333333333329e-03 3931 4902 -4.1666666666666666e-03 3931 3934 -2.0833333333333333e-03 3931 4903 2.0833333333333329e-03 3931 4901 -4.1666666666666675e-03 3931 4908 -2.1705219273391446e-19 3931 4570 -2.0833333333333329e-03 3931 4569 -2.0833333333333329e-03 3931 4900 -4.1666666666666675e-03 3931 3927 4.1666666666666657e-03 3931 3930 -4.1666666666666657e-03 3932 3932 1.8749999999999996e-02 3933 3933 2.4999999999999994e-02 3933 4581 2.0833333333333329e-03 3933 4568 -2.0833333333333329e-03 3933 4580 4.1666666666666666e-03 3933 3928 -2.0833333333333333e-03 3933 4583 -2.0833333333333329e-03 3933 4923 -4.1666666666666666e-03 3933 4572 -2.0833333333333329e-03 3933 3927 4.1666666666666657e-03 3933 4571 -2.0833333333333329e-03 3933 4936 2.0833333333333329e-03 3933 4929 2.0833333333333329e-03 3933 4924 -4.1666666666666666e-03 3933 3934 -2.0833333333333333e-03 3934 3934 2.5000000000000001e-02 3934 4903 1.0416666666666664e-03 3934 4570 -1.0416666666666664e-03 3934 4902 6.2500000000000003e-03 3934 3931 -2.0833333333333329e-03 3934 4572 2.0833333333333337e-03 3934 3927 1.3552527156068805e-20 3934 4571 -1.0416666666666664e-03 3934 4936 -2.0833333333333337e-03 3934 4929 1.0416666666666664e-03 3934 4924 6.2500000000000003e-03 3934 3933 -2.0833333333333329e-03 3935 3935 3.3333333333333326e-02 3936 3936 1.2500000000000001e-02 3937 3937 2.4999999999999994e-02 3937 4549 2.0833333333333329e-03 3937 4548 -4.1666666666666666e-03 3937 4581 2.0833333333333329e-03 3937 4553 2.0833333333333329e-03 3937 4579 2.0833333333333329e-03 3937 4551 2.0833333333333329e-03 3937 4550 -4.1666666666666666e-03 3937 3938 -2.0833333333333333e-03 3937 3648 -4.1666666666666666e-03 3938 3938 2.5000000000000001e-02 3938 4928 1.0416666666666664e-03 3938 4553 1.0416666666666662e-03 3938 4581 -2.0833333333333337e-03 3938 4583 -1.0416666666666664e-03 3938 4580 -6.2500000000000003e-03 3938 3940 -2.0833333333333329e-03 3938 4579 -2.0833333333333337e-03 3938 4551 1.0416666666666664e-03 3938 4550 6.2500000000000003e-03 3938 3937 -2.0833333333333329e-03 3939 3939 3.3333333333333326e-02 3940 3940 2.4999999999999994e-02 3940 4923 -4.1666666666666666e-03 3940 4922 2.0833333333333329e-03 3940 4921 -4.1666666666666666e-03 3940 4579 2.0833333333333329e-03 3940 4928 2.0833333333333329e-03 3940 4581 2.0833333333333329e-03 3940 4583 -2.0833333333333329e-03 3940 4580 4.1666666666666666e-03 3940 3938 -2.0833333333333333e-03 3941 3941 3.3333333333333326e-02 3942 3942 1.2500000000000001e-02 3943 3943 1.6666666666666663e-02 3944 3944 1.2500000000000001e-02 3945 3945 1.6666666666666663e-02 3946 3946 1.2500000000000001e-02 3947 3947 1.2499999999999999e-02 3948 3948 3.7499999999999992e-02 3948 4588 -4.1666666666666666e-03 3948 3950 4.1666666666666657e-03 3948 4587 2.0833333333333329e-03 3948 4613 2.0833333333333329e-03 3948 4589 2.0833333333333329e-03 3948 4611 2.0833333333333329e-03 3948 4586 -4.1666666666666666e-03 3948 3949 -2.0833333333333333e-03 3948 2136 4.1666666666666666e-03 3948 1926 2.0833333333333329e-03 3948 1930 4.1666666666666666e-03 3948 1928 -4.1666666666666657e-03 3948 2133 1.6666666666666663e-02 3948 1434 2.0833333333333333e-03 3948 1439 -6.2499999999999986e-03 3949 3949 1.2500000124999999e-02 3949 4589 1.0416666666666664e-03 3949 4615 1.0416666666666666e-11 3949 4613 -1.0416666770833331e-03 3949 4657 -1.0416666666666665e-11 3949 4612 -6.2499999999999991e-11 3949 3953 -2.0833333333333326e-11 3949 4611 -1.0416666770833340e-03 3949 4587 1.0416666666666664e-03 3949 4586 6.2500000000000003e-03 3949 3950 -1.0097419586828951e-27 3949 3948 -2.0833333333333329e-03 3950 3950 1.6666667229166664e-02 3950 4587 6.2500000000000003e-03 3950 3948 4.1666666666666666e-03 3950 4615 6.2499999999999991e-11 3950 3953 4.1666666666666665e-11 3950 4612 1.0416666666666666e-11 3950 4611 4.1666667083333333e-03 3950 4586 -1.0416666666666667e-03 3950 3949 -7.4433021799253829e-20 3950 1802 3.1250000000000002e-11 3950 1810 1.6666666666666666e-10 3950 1809 3.1250000000000002e-11 3950 1442 2.0833333333333339e-11 3950 1954 -2.0833333333333329e-11 3950 1951 -6.2500000000000017e-11 3950 1440 5.2083333333333341e-11 3950 1930 1.0416666666666667e-03 3950 1950 -7.2916666666666660e-11 3950 2074 -1.0416666666666666e-11 3950 1438 5.2083333333333321e-11 3950 1949 1.0416666666666665e-11 3950 1927 2.0833333333333329e-11 3950 1926 4.1666666979166657e-03 3950 1435 5.2083333333333328e-11 3950 1434 8.4829026136728466e-20 3951 3951 2.4999999999999994e-02 3952 3952 1.6666666833333330e-02 3953 3953 2.4999999999999996e-10 3953 4891 2.0833333333333326e-11 3953 4615 2.0833333333333326e-11 3953 3950 4.1666666666666665e-11 3953 4611 2.0833333333333329e-11 3953 4890 -4.1666666666666665e-11 3953 4613 2.0833333333333332e-11 3953 4657 -2.0833333333333326e-11 3953 4612 4.1666666666666665e-11 3953 3949 -2.0833333333333326e-11 3953 2078 2.0833333333333332e-11 3953 1950 -2.0833333333333332e-11 3953 2074 -4.1666666666666665e-11 3953 1438 -2.0833333333333326e-11 3954 3954 1.2499999999999998e-10 3955 3955 4.5833333333333330e-10 3956 3956 2.4999999999999994e-02 3956 4595 2.0833333333333329e-03 3956 3962 4.1666666666666657e-03 3956 3957 -2.0833333333333333e-03 3956 4592 -4.1666666666666666e-03 3956 4610 -2.0833333333333329e-03 3956 4650 2.0833333333333329e-03 3956 4590 -4.1666666666666666e-03 3956 3961 -2.0833333333333333e-03 3956 4599 2.0833333333333329e-03 3956 4593 2.0833333333333329e-03 3956 3958 4.1666666666666657e-03 3956 2138 2.0833333333333329e-03 3956 2132 2.0833333333333329e-03 3956 2133 4.1666666666666675e-03 3956 1647 -2.0833333333333329e-03 3956 2194 2.0833333333333329e-03 3956 1646 4.1666666666666657e-03 3956 2193 2.0833333333333329e-03 3957 3957 2.5000000000000001e-02 3957 4597 6.2500000000000003e-03 3957 4592 6.2500000000000003e-03 3957 3956 -2.0833333333333329e-03 3957 4605 -1.0416666666666664e-03 3957 4599 -2.0833333333333337e-03 3957 4593 1.0416666666666664e-03 3957 3958 1.3552527156068805e-20 3957 2194 -2.0833333333333337e-03 3957 1013 1.0416666666666664e-03 3957 491 -2.0833333333333329e-03 3957 1646 8.1315162936412833e-20 3957 2193 1.0416666666666662e-03 3958 3958 6.6666666666666652e-02 3958 4620 -1.0416666666666667e-03 3958 4590 -1.0416666666666667e-03 3958 4610 -8.3333333333333315e-03 3958 4609 -6.2500000000000003e-03 3958 4626 -1.0416666666666667e-03 3958 3961 -8.8991399020904929e-20 3958 3959 4.1666666666666666e-03 3958 4608 -8.3333333333333315e-03 3958 4634 1.0416666666666667e-03 3958 3960 -8.8991399020904929e-20 3958 4597 -1.0416666666666667e-03 3958 4607 -6.2500000000000003e-03 3958 4606 -8.3333333333333315e-03 3958 4605 -6.2500000000000003e-03 3958 4599 8.3333333333333315e-03 3958 4593 6.2500000000000003e-03 3958 4592 -1.0416666666666667e-03 3958 3957 -8.8991399020904929e-20 3958 3956 4.1666666666666666e-03 3958 3692 -1.0416666666666667e-03 3958 2829 4.1666666666666666e-03 3958 3662 -1.0416666666666667e-03 3958 2830 -8.8991399020904929e-20 3958 491 4.1666666666666666e-03 3959 3959 2.4999999999999994e-02 3959 4650 2.0833333333333329e-03 3959 4655 -2.0833333333333329e-03 3959 4631 2.0833333333333329e-03 3959 3962 4.1666666666666657e-03 3959 4641 -2.0833333333333329e-03 3959 3965 -2.0833333333333333e-03 3959 4622 -4.1666666666666666e-03 3959 4608 -2.0833333333333329e-03 3959 4610 -2.0833333333333329e-03 3959 4609 -2.0833333333333329e-03 3959 4626 -4.1666666666666666e-03 3959 3958 4.1666666666666657e-03 3959 3961 -2.0833333333333333e-03 3959 4636 2.0833333333333329e-03 3959 4628 2.0833333333333329e-03 3959 4620 -4.1666666666666666e-03 3959 3960 -2.0833333333333333e-03 3959 2831 4.1666666666666657e-03 3960 3960 2.4999999999999998e-02 3960 4609 -1.0416666666666664e-03 3960 4608 2.0833333333333337e-03 3960 4607 -1.0416666666666664e-03 3960 4634 -6.2500000000000003e-03 3960 3958 1.3552527156068805e-20 3960 4636 -2.0833333333333337e-03 3960 4628 1.0416666666666664e-03 3960 4620 6.2500000000000003e-03 3960 3959 -2.0833333333333329e-03 3960 3693 1.0416666666666662e-03 3960 2829 -2.0833333333333329e-03 3960 2831 8.1315162936412833e-20 3961 3961 2.5000000000000001e-02 3961 4631 1.0416666666666664e-03 3961 4593 1.0416666666666664e-03 3961 4610 2.0833333333333337e-03 3961 4609 -1.0416666666666664e-03 3961 4626 6.2500000000000003e-03 3961 3958 1.3552527156068805e-20 3961 3959 -2.0833333333333329e-03 3961 4650 -2.0833333333333337e-03 3961 4595 1.0416666666666664e-03 3961 4590 6.2500000000000003e-03 3961 3962 8.1315162936412833e-20 3961 3956 -2.0833333333333329e-03 3962 3962 6.0416666666666653e-02 3962 4654 9.3749999999999997e-03 3962 3964 1.5502688168223823e-19 3962 4595 6.2499999999999995e-03 3962 3956 4.1666666666666666e-03 3962 4626 -1.0416666666666667e-03 3962 4952 -1.0416666666666667e-03 3962 4655 -8.3333333333333315e-03 3962 4631 6.2500000000000003e-03 3962 4622 -1.0416666666666667e-03 3962 3965 -8.8991399020904929e-20 3962 3959 4.1666666666666666e-03 3962 4653 -6.2500000000000003e-03 3962 4946 -1.0416666666666667e-03 3962 3963 4.1666666666666666e-03 3962 4650 8.3333333333333315e-03 3962 4590 -1.0416666666666667e-03 3962 3961 1.5502688168223823e-19 3962 1793 2.1705219273391446e-19 3962 2132 9.3750000000000014e-03 3962 2133 1.0416666666666667e-03 3962 1647 1.0116749763768550e-19 3963 3963 2.4999999999999994e-02 3963 4655 -2.0833333333333329e-03 3963 4641 -2.0833333333333329e-03 3963 4640 -2.0833333333333329e-03 3963 4952 -4.1666666666666666e-03 3963 3965 -2.0833333333333333e-03 3963 4958 2.0833333333333329e-03 3963 4654 2.0833333333333329e-03 3963 4653 -2.0833333333333329e-03 3963 4946 -4.1666666666666666e-03 3963 3962 4.1666666666666657e-03 3963 3964 -2.0833333333333333e-03 3963 4947 2.0833333333333329e-03 3963 4950 -4.1666666666666666e-03 3963 3686 2.0833333333333329e-03 3963 2831 4.1666666666666657e-03 3963 3395 2.0833333333333329e-03 3963 1648 4.1666666666666657e-03 3963 2827 -2.0833333333333333e-03 3964 3964 2.2916666666666665e-02 3964 4654 -1.0416666666666673e-03 3964 3962 8.1315162936412833e-20 3964 4958 -2.1684043449710089e-19 3964 4947 1.0416666666666664e-03 3964 4653 -1.0416666666666664e-03 3964 4946 6.2500000000000003e-03 3964 3963 -2.0833333333333329e-03 3964 2132 -4.9904357809065860e-20 3964 2137 -1.6263032587282567e-19 3964 1793 -1.0416666666666673e-03 3964 1648 -1.0416666666666667e-03 3964 1647 1.0416666666666664e-03 3965 3965 2.5000000000000001e-02 3965 4653 -1.0416666666666664e-03 3965 4655 2.0833333333333337e-03 3965 4631 1.0416666666666664e-03 3965 3962 1.3552527156068805e-20 3965 4628 1.0416666666666664e-03 3965 4622 6.2500000000000003e-03 3965 3959 -2.0833333333333329e-03 3965 4641 2.0833333333333333e-03 3965 4640 -1.0416666666666664e-03 3965 4952 6.2500000000000003e-03 3965 3963 -2.0833333333333329e-03 3965 2831 8.1315162936412833e-20 3966 3966 2.5000000000000002e-10 3966 4885 -2.0833333333333329e-11 3966 4604 -2.0833333333333332e-11 3966 4438 -4.1666666666666665e-11 3966 3978 -2.0833333333333326e-11 3966 4601 -2.0833333333333329e-11 3966 3970 4.1666666666666665e-11 3966 4447 2.0833333333333326e-11 3966 4461 2.0833333333333332e-11 3966 4462 2.0833333333333332e-11 3966 4439 2.0833333333333326e-11 3966 4430 -4.1666666666666665e-11 3966 3977 4.1666666666666665e-11 3966 3976 -2.0833333333333326e-11 3966 4887 2.0833333333333332e-11 3966 4437 2.0833333333333326e-11 3966 4436 -4.1666666666666665e-11 3966 3968 4.1666666666666665e-11 3966 3967 -2.0833333333333326e-11 3967 3967 2.4999999999999996e-10 3967 4887 -2.0833333333333339e-11 3967 3968 -2.6253290925755273e-27 3967 4888 6.2499999999999991e-11 3967 3969 -2.0833333333333326e-11 3967 4447 1.0416666666666665e-11 3967 4601 2.0833333333333339e-11 3967 4600 -1.0416666666666665e-11 3967 3970 1.6155871338926322e-27 3967 4437 1.0416666666666666e-11 3967 4436 6.2500000000000004e-11 3967 3966 -2.0833333333333326e-11 3967 2075 1.0416666666666666e-11 3968 3968 5.4166666666666666e-10 3968 4461 9.3749999999999999e-11 3968 3976 9.8400537165005960e-28 3968 4887 8.3333333333333330e-11 3968 3967 -3.0991386737738975e-27 3968 4888 -1.0416666666666666e-11 3968 3969 4.1666666666666665e-11 3968 4430 -1.0416666666666666e-11 3968 4437 6.2499999999999991e-11 3968 4436 -1.0416666666666666e-11 3968 3966 4.1666666666666665e-11 3968 1785 -1.8812360437258079e-27 3968 1803 1.0416666666666667e-10 3968 1802 -3.6295685768920020e-28 3968 1471 -3.0991386737738975e-27 3968 2076 -9.3750000000000012e-11 3968 2074 -1.0416666666666666e-11 3968 1468 -3.0797129739828301e-27 3968 2075 6.2499999999999991e-11 3969 3969 2.4999999999999996e-10 3969 3975 4.1666666666666665e-11 3969 4615 2.0833333333333326e-11 3969 4887 2.0833333333333332e-11 3969 3968 4.1666666666666665e-11 3969 3967 -2.0833333333333326e-11 3969 4888 -4.1666666666666665e-11 3969 4603 -2.0833333333333329e-11 3969 4611 2.0833333333333332e-11 3969 4612 4.1666666666666665e-11 3969 3974 -2.0833333333333326e-11 3969 4601 -2.0833333333333332e-11 3969 4600 -2.0833333333333326e-11 3969 3970 4.1666666666666665e-11 3969 1950 -2.0833333333333332e-11 3969 2076 -2.0833333333333332e-11 3969 2074 -4.1666666666666665e-11 3969 1468 -2.0833333333333326e-11 3969 2075 2.0833333333333326e-11 3970 3970 3.3333333666666659e-02 3970 4889 1.0416666666666667e-03 3970 4612 1.0416666666666666e-11 3970 4604 -4.1666667083333324e-03 3970 4438 -1.0416666666666666e-11 3970 3978 8.4829026083874785e-20 3970 4447 6.2499999999999991e-11 3970 4436 -1.0416666666666666e-11 3970 3966 4.1666666666666665e-11 3970 4603 -4.1666667083333333e-03 3970 4586 -1.0416666666666667e-03 3970 3974 7.0197856548546410e-20 3970 4594 6.2500000000000003e-03 3970 4592 -1.0416666666666667e-03 3970 3973 4.1666666666666666e-03 3970 4598 8.3333333333333315e-03 3970 4602 -6.2500000000000003e-03 3970 4597 -1.0416666666666667e-03 3970 3972 1.5502688168223823e-19 3970 3971 4.1666666666666666e-03 3970 4601 -8.3333333333333330e-11 3970 4600 -6.2499999999999991e-11 3970 4888 -1.0416666666666666e-11 3970 3967 9.5018296033870872e-28 3970 3969 4.1666666666666665e-11 3971 3971 2.4999999999999994e-02 3971 3977 4.1666666666666657e-03 3971 4886 2.0833333333333329e-03 3971 3972 -2.0833333333333333e-03 3971 4597 -4.1666666666666666e-03 3971 4604 -2.0833333333333329e-03 3971 4885 -2.0833333333333329e-03 3971 4889 4.1666666666666666e-03 3971 3978 -2.0833333333333333e-03 3971 4598 2.0833333333333329e-03 3971 4602 -2.0833333333333329e-03 3971 3970 4.1666666666666657e-03 3971 708 -2.0833333333333329e-03 3971 1015 -2.0833333333333329e-03 3971 1011 -4.1666666666666666e-03 3971 293 -2.0833333333333333e-03 3971 1937 2.0833333333333329e-03 3971 1463 4.1666666666666657e-03 3971 1014 2.0833333333333329e-03 3972 3972 2.5000000000000001e-02 3972 4597 6.2500000000000003e-03 3972 3971 -2.0833333333333329e-03 3972 4592 6.2500000000000003e-03 3972 3973 -2.0833333333333329e-03 3972 4594 1.0416666666666662e-03 3972 4598 -2.0833333333333337e-03 3972 4602 -1.0416666666666664e-03 3972 3970 8.1315162936412833e-20 3972 1937 -2.0833333333333337e-03 3972 1463 1.3552527156068805e-20 3972 1014 1.0416666666666664e-03 3972 1936 -1.0416666666666664e-03 3973 3973 2.4999999999999994e-02 3973 4587 2.0833333333333329e-03 3973 3975 4.1666666666666657e-03 3973 4592 -4.1666666666666666e-03 3973 3972 -2.0833333333333333e-03 3973 4611 2.0833333333333329e-03 3973 4603 -2.0833333333333329e-03 3973 4586 -4.1666666666666666e-03 3973 3974 -2.0833333333333333e-03 3973 4598 2.0833333333333329e-03 3973 3970 4.1666666666666657e-03 3973 4594 2.0833333333333329e-03 3973 1933 2.0833333333333329e-03 3973 1926 2.0833333333333329e-03 3973 1930 4.1666666666666666e-03 3973 1467 -2.0833333333333333e-03 3973 1937 2.0833333333333329e-03 3973 1936 -2.0833333333333329e-03 3973 1463 4.1666666666666657e-03 3974 3974 1.2500000125000001e-02 3974 4600 -1.0416666666666665e-11 3974 4615 1.0416666666666666e-11 3974 4612 -6.2499999999999991e-11 3974 3969 -2.0833333333333326e-11 3974 4611 -1.0416666770833333e-03 3974 3975 1.3552525540481672e-20 3974 4587 1.0416666666666664e-03 3974 4603 1.0416666770833335e-03 3974 4594 1.0416666666666664e-03 3974 4586 6.2500000000000003e-03 3974 3970 1.6155871338926322e-27 3974 3973 -2.0833333333333329e-03 3975 3975 1.6666667229166664e-02 3975 4587 6.2500000000000003e-03 3975 3973 4.1666666666666666e-03 3975 4615 6.2499999999999991e-11 3975 3969 4.1666666666666665e-11 3975 4612 1.0416666666666666e-11 3975 4611 4.1666667083333324e-03 3975 3974 -1.4558380320789774e-20 3975 4586 -1.0416666666666667e-03 3975 1802 -5.2083333333333334e-11 3975 1810 4.1666666666666665e-11 3975 1809 -5.2083333333333334e-11 3975 1471 1.4583333333333335e-10 3975 1948 -2.0833333333333326e-11 3975 1951 -1.2500000000000001e-10 3975 1469 -1.0416666666666671e-11 3975 1930 1.0416666666666667e-03 3975 1950 -1.3541666666666666e-10 3975 1468 -1.0416666666666661e-11 3975 2074 -1.0416666666666666e-11 3975 1947 -1.0416666666666665e-11 3975 1466 5.2083333333333328e-11 3975 1934 2.0833333333333329e-11 3975 1926 4.1666666979166666e-03 3975 1467 7.0197859108400047e-20 3976 3976 2.2916666666666665e-10 3976 4462 -1.2924697071141057e-26 3976 3977 -1.0416666666666666e-11 3976 3968 2.2214323091023692e-27 3976 4461 -1.0416666666666665e-11 3976 4437 1.0416666666666665e-11 3976 4439 1.0416666666666663e-11 3976 4430 6.2500000000000004e-11 3976 3966 -2.0833333333333326e-11 3976 1811 -2.4233807008389483e-27 3976 1803 2.0194839173657902e-27 3976 1471 1.0416666666666663e-11 3976 1785 -1.0416666666666671e-11 3977 3977 1.6666667229166664e-02 3977 4886 6.2500000000000003e-03 3977 3971 4.1666666666666666e-03 3977 4462 1.3541666666666666e-10 3977 3976 -1.0416666666666666e-11 3977 4889 1.0416666666666667e-03 3977 4885 -4.1666667083333333e-03 3977 3978 -7.4433021799253829e-20 3977 4438 -1.0416666666666666e-11 3977 4439 6.2499999999999991e-11 3977 4430 -1.0416666666666666e-11 3977 3966 4.1666666666666665e-11 3977 706 -2.0833333333333329e-11 3977 708 -4.1666666979166657e-03 3977 293 8.4829026136728466e-20 3977 1011 -1.0416666666666667e-03 3977 705 -1.0416666666666665e-11 3977 1470 5.2083333333333328e-11 3977 700 2.0833333333333329e-11 3977 1819 1.2500000000000001e-10 3977 1472 -1.0416666666666660e-11 3977 1804 -5.2083333333333334e-11 3977 1811 4.1666666666666665e-11 3977 1785 5.2083333333333334e-11 3977 1471 1.4583333333333332e-10 3978 3978 1.2500000124999999e-02 3978 4602 -1.0416666666666664e-03 3978 4886 1.0416666666666664e-03 3978 4889 -6.2500000000000003e-03 3978 3971 -2.0833333333333329e-03 3978 4885 1.0416666770833340e-03 3978 3977 -1.0097419586828951e-27 3978 4439 1.0416666666666666e-11 3978 4604 1.0416666770833331e-03 3978 4447 1.0416666666666665e-11 3978 4438 6.2499999999999991e-11 3978 3970 8.1315162936412833e-20 3978 3966 -2.0833333333333326e-11 3979 3979 2.4999999999999994e-02 3979 4646 -2.0833333333333329e-03 3979 4625 2.0833333333333329e-03 3979 4624 -4.1666666666666666e-03 3979 4758 -2.0833333333333329e-03 3979 4619 2.0833333333333329e-03 3979 4618 -4.1666666666666666e-03 3979 3985 -2.0833333333333333e-03 3979 4617 2.0833333333333329e-03 3979 4616 -4.1666666666666666e-03 3980 3980 1.2500000000000001e-02 3981 3981 1.6666666833333330e-02 3982 3982 2.5000000000000002e-10 3982 4758 -2.0833333333333329e-11 3982 4646 -2.0833333333333332e-11 3982 4645 -2.0833333333333326e-11 3982 4742 -4.1666666666666665e-11 3982 3985 -2.0833333333333326e-11 3982 4737 2.0833333333333326e-11 3982 4736 -4.1666666666666665e-11 3982 4735 2.0833333333333326e-11 3982 4734 -4.1666666666666665e-11 3983 3983 1.2499999999999998e-10 3984 3984 1.6666666833333330e-02 3985 3985 1.2500000124999999e-02 3985 4735 1.0416666666666665e-11 3985 4617 1.0416666666666664e-03 3985 4646 1.0416666770833333e-03 3985 4645 -1.0416666666666666e-11 3985 4742 6.2499999999999991e-11 3985 3982 -2.0833333333333326e-11 3985 4758 1.0416666770833335e-03 3985 4619 1.0416666666666664e-03 3985 4618 6.2500000000000003e-03 3985 3979 -2.0833333333333329e-03 3986 3986 1.2499999999999999e-02 3987 3987 1.6666666666666663e-02 3988 3988 1.2499999999999998e-10 3989 3989 1.6666666666666666e-10 3990 3990 2.4999999999999994e-02 3990 4971 2.0833333333333329e-03 3990 4641 -2.0833333333333329e-03 3990 4622 -4.1666666666666666e-03 3990 3995 -2.0833333333333333e-03 3990 4623 2.0833333333333329e-03 3990 4616 -4.1666666666666666e-03 3990 4636 2.0833333333333329e-03 3990 4628 2.0833333333333329e-03 3990 4635 2.0833333333333329e-03 3990 4629 2.0833333333333329e-03 3990 4620 -4.1666666666666666e-03 3990 3991 -2.0833333333333333e-03 3990 3014 4.1666666666666657e-03 3991 3991 2.5000000000000001e-02 3991 4637 -1.0416666666666664e-03 3991 4634 -6.2500000000000003e-03 3991 4636 -2.0833333333333337e-03 3991 4628 1.0416666666666662e-03 3991 4635 -2.0833333333333337e-03 3991 4629 1.0416666666666664e-03 3991 4620 6.2500000000000003e-03 3991 3990 -2.0833333333333329e-03 3991 3693 1.0416666666666664e-03 3991 3011 -2.0833333333333329e-03 3991 3014 8.1315162936412833e-20 3992 3992 3.3333333333333326e-02 3993 3993 1.2500000000000001e-02 3994 3994 2.4999999999999994e-02 3994 4950 -4.1666666666666666e-03 3994 4951 2.0833333333333329e-03 3994 4948 -4.1666666666666666e-03 3994 4641 -2.0833333333333329e-03 3994 4640 -2.0833333333333329e-03 3994 4971 2.0833333333333329e-03 3994 4956 2.0833333333333329e-03 3994 4952 -4.1666666666666666e-03 3994 3995 -2.0833333333333333e-03 3994 3687 2.0833333333333329e-03 3994 3686 2.0833333333333329e-03 3994 3018 -2.0833333333333333e-03 3994 3014 4.1666666666666657e-03 3995 3995 2.5000000000000001e-02 3995 4623 1.0416666666666664e-03 3995 4628 1.0416666666666664e-03 3995 4622 6.2500000000000003e-03 3995 3990 -2.0833333333333329e-03 3995 4641 2.0833333333333333e-03 3995 4640 -1.0416666666666664e-03 3995 4971 -2.0833333333333337e-03 3995 4956 1.0416666666666664e-03 3995 4952 6.2500000000000003e-03 3995 3994 -2.0833333333333329e-03 3995 3014 8.1315162936412833e-20 3996 3996 3.3333333333333326e-02 3997 3997 1.2500000000000001e-02 3998 3998 2.4999999999999994e-02 3998 4968 -2.0833333333333329e-03 3998 4646 -2.0833333333333329e-03 3998 4618 -4.1666666666666666e-03 3998 4011 -2.0833333333333333e-03 3998 4617 2.0833333333333329e-03 3998 4616 -4.1666666666666666e-03 3998 4635 2.0833333333333329e-03 3998 4629 2.0833333333333329e-03 3998 4633 2.0833333333333329e-03 3998 4621 2.0833333333333329e-03 3998 4620 -4.1666666666666666e-03 3998 4000 4.1666666666666657e-03 3998 3999 -2.0833333333333333e-03 3999 3999 2.4999999999999998e-02 3999 4966 1.0416666666666662e-03 3999 4629 1.0416666666666664e-03 3999 4635 -2.0833333333333337e-03 3999 4637 -1.0416666666666664e-03 3999 4634 -6.2500000000000003e-03 3999 4001 -2.0833333333333329e-03 3999 4633 -2.0833333333333337e-03 3999 4621 1.0416666666666664e-03 3999 4620 6.2500000000000003e-03 3999 4000 8.1315162936412833e-20 3999 3998 -2.0833333333333329e-03 4000 4000 3.3333333666666659e-02 4000 4490 -1.0416666666666666e-11 4000 4742 -1.0416666666666666e-11 4000 4748 6.2499999999999991e-11 4000 4738 -1.0416666666666666e-11 4000 4003 4.1666666666666665e-11 4000 4968 -4.1666667083333324e-03 4000 4011 8.4829026083874785e-20 4000 4618 -1.0416666666666667e-03 4000 4525 4.1666667083333333e-03 4000 4523 1.0416666666666667e-03 4000 4009 7.0197856548546410e-20 4000 4966 6.2500000000000003e-03 4000 4634 1.0416666666666667e-03 4000 4001 4.1666666666666666e-03 4000 4967 -8.3333333333333330e-11 4000 4501 6.2499999999999991e-11 4000 4500 -1.0416666666666666e-11 4000 4004 9.5018296033870872e-28 4000 4006 4.1666666666666665e-11 4000 4633 8.3333333333333315e-03 4000 4621 6.2500000000000003e-03 4000 4620 -1.0416666666666667e-03 4000 3999 1.5502688168223823e-19 4000 3998 4.1666666666666666e-03 4001 4001 2.4999999999999994e-02 4001 4524 2.0833333333333329e-03 4001 4965 2.0833333333333329e-03 4001 4525 2.0833333333333329e-03 4001 4523 4.1666666666666666e-03 4001 4009 -2.0833333333333333e-03 4001 4633 2.0833333333333329e-03 4001 4000 4.1666666666666657e-03 4001 4966 2.0833333333333329e-03 4001 4635 2.0833333333333329e-03 4001 4637 -2.0833333333333329e-03 4001 4634 4.1666666666666666e-03 4001 3999 -2.0833333333333333e-03 4001 3691 -4.1666666666666666e-03 4002 4002 3.3333333333333326e-02 4003 4003 2.5000000000000002e-10 4003 4646 -2.0833333333333329e-11 4003 4968 -2.0833333333333332e-11 4003 4742 -4.1666666666666665e-11 4003 4011 -2.0833333333333326e-11 4003 4967 -2.0833333333333329e-11 4003 4000 4.1666666666666665e-11 4003 4748 2.0833333333333326e-11 4003 4645 -2.0833333333333326e-11 4003 4736 -4.1666666666666665e-11 4003 5061 2.0833333333333332e-11 4003 4739 2.0833333333333326e-11 4003 4738 -4.1666666666666665e-11 4003 4004 -2.0833333333333326e-11 4004 4004 2.4999999999999996e-10 4004 4748 1.0416666666666665e-11 4004 4507 1.0416666666666666e-11 4004 4967 2.0833333333333339e-11 4004 4501 1.0416666666666665e-11 4004 4500 6.2499999999999991e-11 4004 4000 1.6155871338926322e-27 4004 4006 -2.0833333333333326e-11 4004 5061 -2.0833333333333339e-11 4004 4739 1.0416666666666666e-11 4004 4738 6.2500000000000004e-11 4004 4003 -2.0833333333333326e-11 4005 4005 3.3333333333333332e-10 4006 4006 2.5000000000000002e-10 4006 4525 2.0833333333333329e-11 4006 4524 2.0833333333333332e-11 4006 4490 -4.1666666666666665e-11 4006 4009 -2.0833333333333326e-11 4006 4499 2.0833333333333326e-11 4006 4498 -4.1666666666666665e-11 4006 5061 2.0833333333333332e-11 4006 4507 2.0833333333333326e-11 4006 4967 -2.0833333333333332e-11 4006 4501 2.0833333333333326e-11 4006 4500 -4.1666666666666665e-11 4006 4000 4.1666666666666665e-11 4006 4004 -2.0833333333333326e-11 4007 4007 1.2500000000000001e-02 4008 4008 1.6666666833333330e-02 4009 4009 1.2500000125000001e-02 4009 4501 1.0416666666666665e-11 4009 4499 1.0416666666666666e-11 4009 4490 6.2499999999999991e-11 4009 4006 -2.0833333333333326e-11 4009 4524 -1.0416666770833333e-03 4009 4965 1.0416666666666664e-03 4009 4525 -1.0416666770833335e-03 4009 4966 1.0416666666666664e-03 4009 4523 -6.2500000000000003e-03 4009 4000 1.6155871338926322e-27 4009 4001 -2.0833333333333329e-03 4010 4010 1.6666666833333330e-02 4011 4011 1.2500000124999999e-02 4011 4645 -1.0416666666666666e-11 4011 4748 1.0416666666666665e-11 4011 4742 6.2499999999999991e-11 4011 4003 -2.0833333333333326e-11 4011 4968 1.0416666770833331e-03 4011 4000 8.1315162936412833e-20 4011 4621 1.0416666666666664e-03 4011 4646 1.0416666770833340e-03 4011 4617 1.0416666666666664e-03 4011 4618 6.2500000000000003e-03 4011 3998 -2.0833333333333329e-03 4012 4012 1.2500000000000001e-02 4013 4013 1.2499999999999998e-10 4014 4014 1.2499999999999998e-10 4015 4015 2.2916666666666662e-02 4015 4595 2.0833333333333329e-03 4015 4018 4.1666666666666657e-03 4015 4588 -4.1666666666666666e-03 4015 4650 2.0833333333333329e-03 4015 4649 2.0833333333333329e-03 4015 4596 2.0833333333333329e-03 4015 4590 -4.1666666666666666e-03 4015 4016 -2.0833333333333333e-03 4015 2132 2.0833333333333329e-03 4015 2136 2.8940292364521927e-21 4015 2133 4.1666666666666675e-03 4015 1254 -4.1666666666666657e-03 4016 4016 2.5000000000000001e-02 4016 4627 1.0416666666666664e-03 4016 4631 1.0416666666666664e-03 4016 4626 6.2500000000000003e-03 4016 4023 -2.0833333333333329e-03 4016 4650 -2.0833333333333337e-03 4016 4018 8.1315162936412833e-20 4016 4595 1.0416666666666664e-03 4016 4649 -2.0833333333333337e-03 4016 4596 1.0416666666666664e-03 4016 4590 6.2500000000000003e-03 4016 4015 -2.0833333333333329e-03 4017 4017 3.3333333333333326e-02 4018 4018 6.0416666666666653e-02 4018 4595 6.2499999999999995e-03 4018 4015 4.1666666666666657e-03 4018 4654 9.3749999999999997e-03 4018 4021 1.5502688168223823e-19 4018 4626 -1.0416666666666667e-03 4018 4952 -1.0416666666666667e-03 4018 4655 -8.3333333333333315e-03 4018 4024 -8.8991399020904929e-20 4018 4631 6.2500000000000003e-03 4018 4622 -1.0416666666666667e-03 4018 4023 4.1666666666666666e-03 4018 4653 -6.2500000000000003e-03 4018 4946 -1.0416666666666667e-03 4018 4020 4.1666666666666666e-03 4018 4650 8.3333333333333315e-03 4018 4016 1.5502688168223823e-19 4018 4590 -1.0416666666666667e-03 4018 2133 1.0416666666666664e-03 4018 2132 9.3749999999999997e-03 4018 1793 5.0116116045879435e-20 4018 1254 1.0116749763768550e-19 4019 4019 1.8749999999999996e-02 4020 4020 2.2916666666666662e-02 4020 4972 2.0833333333333329e-03 4020 4655 -2.0833333333333329e-03 4020 4952 -4.1666666666666666e-03 4020 4024 -2.0833333333333333e-03 4020 4953 2.0833333333333329e-03 4020 4654 2.0833333333333329e-03 4020 4018 4.1666666666666657e-03 4020 4653 -2.0833333333333329e-03 4020 4962 -2.8940292364521927e-21 4020 4955 -4.1666666666666675e-03 4020 4946 -4.1666666666666666e-03 4020 4021 -4.1666666666666657e-03 4021 4021 4.3749999999999990e-02 4021 4962 -1.0416666666666667e-03 4021 4654 -1.0416666666666667e-03 4021 4018 8.1315162936412833e-20 4021 4653 -1.0416666666666664e-03 4021 4955 5.2083333333333330e-03 4021 4946 1.0416666666666666e-02 4021 4020 -4.1666666666666657e-03 4021 2130 -5.2083333333333330e-03 4021 2145 5.2083333333333339e-03 4021 1789 -1.4583333333333332e-02 4021 1255 -6.2499999999999986e-03 4021 2132 -2.1684043449710089e-19 4021 1793 -1.0416666666666671e-03 4021 1254 6.2499999999999995e-03 4021 1792 -6.5052130349130266e-19 4021 1791 -1.0416666666666669e-03 4022 4022 1.8749999999999996e-02 4023 4023 2.4999999999999994e-02 4023 4649 2.0833333333333329e-03 4023 4650 2.0833333333333329e-03 4023 4626 -4.1666666666666666e-03 4023 4016 -2.0833333333333333e-03 4023 4627 2.0833333333333329e-03 4023 4624 -4.1666666666666666e-03 4023 4655 -2.0833333333333329e-03 4023 4018 4.1666666666666657e-03 4023 4631 2.0833333333333329e-03 4023 4972 2.0833333333333329e-03 4023 4632 2.0833333333333329e-03 4023 4622 -4.1666666666666666e-03 4023 4024 -2.0833333333333333e-03 4024 4024 2.4999999999999998e-02 4024 4953 1.0416666666666664e-03 4024 4653 -1.0416666666666664e-03 4024 4952 6.2500000000000003e-03 4024 4020 -2.0833333333333329e-03 4024 4655 2.0833333333333337e-03 4024 4018 1.3552527156068805e-20 4024 4631 1.0416666666666664e-03 4024 4972 -2.0833333333333333e-03 4024 4632 1.0416666666666664e-03 4024 4622 6.2500000000000003e-03 4024 4023 -2.0833333333333329e-03 4025 4025 3.3333333333333326e-02 4026 4026 1.2499999999999999e-02 4027 4027 2.4999999999999994e-02 4027 4614 2.0833333333333329e-03 4027 4613 2.0833333333333329e-03 4027 4586 -4.1666666666666666e-03 4027 4041 -2.0833333333333333e-03 4027 4589 2.0833333333333329e-03 4027 4588 -4.1666666666666666e-03 4027 4649 2.0833333333333329e-03 4027 4596 2.0833333333333329e-03 4027 4648 2.0833333333333329e-03 4027 4591 2.0833333333333329e-03 4027 4590 -4.1666666666666666e-03 4027 4029 4.1666666666666657e-03 4027 4028 -2.0833333333333333e-03 4028 4028 2.5000000000000001e-02 4028 4630 1.0416666666666664e-03 4028 4596 1.0416666666666664e-03 4028 4649 -2.0833333333333337e-03 4028 4627 1.0416666666666664e-03 4028 4626 6.2500000000000003e-03 4028 4030 -2.0833333333333329e-03 4028 4648 -2.0833333333333337e-03 4028 4591 1.0416666666666664e-03 4028 4590 6.2500000000000003e-03 4028 4029 8.1315162936412833e-20 4028 4027 -2.0833333333333329e-03 4029 4029 3.3333333666666659e-02 4029 4742 -1.0416666666666666e-11 4029 4612 1.0416666666666666e-11 4029 4892 6.2499999999999991e-11 4029 4750 1.0416666666666666e-11 4029 4034 4.1666666666666665e-11 4029 4614 4.1666667083333324e-03 4029 4041 -1.4558380320789774e-20 4029 4586 -1.0416666666666667e-03 4029 4970 -4.1666667083333333e-03 4029 4618 -1.0416666666666667e-03 4029 4040 -7.4433021799253829e-20 4029 4630 6.2500000000000003e-03 4029 4626 -1.0416666666666667e-03 4029 4030 4.1666666666666666e-03 4029 4749 8.3333333333333330e-11 4029 4744 6.2499999999999991e-11 4029 4743 -1.0416666666666666e-11 4029 4033 9.5018296033870872e-28 4029 4032 4.1666666666666665e-11 4029 4648 8.3333333333333315e-03 4029 4591 6.2500000000000003e-03 4029 4590 -1.0416666666666667e-03 4029 4028 1.5502688168223823e-19 4029 4027 4.1666666666666666e-03 4030 4030 2.4999999999999994e-02 4030 4624 -4.1666666666666666e-03 4030 4758 -2.0833333333333329e-03 4030 4619 2.0833333333333329e-03 4030 4970 -2.0833333333333329e-03 4030 4618 -4.1666666666666666e-03 4030 4040 -2.0833333333333333e-03 4030 4648 2.0833333333333329e-03 4030 4029 4.1666666666666657e-03 4030 4630 2.0833333333333329e-03 4030 4649 2.0833333333333329e-03 4030 4627 2.0833333333333329e-03 4030 4626 -4.1666666666666666e-03 4030 4028 -2.0833333333333333e-03 4031 4031 3.3333333333333326e-02 4032 4032 2.5000000000000002e-10 4032 4970 -2.0833333333333329e-11 4032 4758 -2.0833333333333332e-11 4032 4742 -4.1666666666666665e-11 4032 4040 -2.0833333333333326e-11 4032 4735 2.0833333333333326e-11 4032 4734 -4.1666666666666665e-11 4032 4751 2.0833333333333332e-11 4032 4745 2.0833333333333326e-11 4032 4749 2.0833333333333332e-11 4032 4744 2.0833333333333326e-11 4032 4743 -4.1666666666666665e-11 4032 4029 4.1666666666666665e-11 4032 4033 -2.0833333333333326e-11 4033 4033 2.4999999999999996e-10 4033 4892 1.0416666666666665e-11 4033 4745 1.0416666666666665e-11 4033 4751 -2.0833333333333339e-11 4033 4752 -1.0416666666666663e-11 4033 4750 -6.2500000000000004e-11 4033 4034 -2.0833333333333326e-11 4033 4749 -2.0833333333333339e-11 4033 4744 1.0416666666666663e-11 4033 4743 6.2500000000000004e-11 4033 4029 1.6155871338926322e-27 4033 4032 -2.0833333333333326e-11 4034 4034 2.5000000000000002e-10 4034 4890 -4.1666666666666665e-11 4034 4613 2.0833333333333329e-11 4034 4657 -2.0833333333333326e-11 4034 4614 2.0833333333333332e-11 4034 4612 4.1666666666666665e-11 4034 4041 -2.0833333333333326e-11 4034 4749 2.0833333333333332e-11 4034 4029 4.1666666666666665e-11 4034 4892 2.0833333333333326e-11 4034 4751 2.0833333333333332e-11 4034 4752 -2.0833333333333326e-11 4034 4750 4.1666666666666665e-11 4034 4033 -2.0833333333333326e-11 4035 4035 3.3333333333333332e-10 4036 4036 1.2499999999999999e-02 4037 4037 1.6666666833333330e-02 4038 4038 1.2499999999999998e-10 4039 4039 1.6666666833333330e-02 4040 4040 1.2500000124999999e-02 4040 4744 1.0416666666666666e-11 4040 4735 1.0416666666666665e-11 4040 4742 6.2499999999999991e-11 4040 4032 -2.0833333333333326e-11 4040 4758 1.0416666770833331e-03 4040 4619 1.0416666666666664e-03 4040 4970 1.0416666770833340e-03 4040 4630 1.0416666666666664e-03 4040 4618 6.2500000000000003e-03 4040 4029 -1.0097419586828951e-27 4040 4030 -2.0833333333333329e-03 4041 4041 1.2500000125000001e-02 4041 4657 -1.0416666666666665e-11 4041 4892 1.0416666666666666e-11 4041 4612 -6.2499999999999991e-11 4041 4034 -2.0833333333333326e-11 4041 4614 -1.0416666770833333e-03 4041 4029 1.3552525540481672e-20 4041 4591 1.0416666666666664e-03 4041 4613 -1.0416666770833335e-03 4041 4589 1.0416666666666664e-03 4041 4586 6.2500000000000003e-03 4041 4027 -2.0833333333333329e-03 4042 4042 1.2500000000000001e-02 4043 4043 1.2499999999999998e-10 4044 4044 2.5000000000000002e-10 4044 4694 -2.0833333333333332e-11 4044 4666 2.0833333333333326e-11 4044 4665 -4.1666666666666665e-11 4044 4995 2.0833333333333332e-11 4044 4662 2.0833333333333326e-11 4044 4661 -4.1666666666666665e-11 4044 4047 -2.0833333333333326e-11 4044 4660 2.0833333333333326e-11 4044 4659 -4.1666666666666665e-11 4045 4045 1.2499999999999998e-10 4046 4046 1.6666666833333330e-02 4047 4047 2.5000000124999998e-02 4047 4793 4.1666666666666666e-03 4047 4789 1.2500000000000001e-02 4047 4787 3.1249999999999997e-03 4047 4056 -1.0416666666666660e-03 4047 4695 -1.0416666666666664e-03 4047 4996 -4.1666666666666675e-03 4047 4055 2.0833333333333337e-03 4047 4694 1.0416666770833340e-03 4047 4660 1.0416666666666665e-11 4047 4995 1.0416666562499998e-03 4047 4662 1.0416666666666663e-11 4047 4661 6.2500000000000004e-11 4047 4044 -2.0833333333333326e-11 4048 4048 2.9166666833333327e-02 4049 4049 1.2499999999999998e-10 4050 4050 1.6666666666666666e-10 4051 4051 1.6666666666666663e-02 4051 5073 1.0416666666666664e-03 4051 5075 1.0416666666666667e-03 4051 4562 -2.0833333333333346e-03 4051 4055 -6.2499999999999986e-03 4051 4555 1.0416666666666660e-03 4051 4564 6.2499999999999986e-03 4051 4563 1.0416666666666662e-03 4052 4052 2.4999999999999994e-02 4053 4053 2.9166666666666660e-02 4054 4054 3.7499999999999992e-02 4055 4055 4.9999999999999989e-02 4055 4788 4.1666666666666657e-03 4055 4789 4.1666666666666657e-03 4055 4787 1.6666666666666663e-02 4055 4056 -6.2499999999999986e-03 4055 4694 -2.0833333333333329e-03 4055 4996 4.1666666666666675e-03 4055 4047 2.0833333333333329e-03 4055 4695 -2.0833333333333329e-03 4055 4563 4.1666666666666657e-03 4055 5073 -4.1666666666666657e-03 4055 4555 4.1666666666666657e-03 4055 5075 -4.1666666666666666e-03 4055 4562 1.6666666666666666e-02 4055 4051 -6.2499999999999986e-03 4056 4056 1.6666666666666663e-02 4056 4995 1.0416666666666667e-03 4056 4793 6.2499999999999986e-03 4056 4788 1.0416666666666660e-03 4056 5075 1.0416666666666664e-03 4056 4789 1.0416666666666660e-03 4056 4996 -1.0416666666666667e-03 4056 4787 -2.0833333333333342e-03 4056 4047 -1.0416666666666662e-03 4056 4055 -6.2499999999999986e-03 4057 4057 2.5000000000000002e-10 4057 4690 -2.0833333333333332e-11 4057 4776 -2.0833333333333329e-11 4057 4777 -2.0833333333333332e-11 4057 4675 2.0833333333333326e-11 4057 4669 -4.1666666666666665e-11 4057 4063 4.1666666666666665e-11 4057 4069 -2.0833333333333326e-11 4057 4681 2.0833333333333329e-11 4057 4991 -2.0833333333333332e-11 4057 4673 2.0833333333333326e-11 4057 4667 -4.1666666666666665e-11 4057 4065 -2.0833333333333326e-11 4057 4680 2.0833333333333332e-11 4057 4671 2.0833333333333326e-11 4057 4663 -4.1666666666666665e-11 4057 4059 4.1666666666666665e-11 4057 4058 -2.0833333333333326e-11 4057 3022 4.1666666666666665e-11 4058 4058 2.4999999999999996e-10 4058 4687 -1.0416666666666666e-11 4058 4673 1.0416666666666665e-11 4058 4681 -2.0833333333333339e-11 4058 4983 1.0416666666666665e-11 4058 4678 -6.2499999999999991e-11 4058 4064 -2.0833333333333326e-11 4058 4680 -2.0833333333333339e-11 4058 4671 1.0416666666666666e-11 4058 4663 6.2500000000000004e-11 4058 4059 -2.6253290925755273e-27 4058 4057 -2.0833333333333326e-11 4058 3022 1.6155871338926322e-27 4059 4059 6.6666666666666674e-10 4059 4707 1.0416666666666666e-11 4059 4669 -1.0416666666666666e-11 4059 4690 -8.3333333333333330e-11 4059 4689 -6.2499999999999991e-11 4059 5013 1.0416666666666666e-11 4059 4069 -3.0991386737738975e-27 4059 4070 4.1666666666666665e-11 4059 4678 1.0416666666666666e-11 4059 4699 -1.0416666666666666e-11 4059 4688 -8.3333333333333330e-11 4059 4687 -6.2499999999999991e-11 4059 4985 -1.0416666666666666e-11 4059 4066 -3.0991386737738975e-27 4059 4064 4.1666666666666665e-11 4059 4686 -8.3333333333333330e-11 4059 4685 -6.2499999999999991e-11 4059 4701 -1.0416666666666666e-11 4059 4061 -3.0991386737738975e-27 4059 4060 4.1666666666666665e-11 4059 4680 8.3333333333333330e-11 4059 4671 6.2499999999999991e-11 4059 4663 -1.0416666666666666e-11 4059 4058 -3.0991386737738975e-27 4059 4057 4.1666666666666665e-11 4060 4060 2.4999999999999996e-10 4060 4706 2.0833333333333326e-11 4060 4071 4.1666666666666665e-11 4060 4699 -4.1666666666666665e-11 4060 4068 4.1666666666666665e-11 4060 4066 -2.0833333333333326e-11 4060 4710 2.0833333333333329e-11 4060 4688 -2.0833333333333332e-11 4060 4686 -2.0833333333333332e-11 4060 4685 -2.0833333333333326e-11 4060 4701 -4.1666666666666665e-11 4060 4059 4.1666666666666665e-11 4060 4061 -2.0833333333333326e-11 4060 2321 2.0833333333333332e-11 4060 1992 -2.0833333333333329e-11 4060 1523 -2.0833333333333326e-11 4060 1979 -4.1666666666666665e-11 4060 1986 2.0833333333333332e-11 4060 1982 2.0833333333333326e-11 4061 4061 2.4999999999999996e-10 4061 4706 1.0416666666666665e-11 4061 4710 -2.0833333333333339e-11 4061 5027 1.0416666666666665e-11 4061 4071 1.6155871338926322e-27 4061 4689 -1.0416666666666666e-11 4061 4707 -6.2499999999999991e-11 4061 4070 -2.0833333333333326e-11 4061 4686 2.0833333333333339e-11 4061 4685 -1.0416666666666666e-11 4061 4701 6.2500000000000004e-11 4061 4059 -2.6253290925755273e-27 4061 4060 -2.0833333333333326e-11 4062 4062 2.2916666666666665e-10 4062 4774 7.2691577219103583e-29 4062 4779 2.0194839173657902e-27 4062 4772 -1.0416666666666671e-11 4062 4072 1.0416666666666669e-11 4062 4770 -1.0416666666666668e-11 4062 4063 1.6155871338926322e-27 4062 4766 1.0416666666666665e-11 4062 4771 -4.8467614016778965e-27 4062 4760 6.2500000000000004e-11 4062 3704 1.0416666666666663e-11 4062 441 -1.0416666666666671e-11 4062 3021 -2.0833333333333326e-11 4063 4063 6.0416666666666670e-10 4063 5024 -1.0416666666666665e-11 4063 4779 -9.3750000000000012e-11 4063 4772 3.6295685768920020e-28 4063 4072 1.0034310714411270e-27 4063 4667 -1.0416666666666666e-11 4063 4778 -6.2499999999999991e-11 4063 5013 1.0416666666666666e-11 4063 4070 4.1666666666666665e-11 4063 4777 -8.3333333333333330e-11 4063 4675 6.2499999999999991e-11 4063 4669 -1.0416666666666666e-11 4063 4069 9.5018296033870872e-28 4063 4057 4.1666666666666665e-11 4063 4776 -8.3333333333333330e-11 4063 4761 -1.0416666666666666e-11 4063 4065 -3.0991386737738975e-27 4063 4770 9.3750000000000012e-11 4063 4062 9.5018296033870872e-28 4063 4766 6.2499999999999991e-11 4063 4760 -1.0416666666666666e-11 4063 3021 4.1666666666666665e-11 4064 4064 2.5000000000000002e-10 4064 4068 4.1666666666666665e-11 4064 4066 -2.0833333333333326e-11 4064 4987 2.0833333333333326e-11 4064 4985 -4.1666666666666665e-11 4064 5007 2.0833333333333332e-11 4064 4992 -2.0833333333333329e-11 4064 4067 -2.0833333333333326e-11 4064 4981 -4.1666666666666665e-11 4064 4680 2.0833333333333332e-11 4064 4688 -2.0833333333333332e-11 4064 4687 -2.0833333333333326e-11 4064 4059 4.1666666666666665e-11 4064 4681 2.0833333333333332e-11 4064 4983 2.0833333333333326e-11 4064 4678 4.1666666666666665e-11 4064 4058 -2.0833333333333326e-11 4064 1986 2.0833333333333332e-11 4064 3022 4.1666666666666665e-11 4065 4065 2.4999999999999996e-10 4065 4675 1.0416666666666666e-11 4065 4776 2.0833333333333339e-11 4065 4766 1.0416666666666666e-11 4065 4063 -2.6253290925755273e-27 4065 4767 1.0416666666666665e-11 4065 4761 6.2499999999999991e-11 4065 4991 2.0833333333333332e-11 4065 4673 1.0416666666666665e-11 4065 4667 6.2499999999999991e-11 4065 4057 -2.0833333333333326e-11 4065 3021 -2.0833333333333326e-11 4065 3022 1.6155871338926322e-27 4066 4066 2.4999999999999996e-10 4066 4987 1.0416666666666665e-11 4066 4985 6.2500000000000004e-11 4066 4064 -2.0833333333333326e-11 4066 4699 6.2500000000000004e-11 4066 4068 1.6155871338926322e-27 4066 4060 -2.0833333333333326e-11 4066 4685 -1.0416666666666665e-11 4066 4688 2.0833333333333339e-11 4066 4687 -1.0416666666666663e-11 4066 4059 -2.6253290925755273e-27 4066 1986 -2.0833333333333339e-11 4066 1982 1.0416666666666663e-11 4067 4067 2.4999999999999996e-10 4067 5005 1.0416666666666666e-11 4067 5007 -2.0833333333333339e-11 4067 4987 1.0416666666666666e-11 4067 4068 -2.6253290925755273e-27 4067 4983 1.0416666666666665e-11 4067 4981 6.2499999999999991e-11 4067 4064 -2.0833333333333326e-11 4067 4992 2.0833333333333332e-11 4067 5002 6.2499999999999991e-11 4067 3700 1.0416666666666665e-11 4067 3022 1.6155871338926322e-27 4067 442 -2.0833333333333326e-11 4068 4068 6.6666666666666664e-10 4068 5005 6.2499999999999991e-11 4068 4987 6.2499999999999991e-11 4068 4985 -1.0416666666666666e-11 4068 4064 4.1666666666666665e-11 4068 4699 -1.0416666666666666e-11 4068 4066 9.5018296033870872e-28 4068 4060 4.1666666666666665e-11 4068 5002 -1.0416666666666666e-11 4068 5007 8.3333333333333330e-11 4068 4981 -1.0416666666666666e-11 4068 4067 -3.0991386737738975e-27 4068 1993 8.3333333333333330e-11 4068 816 1.0416666666666666e-11 4068 1524 9.5018296033870872e-28 4068 442 4.1666666666666665e-11 4068 2315 -1.0416666666666666e-11 4068 1979 -1.0416666666666666e-11 4068 1992 -8.3333333333333330e-11 4068 1991 -6.2499999999999991e-11 4068 2316 -1.0416666666666666e-11 4068 1523 -3.0991386737738975e-27 4068 1522 4.1666666666666665e-11 4068 1986 8.3333333333333330e-11 4068 1982 6.2499999999999991e-11 4069 4069 2.4999999999999996e-10 4069 4671 1.0416666666666665e-11 4069 4690 2.0833333333333339e-11 4069 4689 -1.0416666666666663e-11 4069 4059 -2.6253290925755273e-27 4069 4778 -1.0416666666666665e-11 4069 5013 -6.2500000000000004e-11 4069 4070 -2.0833333333333326e-11 4069 4777 2.0833333333333339e-11 4069 4675 1.0416666666666663e-11 4069 4669 6.2500000000000004e-11 4069 4063 1.6155871338926322e-27 4069 4057 -2.0833333333333326e-11 4070 4070 2.5000000000000002e-10 4070 4779 -2.0833333333333329e-11 4070 5041 2.0833333333333332e-11 4070 5024 -4.1666666666666665e-11 4070 4072 -2.0833333333333326e-11 4070 4710 2.0833333333333332e-11 4070 5027 2.0833333333333323e-11 4070 4071 4.1666666666666665e-11 4070 4686 -2.0833333333333332e-11 4070 4061 -2.0833333333333326e-11 4070 4707 4.1666666666666665e-11 4070 4690 -2.0833333333333332e-11 4070 4689 -2.0833333333333326e-11 4070 4059 4.1666666666666665e-11 4070 4777 -2.0833333333333332e-11 4070 4063 4.1666666666666665e-11 4070 4069 -2.0833333333333326e-11 4070 4778 -2.0833333333333329e-11 4070 5013 4.1666666666666665e-11 4071 4071 6.0416666666666660e-10 4071 5059 9.3749999999999999e-11 4071 4073 9.5018296033870872e-28 4071 4706 6.2499999999999991e-11 4071 4060 4.1666666666666665e-11 4071 5040 -2.2851328271989659e-27 4071 5041 9.3749999999999999e-11 4071 5024 -1.0416666666666666e-11 4071 4072 5.6797985175912850e-27 4071 4701 -1.0416666666666666e-11 4071 4710 8.3333333333333330e-11 4071 5027 6.2499999999999991e-11 4071 4707 1.0416666666666666e-11 4071 4061 9.5018296033870872e-28 4071 4070 4.1666666666666665e-11 4071 2319 6.2499999999999991e-11 4071 813 -1.0416666666666666e-11 4071 1522 4.1666666666666665e-11 4071 2316 -1.0416666666666666e-11 4071 2321 8.3333333333333330e-11 4071 1979 -1.0416666666666666e-11 4071 1523 9.5018296033870872e-28 4072 4072 3.7499999999999995e-10 4072 4778 -1.0416666666666666e-11 4072 4771 5.2083333333333334e-11 4072 4770 -2.0194839173657902e-27 4072 4779 1.0416666666666669e-11 4072 4772 6.2500000000000004e-11 4072 4063 1.6155871338926322e-27 4072 4062 1.0416666666666669e-11 4072 5059 2.0194839173657902e-27 4072 4775 5.2083333333333334e-11 4072 4774 -6.2499999999999991e-11 4072 5040 -6.2500000000000004e-11 4072 4073 1.0416666666666663e-11 4072 5027 1.0416666666666665e-11 4072 5041 -1.0416666666666668e-11 4072 5024 6.2499999999999991e-11 4072 4071 6.4623485355705287e-27 4072 4070 -2.0833333333333326e-11 4072 441 1.4583333333333335e-10 4073 4073 2.2916666666666665e-10 4073 4775 -3.2311742677852644e-27 4073 5059 -1.0416666666666671e-11 4073 4071 1.6155871338926322e-27 4073 5041 -2.2470898404921788e-28 4073 4774 2.0194839173657902e-27 4073 5040 1.0416666666666673e-11 4073 4072 1.0416666666666663e-11 4073 441 -1.0416666666666671e-11 4073 814 1.0416666666666666e-11 4073 2319 1.0416666666666665e-11 4073 813 6.2499999999999991e-11 4073 1522 -2.0833333333333326e-11 4074 4074 2.5000000000000002e-10 4074 5015 2.0833333333333332e-11 4074 4690 -2.0833333333333332e-11 4074 4669 -4.1666666666666665e-11 4074 4088 -2.0833333333333326e-11 4074 4670 2.0833333333333326e-11 4074 4659 -4.1666666666666665e-11 4074 4680 2.0833333333333332e-11 4074 4077 4.1666666666666665e-11 4074 4671 2.0833333333333326e-11 4074 4679 2.0833333333333332e-11 4074 4672 2.0833333333333326e-11 4074 4663 -4.1666666666666665e-11 4074 4075 -2.0833333333333326e-11 4075 4075 2.4999999999999996e-10 4075 4682 -1.0416666666666665e-11 4075 4687 -1.0416666666666666e-11 4075 4678 -6.2500000000000004e-11 4075 4083 -2.0833333333333326e-11 4075 4680 -2.0833333333333339e-11 4075 4077 -2.6253290925755273e-27 4075 4671 1.0416666666666666e-11 4075 4679 -2.0833333333333339e-11 4075 4672 1.0416666666666665e-11 4075 4663 6.2499999999999991e-11 4075 4074 -2.0833333333333326e-11 4076 4076 3.3333333333333332e-10 4077 4077 6.6666666666666674e-10 4077 4707 1.0416666666666666e-11 4077 4669 -1.0416666666666666e-11 4077 4690 -8.3333333333333330e-11 4077 4088 -3.0991386737738975e-27 4077 4689 -6.2499999999999991e-11 4077 5013 1.0416666666666666e-11 4077 4087 4.1666666666666665e-11 4077 4678 1.0416666666666666e-11 4077 4699 -1.0416666666666666e-11 4077 4688 -8.3333333333333330e-11 4077 4084 -3.0991386737738975e-27 4077 4687 -6.2499999999999991e-11 4077 4985 -1.0416666666666666e-11 4077 4083 4.1666666666666665e-11 4077 4686 -8.3333333333333330e-11 4077 4080 -3.0991386737738975e-27 4077 4685 -6.2499999999999991e-11 4077 4701 -1.0416666666666666e-11 4077 4079 4.1666666666666665e-11 4077 4680 8.3333333333333330e-11 4077 4075 -3.0991386737738975e-27 4077 4671 6.2499999999999991e-11 4077 4663 -1.0416666666666666e-11 4077 4074 4.1666666666666665e-11 4078 4078 1.2499999999999998e-10 4079 4079 2.5000000000000002e-10 4079 4999 2.0833333333333332e-11 4079 4688 -2.0833333333333332e-11 4079 4699 -4.1666666666666665e-11 4079 4084 -2.0833333333333326e-11 4079 4700 2.0833333333333326e-11 4079 4697 -4.1666666666666665e-11 4079 4686 -2.0833333333333332e-11 4079 4077 4.1666666666666665e-11 4079 4685 -2.0833333333333326e-11 4079 4708 2.0833333333333332e-11 4079 4703 2.0833333333333326e-11 4079 4701 -4.1666666666666665e-11 4079 4080 -2.0833333333333326e-11 4080 4080 2.4999999999999996e-10 4080 4711 -1.0416666666666665e-11 4080 4689 -1.0416666666666666e-11 4080 4707 -6.2500000000000004e-11 4080 4087 -2.0833333333333326e-11 4080 4686 2.0833333333333339e-11 4080 4077 -2.6253290925755273e-27 4080 4685 -1.0416666666666666e-11 4080 4708 -2.0833333333333339e-11 4080 4703 1.0416666666666665e-11 4080 4701 6.2499999999999991e-11 4080 4079 -2.0833333333333326e-11 4081 4081 3.3333333333333332e-10 4082 4082 1.2499999999999998e-10 4083 4083 2.5000000000000002e-10 4083 4679 2.0833333333333329e-11 4083 4680 2.0833333333333332e-11 4083 4678 4.1666666666666665e-11 4083 4075 -2.0833333333333326e-11 4083 4682 -2.0833333333333326e-11 4083 4979 -4.1666666666666665e-11 4083 4688 -2.0833333333333332e-11 4083 4077 4.1666666666666665e-11 4083 4687 -2.0833333333333326e-11 4083 4999 2.0833333333333332e-11 4083 4986 2.0833333333333326e-11 4083 4985 -4.1666666666666665e-11 4083 4084 -2.0833333333333326e-11 4084 4084 2.4999999999999996e-10 4084 4700 1.0416666666666665e-11 4084 4685 -1.0416666666666663e-11 4084 4699 6.2500000000000004e-11 4084 4079 -2.0833333333333326e-11 4084 4688 2.0833333333333339e-11 4084 4077 -2.6253290925755273e-27 4084 4687 -1.0416666666666665e-11 4084 4999 -2.0833333333333339e-11 4084 4986 1.0416666666666663e-11 4084 4985 6.2500000000000004e-11 4084 4083 -2.0833333333333326e-11 4085 4085 3.3333333333333332e-10 4086 4086 1.2499999999999998e-10 4087 4087 2.5000000000000002e-10 4087 4708 2.0833333333333329e-11 4087 4686 -2.0833333333333332e-11 4087 4707 4.1666666666666665e-11 4087 4080 -2.0833333333333326e-11 4087 4711 -2.0833333333333326e-11 4087 5020 -4.1666666666666665e-11 4087 4690 -2.0833333333333332e-11 4087 4077 4.1666666666666665e-11 4087 4689 -2.0833333333333326e-11 4087 5015 2.0833333333333332e-11 4087 5026 2.0833333333333326e-11 4087 5013 4.1666666666666665e-11 4087 4088 -2.0833333333333326e-11 4088 4088 2.4999999999999996e-10 4088 4670 1.0416666666666665e-11 4088 4671 1.0416666666666663e-11 4088 4669 6.2500000000000004e-11 4088 4074 -2.0833333333333326e-11 4088 4690 2.0833333333333339e-11 4088 4077 -2.6253290925755273e-27 4088 4689 -1.0416666666666665e-11 4088 5015 -2.0833333333333339e-11 4088 5026 1.0416666666666663e-11 4088 5013 -6.2500000000000004e-11 4088 4087 -2.0833333333333326e-11 4089 4089 3.3333333333333332e-10 4090 4090 1.2499999999999998e-10 4091 4091 2.5000000000000002e-10 4091 4990 -2.0833333333333332e-11 4091 4694 -2.0833333333333332e-11 4091 4661 -4.1666666666666665e-11 4091 4102 -2.0833333333333326e-11 4091 4660 2.0833333333333326e-11 4091 4659 -4.1666666666666665e-11 4091 4679 2.0833333333333329e-11 4091 4672 2.0833333333333326e-11 4091 4677 2.0833333333333332e-11 4091 4664 2.0833333333333326e-11 4091 4663 -4.1666666666666665e-11 4091 4093 4.1666666666666665e-11 4091 4092 -2.0833333333333326e-11 4092 4092 2.4999999999999996e-10 4092 4984 1.0416666666666666e-11 4092 4672 1.0416666666666665e-11 4092 4679 -2.0833333333333339e-11 4092 4682 -1.0416666666666665e-11 4092 4678 -6.2499999999999991e-11 4092 4094 -2.0833333333333326e-11 4092 4677 -2.0833333333333339e-11 4092 4664 1.0416666666666666e-11 4092 4663 6.2500000000000004e-11 4092 4093 -2.6253290925755273e-27 4092 4091 -2.0833333333333326e-11 4093 4093 2.7083333666666660e-02 4093 4912 -2.1705219273391446e-19 4093 4996 1.0416666666666667e-03 4093 4990 -4.1666667083333333e-03 4093 4102 -7.4433021799253829e-20 4093 4661 -1.0416666666666666e-11 4093 4917 5.2083333749999997e-03 4093 4914 1.0416666666666666e-11 4093 4100 -1.4558380320789774e-20 4093 4984 6.2499999999999991e-11 4093 4678 1.0416666666666666e-11 4093 4094 4.1666666666666665e-11 4093 4989 -6.2499999999999995e-03 4093 4911 9.3750000000000014e-03 4093 4910 1.0416666666666667e-03 4093 4097 4.1666666666666666e-03 4093 4096 1.0116749763768550e-19 4093 4677 8.3333333333333330e-11 4093 4664 6.2499999999999991e-11 4093 4663 -1.0416666666666666e-11 4093 4092 -3.0991386737738975e-27 4093 4091 4.1666666666666665e-11 4094 4094 2.5000000000000002e-10 4094 4979 -4.1666666666666665e-11 4094 4915 2.0833333333333332e-11 4094 4978 2.0833333333333326e-11 4094 4917 2.0833333333333332e-11 4094 4914 4.1666666666666665e-11 4094 4100 -2.0833333333333326e-11 4094 4677 2.0833333333333332e-11 4094 4093 4.1666666666666665e-11 4094 4984 2.0833333333333326e-11 4094 4679 2.0833333333333332e-11 4094 4682 -2.0833333333333326e-11 4094 4678 4.1666666666666665e-11 4094 4092 -2.0833333333333326e-11 4095 4095 3.3333333333333332e-10 4096 4096 3.7499999999999992e-02 4096 4917 2.1684043449710089e-19 4096 4915 5.2083333333333322e-03 4096 4912 -6.2499999999999986e-03 4096 4100 1.0416666666666667e-03 4096 4909 6.2499999999999986e-03 4096 4908 -6.2500000000000003e-03 4096 5074 1.0416666666666667e-03 4096 4913 -1.0416666666666667e-03 4096 4989 -1.0416666666666664e-03 4096 4911 -1.0416666666666673e-03 4096 4910 -6.2499999999999995e-03 4096 4093 2.1684043449710089e-19 4096 4097 -2.0833333333333333e-03 4097 4097 2.4999999999999994e-02 4097 4694 -2.0833333333333329e-03 4097 4990 -2.0833333333333329e-03 4097 4996 4.1666666666666666e-03 4097 4102 -2.0833333333333333e-03 4097 4695 -2.0833333333333329e-03 4097 5073 -4.1666666666666666e-03 4097 5074 2.0833333333333329e-03 4097 4913 2.0833333333333329e-03 4097 4989 -2.0833333333333329e-03 4097 4911 2.0833333333333329e-03 4097 4910 4.1666666666666675e-03 4097 4093 4.1666666666666657e-03 4097 4096 -2.0833333333333329e-03 4098 4098 1.2499999999999998e-10 4099 4099 1.6666666833333330e-02 4100 4100 1.0416666791666664e-02 4100 4911 3.2249014814734037e-20 4100 4909 -2.1684043449710089e-19 4100 4912 1.0416666666666673e-03 4100 4096 1.0416666666666664e-03 4100 4915 1.0416666562499993e-03 4100 4978 1.0416666666666665e-11 4100 4917 -1.0416666747981836e-11 4100 4984 1.0416666666666663e-11 4100 4914 -6.2500000000000004e-11 4100 4093 1.3552525540481672e-20 4100 4094 -2.0833333333333326e-11 4101 4101 2.9166666833333327e-02 4102 4102 1.2500000125000001e-02 4102 4695 -1.0416666666666664e-03 4102 4989 -1.0416666666666664e-03 4102 4996 -6.2500000000000003e-03 4102 4097 -2.0833333333333329e-03 4102 4990 1.0416666770833340e-03 4102 4093 -1.0097419586828951e-27 4102 4664 1.0416666666666665e-11 4102 4694 1.0416666770833331e-03 4102 4660 1.0416666666666663e-11 4102 4661 6.2500000000000004e-11 4102 4091 -2.0833333333333326e-11 4103 4103 1.2499999999999998e-10 4104 4104 2.7083333333333327e-02 4105 4105 1.0416666666666664e-02 4106 4106 1.2499999999999999e-02 4107 4107 2.4999999999999996e-10 4107 4705 -4.1666666666666665e-11 4107 4704 2.0833333333333326e-11 4107 4698 2.0833333333333326e-11 4107 4697 -4.1666666666666665e-11 4107 1997 2.0833333333333332e-11 4107 1981 2.0833333333333326e-11 4107 1994 2.0833333333333332e-11 4107 1978 -4.1666666666666665e-11 4107 1515 -2.0833333333333326e-11 4108 4108 1.2499999999999998e-10 4109 4109 1.6666666666666666e-10 4110 4110 4.5833333333333330e-10 4111 4111 1.2499999999999998e-10 4112 4112 2.5000000000000002e-10 4112 5022 -4.1666666666666665e-11 4112 4709 2.0833333333333332e-11 4112 5028 2.0833333333333326e-11 4112 5023 2.0833333333333326e-11 4112 5020 -4.1666666666666665e-11 4112 4708 2.0833333333333332e-11 4112 4711 -2.0833333333333326e-11 4112 4707 4.1666666666666665e-11 4112 4113 -2.0833333333333326e-11 4113 4113 2.4999999999999996e-10 4113 5028 1.0416666666666666e-11 4113 4703 1.0416666666666665e-11 4113 4709 -2.0833333333333339e-11 4113 4702 1.0416666666666666e-11 4113 4701 6.2500000000000004e-11 4113 4115 -2.0833333333333326e-11 4113 4708 -2.0833333333333339e-11 4113 4711 -1.0416666666666665e-11 4113 4707 -6.2499999999999991e-11 4113 4112 -2.0833333333333326e-11 4114 4114 3.3333333333333332e-10 4115 4115 2.5000000000000002e-10 4115 4705 -4.1666666666666665e-11 4115 4698 2.0833333333333326e-11 4115 4697 -4.1666666666666665e-11 4115 4708 2.0833333333333329e-11 4115 4703 2.0833333333333326e-11 4115 4709 2.0833333333333332e-11 4115 4702 2.0833333333333326e-11 4115 4701 -4.1666666666666665e-11 4115 4113 -2.0833333333333326e-11 4116 4116 3.3333333333333332e-10 4117 4117 1.2499999999999998e-10 4118 4118 1.6666666666666666e-10 4119 4119 1.2499999999999998e-10 4120 4120 1.6666666666666666e-10 4121 4121 1.2499999999999998e-10 4122 4122 1.2499999999999998e-10 4123 4123 2.5000000000000002e-10 4123 5069 2.0833333333333329e-11 4123 4730 -2.0833333333333332e-11 4123 4475 -4.1666666666666665e-11 4123 4137 -2.0833333333333326e-11 4123 4476 2.0833333333333326e-11 4123 4471 -4.1666666666666665e-11 4123 4721 2.0833333333333332e-11 4123 4126 4.1666666666666665e-11 4123 4479 2.0833333333333326e-11 4123 4720 2.0833333333333332e-11 4123 4480 2.0833333333333326e-11 4123 4473 -4.1666666666666665e-11 4123 4124 -2.0833333333333326e-11 4124 4124 2.4999999999999996e-10 4124 4722 -1.0416666666666665e-11 4124 4727 -1.0416666666666663e-11 4124 4719 -6.2500000000000004e-11 4124 4132 -2.0833333333333326e-11 4124 4721 -2.0833333333333339e-11 4124 4126 1.6155871338926322e-27 4124 4479 1.0416666666666665e-11 4124 4720 -2.0833333333333339e-11 4124 4480 1.0416666666666663e-11 4124 4473 6.2500000000000004e-11 4124 4123 -2.0833333333333326e-11 4125 4125 3.3333333333333332e-10 4126 4126 6.6666666666666674e-10 4126 4750 1.0416666666666666e-11 4126 4475 -1.0416666666666666e-11 4126 4730 -8.3333333333333330e-11 4126 4137 -3.0991386737738975e-27 4126 4729 -6.2499999999999991e-11 4126 4893 -1.0416666666666666e-11 4126 4136 4.1666666666666665e-11 4126 4719 1.0416666666666666e-11 4126 4740 -1.0416666666666666e-11 4126 4728 -8.3333333333333330e-11 4126 4133 -3.0991386737738975e-27 4126 4727 -6.2499999999999991e-11 4126 4805 -1.0416666666666666e-11 4126 4132 4.1666666666666665e-11 4126 4726 -8.3333333333333330e-11 4126 4129 9.5018296033870872e-28 4126 4725 -6.2499999999999991e-11 4126 4743 -1.0416666666666666e-11 4126 4128 4.1666666666666665e-11 4126 4721 8.3333333333333330e-11 4126 4124 9.5018296033870872e-28 4126 4479 6.2499999999999991e-11 4126 4473 -1.0416666666666666e-11 4126 4123 4.1666666666666665e-11 4127 4127 1.2499999999999998e-10 4128 4128 2.5000000000000002e-10 4128 5064 2.0833333333333329e-11 4128 4728 -2.0833333333333332e-11 4128 4740 -4.1666666666666665e-11 4128 4133 -2.0833333333333326e-11 4128 4741 2.0833333333333326e-11 4128 4734 -4.1666666666666665e-11 4128 4726 -2.0833333333333332e-11 4128 4126 4.1666666666666665e-11 4128 4725 -2.0833333333333326e-11 4128 4751 2.0833333333333332e-11 4128 4745 2.0833333333333326e-11 4128 4743 -4.1666666666666665e-11 4128 4129 -2.0833333333333326e-11 4129 4129 2.4999999999999996e-10 4129 4752 -1.0416666666666665e-11 4129 4729 -1.0416666666666663e-11 4129 4750 -6.2500000000000004e-11 4129 4136 -2.0833333333333326e-11 4129 4726 2.0833333333333339e-11 4129 4126 1.6155871338926322e-27 4129 4725 -1.0416666666666665e-11 4129 4751 -2.0833333333333339e-11 4129 4745 1.0416666666666663e-11 4129 4743 6.2500000000000004e-11 4129 4128 -2.0833333333333326e-11 4130 4130 3.3333333333333332e-10 4131 4131 1.2499999999999998e-10 4132 4132 2.5000000000000002e-10 4132 4720 2.0833333333333332e-11 4132 4721 2.0833333333333332e-11 4132 4719 4.1666666666666665e-11 4132 4124 -2.0833333333333326e-11 4132 4722 -2.0833333333333326e-11 4132 4807 -4.1666666666666665e-11 4132 4728 -2.0833333333333329e-11 4132 4126 4.1666666666666665e-11 4132 4727 -2.0833333333333326e-11 4132 5064 2.0833333333333332e-11 4132 4812 2.0833333333333326e-11 4132 4805 -4.1666666666666665e-11 4132 4133 -2.0833333333333326e-11 4133 4133 2.4999999999999996e-10 4133 4741 1.0416666666666665e-11 4133 4725 -1.0416666666666666e-11 4133 4740 6.2499999999999991e-11 4133 4128 -2.0833333333333326e-11 4133 4728 2.0833333333333339e-11 4133 4126 -2.6253290925755273e-27 4133 4727 -1.0416666666666666e-11 4133 5064 -2.0833333333333332e-11 4133 4812 1.0416666666666665e-11 4133 4805 6.2499999999999991e-11 4133 4132 -2.0833333333333326e-11 4134 4134 3.3333333333333332e-10 4135 4135 1.2499999999999998e-10 4136 4136 2.5000000000000002e-10 4136 4751 2.0833333333333332e-11 4136 4726 -2.0833333333333332e-11 4136 4750 4.1666666666666665e-11 4136 4129 -2.0833333333333326e-11 4136 4752 -2.0833333333333326e-11 4136 4890 -4.1666666666666665e-11 4136 4730 -2.0833333333333329e-11 4136 4126 4.1666666666666665e-11 4136 4729 -2.0833333333333326e-11 4136 5069 2.0833333333333332e-11 4136 4894 2.0833333333333326e-11 4136 4893 -4.1666666666666665e-11 4136 4137 -2.0833333333333326e-11 4137 4137 2.4999999999999996e-10 4137 4476 1.0416666666666665e-11 4137 4479 1.0416666666666666e-11 4137 4475 6.2499999999999991e-11 4137 4123 -2.0833333333333326e-11 4137 4730 2.0833333333333339e-11 4137 4126 -2.6253290925755273e-27 4137 4729 -1.0416666666666666e-11 4137 5069 -2.0833333333333332e-11 4137 4894 1.0416666666666665e-11 4137 4893 6.2499999999999991e-11 4137 4136 -2.0833333333333326e-11 4138 4138 3.3333333333333332e-10 4139 4139 1.2499999999999998e-10 4140 4140 2.5000000000000002e-10 4140 4469 -4.1666666666666665e-11 4140 4472 2.0833333333333326e-11 4140 4471 -4.1666666666666665e-11 4140 4720 2.0833333333333332e-11 4140 4480 2.0833333333333326e-11 4140 4718 2.0833333333333332e-11 4140 4474 2.0833333333333326e-11 4140 4473 -4.1666666666666665e-11 4140 4141 -2.0833333333333326e-11 4141 4141 2.4999999999999996e-10 4141 4811 1.0416666666666665e-11 4141 4480 1.0416666666666665e-11 4141 4720 -2.0833333333333339e-11 4141 4722 -1.0416666666666663e-11 4141 4719 -6.2500000000000004e-11 4141 4143 -2.0833333333333326e-11 4141 4718 -2.0833333333333339e-11 4141 4474 1.0416666666666663e-11 4141 4473 6.2500000000000004e-11 4141 4140 -2.0833333333333326e-11 4142 4142 3.3333333333333332e-10 4143 4143 2.5000000000000002e-10 4143 4807 -4.1666666666666665e-11 4143 4804 2.0833333333333326e-11 4143 4803 -4.1666666666666665e-11 4143 4718 2.0833333333333332e-11 4143 4811 2.0833333333333326e-11 4143 4720 2.0833333333333332e-11 4143 4722 -2.0833333333333326e-11 4143 4719 4.1666666666666665e-11 4143 4141 -2.0833333333333326e-11 4144 4144 3.3333333333333332e-10 4145 4145 1.2499999999999998e-10 4146 4146 1.6666666666666666e-10 4147 4147 1.2499999999999998e-10 4148 4148 1.6666666666666666e-10 4149 4149 1.2499999999999998e-10 4150 4150 1.2499999999999998e-10 4151 4151 2.9166666833333327e-02 4152 4152 1.6666666666666663e-02 4152 4786 -2.0833333333333342e-03 4152 4782 1.0416666666666660e-03 4152 4794 1.0416666666666664e-03 4152 4792 6.2499999999999986e-03 4152 4791 1.0416666666666660e-03 4152 3635 1.0416666666666664e-03 4152 3630 1.0416666666666667e-03 4152 2340 -6.2499999999999986e-03 4152 2348 -1.0416666666666667e-03 4153 4153 3.3333333333333332e-10 4153 5040 4.1666666666666665e-11 4153 4773 4.1666666666666671e-11 4153 4772 -4.1666666666666665e-11 4153 5038 1.6666666666666666e-10 4153 4155 -6.2500000000000004e-11 4153 5053 -2.8940292364521930e-29 4153 5047 -4.1666666666666665e-11 4153 5046 -4.1666666666666671e-11 4153 4154 -6.4623485355705287e-27 4153 3463 -3.1495832401145651e-28 4153 111 -6.2499999999999991e-11 4154 4154 4.9999999999999993e-10 4154 5053 -1.0416666666666669e-11 4154 4775 -6.4623485355705287e-27 4154 4774 -4.1666666666666665e-11 4154 5040 1.2500000000000001e-10 4154 5038 3.1250000000000002e-11 4154 4155 -1.0416666666666653e-11 4154 5047 5.2083333333333334e-11 4154 5046 8.3333333333333330e-11 4154 552 -5.2083333333333328e-11 4154 562 -2.0194839173657902e-27 4154 111 6.2500000000000004e-11 4154 814 1.0416666666666666e-11 4154 813 1.0416666666666667e-10 4154 115 5.2083333333333328e-11 4154 114 -4.1666666666666665e-11 4154 555 -2.0194839173657902e-27 4154 560 1.6155871338926322e-27 4154 554 1.0416666666666666e-11 4154 110 6.4623485355705287e-27 4154 109 6.2500000000000004e-11 4155 4155 1.6666666666666663e-10 4155 4771 1.0416666666666665e-11 4155 4775 1.0416666666666666e-11 4155 4774 -6.2499999999999991e-11 4155 5046 1.0416666666666665e-11 4155 4154 -1.0416666666666653e-11 4155 5040 1.0416666666666673e-11 4155 4773 -1.0416666666666666e-11 4155 4772 -1.0416666666666655e-11 4155 5038 -2.0833333333333339e-11 4155 4153 -6.2499999999999991e-11 4155 115 2.0833333333333339e-11 4155 2487 -1.0416666666666673e-11 4156 4156 2.0833333333333331e-10 4156 4773 4.1666666666666671e-11 4156 4772 1.8812360437258079e-27 4156 5042 2.0833333333333332e-11 4156 5038 4.1666666666666665e-11 4156 4168 -4.1666666666666665e-11 4156 5045 2.0833333333333323e-11 4156 5044 -4.1666666666666671e-11 4156 3707 -4.3283707583767993e-28 4156 3023 -6.2500000000000004e-11 4157 4157 2.7083333333333328e-10 4158 4158 2.2916666666666665e-10 4158 4776 -2.0833333333333329e-11 4158 4994 2.0833333333333332e-11 4158 4769 2.0833333333333326e-11 4158 4761 -4.1666666666666665e-11 4158 4160 -2.0833333333333326e-11 4158 4764 -4.1666666666666658e-11 4158 4770 2.0833333333333332e-11 4158 4766 2.0833333333333326e-11 4158 4760 -4.1666666666666665e-11 4158 4159 4.1666666666666665e-11 4158 3705 8.8938459461701536e-29 4158 3023 -4.1666666666666665e-11 4159 4159 6.0416666666666670e-10 4159 5024 -1.0416666666666666e-11 4159 4779 -9.3749999999999999e-11 4159 4772 2.2851328271989659e-27 4159 4168 1.0034310714411270e-27 4159 4667 -1.0416666666666666e-11 4159 4778 -6.2499999999999991e-11 4159 5013 1.0416666666666666e-11 4159 4166 4.1666666666666665e-11 4159 4777 -8.3333333333333330e-11 4159 4163 9.5018296033870872e-28 4159 4675 6.2499999999999991e-11 4159 4669 -1.0416666666666666e-11 4159 4162 4.1666666666666665e-11 4159 4776 -8.3333333333333330e-11 4159 4160 -3.0991386737738975e-27 4159 4761 -1.0416666666666666e-11 4159 4770 9.3749999999999999e-11 4159 4766 6.2499999999999991e-11 4159 4760 -1.0416666666666666e-11 4159 4158 4.1666666666666665e-11 4159 3023 9.5018296033870872e-28 4160 4160 2.4999999999999996e-10 4160 4668 1.0416666666666665e-11 4160 4675 1.0416666666666666e-11 4160 4667 6.2499999999999991e-11 4160 4162 -2.0833333333333326e-11 4160 4776 2.0833333333333339e-11 4160 4159 -2.6253290925755273e-27 4160 4766 1.0416666666666666e-11 4160 4994 -2.0833333333333332e-11 4160 4769 1.0416666666666665e-11 4160 4761 6.2499999999999991e-11 4160 4158 -2.0833333333333326e-11 4161 4161 3.3333333333333332e-10 4162 4162 2.5000000000000002e-10 4162 4994 2.0833333333333329e-11 4162 4776 -2.0833333333333332e-11 4162 4667 -4.1666666666666665e-11 4162 4160 -2.0833333333333326e-11 4162 4668 2.0833333333333326e-11 4162 4665 -4.1666666666666665e-11 4162 4777 -2.0833333333333332e-11 4162 4159 4.1666666666666665e-11 4162 4675 2.0833333333333326e-11 4162 5014 2.0833333333333332e-11 4162 4676 2.0833333333333326e-11 4162 4669 -4.1666666666666665e-11 4162 4163 -2.0833333333333326e-11 4163 4163 2.4999999999999996e-10 4163 5016 -1.0416666666666665e-11 4163 4778 -1.0416666666666663e-11 4163 5013 -6.2500000000000004e-11 4163 4166 -2.0833333333333326e-11 4163 4777 2.0833333333333339e-11 4163 4159 1.6155871338926322e-27 4163 4675 1.0416666666666665e-11 4163 5014 -2.0833333333333339e-11 4163 4676 1.0416666666666663e-11 4163 4669 6.2500000000000004e-11 4163 4162 -2.0833333333333326e-11 4164 4164 3.3333333333333332e-10 4165 4165 1.2499999999999998e-10 4166 4166 2.2916666666666665e-10 4166 5029 1.8812360437258079e-27 4166 4779 -2.0833333333333332e-11 4166 5024 -4.1666666666666665e-11 4166 4168 -4.1666666666666665e-11 4166 5014 2.0833333333333332e-11 4166 4777 -2.0833333333333332e-11 4166 4778 -2.0833333333333323e-11 4166 5013 4.1666666666666665e-11 4166 4159 4.1666666666666665e-11 4166 4163 -2.0833333333333326e-11 4166 5016 -2.0833333333333326e-11 4166 5025 -4.1666666666666665e-11 4167 4167 1.8749999999999997e-10 4168 4168 3.7499999999999995e-10 4168 5025 5.2083333333333334e-11 4168 4778 -1.0416666666666666e-11 4168 5024 1.0416666666666667e-10 4168 4166 -4.1666666666666665e-11 4168 4770 2.0194839173657902e-27 4168 4159 1.6155871338926322e-27 4168 4779 1.0416666666666673e-11 4168 5029 1.0416666666666661e-11 4168 4773 -5.2083333333333334e-11 4168 4772 1.0416666666666661e-11 4168 5045 1.0416666666666665e-11 4168 5042 -1.0416666666666668e-11 4168 5038 -1.0416666666666667e-10 4168 4156 -4.1666666666666665e-11 4168 3023 6.2500000000000004e-11 4169 4169 3.7499999999999992e-02 4169 4989 -1.0416666666666667e-03 4169 4787 -5.2083333333333322e-03 4169 4910 -1.0416666666666664e-02 4169 4184 -4.1666666666666657e-03 4169 4917 -2.1684043449710089e-19 4169 4911 -1.0416666666666671e-03 4169 4179 2.1684043449710089e-19 4169 4905 1.0416666666666667e-03 4169 4904 5.2083333333333330e-03 4169 4912 -1.0416666666666671e-03 4169 4900 1.0416666666666664e-02 4169 4174 6.2499999999999995e-03 4169 4173 -4.1666666666666657e-03 4169 4785 -2.1684043449710089e-19 4169 4907 -1.0416666666666667e-03 4169 4784 1.0416666666666673e-03 4169 4170 6.2499999999999995e-03 4169 2997 6.5052130349130266e-19 4170 4170 4.3749999999999990e-02 4170 4910 -5.2083333333333330e-03 4170 4996 -5.2083333333333339e-03 4170 4787 -1.4583333333333330e-02 4170 4184 -6.2499999999999986e-03 4170 4786 -1.0416666666666664e-02 4170 4795 2.1684043449710089e-19 4170 4791 -1.0416666666666669e-03 4170 4797 2.1684043449710089e-19 4170 4790 -6.5052130349130266e-19 4170 4789 -1.0416666666666671e-03 4170 4172 2.1684043449710089e-19 4170 4171 6.2499999999999986e-03 4170 4785 -1.0416666666666667e-03 4170 4907 -2.1684043449710089e-19 4170 4784 -1.0416666666666673e-03 4170 4169 6.2499999999999995e-03 4170 3636 1.0416666666666664e-03 4170 3635 5.2083333333333322e-03 4170 2999 -4.1666666666666657e-03 4170 3000 6.2500000000000003e-03 4170 2997 8.1315162936412833e-20 4171 4171 1.8750000124999999e-02 4171 4787 -5.2083333333333330e-03 4171 4989 -1.0416666666666664e-03 4171 4996 -1.0416666666666666e-02 4171 4184 -4.1666666666666657e-03 4171 4990 1.0416666770833331e-03 4171 4664 1.0416666666666663e-11 4171 4179 1.3552525540481672e-20 4171 4674 1.0416666666666665e-11 4171 4661 6.2500000000000004e-11 4171 4180 -2.0833333333333326e-11 4171 4797 1.0416666883507099e-11 4171 4790 -2.1684043449710089e-19 4171 4789 1.0416666666666669e-03 4171 4172 1.6155871338926322e-27 4171 4170 6.2499999999999986e-03 4172 4172 2.0833333666666662e-02 4172 4761 -1.0416666666666666e-11 4172 4762 6.2499999999999991e-11 4172 4763 -1.0416666666666666e-11 4172 4182 4.1666666666666665e-11 4172 4661 -1.0416666666666666e-11 4172 4796 -8.3333333333333330e-11 4172 4674 6.2499999999999991e-11 4172 4667 -1.0416666666666666e-11 4172 4181 -3.0991386737738975e-27 4172 4180 4.1666666666666665e-11 4172 4795 5.2083333749999997e-03 4172 4791 -2.1705219273391446e-19 4172 4797 -5.2083333750000006e-03 4172 4790 1.0416666666666668e-02 4172 4789 -5.0116116045879435e-20 4172 4171 7.0197856548546410e-20 4172 4170 1.0116749763768550e-19 4172 3000 8.4829026083874785e-20 4173 4173 2.2916666666666662e-02 4173 4916 2.0833333333333329e-03 4173 4899 2.0833333333333329e-03 4173 4898 2.0833333333333329e-03 4173 4906 2.0833333333333329e-03 4173 4897 4.1666666666666666e-03 4173 4176 4.1666666666666657e-03 4173 4175 -2.0833333333333333e-03 4173 4905 2.0833333333333329e-03 4173 4907 2.0833333333333329e-03 4173 4904 -4.1666666666666666e-03 4173 4912 2.8940292364521927e-21 4173 4900 -4.1666666666666675e-03 4173 4174 -4.1666666666666657e-03 4173 4169 -4.1666666666666657e-03 4173 2997 4.1666666666666657e-03 4174 4174 1.8750000124999999e-02 4174 4911 -2.1684043449710089e-19 4174 4940 -1.0416666666666663e-11 4174 4917 -1.0416667317187968e-11 4174 4179 -1.0097419586828951e-27 4174 4984 1.0416666666666665e-11 4174 4914 -6.2500000000000004e-11 4174 4177 -2.0833333333333326e-11 4174 4916 -1.0416666770833331e-03 4174 4176 8.1315162936412833e-20 4174 4906 1.0416666666666664e-03 4174 4904 1.0416666666666666e-02 4174 4912 1.0416666666666671e-03 4174 4900 5.2083333333333330e-03 4174 4173 -4.1666666666666657e-03 4174 4169 6.2499999999999995e-03 4175 4175 2.5000000000000001e-02 4175 4896 1.0416666666666664e-03 4175 4895 6.2500000000000003e-03 4175 4899 -2.0833333333333333e-03 4175 4905 1.0416666666666664e-03 4175 4898 -2.0833333333333337e-03 4175 4906 1.0416666666666664e-03 4175 4897 -6.2500000000000003e-03 4175 4176 1.3552527156068805e-20 4175 4173 -2.0833333333333329e-03 4175 3626 1.0416666666666664e-03 4175 2994 -2.0833333333333329e-03 4175 2997 8.1315162936412833e-20 4176 4176 3.3333333666666659e-02 4176 4981 -1.0416666666666666e-11 4176 4940 -6.2499999999999991e-11 4176 4914 1.0416666666666666e-11 4176 4177 4.1666666666666665e-11 4176 4941 -8.3333333333333330e-11 4176 4943 -6.2499999999999991e-11 4176 5002 -1.0416666666666666e-11 4176 4183 -3.0991386737738975e-27 4176 4895 -1.0416666666666667e-03 4176 4942 -4.1666667083333333e-03 4176 4896 6.2500000000000003e-03 4176 4916 4.1666667083333324e-03 4176 4174 8.4829026083874785e-20 4176 4904 -1.0416666666666667e-03 4176 4898 8.3333333333333315e-03 4176 4906 6.2500000000000003e-03 4176 4897 1.0416666666666667e-03 4176 4175 -8.8991399020904929e-20 4176 4173 4.1666666666666666e-03 4176 3661 -1.0416666666666666e-11 4176 3001 4.1666666666666665e-11 4176 3623 -1.0416666666666667e-03 4176 2998 7.0197856548546410e-20 4176 2994 4.1666666666666666e-03 4177 4177 2.5000000000000002e-10 4177 4941 -2.0833333333333329e-11 4177 4992 -2.0833333333333332e-11 4177 4981 -4.1666666666666665e-11 4177 4183 -2.0833333333333326e-11 4177 4916 2.0833333333333332e-11 4177 4940 -2.0833333333333326e-11 4177 4176 4.1666666666666665e-11 4177 4917 2.0833333333333332e-11 4177 4174 -2.0833333333333326e-11 4177 4914 4.1666666666666665e-11 4177 4681 2.0833333333333329e-11 4177 4983 2.0833333333333326e-11 4177 4677 2.0833333333333332e-11 4177 4984 2.0833333333333326e-11 4177 4678 4.1666666666666665e-11 4177 4179 4.1666666666666665e-11 4177 4178 -2.0833333333333326e-11 4177 3003 4.1666666666666665e-11 4178 4178 2.4999999999999996e-10 4178 4664 1.0416666666666666e-11 4178 4673 1.0416666666666665e-11 4178 4663 6.2499999999999991e-11 4178 4180 -2.0833333333333326e-11 4178 4681 -2.0833333333333339e-11 4178 4983 1.0416666666666665e-11 4178 4677 -2.0833333333333339e-11 4178 4984 1.0416666666666666e-11 4178 4678 -6.2500000000000004e-11 4178 4179 -2.6253290925755273e-27 4178 4177 -2.0833333333333326e-11 4178 3003 1.6155871338926322e-27 4179 4179 2.7083333666666660e-02 4179 4910 1.0416666666666664e-03 4179 4911 9.3750000000000014e-03 4179 4912 -5.0116116045879435e-20 4179 4169 1.0116749763768550e-19 4179 4989 -6.2499999999999995e-03 4179 4996 1.0416666666666667e-03 4179 4184 4.1666666666666657e-03 4179 4663 -1.0416666666666666e-11 4179 4990 -4.1666667083333324e-03 4179 4664 6.2499999999999991e-11 4179 4661 -1.0416666666666666e-11 4179 4171 -1.4558380320789774e-20 4179 4180 4.1666666666666665e-11 4179 4917 5.2083333750000006e-03 4179 4174 -7.4433021799253829e-20 4179 4914 1.0416666666666666e-11 4179 4677 8.3333333333333330e-11 4179 4984 6.2499999999999991e-11 4179 4678 1.0416666666666666e-11 4179 4178 -3.0991386737738975e-27 4179 4177 4.1666666666666665e-11 4180 4180 2.5000000000000002e-10 4180 4677 2.0833333333333332e-11 4180 4681 2.0833333333333332e-11 4180 4663 -4.1666666666666665e-11 4180 4178 -2.0833333333333326e-11 4180 4990 -2.0833333333333332e-11 4180 4664 2.0833333333333326e-11 4180 4179 4.1666666666666665e-11 4180 4797 -2.0833333333333332e-11 4180 4171 -2.0833333333333326e-11 4180 4661 -4.1666666666666665e-11 4180 4991 -2.0833333333333329e-11 4180 4673 2.0833333333333326e-11 4180 4796 -2.0833333333333332e-11 4180 4674 2.0833333333333326e-11 4180 4667 -4.1666666666666665e-11 4180 4172 4.1666666666666665e-11 4180 4181 -2.0833333333333326e-11 4180 3003 4.1666666666666665e-11 4181 4181 2.4999999999999996e-10 4181 4762 1.0416666666666666e-11 4181 4767 1.0416666666666665e-11 4181 4761 6.2499999999999991e-11 4181 4182 -2.0833333333333326e-11 4181 4991 2.0833333333333332e-11 4181 4673 1.0416666666666665e-11 4181 4796 2.0833333333333339e-11 4181 4674 1.0416666666666666e-11 4181 4667 6.2499999999999991e-11 4181 4172 -2.6253290925755273e-27 4181 4180 -2.0833333333333326e-11 4181 3003 1.6155871338926322e-27 4182 4182 2.5000000000000002e-10 4182 4768 2.0833333333333326e-11 4182 4796 -2.0833333333333329e-11 4182 4991 -2.0833333333333332e-11 4182 4767 2.0833333333333326e-11 4182 4761 -4.1666666666666665e-11 4182 4181 -2.0833333333333326e-11 4182 4795 2.0833333333333332e-11 4182 4762 2.0833333333333326e-11 4182 4763 -4.1666666666666665e-11 4182 4172 4.1666666666666665e-11 4182 3660 2.0833333333333332e-11 4182 3703 2.0833333333333329e-11 4182 3658 2.0833333333333332e-11 4182 3701 -4.1666666666666665e-11 4182 2996 4.1666666666666665e-11 4182 3002 -2.0833333333333326e-11 4182 3003 4.1666666666666665e-11 4182 3000 -2.0833333333333326e-11 4183 4183 2.4999999999999996e-10 4183 4940 -1.0416666666666666e-11 4183 4983 1.0416666666666665e-11 4183 4981 6.2499999999999991e-11 4183 4177 -2.0833333333333326e-11 4183 4992 2.0833333333333332e-11 4183 4941 2.0833333333333339e-11 4183 4943 -1.0416666666666666e-11 4183 5002 6.2499999999999991e-11 4183 4176 -2.6253290925755273e-27 4183 3003 1.6155871338926322e-27 4183 3700 1.0416666666666665e-11 4183 3001 -2.0833333333333326e-11 4184 4184 2.0833333333333329e-02 4184 4911 2.0833333333333333e-03 4184 4784 2.8940292364521927e-21 4184 4910 4.1666666666666675e-03 4184 4169 -4.1666666666666657e-03 4184 4789 4.5316262678105068e-20 4184 4170 -6.2499999999999986e-03 4184 4787 4.1666666666666675e-03 4184 4990 -2.0833333333333329e-03 4184 4179 4.1666666666666657e-03 4184 4171 -4.1666666666666657e-03 4184 4989 -2.0833333333333329e-03 4184 4996 4.1666666666666657e-03 4185 4185 2.5000000000000002e-10 4185 4764 -4.1666666666666665e-11 4185 4994 2.0833333333333329e-11 4185 4769 2.0833333333333326e-11 4185 4795 2.0833333333333332e-11 4185 4794 2.0833333333333332e-11 4185 4765 2.0833333333333326e-11 4185 4763 -4.1666666666666665e-11 4185 4190 -2.0833333333333326e-11 4185 4796 -2.0833333333333332e-11 4185 4762 2.0833333333333326e-11 4185 4761 -4.1666666666666665e-11 4185 4187 4.1666666666666665e-11 4185 4186 -2.0833333333333326e-11 4186 4186 2.4999999999999996e-10 4186 4769 1.0416666666666665e-11 4186 4674 1.0416666666666666e-11 4186 4994 -2.0833333333333332e-11 4186 4668 1.0416666666666665e-11 4186 4667 6.2499999999999991e-11 4186 4188 -2.0833333333333326e-11 4186 4796 2.0833333333333339e-11 4186 4762 1.0416666666666666e-11 4186 4761 6.2499999999999991e-11 4186 4187 -2.6253290925755273e-27 4186 4185 -2.0833333333333326e-11 4187 4187 2.0833333666666662e-02 4187 4789 -5.0116116045879435e-20 4187 4763 -1.0416666666666666e-11 4187 4797 -5.2083333750000006e-03 4187 4661 -1.0416666666666666e-11 4187 4195 7.0197855409036832e-20 4187 4674 6.2499999999999991e-11 4187 4667 -1.0416666666666666e-11 4187 4188 4.1666666666666665e-11 4187 4790 1.0416666666666666e-02 4187 4191 -8.8991399020904929e-20 4187 4795 5.2083333750000006e-03 4187 4791 2.1705219273391446e-19 4187 4190 3.9244095341960429e-19 4187 4796 -8.3333333333333330e-11 4187 4762 6.2499999999999991e-11 4187 4761 -1.0416666666666666e-11 4187 4186 -3.0991386737738975e-27 4187 4185 4.1666666666666665e-11 4188 4188 2.5000000000000002e-10 4188 4665 -4.1666666666666665e-11 4188 4995 2.0833333333333332e-11 4188 4662 2.0833333333333326e-11 4188 4797 -2.0833333333333332e-11 4188 4661 -4.1666666666666665e-11 4188 4195 -2.0833333333333326e-11 4188 4796 -2.0833333333333329e-11 4188 4187 4.1666666666666665e-11 4188 4674 2.0833333333333326e-11 4188 4994 2.0833333333333332e-11 4188 4668 2.0833333333333326e-11 4188 4667 -4.1666666666666665e-11 4188 4186 -2.0833333333333326e-11 4189 4189 3.3333333333333332e-10 4190 4190 1.0416666791666664e-02 4190 4762 1.0416666666666665e-11 4190 4765 1.0416666666666663e-11 4190 4763 6.2500000000000004e-11 4190 4185 -2.0833333333333326e-11 4190 4792 -1.6263032587282567e-19 4190 4794 1.0416666562499996e-03 4190 4790 2.1684043449710089e-19 4190 4187 6.5052130510688979e-19 4190 4191 1.0416666666666667e-03 4190 4795 -1.0416666666666665e-11 4190 4791 1.0416666666666671e-03 4191 4191 4.9999999999999989e-02 4191 4797 2.1684043449710089e-19 4191 4995 5.2083333333333330e-03 4191 4789 -6.2499999999999986e-03 4191 4195 1.0416666666666673e-03 4191 4793 6.2499999999999986e-03 4191 4788 -6.2499999999999986e-03 4191 4783 -2.3039296165316969e-19 4191 4782 -6.2499999999999986e-03 4191 4792 6.2499999999999986e-03 4191 4794 5.2083333333333322e-03 4191 4790 -7.3183646642771549e-19 4191 4187 1.3552527156068805e-20 4191 4795 3.2249014814734037e-20 4191 4791 -6.2499999999999986e-03 4191 4190 1.0416666666666664e-03 4192 4192 2.9166666833333327e-02 4193 4193 1.0416666666666664e-02 4194 4194 2.0833333333333329e-02 4195 4195 1.0416666791666664e-02 4195 4790 -2.1684043449710089e-19 4195 4793 2.1684043449710089e-19 4195 4191 1.0416666666666671e-03 4195 4789 1.0416666666666667e-03 4195 4995 1.0416666562500000e-03 4195 4662 1.0416666666666665e-11 4195 4797 1.0416666883507107e-11 4195 4674 1.0416666666666663e-11 4195 4661 6.2500000000000004e-11 4195 4188 -2.0833333333333326e-11 4196 4196 2.9166666833333327e-02 4197 4197 1.2499999999999998e-10 4198 4198 1.2499999999999998e-10 4199 4199 1.0416666666666664e-02 4200 4200 2.5000000000000002e-10 4200 4808 2.0833333333333326e-11 4200 4807 -4.1666666666666665e-11 4200 4804 2.0833333333333326e-11 4200 4803 -4.1666666666666665e-11 4200 4802 2.0833333333333326e-11 4200 4801 -4.1666666666666665e-11 4201 4201 1.2499999999999998e-10 4202 4202 1.6666666666666666e-10 4203 4203 1.2499999999999998e-10 4204 4204 1.6666666666666666e-10 4205 4205 1.2499999999999998e-10 4206 4206 1.6666666666666666e-10 4207 4207 2.5000000000000002e-10 4207 5063 2.0833333333333329e-11 4207 4817 -2.0833333333333332e-11 4207 4805 -4.1666666666666665e-11 4207 4221 -2.0833333333333326e-11 4207 4806 2.0833333333333326e-11 4207 4801 -4.1666666666666665e-11 4207 4416 2.0833333333333329e-11 4207 4210 4.1666666666666665e-11 4207 4809 2.0833333333333326e-11 4207 4412 2.0833333333333332e-11 4207 4810 2.0833333333333326e-11 4207 4413 4.1666666666666665e-11 4207 4208 -2.0833333333333326e-11 4208 4208 2.4999999999999996e-10 4208 4399 1.0416666666666666e-11 4208 4408 1.0416666666666665e-11 4208 4398 6.2499999999999991e-11 4208 4212 -2.0833333333333326e-11 4208 4416 -2.0833333333333339e-11 4208 4210 1.6155871338926322e-27 4208 4809 1.0416666666666665e-11 4208 4412 -2.0833333333333339e-11 4208 4810 1.0416666666666666e-11 4208 4413 -6.2500000000000004e-11 4208 4207 -2.0833333333333326e-11 4209 4209 3.3333333333333332e-10 4210 4210 6.6666666666666674e-10 4210 4738 -1.0416666666666666e-11 4210 4805 -1.0416666666666666e-11 4210 4817 -8.3333333333333330e-11 4210 4221 9.5018296033870872e-28 4210 4746 6.2499999999999991e-11 4210 4740 -1.0416666666666666e-11 4210 4220 4.1666666666666665e-11 4210 4816 -8.3333333333333330e-11 4210 4218 9.5018296033870872e-28 4210 4500 -1.0416666666666666e-11 4210 4398 -1.0416666666666666e-11 4210 4504 6.2499999999999991e-11 4210 4492 -1.0416666666666666e-11 4210 4216 4.1666666666666665e-11 4210 4815 -8.3333333333333330e-11 4210 4213 9.5018296033870872e-28 4210 4408 6.2499999999999991e-11 4210 4402 -1.0416666666666666e-11 4210 4212 4.1666666666666665e-11 4210 4416 8.3333333333333330e-11 4210 4208 9.5018296033870872e-28 4210 4809 6.2499999999999991e-11 4210 4413 1.0416666666666666e-11 4210 4207 4.1666666666666665e-11 4211 4211 1.2499999999999998e-10 4212 4212 2.5000000000000002e-10 4212 4412 2.0833333333333332e-11 4212 4416 2.0833333333333332e-11 4212 4398 -4.1666666666666665e-11 4212 4208 -2.0833333333333326e-11 4212 4399 2.0833333333333326e-11 4212 4396 -4.1666666666666665e-11 4212 4815 -2.0833333333333329e-11 4212 4210 4.1666666666666665e-11 4212 4408 2.0833333333333326e-11 4212 4822 2.0833333333333332e-11 4212 4409 2.0833333333333326e-11 4212 4402 -4.1666666666666665e-11 4212 4213 -2.0833333333333326e-11 4213 4213 2.4999999999999996e-10 4213 4493 1.0416666666666666e-11 4213 4504 1.0416666666666665e-11 4213 4492 6.2499999999999991e-11 4213 4216 -2.0833333333333326e-11 4213 4815 2.0833333333333332e-11 4213 4210 1.6155871338926322e-27 4213 4408 1.0416666666666665e-11 4213 4822 -2.0833333333333339e-11 4213 4409 1.0416666666666666e-11 4213 4402 6.2499999999999991e-11 4213 4212 -2.0833333333333326e-11 4214 4214 3.3333333333333332e-10 4215 4215 1.2499999999999998e-10 4216 4216 2.5000000000000002e-10 4216 4816 -2.0833333333333329e-11 4216 5061 2.0833333333333332e-11 4216 4507 2.0833333333333326e-11 4216 4500 -4.1666666666666665e-11 4216 4218 -2.0833333333333326e-11 4216 4822 2.0833333333333329e-11 4216 4815 -2.0833333333333332e-11 4216 4504 2.0833333333333326e-11 4216 4492 -4.1666666666666665e-11 4216 4210 4.1666666666666665e-11 4216 4213 -2.0833333333333326e-11 4216 4493 2.0833333333333326e-11 4216 4498 -4.1666666666666665e-11 4217 4217 1.2499999999999998e-10 4218 4218 2.4999999999999996e-10 4218 4739 1.0416666666666666e-11 4218 4746 1.0416666666666665e-11 4218 4738 6.2499999999999991e-11 4218 4220 -2.0833333333333326e-11 4218 4816 2.0833333333333339e-11 4218 4210 1.6155871338926322e-27 4218 4504 1.0416666666666665e-11 4218 5061 -2.0833333333333339e-11 4218 4507 1.0416666666666666e-11 4218 4500 6.2500000000000004e-11 4218 4216 -2.0833333333333326e-11 4219 4219 3.3333333333333332e-10 4220 4220 2.5000000000000002e-10 4220 5061 2.0833333333333332e-11 4220 4816 -2.0833333333333332e-11 4220 4738 -4.1666666666666665e-11 4220 4218 -2.0833333333333326e-11 4220 4739 2.0833333333333326e-11 4220 4736 -4.1666666666666665e-11 4220 4817 -2.0833333333333329e-11 4220 4210 4.1666666666666665e-11 4220 4746 2.0833333333333326e-11 4220 5063 2.0833333333333332e-11 4220 4747 2.0833333333333326e-11 4220 4740 -4.1666666666666665e-11 4220 4221 -2.0833333333333326e-11 4221 4221 2.4999999999999996e-10 4221 4806 1.0416666666666666e-11 4221 4809 1.0416666666666665e-11 4221 4805 6.2499999999999991e-11 4221 4207 -2.0833333333333326e-11 4221 4817 2.0833333333333332e-11 4221 4210 1.6155871338926322e-27 4221 4746 1.0416666666666665e-11 4221 5063 -2.0833333333333339e-11 4221 4747 1.0416666666666666e-11 4221 4740 6.2499999999999991e-11 4221 4220 -2.0833333333333326e-11 4222 4222 3.3333333333333332e-10 4223 4223 1.2499999999999998e-10 4224 4224 2.5000000000000002e-10 4224 4545 2.0833333333333332e-11 4224 4546 2.0833333333333332e-11 4224 4496 -4.1666666666666665e-11 4224 4237 -2.0833333333333326e-11 4224 4823 2.0833333333333329e-11 4224 4228 4.1666666666666665e-11 4224 4506 2.0833333333333326e-11 4224 4497 2.0833333333333326e-11 4224 4498 -4.1666666666666665e-11 4224 4822 2.0833333333333332e-11 4224 4493 2.0833333333333326e-11 4224 4492 -4.1666666666666665e-11 4224 4225 -2.0833333333333326e-11 4225 4225 2.4999999999999996e-10 4225 4506 1.0416666666666665e-11 4225 4409 1.0416666666666666e-11 4225 4823 -2.0833333333333332e-11 4225 4403 1.0416666666666665e-11 4225 4402 6.2499999999999991e-11 4225 4228 1.6155871338926322e-27 4225 4227 -2.0833333333333326e-11 4225 4822 -2.0833333333333339e-11 4225 4493 1.0416666666666666e-11 4225 4492 6.2499999999999991e-11 4225 4224 -2.0833333333333326e-11 4226 4226 3.3333333333333332e-10 4227 4227 2.5000000000000002e-10 4227 4868 -2.0833333333333329e-11 4227 4829 -2.0833333333333332e-11 4227 4400 -4.1666666666666665e-11 4227 4238 -2.0833333333333326e-11 4227 4397 2.0833333333333326e-11 4227 4396 -4.1666666666666665e-11 4227 4822 2.0833333333333329e-11 4227 4409 2.0833333333333326e-11 4227 4823 2.0833333333333332e-11 4227 4403 2.0833333333333326e-11 4227 4402 -4.1666666666666665e-11 4227 4228 4.1666666666666665e-11 4227 4225 -2.0833333333333326e-11 4228 4228 3.3333333666666659e-02 4228 4527 -1.0416666666666667e-03 4228 4877 1.0416666666666667e-03 4228 4869 -6.2500000000000003e-03 4228 4925 -1.0416666666666667e-03 4228 4231 4.1666666666666666e-03 4228 4868 -4.1666667083333333e-03 4228 4238 7.0197856548546410e-20 4228 4400 -1.0416666666666666e-11 4228 4546 4.1666667083333324e-03 4228 4496 -1.0416666666666666e-11 4228 4237 8.4829026083874785e-20 4228 4506 6.2499999999999991e-11 4228 4492 -1.0416666666666666e-11 4228 4224 4.1666666666666665e-11 4228 4867 -8.3333333333333315e-03 4228 4529 6.2500000000000003e-03 4228 4528 -1.0416666666666667e-03 4228 4230 1.5502688168223823e-19 4228 4229 4.1666666666666666e-03 4228 4823 8.3333333333333330e-11 4228 4403 6.2499999999999991e-11 4228 4402 -1.0416666666666666e-11 4228 4225 9.5018296033870872e-28 4228 4227 4.1666666666666665e-11 4229 4229 2.4999999999999994e-02 4229 4938 2.0833333333333329e-03 4229 4533 2.0833333333333329e-03 4229 4546 2.0833333333333329e-03 4229 4545 2.0833333333333329e-03 4229 4530 2.0833333333333329e-03 4229 4527 -4.1666666666666666e-03 4229 4237 -2.0833333333333333e-03 4229 4867 -2.0833333333333329e-03 4229 4529 2.0833333333333329e-03 4229 4528 -4.1666666666666666e-03 4229 4228 4.1666666666666657e-03 4229 4230 -2.0833333333333333e-03 4229 3629 -4.1666666666666666e-03 4230 4230 2.5000000000000001e-02 4230 4533 1.0416666666666664e-03 4230 4869 -1.0416666666666664e-03 4230 4938 -2.0833333333333337e-03 4230 4926 1.0416666666666664e-03 4230 4925 6.2500000000000003e-03 4230 4231 -2.0833333333333329e-03 4230 4867 2.0833333333333333e-03 4230 4529 1.0416666666666664e-03 4230 4528 6.2500000000000003e-03 4230 4228 8.1315162936412833e-20 4230 4229 -2.0833333333333329e-03 4231 4231 2.4999999999999994e-02 4231 4921 -4.1666666666666666e-03 4231 4829 -2.0833333333333329e-03 4231 4828 -2.0833333333333329e-03 4231 4868 -2.0833333333333329e-03 4231 4877 4.1666666666666666e-03 4231 4238 -2.0833333333333333e-03 4231 4867 -2.0833333333333329e-03 4231 4228 4.1666666666666657e-03 4231 4869 -2.0833333333333329e-03 4231 4938 2.0833333333333329e-03 4231 4926 2.0833333333333329e-03 4231 4925 -4.1666666666666666e-03 4231 4230 -2.0833333333333333e-03 4232 4232 3.3333333333333326e-02 4233 4233 1.2499999999999998e-10 4234 4234 1.6666666833333330e-02 4235 4235 1.2499999999999998e-10 4236 4236 1.6666666833333330e-02 4237 4237 1.2500000124999999e-02 4237 4529 1.0416666666666662e-03 4237 4530 1.0416666666666664e-03 4237 4527 6.2500000000000003e-03 4237 4229 -2.0833333333333329e-03 4237 4545 -1.0416666770833340e-03 4237 4497 1.0416666666666666e-11 4237 4546 -1.0416666770833331e-03 4237 4506 1.0416666666666665e-11 4237 4496 6.2499999999999991e-11 4237 4228 8.1315162936412833e-20 4237 4224 -2.0833333333333326e-11 4238 4238 1.2500000125000001e-02 4238 4828 -1.0416666666666664e-03 4238 4869 -1.0416666666666664e-03 4238 4877 -6.2500000000000003e-03 4238 4231 -2.0833333333333329e-03 4238 4868 1.0416666770833340e-03 4238 4228 1.6155871338926322e-27 4238 4403 1.0416666666666665e-11 4238 4829 1.0416666770833333e-03 4238 4397 1.0416666666666666e-11 4238 4400 6.2500000000000004e-11 4238 4227 -2.0833333333333326e-11 4239 4239 1.2500000000000001e-02 4240 4240 1.2500000000000001e-02 4241 4241 2.5000000000000002e-10 4241 4848 2.0833333333333326e-11 4241 4846 -4.1666666666666665e-11 4241 4255 -2.0833333333333326e-11 4241 4857 2.0833333333333329e-11 4241 4863 2.0833333333333332e-11 4241 4843 2.0833333333333326e-11 4241 4842 -4.1666666666666665e-11 4241 4855 2.0833333333333332e-11 4241 4839 2.0833333333333326e-11 4241 4838 -4.1666666666666665e-11 4241 4243 4.1666666666666665e-11 4241 4242 -2.0833333333333326e-11 4241 2068 2.0833333333333332e-11 4242 4242 1.2500000125000001e-02 4242 4859 -1.0416666666666664e-03 4242 4843 1.0416666666666665e-11 4242 4857 -1.0416666770833340e-03 4242 4881 -1.0416666666666664e-03 4242 4856 -6.2500000000000003e-03 4242 4247 -2.0833333333333329e-03 4242 4855 -1.0416666770833333e-03 4242 4839 1.0416666666666666e-11 4242 4838 6.2500000000000004e-11 4242 4243 1.3552525540481672e-20 4242 4241 -2.0833333333333326e-11 4243 4243 1.6666667291666663e-02 4243 4862 7.2916666666666673e-11 4243 4254 5.2083333333333328e-11 4243 4863 7.2916666666666673e-11 4243 4255 5.2083333333333334e-11 4243 4914 1.0416666666666666e-11 4243 4856 1.0416666666666667e-03 4243 4846 -1.0416666666666666e-11 4243 4861 -6.2499999999999991e-11 4243 4982 -1.0416666666666666e-11 4243 4250 4.1666666666666665e-11 4243 4860 -4.1666667083333333e-03 4243 4859 -6.2500000000000003e-03 4243 4904 -1.0416666666666667e-03 4243 4249 -7.4433021799253829e-20 4243 4247 4.1666666666666666e-03 4243 4855 4.1666667083333324e-03 4243 4839 6.2499999999999991e-11 4243 4838 -1.0416666666666666e-11 4243 4242 -1.4558380320789774e-20 4243 4241 4.1666666666666665e-11 4243 1769 3.1249999999999995e-11 4243 1775 1.6666666666666666e-10 4243 1774 3.1250000000000002e-11 4243 1598 2.0833333333333336e-11 4244 4244 1.2499999999999998e-10 4245 4245 1.6666666833333330e-02 4246 4246 1.6666666666666663e-02 4246 4915 1.0416666666666667e-03 4246 4904 1.0416666666666664e-03 4246 4249 -1.0416666666666656e-03 4246 4912 1.0416666666666671e-03 4246 4909 6.2499999999999986e-03 4246 4901 1.0416666666666667e-03 4246 4908 1.0416666666666654e-03 4246 4900 2.0833333333333337e-03 4246 4247 -6.2499999999999986e-03 4247 4247 3.7499999999999992e-02 4247 4912 4.1666666666666666e-03 4247 4855 2.0833333333333329e-03 4247 4860 -2.0833333333333329e-03 4247 4859 -2.0833333333333329e-03 4247 4904 -4.1666666666666675e-03 4247 4243 4.1666666666666657e-03 4247 4249 2.0833333333333324e-03 4247 4857 2.0833333333333329e-03 4247 4881 -2.0833333333333329e-03 4247 4856 4.1666666666666666e-03 4247 4242 -2.0833333333333333e-03 4247 4901 -4.1666666666666666e-03 4247 4908 4.1666666666666657e-03 4247 4900 -1.6666666666666663e-02 4247 4246 -6.2499999999999986e-03 4248 4248 2.4999999999999994e-02 4249 4249 2.5000000124999998e-02 4249 4909 4.1666666666666666e-03 4249 4861 -1.0416666666666665e-11 4249 4912 1.2499999999999999e-02 4249 4900 -3.1249999999999997e-03 4249 4246 -1.0416666666666654e-03 4249 4915 1.0416666562499998e-03 4249 4978 1.0416666666666663e-11 4249 4914 -6.2500000000000004e-11 4249 4250 -2.0833333333333326e-11 4249 4860 1.0416666770833340e-03 4249 4859 -1.0416666666666664e-03 4249 4904 4.1666666666666666e-03 4249 4243 -1.0097419586828951e-27 4249 4247 2.0833333333333329e-03 4250 4250 2.5000000000000002e-10 4250 4254 -2.0833333333333326e-11 4250 4980 2.0833333333333326e-11 4250 4982 -4.1666666666666665e-11 4250 4860 -2.0833333333333332e-11 4250 4862 2.0833333333333332e-11 4250 4861 -2.0833333333333326e-11 4250 4243 4.1666666666666665e-11 4250 4979 -4.1666666666666665e-11 4250 4915 2.0833333333333332e-11 4250 4978 2.0833333333333326e-11 4250 4914 4.1666666666666665e-11 4250 4249 -2.0833333333333326e-11 4250 2323 2.0833333333333329e-11 4251 4251 2.9166666833333327e-02 4252 4252 1.2499999999999998e-10 4253 4253 4.5833333333333330e-10 4254 4254 4.9999999999999993e-10 4254 4862 -6.4623485355705287e-27 4254 4243 5.2083333333333328e-11 4254 4980 1.0416666666666665e-11 4254 4982 6.2500000000000004e-11 4254 4250 -2.0833333333333326e-11 4254 4861 -1.0416666666666666e-11 4254 2009 4.1666666666666671e-11 4254 2005 1.2499999999999998e-10 4254 1601 -1.0416666666666668e-11 4254 2004 3.1250000000000002e-11 4254 2322 -2.0833333333333339e-11 4254 1773 3.1250000000000002e-11 4254 1599 6.2499999999999991e-11 4254 1775 4.1666666666666665e-11 4254 1769 1.2499999999999998e-10 4254 1598 -1.0416666666666665e-11 4254 2323 -1.6155871338926322e-27 4255 4255 3.7499999999999995e-10 4255 4863 -1.6155871338926322e-27 4255 4243 5.2083333333333334e-11 4255 4848 1.0416666666666663e-11 4255 4846 6.2500000000000004e-11 4255 4241 -2.0833333333333326e-11 4255 4839 1.0416666666666665e-11 4255 2070 -1.0416666666666665e-11 4255 2069 -4.1666666666666671e-11 4255 1773 3.1250000000000002e-11 4255 1599 2.0833333333333332e-11 4255 1775 4.1666666666666671e-11 4255 1774 1.2499999999999998e-10 4255 1598 -1.0416666666666668e-11 4255 2068 -2.0833333333333339e-11 4256 4256 3.3333333333333332e-10 4257 4257 2.5000000000000002e-10 4257 4842 -4.1666666666666665e-11 4257 4871 2.0833333333333332e-11 4257 4847 2.0833333333333326e-11 4257 4858 2.0833333333333332e-11 4257 4857 2.0833333333333332e-11 4257 4843 2.0833333333333326e-11 4257 4838 -4.1666666666666665e-11 4257 4268 -2.0833333333333326e-11 4257 4870 2.0833333333333332e-11 4257 4841 2.0833333333333326e-11 4257 4840 -4.1666666666666665e-11 4257 4259 4.1666666666666665e-11 4257 4258 -2.0833333333333326e-11 4258 4258 2.4999999999999996e-10 4258 4847 1.0416666666666665e-11 4258 4411 1.0416666666666665e-11 4258 4871 -2.0833333333333339e-11 4258 4405 1.0416666666666663e-11 4258 4404 6.2500000000000004e-11 4258 4260 -2.0833333333333326e-11 4258 4870 -2.0833333333333339e-11 4258 4841 1.0416666666666663e-11 4258 4840 6.2500000000000004e-11 4258 4259 -2.6253290925755273e-27 4258 4257 -2.0833333333333326e-11 4259 4259 3.3333333666666659e-02 4259 4877 1.0416666666666667e-03 4259 4856 1.0416666666666667e-03 4259 4875 -6.2500000000000003e-03 4259 4902 -1.0416666666666667e-03 4259 4262 4.1666666666666666e-03 4259 4858 4.1666667083333333e-03 4259 4268 -7.4433021799253829e-20 4259 4838 -1.0416666666666666e-11 4259 4874 -4.1666667083333324e-03 4259 4400 -1.0416666666666666e-11 4259 4266 -1.4558380320789774e-20 4259 4411 6.2499999999999991e-11 4259 4404 -1.0416666666666666e-11 4259 4260 4.1666666666666665e-11 4259 4873 -8.3333333333333315e-03 4259 4872 -6.2500000000000003e-03 4259 4924 -1.0416666666666667e-03 4259 4263 -8.8991399020904929e-20 4259 4265 4.1666666666666666e-03 4259 4870 8.3333333333333330e-11 4259 4841 6.2499999999999991e-11 4259 4840 -1.0416666666666666e-11 4259 4258 -3.0991386737738975e-27 4259 4257 4.1666666666666665e-11 4260 4260 2.5000000000000002e-10 4260 4394 -4.1666666666666665e-11 4260 4876 2.0833333333333329e-11 4260 4401 2.0833333333333326e-11 4260 4874 -2.0833333333333332e-11 4260 4400 -4.1666666666666665e-11 4260 4266 -2.0833333333333326e-11 4260 4870 2.0833333333333332e-11 4260 4259 4.1666666666666665e-11 4260 4411 2.0833333333333326e-11 4260 4871 2.0833333333333332e-11 4260 4405 2.0833333333333326e-11 4260 4404 -4.1666666666666665e-11 4260 4258 -2.0833333333333326e-11 4261 4261 3.3333333333333332e-10 4262 4262 2.4999999999999994e-02 4262 4857 2.0833333333333329e-03 4262 4858 2.0833333333333329e-03 4262 4856 4.1666666666666666e-03 4262 4268 -2.0833333333333333e-03 4262 4873 -2.0833333333333329e-03 4262 4259 4.1666666666666657e-03 4262 4875 -2.0833333333333329e-03 4262 4881 -2.0833333333333329e-03 4262 4901 -4.1666666666666666e-03 4262 4936 2.0833333333333329e-03 4262 4903 2.0833333333333329e-03 4262 4902 -4.1666666666666666e-03 4262 4263 -2.0833333333333333e-03 4263 4263 2.5000000000000001e-02 4263 4875 -1.0416666666666664e-03 4263 4929 1.0416666666666664e-03 4263 4873 2.0833333333333337e-03 4263 4872 -1.0416666666666664e-03 4263 4924 6.2500000000000003e-03 4263 4259 1.3552527156068805e-20 4263 4265 -2.0833333333333329e-03 4263 4936 -2.0833333333333337e-03 4263 4903 1.0416666666666664e-03 4263 4902 6.2500000000000003e-03 4263 4262 -2.0833333333333329e-03 4264 4264 3.3333333333333326e-02 4265 4265 2.4999999999999994e-02 4265 4874 -2.0833333333333329e-03 4265 4876 2.0833333333333329e-03 4265 4877 4.1666666666666666e-03 4265 4266 -2.0833333333333333e-03 4265 4878 -2.0833333333333329e-03 4265 4923 -4.1666666666666666e-03 4265 4936 2.0833333333333329e-03 4265 4929 2.0833333333333329e-03 4265 4873 -2.0833333333333329e-03 4265 4872 -2.0833333333333329e-03 4265 4924 -4.1666666666666666e-03 4265 4259 4.1666666666666657e-03 4265 4263 -2.0833333333333333e-03 4266 4266 1.2500000125000001e-02 4266 4872 -1.0416666666666664e-03 4266 4878 -1.0416666666666664e-03 4266 4877 -6.2500000000000003e-03 4266 4265 -2.0833333333333329e-03 4266 4876 -1.0416666770833340e-03 4266 4401 1.0416666666666665e-11 4266 4874 1.0416666770833333e-03 4266 4411 1.0416666666666666e-11 4266 4400 6.2500000000000004e-11 4266 4259 1.3552525540481672e-20 4266 4260 -2.0833333333333326e-11 4267 4267 1.6666666833333330e-02 4268 4268 1.2500000124999999e-02 4268 4881 -1.0416666666666662e-03 4268 4875 -1.0416666666666664e-03 4268 4856 -6.2500000000000003e-03 4268 4262 -2.0833333333333329e-03 4268 4858 -1.0416666770833340e-03 4268 4259 -1.0097419586828951e-27 4268 4841 1.0416666666666666e-11 4268 4857 -1.0416666770833331e-03 4268 4843 1.0416666666666665e-11 4268 4838 6.2499999999999991e-11 4268 4257 -2.0833333333333326e-11 4269 4269 1.6666666833333330e-02 4270 4270 1.2499999999999998e-10 4271 4271 1.2499999999999998e-10 4272 4272 1.2499999999999999e-02 4273 4273 1.2500000000000001e-02 4274 4274 2.4999999999999994e-02 4274 4938 2.0833333333333329e-03 4274 4932 -2.0833333333333329e-03 4274 4925 -4.1666666666666666e-03 4274 4278 -2.0833333333333333e-03 4274 4926 2.0833333333333329e-03 4274 4921 -4.1666666666666666e-03 4274 4582 2.0833333333333329e-03 4274 4927 2.0833333333333329e-03 4274 4579 2.0833333333333329e-03 4274 4928 2.0833333333333329e-03 4274 4580 4.1666666666666666e-03 4274 4275 -2.0833333333333333e-03 4274 2784 4.1666666666666657e-03 4275 4275 2.5000000000000001e-02 4275 4551 1.0416666666666664e-03 4275 4550 6.2500000000000003e-03 4275 4582 -2.0833333333333337e-03 4275 4927 1.0416666666666662e-03 4275 4579 -2.0833333333333337e-03 4275 4928 1.0416666666666664e-03 4275 4580 -6.2500000000000003e-03 4275 4274 -2.0833333333333329e-03 4275 3350 1.0416666666666664e-03 4275 2786 -2.0833333333333329e-03 4275 2784 8.1315162936412833e-20 4276 4276 3.3333333333333326e-02 4277 4277 1.2500000000000001e-02 4278 4278 2.5000000000000001e-02 4278 4926 1.0416666666666664e-03 4278 4927 1.0416666666666664e-03 4278 4925 6.2500000000000003e-03 4278 4274 -2.0833333333333329e-03 4278 4932 2.0833333333333333e-03 4278 4938 -2.0833333333333337e-03 4278 4533 1.0416666666666664e-03 4278 4528 6.2500000000000003e-03 4278 2784 8.1315162936412833e-20 4278 3352 1.0416666666666664e-03 4278 2790 -2.0833333333333329e-03 4279 4279 3.3333333333333326e-02 4280 4280 3.7499999999999992e-02 4280 4962 4.1666666666666657e-03 4280 4955 -4.1666666666666657e-03 4280 4960 4.1666666666666657e-03 4280 4946 -1.6666666666666666e-02 4280 4285 -6.2499999999999986e-03 4280 4949 2.0833333333333329e-03 4280 4948 -4.1666666666666666e-03 4280 4945 2.0833333333333329e-03 4280 4944 -4.1666666666666675e-03 4281 4281 2.4999999999999994e-02 4282 4282 1.6666666666666663e-02 4283 4283 1.2500000000000001e-02 4284 4284 1.6666666666666663e-02 4285 4285 1.6666666666666663e-02 4285 4960 1.0416666666666660e-03 4285 4962 1.0416666666666662e-03 4285 4955 1.0416666666666664e-03 4285 4944 1.0416666666666667e-03 4285 4946 2.0833333333333346e-03 4285 4280 -6.2499999999999986e-03 4285 1794 6.2499999999999986e-03 4286 4286 2.4999999999999994e-02 4287 4287 2.2916666666666662e-02 4287 4960 -4.5316262678105068e-20 4287 4944 -4.1666666666666657e-03 4287 4954 2.0833333333333329e-03 4287 4950 -4.1666666666666666e-03 4287 4958 2.0833333333333329e-03 4287 4947 2.0833333333333329e-03 4287 4946 -4.1666666666666666e-03 4287 4288 -4.1666666666666657e-03 4287 3395 2.0833333333333329e-03 4287 3685 2.0833333333333329e-03 4287 2844 -2.0833333333333333e-03 4287 1251 4.1666666666666657e-03 4288 4288 4.9999999999999989e-02 4288 4958 -8.6736173798840355e-19 4288 4960 -1.0416666666666669e-03 4288 4944 5.2083333333333339e-03 4288 4947 1.0416666666666664e-03 4288 4946 1.0416666666666666e-02 4288 4287 -4.1666666666666657e-03 4288 1251 5.2083333333333330e-03 4288 2137 4.1666666666666666e-03 4288 1793 -1.2499999999999999e-02 4288 2130 3.1249999999999997e-03 4288 1250 -1.0416666666666654e-03 4288 1790 -1.0416666666666667e-03 4288 2141 5.2083333333333330e-03 4288 1789 -8.3333333333333332e-03 4288 1249 -4.3368086899420177e-19 4288 1788 -2.1684043449710089e-19 4289 4289 1.8749999999999996e-02 4290 4290 2.4999999999999994e-02 4290 4948 -4.1666666666666666e-03 4290 4945 2.0833333333333329e-03 4290 4944 -4.1666666666666666e-03 4290 4954 2.0833333333333329e-03 4290 4951 2.0833333333333329e-03 4290 4950 -4.1666666666666666e-03 4290 3685 2.0833333333333329e-03 4290 3687 2.0833333333333329e-03 4290 3005 -2.0833333333333333e-03 4291 4291 1.2500000000000001e-02 4292 4292 1.6666666666666663e-02 4293 4293 1.2500000000000001e-02 4294 4294 2.4999999999999994e-02 4294 4624 -4.1666666666666666e-03 4294 4972 2.0833333333333329e-03 4294 4632 2.0833333333333329e-03 4294 4625 2.0833333333333329e-03 4294 4616 -4.1666666666666666e-03 4294 4971 2.0833333333333329e-03 4294 4623 2.0833333333333329e-03 4294 4622 -4.1666666666666666e-03 4294 4295 -2.0833333333333333e-03 4295 4295 2.4999999999999998e-02 4295 4632 1.0416666666666664e-03 4295 4956 1.0416666666666664e-03 4295 4972 -2.0833333333333333e-03 4295 4953 1.0416666666666664e-03 4295 4952 6.2500000000000003e-03 4295 4297 -2.0833333333333329e-03 4295 4971 -2.0833333333333337e-03 4295 4623 1.0416666666666664e-03 4295 4622 6.2500000000000003e-03 4295 4294 -2.0833333333333329e-03 4296 4296 3.3333333333333326e-02 4297 4297 2.4999999999999994e-02 4297 4955 -4.1666666666666666e-03 4297 4949 2.0833333333333329e-03 4297 4948 -4.1666666666666666e-03 4297 4971 2.0833333333333329e-03 4297 4956 2.0833333333333329e-03 4297 4972 2.0833333333333329e-03 4297 4953 2.0833333333333329e-03 4297 4952 -4.1666666666666666e-03 4297 4295 -2.0833333333333333e-03 4298 4298 3.3333333333333326e-02 4299 4299 1.2500000000000001e-02 4300 4300 1.6666666666666663e-02 4301 4301 1.2500000000000001e-02 4302 4302 1.6666666666666663e-02 4303 4303 1.2500000000000001e-02 4304 4304 1.2499999999999999e-02 4305 4305 2.4999999999999996e-10 4305 4704 2.0833333333333326e-11 4305 4306 -2.0833333333333326e-11 4305 4699 -4.1666666666666665e-11 4305 4697 -4.1666666666666665e-11 4305 4999 2.0833333333333332e-11 4305 4700 2.0833333333333326e-11 4305 1994 2.0833333333333329e-11 4305 1988 -2.0833333333333332e-11 4305 1978 -4.1666666666666665e-11 4305 1526 -2.0833333333333326e-11 4305 1985 2.0833333333333332e-11 4305 1525 4.1666666666666665e-11 4305 1983 2.0833333333333326e-11 4306 4306 2.4999999999999996e-10 4306 4699 6.2500000000000004e-11 4306 4305 -2.0833333333333326e-11 4306 4985 6.2500000000000004e-11 4306 4308 -2.0833333333333326e-11 4306 4986 1.0416666666666665e-11 4306 4999 -2.0833333333333339e-11 4306 4700 1.0416666666666663e-11 4306 1983 1.0416666666666665e-11 4306 1985 -2.0833333333333339e-11 4306 1989 -1.0416666666666663e-11 4306 1525 -2.6253290925755273e-27 4307 4307 3.3333333333333332e-10 4308 4308 2.4999999999999996e-10 4308 4980 2.0833333333333326e-11 4308 4982 -4.1666666666666665e-11 4308 4985 -4.1666666666666665e-11 4308 4306 -2.0833333333333326e-11 4308 4979 -4.1666666666666665e-11 4308 4999 2.0833333333333332e-11 4308 4986 2.0833333333333326e-11 4308 1990 -2.0833333333333332e-11 4308 2323 2.0833333333333332e-11 4308 1530 -2.0833333333333326e-11 4308 1985 2.0833333333333332e-11 4308 1989 -2.0833333333333326e-11 4308 1525 4.1666666666666665e-11 4309 4309 1.2499999999999998e-10 4310 4310 4.5833333333333330e-10 4311 4311 1.2499999999999998e-10 4312 4312 4.5833333333333330e-10 4313 4313 2.4999999999999996e-10 4313 4987 2.0833333333333326e-11 4313 4985 -4.1666666666666665e-11 4313 4316 4.1666666666666665e-11 4313 4982 -4.1666666666666665e-11 4313 4317 -2.0833333333333326e-11 4313 5008 2.0833333333333329e-11 4313 5007 2.0833333333333329e-11 4313 5006 2.0833333333333332e-11 4313 4988 2.0833333333333326e-11 4313 4981 -4.1666666666666665e-11 4313 4315 4.1666666666666665e-11 4313 4314 -2.0833333333333326e-11 4313 1985 2.0833333333333332e-11 4313 1986 2.0833333333333332e-11 4313 1218 -2.0833333333333326e-11 4313 1990 -2.0833333333333332e-11 4313 1989 -2.0833333333333326e-11 4313 1213 4.1666666666666665e-11 4314 4314 2.4999999999999996e-10 4314 5003 1.0416666666666665e-11 4314 5005 1.0416666666666666e-11 4314 5002 6.2499999999999991e-11 4314 4318 -2.0833333333333326e-11 4314 5007 -2.0833333333333339e-11 4314 4316 -2.6253290925755273e-27 4314 4987 1.0416666666666666e-11 4314 5006 -2.0833333333333332e-11 4314 4988 1.0416666666666665e-11 4314 4981 6.2499999999999991e-11 4314 4315 1.6155871338926322e-27 4314 4313 -2.0833333333333326e-11 4315 4315 5.4166666666666666e-10 4315 5008 9.3750000000000012e-11 4315 5010 1.0416666666666667e-10 4315 4317 9.5018296033870872e-28 4315 4320 5.6797985175912850e-27 4315 5011 -2.2851328271989659e-27 4315 5002 -1.0416666666666666e-11 4315 5009 -9.3749999999999999e-11 4315 5003 6.2499999999999991e-11 4315 5004 -1.0416666666666666e-11 4315 4319 9.5018296033870872e-28 4315 4318 4.1666666666666665e-11 4315 4982 -1.0416666666666666e-11 4315 5006 8.3333333333333330e-11 4315 4988 6.2499999999999991e-11 4315 4981 -1.0416666666666666e-11 4315 4314 9.5018296033870872e-28 4315 4313 4.1666666666666665e-11 4315 1769 -3.6295685768920020e-28 4316 4316 6.6666666666666664e-10 4316 5005 6.2499999999999991e-11 4316 4318 4.1666666666666665e-11 4316 4987 6.2499999999999991e-11 4316 4985 -1.0416666666666666e-11 4316 4313 4.1666666666666665e-11 4316 4699 -1.0416666666666666e-11 4316 5002 -1.0416666666666666e-11 4316 5007 8.3333333333333330e-11 4316 4314 -3.0991386737738975e-27 4316 4981 -1.0416666666666666e-11 4316 1993 8.3333333333333330e-11 4316 1228 9.5018296033870872e-28 4316 816 1.0416666666666666e-11 4316 2315 -1.0416666666666666e-11 4316 1979 -1.0416666666666666e-11 4316 1992 -8.3333333333333330e-11 4316 1227 -3.0991386737738975e-27 4316 1991 -6.2499999999999991e-11 4316 2316 -1.0416666666666666e-11 4316 1226 4.1666666666666665e-11 4316 1986 8.3333333333333330e-11 4316 1218 9.5018296033870872e-28 4316 1982 6.2499999999999991e-11 4316 1217 4.1666666666666665e-11 4317 4317 3.7499999999999995e-10 4317 4982 6.2500000000000004e-11 4317 4313 -2.0833333333333326e-11 4317 5008 -1.0416666666666668e-11 4317 5010 -2.0194839173657902e-27 4317 4320 6.2499999999999991e-11 4317 4315 1.6155871338926322e-27 4317 4988 1.0416666666666665e-11 4317 1987 -4.5860624244724788e-28 4317 1773 -5.2083333333333334e-11 4317 1990 1.0416666666666674e-11 4317 1989 -1.0416666666666666e-11 4317 1213 -2.6253290925755273e-27 4317 2005 1.0416666666666669e-11 4317 2322 -1.4583333333333332e-10 4317 2004 -5.2083333333333334e-11 4317 1211 6.2499999999999991e-11 4317 1216 -6.2500000000000004e-11 4317 1769 1.0416666666666666e-11 4318 4318 2.4999999999999996e-10 4318 4319 -2.0833333333333326e-11 4318 5004 -4.1666666666666665e-11 4318 4316 4.1666666666666665e-11 4318 5005 2.0833333333333326e-11 4318 5006 2.0833333333333329e-11 4318 5007 2.0833333333333332e-11 4318 5002 -4.1666666666666665e-11 4318 4314 -2.0833333333333326e-11 4318 5009 -2.0833333333333332e-11 4318 5003 2.0833333333333326e-11 4318 4315 4.1666666666666665e-11 4318 1786 2.0833333333333332e-11 4318 1993 2.0833333333333332e-11 4318 2096 2.0833333333333332e-11 4318 1075 2.0833333333333326e-11 4318 816 4.1666666666666665e-11 4318 1223 4.1666666666666665e-11 4318 1228 -2.0833333333333326e-11 4319 4319 3.1250000000000001e-10 4319 5004 6.2499999999999991e-11 4319 4318 -2.0833333333333326e-11 4319 5011 1.0416666666666669e-11 4319 4320 6.2499999999999991e-11 4319 5010 -2.2470898404921788e-28 4319 5009 1.0416666666666671e-11 4319 5003 1.0416666666666665e-11 4319 4315 1.6155871338926322e-27 4319 1786 -2.0833333333333339e-11 4319 1223 -2.6253290925755273e-27 4319 1075 1.0416666666666666e-11 4319 1762 1.0416666666666666e-11 4319 1758 1.0416666666666667e-10 4319 1757 5.2083333333333334e-11 4319 1210 -4.1666666666666665e-11 4320 4320 4.9999999999999993e-10 4320 5008 -2.0194839173657902e-27 4320 5010 -1.6155871338926322e-27 4320 4317 6.2500000000000004e-11 4320 5011 -1.0416666666666669e-11 4320 4319 6.2500000000000004e-11 4320 5009 -2.0194839173657902e-27 4320 4315 6.4623485355705287e-27 4320 2322 -5.2083333333333328e-11 4320 1773 -8.3333333333333330e-11 4320 2128 3.1250000000000002e-11 4320 1779 -4.1666666666666665e-11 4320 1772 -1.2499999999999998e-10 4320 1225 -1.0416666666666674e-11 4320 1771 -9.6935228033557931e-27 4320 1215 5.2083333333333334e-11 4320 1766 1.0416666666666666e-11 4320 1769 -1.0416666666666666e-11 4320 1758 5.2083333333333334e-11 4320 1757 1.0416666666666667e-10 4320 1210 -4.1666666666666665e-11 4321 4321 2.5000000000000002e-10 4321 5020 -4.1666666666666665e-11 4321 5015 2.0833333333333332e-11 4321 5026 2.0833333333333326e-11 4321 5021 2.0833333333333326e-11 4321 5025 -4.1666666666666665e-11 4321 5014 2.0833333333333332e-11 4321 5016 -2.0833333333333326e-11 4321 5013 4.1666666666666665e-11 4321 4322 -2.0833333333333326e-11 4322 4322 2.4999999999999996e-10 4322 5026 1.0416666666666665e-11 4322 4676 1.0416666666666665e-11 4322 5015 -2.0833333333333339e-11 4322 4670 1.0416666666666663e-11 4322 4669 6.2500000000000004e-11 4322 4324 -2.0833333333333326e-11 4322 5014 -2.0833333333333339e-11 4322 5016 -1.0416666666666663e-11 4322 5013 -6.2500000000000004e-11 4322 4321 -2.0833333333333326e-11 4323 4323 3.3333333333333332e-10 4324 4324 2.5000000000000002e-10 4324 4659 -4.1666666666666665e-11 4324 4666 2.0833333333333326e-11 4324 4665 -4.1666666666666665e-11 4324 5014 2.0833333333333332e-11 4324 4676 2.0833333333333326e-11 4324 5015 2.0833333333333332e-11 4324 4670 2.0833333333333326e-11 4324 4669 -4.1666666666666665e-11 4324 4322 -2.0833333333333326e-11 4325 4325 3.3333333333333332e-10 4326 4326 1.2499999999999998e-10 4327 4327 1.6666666666666666e-10 4328 4328 1.2499999999999998e-10 4329 4329 1.6666666666666666e-10 4330 4330 1.2499999999999998e-10 4331 4331 1.2499999999999998e-10 4332 4332 3.7499999999999995e-10 4332 5043 4.1666666666666665e-11 4332 5025 -4.1666666666666671e-11 4332 5029 -4.1666666666666665e-11 4332 5024 -1.6666666666666666e-10 4332 4335 -6.2500000000000004e-11 4332 5023 2.0833333333333326e-11 4332 5022 -4.1666666666666665e-11 4332 5021 2.0833333333333326e-11 4332 5020 -4.1666666666666665e-11 4333 4333 1.2499999999999998e-10 4334 4334 1.6666666666666666e-10 4335 4335 1.6666666666666663e-10 4335 5022 1.0416666666666665e-11 4335 5043 1.0416666666666673e-11 4335 5025 1.0416666666666666e-11 4335 5024 2.0833333333333339e-11 4335 4332 -6.2499999999999991e-11 4335 5037 6.2499999999999991e-11 4335 5029 -1.0416666666666655e-11 4336 4336 2.4999999999999996e-10 4337 4337 2.9166666666666664e-10 4338 4338 2.4999999999999996e-10 4339 4339 1.6666666666666666e-10 4340 4340 3.7500000000000000e-10 4340 5043 -6.2500000000000004e-11 4340 5037 6.2499999999999991e-11 4340 5029 6.2500000000000004e-11 4340 5045 1.0416666666666666e-11 4340 5042 -1.0416666666666665e-11 4340 5048 1.0416666666666666e-11 4340 5039 -1.0416666666666673e-11 4340 5038 -6.2499999999999991e-11 4340 4341 -2.0833333333333326e-11 4341 4341 2.5000000000000002e-10 4341 5050 -4.1666666666666665e-11 4341 5049 2.0833333333333326e-11 4341 5044 -4.1666666666666665e-11 4341 5045 2.0833333333333329e-11 4341 5042 2.0833333333333329e-11 4341 5048 2.0833333333333323e-11 4341 5039 2.0833333333333332e-11 4341 5038 4.1666666666666665e-11 4341 4340 -2.0833333333333326e-11 4342 4342 2.7083333333333328e-10 4343 4343 2.7083333333333328e-10 4344 4344 1.0416666666666666e-10 4345 4345 2.9166666666666664e-10 4346 4346 1.2499999999999998e-10 4347 4347 1.6666666666666666e-10 4348 4348 1.2499999999999998e-10 4349 4349 1.0416666666666666e-10 4350 4350 4.9999999999999993e-10 4350 5053 4.1666666666666665e-11 4350 5057 4.1666666666666665e-11 4350 5046 -1.6666666666666666e-10 4350 4353 -6.2499999999999991e-11 4350 5050 -4.1666666666666671e-11 4350 5049 2.0833333333333326e-11 4350 5044 -4.1666666666666665e-11 4350 5047 -4.1666666666666671e-11 4350 4773 1.6666666666666666e-10 4350 3707 4.1666666666666665e-11 4350 3463 4.1666666666666665e-11 4350 5 6.2499999999999991e-11 4350 2888 -6.2499999999999991e-11 4351 4351 1.6666666666666666e-10 4352 4352 2.4999999999999996e-10 4353 4353 1.6666666666666663e-10 4353 5057 1.0416666666666665e-11 4353 5053 1.0416666666666660e-11 4353 5047 1.0416666666666666e-11 4353 5050 1.0416666666666666e-11 4353 5046 2.0833333333333345e-11 4353 4350 -6.2499999999999991e-11 4353 517 -1.0416666666666665e-11 4353 518 -6.2500000000000004e-11 4353 5 -1.0416666666666666e-11 4354 4354 3.7499999999999995e-10 4354 5027 1.0416666666666666e-11 4354 5022 5.2083333333333334e-11 4354 5024 1.0416666666666667e-10 4354 4361 -4.1666666666666665e-11 4354 5048 1.0416666666666666e-11 4354 5046 5.2083333333333334e-11 4354 5038 -1.0416666666666667e-10 4354 4357 -4.1666666666666665e-11 4354 5039 -1.0416666666666669e-11 4354 5043 -1.0416666666666669e-11 4354 5059 -2.0194839173657902e-27 4354 5041 -1.0416666666666665e-11 4354 5040 -1.0416666666666669e-11 4354 4356 6.4623485355705287e-27 4354 4355 6.2500000000000004e-11 4355 4355 4.3749999999999999e-10 4355 5059 -1.0416666666666668e-11 4355 4356 1.6155871338926322e-27 4355 5057 -1.0416666666666666e-11 4355 5038 -5.2083333333333334e-11 4355 5050 5.2083333333333328e-11 4355 5046 1.4583333333333335e-10 4355 4357 -6.2500000000000004e-11 4355 5041 -2.0194839173657902e-27 4355 5040 1.0416666666666669e-11 4355 4354 6.2499999999999991e-11 4355 2319 1.0416666666666665e-11 4355 2318 5.2083333333333334e-11 4355 813 1.0416666666666667e-10 4355 1691 -4.1666666666666665e-11 4355 825 -1.0416666666666666e-11 4355 824 -6.4623485355705287e-27 4356 4356 6.0416666666666660e-10 4356 5059 9.3750000000000012e-11 4356 4355 9.5018296033870872e-28 4356 4706 6.2499999999999991e-11 4356 4364 4.1666666666666665e-11 4356 5024 -1.0416666666666665e-11 4356 4701 -1.0416666666666666e-11 4356 4710 8.3333333333333330e-11 4356 4362 9.5018296033870872e-28 4356 5027 6.2499999999999991e-11 4356 4707 1.0416666666666666e-11 4356 4361 4.1666666666666665e-11 4356 5041 9.3750000000000012e-11 4356 5040 -3.6295685768920020e-28 4356 4354 5.6797985175912850e-27 4356 2319 6.2499999999999991e-11 4356 813 -1.0416666666666666e-11 4356 1691 4.1666666666666665e-11 4356 2316 -1.0416666666666666e-11 4356 2321 8.3333333333333330e-11 4356 1689 9.5018296033870872e-28 4356 1979 -1.0416666666666666e-11 4357 4357 2.0833333333333334e-10 4357 5039 2.0833333333333329e-11 4357 5040 2.8940292364521930e-29 4357 5038 4.1666666666666678e-11 4357 4354 -4.1666666666666665e-11 4357 5057 -8.8938459461701536e-29 4357 4355 -6.2500000000000004e-11 4357 5046 -4.1666666666666665e-11 4357 5048 2.0833333333333329e-11 4357 5050 -4.1666666666666665e-11 4358 4358 1.8750000000000002e-10 4359 4359 2.7083333333333328e-10 4360 4360 1.8750000000000000e-10 4361 4361 2.2916666666666665e-10 4361 5041 2.0833333333333329e-11 4361 5043 2.8940292364521930e-29 4361 5024 -4.1666666666666678e-11 4361 4354 -4.1666666666666665e-11 4361 5022 -4.1666666666666671e-11 4361 4710 2.0833333333333329e-11 4361 4356 4.1666666666666665e-11 4361 5027 2.0833333333333329e-11 4361 4709 2.0833333333333332e-11 4361 5028 2.0833333333333326e-11 4361 4707 4.1666666666666665e-11 4361 4362 -2.0833333333333326e-11 4362 4362 2.4999999999999996e-10 4362 4702 1.0416666666666666e-11 4362 4706 1.0416666666666665e-11 4362 4701 6.2499999999999991e-11 4362 4364 -2.0833333333333326e-11 4362 4710 -2.0833333333333339e-11 4362 4356 1.6155871338926322e-27 4362 5027 1.0416666666666665e-11 4362 4709 -2.0833333333333339e-11 4362 5028 1.0416666666666666e-11 4362 4707 -6.2500000000000004e-11 4362 4361 -2.0833333333333326e-11 4363 4363 3.3333333333333332e-10 4364 4364 2.4999999999999996e-10 4364 4705 -4.1666666666666665e-11 4364 4356 4.1666666666666665e-11 4364 4706 2.0833333333333326e-11 4364 4709 2.0833333333333332e-11 4364 4710 2.0833333333333332e-11 4364 4701 -4.1666666666666665e-11 4364 4362 -2.0833333333333326e-11 4364 4702 2.0833333333333326e-11 4364 2321 2.0833333333333329e-11 4364 2320 2.0833333333333332e-11 4364 1984 2.0833333333333326e-11 4364 1979 -4.1666666666666665e-11 4364 1689 -2.0833333333333326e-11 4365 4365 1.2499999999999998e-10 4366 4366 2.5000000000000002e-10 4366 4807 -4.1666666666666665e-11 4366 5064 2.0833333333333329e-11 4366 4812 2.0833333333333326e-11 4366 4808 2.0833333333333326e-11 4366 4801 -4.1666666666666665e-11 4366 5063 2.0833333333333332e-11 4366 4806 2.0833333333333326e-11 4366 4805 -4.1666666666666665e-11 4366 4367 -2.0833333333333326e-11 4367 4367 2.4999999999999996e-10 4367 4812 1.0416666666666665e-11 4367 4747 1.0416666666666666e-11 4367 5064 -2.0833333333333332e-11 4367 4741 1.0416666666666665e-11 4367 4740 6.2499999999999991e-11 4367 4369 -2.0833333333333326e-11 4367 5063 -2.0833333333333339e-11 4367 4806 1.0416666666666666e-11 4367 4805 6.2499999999999991e-11 4367 4366 -2.0833333333333326e-11 4368 4368 3.3333333333333332e-10 4369 4369 2.5000000000000002e-10 4369 4734 -4.1666666666666665e-11 4369 4737 2.0833333333333326e-11 4369 4736 -4.1666666666666665e-11 4369 5063 2.0833333333333329e-11 4369 4747 2.0833333333333326e-11 4369 5064 2.0833333333333332e-11 4369 4741 2.0833333333333326e-11 4369 4740 -4.1666666666666665e-11 4369 4367 -2.0833333333333326e-11 4370 4370 3.3333333333333332e-10 4371 4371 1.2499999999999998e-10 4372 4372 1.6666666666666666e-10 4373 4373 1.2499999999999998e-10 4374 4374 1.6666666666666666e-10 4375 4375 1.2499999999999998e-10 4376 4376 1.2499999999999998e-10 4377 4377 2.4999999999999996e-10 4377 4481 2.0833333333333326e-11 4377 4378 -2.0833333333333326e-11 4377 4475 -4.1666666666666665e-11 4377 4471 -4.1666666666666665e-11 4377 5069 2.0833333333333332e-11 4377 4476 2.0833333333333326e-11 4377 2033 -2.0833333333333332e-11 4377 2034 2.0833333333333332e-11 4377 2035 4.1666666666666665e-11 4377 1577 -2.0833333333333326e-11 4377 2041 -2.0833333333333329e-11 4377 1573 4.1666666666666665e-11 4377 2042 -2.0833333333333326e-11 4378 4378 2.4999999999999996e-10 4378 4475 6.2499999999999991e-11 4378 4377 -2.0833333333333326e-11 4378 4893 6.2499999999999991e-11 4378 4380 -2.0833333333333326e-11 4378 4894 1.0416666666666665e-11 4378 5069 -2.0833333333333332e-11 4378 4476 1.0416666666666665e-11 4378 2042 -1.0416666666666666e-11 4378 2041 2.0833333333333339e-11 4378 2040 -1.0416666666666666e-11 4378 1573 -2.6253290925755273e-27 4379 4379 3.3333333333333332e-10 4380 4380 2.4999999999999996e-10 4380 4891 2.0833333333333326e-11 4380 4893 -4.1666666666666665e-11 4380 4378 -2.0833333333333326e-11 4380 4890 -4.1666666666666665e-11 4380 5069 2.0833333333333329e-11 4380 4894 2.0833333333333326e-11 4380 2043 -2.0833333333333332e-11 4380 2078 2.0833333333333332e-11 4380 2074 -4.1666666666666665e-11 4380 1578 -2.0833333333333326e-11 4380 2041 -2.0833333333333332e-11 4380 2040 -2.0833333333333326e-11 4380 1573 4.1666666666666665e-11 4381 4381 1.2499999999999998e-10 4382 4382 4.5833333333333330e-10 4383 4383 1.2499999999999998e-10 4384 4384 4.5833333333333330e-10 4385 4385 1.0416666666666664e-02 4386 4386 4.9999999999999989e-02 4386 4557 -6.2499999999999986e-03 4386 4565 6.2499999999999986e-03 4386 4554 -6.2499999999999986e-03 4386 4556 -7.3183646642771549e-19 4386 4555 -6.2499999999999986e-03 4386 4564 6.2499999999999986e-03 4386 4558 -2.3039296165316969e-19 4386 4563 -6.2499999999999986e-03 4387 4387 2.0833333333333329e-02 4388 4388 2.9166666666666660e-02 4389 4389 1.0416666666666664e-02 4390 4390 2.0833333333333332e-02 4391 4391 1.0416666666666664e-02 4392 4392 2.9166666666666660e-02 4393 4393 1.0416666666666664e-02 4394 4394 6.6666666666666664e-10 4394 4401 -1.8175355256292112e-27 4394 4260 -4.1666666666666665e-11 4394 4405 -1.8175355256292112e-27 4394 3747 -4.1666666666666665e-11 4394 4407 -1.8175355256292112e-27 4394 3764 -4.1666666666666665e-11 4394 4395 -1.8175355256292112e-27 4394 3710 -4.1666666666666665e-11 4395 4395 2.4999999999999996e-10 4395 4396 9.5018296033870872e-28 4395 3764 2.0833333333333326e-11 4395 4394 -2.2913451068275814e-27 4395 3710 2.0833333333333326e-11 4396 4396 6.6666666666666664e-10 4396 4395 1.6155871338926322e-27 4396 3764 -4.1666666666666665e-11 4396 4399 1.6155871338926322e-27 4396 4212 -4.1666666666666665e-11 4396 4409 1.6155871338926322e-27 4396 4227 -4.1666666666666665e-11 4396 4397 1.6155871338926322e-27 4396 3710 -4.1666666666666665e-11 4397 4397 2.4999999999999996e-10 4397 3715 1.0416666666666666e-11 4397 4829 -2.0833333333333339e-11 4397 4400 -2.2913451068275814e-27 4397 4238 1.0416666666666666e-11 4397 4227 2.0833333333333326e-11 4397 4396 9.5018296033870872e-28 4397 3710 2.0833333333333326e-11 4398 4398 6.6666666666666664e-10 4398 3737 -1.0416666666666666e-11 4398 4416 -8.3333333333333330e-11 4398 4408 1.6155871338926322e-27 4398 4210 -1.0416666666666666e-11 4398 4208 6.2499999999999991e-11 4398 4212 -4.1666666666666665e-11 4398 3750 -1.0416666666666666e-11 4398 4414 -8.3333333333333330e-11 4398 4407 1.6155871338926322e-27 4398 3748 6.2499999999999991e-11 4398 3747 -4.1666666666666665e-11 4398 4415 -8.3333333333333330e-11 4398 4406 -1.8175355256292112e-27 4398 3723 -1.0416666666666666e-11 4398 3722 6.2499999999999991e-11 4398 3721 -4.1666666666666665e-11 4398 4412 -8.3333333333333330e-11 4398 4399 -1.8175355256292112e-27 4398 3765 6.2499999999999991e-11 4398 3764 -4.1666666666666665e-11 4399 4399 2.4999999999999996e-10 4399 4208 1.0416666666666666e-11 4399 4396 9.5018296033870872e-28 4399 4212 2.0833333333333326e-11 4399 4412 2.0833333333333339e-11 4399 4398 -2.2913451068275814e-27 4399 3765 1.0416666666666666e-11 4399 3764 2.0833333333333326e-11 4400 4400 6.6666666666666664e-10 4400 4228 -1.0416666666666666e-11 4400 4829 8.3333333333333330e-11 4400 4397 -1.8175355256292112e-27 4400 4238 6.2499999999999991e-11 4400 4227 -4.1666666666666665e-11 4400 4868 8.3333333333333330e-11 4400 4403 1.6155871338926322e-27 4400 3898 -1.0416666666666666e-11 4400 3901 -1.0416666666666666e-11 4400 3902 6.2499999999999991e-11 4400 3899 -4.1666666666666665e-11 4400 4874 8.3333333333333330e-11 4400 4411 -1.8175355256292112e-27 4400 4259 -1.0416666666666666e-11 4400 4266 6.2499999999999991e-11 4400 4260 -4.1666666666666665e-11 4400 4876 -8.3333333333333330e-11 4400 4401 1.6155871338926322e-27 4400 3715 6.2499999999999991e-11 4400 3710 -4.1666666666666665e-11 4401 4401 2.4999999999999996e-10 4401 4394 -2.2913451068275814e-27 4401 4266 1.0416666666666663e-11 4401 4260 2.0833333333333326e-11 4401 4876 2.0833333333333336e-11 4401 4400 9.5018296033870872e-28 4401 3715 1.0416666666666666e-11 4401 3710 2.0833333333333326e-11 4402 4402 6.6666666666666664e-10 4402 3898 -1.0416666666666666e-11 4402 3740 -1.0416666666666666e-11 4402 4824 -8.3333333333333330e-11 4402 4410 -1.8175355256292112e-27 4402 3891 -1.0416666666666666e-11 4402 3897 6.2499999999999991e-11 4402 3899 -4.1666666666666665e-11 4402 4210 -1.0416666666666666e-11 4402 4822 -8.3333333333333330e-11 4402 4409 -1.8175355256292112e-27 4402 4213 6.2499999999999991e-11 4402 4212 -4.1666666666666665e-11 4402 4815 8.3333333333333330e-11 4402 4408 -1.8175355256292112e-27 4402 3737 -1.0416666666666666e-11 4402 3738 6.2499999999999991e-11 4402 3721 -4.1666666666666665e-11 4402 4823 -8.3333333333333330e-11 4402 4403 -1.8175355256292112e-27 4402 4228 -1.0416666666666666e-11 4402 4225 6.2499999999999991e-11 4402 4227 -4.1666666666666665e-11 4403 4403 2.4999999999999996e-10 4403 3897 1.0416666666666663e-11 4403 4238 1.0416666666666663e-11 4403 4868 -2.0833333333333336e-11 4403 4400 9.5018296033870872e-28 4403 3898 6.2500000000000004e-11 4403 3902 1.0416666666666666e-11 4403 3899 2.0833333333333326e-11 4403 4823 2.0833333333333336e-11 4403 4402 -2.2913451068275814e-27 4403 4228 6.2500000000000004e-11 4403 4225 1.0416666666666666e-11 4403 4227 2.0833333333333326e-11 4404 4404 6.6666666666666664e-10 4404 3723 -1.0416666666666666e-11 4404 4425 8.3333333333333330e-11 4404 4406 1.6155871338926322e-27 4404 3750 -1.0416666666666666e-11 4404 3761 6.2499999999999991e-11 4404 3747 -4.1666666666666665e-11 4404 3891 -1.0416666666666666e-11 4404 4259 -1.0416666666666666e-11 4404 4870 -8.3333333333333330e-11 4404 4411 1.6155871338926322e-27 4404 3901 -1.0416666666666666e-11 4404 3900 6.2499999999999991e-11 4404 3899 -4.1666666666666665e-11 4404 4854 8.3333333333333330e-11 4404 4410 1.6155871338926322e-27 4404 3740 -1.0416666666666666e-11 4404 3741 6.2499999999999991e-11 4404 3721 -4.1666666666666665e-11 4404 4871 -8.3333333333333330e-11 4404 4405 1.6155871338926322e-27 4404 4258 6.2499999999999991e-11 4404 4260 -4.1666666666666665e-11 4405 4405 2.4999999999999996e-10 4405 3761 1.0416666666666665e-11 4405 4394 -2.2913451068275814e-27 4405 3747 2.0833333333333326e-11 4405 4871 2.0833333333333336e-11 4405 4404 9.5018296033870872e-28 4405 4258 1.0416666666666665e-11 4405 4260 2.0833333333333326e-11 4406 4406 2.4999999999999996e-10 4406 3741 1.0416666666666665e-11 4406 4425 -2.0833333333333332e-11 4406 4404 9.5018296033870872e-28 4406 3761 1.0416666666666665e-11 4406 3750 6.2499999999999991e-11 4406 3748 1.0416666666666666e-11 4406 3747 2.0833333333333326e-11 4406 4415 2.0833333333333339e-11 4406 4398 -2.2913451068275814e-27 4406 3723 6.2499999999999991e-11 4406 3722 1.0416666666666666e-11 4406 3721 2.0833333333333326e-11 4407 4407 2.4999999999999996e-10 4407 4394 -2.2913451068275814e-27 4407 3765 1.0416666666666663e-11 4407 3764 2.0833333333333326e-11 4407 4414 2.0833333333333336e-11 4407 4398 9.5018296033870872e-28 4407 3748 1.0416666666666666e-11 4407 3747 2.0833333333333326e-11 4408 4408 2.4999999999999996e-10 4408 3722 1.0416666666666663e-11 4408 4416 2.0833333333333336e-11 4408 4398 9.5018296033870872e-28 4408 4208 1.0416666666666666e-11 4408 4210 6.2500000000000004e-11 4408 4213 1.0416666666666663e-11 4408 4212 2.0833333333333326e-11 4408 4815 -2.0833333333333336e-11 4408 4402 -2.2913451068275814e-27 4408 3737 6.2500000000000004e-11 4408 3738 1.0416666666666666e-11 4408 3721 2.0833333333333326e-11 4409 4409 2.4999999999999996e-10 4409 4396 9.5018296033870872e-28 4409 4225 1.0416666666666666e-11 4409 4227 2.0833333333333326e-11 4409 4822 2.0833333333333339e-11 4409 4402 -2.2913451068275814e-27 4409 4213 1.0416666666666666e-11 4409 4212 2.0833333333333326e-11 4410 4410 2.4999999999999996e-10 4410 3738 1.0416666666666666e-11 4410 4824 2.0833333333333339e-11 4410 4402 -2.2913451068275814e-27 4410 3897 1.0416666666666666e-11 4410 3891 6.2499999999999991e-11 4410 3900 1.0416666666666665e-11 4410 3899 2.0833333333333326e-11 4410 4854 -2.0833333333333336e-11 4410 4404 9.5018296033870872e-28 4410 3740 6.2500000000000004e-11 4410 3741 1.0416666666666665e-11 4410 3721 2.0833333333333326e-11 4411 4411 2.4999999999999996e-10 4411 3902 1.0416666666666666e-11 4411 4874 -2.0833333333333339e-11 4411 4400 -2.2913451068275814e-27 4411 4266 1.0416666666666666e-11 4411 4259 6.2499999999999991e-11 4411 4258 1.0416666666666665e-11 4411 4260 2.0833333333333326e-11 4411 4870 2.0833333333333332e-11 4411 4404 9.5018296033870872e-28 4411 3901 6.2499999999999991e-11 4411 3900 1.0416666666666665e-11 4411 3899 2.0833333333333326e-11 4412 4412 4.1666666666666662e-10 4412 4212 2.0833333333333332e-11 4412 3767 2.0833333333333332e-11 4412 4810 2.0833333333333339e-11 4412 4413 8.3333333333333330e-11 4412 4208 -2.0833333333333339e-11 4412 4207 2.0833333333333332e-11 4412 4399 2.0833333333333339e-11 4412 4398 -8.3333333333333330e-11 4412 3765 -2.0833333333333339e-11 4412 3764 2.0833333333333332e-11 4413 4413 6.6666666666666664e-10 4413 3723 1.0416666666666666e-11 4413 4415 8.3333333333333330e-11 4413 4422 -1.8175355256292112e-27 4413 3750 1.0416666666666666e-11 4413 3748 -6.2499999999999991e-11 4413 3756 4.1666666666666665e-11 4413 4210 1.0416666666666666e-11 4413 4412 8.3333333333333330e-11 4413 4810 1.8175355256292112e-27 4413 4208 -6.2499999999999991e-11 4413 4207 4.1666666666666665e-11 4413 4416 8.3333333333333330e-11 4413 4809 -1.6155871338926322e-27 4413 3737 1.0416666666666666e-11 4413 3722 -6.2499999999999991e-11 4413 3736 4.1666666666666665e-11 4413 4414 8.3333333333333330e-11 4413 4417 1.6155871338926322e-27 4413 3765 -6.2499999999999991e-11 4413 3767 4.1666666666666665e-11 4414 4414 4.1666666666666662e-10 4414 3756 2.0833333333333329e-11 4414 3764 2.0833333333333329e-11 4414 4407 2.0833333333333339e-11 4414 4398 -8.3333333333333330e-11 4414 3748 -2.0833333333333336e-11 4414 3747 2.0833333333333332e-11 4414 4417 -2.0833333333333339e-11 4414 4413 8.3333333333333330e-11 4414 3765 -2.0833333333333336e-11 4414 3767 2.0833333333333332e-11 4415 4415 4.1666666666666662e-10 4415 3736 2.0833333333333332e-11 4415 4422 -2.0833333333333339e-11 4415 4413 8.3333333333333330e-11 4415 3756 2.0833333333333332e-11 4415 3750 8.3333333333333330e-11 4415 3748 -2.0833333333333339e-11 4415 3747 2.0833333333333332e-11 4415 4406 2.0833333333333339e-11 4415 4398 -8.3333333333333330e-11 4415 3723 8.3333333333333330e-11 4415 3722 -2.0833333333333339e-11 4415 3721 2.0833333333333332e-11 4416 4416 4.1666666666666662e-10 4416 3721 2.0833333333333329e-11 4416 4408 2.0833333333333339e-11 4416 4398 -8.3333333333333330e-11 4416 4212 2.0833333333333332e-11 4416 4210 8.3333333333333330e-11 4416 4208 -2.0833333333333336e-11 4416 4207 2.0833333333333329e-11 4416 4809 2.0833333333333339e-11 4416 4413 8.3333333333333330e-11 4416 3737 8.3333333333333330e-11 4416 3722 -2.0833333333333336e-11 4416 3736 2.0833333333333332e-11 4417 4417 2.4999999999999996e-10 4417 3748 -1.0416666666666663e-11 4417 4803 2.2913451068275814e-27 4417 3756 -2.0833333333333326e-11 4417 4414 -2.0833333333333336e-11 4417 4413 9.5018296033870872e-28 4417 3765 -1.0416666666666666e-11 4417 3767 -2.0833333333333326e-11 4418 4418 2.0833333333333331e-10 4419 4419 2.0833333333333331e-10 4420 4420 2.4999999999999996e-10 4420 3732 -1.0416666666666665e-11 4420 4423 2.0833333333333332e-11 4420 4473 -9.5018296033870872e-28 4420 3757 -1.0416666666666665e-11 4420 3750 -6.2499999999999991e-11 4420 3753 -1.0416666666666666e-11 4420 3752 -2.0833333333333326e-11 4420 4421 2.0833333333333339e-11 4420 4477 2.2913451068275814e-27 4420 3723 -6.2499999999999991e-11 4420 3728 -1.0416666666666666e-11 4420 3727 -2.0833333333333326e-11 4421 4421 4.1666666666666662e-10 4421 3739 -2.0833333333333332e-11 4421 4424 2.0833333333333339e-11 4421 4482 8.3333333333333330e-11 4421 3760 -2.0833333333333332e-11 4421 3750 -8.3333333333333330e-11 4421 3753 2.0833333333333339e-11 4421 3752 -2.0833333333333332e-11 4421 4420 2.0833333333333339e-11 4421 4477 8.3333333333333330e-11 4421 3723 -8.3333333333333330e-11 4421 3728 2.0833333333333339e-11 4421 3727 -2.0833333333333332e-11 4422 4422 2.4999999999999996e-10 4422 3722 -1.0416666666666666e-11 4422 4415 -2.0833333333333339e-11 4422 4413 -2.2913451068275814e-27 4422 3748 -1.0416666666666666e-11 4422 3750 -6.2499999999999991e-11 4422 3757 -1.0416666666666665e-11 4422 3756 -2.0833333333333326e-11 4422 4423 2.0833333333333332e-11 4422 4719 9.5018296033870872e-28 4422 3723 -6.2499999999999991e-11 4422 3732 -1.0416666666666665e-11 4422 3736 -2.0833333333333326e-11 4423 4423 4.1666666666666662e-10 4423 3727 -2.0833333333333332e-11 4423 4420 2.0833333333333336e-11 4423 4473 8.3333333333333330e-11 4423 3752 -2.0833333333333332e-11 4423 3750 -8.3333333333333330e-11 4423 3757 2.0833333333333336e-11 4423 3756 -2.0833333333333332e-11 4423 4422 2.0833333333333336e-11 4423 4719 -8.3333333333333330e-11 4423 3723 -8.3333333333333330e-11 4423 3732 2.0833333333333336e-11 4423 3736 -2.0833333333333332e-11 4424 4424 2.4999999999999996e-10 4424 3728 -1.0416666666666666e-11 4424 4421 2.0833333333333339e-11 4424 4482 2.2913451068275814e-27 4424 3753 -1.0416666666666666e-11 4424 3750 -6.2499999999999991e-11 4424 3761 -1.0416666666666665e-11 4424 3760 -2.0833333333333326e-11 4424 4425 2.0833333333333332e-11 4424 4840 -9.5018296033870872e-28 4424 3723 -6.2499999999999991e-11 4424 3741 -1.0416666666666665e-11 4424 3739 -2.0833333333333326e-11 4425 4425 4.1666666666666662e-10 4425 3721 -2.0833333333333332e-11 4425 4406 -2.0833333333333336e-11 4425 4404 8.3333333333333330e-11 4425 3747 -2.0833333333333332e-11 4425 3750 -8.3333333333333330e-11 4425 3761 2.0833333333333336e-11 4425 3760 -2.0833333333333332e-11 4425 4424 2.0833333333333336e-11 4425 4840 8.3333333333333330e-11 4425 3723 -8.3333333333333330e-11 4425 3741 2.0833333333333336e-11 4425 3739 -2.0833333333333332e-11 4426 4426 2.0833333333333331e-10 4427 4427 2.0833333333333331e-10 4428 4428 2.0833333333333331e-10 4429 4429 2.0833333333333331e-10 4430 4430 6.6666666666666664e-10 4430 3968 -1.0416666666666666e-11 4430 3780 -1.0416666666666666e-11 4430 4462 -8.3333333333333330e-11 4430 4439 1.6155871338926322e-27 4430 3977 -1.0416666666666666e-11 4430 3976 6.2499999999999991e-11 4430 3966 -4.1666666666666665e-11 4430 4461 -8.3333333333333330e-11 4430 4437 1.6155871338926322e-27 4430 3791 -1.0416666666666666e-11 4430 3807 -1.0416666666666666e-11 4430 3785 -1.0416666666666666e-11 4430 3784 6.2499999999999991e-11 4430 3786 -4.1666666666666665e-11 4430 4455 8.3333333333333330e-11 4430 4443 1.6155871338926322e-27 4430 3797 -1.0416666666666666e-11 4430 3806 6.2499999999999991e-11 4430 3793 -4.1666666666666665e-11 4430 4459 -8.3333333333333330e-11 4430 4431 1.6155871338926322e-27 4430 3777 -1.0416666666666666e-11 4430 3776 6.2499999999999991e-11 4430 3775 -4.1666666666666665e-11 4431 4431 2.4999999999999996e-10 4431 3778 1.0416666666666666e-11 4431 4464 -2.0833333333333339e-11 4431 4432 -2.2913451068275814e-27 4431 3810 1.0416666666666666e-11 4431 3807 6.2499999999999991e-11 4431 3806 1.0416666666666665e-11 4431 3793 2.0833333333333326e-11 4431 4459 2.0833333333333332e-11 4431 4430 9.5018296033870872e-28 4431 3777 6.2499999999999991e-11 4431 3776 1.0416666666666665e-11 4431 3775 2.0833333333333326e-11 4432 4432 6.6666666666666664e-10 4432 3795 -1.0416666666666666e-11 4432 3777 -1.0416666666666666e-11 4432 4464 8.3333333333333330e-11 4432 4431 -1.8175355256292112e-27 4432 3807 -1.0416666666666666e-11 4432 3810 6.2499999999999991e-11 4432 3793 -4.1666666666666665e-11 4432 4852 8.3333333333333330e-11 4432 4435 1.6155871338926322e-27 4432 3890 -1.0416666666666666e-11 4432 3885 -1.0416666666666666e-11 4432 3895 6.2499999999999991e-11 4432 3893 -4.1666666666666665e-11 4432 4538 8.3333333333333330e-11 4432 4445 -1.8175355256292112e-27 4432 3865 -1.0416666666666666e-11 4432 3870 6.2499999999999991e-11 4432 3866 -4.1666666666666665e-11 4432 4864 -8.3333333333333330e-11 4432 4433 1.6155871338926322e-27 4432 3778 6.2499999999999991e-11 4432 3775 -4.1666666666666665e-11 4432 2760 -1.0416666666666666e-11 4432 2409 -1.0416666666666666e-11 4433 4433 2.4999999999999996e-10 4433 3779 1.0416666666666663e-11 4433 4866 -2.0833333333333336e-11 4433 4438 -2.2913451068275814e-27 4433 3871 1.0416666666666666e-11 4433 3870 1.0416666666666663e-11 4433 3866 2.0833333333333326e-11 4433 4864 2.0833333333333336e-11 4433 4432 9.5018296033870872e-28 4433 3778 1.0416666666666666e-11 4433 3775 2.0833333333333326e-11 4433 2760 6.2500000000000004e-11 4433 2409 6.2500000000000004e-11 4434 4434 6.6666666666666664e-10 4434 3890 -1.0416666666666666e-11 4434 3740 -1.0416666666666666e-11 4434 4452 -8.3333333333333330e-11 4434 4444 -1.8175355256292112e-27 4434 3891 -1.0416666666666666e-11 4434 3889 6.2499999999999991e-11 4434 3893 -4.1666666666666665e-11 4434 3788 -1.0416666666666666e-11 4434 3797 -1.0416666666666666e-11 4434 4450 -8.3333333333333330e-11 4434 4443 -1.8175355256292112e-27 4434 3785 -1.0416666666666666e-11 4434 3787 6.2499999999999991e-11 4434 3786 -4.1666666666666665e-11 4434 4451 -8.3333333333333330e-11 4434 4442 -1.8175355256292112e-27 4434 3726 -1.0416666666666666e-11 4434 3725 6.2499999999999991e-11 4434 3724 -4.1666666666666665e-11 4434 4448 -8.3333333333333330e-11 4434 4435 -1.8175355256292112e-27 4434 3795 -1.0416666666666666e-11 4434 3794 6.2499999999999991e-11 4434 3793 -4.1666666666666665e-11 4435 4435 2.4999999999999996e-10 4435 3889 1.0416666666666663e-11 4435 3810 1.0416666666666663e-11 4435 4852 -2.0833333333333336e-11 4435 4432 9.5018296033870872e-28 4435 3890 6.2500000000000004e-11 4435 3895 1.0416666666666666e-11 4435 3893 2.0833333333333326e-11 4435 4448 2.0833333333333336e-11 4435 4434 -2.2913451068275814e-27 4435 3795 6.2500000000000004e-11 4435 3794 1.0416666666666666e-11 4435 3793 2.0833333333333326e-11 4436 4436 6.6666666666666664e-10 4436 3840 -1.0416666666666666e-11 4436 3970 -1.0416666666666666e-11 4436 4601 8.3333333333333330e-11 4436 4447 1.6155871338926322e-27 4436 3844 -1.0416666666666666e-11 4436 3848 6.2499999999999991e-11 4436 3847 -4.1666666666666665e-11 4436 4517 8.3333333333333330e-11 4436 4446 -1.8175355256292112e-27 4436 3731 -1.0416666666666666e-11 4436 3791 -1.0416666666666666e-11 4436 3726 -1.0416666666666666e-11 4436 3742 6.2499999999999991e-11 4436 3724 -4.1666666666666665e-11 4436 4458 -8.3333333333333330e-11 4436 4442 1.6155871338926322e-27 4436 3788 -1.0416666666666666e-11 4436 3792 6.2499999999999991e-11 4436 3786 -4.1666666666666665e-11 4436 4887 -8.3333333333333330e-11 4436 4437 -1.8175355256292112e-27 4436 3968 -1.0416666666666666e-11 4436 3967 6.2499999999999991e-11 4436 3966 -4.1666666666666665e-11 4437 4437 2.4999999999999996e-10 4437 3792 1.0416666666666666e-11 4437 3976 1.0416666666666665e-11 4437 4461 2.0833333333333332e-11 4437 4430 9.5018296033870872e-28 4437 3791 6.2499999999999991e-11 4437 3784 1.0416666666666665e-11 4437 3786 2.0833333333333326e-11 4437 4887 2.0833333333333339e-11 4437 4436 -2.2913451068275814e-27 4437 3968 6.2499999999999991e-11 4437 3967 1.0416666666666666e-11 4437 3966 2.0833333333333326e-11 4438 4438 6.6666666666666664e-10 4438 3867 -1.0416666666666666e-11 4438 4866 8.3333333333333330e-11 4438 4433 -1.8175355256292112e-27 4438 3871 6.2499999999999991e-11 4438 3866 -4.1666666666666665e-11 4438 4515 8.3333333333333330e-11 4438 4441 -1.8175355256292112e-27 4438 3839 -1.0416666666666666e-11 4438 3977 -1.0416666666666666e-11 4438 3844 -1.0416666666666666e-11 4438 3849 6.2499999999999991e-11 4438 3847 -4.1666666666666665e-11 4438 4604 8.3333333333333330e-11 4438 4447 -1.8175355256292112e-27 4438 3970 -1.0416666666666666e-11 4438 3978 6.2499999999999991e-11 4438 3966 -4.1666666666666665e-11 4438 4885 8.3333333333333330e-11 4438 4439 -1.8175355256292112e-27 4438 3780 -1.0416666666666666e-11 4438 3779 6.2499999999999991e-11 4438 3775 -4.1666666666666665e-11 4438 2409 -1.0416666666666666e-11 4438 2760 -1.0416666666666666e-11 4439 4439 2.4999999999999996e-10 4439 3978 1.0416666666666666e-11 4439 3776 1.0416666666666665e-11 4439 4462 2.0833333333333336e-11 4439 4430 9.5018296033870872e-28 4439 3977 6.2500000000000004e-11 4439 3976 1.0416666666666665e-11 4439 3966 2.0833333333333326e-11 4439 4885 -2.0833333333333339e-11 4439 4438 -2.2913451068275814e-27 4439 3780 6.2499999999999991e-11 4439 3779 1.0416666666666666e-11 4439 3775 2.0833333333333326e-11 4440 4440 6.6666666666666664e-10 4440 3839 -1.0416666666666666e-11 4440 3731 -1.0416666666666666e-11 4440 4510 -8.3333333333333330e-11 4440 4446 1.6155871338926322e-27 4440 3840 -1.0416666666666666e-11 4440 3838 6.2499999999999991e-11 4440 3847 -4.1666666666666665e-11 4440 3891 -1.0416666666666666e-11 4440 3865 -1.0416666666666666e-11 4440 4508 -8.3333333333333330e-11 4440 4445 1.6155871338926322e-27 4440 3885 -1.0416666666666666e-11 4440 3894 6.2499999999999991e-11 4440 3893 -4.1666666666666665e-11 4440 4511 -8.3333333333333330e-11 4440 4444 1.6155871338926322e-27 4440 3740 -1.0416666666666666e-11 4440 3730 6.2499999999999991e-11 4440 3724 -4.1666666666666665e-11 4440 4509 -8.3333333333333330e-11 4440 4441 1.6155871338926322e-27 4440 3867 -1.0416666666666666e-11 4440 3864 6.2499999999999991e-11 4440 3866 -4.1666666666666665e-11 4441 4441 2.4999999999999996e-10 4441 3838 1.0416666666666665e-11 4441 3871 1.0416666666666666e-11 4441 4515 -2.0833333333333339e-11 4441 4438 -2.2913451068275814e-27 4441 3839 6.2499999999999991e-11 4441 3849 1.0416666666666666e-11 4441 3847 2.0833333333333326e-11 4441 4509 2.0833333333333336e-11 4441 4440 9.5018296033870872e-28 4441 3867 6.2500000000000004e-11 4441 3864 1.0416666666666665e-11 4441 3866 2.0833333333333326e-11 4442 4442 2.4999999999999996e-10 4442 3742 1.0416666666666663e-11 4442 4458 2.0833333333333336e-11 4442 4436 9.5018296033870872e-28 4442 3792 1.0416666666666666e-11 4442 3788 6.2500000000000004e-11 4442 3787 1.0416666666666663e-11 4442 3786 2.0833333333333326e-11 4442 4451 2.0833333333333336e-11 4442 4434 -2.2913451068275814e-27 4442 3726 6.2500000000000004e-11 4442 3725 1.0416666666666666e-11 4442 3724 2.0833333333333326e-11 4443 4443 2.4999999999999996e-10 4443 3784 1.0416666666666665e-11 4443 4455 -2.0833333333333336e-11 4443 4430 9.5018296033870872e-28 4443 3806 1.0416666666666665e-11 4443 3797 6.2500000000000004e-11 4443 3794 1.0416666666666666e-11 4443 3793 2.0833333333333326e-11 4443 4450 2.0833333333333339e-11 4443 4434 -2.2913451068275814e-27 4443 3785 6.2499999999999991e-11 4443 3787 1.0416666666666666e-11 4443 3786 2.0833333333333326e-11 4444 4444 2.4999999999999996e-10 4444 3725 1.0416666666666666e-11 4444 4452 2.0833333333333339e-11 4444 4434 -2.2913451068275814e-27 4444 3889 1.0416666666666666e-11 4444 3891 6.2499999999999991e-11 4444 3894 1.0416666666666665e-11 4444 3893 2.0833333333333326e-11 4444 4511 2.0833333333333336e-11 4444 4440 9.5018296033870872e-28 4444 3740 6.2500000000000004e-11 4444 3730 1.0416666666666665e-11 4444 3724 2.0833333333333326e-11 4445 4445 2.4999999999999996e-10 4445 3895 1.0416666666666666e-11 4445 4538 -2.0833333333333339e-11 4445 4432 -2.2913451068275814e-27 4445 3870 1.0416666666666666e-11 4445 3865 6.2499999999999991e-11 4445 3864 1.0416666666666665e-11 4445 3866 2.0833333333333326e-11 4445 4508 2.0833333333333332e-11 4445 4440 9.5018296033870872e-28 4445 3885 6.2499999999999991e-11 4445 3894 1.0416666666666665e-11 4445 3893 2.0833333333333326e-11 4446 4446 2.4999999999999996e-10 4446 3730 1.0416666666666665e-11 4446 4510 2.0833333333333332e-11 4446 4440 9.5018296033870872e-28 4446 3838 1.0416666666666665e-11 4446 3840 6.2499999999999991e-11 4446 3848 1.0416666666666666e-11 4446 3847 2.0833333333333326e-11 4446 4517 -2.0833333333333339e-11 4446 4436 -2.2913451068275814e-27 4446 3731 6.2499999999999991e-11 4446 3742 1.0416666666666666e-11 4446 3724 2.0833333333333326e-11 4447 4447 2.4999999999999996e-10 4447 3849 1.0416666666666663e-11 4447 4604 -2.0833333333333336e-11 4447 4438 -2.2913451068275814e-27 4447 3978 1.0416666666666666e-11 4447 3970 6.2500000000000004e-11 4447 3967 1.0416666666666663e-11 4447 3966 2.0833333333333326e-11 4447 4601 -2.0833333333333336e-11 4447 4436 9.5018296033870872e-28 4447 3844 6.2500000000000004e-11 4447 3848 1.0416666666666666e-11 4447 3847 2.0833333333333326e-11 4448 4448 4.1666666666666662e-10 4448 3893 2.0833333333333329e-11 4448 3796 2.0833333333333329e-11 4448 4845 2.0833333333333339e-11 4448 4449 8.3333333333333330e-11 4448 3890 8.3333333333333330e-11 4448 3889 -2.0833333333333332e-11 4448 3888 2.0833333333333332e-11 4448 4435 2.0833333333333339e-11 4448 4434 -8.3333333333333330e-11 4448 3795 8.3333333333333330e-11 4448 3794 -2.0833333333333332e-11 4448 3793 2.0833333333333332e-11 4449 4449 6.6666666666666664e-10 4449 3785 1.0416666666666666e-11 4449 3726 1.0416666666666666e-11 4449 4451 8.3333333333333330e-11 4449 4457 1.8175355256292112e-27 4449 3788 1.0416666666666666e-11 4449 3787 -6.2499999999999991e-11 4449 3789 4.1666666666666665e-11 4449 3891 1.0416666666666666e-11 4449 3795 1.0416666666666666e-11 4449 4448 8.3333333333333330e-11 4449 4845 1.8175355256292112e-27 4449 3890 1.0416666666666666e-11 4449 3889 -6.2499999999999991e-11 4449 3888 4.1666666666666665e-11 4449 4452 8.3333333333333330e-11 4449 4844 1.8175355256292112e-27 4449 3740 1.0416666666666666e-11 4449 3725 -6.2499999999999991e-11 4449 3739 4.1666666666666665e-11 4449 4450 8.3333333333333330e-11 4449 4453 -1.8175355256292112e-27 4449 3797 1.0416666666666666e-11 4449 3794 -6.2499999999999991e-11 4449 3796 4.1666666666666665e-11 4450 4450 4.1666666666666662e-10 4450 3789 2.0833333333333329e-11 4450 3793 2.0833333333333329e-11 4450 4443 2.0833333333333339e-11 4450 4434 -8.3333333333333330e-11 4450 3785 8.3333333333333330e-11 4450 3787 -2.0833333333333339e-11 4450 3786 2.0833333333333332e-11 4450 4453 -2.0833333333333339e-11 4450 4449 8.3333333333333330e-11 4450 3797 8.3333333333333330e-11 4450 3794 -2.0833333333333339e-11 4450 3796 2.0833333333333332e-11 4451 4451 4.1666666666666662e-10 4451 3739 2.0833333333333329e-11 4451 4457 2.0833333333333339e-11 4451 4449 8.3333333333333330e-11 4451 3789 2.0833333333333332e-11 4451 3788 8.3333333333333330e-11 4451 3787 -2.0833333333333332e-11 4451 3786 2.0833333333333329e-11 4451 4442 2.0833333333333339e-11 4451 4434 -8.3333333333333330e-11 4451 3726 8.3333333333333330e-11 4451 3725 -2.0833333333333332e-11 4451 3724 2.0833333333333332e-11 4452 4452 4.1666666666666662e-10 4452 3724 2.0833333333333329e-11 4452 4444 2.0833333333333339e-11 4452 4434 -8.3333333333333330e-11 4452 3893 2.0833333333333332e-11 4452 3891 8.3333333333333330e-11 4452 3889 -2.0833333333333339e-11 4452 3888 2.0833333333333329e-11 4452 4844 2.0833333333333339e-11 4452 4449 8.3333333333333330e-11 4452 3740 8.3333333333333330e-11 4452 3725 -2.0833333333333339e-11 4452 3739 2.0833333333333332e-11 4453 4453 2.4999999999999996e-10 4453 3787 -1.0416666666666666e-11 4453 3811 -1.0416666666666665e-11 4453 4456 -2.0833333333333336e-11 4453 4846 -9.5018296033870872e-28 4453 3785 -6.2500000000000004e-11 4453 3790 -1.0416666666666665e-11 4453 3789 -2.0833333333333326e-11 4453 4450 -2.0833333333333339e-11 4453 4449 -2.2913451068275814e-27 4453 3797 -6.2499999999999991e-11 4453 3794 -1.0416666666666666e-11 4453 3796 -2.0833333333333326e-11 4454 4454 4.1666666666666657e-10 4454 3785 1.0416666666666667e-10 4454 3790 -3.6295685768920020e-28 4454 3783 -5.6797985175912850e-27 4454 3797 1.0416666666666667e-10 4454 3816 -6.0115145282367205e-27 4454 4456 1.0416666666666668e-10 4454 3811 1.8812360437258079e-27 4454 3806 -1.8812360437258079e-27 4454 4455 -1.0416666666666667e-10 4454 4460 2.8974861048767764e-27 4454 3784 -2.2851328271989659e-27 4454 1774 4.0642113836986528e-27 4455 4455 4.1666666666666662e-10 4455 3816 1.8812360437258079e-27 4455 3786 -2.0833333333333332e-11 4455 4443 -2.0833333333333339e-11 4455 4430 8.3333333333333330e-11 4455 3797 -9.3749999999999999e-11 4455 3806 1.0416666666666674e-11 4455 3793 -2.0833333333333332e-11 4455 4454 -1.0416666666666667e-10 4455 4460 -2.3107708066186488e-27 4455 3785 -9.3749999999999986e-11 4455 3784 1.0416666666666668e-11 4455 3783 1.8812360437258079e-27 4456 4456 4.1666666666666668e-10 4456 3785 9.3749999999999986e-11 4456 3790 -1.0416666666666671e-11 4456 3783 1.8812360437258079e-27 4456 4454 1.0416666666666667e-10 4456 3797 9.3749999999999999e-11 4456 3816 3.6295685768920020e-28 4456 3811 -1.0416666666666663e-11 4456 3796 2.0833333333333332e-11 4456 4453 -2.0833333333333339e-11 4456 4846 -8.3333333333333330e-11 4456 3789 2.0833333333333332e-11 4456 1774 -1.0034310714411270e-27 4457 4457 2.4999999999999996e-10 4457 3788 6.2500000000000004e-11 4457 3789 2.0833333333333326e-11 4457 4482 9.5018296033870872e-28 4457 3726 6.2500000000000004e-11 4457 3728 1.0416666666666666e-11 4457 3739 2.0833333333333326e-11 4457 3725 1.0416666666666663e-11 4457 4451 2.0833333333333336e-11 4457 4449 2.2913451068275814e-27 4457 3787 1.0416666666666666e-11 4457 1240 1.0416666666666663e-11 4457 2060 2.0833333333333336e-11 4458 4458 4.1666666666666662e-10 4458 3788 8.3333333333333330e-11 4458 3792 -2.0833333333333336e-11 4458 4888 -8.3333333333333330e-11 4458 3726 8.3333333333333330e-11 4458 3742 -2.0833333333333336e-11 4458 3743 2.0833333333333332e-11 4458 3724 2.0833333333333329e-11 4458 4442 2.0833333333333339e-11 4458 4436 -8.3333333333333330e-11 4458 3786 2.0833333333333332e-11 4458 1243 2.0833333333333329e-11 4458 2067 -2.0833333333333339e-11 4459 4459 4.5833333333333330e-10 4459 3782 1.0416666666666668e-11 4459 4468 -4.1666666666666671e-11 4459 3816 5.2083333333333334e-11 4459 4460 -8.3333333333333330e-11 4459 3807 1.3541666666666666e-10 4459 3806 1.6155871338926322e-27 4459 3793 2.0833333333333332e-11 4459 4431 2.0833333333333336e-11 4459 4430 -8.3333333333333330e-11 4459 3777 7.2916666666666660e-11 4459 3776 -4.8467614016778965e-27 4459 3775 2.0833333333333332e-11 4460 4460 4.1666666666666662e-10 4460 3784 1.0416666666666666e-11 4460 3783 -1.0416666666666668e-11 4460 3776 1.2499999999999998e-10 4460 3782 1.0416666666666666e-11 4460 3797 -4.5860624244724788e-28 4460 3777 3.1250000000000002e-11 4460 3807 -5.2083333333333334e-11 4460 3816 -6.2500000000000004e-11 4460 4459 -8.3333333333333343e-11 4460 3806 1.0416666666666663e-11 4460 4455 -2.0194839173657902e-27 4460 4454 3.2311742677852644e-27 4460 3785 -2.2470898404921788e-28 4460 1229 3.0430870179097285e-28 4460 1760 -2.0833333333333332e-11 4460 1757 -4.1666666666666665e-11 4460 1206 4.1666666666666665e-11 4461 4461 4.1666666666666657e-10 4461 3791 9.3749999999999986e-11 4461 3784 -1.0416666666666673e-11 4461 3968 9.3749999999999999e-11 4461 3976 -1.0416666666666666e-11 4461 3966 2.0833333333333332e-11 4461 4437 2.0833333333333336e-11 4461 4430 -8.3333333333333330e-11 4461 3786 2.0833333333333332e-11 4461 1230 1.8812360437258079e-27 4461 1803 1.0416666666666667e-10 4461 1471 3.6295685768920020e-28 4461 1785 1.0034310714411270e-27 4462 4462 4.5833333333333330e-10 4462 3977 1.3541666666666666e-10 4462 3976 -1.1309109937248425e-26 4462 3780 7.2916666666666660e-11 4462 3776 -1.6155871338926322e-27 4462 3775 2.0833333333333332e-11 4462 4439 2.0833333333333339e-11 4462 4430 -8.3333333333333330e-11 4462 3966 2.0833333333333332e-11 4462 1471 5.2083333333333334e-11 4462 1811 4.1666666666666665e-11 4462 1785 8.3333333333333330e-11 4462 1209 1.0416666666666665e-11 4463 4463 2.4999999999999998e-02 4463 4466 2.0833333333333337e-03 4463 3813 -1.0416666666666664e-03 4463 3807 -6.2500000000000003e-03 4463 3810 -1.0416666666666664e-03 4463 3800 -2.0833333333333329e-03 4463 4464 2.0833333333333337e-03 4463 4865 -1.0254392617697373e-19 4463 3777 -6.2500000000000003e-03 4463 3778 -1.0416666666666664e-03 4463 2412 -1.0416666666666664e-03 4463 3623 -6.0159191589756597e-20 4463 2410 -2.0833333333333329e-03 4464 4464 2.0833333541666665e-02 4464 3800 -2.0833333333333333e-03 4464 3775 -2.0833333333333332e-11 4464 4431 -2.0833333333333339e-11 4464 4432 8.3333333333333330e-11 4464 3807 -4.1666667083333324e-03 4464 3810 1.0416666770833333e-03 4464 3793 -2.0833333333333332e-11 4464 4463 2.0833333333333337e-03 4464 4865 -8.3333333333333315e-03 4464 3777 -4.1666667083333333e-03 4464 3778 1.0416666770833337e-03 4464 2410 -2.0833333333333329e-03 4465 4465 2.4999999999999996e-10 4465 3781 -1.0416666666666666e-11 4465 4467 2.0833333333333339e-11 4465 5004 2.2913451068275814e-27 4465 3815 -1.0416666666666666e-11 4465 3807 -6.2499999999999991e-11 4465 3813 -1.0416666666666665e-11 4465 3804 -2.0833333333333326e-11 4465 4466 2.0833333333333332e-11 4465 3777 -6.2499999999999991e-11 4465 3661 -9.5018296033870872e-28 4465 2412 -1.0416666666666665e-11 4465 290 -2.0833333333333326e-11 4466 4466 2.0833333541666665e-02 4466 3804 -2.0833333333333332e-11 4466 4463 2.0833333333333333e-03 4466 3807 -4.1666667083333333e-03 4466 3813 1.0416666770833337e-03 4466 3800 -2.0833333333333329e-03 4466 4465 2.0833333333333336e-11 4466 3777 -4.1666667083333324e-03 4466 2410 -2.0833333333333333e-03 4466 3623 8.3333333333333315e-03 4466 3661 8.3333333333333330e-11 4466 2412 1.0416666770833331e-03 4466 290 -2.0833333333333332e-11 4467 4467 4.5833333333333325e-10 4467 3816 -5.2083333333333334e-11 4467 4468 4.1666666666666665e-11 4467 5011 8.3333333333333330e-11 4467 3782 -1.0416666666666665e-11 4467 3777 -7.2916666666666660e-11 4467 3781 3.2311742677852644e-27 4467 4465 2.0833333333333339e-11 4467 5004 8.3333333333333330e-11 4467 3807 -1.3541666666666669e-10 4467 3815 8.0779356694631609e-27 4467 3804 -2.0833333333333332e-11 4467 290 -2.0833333333333332e-11 4468 4468 3.3333333333333327e-10 4468 3776 -4.1666666666666665e-11 4468 4459 -4.1666666666666678e-11 4468 4460 -6.4623485355705287e-27 4468 3806 -2.2851328271989659e-27 4468 3807 -4.1666666666666671e-11 4468 3816 -6.2499999999999991e-11 4468 3815 1.8812360437258079e-27 4468 4467 4.1666666666666665e-11 4468 5011 6.4623485355705287e-27 4468 3777 -1.6666666666666666e-10 4468 3781 -4.1666666666666665e-11 4468 3782 -6.2500000000000004e-11 4469 4469 6.6666666666666664e-10 4469 4472 -1.8175355256292112e-27 4469 4140 -4.1666666666666665e-11 4469 4474 -1.8175355256292112e-27 4469 3752 -4.1666666666666665e-11 4469 4478 -1.8175355256292112e-27 4469 3826 -4.1666666666666665e-11 4469 4470 -1.8175355256292112e-27 4469 3817 -4.1666666666666665e-11 4470 4470 2.4999999999999996e-10 4470 3817 2.0833333333333326e-11 4470 3826 2.0833333333333326e-11 4470 4469 -2.2913451068275814e-27 4470 1566 1.0416666666666665e-11 4470 2038 2.0833333333333336e-11 4470 2035 -9.5018296033870872e-28 4470 1607 1.0416666666666665e-11 4471 4471 6.6666666666666664e-10 4471 4481 -1.8175355256292112e-27 4471 4377 -4.1666666666666665e-11 4471 4476 1.6155871338926322e-27 4471 4123 -4.1666666666666665e-11 4471 4480 -1.8175355256292112e-27 4471 4140 -4.1666666666666665e-11 4471 4472 1.6155871338926322e-27 4471 3817 -4.1666666666666665e-11 4472 4472 2.4999999999999996e-10 4472 4469 -2.2913451068275814e-27 4472 4140 2.0833333333333326e-11 4472 4471 9.5018296033870872e-28 4472 3817 2.0833333333333326e-11 4473 4473 6.6666666666666664e-10 4473 3723 -1.0416666666666666e-11 4473 4423 8.3333333333333330e-11 4473 4420 -1.6155871338926322e-27 4473 3750 -1.0416666666666666e-11 4473 3757 6.2499999999999991e-11 4473 3752 -4.1666666666666665e-11 4473 4126 -1.0416666666666666e-11 4473 4720 -8.3333333333333330e-11 4473 4480 1.6155871338926322e-27 4473 4124 6.2499999999999991e-11 4473 4123 -4.1666666666666665e-11 4473 4721 -8.3333333333333330e-11 4473 4479 1.6155871338926322e-27 4473 3733 -1.0416666666666666e-11 4473 3732 6.2499999999999991e-11 4473 3727 -4.1666666666666665e-11 4473 4718 -8.3333333333333330e-11 4473 4474 1.6155871338926322e-27 4473 4141 6.2499999999999991e-11 4473 4140 -4.1666666666666665e-11 4474 4474 2.4999999999999996e-10 4474 3757 1.0416666666666665e-11 4474 4469 -2.2913451068275814e-27 4474 3752 2.0833333333333326e-11 4474 4718 2.0833333333333336e-11 4474 4473 9.5018296033870872e-28 4474 4141 1.0416666666666665e-11 4474 4140 2.0833333333333326e-11 4475 4475 6.6666666666666654e-10 4475 3788 -1.0416666666666666e-11 4475 4378 6.2499999999999991e-11 4475 4377 -4.1666666666666665e-11 4475 3726 -1.0416666666666666e-11 4475 3746 6.2499999999999991e-11 4475 3727 -4.1666666666666665e-11 4475 3733 -1.0416666666666666e-11 4475 4730 8.3333333333333330e-11 4475 4479 -1.8175355256292112e-27 4475 4126 -1.0416666666666666e-11 4475 4137 6.2499999999999991e-11 4475 4123 -4.1666666666666665e-11 4475 5069 -8.3333333333333330e-11 4475 4476 -1.8175355256292112e-27 4475 1573 -1.0416666666666666e-11 4475 2041 8.3333333333333330e-11 4475 2042 1.8175355256292112e-27 4475 1233 -1.0416666666666666e-11 4475 1242 6.2499999999999991e-11 4475 1241 -4.1666666666666665e-11 4475 2066 8.3333333333333330e-11 4475 2065 1.8175355256292112e-27 4476 4476 2.4999999999999996e-10 4476 4137 1.0416666666666663e-11 4476 4471 9.5018296033870872e-28 4476 4123 2.0833333333333326e-11 4476 5069 2.0833333333333336e-11 4476 4475 -2.2913451068275814e-27 4476 4378 1.0416666666666666e-11 4476 4377 2.0833333333333326e-11 4477 4477 6.6666666666666654e-10 4477 3726 -1.0416666666666666e-11 4477 3728 6.2499999999999991e-11 4477 3727 -4.1666666666666665e-11 4477 3788 -1.0416666666666666e-11 4477 3824 6.2499999999999991e-11 4477 3826 -4.1666666666666665e-11 4477 3750 -1.0416666666666666e-11 4477 4483 -8.3333333333333330e-11 4477 4478 1.6155871338926322e-27 4477 3753 6.2499999999999991e-11 4477 3752 -4.1666666666666665e-11 4477 4421 8.3333333333333330e-11 4477 4420 1.8175355256292112e-27 4477 3723 -1.0416666666666666e-11 4477 1237 -1.0416666666666666e-11 4477 2060 -8.3333333333333330e-11 4477 2065 -1.6155871338926322e-27 4477 1240 6.2499999999999991e-11 4477 1241 -4.1666666666666665e-11 4477 2059 -8.3333333333333330e-11 4477 2061 1.8175355256292112e-27 4477 1602 -1.0416666666666666e-11 4478 4478 2.4999999999999996e-10 4478 4469 -2.2913451068275814e-27 4478 3824 1.0416666666666663e-11 4478 3826 2.0833333333333326e-11 4478 4483 2.0833333333333336e-11 4478 4477 9.5018296033870872e-28 4478 3753 1.0416666666666666e-11 4478 3752 2.0833333333333326e-11 4479 4479 2.4999999999999996e-10 4479 3746 1.0416666666666666e-11 4479 4730 -2.0833333333333339e-11 4479 4475 -2.2913451068275814e-27 4479 4137 1.0416666666666666e-11 4479 4126 6.2499999999999991e-11 4479 4124 1.0416666666666665e-11 4479 4123 2.0833333333333326e-11 4479 4721 2.0833333333333336e-11 4479 4473 9.5018296033870872e-28 4479 3733 6.2500000000000004e-11 4479 3732 1.0416666666666665e-11 4479 3727 2.0833333333333326e-11 4480 4480 2.4999999999999996e-10 4480 4471 -2.2913451068275814e-27 4480 4141 1.0416666666666665e-11 4480 4140 2.0833333333333326e-11 4480 4720 2.0833333333333332e-11 4480 4473 9.5018296033870872e-28 4480 4124 1.0416666666666665e-11 4480 4123 2.0833333333333326e-11 4481 4481 2.4999999999999996e-10 4481 4377 2.0833333333333326e-11 4481 3817 2.0833333333333326e-11 4481 4471 -2.2913451068275814e-27 4481 1577 1.0416666666666665e-11 4481 2033 -2.0833333333333332e-11 4481 2035 -9.5018296033870872e-28 4481 1566 1.0416666666666665e-11 4482 4482 6.6666666666666654e-10 4482 3788 -1.0416666666666666e-11 4482 3824 6.2499999999999991e-11 4482 3823 -4.1666666666666665e-11 4482 3789 -4.1666666666666665e-11 4482 4457 1.6155871338926322e-27 4482 3726 -1.0416666666666666e-11 4482 3728 6.2499999999999991e-11 4482 3739 -4.1666666666666665e-11 4482 3723 -1.0416666666666666e-11 4482 4421 8.3333333333333330e-11 4482 4424 1.8175355256292112e-27 4482 3750 -1.0416666666666666e-11 4482 3753 6.2499999999999991e-11 4482 3760 -4.1666666666666665e-11 4482 4483 -8.3333333333333330e-11 4482 4484 -1.6155871338926322e-27 4482 1602 -1.0416666666666666e-11 4482 2059 -8.3333333333333330e-11 4482 2058 -1.8175355256292112e-27 4482 1237 -1.0416666666666666e-11 4482 1240 6.2499999999999991e-11 4482 2060 -8.3333333333333330e-11 4483 4483 4.1666666666666662e-10 4483 3760 2.0833333333333329e-11 4483 3826 2.0833333333333329e-11 4483 4478 2.0833333333333339e-11 4483 4477 -8.3333333333333330e-11 4483 3753 -2.0833333333333336e-11 4483 3752 2.0833333333333332e-11 4483 4484 -2.0833333333333339e-11 4483 4482 -8.3333333333333330e-11 4483 3824 -2.0833333333333336e-11 4483 3823 2.0833333333333332e-11 4484 4484 2.4999999999999996e-10 4484 3753 -1.0416666666666663e-11 4484 4842 2.2913451068275814e-27 4484 3760 -2.0833333333333326e-11 4484 4483 -2.0833333333333336e-11 4484 4482 -9.5018296033870872e-28 4484 3824 -1.0416666666666666e-11 4484 3823 -2.0833333333333326e-11 4485 4485 2.0833333333333331e-10 4486 4486 2.0833333333333331e-10 4487 4487 2.0833333333333331e-10 4488 4488 2.0833333333333331e-10 4489 4489 2.0833333333333331e-10 4490 4490 6.6666666666666664e-10 4490 4000 -1.0416666666666666e-11 4490 4524 -8.3333333333333330e-11 4490 4499 -1.8175355256292112e-27 4490 4009 6.2499999999999991e-11 4490 4006 -4.1666666666666665e-11 4490 4525 -8.3333333333333330e-11 4490 4501 -1.8175355256292112e-27 4490 3855 -1.0416666666666666e-11 4490 3839 -1.0416666666666666e-11 4490 3841 6.2499999999999991e-11 4490 3837 -4.1666666666666665e-11 4490 4514 8.3333333333333330e-11 4490 4503 -1.8175355256292112e-27 4490 3867 -1.0416666666666666e-11 4490 3868 6.2499999999999991e-11 4490 3863 -4.1666666666666665e-11 4490 4522 -8.3333333333333330e-11 4490 4491 -1.8175355256292112e-27 4490 3832 6.2499999999999991e-11 4490 3831 -4.1666666666666665e-11 4490 2762 -1.0416666666666666e-11 4490 2909 -1.0416666666666666e-11 4491 4491 2.4999999999999996e-10 4491 3833 1.0416666666666663e-11 4491 4526 -2.0833333333333336e-11 4491 4496 9.5018296033870872e-28 4491 3869 1.0416666666666666e-11 4491 3868 1.0416666666666663e-11 4491 3863 2.0833333333333326e-11 4491 4522 2.0833333333333336e-11 4491 4490 -2.2913451068275814e-27 4491 3832 1.0416666666666666e-11 4491 3831 2.0833333333333326e-11 4491 2762 6.2500000000000004e-11 4491 2909 6.2500000000000004e-11 4492 4492 6.6666666666666664e-10 4492 3891 -1.0416666666666666e-11 4492 4228 -1.0416666666666666e-11 4492 4823 -8.3333333333333330e-11 4492 4506 -1.8175355256292112e-27 4492 3898 -1.0416666666666666e-11 4492 3897 6.2499999999999991e-11 4492 3896 -4.1666666666666665e-11 4492 4824 -8.3333333333333330e-11 4492 4505 -1.8175355256292112e-27 4492 3740 -1.0416666666666666e-11 4492 3737 -1.0416666666666666e-11 4492 3738 6.2499999999999991e-11 4492 3729 -4.1666666666666665e-11 4492 4815 8.3333333333333330e-11 4492 4504 -1.8175355256292112e-27 4492 4210 -1.0416666666666666e-11 4492 4213 6.2499999999999991e-11 4492 4216 -4.1666666666666665e-11 4492 4822 -8.3333333333333330e-11 4492 4493 -1.8175355256292112e-27 4492 4225 6.2499999999999991e-11 4492 4224 -4.1666666666666665e-11 4493 4493 2.4999999999999996e-10 4493 4213 1.0416666666666666e-11 4493 4498 9.5018296033870872e-28 4493 4216 2.0833333333333326e-11 4493 4822 2.0833333333333339e-11 4493 4492 -2.2913451068275814e-27 4493 4225 1.0416666666666666e-11 4493 4224 2.0833333333333326e-11 4494 4494 6.6666666666666664e-10 4494 3885 -1.0416666666666666e-11 4494 3740 -1.0416666666666666e-11 4494 4511 -8.3333333333333330e-11 4494 4505 1.6155871338926322e-27 4494 3891 -1.0416666666666666e-11 4494 3894 6.2499999999999991e-11 4494 3896 -4.1666666666666665e-11 4494 3840 -1.0416666666666666e-11 4494 3867 -1.0416666666666666e-11 4494 4509 -8.3333333333333330e-11 4494 4503 1.6155871338926322e-27 4494 3839 -1.0416666666666666e-11 4494 3838 6.2499999999999991e-11 4494 3837 -4.1666666666666665e-11 4494 4510 -8.3333333333333330e-11 4494 4502 1.6155871338926322e-27 4494 3731 -1.0416666666666666e-11 4494 3730 6.2499999999999991e-11 4494 3729 -4.1666666666666665e-11 4494 4508 -8.3333333333333330e-11 4494 4495 1.6155871338926322e-27 4494 3865 -1.0416666666666666e-11 4494 3864 6.2499999999999991e-11 4494 3863 -4.1666666666666665e-11 4495 4495 2.4999999999999996e-10 4495 3894 1.0416666666666665e-11 4495 3869 1.0416666666666666e-11 4495 4537 -2.0833333333333339e-11 4495 4496 -2.2913451068275814e-27 4495 3885 6.2499999999999991e-11 4495 3887 1.0416666666666666e-11 4495 3896 2.0833333333333326e-11 4495 4508 2.0833333333333332e-11 4495 4494 9.5018296033870872e-28 4495 3865 6.2499999999999991e-11 4495 3864 1.0416666666666665e-11 4495 3863 2.0833333333333326e-11 4496 4496 6.6666666666666664e-10 4496 3898 -1.0416666666666666e-11 4496 4546 -8.3333333333333330e-11 4496 4506 1.6155871338926322e-27 4496 4228 -1.0416666666666666e-11 4496 4237 6.2499999999999991e-11 4496 4224 -4.1666666666666665e-11 4496 3865 -1.0416666666666666e-11 4496 4526 8.3333333333333330e-11 4496 4491 1.6155871338926322e-27 4496 3869 6.2499999999999991e-11 4496 3863 -4.1666666666666665e-11 4496 4537 8.3333333333333330e-11 4496 4495 -1.8175355256292112e-27 4496 3885 -1.0416666666666666e-11 4496 3887 6.2499999999999991e-11 4496 3896 -4.1666666666666665e-11 4496 4545 -8.3333333333333330e-11 4496 4497 -1.8175355256292112e-27 4496 3833 6.2499999999999991e-11 4496 3831 -4.1666666666666665e-11 4496 2909 -1.0416666666666666e-11 4496 2762 -1.0416666666666666e-11 4497 4497 2.4999999999999996e-10 4497 4237 1.0416666666666666e-11 4497 4498 9.5018296033870872e-28 4497 4224 2.0833333333333326e-11 4497 4545 2.0833333333333339e-11 4497 4496 -2.2913451068275814e-27 4497 3833 1.0416666666666666e-11 4497 3831 2.0833333333333326e-11 4498 4498 6.6666666666666664e-10 4498 4507 1.6155871338926322e-27 4498 4006 -4.1666666666666665e-11 4498 4497 1.6155871338926322e-27 4498 4224 -4.1666666666666665e-11 4498 4493 1.6155871338926322e-27 4498 4216 -4.1666666666666665e-11 4498 4499 1.6155871338926322e-27 4498 3831 -4.1666666666666665e-11 4499 4499 2.4999999999999996e-10 4499 3832 1.0416666666666666e-11 4499 4524 2.0833333333333339e-11 4499 4490 -2.2913451068275814e-27 4499 4009 1.0416666666666666e-11 4499 4006 2.0833333333333326e-11 4499 4498 9.5018296033870872e-28 4499 3831 2.0833333333333326e-11 4500 4500 6.6666666666666664e-10 4500 3855 -1.0416666666666666e-11 4500 3731 -1.0416666666666666e-11 4500 4521 8.3333333333333330e-11 4500 4502 -1.8175355256292112e-27 4500 3840 -1.0416666666666666e-11 4500 3862 6.2499999999999991e-11 4500 3837 -4.1666666666666665e-11 4500 4210 -1.0416666666666666e-11 4500 5061 -8.3333333333333330e-11 4500 4507 -1.8175355256292112e-27 4500 4218 6.2499999999999991e-11 4500 4216 -4.1666666666666665e-11 4500 4816 8.3333333333333330e-11 4500 4504 1.6155871338926322e-27 4500 3737 -1.0416666666666666e-11 4500 3744 6.2499999999999991e-11 4500 3729 -4.1666666666666665e-11 4500 4967 8.3333333333333330e-11 4500 4501 1.6155871338926322e-27 4500 4000 -1.0416666666666666e-11 4500 4004 6.2499999999999991e-11 4500 4006 -4.1666666666666665e-11 4501 4501 2.4999999999999996e-10 4501 3862 1.0416666666666663e-11 4501 4009 1.0416666666666663e-11 4501 4525 2.0833333333333336e-11 4501 4490 -2.2913451068275814e-27 4501 3855 6.2500000000000004e-11 4501 3841 1.0416666666666666e-11 4501 3837 2.0833333333333326e-11 4501 4967 -2.0833333333333336e-11 4501 4500 9.5018296033870872e-28 4501 4000 6.2500000000000004e-11 4501 4004 1.0416666666666666e-11 4501 4006 2.0833333333333326e-11 4502 4502 2.4999999999999996e-10 4502 3744 1.0416666666666666e-11 4502 4521 -2.0833333333333339e-11 4502 4500 -2.2913451068275814e-27 4502 3862 1.0416666666666666e-11 4502 3840 6.2499999999999991e-11 4502 3838 1.0416666666666665e-11 4502 3837 2.0833333333333326e-11 4502 4510 2.0833333333333332e-11 4502 4494 9.5018296033870872e-28 4502 3731 6.2499999999999991e-11 4502 3730 1.0416666666666665e-11 4502 3729 2.0833333333333326e-11 4503 4503 2.4999999999999996e-10 4503 3841 1.0416666666666666e-11 4503 4514 -2.0833333333333339e-11 4503 4490 -2.2913451068275814e-27 4503 3868 1.0416666666666666e-11 4503 3867 6.2499999999999991e-11 4503 3864 1.0416666666666665e-11 4503 3863 2.0833333333333326e-11 4503 4509 2.0833333333333336e-11 4503 4494 9.5018296033870872e-28 4503 3839 6.2500000000000004e-11 4503 3838 1.0416666666666665e-11 4503 3837 2.0833333333333326e-11 4504 4504 2.4999999999999996e-10 4504 4218 1.0416666666666663e-11 4504 4816 -2.0833333333333336e-11 4504 4500 9.5018296033870872e-28 4504 3744 1.0416666666666666e-11 4504 3737 6.2500000000000004e-11 4504 3738 1.0416666666666663e-11 4504 3729 2.0833333333333326e-11 4504 4815 -2.0833333333333336e-11 4504 4492 -2.2913451068275814e-27 4504 4210 6.2500000000000004e-11 4504 4213 1.0416666666666666e-11 4504 4216 2.0833333333333326e-11 4505 4505 2.4999999999999996e-10 4505 3897 1.0416666666666666e-11 4505 4824 2.0833333333333339e-11 4505 4492 -2.2913451068275814e-27 4505 3738 1.0416666666666666e-11 4505 3740 6.2499999999999991e-11 4505 3730 1.0416666666666665e-11 4505 3729 2.0833333333333326e-11 4505 4511 2.0833333333333336e-11 4505 4494 9.5018296033870872e-28 4505 3891 6.2500000000000004e-11 4505 3894 1.0416666666666665e-11 4505 3896 2.0833333333333326e-11 4506 4506 2.4999999999999996e-10 4506 3887 1.0416666666666663e-11 4506 4546 2.0833333333333336e-11 4506 4496 9.5018296033870872e-28 4506 4237 1.0416666666666666e-11 4506 4228 6.2500000000000004e-11 4506 4225 1.0416666666666663e-11 4506 4224 2.0833333333333326e-11 4506 4823 2.0833333333333336e-11 4506 4492 -2.2913451068275814e-27 4506 3898 6.2500000000000004e-11 4506 3897 1.0416666666666666e-11 4506 3896 2.0833333333333326e-11 4507 4507 2.4999999999999996e-10 4507 4498 9.5018296033870872e-28 4507 4004 1.0416666666666666e-11 4507 4006 2.0833333333333326e-11 4507 5061 2.0833333333333339e-11 4507 4500 -2.2913451068275814e-27 4507 4218 1.0416666666666666e-11 4507 4216 2.0833333333333326e-11 4508 4508 4.1666666666666662e-10 4508 3896 2.0833333333333332e-11 4508 3866 2.0833333333333332e-11 4508 4445 2.0833333333333336e-11 4508 4440 -8.3333333333333330e-11 4508 3885 8.3333333333333330e-11 4508 3894 -2.0833333333333336e-11 4508 3893 2.0833333333333332e-11 4508 4495 2.0833333333333336e-11 4508 4494 -8.3333333333333330e-11 4508 3865 8.3333333333333330e-11 4508 3864 -2.0833333333333336e-11 4508 3863 2.0833333333333332e-11 4509 4509 4.1666666666666662e-10 4509 3847 2.0833333333333332e-11 4509 3863 2.0833333333333332e-11 4509 4503 2.0833333333333339e-11 4509 4494 -8.3333333333333330e-11 4509 3839 8.3333333333333330e-11 4509 3838 -2.0833333333333336e-11 4509 3837 2.0833333333333332e-11 4509 4441 2.0833333333333339e-11 4509 4440 -8.3333333333333330e-11 4509 3867 8.3333333333333330e-11 4509 3864 -2.0833333333333336e-11 4509 3866 2.0833333333333332e-11 4510 4510 4.1666666666666662e-10 4510 3724 2.0833333333333332e-11 4510 4446 2.0833333333333336e-11 4510 4440 -8.3333333333333330e-11 4510 3847 2.0833333333333332e-11 4510 3840 8.3333333333333330e-11 4510 3838 -2.0833333333333336e-11 4510 3837 2.0833333333333332e-11 4510 4502 2.0833333333333336e-11 4510 4494 -8.3333333333333330e-11 4510 3731 8.3333333333333330e-11 4510 3730 -2.0833333333333336e-11 4510 3729 2.0833333333333332e-11 4511 4511 4.1666666666666662e-10 4511 3729 2.0833333333333332e-11 4511 4505 2.0833333333333339e-11 4511 4494 -8.3333333333333330e-11 4511 3896 2.0833333333333332e-11 4511 3891 8.3333333333333330e-11 4511 3894 -2.0833333333333336e-11 4511 3893 2.0833333333333332e-11 4511 4444 2.0833333333333339e-11 4511 4440 -8.3333333333333330e-11 4511 3740 8.3333333333333330e-11 4511 3730 -2.0833333333333336e-11 4511 3724 2.0833333333333332e-11 4512 4512 2.4999999999999998e-02 4512 3852 -1.0416666666666664e-03 4512 3868 -1.0416666666666664e-03 4512 4514 2.0833333333333337e-03 4512 4523 -1.0254392617697373e-19 4512 3839 -6.2500000000000003e-03 4512 3841 -1.0416666666666664e-03 4512 3853 -2.0833333333333329e-03 4512 4513 2.0833333333333337e-03 4512 3867 -6.2500000000000003e-03 4512 3692 -6.0159191589756597e-20 4512 2758 -1.0416666666666662e-03 4512 2766 -2.0833333333333329e-03 4513 4513 4.1666666666666664e-02 4513 3853 -2.0833333333333333e-03 4513 4516 2.0833333333333337e-03 4513 3839 -8.3333333333333315e-03 4513 3852 2.0833333333333337e-03 4513 3851 -2.0833333333333329e-03 4513 4512 2.0833333333333337e-03 4513 3867 -8.3333333333333315e-03 4513 2757 -2.0833333333333333e-03 4513 3662 8.3333333333333315e-03 4513 3692 8.3333333333333315e-03 4513 2758 2.0833333333333337e-03 4513 2766 -2.0833333333333329e-03 4514 4514 2.0833333541666665e-02 4514 4512 2.0833333333333337e-03 4514 4523 -8.3333333333333315e-03 4514 3853 -2.0833333333333333e-03 4514 3839 -4.1666667083333333e-03 4514 3841 1.0416666770833337e-03 4514 3837 -2.0833333333333329e-11 4514 4503 -2.0833333333333339e-11 4514 4490 8.3333333333333330e-11 4514 3867 -4.1666667083333324e-03 4514 3868 1.0416666770833333e-03 4514 3863 -2.0833333333333332e-11 4514 2766 -2.0833333333333329e-03 4515 4515 2.0833333541666665e-02 4515 3851 -2.0833333333333329e-03 4515 4516 2.0833333333333337e-03 4515 4889 -8.3333333333333315e-03 4515 3867 -4.1666667083333333e-03 4515 3871 1.0416666770833337e-03 4515 3866 -2.0833333333333329e-11 4515 4441 -2.0833333333333339e-11 4515 4438 8.3333333333333330e-11 4515 3839 -4.1666667083333324e-03 4515 3849 1.0416666770833333e-03 4515 3847 -2.0833333333333332e-11 4515 2757 -2.0833333333333333e-03 4516 4516 2.4999999999999998e-02 4516 3849 -1.0416666666666664e-03 4516 4515 2.0833333333333337e-03 4516 4889 -1.0254392617697373e-19 4516 3871 -1.0416666666666664e-03 4516 3867 -6.2500000000000003e-03 4516 4513 2.0833333333333337e-03 4516 3839 -6.2500000000000003e-03 4516 3852 -1.0416666666666662e-03 4516 3851 -2.0833333333333329e-03 4516 2758 -1.0416666666666664e-03 4516 2757 -2.0833333333333329e-03 4516 3662 -6.0159191589756597e-20 4517 4517 4.1666666666666662e-10 4517 3743 -2.0833333333333332e-11 4517 4518 2.0833333333333339e-11 4517 4888 8.3333333333333330e-11 4517 3850 -2.0833333333333332e-11 4517 3840 -8.3333333333333330e-11 4517 3848 2.0833333333333339e-11 4517 3847 -2.0833333333333332e-11 4517 4446 -2.0833333333333339e-11 4517 4436 8.3333333333333330e-11 4517 3731 -8.3333333333333330e-11 4517 3742 2.0833333333333339e-11 4517 3724 -2.0833333333333332e-11 4518 4518 2.4999999999999996e-10 4518 3860 -1.0416666666666665e-11 4518 4519 2.0833333333333332e-11 4518 4750 9.5018296033870872e-28 4518 3735 -1.0416666666666665e-11 4518 3731 -6.2499999999999991e-11 4518 3742 -1.0416666666666666e-11 4518 3743 -2.0833333333333326e-11 4518 4517 2.0833333333333339e-11 4518 4888 2.2913451068275814e-27 4518 3840 -6.2499999999999991e-11 4518 3848 -1.0416666666666666e-11 4518 3850 -2.0833333333333326e-11 4519 4519 4.1666666666666662e-10 4519 3734 -2.0833333333333332e-11 4519 4520 2.0833333333333336e-11 4519 4743 8.3333333333333330e-11 4519 3861 -2.0833333333333332e-11 4519 3840 -8.3333333333333330e-11 4519 3860 2.0833333333333336e-11 4519 3850 -2.0833333333333332e-11 4519 4518 2.0833333333333336e-11 4519 4750 -8.3333333333333330e-11 4519 3731 -8.3333333333333330e-11 4519 3735 2.0833333333333336e-11 4519 3743 -2.0833333333333332e-11 4520 4520 2.4999999999999996e-10 4520 3735 -1.0416666666666665e-11 4520 4519 2.0833333333333332e-11 4520 4743 -9.5018296033870872e-28 4520 3860 -1.0416666666666665e-11 4520 3840 -6.2499999999999991e-11 4520 3862 -1.0416666666666666e-11 4520 3861 -2.0833333333333326e-11 4520 4521 2.0833333333333339e-11 4520 4738 2.2913451068275814e-27 4520 3731 -6.2499999999999991e-11 4520 3744 -1.0416666666666666e-11 4520 3734 -2.0833333333333326e-11 4521 4521 4.1666666666666662e-10 4521 3729 -2.0833333333333332e-11 4521 4502 -2.0833333333333339e-11 4521 4500 8.3333333333333330e-11 4521 3837 -2.0833333333333332e-11 4521 3840 -8.3333333333333330e-11 4521 3862 2.0833333333333339e-11 4521 3861 -2.0833333333333332e-11 4521 4520 2.0833333333333339e-11 4521 4738 8.3333333333333330e-11 4521 3731 -8.3333333333333330e-11 4521 3744 2.0833333333333339e-11 4521 3734 -2.0833333333333332e-11 4522 4522 2.0833333541666665e-02 4522 4523 8.3333333333333315e-03 4522 3868 -1.0416666770833335e-03 4522 3863 2.0833333333333329e-11 4522 4491 2.0833333333333339e-11 4522 4490 -8.3333333333333330e-11 4522 3832 -1.0416666770833331e-03 4522 3831 2.0833333333333332e-11 4522 2913 2.0833333333333329e-03 4522 3603 2.0833333333333337e-03 4522 2766 2.0833333333333333e-03 4522 2762 4.1666667083333333e-03 4522 2909 4.1666667083333324e-03 4523 4523 6.6666666666666652e-02 4523 3855 1.0416666666666669e-03 4523 4525 8.3333333333333315e-03 4523 4966 -1.3552527156068805e-20 4523 4000 1.0416666666666667e-03 4523 4009 -6.2500000000000003e-03 4523 4001 4.1666666666666666e-03 4523 3867 1.0416666666666669e-03 4523 4522 8.3333333333333315e-03 4523 3868 -6.2500000000000003e-03 4523 4514 -8.3333333333333315e-03 4523 4512 1.3552527156068805e-20 4523 3839 1.0416666666666667e-03 4523 3841 -6.2500000000000003e-03 4523 3853 4.1666666666666666e-03 4523 4524 8.3333333333333315e-03 4523 4965 -1.3552527156068805e-20 4523 3832 -6.2500000000000003e-03 4523 2909 1.0416666666666669e-03 4523 3603 -1.3552527156068805e-20 4523 2762 1.0416666666666667e-03 4523 2766 4.1666666666666666e-03 4523 2913 4.1666666666666666e-03 4524 4524 2.0833333541666669e-02 4524 3831 2.0833333333333329e-11 4524 4499 2.0833333333333339e-11 4524 4490 -8.3333333333333330e-11 4524 4006 2.0833333333333332e-11 4524 4009 -1.0416666770833333e-03 4524 4001 2.0833333333333329e-03 4524 4965 2.0833333333333337e-03 4524 4523 8.3333333333333315e-03 4524 3832 -1.0416666770833337e-03 4524 2913 2.0833333333333333e-03 4525 4525 2.0833333541666669e-02 4525 4006 2.0833333333333329e-11 4525 4501 2.0833333333333339e-11 4525 4490 -8.3333333333333330e-11 4525 3837 2.0833333333333332e-11 4525 3855 4.1666667083333324e-03 4525 3841 -1.0416666770833331e-03 4525 3853 2.0833333333333329e-03 4525 4966 2.0833333333333337e-03 4525 4523 8.3333333333333315e-03 4525 4000 4.1666667083333333e-03 4525 4009 -1.0416666770833335e-03 4525 4001 2.0833333333333333e-03 4526 4526 2.0833333541666669e-02 4526 3831 -2.0833333333333329e-11 4526 4491 -2.0833333333333339e-11 4526 4496 8.3333333333333330e-11 4526 3863 -2.0833333333333332e-11 4526 3869 1.0416666770833331e-03 4526 4527 8.3333333333333315e-03 4526 3833 1.0416666770833337e-03 4526 2762 -4.1666667083333324e-03 4526 2755 -2.0833333333333329e-03 4526 3605 -2.0833333333333337e-03 4526 2909 -4.1666667083333333e-03 4526 2912 -2.0833333333333333e-03 4527 4527 6.6666666666666652e-02 4527 4228 -1.0416666666666669e-03 4527 4545 -8.3333333333333315e-03 4527 4530 1.3552527156068805e-20 4527 4237 6.2500000000000003e-03 4527 4229 -4.1666666666666666e-03 4527 4546 -8.3333333333333315e-03 4527 4529 2.7105054312137611e-20 4527 3898 -1.0416666666666667e-03 4527 3885 -1.0416666666666669e-03 4527 3887 6.2500000000000003e-03 4527 3883 -4.1666666666666666e-03 4527 4537 8.3333333333333315e-03 4527 4532 1.3552527156068805e-20 4527 3865 -1.0416666666666667e-03 4527 3869 6.2500000000000003e-03 4527 4526 8.3333333333333315e-03 4527 3833 6.2500000000000003e-03 4527 2762 -1.0416666666666669e-03 4527 2755 -4.1666666666666666e-03 4527 3605 2.7105054312137611e-20 4527 2909 -1.0416666666666667e-03 4527 2912 -4.1666666666666666e-03 4528 4528 6.6666666666666652e-02 4528 4938 -8.3333333333333315e-03 4528 4533 1.3552527156068805e-20 4528 4278 6.2500000000000003e-03 4528 4932 8.3333333333333315e-03 4528 3898 -1.0416666666666669e-03 4528 3872 -1.0416666666666669e-03 4528 3882 6.2500000000000003e-03 4528 4544 8.3333333333333315e-03 4528 4531 1.3552527156068805e-20 4528 3886 -1.0416666666666667e-03 4528 3908 6.2500000000000003e-03 4528 3883 -4.1666666666666666e-03 4528 4867 8.3333333333333315e-03 4528 4529 1.3552527156068805e-20 4528 4228 -1.0416666666666667e-03 4528 4230 6.2500000000000003e-03 4528 4229 -4.1666666666666666e-03 4528 2784 -1.0416666666666669e-03 4528 2790 -4.1666666666666666e-03 4528 3352 1.3552527156068805e-20 4528 2769 -1.0416666666666667e-03 4528 2774 -4.1666666666666666e-03 4529 4529 2.4999999999999998e-02 4529 3908 1.0416666666666664e-03 4529 4237 1.0416666666666664e-03 4529 4546 2.0833333333333337e-03 4529 4527 6.0159191589756597e-20 4529 3898 6.2500000000000003e-03 4529 3887 1.0416666666666664e-03 4529 3883 2.0833333333333329e-03 4529 4867 -2.0833333333333337e-03 4529 4528 -1.0254392617697373e-19 4529 4228 6.2500000000000003e-03 4529 4230 1.0416666666666664e-03 4529 4229 2.0833333333333329e-03 4530 4530 2.4999999999999998e-02 4530 3833 1.0416666666666664e-03 4530 4545 2.0833333333333337e-03 4530 4527 -1.0254392617697373e-19 4530 4237 1.0416666666666664e-03 4530 4229 2.0833333333333329e-03 4530 3629 6.0159191589756597e-20 4530 2912 2.0833333333333329e-03 4531 4531 2.4999999999999998e-02 4531 3882 1.0416666666666664e-03 4531 4544 -2.0833333333333337e-03 4531 4528 -1.0254392617697373e-19 4531 3908 1.0416666666666664e-03 4531 3886 6.2500000000000003e-03 4531 3884 1.0416666666666664e-03 4531 3883 2.0833333333333329e-03 4531 4535 2.0833333333333337e-03 4531 3872 6.2500000000000003e-03 4531 3628 6.0159191589756597e-20 4531 2773 1.0416666666666662e-03 4531 2774 2.0833333333333329e-03 4532 4532 2.4999999999999998e-02 4532 3887 1.0416666666666664e-03 4532 4537 -2.0833333333333337e-03 4532 4527 -1.0254392617697373e-19 4532 3869 1.0416666666666664e-03 4532 3865 6.2500000000000003e-03 4532 4534 2.0833333333333337e-03 4532 3885 6.2500000000000003e-03 4532 3884 1.0416666666666664e-03 4532 3883 2.0833333333333329e-03 4532 2756 1.0416666666666664e-03 4532 2755 2.0833333333333329e-03 4532 3628 6.0159191589756597e-20 4533 4533 2.4999999999999998e-02 4533 4230 1.0416666666666664e-03 4533 4229 2.0833333333333329e-03 4533 4938 2.0833333333333337e-03 4533 4528 -1.0254392617697373e-19 4533 4278 1.0416666666666664e-03 4533 3629 6.0159191589756597e-20 4533 2790 2.0833333333333329e-03 4534 4534 4.1666666666666664e-02 4534 3903 2.0833333333333333e-03 4534 4532 2.0833333333333333e-03 4534 3885 8.3333333333333315e-03 4534 3884 -2.0833333333333337e-03 4534 3883 2.0833333333333329e-03 4534 4536 -2.0833333333333333e-03 4534 3865 8.3333333333333315e-03 4534 2755 2.0833333333333333e-03 4534 3628 -8.3333333333333315e-03 4534 3625 -8.3333333333333315e-03 4534 2756 -2.0833333333333337e-03 4534 2765 2.0833333333333329e-03 4535 4535 4.1666666666666664e-02 4535 4539 -2.0833333333333337e-03 4535 3903 2.0833333333333329e-03 4535 3886 8.3333333333333315e-03 4535 3884 -2.0833333333333337e-03 4535 3883 2.0833333333333333e-03 4535 4531 2.0833333333333337e-03 4535 3872 8.3333333333333315e-03 4535 2772 2.0833333333333333e-03 4535 3625 -8.3333333333333315e-03 4535 3628 -8.3333333333333315e-03 4535 2773 -2.0833333333333337e-03 4535 2774 2.0833333333333329e-03 4536 4536 2.4999999999999998e-02 4536 3884 -1.0416666666666664e-03 4536 3870 -1.0416666666666664e-03 4536 4538 2.0833333333333337e-03 4536 4865 -1.0254392617697373e-19 4536 3885 -6.2500000000000003e-03 4536 3895 -1.0416666666666664e-03 4536 3903 -2.0833333333333329e-03 4536 4534 -2.0833333333333337e-03 4536 3865 -6.2500000000000003e-03 4536 3625 -6.0159191589756597e-20 4536 2756 -1.0416666666666664e-03 4536 2765 -2.0833333333333329e-03 4537 4537 2.0833333541666669e-02 4537 3863 -2.0833333333333332e-11 4537 4495 -2.0833333333333339e-11 4537 4496 8.3333333333333330e-11 4537 3896 -2.0833333333333332e-11 4537 3885 -4.1666667083333324e-03 4537 3887 1.0416666770833333e-03 4537 3883 -2.0833333333333333e-03 4537 4532 -2.0833333333333337e-03 4537 4527 8.3333333333333315e-03 4537 3865 -4.1666667083333333e-03 4537 3869 1.0416666770833337e-03 4537 2755 -2.0833333333333329e-03 4538 4538 2.0833333541666665e-02 4538 4536 2.0833333333333337e-03 4538 4865 -8.3333333333333315e-03 4538 3903 -2.0833333333333329e-03 4538 3885 -4.1666667083333333e-03 4538 3895 1.0416666770833337e-03 4538 3893 -2.0833333333333332e-11 4538 4445 -2.0833333333333339e-11 4538 4432 8.3333333333333330e-11 4538 3865 -4.1666667083333324e-03 4538 3870 1.0416666770833333e-03 4538 3866 -2.0833333333333332e-11 4538 2765 -2.0833333333333333e-03 4539 4539 2.4999999999999998e-02 4539 4535 -2.0833333333333337e-03 4539 3884 -1.0416666666666662e-03 4539 3886 -6.2500000000000003e-03 4539 3904 -1.0416666666666664e-03 4539 3903 -2.0833333333333329e-03 4539 4540 2.0833333333333337e-03 4539 4895 1.0254392617697373e-19 4539 3872 -6.2500000000000003e-03 4539 3876 -1.0416666666666664e-03 4539 2773 -1.0416666666666664e-03 4539 3625 -6.0159191589756597e-20 4539 2772 -2.0833333333333329e-03 4540 4540 4.1666666666666664e-02 4540 3877 -2.0833333333333329e-03 4540 4541 2.0833333333333337e-03 4540 4897 -8.3333333333333315e-03 4540 3905 -2.0833333333333333e-03 4540 3886 -8.3333333333333315e-03 4540 3904 2.0833333333333337e-03 4540 3903 -2.0833333333333329e-03 4540 4539 2.0833333333333337e-03 4540 4895 8.3333333333333315e-03 4540 3872 -8.3333333333333315e-03 4540 3876 2.0833333333333337e-03 4540 2772 -2.0833333333333333e-03 4541 4541 2.4999999999999998e-02 4541 3906 -1.0416666666666664e-03 4541 4542 2.0833333333333337e-03 4541 4902 -6.0159191589756597e-20 4541 3881 -1.0416666666666662e-03 4541 3872 -6.2500000000000003e-03 4541 3876 -1.0416666666666664e-03 4541 3877 -2.0833333333333329e-03 4541 4540 2.0833333333333337e-03 4541 4897 -1.0254392617697373e-19 4541 3886 -6.2500000000000003e-03 4541 3904 -1.0416666666666664e-03 4541 3905 -2.0833333333333329e-03 4542 4542 4.1666666666666664e-02 4542 3880 -2.0833333333333333e-03 4542 4543 2.0833333333333337e-03 4542 4924 8.3333333333333315e-03 4542 3907 -2.0833333333333329e-03 4542 3886 -8.3333333333333315e-03 4542 3906 2.0833333333333337e-03 4542 3905 -2.0833333333333333e-03 4542 4541 2.0833333333333337e-03 4542 4902 8.3333333333333315e-03 4542 3872 -8.3333333333333315e-03 4542 3881 2.0833333333333337e-03 4542 3877 -2.0833333333333329e-03 4543 4543 2.4999999999999998e-02 4543 3881 -1.0416666666666664e-03 4543 4542 2.0833333333333337e-03 4543 4924 -6.0159191589756597e-20 4543 3906 -1.0416666666666662e-03 4543 3886 -6.2500000000000003e-03 4543 3908 -1.0416666666666664e-03 4543 3907 -2.0833333333333329e-03 4543 4544 2.0833333333333337e-03 4543 4925 1.0254392617697373e-19 4543 3872 -6.2500000000000003e-03 4543 3882 -1.0416666666666664e-03 4543 3880 -2.0833333333333329e-03 4544 4544 4.1666666666666664e-02 4544 4531 -2.0833333333333337e-03 4544 4528 8.3333333333333315e-03 4544 3883 -2.0833333333333333e-03 4544 3886 -8.3333333333333315e-03 4544 3908 2.0833333333333337e-03 4544 3907 -2.0833333333333329e-03 4544 4543 2.0833333333333337e-03 4544 4925 8.3333333333333315e-03 4544 3872 -8.3333333333333315e-03 4544 3882 2.0833333333333337e-03 4544 3880 -2.0833333333333333e-03 4544 2774 -2.0833333333333329e-03 4545 4545 2.0833333541666665e-02 4545 4530 2.0833333333333337e-03 4545 4527 -8.3333333333333315e-03 4545 4229 2.0833333333333329e-03 4545 4237 -1.0416666770833337e-03 4545 4224 2.0833333333333332e-11 4545 4497 2.0833333333333339e-11 4545 4496 -8.3333333333333330e-11 4545 3833 -1.0416666770833333e-03 4545 3831 2.0833333333333332e-11 4545 2912 2.0833333333333333e-03 4546 4546 2.0833333541666665e-02 4546 4229 2.0833333333333329e-03 4546 4529 2.0833333333333337e-03 4546 4527 -8.3333333333333315e-03 4546 3883 2.0833333333333333e-03 4546 3898 4.1666667083333333e-03 4546 3887 -1.0416666770833337e-03 4546 3896 2.0833333333333329e-11 4546 4506 2.0833333333333339e-11 4546 4496 -8.3333333333333330e-11 4546 4228 4.1666667083333324e-03 4546 4237 -1.0416666770833331e-03 4546 4224 2.0833333333333332e-11 4547 4547 9.1666666666666660e-02 4547 4557 -4.1666666666666666e-03 4547 4548 1.2499999999999999e-02 4547 3911 2.0833333333333342e-03 4547 3874 -1.0416666666666669e-03 4547 4560 -8.3333333333333315e-03 4547 3873 6.2500000000000003e-03 4547 4559 -8.3333333333333315e-03 4547 4552 2.7105054312137611e-20 4547 3927 -1.0416666666666667e-03 4547 3920 1.0416666666666666e-02 4547 3926 -4.1666666666666666e-03 4547 4554 -4.1666666666666657e-03 4547 3913 1.0416666666666666e-02 4547 2990 -1.6666666666666666e-02 4547 2971 -1.0416666666666669e-03 4547 3640 2.7105054312137611e-20 4547 2776 -1.0416666666666667e-03 4547 2778 -4.1666666666666666e-03 4547 3650 1.2499999999999997e-02 4547 2977 -4.1666666666666675e-03 4548 4548 5.8333333333333320e-02 4548 4553 1.3552527156068805e-20 4548 3937 -4.1666666666666666e-03 4548 3920 5.2083333333333322e-03 4548 3926 -4.1666666666666657e-03 4548 4557 -2.0833333333333329e-03 4548 4547 1.2499999999999999e-02 4548 3911 1.0416666666666667e-03 4548 4549 1.3552527156068805e-20 4548 2990 -4.1666666666666675e-03 4549 4549 2.4999999999999998e-02 4549 3937 2.0833333333333329e-03 4549 4548 -1.0254392617697373e-19 4549 3648 6.0159191589756597e-20 4549 2990 2.0833333333333329e-03 4550 4550 6.6666666666666652e-02 4550 4582 -8.3333333333333315e-03 4550 4275 6.2500000000000003e-03 4550 3927 -1.0416666666666669e-03 4550 4581 -8.3333333333333315e-03 4550 4553 2.7105054312137611e-20 4550 3928 6.2500000000000003e-03 4550 3926 -4.1666666666666666e-03 4550 4568 8.3333333333333315e-03 4550 4552 1.3552527156068805e-20 4550 3874 -1.0416666666666667e-03 4550 3875 6.2500000000000003e-03 4550 4579 -8.3333333333333315e-03 4550 4551 1.3552527156068805e-20 4550 3938 6.2500000000000003e-03 4550 3937 -4.1666666666666666e-03 4550 2769 -1.0416666666666669e-03 4550 3350 2.7105054312137611e-20 4550 2784 -1.0416666666666667e-03 4550 2786 -4.1666666666666666e-03 4550 2778 -4.1666666666666666e-03 4551 4551 2.4999999999999998e-02 4551 4275 1.0416666666666664e-03 4551 4579 2.0833333333333337e-03 4551 4550 -1.0254392617697373e-19 4551 3938 1.0416666666666664e-03 4551 3937 2.0833333333333329e-03 4551 3648 6.0159191589756597e-20 4551 2786 2.0833333333333329e-03 4552 4552 2.4999999999999998e-02 4552 3928 1.0416666666666664e-03 4552 4568 -2.0833333333333337e-03 4552 4550 -1.0254392617697373e-19 4552 3875 1.0416666666666664e-03 4552 3874 6.2500000000000003e-03 4552 3873 1.0416666666666664e-03 4552 4559 2.0833333333333337e-03 4552 4547 6.0159191589756597e-20 4552 3927 6.2500000000000003e-03 4552 3920 1.0416666666666664e-03 4552 3926 2.0833333333333329e-03 4552 2778 2.0833333333333329e-03 4553 4553 2.5000000000000001e-02 4553 4548 -1.0254392617697373e-19 4553 3938 1.0416666666666664e-03 4553 3937 2.0833333333333329e-03 4553 4581 2.0833333333333337e-03 4553 4550 6.0159191589756597e-20 4553 3928 1.0416666666666664e-03 4553 3926 2.0833333333333329e-03 4554 4554 4.1666666666666657e-02 4554 4556 2.1684043449710089e-19 4554 4386 -6.2499999999999986e-03 4554 3911 1.0416666666666662e-03 4554 4547 -4.1666666666666666e-03 4554 3913 -1.0416666666666667e-03 4554 2990 4.1666666666666666e-03 4554 3650 -2.0833333333333329e-03 4554 2977 -2.0761130467597592e-20 4555 4555 4.1666666666666657e-02 4555 3918 2.7157993871341005e-20 4555 5075 -2.0833333333333329e-03 4555 4562 4.1666666666666666e-03 4555 4055 4.1666666666666657e-03 4555 4051 1.0416666666666660e-03 4555 4564 4.3368086899420177e-19 4555 4386 -6.2499999999999986e-03 4555 4556 2.7105054312137611e-20 4555 3913 -1.0416666666666667e-03 4556 4556 4.1666666666666657e-02 4556 4554 3.1800793213478638e-19 4556 4386 -5.8569019580184656e-19 4556 4555 -1.3753697481041702e-19 4556 3913 -4.6263880787845817e-19 4557 4557 4.1666666666666657e-02 4557 4565 4.3368086899420177e-19 4557 4386 -6.2499999999999986e-03 4557 3926 -2.7052114752934217e-20 4557 4548 -2.0833333333333329e-03 4557 4547 -4.1666666666666666e-03 4557 3911 1.0416666666666660e-03 4557 4558 2.7105054312137611e-20 4557 3920 -1.0416666666666667e-03 4557 2990 4.1666666666666666e-03 4558 4558 4.1666666666666664e-02 4558 4386 -2.6946235634527430e-19 4558 4563 3.1800793213478638e-19 4558 4557 -1.3753697481041702e-19 4558 3920 -1.0116749763768550e-19 4559 4559 4.1666666666666657e-02 4559 3930 2.1705219273391446e-19 4559 4569 -1.0416666666666666e-02 4559 4561 2.6946235634527430e-19 4559 3878 -2.1705219273391446e-19 4559 3874 9.3749999999999997e-03 4559 3873 -1.0416666666666669e-03 4559 4552 2.0833333333333333e-03 4559 4547 -8.3333333333333315e-03 4559 3927 9.3749999999999997e-03 4559 3920 -1.0416666666666673e-03 4559 3926 2.0833333333333329e-03 4559 2778 2.0833333333333333e-03 4560 4560 4.5833333333333323e-02 4560 3878 5.2083333333333330e-03 4560 4567 -4.1666666666666675e-03 4560 4561 8.3333333333333315e-03 4560 3919 1.0416666666666664e-03 4560 3913 -2.1684043449710089e-19 4560 4547 -8.3333333333333315e-03 4560 3873 -4.3368086899420177e-19 4560 2971 7.2916666666666659e-03 4560 2977 2.0833333333333333e-03 4560 3640 2.0833333333333337e-03 4560 2776 1.3541666666666664e-02 4560 2778 2.0833333333333329e-03 4561 4561 4.1666666666666657e-02 4561 3923 1.6263032587282567e-19 4561 4562 -2.0833333333333320e-03 4561 4910 -4.1666666666666657e-03 4561 3918 -4.1666666666666666e-03 4561 3927 2.1684043449710089e-19 4561 3920 -1.0416666666666675e-03 4561 3930 1.0416666666666662e-03 4561 4559 2.3039296165316969e-19 4561 4569 8.1315162936412833e-20 4561 3874 4.9904357809065860e-20 4561 3873 -1.0416666666666671e-03 4561 3878 6.2499999999999995e-03 4561 4560 8.3333333333333315e-03 4561 4567 -4.3368086899420177e-19 4561 3913 -1.2499999999999999e-02 4561 3919 -1.0416666666666654e-03 4561 2776 5.2083333333333322e-03 4561 2971 -3.1249999999999997e-03 4562 4562 8.3333333333333329e-02 4562 4555 4.1666666666666666e-03 4562 5075 -1.2499999999999999e-02 4562 4051 -2.0833333333333342e-03 4562 4055 1.6666666666666666e-02 4562 4563 4.1666666666666675e-03 4562 5073 -1.2499999999999997e-02 4562 3920 -1.4583333333333330e-02 4562 3923 4.1666666666666675e-03 4562 3930 -5.2083333333333330e-03 4562 4561 -2.0833333333333320e-03 4562 4910 1.2499999999999999e-02 4562 3913 -8.3333333333333332e-03 4562 3918 4.1666666666666666e-03 4562 3919 -1.0416666666666667e-03 4563 4563 4.1666666666666657e-02 4563 4055 4.1666666666666666e-03 4563 5073 -2.0833333333333329e-03 4563 4562 4.1666666666666666e-03 4563 3923 -2.0761130467597592e-20 4563 3920 -1.0416666666666667e-03 4563 4558 2.1684043449710089e-19 4563 4386 -6.2499999999999986e-03 4563 4564 -4.3368086899420177e-19 4563 4051 1.0416666666666662e-03 4564 4564 3.3333333333333326e-02 4564 4555 4.3368086899420177e-19 4564 4386 6.2499999999999986e-03 4564 4051 6.2499999999999986e-03 4565 4565 3.3333333333333326e-02 4565 4557 8.6736173798840355e-19 4565 4386 6.2499999999999986e-03 4565 3911 6.2499999999999986e-03 4566 4566 4.5833333333333323e-02 4566 3919 -1.0416666666666667e-03 4566 4567 4.1666666666666675e-03 4566 4784 -8.3333333333333315e-03 4566 3879 1.3010426069826053e-18 4566 3878 -5.2083333333333330e-03 4566 4786 -8.3333333333333315e-03 4566 3914 6.5052130349130266e-19 4566 2775 -2.0833333333333329e-03 4566 2776 -1.3541666666666665e-02 4566 3633 -2.0833333333333337e-03 4566 2971 -7.2916666666666668e-03 4566 2968 -2.0833333333333333e-03 4567 4567 3.3333333333333326e-02 4567 3873 -4.0939925783957855e-21 4567 4560 -4.1666666666666675e-03 4567 4561 -4.3368086899420177e-19 4567 3913 -4.1666666666666666e-03 4567 3914 -4.1666666666666657e-03 4567 3919 -6.2499999999999986e-03 4567 4566 4.1666666666666675e-03 4567 4784 8.6736173798840355e-19 4567 3879 1.6284208410963924e-19 4567 3878 -6.2499999999999986e-03 4567 2971 -1.6666666666666663e-02 4567 2776 -4.1666666666666675e-03 4568 4568 4.1666666666666664e-02 4568 3880 -2.0833333333333333e-03 4568 4571 2.0833333333333337e-03 4568 4580 -8.3333333333333315e-03 4568 3933 -2.0833333333333329e-03 4568 3927 -8.3333333333333315e-03 4568 3928 2.0833333333333337e-03 4568 3926 -2.0833333333333333e-03 4568 4552 -2.0833333333333337e-03 4568 4550 8.3333333333333315e-03 4568 3874 -8.3333333333333315e-03 4568 3875 2.0833333333333337e-03 4568 2778 -2.0833333333333329e-03 4569 4569 4.1666666666666657e-02 4569 3877 -2.0833333333333329e-03 4569 4570 2.0833333333333333e-03 4569 4900 8.3333333333333315e-03 4569 3931 -2.0833333333333329e-03 4569 3927 -9.3750000000000014e-03 4569 3920 -5.0116116045879435e-20 4569 3930 1.0416666666666671e-03 4569 4559 -1.0416666666666668e-02 4569 4561 1.5502688168223823e-19 4569 3874 -9.3750000000000014e-03 4569 3873 2.1705219273391446e-19 4569 3878 1.0416666666666669e-03 4570 4570 2.4999999999999998e-02 4570 3881 -1.0416666666666664e-03 4570 4572 2.0833333333333337e-03 4570 4902 -6.0159191589756597e-20 4570 3934 -1.0416666666666664e-03 4570 3874 -6.2499999999999995e-03 4570 3877 -2.0833333333333329e-03 4570 3878 -1.0416666666666667e-03 4570 4569 2.0833333333333337e-03 4570 4900 5.1510191104902139e-20 4570 3927 -6.2499999999999995e-03 4570 3931 -2.0833333333333329e-03 4570 3930 -1.0416666666666664e-03 4571 4571 2.4999999999999998e-02 4571 3875 -1.0416666666666664e-03 4571 4568 2.0833333333333337e-03 4571 4580 -1.0254392617697373e-19 4571 3928 -1.0416666666666664e-03 4571 3927 -6.2500000000000003e-03 4571 3934 -1.0416666666666664e-03 4571 3933 -2.0833333333333329e-03 4571 4572 2.0833333333333337e-03 4571 4924 -6.0159191589756597e-20 4571 3874 -6.2500000000000003e-03 4571 3881 -1.0416666666666664e-03 4571 3880 -2.0833333333333329e-03 4572 4572 4.1666666666666664e-02 4572 3877 -2.0833333333333333e-03 4572 4570 2.0833333333333333e-03 4572 4902 8.3333333333333315e-03 4572 3931 -2.0833333333333329e-03 4572 3927 -8.3333333333333315e-03 4572 3934 2.0833333333333337e-03 4572 3933 -2.0833333333333333e-03 4572 4571 2.0833333333333333e-03 4572 4924 8.3333333333333315e-03 4572 3874 -8.3333333333333315e-03 4572 3881 2.0833333333333337e-03 4572 3880 -2.0833333333333329e-03 4573 4573 2.0833333333333332e-02 4574 4574 2.0833333333333329e-02 4575 4575 2.0833333333333332e-02 4576 4576 2.4999999999999994e-02 4577 4577 2.4999999999999994e-02 4578 4578 2.0833333333333329e-02 4579 4579 4.1666666666666664e-02 4579 3940 2.0833333333333333e-03 4579 4928 2.0833333333333337e-03 4579 4580 8.3333333333333315e-03 4579 4275 -2.0833333333333337e-03 4579 4274 2.0833333333333329e-03 4579 4551 2.0833333333333337e-03 4579 4550 -8.3333333333333315e-03 4579 3938 -2.0833333333333337e-03 4579 3937 2.0833333333333329e-03 4579 2786 2.0833333333333333e-03 4580 4580 6.6666666666666652e-02 4580 3874 1.0416666666666669e-03 4580 4568 -8.3333333333333315e-03 4580 4571 1.3552527156068805e-20 4580 3927 1.0416666666666667e-03 4580 3928 -6.2500000000000003e-03 4580 3933 4.1666666666666666e-03 4580 4579 8.3333333333333315e-03 4580 4928 -1.3552527156068805e-20 4580 4275 -6.2500000000000003e-03 4580 4274 4.1666666666666666e-03 4580 4582 8.3333333333333315e-03 4580 4927 -2.7105054312137611e-20 4580 3875 -6.2500000000000003e-03 4580 3880 4.1666666666666666e-03 4580 4581 8.3333333333333315e-03 4580 4583 2.7105054312137611e-20 4580 3938 -6.2500000000000003e-03 4580 3940 4.1666666666666666e-03 4580 2784 1.0416666666666669e-03 4580 2769 1.0416666666666667e-03 4581 4581 4.1666666666666664e-02 4581 3933 2.0833333333333329e-03 4581 3937 2.0833333333333329e-03 4581 4553 2.0833333333333337e-03 4581 4550 -8.3333333333333315e-03 4581 3928 -2.0833333333333337e-03 4581 3926 2.0833333333333333e-03 4581 4583 -2.0833333333333337e-03 4581 4580 8.3333333333333315e-03 4581 3938 -2.0833333333333337e-03 4581 3940 2.0833333333333333e-03 4582 4582 4.1666666666666664e-02 4582 4550 -8.3333333333333315e-03 4582 4275 -2.0833333333333337e-03 4582 4274 2.0833333333333329e-03 4582 4927 2.0833333333333337e-03 4582 4580 8.3333333333333315e-03 4582 3875 -2.0833333333333337e-03 4582 3880 2.0833333333333333e-03 4582 2778 2.0833333333333329e-03 4582 3350 2.0833333333333337e-03 4582 2786 2.0833333333333333e-03 4582 2784 8.3333333333333315e-03 4582 2769 8.3333333333333315e-03 4583 4583 2.4999999999999998e-02 4583 3928 -1.0416666666666664e-03 4583 4923 1.0254392617697373e-19 4583 3933 -2.0833333333333329e-03 4583 4581 -2.0833333333333337e-03 4583 4580 6.0159191589756597e-20 4583 3938 -1.0416666666666664e-03 4583 3940 -2.0833333333333329e-03 4584 4584 2.0833333333333332e-02 4585 4585 2.0833333333333332e-02 4586 4586 6.6666666666666652e-02 4586 4029 -1.0416666666666669e-03 4586 4613 -8.3333333333333315e-03 4586 4589 1.3552527156068805e-20 4586 4041 6.2500000000000003e-03 4586 4027 -4.1666666666666666e-03 4586 4614 -8.3333333333333315e-03 4586 4591 1.3552527156068805e-20 4586 3858 -1.0416666666666667e-03 4586 3975 -1.0416666666666669e-03 4586 3844 -1.0416666666666669e-03 4586 3846 6.2500000000000003e-03 4586 3842 -4.1666666666666666e-03 4586 4603 8.3333333333333315e-03 4586 4594 1.3552527156068805e-20 4586 3970 -1.0416666666666667e-03 4586 3974 6.2500000000000003e-03 4586 3973 -4.1666666666666666e-03 4586 4611 -8.3333333333333315e-03 4586 4587 1.3552527156068805e-20 4586 3950 -1.0416666666666667e-03 4586 3949 6.2500000000000003e-03 4586 3948 -4.1666666666666666e-03 4587 4587 2.5000000000000001e-02 4587 3950 6.2500000000000003e-03 4587 3948 2.0833333333333329e-03 4587 3975 6.2500000000000003e-03 4587 3973 2.0833333333333329e-03 4587 3974 1.0416666666666664e-03 4587 4611 2.0833333333333337e-03 4587 4586 -1.0254392617697373e-19 4587 3949 1.0416666666666664e-03 4587 1434 1.0416666666666664e-03 4587 1926 2.0833333333333337e-03 4587 1930 -6.0159191589756597e-20 4587 1467 1.0416666666666662e-03 4588 4588 5.8333333333333320e-02 4588 3948 -4.1666666666666666e-03 4588 4015 -4.1666666666666675e-03 4588 4596 1.3552527156068805e-20 4588 4027 -4.1666666666666666e-03 4588 4589 2.7105054312137611e-20 4588 1439 1.0416666666666664e-03 4588 2136 -2.0833333333333329e-03 4588 2133 -1.2499999999999997e-02 4588 1254 5.2083333333333330e-03 4589 4589 2.5000000000000001e-02 4589 3949 1.0416666666666664e-03 4589 4613 2.0833333333333337e-03 4589 4586 -1.0254392617697373e-19 4589 4041 1.0416666666666664e-03 4589 4027 2.0833333333333329e-03 4589 4588 6.0159191589756597e-20 4589 3948 2.0833333333333329e-03 4590 4590 6.6666666666666652e-02 4590 3858 -1.0416666666666669e-03 4590 3958 -1.0416666666666669e-03 4590 4610 8.3333333333333315e-03 4590 4593 2.7105054312137611e-20 4590 3845 -1.0416666666666667e-03 4590 3857 6.2500000000000003e-03 4590 3842 -4.1666666666666666e-03 4590 4018 -1.0416666666666669e-03 4590 4649 -8.3333333333333315e-03 4590 4596 2.7105054312137611e-20 4590 4016 6.2500000000000003e-03 4590 4015 -4.1666666666666666e-03 4590 4650 -8.3333333333333315e-03 4590 4595 2.7105054312137611e-20 4590 3962 -1.0416666666666667e-03 4590 3961 6.2500000000000003e-03 4590 3956 -4.1666666666666666e-03 4590 4648 -8.3333333333333315e-03 4590 4591 2.7105054312137611e-20 4590 4029 -1.0416666666666667e-03 4590 4028 6.2500000000000003e-03 4590 4027 -4.1666666666666666e-03 4591 4591 2.4999999999999998e-02 4591 3857 1.0416666666666664e-03 4591 4041 1.0416666666666664e-03 4591 4614 2.0833333333333337e-03 4591 4586 -1.0254392617697373e-19 4591 3858 6.2500000000000003e-03 4591 3846 1.0416666666666664e-03 4591 3842 2.0833333333333329e-03 4591 4648 2.0833333333333337e-03 4591 4590 6.0159191589756597e-20 4591 4029 6.2500000000000003e-03 4591 4028 1.0416666666666662e-03 4591 4027 2.0833333333333329e-03 4592 4592 6.6666666666666652e-02 4592 3957 6.2500000000000003e-03 4592 3956 -4.1666666666666666e-03 4592 3972 6.2500000000000003e-03 4592 3973 -4.1666666666666666e-03 4592 3845 -1.0416666666666669e-03 4592 3970 -1.0416666666666669e-03 4592 4598 -8.3333333333333315e-03 4592 4594 2.7105054312137611e-20 4592 3844 -1.0416666666666667e-03 4592 3843 6.2500000000000003e-03 4592 3842 -4.1666666666666666e-03 4592 4599 -8.3333333333333315e-03 4592 4593 1.3552527156068805e-20 4592 3958 -1.0416666666666667e-03 4592 1454 -1.0416666666666669e-03 4592 1646 -1.0416666666666669e-03 4592 2194 -8.3333333333333315e-03 4592 2193 2.7105054312137611e-20 4592 1458 -1.0416666666666667e-03 4592 1457 6.2500000000000003e-03 4592 1456 -4.1666666666666666e-03 4592 1937 -8.3333333333333315e-03 4592 1936 -1.3552527156068805e-20 4592 1463 -1.0416666666666667e-03 4593 4593 2.4999999999999998e-02 4593 3961 1.0416666666666664e-03 4593 4610 -2.0833333333333337e-03 4593 4590 6.0159191589756597e-20 4593 3857 1.0416666666666664e-03 4593 3845 6.2500000000000003e-03 4593 3843 1.0416666666666664e-03 4593 3842 2.0833333333333329e-03 4593 4599 2.0833333333333337e-03 4593 4592 -1.0254392617697373e-19 4593 3958 6.2500000000000003e-03 4593 3957 1.0416666666666664e-03 4593 3956 2.0833333333333329e-03 4594 4594 2.5000000000000001e-02 4594 3846 1.0416666666666664e-03 4594 4603 -2.0833333333333337e-03 4594 4586 -1.0254392617697373e-19 4594 3974 1.0416666666666664e-03 4594 3970 6.2500000000000003e-03 4594 3972 1.0416666666666664e-03 4594 3973 2.0833333333333329e-03 4594 4598 2.0833333333333337e-03 4594 4592 6.0159191589756597e-20 4594 3844 6.2500000000000003e-03 4594 3843 1.0416666666666664e-03 4594 3842 2.0833333333333329e-03 4595 4595 2.4999999999999998e-02 4595 4018 6.2499999999999995e-03 4595 4015 2.0833333333333329e-03 4595 3962 6.2499999999999995e-03 4595 3956 2.0833333333333324e-03 4595 4016 1.0416666666666664e-03 4595 4650 2.0833333333333337e-03 4595 4590 6.0159191589756597e-20 4595 3961 1.0416666666666662e-03 4595 1254 1.0416666666666667e-03 4595 2132 2.0833333333333337e-03 4595 2133 5.1510191104902139e-20 4595 1647 1.0416666666666664e-03 4596 4596 2.4999999999999998e-02 4596 4588 -1.0254392617697373e-19 4596 4028 1.0416666666666664e-03 4596 4027 2.0833333333333329e-03 4596 4649 2.0833333333333337e-03 4596 4590 6.0159191589756597e-20 4596 4016 1.0416666666666664e-03 4596 4015 2.0833333333333329e-03 4597 4597 6.6666666666666652e-02 4597 3972 6.2500000000000003e-03 4597 3971 -4.1666666666666666e-03 4597 3957 6.2500000000000003e-03 4597 3844 -1.0416666666666669e-03 4597 3958 -1.0416666666666669e-03 4597 4599 -8.3333333333333315e-03 4597 4605 -1.3552527156068805e-20 4597 3845 -1.0416666666666667e-03 4597 3843 6.2500000000000003e-03 4597 3851 -4.1666666666666666e-03 4597 4598 -8.3333333333333315e-03 4597 4602 -2.7105054312137611e-20 4597 3970 -1.0416666666666667e-03 4597 1458 -1.0416666666666669e-03 4597 1463 -1.0416666666666669e-03 4597 1937 -8.3333333333333315e-03 4597 1014 1.3552527156068805e-20 4597 1454 -1.0416666666666667e-03 4597 1457 6.2500000000000003e-03 4597 431 -4.1666666666666666e-03 4597 2194 -8.3333333333333315e-03 4597 1013 2.7105054312137611e-20 4597 1646 -1.0416666666666667e-03 4597 491 -4.1666666666666666e-03 4598 4598 4.1666666666666664e-02 4598 3851 2.0833333333333329e-03 4598 3973 2.0833333333333329e-03 4598 4594 2.0833333333333337e-03 4598 4592 -8.3333333333333315e-03 4598 3844 8.3333333333333315e-03 4598 3843 -2.0833333333333337e-03 4598 3842 2.0833333333333333e-03 4598 4602 -2.0833333333333337e-03 4598 4597 -8.3333333333333315e-03 4598 3970 8.3333333333333315e-03 4598 3972 -2.0833333333333337e-03 4598 3971 2.0833333333333333e-03 4599 4599 4.1666666666666664e-02 4599 4605 -2.0833333333333337e-03 4599 4597 -8.3333333333333315e-03 4599 3851 2.0833333333333329e-03 4599 3845 8.3333333333333315e-03 4599 3843 -2.0833333333333337e-03 4599 3842 2.0833333333333333e-03 4599 4593 2.0833333333333337e-03 4599 4592 -8.3333333333333315e-03 4599 3958 8.3333333333333315e-03 4599 3957 -2.0833333333333337e-03 4599 3956 2.0833333333333329e-03 4599 491 2.0833333333333333e-03 4600 4600 2.4999999999999996e-10 4600 3848 -1.0416666666666663e-11 4600 3974 -1.0416666666666663e-11 4600 4603 2.0833333333333336e-11 4600 4612 -2.2913451068275814e-27 4600 3844 -6.2500000000000004e-11 4600 3846 -1.0416666666666666e-11 4600 3850 -2.0833333333333326e-11 4600 4601 2.0833333333333336e-11 4600 4888 -9.5018296033870872e-28 4600 3970 -6.2500000000000004e-11 4600 3967 -1.0416666666666666e-11 4600 3969 -2.0833333333333326e-11 4601 4601 4.1666666666666662e-10 4601 3850 -2.0833333333333329e-11 4601 3966 -2.0833333333333329e-11 4601 4447 -2.0833333333333339e-11 4601 4436 8.3333333333333330e-11 4601 3844 -8.3333333333333330e-11 4601 3848 2.0833333333333336e-11 4601 3847 -2.0833333333333332e-11 4601 4600 2.0833333333333339e-11 4601 4888 8.3333333333333330e-11 4601 3970 -8.3333333333333330e-11 4601 3967 2.0833333333333336e-11 4601 3969 -2.0833333333333332e-11 4602 4602 2.4999999999999998e-02 4602 3843 -1.0416666666666664e-03 4602 3978 -1.0416666666666664e-03 4602 4604 2.0833333333333337e-03 4602 4889 -1.0254392617697373e-19 4602 3844 -6.2500000000000003e-03 4602 3849 -1.0416666666666664e-03 4602 3851 -2.0833333333333329e-03 4602 4598 -2.0833333333333337e-03 4602 4597 -6.0159191589756597e-20 4602 3970 -6.2500000000000003e-03 4602 3972 -1.0416666666666664e-03 4602 3971 -2.0833333333333329e-03 4603 4603 2.0833333541666669e-02 4603 3969 -2.0833333333333329e-11 4603 4600 2.0833333333333339e-11 4603 4612 -8.3333333333333330e-11 4603 3850 -2.0833333333333332e-11 4603 3844 -4.1666667083333324e-03 4603 3846 1.0416666770833331e-03 4603 3842 -2.0833333333333329e-03 4603 4594 -2.0833333333333337e-03 4603 4586 8.3333333333333315e-03 4603 3970 -4.1666667083333333e-03 4603 3974 1.0416666770833335e-03 4603 3973 -2.0833333333333333e-03 4604 4604 2.0833333541666665e-02 4604 3971 -2.0833333333333329e-03 4604 4602 2.0833333333333337e-03 4604 4889 -8.3333333333333315e-03 4604 3851 -2.0833333333333333e-03 4604 3844 -4.1666667083333333e-03 4604 3849 1.0416666770833335e-03 4604 3847 -2.0833333333333329e-11 4604 4447 -2.0833333333333339e-11 4604 4438 8.3333333333333330e-11 4604 3970 -4.1666667083333324e-03 4604 3978 1.0416666770833331e-03 4604 3966 -2.0833333333333332e-11 4605 4605 2.4999999999999998e-02 4605 3957 -1.0416666666666664e-03 4605 4599 -2.0833333333333337e-03 4605 4597 1.0254392617697373e-19 4605 3843 -1.0416666666666664e-03 4605 3845 -6.2500000000000003e-03 4605 3852 -1.0416666666666664e-03 4605 3851 -2.0833333333333329e-03 4605 4606 2.0833333333333337e-03 4605 3958 -6.2500000000000003e-03 4605 3662 -6.0159191589756597e-20 4605 2830 -1.0416666666666664e-03 4605 491 -2.0833333333333329e-03 4606 4606 4.1666666666666664e-02 4606 4607 2.0833333333333333e-03 4606 3853 -2.0833333333333329e-03 4606 3845 -8.3333333333333315e-03 4606 3852 2.0833333333333337e-03 4606 3851 -2.0833333333333333e-03 4606 4605 2.0833333333333333e-03 4606 3958 -8.3333333333333315e-03 4606 2829 -2.0833333333333333e-03 4606 3692 8.3333333333333315e-03 4606 3662 8.3333333333333315e-03 4606 2830 2.0833333333333337e-03 4606 491 -2.0833333333333329e-03 4607 4607 2.4999999999999998e-02 4607 3854 -1.0416666666666664e-03 4607 4608 2.0833333333333337e-03 4607 4634 -1.0254392617697373e-19 4607 3960 -1.0416666666666664e-03 4607 3958 -6.2500000000000003e-03 4607 4606 2.0833333333333337e-03 4607 3845 -6.2500000000000003e-03 4607 3852 -1.0416666666666664e-03 4607 3853 -2.0833333333333329e-03 4607 2830 -1.0416666666666664e-03 4607 2829 -2.0833333333333329e-03 4607 3692 -6.0159191589756597e-20 4608 4608 4.1666666666666664e-02 4608 3959 -2.0833333333333333e-03 4608 4609 2.0833333333333337e-03 4608 4620 8.3333333333333315e-03 4608 3856 -2.0833333333333329e-03 4608 3845 -8.3333333333333315e-03 4608 3854 2.0833333333333337e-03 4608 3853 -2.0833333333333333e-03 4608 4607 2.0833333333333337e-03 4608 4634 -8.3333333333333315e-03 4608 3958 -8.3333333333333315e-03 4608 3960 2.0833333333333337e-03 4608 2829 -2.0833333333333329e-03 4609 4609 2.4999999999999998e-02 4609 3960 -1.0416666666666664e-03 4609 4608 2.0833333333333337e-03 4609 4620 1.0254392617697373e-19 4609 3854 -1.0416666666666664e-03 4609 3845 -6.2500000000000003e-03 4609 3857 -1.0416666666666664e-03 4609 3856 -2.0833333333333329e-03 4609 4610 2.0833333333333337e-03 4609 4626 -6.0159191589756597e-20 4609 3958 -6.2500000000000003e-03 4609 3961 -1.0416666666666664e-03 4609 3959 -2.0833333333333329e-03 4610 4610 4.1666666666666664e-02 4610 3956 -2.0833333333333333e-03 4610 4593 -2.0833333333333333e-03 4610 4590 8.3333333333333315e-03 4610 3842 -2.0833333333333329e-03 4610 3845 -8.3333333333333315e-03 4610 3857 2.0833333333333337e-03 4610 3856 -2.0833333333333333e-03 4610 4609 2.0833333333333333e-03 4610 4626 8.3333333333333315e-03 4610 3958 -8.3333333333333315e-03 4610 3961 2.0833333333333337e-03 4610 3959 -2.0833333333333329e-03 4611 4611 2.0833333541666669e-02 4611 3953 2.0833333333333329e-11 4611 4615 2.0833333333333339e-11 4611 4612 8.3333333333333330e-11 4611 3969 2.0833333333333332e-11 4611 3975 4.1666667083333324e-03 4611 3974 -1.0416666770833333e-03 4611 3973 2.0833333333333329e-03 4611 4587 2.0833333333333337e-03 4611 4586 -8.3333333333333315e-03 4611 3950 4.1666667083333333e-03 4611 3949 -1.0416666770833337e-03 4611 3948 2.0833333333333333e-03 4612 4612 6.6666666666666664e-10 4612 3858 1.0416666666666666e-11 4612 4614 8.3333333333333330e-11 4612 4892 1.8175355256292112e-27 4612 4029 1.0416666666666666e-11 4612 4041 -6.2499999999999991e-11 4612 4034 4.1666666666666665e-11 4612 3970 1.0416666666666666e-11 4612 3950 1.0416666666666666e-11 4612 4611 8.3333333333333330e-11 4612 4615 1.8175355256292112e-27 4612 3975 1.0416666666666666e-11 4612 3974 -6.2499999999999991e-11 4612 3969 4.1666666666666665e-11 4612 4603 -8.3333333333333330e-11 4612 4600 -1.8175355256292112e-27 4612 3844 1.0416666666666666e-11 4612 3846 -6.2499999999999991e-11 4612 3850 4.1666666666666665e-11 4612 4613 8.3333333333333330e-11 4612 4657 -1.8175355256292112e-27 4612 3949 -6.2499999999999991e-11 4612 3953 4.1666666666666665e-11 4613 4613 2.0833333541666665e-02 4613 4034 2.0833333333333329e-11 4613 3948 2.0833333333333329e-03 4613 4589 2.0833333333333337e-03 4613 4586 -8.3333333333333315e-03 4613 4041 -1.0416666770833335e-03 4613 4027 2.0833333333333333e-03 4613 4657 -2.0833333333333339e-11 4613 4612 8.3333333333333330e-11 4613 3949 -1.0416666770833331e-03 4613 3953 2.0833333333333332e-11 4614 4614 2.0833333541666669e-02 4614 3850 2.0833333333333329e-11 4614 4892 2.0833333333333339e-11 4614 4612 8.3333333333333330e-11 4614 4034 2.0833333333333332e-11 4614 4029 4.1666667083333324e-03 4614 4041 -1.0416666770833333e-03 4614 4027 2.0833333333333329e-03 4614 4591 2.0833333333333337e-03 4614 4586 -8.3333333333333315e-03 4614 3858 4.1666667083333333e-03 4614 3846 -1.0416666770833337e-03 4614 3842 2.0833333333333333e-03 4615 4615 2.4999999999999996e-10 4615 3975 6.2499999999999991e-11 4615 3969 2.0833333333333326e-11 4615 3950 6.2500000000000004e-11 4615 3953 2.0833333333333326e-11 4615 3949 1.0416666666666666e-11 4615 4611 2.0833333333333339e-11 4615 4612 2.2913451068275814e-27 4615 3974 1.0416666666666666e-11 4615 1468 1.0416666666666665e-11 4615 1950 -2.0833333333333336e-11 4615 2074 9.5018296033870872e-28 4615 1438 1.0416666666666665e-11 4616 4616 6.6666666666666652e-02 4616 4625 2.7105054312137611e-20 4616 4294 -4.1666666666666666e-03 4616 4623 2.7105054312137611e-20 4616 3990 -4.1666666666666666e-03 4616 4629 2.7105054312137611e-20 4616 3998 -4.1666666666666666e-03 4616 4617 2.7105054312137611e-20 4616 3979 -4.1666666666666666e-03 4617 4617 2.4999999999999998e-02 4617 3985 1.0416666666666664e-03 4617 4646 -2.0833333333333337e-03 4617 4618 -1.0254392617697373e-19 4617 4011 1.0416666666666664e-03 4617 3998 2.0833333333333329e-03 4617 4616 6.0159191589756597e-20 4617 3979 2.0833333333333329e-03 4618 4618 6.6666666666666652e-02 4618 4000 -1.0416666666666669e-03 4618 4646 8.3333333333333315e-03 4618 4617 1.3552527156068805e-20 4618 4011 6.2500000000000003e-03 4618 3998 -4.1666666666666666e-03 4618 4968 8.3333333333333315e-03 4618 4621 1.3552527156068805e-20 4618 3855 -1.0416666666666667e-03 4618 3858 -1.0416666666666669e-03 4618 3859 6.2500000000000003e-03 4618 3856 -4.1666666666666666e-03 4618 4970 8.3333333333333315e-03 4618 4630 1.3552527156068805e-20 4618 4029 -1.0416666666666667e-03 4618 4040 6.2500000000000003e-03 4618 4030 -4.1666666666666666e-03 4618 4758 8.3333333333333315e-03 4618 4619 1.3552527156068805e-20 4618 3985 6.2500000000000003e-03 4618 3979 -4.1666666666666666e-03 4619 4619 2.5000000000000001e-02 4619 4624 6.0159191589756597e-20 4619 4040 1.0416666666666664e-03 4619 4030 2.0833333333333329e-03 4619 4758 -2.0833333333333337e-03 4619 4618 -1.0254392617697373e-19 4619 3985 1.0416666666666664e-03 4619 3979 2.0833333333333329e-03 4620 4620 6.6666666666666652e-02 4620 3855 -1.0416666666666669e-03 4620 3958 -1.0416666666666669e-03 4620 4608 8.3333333333333315e-03 4620 4609 -1.3552527156068805e-20 4620 3845 -1.0416666666666667e-03 4620 3854 6.2500000000000003e-03 4620 3856 -4.1666666666666666e-03 4620 4635 -8.3333333333333315e-03 4620 4629 1.3552527156068805e-20 4620 3991 6.2500000000000003e-03 4620 3990 -4.1666666666666666e-03 4620 4636 -8.3333333333333315e-03 4620 4628 2.7105054312137611e-20 4620 3960 6.2500000000000003e-03 4620 3959 -4.1666666666666666e-03 4620 4633 -8.3333333333333315e-03 4620 4621 2.7105054312137611e-20 4620 4000 -1.0416666666666667e-03 4620 3999 6.2500000000000003e-03 4620 3998 -4.1666666666666666e-03 4620 3014 -1.0416666666666669e-03 4620 2831 -1.0416666666666667e-03 4621 4621 2.4999999999999998e-02 4621 3854 1.0416666666666664e-03 4621 4011 1.0416666666666664e-03 4621 4968 -2.0833333333333337e-03 4621 4618 -1.0254392617697373e-19 4621 3855 6.2500000000000003e-03 4621 3859 1.0416666666666664e-03 4621 3856 2.0833333333333329e-03 4621 4633 2.0833333333333337e-03 4621 4620 6.0159191589756597e-20 4621 4000 6.2500000000000003e-03 4621 3999 1.0416666666666664e-03 4621 3998 2.0833333333333329e-03 4622 4622 6.6666666666666652e-02 4622 4018 -1.0416666666666669e-03 4622 4972 -8.3333333333333315e-03 4622 4632 1.3552527156068805e-20 4622 4024 6.2500000000000003e-03 4622 4023 -4.1666666666666666e-03 4622 4655 8.3333333333333315e-03 4622 4631 1.3552527156068805e-20 4622 3962 -1.0416666666666667e-03 4622 3965 6.2500000000000003e-03 4622 3959 -4.1666666666666666e-03 4622 4641 8.3333333333333315e-03 4622 4628 1.3552527156068805e-20 4622 3995 6.2500000000000003e-03 4622 3990 -4.1666666666666666e-03 4622 4971 -8.3333333333333315e-03 4622 4623 1.3552527156068805e-20 4622 4295 6.2500000000000003e-03 4622 4294 -4.1666666666666666e-03 4622 2831 -1.0416666666666669e-03 4622 3014 -1.0416666666666667e-03 4623 4623 2.4999999999999998e-02 4623 3995 1.0416666666666664e-03 4623 4616 6.0159191589756597e-20 4623 3990 2.0833333333333329e-03 4623 4971 2.0833333333333337e-03 4623 4622 -1.0254392617697373e-19 4623 4295 1.0416666666666664e-03 4623 4294 2.0833333333333329e-03 4624 4624 6.6666666666666652e-02 4624 4619 2.7105054312137611e-20 4624 4030 -4.1666666666666666e-03 4624 4627 1.3552527156068805e-20 4624 4023 -4.1666666666666666e-03 4624 4632 2.7105054312137611e-20 4624 4294 -4.1666666666666666e-03 4624 4625 1.3552527156068805e-20 4624 3979 -4.1666666666666666e-03 4625 4625 2.4999999999999998e-02 4625 4616 6.0159191589756597e-20 4625 4294 2.0833333333333329e-03 4625 4624 -1.0254392617697373e-19 4625 3979 2.0833333333333329e-03 4626 4626 6.6666666666666652e-02 4626 3962 -1.0416666666666669e-03 4626 4650 -8.3333333333333315e-03 4626 4631 2.7105054312137611e-20 4626 4018 -1.0416666666666667e-03 4626 4016 6.2500000000000003e-03 4626 4023 -4.1666666666666666e-03 4626 3845 -1.0416666666666669e-03 4626 4029 -1.0416666666666669e-03 4626 4648 -8.3333333333333315e-03 4626 4630 2.7105054312137611e-20 4626 3858 -1.0416666666666667e-03 4626 3857 6.2500000000000003e-03 4626 3856 -4.1666666666666666e-03 4626 4610 8.3333333333333315e-03 4626 4609 -2.7105054312137611e-20 4626 3958 -1.0416666666666667e-03 4626 3961 6.2500000000000003e-03 4626 3959 -4.1666666666666666e-03 4626 4649 -8.3333333333333315e-03 4626 4627 2.7105054312137611e-20 4626 4028 6.2500000000000003e-03 4626 4030 -4.1666666666666666e-03 4627 4627 2.4999999999999998e-02 4627 4016 1.0416666666666664e-03 4627 4624 -1.0254392617697373e-19 4627 4023 2.0833333333333329e-03 4627 4649 2.0833333333333337e-03 4627 4626 6.0159191589756597e-20 4627 4028 1.0416666666666664e-03 4627 4030 2.0833333333333329e-03 4628 4628 2.5000000000000001e-02 4628 3965 1.0416666666666664e-03 4628 4641 -2.0833333333333337e-03 4628 4622 -1.0254392617697373e-19 4628 3995 1.0416666666666664e-03 4628 3991 1.0416666666666664e-03 4628 3990 2.0833333333333329e-03 4628 4636 2.0833333333333337e-03 4628 4620 6.0159191589756597e-20 4628 3960 1.0416666666666664e-03 4628 3959 2.0833333333333329e-03 4628 3014 6.2500000000000003e-03 4628 2831 6.2500000000000003e-03 4629 4629 2.4999999999999998e-02 4629 4616 6.0159191589756597e-20 4629 3999 1.0416666666666664e-03 4629 3998 2.0833333333333329e-03 4629 4635 2.0833333333333337e-03 4629 4620 -1.0254392617697373e-19 4629 3991 1.0416666666666664e-03 4629 3990 2.0833333333333329e-03 4630 4630 2.4999999999999998e-02 4630 3859 1.0416666666666664e-03 4630 4970 -2.0833333333333337e-03 4630 4618 -1.0254392617697373e-19 4630 4040 1.0416666666666664e-03 4630 4029 6.2500000000000003e-03 4630 4028 1.0416666666666664e-03 4630 4030 2.0833333333333329e-03 4630 4648 2.0833333333333337e-03 4630 4626 6.0159191589756597e-20 4630 3858 6.2500000000000003e-03 4630 3857 1.0416666666666662e-03 4630 3856 2.0833333333333329e-03 4631 4631 2.4999999999999998e-02 4631 3961 1.0416666666666664e-03 4631 4650 2.0833333333333337e-03 4631 4626 6.0159191589756597e-20 4631 4016 1.0416666666666662e-03 4631 4018 6.2500000000000003e-03 4631 4024 1.0416666666666664e-03 4631 4023 2.0833333333333329e-03 4631 4655 -2.0833333333333337e-03 4631 4622 -1.0254392617697373e-19 4631 3962 6.2500000000000003e-03 4631 3965 1.0416666666666664e-03 4631 3959 2.0833333333333329e-03 4632 4632 2.5000000000000001e-02 4632 4624 6.0159191589756597e-20 4632 4295 1.0416666666666664e-03 4632 4294 2.0833333333333329e-03 4632 4972 2.0833333333333337e-03 4632 4622 -1.0254392617697373e-19 4632 4024 1.0416666666666664e-03 4632 4023 2.0833333333333329e-03 4633 4633 4.1666666666666664e-02 4633 3856 2.0833333333333329e-03 4633 4001 2.0833333333333329e-03 4633 4966 2.0833333333333337e-03 4633 4634 8.3333333333333315e-03 4633 3855 8.3333333333333315e-03 4633 3854 -2.0833333333333337e-03 4633 3853 2.0833333333333333e-03 4633 4621 2.0833333333333337e-03 4633 4620 -8.3333333333333315e-03 4633 4000 8.3333333333333315e-03 4633 3999 -2.0833333333333337e-03 4633 3998 2.0833333333333333e-03 4634 4634 6.6666666666666652e-02 4634 4636 8.3333333333333315e-03 4634 3991 -6.2500000000000003e-03 4634 3845 1.0416666666666669e-03 4634 4000 1.0416666666666669e-03 4634 4633 8.3333333333333315e-03 4634 4966 -2.7105054312137611e-20 4634 3855 1.0416666666666667e-03 4634 3854 -6.2500000000000003e-03 4634 3853 4.1666666666666666e-03 4634 4608 -8.3333333333333315e-03 4634 4607 1.3552527156068805e-20 4634 3958 1.0416666666666667e-03 4634 3960 -6.2500000000000003e-03 4634 4635 8.3333333333333315e-03 4634 4637 1.3552527156068805e-20 4634 3999 -6.2500000000000003e-03 4634 4001 4.1666666666666666e-03 4634 2831 1.0416666666666669e-03 4634 3693 -2.7105054312137611e-20 4634 3014 1.0416666666666667e-03 4634 3011 4.1666666666666666e-03 4634 2829 4.1666666666666666e-03 4635 4635 4.1666666666666664e-02 4635 3998 2.0833333333333333e-03 4635 4629 2.0833333333333337e-03 4635 4620 -8.3333333333333315e-03 4635 3991 -2.0833333333333337e-03 4635 3990 2.0833333333333329e-03 4635 4637 -2.0833333333333337e-03 4635 4634 8.3333333333333315e-03 4635 3999 -2.0833333333333337e-03 4635 4001 2.0833333333333329e-03 4635 3011 2.0833333333333333e-03 4636 4636 4.1666666666666664e-02 4636 4634 8.3333333333333315e-03 4636 3991 -2.0833333333333337e-03 4636 3990 2.0833333333333329e-03 4636 4628 2.0833333333333337e-03 4636 4620 -8.3333333333333315e-03 4636 3960 -2.0833333333333337e-03 4636 3959 2.0833333333333333e-03 4636 2829 2.0833333333333329e-03 4636 3693 2.0833333333333337e-03 4636 3011 2.0833333333333333e-03 4636 3014 8.3333333333333315e-03 4636 2831 8.3333333333333315e-03 4637 4637 2.4999999999999998e-02 4637 3991 -1.0416666666666664e-03 4637 4635 -2.0833333333333337e-03 4637 4634 -1.0254392617697373e-19 4637 3999 -1.0416666666666664e-03 4637 4001 -2.0833333333333329e-03 4637 3691 -6.0159191589756597e-20 4637 3011 -2.0833333333333329e-03 4638 4638 2.0833333333333332e-02 4639 4639 2.0833333333333332e-02 4640 4640 2.5000000000000001e-02 4640 4950 -6.0159191589756597e-20 4640 3995 -1.0416666666666664e-03 4640 3994 -2.0833333333333329e-03 4640 4641 2.0833333333333337e-03 4640 4952 1.0254392617697373e-19 4640 3965 -1.0416666666666664e-03 4640 3963 -2.0833333333333329e-03 4640 2827 -1.0416666666666664e-03 4640 3686 -2.0833333333333337e-03 4640 3018 -1.0416666666666664e-03 4640 3014 -6.2500000000000003e-03 4640 2831 -6.2500000000000003e-03 4641 4641 4.1666666666666664e-02 4641 3959 -2.0833333333333329e-03 4641 4628 -2.0833333333333337e-03 4641 4622 8.3333333333333315e-03 4641 3990 -2.0833333333333333e-03 4641 3995 2.0833333333333333e-03 4641 3994 -2.0833333333333329e-03 4641 4640 2.0833333333333337e-03 4641 4952 8.3333333333333315e-03 4641 3965 2.0833333333333333e-03 4641 3963 -2.0833333333333333e-03 4641 3014 -8.3333333333333315e-03 4641 2831 -8.3333333333333315e-03 4642 4642 2.0833333333333332e-02 4643 4643 2.0833333333333332e-02 4644 4644 2.0833333333333332e-02 4645 4645 2.4999999999999996e-10 4645 4011 -1.0416666666666666e-11 4645 4736 -9.5018296033870872e-28 4645 4003 -2.0833333333333326e-11 4645 4646 2.0833333333333339e-11 4645 4742 2.2913451068275814e-27 4645 3985 -1.0416666666666666e-11 4645 3982 -2.0833333333333326e-11 4646 4646 2.0833333541666665e-02 4646 4003 -2.0833333333333329e-11 4646 3979 -2.0833333333333329e-03 4646 4617 -2.0833333333333337e-03 4646 4618 8.3333333333333315e-03 4646 4011 1.0416666770833337e-03 4646 3998 -2.0833333333333333e-03 4646 4645 2.0833333333333339e-11 4646 4742 8.3333333333333330e-11 4646 3985 1.0416666770833333e-03 4646 3982 -2.0833333333333332e-11 4647 4647 2.0833333333333331e-10 4648 4648 4.1666666666666664e-02 4648 3842 2.0833333333333333e-03 4648 4030 2.0833333333333333e-03 4648 4630 2.0833333333333337e-03 4648 4626 -8.3333333333333315e-03 4648 3858 8.3333333333333315e-03 4648 3857 -2.0833333333333337e-03 4648 3856 2.0833333333333329e-03 4648 4591 2.0833333333333337e-03 4648 4590 -8.3333333333333315e-03 4648 4029 8.3333333333333315e-03 4648 4028 -2.0833333333333337e-03 4648 4027 2.0833333333333329e-03 4649 4649 4.1666666666666664e-02 4649 4023 2.0833333333333333e-03 4649 4027 2.0833333333333333e-03 4649 4596 2.0833333333333333e-03 4649 4590 -8.3333333333333315e-03 4649 4016 -2.0833333333333337e-03 4649 4015 2.0833333333333329e-03 4649 4627 2.0833333333333333e-03 4649 4626 -8.3333333333333315e-03 4649 4028 -2.0833333333333337e-03 4649 4030 2.0833333333333329e-03 4650 4650 4.1666666666666664e-02 4650 3959 2.0833333333333333e-03 4650 4631 2.0833333333333337e-03 4650 4626 -8.3333333333333315e-03 4650 4023 2.0833333333333329e-03 4650 4018 8.3333333333333315e-03 4650 4016 -2.0833333333333337e-03 4650 4015 2.0833333333333333e-03 4650 4595 2.0833333333333337e-03 4650 4590 -8.3333333333333315e-03 4650 3962 8.3333333333333315e-03 4650 3961 -2.0833333333333337e-03 4650 3956 2.0833333333333329e-03 4651 4651 2.0833333333333332e-02 4652 4652 2.0833333333333332e-02 4653 4653 2.4999999999999998e-02 4653 3965 -1.0416666666666664e-03 4653 4655 2.0833333333333337e-03 4653 4952 1.0254392617697373e-19 4653 4024 -1.0416666666666664e-03 4653 4018 -6.2500000000000003e-03 4653 4021 -1.0416666666666664e-03 4653 4020 -2.0833333333333329e-03 4653 4654 -2.0833333333333337e-03 4653 4946 -6.0159191589756597e-20 4653 3962 -6.2500000000000003e-03 4653 3964 -1.0416666666666662e-03 4653 3963 -2.0833333333333329e-03 4654 4654 4.1666666666666664e-02 4654 3962 9.3749999999999997e-03 4654 3964 -1.0416666666666669e-03 4654 4018 9.3749999999999979e-03 4654 4021 -1.0416666666666669e-03 4654 4020 2.0833333333333333e-03 4654 4653 -2.0833333333333337e-03 4654 4946 -8.3333333333333315e-03 4654 3963 2.0833333333333329e-03 4654 1647 2.1705219273391446e-19 4654 2132 1.0416666666666666e-02 4654 1793 2.6946235634527430e-19 4654 1254 -2.1705219273391446e-19 4655 4655 4.1666666666666664e-02 4655 3963 -2.0833333333333329e-03 4655 4653 2.0833333333333337e-03 4655 4952 8.3333333333333315e-03 4655 4020 -2.0833333333333333e-03 4655 4018 -8.3333333333333315e-03 4655 4024 2.0833333333333337e-03 4655 4023 -2.0833333333333329e-03 4655 4631 -2.0833333333333337e-03 4655 4622 8.3333333333333315e-03 4655 3962 -8.3333333333333315e-03 4655 3965 2.0833333333333337e-03 4655 3959 -2.0833333333333333e-03 4656 4656 2.0833333333333332e-02 4657 4657 2.4999999999999996e-10 4657 4890 -9.5018296033870872e-28 4657 4041 -1.0416666666666663e-11 4657 4034 -2.0833333333333326e-11 4657 4613 -2.0833333333333336e-11 4657 4612 -2.2913451068275814e-27 4657 3949 -1.0416666666666666e-11 4657 3953 -2.0833333333333326e-11 4658 4658 2.0833333333333331e-10 4659 4659 6.6666666666666664e-10 4659 4666 -1.8175355256292112e-27 4659 4324 -4.1666666666666665e-11 4659 4670 -1.8175355256292112e-27 4659 4074 -4.1666666666666665e-11 4659 4672 -1.8175355256292112e-27 4659 4091 -4.1666666666666665e-11 4659 4660 -1.8175355256292112e-27 4659 4044 -4.1666666666666665e-11 4660 4660 2.4999999999999996e-10 4660 4047 1.0416666666666665e-11 4660 4694 -2.0833333333333336e-11 4660 4661 9.5018296033870872e-28 4660 4102 1.0416666666666665e-11 4660 4091 2.0833333333333326e-11 4660 4659 -2.2913451068275814e-27 4660 4044 2.0833333333333326e-11 4661 4661 6.6666666666666664e-10 4661 4093 -1.0416666666666666e-11 4661 4694 8.3333333333333330e-11 4661 4660 1.6155871338926322e-27 4661 4102 6.2499999999999991e-11 4661 4091 -4.1666666666666665e-11 4661 4990 8.3333333333333330e-11 4661 4664 1.6155871338926322e-27 4661 4179 -1.0416666666666666e-11 4661 4172 -1.0416666666666666e-11 4661 4171 6.2499999999999991e-11 4661 4180 -4.1666666666666665e-11 4661 4797 8.3333333333333330e-11 4661 4674 1.6155871338926322e-27 4661 4187 -1.0416666666666666e-11 4661 4195 6.2499999999999991e-11 4661 4188 -4.1666666666666665e-11 4661 4995 -8.3333333333333330e-11 4661 4662 1.6155871338926322e-27 4661 4047 6.2499999999999991e-11 4661 4044 -4.1666666666666665e-11 4662 4662 2.4999999999999996e-10 4662 4665 -2.2913451068275814e-27 4662 4195 1.0416666666666665e-11 4662 4188 2.0833333333333326e-11 4662 4995 2.0833333333333332e-11 4662 4661 9.5018296033870872e-28 4662 4047 1.0416666666666665e-11 4662 4044 2.0833333333333326e-11 4663 4663 6.6666666666666664e-10 4663 4179 -1.0416666666666666e-11 4663 4681 -8.3333333333333330e-11 4663 4673 1.6155871338926322e-27 4663 4178 6.2499999999999991e-11 4663 4180 -4.1666666666666665e-11 4663 4077 -1.0416666666666666e-11 4663 4679 -8.3333333333333330e-11 4663 4672 1.6155871338926322e-27 4663 4075 6.2499999999999991e-11 4663 4074 -4.1666666666666665e-11 4663 4680 -8.3333333333333330e-11 4663 4671 -1.8175355256292112e-27 4663 4059 -1.0416666666666666e-11 4663 4058 6.2499999999999991e-11 4663 4057 -4.1666666666666665e-11 4663 4677 -8.3333333333333330e-11 4663 4664 -1.8175355256292112e-27 4663 4093 -1.0416666666666666e-11 4663 4092 6.2499999999999991e-11 4663 4091 -4.1666666666666665e-11 4663 3022 -1.0416666666666666e-11 4663 3003 -1.0416666666666666e-11 4664 4664 2.4999999999999996e-10 4664 4178 1.0416666666666666e-11 4664 4102 1.0416666666666665e-11 4664 4990 -2.0833333333333332e-11 4664 4661 9.5018296033870872e-28 4664 4179 6.2499999999999991e-11 4664 4171 1.0416666666666665e-11 4664 4180 2.0833333333333326e-11 4664 4677 2.0833333333333339e-11 4664 4663 -2.2913451068275814e-27 4664 4093 6.2499999999999991e-11 4664 4092 1.0416666666666666e-11 4664 4091 2.0833333333333326e-11 4665 4665 6.6666666666666664e-10 4665 4662 -1.8175355256292112e-27 4665 4188 -4.1666666666666665e-11 4665 4668 1.6155871338926322e-27 4665 4162 -4.1666666666666665e-11 4665 4676 -1.8175355256292112e-27 4665 4324 -4.1666666666666665e-11 4665 4666 1.6155871338926322e-27 4665 4044 -4.1666666666666665e-11 4666 4666 2.4999999999999996e-10 4666 4659 -2.2913451068275814e-27 4666 4324 2.0833333333333326e-11 4666 4665 9.5018296033870872e-28 4666 4044 2.0833333333333326e-11 4667 4667 6.6666666666666664e-10 4667 4063 -1.0416666666666666e-11 4667 4776 8.3333333333333330e-11 4667 4675 -1.8175355256292112e-27 4667 4159 -1.0416666666666666e-11 4667 4160 6.2499999999999991e-11 4667 4162 -4.1666666666666665e-11 4667 4187 -1.0416666666666666e-11 4667 4796 8.3333333333333330e-11 4667 4674 -1.8175355256292112e-27 4667 4172 -1.0416666666666666e-11 4667 4181 6.2499999999999991e-11 4667 4180 -4.1666666666666665e-11 4667 4991 8.3333333333333330e-11 4667 4673 -1.8175355256292112e-27 4667 4065 6.2499999999999991e-11 4667 4057 -4.1666666666666665e-11 4667 4994 -8.3333333333333330e-11 4667 4668 -1.8175355256292112e-27 4667 4186 6.2499999999999991e-11 4667 4188 -4.1666666666666665e-11 4667 3003 -1.0416666666666666e-11 4667 3022 -1.0416666666666666e-11 4668 4668 2.4999999999999996e-10 4668 4160 1.0416666666666663e-11 4668 4665 9.5018296033870872e-28 4668 4162 2.0833333333333326e-11 4668 4994 2.0833333333333336e-11 4668 4667 -2.2913451068275814e-27 4668 4186 1.0416666666666666e-11 4668 4188 2.0833333333333326e-11 4669 4669 6.6666666666666664e-10 4669 4059 -1.0416666666666666e-11 4669 4690 8.3333333333333330e-11 4669 4671 1.6155871338926322e-27 4669 4077 -1.0416666666666666e-11 4669 4088 6.2499999999999991e-11 4669 4074 -4.1666666666666665e-11 4669 4159 -1.0416666666666666e-11 4669 5014 -8.3333333333333330e-11 4669 4676 1.6155871338926322e-27 4669 4163 6.2499999999999991e-11 4669 4162 -4.1666666666666665e-11 4669 4777 8.3333333333333330e-11 4669 4675 1.6155871338926322e-27 4669 4063 -1.0416666666666666e-11 4669 4069 6.2499999999999991e-11 4669 4057 -4.1666666666666665e-11 4669 5015 -8.3333333333333330e-11 4669 4670 1.6155871338926322e-27 4669 4322 6.2499999999999991e-11 4669 4324 -4.1666666666666665e-11 4670 4670 2.4999999999999996e-10 4670 4088 1.0416666666666665e-11 4670 4659 -2.2913451068275814e-27 4670 4074 2.0833333333333326e-11 4670 5015 2.0833333333333336e-11 4670 4669 9.5018296033870872e-28 4670 4322 1.0416666666666665e-11 4670 4324 2.0833333333333326e-11 4671 4671 2.4999999999999996e-10 4671 4069 1.0416666666666665e-11 4671 4690 -2.0833333333333332e-11 4671 4669 9.5018296033870872e-28 4671 4088 1.0416666666666665e-11 4671 4077 6.2499999999999991e-11 4671 4075 1.0416666666666666e-11 4671 4074 2.0833333333333326e-11 4671 4680 2.0833333333333339e-11 4671 4663 -2.2913451068275814e-27 4671 4059 6.2499999999999991e-11 4671 4058 1.0416666666666666e-11 4671 4057 2.0833333333333326e-11 4672 4672 2.4999999999999996e-10 4672 4659 -2.2913451068275814e-27 4672 4092 1.0416666666666663e-11 4672 4091 2.0833333333333326e-11 4672 4679 2.0833333333333336e-11 4672 4663 9.5018296033870872e-28 4672 4075 1.0416666666666666e-11 4672 4074 2.0833333333333326e-11 4673 4673 2.4999999999999996e-10 4673 4058 1.0416666666666663e-11 4673 4681 2.0833333333333336e-11 4673 4663 9.5018296033870872e-28 4673 4178 1.0416666666666666e-11 4673 4181 1.0416666666666663e-11 4673 4180 2.0833333333333326e-11 4673 4991 -2.0833333333333336e-11 4673 4667 -2.2913451068275814e-27 4673 4065 1.0416666666666666e-11 4673 4057 2.0833333333333326e-11 4673 3003 6.2500000000000004e-11 4673 3022 6.2500000000000004e-11 4674 4674 2.4999999999999996e-10 4674 4171 1.0416666666666665e-11 4674 4797 -2.0833333333333336e-11 4674 4661 9.5018296033870872e-28 4674 4195 1.0416666666666665e-11 4674 4187 6.2500000000000004e-11 4674 4186 1.0416666666666666e-11 4674 4188 2.0833333333333326e-11 4674 4796 -2.0833333333333339e-11 4674 4667 -2.2913451068275814e-27 4674 4172 6.2499999999999991e-11 4674 4181 1.0416666666666666e-11 4674 4180 2.0833333333333326e-11 4675 4675 2.4999999999999996e-10 4675 4065 1.0416666666666666e-11 4675 4776 -2.0833333333333339e-11 4675 4667 -2.2913451068275814e-27 4675 4160 1.0416666666666666e-11 4675 4159 6.2499999999999991e-11 4675 4163 1.0416666666666665e-11 4675 4162 2.0833333333333326e-11 4675 4777 -2.0833333333333336e-11 4675 4669 9.5018296033870872e-28 4675 4063 6.2500000000000004e-11 4675 4069 1.0416666666666665e-11 4675 4057 2.0833333333333326e-11 4676 4676 2.4999999999999996e-10 4676 4665 -2.2913451068275814e-27 4676 4322 1.0416666666666665e-11 4676 4324 2.0833333333333326e-11 4676 5014 2.0833333333333332e-11 4676 4669 9.5018296033870872e-28 4676 4163 1.0416666666666665e-11 4676 4162 2.0833333333333326e-11 4677 4677 4.1666666666666662e-10 4677 4180 2.0833333333333332e-11 4677 4094 2.0833333333333332e-11 4677 4984 2.0833333333333339e-11 4677 4678 8.3333333333333330e-11 4677 4179 8.3333333333333330e-11 4677 4178 -2.0833333333333339e-11 4677 4177 2.0833333333333332e-11 4677 4664 2.0833333333333339e-11 4677 4663 -8.3333333333333330e-11 4677 4093 8.3333333333333330e-11 4677 4092 -2.0833333333333339e-11 4677 4091 2.0833333333333332e-11 4678 4678 6.6666666666666664e-10 4678 4059 1.0416666666666666e-11 4678 4680 8.3333333333333330e-11 4678 4687 -1.8175355256292112e-27 4678 4077 1.0416666666666666e-11 4678 4075 -6.2499999999999991e-11 4678 4083 4.1666666666666665e-11 4678 4093 1.0416666666666666e-11 4678 4677 8.3333333333333330e-11 4678 4984 1.8175355256292112e-27 4678 4179 1.0416666666666666e-11 4678 4178 -6.2499999999999991e-11 4678 4177 4.1666666666666665e-11 4678 4681 8.3333333333333330e-11 4678 4983 -1.6155871338926322e-27 4678 4058 -6.2499999999999991e-11 4678 4064 4.1666666666666665e-11 4678 4679 8.3333333333333330e-11 4678 4682 1.6155871338926322e-27 4678 4092 -6.2499999999999991e-11 4678 4094 4.1666666666666665e-11 4678 3003 1.0416666666666666e-11 4678 3022 1.0416666666666666e-11 4679 4679 4.1666666666666662e-10 4679 4083 2.0833333333333329e-11 4679 4091 2.0833333333333329e-11 4679 4672 2.0833333333333339e-11 4679 4663 -8.3333333333333330e-11 4679 4075 -2.0833333333333336e-11 4679 4074 2.0833333333333332e-11 4679 4682 -2.0833333333333339e-11 4679 4678 8.3333333333333330e-11 4679 4092 -2.0833333333333336e-11 4679 4094 2.0833333333333332e-11 4680 4680 4.1666666666666662e-10 4680 4064 2.0833333333333332e-11 4680 4687 -2.0833333333333339e-11 4680 4678 8.3333333333333330e-11 4680 4083 2.0833333333333332e-11 4680 4077 8.3333333333333330e-11 4680 4075 -2.0833333333333339e-11 4680 4074 2.0833333333333332e-11 4680 4671 2.0833333333333339e-11 4680 4663 -8.3333333333333330e-11 4680 4059 8.3333333333333330e-11 4680 4058 -2.0833333333333339e-11 4680 4057 2.0833333333333332e-11 4681 4681 4.1666666666666662e-10 4681 4057 2.0833333333333329e-11 4681 4673 2.0833333333333339e-11 4681 4663 -8.3333333333333330e-11 4681 4180 2.0833333333333332e-11 4681 4178 -2.0833333333333336e-11 4681 4177 2.0833333333333329e-11 4681 4983 2.0833333333333339e-11 4681 4678 8.3333333333333330e-11 4681 4058 -2.0833333333333336e-11 4681 4064 2.0833333333333332e-11 4681 3003 8.3333333333333330e-11 4681 3022 8.3333333333333330e-11 4682 4682 2.4999999999999996e-10 4682 4075 -1.0416666666666663e-11 4682 4979 2.2913451068275814e-27 4682 4083 -2.0833333333333326e-11 4682 4679 -2.0833333333333336e-11 4682 4678 9.5018296033870872e-28 4682 4092 -1.0416666666666666e-11 4682 4094 -2.0833333333333326e-11 4683 4683 2.0833333333333331e-10 4684 4684 2.0833333333333331e-10 4685 4685 2.4999999999999996e-10 4685 4066 -1.0416666666666665e-11 4685 4688 2.0833333333333332e-11 4685 4699 -9.5018296033870872e-28 4685 4084 -1.0416666666666665e-11 4685 4077 -6.2499999999999991e-11 4685 4080 -1.0416666666666666e-11 4685 4079 -2.0833333333333326e-11 4685 4686 2.0833333333333339e-11 4685 4701 2.2913451068275814e-27 4685 4059 -6.2499999999999991e-11 4685 4061 -1.0416666666666666e-11 4685 4060 -2.0833333333333326e-11 4686 4686 4.1666666666666662e-10 4686 4070 -2.0833333333333332e-11 4686 4689 2.0833333333333339e-11 4686 4707 -8.3333333333333330e-11 4686 4087 -2.0833333333333332e-11 4686 4077 -8.3333333333333330e-11 4686 4080 2.0833333333333339e-11 4686 4079 -2.0833333333333332e-11 4686 4685 2.0833333333333339e-11 4686 4701 8.3333333333333330e-11 4686 4059 -8.3333333333333330e-11 4686 4061 2.0833333333333339e-11 4686 4060 -2.0833333333333332e-11 4687 4687 2.4999999999999996e-10 4687 4058 -1.0416666666666666e-11 4687 4680 -2.0833333333333339e-11 4687 4678 -2.2913451068275814e-27 4687 4075 -1.0416666666666666e-11 4687 4077 -6.2499999999999991e-11 4687 4084 -1.0416666666666665e-11 4687 4083 -2.0833333333333326e-11 4687 4688 2.0833333333333332e-11 4687 4985 -9.5018296033870872e-28 4687 4059 -6.2499999999999991e-11 4687 4066 -1.0416666666666665e-11 4687 4064 -2.0833333333333326e-11 4688 4688 4.1666666666666662e-10 4688 4060 -2.0833333333333332e-11 4688 4685 2.0833333333333336e-11 4688 4699 8.3333333333333330e-11 4688 4079 -2.0833333333333332e-11 4688 4077 -8.3333333333333330e-11 4688 4084 2.0833333333333336e-11 4688 4083 -2.0833333333333332e-11 4688 4687 2.0833333333333336e-11 4688 4985 8.3333333333333330e-11 4688 4059 -8.3333333333333330e-11 4688 4066 2.0833333333333336e-11 4688 4064 -2.0833333333333332e-11 4689 4689 2.4999999999999996e-10 4689 4061 -1.0416666666666666e-11 4689 4686 2.0833333333333339e-11 4689 4707 -2.2913451068275814e-27 4689 4080 -1.0416666666666666e-11 4689 4077 -6.2499999999999991e-11 4689 4088 -1.0416666666666665e-11 4689 4087 -2.0833333333333326e-11 4689 4690 2.0833333333333332e-11 4689 5013 9.5018296033870872e-28 4689 4059 -6.2499999999999991e-11 4689 4069 -1.0416666666666665e-11 4689 4070 -2.0833333333333326e-11 4690 4690 4.1666666666666662e-10 4690 4057 -2.0833333333333332e-11 4690 4671 -2.0833333333333336e-11 4690 4669 8.3333333333333330e-11 4690 4074 -2.0833333333333332e-11 4690 4077 -8.3333333333333330e-11 4690 4088 2.0833333333333336e-11 4690 4087 -2.0833333333333332e-11 4690 4689 2.0833333333333336e-11 4690 5013 -8.3333333333333330e-11 4690 4059 -8.3333333333333330e-11 4690 4069 2.0833333333333336e-11 4690 4070 -2.0833333333333332e-11 4691 4691 2.0833333333333331e-10 4692 4692 2.0833333333333331e-10 4693 4693 2.0833333333333331e-10 4694 4694 2.0833333541666665e-02 4694 4097 -2.0833333333333333e-03 4694 4695 2.0833333333333337e-03 4694 4996 -8.3333333333333315e-03 4694 4055 -2.0833333333333329e-03 4694 4047 1.0416666770833337e-03 4694 4044 -2.0833333333333332e-11 4694 4660 -2.0833333333333339e-11 4694 4661 8.3333333333333330e-11 4694 4102 1.0416666770833331e-03 4694 4091 -2.0833333333333332e-11 4695 4695 2.4999999999999998e-02 4695 4102 -1.0416666666666664e-03 4695 4694 2.0833333333333337e-03 4695 4996 6.0159191589756597e-20 4695 4047 -1.0416666666666662e-03 4695 4055 -2.0833333333333329e-03 4695 5073 1.0254392617697373e-19 4695 4097 -2.0833333333333329e-03 4696 4696 2.0833333333333332e-02 4697 4697 6.6666666666666664e-10 4697 4704 -1.8175355256292112e-27 4697 4305 -4.1666666666666665e-11 4697 4700 -1.8175355256292112e-27 4697 4079 -4.1666666666666665e-11 4697 4703 -1.8175355256292112e-27 4697 4115 -4.1666666666666665e-11 4697 4698 -1.8175355256292112e-27 4697 4107 -4.1666666666666665e-11 4698 4698 2.4999999999999996e-10 4698 4705 9.5018296033870872e-28 4698 4115 2.0833333333333326e-11 4698 4697 -2.2913451068275814e-27 4698 4107 2.0833333333333326e-11 4699 4699 6.6666666666666654e-10 4699 4316 -1.0416666666666666e-11 4699 4306 6.2499999999999991e-11 4699 4305 -4.1666666666666665e-11 4699 4068 -1.0416666666666666e-11 4699 4066 6.2499999999999991e-11 4699 4060 -4.1666666666666665e-11 4699 4059 -1.0416666666666666e-11 4699 4688 8.3333333333333330e-11 4699 4685 -1.6155871338926322e-27 4699 4077 -1.0416666666666666e-11 4699 4084 6.2499999999999991e-11 4699 4079 -4.1666666666666665e-11 4699 4999 -8.3333333333333330e-11 4699 4700 1.6155871338926322e-27 4699 1525 -1.0416666666666666e-11 4699 1985 -8.3333333333333330e-11 4699 1983 1.6155871338926322e-27 4699 1213 -1.0416666666666666e-11 4699 1218 6.2499999999999991e-11 4699 1217 -4.1666666666666665e-11 4699 1986 -8.3333333333333330e-11 4699 1982 1.6155871338926322e-27 4700 4700 2.4999999999999996e-10 4700 4084 1.0416666666666665e-11 4700 4697 -2.2913451068275814e-27 4700 4079 2.0833333333333326e-11 4700 4999 2.0833333333333336e-11 4700 4699 9.5018296033870872e-28 4700 4306 1.0416666666666665e-11 4700 4305 2.0833333333333326e-11 4701 4701 6.6666666666666664e-10 4701 4071 -1.0416666666666666e-11 4701 4710 -8.3333333333333330e-11 4701 4706 1.6155871338926322e-27 4701 4356 -1.0416666666666666e-11 4701 4362 6.2499999999999991e-11 4701 4364 -4.1666666666666665e-11 4701 4077 -1.0416666666666666e-11 4701 4708 -8.3333333333333330e-11 4701 4703 1.6155871338926322e-27 4701 4080 6.2499999999999991e-11 4701 4079 -4.1666666666666665e-11 4701 4686 8.3333333333333330e-11 4701 4685 1.8175355256292112e-27 4701 4059 -1.0416666666666666e-11 4701 4061 6.2499999999999991e-11 4701 4060 -4.1666666666666665e-11 4701 4709 -8.3333333333333330e-11 4701 4702 -1.8175355256292112e-27 4701 4113 6.2499999999999991e-11 4701 4115 -4.1666666666666665e-11 4702 4702 2.4999999999999996e-10 4702 4362 1.0416666666666666e-11 4702 4705 9.5018296033870872e-28 4702 4364 2.0833333333333326e-11 4702 4709 2.0833333333333339e-11 4702 4701 -2.2913451068275814e-27 4702 4113 1.0416666666666666e-11 4702 4115 2.0833333333333326e-11 4703 4703 2.4999999999999996e-10 4703 4697 -2.2913451068275814e-27 4703 4113 1.0416666666666663e-11 4703 4115 2.0833333333333326e-11 4703 4708 2.0833333333333336e-11 4703 4701 9.5018296033870872e-28 4703 4080 1.0416666666666666e-11 4703 4079 2.0833333333333326e-11 4704 4704 2.4999999999999996e-10 4704 4305 2.0833333333333326e-11 4704 4107 2.0833333333333326e-11 4704 4697 -2.2913451068275814e-27 4704 1526 1.0416666666666663e-11 4704 1994 2.0833333333333336e-11 4704 1978 9.5018296033870872e-28 4704 1515 1.0416666666666666e-11 4705 4705 6.6666666666666654e-10 4705 4364 -4.1666666666666665e-11 4705 4107 -4.1666666666666665e-11 4705 4698 1.6155871338926322e-27 4705 4115 -4.1666666666666665e-11 4705 4702 1.6155871338926322e-27 4705 1984 1.6155871338926322e-27 4705 1194 -4.1666666666666665e-11 4705 1981 1.6155871338926322e-27 4706 4706 2.4999999999999996e-10 4706 4356 6.2500000000000004e-11 4706 4364 2.0833333333333326e-11 4706 4071 6.2500000000000004e-11 4706 4060 2.0833333333333326e-11 4706 4061 1.0416666666666663e-11 4706 4710 2.0833333333333336e-11 4706 4701 9.5018296033870872e-28 4706 4362 1.0416666666666666e-11 4706 1689 1.0416666666666663e-11 4706 2321 2.0833333333333336e-11 4706 1979 -2.2913451068275814e-27 4706 1523 1.0416666666666666e-11 4707 4707 6.6666666666666664e-10 4707 4356 1.0416666666666666e-11 4707 4709 8.3333333333333330e-11 4707 5028 1.8175355256292112e-27 4707 4362 -6.2499999999999991e-11 4707 4361 4.1666666666666665e-11 4707 4710 8.3333333333333330e-11 4707 5027 -1.6155871338926322e-27 4707 4071 1.0416666666666666e-11 4707 4059 1.0416666666666666e-11 4707 4061 -6.2499999999999991e-11 4707 4070 4.1666666666666665e-11 4707 4686 -8.3333333333333330e-11 4707 4689 -1.8175355256292112e-27 4707 4077 1.0416666666666666e-11 4707 4080 -6.2499999999999991e-11 4707 4087 4.1666666666666665e-11 4707 4708 8.3333333333333330e-11 4707 4711 1.6155871338926322e-27 4707 4113 -6.2499999999999991e-11 4707 4112 4.1666666666666665e-11 4708 4708 4.1666666666666662e-10 4708 4087 2.0833333333333329e-11 4708 4115 2.0833333333333329e-11 4708 4703 2.0833333333333339e-11 4708 4701 -8.3333333333333330e-11 4708 4080 -2.0833333333333336e-11 4708 4079 2.0833333333333332e-11 4708 4711 -2.0833333333333339e-11 4708 4707 8.3333333333333330e-11 4708 4113 -2.0833333333333336e-11 4708 4112 2.0833333333333332e-11 4709 4709 4.1666666666666662e-10 4709 4364 2.0833333333333332e-11 4709 4112 2.0833333333333332e-11 4709 5028 2.0833333333333339e-11 4709 4707 8.3333333333333330e-11 4709 4362 -2.0833333333333339e-11 4709 4361 2.0833333333333332e-11 4709 4702 2.0833333333333339e-11 4709 4701 -8.3333333333333330e-11 4709 4113 -2.0833333333333339e-11 4709 4115 2.0833333333333332e-11 4710 4710 4.1666666666666662e-10 4710 4060 2.0833333333333329e-11 4710 4706 2.0833333333333339e-11 4710 4701 -8.3333333333333330e-11 4710 4364 2.0833333333333332e-11 4710 4356 8.3333333333333330e-11 4710 4362 -2.0833333333333336e-11 4710 4361 2.0833333333333329e-11 4710 5027 2.0833333333333339e-11 4710 4707 8.3333333333333330e-11 4710 4071 8.3333333333333330e-11 4710 4061 -2.0833333333333336e-11 4710 4070 2.0833333333333332e-11 4711 4711 2.4999999999999996e-10 4711 4080 -1.0416666666666663e-11 4711 5020 2.2913451068275814e-27 4711 4087 -2.0833333333333326e-11 4711 4708 -2.0833333333333336e-11 4711 4707 9.5018296033870872e-28 4711 4113 -1.0416666666666666e-11 4711 4112 -2.0833333333333326e-11 4712 4712 2.0833333333333331e-10 4713 4713 2.0833333333333331e-10 4714 4714 2.0833333333333331e-10 4715 4715 2.0833333333333331e-10 4716 4716 2.0833333333333331e-10 4717 4717 2.0833333333333331e-10 4718 4718 4.1666666666666662e-10 4718 3752 2.0833333333333332e-11 4718 4143 2.0833333333333332e-11 4718 4811 2.0833333333333339e-11 4718 4719 8.3333333333333330e-11 4718 3757 -2.0833333333333336e-11 4718 3756 2.0833333333333332e-11 4718 4474 2.0833333333333339e-11 4718 4473 -8.3333333333333330e-11 4718 4141 -2.0833333333333336e-11 4718 4140 2.0833333333333332e-11 4719 4719 6.6666666666666664e-10 4719 3733 1.0416666666666666e-11 4719 4721 8.3333333333333330e-11 4719 4727 1.6155871338926322e-27 4719 4126 1.0416666666666666e-11 4719 4124 -6.2499999999999991e-11 4719 4132 4.1666666666666665e-11 4719 3750 1.0416666666666666e-11 4719 4718 8.3333333333333330e-11 4719 4811 -1.6155871338926322e-27 4719 3757 -6.2499999999999991e-11 4719 3756 4.1666666666666665e-11 4719 4423 -8.3333333333333330e-11 4719 4422 1.6155871338926322e-27 4719 3723 1.0416666666666666e-11 4719 3732 -6.2499999999999991e-11 4719 3736 4.1666666666666665e-11 4719 4720 8.3333333333333330e-11 4719 4722 1.6155871338926322e-27 4719 4141 -6.2499999999999991e-11 4719 4143 4.1666666666666665e-11 4720 4720 4.1666666666666662e-10 4720 4132 2.0833333333333332e-11 4720 4140 2.0833333333333332e-11 4720 4480 2.0833333333333336e-11 4720 4473 -8.3333333333333330e-11 4720 4124 -2.0833333333333336e-11 4720 4123 2.0833333333333332e-11 4720 4722 -2.0833333333333336e-11 4720 4719 8.3333333333333330e-11 4720 4141 -2.0833333333333336e-11 4720 4143 2.0833333333333332e-11 4721 4721 4.1666666666666662e-10 4721 3736 2.0833333333333332e-11 4721 4727 -2.0833333333333339e-11 4721 4719 8.3333333333333330e-11 4721 4132 2.0833333333333332e-11 4721 4126 8.3333333333333330e-11 4721 4124 -2.0833333333333336e-11 4721 4123 2.0833333333333332e-11 4721 4479 2.0833333333333339e-11 4721 4473 -8.3333333333333330e-11 4721 3733 8.3333333333333330e-11 4721 3732 -2.0833333333333336e-11 4721 3727 2.0833333333333332e-11 4722 4722 2.4999999999999996e-10 4722 4124 -1.0416666666666665e-11 4722 4807 2.2913451068275814e-27 4722 4132 -2.0833333333333326e-11 4722 4720 -2.0833333333333332e-11 4722 4719 9.5018296033870872e-28 4722 4141 -1.0416666666666665e-11 4722 4143 -2.0833333333333326e-11 4723 4723 2.0833333333333331e-10 4724 4724 2.0833333333333331e-10 4725 4725 2.4999999999999996e-10 4725 3745 -1.0416666666666666e-11 4725 4728 2.0833333333333339e-11 4725 4740 2.2913451068275814e-27 4725 4133 -1.0416666666666666e-11 4725 4126 -6.2499999999999991e-11 4725 4129 -1.0416666666666665e-11 4725 4128 -2.0833333333333326e-11 4725 4726 2.0833333333333336e-11 4725 4743 -9.5018296033870872e-28 4725 3733 -6.2500000000000004e-11 4725 3735 -1.0416666666666665e-11 4725 3734 -2.0833333333333326e-11 4726 4726 4.1666666666666662e-10 4726 3743 -2.0833333333333332e-11 4726 4729 2.0833333333333339e-11 4726 4750 -8.3333333333333330e-11 4726 4136 -2.0833333333333332e-11 4726 4126 -8.3333333333333330e-11 4726 4129 2.0833333333333336e-11 4726 4128 -2.0833333333333332e-11 4726 4725 2.0833333333333339e-11 4726 4743 8.3333333333333330e-11 4726 3733 -8.3333333333333330e-11 4726 3735 2.0833333333333336e-11 4726 3734 -2.0833333333333332e-11 4727 4727 2.4999999999999996e-10 4727 3732 -1.0416666666666665e-11 4727 4721 -2.0833333333333336e-11 4727 4719 9.5018296033870872e-28 4727 4124 -1.0416666666666665e-11 4727 4126 -6.2500000000000004e-11 4727 4133 -1.0416666666666666e-11 4727 4132 -2.0833333333333326e-11 4727 4728 2.0833333333333339e-11 4727 4805 2.2913451068275814e-27 4727 3733 -6.2499999999999991e-11 4727 3745 -1.0416666666666666e-11 4727 3736 -2.0833333333333326e-11 4728 4728 4.1666666666666662e-10 4728 3734 -2.0833333333333329e-11 4728 4725 2.0833333333333339e-11 4728 4740 8.3333333333333330e-11 4728 4128 -2.0833333333333332e-11 4728 4126 -8.3333333333333330e-11 4728 4133 2.0833333333333339e-11 4728 4132 -2.0833333333333329e-11 4728 4727 2.0833333333333339e-11 4728 4805 8.3333333333333330e-11 4728 3733 -8.3333333333333330e-11 4728 3745 2.0833333333333339e-11 4728 3736 -2.0833333333333332e-11 4729 4729 2.4999999999999996e-10 4729 3735 -1.0416666666666665e-11 4729 4726 2.0833333333333336e-11 4729 4750 9.5018296033870872e-28 4729 4129 -1.0416666666666665e-11 4729 4126 -6.2500000000000004e-11 4729 4137 -1.0416666666666666e-11 4729 4136 -2.0833333333333326e-11 4729 4730 2.0833333333333339e-11 4729 4893 2.2913451068275814e-27 4729 3733 -6.2499999999999991e-11 4729 3746 -1.0416666666666666e-11 4729 3743 -2.0833333333333326e-11 4730 4730 4.1666666666666662e-10 4730 3727 -2.0833333333333329e-11 4730 4479 -2.0833333333333339e-11 4730 4475 8.3333333333333330e-11 4730 4123 -2.0833333333333332e-11 4730 4126 -8.3333333333333330e-11 4730 4137 2.0833333333333339e-11 4730 4136 -2.0833333333333329e-11 4730 4729 2.0833333333333339e-11 4730 4893 8.3333333333333330e-11 4730 3733 -8.3333333333333330e-11 4730 3746 2.0833333333333339e-11 4730 3743 -2.0833333333333332e-11 4731 4731 2.0833333333333331e-10 4732 4732 2.0833333333333331e-10 4733 4733 2.0833333333333331e-10 4734 4734 6.6666666666666664e-10 4734 4737 -1.8175355256292112e-27 4734 4369 -4.1666666666666665e-11 4734 4741 1.6155871338926322e-27 4734 4128 -4.1666666666666665e-11 4734 4745 -1.8175355256292112e-27 4734 4032 -4.1666666666666665e-11 4734 4735 1.6155871338926322e-27 4734 3982 -4.1666666666666665e-11 4735 4735 2.4999999999999996e-10 4735 3985 1.0416666666666663e-11 4735 4758 -2.0833333333333336e-11 4735 4742 -2.2913451068275814e-27 4735 4040 1.0416666666666666e-11 4735 4032 2.0833333333333326e-11 4735 4734 9.5018296033870872e-28 4735 3982 2.0833333333333326e-11 4736 4736 6.6666666666666664e-10 4736 4645 -1.6155871338926322e-27 4736 4003 -4.1666666666666665e-11 4736 4739 1.6155871338926322e-27 4736 4220 -4.1666666666666665e-11 4736 4747 1.6155871338926322e-27 4736 4369 -4.1666666666666665e-11 4736 4737 1.6155871338926322e-27 4736 3982 -4.1666666666666665e-11 4737 4737 2.4999999999999996e-10 4737 4734 -2.2913451068275814e-27 4737 4369 2.0833333333333326e-11 4737 4736 9.5018296033870872e-28 4737 3982 2.0833333333333326e-11 4738 4738 6.6666666666666664e-10 4738 3840 -1.0416666666666666e-11 4738 4000 -1.0416666666666666e-11 4738 4967 8.3333333333333330e-11 4738 4748 1.6155871338926322e-27 4738 3855 -1.0416666666666666e-11 4738 3862 6.2499999999999991e-11 4738 3861 -4.1666666666666665e-11 4738 4521 8.3333333333333330e-11 4738 4520 1.8175355256292112e-27 4738 3731 -1.0416666666666666e-11 4738 3737 -1.0416666666666666e-11 4738 3744 6.2499999999999991e-11 4738 3734 -4.1666666666666665e-11 4738 4816 8.3333333333333330e-11 4738 4746 1.6155871338926322e-27 4738 4210 -1.0416666666666666e-11 4738 4218 6.2499999999999991e-11 4738 4220 -4.1666666666666665e-11 4738 5061 -8.3333333333333330e-11 4738 4739 -1.8175355256292112e-27 4738 4004 6.2499999999999991e-11 4738 4003 -4.1666666666666665e-11 4739 4739 2.4999999999999996e-10 4739 4218 1.0416666666666666e-11 4739 4736 9.5018296033870872e-28 4739 4220 2.0833333333333326e-11 4739 5061 2.0833333333333339e-11 4739 4738 -2.2913451068275814e-27 4739 4004 1.0416666666666666e-11 4739 4003 2.0833333333333326e-11 4740 4740 6.6666666666666664e-10 4740 3733 -1.0416666666666666e-11 4740 4728 8.3333333333333330e-11 4740 4725 1.8175355256292112e-27 4740 4126 -1.0416666666666666e-11 4740 4133 6.2499999999999991e-11 4740 4128 -4.1666666666666665e-11 4740 4210 -1.0416666666666666e-11 4740 5063 -8.3333333333333330e-11 4740 4747 -1.8175355256292112e-27 4740 4221 6.2499999999999991e-11 4740 4220 -4.1666666666666665e-11 4740 4817 8.3333333333333330e-11 4740 4746 -1.8175355256292112e-27 4740 3737 -1.0416666666666666e-11 4740 3745 6.2499999999999991e-11 4740 3734 -4.1666666666666665e-11 4740 5064 -8.3333333333333330e-11 4740 4741 -1.8175355256292112e-27 4740 4367 6.2499999999999991e-11 4740 4369 -4.1666666666666665e-11 4741 4741 2.4999999999999996e-10 4741 4133 1.0416666666666663e-11 4741 4734 9.5018296033870872e-28 4741 4128 2.0833333333333326e-11 4741 5064 2.0833333333333336e-11 4741 4740 -2.2913451068275814e-27 4741 4367 1.0416666666666666e-11 4741 4369 2.0833333333333326e-11 4742 4742 6.6666666666666664e-10 4742 4029 -1.0416666666666666e-11 4742 4758 8.3333333333333330e-11 4742 4735 -1.8175355256292112e-27 4742 4040 6.2499999999999991e-11 4742 4032 -4.1666666666666665e-11 4742 4970 8.3333333333333330e-11 4742 4744 -1.8175355256292112e-27 4742 3858 -1.0416666666666666e-11 4742 3855 -1.0416666666666666e-11 4742 3859 6.2499999999999991e-11 4742 3861 -4.1666666666666665e-11 4742 4968 8.3333333333333330e-11 4742 4748 -1.8175355256292112e-27 4742 4000 -1.0416666666666666e-11 4742 4011 6.2499999999999991e-11 4742 4003 -4.1666666666666665e-11 4742 4646 8.3333333333333330e-11 4742 4645 1.8175355256292112e-27 4742 3985 6.2499999999999991e-11 4742 3982 -4.1666666666666665e-11 4743 4743 6.6666666666666664e-10 4743 3858 -1.0416666666666666e-11 4743 3731 -1.0416666666666666e-11 4743 4519 8.3333333333333330e-11 4743 4520 -1.6155871338926322e-27 4743 3840 -1.0416666666666666e-11 4743 3860 6.2499999999999991e-11 4743 3861 -4.1666666666666665e-11 4743 4126 -1.0416666666666666e-11 4743 4751 -8.3333333333333330e-11 4743 4745 1.6155871338926322e-27 4743 4129 6.2499999999999991e-11 4743 4128 -4.1666666666666665e-11 4743 4726 8.3333333333333330e-11 4743 4725 -1.6155871338926322e-27 4743 3733 -1.0416666666666666e-11 4743 3735 6.2499999999999991e-11 4743 3734 -4.1666666666666665e-11 4743 4749 -8.3333333333333330e-11 4743 4744 1.6155871338926322e-27 4743 4029 -1.0416666666666666e-11 4743 4033 6.2499999999999991e-11 4743 4032 -4.1666666666666665e-11 4744 4744 2.4999999999999996e-10 4744 3860 1.0416666666666665e-11 4744 4040 1.0416666666666666e-11 4744 4970 -2.0833333333333339e-11 4744 4742 -2.2913451068275814e-27 4744 3858 6.2499999999999991e-11 4744 3859 1.0416666666666666e-11 4744 3861 2.0833333333333326e-11 4744 4749 2.0833333333333336e-11 4744 4743 9.5018296033870872e-28 4744 4029 6.2500000000000004e-11 4744 4033 1.0416666666666665e-11 4744 4032 2.0833333333333326e-11 4745 4745 2.4999999999999996e-10 4745 4734 -2.2913451068275814e-27 4745 4033 1.0416666666666665e-11 4745 4032 2.0833333333333326e-11 4745 4751 2.0833333333333332e-11 4745 4743 9.5018296033870872e-28 4745 4129 1.0416666666666665e-11 4745 4128 2.0833333333333326e-11 4746 4746 2.4999999999999996e-10 4746 3744 1.0416666666666663e-11 4746 4816 -2.0833333333333336e-11 4746 4738 9.5018296033870872e-28 4746 4218 1.0416666666666666e-11 4746 4210 6.2500000000000004e-11 4746 4221 1.0416666666666663e-11 4746 4220 2.0833333333333326e-11 4746 4817 -2.0833333333333336e-11 4746 4740 -2.2913451068275814e-27 4746 3737 6.2500000000000004e-11 4746 3745 1.0416666666666666e-11 4746 3734 2.0833333333333326e-11 4747 4747 2.4999999999999996e-10 4747 4736 9.5018296033870872e-28 4747 4367 1.0416666666666666e-11 4747 4369 2.0833333333333326e-11 4747 5063 2.0833333333333339e-11 4747 4740 -2.2913451068275814e-27 4747 4221 1.0416666666666666e-11 4747 4220 2.0833333333333326e-11 4748 4748 2.4999999999999996e-10 4748 3859 1.0416666666666663e-11 4748 4968 -2.0833333333333336e-11 4748 4742 -2.2913451068275814e-27 4748 4011 1.0416666666666666e-11 4748 4000 6.2500000000000004e-11 4748 4004 1.0416666666666663e-11 4748 4003 2.0833333333333326e-11 4748 4967 -2.0833333333333336e-11 4748 4738 9.5018296033870872e-28 4748 3855 6.2500000000000004e-11 4748 3862 1.0416666666666666e-11 4748 3861 2.0833333333333326e-11 4749 4749 4.1666666666666662e-10 4749 3861 2.0833333333333332e-11 4749 4034 2.0833333333333332e-11 4749 4892 2.0833333333333339e-11 4749 4750 8.3333333333333330e-11 4749 3858 8.3333333333333330e-11 4749 3860 -2.0833333333333336e-11 4749 3850 2.0833333333333332e-11 4749 4744 2.0833333333333339e-11 4749 4743 -8.3333333333333330e-11 4749 4029 8.3333333333333330e-11 4749 4033 -2.0833333333333336e-11 4749 4032 2.0833333333333332e-11 4750 4750 6.6666666666666664e-10 4750 3733 1.0416666666666666e-11 4750 4726 -8.3333333333333330e-11 4750 4729 1.6155871338926322e-27 4750 4126 1.0416666666666666e-11 4750 4129 -6.2499999999999991e-11 4750 4136 4.1666666666666665e-11 4750 3840 1.0416666666666666e-11 4750 4029 1.0416666666666666e-11 4750 4749 8.3333333333333330e-11 4750 4892 -1.6155871338926322e-27 4750 3858 1.0416666666666666e-11 4750 3860 -6.2499999999999991e-11 4750 3850 4.1666666666666665e-11 4750 4519 -8.3333333333333330e-11 4750 4518 1.6155871338926322e-27 4750 3731 1.0416666666666666e-11 4750 3735 -6.2499999999999991e-11 4750 3743 4.1666666666666665e-11 4750 4751 8.3333333333333330e-11 4750 4752 1.6155871338926322e-27 4750 4033 -6.2499999999999991e-11 4750 4034 4.1666666666666665e-11 4751 4751 4.1666666666666662e-10 4751 4136 2.0833333333333332e-11 4751 4032 2.0833333333333332e-11 4751 4745 2.0833333333333336e-11 4751 4743 -8.3333333333333330e-11 4751 4129 -2.0833333333333336e-11 4751 4128 2.0833333333333332e-11 4751 4752 -2.0833333333333336e-11 4751 4750 8.3333333333333330e-11 4751 4033 -2.0833333333333336e-11 4751 4034 2.0833333333333332e-11 4752 4752 2.4999999999999996e-10 4752 4129 -1.0416666666666665e-11 4752 4890 2.2913451068275814e-27 4752 4136 -2.0833333333333326e-11 4752 4751 -2.0833333333333332e-11 4752 4750 9.5018296033870872e-28 4752 4033 -1.0416666666666665e-11 4752 4034 -2.0833333333333326e-11 4753 4753 2.0833333333333331e-10 4754 4754 2.0833333333333331e-10 4755 4755 2.0833333333333331e-10 4756 4756 2.0833333333333331e-10 4757 4757 2.0833333333333331e-10 4758 4758 2.0833333541666669e-02 4758 3982 -2.0833333333333329e-11 4758 4735 -2.0833333333333339e-11 4758 4742 8.3333333333333330e-11 4758 4032 -2.0833333333333332e-11 4758 4040 1.0416666770833331e-03 4758 4030 -2.0833333333333329e-03 4758 4619 -2.0833333333333337e-03 4758 4618 8.3333333333333315e-03 4758 3985 1.0416666770833335e-03 4758 3979 -2.0833333333333333e-03 4759 4759 2.0833333333333332e-02 4760 4760 9.1666666666666650e-10 4760 4764 1.2499999999999998e-10 4760 4063 -1.0416666666666666e-11 4760 4771 -8.3333333333333330e-11 4760 4062 6.2499999999999991e-11 4760 4770 -8.3333333333333330e-11 4760 4766 1.6155871338926322e-27 4760 4159 -1.0416666666666666e-11 4760 4158 -4.1666666666666665e-11 4760 2336 -3.1250000000000002e-11 4760 3705 -4.1666666666666665e-11 4760 2350 2.0833333333333342e-11 4760 2349 -1.6666666666666669e-10 4760 115 -1.0416666666666666e-11 4760 3704 1.6155871338926322e-27 4760 441 -1.0416666666666666e-11 4760 3021 -4.1666666666666665e-11 4760 3023 1.0416666666666667e-10 4760 3096 -4.1666666666666665e-11 4760 3095 1.2499999999999998e-10 4760 2481 5.2083333333333334e-11 4760 2487 1.0416666666666666e-10 4760 2494 -4.1666666666666678e-11 4761 4761 6.6666666666666664e-10 4761 4159 -1.0416666666666666e-11 4761 4994 -8.3333333333333330e-11 4761 4769 -1.8175355256292112e-27 4761 4160 6.2499999999999991e-11 4761 4158 -4.1666666666666665e-11 4761 4776 8.3333333333333330e-11 4761 4766 -1.8175355256292112e-27 4761 4063 -1.0416666666666666e-11 4761 4172 -1.0416666666666666e-11 4761 4065 6.2499999999999991e-11 4761 4991 8.3333333333333330e-11 4761 4767 -1.8175355256292112e-27 4761 4181 6.2499999999999991e-11 4761 4182 -4.1666666666666665e-11 4761 4796 8.3333333333333330e-11 4761 4762 -1.8175355256292112e-27 4761 4187 -1.0416666666666666e-11 4761 4186 6.2499999999999991e-11 4761 4185 -4.1666666666666665e-11 4761 3022 -1.0416666666666666e-11 4761 3021 -4.1666666666666665e-11 4761 3003 -1.0416666666666666e-11 4762 4762 2.4999999999999996e-10 4762 4181 1.0416666666666666e-11 4762 4190 1.0416666666666665e-11 4762 4795 2.0833333333333336e-11 4762 4763 9.5018296033870872e-28 4762 4172 6.2500000000000004e-11 4762 4182 2.0833333333333326e-11 4762 4796 -2.0833333333333339e-11 4762 4761 -2.2913451068275814e-27 4762 4187 6.2499999999999991e-11 4762 4186 1.0416666666666666e-11 4762 4185 2.0833333333333326e-11 4762 3000 1.0416666666666665e-11 4763 4763 6.6666666666666664e-10 4763 4768 1.6155871338926322e-27 4763 4187 -1.0416666666666666e-11 4763 4794 -8.3333333333333330e-11 4763 4765 1.6155871338926322e-27 4763 4190 6.2499999999999991e-11 4763 4185 -4.1666666666666665e-11 4763 4795 -8.3333333333333330e-11 4763 4762 1.6155871338926322e-27 4763 4172 -1.0416666666666666e-11 4763 4182 -4.1666666666666665e-11 4763 2457 -1.0416666666666666e-11 4763 2996 -1.0416666666666666e-11 4763 3660 -8.3333333333333330e-11 4763 2448 -1.0416666666666666e-11 4763 2464 6.2499999999999991e-11 4763 2451 -4.1666666666666665e-11 4763 3000 6.2499999999999991e-11 4763 3116 -8.3333333333333330e-11 4763 3117 1.6155871338926322e-27 4763 2337 -1.0416666666666666e-11 4763 2348 6.2499999999999991e-11 4763 2349 -4.1666666666666665e-11 4764 4764 5.8333333333333339e-10 4764 4769 1.6155871338926322e-27 4764 4185 -4.1666666666666665e-11 4764 4158 -4.1666666666666665e-11 4764 4760 1.2500000000000001e-10 4764 4765 -1.8175355256292112e-27 4764 3023 5.2083333333333334e-11 4764 3705 -2.0833333333333332e-11 4764 2350 1.0416666666666668e-11 4764 2349 -4.1666666666666678e-11 4765 4765 2.4999999999999996e-10 4765 4794 2.0833333333333332e-11 4765 4763 9.5018296033870872e-28 4765 4190 1.0416666666666665e-11 4765 4185 2.0833333333333326e-11 4765 4764 -2.2913451068275814e-27 4765 2348 1.0416666666666665e-11 4765 2349 2.0833333333333326e-11 4766 4766 2.4999999999999996e-10 4766 4160 1.0416666666666666e-11 4766 4776 -2.0833333333333339e-11 4766 4761 -2.2913451068275814e-27 4766 4065 1.0416666666666666e-11 4766 4063 6.2499999999999991e-11 4766 4062 1.0416666666666665e-11 4766 4770 2.0833333333333336e-11 4766 4760 9.5018296033870872e-28 4766 4159 6.2500000000000004e-11 4766 4158 2.0833333333333326e-11 4766 3021 2.0833333333333326e-11 4766 3023 1.0416666666666665e-11 4767 4767 2.4999999999999996e-10 4767 4065 1.0416666666666663e-11 4767 4991 -2.0833333333333336e-11 4767 4761 -2.2913451068275814e-27 4767 4181 1.0416666666666666e-11 4767 4182 2.0833333333333326e-11 4767 3002 1.0416666666666663e-11 4767 3703 2.0833333333333336e-11 4767 3701 9.5018296033870872e-28 4767 3020 1.0416666666666666e-11 4767 3022 6.2500000000000004e-11 4767 3021 2.0833333333333326e-11 4767 3003 6.2500000000000004e-11 4768 4768 2.4999999999999996e-10 4768 4763 9.5018296033870872e-28 4768 4182 2.0833333333333326e-11 4768 3000 1.0416666666666665e-11 4768 3660 2.0833333333333332e-11 4768 2464 1.0416666666666665e-11 4768 2448 6.2499999999999991e-11 4768 2452 1.0416666666666666e-11 4768 2451 2.0833333333333326e-11 4768 3658 2.0833333333333339e-11 4768 3701 -2.2913451068275814e-27 4768 2996 6.2499999999999991e-11 4768 3002 1.0416666666666666e-11 4769 4769 2.4999999999999996e-10 4769 4764 9.5018296033870872e-28 4769 4186 1.0416666666666663e-11 4769 4185 2.0833333333333326e-11 4769 4994 2.0833333333333336e-11 4769 4761 -2.2913451068275814e-27 4769 4160 1.0416666666666666e-11 4769 4158 2.0833333333333326e-11 4770 4770 4.1666666666666662e-10 4770 4168 1.8812360437258079e-27 4770 4779 -1.0416666666666667e-10 4770 4772 1.7917989385963757e-27 4770 4072 -1.8812360437258079e-27 4770 4063 9.3749999999999986e-11 4770 4062 -1.0416666666666668e-11 4770 4766 2.0833333333333339e-11 4770 4760 -8.3333333333333330e-11 4770 4159 9.3749999999999986e-11 4770 4158 2.0833333333333332e-11 4770 3021 2.0833333333333332e-11 4770 3023 -1.0416666666666671e-11 4771 4771 4.5833333333333325e-10 4771 4072 5.2083333333333334e-11 4771 4774 -4.1666666666666678e-11 4771 4772 8.3333333333333343e-11 4771 4155 1.0416666666666665e-11 4771 4760 -8.3333333333333330e-11 4771 4062 -3.2311742677852644e-27 4771 115 7.2916666666666660e-11 4771 2487 -1.6155871338926322e-27 4771 2494 2.0833333333333332e-11 4771 3704 2.0833333333333336e-11 4771 441 1.3541666666666664e-10 4771 3021 2.0833333333333332e-11 4772 4772 4.1666666666666662e-10 4772 4159 2.0194839173657902e-27 4772 4770 2.2214323091023692e-27 4772 4779 1.6155871338926322e-27 4772 4063 2.2470898404921788e-28 4772 4062 -1.0416666666666669e-11 4772 4072 6.2499999999999991e-11 4772 4771 8.3333333333333343e-11 4772 4774 -6.4623485355705287e-27 4772 4156 2.0194839173657902e-27 4772 4168 1.0416666666666661e-11 4772 4773 -2.0833333333333326e-11 4772 5038 -4.1666666666666658e-11 4772 4153 -4.1666666666666665e-11 4772 4155 -1.0416666666666655e-11 4772 441 5.2083333333333334e-11 4772 115 -3.1250000000000002e-11 4772 3023 -1.0416666666666673e-11 4772 2487 -1.2500000000000001e-10 4773 4773 8.3333333333333314e-10 4773 5047 -1.2499999999999998e-10 4773 4350 1.6666666666666666e-10 4773 5044 -1.2499999999999998e-10 4773 4156 4.1666666666666671e-11 4773 4168 -5.2083333333333328e-11 4773 4772 -2.0833333333333329e-11 4773 5038 1.2500000000000001e-10 4773 4153 4.1666666666666665e-11 4773 4155 -1.0416666666666668e-11 4773 111 -5.2083333333333334e-11 4773 3463 4.1666666666666658e-11 4773 5 3.1250000000000002e-11 4773 2888 -2.0833333333333342e-11 4773 3707 4.1666666666666665e-11 4773 3023 -1.4583333333333332e-10 4773 2487 -8.3333333333333330e-11 4774 4774 3.3333333333333327e-10 4774 4062 4.0939925783957852e-29 4774 4771 -4.1666666666666671e-11 4774 4154 -4.1666666666666665e-11 4774 4155 -6.2500000000000004e-11 4774 4775 -4.1666666666666665e-11 4774 4073 1.8812360437258079e-27 4774 4072 -6.2499999999999991e-11 4774 2487 -4.1666666666666671e-11 4774 115 -1.6666666666666666e-10 4774 441 -4.1666666666666678e-11 4775 4775 4.5833333333333330e-10 4775 4073 -6.4623485355705287e-27 4775 4154 -4.8467614016778965e-27 4775 4155 1.0416666666666668e-11 4775 4774 -4.1666666666666665e-11 4775 5040 -8.3333333333333330e-11 4775 4072 5.2083333333333334e-11 4775 441 1.3541666666666666e-10 4775 1522 2.0833333333333332e-11 4775 814 2.0833333333333339e-11 4775 813 -8.3333333333333330e-11 4775 115 7.2916666666666660e-11 4775 114 2.0833333333333332e-11 4776 4776 4.1666666666666662e-10 4776 4057 -2.0833333333333329e-11 4776 4675 -2.0833333333333339e-11 4776 4667 8.3333333333333330e-11 4776 4162 -2.0833333333333332e-11 4776 4159 -8.3333333333333330e-11 4776 4160 2.0833333333333339e-11 4776 4158 -2.0833333333333329e-11 4776 4766 -2.0833333333333339e-11 4776 4761 8.3333333333333330e-11 4776 4063 -8.3333333333333330e-11 4776 4065 2.0833333333333339e-11 4776 3021 -2.0833333333333332e-11 4777 4777 4.1666666666666662e-10 4777 4070 -2.0833333333333332e-11 4777 4778 2.0833333333333339e-11 4777 5013 -8.3333333333333330e-11 4777 4166 -2.0833333333333332e-11 4777 4159 -8.3333333333333330e-11 4777 4163 2.0833333333333336e-11 4777 4162 -2.0833333333333332e-11 4777 4675 -2.0833333333333339e-11 4777 4669 8.3333333333333330e-11 4777 4063 -8.3333333333333330e-11 4777 4069 2.0833333333333336e-11 4777 4057 -2.0833333333333332e-11 4778 4778 2.4999999999999996e-10 4778 4072 -1.0416666666666666e-11 4778 4779 2.0833333333333339e-11 4778 5024 4.5053818449435037e-28 4778 4168 -1.0416666666666666e-11 4778 4063 -6.2499999999999991e-11 4778 4069 -1.0416666666666665e-11 4778 4070 -2.0833333333333332e-11 4778 4777 2.0833333333333336e-11 4778 5013 9.5018296033870872e-28 4778 4159 -6.2499999999999991e-11 4778 4163 -1.0416666666666665e-11 4778 4166 -2.0833333333333323e-11 4779 4779 4.1666666666666662e-10 4779 4070 -2.0833333333333329e-11 4779 4778 2.0833333333333339e-11 4779 5024 8.3333333333333330e-11 4779 4166 -2.0833333333333332e-11 4779 4159 -9.3750000000000012e-11 4779 4168 1.0416666666666674e-11 4779 4770 -1.0416666666666667e-10 4779 4772 9.5018296033870872e-28 4779 4063 -9.3749999999999999e-11 4779 4062 2.2851328271989659e-27 4779 4072 1.0416666666666671e-11 4779 3023 3.6295685768920020e-28 4780 4780 2.0833333333333331e-10 4781 4781 2.0833333333333331e-10 4782 4782 4.1666666666666657e-02 4782 4786 4.1666666666666666e-03 4782 4152 1.0416666666666660e-03 4782 4792 4.3368086899420177e-19 4782 4191 -6.2499999999999986e-03 4782 4783 1.6263032587282567e-19 4782 3914 -1.0416666666666669e-03 4782 2968 4.5528020914918643e-20 4782 3630 -2.0833333333333329e-03 4782 2340 4.1666666666666666e-03 4783 4783 4.1666666666666657e-02 4783 4788 4.6263880787845817e-19 4783 4191 -2.6946235634527430e-19 4783 4782 2.7807826960562663e-19 4783 3914 -1.0116749763768550e-19 4784 4784 4.1666666666666657e-02 4784 3918 -4.1666666666666666e-03 4784 4787 -2.0833333333333329e-03 4784 4910 -4.1666666666666666e-03 4784 4184 2.0761130467597592e-20 4784 3914 -1.2499999999999999e-02 4784 3919 -1.0416666666666671e-03 4784 4566 -8.3333333333333332e-03 4784 3879 -1.0416666666666677e-03 4784 3878 6.2499999999999995e-03 4784 4785 7.3183646642771549e-19 4784 4907 -1.3552527156068805e-20 4784 4170 -1.0416666666666671e-03 4784 4169 1.0416666666666671e-03 4784 2780 2.1684043449710089e-19 4784 2971 -3.1249999999999997e-03 4784 2776 5.2083333333333330e-03 4784 2997 -3.2249014814734037e-20 4785 4785 4.1666666666666657e-02 4785 4786 8.3333333333333315e-03 4785 3879 -1.0416666666666667e-03 4785 3878 2.1705219273391446e-19 4785 4907 1.0416666666666668e-02 4785 4784 5.8569019580184656e-19 4785 4170 -1.0416666666666669e-03 4785 4169 -2.1705219273391446e-19 4785 2999 2.0833333333333329e-03 4785 3636 2.0833333333333337e-03 4785 2775 2.0833333333333333e-03 4785 2780 9.3749999999999997e-03 4785 2997 9.3749999999999979e-03 4786 4786 9.1666666666666646e-02 4786 4785 8.3333333333333315e-03 4786 3879 -6.2500000000000003e-03 4786 4782 4.1666666666666666e-03 4786 4152 -2.0833333333333342e-03 4786 4791 4.1666666666666657e-03 4786 4170 -1.0416666666666664e-02 4786 4566 -8.3333333333333315e-03 4786 3914 -1.0416666666666666e-02 4786 2776 1.0416666666666669e-03 4786 2997 1.0416666666666669e-03 4786 3636 -1.3552527156068805e-20 4786 2780 1.0416666666666667e-03 4786 2775 4.1666666666666666e-03 4786 2348 3.1249999999999997e-03 4786 3630 -1.2499999999999999e-02 4786 2340 1.6666666666666666e-02 4786 3635 -1.2499999999999997e-02 4786 3000 -5.2083333333333330e-03 4786 2999 4.1666666666666675e-03 4786 3633 -1.3552527156068805e-20 4786 2971 1.0416666666666667e-03 4786 2968 4.1666666666666666e-03 4787 4787 8.3333333333333315e-02 4787 3919 -1.0416666666666664e-03 4787 4784 -2.0833333333333329e-03 4787 4910 1.2499999999999997e-02 4787 4169 -5.2083333333333330e-03 4787 4171 -5.2083333333333322e-03 4787 4170 -1.4583333333333332e-02 4787 4184 4.1666666666666675e-03 4787 4789 4.1666666666666666e-03 4787 4996 1.2499999999999999e-02 4787 4047 3.1249999999999997e-03 4787 4056 -2.0833333333333342e-03 4787 4055 1.6666666666666666e-02 4787 4788 4.1666666666666657e-03 4787 5075 -1.2499999999999997e-02 4787 3914 -8.3333333333333315e-03 4787 3918 4.1666666666666675e-03 4788 4788 4.1666666666666657e-02 4788 4783 6.5052130349130266e-19 4788 4191 -6.2499999999999986e-03 4788 4793 -4.3368086899420177e-19 4788 4056 1.0416666666666660e-03 4788 4055 4.1666666666666666e-03 4788 5075 -2.0833333333333329e-03 4788 4787 4.1666666666666666e-03 4788 3914 -1.0416666666666669e-03 4788 3918 -1.4973071994693204e-20 4789 4789 4.1666666666666657e-02 4789 4187 -3.2249014814734037e-20 4789 4793 4.3368086899420177e-19 4789 4191 -6.2499999999999986e-03 4789 4995 -8.3333333333333332e-03 4789 4195 1.0416666666666664e-03 4789 4184 4.5528020914918643e-20 4789 4996 2.0833333333333329e-03 4789 4787 4.1666666666666666e-03 4789 4047 1.2499999999999997e-02 4789 4056 1.0416666666666660e-03 4789 4055 4.1666666666666666e-03 4789 4797 2.7105054312137611e-20 4789 4790 1.6263032587282567e-19 4789 4172 -4.9904357809065860e-20 4789 4171 1.0416666666666667e-03 4789 4170 -1.0416666666666669e-03 4790 4790 4.1666666666666657e-02 4790 4195 -2.1705219273391446e-19 4790 4187 1.0416666666666666e-02 4790 4191 -5.8569019580184656e-19 4790 4795 1.0416666666666668e-02 4790 4791 4.6263880787845817e-19 4790 4190 2.1705219273391446e-19 4790 4797 -1.0416666666666666e-02 4790 4789 2.7807826960562663e-19 4790 4172 1.0416666666666668e-02 4790 4171 -2.1705219273391446e-19 4790 4170 -4.6263880787845817e-19 4790 3000 -5.0116116045879435e-20 4791 4791 4.1666666666666657e-02 4791 4786 4.1666666666666666e-03 4791 4172 -2.1684043449710089e-19 4791 4170 -1.0416666666666669e-03 4791 4790 6.5052130349130266e-19 4791 4187 2.1684043449710089e-19 4791 4191 -6.2499999999999986e-03 4791 4795 -2.1684043449710089e-19 4791 4190 1.0416666666666673e-03 4791 4794 -8.3333333333333315e-03 4791 4152 1.0416666666666660e-03 4791 2340 4.1666666666666657e-03 4791 3635 -2.0833333333333329e-03 4791 2999 -1.4973071994693204e-20 4791 3000 1.0416666666666673e-03 4791 2348 1.2499999999999997e-02 4792 4792 3.3333333333333326e-02 4792 4782 8.6736173798840355e-19 4792 4191 6.2499999999999986e-03 4792 4190 -1.6284208410963924e-19 4792 4794 4.1666666666666657e-03 4792 4152 6.2499999999999986e-03 4792 2348 4.1666666666666666e-03 4793 4793 3.3333333333333326e-02 4793 4047 4.1666666666666657e-03 4793 4995 4.1666666666666675e-03 4793 4789 4.3368086899420177e-19 4793 4195 2.1705219273391446e-19 4793 4191 6.2499999999999986e-03 4793 4056 6.2499999999999986e-03 4794 4794 2.5000000208333328e-02 4794 4765 2.0833333333333336e-11 4794 4763 -8.3333333333333330e-11 4794 4185 2.0833333333333332e-11 4794 4191 5.2083333333333330e-03 4794 4190 1.0416666562499996e-03 4794 4792 4.1666666666666657e-03 4794 4791 -8.3333333333333315e-03 4794 4152 1.0416666666666664e-03 4794 2349 2.0833333333333332e-11 4794 2348 1.0416666562499996e-03 4795 4795 2.0833333541666669e-02 4795 4185 2.0833333333333332e-11 4795 4762 2.0833333333333339e-11 4795 4763 -8.3333333333333330e-11 4795 4182 2.0833333333333332e-11 4795 4172 5.2083333749999997e-03 4795 4170 2.1705219273391446e-19 4795 4790 1.0416666666666668e-02 4795 4187 5.2083333750000006e-03 4795 4191 5.0116116045879435e-20 4795 4791 -3.1800793213478638e-19 4795 4190 -1.0416666592233644e-11 4795 3000 -1.0416666543688075e-11 4796 4796 4.1666666666666662e-10 4796 4182 -2.0833333333333329e-11 4796 4188 -2.0833333333333329e-11 4796 4674 -2.0833333333333339e-11 4796 4667 8.3333333333333330e-11 4796 4172 -8.3333333333333330e-11 4796 4181 2.0833333333333339e-11 4796 4180 -2.0833333333333332e-11 4796 4762 -2.0833333333333339e-11 4796 4761 8.3333333333333330e-11 4796 4187 -8.3333333333333330e-11 4796 4186 2.0833333333333339e-11 4796 4185 -2.0833333333333332e-11 4797 4797 2.0833333541666665e-02 4797 4191 2.1705219273391446e-19 4797 4180 -2.0833333333333332e-11 4797 4674 -2.0833333333333339e-11 4797 4661 8.3333333333333330e-11 4797 4187 -5.2083333750000006e-03 4797 4195 1.0416666842267189e-11 4797 4188 -2.0833333333333332e-11 4797 4790 -1.0416666666666666e-02 4797 4789 -1.3753697481041702e-19 4797 4172 -5.2083333749999997e-03 4797 4171 1.0416667059107617e-11 4797 4170 2.1705219273391446e-19 4798 4798 2.4999999999999994e-02 4799 4799 2.0833333333333332e-02 4800 4800 2.0833333333333332e-02 4801 4801 6.6666666666666664e-10 4801 4808 1.6155871338926322e-27 4801 4366 -4.1666666666666665e-11 4801 4806 1.6155871338926322e-27 4801 4207 -4.1666666666666665e-11 4801 4810 1.6155871338926322e-27 4801 3767 -4.1666666666666665e-11 4801 4802 1.6155871338926322e-27 4801 4200 -4.1666666666666665e-11 4802 4802 2.4999999999999996e-10 4802 4803 -2.2913451068275814e-27 4802 3767 2.0833333333333326e-11 4802 4801 9.5018296033870872e-28 4802 4200 2.0833333333333326e-11 4803 4803 6.6666666666666664e-10 4803 4802 -1.8175355256292112e-27 4803 3767 -4.1666666666666665e-11 4803 4417 1.8175355256292112e-27 4803 3756 -4.1666666666666665e-11 4803 4811 -1.8175355256292112e-27 4803 4143 -4.1666666666666665e-11 4803 4804 -1.8175355256292112e-27 4803 4200 -4.1666666666666665e-11 4804 4804 2.4999999999999996e-10 4804 4807 9.5018296033870872e-28 4804 4143 2.0833333333333326e-11 4804 4803 -2.2913451068275814e-27 4804 4200 2.0833333333333326e-11 4805 4805 6.6666666666666664e-10 4805 4126 -1.0416666666666666e-11 4805 5064 -8.3333333333333330e-11 4805 4812 -1.8175355256292112e-27 4805 4133 6.2499999999999991e-11 4805 4132 -4.1666666666666665e-11 4805 4728 8.3333333333333330e-11 4805 4727 1.8175355256292112e-27 4805 3733 -1.0416666666666666e-11 4805 3737 -1.0416666666666666e-11 4805 3745 6.2499999999999991e-11 4805 3736 -4.1666666666666665e-11 4805 4817 8.3333333333333330e-11 4805 4809 -1.8175355256292112e-27 4805 4210 -1.0416666666666666e-11 4805 4221 6.2499999999999991e-11 4805 4207 -4.1666666666666665e-11 4805 5063 -8.3333333333333330e-11 4805 4806 -1.8175355256292112e-27 4805 4367 6.2499999999999991e-11 4805 4366 -4.1666666666666665e-11 4806 4806 2.4999999999999996e-10 4806 4221 1.0416666666666666e-11 4806 4801 9.5018296033870872e-28 4806 4207 2.0833333333333326e-11 4806 5063 2.0833333333333339e-11 4806 4805 -2.2913451068275814e-27 4806 4367 1.0416666666666666e-11 4806 4366 2.0833333333333326e-11 4807 4807 6.6666666666666664e-10 4807 4804 1.6155871338926322e-27 4807 4143 -4.1666666666666665e-11 4807 4722 1.8175355256292112e-27 4807 4132 -4.1666666666666665e-11 4807 4812 1.6155871338926322e-27 4807 4366 -4.1666666666666665e-11 4807 4808 -1.8175355256292112e-27 4807 4200 -4.1666666666666665e-11 4808 4808 2.4999999999999996e-10 4808 4801 9.5018296033870872e-28 4808 4366 2.0833333333333326e-11 4808 4807 -2.2913451068275814e-27 4808 4200 2.0833333333333326e-11 4809 4809 2.4999999999999996e-10 4809 3745 1.0416666666666663e-11 4809 4817 -2.0833333333333336e-11 4809 4805 -2.2913451068275814e-27 4809 4221 1.0416666666666666e-11 4809 4210 6.2500000000000004e-11 4809 4208 1.0416666666666663e-11 4809 4207 2.0833333333333326e-11 4809 4416 2.0833333333333336e-11 4809 4413 -9.5018296033870872e-28 4809 3737 6.2500000000000004e-11 4809 3722 1.0416666666666666e-11 4809 3736 2.0833333333333326e-11 4810 4810 2.4999999999999996e-10 4810 4801 9.5018296033870872e-28 4810 3765 1.0416666666666666e-11 4810 3767 2.0833333333333326e-11 4810 4412 2.0833333333333339e-11 4810 4413 2.2913451068275814e-27 4810 4208 1.0416666666666666e-11 4810 4207 2.0833333333333326e-11 4811 4811 2.4999999999999996e-10 4811 4803 -2.2913451068275814e-27 4811 4141 1.0416666666666665e-11 4811 4143 2.0833333333333326e-11 4811 4718 2.0833333333333336e-11 4811 4719 -9.5018296033870872e-28 4811 3757 1.0416666666666665e-11 4811 3756 2.0833333333333326e-11 4812 4812 2.4999999999999996e-10 4812 4807 9.5018296033870872e-28 4812 4367 1.0416666666666663e-11 4812 4366 2.0833333333333326e-11 4812 5064 2.0833333333333336e-11 4812 4805 -2.2913451068275814e-27 4812 4133 1.0416666666666666e-11 4812 4132 2.0833333333333326e-11 4813 4813 2.0833333333333331e-10 4814 4814 2.0833333333333331e-10 4815 4815 4.1666666666666662e-10 4815 3729 -2.0833333333333329e-11 4815 4504 -2.0833333333333339e-11 4815 4492 8.3333333333333330e-11 4815 4216 -2.0833333333333332e-11 4815 4210 -8.3333333333333330e-11 4815 4213 2.0833333333333332e-11 4815 4212 -2.0833333333333329e-11 4815 4408 -2.0833333333333339e-11 4815 4402 8.3333333333333330e-11 4815 3737 -8.3333333333333330e-11 4815 3738 2.0833333333333332e-11 4815 3721 -2.0833333333333332e-11 4816 4816 4.1666666666666662e-10 4816 3734 -2.0833333333333329e-11 4816 4746 -2.0833333333333339e-11 4816 4738 8.3333333333333330e-11 4816 4220 -2.0833333333333332e-11 4816 4210 -8.3333333333333330e-11 4816 4218 2.0833333333333336e-11 4816 4216 -2.0833333333333329e-11 4816 4504 -2.0833333333333339e-11 4816 4500 8.3333333333333330e-11 4816 3737 -8.3333333333333330e-11 4816 3744 2.0833333333333336e-11 4816 3729 -2.0833333333333332e-11 4817 4817 4.1666666666666662e-10 4817 3736 -2.0833333333333329e-11 4817 4809 -2.0833333333333339e-11 4817 4805 8.3333333333333330e-11 4817 4207 -2.0833333333333332e-11 4817 4210 -8.3333333333333330e-11 4817 4221 2.0833333333333332e-11 4817 4220 -2.0833333333333329e-11 4817 4746 -2.0833333333333339e-11 4817 4740 8.3333333333333330e-11 4817 3737 -8.3333333333333330e-11 4817 3745 2.0833333333333332e-11 4817 3734 -2.0833333333333332e-11 4818 4818 2.0833333333333331e-10 4819 4819 2.0833333333333331e-10 4820 4820 2.0833333333333331e-10 4821 4821 2.0833333333333331e-10 4822 4822 4.1666666666666662e-10 4822 4216 2.0833333333333329e-11 4822 4227 2.0833333333333329e-11 4822 4409 2.0833333333333339e-11 4822 4402 -8.3333333333333330e-11 4822 4213 -2.0833333333333339e-11 4822 4212 2.0833333333333332e-11 4822 4493 2.0833333333333339e-11 4822 4492 -8.3333333333333330e-11 4822 4225 -2.0833333333333339e-11 4822 4224 2.0833333333333332e-11 4823 4823 4.1666666666666662e-10 4823 3899 2.0833333333333329e-11 4823 4224 2.0833333333333329e-11 4823 4506 2.0833333333333339e-11 4823 4492 -8.3333333333333330e-11 4823 3898 8.3333333333333330e-11 4823 3897 -2.0833333333333332e-11 4823 3896 2.0833333333333332e-11 4823 4403 2.0833333333333339e-11 4823 4402 -8.3333333333333330e-11 4823 4228 8.3333333333333330e-11 4823 4225 -2.0833333333333332e-11 4823 4227 2.0833333333333332e-11 4824 4824 4.1666666666666662e-10 4824 3721 2.0833333333333329e-11 4824 4410 2.0833333333333339e-11 4824 4402 -8.3333333333333330e-11 4824 3899 2.0833333333333332e-11 4824 3891 8.3333333333333330e-11 4824 3897 -2.0833333333333339e-11 4824 3896 2.0833333333333329e-11 4824 4505 2.0833333333333339e-11 4824 4492 -8.3333333333333330e-11 4824 3740 8.3333333333333330e-11 4824 3738 -2.0833333333333339e-11 4824 3729 2.0833333333333332e-11 4825 4825 2.0833333333333331e-10 4826 4826 2.0833333333333331e-10 4827 4827 2.0833333333333331e-10 4828 4828 2.4999999999999998e-02 4828 4921 -6.0159191589756597e-20 4828 4238 -1.0416666666666664e-03 4828 4231 -2.0833333333333329e-03 4828 4829 2.0833333333333337e-03 4828 4877 -1.0254392617697373e-19 4828 3715 -1.0416666666666664e-03 4828 3717 -2.0833333333333329e-03 4829 4829 2.0833333541666665e-02 4829 4231 -2.0833333333333333e-03 4829 3710 -2.0833333333333332e-11 4829 4397 -2.0833333333333339e-11 4829 4400 8.3333333333333330e-11 4829 4238 1.0416666770833333e-03 4829 4227 -2.0833333333333332e-11 4829 4828 2.0833333333333337e-03 4829 4877 -8.3333333333333315e-03 4829 3715 1.0416666770833337e-03 4829 3717 -2.0833333333333329e-03 4830 4830 2.0833333333333332e-02 4831 4831 2.0833333333333331e-10 4832 4832 2.0833333333333331e-10 4833 4833 2.0833333333333331e-10 4834 4834 2.0833333333333332e-02 4835 4835 2.0833333333333331e-10 4836 4836 2.0833333333333331e-10 4837 4837 2.0833333333333331e-10 4838 4838 6.6666666666666664e-10 4838 4259 -1.0416666666666666e-11 4838 4857 -8.3333333333333330e-11 4838 4843 1.6155871338926322e-27 4838 4268 6.2499999999999991e-11 4838 4257 -4.1666666666666665e-11 4838 4858 -8.3333333333333330e-11 4838 4841 -1.8175355256292112e-27 4838 3901 -1.0416666666666666e-11 4838 3809 -1.0416666666666666e-11 4838 3890 -1.0416666666666666e-11 4838 3892 6.2499999999999991e-11 4838 3888 -4.1666666666666665e-11 4838 4851 8.3333333333333330e-11 4838 4845 1.6155871338926322e-27 4838 3795 -1.0416666666666666e-11 4838 3808 6.2499999999999991e-11 4838 3796 -4.1666666666666665e-11 4838 4855 -8.3333333333333330e-11 4838 4839 -1.8175355256292112e-27 4838 4243 -1.0416666666666666e-11 4838 4242 6.2499999999999991e-11 4838 4241 -4.1666666666666665e-11 4839 4839 2.4999999999999996e-10 4839 4255 1.0416666666666665e-11 4839 4863 2.0833333333333332e-11 4839 4846 9.5018296033870872e-28 4839 3811 1.0416666666666665e-11 4839 3809 6.2499999999999991e-11 4839 3808 1.0416666666666666e-11 4839 3796 2.0833333333333326e-11 4839 4855 2.0833333333333339e-11 4839 4838 -2.2913451068275814e-27 4839 4243 6.2499999999999991e-11 4839 4242 1.0416666666666666e-11 4839 4241 2.0833333333333326e-11 4840 4840 6.6666666666666664e-10 4840 3750 -1.0416666666666666e-11 4840 4871 -8.3333333333333330e-11 4840 4847 1.6155871338926322e-27 4840 3761 6.2499999999999991e-11 4840 3760 -4.1666666666666665e-11 4840 4425 8.3333333333333330e-11 4840 4424 -1.6155871338926322e-27 4840 3723 -1.0416666666666666e-11 4840 3901 -1.0416666666666666e-11 4840 3740 -1.0416666666666666e-11 4840 3741 6.2499999999999991e-11 4840 3739 -4.1666666666666665e-11 4840 4854 8.3333333333333330e-11 4840 4844 1.6155871338926322e-27 4840 3891 -1.0416666666666666e-11 4840 3900 6.2499999999999991e-11 4840 3888 -4.1666666666666665e-11 4840 4870 -8.3333333333333330e-11 4840 4841 1.6155871338926322e-27 4840 4259 -1.0416666666666666e-11 4840 4258 6.2499999999999991e-11 4840 4257 -4.1666666666666665e-11 4841 4841 2.4999999999999996e-10 4841 3900 1.0416666666666665e-11 4841 4268 1.0416666666666666e-11 4841 4858 2.0833333333333339e-11 4841 4838 -2.2913451068275814e-27 4841 3901 6.2499999999999991e-11 4841 3892 1.0416666666666666e-11 4841 3888 2.0833333333333326e-11 4841 4870 2.0833333333333332e-11 4841 4840 9.5018296033870872e-28 4841 4259 6.2499999999999991e-11 4841 4258 1.0416666666666665e-11 4841 4257 2.0833333333333326e-11 4842 4842 6.6666666666666664e-10 4842 4848 -1.8175355256292112e-27 4842 3823 -4.1666666666666665e-11 4842 4484 1.8175355256292112e-27 4842 3760 -4.1666666666666665e-11 4842 4847 -1.8175355256292112e-27 4842 4257 -4.1666666666666665e-11 4842 4843 -1.8175355256292112e-27 4842 4241 -4.1666666666666665e-11 4843 4843 2.4999999999999996e-10 4843 4242 1.0416666666666663e-11 4843 4857 2.0833333333333336e-11 4843 4838 9.5018296033870872e-28 4843 4268 1.0416666666666666e-11 4843 4257 2.0833333333333326e-11 4843 4842 -2.2913451068275814e-27 4843 4241 2.0833333333333326e-11 4844 4844 2.4999999999999996e-10 4844 3741 1.0416666666666665e-11 4844 4854 -2.0833333333333336e-11 4844 4840 9.5018296033870872e-28 4844 3900 1.0416666666666665e-11 4844 3891 6.2500000000000004e-11 4844 3889 1.0416666666666666e-11 4844 3888 2.0833333333333326e-11 4844 4452 2.0833333333333339e-11 4844 4449 2.2913451068275814e-27 4844 3740 6.2499999999999991e-11 4844 3725 1.0416666666666666e-11 4844 3739 2.0833333333333326e-11 4845 4845 2.4999999999999996e-10 4845 3892 1.0416666666666663e-11 4845 4851 -2.0833333333333336e-11 4845 4838 9.5018296033870872e-28 4845 3808 1.0416666666666666e-11 4845 3795 6.2500000000000004e-11 4845 3794 1.0416666666666663e-11 4845 3796 2.0833333333333326e-11 4845 4448 2.0833333333333336e-11 4845 4449 2.2913451068275814e-27 4845 3890 6.2500000000000004e-11 4845 3889 1.0416666666666666e-11 4845 3888 2.0833333333333326e-11 4846 4846 6.6666666666666654e-10 4846 3790 6.2499999999999991e-11 4846 3789 -4.1666666666666665e-11 4846 3823 -4.1666666666666665e-11 4846 4848 1.6155871338926322e-27 4846 4255 6.2499999999999991e-11 4846 4241 -4.1666666666666665e-11 4846 3797 -1.0416666666666666e-11 4846 4243 -1.0416666666666666e-11 4846 4863 -8.3333333333333330e-11 4846 4839 1.6155871338926322e-27 4846 3809 -1.0416666666666666e-11 4846 3811 6.2499999999999991e-11 4846 3796 -4.1666666666666665e-11 4846 4456 -8.3333333333333330e-11 4846 4453 -1.6155871338926322e-27 4846 3785 -1.0416666666666666e-11 4846 1237 -1.0416666666666666e-11 4846 2063 8.3333333333333330e-11 4846 2058 1.6155871338926322e-27 4846 1602 -1.0416666666666666e-11 4846 1606 6.2499999999999991e-11 4846 2068 -8.3333333333333330e-11 4847 4847 2.4999999999999996e-10 4847 4842 -2.2913451068275814e-27 4847 4258 1.0416666666666665e-11 4847 4257 2.0833333333333326e-11 4847 4871 2.0833333333333336e-11 4847 4840 9.5018296033870872e-28 4847 3761 1.0416666666666665e-11 4847 3760 2.0833333333333326e-11 4848 4848 2.4999999999999996e-10 4848 3823 2.0833333333333326e-11 4848 4846 9.5018296033870872e-28 4848 4255 1.0416666666666665e-11 4848 4241 2.0833333333333326e-11 4848 4842 -2.2913451068275814e-27 4848 1606 1.0416666666666665e-11 4848 2068 2.0833333333333336e-11 4849 4849 2.4999999999999998e-02 4849 3904 -1.0416666666666664e-03 4849 3808 -1.0416666666666664e-03 4849 4851 2.0833333333333337e-03 4849 4856 6.0159191589756597e-20 4849 3890 -6.2500000000000003e-03 4849 3892 -1.0416666666666664e-03 4849 3905 -2.0833333333333329e-03 4849 4850 2.0833333333333337e-03 4849 4897 -1.0254392617697373e-19 4849 3795 -6.2500000000000003e-03 4849 3799 -1.0416666666666664e-03 4849 3798 -2.0833333333333329e-03 4850 4850 4.1666666666666664e-02 4850 3905 -2.0833333333333329e-03 4850 3800 -2.0833333333333329e-03 4850 4853 2.0833333333333337e-03 4850 4895 8.3333333333333315e-03 4850 3890 -8.3333333333333315e-03 4850 3904 2.0833333333333333e-03 4850 3903 -2.0833333333333333e-03 4850 4849 2.0833333333333337e-03 4850 4897 -8.3333333333333315e-03 4850 3795 -8.3333333333333315e-03 4850 3799 2.0833333333333333e-03 4850 3798 -2.0833333333333333e-03 4851 4851 2.0833333541666665e-02 4851 3798 -2.0833333333333329e-03 4851 4849 2.0833333333333337e-03 4851 4856 -8.3333333333333315e-03 4851 3905 -2.0833333333333333e-03 4851 3890 -4.1666667083333333e-03 4851 3892 1.0416666770833337e-03 4851 3888 -2.0833333333333329e-11 4851 4845 -2.0833333333333339e-11 4851 4838 8.3333333333333330e-11 4851 3795 -4.1666667083333324e-03 4851 3808 1.0416666770833331e-03 4851 3796 -2.0833333333333332e-11 4852 4852 2.0833333541666665e-02 4852 3903 -2.0833333333333329e-03 4852 4853 2.0833333333333337e-03 4852 4865 -8.3333333333333315e-03 4852 3800 -2.0833333333333333e-03 4852 3795 -4.1666667083333333e-03 4852 3810 1.0416666770833337e-03 4852 3793 -2.0833333333333329e-11 4852 4435 -2.0833333333333339e-11 4852 4432 8.3333333333333330e-11 4852 3890 -4.1666667083333324e-03 4852 3895 1.0416666770833331e-03 4852 3893 -2.0833333333333332e-11 4853 4853 2.5000000000000001e-02 4853 3895 -1.0416666666666664e-03 4853 4852 2.0833333333333337e-03 4853 4865 6.0159191589756597e-20 4853 3810 -1.0416666666666664e-03 4853 3795 -6.2500000000000003e-03 4853 3799 -1.0416666666666664e-03 4853 3800 -2.0833333333333329e-03 4853 4850 2.0833333333333337e-03 4853 4895 1.0254392617697373e-19 4853 3890 -6.2500000000000003e-03 4853 3904 -1.0416666666666664e-03 4853 3903 -2.0833333333333329e-03 4854 4854 4.1666666666666662e-10 4854 3739 -2.0833333333333332e-11 4854 4844 -2.0833333333333339e-11 4854 4840 8.3333333333333330e-11 4854 3888 -2.0833333333333332e-11 4854 3891 -8.3333333333333330e-11 4854 3900 2.0833333333333336e-11 4854 3899 -2.0833333333333332e-11 4854 4410 -2.0833333333333339e-11 4854 4404 8.3333333333333330e-11 4854 3740 -8.3333333333333330e-11 4854 3741 2.0833333333333336e-11 4854 3721 -2.0833333333333332e-11 4855 4855 2.0833333541666665e-02 4855 4247 2.0833333333333333e-03 4855 4859 -2.0833333333333337e-03 4855 4856 8.3333333333333315e-03 4855 3798 2.0833333333333329e-03 4855 3809 4.1666667083333333e-03 4855 3808 -1.0416666770833337e-03 4855 3796 2.0833333333333332e-11 4855 4839 2.0833333333333339e-11 4855 4838 -8.3333333333333330e-11 4855 4243 4.1666667083333324e-03 4855 4242 -1.0416666770833333e-03 4855 4241 2.0833333333333332e-11 4856 4856 6.6666666666666652e-02 4856 3901 1.0416666666666669e-03 4856 4858 8.3333333333333315e-03 4856 4875 1.3552527156068805e-20 4856 4259 1.0416666666666667e-03 4856 4268 -6.2500000000000003e-03 4856 4262 4.1666666666666666e-03 4856 3795 1.0416666666666669e-03 4856 4243 1.0416666666666669e-03 4856 4855 8.3333333333333315e-03 4856 4859 1.3552527156068805e-20 4856 3809 1.0416666666666667e-03 4856 3808 -6.2500000000000003e-03 4856 3798 4.1666666666666666e-03 4856 4851 -8.3333333333333315e-03 4856 4849 2.7105054312137611e-20 4856 3890 1.0416666666666667e-03 4856 3892 -6.2500000000000003e-03 4856 3905 4.1666666666666666e-03 4856 4857 8.3333333333333315e-03 4856 4881 2.7105054312137611e-20 4856 4242 -6.2500000000000003e-03 4856 4247 4.1666666666666666e-03 4857 4857 2.0833333541666665e-02 4857 4262 2.0833333333333329e-03 4857 4241 2.0833333333333329e-11 4857 4843 2.0833333333333339e-11 4857 4838 -8.3333333333333330e-11 4857 4268 -1.0416666770833331e-03 4857 4257 2.0833333333333332e-11 4857 4881 -2.0833333333333337e-03 4857 4856 8.3333333333333315e-03 4857 4242 -1.0416666770833337e-03 4857 4247 2.0833333333333333e-03 4858 4858 2.0833333541666665e-02 4858 3905 2.0833333333333333e-03 4858 4875 -2.0833333333333337e-03 4858 4856 8.3333333333333315e-03 4858 4262 2.0833333333333329e-03 4858 4259 4.1666667083333333e-03 4858 4268 -1.0416666770833337e-03 4858 4257 2.0833333333333332e-11 4858 4841 2.0833333333333339e-11 4858 4838 -8.3333333333333330e-11 4858 3901 4.1666667083333324e-03 4858 3892 -1.0416666770833333e-03 4858 3888 2.0833333333333332e-11 4859 4859 2.4999999999999998e-02 4859 3812 -1.0416666666666664e-03 4859 4242 -1.0416666666666664e-03 4859 4855 -2.0833333333333337e-03 4859 4856 -1.0254392617697373e-19 4859 3809 -6.2500000000000003e-03 4859 3808 -1.0416666666666664e-03 4859 3798 -2.0833333333333329e-03 4859 4860 2.0833333333333337e-03 4859 4904 -6.0159191589756597e-20 4859 4243 -6.2500000000000003e-03 4859 4249 -1.0416666666666664e-03 4859 4247 -2.0833333333333329e-03 4860 4860 2.0833333541666669e-02 4860 4250 -2.0833333333333332e-11 4860 4861 2.0833333333333336e-11 4860 4914 -8.3333333333333330e-11 4860 3802 -2.0833333333333332e-11 4860 3809 -4.1666667083333324e-03 4860 3812 1.0416666770833331e-03 4860 3798 -2.0833333333333333e-03 4860 4859 2.0833333333333333e-03 4860 4904 8.3333333333333315e-03 4860 4243 -4.1666667083333333e-03 4860 4249 1.0416666770833337e-03 4860 4247 -2.0833333333333329e-03 4861 4861 2.4999999999999996e-10 4861 3814 -1.0416666666666666e-11 4861 4249 -1.0416666666666665e-11 4861 4860 2.0833333333333332e-11 4861 4914 9.5018296033870872e-28 4861 3809 -6.2499999999999991e-11 4861 3812 -1.0416666666666665e-11 4861 3802 -2.0833333333333326e-11 4861 4862 -2.0833333333333339e-11 4861 4982 2.2913451068275814e-27 4861 4243 -6.2499999999999991e-11 4861 4254 -1.0416666666666666e-11 4861 4250 -2.0833333333333326e-11 4862 4862 4.5833333333333330e-10 4862 4243 7.2916666666666660e-11 4862 4254 -4.8467614016778965e-27 4862 3809 1.3541666666666666e-10 4862 3816 5.2083333333333334e-11 4862 3814 0.0000000000000000e+00 4862 3802 2.0833333333333332e-11 4862 4861 -2.0833333333333339e-11 4862 4982 -8.3333333333333330e-11 4862 4250 2.0833333333333332e-11 4862 1598 1.0416666666666668e-11 4862 1775 4.1666666666666671e-11 4862 1769 -8.3333333333333343e-11 4863 4863 4.5833333333333330e-10 4863 3809 1.3541666666666666e-10 4863 3816 5.2083333333333334e-11 4863 3811 -8.0779356694631609e-27 4863 4243 7.2916666666666660e-11 4863 4255 -1.6155871338926322e-27 4863 4241 2.0833333333333332e-11 4863 4839 2.0833333333333336e-11 4863 4846 -8.3333333333333330e-11 4863 3796 2.0833333333333332e-11 4863 1775 4.1666666666666665e-11 4863 1774 -8.3333333333333330e-11 4863 1598 1.0416666666666665e-11 4864 4864 2.0833333541666665e-02 4864 4865 8.3333333333333315e-03 4864 3870 -1.0416666770833337e-03 4864 3866 2.0833333333333329e-11 4864 4433 2.0833333333333339e-11 4864 4432 -8.3333333333333330e-11 4864 3778 -1.0416666770833331e-03 4864 3775 2.0833333333333332e-11 4864 2410 2.0833333333333329e-03 4864 3325 2.0833333333333337e-03 4864 2765 2.0833333333333333e-03 4864 2760 4.1666667083333333e-03 4864 2409 4.1666667083333324e-03 4865 4865 6.6666666666666652e-02 4865 3865 1.0416666666666669e-03 4865 4864 8.3333333333333315e-03 4865 3870 -6.2500000000000003e-03 4865 4538 -8.3333333333333315e-03 4865 4536 1.3552527156068805e-20 4865 3885 1.0416666666666667e-03 4865 3807 1.0416666666666669e-03 4865 3890 1.0416666666666669e-03 4865 3895 -6.2500000000000003e-03 4865 3903 4.1666666666666666e-03 4865 4852 -8.3333333333333315e-03 4865 4853 2.7105054312137611e-20 4865 3795 1.0416666666666667e-03 4865 3810 -6.2500000000000003e-03 4865 3800 4.1666666666666666e-03 4865 4464 -8.3333333333333315e-03 4865 4463 1.3552527156068805e-20 4865 3777 1.0416666666666667e-03 4865 3778 -6.2500000000000003e-03 4865 2409 1.0416666666666669e-03 4865 3325 -2.7105054312137611e-20 4865 2760 1.0416666666666667e-03 4865 2765 4.1666666666666666e-03 4865 2410 4.1666666666666666e-03 4866 4866 2.0833333541666665e-02 4866 3775 -2.0833333333333329e-11 4866 4433 -2.0833333333333339e-11 4866 4438 8.3333333333333330e-11 4866 3871 1.0416666770833331e-03 4866 3866 -2.0833333333333332e-11 4866 4889 -8.3333333333333315e-03 4866 3779 1.0416666770833335e-03 4866 2757 -2.0833333333333329e-03 4866 2760 -4.1666667083333324e-03 4866 3326 -2.0833333333333337e-03 4866 2409 -4.1666667083333333e-03 4866 288 -2.0833333333333333e-03 4867 4867 4.1666666666666664e-02 4867 3883 -2.0833333333333329e-03 4867 4231 -2.0833333333333329e-03 4867 4869 2.0833333333333337e-03 4867 4925 8.3333333333333315e-03 4867 3898 -8.3333333333333315e-03 4867 3908 2.0833333333333333e-03 4867 3907 -2.0833333333333333e-03 4867 4529 -2.0833333333333337e-03 4867 4528 8.3333333333333315e-03 4867 4228 -8.3333333333333315e-03 4867 4230 2.0833333333333333e-03 4867 4229 -2.0833333333333333e-03 4868 4868 2.0833333541666665e-02 4868 3907 -2.0833333333333329e-03 4868 4869 2.0833333333333337e-03 4868 4877 -8.3333333333333315e-03 4868 4231 -2.0833333333333333e-03 4868 4228 -4.1666667083333333e-03 4868 4238 1.0416666770833337e-03 4868 4227 -2.0833333333333329e-11 4868 4403 -2.0833333333333339e-11 4868 4400 8.3333333333333330e-11 4868 3898 -4.1666667083333324e-03 4868 3902 1.0416666770833331e-03 4868 3899 -2.0833333333333332e-11 4869 4869 2.5000000000000001e-02 4869 3902 -1.0416666666666664e-03 4869 4868 2.0833333333333337e-03 4869 4877 6.0159191589756597e-20 4869 4238 -1.0416666666666664e-03 4869 4228 -6.2500000000000003e-03 4869 4230 -1.0416666666666664e-03 4869 4231 -2.0833333333333329e-03 4869 4867 2.0833333333333337e-03 4869 4925 1.0254392617697373e-19 4869 3898 -6.2500000000000003e-03 4869 3908 -1.0416666666666664e-03 4869 3907 -2.0833333333333329e-03 4870 4870 4.1666666666666662e-10 4870 3888 2.0833333333333332e-11 4870 4260 2.0833333333333332e-11 4870 4411 2.0833333333333336e-11 4870 4404 -8.3333333333333330e-11 4870 3901 8.3333333333333330e-11 4870 3900 -2.0833333333333336e-11 4870 3899 2.0833333333333332e-11 4870 4841 2.0833333333333336e-11 4870 4840 -8.3333333333333330e-11 4870 4259 8.3333333333333330e-11 4870 4258 -2.0833333333333336e-11 4870 4257 2.0833333333333332e-11 4871 4871 4.1666666666666662e-10 4871 3747 2.0833333333333332e-11 4871 4257 2.0833333333333332e-11 4871 4847 2.0833333333333339e-11 4871 4840 -8.3333333333333330e-11 4871 3761 -2.0833333333333336e-11 4871 3760 2.0833333333333332e-11 4871 4405 2.0833333333333339e-11 4871 4404 -8.3333333333333330e-11 4871 4258 -2.0833333333333336e-11 4871 4260 2.0833333333333332e-11 4872 4872 2.4999999999999998e-02 4872 3906 -1.0416666666666664e-03 4872 4266 -1.0416666666666664e-03 4872 4874 2.0833333333333337e-03 4872 4877 -1.0254392617697373e-19 4872 3901 -6.2500000000000003e-03 4872 3902 -1.0416666666666664e-03 4872 3907 -2.0833333333333329e-03 4872 4873 2.0833333333333337e-03 4872 4924 -6.0159191589756597e-20 4872 4259 -6.2500000000000003e-03 4872 4263 -1.0416666666666664e-03 4872 4265 -2.0833333333333329e-03 4873 4873 4.1666666666666664e-02 4873 3907 -2.0833333333333333e-03 4873 4262 -2.0833333333333333e-03 4873 4875 2.0833333333333333e-03 4873 4902 8.3333333333333315e-03 4873 3901 -8.3333333333333315e-03 4873 3906 2.0833333333333337e-03 4873 3905 -2.0833333333333329e-03 4873 4872 2.0833333333333333e-03 4873 4924 8.3333333333333315e-03 4873 4259 -8.3333333333333315e-03 4873 4263 2.0833333333333337e-03 4873 4265 -2.0833333333333329e-03 4874 4874 2.0833333541666665e-02 4874 4265 -2.0833333333333333e-03 4874 4872 2.0833333333333337e-03 4874 4877 -8.3333333333333315e-03 4874 3907 -2.0833333333333329e-03 4874 3901 -4.1666667083333333e-03 4874 3902 1.0416666770833337e-03 4874 3899 -2.0833333333333332e-11 4874 4411 -2.0833333333333339e-11 4874 4400 8.3333333333333330e-11 4874 4259 -4.1666667083333324e-03 4874 4266 1.0416666770833333e-03 4874 4260 -2.0833333333333332e-11 4875 4875 2.4999999999999998e-02 4875 3892 -1.0416666666666664e-03 4875 4858 -2.0833333333333337e-03 4875 4856 -1.0254392617697373e-19 4875 4268 -1.0416666666666664e-03 4875 4259 -6.2500000000000003e-03 4875 4263 -1.0416666666666664e-03 4875 4262 -2.0833333333333329e-03 4875 4873 2.0833333333333337e-03 4875 4902 -6.0159191589756597e-20 4875 3901 -6.2500000000000003e-03 4875 3906 -1.0416666666666664e-03 4875 3905 -2.0833333333333329e-03 4876 4876 2.0833333541666665e-02 4876 3717 2.0833333333333329e-03 4876 4878 -2.0833333333333337e-03 4876 4877 8.3333333333333315e-03 4876 4265 2.0833333333333333e-03 4876 4266 -1.0416666770833337e-03 4876 4260 2.0833333333333329e-11 4876 4401 2.0833333333333339e-11 4876 4400 -8.3333333333333330e-11 4876 3715 -1.0416666770833331e-03 4876 3710 2.0833333333333332e-11 4877 4877 6.6666666666666652e-02 4877 4259 1.0416666666666669e-03 4877 4876 8.3333333333333315e-03 4877 4878 2.7105054312137611e-20 4877 4266 -6.2500000000000003e-03 4877 4265 4.1666666666666666e-03 4877 4874 -8.3333333333333315e-03 4877 4872 1.3552527156068805e-20 4877 3901 1.0416666666666667e-03 4877 3898 1.0416666666666669e-03 4877 3902 -6.2500000000000003e-03 4877 3907 4.1666666666666666e-03 4877 4868 -8.3333333333333315e-03 4877 4869 2.7105054312137611e-20 4877 4228 1.0416666666666667e-03 4877 4238 -6.2500000000000003e-03 4877 4231 4.1666666666666666e-03 4877 4829 -8.3333333333333315e-03 4877 4828 1.3552527156068805e-20 4877 3715 -6.2500000000000003e-03 4877 3717 4.1666666666666666e-03 4878 4878 2.5000000000000001e-02 4878 3715 -1.0416666666666664e-03 4878 4876 -2.0833333333333337e-03 4878 4877 6.0159191589756597e-20 4878 4266 -1.0416666666666664e-03 4878 4265 -2.0833333333333329e-03 4878 4923 1.0254392617697373e-19 4878 3717 -2.0833333333333329e-03 4879 4879 2.0833333333333332e-02 4880 4880 2.0833333333333331e-10 4881 4881 2.4999999999999998e-02 4881 4268 -1.0416666666666664e-03 4881 4901 1.0254392617697373e-19 4881 4262 -2.0833333333333329e-03 4881 4857 -2.0833333333333337e-03 4881 4856 6.0159191589756597e-20 4881 4242 -1.0416666666666664e-03 4881 4247 -2.0833333333333329e-03 4882 4882 2.0833333333333332e-02 4883 4883 2.0833333333333331e-10 4884 4884 2.0833333333333331e-10 4885 4885 2.0833333541666665e-02 4885 4886 -2.0833333333333337e-03 4885 4889 -8.3333333333333315e-03 4885 3971 -2.0833333333333333e-03 4885 3977 -4.1666667083333333e-03 4885 3978 1.0416666770833337e-03 4885 3966 -2.0833333333333329e-11 4885 4439 -2.0833333333333339e-11 4885 4438 8.3333333333333330e-11 4885 3780 -4.1666667083333324e-03 4885 3779 1.0416666770833333e-03 4885 3775 -2.0833333333333332e-11 4885 288 -2.0833333333333329e-03 4886 4886 2.5000000000000001e-02 4886 3977 6.2500000000000003e-03 4886 3971 2.0833333333333329e-03 4886 3780 6.2500000000000003e-03 4886 3779 1.0416666666666664e-03 4886 4885 -2.0833333333333337e-03 4886 4889 1.0254392617697373e-19 4886 3978 1.0416666666666664e-03 4886 293 1.0416666666666664e-03 4886 708 -2.0833333333333337e-03 4886 1011 6.0159191589756597e-20 4886 289 1.0416666666666662e-03 4886 288 2.0833333333333329e-03 4887 4887 4.1666666666666662e-10 4887 3968 8.3333333333333330e-11 4887 3967 -2.0833333333333339e-11 4887 3969 2.0833333333333332e-11 4887 4888 -8.3333333333333330e-11 4887 3791 8.3333333333333330e-11 4887 3792 -2.0833333333333339e-11 4887 3786 2.0833333333333332e-11 4887 4437 2.0833333333333339e-11 4887 4436 -8.3333333333333330e-11 4887 3966 2.0833333333333332e-11 4887 2075 2.0833333333333339e-11 4887 1243 2.0833333333333332e-11 4888 4888 6.6666666666666654e-10 4888 3788 -1.0416666666666666e-11 4888 3968 -1.0416666666666666e-11 4888 3967 6.2499999999999991e-11 4888 3969 -4.1666666666666665e-11 4888 4887 -8.3333333333333330e-11 4888 3791 -1.0416666666666666e-11 4888 3792 6.2499999999999991e-11 4888 4458 -8.3333333333333330e-11 4888 3726 -1.0416666666666666e-11 4888 3742 6.2499999999999991e-11 4888 3743 -4.1666666666666665e-11 4888 3844 -1.0416666666666666e-11 4888 3731 -1.0416666666666666e-11 4888 4517 8.3333333333333330e-11 4888 4518 1.8175355256292112e-27 4888 3840 -1.0416666666666666e-11 4888 3848 6.2499999999999991e-11 4888 3850 -4.1666666666666665e-11 4888 4601 8.3333333333333330e-11 4888 4600 -1.6155871338926322e-27 4888 3970 -1.0416666666666666e-11 4888 2075 -1.8175355256292112e-27 4888 1243 -4.1666666666666665e-11 4888 2067 -1.6155871338926322e-27 4889 4889 6.6666666666666652e-02 4889 3970 1.0416666666666669e-03 4889 3780 1.0416666666666669e-03 4889 4885 -8.3333333333333315e-03 4889 4886 -1.3552527156068805e-20 4889 3977 1.0416666666666667e-03 4889 3978 -6.2500000000000003e-03 4889 3971 4.1666666666666666e-03 4889 4604 -8.3333333333333315e-03 4889 4602 1.3552527156068805e-20 4889 3844 1.0416666666666667e-03 4889 3839 1.0416666666666669e-03 4889 3849 -6.2500000000000003e-03 4889 3851 4.1666666666666666e-03 4889 4515 -8.3333333333333315e-03 4889 4516 1.3552527156068805e-20 4889 3867 1.0416666666666667e-03 4889 3871 -6.2500000000000003e-03 4889 4866 -8.3333333333333315e-03 4889 3779 -6.2500000000000003e-03 4889 2760 1.0416666666666669e-03 4889 2757 4.1666666666666666e-03 4889 3326 -1.3552527156068805e-20 4889 2409 1.0416666666666667e-03 4889 288 4.1666666666666666e-03 4890 4890 6.6666666666666664e-10 4890 4657 -1.6155871338926322e-27 4890 4034 -4.1666666666666665e-11 4890 4752 1.8175355256292112e-27 4890 4136 -4.1666666666666665e-11 4890 4894 1.6155871338926322e-27 4890 4380 -4.1666666666666665e-11 4890 4891 -1.8175355256292112e-27 4890 3953 -4.1666666666666665e-11 4891 4891 2.4999999999999996e-10 4891 3953 2.0833333333333326e-11 4891 4380 2.0833333333333326e-11 4891 4890 -2.2913451068275814e-27 4891 1438 1.0416666666666665e-11 4891 2078 2.0833333333333332e-11 4891 2074 9.5018296033870872e-28 4891 1578 1.0416666666666665e-11 4892 4892 2.4999999999999996e-10 4892 3846 1.0416666666666666e-11 4892 4614 2.0833333333333339e-11 4892 4612 2.2913451068275814e-27 4892 4041 1.0416666666666666e-11 4892 4029 6.2499999999999991e-11 4892 4033 1.0416666666666665e-11 4892 4034 2.0833333333333326e-11 4892 4749 2.0833333333333336e-11 4892 4750 -9.5018296033870872e-28 4892 3858 6.2500000000000004e-11 4892 3860 1.0416666666666665e-11 4892 3850 2.0833333333333326e-11 4893 4893 6.6666666666666654e-10 4893 3726 -1.0416666666666666e-11 4893 3746 6.2499999999999991e-11 4893 3743 -4.1666666666666665e-11 4893 3788 -1.0416666666666666e-11 4893 4378 6.2499999999999991e-11 4893 4380 -4.1666666666666665e-11 4893 4126 -1.0416666666666666e-11 4893 5069 -8.3333333333333330e-11 4893 4894 -1.8175355256292112e-27 4893 4137 6.2499999999999991e-11 4893 4136 -4.1666666666666665e-11 4893 4730 8.3333333333333330e-11 4893 4729 1.8175355256292112e-27 4893 3733 -1.0416666666666666e-11 4893 1233 -1.0416666666666666e-11 4893 2066 8.3333333333333330e-11 4893 2067 1.8175355256292112e-27 4893 1242 6.2499999999999991e-11 4893 1243 -4.1666666666666665e-11 4893 2041 8.3333333333333330e-11 4893 2040 1.8175355256292112e-27 4893 1573 -1.0416666666666666e-11 4894 4894 2.4999999999999996e-10 4894 4890 9.5018296033870872e-28 4894 4378 1.0416666666666663e-11 4894 4380 2.0833333333333326e-11 4894 5069 2.0833333333333336e-11 4894 4893 -2.2913451068275814e-27 4894 4137 1.0416666666666666e-11 4894 4136 2.0833333333333326e-11 4895 4895 6.6666666666666652e-02 4895 4176 -1.0416666666666669e-03 4895 4899 -8.3333333333333315e-03 4895 4175 6.2500000000000003e-03 4895 3886 -1.0416666666666669e-03 4895 3795 -1.0416666666666669e-03 4895 4850 8.3333333333333315e-03 4895 4853 -1.3552527156068805e-20 4895 3890 -1.0416666666666667e-03 4895 3904 6.2500000000000003e-03 4895 3903 -4.1666666666666666e-03 4895 4540 8.3333333333333315e-03 4895 4539 -1.3552527156068805e-20 4895 3872 -1.0416666666666667e-03 4895 3876 6.2500000000000003e-03 4895 4898 -8.3333333333333315e-03 4895 4896 1.3552527156068805e-20 4895 3801 -1.0416666666666667e-03 4895 3799 6.2500000000000003e-03 4895 3800 -4.1666666666666666e-03 4895 2780 -1.0416666666666669e-03 4895 3626 1.3552527156068805e-20 4895 2997 -1.0416666666666667e-03 4895 2994 -4.1666666666666666e-03 4895 2772 -4.1666666666666666e-03 4896 4896 2.4999999999999998e-02 4896 4175 1.0416666666666664e-03 4896 3813 1.0416666666666664e-03 4896 4942 -2.0833333333333337e-03 4896 4176 6.2500000000000003e-03 4896 4898 2.0833333333333337e-03 4896 4895 -1.0254392617697373e-19 4896 3801 6.2500000000000003e-03 4896 3799 1.0416666666666664e-03 4896 3800 2.0833333333333329e-03 4896 3623 6.0159191589756597e-20 4896 2998 1.0416666666666662e-03 4896 2994 2.0833333333333329e-03 4897 4897 6.6666666666666652e-02 4897 3801 1.0416666666666669e-03 4897 4898 8.3333333333333315e-03 4897 4906 -1.3552527156068805e-20 4897 4176 1.0416666666666667e-03 4897 4175 -6.2500000000000003e-03 4897 4173 4.1666666666666666e-03 4897 4899 8.3333333333333315e-03 4897 4905 -1.3552527156068805e-20 4897 3890 1.0416666666666669e-03 4897 3872 1.0416666666666669e-03 4897 3876 -6.2500000000000003e-03 4897 3877 4.1666666666666666e-03 4897 4540 -8.3333333333333315e-03 4897 4541 1.3552527156068805e-20 4897 3886 1.0416666666666667e-03 4897 3904 -6.2500000000000003e-03 4897 3905 4.1666666666666666e-03 4897 4850 -8.3333333333333315e-03 4897 4849 1.3552527156068805e-20 4897 3795 1.0416666666666667e-03 4897 3799 -6.2500000000000003e-03 4897 3798 4.1666666666666666e-03 4897 2997 1.0416666666666669e-03 4897 2780 1.0416666666666667e-03 4898 4898 4.1666666666666664e-02 4898 3798 2.0833333333333329e-03 4898 4906 2.0833333333333337e-03 4898 4897 8.3333333333333315e-03 4898 4176 8.3333333333333315e-03 4898 4175 -2.0833333333333337e-03 4898 4173 2.0833333333333333e-03 4898 4896 2.0833333333333337e-03 4898 4895 -8.3333333333333315e-03 4898 3801 8.3333333333333315e-03 4898 3799 -2.0833333333333337e-03 4898 3800 2.0833333333333333e-03 4898 2994 2.0833333333333329e-03 4899 4899 4.1666666666666664e-02 4899 4895 -8.3333333333333315e-03 4899 4175 -2.0833333333333333e-03 4899 4173 2.0833333333333329e-03 4899 4905 2.0833333333333337e-03 4899 4897 8.3333333333333315e-03 4899 3876 -2.0833333333333333e-03 4899 3877 2.0833333333333333e-03 4899 2772 2.0833333333333329e-03 4899 3626 2.0833333333333337e-03 4899 2994 2.0833333333333333e-03 4899 2997 8.3333333333333315e-03 4899 2780 8.3333333333333315e-03 4900 4900 9.1666666666666646e-02 4900 3874 -1.0416666666666664e-03 4900 4570 -1.2197274440461925e-19 4900 4569 8.3333333333333315e-03 4900 3927 -1.0416666666666667e-03 4900 3931 -4.1666666666666675e-03 4900 3930 1.0416666666666666e-02 4900 4249 -3.1249999999999997e-03 4900 4904 1.2499999999999997e-02 4900 4912 -4.1666666666666657e-03 4900 4174 5.2083333333333330e-03 4900 4173 -4.1666666666666666e-03 4900 4169 1.0416666666666664e-02 4900 4905 1.8973538018496328e-19 4900 4907 -8.3333333333333315e-03 4900 3877 -4.1666666666666657e-03 4900 3878 6.2499999999999995e-03 4900 4901 1.2499999999999997e-02 4900 4908 -4.1666666666666657e-03 4900 4247 -1.6666666666666663e-02 4900 4246 2.0833333333333337e-03 4900 2997 -1.0416666666666664e-03 4900 2780 -1.0416666666666667e-03 4901 4901 5.8333333333333320e-02 4901 4881 -1.3552527156068805e-20 4901 4262 -4.1666666666666666e-03 4901 4903 1.3552527156068805e-20 4901 3931 -4.1666666666666666e-03 4901 3930 5.2083333333333330e-03 4901 4908 -2.0833333333333324e-03 4901 4900 1.2499999999999999e-02 4901 4247 -4.1666666666666675e-03 4901 4246 1.0416666666666667e-03 4902 4902 6.6666666666666652e-02 4902 3886 -1.0416666666666669e-03 4902 4259 -1.0416666666666669e-03 4902 4873 8.3333333333333315e-03 4902 4875 -2.7105054312137611e-20 4902 3901 -1.0416666666666667e-03 4902 3906 6.2500000000000003e-03 4902 3905 -4.1666666666666666e-03 4902 4542 8.3333333333333315e-03 4902 4541 -2.7105054312137611e-20 4902 3872 -1.0416666666666667e-03 4902 3874 -1.0416666666666669e-03 4902 3881 6.2500000000000003e-03 4902 3877 -4.1666666666666666e-03 4902 4572 8.3333333333333315e-03 4902 4570 -2.7105054312137611e-20 4902 3927 -1.0416666666666667e-03 4902 3934 6.2500000000000003e-03 4902 3931 -4.1666666666666666e-03 4902 4936 -8.3333333333333315e-03 4902 4903 2.7105054312137611e-20 4902 4263 6.2500000000000003e-03 4902 4262 -4.1666666666666666e-03 4903 4903 2.4999999999999998e-02 4903 3934 1.0416666666666664e-03 4903 4901 -1.0254392617697373e-19 4903 3931 2.0833333333333329e-03 4903 4936 2.0833333333333337e-03 4903 4902 6.0159191589756597e-20 4903 4263 1.0416666666666662e-03 4903 4262 2.0833333333333329e-03 4904 4904 5.8333333333333320e-02 4904 3809 -1.0416666666666669e-03 4904 4176 -1.0416666666666669e-03 4904 4916 -8.3333333333333315e-03 4904 4906 2.7105054312137611e-20 4904 3801 -1.0416666666666667e-03 4904 3812 6.2500000000000003e-03 4904 3798 -4.1666666666666666e-03 4904 4246 1.0416666666666664e-03 4904 4912 -2.0833333333333320e-03 4904 4900 1.2499999999999997e-02 4904 4174 1.0416666666666666e-02 4904 4173 -4.1666666666666675e-03 4904 4169 5.2083333333333330e-03 4904 4860 8.3333333333333315e-03 4904 4859 -2.7105054312137611e-20 4904 4243 -1.0416666666666667e-03 4904 4249 4.1666666666666666e-03 4904 4247 -4.1666666666666666e-03 4905 4905 2.4999999999999998e-02 4905 4175 1.0416666666666664e-03 4905 4899 2.0833333333333337e-03 4905 4897 1.0254392617697373e-19 4905 3876 1.0416666666666664e-03 4905 4173 2.0833333333333329e-03 4905 4169 1.0416666666666667e-03 4905 4907 2.0833333333333337e-03 4905 4900 4.7253188800459238e-19 4905 3877 2.0833333333333320e-03 4905 3878 1.0416666666666664e-03 4905 2997 6.2499999999999995e-03 4905 2780 6.2499999999999995e-03 4906 4906 2.4999999999999998e-02 4906 4174 1.0416666666666664e-03 4906 4916 2.0833333333333337e-03 4906 4904 6.0159191589756597e-20 4906 3812 1.0416666666666662e-03 4906 3801 6.2500000000000003e-03 4906 3799 1.0416666666666664e-03 4906 3798 2.0833333333333329e-03 4906 4898 2.0833333333333337e-03 4906 4897 1.0254392617697373e-19 4906 4176 6.2500000000000003e-03 4906 4175 1.0416666666666664e-03 4906 4173 2.0833333333333329e-03 4907 4907 4.1666666666666664e-02 4907 3879 -5.0116116045879435e-20 4907 4173 2.0833333333333329e-03 4907 4905 2.0833333333333333e-03 4907 4900 -8.3333333333333315e-03 4907 3877 2.0833333333333333e-03 4907 3878 -1.0416666666666671e-03 4907 4785 1.0416666666666668e-02 4907 4784 8.8991399020904929e-20 4907 4170 -2.1705219273391446e-19 4907 4169 -1.0416666666666667e-03 4907 2780 9.3750000000000014e-03 4907 2997 9.3750000000000014e-03 4908 4908 4.1666666666666657e-02 4908 4913 1.3552527156068805e-20 4908 4096 -6.2499999999999995e-03 4908 3931 -2.1684043449710089e-19 4908 3930 -1.0416666666666662e-03 4908 4909 -4.3368086899420177e-19 4908 4901 -2.0833333333333324e-03 4908 4900 -4.1666666666666666e-03 4908 4247 4.1666666666666666e-03 4908 4246 1.0416666666666654e-03 4909 4909 3.3333333333333326e-02 4909 4249 4.1666666666666657e-03 4909 4915 4.1666666666666675e-03 4909 4912 4.3368086899420177e-19 4909 4100 -2.1705219273391446e-19 4909 4096 6.2499999999999986e-03 4909 4908 -4.3368086899420177e-19 4909 4246 6.2499999999999986e-03 4910 4910 9.1666666666666646e-02 4910 4179 1.0416666666666664e-03 4910 3914 3.1249999999999997e-03 4910 4787 1.2499999999999997e-02 4910 4784 -4.1666666666666657e-03 4910 4170 -5.2083333333333330e-03 4910 4184 4.1666666666666666e-03 4910 4169 -1.0416666666666664e-02 4910 3920 -5.2083333333333330e-03 4910 5074 -1.8973538018496328e-19 4910 4913 8.3333333333333315e-03 4910 3923 4.1666666666666675e-03 4910 3930 -1.0416666666666666e-02 4910 4562 1.2499999999999999e-02 4910 4561 -4.1666666666666657e-03 4910 3913 3.1249999999999997e-03 4910 3918 1.6666666666666666e-02 4910 3919 -2.0833333333333337e-03 4910 4989 1.2197274440461925e-19 4910 4911 8.3333333333333315e-03 4910 4093 1.0416666666666667e-03 4910 4097 4.1666666666666657e-03 4910 4096 -6.2499999999999995e-03 4911 4911 4.1666666666666657e-02 4911 4184 2.0833333333333329e-03 4911 4100 5.0116116045879435e-20 4911 4917 1.0416666666666668e-02 4911 4912 1.5502688168223823e-19 4911 4179 9.3750000000000014e-03 4911 4174 -2.1705219273391446e-19 4911 4169 -1.0416666666666669e-03 4911 4989 -2.0833333333333333e-03 4911 4910 8.3333333333333315e-03 4911 4093 9.3750000000000014e-03 4911 4097 2.0833333333333329e-03 4911 4096 -1.0416666666666671e-03 4912 4912 4.1666666666666657e-02 4912 4093 -2.1684043449710089e-19 4912 4915 -8.3333333333333315e-03 4912 4909 4.3368086899420177e-19 4912 4100 1.0416666666666677e-03 4912 4096 -6.2499999999999995e-03 4912 4917 -2.3039296165316969e-19 4912 4911 8.1315162936412833e-20 4912 4179 -4.9904357809065860e-20 4912 4249 1.2499999999999999e-02 4912 4247 4.1666666666666657e-03 4912 4246 1.0416666666666671e-03 4912 4904 -2.0833333333333320e-03 4912 4900 -4.1666666666666666e-03 4912 4174 1.0416666666666669e-03 4912 4173 2.1158177161623045e-20 4912 4169 -1.0416666666666669e-03 4913 4913 4.1666666666666664e-02 4913 4908 -8.8991399020904929e-20 4913 4097 2.0833333333333329e-03 4913 4096 -1.0416666666666667e-03 4913 5074 2.0833333333333333e-03 4913 4910 8.3333333333333315e-03 4913 3923 2.0833333333333333e-03 4913 3930 -1.0416666666666671e-03 4914 4914 6.6666666666666664e-10 4914 3801 1.0416666666666666e-11 4914 4243 1.0416666666666666e-11 4914 4860 -8.3333333333333330e-11 4914 4861 1.6155871338926322e-27 4914 3809 1.0416666666666666e-11 4914 3812 -6.2499999999999991e-11 4914 3802 4.1666666666666665e-11 4914 4916 8.3333333333333330e-11 4914 4940 1.6155871338926322e-27 4914 4176 1.0416666666666666e-11 4914 4179 1.0416666666666666e-11 4914 4174 -6.2499999999999991e-11 4914 4177 4.1666666666666665e-11 4914 4917 8.3333333333333330e-11 4914 4984 -1.6155871338926322e-27 4914 4093 1.0416666666666666e-11 4914 4100 -6.2499999999999991e-11 4914 4094 4.1666666666666665e-11 4914 4915 8.3333333333333330e-11 4914 4978 -1.6155871338926322e-27 4914 4249 -6.2499999999999991e-11 4914 4250 4.1666666666666665e-11 4915 4915 2.5000000208333324e-02 4915 4246 1.0416666666666667e-03 4915 4909 4.1666666666666675e-03 4915 4912 -8.3333333333333315e-03 4915 4096 5.2083333333333330e-03 4915 4100 1.0416666562499993e-03 4915 4094 2.0833333333333332e-11 4915 4978 2.0833333333333339e-11 4915 4914 8.3333333333333330e-11 4915 4249 1.0416666562499998e-03 4915 4250 2.0833333333333332e-11 4916 4916 2.0833333541666669e-02 4916 3802 2.0833333333333332e-11 4916 4940 -2.0833333333333339e-11 4916 4914 8.3333333333333330e-11 4916 4177 2.0833333333333332e-11 4916 4176 4.1666667083333324e-03 4916 4174 -1.0416666770833331e-03 4916 4173 2.0833333333333333e-03 4916 4906 2.0833333333333337e-03 4916 4904 -8.3333333333333315e-03 4916 3801 4.1666667083333333e-03 4916 3812 -1.0416666770833337e-03 4916 3798 2.0833333333333329e-03 4917 4917 2.0833333541666662e-02 4917 4096 2.1705219273391446e-19 4917 4911 1.0416666666666666e-02 4917 4912 -2.6946235634527430e-19 4917 4169 -2.1705219273391446e-19 4917 4179 5.2083333750000006e-03 4917 4174 -1.0416667059107617e-11 4917 4177 2.0833333333333332e-11 4917 4984 2.0833333333333336e-11 4917 4914 8.3333333333333330e-11 4917 4093 5.2083333749999997e-03 4917 4100 -1.0416666859915915e-11 4917 4094 2.0833333333333332e-11 4918 4918 2.4999999999999991e-02 4919 4919 2.0833333333333332e-02 4920 4920 2.0833333333333329e-02 4921 4921 6.6666666666666652e-02 4921 4828 -2.7105054312137611e-20 4921 4231 -4.1666666666666666e-03 4921 4926 2.7105054312137611e-20 4921 4274 -4.1666666666666666e-03 4921 4928 2.7105054312137611e-20 4921 3940 -4.1666666666666666e-03 4921 4922 2.7105054312137611e-20 4921 3717 -4.1666666666666666e-03 4922 4922 2.4999999999999998e-02 4922 4923 -1.0254392617697373e-19 4922 3940 2.0833333333333329e-03 4922 4921 6.0159191589756597e-20 4922 3717 2.0833333333333329e-03 4923 4923 6.6666666666666652e-02 4923 4922 1.3552527156068805e-20 4923 3940 -4.1666666666666666e-03 4923 4583 -1.3552527156068805e-20 4923 3933 -4.1666666666666666e-03 4923 4929 1.3552527156068805e-20 4923 4265 -4.1666666666666666e-03 4923 4878 -1.3552527156068805e-20 4923 3717 -4.1666666666666666e-03 4924 4924 6.6666666666666652e-02 4924 3901 -1.0416666666666669e-03 4924 3872 -1.0416666666666669e-03 4924 4542 8.3333333333333315e-03 4924 4543 -2.7105054312137611e-20 4924 3886 -1.0416666666666667e-03 4924 3906 6.2500000000000003e-03 4924 3907 -4.1666666666666666e-03 4924 3927 -1.0416666666666669e-03 4924 4936 -8.3333333333333315e-03 4924 4929 2.7105054312137611e-20 4924 3934 6.2500000000000003e-03 4924 3933 -4.1666666666666666e-03 4924 4572 8.3333333333333315e-03 4924 4571 -2.7105054312137611e-20 4924 3874 -1.0416666666666667e-03 4924 3881 6.2500000000000003e-03 4924 3880 -4.1666666666666666e-03 4924 4873 8.3333333333333315e-03 4924 4872 -2.7105054312137611e-20 4924 4259 -1.0416666666666667e-03 4924 4263 6.2500000000000003e-03 4924 4265 -4.1666666666666666e-03 4925 4925 6.6666666666666652e-02 4925 4932 8.3333333333333315e-03 4925 4927 1.3552527156068805e-20 4925 4278 6.2500000000000003e-03 4925 4274 -4.1666666666666666e-03 4925 3886 -1.0416666666666669e-03 4925 4228 -1.0416666666666669e-03 4925 4867 8.3333333333333315e-03 4925 4869 -1.3552527156068805e-20 4925 3898 -1.0416666666666667e-03 4925 3908 6.2500000000000003e-03 4925 3907 -4.1666666666666666e-03 4925 4544 8.3333333333333315e-03 4925 4543 -1.3552527156068805e-20 4925 3872 -1.0416666666666667e-03 4925 3882 6.2500000000000003e-03 4925 3880 -4.1666666666666666e-03 4925 4938 -8.3333333333333315e-03 4925 4926 1.3552527156068805e-20 4925 4230 6.2500000000000003e-03 4925 4231 -4.1666666666666666e-03 4925 2769 -1.0416666666666669e-03 4925 2784 -1.0416666666666667e-03 4926 4926 2.4999999999999998e-02 4926 4278 1.0416666666666664e-03 4926 4921 6.0159191589756597e-20 4926 4274 2.0833333333333329e-03 4926 4938 2.0833333333333337e-03 4926 4925 -1.0254392617697373e-19 4926 4230 1.0416666666666664e-03 4926 4231 2.0833333333333329e-03 4927 4927 2.5000000000000001e-02 4927 3882 1.0416666666666664e-03 4927 4932 -2.0833333333333337e-03 4927 4925 -1.0254392617697373e-19 4927 4278 1.0416666666666664e-03 4927 4275 1.0416666666666664e-03 4927 4274 2.0833333333333329e-03 4927 4582 2.0833333333333337e-03 4927 4580 -6.0159191589756597e-20 4927 3875 1.0416666666666664e-03 4927 3880 2.0833333333333329e-03 4927 2784 6.2500000000000003e-03 4927 2769 6.2500000000000003e-03 4928 4928 2.4999999999999998e-02 4928 4921 6.0159191589756597e-20 4928 3938 1.0416666666666664e-03 4928 3940 2.0833333333333329e-03 4928 4579 2.0833333333333337e-03 4928 4580 1.0254392617697373e-19 4928 4275 1.0416666666666664e-03 4928 4274 2.0833333333333329e-03 4929 4929 2.4999999999999998e-02 4929 4923 -1.0254392617697373e-19 4929 4263 1.0416666666666664e-03 4929 4265 2.0833333333333329e-03 4929 4936 2.0833333333333337e-03 4929 4924 6.0159191589756597e-20 4929 3934 1.0416666666666662e-03 4929 3933 2.0833333333333329e-03 4930 4930 2.0833333333333332e-02 4931 4931 2.0833333333333332e-02 4932 4932 4.1666666666666664e-02 4932 3880 -2.0833333333333329e-03 4932 4927 -2.0833333333333337e-03 4932 4925 8.3333333333333315e-03 4932 4274 -2.0833333333333333e-03 4932 4278 2.0833333333333333e-03 4932 4528 8.3333333333333315e-03 4932 3882 2.0833333333333333e-03 4932 2784 -8.3333333333333315e-03 4932 2790 -2.0833333333333329e-03 4932 3352 -2.0833333333333337e-03 4932 2769 -8.3333333333333315e-03 4932 2774 -2.0833333333333333e-03 4933 4933 2.0833333333333332e-02 4934 4934 2.0833333333333332e-02 4935 4935 2.0833333333333332e-02 4936 4936 4.1666666666666664e-02 4936 3931 2.0833333333333333e-03 4936 4265 2.0833333333333333e-03 4936 4929 2.0833333333333337e-03 4936 4924 -8.3333333333333315e-03 4936 3934 -2.0833333333333337e-03 4936 3933 2.0833333333333329e-03 4936 4903 2.0833333333333337e-03 4936 4902 -8.3333333333333315e-03 4936 4263 -2.0833333333333337e-03 4936 4262 2.0833333333333329e-03 4937 4937 2.0833333333333332e-02 4938 4938 4.1666666666666664e-02 4938 4274 2.0833333333333329e-03 4938 4229 2.0833333333333329e-03 4938 4533 2.0833333333333337e-03 4938 4528 -8.3333333333333315e-03 4938 4278 -2.0833333333333337e-03 4938 4926 2.0833333333333337e-03 4938 4925 -8.3333333333333315e-03 4938 4230 -2.0833333333333337e-03 4938 4231 2.0833333333333333e-03 4938 2790 2.0833333333333333e-03 4939 4939 2.0833333333333332e-02 4940 4940 2.4999999999999996e-10 4940 4183 -1.0416666666666666e-11 4940 3812 -1.0416666666666665e-11 4940 4916 -2.0833333333333336e-11 4940 4914 9.5018296033870872e-28 4940 4176 -6.2500000000000004e-11 4940 4174 -1.0416666666666665e-11 4940 4177 -2.0833333333333326e-11 4940 4941 2.0833333333333339e-11 4940 4981 2.2913451068275814e-27 4940 3801 -6.2499999999999991e-11 4940 3803 -1.0416666666666666e-11 4940 3802 -2.0833333333333326e-11 4941 4941 4.1666666666666662e-10 4941 4177 -2.0833333333333329e-11 4941 3804 -2.0833333333333329e-11 4941 4943 2.0833333333333339e-11 4941 5002 8.3333333333333330e-11 4941 4176 -8.3333333333333330e-11 4941 4183 2.0833333333333339e-11 4941 4940 2.0833333333333339e-11 4941 4981 8.3333333333333330e-11 4941 3801 -8.3333333333333330e-11 4941 3803 2.0833333333333339e-11 4941 3802 -2.0833333333333332e-11 4941 3001 -2.0833333333333332e-11 4942 4942 2.0833333541666669e-02 4942 4943 2.0833333333333339e-11 4942 3804 -2.0833333333333332e-11 4942 3801 -4.1666667083333324e-03 4942 3813 1.0416666770833331e-03 4942 3800 -2.0833333333333333e-03 4942 4896 -2.0833333333333337e-03 4942 4176 -4.1666667083333333e-03 4942 3001 -2.0833333333333332e-11 4942 3661 8.3333333333333330e-11 4942 3623 8.3333333333333315e-03 4942 2998 1.0416666770833337e-03 4942 2994 -2.0833333333333329e-03 4943 4943 2.4999999999999996e-10 4943 4942 2.0833333333333336e-11 4943 3813 -1.0416666666666665e-11 4943 3801 -6.2500000000000004e-11 4943 3803 -1.0416666666666666e-11 4943 3804 -2.0833333333333326e-11 4943 4941 2.0833333333333339e-11 4943 5002 2.2913451068275814e-27 4943 4176 -6.2499999999999991e-11 4943 4183 -1.0416666666666666e-11 4943 2998 -1.0416666666666665e-11 4943 3661 -9.5018296033870872e-28 4943 3001 -2.0833333333333326e-11 4944 4944 5.8333333333333320e-02 4944 4288 5.2083333333333322e-03 4944 4960 -2.0833333333333329e-03 4944 4946 1.2499999999999999e-02 4944 4285 1.0416666666666667e-03 4944 4287 -4.1666666666666657e-03 4944 4954 1.3552527156068805e-20 4944 4290 -4.1666666666666666e-03 4944 4945 1.3552527156068805e-20 4944 4280 -4.1666666666666675e-03 4945 4945 2.4999999999999998e-02 4945 4948 6.0159191589756597e-20 4945 4290 2.0833333333333329e-03 4945 4944 -1.0254392617697373e-19 4945 4280 2.0833333333333329e-03 4946 4946 9.1666666666666646e-02 4946 4018 -1.0416666666666669e-03 4946 4654 -8.3333333333333315e-03 4946 4653 -2.7105054312137611e-20 4946 3962 -1.0416666666666667e-03 4946 3964 6.2500000000000003e-03 4946 3963 -4.1666666666666666e-03 4946 4960 -4.1666666666666666e-03 4946 4944 1.2499999999999999e-02 4946 4285 2.0833333333333342e-03 4946 4280 -1.6666666666666666e-02 4946 4962 -4.1666666666666657e-03 4946 4955 1.2499999999999997e-02 4946 4021 1.0416666666666666e-02 4946 4020 -4.1666666666666675e-03 4946 4958 -8.3333333333333315e-03 4946 4947 2.7105054312137611e-20 4946 4288 1.0416666666666666e-02 4946 4287 -4.1666666666666666e-03 4946 1648 -1.0416666666666669e-03 4946 1251 -1.0416666666666667e-03 4947 4947 2.4999999999999998e-02 4947 3964 1.0416666666666664e-03 4947 4950 -1.0254392617697373e-19 4947 3963 2.0833333333333329e-03 4947 4958 2.0833333333333337e-03 4947 4946 6.0159191589756597e-20 4947 4288 1.0416666666666664e-03 4947 4287 2.0833333333333329e-03 4947 2844 1.0416666666666664e-03 4947 3395 2.0833333333333337e-03 4947 1648 6.2500000000000003e-03 4947 2827 1.0416666666666664e-03 4947 1251 6.2500000000000003e-03 4948 4948 6.6666666666666652e-02 4948 4945 2.7105054312137611e-20 4948 4290 -4.1666666666666666e-03 4948 4951 2.7105054312137611e-20 4948 3994 -4.1666666666666666e-03 4948 4956 2.7105054312137611e-20 4948 4297 -4.1666666666666666e-03 4948 4949 2.7105054312137611e-20 4948 4280 -4.1666666666666666e-03 4949 4949 2.4999999999999998e-02 4949 4955 -1.0254392617697373e-19 4949 4297 2.0833333333333329e-03 4949 4948 6.0159191589756597e-20 4949 4280 2.0833333333333329e-03 4950 4950 6.6666666666666652e-02 4950 4640 -2.7105054312137611e-20 4950 3994 -4.1666666666666666e-03 4950 4954 2.7105054312137611e-20 4950 4287 -4.1666666666666666e-03 4950 4947 1.3552527156068805e-20 4950 3963 -4.1666666666666666e-03 4950 4951 1.3552527156068805e-20 4950 4290 -4.1666666666666666e-03 4950 2831 -1.0416666666666669e-03 4950 3686 -8.3333333333333315e-03 4950 3014 -1.0416666666666667e-03 4950 3018 6.2500000000000003e-03 4950 1251 -1.0416666666666669e-03 4950 3685 -8.3333333333333315e-03 4950 2844 6.2500000000000003e-03 4950 3395 -8.3333333333333315e-03 4950 1648 -1.0416666666666667e-03 4950 2827 6.2500000000000003e-03 4950 3687 -8.3333333333333315e-03 4950 3005 6.2500000000000003e-03 4951 4951 2.4999999999999998e-02 4951 4948 6.0159191589756597e-20 4951 3994 2.0833333333333329e-03 4951 4950 -1.0254392617697373e-19 4951 4290 2.0833333333333329e-03 4951 3018 1.0416666666666664e-03 4951 3687 2.0833333333333337e-03 4951 3005 1.0416666666666664e-03 4952 4952 6.6666666666666652e-02 4952 3962 -1.0416666666666669e-03 4952 4655 8.3333333333333315e-03 4952 4653 -1.3552527156068805e-20 4952 4018 -1.0416666666666667e-03 4952 4024 6.2500000000000003e-03 4952 4020 -4.1666666666666666e-03 4952 4971 -8.3333333333333315e-03 4952 4956 1.3552527156068805e-20 4952 3995 6.2500000000000003e-03 4952 3994 -4.1666666666666666e-03 4952 4641 8.3333333333333315e-03 4952 4640 -1.3552527156068805e-20 4952 3965 6.2500000000000003e-03 4952 3963 -4.1666666666666666e-03 4952 4972 -8.3333333333333315e-03 4952 4953 1.3552527156068805e-20 4952 4295 6.2500000000000003e-03 4952 4297 -4.1666666666666666e-03 4952 3014 -1.0416666666666669e-03 4952 2831 -1.0416666666666667e-03 4953 4953 2.4999999999999998e-02 4953 4024 1.0416666666666664e-03 4953 4955 6.0159191589756597e-20 4953 4020 2.0833333333333329e-03 4953 4972 2.0833333333333337e-03 4953 4952 -1.0254392617697373e-19 4953 4295 1.0416666666666664e-03 4953 4297 2.0833333333333329e-03 4954 4954 2.5000000000000001e-02 4954 4944 -1.0254392617697373e-19 4954 4290 2.0833333333333329e-03 4954 4950 6.0159191589756597e-20 4954 4287 2.0833333333333329e-03 4954 3005 1.0416666666666664e-03 4954 3685 2.0833333333333337e-03 4954 2844 1.0416666666666664e-03 4955 4955 5.8333333333333320e-02 4955 4949 1.3552527156068805e-20 4955 4297 -4.1666666666666666e-03 4955 4953 2.7105054312137611e-20 4955 4285 1.0416666666666664e-03 4955 4280 -4.1666666666666657e-03 4955 4962 -2.0833333333333329e-03 4955 4946 1.2499999999999997e-02 4955 4021 5.2083333333333330e-03 4955 4020 -4.1666666666666675e-03 4956 4956 2.4999999999999998e-02 4956 4948 6.0159191589756597e-20 4956 4295 1.0416666666666664e-03 4956 4297 2.0833333333333329e-03 4956 4971 2.0833333333333337e-03 4956 4952 -1.0254392617697373e-19 4956 3995 1.0416666666666664e-03 4956 3994 2.0833333333333329e-03 4957 4957 2.0833333333333332e-02 4958 4958 4.5833333333333323e-02 4958 4288 -6.5052130349130266e-19 4958 3964 -2.1684043449710089e-19 4958 3963 2.0833333333333333e-03 4958 4947 2.0833333333333333e-03 4958 4946 -8.3333333333333315e-03 4958 4287 2.0833333333333329e-03 4958 1251 7.2916666666666659e-03 4958 1250 1.0416666666666667e-03 4958 2137 4.1666666666666666e-03 4958 1793 8.3333333333333315e-03 4958 1648 1.3541666666666665e-02 4958 1647 5.2083333333333330e-03 4959 4959 2.0833333333333332e-02 4960 4960 4.1666666666666657e-02 4960 4285 1.0416666666666660e-03 4960 4288 -1.0416666666666667e-03 4960 4287 -2.7052114752934217e-20 4960 4944 -2.0833333333333329e-03 4960 4946 -4.1666666666666666e-03 4960 4280 4.1666666666666666e-03 4960 1794 4.3368086899420177e-19 4960 1259 -6.2499999999999986e-03 4960 1788 2.7105054312137611e-20 4961 4961 2.0833333333333332e-02 4962 4962 4.1666666666666657e-02 4962 4021 -1.0416666666666667e-03 4962 4285 1.0416666666666662e-03 4962 4280 4.1666666666666666e-03 4962 4955 -2.0833333333333329e-03 4962 4946 -4.1666666666666666e-03 4962 4020 -2.0761130467597592e-20 4962 1792 2.1684043449710089e-19 4962 1259 -6.2499999999999986e-03 4963 4963 2.0833333333333332e-02 4964 4964 2.0833333333333332e-02 4965 4965 2.4999999999999998e-02 4965 4009 1.0416666666666664e-03 4965 4001 2.0833333333333329e-03 4965 4524 2.0833333333333337e-03 4965 4523 1.0254392617697373e-19 4965 3832 1.0416666666666664e-03 4965 3691 6.0159191589756597e-20 4965 2913 2.0833333333333329e-03 4966 4966 2.5000000000000001e-02 4966 3841 1.0416666666666664e-03 4966 4525 2.0833333333333337e-03 4966 4523 1.0254392617697373e-19 4966 4009 1.0416666666666664e-03 4966 4000 6.2500000000000003e-03 4966 3999 1.0416666666666664e-03 4966 4001 2.0833333333333329e-03 4966 4633 2.0833333333333337e-03 4966 4634 -6.0159191589756597e-20 4966 3855 6.2500000000000003e-03 4966 3854 1.0416666666666664e-03 4966 3853 2.0833333333333329e-03 4967 4967 4.1666666666666662e-10 4967 3837 -2.0833333333333329e-11 4967 4003 -2.0833333333333329e-11 4967 4748 -2.0833333333333339e-11 4967 4738 8.3333333333333330e-11 4967 3855 -8.3333333333333330e-11 4967 3862 2.0833333333333336e-11 4967 3861 -2.0833333333333332e-11 4967 4501 -2.0833333333333339e-11 4967 4500 8.3333333333333330e-11 4967 4000 -8.3333333333333330e-11 4967 4004 2.0833333333333336e-11 4967 4006 -2.0833333333333332e-11 4968 4968 2.0833333541666669e-02 4968 3861 -2.0833333333333329e-11 4968 4748 -2.0833333333333339e-11 4968 4742 8.3333333333333330e-11 4968 4003 -2.0833333333333332e-11 4968 4000 -4.1666667083333324e-03 4968 4011 1.0416666770833331e-03 4968 3998 -2.0833333333333329e-03 4968 4621 -2.0833333333333337e-03 4968 4618 8.3333333333333315e-03 4968 3855 -4.1666667083333333e-03 4968 3859 1.0416666770833335e-03 4968 3856 -2.0833333333333333e-03 4969 4969 2.0833333333333332e-02 4970 4970 2.0833333541666669e-02 4970 4032 -2.0833333333333329e-11 4970 4744 -2.0833333333333339e-11 4970 4742 8.3333333333333330e-11 4970 3861 -2.0833333333333332e-11 4970 3858 -4.1666667083333324e-03 4970 3859 1.0416666770833333e-03 4970 3856 -2.0833333333333329e-03 4970 4630 -2.0833333333333337e-03 4970 4618 8.3333333333333315e-03 4970 4029 -4.1666667083333333e-03 4970 4040 1.0416666770833337e-03 4970 4030 -2.0833333333333333e-03 4971 4971 4.1666666666666664e-02 4971 3990 2.0833333333333329e-03 4971 4297 2.0833333333333329e-03 4971 4956 2.0833333333333337e-03 4971 4952 -8.3333333333333315e-03 4971 3995 -2.0833333333333337e-03 4971 3994 2.0833333333333333e-03 4971 4623 2.0833333333333337e-03 4971 4622 -8.3333333333333315e-03 4971 4295 -2.0833333333333337e-03 4971 4294 2.0833333333333333e-03 4972 4972 4.1666666666666664e-02 4972 4020 2.0833333333333329e-03 4972 4294 2.0833333333333329e-03 4972 4632 2.0833333333333337e-03 4972 4622 -8.3333333333333315e-03 4972 4024 -2.0833333333333333e-03 4972 4023 2.0833333333333333e-03 4972 4953 2.0833333333333337e-03 4972 4952 -8.3333333333333315e-03 4972 4295 -2.0833333333333333e-03 4972 4297 2.0833333333333333e-03 4973 4973 2.0833333333333332e-02 4974 4974 2.0833333333333332e-02 4975 4975 2.0833333333333332e-02 4976 4976 2.0833333333333332e-02 4977 4977 2.0833333333333332e-02 4978 4978 2.4999999999999996e-10 4978 4979 -2.2913451068275814e-27 4978 4100 1.0416666666666665e-11 4978 4094 2.0833333333333326e-11 4978 4915 2.0833333333333336e-11 4978 4914 -9.5018296033870872e-28 4978 4249 1.0416666666666665e-11 4978 4250 2.0833333333333326e-11 4979 4979 6.6666666666666664e-10 4979 4978 -1.8175355256292112e-27 4979 4094 -4.1666666666666665e-11 4979 4682 1.8175355256292112e-27 4979 4083 -4.1666666666666665e-11 4979 4986 -1.8175355256292112e-27 4979 4308 -4.1666666666666665e-11 4979 4980 -1.8175355256292112e-27 4979 4250 -4.1666666666666665e-11 4980 4980 2.4999999999999996e-10 4980 4254 1.0416666666666663e-11 4980 4250 2.0833333333333326e-11 4980 4982 9.5018296033870872e-28 4980 4308 2.0833333333333326e-11 4980 4979 -2.2913451068275814e-27 4980 2323 2.0833333333333336e-11 4980 1530 1.0416666666666666e-11 4981 4981 6.6666666666666664e-10 4981 4316 -1.0416666666666666e-11 4981 3805 -1.0416666666666666e-11 4981 5006 -8.3333333333333330e-11 4981 4988 -1.8175355256292112e-27 4981 4315 -1.0416666666666666e-11 4981 4314 6.2499999999999991e-11 4981 4313 -4.1666666666666665e-11 4981 5007 -8.3333333333333330e-11 4981 4987 -1.8175355256292112e-27 4981 4068 -1.0416666666666666e-11 4981 4176 -1.0416666666666666e-11 4981 4067 6.2499999999999991e-11 4981 4064 -4.1666666666666665e-11 4981 4992 8.3333333333333330e-11 4981 4983 -1.8175355256292112e-27 4981 4183 6.2499999999999991e-11 4981 4177 -4.1666666666666665e-11 4981 4941 8.3333333333333330e-11 4981 4940 1.8175355256292112e-27 4981 3801 -1.0416666666666666e-11 4981 3803 6.2499999999999991e-11 4981 3802 -4.1666666666666665e-11 4981 3022 -1.0416666666666666e-11 4981 3003 -1.0416666666666666e-11 4982 4982 6.6666666666666654e-10 4982 4254 6.2499999999999991e-11 4982 4250 -4.1666666666666665e-11 4982 4980 1.6155871338926322e-27 4982 4308 -4.1666666666666665e-11 4982 4317 6.2499999999999991e-11 4982 4313 -4.1666666666666665e-11 4982 3809 -1.0416666666666666e-11 4982 4315 -1.0416666666666666e-11 4982 5008 -8.3333333333333330e-11 4982 4988 1.6155871338926322e-27 4982 3805 -1.0416666666666666e-11 4982 3814 6.2499999999999991e-11 4982 3802 -4.1666666666666665e-11 4982 4862 -8.3333333333333330e-11 4982 4861 1.8175355256292112e-27 4982 4243 -1.0416666666666666e-11 4982 1525 -1.0416666666666666e-11 4982 2323 -8.3333333333333330e-11 4982 1530 6.2499999999999991e-11 4982 1990 8.3333333333333330e-11 4982 1989 1.8175355256292112e-27 4982 1213 -1.0416666666666666e-11 4983 4983 2.4999999999999996e-10 4983 4067 1.0416666666666663e-11 4983 4992 -2.0833333333333336e-11 4983 4981 -2.2913451068275814e-27 4983 4183 1.0416666666666666e-11 4983 4178 1.0416666666666663e-11 4983 4177 2.0833333333333326e-11 4983 4681 2.0833333333333336e-11 4983 4678 -9.5018296033870872e-28 4983 4058 1.0416666666666666e-11 4983 4064 2.0833333333333326e-11 4983 3003 6.2500000000000004e-11 4983 3022 6.2500000000000004e-11 4984 4984 2.4999999999999996e-10 4984 4174 1.0416666666666665e-11 4984 4917 2.0833333333333332e-11 4984 4914 -9.5018296033870872e-28 4984 4100 1.0416666666666665e-11 4984 4093 6.2499999999999991e-11 4984 4092 1.0416666666666666e-11 4984 4094 2.0833333333333326e-11 4984 4677 2.0833333333333339e-11 4984 4678 2.2913451068275814e-27 4984 4179 6.2499999999999991e-11 4984 4178 1.0416666666666666e-11 4984 4177 2.0833333333333326e-11 4985 4985 6.6666666666666654e-10 4985 4068 -1.0416666666666666e-11 4985 4066 6.2499999999999991e-11 4985 4064 -4.1666666666666665e-11 4985 4987 1.6155871338926322e-27 4985 4316 -1.0416666666666666e-11 4985 4313 -4.1666666666666665e-11 4985 4306 6.2499999999999991e-11 4985 4308 -4.1666666666666665e-11 4985 4077 -1.0416666666666666e-11 4985 4999 -8.3333333333333330e-11 4985 4986 1.6155871338926322e-27 4985 4084 6.2499999999999991e-11 4985 4083 -4.1666666666666665e-11 4985 4688 8.3333333333333330e-11 4985 4687 -1.6155871338926322e-27 4985 4059 -1.0416666666666666e-11 4985 1213 -1.0416666666666666e-11 4985 1986 -8.3333333333333330e-11 4985 1218 6.2499999999999991e-11 4985 1985 -8.3333333333333330e-11 4985 1989 -1.6155871338926322e-27 4985 1525 -1.0416666666666666e-11 4986 4986 2.4999999999999996e-10 4986 4979 -2.2913451068275814e-27 4986 4306 1.0416666666666665e-11 4986 4308 2.0833333333333326e-11 4986 4999 2.0833333333333336e-11 4986 4985 9.5018296033870872e-28 4986 4084 1.0416666666666665e-11 4986 4083 2.0833333333333326e-11 4987 4987 2.4999999999999996e-10 4987 4068 6.2499999999999991e-11 4987 4066 1.0416666666666665e-11 4987 4064 2.0833333333333326e-11 4987 4985 9.5018296033870872e-28 4987 4316 6.2500000000000004e-11 4987 4313 2.0833333333333326e-11 4987 4314 1.0416666666666666e-11 4987 5007 2.0833333333333339e-11 4987 4981 -2.2913451068275814e-27 4987 4067 1.0416666666666666e-11 4987 1986 2.0833333333333336e-11 4987 1218 1.0416666666666665e-11 4988 4988 2.4999999999999996e-10 4988 4317 1.0416666666666663e-11 4988 5008 2.0833333333333336e-11 4988 4982 9.5018296033870872e-28 4988 3814 1.0416666666666666e-11 4988 3805 6.2500000000000004e-11 4988 3803 1.0416666666666663e-11 4988 3802 2.0833333333333326e-11 4988 5006 2.0833333333333336e-11 4988 4981 -2.2913451068275814e-27 4988 4315 6.2500000000000004e-11 4988 4314 1.0416666666666666e-11 4988 4313 2.0833333333333326e-11 4989 4989 2.4999999999999998e-02 4989 4169 -1.0416666666666667e-03 4989 4179 -6.2499999999999995e-03 4989 4171 -1.0416666666666664e-03 4989 4184 -2.0833333333333329e-03 4989 4990 2.0833333333333337e-03 4989 4996 6.0159191589756597e-20 4989 4102 -1.0416666666666664e-03 4989 4911 -2.0833333333333337e-03 4989 4910 -5.1510191104902139e-20 4989 4093 -6.2499999999999995e-03 4989 4097 -2.0833333333333329e-03 4989 4096 -1.0416666666666664e-03 4990 4990 2.0833333541666665e-02 4990 4184 -2.0833333333333333e-03 4990 4989 2.0833333333333333e-03 4990 4996 -8.3333333333333315e-03 4990 4097 -2.0833333333333329e-03 4990 4093 -4.1666667083333333e-03 4990 4102 1.0416666770833337e-03 4990 4091 -2.0833333333333332e-11 4990 4664 -2.0833333333333336e-11 4990 4661 8.3333333333333330e-11 4990 4179 -4.1666667083333324e-03 4990 4171 1.0416666770833331e-03 4990 4180 -2.0833333333333332e-11 4991 4991 4.1666666666666662e-10 4991 4767 -2.0833333333333339e-11 4991 4761 8.3333333333333330e-11 4991 4182 -2.0833333333333332e-11 4991 4181 2.0833333333333332e-11 4991 4180 -2.0833333333333329e-11 4991 4673 -2.0833333333333339e-11 4991 4667 8.3333333333333330e-11 4991 4065 2.0833333333333332e-11 4991 4057 -2.0833333333333332e-11 4991 3021 -2.0833333333333329e-11 4991 3003 -8.3333333333333330e-11 4991 3022 -8.3333333333333330e-11 4992 4992 4.1666666666666662e-10 4992 4064 -2.0833333333333329e-11 4992 4983 -2.0833333333333339e-11 4992 4981 8.3333333333333330e-11 4992 4177 -2.0833333333333332e-11 4992 4183 2.0833333333333332e-11 4992 5002 8.3333333333333330e-11 4992 4067 2.0833333333333332e-11 4992 3003 -8.3333333333333330e-11 4992 3001 -2.0833333333333329e-11 4992 3700 -2.0833333333333339e-11 4992 3022 -8.3333333333333330e-11 4992 442 -2.0833333333333332e-11 4993 4993 2.0833333333333331e-10 4994 4994 4.1666666666666662e-10 4994 4162 2.0833333333333329e-11 4994 4185 2.0833333333333329e-11 4994 4769 2.0833333333333339e-11 4994 4761 -8.3333333333333330e-11 4994 4160 -2.0833333333333332e-11 4994 4158 2.0833333333333332e-11 4994 4668 2.0833333333333339e-11 4994 4667 -8.3333333333333330e-11 4994 4186 -2.0833333333333332e-11 4994 4188 2.0833333333333332e-11 4995 4995 2.5000000208333324e-02 4995 4056 1.0416666666666667e-03 4995 4793 4.1666666666666675e-03 4995 4191 5.2083333333333330e-03 4995 4789 -8.3333333333333332e-03 4995 4195 1.0416666562500002e-03 4995 4188 2.0833333333333332e-11 4995 4662 2.0833333333333336e-11 4995 4661 -8.3333333333333330e-11 4995 4047 1.0416666562499998e-03 4995 4044 2.0833333333333332e-11 4996 4996 5.8333333333333320e-02 4996 4170 -5.2083333333333322e-03 4996 4789 2.0833333333333329e-03 4996 4787 1.2499999999999999e-02 4996 4056 -1.0416666666666667e-03 4996 4179 1.0416666666666669e-03 4996 4171 -1.0416666666666666e-02 4996 4184 4.1666666666666666e-03 4996 4990 -8.3333333333333315e-03 4996 4989 2.7105054312137611e-20 4996 4093 1.0416666666666667e-03 4996 4102 -6.2500000000000003e-03 4996 4097 4.1666666666666666e-03 4996 4694 -8.3333333333333315e-03 4996 4695 2.7105054312137611e-20 4996 4047 -4.1666666666666675e-03 4996 4055 4.1666666666666675e-03 4997 4997 2.0833333333333331e-10 4998 4998 2.4999999999999991e-02 4999 4999 4.1666666666666662e-10 4999 4079 2.0833333333333332e-11 4999 4308 2.0833333333333332e-11 4999 4986 2.0833333333333339e-11 4999 4985 -8.3333333333333330e-11 4999 4084 -2.0833333333333336e-11 4999 4083 2.0833333333333332e-11 4999 4700 2.0833333333333339e-11 4999 4699 -8.3333333333333330e-11 4999 4306 -2.0833333333333336e-11 4999 4305 2.0833333333333332e-11 5000 5000 2.0833333333333331e-10 5001 5001 2.0833333333333331e-10 5002 5002 6.6666666666666664e-10 5002 4315 -1.0416666666666666e-11 5002 4068 -1.0416666666666666e-11 5002 5007 -8.3333333333333330e-11 5002 5005 -1.8175355256292112e-27 5002 4316 -1.0416666666666666e-11 5002 4314 6.2499999999999991e-11 5002 4318 -4.1666666666666665e-11 5002 3801 -1.0416666666666666e-11 5002 4941 8.3333333333333330e-11 5002 4943 1.8175355256292112e-27 5002 4176 -1.0416666666666666e-11 5002 4183 6.2499999999999991e-11 5002 4992 8.3333333333333330e-11 5002 4067 6.2499999999999991e-11 5002 5006 -8.3333333333333330e-11 5002 5003 -1.8175355256292112e-27 5002 3805 -1.0416666666666666e-11 5002 3803 6.2499999999999991e-11 5002 3804 -4.1666666666666665e-11 5002 3003 -1.0416666666666666e-11 5002 3001 -4.1666666666666665e-11 5002 3700 -1.8175355256292112e-27 5002 3022 -1.0416666666666666e-11 5002 442 -4.1666666666666665e-11 5003 5003 2.4999999999999996e-10 5003 4314 1.0416666666666663e-11 5003 3815 1.0416666666666663e-11 5003 5009 -2.0833333333333336e-11 5003 5004 9.5018296033870872e-28 5003 4315 6.2500000000000004e-11 5003 4319 1.0416666666666666e-11 5003 4318 2.0833333333333326e-11 5003 5006 2.0833333333333336e-11 5003 5002 -2.2913451068275814e-27 5003 3805 6.2500000000000004e-11 5003 3803 1.0416666666666666e-11 5003 3804 2.0833333333333326e-11 5004 5004 6.6666666666666654e-10 5004 4319 6.2499999999999991e-11 5004 4318 -4.1666666666666665e-11 5004 3781 6.2499999999999991e-11 5004 3805 -1.0416666666666666e-11 5004 3777 -1.0416666666666666e-11 5004 4467 8.3333333333333330e-11 5004 4465 1.8175355256292112e-27 5004 3807 -1.0416666666666666e-11 5004 3815 6.2499999999999991e-11 5004 3804 -4.1666666666666665e-11 5004 5009 8.3333333333333330e-11 5004 5003 1.6155871338926322e-27 5004 4315 -1.0416666666666666e-11 5004 1619 -1.0416666666666666e-11 5004 1223 -1.0416666666666666e-11 5004 1786 -8.3333333333333330e-11 5004 1075 -1.8175355256292112e-27 5004 1612 -1.0416666666666666e-11 5004 1618 6.2499999999999991e-11 5004 228 -4.1666666666666665e-11 5004 1787 -8.3333333333333330e-11 5004 947 -1.6155871338926322e-27 5004 1208 -1.0416666666666666e-11 5004 290 -4.1666666666666665e-11 5005 5005 2.4999999999999996e-10 5005 4316 6.2499999999999991e-11 5005 4318 2.0833333333333326e-11 5005 4068 6.2500000000000004e-11 5005 4067 1.0416666666666666e-11 5005 5007 2.0833333333333339e-11 5005 5002 -2.2913451068275814e-27 5005 4314 1.0416666666666666e-11 5005 1228 1.0416666666666665e-11 5005 1993 2.0833333333333336e-11 5005 816 -9.5018296033870872e-28 5005 1524 1.0416666666666665e-11 5005 442 2.0833333333333326e-11 5006 5006 4.1666666666666662e-10 5006 4318 2.0833333333333329e-11 5006 3802 2.0833333333333329e-11 5006 4988 2.0833333333333339e-11 5006 4981 -8.3333333333333330e-11 5006 4315 8.3333333333333330e-11 5006 4314 -2.0833333333333332e-11 5006 4313 2.0833333333333332e-11 5006 5003 2.0833333333333339e-11 5006 5002 -8.3333333333333330e-11 5006 3805 8.3333333333333330e-11 5006 3803 -2.0833333333333332e-11 5006 3804 2.0833333333333332e-11 5007 5007 4.1666666666666662e-10 5007 5005 2.0833333333333339e-11 5007 5002 -8.3333333333333330e-11 5007 4318 2.0833333333333332e-11 5007 4316 8.3333333333333330e-11 5007 4314 -2.0833333333333339e-11 5007 4313 2.0833333333333329e-11 5007 4987 2.0833333333333339e-11 5007 4981 -8.3333333333333330e-11 5007 4068 8.3333333333333330e-11 5007 4067 -2.0833333333333339e-11 5007 4064 2.0833333333333332e-11 5007 442 2.0833333333333329e-11 5008 5008 4.1666666666666662e-10 5008 3805 9.3749999999999999e-11 5008 3816 -2.2851328271989659e-27 5008 3814 -1.0416666666666674e-11 5008 5010 1.0416666666666667e-10 5008 4315 9.3749999999999986e-11 5008 4317 -1.0416666666666668e-11 5008 4320 -1.8812360437258079e-27 5008 4313 2.0833333333333329e-11 5008 4988 2.0833333333333339e-11 5008 4982 -8.3333333333333330e-11 5008 3802 2.0833333333333332e-11 5008 1769 2.3107708066186488e-27 5009 5009 4.1666666666666668e-10 5009 4320 -1.8812360437258079e-27 5009 5010 -1.0416666666666667e-10 5009 3816 3.6295685768920020e-28 5009 5011 1.0034310714411270e-27 5009 3805 -9.3749999999999999e-11 5009 3815 1.0416666666666663e-11 5009 3804 -2.0833333333333329e-11 5009 5003 -2.0833333333333339e-11 5009 5004 8.3333333333333330e-11 5009 4315 -9.3749999999999986e-11 5009 4319 1.0416666666666671e-11 5009 4318 -2.0833333333333332e-11 5010 5010 4.1666666666666657e-10 5010 3805 1.0416666666666667e-10 5010 3816 -1.7917989385963757e-27 5010 3814 -1.8812360437258079e-27 5010 5008 1.0416666666666667e-10 5010 4315 1.0416666666666667e-10 5010 4317 -2.2851328271989659e-27 5010 4320 -1.0034310714411270e-27 5010 4319 -3.6295685768920020e-28 5010 5009 -1.0416666666666668e-10 5010 5011 4.0642113836986528e-27 5010 3815 1.8812360437258079e-27 5010 1769 2.8974861048767764e-27 5011 5011 4.1666666666666662e-10 5011 3781 1.2499999999999998e-10 5011 3782 1.0416666666666658e-11 5011 4319 1.0416666666666673e-11 5011 4320 -1.0416666666666669e-11 5011 3807 -5.2083333333333334e-11 5011 4315 -2.0194839173657902e-27 5011 5010 6.4623485355705287e-27 5011 3805 2.0194839173657902e-27 5011 3816 -6.2499999999999991e-11 5011 5009 1.6155871338926322e-27 5011 3815 1.0416666666666671e-11 5011 4467 8.3333333333333330e-11 5011 4468 6.4623485355705287e-27 5011 3777 3.1250000000000002e-11 5011 1206 4.1666666666666665e-11 5011 1758 -2.0833333333333326e-11 5011 1757 -4.1666666666666665e-11 5011 1210 -2.8113590706237963e-30 5012 5012 2.0833333333333331e-10 5013 5013 6.6666666666666664e-10 5013 4077 1.0416666666666666e-11 5013 5015 8.3333333333333330e-11 5013 5026 -1.6155871338926322e-27 5013 4088 -6.2499999999999991e-11 5013 4087 4.1666666666666665e-11 5013 4690 -8.3333333333333330e-11 5013 4689 1.6155871338926322e-27 5013 4059 1.0416666666666666e-11 5013 4063 1.0416666666666666e-11 5013 4069 -6.2499999999999991e-11 5013 4070 4.1666666666666665e-11 5013 4777 -8.3333333333333330e-11 5013 4778 1.6155871338926322e-27 5013 4159 1.0416666666666666e-11 5013 4163 -6.2499999999999991e-11 5013 4166 4.1666666666666665e-11 5013 5014 8.3333333333333330e-11 5013 5016 1.6155871338926322e-27 5013 4322 -6.2499999999999991e-11 5013 4321 4.1666666666666665e-11 5014 5014 4.1666666666666662e-10 5014 4166 2.0833333333333332e-11 5014 4324 2.0833333333333332e-11 5014 4676 2.0833333333333336e-11 5014 4669 -8.3333333333333330e-11 5014 4163 -2.0833333333333336e-11 5014 4162 2.0833333333333332e-11 5014 5016 -2.0833333333333336e-11 5014 5013 8.3333333333333330e-11 5014 4322 -2.0833333333333336e-11 5014 4321 2.0833333333333332e-11 5015 5015 4.1666666666666662e-10 5015 4074 2.0833333333333332e-11 5015 4321 2.0833333333333332e-11 5015 5026 2.0833333333333339e-11 5015 5013 8.3333333333333330e-11 5015 4088 -2.0833333333333336e-11 5015 4087 2.0833333333333332e-11 5015 4670 2.0833333333333339e-11 5015 4669 -8.3333333333333330e-11 5015 4322 -2.0833333333333336e-11 5015 4324 2.0833333333333332e-11 5016 5016 2.4999999999999996e-10 5016 4163 -1.0416666666666665e-11 5016 5025 2.2913451068275814e-27 5016 4166 -2.0833333333333326e-11 5016 5014 -2.0833333333333332e-11 5016 5013 9.5018296033870872e-28 5016 4322 -1.0416666666666665e-11 5016 4321 -2.0833333333333326e-11 5017 5017 2.0833333333333331e-10 5018 5018 2.0833333333333331e-10 5019 5019 2.0833333333333331e-10 5020 5020 6.6666666666666664e-10 5020 5023 -1.8175355256292112e-27 5020 4112 -4.1666666666666665e-11 5020 4711 1.8175355256292112e-27 5020 4087 -4.1666666666666665e-11 5020 5026 -1.8175355256292112e-27 5020 4321 -4.1666666666666665e-11 5020 5021 -1.8175355256292112e-27 5020 4332 -4.1666666666666665e-11 5021 5021 2.4999999999999996e-10 5021 5025 9.5018296033870872e-28 5021 4321 2.0833333333333326e-11 5021 5020 -2.2913451068275814e-27 5021 4332 2.0833333333333326e-11 5022 5022 5.8333333333333328e-10 5022 4335 1.0416666666666665e-11 5022 5043 -2.0833333333333326e-11 5022 5024 1.2500000000000001e-10 5022 4354 5.2083333333333334e-11 5022 4361 -4.1666666666666678e-11 5022 5028 1.6155871338926322e-27 5022 4112 -4.1666666666666665e-11 5022 5023 1.6155871338926322e-27 5022 4332 -4.1666666666666665e-11 5023 5023 2.4999999999999996e-10 5023 5020 -2.2913451068275814e-27 5023 4112 2.0833333333333326e-11 5023 5022 9.5018296033870872e-28 5023 4332 2.0833333333333326e-11 5024 5024 9.1666666666666660e-10 5024 4063 -1.0416666666666665e-11 5024 4778 1.0097419586828951e-27 5024 4779 8.3333333333333330e-11 5024 4159 -1.0416666666666668e-11 5024 4166 -4.1666666666666665e-11 5024 4168 1.0416666666666667e-10 5024 4356 -1.0416666666666665e-11 5024 5022 1.2499999999999998e-10 5024 5043 -4.1666666666666665e-11 5024 4361 -4.1666666666666678e-11 5024 4354 1.0416666666666667e-10 5024 5027 -1.0097419586828951e-27 5024 5041 -8.3333333333333330e-11 5024 4071 -1.0416666666666668e-11 5024 4070 -4.1666666666666665e-11 5024 4072 6.2499999999999991e-11 5024 5025 1.2499999999999998e-10 5024 5029 4.1666666666666658e-11 5024 4332 -1.6666666666666666e-10 5024 4335 2.0833333333333336e-11 5025 5025 5.8333333333333318e-10 5025 4168 5.2083333333333328e-11 5025 5021 1.6155871338926322e-27 5025 4321 -4.1666666666666665e-11 5025 5016 1.8175355256292112e-27 5025 4166 -4.1666666666666665e-11 5025 5029 2.0833333333333329e-11 5025 5024 1.2499999999999998e-10 5025 4332 -4.1666666666666671e-11 5025 4335 1.0416666666666668e-11 5026 5026 2.4999999999999996e-10 5026 5020 -2.2913451068275814e-27 5026 4322 1.0416666666666665e-11 5026 4321 2.0833333333333326e-11 5026 5015 2.0833333333333336e-11 5026 5013 -9.5018296033870872e-28 5026 4088 1.0416666666666665e-11 5026 4087 2.0833333333333326e-11 5027 5027 2.4999999999999996e-10 5027 4354 1.0416666666666668e-11 5027 5041 2.0833333333333336e-11 5027 5024 -4.5053818449435037e-28 5027 4072 1.0416666666666665e-11 5027 4356 6.2499999999999991e-11 5027 4362 1.0416666666666663e-11 5027 4361 2.0833333333333332e-11 5027 4710 2.0833333333333336e-11 5027 4707 -9.5018296033870872e-28 5027 4071 6.2500000000000004e-11 5027 4061 1.0416666666666666e-11 5027 4070 2.0833333333333323e-11 5028 5028 2.4999999999999996e-10 5028 5022 9.5018296033870872e-28 5028 4113 1.0416666666666666e-11 5028 4112 2.0833333333333326e-11 5028 4709 2.0833333333333339e-11 5028 4707 2.2913451068275814e-27 5028 4362 1.0416666666666666e-11 5028 4361 2.0833333333333326e-11 5029 5029 4.1666666666666662e-10 5029 4166 2.0194839173657902e-27 5029 4168 1.0416666666666661e-11 5029 5042 -1.6155871338926322e-27 5029 4340 6.2499999999999991e-11 5029 5025 2.0833333333333329e-11 5029 5024 4.1666666666666658e-11 5029 4332 -4.1666666666666665e-11 5029 5037 6.4623485355705287e-27 5029 4335 -1.0416666666666655e-11 5030 5030 2.4999999999999996e-10 5031 5031 2.0833333333333331e-10 5032 5032 2.0833333333333331e-10 5033 5033 2.0833333333333331e-10 5034 5034 2.0833333333333331e-10 5035 5035 2.0833333333333331e-10 5036 5036 2.0833333333333331e-10 5037 5037 3.3333333333333327e-10 5037 4340 6.2499999999999991e-11 5037 5029 6.4623485355705287e-27 5037 4335 6.2500000000000004e-11 5038 5038 9.1666666666666650e-10 5038 4154 3.1250000000000002e-11 5038 5046 -1.2499999999999998e-10 5038 5040 4.1666666666666665e-11 5038 4355 -5.2083333333333328e-11 5038 4357 4.1666666666666678e-11 5038 4354 -1.0416666666666667e-10 5038 5045 1.0097419586828951e-27 5038 5042 8.3333333333333330e-11 5038 4156 4.1666666666666665e-11 5038 4168 -1.0416666666666667e-10 5038 4773 1.2499999999999998e-10 5038 4772 -4.1666666666666658e-11 5038 4153 1.6666666666666666e-10 5038 4155 -2.0833333333333336e-11 5038 5048 1.0097419586828951e-27 5038 5039 8.3333333333333330e-11 5038 4341 4.1666666666666665e-11 5038 4340 -6.2499999999999991e-11 5038 3023 -5.2083333333333334e-11 5038 2487 3.1250000000000002e-11 5039 5039 4.1666666666666662e-10 5039 4357 2.0833333333333329e-11 5039 5043 9.5018296033870872e-28 5039 4354 -1.0416666666666671e-11 5039 5048 2.0833333333333339e-11 5039 5038 8.3333333333333330e-11 5039 4341 2.0833333333333332e-11 5039 4340 -1.0416666666666674e-11 5040 5040 4.1666666666666662e-10 5040 4071 -2.0194839173657902e-27 5040 4775 -8.3333333333333330e-11 5040 4073 1.0416666666666673e-11 5040 4072 -6.2499999999999991e-11 5040 4154 1.2499999999999998e-10 5040 4153 4.1666666666666671e-11 5040 4155 1.0416666666666674e-11 5040 5046 -2.0833333333333332e-11 5040 5038 4.1666666666666665e-11 5040 4357 -2.8113590706237963e-30 5040 5059 -2.2214323091023692e-27 5040 5041 1.6155871338926322e-27 5040 4356 -2.2470898404921788e-28 5040 4355 1.0416666666666671e-11 5040 4354 -1.0416666666666671e-11 5040 115 3.1250000000000002e-11 5040 441 -5.2083333333333334e-11 5041 5041 4.1666666666666662e-10 5041 4073 -3.6295685768920020e-28 5041 4361 2.0833333333333329e-11 5041 5027 2.0833333333333332e-11 5041 5024 -8.3333333333333330e-11 5041 4071 9.3750000000000012e-11 5041 4070 2.0833333333333332e-11 5041 4072 -1.0416666666666668e-11 5041 5059 1.0416666666666667e-10 5041 5040 9.5018296033870872e-28 5041 4356 9.3749999999999999e-11 5041 4355 -2.2851328271989659e-27 5041 4354 -1.0416666666666668e-11 5042 5042 4.1666666666666662e-10 5042 5029 -9.5018296033870872e-28 5042 4341 2.0833333333333329e-11 5042 4340 -1.0416666666666668e-11 5042 5045 2.0833333333333332e-11 5042 5038 8.3333333333333330e-11 5042 4156 2.0833333333333332e-11 5042 4168 -1.0416666666666668e-11 5043 5043 4.1666666666666662e-10 5043 4332 4.1666666666666665e-11 5043 5022 -2.0833333333333332e-11 5043 5024 -4.1666666666666665e-11 5043 4361 -2.8113590706237963e-30 5043 4335 1.0416666666666674e-11 5043 5037 -6.4623485355705287e-27 5043 4340 -6.2499999999999991e-11 5043 5039 1.6155871338926322e-27 5043 4354 -1.0416666666666671e-11 5044 5044 5.8333333333333339e-10 5044 5049 -1.8175355256292112e-27 5044 4341 -4.1666666666666665e-11 5044 4350 -4.1666666666666665e-11 5044 4773 -1.2500000000000001e-10 5044 5045 1.6155871338926322e-27 5044 4156 -4.1666666666666678e-11 5044 2888 1.0416666666666666e-11 5044 3707 -2.0833333333333332e-11 5044 3023 5.2083333333333334e-11 5045 5045 2.4999999999999996e-10 5045 4341 2.0833333333333332e-11 5045 4340 1.0416666666666668e-11 5045 5042 2.0833333333333336e-11 5045 5038 4.5053818449435037e-28 5045 4168 1.0416666666666665e-11 5045 5044 9.5018296033870872e-28 5045 4156 2.0833333333333323e-11 5046 5046 8.3333333333333314e-10 5046 4155 1.0416666666666665e-11 5046 5040 -2.0833333333333326e-11 5046 5038 -1.2499999999999998e-10 5046 4354 5.2083333333333334e-11 5046 4355 1.4583333333333335e-10 5046 4357 -4.1666666666666665e-11 5046 5057 -4.1666666666666665e-11 5046 5050 1.2499999999999998e-10 5046 4353 2.0833333333333339e-11 5046 4350 -1.6666666666666666e-10 5046 5053 -4.1666666666666665e-11 5046 5047 1.2499999999999998e-10 5046 4154 8.3333333333333343e-11 5046 4153 -4.1666666666666671e-11 5046 5 -3.1250000000000002e-11 5046 111 5.2083333333333334e-11 5047 5047 4.9999999999999993e-10 5047 4353 1.0416666666666666e-11 5047 4773 -1.2500000000000001e-10 5047 4350 -4.1666666666666665e-11 5047 5053 -2.0833333333333332e-11 5047 5046 1.2499999999999998e-10 5047 4154 5.2083333333333334e-11 5047 4153 -4.1666666666666671e-11 5047 2487 5.2083333333333334e-11 5047 3463 -2.0833333333333332e-11 5047 5 2.0833333333333339e-11 5047 2888 1.0416666666666668e-11 5047 111 1.4583333333333335e-10 5048 5048 2.4999999999999996e-10 5048 4354 1.0416666666666666e-11 5048 4357 2.0833333333333332e-11 5048 5050 9.5018296033870872e-28 5048 5039 2.0833333333333339e-11 5048 5038 4.5053818449435037e-28 5048 4341 2.0833333333333323e-11 5048 4340 1.0416666666666666e-11 5049 5049 2.4999999999999996e-10 5049 5050 9.5018296033870872e-28 5049 4350 2.0833333333333326e-11 5049 5044 -2.2913451068275814e-27 5049 4341 2.0833333333333326e-11 5050 5050 5.8333333333333318e-10 5050 4355 5.2083333333333334e-11 5050 5057 -2.0833333333333332e-11 5050 5046 1.2500000000000001e-10 5050 4353 1.0416666666666668e-11 5050 4357 -4.1666666666666665e-11 5050 5048 1.6155871338926322e-27 5050 4341 -4.1666666666666665e-11 5050 5049 1.6155871338926322e-27 5050 4350 -4.1666666666666678e-11 5051 5051 2.0833333333333331e-10 5052 5052 2.4999999999999996e-10 5053 5053 4.1666666666666662e-10 5053 4154 -1.0416666666666669e-11 5053 4353 1.0416666666666658e-11 5053 4350 4.1666666666666665e-11 5053 5047 -2.0833333333333332e-11 5053 5046 -4.1666666666666665e-11 5053 4153 -6.0691943799667649e-29 5053 110 -2.0194839173657902e-27 5053 111 1.0416666666666673e-11 5053 560 -1.6155871338926322e-27 5053 26 2.0194839173657902e-27 5053 33 -6.2499999999999991e-11 5053 562 6.4623485355705287e-27 5053 36 1.0416666666666671e-11 5053 517 8.3333333333333330e-11 5053 518 6.4623485355705287e-27 5053 5 1.2499999999999998e-10 5054 5054 2.0833333333333331e-10 5055 5055 2.0833333333333331e-10 5056 5056 2.0833333333333331e-10 5057 5057 4.1666666666666662e-10 5057 4353 1.0416666666666666e-11 5057 4355 -1.0416666666666666e-11 5057 4357 -5.7186808026555811e-29 5057 5050 -2.0833333333333332e-11 5057 5046 -4.1666666666666665e-11 5057 4350 4.1666666666666665e-11 5057 33 -6.2500000000000004e-11 5057 824 3.2311742677852644e-27 5058 5058 2.0833333333333331e-10 5059 5059 4.1666666666666662e-10 5059 4356 9.3749999999999986e-11 5059 4355 -1.0416666666666668e-11 5059 4071 9.3749999999999986e-11 5059 4073 -1.0416666666666671e-11 5059 4072 1.8812360437258079e-27 5059 5041 1.0416666666666667e-10 5059 5040 -1.7917989385963757e-27 5059 4354 -1.8812360437258079e-27 5059 1691 2.0833333333333329e-11 5059 2319 2.0833333333333339e-11 5059 813 -8.3333333333333330e-11 5059 1522 2.0833333333333332e-11 5060 5060 2.0833333333333331e-10 5061 5061 4.1666666666666662e-10 5061 4220 2.0833333333333332e-11 5061 4006 2.0833333333333332e-11 5061 4507 2.0833333333333339e-11 5061 4500 -8.3333333333333330e-11 5061 4218 -2.0833333333333339e-11 5061 4216 2.0833333333333332e-11 5061 4739 2.0833333333333339e-11 5061 4738 -8.3333333333333330e-11 5061 4004 -2.0833333333333339e-11 5061 4003 2.0833333333333332e-11 5062 5062 2.0833333333333331e-10 5063 5063 4.1666666666666662e-10 5063 4207 2.0833333333333329e-11 5063 4369 2.0833333333333329e-11 5063 4747 2.0833333333333339e-11 5063 4740 -8.3333333333333330e-11 5063 4221 -2.0833333333333339e-11 5063 4220 2.0833333333333332e-11 5063 4806 2.0833333333333339e-11 5063 4805 -8.3333333333333330e-11 5063 4367 -2.0833333333333339e-11 5063 4366 2.0833333333333332e-11 5064 5064 4.1666666666666662e-10 5064 4128 2.0833333333333329e-11 5064 4366 2.0833333333333329e-11 5064 4812 2.0833333333333339e-11 5064 4805 -8.3333333333333330e-11 5064 4133 -2.0833333333333332e-11 5064 4132 2.0833333333333332e-11 5064 4741 2.0833333333333339e-11 5064 4740 -8.3333333333333330e-11 5064 4367 -2.0833333333333332e-11 5064 4369 2.0833333333333332e-11 5065 5065 2.0833333333333331e-10 5066 5066 2.0833333333333331e-10 5067 5067 2.0833333333333331e-10 5068 5068 2.0833333333333331e-10 5069 5069 4.1666666666666662e-10 5069 4123 2.0833333333333329e-11 5069 4380 2.0833333333333329e-11 5069 4894 2.0833333333333339e-11 5069 4893 -8.3333333333333330e-11 5069 4137 -2.0833333333333332e-11 5069 4136 2.0833333333333332e-11 5069 4476 2.0833333333333339e-11 5069 4475 -8.3333333333333330e-11 5069 4378 -2.0833333333333332e-11 5069 4377 2.0833333333333332e-11 5070 5070 2.0833333333333331e-10 5071 5071 2.0833333333333331e-10 5072 5072 2.0833333333333331e-10 5073 5073 5.8333333333333320e-02 5073 4695 -1.3552527156068805e-20 5073 4097 -4.1666666666666666e-03 5073 4051 1.0416666666666664e-03 5073 4055 -4.1666666666666657e-03 5073 4563 -2.0833333333333329e-03 5073 4562 -1.2499999999999997e-02 5073 3920 5.2083333333333330e-03 5073 5074 1.3552527156068805e-20 5073 3923 -4.1666666666666675e-03 5074 5074 2.4999999999999998e-02 5074 4097 2.0833333333333329e-03 5074 4096 1.0416666666666667e-03 5074 4913 2.0833333333333337e-03 5074 4910 -4.7253188800459238e-19 5074 3930 1.0416666666666664e-03 5074 5073 -1.0254392617697373e-19 5074 3923 2.0833333333333320e-03 5075 5075 4.9999999999999989e-02 5075 4056 1.0416666666666664e-03 5075 3913 5.2083333333333322e-03 5075 4555 -2.0833333333333329e-03 5075 4562 -1.2499999999999999e-02 5075 4051 1.0416666666666667e-03 5075 4055 -4.1666666666666657e-03 5075 4788 -2.0833333333333329e-03 5075 4787 -1.2499999999999997e-02 5075 3914 5.2083333333333330e-03 5075 3918 -4.1666666666666675e-03 5076 5076 2.0833333333333332e-02 5077 5077 2.4999999999999991e-02 5078 5078 2.0833333333333329e-02 5079 5079 2.4999999999999994e-02 5080 5080 2.0833333333333329e-02 hypre-2.33.0/src/test/TEST_ams/mfem.b.00000000066400000000000000000000714031477326011500176530ustar00rootroot000000000000001 1075 1 0.0000000000000000e+00 2 0.0000000000000000e+00 3 0.0000000000000000e+00 4 0.0000000000000000e+00 5 1.3846990000000001e-01 6 0.0000000000000000e+00 7 0.0000000000000000e+00 8 1.3122700000000001e-01 9 0.0000000000000000e+00 10 0.0000000000000000e+00 11 9.0876410000000005e-02 12 0.0000000000000000e+00 13 0.0000000000000000e+00 14 2.3625390000000000e-02 15 0.0000000000000000e+00 16 0.0000000000000000e+00 17 6.3976000000000005e-02 18 5.5109409999999998e-02 19 1.5183600000000000e-01 20 3.0319209999999999e-02 21 1.7025510000000001e-02 22 5.3169550000000003e-02 23 5.9035470000000000e-02 24 0.0000000000000000e+00 25 1.5705079999999999e-01 26 2.1260550000000000e-01 27 6.1943539999999998e-02 28 0.0000000000000000e+00 29 0.0000000000000000e+00 30 1.1805810000000000e-01 31 0.0000000000000000e+00 32 0.0000000000000000e+00 33 2.2322960000000000e-01 34 0.0000000000000000e+00 35 0.0000000000000000e+00 36 3.4728820000000001e-02 37 0.0000000000000000e+00 38 -2.2244890000000000e-02 39 -1.1057300000000000e-01 40 -7.8662260000000005e-03 41 -4.7618359999999998e-02 42 -3.1949770000000002e-02 43 1.3171540000000001e-01 44 5.4811199999999997e-02 45 7.0999969999999996e-02 46 -1.6408639999999999e-02 47 -6.0823059999999998e-02 48 -3.5184939999999998e-02 49 -2.8805569999999999e-02 50 -1.6585960000000000e-01 51 2.8805569999999999e-02 52 0.0000000000000000e+00 53 0.0000000000000000e+00 54 -4.0350610000000002e-02 55 0.0000000000000000e+00 56 0.0000000000000000e+00 57 0.0000000000000000e+00 58 0.0000000000000000e+00 59 -4.0350610000000002e-02 60 0.0000000000000000e+00 61 0.0000000000000000e+00 62 -2.2850340000000000e-02 63 -1.6157629999999999e-02 64 0.0000000000000000e+00 65 -2.8532189999999999e-02 66 0.0000000000000000e+00 67 -2.8532189999999999e-02 68 0.0000000000000000e+00 69 0.0000000000000000e+00 70 0.0000000000000000e+00 71 0.0000000000000000e+00 72 0.0000000000000000e+00 73 0.0000000000000000e+00 74 -2.9825000000000001e-02 75 -1.1057300000000000e-01 76 -1.4549309999999999e-01 77 3.6493829999999998e-02 78 2.1110970000000000e-02 79 5.1610070000000001e-02 80 1.1169129999999999e-01 81 2.7643259999999997e-01 82 1.8309750000000000e-01 83 2.3460970000000000e-01 84 7.4714810000000006e-02 85 -6.6470470000000004e-02 86 -2.1952569999999999e-01 87 -1.2616830000000001e-01 88 -6.9469370000000003e-02 89 -1.4493519999999999e-01 90 -2.7604839999999999e-02 91 -4.2599980000000003e-02 92 -5.6953520000000001e-02 93 8.4558140000000007e-03 94 -8.9214450000000001e-02 95 -5.0966379999999999e-02 96 8.7810269999999996e-02 97 2.9825000000000001e-02 98 6.9939759999999998e-03 99 5.6953520000000001e-02 100 1.5902600000000000e-01 101 0.0000000000000000e+00 102 1.5485240000000000e-01 103 8.3488759999999995e-02 104 0.0000000000000000e+00 105 1.5485240000000000e-01 106 0.0000000000000000e+00 107 0.0000000000000000e+00 108 -1.7425670000000001e-02 109 -1.0162119999999999e-01 110 -1.9800160000000000e-01 111 -2.4352630000000000e-01 112 2.2345770000000001e-01 113 5.0875920000000002e-03 114 5.7555219999999997e-02 115 3.5318070000000001e-01 116 1.5078090000000000e-01 117 -3.0319209999999999e-02 118 6.8459320000000004e-02 119 -3.7049909999999998e-02 120 -3.4023570000000003e-02 121 4.6685659999999999e-03 122 -1.6926450000000001e-01 123 -7.7133560000000004e-02 124 -1.5335930000000000e-01 125 7.2003919999999999e-02 126 2.0414140000000001e-02 127 2.4257380000000001e-01 128 1.0844139999999999e-01 129 -5.8296320000000004e-03 130 -3.9613959999999997e-02 131 -2.6694699999999999e-01 132 -9.3883019999999998e-02 133 -7.1947579999999997e-02 134 -6.6643969999999997e-02 135 1.7140910000000001e-01 136 1.4073980000000000e-02 137 1.3277059999999999e-01 138 -1.0284540000000000e-01 139 -7.2003919999999999e-02 140 1.6884949999999999e-02 141 2.1199270000000001e-01 142 3.9613959999999997e-02 143 1.0698900000000000e-01 144 4.8709179999999998e-02 145 -1.9381999999999999e-01 146 0.0000000000000000e+00 147 -3.8713100000000000e-01 148 -3.8713100000000000e-01 149 0.0000000000000000e+00 150 0.0000000000000000e+00 151 -1.1580400000000000e-01 152 -1.9389609999999999e-01 153 -2.5081639999999999e-01 154 5.5165609999999997e-02 155 4.8474040000000002e-01 156 9.5963999999999994e-02 157 1.6150470000000000e-01 158 1.0977590000000000e-01 159 2.9116700000000001e-01 160 -5.5165609999999997e-02 161 -2.7443970000000001e-01 162 -1.3631460000000001e-01 163 -2.5081639999999999e-01 164 -1.3631460000000001e-01 165 2.9116700000000001e-01 166 9.5963999999999994e-02 167 -5.5109409999999998e-02 168 -6.3090190000000004e-02 169 1.0523639999999999e-01 170 1.7025510000000001e-02 171 -9.0002830000000006e-02 172 -9.0002830000000006e-02 173 -6.3090190000000004e-02 174 1.7025510000000001e-02 175 1.0523639999999999e-01 176 -5.5109409999999998e-02 177 -1.3805500000000001e-01 178 0.0000000000000000e+00 179 -2.4521080000000001e-01 180 -1.3805500000000001e-01 181 -5.3682140000000000e-01 182 -2.4521080000000001e-01 183 0.0000000000000000e+00 184 -3.0227520000000002e-01 185 -3.0227520000000002e-01 186 -1.5320909999999999e-01 187 0.0000000000000000e+00 188 0.0000000000000000e+00 189 0.0000000000000000e+00 190 0.0000000000000000e+00 191 0.0000000000000000e+00 192 -1.2089380000000000e-01 193 0.0000000000000000e+00 194 -9.2141370000000007e-03 195 2.0414140000000001e-02 196 -2.9418380000000000e-01 197 3.0759740000000002e-01 198 1.8037750000000000e-01 199 3.8339830000000003e-01 200 -6.8563630000000000e-02 201 -1.4921090000000001e-01 202 -3.3192660000000002e-01 203 -5.2998190000000001e-01 204 -1.3749800000000001e-01 205 -2.7110350000000000e-01 206 1.4574080000000000e-02 207 1.3749800000000001e-01 208 6.6736740000000006e-01 209 2.3470750000000001e-01 210 2.9543280000000000e-01 211 1.7906630000000001e-01 212 -1.0284540000000000e-01 213 -3.5184939999999998e-02 214 1.4154670000000000e-01 215 -1.4154670000000000e-01 216 1.3609430000000000e-02 217 -3.2392199999999999e-01 218 -1.6047390000000000e-01 219 -1.9934020000000000e-02 220 1.0771760000000000e-02 221 -1.5613869999999999e-01 222 -1.0949720000000000e-01 223 1.4870500000000000e-01 224 1.0949720000000000e-01 225 1.0771760000000000e-02 226 1.0949720000000000e-01 227 -1.0949720000000000e-01 228 1.0896830000000000e-01 229 -4.2877840000000000e-02 230 -1.2960869999999999e-01 231 1.0649179999999999e-02 232 7.5193099999999999e-02 233 -1.2960869999999999e-01 234 0.0000000000000000e+00 235 0.0000000000000000e+00 236 8.6736169999999998e-19 237 0.0000000000000000e+00 238 0.0000000000000000e+00 239 0.0000000000000000e+00 240 0.0000000000000000e+00 241 0.0000000000000000e+00 242 0.0000000000000000e+00 243 9.5963999999999994e-02 244 0.0000000000000000e+00 245 3.6833270000000001e-02 246 -1.9021460000000000e-02 247 0.0000000000000000e+00 248 0.0000000000000000e+00 249 0.0000000000000000e+00 250 -1.9934020000000000e-02 251 -6.8701280000000003e-02 252 -8.9214450000000001e-02 253 2.4329219999999999e-02 254 5.8296320000000004e-03 255 -1.7347230000000000e-18 256 -2.8775160000000001e-02 257 -4.5800859999999999e-02 258 -5.9476300000000003e-02 259 -6.0823059999999998e-02 260 -1.4574080000000000e-02 261 -9.0930510000000006e-02 262 -1.4073980000000000e-02 263 6.9388940000000007e-18 264 5.4558309999999999e-02 265 -9.2141370000000007e-03 266 3.6493829999999998e-02 267 8.7444480000000002e-03 268 -2.1110970000000000e-02 269 -3.7049909999999998e-02 270 3.6372210000000002e-02 271 4.8709179999999998e-02 272 1.1450210000000000e-01 273 1.4869080000000001e-01 274 3.5184939999999998e-02 275 4.6264050000000001e-02 276 0.0000000000000000e+00 277 0.0000000000000000e+00 278 -1.8684039999999999e-01 279 0.0000000000000000e+00 280 -1.5994000000000000e-01 281 0.0000000000000000e+00 282 0.0000000000000000e+00 283 -2.2719100000000000e-01 284 -8.5484820000000003e-02 285 -1.0523639999999999e-01 286 2.3418770000000000e-17 287 2.2850340000000000e-02 288 6.2450050000000000e-17 289 3.3646839999999997e-02 290 -7.6327829999999996e-17 291 5.0875920000000002e-03 292 6.8459320000000004e-02 293 1.5502630000000001e-01 294 -8.2140160000000004e-02 295 -2.1110970000000000e-02 296 -2.0816679999999999e-17 297 -1.6552729999999999e-01 298 -6.9469370000000003e-02 299 -1.0844139999999999e-01 300 -1.4073980000000000e-02 301 1.1169129999999999e-01 302 3.2856070000000001e-02 303 9.3883019999999998e-02 304 2.7110350000000000e-01 305 3.5184939999999998e-02 306 4.1381810000000002e-01 307 3.3977590000000002e-02 308 -4.8124989999999999e-02 309 -2.2244890000000000e-02 310 4.9284099999999997e-02 311 1.4082449999999999e-01 312 5.0966379999999999e-02 313 1.1759440000000000e-01 314 -2.6929390000000001e-02 315 -5.9482000000000000e-02 316 2.7374300000000001e-01 317 -2.6929390000000001e-02 318 2.7374300000000001e-01 319 -2.7374300000000001e-01 320 1.5320909999999999e-01 321 -1.2089380000000000e-01 322 -1.8031259999999999e-01 323 -1.3749800000000001e-01 324 2.0414140000000001e-02 325 -2.9418380000000000e-01 326 -2.7110350000000000e-01 327 1.4574080000000000e-02 328 3.8339830000000003e-01 329 -1.9934020000000000e-02 330 1.3609430000000000e-02 331 -3.2392199999999999e-01 332 2.9543280000000000e-01 333 1.7906630000000001e-01 334 1.4154670000000000e-01 335 6.6736740000000006e-01 336 2.3470750000000001e-01 337 3.0759740000000002e-01 338 1.8037750000000000e-01 339 -6.8563630000000000e-02 340 -3.5184939999999998e-02 341 -3.3192660000000002e-01 342 -1.0284540000000000e-01 343 1.3749800000000001e-01 344 -1.6047390000000000e-01 345 -5.2998190000000001e-01 346 -1.4154670000000000e-01 347 -1.4921090000000001e-01 348 -9.2141370000000007e-03 349 5.1007089999999998e-02 350 0.0000000000000000e+00 351 1.3802940000000000e-01 352 2.1472859999999999e-01 353 8.0964999999999995e-02 354 5.1007089999999998e-02 355 1.3802940000000000e-01 356 0.0000000000000000e+00 357 8.0964999999999995e-02 358 4.2877840000000000e-02 359 0.0000000000000000e+00 360 0.0000000000000000e+00 361 0.0000000000000000e+00 362 0.0000000000000000e+00 363 0.0000000000000000e+00 364 7.5193099999999999e-02 365 0.0000000000000000e+00 366 4.8709179999999998e-02 367 2.0414140000000001e-02 368 2.4257380000000001e-01 369 -7.1947579999999997e-02 370 -6.6643969999999997e-02 371 -1.5335930000000000e-01 372 3.9613959999999997e-02 373 -3.4023570000000003e-02 374 4.6685659999999999e-03 375 1.0844139999999999e-01 376 -5.8296320000000004e-03 377 2.1199270000000001e-01 378 1.6884949999999999e-02 379 1.3277059999999999e-01 380 -1.0284540000000000e-01 381 -3.7049909999999998e-02 382 -1.6926450000000001e-01 383 -7.7133560000000004e-02 384 1.0698900000000000e-01 385 7.2003919999999999e-02 386 1.7140910000000001e-01 387 -7.2003919999999999e-02 388 -2.6694699999999999e-01 389 -9.3883019999999998e-02 390 1.4073980000000000e-02 391 -3.9613959999999997e-02 392 0.0000000000000000e+00 393 0.0000000000000000e+00 394 -1.8684039999999999e-01 395 0.0000000000000000e+00 396 -2.2719100000000000e-01 397 -1.0523639999999999e-01 398 -2.8532189999999999e-02 399 0.0000000000000000e+00 400 0.0000000000000000e+00 401 0.0000000000000000e+00 402 5.6953520000000001e-02 403 2.7643259999999997e-01 404 1.8309750000000000e-01 405 3.6493829999999998e-02 406 2.1110970000000000e-02 407 5.1610070000000001e-02 408 -6.9469370000000003e-02 409 -1.1057300000000000e-01 410 -1.4549309999999999e-01 411 -1.4493519999999999e-01 412 -2.7604839999999999e-02 413 6.9939759999999998e-03 414 8.7810269999999996e-02 415 -1.2616830000000001e-01 416 1.1169129999999999e-01 417 2.3460970000000000e-01 418 7.4714810000000006e-02 419 -6.6470470000000004e-02 420 -4.2599980000000003e-02 421 -2.9825000000000001e-02 422 2.9825000000000001e-02 423 8.4558140000000007e-03 424 -8.9214450000000001e-02 425 -5.0966379999999999e-02 426 -2.1952569999999999e-01 427 -5.6953520000000001e-02 428 3.2315500000000003e-01 429 -4.7639260000000003e-02 430 -9.0876410000000005e-02 431 -9.2378829999999995e-02 432 3.6833270000000001e-02 433 -2.9276439999999998e-01 434 0.0000000000000000e+00 435 0.0000000000000000e+00 436 1.3122700000000001e-01 437 0.0000000000000000e+00 438 0.0000000000000000e+00 439 9.0876410000000005e-02 440 5.5109409999999998e-02 441 -4.1827049999999999e-01 442 5.5511149999999998e-17 443 0.0000000000000000e+00 444 -1.2923179999999999e-02 445 -1.3710530000000001e-01 446 -1.2851870000000001e-01 447 -8.1885810000000003e-02 448 -6.5013299999999996e-02 449 -8.6736170000000008e-18 450 3.9007979999999998e-02 451 1.3571359999999999e-01 452 -2.6005319999999998e-02 453 1.1643489999999999e-01 454 1.2282140000000000e-01 455 3.2129659999999999e-01 456 6.5013299999999996e-02 457 2.6929390000000001e-02 458 0.0000000000000000e+00 459 4.7553650000000003e-02 460 0.0000000000000000e+00 461 4.7553650000000003e-02 462 0.0000000000000000e+00 463 0.0000000000000000e+00 464 0.0000000000000000e+00 465 0.0000000000000000e+00 466 0.0000000000000000e+00 467 0.0000000000000000e+00 468 1.2282140000000000e-01 469 3.2129659999999999e-01 470 -2.6005319999999998e-02 471 -1.2851870000000001e-01 472 6.5013299999999996e-02 473 1.1643489999999999e-01 474 1.3571359999999999e-01 475 -1.2923179999999999e-02 476 0.0000000000000000e+00 477 -6.9469370000000003e-02 478 -1.0844139999999999e-01 479 -1.4073980000000000e-02 480 -1.6552729999999999e-01 481 1.1759440000000000e-01 482 4.9284099999999997e-02 483 1.4082449999999999e-01 484 4.1381810000000002e-01 485 5.0966379999999999e-02 486 -2.2244890000000000e-02 487 -2.9276439999999998e-01 488 0.0000000000000000e+00 489 3.2315500000000003e-01 490 3.6833270000000001e-02 491 -6.9388939999999998e-17 492 1.5705079999999999e-01 493 0.0000000000000000e+00 494 0.0000000000000000e+00 495 1.8494560000000000e-02 496 0.0000000000000000e+00 497 8.8337299999999994e-02 498 0.0000000000000000e+00 499 9.1486910000000005e-02 500 0.0000000000000000e+00 501 2.0158079999999998e-02 502 2.0926600000000001e-01 503 5.0530150000000003e-02 504 0.0000000000000000e+00 505 8.6135760000000006e-02 506 2.3063110000000001e-02 507 4.9459200000000002e-02 508 -5.3002939999999998e-02 509 5.8329840000000001e-02 510 1.1053530000000000e-01 511 3.8157299999999998e-02 512 9.2613470000000003e-02 513 1.0618039999999999e-01 514 -7.5877150000000004e-02 515 6.3802049999999999e-03 516 -1.6314510000000001e-02 517 1.2646299999999999e-01 518 6.7915089999999997e-02 519 0.0000000000000000e+00 520 -3.9870370000000002e-02 521 -1.9422129999999999e-02 522 0.0000000000000000e+00 523 5.7305839999999997e-02 524 0.0000000000000000e+00 525 4.9526029999999999e-02 526 0.0000000000000000e+00 527 4.7601800000000000e-02 528 0.0000000000000000e+00 529 6.4043199999999995e-02 530 8.6680809999999997e-02 531 4.6882760000000002e-02 532 0.0000000000000000e+00 533 -1.6843029999999998e-02 534 7.1284210000000001e-02 535 -1.4675340000000000e-02 536 -4.8341710000000003e-02 537 -5.2751070000000002e-03 538 2.5986610000000000e-02 539 4.7794910000000003e-02 540 -3.1363960000000003e-02 541 5.9900799999999997e-02 542 1.5560549999999999e-02 543 8.2984610000000000e-02 544 -1.1653280000000000e-02 545 0.0000000000000000e+00 546 9.2324799999999999e-02 547 7.7810749999999998e-02 548 -2.9335429999999999e-02 549 -8.3556670000000000e-02 550 -2.6817069999999998e-01 551 -5.7915359999999999e-02 552 2.0889199999999999e-01 553 5.5693340000000001e-02 554 -1.6274939999999999e-01 555 -1.0240670000000000e-01 556 2.7389449999999999e-01 557 4.3777179999999999e-02 558 -7.5524490000000000e-02 559 9.6100560000000002e-02 560 1.0469340000000001e-02 561 4.3534810000000000e-02 562 -1.4800010000000000e-01 563 4.1641919999999999e-02 564 -9.6651409999999993e-02 565 1.5921890000000000e-01 566 1.0182869999999999e-01 567 -1.1312730000000000e-01 568 6.2411359999999999e-02 569 1.6192660000000000e-01 570 3.6228249999999997e-02 571 -5.2804950000000003e-02 572 -1.1764220000000000e-01 573 9.0991989999999995e-02 574 1.4402989999999999e-01 575 0.0000000000000000e+00 576 0.0000000000000000e+00 577 9.1104850000000001e-02 578 1.4342369999999999e-01 579 -1.4787660000000000e-01 580 -5.2038300000000003e-02 581 7.1047240000000000e-01 582 1.8420090000000000e-01 583 1.4255480000000001e-04 584 1.8420090000000000e-01 585 -6.0748219999999997e-01 586 -1.7571800000000001e-01 587 -8.6580009999999999e-02 588 -1.7571800000000001e-01 589 1.5099299999999999e-01 590 -1.6333870000000000e-01 591 -1.6333870000000000e-01 592 1.5099299999999999e-01 593 -1.0456630000000000e-02 594 1.9445620000000000e-01 595 -8.6781609999999995e-02 596 -2.3531679999999999e-01 597 -1.0456630000000000e-02 598 3.1262319999999999e-01 599 -2.6683519999999999e-01 600 3.1262319999999999e-01 601 -2.6683519999999999e-01 602 1.9445620000000000e-01 603 -2.3531679999999999e-01 604 -8.6523299999999997e-02 605 6.4487699999999995e-02 606 -1.8257709999999999e-01 607 -2.4104610000000001e-01 608 -1.7370459999999999e-01 609 1.3294069999999999e-01 610 1.8316410000000000e-01 611 3.2669480000000001e-01 612 -1.8122250000000001e-01 613 0.0000000000000000e+00 614 -1.8122250000000001e-01 615 -1.8316410000000000e-01 616 0.0000000000000000e+00 617 3.6969150000000001e-01 618 1.7635329999999999e-01 619 -1.8834960000000001e-01 620 -3.5855930000000003e-01 621 -6.1567520000000001e-02 622 -2.9594680000000001e-01 623 -9.1104850000000001e-02 624 1.6455770000000000e-01 625 9.9587759999999997e-02 626 2.0950930000000001e-01 627 9.9587759999999997e-02 628 3.1331930000000001e-02 629 -4.3677569999999999e-02 630 -4.3677569999999999e-02 631 3.1331930000000001e-02 632 -2.5244550000000001e-02 633 -6.4738790000000004e-02 634 2.0902260000000000e-01 635 1.7528070000000001e-01 636 -2.5244550000000001e-02 637 -1.3833210000000001e-01 638 3.9685779999999997e-02 639 -1.3833210000000001e-01 640 3.9685779999999997e-02 641 -6.4738790000000004e-02 642 1.7528070000000001e-01 643 -4.8724549999999998e-02 644 7.0729990000000006e-02 645 8.4768150000000000e-02 646 2.4014680000000000e-02 647 1.2662380000000001e-01 648 3.4198010000000001e-03 649 -1.4203009999999999e-01 650 -5.5693340000000001e-02 651 -1.4342369999999999e-01 652 1.4203009999999999e-01 653 0.0000000000000000e+00 654 1.5019899999999999e-02 655 0.0000000000000000e+00 656 6.1567100000000000e-02 657 0.0000000000000000e+00 658 4.1585179999999999e-02 659 0.0000000000000000e+00 660 1.7571929999999999e-02 661 5.4355880000000002e-02 662 -3.0312389999999998e-03 663 -5.9222030000000002e-02 664 -1.1895330000000001e-02 665 5.9439539999999999e-02 666 7.7161910000000000e-02 667 -6.7484069999999997e-03 668 5.6527519999999998e-02 669 6.1311670000000005e-04 670 5.1012830000000002e-02 671 -6.9017729999999999e-03 672 0.0000000000000000e+00 673 -1.0013269999999999e-02 674 -1.7254430000000001e-02 675 2.5033170000000000e-02 676 1.0352660000000000e-02 677 0.0000000000000000e+00 678 0.0000000000000000e+00 679 -1.7475489999999999e-01 680 0.0000000000000000e+00 681 -1.9612789999999999e-01 682 -5.0435940000000001e-01 683 0.0000000000000000e+00 684 -1.4432690000000001e-01 685 -1.1646049999999999e-01 686 -1.2232100000000000e-01 687 5.2139400000000002e-02 688 -1.0683790000000000e-01 689 -1.7593670000000000e-01 690 -7.0293729999999999e-02 691 -9.2661939999999998e-02 692 7.3123129999999995e-02 693 -1.0950640000000000e-01 694 -2.9428729999999997e-01 695 -7.7810749999999998e-02 696 0.0000000000000000e+00 697 -7.3123129999999995e-02 698 7.7991359999999996e-02 699 -6.3030580000000003e-02 700 -1.3614210000000000e-02 701 1.4195869999999999e-02 702 2.7151220000000000e-02 703 -4.4445279999999997e-03 704 3.7732839999999997e-02 705 9.1202569999999997e-02 706 1.1135670000000000e-01 707 8.6155659999999995e-02 708 1.3490369999999999e-01 709 3.1196539999999998e-02 710 1.4359279999999999e-01 711 4.6794820000000001e-02 712 -5.7437110000000000e-02 713 -9.4907179999999994e-02 714 1.6875780000000001e-01 715 -9.4907179999999994e-02 716 -8.7529469999999998e-02 717 -3.9727750000000001e-01 718 -1.7250989999999999e-01 719 1.6875780000000001e-01 720 8.6523299999999997e-02 721 -8.7529469999999998e-02 722 -1.7250989999999999e-01 723 -2.4104610000000001e-01 724 -1.8257709999999999e-01 725 6.4487699999999995e-02 726 -3.1655960000000000e-01 727 -1.8562180000000000e-01 728 3.5507509999999998e-01 729 1.5524260000000001e-01 730 3.5855930000000003e-01 731 -3.5507509999999998e-01 732 -1.8834960000000001e-01 733 1.7635329999999999e-01 734 3.6969150000000001e-01 735 -3.9311840000000001e-02 736 -1.5643640000000000e-01 737 -3.9311840000000001e-02 738 -4.6395380000000000e-02 739 2.5162730000000000e-01 740 1.5213630000000000e-01 741 -1.5643640000000000e-01 742 4.8724549999999998e-02 743 -4.6395380000000000e-02 744 1.5213630000000000e-01 745 2.4014680000000000e-02 746 8.4768150000000000e-02 747 7.0729990000000006e-02 748 1.0623580000000001e-01 749 -5.6100940000000002e-02 750 -9.5880119999999999e-02 751 -1.4508589999999999e-01 752 5.2038300000000003e-02 753 0.0000000000000000e+00 754 9.5880119999999999e-02 755 0.0000000000000000e+00 756 5.7915359999999999e-02 757 -1.4787660000000000e-01 758 -9.0991989999999995e-02 759 0.0000000000000000e+00 760 -9.2324799999999999e-02 761 0.0000000000000000e+00 762 -1.7475489999999999e-01 763 0.0000000000000000e+00 764 -8.2984610000000000e-02 765 -1.9612789999999999e-01 766 -5.9900799999999997e-02 767 -5.2139400000000002e-02 768 1.2232100000000000e-01 769 -7.0293729999999999e-02 770 -1.7593670000000000e-01 771 -1.0683790000000000e-01 772 -3.1363960000000003e-02 773 -7.1284210000000001e-02 774 1.5560549999999999e-02 775 -4.7601800000000000e-02 776 -1.1653280000000000e-02 777 0.0000000000000000e+00 778 -5.7305839999999997e-02 779 -8.3556670000000000e-02 780 -2.9335429999999999e-02 781 -1.8269430000000000e-01 782 1.4701210000000001e-01 783 3.2009630000000000e-01 784 -2.5302340000000001e-01 785 -6.8833989999999998e-02 786 -2.2380710000000001e-01 787 -1.8537170000000000e-01 788 4.1505540000000000e-02 789 -1.8245560000000000e-01 790 1.3363700000000001e-01 791 1.8854850000000001e-01 792 3.3012530000000001e-01 793 0.0000000000000000e+00 794 0.0000000000000000e+00 795 0.0000000000000000e+00 796 4.9526029999999999e-02 797 0.0000000000000000e+00 798 6.4043199999999995e-02 799 1.9342970000000001e-01 800 0.0000000000000000e+00 801 2.6335770000000001e-02 802 7.2581170000000000e-02 803 4.8341710000000003e-02 804 1.4675340000000000e-02 805 4.7794910000000003e-02 806 2.5986610000000000e-02 807 -5.2751070000000002e-03 808 -2.4331140000000001e-02 809 2.2286850000000000e-02 810 8.5164139999999999e-02 811 1.2258520000000001e-01 812 -2.2286850000000000e-02 813 -4.9710169999999998e-01 814 -5.5015010000000004e-04 815 9.6277320000000000e-02 816 3.5745490000000002e-01 817 -9.5632170000000002e-02 818 -2.0147899999999999e-01 819 9.5150529999999997e-02 820 1.1151580000000000e-01 821 1.1393590000000001e-01 822 1.2526229999999999e-01 823 -2.7151220000000000e-02 824 -2.0629470000000000e-01 825 -2.2558080000000000e-01 826 0.0000000000000000e+00 827 0.0000000000000000e+00 828 1.1684509999999999e-01 829 0.0000000000000000e+00 830 1.4508589999999999e-01 831 1.9342970000000001e-01 832 7.2581170000000000e-02 833 5.6100940000000002e-02 834 2.6335770000000001e-02 835 1.1208290000000000e-01 836 1.1069909999999999e-01 837 3.4395730000000000e-03 838 1.0623580000000001e-01 839 2.4331140000000001e-02 840 -5.8633180000000000e-02 841 -9.2615210000000003e-02 842 1.9324340000000001e-01 843 1.5452550000000001e-01 844 2.0663670000000001e-01 845 7.5716640000000002e-02 846 -1.1635990000000000e-01 847 -6.8097189999999997e-03 848 -1.1422850000000000e-01 849 6.5700289999999995e-02 850 1.7792740000000001e-01 851 1.4945290000000000e-01 852 -3.9626359999999999e-02 853 -4.4472560000000001e-03 854 -1.4490230000000000e-02 855 1.6420460000000001e-01 856 1.6853750000000001e-01 857 8.5164139999999999e-02 858 -1.5553890000000001e-01 859 -8.0274559999999995e-02 860 6.4794249999999998e-02 861 1.5849779999999999e-01 862 -1.4700510000000000e-02 863 1.4814550000000001e-01 864 -6.8817240000000002e-02 865 7.4120940000000001e-03 866 0.0000000000000000e+00 867 4.1044730000000001e-02 868 0.0000000000000000e+00 869 5.9971820000000002e-03 870 0.0000000000000000e+00 871 3.3440900000000003e-02 872 8.0121200000000004e-02 873 -1.8856540000000001e-02 874 -4.2156650000000004e-03 875 5.4303560000000001e-02 876 -2.9134330000000000e-02 877 7.2645379999999996e-02 878 1.6871020000000000e-02 879 -9.6447610000000000e-03 880 -1.5327920000000001e-03 881 -5.2273260000000002e-02 882 1.3770289999999999e-01 883 -1.2223170000000000e-01 884 8.0044050000000005e-02 885 -6.0247700000000001e-02 886 -2.5934240000000001e-02 887 -3.8813279999999999e-02 888 1.1582030000000001e-04 889 0.0000000000000000e+00 890 5.5081180000000000e-02 891 -9.8550440000000003e-02 892 8.2621769999999997e-02 893 1.6425070000000000e-01 894 1.0122610000000001e-02 895 2.0809250000000001e-01 896 6.1363859999999999e-02 897 4.8027580000000000e-02 898 9.1967510000000004e-04 899 4.7582369999999999e-02 900 5.0140219999999999e-02 901 0.0000000000000000e+00 902 0.0000000000000000e+00 903 -2.9211280000000001e-01 904 0.0000000000000000e+00 905 -3.2669480000000001e-01 906 -5.0435940000000001e-01 907 -1.1646049999999999e-01 908 -1.3294069999999999e-01 909 -1.4432690000000001e-01 910 1.3685190000000000e-01 911 -1.3761280000000001e-01 912 -2.7674779999999999e-01 913 -1.5119320000000000e-01 914 -1.7370459999999999e-01 915 9.2661939999999998e-02 916 -8.3095440000000007e-02 917 -9.4164209999999998e-02 918 -4.2391750000000000e-01 919 -1.6420460000000001e-01 920 -1.5505849999999999e-01 921 -1.8929160000000000e-01 922 -1.6853750000000001e-01 923 -1.4490230000000000e-02 924 -4.4472560000000001e-03 925 -1.5452550000000001e-01 926 -1.4945290000000000e-01 927 -1.0950640000000000e-01 928 -1.6198560000000001e-01 929 -8.2855730000000002e-02 930 6.3144950000000005e-02 931 -1.1270230000000001e-01 932 0.0000000000000000e+00 933 1.2037740000000000e-01 934 0.0000000000000000e+00 935 0.0000000000000000e+00 936 1.2865420000000000e-01 937 5.8354950000000003e-02 938 2.0061010000000001e-01 939 1.3445560000000001e-01 940 1.4195869999999999e-02 941 -4.4445279999999997e-03 942 -8.2505259999999997e-02 943 6.0801710000000002e-02 944 9.7509789999999999e-02 945 5.7437110000000000e-02 946 1.4863720000000000e-01 947 7.1835040000000003e-03 948 -6.0801710000000002e-02 949 4.6794820000000001e-02 950 1.0044970000000000e-01 951 2.8935430000000001e-01 952 1.8116769999999999e-01 953 2.5112430000000002e-01 954 1.2125340000000000e-01 955 -5.5277729999999997e-02 956 -5.5277729999999997e-02 957 -7.9931820000000001e-02 958 1.5505849999999999e-01 959 4.2391750000000000e-01 960 8.2855730000000002e-02 961 8.0307459999999997e-02 962 -5.4294380000000000e-03 963 -9.4164209999999998e-02 964 -8.3095440000000007e-02 965 1.3761280000000001e-01 966 6.3144950000000005e-02 967 1.8929160000000000e-01 968 -1.6198560000000001e-01 969 -1.1270230000000001e-01 970 3.4415779999999999e-04 971 3.7818350000000001e-02 972 3.7818350000000001e-02 973 9.7160789999999997e-02 974 -9.7509789999999999e-02 975 9.7160789999999997e-02 976 2.2097010000000000e-01 977 2.0626310000000000e-01 978 -3.5878359999999998e-02 979 1.5200430000000001e-01 980 3.1655960000000000e-01 981 7.9857789999999998e-02 982 -1.4155300000000001e-01 983 -2.4306050000000001e-01 984 2.2380710000000001e-01 985 1.5524260000000001e-01 986 -1.8562180000000000e-01 987 6.0750039999999998e-02 988 0.0000000000000000e+00 989 -1.0261180000000000e-01 990 0.0000000000000000e+00 991 -5.1272320000000003e-02 992 4.2379000000000000e-02 993 -9.9065899999999998e-02 994 2.7674779999999999e-01 995 0.0000000000000000e+00 996 -2.9211280000000001e-01 997 0.0000000000000000e+00 998 -3.3012530000000001e-01 999 -1.3363700000000001e-01 1000 -1.3685190000000000e-01 1001 -1.5119320000000000e-01 1002 -1.8245560000000000e-01 1003 -3.2009630000000000e-01 1004 1.8854850000000001e-01 1005 -1.4701210000000001e-01 1006 -4.1505540000000000e-02 1007 -1.8269430000000000e-01 1008 6.8833989999999998e-02 1009 2.5302340000000001e-01 1010 -1.8537170000000000e-01 1011 2.5781640000000002e-02 1012 2.4949569999999999e-01 1013 7.9411330000000002e-02 1014 -1.4076970000000000e-01 1015 2.8431990000000001e-01 1016 1.9966110000000001e-01 1017 2.5212229999999999e-02 1018 4.1019440000000001e-01 1019 1.1112400000000000e-01 1020 -7.9857789999999998e-02 1021 -6.3779329999999995e-02 1022 -1.9781389999999999e-01 1023 9.6277320000000000e-02 1024 4.3777179999999999e-02 1025 2.7389449999999999e-01 1026 9.6100560000000002e-02 1027 -7.5524490000000000e-02 1028 9.5150529999999997e-02 1029 1.2526229999999999e-01 1030 -3.4198010000000001e-03 1031 -1.0182869999999999e-01 1032 7.5716640000000002e-02 1033 5.8633180000000000e-02 1034 -1.1069909999999999e-01 1035 -1.5921890000000000e-01 1036 1.6192660000000000e-01 1037 6.2411359999999999e-02 1038 -1.1312730000000000e-01 1039 1.2662380000000001e-01 1040 8.2505259999999997e-02 1041 -2.0061010000000001e-01 1042 -6.4794249999999998e-02 1043 2.8935430000000001e-01 1044 1.0044970000000000e-01 1045 1.8116769999999999e-01 1046 8.0274559999999995e-02 1047 2.5112430000000002e-01 1048 8.0835569999999995e-02 1049 1.2125340000000000e-01 1050 9.2615210000000003e-02 1051 1.5849779999999999e-01 1052 -1.5553890000000001e-01 1053 -3.6228249999999997e-02 1054 -3.4395730000000000e-03 1055 -9.6651409999999993e-02 1056 -5.2804950000000003e-02 1057 -1.1764220000000000e-01 1058 -5.0530150000000003e-02 1059 0.0000000000000000e+00 1060 2.4306050000000001e-01 1061 3.6196250000000000e-03 1062 -2.1652560000000001e-01 1063 2.0626310000000000e-01 1064 -1.4155300000000001e-01 1065 -8.0307459999999997e-02 1066 -2.2097010000000000e-01 1067 5.4294380000000000e-03 1068 -1.9324340000000001e-01 1069 7.9931820000000001e-02 1070 -2.0663670000000001e-01 1071 -1.1208290000000000e-01 1072 1.1684509999999999e-01 1073 0.0000000000000000e+00 1074 8.6135760000000006e-02 1075 -8.9196670000000006e-02 hypre-2.33.0/src/test/TEST_ams/mfem.b.00001000066400000000000000000001055221477326011500176540ustar00rootroot000000000000001076 2332 1076 0.0000000000000000e+00 1077 0.0000000000000000e+00 1078 -2.6900410000000000e-02 1079 0.0000000000000000e+00 1080 0.0000000000000000e+00 1081 -1.0558919999999999e-01 1082 0.0000000000000000e+00 1083 4.2069299999999997e-02 1084 0.0000000000000000e+00 1085 -1.6945289999999999e-01 1086 0.0000000000000000e+00 1087 -2.3107879999999998e-03 1088 0.0000000000000000e+00 1089 0.0000000000000000e+00 1090 0.0000000000000000e+00 1091 -2.0029060000000001e-01 1092 0.0000000000000000e+00 1093 0.0000000000000000e+00 1094 -1.5994000000000000e-01 1095 0.0000000000000000e+00 1096 -1.0833520000000001e-01 1097 -3.7958999999999998e-01 1098 -9.0002830000000006e-02 1099 -8.5484820000000003e-02 1100 -1.3705139999999999e-01 1101 -5.3151369999999998e-01 1102 -2.5472149999999999e-01 1103 0.0000000000000000e+00 1104 0.0000000000000000e+00 1105 0.0000000000000000e+00 1106 -2.0087020000000000e-01 1107 -5.4697470000000004e-01 1108 0.0000000000000000e+00 1109 0.0000000000000000e+00 1110 0.0000000000000000e+00 1111 0.0000000000000000e+00 1112 -2.1122140000000000e-01 1113 1.1759440000000000e-01 1114 2.7643259999999997e-01 1115 2.0030080000000000e-01 1116 2.4677430000000000e-01 1117 7.4171699999999993e-02 1118 3.4406720000000002e-02 1119 1.3171540000000001e-01 1120 2.2154179999999999e-02 1121 -8.4112190000000003e-02 1122 -4.0544890000000000e-02 1123 -1.6585960000000000e-01 1124 -1.7523120000000000e-01 1125 2.4329219999999999e-02 1126 1.4073980000000000e-02 1127 -2.8399990000000000e-02 1128 -6.1805180000000001e-02 1129 -2.1952569999999999e-01 1130 -8.9446410000000004e-02 1131 -1.8699130000000000e-01 1132 -4.2765049999999999e-02 1133 5.8630570000000000e-02 1134 -5.8630570000000000e-02 1135 5.6372100000000001e-03 1136 -5.9476300000000003e-02 1137 -3.3977590000000002e-02 1138 4.0544890000000000e-02 1139 1.5410440000000000e-01 1140 0.0000000000000000e+00 1141 0.0000000000000000e+00 1142 1.7689099999999999e-01 1143 4.4515260000000001e-01 1144 9.9177319999999999e-02 1145 0.0000000000000000e+00 1146 2.5019320000000000e-01 1147 0.0000000000000000e+00 1148 -1.3064339999999999e-01 1149 -5.0373979999999999e-02 1150 -2.8175760000000000e-01 1151 2.0816679999999999e-17 1152 2.2026019999999999e-01 1153 3.4300789999999998e-01 1154 -2.7269709999999999e-03 1155 -1.2278409999999999e-01 1156 -2.9295030000000000e-01 1157 -1.0408339999999999e-17 1158 -1.3090700000000000e-01 1159 1.3093969999999999e-01 1160 -4.1366769999999997e-02 1161 7.8544199999999995e-02 1162 8.7293129999999997e-02 1163 5.2362800000000001e-02 1164 5.8063220000000004e-01 1165 4.3178299999999997e-01 1166 2.7357789999999998e-01 1167 -2.1823280000000000e-01 1168 -3.4837930000000000e-01 1169 -2.7174219999999999e-01 1170 -1.5503560000000000e-01 1171 -1.4840700000000001e-01 1172 9.2378829999999995e-02 1173 1.0874660000000000e-01 1174 0.0000000000000000e+00 1175 2.9331659999999998e-01 1176 0.0000000000000000e+00 1177 6.1725559999999999e-02 1178 1.7473130000000000e-02 1179 0.0000000000000000e+00 1180 0.0000000000000000e+00 1181 1.3835870000000000e-01 1182 1.1582760000000000e-01 1183 0.0000000000000000e+00 1184 0.0000000000000000e+00 1185 1.5745660000000002e-02 1186 6.1063470000000002e-02 1187 0.0000000000000000e+00 1188 0.0000000000000000e+00 1189 7.6455560000000006e-02 1190 8.9250819999999995e-02 1191 4.1481230000000002e-01 1192 1.4148100000000000e-01 1193 0.0000000000000000e+00 1194 1.4148100000000000e-01 1195 8.9250819999999995e-02 1196 7.6455560000000006e-02 1197 0.0000000000000000e+00 1198 0.0000000000000000e+00 1199 0.0000000000000000e+00 1200 1.6380490000000000e-01 1201 0.0000000000000000e+00 1202 8.6356790000000003e-02 1203 0.0000000000000000e+00 1204 0.0000000000000000e+00 1205 0.0000000000000000e+00 1206 -7.5388700000000003e-02 1207 -1.3593780000000000e-01 1208 -1.4720900000000001e-01 1209 -8.7604769999999998e-02 1210 -1.6582050000000001e-01 1211 5.7265889999999997e-01 1212 2.1634729999999999e-01 1213 7.5071540000000003e-01 1214 -1.3268070000000000e-02 1215 -3.1000109999999997e-01 1216 3.2322370000000000e-01 1217 9.2588350000000000e-02 1218 2.1705780000000000e-01 1219 -1.2818499999999999e-01 1220 -3.9846540000000003e-01 1221 -2.4669269999999999e-01 1222 -1.6499759999999999e-01 1223 -4.7041929999999998e-01 1224 -2.0987910000000001e-01 1225 -4.2069299999999997e-02 1226 -2.4669269999999999e-01 1227 -1.2818499999999999e-01 1228 -1.6499759999999999e-01 1229 -6.5545430000000002e-02 1230 -2.3992630000000001e-01 1231 -3.4185480000000001e-01 1232 1.1604810000000000e-01 1233 -4.5042929999999998e-01 1234 1.9472560000000000e-02 1235 3.3502930000000000e-02 1236 3.0676260000000000e-01 1237 8.9780340000000003e-01 1238 -4.0649410000000002e-01 1239 -2.5582379999999999e-01 1240 2.2690579999999999e-01 1241 6.1725559999999999e-02 1242 -1.6765730000000001e-01 1243 -2.9288219999999998e-01 1244 3.1304729999999997e-01 1245 -2.8046200000000000e-02 1246 0.0000000000000000e+00 1247 0.0000000000000000e+00 1248 0.0000000000000000e+00 1249 -4.9861849999999999e-02 1250 -1.6927380000000000e-01 1251 -7.0607660000000005e-01 1252 0.0000000000000000e+00 1253 0.0000000000000000e+00 1254 2.0204469999999999e-01 1255 9.4335879999999997e-02 1256 0.0000000000000000e+00 1257 0.0000000000000000e+00 1258 0.0000000000000000e+00 1259 -4.3351800000000003e-02 1260 0.0000000000000000e+00 1261 0.0000000000000000e+00 1262 0.0000000000000000e+00 1263 0.0000000000000000e+00 1264 0.0000000000000000e+00 1265 0.0000000000000000e+00 1266 0.0000000000000000e+00 1267 -2.0157030000000001e-01 1268 -3.8513350000000002e-01 1269 -1.5994000000000000e-01 1270 -8.3761329999999995e-02 1271 1.0266800000000000e-01 1272 -7.2338620000000006e-02 1273 2.0441889999999999e-01 1274 1.4569080000000001e-01 1275 -1.2933280000000000e-01 1276 2.0417350000000001e-01 1277 2.3139140000000000e-01 1278 -2.9618080000000002e-01 1279 -1.2573609999999999e-01 1280 -9.0902410000000003e-02 1281 1.5078090000000000e-01 1282 2.2345770000000001e-01 1283 2.0951119999999999e-04 1284 -4.9400420000000000e-02 1285 -4.4757850000000002e-02 1286 -3.0319209999999999e-02 1287 1.0515030000000000e-01 1288 -5.3225750000000002e-02 1289 5.3169550000000003e-02 1290 2.2719100000000000e-01 1291 9.1072980000000003e-18 1292 0.0000000000000000e+00 1293 0.0000000000000000e+00 1294 0.0000000000000000e+00 1295 0.0000000000000000e+00 1296 0.0000000000000000e+00 1297 0.0000000000000000e+00 1298 5.4187840000000001e-02 1299 6.4540080000000000e-02 1300 0.0000000000000000e+00 1301 5.4187840000000001e-02 1302 0.0000000000000000e+00 1303 0.0000000000000000e+00 1304 0.0000000000000000e+00 1305 0.0000000000000000e+00 1306 0.0000000000000000e+00 1307 0.0000000000000000e+00 1308 0.0000000000000000e+00 1309 0.0000000000000000e+00 1310 0.0000000000000000e+00 1311 -2.6020849999999998e-18 1312 0.0000000000000000e+00 1313 0.0000000000000000e+00 1314 0.0000000000000000e+00 1315 0.0000000000000000e+00 1316 0.0000000000000000e+00 1317 0.0000000000000000e+00 1318 1.3631460000000001e-01 1319 0.0000000000000000e+00 1320 0.0000000000000000e+00 1321 6.9063600000000003e-02 1322 0.0000000000000000e+00 1323 0.0000000000000000e+00 1324 9.5963999999999994e-02 1325 0.0000000000000000e+00 1326 0.0000000000000000e+00 1327 1.6321500000000000e-01 1328 5.3225750000000002e-02 1329 2.2775400000000001e-01 1330 3.6833270000000001e-02 1331 6.8459320000000004e-02 1332 7.4917180000000000e-02 1333 2.6929390000000001e-02 1334 0.0000000000000000e+00 1335 4.7553650000000003e-02 1336 0.0000000000000000e+00 1337 4.7553650000000003e-02 1338 0.0000000000000000e+00 1339 0.0000000000000000e+00 1340 0.0000000000000000e+00 1341 0.0000000000000000e+00 1342 0.0000000000000000e+00 1343 0.0000000000000000e+00 1344 -3.7049909999999998e-02 1345 -6.8701280000000003e-02 1346 -8.9214450000000001e-02 1347 -6.0823059999999998e-02 1348 -1.4574080000000000e-02 1349 8.2399369999999992e-18 1350 -9.0930510000000006e-02 1351 -2.1110970000000000e-02 1352 -2.0816679999999999e-17 1353 -9.2141370000000007e-03 1354 -4.5800859999999999e-02 1355 -5.9476300000000003e-02 1356 3.6493829999999998e-02 1357 8.7444480000000002e-03 1358 5.4558309999999999e-02 1359 -1.4073980000000000e-02 1360 -2.8775160000000001e-02 1361 3.6372210000000002e-02 1362 -1.9934020000000000e-02 1363 2.4329219999999999e-02 1364 5.8296320000000004e-03 1365 4.6264050000000001e-02 1366 1.1450210000000000e-01 1367 1.4869080000000001e-01 1368 3.5184939999999998e-02 1369 4.8709179999999998e-02 1370 0.0000000000000000e+00 1371 0.0000000000000000e+00 1372 6.7251019999999995e-02 1373 1.0969420000000001e-01 1374 0.0000000000000000e+00 1375 1.0160719999999999e-01 1376 0.0000000000000000e+00 1377 0.0000000000000000e+00 1378 2.8046200000000000e-02 1379 0.0000000000000000e+00 1380 0.0000000000000000e+00 1381 0.0000000000000000e+00 1382 0.0000000000000000e+00 1383 0.0000000000000000e+00 1384 6.3976000000000005e-02 1385 0.0000000000000000e+00 1386 0.0000000000000000e+00 1387 2.3625390000000000e-02 1388 0.0000000000000000e+00 1389 5.3169550000000003e-02 1390 1.5183600000000000e-01 1391 1.7025510000000001e-02 1392 3.0319209999999999e-02 1393 -1.6408639999999999e-02 1394 -1.1057300000000000e-01 1395 -7.8662260000000005e-03 1396 -6.0823059999999998e-02 1397 -3.5184939999999998e-02 1398 -8.6016789999999996e-02 1399 2.8805569999999999e-02 1400 -1.4093020000000000e-02 1401 1.4869080000000001e-01 1402 -4.7618359999999998e-02 1403 -3.1949770000000002e-02 1404 -4.8124989999999999e-02 1405 -1.6585960000000000e-01 1406 -5.4807729999999999e-02 1407 -1.0183910000000000e-01 1408 -4.6566860000000002e-02 1409 8.7810269999999996e-02 1410 4.4316280000000000e-02 1411 2.1028050000000001e-01 1412 7.0999969999999996e-02 1413 -2.8805569999999999e-02 1414 5.4811199999999997e-02 1415 1.3171540000000001e-01 1416 8.4943969999999994e-02 1417 1.6408639999999999e-02 1418 -2.2244890000000000e-02 1419 5.4780429999999998e-02 1420 1.2508079999999999e-01 1421 3.1477040000000001e-01 1422 1.6315610000000000e-01 1423 0.0000000000000000e+00 1424 5.9035470000000000e-02 1425 0.0000000000000000e+00 1426 6.1943539999999998e-02 1427 2.4394220000000001e-02 1428 0.0000000000000000e+00 1429 1.1586370000000000e-01 1430 0.0000000000000000e+00 1431 0.0000000000000000e+00 1432 0.0000000000000000e+00 1433 0.0000000000000000e+00 1434 2.9189240000000000e-01 1435 2.3227860000000000e-01 1436 0.0000000000000000e+00 1437 0.0000000000000000e+00 1438 3.8203840000000000e-01 1439 2.9042789999999999e-02 1440 1.3545950000000001e-01 1441 0.0000000000000000e+00 1442 2.1149660000000001e-01 1443 9.9210320000000005e-02 1444 0.0000000000000000e+00 1445 2.9042789999999999e-02 1446 4.0881390000000001e-01 1447 4.9500390000000000e-01 1448 -3.4768899999999998e-02 1449 1.6072349999999999e-01 1450 -3.5591600000000001e-01 1451 -2.9245359999999998e-01 1452 -2.9625459999999998e-01 1453 6.3976000000000005e-02 1454 -3.7242950000000002e-01 1455 -2.6515280000000002e-01 1456 -2.0716750000000000e-01 1457 -1.4881559999999999e-01 1458 -9.6736210000000003e-02 1459 -8.5484820000000003e-02 1460 -4.2060130000000001e-02 1461 -7.4917180000000000e-02 1462 1.0833520000000001e-01 1463 2.6023109999999999e-01 1464 1.6157629999999999e-02 1465 -6.7410990000000004e-02 1466 -1.6424580000000000e-01 1467 -1.0744250000000000e-01 1468 -1.3332590000000000e-01 1469 -1.5710520000000000e-01 1470 1.6424580000000000e-01 1471 1.5943050000000000e-02 1472 7.9247550000000000e-02 1473 9.7884009999999994e-02 1474 1.3609430000000000e-02 1475 2.8951529999999998e-01 1476 1.6266210000000000e-01 1477 -8.7444480000000002e-03 1478 -2.3003899999999999e-01 1479 -6.9542800000000002e-02 1480 -4.0042040000000001e-01 1481 -1.4082449999999999e-01 1482 -1.3833290000000001e-01 1483 -1.0324400000000000e-01 1484 2.1110970000000000e-02 1485 -6.8563630000000000e-02 1486 1.9915600000000000e-01 1487 -9.7884009999999994e-02 1488 -2.2348519999999999e-01 1489 -1.1242230000000000e-01 1490 -2.8775160000000001e-02 1491 -3.4023570000000003e-02 1492 8.1348219999999999e-02 1493 5.3484930000000000e-02 1494 3.1798910000000002e-01 1495 6.9542800000000002e-02 1496 1.3232600000000000e-01 1497 1.7140910000000001e-01 1498 4.6264050000000001e-02 1499 1.9798530000000000e-01 1500 1.8512750000000000e-01 1501 0.0000000000000000e+00 1502 7.9019500000000006e-02 1503 0.0000000000000000e+00 1504 1.8326729999999999e-01 1505 3.8015349999999998e-01 1506 1.4522430000000000e-01 1507 0.0000000000000000e+00 1508 0.0000000000000000e+00 1509 1.0115610000000000e-01 1510 1.4952830000000000e-01 1511 0.0000000000000000e+00 1512 0.0000000000000000e+00 1513 0.0000000000000000e+00 1514 0.0000000000000000e+00 1515 -1.3374100000000000e-01 1516 -1.5709319999999999e-01 1517 0.0000000000000000e+00 1518 0.0000000000000000e+00 1519 0.0000000000000000e+00 1520 2.8046200000000000e-02 1521 0.0000000000000000e+00 1522 -1.3064339999999999e-01 1523 -5.0373979999999999e-02 1524 -4.1366769999999997e-02 1525 -7.8161840000000005e-01 1526 -2.4303710000000001e-01 1527 0.0000000000000000e+00 1528 -5.4803179999999996e-01 1529 0.0000000000000000e+00 1530 -2.9480919999999999e-01 1531 0.0000000000000000e+00 1532 -3.3821319999999999e-01 1533 -3.2443159999999999e-01 1534 -6.0386980000000001e-01 1535 0.0000000000000000e+00 1536 0.0000000000000000e+00 1537 0.0000000000000000e+00 1538 -2.0354050000000001e-01 1539 -1.7277300000000001e-01 1540 0.0000000000000000e+00 1541 0.0000000000000000e+00 1542 -1.5431390000000000e-01 1543 -1.6047870000000000e-01 1544 0.0000000000000000e+00 1545 0.0000000000000000e+00 1546 -1.8968760000000001e-01 1547 -1.1631130000000001e-01 1548 0.0000000000000000e+00 1549 1.7560160000000000e-01 1550 2.2986039999999999e-01 1551 3.6232189999999997e-01 1552 0.0000000000000000e+00 1553 0.0000000000000000e+00 1554 0.0000000000000000e+00 1555 6.9483219999999998e-02 1556 5.6945450000000002e-02 1557 0.0000000000000000e+00 1558 0.0000000000000000e+00 1559 9.2588350000000000e-02 1560 1.4300560000000001e-01 1561 0.0000000000000000e+00 1562 0.0000000000000000e+00 1563 1.6645360000000001e-01 1564 6.2521270000000004e-02 1565 0.0000000000000000e+00 1566 -6.6025860000000006e-02 1567 -3.8616409999999997e-02 1568 0.0000000000000000e+00 1569 0.0000000000000000e+00 1570 4.2069299999999997e-02 1571 -7.0115490000000003e-02 1572 0.0000000000000000e+00 1573 4.6897100000000003e-01 1574 0.0000000000000000e+00 1575 3.2480209999999998e-01 1576 0.0000000000000000e+00 1577 2.0799180000000000e-01 1578 1.3882400000000000e-01 1579 0.0000000000000000e+00 1580 1.1420110000000000e-01 1581 3.4276319999999999e-01 1582 9.0475730000000004e-02 1583 -1.0127790000000000e-01 1584 -2.0565790000000000e-01 1585 -2.2618930000000001e-01 1586 -6.5013299999999996e-02 1587 3.6429189999999999e-17 1588 3.9007979999999998e-02 1589 -1.3710530000000001e-01 1590 -8.1885810000000003e-02 1591 -1.9405819999999999e-01 1592 -1.9277800000000000e-01 1593 -3.9007979999999998e-02 1594 3.1225020000000001e-17 1595 7.7623280000000003e-02 1596 2.6005319999999998e-02 1597 -4.0935600000000003e-02 1598 -3.5249439999999999e-01 1599 -2.1625340000000001e-01 1600 0.0000000000000000e+00 1601 -1.1617120000000000e-02 1602 -9.3506020000000001e-01 1603 -4.1111470000000000e-01 1604 -2.9409580000000002e-01 1605 0.0000000000000000e+00 1606 -2.9597000000000001e-01 1607 -2.5939750000000000e-01 1608 0.0000000000000000e+00 1609 0.0000000000000000e+00 1610 1.0896830000000000e-01 1611 3.6812070000000002e-02 1612 3.7175730000000001e-01 1613 -1.0896830000000000e-01 1614 3.6812070000000002e-02 1615 -1.0896830000000000e-01 1616 -6.9862750000000001e-02 1617 -4.1886289999999998e-01 1618 1.8029890000000001e-01 1619 2.1067800000000000e-01 1620 -1.5613869999999999e-01 1621 1.0649179999999999e-02 1622 -3.2512699999999999e-02 1623 -3.8724050000000003e-02 1624 0.0000000000000000e+00 1625 -3.2512699999999999e-02 1626 0.0000000000000000e+00 1627 0.0000000000000000e+00 1628 0.0000000000000000e+00 1629 0.0000000000000000e+00 1630 0.0000000000000000e+00 1631 0.0000000000000000e+00 1632 0.0000000000000000e+00 1633 -2.1675139999999999e-02 1634 -2.5816030000000000e-02 1635 0.0000000000000000e+00 1636 -2.1675139999999999e-02 1637 0.0000000000000000e+00 1638 0.0000000000000000e+00 1639 0.0000000000000000e+00 1640 0.0000000000000000e+00 1641 0.0000000000000000e+00 1642 0.0000000000000000e+00 1643 0.0000000000000000e+00 1644 0.0000000000000000e+00 1645 -4.5653460000000001e-01 1646 1.2299380000000000e-01 1647 1.9711840000000001e-02 1648 6.6973810000000000e-01 1649 8.6044339999999997e-02 1650 0.0000000000000000e+00 1651 2.1179940000000000e-01 1652 4.1104819999999997e-01 1653 1.1669210000000001e-01 1654 2.1671869999999999e-01 1655 2.1764020000000001e-01 1656 0.0000000000000000e+00 1657 0.0000000000000000e+00 1658 0.0000000000000000e+00 1659 0.0000000000000000e+00 1660 0.0000000000000000e+00 1661 1.5778100000000000e-01 1662 7.9247550000000000e-02 1663 0.0000000000000000e+00 1664 0.0000000000000000e+00 1665 -1.6157629999999999e-02 1666 0.0000000000000000e+00 1667 -2.8532189999999999e-02 1668 0.0000000000000000e+00 1669 0.0000000000000000e+00 1670 0.0000000000000000e+00 1671 0.0000000000000000e+00 1672 -8.9446410000000004e-02 1673 -2.4829090000000001e-01 1674 -1.6266210000000000e-01 1675 -2.3470750000000001e-01 1676 -8.4943969999999994e-02 1677 6.2450050000000000e-17 1678 -1.0771760000000000e-02 1679 0.0000000000000000e+00 1680 -1.9021460000000000e-02 1681 0.0000000000000000e+00 1682 -1.9021460000000000e-02 1683 0.0000000000000000e+00 1684 0.0000000000000000e+00 1685 0.0000000000000000e+00 1686 0.0000000000000000e+00 1687 0.0000000000000000e+00 1688 0.0000000000000000e+00 1689 1.0874660000000000e-01 1690 0.0000000000000000e+00 1691 1.0205839999999999e-01 1692 0.0000000000000000e+00 1693 0.0000000000000000e+00 1694 -9.7176200000000004e-02 1695 0.0000000000000000e+00 1696 -1.6990350000000001e-01 1697 0.0000000000000000e+00 1698 -1.9269739999999999e-01 1699 0.0000000000000000e+00 1700 -8.6415080000000005e-02 1701 -1.2265020000000000e-01 1702 -1.2218130000000001e-01 1703 5.0237980000000004e-01 1704 4.3679610000000001e-02 1705 -6.2343110000000000e-02 1706 -1.6536809999999999e-01 1707 -1.0804260000000000e-01 1708 -7.8043860000000007e-02 1709 -1.8698310000000001e-01 1710 6.0852629999999998e-02 1711 -1.1935440000000000e-01 1712 -9.0294639999999995e-02 1713 -1.6858419999999999e-01 1714 -3.3044509999999999e-01 1715 0.0000000000000000e+00 1716 -7.3830229999999997e-02 1717 7.7688510000000002e-03 1718 -1.9556960000000002e-02 1719 -9.4125260000000002e-02 1720 -5.3129919999999997e-01 1721 -1.4410190000000000e-01 1722 1.6018660000000001e-02 1723 -2.9755049999999998e-03 1724 3.7015670000000001e-01 1725 1.0450010000000000e-01 1726 -2.6697760000000001e-02 1727 -1.4693200000000001e-01 1728 -2.2209400000000001e-01 1729 -1.3999170000000000e-01 1730 3.2893249999999999e-02 1731 -8.1038810000000003e-02 1732 3.9391569999999998e-01 1733 2.3372319999999999e-01 1734 1.1459419999999999e-01 1735 -5.5015010000000004e-04 1736 -6.6398029999999997e-02 1737 3.9450430000000002e-02 1738 4.0791300000000003e-01 1739 -1.9440080000000001e-01 1740 -5.8963550000000003e-02 1741 1.9410189999999999e-01 1742 1.2675429999999999e-01 1743 0.0000000000000000e+00 1744 0.0000000000000000e+00 1745 2.6942239999999999e-02 1746 -1.1475490000000001e-01 1747 1.2679420000000000e-01 1748 1.7878970000000000e-01 1749 -1.1489220000000000e-01 1750 -1.1693300000000000e-01 1751 0.0000000000000000e+00 1752 0.0000000000000000e+00 1753 0.0000000000000000e+00 1754 1.4410190000000000e-01 1755 2.9734709999999998e-01 1756 0.0000000000000000e+00 1757 9.6040170000000002e-01 1758 2.6718629999999999e-01 1759 -5.7624100000000000e-01 1760 5.3128170000000002e-02 1761 -3.5745490000000002e-01 1762 -8.9196670000000006e-02 1763 -1.2835210000000000e-01 1764 -7.1835040000000003e-03 1765 7.9411330000000002e-02 1766 1.1911700000000000e-01 1767 -1.9852829999999999e-01 1768 -1.1151580000000000e-01 1769 3.1066749999999999e-01 1770 -3.8085740000000001e-01 1771 -9.0001629999999999e-02 1772 3.5067640000000000e-01 1773 8.4908269999999997e-01 1774 2.9349310000000001e-01 1775 7.5071979999999996e-03 1776 9.7566490000000006e-02 1777 4.1797840000000003e-01 1778 -2.9074810000000001e-01 1779 2.7146819999999999e-01 1780 6.5044320000000003e-02 1781 -2.7666210000000002e-01 1782 -2.8302250000000001e-01 1783 4.9762580000000001e-01 1784 -2.7157330000000002e-01 1785 -2.3755879999999999e-01 1786 -2.0986569999999999e-01 1787 -1.4933530000000000e-01 1788 2.1362519999999999e-01 1789 -2.1002400000000001e-02 1790 2.2630680000000000e-01 1791 -1.6088189999999999e-01 1792 -1.2817509999999999e-01 1793 1.4320460000000000e-02 1794 9.6580650000000004e-03 1795 2.1286850000000000e-02 1796 0.0000000000000000e+00 1797 0.0000000000000000e+00 1798 0.0000000000000000e+00 1799 0.0000000000000000e+00 1800 0.0000000000000000e+00 1801 0.0000000000000000e+00 1802 -1.2113790000000001e-01 1803 1.0110090000000000e-02 1804 6.1068790000000000e-03 1805 -2.5275229999999999e-02 1806 -1.8710879999999999e-02 1807 -2.1951850000000001e-01 1808 -4.9319279999999999e-01 1809 -2.4135850000000000e-01 1810 -4.5043189999999997e-03 1811 -1.0816990000000000e-02 1812 -1.7117370000000001e-01 1813 -1.6261080000000000e-01 1814 -2.0147899999999999e-01 1815 -1.4894959999999999e-01 1816 1.3445560000000001e-01 1817 -2.4723160000000000e-01 1818 -1.1393590000000001e-01 1819 1.0965040000000000e-01 1820 -9.1156539999999994e-02 1821 -2.2316289999999999e-02 1822 1.0137790000000001e-01 1823 -2.6426470000000001e-02 1824 2.2789129999999999e-01 1825 1.3389770000000000e-02 1826 6.7585240000000005e-02 1827 9.7032499999999994e-02 1828 -1.3673479999999999e-01 1829 8.9265140000000000e-03 1830 -1.6896310000000000e-01 1831 -7.0606030000000000e-02 1832 -5.2503370000000001e-02 1833 6.7355600000000002e-02 1834 1.0029210000000000e-01 1835 -4.0413360000000002e-02 1836 -4.7788740000000003e-02 1837 -1.2283750000000000e-01 1838 -1.5332390000000001e-01 1839 -8.0523429999999993e-02 1840 8.0399659999999998e-02 1841 3.3567369999999999e-02 1842 0.0000000000000000e+00 1843 0.0000000000000000e+00 1844 0.0000000000000000e+00 1845 0.0000000000000000e+00 1846 0.0000000000000000e+00 1847 0.0000000000000000e+00 1848 0.0000000000000000e+00 1849 1.5019899999999999e-02 1850 0.0000000000000000e+00 1851 6.1567100000000000e-02 1852 0.0000000000000000e+00 1853 1.7571929999999999e-02 1854 0.0000000000000000e+00 1855 4.1585179999999999e-02 1856 1.2223170000000000e-01 1857 -1.1582030000000001e-04 1858 0.0000000000000000e+00 1859 5.8354950000000003e-02 1860 9.6447610000000000e-03 1861 5.9222030000000002e-02 1862 3.0312389999999998e-03 1863 -1.1895330000000001e-02 1864 5.9439539999999999e-02 1865 7.7161910000000000e-02 1866 1.6871020000000000e-02 1867 4.2156650000000004e-03 1868 -1.5327920000000001e-03 1869 -5.9971820000000002e-03 1870 1.7254430000000001e-02 1871 0.0000000000000000e+00 1872 -1.0013269999999999e-02 1873 1.0352660000000000e-02 1874 2.5033170000000000e-02 1875 6.9017729999999999e-03 1876 0.0000000000000000e+00 1877 1.8494560000000000e-02 1878 0.0000000000000000e+00 1879 8.8337299999999994e-02 1880 0.0000000000000000e+00 1881 2.0158079999999998e-02 1882 0.0000000000000000e+00 1883 9.1486910000000005e-02 1884 8.0121200000000004e-02 1885 0.0000000000000000e+00 1886 5.4303560000000001e-02 1887 -1.8856540000000001e-02 1888 5.3002939999999998e-02 1889 -4.9459200000000002e-02 1890 3.8157299999999998e-02 1891 1.1053530000000000e-01 1892 5.8329840000000001e-02 1893 5.2273260000000002e-02 1894 -2.5934240000000001e-02 1895 -3.8813279999999999e-02 1896 1.9422129999999999e-02 1897 0.0000000000000000e+00 1898 4.8892390000000001e-02 1899 1.6314510000000001e-02 1900 -3.9870370000000002e-02 1901 -6.7379780000000004e-03 1902 -1.1359290000000000e-01 1903 -3.2990690000000003e-02 1904 6.5370380000000006e-02 1905 1.0141860000000000e-01 1906 9.2129539999999996e-02 1907 -1.9309630000000000e-01 1908 1.6191570000000000e-01 1909 -6.3802049999999999e-03 1910 -3.4190289999999998e-02 1911 -6.2190030000000000e-02 1912 4.3739290000000000e-02 1913 -1.0618039999999999e-01 1914 4.1641919999999999e-02 1915 -8.3153450000000004e-02 1916 -4.3534810000000000e-02 1917 -9.6992369999999994e-02 1918 6.8817240000000002e-02 1919 1.3321970000000000e-01 1920 1.7146510000000000e-02 1921 9.2613470000000003e-02 1922 -2.3063110000000001e-02 1923 -7.5877150000000004e-02 1924 6.0861209999999999e-02 1925 0.0000000000000000e+00 1926 -5.5878959999999998e-02 1927 -1.2628560000000000e-01 1928 -1.3184999999999999e-01 1929 -4.2792809999999998e-01 1930 1.0168919999999999e-01 1931 1.8632779999999999e-01 1932 1.3194080000000000e-01 1933 3.3505960000000001e-01 1934 6.7238090000000000e-02 1935 -7.5468519999999997e-02 1936 -1.6616729999999999e-01 1937 3.9040499999999997e-04 1938 -1.6533800000000001e-01 1939 1.5305400000000000e-02 1940 2.4335630000000001e-04 1941 -1.0761630000000000e-01 1942 7.9119510000000004e-02 1943 1.2016570000000000e-01 1944 4.8639580000000002e-02 1945 1.8993570000000001e-01 1946 4.7289779999999997e-02 1947 -2.1304509999999999e-01 1948 -1.2391060000000000e-01 1949 -2.1513560000000001e-01 1950 6.3175690000000007e-02 1951 -5.3945519999999997e-02 1952 -2.2181490000000001e-01 1953 -9.0230469999999993e-02 1954 9.7244760000000000e-02 1955 -1.2431499999999999e-01 1956 0.0000000000000000e+00 1957 0.0000000000000000e+00 1958 1.7526770000000000e-01 1959 0.0000000000000000e+00 1960 2.0905270000000001e-01 1961 0.0000000000000000e+00 1962 1.8503939999999999e-01 1963 2.9509340000000001e-01 1964 9.3397359999999999e-02 1965 0.0000000000000000e+00 1966 7.2861780000000001e-02 1967 8.2410540000000004e-02 1968 5.8191159999999999e-02 1969 -1.1051610000000001e-01 1970 3.9110390000000002e-02 1971 1.6604869999999999e-01 1972 1.3417330000000000e-01 1973 1.3747640000000000e-01 1974 2.1597179999999999e-01 1975 -1.3035920000000001e-01 1976 2.1250230000000001e-01 1977 0.0000000000000000e+00 1978 6.6351439999999999e-03 1979 -4.0791300000000003e-01 1980 -1.0870810000000000e-01 1981 -5.9688959999999999e-02 1982 -9.7566490000000006e-02 1983 4.7466469999999997e-02 1984 -1.2675429999999999e-01 1985 1.0560430000000001e-02 1986 -4.2599239999999999e-01 1987 -6.2816050000000000e-03 1988 -8.8445230000000000e-02 1989 3.6946470000000002e-02 1990 8.4095779999999995e-02 1991 -2.3372319999999999e-01 1992 -1.9410189999999999e-01 1993 2.9074810000000001e-01 1994 3.2980209999999999e-01 1995 2.0265269999999999e-01 1996 -2.2939730000000000e-01 1997 -1.2316520000000000e-01 1998 -2.5284679999999998e-01 1999 -1.6869880000000001e-01 2000 0.0000000000000000e+00 2001 -2.0754270000000000e-01 2002 -1.1956609999999999e-01 2003 -5.5548200000000003e-01 2004 -2.7600059999999998e-01 2005 -2.9459930000000001e-01 2006 6.4338399999999996e-01 2007 5.1573670000000005e-01 2008 3.6004599999999998e-01 2009 3.5653220000000002e-01 2010 0.0000000000000000e+00 2011 -3.9228839999999998e-01 2012 0.0000000000000000e+00 2013 0.0000000000000000e+00 2014 0.0000000000000000e+00 2015 2.2680529999999999e-01 2016 4.1877370000000004e-03 2017 -7.5731339999999994e-02 2018 3.9869070000000000e-02 2019 6.3602190000000003e-01 2020 2.0203209999999999e-02 2021 1.3184999999999999e-01 2022 -4.1780329999999999e-01 2023 -3.0944199999999999e-01 2024 -1.8622390000000000e-01 2025 -1.0078380000000001e-01 2026 -2.1250230000000001e-01 2027 0.0000000000000000e+00 2028 0.0000000000000000e+00 2029 2.6177450000000002e-01 2030 0.0000000000000000e+00 2031 0.0000000000000000e+00 2032 0.0000000000000000e+00 2033 2.0305470000000000e-01 2034 -2.3681749999999999e-01 2035 -4.4234290000000004e-03 2036 2.3034050000000000e-01 2037 -2.4100989999999999e-02 2038 3.3116350000000000e-01 2039 1.3680059999999999e-01 2040 -1.0334450000000001e-01 2041 -3.3178859999999998e-02 2042 1.0965650000000000e-01 2043 -1.8673609999999999e-01 2044 -6.1221310000000001e-02 2045 -1.8535779999999999e-01 2046 1.0080149999999999e-04 2047 -4.2955480000000001e-01 2048 -1.8949020000000000e-01 2049 -1.8807040000000000e-01 2050 -9.7883349999999994e-02 2051 -1.6425070000000000e-01 2052 9.9065899999999998e-02 2053 6.1363859999999999e-02 2054 -2.9648380000000000e-03 2055 -1.7534730000000001e-01 2056 -1.7890510000000001e-01 2057 -9.6601550000000001e-03 2058 -5.8308739999999998e-02 2059 1.6171109999999999e-04 2060 -4.3163649999999998e-01 2061 -6.8828730000000005e-02 2062 5.8308739999999998e-02 2063 1.1802360000000001e-01 2064 -6.5907469999999996e-02 2065 6.5044320000000003e-02 2066 -2.7704279999999998e-01 2067 -2.7737440000000002e-01 2068 7.1674050000000000e-01 2069 2.5993840000000001e-01 2070 -3.6361539999999998e-01 2071 0.0000000000000000e+00 2072 -1.6858419999999999e-01 2073 0.0000000000000000e+00 2074 1.0679100000000000e-02 2075 1.6616729999999999e-01 2076 -3.3026590000000000e-01 2077 -1.7684860000000000e-02 2078 -4.2897410000000002e-01 2079 0.0000000000000000e+00 2080 -5.9688959999999999e-02 2081 -2.2007130000000000e-01 2082 3.2325769999999997e-02 2083 -9.1994350000000003e-02 2084 1.1291610000000001e-01 2085 -1.0870810000000000e-01 2086 -5.7986469999999998e-02 2087 -2.2787959999999999e-04 2088 -3.9450430000000002e-02 2089 -1.6536819999999999e-01 2090 -1.0450010000000000e-01 2091 0.0000000000000000e+00 2092 0.0000000000000000e+00 2093 2.5495120000000000e-02 2094 -9.5632170000000002e-02 2095 -1.1459419999999999e-01 2096 2.5495120000000000e-02 2097 -2.1064659999999999e-01 2098 -6.1856689999999999e-02 2099 -1.6018660000000001e-02 2100 -2.9755049999999998e-03 2101 -8.7090950000000000e-02 2102 2.0910750000000000e-01 2103 6.1696950000000000e-02 2104 0.0000000000000000e+00 2105 0.0000000000000000e+00 2106 0.0000000000000000e+00 2107 3.9923619999999999e-01 2108 2.1550509999999998e-02 2109 6.3514850000000000e-01 2110 -6.1329570000000000e-02 2111 -7.9348730000000006e-02 2112 2.9982930000000001e-02 2113 1.1596850000000000e-01 2114 -1.1466430000000000e-01 2115 2.0992839999999999e-01 2116 -1.2858410000000001e-01 2117 9.8390019999999995e-02 2118 -1.7645179999999999e-01 2119 0.0000000000000000e+00 2120 0.0000000000000000e+00 2121 1.1117910000000000e-01 2122 0.0000000000000000e+00 2123 -3.5220289999999999e-01 2124 0.0000000000000000e+00 2125 0.0000000000000000e+00 2126 0.0000000000000000e+00 2127 0.0000000000000000e+00 2128 7.6428850000000004e-01 2129 5.3264100000000003e-01 2130 2.8923199999999999e-01 2131 -2.6547589999999999e-01 2132 -1.3080790000000000e-01 2133 1.1325180000000001e-02 2134 3.6938369999999998e-01 2135 1.2380730000000000e-01 2136 -4.1780329999999999e-01 2137 3.2718990000000003e-02 2138 1.0071360000000000e-01 2139 2.5198100000000001e-01 2140 -1.0965650000000000e-01 2141 2.9929070000000002e-01 2142 -1.7045800000000000e-01 2143 3.6496220000000001e-01 2144 -8.9899770000000004e-02 2145 -2.4790690000000001e-01 2146 2.4893290000000001e-01 2147 -3.3078179999999999e-02 2148 -8.8275870000000006e-02 2149 1.9367490000000001e-01 2150 3.5220289999999999e-01 2151 5.1573670000000005e-01 2152 4.1877370000000004e-03 2153 -2.3034050000000000e-01 2154 3.5615930000000001e-01 2155 -1.8141209999999999e-01 2156 1.3644229999999999e-01 2157 -3.6851820000000000e-02 2158 -1.0312620000000000e-01 2159 -1.1970409999999999e-01 2160 -2.4912860000000001e-01 2161 0.0000000000000000e+00 2162 0.0000000000000000e+00 2163 0.0000000000000000e+00 2164 0.0000000000000000e+00 2165 6.9880109999999995e-01 2166 0.0000000000000000e+00 2167 0.0000000000000000e+00 2168 -2.7540279999999999e-03 2169 0.0000000000000000e+00 2170 0.0000000000000000e+00 2171 0.0000000000000000e+00 2172 -2.1314020000000000e-01 2173 -5.3876279999999999e-02 2174 -7.8356380000000003e-02 2175 2.4474779999999999e-01 2176 -2.2007130000000000e-01 2177 9.6811309999999998e-02 2178 -5.7982029999999997e-02 2179 -6.3799149999999999e-02 2180 0.0000000000000000e+00 2181 0.0000000000000000e+00 2182 -9.8578050000000000e-02 2183 0.0000000000000000e+00 2184 2.4112549999999999e-01 2185 0.0000000000000000e+00 2186 0.0000000000000000e+00 2187 0.0000000000000000e+00 2188 0.0000000000000000e+00 2189 -1.0158610000000000e-01 2190 -3.3030240000000000e-01 2191 -2.9472130000000002e-01 2192 1.6144769999999999e-02 2193 2.7737440000000002e-01 2194 2.8230119999999997e-01 2195 -2.1025610000000000e-01 2196 -2.7423750000000002e-01 2197 0.0000000000000000e+00 2198 0.0000000000000000e+00 2199 1.2037740000000000e-01 2200 0.0000000000000000e+00 2201 1.2865420000000000e-01 2202 3.0895010000000001e-01 2203 7.7536099999999997e-02 2204 5.0069059999999999e-02 2205 7.3839589999999997e-02 2206 6.7618220000000007e-02 2207 1.3938149999999999e-01 2208 6.0247700000000001e-02 2209 1.0237499999999999e-01 2210 1.4058770000000001e-01 2211 -8.3139480000000002e-02 2212 -7.6219739999999994e-02 2213 1.1985450000000000e-01 2214 3.0832350000000001e-02 2215 -3.9412639999999999e-02 2216 2.3631130000000000e-01 2217 1.5576019999999999e-01 2218 1.1223550000000000e-01 2219 3.8617489999999997e-02 2220 -8.0044050000000005e-02 2221 9.8550440000000003e-02 2222 1.7559240000000001e-01 2223 3.3264439999999999e-02 2224 1.1357500000000000e-01 2225 -6.5401390000000004e-02 2226 -4.5795490000000001e-02 2227 9.7191369999999999e-02 2228 1.6313030000000001e-01 2229 6.1374659999999998e-02 2230 -9.2668420000000001e-02 2231 1.0333460000000000e-01 2232 1.6365990000000000e-01 2233 4.1835919999999999e-01 2234 2.1951350000000000e-01 2235 0.0000000000000000e+00 2236 7.4120940000000001e-03 2237 6.8097189999999997e-03 2238 1.4700510000000000e-02 2239 2.4150390000000001e-02 2240 1.3770289999999999e-01 2241 1.1422850000000000e-01 2242 2.9134330000000000e-02 2243 8.2621769999999997e-02 2244 -6.5700289999999995e-02 2245 5.5081180000000000e-02 2246 0.0000000000000000e+00 2247 4.1044730000000001e-02 2248 0.0000000000000000e+00 2249 3.3440900000000003e-02 2250 4.6882760000000002e-02 2251 -1.6843029999999998e-02 2252 -8.6680809999999997e-02 2253 7.2645379999999996e-02 2254 3.9626359999999999e-02 2255 -1.0122610000000001e-02 2256 5.0140219999999999e-02 2257 9.1967510000000004e-04 2258 4.7582369999999999e-02 2259 0.0000000000000000e+00 2260 -1.7792740000000001e-01 2261 2.0809250000000001e-01 2262 4.8027580000000000e-02 2263 1.1635990000000000e-01 2264 1.4814550000000001e-01 2265 -2.0926600000000001e-01 2266 1.4780130000000000e-01 2267 2.0208889999999999e-01 2268 -1.0060350000000000e-01 2269 9.0490629999999996e-03 2270 3.5730390000000001e-01 2271 8.3106570000000005e-02 2272 -1.8673110000000001e-01 2273 -4.7193789999999999e-02 2274 4.6191370000000002e-02 2275 2.0429890000000001e-01 2276 1.0851980000000000e-01 2277 1.9979250000000001e-01 2278 -1.0510230000000000e-01 2279 1.5067459999999999e-01 2280 2.8091759999999999e-01 2281 6.1892799999999998e-02 2282 1.2375790000000000e-01 2283 2.2533160000000000e-02 2284 1.2851810000000000e-01 2285 -2.7577200000000002e-01 2286 5.3287880000000003e-02 2287 0.0000000000000000e+00 2288 8.6417560000000004e-02 2289 0.0000000000000000e+00 2290 6.2826530000000005e-02 2291 1.0464100000000000e-01 2292 1.2797130000000001e-01 2293 5.4355880000000002e-02 2294 7.8757330000000000e-02 2295 -8.6354409999999998e-04 2296 6.8680610000000003e-02 2297 1.1963890000000000e-02 2298 -2.0909310000000000e-02 2299 7.1168389999999998e-02 2300 1.0373700000000000e-02 2301 6.7484069999999997e-03 2302 2.0891250000000000e-01 2303 6.0750039999999998e-02 2304 6.1311670000000005e-04 2305 5.1012830000000002e-02 2306 5.6527519999999998e-02 2307 0.0000000000000000e+00 2308 -4.8474550000000002e-05 2309 2.2387570000000001e-01 2310 0.0000000000000000e+00 2311 -1.0261180000000000e-01 2312 0.0000000000000000e+00 2313 -4.2379000000000000e-02 2314 5.1272320000000003e-02 2315 3.9391569999999998e-01 2316 3.7015670000000001e-01 2317 -8.1038810000000003e-02 2318 -4.2810340000000002e-01 2319 3.2893249999999999e-02 2320 -1.9440080000000001e-01 2321 -5.8963550000000003e-02 2322 -2.6527289999999999e-02 2323 6.9783139999999999e-01 2324 0.0000000000000000e+00 2325 2.7260360000000000e-01 2326 9.8407160000000005e-01 2327 0.0000000000000000e+00 2328 -1.9156480000000001e-01 2329 -5.5596820000000002e-01 2330 0.0000000000000000e+00 2331 0.0000000000000000e+00 2332 0.0000000000000000e+00 hypre-2.33.0/src/test/TEST_ams/mfem.b.00002000066400000000000000000001142731477326011500176600ustar00rootroot000000000000002333 3709 2333 0.0000000000000000e+00 2334 0.0000000000000000e+00 2335 2.3227860000000000e-01 2336 2.5257940000000001e-01 2337 7.6065150000000004e-01 2338 2.1183099999999999e-01 2339 0.0000000000000000e+00 2340 2.9893550000000002e-01 2341 0.0000000000000000e+00 2342 0.0000000000000000e+00 2343 2.7628849999999999e-01 2344 2.1149660000000001e-01 2345 1.5547140000000001e-01 2346 0.0000000000000000e+00 2347 -1.1617120000000000e-02 2348 3.5580079999999997e-01 2349 3.5519659999999997e-01 2350 -1.1617120000000000e-02 2351 0.0000000000000000e+00 2352 0.0000000000000000e+00 2353 0.0000000000000000e+00 2354 1.3631460000000001e-01 2355 0.0000000000000000e+00 2356 0.0000000000000000e+00 2357 1.6321500000000000e-01 2358 0.0000000000000000e+00 2359 5.3225750000000002e-02 2360 2.2775400000000001e-01 2361 6.9063600000000003e-02 2362 7.4917180000000000e-02 2363 6.8459320000000004e-02 2364 8.6044339999999997e-02 2365 0.0000000000000000e+00 2366 1.1669210000000001e-01 2367 3.1890819999999998e-01 2368 2.1179940000000000e-01 2369 0.0000000000000000e+00 2370 0.0000000000000000e+00 2371 7.9247550000000000e-02 2372 0.0000000000000000e+00 2373 1.5710520000000000e-01 2374 0.0000000000000000e+00 2375 3.3220169999999999e-01 2376 0.0000000000000000e+00 2377 0.0000000000000000e+00 2378 -9.7884009999999994e-02 2379 -4.0042040000000001e-01 2380 -1.4082449999999999e-01 2381 -2.2348519999999999e-01 2382 -1.1242230000000000e-01 2383 -2.3003899999999999e-01 2384 6.9542800000000002e-02 2385 -3.4023570000000003e-02 2386 8.1348219999999999e-02 2387 1.6266210000000000e-01 2388 -8.7444480000000002e-03 2389 -6.8563630000000000e-02 2390 2.1110970000000000e-02 2391 1.9915600000000000e-01 2392 4.6264050000000001e-02 2393 1.3609430000000000e-02 2394 2.8951529999999998e-01 2395 -1.3833290000000001e-01 2396 -1.0324400000000000e-01 2397 1.7140910000000001e-01 2398 1.3232600000000000e-01 2399 3.1798910000000002e-01 2400 9.7884009999999994e-02 2401 5.3484930000000000e-02 2402 -2.8775160000000001e-02 2403 -6.9542800000000002e-02 2404 7.8526670000000007e-02 2405 -2.9993209999999998e-01 2406 -5.2041699999999996e-18 2407 -7.5388700000000003e-02 2408 8.1796369999999993e-02 2409 -2.1029770000000000e-01 2410 -3.1225020000000001e-17 2411 -1.8197099999999999e-01 2412 5.2060120000000001e-02 2413 4.2102600000000001e-01 2414 -8.4117109999999995e-02 2415 1.4600800000000000e-01 2416 -8.7604769999999998e-02 2417 9.7410529999999995e-02 2418 -3.8535740000000002e-01 2419 6.3976000000000005e-02 2420 -2.5726909999999997e-01 2421 -2.5667010000000001e-01 2422 -2.9625459999999998e-01 2423 -7.4271799999999999e-02 2424 1.5400200000000000e-01 2425 -9.0876410000000005e-02 2426 -2.7790550000000003e-01 2427 -2.3014160000000000e-01 2428 9.5690570000000003e-02 2429 2.9658540000000000e-01 2430 3.1304729999999997e-01 2431 -7.9927570000000003e-02 2432 6.4209179999999999e-01 2433 -6.5545430000000002e-02 2434 -7.4917180000000000e-02 2435 -4.2060130000000001e-02 2436 -8.5484820000000003e-02 2437 1.0833520000000001e-01 2438 -2.4011669999999999e-01 2439 3.0676260000000000e-01 2440 1.9472560000000000e-02 2441 1.6157629999999999e-02 2442 1.6852750000000000e-01 2443 -1.6424580000000000e-01 2444 -1.0409250000000000e-01 2445 1.6424580000000000e-01 2446 -1.6345240000000000e-01 2447 5.5218099999999999e-02 2448 3.7175730000000001e-01 2449 1.6345240000000000e-01 2450 -1.1202139999999999e-01 2451 -1.6345240000000000e-01 2452 5.5218099999999999e-02 2453 1.6345240000000000e-01 2454 1.5527959999999999e-01 2455 3.8737990000000000e-01 2456 -1.7152609999999999e-01 2457 -7.1959879999999998e-01 2458 -1.0115610000000000e-01 2459 5.2566530000000000e-02 2460 1.5943050000000000e-02 2461 -2.2268240000000000e-01 2462 7.9723959999999996e-02 2463 2.1323650000000000e-01 2464 -1.3961229999999999e-01 2465 -4.8124989999999999e-02 2466 3.2856070000000001e-02 2467 9.3883019999999998e-02 2468 -1.6266210000000000e-01 2469 -2.1110970000000000e-02 2470 2.0816679999999999e-17 2471 -2.4829090000000001e-01 2472 3.3977590000000002e-02 2473 3.4694470000000004e-18 2474 -8.4943969999999994e-02 2475 -2.3470750000000001e-01 2476 -8.9446410000000004e-02 2477 -8.2140160000000004e-02 2478 3.5184939999999998e-02 2479 2.7110350000000000e-01 2480 1.1169129999999999e-01 2481 -1.8927959999999999e-01 2482 -2.9700230000000000e-01 2483 -7.2338620000000006e-02 2484 1.1909820000000000e-01 2485 1.4897179999999999e-01 2486 2.2719100000000000e-01 2487 -2.6728320000000000e-01 2488 -1.5994000000000000e-01 2489 -5.3225750000000002e-02 2490 1.0515030000000000e-01 2491 5.3169550000000003e-02 2492 2.3094709999999999e-01 2493 1.2749060000000001e-01 2494 9.0959100000000005e-03 2495 0.0000000000000000e+00 2496 0.0000000000000000e+00 2497 -2.6900410000000000e-02 2498 -5.5387949999999998e-02 2499 0.0000000000000000e+00 2500 -3.8616409999999997e-02 2501 0.0000000000000000e+00 2502 0.0000000000000000e+00 2503 0.0000000000000000e+00 2504 0.0000000000000000e+00 2505 -7.0115490000000003e-02 2506 4.2069299999999997e-02 2507 0.0000000000000000e+00 2508 0.0000000000000000e+00 2509 0.0000000000000000e+00 2510 -2.0029060000000001e-01 2511 0.0000000000000000e+00 2512 -9.0002830000000006e-02 2513 -3.7958999999999998e-01 2514 -1.0833520000000001e-01 2515 -1.0771760000000000e-02 2516 0.0000000000000000e+00 2517 -1.9021460000000000e-02 2518 0.0000000000000000e+00 2519 0.0000000000000000e+00 2520 0.0000000000000000e+00 2521 0.0000000000000000e+00 2522 5.8630570000000000e-02 2523 2.7643259999999997e-01 2524 2.0030080000000000e-01 2525 2.4329219999999999e-02 2526 1.4073980000000000e-02 2527 3.4406720000000002e-02 2528 4.0544890000000000e-02 2529 5.6372100000000001e-03 2530 -5.9476300000000003e-02 2531 2.4677430000000000e-01 2532 7.4171699999999993e-02 2533 -3.3977590000000002e-02 2534 -2.1952569999999999e-01 2535 -8.4112190000000003e-02 2536 -5.8630570000000000e-02 2537 -1.8699130000000000e-01 2538 -4.2765049999999999e-02 2539 -8.9446410000000004e-02 2540 -1.6585960000000000e-01 2541 -1.7523120000000000e-01 2542 -6.1805180000000001e-02 2543 -2.8399990000000000e-02 2544 -4.0544890000000000e-02 2545 2.2154179999999999e-02 2546 1.3171540000000001e-01 2547 1.1759440000000000e-01 2548 -1.3705139999999999e-01 2549 0.0000000000000000e+00 2550 -2.5472149999999999e-01 2551 -4.1111470000000000e-01 2552 -2.9409580000000002e-01 2553 -6.8495560000000000e-01 2554 -2.0087020000000000e-01 2555 0.0000000000000000e+00 2556 0.0000000000000000e+00 2557 0.0000000000000000e+00 2558 0.0000000000000000e+00 2559 0.0000000000000000e+00 2560 0.0000000000000000e+00 2561 -2.2239840000000000e-01 2562 -3.4506110000000001e-01 2563 -2.4816420000000000e-01 2564 -4.5042929999999998e-01 2565 2.0417350000000001e-01 2566 2.7249079999999998e-01 2567 1.7284630000000001e-01 2568 -2.1514920000000001e-01 2569 1.4186389999999999e-01 2570 -1.4181669999999999e-01 2571 -9.0902410000000003e-02 2572 3.2473000000000002e-01 2573 -1.5431390000000000e-01 2574 -9.8720820000000001e-02 2575 2.6287210000000000e-01 2576 7.0115490000000003e-02 2577 -4.9400420000000000e-02 2578 -3.9846540000000003e-01 2579 2.0951119999999999e-04 2580 1.5078090000000000e-01 2581 2.8225159999999999e-01 2582 -7.1239559999999993e-02 2583 2.3094709999999999e-01 2584 1.5078090000000000e-01 2585 2.0951119999999999e-04 2586 -4.9400420000000000e-02 2587 -7.6842690000000005e-02 2588 1.2749060000000001e-01 2589 1.6501560000000001e-01 2590 0.0000000000000000e+00 2591 0.0000000000000000e+00 2592 2.2593949999999999e-01 2593 3.6232189999999997e-01 2594 0.0000000000000000e+00 2595 1.6645360000000001e-01 2596 1.4300560000000001e-01 2597 0.0000000000000000e+00 2598 0.0000000000000000e+00 2599 7.5905100000000003e-02 2600 0.0000000000000000e+00 2601 9.2588350000000000e-02 2602 5.6945450000000002e-02 2603 0.0000000000000000e+00 2604 0.0000000000000000e+00 2605 6.9483219999999998e-02 2606 7.6633179999999995e-02 2607 0.0000000000000000e+00 2608 0.0000000000000000e+00 2609 1.3628899999999999e-01 2610 0.0000000000000000e+00 2611 1.0160719999999999e-01 2612 0.0000000000000000e+00 2613 0.0000000000000000e+00 2614 0.0000000000000000e+00 2615 0.0000000000000000e+00 2616 2.8046200000000000e-02 2617 0.0000000000000000e+00 2618 1.0926460000000000e-01 2619 1.7642440000000001e-01 2620 0.0000000000000000e+00 2621 2.1764020000000001e-01 2622 4.6897100000000003e-01 2623 0.0000000000000000e+00 2624 3.3220169999999999e-01 2625 0.0000000000000000e+00 2626 0.0000000000000000e+00 2627 9.3468999999999997e-02 2628 2.0893740000000000e-01 2629 0.0000000000000000e+00 2630 0.0000000000000000e+00 2631 0.0000000000000000e+00 2632 0.0000000000000000e+00 2633 -6.3738349999999999e-02 2634 -6.0840379999999999e-02 2635 1.4186389999999999e-01 2636 5.7265889999999997e-01 2637 5.0436859999999994e-01 2638 7.5071540000000003e-01 2639 3.2322370000000000e-01 2640 -1.3268070000000000e-02 2641 2.1634729999999999e-01 2642 -1.6582050000000001e-01 2643 -3.1000109999999997e-01 2644 -1.6499759999999999e-01 2645 -4.7041929999999998e-01 2646 -4.2069299999999997e-02 2647 -2.4669269999999999e-01 2648 -1.2818499999999999e-01 2649 -3.9846540000000003e-01 2650 -2.0987910000000001e-01 2651 -1.3856830000000001e-01 2652 -1.9652920000000000e-03 2653 -1.5772320000000001e-01 2654 2.9267260000000000e-01 2655 2.1705780000000000e-01 2656 9.2588350000000000e-02 2657 -1.2818499999999999e-01 2658 -2.4669269999999999e-01 2659 -1.6499759999999999e-01 2660 2.7242070000000002e-01 2661 -9.2030160000000000e-02 2662 -1.1202139999999999e-01 2663 -2.0087020000000000e-01 2664 -2.6571750000000002e-02 2665 -1.0111650000000000e-01 2666 -5.7634390000000002e-01 2667 -2.3479010000000000e-01 2668 -1.5613869999999999e-01 2669 2.2789640000000000e-01 2670 1.0185160000000000e+00 2671 -2.7374300000000001e-01 2672 3.0305630000000000e-01 2673 2.1122140000000000e-01 2674 -2.7242070000000002e-01 2675 8.7293129999999997e-02 2676 5.2362800000000001e-02 2677 -3.4837930000000000e-01 2678 -3.4694470000000004e-18 2679 -1.4004839999999999e-01 2680 -3.9045639999999998e-01 2681 1.0133940000000000e-01 2682 1.3093969999999999e-01 2683 7.8544199999999995e-02 2684 5.8063220000000004e-01 2685 -4.1366769999999997e-02 2686 3.4300789999999998e-01 2687 -1.3064339999999999e-01 2688 -1.4840700000000001e-01 2689 -2.8175760000000000e-01 2690 -2.1823280000000000e-01 2691 -1.3090700000000000e-01 2692 -6.9388940000000007e-18 2693 -2.4839829999999999e-01 2694 -1.7181930000000001e-01 2695 -5.0373979999999999e-02 2696 2.7357789999999998e-01 2697 4.3178299999999997e-01 2698 2.2026019999999999e-01 2699 -2.1675139999999999e-02 2700 -2.5816030000000000e-02 2701 0.0000000000000000e+00 2702 -2.1675139999999999e-02 2703 0.0000000000000000e+00 2704 0.0000000000000000e+00 2705 0.0000000000000000e+00 2706 0.0000000000000000e+00 2707 0.0000000000000000e+00 2708 0.0000000000000000e+00 2709 0.0000000000000000e+00 2710 -1.5709319999999999e-01 2711 0.0000000000000000e+00 2712 0.0000000000000000e+00 2713 0.0000000000000000e+00 2714 0.0000000000000000e+00 2715 -4.5979909999999999e-02 2716 0.0000000000000000e+00 2717 0.0000000000000000e+00 2718 -1.3374100000000000e-01 2719 0.0000000000000000e+00 2720 0.0000000000000000e+00 2721 2.8046200000000000e-02 2722 -3.2443159999999999e-01 2723 0.0000000000000000e+00 2724 0.0000000000000000e+00 2725 -1.1631130000000001e-01 2726 0.0000000000000000e+00 2727 0.0000000000000000e+00 2728 -1.8968760000000001e-01 2729 -1.6047870000000000e-01 2730 0.0000000000000000e+00 2731 -6.0386980000000001e-01 2732 -3.3821319999999999e-01 2733 0.0000000000000000e+00 2734 -1.5431390000000000e-01 2735 -1.7277300000000001e-01 2736 0.0000000000000000e+00 2737 0.0000000000000000e+00 2738 -2.0354050000000001e-01 2739 -3.2512699999999999e-02 2740 -3.8724050000000003e-02 2741 0.0000000000000000e+00 2742 -3.2512699999999999e-02 2743 0.0000000000000000e+00 2744 0.0000000000000000e+00 2745 0.0000000000000000e+00 2746 0.0000000000000000e+00 2747 0.0000000000000000e+00 2748 0.0000000000000000e+00 2749 0.0000000000000000e+00 2750 1.0896830000000000e-01 2751 3.6812070000000002e-02 2752 -2.2305440000000001e-01 2753 -1.0896830000000000e-01 2754 3.7175730000000001e-01 2755 -1.0896830000000000e-01 2756 3.6812070000000002e-02 2757 1.0896830000000000e-01 2758 3.6812070000000002e-02 2759 1.8029890000000001e-01 2760 2.6610929999999999e-01 2761 -1.8128100000000000e-01 2762 -5.6351519999999999e-01 2763 -2.7793430000000001e-03 2764 -6.9862750000000001e-02 2765 1.0896830000000000e-01 2766 -1.0896830000000000e-01 2767 -2.1823280000000000e-01 2768 -1.4840700000000001e-01 2769 -2.8175760000000000e-01 2770 -1.9197510000000001e-01 2771 -3.3263670000000001e-01 2772 5.8980600000000002e-17 2773 -4.1366769999999997e-02 2774 -1.3064339999999999e-01 2775 -1.9596510000000000e-01 2776 -3.3667019999999998e-01 2777 -1.3090700000000000e-01 2778 -1.2143059999999999e-17 2779 -6.2050160000000000e-02 2780 1.2299380000000000e-01 2781 1.5745660000000002e-02 2782 6.1063470000000002e-02 2783 0.0000000000000000e+00 2784 2.9331659999999998e-01 2785 0.0000000000000000e+00 2786 6.1725559999999999e-02 2787 1.7473130000000000e-02 2788 0.0000000000000000e+00 2789 0.0000000000000000e+00 2790 9.2378829999999995e-02 2791 0.0000000000000000e+00 2792 5.4780429999999998e-02 2793 1.2508079999999999e-01 2794 0.0000000000000000e+00 2795 1.6315610000000000e-01 2796 4.1481230000000002e-01 2797 5.4780429999999998e-02 2798 1.2508079999999999e-01 2799 1.6315610000000000e-01 2800 0.0000000000000000e+00 2801 0.0000000000000000e+00 2802 0.0000000000000000e+00 2803 0.0000000000000000e+00 2804 0.0000000000000000e+00 2805 0.0000000000000000e+00 2806 2.4710739999999998e-02 2807 1.5379090000000001e-01 2808 0.0000000000000000e+00 2809 -5.4109140000000000e-01 2810 -1.0909020000000000e+00 2811 -5.4105219999999998e-01 2812 0.0000000000000000e+00 2813 -1.7425670000000001e-02 2814 0.0000000000000000e+00 2815 -1.1617120000000000e-02 2816 0.0000000000000000e+00 2817 -2.1625340000000001e-01 2818 0.0000000000000000e+00 2819 -2.9486390000000001e-01 2820 -3.5249439999999999e-01 2821 3.2660850000000002e-01 2822 1.0341690000000001e-01 2823 1.9780449999999999e-01 2824 1.9958200000000001e-01 2825 2.5460319999999997e-01 2826 1.3093969999999999e-01 2827 7.8544199999999995e-02 2828 -5.0373979999999999e-02 2829 -1.3064339999999999e-01 2830 -4.1366769999999997e-02 2831 -2.8175760000000000e-01 2832 1.8050700000000000e-01 2833 3.7507029999999997e-02 2834 2.2345770000000001e-01 2835 4.6473199999999998e-01 2836 -2.3507020000000001e-01 2837 -1.6195530000000000e-01 2838 0.0000000000000000e+00 2839 -1.8496720000000000e-01 2840 -2.0928240000000001e-01 2841 0.0000000000000000e+00 2842 0.0000000000000000e+00 2843 0.0000000000000000e+00 2844 -1.6047870000000000e-01 2845 -1.0127790000000000e-01 2846 -2.0565790000000000e-01 2847 -1.9277800000000000e-01 2848 -4.0935600000000003e-02 2849 7.7623280000000003e-02 2850 -3.9007979999999998e-02 2851 1.3877790000000000e-17 2852 -1.9405819999999999e-01 2853 -2.2618930000000001e-01 2854 9.0475730000000004e-02 2855 2.6005319999999998e-02 2856 3.4276319999999999e-01 2857 1.1420110000000000e-01 2858 4.4316280000000000e-02 2859 8.7810269999999996e-02 2860 2.1028050000000001e-01 2861 -5.4807729999999999e-02 2862 -4.8124989999999999e-02 2863 -1.0183910000000000e-01 2864 1.6408639999999999e-02 2865 -1.4093020000000000e-02 2866 1.4869080000000001e-01 2867 -4.6566860000000002e-02 2868 -8.6016789999999996e-02 2869 8.4943969999999994e-02 2870 7.9019500000000006e-02 2871 4.1091030000000001e-01 2872 1.8326729999999999e-01 2873 0.0000000000000000e+00 2874 1.4522430000000000e-01 2875 2.7189000000000002e-01 2876 1.4177729999999999e-01 2877 0.0000000000000000e+00 2878 1.1294050000000000e-01 2879 0.0000000000000000e+00 2880 1.5527959999999999e-01 2881 0.0000000000000000e+00 2882 0.0000000000000000e+00 2883 0.0000000000000000e+00 2884 0.0000000000000000e+00 2885 0.0000000000000000e+00 2886 0.0000000000000000e+00 2887 6.7251019999999995e-02 2888 2.8046200000000000e-02 2889 0.0000000000000000e+00 2890 -2.3990800000000001e-01 2891 -2.7015400000000001e-01 2892 -7.8161840000000005e-01 2893 -3.0493340000000002e-01 2894 0.0000000000000000e+00 2895 0.0000000000000000e+00 2896 -5.4803179999999996e-01 2897 0.0000000000000000e+00 2898 0.0000000000000000e+00 2899 -2.9480919999999999e-01 2900 -2.4303710000000001e-01 2901 0.0000000000000000e+00 2902 0.0000000000000000e+00 2903 0.0000000000000000e+00 2904 0.0000000000000000e+00 2905 1.5410440000000000e-01 2906 0.0000000000000000e+00 2907 0.0000000000000000e+00 2908 1.2621969999999999e-01 2909 5.8663310000000002e-01 2910 1.7689099999999999e-01 2911 0.0000000000000000e+00 2912 1.5410440000000000e-01 2913 1.5410440000000000e-01 2914 0.0000000000000000e+00 2915 0.0000000000000000e+00 2916 9.2378829999999995e-02 2917 6.1063470000000002e-02 2918 0.0000000000000000e+00 2919 2.9331659999999998e-01 2920 0.0000000000000000e+00 2921 1.5745660000000002e-02 2922 1.7473130000000000e-02 2923 0.0000000000000000e+00 2924 0.0000000000000000e+00 2925 6.1725559999999999e-02 2926 0.0000000000000000e+00 2927 1.1582760000000000e-01 2928 0.0000000000000000e+00 2929 1.3835870000000000e-01 2930 1.0874660000000000e-01 2931 0.0000000000000000e+00 2932 0.0000000000000000e+00 2933 5.4187840000000001e-02 2934 6.4540080000000000e-02 2935 0.0000000000000000e+00 2936 5.4187840000000001e-02 2937 0.0000000000000000e+00 2938 0.0000000000000000e+00 2939 0.0000000000000000e+00 2940 0.0000000000000000e+00 2941 0.0000000000000000e+00 2942 0.0000000000000000e+00 2943 0.0000000000000000e+00 2944 -6.0715320000000002e-18 2945 0.0000000000000000e+00 2946 0.0000000000000000e+00 2947 0.0000000000000000e+00 2948 0.0000000000000000e+00 2949 0.0000000000000000e+00 2950 0.0000000000000000e+00 2951 7.6455560000000006e-02 2952 8.9250819999999995e-02 2953 0.0000000000000000e+00 2954 1.4148100000000000e-01 2955 4.1481230000000002e-01 2956 7.6455560000000006e-02 2957 8.9250819999999995e-02 2958 1.4148100000000000e-01 2959 0.0000000000000000e+00 2960 0.0000000000000000e+00 2961 0.0000000000000000e+00 2962 0.0000000000000000e+00 2963 0.0000000000000000e+00 2964 8.6356790000000003e-02 2965 1.6380490000000000e-01 2966 0.0000000000000000e+00 2967 0.0000000000000000e+00 2968 1.3492380000000001e-01 2969 1.0649620000000000e-01 2970 0.0000000000000000e+00 2971 3.6921110000000001e-01 2972 0.0000000000000000e+00 2973 6.1935070000000002e-02 2974 5.6945450000000002e-02 2975 0.0000000000000000e+00 2976 0.0000000000000000e+00 2977 7.6487970000000002e-02 2978 0.0000000000000000e+00 2979 5.4187840000000001e-02 2980 6.4540080000000000e-02 2981 0.0000000000000000e+00 2982 5.4187840000000001e-02 2983 0.0000000000000000e+00 2984 0.0000000000000000e+00 2985 0.0000000000000000e+00 2986 0.0000000000000000e+00 2987 0.0000000000000000e+00 2988 0.0000000000000000e+00 2989 0.0000000000000000e+00 2990 -1.3420020000000000e-02 2991 0.0000000000000000e+00 2992 0.0000000000000000e+00 2993 0.0000000000000000e+00 2994 -9.2378829999999995e-02 2995 -1.4881559999999999e-01 2996 -4.7041929999999998e-01 2997 -9.6736210000000003e-02 2998 -5.8501450000000003e-02 2999 -2.0716750000000000e-01 3000 -3.5658620000000002e-01 3001 -9.2378829999999995e-02 3002 -1.4881559999999999e-01 3003 -1.0514880000000000e-01 3004 -3.2512699999999999e-02 3005 -3.8724050000000003e-02 3006 0.0000000000000000e+00 3007 0.0000000000000000e+00 3008 0.0000000000000000e+00 3009 0.0000000000000000e+00 3010 0.0000000000000000e+00 3011 9.2378829999999995e-02 3012 1.0874660000000000e-01 3013 0.0000000000000000e+00 3014 2.9331659999999998e-01 3015 0.0000000000000000e+00 3016 1.3835870000000000e-01 3017 0.0000000000000000e+00 3018 1.1582760000000000e-01 3019 0.0000000000000000e+00 3020 -6.2050160000000000e-02 3021 -1.9596510000000000e-01 3022 1.3305470000000000e-01 3023 1.3935180000000000e-01 3024 0.0000000000000000e+00 3025 0.0000000000000000e+00 3026 0.0000000000000000e+00 3027 0.0000000000000000e+00 3028 2.2181490000000001e-01 3029 0.0000000000000000e+00 3030 1.7526770000000000e-01 3031 0.0000000000000000e+00 3032 1.8503939999999999e-01 3033 0.0000000000000000e+00 3034 2.0905270000000001e-01 3035 3.0895010000000001e-01 3036 5.0069059999999999e-02 3037 7.7536099999999997e-02 3038 1.1051610000000001e-01 3039 7.3839589999999997e-02 3040 -5.8191159999999999e-02 3041 3.9110390000000002e-02 3042 1.6604869999999999e-01 3043 1.3417330000000000e-01 3044 7.6219739999999994e-02 3045 1.6365990000000000e-01 3046 -9.2668420000000001e-02 3047 1.0333460000000000e-01 3048 1.2431499999999999e-01 3049 4.0901189999999998e-01 3050 2.1511259999999999e-01 3051 0.0000000000000000e+00 3052 9.7244760000000000e-02 3053 2.1513560000000001e-01 3054 1.2628560000000000e-01 3055 -9.0230469999999993e-02 3056 -1.3147860000000000e-01 3057 -3.1196539999999998e-02 3058 4.4983519999999999e-01 3059 2.5212229999999999e-02 3060 -2.3755879999999999e-01 3061 -2.8899120000000000e-01 3062 -1.1135670000000000e-01 3063 2.1958700000000000e-01 3064 3.5413689999999998e-02 3065 -5.3128170000000002e-02 3066 1.1112400000000000e-01 3067 -2.4335630000000001e-04 3068 -1.6533800000000001e-01 3069 -3.2940090000000000e-01 3070 1.5305400000000000e-02 3071 -1.0110090000000000e-02 3072 -3.7732839999999997e-02 3073 1.9966110000000001e-01 3074 -1.9781389999999999e-01 3075 -2.1652560000000001e-01 3076 -3.6196250000000000e-03 3077 -1.2375790000000000e-01 3078 -1.2851810000000000e-01 3079 9.1202569999999997e-02 3080 1.3614210000000000e-02 3081 8.6155659999999995e-02 3082 1.0775260000000000e-02 3083 1.3524430000000001e-01 3084 1.0775260000000000e-02 3085 -1.1310779999999999e-01 3086 1.0816990000000000e-02 3087 -1.0982219999999999e-01 3088 7.7991359999999996e-02 3089 -1.4359279999999999e-01 3090 4.6850799999999998e-02 3091 -6.4152669999999995e-02 3092 8.3106570000000005e-02 3093 3.9089910000000000e-01 3094 1.2391060000000000e-01 3095 -2.5764100000000001e-01 3096 2.1457820000000000e-01 3097 1.0510230000000000e-01 3098 2.0075019999999999e-01 3099 2.2533160000000000e-02 3100 -1.5014000000000000e-01 3101 1.0559600000000000e-01 3102 -4.7289779999999997e-02 3103 -1.0851980000000000e-01 3104 1.6029900000000000e-01 3105 -2.0429890000000001e-01 3106 -1.1223550000000000e-01 3107 1.0060350000000000e-01 3108 1.9979250000000001e-01 3109 1.8993570000000001e-01 3110 -2.1304509999999999e-01 3111 -6.7238090000000000e-02 3112 4.4632570000000000e-03 3113 -5.4016710000000003e-02 3114 6.3034620000000000e-02 3115 4.5043189999999997e-03 3116 -5.6020029999999998e-02 3117 -4.4632570000000000e-03 3118 0.0000000000000000e+00 3119 -9.7176200000000004e-02 3120 0.0000000000000000e+00 3121 -1.6990350000000001e-01 3122 0.0000000000000000e+00 3123 -8.6415080000000005e-02 3124 0.0000000000000000e+00 3125 -1.9269739999999999e-01 3126 -7.1168389999999998e-02 3127 -4.3679610000000001e-02 3128 2.0891250000000000e-01 3129 1.2218130000000001e-01 3130 -1.0804260000000000e-01 3131 -1.6536809999999999e-01 3132 -6.2343110000000000e-02 3133 -2.0909310000000000e-02 3134 -7.8757330000000000e-02 3135 1.0373700000000000e-02 3136 -6.2826530000000005e-02 3137 -7.7688510000000002e-03 3138 0.0000000000000000e+00 3139 -1.9556960000000002e-02 3140 9.0294639999999995e-02 3141 -7.3830229999999997e-02 3142 -9.4125260000000002e-02 3143 3.3044509999999999e-01 3144 -2.3620980000000000e-01 3145 -3.6851820000000000e-02 3146 -2.2680529999999999e-01 3147 -2.0262140000000001e-01 3148 -2.4100989999999999e-02 3149 1.3644229999999999e-01 3150 1.1935440000000000e-01 3151 -1.0312620000000000e-01 3152 2.3034050000000000e-01 3153 -6.5907469999999996e-02 3154 5.8308739999999998e-02 3155 1.8698310000000001e-01 3156 -2.4912860000000001e-01 3157 1.0080149999999999e-04 3158 -1.1776920000000000e-01 3159 -1.9367490000000001e-01 3160 -2.2387570000000001e-01 3161 -5.3287880000000003e-02 3162 1.8949020000000000e-01 3163 -7.8043860000000007e-02 3164 1.2265020000000000e-01 3165 6.0852629999999998e-02 3166 -1.6858419999999999e-01 3167 0.0000000000000000e+00 3168 3.2990690000000003e-02 3169 -1.0469340000000001e-02 3170 2.8804010000000002e-01 3171 2.1457820000000000e-01 3172 -3.5927429999999999e-01 3173 -3.0944199999999999e-01 3174 2.9316310000000001e-01 3175 9.8578050000000000e-02 3176 7.8356380000000003e-02 3177 2.2899749999999999e-01 3178 -2.4112549999999999e-01 3179 -1.0158610000000000e-01 3180 -2.1511259999999999e-01 3181 0.0000000000000000e+00 3182 0.0000000000000000e+00 3183 2.1314020000000000e-01 3184 0.0000000000000000e+00 3185 0.0000000000000000e+00 3186 0.0000000000000000e+00 3187 9.0925480000000003e-02 3188 1.9352469999999999e-01 3189 0.0000000000000000e+00 3190 1.0167000000000000e-01 3191 1.1058570000000000e-02 3192 6.5370380000000006e-02 3193 -1.1387730000000000e-01 3194 1.6228790000000001e-01 3195 4.6191370000000002e-02 3196 3.9612139999999997e-02 3197 -3.9879369999999997e-02 3198 6.4303449999999998e-02 3199 -1.8652240000000000e-01 3200 1.5165140000000001e-02 3201 8.4908269999999997e-01 3202 3.1066749999999999e-01 3203 2.9349310000000001e-01 3204 1.0110090000000000e-02 3205 3.5067640000000000e-01 3206 -3.8085740000000001e-01 3207 -9.6040170000000002e-01 3208 -9.0001629999999999e-02 3209 1.8028309999999999e-02 3210 7.5071979999999996e-03 3211 -5.7026089999999996e-01 3212 -6.3779329999999995e-02 3213 1.7958760000000001e-02 3214 -1.0706719999999999e-03 3215 1.5200430000000001e-01 3216 4.4484790000000002e-01 3217 -2.6718629999999999e-01 3218 -1.4933530000000000e-01 3219 -3.8672449999999997e-02 3220 -2.0986569999999999e-01 3221 2.6244459999999997e-01 3222 -9.5241770000000003e-02 3223 5.7571910000000004e-01 3224 -2.5228560000000000e-01 3225 -2.6177450000000002e-01 3226 2.1550509999999998e-02 3227 -6.3602190000000003e-01 3228 -6.1329570000000000e-02 3229 1.1596850000000000e-01 3230 6.3514850000000000e-01 3231 3.9923619999999999e-01 3232 -1.1466430000000000e-01 3233 -7.9348730000000006e-02 3234 -6.5044320000000003e-02 3235 2.9982930000000001e-02 3236 -6.7585240000000005e-02 3237 -1.2858410000000001e-01 3238 2.0992839999999999e-01 3239 -1.7645179999999999e-01 3240 9.8390019999999995e-02 3241 4.7788740000000003e-02 3242 0.0000000000000000e+00 3243 0.0000000000000000e+00 3244 -3.9869070000000000e-02 3245 4.0413360000000002e-02 3246 -8.0399659999999998e-02 3247 -9.6811309999999998e-02 3248 0.0000000000000000e+00 3249 1.8622390000000000e-01 3250 0.0000000000000000e+00 3251 0.0000000000000000e+00 3252 0.0000000000000000e+00 3253 -5.7624100000000000e-01 3254 -1.2835210000000000e-01 3255 -7.1835040000000003e-03 3256 -3.5745490000000002e-01 3257 -1.1151580000000000e-01 3258 1.1911700000000000e-01 3259 7.9411330000000002e-02 3260 -1.9852829999999999e-01 3261 -8.9196670000000006e-02 3262 6.1068790000000000e-03 3263 -2.4135850000000000e-01 3264 -2.5275229999999999e-02 3265 4.3670419999999999e-01 3266 -1.3885929999999999e-01 3267 -2.0273200000000000e-01 3268 -5.2313960000000004e-01 3269 -1.2113790000000001e-01 3270 -1.6261080000000000e-01 3271 -1.4894959999999999e-01 3272 5.5015010000000004e-04 3273 2.0147899999999999e-01 3274 -7.1350520000000001e-02 3275 4.9762580000000001e-01 3276 -4.0586119999999998e-01 3277 6.4454090000000006e-02 3278 1.3469220000000001e-01 3279 -2.4779550000000000e-01 3280 -1.1429990000000000e-01 3281 3.9228839999999998e-01 3282 3.2325769999999997e-02 3283 -2.2007130000000000e-01 3284 -5.9688959999999999e-02 3285 -9.1994350000000003e-02 3286 -5.7986469999999998e-02 3287 5.5548200000000003e-01 3288 2.2939730000000000e-01 3289 -4.0791300000000003e-01 3290 -1.0870810000000000e-01 3291 -2.2787959999999999e-04 3292 1.1291610000000001e-01 3293 -1.2679420000000000e-01 3294 -1.2675429999999999e-01 3295 -9.7566490000000006e-02 3296 -8.7090950000000000e-02 3297 -1.0137790000000001e-01 3298 2.0910750000000000e-01 3299 6.1696950000000000e-02 3300 -1.7878970000000000e-01 3301 -1.0029210000000000e-01 3302 0.0000000000000000e+00 3303 0.0000000000000000e+00 3304 -6.7355600000000002e-02 3305 1.1956609999999999e-01 3306 1.1117910000000000e-01 3307 0.0000000000000000e+00 3308 -3.6004599999999998e-01 3309 0.0000000000000000e+00 3310 0.0000000000000000e+00 3311 0.0000000000000000e+00 3312 -9.5632170000000002e-02 3313 -3.9391569999999998e-01 3314 2.5495120000000000e-02 3315 2.9074810000000001e-01 3316 -1.1459419999999999e-01 3317 8.9196670000000006e-02 3318 -2.5495120000000000e-02 3319 -2.1064659999999999e-01 3320 -1.1459419999999999e-01 3321 4.1797840000000003e-01 3322 2.7146819999999999e-01 3323 -2.3372319999999999e-01 3324 -1.9410189999999999e-01 3325 -7.1835040000000003e-03 3326 -7.1835040000000003e-03 3327 -2.2007130000000000e-01 3328 -6.0861209999999999e-02 3329 2.4474779999999999e-01 3330 6.2190030000000000e-02 3331 -3.3010699999999998e-01 3332 -5.3876279999999999e-02 3333 1.6316520000000001e-01 3334 -1.1537219999999999e-01 3335 1.5332390000000001e-01 3336 -3.3567369999999999e-02 3337 1.1489220000000000e-01 3338 -6.3799149999999999e-02 3339 1.6261080000000000e-01 3340 9.6811309999999998e-02 3341 -5.7982029999999997e-02 3342 -4.3739290000000000e-02 3343 2.2209400000000001e-01 3344 -2.1025610000000000e-01 3345 1.1693300000000000e-01 3346 1.4894959999999999e-01 3347 1.3999170000000000e-01 3348 0.0000000000000000e+00 3349 0.0000000000000000e+00 3350 -2.6942239999999999e-02 3351 -1.1475490000000001e-01 3352 3.2893249999999999e-02 3353 0.0000000000000000e+00 3354 0.0000000000000000e+00 3355 0.0000000000000000e+00 3356 6.0861209999999999e-02 3357 0.0000000000000000e+00 3358 -3.1042940000000002e-01 3359 1.4806269999999999e-01 3360 2.3753450000000001e-01 3361 1.2043180000000001e-01 3362 1.9852829999999999e-01 3363 2.0147899999999999e-01 3364 5.5015010000000004e-04 3365 -7.2385190000000002e-02 3366 1.4839749999999999e-01 3367 2.8830240000000001e-01 3368 7.4387619999999998e-03 3369 4.3112929999999999e-01 3370 9.7499930000000001e-01 3371 1.6018660000000001e-02 3372 3.6396919999999999e-01 3373 -9.8478909999999997e-01 3374 -1.4806269999999999e-01 3375 2.7997270000000002e-01 3376 -3.0610840000000000e-01 3377 -2.6473419999999998e-01 3378 -8.2233130000000002e-02 3379 -2.7682420000000002e-01 3380 -3.6946470000000002e-02 3381 -1.4235059999999999e-01 3382 8.0100859999999996e-02 3383 8.9363729999999997e-01 3384 -8.0822229999999995e-02 3385 -6.0097710000000004e-01 3386 -3.1656390000000001e-01 3387 1.4861310000000001e-02 3388 -2.8278100000000000e-01 3389 7.3840449999999997e-04 3390 1.5929970000000002e-02 3391 6.5174529999999997e-01 3392 -8.0770670000000003e-02 3393 2.2787959999999999e-04 3394 8.3455320000000000e-02 3395 6.1696950000000000e-02 3396 0.0000000000000000e+00 3397 0.0000000000000000e+00 3398 -1.0237499999999999e-01 3399 1.1985450000000000e-01 3400 1.5576019999999999e-01 3401 -3.9412639999999999e-02 3402 2.3631130000000000e-01 3403 3.0832350000000001e-02 3404 -6.7618220000000007e-02 3405 -1.7146510000000000e-02 3406 1.1357500000000000e-01 3407 3.3264439999999999e-02 3408 1.7534730000000001e-01 3409 -1.3938149999999999e-01 3410 3.8617489999999997e-02 3411 -6.5401390000000004e-02 3412 -1.7559240000000001e-01 3413 -2.4150390000000001e-02 3414 3.4190289999999998e-02 3415 1.4058770000000001e-01 3416 8.3139480000000002e-02 3417 6.1374659999999998e-02 3418 1.6313030000000001e-01 3419 9.7191369999999999e-02 3420 -4.5795490000000001e-02 3421 -4.3796750000000001e-01 3422 1.3194080000000000e-01 3423 -1.3005310000000000e-01 3424 1.6990810000000001e-01 3425 -7.5468519999999997e-02 3426 -3.3078179999999999e-02 3427 -8.8275870000000006e-02 3428 -1.0334450000000001e-01 3429 -2.1597179999999999e-01 3430 1.0761630000000000e-01 3431 8.6440690000000001e-02 3432 4.8639580000000002e-02 3433 1.2016570000000000e-01 3434 7.9119510000000004e-02 3435 1.3747640000000000e-01 3436 -8.2410540000000004e-02 3437 -1.3035920000000001e-01 3438 2.1703720000000001e-01 3439 0.0000000000000000e+00 3440 -4.8474550000000002e-05 3441 2.7577200000000002e-01 3442 -2.9509340000000001e-01 3443 1.7890510000000001e-01 3444 -1.1963890000000000e-02 3445 -2.8091759999999999e-01 3446 -8.0835569999999995e-02 3447 -4.2955480000000001e-01 3448 9.6601550000000001e-03 3449 -2.9648380000000000e-03 3450 1.8807040000000000e-01 3451 1.8535779999999999e-01 3452 2.7540279999999999e-03 3453 -1.0464100000000000e-01 3454 -9.3397359999999999e-02 3455 0.0000000000000000e+00 3456 1.0078380000000001e-01 3457 1.5067459999999999e-01 3458 -1.4780130000000000e-01 3459 6.1892799999999998e-02 3460 2.0208889999999999e-01 3461 -1.9309630000000000e-01 3462 -4.8892390000000001e-02 3463 3.2990690000000003e-02 3464 1.0141860000000000e-01 3465 9.2129539999999996e-02 3466 1.0469340000000001e-02 3467 9.6992369999999994e-02 3468 -1.3321970000000000e-01 3469 6.7379780000000004e-03 3470 1.0158610000000000e-01 3471 0.0000000000000000e+00 3472 9.0490629999999996e-03 3473 -6.3030580000000003e-02 3474 -6.4454090000000006e-02 3475 0.0000000000000000e+00 3476 8.6417560000000004e-02 3477 0.0000000000000000e+00 3478 7.2861780000000001e-02 3479 8.6354409999999998e-04 3480 6.8680610000000003e-02 3481 -1.2797130000000001e-01 3482 9.7883349999999994e-02 3483 -6.1221310000000001e-02 3484 5.0237980000000004e-01 3485 -5.6659060000000006e-01 3486 -3.4052209999999999e-01 3487 -4.4212139999999997e-02 3488 -1.3998099999999999e-01 3489 -6.1947430000000003e-01 3490 3.5820239999999998e-01 3491 2.6697760000000001e-02 3492 -4.1004610000000002e-01 3493 1.6029900000000000e-01 3494 1.0559600000000000e-01 3495 -1.5014000000000000e-01 3496 0.0000000000000000e+00 3497 0.0000000000000000e+00 3498 2.1951350000000000e-01 3499 0.0000000000000000e+00 3500 3.5220289999999999e-01 3501 7.6428850000000004e-01 3502 2.0754270000000000e-01 3503 5.3264100000000003e-01 3504 9.8407160000000005e-01 3505 2.7260360000000000e-01 3506 2.6527289999999999e-02 3507 2.7600059999999998e-01 3508 3.6361539999999998e-01 3509 -2.5993840000000001e-01 3510 0.0000000000000000e+00 3511 0.0000000000000000e+00 3512 -2.9459930000000001e-01 3513 6.2816050000000000e-03 3514 5.1573670000000005e-01 3515 -2.0265269999999999e-01 3516 6.4338399999999996e-01 3517 3.5653220000000002e-01 3518 1.6869880000000001e-01 3519 0.0000000000000000e+00 3520 0.0000000000000000e+00 3521 0.0000000000000000e+00 3522 0.0000000000000000e+00 3523 -6.9783139999999999e-01 3524 -8.4095779999999995e-02 3525 -4.7466469999999997e-02 3526 -1.0560430000000001e-02 3527 -8.8445230000000000e-02 3528 -6.6351439999999999e-03 3529 -1.2316520000000000e-01 3530 3.2980209999999999e-01 3531 -2.5284679999999998e-01 3532 -1.5076100000000001e-01 3533 0.0000000000000000e+00 3534 7.1500620000000004e-01 3535 -5.3129919999999997e-01 3536 -1.4693200000000001e-01 3537 -2.6697760000000001e-02 3538 -2.9755049999999998e-03 3539 -2.2209400000000001e-01 3540 -6.6398029999999997e-02 3541 3.7015670000000001e-01 3542 -8.1038810000000003e-02 3543 1.6018660000000001e-02 3544 -1.4410190000000000e-01 3545 3.2893249999999999e-02 3546 -1.3999170000000000e-01 3547 9.6277320000000000e-02 3548 1.0450010000000000e-01 3549 -2.4474779999999999e-01 3550 -2.1025610000000000e-01 3551 -4.3739290000000000e-02 3552 1.1693300000000000e-01 3553 6.3799149999999999e-02 3554 0.0000000000000000e+00 3555 0.0000000000000000e+00 3556 -1.1489220000000000e-01 3557 -1.1475490000000001e-01 3558 2.6942239999999999e-02 3559 5.8963550000000003e-02 3560 0.0000000000000000e+00 3561 0.0000000000000000e+00 3562 0.0000000000000000e+00 3563 1.4693200000000001e-01 3564 2.7492420000000001e-01 3565 0.0000000000000000e+00 3566 -2.2007130000000000e-01 3567 -5.3876279999999999e-02 3568 1.5332390000000001e-01 3569 -5.7982029999999997e-02 3570 -3.3567369999999999e-02 3571 6.2190030000000000e-02 3572 1.6896310000000000e-01 3573 -8.0523429999999993e-02 3574 -1.2283750000000000e-01 3575 5.2503370000000001e-02 3576 0.0000000000000000e+00 3577 0.0000000000000000e+00 3578 0.0000000000000000e+00 3579 -1.3673479999999999e-01 3580 -2.2316289999999999e-02 3581 -9.1156539999999994e-02 3582 1.3389770000000000e-02 3583 2.2789129999999999e-01 3584 8.9265140000000000e-03 3585 -7.0606030000000000e-02 3586 -2.6426470000000001e-02 3587 9.7032499999999994e-02 3588 0.0000000000000000e+00 3589 0.0000000000000000e+00 3590 0.0000000000000000e+00 3591 0.0000000000000000e+00 3592 0.0000000000000000e+00 3593 0.0000000000000000e+00 3594 0.0000000000000000e+00 3595 8.3387059999999999e-02 3596 6.6398029999999997e-02 3597 -9.6277320000000000e-02 3598 9.5632170000000002e-02 3599 -2.7450160000000001e-01 3600 1.1151580000000000e-01 3601 5.5791340000000002e-02 3602 2.6697760000000001e-02 3603 -2.9755049999999998e-03 3604 6.1856689999999999e-02 3605 -2.9755049999999998e-03 3606 0.0000000000000000e+00 3607 0.0000000000000000e+00 3608 -1.9440080000000001e-01 3609 3.9450430000000002e-02 3610 0.0000000000000000e+00 3611 0.0000000000000000e+00 3612 5.9688959999999999e-02 3613 0.0000000000000000e+00 3614 2.9734709999999998e-01 3615 1.4410190000000000e-01 3616 0.0000000000000000e+00 3617 0.0000000000000000e+00 3618 -1.0450010000000000e-01 3619 -3.9450430000000002e-02 3620 -1.6536819999999999e-01 3621 1.0870810000000000e-01 3622 -1.6018660000000001e-02 3623 2.5781640000000002e-02 3624 -5.3618239999999995e-01 3625 -3.5745490000000002e-01 3626 7.9411330000000002e-02 3627 -1.4076970000000000e-01 3628 3.9391569999999998e-01 3629 -5.3129919999999997e-01 3630 -5.5596820000000002e-01 3631 5.9087350000000005e-01 3632 1.6616729999999999e-01 3633 4.9339880000000003e-02 3634 -1.9156480000000001e-01 3635 -1.0168919999999999e-01 3636 2.7737440000000002e-01 3637 0.0000000000000000e+00 3638 0.0000000000000000e+00 3639 -8.0399659999999998e-02 3640 -4.0413360000000002e-02 3641 1.6896310000000000e-01 3642 -1.2283750000000000e-01 3643 -8.0523429999999993e-02 3644 7.0606030000000000e-02 3645 0.0000000000000000e+00 3646 0.0000000000000000e+00 3647 0.0000000000000000e+00 3648 -9.1156539999999994e-02 3649 -2.2316289999999999e-02 3650 -7.8488310000000006e-02 3651 -5.2503370000000001e-02 3652 0.0000000000000000e+00 3653 0.0000000000000000e+00 3654 0.0000000000000000e+00 3655 3.9040499999999997e-04 3656 2.8230119999999997e-01 3657 1.4076970000000000e-01 3658 3.9040499999999997e-04 3659 2.8493429999999997e-01 3660 3.3592450000000001e-01 3661 2.5781640000000002e-02 3662 -3.5745490000000002e-01 3663 1.1911700000000000e-01 3664 4.2599239999999999e-01 3665 9.7566490000000006e-02 3666 -1.9410189999999999e-01 3667 -2.3372319999999999e-01 3668 -2.9074810000000001e-01 3669 -1.6316520000000001e-01 3670 5.0681209999999999e-01 3671 5.5017839999999996e-01 3672 -9.1994350000000003e-02 3673 1.1291610000000001e-01 3674 -4.0791300000000003e-01 3675 -1.2675429999999999e-01 3676 -2.2007130000000000e-01 3677 3.2325769999999997e-02 3678 2.3425720000000000e-01 3679 -1.2679420000000000e-01 3680 -5.7986469999999998e-02 3681 0.0000000000000000e+00 3682 0.0000000000000000e+00 3683 0.0000000000000000e+00 3684 0.0000000000000000e+00 3685 2.0910750000000000e-01 3686 -1.7878970000000000e-01 3687 -8.7090950000000000e-02 3688 -3.7015670000000001e-01 3689 -1.9440080000000001e-01 3690 -5.8963550000000003e-02 3691 -5.3129919999999997e-01 3692 3.9391569999999998e-01 3693 3.2893249999999999e-02 3694 -8.1038810000000003e-02 3695 0.0000000000000000e+00 3696 0.0000000000000000e+00 3697 0.0000000000000000e+00 3698 -5.3618239999999995e-01 3699 -1.9852829999999999e-01 3700 7.9411330000000002e-02 3701 5.9087350000000005e-01 3702 -1.4839749999999999e-01 3703 2.8230119999999997e-01 3704 7.2385190000000002e-02 3705 -3.5927429999999999e-01 3706 -3.0944199999999999e-01 3707 -2.4112549999999999e-01 3708 0.0000000000000000e+00 3709 0.0000000000000000e+00 hypre-2.33.0/src/test/TEST_ams/mfem.b.00003000066400000000000000000001137431477326011500176620ustar00rootroot000000000000003710 5080 3710 -4.5979909999999999e-02 3711 0.0000000000000000e+00 3712 0.0000000000000000e+00 3713 0.0000000000000000e+00 3714 0.0000000000000000e+00 3715 -5.4764080000000000e-02 3716 0.0000000000000000e+00 3717 -4.5979909999999999e-02 3718 0.0000000000000000e+00 3719 0.0000000000000000e+00 3720 0.0000000000000000e+00 3721 1.3093969999999999e-01 3722 7.8544199999999995e-02 3723 7.0439390000000002e-01 3724 2.0816679999999999e-17 3725 1.0341690000000001e-01 3726 1.3305470000000000e-01 3727 8.7293129999999997e-02 3728 2.4234910000000001e-01 3729 -1.3064339999999999e-01 3730 -4.1366769999999997e-02 3731 -3.3263670000000001e-01 3732 5.2362800000000001e-02 3733 -4.2263640000000002e-01 3734 -2.1823280000000000e-01 3735 -1.9197510000000001e-01 3736 -1.3877790000000000e-17 3737 -2.8175760000000000e-01 3738 -5.0373979999999999e-02 3739 3.2660850000000002e-01 3740 1.9958200000000001e-01 3741 2.5460319999999997e-01 3742 -6.2050160000000000e-02 3743 -1.9596510000000000e-01 3744 -1.4840700000000001e-01 3745 -1.3090700000000000e-01 3746 -1.0619629999999999e-01 3747 -1.8496720000000000e-01 3748 -1.6047870000000000e-01 3749 0.0000000000000000e+00 3750 -7.3329140000000004e-01 3751 0.0000000000000000e+00 3752 -2.0029379999999999e-01 3753 -2.1524280000000001e-01 3754 0.0000000000000000e+00 3755 0.0000000000000000e+00 3756 -1.5431390000000000e-01 3757 -1.7277300000000001e-01 3758 0.0000000000000000e+00 3759 0.0000000000000000e+00 3760 -2.3094709999999999e-01 3761 -2.0928240000000001e-01 3762 0.0000000000000000e+00 3763 0.0000000000000000e+00 3764 -3.2512699999999999e-02 3765 -3.8724050000000003e-02 3766 0.0000000000000000e+00 3767 -3.2512699999999999e-02 3768 0.0000000000000000e+00 3769 0.0000000000000000e+00 3770 0.0000000000000000e+00 3771 0.0000000000000000e+00 3772 0.0000000000000000e+00 3773 0.0000000000000000e+00 3774 0.0000000000000000e+00 3775 1.3877790000000000e-17 3776 9.6939949999999997e-02 3777 5.7874769999999998e-01 3778 7.8090179999999995e-02 3779 -1.3015030000000000e-01 3780 -2.9993209999999998e-01 3781 8.1796369999999993e-02 3782 1.4600800000000000e-01 3783 9.5690570000000003e-02 3784 -8.5133990000000007e-02 3785 2.1279590000000001e-01 3786 -9.2378829999999995e-02 3787 3.7507029999999997e-02 3788 -1.0514880000000000e-01 3789 3.2353539999999997e-01 3790 3.8976919999999998e-01 3791 -3.5465980000000003e-01 3792 -1.4881559999999999e-01 3793 -2.7242070000000002e-01 3794 -9.2030160000000000e-02 3795 -1.4870290000000000e-01 3796 2.7242070000000002e-01 3797 -1.6803219999999999e-01 3798 2.7242070000000002e-01 3799 -9.2030160000000000e-02 3800 -2.7242070000000002e-01 3801 -2.2305440000000001e-01 3802 2.7242070000000002e-01 3803 -9.2030160000000000e-02 3804 -2.7242070000000002e-01 3805 -1.1202139999999999e-01 3806 -2.5389950000000000e-01 3807 -7.1492239999999996e-01 3808 3.2089329999999999e-01 3809 1.3801470000000000e+00 3810 -2.1045710000000001e-01 3811 2.9029100000000002e-01 3812 3.0696600000000002e-01 3813 -2.3334189999999999e-01 3814 3.0305630000000000e-01 3815 -2.3479010000000000e-01 3816 -2.6571750000000002e-02 3817 -3.0653270000000000e-02 3818 0.0000000000000000e+00 3819 0.0000000000000000e+00 3820 0.0000000000000000e+00 3821 0.0000000000000000e+00 3822 0.0000000000000000e+00 3823 -2.9409580000000002e-01 3824 -2.6567520000000000e-01 3825 0.0000000000000000e+00 3826 -2.5074550000000001e-01 3827 0.0000000000000000e+00 3828 0.0000000000000000e+00 3829 0.0000000000000000e+00 3830 0.0000000000000000e+00 3831 1.5410440000000000e-01 3832 1.2621969999999999e-01 3833 1.7689099999999999e-01 3834 0.0000000000000000e+00 3835 0.0000000000000000e+00 3836 0.0000000000000000e+00 3837 2.0951119999999999e-04 3838 1.5078090000000000e-01 3839 2.8225159999999999e-01 3840 2.6287210000000000e-01 3841 -7.1239559999999993e-02 3842 -7.6842690000000005e-02 3843 1.2749060000000001e-01 3844 1.8816769999999999e-01 3845 2.6287210000000000e-01 3846 -1.5018419999999999e-01 3847 2.3094709999999999e-01 3848 1.2749060000000001e-01 3849 1.4625360000000001e-01 3850 -7.6842690000000005e-02 3851 2.3094709999999999e-01 3852 1.5078090000000000e-01 3853 2.0951119999999999e-04 3854 -4.9400420000000000e-02 3855 -3.9846540000000003e-01 3856 -1.5431390000000000e-01 3857 -9.8720820000000001e-02 3858 -5.9769810000000001e-01 3859 -1.8513050000000000e-01 3860 -9.8720820000000001e-02 3861 -1.5431390000000000e-01 3862 -4.9400420000000000e-02 3863 -1.0896830000000000e-01 3864 3.6812070000000002e-02 3865 3.7175730000000001e-01 3866 1.0896830000000000e-01 3867 -2.2305440000000001e-01 3868 -1.8128100000000000e-01 3869 -6.9862750000000001e-02 3870 1.8029890000000001e-01 3871 -2.7793430000000001e-03 3872 1.9958200000000001e-01 3873 7.8919749999999997e-02 3874 6.2018709999999999e-01 3875 7.8544199999999995e-02 3876 1.0341690000000001e-01 3877 3.2660850000000002e-01 3878 2.3615359999999999e-01 3879 -3.2601459999999999e-02 3880 1.3093969999999999e-01 3881 2.5460319999999997e-01 3882 -5.0373979999999999e-02 3883 -2.4669269999999999e-01 3884 -1.6499759999999999e-01 3885 -4.7041929999999998e-01 3886 -1.5772320000000001e-01 3887 -2.0987910000000001e-01 3888 2.9267260000000000e-01 3889 -1.9652920000000000e-03 3890 1.8816769999999999e-01 3891 -1.5772320000000001e-01 3892 3.4273340000000002e-01 3893 -1.3856830000000001e-01 3894 -1.6499759999999999e-01 3895 -8.7752170000000004e-02 3896 -2.4669269999999999e-01 3897 -1.2818499999999999e-01 3898 -3.9846540000000003e-01 3899 9.2588350000000000e-02 3900 2.1705780000000000e-01 3901 9.9616349999999998e-01 3902 1.1107830000000000e-01 3903 -1.3856830000000001e-01 3904 -1.9652920000000000e-03 3905 2.9267260000000000e-01 3906 2.1705780000000000e-01 3907 9.2588350000000000e-02 3908 -1.2818499999999999e-01 3909 0.0000000000000000e+00 3910 0.0000000000000000e+00 3911 5.5787349999999996e-03 3912 0.0000000000000000e+00 3913 2.2995220000000000e-01 3914 1.0439420000000001e-01 3915 0.0000000000000000e+00 3916 0.0000000000000000e+00 3917 0.0000000000000000e+00 3918 1.1515460000000000e-01 3919 1.0156430000000000e-01 3920 -2.8716090000000000e-01 3921 0.0000000000000000e+00 3922 0.0000000000000000e+00 3923 -9.7880510000000004e-02 3924 0.0000000000000000e+00 3925 0.0000000000000000e+00 3926 -1.4475600000000000e-01 3927 -6.4568570000000003e-01 3928 -1.6047870000000000e-01 3929 0.0000000000000000e+00 3930 -2.9385640000000002e-01 3931 -2.3507020000000001e-01 3932 0.0000000000000000e+00 3933 -1.8496720000000000e-01 3934 -2.0928240000000001e-01 3935 0.0000000000000000e+00 3936 0.0000000000000000e+00 3937 -3.2512699999999999e-02 3938 -3.8724050000000003e-02 3939 0.0000000000000000e+00 3940 -3.2512699999999999e-02 3941 0.0000000000000000e+00 3942 0.0000000000000000e+00 3943 0.0000000000000000e+00 3944 0.0000000000000000e+00 3945 0.0000000000000000e+00 3946 0.0000000000000000e+00 3947 0.0000000000000000e+00 3948 2.9893550000000002e-01 3949 2.0516440000000000e-01 3950 7.6065150000000004e-01 3951 0.0000000000000000e+00 3952 0.0000000000000000e+00 3953 2.3115659999999999e-01 3954 0.0000000000000000e+00 3955 0.0000000000000000e+00 3956 -1.9596510000000000e-01 3957 -6.2050160000000000e-02 3958 -3.3263670000000001e-01 3959 -2.1823280000000000e-01 3960 -1.4840700000000001e-01 3961 -1.9197510000000001e-01 3962 -3.7225700000000000e-01 3963 -3.4694470000000004e-18 3964 5.4877990000000001e-02 3965 -1.3090700000000000e-01 3966 1.6345240000000000e-01 3967 5.5218099999999999e-02 3968 2.8005360000000001e-01 3969 -1.6345240000000000e-01 3970 -1.4870290000000000e-01 3971 1.6345240000000000e-01 3972 5.5218099999999999e-02 3973 -1.6345240000000000e-01 3974 -2.3710329999999999e-01 3975 -7.1959879999999998e-01 3976 2.1348980000000001e-01 3977 3.8737990000000000e-01 3978 5.3042949999999998e-02 3979 7.6633179999999995e-02 3980 0.0000000000000000e+00 3981 0.0000000000000000e+00 3982 7.6633179999999995e-02 3983 0.0000000000000000e+00 3984 0.0000000000000000e+00 3985 9.1273460000000001e-02 3986 0.0000000000000000e+00 3987 0.0000000000000000e+00 3988 0.0000000000000000e+00 3989 0.0000000000000000e+00 3990 1.5745660000000002e-02 3991 6.1063470000000002e-02 3992 0.0000000000000000e+00 3993 0.0000000000000000e+00 3994 6.1725559999999999e-02 3995 1.7473130000000000e-02 3996 0.0000000000000000e+00 3997 0.0000000000000000e+00 3998 5.4780429999999998e-02 3999 1.2508079999999999e-01 4000 4.1481230000000002e-01 4001 1.6315610000000000e-01 4002 0.0000000000000000e+00 4003 5.4780429999999998e-02 4004 1.2508079999999999e-01 4005 0.0000000000000000e+00 4006 1.6315610000000000e-01 4007 0.0000000000000000e+00 4008 0.0000000000000000e+00 4009 1.5379090000000001e-01 4010 0.0000000000000000e+00 4011 2.4710739999999998e-02 4012 0.0000000000000000e+00 4013 0.0000000000000000e+00 4014 0.0000000000000000e+00 4015 1.3492380000000001e-01 4016 1.0649620000000000e-01 4017 0.0000000000000000e+00 4018 3.8732230000000001e-01 4019 0.0000000000000000e+00 4020 7.6487970000000002e-02 4021 2.3517030000000000e-01 4022 0.0000000000000000e+00 4023 6.1935070000000002e-02 4024 5.6945450000000002e-02 4025 0.0000000000000000e+00 4026 0.0000000000000000e+00 4027 2.1764020000000001e-01 4028 1.7642440000000001e-01 4029 6.2221839999999995e-01 4030 1.0926460000000000e-01 4031 0.0000000000000000e+00 4032 1.0926460000000000e-01 4033 1.7642440000000001e-01 4034 2.1764020000000001e-01 4035 0.0000000000000000e+00 4036 0.0000000000000000e+00 4037 0.0000000000000000e+00 4038 0.0000000000000000e+00 4039 0.0000000000000000e+00 4040 8.0533030000000005e-02 4041 2.0961320000000000e-01 4042 0.0000000000000000e+00 4043 0.0000000000000000e+00 4044 -3.0653270000000000e-02 4045 0.0000000000000000e+00 4046 0.0000000000000000e+00 4047 1.3691860000000000e-02 4048 0.0000000000000000e+00 4049 0.0000000000000000e+00 4050 0.0000000000000000e+00 4051 -2.3107879999999998e-03 4052 0.0000000000000000e+00 4053 0.0000000000000000e+00 4054 0.0000000000000000e+00 4055 7.0869189999999999e-02 4056 -7.0115490000000003e-02 4057 8.7293129999999997e-02 4058 2.4234910000000001e-01 4059 7.0439390000000002e-01 4060 1.3093969999999999e-01 4061 7.8544199999999995e-02 4062 -2.2090420000000000e-01 4063 -3.7194040000000000e-01 4064 3.2660850000000002e-01 4065 -1.0619629999999999e-01 4066 2.5460319999999997e-01 4067 1.0341690000000001e-01 4068 1.9958200000000001e-01 4069 5.2362800000000001e-02 4070 -1.3010430000000000e-17 4071 -2.4788489999999999e-01 4072 -2.7742600000000001e-01 4073 -1.9210340000000001e-01 4074 -2.0029379999999999e-01 4075 -2.1524280000000001e-01 4076 0.0000000000000000e+00 4077 -7.3329140000000004e-01 4078 0.0000000000000000e+00 4079 -1.8496720000000000e-01 4080 -1.6047870000000000e-01 4081 0.0000000000000000e+00 4082 0.0000000000000000e+00 4083 -2.3094709999999999e-01 4084 -2.0928240000000001e-01 4085 0.0000000000000000e+00 4086 0.0000000000000000e+00 4087 -1.5431390000000000e-01 4088 -1.7277300000000001e-01 4089 0.0000000000000000e+00 4090 0.0000000000000000e+00 4091 -2.5074550000000001e-01 4092 -2.6567520000000000e-01 4093 -8.8358879999999995e-01 4094 -2.9409580000000002e-01 4095 0.0000000000000000e+00 4096 -4.0153519999999998e-01 4097 -2.5074550000000001e-01 4098 0.0000000000000000e+00 4099 0.0000000000000000e+00 4100 -2.8479300000000002e-01 4101 0.0000000000000000e+00 4102 -2.4433790000000000e-01 4103 0.0000000000000000e+00 4104 0.0000000000000000e+00 4105 0.0000000000000000e+00 4106 0.0000000000000000e+00 4107 -4.5979909999999999e-02 4108 0.0000000000000000e+00 4109 0.0000000000000000e+00 4110 0.0000000000000000e+00 4111 0.0000000000000000e+00 4112 -3.2512699999999999e-02 4113 -3.8724050000000003e-02 4114 0.0000000000000000e+00 4115 -3.2512699999999999e-02 4116 0.0000000000000000e+00 4117 0.0000000000000000e+00 4118 0.0000000000000000e+00 4119 0.0000000000000000e+00 4120 0.0000000000000000e+00 4121 0.0000000000000000e+00 4122 0.0000000000000000e+00 4123 1.6922150000000000e-01 4124 1.4300560000000001e-01 4125 0.0000000000000000e+00 4126 4.3997480000000000e-01 4127 0.0000000000000000e+00 4128 6.1935070000000002e-02 4129 1.0649620000000000e-01 4130 0.0000000000000000e+00 4131 0.0000000000000000e+00 4132 9.2588350000000000e-02 4133 5.6945450000000002e-02 4134 0.0000000000000000e+00 4135 0.0000000000000000e+00 4136 1.3856830000000001e-01 4137 1.4821889999999999e-01 4138 0.0000000000000000e+00 4139 0.0000000000000000e+00 4140 -2.1675139999999999e-02 4141 -2.5816030000000000e-02 4142 0.0000000000000000e+00 4143 -2.1675139999999999e-02 4144 0.0000000000000000e+00 4145 0.0000000000000000e+00 4146 0.0000000000000000e+00 4147 0.0000000000000000e+00 4148 0.0000000000000000e+00 4149 0.0000000000000000e+00 4150 0.0000000000000000e+00 4151 0.0000000000000000e+00 4152 2.9042789999999999e-02 4153 -1.7438070000000000e-01 4154 -1.3599159999999999e-01 4155 4.6849670000000003e-02 4156 1.5442249999999999e-02 4157 0.0000000000000000e+00 4158 1.4830760000000001e-01 4159 3.8751720000000001e-01 4160 1.4821889999999999e-01 4161 0.0000000000000000e+00 4162 1.6922150000000000e-01 4163 1.4300560000000001e-01 4164 0.0000000000000000e+00 4165 0.0000000000000000e+00 4166 9.9162829999999993e-02 4167 0.0000000000000000e+00 4168 1.0680829999999999e-01 4169 3.6539339999999998e-01 4170 -3.2462829999999998e-01 4171 1.0739200000000001e-02 4172 -4.5042929999999998e-01 4173 1.8050700000000000e-01 4174 5.0199769999999999e-01 4175 3.7507029999999997e-02 4176 2.8225159999999999e-01 4177 3.2353539999999997e-01 4178 2.2690579999999999e-01 4179 8.4907549999999998e-01 4180 6.1725559999999999e-02 4181 -1.6765730000000001e-01 4182 -2.9288219999999998e-01 4183 3.7507029999999997e-02 4184 1.3475490000000001e-01 4185 1.4177729999999999e-01 4186 1.4507310000000001e-01 4187 4.6897100000000003e-01 4188 1.8512750000000000e-01 4189 0.0000000000000000e+00 4190 1.3882400000000000e-01 4191 3.2480209999999998e-01 4192 0.0000000000000000e+00 4193 0.0000000000000000e+00 4194 0.0000000000000000e+00 4195 2.0799180000000000e-01 4196 0.0000000000000000e+00 4197 0.0000000000000000e+00 4198 0.0000000000000000e+00 4199 0.0000000000000000e+00 4200 2.6020849999999998e-18 4201 0.0000000000000000e+00 4202 0.0000000000000000e+00 4203 0.0000000000000000e+00 4204 0.0000000000000000e+00 4205 0.0000000000000000e+00 4206 0.0000000000000000e+00 4207 6.1725559999999999e-02 4208 1.1582760000000000e-01 4209 0.0000000000000000e+00 4210 2.9331659999999998e-01 4211 0.0000000000000000e+00 4212 1.3835870000000000e-01 4213 1.0874660000000000e-01 4214 0.0000000000000000e+00 4215 0.0000000000000000e+00 4216 9.2378829999999995e-02 4217 0.0000000000000000e+00 4218 6.1063470000000002e-02 4219 0.0000000000000000e+00 4220 1.5745660000000002e-02 4221 1.7473130000000000e-02 4222 0.0000000000000000e+00 4223 0.0000000000000000e+00 4224 7.6455560000000006e-02 4225 8.9250819999999995e-02 4226 0.0000000000000000e+00 4227 1.4148100000000000e-01 4228 4.1481230000000002e-01 4229 7.6455560000000006e-02 4230 8.9250819999999995e-02 4231 1.4148100000000000e-01 4232 0.0000000000000000e+00 4233 0.0000000000000000e+00 4234 0.0000000000000000e+00 4235 0.0000000000000000e+00 4236 0.0000000000000000e+00 4237 8.6356790000000003e-02 4238 1.6380490000000000e-01 4239 0.0000000000000000e+00 4240 0.0000000000000000e+00 4241 -3.8526100000000002e-01 4242 -3.7572149999999999e-01 4243 -1.4446030000000001e+00 4244 0.0000000000000000e+00 4245 0.0000000000000000e+00 4246 -1.7425670000000001e-02 4247 -5.4109140000000000e-01 4248 0.0000000000000000e+00 4249 -5.4994270000000001e-01 4250 -3.8526100000000002e-01 4251 0.0000000000000000e+00 4252 0.0000000000000000e+00 4253 0.0000000000000000e+00 4254 -5.4105219999999998e-01 4255 -3.8827200000000001e-01 4256 0.0000000000000000e+00 4257 -3.0493340000000002e-01 4258 -2.7015400000000001e-01 4259 -1.0370310000000000e+00 4260 -2.3990800000000001e-01 4261 0.0000000000000000e+00 4262 -3.0493340000000002e-01 4263 -2.7015400000000001e-01 4264 0.0000000000000000e+00 4265 -2.3990800000000001e-01 4266 -2.2695119999999999e-01 4267 0.0000000000000000e+00 4268 -3.0439929999999998e-01 4269 0.0000000000000000e+00 4270 0.0000000000000000e+00 4271 0.0000000000000000e+00 4272 0.0000000000000000e+00 4273 0.0000000000000000e+00 4274 1.3835870000000000e-01 4275 1.1582760000000000e-01 4276 0.0000000000000000e+00 4277 0.0000000000000000e+00 4278 1.0874660000000000e-01 4279 0.0000000000000000e+00 4280 -1.3420020000000000e-02 4281 0.0000000000000000e+00 4282 0.0000000000000000e+00 4283 0.0000000000000000e+00 4284 0.0000000000000000e+00 4285 5.5787349999999996e-03 4286 0.0000000000000000e+00 4287 -1.4475600000000000e-01 4288 -2.4090819999999999e-01 4289 0.0000000000000000e+00 4290 -3.2512699999999999e-02 4291 0.0000000000000000e+00 4292 0.0000000000000000e+00 4293 0.0000000000000000e+00 4294 5.4187840000000001e-02 4295 6.4540080000000000e-02 4296 0.0000000000000000e+00 4297 5.4187840000000001e-02 4298 0.0000000000000000e+00 4299 0.0000000000000000e+00 4300 0.0000000000000000e+00 4301 0.0000000000000000e+00 4302 0.0000000000000000e+00 4303 0.0000000000000000e+00 4304 0.0000000000000000e+00 4305 -2.3990800000000001e-01 4306 -2.7015400000000001e-01 4307 0.0000000000000000e+00 4308 -3.0493340000000002e-01 4309 0.0000000000000000e+00 4310 0.0000000000000000e+00 4311 0.0000000000000000e+00 4312 0.0000000000000000e+00 4313 2.9267260000000000e-01 4314 -1.9652920000000000e-03 4315 1.4186389999999999e-01 4316 -1.5772320000000001e-01 4317 5.0436859999999994e-01 4318 -1.3856830000000001e-01 4319 -6.0840379999999999e-02 4320 -6.3738349999999999e-02 4321 -2.1675139999999999e-02 4322 -2.5816030000000000e-02 4323 0.0000000000000000e+00 4324 -2.1675139999999999e-02 4325 0.0000000000000000e+00 4326 0.0000000000000000e+00 4327 0.0000000000000000e+00 4328 0.0000000000000000e+00 4329 0.0000000000000000e+00 4330 0.0000000000000000e+00 4331 0.0000000000000000e+00 4332 3.3550049999999998e-02 4333 0.0000000000000000e+00 4334 0.0000000000000000e+00 4335 -1.3946840000000000e-02 4336 0.0000000000000000e+00 4337 0.0000000000000000e+00 4338 0.0000000000000000e+00 4339 0.0000000000000000e+00 4340 9.2319449999999997e-02 4341 5.4187840000000001e-02 4342 0.0000000000000000e+00 4343 0.0000000000000000e+00 4344 0.0000000000000000e+00 4345 0.0000000000000000e+00 4346 0.0000000000000000e+00 4347 0.0000000000000000e+00 4348 0.0000000000000000e+00 4349 0.0000000000000000e+00 4350 9.6541009999999997e-02 4351 0.0000000000000000e+00 4352 0.0000000000000000e+00 4353 4.2069299999999997e-02 4354 4.6004249999999997e-02 4355 7.7404070000000005e-02 4356 2.5839129999999999e-01 4357 -1.2839780000000000e-02 4358 0.0000000000000000e+00 4359 0.0000000000000000e+00 4360 0.0000000000000000e+00 4361 7.1507329999999994e-02 4362 1.1582760000000000e-01 4363 0.0000000000000000e+00 4364 1.3835870000000000e-01 4365 0.0000000000000000e+00 4366 5.4187840000000001e-02 4367 6.4540080000000000e-02 4368 0.0000000000000000e+00 4369 5.4187840000000001e-02 4370 0.0000000000000000e+00 4371 0.0000000000000000e+00 4372 0.0000000000000000e+00 4373 0.0000000000000000e+00 4374 0.0000000000000000e+00 4375 0.0000000000000000e+00 4376 0.0000000000000000e+00 4377 1.8512750000000000e-01 4378 1.4507310000000001e-01 4379 0.0000000000000000e+00 4380 1.4177729999999999e-01 4381 0.0000000000000000e+00 4382 0.0000000000000000e+00 4383 0.0000000000000000e+00 4384 0.0000000000000000e+00 4385 0.0000000000000000e+00 4386 -4.3351800000000003e-02 4387 0.0000000000000000e+00 4388 0.0000000000000000e+00 4389 0.0000000000000000e+00 4390 0.0000000000000000e+00 4391 0.0000000000000000e+00 4392 0.0000000000000000e+00 4393 0.0000000000000000e+00 4394 5.5017839999999996e-01 4395 3.2325769999999997e-02 4396 -2.2007130000000000e-01 4397 -5.9688959999999999e-02 4398 -9.1994350000000003e-02 4399 -5.7986469999999998e-02 4400 6.6351439999999999e-03 4401 1.5076100000000001e-01 4402 -4.0791300000000003e-01 4403 -1.0870810000000000e-01 4404 1.6316520000000001e-01 4405 2.3425720000000000e-01 4406 -2.2787959999999999e-04 4407 1.1291610000000001e-01 4408 -1.2679420000000000e-01 4409 -1.2675429999999999e-01 4410 -9.7566490000000006e-02 4411 4.7466469999999997e-02 4412 -8.7090950000000000e-02 4413 -1.0137790000000001e-01 4414 2.0910750000000000e-01 4415 6.1696950000000000e-02 4416 -1.7878970000000000e-01 4417 -1.0029210000000000e-01 4418 0.0000000000000000e+00 4419 0.0000000000000000e+00 4420 -2.9982930000000001e-02 4421 6.1468250000000002e-02 4422 -6.7355600000000002e-02 4423 -9.8390019999999995e-02 4424 8.2233130000000002e-02 4425 8.3455320000000000e-02 4426 0.0000000000000000e+00 4427 0.0000000000000000e+00 4428 0.0000000000000000e+00 4429 0.0000000000000000e+00 4430 2.5781640000000002e-02 4431 1.7958760000000001e-02 4432 3.8672449999999997e-02 4433 -7.1835040000000003e-03 4434 8.9363729999999997e-01 4435 2.5228560000000000e-01 4436 -5.3618239999999995e-01 4437 -1.4076970000000000e-01 4438 -6.4454090000000006e-02 4439 -1.0775260000000000e-02 4440 -3.5745490000000002e-01 4441 -1.1151580000000000e-01 4442 7.9411330000000002e-02 4443 2.4949569999999999e-01 4444 1.1911700000000000e-01 4445 -8.9196670000000006e-02 4446 -1.9852829999999999e-01 4447 -1.6029900000000000e-01 4448 9.5241770000000003e-02 4449 9.8478909999999997e-01 4450 8.0100859999999996e-02 4451 -1.4235059999999999e-01 4452 -8.0822229999999995e-02 4453 2.6473419999999998e-01 4454 1.0110090000000000e-02 4455 -4.5082070000000002e-01 4456 -5.7172809999999996e-01 4457 -3.0610840000000000e-01 4458 2.8230119999999997e-01 4459 3.5590869999999997e-02 4460 -2.1958700000000000e-01 4461 -2.8960560000000002e-01 4462 -1.3181920000000000e-01 4463 -1.7958760000000001e-02 4464 -5.5211609999999999e-04 4465 -1.7958760000000001e-02 4466 -3.6055549999999999e-02 4467 -1.0706719999999999e-03 4468 -1.8028309999999999e-02 4469 5.5017839999999996e-01 4470 1.5061440000000001e-01 4471 -3.3010699999999998e-01 4472 2.1550509999999998e-02 4473 -6.1329570000000000e-02 4474 1.1596850000000000e-01 4475 -4.0791300000000003e-01 4476 -1.7045800000000000e-01 4477 2.4474779999999999e-01 4478 2.4212660000000000e-01 4479 -1.1466430000000000e-01 4480 -7.9348730000000006e-02 4481 -8.9899770000000004e-02 4482 -2.2209400000000001e-01 4483 5.0483020000000001e-01 4484 -2.7260360000000000e-01 4485 0.0000000000000000e+00 4486 0.0000000000000000e+00 4487 0.0000000000000000e+00 4488 0.0000000000000000e+00 4489 0.0000000000000000e+00 4490 -2.6697760000000001e-02 4491 -2.9755049999999998e-03 4492 3.7015670000000001e-01 4493 -8.1038810000000003e-02 4494 3.9391569999999998e-01 4495 1.1459419999999999e-01 4496 1.6018660000000001e-02 4497 -1.4410190000000000e-01 4498 -5.3129919999999997e-01 4499 -1.4693200000000001e-01 4500 -2.2209400000000001e-01 4501 -6.6398029999999997e-02 4502 -5.5015010000000004e-04 4503 9.6277320000000000e-02 4504 3.2893249999999999e-02 4505 2.3372319999999999e-01 4506 1.0450010000000000e-01 4507 -1.3999170000000000e-01 4508 2.5495120000000000e-02 4509 -9.5632170000000002e-02 4510 -2.0147899999999999e-01 4511 2.9074810000000001e-01 4512 -9.6277320000000000e-02 4513 9.5632170000000002e-02 4514 -2.7450160000000001e-01 4515 1.1429990000000000e-01 4516 1.1151580000000000e-01 4517 1.4839749999999999e-01 4518 -7.2385190000000002e-02 4519 -2.3753450000000001e-01 4520 -1.6261080000000000e-01 4521 -1.4894959999999999e-01 4522 5.5791340000000002e-02 4523 2.6697760000000001e-02 4524 -2.7492420000000001e-01 4525 -8.3387059999999999e-02 4526 6.1856689999999999e-02 4527 1.6018660000000001e-02 4528 3.7015670000000001e-01 4529 1.0450010000000000e-01 4530 -1.4410190000000000e-01 4531 2.3372319999999999e-01 4532 1.1459419999999999e-01 4533 -8.1038810000000003e-02 4534 2.5495120000000000e-02 4535 2.9074810000000001e-01 4536 8.9196670000000006e-02 4537 -2.1064659999999999e-01 4538 2.0986569999999999e-01 4539 -1.1911700000000000e-01 4540 8.0822229999999995e-02 4541 2.7682420000000002e-01 4542 4.2599239999999999e-01 4543 9.7566490000000006e-02 4544 -1.9410189999999999e-01 4545 -2.9734709999999998e-01 4546 1.6536819999999999e-01 4547 1.1658640000000001e-01 4548 1.7919940000000001e-01 4549 1.3389770000000000e-02 4550 1.0137790000000001e-01 4551 -2.6426470000000001e-02 4552 6.7355600000000002e-02 4553 1.0029210000000000e-01 4554 -1.0305510000000000e-01 4555 -1.6088189999999999e-01 4556 -1.2817509999999999e-01 4557 1.2716510000000000e-01 4558 2.1362519999999999e-01 4559 7.0902480000000004e-02 4560 -1.9371220000000000e-01 4561 -9.0097000000000007e-03 4562 3.0218769999999999e-02 4563 2.2630680000000000e-01 4564 2.1286850000000000e-02 4565 9.6580650000000004e-03 4566 1.5510220000000000e-02 4567 1.2774540000000001e-01 4568 -6.1696950000000000e-02 4569 7.7502980000000001e-03 4570 8.2233130000000002e-02 4571 2.2787959999999999e-04 4572 8.3455320000000000e-02 4573 0.0000000000000000e+00 4574 0.0000000000000000e+00 4575 0.0000000000000000e+00 4576 0.0000000000000000e+00 4577 0.0000000000000000e+00 4578 0.0000000000000000e+00 4579 -8.7090950000000000e-02 4580 9.1994350000000003e-02 4581 2.0910750000000000e-01 4582 -1.7878970000000000e-01 4583 -1.1291610000000001e-01 4584 0.0000000000000000e+00 4585 0.0000000000000000e+00 4586 -2.6697760000000001e-02 4587 -4.4632570000000000e-03 4588 -5.5596820000000002e-01 4589 -2.1951350000000000e-01 4590 -1.4806269999999999e-01 4591 -4.6191370000000002e-02 4592 5.9087350000000005e-01 4593 7.2385190000000002e-02 4594 1.5014000000000000e-01 4595 4.9339880000000003e-02 4596 -1.9156480000000001e-01 4597 -5.3618239999999995e-01 4598 -1.0559600000000000e-01 4599 -1.4839749999999999e-01 4600 -1.5014000000000000e-01 4601 1.0559600000000000e-01 4602 1.6029900000000000e-01 4603 -3.9179770000000003e-01 4604 2.0131420000000000e-01 4605 1.9852829999999999e-01 4606 2.0147899999999999e-01 4607 5.5015010000000004e-04 4608 -1.4894959999999999e-01 4609 -1.6261080000000000e-01 4610 -2.3753450000000001e-01 4611 4.6921999999999998e-02 4612 2.6697760000000001e-02 4613 -4.1939340000000003e-01 4614 -4.7344570000000002e-02 4615 -4.4632570000000000e-03 4616 -2.2007130000000000e-01 4617 -6.0861209999999999e-02 4618 -1.1058570000000000e-02 4619 -9.0925480000000003e-02 4620 2.4474779999999999e-01 4621 6.2190030000000000e-02 4622 1.5332390000000001e-01 4623 -3.3567369999999999e-02 4624 -3.3010699999999998e-01 4625 -5.3876279999999999e-02 4626 1.6316520000000001e-01 4627 -1.1537219999999999e-01 4628 1.1489220000000000e-01 4629 -6.3799149999999999e-02 4630 3.9879369999999997e-02 4631 9.6811309999999998e-02 4632 -5.7982029999999997e-02 4633 -4.3739290000000000e-02 4634 2.2209400000000001e-01 4635 -2.1025610000000000e-01 4636 1.1693300000000000e-01 4637 1.3999170000000000e-01 4638 0.0000000000000000e+00 4639 0.0000000000000000e+00 4640 2.6942239999999999e-02 4641 -1.1475490000000001e-01 4642 0.0000000000000000e+00 4643 0.0000000000000000e+00 4644 0.0000000000000000e+00 4645 6.0861209999999999e-02 4646 1.1387730000000000e-01 4647 0.0000000000000000e+00 4648 -3.9612139999999997e-02 4649 -3.1042940000000002e-01 4650 1.2043180000000001e-01 4651 0.0000000000000000e+00 4652 0.0000000000000000e+00 4653 4.0413360000000002e-02 4654 -1.9223609999999999e-01 4655 -8.0399659999999998e-02 4656 0.0000000000000000e+00 4657 2.1951350000000000e-01 4658 0.0000000000000000e+00 4659 5.5017839999999996e-01 4660 1.5061440000000001e-01 4661 4.4234290000000004e-03 4662 -8.9899770000000004e-02 4663 2.4474779999999999e-01 4664 6.8828730000000005e-02 4665 -3.3010699999999998e-01 4666 2.1550509999999998e-02 4667 -4.0791300000000003e-01 4668 -1.7045800000000000e-01 4669 -6.1329570000000000e-02 4670 1.1596850000000000e-01 4671 2.9982930000000001e-02 4672 2.4212660000000000e-01 4673 -6.5044320000000003e-02 4674 -1.0965650000000000e-01 4675 -1.1466430000000000e-01 4676 -7.9348730000000006e-02 4677 1.6171109999999999e-04 4678 2.2209400000000001e-01 4679 5.0483020000000001e-01 4680 -6.1468250000000002e-02 4681 -4.3163649999999998e-01 4682 -2.7260360000000000e-01 4683 0.0000000000000000e+00 4684 0.0000000000000000e+00 4685 2.2787959999999999e-04 4686 -6.1696950000000000e-02 4687 8.2233130000000002e-02 4688 8.3455320000000000e-02 4689 -6.7355600000000002e-02 4690 -9.8390019999999995e-02 4691 0.0000000000000000e+00 4692 0.0000000000000000e+00 4693 0.0000000000000000e+00 4694 -2.9688360000000003e-01 4695 -1.5061440000000001e-01 4696 0.0000000000000000e+00 4697 5.5017839999999996e-01 4698 3.2325769999999997e-02 4699 1.6316520000000001e-01 4700 2.3425720000000000e-01 4701 -9.1994350000000003e-02 4702 -5.7986469999999998e-02 4703 1.1291610000000001e-01 4704 1.5076100000000001e-01 4705 -2.2007130000000000e-01 4706 -1.2679420000000000e-01 4707 -1.0137790000000001e-01 4708 2.0910750000000000e-01 4709 -8.7090950000000000e-02 4710 -1.7878970000000000e-01 4711 -1.0029210000000000e-01 4712 0.0000000000000000e+00 4713 0.0000000000000000e+00 4714 0.0000000000000000e+00 4715 0.0000000000000000e+00 4716 0.0000000000000000e+00 4717 0.0000000000000000e+00 4718 2.0992839999999999e-01 4719 -6.7585240000000005e-02 4720 -1.2858410000000001e-01 4721 -1.7645179999999999e-01 4722 4.7788740000000003e-02 4723 0.0000000000000000e+00 4724 0.0000000000000000e+00 4725 -9.6811309999999998e-02 4726 -1.2043180000000001e-01 4727 4.0413360000000002e-02 4728 -8.0399659999999998e-02 4729 -4.9339880000000003e-02 4730 3.3477659999999999e-02 4731 0.0000000000000000e+00 4732 0.0000000000000000e+00 4733 0.0000000000000000e+00 4734 -3.3010699999999998e-01 4735 -9.0925480000000003e-02 4736 -2.2007130000000000e-01 4737 -5.3876279999999999e-02 4738 2.4474779999999999e-01 4739 -6.3799149999999999e-02 4740 1.5332390000000001e-01 4741 -5.7982029999999997e-02 4742 -1.1058570000000000e-02 4743 1.6316520000000001e-01 4744 3.9879369999999997e-02 4745 -1.1537219999999999e-01 4746 1.1489220000000000e-01 4747 -3.3567369999999999e-02 4748 6.2190030000000000e-02 4749 -3.9612139999999997e-02 4750 1.4806269999999999e-01 4751 -3.1042940000000002e-01 4752 1.9156480000000001e-01 4753 0.0000000000000000e+00 4754 0.0000000000000000e+00 4755 0.0000000000000000e+00 4756 0.0000000000000000e+00 4757 0.0000000000000000e+00 4758 1.7371840000000000e-01 4759 0.0000000000000000e+00 4760 -5.5240849999999997e-01 4761 3.7015670000000001e-01 4762 1.0334450000000001e-01 4763 1.0679100000000000e-02 4764 -6.1947430000000003e-01 4765 -2.1703720000000001e-01 4766 4.9339880000000003e-02 4767 2.7737440000000002e-01 4768 1.6616729999999999e-01 4769 -1.3998099999999999e-01 4770 1.6550660000000000e-01 4771 2.3556750000000001e-01 4772 5.8273880000000000e-02 4773 -2.1035470000000001e-02 4774 -1.5918009999999999e-01 4775 1.5024380000000001e-01 4776 3.3477659999999999e-02 4777 1.7645179999999999e-01 4778 4.0413360000000002e-02 4779 -1.3522090000000000e-01 4780 0.0000000000000000e+00 4781 0.0000000000000000e+00 4782 -4.1780329999999999e-01 4783 -3.0944199999999999e-01 4784 3.6825890000000000e-01 4785 1.0071360000000000e-01 4786 1.1325180000000001e-02 4787 4.3146760000000001e-01 4788 -1.8622390000000000e-01 4789 2.2680529999999999e-01 4790 4.1877370000000004e-03 4791 1.3184999999999999e-01 4792 -2.1250230000000001e-01 4793 -1.0078380000000001e-01 4794 -4.2897410000000002e-01 4795 1.8673609999999999e-01 4796 -3.3178859999999998e-02 4797 2.3681749999999999e-01 4798 0.0000000000000000e+00 4799 0.0000000000000000e+00 4800 0.0000000000000000e+00 4801 -9.1156539999999994e-02 4802 1.3389770000000000e-02 4803 2.2789129999999999e-01 4804 8.9265140000000000e-03 4805 -1.6896310000000000e-01 4806 -5.2503370000000001e-02 4807 -1.3673479999999999e-01 4808 -2.2316289999999999e-02 4809 -2.6942239999999999e-02 4810 -2.6426470000000001e-02 4811 9.7032499999999994e-02 4812 -7.0606030000000000e-02 4813 0.0000000000000000e+00 4814 0.0000000000000000e+00 4815 5.8963550000000003e-02 4816 -1.1693300000000000e-01 4817 -1.1475490000000001e-01 4818 0.0000000000000000e+00 4819 0.0000000000000000e+00 4820 0.0000000000000000e+00 4821 0.0000000000000000e+00 4822 -1.9440080000000001e-01 4823 3.9450430000000002e-02 4824 1.9410189999999999e-01 4825 0.0000000000000000e+00 4826 0.0000000000000000e+00 4827 0.0000000000000000e+00 4828 5.9688959999999999e-02 4829 1.2316520000000000e-01 4830 0.0000000000000000e+00 4831 0.0000000000000000e+00 4832 0.0000000000000000e+00 4833 0.0000000000000000e+00 4834 0.0000000000000000e+00 4835 0.0000000000000000e+00 4836 0.0000000000000000e+00 4837 0.0000000000000000e+00 4838 1.6018660000000001e-02 4839 7.4387619999999998e-03 4840 -1.4806269999999999e-01 4841 -3.6946470000000002e-02 4842 1.3282480000000001e+00 4843 3.6396919999999999e-01 4844 -2.7682420000000002e-01 4845 -2.6244459999999997e-01 4846 1.0679100000000000e-02 4847 2.7997270000000002e-01 4848 3.6361539999999998e-01 4849 2.6244459999999997e-01 4850 -9.5241770000000003e-02 4851 6.1042609999999997e-01 4852 -3.9923419999999998e-01 4853 -2.5228560000000000e-01 4854 4.2599239999999999e-01 4855 2.2869399999999999e-04 4856 -1.6018660000000001e-02 4857 7.1393770000000001e-01 4858 -8.6929240000000005e-02 4859 -7.4387619999999998e-03 4860 -1.4934700000000000e-02 4861 -7.4387619999999998e-03 4862 -7.3840449999999997e-04 4863 1.6003369999999999e-02 4864 -1.4933530000000000e-01 4865 -3.8672449999999997e-02 4866 -1.3469220000000001e-01 4867 -3.9450430000000002e-02 4868 2.5284679999999998e-01 4869 1.0870810000000000e-01 4870 1.0560430000000001e-02 4871 5.0681209999999999e-01 4872 -4.7466469999999997e-02 4873 -1.0560430000000001e-02 4874 -8.7252659999999996e-02 4875 3.6946470000000002e-02 4876 2.9572270000000001e-01 4877 -6.6351439999999999e-03 4878 -1.5076100000000001e-01 4879 0.0000000000000000e+00 4880 0.0000000000000000e+00 4881 -3.6396919999999999e-01 4882 0.0000000000000000e+00 4883 0.0000000000000000e+00 4884 0.0000000000000000e+00 4885 -1.1327970000000000e-01 4886 -1.0775260000000000e-02 4887 3.9040499999999997e-04 4888 5.9087350000000005e-01 4889 6.4454090000000006e-02 4890 -7.9694880000000001e-01 4891 -2.1703720000000001e-01 4892 -4.6191370000000002e-02 4893 3.7015670000000001e-01 4894 -1.3998099999999999e-01 4895 8.9363729999999997e-01 4896 2.4949569999999999e-01 4897 9.8478909999999997e-01 4898 8.0100859999999996e-02 4899 -1.4235059999999999e-01 4900 4.3112929999999999e-01 4901 9.7499930000000001e-01 4902 -1.4806269999999999e-01 4903 2.7997270000000002e-01 4904 2.8830240000000001e-01 4905 -3.0610840000000000e-01 4906 -2.6473419999999998e-01 4907 -3.1656390000000001e-01 4908 6.5174529999999997e-01 4909 3.5615930000000001e-01 4910 7.9996129999999999e-02 4911 -6.1558019999999998e-02 4912 -2.8278100000000000e-01 4913 4.8792590000000002e-01 4914 -1.0679100000000000e-02 4915 7.0053549999999998e-01 4916 -6.0244430000000004e-01 4917 -1.1995860000000000e-01 4918 0.0000000000000000e+00 4919 0.0000000000000000e+00 4920 0.0000000000000000e+00 4921 -2.2007130000000000e-01 4922 3.2325769999999997e-02 4923 5.5017839999999996e-01 4924 1.6316520000000001e-01 4925 -4.0791300000000003e-01 4926 -1.2675429999999999e-01 4927 -1.2679420000000000e-01 4928 -5.7986469999999998e-02 4929 2.3425720000000000e-01 4930 0.0000000000000000e+00 4931 0.0000000000000000e+00 4932 5.8963550000000003e-02 4933 0.0000000000000000e+00 4934 0.0000000000000000e+00 4935 0.0000000000000000e+00 4936 5.0681209999999999e-01 4937 0.0000000000000000e+00 4938 -1.9440080000000001e-01 4939 0.0000000000000000e+00 4940 2.6473419999999998e-01 4941 -8.0100859999999996e-02 4942 -4.1117989999999999e-01 4943 -2.4949569999999999e-01 4944 1.7919940000000001e-01 4945 1.3389770000000000e-02 4946 1.1658640000000001e-01 4947 6.7355600000000002e-02 4948 -9.1156539999999994e-02 4949 -2.2316289999999999e-02 4950 1.0137790000000001e-01 4951 -2.6426470000000001e-02 4952 -1.6896310000000000e-01 4953 -7.0606030000000000e-02 4954 1.0029210000000000e-01 4955 -7.8488310000000006e-02 4956 -5.2503370000000001e-02 4957 0.0000000000000000e+00 4958 1.1612409999999999e-01 4959 0.0000000000000000e+00 4960 1.2716510000000000e-01 4961 0.0000000000000000e+00 4962 -1.0305510000000000e-01 4963 0.0000000000000000e+00 4964 0.0000000000000000e+00 4965 -1.4693200000000001e-01 4966 -6.6398029999999997e-02 4967 4.3739290000000000e-02 4968 -1.6228790000000001e-01 4969 0.0000000000000000e+00 4970 -1.1370230000000001e-01 4971 -8.0523429999999993e-02 4972 -1.2283750000000000e-01 4973 0.0000000000000000e+00 4974 0.0000000000000000e+00 4975 0.0000000000000000e+00 4976 0.0000000000000000e+00 4977 0.0000000000000000e+00 4978 3.6361539999999998e-01 4979 1.3282480000000001e+00 4980 3.6396919999999999e-01 4981 -9.8478909999999997e-01 4982 1.6018660000000001e-02 4983 -3.0610840000000000e-01 4984 -5.8308739999999998e-02 4985 -1.4806269999999999e-01 4986 2.7997270000000002e-01 4987 -2.7682420000000002e-01 4988 -2.6244459999999997e-01 4989 -6.8828730000000005e-02 4990 -1.3914450000000000e-01 4991 -2.7704279999999998e-01 4992 1.4235059999999999e-01 4993 0.0000000000000000e+00 4994 -2.9655589999999998e-01 4995 -2.0305470000000000e-01 4996 2.2345660000000001e-01 4997 0.0000000000000000e+00 4998 0.0000000000000000e+00 4999 5.0681209999999999e-01 5000 0.0000000000000000e+00 5001 0.0000000000000000e+00 5002 8.9363729999999997e-01 5003 2.5228560000000000e-01 5004 3.8672449999999997e-02 5005 1.1911700000000000e-01 5006 9.5241770000000003e-02 5007 -8.0822229999999995e-02 5008 -5.7571910000000004e-01 5009 -4.4484790000000002e-01 5010 1.5165140000000001e-02 5011 -1.8652240000000000e-01 5012 0.0000000000000000e+00 5013 -6.7585240000000005e-02 5014 -1.2858410000000001e-01 5015 2.0992839999999999e-01 5016 4.7788740000000003e-02 5017 0.0000000000000000e+00 5018 0.0000000000000000e+00 5019 0.0000000000000000e+00 5020 2.2789129999999999e-01 5021 8.9265140000000000e-03 5022 -1.0978340000000000e-01 5023 1.3389770000000000e-02 5024 -2.9146600000000000e-01 5025 -1.4199439999999999e-01 5026 9.7032499999999994e-02 5027 -2.6942239999999999e-02 5028 -2.6426470000000001e-02 5029 4.4526200000000002e-02 5030 0.0000000000000000e+00 5031 0.0000000000000000e+00 5032 0.0000000000000000e+00 5033 0.0000000000000000e+00 5034 0.0000000000000000e+00 5035 0.0000000000000000e+00 5036 0.0000000000000000e+00 5037 -2.4145159999999999e-02 5038 -4.0513630000000000e-01 5039 -9.8549579999999998e-02 5040 2.8548850000000001e-02 5041 1.6811319999999999e-01 5042 -1.4104890000000000e-01 5043 -1.5748680000000001e-02 5044 -2.1314020000000000e-01 5045 -5.7982029999999997e-02 5046 1.1442950000000000e-01 5047 -6.0252479999999997e-02 5048 -3.3567369999999999e-02 5049 -5.3876279999999999e-02 5050 -1.3051389999999999e-01 5051 0.0000000000000000e+00 5052 0.0000000000000000e+00 5053 -2.4152529999999998e-02 5054 0.0000000000000000e+00 5055 0.0000000000000000e+00 5056 0.0000000000000000e+00 5057 -1.7382210000000001e-01 5058 0.0000000000000000e+00 5059 1.8088879999999999e-01 5060 0.0000000000000000e+00 5061 -2.1025610000000000e-01 5062 0.0000000000000000e+00 5063 -8.0523429999999993e-02 5064 -1.2283750000000000e-01 5065 0.0000000000000000e+00 5066 0.0000000000000000e+00 5067 0.0000000000000000e+00 5068 0.0000000000000000e+00 5069 -2.9655589999999998e-01 5070 0.0000000000000000e+00 5071 0.0000000000000000e+00 5072 0.0000000000000000e+00 5073 4.5023289999999999e-01 5074 2.4212660000000000e-01 5075 -1.7957440000000000e-01 5076 0.0000000000000000e+00 5077 0.0000000000000000e+00 5078 0.0000000000000000e+00 5079 0.0000000000000000e+00 5080 0.0000000000000000e+00 hypre-2.33.0/src/test/TEST_ams/mfem.inodes.00000000066400000000000000000000076421477326011500207170ustar00rootroot000000000000001 152 1 0.0000000000000000e+00 2 0.0000000000000000e+00 3 0.0000000000000000e+00 4 0.0000000000000000e+00 5 0.0000000000000000e+00 6 0.0000000000000000e+00 7 0.0000000000000000e+00 8 0.0000000000000000e+00 9 0.0000000000000000e+00 10 1.0000000000000000e+00 11 0.0000000000000000e+00 12 1.0000000000000000e+00 13 0.0000000000000000e+00 14 0.0000000000000000e+00 15 0.0000000000000000e+00 16 0.0000000000000000e+00 17 0.0000000000000000e+00 18 0.0000000000000000e+00 19 0.0000000000000000e+00 20 0.0000000000000000e+00 21 0.0000000000000000e+00 22 0.0000000000000000e+00 23 0.0000000000000000e+00 24 0.0000000000000000e+00 25 0.0000000000000000e+00 26 0.0000000000000000e+00 27 0.0000000000000000e+00 28 0.0000000000000000e+00 29 0.0000000000000000e+00 30 0.0000000000000000e+00 31 0.0000000000000000e+00 32 0.0000000000000000e+00 33 0.0000000000000000e+00 34 0.0000000000000000e+00 35 0.0000000000000000e+00 36 0.0000000000000000e+00 37 0.0000000000000000e+00 38 0.0000000000000000e+00 39 0.0000000000000000e+00 40 0.0000000000000000e+00 41 0.0000000000000000e+00 42 0.0000000000000000e+00 43 1.0000000000000000e+00 44 0.0000000000000000e+00 45 0.0000000000000000e+00 46 0.0000000000000000e+00 47 0.0000000000000000e+00 48 0.0000000000000000e+00 49 0.0000000000000000e+00 50 0.0000000000000000e+00 51 0.0000000000000000e+00 52 1.0000000000000000e+00 53 0.0000000000000000e+00 54 0.0000000000000000e+00 55 0.0000000000000000e+00 56 0.0000000000000000e+00 57 0.0000000000000000e+00 58 1.0000000000000000e+00 59 0.0000000000000000e+00 60 0.0000000000000000e+00 61 0.0000000000000000e+00 62 0.0000000000000000e+00 63 0.0000000000000000e+00 64 0.0000000000000000e+00 65 0.0000000000000000e+00 66 0.0000000000000000e+00 67 0.0000000000000000e+00 68 0.0000000000000000e+00 69 1.0000000000000000e+00 70 0.0000000000000000e+00 71 0.0000000000000000e+00 72 1.0000000000000000e+00 73 0.0000000000000000e+00 74 0.0000000000000000e+00 75 0.0000000000000000e+00 76 0.0000000000000000e+00 77 0.0000000000000000e+00 78 0.0000000000000000e+00 79 0.0000000000000000e+00 80 0.0000000000000000e+00 81 0.0000000000000000e+00 82 0.0000000000000000e+00 83 0.0000000000000000e+00 84 0.0000000000000000e+00 85 0.0000000000000000e+00 86 0.0000000000000000e+00 87 0.0000000000000000e+00 88 0.0000000000000000e+00 89 0.0000000000000000e+00 90 0.0000000000000000e+00 91 0.0000000000000000e+00 92 0.0000000000000000e+00 93 0.0000000000000000e+00 94 0.0000000000000000e+00 95 0.0000000000000000e+00 96 0.0000000000000000e+00 97 0.0000000000000000e+00 98 0.0000000000000000e+00 99 0.0000000000000000e+00 100 0.0000000000000000e+00 101 0.0000000000000000e+00 102 0.0000000000000000e+00 103 0.0000000000000000e+00 104 0.0000000000000000e+00 105 1.0000000000000000e+00 106 0.0000000000000000e+00 107 0.0000000000000000e+00 108 0.0000000000000000e+00 109 0.0000000000000000e+00 110 0.0000000000000000e+00 111 0.0000000000000000e+00 112 0.0000000000000000e+00 113 0.0000000000000000e+00 114 0.0000000000000000e+00 115 0.0000000000000000e+00 116 0.0000000000000000e+00 117 0.0000000000000000e+00 118 0.0000000000000000e+00 119 0.0000000000000000e+00 120 0.0000000000000000e+00 121 0.0000000000000000e+00 122 0.0000000000000000e+00 123 0.0000000000000000e+00 124 0.0000000000000000e+00 125 0.0000000000000000e+00 126 0.0000000000000000e+00 127 0.0000000000000000e+00 128 1.0000000000000000e+00 129 1.0000000000000000e+00 130 0.0000000000000000e+00 131 0.0000000000000000e+00 132 0.0000000000000000e+00 133 0.0000000000000000e+00 134 0.0000000000000000e+00 135 0.0000000000000000e+00 136 0.0000000000000000e+00 137 0.0000000000000000e+00 138 0.0000000000000000e+00 139 0.0000000000000000e+00 140 0.0000000000000000e+00 141 0.0000000000000000e+00 142 0.0000000000000000e+00 143 0.0000000000000000e+00 144 0.0000000000000000e+00 145 0.0000000000000000e+00 146 0.0000000000000000e+00 147 0.0000000000000000e+00 148 0.0000000000000000e+00 149 0.0000000000000000e+00 150 0.0000000000000000e+00 151 0.0000000000000000e+00 152 0.0000000000000000e+00 hypre-2.33.0/src/test/TEST_ams/mfem.inodes.00001000066400000000000000000000131771477326011500207200ustar00rootroot00000000000000153 365 153 0.0000000000000000e+00 154 0.0000000000000000e+00 155 0.0000000000000000e+00 156 0.0000000000000000e+00 157 0.0000000000000000e+00 158 0.0000000000000000e+00 159 0.0000000000000000e+00 160 0.0000000000000000e+00 161 1.0000000000000000e+00 162 1.0000000000000000e+00 163 0.0000000000000000e+00 164 0.0000000000000000e+00 165 0.0000000000000000e+00 166 0.0000000000000000e+00 167 0.0000000000000000e+00 168 0.0000000000000000e+00 169 0.0000000000000000e+00 170 0.0000000000000000e+00 171 0.0000000000000000e+00 172 0.0000000000000000e+00 173 0.0000000000000000e+00 174 0.0000000000000000e+00 175 0.0000000000000000e+00 176 0.0000000000000000e+00 177 0.0000000000000000e+00 178 0.0000000000000000e+00 179 0.0000000000000000e+00 180 0.0000000000000000e+00 181 0.0000000000000000e+00 182 0.0000000000000000e+00 183 1.0000000000000000e+00 184 0.0000000000000000e+00 185 1.0000000000000000e+00 186 0.0000000000000000e+00 187 0.0000000000000000e+00 188 0.0000000000000000e+00 189 0.0000000000000000e+00 190 0.0000000000000000e+00 191 0.0000000000000000e+00 192 1.0000000000000000e+00 193 0.0000000000000000e+00 194 0.0000000000000000e+00 195 0.0000000000000000e+00 196 0.0000000000000000e+00 197 0.0000000000000000e+00 198 0.0000000000000000e+00 199 0.0000000000000000e+00 200 0.0000000000000000e+00 201 0.0000000000000000e+00 202 0.0000000000000000e+00 203 0.0000000000000000e+00 204 0.0000000000000000e+00 205 0.0000000000000000e+00 206 0.0000000000000000e+00 207 0.0000000000000000e+00 208 0.0000000000000000e+00 209 0.0000000000000000e+00 210 0.0000000000000000e+00 211 0.0000000000000000e+00 212 0.0000000000000000e+00 213 0.0000000000000000e+00 214 0.0000000000000000e+00 215 0.0000000000000000e+00 216 0.0000000000000000e+00 217 0.0000000000000000e+00 218 0.0000000000000000e+00 219 0.0000000000000000e+00 220 0.0000000000000000e+00 221 0.0000000000000000e+00 222 0.0000000000000000e+00 223 0.0000000000000000e+00 224 0.0000000000000000e+00 225 0.0000000000000000e+00 226 0.0000000000000000e+00 227 0.0000000000000000e+00 228 0.0000000000000000e+00 229 0.0000000000000000e+00 230 0.0000000000000000e+00 231 0.0000000000000000e+00 232 0.0000000000000000e+00 233 0.0000000000000000e+00 234 0.0000000000000000e+00 235 0.0000000000000000e+00 236 0.0000000000000000e+00 237 0.0000000000000000e+00 238 0.0000000000000000e+00 239 0.0000000000000000e+00 240 0.0000000000000000e+00 241 0.0000000000000000e+00 242 0.0000000000000000e+00 243 0.0000000000000000e+00 244 0.0000000000000000e+00 245 0.0000000000000000e+00 246 0.0000000000000000e+00 247 0.0000000000000000e+00 248 0.0000000000000000e+00 249 0.0000000000000000e+00 250 0.0000000000000000e+00 251 0.0000000000000000e+00 252 0.0000000000000000e+00 253 0.0000000000000000e+00 254 0.0000000000000000e+00 255 0.0000000000000000e+00 256 0.0000000000000000e+00 257 0.0000000000000000e+00 258 0.0000000000000000e+00 259 0.0000000000000000e+00 260 0.0000000000000000e+00 261 0.0000000000000000e+00 262 0.0000000000000000e+00 263 0.0000000000000000e+00 264 0.0000000000000000e+00 265 0.0000000000000000e+00 266 0.0000000000000000e+00 267 0.0000000000000000e+00 268 0.0000000000000000e+00 269 0.0000000000000000e+00 270 0.0000000000000000e+00 271 0.0000000000000000e+00 272 0.0000000000000000e+00 273 0.0000000000000000e+00 274 0.0000000000000000e+00 275 0.0000000000000000e+00 276 0.0000000000000000e+00 277 0.0000000000000000e+00 278 0.0000000000000000e+00 279 0.0000000000000000e+00 280 0.0000000000000000e+00 281 0.0000000000000000e+00 282 0.0000000000000000e+00 283 0.0000000000000000e+00 284 0.0000000000000000e+00 285 0.0000000000000000e+00 286 0.0000000000000000e+00 287 0.0000000000000000e+00 288 0.0000000000000000e+00 289 0.0000000000000000e+00 290 0.0000000000000000e+00 291 0.0000000000000000e+00 292 0.0000000000000000e+00 293 0.0000000000000000e+00 294 0.0000000000000000e+00 295 0.0000000000000000e+00 296 0.0000000000000000e+00 297 0.0000000000000000e+00 298 0.0000000000000000e+00 299 0.0000000000000000e+00 300 0.0000000000000000e+00 301 0.0000000000000000e+00 302 0.0000000000000000e+00 303 0.0000000000000000e+00 304 0.0000000000000000e+00 305 0.0000000000000000e+00 306 0.0000000000000000e+00 307 0.0000000000000000e+00 308 0.0000000000000000e+00 309 0.0000000000000000e+00 310 0.0000000000000000e+00 311 0.0000000000000000e+00 312 0.0000000000000000e+00 313 0.0000000000000000e+00 314 0.0000000000000000e+00 315 0.0000000000000000e+00 316 0.0000000000000000e+00 317 0.0000000000000000e+00 318 0.0000000000000000e+00 319 0.0000000000000000e+00 320 0.0000000000000000e+00 321 0.0000000000000000e+00 322 0.0000000000000000e+00 323 0.0000000000000000e+00 324 0.0000000000000000e+00 325 1.0000000000000000e+00 326 0.0000000000000000e+00 327 0.0000000000000000e+00 328 0.0000000000000000e+00 329 0.0000000000000000e+00 330 0.0000000000000000e+00 331 0.0000000000000000e+00 332 0.0000000000000000e+00 333 0.0000000000000000e+00 334 0.0000000000000000e+00 335 0.0000000000000000e+00 336 0.0000000000000000e+00 337 0.0000000000000000e+00 338 0.0000000000000000e+00 339 0.0000000000000000e+00 340 0.0000000000000000e+00 341 0.0000000000000000e+00 342 0.0000000000000000e+00 343 0.0000000000000000e+00 344 0.0000000000000000e+00 345 0.0000000000000000e+00 346 0.0000000000000000e+00 347 0.0000000000000000e+00 348 0.0000000000000000e+00 349 1.0000000000000000e+00 350 1.0000000000000000e+00 351 0.0000000000000000e+00 352 1.0000000000000000e+00 353 0.0000000000000000e+00 354 0.0000000000000000e+00 355 0.0000000000000000e+00 356 0.0000000000000000e+00 357 0.0000000000000000e+00 358 0.0000000000000000e+00 359 0.0000000000000000e+00 360 0.0000000000000000e+00 361 0.0000000000000000e+00 362 0.0000000000000000e+00 363 0.0000000000000000e+00 364 0.0000000000000000e+00 365 0.0000000000000000e+00 hypre-2.33.0/src/test/TEST_ams/mfem.inodes.00002000066400000000000000000000151131477326011500207110ustar00rootroot00000000000000366 614 366 0.0000000000000000e+00 367 0.0000000000000000e+00 368 0.0000000000000000e+00 369 0.0000000000000000e+00 370 0.0000000000000000e+00 371 0.0000000000000000e+00 372 0.0000000000000000e+00 373 0.0000000000000000e+00 374 0.0000000000000000e+00 375 0.0000000000000000e+00 376 0.0000000000000000e+00 377 0.0000000000000000e+00 378 0.0000000000000000e+00 379 0.0000000000000000e+00 380 0.0000000000000000e+00 381 0.0000000000000000e+00 382 0.0000000000000000e+00 383 0.0000000000000000e+00 384 0.0000000000000000e+00 385 0.0000000000000000e+00 386 0.0000000000000000e+00 387 0.0000000000000000e+00 388 0.0000000000000000e+00 389 0.0000000000000000e+00 390 0.0000000000000000e+00 391 0.0000000000000000e+00 392 0.0000000000000000e+00 393 0.0000000000000000e+00 394 0.0000000000000000e+00 395 0.0000000000000000e+00 396 1.0000000000000000e+00 397 0.0000000000000000e+00 398 0.0000000000000000e+00 399 0.0000000000000000e+00 400 0.0000000000000000e+00 401 0.0000000000000000e+00 402 0.0000000000000000e+00 403 0.0000000000000000e+00 404 0.0000000000000000e+00 405 0.0000000000000000e+00 406 1.0000000000000000e+00 407 0.0000000000000000e+00 408 0.0000000000000000e+00 409 0.0000000000000000e+00 410 0.0000000000000000e+00 411 0.0000000000000000e+00 412 0.0000000000000000e+00 413 0.0000000000000000e+00 414 0.0000000000000000e+00 415 0.0000000000000000e+00 416 0.0000000000000000e+00 417 0.0000000000000000e+00 418 0.0000000000000000e+00 419 0.0000000000000000e+00 420 0.0000000000000000e+00 421 0.0000000000000000e+00 422 0.0000000000000000e+00 423 0.0000000000000000e+00 424 0.0000000000000000e+00 425 0.0000000000000000e+00 426 1.0000000000000000e+00 427 1.0000000000000000e+00 428 0.0000000000000000e+00 429 0.0000000000000000e+00 430 1.0000000000000000e+00 431 0.0000000000000000e+00 432 0.0000000000000000e+00 433 0.0000000000000000e+00 434 0.0000000000000000e+00 435 0.0000000000000000e+00 436 0.0000000000000000e+00 437 0.0000000000000000e+00 438 0.0000000000000000e+00 439 0.0000000000000000e+00 440 0.0000000000000000e+00 441 0.0000000000000000e+00 442 0.0000000000000000e+00 443 0.0000000000000000e+00 444 0.0000000000000000e+00 445 0.0000000000000000e+00 446 0.0000000000000000e+00 447 0.0000000000000000e+00 448 0.0000000000000000e+00 449 0.0000000000000000e+00 450 0.0000000000000000e+00 451 0.0000000000000000e+00 452 0.0000000000000000e+00 453 1.0000000000000000e+00 454 0.0000000000000000e+00 455 0.0000000000000000e+00 456 0.0000000000000000e+00 457 0.0000000000000000e+00 458 0.0000000000000000e+00 459 0.0000000000000000e+00 460 0.0000000000000000e+00 461 1.0000000000000000e+00 462 0.0000000000000000e+00 463 0.0000000000000000e+00 464 0.0000000000000000e+00 465 0.0000000000000000e+00 466 0.0000000000000000e+00 467 0.0000000000000000e+00 468 0.0000000000000000e+00 469 0.0000000000000000e+00 470 0.0000000000000000e+00 471 0.0000000000000000e+00 472 0.0000000000000000e+00 473 0.0000000000000000e+00 474 0.0000000000000000e+00 475 0.0000000000000000e+00 476 0.0000000000000000e+00 477 0.0000000000000000e+00 478 0.0000000000000000e+00 479 0.0000000000000000e+00 480 0.0000000000000000e+00 481 0.0000000000000000e+00 482 1.0000000000000000e+00 483 0.0000000000000000e+00 484 0.0000000000000000e+00 485 0.0000000000000000e+00 486 0.0000000000000000e+00 487 0.0000000000000000e+00 488 0.0000000000000000e+00 489 0.0000000000000000e+00 490 0.0000000000000000e+00 491 0.0000000000000000e+00 492 0.0000000000000000e+00 493 0.0000000000000000e+00 494 0.0000000000000000e+00 495 0.0000000000000000e+00 496 0.0000000000000000e+00 497 0.0000000000000000e+00 498 0.0000000000000000e+00 499 0.0000000000000000e+00 500 0.0000000000000000e+00 501 0.0000000000000000e+00 502 0.0000000000000000e+00 503 0.0000000000000000e+00 504 0.0000000000000000e+00 505 0.0000000000000000e+00 506 0.0000000000000000e+00 507 0.0000000000000000e+00 508 0.0000000000000000e+00 509 0.0000000000000000e+00 510 0.0000000000000000e+00 511 0.0000000000000000e+00 512 0.0000000000000000e+00 513 0.0000000000000000e+00 514 0.0000000000000000e+00 515 1.0000000000000000e+00 516 0.0000000000000000e+00 517 0.0000000000000000e+00 518 0.0000000000000000e+00 519 0.0000000000000000e+00 520 0.0000000000000000e+00 521 0.0000000000000000e+00 522 0.0000000000000000e+00 523 0.0000000000000000e+00 524 0.0000000000000000e+00 525 0.0000000000000000e+00 526 1.0000000000000000e+00 527 0.0000000000000000e+00 528 0.0000000000000000e+00 529 0.0000000000000000e+00 530 0.0000000000000000e+00 531 0.0000000000000000e+00 532 0.0000000000000000e+00 533 0.0000000000000000e+00 534 0.0000000000000000e+00 535 0.0000000000000000e+00 536 0.0000000000000000e+00 537 0.0000000000000000e+00 538 0.0000000000000000e+00 539 0.0000000000000000e+00 540 0.0000000000000000e+00 541 0.0000000000000000e+00 542 0.0000000000000000e+00 543 0.0000000000000000e+00 544 0.0000000000000000e+00 545 0.0000000000000000e+00 546 0.0000000000000000e+00 547 0.0000000000000000e+00 548 0.0000000000000000e+00 549 0.0000000000000000e+00 550 0.0000000000000000e+00 551 0.0000000000000000e+00 552 0.0000000000000000e+00 553 0.0000000000000000e+00 554 1.0000000000000000e+00 555 0.0000000000000000e+00 556 0.0000000000000000e+00 557 0.0000000000000000e+00 558 0.0000000000000000e+00 559 0.0000000000000000e+00 560 1.0000000000000000e+00 561 0.0000000000000000e+00 562 0.0000000000000000e+00 563 0.0000000000000000e+00 564 0.0000000000000000e+00 565 0.0000000000000000e+00 566 1.0000000000000000e+00 567 1.0000000000000000e+00 568 0.0000000000000000e+00 569 0.0000000000000000e+00 570 0.0000000000000000e+00 571 0.0000000000000000e+00 572 0.0000000000000000e+00 573 0.0000000000000000e+00 574 0.0000000000000000e+00 575 0.0000000000000000e+00 576 0.0000000000000000e+00 577 0.0000000000000000e+00 578 0.0000000000000000e+00 579 0.0000000000000000e+00 580 0.0000000000000000e+00 581 0.0000000000000000e+00 582 0.0000000000000000e+00 583 0.0000000000000000e+00 584 0.0000000000000000e+00 585 0.0000000000000000e+00 586 0.0000000000000000e+00 587 0.0000000000000000e+00 588 0.0000000000000000e+00 589 0.0000000000000000e+00 590 0.0000000000000000e+00 591 0.0000000000000000e+00 592 0.0000000000000000e+00 593 0.0000000000000000e+00 594 0.0000000000000000e+00 595 0.0000000000000000e+00 596 0.0000000000000000e+00 597 0.0000000000000000e+00 598 0.0000000000000000e+00 599 0.0000000000000000e+00 600 0.0000000000000000e+00 601 0.0000000000000000e+00 602 0.0000000000000000e+00 603 0.0000000000000000e+00 604 0.0000000000000000e+00 605 0.0000000000000000e+00 606 0.0000000000000000e+00 607 0.0000000000000000e+00 608 0.0000000000000000e+00 609 0.0000000000000000e+00 610 0.0000000000000000e+00 611 0.0000000000000000e+00 612 0.0000000000000000e+00 613 0.0000000000000000e+00 614 0.0000000000000000e+00 hypre-2.33.0/src/test/TEST_ams/mfem.inodes.00003000066400000000000000000000146511477326011500207200ustar00rootroot00000000000000615 857 615 0.0000000000000000e+00 616 0.0000000000000000e+00 617 0.0000000000000000e+00 618 0.0000000000000000e+00 619 0.0000000000000000e+00 620 0.0000000000000000e+00 621 0.0000000000000000e+00 622 0.0000000000000000e+00 623 0.0000000000000000e+00 624 0.0000000000000000e+00 625 0.0000000000000000e+00 626 0.0000000000000000e+00 627 0.0000000000000000e+00 628 0.0000000000000000e+00 629 0.0000000000000000e+00 630 0.0000000000000000e+00 631 0.0000000000000000e+00 632 0.0000000000000000e+00 633 0.0000000000000000e+00 634 0.0000000000000000e+00 635 0.0000000000000000e+00 636 0.0000000000000000e+00 637 0.0000000000000000e+00 638 0.0000000000000000e+00 639 0.0000000000000000e+00 640 0.0000000000000000e+00 641 0.0000000000000000e+00 642 0.0000000000000000e+00 643 0.0000000000000000e+00 644 0.0000000000000000e+00 645 0.0000000000000000e+00 646 1.0000000000000000e+00 647 0.0000000000000000e+00 648 0.0000000000000000e+00 649 0.0000000000000000e+00 650 0.0000000000000000e+00 651 0.0000000000000000e+00 652 0.0000000000000000e+00 653 0.0000000000000000e+00 654 0.0000000000000000e+00 655 0.0000000000000000e+00 656 0.0000000000000000e+00 657 0.0000000000000000e+00 658 0.0000000000000000e+00 659 0.0000000000000000e+00 660 0.0000000000000000e+00 661 0.0000000000000000e+00 662 0.0000000000000000e+00 663 0.0000000000000000e+00 664 0.0000000000000000e+00 665 0.0000000000000000e+00 666 0.0000000000000000e+00 667 0.0000000000000000e+00 668 0.0000000000000000e+00 669 0.0000000000000000e+00 670 0.0000000000000000e+00 671 0.0000000000000000e+00 672 0.0000000000000000e+00 673 0.0000000000000000e+00 674 0.0000000000000000e+00 675 0.0000000000000000e+00 676 0.0000000000000000e+00 677 0.0000000000000000e+00 678 0.0000000000000000e+00 679 0.0000000000000000e+00 680 0.0000000000000000e+00 681 0.0000000000000000e+00 682 0.0000000000000000e+00 683 0.0000000000000000e+00 684 0.0000000000000000e+00 685 0.0000000000000000e+00 686 0.0000000000000000e+00 687 0.0000000000000000e+00 688 0.0000000000000000e+00 689 0.0000000000000000e+00 690 0.0000000000000000e+00 691 0.0000000000000000e+00 692 0.0000000000000000e+00 693 0.0000000000000000e+00 694 0.0000000000000000e+00 695 0.0000000000000000e+00 696 0.0000000000000000e+00 697 0.0000000000000000e+00 698 0.0000000000000000e+00 699 0.0000000000000000e+00 700 0.0000000000000000e+00 701 0.0000000000000000e+00 702 0.0000000000000000e+00 703 0.0000000000000000e+00 704 0.0000000000000000e+00 705 0.0000000000000000e+00 706 0.0000000000000000e+00 707 0.0000000000000000e+00 708 0.0000000000000000e+00 709 0.0000000000000000e+00 710 0.0000000000000000e+00 711 0.0000000000000000e+00 712 0.0000000000000000e+00 713 0.0000000000000000e+00 714 0.0000000000000000e+00 715 0.0000000000000000e+00 716 0.0000000000000000e+00 717 0.0000000000000000e+00 718 0.0000000000000000e+00 719 0.0000000000000000e+00 720 0.0000000000000000e+00 721 0.0000000000000000e+00 722 0.0000000000000000e+00 723 0.0000000000000000e+00 724 0.0000000000000000e+00 725 0.0000000000000000e+00 726 0.0000000000000000e+00 727 0.0000000000000000e+00 728 0.0000000000000000e+00 729 0.0000000000000000e+00 730 0.0000000000000000e+00 731 0.0000000000000000e+00 732 0.0000000000000000e+00 733 0.0000000000000000e+00 734 0.0000000000000000e+00 735 0.0000000000000000e+00 736 0.0000000000000000e+00 737 0.0000000000000000e+00 738 0.0000000000000000e+00 739 0.0000000000000000e+00 740 0.0000000000000000e+00 741 0.0000000000000000e+00 742 0.0000000000000000e+00 743 0.0000000000000000e+00 744 0.0000000000000000e+00 745 0.0000000000000000e+00 746 0.0000000000000000e+00 747 0.0000000000000000e+00 748 0.0000000000000000e+00 749 0.0000000000000000e+00 750 0.0000000000000000e+00 751 0.0000000000000000e+00 752 0.0000000000000000e+00 753 0.0000000000000000e+00 754 0.0000000000000000e+00 755 0.0000000000000000e+00 756 0.0000000000000000e+00 757 0.0000000000000000e+00 758 0.0000000000000000e+00 759 0.0000000000000000e+00 760 0.0000000000000000e+00 761 0.0000000000000000e+00 762 0.0000000000000000e+00 763 0.0000000000000000e+00 764 0.0000000000000000e+00 765 0.0000000000000000e+00 766 0.0000000000000000e+00 767 0.0000000000000000e+00 768 0.0000000000000000e+00 769 0.0000000000000000e+00 770 0.0000000000000000e+00 771 0.0000000000000000e+00 772 0.0000000000000000e+00 773 0.0000000000000000e+00 774 0.0000000000000000e+00 775 0.0000000000000000e+00 776 0.0000000000000000e+00 777 0.0000000000000000e+00 778 0.0000000000000000e+00 779 0.0000000000000000e+00 780 0.0000000000000000e+00 781 1.0000000000000000e+00 782 1.0000000000000000e+00 783 0.0000000000000000e+00 784 0.0000000000000000e+00 785 0.0000000000000000e+00 786 0.0000000000000000e+00 787 0.0000000000000000e+00 788 0.0000000000000000e+00 789 0.0000000000000000e+00 790 0.0000000000000000e+00 791 0.0000000000000000e+00 792 0.0000000000000000e+00 793 0.0000000000000000e+00 794 0.0000000000000000e+00 795 0.0000000000000000e+00 796 0.0000000000000000e+00 797 0.0000000000000000e+00 798 0.0000000000000000e+00 799 0.0000000000000000e+00 800 0.0000000000000000e+00 801 0.0000000000000000e+00 802 0.0000000000000000e+00 803 0.0000000000000000e+00 804 0.0000000000000000e+00 805 0.0000000000000000e+00 806 0.0000000000000000e+00 807 0.0000000000000000e+00 808 0.0000000000000000e+00 809 0.0000000000000000e+00 810 0.0000000000000000e+00 811 0.0000000000000000e+00 812 0.0000000000000000e+00 813 0.0000000000000000e+00 814 0.0000000000000000e+00 815 0.0000000000000000e+00 816 0.0000000000000000e+00 817 0.0000000000000000e+00 818 0.0000000000000000e+00 819 0.0000000000000000e+00 820 0.0000000000000000e+00 821 0.0000000000000000e+00 822 0.0000000000000000e+00 823 0.0000000000000000e+00 824 0.0000000000000000e+00 825 0.0000000000000000e+00 826 0.0000000000000000e+00 827 0.0000000000000000e+00 828 0.0000000000000000e+00 829 0.0000000000000000e+00 830 0.0000000000000000e+00 831 0.0000000000000000e+00 832 0.0000000000000000e+00 833 0.0000000000000000e+00 834 0.0000000000000000e+00 835 0.0000000000000000e+00 836 0.0000000000000000e+00 837 0.0000000000000000e+00 838 0.0000000000000000e+00 839 0.0000000000000000e+00 840 0.0000000000000000e+00 841 0.0000000000000000e+00 842 0.0000000000000000e+00 843 0.0000000000000000e+00 844 0.0000000000000000e+00 845 0.0000000000000000e+00 846 0.0000000000000000e+00 847 0.0000000000000000e+00 848 0.0000000000000000e+00 849 0.0000000000000000e+00 850 0.0000000000000000e+00 851 0.0000000000000000e+00 852 0.0000000000000000e+00 853 0.0000000000000000e+00 854 0.0000000000000000e+00 855 0.0000000000000000e+00 856 0.0000000000000000e+00 857 0.0000000000000000e+00 hypre-2.33.0/src/test/TEST_ams/mfem.x.00000000066400000000000000000000076421477326011500177050ustar00rootroot000000000000001 152 1 0.0000000000000000e+00 2 0.0000000000000000e+00 3 0.0000000000000000e+00 4 0.0000000000000000e+00 5 0.0000000000000000e+00 6 1.2500000000000000e-01 7 2.5000000000000000e-01 8 1.2500000000000000e-01 9 2.5000000000000000e-01 10 2.5000000000000000e-01 11 3.7500000000000000e-01 12 0.0000000000000000e+00 13 1.2500000000000000e-01 14 5.0000000000000000e-01 15 3.7500000000000000e-01 16 0.0000000000000000e+00 17 1.2500000000000000e-01 18 1.2500000000000000e-01 19 2.5000000000000000e-01 20 0.0000000000000000e+00 21 7.5000000000000000e-01 22 0.0000000000000000e+00 23 0.0000000000000000e+00 24 6.2500000000000000e-02 25 6.2500000000000000e-02 26 0.0000000000000000e+00 27 0.0000000000000000e+00 28 0.0000000000000000e+00 29 6.2500000000000000e-02 30 6.2500000000000000e-02 31 0.0000000000000000e+00 32 6.2500000000000000e-02 33 1.2500000000000000e-01 34 1.2500000000000000e-01 35 1.8750000000000000e-01 36 6.2500000000000000e-02 37 0.0000000000000000e+00 38 6.2500000000000000e-02 39 3.7500000000000000e-01 40 2.5000000000000000e-01 41 3.1250000000000000e-01 42 3.1250000000000000e-01 43 3.7500000000000000e-01 44 4.3750000000000000e-01 45 1.2500000000000000e-01 46 2.5000000000000000e-01 47 1.8750000000000000e-01 48 1.8750000000000000e-01 49 1.2500000000000000e-01 50 1.8750000000000000e-01 51 1.8750000000000000e-01 52 1.2500000000000000e-01 53 6.2500000000000000e-02 54 1.2500000000000000e-01 55 2.5000000000000000e-01 56 1.8750000000000000e-01 57 1.8750000000000000e-01 58 1.2500000000000000e-01 59 4.3750000000000000e-01 60 3.7500000000000000e-01 61 3.1250000000000000e-01 62 4.3750000000000000e-01 63 4.3750000000000000e-01 64 1.2500000000000000e-01 65 1.8750000000000000e-01 66 6.2500000000000000e-02 67 0.0000000000000000e+00 68 6.2500000000000000e-02 69 1.2500000000000000e-01 70 1.8750000000000000e-01 71 6.2500000000000000e-02 72 0.0000000000000000e+00 73 6.2500000000000000e-02 74 4.3750000000000000e-01 75 4.3750000000000000e-01 76 0.0000000000000000e+00 77 0.0000000000000000e+00 78 6.2500000000000000e-02 79 6.2500000000000000e-02 80 0.0000000000000000e+00 81 2.5000000000000000e-01 82 2.5000000000000000e-01 83 0.0000000000000000e+00 84 0.0000000000000000e+00 85 0.0000000000000000e+00 86 6.2500000000000000e-02 87 6.2500000000000000e-02 88 1.2500000000000000e-01 89 1.2500000000000000e-01 90 1.8750000000000000e-01 91 6.2500000000000000e-02 92 1.8750000000000000e-01 93 1.2500000000000000e-01 94 0.0000000000000000e+00 95 0.0000000000000000e+00 96 6.2500000000000000e-02 97 6.2500000000000000e-02 98 0.0000000000000000e+00 99 1.2500000000000000e-01 100 6.2500000000000000e-02 101 0.0000000000000000e+00 102 1.8750000000000000e-01 103 1.2500000000000000e-01 104 6.2500000000000000e-02 105 0.0000000000000000e+00 106 3.7500000000000000e-01 107 2.5000000000000000e-01 108 3.1250000000000000e-01 109 3.1250000000000000e-01 110 2.5000000000000000e-01 111 1.8750000000000000e-01 112 1.8750000000000000e-01 113 3.1250000000000000e-01 114 1.2500000000000000e-01 115 1.2500000000000000e-01 116 1.2500000000000000e-01 117 3.1250000000000000e-01 118 2.5000000000000000e-01 119 1.2500000000000000e-01 120 1.8750000000000000e-01 121 2.5000000000000000e-01 122 2.5000000000000000e-01 123 3.1250000000000000e-01 124 3.7500000000000000e-01 125 3.1250000000000000e-01 126 3.7500000000000000e-01 127 4.3750000000000000e-01 128 1.2500000000000000e-01 129 1.2500000000000000e-01 130 1.8750000000000000e-01 131 3.7500000000000000e-01 132 3.1250000000000000e-01 133 4.3750000000000000e-01 134 4.3750000000000000e-01 135 6.2500000000000000e-01 136 5.0000000000000000e-01 137 1.8750000000000000e-01 138 1.8750000000000000e-01 139 2.5000000000000000e-01 140 3.1250000000000000e-01 141 1.8750000000000000e-01 142 6.2500000000000000e-02 143 4.3750000000000000e-01 144 4.3750000000000000e-01 145 3.7500000000000000e-01 146 3.1250000000000000e-01 147 2.5000000000000000e-01 148 1.8750000000000000e-01 149 1.2500000000000000e-01 150 0.0000000000000000e+00 151 6.2500000000000000e-02 152 3.7500000000000000e-01 hypre-2.33.0/src/test/TEST_ams/mfem.x.00001000066400000000000000000000131771477326011500177060ustar00rootroot00000000000000153 365 153 5.0000000000000000e-01 154 2.5000000000000000e-01 155 5.0000000000000000e-01 156 3.7500000000000000e-01 157 0.0000000000000000e+00 158 2.5000000000000000e-01 159 0.0000000000000000e+00 160 0.0000000000000000e+00 161 7.5000000000000000e-01 162 7.5000000000000000e-01 163 2.5000000000000000e-01 164 0.0000000000000000e+00 165 0.0000000000000000e+00 166 0.0000000000000000e+00 167 2.5000000000000000e-01 168 0.0000000000000000e+00 169 1.2500000000000000e-01 170 0.0000000000000000e+00 171 0.0000000000000000e+00 172 1.2500000000000000e-01 173 0.0000000000000000e+00 174 5.0000000000000000e-01 175 3.7500000000000000e-01 176 5.0000000000000000e-01 177 2.5000000000000000e-01 178 2.5000000000000000e-01 179 2.5000000000000000e-01 180 2.5000000000000000e-01 181 0.0000000000000000e+00 182 2.5000000000000000e-01 183 5.0000000000000000e-01 184 2.5000000000000000e-01 185 0.0000000000000000e+00 186 3.7500000000000000e-01 187 2.5000000000000000e-01 188 3.7500000000000000e-01 189 3.7500000000000000e-01 190 3.1250000000000000e-01 191 4.3750000000000000e-01 192 5.0000000000000000e-01 193 4.3750000000000000e-01 194 1.2500000000000000e-01 195 1.2500000000000000e-01 196 0.0000000000000000e+00 197 1.2500000000000000e-01 198 0.0000000000000000e+00 199 0.0000000000000000e+00 200 3.7500000000000000e-01 201 2.5000000000000000e-01 202 3.7500000000000000e-01 203 7.5000000000000000e-01 204 8.7500000000000000e-01 205 7.5000000000000000e-01 206 3.7500000000000000e-01 207 2.5000000000000000e-01 208 3.7500000000000000e-01 209 1.2500000000000000e-01 210 1.2500000000000000e-01 211 0.0000000000000000e+00 212 0.0000000000000000e+00 213 0.0000000000000000e+00 214 1.2500000000000000e-01 215 1.2500000000000000e-01 216 1.8750000000000000e-01 217 6.2500000000000000e-02 218 0.0000000000000000e+00 219 6.2500000000000000e-02 220 0.0000000000000000e+00 221 0.0000000000000000e+00 222 6.2500000000000000e-02 223 6.2500000000000000e-02 224 0.0000000000000000e+00 225 6.2500000000000000e-02 226 1.2500000000000000e-01 227 1.2500000000000000e-01 228 1.8750000000000000e-01 229 6.2500000000000000e-02 230 0.0000000000000000e+00 231 5.0000000000000000e-01 232 5.0000000000000000e-01 233 4.3750000000000000e-01 234 4.3750000000000000e-01 235 4.3750000000000000e-01 236 3.7500000000000000e-01 237 3.7500000000000000e-01 238 3.1250000000000000e-01 239 4.3750000000000000e-01 240 5.0000000000000000e-01 241 2.5000000000000000e-01 242 1.2500000000000000e-01 243 2.5000000000000000e-01 244 1.2500000000000000e-01 245 2.5000000000000000e-01 246 3.7500000000000000e-01 247 3.7500000000000000e-01 248 3.7500000000000000e-01 249 5.0000000000000000e-01 250 5.0000000000000000e-01 251 3.7500000000000000e-01 252 2.5000000000000000e-01 253 3.1250000000000000e-01 254 5.0000000000000000e-01 255 5.0000000000000000e-01 256 1.2500000000000000e-01 257 1.2500000000000000e-01 258 0.0000000000000000e+00 259 2.5000000000000000e-01 260 2.5000000000000000e-01 261 1.2500000000000000e-01 262 1.2500000000000000e-01 263 3.7500000000000000e-01 264 1.2500000000000000e-01 265 0.0000000000000000e+00 266 0.0000000000000000e+00 267 0.0000000000000000e+00 268 0.0000000000000000e+00 269 3.7500000000000000e-01 270 2.5000000000000000e-01 271 2.5000000000000000e-01 272 2.5000000000000000e-01 273 3.7500000000000000e-01 274 3.7500000000000000e-01 275 1.2500000000000000e-01 276 1.2500000000000000e-01 277 1.2500000000000000e-01 278 3.7500000000000000e-01 279 6.2500000000000000e-01 280 6.2500000000000000e-01 281 5.0000000000000000e-01 282 5.0000000000000000e-01 283 5.0000000000000000e-01 284 6.2500000000000000e-01 285 6.2500000000000000e-01 286 5.0000000000000000e-01 287 5.0000000000000000e-01 288 5.0000000000000000e-01 289 6.2500000000000000e-01 290 6.2500000000000000e-01 291 6.2500000000000000e-01 292 1.2500000000000000e-01 293 1.2500000000000000e-01 294 2.5000000000000000e-01 295 1.2500000000000000e-01 296 0.0000000000000000e+00 297 2.5000000000000000e-01 298 1.2500000000000000e-01 299 2.5000000000000000e-01 300 6.2500000000000000e-01 301 2.5000000000000000e-01 302 1.2500000000000000e-01 303 1.2500000000000000e-01 304 0.0000000000000000e+00 305 0.0000000000000000e+00 306 0.0000000000000000e+00 307 7.5000000000000000e-01 308 1.2500000000000000e-01 309 2.5000000000000000e-01 310 1.8750000000000000e-01 311 1.8750000000000000e-01 312 1.2500000000000000e-01 313 2.5000000000000000e-01 314 2.5000000000000000e-01 315 3.1250000000000000e-01 316 3.1250000000000000e-01 317 3.7500000000000000e-01 318 1.8750000000000000e-01 319 1.2500000000000000e-01 320 1.8750000000000000e-01 321 0.0000000000000000e+00 322 0.0000000000000000e+00 323 6.2500000000000000e-02 324 6.2500000000000000e-02 325 0.0000000000000000e+00 326 1.2500000000000000e-01 327 1.2500000000000000e-01 328 1.2500000000000000e-01 329 2.5000000000000000e-01 330 3.7500000000000000e-01 331 2.5000000000000000e-01 332 3.1250000000000000e-01 333 3.7500000000000000e-01 334 3.7500000000000000e-01 335 4.3750000000000000e-01 336 3.1250000000000000e-01 337 3.1250000000000000e-01 338 3.7500000000000000e-01 339 3.7500000000000000e-01 340 2.5000000000000000e-01 341 3.1250000000000000e-01 342 3.1250000000000000e-01 343 3.7500000000000000e-01 344 2.5000000000000000e-01 345 1.8750000000000000e-01 346 1.2500000000000000e-01 347 3.7500000000000000e-01 348 4.3750000000000000e-01 349 1.2500000000000000e-01 350 2.5000000000000000e-01 351 1.8750000000000000e-01 352 1.2500000000000000e-01 353 4.3750000000000000e-01 354 0.0000000000000000e+00 355 1.2500000000000000e-01 356 1.2500000000000000e-01 357 2.5000000000000000e-01 358 3.7500000000000000e-01 359 3.7500000000000000e-01 360 3.7500000000000000e-01 361 3.7500000000000000e-01 362 3.7500000000000000e-01 363 2.5000000000000000e-01 364 0.0000000000000000e+00 365 0.0000000000000000e+00 hypre-2.33.0/src/test/TEST_ams/mfem.x.00002000066400000000000000000000151131477326011500176770ustar00rootroot00000000000000366 614 366 5.0000000000000000e-01 367 2.5000000000000000e-01 368 2.5000000000000000e-01 369 3.7500000000000000e-01 370 5.0000000000000000e-01 371 5.0000000000000000e-01 372 3.7500000000000000e-01 373 5.0000000000000000e-01 374 2.5000000000000000e-01 375 2.5000000000000000e-01 376 3.7500000000000000e-01 377 5.0000000000000000e-01 378 7.5000000000000000e-01 379 7.5000000000000000e-01 380 1.0000000000000000e+00 381 7.5000000000000000e-01 382 7.5000000000000000e-01 383 5.0000000000000000e-01 384 7.5000000000000000e-01 385 7.5000000000000000e-01 386 1.0000000000000000e+00 387 7.5000000000000000e-01 388 1.0000000000000000e+00 389 7.5000000000000000e-01 390 7.5000000000000000e-01 391 1.0000000000000000e+00 392 1.0000000000000000e+00 393 2.5000000000000000e-01 394 1.2500000000000000e-01 395 5.0000000000000000e-01 396 7.5000000000000000e-01 397 1.0000000000000000e+00 398 1.0000000000000000e+00 399 1.0000000000000000e+00 400 1.0000000000000000e+00 401 1.0000000000000000e+00 402 7.5000000000000000e-01 403 1.0000000000000000e+00 404 1.0000000000000000e+00 405 5.0000000000000000e-01 406 1.0000000000000000e+00 407 1.0000000000000000e+00 408 2.5000000000000000e-01 409 3.7500000000000000e-01 410 2.5000000000000000e-01 411 3.1250000000000000e-01 412 3.1250000000000000e-01 413 3.7500000000000000e-01 414 4.3750000000000000e-01 415 5.0000000000000000e-01 416 5.0000000000000000e-01 417 4.3750000000000000e-01 418 4.3750000000000000e-01 419 5.0000000000000000e-01 420 4.3750000000000000e-01 421 3.7500000000000000e-01 422 3.7500000000000000e-01 423 3.1250000000000000e-01 424 4.3750000000000000e-01 425 5.0000000000000000e-01 426 3.7500000000000000e-01 427 2.5000000000000000e-01 428 3.1250000000000000e-01 429 3.1250000000000000e-01 430 3.7500000000000000e-01 431 4.3750000000000000e-01 432 5.0000000000000000e-01 433 5.0000000000000000e-01 434 4.3750000000000000e-01 435 4.3750000000000000e-01 436 5.0000000000000000e-01 437 7.5000000000000000e-01 438 8.7500000000000000e-01 439 7.5000000000000000e-01 440 8.7500000000000000e-01 441 8.7500000000000000e-01 442 7.5000000000000000e-01 443 6.2500000000000000e-01 444 5.0000000000000000e-01 445 5.0000000000000000e-01 446 6.2500000000000000e-01 447 6.2500000000000000e-01 448 6.2500000000000000e-01 449 7.5000000000000000e-01 450 7.5000000000000000e-01 451 7.5000000000000000e-01 452 6.2500000000000000e-01 453 6.2500000000000000e-01 454 6.2500000000000000e-01 455 6.2500000000000000e-01 456 7.5000000000000000e-01 457 6.2500000000000000e-01 458 6.2500000000000000e-01 459 8.7500000000000000e-01 460 8.7500000000000000e-01 461 8.7500000000000000e-01 462 7.5000000000000000e-01 463 8.7500000000000000e-01 464 1.0000000000000000e+00 465 7.5000000000000000e-01 466 7.5000000000000000e-01 467 7.5000000000000000e-01 468 6.2500000000000000e-01 469 8.7500000000000000e-01 470 8.7500000000000000e-01 471 1.0000000000000000e+00 472 8.7500000000000000e-01 473 1.0000000000000000e+00 474 1.0000000000000000e+00 475 7.5000000000000000e-01 476 7.5000000000000000e-01 477 6.2500000000000000e-01 478 6.2500000000000000e-01 479 5.0000000000000000e-01 480 5.0000000000000000e-01 481 6.2500000000000000e-01 482 6.2500000000000000e-01 483 2.5000000000000000e-01 484 2.5000000000000000e-01 485 1.8750000000000000e-01 486 1.8750000000000000e-01 487 1.8750000000000000e-01 488 3.1250000000000000e-01 489 5.0000000000000000e-01 490 5.0000000000000000e-01 491 4.3750000000000000e-01 492 4.3750000000000000e-01 493 5.0000000000000000e-01 494 3.7500000000000000e-01 495 3.7500000000000000e-01 496 3.1250000000000000e-01 497 4.3750000000000000e-01 498 5.0000000000000000e-01 499 3.7500000000000000e-01 500 3.1250000000000000e-01 501 2.5000000000000000e-01 502 1.8750000000000000e-01 503 1.2500000000000000e-01 504 6.2500000000000000e-02 505 2.5000000000000000e-01 506 3.1250000000000000e-01 507 3.7500000000000000e-01 508 3.7500000000000000e-01 509 3.7500000000000000e-01 510 3.1250000000000000e-01 511 2.5000000000000000e-01 512 2.5000000000000000e-01 513 2.5000000000000000e-01 514 3.7500000000000000e-01 515 3.7500000000000000e-01 516 4.3750000000000000e-01 517 6.2500000000000000e-01 518 6.2500000000000000e-01 519 6.2500000000000000e-01 520 6.2500000000000000e-01 521 6.2500000000000000e-01 522 6.2500000000000000e-01 523 6.2500000000000000e-01 524 6.2500000000000000e-01 525 6.2500000000000000e-01 526 6.2500000000000000e-01 527 7.5000000000000000e-01 528 6.2500000000000000e-01 529 6.2500000000000000e-01 530 7.5000000000000000e-01 531 6.2500000000000000e-01 532 6.2500000000000000e-01 533 7.5000000000000000e-01 534 8.7500000000000000e-01 535 8.7500000000000000e-01 536 5.0000000000000000e-01 537 5.0000000000000000e-01 538 8.7500000000000000e-01 539 8.7500000000000000e-01 540 1.0000000000000000e+00 541 8.7500000000000000e-01 542 1.0000000000000000e+00 543 1.0000000000000000e+00 544 8.7500000000000000e-01 545 8.7500000000000000e-01 546 1.0000000000000000e+00 547 1.0000000000000000e+00 548 1.0000000000000000e+00 549 8.7500000000000000e-01 550 1.0000000000000000e+00 551 1.0000000000000000e+00 552 8.7500000000000000e-01 553 8.7500000000000000e-01 554 8.7500000000000000e-01 555 8.7500000000000000e-01 556 7.5000000000000000e-01 557 8.7500000000000000e-01 558 8.7500000000000000e-01 559 1.0000000000000000e+00 560 1.0000000000000000e+00 561 8.7500000000000000e-01 562 1.0000000000000000e+00 563 1.0000000000000000e+00 564 1.0000000000000000e+00 565 1.0000000000000000e+00 566 7.5000000000000000e-01 567 8.7500000000000000e-01 568 8.7500000000000000e-01 569 8.7500000000000000e-01 570 6.2500000000000000e-01 571 7.5000000000000000e-01 572 8.7500000000000000e-01 573 6.2500000000000000e-01 574 7.5000000000000000e-01 575 7.5000000000000000e-01 576 6.2500000000000000e-01 577 8.7500000000000000e-01 578 8.7500000000000000e-01 579 8.7500000000000000e-01 580 1.0000000000000000e+00 581 8.7500000000000000e-01 582 8.7500000000000000e-01 583 1.0000000000000000e+00 584 1.0000000000000000e+00 585 1.0000000000000000e+00 586 1.0000000000000000e+00 587 6.2500000000000000e-01 588 5.0000000000000000e-01 589 6.2500000000000000e-01 590 5.0000000000000000e-01 591 5.0000000000000000e-01 592 7.5000000000000000e-01 593 7.5000000000000000e-01 594 8.7500000000000000e-01 595 7.5000000000000000e-01 596 8.7500000000000000e-01 597 1.0000000000000000e+00 598 8.7500000000000000e-01 599 8.7500000000000000e-01 600 8.7500000000000000e-01 601 8.7500000000000000e-01 602 7.5000000000000000e-01 603 1.0000000000000000e+00 604 8.7500000000000000e-01 605 1.0000000000000000e+00 606 1.0000000000000000e+00 607 1.0000000000000000e+00 608 3.7500000000000000e-01 609 3.7500000000000000e-01 610 3.7500000000000000e-01 611 2.5000000000000000e-01 612 1.2500000000000000e-01 613 2.5000000000000000e-01 614 3.7500000000000000e-01 hypre-2.33.0/src/test/TEST_ams/mfem.x.00003000066400000000000000000000146511477326011500177060ustar00rootroot00000000000000615 857 615 1.0000000000000000e+00 616 7.5000000000000000e-01 617 7.5000000000000000e-01 618 1.0000000000000000e+00 619 5.0000000000000000e-01 620 5.0000000000000000e-01 621 5.0000000000000000e-01 622 5.0000000000000000e-01 623 7.5000000000000000e-01 624 7.5000000000000000e-01 625 7.5000000000000000e-01 626 1.0000000000000000e+00 627 5.0000000000000000e-01 628 5.0000000000000000e-01 629 1.0000000000000000e+00 630 1.0000000000000000e+00 631 7.5000000000000000e-01 632 7.5000000000000000e-01 633 5.0000000000000000e-01 634 2.5000000000000000e-01 635 5.0000000000000000e-01 636 0.0000000000000000e+00 637 0.0000000000000000e+00 638 7.5000000000000000e-01 639 7.5000000000000000e-01 640 5.0000000000000000e-01 641 1.0000000000000000e+00 642 1.0000000000000000e+00 643 1.0000000000000000e+00 644 5.0000000000000000e-01 645 7.5000000000000000e-01 646 1.0000000000000000e+00 647 1.0000000000000000e+00 648 2.5000000000000000e-01 649 2.5000000000000000e-01 650 2.5000000000000000e-01 651 0.0000000000000000e+00 652 0.0000000000000000e+00 653 0.0000000000000000e+00 654 1.0000000000000000e+00 655 5.0000000000000000e-01 656 7.5000000000000000e-01 657 8.7500000000000000e-01 658 8.7500000000000000e-01 659 8.7500000000000000e-01 660 7.5000000000000000e-01 661 8.7500000000000000e-01 662 1.0000000000000000e+00 663 6.2500000000000000e-01 664 6.2500000000000000e-01 665 5.0000000000000000e-01 666 6.2500000000000000e-01 667 5.0000000000000000e-01 668 5.0000000000000000e-01 669 6.2500000000000000e-01 670 6.2500000000000000e-01 671 6.2500000000000000e-01 672 6.2500000000000000e-01 673 5.0000000000000000e-01 674 8.7500000000000000e-01 675 7.5000000000000000e-01 676 7.5000000000000000e-01 677 7.5000000000000000e-01 678 8.7500000000000000e-01 679 7.5000000000000000e-01 680 7.5000000000000000e-01 681 8.7500000000000000e-01 682 7.5000000000000000e-01 683 7.5000000000000000e-01 684 8.7500000000000000e-01 685 8.7500000000000000e-01 686 8.7500000000000000e-01 687 1.0000000000000000e+00 688 6.2500000000000000e-01 689 6.2500000000000000e-01 690 6.2500000000000000e-01 691 7.5000000000000000e-01 692 6.2500000000000000e-01 693 5.0000000000000000e-01 694 8.7500000000000000e-01 695 8.7500000000000000e-01 696 1.0000000000000000e+00 697 1.0000000000000000e+00 698 1.0000000000000000e+00 699 7.5000000000000000e-01 700 7.5000000000000000e-01 701 7.5000000000000000e-01 702 6.2500000000000000e-01 703 6.2500000000000000e-01 704 3.7500000000000000e-01 705 3.7500000000000000e-01 706 3.7500000000000000e-01 707 2.5000000000000000e-01 708 3.7500000000000000e-01 709 5.0000000000000000e-01 710 1.2500000000000000e-01 711 1.2500000000000000e-01 712 1.2500000000000000e-01 713 1.2500000000000000e-01 714 0.0000000000000000e+00 715 7.5000000000000000e-01 716 7.5000000000000000e-01 717 7.5000000000000000e-01 718 6.2500000000000000e-01 719 6.2500000000000000e-01 720 8.7500000000000000e-01 721 7.5000000000000000e-01 722 7.5000000000000000e-01 723 8.7500000000000000e-01 724 8.7500000000000000e-01 725 2.5000000000000000e-01 726 6.2500000000000000e-01 727 5.0000000000000000e-01 728 5.0000000000000000e-01 729 6.2500000000000000e-01 730 8.7500000000000000e-01 731 1.0000000000000000e+00 732 8.7500000000000000e-01 733 1.0000000000000000e+00 734 1.0000000000000000e+00 735 8.7500000000000000e-01 736 1.0000000000000000e+00 737 1.0000000000000000e+00 738 1.0000000000000000e+00 739 1.0000000000000000e+00 740 1.0000000000000000e+00 741 7.5000000000000000e-01 742 8.7500000000000000e-01 743 8.7500000000000000e-01 744 6.2500000000000000e-01 745 6.2500000000000000e-01 746 7.5000000000000000e-01 747 6.2500000000000000e-01 748 5.0000000000000000e-01 749 6.2500000000000000e-01 750 5.0000000000000000e-01 751 8.7500000000000000e-01 752 7.5000000000000000e-01 753 7.5000000000000000e-01 754 8.7500000000000000e-01 755 8.7500000000000000e-01 756 6.2500000000000000e-01 757 7.5000000000000000e-01 758 6.2500000000000000e-01 759 5.0000000000000000e-01 760 5.0000000000000000e-01 761 5.0000000000000000e-01 762 6.2500000000000000e-01 763 6.2500000000000000e-01 764 6.2500000000000000e-01 765 6.2500000000000000e-01 766 6.2500000000000000e-01 767 6.2500000000000000e-01 768 5.0000000000000000e-01 769 6.2500000000000000e-01 770 8.7500000000000000e-01 771 1.0000000000000000e+00 772 1.0000000000000000e+00 773 1.0000000000000000e+00 774 7.5000000000000000e-01 775 7.5000000000000000e-01 776 8.7500000000000000e-01 777 8.7500000000000000e-01 778 1.0000000000000000e+00 779 5.0000000000000000e-01 780 8.7500000000000000e-01 781 8.7500000000000000e-01 782 1.0000000000000000e+00 783 7.5000000000000000e-01 784 8.7500000000000000e-01 785 8.7500000000000000e-01 786 1.0000000000000000e+00 787 7.5000000000000000e-01 788 8.7500000000000000e-01 789 8.7500000000000000e-01 790 1.0000000000000000e+00 791 1.0000000000000000e+00 792 1.0000000000000000e+00 793 1.0000000000000000e+00 794 8.7500000000000000e-01 795 8.7500000000000000e-01 796 3.7500000000000000e-01 797 5.0000000000000000e-01 798 5.0000000000000000e-01 799 3.7500000000000000e-01 800 5.0000000000000000e-01 801 5.0000000000000000e-01 802 2.5000000000000000e-01 803 2.5000000000000000e-01 804 3.7500000000000000e-01 805 3.7500000000000000e-01 806 1.2500000000000000e-01 807 3.7500000000000000e-01 808 3.7500000000000000e-01 809 2.5000000000000000e-01 810 3.7500000000000000e-01 811 3.7500000000000000e-01 812 3.7500000000000000e-01 813 3.7500000000000000e-01 814 2.5000000000000000e-01 815 2.5000000000000000e-01 816 3.7500000000000000e-01 817 3.7500000000000000e-01 818 1.2500000000000000e-01 819 1.2500000000000000e-01 820 1.2500000000000000e-01 821 2.5000000000000000e-01 822 1.2500000000000000e-01 823 0.0000000000000000e+00 824 1.2500000000000000e-01 825 1.2500000000000000e-01 826 1.2500000000000000e-01 827 0.0000000000000000e+00 828 0.0000000000000000e+00 829 0.0000000000000000e+00 830 0.0000000000000000e+00 831 1.2500000000000000e-01 832 0.0000000000000000e+00 833 8.7500000000000000e-01 834 1.0000000000000000e+00 835 8.7500000000000000e-01 836 1.0000000000000000e+00 837 1.0000000000000000e+00 838 1.0000000000000000e+00 839 1.0000000000000000e+00 840 8.7500000000000000e-01 841 8.7500000000000000e-01 842 6.2500000000000000e-01 843 6.2500000000000000e-01 844 6.2500000000000000e-01 845 5.0000000000000000e-01 846 5.0000000000000000e-01 847 0.0000000000000000e+00 848 1.2500000000000000e-01 849 0.0000000000000000e+00 850 6.2500000000000000e-01 851 6.2500000000000000e-01 852 6.2500000000000000e-01 853 7.5000000000000000e-01 854 6.2500000000000000e-01 855 6.2500000000000000e-01 856 7.5000000000000000e-01 857 8.7500000000000000e-01 hypre-2.33.0/src/test/TEST_ams/mfem.x0.00000000066400000000000000000000705101477326011500177570ustar00rootroot000000000000001 1075 1 0.0000000000000000e+00 2 0.0000000000000000e+00 3 0.0000000000000000e+00 4 0.0000000000000000e+00 5 0.0000000000000000e+00 6 0.0000000000000000e+00 7 0.0000000000000000e+00 8 0.0000000000000000e+00 9 0.0000000000000000e+00 10 0.0000000000000000e+00 11 0.0000000000000000e+00 12 0.0000000000000000e+00 13 0.0000000000000000e+00 14 0.0000000000000000e+00 15 0.0000000000000000e+00 16 0.0000000000000000e+00 17 0.0000000000000000e+00 18 0.0000000000000000e+00 19 0.0000000000000000e+00 20 0.0000000000000000e+00 21 0.0000000000000000e+00 22 0.0000000000000000e+00 23 0.0000000000000000e+00 24 0.0000000000000000e+00 25 0.0000000000000000e+00 26 0.0000000000000000e+00 27 0.0000000000000000e+00 28 0.0000000000000000e+00 29 0.0000000000000000e+00 30 0.0000000000000000e+00 31 0.0000000000000000e+00 32 0.0000000000000000e+00 33 0.0000000000000000e+00 34 0.0000000000000000e+00 35 0.0000000000000000e+00 36 0.0000000000000000e+00 37 0.0000000000000000e+00 38 0.0000000000000000e+00 39 0.0000000000000000e+00 40 0.0000000000000000e+00 41 0.0000000000000000e+00 42 0.0000000000000000e+00 43 0.0000000000000000e+00 44 0.0000000000000000e+00 45 0.0000000000000000e+00 46 0.0000000000000000e+00 47 0.0000000000000000e+00 48 0.0000000000000000e+00 49 0.0000000000000000e+00 50 0.0000000000000000e+00 51 0.0000000000000000e+00 52 0.0000000000000000e+00 53 0.0000000000000000e+00 54 0.0000000000000000e+00 55 0.0000000000000000e+00 56 0.0000000000000000e+00 57 0.0000000000000000e+00 58 0.0000000000000000e+00 59 0.0000000000000000e+00 60 0.0000000000000000e+00 61 0.0000000000000000e+00 62 0.0000000000000000e+00 63 0.0000000000000000e+00 64 0.0000000000000000e+00 65 0.0000000000000000e+00 66 0.0000000000000000e+00 67 0.0000000000000000e+00 68 0.0000000000000000e+00 69 0.0000000000000000e+00 70 0.0000000000000000e+00 71 0.0000000000000000e+00 72 0.0000000000000000e+00 73 0.0000000000000000e+00 74 0.0000000000000000e+00 75 0.0000000000000000e+00 76 0.0000000000000000e+00 77 0.0000000000000000e+00 78 0.0000000000000000e+00 79 0.0000000000000000e+00 80 0.0000000000000000e+00 81 0.0000000000000000e+00 82 0.0000000000000000e+00 83 0.0000000000000000e+00 84 0.0000000000000000e+00 85 0.0000000000000000e+00 86 0.0000000000000000e+00 87 0.0000000000000000e+00 88 0.0000000000000000e+00 89 0.0000000000000000e+00 90 0.0000000000000000e+00 91 0.0000000000000000e+00 92 0.0000000000000000e+00 93 0.0000000000000000e+00 94 0.0000000000000000e+00 95 0.0000000000000000e+00 96 0.0000000000000000e+00 97 0.0000000000000000e+00 98 0.0000000000000000e+00 99 0.0000000000000000e+00 100 0.0000000000000000e+00 101 0.0000000000000000e+00 102 0.0000000000000000e+00 103 0.0000000000000000e+00 104 0.0000000000000000e+00 105 0.0000000000000000e+00 106 0.0000000000000000e+00 107 0.0000000000000000e+00 108 0.0000000000000000e+00 109 0.0000000000000000e+00 110 0.0000000000000000e+00 111 0.0000000000000000e+00 112 0.0000000000000000e+00 113 0.0000000000000000e+00 114 0.0000000000000000e+00 115 0.0000000000000000e+00 116 0.0000000000000000e+00 117 0.0000000000000000e+00 118 0.0000000000000000e+00 119 0.0000000000000000e+00 120 0.0000000000000000e+00 121 0.0000000000000000e+00 122 0.0000000000000000e+00 123 0.0000000000000000e+00 124 0.0000000000000000e+00 125 0.0000000000000000e+00 126 0.0000000000000000e+00 127 0.0000000000000000e+00 128 0.0000000000000000e+00 129 0.0000000000000000e+00 130 0.0000000000000000e+00 131 0.0000000000000000e+00 132 0.0000000000000000e+00 133 0.0000000000000000e+00 134 0.0000000000000000e+00 135 0.0000000000000000e+00 136 0.0000000000000000e+00 137 0.0000000000000000e+00 138 0.0000000000000000e+00 139 0.0000000000000000e+00 140 0.0000000000000000e+00 141 0.0000000000000000e+00 142 0.0000000000000000e+00 143 0.0000000000000000e+00 144 0.0000000000000000e+00 145 0.0000000000000000e+00 146 0.0000000000000000e+00 147 0.0000000000000000e+00 148 0.0000000000000000e+00 149 0.0000000000000000e+00 150 0.0000000000000000e+00 151 0.0000000000000000e+00 152 0.0000000000000000e+00 153 0.0000000000000000e+00 154 0.0000000000000000e+00 155 0.0000000000000000e+00 156 0.0000000000000000e+00 157 0.0000000000000000e+00 158 0.0000000000000000e+00 159 0.0000000000000000e+00 160 0.0000000000000000e+00 161 0.0000000000000000e+00 162 0.0000000000000000e+00 163 0.0000000000000000e+00 164 0.0000000000000000e+00 165 0.0000000000000000e+00 166 0.0000000000000000e+00 167 0.0000000000000000e+00 168 0.0000000000000000e+00 169 0.0000000000000000e+00 170 0.0000000000000000e+00 171 0.0000000000000000e+00 172 0.0000000000000000e+00 173 0.0000000000000000e+00 174 0.0000000000000000e+00 175 0.0000000000000000e+00 176 0.0000000000000000e+00 177 0.0000000000000000e+00 178 0.0000000000000000e+00 179 0.0000000000000000e+00 180 0.0000000000000000e+00 181 0.0000000000000000e+00 182 0.0000000000000000e+00 183 0.0000000000000000e+00 184 0.0000000000000000e+00 185 0.0000000000000000e+00 186 0.0000000000000000e+00 187 0.0000000000000000e+00 188 0.0000000000000000e+00 189 0.0000000000000000e+00 190 0.0000000000000000e+00 191 0.0000000000000000e+00 192 0.0000000000000000e+00 193 0.0000000000000000e+00 194 0.0000000000000000e+00 195 0.0000000000000000e+00 196 0.0000000000000000e+00 197 0.0000000000000000e+00 198 0.0000000000000000e+00 199 0.0000000000000000e+00 200 0.0000000000000000e+00 201 0.0000000000000000e+00 202 0.0000000000000000e+00 203 0.0000000000000000e+00 204 0.0000000000000000e+00 205 0.0000000000000000e+00 206 0.0000000000000000e+00 207 0.0000000000000000e+00 208 0.0000000000000000e+00 209 0.0000000000000000e+00 210 0.0000000000000000e+00 211 0.0000000000000000e+00 212 0.0000000000000000e+00 213 0.0000000000000000e+00 214 0.0000000000000000e+00 215 0.0000000000000000e+00 216 0.0000000000000000e+00 217 0.0000000000000000e+00 218 0.0000000000000000e+00 219 0.0000000000000000e+00 220 0.0000000000000000e+00 221 0.0000000000000000e+00 222 0.0000000000000000e+00 223 0.0000000000000000e+00 224 0.0000000000000000e+00 225 0.0000000000000000e+00 226 0.0000000000000000e+00 227 0.0000000000000000e+00 228 0.0000000000000000e+00 229 0.0000000000000000e+00 230 0.0000000000000000e+00 231 0.0000000000000000e+00 232 0.0000000000000000e+00 233 0.0000000000000000e+00 234 0.0000000000000000e+00 235 0.0000000000000000e+00 236 0.0000000000000000e+00 237 0.0000000000000000e+00 238 0.0000000000000000e+00 239 0.0000000000000000e+00 240 0.0000000000000000e+00 241 0.0000000000000000e+00 242 0.0000000000000000e+00 243 0.0000000000000000e+00 244 0.0000000000000000e+00 245 0.0000000000000000e+00 246 0.0000000000000000e+00 247 0.0000000000000000e+00 248 0.0000000000000000e+00 249 0.0000000000000000e+00 250 0.0000000000000000e+00 251 0.0000000000000000e+00 252 0.0000000000000000e+00 253 0.0000000000000000e+00 254 0.0000000000000000e+00 255 0.0000000000000000e+00 256 0.0000000000000000e+00 257 0.0000000000000000e+00 258 0.0000000000000000e+00 259 0.0000000000000000e+00 260 0.0000000000000000e+00 261 0.0000000000000000e+00 262 0.0000000000000000e+00 263 0.0000000000000000e+00 264 0.0000000000000000e+00 265 0.0000000000000000e+00 266 0.0000000000000000e+00 267 0.0000000000000000e+00 268 0.0000000000000000e+00 269 0.0000000000000000e+00 270 0.0000000000000000e+00 271 0.0000000000000000e+00 272 0.0000000000000000e+00 273 0.0000000000000000e+00 274 0.0000000000000000e+00 275 0.0000000000000000e+00 276 0.0000000000000000e+00 277 0.0000000000000000e+00 278 0.0000000000000000e+00 279 0.0000000000000000e+00 280 0.0000000000000000e+00 281 0.0000000000000000e+00 282 0.0000000000000000e+00 283 0.0000000000000000e+00 284 0.0000000000000000e+00 285 0.0000000000000000e+00 286 0.0000000000000000e+00 287 0.0000000000000000e+00 288 0.0000000000000000e+00 289 0.0000000000000000e+00 290 0.0000000000000000e+00 291 0.0000000000000000e+00 292 0.0000000000000000e+00 293 0.0000000000000000e+00 294 0.0000000000000000e+00 295 0.0000000000000000e+00 296 0.0000000000000000e+00 297 0.0000000000000000e+00 298 0.0000000000000000e+00 299 0.0000000000000000e+00 300 0.0000000000000000e+00 301 0.0000000000000000e+00 302 0.0000000000000000e+00 303 0.0000000000000000e+00 304 0.0000000000000000e+00 305 0.0000000000000000e+00 306 0.0000000000000000e+00 307 0.0000000000000000e+00 308 0.0000000000000000e+00 309 0.0000000000000000e+00 310 0.0000000000000000e+00 311 0.0000000000000000e+00 312 0.0000000000000000e+00 313 0.0000000000000000e+00 314 0.0000000000000000e+00 315 0.0000000000000000e+00 316 0.0000000000000000e+00 317 0.0000000000000000e+00 318 0.0000000000000000e+00 319 0.0000000000000000e+00 320 0.0000000000000000e+00 321 0.0000000000000000e+00 322 0.0000000000000000e+00 323 0.0000000000000000e+00 324 0.0000000000000000e+00 325 0.0000000000000000e+00 326 0.0000000000000000e+00 327 0.0000000000000000e+00 328 0.0000000000000000e+00 329 0.0000000000000000e+00 330 0.0000000000000000e+00 331 0.0000000000000000e+00 332 0.0000000000000000e+00 333 0.0000000000000000e+00 334 0.0000000000000000e+00 335 0.0000000000000000e+00 336 0.0000000000000000e+00 337 0.0000000000000000e+00 338 0.0000000000000000e+00 339 0.0000000000000000e+00 340 0.0000000000000000e+00 341 0.0000000000000000e+00 342 0.0000000000000000e+00 343 0.0000000000000000e+00 344 0.0000000000000000e+00 345 0.0000000000000000e+00 346 0.0000000000000000e+00 347 0.0000000000000000e+00 348 0.0000000000000000e+00 349 0.0000000000000000e+00 350 0.0000000000000000e+00 351 0.0000000000000000e+00 352 0.0000000000000000e+00 353 0.0000000000000000e+00 354 0.0000000000000000e+00 355 0.0000000000000000e+00 356 0.0000000000000000e+00 357 0.0000000000000000e+00 358 0.0000000000000000e+00 359 0.0000000000000000e+00 360 0.0000000000000000e+00 361 0.0000000000000000e+00 362 0.0000000000000000e+00 363 0.0000000000000000e+00 364 0.0000000000000000e+00 365 0.0000000000000000e+00 366 0.0000000000000000e+00 367 0.0000000000000000e+00 368 0.0000000000000000e+00 369 0.0000000000000000e+00 370 0.0000000000000000e+00 371 0.0000000000000000e+00 372 0.0000000000000000e+00 373 0.0000000000000000e+00 374 0.0000000000000000e+00 375 0.0000000000000000e+00 376 0.0000000000000000e+00 377 0.0000000000000000e+00 378 0.0000000000000000e+00 379 0.0000000000000000e+00 380 0.0000000000000000e+00 381 0.0000000000000000e+00 382 0.0000000000000000e+00 383 0.0000000000000000e+00 384 0.0000000000000000e+00 385 0.0000000000000000e+00 386 0.0000000000000000e+00 387 0.0000000000000000e+00 388 0.0000000000000000e+00 389 0.0000000000000000e+00 390 0.0000000000000000e+00 391 0.0000000000000000e+00 392 0.0000000000000000e+00 393 0.0000000000000000e+00 394 0.0000000000000000e+00 395 0.0000000000000000e+00 396 0.0000000000000000e+00 397 0.0000000000000000e+00 398 0.0000000000000000e+00 399 0.0000000000000000e+00 400 0.0000000000000000e+00 401 0.0000000000000000e+00 402 0.0000000000000000e+00 403 0.0000000000000000e+00 404 0.0000000000000000e+00 405 0.0000000000000000e+00 406 0.0000000000000000e+00 407 0.0000000000000000e+00 408 0.0000000000000000e+00 409 0.0000000000000000e+00 410 0.0000000000000000e+00 411 0.0000000000000000e+00 412 0.0000000000000000e+00 413 0.0000000000000000e+00 414 0.0000000000000000e+00 415 0.0000000000000000e+00 416 0.0000000000000000e+00 417 0.0000000000000000e+00 418 0.0000000000000000e+00 419 0.0000000000000000e+00 420 0.0000000000000000e+00 421 0.0000000000000000e+00 422 0.0000000000000000e+00 423 0.0000000000000000e+00 424 0.0000000000000000e+00 425 0.0000000000000000e+00 426 0.0000000000000000e+00 427 0.0000000000000000e+00 428 0.0000000000000000e+00 429 0.0000000000000000e+00 430 0.0000000000000000e+00 431 0.0000000000000000e+00 432 0.0000000000000000e+00 433 0.0000000000000000e+00 434 0.0000000000000000e+00 435 0.0000000000000000e+00 436 0.0000000000000000e+00 437 0.0000000000000000e+00 438 0.0000000000000000e+00 439 0.0000000000000000e+00 440 0.0000000000000000e+00 441 0.0000000000000000e+00 442 0.0000000000000000e+00 443 0.0000000000000000e+00 444 0.0000000000000000e+00 445 0.0000000000000000e+00 446 0.0000000000000000e+00 447 0.0000000000000000e+00 448 0.0000000000000000e+00 449 0.0000000000000000e+00 450 0.0000000000000000e+00 451 0.0000000000000000e+00 452 0.0000000000000000e+00 453 0.0000000000000000e+00 454 0.0000000000000000e+00 455 0.0000000000000000e+00 456 0.0000000000000000e+00 457 0.0000000000000000e+00 458 0.0000000000000000e+00 459 0.0000000000000000e+00 460 0.0000000000000000e+00 461 0.0000000000000000e+00 462 0.0000000000000000e+00 463 0.0000000000000000e+00 464 0.0000000000000000e+00 465 0.0000000000000000e+00 466 0.0000000000000000e+00 467 0.0000000000000000e+00 468 0.0000000000000000e+00 469 0.0000000000000000e+00 470 0.0000000000000000e+00 471 0.0000000000000000e+00 472 0.0000000000000000e+00 473 0.0000000000000000e+00 474 0.0000000000000000e+00 475 0.0000000000000000e+00 476 0.0000000000000000e+00 477 0.0000000000000000e+00 478 0.0000000000000000e+00 479 0.0000000000000000e+00 480 0.0000000000000000e+00 481 0.0000000000000000e+00 482 0.0000000000000000e+00 483 0.0000000000000000e+00 484 0.0000000000000000e+00 485 0.0000000000000000e+00 486 0.0000000000000000e+00 487 0.0000000000000000e+00 488 0.0000000000000000e+00 489 0.0000000000000000e+00 490 0.0000000000000000e+00 491 0.0000000000000000e+00 492 0.0000000000000000e+00 493 0.0000000000000000e+00 494 0.0000000000000000e+00 495 0.0000000000000000e+00 496 0.0000000000000000e+00 497 0.0000000000000000e+00 498 0.0000000000000000e+00 499 0.0000000000000000e+00 500 0.0000000000000000e+00 501 0.0000000000000000e+00 502 0.0000000000000000e+00 503 0.0000000000000000e+00 504 0.0000000000000000e+00 505 0.0000000000000000e+00 506 0.0000000000000000e+00 507 0.0000000000000000e+00 508 0.0000000000000000e+00 509 0.0000000000000000e+00 510 0.0000000000000000e+00 511 0.0000000000000000e+00 512 0.0000000000000000e+00 513 0.0000000000000000e+00 514 0.0000000000000000e+00 515 0.0000000000000000e+00 516 0.0000000000000000e+00 517 0.0000000000000000e+00 518 0.0000000000000000e+00 519 0.0000000000000000e+00 520 0.0000000000000000e+00 521 0.0000000000000000e+00 522 0.0000000000000000e+00 523 0.0000000000000000e+00 524 0.0000000000000000e+00 525 0.0000000000000000e+00 526 0.0000000000000000e+00 527 0.0000000000000000e+00 528 0.0000000000000000e+00 529 0.0000000000000000e+00 530 0.0000000000000000e+00 531 0.0000000000000000e+00 532 0.0000000000000000e+00 533 0.0000000000000000e+00 534 0.0000000000000000e+00 535 0.0000000000000000e+00 536 0.0000000000000000e+00 537 0.0000000000000000e+00 538 0.0000000000000000e+00 539 0.0000000000000000e+00 540 0.0000000000000000e+00 541 0.0000000000000000e+00 542 0.0000000000000000e+00 543 0.0000000000000000e+00 544 0.0000000000000000e+00 545 0.0000000000000000e+00 546 0.0000000000000000e+00 547 0.0000000000000000e+00 548 0.0000000000000000e+00 549 0.0000000000000000e+00 550 0.0000000000000000e+00 551 0.0000000000000000e+00 552 0.0000000000000000e+00 553 0.0000000000000000e+00 554 0.0000000000000000e+00 555 0.0000000000000000e+00 556 0.0000000000000000e+00 557 0.0000000000000000e+00 558 0.0000000000000000e+00 559 0.0000000000000000e+00 560 0.0000000000000000e+00 561 0.0000000000000000e+00 562 0.0000000000000000e+00 563 0.0000000000000000e+00 564 0.0000000000000000e+00 565 0.0000000000000000e+00 566 0.0000000000000000e+00 567 0.0000000000000000e+00 568 0.0000000000000000e+00 569 0.0000000000000000e+00 570 0.0000000000000000e+00 571 0.0000000000000000e+00 572 0.0000000000000000e+00 573 0.0000000000000000e+00 574 0.0000000000000000e+00 575 0.0000000000000000e+00 576 0.0000000000000000e+00 577 0.0000000000000000e+00 578 0.0000000000000000e+00 579 0.0000000000000000e+00 580 0.0000000000000000e+00 581 0.0000000000000000e+00 582 0.0000000000000000e+00 583 0.0000000000000000e+00 584 0.0000000000000000e+00 585 0.0000000000000000e+00 586 0.0000000000000000e+00 587 0.0000000000000000e+00 588 0.0000000000000000e+00 589 0.0000000000000000e+00 590 0.0000000000000000e+00 591 0.0000000000000000e+00 592 0.0000000000000000e+00 593 0.0000000000000000e+00 594 0.0000000000000000e+00 595 0.0000000000000000e+00 596 0.0000000000000000e+00 597 0.0000000000000000e+00 598 0.0000000000000000e+00 599 0.0000000000000000e+00 600 0.0000000000000000e+00 601 0.0000000000000000e+00 602 0.0000000000000000e+00 603 0.0000000000000000e+00 604 0.0000000000000000e+00 605 0.0000000000000000e+00 606 0.0000000000000000e+00 607 0.0000000000000000e+00 608 0.0000000000000000e+00 609 0.0000000000000000e+00 610 0.0000000000000000e+00 611 0.0000000000000000e+00 612 0.0000000000000000e+00 613 0.0000000000000000e+00 614 0.0000000000000000e+00 615 0.0000000000000000e+00 616 0.0000000000000000e+00 617 0.0000000000000000e+00 618 0.0000000000000000e+00 619 0.0000000000000000e+00 620 0.0000000000000000e+00 621 0.0000000000000000e+00 622 0.0000000000000000e+00 623 0.0000000000000000e+00 624 0.0000000000000000e+00 625 0.0000000000000000e+00 626 0.0000000000000000e+00 627 0.0000000000000000e+00 628 0.0000000000000000e+00 629 0.0000000000000000e+00 630 0.0000000000000000e+00 631 0.0000000000000000e+00 632 0.0000000000000000e+00 633 0.0000000000000000e+00 634 0.0000000000000000e+00 635 0.0000000000000000e+00 636 0.0000000000000000e+00 637 0.0000000000000000e+00 638 0.0000000000000000e+00 639 0.0000000000000000e+00 640 0.0000000000000000e+00 641 0.0000000000000000e+00 642 0.0000000000000000e+00 643 0.0000000000000000e+00 644 0.0000000000000000e+00 645 0.0000000000000000e+00 646 0.0000000000000000e+00 647 0.0000000000000000e+00 648 0.0000000000000000e+00 649 0.0000000000000000e+00 650 0.0000000000000000e+00 651 0.0000000000000000e+00 652 0.0000000000000000e+00 653 0.0000000000000000e+00 654 0.0000000000000000e+00 655 0.0000000000000000e+00 656 0.0000000000000000e+00 657 0.0000000000000000e+00 658 0.0000000000000000e+00 659 0.0000000000000000e+00 660 0.0000000000000000e+00 661 0.0000000000000000e+00 662 0.0000000000000000e+00 663 0.0000000000000000e+00 664 0.0000000000000000e+00 665 0.0000000000000000e+00 666 0.0000000000000000e+00 667 0.0000000000000000e+00 668 0.0000000000000000e+00 669 0.0000000000000000e+00 670 0.0000000000000000e+00 671 0.0000000000000000e+00 672 0.0000000000000000e+00 673 0.0000000000000000e+00 674 0.0000000000000000e+00 675 0.0000000000000000e+00 676 0.0000000000000000e+00 677 0.0000000000000000e+00 678 0.0000000000000000e+00 679 0.0000000000000000e+00 680 0.0000000000000000e+00 681 0.0000000000000000e+00 682 0.0000000000000000e+00 683 0.0000000000000000e+00 684 0.0000000000000000e+00 685 0.0000000000000000e+00 686 0.0000000000000000e+00 687 0.0000000000000000e+00 688 0.0000000000000000e+00 689 0.0000000000000000e+00 690 0.0000000000000000e+00 691 0.0000000000000000e+00 692 0.0000000000000000e+00 693 0.0000000000000000e+00 694 0.0000000000000000e+00 695 0.0000000000000000e+00 696 0.0000000000000000e+00 697 0.0000000000000000e+00 698 0.0000000000000000e+00 699 0.0000000000000000e+00 700 0.0000000000000000e+00 701 0.0000000000000000e+00 702 0.0000000000000000e+00 703 0.0000000000000000e+00 704 0.0000000000000000e+00 705 0.0000000000000000e+00 706 0.0000000000000000e+00 707 0.0000000000000000e+00 708 0.0000000000000000e+00 709 0.0000000000000000e+00 710 0.0000000000000000e+00 711 0.0000000000000000e+00 712 0.0000000000000000e+00 713 0.0000000000000000e+00 714 0.0000000000000000e+00 715 0.0000000000000000e+00 716 0.0000000000000000e+00 717 0.0000000000000000e+00 718 0.0000000000000000e+00 719 0.0000000000000000e+00 720 0.0000000000000000e+00 721 0.0000000000000000e+00 722 0.0000000000000000e+00 723 0.0000000000000000e+00 724 0.0000000000000000e+00 725 0.0000000000000000e+00 726 0.0000000000000000e+00 727 0.0000000000000000e+00 728 0.0000000000000000e+00 729 0.0000000000000000e+00 730 0.0000000000000000e+00 731 0.0000000000000000e+00 732 0.0000000000000000e+00 733 0.0000000000000000e+00 734 0.0000000000000000e+00 735 0.0000000000000000e+00 736 0.0000000000000000e+00 737 0.0000000000000000e+00 738 0.0000000000000000e+00 739 0.0000000000000000e+00 740 0.0000000000000000e+00 741 0.0000000000000000e+00 742 0.0000000000000000e+00 743 0.0000000000000000e+00 744 0.0000000000000000e+00 745 0.0000000000000000e+00 746 0.0000000000000000e+00 747 0.0000000000000000e+00 748 0.0000000000000000e+00 749 0.0000000000000000e+00 750 0.0000000000000000e+00 751 0.0000000000000000e+00 752 0.0000000000000000e+00 753 0.0000000000000000e+00 754 0.0000000000000000e+00 755 0.0000000000000000e+00 756 0.0000000000000000e+00 757 0.0000000000000000e+00 758 0.0000000000000000e+00 759 0.0000000000000000e+00 760 0.0000000000000000e+00 761 0.0000000000000000e+00 762 0.0000000000000000e+00 763 0.0000000000000000e+00 764 0.0000000000000000e+00 765 0.0000000000000000e+00 766 0.0000000000000000e+00 767 0.0000000000000000e+00 768 0.0000000000000000e+00 769 0.0000000000000000e+00 770 0.0000000000000000e+00 771 0.0000000000000000e+00 772 0.0000000000000000e+00 773 0.0000000000000000e+00 774 0.0000000000000000e+00 775 0.0000000000000000e+00 776 0.0000000000000000e+00 777 0.0000000000000000e+00 778 0.0000000000000000e+00 779 0.0000000000000000e+00 780 0.0000000000000000e+00 781 0.0000000000000000e+00 782 0.0000000000000000e+00 783 0.0000000000000000e+00 784 0.0000000000000000e+00 785 0.0000000000000000e+00 786 0.0000000000000000e+00 787 0.0000000000000000e+00 788 0.0000000000000000e+00 789 0.0000000000000000e+00 790 0.0000000000000000e+00 791 0.0000000000000000e+00 792 0.0000000000000000e+00 793 0.0000000000000000e+00 794 0.0000000000000000e+00 795 0.0000000000000000e+00 796 0.0000000000000000e+00 797 0.0000000000000000e+00 798 0.0000000000000000e+00 799 0.0000000000000000e+00 800 0.0000000000000000e+00 801 0.0000000000000000e+00 802 0.0000000000000000e+00 803 0.0000000000000000e+00 804 0.0000000000000000e+00 805 0.0000000000000000e+00 806 0.0000000000000000e+00 807 0.0000000000000000e+00 808 0.0000000000000000e+00 809 0.0000000000000000e+00 810 0.0000000000000000e+00 811 0.0000000000000000e+00 812 0.0000000000000000e+00 813 0.0000000000000000e+00 814 0.0000000000000000e+00 815 0.0000000000000000e+00 816 0.0000000000000000e+00 817 0.0000000000000000e+00 818 0.0000000000000000e+00 819 0.0000000000000000e+00 820 0.0000000000000000e+00 821 0.0000000000000000e+00 822 0.0000000000000000e+00 823 0.0000000000000000e+00 824 0.0000000000000000e+00 825 0.0000000000000000e+00 826 0.0000000000000000e+00 827 0.0000000000000000e+00 828 0.0000000000000000e+00 829 0.0000000000000000e+00 830 0.0000000000000000e+00 831 0.0000000000000000e+00 832 0.0000000000000000e+00 833 0.0000000000000000e+00 834 0.0000000000000000e+00 835 0.0000000000000000e+00 836 0.0000000000000000e+00 837 0.0000000000000000e+00 838 0.0000000000000000e+00 839 0.0000000000000000e+00 840 0.0000000000000000e+00 841 0.0000000000000000e+00 842 0.0000000000000000e+00 843 0.0000000000000000e+00 844 0.0000000000000000e+00 845 0.0000000000000000e+00 846 0.0000000000000000e+00 847 0.0000000000000000e+00 848 0.0000000000000000e+00 849 0.0000000000000000e+00 850 0.0000000000000000e+00 851 0.0000000000000000e+00 852 0.0000000000000000e+00 853 0.0000000000000000e+00 854 0.0000000000000000e+00 855 0.0000000000000000e+00 856 0.0000000000000000e+00 857 0.0000000000000000e+00 858 0.0000000000000000e+00 859 0.0000000000000000e+00 860 0.0000000000000000e+00 861 0.0000000000000000e+00 862 0.0000000000000000e+00 863 0.0000000000000000e+00 864 0.0000000000000000e+00 865 0.0000000000000000e+00 866 0.0000000000000000e+00 867 0.0000000000000000e+00 868 0.0000000000000000e+00 869 0.0000000000000000e+00 870 0.0000000000000000e+00 871 0.0000000000000000e+00 872 0.0000000000000000e+00 873 0.0000000000000000e+00 874 0.0000000000000000e+00 875 0.0000000000000000e+00 876 0.0000000000000000e+00 877 0.0000000000000000e+00 878 0.0000000000000000e+00 879 0.0000000000000000e+00 880 0.0000000000000000e+00 881 0.0000000000000000e+00 882 0.0000000000000000e+00 883 0.0000000000000000e+00 884 0.0000000000000000e+00 885 0.0000000000000000e+00 886 0.0000000000000000e+00 887 0.0000000000000000e+00 888 0.0000000000000000e+00 889 0.0000000000000000e+00 890 0.0000000000000000e+00 891 0.0000000000000000e+00 892 0.0000000000000000e+00 893 0.0000000000000000e+00 894 0.0000000000000000e+00 895 0.0000000000000000e+00 896 0.0000000000000000e+00 897 0.0000000000000000e+00 898 0.0000000000000000e+00 899 0.0000000000000000e+00 900 0.0000000000000000e+00 901 0.0000000000000000e+00 902 0.0000000000000000e+00 903 0.0000000000000000e+00 904 0.0000000000000000e+00 905 0.0000000000000000e+00 906 0.0000000000000000e+00 907 0.0000000000000000e+00 908 0.0000000000000000e+00 909 0.0000000000000000e+00 910 0.0000000000000000e+00 911 0.0000000000000000e+00 912 0.0000000000000000e+00 913 0.0000000000000000e+00 914 0.0000000000000000e+00 915 0.0000000000000000e+00 916 0.0000000000000000e+00 917 0.0000000000000000e+00 918 0.0000000000000000e+00 919 0.0000000000000000e+00 920 0.0000000000000000e+00 921 0.0000000000000000e+00 922 0.0000000000000000e+00 923 0.0000000000000000e+00 924 0.0000000000000000e+00 925 0.0000000000000000e+00 926 0.0000000000000000e+00 927 0.0000000000000000e+00 928 0.0000000000000000e+00 929 0.0000000000000000e+00 930 0.0000000000000000e+00 931 0.0000000000000000e+00 932 0.0000000000000000e+00 933 0.0000000000000000e+00 934 0.0000000000000000e+00 935 0.0000000000000000e+00 936 0.0000000000000000e+00 937 0.0000000000000000e+00 938 0.0000000000000000e+00 939 0.0000000000000000e+00 940 0.0000000000000000e+00 941 0.0000000000000000e+00 942 0.0000000000000000e+00 943 0.0000000000000000e+00 944 0.0000000000000000e+00 945 0.0000000000000000e+00 946 0.0000000000000000e+00 947 0.0000000000000000e+00 948 0.0000000000000000e+00 949 0.0000000000000000e+00 950 0.0000000000000000e+00 951 0.0000000000000000e+00 952 0.0000000000000000e+00 953 0.0000000000000000e+00 954 0.0000000000000000e+00 955 0.0000000000000000e+00 956 0.0000000000000000e+00 957 0.0000000000000000e+00 958 0.0000000000000000e+00 959 0.0000000000000000e+00 960 0.0000000000000000e+00 961 0.0000000000000000e+00 962 0.0000000000000000e+00 963 0.0000000000000000e+00 964 0.0000000000000000e+00 965 0.0000000000000000e+00 966 0.0000000000000000e+00 967 0.0000000000000000e+00 968 0.0000000000000000e+00 969 0.0000000000000000e+00 970 0.0000000000000000e+00 971 0.0000000000000000e+00 972 0.0000000000000000e+00 973 0.0000000000000000e+00 974 0.0000000000000000e+00 975 0.0000000000000000e+00 976 0.0000000000000000e+00 977 0.0000000000000000e+00 978 0.0000000000000000e+00 979 0.0000000000000000e+00 980 0.0000000000000000e+00 981 0.0000000000000000e+00 982 0.0000000000000000e+00 983 0.0000000000000000e+00 984 0.0000000000000000e+00 985 0.0000000000000000e+00 986 0.0000000000000000e+00 987 0.0000000000000000e+00 988 0.0000000000000000e+00 989 0.0000000000000000e+00 990 0.0000000000000000e+00 991 0.0000000000000000e+00 992 0.0000000000000000e+00 993 0.0000000000000000e+00 994 0.0000000000000000e+00 995 0.0000000000000000e+00 996 0.0000000000000000e+00 997 0.0000000000000000e+00 998 0.0000000000000000e+00 999 0.0000000000000000e+00 1000 0.0000000000000000e+00 1001 0.0000000000000000e+00 1002 0.0000000000000000e+00 1003 0.0000000000000000e+00 1004 0.0000000000000000e+00 1005 0.0000000000000000e+00 1006 0.0000000000000000e+00 1007 0.0000000000000000e+00 1008 0.0000000000000000e+00 1009 0.0000000000000000e+00 1010 0.0000000000000000e+00 1011 0.0000000000000000e+00 1012 0.0000000000000000e+00 1013 0.0000000000000000e+00 1014 0.0000000000000000e+00 1015 0.0000000000000000e+00 1016 0.0000000000000000e+00 1017 0.0000000000000000e+00 1018 0.0000000000000000e+00 1019 0.0000000000000000e+00 1020 0.0000000000000000e+00 1021 0.0000000000000000e+00 1022 0.0000000000000000e+00 1023 0.0000000000000000e+00 1024 0.0000000000000000e+00 1025 0.0000000000000000e+00 1026 0.0000000000000000e+00 1027 0.0000000000000000e+00 1028 0.0000000000000000e+00 1029 0.0000000000000000e+00 1030 0.0000000000000000e+00 1031 0.0000000000000000e+00 1032 0.0000000000000000e+00 1033 0.0000000000000000e+00 1034 0.0000000000000000e+00 1035 0.0000000000000000e+00 1036 0.0000000000000000e+00 1037 0.0000000000000000e+00 1038 0.0000000000000000e+00 1039 0.0000000000000000e+00 1040 0.0000000000000000e+00 1041 0.0000000000000000e+00 1042 0.0000000000000000e+00 1043 0.0000000000000000e+00 1044 0.0000000000000000e+00 1045 0.0000000000000000e+00 1046 0.0000000000000000e+00 1047 0.0000000000000000e+00 1048 0.0000000000000000e+00 1049 0.0000000000000000e+00 1050 0.0000000000000000e+00 1051 0.0000000000000000e+00 1052 0.0000000000000000e+00 1053 0.0000000000000000e+00 1054 0.0000000000000000e+00 1055 0.0000000000000000e+00 1056 0.0000000000000000e+00 1057 0.0000000000000000e+00 1058 0.0000000000000000e+00 1059 0.0000000000000000e+00 1060 0.0000000000000000e+00 1061 0.0000000000000000e+00 1062 0.0000000000000000e+00 1063 0.0000000000000000e+00 1064 0.0000000000000000e+00 1065 0.0000000000000000e+00 1066 0.0000000000000000e+00 1067 0.0000000000000000e+00 1068 0.0000000000000000e+00 1069 0.0000000000000000e+00 1070 0.0000000000000000e+00 1071 0.0000000000000000e+00 1072 0.0000000000000000e+00 1073 0.0000000000000000e+00 1074 0.0000000000000000e+00 1075 0.0000000000000000e+00 hypre-2.33.0/src/test/TEST_ams/mfem.x0.00001000066400000000000000000001046061477326011500177640ustar00rootroot000000000000001076 2332 1076 0.0000000000000000e+00 1077 0.0000000000000000e+00 1078 0.0000000000000000e+00 1079 0.0000000000000000e+00 1080 0.0000000000000000e+00 1081 0.0000000000000000e+00 1082 0.0000000000000000e+00 1083 0.0000000000000000e+00 1084 0.0000000000000000e+00 1085 0.0000000000000000e+00 1086 0.0000000000000000e+00 1087 0.0000000000000000e+00 1088 0.0000000000000000e+00 1089 0.0000000000000000e+00 1090 0.0000000000000000e+00 1091 0.0000000000000000e+00 1092 0.0000000000000000e+00 1093 0.0000000000000000e+00 1094 0.0000000000000000e+00 1095 0.0000000000000000e+00 1096 0.0000000000000000e+00 1097 0.0000000000000000e+00 1098 0.0000000000000000e+00 1099 0.0000000000000000e+00 1100 0.0000000000000000e+00 1101 0.0000000000000000e+00 1102 0.0000000000000000e+00 1103 0.0000000000000000e+00 1104 0.0000000000000000e+00 1105 0.0000000000000000e+00 1106 0.0000000000000000e+00 1107 0.0000000000000000e+00 1108 0.0000000000000000e+00 1109 0.0000000000000000e+00 1110 0.0000000000000000e+00 1111 0.0000000000000000e+00 1112 0.0000000000000000e+00 1113 0.0000000000000000e+00 1114 0.0000000000000000e+00 1115 0.0000000000000000e+00 1116 0.0000000000000000e+00 1117 0.0000000000000000e+00 1118 0.0000000000000000e+00 1119 0.0000000000000000e+00 1120 0.0000000000000000e+00 1121 0.0000000000000000e+00 1122 0.0000000000000000e+00 1123 0.0000000000000000e+00 1124 0.0000000000000000e+00 1125 0.0000000000000000e+00 1126 0.0000000000000000e+00 1127 0.0000000000000000e+00 1128 0.0000000000000000e+00 1129 0.0000000000000000e+00 1130 0.0000000000000000e+00 1131 0.0000000000000000e+00 1132 0.0000000000000000e+00 1133 0.0000000000000000e+00 1134 0.0000000000000000e+00 1135 0.0000000000000000e+00 1136 0.0000000000000000e+00 1137 0.0000000000000000e+00 1138 0.0000000000000000e+00 1139 0.0000000000000000e+00 1140 0.0000000000000000e+00 1141 0.0000000000000000e+00 1142 0.0000000000000000e+00 1143 0.0000000000000000e+00 1144 0.0000000000000000e+00 1145 0.0000000000000000e+00 1146 0.0000000000000000e+00 1147 0.0000000000000000e+00 1148 0.0000000000000000e+00 1149 0.0000000000000000e+00 1150 0.0000000000000000e+00 1151 0.0000000000000000e+00 1152 0.0000000000000000e+00 1153 0.0000000000000000e+00 1154 0.0000000000000000e+00 1155 0.0000000000000000e+00 1156 0.0000000000000000e+00 1157 0.0000000000000000e+00 1158 0.0000000000000000e+00 1159 0.0000000000000000e+00 1160 0.0000000000000000e+00 1161 0.0000000000000000e+00 1162 0.0000000000000000e+00 1163 0.0000000000000000e+00 1164 0.0000000000000000e+00 1165 0.0000000000000000e+00 1166 0.0000000000000000e+00 1167 0.0000000000000000e+00 1168 0.0000000000000000e+00 1169 0.0000000000000000e+00 1170 0.0000000000000000e+00 1171 0.0000000000000000e+00 1172 0.0000000000000000e+00 1173 0.0000000000000000e+00 1174 0.0000000000000000e+00 1175 0.0000000000000000e+00 1176 0.0000000000000000e+00 1177 0.0000000000000000e+00 1178 0.0000000000000000e+00 1179 0.0000000000000000e+00 1180 0.0000000000000000e+00 1181 0.0000000000000000e+00 1182 0.0000000000000000e+00 1183 0.0000000000000000e+00 1184 0.0000000000000000e+00 1185 0.0000000000000000e+00 1186 0.0000000000000000e+00 1187 0.0000000000000000e+00 1188 0.0000000000000000e+00 1189 0.0000000000000000e+00 1190 0.0000000000000000e+00 1191 0.0000000000000000e+00 1192 0.0000000000000000e+00 1193 0.0000000000000000e+00 1194 0.0000000000000000e+00 1195 0.0000000000000000e+00 1196 0.0000000000000000e+00 1197 0.0000000000000000e+00 1198 0.0000000000000000e+00 1199 0.0000000000000000e+00 1200 0.0000000000000000e+00 1201 0.0000000000000000e+00 1202 0.0000000000000000e+00 1203 0.0000000000000000e+00 1204 0.0000000000000000e+00 1205 0.0000000000000000e+00 1206 0.0000000000000000e+00 1207 0.0000000000000000e+00 1208 0.0000000000000000e+00 1209 0.0000000000000000e+00 1210 0.0000000000000000e+00 1211 0.0000000000000000e+00 1212 0.0000000000000000e+00 1213 0.0000000000000000e+00 1214 0.0000000000000000e+00 1215 0.0000000000000000e+00 1216 0.0000000000000000e+00 1217 0.0000000000000000e+00 1218 0.0000000000000000e+00 1219 0.0000000000000000e+00 1220 0.0000000000000000e+00 1221 0.0000000000000000e+00 1222 0.0000000000000000e+00 1223 0.0000000000000000e+00 1224 0.0000000000000000e+00 1225 0.0000000000000000e+00 1226 0.0000000000000000e+00 1227 0.0000000000000000e+00 1228 0.0000000000000000e+00 1229 0.0000000000000000e+00 1230 0.0000000000000000e+00 1231 0.0000000000000000e+00 1232 0.0000000000000000e+00 1233 0.0000000000000000e+00 1234 0.0000000000000000e+00 1235 0.0000000000000000e+00 1236 0.0000000000000000e+00 1237 0.0000000000000000e+00 1238 0.0000000000000000e+00 1239 0.0000000000000000e+00 1240 0.0000000000000000e+00 1241 0.0000000000000000e+00 1242 0.0000000000000000e+00 1243 0.0000000000000000e+00 1244 0.0000000000000000e+00 1245 0.0000000000000000e+00 1246 0.0000000000000000e+00 1247 0.0000000000000000e+00 1248 0.0000000000000000e+00 1249 0.0000000000000000e+00 1250 0.0000000000000000e+00 1251 0.0000000000000000e+00 1252 0.0000000000000000e+00 1253 0.0000000000000000e+00 1254 0.0000000000000000e+00 1255 0.0000000000000000e+00 1256 0.0000000000000000e+00 1257 0.0000000000000000e+00 1258 0.0000000000000000e+00 1259 0.0000000000000000e+00 1260 0.0000000000000000e+00 1261 0.0000000000000000e+00 1262 0.0000000000000000e+00 1263 0.0000000000000000e+00 1264 0.0000000000000000e+00 1265 0.0000000000000000e+00 1266 0.0000000000000000e+00 1267 0.0000000000000000e+00 1268 0.0000000000000000e+00 1269 0.0000000000000000e+00 1270 0.0000000000000000e+00 1271 0.0000000000000000e+00 1272 0.0000000000000000e+00 1273 0.0000000000000000e+00 1274 0.0000000000000000e+00 1275 0.0000000000000000e+00 1276 0.0000000000000000e+00 1277 0.0000000000000000e+00 1278 0.0000000000000000e+00 1279 0.0000000000000000e+00 1280 0.0000000000000000e+00 1281 0.0000000000000000e+00 1282 0.0000000000000000e+00 1283 0.0000000000000000e+00 1284 0.0000000000000000e+00 1285 0.0000000000000000e+00 1286 0.0000000000000000e+00 1287 0.0000000000000000e+00 1288 0.0000000000000000e+00 1289 0.0000000000000000e+00 1290 0.0000000000000000e+00 1291 0.0000000000000000e+00 1292 0.0000000000000000e+00 1293 0.0000000000000000e+00 1294 0.0000000000000000e+00 1295 0.0000000000000000e+00 1296 0.0000000000000000e+00 1297 0.0000000000000000e+00 1298 0.0000000000000000e+00 1299 0.0000000000000000e+00 1300 0.0000000000000000e+00 1301 0.0000000000000000e+00 1302 0.0000000000000000e+00 1303 0.0000000000000000e+00 1304 0.0000000000000000e+00 1305 0.0000000000000000e+00 1306 0.0000000000000000e+00 1307 0.0000000000000000e+00 1308 0.0000000000000000e+00 1309 0.0000000000000000e+00 1310 0.0000000000000000e+00 1311 0.0000000000000000e+00 1312 0.0000000000000000e+00 1313 0.0000000000000000e+00 1314 0.0000000000000000e+00 1315 0.0000000000000000e+00 1316 0.0000000000000000e+00 1317 0.0000000000000000e+00 1318 0.0000000000000000e+00 1319 0.0000000000000000e+00 1320 0.0000000000000000e+00 1321 0.0000000000000000e+00 1322 0.0000000000000000e+00 1323 0.0000000000000000e+00 1324 0.0000000000000000e+00 1325 0.0000000000000000e+00 1326 0.0000000000000000e+00 1327 0.0000000000000000e+00 1328 0.0000000000000000e+00 1329 0.0000000000000000e+00 1330 0.0000000000000000e+00 1331 0.0000000000000000e+00 1332 0.0000000000000000e+00 1333 0.0000000000000000e+00 1334 0.0000000000000000e+00 1335 0.0000000000000000e+00 1336 0.0000000000000000e+00 1337 0.0000000000000000e+00 1338 0.0000000000000000e+00 1339 0.0000000000000000e+00 1340 0.0000000000000000e+00 1341 0.0000000000000000e+00 1342 0.0000000000000000e+00 1343 0.0000000000000000e+00 1344 0.0000000000000000e+00 1345 0.0000000000000000e+00 1346 0.0000000000000000e+00 1347 0.0000000000000000e+00 1348 0.0000000000000000e+00 1349 0.0000000000000000e+00 1350 0.0000000000000000e+00 1351 0.0000000000000000e+00 1352 0.0000000000000000e+00 1353 0.0000000000000000e+00 1354 0.0000000000000000e+00 1355 0.0000000000000000e+00 1356 0.0000000000000000e+00 1357 0.0000000000000000e+00 1358 0.0000000000000000e+00 1359 0.0000000000000000e+00 1360 0.0000000000000000e+00 1361 0.0000000000000000e+00 1362 0.0000000000000000e+00 1363 0.0000000000000000e+00 1364 0.0000000000000000e+00 1365 0.0000000000000000e+00 1366 0.0000000000000000e+00 1367 0.0000000000000000e+00 1368 0.0000000000000000e+00 1369 0.0000000000000000e+00 1370 0.0000000000000000e+00 1371 0.0000000000000000e+00 1372 0.0000000000000000e+00 1373 0.0000000000000000e+00 1374 0.0000000000000000e+00 1375 0.0000000000000000e+00 1376 0.0000000000000000e+00 1377 0.0000000000000000e+00 1378 0.0000000000000000e+00 1379 0.0000000000000000e+00 1380 0.0000000000000000e+00 1381 0.0000000000000000e+00 1382 0.0000000000000000e+00 1383 0.0000000000000000e+00 1384 0.0000000000000000e+00 1385 0.0000000000000000e+00 1386 0.0000000000000000e+00 1387 0.0000000000000000e+00 1388 0.0000000000000000e+00 1389 0.0000000000000000e+00 1390 0.0000000000000000e+00 1391 0.0000000000000000e+00 1392 0.0000000000000000e+00 1393 0.0000000000000000e+00 1394 0.0000000000000000e+00 1395 0.0000000000000000e+00 1396 0.0000000000000000e+00 1397 0.0000000000000000e+00 1398 0.0000000000000000e+00 1399 0.0000000000000000e+00 1400 0.0000000000000000e+00 1401 0.0000000000000000e+00 1402 0.0000000000000000e+00 1403 0.0000000000000000e+00 1404 0.0000000000000000e+00 1405 0.0000000000000000e+00 1406 0.0000000000000000e+00 1407 0.0000000000000000e+00 1408 0.0000000000000000e+00 1409 0.0000000000000000e+00 1410 0.0000000000000000e+00 1411 0.0000000000000000e+00 1412 0.0000000000000000e+00 1413 0.0000000000000000e+00 1414 0.0000000000000000e+00 1415 0.0000000000000000e+00 1416 0.0000000000000000e+00 1417 0.0000000000000000e+00 1418 0.0000000000000000e+00 1419 0.0000000000000000e+00 1420 0.0000000000000000e+00 1421 0.0000000000000000e+00 1422 0.0000000000000000e+00 1423 0.0000000000000000e+00 1424 0.0000000000000000e+00 1425 0.0000000000000000e+00 1426 0.0000000000000000e+00 1427 0.0000000000000000e+00 1428 0.0000000000000000e+00 1429 0.0000000000000000e+00 1430 0.0000000000000000e+00 1431 0.0000000000000000e+00 1432 0.0000000000000000e+00 1433 0.0000000000000000e+00 1434 0.0000000000000000e+00 1435 0.0000000000000000e+00 1436 0.0000000000000000e+00 1437 0.0000000000000000e+00 1438 0.0000000000000000e+00 1439 0.0000000000000000e+00 1440 0.0000000000000000e+00 1441 0.0000000000000000e+00 1442 0.0000000000000000e+00 1443 0.0000000000000000e+00 1444 0.0000000000000000e+00 1445 0.0000000000000000e+00 1446 0.0000000000000000e+00 1447 0.0000000000000000e+00 1448 0.0000000000000000e+00 1449 0.0000000000000000e+00 1450 0.0000000000000000e+00 1451 0.0000000000000000e+00 1452 0.0000000000000000e+00 1453 0.0000000000000000e+00 1454 0.0000000000000000e+00 1455 0.0000000000000000e+00 1456 0.0000000000000000e+00 1457 0.0000000000000000e+00 1458 0.0000000000000000e+00 1459 0.0000000000000000e+00 1460 0.0000000000000000e+00 1461 0.0000000000000000e+00 1462 0.0000000000000000e+00 1463 0.0000000000000000e+00 1464 0.0000000000000000e+00 1465 0.0000000000000000e+00 1466 0.0000000000000000e+00 1467 0.0000000000000000e+00 1468 0.0000000000000000e+00 1469 0.0000000000000000e+00 1470 0.0000000000000000e+00 1471 0.0000000000000000e+00 1472 0.0000000000000000e+00 1473 0.0000000000000000e+00 1474 0.0000000000000000e+00 1475 0.0000000000000000e+00 1476 0.0000000000000000e+00 1477 0.0000000000000000e+00 1478 0.0000000000000000e+00 1479 0.0000000000000000e+00 1480 0.0000000000000000e+00 1481 0.0000000000000000e+00 1482 0.0000000000000000e+00 1483 0.0000000000000000e+00 1484 0.0000000000000000e+00 1485 0.0000000000000000e+00 1486 0.0000000000000000e+00 1487 0.0000000000000000e+00 1488 0.0000000000000000e+00 1489 0.0000000000000000e+00 1490 0.0000000000000000e+00 1491 0.0000000000000000e+00 1492 0.0000000000000000e+00 1493 0.0000000000000000e+00 1494 0.0000000000000000e+00 1495 0.0000000000000000e+00 1496 0.0000000000000000e+00 1497 0.0000000000000000e+00 1498 0.0000000000000000e+00 1499 0.0000000000000000e+00 1500 0.0000000000000000e+00 1501 0.0000000000000000e+00 1502 0.0000000000000000e+00 1503 0.0000000000000000e+00 1504 0.0000000000000000e+00 1505 0.0000000000000000e+00 1506 0.0000000000000000e+00 1507 0.0000000000000000e+00 1508 0.0000000000000000e+00 1509 0.0000000000000000e+00 1510 0.0000000000000000e+00 1511 0.0000000000000000e+00 1512 0.0000000000000000e+00 1513 0.0000000000000000e+00 1514 0.0000000000000000e+00 1515 0.0000000000000000e+00 1516 0.0000000000000000e+00 1517 0.0000000000000000e+00 1518 0.0000000000000000e+00 1519 0.0000000000000000e+00 1520 0.0000000000000000e+00 1521 0.0000000000000000e+00 1522 0.0000000000000000e+00 1523 0.0000000000000000e+00 1524 0.0000000000000000e+00 1525 0.0000000000000000e+00 1526 0.0000000000000000e+00 1527 0.0000000000000000e+00 1528 0.0000000000000000e+00 1529 0.0000000000000000e+00 1530 0.0000000000000000e+00 1531 0.0000000000000000e+00 1532 0.0000000000000000e+00 1533 0.0000000000000000e+00 1534 0.0000000000000000e+00 1535 0.0000000000000000e+00 1536 0.0000000000000000e+00 1537 0.0000000000000000e+00 1538 0.0000000000000000e+00 1539 0.0000000000000000e+00 1540 0.0000000000000000e+00 1541 0.0000000000000000e+00 1542 0.0000000000000000e+00 1543 0.0000000000000000e+00 1544 0.0000000000000000e+00 1545 0.0000000000000000e+00 1546 0.0000000000000000e+00 1547 0.0000000000000000e+00 1548 0.0000000000000000e+00 1549 0.0000000000000000e+00 1550 0.0000000000000000e+00 1551 0.0000000000000000e+00 1552 0.0000000000000000e+00 1553 0.0000000000000000e+00 1554 0.0000000000000000e+00 1555 0.0000000000000000e+00 1556 0.0000000000000000e+00 1557 0.0000000000000000e+00 1558 0.0000000000000000e+00 1559 0.0000000000000000e+00 1560 0.0000000000000000e+00 1561 0.0000000000000000e+00 1562 0.0000000000000000e+00 1563 0.0000000000000000e+00 1564 0.0000000000000000e+00 1565 0.0000000000000000e+00 1566 0.0000000000000000e+00 1567 0.0000000000000000e+00 1568 0.0000000000000000e+00 1569 0.0000000000000000e+00 1570 0.0000000000000000e+00 1571 0.0000000000000000e+00 1572 0.0000000000000000e+00 1573 0.0000000000000000e+00 1574 0.0000000000000000e+00 1575 0.0000000000000000e+00 1576 0.0000000000000000e+00 1577 0.0000000000000000e+00 1578 0.0000000000000000e+00 1579 0.0000000000000000e+00 1580 0.0000000000000000e+00 1581 0.0000000000000000e+00 1582 0.0000000000000000e+00 1583 0.0000000000000000e+00 1584 0.0000000000000000e+00 1585 0.0000000000000000e+00 1586 0.0000000000000000e+00 1587 0.0000000000000000e+00 1588 0.0000000000000000e+00 1589 0.0000000000000000e+00 1590 0.0000000000000000e+00 1591 0.0000000000000000e+00 1592 0.0000000000000000e+00 1593 0.0000000000000000e+00 1594 0.0000000000000000e+00 1595 0.0000000000000000e+00 1596 0.0000000000000000e+00 1597 0.0000000000000000e+00 1598 0.0000000000000000e+00 1599 0.0000000000000000e+00 1600 0.0000000000000000e+00 1601 0.0000000000000000e+00 1602 0.0000000000000000e+00 1603 0.0000000000000000e+00 1604 0.0000000000000000e+00 1605 0.0000000000000000e+00 1606 0.0000000000000000e+00 1607 0.0000000000000000e+00 1608 0.0000000000000000e+00 1609 0.0000000000000000e+00 1610 0.0000000000000000e+00 1611 0.0000000000000000e+00 1612 0.0000000000000000e+00 1613 0.0000000000000000e+00 1614 0.0000000000000000e+00 1615 0.0000000000000000e+00 1616 0.0000000000000000e+00 1617 0.0000000000000000e+00 1618 0.0000000000000000e+00 1619 0.0000000000000000e+00 1620 0.0000000000000000e+00 1621 0.0000000000000000e+00 1622 0.0000000000000000e+00 1623 0.0000000000000000e+00 1624 0.0000000000000000e+00 1625 0.0000000000000000e+00 1626 0.0000000000000000e+00 1627 0.0000000000000000e+00 1628 0.0000000000000000e+00 1629 0.0000000000000000e+00 1630 0.0000000000000000e+00 1631 0.0000000000000000e+00 1632 0.0000000000000000e+00 1633 0.0000000000000000e+00 1634 0.0000000000000000e+00 1635 0.0000000000000000e+00 1636 0.0000000000000000e+00 1637 0.0000000000000000e+00 1638 0.0000000000000000e+00 1639 0.0000000000000000e+00 1640 0.0000000000000000e+00 1641 0.0000000000000000e+00 1642 0.0000000000000000e+00 1643 0.0000000000000000e+00 1644 0.0000000000000000e+00 1645 0.0000000000000000e+00 1646 0.0000000000000000e+00 1647 0.0000000000000000e+00 1648 0.0000000000000000e+00 1649 0.0000000000000000e+00 1650 0.0000000000000000e+00 1651 0.0000000000000000e+00 1652 0.0000000000000000e+00 1653 0.0000000000000000e+00 1654 0.0000000000000000e+00 1655 0.0000000000000000e+00 1656 0.0000000000000000e+00 1657 0.0000000000000000e+00 1658 0.0000000000000000e+00 1659 0.0000000000000000e+00 1660 0.0000000000000000e+00 1661 0.0000000000000000e+00 1662 0.0000000000000000e+00 1663 0.0000000000000000e+00 1664 0.0000000000000000e+00 1665 0.0000000000000000e+00 1666 0.0000000000000000e+00 1667 0.0000000000000000e+00 1668 0.0000000000000000e+00 1669 0.0000000000000000e+00 1670 0.0000000000000000e+00 1671 0.0000000000000000e+00 1672 0.0000000000000000e+00 1673 0.0000000000000000e+00 1674 0.0000000000000000e+00 1675 0.0000000000000000e+00 1676 0.0000000000000000e+00 1677 0.0000000000000000e+00 1678 0.0000000000000000e+00 1679 0.0000000000000000e+00 1680 0.0000000000000000e+00 1681 0.0000000000000000e+00 1682 0.0000000000000000e+00 1683 0.0000000000000000e+00 1684 0.0000000000000000e+00 1685 0.0000000000000000e+00 1686 0.0000000000000000e+00 1687 0.0000000000000000e+00 1688 0.0000000000000000e+00 1689 0.0000000000000000e+00 1690 0.0000000000000000e+00 1691 0.0000000000000000e+00 1692 0.0000000000000000e+00 1693 0.0000000000000000e+00 1694 0.0000000000000000e+00 1695 0.0000000000000000e+00 1696 0.0000000000000000e+00 1697 0.0000000000000000e+00 1698 0.0000000000000000e+00 1699 0.0000000000000000e+00 1700 0.0000000000000000e+00 1701 0.0000000000000000e+00 1702 0.0000000000000000e+00 1703 0.0000000000000000e+00 1704 0.0000000000000000e+00 1705 0.0000000000000000e+00 1706 0.0000000000000000e+00 1707 0.0000000000000000e+00 1708 0.0000000000000000e+00 1709 0.0000000000000000e+00 1710 0.0000000000000000e+00 1711 0.0000000000000000e+00 1712 0.0000000000000000e+00 1713 0.0000000000000000e+00 1714 0.0000000000000000e+00 1715 0.0000000000000000e+00 1716 0.0000000000000000e+00 1717 0.0000000000000000e+00 1718 0.0000000000000000e+00 1719 0.0000000000000000e+00 1720 0.0000000000000000e+00 1721 0.0000000000000000e+00 1722 0.0000000000000000e+00 1723 0.0000000000000000e+00 1724 0.0000000000000000e+00 1725 0.0000000000000000e+00 1726 0.0000000000000000e+00 1727 0.0000000000000000e+00 1728 0.0000000000000000e+00 1729 0.0000000000000000e+00 1730 0.0000000000000000e+00 1731 0.0000000000000000e+00 1732 0.0000000000000000e+00 1733 0.0000000000000000e+00 1734 0.0000000000000000e+00 1735 0.0000000000000000e+00 1736 0.0000000000000000e+00 1737 0.0000000000000000e+00 1738 0.0000000000000000e+00 1739 0.0000000000000000e+00 1740 0.0000000000000000e+00 1741 0.0000000000000000e+00 1742 0.0000000000000000e+00 1743 0.0000000000000000e+00 1744 0.0000000000000000e+00 1745 0.0000000000000000e+00 1746 0.0000000000000000e+00 1747 0.0000000000000000e+00 1748 0.0000000000000000e+00 1749 0.0000000000000000e+00 1750 0.0000000000000000e+00 1751 0.0000000000000000e+00 1752 0.0000000000000000e+00 1753 0.0000000000000000e+00 1754 0.0000000000000000e+00 1755 0.0000000000000000e+00 1756 0.0000000000000000e+00 1757 0.0000000000000000e+00 1758 0.0000000000000000e+00 1759 0.0000000000000000e+00 1760 0.0000000000000000e+00 1761 0.0000000000000000e+00 1762 0.0000000000000000e+00 1763 0.0000000000000000e+00 1764 0.0000000000000000e+00 1765 0.0000000000000000e+00 1766 0.0000000000000000e+00 1767 0.0000000000000000e+00 1768 0.0000000000000000e+00 1769 0.0000000000000000e+00 1770 0.0000000000000000e+00 1771 0.0000000000000000e+00 1772 0.0000000000000000e+00 1773 0.0000000000000000e+00 1774 0.0000000000000000e+00 1775 0.0000000000000000e+00 1776 0.0000000000000000e+00 1777 0.0000000000000000e+00 1778 0.0000000000000000e+00 1779 0.0000000000000000e+00 1780 0.0000000000000000e+00 1781 0.0000000000000000e+00 1782 0.0000000000000000e+00 1783 0.0000000000000000e+00 1784 0.0000000000000000e+00 1785 0.0000000000000000e+00 1786 0.0000000000000000e+00 1787 0.0000000000000000e+00 1788 0.0000000000000000e+00 1789 0.0000000000000000e+00 1790 0.0000000000000000e+00 1791 0.0000000000000000e+00 1792 0.0000000000000000e+00 1793 0.0000000000000000e+00 1794 0.0000000000000000e+00 1795 0.0000000000000000e+00 1796 0.0000000000000000e+00 1797 0.0000000000000000e+00 1798 0.0000000000000000e+00 1799 0.0000000000000000e+00 1800 0.0000000000000000e+00 1801 0.0000000000000000e+00 1802 0.0000000000000000e+00 1803 0.0000000000000000e+00 1804 0.0000000000000000e+00 1805 0.0000000000000000e+00 1806 0.0000000000000000e+00 1807 0.0000000000000000e+00 1808 0.0000000000000000e+00 1809 0.0000000000000000e+00 1810 0.0000000000000000e+00 1811 0.0000000000000000e+00 1812 0.0000000000000000e+00 1813 0.0000000000000000e+00 1814 0.0000000000000000e+00 1815 0.0000000000000000e+00 1816 0.0000000000000000e+00 1817 0.0000000000000000e+00 1818 0.0000000000000000e+00 1819 0.0000000000000000e+00 1820 0.0000000000000000e+00 1821 0.0000000000000000e+00 1822 0.0000000000000000e+00 1823 0.0000000000000000e+00 1824 0.0000000000000000e+00 1825 0.0000000000000000e+00 1826 0.0000000000000000e+00 1827 0.0000000000000000e+00 1828 0.0000000000000000e+00 1829 0.0000000000000000e+00 1830 0.0000000000000000e+00 1831 0.0000000000000000e+00 1832 0.0000000000000000e+00 1833 0.0000000000000000e+00 1834 0.0000000000000000e+00 1835 0.0000000000000000e+00 1836 0.0000000000000000e+00 1837 0.0000000000000000e+00 1838 0.0000000000000000e+00 1839 0.0000000000000000e+00 1840 0.0000000000000000e+00 1841 0.0000000000000000e+00 1842 0.0000000000000000e+00 1843 0.0000000000000000e+00 1844 0.0000000000000000e+00 1845 0.0000000000000000e+00 1846 0.0000000000000000e+00 1847 0.0000000000000000e+00 1848 0.0000000000000000e+00 1849 0.0000000000000000e+00 1850 0.0000000000000000e+00 1851 0.0000000000000000e+00 1852 0.0000000000000000e+00 1853 0.0000000000000000e+00 1854 0.0000000000000000e+00 1855 0.0000000000000000e+00 1856 0.0000000000000000e+00 1857 0.0000000000000000e+00 1858 0.0000000000000000e+00 1859 0.0000000000000000e+00 1860 0.0000000000000000e+00 1861 0.0000000000000000e+00 1862 0.0000000000000000e+00 1863 0.0000000000000000e+00 1864 0.0000000000000000e+00 1865 0.0000000000000000e+00 1866 0.0000000000000000e+00 1867 0.0000000000000000e+00 1868 0.0000000000000000e+00 1869 0.0000000000000000e+00 1870 0.0000000000000000e+00 1871 0.0000000000000000e+00 1872 0.0000000000000000e+00 1873 0.0000000000000000e+00 1874 0.0000000000000000e+00 1875 0.0000000000000000e+00 1876 0.0000000000000000e+00 1877 0.0000000000000000e+00 1878 0.0000000000000000e+00 1879 0.0000000000000000e+00 1880 0.0000000000000000e+00 1881 0.0000000000000000e+00 1882 0.0000000000000000e+00 1883 0.0000000000000000e+00 1884 0.0000000000000000e+00 1885 0.0000000000000000e+00 1886 0.0000000000000000e+00 1887 0.0000000000000000e+00 1888 0.0000000000000000e+00 1889 0.0000000000000000e+00 1890 0.0000000000000000e+00 1891 0.0000000000000000e+00 1892 0.0000000000000000e+00 1893 0.0000000000000000e+00 1894 0.0000000000000000e+00 1895 0.0000000000000000e+00 1896 0.0000000000000000e+00 1897 0.0000000000000000e+00 1898 0.0000000000000000e+00 1899 0.0000000000000000e+00 1900 0.0000000000000000e+00 1901 0.0000000000000000e+00 1902 0.0000000000000000e+00 1903 0.0000000000000000e+00 1904 0.0000000000000000e+00 1905 0.0000000000000000e+00 1906 0.0000000000000000e+00 1907 0.0000000000000000e+00 1908 0.0000000000000000e+00 1909 0.0000000000000000e+00 1910 0.0000000000000000e+00 1911 0.0000000000000000e+00 1912 0.0000000000000000e+00 1913 0.0000000000000000e+00 1914 0.0000000000000000e+00 1915 0.0000000000000000e+00 1916 0.0000000000000000e+00 1917 0.0000000000000000e+00 1918 0.0000000000000000e+00 1919 0.0000000000000000e+00 1920 0.0000000000000000e+00 1921 0.0000000000000000e+00 1922 0.0000000000000000e+00 1923 0.0000000000000000e+00 1924 0.0000000000000000e+00 1925 0.0000000000000000e+00 1926 0.0000000000000000e+00 1927 0.0000000000000000e+00 1928 0.0000000000000000e+00 1929 0.0000000000000000e+00 1930 0.0000000000000000e+00 1931 0.0000000000000000e+00 1932 0.0000000000000000e+00 1933 0.0000000000000000e+00 1934 0.0000000000000000e+00 1935 0.0000000000000000e+00 1936 0.0000000000000000e+00 1937 0.0000000000000000e+00 1938 0.0000000000000000e+00 1939 0.0000000000000000e+00 1940 0.0000000000000000e+00 1941 0.0000000000000000e+00 1942 0.0000000000000000e+00 1943 0.0000000000000000e+00 1944 0.0000000000000000e+00 1945 0.0000000000000000e+00 1946 0.0000000000000000e+00 1947 0.0000000000000000e+00 1948 0.0000000000000000e+00 1949 0.0000000000000000e+00 1950 0.0000000000000000e+00 1951 0.0000000000000000e+00 1952 0.0000000000000000e+00 1953 0.0000000000000000e+00 1954 0.0000000000000000e+00 1955 0.0000000000000000e+00 1956 0.0000000000000000e+00 1957 0.0000000000000000e+00 1958 0.0000000000000000e+00 1959 0.0000000000000000e+00 1960 0.0000000000000000e+00 1961 0.0000000000000000e+00 1962 0.0000000000000000e+00 1963 0.0000000000000000e+00 1964 0.0000000000000000e+00 1965 0.0000000000000000e+00 1966 0.0000000000000000e+00 1967 0.0000000000000000e+00 1968 0.0000000000000000e+00 1969 0.0000000000000000e+00 1970 0.0000000000000000e+00 1971 0.0000000000000000e+00 1972 0.0000000000000000e+00 1973 0.0000000000000000e+00 1974 0.0000000000000000e+00 1975 0.0000000000000000e+00 1976 0.0000000000000000e+00 1977 0.0000000000000000e+00 1978 0.0000000000000000e+00 1979 0.0000000000000000e+00 1980 0.0000000000000000e+00 1981 0.0000000000000000e+00 1982 0.0000000000000000e+00 1983 0.0000000000000000e+00 1984 0.0000000000000000e+00 1985 0.0000000000000000e+00 1986 0.0000000000000000e+00 1987 0.0000000000000000e+00 1988 0.0000000000000000e+00 1989 0.0000000000000000e+00 1990 0.0000000000000000e+00 1991 0.0000000000000000e+00 1992 0.0000000000000000e+00 1993 0.0000000000000000e+00 1994 0.0000000000000000e+00 1995 0.0000000000000000e+00 1996 0.0000000000000000e+00 1997 0.0000000000000000e+00 1998 0.0000000000000000e+00 1999 0.0000000000000000e+00 2000 0.0000000000000000e+00 2001 0.0000000000000000e+00 2002 0.0000000000000000e+00 2003 0.0000000000000000e+00 2004 0.0000000000000000e+00 2005 0.0000000000000000e+00 2006 0.0000000000000000e+00 2007 0.0000000000000000e+00 2008 0.0000000000000000e+00 2009 0.0000000000000000e+00 2010 0.0000000000000000e+00 2011 0.0000000000000000e+00 2012 0.0000000000000000e+00 2013 0.0000000000000000e+00 2014 0.0000000000000000e+00 2015 0.0000000000000000e+00 2016 0.0000000000000000e+00 2017 0.0000000000000000e+00 2018 0.0000000000000000e+00 2019 0.0000000000000000e+00 2020 0.0000000000000000e+00 2021 0.0000000000000000e+00 2022 0.0000000000000000e+00 2023 0.0000000000000000e+00 2024 0.0000000000000000e+00 2025 0.0000000000000000e+00 2026 0.0000000000000000e+00 2027 0.0000000000000000e+00 2028 0.0000000000000000e+00 2029 0.0000000000000000e+00 2030 0.0000000000000000e+00 2031 0.0000000000000000e+00 2032 0.0000000000000000e+00 2033 0.0000000000000000e+00 2034 0.0000000000000000e+00 2035 0.0000000000000000e+00 2036 0.0000000000000000e+00 2037 0.0000000000000000e+00 2038 0.0000000000000000e+00 2039 0.0000000000000000e+00 2040 0.0000000000000000e+00 2041 0.0000000000000000e+00 2042 0.0000000000000000e+00 2043 0.0000000000000000e+00 2044 0.0000000000000000e+00 2045 0.0000000000000000e+00 2046 0.0000000000000000e+00 2047 0.0000000000000000e+00 2048 0.0000000000000000e+00 2049 0.0000000000000000e+00 2050 0.0000000000000000e+00 2051 0.0000000000000000e+00 2052 0.0000000000000000e+00 2053 0.0000000000000000e+00 2054 0.0000000000000000e+00 2055 0.0000000000000000e+00 2056 0.0000000000000000e+00 2057 0.0000000000000000e+00 2058 0.0000000000000000e+00 2059 0.0000000000000000e+00 2060 0.0000000000000000e+00 2061 0.0000000000000000e+00 2062 0.0000000000000000e+00 2063 0.0000000000000000e+00 2064 0.0000000000000000e+00 2065 0.0000000000000000e+00 2066 0.0000000000000000e+00 2067 0.0000000000000000e+00 2068 0.0000000000000000e+00 2069 0.0000000000000000e+00 2070 0.0000000000000000e+00 2071 0.0000000000000000e+00 2072 0.0000000000000000e+00 2073 0.0000000000000000e+00 2074 0.0000000000000000e+00 2075 0.0000000000000000e+00 2076 0.0000000000000000e+00 2077 0.0000000000000000e+00 2078 0.0000000000000000e+00 2079 0.0000000000000000e+00 2080 0.0000000000000000e+00 2081 0.0000000000000000e+00 2082 0.0000000000000000e+00 2083 0.0000000000000000e+00 2084 0.0000000000000000e+00 2085 0.0000000000000000e+00 2086 0.0000000000000000e+00 2087 0.0000000000000000e+00 2088 0.0000000000000000e+00 2089 0.0000000000000000e+00 2090 0.0000000000000000e+00 2091 0.0000000000000000e+00 2092 0.0000000000000000e+00 2093 0.0000000000000000e+00 2094 0.0000000000000000e+00 2095 0.0000000000000000e+00 2096 0.0000000000000000e+00 2097 0.0000000000000000e+00 2098 0.0000000000000000e+00 2099 0.0000000000000000e+00 2100 0.0000000000000000e+00 2101 0.0000000000000000e+00 2102 0.0000000000000000e+00 2103 0.0000000000000000e+00 2104 0.0000000000000000e+00 2105 0.0000000000000000e+00 2106 0.0000000000000000e+00 2107 0.0000000000000000e+00 2108 0.0000000000000000e+00 2109 0.0000000000000000e+00 2110 0.0000000000000000e+00 2111 0.0000000000000000e+00 2112 0.0000000000000000e+00 2113 0.0000000000000000e+00 2114 0.0000000000000000e+00 2115 0.0000000000000000e+00 2116 0.0000000000000000e+00 2117 0.0000000000000000e+00 2118 0.0000000000000000e+00 2119 0.0000000000000000e+00 2120 0.0000000000000000e+00 2121 0.0000000000000000e+00 2122 0.0000000000000000e+00 2123 0.0000000000000000e+00 2124 0.0000000000000000e+00 2125 0.0000000000000000e+00 2126 0.0000000000000000e+00 2127 0.0000000000000000e+00 2128 0.0000000000000000e+00 2129 0.0000000000000000e+00 2130 0.0000000000000000e+00 2131 0.0000000000000000e+00 2132 0.0000000000000000e+00 2133 0.0000000000000000e+00 2134 0.0000000000000000e+00 2135 0.0000000000000000e+00 2136 0.0000000000000000e+00 2137 0.0000000000000000e+00 2138 0.0000000000000000e+00 2139 0.0000000000000000e+00 2140 0.0000000000000000e+00 2141 0.0000000000000000e+00 2142 0.0000000000000000e+00 2143 0.0000000000000000e+00 2144 0.0000000000000000e+00 2145 0.0000000000000000e+00 2146 0.0000000000000000e+00 2147 0.0000000000000000e+00 2148 0.0000000000000000e+00 2149 0.0000000000000000e+00 2150 0.0000000000000000e+00 2151 0.0000000000000000e+00 2152 0.0000000000000000e+00 2153 0.0000000000000000e+00 2154 0.0000000000000000e+00 2155 0.0000000000000000e+00 2156 0.0000000000000000e+00 2157 0.0000000000000000e+00 2158 0.0000000000000000e+00 2159 0.0000000000000000e+00 2160 0.0000000000000000e+00 2161 0.0000000000000000e+00 2162 0.0000000000000000e+00 2163 0.0000000000000000e+00 2164 0.0000000000000000e+00 2165 0.0000000000000000e+00 2166 0.0000000000000000e+00 2167 0.0000000000000000e+00 2168 0.0000000000000000e+00 2169 0.0000000000000000e+00 2170 0.0000000000000000e+00 2171 0.0000000000000000e+00 2172 0.0000000000000000e+00 2173 0.0000000000000000e+00 2174 0.0000000000000000e+00 2175 0.0000000000000000e+00 2176 0.0000000000000000e+00 2177 0.0000000000000000e+00 2178 0.0000000000000000e+00 2179 0.0000000000000000e+00 2180 0.0000000000000000e+00 2181 0.0000000000000000e+00 2182 0.0000000000000000e+00 2183 0.0000000000000000e+00 2184 0.0000000000000000e+00 2185 0.0000000000000000e+00 2186 0.0000000000000000e+00 2187 0.0000000000000000e+00 2188 0.0000000000000000e+00 2189 0.0000000000000000e+00 2190 0.0000000000000000e+00 2191 0.0000000000000000e+00 2192 0.0000000000000000e+00 2193 0.0000000000000000e+00 2194 0.0000000000000000e+00 2195 0.0000000000000000e+00 2196 0.0000000000000000e+00 2197 0.0000000000000000e+00 2198 0.0000000000000000e+00 2199 0.0000000000000000e+00 2200 0.0000000000000000e+00 2201 0.0000000000000000e+00 2202 0.0000000000000000e+00 2203 0.0000000000000000e+00 2204 0.0000000000000000e+00 2205 0.0000000000000000e+00 2206 0.0000000000000000e+00 2207 0.0000000000000000e+00 2208 0.0000000000000000e+00 2209 0.0000000000000000e+00 2210 0.0000000000000000e+00 2211 0.0000000000000000e+00 2212 0.0000000000000000e+00 2213 0.0000000000000000e+00 2214 0.0000000000000000e+00 2215 0.0000000000000000e+00 2216 0.0000000000000000e+00 2217 0.0000000000000000e+00 2218 0.0000000000000000e+00 2219 0.0000000000000000e+00 2220 0.0000000000000000e+00 2221 0.0000000000000000e+00 2222 0.0000000000000000e+00 2223 0.0000000000000000e+00 2224 0.0000000000000000e+00 2225 0.0000000000000000e+00 2226 0.0000000000000000e+00 2227 0.0000000000000000e+00 2228 0.0000000000000000e+00 2229 0.0000000000000000e+00 2230 0.0000000000000000e+00 2231 0.0000000000000000e+00 2232 0.0000000000000000e+00 2233 0.0000000000000000e+00 2234 0.0000000000000000e+00 2235 0.0000000000000000e+00 2236 0.0000000000000000e+00 2237 0.0000000000000000e+00 2238 0.0000000000000000e+00 2239 0.0000000000000000e+00 2240 0.0000000000000000e+00 2241 0.0000000000000000e+00 2242 0.0000000000000000e+00 2243 0.0000000000000000e+00 2244 0.0000000000000000e+00 2245 0.0000000000000000e+00 2246 0.0000000000000000e+00 2247 0.0000000000000000e+00 2248 0.0000000000000000e+00 2249 0.0000000000000000e+00 2250 0.0000000000000000e+00 2251 0.0000000000000000e+00 2252 0.0000000000000000e+00 2253 0.0000000000000000e+00 2254 0.0000000000000000e+00 2255 0.0000000000000000e+00 2256 0.0000000000000000e+00 2257 0.0000000000000000e+00 2258 0.0000000000000000e+00 2259 0.0000000000000000e+00 2260 0.0000000000000000e+00 2261 0.0000000000000000e+00 2262 0.0000000000000000e+00 2263 0.0000000000000000e+00 2264 0.0000000000000000e+00 2265 0.0000000000000000e+00 2266 0.0000000000000000e+00 2267 0.0000000000000000e+00 2268 0.0000000000000000e+00 2269 0.0000000000000000e+00 2270 0.0000000000000000e+00 2271 0.0000000000000000e+00 2272 0.0000000000000000e+00 2273 0.0000000000000000e+00 2274 0.0000000000000000e+00 2275 0.0000000000000000e+00 2276 0.0000000000000000e+00 2277 0.0000000000000000e+00 2278 0.0000000000000000e+00 2279 0.0000000000000000e+00 2280 0.0000000000000000e+00 2281 0.0000000000000000e+00 2282 0.0000000000000000e+00 2283 0.0000000000000000e+00 2284 0.0000000000000000e+00 2285 0.0000000000000000e+00 2286 0.0000000000000000e+00 2287 0.0000000000000000e+00 2288 0.0000000000000000e+00 2289 0.0000000000000000e+00 2290 0.0000000000000000e+00 2291 0.0000000000000000e+00 2292 0.0000000000000000e+00 2293 0.0000000000000000e+00 2294 0.0000000000000000e+00 2295 0.0000000000000000e+00 2296 0.0000000000000000e+00 2297 0.0000000000000000e+00 2298 0.0000000000000000e+00 2299 0.0000000000000000e+00 2300 0.0000000000000000e+00 2301 0.0000000000000000e+00 2302 0.0000000000000000e+00 2303 0.0000000000000000e+00 2304 0.0000000000000000e+00 2305 0.0000000000000000e+00 2306 0.0000000000000000e+00 2307 0.0000000000000000e+00 2308 0.0000000000000000e+00 2309 0.0000000000000000e+00 2310 0.0000000000000000e+00 2311 0.0000000000000000e+00 2312 0.0000000000000000e+00 2313 0.0000000000000000e+00 2314 0.0000000000000000e+00 2315 0.0000000000000000e+00 2316 0.0000000000000000e+00 2317 0.0000000000000000e+00 2318 0.0000000000000000e+00 2319 0.0000000000000000e+00 2320 0.0000000000000000e+00 2321 0.0000000000000000e+00 2322 0.0000000000000000e+00 2323 0.0000000000000000e+00 2324 0.0000000000000000e+00 2325 0.0000000000000000e+00 2326 0.0000000000000000e+00 2327 0.0000000000000000e+00 2328 0.0000000000000000e+00 2329 0.0000000000000000e+00 2330 0.0000000000000000e+00 2331 0.0000000000000000e+00 2332 0.0000000000000000e+00 hypre-2.33.0/src/test/TEST_ams/mfem.x0.00002000066400000000000000000001132461477326011500177650ustar00rootroot000000000000002333 3709 2333 0.0000000000000000e+00 2334 0.0000000000000000e+00 2335 0.0000000000000000e+00 2336 0.0000000000000000e+00 2337 0.0000000000000000e+00 2338 0.0000000000000000e+00 2339 0.0000000000000000e+00 2340 0.0000000000000000e+00 2341 0.0000000000000000e+00 2342 0.0000000000000000e+00 2343 0.0000000000000000e+00 2344 0.0000000000000000e+00 2345 0.0000000000000000e+00 2346 0.0000000000000000e+00 2347 0.0000000000000000e+00 2348 0.0000000000000000e+00 2349 0.0000000000000000e+00 2350 0.0000000000000000e+00 2351 0.0000000000000000e+00 2352 0.0000000000000000e+00 2353 0.0000000000000000e+00 2354 0.0000000000000000e+00 2355 0.0000000000000000e+00 2356 0.0000000000000000e+00 2357 0.0000000000000000e+00 2358 0.0000000000000000e+00 2359 0.0000000000000000e+00 2360 0.0000000000000000e+00 2361 0.0000000000000000e+00 2362 0.0000000000000000e+00 2363 0.0000000000000000e+00 2364 0.0000000000000000e+00 2365 0.0000000000000000e+00 2366 0.0000000000000000e+00 2367 0.0000000000000000e+00 2368 0.0000000000000000e+00 2369 0.0000000000000000e+00 2370 0.0000000000000000e+00 2371 0.0000000000000000e+00 2372 0.0000000000000000e+00 2373 0.0000000000000000e+00 2374 0.0000000000000000e+00 2375 0.0000000000000000e+00 2376 0.0000000000000000e+00 2377 0.0000000000000000e+00 2378 0.0000000000000000e+00 2379 0.0000000000000000e+00 2380 0.0000000000000000e+00 2381 0.0000000000000000e+00 2382 0.0000000000000000e+00 2383 0.0000000000000000e+00 2384 0.0000000000000000e+00 2385 0.0000000000000000e+00 2386 0.0000000000000000e+00 2387 0.0000000000000000e+00 2388 0.0000000000000000e+00 2389 0.0000000000000000e+00 2390 0.0000000000000000e+00 2391 0.0000000000000000e+00 2392 0.0000000000000000e+00 2393 0.0000000000000000e+00 2394 0.0000000000000000e+00 2395 0.0000000000000000e+00 2396 0.0000000000000000e+00 2397 0.0000000000000000e+00 2398 0.0000000000000000e+00 2399 0.0000000000000000e+00 2400 0.0000000000000000e+00 2401 0.0000000000000000e+00 2402 0.0000000000000000e+00 2403 0.0000000000000000e+00 2404 0.0000000000000000e+00 2405 0.0000000000000000e+00 2406 0.0000000000000000e+00 2407 0.0000000000000000e+00 2408 0.0000000000000000e+00 2409 0.0000000000000000e+00 2410 0.0000000000000000e+00 2411 0.0000000000000000e+00 2412 0.0000000000000000e+00 2413 0.0000000000000000e+00 2414 0.0000000000000000e+00 2415 0.0000000000000000e+00 2416 0.0000000000000000e+00 2417 0.0000000000000000e+00 2418 0.0000000000000000e+00 2419 0.0000000000000000e+00 2420 0.0000000000000000e+00 2421 0.0000000000000000e+00 2422 0.0000000000000000e+00 2423 0.0000000000000000e+00 2424 0.0000000000000000e+00 2425 0.0000000000000000e+00 2426 0.0000000000000000e+00 2427 0.0000000000000000e+00 2428 0.0000000000000000e+00 2429 0.0000000000000000e+00 2430 0.0000000000000000e+00 2431 0.0000000000000000e+00 2432 0.0000000000000000e+00 2433 0.0000000000000000e+00 2434 0.0000000000000000e+00 2435 0.0000000000000000e+00 2436 0.0000000000000000e+00 2437 0.0000000000000000e+00 2438 0.0000000000000000e+00 2439 0.0000000000000000e+00 2440 0.0000000000000000e+00 2441 0.0000000000000000e+00 2442 0.0000000000000000e+00 2443 0.0000000000000000e+00 2444 0.0000000000000000e+00 2445 0.0000000000000000e+00 2446 0.0000000000000000e+00 2447 0.0000000000000000e+00 2448 0.0000000000000000e+00 2449 0.0000000000000000e+00 2450 0.0000000000000000e+00 2451 0.0000000000000000e+00 2452 0.0000000000000000e+00 2453 0.0000000000000000e+00 2454 0.0000000000000000e+00 2455 0.0000000000000000e+00 2456 0.0000000000000000e+00 2457 0.0000000000000000e+00 2458 0.0000000000000000e+00 2459 0.0000000000000000e+00 2460 0.0000000000000000e+00 2461 0.0000000000000000e+00 2462 0.0000000000000000e+00 2463 0.0000000000000000e+00 2464 0.0000000000000000e+00 2465 0.0000000000000000e+00 2466 0.0000000000000000e+00 2467 0.0000000000000000e+00 2468 0.0000000000000000e+00 2469 0.0000000000000000e+00 2470 0.0000000000000000e+00 2471 0.0000000000000000e+00 2472 0.0000000000000000e+00 2473 0.0000000000000000e+00 2474 0.0000000000000000e+00 2475 0.0000000000000000e+00 2476 0.0000000000000000e+00 2477 0.0000000000000000e+00 2478 0.0000000000000000e+00 2479 0.0000000000000000e+00 2480 0.0000000000000000e+00 2481 0.0000000000000000e+00 2482 0.0000000000000000e+00 2483 0.0000000000000000e+00 2484 0.0000000000000000e+00 2485 0.0000000000000000e+00 2486 0.0000000000000000e+00 2487 0.0000000000000000e+00 2488 0.0000000000000000e+00 2489 0.0000000000000000e+00 2490 0.0000000000000000e+00 2491 0.0000000000000000e+00 2492 0.0000000000000000e+00 2493 0.0000000000000000e+00 2494 0.0000000000000000e+00 2495 0.0000000000000000e+00 2496 0.0000000000000000e+00 2497 0.0000000000000000e+00 2498 0.0000000000000000e+00 2499 0.0000000000000000e+00 2500 0.0000000000000000e+00 2501 0.0000000000000000e+00 2502 0.0000000000000000e+00 2503 0.0000000000000000e+00 2504 0.0000000000000000e+00 2505 0.0000000000000000e+00 2506 0.0000000000000000e+00 2507 0.0000000000000000e+00 2508 0.0000000000000000e+00 2509 0.0000000000000000e+00 2510 0.0000000000000000e+00 2511 0.0000000000000000e+00 2512 0.0000000000000000e+00 2513 0.0000000000000000e+00 2514 0.0000000000000000e+00 2515 0.0000000000000000e+00 2516 0.0000000000000000e+00 2517 0.0000000000000000e+00 2518 0.0000000000000000e+00 2519 0.0000000000000000e+00 2520 0.0000000000000000e+00 2521 0.0000000000000000e+00 2522 0.0000000000000000e+00 2523 0.0000000000000000e+00 2524 0.0000000000000000e+00 2525 0.0000000000000000e+00 2526 0.0000000000000000e+00 2527 0.0000000000000000e+00 2528 0.0000000000000000e+00 2529 0.0000000000000000e+00 2530 0.0000000000000000e+00 2531 0.0000000000000000e+00 2532 0.0000000000000000e+00 2533 0.0000000000000000e+00 2534 0.0000000000000000e+00 2535 0.0000000000000000e+00 2536 0.0000000000000000e+00 2537 0.0000000000000000e+00 2538 0.0000000000000000e+00 2539 0.0000000000000000e+00 2540 0.0000000000000000e+00 2541 0.0000000000000000e+00 2542 0.0000000000000000e+00 2543 0.0000000000000000e+00 2544 0.0000000000000000e+00 2545 0.0000000000000000e+00 2546 0.0000000000000000e+00 2547 0.0000000000000000e+00 2548 0.0000000000000000e+00 2549 0.0000000000000000e+00 2550 0.0000000000000000e+00 2551 0.0000000000000000e+00 2552 0.0000000000000000e+00 2553 0.0000000000000000e+00 2554 0.0000000000000000e+00 2555 0.0000000000000000e+00 2556 0.0000000000000000e+00 2557 0.0000000000000000e+00 2558 0.0000000000000000e+00 2559 0.0000000000000000e+00 2560 0.0000000000000000e+00 2561 0.0000000000000000e+00 2562 0.0000000000000000e+00 2563 0.0000000000000000e+00 2564 0.0000000000000000e+00 2565 0.0000000000000000e+00 2566 0.0000000000000000e+00 2567 0.0000000000000000e+00 2568 0.0000000000000000e+00 2569 0.0000000000000000e+00 2570 0.0000000000000000e+00 2571 0.0000000000000000e+00 2572 0.0000000000000000e+00 2573 0.0000000000000000e+00 2574 0.0000000000000000e+00 2575 0.0000000000000000e+00 2576 0.0000000000000000e+00 2577 0.0000000000000000e+00 2578 0.0000000000000000e+00 2579 0.0000000000000000e+00 2580 0.0000000000000000e+00 2581 0.0000000000000000e+00 2582 0.0000000000000000e+00 2583 0.0000000000000000e+00 2584 0.0000000000000000e+00 2585 0.0000000000000000e+00 2586 0.0000000000000000e+00 2587 0.0000000000000000e+00 2588 0.0000000000000000e+00 2589 0.0000000000000000e+00 2590 0.0000000000000000e+00 2591 0.0000000000000000e+00 2592 0.0000000000000000e+00 2593 0.0000000000000000e+00 2594 0.0000000000000000e+00 2595 0.0000000000000000e+00 2596 0.0000000000000000e+00 2597 0.0000000000000000e+00 2598 0.0000000000000000e+00 2599 0.0000000000000000e+00 2600 0.0000000000000000e+00 2601 0.0000000000000000e+00 2602 0.0000000000000000e+00 2603 0.0000000000000000e+00 2604 0.0000000000000000e+00 2605 0.0000000000000000e+00 2606 0.0000000000000000e+00 2607 0.0000000000000000e+00 2608 0.0000000000000000e+00 2609 0.0000000000000000e+00 2610 0.0000000000000000e+00 2611 0.0000000000000000e+00 2612 0.0000000000000000e+00 2613 0.0000000000000000e+00 2614 0.0000000000000000e+00 2615 0.0000000000000000e+00 2616 0.0000000000000000e+00 2617 0.0000000000000000e+00 2618 0.0000000000000000e+00 2619 0.0000000000000000e+00 2620 0.0000000000000000e+00 2621 0.0000000000000000e+00 2622 0.0000000000000000e+00 2623 0.0000000000000000e+00 2624 0.0000000000000000e+00 2625 0.0000000000000000e+00 2626 0.0000000000000000e+00 2627 0.0000000000000000e+00 2628 0.0000000000000000e+00 2629 0.0000000000000000e+00 2630 0.0000000000000000e+00 2631 0.0000000000000000e+00 2632 0.0000000000000000e+00 2633 0.0000000000000000e+00 2634 0.0000000000000000e+00 2635 0.0000000000000000e+00 2636 0.0000000000000000e+00 2637 0.0000000000000000e+00 2638 0.0000000000000000e+00 2639 0.0000000000000000e+00 2640 0.0000000000000000e+00 2641 0.0000000000000000e+00 2642 0.0000000000000000e+00 2643 0.0000000000000000e+00 2644 0.0000000000000000e+00 2645 0.0000000000000000e+00 2646 0.0000000000000000e+00 2647 0.0000000000000000e+00 2648 0.0000000000000000e+00 2649 0.0000000000000000e+00 2650 0.0000000000000000e+00 2651 0.0000000000000000e+00 2652 0.0000000000000000e+00 2653 0.0000000000000000e+00 2654 0.0000000000000000e+00 2655 0.0000000000000000e+00 2656 0.0000000000000000e+00 2657 0.0000000000000000e+00 2658 0.0000000000000000e+00 2659 0.0000000000000000e+00 2660 0.0000000000000000e+00 2661 0.0000000000000000e+00 2662 0.0000000000000000e+00 2663 0.0000000000000000e+00 2664 0.0000000000000000e+00 2665 0.0000000000000000e+00 2666 0.0000000000000000e+00 2667 0.0000000000000000e+00 2668 0.0000000000000000e+00 2669 0.0000000000000000e+00 2670 0.0000000000000000e+00 2671 0.0000000000000000e+00 2672 0.0000000000000000e+00 2673 0.0000000000000000e+00 2674 0.0000000000000000e+00 2675 0.0000000000000000e+00 2676 0.0000000000000000e+00 2677 0.0000000000000000e+00 2678 0.0000000000000000e+00 2679 0.0000000000000000e+00 2680 0.0000000000000000e+00 2681 0.0000000000000000e+00 2682 0.0000000000000000e+00 2683 0.0000000000000000e+00 2684 0.0000000000000000e+00 2685 0.0000000000000000e+00 2686 0.0000000000000000e+00 2687 0.0000000000000000e+00 2688 0.0000000000000000e+00 2689 0.0000000000000000e+00 2690 0.0000000000000000e+00 2691 0.0000000000000000e+00 2692 0.0000000000000000e+00 2693 0.0000000000000000e+00 2694 0.0000000000000000e+00 2695 0.0000000000000000e+00 2696 0.0000000000000000e+00 2697 0.0000000000000000e+00 2698 0.0000000000000000e+00 2699 0.0000000000000000e+00 2700 0.0000000000000000e+00 2701 0.0000000000000000e+00 2702 0.0000000000000000e+00 2703 0.0000000000000000e+00 2704 0.0000000000000000e+00 2705 0.0000000000000000e+00 2706 0.0000000000000000e+00 2707 0.0000000000000000e+00 2708 0.0000000000000000e+00 2709 0.0000000000000000e+00 2710 0.0000000000000000e+00 2711 0.0000000000000000e+00 2712 0.0000000000000000e+00 2713 0.0000000000000000e+00 2714 0.0000000000000000e+00 2715 0.0000000000000000e+00 2716 0.0000000000000000e+00 2717 0.0000000000000000e+00 2718 0.0000000000000000e+00 2719 0.0000000000000000e+00 2720 0.0000000000000000e+00 2721 0.0000000000000000e+00 2722 0.0000000000000000e+00 2723 0.0000000000000000e+00 2724 0.0000000000000000e+00 2725 0.0000000000000000e+00 2726 0.0000000000000000e+00 2727 0.0000000000000000e+00 2728 0.0000000000000000e+00 2729 0.0000000000000000e+00 2730 0.0000000000000000e+00 2731 0.0000000000000000e+00 2732 0.0000000000000000e+00 2733 0.0000000000000000e+00 2734 0.0000000000000000e+00 2735 0.0000000000000000e+00 2736 0.0000000000000000e+00 2737 0.0000000000000000e+00 2738 0.0000000000000000e+00 2739 0.0000000000000000e+00 2740 0.0000000000000000e+00 2741 0.0000000000000000e+00 2742 0.0000000000000000e+00 2743 0.0000000000000000e+00 2744 0.0000000000000000e+00 2745 0.0000000000000000e+00 2746 0.0000000000000000e+00 2747 0.0000000000000000e+00 2748 0.0000000000000000e+00 2749 0.0000000000000000e+00 2750 0.0000000000000000e+00 2751 0.0000000000000000e+00 2752 0.0000000000000000e+00 2753 0.0000000000000000e+00 2754 0.0000000000000000e+00 2755 0.0000000000000000e+00 2756 0.0000000000000000e+00 2757 0.0000000000000000e+00 2758 0.0000000000000000e+00 2759 0.0000000000000000e+00 2760 0.0000000000000000e+00 2761 0.0000000000000000e+00 2762 0.0000000000000000e+00 2763 0.0000000000000000e+00 2764 0.0000000000000000e+00 2765 0.0000000000000000e+00 2766 0.0000000000000000e+00 2767 0.0000000000000000e+00 2768 0.0000000000000000e+00 2769 0.0000000000000000e+00 2770 0.0000000000000000e+00 2771 0.0000000000000000e+00 2772 0.0000000000000000e+00 2773 0.0000000000000000e+00 2774 0.0000000000000000e+00 2775 0.0000000000000000e+00 2776 0.0000000000000000e+00 2777 0.0000000000000000e+00 2778 0.0000000000000000e+00 2779 0.0000000000000000e+00 2780 0.0000000000000000e+00 2781 0.0000000000000000e+00 2782 0.0000000000000000e+00 2783 0.0000000000000000e+00 2784 0.0000000000000000e+00 2785 0.0000000000000000e+00 2786 0.0000000000000000e+00 2787 0.0000000000000000e+00 2788 0.0000000000000000e+00 2789 0.0000000000000000e+00 2790 0.0000000000000000e+00 2791 0.0000000000000000e+00 2792 0.0000000000000000e+00 2793 0.0000000000000000e+00 2794 0.0000000000000000e+00 2795 0.0000000000000000e+00 2796 0.0000000000000000e+00 2797 0.0000000000000000e+00 2798 0.0000000000000000e+00 2799 0.0000000000000000e+00 2800 0.0000000000000000e+00 2801 0.0000000000000000e+00 2802 0.0000000000000000e+00 2803 0.0000000000000000e+00 2804 0.0000000000000000e+00 2805 0.0000000000000000e+00 2806 0.0000000000000000e+00 2807 0.0000000000000000e+00 2808 0.0000000000000000e+00 2809 0.0000000000000000e+00 2810 0.0000000000000000e+00 2811 0.0000000000000000e+00 2812 0.0000000000000000e+00 2813 0.0000000000000000e+00 2814 0.0000000000000000e+00 2815 0.0000000000000000e+00 2816 0.0000000000000000e+00 2817 0.0000000000000000e+00 2818 0.0000000000000000e+00 2819 0.0000000000000000e+00 2820 0.0000000000000000e+00 2821 0.0000000000000000e+00 2822 0.0000000000000000e+00 2823 0.0000000000000000e+00 2824 0.0000000000000000e+00 2825 0.0000000000000000e+00 2826 0.0000000000000000e+00 2827 0.0000000000000000e+00 2828 0.0000000000000000e+00 2829 0.0000000000000000e+00 2830 0.0000000000000000e+00 2831 0.0000000000000000e+00 2832 0.0000000000000000e+00 2833 0.0000000000000000e+00 2834 0.0000000000000000e+00 2835 0.0000000000000000e+00 2836 0.0000000000000000e+00 2837 0.0000000000000000e+00 2838 0.0000000000000000e+00 2839 0.0000000000000000e+00 2840 0.0000000000000000e+00 2841 0.0000000000000000e+00 2842 0.0000000000000000e+00 2843 0.0000000000000000e+00 2844 0.0000000000000000e+00 2845 0.0000000000000000e+00 2846 0.0000000000000000e+00 2847 0.0000000000000000e+00 2848 0.0000000000000000e+00 2849 0.0000000000000000e+00 2850 0.0000000000000000e+00 2851 0.0000000000000000e+00 2852 0.0000000000000000e+00 2853 0.0000000000000000e+00 2854 0.0000000000000000e+00 2855 0.0000000000000000e+00 2856 0.0000000000000000e+00 2857 0.0000000000000000e+00 2858 0.0000000000000000e+00 2859 0.0000000000000000e+00 2860 0.0000000000000000e+00 2861 0.0000000000000000e+00 2862 0.0000000000000000e+00 2863 0.0000000000000000e+00 2864 0.0000000000000000e+00 2865 0.0000000000000000e+00 2866 0.0000000000000000e+00 2867 0.0000000000000000e+00 2868 0.0000000000000000e+00 2869 0.0000000000000000e+00 2870 0.0000000000000000e+00 2871 0.0000000000000000e+00 2872 0.0000000000000000e+00 2873 0.0000000000000000e+00 2874 0.0000000000000000e+00 2875 0.0000000000000000e+00 2876 0.0000000000000000e+00 2877 0.0000000000000000e+00 2878 0.0000000000000000e+00 2879 0.0000000000000000e+00 2880 0.0000000000000000e+00 2881 0.0000000000000000e+00 2882 0.0000000000000000e+00 2883 0.0000000000000000e+00 2884 0.0000000000000000e+00 2885 0.0000000000000000e+00 2886 0.0000000000000000e+00 2887 0.0000000000000000e+00 2888 0.0000000000000000e+00 2889 0.0000000000000000e+00 2890 0.0000000000000000e+00 2891 0.0000000000000000e+00 2892 0.0000000000000000e+00 2893 0.0000000000000000e+00 2894 0.0000000000000000e+00 2895 0.0000000000000000e+00 2896 0.0000000000000000e+00 2897 0.0000000000000000e+00 2898 0.0000000000000000e+00 2899 0.0000000000000000e+00 2900 0.0000000000000000e+00 2901 0.0000000000000000e+00 2902 0.0000000000000000e+00 2903 0.0000000000000000e+00 2904 0.0000000000000000e+00 2905 0.0000000000000000e+00 2906 0.0000000000000000e+00 2907 0.0000000000000000e+00 2908 0.0000000000000000e+00 2909 0.0000000000000000e+00 2910 0.0000000000000000e+00 2911 0.0000000000000000e+00 2912 0.0000000000000000e+00 2913 0.0000000000000000e+00 2914 0.0000000000000000e+00 2915 0.0000000000000000e+00 2916 0.0000000000000000e+00 2917 0.0000000000000000e+00 2918 0.0000000000000000e+00 2919 0.0000000000000000e+00 2920 0.0000000000000000e+00 2921 0.0000000000000000e+00 2922 0.0000000000000000e+00 2923 0.0000000000000000e+00 2924 0.0000000000000000e+00 2925 0.0000000000000000e+00 2926 0.0000000000000000e+00 2927 0.0000000000000000e+00 2928 0.0000000000000000e+00 2929 0.0000000000000000e+00 2930 0.0000000000000000e+00 2931 0.0000000000000000e+00 2932 0.0000000000000000e+00 2933 0.0000000000000000e+00 2934 0.0000000000000000e+00 2935 0.0000000000000000e+00 2936 0.0000000000000000e+00 2937 0.0000000000000000e+00 2938 0.0000000000000000e+00 2939 0.0000000000000000e+00 2940 0.0000000000000000e+00 2941 0.0000000000000000e+00 2942 0.0000000000000000e+00 2943 0.0000000000000000e+00 2944 0.0000000000000000e+00 2945 0.0000000000000000e+00 2946 0.0000000000000000e+00 2947 0.0000000000000000e+00 2948 0.0000000000000000e+00 2949 0.0000000000000000e+00 2950 0.0000000000000000e+00 2951 0.0000000000000000e+00 2952 0.0000000000000000e+00 2953 0.0000000000000000e+00 2954 0.0000000000000000e+00 2955 0.0000000000000000e+00 2956 0.0000000000000000e+00 2957 0.0000000000000000e+00 2958 0.0000000000000000e+00 2959 0.0000000000000000e+00 2960 0.0000000000000000e+00 2961 0.0000000000000000e+00 2962 0.0000000000000000e+00 2963 0.0000000000000000e+00 2964 0.0000000000000000e+00 2965 0.0000000000000000e+00 2966 0.0000000000000000e+00 2967 0.0000000000000000e+00 2968 0.0000000000000000e+00 2969 0.0000000000000000e+00 2970 0.0000000000000000e+00 2971 0.0000000000000000e+00 2972 0.0000000000000000e+00 2973 0.0000000000000000e+00 2974 0.0000000000000000e+00 2975 0.0000000000000000e+00 2976 0.0000000000000000e+00 2977 0.0000000000000000e+00 2978 0.0000000000000000e+00 2979 0.0000000000000000e+00 2980 0.0000000000000000e+00 2981 0.0000000000000000e+00 2982 0.0000000000000000e+00 2983 0.0000000000000000e+00 2984 0.0000000000000000e+00 2985 0.0000000000000000e+00 2986 0.0000000000000000e+00 2987 0.0000000000000000e+00 2988 0.0000000000000000e+00 2989 0.0000000000000000e+00 2990 0.0000000000000000e+00 2991 0.0000000000000000e+00 2992 0.0000000000000000e+00 2993 0.0000000000000000e+00 2994 0.0000000000000000e+00 2995 0.0000000000000000e+00 2996 0.0000000000000000e+00 2997 0.0000000000000000e+00 2998 0.0000000000000000e+00 2999 0.0000000000000000e+00 3000 0.0000000000000000e+00 3001 0.0000000000000000e+00 3002 0.0000000000000000e+00 3003 0.0000000000000000e+00 3004 0.0000000000000000e+00 3005 0.0000000000000000e+00 3006 0.0000000000000000e+00 3007 0.0000000000000000e+00 3008 0.0000000000000000e+00 3009 0.0000000000000000e+00 3010 0.0000000000000000e+00 3011 0.0000000000000000e+00 3012 0.0000000000000000e+00 3013 0.0000000000000000e+00 3014 0.0000000000000000e+00 3015 0.0000000000000000e+00 3016 0.0000000000000000e+00 3017 0.0000000000000000e+00 3018 0.0000000000000000e+00 3019 0.0000000000000000e+00 3020 0.0000000000000000e+00 3021 0.0000000000000000e+00 3022 0.0000000000000000e+00 3023 0.0000000000000000e+00 3024 0.0000000000000000e+00 3025 0.0000000000000000e+00 3026 0.0000000000000000e+00 3027 0.0000000000000000e+00 3028 0.0000000000000000e+00 3029 0.0000000000000000e+00 3030 0.0000000000000000e+00 3031 0.0000000000000000e+00 3032 0.0000000000000000e+00 3033 0.0000000000000000e+00 3034 0.0000000000000000e+00 3035 0.0000000000000000e+00 3036 0.0000000000000000e+00 3037 0.0000000000000000e+00 3038 0.0000000000000000e+00 3039 0.0000000000000000e+00 3040 0.0000000000000000e+00 3041 0.0000000000000000e+00 3042 0.0000000000000000e+00 3043 0.0000000000000000e+00 3044 0.0000000000000000e+00 3045 0.0000000000000000e+00 3046 0.0000000000000000e+00 3047 0.0000000000000000e+00 3048 0.0000000000000000e+00 3049 0.0000000000000000e+00 3050 0.0000000000000000e+00 3051 0.0000000000000000e+00 3052 0.0000000000000000e+00 3053 0.0000000000000000e+00 3054 0.0000000000000000e+00 3055 0.0000000000000000e+00 3056 0.0000000000000000e+00 3057 0.0000000000000000e+00 3058 0.0000000000000000e+00 3059 0.0000000000000000e+00 3060 0.0000000000000000e+00 3061 0.0000000000000000e+00 3062 0.0000000000000000e+00 3063 0.0000000000000000e+00 3064 0.0000000000000000e+00 3065 0.0000000000000000e+00 3066 0.0000000000000000e+00 3067 0.0000000000000000e+00 3068 0.0000000000000000e+00 3069 0.0000000000000000e+00 3070 0.0000000000000000e+00 3071 0.0000000000000000e+00 3072 0.0000000000000000e+00 3073 0.0000000000000000e+00 3074 0.0000000000000000e+00 3075 0.0000000000000000e+00 3076 0.0000000000000000e+00 3077 0.0000000000000000e+00 3078 0.0000000000000000e+00 3079 0.0000000000000000e+00 3080 0.0000000000000000e+00 3081 0.0000000000000000e+00 3082 0.0000000000000000e+00 3083 0.0000000000000000e+00 3084 0.0000000000000000e+00 3085 0.0000000000000000e+00 3086 0.0000000000000000e+00 3087 0.0000000000000000e+00 3088 0.0000000000000000e+00 3089 0.0000000000000000e+00 3090 0.0000000000000000e+00 3091 0.0000000000000000e+00 3092 0.0000000000000000e+00 3093 0.0000000000000000e+00 3094 0.0000000000000000e+00 3095 0.0000000000000000e+00 3096 0.0000000000000000e+00 3097 0.0000000000000000e+00 3098 0.0000000000000000e+00 3099 0.0000000000000000e+00 3100 0.0000000000000000e+00 3101 0.0000000000000000e+00 3102 0.0000000000000000e+00 3103 0.0000000000000000e+00 3104 0.0000000000000000e+00 3105 0.0000000000000000e+00 3106 0.0000000000000000e+00 3107 0.0000000000000000e+00 3108 0.0000000000000000e+00 3109 0.0000000000000000e+00 3110 0.0000000000000000e+00 3111 0.0000000000000000e+00 3112 0.0000000000000000e+00 3113 0.0000000000000000e+00 3114 0.0000000000000000e+00 3115 0.0000000000000000e+00 3116 0.0000000000000000e+00 3117 0.0000000000000000e+00 3118 0.0000000000000000e+00 3119 0.0000000000000000e+00 3120 0.0000000000000000e+00 3121 0.0000000000000000e+00 3122 0.0000000000000000e+00 3123 0.0000000000000000e+00 3124 0.0000000000000000e+00 3125 0.0000000000000000e+00 3126 0.0000000000000000e+00 3127 0.0000000000000000e+00 3128 0.0000000000000000e+00 3129 0.0000000000000000e+00 3130 0.0000000000000000e+00 3131 0.0000000000000000e+00 3132 0.0000000000000000e+00 3133 0.0000000000000000e+00 3134 0.0000000000000000e+00 3135 0.0000000000000000e+00 3136 0.0000000000000000e+00 3137 0.0000000000000000e+00 3138 0.0000000000000000e+00 3139 0.0000000000000000e+00 3140 0.0000000000000000e+00 3141 0.0000000000000000e+00 3142 0.0000000000000000e+00 3143 0.0000000000000000e+00 3144 0.0000000000000000e+00 3145 0.0000000000000000e+00 3146 0.0000000000000000e+00 3147 0.0000000000000000e+00 3148 0.0000000000000000e+00 3149 0.0000000000000000e+00 3150 0.0000000000000000e+00 3151 0.0000000000000000e+00 3152 0.0000000000000000e+00 3153 0.0000000000000000e+00 3154 0.0000000000000000e+00 3155 0.0000000000000000e+00 3156 0.0000000000000000e+00 3157 0.0000000000000000e+00 3158 0.0000000000000000e+00 3159 0.0000000000000000e+00 3160 0.0000000000000000e+00 3161 0.0000000000000000e+00 3162 0.0000000000000000e+00 3163 0.0000000000000000e+00 3164 0.0000000000000000e+00 3165 0.0000000000000000e+00 3166 0.0000000000000000e+00 3167 0.0000000000000000e+00 3168 0.0000000000000000e+00 3169 0.0000000000000000e+00 3170 0.0000000000000000e+00 3171 0.0000000000000000e+00 3172 0.0000000000000000e+00 3173 0.0000000000000000e+00 3174 0.0000000000000000e+00 3175 0.0000000000000000e+00 3176 0.0000000000000000e+00 3177 0.0000000000000000e+00 3178 0.0000000000000000e+00 3179 0.0000000000000000e+00 3180 0.0000000000000000e+00 3181 0.0000000000000000e+00 3182 0.0000000000000000e+00 3183 0.0000000000000000e+00 3184 0.0000000000000000e+00 3185 0.0000000000000000e+00 3186 0.0000000000000000e+00 3187 0.0000000000000000e+00 3188 0.0000000000000000e+00 3189 0.0000000000000000e+00 3190 0.0000000000000000e+00 3191 0.0000000000000000e+00 3192 0.0000000000000000e+00 3193 0.0000000000000000e+00 3194 0.0000000000000000e+00 3195 0.0000000000000000e+00 3196 0.0000000000000000e+00 3197 0.0000000000000000e+00 3198 0.0000000000000000e+00 3199 0.0000000000000000e+00 3200 0.0000000000000000e+00 3201 0.0000000000000000e+00 3202 0.0000000000000000e+00 3203 0.0000000000000000e+00 3204 0.0000000000000000e+00 3205 0.0000000000000000e+00 3206 0.0000000000000000e+00 3207 0.0000000000000000e+00 3208 0.0000000000000000e+00 3209 0.0000000000000000e+00 3210 0.0000000000000000e+00 3211 0.0000000000000000e+00 3212 0.0000000000000000e+00 3213 0.0000000000000000e+00 3214 0.0000000000000000e+00 3215 0.0000000000000000e+00 3216 0.0000000000000000e+00 3217 0.0000000000000000e+00 3218 0.0000000000000000e+00 3219 0.0000000000000000e+00 3220 0.0000000000000000e+00 3221 0.0000000000000000e+00 3222 0.0000000000000000e+00 3223 0.0000000000000000e+00 3224 0.0000000000000000e+00 3225 0.0000000000000000e+00 3226 0.0000000000000000e+00 3227 0.0000000000000000e+00 3228 0.0000000000000000e+00 3229 0.0000000000000000e+00 3230 0.0000000000000000e+00 3231 0.0000000000000000e+00 3232 0.0000000000000000e+00 3233 0.0000000000000000e+00 3234 0.0000000000000000e+00 3235 0.0000000000000000e+00 3236 0.0000000000000000e+00 3237 0.0000000000000000e+00 3238 0.0000000000000000e+00 3239 0.0000000000000000e+00 3240 0.0000000000000000e+00 3241 0.0000000000000000e+00 3242 0.0000000000000000e+00 3243 0.0000000000000000e+00 3244 0.0000000000000000e+00 3245 0.0000000000000000e+00 3246 0.0000000000000000e+00 3247 0.0000000000000000e+00 3248 0.0000000000000000e+00 3249 0.0000000000000000e+00 3250 0.0000000000000000e+00 3251 0.0000000000000000e+00 3252 0.0000000000000000e+00 3253 0.0000000000000000e+00 3254 0.0000000000000000e+00 3255 0.0000000000000000e+00 3256 0.0000000000000000e+00 3257 0.0000000000000000e+00 3258 0.0000000000000000e+00 3259 0.0000000000000000e+00 3260 0.0000000000000000e+00 3261 0.0000000000000000e+00 3262 0.0000000000000000e+00 3263 0.0000000000000000e+00 3264 0.0000000000000000e+00 3265 0.0000000000000000e+00 3266 0.0000000000000000e+00 3267 0.0000000000000000e+00 3268 0.0000000000000000e+00 3269 0.0000000000000000e+00 3270 0.0000000000000000e+00 3271 0.0000000000000000e+00 3272 0.0000000000000000e+00 3273 0.0000000000000000e+00 3274 0.0000000000000000e+00 3275 0.0000000000000000e+00 3276 0.0000000000000000e+00 3277 0.0000000000000000e+00 3278 0.0000000000000000e+00 3279 0.0000000000000000e+00 3280 0.0000000000000000e+00 3281 0.0000000000000000e+00 3282 0.0000000000000000e+00 3283 0.0000000000000000e+00 3284 0.0000000000000000e+00 3285 0.0000000000000000e+00 3286 0.0000000000000000e+00 3287 0.0000000000000000e+00 3288 0.0000000000000000e+00 3289 0.0000000000000000e+00 3290 0.0000000000000000e+00 3291 0.0000000000000000e+00 3292 0.0000000000000000e+00 3293 0.0000000000000000e+00 3294 0.0000000000000000e+00 3295 0.0000000000000000e+00 3296 0.0000000000000000e+00 3297 0.0000000000000000e+00 3298 0.0000000000000000e+00 3299 0.0000000000000000e+00 3300 0.0000000000000000e+00 3301 0.0000000000000000e+00 3302 0.0000000000000000e+00 3303 0.0000000000000000e+00 3304 0.0000000000000000e+00 3305 0.0000000000000000e+00 3306 0.0000000000000000e+00 3307 0.0000000000000000e+00 3308 0.0000000000000000e+00 3309 0.0000000000000000e+00 3310 0.0000000000000000e+00 3311 0.0000000000000000e+00 3312 0.0000000000000000e+00 3313 0.0000000000000000e+00 3314 0.0000000000000000e+00 3315 0.0000000000000000e+00 3316 0.0000000000000000e+00 3317 0.0000000000000000e+00 3318 0.0000000000000000e+00 3319 0.0000000000000000e+00 3320 0.0000000000000000e+00 3321 0.0000000000000000e+00 3322 0.0000000000000000e+00 3323 0.0000000000000000e+00 3324 0.0000000000000000e+00 3325 0.0000000000000000e+00 3326 0.0000000000000000e+00 3327 0.0000000000000000e+00 3328 0.0000000000000000e+00 3329 0.0000000000000000e+00 3330 0.0000000000000000e+00 3331 0.0000000000000000e+00 3332 0.0000000000000000e+00 3333 0.0000000000000000e+00 3334 0.0000000000000000e+00 3335 0.0000000000000000e+00 3336 0.0000000000000000e+00 3337 0.0000000000000000e+00 3338 0.0000000000000000e+00 3339 0.0000000000000000e+00 3340 0.0000000000000000e+00 3341 0.0000000000000000e+00 3342 0.0000000000000000e+00 3343 0.0000000000000000e+00 3344 0.0000000000000000e+00 3345 0.0000000000000000e+00 3346 0.0000000000000000e+00 3347 0.0000000000000000e+00 3348 0.0000000000000000e+00 3349 0.0000000000000000e+00 3350 0.0000000000000000e+00 3351 0.0000000000000000e+00 3352 0.0000000000000000e+00 3353 0.0000000000000000e+00 3354 0.0000000000000000e+00 3355 0.0000000000000000e+00 3356 0.0000000000000000e+00 3357 0.0000000000000000e+00 3358 0.0000000000000000e+00 3359 0.0000000000000000e+00 3360 0.0000000000000000e+00 3361 0.0000000000000000e+00 3362 0.0000000000000000e+00 3363 0.0000000000000000e+00 3364 0.0000000000000000e+00 3365 0.0000000000000000e+00 3366 0.0000000000000000e+00 3367 0.0000000000000000e+00 3368 0.0000000000000000e+00 3369 0.0000000000000000e+00 3370 0.0000000000000000e+00 3371 0.0000000000000000e+00 3372 0.0000000000000000e+00 3373 0.0000000000000000e+00 3374 0.0000000000000000e+00 3375 0.0000000000000000e+00 3376 0.0000000000000000e+00 3377 0.0000000000000000e+00 3378 0.0000000000000000e+00 3379 0.0000000000000000e+00 3380 0.0000000000000000e+00 3381 0.0000000000000000e+00 3382 0.0000000000000000e+00 3383 0.0000000000000000e+00 3384 0.0000000000000000e+00 3385 0.0000000000000000e+00 3386 0.0000000000000000e+00 3387 0.0000000000000000e+00 3388 0.0000000000000000e+00 3389 0.0000000000000000e+00 3390 0.0000000000000000e+00 3391 0.0000000000000000e+00 3392 0.0000000000000000e+00 3393 0.0000000000000000e+00 3394 0.0000000000000000e+00 3395 0.0000000000000000e+00 3396 0.0000000000000000e+00 3397 0.0000000000000000e+00 3398 0.0000000000000000e+00 3399 0.0000000000000000e+00 3400 0.0000000000000000e+00 3401 0.0000000000000000e+00 3402 0.0000000000000000e+00 3403 0.0000000000000000e+00 3404 0.0000000000000000e+00 3405 0.0000000000000000e+00 3406 0.0000000000000000e+00 3407 0.0000000000000000e+00 3408 0.0000000000000000e+00 3409 0.0000000000000000e+00 3410 0.0000000000000000e+00 3411 0.0000000000000000e+00 3412 0.0000000000000000e+00 3413 0.0000000000000000e+00 3414 0.0000000000000000e+00 3415 0.0000000000000000e+00 3416 0.0000000000000000e+00 3417 0.0000000000000000e+00 3418 0.0000000000000000e+00 3419 0.0000000000000000e+00 3420 0.0000000000000000e+00 3421 0.0000000000000000e+00 3422 0.0000000000000000e+00 3423 0.0000000000000000e+00 3424 0.0000000000000000e+00 3425 0.0000000000000000e+00 3426 0.0000000000000000e+00 3427 0.0000000000000000e+00 3428 0.0000000000000000e+00 3429 0.0000000000000000e+00 3430 0.0000000000000000e+00 3431 0.0000000000000000e+00 3432 0.0000000000000000e+00 3433 0.0000000000000000e+00 3434 0.0000000000000000e+00 3435 0.0000000000000000e+00 3436 0.0000000000000000e+00 3437 0.0000000000000000e+00 3438 0.0000000000000000e+00 3439 0.0000000000000000e+00 3440 0.0000000000000000e+00 3441 0.0000000000000000e+00 3442 0.0000000000000000e+00 3443 0.0000000000000000e+00 3444 0.0000000000000000e+00 3445 0.0000000000000000e+00 3446 0.0000000000000000e+00 3447 0.0000000000000000e+00 3448 0.0000000000000000e+00 3449 0.0000000000000000e+00 3450 0.0000000000000000e+00 3451 0.0000000000000000e+00 3452 0.0000000000000000e+00 3453 0.0000000000000000e+00 3454 0.0000000000000000e+00 3455 0.0000000000000000e+00 3456 0.0000000000000000e+00 3457 0.0000000000000000e+00 3458 0.0000000000000000e+00 3459 0.0000000000000000e+00 3460 0.0000000000000000e+00 3461 0.0000000000000000e+00 3462 0.0000000000000000e+00 3463 0.0000000000000000e+00 3464 0.0000000000000000e+00 3465 0.0000000000000000e+00 3466 0.0000000000000000e+00 3467 0.0000000000000000e+00 3468 0.0000000000000000e+00 3469 0.0000000000000000e+00 3470 0.0000000000000000e+00 3471 0.0000000000000000e+00 3472 0.0000000000000000e+00 3473 0.0000000000000000e+00 3474 0.0000000000000000e+00 3475 0.0000000000000000e+00 3476 0.0000000000000000e+00 3477 0.0000000000000000e+00 3478 0.0000000000000000e+00 3479 0.0000000000000000e+00 3480 0.0000000000000000e+00 3481 0.0000000000000000e+00 3482 0.0000000000000000e+00 3483 0.0000000000000000e+00 3484 0.0000000000000000e+00 3485 0.0000000000000000e+00 3486 0.0000000000000000e+00 3487 0.0000000000000000e+00 3488 0.0000000000000000e+00 3489 0.0000000000000000e+00 3490 0.0000000000000000e+00 3491 0.0000000000000000e+00 3492 0.0000000000000000e+00 3493 0.0000000000000000e+00 3494 0.0000000000000000e+00 3495 0.0000000000000000e+00 3496 0.0000000000000000e+00 3497 0.0000000000000000e+00 3498 0.0000000000000000e+00 3499 0.0000000000000000e+00 3500 0.0000000000000000e+00 3501 0.0000000000000000e+00 3502 0.0000000000000000e+00 3503 0.0000000000000000e+00 3504 0.0000000000000000e+00 3505 0.0000000000000000e+00 3506 0.0000000000000000e+00 3507 0.0000000000000000e+00 3508 0.0000000000000000e+00 3509 0.0000000000000000e+00 3510 0.0000000000000000e+00 3511 0.0000000000000000e+00 3512 0.0000000000000000e+00 3513 0.0000000000000000e+00 3514 0.0000000000000000e+00 3515 0.0000000000000000e+00 3516 0.0000000000000000e+00 3517 0.0000000000000000e+00 3518 0.0000000000000000e+00 3519 0.0000000000000000e+00 3520 0.0000000000000000e+00 3521 0.0000000000000000e+00 3522 0.0000000000000000e+00 3523 0.0000000000000000e+00 3524 0.0000000000000000e+00 3525 0.0000000000000000e+00 3526 0.0000000000000000e+00 3527 0.0000000000000000e+00 3528 0.0000000000000000e+00 3529 0.0000000000000000e+00 3530 0.0000000000000000e+00 3531 0.0000000000000000e+00 3532 0.0000000000000000e+00 3533 0.0000000000000000e+00 3534 0.0000000000000000e+00 3535 0.0000000000000000e+00 3536 0.0000000000000000e+00 3537 0.0000000000000000e+00 3538 0.0000000000000000e+00 3539 0.0000000000000000e+00 3540 0.0000000000000000e+00 3541 0.0000000000000000e+00 3542 0.0000000000000000e+00 3543 0.0000000000000000e+00 3544 0.0000000000000000e+00 3545 0.0000000000000000e+00 3546 0.0000000000000000e+00 3547 0.0000000000000000e+00 3548 0.0000000000000000e+00 3549 0.0000000000000000e+00 3550 0.0000000000000000e+00 3551 0.0000000000000000e+00 3552 0.0000000000000000e+00 3553 0.0000000000000000e+00 3554 0.0000000000000000e+00 3555 0.0000000000000000e+00 3556 0.0000000000000000e+00 3557 0.0000000000000000e+00 3558 0.0000000000000000e+00 3559 0.0000000000000000e+00 3560 0.0000000000000000e+00 3561 0.0000000000000000e+00 3562 0.0000000000000000e+00 3563 0.0000000000000000e+00 3564 0.0000000000000000e+00 3565 0.0000000000000000e+00 3566 0.0000000000000000e+00 3567 0.0000000000000000e+00 3568 0.0000000000000000e+00 3569 0.0000000000000000e+00 3570 0.0000000000000000e+00 3571 0.0000000000000000e+00 3572 0.0000000000000000e+00 3573 0.0000000000000000e+00 3574 0.0000000000000000e+00 3575 0.0000000000000000e+00 3576 0.0000000000000000e+00 3577 0.0000000000000000e+00 3578 0.0000000000000000e+00 3579 0.0000000000000000e+00 3580 0.0000000000000000e+00 3581 0.0000000000000000e+00 3582 0.0000000000000000e+00 3583 0.0000000000000000e+00 3584 0.0000000000000000e+00 3585 0.0000000000000000e+00 3586 0.0000000000000000e+00 3587 0.0000000000000000e+00 3588 0.0000000000000000e+00 3589 0.0000000000000000e+00 3590 0.0000000000000000e+00 3591 0.0000000000000000e+00 3592 0.0000000000000000e+00 3593 0.0000000000000000e+00 3594 0.0000000000000000e+00 3595 0.0000000000000000e+00 3596 0.0000000000000000e+00 3597 0.0000000000000000e+00 3598 0.0000000000000000e+00 3599 0.0000000000000000e+00 3600 0.0000000000000000e+00 3601 0.0000000000000000e+00 3602 0.0000000000000000e+00 3603 0.0000000000000000e+00 3604 0.0000000000000000e+00 3605 0.0000000000000000e+00 3606 0.0000000000000000e+00 3607 0.0000000000000000e+00 3608 0.0000000000000000e+00 3609 0.0000000000000000e+00 3610 0.0000000000000000e+00 3611 0.0000000000000000e+00 3612 0.0000000000000000e+00 3613 0.0000000000000000e+00 3614 0.0000000000000000e+00 3615 0.0000000000000000e+00 3616 0.0000000000000000e+00 3617 0.0000000000000000e+00 3618 0.0000000000000000e+00 3619 0.0000000000000000e+00 3620 0.0000000000000000e+00 3621 0.0000000000000000e+00 3622 0.0000000000000000e+00 3623 0.0000000000000000e+00 3624 0.0000000000000000e+00 3625 0.0000000000000000e+00 3626 0.0000000000000000e+00 3627 0.0000000000000000e+00 3628 0.0000000000000000e+00 3629 0.0000000000000000e+00 3630 0.0000000000000000e+00 3631 0.0000000000000000e+00 3632 0.0000000000000000e+00 3633 0.0000000000000000e+00 3634 0.0000000000000000e+00 3635 0.0000000000000000e+00 3636 0.0000000000000000e+00 3637 0.0000000000000000e+00 3638 0.0000000000000000e+00 3639 0.0000000000000000e+00 3640 0.0000000000000000e+00 3641 0.0000000000000000e+00 3642 0.0000000000000000e+00 3643 0.0000000000000000e+00 3644 0.0000000000000000e+00 3645 0.0000000000000000e+00 3646 0.0000000000000000e+00 3647 0.0000000000000000e+00 3648 0.0000000000000000e+00 3649 0.0000000000000000e+00 3650 0.0000000000000000e+00 3651 0.0000000000000000e+00 3652 0.0000000000000000e+00 3653 0.0000000000000000e+00 3654 0.0000000000000000e+00 3655 0.0000000000000000e+00 3656 0.0000000000000000e+00 3657 0.0000000000000000e+00 3658 0.0000000000000000e+00 3659 0.0000000000000000e+00 3660 0.0000000000000000e+00 3661 0.0000000000000000e+00 3662 0.0000000000000000e+00 3663 0.0000000000000000e+00 3664 0.0000000000000000e+00 3665 0.0000000000000000e+00 3666 0.0000000000000000e+00 3667 0.0000000000000000e+00 3668 0.0000000000000000e+00 3669 0.0000000000000000e+00 3670 0.0000000000000000e+00 3671 0.0000000000000000e+00 3672 0.0000000000000000e+00 3673 0.0000000000000000e+00 3674 0.0000000000000000e+00 3675 0.0000000000000000e+00 3676 0.0000000000000000e+00 3677 0.0000000000000000e+00 3678 0.0000000000000000e+00 3679 0.0000000000000000e+00 3680 0.0000000000000000e+00 3681 0.0000000000000000e+00 3682 0.0000000000000000e+00 3683 0.0000000000000000e+00 3684 0.0000000000000000e+00 3685 0.0000000000000000e+00 3686 0.0000000000000000e+00 3687 0.0000000000000000e+00 3688 0.0000000000000000e+00 3689 0.0000000000000000e+00 3690 0.0000000000000000e+00 3691 0.0000000000000000e+00 3692 0.0000000000000000e+00 3693 0.0000000000000000e+00 3694 0.0000000000000000e+00 3695 0.0000000000000000e+00 3696 0.0000000000000000e+00 3697 0.0000000000000000e+00 3698 0.0000000000000000e+00 3699 0.0000000000000000e+00 3700 0.0000000000000000e+00 3701 0.0000000000000000e+00 3702 0.0000000000000000e+00 3703 0.0000000000000000e+00 3704 0.0000000000000000e+00 3705 0.0000000000000000e+00 3706 0.0000000000000000e+00 3707 0.0000000000000000e+00 3708 0.0000000000000000e+00 3709 0.0000000000000000e+00 hypre-2.33.0/src/test/TEST_ams/mfem.x0.00003000066400000000000000000001127761477326011500177750ustar00rootroot000000000000003710 5080 3710 0.0000000000000000e+00 3711 0.0000000000000000e+00 3712 0.0000000000000000e+00 3713 0.0000000000000000e+00 3714 0.0000000000000000e+00 3715 0.0000000000000000e+00 3716 0.0000000000000000e+00 3717 0.0000000000000000e+00 3718 0.0000000000000000e+00 3719 0.0000000000000000e+00 3720 0.0000000000000000e+00 3721 0.0000000000000000e+00 3722 0.0000000000000000e+00 3723 0.0000000000000000e+00 3724 0.0000000000000000e+00 3725 0.0000000000000000e+00 3726 0.0000000000000000e+00 3727 0.0000000000000000e+00 3728 0.0000000000000000e+00 3729 0.0000000000000000e+00 3730 0.0000000000000000e+00 3731 0.0000000000000000e+00 3732 0.0000000000000000e+00 3733 0.0000000000000000e+00 3734 0.0000000000000000e+00 3735 0.0000000000000000e+00 3736 0.0000000000000000e+00 3737 0.0000000000000000e+00 3738 0.0000000000000000e+00 3739 0.0000000000000000e+00 3740 0.0000000000000000e+00 3741 0.0000000000000000e+00 3742 0.0000000000000000e+00 3743 0.0000000000000000e+00 3744 0.0000000000000000e+00 3745 0.0000000000000000e+00 3746 0.0000000000000000e+00 3747 0.0000000000000000e+00 3748 0.0000000000000000e+00 3749 0.0000000000000000e+00 3750 0.0000000000000000e+00 3751 0.0000000000000000e+00 3752 0.0000000000000000e+00 3753 0.0000000000000000e+00 3754 0.0000000000000000e+00 3755 0.0000000000000000e+00 3756 0.0000000000000000e+00 3757 0.0000000000000000e+00 3758 0.0000000000000000e+00 3759 0.0000000000000000e+00 3760 0.0000000000000000e+00 3761 0.0000000000000000e+00 3762 0.0000000000000000e+00 3763 0.0000000000000000e+00 3764 0.0000000000000000e+00 3765 0.0000000000000000e+00 3766 0.0000000000000000e+00 3767 0.0000000000000000e+00 3768 0.0000000000000000e+00 3769 0.0000000000000000e+00 3770 0.0000000000000000e+00 3771 0.0000000000000000e+00 3772 0.0000000000000000e+00 3773 0.0000000000000000e+00 3774 0.0000000000000000e+00 3775 0.0000000000000000e+00 3776 0.0000000000000000e+00 3777 0.0000000000000000e+00 3778 0.0000000000000000e+00 3779 0.0000000000000000e+00 3780 0.0000000000000000e+00 3781 0.0000000000000000e+00 3782 0.0000000000000000e+00 3783 0.0000000000000000e+00 3784 0.0000000000000000e+00 3785 0.0000000000000000e+00 3786 0.0000000000000000e+00 3787 0.0000000000000000e+00 3788 0.0000000000000000e+00 3789 0.0000000000000000e+00 3790 0.0000000000000000e+00 3791 0.0000000000000000e+00 3792 0.0000000000000000e+00 3793 0.0000000000000000e+00 3794 0.0000000000000000e+00 3795 0.0000000000000000e+00 3796 0.0000000000000000e+00 3797 0.0000000000000000e+00 3798 0.0000000000000000e+00 3799 0.0000000000000000e+00 3800 0.0000000000000000e+00 3801 0.0000000000000000e+00 3802 0.0000000000000000e+00 3803 0.0000000000000000e+00 3804 0.0000000000000000e+00 3805 0.0000000000000000e+00 3806 0.0000000000000000e+00 3807 0.0000000000000000e+00 3808 0.0000000000000000e+00 3809 0.0000000000000000e+00 3810 0.0000000000000000e+00 3811 0.0000000000000000e+00 3812 0.0000000000000000e+00 3813 0.0000000000000000e+00 3814 0.0000000000000000e+00 3815 0.0000000000000000e+00 3816 0.0000000000000000e+00 3817 0.0000000000000000e+00 3818 0.0000000000000000e+00 3819 0.0000000000000000e+00 3820 0.0000000000000000e+00 3821 0.0000000000000000e+00 3822 0.0000000000000000e+00 3823 0.0000000000000000e+00 3824 0.0000000000000000e+00 3825 0.0000000000000000e+00 3826 0.0000000000000000e+00 3827 0.0000000000000000e+00 3828 0.0000000000000000e+00 3829 0.0000000000000000e+00 3830 0.0000000000000000e+00 3831 0.0000000000000000e+00 3832 0.0000000000000000e+00 3833 0.0000000000000000e+00 3834 0.0000000000000000e+00 3835 0.0000000000000000e+00 3836 0.0000000000000000e+00 3837 0.0000000000000000e+00 3838 0.0000000000000000e+00 3839 0.0000000000000000e+00 3840 0.0000000000000000e+00 3841 0.0000000000000000e+00 3842 0.0000000000000000e+00 3843 0.0000000000000000e+00 3844 0.0000000000000000e+00 3845 0.0000000000000000e+00 3846 0.0000000000000000e+00 3847 0.0000000000000000e+00 3848 0.0000000000000000e+00 3849 0.0000000000000000e+00 3850 0.0000000000000000e+00 3851 0.0000000000000000e+00 3852 0.0000000000000000e+00 3853 0.0000000000000000e+00 3854 0.0000000000000000e+00 3855 0.0000000000000000e+00 3856 0.0000000000000000e+00 3857 0.0000000000000000e+00 3858 0.0000000000000000e+00 3859 0.0000000000000000e+00 3860 0.0000000000000000e+00 3861 0.0000000000000000e+00 3862 0.0000000000000000e+00 3863 0.0000000000000000e+00 3864 0.0000000000000000e+00 3865 0.0000000000000000e+00 3866 0.0000000000000000e+00 3867 0.0000000000000000e+00 3868 0.0000000000000000e+00 3869 0.0000000000000000e+00 3870 0.0000000000000000e+00 3871 0.0000000000000000e+00 3872 0.0000000000000000e+00 3873 0.0000000000000000e+00 3874 0.0000000000000000e+00 3875 0.0000000000000000e+00 3876 0.0000000000000000e+00 3877 0.0000000000000000e+00 3878 0.0000000000000000e+00 3879 0.0000000000000000e+00 3880 0.0000000000000000e+00 3881 0.0000000000000000e+00 3882 0.0000000000000000e+00 3883 0.0000000000000000e+00 3884 0.0000000000000000e+00 3885 0.0000000000000000e+00 3886 0.0000000000000000e+00 3887 0.0000000000000000e+00 3888 0.0000000000000000e+00 3889 0.0000000000000000e+00 3890 0.0000000000000000e+00 3891 0.0000000000000000e+00 3892 0.0000000000000000e+00 3893 0.0000000000000000e+00 3894 0.0000000000000000e+00 3895 0.0000000000000000e+00 3896 0.0000000000000000e+00 3897 0.0000000000000000e+00 3898 0.0000000000000000e+00 3899 0.0000000000000000e+00 3900 0.0000000000000000e+00 3901 0.0000000000000000e+00 3902 0.0000000000000000e+00 3903 0.0000000000000000e+00 3904 0.0000000000000000e+00 3905 0.0000000000000000e+00 3906 0.0000000000000000e+00 3907 0.0000000000000000e+00 3908 0.0000000000000000e+00 3909 0.0000000000000000e+00 3910 0.0000000000000000e+00 3911 0.0000000000000000e+00 3912 0.0000000000000000e+00 3913 0.0000000000000000e+00 3914 0.0000000000000000e+00 3915 0.0000000000000000e+00 3916 0.0000000000000000e+00 3917 0.0000000000000000e+00 3918 0.0000000000000000e+00 3919 0.0000000000000000e+00 3920 0.0000000000000000e+00 3921 0.0000000000000000e+00 3922 0.0000000000000000e+00 3923 0.0000000000000000e+00 3924 0.0000000000000000e+00 3925 0.0000000000000000e+00 3926 0.0000000000000000e+00 3927 0.0000000000000000e+00 3928 0.0000000000000000e+00 3929 0.0000000000000000e+00 3930 0.0000000000000000e+00 3931 0.0000000000000000e+00 3932 0.0000000000000000e+00 3933 0.0000000000000000e+00 3934 0.0000000000000000e+00 3935 0.0000000000000000e+00 3936 0.0000000000000000e+00 3937 0.0000000000000000e+00 3938 0.0000000000000000e+00 3939 0.0000000000000000e+00 3940 0.0000000000000000e+00 3941 0.0000000000000000e+00 3942 0.0000000000000000e+00 3943 0.0000000000000000e+00 3944 0.0000000000000000e+00 3945 0.0000000000000000e+00 3946 0.0000000000000000e+00 3947 0.0000000000000000e+00 3948 0.0000000000000000e+00 3949 0.0000000000000000e+00 3950 0.0000000000000000e+00 3951 0.0000000000000000e+00 3952 0.0000000000000000e+00 3953 0.0000000000000000e+00 3954 0.0000000000000000e+00 3955 0.0000000000000000e+00 3956 0.0000000000000000e+00 3957 0.0000000000000000e+00 3958 0.0000000000000000e+00 3959 0.0000000000000000e+00 3960 0.0000000000000000e+00 3961 0.0000000000000000e+00 3962 0.0000000000000000e+00 3963 0.0000000000000000e+00 3964 0.0000000000000000e+00 3965 0.0000000000000000e+00 3966 0.0000000000000000e+00 3967 0.0000000000000000e+00 3968 0.0000000000000000e+00 3969 0.0000000000000000e+00 3970 0.0000000000000000e+00 3971 0.0000000000000000e+00 3972 0.0000000000000000e+00 3973 0.0000000000000000e+00 3974 0.0000000000000000e+00 3975 0.0000000000000000e+00 3976 0.0000000000000000e+00 3977 0.0000000000000000e+00 3978 0.0000000000000000e+00 3979 0.0000000000000000e+00 3980 0.0000000000000000e+00 3981 0.0000000000000000e+00 3982 0.0000000000000000e+00 3983 0.0000000000000000e+00 3984 0.0000000000000000e+00 3985 0.0000000000000000e+00 3986 0.0000000000000000e+00 3987 0.0000000000000000e+00 3988 0.0000000000000000e+00 3989 0.0000000000000000e+00 3990 0.0000000000000000e+00 3991 0.0000000000000000e+00 3992 0.0000000000000000e+00 3993 0.0000000000000000e+00 3994 0.0000000000000000e+00 3995 0.0000000000000000e+00 3996 0.0000000000000000e+00 3997 0.0000000000000000e+00 3998 0.0000000000000000e+00 3999 0.0000000000000000e+00 4000 0.0000000000000000e+00 4001 0.0000000000000000e+00 4002 0.0000000000000000e+00 4003 0.0000000000000000e+00 4004 0.0000000000000000e+00 4005 0.0000000000000000e+00 4006 0.0000000000000000e+00 4007 0.0000000000000000e+00 4008 0.0000000000000000e+00 4009 0.0000000000000000e+00 4010 0.0000000000000000e+00 4011 0.0000000000000000e+00 4012 0.0000000000000000e+00 4013 0.0000000000000000e+00 4014 0.0000000000000000e+00 4015 0.0000000000000000e+00 4016 0.0000000000000000e+00 4017 0.0000000000000000e+00 4018 0.0000000000000000e+00 4019 0.0000000000000000e+00 4020 0.0000000000000000e+00 4021 0.0000000000000000e+00 4022 0.0000000000000000e+00 4023 0.0000000000000000e+00 4024 0.0000000000000000e+00 4025 0.0000000000000000e+00 4026 0.0000000000000000e+00 4027 0.0000000000000000e+00 4028 0.0000000000000000e+00 4029 0.0000000000000000e+00 4030 0.0000000000000000e+00 4031 0.0000000000000000e+00 4032 0.0000000000000000e+00 4033 0.0000000000000000e+00 4034 0.0000000000000000e+00 4035 0.0000000000000000e+00 4036 0.0000000000000000e+00 4037 0.0000000000000000e+00 4038 0.0000000000000000e+00 4039 0.0000000000000000e+00 4040 0.0000000000000000e+00 4041 0.0000000000000000e+00 4042 0.0000000000000000e+00 4043 0.0000000000000000e+00 4044 0.0000000000000000e+00 4045 0.0000000000000000e+00 4046 0.0000000000000000e+00 4047 0.0000000000000000e+00 4048 0.0000000000000000e+00 4049 0.0000000000000000e+00 4050 0.0000000000000000e+00 4051 0.0000000000000000e+00 4052 0.0000000000000000e+00 4053 0.0000000000000000e+00 4054 0.0000000000000000e+00 4055 0.0000000000000000e+00 4056 0.0000000000000000e+00 4057 0.0000000000000000e+00 4058 0.0000000000000000e+00 4059 0.0000000000000000e+00 4060 0.0000000000000000e+00 4061 0.0000000000000000e+00 4062 0.0000000000000000e+00 4063 0.0000000000000000e+00 4064 0.0000000000000000e+00 4065 0.0000000000000000e+00 4066 0.0000000000000000e+00 4067 0.0000000000000000e+00 4068 0.0000000000000000e+00 4069 0.0000000000000000e+00 4070 0.0000000000000000e+00 4071 0.0000000000000000e+00 4072 0.0000000000000000e+00 4073 0.0000000000000000e+00 4074 0.0000000000000000e+00 4075 0.0000000000000000e+00 4076 0.0000000000000000e+00 4077 0.0000000000000000e+00 4078 0.0000000000000000e+00 4079 0.0000000000000000e+00 4080 0.0000000000000000e+00 4081 0.0000000000000000e+00 4082 0.0000000000000000e+00 4083 0.0000000000000000e+00 4084 0.0000000000000000e+00 4085 0.0000000000000000e+00 4086 0.0000000000000000e+00 4087 0.0000000000000000e+00 4088 0.0000000000000000e+00 4089 0.0000000000000000e+00 4090 0.0000000000000000e+00 4091 0.0000000000000000e+00 4092 0.0000000000000000e+00 4093 0.0000000000000000e+00 4094 0.0000000000000000e+00 4095 0.0000000000000000e+00 4096 0.0000000000000000e+00 4097 0.0000000000000000e+00 4098 0.0000000000000000e+00 4099 0.0000000000000000e+00 4100 0.0000000000000000e+00 4101 0.0000000000000000e+00 4102 0.0000000000000000e+00 4103 0.0000000000000000e+00 4104 0.0000000000000000e+00 4105 0.0000000000000000e+00 4106 0.0000000000000000e+00 4107 0.0000000000000000e+00 4108 0.0000000000000000e+00 4109 0.0000000000000000e+00 4110 0.0000000000000000e+00 4111 0.0000000000000000e+00 4112 0.0000000000000000e+00 4113 0.0000000000000000e+00 4114 0.0000000000000000e+00 4115 0.0000000000000000e+00 4116 0.0000000000000000e+00 4117 0.0000000000000000e+00 4118 0.0000000000000000e+00 4119 0.0000000000000000e+00 4120 0.0000000000000000e+00 4121 0.0000000000000000e+00 4122 0.0000000000000000e+00 4123 0.0000000000000000e+00 4124 0.0000000000000000e+00 4125 0.0000000000000000e+00 4126 0.0000000000000000e+00 4127 0.0000000000000000e+00 4128 0.0000000000000000e+00 4129 0.0000000000000000e+00 4130 0.0000000000000000e+00 4131 0.0000000000000000e+00 4132 0.0000000000000000e+00 4133 0.0000000000000000e+00 4134 0.0000000000000000e+00 4135 0.0000000000000000e+00 4136 0.0000000000000000e+00 4137 0.0000000000000000e+00 4138 0.0000000000000000e+00 4139 0.0000000000000000e+00 4140 0.0000000000000000e+00 4141 0.0000000000000000e+00 4142 0.0000000000000000e+00 4143 0.0000000000000000e+00 4144 0.0000000000000000e+00 4145 0.0000000000000000e+00 4146 0.0000000000000000e+00 4147 0.0000000000000000e+00 4148 0.0000000000000000e+00 4149 0.0000000000000000e+00 4150 0.0000000000000000e+00 4151 0.0000000000000000e+00 4152 0.0000000000000000e+00 4153 0.0000000000000000e+00 4154 0.0000000000000000e+00 4155 0.0000000000000000e+00 4156 0.0000000000000000e+00 4157 0.0000000000000000e+00 4158 0.0000000000000000e+00 4159 0.0000000000000000e+00 4160 0.0000000000000000e+00 4161 0.0000000000000000e+00 4162 0.0000000000000000e+00 4163 0.0000000000000000e+00 4164 0.0000000000000000e+00 4165 0.0000000000000000e+00 4166 0.0000000000000000e+00 4167 0.0000000000000000e+00 4168 0.0000000000000000e+00 4169 0.0000000000000000e+00 4170 0.0000000000000000e+00 4171 0.0000000000000000e+00 4172 0.0000000000000000e+00 4173 0.0000000000000000e+00 4174 0.0000000000000000e+00 4175 0.0000000000000000e+00 4176 0.0000000000000000e+00 4177 0.0000000000000000e+00 4178 0.0000000000000000e+00 4179 0.0000000000000000e+00 4180 0.0000000000000000e+00 4181 0.0000000000000000e+00 4182 0.0000000000000000e+00 4183 0.0000000000000000e+00 4184 0.0000000000000000e+00 4185 0.0000000000000000e+00 4186 0.0000000000000000e+00 4187 0.0000000000000000e+00 4188 0.0000000000000000e+00 4189 0.0000000000000000e+00 4190 0.0000000000000000e+00 4191 0.0000000000000000e+00 4192 0.0000000000000000e+00 4193 0.0000000000000000e+00 4194 0.0000000000000000e+00 4195 0.0000000000000000e+00 4196 0.0000000000000000e+00 4197 0.0000000000000000e+00 4198 0.0000000000000000e+00 4199 0.0000000000000000e+00 4200 0.0000000000000000e+00 4201 0.0000000000000000e+00 4202 0.0000000000000000e+00 4203 0.0000000000000000e+00 4204 0.0000000000000000e+00 4205 0.0000000000000000e+00 4206 0.0000000000000000e+00 4207 0.0000000000000000e+00 4208 0.0000000000000000e+00 4209 0.0000000000000000e+00 4210 0.0000000000000000e+00 4211 0.0000000000000000e+00 4212 0.0000000000000000e+00 4213 0.0000000000000000e+00 4214 0.0000000000000000e+00 4215 0.0000000000000000e+00 4216 0.0000000000000000e+00 4217 0.0000000000000000e+00 4218 0.0000000000000000e+00 4219 0.0000000000000000e+00 4220 0.0000000000000000e+00 4221 0.0000000000000000e+00 4222 0.0000000000000000e+00 4223 0.0000000000000000e+00 4224 0.0000000000000000e+00 4225 0.0000000000000000e+00 4226 0.0000000000000000e+00 4227 0.0000000000000000e+00 4228 0.0000000000000000e+00 4229 0.0000000000000000e+00 4230 0.0000000000000000e+00 4231 0.0000000000000000e+00 4232 0.0000000000000000e+00 4233 0.0000000000000000e+00 4234 0.0000000000000000e+00 4235 0.0000000000000000e+00 4236 0.0000000000000000e+00 4237 0.0000000000000000e+00 4238 0.0000000000000000e+00 4239 0.0000000000000000e+00 4240 0.0000000000000000e+00 4241 0.0000000000000000e+00 4242 0.0000000000000000e+00 4243 0.0000000000000000e+00 4244 0.0000000000000000e+00 4245 0.0000000000000000e+00 4246 0.0000000000000000e+00 4247 0.0000000000000000e+00 4248 0.0000000000000000e+00 4249 0.0000000000000000e+00 4250 0.0000000000000000e+00 4251 0.0000000000000000e+00 4252 0.0000000000000000e+00 4253 0.0000000000000000e+00 4254 0.0000000000000000e+00 4255 0.0000000000000000e+00 4256 0.0000000000000000e+00 4257 0.0000000000000000e+00 4258 0.0000000000000000e+00 4259 0.0000000000000000e+00 4260 0.0000000000000000e+00 4261 0.0000000000000000e+00 4262 0.0000000000000000e+00 4263 0.0000000000000000e+00 4264 0.0000000000000000e+00 4265 0.0000000000000000e+00 4266 0.0000000000000000e+00 4267 0.0000000000000000e+00 4268 0.0000000000000000e+00 4269 0.0000000000000000e+00 4270 0.0000000000000000e+00 4271 0.0000000000000000e+00 4272 0.0000000000000000e+00 4273 0.0000000000000000e+00 4274 0.0000000000000000e+00 4275 0.0000000000000000e+00 4276 0.0000000000000000e+00 4277 0.0000000000000000e+00 4278 0.0000000000000000e+00 4279 0.0000000000000000e+00 4280 0.0000000000000000e+00 4281 0.0000000000000000e+00 4282 0.0000000000000000e+00 4283 0.0000000000000000e+00 4284 0.0000000000000000e+00 4285 0.0000000000000000e+00 4286 0.0000000000000000e+00 4287 0.0000000000000000e+00 4288 0.0000000000000000e+00 4289 0.0000000000000000e+00 4290 0.0000000000000000e+00 4291 0.0000000000000000e+00 4292 0.0000000000000000e+00 4293 0.0000000000000000e+00 4294 0.0000000000000000e+00 4295 0.0000000000000000e+00 4296 0.0000000000000000e+00 4297 0.0000000000000000e+00 4298 0.0000000000000000e+00 4299 0.0000000000000000e+00 4300 0.0000000000000000e+00 4301 0.0000000000000000e+00 4302 0.0000000000000000e+00 4303 0.0000000000000000e+00 4304 0.0000000000000000e+00 4305 0.0000000000000000e+00 4306 0.0000000000000000e+00 4307 0.0000000000000000e+00 4308 0.0000000000000000e+00 4309 0.0000000000000000e+00 4310 0.0000000000000000e+00 4311 0.0000000000000000e+00 4312 0.0000000000000000e+00 4313 0.0000000000000000e+00 4314 0.0000000000000000e+00 4315 0.0000000000000000e+00 4316 0.0000000000000000e+00 4317 0.0000000000000000e+00 4318 0.0000000000000000e+00 4319 0.0000000000000000e+00 4320 0.0000000000000000e+00 4321 0.0000000000000000e+00 4322 0.0000000000000000e+00 4323 0.0000000000000000e+00 4324 0.0000000000000000e+00 4325 0.0000000000000000e+00 4326 0.0000000000000000e+00 4327 0.0000000000000000e+00 4328 0.0000000000000000e+00 4329 0.0000000000000000e+00 4330 0.0000000000000000e+00 4331 0.0000000000000000e+00 4332 0.0000000000000000e+00 4333 0.0000000000000000e+00 4334 0.0000000000000000e+00 4335 0.0000000000000000e+00 4336 0.0000000000000000e+00 4337 0.0000000000000000e+00 4338 0.0000000000000000e+00 4339 0.0000000000000000e+00 4340 0.0000000000000000e+00 4341 0.0000000000000000e+00 4342 0.0000000000000000e+00 4343 0.0000000000000000e+00 4344 0.0000000000000000e+00 4345 0.0000000000000000e+00 4346 0.0000000000000000e+00 4347 0.0000000000000000e+00 4348 0.0000000000000000e+00 4349 0.0000000000000000e+00 4350 0.0000000000000000e+00 4351 0.0000000000000000e+00 4352 0.0000000000000000e+00 4353 0.0000000000000000e+00 4354 0.0000000000000000e+00 4355 0.0000000000000000e+00 4356 0.0000000000000000e+00 4357 0.0000000000000000e+00 4358 0.0000000000000000e+00 4359 0.0000000000000000e+00 4360 0.0000000000000000e+00 4361 0.0000000000000000e+00 4362 0.0000000000000000e+00 4363 0.0000000000000000e+00 4364 0.0000000000000000e+00 4365 0.0000000000000000e+00 4366 0.0000000000000000e+00 4367 0.0000000000000000e+00 4368 0.0000000000000000e+00 4369 0.0000000000000000e+00 4370 0.0000000000000000e+00 4371 0.0000000000000000e+00 4372 0.0000000000000000e+00 4373 0.0000000000000000e+00 4374 0.0000000000000000e+00 4375 0.0000000000000000e+00 4376 0.0000000000000000e+00 4377 0.0000000000000000e+00 4378 0.0000000000000000e+00 4379 0.0000000000000000e+00 4380 0.0000000000000000e+00 4381 0.0000000000000000e+00 4382 0.0000000000000000e+00 4383 0.0000000000000000e+00 4384 0.0000000000000000e+00 4385 0.0000000000000000e+00 4386 0.0000000000000000e+00 4387 0.0000000000000000e+00 4388 0.0000000000000000e+00 4389 0.0000000000000000e+00 4390 0.0000000000000000e+00 4391 0.0000000000000000e+00 4392 0.0000000000000000e+00 4393 0.0000000000000000e+00 4394 0.0000000000000000e+00 4395 0.0000000000000000e+00 4396 0.0000000000000000e+00 4397 0.0000000000000000e+00 4398 0.0000000000000000e+00 4399 0.0000000000000000e+00 4400 0.0000000000000000e+00 4401 0.0000000000000000e+00 4402 0.0000000000000000e+00 4403 0.0000000000000000e+00 4404 0.0000000000000000e+00 4405 0.0000000000000000e+00 4406 0.0000000000000000e+00 4407 0.0000000000000000e+00 4408 0.0000000000000000e+00 4409 0.0000000000000000e+00 4410 0.0000000000000000e+00 4411 0.0000000000000000e+00 4412 0.0000000000000000e+00 4413 0.0000000000000000e+00 4414 0.0000000000000000e+00 4415 0.0000000000000000e+00 4416 0.0000000000000000e+00 4417 0.0000000000000000e+00 4418 0.0000000000000000e+00 4419 0.0000000000000000e+00 4420 0.0000000000000000e+00 4421 0.0000000000000000e+00 4422 0.0000000000000000e+00 4423 0.0000000000000000e+00 4424 0.0000000000000000e+00 4425 0.0000000000000000e+00 4426 0.0000000000000000e+00 4427 0.0000000000000000e+00 4428 0.0000000000000000e+00 4429 0.0000000000000000e+00 4430 0.0000000000000000e+00 4431 0.0000000000000000e+00 4432 0.0000000000000000e+00 4433 0.0000000000000000e+00 4434 0.0000000000000000e+00 4435 0.0000000000000000e+00 4436 0.0000000000000000e+00 4437 0.0000000000000000e+00 4438 0.0000000000000000e+00 4439 0.0000000000000000e+00 4440 0.0000000000000000e+00 4441 0.0000000000000000e+00 4442 0.0000000000000000e+00 4443 0.0000000000000000e+00 4444 0.0000000000000000e+00 4445 0.0000000000000000e+00 4446 0.0000000000000000e+00 4447 0.0000000000000000e+00 4448 0.0000000000000000e+00 4449 0.0000000000000000e+00 4450 0.0000000000000000e+00 4451 0.0000000000000000e+00 4452 0.0000000000000000e+00 4453 0.0000000000000000e+00 4454 0.0000000000000000e+00 4455 0.0000000000000000e+00 4456 0.0000000000000000e+00 4457 0.0000000000000000e+00 4458 0.0000000000000000e+00 4459 0.0000000000000000e+00 4460 0.0000000000000000e+00 4461 0.0000000000000000e+00 4462 0.0000000000000000e+00 4463 0.0000000000000000e+00 4464 0.0000000000000000e+00 4465 0.0000000000000000e+00 4466 0.0000000000000000e+00 4467 0.0000000000000000e+00 4468 0.0000000000000000e+00 4469 0.0000000000000000e+00 4470 0.0000000000000000e+00 4471 0.0000000000000000e+00 4472 0.0000000000000000e+00 4473 0.0000000000000000e+00 4474 0.0000000000000000e+00 4475 0.0000000000000000e+00 4476 0.0000000000000000e+00 4477 0.0000000000000000e+00 4478 0.0000000000000000e+00 4479 0.0000000000000000e+00 4480 0.0000000000000000e+00 4481 0.0000000000000000e+00 4482 0.0000000000000000e+00 4483 0.0000000000000000e+00 4484 0.0000000000000000e+00 4485 0.0000000000000000e+00 4486 0.0000000000000000e+00 4487 0.0000000000000000e+00 4488 0.0000000000000000e+00 4489 0.0000000000000000e+00 4490 0.0000000000000000e+00 4491 0.0000000000000000e+00 4492 0.0000000000000000e+00 4493 0.0000000000000000e+00 4494 0.0000000000000000e+00 4495 0.0000000000000000e+00 4496 0.0000000000000000e+00 4497 0.0000000000000000e+00 4498 0.0000000000000000e+00 4499 0.0000000000000000e+00 4500 0.0000000000000000e+00 4501 0.0000000000000000e+00 4502 0.0000000000000000e+00 4503 0.0000000000000000e+00 4504 0.0000000000000000e+00 4505 0.0000000000000000e+00 4506 0.0000000000000000e+00 4507 0.0000000000000000e+00 4508 0.0000000000000000e+00 4509 0.0000000000000000e+00 4510 0.0000000000000000e+00 4511 0.0000000000000000e+00 4512 0.0000000000000000e+00 4513 0.0000000000000000e+00 4514 0.0000000000000000e+00 4515 0.0000000000000000e+00 4516 0.0000000000000000e+00 4517 0.0000000000000000e+00 4518 0.0000000000000000e+00 4519 0.0000000000000000e+00 4520 0.0000000000000000e+00 4521 0.0000000000000000e+00 4522 0.0000000000000000e+00 4523 0.0000000000000000e+00 4524 0.0000000000000000e+00 4525 0.0000000000000000e+00 4526 0.0000000000000000e+00 4527 0.0000000000000000e+00 4528 0.0000000000000000e+00 4529 0.0000000000000000e+00 4530 0.0000000000000000e+00 4531 0.0000000000000000e+00 4532 0.0000000000000000e+00 4533 0.0000000000000000e+00 4534 0.0000000000000000e+00 4535 0.0000000000000000e+00 4536 0.0000000000000000e+00 4537 0.0000000000000000e+00 4538 0.0000000000000000e+00 4539 0.0000000000000000e+00 4540 0.0000000000000000e+00 4541 0.0000000000000000e+00 4542 0.0000000000000000e+00 4543 0.0000000000000000e+00 4544 0.0000000000000000e+00 4545 0.0000000000000000e+00 4546 0.0000000000000000e+00 4547 0.0000000000000000e+00 4548 0.0000000000000000e+00 4549 0.0000000000000000e+00 4550 0.0000000000000000e+00 4551 0.0000000000000000e+00 4552 0.0000000000000000e+00 4553 0.0000000000000000e+00 4554 0.0000000000000000e+00 4555 0.0000000000000000e+00 4556 0.0000000000000000e+00 4557 0.0000000000000000e+00 4558 0.0000000000000000e+00 4559 0.0000000000000000e+00 4560 0.0000000000000000e+00 4561 0.0000000000000000e+00 4562 0.0000000000000000e+00 4563 0.0000000000000000e+00 4564 0.0000000000000000e+00 4565 0.0000000000000000e+00 4566 0.0000000000000000e+00 4567 0.0000000000000000e+00 4568 0.0000000000000000e+00 4569 0.0000000000000000e+00 4570 0.0000000000000000e+00 4571 0.0000000000000000e+00 4572 0.0000000000000000e+00 4573 0.0000000000000000e+00 4574 0.0000000000000000e+00 4575 0.0000000000000000e+00 4576 0.0000000000000000e+00 4577 0.0000000000000000e+00 4578 0.0000000000000000e+00 4579 0.0000000000000000e+00 4580 0.0000000000000000e+00 4581 0.0000000000000000e+00 4582 0.0000000000000000e+00 4583 0.0000000000000000e+00 4584 0.0000000000000000e+00 4585 0.0000000000000000e+00 4586 0.0000000000000000e+00 4587 0.0000000000000000e+00 4588 0.0000000000000000e+00 4589 0.0000000000000000e+00 4590 0.0000000000000000e+00 4591 0.0000000000000000e+00 4592 0.0000000000000000e+00 4593 0.0000000000000000e+00 4594 0.0000000000000000e+00 4595 0.0000000000000000e+00 4596 0.0000000000000000e+00 4597 0.0000000000000000e+00 4598 0.0000000000000000e+00 4599 0.0000000000000000e+00 4600 0.0000000000000000e+00 4601 0.0000000000000000e+00 4602 0.0000000000000000e+00 4603 0.0000000000000000e+00 4604 0.0000000000000000e+00 4605 0.0000000000000000e+00 4606 0.0000000000000000e+00 4607 0.0000000000000000e+00 4608 0.0000000000000000e+00 4609 0.0000000000000000e+00 4610 0.0000000000000000e+00 4611 0.0000000000000000e+00 4612 0.0000000000000000e+00 4613 0.0000000000000000e+00 4614 0.0000000000000000e+00 4615 0.0000000000000000e+00 4616 0.0000000000000000e+00 4617 0.0000000000000000e+00 4618 0.0000000000000000e+00 4619 0.0000000000000000e+00 4620 0.0000000000000000e+00 4621 0.0000000000000000e+00 4622 0.0000000000000000e+00 4623 0.0000000000000000e+00 4624 0.0000000000000000e+00 4625 0.0000000000000000e+00 4626 0.0000000000000000e+00 4627 0.0000000000000000e+00 4628 0.0000000000000000e+00 4629 0.0000000000000000e+00 4630 0.0000000000000000e+00 4631 0.0000000000000000e+00 4632 0.0000000000000000e+00 4633 0.0000000000000000e+00 4634 0.0000000000000000e+00 4635 0.0000000000000000e+00 4636 0.0000000000000000e+00 4637 0.0000000000000000e+00 4638 0.0000000000000000e+00 4639 0.0000000000000000e+00 4640 0.0000000000000000e+00 4641 0.0000000000000000e+00 4642 0.0000000000000000e+00 4643 0.0000000000000000e+00 4644 0.0000000000000000e+00 4645 0.0000000000000000e+00 4646 0.0000000000000000e+00 4647 0.0000000000000000e+00 4648 0.0000000000000000e+00 4649 0.0000000000000000e+00 4650 0.0000000000000000e+00 4651 0.0000000000000000e+00 4652 0.0000000000000000e+00 4653 0.0000000000000000e+00 4654 0.0000000000000000e+00 4655 0.0000000000000000e+00 4656 0.0000000000000000e+00 4657 0.0000000000000000e+00 4658 0.0000000000000000e+00 4659 0.0000000000000000e+00 4660 0.0000000000000000e+00 4661 0.0000000000000000e+00 4662 0.0000000000000000e+00 4663 0.0000000000000000e+00 4664 0.0000000000000000e+00 4665 0.0000000000000000e+00 4666 0.0000000000000000e+00 4667 0.0000000000000000e+00 4668 0.0000000000000000e+00 4669 0.0000000000000000e+00 4670 0.0000000000000000e+00 4671 0.0000000000000000e+00 4672 0.0000000000000000e+00 4673 0.0000000000000000e+00 4674 0.0000000000000000e+00 4675 0.0000000000000000e+00 4676 0.0000000000000000e+00 4677 0.0000000000000000e+00 4678 0.0000000000000000e+00 4679 0.0000000000000000e+00 4680 0.0000000000000000e+00 4681 0.0000000000000000e+00 4682 0.0000000000000000e+00 4683 0.0000000000000000e+00 4684 0.0000000000000000e+00 4685 0.0000000000000000e+00 4686 0.0000000000000000e+00 4687 0.0000000000000000e+00 4688 0.0000000000000000e+00 4689 0.0000000000000000e+00 4690 0.0000000000000000e+00 4691 0.0000000000000000e+00 4692 0.0000000000000000e+00 4693 0.0000000000000000e+00 4694 0.0000000000000000e+00 4695 0.0000000000000000e+00 4696 0.0000000000000000e+00 4697 0.0000000000000000e+00 4698 0.0000000000000000e+00 4699 0.0000000000000000e+00 4700 0.0000000000000000e+00 4701 0.0000000000000000e+00 4702 0.0000000000000000e+00 4703 0.0000000000000000e+00 4704 0.0000000000000000e+00 4705 0.0000000000000000e+00 4706 0.0000000000000000e+00 4707 0.0000000000000000e+00 4708 0.0000000000000000e+00 4709 0.0000000000000000e+00 4710 0.0000000000000000e+00 4711 0.0000000000000000e+00 4712 0.0000000000000000e+00 4713 0.0000000000000000e+00 4714 0.0000000000000000e+00 4715 0.0000000000000000e+00 4716 0.0000000000000000e+00 4717 0.0000000000000000e+00 4718 0.0000000000000000e+00 4719 0.0000000000000000e+00 4720 0.0000000000000000e+00 4721 0.0000000000000000e+00 4722 0.0000000000000000e+00 4723 0.0000000000000000e+00 4724 0.0000000000000000e+00 4725 0.0000000000000000e+00 4726 0.0000000000000000e+00 4727 0.0000000000000000e+00 4728 0.0000000000000000e+00 4729 0.0000000000000000e+00 4730 0.0000000000000000e+00 4731 0.0000000000000000e+00 4732 0.0000000000000000e+00 4733 0.0000000000000000e+00 4734 0.0000000000000000e+00 4735 0.0000000000000000e+00 4736 0.0000000000000000e+00 4737 0.0000000000000000e+00 4738 0.0000000000000000e+00 4739 0.0000000000000000e+00 4740 0.0000000000000000e+00 4741 0.0000000000000000e+00 4742 0.0000000000000000e+00 4743 0.0000000000000000e+00 4744 0.0000000000000000e+00 4745 0.0000000000000000e+00 4746 0.0000000000000000e+00 4747 0.0000000000000000e+00 4748 0.0000000000000000e+00 4749 0.0000000000000000e+00 4750 0.0000000000000000e+00 4751 0.0000000000000000e+00 4752 0.0000000000000000e+00 4753 0.0000000000000000e+00 4754 0.0000000000000000e+00 4755 0.0000000000000000e+00 4756 0.0000000000000000e+00 4757 0.0000000000000000e+00 4758 0.0000000000000000e+00 4759 0.0000000000000000e+00 4760 0.0000000000000000e+00 4761 0.0000000000000000e+00 4762 0.0000000000000000e+00 4763 0.0000000000000000e+00 4764 0.0000000000000000e+00 4765 0.0000000000000000e+00 4766 0.0000000000000000e+00 4767 0.0000000000000000e+00 4768 0.0000000000000000e+00 4769 0.0000000000000000e+00 4770 0.0000000000000000e+00 4771 0.0000000000000000e+00 4772 0.0000000000000000e+00 4773 0.0000000000000000e+00 4774 0.0000000000000000e+00 4775 0.0000000000000000e+00 4776 0.0000000000000000e+00 4777 0.0000000000000000e+00 4778 0.0000000000000000e+00 4779 0.0000000000000000e+00 4780 0.0000000000000000e+00 4781 0.0000000000000000e+00 4782 0.0000000000000000e+00 4783 0.0000000000000000e+00 4784 0.0000000000000000e+00 4785 0.0000000000000000e+00 4786 0.0000000000000000e+00 4787 0.0000000000000000e+00 4788 0.0000000000000000e+00 4789 0.0000000000000000e+00 4790 0.0000000000000000e+00 4791 0.0000000000000000e+00 4792 0.0000000000000000e+00 4793 0.0000000000000000e+00 4794 0.0000000000000000e+00 4795 0.0000000000000000e+00 4796 0.0000000000000000e+00 4797 0.0000000000000000e+00 4798 0.0000000000000000e+00 4799 0.0000000000000000e+00 4800 0.0000000000000000e+00 4801 0.0000000000000000e+00 4802 0.0000000000000000e+00 4803 0.0000000000000000e+00 4804 0.0000000000000000e+00 4805 0.0000000000000000e+00 4806 0.0000000000000000e+00 4807 0.0000000000000000e+00 4808 0.0000000000000000e+00 4809 0.0000000000000000e+00 4810 0.0000000000000000e+00 4811 0.0000000000000000e+00 4812 0.0000000000000000e+00 4813 0.0000000000000000e+00 4814 0.0000000000000000e+00 4815 0.0000000000000000e+00 4816 0.0000000000000000e+00 4817 0.0000000000000000e+00 4818 0.0000000000000000e+00 4819 0.0000000000000000e+00 4820 0.0000000000000000e+00 4821 0.0000000000000000e+00 4822 0.0000000000000000e+00 4823 0.0000000000000000e+00 4824 0.0000000000000000e+00 4825 0.0000000000000000e+00 4826 0.0000000000000000e+00 4827 0.0000000000000000e+00 4828 0.0000000000000000e+00 4829 0.0000000000000000e+00 4830 0.0000000000000000e+00 4831 0.0000000000000000e+00 4832 0.0000000000000000e+00 4833 0.0000000000000000e+00 4834 0.0000000000000000e+00 4835 0.0000000000000000e+00 4836 0.0000000000000000e+00 4837 0.0000000000000000e+00 4838 0.0000000000000000e+00 4839 0.0000000000000000e+00 4840 0.0000000000000000e+00 4841 0.0000000000000000e+00 4842 0.0000000000000000e+00 4843 0.0000000000000000e+00 4844 0.0000000000000000e+00 4845 0.0000000000000000e+00 4846 0.0000000000000000e+00 4847 0.0000000000000000e+00 4848 0.0000000000000000e+00 4849 0.0000000000000000e+00 4850 0.0000000000000000e+00 4851 0.0000000000000000e+00 4852 0.0000000000000000e+00 4853 0.0000000000000000e+00 4854 0.0000000000000000e+00 4855 0.0000000000000000e+00 4856 0.0000000000000000e+00 4857 0.0000000000000000e+00 4858 0.0000000000000000e+00 4859 0.0000000000000000e+00 4860 0.0000000000000000e+00 4861 0.0000000000000000e+00 4862 0.0000000000000000e+00 4863 0.0000000000000000e+00 4864 0.0000000000000000e+00 4865 0.0000000000000000e+00 4866 0.0000000000000000e+00 4867 0.0000000000000000e+00 4868 0.0000000000000000e+00 4869 0.0000000000000000e+00 4870 0.0000000000000000e+00 4871 0.0000000000000000e+00 4872 0.0000000000000000e+00 4873 0.0000000000000000e+00 4874 0.0000000000000000e+00 4875 0.0000000000000000e+00 4876 0.0000000000000000e+00 4877 0.0000000000000000e+00 4878 0.0000000000000000e+00 4879 0.0000000000000000e+00 4880 0.0000000000000000e+00 4881 0.0000000000000000e+00 4882 0.0000000000000000e+00 4883 0.0000000000000000e+00 4884 0.0000000000000000e+00 4885 0.0000000000000000e+00 4886 0.0000000000000000e+00 4887 0.0000000000000000e+00 4888 0.0000000000000000e+00 4889 0.0000000000000000e+00 4890 0.0000000000000000e+00 4891 0.0000000000000000e+00 4892 0.0000000000000000e+00 4893 0.0000000000000000e+00 4894 0.0000000000000000e+00 4895 0.0000000000000000e+00 4896 0.0000000000000000e+00 4897 0.0000000000000000e+00 4898 0.0000000000000000e+00 4899 0.0000000000000000e+00 4900 0.0000000000000000e+00 4901 0.0000000000000000e+00 4902 0.0000000000000000e+00 4903 0.0000000000000000e+00 4904 0.0000000000000000e+00 4905 0.0000000000000000e+00 4906 0.0000000000000000e+00 4907 0.0000000000000000e+00 4908 0.0000000000000000e+00 4909 0.0000000000000000e+00 4910 0.0000000000000000e+00 4911 0.0000000000000000e+00 4912 0.0000000000000000e+00 4913 0.0000000000000000e+00 4914 0.0000000000000000e+00 4915 0.0000000000000000e+00 4916 0.0000000000000000e+00 4917 0.0000000000000000e+00 4918 0.0000000000000000e+00 4919 0.0000000000000000e+00 4920 0.0000000000000000e+00 4921 0.0000000000000000e+00 4922 0.0000000000000000e+00 4923 0.0000000000000000e+00 4924 0.0000000000000000e+00 4925 0.0000000000000000e+00 4926 0.0000000000000000e+00 4927 0.0000000000000000e+00 4928 0.0000000000000000e+00 4929 0.0000000000000000e+00 4930 0.0000000000000000e+00 4931 0.0000000000000000e+00 4932 0.0000000000000000e+00 4933 0.0000000000000000e+00 4934 0.0000000000000000e+00 4935 0.0000000000000000e+00 4936 0.0000000000000000e+00 4937 0.0000000000000000e+00 4938 0.0000000000000000e+00 4939 0.0000000000000000e+00 4940 0.0000000000000000e+00 4941 0.0000000000000000e+00 4942 0.0000000000000000e+00 4943 0.0000000000000000e+00 4944 0.0000000000000000e+00 4945 0.0000000000000000e+00 4946 0.0000000000000000e+00 4947 0.0000000000000000e+00 4948 0.0000000000000000e+00 4949 0.0000000000000000e+00 4950 0.0000000000000000e+00 4951 0.0000000000000000e+00 4952 0.0000000000000000e+00 4953 0.0000000000000000e+00 4954 0.0000000000000000e+00 4955 0.0000000000000000e+00 4956 0.0000000000000000e+00 4957 0.0000000000000000e+00 4958 0.0000000000000000e+00 4959 0.0000000000000000e+00 4960 0.0000000000000000e+00 4961 0.0000000000000000e+00 4962 0.0000000000000000e+00 4963 0.0000000000000000e+00 4964 0.0000000000000000e+00 4965 0.0000000000000000e+00 4966 0.0000000000000000e+00 4967 0.0000000000000000e+00 4968 0.0000000000000000e+00 4969 0.0000000000000000e+00 4970 0.0000000000000000e+00 4971 0.0000000000000000e+00 4972 0.0000000000000000e+00 4973 0.0000000000000000e+00 4974 0.0000000000000000e+00 4975 0.0000000000000000e+00 4976 0.0000000000000000e+00 4977 0.0000000000000000e+00 4978 0.0000000000000000e+00 4979 0.0000000000000000e+00 4980 0.0000000000000000e+00 4981 0.0000000000000000e+00 4982 0.0000000000000000e+00 4983 0.0000000000000000e+00 4984 0.0000000000000000e+00 4985 0.0000000000000000e+00 4986 0.0000000000000000e+00 4987 0.0000000000000000e+00 4988 0.0000000000000000e+00 4989 0.0000000000000000e+00 4990 0.0000000000000000e+00 4991 0.0000000000000000e+00 4992 0.0000000000000000e+00 4993 0.0000000000000000e+00 4994 0.0000000000000000e+00 4995 0.0000000000000000e+00 4996 0.0000000000000000e+00 4997 0.0000000000000000e+00 4998 0.0000000000000000e+00 4999 0.0000000000000000e+00 5000 0.0000000000000000e+00 5001 0.0000000000000000e+00 5002 0.0000000000000000e+00 5003 0.0000000000000000e+00 5004 0.0000000000000000e+00 5005 0.0000000000000000e+00 5006 0.0000000000000000e+00 5007 0.0000000000000000e+00 5008 0.0000000000000000e+00 5009 0.0000000000000000e+00 5010 0.0000000000000000e+00 5011 0.0000000000000000e+00 5012 0.0000000000000000e+00 5013 0.0000000000000000e+00 5014 0.0000000000000000e+00 5015 0.0000000000000000e+00 5016 0.0000000000000000e+00 5017 0.0000000000000000e+00 5018 0.0000000000000000e+00 5019 0.0000000000000000e+00 5020 0.0000000000000000e+00 5021 0.0000000000000000e+00 5022 0.0000000000000000e+00 5023 0.0000000000000000e+00 5024 0.0000000000000000e+00 5025 0.0000000000000000e+00 5026 0.0000000000000000e+00 5027 0.0000000000000000e+00 5028 0.0000000000000000e+00 5029 0.0000000000000000e+00 5030 0.0000000000000000e+00 5031 0.0000000000000000e+00 5032 0.0000000000000000e+00 5033 0.0000000000000000e+00 5034 0.0000000000000000e+00 5035 0.0000000000000000e+00 5036 0.0000000000000000e+00 5037 0.0000000000000000e+00 5038 0.0000000000000000e+00 5039 0.0000000000000000e+00 5040 0.0000000000000000e+00 5041 0.0000000000000000e+00 5042 0.0000000000000000e+00 5043 0.0000000000000000e+00 5044 0.0000000000000000e+00 5045 0.0000000000000000e+00 5046 0.0000000000000000e+00 5047 0.0000000000000000e+00 5048 0.0000000000000000e+00 5049 0.0000000000000000e+00 5050 0.0000000000000000e+00 5051 0.0000000000000000e+00 5052 0.0000000000000000e+00 5053 0.0000000000000000e+00 5054 0.0000000000000000e+00 5055 0.0000000000000000e+00 5056 0.0000000000000000e+00 5057 0.0000000000000000e+00 5058 0.0000000000000000e+00 5059 0.0000000000000000e+00 5060 0.0000000000000000e+00 5061 0.0000000000000000e+00 5062 0.0000000000000000e+00 5063 0.0000000000000000e+00 5064 0.0000000000000000e+00 5065 0.0000000000000000e+00 5066 0.0000000000000000e+00 5067 0.0000000000000000e+00 5068 0.0000000000000000e+00 5069 0.0000000000000000e+00 5070 0.0000000000000000e+00 5071 0.0000000000000000e+00 5072 0.0000000000000000e+00 5073 0.0000000000000000e+00 5074 0.0000000000000000e+00 5075 0.0000000000000000e+00 5076 0.0000000000000000e+00 5077 0.0000000000000000e+00 5078 0.0000000000000000e+00 5079 0.0000000000000000e+00 5080 0.0000000000000000e+00 hypre-2.33.0/src/test/TEST_ams/mfem.y.00000000066400000000000000000000076421477326011500177060ustar00rootroot000000000000001 152 1 0.0000000000000000e+00 2 2.5000000000000000e-01 3 2.5000000000000000e-01 4 5.0000000000000000e-01 5 2.5000000000000000e-01 6 3.7500000000000000e-01 7 2.5000000000000000e-01 8 3.7500000000000000e-01 9 5.0000000000000000e-01 10 5.0000000000000000e-01 11 3.7500000000000000e-01 12 0.0000000000000000e+00 13 1.2500000000000000e-01 14 5.0000000000000000e-01 15 6.2500000000000000e-01 16 5.0000000000000000e-01 17 6.2500000000000000e-01 18 6.2500000000000000e-01 19 2.5000000000000000e-01 20 0.0000000000000000e+00 21 7.5000000000000000e-01 22 1.2500000000000000e-01 23 2.5000000000000000e-01 24 1.8750000000000000e-01 25 1.8750000000000000e-01 26 1.2500000000000000e-01 27 3.7500000000000000e-01 28 2.5000000000000000e-01 29 3.1250000000000000e-01 30 3.1250000000000000e-01 31 3.7500000000000000e-01 32 4.3750000000000000e-01 33 3.7500000000000000e-01 34 2.5000000000000000e-01 35 3.1250000000000000e-01 36 3.1250000000000000e-01 37 3.7500000000000000e-01 38 4.3750000000000000e-01 39 5.0000000000000000e-01 40 5.0000000000000000e-01 41 4.3750000000000000e-01 42 4.3750000000000000e-01 43 5.0000000000000000e-01 44 4.3750000000000000e-01 45 5.0000000000000000e-01 46 5.0000000000000000e-01 47 4.3750000000000000e-01 48 4.3750000000000000e-01 49 0.0000000000000000e+00 50 6.2500000000000000e-02 51 6.2500000000000000e-02 52 0.0000000000000000e+00 53 6.2500000000000000e-02 54 3.7500000000000000e-01 55 3.7500000000000000e-01 56 3.1250000000000000e-01 57 4.3750000000000000e-01 58 5.0000000000000000e-01 59 5.6250000000000000e-01 60 5.0000000000000000e-01 61 5.6250000000000000e-01 62 5.6250000000000000e-01 63 5.6250000000000000e-01 64 5.0000000000000000e-01 65 5.6250000000000000e-01 66 5.6250000000000000e-01 67 5.0000000000000000e-01 68 5.6250000000000000e-01 69 6.2500000000000000e-01 70 6.8750000000000000e-01 71 6.8750000000000000e-01 72 6.2500000000000000e-01 73 5.6250000000000000e-01 74 6.8750000000000000e-01 75 6.8750000000000000e-01 76 6.2500000000000000e-01 77 6.2500000000000000e-01 78 6.8750000000000000e-01 79 5.6250000000000000e-01 80 5.0000000000000000e-01 81 3.7500000000000000e-01 82 2.5000000000000000e-01 83 2.5000000000000000e-01 84 3.7500000000000000e-01 85 3.7500000000000000e-01 86 3.1250000000000000e-01 87 4.3750000000000000e-01 88 3.7500000000000000e-01 89 2.5000000000000000e-01 90 3.1250000000000000e-01 91 4.3750000000000000e-01 92 3.1250000000000000e-01 93 2.5000000000000000e-01 94 1.2500000000000000e-01 95 1.2500000000000000e-01 96 1.8750000000000000e-01 97 6.2500000000000000e-02 98 0.0000000000000000e+00 99 1.2500000000000000e-01 100 6.2500000000000000e-02 101 0.0000000000000000e+00 102 1.8750000000000000e-01 103 2.5000000000000000e-01 104 1.8750000000000000e-01 105 1.2500000000000000e-01 106 6.2500000000000000e-01 107 6.2500000000000000e-01 108 6.8750000000000000e-01 109 5.6250000000000000e-01 110 6.2500000000000000e-01 111 6.8750000000000000e-01 112 5.6250000000000000e-01 113 6.8750000000000000e-01 114 0.0000000000000000e+00 115 0.0000000000000000e+00 116 1.2500000000000000e-01 117 4.3750000000000000e-01 118 3.7500000000000000e-01 119 5.0000000000000000e-01 120 4.3750000000000000e-01 121 3.7500000000000000e-01 122 3.7500000000000000e-01 123 3.1250000000000000e-01 124 5.0000000000000000e-01 125 4.3750000000000000e-01 126 3.7500000000000000e-01 127 4.3750000000000000e-01 128 1.2500000000000000e-01 129 2.5000000000000000e-01 130 1.8750000000000000e-01 131 3.7500000000000000e-01 132 3.1250000000000000e-01 133 3.1250000000000000e-01 134 3.1250000000000000e-01 135 6.2500000000000000e-01 136 6.2500000000000000e-01 137 6.8750000000000000e-01 138 5.6250000000000000e-01 139 6.2500000000000000e-01 140 5.6250000000000000e-01 141 6.8750000000000000e-01 142 6.8750000000000000e-01 143 6.8750000000000000e-01 144 5.6250000000000000e-01 145 6.2500000000000000e-01 146 5.6250000000000000e-01 147 6.2500000000000000e-01 148 5.6250000000000000e-01 149 6.2500000000000000e-01 150 6.2500000000000000e-01 151 6.8750000000000000e-01 152 3.7500000000000000e-01 hypre-2.33.0/src/test/TEST_ams/mfem.y.00001000066400000000000000000000131771477326011500177070ustar00rootroot00000000000000153 365 153 1.0000000000000000e+00 154 7.5000000000000000e-01 155 7.5000000000000000e-01 156 8.7500000000000000e-01 157 5.0000000000000000e-01 158 7.5000000000000000e-01 159 7.5000000000000000e-01 160 5.0000000000000000e-01 161 7.5000000000000000e-01 162 1.0000000000000000e+00 163 7.5000000000000000e-01 164 1.0000000000000000e+00 165 1.0000000000000000e+00 166 1.0000000000000000e+00 167 1.0000000000000000e+00 168 1.0000000000000000e+00 169 8.7500000000000000e-01 170 1.0000000000000000e+00 171 7.5000000000000000e-01 172 8.7500000000000000e-01 173 7.5000000000000000e-01 174 7.5000000000000000e-01 175 8.7500000000000000e-01 176 1.0000000000000000e+00 177 7.5000000000000000e-01 178 1.0000000000000000e+00 179 7.5000000000000000e-01 180 5.0000000000000000e-01 181 7.5000000000000000e-01 182 1.0000000000000000e+00 183 5.0000000000000000e-01 184 1.0000000000000000e+00 185 7.5000000000000000e-01 186 6.2500000000000000e-01 187 1.0000000000000000e+00 188 8.7500000000000000e-01 189 7.5000000000000000e-01 190 8.1250000000000000e-01 191 8.1250000000000000e-01 192 8.7500000000000000e-01 193 9.3750000000000000e-01 194 6.2500000000000000e-01 195 6.2500000000000000e-01 196 6.2500000000000000e-01 197 7.5000000000000000e-01 198 6.2500000000000000e-01 199 5.0000000000000000e-01 200 6.2500000000000000e-01 201 6.2500000000000000e-01 202 7.5000000000000000e-01 203 1.0000000000000000e+00 204 1.0000000000000000e+00 205 8.7500000000000000e-01 206 7.5000000000000000e-01 207 7.5000000000000000e-01 208 6.2500000000000000e-01 209 8.7500000000000000e-01 210 8.7500000000000000e-01 211 8.7500000000000000e-01 212 8.7500000000000000e-01 213 1.0000000000000000e+00 214 1.0000000000000000e+00 215 1.0000000000000000e+00 216 9.3750000000000000e-01 217 9.3750000000000000e-01 218 1.0000000000000000e+00 219 9.3750000000000000e-01 220 8.7500000000000000e-01 221 8.7500000000000000e-01 222 8.1250000000000000e-01 223 9.3750000000000000e-01 224 1.0000000000000000e+00 225 9.3750000000000000e-01 226 8.7500000000000000e-01 227 7.5000000000000000e-01 228 8.1250000000000000e-01 229 8.1250000000000000e-01 230 8.7500000000000000e-01 231 8.7500000000000000e-01 232 7.5000000000000000e-01 233 8.1250000000000000e-01 234 8.1250000000000000e-01 235 9.3750000000000000e-01 236 1.0000000000000000e+00 237 1.0000000000000000e+00 238 9.3750000000000000e-01 239 9.3750000000000000e-01 240 1.0000000000000000e+00 241 5.0000000000000000e-01 242 5.0000000000000000e-01 243 6.2500000000000000e-01 244 6.2500000000000000e-01 245 6.2500000000000000e-01 246 8.7500000000000000e-01 247 1.0000000000000000e+00 248 1.0000000000000000e+00 249 8.7500000000000000e-01 250 8.7500000000000000e-01 251 7.5000000000000000e-01 252 7.5000000000000000e-01 253 8.1250000000000000e-01 254 7.5000000000000000e-01 255 8.7500000000000000e-01 256 6.2500000000000000e-01 257 5.0000000000000000e-01 258 5.0000000000000000e-01 259 6.2500000000000000e-01 260 5.0000000000000000e-01 261 5.0000000000000000e-01 262 5.0000000000000000e-01 263 5.0000000000000000e-01 264 7.5000000000000000e-01 265 7.5000000000000000e-01 266 6.2500000000000000e-01 267 6.2500000000000000e-01 268 8.7500000000000000e-01 269 8.7500000000000000e-01 270 8.7500000000000000e-01 271 8.7500000000000000e-01 272 7.5000000000000000e-01 273 8.7500000000000000e-01 274 1.0000000000000000e+00 275 7.5000000000000000e-01 276 8.7500000000000000e-01 277 1.0000000000000000e+00 278 7.5000000000000000e-01 279 8.7500000000000000e-01 280 8.7500000000000000e-01 281 8.7500000000000000e-01 282 8.7500000000000000e-01 283 7.5000000000000000e-01 284 8.7500000000000000e-01 285 7.5000000000000000e-01 286 6.2500000000000000e-01 287 6.2500000000000000e-01 288 1.0000000000000000e+00 289 1.0000000000000000e+00 290 1.0000000000000000e+00 291 1.0000000000000000e+00 292 8.7500000000000000e-01 293 1.0000000000000000e+00 294 8.7500000000000000e-01 295 1.0000000000000000e+00 296 1.0000000000000000e+00 297 1.0000000000000000e+00 298 1.0000000000000000e+00 299 8.7500000000000000e-01 300 7.5000000000000000e-01 301 6.2500000000000000e-01 302 7.5000000000000000e-01 303 6.2500000000000000e-01 304 6.2500000000000000e-01 305 7.5000000000000000e-01 306 8.7500000000000000e-01 307 7.5000000000000000e-01 308 1.0000000000000000e+00 309 1.0000000000000000e+00 310 9.3750000000000000e-01 311 9.3750000000000000e-01 312 1.0000000000000000e+00 313 8.7500000000000000e-01 314 8.7500000000000000e-01 315 8.1250000000000000e-01 316 9.3750000000000000e-01 317 1.0000000000000000e+00 318 8.1250000000000000e-01 319 8.7500000000000000e-01 320 8.1250000000000000e-01 321 8.7500000000000000e-01 322 7.5000000000000000e-01 323 8.1250000000000000e-01 324 8.1250000000000000e-01 325 8.7500000000000000e-01 326 7.5000000000000000e-01 327 7.5000000000000000e-01 328 7.5000000000000000e-01 329 7.5000000000000000e-01 330 8.7500000000000000e-01 331 8.7500000000000000e-01 332 8.1250000000000000e-01 333 7.5000000000000000e-01 334 7.5000000000000000e-01 335 6.8750000000000000e-01 336 6.8750000000000000e-01 337 6.8750000000000000e-01 338 7.5000000000000000e-01 339 1.0000000000000000e+00 340 1.0000000000000000e+00 341 9.3750000000000000e-01 342 9.3750000000000000e-01 343 1.0000000000000000e+00 344 8.7500000000000000e-01 345 9.3750000000000000e-01 346 1.0000000000000000e+00 347 8.7500000000000000e-01 348 9.3750000000000000e-01 349 8.7500000000000000e-01 350 8.7500000000000000e-01 351 8.1250000000000000e-01 352 7.5000000000000000e-01 353 8.1250000000000000e-01 354 7.5000000000000000e-01 355 3.7500000000000000e-01 356 3.7500000000000000e-01 357 3.7500000000000000e-01 358 6.2500000000000000e-01 359 6.2500000000000000e-01 360 7.5000000000000000e-01 361 8.7500000000000000e-01 362 1.0000000000000000e+00 363 1.0000000000000000e+00 364 3.7500000000000000e-01 365 3.7500000000000000e-01 hypre-2.33.0/src/test/TEST_ams/mfem.y.00002000066400000000000000000000151131477326011500177000ustar00rootroot00000000000000366 614 366 0.0000000000000000e+00 367 0.0000000000000000e+00 368 0.0000000000000000e+00 369 1.2500000000000000e-01 370 2.5000000000000000e-01 371 2.5000000000000000e-01 372 3.7500000000000000e-01 373 0.0000000000000000e+00 374 2.5000000000000000e-01 375 0.0000000000000000e+00 376 1.2500000000000000e-01 377 2.5000000000000000e-01 378 2.5000000000000000e-01 379 0.0000000000000000e+00 380 0.0000000000000000e+00 381 0.0000000000000000e+00 382 5.0000000000000000e-01 383 5.0000000000000000e-01 384 2.5000000000000000e-01 385 0.0000000000000000e+00 386 5.0000000000000000e-01 387 2.5000000000000000e-01 388 2.5000000000000000e-01 389 5.0000000000000000e-01 390 2.5000000000000000e-01 391 2.5000000000000000e-01 392 2.5000000000000000e-01 393 2.5000000000000000e-01 394 1.2500000000000000e-01 395 0.0000000000000000e+00 396 5.0000000000000000e-01 397 5.0000000000000000e-01 398 2.5000000000000000e-01 399 0.0000000000000000e+00 400 0.0000000000000000e+00 401 5.0000000000000000e-01 402 0.0000000000000000e+00 403 0.0000000000000000e+00 404 0.0000000000000000e+00 405 2.5000000000000000e-01 406 7.5000000000000000e-01 407 7.5000000000000000e-01 408 0.0000000000000000e+00 409 0.0000000000000000e+00 410 0.0000000000000000e+00 411 6.2500000000000000e-02 412 6.2500000000000000e-02 413 0.0000000000000000e+00 414 6.2500000000000000e-02 415 3.7500000000000000e-01 416 2.5000000000000000e-01 417 3.1250000000000000e-01 418 3.1250000000000000e-01 419 3.7500000000000000e-01 420 4.3750000000000000e-01 421 1.2500000000000000e-01 422 2.5000000000000000e-01 423 1.8750000000000000e-01 424 1.8750000000000000e-01 425 1.2500000000000000e-01 426 1.2500000000000000e-01 427 1.2500000000000000e-01 428 1.8750000000000000e-01 429 6.2500000000000000e-02 430 0.0000000000000000e+00 431 6.2500000000000000e-02 432 1.2500000000000000e-01 433 2.5000000000000000e-01 434 1.8750000000000000e-01 435 1.8750000000000000e-01 436 1.2500000000000000e-01 437 1.2500000000000000e-01 438 0.0000000000000000e+00 439 0.0000000000000000e+00 440 0.0000000000000000e+00 441 1.2500000000000000e-01 442 1.2500000000000000e-01 443 3.7500000000000000e-01 444 3.7500000000000000e-01 445 5.0000000000000000e-01 446 5.0000000000000000e-01 447 5.0000000000000000e-01 448 1.2500000000000000e-01 449 1.2500000000000000e-01 450 0.0000000000000000e+00 451 1.2500000000000000e-01 452 0.0000000000000000e+00 453 0.0000000000000000e+00 454 3.7500000000000000e-01 455 2.5000000000000000e-01 456 2.5000000000000000e-01 457 2.5000000000000000e-01 458 3.7500000000000000e-01 459 3.7500000000000000e-01 460 2.5000000000000000e-01 461 2.5000000000000000e-01 462 2.5000000000000000e-01 463 3.7500000000000000e-01 464 3.7500000000000000e-01 465 3.7500000000000000e-01 466 5.0000000000000000e-01 467 3.7500000000000000e-01 468 5.0000000000000000e-01 469 1.2500000000000000e-01 470 2.5000000000000000e-01 471 2.5000000000000000e-01 472 2.5000000000000000e-01 473 1.2500000000000000e-01 474 1.2500000000000000e-01 475 1.2500000000000000e-01 476 2.5000000000000000e-01 477 6.2500000000000000e-01 478 6.2500000000000000e-01 479 6.2500000000000000e-01 480 5.0000000000000000e-01 481 7.5000000000000000e-01 482 6.2500000000000000e-01 483 1.2500000000000000e-01 484 1.2500000000000000e-01 485 1.8750000000000000e-01 486 6.2500000000000000e-02 487 6.2500000000000000e-02 488 1.8750000000000000e-01 489 1.2500000000000000e-01 490 1.2500000000000000e-01 491 1.8750000000000000e-01 492 6.2500000000000000e-02 493 0.0000000000000000e+00 494 1.2500000000000000e-01 495 2.5000000000000000e-01 496 1.8750000000000000e-01 497 6.2500000000000000e-02 498 0.0000000000000000e+00 499 2.5000000000000000e-01 500 3.1250000000000000e-01 501 1.2500000000000000e-01 502 1.8750000000000000e-01 503 0.0000000000000000e+00 504 6.2500000000000000e-02 505 2.5000000000000000e-01 506 3.1250000000000000e-01 507 3.7500000000000000e-01 508 0.0000000000000000e+00 509 0.0000000000000000e+00 510 6.2500000000000000e-02 511 1.2500000000000000e-01 512 0.0000000000000000e+00 513 2.5000000000000000e-01 514 2.5000000000000000e-01 515 2.5000000000000000e-01 516 4.3750000000000000e-01 517 1.2500000000000000e-01 518 1.2500000000000000e-01 519 1.2500000000000000e-01 520 2.5000000000000000e-01 521 0.0000000000000000e+00 522 0.0000000000000000e+00 523 0.0000000000000000e+00 524 2.5000000000000000e-01 525 3.7500000000000000e-01 526 2.5000000000000000e-01 527 3.7500000000000000e-01 528 1.2500000000000000e-01 529 3.7500000000000000e-01 530 3.7500000000000000e-01 531 5.0000000000000000e-01 532 5.0000000000000000e-01 533 5.0000000000000000e-01 534 5.0000000000000000e-01 535 5.0000000000000000e-01 536 3.7500000000000000e-01 537 3.7500000000000000e-01 538 3.7500000000000000e-01 539 2.5000000000000000e-01 540 2.5000000000000000e-01 541 2.5000000000000000e-01 542 3.7500000000000000e-01 543 3.7500000000000000e-01 544 1.2500000000000000e-01 545 1.2500000000000000e-01 546 1.2500000000000000e-01 547 1.2500000000000000e-01 548 0.0000000000000000e+00 549 1.2500000000000000e-01 550 1.2500000000000000e-01 551 0.0000000000000000e+00 552 0.0000000000000000e+00 553 0.0000000000000000e+00 554 0.0000000000000000e+00 555 2.5000000000000000e-01 556 3.7500000000000000e-01 557 3.7500000000000000e-01 558 5.0000000000000000e-01 559 2.5000000000000000e-01 560 1.2500000000000000e-01 561 3.7500000000000000e-01 562 3.7500000000000000e-01 563 3.7500000000000000e-01 564 5.0000000000000000e-01 565 5.0000000000000000e-01 566 1.2500000000000000e-01 567 1.2500000000000000e-01 568 5.0000000000000000e-01 569 5.0000000000000000e-01 570 3.7500000000000000e-01 571 3.7500000000000000e-01 572 3.7500000000000000e-01 573 1.2500000000000000e-01 574 0.0000000000000000e+00 575 1.2500000000000000e-01 576 0.0000000000000000e+00 577 1.2500000000000000e-01 578 0.0000000000000000e+00 579 0.0000000000000000e+00 580 0.0000000000000000e+00 581 1.2500000000000000e-01 582 0.0000000000000000e+00 583 0.0000000000000000e+00 584 1.2500000000000000e-01 585 1.2500000000000000e-01 586 3.7500000000000000e-01 587 2.5000000000000000e-01 588 2.5000000000000000e-01 589 2.5000000000000000e-01 590 3.7500000000000000e-01 591 1.2500000000000000e-01 592 6.2500000000000000e-01 593 6.2500000000000000e-01 594 6.2500000000000000e-01 595 6.2500000000000000e-01 596 6.2500000000000000e-01 597 6.2500000000000000e-01 598 7.5000000000000000e-01 599 7.5000000000000000e-01 600 6.2500000000000000e-01 601 6.2500000000000000e-01 602 6.2500000000000000e-01 603 6.2500000000000000e-01 604 7.5000000000000000e-01 605 6.2500000000000000e-01 606 6.2500000000000000e-01 607 7.5000000000000000e-01 608 2.5000000000000000e-01 609 1.2500000000000000e-01 610 2.5000000000000000e-01 611 1.2500000000000000e-01 612 0.0000000000000000e+00 613 0.0000000000000000e+00 614 0.0000000000000000e+00 hypre-2.33.0/src/test/TEST_ams/mfem.y.00003000066400000000000000000000146511477326011500177070ustar00rootroot00000000000000615 857 615 5.0000000000000000e-01 616 7.5000000000000000e-01 617 7.5000000000000000e-01 618 7.5000000000000000e-01 619 7.5000000000000000e-01 620 5.0000000000000000e-01 621 1.0000000000000000e+00 622 7.5000000000000000e-01 623 7.5000000000000000e-01 624 5.0000000000000000e-01 625 2.5000000000000000e-01 626 2.5000000000000000e-01 627 1.0000000000000000e+00 628 7.5000000000000000e-01 629 1.0000000000000000e+00 630 7.5000000000000000e-01 631 1.0000000000000000e+00 632 1.0000000000000000e+00 633 0.0000000000000000e+00 634 2.5000000000000000e-01 635 2.5000000000000000e-01 636 5.0000000000000000e-01 637 2.5000000000000000e-01 638 1.0000000000000000e+00 639 1.0000000000000000e+00 640 0.0000000000000000e+00 641 1.0000000000000000e+00 642 7.5000000000000000e-01 643 5.0000000000000000e-01 644 5.0000000000000000e-01 645 5.0000000000000000e-01 646 1.0000000000000000e+00 647 1.0000000000000000e+00 648 5.0000000000000000e-01 649 5.0000000000000000e-01 650 0.0000000000000000e+00 651 0.0000000000000000e+00 652 0.0000000000000000e+00 653 2.5000000000000000e-01 654 1.0000000000000000e+00 655 1.0000000000000000e+00 656 0.0000000000000000e+00 657 6.2500000000000000e-01 658 7.5000000000000000e-01 659 7.5000000000000000e-01 660 7.5000000000000000e-01 661 6.2500000000000000e-01 662 6.2500000000000000e-01 663 6.2500000000000000e-01 664 6.2500000000000000e-01 665 6.2500000000000000e-01 666 7.5000000000000000e-01 667 6.2500000000000000e-01 668 5.0000000000000000e-01 669 8.7500000000000000e-01 670 7.5000000000000000e-01 671 7.5000000000000000e-01 672 8.7500000000000000e-01 673 8.7500000000000000e-01 674 6.2500000000000000e-01 675 6.2500000000000000e-01 676 6.2500000000000000e-01 677 7.5000000000000000e-01 678 6.2500000000000000e-01 679 5.0000000000000000e-01 680 3.7500000000000000e-01 681 5.0000000000000000e-01 682 1.2500000000000000e-01 683 2.5000000000000000e-01 684 1.2500000000000000e-01 685 2.5000000000000000e-01 686 2.5000000000000000e-01 687 1.2500000000000000e-01 688 8.7500000000000000e-01 689 7.5000000000000000e-01 690 7.5000000000000000e-01 691 7.5000000000000000e-01 692 8.7500000000000000e-01 693 8.7500000000000000e-01 694 8.7500000000000000e-01 695 7.5000000000000000e-01 696 7.5000000000000000e-01 697 8.7500000000000000e-01 698 8.7500000000000000e-01 699 8.7500000000000000e-01 700 1.0000000000000000e+00 701 8.7500000000000000e-01 702 1.0000000000000000e+00 703 1.0000000000000000e+00 704 1.2500000000000000e-01 705 2.5000000000000000e-01 706 2.5000000000000000e-01 707 2.5000000000000000e-01 708 1.2500000000000000e-01 709 1.2500000000000000e-01 710 3.7500000000000000e-01 711 2.5000000000000000e-01 712 2.5000000000000000e-01 713 3.7500000000000000e-01 714 3.7500000000000000e-01 715 8.7500000000000000e-01 716 1.0000000000000000e+00 717 8.7500000000000000e-01 718 1.0000000000000000e+00 719 1.0000000000000000e+00 720 8.7500000000000000e-01 721 8.7500000000000000e-01 722 1.0000000000000000e+00 723 1.0000000000000000e+00 724 1.0000000000000000e+00 725 1.2500000000000000e-01 726 1.2500000000000000e-01 727 1.2500000000000000e-01 728 0.0000000000000000e+00 729 0.0000000000000000e+00 730 8.7500000000000000e-01 731 7.5000000000000000e-01 732 7.5000000000000000e-01 733 8.7500000000000000e-01 734 8.7500000000000000e-01 735 6.2500000000000000e-01 736 6.2500000000000000e-01 737 6.2500000000000000e-01 738 5.0000000000000000e-01 739 6.2500000000000000e-01 740 5.0000000000000000e-01 741 8.7500000000000000e-01 742 8.7500000000000000e-01 743 1.0000000000000000e+00 744 6.2500000000000000e-01 745 5.0000000000000000e-01 746 6.2500000000000000e-01 747 5.0000000000000000e-01 748 5.0000000000000000e-01 749 5.0000000000000000e-01 750 6.2500000000000000e-01 751 5.0000000000000000e-01 752 6.2500000000000000e-01 753 5.0000000000000000e-01 754 5.0000000000000000e-01 755 5.0000000000000000e-01 756 5.0000000000000000e-01 757 6.2500000000000000e-01 758 6.2500000000000000e-01 759 6.2500000000000000e-01 760 6.2500000000000000e-01 761 7.5000000000000000e-01 762 7.5000000000000000e-01 763 6.2500000000000000e-01 764 8.7500000000000000e-01 765 3.7500000000000000e-01 766 3.7500000000000000e-01 767 2.5000000000000000e-01 768 3.7500000000000000e-01 769 3.7500000000000000e-01 770 3.7500000000000000e-01 771 2.5000000000000000e-01 772 3.7500000000000000e-01 773 3.7500000000000000e-01 774 3.7500000000000000e-01 775 3.7500000000000000e-01 776 3.7500000000000000e-01 777 3.7500000000000000e-01 778 3.7500000000000000e-01 779 3.7500000000000000e-01 780 8.7500000000000000e-01 781 8.7500000000000000e-01 782 8.7500000000000000e-01 783 8.7500000000000000e-01 784 1.0000000000000000e+00 785 7.5000000000000000e-01 786 6.2500000000000000e-01 787 8.7500000000000000e-01 788 8.7500000000000000e-01 789 8.7500000000000000e-01 790 8.7500000000000000e-01 791 8.7500000000000000e-01 792 1.0000000000000000e+00 793 1.0000000000000000e+00 794 1.0000000000000000e+00 795 1.0000000000000000e+00 796 3.7500000000000000e-01 797 2.5000000000000000e-01 798 3.7500000000000000e-01 799 1.2500000000000000e-01 800 1.2500000000000000e-01 801 0.0000000000000000e+00 802 3.7500000000000000e-01 803 3.7500000000000000e-01 804 3.7500000000000000e-01 805 5.0000000000000000e-01 806 5.0000000000000000e-01 807 3.7500000000000000e-01 808 5.0000000000000000e-01 809 3.7500000000000000e-01 810 5.0000000000000000e-01 811 5.0000000000000000e-01 812 6.2500000000000000e-01 813 0.0000000000000000e+00 814 1.2500000000000000e-01 815 0.0000000000000000e+00 816 0.0000000000000000e+00 817 0.0000000000000000e+00 818 1.2500000000000000e-01 819 0.0000000000000000e+00 820 0.0000000000000000e+00 821 1.2500000000000000e-01 822 1.2500000000000000e-01 823 1.2500000000000000e-01 824 1.2500000000000000e-01 825 1.2500000000000000e-01 826 0.0000000000000000e+00 827 0.0000000000000000e+00 828 0.0000000000000000e+00 829 1.2500000000000000e-01 830 1.2500000000000000e-01 831 2.5000000000000000e-01 832 1.2500000000000000e-01 833 7.5000000000000000e-01 834 7.5000000000000000e-01 835 8.7500000000000000e-01 836 8.7500000000000000e-01 837 8.7500000000000000e-01 838 1.0000000000000000e+00 839 1.0000000000000000e+00 840 1.0000000000000000e+00 841 1.0000000000000000e+00 842 8.7500000000000000e-01 843 1.0000000000000000e+00 844 1.0000000000000000e+00 845 1.0000000000000000e+00 846 1.0000000000000000e+00 847 2.5000000000000000e-01 848 2.5000000000000000e-01 849 3.7500000000000000e-01 850 1.2500000000000000e-01 851 2.5000000000000000e-01 852 1.2500000000000000e-01 853 1.2500000000000000e-01 854 0.0000000000000000e+00 855 0.0000000000000000e+00 856 0.0000000000000000e+00 857 0.0000000000000000e+00 hypre-2.33.0/src/test/TEST_ams/mfem.z.00000000066400000000000000000000076421477326011500177070ustar00rootroot000000000000001 152 1 5.0000000000000000e-01 2 2.5000000000000000e-01 3 5.0000000000000000e-01 4 0.0000000000000000e+00 5 0.0000000000000000e+00 6 1.2500000000000000e-01 7 5.0000000000000000e-01 8 3.7500000000000000e-01 9 2.5000000000000000e-01 10 0.0000000000000000e+00 11 1.2500000000000000e-01 12 0.0000000000000000e+00 13 1.2500000000000000e-01 14 5.0000000000000000e-01 15 1.2500000000000000e-01 16 2.5000000000000000e-01 17 3.7500000000000000e-01 18 1.2500000000000000e-01 19 7.5000000000000000e-01 20 2.5000000000000000e-01 21 2.5000000000000000e-01 22 3.7500000000000000e-01 23 3.7500000000000000e-01 24 3.1250000000000000e-01 25 4.3750000000000000e-01 26 5.0000000000000000e-01 27 1.2500000000000000e-01 28 1.2500000000000000e-01 29 1.8750000000000000e-01 30 6.2500000000000000e-02 31 0.0000000000000000e+00 32 6.2500000000000000e-02 33 5.0000000000000000e-01 34 5.0000000000000000e-01 35 4.3750000000000000e-01 36 4.3750000000000000e-01 37 5.0000000000000000e-01 38 4.3750000000000000e-01 39 1.2500000000000000e-01 40 1.2500000000000000e-01 41 1.8750000000000000e-01 42 6.2500000000000000e-02 43 0.0000000000000000e+00 44 6.2500000000000000e-02 45 3.7500000000000000e-01 46 3.7500000000000000e-01 47 3.1250000000000000e-01 48 4.3750000000000000e-01 49 1.2500000000000000e-01 50 1.8750000000000000e-01 51 6.2500000000000000e-02 52 0.0000000000000000e+00 53 6.2500000000000000e-02 54 0.0000000000000000e+00 55 0.0000000000000000e+00 56 6.2500000000000000e-02 57 6.2500000000000000e-02 58 0.0000000000000000e+00 59 4.3750000000000000e-01 60 2.5000000000000000e-01 61 1.8750000000000000e-01 62 1.8750000000000000e-01 63 6.2500000000000000e-02 64 2.5000000000000000e-01 65 3.1250000000000000e-01 66 3.1250000000000000e-01 67 3.7500000000000000e-01 68 4.3750000000000000e-01 69 0.0000000000000000e+00 70 6.2500000000000000e-02 71 6.2500000000000000e-02 72 0.0000000000000000e+00 73 6.2500000000000000e-02 74 1.8750000000000000e-01 75 6.2500000000000000e-02 76 1.2500000000000000e-01 77 2.5000000000000000e-01 78 1.8750000000000000e-01 79 1.8750000000000000e-01 80 1.2500000000000000e-01 81 5.0000000000000000e-01 82 6.2500000000000000e-01 83 6.2500000000000000e-01 84 3.7500000000000000e-01 85 2.5000000000000000e-01 86 3.1250000000000000e-01 87 3.1250000000000000e-01 88 2.5000000000000000e-01 89 2.5000000000000000e-01 90 1.8750000000000000e-01 91 1.8750000000000000e-01 92 3.1250000000000000e-01 93 3.7500000000000000e-01 94 1.2500000000000000e-01 95 2.5000000000000000e-01 96 1.8750000000000000e-01 97 1.8750000000000000e-01 98 1.2500000000000000e-01 99 2.5000000000000000e-01 100 3.1250000000000000e-01 101 3.7500000000000000e-01 102 1.8750000000000000e-01 103 1.2500000000000000e-01 104 6.2500000000000000e-02 105 0.0000000000000000e+00 106 0.0000000000000000e+00 107 0.0000000000000000e+00 108 6.2500000000000000e-02 109 6.2500000000000000e-02 110 1.2500000000000000e-01 111 1.8750000000000000e-01 112 6.2500000000000000e-02 113 1.8750000000000000e-01 114 3.7500000000000000e-01 115 2.5000000000000000e-01 116 5.0000000000000000e-01 117 4.3750000000000000e-01 118 3.7500000000000000e-01 119 1.2500000000000000e-01 120 1.8750000000000000e-01 121 2.5000000000000000e-01 122 1.2500000000000000e-01 123 1.8750000000000000e-01 124 3.7500000000000000e-01 125 3.1250000000000000e-01 126 2.5000000000000000e-01 127 1.8750000000000000e-01 128 0.0000000000000000e+00 129 0.0000000000000000e+00 130 6.2500000000000000e-02 131 0.0000000000000000e+00 132 6.2500000000000000e-02 133 6.2500000000000000e-02 134 1.8750000000000000e-01 135 3.7500000000000000e-01 136 3.7500000000000000e-01 137 4.3750000000000000e-01 138 4.3750000000000000e-01 139 3.7500000000000000e-01 140 4.3750000000000000e-01 141 3.1250000000000000e-01 142 4.3750000000000000e-01 143 3.1250000000000000e-01 144 3.1250000000000000e-01 145 2.5000000000000000e-01 146 3.1250000000000000e-01 147 2.5000000000000000e-01 148 1.8750000000000000e-01 149 2.5000000000000000e-01 150 3.7500000000000000e-01 151 3.1250000000000000e-01 152 6.2500000000000000e-01 hypre-2.33.0/src/test/TEST_ams/mfem.z.00001000066400000000000000000000131771477326011500177100ustar00rootroot00000000000000153 365 153 0.0000000000000000e+00 154 0.0000000000000000e+00 155 0.0000000000000000e+00 156 1.2500000000000000e-01 157 5.0000000000000000e-01 158 7.5000000000000000e-01 159 7.5000000000000000e-01 160 7.5000000000000000e-01 161 0.0000000000000000e+00 162 0.0000000000000000e+00 163 5.0000000000000000e-01 164 1.0000000000000000e+00 165 7.5000000000000000e-01 166 0.0000000000000000e+00 167 2.5000000000000000e-01 168 2.5000000000000000e-01 169 1.2500000000000000e-01 170 5.0000000000000000e-01 171 2.5000000000000000e-01 172 3.7500000000000000e-01 173 5.0000000000000000e-01 174 2.5000000000000000e-01 175 3.7500000000000000e-01 176 2.5000000000000000e-01 177 1.0000000000000000e+00 178 7.5000000000000000e-01 179 2.5000000000000000e-01 180 5.0000000000000000e-01 181 1.0000000000000000e+00 182 1.0000000000000000e+00 183 0.0000000000000000e+00 184 5.0000000000000000e-01 185 0.0000000000000000e+00 186 3.7500000000000000e-01 187 0.0000000000000000e+00 188 0.0000000000000000e+00 189 0.0000000000000000e+00 190 6.2500000000000000e-02 191 6.2500000000000000e-02 192 0.0000000000000000e+00 193 6.2500000000000000e-02 194 6.2500000000000000e-01 195 7.5000000000000000e-01 196 7.5000000000000000e-01 197 7.5000000000000000e-01 198 6.2500000000000000e-01 199 6.2500000000000000e-01 200 6.2500000000000000e-01 201 7.5000000000000000e-01 202 7.5000000000000000e-01 203 1.2500000000000000e-01 204 0.0000000000000000e+00 205 0.0000000000000000e+00 206 6.2500000000000000e-01 207 6.2500000000000000e-01 208 5.0000000000000000e-01 209 8.7500000000000000e-01 210 7.5000000000000000e-01 211 7.5000000000000000e-01 212 8.7500000000000000e-01 213 8.7500000000000000e-01 214 1.2500000000000000e-01 215 2.5000000000000000e-01 216 1.8750000000000000e-01 217 1.8750000000000000e-01 218 1.2500000000000000e-01 219 6.2500000000000000e-02 220 3.7500000000000000e-01 221 2.5000000000000000e-01 222 3.1250000000000000e-01 223 3.1250000000000000e-01 224 3.7500000000000000e-01 225 4.3750000000000000e-01 226 5.0000000000000000e-01 227 5.0000000000000000e-01 228 4.3750000000000000e-01 229 4.3750000000000000e-01 230 5.0000000000000000e-01 231 3.7500000000000000e-01 232 3.7500000000000000e-01 233 3.1250000000000000e-01 234 4.3750000000000000e-01 235 4.3750000000000000e-01 236 3.7500000000000000e-01 237 2.5000000000000000e-01 238 3.1250000000000000e-01 239 3.1250000000000000e-01 240 3.7500000000000000e-01 241 8.7500000000000000e-01 242 8.7500000000000000e-01 243 8.7500000000000000e-01 244 1.0000000000000000e+00 245 1.0000000000000000e+00 246 7.5000000000000000e-01 247 8.7500000000000000e-01 248 7.5000000000000000e-01 249 8.7500000000000000e-01 250 7.5000000000000000e-01 251 1.2500000000000000e-01 252 1.2500000000000000e-01 253 1.8750000000000000e-01 254 8.7500000000000000e-01 255 6.2500000000000000e-01 256 8.7500000000000000e-01 257 7.5000000000000000e-01 258 8.7500000000000000e-01 259 6.2500000000000000e-01 260 6.2500000000000000e-01 261 6.2500000000000000e-01 262 5.0000000000000000e-01 263 5.0000000000000000e-01 264 8.7500000000000000e-01 265 8.7500000000000000e-01 266 8.7500000000000000e-01 267 1.0000000000000000e+00 268 1.0000000000000000e+00 269 8.7500000000000000e-01 270 8.7500000000000000e-01 271 1.0000000000000000e+00 272 8.7500000000000000e-01 273 1.0000000000000000e+00 274 1.0000000000000000e+00 275 1.0000000000000000e+00 276 1.0000000000000000e+00 277 1.0000000000000000e+00 278 8.7500000000000000e-01 279 2.5000000000000000e-01 280 1.2500000000000000e-01 281 2.5000000000000000e-01 282 1.2500000000000000e-01 283 1.2500000000000000e-01 284 0.0000000000000000e+00 285 0.0000000000000000e+00 286 0.0000000000000000e+00 287 1.2500000000000000e-01 288 1.2500000000000000e-01 289 1.2500000000000000e-01 290 2.5000000000000000e-01 291 0.0000000000000000e+00 292 6.2500000000000000e-01 293 7.5000000000000000e-01 294 7.5000000000000000e-01 295 6.2500000000000000e-01 296 6.2500000000000000e-01 297 8.7500000000000000e-01 298 8.7500000000000000e-01 299 6.2500000000000000e-01 300 2.5000000000000000e-01 301 5.0000000000000000e-01 302 6.2500000000000000e-01 303 5.0000000000000000e-01 304 5.0000000000000000e-01 305 6.2500000000000000e-01 306 6.2500000000000000e-01 307 1.2500000000000000e-01 308 3.7500000000000000e-01 309 3.7500000000000000e-01 310 3.1250000000000000e-01 311 4.3750000000000000e-01 312 5.0000000000000000e-01 313 3.7500000000000000e-01 314 2.5000000000000000e-01 315 3.1250000000000000e-01 316 4.3750000000000000e-01 317 5.0000000000000000e-01 318 3.1250000000000000e-01 319 2.5000000000000000e-01 320 1.8750000000000000e-01 321 1.2500000000000000e-01 322 1.2500000000000000e-01 323 1.8750000000000000e-01 324 6.2500000000000000e-02 325 0.0000000000000000e+00 326 1.2500000000000000e-01 327 2.5000000000000000e-01 328 3.7500000000000000e-01 329 3.7500000000000000e-01 330 5.0000000000000000e-01 331 5.0000000000000000e-01 332 4.3750000000000000e-01 333 3.7500000000000000e-01 334 5.0000000000000000e-01 335 4.3750000000000000e-01 336 4.3750000000000000e-01 337 3.1250000000000000e-01 338 2.5000000000000000e-01 339 1.2500000000000000e-01 340 1.2500000000000000e-01 341 1.8750000000000000e-01 342 6.2500000000000000e-02 343 0.0000000000000000e+00 344 1.2500000000000000e-01 345 6.2500000000000000e-02 346 0.0000000000000000e+00 347 2.5000000000000000e-01 348 1.8750000000000000e-01 349 0.0000000000000000e+00 350 0.0000000000000000e+00 351 6.2500000000000000e-02 352 0.0000000000000000e+00 353 1.8750000000000000e-01 354 3.7500000000000000e-01 355 6.2500000000000000e-01 356 7.5000000000000000e-01 357 6.2500000000000000e-01 358 8.7500000000000000e-01 359 1.0000000000000000e+00 360 1.0000000000000000e+00 361 6.2500000000000000e-01 362 6.2500000000000000e-01 363 6.2500000000000000e-01 364 7.5000000000000000e-01 365 6.2500000000000000e-01 hypre-2.33.0/src/test/TEST_ams/mfem.z.00002000066400000000000000000000151131477326011500177010ustar00rootroot00000000000000366 614 366 5.0000000000000000e-01 367 2.5000000000000000e-01 368 5.0000000000000000e-01 369 3.7500000000000000e-01 370 2.5000000000000000e-01 371 5.0000000000000000e-01 372 3.7500000000000000e-01 373 0.0000000000000000e+00 374 0.0000000000000000e+00 375 0.0000000000000000e+00 376 1.2500000000000000e-01 377 0.0000000000000000e+00 378 5.0000000000000000e-01 379 2.5000000000000000e-01 380 5.0000000000000000e-01 381 5.0000000000000000e-01 382 2.5000000000000000e-01 383 2.5000000000000000e-01 384 2.5000000000000000e-01 385 0.0000000000000000e+00 386 0.0000000000000000e+00 387 0.0000000000000000e+00 388 0.0000000000000000e+00 389 5.0000000000000000e-01 390 7.5000000000000000e-01 391 7.5000000000000000e-01 392 5.0000000000000000e-01 393 2.5000000000000000e-01 394 3.7500000000000000e-01 395 2.5000000000000000e-01 396 0.0000000000000000e+00 397 5.0000000000000000e-01 398 2.5000000000000000e-01 399 2.5000000000000000e-01 400 0.0000000000000000e+00 401 2.5000000000000000e-01 402 7.5000000000000000e-01 403 7.5000000000000000e-01 404 1.0000000000000000e+00 405 7.5000000000000000e-01 406 0.0000000000000000e+00 407 2.5000000000000000e-01 408 7.5000000000000000e-01 409 3.7500000000000000e-01 410 3.7500000000000000e-01 411 3.1250000000000000e-01 412 4.3750000000000000e-01 413 5.0000000000000000e-01 414 4.3750000000000000e-01 415 3.7500000000000000e-01 416 3.7500000000000000e-01 417 3.1250000000000000e-01 418 4.3750000000000000e-01 419 5.0000000000000000e-01 420 4.3750000000000000e-01 421 5.0000000000000000e-01 422 5.0000000000000000e-01 423 4.3750000000000000e-01 424 4.3750000000000000e-01 425 5.0000000000000000e-01 426 0.0000000000000000e+00 427 0.0000000000000000e+00 428 6.2500000000000000e-02 429 6.2500000000000000e-02 430 0.0000000000000000e+00 431 6.2500000000000000e-02 432 1.2500000000000000e-01 433 1.2500000000000000e-01 434 1.8750000000000000e-01 435 6.2500000000000000e-02 436 0.0000000000000000e+00 437 3.7500000000000000e-01 438 3.7500000000000000e-01 439 3.7500000000000000e-01 440 5.0000000000000000e-01 441 5.0000000000000000e-01 442 5.0000000000000000e-01 443 2.5000000000000000e-01 444 2.5000000000000000e-01 445 3.7500000000000000e-01 446 3.7500000000000000e-01 447 2.5000000000000000e-01 448 1.2500000000000000e-01 449 1.2500000000000000e-01 450 1.2500000000000000e-01 451 2.5000000000000000e-01 452 1.2500000000000000e-01 453 0.0000000000000000e+00 454 3.7500000000000000e-01 455 3.7500000000000000e-01 456 3.7500000000000000e-01 457 2.5000000000000000e-01 458 5.0000000000000000e-01 459 1.2500000000000000e-01 460 1.2500000000000000e-01 461 0.0000000000000000e+00 462 1.2500000000000000e-01 463 0.0000000000000000e+00 464 0.0000000000000000e+00 465 3.7500000000000000e-01 466 3.7500000000000000e-01 467 2.5000000000000000e-01 468 5.0000000000000000e-01 469 6.2500000000000000e-01 470 6.2500000000000000e-01 471 6.2500000000000000e-01 472 7.5000000000000000e-01 473 6.2500000000000000e-01 474 5.0000000000000000e-01 475 6.2500000000000000e-01 476 6.2500000000000000e-01 477 1.2500000000000000e-01 478 2.5000000000000000e-01 479 2.5000000000000000e-01 480 1.2500000000000000e-01 481 1.2500000000000000e-01 482 0.0000000000000000e+00 483 3.7500000000000000e-01 484 2.5000000000000000e-01 485 3.1250000000000000e-01 486 3.1250000000000000e-01 487 4.3750000000000000e-01 488 3.1250000000000000e-01 489 3.7500000000000000e-01 490 2.5000000000000000e-01 491 3.1250000000000000e-01 492 3.1250000000000000e-01 493 3.7500000000000000e-01 494 2.5000000000000000e-01 495 2.5000000000000000e-01 496 1.8750000000000000e-01 497 1.8750000000000000e-01 498 1.2500000000000000e-01 499 3.7500000000000000e-01 500 3.1250000000000000e-01 501 5.0000000000000000e-01 502 4.3750000000000000e-01 503 5.0000000000000000e-01 504 4.3750000000000000e-01 505 3.7500000000000000e-01 506 4.3750000000000000e-01 507 5.0000000000000000e-01 508 1.2500000000000000e-01 509 2.5000000000000000e-01 510 1.8750000000000000e-01 511 1.2500000000000000e-01 512 1.2500000000000000e-01 513 1.2500000000000000e-01 514 1.2500000000000000e-01 515 0.0000000000000000e+00 516 3.1250000000000000e-01 517 2.5000000000000000e-01 518 3.7500000000000000e-01 519 5.0000000000000000e-01 520 5.0000000000000000e-01 521 3.7500000000000000e-01 522 2.5000000000000000e-01 523 5.0000000000000000e-01 524 1.2500000000000000e-01 525 1.2500000000000000e-01 526 0.0000000000000000e+00 527 1.2500000000000000e-01 528 0.0000000000000000e+00 529 0.0000000000000000e+00 530 0.0000000000000000e+00 531 0.0000000000000000e+00 532 1.2500000000000000e-01 533 1.2500000000000000e-01 534 1.2500000000000000e-01 535 0.0000000000000000e+00 536 0.0000000000000000e+00 537 1.2500000000000000e-01 538 3.7500000000000000e-01 539 3.7500000000000000e-01 540 3.7500000000000000e-01 541 2.5000000000000000e-01 542 3.7500000000000000e-01 543 5.0000000000000000e-01 544 3.7500000000000000e-01 545 2.5000000000000000e-01 546 2.5000000000000000e-01 547 3.7500000000000000e-01 548 3.7500000000000000e-01 549 1.2500000000000000e-01 550 1.2500000000000000e-01 551 1.2500000000000000e-01 552 2.5000000000000000e-01 553 1.2500000000000000e-01 554 0.0000000000000000e+00 555 5.0000000000000000e-01 556 5.0000000000000000e-01 557 5.0000000000000000e-01 558 5.0000000000000000e-01 559 1.2500000000000000e-01 560 0.0000000000000000e+00 561 2.5000000000000000e-01 562 2.5000000000000000e-01 563 1.2500000000000000e-01 564 1.2500000000000000e-01 565 3.7500000000000000e-01 566 0.0000000000000000e+00 567 0.0000000000000000e+00 568 2.5000000000000000e-01 569 3.7500000000000000e-01 570 6.2500000000000000e-01 571 6.2500000000000000e-01 572 6.2500000000000000e-01 573 6.2500000000000000e-01 574 6.2500000000000000e-01 575 7.5000000000000000e-01 576 6.2500000000000000e-01 577 7.5000000000000000e-01 578 7.5000000000000000e-01 579 6.2500000000000000e-01 580 6.2500000000000000e-01 581 8.7500000000000000e-01 582 8.7500000000000000e-01 583 8.7500000000000000e-01 584 7.5000000000000000e-01 585 8.7500000000000000e-01 586 6.2500000000000000e-01 587 6.2500000000000000e-01 588 6.2500000000000000e-01 589 7.5000000000000000e-01 590 6.2500000000000000e-01 591 6.2500000000000000e-01 592 2.5000000000000000e-01 593 1.2500000000000000e-01 594 1.2500000000000000e-01 595 0.0000000000000000e+00 596 0.0000000000000000e+00 597 0.0000000000000000e+00 598 0.0000000000000000e+00 599 1.2500000000000000e-01 600 2.5000000000000000e-01 601 3.7500000000000000e-01 602 3.7500000000000000e-01 603 2.5000000000000000e-01 604 2.5000000000000000e-01 605 3.7500000000000000e-01 606 1.2500000000000000e-01 607 1.2500000000000000e-01 608 6.2500000000000000e-01 609 6.2500000000000000e-01 610 7.5000000000000000e-01 611 6.2500000000000000e-01 612 6.2500000000000000e-01 613 6.2500000000000000e-01 614 6.2500000000000000e-01 hypre-2.33.0/src/test/TEST_ams/mfem.z.00003000066400000000000000000000146511477326011500177100ustar00rootroot00000000000000615 857 615 1.0000000000000000e+00 616 7.5000000000000000e-01 617 1.0000000000000000e+00 618 1.0000000000000000e+00 619 7.5000000000000000e-01 620 7.5000000000000000e-01 621 1.0000000000000000e+00 622 1.0000000000000000e+00 623 5.0000000000000000e-01 624 7.5000000000000000e-01 625 1.0000000000000000e+00 626 1.0000000000000000e+00 627 5.0000000000000000e-01 628 5.0000000000000000e-01 629 5.0000000000000000e-01 630 5.0000000000000000e-01 631 2.5000000000000000e-01 632 5.0000000000000000e-01 633 1.0000000000000000e+00 634 1.0000000000000000e+00 635 1.0000000000000000e+00 636 1.0000000000000000e+00 637 1.0000000000000000e+00 638 7.5000000000000000e-01 639 1.0000000000000000e+00 640 7.5000000000000000e-01 641 1.0000000000000000e+00 642 7.5000000000000000e-01 643 7.5000000000000000e-01 644 1.0000000000000000e+00 645 1.0000000000000000e+00 646 0.0000000000000000e+00 647 2.5000000000000000e-01 648 1.0000000000000000e+00 649 7.5000000000000000e-01 650 1.0000000000000000e+00 651 1.0000000000000000e+00 652 7.5000000000000000e-01 653 7.5000000000000000e-01 654 7.5000000000000000e-01 655 7.5000000000000000e-01 656 1.0000000000000000e+00 657 8.7500000000000000e-01 658 8.7500000000000000e-01 659 1.0000000000000000e+00 660 8.7500000000000000e-01 661 1.0000000000000000e+00 662 1.0000000000000000e+00 663 6.2500000000000000e-01 664 7.5000000000000000e-01 665 7.5000000000000000e-01 666 7.5000000000000000e-01 667 6.2500000000000000e-01 668 6.2500000000000000e-01 669 8.7500000000000000e-01 670 8.7500000000000000e-01 671 1.0000000000000000e+00 672 1.0000000000000000e+00 673 1.0000000000000000e+00 674 6.2500000000000000e-01 675 6.2500000000000000e-01 676 5.0000000000000000e-01 677 6.2500000000000000e-01 678 5.0000000000000000e-01 679 6.2500000000000000e-01 680 7.5000000000000000e-01 681 6.2500000000000000e-01 682 8.7500000000000000e-01 683 8.7500000000000000e-01 684 1.0000000000000000e+00 685 8.7500000000000000e-01 686 1.0000000000000000e+00 687 1.0000000000000000e+00 688 3.7500000000000000e-01 689 3.7500000000000000e-01 690 5.0000000000000000e-01 691 3.7500000000000000e-01 692 5.0000000000000000e-01 693 5.0000000000000000e-01 694 3.7500000000000000e-01 695 3.7500000000000000e-01 696 3.7500000000000000e-01 697 3.7500000000000000e-01 698 5.0000000000000000e-01 699 3.7500000000000000e-01 700 3.7500000000000000e-01 701 2.5000000000000000e-01 702 3.7500000000000000e-01 703 5.0000000000000000e-01 704 8.7500000000000000e-01 705 8.7500000000000000e-01 706 1.0000000000000000e+00 707 8.7500000000000000e-01 708 1.0000000000000000e+00 709 1.0000000000000000e+00 710 8.7500000000000000e-01 711 8.7500000000000000e-01 712 1.0000000000000000e+00 713 1.0000000000000000e+00 714 1.0000000000000000e+00 715 8.7500000000000000e-01 716 8.7500000000000000e-01 717 7.5000000000000000e-01 718 8.7500000000000000e-01 719 1.0000000000000000e+00 720 6.2500000000000000e-01 721 6.2500000000000000e-01 722 6.2500000000000000e-01 723 6.2500000000000000e-01 724 5.0000000000000000e-01 725 7.5000000000000000e-01 726 7.5000000000000000e-01 727 7.5000000000000000e-01 728 6.2500000000000000e-01 729 7.5000000000000000e-01 730 8.7500000000000000e-01 731 8.7500000000000000e-01 732 7.5000000000000000e-01 733 8.7500000000000000e-01 734 1.0000000000000000e+00 735 7.5000000000000000e-01 736 7.5000000000000000e-01 737 8.7500000000000000e-01 738 8.7500000000000000e-01 739 6.2500000000000000e-01 740 6.2500000000000000e-01 741 1.0000000000000000e+00 742 1.0000000000000000e+00 743 1.0000000000000000e+00 744 8.7500000000000000e-01 745 7.5000000000000000e-01 746 7.5000000000000000e-01 747 8.7500000000000000e-01 748 8.7500000000000000e-01 749 6.2500000000000000e-01 750 8.7500000000000000e-01 751 7.5000000000000000e-01 752 8.7500000000000000e-01 753 8.7500000000000000e-01 754 8.7500000000000000e-01 755 1.0000000000000000e+00 756 1.0000000000000000e+00 757 1.0000000000000000e+00 758 1.0000000000000000e+00 759 1.0000000000000000e+00 760 5.0000000000000000e-01 761 6.2500000000000000e-01 762 6.2500000000000000e-01 763 5.0000000000000000e-01 764 6.2500000000000000e-01 765 7.5000000000000000e-01 766 8.7500000000000000e-01 767 8.7500000000000000e-01 768 8.7500000000000000e-01 769 1.0000000000000000e+00 770 8.7500000000000000e-01 771 8.7500000000000000e-01 772 8.7500000000000000e-01 773 1.0000000000000000e+00 774 8.7500000000000000e-01 775 1.0000000000000000e+00 776 1.0000000000000000e+00 777 7.5000000000000000e-01 778 7.5000000000000000e-01 779 7.5000000000000000e-01 780 1.2500000000000000e-01 781 0.0000000000000000e+00 782 0.0000000000000000e+00 783 1.2500000000000000e-01 784 1.2500000000000000e-01 785 5.0000000000000000e-01 786 5.0000000000000000e-01 787 5.0000000000000000e-01 788 5.0000000000000000e-01 789 2.5000000000000000e-01 790 2.5000000000000000e-01 791 1.2500000000000000e-01 792 1.2500000000000000e-01 793 3.7500000000000000e-01 794 2.5000000000000000e-01 795 3.7500000000000000e-01 796 8.7500000000000000e-01 797 8.7500000000000000e-01 798 1.0000000000000000e+00 799 7.5000000000000000e-01 800 8.7500000000000000e-01 801 8.7500000000000000e-01 802 8.7500000000000000e-01 803 1.0000000000000000e+00 804 1.0000000000000000e+00 805 1.0000000000000000e+00 806 1.0000000000000000e+00 807 7.5000000000000000e-01 808 7.5000000000000000e-01 809 7.5000000000000000e-01 810 8.7500000000000000e-01 811 6.2500000000000000e-01 812 7.5000000000000000e-01 813 7.5000000000000000e-01 814 8.7500000000000000e-01 815 8.7500000000000000e-01 816 8.7500000000000000e-01 817 1.0000000000000000e+00 818 8.7500000000000000e-01 819 8.7500000000000000e-01 820 1.0000000000000000e+00 821 1.0000000000000000e+00 822 1.0000000000000000e+00 823 1.0000000000000000e+00 824 7.5000000000000000e-01 825 6.2500000000000000e-01 826 7.5000000000000000e-01 827 8.7500000000000000e-01 828 6.2500000000000000e-01 829 6.2500000000000000e-01 830 7.5000000000000000e-01 831 6.2500000000000000e-01 832 8.7500000000000000e-01 833 6.2500000000000000e-01 834 6.2500000000000000e-01 835 7.5000000000000000e-01 836 7.5000000000000000e-01 837 6.2500000000000000e-01 838 6.2500000000000000e-01 839 8.7500000000000000e-01 840 7.5000000000000000e-01 841 8.7500000000000000e-01 842 7.5000000000000000e-01 843 7.5000000000000000e-01 844 6.2500000000000000e-01 845 6.2500000000000000e-01 846 8.7500000000000000e-01 847 8.7500000000000000e-01 848 7.5000000000000000e-01 849 8.7500000000000000e-01 850 8.7500000000000000e-01 851 1.0000000000000000e+00 852 1.0000000000000000e+00 853 1.0000000000000000e+00 854 1.0000000000000000e+00 855 8.7500000000000000e-01 856 8.7500000000000000e-01 857 1.0000000000000000e+00 hypre-2.33.0/src/test/TEST_ams/solvers.jobs000077500000000000000000000023441477326011500205030ustar00rootroot00000000000000#!/bin/bash # Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) #============================================================================= # ams: Run through solvers #============================================================================= mpirun -np 4 ./ams_driver -solver 2 > solvers.out.0 mpirun -np 4 ./ams_driver -solver 2 -coord > solvers.out.1 mpirun -np 4 ./ams_driver -solver 2 -h1 > solvers.out.2 mpirun -np 4 ./ams_driver -solver 2 -h1 -coord > solvers.out.3 mpirun -np 4 ./ams_driver -solver 3 > solvers.out.4 mpirun -np 4 ./ams_driver -solver 3 -coord > solvers.out.5 mpirun -np 4 ./ams_driver -solver 3 -h1 > solvers.out.6 mpirun -np 4 ./ams_driver -solver 3 -h1 -coord > solvers.out.7 mpirun -np 4 ./ams_driver -solver 5 -tol 1e-4 > solvers.out.8 mpirun -np 4 ./ams_driver -solver 5 -tol 1e-4 -coord > solvers.out.9 mpirun -np 4 ./ams_driver -solver 5 -tol 1e-4 -h1 > solvers.out.10 mpirun -np 4 ./ams_driver -solver 5 -tol 1e-4 -h1 -coord > solvers.out.11 mpirun -np 4 ./ams_driver -solver 3 -type 13 -amgrlx 6 -agg 1 -itype 6 -pmax 4 -tol 0 -zc -maxit 18 -rr 4 > solvers.out.12 hypre-2.33.0/src/test/TEST_ams/solvers.saved000066400000000000000000000063521477326011500206500ustar00rootroot00000000000000# Output file: solvers.out.0 Cycle 14 7.391327e-05 0.433342 5.504641e-06 Cycle 15 3.204294e-05 0.433521 2.386376e-06 Cycle 16 1.389939e-05 0.433774 1.035148e-06 Cycle 17 6.030663e-06 0.433880 4.491295e-07 Average Convergence Factor = 0.423263 # Output file: solvers.out.1 Cycle 14 7.391327e-05 0.433342 5.504641e-06 Cycle 15 3.204294e-05 0.433521 2.386376e-06 Cycle 16 1.389939e-05 0.433774 1.035148e-06 Cycle 17 6.030663e-06 0.433880 4.491295e-07 Average Convergence Factor = 0.423263 # Output file: solvers.out.2 Cycle 39 3.556885e-05 0.721072 2.648966e-06 Cycle 40 2.564907e-05 0.721110 1.910197e-06 Cycle 41 1.849892e-05 0.721232 1.377694e-06 Cycle 42 1.334116e-05 0.721186 9.935738e-07 Average Convergence Factor = 0.719575 # Output file: solvers.out.3 Cycle 39 3.556885e-05 0.721072 2.648966e-06 Cycle 40 2.564907e-05 0.721110 1.910197e-06 Cycle 41 1.849892e-05 0.721232 1.377694e-06 Cycle 42 1.334116e-05 0.721186 9.935738e-07 Average Convergence Factor = 0.719575 # Output file: solvers.out.4 Iterations = 6 Final Relative Residual Norm = 6.440062e-07 # Output file: solvers.out.5 Iterations = 6 Final Relative Residual Norm = 6.440062e-07 # Output file: solvers.out.6 Iterations = 9 Final Relative Residual Norm = 9.646675e-07 # Output file: solvers.out.7 Iterations = 9 Final Relative Residual Norm = 9.646675e-07 # Output file: solvers.out.12 Iterations = 18 Final Relative Residual Norm = 4.151612e-03 # Output file: solvers.out.8 Eigenvalue lambda 3.02357653918321e+01 Eigenvalue lambda 3.03135374700838e+01 Eigenvalue lambda 3.85013899426301e+01 Eigenvalue lambda 5.14395940109376e+01 Eigenvalue lambda 5.15742481830319e+01 Residual 4.25157808820118e-05 Residual 4.19035189015216e-05 Residual 4.81288033055862e-05 Residual 7.10760463267777e-05 Residual 8.91382144508726e-05 17 iterations # Output file: solvers.out.9 Eigenvalue lambda 3.02357653918321e+01 Eigenvalue lambda 3.03135374700838e+01 Eigenvalue lambda 3.85013899426301e+01 Eigenvalue lambda 5.14395940109376e+01 Eigenvalue lambda 5.15742481830319e+01 Residual 4.25157808820118e-05 Residual 4.19035189015216e-05 Residual 4.81288033055862e-05 Residual 7.10760463267777e-05 Residual 8.91382144508726e-05 17 iterations # Output file: solvers.out.10 Eigenvalue lambda 3.02357653920285e+01 Eigenvalue lambda 3.03135374703450e+01 Eigenvalue lambda 3.85013899427157e+01 Eigenvalue lambda 5.14395940117001e+01 Eigenvalue lambda 5.15742481833368e+01 Residual 8.05720052532315e-05 Residual 9.77366136479502e-05 Residual 5.87715311287244e-05 Residual 1.00991497909373e-04 Residual 9.93611224218808e-05 23 iterations # Output file: solvers.out.11 Eigenvalue lambda 3.02357653920285e+01 Eigenvalue lambda 3.03135374703450e+01 Eigenvalue lambda 3.85013899427157e+01 Eigenvalue lambda 5.14395940117001e+01 Eigenvalue lambda 5.15742481833368e+01 Residual 8.05720052532315e-05 Residual 9.77366136479502e-05 Residual 5.87715311287244e-05 Residual 1.00991497909373e-04 Residual 9.93611224218808e-05 23 iterations hypre-2.33.0/src/test/TEST_ams/solvers.saved.lassen000066400000000000000000000063601477326011500221330ustar00rootroot00000000000000# Output file: solvers.out.0 Cycle 58 2.180961e-05 0.801052 1.624256e-06 Cycle 59 1.747620e-05 0.801308 1.301528e-06 Cycle 60 1.400242e-05 0.801228 1.042821e-06 Cycle 61 1.121910e-05 0.801226 8.355349e-07 Average Convergence Factor = 0.794987 # Output file: solvers.out.1 Cycle 58 2.180961e-05 0.801052 1.624256e-06 Cycle 59 1.747620e-05 0.801308 1.301528e-06 Cycle 60 1.400242e-05 0.801228 1.042821e-06 Cycle 61 1.121910e-05 0.801226 8.355349e-07 Average Convergence Factor = 0.794987 # Output file: solvers.out.2 Cycle 97 1.784019e-05 0.873467 1.328636e-06 Cycle 98 1.557979e-05 0.873297 1.160294e-06 Cycle 99 1.360847e-05 0.873470 1.013482e-06 Cycle 100 1.188950e-05 0.873684 8.854624e-07 Average Convergence Factor = 0.869905 # Output file: solvers.out.3 Cycle 97 1.784019e-05 0.873467 1.328636e-06 Cycle 98 1.557979e-05 0.873297 1.160294e-06 Cycle 99 1.360847e-05 0.873470 1.013482e-06 Cycle 100 1.188950e-05 0.873684 8.854624e-07 Average Convergence Factor = 0.869905 # Output file: solvers.out.4 Iterations = 13 Final Relative Residual Norm = 4.939034e-07 # Output file: solvers.out.5 Iterations = 13 Final Relative Residual Norm = 4.939034e-07 # Output file: solvers.out.6 Iterations = 16 Final Relative Residual Norm = 6.410653e-07 # Output file: solvers.out.7 Iterations = 16 Final Relative Residual Norm = 6.410653e-07 # Output file: solvers.out.12 Iterations = 18 Final Relative Residual Norm = 2.433983e+01 # Output file: solvers.out.8 Eigenvalue lambda 3.02357653920079e+01 Eigenvalue lambda 3.03135374702236e+01 Eigenvalue lambda 3.85013899430559e+01 Eigenvalue lambda 5.14395940112081e+01 Eigenvalue lambda 5.15742481823856e+01 Residual 7.45352588578718e-05 Residual 7.43880032620007e-05 Residual 1.26594022215394e-04 Residual 8.99904406834779e-05 Residual 9.30548921427010e-05 24 iterations # Output file: solvers.out.9 Eigenvalue lambda 3.02357653920079e+01 Eigenvalue lambda 3.03135374702236e+01 Eigenvalue lambda 3.85013899430559e+01 Eigenvalue lambda 5.14395940112081e+01 Eigenvalue lambda 5.15742481823856e+01 Residual 7.45352588578718e-05 Residual 7.43880032620007e-05 Residual 1.26594022215394e-04 Residual 8.99904406834779e-05 Residual 9.30548921427010e-05 24 iterations # Output file: solvers.out.10 Eigenvalue lambda 3.02357653967707e+01 Eigenvalue lambda 3.03135374800728e+01 Eigenvalue lambda 3.85013899397799e+01 Eigenvalue lambda 5.14395940101665e+01 Eigenvalue lambda 5.15742480845151e+01 Residual 8.77562666069003e-05 Residual 1.06541449357735e-04 Residual 8.94425865221178e-05 Residual 1.08234881163452e-04 Residual 1.17205182508686e-04 35 iterations # Output file: solvers.out.11 Eigenvalue lambda 3.02357653967707e+01 Eigenvalue lambda 3.03135374800728e+01 Eigenvalue lambda 3.85013899397799e+01 Eigenvalue lambda 5.14395940101665e+01 Eigenvalue lambda 5.15742480845151e+01 Residual 8.77562666069003e-05 Residual 1.06541449357735e-04 Residual 8.94425865221178e-05 Residual 1.08234881163452e-04 Residual 1.17205182508686e-04 35 iterations hypre-2.33.0/src/test/TEST_ams/solvers.saved.lassen_cpu000066400000000000000000000063521477326011500230030ustar00rootroot00000000000000# Output file: solvers.out.0 Cycle 14 7.391091e-05 0.433321 5.504465e-06 Cycle 15 3.204423e-05 0.433552 2.386472e-06 Cycle 16 1.390144e-05 0.433820 1.035300e-06 Cycle 17 6.033147e-06 0.433994 4.493145e-07 Average Convergence Factor = 0.423273 # Output file: solvers.out.1 Cycle 14 7.391091e-05 0.433321 5.504465e-06 Cycle 15 3.204423e-05 0.433552 2.386472e-06 Cycle 16 1.390144e-05 0.433820 1.035300e-06 Cycle 17 6.033147e-06 0.433994 4.493145e-07 Average Convergence Factor = 0.423273 # Output file: solvers.out.2 Cycle 39 3.557147e-05 0.721153 2.649161e-06 Cycle 40 2.564968e-05 0.721074 1.910242e-06 Cycle 41 1.849492e-05 0.721059 1.377397e-06 Cycle 42 1.334509e-05 0.721554 9.938662e-07 Average Convergence Factor = 0.719580 # Output file: solvers.out.3 Cycle 39 3.557147e-05 0.721153 2.649161e-06 Cycle 40 2.564968e-05 0.721074 1.910242e-06 Cycle 41 1.849492e-05 0.721059 1.377397e-06 Cycle 42 1.334509e-05 0.721554 9.938662e-07 Average Convergence Factor = 0.719580 # Output file: solvers.out.4 Iterations = 6 Final Relative Residual Norm = 6.440241e-07 # Output file: solvers.out.5 Iterations = 6 Final Relative Residual Norm = 6.440241e-07 # Output file: solvers.out.6 Iterations = 9 Final Relative Residual Norm = 9.646766e-07 # Output file: solvers.out.7 Iterations = 9 Final Relative Residual Norm = 9.646766e-07 # Output file: solvers.out.12 Iterations = 18 Final Relative Residual Norm = 4.179935e-03 # Output file: solvers.out.8 Eigenvalue lambda 3.02357653918326e+01 Eigenvalue lambda 3.03135374700829e+01 Eigenvalue lambda 3.85013899426297e+01 Eigenvalue lambda 5.14395940109399e+01 Eigenvalue lambda 5.15742481830345e+01 Residual 4.25157808762576e-05 Residual 4.19035188905720e-05 Residual 4.81288032817812e-05 Residual 7.10760463236367e-05 Residual 8.91382143291588e-05 17 iterations # Output file: solvers.out.9 Eigenvalue lambda 3.02357653918326e+01 Eigenvalue lambda 3.03135374700829e+01 Eigenvalue lambda 3.85013899426297e+01 Eigenvalue lambda 5.14395940109399e+01 Eigenvalue lambda 5.15742481830345e+01 Residual 4.25157808762576e-05 Residual 4.19035188905720e-05 Residual 4.81288032817812e-05 Residual 7.10760463236367e-05 Residual 8.91382143291588e-05 17 iterations # Output file: solvers.out.10 Eigenvalue lambda 3.02357653920283e+01 Eigenvalue lambda 3.03135374703454e+01 Eigenvalue lambda 3.85013899427141e+01 Eigenvalue lambda 5.14395940116978e+01 Eigenvalue lambda 5.15742481833472e+01 Residual 8.05720052502644e-05 Residual 9.77366136562239e-05 Residual 5.87715311134351e-05 Residual 1.00991497903153e-04 Residual 9.93611223972704e-05 23 iterations # Output file: solvers.out.11 Eigenvalue lambda 3.02357653920283e+01 Eigenvalue lambda 3.03135374703454e+01 Eigenvalue lambda 3.85013899427141e+01 Eigenvalue lambda 5.14395940116978e+01 Eigenvalue lambda 5.15742481833472e+01 Residual 8.05720052502644e-05 Residual 9.77366136562239e-05 Residual 5.87715311134351e-05 Residual 1.00991497903153e-04 Residual 9.93611223972704e-05 23 iterations hypre-2.33.0/src/test/TEST_ams/solvers.saved.tioga000066400000000000000000000063661477326011500217570ustar00rootroot00000000000000# Output file: solvers.out.0 Cycle 52 2.432799e-05 0.789655 1.811810e-06 Cycle 53 1.921940e-05 0.790012 1.431352e-06 Cycle 54 1.518539e-05 0.790107 1.130921e-06 Cycle 55 1.200092e-05 0.790294 8.937605e-07 Average Convergence Factor = 0.776287 # Output file: solvers.out.1 Cycle 52 2.432799e-05 0.789655 1.811810e-06 Cycle 53 1.921940e-05 0.790012 1.431352e-06 Cycle 54 1.518539e-05 0.790107 1.130921e-06 Cycle 55 1.200092e-05 0.790294 8.937605e-07 Average Convergence Factor = 0.776287 # Output file: solvers.out.2 Cycle 102 1.884886e-05 0.881924 1.403756e-06 Cycle 103 1.662181e-05 0.881847 1.237898e-06 Cycle 104 1.465878e-05 0.881900 1.091702e-06 Cycle 105 1.292522e-05 0.881739 9.625970e-07 Average Convergence Factor = 0.876394 # Output file: solvers.out.3 Cycle 102 1.884886e-05 0.881924 1.403756e-06 Cycle 103 1.662181e-05 0.881847 1.237898e-06 Cycle 104 1.465878e-05 0.881900 1.091702e-06 Cycle 105 1.292522e-05 0.881739 9.625970e-07 Average Convergence Factor = 0.876394 # Output file: solvers.out.4 Iterations = 13 Final Relative Residual Norm = 4.186509e-07 # Output file: solvers.out.5 Iterations = 13 Final Relative Residual Norm = 4.186509e-07 # Output file: solvers.out.6 Iterations = 16 Final Relative Residual Norm = 9.720506e-07 # Output file: solvers.out.7 Iterations = 16 Final Relative Residual Norm = 9.720506e-07 # Output file: solvers.out.12 Iterations = 18 Final Relative Residual Norm = 1.952380e+01 # Output file: solvers.out.8 Eigenvalue lambda 3.02357653921852e+01 Eigenvalue lambda 3.03135374702992e+01 Eigenvalue lambda 3.85013899428591e+01 Eigenvalue lambda 5.14395940113556e+01 Eigenvalue lambda 5.15742481828119e+01 Residual 1.12566352525743e-04 Residual 1.02377055805912e-04 Residual 9.77540709672278e-05 Residual 1.08807691685354e-04 Residual 1.16451618925874e-04 24 iterations # Output file: solvers.out.9 Eigenvalue lambda 3.02357653921852e+01 Eigenvalue lambda 3.03135374702992e+01 Eigenvalue lambda 3.85013899428591e+01 Eigenvalue lambda 5.14395940113556e+01 Eigenvalue lambda 5.15742481828119e+01 Residual 1.12566352525743e-04 Residual 1.02377055805912e-04 Residual 9.77540709672278e-05 Residual 1.08807691685354e-04 Residual 1.16451618925874e-04 24 iterations # Output file: solvers.out.10 Eigenvalue lambda 3.02357653918967e+01 Eigenvalue lambda 3.03135374700399e+01 Eigenvalue lambda 3.85013899425749e+01 Eigenvalue lambda 5.14395940102517e+01 Eigenvalue lambda 5.15742481828689e+01 Residual 9.46960846127793e-05 Residual 7.49350518395312e-05 Residual 9.49105044744681e-05 Residual 1.18284840227265e-04 Residual 1.04914545371963e-04 31 iterations # Output file: solvers.out.11 Eigenvalue lambda 3.02357653918967e+01 Eigenvalue lambda 3.03135374700399e+01 Eigenvalue lambda 3.85013899425749e+01 Eigenvalue lambda 5.14395940102517e+01 Eigenvalue lambda 5.15742481828689e+01 Residual 9.46960846127793e-05 Residual 7.49350518395312e-05 Residual 9.49105044744681e-05 Residual 1.18284840227265e-04 Residual 1.04914545371963e-04 31 iterations hypre-2.33.0/src/test/TEST_ams/solvers.sh000077500000000000000000000046041477326011500201610ustar00rootroot00000000000000#!/bin/bash # Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) TNAME=`basename $0 .sh` RTOL=$1 ATOL=$2 #============================================================================= # The outputs below should differ only in timings. #============================================================================= diff -bI"time" solvers.out.0 solvers.out.1 >&2 diff -bI"time" solvers.out.2 solvers.out.3 >&2 diff -bI"time" solvers.out.4 solvers.out.5 >&2 diff -bI"time" solvers.out.6 solvers.out.7 >&2 diff -bI"time" solvers.out.8 solvers.out.9 >&2 diff -bI"time" solvers.out.10 solvers.out.11 >&2 #============================================================================= # compare with baseline case #============================================================================= FILES="\ ${TNAME}.out.0\ ${TNAME}.out.1\ ${TNAME}.out.2\ ${TNAME}.out.3\ " for i in $FILES do echo "# Output file: $i" tail -17 $i | head -8 done > ${TNAME}.out.a # Make sure that the output file is reasonable RUNCOUNT=`echo $FILES | wc -w` OUTCOUNT=`grep "Convergence" ${TNAME}.out.a | wc -l` if [ "$OUTCOUNT" != "$RUNCOUNT" ]; then echo "Incorrect number of runs in ${TNAME}.out" >&2 fi FILES="\ ${TNAME}.out.4\ ${TNAME}.out.5\ ${TNAME}.out.6\ ${TNAME}.out.7\ ${TNAME}.out.12\ " for i in $FILES do echo "# Output file: $i" tail -4 $i done > ${TNAME}.out.b # Make sure that the output file is reasonable RUNCOUNT=`echo $FILES | wc -w` OUTCOUNT=`grep "Iterations" ${TNAME}.out.b | wc -l` if [ "$OUTCOUNT" != "$RUNCOUNT" ]; then echo "Incorrect number of runs in ${TNAME}.out" >&2 fi FILES="\ ${TNAME}.out.8\ ${TNAME}.out.9\ ${TNAME}.out.10\ ${TNAME}.out.11\ " for i in $FILES do echo "# Output file: $i" tail -22 $i | head -13 done > ${TNAME}.out.c # Make sure that the output file is reasonable RUNCOUNT=`echo $FILES | wc -w` OUTCOUNT=`grep "iterations" ${TNAME}.out.c | wc -l` if [ "$OUTCOUNT" != "$RUNCOUNT" ]; then echo "Incorrect number of runs in ${TNAME}.out" >&2 fi # put all of the output files together cat ${TNAME}.out.[a-z] > ${TNAME}.out #============================================================================= # remove temporary files #============================================================================= # rm -f ${TNAME}.testdata* hypre-2.33.0/src/test/TEST_bench/000077500000000000000000000000001477326011500164205ustar00rootroot00000000000000hypre-2.33.0/src/test/TEST_bench/benchmark_ij.jobs000077500000000000000000000125651477326011500217270ustar00rootroot00000000000000#!/bin/bash # Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) #============================================================================= # ij: BoomerAMG GPU benchmarks #============================================================================= # RAP 1 mpirun -np 4 ./ij -n 256 256 128 -P 2 2 1 -pmis -keepT 1 -rlx 18 -exec_device -rap 1 -mod_rap2 1 -mm_vendor 0 -interptype 3 -solver 1 -benchmark 1 \ > benchmark_ij.out.1 mpirun -np 3 ./ij -n 128 128 384 -P 1 1 3 -pmis -keepT 1 -rlx 7 -w 0.85 -exec_device -rap 1 -mod_rap2 1 -mm_vendor 0 -interptype 3 -solver 1 -benchmark 1 \ >> benchmark_ij.out.2 mpirun -np 4 ./ij -n 4096 4096 1 -P 2 2 1 -9pt -pmis -keepT 1 -rlx 18 -exec_device -rap 1 -mod_rap2 1 -mm_vendor 0 -interptype 3 -solver 1 -benchmark 1 \ >> benchmark_ij.out.3 mpirun -np 4 ./ij -n 256 256 128 -P 2 2 1 -pmis -keepT 1 -rlx 18 -exec_device -rap 1 -mod_rap2 1 -mm_vendor 0 -interptype 14 -solver 1 -benchmark 1 \ >> benchmark_ij.out.4 mpirun -np 4 ./ij -n 256 256 128 -P 2 2 1 -27pt -pmis -keepT 1 -rlx 18 -exec_device -rap 1 -mod_rap2 1 -mm_vendor 0 -interptype 6 -solver 1 -benchmark 1 \ >> benchmark_ij.out.5 mpirun -np 4 ./ij -n 4096 4096 1 -P 2 2 1 -9pt -pmis -keepT 1 -rlx 18 -exec_device -rap 1 -mod_rap2 1 -mm_vendor 0 -interptype 15 -solver 1 -benchmark 1 \ >> benchmark_ij.out.6 mpirun -np 4 ./ij -n 4096 4096 1 -P 2 2 1 -9pt -pmis -keepT 1 -rlx 18 -exec_device -rap 1 -mod_rap2 1 -mm_vendor 0 -interptype 18 -solver 1 -benchmark 1 \ >> benchmark_ij.out.7 # RAP 0 mpirun -np 4 ./ij -n 256 256 128 -P 2 2 1 -pmis -keepT 1 -rlx 18 -exec_device -rap 0 -mod_rap2 1 -mm_vendor 0 -interptype 3 -solver 1 -benchmark 1 \ > benchmark_ij.out.8 mpirun -np 3 ./ij -n 128 128 384 -P 1 1 3 -pmis -keepT 1 -rlx 7 -w 0.85 -exec_device -rap 0 -mod_rap2 1 -mm_vendor 0 -interptype 3 -solver 1 -benchmark 1 \ >> benchmark_ij.out.9 mpirun -np 4 ./ij -n 4096 4096 1 -P 2 2 1 -9pt -pmis -keepT 1 -rlx 18 -exec_device -rap 0 -mod_rap2 1 -mm_vendor 0 -interptype 3 -solver 1 -benchmark 1 \ >> benchmark_ij.out.10 mpirun -np 4 ./ij -n 256 256 128 -P 2 2 1 -pmis -keepT 1 -rlx 18 -exec_device -rap 0 -mod_rap2 1 -mm_vendor 0 -interptype 14 -solver 1 -benchmark 1 \ >> benchmark_ij.out.11 mpirun -np 4 ./ij -n 256 256 128 -P 2 2 1 -27pt -pmis -keepT 1 -rlx 18 -exec_device -rap 0 -mod_rap2 1 -mm_vendor 0 -interptype 6 -solver 1 -benchmark 1 \ >> benchmark_ij.out.12 mpirun -np 4 ./ij -n 4096 4096 1 -P 2 2 1 -9pt -pmis -keepT 1 -rlx 18 -exec_device -rap 0 -mod_rap2 1 -mm_vendor 0 -interptype 15 -solver 1 -benchmark 1 \ >> benchmark_ij.out.13 mpirun -np 1 ./ij -n 256 256 256 -P 1 1 1 -pmis -keepT 1 -rlx 18 -exec_device -rap 1 -mod_rap2 1 -mm_vendor 0 -interptype 6 -solver 1 -benchmark 1 \ >> benchmark_ij.out.14 mpirun -np 1 ./ij -n 256 256 256 -P 1 1 1 -pmis -keepT 1 -rlx 18 -exec_device -rap 0 -mod_rap2 1 -mm_vendor 0 -interptype 14 -solver 1 -benchmark 1 \ >> benchmark_ij.out.15 mpirun -np 1 ./ij -n 256 256 256 -P 1 1 1 -pmis -keepT 1 -rlx 18 -exec_device -rap 0 -mod_rap2 1 -mm_vendor 0 -interptype 18 -solver 1 -benchmark 1 \ >> benchmark_ij.out.16 mpirun -np 4 ./ij -n 256 256 128 -P 2 2 1 -27pt -pmis -keepT 1 -rlx 7 -w 0.85 -exec_device -mm_vendor 0 -agg_nl 1 -agg_interp 5 -solver 1 -benchmark 1 \ >> benchmark_ij.out.17 mpirun -np 4 ./ij -n 256 256 128 -P 2 2 1 -pmis -keepT 1 -rlx 7 -w 0.85 -exec_device -mm_vendor 0 -agg_nl 1 -agg_interp 7 -agg_P12_mx 4 -solver 1 -benchmark 1 \ >> benchmark_ij.out.18 mpirun -np 4 ./ij -n 128 128 128 -P 2 2 1 -pmis -keepT 1 -rlx 7 -w 0.5 -exec_device -mm_vendor 0 -agg_nl 1 -agg_interp 5 -agg_Pmx 4 -interptype 18 -solver 1 -sysL 3 -nf 3 -benchmark 1 \ >> benchmark_ij.out.19 mpirun -np 2 ./ij -n 200 128 128 -P 2 1 1 -pmis -keepT 1 -rlx 7 -w 0.7 -exec_device -mm_vendor 0 -agg_nl 1 -agg_interp 5 -agg_Pmx 4 -interptype 18 -solver 1 -vardifconv -eps 1 -benchmark 1 \ >> benchmark_ij.out.20 mpirun -np 4 ./ij -n 200 200 200 -P 2 2 1 -pmis -keepT 1 -rlx 18 -ns 2 -exec_device -mm_vendor 0 -agg_nl 3 -agg_interp 7 -agg_P12_mx 6 -interptype 6 -solver 1 -benchmark 1 \ >> benchmark_ij.out.21 mpirun -np 4 ./ij -n 256 256 128 -P 2 2 1 -rlx 16 -cheby_scale 1 -cheby_eig_est 10 -exec_device -solver 1 -benchmark 1 \ >> benchmark_ij.out.22 mpirun -np 4 ./ij -n 256 256 128 -P 2 2 1 -rlx 16 -cheby_scale 0 -cheby_eig_est 10 -exec_device -solver 1 -benchmark 1 \ >> benchmark_ij.out.23 mpirun -np 4 ./ij -n 256 256 128 -P 2 2 1 -rlx 16 -cheby_scale 1 -cheby_eig_est 0 -exec_device -solver 1 -benchmark 1 \ >> benchmark_ij.out.24 mpirun -np 4 ./ij -n 256 256 128 -P 2 2 1 -rlx 16 -cheby_scale 0 -cheby_eig_est 0 -exec_device -solver 1 -benchmark 1 \ >> benchmark_ij.out.25 mpirun -np 4 ./ij -n 248 248 248 -P 2 2 1 -27pt -pmis -keepT 1 -rlx 18 -ns 2 -exec_device -rap 1 -mod_rap2 1 -mm_vendor 0 -agg_nl 2 -agg_interp 8 -interptype 6 -mxrs 0.9 -Pmx 8 -solver 1 -benchmark 1 \ >> benchmark_ij.out.26 mpirun -np 4 ./ij -n 256 256 256 -P 1 2 2 -27pt -pmis -keepT 1 -rlx 18 -ns 2 -exec_device -rap 0 -mod_rap2 1 -mm_vendor 0 -agg_nl 1 -agg_interp 9 -interptype 6 -mxrs 0.9 -Pmx 8 -solver 1 -benchmark 1 \ >> benchmark_ij.out.27 hypre-2.33.0/src/test/TEST_bench/benchmark_ij.perf.saved.lassen000066400000000000000000000064461477326011500243110ustar00rootroot00000000000000# Output file: benchmark_ij.out.1 PCG Setup wall clock time = 0.160712 seconds PCG Solve wall clock time = 0.411117 seconds # Output file: benchmark_ij.out.2 PCG Setup wall clock time = 0.153834 seconds PCG Solve wall clock time = 0.333679 seconds # Output file: benchmark_ij.out.3 PCG Setup wall clock time = 0.190193 seconds PCG Solve wall clock time = 0.867654 seconds # Output file: benchmark_ij.out.4 PCG Setup wall clock time = 0.219071 seconds PCG Solve wall clock time = 0.155456 seconds # Output file: benchmark_ij.out.5 PCG Setup wall clock time = 0.251006 seconds PCG Solve wall clock time = 0.160191 seconds # Output file: benchmark_ij.out.6 PCG Setup wall clock time = 0.187103 seconds PCG Solve wall clock time = 0.823428 seconds # Output file: benchmark_ij.out.7 PCG Setup wall clock time = 0.270900 seconds PCG Solve wall clock time = 0.199480 seconds # Output file: benchmark_ij.out.8 PCG Setup wall clock time = 0.147579 seconds PCG Solve wall clock time = 0.400133 seconds # Output file: benchmark_ij.out.9 PCG Setup wall clock time = 0.139928 seconds PCG Solve wall clock time = 0.339869 seconds # Output file: benchmark_ij.out.10 PCG Setup wall clock time = 0.175378 seconds PCG Solve wall clock time = 0.877038 seconds # Output file: benchmark_ij.out.11 PCG Setup wall clock time = 0.205073 seconds PCG Solve wall clock time = 0.154485 seconds # Output file: benchmark_ij.out.12 PCG Setup wall clock time = 0.236875 seconds PCG Solve wall clock time = 0.155606 seconds # Output file: benchmark_ij.out.13 PCG Setup wall clock time = 0.169760 seconds PCG Solve wall clock time = 0.823498 seconds # Output file: benchmark_ij.out.14 PCG Setup wall clock time = 0.705901 seconds PCG Solve wall clock time = 0.580016 seconds # Output file: benchmark_ij.out.15 PCG Setup wall clock time = 0.671039 seconds PCG Solve wall clock time = 0.647755 seconds # Output file: benchmark_ij.out.16 PCG Setup wall clock time = 0.693543 seconds PCG Solve wall clock time = 0.607744 seconds # Output file: benchmark_ij.out.17 PCG Setup wall clock time = 0.263890 seconds PCG Solve wall clock time = 0.160268 seconds # Output file: benchmark_ij.out.18 PCG Setup wall clock time = 0.223569 seconds PCG Solve wall clock time = 0.125239 seconds # Output file: benchmark_ij.out.19 PCG Setup wall clock time = 0.264460 seconds PCG Solve wall clock time = 0.315377 seconds # Output file: benchmark_ij.out.20 PCG Setup wall clock time = 0.175446 seconds PCG Solve wall clock time = 0.179951 seconds # Output file: benchmark_ij.out.21 PCG Setup wall clock time = 0.233091 seconds PCG Solve wall clock time = 0.208051 seconds # Output file: benchmark_ij.out.22 PCG Setup wall clock time = 0.242838 seconds PCG Solve wall clock time = 0.194378 seconds # Output file: benchmark_ij.out.23 PCG Setup wall clock time = 0.238777 seconds PCG Solve wall clock time = 0.178903 seconds # Output file: benchmark_ij.out.24 PCG Setup wall clock time = 0.211336 seconds PCG Solve wall clock time = 0.193785 seconds # Output file: benchmark_ij.out.25 PCG Setup wall clock time = 0.211109 seconds PCG Solve wall clock time = 0.202104 seconds # Output file: benchmark_ij.out.26 PCG Setup wall clock time = 0.256645 seconds PCG Solve wall clock time = 0.618981 seconds # Output file: benchmark_ij.out.27 PCG Setup wall clock time = 0.282368 seconds PCG Solve wall clock time = 0.411413 seconds hypre-2.33.0/src/test/TEST_bench/benchmark_ij.perf.saved.tioga000066400000000000000000000064461477326011500241270ustar00rootroot00000000000000# Output file: benchmark_ij.out.1 PCG Setup wall clock time = 0.170772 seconds PCG Solve wall clock time = 0.335337 seconds # Output file: benchmark_ij.out.2 PCG Setup wall clock time = 0.163119 seconds PCG Solve wall clock time = 0.271529 seconds # Output file: benchmark_ij.out.3 PCG Setup wall clock time = 0.201941 seconds PCG Solve wall clock time = 0.672232 seconds # Output file: benchmark_ij.out.4 PCG Setup wall clock time = 0.226705 seconds PCG Solve wall clock time = 0.152017 seconds # Output file: benchmark_ij.out.5 PCG Setup wall clock time = 0.254766 seconds PCG Solve wall clock time = 0.137966 seconds # Output file: benchmark_ij.out.6 PCG Setup wall clock time = 0.204024 seconds PCG Solve wall clock time = 0.613917 seconds # Output file: benchmark_ij.out.7 PCG Setup wall clock time = 0.282569 seconds PCG Solve wall clock time = 0.158339 seconds # Output file: benchmark_ij.out.8 PCG Setup wall clock time = 0.159975 seconds PCG Solve wall clock time = 0.334356 seconds # Output file: benchmark_ij.out.9 PCG Setup wall clock time = 0.151504 seconds PCG Solve wall clock time = 0.272460 seconds # Output file: benchmark_ij.out.10 PCG Setup wall clock time = 0.190785 seconds PCG Solve wall clock time = 0.639297 seconds # Output file: benchmark_ij.out.11 PCG Setup wall clock time = 0.217895 seconds PCG Solve wall clock time = 0.145796 seconds # Output file: benchmark_ij.out.12 PCG Setup wall clock time = 0.245100 seconds PCG Solve wall clock time = 0.132285 seconds # Output file: benchmark_ij.out.13 PCG Setup wall clock time = 0.188967 seconds PCG Solve wall clock time = 0.596166 seconds # Output file: benchmark_ij.out.14 PCG Setup wall clock time = 0.953187 seconds PCG Solve wall clock time = 0.680926 seconds # Output file: benchmark_ij.out.15 PCG Setup wall clock time = 0.868636 seconds PCG Solve wall clock time = 0.733326 seconds # Output file: benchmark_ij.out.16 PCG Setup wall clock time = 0.882904 seconds PCG Solve wall clock time = 0.647630 seconds # Output file: benchmark_ij.out.17 PCG Setup wall clock time = 0.243402 seconds PCG Solve wall clock time = 0.143477 seconds # Output file: benchmark_ij.out.18 PCG Setup wall clock time = 0.231762 seconds PCG Solve wall clock time = 0.111623 seconds # Output file: benchmark_ij.out.19 PCG Setup wall clock time = 0.276950 seconds PCG Solve wall clock time = 0.324065 seconds # Output file: benchmark_ij.out.20 PCG Setup wall clock time = 0.185776 seconds PCG Solve wall clock time = 0.177456 seconds # Output file: benchmark_ij.out.21 PCG Setup wall clock time = 0.240707 seconds PCG Solve wall clock time = 0.189251 seconds # Output file: benchmark_ij.out.22 PCG Setup wall clock time = 0.291317 seconds PCG Solve wall clock time = 0.205310 seconds # Output file: benchmark_ij.out.23 PCG Setup wall clock time = 0.288176 seconds PCG Solve wall clock time = 0.199249 seconds # Output file: benchmark_ij.out.24 PCG Setup wall clock time = 0.258924 seconds PCG Solve wall clock time = 0.228139 seconds # Output file: benchmark_ij.out.25 PCG Setup wall clock time = 0.257346 seconds PCG Solve wall clock time = 0.233506 seconds # Output file: benchmark_ij.out.26 PCG Setup wall clock time = 0.265667 seconds PCG Solve wall clock time = 0.438971 seconds # Output file: benchmark_ij.out.27 PCG Setup wall clock time = 0.287397 seconds PCG Solve wall clock time = 0.319967 seconds hypre-2.33.0/src/test/TEST_bench/benchmark_ij.saved.lassen000066400000000000000000000050271477326011500233500ustar00rootroot00000000000000# Output file: benchmark_ij.out.1 Iterations = 55 Final Relative Residual Norm = 7.087579e-09 # Output file: benchmark_ij.out.2 Iterations = 46 Final Relative Residual Norm = 9.524807e-09 # Output file: benchmark_ij.out.3 Iterations = 92 Final Relative Residual Norm = 8.647764e-09 # Output file: benchmark_ij.out.4 Iterations = 21 Final Relative Residual Norm = 4.137778e-09 # Output file: benchmark_ij.out.5 Iterations = 18 Final Relative Residual Norm = 6.100830e-09 # Output file: benchmark_ij.out.6 Iterations = 87 Final Relative Residual Norm = 8.492893e-09 # Output file: benchmark_ij.out.7 Iterations = 20 Final Relative Residual Norm = 6.894372e-09 # Output file: benchmark_ij.out.8 Iterations = 54 Final Relative Residual Norm = 6.808957e-09 # Output file: benchmark_ij.out.9 Iterations = 47 Final Relative Residual Norm = 7.886349e-09 # Output file: benchmark_ij.out.10 Iterations = 93 Final Relative Residual Norm = 8.244493e-09 # Output file: benchmark_ij.out.11 Iterations = 21 Final Relative Residual Norm = 4.060704e-09 # Output file: benchmark_ij.out.12 Iterations = 18 Final Relative Residual Norm = 6.100830e-09 # Output file: benchmark_ij.out.13 Iterations = 87 Final Relative Residual Norm = 8.492862e-09 # Output file: benchmark_ij.out.14 Iterations = 20 Final Relative Residual Norm = 7.903625e-09 # Output file: benchmark_ij.out.15 Iterations = 22 Final Relative Residual Norm = 5.658262e-09 # Output file: benchmark_ij.out.16 Iterations = 21 Final Relative Residual Norm = 4.524887e-09 # Output file: benchmark_ij.out.17 Iterations = 20 Final Relative Residual Norm = 3.328281e-09 # Output file: benchmark_ij.out.18 Iterations = 20 Final Relative Residual Norm = 4.132101e-09 # Output file: benchmark_ij.out.19 Iterations = 43 Final Relative Residual Norm = 7.821010e-09 # Output file: benchmark_ij.out.20 Iterations = 37 Final Relative Residual Norm = 8.751003e-09 # Output file: benchmark_ij.out.21 Iterations = 26 Final Relative Residual Norm = 9.541467e-09 # Output file: benchmark_ij.out.22 Iterations = 13 Final Relative Residual Norm = 1.759314e-09 # Output file: benchmark_ij.out.23 Iterations = 13 Final Relative Residual Norm = 5.903110e-09 # Output file: benchmark_ij.out.24 Iterations = 13 Final Relative Residual Norm = 9.939673e-09 # Output file: benchmark_ij.out.25 Iterations = 15 Final Relative Residual Norm = 4.124880e-09 # Output file: benchmark_ij.out.26 Iterations = 37 Final Relative Residual Norm = 7.069482e-09 # Output file: benchmark_ij.out.27 Iterations = 22 Final Relative Residual Norm = 9.619150e-09 hypre-2.33.0/src/test/TEST_bench/benchmark_ij.saved.tioga000066400000000000000000000050261477326011500231650ustar00rootroot00000000000000# Output file: benchmark_ij.out.1 Iterations = 55 Final Relative Residual Norm = 9.274314e-09 # Output file: benchmark_ij.out.2 Iterations = 46 Final Relative Residual Norm = 9.988931e-09 # Output file: benchmark_ij.out.3 Iterations = 98 Final Relative Residual Norm = 7.887687e-09 # Output file: benchmark_ij.out.4 Iterations = 21 Final Relative Residual Norm = 3.469813e-09 # Output file: benchmark_ij.out.5 Iterations = 18 Final Relative Residual Norm = 4.722489e-09 # Output file: benchmark_ij.out.6 Iterations = 87 Final Relative Residual Norm = 7.730705e-09 # Output file: benchmark_ij.out.7 Iterations = 20 Final Relative Residual Norm = 4.901688e-09 # Output file: benchmark_ij.out.8 Iterations = 55 Final Relative Residual Norm = 8.477809e-09 # Output file: benchmark_ij.out.9 Iterations = 46 Final Relative Residual Norm = 9.985837e-09 # Output file: benchmark_ij.out.10 Iterations = 93 Final Relative Residual Norm = 8.530145e-09 # Output file: benchmark_ij.out.11 Iterations = 21 Final Relative Residual Norm = 3.234870e-09 # Output file: benchmark_ij.out.12 Iterations = 18 Final Relative Residual Norm = 4.722489e-09 # Output file: benchmark_ij.out.13 Iterations = 87 Final Relative Residual Norm = 7.730127e-09 # Output file: benchmark_ij.out.14 Iterations = 21 Final Relative Residual Norm = 3.509276e-09 # Output file: benchmark_ij.out.15 Iterations = 22 Final Relative Residual Norm = 5.410863e-09 # Output file: benchmark_ij.out.16 Iterations = 20 Final Relative Residual Norm = 9.649695e-09 # Output file: benchmark_ij.out.17 Iterations = 20 Final Relative Residual Norm = 3.529822e-09 # Output file: benchmark_ij.out.18 Iterations = 20 Final Relative Residual Norm = 3.320123e-09 # Output file: benchmark_ij.out.19 Iterations = 43 Final Relative Residual Norm = 7.541043e-09 # Output file: benchmark_ij.out.20 Iterations = 38 Final Relative Residual Norm = 4.440293e-09 # Output file: benchmark_ij.out.21 Iterations = 27 Final Relative Residual Norm = 4.476621e-09 # Output file: benchmark_ij.out.22 Iterations = 13 Final Relative Residual Norm = 1.810780e-09 # Output file: benchmark_ij.out.23 Iterations = 13 Final Relative Residual Norm = 6.103525e-09 # Output file: benchmark_ij.out.24 Iterations = 14 Final Relative Residual Norm = 3.116077e-09 # Output file: benchmark_ij.out.25 Iterations = 15 Final Relative Residual Norm = 5.382858e-09 # Output file: benchmark_ij.out.26 Iterations = 37 Final Relative Residual Norm = 6.305999e-09 # Output file: benchmark_ij.out.27 Iterations = 22 Final Relative Residual Norm = 8.787135e-09 hypre-2.33.0/src/test/TEST_bench/benchmark_ij.sh000077500000000000000000000032611477326011500213750ustar00rootroot00000000000000#!/bin/bash # Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) TNAME=`basename $0 .sh` RTOL=$1 ATOL=$2 #============================================================================= # compare with baseline case #============================================================================= FILES="\ ${TNAME}.out.1\ ${TNAME}.out.2\ ${TNAME}.out.3\ ${TNAME}.out.4\ ${TNAME}.out.5\ ${TNAME}.out.6\ ${TNAME}.out.7\ ${TNAME}.out.8\ ${TNAME}.out.9\ ${TNAME}.out.10\ ${TNAME}.out.11\ ${TNAME}.out.12\ ${TNAME}.out.13\ ${TNAME}.out.14\ ${TNAME}.out.15\ ${TNAME}.out.16\ ${TNAME}.out.17\ ${TNAME}.out.18\ ${TNAME}.out.19\ ${TNAME}.out.20\ ${TNAME}.out.21\ ${TNAME}.out.22\ ${TNAME}.out.23\ ${TNAME}.out.24\ ${TNAME}.out.25\ ${TNAME}.out.26\ ${TNAME}.out.27\ " for i in $FILES do echo "# Output file: $i" grep -A 3 "Complexity" $i tail -3 $i done > ${TNAME}.out for i in $FILES do echo "# Output file: $i" setup_time=$(grep -A 1 "PCG Setup" $i | tail -n 1) echo "PCG Setup"${setup_time} solve_time=$(grep -A 1 "PCG Solve" $i | tail -n 1) echo "PCG Solve"${solve_time} done > ${TNAME}.perf.out # Make sure that the output file is reasonable RUNCOUNT=`echo $FILES | wc -w` OUTCOUNT=`grep "Iterations" ${TNAME}.out | wc -l` if [ "$OUTCOUNT" != "$RUNCOUNT" ]; then echo "Incorrect number of runs in ${TNAME}.out" >&2 fi #============================================================================= # remove temporary files #============================================================================= rm -f ${TNAME}.testdata* hypre-2.33.0/src/test/TEST_bench/benchmark_spgemm.jobs000077500000000000000000000105621477326011500226100ustar00rootroot00000000000000#!/bin/bash # Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) #============================================================================= # ij_mm: SpGEMM GPU benchmarks #============================================================================= # A^2 mpirun -np 1 ./ij_mm -n 128 128 128 -7pt -verify 1 -spgemm_binned 0 -spgemmalg 1 -rep 10 > benchmark_spgemm.out.1 mpirun -np 1 ./ij_mm -n 128 128 128 -27pt -verify 1 -spgemm_binned 0 -spgemmalg 1 -rep 10 > benchmark_spgemm.out.2 mpirun -np 1 ./ij_mm -n 1024 1024 1 -5pt -verify 1 -spgemm_binned 0 -spgemmalg 1 -rep 10 > benchmark_spgemm.out.3 mpirun -np 1 ./ij_mm -n 1024 1024 1 -9pt -verify 1 -spgemm_binned 0 -spgemmalg 1 -rep 10 > benchmark_spgemm.out.4 mpirun -np 1 ./ij_mm -n 128 128 128 -7pt -verify 1 -spgemm_binned 1 -spgemmalg 1 -rep 10 > benchmark_spgemm.out.5 mpirun -np 1 ./ij_mm -n 128 128 128 -27pt -verify 1 -spgemm_binned 1 -spgemmalg 1 -rep 10 > benchmark_spgemm.out.6 mpirun -np 1 ./ij_mm -n 1024 1024 1 -5pt -verify 1 -spgemm_binned 1 -spgemmalg 1 -rep 10 > benchmark_spgemm.out.7 mpirun -np 1 ./ij_mm -n 1024 1024 1 -9pt -verify 1 -spgemm_binned 1 -spgemmalg 1 -rep 10 > benchmark_spgemm.out.8 mpirun -np 1 ./ij_mm -n 128 128 128 -7pt -verify 1 -spgemm_binned 0 -spgemmalg 3 -rep 10 > benchmark_spgemm.out.9 mpirun -np 1 ./ij_mm -n 128 128 128 -27pt -verify 1 -spgemm_binned 0 -spgemmalg 3 -rep 10 > benchmark_spgemm.out.10 mpirun -np 1 ./ij_mm -n 1024 1024 1 -5pt -verify 1 -spgemm_binned 0 -spgemmalg 3 -rep 10 > benchmark_spgemm.out.11 mpirun -np 1 ./ij_mm -n 1024 1024 1 -9pt -verify 1 -spgemm_binned 0 -spgemmalg 3 -rep 10 > benchmark_spgemm.out.12 mpirun -np 1 ./ij_mm -n 128 128 128 -7pt -verify 1 -vendor 1 -rep 10 > benchmark_spgemm.out.13 mpirun -np 1 ./ij_mm -n 80 80 80 -27pt -verify 1 -vendor 1 -rep 10 > benchmark_spgemm.out.14 mpirun -np 1 ./ij_mm -n 1024 1024 1 -5pt -verify 1 -vendor 1 -rep 10 > benchmark_spgemm.out.15 mpirun -np 1 ./ij_mm -n 1024 1024 1 -9pt -verify 1 -vendor 1 -rep 10 > benchmark_spgemm.out.16 # Diag(A) * A mpirun -np 1 ./ij_mm -n 128 128 128 -7pt -verify 1 -spgemm_binned 1 -spgemmalg 1 -job 5 -rep 10 > benchmark_spgemm.out.17 mpirun -np 1 ./ij_mm -n 128 128 128 -27pt -verify 1 -spgemm_binned 1 -spgemmalg 1 -job 5 -rep 10 > benchmark_spgemm.out.18 mpirun -np 1 ./ij_mm -n 1024 1024 1 -5pt -verify 1 -spgemm_binned 1 -spgemmalg 1 -job 5 -rep 10 > benchmark_spgemm.out.19 mpirun -np 1 ./ij_mm -n 1024 1024 1 -9pt -verify 1 -spgemm_binned 1 -spgemmalg 1 -job 5 -rep 10 > benchmark_spgemm.out.20 # A^2 mpirun -np 4 ./ij_mm -n 256 256 128 -P 2 2 1 -7pt -verify 1 -rep 10 > benchmark_spgemm.out.21 mpirun -np 4 ./ij_mm -n 256 256 128 -P 2 2 1 -27pt -verify 1 -rep 10 > benchmark_spgemm.out.22 mpirun -np 4 ./ij_mm -n 2048 2048 1 -P 2 2 1 -5pt -verify 1 -rep 10 > benchmark_spgemm.out.23 mpirun -np 4 ./ij_mm -n 2048 2048 1 -P 2 2 1 -9pt -verify 1 -rep 10 > benchmark_spgemm.out.24 # A^T * A mpirun -np 4 ./ij_mm -n 256 256 128 -P 2 2 1 -7pt -verify 1 -rep 10 -job 2 > benchmark_spgemm.out.25 mpirun -np 4 ./ij_mm -n 256 256 128 -P 2 2 1 -27pt -verify 1 -rep 10 -job 2 > benchmark_spgemm.out.26 mpirun -np 4 ./ij_mm -n 2048 2048 1 -P 2 2 1 -5pt -verify 1 -rep 10 -job 2 > benchmark_spgemm.out.27 mpirun -np 4 ./ij_mm -n 2048 2048 1 -P 2 2 1 -9pt -verify 1 -rep 10 -job 2 > benchmark_spgemm.out.28 # P^T*A*P mpirun -np 4 ./ij_mm -n 256 256 128 -P 2 2 1 -7pt -verify 1 -rep 10 -rap2 0 -job 4 > benchmark_spgemm.out.29 mpirun -np 4 ./ij_mm -n 256 256 128 -P 2 2 1 -27pt -verify 1 -rep 10 -rap2 0 -job 4 > benchmark_spgemm.out.30 mpirun -np 4 ./ij_mm -n 2048 2048 1 -P 2 2 1 -5pt -verify 1 -rep 10 -rap2 0 -job 4 > benchmark_spgemm.out.31 mpirun -np 4 ./ij_mm -n 2048 2048 1 -P 2 2 1 -9pt -verify 1 -rep 10 -rap2 0 -job 4 > benchmark_spgemm.out.32 mpirun -np 4 ./ij_mm -n 256 256 128 -P 2 2 1 -7pt -verify 1 -rep 10 -rap2 1 -job 4 > benchmark_spgemm.out.33 mpirun -np 4 ./ij_mm -n 256 256 128 -P 2 2 1 -27pt -verify 1 -rep 10 -rap2 1 -job 4 > benchmark_spgemm.out.34 mpirun -np 4 ./ij_mm -n 2048 2048 1 -P 2 2 1 -5pt -verify 1 -rep 10 -rap2 1 -job 4 > benchmark_spgemm.out.35 mpirun -np 4 ./ij_mm -n 2048 2048 1 -P 2 2 1 -9pt -verify 1 -rep 10 -rap2 1 -job 4 > benchmark_spgemm.out.36 hypre-2.33.0/src/test/TEST_bench/benchmark_spgemm.perf.saved.lassen000066400000000000000000000072731477326011500251760ustar00rootroot00000000000000# Output file: benchmark_spgemm.out.1 Device Parcsr Matrix-by-Matrix wall clock time = 0.010967 seconds # Output file: benchmark_spgemm.out.2 Device Parcsr Matrix-by-Matrix wall clock time = 0.078255 seconds # Output file: benchmark_spgemm.out.3 Device Parcsr Matrix-by-Matrix wall clock time = 0.004247 seconds # Output file: benchmark_spgemm.out.4 Device Parcsr Matrix-by-Matrix wall clock time = 0.006737 seconds # Output file: benchmark_spgemm.out.5 Device Parcsr Matrix-by-Matrix wall clock time = 0.006479 seconds # Output file: benchmark_spgemm.out.6 Device Parcsr Matrix-by-Matrix wall clock time = 0.078124 seconds # Output file: benchmark_spgemm.out.7 Device Parcsr Matrix-by-Matrix wall clock time = 0.002043 seconds # Output file: benchmark_spgemm.out.8 Device Parcsr Matrix-by-Matrix wall clock time = 0.004348 seconds # Output file: benchmark_spgemm.out.9 Device Parcsr Matrix-by-Matrix wall clock time = 0.021769 seconds # Output file: benchmark_spgemm.out.10 Device Parcsr Matrix-by-Matrix wall clock time = 0.097855 seconds # Output file: benchmark_spgemm.out.11 Device Parcsr Matrix-by-Matrix wall clock time = 0.008427 seconds # Output file: benchmark_spgemm.out.12 Device Parcsr Matrix-by-Matrix wall clock time = 0.011918 seconds # Output file: benchmark_spgemm.out.13 Device Parcsr Matrix-by-Matrix wall clock time = 0.027048 seconds # Output file: benchmark_spgemm.out.14 Device Parcsr Matrix-by-Matrix wall clock time = 0.064765 seconds # Output file: benchmark_spgemm.out.15 Device Parcsr Matrix-by-Matrix wall clock time = 0.006528 seconds # Output file: benchmark_spgemm.out.16 Device Parcsr Matrix-by-Matrix wall clock time = 0.018399 seconds # Output file: benchmark_spgemm.out.17 Device Parcsr Matrix-by-Matrix wall clock time = 0.001937 seconds # Output file: benchmark_spgemm.out.18 Device Parcsr Matrix-by-Matrix wall clock time = 0.006223 seconds # Output file: benchmark_spgemm.out.19 Device Parcsr Matrix-by-Matrix wall clock time = 0.001117 seconds # Output file: benchmark_spgemm.out.20 Device Parcsr Matrix-by-Matrix wall clock time = 0.001318 seconds # Output file: benchmark_spgemm.out.21 Device Parcsr Matrix-by-Matrix wall clock time = 0.026565 seconds # Output file: benchmark_spgemm.out.22 Device Parcsr Matrix-by-Matrix wall clock time = 0.138814 seconds # Output file: benchmark_spgemm.out.23 Device Parcsr Matrix-by-Matrix wall clock time = 0.009921 seconds # Output file: benchmark_spgemm.out.24 Device Parcsr Matrix-by-Matrix wall clock time = 0.015210 seconds # Output file: benchmark_spgemm.out.25 Device Parcsr Matrix-by-Matrix wall clock time = 0.044715 seconds # Output file: benchmark_spgemm.out.26 Device Parcsr Matrix-by-Matrix wall clock time = 0.213106 seconds # Output file: benchmark_spgemm.out.27 Device Parcsr Matrix-by-Matrix wall clock time = 0.016736 seconds # Output file: benchmark_spgemm.out.28 Device Parcsr Matrix-by-Matrix wall clock time = 0.024992 seconds # Output file: benchmark_spgemm.out.29 Device Parcsr Matrix-by-Matrix wall clock time = 0.043242 seconds # Output file: benchmark_spgemm.out.30 Device Parcsr Matrix-by-Matrix wall clock time = 0.057250 seconds # Output file: benchmark_spgemm.out.31 Device Parcsr Matrix-by-Matrix wall clock time = 0.014796 seconds # Output file: benchmark_spgemm.out.32 Device Parcsr Matrix-by-Matrix wall clock time = 0.015555 seconds # Output file: benchmark_spgemm.out.33 Device Parcsr Matrix-by-Matrix wall clock time = 0.052184 seconds # Output file: benchmark_spgemm.out.34 Device Parcsr Matrix-by-Matrix wall clock time = 0.072126 seconds # Output file: benchmark_spgemm.out.35 Device Parcsr Matrix-by-Matrix wall clock time = 0.017392 seconds # Output file: benchmark_spgemm.out.36 Device Parcsr Matrix-by-Matrix wall clock time = 0.019193 seconds hypre-2.33.0/src/test/TEST_bench/benchmark_spgemm.perf.saved.tioga000066400000000000000000000072731477326011500250140ustar00rootroot00000000000000# Output file: benchmark_spgemm.out.1 Device Parcsr Matrix-by-Matrix wall clock time = 0.019578 seconds # Output file: benchmark_spgemm.out.2 Device Parcsr Matrix-by-Matrix wall clock time = 0.076419 seconds # Output file: benchmark_spgemm.out.3 Device Parcsr Matrix-by-Matrix wall clock time = 0.008474 seconds # Output file: benchmark_spgemm.out.4 Device Parcsr Matrix-by-Matrix wall clock time = 0.009719 seconds # Output file: benchmark_spgemm.out.5 Device Parcsr Matrix-by-Matrix wall clock time = 0.007846 seconds # Output file: benchmark_spgemm.out.6 Device Parcsr Matrix-by-Matrix wall clock time = 0.080421 seconds # Output file: benchmark_spgemm.out.7 Device Parcsr Matrix-by-Matrix wall clock time = 0.002626 seconds # Output file: benchmark_spgemm.out.8 Device Parcsr Matrix-by-Matrix wall clock time = 0.006074 seconds # Output file: benchmark_spgemm.out.9 Device Parcsr Matrix-by-Matrix wall clock time = 0.038709 seconds # Output file: benchmark_spgemm.out.10 Device Parcsr Matrix-by-Matrix wall clock time = 0.115453 seconds # Output file: benchmark_spgemm.out.11 Device Parcsr Matrix-by-Matrix wall clock time = 0.016367 seconds # Output file: benchmark_spgemm.out.12 Device Parcsr Matrix-by-Matrix wall clock time = 0.019611 seconds # Output file: benchmark_spgemm.out.13 Device Parcsr Matrix-by-Matrix wall clock time = 0.018017 seconds # Output file: benchmark_spgemm.out.14 Device Parcsr Matrix-by-Matrix wall clock time = 0.014804 seconds # Output file: benchmark_spgemm.out.15 Device Parcsr Matrix-by-Matrix wall clock time = 0.006545 seconds # Output file: benchmark_spgemm.out.16 Device Parcsr Matrix-by-Matrix wall clock time = 0.013026 seconds # Output file: benchmark_spgemm.out.17 Device Parcsr Matrix-by-Matrix wall clock time = 0.002087 seconds # Output file: benchmark_spgemm.out.18 Device Parcsr Matrix-by-Matrix wall clock time = 0.005301 seconds # Output file: benchmark_spgemm.out.19 Device Parcsr Matrix-by-Matrix wall clock time = 0.001359 seconds # Output file: benchmark_spgemm.out.20 Device Parcsr Matrix-by-Matrix wall clock time = 0.001621 seconds # Output file: benchmark_spgemm.out.21 Device Parcsr Matrix-by-Matrix wall clock time = 0.031799 seconds # Output file: benchmark_spgemm.out.22 Device Parcsr Matrix-by-Matrix wall clock time = 0.112757 seconds # Output file: benchmark_spgemm.out.23 Device Parcsr Matrix-by-Matrix wall clock time = 0.013535 seconds # Output file: benchmark_spgemm.out.24 Device Parcsr Matrix-by-Matrix wall clock time = 0.016090 seconds # Output file: benchmark_spgemm.out.25 Device Parcsr Matrix-by-Matrix wall clock time = 0.057450 seconds # Output file: benchmark_spgemm.out.26 Device Parcsr Matrix-by-Matrix wall clock time = 0.587366 seconds # Output file: benchmark_spgemm.out.27 Device Parcsr Matrix-by-Matrix wall clock time = 0.022603 seconds # Output file: benchmark_spgemm.out.28 Device Parcsr Matrix-by-Matrix wall clock time = 0.028229 seconds # Output file: benchmark_spgemm.out.29 Device Parcsr Matrix-by-Matrix wall clock time = 0.057857 seconds # Output file: benchmark_spgemm.out.30 Device Parcsr Matrix-by-Matrix wall clock time = 0.060432 seconds # Output file: benchmark_spgemm.out.31 Device Parcsr Matrix-by-Matrix wall clock time = 0.020985 seconds # Output file: benchmark_spgemm.out.32 Device Parcsr Matrix-by-Matrix wall clock time = 0.019986 seconds # Output file: benchmark_spgemm.out.33 Device Parcsr Matrix-by-Matrix wall clock time = 0.063040 seconds # Output file: benchmark_spgemm.out.34 Device Parcsr Matrix-by-Matrix wall clock time = 0.067800 seconds # Output file: benchmark_spgemm.out.35 Device Parcsr Matrix-by-Matrix wall clock time = 0.023271 seconds # Output file: benchmark_spgemm.out.36 Device Parcsr Matrix-by-Matrix wall clock time = 0.022089 seconds hypre-2.33.0/src/test/TEST_bench/benchmark_spgemm.saved.lassen000066400000000000000000000134671477326011500242450ustar00rootroot00000000000000# Output file: benchmark_spgemm.out.1 A^2: 2097152 x 2097152, nnz [CPU 51742208, GPU 51742208], CPU-GPU err 0.000000e+00 B 2097152 x 2097152, NNZ 51742208, RNZ 24 # Output file: benchmark_spgemm.out.2 A^2: 2097152 x 2097152, nnz [CPU 254840104, GPU 254840104], CPU-GPU err 0.000000e+00 B 2097152 x 2097152, NNZ 254840104, RNZ 121 # Output file: benchmark_spgemm.out.3 A^2: 1048576 x 1048576, nnz [CPU 13611012, GPU 13611012], CPU-GPU err 0.000000e+00 B 1048576 x 1048576, NNZ 13611012, RNZ 12 # Output file: benchmark_spgemm.out.4 A^2: 1048576 x 1048576, nnz [CPU 26152996, GPU 26152996], CPU-GPU err 0.000000e+00 B 1048576 x 1048576, NNZ 26152996, RNZ 24 # Output file: benchmark_spgemm.out.5 A^2: 2097152 x 2097152, nnz [CPU 51742208, GPU 51742208], CPU-GPU err 0.000000e+00 B 2097152 x 2097152, NNZ 51742208, RNZ 24 # Output file: benchmark_spgemm.out.6 A^2: 2097152 x 2097152, nnz [CPU 254840104, GPU 254840104], CPU-GPU err 0.000000e+00 B 2097152 x 2097152, NNZ 254840104, RNZ 121 # Output file: benchmark_spgemm.out.7 A^2: 1048576 x 1048576, nnz [CPU 13611012, GPU 13611012], CPU-GPU err 0.000000e+00 B 1048576 x 1048576, NNZ 13611012, RNZ 12 # Output file: benchmark_spgemm.out.8 A^2: 1048576 x 1048576, nnz [CPU 26152996, GPU 26152996], CPU-GPU err 0.000000e+00 B 1048576 x 1048576, NNZ 26152996, RNZ 24 # Output file: benchmark_spgemm.out.9 A^2: 2097152 x 2097152, nnz [CPU 51742208, GPU 51742208], CPU-GPU err 0.000000e+00 B 2097152 x 2097152, NNZ 51742208, RNZ 24 # Output file: benchmark_spgemm.out.10 A^2: 2097152 x 2097152, nnz [CPU 254840104, GPU 254840104], CPU-GPU err 0.000000e+00 B 2097152 x 2097152, NNZ 254840104, RNZ 121 # Output file: benchmark_spgemm.out.11 A^2: 1048576 x 1048576, nnz [CPU 13611012, GPU 13611012], CPU-GPU err 0.000000e+00 B 1048576 x 1048576, NNZ 13611012, RNZ 12 # Output file: benchmark_spgemm.out.12 A^2: 1048576 x 1048576, nnz [CPU 26152996, GPU 26152996], CPU-GPU err 0.000000e+00 B 1048576 x 1048576, NNZ 26152996, RNZ 24 # Output file: benchmark_spgemm.out.13 A^2: 2097152 x 2097152, nnz [CPU 51742208, GPU 51742208], CPU-GPU err 0.000000e+00 B 2097152 x 2097152, NNZ 51742208, RNZ 24 # Output file: benchmark_spgemm.out.14 A^2: 512000 x 512000, nnz [CPU 61162984, GPU 61162984], CPU-GPU err 0.000000e+00 B 512000 x 512000, NNZ 61162984, RNZ 119 # Output file: benchmark_spgemm.out.15 A^2: 1048576 x 1048576, nnz [CPU 13611012, GPU 13611012], CPU-GPU err 0.000000e+00 B 1048576 x 1048576, NNZ 13611012, RNZ 12 # Output file: benchmark_spgemm.out.16 A^2: 1048576 x 1048576, nnz [CPU 26152996, GPU 26152996], CPU-GPU err 0.000000e+00 B 1048576 x 1048576, NNZ 26152996, RNZ 24 # Output file: benchmark_spgemm.out.17 Diag(A)*A: 2097152 x 2097152, nnz [CPU 14581760, GPU 14581760], CPU-GPU err 0.000000e+00 B 2097152 x 2097152, NNZ 14581760, RNZ 6 # Output file: benchmark_spgemm.out.18 Diag(A)*A: 2097152 x 2097152, nnz [CPU 55742968, GPU 55742968], CPU-GPU err 0.000000e+00 B 2097152 x 2097152, NNZ 55742968, RNZ 26 # Output file: benchmark_spgemm.out.19 Diag(A)*A: 1048576 x 1048576, nnz [CPU 5238784, GPU 5238784], CPU-GPU err 0.000000e+00 B 1048576 x 1048576, NNZ 5238784, RNZ 4 # Output file: benchmark_spgemm.out.20 Diag(A)*A: 1048576 x 1048576, nnz [CPU 9424900, GPU 9424900], CPU-GPU err 0.000000e+00 B 1048576 x 1048576, NNZ 9424900, RNZ 8 # Output file: benchmark_spgemm.out.21 A^2: 8388608 x 8388608, nnz [CPU 207882752, GPU 207882752], CPU-GPU err 0.000000e+00 B 8388608 x 8388608, NNZ 207882752, RNZ 24 # Output file: benchmark_spgemm.out.22 A^2: 8388608 x 8388608, nnz [CPU 1029030184, GPU 1029030184], CPU-GPU err 0.000000e+00 B 8388608 x 8388608, NNZ 1029030184, RNZ 122 # Output file: benchmark_spgemm.out.23 A^2: 4194304 x 4194304, nnz [CPU 54484996, GPU 54484996], CPU-GPU err 0.000000e+00 B 4194304 x 4194304, NNZ 54484996, RNZ 12 # Output file: benchmark_spgemm.out.24 A^2: 4194304 x 4194304, nnz [CPU 104734756, GPU 104734756], CPU-GPU err 0.000000e+00 B 4194304 x 4194304, NNZ 104734756, RNZ 24 # Output file: benchmark_spgemm.out.25 A^T*A: 8388608 x 8388608, nnz [CPU 207882752, GPU 207882752], CPU-GPU err 0.000000e+00 B 8388608 x 8388608, NNZ 207882752, RNZ 24 # Output file: benchmark_spgemm.out.26 A^T*A: 8388608 x 8388608, nnz [CPU 1029030184, GPU 1029030184], CPU-GPU err 0.000000e+00 B 8388608 x 8388608, NNZ 1029030184, RNZ 122 # Output file: benchmark_spgemm.out.27 A^T*A: 4194304 x 4194304, nnz [CPU 54484996, GPU 54484996], CPU-GPU err 0.000000e+00 B 4194304 x 4194304, NNZ 54484996, RNZ 12 # Output file: benchmark_spgemm.out.28 A^T*A: 4194304 x 4194304, nnz [CPU 104734756, GPU 104734756], CPU-GPU err 0.000000e+00 B 4194304 x 4194304, NNZ 104734756, RNZ 24 # Output file: benchmark_spgemm.out.29 AH: 2584577 x 2584577, nnz [CPU 135117205, GPU 135117205], CPU-GPU err 1.014792e-16 AH 2584577 x 2584577, NNZ 135117205, RNZ 52 # Output file: benchmark_spgemm.out.30 AH: 681352 x 681352, nnz [CPU 63795454, GPU 63795454], CPU-GPU err 1.495569e-16 AH 681352 x 681352, NNZ 63795454, RNZ 93 # Output file: benchmark_spgemm.out.31 AH: 1526810 x 1526810, nnz [CPU 22113948, GPU 22113948], CPU-GPU err 7.252008e-17 AH 1526810 x 1526810, NNZ 22113948, RNZ 14 # Output file: benchmark_spgemm.out.32 AH: 785055 x 785055, nnz [CPU 17526581, GPU 17526581], CPU-GPU err 1.037485e-16 AH 785055 x 785055, NNZ 17526581, RNZ 22 # Output file: benchmark_spgemm.out.33 AH: 2584577 x 2584577, nnz [CPU 135117205, GPU 135117205], CPU-GPU err 1.014372e-16 AH 2584577 x 2584577, NNZ 135117205, RNZ 52 # Output file: benchmark_spgemm.out.34 AH: 681352 x 681352, nnz [CPU 63795454, GPU 63795454], CPU-GPU err 1.498314e-16 AH 681352 x 681352, NNZ 63795454, RNZ 93 # Output file: benchmark_spgemm.out.35 AH: 1526810 x 1526810, nnz [CPU 22113948, GPU 22113948], CPU-GPU err 7.252372e-17 AH 1526810 x 1526810, NNZ 22113948, RNZ 14 # Output file: benchmark_spgemm.out.36 AH: 785055 x 785055, nnz [CPU 17526581, GPU 17526581], CPU-GPU err 1.037275e-16 AH 785055 x 785055, NNZ 17526581, RNZ 22 hypre-2.33.0/src/test/TEST_bench/benchmark_spgemm.saved.tioga000066400000000000000000000134671477326011500240630ustar00rootroot00000000000000# Output file: benchmark_spgemm.out.1 A^2: 2097152 x 2097152, nnz [CPU 51742208, GPU 51742208], CPU-GPU err 0.000000e+00 B 2097152 x 2097152, NNZ 51742208, RNZ 24 # Output file: benchmark_spgemm.out.2 A^2: 2097152 x 2097152, nnz [CPU 254840104, GPU 254840104], CPU-GPU err 0.000000e+00 B 2097152 x 2097152, NNZ 254840104, RNZ 121 # Output file: benchmark_spgemm.out.3 A^2: 1048576 x 1048576, nnz [CPU 13611012, GPU 13611012], CPU-GPU err 0.000000e+00 B 1048576 x 1048576, NNZ 13611012, RNZ 12 # Output file: benchmark_spgemm.out.4 A^2: 1048576 x 1048576, nnz [CPU 26152996, GPU 26152996], CPU-GPU err 0.000000e+00 B 1048576 x 1048576, NNZ 26152996, RNZ 24 # Output file: benchmark_spgemm.out.5 A^2: 2097152 x 2097152, nnz [CPU 51742208, GPU 51742208], CPU-GPU err 0.000000e+00 B 2097152 x 2097152, NNZ 51742208, RNZ 24 # Output file: benchmark_spgemm.out.6 A^2: 2097152 x 2097152, nnz [CPU 254840104, GPU 254840104], CPU-GPU err 0.000000e+00 B 2097152 x 2097152, NNZ 254840104, RNZ 121 # Output file: benchmark_spgemm.out.7 A^2: 1048576 x 1048576, nnz [CPU 13611012, GPU 13611012], CPU-GPU err 0.000000e+00 B 1048576 x 1048576, NNZ 13611012, RNZ 12 # Output file: benchmark_spgemm.out.8 A^2: 1048576 x 1048576, nnz [CPU 26152996, GPU 26152996], CPU-GPU err 0.000000e+00 B 1048576 x 1048576, NNZ 26152996, RNZ 24 # Output file: benchmark_spgemm.out.9 A^2: 2097152 x 2097152, nnz [CPU 51742208, GPU 51742208], CPU-GPU err 0.000000e+00 B 2097152 x 2097152, NNZ 51742208, RNZ 24 # Output file: benchmark_spgemm.out.10 A^2: 2097152 x 2097152, nnz [CPU 254840104, GPU 254840104], CPU-GPU err 0.000000e+00 B 2097152 x 2097152, NNZ 254840104, RNZ 121 # Output file: benchmark_spgemm.out.11 A^2: 1048576 x 1048576, nnz [CPU 13611012, GPU 13611012], CPU-GPU err 0.000000e+00 B 1048576 x 1048576, NNZ 13611012, RNZ 12 # Output file: benchmark_spgemm.out.12 A^2: 1048576 x 1048576, nnz [CPU 26152996, GPU 26152996], CPU-GPU err 0.000000e+00 B 1048576 x 1048576, NNZ 26152996, RNZ 24 # Output file: benchmark_spgemm.out.13 A^2: 2097152 x 2097152, nnz [CPU 51742208, GPU 51742208], CPU-GPU err 0.000000e+00 B 2097152 x 2097152, NNZ 51742208, RNZ 24 # Output file: benchmark_spgemm.out.14 A^2: 512000 x 512000, nnz [CPU 61162984, GPU 61162984], CPU-GPU err 0.000000e+00 B 512000 x 512000, NNZ 61162984, RNZ 119 # Output file: benchmark_spgemm.out.15 A^2: 1048576 x 1048576, nnz [CPU 13611012, GPU 13611012], CPU-GPU err 0.000000e+00 B 1048576 x 1048576, NNZ 13611012, RNZ 12 # Output file: benchmark_spgemm.out.16 A^2: 1048576 x 1048576, nnz [CPU 26152996, GPU 26152996], CPU-GPU err 0.000000e+00 B 1048576 x 1048576, NNZ 26152996, RNZ 24 # Output file: benchmark_spgemm.out.17 Diag(A)*A: 2097152 x 2097152, nnz [CPU 14581760, GPU 14581760], CPU-GPU err 0.000000e+00 B 2097152 x 2097152, NNZ 14581760, RNZ 6 # Output file: benchmark_spgemm.out.18 Diag(A)*A: 2097152 x 2097152, nnz [CPU 55742968, GPU 55742968], CPU-GPU err 0.000000e+00 B 2097152 x 2097152, NNZ 55742968, RNZ 26 # Output file: benchmark_spgemm.out.19 Diag(A)*A: 1048576 x 1048576, nnz [CPU 5238784, GPU 5238784], CPU-GPU err 0.000000e+00 B 1048576 x 1048576, NNZ 5238784, RNZ 4 # Output file: benchmark_spgemm.out.20 Diag(A)*A: 1048576 x 1048576, nnz [CPU 9424900, GPU 9424900], CPU-GPU err 0.000000e+00 B 1048576 x 1048576, NNZ 9424900, RNZ 8 # Output file: benchmark_spgemm.out.21 A^2: 8388608 x 8388608, nnz [CPU 207882752, GPU 207882752], CPU-GPU err 0.000000e+00 B 8388608 x 8388608, NNZ 207882752, RNZ 24 # Output file: benchmark_spgemm.out.22 A^2: 8388608 x 8388608, nnz [CPU 1029030184, GPU 1029030184], CPU-GPU err 0.000000e+00 B 8388608 x 8388608, NNZ 1029030184, RNZ 122 # Output file: benchmark_spgemm.out.23 A^2: 4194304 x 4194304, nnz [CPU 54484996, GPU 54484996], CPU-GPU err 0.000000e+00 B 4194304 x 4194304, NNZ 54484996, RNZ 12 # Output file: benchmark_spgemm.out.24 A^2: 4194304 x 4194304, nnz [CPU 104734756, GPU 104734756], CPU-GPU err 0.000000e+00 B 4194304 x 4194304, NNZ 104734756, RNZ 24 # Output file: benchmark_spgemm.out.25 A^T*A: 8388608 x 8388608, nnz [CPU 207882752, GPU 207882752], CPU-GPU err 0.000000e+00 B 8388608 x 8388608, NNZ 207882752, RNZ 24 # Output file: benchmark_spgemm.out.26 A^T*A: 8388608 x 8388608, nnz [CPU 1029030184, GPU 1029030184], CPU-GPU err 0.000000e+00 B 8388608 x 8388608, NNZ 1029030184, RNZ 122 # Output file: benchmark_spgemm.out.27 A^T*A: 4194304 x 4194304, nnz [CPU 54484996, GPU 54484996], CPU-GPU err 0.000000e+00 B 4194304 x 4194304, NNZ 54484996, RNZ 12 # Output file: benchmark_spgemm.out.28 A^T*A: 4194304 x 4194304, nnz [CPU 104734756, GPU 104734756], CPU-GPU err 0.000000e+00 B 4194304 x 4194304, NNZ 104734756, RNZ 24 # Output file: benchmark_spgemm.out.29 AH: 2583446 x 2583446, nnz [CPU 135091866, GPU 135091866], CPU-GPU err 1.147135e-16 AH 2583446 x 2583446, NNZ 135091866, RNZ 52 # Output file: benchmark_spgemm.out.30 AH: 680505 x 680505, nnz [CPU 63647301, GPU 63647301], CPU-GPU err 1.755166e-16 AH 680505 x 680505, NNZ 63647301, RNZ 93 # Output file: benchmark_spgemm.out.31 AH: 1528997 x 1528997, nnz [CPU 22132459, GPU 22132459], CPU-GPU err 6.243446e-17 AH 1528997 x 1528997, NNZ 22132459, RNZ 14 # Output file: benchmark_spgemm.out.32 AH: 784265 x 784265, nnz [CPU 17497231, GPU 17497231], CPU-GPU err 1.048829e-16 AH 784265 x 784265, NNZ 17497231, RNZ 22 # Output file: benchmark_spgemm.out.33 AH: 2583446 x 2583446, nnz [CPU 135091866, GPU 135091866], CPU-GPU err 1.145884e-16 AH 2583446 x 2583446, NNZ 135091866, RNZ 52 # Output file: benchmark_spgemm.out.34 AH: 680505 x 680505, nnz [CPU 63647301, GPU 63647301], CPU-GPU err 1.759819e-16 AH 680505 x 680505, NNZ 63647301, RNZ 93 # Output file: benchmark_spgemm.out.35 AH: 1528997 x 1528997, nnz [CPU 22132459, GPU 22132459], CPU-GPU err 6.242405e-17 AH 1528997 x 1528997, NNZ 22132459, RNZ 14 # Output file: benchmark_spgemm.out.36 AH: 784265 x 784265, nnz [CPU 17497231, GPU 17497231], CPU-GPU err 1.048567e-16 AH 784265 x 784265, NNZ 17497231, RNZ 22 hypre-2.33.0/src/test/TEST_bench/benchmark_spgemm.sh000077500000000000000000000034151477326011500222640ustar00rootroot00000000000000#!/bin/bash # Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) TNAME=`basename $0 .sh` RTOL=$1 ATOL=$2 #============================================================================= # compare with baseline case #============================================================================= FILES="\ ${TNAME}.out.1\ ${TNAME}.out.2\ ${TNAME}.out.3\ ${TNAME}.out.4\ ${TNAME}.out.5\ ${TNAME}.out.6\ ${TNAME}.out.7\ ${TNAME}.out.8\ ${TNAME}.out.9\ ${TNAME}.out.10\ ${TNAME}.out.11\ ${TNAME}.out.12\ ${TNAME}.out.13\ ${TNAME}.out.14\ ${TNAME}.out.15\ ${TNAME}.out.16\ ${TNAME}.out.17\ ${TNAME}.out.18\ ${TNAME}.out.19\ ${TNAME}.out.20\ ${TNAME}.out.21\ ${TNAME}.out.22\ ${TNAME}.out.23\ ${TNAME}.out.24\ ${TNAME}.out.25\ ${TNAME}.out.26\ ${TNAME}.out.27\ ${TNAME}.out.28\ ${TNAME}.out.29\ ${TNAME}.out.30\ ${TNAME}.out.31\ ${TNAME}.out.32\ ${TNAME}.out.33\ ${TNAME}.out.34\ ${TNAME}.out.35\ ${TNAME}.out.36\ " for i in $FILES do echo "# Output file: $i" tail -2 $i done > ${TNAME}.out for i in $FILES do echo "# Output file: $i" setup_time=$(grep -A 1 "Device Parcsr Matrix-by-Matrix" $i | tail -n 1) echo "Device Parcsr Matrix-by-Matrix"${setup_time} done > ${TNAME}.perf.out # Make sure that the output file is reasonable RUNCOUNT=`echo $FILES | wc -w` OUTCOUNT=`grep "CPU-GPU err" ${TNAME}.out | wc -l` if [ "$OUTCOUNT" != "$RUNCOUNT" ]; then echo "Incorrect number of runs in ${TNAME}.out" >&2 fi #============================================================================= # remove temporary files #============================================================================= rm -f ${TNAME}.testdata* hypre-2.33.0/src/test/TEST_bench/benchmark_struct.jobs000077500000000000000000000021541477326011500226420ustar00rootroot00000000000000#!/bin/bash # Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) #============================================================================= # struct: GPU benchmarks #============================================================================= # SMG CG mpirun -np 4 ./struct -n 2048 2048 1 -d 2 -solver 10 -repeats 2 > benchmark_struct.out.1 mpirun -np 4 ./struct -n 3072 3072 1 -d 2 -solver 10 -repeats 2 > benchmark_struct.out.2 mpirun -np 4 ./struct -n 128 128 128 -solver 10 -repeats 2 > benchmark_struct.out.3 mpirun -np 4 ./struct -n 200 200 200 -solver 10 -repeats 2 > benchmark_struct.out.4 # PFMG CG mpirun -np 4 ./struct -n 2048 2048 1 -d 2 -solver 11 -repeats 2 > benchmark_struct.out.5 mpirun -np 4 ./struct -n 4096 4096 1 -d 2 -solver 11 -repeats 2 > benchmark_struct.out.6 mpirun -np 4 ./struct -n 256 256 256 -solver 11 -repeats 2 > benchmark_struct.out.7 mpirun -np 4 ./struct -n 300 300 300 -solver 11 -repeats 2 > benchmark_struct.out.8 hypre-2.33.0/src/test/TEST_bench/benchmark_struct.perf.saved.lassen000066400000000000000000000020001477326011500252110ustar00rootroot00000000000000# Output file: benchmark_struct.out.1 PCG Setup wall clock time = 0.120866 seconds PCG Solve wall clock time = 0.577228 seconds # Output file: benchmark_struct.out.2 PCG Setup wall clock time = 0.139227 seconds PCG Solve wall clock time = 0.769984 seconds # Output file: benchmark_struct.out.3 PCG Setup wall clock time = 1.197938 seconds PCG Solve wall clock time = 6.011690 seconds # Output file: benchmark_struct.out.4 PCG Setup wall clock time = 1.791265 seconds PCG Solve wall clock time = 9.300076 seconds # Output file: benchmark_struct.out.5 PCG Setup wall clock time = 0.012325 seconds PCG Solve wall clock time = 0.138208 seconds # Output file: benchmark_struct.out.6 PCG Setup wall clock time = 0.019830 seconds PCG Solve wall clock time = 0.313756 seconds # Output file: benchmark_struct.out.7 PCG Setup wall clock time = 0.050781 seconds PCG Solve wall clock time = 0.408700 seconds # Output file: benchmark_struct.out.8 PCG Setup wall clock time = 0.069028 seconds PCG Solve wall clock time = 0.629209 seconds hypre-2.33.0/src/test/TEST_bench/benchmark_struct.perf.saved.tioga000066400000000000000000000020001477326011500250270ustar00rootroot00000000000000# Output file: benchmark_struct.out.1 PCG Setup wall clock time = 0.091983 seconds PCG Solve wall clock time = 0.421361 seconds # Output file: benchmark_struct.out.2 PCG Setup wall clock time = 0.114076 seconds PCG Solve wall clock time = 0.568872 seconds # Output file: benchmark_struct.out.3 PCG Setup wall clock time = 0.862025 seconds PCG Solve wall clock time = 4.294343 seconds # Output file: benchmark_struct.out.4 PCG Setup wall clock time = 1.412173 seconds PCG Solve wall clock time = 7.285773 seconds # Output file: benchmark_struct.out.5 PCG Setup wall clock time = 0.012046 seconds PCG Solve wall clock time = 0.095558 seconds # Output file: benchmark_struct.out.6 PCG Setup wall clock time = 0.016907 seconds PCG Solve wall clock time = 0.241860 seconds # Output file: benchmark_struct.out.7 PCG Setup wall clock time = 0.044571 seconds PCG Solve wall clock time = 0.333274 seconds # Output file: benchmark_struct.out.8 PCG Setup wall clock time = 0.071390 seconds PCG Solve wall clock time = 0.519030 seconds hypre-2.33.0/src/test/TEST_bench/benchmark_struct.saved.lassen000066400000000000000000000014241477326011500242670ustar00rootroot00000000000000# Output file: benchmark_struct.out.1 Iterations = 6 Final Relative Residual Norm = 1.399448e-07 # Output file: benchmark_struct.out.2 Iterations = 6 Final Relative Residual Norm = 2.351905e-07 # Output file: benchmark_struct.out.3 Iterations = 5 Final Relative Residual Norm = 1.230948e-07 # Output file: benchmark_struct.out.4 Iterations = 5 Final Relative Residual Norm = 2.015486e-07 # Output file: benchmark_struct.out.5 Iterations = 10 Final Relative Residual Norm = 5.748202e-07 # Output file: benchmark_struct.out.6 Iterations = 11 Final Relative Residual Norm = 1.451552e-07 # Output file: benchmark_struct.out.7 Iterations = 10 Final Relative Residual Norm = 2.886212e-07 # Output file: benchmark_struct.out.8 Iterations = 10 Final Relative Residual Norm = 3.341658e-07 hypre-2.33.0/src/test/TEST_bench/benchmark_struct.saved.tioga000066400000000000000000000014241477326011500241050ustar00rootroot00000000000000# Output file: benchmark_struct.out.1 Iterations = 6 Final Relative Residual Norm = 1.399448e-07 # Output file: benchmark_struct.out.2 Iterations = 6 Final Relative Residual Norm = 2.351905e-07 # Output file: benchmark_struct.out.3 Iterations = 5 Final Relative Residual Norm = 1.230948e-07 # Output file: benchmark_struct.out.4 Iterations = 5 Final Relative Residual Norm = 2.015486e-07 # Output file: benchmark_struct.out.5 Iterations = 10 Final Relative Residual Norm = 5.748202e-07 # Output file: benchmark_struct.out.6 Iterations = 11 Final Relative Residual Norm = 1.451552e-07 # Output file: benchmark_struct.out.7 Iterations = 10 Final Relative Residual Norm = 2.886212e-07 # Output file: benchmark_struct.out.8 Iterations = 10 Final Relative Residual Norm = 3.341658e-07 hypre-2.33.0/src/test/TEST_bench/benchmark_struct.sh000077500000000000000000000025011477326011500223130ustar00rootroot00000000000000#!/bin/bash # Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) TNAME=`basename $0 .sh` RTOL=$1 ATOL=$2 #============================================================================= # compare with baseline case #============================================================================= FILES="\ ${TNAME}.out.1\ ${TNAME}.out.2\ ${TNAME}.out.3\ ${TNAME}.out.4\ ${TNAME}.out.5\ ${TNAME}.out.6\ ${TNAME}.out.7\ ${TNAME}.out.8\ " for i in $FILES do echo "# Output file: $i" tail -3 $i done > ${TNAME}.out for i in $FILES do echo "# Output file: $i" setup_time=$(grep -A 1 "PCG Setup" $i | tail -n 1) echo "PCG Setup"${setup_time} solve_time=$(grep -A 1 "PCG Solve" $i | tail -n 1) echo "PCG Solve"${solve_time} done > ${TNAME}.perf.out # Make sure that the output file is reasonable RUNCOUNT=`echo $FILES | wc -w` OUTCOUNT=`grep "Iterations" ${TNAME}.out | wc -l` if [ "$OUTCOUNT" != "$RUNCOUNT" ]; then echo "Incorrect number of runs in ${TNAME}.out" >&2 fi #============================================================================= # remove temporary files #============================================================================= rm -f ${TNAME}.testdata* hypre-2.33.0/src/test/TEST_error/000077500000000000000000000000001477326011500164725ustar00rootroot00000000000000hypre-2.33.0/src/test/TEST_error/error.jobs000077500000000000000000000023111477326011500205020ustar00rootroot00000000000000#!/bin/bash # Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) #============================================================================= # These runs generate errors #============================================================================= mpirun -np 2 ./ij -solver 2 -max_iter 2 > error.out.0 mpirun -np 2 ./ij -solver 1 -mg_max_iter 2 > error.out.1 mpirun -np 2 ./ij -solver 1 -mg_max_iter 2 -difconv -c 0 0 0 > error.out.2 mpirun -np 2 ./ij -solver 1 -mg_max_iter 2 -rlx 0 -w -1.0 > error.out.3 mpirun -np 2 ./ij -solver 0 -mg_max_iter 2 > error.out.4 # Test the HYPRE_GetErrorMessages() and HYPRE_SetPrintErrorVerbosity() routines mpirun -np 2 ./ij -solver 1 -mg_max_iter 2 -rlx 0 -w -1.0 > error.out.10 mpirun -np 2 ./ij -solver 0 -mg_max_iter 1 -ns 0 -nc 2 > error.out.11 mpirun -np 2 ./ij -solver 1 -mg_max_iter 2 -rlx 0 -w -1.0 -test_error 1 > error.out.15 mpirun -np 2 ./ij -solver 0 -mg_max_iter 1 -ns 0 -nc 2 -test_error 1 > error.out.16 hypre-2.33.0/src/test/TEST_error/error.saved000066400000000000000000000132701477326011500206520ustar00rootroot00000000000000# Output file: error.out.0 Iters ||r||_2 conv.rate ||r||_2/||b||_2 ----- ------------ --------- ------------ 1 3.651484e+01 1.154701 1.154701e+00 2 2.779522e+01 0.761203 8.789620e-01 # Output file: error.out.1 Iters ||r||_2 conv.rate ||r||_2/||b||_2 ----- ------------ --------- ------------ 1 9.666492e+00 0.305681 3.056813e-01 2 6.025557e-01 0.062334 1.905448e-02 # Output file: error.out.2 : 1.000000e+03 Iters ||r||_2 conv.rate ||r||_2/||b||_2 ----- ------------ --------- ------------ 1 1.995213e+00 0.063094 6.309416e-02 # Output file: error.out.3 Iters ||r||_2 conv.rate ||r||_2/||b||_2 ----- ------------ --------- ------------ 1 5.298880e+01 1.675653 1.675653e+00 2 5.298880e+01 1.000000 1.675653e+00 # Output file: error.out.4 Average Convergence Factor = 0.235234 Complexity: grid = 1.555000 operator = 2.667344 cycle = 5.332187 # Output file: error.out.10 Iters ||r||_2 conv.rate ||r||_2/||b||_2 ----- ------------ --------- ------------ 1 5.298880e+01 1.675653 1.675653e+00 2 5.298880e+01 1.000000 1.675653e+00 # Output file: error.out.11 Average Convergence Factor = 1.379821 Complexity: grid = 1.555000 operator = 2.667344 cycle = 5.332187 # Output file: error.out.15 Iters ||r||_2 conv.rate ||r||_2/||b||_2 ----- ------------ --------- ------------ 1 5.298880e+01 1.675653 1.675653e+00 2 5.298880e+01 1.000000 1.675653e+00 # Output file: error.out.16 Average Convergence Factor = 1.379821 Complexity: grid = 1.555000 operator = 2.667344 cycle = 5.332187 0: hypre error in file "par_amg.c", line 2025, error code = 20 0: hypre error in file "par_amg_solve.c", line 341, error code = 256 0: hypre error in file "par_amg_solve.c", line 341, error code = 256 0: hypre error in file "par_relax.c", line 753, error code = 1 - Hybrid GS relaxation doesn't support multicomponent vectors 0: hypre error in file "par_relax.c", line 753, error code = 1 - Hybrid GS relaxation doesn't support multicomponent vectors 0: hypre error in file "par_relax.c", line 753, error code = 1 - Hybrid GS relaxation doesn't support multicomponent vectors 0: hypre error in file "par_relax.c", line 753, error code = 1 - Hybrid GS relaxation doesn't support multicomponent vectors 0: hypre error in file "par_relax.c", line 753, error code = 1 - Hybrid GS relaxation doesn't support multicomponent vectors 0: hypre error in file "par_relax.c", line 753, error code = 1 - Hybrid GS relaxation doesn't support multicomponent vectors 0: hypre error in file "par_relax.c", line 753, error code = 1 - Hybrid GS relaxation doesn't support multicomponent vectors 0: hypre error in file "par_relax.c", line 753, error code = 1 - Hybrid GS relaxation doesn't support multicomponent vectors 0: hypre error in file "par_relax.c", line 753, error code = 1 - Hybrid GS relaxation doesn't support multicomponent vectors 0: hypre error in file "par_relax.c", line 753, error code = 1 - Hybrid GS relaxation doesn't support multicomponent vectors 0: hypre error in file "par_relax.c", line 753, error code = 1 - Hybrid GS relaxation doesn't support multicomponent vectors 0: hypre error in file "par_relax.c", line 753, error code = 1 - Hybrid GS relaxation doesn't support multicomponent vectors 0: hypre error in file "par_relax.c", line 753, error code = 1 - Hybrid GS relaxation doesn't support multicomponent vectors 0: hypre error in file "par_relax.c", line 753, error code = 1 - Hybrid GS relaxation doesn't support multicomponent vectors 0: hypre error in file "par_relax.c", line 753, error code = 1 - Hybrid GS relaxation doesn't support multicomponent vectors 0: hypre error in file "par_relax.c", line 753, error code = 1 - Hybrid GS relaxation doesn't support multicomponent vectors 0: hypre error in file "pcg.c", line 851, error code = 256 - Negative or zero gamma value in PCG 0: hypre error in file "pcg.c", line 851, error code = 256 - Negative or zero gamma value in PCG 0: hypre error in file "pcg.c", line 851, error code = 256 - Negative or zero gamma value in PCG 0: hypre error in file "pcg.c", line 992, error code = 256 - Reached max iterations 2 in PCG before convergence 0: hypre error in file "pcg.c", line 992, error code = 256 - Reached max iterations 2 in PCG before convergence 0: hypre error in file "pcg.c", line 992, error code = 256 - Reached max iterations 2 in PCG before convergence 0: hypre error in file "pcg.c", line 992, error code = 256 - Reached max iterations 2 in PCG before convergence 1: hypre error in file "par_relax.c", line 753, error code = 1 - Hybrid GS relaxation doesn't support multicomponent vectors 1: hypre error in file "par_relax.c", line 753, error code = 1 - Hybrid GS relaxation doesn't support multicomponent vectors 1: hypre error in file "par_relax.c", line 753, error code = 1 - Hybrid GS relaxation doesn't support multicomponent vectors 1: hypre error in file "par_relax.c", line 753, error code = 1 - Hybrid GS relaxation doesn't support multicomponent vectors 1: hypre error in file "par_relax.c", line 753, error code = 1 - Hybrid GS relaxation doesn't support multicomponent vectors 1: hypre error in file "par_relax.c", line 753, error code = 1 - Hybrid GS relaxation doesn't support multicomponent vectors 1: hypre error in file "par_relax.c", line 753, error code = 1 - Hybrid GS relaxation doesn't support multicomponent vectors 1: hypre error in file "par_relax.c", line 753, error code = 1 - Hybrid GS relaxation doesn't support multicomponent vectors hypre-2.33.0/src/test/TEST_error/error.saved.lassen000066400000000000000000000050761477326011500221430ustar00rootroot00000000000000# Output file: error.out.0 Iters ||r||_2 conv.rate ||r||_2/||b||_2 ----- ------------ --------- ------------ 1 3.651484e+01 1.154701 1.154701e+00 2 2.779522e+01 0.761203 8.789620e-01 # Output file: error.out.1 Iters ||r||_2 conv.rate ||r||_2/||b||_2 ----- ------------ --------- ------------ 1 1.382238e+01 0.437102 4.371021e-01 2 2.890219e+00 0.209097 9.139676e-02 # Output file: error.out.2 : 1.000000e+03 Iters ||r||_2 conv.rate ||r||_2/||b||_2 ----- ------------ --------- ------------ 1 1.880957e+01 0.594811 5.948108e-01 # Output file: error.out.3 Iters ||r||_2 conv.rate ||r||_2/||b||_2 ----- ------------ --------- ------------ 1 5.536410e+01 1.750767 1.750767e+00 2 5.536410e+01 1.000000 1.750767e+00 # Output file: error.out.4 Average Convergence Factor = 0.388883 Complexity: grid = 1.427000 operator = 2.492344 cycle = 4.982188 # Output file: error.out.10 Iters ||r||_2 conv.rate ||r||_2/||b||_2 ----- ------------ --------- ------------ 1 5.536410e+01 1.750767 1.750767e+00 2 5.536410e+01 1.000000 1.750767e+00 # Output file: error.out.11 Average Convergence Factor = 0.397074 Complexity: grid = 1.427000 operator = 2.492344 cycle = 4.982188 # Output file: error.out.15 Iters ||r||_2 conv.rate ||r||_2/||b||_2 ----- ------------ --------- ------------ 1 5.536410e+01 1.750767 1.750767e+00 2 5.536410e+01 1.000000 1.750767e+00 # Output file: error.out.16 Average Convergence Factor = 0.397074 Complexity: grid = 1.427000 operator = 2.492344 cycle = 4.982188 0: hypre error in file "par_amg.c", line 2025, error code = 20 0: hypre error in file "par_amg_solve.c", line 341, error code = 256 0: hypre error in file "par_amg_solve.c", line 341, error code = 256 0: hypre error in file "pcg.c", line 851, error code = 256 - Negative or zero gamma value in PCG 0: hypre error in file "pcg.c", line 992, error code = 256 - Reached max iterations 2 in PCG before convergence 0: hypre error in file "pcg.c", line 992, error code = 256 - Reached max iterations 2 in PCG before convergence 0: hypre error in file "pcg.c", line 992, error code = 256 - Reached max iterations 2 in PCG before convergence 0: hypre error in file "pcg.c", line 992, error code = 256 - Reached max iterations 2 in PCG before convergence hypre-2.33.0/src/test/TEST_error/error.sh000077500000000000000000000021761477326011500201700ustar00rootroot00000000000000#!/bin/bash # Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) TNAME=`basename $0 .sh` RTOL=$1 ATOL=$2 #============================================================================= # compare with baseline case #============================================================================= FILES="\ ${TNAME}.out.0\ ${TNAME}.out.1\ ${TNAME}.out.2\ ${TNAME}.out.3\ ${TNAME}.out.4\ ${TNAME}.out.10\ ${TNAME}.out.11\ ${TNAME}.out.15\ ${TNAME}.out.16\ " for i in $FILES do echo "# Output file: $i" tail -21 $i | head -6 done > ${TNAME}.out # Remove the "hypre error" lines from '.err' file and append them to '.out' mv ${TNAME}.err ${TNAME}.tmp egrep "hypre error" ${TNAME}.tmp | sort >> ${TNAME}.out egrep -v "hypre error" ${TNAME}.tmp > ${TNAME}.err #============================================================================= # remove temporary files #============================================================================= rm -f ${TNAME}.testdata* rm -f ${TNAME}.tmp hypre-2.33.0/src/test/TEST_examples/000077500000000000000000000000001477326011500171575ustar00rootroot00000000000000hypre-2.33.0/src/test/TEST_examples/bigint.jobs000077500000000000000000000007311477326011500213160ustar00rootroot00000000000000#!/bin/bash # Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) #============================================================================= # Run bigint examples #============================================================================= mpirun -np 4 ./ex5big > bigint.out.1 mpirun -np 8 ./ex15big -n 10 > bigint.out.2 hypre-2.33.0/src/test/TEST_examples/bigint.saved000066400000000000000000000002631477326011500214600ustar00rootroot00000000000000# Output file: bigint.out.1 Iterations = 7 Final Relative Residual Norm = 6.309891e-09 # Output file: bigint.out.2 Iterations = 7 Final Relative Residual Norm = 4.81542e-07 hypre-2.33.0/src/test/TEST_examples/bigint.sh000077500000000000000000000015001477326011500207660ustar00rootroot00000000000000#!/bin/bash # Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) TNAME=`basename $0 .sh` #============================================================================= # compare with baseline case #============================================================================= FILES="\ ${TNAME}.out.1\ ${TNAME}.out.2\ " # Need to avoid output lines about "no global partition" for i in $FILES do echo "# Output file: $i" tail -5 $i done > ${TNAME}.out # Make sure that the output file is reasonable RUNCOUNT=`echo $FILES | wc -w` OUTCOUNT=`grep "Iterations" ${TNAME}.out | wc -l` if [ "$OUTCOUNT" != "$RUNCOUNT" ]; then echo "Incorrect number of runs in ${TNAME}.out" >&2 fi hypre-2.33.0/src/test/TEST_examples/complex.jobs000077500000000000000000000006661477326011500215200ustar00rootroot00000000000000#!/bin/bash # Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) #============================================================================= # Run complex examples #============================================================================= mpirun -np 16 ./ex18comp -n 4 > complex.out.1 hypre-2.33.0/src/test/TEST_examples/complex.sh000077500000000000000000000010561477326011500211670ustar00rootroot00000000000000#!/bin/bash # Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) #============================================================================= # EXAMPLES: Compare ex*.base files with complex.out.* files from current runs # differences (except for timings) indicate errors #============================================================================= diff -U3 -bI"time" ex18comp.base complex.out.1 >&2 hypre-2.33.0/src/test/TEST_examples/default.jobs000077500000000000000000000021731477326011500214700ustar00rootroot00000000000000#!/bin/bash # Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) #============================================================================= # Run each example #============================================================================= mpirun -np 2 ./ex1 > default.out.1 mpirun -np 2 ./ex2 > default.out.2 mpirun -np 16 ./ex3 -n 33 -solver 0 -v 1 1 > default.out.3 mpirun -np 16 ./ex4 -n 33 -solver 10 -K 3 -B 0 -C 1 -UO 2 -F 4 > default.out.4 mpirun -np 4 ./ex5 > default.out.5 mpirun -np 4 ./ex5f > default.out.5f mpirun -np 2 ./ex6 > default.out.6 mpirun -np 16 ./ex7 -n 33 -solver 10 -K 3 -B 0 -C 1 -UO 2 -F 4 > default.out.7 mpirun -np 2 ./ex8 > default.out.8 mpirun -np 16 ./ex9 -n 33 -solver 0 -v 1 1 > default.out.9 # mpirun -np 4 ./ex11 > default.out.11 mpirun -np 2 ./ex12 -pfmg > default.out.12 mpirun -np 2 ./ex12f -pfmg > default.out.12f mpirun -np 6 ./ex13 -n 10 > default.out.13 mpirun -np 6 ./ex14 -n 10 > default.out.14 mpirun -np 8 ./ex15 -n 10 > default.out.15 hypre-2.33.0/src/test/TEST_examples/default.saved000066400000000000000000000035701477326011500216340ustar00rootroot00000000000000# Output file: default.out.1 11 5.329671e-05 0.179526 1.256215e-05 12 7.308483e-06 0.137128 1.722626e-06 13 7.411552e-07 0.101410 1.746920e-07 # Output file: default.out.2 1 3.503257e-02 0.004729 4.728807e-03 2 1.386843e-04 0.003959 1.872005e-05 3 8.429961e-07 0.006079 1.137903e-07 # Output file: default.out.3 Iterations = 5 Final Relative Residual Norm = 9.21374e-08 # Output file: default.out.4 Iterations = 6 Final Relative Residual Norm = 5.961443e-08 # Output file: default.out.5 Iterations = 7 Final Relative Residual Norm = 6.309891e-09 # Output file: default.out.5f Iterations = 7 Final Relative Residual Norm = 6.30989112E-09 # Output file: default.out.6 1 3.503257e-02 0.004729 4.728807e-03 2 1.386843e-04 0.003959 1.872005e-05 3 8.429961e-07 0.006079 1.137903e-07 # Output file: default.out.7 Iterations = 6 Final Relative Residual Norm = 5.961443e-08 # Output file: default.out.8 7 1.315332e-04 0.128961 2.233203e-05 8 1.350294e-05 0.102658 2.292562e-06 9 4.148659e-06 0.307241 7.043691e-07 # Output file: default.out.9 Iterations = 9 Final Relative Residual Norm = 6.57147e-07 # Output file: default.out.12 2 3.255341e-03 0.014358 5.745609e-04 3 6.649011e-05 0.020425 1.173537e-05 4 1.544291e-06 0.023226 2.725642e-07 # Output file: default.out.12f 2 3.255341e-03 0.014358 5.745609e-04 3 6.649011e-05 0.020425 1.173537e-05 4 1.544291e-06 0.023226 2.725642e-07 # Output file: default.out.13 Iterations = 8 Final Relative Residual Norm = 2.7253e-07 # Output file: default.out.14 Iterations = 8 Final Relative Residual Norm = 2.7253e-07 # Output file: default.out.15 Iterations = 7 Final Relative Residual Norm = 4.81542e-07 hypre-2.33.0/src/test/TEST_examples/default.sh000077500000000000000000000020431477326011500211410ustar00rootroot00000000000000#!/bin/bash # Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) TNAME=`basename $0 .sh` #============================================================================= # compare with baseline case #============================================================================= FILES="\ ${TNAME}.out.1\ ${TNAME}.out.2\ ${TNAME}.out.3\ ${TNAME}.out.4\ ${TNAME}.out.5\ ${TNAME}.out.5f\ ${TNAME}.out.6\ ${TNAME}.out.7\ ${TNAME}.out.8\ ${TNAME}.out.9\ ${TNAME}.out.12\ ${TNAME}.out.12f\ ${TNAME}.out.13\ ${TNAME}.out.14\ ${TNAME}.out.15\ " # ${TNAME}.out.11\ # Need to avoid output lines about "no global partition" for i in $FILES do echo "# Output file: $i" tail -5 $i done > ${TNAME}.out # Make sure that the output file is reasonable RUNCOUNT=9 OUTCOUNT=`grep "Iterations" ${TNAME}.out | wc -l` if [ "$OUTCOUNT" != "$RUNCOUNT" ]; then echo "Incorrect number of runs in ${TNAME}.out" >&2 fi hypre-2.33.0/src/test/TEST_examples/ex1.base000066400000000000000000000014111477326011500205050ustar00rootroot00000000000000: 1.800000e+01 Iters ||r||_C conv.rate ||r||_C/||b||_C ----- ------------ --------- ------------ 1 2.509980e+00 0.591608 5.916080e-01 2 9.888265e-01 0.393958 2.330686e-01 3 4.572262e-01 0.462393 1.077693e-01 4 1.706474e-01 0.373223 4.022197e-02 5 7.473022e-02 0.437922 1.761408e-02 6 3.402624e-02 0.455321 8.020061e-03 7 1.214929e-02 0.357057 2.863616e-03 8 3.533113e-03 0.290808 8.327628e-04 9 1.343893e-03 0.380371 3.167586e-04 10 2.968745e-04 0.220906 6.997400e-05 11 5.329671e-05 0.179526 1.256215e-05 12 7.308483e-06 0.137128 1.722626e-06 13 7.411552e-07 0.101410 1.746920e-07 hypre-2.33.0/src/test/TEST_examples/ex10.base000066400000000000000000000030301477326011500205640ustar00rootroot00000000000000*************************************************** * Preconditioned Conjugate Gradient solver * maximum no. of iterations = 100 * convergence tolerance = 1.000000e-06 *-------------------------------------------------- AMG max levels = 30 AMG coarsen type = 6 AMG measure type = 0 AMG threshold = 2.500000e-01 AMG numsweeps = 1 AMG relax type = 6 AMG relax weight = 1.000000e+00 AMG relax omega = 1.000000e+00 AMG system size = 1 AMG smooth type = 0 AMG smooth numlevels = 0 AMG smooth numsweeps = 1 AMG Schwarz variant = 0 AMG Schwarz overlap = 1 AMG Schwarz domain type = 2 AMG Schwarz relax weight = 1.000000e+00 *************************************************** : 6.829186e-05 Iters ||r||_2 conv.rate ||r||_2/||b||_2 ----- ------------ --------- ------------ 1 2.362072e-03 0.285831 2.858306e-01 2 1.590804e-04 0.067348 1.925006e-02 3 1.087675e-05 0.068373 1.316178e-03 4 4.417991e-07 0.040619 5.346141e-05 5 1.281097e-08 0.028997 1.550235e-06 6 5.026712e-10 0.039238 6.082744e-08 *************************************************** * Solver Statistics * *-------------------------------------------------* ** HYPRE preconditioner setup time = 3.092300e-02 ** HYPRE solution time = 2.983800e-02 ** HYPRE total time = 6.076100e-02 ** HYPRE number of iterations = 6 ** HYPRE final residual norm = 5.026712e-10 *************************************************** hypre-2.33.0/src/test/TEST_examples/ex11.base000066400000000000000000000113521477326011500205730ustar00rootroot00000000000000 Num MPI tasks = 4 Num OpenMP threads = 1 BoomerAMG SETUP PARAMETERS: Max levels = 25 Num levels = 6 Strength Threshold = 0.250000 Interpolation Truncation Factor = 0.000000 Maximum Row Sum Threshold for Dependency Weakening = 0.900000 Coarsening Type = Falgout-CLJP measures are determined locally Interpolation = modified classical interpolation Operator Matrix Information: nonzero entries per row row sums lev rows entries sparse min max avg min max =================================================================== 0 1089 5313 0.004 3 5 4.9 0.000e+00 2.000e+00 1 545 4641 0.016 4 9 8.5 0.000e+00 2.500e+00 2 157 1535 0.062 4 14 9.8 -1.246e-15 3.020e+00 3 57 773 0.238 4 21 13.6 4.718e-16 3.294e+00 4 19 251 0.695 8 18 13.2 9.852e-02 2.814e+00 5 6 36 1.000 6 6 6.0 1.232e+00 1.875e+00 Interpolation Matrix Information: entries/row min max row sums lev rows cols min max weight weight min max ================================================================= 0 1089 x 545 1 4 2.500e-01 2.500e-01 7.500e-01 1.000e+00 1 545 x 157 1 4 7.143e-02 5.000e-01 2.857e-01 1.000e+00 2 157 x 57 1 6 2.767e-02 5.489e-01 2.630e-01 1.000e+00 3 57 x 19 0 5 1.892e-02 7.312e-01 0.000e+00 1.000e+00 4 19 x 6 0 4 2.675e-02 4.155e-01 0.000e+00 1.000e+00 Complexity: grid = 1.719927 operator = 2.361942 memory = 3.194052 BoomerAMG SOLVER PARAMETERS: Maximum number of cycles: 1 Stopping Tolerance: 0.000000e+00 Cycle type (1 = V, 2 = W, etc.): 1 Relaxation Parameters: Visiting Grid: down up coarse Number of sweeps: 1 1 1 Type 0=Jac, 3=hGS, 6=hSGS, 9=GE: 6 6 9 Point types, partial sweeps (1=C, -1=F): Pre-CG relaxation (down): 1 -1 Post-CG relaxation (up): -1 1 Coarsest grid: 0 Solving standard eigenvalue problem with preconditioning block size 10 No constraints Initial Max. Residual 2.03558352288229e+00 Iteration 1 bsize 10 maxres 6.61514157224843e-01 Iteration 2 bsize 10 maxres 2.07896889116710e-01 Iteration 3 bsize 10 maxres 8.94032219306993e-02 Iteration 4 bsize 10 maxres 5.57350171849667e-02 Iteration 5 bsize 10 maxres 4.52510317358840e-02 Iteration 6 bsize 10 maxres 1.59857204829020e-02 Iteration 7 bsize 9 maxres 3.01005214598883e-03 Iteration 8 bsize 9 maxres 9.15794471126193e-04 Iteration 9 bsize 7 maxres 2.67036683874873e-04 Iteration 10 bsize 7 maxres 1.22560803599727e-04 Iteration 11 bsize 6 maxres 5.82317118369297e-05 Iteration 12 bsize 4 maxres 2.38206795757980e-05 Iteration 13 bsize 4 maxres 1.73582603672364e-05 Iteration 14 bsize 4 maxres 1.24286547834999e-05 Iteration 15 bsize 2 maxres 8.17561831147489e-06 Iteration 16 bsize 2 maxres 6.15437257020104e-06 Iteration 17 bsize 2 maxres 3.85665129413136e-06 Iteration 18 bsize 2 maxres 1.98370873016928e-06 Iteration 19 bsize 2 maxres 9.04748529043191e-07 Iteration 20 bsize 2 maxres 4.32381520962772e-07 Iteration 21 bsize 2 maxres 2.50222048479429e-07 Iteration 22 bsize 1 maxres 2.34484258071025e-07 Iteration 23 bsize 1 maxres 1.83982655401445e-07 Iteration 24 bsize 1 maxres 1.03489248001117e-07 Iteration 25 bsize 1 maxres 4.40855000574139e-08 Iteration 26 bsize 1 maxres 3.09954979505864e-08 Iteration 27 bsize 1 maxres 1.60261672404816e-08 Iteration 28 bsize 1 maxres 9.94572583241695e-09 Eigenvalue lambda 1.70632948198615e-02 Eigenvalue lambda 4.25854480421258e-02 Eigenvalue lambda 4.25854480421275e-02 Eigenvalue lambda 6.81076012643940e-02 Eigenvalue lambda 8.48803610642899e-02 Eigenvalue lambda 8.48803610642927e-02 Eigenvalue lambda 1.10402514286550e-01 Eigenvalue lambda 1.10402514286556e-01 Eigenvalue lambda 1.43587188600284e-01 Eigenvalue lambda 1.43587188601197e-01 Residual 7.10733437718353e-09 Residual 3.11201121838922e-09 Residual 6.06662101490030e-09 Residual 2.99575029947378e-09 Residual 3.27383590437594e-09 Residual 4.64545900598969e-09 Residual 9.94572583241695e-09 Residual 5.37168378288395e-09 Residual 8.95906699030658e-09 Residual 9.21811003610402e-09 28 iterations ============================================= Solve phase times: ============================================= LOBPCG Solve: wall clock time = 0.110000 seconds wall MFLOPS = 0.000000 cpu clock time = 0.110000 seconds cpu MFLOPS = 0.000000 hypre-2.33.0/src/test/TEST_examples/ex12.base000066400000000000000000000005071477326011500205740ustar00rootroot00000000000000: 3.210115e+01 Iters ||r||_C conv.rate ||r||_C/||b||_C ----- ------------ --------- ------------ 1 2.267211e-01 0.040016 4.001582e-02 2 3.255341e-03 0.014358 5.745609e-04 3 6.649011e-05 0.020425 1.173537e-05 4 1.544291e-06 0.023226 2.725642e-07 hypre-2.33.0/src/test/TEST_examples/ex12f.base000066400000000000000000000005071477326011500207420ustar00rootroot00000000000000: 3.210115e+01 Iters ||r||_C conv.rate ||r||_C/||b||_C ----- ------------ --------- ------------ 1 2.267211e-01 0.040016 4.001582e-02 2 3.255341e-03 0.014358 5.745609e-04 3 6.649011e-05 0.020425 1.173537e-05 4 1.544291e-06 0.023226 2.725642e-07 hypre-2.33.0/src/test/TEST_examples/ex13.base000066400000000000000000000013441477326011500205750ustar00rootroot00000000000000 AMG SOLUTION INFO: relative residual factor residual -------- ------ -------- Initial 2.335962e-01 1.000000e+00 Cycle 1 1.345127e-02 0.057583 5.758345e-02 Cycle 2 7.607388e-04 0.056555 3.256640e-03 Cycle 3 4.280536e-05 0.056268 1.832451e-04 Cycle 4 2.449140e-06 0.057216 1.048450e-05 Cycle 5 1.473469e-07 0.060163 6.307762e-07 Average Convergence Factor = 0.057541 Complexity: grid = 1.509834 operator = 1.841964 cycle = 3.675148 Iterations = 5 Final Relative Residual Norm = 6.30776e-07 hypre-2.33.0/src/test/TEST_examples/ex14.base000066400000000000000000000013441477326011500205760ustar00rootroot00000000000000 AMG SOLUTION INFO: relative residual factor residual -------- ------ -------- Initial 2.335962e-01 1.000000e+00 Cycle 1 1.345127e-02 0.057583 5.758345e-02 Cycle 2 7.607388e-04 0.056555 3.256640e-03 Cycle 3 4.280536e-05 0.056268 1.832451e-04 Cycle 4 2.449140e-06 0.057216 1.048450e-05 Cycle 5 1.473469e-07 0.060163 6.307762e-07 Average Convergence Factor = 0.057541 Complexity: grid = 1.509834 operator = 1.841964 cycle = 3.675148 Iterations = 5 Final Relative Residual Norm = 6.30776e-07 hypre-2.33.0/src/test/TEST_examples/ex15.base000066400000000000000000000024611477326011500206000ustar00rootroot00000000000000============================================= SStruct phase times: ============================================= SStruct Setup: wall clock time = 0.140000 seconds wall MFLOPS = 0.000000 cpu clock time = 0.140000 seconds cpu MFLOPS = 0.000000 Problem size: 26460 ============================================= Setup phase times: ============================================= AMS Setup: wall clock time = 0.110000 seconds wall MFLOPS = 0.000000 cpu clock time = 0.110000 seconds cpu MFLOPS = 0.000000 : 8.525169e-02 Iters ||r||_C conv.rate ||r||_C/||b||_C ----- ------------ --------- ------------ 1 2.580403e-02 0.088376 8.837634e-02 2 1.135712e-03 0.044013 3.889706e-03 3 9.210442e-05 0.081098 3.154489e-04 4 2.211502e-05 0.240108 7.574185e-05 5 3.768622e-06 0.170410 1.290717e-05 6 7.393492e-07 0.196186 2.532201e-06 7 1.149856e-07 0.155523 3.938149e-07 ============================================= Solve phase times: ============================================= AMS Solve: wall clock time = 0.190000 seconds wall MFLOPS = 0.000000 cpu clock time = 0.190000 seconds cpu MFLOPS = 0.000000 Iterations = 7 Final Relative Residual Norm = 3.93815e-07 hypre-2.33.0/src/test/TEST_examples/ex15big.base000066400000000000000000000024611477326011500212620ustar00rootroot00000000000000============================================= SStruct phase times: ============================================= SStruct Setup: wall clock time = 0.200000 seconds wall MFLOPS = 0.000000 cpu clock time = 0.200000 seconds cpu MFLOPS = 0.000000 Problem size: 26460 ============================================= Setup phase times: ============================================= AMS Setup: wall clock time = 0.110000 seconds wall MFLOPS = 0.000000 cpu clock time = 0.110000 seconds cpu MFLOPS = 0.000000 : 8.525169e-02 Iters ||r||_C conv.rate ||r||_C/||b||_C ----- ------------ --------- ------------ 1 2.580403e-02 0.088376 8.837634e-02 2 1.135712e-03 0.044013 3.889706e-03 3 9.210442e-05 0.081098 3.154489e-04 4 2.211502e-05 0.240108 7.574185e-05 5 3.768622e-06 0.170410 1.290717e-05 6 7.393492e-07 0.196186 2.532201e-06 7 1.149856e-07 0.155523 3.938149e-07 ============================================= Solve phase times: ============================================= AMS Solve: wall clock time = 0.170000 seconds wall MFLOPS = 0.000000 cpu clock time = 0.180000 seconds cpu MFLOPS = 0.000000 Iterations = 7 Final Relative Residual Norm = 3.93815e-07 hypre-2.33.0/src/test/TEST_examples/ex17.base000066400000000000000000000024671477326011500206100ustar00rootroot00000000000000: 1.600000e+05 Iters ||r||_2 conv.rate ||r||_2/||b||_2 ----- ------------ --------- ------------ 1 1.714286e+02 0.428571 4.285714e-01 2 6.937951e+01 0.404714 1.734488e-01 3 3.574922e+01 0.515271 8.937304e-02 4 1.813367e+01 0.507247 4.533417e-02 5 1.037284e+01 0.572021 2.593210e-02 6 5.682995e+00 0.547873 1.420749e-02 7 3.328568e+00 0.585707 8.321420e-03 8 1.967425e+00 0.591073 4.918564e-03 9 1.120598e+00 0.569576 2.801496e-03 10 6.592787e-01 0.588327 1.648197e-03 11 3.810985e-01 0.578054 9.527462e-04 12 2.185439e-01 0.573458 5.463598e-04 13 1.248169e-01 0.571130 3.120423e-04 14 7.010330e-02 0.561649 1.752583e-04 15 3.800296e-02 0.542099 9.500740e-05 16 2.033283e-02 0.535033 5.083206e-05 17 1.063273e-02 0.522934 2.658183e-05 18 5.724364e-03 0.538372 1.431091e-05 19 3.359279e-03 0.586839 8.398197e-06 20 2.070938e-03 0.616483 5.177345e-06 21 1.185092e-03 0.572249 2.962731e-06 22 6.102417e-04 0.514932 1.525604e-06 23 3.083906e-04 0.505358 7.709764e-07 Iterations = 23 Final Relative Residual Norm = 7.70976e-07 hypre-2.33.0/src/test/TEST_examples/ex18.base000066400000000000000000000016471477326011500206100ustar00rootroot00000000000000: 8.192000e+03 Iters ||r||_2 conv.rate ||r||_2/||b||_2 ----- ------------ --------- ------------ 1 4.105811e+01 0.453632 4.536324e-01 2 1.739515e+01 0.423671 1.921910e-01 3 8.226372e+00 0.472912 9.088943e-02 4 3.734247e+00 0.453936 4.125799e-02 5 1.613911e+00 0.432192 1.783136e-02 6 6.397716e-01 0.396411 7.068544e-03 7 2.453022e-01 0.383422 2.710232e-03 8 9.308149e-02 0.379456 1.028415e-03 9 3.743395e-02 0.402163 4.135906e-04 10 1.619688e-02 0.432679 1.789520e-04 11 6.423785e-03 0.396606 7.097347e-05 12 1.870679e-03 0.291211 2.066828e-05 13 5.087829e-04 0.271978 5.621310e-06 14 1.783219e-04 0.350487 1.970198e-06 15 3.414145e-05 0.191460 3.772133e-07 Iterations = 15 Final Relative Residual Norm = 3.77213e-07 hypre-2.33.0/src/test/TEST_examples/ex18comp.base000066400000000000000000000017311477326011500214610ustar00rootroot00000000000000: 8.192000e+03 Iters ||r||_2 conv.rate ||r||_2/||b||_2 ----- ------------ --------- ------------ 1 5.374535e+01 0.593808 5.938078e-01 2 2.713428e+01 0.504868 2.997943e-01 3 1.296404e+01 0.477773 1.432337e-01 4 7.020268e+00 0.541519 7.756374e-02 5 3.542406e+00 0.504597 3.913843e-02 6 1.513071e+00 0.427131 1.671723e-02 7 6.210149e-01 0.410433 6.861310e-03 8 2.456656e-01 0.395587 2.714247e-03 9 9.979411e-02 0.406219 1.102580e-03 10 4.295547e-02 0.430441 4.745953e-04 11 1.882327e-02 0.438204 2.079697e-04 12 7.446687e-03 0.395611 8.227505e-05 13 2.786470e-03 0.374189 3.078644e-05 14 9.438206e-04 0.338716 1.042784e-05 15 2.369284e-04 0.251031 2.617714e-06 16 7.984797e-05 0.337013 8.822038e-07 Iterations = 16 Final Relative Residual Norm = 8.82204e-07 hypre-2.33.0/src/test/TEST_examples/ex2.base000066400000000000000000000004251477326011500205120ustar00rootroot00000000000000: 5.488337e+01 Iters ||r||_C conv.rate ||r||_C/||b||_C ----- ------------ --------- ------------ 1 3.503257e-02 0.004729 4.728807e-03 2 1.386843e-04 0.003959 1.872005e-05 3 8.429961e-07 0.006079 1.137903e-07 hypre-2.33.0/src/test/TEST_examples/ex3.base000066400000000000000000000006621477326011500205160ustar00rootroot00000000000000: 5.568539e-05 Iters ||r||_2 conv.rate ||r||_2/||b||_2 ----- ------------ --------- ------------ 1 2.168867e-03 0.290645 2.906446e-01 2 8.424332e-05 0.038842 1.128924e-02 3 1.941992e-06 0.023052 2.602417e-04 4 2.447573e-08 0.012603 3.279933e-06 5 6.875533e-10 0.028091 9.213736e-08 Iterations = 5 Final Relative Residual Norm = 9.21374e-08 hypre-2.33.0/src/test/TEST_examples/ex4.base000066400000000000000000000017431477326011500205200ustar00rootroot00000000000000============================================= Setup phase times: ============================================= PCG Setup: wall clock time = 0.220000 seconds wall MFLOPS = 0.000000 cpu clock time = 0.040000 seconds cpu MFLOPS = 0.000000 : 5.738541e-05 Iters ||r||_2 conv.rate ||r||_2/||b||_2 ----- ------------ --------- ------------ 1 2.449562e-03 0.323361 3.233611e-01 2 1.589475e-04 0.064888 2.098229e-02 3 6.225562e-06 0.039167 8.218220e-04 4 2.221278e-07 0.035680 2.932258e-05 5 1.094405e-08 0.049269 1.444699e-06 6 4.515981e-10 0.041264 5.961443e-08 ============================================= Solve phase times: ============================================= PCG Solve: wall clock time = 0.640000 seconds wall MFLOPS = 0.000000 cpu clock time = 0.130000 seconds cpu MFLOPS = 0.000000 Iterations = 6 Final Relative Residual Norm = 5.961443e-08 hypre-2.33.0/src/test/TEST_examples/ex5.base000066400000000000000000000071131477326011500205160ustar00rootroot00000000000000 Num MPI tasks = 4 Num OpenMP threads = 1 BoomerAMG SETUP PARAMETERS: Max levels = 20 Num levels = 6 Strength Threshold = 0.250000 Interpolation Truncation Factor = 0.000000 Maximum Row Sum Threshold for Dependency Weakening = 0.900000 Coarsening Type = Falgout-CLJP measures are determined locally Interpolation = modified classical interpolation Operator Matrix Information: nonzero entries per row row sums lev rows entries sparse min max avg min max =================================================================== 0 1089 5313 0.004 3 5 4.9 0.000e+00 2.000e+00 1 545 4641 0.016 4 9 8.5 0.000e+00 2.500e+00 2 157 1535 0.062 4 14 9.8 -1.246e-15 3.020e+00 3 57 773 0.238 4 21 13.6 4.718e-16 3.294e+00 4 19 251 0.695 8 18 13.2 9.852e-02 2.814e+00 5 6 36 1.000 6 6 6.0 1.232e+00 1.875e+00 Interpolation Matrix Information: entries/row min max row sums lev rows cols min max weight weight min max ================================================================= 0 1089 x 545 1 4 2.500e-01 2.500e-01 7.500e-01 1.000e+00 1 545 x 157 1 4 7.143e-02 5.000e-01 2.857e-01 1.000e+00 2 157 x 57 1 6 2.767e-02 5.489e-01 2.630e-01 1.000e+00 3 57 x 19 0 5 1.892e-02 7.312e-01 0.000e+00 1.000e+00 4 19 x 6 0 4 2.675e-02 4.155e-01 0.000e+00 1.000e+00 Complexity: grid = 1.719927 operator = 2.361942 memory = 3.194052 BoomerAMG SOLVER PARAMETERS: Maximum number of cycles: 20 Stopping Tolerance: 1.000000e-07 Cycle type (1 = V, 2 = W, etc.): 1 Relaxation Parameters: Visiting Grid: down up coarse Number of sweeps: 1 1 1 Type 0=Jac, 3=hGS, 6=hSGS, 9=GE: 3 3 9 Point types, partial sweeps (1=C, -1=F): Pre-CG relaxation (down): 1 -1 Post-CG relaxation (up): -1 1 Coarsest grid: 0 BoomerAMG SOLVER PARAMETERS: Maximum number of cycles: 20 Stopping Tolerance: 1.000000e-07 Cycle type (1 = V, 2 = W, etc.): 1 Relaxation Parameters: Visiting Grid: down up coarse Number of sweeps: 1 1 1 Type 0=Jac, 3=hGS, 6=hSGS, 9=GE: 3 3 9 Point types, partial sweeps (1=C, -1=F): Pre-CG relaxation (down): 1 -1 Post-CG relaxation (up): -1 1 Coarsest grid: 0 Output flag (print_level): 3 AMG SOLUTION INFO: relative residual factor residual -------- ------ -------- Initial 2.854671e-02 1.000000e+00 Cycle 1 2.995663e-03 0.104939 1.049390e-01 Cycle 2 1.941234e-04 0.064801 6.800200e-03 Cycle 3 1.245674e-05 0.064169 4.363634e-04 Cycle 4 7.816537e-07 0.062749 2.738157e-05 Cycle 5 4.829130e-08 0.061781 1.691659e-06 Cycle 6 2.956748e-09 0.061227 1.035758e-07 Cycle 7 1.801267e-10 0.060921 6.309891e-09 Average Convergence Factor = 0.067387 Complexity: grid = 1.719927 operator = 2.361942 cycle = 4.717109 Iterations = 7 Final Relative Residual Norm = 6.309891e-09 hypre-2.33.0/src/test/TEST_examples/ex5b.base000066400000000000000000000071211477326011500206570ustar00rootroot00000000000000 BoomerAMG SETUP PARAMETERS: Max levels = 20 Num levels = 6 Strength Threshold = 0.250000 Interpolation Truncation Factor = 0.000000 Maximum Row Sum Threshold for Dependency Weakening = 0.900000 Coarsening Type = Falgout-CLJP Hybrid Coarsening (switch to CLJP when coarsening slows) measures are determined locally Operator Matrix Information: nonzero entries per row row sums lev rows entries sparse min max avg min max =================================================================== 0 1089 5313 0.004 3 5 4.9 0.000e+00 2.000e+00 1 545 4641 0.016 4 9 8.5 0.000e+00 2.500e+00 2 157 1535 0.062 4 14 9.8 -1.058e-15 3.020e+00 3 57 773 0.238 4 21 13.6 5.456e-16 3.294e+00 4 19 251 0.695 8 18 13.2 9.852e-02 2.814e+00 5 6 36 1.000 6 6 6.0 1.232e+00 1.875e+00 Interpolation Matrix Information: entries/row min max row sums lev rows cols min max weight weight min max ================================================================= 0 1089 x 545 1 4 2.500e-01 2.500e-01 7.500e-01 1.000e+00 1 545 x 157 1 4 7.143e-02 5.000e-01 2.857e-01 1.000e+00 2 157 x 57 1 6 2.767e-02 5.489e-01 2.630e-01 1.000e+00 3 57 x 19 0 5 1.892e-02 7.312e-01 0.000e+00 1.000e+00 4 19 x 6 0 4 2.675e-02 4.155e-01 0.000e+00 1.000e+00 Complexity: grid = 1.719927 operator = 2.361942 BoomerAMG SOLVER PARAMETERS: Maximum number of cycles: 20 Stopping Tolerance: 1.000000e-07 Cycle type (1 = V, 2 = W, etc.): 1 Relaxation Parameters: Visiting Grid: fine down up coarse Number of partial sweeps: 1 1 1 1 Type 0=Jac, 1=GS, 3=Hybrid 9=GE: 3 3 3 9 Point types, partial sweeps (1=C, -1=F): Finest grid: 1 -1 Pre-CG relaxation (down): 1 -1 Post-CG relaxation (up): -1 1 Coarsest grid: 0 BoomerAMG SOLVER PARAMETERS: Maximum number of cycles: 20 Stopping Tolerance: 1.000000e-07 Cycle type (1 = V, 2 = W, etc.): 1 Relaxation Parameters: Visiting Grid: fine down up coarse Number of partial sweeps: 1 1 1 1 Type 0=Jac, 1=GS, 3=Hybrid 9=GE: 3 3 3 9 Point types, partial sweeps (1=C, -1=F): Finest grid: 1 -1 Pre-CG relaxation (down): 1 -1 Post-CG relaxation (up): -1 1 Coarsest grid: 0 Output flag (print_level): 3 AMG SOLUTION INFO: relative residual factor residual -------- ------ -------- Initial 2.854671e-02 1.000000e+00 Cycle 1 2.489410e-03 0.087205 8.720477e-02 Cycle 2 1.577269e-04 0.063359 5.525222e-03 Cycle 3 9.678312e-06 0.061361 3.390342e-04 Cycle 4 5.811090e-07 0.060042 2.035643e-05 Cycle 5 3.444942e-08 0.059282 1.206773e-06 Cycle 6 2.028180e-09 0.058874 7.104777e-08 Average Convergence Factor = 0.064356 Complexity: grid = 1.719927 operator = 2.361942 cycle = 4.717109 Iterations = 6 Final Relative Residual Norm = 7.104777e-08 hypre-2.33.0/src/test/TEST_examples/ex5b77.base000066400000000000000000000071301477326011500210350ustar00rootroot00000000000000 BoomerAMG SETUP PARAMETERS: Max levels = 20 Num levels = 6 Strength Threshold = 0.250000 Interpolation Truncation Factor = 0.000000 Maximum Row Sum Threshold for Dependency Weakening = 0.900000 Coarsening Type = Falgout-CLJP Hybrid Coarsening (switch to CLJP when coarsening slows) measures are determined locally Operator Matrix Information: nonzero entries per row row sums lev rows entries sparse min max avg min max =================================================================== 0 1089 5313 0.004 3 5 4.9 0.000e+00 2.000e+00 1 545 4641 0.016 4 9 8.5 0.000e+00 2.500e+00 2 157 1535 0.062 4 14 9.8 -1.058e-15 3.020e+00 3 57 773 0.238 4 21 13.6 5.456e-16 3.294e+00 4 19 251 0.695 8 18 13.2 9.852e-02 2.814e+00 5 6 36 1.000 6 6 6.0 1.232e+00 1.875e+00 Interpolation Matrix Information: entries/row min max row sums lev rows cols min max weight weight min max ================================================================= 0 1089 x 545 1 4 2.500e-01 2.500e-01 7.500e-01 1.000e+00 1 545 x 157 1 4 7.143e-02 5.000e-01 2.857e-01 1.000e+00 2 157 x 57 1 6 2.767e-02 5.489e-01 2.630e-01 1.000e+00 3 57 x 19 0 5 1.892e-02 7.312e-01 0.000e+00 1.000e+00 4 19 x 6 0 4 2.675e-02 4.155e-01 0.000e+00 1.000e+00 Complexity: grid = 1.719927 operator = 2.361942 BoomerAMG SOLVER PARAMETERS: Maximum number of cycles: 20 Stopping Tolerance: 1.000000e-07 Cycle type (1 = V, 2 = W, etc.): 1 Relaxation Parameters: Visiting Grid: fine down up coarse Number of partial sweeps: 1 1 1 1 Type 0=Jac, 1=GS, 3=Hybrid 9=GE: 3 3 3 9 Point types, partial sweeps (1=C, -1=F): Finest grid: 1 -1 Pre-CG relaxation (down): 1 -1 Post-CG relaxation (up): -1 1 Coarsest grid: 0 BoomerAMG SOLVER PARAMETERS: Maximum number of cycles: 20 Stopping Tolerance: 1.000000e-07 Cycle type (1 = V, 2 = W, etc.): 1 Relaxation Parameters: Visiting Grid: fine down up coarse Number of partial sweeps: 1 1 1 1 Type 0=Jac, 1=GS, 3=Hybrid 9=GE: 3 3 3 9 Point types, partial sweeps (1=C, -1=F): Finest grid: 1 -1 Pre-CG relaxation (down): 1 -1 Post-CG relaxation (up): -1 1 Coarsest grid: 0 Output flag (print_level): 3 AMG SOLUTION INFO: relative residual factor residual -------- ------ -------- Initial 2.854671e-02 1.000000e+00 Cycle 1 2.489410e-03 0.087205 8.720477e-02 Cycle 2 1.577269e-04 0.063359 5.525222e-03 Cycle 3 9.678312e-06 0.061361 3.390342e-04 Cycle 4 5.811090e-07 0.060042 2.035643e-05 Cycle 5 3.444942e-08 0.059282 1.206773e-06 Cycle 6 2.028180e-09 0.058874 7.104777e-08 Average Convergence Factor = 0.064356 Complexity: grid = 1.719927 operator = 2.361942 cycle = 4.717109 Iterations = 6 Final Relative Residual Norm = 7.10477677E-08 hypre-2.33.0/src/test/TEST_examples/ex5big.base000066400000000000000000000071131477326011500212000ustar00rootroot00000000000000 Num MPI tasks = 4 Num OpenMP threads = 1 BoomerAMG SETUP PARAMETERS: Max levels = 20 Num levels = 6 Strength Threshold = 0.250000 Interpolation Truncation Factor = 0.000000 Maximum Row Sum Threshold for Dependency Weakening = 0.900000 Coarsening Type = Falgout-CLJP measures are determined locally Interpolation = modified classical interpolation Operator Matrix Information: nonzero entries per row row sums lev rows entries sparse min max avg min max =================================================================== 0 1089 5313 0.004 3 5 4.9 0.000e+00 2.000e+00 1 545 4641 0.016 4 9 8.5 0.000e+00 2.500e+00 2 157 1535 0.062 4 14 9.8 -1.246e-15 3.020e+00 3 57 773 0.238 4 21 13.6 4.718e-16 3.294e+00 4 19 251 0.695 8 18 13.2 9.852e-02 2.814e+00 5 6 36 1.000 6 6 6.0 1.232e+00 1.875e+00 Interpolation Matrix Information: entries/row min max row sums lev rows cols min max weight weight min max ================================================================= 0 1089 x 545 1 4 2.500e-01 2.500e-01 7.500e-01 1.000e+00 1 545 x 157 1 4 7.143e-02 5.000e-01 2.857e-01 1.000e+00 2 157 x 57 1 6 2.767e-02 5.489e-01 2.630e-01 1.000e+00 3 57 x 19 0 5 1.892e-02 7.312e-01 0.000e+00 1.000e+00 4 19 x 6 0 4 2.675e-02 4.155e-01 0.000e+00 1.000e+00 Complexity: grid = 1.719927 operator = 2.361942 memory = 3.194052 BoomerAMG SOLVER PARAMETERS: Maximum number of cycles: 20 Stopping Tolerance: 1.000000e-07 Cycle type (1 = V, 2 = W, etc.): 1 Relaxation Parameters: Visiting Grid: down up coarse Number of sweeps: 1 1 1 Type 0=Jac, 3=hGS, 6=hSGS, 9=GE: 3 3 9 Point types, partial sweeps (1=C, -1=F): Pre-CG relaxation (down): 1 -1 Post-CG relaxation (up): -1 1 Coarsest grid: 0 BoomerAMG SOLVER PARAMETERS: Maximum number of cycles: 20 Stopping Tolerance: 1.000000e-07 Cycle type (1 = V, 2 = W, etc.): 1 Relaxation Parameters: Visiting Grid: down up coarse Number of sweeps: 1 1 1 Type 0=Jac, 3=hGS, 6=hSGS, 9=GE: 3 3 9 Point types, partial sweeps (1=C, -1=F): Pre-CG relaxation (down): 1 -1 Post-CG relaxation (up): -1 1 Coarsest grid: 0 Output flag (print_level): 3 AMG SOLUTION INFO: relative residual factor residual -------- ------ -------- Initial 2.854671e-02 1.000000e+00 Cycle 1 2.995663e-03 0.104939 1.049390e-01 Cycle 2 1.941234e-04 0.064801 6.800200e-03 Cycle 3 1.245674e-05 0.064169 4.363634e-04 Cycle 4 7.816537e-07 0.062749 2.738157e-05 Cycle 5 4.829130e-08 0.061781 1.691659e-06 Cycle 6 2.956748e-09 0.061227 1.035758e-07 Cycle 7 1.801267e-10 0.060921 6.309891e-09 Average Convergence Factor = 0.067387 Complexity: grid = 1.719927 operator = 2.361942 cycle = 4.717109 Iterations = 7 Final Relative Residual Norm = 6.309891e-09 hypre-2.33.0/src/test/TEST_examples/ex5f.base000066400000000000000000000071221477326011500206640ustar00rootroot00000000000000 Num MPI tasks = 4 Num OpenMP threads = 1 BoomerAMG SETUP PARAMETERS: Max levels = 20 Num levels = 6 Strength Threshold = 0.250000 Interpolation Truncation Factor = 0.000000 Maximum Row Sum Threshold for Dependency Weakening = 0.900000 Coarsening Type = Falgout-CLJP measures are determined locally Interpolation = modified classical interpolation Operator Matrix Information: nonzero entries per row row sums lev rows entries sparse min max avg min max =================================================================== 0 1089 5313 0.004 3 5 4.9 0.000e+00 2.000e+00 1 545 4641 0.016 4 9 8.5 0.000e+00 2.500e+00 2 157 1535 0.062 4 14 9.8 -1.246e-15 3.020e+00 3 57 773 0.238 4 21 13.6 4.718e-16 3.294e+00 4 19 251 0.695 8 18 13.2 9.852e-02 2.814e+00 5 6 36 1.000 6 6 6.0 1.232e+00 1.875e+00 Interpolation Matrix Information: entries/row min max row sums lev rows cols min max weight weight min max ================================================================= 0 1089 x 545 1 4 2.500e-01 2.500e-01 7.500e-01 1.000e+00 1 545 x 157 1 4 7.143e-02 5.000e-01 2.857e-01 1.000e+00 2 157 x 57 1 6 2.767e-02 5.489e-01 2.630e-01 1.000e+00 3 57 x 19 0 5 1.892e-02 7.312e-01 0.000e+00 1.000e+00 4 19 x 6 0 4 2.675e-02 4.155e-01 0.000e+00 1.000e+00 Complexity: grid = 1.719927 operator = 2.361942 memory = 3.194052 BoomerAMG SOLVER PARAMETERS: Maximum number of cycles: 20 Stopping Tolerance: 1.000000e-07 Cycle type (1 = V, 2 = W, etc.): 1 Relaxation Parameters: Visiting Grid: down up coarse Number of sweeps: 1 1 1 Type 0=Jac, 3=hGS, 6=hSGS, 9=GE: 3 3 9 Point types, partial sweeps (1=C, -1=F): Pre-CG relaxation (down): 1 -1 Post-CG relaxation (up): -1 1 Coarsest grid: 0 BoomerAMG SOLVER PARAMETERS: Maximum number of cycles: 20 Stopping Tolerance: 1.000000e-07 Cycle type (1 = V, 2 = W, etc.): 1 Relaxation Parameters: Visiting Grid: down up coarse Number of sweeps: 1 1 1 Type 0=Jac, 3=hGS, 6=hSGS, 9=GE: 3 3 9 Point types, partial sweeps (1=C, -1=F): Pre-CG relaxation (down): 1 -1 Post-CG relaxation (up): -1 1 Coarsest grid: 0 Output flag (print_level): 3 AMG SOLUTION INFO: relative residual factor residual -------- ------ -------- Initial 2.854671e-02 1.000000e+00 Cycle 1 2.995663e-03 0.104939 1.049390e-01 Cycle 2 1.941234e-04 0.064801 6.800200e-03 Cycle 3 1.245674e-05 0.064169 4.363634e-04 Cycle 4 7.816537e-07 0.062749 2.738157e-05 Cycle 5 4.829130e-08 0.061781 1.691659e-06 Cycle 6 2.956748e-09 0.061227 1.035758e-07 Cycle 7 1.801267e-10 0.060921 6.309891e-09 Average Convergence Factor = 0.067387 Complexity: grid = 1.719927 operator = 2.361942 cycle = 4.717109 Iterations = 7 Final Relative Residual Norm = 6.30989118E-09 hypre-2.33.0/src/test/TEST_examples/ex6.base000066400000000000000000000004251477326011500205160ustar00rootroot00000000000000: 5.488337e+01 Iters ||r||_C conv.rate ||r||_C/||b||_C ----- ------------ --------- ------------ 1 3.503257e-02 0.004729 4.728807e-03 2 1.386843e-04 0.003959 1.872005e-05 3 8.429961e-07 0.006079 1.137903e-07 hypre-2.33.0/src/test/TEST_examples/ex7.base000066400000000000000000000017431477326011500205230ustar00rootroot00000000000000============================================= Setup phase times: ============================================= PCG Setup: wall clock time = 0.150000 seconds wall MFLOPS = 0.000000 cpu clock time = 0.030000 seconds cpu MFLOPS = 0.000000 : 5.738541e-05 Iters ||r||_2 conv.rate ||r||_2/||b||_2 ----- ------------ --------- ------------ 1 2.449562e-03 0.323361 3.233611e-01 2 1.589475e-04 0.064888 2.098229e-02 3 6.225562e-06 0.039167 8.218220e-04 4 2.221278e-07 0.035680 2.932258e-05 5 1.094405e-08 0.049269 1.444699e-06 6 4.515981e-10 0.041264 5.961443e-08 ============================================= Solve phase times: ============================================= PCG Solve: wall clock time = 0.640000 seconds wall MFLOPS = 0.000000 cpu clock time = 0.130000 seconds cpu MFLOPS = 0.000000 Iterations = 6 Final Relative Residual Norm = 5.961443e-08 hypre-2.33.0/src/test/TEST_examples/ex8.base000066400000000000000000000011011477326011500205100ustar00rootroot00000000000000: 3.469084e+01 Iters ||r||_C conv.rate ||r||_C/||b||_C ----- ------------ --------- ------------ 1 2.197899e+00 0.373165 3.731645e-01 2 4.545887e-01 0.206829 7.718115e-02 3 1.058488e-01 0.232845 1.797126e-02 4 3.101107e-02 0.292975 5.265134e-03 5 4.546495e-03 0.146609 7.719147e-04 6 1.019943e-03 0.224336 1.731683e-04 7 1.315332e-04 0.128961 2.233203e-05 8 1.350294e-05 0.102658 2.292562e-06 9 4.148659e-06 0.307241 7.043691e-07 hypre-2.33.0/src/test/TEST_examples/ex9.base000066400000000000000000000013701477326011500205210ustar00rootroot00000000000000L2 norm of b: 7.462265e-03 Initial L2 norm of residual: 7.462265e-03 ============================================= Iters resid.norm conv.rate rel.res.norm ----- ------------ ---------- ------------ 1 6.660001e-03 0.892491 8.924906e-01 2 2.759090e-03 0.414278 3.697390e-01 3 4.353188e-04 0.157776 5.833602e-02 4 4.825748e-05 0.110855 6.466868e-03 5 6.747336e-06 0.139819 9.041942e-04 6 1.360981e-06 0.201706 1.823818e-04 7 2.456101e-07 0.180465 3.291361e-05 8 2.794506e-08 0.113778 3.744850e-06 9 4.903805e-09 0.175480 6.571470e-07 Final L2 norm of residual: 4.903805e-09 Iterations = 9 Final Relative Residual Norm = 6.57147e-07 hypre-2.33.0/src/test/TEST_examples/fortran_examples.jobs000077500000000000000000000012751477326011500234170ustar00rootroot00000000000000#!/bin/bash # Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) #============================================================================= # Run each example #============================================================================= mpirun -np 2 ./ex1_for > fortran_examples.out.1 mpirun -np 16 ./ex3_for -n 33 -solver 0 -v 1 1 > fortran_examples.out.3 mpirun -np 4 ./ex5_for > fortran_examples.out.5 mpirun -np 2 ./ex6_for > fortran_examples.out.6 mpirun -np 16 ./ex7_for -n 33 -solver 10 -K 3 -B 0 -C 1 -UO 2 -F 4 > fortran_examples.out.7 hypre-2.33.0/src/test/TEST_examples/fortran_examples.sh000077500000000000000000000035421477326011500230730ustar00rootroot00000000000000#!/bin/bash # Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) #============================================================================= # FORTRAN_EXAMPLES: compare fortran_examples.out.* with ex*.base files #============================================================================= tail -21 fortran_examples.out.1 > fortran_examples.test.tmp1 head fortran_examples.test.tmp1 > fortran_examples.test1 tail -21 ex1.base > fortran_examples.base.tmp1 head fortran_examples.base.tmp1 > fortran_examples.base1 diff fortran_examples.base1 fortran_examples.test1 >&2 tail -21 fortran_examples.out.3 > fortran_examples.test.tmp3 head fortran_examples.test.tmp3 > fortran_examples.test3 tail -21 ex3.base > fortran_examples.base.tmp3 head fortran_examples.base.tmp3 > fortran_examples.base3 diff fortran_examples.base3 fortran_examples.test3 >&2 tail -21 fortran_examples.out.5 > fortran_examples.test.tmp5 head fortran_examples.test.tmp5 > fortran_examples.test5 tail -21 ex5.base > fortran_examples.base.tmp5 head fortran_examples.base.tmp5 > fortran_examples.base5 diff fortran_examples.base5 fortran_examples.test5 >&2 tail -21 fortran_examples.out.6 > fortran_examples.test.tmp6 head fortran_examples.test.tmp6 > fortran_examples.test6 tail -21 ex6.base > fortran_examples.base.tmp6 head fortran_examples.base.tmp6 > fortran_examples.base6 diff fortran_examples.base6 fortran_examples.test6 >&2 tail -21 fortran_examples.out.7 > fortran_examples.test.tmp7 head fortran_examples.test.tmp7 > fortran_examples.test7 tail -21 ex7.base > fortran_examples.base.tmp7 head fortran_examples.base.tmp7 > fortran_examples.base7 diff fortran_examples.base7 fortran_examples.test7 >&2 rm -f fortran_examples.base* fortran_examples.test* hypre-2.33.0/src/test/TEST_examples/gpu.jobs000077500000000000000000000020741477326011500206370ustar00rootroot00000000000000#!/bin/bash # Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) #============================================================================= # Run each example #============================================================================= mpirun -np 2 ./ex1 > gpu.out.1 mpirun -np 2 ./ex2 > gpu.out.2 mpirun -np 16 ./ex3 -n 33 -solver 0 -v 1 1 > gpu.out.3 mpirun -np 16 ./ex4 -n 33 -solver 10 -K 3 -B 0 -C 1 -UO 2 -F 4 > gpu.out.4 mpirun -np 4 ./ex5 > gpu.out.5 mpirun -np 4 ./ex5f > gpu.out.5f mpirun -np 2 ./ex6 > gpu.out.6 mpirun -np 16 ./ex7 -n 33 -solver 10 -K 3 -B 0 -C 1 -UO 2 -F 4 > gpu.out.7 mpirun -np 2 ./ex8 > gpu.out.8 mpirun -np 16 ./ex9 -n 33 -solver 0 -v 1 1 > gpu.out.9 # mpirun -np 4 ./ex11 > gpu.out.11 mpirun -np 2 ./ex12 -pfmg > gpu.out.12 mpirun -np 2 ./ex12f -pfmg > gpu.out.12f mpirun -np 6 ./ex13 -n 10 > gpu.out.13 mpirun -np 6 ./ex14 -n 10 > gpu.out.14 # mpirun -np 8 ./ex15 -n 10 > gpu.out.15 hypre-2.33.0/src/test/TEST_examples/gpu.saved.lassen000066400000000000000000000033531477326011500222660ustar00rootroot00000000000000# Output file: gpu.out.1 11 5.329671e-05 0.179526 1.256215e-05 12 7.308483e-06 0.137128 1.722626e-06 13 7.411552e-07 0.101410 1.746920e-07 # Output file: gpu.out.2 1 3.503257e-02 0.004729 4.728807e-03 2 1.386843e-04 0.003959 1.872005e-05 3 8.429961e-07 0.006079 1.137903e-07 # Output file: gpu.out.3 Iterations = 5 Final Relative Residual Norm = 9.21374e-08 # Output file: gpu.out.4 Iterations = 6 Final Relative Residual Norm = 5.961443e-08 # Output file: gpu.out.5 Iterations = 6 Final Relative Residual Norm = 8.921046e-08 # Output file: gpu.out.5f Iterations = 6 Final Relative Residual Norm = 8.92104626E-08 # Output file: gpu.out.6 1 3.503257e-02 0.004729 4.728807e-03 2 1.386843e-04 0.003959 1.872005e-05 3 8.429961e-07 0.006079 1.137903e-07 # Output file: gpu.out.7 Iterations = 6 Final Relative Residual Norm = 5.961443e-08 # Output file: gpu.out.8 7 1.315332e-04 0.128961 2.233203e-05 8 1.350294e-05 0.102658 2.292562e-06 9 4.148659e-06 0.307241 7.043691e-07 # Output file: gpu.out.9 Iterations = 9 Final Relative Residual Norm = 6.57147e-07 # Output file: gpu.out.12 2 3.255341e-03 0.014358 5.745609e-04 3 6.649011e-05 0.020425 1.173537e-05 4 1.544291e-06 0.023226 2.725642e-07 # Output file: gpu.out.12f 2 3.255341e-03 0.014358 5.745609e-04 3 6.649011e-05 0.020425 1.173537e-05 4 1.544291e-06 0.023226 2.725642e-07 # Output file: gpu.out.13 Iterations = 11 Final Relative Residual Norm = 9.59155e-07 # Output file: gpu.out.14 Iterations = 11 Final Relative Residual Norm = 9.59155e-07 hypre-2.33.0/src/test/TEST_examples/gpu.sh000077500000000000000000000020211477326011500203040ustar00rootroot00000000000000#!/bin/bash # Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) TNAME=`basename $0 .sh` #============================================================================= # compare with baseline case #============================================================================= FILES="\ ${TNAME}.out.1\ ${TNAME}.out.2\ ${TNAME}.out.3\ ${TNAME}.out.4\ ${TNAME}.out.5\ ${TNAME}.out.5f\ ${TNAME}.out.6\ ${TNAME}.out.7\ ${TNAME}.out.8\ ${TNAME}.out.9\ ${TNAME}.out.12\ ${TNAME}.out.12f\ ${TNAME}.out.13\ ${TNAME}.out.14\ " # ${TNAME}.out.11\ # Need to avoid output lines about "no global partition" for i in $FILES do echo "# Output file: $i" tail -5 $i done > ${TNAME}.out # Make sure that the output file is reasonable RUNCOUNT=8 OUTCOUNT=`grep "Iterations" ${TNAME}.out | wc -l` if [ "$OUTCOUNT" != "$RUNCOUNT" ]; then echo "Incorrect number of runs in ${TNAME}.out" >&2 fi hypre-2.33.0/src/test/TEST_examples/maxdim.jobs000077500000000000000000000007321477326011500213220ustar00rootroot00000000000000#!/bin/bash # Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) #============================================================================= # Run maxdim examples #============================================================================= mpirun -np 16 ./ex17 -n 10 > maxdim.out.1 mpirun -np 16 ./ex18 -n 4 > maxdim.out.2 hypre-2.33.0/src/test/TEST_examples/maxdim.sh000077500000000000000000000011271477326011500207760ustar00rootroot00000000000000#!/bin/bash # Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) #============================================================================= # EXAMPLES: Compare ex*.base files with maxdim.out.* files from current runs # differences (except for timings) indicate errors #============================================================================= diff -U3 -bI"time" ex17.base maxdim.out.1 >&2 diff -U3 -bI"time" ex18.base maxdim.out.2 >&2 hypre-2.33.0/src/test/TEST_fac/000077500000000000000000000000001477326011500160725ustar00rootroot00000000000000hypre-2.33.0/src/test/TEST_fac/.psrc000066400000000000000000000002131477326011500170360ustar00rootroot00000000000000insure++.report_file insure.log insure++.report_overwrite false insure++.summarize leaks outstanding insure++.suppress EXPR_NULL,PARM_NULL hypre-2.33.0/src/test/TEST_fac/3lev.in000066400000000000000000000600451477326011500173000ustar00rootroot00000000000000# Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) ###################################################### # GridCreate: ndim nparts GridCreate: 3 3 ############################################################# # GridSetExtents: part ilower(ndim) iupper(ndim) GridSetExtents: 0 (1- 1- 1-) (8+ 8+ 8+) GridSetExtents: 1 (4- 4- 4-) (11+ 11+ 11+) GridSetExtents: 2 (14- 14- 14-) (19+ 19+ 19+) ############################################################# # GridSetVariables: part nvars vartypes[nvars] # CELL = 0 # NODE = 1 # XFACE = 2 # YFACE = 3 # ZFACE = 4 # XEDGE = 5 # YEDGE = 6 # ZEDGE = 7 GridSetVariables: 0 1 [0] GridSetVariables: 1 1 [0] GridSetVariables: 2 1 [0] ############################################################# # StencilCreate: nstencils sizes[nstencils] StencilCreate: 1 [7] ############################################################# # StencilSetEntry: stencil_num entry offset[ndim] var value StencilSetEntry: 0 0 [ 0 0 0] 0 6.000000 StencilSetEntry: 0 1 [-1 0 0] 0 -1.000000 StencilSetEntry: 0 2 [ 1 0 0] 0 -1.000000 StencilSetEntry: 0 3 [ 0 -1 0] 0 -1.000000 StencilSetEntry: 0 4 [ 0 0 1] 0 -1.000000 StencilSetEntry: 0 5 [ 0 0 -1] 0 -1.000000 StencilSetEntry: 0 6 [ 0 1 0] 0 -1.000000 ############################################################# # GraphSetStencil: part var stencil_num GraphSetStencil: 0 0 0 GraphSetStencil: 1 0 0 GraphSetStencil: 2 0 0 ############################################################# # GraphAddEntries: \ # part ilower(ndim) iupper(ndim) stride[ndim] var \ # to_part to_ilower(ndim) to_iupper(ndim) to_stride[ndim] to_var \ # index_map[ndim] entry value GraphAddEntries: 0 (2- 2- 2-: -1 0 0) (2- 5+ 5+: -1 0 0) [1 1 1] 0 1 (4- 4- 4-: 0 0 1) (4- 11+ 11+: 0 -1 0) [1 2 2] 0 [0 1 2] 7 -0.250000 GraphAddEntries: 0 (2- 2- 2-: -1 0 0) (2- 5+ 5+: -1 0 0) [1 1 1] 0 1 (4- 4- 4-: 0 1 1) (4- 11+ 11+: 0 0 0) [1 2 2] 0 [0 1 2] 8 -0.250000 GraphAddEntries: 0 (2- 2- 2-: -1 0 0) (2- 5+ 5+: -1 0 0) [1 1 1] 0 1 (4- 4- 4-: 0 0 0) (4- 11+ 11+: 0 -1 -1) [1 2 2] 0 [0 1 2] 9 -0.250000 GraphAddEntries: 0 (2- 2- 2-: -1 0 0) (2- 5+ 5+: -1 0 0) [1 1 1] 0 1 (4- 4- 4-: 0 1 0) (4- 11+ 11+: 0 0 -1) [1 2 2] 0 [0 1 2] 10 -0.250000 GraphAddEntries: 0 (5+ 2- 2-: 1 0 0) (5+ 5+ 5+: 1 0 0) [1 1 1] 0 1 (11+ 4- 4-: 0 0 0) (11+ 11+ 11+: 0 -1 -1) [1 2 2] 0 [0 1 2] 7 -0.250000 GraphAddEntries: 0 (5+ 2- 2-: 1 0 0) (5+ 5+ 5+: 1 0 0) [1 1 1] 0 1 (11+ 4- 4-: 0 1 0) (11+ 11+ 11+: 0 0 -1) [1 2 2] 0 [0 1 2] 8 -0.250000 GraphAddEntries: 0 (5+ 2- 2-: 1 0 0) (5+ 5+ 5+: 1 0 0) [1 1 1] 0 1 (11+ 4- 4-: 0 0 1) (11+ 11+ 11+: 0 -1 0) [1 2 2] 0 [0 1 2] 9 -0.250000 GraphAddEntries: 0 (5+ 2- 2-: 1 0 0) (5+ 5+ 5+: 1 0 0) [1 1 1] 0 1 (11+ 4- 4-: 0 1 1) (11+ 11+ 11+: 0 0 0) [1 2 2] 0 [0 1 2] 10 -0.250000 GraphAddEntries: 0 (2- 2- 2-: 0 -1 0) (5+ 2- 5+: 0 -1 0) [1 1 1] 0 1 (4- 4- 4-: 0 0 1) (11+ 4- 11+: -1 0 0) [2 1 2] 0 [0 1 2] 7 -0.250000 GraphAddEntries: 0 (2- 2- 2-: 0 -1 0) (5+ 2- 5+: 0 -1 0) [1 1 1] 0 1 (4- 4- 4-: 0 0 0) (11+ 4- 11+: -1 0 -1) [2 1 2] 0 [0 1 2] 8 -0.250000 GraphAddEntries: 0 (2- 2- 2-: 0 -1 0) (5+ 2- 5+: 0 -1 0) [1 1 1] 0 1 (4- 4- 4-: 1 0 1) (11+ 4- 11+: 0 0 0) [2 1 2] 0 [0 1 2] 9 -0.250000 GraphAddEntries: 0 (2- 2- 2-: 0 -1 0) (5+ 2- 5+: 0 -1 0) [1 1 1] 0 1 (4- 4- 4-: 1 0 0) (11+ 4- 11+: 0 0 -1) [2 1 2] 0 [0 1 2] 10 -0.250000 GraphAddEntries: 0 (2- 5+ 2-: 0 1 0) (5+ 5+ 5+: 0 1 0) [1 1 1] 0 1 (4- 11+ 4-: 0 0 0) (11+ 11+ 11+: -1 0 -1) [2 1 2] 0 [0 1 2] 7 -0.250000 GraphAddEntries: 0 (2- 5+ 2-: 0 1 0) (5+ 5+ 5+: 0 1 0) [1 1 1] 0 1 (4- 11+ 4-: 0 0 1) (11+ 11+ 11+: -1 0 0) [2 1 2] 0 [0 1 2] 8 -0.250000 GraphAddEntries: 0 (2- 5+ 2-: 0 1 0) (5+ 5+ 5+: 0 1 0) [1 1 1] 0 1 (4- 11+ 4-: 1 0 0) (11+ 11+ 11+: 0 0 -1) [2 1 2] 0 [0 1 2] 9 -0.250000 GraphAddEntries: 0 (2- 5+ 2-: 0 1 0) (5+ 5+ 5+: 0 1 0) [1 1 1] 0 1 (4- 11+ 4-: 1 0 1) (11+ 11+ 11+: 0 0 0) [2 1 2] 0 [0 1 2] 10 -0.250000 GraphAddEntries: 0 (2- 2- 2-: 0 0 -1) (5+ 5+ 2-: 0 0 -1) [1 1 1] 0 1 (4- 4- 4-: 0 0 0) (11+ 11+ 4-: -1 -1 0) [2 2 1] 0 [0 1 2] 7 -0.250000 GraphAddEntries: 0 (2- 2- 2-: 0 0 -1) (5+ 5+ 2-: 0 0 -1) [1 1 1] 0 1 (4- 4- 4-: 0 1 0) (11+ 11+ 4-: -1 0 0) [2 2 1] 0 [0 1 2] 8 -0.250000 GraphAddEntries: 0 (2- 2- 2-: 0 0 -1) (5+ 5+ 2-: 0 0 -1) [1 1 1] 0 1 (4- 4- 4-: 1 0 0) (11+ 11+ 4-: 0 -1 0) [2 2 1] 0 [0 1 2] 9 -0.250000 GraphAddEntries: 0 (2- 2- 2-: 0 0 -1) (5+ 5+ 2-: 0 0 -1) [1 1 1] 0 1 (4- 4- 4-: 1 1 0) (11+ 11+ 4-: 0 0 0) [2 2 1] 0 [0 1 2] 10 -0.250000 GraphAddEntries: 0 (2- 2- 5+: 0 0 1) (5+ 5+ 5+: 0 0 1) [1 1 1] 0 1 (4- 4- 11+: 1 0 0) (11+ 11+ 11+: 0 -1 0) [2 2 1] 0 [0 1 2] 7 -0.250000 GraphAddEntries: 0 (2- 2- 5+: 0 0 1) (5+ 5+ 5+: 0 0 1) [1 1 1] 0 1 (4- 4- 11+: 1 1 0) (11+ 11+ 11+: 0 0 0) [2 2 1] 0 [0 1 2] 8 -0.250000 GraphAddEntries: 0 (2- 2- 5+: 0 0 1) (5+ 5+ 5+: 0 0 1) [1 1 1] 0 1 (4- 4- 11+: 0 0 0) (11+ 11+ 11+: -1 -1 0) [2 2 1] 0 [0 1 2] 9 -0.250000 GraphAddEntries: 0 (2- 2- 5+: 0 0 1) (5+ 5+ 5+: 0 0 1) [1 1 1] 0 1 (4- 4- 11+: 0 1 0) (11+ 11+ 11+: -1 0 0) [2 2 1] 0 [0 1 2] 10 -0.250000 GraphAddEntries: 1 (4- 4- 4-: 0 0 1) (4- 11+ 11+: 0 -1 -2) [1 2 2] 0 0 (2- 2- 2-: -1 0 0) (2- 5+ 5+: -1 0 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 1 (4- 4- 4-: 0 1 1) (4- 11+ 11+: 0 0 -2) [1 2 2] 0 0 (2- 2- 2-: -1 0 0) (2- 5+ 5+: -1 0 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 1 (4- 4- 4-: 0 0 2) (4- 11+ 11+: 0 -1 -1) [1 2 2] 0 0 (2- 2- 2-: -1 0 1) (2- 5+ 5+: -1 0 0) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 1 (4- 4- 4-: 0 1 2) (4- 11+ 11+: 0 0 -1) [1 2 2] 0 0 (2- 2- 2-: -1 0 1) (2- 5+ 5+: -1 0 0) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 1 (11+ 4- 4-: 0 0 2) (11+ 11+ 11+: 0 -1 -1) [1 2 2] 0 0 (5+ 2- 2-: 1 0 1) (5+ 5+ 5+: 1 0 0) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 1 (11+ 4- 4-: 0 1 2) (11+ 11+ 11+: 0 0 -1) [1 2 2] 0 0 (5+ 2- 2-: 1 0 1) (5+ 5+ 5+: 1 0 0) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 1 (11+ 4- 4-: 0 0 1) (11+ 11+ 11+: 0 -1 -2) [1 2 2] 0 0 (5+ 2- 2-: 1 0 0) (5+ 5+ 5+: 1 0 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 1 (11+ 4- 4-: 0 1 1) (11+ 11+ 11+: 0 0 -2) [1 2 2] 0 0 (5+ 2- 2-: 1 0 0) (5+ 5+ 5+: 1 0 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 1 (4- 4- 4-: 2 0 1) (11+ 4- 11+: -1 0 -2) [2 1 2] 0 0 (2- 2- 2-: 1 -1 0) (5+ 2- 5+: 0 -1 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 1 (4- 4- 4-: 2 0 2) (11+ 4- 11+: -1 0 -1) [2 1 2] 0 0 (2- 2- 2-: 1 -1 1) (5+ 2- 5+: 0 -1 0) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 1 (4- 4- 4-: 1 0 1) (11+ 4- 11+: -2 0 -2) [2 1 2] 0 0 (2- 2- 2-: 0 -1 0) (5+ 2- 5+: -1 -1 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 1 (4- 4- 4-: 1 0 2) (11+ 4- 11+: -2 0 -1) [2 1 2] 0 0 (2- 2- 2-: 0 -1 1) (5+ 2- 5+: -1 -1 0) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 1 (4- 11+ 4-: 2 0 2) (11+ 11+ 11+: -1 0 -1) [2 1 2] 0 0 (2- 5+ 2-: 1 1 1) (5+ 5+ 5+: 0 1 0) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 1 (4- 11+ 4-: 2 0 1) (11+ 11+ 11+: -1 0 -2) [2 1 2] 0 0 (2- 5+ 2-: 1 1 0) (5+ 5+ 5+: 0 1 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 1 (4- 11+ 4-: 1 0 2) (11+ 11+ 11+: -2 0 -1) [2 1 2] 0 0 (2- 5+ 2-: 0 1 1) (5+ 5+ 5+: -1 1 0) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 1 (4- 11+ 4-: 1 0 1) (11+ 11+ 11+: -2 0 -2) [2 1 2] 0 0 (2- 5+ 2-: 0 1 0) (5+ 5+ 5+: -1 1 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 1 (4- 4- 4-: 0 0 0) (11+ 11+ 4-: -1 -1 0) [2 2 1] 0 0 (2- 2- 2-: 0 0 -1) (5+ 5+ 2-: 0 0 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 1 (4- 4- 4-: 0 1 0) (11+ 11+ 4-: -1 0 0) [2 2 1] 0 0 (2- 2- 2-: 0 0 -1) (5+ 5+ 2-: 0 0 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 1 (4- 4- 4-: 1 0 0) (11+ 11+ 4-: 0 -1 0) [2 2 1] 0 0 (2- 2- 2-: 0 0 -1) (5+ 5+ 2-: 0 0 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 1 (4- 4- 4-: 1 1 0) (11+ 11+ 4-: 0 0 0) [2 2 1] 0 0 (2- 2- 2-: 0 0 -1) (5+ 5+ 2-: 0 0 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 1 (4- 4- 11+: 1 0 0) (11+ 11+ 11+: 0 -1 0) [2 2 1] 0 0 (2- 2- 5+: 0 0 1) (5+ 5+ 5+: 0 0 1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 1 (4- 4- 11+: 1 1 0) (11+ 11+ 11+: 0 0 0) [2 2 1] 0 0 (2- 2- 5+: 0 0 1) (5+ 5+ 5+: 0 0 1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 1 (4- 4- 11+: 0 0 0) (11+ 11+ 11+: -1 -1 0) [2 2 1] 0 0 (2- 2- 5+: 0 0 1) (5+ 5+ 5+: 0 0 1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 1 (4- 4- 11+: 0 1 0) (11+ 11+ 11+: -1 0 0) [2 2 1] 0 0 (2- 2- 5+: 0 0 1) (5+ 5+ 5+: 0 0 1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 1 (7- 7- 7-: -1 0 0) (7- 9+ 9+: -1 0 0) [1 1 1] 0 2 (14- 14- 14-: 0 0 1) (14- 19+ 19+: 0 -1 0) [1 2 2] 0 [0 1 2] 7 -0.250000 GraphAddEntries: 1 (7- 7- 7-: -1 0 0) (7- 9+ 9+: -1 0 0) [1 1 1] 0 2 (14- 14- 14-: 0 1 1) (14- 19+ 19+: 0 0 0) [1 2 2] 0 [0 1 2] 8 -0.250000 GraphAddEntries: 1 (7- 7- 7-: -1 0 0) (7- 9+ 9+: -1 0 0) [1 1 1] 0 2 (14- 14- 14-: 0 0 0) (14- 19+ 19+: 0 -1 -1) [1 2 2] 0 [0 1 2] 9 -0.250000 GraphAddEntries: 1 (7- 7- 7-: -1 0 0) (7- 9+ 9+: -1 0 0) [1 1 1] 0 2 (14- 14- 14-: 0 1 0) (14- 19+ 19+: 0 0 -1) [1 2 2] 0 [0 1 2] 10 -0.250000 GraphAddEntries: 1 (9+ 7- 7-: 1 0 0) (9+ 9+ 9+: 1 0 0) [1 1 1] 0 2 (19+ 14- 14-: 0 0 0) (19+ 19+ 19+: 0 -1 -1) [1 2 2] 0 [0 1 2] 7 -0.250000 GraphAddEntries: 1 (9+ 7- 7-: 1 0 0) (9+ 9+ 9+: 1 0 0) [1 1 1] 0 2 (19+ 14- 14-: 0 1 0) (19+ 19+ 19+: 0 0 -1) [1 2 2] 0 [0 1 2] 8 -0.250000 GraphAddEntries: 1 (9+ 7- 7-: 1 0 0) (9+ 9+ 9+: 1 0 0) [1 1 1] 0 2 (19+ 14- 14-: 0 0 1) (19+ 19+ 19+: 0 -1 0) [1 2 2] 0 [0 1 2] 9 -0.250000 GraphAddEntries: 1 (9+ 7- 7-: 1 0 0) (9+ 9+ 9+: 1 0 0) [1 1 1] 0 2 (19+ 14- 14-: 0 1 1) (19+ 19+ 19+: 0 0 0) [1 2 2] 0 [0 1 2] 10 -0.250000 GraphAddEntries: 1 (7- 7- 7-: 0 -1 0) (9+ 7- 9+: 0 -1 0) [1 1 1] 0 2 (14- 14- 14-: 0 0 1) (19+ 14- 19+: -1 0 0) [2 1 2] 0 [0 1 2] 7 -0.250000 GraphAddEntries: 1 (7- 7- 7-: 0 -1 0) (9+ 7- 9+: 0 -1 0) [1 1 1] 0 2 (14- 14- 14-: 0 0 0) (19+ 14- 19+: -1 0 -1) [2 1 2] 0 [0 1 2] 8 -0.250000 GraphAddEntries: 1 (7- 7- 7-: 0 -1 0) (9+ 7- 9+: 0 -1 0) [1 1 1] 0 2 (14- 14- 14-: 1 0 1) (19+ 14- 19+: 0 0 0) [2 1 2] 0 [0 1 2] 9 -0.250000 GraphAddEntries: 1 (7- 7- 7-: 0 -1 0) (9+ 7- 9+: 0 -1 0) [1 1 1] 0 2 (14- 14- 14-: 1 0 0) (19+ 14- 19+: 0 0 -1) [2 1 2] 0 [0 1 2] 10 -0.250000 GraphAddEntries: 1 (7- 9+ 7-: 0 1 0) (9+ 9+ 9+: 0 1 0) [1 1 1] 0 2 (14- 19+ 14-: 0 0 0) (19+ 19+ 19+: -1 0 -1) [2 1 2] 0 [0 1 2] 7 -0.250000 GraphAddEntries: 1 (7- 9+ 7-: 0 1 0) (9+ 9+ 9+: 0 1 0) [1 1 1] 0 2 (14- 19+ 14-: 0 0 1) (19+ 19+ 19+: -1 0 0) [2 1 2] 0 [0 1 2] 8 -0.250000 GraphAddEntries: 1 (7- 9+ 7-: 0 1 0) (9+ 9+ 9+: 0 1 0) [1 1 1] 0 2 (14- 19+ 14-: 1 0 0) (19+ 19+ 19+: 0 0 -1) [2 1 2] 0 [0 1 2] 9 -0.250000 GraphAddEntries: 1 (7- 9+ 7-: 0 1 0) (9+ 9+ 9+: 0 1 0) [1 1 1] 0 2 (14- 19+ 14-: 1 0 1) (19+ 19+ 19+: 0 0 0) [2 1 2] 0 [0 1 2] 10 -0.250000 GraphAddEntries: 1 (7- 7- 7-: 0 0 -1) (9+ 9+ 7-: 0 0 -1) [1 1 1] 0 2 (14- 14- 14-: 0 0 0) (19+ 19+ 14-: -1 -1 0) [2 2 1] 0 [0 1 2] 7 -0.250000 GraphAddEntries: 1 (7- 7- 7-: 0 0 -1) (9+ 9+ 7-: 0 0 -1) [1 1 1] 0 2 (14- 14- 14-: 0 1 0) (19+ 19+ 14-: -1 0 0) [2 2 1] 0 [0 1 2] 8 -0.250000 GraphAddEntries: 1 (7- 7- 7-: 0 0 -1) (9+ 9+ 7-: 0 0 -1) [1 1 1] 0 2 (14- 14- 14-: 1 0 0) (19+ 19+ 14-: 0 -1 0) [2 2 1] 0 [0 1 2] 9 -0.250000 GraphAddEntries: 1 (7- 7- 7-: 0 0 -1) (9+ 9+ 7-: 0 0 -1) [1 1 1] 0 2 (14- 14- 14-: 1 1 0) (19+ 19+ 14-: 0 0 0) [2 2 1] 0 [0 1 2] 10 -0.250000 GraphAddEntries: 1 (7- 7- 9+: 0 0 1) (9+ 9+ 9+: 0 0 1) [1 1 1] 0 2 (14- 14- 19+: 1 0 0) (19+ 19+ 19+: 0 -1 0) [2 2 1] 0 [0 1 2] 7 -0.250000 GraphAddEntries: 1 (7- 7- 9+: 0 0 1) (9+ 9+ 9+: 0 0 1) [1 1 1] 0 2 (14- 14- 19+: 1 1 0) (19+ 19+ 19+: 0 0 0) [2 2 1] 0 [0 1 2] 8 -0.250000 GraphAddEntries: 1 (7- 7- 9+: 0 0 1) (9+ 9+ 9+: 0 0 1) [1 1 1] 0 2 (14- 14- 19+: 0 0 0) (19+ 19+ 19+: -1 -1 0) [2 2 1] 0 [0 1 2] 9 -0.250000 GraphAddEntries: 1 (7- 7- 9+: 0 0 1) (9+ 9+ 9+: 0 0 1) [1 1 1] 0 2 (14- 14- 19+: 0 1 0) (19+ 19+ 19+: -1 0 0) [2 2 1] 0 [0 1 2] 10 -0.250000 GraphAddEntries: 1 (4- 4- 4-: 0 0 0) (4- 11+ 4-: 0 -1 0) [1 2 1] 0 0 (2- 2- 2-: -1 0 0) (2- 5+ 2-: -1 0 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 1 (4- 4- 4-: 0 1 0) (4- 11+ 4-: 0 0 0) [1 2 1] 0 0 (2- 2- 2-: -1 0 0) (2- 5+ 2-: -1 0 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 1 (11+ 4- 11+: 0 0 0) (11+ 11+ 11+: 0 -1 0) [1 2 1] 0 0 (5+ 2- 5+: 1 0 0) (5+ 5+ 5+: 1 0 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 1 (11+ 4- 11+: 0 1 0) (11+ 11+ 11+: 0 0 0) [1 2 1] 0 0 (5+ 2- 5+: 1 0 0) (5+ 5+ 5+: 1 0 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 1 (11+ 4- 4-: 0 0 0) (11+ 11+ 4-: 0 -1 0) [1 2 1] 0 0 (5+ 2- 2-: 1 0 0) (5+ 5+ 2-: 1 0 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 1 (11+ 4- 4-: 0 1 0) (11+ 11+ 4-: 0 0 0) [1 2 1] 0 0 (5+ 2- 2-: 1 0 0) (5+ 5+ 2-: 1 0 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 1 (4- 4- 11+: 0 0 0) (4- 11+ 11+: 0 -1 0) [1 2 1] 0 0 (2- 2- 5+: -1 0 0) (2- 5+ 5+: -1 0 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 1 (4- 4- 11+: 0 1 0) (4- 11+ 11+: 0 0 0) [1 2 1] 0 0 (2- 2- 5+: -1 0 0) (2- 5+ 5+: -1 0 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 1 (4- 4- 4-: 2 0 0) (11+ 4- 4-: -1 0 0) [2 1 1] 0 0 (2- 2- 2-: 1 -1 0) (5+ 2- 2-: 0 -1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 1 (4- 4- 4-: 0 0 2) (4- 4- 11+: 0 0 -1) [1 1 2] 0 0 (2- 2- 2-: 0 -1 1) (2- 2- 5+: 0 -1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 1 (4- 4- 11+: 2 0 0) (11+ 4- 11+: -1 0 0) [2 1 1] 0 0 (2- 2- 5+: 1 -1 0) (5+ 2- 5+: 0 -1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 1 (11+ 4- 4-: 0 0 2) (11+ 4- 11+: 0 0 -1) [1 1 2] 0 0 (5+ 2- 2-: 0 -1 1) (5+ 2- 5+: 0 -1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 1 (4- 4- 4-: 1 0 0) (11+ 4- 4-: -2 0 0) [2 1 1] 0 0 (2- 2- 2-: 0 -1 0) (5+ 2- 2-: -1 -1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 1 (4- 4- 4-: 0 0 1) (4- 4- 11+: 0 0 -2) [1 1 2] 0 0 (2- 2- 2-: 0 -1 0) (2- 2- 5+: 0 -1 -1) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 1 (4- 4- 11+: 1 0 0) (11+ 4- 11+: -2 0 0) [2 1 1] 0 0 (2- 2- 5+: 0 -1 0) (5+ 2- 5+: -1 -1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 1 (11+ 4- 4-: 0 0 1) (11+ 4- 11+: 0 0 -2) [1 1 2] 0 0 (5+ 2- 2-: 0 -1 0) (5+ 2- 5+: 0 -1 -1) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 1 (4- 11+ 4-: 2 0 0) (11+ 11+ 4-: -1 0 0) [2 1 1] 0 0 (2- 5+ 2-: 1 1 0) (5+ 5+ 2-: 0 1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 1 (4- 11+ 4-: 0 0 2) (4- 11+ 11+: 0 0 -1) [1 1 2] 0 0 (2- 5+ 2-: 0 1 1) (2- 5+ 5+: 0 1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 1 (4- 11+ 11+: 2 0 0) (11+ 11+ 11+: -1 0 0) [2 1 1] 0 0 (2- 5+ 5+: 1 1 0) (5+ 5+ 5+: 0 1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 1 (11+ 11+ 4-: 0 0 2) (11+ 11+ 11+: 0 0 -1) [1 1 2] 0 0 (5+ 5+ 2-: 0 1 1) (5+ 5+ 5+: 0 1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 1 (4- 11+ 4-: 1 0 0) (11+ 11+ 4-: -2 0 0) [2 1 1] 0 0 (2- 5+ 2-: 0 1 0) (5+ 5+ 2-: -1 1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 1 (4- 11+ 4-: 0 0 1) (4- 11+ 11+: 0 0 -2) [1 1 2] 0 0 (2- 5+ 2-: 0 1 0) (2- 5+ 5+: 0 1 -1) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 1 (4- 11+ 11+: 1 0 0) (11+ 11+ 11+: -2 0 0) [2 1 1] 0 0 (2- 5+ 5+: 0 1 0) (5+ 5+ 5+: -1 1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 1 (11+ 11+ 4-: 0 0 1) (11+ 11+ 11+: 0 0 -2) [1 1 2] 0 0 (5+ 5+ 2-: 0 1 0) (5+ 5+ 5+: 0 1 -1) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 1 (4- 4- 4-: 0 0 0) (4- 4- 4-: 0 0 0) [1 1 1] 0 0 (2- 2- 2-: 0 -1 0) (2- 2- 2-: 0 -1 0) [1 1 1] 0 [0 1 2] 9 -1.000000 GraphAddEntries: 1 (11+ 4- 4-: 0 0 0) (11+ 4- 4-: 0 0 0) [1 1 1] 0 0 (5+ 2- 2-: 0 -1 0) (5+ 2- 2-: 0 -1 0) [1 1 1] 0 [0 1 2] 9 -1.000000 GraphAddEntries: 1 (4- 4- 11+: 0 0 0) (4- 4- 11+: 0 0 0) [1 1 1] 0 0 (2- 2- 5+: 0 -1 0) (2- 2- 5+: 0 -1 0) [1 1 1] 0 [0 1 2] 9 -1.000000 GraphAddEntries: 1 (11+ 4- 11+: 0 0 0) (11+ 4- 11+: 0 0 0) [1 1 1] 0 0 (5+ 2- 5+: 0 -1 0) (5+ 2- 5+: 0 -1 0) [1 1 1] 0 [0 1 2] 9 -1.000000 GraphAddEntries: 1 (4- 11+ 4-: 0 0 0) (4- 11+ 4-: 0 0 0) [1 1 1] 0 0 (2- 5+ 2-: 0 1 0) (2- 5+ 2-: 0 1 0) [1 1 1] 0 [0 1 2] 9 -1.000000 GraphAddEntries: 1 (11+ 11+ 4-: 0 0 0) (11+ 11+ 4-: 0 0 0) [1 1 1] 0 0 (5+ 5+ 2-: 0 1 0) (5+ 5+ 2-: 0 1 0) [1 1 1] 0 [0 1 2] 9 -1.000000 GraphAddEntries: 1 (4- 11+ 11+: 0 0 0) (4- 11+ 11+: 0 0 0) [1 1 1] 0 0 (2- 5+ 5+: 0 1 0) (2- 5+ 5+: 0 1 0) [1 1 1] 0 [0 1 2] 9 -1.000000 GraphAddEntries: 1 (11+ 11+ 11+: 0 0 0) (11+ 11+ 11+: 0 0 0) [1 1 1] 0 0 (5+ 5+ 5+: 0 1 0) (5+ 5+ 5+: 0 1 0) [1 1 1] 0 [0 1 2] 9 -1.000000 GraphAddEntries: 2 (14- 14- 14-: 0 0 1) (14- 19+ 19+: 0 -1 -2) [1 2 2] 0 1 (7- 7- 7-: -1 0 0) (7- 9+ 9+: -1 0 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 2 (14- 14- 14-: 0 1 1) (14- 19+ 19+: 0 0 -2) [1 2 2] 0 1 (7- 7- 7-: -1 0 0) (7- 9+ 9+: -1 0 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 2 (14- 14- 14-: 0 0 2) (14- 19+ 19+: 0 -1 -1) [1 2 2] 0 1 (7- 7- 7-: -1 0 1) (7- 9+ 9+: -1 0 0) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 2 (14- 14- 14-: 0 1 2) (14- 19+ 19+: 0 0 -1) [1 2 2] 0 1 (7- 7- 7-: -1 0 1) (7- 9+ 9+: -1 0 0) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 2 (19+ 14- 14-: 0 0 2) (19+ 19+ 19+: 0 -1 -1) [1 2 2] 0 1 (9+ 7- 7-: 1 0 1) (9+ 9+ 9+: 1 0 0) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 2 (19+ 14- 14-: 0 1 2) (19+ 19+ 19+: 0 0 -1) [1 2 2] 0 1 (9+ 7- 7-: 1 0 1) (9+ 9+ 9+: 1 0 0) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 2 (19+ 14- 14-: 0 0 1) (19+ 19+ 19+: 0 -1 -2) [1 2 2] 0 1 (9+ 7- 7-: 1 0 0) (9+ 9+ 9+: 1 0 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 2 (19+ 14- 14-: 0 1 1) (19+ 19+ 19+: 0 0 -2) [1 2 2] 0 1 (9+ 7- 7-: 1 0 0) (9+ 9+ 9+: 1 0 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 2 (14- 14- 14-: 2 0 1) (19+ 14- 19+: -1 0 -2) [2 1 2] 0 1 (7- 7- 7-: 1 -1 0) (9+ 7- 9+: 0 -1 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 2 (14- 14- 14-: 2 0 2) (19+ 14- 19+: -1 0 -1) [2 1 2] 0 1 (7- 7- 7-: 1 -1 1) (9+ 7- 9+: 0 -1 0) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 2 (14- 14- 14-: 1 0 1) (19+ 14- 19+: -2 0 -2) [2 1 2] 0 1 (7- 7- 7-: 0 -1 0) (9+ 7- 9+: -1 -1 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 2 (14- 14- 14-: 1 0 2) (19+ 14- 19+: -2 0 -1) [2 1 2] 0 1 (7- 7- 7-: 0 -1 1) (9+ 7- 9+: -1 -1 0) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 2 (14- 19+ 14-: 2 0 2) (19+ 19+ 19+: -1 0 -1) [2 1 2] 0 1 (7- 9+ 7-: 1 1 1) (9+ 9+ 9+: 0 1 0) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 2 (14- 19+ 14-: 2 0 1) (19+ 19+ 19+: -1 0 -2) [2 1 2] 0 1 (7- 9+ 7-: 1 1 0) (9+ 9+ 9+: 0 1 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 2 (14- 19+ 14-: 1 0 2) (19+ 19+ 19+: -2 0 -1) [2 1 2] 0 1 (7- 9+ 7-: 0 1 1) (9+ 9+ 9+: -1 1 0) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 2 (14- 19+ 14-: 1 0 1) (19+ 19+ 19+: -2 0 -2) [2 1 2] 0 1 (7- 9+ 7-: 0 1 0) (9+ 9+ 9+: -1 1 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 2 (14- 14- 14-: 0 0 0) (19+ 19+ 14-: -1 -1 0) [2 2 1] 0 1 (7- 7- 7-: 0 0 -1) (9+ 9+ 7-: 0 0 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 2 (14- 14- 14-: 0 1 0) (19+ 19+ 14-: -1 0 0) [2 2 1] 0 1 (7- 7- 7-: 0 0 -1) (9+ 9+ 7-: 0 0 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 2 (14- 14- 14-: 1 0 0) (19+ 19+ 14-: 0 -1 0) [2 2 1] 0 1 (7- 7- 7-: 0 0 -1) (9+ 9+ 7-: 0 0 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 2 (14- 14- 14-: 1 1 0) (19+ 19+ 14-: 0 0 0) [2 2 1] 0 1 (7- 7- 7-: 0 0 -1) (9+ 9+ 7-: 0 0 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 2 (14- 14- 19+: 1 0 0) (19+ 19+ 19+: 0 -1 0) [2 2 1] 0 1 (7- 7- 9+: 0 0 1) (9+ 9+ 9+: 0 0 1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 2 (14- 14- 19+: 1 1 0) (19+ 19+ 19+: 0 0 0) [2 2 1] 0 1 (7- 7- 9+: 0 0 1) (9+ 9+ 9+: 0 0 1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 2 (14- 14- 19+: 0 0 0) (19+ 19+ 19+: -1 -1 0) [2 2 1] 0 1 (7- 7- 9+: 0 0 1) (9+ 9+ 9+: 0 0 1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 2 (14- 14- 19+: 0 1 0) (19+ 19+ 19+: -1 0 0) [2 2 1] 0 1 (7- 7- 9+: 0 0 1) (9+ 9+ 9+: 0 0 1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 2 (14- 14- 14-: 0 0 0) (14- 19+ 14-: 0 -1 0) [1 2 1] 0 1 (7- 7- 7-: -1 0 0) (7- 9+ 7-: -1 0 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 2 (14- 14- 14-: 0 1 0) (14- 19+ 14-: 0 0 0) [1 2 1] 0 1 (7- 7- 7-: -1 0 0) (7- 9+ 7-: -1 0 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 2 (19+ 14- 19+: 0 0 0) (19+ 19+ 19+: 0 -1 0) [1 2 1] 0 1 (9+ 7- 9+: 1 0 0) (9+ 9+ 9+: 1 0 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 2 (19+ 14- 19+: 0 1 0) (19+ 19+ 19+: 0 0 0) [1 2 1] 0 1 (9+ 7- 9+: 1 0 0) (9+ 9+ 9+: 1 0 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 2 (19+ 14- 14-: 0 0 0) (19+ 19+ 14-: 0 -1 0) [1 2 1] 0 1 (9+ 7- 7-: 1 0 0) (9+ 9+ 7-: 1 0 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 2 (19+ 14- 14-: 0 1 0) (19+ 19+ 14-: 0 0 0) [1 2 1] 0 1 (9+ 7- 7-: 1 0 0) (9+ 9+ 7-: 1 0 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 2 (14- 14- 19+: 0 0 0) (14- 19+ 19+: 0 -1 0) [1 2 1] 0 1 (7- 7- 9+: -1 0 0) (7- 9+ 9+: -1 0 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 2 (14- 14- 19+: 0 1 0) (14- 19+ 19+: 0 0 0) [1 2 1] 0 1 (7- 7- 9+: -1 0 0) (7- 9+ 9+: -1 0 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 2 (14- 14- 14-: 2 0 0) (19+ 14- 14-: -1 0 0) [2 1 1] 0 1 (7- 7- 7-: 1 -1 0) (9+ 7- 7-: 0 -1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 2 (14- 14- 14-: 0 0 2) (14- 14- 19+: 0 0 -1) [1 1 2] 0 1 (7- 7- 7-: 0 -1 1) (7- 7- 9+: 0 -1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 2 (14- 14- 19+: 2 0 0) (19+ 14- 19+: -1 0 0) [2 1 1] 0 1 (7- 7- 9+: 1 -1 0) (9+ 7- 9+: 0 -1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 2 (19+ 14- 14-: 0 0 2) (19+ 14- 19+: 0 0 -1) [1 1 2] 0 1 (9+ 7- 7-: 0 -1 1) (9+ 7- 9+: 0 -1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 2 (14- 14- 14-: 1 0 0) (19+ 14- 14-: -2 0 0) [2 1 1] 0 1 (7- 7- 7-: 0 -1 0) (9+ 7- 7-: -1 -1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 2 (14- 14- 14-: 0 0 1) (14- 14- 19+: 0 0 -2) [1 1 2] 0 1 (7- 7- 7-: 0 -1 0) (7- 7- 9+: 0 -1 -1) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 2 (14- 14- 19+: 1 0 0) (19+ 14- 19+: -2 0 0) [2 1 1] 0 1 (7- 7- 9+: 0 -1 0) (9+ 7- 9+: -1 -1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 2 (19+ 14- 14-: 0 0 1) (19+ 14- 19+: 0 0 -2) [1 1 2] 0 1 (9+ 7- 7-: 0 -1 0) (9+ 7- 9+: 0 -1 -1) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 2 (14- 19+ 14-: 2 0 0) (19+ 19+ 14-: -1 0 0) [2 1 1] 0 1 (7- 9+ 7-: 1 1 0) (9+ 9+ 7-: 0 1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 2 (14- 19+ 14-: 0 0 2) (14- 19+ 19+: 0 0 -1) [1 1 2] 0 1 (7- 9+ 7-: 0 1 1) (7- 9+ 9+: 0 1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 2 (14- 19+ 19+: 2 0 0) (19+ 19+ 19+: -1 0 0) [2 1 1] 0 1 (7- 9+ 9+: 1 1 0) (9+ 9+ 9+: 0 1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 2 (19+ 19+ 14-: 0 0 2) (19+ 19+ 19+: 0 0 -1) [1 1 2] 0 1 (9+ 9+ 7-: 0 1 1) (9+ 9+ 9+: 0 1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 2 (14- 19+ 14-: 1 0 0) (19+ 19+ 14-: -2 0 0) [2 1 1] 0 1 (7- 9+ 7-: 0 1 0) (9+ 9+ 7-: -1 1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 2 (14- 19+ 14-: 0 0 1) (14- 19+ 19+: 0 0 -2) [1 1 2] 0 1 (7- 9+ 7-: 0 1 0) (7- 9+ 9+: 0 1 -1) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 2 (14- 19+ 19+: 1 0 0) (19+ 19+ 19+: -2 0 0) [2 1 1] 0 1 (7- 9+ 9+: 0 1 0) (9+ 9+ 9+: -1 1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 2 (19+ 19+ 14-: 0 0 1) (19+ 19+ 19+: 0 0 -2) [1 1 2] 0 1 (9+ 9+ 7-: 0 1 0) (9+ 9+ 9+: 0 1 -1) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 2 (14- 14- 14-: 0 0 0) (14- 14- 14-: 0 0 0) [1 1 1] 0 1 (7- 7- 7-: 0 -1 0) (7- 7- 7-: 0 -1 0) [1 1 1] 0 [0 1 2] 9 -1.000000 GraphAddEntries: 2 (19+ 14- 14-: 0 0 0) (19+ 14- 14-: 0 0 0) [1 1 1] 0 1 (9+ 7- 7-: 0 -1 0) (9+ 7- 7-: 0 -1 0) [1 1 1] 0 [0 1 2] 9 -1.000000 GraphAddEntries: 2 (14- 14- 19+: 0 0 0) (14- 14- 19+: 0 0 0) [1 1 1] 0 1 (7- 7- 9+: 0 -1 0) (7- 7- 9+: 0 -1 0) [1 1 1] 0 [0 1 2] 9 -1.000000 GraphAddEntries: 2 (19+ 14- 19+: 0 0 0) (19+ 14- 19+: 0 0 0) [1 1 1] 0 1 (9+ 7- 9+: 0 -1 0) (9+ 7- 9+: 0 -1 0) [1 1 1] 0 [0 1 2] 9 -1.000000 GraphAddEntries: 2 (14- 19+ 14-: 0 0 0) (14- 19+ 14-: 0 0 0) [1 1 1] 0 1 (7- 9+ 7-: 0 1 0) (7- 9+ 7-: 0 1 0) [1 1 1] 0 [0 1 2] 9 -1.000000 GraphAddEntries: 2 (19+ 19+ 14-: 0 0 0) (19+ 19+ 14-: 0 0 0) [1 1 1] 0 1 (9+ 9+ 7-: 0 1 0) (9+ 9+ 7-: 0 1 0) [1 1 1] 0 [0 1 2] 9 -1.000000 GraphAddEntries: 2 (14- 19+ 19+: 0 0 0) (14- 19+ 19+: 0 0 0) [1 1 1] 0 1 (7- 9+ 9+: 0 1 0) (7- 9+ 9+: 0 1 0) [1 1 1] 0 [0 1 2] 9 -1.000000 GraphAddEntries: 2 (19+ 19+ 19+: 0 0 0) (19+ 19+ 19+: 0 0 0) [1 1 1] 0 1 (9+ 9+ 9+: 0 1 0) (9+ 9+ 9+: 0 1 0) [1 1 1] 0 [0 1 2] 9 -1.000000 ############################################################# FacParts: 0 0 [1 1 1] FacParts: 1 1 [2 2 2] FacParts: 2 2 [2 2 2] ProcessPoolCreate: 1 # ProcessPoolSetPart: pool part ProcessPoolSetPart: 0 0 ProcessPoolSetPart: 0 1 ProcessPoolSetPart: 0 2 hypre-2.33.0/src/test/TEST_fac/3lev_multibox.in000066400000000000000000001361131477326011500212230ustar00rootroot00000000000000# Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) ###################################################### # GridCreate: ndim nparts GridCreate: 3 3 ############################################################# # GridSetExtents: part ilower(ndim) iupper(ndim) GridSetExtents: 0 (1- 1- 1-) (12+ 12+ 12+) GridSetExtents: 1 (4- 4- 4-) (11+ 11+ 11+) GridSetExtents: 1 (14- 14- 14-) (19+ 19+ 19+) GridSetExtents: 2 (10- 10- 10-) (21+ 21+ 21+) GridSetExtents: 2 (30- 30- 30-) (37+ 37+ 37+) ############################################################# # GridSetVariables: part nvars vartypes[nvars] # CELL = 0 # NODE = 1 # XFACE = 2 # YFACE = 3 # ZFACE = 4 # XEDGE = 5 # YEDGE = 6 # ZEDGE = 7 GridSetVariables: 0 1 [0] GridSetVariables: 1 1 [0] GridSetVariables: 2 1 [0] ############################################################# # StencilCreate: nstencils sizes[nstencils] StencilCreate: 1 [7] ############################################################# # StencilSetEntry: stencil_num entry offset[ndim] var value StencilSetEntry: 0 0 [ 0 0 0] 0 6.000000 StencilSetEntry: 0 1 [-1 0 0] 0 -1.000000 StencilSetEntry: 0 2 [ 1 0 0] 0 -1.000000 StencilSetEntry: 0 3 [ 0 -1 0] 0 -1.000000 StencilSetEntry: 0 4 [ 0 0 1] 0 -1.000000 StencilSetEntry: 0 5 [ 0 0 -1] 0 -1.000000 StencilSetEntry: 0 6 [ 0 1 0] 0 -1.000000 ############################################################# # GraphSetStencil: part var stencil_num GraphSetStencil: 0 0 0 GraphSetStencil: 1 0 0 GraphSetStencil: 2 0 0 ############################################################# # GraphAddEntries: \ # part ilower(ndim) iupper(ndim) stride[ndim] var \ # to_part to_ilower(ndim) to_iupper(ndim) to_stride[ndim] to_var \ # index_map[ndim] entry value GraphAddEntries: 0 (2- 2- 2-: -1 0 0) (2- 5+ 5+: -1 0 0) [1 1 1] 0 1 (4- 4- 4-: 0 0 1) (4- 11+ 11+: 0 -1 0) [1 2 2] 0 [0 1 2] 7 -0.250000 GraphAddEntries: 0 (2- 2- 2-: -1 0 0) (2- 5+ 5+: -1 0 0) [1 1 1] 0 1 (4- 4- 4-: 0 1 1) (4- 11+ 11+: 0 0 0) [1 2 2] 0 [0 1 2] 8 -0.250000 GraphAddEntries: 0 (2- 2- 2-: -1 0 0) (2- 5+ 5+: -1 0 0) [1 1 1] 0 1 (4- 4- 4-: 0 0 0) (4- 11+ 11+: 0 -1 -1) [1 2 2] 0 [0 1 2] 9 -0.250000 GraphAddEntries: 0 (2- 2- 2-: -1 0 0) (2- 5+ 5+: -1 0 0) [1 1 1] 0 1 (4- 4- 4-: 0 1 0) (4- 11+ 11+: 0 0 -1) [1 2 2] 0 [0 1 2] 10 -0.250000 GraphAddEntries: 0 (7- 7- 7-: -1 0 0) (7- 9+ 9+: -1 0 0) [1 1 1] 0 1 (14- 14- 14-: 0 0 1) (14- 19+ 19+: 0 -1 0) [1 2 2] 0 [0 1 2] 7 -0.250000 GraphAddEntries: 0 (7- 7- 7-: -1 0 0) (7- 9+ 9+: -1 0 0) [1 1 1] 0 1 (14- 14- 14-: 0 1 1) (14- 19+ 19+: 0 0 0) [1 2 2] 0 [0 1 2] 8 -0.250000 GraphAddEntries: 0 (7- 7- 7-: -1 0 0) (7- 9+ 9+: -1 0 0) [1 1 1] 0 1 (14- 14- 14-: 0 0 0) (14- 19+ 19+: 0 -1 -1) [1 2 2] 0 [0 1 2] 9 -0.250000 GraphAddEntries: 0 (7- 7- 7-: -1 0 0) (7- 9+ 9+: -1 0 0) [1 1 1] 0 1 (14- 14- 14-: 0 1 0) (14- 19+ 19+: 0 0 -1) [1 2 2] 0 [0 1 2] 10 -0.250000 GraphAddEntries: 0 (5+ 2- 2-: 1 0 0) (5+ 5+ 5+: 1 0 0) [1 1 1] 0 1 (11+ 4- 4-: 0 0 0) (11+ 11+ 11+: 0 -1 -1) [1 2 2] 0 [0 1 2] 7 -0.250000 GraphAddEntries: 0 (5+ 2- 2-: 1 0 0) (5+ 5+ 5+: 1 0 0) [1 1 1] 0 1 (11+ 4- 4-: 0 1 0) (11+ 11+ 11+: 0 0 -1) [1 2 2] 0 [0 1 2] 8 -0.250000 GraphAddEntries: 0 (5+ 2- 2-: 1 0 0) (5+ 5+ 5+: 1 0 0) [1 1 1] 0 1 (11+ 4- 4-: 0 0 1) (11+ 11+ 11+: 0 -1 0) [1 2 2] 0 [0 1 2] 9 -0.250000 GraphAddEntries: 0 (5+ 2- 2-: 1 0 0) (5+ 5+ 5+: 1 0 0) [1 1 1] 0 1 (11+ 4- 4-: 0 1 1) (11+ 11+ 11+: 0 0 0) [1 2 2] 0 [0 1 2] 10 -0.250000 GraphAddEntries: 0 (9+ 7- 7-: 1 0 0) (9+ 9+ 9+: 1 0 0) [1 1 1] 0 1 (19+ 14- 14-: 0 0 0) (19+ 19+ 19+: 0 -1 -1) [1 2 2] 0 [0 1 2] 7 -0.250000 GraphAddEntries: 0 (9+ 7- 7-: 1 0 0) (9+ 9+ 9+: 1 0 0) [1 1 1] 0 1 (19+ 14- 14-: 0 1 0) (19+ 19+ 19+: 0 0 -1) [1 2 2] 0 [0 1 2] 8 -0.250000 GraphAddEntries: 0 (9+ 7- 7-: 1 0 0) (9+ 9+ 9+: 1 0 0) [1 1 1] 0 1 (19+ 14- 14-: 0 0 1) (19+ 19+ 19+: 0 -1 0) [1 2 2] 0 [0 1 2] 9 -0.250000 GraphAddEntries: 0 (9+ 7- 7-: 1 0 0) (9+ 9+ 9+: 1 0 0) [1 1 1] 0 1 (19+ 14- 14-: 0 1 1) (19+ 19+ 19+: 0 0 0) [1 2 2] 0 [0 1 2] 10 -0.250000 GraphAddEntries: 0 (2- 2- 2-: 0 -1 0) (5+ 2- 5+: 0 -1 0) [1 1 1] 0 1 (4- 4- 4-: 0 0 1) (11+ 4- 11+: -1 0 0) [2 1 2] 0 [0 1 2] 7 -0.250000 GraphAddEntries: 0 (2- 2- 2-: 0 -1 0) (5+ 2- 5+: 0 -1 0) [1 1 1] 0 1 (4- 4- 4-: 0 0 0) (11+ 4- 11+: -1 0 -1) [2 1 2] 0 [0 1 2] 8 -0.250000 GraphAddEntries: 0 (2- 2- 2-: 0 -1 0) (5+ 2- 5+: 0 -1 0) [1 1 1] 0 1 (4- 4- 4-: 1 0 1) (11+ 4- 11+: 0 0 0) [2 1 2] 0 [0 1 2] 9 -0.250000 GraphAddEntries: 0 (2- 2- 2-: 0 -1 0) (5+ 2- 5+: 0 -1 0) [1 1 1] 0 1 (4- 4- 4-: 1 0 0) (11+ 4- 11+: 0 0 -1) [2 1 2] 0 [0 1 2] 10 -0.250000 GraphAddEntries: 0 (7- 7- 7-: 0 -1 0) (9+ 7- 9+: 0 -1 0) [1 1 1] 0 1 (14- 14- 14-: 0 0 1) (19+ 14- 19+: -1 0 0) [2 1 2] 0 [0 1 2] 7 -0.250000 GraphAddEntries: 0 (7- 7- 7-: 0 -1 0) (9+ 7- 9+: 0 -1 0) [1 1 1] 0 1 (14- 14- 14-: 0 0 0) (19+ 14- 19+: -1 0 -1) [2 1 2] 0 [0 1 2] 8 -0.250000 GraphAddEntries: 0 (7- 7- 7-: 0 -1 0) (9+ 7- 9+: 0 -1 0) [1 1 1] 0 1 (14- 14- 14-: 1 0 1) (19+ 14- 19+: 0 0 0) [2 1 2] 0 [0 1 2] 9 -0.250000 GraphAddEntries: 0 (7- 7- 7-: 0 -1 0) (9+ 7- 9+: 0 -1 0) [1 1 1] 0 1 (14- 14- 14-: 1 0 0) (19+ 14- 19+: 0 0 -1) [2 1 2] 0 [0 1 2] 10 -0.250000 GraphAddEntries: 0 (2- 5+ 2-: 0 1 0) (5+ 5+ 5+: 0 1 0) [1 1 1] 0 1 (4- 11+ 4-: 0 0 0) (11+ 11+ 11+: -1 0 -1) [2 1 2] 0 [0 1 2] 7 -0.250000 GraphAddEntries: 0 (2- 5+ 2-: 0 1 0) (5+ 5+ 5+: 0 1 0) [1 1 1] 0 1 (4- 11+ 4-: 0 0 1) (11+ 11+ 11+: -1 0 0) [2 1 2] 0 [0 1 2] 8 -0.250000 GraphAddEntries: 0 (2- 5+ 2-: 0 1 0) (5+ 5+ 5+: 0 1 0) [1 1 1] 0 1 (4- 11+ 4-: 1 0 0) (11+ 11+ 11+: 0 0 -1) [2 1 2] 0 [0 1 2] 9 -0.250000 GraphAddEntries: 0 (2- 5+ 2-: 0 1 0) (5+ 5+ 5+: 0 1 0) [1 1 1] 0 1 (4- 11+ 4-: 1 0 1) (11+ 11+ 11+: 0 0 0) [2 1 2] 0 [0 1 2] 10 -0.250000 GraphAddEntries: 0 (7- 9+ 7-: 0 1 0) (9+ 9+ 9+: 0 1 0) [1 1 1] 0 1 (14- 19+ 14-: 0 0 0) (19+ 19+ 19+: -1 0 -1) [2 1 2] 0 [0 1 2] 7 -0.250000 GraphAddEntries: 0 (7- 9+ 7-: 0 1 0) (9+ 9+ 9+: 0 1 0) [1 1 1] 0 1 (14- 19+ 14-: 0 0 1) (19+ 19+ 19+: -1 0 0) [2 1 2] 0 [0 1 2] 8 -0.250000 GraphAddEntries: 0 (7- 9+ 7-: 0 1 0) (9+ 9+ 9+: 0 1 0) [1 1 1] 0 1 (14- 19+ 14-: 1 0 0) (19+ 19+ 19+: 0 0 -1) [2 1 2] 0 [0 1 2] 9 -0.250000 GraphAddEntries: 0 (7- 9+ 7-: 0 1 0) (9+ 9+ 9+: 0 1 0) [1 1 1] 0 1 (14- 19+ 14-: 1 0 1) (19+ 19+ 19+: 0 0 0) [2 1 2] 0 [0 1 2] 10 -0.250000 GraphAddEntries: 0 (2- 2- 2-: 0 0 -1) (5+ 5+ 2-: 0 0 -1) [1 1 1] 0 1 (4- 4- 4-: 0 0 0) (11+ 11+ 4-: -1 -1 0) [2 2 1] 0 [0 1 2] 7 -0.250000 GraphAddEntries: 0 (2- 2- 2-: 0 0 -1) (5+ 5+ 2-: 0 0 -1) [1 1 1] 0 1 (4- 4- 4-: 0 1 0) (11+ 11+ 4-: -1 0 0) [2 2 1] 0 [0 1 2] 8 -0.250000 GraphAddEntries: 0 (2- 2- 2-: 0 0 -1) (5+ 5+ 2-: 0 0 -1) [1 1 1] 0 1 (4- 4- 4-: 1 0 0) (11+ 11+ 4-: 0 -1 0) [2 2 1] 0 [0 1 2] 9 -0.250000 GraphAddEntries: 0 (2- 2- 2-: 0 0 -1) (5+ 5+ 2-: 0 0 -1) [1 1 1] 0 1 (4- 4- 4-: 1 1 0) (11+ 11+ 4-: 0 0 0) [2 2 1] 0 [0 1 2] 10 -0.250000 GraphAddEntries: 0 (7- 7- 7-: 0 0 -1) (9+ 9+ 7-: 0 0 -1) [1 1 1] 0 1 (14- 14- 14-: 0 0 0) (19+ 19+ 14-: -1 -1 0) [2 2 1] 0 [0 1 2] 7 -0.250000 GraphAddEntries: 0 (7- 7- 7-: 0 0 -1) (9+ 9+ 7-: 0 0 -1) [1 1 1] 0 1 (14- 14- 14-: 0 1 0) (19+ 19+ 14-: -1 0 0) [2 2 1] 0 [0 1 2] 8 -0.250000 GraphAddEntries: 0 (7- 7- 7-: 0 0 -1) (9+ 9+ 7-: 0 0 -1) [1 1 1] 0 1 (14- 14- 14-: 1 0 0) (19+ 19+ 14-: 0 -1 0) [2 2 1] 0 [0 1 2] 9 -0.250000 GraphAddEntries: 0 (7- 7- 7-: 0 0 -1) (9+ 9+ 7-: 0 0 -1) [1 1 1] 0 1 (14- 14- 14-: 1 1 0) (19+ 19+ 14-: 0 0 0) [2 2 1] 0 [0 1 2] 10 -0.250000 GraphAddEntries: 0 (2- 2- 5+: 0 0 1) (5+ 5+ 5+: 0 0 1) [1 1 1] 0 1 (4- 4- 11+: 1 0 0) (11+ 11+ 11+: 0 -1 0) [2 2 1] 0 [0 1 2] 7 -0.250000 GraphAddEntries: 0 (2- 2- 5+: 0 0 1) (5+ 5+ 5+: 0 0 1) [1 1 1] 0 1 (4- 4- 11+: 1 1 0) (11+ 11+ 11+: 0 0 0) [2 2 1] 0 [0 1 2] 8 -0.250000 GraphAddEntries: 0 (2- 2- 5+: 0 0 1) (5+ 5+ 5+: 0 0 1) [1 1 1] 0 1 (4- 4- 11+: 0 0 0) (11+ 11+ 11+: -1 -1 0) [2 2 1] 0 [0 1 2] 9 -0.250000 GraphAddEntries: 0 (2- 2- 5+: 0 0 1) (5+ 5+ 5+: 0 0 1) [1 1 1] 0 1 (4- 4- 11+: 0 1 0) (11+ 11+ 11+: -1 0 0) [2 2 1] 0 [0 1 2] 10 -0.250000 GraphAddEntries: 0 (7- 7- 9+: 0 0 1) (9+ 9+ 9+: 0 0 1) [1 1 1] 0 1 (14- 14- 19+: 1 0 0) (19+ 19+ 19+: 0 -1 0) [2 2 1] 0 [0 1 2] 7 -0.250000 GraphAddEntries: 0 (7- 7- 9+: 0 0 1) (9+ 9+ 9+: 0 0 1) [1 1 1] 0 1 (14- 14- 19+: 1 1 0) (19+ 19+ 19+: 0 0 0) [2 2 1] 0 [0 1 2] 8 -0.250000 GraphAddEntries: 0 (7- 7- 9+: 0 0 1) (9+ 9+ 9+: 0 0 1) [1 1 1] 0 1 (14- 14- 19+: 0 0 0) (19+ 19+ 19+: -1 -1 0) [2 2 1] 0 [0 1 2] 9 -0.250000 GraphAddEntries: 0 (7- 7- 9+: 0 0 1) (9+ 9+ 9+: 0 0 1) [1 1 1] 0 1 (14- 14- 19+: 0 1 0) (19+ 19+ 19+: -1 0 0) [2 2 1] 0 [0 1 2] 10 -0.250000 GraphAddEntries: 1 (4- 4- 4-: 0 0 1) (4- 11+ 11+: 0 -1 -2) [1 2 2] 0 0 (2- 2- 2-: -1 0 0) (2- 5+ 5+: -1 0 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 1 (4- 4- 4-: 0 1 1) (4- 11+ 11+: 0 0 -2) [1 2 2] 0 0 (2- 2- 2-: -1 0 0) (2- 5+ 5+: -1 0 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 1 (4- 4- 4-: 0 0 2) (4- 11+ 11+: 0 -1 -1) [1 2 2] 0 0 (2- 2- 2-: -1 0 1) (2- 5+ 5+: -1 0 0) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 1 (4- 4- 4-: 0 1 2) (4- 11+ 11+: 0 0 -1) [1 2 2] 0 0 (2- 2- 2-: -1 0 1) (2- 5+ 5+: -1 0 0) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 1 (14- 14- 14-: 0 0 1) (14- 19+ 19+: 0 -1 -2) [1 2 2] 0 0 (7- 7- 7-: -1 0 0) (7- 9+ 9+: -1 0 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 1 (14- 14- 14-: 0 1 1) (14- 19+ 19+: 0 0 -2) [1 2 2] 0 0 (7- 7- 7-: -1 0 0) (7- 9+ 9+: -1 0 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 1 (14- 14- 14-: 0 0 2) (14- 19+ 19+: 0 -1 -1) [1 2 2] 0 0 (7- 7- 7-: -1 0 1) (7- 9+ 9+: -1 0 0) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 1 (14- 14- 14-: 0 1 2) (14- 19+ 19+: 0 0 -1) [1 2 2] 0 0 (7- 7- 7-: -1 0 1) (7- 9+ 9+: -1 0 0) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 1 (11+ 4- 4-: 0 0 2) (11+ 11+ 11+: 0 -1 -1) [1 2 2] 0 0 (5+ 2- 2-: 1 0 1) (5+ 5+ 5+: 1 0 0) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 1 (11+ 4- 4-: 0 1 2) (11+ 11+ 11+: 0 0 -1) [1 2 2] 0 0 (5+ 2- 2-: 1 0 1) (5+ 5+ 5+: 1 0 0) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 1 (11+ 4- 4-: 0 0 1) (11+ 11+ 11+: 0 -1 -2) [1 2 2] 0 0 (5+ 2- 2-: 1 0 0) (5+ 5+ 5+: 1 0 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 1 (11+ 4- 4-: 0 1 1) (11+ 11+ 11+: 0 0 -2) [1 2 2] 0 0 (5+ 2- 2-: 1 0 0) (5+ 5+ 5+: 1 0 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 1 (19+ 14- 14-: 0 0 2) (19+ 19+ 19+: 0 -1 -1) [1 2 2] 0 0 (9+ 7- 7-: 1 0 1) (9+ 9+ 9+: 1 0 0) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 1 (19+ 14- 14-: 0 1 2) (19+ 19+ 19+: 0 0 -1) [1 2 2] 0 0 (9+ 7- 7-: 1 0 1) (9+ 9+ 9+: 1 0 0) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 1 (19+ 14- 14-: 0 0 1) (19+ 19+ 19+: 0 -1 -2) [1 2 2] 0 0 (9+ 7- 7-: 1 0 0) (9+ 9+ 9+: 1 0 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 1 (19+ 14- 14-: 0 1 1) (19+ 19+ 19+: 0 0 -2) [1 2 2] 0 0 (9+ 7- 7-: 1 0 0) (9+ 9+ 9+: 1 0 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 1 (4- 4- 4-: 2 0 1) (11+ 4- 11+: -1 0 -2) [2 1 2] 0 0 (2- 2- 2-: 1 -1 0) (5+ 2- 5+: 0 -1 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 1 (4- 4- 4-: 2 0 2) (11+ 4- 11+: -1 0 -1) [2 1 2] 0 0 (2- 2- 2-: 1 -1 1) (5+ 2- 5+: 0 -1 0) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 1 (4- 4- 4-: 1 0 1) (11+ 4- 11+: -2 0 -2) [2 1 2] 0 0 (2- 2- 2-: 0 -1 0) (5+ 2- 5+: -1 -1 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 1 (4- 4- 4-: 1 0 2) (11+ 4- 11+: -2 0 -1) [2 1 2] 0 0 (2- 2- 2-: 0 -1 1) (5+ 2- 5+: -1 -1 0) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 1 (14- 14- 14-: 2 0 1) (19+ 14- 19+: -1 0 -2) [2 1 2] 0 0 (7- 7- 7-: 1 -1 0) (9+ 7- 9+: 0 -1 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 1 (14- 14- 14-: 2 0 2) (19+ 14- 19+: -1 0 -1) [2 1 2] 0 0 (7- 7- 7-: 1 -1 1) (9+ 7- 9+: 0 -1 0) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 1 (14- 14- 14-: 1 0 1) (19+ 14- 19+: -2 0 -2) [2 1 2] 0 0 (7- 7- 7-: 0 -1 0) (9+ 7- 9+: -1 -1 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 1 (14- 14- 14-: 1 0 2) (19+ 14- 19+: -2 0 -1) [2 1 2] 0 0 (7- 7- 7-: 0 -1 1) (9+ 7- 9+: -1 -1 0) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 1 (4- 11+ 4-: 2 0 2) (11+ 11+ 11+: -1 0 -1) [2 1 2] 0 0 (2- 5+ 2-: 1 1 1) (5+ 5+ 5+: 0 1 0) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 1 (4- 11+ 4-: 2 0 1) (11+ 11+ 11+: -1 0 -2) [2 1 2] 0 0 (2- 5+ 2-: 1 1 0) (5+ 5+ 5+: 0 1 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 1 (4- 11+ 4-: 1 0 2) (11+ 11+ 11+: -2 0 -1) [2 1 2] 0 0 (2- 5+ 2-: 0 1 1) (5+ 5+ 5+: -1 1 0) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 1 (4- 11+ 4-: 1 0 1) (11+ 11+ 11+: -2 0 -2) [2 1 2] 0 0 (2- 5+ 2-: 0 1 0) (5+ 5+ 5+: -1 1 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 1 (14- 19+ 14-: 2 0 2) (19+ 19+ 19+: -1 0 -1) [2 1 2] 0 0 (7- 9+ 7-: 1 1 1) (9+ 9+ 9+: 0 1 0) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 1 (14- 19+ 14-: 2 0 1) (19+ 19+ 19+: -1 0 -2) [2 1 2] 0 0 (7- 9+ 7-: 1 1 0) (9+ 9+ 9+: 0 1 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 1 (14- 19+ 14-: 1 0 2) (19+ 19+ 19+: -2 0 -1) [2 1 2] 0 0 (7- 9+ 7-: 0 1 1) (9+ 9+ 9+: -1 1 0) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 1 (14- 19+ 14-: 1 0 1) (19+ 19+ 19+: -2 0 -2) [2 1 2] 0 0 (7- 9+ 7-: 0 1 0) (9+ 9+ 9+: -1 1 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 1 (4- 4- 4-: 0 0 0) (11+ 11+ 4-: -1 -1 0) [2 2 1] 0 0 (2- 2- 2-: 0 0 -1) (5+ 5+ 2-: 0 0 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 1 (4- 4- 4-: 0 1 0) (11+ 11+ 4-: -1 0 0) [2 2 1] 0 0 (2- 2- 2-: 0 0 -1) (5+ 5+ 2-: 0 0 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 1 (4- 4- 4-: 1 0 0) (11+ 11+ 4-: 0 -1 0) [2 2 1] 0 0 (2- 2- 2-: 0 0 -1) (5+ 5+ 2-: 0 0 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 1 (4- 4- 4-: 1 1 0) (11+ 11+ 4-: 0 0 0) [2 2 1] 0 0 (2- 2- 2-: 0 0 -1) (5+ 5+ 2-: 0 0 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 1 (14- 14- 14-: 0 0 0) (19+ 19+ 14-: -1 -1 0) [2 2 1] 0 0 (7- 7- 7-: 0 0 -1) (9+ 9+ 7-: 0 0 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 1 (14- 14- 14-: 0 1 0) (19+ 19+ 14-: -1 0 0) [2 2 1] 0 0 (7- 7- 7-: 0 0 -1) (9+ 9+ 7-: 0 0 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 1 (14- 14- 14-: 1 0 0) (19+ 19+ 14-: 0 -1 0) [2 2 1] 0 0 (7- 7- 7-: 0 0 -1) (9+ 9+ 7-: 0 0 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 1 (14- 14- 14-: 1 1 0) (19+ 19+ 14-: 0 0 0) [2 2 1] 0 0 (7- 7- 7-: 0 0 -1) (9+ 9+ 7-: 0 0 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 1 (4- 4- 11+: 1 0 0) (11+ 11+ 11+: 0 -1 0) [2 2 1] 0 0 (2- 2- 5+: 0 0 1) (5+ 5+ 5+: 0 0 1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 1 (4- 4- 11+: 1 1 0) (11+ 11+ 11+: 0 0 0) [2 2 1] 0 0 (2- 2- 5+: 0 0 1) (5+ 5+ 5+: 0 0 1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 1 (4- 4- 11+: 0 0 0) (11+ 11+ 11+: -1 -1 0) [2 2 1] 0 0 (2- 2- 5+: 0 0 1) (5+ 5+ 5+: 0 0 1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 1 (4- 4- 11+: 0 1 0) (11+ 11+ 11+: -1 0 0) [2 2 1] 0 0 (2- 2- 5+: 0 0 1) (5+ 5+ 5+: 0 0 1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 1 (14- 14- 19+: 1 0 0) (19+ 19+ 19+: 0 -1 0) [2 2 1] 0 0 (7- 7- 9+: 0 0 1) (9+ 9+ 9+: 0 0 1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 1 (14- 14- 19+: 1 1 0) (19+ 19+ 19+: 0 0 0) [2 2 1] 0 0 (7- 7- 9+: 0 0 1) (9+ 9+ 9+: 0 0 1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 1 (14- 14- 19+: 0 0 0) (19+ 19+ 19+: -1 -1 0) [2 2 1] 0 0 (7- 7- 9+: 0 0 1) (9+ 9+ 9+: 0 0 1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 1 (14- 14- 19+: 0 1 0) (19+ 19+ 19+: -1 0 0) [2 2 1] 0 0 (7- 7- 9+: 0 0 1) (9+ 9+ 9+: 0 0 1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 1 (5- 5- 5-: -1 0 0) (5- 10+ 10+: -1 0 0) [1 1 1] 0 2 (10- 10- 10-: 0 0 1) (10- 21+ 21+: 0 -1 0) [1 2 2] 0 [0 1 2] 7 -0.250000 GraphAddEntries: 1 (5- 5- 5-: -1 0 0) (5- 10+ 10+: -1 0 0) [1 1 1] 0 2 (10- 10- 10-: 0 1 1) (10- 21+ 21+: 0 0 0) [1 2 2] 0 [0 1 2] 8 -0.250000 GraphAddEntries: 1 (5- 5- 5-: -1 0 0) (5- 10+ 10+: -1 0 0) [1 1 1] 0 2 (10- 10- 10-: 0 0 0) (10- 21+ 21+: 0 -1 -1) [1 2 2] 0 [0 1 2] 9 -0.250000 GraphAddEntries: 1 (5- 5- 5-: -1 0 0) (5- 10+ 10+: -1 0 0) [1 1 1] 0 2 (10- 10- 10-: 0 1 0) (10- 21+ 21+: 0 0 -1) [1 2 2] 0 [0 1 2] 10 -0.250000 GraphAddEntries: 1 (15- 15- 15-: -1 0 0) (15- 18+ 18+: -1 0 0) [1 1 1] 0 2 (30- 30- 30-: 0 0 1) (30- 37+ 37+: 0 -1 0) [1 2 2] 0 [0 1 2] 7 -0.250000 GraphAddEntries: 1 (15- 15- 15-: -1 0 0) (15- 18+ 18+: -1 0 0) [1 1 1] 0 2 (30- 30- 30-: 0 1 1) (30- 37+ 37+: 0 0 0) [1 2 2] 0 [0 1 2] 8 -0.250000 GraphAddEntries: 1 (15- 15- 15-: -1 0 0) (15- 18+ 18+: -1 0 0) [1 1 1] 0 2 (30- 30- 30-: 0 0 0) (30- 37+ 37+: 0 -1 -1) [1 2 2] 0 [0 1 2] 9 -0.250000 GraphAddEntries: 1 (15- 15- 15-: -1 0 0) (15- 18+ 18+: -1 0 0) [1 1 1] 0 2 (30- 30- 30-: 0 1 0) (30- 37+ 37+: 0 0 -1) [1 2 2] 0 [0 1 2] 10 -0.250000 GraphAddEntries: 1 (10+ 5- 5-: 1 0 0) (10+ 10+ 10+: 1 0 0) [1 1 1] 0 2 (21+ 10- 10-: 0 0 0) (21+ 21+ 21+: 0 -1 -1) [1 2 2] 0 [0 1 2] 7 -0.250000 GraphAddEntries: 1 (10+ 5- 5-: 1 0 0) (10+ 10+ 10+: 1 0 0) [1 1 1] 0 2 (21+ 10- 10-: 0 1 0) (21+ 21+ 21+: 0 0 -1) [1 2 2] 0 [0 1 2] 8 -0.250000 GraphAddEntries: 1 (10+ 5- 5-: 1 0 0) (10+ 10+ 10+: 1 0 0) [1 1 1] 0 2 (21+ 10- 10-: 0 0 1) (21+ 21+ 21+: 0 -1 0) [1 2 2] 0 [0 1 2] 9 -0.250000 GraphAddEntries: 1 (10+ 5- 5-: 1 0 0) (10+ 10+ 10+: 1 0 0) [1 1 1] 0 2 (21+ 10- 10-: 0 1 1) (21+ 21+ 21+: 0 0 0) [1 2 2] 0 [0 1 2] 10 -0.250000 GraphAddEntries: 1 (18+ 15- 15-: 1 0 0) (18+ 18+ 18+: 1 0 0) [1 1 1] 0 2 (37+ 30- 30-: 0 0 0) (37+ 37+ 37+: 0 -1 -1) [1 2 2] 0 [0 1 2] 7 -0.250000 GraphAddEntries: 1 (18+ 15- 15-: 1 0 0) (18+ 18+ 18+: 1 0 0) [1 1 1] 0 2 (37+ 30- 30-: 0 1 0) (37+ 37+ 37+: 0 0 -1) [1 2 2] 0 [0 1 2] 8 -0.250000 GraphAddEntries: 1 (18+ 15- 15-: 1 0 0) (18+ 18+ 18+: 1 0 0) [1 1 1] 0 2 (37+ 30- 30-: 0 0 1) (37+ 37+ 37+: 0 -1 0) [1 2 2] 0 [0 1 2] 9 -0.250000 GraphAddEntries: 1 (18+ 15- 15-: 1 0 0) (18+ 18+ 18+: 1 0 0) [1 1 1] 0 2 (37+ 30- 30-: 0 1 1) (37+ 37+ 37+: 0 0 0) [1 2 2] 0 [0 1 2] 10 -0.250000 GraphAddEntries: 1 (5- 5- 5-: 0 -1 0) (10+ 5- 10+: 0 -1 0) [1 1 1] 0 2 (10- 10- 10-: 0 0 1) (21+ 10- 21+: -1 0 0) [2 1 2] 0 [0 1 2] 7 -0.250000 GraphAddEntries: 1 (5- 5- 5-: 0 -1 0) (10+ 5- 10+: 0 -1 0) [1 1 1] 0 2 (10- 10- 10-: 0 0 0) (21+ 10- 21+: -1 0 -1) [2 1 2] 0 [0 1 2] 8 -0.250000 GraphAddEntries: 1 (5- 5- 5-: 0 -1 0) (10+ 5- 10+: 0 -1 0) [1 1 1] 0 2 (10- 10- 10-: 1 0 1) (21+ 10- 21+: 0 0 0) [2 1 2] 0 [0 1 2] 9 -0.250000 GraphAddEntries: 1 (5- 5- 5-: 0 -1 0) (10+ 5- 10+: 0 -1 0) [1 1 1] 0 2 (10- 10- 10-: 1 0 0) (21+ 10- 21+: 0 0 -1) [2 1 2] 0 [0 1 2] 10 -0.250000 GraphAddEntries: 1 (15- 15- 15-: 0 -1 0) (18+ 15- 18+: 0 -1 0) [1 1 1] 0 2 (30- 30- 30-: 0 0 1) (37+ 30- 37+: -1 0 0) [2 1 2] 0 [0 1 2] 7 -0.250000 GraphAddEntries: 1 (15- 15- 15-: 0 -1 0) (18+ 15- 18+: 0 -1 0) [1 1 1] 0 2 (30- 30- 30-: 0 0 0) (37+ 30- 37+: -1 0 -1) [2 1 2] 0 [0 1 2] 8 -0.250000 GraphAddEntries: 1 (15- 15- 15-: 0 -1 0) (18+ 15- 18+: 0 -1 0) [1 1 1] 0 2 (30- 30- 30-: 1 0 1) (37+ 30- 37+: 0 0 0) [2 1 2] 0 [0 1 2] 9 -0.250000 GraphAddEntries: 1 (15- 15- 15-: 0 -1 0) (18+ 15- 18+: 0 -1 0) [1 1 1] 0 2 (30- 30- 30-: 1 0 0) (37+ 30- 37+: 0 0 -1) [2 1 2] 0 [0 1 2] 10 -0.250000 GraphAddEntries: 1 (5- 10+ 5-: 0 1 0) (10+ 10+ 10+: 0 1 0) [1 1 1] 0 2 (10- 21+ 10-: 0 0 0) (21+ 21+ 21+: -1 0 -1) [2 1 2] 0 [0 1 2] 7 -0.250000 GraphAddEntries: 1 (5- 10+ 5-: 0 1 0) (10+ 10+ 10+: 0 1 0) [1 1 1] 0 2 (10- 21+ 10-: 0 0 1) (21+ 21+ 21+: -1 0 0) [2 1 2] 0 [0 1 2] 8 -0.250000 GraphAddEntries: 1 (5- 10+ 5-: 0 1 0) (10+ 10+ 10+: 0 1 0) [1 1 1] 0 2 (10- 21+ 10-: 1 0 0) (21+ 21+ 21+: 0 0 -1) [2 1 2] 0 [0 1 2] 9 -0.250000 GraphAddEntries: 1 (5- 10+ 5-: 0 1 0) (10+ 10+ 10+: 0 1 0) [1 1 1] 0 2 (10- 21+ 10-: 1 0 1) (21+ 21+ 21+: 0 0 0) [2 1 2] 0 [0 1 2] 10 -0.250000 GraphAddEntries: 1 (15- 18+ 15-: 0 1 0) (18+ 18+ 18+: 0 1 0) [1 1 1] 0 2 (30- 37+ 30-: 0 0 0) (37+ 37+ 37+: -1 0 -1) [2 1 2] 0 [0 1 2] 7 -0.250000 GraphAddEntries: 1 (15- 18+ 15-: 0 1 0) (18+ 18+ 18+: 0 1 0) [1 1 1] 0 2 (30- 37+ 30-: 0 0 1) (37+ 37+ 37+: -1 0 0) [2 1 2] 0 [0 1 2] 8 -0.250000 GraphAddEntries: 1 (15- 18+ 15-: 0 1 0) (18+ 18+ 18+: 0 1 0) [1 1 1] 0 2 (30- 37+ 30-: 1 0 0) (37+ 37+ 37+: 0 0 -1) [2 1 2] 0 [0 1 2] 9 -0.250000 GraphAddEntries: 1 (15- 18+ 15-: 0 1 0) (18+ 18+ 18+: 0 1 0) [1 1 1] 0 2 (30- 37+ 30-: 1 0 1) (37+ 37+ 37+: 0 0 0) [2 1 2] 0 [0 1 2] 10 -0.250000 GraphAddEntries: 1 (5- 5- 5-: 0 0 -1) (10+ 10+ 5-: 0 0 -1) [1 1 1] 0 2 (10- 10- 10-: 0 0 0) (21+ 21+ 10-: -1 -1 0) [2 2 1] 0 [0 1 2] 7 -0.250000 GraphAddEntries: 1 (5- 5- 5-: 0 0 -1) (10+ 10+ 5-: 0 0 -1) [1 1 1] 0 2 (10- 10- 10-: 0 1 0) (21+ 21+ 10-: -1 0 0) [2 2 1] 0 [0 1 2] 8 -0.250000 GraphAddEntries: 1 (5- 5- 5-: 0 0 -1) (10+ 10+ 5-: 0 0 -1) [1 1 1] 0 2 (10- 10- 10-: 1 0 0) (21+ 21+ 10-: 0 -1 0) [2 2 1] 0 [0 1 2] 9 -0.250000 GraphAddEntries: 1 (5- 5- 5-: 0 0 -1) (10+ 10+ 5-: 0 0 -1) [1 1 1] 0 2 (10- 10- 10-: 1 1 0) (21+ 21+ 10-: 0 0 0) [2 2 1] 0 [0 1 2] 10 -0.250000 GraphAddEntries: 1 (15- 15- 15-: 0 0 -1) (18+ 18+ 15-: 0 0 -1) [1 1 1] 0 2 (30- 30- 30-: 0 0 0) (37+ 37+ 30-: -1 -1 0) [2 2 1] 0 [0 1 2] 7 -0.250000 GraphAddEntries: 1 (15- 15- 15-: 0 0 -1) (18+ 18+ 15-: 0 0 -1) [1 1 1] 0 2 (30- 30- 30-: 0 1 0) (37+ 37+ 30-: -1 0 0) [2 2 1] 0 [0 1 2] 8 -0.250000 GraphAddEntries: 1 (15- 15- 15-: 0 0 -1) (18+ 18+ 15-: 0 0 -1) [1 1 1] 0 2 (30- 30- 30-: 1 0 0) (37+ 37+ 30-: 0 -1 0) [2 2 1] 0 [0 1 2] 9 -0.250000 GraphAddEntries: 1 (15- 15- 15-: 0 0 -1) (18+ 18+ 15-: 0 0 -1) [1 1 1] 0 2 (30- 30- 30-: 1 1 0) (37+ 37+ 30-: 0 0 0) [2 2 1] 0 [0 1 2] 10 -0.250000 GraphAddEntries: 1 (5- 5- 10+: 0 0 1) (10+ 10+ 10+: 0 0 1) [1 1 1] 0 2 (10- 10- 21+: 1 0 0) (21+ 21+ 21+: 0 -1 0) [2 2 1] 0 [0 1 2] 7 -0.250000 GraphAddEntries: 1 (5- 5- 10+: 0 0 1) (10+ 10+ 10+: 0 0 1) [1 1 1] 0 2 (10- 10- 21+: 1 1 0) (21+ 21+ 21+: 0 0 0) [2 2 1] 0 [0 1 2] 8 -0.250000 GraphAddEntries: 1 (5- 5- 10+: 0 0 1) (10+ 10+ 10+: 0 0 1) [1 1 1] 0 2 (10- 10- 21+: 0 0 0) (21+ 21+ 21+: -1 -1 0) [2 2 1] 0 [0 1 2] 9 -0.250000 GraphAddEntries: 1 (5- 5- 10+: 0 0 1) (10+ 10+ 10+: 0 0 1) [1 1 1] 0 2 (10- 10- 21+: 0 1 0) (21+ 21+ 21+: -1 0 0) [2 2 1] 0 [0 1 2] 10 -0.250000 GraphAddEntries: 1 (15- 15- 18+: 0 0 1) (18+ 18+ 18+: 0 0 1) [1 1 1] 0 2 (30- 30- 37+: 1 0 0) (37+ 37+ 37+: 0 -1 0) [2 2 1] 0 [0 1 2] 7 -0.250000 GraphAddEntries: 1 (15- 15- 18+: 0 0 1) (18+ 18+ 18+: 0 0 1) [1 1 1] 0 2 (30- 30- 37+: 1 1 0) (37+ 37+ 37+: 0 0 0) [2 2 1] 0 [0 1 2] 8 -0.250000 GraphAddEntries: 1 (15- 15- 18+: 0 0 1) (18+ 18+ 18+: 0 0 1) [1 1 1] 0 2 (30- 30- 37+: 0 0 0) (37+ 37+ 37+: -1 -1 0) [2 2 1] 0 [0 1 2] 9 -0.250000 GraphAddEntries: 1 (15- 15- 18+: 0 0 1) (18+ 18+ 18+: 0 0 1) [1 1 1] 0 2 (30- 30- 37+: 0 1 0) (37+ 37+ 37+: -1 0 0) [2 2 1] 0 [0 1 2] 10 -0.250000 GraphAddEntries: 1 (4- 4- 4-: 0 0 0) (4- 11+ 4-: 0 -1 0) [1 2 1] 0 0 (2- 2- 2-: -1 0 0) (2- 5+ 2-: -1 0 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 1 (4- 4- 4-: 0 1 0) (4- 11+ 4-: 0 0 0) [1 2 1] 0 0 (2- 2- 2-: -1 0 0) (2- 5+ 2-: -1 0 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 1 (11+ 4- 11+: 0 0 0) (11+ 11+ 11+: 0 -1 0) [1 2 1] 0 0 (5+ 2- 5+: 1 0 0) (5+ 5+ 5+: 1 0 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 1 (11+ 4- 11+: 0 1 0) (11+ 11+ 11+: 0 0 0) [1 2 1] 0 0 (5+ 2- 5+: 1 0 0) (5+ 5+ 5+: 1 0 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 1 (11+ 4- 4-: 0 0 0) (11+ 11+ 4-: 0 -1 0) [1 2 1] 0 0 (5+ 2- 2-: 1 0 0) (5+ 5+ 2-: 1 0 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 1 (11+ 4- 4-: 0 1 0) (11+ 11+ 4-: 0 0 0) [1 2 1] 0 0 (5+ 2- 2-: 1 0 0) (5+ 5+ 2-: 1 0 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 1 (4- 4- 11+: 0 0 0) (4- 11+ 11+: 0 -1 0) [1 2 1] 0 0 (2- 2- 5+: -1 0 0) (2- 5+ 5+: -1 0 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 1 (4- 4- 11+: 0 1 0) (4- 11+ 11+: 0 0 0) [1 2 1] 0 0 (2- 2- 5+: -1 0 0) (2- 5+ 5+: -1 0 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 1 (14- 14- 14-: 0 0 0) (14- 19+ 14-: 0 -1 0) [1 2 1] 0 0 (7- 7- 7-: -1 0 0) (7- 9+ 7-: -1 0 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 1 (14- 14- 14-: 0 1 0) (14- 19+ 14-: 0 0 0) [1 2 1] 0 0 (7- 7- 7-: -1 0 0) (7- 9+ 7-: -1 0 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 1 (19+ 14- 19+: 0 0 0) (19+ 19+ 19+: 0 -1 0) [1 2 1] 0 0 (9+ 7- 9+: 1 0 0) (9+ 9+ 9+: 1 0 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 1 (19+ 14- 19+: 0 1 0) (19+ 19+ 19+: 0 0 0) [1 2 1] 0 0 (9+ 7- 9+: 1 0 0) (9+ 9+ 9+: 1 0 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 1 (19+ 14- 14-: 0 0 0) (19+ 19+ 14-: 0 -1 0) [1 2 1] 0 0 (9+ 7- 7-: 1 0 0) (9+ 9+ 7-: 1 0 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 1 (19+ 14- 14-: 0 1 0) (19+ 19+ 14-: 0 0 0) [1 2 1] 0 0 (9+ 7- 7-: 1 0 0) (9+ 9+ 7-: 1 0 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 1 (14- 14- 19+: 0 0 0) (14- 19+ 19+: 0 -1 0) [1 2 1] 0 0 (7- 7- 9+: -1 0 0) (7- 9+ 9+: -1 0 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 1 (14- 14- 19+: 0 1 0) (14- 19+ 19+: 0 0 0) [1 2 1] 0 0 (7- 7- 9+: -1 0 0) (7- 9+ 9+: -1 0 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 1 (4- 4- 4-: 2 0 0) (11+ 4- 4-: -1 0 0) [2 1 1] 0 0 (2- 2- 2-: 1 -1 0) (5+ 2- 2-: 0 -1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 1 (4- 4- 4-: 0 0 2) (4- 4- 11+: 0 0 -1) [1 1 2] 0 0 (2- 2- 2-: 0 -1 1) (2- 2- 5+: 0 -1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 1 (4- 4- 11+: 2 0 0) (11+ 4- 11+: -1 0 0) [2 1 1] 0 0 (2- 2- 5+: 1 -1 0) (5+ 2- 5+: 0 -1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 1 (11+ 4- 4-: 0 0 2) (11+ 4- 11+: 0 0 -1) [1 1 2] 0 0 (5+ 2- 2-: 0 -1 1) (5+ 2- 5+: 0 -1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 1 (4- 4- 4-: 1 0 0) (11+ 4- 4-: -2 0 0) [2 1 1] 0 0 (2- 2- 2-: 0 -1 0) (5+ 2- 2-: -1 -1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 1 (4- 4- 4-: 0 0 1) (4- 4- 11+: 0 0 -2) [1 1 2] 0 0 (2- 2- 2-: 0 -1 0) (2- 2- 5+: 0 -1 -1) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 1 (4- 4- 11+: 1 0 0) (11+ 4- 11+: -2 0 0) [2 1 1] 0 0 (2- 2- 5+: 0 -1 0) (5+ 2- 5+: -1 -1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 1 (11+ 4- 4-: 0 0 1) (11+ 4- 11+: 0 0 -2) [1 1 2] 0 0 (5+ 2- 2-: 0 -1 0) (5+ 2- 5+: 0 -1 -1) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 1 (4- 11+ 4-: 2 0 0) (11+ 11+ 4-: -1 0 0) [2 1 1] 0 0 (2- 5+ 2-: 1 1 0) (5+ 5+ 2-: 0 1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 1 (4- 11+ 4-: 0 0 2) (4- 11+ 11+: 0 0 -1) [1 1 2] 0 0 (2- 5+ 2-: 0 1 1) (2- 5+ 5+: 0 1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 1 (4- 11+ 11+: 2 0 0) (11+ 11+ 11+: -1 0 0) [2 1 1] 0 0 (2- 5+ 5+: 1 1 0) (5+ 5+ 5+: 0 1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 1 (11+ 11+ 4-: 0 0 2) (11+ 11+ 11+: 0 0 -1) [1 1 2] 0 0 (5+ 5+ 2-: 0 1 1) (5+ 5+ 5+: 0 1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 1 (4- 11+ 4-: 1 0 0) (11+ 11+ 4-: -2 0 0) [2 1 1] 0 0 (2- 5+ 2-: 0 1 0) (5+ 5+ 2-: -1 1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 1 (4- 11+ 4-: 0 0 1) (4- 11+ 11+: 0 0 -2) [1 1 2] 0 0 (2- 5+ 2-: 0 1 0) (2- 5+ 5+: 0 1 -1) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 1 (4- 11+ 11+: 1 0 0) (11+ 11+ 11+: -2 0 0) [2 1 1] 0 0 (2- 5+ 5+: 0 1 0) (5+ 5+ 5+: -1 1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 1 (11+ 11+ 4-: 0 0 1) (11+ 11+ 11+: 0 0 -2) [1 1 2] 0 0 (5+ 5+ 2-: 0 1 0) (5+ 5+ 5+: 0 1 -1) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 1 (14- 14- 14-: 2 0 0) (19+ 14- 14-: -1 0 0) [2 1 1] 0 0 (7- 7- 7-: 1 -1 0) (9+ 7- 7-: 0 -1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 1 (14- 14- 14-: 0 0 2) (14- 14- 19+: 0 0 -1) [1 1 2] 0 0 (7- 7- 7-: 0 -1 1) (7- 7- 9+: 0 -1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 1 (14- 14- 19+: 2 0 0) (19+ 14- 19+: -1 0 0) [2 1 1] 0 0 (7- 7- 9+: 1 -1 0) (9+ 7- 9+: 0 -1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 1 (19+ 14- 14-: 0 0 2) (19+ 14- 19+: 0 0 -1) [1 1 2] 0 0 (9+ 7- 7-: 0 -1 1) (9+ 7- 9+: 0 -1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 1 (14- 14- 14-: 1 0 0) (19+ 14- 14-: -2 0 0) [2 1 1] 0 0 (7- 7- 7-: 0 -1 0) (9+ 7- 7-: -1 -1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 1 (14- 14- 14-: 0 0 1) (14- 14- 19+: 0 0 -2) [1 1 2] 0 0 (7- 7- 7-: 0 -1 0) (7- 7- 9+: 0 -1 -1) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 1 (14- 14- 19+: 1 0 0) (19+ 14- 19+: -2 0 0) [2 1 1] 0 0 (7- 7- 9+: 0 -1 0) (9+ 7- 9+: -1 -1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 1 (19+ 14- 14-: 0 0 1) (19+ 14- 19+: 0 0 -2) [1 1 2] 0 0 (9+ 7- 7-: 0 -1 0) (9+ 7- 9+: 0 -1 -1) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 1 (14- 19+ 14-: 2 0 0) (19+ 19+ 14-: -1 0 0) [2 1 1] 0 0 (7- 9+ 7-: 1 1 0) (9+ 9+ 7-: 0 1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 1 (14- 19+ 14-: 0 0 2) (14- 19+ 19+: 0 0 -1) [1 1 2] 0 0 (7- 9+ 7-: 0 1 1) (7- 9+ 9+: 0 1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 1 (14- 19+ 19+: 2 0 0) (19+ 19+ 19+: -1 0 0) [2 1 1] 0 0 (7- 9+ 9+: 1 1 0) (9+ 9+ 9+: 0 1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 1 (19+ 19+ 14-: 0 0 2) (19+ 19+ 19+: 0 0 -1) [1 1 2] 0 0 (9+ 9+ 7-: 0 1 1) (9+ 9+ 9+: 0 1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 1 (14- 19+ 14-: 1 0 0) (19+ 19+ 14-: -2 0 0) [2 1 1] 0 0 (7- 9+ 7-: 0 1 0) (9+ 9+ 7-: -1 1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 1 (14- 19+ 14-: 0 0 1) (14- 19+ 19+: 0 0 -2) [1 1 2] 0 0 (7- 9+ 7-: 0 1 0) (7- 9+ 9+: 0 1 -1) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 1 (14- 19+ 19+: 1 0 0) (19+ 19+ 19+: -2 0 0) [2 1 1] 0 0 (7- 9+ 9+: 0 1 0) (9+ 9+ 9+: -1 1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 1 (19+ 19+ 14-: 0 0 1) (19+ 19+ 19+: 0 0 -2) [1 1 2] 0 0 (9+ 9+ 7-: 0 1 0) (9+ 9+ 9+: 0 1 -1) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 1 (4- 4- 4-: 0 0 0) (4- 4- 4-: 0 0 0) [1 1 1] 0 0 (2- 2- 2-: 0 -1 0) (2- 2- 2-: 0 -1 0) [1 1 1] 0 [0 1 2] 9 -1.000000 GraphAddEntries: 1 (11+ 4- 4-: 0 0 0) (11+ 4- 4-: 0 0 0) [1 1 1] 0 0 (5+ 2- 2-: 0 -1 0) (5+ 2- 2-: 0 -1 0) [1 1 1] 0 [0 1 2] 9 -1.000000 GraphAddEntries: 1 (4- 4- 11+: 0 0 0) (4- 4- 11+: 0 0 0) [1 1 1] 0 0 (2- 2- 5+: 0 -1 0) (2- 2- 5+: 0 -1 0) [1 1 1] 0 [0 1 2] 9 -1.000000 GraphAddEntries: 1 (11+ 4- 11+: 0 0 0) (11+ 4- 11+: 0 0 0) [1 1 1] 0 0 (5+ 2- 5+: 0 -1 0) (5+ 2- 5+: 0 -1 0) [1 1 1] 0 [0 1 2] 9 -1.000000 GraphAddEntries: 1 (4- 11+ 4-: 0 0 0) (4- 11+ 4-: 0 0 0) [1 1 1] 0 0 (2- 5+ 2-: 0 1 0) (2- 5+ 2-: 0 1 0) [1 1 1] 0 [0 1 2] 9 -1.000000 GraphAddEntries: 1 (11+ 11+ 4-: 0 0 0) (11+ 11+ 4-: 0 0 0) [1 1 1] 0 0 (5+ 5+ 2-: 0 1 0) (5+ 5+ 2-: 0 1 0) [1 1 1] 0 [0 1 2] 9 -1.000000 GraphAddEntries: 1 (4- 11+ 11+: 0 0 0) (4- 11+ 11+: 0 0 0) [1 1 1] 0 0 (2- 5+ 5+: 0 1 0) (2- 5+ 5+: 0 1 0) [1 1 1] 0 [0 1 2] 9 -1.000000 GraphAddEntries: 1 (11+ 11+ 11+: 0 0 0) (11+ 11+ 11+: 0 0 0) [1 1 1] 0 0 (5+ 5+ 5+: 0 1 0) (5+ 5+ 5+: 0 1 0) [1 1 1] 0 [0 1 2] 9 -1.000000 GraphAddEntries: 1 (14- 14- 14-: 0 0 0) (14- 14- 14-: 0 0 0) [1 1 1] 0 0 (7- 7- 7-: 0 -1 0) (7- 7- 7-: 0 -1 0) [1 1 1] 0 [0 1 2] 9 -1.000000 GraphAddEntries: 1 (19+ 14- 14-: 0 0 0) (19+ 14- 14-: 0 0 0) [1 1 1] 0 0 (9+ 7- 7-: 0 -1 0) (9+ 7- 7-: 0 -1 0) [1 1 1] 0 [0 1 2] 9 -1.000000 GraphAddEntries: 1 (14- 14- 19+: 0 0 0) (14- 14- 19+: 0 0 0) [1 1 1] 0 0 (7- 7- 9+: 0 -1 0) (7- 7- 9+: 0 -1 0) [1 1 1] 0 [0 1 2] 9 -1.000000 GraphAddEntries: 1 (19+ 14- 19+: 0 0 0) (19+ 14- 19+: 0 0 0) [1 1 1] 0 0 (9+ 7- 9+: 0 -1 0) (9+ 7- 9+: 0 -1 0) [1 1 1] 0 [0 1 2] 9 -1.000000 GraphAddEntries: 1 (14- 19+ 14-: 0 0 0) (14- 19+ 14-: 0 0 0) [1 1 1] 0 0 (7- 9+ 7-: 0 1 0) (7- 9+ 7-: 0 1 0) [1 1 1] 0 [0 1 2] 9 -1.000000 GraphAddEntries: 1 (19+ 19+ 14-: 0 0 0) (19+ 19+ 14-: 0 0 0) [1 1 1] 0 0 (9+ 9+ 7-: 0 1 0) (9+ 9+ 7-: 0 1 0) [1 1 1] 0 [0 1 2] 9 -1.000000 GraphAddEntries: 1 (14- 19+ 19+: 0 0 0) (14- 19+ 19+: 0 0 0) [1 1 1] 0 0 (7- 9+ 9+: 0 1 0) (7- 9+ 9+: 0 1 0) [1 1 1] 0 [0 1 2] 9 -1.000000 GraphAddEntries: 1 (19+ 19+ 19+: 0 0 0) (19+ 19+ 19+: 0 0 0) [1 1 1] 0 0 (9+ 9+ 9+: 0 1 0) (9+ 9+ 9+: 0 1 0) [1 1 1] 0 [0 1 2] 9 -1.000000 GraphAddEntries: 2 (10- 10- 10-: 0 0 1) (10- 21+ 21+: 0 -1 -2) [1 2 2] 0 1 (5- 5- 5-: -1 0 0) (5- 10+ 10+: -1 0 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 2 (10- 10- 10-: 0 1 1) (10- 21+ 21+: 0 0 -2) [1 2 2] 0 1 (5- 5- 5-: -1 0 0) (5- 10+ 10+: -1 0 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 2 (10- 10- 10-: 0 0 2) (10- 21+ 21+: 0 -1 -1) [1 2 2] 0 1 (5- 5- 5-: -1 0 1) (5- 10+ 10+: -1 0 0) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 2 (10- 10- 10-: 0 1 2) (10- 21+ 21+: 0 0 -1) [1 2 2] 0 1 (5- 5- 5-: -1 0 1) (5- 10+ 10+: -1 0 0) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 2 (30- 30- 30-: 0 0 1) (30- 37+ 37+: 0 -1 -2) [1 2 2] 0 1 (15- 15- 15-: -1 0 0) (15- 18+ 18+: -1 0 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 2 (30- 30- 30-: 0 1 1) (30- 37+ 37+: 0 0 -2) [1 2 2] 0 1 (15- 15- 15-: -1 0 0) (15- 18+ 18+: -1 0 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 2 (30- 30- 30-: 0 0 2) (30- 37+ 37+: 0 -1 -1) [1 2 2] 0 1 (15- 15- 15-: -1 0 1) (15- 18+ 18+: -1 0 0) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 2 (30- 30- 30-: 0 1 2) (30- 37+ 37+: 0 0 -1) [1 2 2] 0 1 (15- 15- 15-: -1 0 1) (15- 18+ 18+: -1 0 0) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 2 (21+ 10- 10-: 0 0 2) (21+ 21+ 21+: 0 -1 -1) [1 2 2] 0 1 (10+ 5- 5-: 1 0 1) (10+ 10+ 10+: 1 0 0) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 2 (21+ 10- 10-: 0 1 2) (21+ 21+ 21+: 0 0 -1) [1 2 2] 0 1 (10+ 5- 5-: 1 0 1) (10+ 10+ 10+: 1 0 0) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 2 (21+ 10- 10-: 0 0 1) (21+ 21+ 21+: 0 -1 -2) [1 2 2] 0 1 (10+ 5- 5-: 1 0 0) (10+ 10+ 10+: 1 0 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 2 (21+ 10- 10-: 0 1 1) (21+ 21+ 21+: 0 0 -2) [1 2 2] 0 1 (10+ 5- 5-: 1 0 0) (10+ 10+ 10+: 1 0 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 2 (37+ 30- 30-: 0 0 2) (37+ 37+ 37+: 0 -1 -1) [1 2 2] 0 1 (18+ 15- 15-: 1 0 1) (18+ 18+ 18+: 1 0 0) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 2 (37+ 30- 30-: 0 1 2) (37+ 37+ 37+: 0 0 -1) [1 2 2] 0 1 (18+ 15- 15-: 1 0 1) (18+ 18+ 18+: 1 0 0) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 2 (37+ 30- 30-: 0 0 1) (37+ 37+ 37+: 0 -1 -2) [1 2 2] 0 1 (18+ 15- 15-: 1 0 0) (18+ 18+ 18+: 1 0 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 2 (37+ 30- 30-: 0 1 1) (37+ 37+ 37+: 0 0 -2) [1 2 2] 0 1 (18+ 15- 15-: 1 0 0) (18+ 18+ 18+: 1 0 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 2 (10- 10- 10-: 2 0 1) (21+ 10- 21+: -1 0 -2) [2 1 2] 0 1 (5- 5- 5-: 1 -1 0) (10+ 5- 10+: 0 -1 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 2 (10- 10- 10-: 2 0 2) (21+ 10- 21+: -1 0 -1) [2 1 2] 0 1 (5- 5- 5-: 1 -1 1) (10+ 5- 10+: 0 -1 0) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 2 (10- 10- 10-: 1 0 1) (21+ 10- 21+: -2 0 -2) [2 1 2] 0 1 (5- 5- 5-: 0 -1 0) (10+ 5- 10+: -1 -1 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 2 (10- 10- 10-: 1 0 2) (21+ 10- 21+: -2 0 -1) [2 1 2] 0 1 (5- 5- 5-: 0 -1 1) (10+ 5- 10+: -1 -1 0) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 2 (30- 30- 30-: 2 0 1) (37+ 30- 37+: -1 0 -2) [2 1 2] 0 1 (15- 15- 15-: 1 -1 0) (18+ 15- 18+: 0 -1 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 2 (30- 30- 30-: 2 0 2) (37+ 30- 37+: -1 0 -1) [2 1 2] 0 1 (15- 15- 15-: 1 -1 1) (18+ 15- 18+: 0 -1 0) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 2 (30- 30- 30-: 1 0 1) (37+ 30- 37+: -2 0 -2) [2 1 2] 0 1 (15- 15- 15-: 0 -1 0) (18+ 15- 18+: -1 -1 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 2 (30- 30- 30-: 1 0 2) (37+ 30- 37+: -2 0 -1) [2 1 2] 0 1 (15- 15- 15-: 0 -1 1) (18+ 15- 18+: -1 -1 0) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 2 (10- 21+ 10-: 2 0 2) (21+ 21+ 21+: -1 0 -1) [2 1 2] 0 1 (5- 10+ 5-: 1 1 1) (10+ 10+ 10+: 0 1 0) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 2 (10- 21+ 10-: 2 0 1) (21+ 21+ 21+: -1 0 -2) [2 1 2] 0 1 (5- 10+ 5-: 1 1 0) (10+ 10+ 10+: 0 1 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 2 (10- 21+ 10-: 1 0 2) (21+ 21+ 21+: -2 0 -1) [2 1 2] 0 1 (5- 10+ 5-: 0 1 1) (10+ 10+ 10+: -1 1 0) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 2 (10- 21+ 10-: 1 0 1) (21+ 21+ 21+: -2 0 -2) [2 1 2] 0 1 (5- 10+ 5-: 0 1 0) (10+ 10+ 10+: -1 1 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 2 (30- 37+ 30-: 2 0 2) (37+ 37+ 37+: -1 0 -1) [2 1 2] 0 1 (15- 18+ 15-: 1 1 1) (18+ 18+ 18+: 0 1 0) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 2 (30- 37+ 30-: 2 0 1) (37+ 37+ 37+: -1 0 -2) [2 1 2] 0 1 (15- 18+ 15-: 1 1 0) (18+ 18+ 18+: 0 1 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 2 (30- 37+ 30-: 1 0 2) (37+ 37+ 37+: -2 0 -1) [2 1 2] 0 1 (15- 18+ 15-: 0 1 1) (18+ 18+ 18+: -1 1 0) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 2 (30- 37+ 30-: 1 0 1) (37+ 37+ 37+: -2 0 -2) [2 1 2] 0 1 (15- 18+ 15-: 0 1 0) (18+ 18+ 18+: -1 1 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 2 (10- 10- 10-: 0 0 0) (21+ 21+ 10-: -1 -1 0) [2 2 1] 0 1 (5- 5- 5-: 0 0 -1) (10+ 10+ 5-: 0 0 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 2 (10- 10- 10-: 0 1 0) (21+ 21+ 10-: -1 0 0) [2 2 1] 0 1 (5- 5- 5-: 0 0 -1) (10+ 10+ 5-: 0 0 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 2 (10- 10- 10-: 1 0 0) (21+ 21+ 10-: 0 -1 0) [2 2 1] 0 1 (5- 5- 5-: 0 0 -1) (10+ 10+ 5-: 0 0 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 2 (10- 10- 10-: 1 1 0) (21+ 21+ 10-: 0 0 0) [2 2 1] 0 1 (5- 5- 5-: 0 0 -1) (10+ 10+ 5-: 0 0 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 2 (30- 30- 30-: 0 0 0) (37+ 37+ 30-: -1 -1 0) [2 2 1] 0 1 (15- 15- 15-: 0 0 -1) (18+ 18+ 15-: 0 0 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 2 (30- 30- 30-: 0 1 0) (37+ 37+ 30-: -1 0 0) [2 2 1] 0 1 (15- 15- 15-: 0 0 -1) (18+ 18+ 15-: 0 0 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 2 (30- 30- 30-: 1 0 0) (37+ 37+ 30-: 0 -1 0) [2 2 1] 0 1 (15- 15- 15-: 0 0 -1) (18+ 18+ 15-: 0 0 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 2 (30- 30- 30-: 1 1 0) (37+ 37+ 30-: 0 0 0) [2 2 1] 0 1 (15- 15- 15-: 0 0 -1) (18+ 18+ 15-: 0 0 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 2 (10- 10- 21+: 1 0 0) (21+ 21+ 21+: 0 -1 0) [2 2 1] 0 1 (5- 5- 10+: 0 0 1) (10+ 10+ 10+: 0 0 1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 2 (10- 10- 21+: 1 1 0) (21+ 21+ 21+: 0 0 0) [2 2 1] 0 1 (5- 5- 10+: 0 0 1) (10+ 10+ 10+: 0 0 1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 2 (10- 10- 21+: 0 0 0) (21+ 21+ 21+: -1 -1 0) [2 2 1] 0 1 (5- 5- 10+: 0 0 1) (10+ 10+ 10+: 0 0 1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 2 (10- 10- 21+: 0 1 0) (21+ 21+ 21+: -1 0 0) [2 2 1] 0 1 (5- 5- 10+: 0 0 1) (10+ 10+ 10+: 0 0 1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 2 (30- 30- 37+: 1 0 0) (37+ 37+ 37+: 0 -1 0) [2 2 1] 0 1 (15- 15- 18+: 0 0 1) (18+ 18+ 18+: 0 0 1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 2 (30- 30- 37+: 1 1 0) (37+ 37+ 37+: 0 0 0) [2 2 1] 0 1 (15- 15- 18+: 0 0 1) (18+ 18+ 18+: 0 0 1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 2 (30- 30- 37+: 0 0 0) (37+ 37+ 37+: -1 -1 0) [2 2 1] 0 1 (15- 15- 18+: 0 0 1) (18+ 18+ 18+: 0 0 1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 2 (30- 30- 37+: 0 1 0) (37+ 37+ 37+: -1 0 0) [2 2 1] 0 1 (15- 15- 18+: 0 0 1) (18+ 18+ 18+: 0 0 1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 2 (10- 10- 10-: 0 0 0) (10- 21+ 10-: 0 -1 0) [1 2 1] 0 1 (5- 5- 5-: -1 0 0) (5- 10+ 5-: -1 0 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 2 (10- 10- 10-: 0 1 0) (10- 21+ 10-: 0 0 0) [1 2 1] 0 1 (5- 5- 5-: -1 0 0) (5- 10+ 5-: -1 0 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 2 (21+ 10- 21+: 0 0 0) (21+ 21+ 21+: 0 -1 0) [1 2 1] 0 1 (10+ 5- 10+: 1 0 0) (10+ 10+ 10+: 1 0 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 2 (21+ 10- 21+: 0 1 0) (21+ 21+ 21+: 0 0 0) [1 2 1] 0 1 (10+ 5- 10+: 1 0 0) (10+ 10+ 10+: 1 0 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 2 (21+ 10- 10-: 0 0 0) (21+ 21+ 10-: 0 -1 0) [1 2 1] 0 1 (10+ 5- 5-: 1 0 0) (10+ 10+ 5-: 1 0 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 2 (21+ 10- 10-: 0 1 0) (21+ 21+ 10-: 0 0 0) [1 2 1] 0 1 (10+ 5- 5-: 1 0 0) (10+ 10+ 5-: 1 0 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 2 (10- 10- 21+: 0 0 0) (10- 21+ 21+: 0 -1 0) [1 2 1] 0 1 (5- 5- 10+: -1 0 0) (5- 10+ 10+: -1 0 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 2 (10- 10- 21+: 0 1 0) (10- 21+ 21+: 0 0 0) [1 2 1] 0 1 (5- 5- 10+: -1 0 0) (5- 10+ 10+: -1 0 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 2 (30- 30- 30-: 0 0 0) (30- 37+ 30-: 0 -1 0) [1 2 1] 0 1 (15- 15- 15-: -1 0 0) (15- 18+ 15-: -1 0 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 2 (30- 30- 30-: 0 1 0) (30- 37+ 30-: 0 0 0) [1 2 1] 0 1 (15- 15- 15-: -1 0 0) (15- 18+ 15-: -1 0 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 2 (37+ 30- 37+: 0 0 0) (37+ 37+ 37+: 0 -1 0) [1 2 1] 0 1 (18+ 15- 18+: 1 0 0) (18+ 18+ 18+: 1 0 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 2 (37+ 30- 37+: 0 1 0) (37+ 37+ 37+: 0 0 0) [1 2 1] 0 1 (18+ 15- 18+: 1 0 0) (18+ 18+ 18+: 1 0 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 2 (37+ 30- 30-: 0 0 0) (37+ 37+ 30-: 0 -1 0) [1 2 1] 0 1 (18+ 15- 15-: 1 0 0) (18+ 18+ 15-: 1 0 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 2 (37+ 30- 30-: 0 1 0) (37+ 37+ 30-: 0 0 0) [1 2 1] 0 1 (18+ 15- 15-: 1 0 0) (18+ 18+ 15-: 1 0 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 2 (30- 30- 37+: 0 0 0) (30- 37+ 37+: 0 -1 0) [1 2 1] 0 1 (15- 15- 18+: -1 0 0) (15- 18+ 18+: -1 0 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 2 (30- 30- 37+: 0 1 0) (30- 37+ 37+: 0 0 0) [1 2 1] 0 1 (15- 15- 18+: -1 0 0) (15- 18+ 18+: -1 0 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 2 (10- 10- 10-: 2 0 0) (21+ 10- 10-: -1 0 0) [2 1 1] 0 1 (5- 5- 5-: 1 -1 0) (10+ 5- 5-: 0 -1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 2 (10- 10- 10-: 0 0 2) (10- 10- 21+: 0 0 -1) [1 1 2] 0 1 (5- 5- 5-: 0 -1 1) (5- 5- 10+: 0 -1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 2 (10- 10- 21+: 2 0 0) (21+ 10- 21+: -1 0 0) [2 1 1] 0 1 (5- 5- 10+: 1 -1 0) (10+ 5- 10+: 0 -1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 2 (21+ 10- 10-: 0 0 2) (21+ 10- 21+: 0 0 -1) [1 1 2] 0 1 (10+ 5- 5-: 0 -1 1) (10+ 5- 10+: 0 -1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 2 (10- 10- 10-: 1 0 0) (21+ 10- 10-: -2 0 0) [2 1 1] 0 1 (5- 5- 5-: 0 -1 0) (10+ 5- 5-: -1 -1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 2 (10- 10- 10-: 0 0 1) (10- 10- 21+: 0 0 -2) [1 1 2] 0 1 (5- 5- 5-: 0 -1 0) (5- 5- 10+: 0 -1 -1) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 2 (10- 10- 21+: 1 0 0) (21+ 10- 21+: -2 0 0) [2 1 1] 0 1 (5- 5- 10+: 0 -1 0) (10+ 5- 10+: -1 -1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 2 (21+ 10- 10-: 0 0 1) (21+ 10- 21+: 0 0 -2) [1 1 2] 0 1 (10+ 5- 5-: 0 -1 0) (10+ 5- 10+: 0 -1 -1) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 2 (10- 21+ 10-: 2 0 0) (21+ 21+ 10-: -1 0 0) [2 1 1] 0 1 (5- 10+ 5-: 1 1 0) (10+ 10+ 5-: 0 1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 2 (10- 21+ 10-: 0 0 2) (10- 21+ 21+: 0 0 -1) [1 1 2] 0 1 (5- 10+ 5-: 0 1 1) (5- 10+ 10+: 0 1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 2 (10- 21+ 21+: 2 0 0) (21+ 21+ 21+: -1 0 0) [2 1 1] 0 1 (5- 10+ 10+: 1 1 0) (10+ 10+ 10+: 0 1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 2 (21+ 21+ 10-: 0 0 2) (21+ 21+ 21+: 0 0 -1) [1 1 2] 0 1 (10+ 10+ 5-: 0 1 1) (10+ 10+ 10+: 0 1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 2 (10- 21+ 10-: 1 0 0) (21+ 21+ 10-: -2 0 0) [2 1 1] 0 1 (5- 10+ 5-: 0 1 0) (10+ 10+ 5-: -1 1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 2 (10- 21+ 10-: 0 0 1) (10- 21+ 21+: 0 0 -2) [1 1 2] 0 1 (5- 10+ 5-: 0 1 0) (5- 10+ 10+: 0 1 -1) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 2 (10- 21+ 21+: 1 0 0) (21+ 21+ 21+: -2 0 0) [2 1 1] 0 1 (5- 10+ 10+: 0 1 0) (10+ 10+ 10+: -1 1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 2 (21+ 21+ 10-: 0 0 1) (21+ 21+ 21+: 0 0 -2) [1 1 2] 0 1 (10+ 10+ 5-: 0 1 0) (10+ 10+ 10+: 0 1 -1) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 2 (30- 30- 30-: 2 0 0) (37+ 30- 30-: -1 0 0) [2 1 1] 0 1 (15- 15- 15-: 1 -1 0) (18+ 15- 15-: 0 -1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 2 (30- 30- 30-: 0 0 2) (30- 30- 37+: 0 0 -1) [1 1 2] 0 1 (15- 15- 15-: 0 -1 1) (15- 15- 18+: 0 -1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 2 (30- 30- 37+: 2 0 0) (37+ 30- 37+: -1 0 0) [2 1 1] 0 1 (15- 15- 18+: 1 -1 0) (18+ 15- 18+: 0 -1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 2 (37+ 30- 30-: 0 0 2) (37+ 30- 37+: 0 0 -1) [1 1 2] 0 1 (18+ 15- 15-: 0 -1 1) (18+ 15- 18+: 0 -1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 2 (30- 30- 30-: 1 0 0) (37+ 30- 30-: -2 0 0) [2 1 1] 0 1 (15- 15- 15-: 0 -1 0) (18+ 15- 15-: -1 -1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 2 (30- 30- 30-: 0 0 1) (30- 30- 37+: 0 0 -2) [1 1 2] 0 1 (15- 15- 15-: 0 -1 0) (15- 15- 18+: 0 -1 -1) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 2 (30- 30- 37+: 1 0 0) (37+ 30- 37+: -2 0 0) [2 1 1] 0 1 (15- 15- 18+: 0 -1 0) (18+ 15- 18+: -1 -1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 2 (37+ 30- 30-: 0 0 1) (37+ 30- 37+: 0 0 -2) [1 1 2] 0 1 (18+ 15- 15-: 0 -1 0) (18+ 15- 18+: 0 -1 -1) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 2 (30- 37+ 30-: 2 0 0) (37+ 37+ 30-: -1 0 0) [2 1 1] 0 1 (15- 18+ 15-: 1 1 0) (18+ 18+ 15-: 0 1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 2 (30- 37+ 30-: 0 0 2) (30- 37+ 37+: 0 0 -1) [1 1 2] 0 1 (15- 18+ 15-: 0 1 1) (15- 18+ 18+: 0 1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 2 (30- 37+ 37+: 2 0 0) (37+ 37+ 37+: -1 0 0) [2 1 1] 0 1 (15- 18+ 18+: 1 1 0) (18+ 18+ 18+: 0 1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 2 (37+ 37+ 30-: 0 0 2) (37+ 37+ 37+: 0 0 -1) [1 1 2] 0 1 (18+ 18+ 15-: 0 1 1) (18+ 18+ 18+: 0 1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 2 (30- 37+ 30-: 1 0 0) (37+ 37+ 30-: -2 0 0) [2 1 1] 0 1 (15- 18+ 15-: 0 1 0) (18+ 18+ 15-: -1 1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 2 (30- 37+ 30-: 0 0 1) (30- 37+ 37+: 0 0 -2) [1 1 2] 0 1 (15- 18+ 15-: 0 1 0) (15- 18+ 18+: 0 1 -1) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 2 (30- 37+ 37+: 1 0 0) (37+ 37+ 37+: -2 0 0) [2 1 1] 0 1 (15- 18+ 18+: 0 1 0) (18+ 18+ 18+: -1 1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 2 (37+ 37+ 30-: 0 0 1) (37+ 37+ 37+: 0 0 -2) [1 1 2] 0 1 (18+ 18+ 15-: 0 1 0) (18+ 18+ 18+: 0 1 -1) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 2 (10- 10- 10-: 0 0 0) (10- 10- 10-: 0 0 0) [1 1 1] 0 1 (5- 5- 5-: 0 -1 0) (5- 5- 5-: 0 -1 0) [1 1 1] 0 [0 1 2] 9 -1.000000 GraphAddEntries: 2 (21+ 10- 10-: 0 0 0) (21+ 10- 10-: 0 0 0) [1 1 1] 0 1 (10+ 5- 5-: 0 -1 0) (10+ 5- 5-: 0 -1 0) [1 1 1] 0 [0 1 2] 9 -1.000000 GraphAddEntries: 2 (10- 10- 21+: 0 0 0) (10- 10- 21+: 0 0 0) [1 1 1] 0 1 (5- 5- 10+: 0 -1 0) (5- 5- 10+: 0 -1 0) [1 1 1] 0 [0 1 2] 9 -1.000000 GraphAddEntries: 2 (21+ 10- 21+: 0 0 0) (21+ 10- 21+: 0 0 0) [1 1 1] 0 1 (10+ 5- 10+: 0 -1 0) (10+ 5- 10+: 0 -1 0) [1 1 1] 0 [0 1 2] 9 -1.000000 GraphAddEntries: 2 (10- 21+ 10-: 0 0 0) (10- 21+ 10-: 0 0 0) [1 1 1] 0 1 (5- 10+ 5-: 0 1 0) (5- 10+ 5-: 0 1 0) [1 1 1] 0 [0 1 2] 9 -1.000000 GraphAddEntries: 2 (21+ 21+ 10-: 0 0 0) (21+ 21+ 10-: 0 0 0) [1 1 1] 0 1 (10+ 10+ 5-: 0 1 0) (10+ 10+ 5-: 0 1 0) [1 1 1] 0 [0 1 2] 9 -1.000000 GraphAddEntries: 2 (10- 21+ 21+: 0 0 0) (10- 21+ 21+: 0 0 0) [1 1 1] 0 1 (5- 10+ 10+: 0 1 0) (5- 10+ 10+: 0 1 0) [1 1 1] 0 [0 1 2] 9 -1.000000 GraphAddEntries: 2 (21+ 21+ 21+: 0 0 0) (21+ 21+ 21+: 0 0 0) [1 1 1] 0 1 (10+ 10+ 10+: 0 1 0) (10+ 10+ 10+: 0 1 0) [1 1 1] 0 [0 1 2] 9 -1.000000 GraphAddEntries: 2 (30- 30- 30-: 0 0 0) (30- 30- 30-: 0 0 0) [1 1 1] 0 1 (15- 15- 15-: 0 -1 0) (15- 15- 15-: 0 -1 0) [1 1 1] 0 [0 1 2] 9 -1.000000 GraphAddEntries: 2 (37+ 30- 30-: 0 0 0) (37+ 30- 30-: 0 0 0) [1 1 1] 0 1 (18+ 15- 15-: 0 -1 0) (18+ 15- 15-: 0 -1 0) [1 1 1] 0 [0 1 2] 9 -1.000000 GraphAddEntries: 2 (30- 30- 37+: 0 0 0) (30- 30- 37+: 0 0 0) [1 1 1] 0 1 (15- 15- 18+: 0 -1 0) (15- 15- 18+: 0 -1 0) [1 1 1] 0 [0 1 2] 9 -1.000000 GraphAddEntries: 2 (37+ 30- 37+: 0 0 0) (37+ 30- 37+: 0 0 0) [1 1 1] 0 1 (18+ 15- 18+: 0 -1 0) (18+ 15- 18+: 0 -1 0) [1 1 1] 0 [0 1 2] 9 -1.000000 GraphAddEntries: 2 (30- 37+ 30-: 0 0 0) (30- 37+ 30-: 0 0 0) [1 1 1] 0 1 (15- 18+ 15-: 0 1 0) (15- 18+ 15-: 0 1 0) [1 1 1] 0 [0 1 2] 9 -1.000000 GraphAddEntries: 2 (37+ 37+ 30-: 0 0 0) (37+ 37+ 30-: 0 0 0) [1 1 1] 0 1 (18+ 18+ 15-: 0 1 0) (18+ 18+ 15-: 0 1 0) [1 1 1] 0 [0 1 2] 9 -1.000000 GraphAddEntries: 2 (30- 37+ 37+: 0 0 0) (30- 37+ 37+: 0 0 0) [1 1 1] 0 1 (15- 18+ 18+: 0 1 0) (15- 18+ 18+: 0 1 0) [1 1 1] 0 [0 1 2] 9 -1.000000 GraphAddEntries: 2 (37+ 37+ 37+: 0 0 0) (37+ 37+ 37+: 0 0 0) [1 1 1] 0 1 (18+ 18+ 18+: 0 1 0) (18+ 18+ 18+: 0 1 0) [1 1 1] 0 [0 1 2] 9 -1.000000 ############################################################# FacParts: 0 0 [1 1 1] FacParts: 1 1 [2 2 2] FacParts: 2 2 [2 2 2] ProcessPoolCreate: 1 # ProcessPoolSetPart: pool part ProcessPoolSetPart: 0 0 ProcessPoolSetPart: 0 1 ProcessPoolSetPart: 0 2 hypre-2.33.0/src/test/TEST_fac/4lev.in000066400000000000000000001103611477326011500172760ustar00rootroot00000000000000# Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) ###################################################### # GridCreate: ndim nparts GridCreate: 3 4 ############################################################# # GridSetExtents: part ilower(ndim) iupper(ndim) GridSetExtents: 0 (1- 1- 1-) (12+ 12+ 12+) GridSetExtents: 1 (4- 4- 4-) (21+ 21+ 21+) GridSetExtents: 2 (10- 10- 10-) (31+ 31+ 31+) GridSetExtents: 3 (22- 22- 22-) (57+ 57+ 57+) ############################################################# # GridSetVariables: part nvars vartypes[nvars] # CELL = 0 # NODE = 1 # XFACE = 2 # YFACE = 3 # ZFACE = 4 # XEDGE = 5 # YEDGE = 6 # ZEDGE = 7 GridSetVariables: 0 1 [0] GridSetVariables: 1 1 [0] GridSetVariables: 2 1 [0] GridSetVariables: 3 1 [0] ############################################################# # StencilCreate: nstencils sizes[nstencils] StencilCreate: 1 [7] ############################################################# # StencilSetEntry: stencil_num entry offset[ndim] var value StencilSetEntry: 0 0 [ 0 0 0] 0 6.000000 StencilSetEntry: 0 1 [-1 0 0] 0 -1.000000 StencilSetEntry: 0 2 [ 1 0 0] 0 -1.000000 StencilSetEntry: 0 3 [ 0 -1 0] 0 -1.000000 StencilSetEntry: 0 4 [ 0 0 1] 0 -1.000000 StencilSetEntry: 0 5 [ 0 0 -1] 0 -1.000000 StencilSetEntry: 0 6 [ 0 1 0] 0 -1.000000 ############################################################# # GraphSetStencil: part var stencil_num GraphSetStencil: 0 0 0 GraphSetStencil: 1 0 0 GraphSetStencil: 2 0 0 GraphSetStencil: 3 0 0 ############################################################# # GraphAddEntries: \ # part ilower(ndim) iupper(ndim) stride[ndim] var \ # to_part to_ilower(ndim) to_iupper(ndim) to_stride[ndim] to_var \ # index_map[ndim] entry value GraphAddEntries: 0 (2- 2- 2-: -1 0 0) (2- 10+ 10+: -1 0 0) [1 1 1] 0 1 (4- 4- 4-: 0 0 1) (4- 21+ 21+: 0 -1 0) [1 2 2] 0 [0 1 2] 7 -0.250000 GraphAddEntries: 0 (2- 2- 2-: -1 0 0) (2- 10+ 10+: -1 0 0) [1 1 1] 0 1 (4- 4- 4-: 0 1 1) (4- 21+ 21+: 0 0 0) [1 2 2] 0 [0 1 2] 8 -0.250000 GraphAddEntries: 0 (2- 2- 2-: -1 0 0) (2- 10+ 10+: -1 0 0) [1 1 1] 0 1 (4- 4- 4-: 0 0 0) (4- 21+ 21+: 0 -1 -1) [1 2 2] 0 [0 1 2] 9 -0.250000 GraphAddEntries: 0 (2- 2- 2-: -1 0 0) (2- 10+ 10+: -1 0 0) [1 1 1] 0 1 (4- 4- 4-: 0 1 0) (4- 21+ 21+: 0 0 -1) [1 2 2] 0 [0 1 2] 10 -0.250000 GraphAddEntries: 0 (10+ 2- 2-: 1 0 0) (10+ 10+ 10+: 1 0 0) [1 1 1] 0 1 (21+ 4- 4-: 0 0 0) (21+ 21+ 21+: 0 -1 -1) [1 2 2] 0 [0 1 2] 7 -0.250000 GraphAddEntries: 0 (10+ 2- 2-: 1 0 0) (10+ 10+ 10+: 1 0 0) [1 1 1] 0 1 (21+ 4- 4-: 0 1 0) (21+ 21+ 21+: 0 0 -1) [1 2 2] 0 [0 1 2] 8 -0.250000 GraphAddEntries: 0 (10+ 2- 2-: 1 0 0) (10+ 10+ 10+: 1 0 0) [1 1 1] 0 1 (21+ 4- 4-: 0 0 1) (21+ 21+ 21+: 0 -1 0) [1 2 2] 0 [0 1 2] 9 -0.250000 GraphAddEntries: 0 (10+ 2- 2-: 1 0 0) (10+ 10+ 10+: 1 0 0) [1 1 1] 0 1 (21+ 4- 4-: 0 1 1) (21+ 21+ 21+: 0 0 0) [1 2 2] 0 [0 1 2] 10 -0.250000 GraphAddEntries: 0 (2- 2- 2-: 0 -1 0) (10+ 2- 10+: 0 -1 0) [1 1 1] 0 1 (4- 4- 4-: 0 0 1) (21+ 4- 21+: -1 0 0) [2 1 2] 0 [0 1 2] 7 -0.250000 GraphAddEntries: 0 (2- 2- 2-: 0 -1 0) (10+ 2- 10+: 0 -1 0) [1 1 1] 0 1 (4- 4- 4-: 0 0 0) (21+ 4- 21+: -1 0 -1) [2 1 2] 0 [0 1 2] 8 -0.250000 GraphAddEntries: 0 (2- 2- 2-: 0 -1 0) (10+ 2- 10+: 0 -1 0) [1 1 1] 0 1 (4- 4- 4-: 1 0 1) (21+ 4- 21+: 0 0 0) [2 1 2] 0 [0 1 2] 9 -0.250000 GraphAddEntries: 0 (2- 2- 2-: 0 -1 0) (10+ 2- 10+: 0 -1 0) [1 1 1] 0 1 (4- 4- 4-: 1 0 0) (21+ 4- 21+: 0 0 -1) [2 1 2] 0 [0 1 2] 10 -0.250000 GraphAddEntries: 0 (2- 10+ 2-: 0 1 0) (10+ 10+ 10+: 0 1 0) [1 1 1] 0 1 (4- 21+ 4-: 0 0 0) (21+ 21+ 21+: -1 0 -1) [2 1 2] 0 [0 1 2] 7 -0.250000 GraphAddEntries: 0 (2- 10+ 2-: 0 1 0) (10+ 10+ 10+: 0 1 0) [1 1 1] 0 1 (4- 21+ 4-: 0 0 1) (21+ 21+ 21+: -1 0 0) [2 1 2] 0 [0 1 2] 8 -0.250000 GraphAddEntries: 0 (2- 10+ 2-: 0 1 0) (10+ 10+ 10+: 0 1 0) [1 1 1] 0 1 (4- 21+ 4-: 1 0 0) (21+ 21+ 21+: 0 0 -1) [2 1 2] 0 [0 1 2] 9 -0.250000 GraphAddEntries: 0 (2- 10+ 2-: 0 1 0) (10+ 10+ 10+: 0 1 0) [1 1 1] 0 1 (4- 21+ 4-: 1 0 1) (21+ 21+ 21+: 0 0 0) [2 1 2] 0 [0 1 2] 10 -0.250000 GraphAddEntries: 0 (2- 2- 2-: 0 0 -1) (10+ 10+ 2-: 0 0 -1) [1 1 1] 0 1 (4- 4- 4-: 0 0 0) (21+ 21+ 4-: -1 -1 0) [2 2 1] 0 [0 1 2] 7 -0.250000 GraphAddEntries: 0 (2- 2- 2-: 0 0 -1) (10+ 10+ 2-: 0 0 -1) [1 1 1] 0 1 (4- 4- 4-: 0 1 0) (21+ 21+ 4-: -1 0 0) [2 2 1] 0 [0 1 2] 8 -0.250000 GraphAddEntries: 0 (2- 2- 2-: 0 0 -1) (10+ 10+ 2-: 0 0 -1) [1 1 1] 0 1 (4- 4- 4-: 1 0 0) (21+ 21+ 4-: 0 -1 0) [2 2 1] 0 [0 1 2] 9 -0.250000 GraphAddEntries: 0 (2- 2- 2-: 0 0 -1) (10+ 10+ 2-: 0 0 -1) [1 1 1] 0 1 (4- 4- 4-: 1 1 0) (21+ 21+ 4-: 0 0 0) [2 2 1] 0 [0 1 2] 10 -0.250000 GraphAddEntries: 0 (2- 2- 10+: 0 0 1) (10+ 10+ 10+: 0 0 1) [1 1 1] 0 1 (4- 4- 21+: 1 0 0) (21+ 21+ 21+: 0 -1 0) [2 2 1] 0 [0 1 2] 7 -0.250000 GraphAddEntries: 0 (2- 2- 10+: 0 0 1) (10+ 10+ 10+: 0 0 1) [1 1 1] 0 1 (4- 4- 21+: 1 1 0) (21+ 21+ 21+: 0 0 0) [2 2 1] 0 [0 1 2] 8 -0.250000 GraphAddEntries: 0 (2- 2- 10+: 0 0 1) (10+ 10+ 10+: 0 0 1) [1 1 1] 0 1 (4- 4- 21+: 0 0 0) (21+ 21+ 21+: -1 -1 0) [2 2 1] 0 [0 1 2] 9 -0.250000 GraphAddEntries: 0 (2- 2- 10+: 0 0 1) (10+ 10+ 10+: 0 0 1) [1 1 1] 0 1 (4- 4- 21+: 0 1 0) (21+ 21+ 21+: -1 0 0) [2 2 1] 0 [0 1 2] 10 -0.250000 GraphAddEntries: 1 (4- 4- 4-: 0 0 1) (4- 21+ 21+: 0 -1 -2) [1 2 2] 0 0 (2- 2- 2-: -1 0 0) (2- 10+ 10+: -1 0 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 1 (4- 4- 4-: 0 1 1) (4- 21+ 21+: 0 0 -2) [1 2 2] 0 0 (2- 2- 2-: -1 0 0) (2- 10+ 10+: -1 0 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 1 (4- 4- 4-: 0 0 2) (4- 21+ 21+: 0 -1 -1) [1 2 2] 0 0 (2- 2- 2-: -1 0 1) (2- 10+ 10+: -1 0 0) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 1 (4- 4- 4-: 0 1 2) (4- 21+ 21+: 0 0 -1) [1 2 2] 0 0 (2- 2- 2-: -1 0 1) (2- 10+ 10+: -1 0 0) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 1 (21+ 4- 4-: 0 0 2) (21+ 21+ 21+: 0 -1 -1) [1 2 2] 0 0 (10+ 2- 2-: 1 0 1) (10+ 10+ 10+: 1 0 0) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 1 (21+ 4- 4-: 0 1 2) (21+ 21+ 21+: 0 0 -1) [1 2 2] 0 0 (10+ 2- 2-: 1 0 1) (10+ 10+ 10+: 1 0 0) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 1 (21+ 4- 4-: 0 0 1) (21+ 21+ 21+: 0 -1 -2) [1 2 2] 0 0 (10+ 2- 2-: 1 0 0) (10+ 10+ 10+: 1 0 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 1 (21+ 4- 4-: 0 1 1) (21+ 21+ 21+: 0 0 -2) [1 2 2] 0 0 (10+ 2- 2-: 1 0 0) (10+ 10+ 10+: 1 0 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 1 (4- 4- 4-: 2 0 1) (21+ 4- 21+: -1 0 -2) [2 1 2] 0 0 (2- 2- 2-: 1 -1 0) (10+ 2- 10+: 0 -1 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 1 (4- 4- 4-: 2 0 2) (21+ 4- 21+: -1 0 -1) [2 1 2] 0 0 (2- 2- 2-: 1 -1 1) (10+ 2- 10+: 0 -1 0) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 1 (4- 4- 4-: 1 0 1) (21+ 4- 21+: -2 0 -2) [2 1 2] 0 0 (2- 2- 2-: 0 -1 0) (10+ 2- 10+: -1 -1 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 1 (4- 4- 4-: 1 0 2) (21+ 4- 21+: -2 0 -1) [2 1 2] 0 0 (2- 2- 2-: 0 -1 1) (10+ 2- 10+: -1 -1 0) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 1 (4- 21+ 4-: 2 0 2) (21+ 21+ 21+: -1 0 -1) [2 1 2] 0 0 (2- 10+ 2-: 1 1 1) (10+ 10+ 10+: 0 1 0) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 1 (4- 21+ 4-: 2 0 1) (21+ 21+ 21+: -1 0 -2) [2 1 2] 0 0 (2- 10+ 2-: 1 1 0) (10+ 10+ 10+: 0 1 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 1 (4- 21+ 4-: 1 0 2) (21+ 21+ 21+: -2 0 -1) [2 1 2] 0 0 (2- 10+ 2-: 0 1 1) (10+ 10+ 10+: -1 1 0) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 1 (4- 21+ 4-: 1 0 1) (21+ 21+ 21+: -2 0 -2) [2 1 2] 0 0 (2- 10+ 2-: 0 1 0) (10+ 10+ 10+: -1 1 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 1 (4- 4- 4-: 0 0 0) (21+ 21+ 4-: -1 -1 0) [2 2 1] 0 0 (2- 2- 2-: 0 0 -1) (10+ 10+ 2-: 0 0 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 1 (4- 4- 4-: 0 1 0) (21+ 21+ 4-: -1 0 0) [2 2 1] 0 0 (2- 2- 2-: 0 0 -1) (10+ 10+ 2-: 0 0 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 1 (4- 4- 4-: 1 0 0) (21+ 21+ 4-: 0 -1 0) [2 2 1] 0 0 (2- 2- 2-: 0 0 -1) (10+ 10+ 2-: 0 0 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 1 (4- 4- 4-: 1 1 0) (21+ 21+ 4-: 0 0 0) [2 2 1] 0 0 (2- 2- 2-: 0 0 -1) (10+ 10+ 2-: 0 0 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 1 (4- 4- 21+: 1 0 0) (21+ 21+ 21+: 0 -1 0) [2 2 1] 0 0 (2- 2- 10+: 0 0 1) (10+ 10+ 10+: 0 0 1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 1 (4- 4- 21+: 1 1 0) (21+ 21+ 21+: 0 0 0) [2 2 1] 0 0 (2- 2- 10+: 0 0 1) (10+ 10+ 10+: 0 0 1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 1 (4- 4- 21+: 0 0 0) (21+ 21+ 21+: -1 -1 0) [2 2 1] 0 0 (2- 2- 10+: 0 0 1) (10+ 10+ 10+: 0 0 1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 1 (4- 4- 21+: 0 1 0) (21+ 21+ 21+: -1 0 0) [2 2 1] 0 0 (2- 2- 10+: 0 0 1) (10+ 10+ 10+: 0 0 1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 1 (5- 5- 5-: -1 0 0) (5- 15+ 15+: -1 0 0) [1 1 1] 0 2 (10- 10- 10-: 0 0 1) (10- 31+ 31+: 0 -1 0) [1 2 2] 0 [0 1 2] 7 -0.250000 GraphAddEntries: 1 (5- 5- 5-: -1 0 0) (5- 15+ 15+: -1 0 0) [1 1 1] 0 2 (10- 10- 10-: 0 1 1) (10- 31+ 31+: 0 0 0) [1 2 2] 0 [0 1 2] 8 -0.250000 GraphAddEntries: 1 (5- 5- 5-: -1 0 0) (5- 15+ 15+: -1 0 0) [1 1 1] 0 2 (10- 10- 10-: 0 0 0) (10- 31+ 31+: 0 -1 -1) [1 2 2] 0 [0 1 2] 9 -0.250000 GraphAddEntries: 1 (5- 5- 5-: -1 0 0) (5- 15+ 15+: -1 0 0) [1 1 1] 0 2 (10- 10- 10-: 0 1 0) (10- 31+ 31+: 0 0 -1) [1 2 2] 0 [0 1 2] 10 -0.250000 GraphAddEntries: 1 (15+ 5- 5-: 1 0 0) (15+ 15+ 15+: 1 0 0) [1 1 1] 0 2 (31+ 10- 10-: 0 0 0) (31+ 31+ 31+: 0 -1 -1) [1 2 2] 0 [0 1 2] 7 -0.250000 GraphAddEntries: 1 (15+ 5- 5-: 1 0 0) (15+ 15+ 15+: 1 0 0) [1 1 1] 0 2 (31+ 10- 10-: 0 1 0) (31+ 31+ 31+: 0 0 -1) [1 2 2] 0 [0 1 2] 8 -0.250000 GraphAddEntries: 1 (15+ 5- 5-: 1 0 0) (15+ 15+ 15+: 1 0 0) [1 1 1] 0 2 (31+ 10- 10-: 0 0 1) (31+ 31+ 31+: 0 -1 0) [1 2 2] 0 [0 1 2] 9 -0.250000 GraphAddEntries: 1 (15+ 5- 5-: 1 0 0) (15+ 15+ 15+: 1 0 0) [1 1 1] 0 2 (31+ 10- 10-: 0 1 1) (31+ 31+ 31+: 0 0 0) [1 2 2] 0 [0 1 2] 10 -0.250000 GraphAddEntries: 1 (5- 5- 5-: 0 -1 0) (15+ 5- 15+: 0 -1 0) [1 1 1] 0 2 (10- 10- 10-: 0 0 1) (31+ 10- 31+: -1 0 0) [2 1 2] 0 [0 1 2] 7 -0.250000 GraphAddEntries: 1 (5- 5- 5-: 0 -1 0) (15+ 5- 15+: 0 -1 0) [1 1 1] 0 2 (10- 10- 10-: 0 0 0) (31+ 10- 31+: -1 0 -1) [2 1 2] 0 [0 1 2] 8 -0.250000 GraphAddEntries: 1 (5- 5- 5-: 0 -1 0) (15+ 5- 15+: 0 -1 0) [1 1 1] 0 2 (10- 10- 10-: 1 0 1) (31+ 10- 31+: 0 0 0) [2 1 2] 0 [0 1 2] 9 -0.250000 GraphAddEntries: 1 (5- 5- 5-: 0 -1 0) (15+ 5- 15+: 0 -1 0) [1 1 1] 0 2 (10- 10- 10-: 1 0 0) (31+ 10- 31+: 0 0 -1) [2 1 2] 0 [0 1 2] 10 -0.250000 GraphAddEntries: 1 (5- 15+ 5-: 0 1 0) (15+ 15+ 15+: 0 1 0) [1 1 1] 0 2 (10- 31+ 10-: 0 0 0) (31+ 31+ 31+: -1 0 -1) [2 1 2] 0 [0 1 2] 7 -0.250000 GraphAddEntries: 1 (5- 15+ 5-: 0 1 0) (15+ 15+ 15+: 0 1 0) [1 1 1] 0 2 (10- 31+ 10-: 0 0 1) (31+ 31+ 31+: -1 0 0) [2 1 2] 0 [0 1 2] 8 -0.250000 GraphAddEntries: 1 (5- 15+ 5-: 0 1 0) (15+ 15+ 15+: 0 1 0) [1 1 1] 0 2 (10- 31+ 10-: 1 0 0) (31+ 31+ 31+: 0 0 -1) [2 1 2] 0 [0 1 2] 9 -0.250000 GraphAddEntries: 1 (5- 15+ 5-: 0 1 0) (15+ 15+ 15+: 0 1 0) [1 1 1] 0 2 (10- 31+ 10-: 1 0 1) (31+ 31+ 31+: 0 0 0) [2 1 2] 0 [0 1 2] 10 -0.250000 GraphAddEntries: 1 (5- 5- 5-: 0 0 -1) (15+ 15+ 5-: 0 0 -1) [1 1 1] 0 2 (10- 10- 10-: 0 0 0) (31+ 31+ 10-: -1 -1 0) [2 2 1] 0 [0 1 2] 7 -0.250000 GraphAddEntries: 1 (5- 5- 5-: 0 0 -1) (15+ 15+ 5-: 0 0 -1) [1 1 1] 0 2 (10- 10- 10-: 0 1 0) (31+ 31+ 10-: -1 0 0) [2 2 1] 0 [0 1 2] 8 -0.250000 GraphAddEntries: 1 (5- 5- 5-: 0 0 -1) (15+ 15+ 5-: 0 0 -1) [1 1 1] 0 2 (10- 10- 10-: 1 0 0) (31+ 31+ 10-: 0 -1 0) [2 2 1] 0 [0 1 2] 9 -0.250000 GraphAddEntries: 1 (5- 5- 5-: 0 0 -1) (15+ 15+ 5-: 0 0 -1) [1 1 1] 0 2 (10- 10- 10-: 1 1 0) (31+ 31+ 10-: 0 0 0) [2 2 1] 0 [0 1 2] 10 -0.250000 GraphAddEntries: 1 (5- 5- 15+: 0 0 1) (15+ 15+ 15+: 0 0 1) [1 1 1] 0 2 (10- 10- 31+: 1 0 0) (31+ 31+ 31+: 0 -1 0) [2 2 1] 0 [0 1 2] 7 -0.250000 GraphAddEntries: 1 (5- 5- 15+: 0 0 1) (15+ 15+ 15+: 0 0 1) [1 1 1] 0 2 (10- 10- 31+: 1 1 0) (31+ 31+ 31+: 0 0 0) [2 2 1] 0 [0 1 2] 8 -0.250000 GraphAddEntries: 1 (5- 5- 15+: 0 0 1) (15+ 15+ 15+: 0 0 1) [1 1 1] 0 2 (10- 10- 31+: 0 0 0) (31+ 31+ 31+: -1 -1 0) [2 2 1] 0 [0 1 2] 9 -0.250000 GraphAddEntries: 1 (5- 5- 15+: 0 0 1) (15+ 15+ 15+: 0 0 1) [1 1 1] 0 2 (10- 10- 31+: 0 1 0) (31+ 31+ 31+: -1 0 0) [2 2 1] 0 [0 1 2] 10 -0.250000 GraphAddEntries: 1 (4- 4- 4-: 0 0 0) (4- 21+ 4-: 0 -1 0) [1 2 1] 0 0 (2- 2- 2-: -1 0 0) (2- 10+ 2-: -1 0 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 1 (4- 4- 4-: 0 1 0) (4- 21+ 4-: 0 0 0) [1 2 1] 0 0 (2- 2- 2-: -1 0 0) (2- 10+ 2-: -1 0 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 1 (21+ 4- 21+: 0 0 0) (21+ 21+ 21+: 0 -1 0) [1 2 1] 0 0 (10+ 2- 10+: 1 0 0) (10+ 10+ 10+: 1 0 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 1 (21+ 4- 21+: 0 1 0) (21+ 21+ 21+: 0 0 0) [1 2 1] 0 0 (10+ 2- 10+: 1 0 0) (10+ 10+ 10+: 1 0 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 1 (21+ 4- 4-: 0 0 0) (21+ 21+ 4-: 0 -1 0) [1 2 1] 0 0 (10+ 2- 2-: 1 0 0) (10+ 10+ 2-: 1 0 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 1 (21+ 4- 4-: 0 1 0) (21+ 21+ 4-: 0 0 0) [1 2 1] 0 0 (10+ 2- 2-: 1 0 0) (10+ 10+ 2-: 1 0 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 1 (4- 4- 21+: 0 0 0) (4- 21+ 21+: 0 -1 0) [1 2 1] 0 0 (2- 2- 10+: -1 0 0) (2- 10+ 10+: -1 0 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 1 (4- 4- 21+: 0 1 0) (4- 21+ 21+: 0 0 0) [1 2 1] 0 0 (2- 2- 10+: -1 0 0) (2- 10+ 10+: -1 0 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 1 (4- 4- 4-: 2 0 0) (21+ 4- 4-: -1 0 0) [2 1 1] 0 0 (2- 2- 2-: 1 -1 0) (10+ 2- 2-: 0 -1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 1 (4- 4- 4-: 0 0 2) (4- 4- 21+: 0 0 -1) [1 1 2] 0 0 (2- 2- 2-: 0 -1 1) (2- 2- 10+: 0 -1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 1 (4- 4- 21+: 2 0 0) (21+ 4- 21+: -1 0 0) [2 1 1] 0 0 (2- 2- 10+: 1 -1 0) (10+ 2- 10+: 0 -1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 1 (21+ 4- 4-: 0 0 2) (21+ 4- 21+: 0 0 -1) [1 1 2] 0 0 (10+ 2- 2-: 0 -1 1) (10+ 2- 10+: 0 -1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 1 (4- 4- 4-: 1 0 0) (21+ 4- 4-: -2 0 0) [2 1 1] 0 0 (2- 2- 2-: 0 -1 0) (10+ 2- 2-: -1 -1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 1 (4- 4- 4-: 0 0 1) (4- 4- 21+: 0 0 -2) [1 1 2] 0 0 (2- 2- 2-: 0 -1 0) (2- 2- 10+: 0 -1 -1) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 1 (4- 4- 21+: 1 0 0) (21+ 4- 21+: -2 0 0) [2 1 1] 0 0 (2- 2- 10+: 0 -1 0) (10+ 2- 10+: -1 -1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 1 (21+ 4- 4-: 0 0 1) (21+ 4- 21+: 0 0 -2) [1 1 2] 0 0 (10+ 2- 2-: 0 -1 0) (10+ 2- 10+: 0 -1 -1) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 1 (4- 21+ 4-: 2 0 0) (21+ 21+ 4-: -1 0 0) [2 1 1] 0 0 (2- 10+ 2-: 1 1 0) (10+ 10+ 2-: 0 1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 1 (4- 21+ 4-: 0 0 2) (4- 21+ 21+: 0 0 -1) [1 1 2] 0 0 (2- 10+ 2-: 0 1 1) (2- 10+ 10+: 0 1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 1 (4- 21+ 21+: 2 0 0) (21+ 21+ 21+: -1 0 0) [2 1 1] 0 0 (2- 10+ 10+: 1 1 0) (10+ 10+ 10+: 0 1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 1 (21+ 21+ 4-: 0 0 2) (21+ 21+ 21+: 0 0 -1) [1 1 2] 0 0 (10+ 10+ 2-: 0 1 1) (10+ 10+ 10+: 0 1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 1 (4- 21+ 4-: 1 0 0) (21+ 21+ 4-: -2 0 0) [2 1 1] 0 0 (2- 10+ 2-: 0 1 0) (10+ 10+ 2-: -1 1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 1 (4- 21+ 4-: 0 0 1) (4- 21+ 21+: 0 0 -2) [1 1 2] 0 0 (2- 10+ 2-: 0 1 0) (2- 10+ 10+: 0 1 -1) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 1 (4- 21+ 21+: 1 0 0) (21+ 21+ 21+: -2 0 0) [2 1 1] 0 0 (2- 10+ 10+: 0 1 0) (10+ 10+ 10+: -1 1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 1 (21+ 21+ 4-: 0 0 1) (21+ 21+ 21+: 0 0 -2) [1 1 2] 0 0 (10+ 10+ 2-: 0 1 0) (10+ 10+ 10+: 0 1 -1) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 1 (4- 4- 4-: 0 0 0) (4- 4- 4-: 0 0 0) [1 1 1] 0 0 (2- 2- 2-: 0 -1 0) (2- 2- 2-: 0 -1 0) [1 1 1] 0 [0 1 2] 9 -1.000000 GraphAddEntries: 1 (21+ 4- 4-: 0 0 0) (21+ 4- 4-: 0 0 0) [1 1 1] 0 0 (10+ 2- 2-: 0 -1 0) (10+ 2- 2-: 0 -1 0) [1 1 1] 0 [0 1 2] 9 -1.000000 GraphAddEntries: 1 (4- 4- 21+: 0 0 0) (4- 4- 21+: 0 0 0) [1 1 1] 0 0 (2- 2- 10+: 0 -1 0) (2- 2- 10+: 0 -1 0) [1 1 1] 0 [0 1 2] 9 -1.000000 GraphAddEntries: 1 (21+ 4- 21+: 0 0 0) (21+ 4- 21+: 0 0 0) [1 1 1] 0 0 (10+ 2- 10+: 0 -1 0) (10+ 2- 10+: 0 -1 0) [1 1 1] 0 [0 1 2] 9 -1.000000 GraphAddEntries: 1 (4- 21+ 4-: 0 0 0) (4- 21+ 4-: 0 0 0) [1 1 1] 0 0 (2- 10+ 2-: 0 1 0) (2- 10+ 2-: 0 1 0) [1 1 1] 0 [0 1 2] 9 -1.000000 GraphAddEntries: 1 (21+ 21+ 4-: 0 0 0) (21+ 21+ 4-: 0 0 0) [1 1 1] 0 0 (10+ 10+ 2-: 0 1 0) (10+ 10+ 2-: 0 1 0) [1 1 1] 0 [0 1 2] 9 -1.000000 GraphAddEntries: 1 (4- 21+ 21+: 0 0 0) (4- 21+ 21+: 0 0 0) [1 1 1] 0 0 (2- 10+ 10+: 0 1 0) (2- 10+ 10+: 0 1 0) [1 1 1] 0 [0 1 2] 9 -1.000000 GraphAddEntries: 1 (21+ 21+ 21+: 0 0 0) (21+ 21+ 21+: 0 0 0) [1 1 1] 0 0 (10+ 10+ 10+: 0 1 0) (10+ 10+ 10+: 0 1 0) [1 1 1] 0 [0 1 2] 9 -1.000000 GraphAddEntries: 2 (10- 10- 10-: 0 0 1) (10- 31+ 31+: 0 -1 -2) [1 2 2] 0 1 (5- 5- 5-: -1 0 0) (5- 15+ 15+: -1 0 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 2 (10- 10- 10-: 0 1 1) (10- 31+ 31+: 0 0 -2) [1 2 2] 0 1 (5- 5- 5-: -1 0 0) (5- 15+ 15+: -1 0 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 2 (10- 10- 10-: 0 0 2) (10- 31+ 31+: 0 -1 -1) [1 2 2] 0 1 (5- 5- 5-: -1 0 1) (5- 15+ 15+: -1 0 0) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 2 (10- 10- 10-: 0 1 2) (10- 31+ 31+: 0 0 -1) [1 2 2] 0 1 (5- 5- 5-: -1 0 1) (5- 15+ 15+: -1 0 0) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 2 (31+ 10- 10-: 0 0 2) (31+ 31+ 31+: 0 -1 -1) [1 2 2] 0 1 (15+ 5- 5-: 1 0 1) (15+ 15+ 15+: 1 0 0) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 2 (31+ 10- 10-: 0 1 2) (31+ 31+ 31+: 0 0 -1) [1 2 2] 0 1 (15+ 5- 5-: 1 0 1) (15+ 15+ 15+: 1 0 0) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 2 (31+ 10- 10-: 0 0 1) (31+ 31+ 31+: 0 -1 -2) [1 2 2] 0 1 (15+ 5- 5-: 1 0 0) (15+ 15+ 15+: 1 0 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 2 (31+ 10- 10-: 0 1 1) (31+ 31+ 31+: 0 0 -2) [1 2 2] 0 1 (15+ 5- 5-: 1 0 0) (15+ 15+ 15+: 1 0 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 2 (10- 10- 10-: 2 0 1) (31+ 10- 31+: -1 0 -2) [2 1 2] 0 1 (5- 5- 5-: 1 -1 0) (15+ 5- 15+: 0 -1 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 2 (10- 10- 10-: 2 0 2) (31+ 10- 31+: -1 0 -1) [2 1 2] 0 1 (5- 5- 5-: 1 -1 1) (15+ 5- 15+: 0 -1 0) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 2 (10- 10- 10-: 1 0 1) (31+ 10- 31+: -2 0 -2) [2 1 2] 0 1 (5- 5- 5-: 0 -1 0) (15+ 5- 15+: -1 -1 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 2 (10- 10- 10-: 1 0 2) (31+ 10- 31+: -2 0 -1) [2 1 2] 0 1 (5- 5- 5-: 0 -1 1) (15+ 5- 15+: -1 -1 0) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 2 (10- 31+ 10-: 2 0 2) (31+ 31+ 31+: -1 0 -1) [2 1 2] 0 1 (5- 15+ 5-: 1 1 1) (15+ 15+ 15+: 0 1 0) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 2 (10- 31+ 10-: 2 0 1) (31+ 31+ 31+: -1 0 -2) [2 1 2] 0 1 (5- 15+ 5-: 1 1 0) (15+ 15+ 15+: 0 1 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 2 (10- 31+ 10-: 1 0 2) (31+ 31+ 31+: -2 0 -1) [2 1 2] 0 1 (5- 15+ 5-: 0 1 1) (15+ 15+ 15+: -1 1 0) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 2 (10- 31+ 10-: 1 0 1) (31+ 31+ 31+: -2 0 -2) [2 1 2] 0 1 (5- 15+ 5-: 0 1 0) (15+ 15+ 15+: -1 1 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 2 (10- 10- 10-: 0 0 0) (31+ 31+ 10-: -1 -1 0) [2 2 1] 0 1 (5- 5- 5-: 0 0 -1) (15+ 15+ 5-: 0 0 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 2 (10- 10- 10-: 0 1 0) (31+ 31+ 10-: -1 0 0) [2 2 1] 0 1 (5- 5- 5-: 0 0 -1) (15+ 15+ 5-: 0 0 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 2 (10- 10- 10-: 1 0 0) (31+ 31+ 10-: 0 -1 0) [2 2 1] 0 1 (5- 5- 5-: 0 0 -1) (15+ 15+ 5-: 0 0 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 2 (10- 10- 10-: 1 1 0) (31+ 31+ 10-: 0 0 0) [2 2 1] 0 1 (5- 5- 5-: 0 0 -1) (15+ 15+ 5-: 0 0 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 2 (10- 10- 31+: 1 0 0) (31+ 31+ 31+: 0 -1 0) [2 2 1] 0 1 (5- 5- 15+: 0 0 1) (15+ 15+ 15+: 0 0 1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 2 (10- 10- 31+: 1 1 0) (31+ 31+ 31+: 0 0 0) [2 2 1] 0 1 (5- 5- 15+: 0 0 1) (15+ 15+ 15+: 0 0 1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 2 (10- 10- 31+: 0 0 0) (31+ 31+ 31+: -1 -1 0) [2 2 1] 0 1 (5- 5- 15+: 0 0 1) (15+ 15+ 15+: 0 0 1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 2 (10- 10- 31+: 0 1 0) (31+ 31+ 31+: -1 0 0) [2 2 1] 0 1 (5- 5- 15+: 0 0 1) (15+ 15+ 15+: 0 0 1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 2 (11- 11- 11-: -1 0 0) (11- 28+ 28+: -1 0 0) [1 1 1] 0 3 (22- 22- 22-: 0 0 1) (22- 57+ 57+: 0 -1 0) [1 2 2] 0 [0 1 2] 7 -0.250000 GraphAddEntries: 2 (11- 11- 11-: -1 0 0) (11- 28+ 28+: -1 0 0) [1 1 1] 0 3 (22- 22- 22-: 0 1 1) (22- 57+ 57+: 0 0 0) [1 2 2] 0 [0 1 2] 8 -0.250000 GraphAddEntries: 2 (11- 11- 11-: -1 0 0) (11- 28+ 28+: -1 0 0) [1 1 1] 0 3 (22- 22- 22-: 0 0 0) (22- 57+ 57+: 0 -1 -1) [1 2 2] 0 [0 1 2] 9 -0.250000 GraphAddEntries: 2 (11- 11- 11-: -1 0 0) (11- 28+ 28+: -1 0 0) [1 1 1] 0 3 (22- 22- 22-: 0 1 0) (22- 57+ 57+: 0 0 -1) [1 2 2] 0 [0 1 2] 10 -0.250000 GraphAddEntries: 2 (28+ 11- 11-: 1 0 0) (28+ 28+ 28+: 1 0 0) [1 1 1] 0 3 (57+ 22- 22-: 0 0 0) (57+ 57+ 57+: 0 -1 -1) [1 2 2] 0 [0 1 2] 7 -0.250000 GraphAddEntries: 2 (28+ 11- 11-: 1 0 0) (28+ 28+ 28+: 1 0 0) [1 1 1] 0 3 (57+ 22- 22-: 0 1 0) (57+ 57+ 57+: 0 0 -1) [1 2 2] 0 [0 1 2] 8 -0.250000 GraphAddEntries: 2 (28+ 11- 11-: 1 0 0) (28+ 28+ 28+: 1 0 0) [1 1 1] 0 3 (57+ 22- 22-: 0 0 1) (57+ 57+ 57+: 0 -1 0) [1 2 2] 0 [0 1 2] 9 -0.250000 GraphAddEntries: 2 (28+ 11- 11-: 1 0 0) (28+ 28+ 28+: 1 0 0) [1 1 1] 0 3 (57+ 22- 22-: 0 1 1) (57+ 57+ 57+: 0 0 0) [1 2 2] 0 [0 1 2] 10 -0.250000 GraphAddEntries: 2 (11- 11- 11-: 0 -1 0) (28+ 11- 28+: 0 -1 0) [1 1 1] 0 3 (22- 22- 22-: 0 0 1) (57+ 22- 57+: -1 0 0) [2 1 2] 0 [0 1 2] 7 -0.250000 GraphAddEntries: 2 (11- 11- 11-: 0 -1 0) (28+ 11- 28+: 0 -1 0) [1 1 1] 0 3 (22- 22- 22-: 0 0 0) (57+ 22- 57+: -1 0 -1) [2 1 2] 0 [0 1 2] 8 -0.250000 GraphAddEntries: 2 (11- 11- 11-: 0 -1 0) (28+ 11- 28+: 0 -1 0) [1 1 1] 0 3 (22- 22- 22-: 1 0 1) (57+ 22- 57+: 0 0 0) [2 1 2] 0 [0 1 2] 9 -0.250000 GraphAddEntries: 2 (11- 11- 11-: 0 -1 0) (28+ 11- 28+: 0 -1 0) [1 1 1] 0 3 (22- 22- 22-: 1 0 0) (57+ 22- 57+: 0 0 -1) [2 1 2] 0 [0 1 2] 10 -0.250000 GraphAddEntries: 2 (11- 28+ 11-: 0 1 0) (28+ 28+ 28+: 0 1 0) [1 1 1] 0 3 (22- 57+ 22-: 0 0 0) (57+ 57+ 57+: -1 0 -1) [2 1 2] 0 [0 1 2] 7 -0.250000 GraphAddEntries: 2 (11- 28+ 11-: 0 1 0) (28+ 28+ 28+: 0 1 0) [1 1 1] 0 3 (22- 57+ 22-: 0 0 1) (57+ 57+ 57+: -1 0 0) [2 1 2] 0 [0 1 2] 8 -0.250000 GraphAddEntries: 2 (11- 28+ 11-: 0 1 0) (28+ 28+ 28+: 0 1 0) [1 1 1] 0 3 (22- 57+ 22-: 1 0 0) (57+ 57+ 57+: 0 0 -1) [2 1 2] 0 [0 1 2] 9 -0.250000 GraphAddEntries: 2 (11- 28+ 11-: 0 1 0) (28+ 28+ 28+: 0 1 0) [1 1 1] 0 3 (22- 57+ 22-: 1 0 1) (57+ 57+ 57+: 0 0 0) [2 1 2] 0 [0 1 2] 10 -0.250000 GraphAddEntries: 2 (11- 11- 11-: 0 0 -1) (28+ 28+ 11-: 0 0 -1) [1 1 1] 0 3 (22- 22- 22-: 0 0 0) (57+ 57+ 22-: -1 -1 0) [2 2 1] 0 [0 1 2] 7 -0.250000 GraphAddEntries: 2 (11- 11- 11-: 0 0 -1) (28+ 28+ 11-: 0 0 -1) [1 1 1] 0 3 (22- 22- 22-: 0 1 0) (57+ 57+ 22-: -1 0 0) [2 2 1] 0 [0 1 2] 8 -0.250000 GraphAddEntries: 2 (11- 11- 11-: 0 0 -1) (28+ 28+ 11-: 0 0 -1) [1 1 1] 0 3 (22- 22- 22-: 1 0 0) (57+ 57+ 22-: 0 -1 0) [2 2 1] 0 [0 1 2] 9 -0.250000 GraphAddEntries: 2 (11- 11- 11-: 0 0 -1) (28+ 28+ 11-: 0 0 -1) [1 1 1] 0 3 (22- 22- 22-: 1 1 0) (57+ 57+ 22-: 0 0 0) [2 2 1] 0 [0 1 2] 10 -0.250000 GraphAddEntries: 2 (11- 11- 28+: 0 0 1) (28+ 28+ 28+: 0 0 1) [1 1 1] 0 3 (22- 22- 57+: 1 0 0) (57+ 57+ 57+: 0 -1 0) [2 2 1] 0 [0 1 2] 7 -0.250000 GraphAddEntries: 2 (11- 11- 28+: 0 0 1) (28+ 28+ 28+: 0 0 1) [1 1 1] 0 3 (22- 22- 57+: 1 1 0) (57+ 57+ 57+: 0 0 0) [2 2 1] 0 [0 1 2] 8 -0.250000 GraphAddEntries: 2 (11- 11- 28+: 0 0 1) (28+ 28+ 28+: 0 0 1) [1 1 1] 0 3 (22- 22- 57+: 0 0 0) (57+ 57+ 57+: -1 -1 0) [2 2 1] 0 [0 1 2] 9 -0.250000 GraphAddEntries: 2 (11- 11- 28+: 0 0 1) (28+ 28+ 28+: 0 0 1) [1 1 1] 0 3 (22- 22- 57+: 0 1 0) (57+ 57+ 57+: -1 0 0) [2 2 1] 0 [0 1 2] 10 -0.250000 GraphAddEntries: 2 (10- 10- 10-: 0 0 0) (10- 31+ 10-: 0 -1 0) [1 2 1] 0 1 (5- 5- 5-: -1 0 0) (5- 15+ 5-: -1 0 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 2 (10- 10- 10-: 0 1 0) (10- 31+ 10-: 0 0 0) [1 2 1] 0 1 (5- 5- 5-: -1 0 0) (5- 15+ 5-: -1 0 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 2 (31+ 10- 31+: 0 0 0) (31+ 31+ 31+: 0 -1 0) [1 2 1] 0 1 (15+ 5- 15+: 1 0 0) (15+ 15+ 15+: 1 0 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 2 (31+ 10- 31+: 0 1 0) (31+ 31+ 31+: 0 0 0) [1 2 1] 0 1 (15+ 5- 15+: 1 0 0) (15+ 15+ 15+: 1 0 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 2 (31+ 10- 10-: 0 0 0) (31+ 31+ 10-: 0 -1 0) [1 2 1] 0 1 (15+ 5- 5-: 1 0 0) (15+ 15+ 5-: 1 0 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 2 (31+ 10- 10-: 0 1 0) (31+ 31+ 10-: 0 0 0) [1 2 1] 0 1 (15+ 5- 5-: 1 0 0) (15+ 15+ 5-: 1 0 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 2 (10- 10- 31+: 0 0 0) (10- 31+ 31+: 0 -1 0) [1 2 1] 0 1 (5- 5- 15+: -1 0 0) (5- 15+ 15+: -1 0 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 2 (10- 10- 31+: 0 1 0) (10- 31+ 31+: 0 0 0) [1 2 1] 0 1 (5- 5- 15+: -1 0 0) (5- 15+ 15+: -1 0 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 2 (10- 10- 10-: 2 0 0) (31+ 10- 10-: -1 0 0) [2 1 1] 0 1 (5- 5- 5-: 1 -1 0) (15+ 5- 5-: 0 -1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 2 (10- 10- 10-: 0 0 2) (10- 10- 31+: 0 0 -1) [1 1 2] 0 1 (5- 5- 5-: 0 -1 1) (5- 5- 15+: 0 -1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 2 (10- 10- 31+: 2 0 0) (31+ 10- 31+: -1 0 0) [2 1 1] 0 1 (5- 5- 15+: 1 -1 0) (15+ 5- 15+: 0 -1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 2 (31+ 10- 10-: 0 0 2) (31+ 10- 31+: 0 0 -1) [1 1 2] 0 1 (15+ 5- 5-: 0 -1 1) (15+ 5- 15+: 0 -1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 2 (10- 10- 10-: 1 0 0) (31+ 10- 10-: -2 0 0) [2 1 1] 0 1 (5- 5- 5-: 0 -1 0) (15+ 5- 5-: -1 -1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 2 (10- 10- 10-: 0 0 1) (10- 10- 31+: 0 0 -2) [1 1 2] 0 1 (5- 5- 5-: 0 -1 0) (5- 5- 15+: 0 -1 -1) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 2 (10- 10- 31+: 1 0 0) (31+ 10- 31+: -2 0 0) [2 1 1] 0 1 (5- 5- 15+: 0 -1 0) (15+ 5- 15+: -1 -1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 2 (31+ 10- 10-: 0 0 1) (31+ 10- 31+: 0 0 -2) [1 1 2] 0 1 (15+ 5- 5-: 0 -1 0) (15+ 5- 15+: 0 -1 -1) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 2 (10- 31+ 10-: 2 0 0) (31+ 31+ 10-: -1 0 0) [2 1 1] 0 1 (5- 15+ 5-: 1 1 0) (15+ 15+ 5-: 0 1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 2 (10- 31+ 10-: 0 0 2) (10- 31+ 31+: 0 0 -1) [1 1 2] 0 1 (5- 15+ 5-: 0 1 1) (5- 15+ 15+: 0 1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 2 (10- 31+ 31+: 2 0 0) (31+ 31+ 31+: -1 0 0) [2 1 1] 0 1 (5- 15+ 15+: 1 1 0) (15+ 15+ 15+: 0 1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 2 (31+ 31+ 10-: 0 0 2) (31+ 31+ 31+: 0 0 -1) [1 1 2] 0 1 (15+ 15+ 5-: 0 1 1) (15+ 15+ 15+: 0 1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 2 (10- 31+ 10-: 1 0 0) (31+ 31+ 10-: -2 0 0) [2 1 1] 0 1 (5- 15+ 5-: 0 1 0) (15+ 15+ 5-: -1 1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 2 (10- 31+ 10-: 0 0 1) (10- 31+ 31+: 0 0 -2) [1 1 2] 0 1 (5- 15+ 5-: 0 1 0) (5- 15+ 15+: 0 1 -1) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 2 (10- 31+ 31+: 1 0 0) (31+ 31+ 31+: -2 0 0) [2 1 1] 0 1 (5- 15+ 15+: 0 1 0) (15+ 15+ 15+: -1 1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 2 (31+ 31+ 10-: 0 0 1) (31+ 31+ 31+: 0 0 -2) [1 1 2] 0 1 (15+ 15+ 5-: 0 1 0) (15+ 15+ 15+: 0 1 -1) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 2 (10- 10- 10-: 0 0 0) (10- 10- 10-: 0 0 0) [1 1 1] 0 1 (5- 5- 5-: 0 -1 0) (5- 5- 5-: 0 -1 0) [1 1 1] 0 [0 1 2] 9 -1.000000 GraphAddEntries: 2 (31+ 10- 10-: 0 0 0) (31+ 10- 10-: 0 0 0) [1 1 1] 0 1 (15+ 5- 5-: 0 -1 0) (15+ 5- 5-: 0 -1 0) [1 1 1] 0 [0 1 2] 9 -1.000000 GraphAddEntries: 2 (10- 10- 31+: 0 0 0) (10- 10- 31+: 0 0 0) [1 1 1] 0 1 (5- 5- 15+: 0 -1 0) (5- 5- 15+: 0 -1 0) [1 1 1] 0 [0 1 2] 9 -1.000000 GraphAddEntries: 2 (31+ 10- 31+: 0 0 0) (31+ 10- 31+: 0 0 0) [1 1 1] 0 1 (15+ 5- 15+: 0 -1 0) (15+ 5- 15+: 0 -1 0) [1 1 1] 0 [0 1 2] 9 -1.000000 GraphAddEntries: 2 (10- 31+ 10-: 0 0 0) (10- 31+ 10-: 0 0 0) [1 1 1] 0 1 (5- 15+ 5-: 0 1 0) (5- 15+ 5-: 0 1 0) [1 1 1] 0 [0 1 2] 9 -1.000000 GraphAddEntries: 2 (31+ 31+ 10-: 0 0 0) (31+ 31+ 10-: 0 0 0) [1 1 1] 0 1 (15+ 15+ 5-: 0 1 0) (15+ 15+ 5-: 0 1 0) [1 1 1] 0 [0 1 2] 9 -1.000000 GraphAddEntries: 2 (10- 31+ 31+: 0 0 0) (10- 31+ 31+: 0 0 0) [1 1 1] 0 1 (5- 15+ 15+: 0 1 0) (5- 15+ 15+: 0 1 0) [1 1 1] 0 [0 1 2] 9 -1.000000 GraphAddEntries: 2 (31+ 31+ 31+: 0 0 0) (31+ 31+ 31+: 0 0 0) [1 1 1] 0 1 (15+ 15+ 15+: 0 1 0) (15+ 15+ 15+: 0 1 0) [1 1 1] 0 [0 1 2] 9 -1.000000 GraphAddEntries: 3 (22- 22- 22-: 0 0 1) (22- 57+ 57+: 0 -1 -2) [1 2 2] 0 2 (11- 11- 11-: -1 0 0) (11- 28+ 28+: -1 0 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 3 (22- 22- 22-: 0 1 1) (22- 57+ 57+: 0 0 -2) [1 2 2] 0 2 (11- 11- 11-: -1 0 0) (11- 28+ 28+: -1 0 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 3 (22- 22- 22-: 0 0 2) (22- 57+ 57+: 0 -1 -1) [1 2 2] 0 2 (11- 11- 11-: -1 0 1) (11- 28+ 28+: -1 0 0) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 3 (22- 22- 22-: 0 1 2) (22- 57+ 57+: 0 0 -1) [1 2 2] 0 2 (11- 11- 11-: -1 0 1) (11- 28+ 28+: -1 0 0) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 3 (57+ 22- 22-: 0 0 2) (57+ 57+ 57+: 0 -1 -1) [1 2 2] 0 2 (28+ 11- 11-: 1 0 1) (28+ 28+ 28+: 1 0 0) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 3 (57+ 22- 22-: 0 1 2) (57+ 57+ 57+: 0 0 -1) [1 2 2] 0 2 (28+ 11- 11-: 1 0 1) (28+ 28+ 28+: 1 0 0) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 3 (57+ 22- 22-: 0 0 1) (57+ 57+ 57+: 0 -1 -2) [1 2 2] 0 2 (28+ 11- 11-: 1 0 0) (28+ 28+ 28+: 1 0 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 3 (57+ 22- 22-: 0 1 1) (57+ 57+ 57+: 0 0 -2) [1 2 2] 0 2 (28+ 11- 11-: 1 0 0) (28+ 28+ 28+: 1 0 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 3 (22- 22- 22-: 2 0 1) (57+ 22- 57+: -1 0 -2) [2 1 2] 0 2 (11- 11- 11-: 1 -1 0) (28+ 11- 28+: 0 -1 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 3 (22- 22- 22-: 2 0 2) (57+ 22- 57+: -1 0 -1) [2 1 2] 0 2 (11- 11- 11-: 1 -1 1) (28+ 11- 28+: 0 -1 0) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 3 (22- 22- 22-: 1 0 1) (57+ 22- 57+: -2 0 -2) [2 1 2] 0 2 (11- 11- 11-: 0 -1 0) (28+ 11- 28+: -1 -1 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 3 (22- 22- 22-: 1 0 2) (57+ 22- 57+: -2 0 -1) [2 1 2] 0 2 (11- 11- 11-: 0 -1 1) (28+ 11- 28+: -1 -1 0) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 3 (22- 57+ 22-: 2 0 2) (57+ 57+ 57+: -1 0 -1) [2 1 2] 0 2 (11- 28+ 11-: 1 1 1) (28+ 28+ 28+: 0 1 0) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 3 (22- 57+ 22-: 2 0 1) (57+ 57+ 57+: -1 0 -2) [2 1 2] 0 2 (11- 28+ 11-: 1 1 0) (28+ 28+ 28+: 0 1 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 3 (22- 57+ 22-: 1 0 2) (57+ 57+ 57+: -2 0 -1) [2 1 2] 0 2 (11- 28+ 11-: 0 1 1) (28+ 28+ 28+: -1 1 0) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 3 (22- 57+ 22-: 1 0 1) (57+ 57+ 57+: -2 0 -2) [2 1 2] 0 2 (11- 28+ 11-: 0 1 0) (28+ 28+ 28+: -1 1 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 3 (22- 22- 22-: 0 0 0) (57+ 57+ 22-: -1 -1 0) [2 2 1] 0 2 (11- 11- 11-: 0 0 -1) (28+ 28+ 11-: 0 0 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 3 (22- 22- 22-: 0 1 0) (57+ 57+ 22-: -1 0 0) [2 2 1] 0 2 (11- 11- 11-: 0 0 -1) (28+ 28+ 11-: 0 0 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 3 (22- 22- 22-: 1 0 0) (57+ 57+ 22-: 0 -1 0) [2 2 1] 0 2 (11- 11- 11-: 0 0 -1) (28+ 28+ 11-: 0 0 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 3 (22- 22- 22-: 1 1 0) (57+ 57+ 22-: 0 0 0) [2 2 1] 0 2 (11- 11- 11-: 0 0 -1) (28+ 28+ 11-: 0 0 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 3 (22- 22- 57+: 1 0 0) (57+ 57+ 57+: 0 -1 0) [2 2 1] 0 2 (11- 11- 28+: 0 0 1) (28+ 28+ 28+: 0 0 1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 3 (22- 22- 57+: 1 1 0) (57+ 57+ 57+: 0 0 0) [2 2 1] 0 2 (11- 11- 28+: 0 0 1) (28+ 28+ 28+: 0 0 1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 3 (22- 22- 57+: 0 0 0) (57+ 57+ 57+: -1 -1 0) [2 2 1] 0 2 (11- 11- 28+: 0 0 1) (28+ 28+ 28+: 0 0 1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 3 (22- 22- 57+: 0 1 0) (57+ 57+ 57+: -1 0 0) [2 2 1] 0 2 (11- 11- 28+: 0 0 1) (28+ 28+ 28+: 0 0 1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 3 (22- 22- 22-: 0 0 0) (22- 57+ 22-: 0 -1 0) [1 2 1] 0 2 (11- 11- 11-: -1 0 0) (11- 28+ 11-: -1 0 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 3 (22- 22- 22-: 0 1 0) (22- 57+ 22-: 0 0 0) [1 2 1] 0 2 (11- 11- 11-: -1 0 0) (11- 28+ 11-: -1 0 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 3 (57+ 22- 57+: 0 0 0) (57+ 57+ 57+: 0 -1 0) [1 2 1] 0 2 (28+ 11- 28+: 1 0 0) (28+ 28+ 28+: 1 0 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 3 (57+ 22- 57+: 0 1 0) (57+ 57+ 57+: 0 0 0) [1 2 1] 0 2 (28+ 11- 28+: 1 0 0) (28+ 28+ 28+: 1 0 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 3 (57+ 22- 22-: 0 0 0) (57+ 57+ 22-: 0 -1 0) [1 2 1] 0 2 (28+ 11- 11-: 1 0 0) (28+ 28+ 11-: 1 0 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 3 (57+ 22- 22-: 0 1 0) (57+ 57+ 22-: 0 0 0) [1 2 1] 0 2 (28+ 11- 11-: 1 0 0) (28+ 28+ 11-: 1 0 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 3 (22- 22- 57+: 0 0 0) (22- 57+ 57+: 0 -1 0) [1 2 1] 0 2 (11- 11- 28+: -1 0 0) (11- 28+ 28+: -1 0 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 3 (22- 22- 57+: 0 1 0) (22- 57+ 57+: 0 0 0) [1 2 1] 0 2 (11- 11- 28+: -1 0 0) (11- 28+ 28+: -1 0 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 3 (22- 22- 22-: 2 0 0) (57+ 22- 22-: -1 0 0) [2 1 1] 0 2 (11- 11- 11-: 1 -1 0) (28+ 11- 11-: 0 -1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 3 (22- 22- 22-: 0 0 2) (22- 22- 57+: 0 0 -1) [1 1 2] 0 2 (11- 11- 11-: 0 -1 1) (11- 11- 28+: 0 -1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 3 (22- 22- 57+: 2 0 0) (57+ 22- 57+: -1 0 0) [2 1 1] 0 2 (11- 11- 28+: 1 -1 0) (28+ 11- 28+: 0 -1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 3 (57+ 22- 22-: 0 0 2) (57+ 22- 57+: 0 0 -1) [1 1 2] 0 2 (28+ 11- 11-: 0 -1 1) (28+ 11- 28+: 0 -1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 3 (22- 22- 22-: 1 0 0) (57+ 22- 22-: -2 0 0) [2 1 1] 0 2 (11- 11- 11-: 0 -1 0) (28+ 11- 11-: -1 -1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 3 (22- 22- 22-: 0 0 1) (22- 22- 57+: 0 0 -2) [1 1 2] 0 2 (11- 11- 11-: 0 -1 0) (11- 11- 28+: 0 -1 -1) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 3 (22- 22- 57+: 1 0 0) (57+ 22- 57+: -2 0 0) [2 1 1] 0 2 (11- 11- 28+: 0 -1 0) (28+ 11- 28+: -1 -1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 3 (57+ 22- 22-: 0 0 1) (57+ 22- 57+: 0 0 -2) [1 1 2] 0 2 (28+ 11- 11-: 0 -1 0) (28+ 11- 28+: 0 -1 -1) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 3 (22- 57+ 22-: 2 0 0) (57+ 57+ 22-: -1 0 0) [2 1 1] 0 2 (11- 28+ 11-: 1 1 0) (28+ 28+ 11-: 0 1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 3 (22- 57+ 22-: 0 0 2) (22- 57+ 57+: 0 0 -1) [1 1 2] 0 2 (11- 28+ 11-: 0 1 1) (11- 28+ 28+: 0 1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 3 (22- 57+ 57+: 2 0 0) (57+ 57+ 57+: -1 0 0) [2 1 1] 0 2 (11- 28+ 28+: 1 1 0) (28+ 28+ 28+: 0 1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 3 (57+ 57+ 22-: 0 0 2) (57+ 57+ 57+: 0 0 -1) [1 1 2] 0 2 (28+ 28+ 11-: 0 1 1) (28+ 28+ 28+: 0 1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 3 (22- 57+ 22-: 1 0 0) (57+ 57+ 22-: -2 0 0) [2 1 1] 0 2 (11- 28+ 11-: 0 1 0) (28+ 28+ 11-: -1 1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 3 (22- 57+ 22-: 0 0 1) (22- 57+ 57+: 0 0 -2) [1 1 2] 0 2 (11- 28+ 11-: 0 1 0) (11- 28+ 28+: 0 1 -1) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 3 (22- 57+ 57+: 1 0 0) (57+ 57+ 57+: -2 0 0) [2 1 1] 0 2 (11- 28+ 28+: 0 1 0) (28+ 28+ 28+: -1 1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 3 (57+ 57+ 22-: 0 0 1) (57+ 57+ 57+: 0 0 -2) [1 1 2] 0 2 (28+ 28+ 11-: 0 1 0) (28+ 28+ 28+: 0 1 -1) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 3 (22- 22- 22-: 0 0 0) (22- 22- 22-: 0 0 0) [1 1 1] 0 2 (11- 11- 11-: 0 -1 0) (11- 11- 11-: 0 -1 0) [1 1 1] 0 [0 1 2] 9 -1.000000 GraphAddEntries: 3 (57+ 22- 22-: 0 0 0) (57+ 22- 22-: 0 0 0) [1 1 1] 0 2 (28+ 11- 11-: 0 -1 0) (28+ 11- 11-: 0 -1 0) [1 1 1] 0 [0 1 2] 9 -1.000000 GraphAddEntries: 3 (22- 22- 57+: 0 0 0) (22- 22- 57+: 0 0 0) [1 1 1] 0 2 (11- 11- 28+: 0 -1 0) (11- 11- 28+: 0 -1 0) [1 1 1] 0 [0 1 2] 9 -1.000000 GraphAddEntries: 3 (57+ 22- 57+: 0 0 0) (57+ 22- 57+: 0 0 0) [1 1 1] 0 2 (28+ 11- 28+: 0 -1 0) (28+ 11- 28+: 0 -1 0) [1 1 1] 0 [0 1 2] 9 -1.000000 GraphAddEntries: 3 (22- 57+ 22-: 0 0 0) (22- 57+ 22-: 0 0 0) [1 1 1] 0 2 (11- 28+ 11-: 0 1 0) (11- 28+ 11-: 0 1 0) [1 1 1] 0 [0 1 2] 9 -1.000000 GraphAddEntries: 3 (57+ 57+ 22-: 0 0 0) (57+ 57+ 22-: 0 0 0) [1 1 1] 0 2 (28+ 28+ 11-: 0 1 0) (28+ 28+ 11-: 0 1 0) [1 1 1] 0 [0 1 2] 9 -1.000000 GraphAddEntries: 3 (22- 57+ 57+: 0 0 0) (22- 57+ 57+: 0 0 0) [1 1 1] 0 2 (11- 28+ 28+: 0 1 0) (11- 28+ 28+: 0 1 0) [1 1 1] 0 [0 1 2] 9 -1.000000 GraphAddEntries: 3 (57+ 57+ 57+: 0 0 0) (57+ 57+ 57+: 0 0 0) [1 1 1] 0 2 (28+ 28+ 28+: 0 1 0) (28+ 28+ 28+: 0 1 0) [1 1 1] 0 [0 1 2] 9 -1.000000 ############################################################# FacParts: 0 0 [1 1 1] FacParts: 1 1 [2 2 2] FacParts: 2 2 [2 2 2] FacParts: 3 3 [2 2 2] ProcessPoolCreate: 1 # ProcessPoolSetPart: pool part ProcessPoolSetPart: 0 0 ProcessPoolSetPart: 0 1 ProcessPoolSetPart: 0 2 ProcessPoolSetPart: 0 3 hypre-2.33.0/src/test/TEST_fac/5lev.in000066400000000000000000001403141477326011500173000ustar00rootroot00000000000000# Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) ###################################################### # GridCreate: ndim nparts GridCreate: 3 5 ############################################################# # GridSetExtents: part ilower(ndim) iupper(ndim) GridSetExtents: 0 (1- 1- 1-) (12+ 12+ 12+) GridSetExtents: 1 (4- 4- 4-) (21+ 21+ 21+) GridSetExtents: 2 (10- 10- 10-) (31+ 31+ 31+) GridSetExtents: 3 (22- 22- 22-) (57+ 57+ 57+) GridSetExtents: 4 (46- 46- 46-) (103+ 103+ 103+) ############################################################# # GridSetVariables: part nvars vartypes[nvars] # CELL = 0 # NODE = 1 # XFACE = 2 # YFACE = 3 # ZFACE = 4 # XEDGE = 5 # YEDGE = 6 # ZEDGE = 7 GridSetVariables: 0 1 [0] GridSetVariables: 1 1 [0] GridSetVariables: 2 1 [0] GridSetVariables: 3 1 [0] GridSetVariables: 4 1 [0] ############################################################# # StencilCreate: nstencils sizes[nstencils] StencilCreate: 1 [7] ############################################################# # StencilSetEntry: stencil_num entry offset[ndim] var value StencilSetEntry: 0 0 [ 0 0 0] 0 6.000000 StencilSetEntry: 0 1 [-1 0 0] 0 -1.000000 StencilSetEntry: 0 2 [ 1 0 0] 0 -1.000000 StencilSetEntry: 0 3 [ 0 -1 0] 0 -1.000000 StencilSetEntry: 0 4 [ 0 0 1] 0 -1.000000 StencilSetEntry: 0 5 [ 0 0 -1] 0 -1.000000 StencilSetEntry: 0 6 [ 0 1 0] 0 -1.000000 ############################################################# # GraphSetStencil: part var stencil_num GraphSetStencil: 0 0 0 GraphSetStencil: 1 0 0 GraphSetStencil: 2 0 0 GraphSetStencil: 3 0 0 GraphSetStencil: 4 0 0 ############################################################# # GraphAddEntries: \ # part ilower(ndim) iupper(ndim) stride[ndim] var \ # to_part to_ilower(ndim) to_iupper(ndim) to_stride[ndim] to_var \ # index_map[ndim] entry value GraphAddEntries: 0 (2- 2- 2-: -1 0 0) (2- 10+ 10+: -1 0 0) [1 1 1] 0 1 (4- 4- 4-: 0 0 1) (4- 21+ 21+: 0 -1 0) [1 2 2] 0 [0 1 2] 7 -0.250000 GraphAddEntries: 0 (2- 2- 2-: -1 0 0) (2- 10+ 10+: -1 0 0) [1 1 1] 0 1 (4- 4- 4-: 0 1 1) (4- 21+ 21+: 0 0 0) [1 2 2] 0 [0 1 2] 8 -0.250000 GraphAddEntries: 0 (2- 2- 2-: -1 0 0) (2- 10+ 10+: -1 0 0) [1 1 1] 0 1 (4- 4- 4-: 0 0 0) (4- 21+ 21+: 0 -1 -1) [1 2 2] 0 [0 1 2] 9 -0.250000 GraphAddEntries: 0 (2- 2- 2-: -1 0 0) (2- 10+ 10+: -1 0 0) [1 1 1] 0 1 (4- 4- 4-: 0 1 0) (4- 21+ 21+: 0 0 -1) [1 2 2] 0 [0 1 2] 10 -0.250000 GraphAddEntries: 0 (10+ 2- 2-: 1 0 0) (10+ 10+ 10+: 1 0 0) [1 1 1] 0 1 (21+ 4- 4-: 0 0 0) (21+ 21+ 21+: 0 -1 -1) [1 2 2] 0 [0 1 2] 7 -0.250000 GraphAddEntries: 0 (10+ 2- 2-: 1 0 0) (10+ 10+ 10+: 1 0 0) [1 1 1] 0 1 (21+ 4- 4-: 0 1 0) (21+ 21+ 21+: 0 0 -1) [1 2 2] 0 [0 1 2] 8 -0.250000 GraphAddEntries: 0 (10+ 2- 2-: 1 0 0) (10+ 10+ 10+: 1 0 0) [1 1 1] 0 1 (21+ 4- 4-: 0 0 1) (21+ 21+ 21+: 0 -1 0) [1 2 2] 0 [0 1 2] 9 -0.250000 GraphAddEntries: 0 (10+ 2- 2-: 1 0 0) (10+ 10+ 10+: 1 0 0) [1 1 1] 0 1 (21+ 4- 4-: 0 1 1) (21+ 21+ 21+: 0 0 0) [1 2 2] 0 [0 1 2] 10 -0.250000 GraphAddEntries: 0 (2- 2- 2-: 0 -1 0) (10+ 2- 10+: 0 -1 0) [1 1 1] 0 1 (4- 4- 4-: 0 0 1) (21+ 4- 21+: -1 0 0) [2 1 2] 0 [0 1 2] 7 -0.250000 GraphAddEntries: 0 (2- 2- 2-: 0 -1 0) (10+ 2- 10+: 0 -1 0) [1 1 1] 0 1 (4- 4- 4-: 0 0 0) (21+ 4- 21+: -1 0 -1) [2 1 2] 0 [0 1 2] 8 -0.250000 GraphAddEntries: 0 (2- 2- 2-: 0 -1 0) (10+ 2- 10+: 0 -1 0) [1 1 1] 0 1 (4- 4- 4-: 1 0 1) (21+ 4- 21+: 0 0 0) [2 1 2] 0 [0 1 2] 9 -0.250000 GraphAddEntries: 0 (2- 2- 2-: 0 -1 0) (10+ 2- 10+: 0 -1 0) [1 1 1] 0 1 (4- 4- 4-: 1 0 0) (21+ 4- 21+: 0 0 -1) [2 1 2] 0 [0 1 2] 10 -0.250000 GraphAddEntries: 0 (2- 10+ 2-: 0 1 0) (10+ 10+ 10+: 0 1 0) [1 1 1] 0 1 (4- 21+ 4-: 0 0 0) (21+ 21+ 21+: -1 0 -1) [2 1 2] 0 [0 1 2] 7 -0.250000 GraphAddEntries: 0 (2- 10+ 2-: 0 1 0) (10+ 10+ 10+: 0 1 0) [1 1 1] 0 1 (4- 21+ 4-: 0 0 1) (21+ 21+ 21+: -1 0 0) [2 1 2] 0 [0 1 2] 8 -0.250000 GraphAddEntries: 0 (2- 10+ 2-: 0 1 0) (10+ 10+ 10+: 0 1 0) [1 1 1] 0 1 (4- 21+ 4-: 1 0 0) (21+ 21+ 21+: 0 0 -1) [2 1 2] 0 [0 1 2] 9 -0.250000 GraphAddEntries: 0 (2- 10+ 2-: 0 1 0) (10+ 10+ 10+: 0 1 0) [1 1 1] 0 1 (4- 21+ 4-: 1 0 1) (21+ 21+ 21+: 0 0 0) [2 1 2] 0 [0 1 2] 10 -0.250000 GraphAddEntries: 0 (2- 2- 2-: 0 0 -1) (10+ 10+ 2-: 0 0 -1) [1 1 1] 0 1 (4- 4- 4-: 0 0 0) (21+ 21+ 4-: -1 -1 0) [2 2 1] 0 [0 1 2] 7 -0.250000 GraphAddEntries: 0 (2- 2- 2-: 0 0 -1) (10+ 10+ 2-: 0 0 -1) [1 1 1] 0 1 (4- 4- 4-: 0 1 0) (21+ 21+ 4-: -1 0 0) [2 2 1] 0 [0 1 2] 8 -0.250000 GraphAddEntries: 0 (2- 2- 2-: 0 0 -1) (10+ 10+ 2-: 0 0 -1) [1 1 1] 0 1 (4- 4- 4-: 1 0 0) (21+ 21+ 4-: 0 -1 0) [2 2 1] 0 [0 1 2] 9 -0.250000 GraphAddEntries: 0 (2- 2- 2-: 0 0 -1) (10+ 10+ 2-: 0 0 -1) [1 1 1] 0 1 (4- 4- 4-: 1 1 0) (21+ 21+ 4-: 0 0 0) [2 2 1] 0 [0 1 2] 10 -0.250000 GraphAddEntries: 0 (2- 2- 10+: 0 0 1) (10+ 10+ 10+: 0 0 1) [1 1 1] 0 1 (4- 4- 21+: 1 0 0) (21+ 21+ 21+: 0 -1 0) [2 2 1] 0 [0 1 2] 7 -0.250000 GraphAddEntries: 0 (2- 2- 10+: 0 0 1) (10+ 10+ 10+: 0 0 1) [1 1 1] 0 1 (4- 4- 21+: 1 1 0) (21+ 21+ 21+: 0 0 0) [2 2 1] 0 [0 1 2] 8 -0.250000 GraphAddEntries: 0 (2- 2- 10+: 0 0 1) (10+ 10+ 10+: 0 0 1) [1 1 1] 0 1 (4- 4- 21+: 0 0 0) (21+ 21+ 21+: -1 -1 0) [2 2 1] 0 [0 1 2] 9 -0.250000 GraphAddEntries: 0 (2- 2- 10+: 0 0 1) (10+ 10+ 10+: 0 0 1) [1 1 1] 0 1 (4- 4- 21+: 0 1 0) (21+ 21+ 21+: -1 0 0) [2 2 1] 0 [0 1 2] 10 -0.250000 GraphAddEntries: 1 (4- 4- 4-: 0 0 1) (4- 21+ 21+: 0 -1 -2) [1 2 2] 0 0 (2- 2- 2-: -1 0 0) (2- 10+ 10+: -1 0 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 1 (4- 4- 4-: 0 1 1) (4- 21+ 21+: 0 0 -2) [1 2 2] 0 0 (2- 2- 2-: -1 0 0) (2- 10+ 10+: -1 0 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 1 (4- 4- 4-: 0 0 2) (4- 21+ 21+: 0 -1 -1) [1 2 2] 0 0 (2- 2- 2-: -1 0 1) (2- 10+ 10+: -1 0 0) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 1 (4- 4- 4-: 0 1 2) (4- 21+ 21+: 0 0 -1) [1 2 2] 0 0 (2- 2- 2-: -1 0 1) (2- 10+ 10+: -1 0 0) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 1 (21+ 4- 4-: 0 0 2) (21+ 21+ 21+: 0 -1 -1) [1 2 2] 0 0 (10+ 2- 2-: 1 0 1) (10+ 10+ 10+: 1 0 0) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 1 (21+ 4- 4-: 0 1 2) (21+ 21+ 21+: 0 0 -1) [1 2 2] 0 0 (10+ 2- 2-: 1 0 1) (10+ 10+ 10+: 1 0 0) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 1 (21+ 4- 4-: 0 0 1) (21+ 21+ 21+: 0 -1 -2) [1 2 2] 0 0 (10+ 2- 2-: 1 0 0) (10+ 10+ 10+: 1 0 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 1 (21+ 4- 4-: 0 1 1) (21+ 21+ 21+: 0 0 -2) [1 2 2] 0 0 (10+ 2- 2-: 1 0 0) (10+ 10+ 10+: 1 0 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 1 (4- 4- 4-: 2 0 1) (21+ 4- 21+: -1 0 -2) [2 1 2] 0 0 (2- 2- 2-: 1 -1 0) (10+ 2- 10+: 0 -1 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 1 (4- 4- 4-: 2 0 2) (21+ 4- 21+: -1 0 -1) [2 1 2] 0 0 (2- 2- 2-: 1 -1 1) (10+ 2- 10+: 0 -1 0) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 1 (4- 4- 4-: 1 0 1) (21+ 4- 21+: -2 0 -2) [2 1 2] 0 0 (2- 2- 2-: 0 -1 0) (10+ 2- 10+: -1 -1 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 1 (4- 4- 4-: 1 0 2) (21+ 4- 21+: -2 0 -1) [2 1 2] 0 0 (2- 2- 2-: 0 -1 1) (10+ 2- 10+: -1 -1 0) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 1 (4- 21+ 4-: 2 0 2) (21+ 21+ 21+: -1 0 -1) [2 1 2] 0 0 (2- 10+ 2-: 1 1 1) (10+ 10+ 10+: 0 1 0) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 1 (4- 21+ 4-: 2 0 1) (21+ 21+ 21+: -1 0 -2) [2 1 2] 0 0 (2- 10+ 2-: 1 1 0) (10+ 10+ 10+: 0 1 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 1 (4- 21+ 4-: 1 0 2) (21+ 21+ 21+: -2 0 -1) [2 1 2] 0 0 (2- 10+ 2-: 0 1 1) (10+ 10+ 10+: -1 1 0) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 1 (4- 21+ 4-: 1 0 1) (21+ 21+ 21+: -2 0 -2) [2 1 2] 0 0 (2- 10+ 2-: 0 1 0) (10+ 10+ 10+: -1 1 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 1 (4- 4- 4-: 0 0 0) (21+ 21+ 4-: -1 -1 0) [2 2 1] 0 0 (2- 2- 2-: 0 0 -1) (10+ 10+ 2-: 0 0 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 1 (4- 4- 4-: 0 1 0) (21+ 21+ 4-: -1 0 0) [2 2 1] 0 0 (2- 2- 2-: 0 0 -1) (10+ 10+ 2-: 0 0 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 1 (4- 4- 4-: 1 0 0) (21+ 21+ 4-: 0 -1 0) [2 2 1] 0 0 (2- 2- 2-: 0 0 -1) (10+ 10+ 2-: 0 0 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 1 (4- 4- 4-: 1 1 0) (21+ 21+ 4-: 0 0 0) [2 2 1] 0 0 (2- 2- 2-: 0 0 -1) (10+ 10+ 2-: 0 0 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 1 (4- 4- 21+: 1 0 0) (21+ 21+ 21+: 0 -1 0) [2 2 1] 0 0 (2- 2- 10+: 0 0 1) (10+ 10+ 10+: 0 0 1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 1 (4- 4- 21+: 1 1 0) (21+ 21+ 21+: 0 0 0) [2 2 1] 0 0 (2- 2- 10+: 0 0 1) (10+ 10+ 10+: 0 0 1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 1 (4- 4- 21+: 0 0 0) (21+ 21+ 21+: -1 -1 0) [2 2 1] 0 0 (2- 2- 10+: 0 0 1) (10+ 10+ 10+: 0 0 1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 1 (4- 4- 21+: 0 1 0) (21+ 21+ 21+: -1 0 0) [2 2 1] 0 0 (2- 2- 10+: 0 0 1) (10+ 10+ 10+: 0 0 1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 1 (5- 5- 5-: -1 0 0) (5- 15+ 15+: -1 0 0) [1 1 1] 0 2 (10- 10- 10-: 0 0 1) (10- 31+ 31+: 0 -1 0) [1 2 2] 0 [0 1 2] 7 -0.250000 GraphAddEntries: 1 (5- 5- 5-: -1 0 0) (5- 15+ 15+: -1 0 0) [1 1 1] 0 2 (10- 10- 10-: 0 1 1) (10- 31+ 31+: 0 0 0) [1 2 2] 0 [0 1 2] 8 -0.250000 GraphAddEntries: 1 (5- 5- 5-: -1 0 0) (5- 15+ 15+: -1 0 0) [1 1 1] 0 2 (10- 10- 10-: 0 0 0) (10- 31+ 31+: 0 -1 -1) [1 2 2] 0 [0 1 2] 9 -0.250000 GraphAddEntries: 1 (5- 5- 5-: -1 0 0) (5- 15+ 15+: -1 0 0) [1 1 1] 0 2 (10- 10- 10-: 0 1 0) (10- 31+ 31+: 0 0 -1) [1 2 2] 0 [0 1 2] 10 -0.250000 GraphAddEntries: 1 (15+ 5- 5-: 1 0 0) (15+ 15+ 15+: 1 0 0) [1 1 1] 0 2 (31+ 10- 10-: 0 0 0) (31+ 31+ 31+: 0 -1 -1) [1 2 2] 0 [0 1 2] 7 -0.250000 GraphAddEntries: 1 (15+ 5- 5-: 1 0 0) (15+ 15+ 15+: 1 0 0) [1 1 1] 0 2 (31+ 10- 10-: 0 1 0) (31+ 31+ 31+: 0 0 -1) [1 2 2] 0 [0 1 2] 8 -0.250000 GraphAddEntries: 1 (15+ 5- 5-: 1 0 0) (15+ 15+ 15+: 1 0 0) [1 1 1] 0 2 (31+ 10- 10-: 0 0 1) (31+ 31+ 31+: 0 -1 0) [1 2 2] 0 [0 1 2] 9 -0.250000 GraphAddEntries: 1 (15+ 5- 5-: 1 0 0) (15+ 15+ 15+: 1 0 0) [1 1 1] 0 2 (31+ 10- 10-: 0 1 1) (31+ 31+ 31+: 0 0 0) [1 2 2] 0 [0 1 2] 10 -0.250000 GraphAddEntries: 1 (5- 5- 5-: 0 -1 0) (15+ 5- 15+: 0 -1 0) [1 1 1] 0 2 (10- 10- 10-: 0 0 1) (31+ 10- 31+: -1 0 0) [2 1 2] 0 [0 1 2] 7 -0.250000 GraphAddEntries: 1 (5- 5- 5-: 0 -1 0) (15+ 5- 15+: 0 -1 0) [1 1 1] 0 2 (10- 10- 10-: 0 0 0) (31+ 10- 31+: -1 0 -1) [2 1 2] 0 [0 1 2] 8 -0.250000 GraphAddEntries: 1 (5- 5- 5-: 0 -1 0) (15+ 5- 15+: 0 -1 0) [1 1 1] 0 2 (10- 10- 10-: 1 0 1) (31+ 10- 31+: 0 0 0) [2 1 2] 0 [0 1 2] 9 -0.250000 GraphAddEntries: 1 (5- 5- 5-: 0 -1 0) (15+ 5- 15+: 0 -1 0) [1 1 1] 0 2 (10- 10- 10-: 1 0 0) (31+ 10- 31+: 0 0 -1) [2 1 2] 0 [0 1 2] 10 -0.250000 GraphAddEntries: 1 (5- 15+ 5-: 0 1 0) (15+ 15+ 15+: 0 1 0) [1 1 1] 0 2 (10- 31+ 10-: 0 0 0) (31+ 31+ 31+: -1 0 -1) [2 1 2] 0 [0 1 2] 7 -0.250000 GraphAddEntries: 1 (5- 15+ 5-: 0 1 0) (15+ 15+ 15+: 0 1 0) [1 1 1] 0 2 (10- 31+ 10-: 0 0 1) (31+ 31+ 31+: -1 0 0) [2 1 2] 0 [0 1 2] 8 -0.250000 GraphAddEntries: 1 (5- 15+ 5-: 0 1 0) (15+ 15+ 15+: 0 1 0) [1 1 1] 0 2 (10- 31+ 10-: 1 0 0) (31+ 31+ 31+: 0 0 -1) [2 1 2] 0 [0 1 2] 9 -0.250000 GraphAddEntries: 1 (5- 15+ 5-: 0 1 0) (15+ 15+ 15+: 0 1 0) [1 1 1] 0 2 (10- 31+ 10-: 1 0 1) (31+ 31+ 31+: 0 0 0) [2 1 2] 0 [0 1 2] 10 -0.250000 GraphAddEntries: 1 (5- 5- 5-: 0 0 -1) (15+ 15+ 5-: 0 0 -1) [1 1 1] 0 2 (10- 10- 10-: 0 0 0) (31+ 31+ 10-: -1 -1 0) [2 2 1] 0 [0 1 2] 7 -0.250000 GraphAddEntries: 1 (5- 5- 5-: 0 0 -1) (15+ 15+ 5-: 0 0 -1) [1 1 1] 0 2 (10- 10- 10-: 0 1 0) (31+ 31+ 10-: -1 0 0) [2 2 1] 0 [0 1 2] 8 -0.250000 GraphAddEntries: 1 (5- 5- 5-: 0 0 -1) (15+ 15+ 5-: 0 0 -1) [1 1 1] 0 2 (10- 10- 10-: 1 0 0) (31+ 31+ 10-: 0 -1 0) [2 2 1] 0 [0 1 2] 9 -0.250000 GraphAddEntries: 1 (5- 5- 5-: 0 0 -1) (15+ 15+ 5-: 0 0 -1) [1 1 1] 0 2 (10- 10- 10-: 1 1 0) (31+ 31+ 10-: 0 0 0) [2 2 1] 0 [0 1 2] 10 -0.250000 GraphAddEntries: 1 (5- 5- 15+: 0 0 1) (15+ 15+ 15+: 0 0 1) [1 1 1] 0 2 (10- 10- 31+: 1 0 0) (31+ 31+ 31+: 0 -1 0) [2 2 1] 0 [0 1 2] 7 -0.250000 GraphAddEntries: 1 (5- 5- 15+: 0 0 1) (15+ 15+ 15+: 0 0 1) [1 1 1] 0 2 (10- 10- 31+: 1 1 0) (31+ 31+ 31+: 0 0 0) [2 2 1] 0 [0 1 2] 8 -0.250000 GraphAddEntries: 1 (5- 5- 15+: 0 0 1) (15+ 15+ 15+: 0 0 1) [1 1 1] 0 2 (10- 10- 31+: 0 0 0) (31+ 31+ 31+: -1 -1 0) [2 2 1] 0 [0 1 2] 9 -0.250000 GraphAddEntries: 1 (5- 5- 15+: 0 0 1) (15+ 15+ 15+: 0 0 1) [1 1 1] 0 2 (10- 10- 31+: 0 1 0) (31+ 31+ 31+: -1 0 0) [2 2 1] 0 [0 1 2] 10 -0.250000 GraphAddEntries: 1 (4- 4- 4-: 0 0 0) (4- 21+ 4-: 0 -1 0) [1 2 1] 0 0 (2- 2- 2-: -1 0 0) (2- 10+ 2-: -1 0 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 1 (4- 4- 4-: 0 1 0) (4- 21+ 4-: 0 0 0) [1 2 1] 0 0 (2- 2- 2-: -1 0 0) (2- 10+ 2-: -1 0 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 1 (21+ 4- 21+: 0 0 0) (21+ 21+ 21+: 0 -1 0) [1 2 1] 0 0 (10+ 2- 10+: 1 0 0) (10+ 10+ 10+: 1 0 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 1 (21+ 4- 21+: 0 1 0) (21+ 21+ 21+: 0 0 0) [1 2 1] 0 0 (10+ 2- 10+: 1 0 0) (10+ 10+ 10+: 1 0 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 1 (21+ 4- 4-: 0 0 0) (21+ 21+ 4-: 0 -1 0) [1 2 1] 0 0 (10+ 2- 2-: 1 0 0) (10+ 10+ 2-: 1 0 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 1 (21+ 4- 4-: 0 1 0) (21+ 21+ 4-: 0 0 0) [1 2 1] 0 0 (10+ 2- 2-: 1 0 0) (10+ 10+ 2-: 1 0 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 1 (4- 4- 21+: 0 0 0) (4- 21+ 21+: 0 -1 0) [1 2 1] 0 0 (2- 2- 10+: -1 0 0) (2- 10+ 10+: -1 0 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 1 (4- 4- 21+: 0 1 0) (4- 21+ 21+: 0 0 0) [1 2 1] 0 0 (2- 2- 10+: -1 0 0) (2- 10+ 10+: -1 0 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 1 (4- 4- 4-: 2 0 0) (21+ 4- 4-: -1 0 0) [2 1 1] 0 0 (2- 2- 2-: 1 -1 0) (10+ 2- 2-: 0 -1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 1 (4- 4- 4-: 0 0 2) (4- 4- 21+: 0 0 -1) [1 1 2] 0 0 (2- 2- 2-: 0 -1 1) (2- 2- 10+: 0 -1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 1 (4- 4- 21+: 2 0 0) (21+ 4- 21+: -1 0 0) [2 1 1] 0 0 (2- 2- 10+: 1 -1 0) (10+ 2- 10+: 0 -1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 1 (21+ 4- 4-: 0 0 2) (21+ 4- 21+: 0 0 -1) [1 1 2] 0 0 (10+ 2- 2-: 0 -1 1) (10+ 2- 10+: 0 -1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 1 (4- 4- 4-: 1 0 0) (21+ 4- 4-: -2 0 0) [2 1 1] 0 0 (2- 2- 2-: 0 -1 0) (10+ 2- 2-: -1 -1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 1 (4- 4- 4-: 0 0 1) (4- 4- 21+: 0 0 -2) [1 1 2] 0 0 (2- 2- 2-: 0 -1 0) (2- 2- 10+: 0 -1 -1) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 1 (4- 4- 21+: 1 0 0) (21+ 4- 21+: -2 0 0) [2 1 1] 0 0 (2- 2- 10+: 0 -1 0) (10+ 2- 10+: -1 -1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 1 (21+ 4- 4-: 0 0 1) (21+ 4- 21+: 0 0 -2) [1 1 2] 0 0 (10+ 2- 2-: 0 -1 0) (10+ 2- 10+: 0 -1 -1) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 1 (4- 21+ 4-: 2 0 0) (21+ 21+ 4-: -1 0 0) [2 1 1] 0 0 (2- 10+ 2-: 1 1 0) (10+ 10+ 2-: 0 1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 1 (4- 21+ 4-: 0 0 2) (4- 21+ 21+: 0 0 -1) [1 1 2] 0 0 (2- 10+ 2-: 0 1 1) (2- 10+ 10+: 0 1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 1 (4- 21+ 21+: 2 0 0) (21+ 21+ 21+: -1 0 0) [2 1 1] 0 0 (2- 10+ 10+: 1 1 0) (10+ 10+ 10+: 0 1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 1 (21+ 21+ 4-: 0 0 2) (21+ 21+ 21+: 0 0 -1) [1 1 2] 0 0 (10+ 10+ 2-: 0 1 1) (10+ 10+ 10+: 0 1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 1 (4- 21+ 4-: 1 0 0) (21+ 21+ 4-: -2 0 0) [2 1 1] 0 0 (2- 10+ 2-: 0 1 0) (10+ 10+ 2-: -1 1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 1 (4- 21+ 4-: 0 0 1) (4- 21+ 21+: 0 0 -2) [1 1 2] 0 0 (2- 10+ 2-: 0 1 0) (2- 10+ 10+: 0 1 -1) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 1 (4- 21+ 21+: 1 0 0) (21+ 21+ 21+: -2 0 0) [2 1 1] 0 0 (2- 10+ 10+: 0 1 0) (10+ 10+ 10+: -1 1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 1 (21+ 21+ 4-: 0 0 1) (21+ 21+ 21+: 0 0 -2) [1 1 2] 0 0 (10+ 10+ 2-: 0 1 0) (10+ 10+ 10+: 0 1 -1) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 1 (4- 4- 4-: 0 0 0) (4- 4- 4-: 0 0 0) [1 1 1] 0 0 (2- 2- 2-: 0 -1 0) (2- 2- 2-: 0 -1 0) [1 1 1] 0 [0 1 2] 9 -1.000000 GraphAddEntries: 1 (21+ 4- 4-: 0 0 0) (21+ 4- 4-: 0 0 0) [1 1 1] 0 0 (10+ 2- 2-: 0 -1 0) (10+ 2- 2-: 0 -1 0) [1 1 1] 0 [0 1 2] 9 -1.000000 GraphAddEntries: 1 (4- 4- 21+: 0 0 0) (4- 4- 21+: 0 0 0) [1 1 1] 0 0 (2- 2- 10+: 0 -1 0) (2- 2- 10+: 0 -1 0) [1 1 1] 0 [0 1 2] 9 -1.000000 GraphAddEntries: 1 (21+ 4- 21+: 0 0 0) (21+ 4- 21+: 0 0 0) [1 1 1] 0 0 (10+ 2- 10+: 0 -1 0) (10+ 2- 10+: 0 -1 0) [1 1 1] 0 [0 1 2] 9 -1.000000 GraphAddEntries: 1 (4- 21+ 4-: 0 0 0) (4- 21+ 4-: 0 0 0) [1 1 1] 0 0 (2- 10+ 2-: 0 1 0) (2- 10+ 2-: 0 1 0) [1 1 1] 0 [0 1 2] 9 -1.000000 GraphAddEntries: 1 (21+ 21+ 4-: 0 0 0) (21+ 21+ 4-: 0 0 0) [1 1 1] 0 0 (10+ 10+ 2-: 0 1 0) (10+ 10+ 2-: 0 1 0) [1 1 1] 0 [0 1 2] 9 -1.000000 GraphAddEntries: 1 (4- 21+ 21+: 0 0 0) (4- 21+ 21+: 0 0 0) [1 1 1] 0 0 (2- 10+ 10+: 0 1 0) (2- 10+ 10+: 0 1 0) [1 1 1] 0 [0 1 2] 9 -1.000000 GraphAddEntries: 1 (21+ 21+ 21+: 0 0 0) (21+ 21+ 21+: 0 0 0) [1 1 1] 0 0 (10+ 10+ 10+: 0 1 0) (10+ 10+ 10+: 0 1 0) [1 1 1] 0 [0 1 2] 9 -1.000000 GraphAddEntries: 2 (10- 10- 10-: 0 0 1) (10- 31+ 31+: 0 -1 -2) [1 2 2] 0 1 (5- 5- 5-: -1 0 0) (5- 15+ 15+: -1 0 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 2 (10- 10- 10-: 0 1 1) (10- 31+ 31+: 0 0 -2) [1 2 2] 0 1 (5- 5- 5-: -1 0 0) (5- 15+ 15+: -1 0 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 2 (10- 10- 10-: 0 0 2) (10- 31+ 31+: 0 -1 -1) [1 2 2] 0 1 (5- 5- 5-: -1 0 1) (5- 15+ 15+: -1 0 0) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 2 (10- 10- 10-: 0 1 2) (10- 31+ 31+: 0 0 -1) [1 2 2] 0 1 (5- 5- 5-: -1 0 1) (5- 15+ 15+: -1 0 0) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 2 (31+ 10- 10-: 0 0 2) (31+ 31+ 31+: 0 -1 -1) [1 2 2] 0 1 (15+ 5- 5-: 1 0 1) (15+ 15+ 15+: 1 0 0) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 2 (31+ 10- 10-: 0 1 2) (31+ 31+ 31+: 0 0 -1) [1 2 2] 0 1 (15+ 5- 5-: 1 0 1) (15+ 15+ 15+: 1 0 0) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 2 (31+ 10- 10-: 0 0 1) (31+ 31+ 31+: 0 -1 -2) [1 2 2] 0 1 (15+ 5- 5-: 1 0 0) (15+ 15+ 15+: 1 0 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 2 (31+ 10- 10-: 0 1 1) (31+ 31+ 31+: 0 0 -2) [1 2 2] 0 1 (15+ 5- 5-: 1 0 0) (15+ 15+ 15+: 1 0 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 2 (10- 10- 10-: 2 0 1) (31+ 10- 31+: -1 0 -2) [2 1 2] 0 1 (5- 5- 5-: 1 -1 0) (15+ 5- 15+: 0 -1 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 2 (10- 10- 10-: 2 0 2) (31+ 10- 31+: -1 0 -1) [2 1 2] 0 1 (5- 5- 5-: 1 -1 1) (15+ 5- 15+: 0 -1 0) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 2 (10- 10- 10-: 1 0 1) (31+ 10- 31+: -2 0 -2) [2 1 2] 0 1 (5- 5- 5-: 0 -1 0) (15+ 5- 15+: -1 -1 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 2 (10- 10- 10-: 1 0 2) (31+ 10- 31+: -2 0 -1) [2 1 2] 0 1 (5- 5- 5-: 0 -1 1) (15+ 5- 15+: -1 -1 0) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 2 (10- 31+ 10-: 2 0 2) (31+ 31+ 31+: -1 0 -1) [2 1 2] 0 1 (5- 15+ 5-: 1 1 1) (15+ 15+ 15+: 0 1 0) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 2 (10- 31+ 10-: 2 0 1) (31+ 31+ 31+: -1 0 -2) [2 1 2] 0 1 (5- 15+ 5-: 1 1 0) (15+ 15+ 15+: 0 1 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 2 (10- 31+ 10-: 1 0 2) (31+ 31+ 31+: -2 0 -1) [2 1 2] 0 1 (5- 15+ 5-: 0 1 1) (15+ 15+ 15+: -1 1 0) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 2 (10- 31+ 10-: 1 0 1) (31+ 31+ 31+: -2 0 -2) [2 1 2] 0 1 (5- 15+ 5-: 0 1 0) (15+ 15+ 15+: -1 1 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 2 (10- 10- 10-: 0 0 0) (31+ 31+ 10-: -1 -1 0) [2 2 1] 0 1 (5- 5- 5-: 0 0 -1) (15+ 15+ 5-: 0 0 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 2 (10- 10- 10-: 0 1 0) (31+ 31+ 10-: -1 0 0) [2 2 1] 0 1 (5- 5- 5-: 0 0 -1) (15+ 15+ 5-: 0 0 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 2 (10- 10- 10-: 1 0 0) (31+ 31+ 10-: 0 -1 0) [2 2 1] 0 1 (5- 5- 5-: 0 0 -1) (15+ 15+ 5-: 0 0 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 2 (10- 10- 10-: 1 1 0) (31+ 31+ 10-: 0 0 0) [2 2 1] 0 1 (5- 5- 5-: 0 0 -1) (15+ 15+ 5-: 0 0 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 2 (10- 10- 31+: 1 0 0) (31+ 31+ 31+: 0 -1 0) [2 2 1] 0 1 (5- 5- 15+: 0 0 1) (15+ 15+ 15+: 0 0 1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 2 (10- 10- 31+: 1 1 0) (31+ 31+ 31+: 0 0 0) [2 2 1] 0 1 (5- 5- 15+: 0 0 1) (15+ 15+ 15+: 0 0 1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 2 (10- 10- 31+: 0 0 0) (31+ 31+ 31+: -1 -1 0) [2 2 1] 0 1 (5- 5- 15+: 0 0 1) (15+ 15+ 15+: 0 0 1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 2 (10- 10- 31+: 0 1 0) (31+ 31+ 31+: -1 0 0) [2 2 1] 0 1 (5- 5- 15+: 0 0 1) (15+ 15+ 15+: 0 0 1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 2 (11- 11- 11-: -1 0 0) (11- 28+ 28+: -1 0 0) [1 1 1] 0 3 (22- 22- 22-: 0 0 1) (22- 57+ 57+: 0 -1 0) [1 2 2] 0 [0 1 2] 7 -0.250000 GraphAddEntries: 2 (11- 11- 11-: -1 0 0) (11- 28+ 28+: -1 0 0) [1 1 1] 0 3 (22- 22- 22-: 0 1 1) (22- 57+ 57+: 0 0 0) [1 2 2] 0 [0 1 2] 8 -0.250000 GraphAddEntries: 2 (11- 11- 11-: -1 0 0) (11- 28+ 28+: -1 0 0) [1 1 1] 0 3 (22- 22- 22-: 0 0 0) (22- 57+ 57+: 0 -1 -1) [1 2 2] 0 [0 1 2] 9 -0.250000 GraphAddEntries: 2 (11- 11- 11-: -1 0 0) (11- 28+ 28+: -1 0 0) [1 1 1] 0 3 (22- 22- 22-: 0 1 0) (22- 57+ 57+: 0 0 -1) [1 2 2] 0 [0 1 2] 10 -0.250000 GraphAddEntries: 2 (28+ 11- 11-: 1 0 0) (28+ 28+ 28+: 1 0 0) [1 1 1] 0 3 (57+ 22- 22-: 0 0 0) (57+ 57+ 57+: 0 -1 -1) [1 2 2] 0 [0 1 2] 7 -0.250000 GraphAddEntries: 2 (28+ 11- 11-: 1 0 0) (28+ 28+ 28+: 1 0 0) [1 1 1] 0 3 (57+ 22- 22-: 0 1 0) (57+ 57+ 57+: 0 0 -1) [1 2 2] 0 [0 1 2] 8 -0.250000 GraphAddEntries: 2 (28+ 11- 11-: 1 0 0) (28+ 28+ 28+: 1 0 0) [1 1 1] 0 3 (57+ 22- 22-: 0 0 1) (57+ 57+ 57+: 0 -1 0) [1 2 2] 0 [0 1 2] 9 -0.250000 GraphAddEntries: 2 (28+ 11- 11-: 1 0 0) (28+ 28+ 28+: 1 0 0) [1 1 1] 0 3 (57+ 22- 22-: 0 1 1) (57+ 57+ 57+: 0 0 0) [1 2 2] 0 [0 1 2] 10 -0.250000 GraphAddEntries: 2 (11- 11- 11-: 0 -1 0) (28+ 11- 28+: 0 -1 0) [1 1 1] 0 3 (22- 22- 22-: 0 0 1) (57+ 22- 57+: -1 0 0) [2 1 2] 0 [0 1 2] 7 -0.250000 GraphAddEntries: 2 (11- 11- 11-: 0 -1 0) (28+ 11- 28+: 0 -1 0) [1 1 1] 0 3 (22- 22- 22-: 0 0 0) (57+ 22- 57+: -1 0 -1) [2 1 2] 0 [0 1 2] 8 -0.250000 GraphAddEntries: 2 (11- 11- 11-: 0 -1 0) (28+ 11- 28+: 0 -1 0) [1 1 1] 0 3 (22- 22- 22-: 1 0 1) (57+ 22- 57+: 0 0 0) [2 1 2] 0 [0 1 2] 9 -0.250000 GraphAddEntries: 2 (11- 11- 11-: 0 -1 0) (28+ 11- 28+: 0 -1 0) [1 1 1] 0 3 (22- 22- 22-: 1 0 0) (57+ 22- 57+: 0 0 -1) [2 1 2] 0 [0 1 2] 10 -0.250000 GraphAddEntries: 2 (11- 28+ 11-: 0 1 0) (28+ 28+ 28+: 0 1 0) [1 1 1] 0 3 (22- 57+ 22-: 0 0 0) (57+ 57+ 57+: -1 0 -1) [2 1 2] 0 [0 1 2] 7 -0.250000 GraphAddEntries: 2 (11- 28+ 11-: 0 1 0) (28+ 28+ 28+: 0 1 0) [1 1 1] 0 3 (22- 57+ 22-: 0 0 1) (57+ 57+ 57+: -1 0 0) [2 1 2] 0 [0 1 2] 8 -0.250000 GraphAddEntries: 2 (11- 28+ 11-: 0 1 0) (28+ 28+ 28+: 0 1 0) [1 1 1] 0 3 (22- 57+ 22-: 1 0 0) (57+ 57+ 57+: 0 0 -1) [2 1 2] 0 [0 1 2] 9 -0.250000 GraphAddEntries: 2 (11- 28+ 11-: 0 1 0) (28+ 28+ 28+: 0 1 0) [1 1 1] 0 3 (22- 57+ 22-: 1 0 1) (57+ 57+ 57+: 0 0 0) [2 1 2] 0 [0 1 2] 10 -0.250000 GraphAddEntries: 2 (11- 11- 11-: 0 0 -1) (28+ 28+ 11-: 0 0 -1) [1 1 1] 0 3 (22- 22- 22-: 0 0 0) (57+ 57+ 22-: -1 -1 0) [2 2 1] 0 [0 1 2] 7 -0.250000 GraphAddEntries: 2 (11- 11- 11-: 0 0 -1) (28+ 28+ 11-: 0 0 -1) [1 1 1] 0 3 (22- 22- 22-: 0 1 0) (57+ 57+ 22-: -1 0 0) [2 2 1] 0 [0 1 2] 8 -0.250000 GraphAddEntries: 2 (11- 11- 11-: 0 0 -1) (28+ 28+ 11-: 0 0 -1) [1 1 1] 0 3 (22- 22- 22-: 1 0 0) (57+ 57+ 22-: 0 -1 0) [2 2 1] 0 [0 1 2] 9 -0.250000 GraphAddEntries: 2 (11- 11- 11-: 0 0 -1) (28+ 28+ 11-: 0 0 -1) [1 1 1] 0 3 (22- 22- 22-: 1 1 0) (57+ 57+ 22-: 0 0 0) [2 2 1] 0 [0 1 2] 10 -0.250000 GraphAddEntries: 2 (11- 11- 28+: 0 0 1) (28+ 28+ 28+: 0 0 1) [1 1 1] 0 3 (22- 22- 57+: 1 0 0) (57+ 57+ 57+: 0 -1 0) [2 2 1] 0 [0 1 2] 7 -0.250000 GraphAddEntries: 2 (11- 11- 28+: 0 0 1) (28+ 28+ 28+: 0 0 1) [1 1 1] 0 3 (22- 22- 57+: 1 1 0) (57+ 57+ 57+: 0 0 0) [2 2 1] 0 [0 1 2] 8 -0.250000 GraphAddEntries: 2 (11- 11- 28+: 0 0 1) (28+ 28+ 28+: 0 0 1) [1 1 1] 0 3 (22- 22- 57+: 0 0 0) (57+ 57+ 57+: -1 -1 0) [2 2 1] 0 [0 1 2] 9 -0.250000 GraphAddEntries: 2 (11- 11- 28+: 0 0 1) (28+ 28+ 28+: 0 0 1) [1 1 1] 0 3 (22- 22- 57+: 0 1 0) (57+ 57+ 57+: -1 0 0) [2 2 1] 0 [0 1 2] 10 -0.250000 GraphAddEntries: 2 (10- 10- 10-: 0 0 0) (10- 31+ 10-: 0 -1 0) [1 2 1] 0 1 (5- 5- 5-: -1 0 0) (5- 15+ 5-: -1 0 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 2 (10- 10- 10-: 0 1 0) (10- 31+ 10-: 0 0 0) [1 2 1] 0 1 (5- 5- 5-: -1 0 0) (5- 15+ 5-: -1 0 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 2 (31+ 10- 31+: 0 0 0) (31+ 31+ 31+: 0 -1 0) [1 2 1] 0 1 (15+ 5- 15+: 1 0 0) (15+ 15+ 15+: 1 0 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 2 (31+ 10- 31+: 0 1 0) (31+ 31+ 31+: 0 0 0) [1 2 1] 0 1 (15+ 5- 15+: 1 0 0) (15+ 15+ 15+: 1 0 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 2 (31+ 10- 10-: 0 0 0) (31+ 31+ 10-: 0 -1 0) [1 2 1] 0 1 (15+ 5- 5-: 1 0 0) (15+ 15+ 5-: 1 0 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 2 (31+ 10- 10-: 0 1 0) (31+ 31+ 10-: 0 0 0) [1 2 1] 0 1 (15+ 5- 5-: 1 0 0) (15+ 15+ 5-: 1 0 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 2 (10- 10- 31+: 0 0 0) (10- 31+ 31+: 0 -1 0) [1 2 1] 0 1 (5- 5- 15+: -1 0 0) (5- 15+ 15+: -1 0 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 2 (10- 10- 31+: 0 1 0) (10- 31+ 31+: 0 0 0) [1 2 1] 0 1 (5- 5- 15+: -1 0 0) (5- 15+ 15+: -1 0 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 2 (10- 10- 10-: 2 0 0) (31+ 10- 10-: -1 0 0) [2 1 1] 0 1 (5- 5- 5-: 1 -1 0) (15+ 5- 5-: 0 -1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 2 (10- 10- 10-: 0 0 2) (10- 10- 31+: 0 0 -1) [1 1 2] 0 1 (5- 5- 5-: 0 -1 1) (5- 5- 15+: 0 -1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 2 (10- 10- 31+: 2 0 0) (31+ 10- 31+: -1 0 0) [2 1 1] 0 1 (5- 5- 15+: 1 -1 0) (15+ 5- 15+: 0 -1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 2 (31+ 10- 10-: 0 0 2) (31+ 10- 31+: 0 0 -1) [1 1 2] 0 1 (15+ 5- 5-: 0 -1 1) (15+ 5- 15+: 0 -1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 2 (10- 10- 10-: 1 0 0) (31+ 10- 10-: -2 0 0) [2 1 1] 0 1 (5- 5- 5-: 0 -1 0) (15+ 5- 5-: -1 -1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 2 (10- 10- 10-: 0 0 1) (10- 10- 31+: 0 0 -2) [1 1 2] 0 1 (5- 5- 5-: 0 -1 0) (5- 5- 15+: 0 -1 -1) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 2 (10- 10- 31+: 1 0 0) (31+ 10- 31+: -2 0 0) [2 1 1] 0 1 (5- 5- 15+: 0 -1 0) (15+ 5- 15+: -1 -1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 2 (31+ 10- 10-: 0 0 1) (31+ 10- 31+: 0 0 -2) [1 1 2] 0 1 (15+ 5- 5-: 0 -1 0) (15+ 5- 15+: 0 -1 -1) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 2 (10- 31+ 10-: 2 0 0) (31+ 31+ 10-: -1 0 0) [2 1 1] 0 1 (5- 15+ 5-: 1 1 0) (15+ 15+ 5-: 0 1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 2 (10- 31+ 10-: 0 0 2) (10- 31+ 31+: 0 0 -1) [1 1 2] 0 1 (5- 15+ 5-: 0 1 1) (5- 15+ 15+: 0 1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 2 (10- 31+ 31+: 2 0 0) (31+ 31+ 31+: -1 0 0) [2 1 1] 0 1 (5- 15+ 15+: 1 1 0) (15+ 15+ 15+: 0 1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 2 (31+ 31+ 10-: 0 0 2) (31+ 31+ 31+: 0 0 -1) [1 1 2] 0 1 (15+ 15+ 5-: 0 1 1) (15+ 15+ 15+: 0 1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 2 (10- 31+ 10-: 1 0 0) (31+ 31+ 10-: -2 0 0) [2 1 1] 0 1 (5- 15+ 5-: 0 1 0) (15+ 15+ 5-: -1 1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 2 (10- 31+ 10-: 0 0 1) (10- 31+ 31+: 0 0 -2) [1 1 2] 0 1 (5- 15+ 5-: 0 1 0) (5- 15+ 15+: 0 1 -1) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 2 (10- 31+ 31+: 1 0 0) (31+ 31+ 31+: -2 0 0) [2 1 1] 0 1 (5- 15+ 15+: 0 1 0) (15+ 15+ 15+: -1 1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 2 (31+ 31+ 10-: 0 0 1) (31+ 31+ 31+: 0 0 -2) [1 1 2] 0 1 (15+ 15+ 5-: 0 1 0) (15+ 15+ 15+: 0 1 -1) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 2 (10- 10- 10-: 0 0 0) (10- 10- 10-: 0 0 0) [1 1 1] 0 1 (5- 5- 5-: 0 -1 0) (5- 5- 5-: 0 -1 0) [1 1 1] 0 [0 1 2] 9 -1.000000 GraphAddEntries: 2 (31+ 10- 10-: 0 0 0) (31+ 10- 10-: 0 0 0) [1 1 1] 0 1 (15+ 5- 5-: 0 -1 0) (15+ 5- 5-: 0 -1 0) [1 1 1] 0 [0 1 2] 9 -1.000000 GraphAddEntries: 2 (10- 10- 31+: 0 0 0) (10- 10- 31+: 0 0 0) [1 1 1] 0 1 (5- 5- 15+: 0 -1 0) (5- 5- 15+: 0 -1 0) [1 1 1] 0 [0 1 2] 9 -1.000000 GraphAddEntries: 2 (31+ 10- 31+: 0 0 0) (31+ 10- 31+: 0 0 0) [1 1 1] 0 1 (15+ 5- 15+: 0 -1 0) (15+ 5- 15+: 0 -1 0) [1 1 1] 0 [0 1 2] 9 -1.000000 GraphAddEntries: 2 (10- 31+ 10-: 0 0 0) (10- 31+ 10-: 0 0 0) [1 1 1] 0 1 (5- 15+ 5-: 0 1 0) (5- 15+ 5-: 0 1 0) [1 1 1] 0 [0 1 2] 9 -1.000000 GraphAddEntries: 2 (31+ 31+ 10-: 0 0 0) (31+ 31+ 10-: 0 0 0) [1 1 1] 0 1 (15+ 15+ 5-: 0 1 0) (15+ 15+ 5-: 0 1 0) [1 1 1] 0 [0 1 2] 9 -1.000000 GraphAddEntries: 2 (10- 31+ 31+: 0 0 0) (10- 31+ 31+: 0 0 0) [1 1 1] 0 1 (5- 15+ 15+: 0 1 0) (5- 15+ 15+: 0 1 0) [1 1 1] 0 [0 1 2] 9 -1.000000 GraphAddEntries: 2 (31+ 31+ 31+: 0 0 0) (31+ 31+ 31+: 0 0 0) [1 1 1] 0 1 (15+ 15+ 15+: 0 1 0) (15+ 15+ 15+: 0 1 0) [1 1 1] 0 [0 1 2] 9 -1.000000 GraphAddEntries: 3 (22- 22- 22-: 0 0 1) (22- 57+ 57+: 0 -1 -2) [1 2 2] 0 2 (11- 11- 11-: -1 0 0) (11- 28+ 28+: -1 0 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 3 (22- 22- 22-: 0 1 1) (22- 57+ 57+: 0 0 -2) [1 2 2] 0 2 (11- 11- 11-: -1 0 0) (11- 28+ 28+: -1 0 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 3 (22- 22- 22-: 0 0 2) (22- 57+ 57+: 0 -1 -1) [1 2 2] 0 2 (11- 11- 11-: -1 0 1) (11- 28+ 28+: -1 0 0) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 3 (22- 22- 22-: 0 1 2) (22- 57+ 57+: 0 0 -1) [1 2 2] 0 2 (11- 11- 11-: -1 0 1) (11- 28+ 28+: -1 0 0) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 3 (57+ 22- 22-: 0 0 2) (57+ 57+ 57+: 0 -1 -1) [1 2 2] 0 2 (28+ 11- 11-: 1 0 1) (28+ 28+ 28+: 1 0 0) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 3 (57+ 22- 22-: 0 1 2) (57+ 57+ 57+: 0 0 -1) [1 2 2] 0 2 (28+ 11- 11-: 1 0 1) (28+ 28+ 28+: 1 0 0) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 3 (57+ 22- 22-: 0 0 1) (57+ 57+ 57+: 0 -1 -2) [1 2 2] 0 2 (28+ 11- 11-: 1 0 0) (28+ 28+ 28+: 1 0 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 3 (57+ 22- 22-: 0 1 1) (57+ 57+ 57+: 0 0 -2) [1 2 2] 0 2 (28+ 11- 11-: 1 0 0) (28+ 28+ 28+: 1 0 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 3 (22- 22- 22-: 2 0 1) (57+ 22- 57+: -1 0 -2) [2 1 2] 0 2 (11- 11- 11-: 1 -1 0) (28+ 11- 28+: 0 -1 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 3 (22- 22- 22-: 2 0 2) (57+ 22- 57+: -1 0 -1) [2 1 2] 0 2 (11- 11- 11-: 1 -1 1) (28+ 11- 28+: 0 -1 0) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 3 (22- 22- 22-: 1 0 1) (57+ 22- 57+: -2 0 -2) [2 1 2] 0 2 (11- 11- 11-: 0 -1 0) (28+ 11- 28+: -1 -1 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 3 (22- 22- 22-: 1 0 2) (57+ 22- 57+: -2 0 -1) [2 1 2] 0 2 (11- 11- 11-: 0 -1 1) (28+ 11- 28+: -1 -1 0) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 3 (22- 57+ 22-: 2 0 2) (57+ 57+ 57+: -1 0 -1) [2 1 2] 0 2 (11- 28+ 11-: 1 1 1) (28+ 28+ 28+: 0 1 0) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 3 (22- 57+ 22-: 2 0 1) (57+ 57+ 57+: -1 0 -2) [2 1 2] 0 2 (11- 28+ 11-: 1 1 0) (28+ 28+ 28+: 0 1 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 3 (22- 57+ 22-: 1 0 2) (57+ 57+ 57+: -2 0 -1) [2 1 2] 0 2 (11- 28+ 11-: 0 1 1) (28+ 28+ 28+: -1 1 0) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 3 (22- 57+ 22-: 1 0 1) (57+ 57+ 57+: -2 0 -2) [2 1 2] 0 2 (11- 28+ 11-: 0 1 0) (28+ 28+ 28+: -1 1 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 3 (22- 22- 22-: 0 0 0) (57+ 57+ 22-: -1 -1 0) [2 2 1] 0 2 (11- 11- 11-: 0 0 -1) (28+ 28+ 11-: 0 0 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 3 (22- 22- 22-: 0 1 0) (57+ 57+ 22-: -1 0 0) [2 2 1] 0 2 (11- 11- 11-: 0 0 -1) (28+ 28+ 11-: 0 0 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 3 (22- 22- 22-: 1 0 0) (57+ 57+ 22-: 0 -1 0) [2 2 1] 0 2 (11- 11- 11-: 0 0 -1) (28+ 28+ 11-: 0 0 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 3 (22- 22- 22-: 1 1 0) (57+ 57+ 22-: 0 0 0) [2 2 1] 0 2 (11- 11- 11-: 0 0 -1) (28+ 28+ 11-: 0 0 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 3 (22- 22- 57+: 1 0 0) (57+ 57+ 57+: 0 -1 0) [2 2 1] 0 2 (11- 11- 28+: 0 0 1) (28+ 28+ 28+: 0 0 1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 3 (22- 22- 57+: 1 1 0) (57+ 57+ 57+: 0 0 0) [2 2 1] 0 2 (11- 11- 28+: 0 0 1) (28+ 28+ 28+: 0 0 1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 3 (22- 22- 57+: 0 0 0) (57+ 57+ 57+: -1 -1 0) [2 2 1] 0 2 (11- 11- 28+: 0 0 1) (28+ 28+ 28+: 0 0 1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 3 (22- 22- 57+: 0 1 0) (57+ 57+ 57+: -1 0 0) [2 2 1] 0 2 (11- 11- 28+: 0 0 1) (28+ 28+ 28+: 0 0 1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 3 (23- 23- 23-: -1 0 0) (23- 51+ 51+: -1 0 0) [1 1 1] 0 4 (46- 46- 46-: 0 0 1) (46- 103+ 103+: 0 -1 0) [1 2 2] 0 [0 1 2] 7 -0.250000 GraphAddEntries: 3 (23- 23- 23-: -1 0 0) (23- 51+ 51+: -1 0 0) [1 1 1] 0 4 (46- 46- 46-: 0 1 1) (46- 103+ 103+: 0 0 0) [1 2 2] 0 [0 1 2] 8 -0.250000 GraphAddEntries: 3 (23- 23- 23-: -1 0 0) (23- 51+ 51+: -1 0 0) [1 1 1] 0 4 (46- 46- 46-: 0 0 0) (46- 103+ 103+: 0 -1 -1) [1 2 2] 0 [0 1 2] 9 -0.250000 GraphAddEntries: 3 (23- 23- 23-: -1 0 0) (23- 51+ 51+: -1 0 0) [1 1 1] 0 4 (46- 46- 46-: 0 1 0) (46- 103+ 103+: 0 0 -1) [1 2 2] 0 [0 1 2] 10 -0.250000 GraphAddEntries: 3 (51+ 23- 23-: 1 0 0) (51+ 51+ 51+: 1 0 0) [1 1 1] 0 4 (103+ 46- 46-: 0 0 0) (103+ 103+ 103+: 0 -1 -1) [1 2 2] 0 [0 1 2] 7 -0.250000 GraphAddEntries: 3 (51+ 23- 23-: 1 0 0) (51+ 51+ 51+: 1 0 0) [1 1 1] 0 4 (103+ 46- 46-: 0 1 0) (103+ 103+ 103+: 0 0 -1) [1 2 2] 0 [0 1 2] 8 -0.250000 GraphAddEntries: 3 (51+ 23- 23-: 1 0 0) (51+ 51+ 51+: 1 0 0) [1 1 1] 0 4 (103+ 46- 46-: 0 0 1) (103+ 103+ 103+: 0 -1 0) [1 2 2] 0 [0 1 2] 9 -0.250000 GraphAddEntries: 3 (51+ 23- 23-: 1 0 0) (51+ 51+ 51+: 1 0 0) [1 1 1] 0 4 (103+ 46- 46-: 0 1 1) (103+ 103+ 103+: 0 0 0) [1 2 2] 0 [0 1 2] 10 -0.250000 GraphAddEntries: 3 (23- 23- 23-: 0 -1 0) (51+ 23- 51+: 0 -1 0) [1 1 1] 0 4 (46- 46- 46-: 0 0 1) (103+ 46- 103+: -1 0 0) [2 1 2] 0 [0 1 2] 7 -0.250000 GraphAddEntries: 3 (23- 23- 23-: 0 -1 0) (51+ 23- 51+: 0 -1 0) [1 1 1] 0 4 (46- 46- 46-: 0 0 0) (103+ 46- 103+: -1 0 -1) [2 1 2] 0 [0 1 2] 8 -0.250000 GraphAddEntries: 3 (23- 23- 23-: 0 -1 0) (51+ 23- 51+: 0 -1 0) [1 1 1] 0 4 (46- 46- 46-: 1 0 1) (103+ 46- 103+: 0 0 0) [2 1 2] 0 [0 1 2] 9 -0.250000 GraphAddEntries: 3 (23- 23- 23-: 0 -1 0) (51+ 23- 51+: 0 -1 0) [1 1 1] 0 4 (46- 46- 46-: 1 0 0) (103+ 46- 103+: 0 0 -1) [2 1 2] 0 [0 1 2] 10 -0.250000 GraphAddEntries: 3 (23- 51+ 23-: 0 1 0) (51+ 51+ 51+: 0 1 0) [1 1 1] 0 4 (46- 103+ 46-: 0 0 0) (103+ 103+ 103+: -1 0 -1) [2 1 2] 0 [0 1 2] 7 -0.250000 GraphAddEntries: 3 (23- 51+ 23-: 0 1 0) (51+ 51+ 51+: 0 1 0) [1 1 1] 0 4 (46- 103+ 46-: 0 0 1) (103+ 103+ 103+: -1 0 0) [2 1 2] 0 [0 1 2] 8 -0.250000 GraphAddEntries: 3 (23- 51+ 23-: 0 1 0) (51+ 51+ 51+: 0 1 0) [1 1 1] 0 4 (46- 103+ 46-: 1 0 0) (103+ 103+ 103+: 0 0 -1) [2 1 2] 0 [0 1 2] 9 -0.250000 GraphAddEntries: 3 (23- 51+ 23-: 0 1 0) (51+ 51+ 51+: 0 1 0) [1 1 1] 0 4 (46- 103+ 46-: 1 0 1) (103+ 103+ 103+: 0 0 0) [2 1 2] 0 [0 1 2] 10 -0.250000 GraphAddEntries: 3 (23- 23- 23-: 0 0 -1) (51+ 51+ 23-: 0 0 -1) [1 1 1] 0 4 (46- 46- 46-: 0 0 0) (103+ 103+ 46-: -1 -1 0) [2 2 1] 0 [0 1 2] 7 -0.250000 GraphAddEntries: 3 (23- 23- 23-: 0 0 -1) (51+ 51+ 23-: 0 0 -1) [1 1 1] 0 4 (46- 46- 46-: 0 1 0) (103+ 103+ 46-: -1 0 0) [2 2 1] 0 [0 1 2] 8 -0.250000 GraphAddEntries: 3 (23- 23- 23-: 0 0 -1) (51+ 51+ 23-: 0 0 -1) [1 1 1] 0 4 (46- 46- 46-: 1 0 0) (103+ 103+ 46-: 0 -1 0) [2 2 1] 0 [0 1 2] 9 -0.250000 GraphAddEntries: 3 (23- 23- 23-: 0 0 -1) (51+ 51+ 23-: 0 0 -1) [1 1 1] 0 4 (46- 46- 46-: 1 1 0) (103+ 103+ 46-: 0 0 0) [2 2 1] 0 [0 1 2] 10 -0.250000 GraphAddEntries: 3 (23- 23- 51+: 0 0 1) (51+ 51+ 51+: 0 0 1) [1 1 1] 0 4 (46- 46- 103+: 1 0 0) (103+ 103+ 103+: 0 -1 0) [2 2 1] 0 [0 1 2] 7 -0.250000 GraphAddEntries: 3 (23- 23- 51+: 0 0 1) (51+ 51+ 51+: 0 0 1) [1 1 1] 0 4 (46- 46- 103+: 1 1 0) (103+ 103+ 103+: 0 0 0) [2 2 1] 0 [0 1 2] 8 -0.250000 GraphAddEntries: 3 (23- 23- 51+: 0 0 1) (51+ 51+ 51+: 0 0 1) [1 1 1] 0 4 (46- 46- 103+: 0 0 0) (103+ 103+ 103+: -1 -1 0) [2 2 1] 0 [0 1 2] 9 -0.250000 GraphAddEntries: 3 (23- 23- 51+: 0 0 1) (51+ 51+ 51+: 0 0 1) [1 1 1] 0 4 (46- 46- 103+: 0 1 0) (103+ 103+ 103+: -1 0 0) [2 2 1] 0 [0 1 2] 10 -0.250000 GraphAddEntries: 3 (22- 22- 22-: 0 0 0) (22- 57+ 22-: 0 -1 0) [1 2 1] 0 2 (11- 11- 11-: -1 0 0) (11- 28+ 11-: -1 0 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 3 (22- 22- 22-: 0 1 0) (22- 57+ 22-: 0 0 0) [1 2 1] 0 2 (11- 11- 11-: -1 0 0) (11- 28+ 11-: -1 0 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 3 (57+ 22- 57+: 0 0 0) (57+ 57+ 57+: 0 -1 0) [1 2 1] 0 2 (28+ 11- 28+: 1 0 0) (28+ 28+ 28+: 1 0 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 3 (57+ 22- 57+: 0 1 0) (57+ 57+ 57+: 0 0 0) [1 2 1] 0 2 (28+ 11- 28+: 1 0 0) (28+ 28+ 28+: 1 0 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 3 (57+ 22- 22-: 0 0 0) (57+ 57+ 22-: 0 -1 0) [1 2 1] 0 2 (28+ 11- 11-: 1 0 0) (28+ 28+ 11-: 1 0 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 3 (57+ 22- 22-: 0 1 0) (57+ 57+ 22-: 0 0 0) [1 2 1] 0 2 (28+ 11- 11-: 1 0 0) (28+ 28+ 11-: 1 0 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 3 (22- 22- 57+: 0 0 0) (22- 57+ 57+: 0 -1 0) [1 2 1] 0 2 (11- 11- 28+: -1 0 0) (11- 28+ 28+: -1 0 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 3 (22- 22- 57+: 0 1 0) (22- 57+ 57+: 0 0 0) [1 2 1] 0 2 (11- 11- 28+: -1 0 0) (11- 28+ 28+: -1 0 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 3 (22- 22- 22-: 2 0 0) (57+ 22- 22-: -1 0 0) [2 1 1] 0 2 (11- 11- 11-: 1 -1 0) (28+ 11- 11-: 0 -1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 3 (22- 22- 22-: 0 0 2) (22- 22- 57+: 0 0 -1) [1 1 2] 0 2 (11- 11- 11-: 0 -1 1) (11- 11- 28+: 0 -1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 3 (22- 22- 57+: 2 0 0) (57+ 22- 57+: -1 0 0) [2 1 1] 0 2 (11- 11- 28+: 1 -1 0) (28+ 11- 28+: 0 -1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 3 (57+ 22- 22-: 0 0 2) (57+ 22- 57+: 0 0 -1) [1 1 2] 0 2 (28+ 11- 11-: 0 -1 1) (28+ 11- 28+: 0 -1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 3 (22- 22- 22-: 1 0 0) (57+ 22- 22-: -2 0 0) [2 1 1] 0 2 (11- 11- 11-: 0 -1 0) (28+ 11- 11-: -1 -1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 3 (22- 22- 22-: 0 0 1) (22- 22- 57+: 0 0 -2) [1 1 2] 0 2 (11- 11- 11-: 0 -1 0) (11- 11- 28+: 0 -1 -1) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 3 (22- 22- 57+: 1 0 0) (57+ 22- 57+: -2 0 0) [2 1 1] 0 2 (11- 11- 28+: 0 -1 0) (28+ 11- 28+: -1 -1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 3 (57+ 22- 22-: 0 0 1) (57+ 22- 57+: 0 0 -2) [1 1 2] 0 2 (28+ 11- 11-: 0 -1 0) (28+ 11- 28+: 0 -1 -1) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 3 (22- 57+ 22-: 2 0 0) (57+ 57+ 22-: -1 0 0) [2 1 1] 0 2 (11- 28+ 11-: 1 1 0) (28+ 28+ 11-: 0 1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 3 (22- 57+ 22-: 0 0 2) (22- 57+ 57+: 0 0 -1) [1 1 2] 0 2 (11- 28+ 11-: 0 1 1) (11- 28+ 28+: 0 1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 3 (22- 57+ 57+: 2 0 0) (57+ 57+ 57+: -1 0 0) [2 1 1] 0 2 (11- 28+ 28+: 1 1 0) (28+ 28+ 28+: 0 1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 3 (57+ 57+ 22-: 0 0 2) (57+ 57+ 57+: 0 0 -1) [1 1 2] 0 2 (28+ 28+ 11-: 0 1 1) (28+ 28+ 28+: 0 1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 3 (22- 57+ 22-: 1 0 0) (57+ 57+ 22-: -2 0 0) [2 1 1] 0 2 (11- 28+ 11-: 0 1 0) (28+ 28+ 11-: -1 1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 3 (22- 57+ 22-: 0 0 1) (22- 57+ 57+: 0 0 -2) [1 1 2] 0 2 (11- 28+ 11-: 0 1 0) (11- 28+ 28+: 0 1 -1) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 3 (22- 57+ 57+: 1 0 0) (57+ 57+ 57+: -2 0 0) [2 1 1] 0 2 (11- 28+ 28+: 0 1 0) (28+ 28+ 28+: -1 1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 3 (57+ 57+ 22-: 0 0 1) (57+ 57+ 57+: 0 0 -2) [1 1 2] 0 2 (28+ 28+ 11-: 0 1 0) (28+ 28+ 28+: 0 1 -1) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 3 (22- 22- 22-: 0 0 0) (22- 22- 22-: 0 0 0) [1 1 1] 0 2 (11- 11- 11-: 0 -1 0) (11- 11- 11-: 0 -1 0) [1 1 1] 0 [0 1 2] 9 -1.000000 GraphAddEntries: 3 (57+ 22- 22-: 0 0 0) (57+ 22- 22-: 0 0 0) [1 1 1] 0 2 (28+ 11- 11-: 0 -1 0) (28+ 11- 11-: 0 -1 0) [1 1 1] 0 [0 1 2] 9 -1.000000 GraphAddEntries: 3 (22- 22- 57+: 0 0 0) (22- 22- 57+: 0 0 0) [1 1 1] 0 2 (11- 11- 28+: 0 -1 0) (11- 11- 28+: 0 -1 0) [1 1 1] 0 [0 1 2] 9 -1.000000 GraphAddEntries: 3 (57+ 22- 57+: 0 0 0) (57+ 22- 57+: 0 0 0) [1 1 1] 0 2 (28+ 11- 28+: 0 -1 0) (28+ 11- 28+: 0 -1 0) [1 1 1] 0 [0 1 2] 9 -1.000000 GraphAddEntries: 3 (22- 57+ 22-: 0 0 0) (22- 57+ 22-: 0 0 0) [1 1 1] 0 2 (11- 28+ 11-: 0 1 0) (11- 28+ 11-: 0 1 0) [1 1 1] 0 [0 1 2] 9 -1.000000 GraphAddEntries: 3 (57+ 57+ 22-: 0 0 0) (57+ 57+ 22-: 0 0 0) [1 1 1] 0 2 (28+ 28+ 11-: 0 1 0) (28+ 28+ 11-: 0 1 0) [1 1 1] 0 [0 1 2] 9 -1.000000 GraphAddEntries: 3 (22- 57+ 57+: 0 0 0) (22- 57+ 57+: 0 0 0) [1 1 1] 0 2 (11- 28+ 28+: 0 1 0) (11- 28+ 28+: 0 1 0) [1 1 1] 0 [0 1 2] 9 -1.000000 GraphAddEntries: 3 (57+ 57+ 57+: 0 0 0) (57+ 57+ 57+: 0 0 0) [1 1 1] 0 2 (28+ 28+ 28+: 0 1 0) (28+ 28+ 28+: 0 1 0) [1 1 1] 0 [0 1 2] 9 -1.000000 GraphAddEntries: 4 (46- 46- 46-: 0 0 1) (46- 103+ 103+: 0 -1 -2) [1 2 2] 0 3 (23- 23- 23-: -1 0 0) (23- 51+ 51+: -1 0 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 4 (46- 46- 46-: 0 1 1) (46- 103+ 103+: 0 0 -2) [1 2 2] 0 3 (23- 23- 23-: -1 0 0) (23- 51+ 51+: -1 0 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 4 (46- 46- 46-: 0 0 2) (46- 103+ 103+: 0 -1 -1) [1 2 2] 0 3 (23- 23- 23-: -1 0 1) (23- 51+ 51+: -1 0 0) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 4 (46- 46- 46-: 0 1 2) (46- 103+ 103+: 0 0 -1) [1 2 2] 0 3 (23- 23- 23-: -1 0 1) (23- 51+ 51+: -1 0 0) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 4 (103+ 46- 46-: 0 0 2) (103+ 103+ 103+: 0 -1 -1) [1 2 2] 0 3 (51+ 23- 23-: 1 0 1) (51+ 51+ 51+: 1 0 0) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 4 (103+ 46- 46-: 0 1 2) (103+ 103+ 103+: 0 0 -1) [1 2 2] 0 3 (51+ 23- 23-: 1 0 1) (51+ 51+ 51+: 1 0 0) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 4 (103+ 46- 46-: 0 0 1) (103+ 103+ 103+: 0 -1 -2) [1 2 2] 0 3 (51+ 23- 23-: 1 0 0) (51+ 51+ 51+: 1 0 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 4 (103+ 46- 46-: 0 1 1) (103+ 103+ 103+: 0 0 -2) [1 2 2] 0 3 (51+ 23- 23-: 1 0 0) (51+ 51+ 51+: 1 0 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 4 (46- 46- 46-: 2 0 1) (103+ 46- 103+: -1 0 -2) [2 1 2] 0 3 (23- 23- 23-: 1 -1 0) (51+ 23- 51+: 0 -1 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 4 (46- 46- 46-: 2 0 2) (103+ 46- 103+: -1 0 -1) [2 1 2] 0 3 (23- 23- 23-: 1 -1 1) (51+ 23- 51+: 0 -1 0) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 4 (46- 46- 46-: 1 0 1) (103+ 46- 103+: -2 0 -2) [2 1 2] 0 3 (23- 23- 23-: 0 -1 0) (51+ 23- 51+: -1 -1 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 4 (46- 46- 46-: 1 0 2) (103+ 46- 103+: -2 0 -1) [2 1 2] 0 3 (23- 23- 23-: 0 -1 1) (51+ 23- 51+: -1 -1 0) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 4 (46- 103+ 46-: 2 0 2) (103+ 103+ 103+: -1 0 -1) [2 1 2] 0 3 (23- 51+ 23-: 1 1 1) (51+ 51+ 51+: 0 1 0) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 4 (46- 103+ 46-: 2 0 1) (103+ 103+ 103+: -1 0 -2) [2 1 2] 0 3 (23- 51+ 23-: 1 1 0) (51+ 51+ 51+: 0 1 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 4 (46- 103+ 46-: 1 0 2) (103+ 103+ 103+: -2 0 -1) [2 1 2] 0 3 (23- 51+ 23-: 0 1 1) (51+ 51+ 51+: -1 1 0) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 4 (46- 103+ 46-: 1 0 1) (103+ 103+ 103+: -2 0 -2) [2 1 2] 0 3 (23- 51+ 23-: 0 1 0) (51+ 51+ 51+: -1 1 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 4 (46- 46- 46-: 0 0 0) (103+ 103+ 46-: -1 -1 0) [2 2 1] 0 3 (23- 23- 23-: 0 0 -1) (51+ 51+ 23-: 0 0 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 4 (46- 46- 46-: 0 1 0) (103+ 103+ 46-: -1 0 0) [2 2 1] 0 3 (23- 23- 23-: 0 0 -1) (51+ 51+ 23-: 0 0 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 4 (46- 46- 46-: 1 0 0) (103+ 103+ 46-: 0 -1 0) [2 2 1] 0 3 (23- 23- 23-: 0 0 -1) (51+ 51+ 23-: 0 0 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 4 (46- 46- 46-: 1 1 0) (103+ 103+ 46-: 0 0 0) [2 2 1] 0 3 (23- 23- 23-: 0 0 -1) (51+ 51+ 23-: 0 0 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 4 (46- 46- 103+: 1 0 0) (103+ 103+ 103+: 0 -1 0) [2 2 1] 0 3 (23- 23- 51+: 0 0 1) (51+ 51+ 51+: 0 0 1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 4 (46- 46- 103+: 1 1 0) (103+ 103+ 103+: 0 0 0) [2 2 1] 0 3 (23- 23- 51+: 0 0 1) (51+ 51+ 51+: 0 0 1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 4 (46- 46- 103+: 0 0 0) (103+ 103+ 103+: -1 -1 0) [2 2 1] 0 3 (23- 23- 51+: 0 0 1) (51+ 51+ 51+: 0 0 1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 4 (46- 46- 103+: 0 1 0) (103+ 103+ 103+: -1 0 0) [2 2 1] 0 3 (23- 23- 51+: 0 0 1) (51+ 51+ 51+: 0 0 1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 4 (46- 46- 46-: 0 0 0) (46- 103+ 46-: 0 -1 0) [1 2 1] 0 3 (23- 23- 23-: -1 0 0) (23- 51+ 23-: -1 0 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 4 (46- 46- 46-: 0 1 0) (46- 103+ 46-: 0 0 0) [1 2 1] 0 3 (23- 23- 23-: -1 0 0) (23- 51+ 23-: -1 0 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 4 (103+ 46- 103+: 0 0 0) (103+ 103+ 103+: 0 -1 0) [1 2 1] 0 3 (51+ 23- 51+: 1 0 0) (51+ 51+ 51+: 1 0 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 4 (103+ 46- 103+: 0 1 0) (103+ 103+ 103+: 0 0 0) [1 2 1] 0 3 (51+ 23- 51+: 1 0 0) (51+ 51+ 51+: 1 0 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 4 (103+ 46- 46-: 0 0 0) (103+ 103+ 46-: 0 -1 0) [1 2 1] 0 3 (51+ 23- 23-: 1 0 0) (51+ 51+ 23-: 1 0 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 4 (103+ 46- 46-: 0 1 0) (103+ 103+ 46-: 0 0 0) [1 2 1] 0 3 (51+ 23- 23-: 1 0 0) (51+ 51+ 23-: 1 0 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 4 (46- 46- 103+: 0 0 0) (46- 103+ 103+: 0 -1 0) [1 2 1] 0 3 (23- 23- 51+: -1 0 0) (23- 51+ 51+: -1 0 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 4 (46- 46- 103+: 0 1 0) (46- 103+ 103+: 0 0 0) [1 2 1] 0 3 (23- 23- 51+: -1 0 0) (23- 51+ 51+: -1 0 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 4 (46- 46- 46-: 2 0 0) (103+ 46- 46-: -1 0 0) [2 1 1] 0 3 (23- 23- 23-: 1 -1 0) (51+ 23- 23-: 0 -1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 4 (46- 46- 46-: 0 0 2) (46- 46- 103+: 0 0 -1) [1 1 2] 0 3 (23- 23- 23-: 0 -1 1) (23- 23- 51+: 0 -1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 4 (46- 46- 103+: 2 0 0) (103+ 46- 103+: -1 0 0) [2 1 1] 0 3 (23- 23- 51+: 1 -1 0) (51+ 23- 51+: 0 -1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 4 (103+ 46- 46-: 0 0 2) (103+ 46- 103+: 0 0 -1) [1 1 2] 0 3 (51+ 23- 23-: 0 -1 1) (51+ 23- 51+: 0 -1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 4 (46- 46- 46-: 1 0 0) (103+ 46- 46-: -2 0 0) [2 1 1] 0 3 (23- 23- 23-: 0 -1 0) (51+ 23- 23-: -1 -1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 4 (46- 46- 46-: 0 0 1) (46- 46- 103+: 0 0 -2) [1 1 2] 0 3 (23- 23- 23-: 0 -1 0) (23- 23- 51+: 0 -1 -1) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 4 (46- 46- 103+: 1 0 0) (103+ 46- 103+: -2 0 0) [2 1 1] 0 3 (23- 23- 51+: 0 -1 0) (51+ 23- 51+: -1 -1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 4 (103+ 46- 46-: 0 0 1) (103+ 46- 103+: 0 0 -2) [1 1 2] 0 3 (51+ 23- 23-: 0 -1 0) (51+ 23- 51+: 0 -1 -1) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 4 (46- 103+ 46-: 2 0 0) (103+ 103+ 46-: -1 0 0) [2 1 1] 0 3 (23- 51+ 23-: 1 1 0) (51+ 51+ 23-: 0 1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 4 (46- 103+ 46-: 0 0 2) (46- 103+ 103+: 0 0 -1) [1 1 2] 0 3 (23- 51+ 23-: 0 1 1) (23- 51+ 51+: 0 1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 4 (46- 103+ 103+: 2 0 0) (103+ 103+ 103+: -1 0 0) [2 1 1] 0 3 (23- 51+ 51+: 1 1 0) (51+ 51+ 51+: 0 1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 4 (103+ 103+ 46-: 0 0 2) (103+ 103+ 103+: 0 0 -1) [1 1 2] 0 3 (51+ 51+ 23-: 0 1 1) (51+ 51+ 51+: 0 1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 4 (46- 103+ 46-: 1 0 0) (103+ 103+ 46-: -2 0 0) [2 1 1] 0 3 (23- 51+ 23-: 0 1 0) (51+ 51+ 23-: -1 1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 4 (46- 103+ 46-: 0 0 1) (46- 103+ 103+: 0 0 -2) [1 1 2] 0 3 (23- 51+ 23-: 0 1 0) (23- 51+ 51+: 0 1 -1) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 4 (46- 103+ 103+: 1 0 0) (103+ 103+ 103+: -2 0 0) [2 1 1] 0 3 (23- 51+ 51+: 0 1 0) (51+ 51+ 51+: -1 1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 4 (103+ 103+ 46-: 0 0 1) (103+ 103+ 103+: 0 0 -2) [1 1 2] 0 3 (51+ 51+ 23-: 0 1 0) (51+ 51+ 51+: 0 1 -1) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 4 (46- 46- 46-: 0 0 0) (46- 46- 46-: 0 0 0) [1 1 1] 0 3 (23- 23- 23-: 0 -1 0) (23- 23- 23-: 0 -1 0) [1 1 1] 0 [0 1 2] 9 -1.000000 GraphAddEntries: 4 (103+ 46- 46-: 0 0 0) (103+ 46- 46-: 0 0 0) [1 1 1] 0 3 (51+ 23- 23-: 0 -1 0) (51+ 23- 23-: 0 -1 0) [1 1 1] 0 [0 1 2] 9 -1.000000 GraphAddEntries: 4 (46- 46- 103+: 0 0 0) (46- 46- 103+: 0 0 0) [1 1 1] 0 3 (23- 23- 51+: 0 -1 0) (23- 23- 51+: 0 -1 0) [1 1 1] 0 [0 1 2] 9 -1.000000 GraphAddEntries: 4 (103+ 46- 103+: 0 0 0) (103+ 46- 103+: 0 0 0) [1 1 1] 0 3 (51+ 23- 51+: 0 -1 0) (51+ 23- 51+: 0 -1 0) [1 1 1] 0 [0 1 2] 9 -1.000000 GraphAddEntries: 4 (46- 103+ 46-: 0 0 0) (46- 103+ 46-: 0 0 0) [1 1 1] 0 3 (23- 51+ 23-: 0 1 0) (23- 51+ 23-: 0 1 0) [1 1 1] 0 [0 1 2] 9 -1.000000 GraphAddEntries: 4 (103+ 103+ 46-: 0 0 0) (103+ 103+ 46-: 0 0 0) [1 1 1] 0 3 (51+ 51+ 23-: 0 1 0) (51+ 51+ 23-: 0 1 0) [1 1 1] 0 [0 1 2] 9 -1.000000 GraphAddEntries: 4 (46- 103+ 103+: 0 0 0) (46- 103+ 103+: 0 0 0) [1 1 1] 0 3 (23- 51+ 51+: 0 1 0) (23- 51+ 51+: 0 1 0) [1 1 1] 0 [0 1 2] 9 -1.000000 GraphAddEntries: 4 (103+ 103+ 103+: 0 0 0) (103+ 103+ 103+: 0 0 0) [1 1 1] 0 3 (51+ 51+ 51+: 0 1 0) (51+ 51+ 51+: 0 1 0) [1 1 1] 0 [0 1 2] 9 -1.000000 ############################################################# FacParts: 0 0 [1 1 1] FacParts: 1 1 [2 2 2] FacParts: 2 2 [2 2 2] FacParts: 3 3 [2 2 2] FacParts: 4 4 [2 2 2] ProcessPoolCreate: 1 # ProcessPoolSetPart: pool part ProcessPoolSetPart: 0 0 ProcessPoolSetPart: 0 1 ProcessPoolSetPart: 0 2 ProcessPoolSetPart: 0 3 ProcessPoolSetPart: 0 4 hypre-2.33.0/src/test/TEST_fac/6lev.in000066400000000000000000001673001477326011500173050ustar00rootroot00000000000000# Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) ###################################################### # GridCreate: ndim nparts GridCreate: 3 6 ############################################################# # GridSetExtents: part ilower(ndim) iupper(ndim) GridSetExtents: 0 (1- 1- 1-) (8+ 8+ 8+) GridSetExtents: 1 (4- 4- 4-) (13+ 13+ 13+) GridSetExtents: 2 (10- 10- 10-) (23+ 23+ 23+) GridSetExtents: 3 (22- 22- 22-) (43+ 43+ 43+) GridSetExtents: 4 (46- 46- 46-) (81+ 81+ 81+) GridSetExtents: 5 (98- 98- 98-) (121+ 121+ 121+) ############################################################# # GridSetVariables: part nvars vartypes[nvars] # CELL = 0 # NODE = 1 # XFACE = 2 # YFACE = 3 # ZFACE = 4 # XEDGE = 5 # YEDGE = 6 # ZEDGE = 7 GridSetVariables: 0 1 [0] GridSetVariables: 1 1 [0] GridSetVariables: 2 1 [0] GridSetVariables: 3 1 [0] GridSetVariables: 4 1 [0] GridSetVariables: 5 1 [0] ############################################################# # StencilCreate: nstencils sizes[nstencils] StencilCreate: 1 [7] ############################################################# # StencilSetEntry: stencil_num entry offset[ndim] var value StencilSetEntry: 0 0 [ 0 0 0] 0 6.000000 StencilSetEntry: 0 1 [-1 0 0] 0 -1.000000 StencilSetEntry: 0 2 [ 1 0 0] 0 -1.000000 StencilSetEntry: 0 3 [ 0 -1 0] 0 -1.000000 StencilSetEntry: 0 4 [ 0 0 1] 0 -1.000000 StencilSetEntry: 0 5 [ 0 0 -1] 0 -1.000000 StencilSetEntry: 0 6 [ 0 1 0] 0 -1.000000 ############################################################# # GraphSetStencil: part var stencil_num GraphSetStencil: 0 0 0 GraphSetStencil: 1 0 0 GraphSetStencil: 2 0 0 GraphSetStencil: 3 0 0 GraphSetStencil: 4 0 0 GraphSetStencil: 5 0 0 ############################################################# # GraphAddEntries: \ # part ilower(ndim) iupper(ndim) stride[ndim] var \ # to_part to_ilower(ndim) to_iupper(ndim) to_stride[ndim] to_var \ # index_map[ndim] entry value GraphAddEntries: 0 (2- 2- 2-: -1 0 0) (2- 6+ 6+: -1 0 0) [1 1 1] 0 1 (4- 4- 4-: 0 0 1) (4- 13+ 13+: 0 -1 0) [1 2 2] 0 [0 1 2] 7 -0.250000 GraphAddEntries: 0 (2- 2- 2-: -1 0 0) (2- 6+ 6+: -1 0 0) [1 1 1] 0 1 (4- 4- 4-: 0 1 1) (4- 13+ 13+: 0 0 0) [1 2 2] 0 [0 1 2] 8 -0.250000 GraphAddEntries: 0 (2- 2- 2-: -1 0 0) (2- 6+ 6+: -1 0 0) [1 1 1] 0 1 (4- 4- 4-: 0 0 0) (4- 13+ 13+: 0 -1 -1) [1 2 2] 0 [0 1 2] 9 -0.250000 GraphAddEntries: 0 (2- 2- 2-: -1 0 0) (2- 6+ 6+: -1 0 0) [1 1 1] 0 1 (4- 4- 4-: 0 1 0) (4- 13+ 13+: 0 0 -1) [1 2 2] 0 [0 1 2] 10 -0.250000 GraphAddEntries: 0 (6+ 2- 2-: 1 0 0) (6+ 6+ 6+: 1 0 0) [1 1 1] 0 1 (13+ 4- 4-: 0 0 0) (13+ 13+ 13+: 0 -1 -1) [1 2 2] 0 [0 1 2] 7 -0.250000 GraphAddEntries: 0 (6+ 2- 2-: 1 0 0) (6+ 6+ 6+: 1 0 0) [1 1 1] 0 1 (13+ 4- 4-: 0 1 0) (13+ 13+ 13+: 0 0 -1) [1 2 2] 0 [0 1 2] 8 -0.250000 GraphAddEntries: 0 (6+ 2- 2-: 1 0 0) (6+ 6+ 6+: 1 0 0) [1 1 1] 0 1 (13+ 4- 4-: 0 0 1) (13+ 13+ 13+: 0 -1 0) [1 2 2] 0 [0 1 2] 9 -0.250000 GraphAddEntries: 0 (6+ 2- 2-: 1 0 0) (6+ 6+ 6+: 1 0 0) [1 1 1] 0 1 (13+ 4- 4-: 0 1 1) (13+ 13+ 13+: 0 0 0) [1 2 2] 0 [0 1 2] 10 -0.250000 GraphAddEntries: 0 (2- 2- 2-: 0 -1 0) (6+ 2- 6+: 0 -1 0) [1 1 1] 0 1 (4- 4- 4-: 0 0 1) (13+ 4- 13+: -1 0 0) [2 1 2] 0 [0 1 2] 7 -0.250000 GraphAddEntries: 0 (2- 2- 2-: 0 -1 0) (6+ 2- 6+: 0 -1 0) [1 1 1] 0 1 (4- 4- 4-: 0 0 0) (13+ 4- 13+: -1 0 -1) [2 1 2] 0 [0 1 2] 8 -0.250000 GraphAddEntries: 0 (2- 2- 2-: 0 -1 0) (6+ 2- 6+: 0 -1 0) [1 1 1] 0 1 (4- 4- 4-: 1 0 1) (13+ 4- 13+: 0 0 0) [2 1 2] 0 [0 1 2] 9 -0.250000 GraphAddEntries: 0 (2- 2- 2-: 0 -1 0) (6+ 2- 6+: 0 -1 0) [1 1 1] 0 1 (4- 4- 4-: 1 0 0) (13+ 4- 13+: 0 0 -1) [2 1 2] 0 [0 1 2] 10 -0.250000 GraphAddEntries: 0 (2- 6+ 2-: 0 1 0) (6+ 6+ 6+: 0 1 0) [1 1 1] 0 1 (4- 13+ 4-: 0 0 0) (13+ 13+ 13+: -1 0 -1) [2 1 2] 0 [0 1 2] 7 -0.250000 GraphAddEntries: 0 (2- 6+ 2-: 0 1 0) (6+ 6+ 6+: 0 1 0) [1 1 1] 0 1 (4- 13+ 4-: 0 0 1) (13+ 13+ 13+: -1 0 0) [2 1 2] 0 [0 1 2] 8 -0.250000 GraphAddEntries: 0 (2- 6+ 2-: 0 1 0) (6+ 6+ 6+: 0 1 0) [1 1 1] 0 1 (4- 13+ 4-: 1 0 0) (13+ 13+ 13+: 0 0 -1) [2 1 2] 0 [0 1 2] 9 -0.250000 GraphAddEntries: 0 (2- 6+ 2-: 0 1 0) (6+ 6+ 6+: 0 1 0) [1 1 1] 0 1 (4- 13+ 4-: 1 0 1) (13+ 13+ 13+: 0 0 0) [2 1 2] 0 [0 1 2] 10 -0.250000 GraphAddEntries: 0 (2- 2- 2-: 0 0 -1) (6+ 6+ 2-: 0 0 -1) [1 1 1] 0 1 (4- 4- 4-: 0 0 0) (13+ 13+ 4-: -1 -1 0) [2 2 1] 0 [0 1 2] 7 -0.250000 GraphAddEntries: 0 (2- 2- 2-: 0 0 -1) (6+ 6+ 2-: 0 0 -1) [1 1 1] 0 1 (4- 4- 4-: 0 1 0) (13+ 13+ 4-: -1 0 0) [2 2 1] 0 [0 1 2] 8 -0.250000 GraphAddEntries: 0 (2- 2- 2-: 0 0 -1) (6+ 6+ 2-: 0 0 -1) [1 1 1] 0 1 (4- 4- 4-: 1 0 0) (13+ 13+ 4-: 0 -1 0) [2 2 1] 0 [0 1 2] 9 -0.250000 GraphAddEntries: 0 (2- 2- 2-: 0 0 -1) (6+ 6+ 2-: 0 0 -1) [1 1 1] 0 1 (4- 4- 4-: 1 1 0) (13+ 13+ 4-: 0 0 0) [2 2 1] 0 [0 1 2] 10 -0.250000 GraphAddEntries: 0 (2- 2- 6+: 0 0 1) (6+ 6+ 6+: 0 0 1) [1 1 1] 0 1 (4- 4- 13+: 1 0 0) (13+ 13+ 13+: 0 -1 0) [2 2 1] 0 [0 1 2] 7 -0.250000 GraphAddEntries: 0 (2- 2- 6+: 0 0 1) (6+ 6+ 6+: 0 0 1) [1 1 1] 0 1 (4- 4- 13+: 1 1 0) (13+ 13+ 13+: 0 0 0) [2 2 1] 0 [0 1 2] 8 -0.250000 GraphAddEntries: 0 (2- 2- 6+: 0 0 1) (6+ 6+ 6+: 0 0 1) [1 1 1] 0 1 (4- 4- 13+: 0 0 0) (13+ 13+ 13+: -1 -1 0) [2 2 1] 0 [0 1 2] 9 -0.250000 GraphAddEntries: 0 (2- 2- 6+: 0 0 1) (6+ 6+ 6+: 0 0 1) [1 1 1] 0 1 (4- 4- 13+: 0 1 0) (13+ 13+ 13+: -1 0 0) [2 2 1] 0 [0 1 2] 10 -0.250000 GraphAddEntries: 1 (4- 4- 4-: 0 0 1) (4- 13+ 13+: 0 -1 -2) [1 2 2] 0 0 (2- 2- 2-: -1 0 0) (2- 6+ 6+: -1 0 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 1 (4- 4- 4-: 0 1 1) (4- 13+ 13+: 0 0 -2) [1 2 2] 0 0 (2- 2- 2-: -1 0 0) (2- 6+ 6+: -1 0 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 1 (4- 4- 4-: 0 0 2) (4- 13+ 13+: 0 -1 -1) [1 2 2] 0 0 (2- 2- 2-: -1 0 1) (2- 6+ 6+: -1 0 0) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 1 (4- 4- 4-: 0 1 2) (4- 13+ 13+: 0 0 -1) [1 2 2] 0 0 (2- 2- 2-: -1 0 1) (2- 6+ 6+: -1 0 0) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 1 (13+ 4- 4-: 0 0 2) (13+ 13+ 13+: 0 -1 -1) [1 2 2] 0 0 (6+ 2- 2-: 1 0 1) (6+ 6+ 6+: 1 0 0) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 1 (13+ 4- 4-: 0 1 2) (13+ 13+ 13+: 0 0 -1) [1 2 2] 0 0 (6+ 2- 2-: 1 0 1) (6+ 6+ 6+: 1 0 0) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 1 (13+ 4- 4-: 0 0 1) (13+ 13+ 13+: 0 -1 -2) [1 2 2] 0 0 (6+ 2- 2-: 1 0 0) (6+ 6+ 6+: 1 0 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 1 (13+ 4- 4-: 0 1 1) (13+ 13+ 13+: 0 0 -2) [1 2 2] 0 0 (6+ 2- 2-: 1 0 0) (6+ 6+ 6+: 1 0 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 1 (4- 4- 4-: 2 0 1) (13+ 4- 13+: -1 0 -2) [2 1 2] 0 0 (2- 2- 2-: 1 -1 0) (6+ 2- 6+: 0 -1 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 1 (4- 4- 4-: 2 0 2) (13+ 4- 13+: -1 0 -1) [2 1 2] 0 0 (2- 2- 2-: 1 -1 1) (6+ 2- 6+: 0 -1 0) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 1 (4- 4- 4-: 1 0 1) (13+ 4- 13+: -2 0 -2) [2 1 2] 0 0 (2- 2- 2-: 0 -1 0) (6+ 2- 6+: -1 -1 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 1 (4- 4- 4-: 1 0 2) (13+ 4- 13+: -2 0 -1) [2 1 2] 0 0 (2- 2- 2-: 0 -1 1) (6+ 2- 6+: -1 -1 0) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 1 (4- 13+ 4-: 2 0 2) (13+ 13+ 13+: -1 0 -1) [2 1 2] 0 0 (2- 6+ 2-: 1 1 1) (6+ 6+ 6+: 0 1 0) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 1 (4- 13+ 4-: 2 0 1) (13+ 13+ 13+: -1 0 -2) [2 1 2] 0 0 (2- 6+ 2-: 1 1 0) (6+ 6+ 6+: 0 1 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 1 (4- 13+ 4-: 1 0 2) (13+ 13+ 13+: -2 0 -1) [2 1 2] 0 0 (2- 6+ 2-: 0 1 1) (6+ 6+ 6+: -1 1 0) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 1 (4- 13+ 4-: 1 0 1) (13+ 13+ 13+: -2 0 -2) [2 1 2] 0 0 (2- 6+ 2-: 0 1 0) (6+ 6+ 6+: -1 1 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 1 (4- 4- 4-: 0 0 0) (13+ 13+ 4-: -1 -1 0) [2 2 1] 0 0 (2- 2- 2-: 0 0 -1) (6+ 6+ 2-: 0 0 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 1 (4- 4- 4-: 0 1 0) (13+ 13+ 4-: -1 0 0) [2 2 1] 0 0 (2- 2- 2-: 0 0 -1) (6+ 6+ 2-: 0 0 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 1 (4- 4- 4-: 1 0 0) (13+ 13+ 4-: 0 -1 0) [2 2 1] 0 0 (2- 2- 2-: 0 0 -1) (6+ 6+ 2-: 0 0 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 1 (4- 4- 4-: 1 1 0) (13+ 13+ 4-: 0 0 0) [2 2 1] 0 0 (2- 2- 2-: 0 0 -1) (6+ 6+ 2-: 0 0 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 1 (4- 4- 13+: 1 0 0) (13+ 13+ 13+: 0 -1 0) [2 2 1] 0 0 (2- 2- 6+: 0 0 1) (6+ 6+ 6+: 0 0 1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 1 (4- 4- 13+: 1 1 0) (13+ 13+ 13+: 0 0 0) [2 2 1] 0 0 (2- 2- 6+: 0 0 1) (6+ 6+ 6+: 0 0 1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 1 (4- 4- 13+: 0 0 0) (13+ 13+ 13+: -1 -1 0) [2 2 1] 0 0 (2- 2- 6+: 0 0 1) (6+ 6+ 6+: 0 0 1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 1 (4- 4- 13+: 0 1 0) (13+ 13+ 13+: -1 0 0) [2 2 1] 0 0 (2- 2- 6+: 0 0 1) (6+ 6+ 6+: 0 0 1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 1 (5- 5- 5-: -1 0 0) (5- 11+ 11+: -1 0 0) [1 1 1] 0 2 (10- 10- 10-: 0 0 1) (10- 23+ 23+: 0 -1 0) [1 2 2] 0 [0 1 2] 7 -0.250000 GraphAddEntries: 1 (5- 5- 5-: -1 0 0) (5- 11+ 11+: -1 0 0) [1 1 1] 0 2 (10- 10- 10-: 0 1 1) (10- 23+ 23+: 0 0 0) [1 2 2] 0 [0 1 2] 8 -0.250000 GraphAddEntries: 1 (5- 5- 5-: -1 0 0) (5- 11+ 11+: -1 0 0) [1 1 1] 0 2 (10- 10- 10-: 0 0 0) (10- 23+ 23+: 0 -1 -1) [1 2 2] 0 [0 1 2] 9 -0.250000 GraphAddEntries: 1 (5- 5- 5-: -1 0 0) (5- 11+ 11+: -1 0 0) [1 1 1] 0 2 (10- 10- 10-: 0 1 0) (10- 23+ 23+: 0 0 -1) [1 2 2] 0 [0 1 2] 10 -0.250000 GraphAddEntries: 1 (11+ 5- 5-: 1 0 0) (11+ 11+ 11+: 1 0 0) [1 1 1] 0 2 (23+ 10- 10-: 0 0 0) (23+ 23+ 23+: 0 -1 -1) [1 2 2] 0 [0 1 2] 7 -0.250000 GraphAddEntries: 1 (11+ 5- 5-: 1 0 0) (11+ 11+ 11+: 1 0 0) [1 1 1] 0 2 (23+ 10- 10-: 0 1 0) (23+ 23+ 23+: 0 0 -1) [1 2 2] 0 [0 1 2] 8 -0.250000 GraphAddEntries: 1 (11+ 5- 5-: 1 0 0) (11+ 11+ 11+: 1 0 0) [1 1 1] 0 2 (23+ 10- 10-: 0 0 1) (23+ 23+ 23+: 0 -1 0) [1 2 2] 0 [0 1 2] 9 -0.250000 GraphAddEntries: 1 (11+ 5- 5-: 1 0 0) (11+ 11+ 11+: 1 0 0) [1 1 1] 0 2 (23+ 10- 10-: 0 1 1) (23+ 23+ 23+: 0 0 0) [1 2 2] 0 [0 1 2] 10 -0.250000 GraphAddEntries: 1 (5- 5- 5-: 0 -1 0) (11+ 5- 11+: 0 -1 0) [1 1 1] 0 2 (10- 10- 10-: 0 0 1) (23+ 10- 23+: -1 0 0) [2 1 2] 0 [0 1 2] 7 -0.250000 GraphAddEntries: 1 (5- 5- 5-: 0 -1 0) (11+ 5- 11+: 0 -1 0) [1 1 1] 0 2 (10- 10- 10-: 0 0 0) (23+ 10- 23+: -1 0 -1) [2 1 2] 0 [0 1 2] 8 -0.250000 GraphAddEntries: 1 (5- 5- 5-: 0 -1 0) (11+ 5- 11+: 0 -1 0) [1 1 1] 0 2 (10- 10- 10-: 1 0 1) (23+ 10- 23+: 0 0 0) [2 1 2] 0 [0 1 2] 9 -0.250000 GraphAddEntries: 1 (5- 5- 5-: 0 -1 0) (11+ 5- 11+: 0 -1 0) [1 1 1] 0 2 (10- 10- 10-: 1 0 0) (23+ 10- 23+: 0 0 -1) [2 1 2] 0 [0 1 2] 10 -0.250000 GraphAddEntries: 1 (5- 11+ 5-: 0 1 0) (11+ 11+ 11+: 0 1 0) [1 1 1] 0 2 (10- 23+ 10-: 0 0 0) (23+ 23+ 23+: -1 0 -1) [2 1 2] 0 [0 1 2] 7 -0.250000 GraphAddEntries: 1 (5- 11+ 5-: 0 1 0) (11+ 11+ 11+: 0 1 0) [1 1 1] 0 2 (10- 23+ 10-: 0 0 1) (23+ 23+ 23+: -1 0 0) [2 1 2] 0 [0 1 2] 8 -0.250000 GraphAddEntries: 1 (5- 11+ 5-: 0 1 0) (11+ 11+ 11+: 0 1 0) [1 1 1] 0 2 (10- 23+ 10-: 1 0 0) (23+ 23+ 23+: 0 0 -1) [2 1 2] 0 [0 1 2] 9 -0.250000 GraphAddEntries: 1 (5- 11+ 5-: 0 1 0) (11+ 11+ 11+: 0 1 0) [1 1 1] 0 2 (10- 23+ 10-: 1 0 1) (23+ 23+ 23+: 0 0 0) [2 1 2] 0 [0 1 2] 10 -0.250000 GraphAddEntries: 1 (5- 5- 5-: 0 0 -1) (11+ 11+ 5-: 0 0 -1) [1 1 1] 0 2 (10- 10- 10-: 0 0 0) (23+ 23+ 10-: -1 -1 0) [2 2 1] 0 [0 1 2] 7 -0.250000 GraphAddEntries: 1 (5- 5- 5-: 0 0 -1) (11+ 11+ 5-: 0 0 -1) [1 1 1] 0 2 (10- 10- 10-: 0 1 0) (23+ 23+ 10-: -1 0 0) [2 2 1] 0 [0 1 2] 8 -0.250000 GraphAddEntries: 1 (5- 5- 5-: 0 0 -1) (11+ 11+ 5-: 0 0 -1) [1 1 1] 0 2 (10- 10- 10-: 1 0 0) (23+ 23+ 10-: 0 -1 0) [2 2 1] 0 [0 1 2] 9 -0.250000 GraphAddEntries: 1 (5- 5- 5-: 0 0 -1) (11+ 11+ 5-: 0 0 -1) [1 1 1] 0 2 (10- 10- 10-: 1 1 0) (23+ 23+ 10-: 0 0 0) [2 2 1] 0 [0 1 2] 10 -0.250000 GraphAddEntries: 1 (5- 5- 11+: 0 0 1) (11+ 11+ 11+: 0 0 1) [1 1 1] 0 2 (10- 10- 23+: 1 0 0) (23+ 23+ 23+: 0 -1 0) [2 2 1] 0 [0 1 2] 7 -0.250000 GraphAddEntries: 1 (5- 5- 11+: 0 0 1) (11+ 11+ 11+: 0 0 1) [1 1 1] 0 2 (10- 10- 23+: 1 1 0) (23+ 23+ 23+: 0 0 0) [2 2 1] 0 [0 1 2] 8 -0.250000 GraphAddEntries: 1 (5- 5- 11+: 0 0 1) (11+ 11+ 11+: 0 0 1) [1 1 1] 0 2 (10- 10- 23+: 0 0 0) (23+ 23+ 23+: -1 -1 0) [2 2 1] 0 [0 1 2] 9 -0.250000 GraphAddEntries: 1 (5- 5- 11+: 0 0 1) (11+ 11+ 11+: 0 0 1) [1 1 1] 0 2 (10- 10- 23+: 0 1 0) (23+ 23+ 23+: -1 0 0) [2 2 1] 0 [0 1 2] 10 -0.250000 GraphAddEntries: 1 (4- 4- 4-: 0 0 0) (4- 13+ 4-: 0 -1 0) [1 2 1] 0 0 (2- 2- 2-: -1 0 0) (2- 6+ 2-: -1 0 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 1 (4- 4- 4-: 0 1 0) (4- 13+ 4-: 0 0 0) [1 2 1] 0 0 (2- 2- 2-: -1 0 0) (2- 6+ 2-: -1 0 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 1 (13+ 4- 13+: 0 0 0) (13+ 13+ 13+: 0 -1 0) [1 2 1] 0 0 (6+ 2- 6+: 1 0 0) (6+ 6+ 6+: 1 0 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 1 (13+ 4- 13+: 0 1 0) (13+ 13+ 13+: 0 0 0) [1 2 1] 0 0 (6+ 2- 6+: 1 0 0) (6+ 6+ 6+: 1 0 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 1 (13+ 4- 4-: 0 0 0) (13+ 13+ 4-: 0 -1 0) [1 2 1] 0 0 (6+ 2- 2-: 1 0 0) (6+ 6+ 2-: 1 0 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 1 (13+ 4- 4-: 0 1 0) (13+ 13+ 4-: 0 0 0) [1 2 1] 0 0 (6+ 2- 2-: 1 0 0) (6+ 6+ 2-: 1 0 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 1 (4- 4- 13+: 0 0 0) (4- 13+ 13+: 0 -1 0) [1 2 1] 0 0 (2- 2- 6+: -1 0 0) (2- 6+ 6+: -1 0 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 1 (4- 4- 13+: 0 1 0) (4- 13+ 13+: 0 0 0) [1 2 1] 0 0 (2- 2- 6+: -1 0 0) (2- 6+ 6+: -1 0 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 1 (4- 4- 4-: 2 0 0) (13+ 4- 4-: -1 0 0) [2 1 1] 0 0 (2- 2- 2-: 1 -1 0) (6+ 2- 2-: 0 -1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 1 (4- 4- 4-: 0 0 2) (4- 4- 13+: 0 0 -1) [1 1 2] 0 0 (2- 2- 2-: 0 -1 1) (2- 2- 6+: 0 -1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 1 (4- 4- 13+: 2 0 0) (13+ 4- 13+: -1 0 0) [2 1 1] 0 0 (2- 2- 6+: 1 -1 0) (6+ 2- 6+: 0 -1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 1 (13+ 4- 4-: 0 0 2) (13+ 4- 13+: 0 0 -1) [1 1 2] 0 0 (6+ 2- 2-: 0 -1 1) (6+ 2- 6+: 0 -1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 1 (4- 4- 4-: 1 0 0) (13+ 4- 4-: -2 0 0) [2 1 1] 0 0 (2- 2- 2-: 0 -1 0) (6+ 2- 2-: -1 -1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 1 (4- 4- 4-: 0 0 1) (4- 4- 13+: 0 0 -2) [1 1 2] 0 0 (2- 2- 2-: 0 -1 0) (2- 2- 6+: 0 -1 -1) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 1 (4- 4- 13+: 1 0 0) (13+ 4- 13+: -2 0 0) [2 1 1] 0 0 (2- 2- 6+: 0 -1 0) (6+ 2- 6+: -1 -1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 1 (13+ 4- 4-: 0 0 1) (13+ 4- 13+: 0 0 -2) [1 1 2] 0 0 (6+ 2- 2-: 0 -1 0) (6+ 2- 6+: 0 -1 -1) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 1 (4- 13+ 4-: 2 0 0) (13+ 13+ 4-: -1 0 0) [2 1 1] 0 0 (2- 6+ 2-: 1 1 0) (6+ 6+ 2-: 0 1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 1 (4- 13+ 4-: 0 0 2) (4- 13+ 13+: 0 0 -1) [1 1 2] 0 0 (2- 6+ 2-: 0 1 1) (2- 6+ 6+: 0 1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 1 (4- 13+ 13+: 2 0 0) (13+ 13+ 13+: -1 0 0) [2 1 1] 0 0 (2- 6+ 6+: 1 1 0) (6+ 6+ 6+: 0 1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 1 (13+ 13+ 4-: 0 0 2) (13+ 13+ 13+: 0 0 -1) [1 1 2] 0 0 (6+ 6+ 2-: 0 1 1) (6+ 6+ 6+: 0 1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 1 (4- 13+ 4-: 1 0 0) (13+ 13+ 4-: -2 0 0) [2 1 1] 0 0 (2- 6+ 2-: 0 1 0) (6+ 6+ 2-: -1 1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 1 (4- 13+ 4-: 0 0 1) (4- 13+ 13+: 0 0 -2) [1 1 2] 0 0 (2- 6+ 2-: 0 1 0) (2- 6+ 6+: 0 1 -1) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 1 (4- 13+ 13+: 1 0 0) (13+ 13+ 13+: -2 0 0) [2 1 1] 0 0 (2- 6+ 6+: 0 1 0) (6+ 6+ 6+: -1 1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 1 (13+ 13+ 4-: 0 0 1) (13+ 13+ 13+: 0 0 -2) [1 1 2] 0 0 (6+ 6+ 2-: 0 1 0) (6+ 6+ 6+: 0 1 -1) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 1 (4- 4- 4-: 0 0 0) (4- 4- 4-: 0 0 0) [1 1 1] 0 0 (2- 2- 2-: 0 -1 0) (2- 2- 2-: 0 -1 0) [1 1 1] 0 [0 1 2] 9 -1.000000 GraphAddEntries: 1 (13+ 4- 4-: 0 0 0) (13+ 4- 4-: 0 0 0) [1 1 1] 0 0 (6+ 2- 2-: 0 -1 0) (6+ 2- 2-: 0 -1 0) [1 1 1] 0 [0 1 2] 9 -1.000000 GraphAddEntries: 1 (4- 4- 13+: 0 0 0) (4- 4- 13+: 0 0 0) [1 1 1] 0 0 (2- 2- 6+: 0 -1 0) (2- 2- 6+: 0 -1 0) [1 1 1] 0 [0 1 2] 9 -1.000000 GraphAddEntries: 1 (13+ 4- 13+: 0 0 0) (13+ 4- 13+: 0 0 0) [1 1 1] 0 0 (6+ 2- 6+: 0 -1 0) (6+ 2- 6+: 0 -1 0) [1 1 1] 0 [0 1 2] 9 -1.000000 GraphAddEntries: 1 (4- 13+ 4-: 0 0 0) (4- 13+ 4-: 0 0 0) [1 1 1] 0 0 (2- 6+ 2-: 0 1 0) (2- 6+ 2-: 0 1 0) [1 1 1] 0 [0 1 2] 9 -1.000000 GraphAddEntries: 1 (13+ 13+ 4-: 0 0 0) (13+ 13+ 4-: 0 0 0) [1 1 1] 0 0 (6+ 6+ 2-: 0 1 0) (6+ 6+ 2-: 0 1 0) [1 1 1] 0 [0 1 2] 9 -1.000000 GraphAddEntries: 1 (4- 13+ 13+: 0 0 0) (4- 13+ 13+: 0 0 0) [1 1 1] 0 0 (2- 6+ 6+: 0 1 0) (2- 6+ 6+: 0 1 0) [1 1 1] 0 [0 1 2] 9 -1.000000 GraphAddEntries: 1 (13+ 13+ 13+: 0 0 0) (13+ 13+ 13+: 0 0 0) [1 1 1] 0 0 (6+ 6+ 6+: 0 1 0) (6+ 6+ 6+: 0 1 0) [1 1 1] 0 [0 1 2] 9 -1.000000 GraphAddEntries: 2 (10- 10- 10-: 0 0 1) (10- 23+ 23+: 0 -1 -2) [1 2 2] 0 1 (5- 5- 5-: -1 0 0) (5- 11+ 11+: -1 0 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 2 (10- 10- 10-: 0 1 1) (10- 23+ 23+: 0 0 -2) [1 2 2] 0 1 (5- 5- 5-: -1 0 0) (5- 11+ 11+: -1 0 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 2 (10- 10- 10-: 0 0 2) (10- 23+ 23+: 0 -1 -1) [1 2 2] 0 1 (5- 5- 5-: -1 0 1) (5- 11+ 11+: -1 0 0) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 2 (10- 10- 10-: 0 1 2) (10- 23+ 23+: 0 0 -1) [1 2 2] 0 1 (5- 5- 5-: -1 0 1) (5- 11+ 11+: -1 0 0) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 2 (23+ 10- 10-: 0 0 2) (23+ 23+ 23+: 0 -1 -1) [1 2 2] 0 1 (11+ 5- 5-: 1 0 1) (11+ 11+ 11+: 1 0 0) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 2 (23+ 10- 10-: 0 1 2) (23+ 23+ 23+: 0 0 -1) [1 2 2] 0 1 (11+ 5- 5-: 1 0 1) (11+ 11+ 11+: 1 0 0) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 2 (23+ 10- 10-: 0 0 1) (23+ 23+ 23+: 0 -1 -2) [1 2 2] 0 1 (11+ 5- 5-: 1 0 0) (11+ 11+ 11+: 1 0 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 2 (23+ 10- 10-: 0 1 1) (23+ 23+ 23+: 0 0 -2) [1 2 2] 0 1 (11+ 5- 5-: 1 0 0) (11+ 11+ 11+: 1 0 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 2 (10- 10- 10-: 2 0 1) (23+ 10- 23+: -1 0 -2) [2 1 2] 0 1 (5- 5- 5-: 1 -1 0) (11+ 5- 11+: 0 -1 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 2 (10- 10- 10-: 2 0 2) (23+ 10- 23+: -1 0 -1) [2 1 2] 0 1 (5- 5- 5-: 1 -1 1) (11+ 5- 11+: 0 -1 0) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 2 (10- 10- 10-: 1 0 1) (23+ 10- 23+: -2 0 -2) [2 1 2] 0 1 (5- 5- 5-: 0 -1 0) (11+ 5- 11+: -1 -1 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 2 (10- 10- 10-: 1 0 2) (23+ 10- 23+: -2 0 -1) [2 1 2] 0 1 (5- 5- 5-: 0 -1 1) (11+ 5- 11+: -1 -1 0) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 2 (10- 23+ 10-: 2 0 2) (23+ 23+ 23+: -1 0 -1) [2 1 2] 0 1 (5- 11+ 5-: 1 1 1) (11+ 11+ 11+: 0 1 0) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 2 (10- 23+ 10-: 2 0 1) (23+ 23+ 23+: -1 0 -2) [2 1 2] 0 1 (5- 11+ 5-: 1 1 0) (11+ 11+ 11+: 0 1 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 2 (10- 23+ 10-: 1 0 2) (23+ 23+ 23+: -2 0 -1) [2 1 2] 0 1 (5- 11+ 5-: 0 1 1) (11+ 11+ 11+: -1 1 0) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 2 (10- 23+ 10-: 1 0 1) (23+ 23+ 23+: -2 0 -2) [2 1 2] 0 1 (5- 11+ 5-: 0 1 0) (11+ 11+ 11+: -1 1 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 2 (10- 10- 10-: 0 0 0) (23+ 23+ 10-: -1 -1 0) [2 2 1] 0 1 (5- 5- 5-: 0 0 -1) (11+ 11+ 5-: 0 0 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 2 (10- 10- 10-: 0 1 0) (23+ 23+ 10-: -1 0 0) [2 2 1] 0 1 (5- 5- 5-: 0 0 -1) (11+ 11+ 5-: 0 0 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 2 (10- 10- 10-: 1 0 0) (23+ 23+ 10-: 0 -1 0) [2 2 1] 0 1 (5- 5- 5-: 0 0 -1) (11+ 11+ 5-: 0 0 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 2 (10- 10- 10-: 1 1 0) (23+ 23+ 10-: 0 0 0) [2 2 1] 0 1 (5- 5- 5-: 0 0 -1) (11+ 11+ 5-: 0 0 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 2 (10- 10- 23+: 1 0 0) (23+ 23+ 23+: 0 -1 0) [2 2 1] 0 1 (5- 5- 11+: 0 0 1) (11+ 11+ 11+: 0 0 1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 2 (10- 10- 23+: 1 1 0) (23+ 23+ 23+: 0 0 0) [2 2 1] 0 1 (5- 5- 11+: 0 0 1) (11+ 11+ 11+: 0 0 1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 2 (10- 10- 23+: 0 0 0) (23+ 23+ 23+: -1 -1 0) [2 2 1] 0 1 (5- 5- 11+: 0 0 1) (11+ 11+ 11+: 0 0 1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 2 (10- 10- 23+: 0 1 0) (23+ 23+ 23+: -1 0 0) [2 2 1] 0 1 (5- 5- 11+: 0 0 1) (11+ 11+ 11+: 0 0 1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 2 (11- 11- 11-: -1 0 0) (11- 21+ 21+: -1 0 0) [1 1 1] 0 3 (22- 22- 22-: 0 0 1) (22- 43+ 43+: 0 -1 0) [1 2 2] 0 [0 1 2] 7 -0.250000 GraphAddEntries: 2 (11- 11- 11-: -1 0 0) (11- 21+ 21+: -1 0 0) [1 1 1] 0 3 (22- 22- 22-: 0 1 1) (22- 43+ 43+: 0 0 0) [1 2 2] 0 [0 1 2] 8 -0.250000 GraphAddEntries: 2 (11- 11- 11-: -1 0 0) (11- 21+ 21+: -1 0 0) [1 1 1] 0 3 (22- 22- 22-: 0 0 0) (22- 43+ 43+: 0 -1 -1) [1 2 2] 0 [0 1 2] 9 -0.250000 GraphAddEntries: 2 (11- 11- 11-: -1 0 0) (11- 21+ 21+: -1 0 0) [1 1 1] 0 3 (22- 22- 22-: 0 1 0) (22- 43+ 43+: 0 0 -1) [1 2 2] 0 [0 1 2] 10 -0.250000 GraphAddEntries: 2 (21+ 11- 11-: 1 0 0) (21+ 21+ 21+: 1 0 0) [1 1 1] 0 3 (43+ 22- 22-: 0 0 0) (43+ 43+ 43+: 0 -1 -1) [1 2 2] 0 [0 1 2] 7 -0.250000 GraphAddEntries: 2 (21+ 11- 11-: 1 0 0) (21+ 21+ 21+: 1 0 0) [1 1 1] 0 3 (43+ 22- 22-: 0 1 0) (43+ 43+ 43+: 0 0 -1) [1 2 2] 0 [0 1 2] 8 -0.250000 GraphAddEntries: 2 (21+ 11- 11-: 1 0 0) (21+ 21+ 21+: 1 0 0) [1 1 1] 0 3 (43+ 22- 22-: 0 0 1) (43+ 43+ 43+: 0 -1 0) [1 2 2] 0 [0 1 2] 9 -0.250000 GraphAddEntries: 2 (21+ 11- 11-: 1 0 0) (21+ 21+ 21+: 1 0 0) [1 1 1] 0 3 (43+ 22- 22-: 0 1 1) (43+ 43+ 43+: 0 0 0) [1 2 2] 0 [0 1 2] 10 -0.250000 GraphAddEntries: 2 (11- 11- 11-: 0 -1 0) (21+ 11- 21+: 0 -1 0) [1 1 1] 0 3 (22- 22- 22-: 0 0 1) (43+ 22- 43+: -1 0 0) [2 1 2] 0 [0 1 2] 7 -0.250000 GraphAddEntries: 2 (11- 11- 11-: 0 -1 0) (21+ 11- 21+: 0 -1 0) [1 1 1] 0 3 (22- 22- 22-: 0 0 0) (43+ 22- 43+: -1 0 -1) [2 1 2] 0 [0 1 2] 8 -0.250000 GraphAddEntries: 2 (11- 11- 11-: 0 -1 0) (21+ 11- 21+: 0 -1 0) [1 1 1] 0 3 (22- 22- 22-: 1 0 1) (43+ 22- 43+: 0 0 0) [2 1 2] 0 [0 1 2] 9 -0.250000 GraphAddEntries: 2 (11- 11- 11-: 0 -1 0) (21+ 11- 21+: 0 -1 0) [1 1 1] 0 3 (22- 22- 22-: 1 0 0) (43+ 22- 43+: 0 0 -1) [2 1 2] 0 [0 1 2] 10 -0.250000 GraphAddEntries: 2 (11- 21+ 11-: 0 1 0) (21+ 21+ 21+: 0 1 0) [1 1 1] 0 3 (22- 43+ 22-: 0 0 0) (43+ 43+ 43+: -1 0 -1) [2 1 2] 0 [0 1 2] 7 -0.250000 GraphAddEntries: 2 (11- 21+ 11-: 0 1 0) (21+ 21+ 21+: 0 1 0) [1 1 1] 0 3 (22- 43+ 22-: 0 0 1) (43+ 43+ 43+: -1 0 0) [2 1 2] 0 [0 1 2] 8 -0.250000 GraphAddEntries: 2 (11- 21+ 11-: 0 1 0) (21+ 21+ 21+: 0 1 0) [1 1 1] 0 3 (22- 43+ 22-: 1 0 0) (43+ 43+ 43+: 0 0 -1) [2 1 2] 0 [0 1 2] 9 -0.250000 GraphAddEntries: 2 (11- 21+ 11-: 0 1 0) (21+ 21+ 21+: 0 1 0) [1 1 1] 0 3 (22- 43+ 22-: 1 0 1) (43+ 43+ 43+: 0 0 0) [2 1 2] 0 [0 1 2] 10 -0.250000 GraphAddEntries: 2 (11- 11- 11-: 0 0 -1) (21+ 21+ 11-: 0 0 -1) [1 1 1] 0 3 (22- 22- 22-: 0 0 0) (43+ 43+ 22-: -1 -1 0) [2 2 1] 0 [0 1 2] 7 -0.250000 GraphAddEntries: 2 (11- 11- 11-: 0 0 -1) (21+ 21+ 11-: 0 0 -1) [1 1 1] 0 3 (22- 22- 22-: 0 1 0) (43+ 43+ 22-: -1 0 0) [2 2 1] 0 [0 1 2] 8 -0.250000 GraphAddEntries: 2 (11- 11- 11-: 0 0 -1) (21+ 21+ 11-: 0 0 -1) [1 1 1] 0 3 (22- 22- 22-: 1 0 0) (43+ 43+ 22-: 0 -1 0) [2 2 1] 0 [0 1 2] 9 -0.250000 GraphAddEntries: 2 (11- 11- 11-: 0 0 -1) (21+ 21+ 11-: 0 0 -1) [1 1 1] 0 3 (22- 22- 22-: 1 1 0) (43+ 43+ 22-: 0 0 0) [2 2 1] 0 [0 1 2] 10 -0.250000 GraphAddEntries: 2 (11- 11- 21+: 0 0 1) (21+ 21+ 21+: 0 0 1) [1 1 1] 0 3 (22- 22- 43+: 1 0 0) (43+ 43+ 43+: 0 -1 0) [2 2 1] 0 [0 1 2] 7 -0.250000 GraphAddEntries: 2 (11- 11- 21+: 0 0 1) (21+ 21+ 21+: 0 0 1) [1 1 1] 0 3 (22- 22- 43+: 1 1 0) (43+ 43+ 43+: 0 0 0) [2 2 1] 0 [0 1 2] 8 -0.250000 GraphAddEntries: 2 (11- 11- 21+: 0 0 1) (21+ 21+ 21+: 0 0 1) [1 1 1] 0 3 (22- 22- 43+: 0 0 0) (43+ 43+ 43+: -1 -1 0) [2 2 1] 0 [0 1 2] 9 -0.250000 GraphAddEntries: 2 (11- 11- 21+: 0 0 1) (21+ 21+ 21+: 0 0 1) [1 1 1] 0 3 (22- 22- 43+: 0 1 0) (43+ 43+ 43+: -1 0 0) [2 2 1] 0 [0 1 2] 10 -0.250000 GraphAddEntries: 2 (10- 10- 10-: 0 0 0) (10- 23+ 10-: 0 -1 0) [1 2 1] 0 1 (5- 5- 5-: -1 0 0) (5- 11+ 5-: -1 0 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 2 (10- 10- 10-: 0 1 0) (10- 23+ 10-: 0 0 0) [1 2 1] 0 1 (5- 5- 5-: -1 0 0) (5- 11+ 5-: -1 0 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 2 (23+ 10- 23+: 0 0 0) (23+ 23+ 23+: 0 -1 0) [1 2 1] 0 1 (11+ 5- 11+: 1 0 0) (11+ 11+ 11+: 1 0 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 2 (23+ 10- 23+: 0 1 0) (23+ 23+ 23+: 0 0 0) [1 2 1] 0 1 (11+ 5- 11+: 1 0 0) (11+ 11+ 11+: 1 0 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 2 (23+ 10- 10-: 0 0 0) (23+ 23+ 10-: 0 -1 0) [1 2 1] 0 1 (11+ 5- 5-: 1 0 0) (11+ 11+ 5-: 1 0 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 2 (23+ 10- 10-: 0 1 0) (23+ 23+ 10-: 0 0 0) [1 2 1] 0 1 (11+ 5- 5-: 1 0 0) (11+ 11+ 5-: 1 0 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 2 (10- 10- 23+: 0 0 0) (10- 23+ 23+: 0 -1 0) [1 2 1] 0 1 (5- 5- 11+: -1 0 0) (5- 11+ 11+: -1 0 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 2 (10- 10- 23+: 0 1 0) (10- 23+ 23+: 0 0 0) [1 2 1] 0 1 (5- 5- 11+: -1 0 0) (5- 11+ 11+: -1 0 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 2 (10- 10- 10-: 2 0 0) (23+ 10- 10-: -1 0 0) [2 1 1] 0 1 (5- 5- 5-: 1 -1 0) (11+ 5- 5-: 0 -1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 2 (10- 10- 10-: 0 0 2) (10- 10- 23+: 0 0 -1) [1 1 2] 0 1 (5- 5- 5-: 0 -1 1) (5- 5- 11+: 0 -1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 2 (10- 10- 23+: 2 0 0) (23+ 10- 23+: -1 0 0) [2 1 1] 0 1 (5- 5- 11+: 1 -1 0) (11+ 5- 11+: 0 -1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 2 (23+ 10- 10-: 0 0 2) (23+ 10- 23+: 0 0 -1) [1 1 2] 0 1 (11+ 5- 5-: 0 -1 1) (11+ 5- 11+: 0 -1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 2 (10- 10- 10-: 1 0 0) (23+ 10- 10-: -2 0 0) [2 1 1] 0 1 (5- 5- 5-: 0 -1 0) (11+ 5- 5-: -1 -1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 2 (10- 10- 10-: 0 0 1) (10- 10- 23+: 0 0 -2) [1 1 2] 0 1 (5- 5- 5-: 0 -1 0) (5- 5- 11+: 0 -1 -1) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 2 (10- 10- 23+: 1 0 0) (23+ 10- 23+: -2 0 0) [2 1 1] 0 1 (5- 5- 11+: 0 -1 0) (11+ 5- 11+: -1 -1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 2 (23+ 10- 10-: 0 0 1) (23+ 10- 23+: 0 0 -2) [1 1 2] 0 1 (11+ 5- 5-: 0 -1 0) (11+ 5- 11+: 0 -1 -1) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 2 (10- 23+ 10-: 2 0 0) (23+ 23+ 10-: -1 0 0) [2 1 1] 0 1 (5- 11+ 5-: 1 1 0) (11+ 11+ 5-: 0 1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 2 (10- 23+ 10-: 0 0 2) (10- 23+ 23+: 0 0 -1) [1 1 2] 0 1 (5- 11+ 5-: 0 1 1) (5- 11+ 11+: 0 1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 2 (10- 23+ 23+: 2 0 0) (23+ 23+ 23+: -1 0 0) [2 1 1] 0 1 (5- 11+ 11+: 1 1 0) (11+ 11+ 11+: 0 1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 2 (23+ 23+ 10-: 0 0 2) (23+ 23+ 23+: 0 0 -1) [1 1 2] 0 1 (11+ 11+ 5-: 0 1 1) (11+ 11+ 11+: 0 1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 2 (10- 23+ 10-: 1 0 0) (23+ 23+ 10-: -2 0 0) [2 1 1] 0 1 (5- 11+ 5-: 0 1 0) (11+ 11+ 5-: -1 1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 2 (10- 23+ 10-: 0 0 1) (10- 23+ 23+: 0 0 -2) [1 1 2] 0 1 (5- 11+ 5-: 0 1 0) (5- 11+ 11+: 0 1 -1) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 2 (10- 23+ 23+: 1 0 0) (23+ 23+ 23+: -2 0 0) [2 1 1] 0 1 (5- 11+ 11+: 0 1 0) (11+ 11+ 11+: -1 1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 2 (23+ 23+ 10-: 0 0 1) (23+ 23+ 23+: 0 0 -2) [1 1 2] 0 1 (11+ 11+ 5-: 0 1 0) (11+ 11+ 11+: 0 1 -1) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 2 (10- 10- 10-: 0 0 0) (10- 10- 10-: 0 0 0) [1 1 1] 0 1 (5- 5- 5-: 0 -1 0) (5- 5- 5-: 0 -1 0) [1 1 1] 0 [0 1 2] 9 -1.000000 GraphAddEntries: 2 (23+ 10- 10-: 0 0 0) (23+ 10- 10-: 0 0 0) [1 1 1] 0 1 (11+ 5- 5-: 0 -1 0) (11+ 5- 5-: 0 -1 0) [1 1 1] 0 [0 1 2] 9 -1.000000 GraphAddEntries: 2 (10- 10- 23+: 0 0 0) (10- 10- 23+: 0 0 0) [1 1 1] 0 1 (5- 5- 11+: 0 -1 0) (5- 5- 11+: 0 -1 0) [1 1 1] 0 [0 1 2] 9 -1.000000 GraphAddEntries: 2 (23+ 10- 23+: 0 0 0) (23+ 10- 23+: 0 0 0) [1 1 1] 0 1 (11+ 5- 11+: 0 -1 0) (11+ 5- 11+: 0 -1 0) [1 1 1] 0 [0 1 2] 9 -1.000000 GraphAddEntries: 2 (10- 23+ 10-: 0 0 0) (10- 23+ 10-: 0 0 0) [1 1 1] 0 1 (5- 11+ 5-: 0 1 0) (5- 11+ 5-: 0 1 0) [1 1 1] 0 [0 1 2] 9 -1.000000 GraphAddEntries: 2 (23+ 23+ 10-: 0 0 0) (23+ 23+ 10-: 0 0 0) [1 1 1] 0 1 (11+ 11+ 5-: 0 1 0) (11+ 11+ 5-: 0 1 0) [1 1 1] 0 [0 1 2] 9 -1.000000 GraphAddEntries: 2 (10- 23+ 23+: 0 0 0) (10- 23+ 23+: 0 0 0) [1 1 1] 0 1 (5- 11+ 11+: 0 1 0) (5- 11+ 11+: 0 1 0) [1 1 1] 0 [0 1 2] 9 -1.000000 GraphAddEntries: 2 (23+ 23+ 23+: 0 0 0) (23+ 23+ 23+: 0 0 0) [1 1 1] 0 1 (11+ 11+ 11+: 0 1 0) (11+ 11+ 11+: 0 1 0) [1 1 1] 0 [0 1 2] 9 -1.000000 GraphAddEntries: 3 (22- 22- 22-: 0 0 1) (22- 43+ 43+: 0 -1 -2) [1 2 2] 0 2 (11- 11- 11-: -1 0 0) (11- 21+ 21+: -1 0 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 3 (22- 22- 22-: 0 1 1) (22- 43+ 43+: 0 0 -2) [1 2 2] 0 2 (11- 11- 11-: -1 0 0) (11- 21+ 21+: -1 0 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 3 (22- 22- 22-: 0 0 2) (22- 43+ 43+: 0 -1 -1) [1 2 2] 0 2 (11- 11- 11-: -1 0 1) (11- 21+ 21+: -1 0 0) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 3 (22- 22- 22-: 0 1 2) (22- 43+ 43+: 0 0 -1) [1 2 2] 0 2 (11- 11- 11-: -1 0 1) (11- 21+ 21+: -1 0 0) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 3 (43+ 22- 22-: 0 0 2) (43+ 43+ 43+: 0 -1 -1) [1 2 2] 0 2 (21+ 11- 11-: 1 0 1) (21+ 21+ 21+: 1 0 0) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 3 (43+ 22- 22-: 0 1 2) (43+ 43+ 43+: 0 0 -1) [1 2 2] 0 2 (21+ 11- 11-: 1 0 1) (21+ 21+ 21+: 1 0 0) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 3 (43+ 22- 22-: 0 0 1) (43+ 43+ 43+: 0 -1 -2) [1 2 2] 0 2 (21+ 11- 11-: 1 0 0) (21+ 21+ 21+: 1 0 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 3 (43+ 22- 22-: 0 1 1) (43+ 43+ 43+: 0 0 -2) [1 2 2] 0 2 (21+ 11- 11-: 1 0 0) (21+ 21+ 21+: 1 0 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 3 (22- 22- 22-: 2 0 1) (43+ 22- 43+: -1 0 -2) [2 1 2] 0 2 (11- 11- 11-: 1 -1 0) (21+ 11- 21+: 0 -1 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 3 (22- 22- 22-: 2 0 2) (43+ 22- 43+: -1 0 -1) [2 1 2] 0 2 (11- 11- 11-: 1 -1 1) (21+ 11- 21+: 0 -1 0) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 3 (22- 22- 22-: 1 0 1) (43+ 22- 43+: -2 0 -2) [2 1 2] 0 2 (11- 11- 11-: 0 -1 0) (21+ 11- 21+: -1 -1 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 3 (22- 22- 22-: 1 0 2) (43+ 22- 43+: -2 0 -1) [2 1 2] 0 2 (11- 11- 11-: 0 -1 1) (21+ 11- 21+: -1 -1 0) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 3 (22- 43+ 22-: 2 0 2) (43+ 43+ 43+: -1 0 -1) [2 1 2] 0 2 (11- 21+ 11-: 1 1 1) (21+ 21+ 21+: 0 1 0) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 3 (22- 43+ 22-: 2 0 1) (43+ 43+ 43+: -1 0 -2) [2 1 2] 0 2 (11- 21+ 11-: 1 1 0) (21+ 21+ 21+: 0 1 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 3 (22- 43+ 22-: 1 0 2) (43+ 43+ 43+: -2 0 -1) [2 1 2] 0 2 (11- 21+ 11-: 0 1 1) (21+ 21+ 21+: -1 1 0) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 3 (22- 43+ 22-: 1 0 1) (43+ 43+ 43+: -2 0 -2) [2 1 2] 0 2 (11- 21+ 11-: 0 1 0) (21+ 21+ 21+: -1 1 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 3 (22- 22- 22-: 0 0 0) (43+ 43+ 22-: -1 -1 0) [2 2 1] 0 2 (11- 11- 11-: 0 0 -1) (21+ 21+ 11-: 0 0 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 3 (22- 22- 22-: 0 1 0) (43+ 43+ 22-: -1 0 0) [2 2 1] 0 2 (11- 11- 11-: 0 0 -1) (21+ 21+ 11-: 0 0 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 3 (22- 22- 22-: 1 0 0) (43+ 43+ 22-: 0 -1 0) [2 2 1] 0 2 (11- 11- 11-: 0 0 -1) (21+ 21+ 11-: 0 0 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 3 (22- 22- 22-: 1 1 0) (43+ 43+ 22-: 0 0 0) [2 2 1] 0 2 (11- 11- 11-: 0 0 -1) (21+ 21+ 11-: 0 0 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 3 (22- 22- 43+: 1 0 0) (43+ 43+ 43+: 0 -1 0) [2 2 1] 0 2 (11- 11- 21+: 0 0 1) (21+ 21+ 21+: 0 0 1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 3 (22- 22- 43+: 1 1 0) (43+ 43+ 43+: 0 0 0) [2 2 1] 0 2 (11- 11- 21+: 0 0 1) (21+ 21+ 21+: 0 0 1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 3 (22- 22- 43+: 0 0 0) (43+ 43+ 43+: -1 -1 0) [2 2 1] 0 2 (11- 11- 21+: 0 0 1) (21+ 21+ 21+: 0 0 1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 3 (22- 22- 43+: 0 1 0) (43+ 43+ 43+: -1 0 0) [2 2 1] 0 2 (11- 11- 21+: 0 0 1) (21+ 21+ 21+: 0 0 1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 3 (23- 23- 23-: -1 0 0) (23- 40+ 40+: -1 0 0) [1 1 1] 0 4 (46- 46- 46-: 0 0 1) (46- 81+ 81+: 0 -1 0) [1 2 2] 0 [0 1 2] 7 -0.250000 GraphAddEntries: 3 (23- 23- 23-: -1 0 0) (23- 40+ 40+: -1 0 0) [1 1 1] 0 4 (46- 46- 46-: 0 1 1) (46- 81+ 81+: 0 0 0) [1 2 2] 0 [0 1 2] 8 -0.250000 GraphAddEntries: 3 (23- 23- 23-: -1 0 0) (23- 40+ 40+: -1 0 0) [1 1 1] 0 4 (46- 46- 46-: 0 0 0) (46- 81+ 81+: 0 -1 -1) [1 2 2] 0 [0 1 2] 9 -0.250000 GraphAddEntries: 3 (23- 23- 23-: -1 0 0) (23- 40+ 40+: -1 0 0) [1 1 1] 0 4 (46- 46- 46-: 0 1 0) (46- 81+ 81+: 0 0 -1) [1 2 2] 0 [0 1 2] 10 -0.250000 GraphAddEntries: 3 (40+ 23- 23-: 1 0 0) (40+ 40+ 40+: 1 0 0) [1 1 1] 0 4 (81+ 46- 46-: 0 0 0) (81+ 81+ 81+: 0 -1 -1) [1 2 2] 0 [0 1 2] 7 -0.250000 GraphAddEntries: 3 (40+ 23- 23-: 1 0 0) (40+ 40+ 40+: 1 0 0) [1 1 1] 0 4 (81+ 46- 46-: 0 1 0) (81+ 81+ 81+: 0 0 -1) [1 2 2] 0 [0 1 2] 8 -0.250000 GraphAddEntries: 3 (40+ 23- 23-: 1 0 0) (40+ 40+ 40+: 1 0 0) [1 1 1] 0 4 (81+ 46- 46-: 0 0 1) (81+ 81+ 81+: 0 -1 0) [1 2 2] 0 [0 1 2] 9 -0.250000 GraphAddEntries: 3 (40+ 23- 23-: 1 0 0) (40+ 40+ 40+: 1 0 0) [1 1 1] 0 4 (81+ 46- 46-: 0 1 1) (81+ 81+ 81+: 0 0 0) [1 2 2] 0 [0 1 2] 10 -0.250000 GraphAddEntries: 3 (23- 23- 23-: 0 -1 0) (40+ 23- 40+: 0 -1 0) [1 1 1] 0 4 (46- 46- 46-: 0 0 1) (81+ 46- 81+: -1 0 0) [2 1 2] 0 [0 1 2] 7 -0.250000 GraphAddEntries: 3 (23- 23- 23-: 0 -1 0) (40+ 23- 40+: 0 -1 0) [1 1 1] 0 4 (46- 46- 46-: 0 0 0) (81+ 46- 81+: -1 0 -1) [2 1 2] 0 [0 1 2] 8 -0.250000 GraphAddEntries: 3 (23- 23- 23-: 0 -1 0) (40+ 23- 40+: 0 -1 0) [1 1 1] 0 4 (46- 46- 46-: 1 0 1) (81+ 46- 81+: 0 0 0) [2 1 2] 0 [0 1 2] 9 -0.250000 GraphAddEntries: 3 (23- 23- 23-: 0 -1 0) (40+ 23- 40+: 0 -1 0) [1 1 1] 0 4 (46- 46- 46-: 1 0 0) (81+ 46- 81+: 0 0 -1) [2 1 2] 0 [0 1 2] 10 -0.250000 GraphAddEntries: 3 (23- 40+ 23-: 0 1 0) (40+ 40+ 40+: 0 1 0) [1 1 1] 0 4 (46- 81+ 46-: 0 0 0) (81+ 81+ 81+: -1 0 -1) [2 1 2] 0 [0 1 2] 7 -0.250000 GraphAddEntries: 3 (23- 40+ 23-: 0 1 0) (40+ 40+ 40+: 0 1 0) [1 1 1] 0 4 (46- 81+ 46-: 0 0 1) (81+ 81+ 81+: -1 0 0) [2 1 2] 0 [0 1 2] 8 -0.250000 GraphAddEntries: 3 (23- 40+ 23-: 0 1 0) (40+ 40+ 40+: 0 1 0) [1 1 1] 0 4 (46- 81+ 46-: 1 0 0) (81+ 81+ 81+: 0 0 -1) [2 1 2] 0 [0 1 2] 9 -0.250000 GraphAddEntries: 3 (23- 40+ 23-: 0 1 0) (40+ 40+ 40+: 0 1 0) [1 1 1] 0 4 (46- 81+ 46-: 1 0 1) (81+ 81+ 81+: 0 0 0) [2 1 2] 0 [0 1 2] 10 -0.250000 GraphAddEntries: 3 (23- 23- 23-: 0 0 -1) (40+ 40+ 23-: 0 0 -1) [1 1 1] 0 4 (46- 46- 46-: 0 0 0) (81+ 81+ 46-: -1 -1 0) [2 2 1] 0 [0 1 2] 7 -0.250000 GraphAddEntries: 3 (23- 23- 23-: 0 0 -1) (40+ 40+ 23-: 0 0 -1) [1 1 1] 0 4 (46- 46- 46-: 0 1 0) (81+ 81+ 46-: -1 0 0) [2 2 1] 0 [0 1 2] 8 -0.250000 GraphAddEntries: 3 (23- 23- 23-: 0 0 -1) (40+ 40+ 23-: 0 0 -1) [1 1 1] 0 4 (46- 46- 46-: 1 0 0) (81+ 81+ 46-: 0 -1 0) [2 2 1] 0 [0 1 2] 9 -0.250000 GraphAddEntries: 3 (23- 23- 23-: 0 0 -1) (40+ 40+ 23-: 0 0 -1) [1 1 1] 0 4 (46- 46- 46-: 1 1 0) (81+ 81+ 46-: 0 0 0) [2 2 1] 0 [0 1 2] 10 -0.250000 GraphAddEntries: 3 (23- 23- 40+: 0 0 1) (40+ 40+ 40+: 0 0 1) [1 1 1] 0 4 (46- 46- 81+: 1 0 0) (81+ 81+ 81+: 0 -1 0) [2 2 1] 0 [0 1 2] 7 -0.250000 GraphAddEntries: 3 (23- 23- 40+: 0 0 1) (40+ 40+ 40+: 0 0 1) [1 1 1] 0 4 (46- 46- 81+: 1 1 0) (81+ 81+ 81+: 0 0 0) [2 2 1] 0 [0 1 2] 8 -0.250000 GraphAddEntries: 3 (23- 23- 40+: 0 0 1) (40+ 40+ 40+: 0 0 1) [1 1 1] 0 4 (46- 46- 81+: 0 0 0) (81+ 81+ 81+: -1 -1 0) [2 2 1] 0 [0 1 2] 9 -0.250000 GraphAddEntries: 3 (23- 23- 40+: 0 0 1) (40+ 40+ 40+: 0 0 1) [1 1 1] 0 4 (46- 46- 81+: 0 1 0) (81+ 81+ 81+: -1 0 0) [2 2 1] 0 [0 1 2] 10 -0.250000 GraphAddEntries: 3 (22- 22- 22-: 0 0 0) (22- 43+ 22-: 0 -1 0) [1 2 1] 0 2 (11- 11- 11-: -1 0 0) (11- 21+ 11-: -1 0 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 3 (22- 22- 22-: 0 1 0) (22- 43+ 22-: 0 0 0) [1 2 1] 0 2 (11- 11- 11-: -1 0 0) (11- 21+ 11-: -1 0 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 3 (43+ 22- 43+: 0 0 0) (43+ 43+ 43+: 0 -1 0) [1 2 1] 0 2 (21+ 11- 21+: 1 0 0) (21+ 21+ 21+: 1 0 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 3 (43+ 22- 43+: 0 1 0) (43+ 43+ 43+: 0 0 0) [1 2 1] 0 2 (21+ 11- 21+: 1 0 0) (21+ 21+ 21+: 1 0 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 3 (43+ 22- 22-: 0 0 0) (43+ 43+ 22-: 0 -1 0) [1 2 1] 0 2 (21+ 11- 11-: 1 0 0) (21+ 21+ 11-: 1 0 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 3 (43+ 22- 22-: 0 1 0) (43+ 43+ 22-: 0 0 0) [1 2 1] 0 2 (21+ 11- 11-: 1 0 0) (21+ 21+ 11-: 1 0 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 3 (22- 22- 43+: 0 0 0) (22- 43+ 43+: 0 -1 0) [1 2 1] 0 2 (11- 11- 21+: -1 0 0) (11- 21+ 21+: -1 0 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 3 (22- 22- 43+: 0 1 0) (22- 43+ 43+: 0 0 0) [1 2 1] 0 2 (11- 11- 21+: -1 0 0) (11- 21+ 21+: -1 0 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 3 (22- 22- 22-: 2 0 0) (43+ 22- 22-: -1 0 0) [2 1 1] 0 2 (11- 11- 11-: 1 -1 0) (21+ 11- 11-: 0 -1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 3 (22- 22- 22-: 0 0 2) (22- 22- 43+: 0 0 -1) [1 1 2] 0 2 (11- 11- 11-: 0 -1 1) (11- 11- 21+: 0 -1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 3 (22- 22- 43+: 2 0 0) (43+ 22- 43+: -1 0 0) [2 1 1] 0 2 (11- 11- 21+: 1 -1 0) (21+ 11- 21+: 0 -1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 3 (43+ 22- 22-: 0 0 2) (43+ 22- 43+: 0 0 -1) [1 1 2] 0 2 (21+ 11- 11-: 0 -1 1) (21+ 11- 21+: 0 -1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 3 (22- 22- 22-: 1 0 0) (43+ 22- 22-: -2 0 0) [2 1 1] 0 2 (11- 11- 11-: 0 -1 0) (21+ 11- 11-: -1 -1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 3 (22- 22- 22-: 0 0 1) (22- 22- 43+: 0 0 -2) [1 1 2] 0 2 (11- 11- 11-: 0 -1 0) (11- 11- 21+: 0 -1 -1) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 3 (22- 22- 43+: 1 0 0) (43+ 22- 43+: -2 0 0) [2 1 1] 0 2 (11- 11- 21+: 0 -1 0) (21+ 11- 21+: -1 -1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 3 (43+ 22- 22-: 0 0 1) (43+ 22- 43+: 0 0 -2) [1 1 2] 0 2 (21+ 11- 11-: 0 -1 0) (21+ 11- 21+: 0 -1 -1) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 3 (22- 43+ 22-: 2 0 0) (43+ 43+ 22-: -1 0 0) [2 1 1] 0 2 (11- 21+ 11-: 1 1 0) (21+ 21+ 11-: 0 1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 3 (22- 43+ 22-: 0 0 2) (22- 43+ 43+: 0 0 -1) [1 1 2] 0 2 (11- 21+ 11-: 0 1 1) (11- 21+ 21+: 0 1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 3 (22- 43+ 43+: 2 0 0) (43+ 43+ 43+: -1 0 0) [2 1 1] 0 2 (11- 21+ 21+: 1 1 0) (21+ 21+ 21+: 0 1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 3 (43+ 43+ 22-: 0 0 2) (43+ 43+ 43+: 0 0 -1) [1 1 2] 0 2 (21+ 21+ 11-: 0 1 1) (21+ 21+ 21+: 0 1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 3 (22- 43+ 22-: 1 0 0) (43+ 43+ 22-: -2 0 0) [2 1 1] 0 2 (11- 21+ 11-: 0 1 0) (21+ 21+ 11-: -1 1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 3 (22- 43+ 22-: 0 0 1) (22- 43+ 43+: 0 0 -2) [1 1 2] 0 2 (11- 21+ 11-: 0 1 0) (11- 21+ 21+: 0 1 -1) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 3 (22- 43+ 43+: 1 0 0) (43+ 43+ 43+: -2 0 0) [2 1 1] 0 2 (11- 21+ 21+: 0 1 0) (21+ 21+ 21+: -1 1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 3 (43+ 43+ 22-: 0 0 1) (43+ 43+ 43+: 0 0 -2) [1 1 2] 0 2 (21+ 21+ 11-: 0 1 0) (21+ 21+ 21+: 0 1 -1) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 3 (22- 22- 22-: 0 0 0) (22- 22- 22-: 0 0 0) [1 1 1] 0 2 (11- 11- 11-: 0 -1 0) (11- 11- 11-: 0 -1 0) [1 1 1] 0 [0 1 2] 9 -1.000000 GraphAddEntries: 3 (43+ 22- 22-: 0 0 0) (43+ 22- 22-: 0 0 0) [1 1 1] 0 2 (21+ 11- 11-: 0 -1 0) (21+ 11- 11-: 0 -1 0) [1 1 1] 0 [0 1 2] 9 -1.000000 GraphAddEntries: 3 (22- 22- 43+: 0 0 0) (22- 22- 43+: 0 0 0) [1 1 1] 0 2 (11- 11- 21+: 0 -1 0) (11- 11- 21+: 0 -1 0) [1 1 1] 0 [0 1 2] 9 -1.000000 GraphAddEntries: 3 (43+ 22- 43+: 0 0 0) (43+ 22- 43+: 0 0 0) [1 1 1] 0 2 (21+ 11- 21+: 0 -1 0) (21+ 11- 21+: 0 -1 0) [1 1 1] 0 [0 1 2] 9 -1.000000 GraphAddEntries: 3 (22- 43+ 22-: 0 0 0) (22- 43+ 22-: 0 0 0) [1 1 1] 0 2 (11- 21+ 11-: 0 1 0) (11- 21+ 11-: 0 1 0) [1 1 1] 0 [0 1 2] 9 -1.000000 GraphAddEntries: 3 (43+ 43+ 22-: 0 0 0) (43+ 43+ 22-: 0 0 0) [1 1 1] 0 2 (21+ 21+ 11-: 0 1 0) (21+ 21+ 11-: 0 1 0) [1 1 1] 0 [0 1 2] 9 -1.000000 GraphAddEntries: 3 (22- 43+ 43+: 0 0 0) (22- 43+ 43+: 0 0 0) [1 1 1] 0 2 (11- 21+ 21+: 0 1 0) (11- 21+ 21+: 0 1 0) [1 1 1] 0 [0 1 2] 9 -1.000000 GraphAddEntries: 3 (43+ 43+ 43+: 0 0 0) (43+ 43+ 43+: 0 0 0) [1 1 1] 0 2 (21+ 21+ 21+: 0 1 0) (21+ 21+ 21+: 0 1 0) [1 1 1] 0 [0 1 2] 9 -1.000000 GraphAddEntries: 4 (46- 46- 46-: 0 0 1) (46- 81+ 81+: 0 -1 -2) [1 2 2] 0 3 (23- 23- 23-: -1 0 0) (23- 40+ 40+: -1 0 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 4 (46- 46- 46-: 0 1 1) (46- 81+ 81+: 0 0 -2) [1 2 2] 0 3 (23- 23- 23-: -1 0 0) (23- 40+ 40+: -1 0 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 4 (46- 46- 46-: 0 0 2) (46- 81+ 81+: 0 -1 -1) [1 2 2] 0 3 (23- 23- 23-: -1 0 1) (23- 40+ 40+: -1 0 0) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 4 (46- 46- 46-: 0 1 2) (46- 81+ 81+: 0 0 -1) [1 2 2] 0 3 (23- 23- 23-: -1 0 1) (23- 40+ 40+: -1 0 0) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 4 (81+ 46- 46-: 0 0 2) (81+ 81+ 81+: 0 -1 -1) [1 2 2] 0 3 (40+ 23- 23-: 1 0 1) (40+ 40+ 40+: 1 0 0) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 4 (81+ 46- 46-: 0 1 2) (81+ 81+ 81+: 0 0 -1) [1 2 2] 0 3 (40+ 23- 23-: 1 0 1) (40+ 40+ 40+: 1 0 0) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 4 (81+ 46- 46-: 0 0 1) (81+ 81+ 81+: 0 -1 -2) [1 2 2] 0 3 (40+ 23- 23-: 1 0 0) (40+ 40+ 40+: 1 0 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 4 (81+ 46- 46-: 0 1 1) (81+ 81+ 81+: 0 0 -2) [1 2 2] 0 3 (40+ 23- 23-: 1 0 0) (40+ 40+ 40+: 1 0 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 4 (46- 46- 46-: 2 0 1) (81+ 46- 81+: -1 0 -2) [2 1 2] 0 3 (23- 23- 23-: 1 -1 0) (40+ 23- 40+: 0 -1 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 4 (46- 46- 46-: 2 0 2) (81+ 46- 81+: -1 0 -1) [2 1 2] 0 3 (23- 23- 23-: 1 -1 1) (40+ 23- 40+: 0 -1 0) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 4 (46- 46- 46-: 1 0 1) (81+ 46- 81+: -2 0 -2) [2 1 2] 0 3 (23- 23- 23-: 0 -1 0) (40+ 23- 40+: -1 -1 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 4 (46- 46- 46-: 1 0 2) (81+ 46- 81+: -2 0 -1) [2 1 2] 0 3 (23- 23- 23-: 0 -1 1) (40+ 23- 40+: -1 -1 0) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 4 (46- 81+ 46-: 2 0 2) (81+ 81+ 81+: -1 0 -1) [2 1 2] 0 3 (23- 40+ 23-: 1 1 1) (40+ 40+ 40+: 0 1 0) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 4 (46- 81+ 46-: 2 0 1) (81+ 81+ 81+: -1 0 -2) [2 1 2] 0 3 (23- 40+ 23-: 1 1 0) (40+ 40+ 40+: 0 1 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 4 (46- 81+ 46-: 1 0 2) (81+ 81+ 81+: -2 0 -1) [2 1 2] 0 3 (23- 40+ 23-: 0 1 1) (40+ 40+ 40+: -1 1 0) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 4 (46- 81+ 46-: 1 0 1) (81+ 81+ 81+: -2 0 -2) [2 1 2] 0 3 (23- 40+ 23-: 0 1 0) (40+ 40+ 40+: -1 1 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 4 (46- 46- 46-: 0 0 0) (81+ 81+ 46-: -1 -1 0) [2 2 1] 0 3 (23- 23- 23-: 0 0 -1) (40+ 40+ 23-: 0 0 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 4 (46- 46- 46-: 0 1 0) (81+ 81+ 46-: -1 0 0) [2 2 1] 0 3 (23- 23- 23-: 0 0 -1) (40+ 40+ 23-: 0 0 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 4 (46- 46- 46-: 1 0 0) (81+ 81+ 46-: 0 -1 0) [2 2 1] 0 3 (23- 23- 23-: 0 0 -1) (40+ 40+ 23-: 0 0 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 4 (46- 46- 46-: 1 1 0) (81+ 81+ 46-: 0 0 0) [2 2 1] 0 3 (23- 23- 23-: 0 0 -1) (40+ 40+ 23-: 0 0 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 4 (46- 46- 81+: 1 0 0) (81+ 81+ 81+: 0 -1 0) [2 2 1] 0 3 (23- 23- 40+: 0 0 1) (40+ 40+ 40+: 0 0 1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 4 (46- 46- 81+: 1 1 0) (81+ 81+ 81+: 0 0 0) [2 2 1] 0 3 (23- 23- 40+: 0 0 1) (40+ 40+ 40+: 0 0 1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 4 (46- 46- 81+: 0 0 0) (81+ 81+ 81+: -1 -1 0) [2 2 1] 0 3 (23- 23- 40+: 0 0 1) (40+ 40+ 40+: 0 0 1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 4 (46- 46- 81+: 0 1 0) (81+ 81+ 81+: -1 0 0) [2 2 1] 0 3 (23- 23- 40+: 0 0 1) (40+ 40+ 40+: 0 0 1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 4 (49- 49- 49-: -1 0 0) (49- 60+ 60+: -1 0 0) [1 1 1] 0 5 (98- 98- 98-: 0 0 1) (98- 121+ 121+: 0 -1 0) [1 2 2] 0 [0 1 2] 7 -0.250000 GraphAddEntries: 4 (49- 49- 49-: -1 0 0) (49- 60+ 60+: -1 0 0) [1 1 1] 0 5 (98- 98- 98-: 0 1 1) (98- 121+ 121+: 0 0 0) [1 2 2] 0 [0 1 2] 8 -0.250000 GraphAddEntries: 4 (49- 49- 49-: -1 0 0) (49- 60+ 60+: -1 0 0) [1 1 1] 0 5 (98- 98- 98-: 0 0 0) (98- 121+ 121+: 0 -1 -1) [1 2 2] 0 [0 1 2] 9 -0.250000 GraphAddEntries: 4 (49- 49- 49-: -1 0 0) (49- 60+ 60+: -1 0 0) [1 1 1] 0 5 (98- 98- 98-: 0 1 0) (98- 121+ 121+: 0 0 -1) [1 2 2] 0 [0 1 2] 10 -0.250000 GraphAddEntries: 4 (60+ 49- 49-: 1 0 0) (60+ 60+ 60+: 1 0 0) [1 1 1] 0 5 (121+ 98- 98-: 0 0 0) (121+ 121+ 121+: 0 -1 -1) [1 2 2] 0 [0 1 2] 7 -0.250000 GraphAddEntries: 4 (60+ 49- 49-: 1 0 0) (60+ 60+ 60+: 1 0 0) [1 1 1] 0 5 (121+ 98- 98-: 0 1 0) (121+ 121+ 121+: 0 0 -1) [1 2 2] 0 [0 1 2] 8 -0.250000 GraphAddEntries: 4 (60+ 49- 49-: 1 0 0) (60+ 60+ 60+: 1 0 0) [1 1 1] 0 5 (121+ 98- 98-: 0 0 1) (121+ 121+ 121+: 0 -1 0) [1 2 2] 0 [0 1 2] 9 -0.250000 GraphAddEntries: 4 (60+ 49- 49-: 1 0 0) (60+ 60+ 60+: 1 0 0) [1 1 1] 0 5 (121+ 98- 98-: 0 1 1) (121+ 121+ 121+: 0 0 0) [1 2 2] 0 [0 1 2] 10 -0.250000 GraphAddEntries: 4 (49- 49- 49-: 0 -1 0) (60+ 49- 60+: 0 -1 0) [1 1 1] 0 5 (98- 98- 98-: 0 0 1) (121+ 98- 121+: -1 0 0) [2 1 2] 0 [0 1 2] 7 -0.250000 GraphAddEntries: 4 (49- 49- 49-: 0 -1 0) (60+ 49- 60+: 0 -1 0) [1 1 1] 0 5 (98- 98- 98-: 0 0 0) (121+ 98- 121+: -1 0 -1) [2 1 2] 0 [0 1 2] 8 -0.250000 GraphAddEntries: 4 (49- 49- 49-: 0 -1 0) (60+ 49- 60+: 0 -1 0) [1 1 1] 0 5 (98- 98- 98-: 1 0 1) (121+ 98- 121+: 0 0 0) [2 1 2] 0 [0 1 2] 9 -0.250000 GraphAddEntries: 4 (49- 49- 49-: 0 -1 0) (60+ 49- 60+: 0 -1 0) [1 1 1] 0 5 (98- 98- 98-: 1 0 0) (121+ 98- 121+: 0 0 -1) [2 1 2] 0 [0 1 2] 10 -0.250000 GraphAddEntries: 4 (49- 60+ 49-: 0 1 0) (60+ 60+ 60+: 0 1 0) [1 1 1] 0 5 (98- 121+ 98-: 0 0 0) (121+ 121+ 121+: -1 0 -1) [2 1 2] 0 [0 1 2] 7 -0.250000 GraphAddEntries: 4 (49- 60+ 49-: 0 1 0) (60+ 60+ 60+: 0 1 0) [1 1 1] 0 5 (98- 121+ 98-: 0 0 1) (121+ 121+ 121+: -1 0 0) [2 1 2] 0 [0 1 2] 8 -0.250000 GraphAddEntries: 4 (49- 60+ 49-: 0 1 0) (60+ 60+ 60+: 0 1 0) [1 1 1] 0 5 (98- 121+ 98-: 1 0 0) (121+ 121+ 121+: 0 0 -1) [2 1 2] 0 [0 1 2] 9 -0.250000 GraphAddEntries: 4 (49- 60+ 49-: 0 1 0) (60+ 60+ 60+: 0 1 0) [1 1 1] 0 5 (98- 121+ 98-: 1 0 1) (121+ 121+ 121+: 0 0 0) [2 1 2] 0 [0 1 2] 10 -0.250000 GraphAddEntries: 4 (49- 49- 49-: 0 0 -1) (60+ 60+ 49-: 0 0 -1) [1 1 1] 0 5 (98- 98- 98-: 0 0 0) (121+ 121+ 98-: -1 -1 0) [2 2 1] 0 [0 1 2] 7 -0.250000 GraphAddEntries: 4 (49- 49- 49-: 0 0 -1) (60+ 60+ 49-: 0 0 -1) [1 1 1] 0 5 (98- 98- 98-: 0 1 0) (121+ 121+ 98-: -1 0 0) [2 2 1] 0 [0 1 2] 8 -0.250000 GraphAddEntries: 4 (49- 49- 49-: 0 0 -1) (60+ 60+ 49-: 0 0 -1) [1 1 1] 0 5 (98- 98- 98-: 1 0 0) (121+ 121+ 98-: 0 -1 0) [2 2 1] 0 [0 1 2] 9 -0.250000 GraphAddEntries: 4 (49- 49- 49-: 0 0 -1) (60+ 60+ 49-: 0 0 -1) [1 1 1] 0 5 (98- 98- 98-: 1 1 0) (121+ 121+ 98-: 0 0 0) [2 2 1] 0 [0 1 2] 10 -0.250000 GraphAddEntries: 4 (49- 49- 60+: 0 0 1) (60+ 60+ 60+: 0 0 1) [1 1 1] 0 5 (98- 98- 121+: 1 0 0) (121+ 121+ 121+: 0 -1 0) [2 2 1] 0 [0 1 2] 7 -0.250000 GraphAddEntries: 4 (49- 49- 60+: 0 0 1) (60+ 60+ 60+: 0 0 1) [1 1 1] 0 5 (98- 98- 121+: 1 1 0) (121+ 121+ 121+: 0 0 0) [2 2 1] 0 [0 1 2] 8 -0.250000 GraphAddEntries: 4 (49- 49- 60+: 0 0 1) (60+ 60+ 60+: 0 0 1) [1 1 1] 0 5 (98- 98- 121+: 0 0 0) (121+ 121+ 121+: -1 -1 0) [2 2 1] 0 [0 1 2] 9 -0.250000 GraphAddEntries: 4 (49- 49- 60+: 0 0 1) (60+ 60+ 60+: 0 0 1) [1 1 1] 0 5 (98- 98- 121+: 0 1 0) (121+ 121+ 121+: -1 0 0) [2 2 1] 0 [0 1 2] 10 -0.250000 GraphAddEntries: 4 (46- 46- 46-: 0 0 0) (46- 81+ 46-: 0 -1 0) [1 2 1] 0 3 (23- 23- 23-: -1 0 0) (23- 40+ 23-: -1 0 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 4 (46- 46- 46-: 0 1 0) (46- 81+ 46-: 0 0 0) [1 2 1] 0 3 (23- 23- 23-: -1 0 0) (23- 40+ 23-: -1 0 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 4 (81+ 46- 81+: 0 0 0) (81+ 81+ 81+: 0 -1 0) [1 2 1] 0 3 (40+ 23- 40+: 1 0 0) (40+ 40+ 40+: 1 0 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 4 (81+ 46- 81+: 0 1 0) (81+ 81+ 81+: 0 0 0) [1 2 1] 0 3 (40+ 23- 40+: 1 0 0) (40+ 40+ 40+: 1 0 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 4 (81+ 46- 46-: 0 0 0) (81+ 81+ 46-: 0 -1 0) [1 2 1] 0 3 (40+ 23- 23-: 1 0 0) (40+ 40+ 23-: 1 0 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 4 (81+ 46- 46-: 0 1 0) (81+ 81+ 46-: 0 0 0) [1 2 1] 0 3 (40+ 23- 23-: 1 0 0) (40+ 40+ 23-: 1 0 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 4 (46- 46- 81+: 0 0 0) (46- 81+ 81+: 0 -1 0) [1 2 1] 0 3 (23- 23- 40+: -1 0 0) (23- 40+ 40+: -1 0 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 4 (46- 46- 81+: 0 1 0) (46- 81+ 81+: 0 0 0) [1 2 1] 0 3 (23- 23- 40+: -1 0 0) (23- 40+ 40+: -1 0 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 4 (46- 46- 46-: 2 0 0) (81+ 46- 46-: -1 0 0) [2 1 1] 0 3 (23- 23- 23-: 1 -1 0) (40+ 23- 23-: 0 -1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 4 (46- 46- 46-: 0 0 2) (46- 46- 81+: 0 0 -1) [1 1 2] 0 3 (23- 23- 23-: 0 -1 1) (23- 23- 40+: 0 -1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 4 (46- 46- 81+: 2 0 0) (81+ 46- 81+: -1 0 0) [2 1 1] 0 3 (23- 23- 40+: 1 -1 0) (40+ 23- 40+: 0 -1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 4 (81+ 46- 46-: 0 0 2) (81+ 46- 81+: 0 0 -1) [1 1 2] 0 3 (40+ 23- 23-: 0 -1 1) (40+ 23- 40+: 0 -1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 4 (46- 46- 46-: 1 0 0) (81+ 46- 46-: -2 0 0) [2 1 1] 0 3 (23- 23- 23-: 0 -1 0) (40+ 23- 23-: -1 -1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 4 (46- 46- 46-: 0 0 1) (46- 46- 81+: 0 0 -2) [1 1 2] 0 3 (23- 23- 23-: 0 -1 0) (23- 23- 40+: 0 -1 -1) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 4 (46- 46- 81+: 1 0 0) (81+ 46- 81+: -2 0 0) [2 1 1] 0 3 (23- 23- 40+: 0 -1 0) (40+ 23- 40+: -1 -1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 4 (81+ 46- 46-: 0 0 1) (81+ 46- 81+: 0 0 -2) [1 1 2] 0 3 (40+ 23- 23-: 0 -1 0) (40+ 23- 40+: 0 -1 -1) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 4 (46- 81+ 46-: 2 0 0) (81+ 81+ 46-: -1 0 0) [2 1 1] 0 3 (23- 40+ 23-: 1 1 0) (40+ 40+ 23-: 0 1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 4 (46- 81+ 46-: 0 0 2) (46- 81+ 81+: 0 0 -1) [1 1 2] 0 3 (23- 40+ 23-: 0 1 1) (23- 40+ 40+: 0 1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 4 (46- 81+ 81+: 2 0 0) (81+ 81+ 81+: -1 0 0) [2 1 1] 0 3 (23- 40+ 40+: 1 1 0) (40+ 40+ 40+: 0 1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 4 (81+ 81+ 46-: 0 0 2) (81+ 81+ 81+: 0 0 -1) [1 1 2] 0 3 (40+ 40+ 23-: 0 1 1) (40+ 40+ 40+: 0 1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 4 (46- 81+ 46-: 1 0 0) (81+ 81+ 46-: -2 0 0) [2 1 1] 0 3 (23- 40+ 23-: 0 1 0) (40+ 40+ 23-: -1 1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 4 (46- 81+ 46-: 0 0 1) (46- 81+ 81+: 0 0 -2) [1 1 2] 0 3 (23- 40+ 23-: 0 1 0) (23- 40+ 40+: 0 1 -1) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 4 (46- 81+ 81+: 1 0 0) (81+ 81+ 81+: -2 0 0) [2 1 1] 0 3 (23- 40+ 40+: 0 1 0) (40+ 40+ 40+: -1 1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 4 (81+ 81+ 46-: 0 0 1) (81+ 81+ 81+: 0 0 -2) [1 1 2] 0 3 (40+ 40+ 23-: 0 1 0) (40+ 40+ 40+: 0 1 -1) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 4 (46- 46- 46-: 0 0 0) (46- 46- 46-: 0 0 0) [1 1 1] 0 3 (23- 23- 23-: 0 -1 0) (23- 23- 23-: 0 -1 0) [1 1 1] 0 [0 1 2] 9 -1.000000 GraphAddEntries: 4 (81+ 46- 46-: 0 0 0) (81+ 46- 46-: 0 0 0) [1 1 1] 0 3 (40+ 23- 23-: 0 -1 0) (40+ 23- 23-: 0 -1 0) [1 1 1] 0 [0 1 2] 9 -1.000000 GraphAddEntries: 4 (46- 46- 81+: 0 0 0) (46- 46- 81+: 0 0 0) [1 1 1] 0 3 (23- 23- 40+: 0 -1 0) (23- 23- 40+: 0 -1 0) [1 1 1] 0 [0 1 2] 9 -1.000000 GraphAddEntries: 4 (81+ 46- 81+: 0 0 0) (81+ 46- 81+: 0 0 0) [1 1 1] 0 3 (40+ 23- 40+: 0 -1 0) (40+ 23- 40+: 0 -1 0) [1 1 1] 0 [0 1 2] 9 -1.000000 GraphAddEntries: 4 (46- 81+ 46-: 0 0 0) (46- 81+ 46-: 0 0 0) [1 1 1] 0 3 (23- 40+ 23-: 0 1 0) (23- 40+ 23-: 0 1 0) [1 1 1] 0 [0 1 2] 9 -1.000000 GraphAddEntries: 4 (81+ 81+ 46-: 0 0 0) (81+ 81+ 46-: 0 0 0) [1 1 1] 0 3 (40+ 40+ 23-: 0 1 0) (40+ 40+ 23-: 0 1 0) [1 1 1] 0 [0 1 2] 9 -1.000000 GraphAddEntries: 4 (46- 81+ 81+: 0 0 0) (46- 81+ 81+: 0 0 0) [1 1 1] 0 3 (23- 40+ 40+: 0 1 0) (23- 40+ 40+: 0 1 0) [1 1 1] 0 [0 1 2] 9 -1.000000 GraphAddEntries: 4 (81+ 81+ 81+: 0 0 0) (81+ 81+ 81+: 0 0 0) [1 1 1] 0 3 (40+ 40+ 40+: 0 1 0) (40+ 40+ 40+: 0 1 0) [1 1 1] 0 [0 1 2] 9 -1.000000 GraphAddEntries: 5 (98- 98- 98-: 0 0 1) (98- 121+ 121+: 0 -1 -2) [1 2 2] 0 4 (49- 49- 49-: -1 0 0) (49- 60+ 60+: -1 0 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 5 (98- 98- 98-: 0 1 1) (98- 121+ 121+: 0 0 -2) [1 2 2] 0 4 (49- 49- 49-: -1 0 0) (49- 60+ 60+: -1 0 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 5 (98- 98- 98-: 0 0 2) (98- 121+ 121+: 0 -1 -1) [1 2 2] 0 4 (49- 49- 49-: -1 0 1) (49- 60+ 60+: -1 0 0) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 5 (98- 98- 98-: 0 1 2) (98- 121+ 121+: 0 0 -1) [1 2 2] 0 4 (49- 49- 49-: -1 0 1) (49- 60+ 60+: -1 0 0) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 5 (121+ 98- 98-: 0 0 2) (121+ 121+ 121+: 0 -1 -1) [1 2 2] 0 4 (60+ 49- 49-: 1 0 1) (60+ 60+ 60+: 1 0 0) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 5 (121+ 98- 98-: 0 1 2) (121+ 121+ 121+: 0 0 -1) [1 2 2] 0 4 (60+ 49- 49-: 1 0 1) (60+ 60+ 60+: 1 0 0) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 5 (121+ 98- 98-: 0 0 1) (121+ 121+ 121+: 0 -1 -2) [1 2 2] 0 4 (60+ 49- 49-: 1 0 0) (60+ 60+ 60+: 1 0 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 5 (121+ 98- 98-: 0 1 1) (121+ 121+ 121+: 0 0 -2) [1 2 2] 0 4 (60+ 49- 49-: 1 0 0) (60+ 60+ 60+: 1 0 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 5 (98- 98- 98-: 2 0 1) (121+ 98- 121+: -1 0 -2) [2 1 2] 0 4 (49- 49- 49-: 1 -1 0) (60+ 49- 60+: 0 -1 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 5 (98- 98- 98-: 2 0 2) (121+ 98- 121+: -1 0 -1) [2 1 2] 0 4 (49- 49- 49-: 1 -1 1) (60+ 49- 60+: 0 -1 0) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 5 (98- 98- 98-: 1 0 1) (121+ 98- 121+: -2 0 -2) [2 1 2] 0 4 (49- 49- 49-: 0 -1 0) (60+ 49- 60+: -1 -1 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 5 (98- 98- 98-: 1 0 2) (121+ 98- 121+: -2 0 -1) [2 1 2] 0 4 (49- 49- 49-: 0 -1 1) (60+ 49- 60+: -1 -1 0) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 5 (98- 121+ 98-: 2 0 2) (121+ 121+ 121+: -1 0 -1) [2 1 2] 0 4 (49- 60+ 49-: 1 1 1) (60+ 60+ 60+: 0 1 0) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 5 (98- 121+ 98-: 2 0 1) (121+ 121+ 121+: -1 0 -2) [2 1 2] 0 4 (49- 60+ 49-: 1 1 0) (60+ 60+ 60+: 0 1 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 5 (98- 121+ 98-: 1 0 2) (121+ 121+ 121+: -2 0 -1) [2 1 2] 0 4 (49- 60+ 49-: 0 1 1) (60+ 60+ 60+: -1 1 0) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 5 (98- 121+ 98-: 1 0 1) (121+ 121+ 121+: -2 0 -2) [2 1 2] 0 4 (49- 60+ 49-: 0 1 0) (60+ 60+ 60+: -1 1 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 5 (98- 98- 98-: 0 0 0) (121+ 121+ 98-: -1 -1 0) [2 2 1] 0 4 (49- 49- 49-: 0 0 -1) (60+ 60+ 49-: 0 0 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 5 (98- 98- 98-: 0 1 0) (121+ 121+ 98-: -1 0 0) [2 2 1] 0 4 (49- 49- 49-: 0 0 -1) (60+ 60+ 49-: 0 0 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 5 (98- 98- 98-: 1 0 0) (121+ 121+ 98-: 0 -1 0) [2 2 1] 0 4 (49- 49- 49-: 0 0 -1) (60+ 60+ 49-: 0 0 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 5 (98- 98- 98-: 1 1 0) (121+ 121+ 98-: 0 0 0) [2 2 1] 0 4 (49- 49- 49-: 0 0 -1) (60+ 60+ 49-: 0 0 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 5 (98- 98- 121+: 1 0 0) (121+ 121+ 121+: 0 -1 0) [2 2 1] 0 4 (49- 49- 60+: 0 0 1) (60+ 60+ 60+: 0 0 1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 5 (98- 98- 121+: 1 1 0) (121+ 121+ 121+: 0 0 0) [2 2 1] 0 4 (49- 49- 60+: 0 0 1) (60+ 60+ 60+: 0 0 1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 5 (98- 98- 121+: 0 0 0) (121+ 121+ 121+: -1 -1 0) [2 2 1] 0 4 (49- 49- 60+: 0 0 1) (60+ 60+ 60+: 0 0 1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 5 (98- 98- 121+: 0 1 0) (121+ 121+ 121+: -1 0 0) [2 2 1] 0 4 (49- 49- 60+: 0 0 1) (60+ 60+ 60+: 0 0 1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 5 (98- 98- 98-: 0 0 0) (98- 121+ 98-: 0 -1 0) [1 2 1] 0 4 (49- 49- 49-: -1 0 0) (49- 60+ 49-: -1 0 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 5 (98- 98- 98-: 0 1 0) (98- 121+ 98-: 0 0 0) [1 2 1] 0 4 (49- 49- 49-: -1 0 0) (49- 60+ 49-: -1 0 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 5 (121+ 98- 121+: 0 0 0) (121+ 121+ 121+: 0 -1 0) [1 2 1] 0 4 (60+ 49- 60+: 1 0 0) (60+ 60+ 60+: 1 0 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 5 (121+ 98- 121+: 0 1 0) (121+ 121+ 121+: 0 0 0) [1 2 1] 0 4 (60+ 49- 60+: 1 0 0) (60+ 60+ 60+: 1 0 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 5 (121+ 98- 98-: 0 0 0) (121+ 121+ 98-: 0 -1 0) [1 2 1] 0 4 (60+ 49- 49-: 1 0 0) (60+ 60+ 49-: 1 0 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 5 (121+ 98- 98-: 0 1 0) (121+ 121+ 98-: 0 0 0) [1 2 1] 0 4 (60+ 49- 49-: 1 0 0) (60+ 60+ 49-: 1 0 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 5 (98- 98- 121+: 0 0 0) (98- 121+ 121+: 0 -1 0) [1 2 1] 0 4 (49- 49- 60+: -1 0 0) (49- 60+ 60+: -1 0 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 5 (98- 98- 121+: 0 1 0) (98- 121+ 121+: 0 0 0) [1 2 1] 0 4 (49- 49- 60+: -1 0 0) (49- 60+ 60+: -1 0 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 5 (98- 98- 98-: 2 0 0) (121+ 98- 98-: -1 0 0) [2 1 1] 0 4 (49- 49- 49-: 1 -1 0) (60+ 49- 49-: 0 -1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 5 (98- 98- 98-: 0 0 2) (98- 98- 121+: 0 0 -1) [1 1 2] 0 4 (49- 49- 49-: 0 -1 1) (49- 49- 60+: 0 -1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 5 (98- 98- 121+: 2 0 0) (121+ 98- 121+: -1 0 0) [2 1 1] 0 4 (49- 49- 60+: 1 -1 0) (60+ 49- 60+: 0 -1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 5 (121+ 98- 98-: 0 0 2) (121+ 98- 121+: 0 0 -1) [1 1 2] 0 4 (60+ 49- 49-: 0 -1 1) (60+ 49- 60+: 0 -1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 5 (98- 98- 98-: 1 0 0) (121+ 98- 98-: -2 0 0) [2 1 1] 0 4 (49- 49- 49-: 0 -1 0) (60+ 49- 49-: -1 -1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 5 (98- 98- 98-: 0 0 1) (98- 98- 121+: 0 0 -2) [1 1 2] 0 4 (49- 49- 49-: 0 -1 0) (49- 49- 60+: 0 -1 -1) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 5 (98- 98- 121+: 1 0 0) (121+ 98- 121+: -2 0 0) [2 1 1] 0 4 (49- 49- 60+: 0 -1 0) (60+ 49- 60+: -1 -1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 5 (121+ 98- 98-: 0 0 1) (121+ 98- 121+: 0 0 -2) [1 1 2] 0 4 (60+ 49- 49-: 0 -1 0) (60+ 49- 60+: 0 -1 -1) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 5 (98- 121+ 98-: 2 0 0) (121+ 121+ 98-: -1 0 0) [2 1 1] 0 4 (49- 60+ 49-: 1 1 0) (60+ 60+ 49-: 0 1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 5 (98- 121+ 98-: 0 0 2) (98- 121+ 121+: 0 0 -1) [1 1 2] 0 4 (49- 60+ 49-: 0 1 1) (49- 60+ 60+: 0 1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 5 (98- 121+ 121+: 2 0 0) (121+ 121+ 121+: -1 0 0) [2 1 1] 0 4 (49- 60+ 60+: 1 1 0) (60+ 60+ 60+: 0 1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 5 (121+ 121+ 98-: 0 0 2) (121+ 121+ 121+: 0 0 -1) [1 1 2] 0 4 (60+ 60+ 49-: 0 1 1) (60+ 60+ 60+: 0 1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 5 (98- 121+ 98-: 1 0 0) (121+ 121+ 98-: -2 0 0) [2 1 1] 0 4 (49- 60+ 49-: 0 1 0) (60+ 60+ 49-: -1 1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 5 (98- 121+ 98-: 0 0 1) (98- 121+ 121+: 0 0 -2) [1 1 2] 0 4 (49- 60+ 49-: 0 1 0) (49- 60+ 60+: 0 1 -1) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 5 (98- 121+ 121+: 1 0 0) (121+ 121+ 121+: -2 0 0) [2 1 1] 0 4 (49- 60+ 60+: 0 1 0) (60+ 60+ 60+: -1 1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 5 (121+ 121+ 98-: 0 0 1) (121+ 121+ 121+: 0 0 -2) [1 1 2] 0 4 (60+ 60+ 49-: 0 1 0) (60+ 60+ 60+: 0 1 -1) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 5 (98- 98- 98-: 0 0 0) (98- 98- 98-: 0 0 0) [1 1 1] 0 4 (49- 49- 49-: 0 -1 0) (49- 49- 49-: 0 -1 0) [1 1 1] 0 [0 1 2] 9 -1.000000 GraphAddEntries: 5 (121+ 98- 98-: 0 0 0) (121+ 98- 98-: 0 0 0) [1 1 1] 0 4 (60+ 49- 49-: 0 -1 0) (60+ 49- 49-: 0 -1 0) [1 1 1] 0 [0 1 2] 9 -1.000000 GraphAddEntries: 5 (98- 98- 121+: 0 0 0) (98- 98- 121+: 0 0 0) [1 1 1] 0 4 (49- 49- 60+: 0 -1 0) (49- 49- 60+: 0 -1 0) [1 1 1] 0 [0 1 2] 9 -1.000000 GraphAddEntries: 5 (121+ 98- 121+: 0 0 0) (121+ 98- 121+: 0 0 0) [1 1 1] 0 4 (60+ 49- 60+: 0 -1 0) (60+ 49- 60+: 0 -1 0) [1 1 1] 0 [0 1 2] 9 -1.000000 GraphAddEntries: 5 (98- 121+ 98-: 0 0 0) (98- 121+ 98-: 0 0 0) [1 1 1] 0 4 (49- 60+ 49-: 0 1 0) (49- 60+ 49-: 0 1 0) [1 1 1] 0 [0 1 2] 9 -1.000000 GraphAddEntries: 5 (121+ 121+ 98-: 0 0 0) (121+ 121+ 98-: 0 0 0) [1 1 1] 0 4 (60+ 60+ 49-: 0 1 0) (60+ 60+ 49-: 0 1 0) [1 1 1] 0 [0 1 2] 9 -1.000000 GraphAddEntries: 5 (98- 121+ 121+: 0 0 0) (98- 121+ 121+: 0 0 0) [1 1 1] 0 4 (49- 60+ 60+: 0 1 0) (49- 60+ 60+: 0 1 0) [1 1 1] 0 [0 1 2] 9 -1.000000 GraphAddEntries: 5 (121+ 121+ 121+: 0 0 0) (121+ 121+ 121+: 0 0 0) [1 1 1] 0 4 (60+ 60+ 60+: 0 1 0) (60+ 60+ 60+: 0 1 0) [1 1 1] 0 [0 1 2] 9 -1.000000 ############################################################# FacParts: 0 0 [1 1 1] FacParts: 1 1 [2 2 2] FacParts: 2 2 [2 2 2] FacParts: 3 3 [2 2 2] FacParts: 4 4 [2 2 2] FacParts: 5 5 [2 2 2] ProcessPoolCreate: 1 # ProcessPoolSetPart: pool part ProcessPoolSetPart: 0 0 ProcessPoolSetPart: 0 1 ProcessPoolSetPart: 0 2 ProcessPoolSetPart: 0 3 ProcessPoolSetPart: 0 4 ProcessPoolSetPart: 0 5 hypre-2.33.0/src/test/TEST_fac/7lev.in000066400000000000000000002205571477326011500173120ustar00rootroot00000000000000# Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) ###################################################### # GridCreate: ndim nparts GridCreate: 3 7 ############################################################# # GridSetExtents: part ilower(ndim) iupper(ndim) GridSetExtents: 0 (1- 1- 1-) (8+ 8+ 8+) GridSetExtents: 1 (4- 4- 4-) (13+ 13+ 13+) GridSetExtents: 2 (10- 10- 10-) (23+ 23+ 23+) GridSetExtents: 3 (22- 22- 22-) (43+ 43+ 43+) GridSetExtents: 4 (46- 46- 46-) (81+ 81+ 81+) GridSetExtents: 5 (98- 98- 98-) (121+ 121+ 121+) GridSetExtents: 6 (200- 200- 200-) (231+ 231+ 231+) ############################################################# # GridSetVariables: part nvars vartypes[nvars] # CELL = 0 # NODE = 1 # XFACE = 2 # YFACE = 3 # ZFACE = 4 # XEDGE = 5 # YEDGE = 6 # ZEDGE = 7 GridSetVariables: 0 1 [0] GridSetVariables: 1 1 [0] GridSetVariables: 2 1 [0] GridSetVariables: 3 1 [0] GridSetVariables: 4 1 [0] GridSetVariables: 5 1 [0] GridSetVariables: 6 1 [0] ############################################################# # StencilCreate: nstencils sizes[nstencils] StencilCreate: 1 [7] ############################################################# # StencilSetEntry: stencil_num entry offset[ndim] var value StencilSetEntry: 0 0 [ 0 0 0] 0 6.000000 StencilSetEntry: 0 1 [-1 0 0] 0 -1.000000 StencilSetEntry: 0 2 [ 1 0 0] 0 -1.000000 StencilSetEntry: 0 3 [ 0 -1 0] 0 -1.000000 StencilSetEntry: 0 4 [ 0 0 1] 0 -1.000000 StencilSetEntry: 0 5 [ 0 0 -1] 0 -1.000000 StencilSetEntry: 0 6 [ 0 1 0] 0 -1.000000 ############################################################# # GraphSetStencil: part var stencil_num GraphSetStencil: 0 0 0 GraphSetStencil: 1 0 0 GraphSetStencil: 2 0 0 GraphSetStencil: 3 0 0 GraphSetStencil: 4 0 0 GraphSetStencil: 5 0 0 GraphSetStencil: 6 0 0 ############################################################# # GraphAddEntries: \ # part ilower(ndim) iupper(ndim) stride[ndim] var \ # to_part to_ilower(ndim) to_iupper(ndim) to_stride[ndim] to_var \ # index_map[ndim] entry value GraphAddEntries: 0 (2- 2- 2-: -1 0 0) (2- 6+ 6+: -1 0 0) [1 1 1] 0 1 (4- 4- 4-: 0 0 1) (4- 13+ 13+: 0 -1 0) [1 2 2] 0 [0 1 2] 7 -0.250000 GraphAddEntries: 0 (2- 2- 2-: -1 0 0) (2- 6+ 6+: -1 0 0) [1 1 1] 0 1 (4- 4- 4-: 0 1 1) (4- 13+ 13+: 0 0 0) [1 2 2] 0 [0 1 2] 8 -0.250000 GraphAddEntries: 0 (2- 2- 2-: -1 0 0) (2- 6+ 6+: -1 0 0) [1 1 1] 0 1 (4- 4- 4-: 0 0 0) (4- 13+ 13+: 0 -1 -1) [1 2 2] 0 [0 1 2] 9 -0.250000 GraphAddEntries: 0 (2- 2- 2-: -1 0 0) (2- 6+ 6+: -1 0 0) [1 1 1] 0 1 (4- 4- 4-: 0 1 0) (4- 13+ 13+: 0 0 -1) [1 2 2] 0 [0 1 2] 10 -0.250000 GraphAddEntries: 0 (6+ 2- 2-: 1 0 0) (6+ 6+ 6+: 1 0 0) [1 1 1] 0 1 (13+ 4- 4-: 0 0 0) (13+ 13+ 13+: 0 -1 -1) [1 2 2] 0 [0 1 2] 7 -0.250000 GraphAddEntries: 0 (6+ 2- 2-: 1 0 0) (6+ 6+ 6+: 1 0 0) [1 1 1] 0 1 (13+ 4- 4-: 0 1 0) (13+ 13+ 13+: 0 0 -1) [1 2 2] 0 [0 1 2] 8 -0.250000 GraphAddEntries: 0 (6+ 2- 2-: 1 0 0) (6+ 6+ 6+: 1 0 0) [1 1 1] 0 1 (13+ 4- 4-: 0 0 1) (13+ 13+ 13+: 0 -1 0) [1 2 2] 0 [0 1 2] 9 -0.250000 GraphAddEntries: 0 (6+ 2- 2-: 1 0 0) (6+ 6+ 6+: 1 0 0) [1 1 1] 0 1 (13+ 4- 4-: 0 1 1) (13+ 13+ 13+: 0 0 0) [1 2 2] 0 [0 1 2] 10 -0.250000 GraphAddEntries: 0 (2- 2- 2-: 0 -1 0) (6+ 2- 6+: 0 -1 0) [1 1 1] 0 1 (4- 4- 4-: 0 0 1) (13+ 4- 13+: -1 0 0) [2 1 2] 0 [0 1 2] 7 -0.250000 GraphAddEntries: 0 (2- 2- 2-: 0 -1 0) (6+ 2- 6+: 0 -1 0) [1 1 1] 0 1 (4- 4- 4-: 0 0 0) (13+ 4- 13+: -1 0 -1) [2 1 2] 0 [0 1 2] 8 -0.250000 GraphAddEntries: 0 (2- 2- 2-: 0 -1 0) (6+ 2- 6+: 0 -1 0) [1 1 1] 0 1 (4- 4- 4-: 1 0 1) (13+ 4- 13+: 0 0 0) [2 1 2] 0 [0 1 2] 9 -0.250000 GraphAddEntries: 0 (2- 2- 2-: 0 -1 0) (6+ 2- 6+: 0 -1 0) [1 1 1] 0 1 (4- 4- 4-: 1 0 0) (13+ 4- 13+: 0 0 -1) [2 1 2] 0 [0 1 2] 10 -0.250000 GraphAddEntries: 0 (2- 6+ 2-: 0 1 0) (6+ 6+ 6+: 0 1 0) [1 1 1] 0 1 (4- 13+ 4-: 0 0 0) (13+ 13+ 13+: -1 0 -1) [2 1 2] 0 [0 1 2] 7 -0.250000 GraphAddEntries: 0 (2- 6+ 2-: 0 1 0) (6+ 6+ 6+: 0 1 0) [1 1 1] 0 1 (4- 13+ 4-: 0 0 1) (13+ 13+ 13+: -1 0 0) [2 1 2] 0 [0 1 2] 8 -0.250000 GraphAddEntries: 0 (2- 6+ 2-: 0 1 0) (6+ 6+ 6+: 0 1 0) [1 1 1] 0 1 (4- 13+ 4-: 1 0 0) (13+ 13+ 13+: 0 0 -1) [2 1 2] 0 [0 1 2] 9 -0.250000 GraphAddEntries: 0 (2- 6+ 2-: 0 1 0) (6+ 6+ 6+: 0 1 0) [1 1 1] 0 1 (4- 13+ 4-: 1 0 1) (13+ 13+ 13+: 0 0 0) [2 1 2] 0 [0 1 2] 10 -0.250000 GraphAddEntries: 0 (2- 2- 2-: 0 0 -1) (6+ 6+ 2-: 0 0 -1) [1 1 1] 0 1 (4- 4- 4-: 0 0 0) (13+ 13+ 4-: -1 -1 0) [2 2 1] 0 [0 1 2] 7 -0.250000 GraphAddEntries: 0 (2- 2- 2-: 0 0 -1) (6+ 6+ 2-: 0 0 -1) [1 1 1] 0 1 (4- 4- 4-: 0 1 0) (13+ 13+ 4-: -1 0 0) [2 2 1] 0 [0 1 2] 8 -0.250000 GraphAddEntries: 0 (2- 2- 2-: 0 0 -1) (6+ 6+ 2-: 0 0 -1) [1 1 1] 0 1 (4- 4- 4-: 1 0 0) (13+ 13+ 4-: 0 -1 0) [2 2 1] 0 [0 1 2] 9 -0.250000 GraphAddEntries: 0 (2- 2- 2-: 0 0 -1) (6+ 6+ 2-: 0 0 -1) [1 1 1] 0 1 (4- 4- 4-: 1 1 0) (13+ 13+ 4-: 0 0 0) [2 2 1] 0 [0 1 2] 10 -0.250000 GraphAddEntries: 0 (2- 2- 6+: 0 0 1) (6+ 6+ 6+: 0 0 1) [1 1 1] 0 1 (4- 4- 13+: 1 0 0) (13+ 13+ 13+: 0 -1 0) [2 2 1] 0 [0 1 2] 7 -0.250000 GraphAddEntries: 0 (2- 2- 6+: 0 0 1) (6+ 6+ 6+: 0 0 1) [1 1 1] 0 1 (4- 4- 13+: 1 1 0) (13+ 13+ 13+: 0 0 0) [2 2 1] 0 [0 1 2] 8 -0.250000 GraphAddEntries: 0 (2- 2- 6+: 0 0 1) (6+ 6+ 6+: 0 0 1) [1 1 1] 0 1 (4- 4- 13+: 0 0 0) (13+ 13+ 13+: -1 -1 0) [2 2 1] 0 [0 1 2] 9 -0.250000 GraphAddEntries: 0 (2- 2- 6+: 0 0 1) (6+ 6+ 6+: 0 0 1) [1 1 1] 0 1 (4- 4- 13+: 0 1 0) (13+ 13+ 13+: -1 0 0) [2 2 1] 0 [0 1 2] 10 -0.250000 GraphAddEntries: 1 (4- 4- 4-: 0 0 1) (4- 13+ 13+: 0 -1 -2) [1 2 2] 0 0 (2- 2- 2-: -1 0 0) (2- 6+ 6+: -1 0 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 1 (4- 4- 4-: 0 1 1) (4- 13+ 13+: 0 0 -2) [1 2 2] 0 0 (2- 2- 2-: -1 0 0) (2- 6+ 6+: -1 0 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 1 (4- 4- 4-: 0 0 2) (4- 13+ 13+: 0 -1 -1) [1 2 2] 0 0 (2- 2- 2-: -1 0 1) (2- 6+ 6+: -1 0 0) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 1 (4- 4- 4-: 0 1 2) (4- 13+ 13+: 0 0 -1) [1 2 2] 0 0 (2- 2- 2-: -1 0 1) (2- 6+ 6+: -1 0 0) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 1 (13+ 4- 4-: 0 0 2) (13+ 13+ 13+: 0 -1 -1) [1 2 2] 0 0 (6+ 2- 2-: 1 0 1) (6+ 6+ 6+: 1 0 0) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 1 (13+ 4- 4-: 0 1 2) (13+ 13+ 13+: 0 0 -1) [1 2 2] 0 0 (6+ 2- 2-: 1 0 1) (6+ 6+ 6+: 1 0 0) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 1 (13+ 4- 4-: 0 0 1) (13+ 13+ 13+: 0 -1 -2) [1 2 2] 0 0 (6+ 2- 2-: 1 0 0) (6+ 6+ 6+: 1 0 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 1 (13+ 4- 4-: 0 1 1) (13+ 13+ 13+: 0 0 -2) [1 2 2] 0 0 (6+ 2- 2-: 1 0 0) (6+ 6+ 6+: 1 0 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 1 (4- 4- 4-: 2 0 1) (13+ 4- 13+: -1 0 -2) [2 1 2] 0 0 (2- 2- 2-: 1 -1 0) (6+ 2- 6+: 0 -1 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 1 (4- 4- 4-: 2 0 2) (13+ 4- 13+: -1 0 -1) [2 1 2] 0 0 (2- 2- 2-: 1 -1 1) (6+ 2- 6+: 0 -1 0) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 1 (4- 4- 4-: 1 0 1) (13+ 4- 13+: -2 0 -2) [2 1 2] 0 0 (2- 2- 2-: 0 -1 0) (6+ 2- 6+: -1 -1 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 1 (4- 4- 4-: 1 0 2) (13+ 4- 13+: -2 0 -1) [2 1 2] 0 0 (2- 2- 2-: 0 -1 1) (6+ 2- 6+: -1 -1 0) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 1 (4- 13+ 4-: 2 0 2) (13+ 13+ 13+: -1 0 -1) [2 1 2] 0 0 (2- 6+ 2-: 1 1 1) (6+ 6+ 6+: 0 1 0) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 1 (4- 13+ 4-: 2 0 1) (13+ 13+ 13+: -1 0 -2) [2 1 2] 0 0 (2- 6+ 2-: 1 1 0) (6+ 6+ 6+: 0 1 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 1 (4- 13+ 4-: 1 0 2) (13+ 13+ 13+: -2 0 -1) [2 1 2] 0 0 (2- 6+ 2-: 0 1 1) (6+ 6+ 6+: -1 1 0) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 1 (4- 13+ 4-: 1 0 1) (13+ 13+ 13+: -2 0 -2) [2 1 2] 0 0 (2- 6+ 2-: 0 1 0) (6+ 6+ 6+: -1 1 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 1 (4- 4- 4-: 0 0 0) (13+ 13+ 4-: -1 -1 0) [2 2 1] 0 0 (2- 2- 2-: 0 0 -1) (6+ 6+ 2-: 0 0 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 1 (4- 4- 4-: 0 1 0) (13+ 13+ 4-: -1 0 0) [2 2 1] 0 0 (2- 2- 2-: 0 0 -1) (6+ 6+ 2-: 0 0 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 1 (4- 4- 4-: 1 0 0) (13+ 13+ 4-: 0 -1 0) [2 2 1] 0 0 (2- 2- 2-: 0 0 -1) (6+ 6+ 2-: 0 0 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 1 (4- 4- 4-: 1 1 0) (13+ 13+ 4-: 0 0 0) [2 2 1] 0 0 (2- 2- 2-: 0 0 -1) (6+ 6+ 2-: 0 0 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 1 (4- 4- 13+: 1 0 0) (13+ 13+ 13+: 0 -1 0) [2 2 1] 0 0 (2- 2- 6+: 0 0 1) (6+ 6+ 6+: 0 0 1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 1 (4- 4- 13+: 1 1 0) (13+ 13+ 13+: 0 0 0) [2 2 1] 0 0 (2- 2- 6+: 0 0 1) (6+ 6+ 6+: 0 0 1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 1 (4- 4- 13+: 0 0 0) (13+ 13+ 13+: -1 -1 0) [2 2 1] 0 0 (2- 2- 6+: 0 0 1) (6+ 6+ 6+: 0 0 1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 1 (4- 4- 13+: 0 1 0) (13+ 13+ 13+: -1 0 0) [2 2 1] 0 0 (2- 2- 6+: 0 0 1) (6+ 6+ 6+: 0 0 1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 1 (5- 5- 5-: -1 0 0) (5- 11+ 11+: -1 0 0) [1 1 1] 0 2 (10- 10- 10-: 0 0 1) (10- 23+ 23+: 0 -1 0) [1 2 2] 0 [0 1 2] 7 -0.250000 GraphAddEntries: 1 (5- 5- 5-: -1 0 0) (5- 11+ 11+: -1 0 0) [1 1 1] 0 2 (10- 10- 10-: 0 1 1) (10- 23+ 23+: 0 0 0) [1 2 2] 0 [0 1 2] 8 -0.250000 GraphAddEntries: 1 (5- 5- 5-: -1 0 0) (5- 11+ 11+: -1 0 0) [1 1 1] 0 2 (10- 10- 10-: 0 0 0) (10- 23+ 23+: 0 -1 -1) [1 2 2] 0 [0 1 2] 9 -0.250000 GraphAddEntries: 1 (5- 5- 5-: -1 0 0) (5- 11+ 11+: -1 0 0) [1 1 1] 0 2 (10- 10- 10-: 0 1 0) (10- 23+ 23+: 0 0 -1) [1 2 2] 0 [0 1 2] 10 -0.250000 GraphAddEntries: 1 (11+ 5- 5-: 1 0 0) (11+ 11+ 11+: 1 0 0) [1 1 1] 0 2 (23+ 10- 10-: 0 0 0) (23+ 23+ 23+: 0 -1 -1) [1 2 2] 0 [0 1 2] 7 -0.250000 GraphAddEntries: 1 (11+ 5- 5-: 1 0 0) (11+ 11+ 11+: 1 0 0) [1 1 1] 0 2 (23+ 10- 10-: 0 1 0) (23+ 23+ 23+: 0 0 -1) [1 2 2] 0 [0 1 2] 8 -0.250000 GraphAddEntries: 1 (11+ 5- 5-: 1 0 0) (11+ 11+ 11+: 1 0 0) [1 1 1] 0 2 (23+ 10- 10-: 0 0 1) (23+ 23+ 23+: 0 -1 0) [1 2 2] 0 [0 1 2] 9 -0.250000 GraphAddEntries: 1 (11+ 5- 5-: 1 0 0) (11+ 11+ 11+: 1 0 0) [1 1 1] 0 2 (23+ 10- 10-: 0 1 1) (23+ 23+ 23+: 0 0 0) [1 2 2] 0 [0 1 2] 10 -0.250000 GraphAddEntries: 1 (5- 5- 5-: 0 -1 0) (11+ 5- 11+: 0 -1 0) [1 1 1] 0 2 (10- 10- 10-: 0 0 1) (23+ 10- 23+: -1 0 0) [2 1 2] 0 [0 1 2] 7 -0.250000 GraphAddEntries: 1 (5- 5- 5-: 0 -1 0) (11+ 5- 11+: 0 -1 0) [1 1 1] 0 2 (10- 10- 10-: 0 0 0) (23+ 10- 23+: -1 0 -1) [2 1 2] 0 [0 1 2] 8 -0.250000 GraphAddEntries: 1 (5- 5- 5-: 0 -1 0) (11+ 5- 11+: 0 -1 0) [1 1 1] 0 2 (10- 10- 10-: 1 0 1) (23+ 10- 23+: 0 0 0) [2 1 2] 0 [0 1 2] 9 -0.250000 GraphAddEntries: 1 (5- 5- 5-: 0 -1 0) (11+ 5- 11+: 0 -1 0) [1 1 1] 0 2 (10- 10- 10-: 1 0 0) (23+ 10- 23+: 0 0 -1) [2 1 2] 0 [0 1 2] 10 -0.250000 GraphAddEntries: 1 (5- 11+ 5-: 0 1 0) (11+ 11+ 11+: 0 1 0) [1 1 1] 0 2 (10- 23+ 10-: 0 0 0) (23+ 23+ 23+: -1 0 -1) [2 1 2] 0 [0 1 2] 7 -0.250000 GraphAddEntries: 1 (5- 11+ 5-: 0 1 0) (11+ 11+ 11+: 0 1 0) [1 1 1] 0 2 (10- 23+ 10-: 0 0 1) (23+ 23+ 23+: -1 0 0) [2 1 2] 0 [0 1 2] 8 -0.250000 GraphAddEntries: 1 (5- 11+ 5-: 0 1 0) (11+ 11+ 11+: 0 1 0) [1 1 1] 0 2 (10- 23+ 10-: 1 0 0) (23+ 23+ 23+: 0 0 -1) [2 1 2] 0 [0 1 2] 9 -0.250000 GraphAddEntries: 1 (5- 11+ 5-: 0 1 0) (11+ 11+ 11+: 0 1 0) [1 1 1] 0 2 (10- 23+ 10-: 1 0 1) (23+ 23+ 23+: 0 0 0) [2 1 2] 0 [0 1 2] 10 -0.250000 GraphAddEntries: 1 (5- 5- 5-: 0 0 -1) (11+ 11+ 5-: 0 0 -1) [1 1 1] 0 2 (10- 10- 10-: 0 0 0) (23+ 23+ 10-: -1 -1 0) [2 2 1] 0 [0 1 2] 7 -0.250000 GraphAddEntries: 1 (5- 5- 5-: 0 0 -1) (11+ 11+ 5-: 0 0 -1) [1 1 1] 0 2 (10- 10- 10-: 0 1 0) (23+ 23+ 10-: -1 0 0) [2 2 1] 0 [0 1 2] 8 -0.250000 GraphAddEntries: 1 (5- 5- 5-: 0 0 -1) (11+ 11+ 5-: 0 0 -1) [1 1 1] 0 2 (10- 10- 10-: 1 0 0) (23+ 23+ 10-: 0 -1 0) [2 2 1] 0 [0 1 2] 9 -0.250000 GraphAddEntries: 1 (5- 5- 5-: 0 0 -1) (11+ 11+ 5-: 0 0 -1) [1 1 1] 0 2 (10- 10- 10-: 1 1 0) (23+ 23+ 10-: 0 0 0) [2 2 1] 0 [0 1 2] 10 -0.250000 GraphAddEntries: 1 (5- 5- 11+: 0 0 1) (11+ 11+ 11+: 0 0 1) [1 1 1] 0 2 (10- 10- 23+: 1 0 0) (23+ 23+ 23+: 0 -1 0) [2 2 1] 0 [0 1 2] 7 -0.250000 GraphAddEntries: 1 (5- 5- 11+: 0 0 1) (11+ 11+ 11+: 0 0 1) [1 1 1] 0 2 (10- 10- 23+: 1 1 0) (23+ 23+ 23+: 0 0 0) [2 2 1] 0 [0 1 2] 8 -0.250000 GraphAddEntries: 1 (5- 5- 11+: 0 0 1) (11+ 11+ 11+: 0 0 1) [1 1 1] 0 2 (10- 10- 23+: 0 0 0) (23+ 23+ 23+: -1 -1 0) [2 2 1] 0 [0 1 2] 9 -0.250000 GraphAddEntries: 1 (5- 5- 11+: 0 0 1) (11+ 11+ 11+: 0 0 1) [1 1 1] 0 2 (10- 10- 23+: 0 1 0) (23+ 23+ 23+: -1 0 0) [2 2 1] 0 [0 1 2] 10 -0.250000 GraphAddEntries: 1 (4- 4- 4-: 0 0 0) (4- 13+ 4-: 0 -1 0) [1 2 1] 0 0 (2- 2- 2-: -1 0 0) (2- 6+ 2-: -1 0 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 1 (4- 4- 4-: 0 1 0) (4- 13+ 4-: 0 0 0) [1 2 1] 0 0 (2- 2- 2-: -1 0 0) (2- 6+ 2-: -1 0 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 1 (13+ 4- 13+: 0 0 0) (13+ 13+ 13+: 0 -1 0) [1 2 1] 0 0 (6+ 2- 6+: 1 0 0) (6+ 6+ 6+: 1 0 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 1 (13+ 4- 13+: 0 1 0) (13+ 13+ 13+: 0 0 0) [1 2 1] 0 0 (6+ 2- 6+: 1 0 0) (6+ 6+ 6+: 1 0 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 1 (13+ 4- 4-: 0 0 0) (13+ 13+ 4-: 0 -1 0) [1 2 1] 0 0 (6+ 2- 2-: 1 0 0) (6+ 6+ 2-: 1 0 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 1 (13+ 4- 4-: 0 1 0) (13+ 13+ 4-: 0 0 0) [1 2 1] 0 0 (6+ 2- 2-: 1 0 0) (6+ 6+ 2-: 1 0 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 1 (4- 4- 13+: 0 0 0) (4- 13+ 13+: 0 -1 0) [1 2 1] 0 0 (2- 2- 6+: -1 0 0) (2- 6+ 6+: -1 0 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 1 (4- 4- 13+: 0 1 0) (4- 13+ 13+: 0 0 0) [1 2 1] 0 0 (2- 2- 6+: -1 0 0) (2- 6+ 6+: -1 0 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 1 (4- 4- 4-: 2 0 0) (13+ 4- 4-: -1 0 0) [2 1 1] 0 0 (2- 2- 2-: 1 -1 0) (6+ 2- 2-: 0 -1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 1 (4- 4- 4-: 0 0 2) (4- 4- 13+: 0 0 -1) [1 1 2] 0 0 (2- 2- 2-: 0 -1 1) (2- 2- 6+: 0 -1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 1 (4- 4- 13+: 2 0 0) (13+ 4- 13+: -1 0 0) [2 1 1] 0 0 (2- 2- 6+: 1 -1 0) (6+ 2- 6+: 0 -1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 1 (13+ 4- 4-: 0 0 2) (13+ 4- 13+: 0 0 -1) [1 1 2] 0 0 (6+ 2- 2-: 0 -1 1) (6+ 2- 6+: 0 -1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 1 (4- 4- 4-: 1 0 0) (13+ 4- 4-: -2 0 0) [2 1 1] 0 0 (2- 2- 2-: 0 -1 0) (6+ 2- 2-: -1 -1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 1 (4- 4- 4-: 0 0 1) (4- 4- 13+: 0 0 -2) [1 1 2] 0 0 (2- 2- 2-: 0 -1 0) (2- 2- 6+: 0 -1 -1) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 1 (4- 4- 13+: 1 0 0) (13+ 4- 13+: -2 0 0) [2 1 1] 0 0 (2- 2- 6+: 0 -1 0) (6+ 2- 6+: -1 -1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 1 (13+ 4- 4-: 0 0 1) (13+ 4- 13+: 0 0 -2) [1 1 2] 0 0 (6+ 2- 2-: 0 -1 0) (6+ 2- 6+: 0 -1 -1) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 1 (4- 13+ 4-: 2 0 0) (13+ 13+ 4-: -1 0 0) [2 1 1] 0 0 (2- 6+ 2-: 1 1 0) (6+ 6+ 2-: 0 1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 1 (4- 13+ 4-: 0 0 2) (4- 13+ 13+: 0 0 -1) [1 1 2] 0 0 (2- 6+ 2-: 0 1 1) (2- 6+ 6+: 0 1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 1 (4- 13+ 13+: 2 0 0) (13+ 13+ 13+: -1 0 0) [2 1 1] 0 0 (2- 6+ 6+: 1 1 0) (6+ 6+ 6+: 0 1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 1 (13+ 13+ 4-: 0 0 2) (13+ 13+ 13+: 0 0 -1) [1 1 2] 0 0 (6+ 6+ 2-: 0 1 1) (6+ 6+ 6+: 0 1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 1 (4- 13+ 4-: 1 0 0) (13+ 13+ 4-: -2 0 0) [2 1 1] 0 0 (2- 6+ 2-: 0 1 0) (6+ 6+ 2-: -1 1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 1 (4- 13+ 4-: 0 0 1) (4- 13+ 13+: 0 0 -2) [1 1 2] 0 0 (2- 6+ 2-: 0 1 0) (2- 6+ 6+: 0 1 -1) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 1 (4- 13+ 13+: 1 0 0) (13+ 13+ 13+: -2 0 0) [2 1 1] 0 0 (2- 6+ 6+: 0 1 0) (6+ 6+ 6+: -1 1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 1 (13+ 13+ 4-: 0 0 1) (13+ 13+ 13+: 0 0 -2) [1 1 2] 0 0 (6+ 6+ 2-: 0 1 0) (6+ 6+ 6+: 0 1 -1) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 1 (4- 4- 4-: 0 0 0) (4- 4- 4-: 0 0 0) [1 1 1] 0 0 (2- 2- 2-: 0 -1 0) (2- 2- 2-: 0 -1 0) [1 1 1] 0 [0 1 2] 9 -1.000000 GraphAddEntries: 1 (13+ 4- 4-: 0 0 0) (13+ 4- 4-: 0 0 0) [1 1 1] 0 0 (6+ 2- 2-: 0 -1 0) (6+ 2- 2-: 0 -1 0) [1 1 1] 0 [0 1 2] 9 -1.000000 GraphAddEntries: 1 (4- 4- 13+: 0 0 0) (4- 4- 13+: 0 0 0) [1 1 1] 0 0 (2- 2- 6+: 0 -1 0) (2- 2- 6+: 0 -1 0) [1 1 1] 0 [0 1 2] 9 -1.000000 GraphAddEntries: 1 (13+ 4- 13+: 0 0 0) (13+ 4- 13+: 0 0 0) [1 1 1] 0 0 (6+ 2- 6+: 0 -1 0) (6+ 2- 6+: 0 -1 0) [1 1 1] 0 [0 1 2] 9 -1.000000 GraphAddEntries: 1 (4- 13+ 4-: 0 0 0) (4- 13+ 4-: 0 0 0) [1 1 1] 0 0 (2- 6+ 2-: 0 1 0) (2- 6+ 2-: 0 1 0) [1 1 1] 0 [0 1 2] 9 -1.000000 GraphAddEntries: 1 (13+ 13+ 4-: 0 0 0) (13+ 13+ 4-: 0 0 0) [1 1 1] 0 0 (6+ 6+ 2-: 0 1 0) (6+ 6+ 2-: 0 1 0) [1 1 1] 0 [0 1 2] 9 -1.000000 GraphAddEntries: 1 (4- 13+ 13+: 0 0 0) (4- 13+ 13+: 0 0 0) [1 1 1] 0 0 (2- 6+ 6+: 0 1 0) (2- 6+ 6+: 0 1 0) [1 1 1] 0 [0 1 2] 9 -1.000000 GraphAddEntries: 1 (13+ 13+ 13+: 0 0 0) (13+ 13+ 13+: 0 0 0) [1 1 1] 0 0 (6+ 6+ 6+: 0 1 0) (6+ 6+ 6+: 0 1 0) [1 1 1] 0 [0 1 2] 9 -1.000000 GraphAddEntries: 2 (10- 10- 10-: 0 0 1) (10- 23+ 23+: 0 -1 -2) [1 2 2] 0 1 (5- 5- 5-: -1 0 0) (5- 11+ 11+: -1 0 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 2 (10- 10- 10-: 0 1 1) (10- 23+ 23+: 0 0 -2) [1 2 2] 0 1 (5- 5- 5-: -1 0 0) (5- 11+ 11+: -1 0 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 2 (10- 10- 10-: 0 0 2) (10- 23+ 23+: 0 -1 -1) [1 2 2] 0 1 (5- 5- 5-: -1 0 1) (5- 11+ 11+: -1 0 0) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 2 (10- 10- 10-: 0 1 2) (10- 23+ 23+: 0 0 -1) [1 2 2] 0 1 (5- 5- 5-: -1 0 1) (5- 11+ 11+: -1 0 0) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 2 (23+ 10- 10-: 0 0 2) (23+ 23+ 23+: 0 -1 -1) [1 2 2] 0 1 (11+ 5- 5-: 1 0 1) (11+ 11+ 11+: 1 0 0) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 2 (23+ 10- 10-: 0 1 2) (23+ 23+ 23+: 0 0 -1) [1 2 2] 0 1 (11+ 5- 5-: 1 0 1) (11+ 11+ 11+: 1 0 0) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 2 (23+ 10- 10-: 0 0 1) (23+ 23+ 23+: 0 -1 -2) [1 2 2] 0 1 (11+ 5- 5-: 1 0 0) (11+ 11+ 11+: 1 0 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 2 (23+ 10- 10-: 0 1 1) (23+ 23+ 23+: 0 0 -2) [1 2 2] 0 1 (11+ 5- 5-: 1 0 0) (11+ 11+ 11+: 1 0 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 2 (10- 10- 10-: 2 0 1) (23+ 10- 23+: -1 0 -2) [2 1 2] 0 1 (5- 5- 5-: 1 -1 0) (11+ 5- 11+: 0 -1 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 2 (10- 10- 10-: 2 0 2) (23+ 10- 23+: -1 0 -1) [2 1 2] 0 1 (5- 5- 5-: 1 -1 1) (11+ 5- 11+: 0 -1 0) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 2 (10- 10- 10-: 1 0 1) (23+ 10- 23+: -2 0 -2) [2 1 2] 0 1 (5- 5- 5-: 0 -1 0) (11+ 5- 11+: -1 -1 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 2 (10- 10- 10-: 1 0 2) (23+ 10- 23+: -2 0 -1) [2 1 2] 0 1 (5- 5- 5-: 0 -1 1) (11+ 5- 11+: -1 -1 0) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 2 (10- 23+ 10-: 2 0 2) (23+ 23+ 23+: -1 0 -1) [2 1 2] 0 1 (5- 11+ 5-: 1 1 1) (11+ 11+ 11+: 0 1 0) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 2 (10- 23+ 10-: 2 0 1) (23+ 23+ 23+: -1 0 -2) [2 1 2] 0 1 (5- 11+ 5-: 1 1 0) (11+ 11+ 11+: 0 1 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 2 (10- 23+ 10-: 1 0 2) (23+ 23+ 23+: -2 0 -1) [2 1 2] 0 1 (5- 11+ 5-: 0 1 1) (11+ 11+ 11+: -1 1 0) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 2 (10- 23+ 10-: 1 0 1) (23+ 23+ 23+: -2 0 -2) [2 1 2] 0 1 (5- 11+ 5-: 0 1 0) (11+ 11+ 11+: -1 1 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 2 (10- 10- 10-: 0 0 0) (23+ 23+ 10-: -1 -1 0) [2 2 1] 0 1 (5- 5- 5-: 0 0 -1) (11+ 11+ 5-: 0 0 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 2 (10- 10- 10-: 0 1 0) (23+ 23+ 10-: -1 0 0) [2 2 1] 0 1 (5- 5- 5-: 0 0 -1) (11+ 11+ 5-: 0 0 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 2 (10- 10- 10-: 1 0 0) (23+ 23+ 10-: 0 -1 0) [2 2 1] 0 1 (5- 5- 5-: 0 0 -1) (11+ 11+ 5-: 0 0 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 2 (10- 10- 10-: 1 1 0) (23+ 23+ 10-: 0 0 0) [2 2 1] 0 1 (5- 5- 5-: 0 0 -1) (11+ 11+ 5-: 0 0 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 2 (10- 10- 23+: 1 0 0) (23+ 23+ 23+: 0 -1 0) [2 2 1] 0 1 (5- 5- 11+: 0 0 1) (11+ 11+ 11+: 0 0 1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 2 (10- 10- 23+: 1 1 0) (23+ 23+ 23+: 0 0 0) [2 2 1] 0 1 (5- 5- 11+: 0 0 1) (11+ 11+ 11+: 0 0 1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 2 (10- 10- 23+: 0 0 0) (23+ 23+ 23+: -1 -1 0) [2 2 1] 0 1 (5- 5- 11+: 0 0 1) (11+ 11+ 11+: 0 0 1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 2 (10- 10- 23+: 0 1 0) (23+ 23+ 23+: -1 0 0) [2 2 1] 0 1 (5- 5- 11+: 0 0 1) (11+ 11+ 11+: 0 0 1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 2 (11- 11- 11-: -1 0 0) (11- 21+ 21+: -1 0 0) [1 1 1] 0 3 (22- 22- 22-: 0 0 1) (22- 43+ 43+: 0 -1 0) [1 2 2] 0 [0 1 2] 7 -0.250000 GraphAddEntries: 2 (11- 11- 11-: -1 0 0) (11- 21+ 21+: -1 0 0) [1 1 1] 0 3 (22- 22- 22-: 0 1 1) (22- 43+ 43+: 0 0 0) [1 2 2] 0 [0 1 2] 8 -0.250000 GraphAddEntries: 2 (11- 11- 11-: -1 0 0) (11- 21+ 21+: -1 0 0) [1 1 1] 0 3 (22- 22- 22-: 0 0 0) (22- 43+ 43+: 0 -1 -1) [1 2 2] 0 [0 1 2] 9 -0.250000 GraphAddEntries: 2 (11- 11- 11-: -1 0 0) (11- 21+ 21+: -1 0 0) [1 1 1] 0 3 (22- 22- 22-: 0 1 0) (22- 43+ 43+: 0 0 -1) [1 2 2] 0 [0 1 2] 10 -0.250000 GraphAddEntries: 2 (21+ 11- 11-: 1 0 0) (21+ 21+ 21+: 1 0 0) [1 1 1] 0 3 (43+ 22- 22-: 0 0 0) (43+ 43+ 43+: 0 -1 -1) [1 2 2] 0 [0 1 2] 7 -0.250000 GraphAddEntries: 2 (21+ 11- 11-: 1 0 0) (21+ 21+ 21+: 1 0 0) [1 1 1] 0 3 (43+ 22- 22-: 0 1 0) (43+ 43+ 43+: 0 0 -1) [1 2 2] 0 [0 1 2] 8 -0.250000 GraphAddEntries: 2 (21+ 11- 11-: 1 0 0) (21+ 21+ 21+: 1 0 0) [1 1 1] 0 3 (43+ 22- 22-: 0 0 1) (43+ 43+ 43+: 0 -1 0) [1 2 2] 0 [0 1 2] 9 -0.250000 GraphAddEntries: 2 (21+ 11- 11-: 1 0 0) (21+ 21+ 21+: 1 0 0) [1 1 1] 0 3 (43+ 22- 22-: 0 1 1) (43+ 43+ 43+: 0 0 0) [1 2 2] 0 [0 1 2] 10 -0.250000 GraphAddEntries: 2 (11- 11- 11-: 0 -1 0) (21+ 11- 21+: 0 -1 0) [1 1 1] 0 3 (22- 22- 22-: 0 0 1) (43+ 22- 43+: -1 0 0) [2 1 2] 0 [0 1 2] 7 -0.250000 GraphAddEntries: 2 (11- 11- 11-: 0 -1 0) (21+ 11- 21+: 0 -1 0) [1 1 1] 0 3 (22- 22- 22-: 0 0 0) (43+ 22- 43+: -1 0 -1) [2 1 2] 0 [0 1 2] 8 -0.250000 GraphAddEntries: 2 (11- 11- 11-: 0 -1 0) (21+ 11- 21+: 0 -1 0) [1 1 1] 0 3 (22- 22- 22-: 1 0 1) (43+ 22- 43+: 0 0 0) [2 1 2] 0 [0 1 2] 9 -0.250000 GraphAddEntries: 2 (11- 11- 11-: 0 -1 0) (21+ 11- 21+: 0 -1 0) [1 1 1] 0 3 (22- 22- 22-: 1 0 0) (43+ 22- 43+: 0 0 -1) [2 1 2] 0 [0 1 2] 10 -0.250000 GraphAddEntries: 2 (11- 21+ 11-: 0 1 0) (21+ 21+ 21+: 0 1 0) [1 1 1] 0 3 (22- 43+ 22-: 0 0 0) (43+ 43+ 43+: -1 0 -1) [2 1 2] 0 [0 1 2] 7 -0.250000 GraphAddEntries: 2 (11- 21+ 11-: 0 1 0) (21+ 21+ 21+: 0 1 0) [1 1 1] 0 3 (22- 43+ 22-: 0 0 1) (43+ 43+ 43+: -1 0 0) [2 1 2] 0 [0 1 2] 8 -0.250000 GraphAddEntries: 2 (11- 21+ 11-: 0 1 0) (21+ 21+ 21+: 0 1 0) [1 1 1] 0 3 (22- 43+ 22-: 1 0 0) (43+ 43+ 43+: 0 0 -1) [2 1 2] 0 [0 1 2] 9 -0.250000 GraphAddEntries: 2 (11- 21+ 11-: 0 1 0) (21+ 21+ 21+: 0 1 0) [1 1 1] 0 3 (22- 43+ 22-: 1 0 1) (43+ 43+ 43+: 0 0 0) [2 1 2] 0 [0 1 2] 10 -0.250000 GraphAddEntries: 2 (11- 11- 11-: 0 0 -1) (21+ 21+ 11-: 0 0 -1) [1 1 1] 0 3 (22- 22- 22-: 0 0 0) (43+ 43+ 22-: -1 -1 0) [2 2 1] 0 [0 1 2] 7 -0.250000 GraphAddEntries: 2 (11- 11- 11-: 0 0 -1) (21+ 21+ 11-: 0 0 -1) [1 1 1] 0 3 (22- 22- 22-: 0 1 0) (43+ 43+ 22-: -1 0 0) [2 2 1] 0 [0 1 2] 8 -0.250000 GraphAddEntries: 2 (11- 11- 11-: 0 0 -1) (21+ 21+ 11-: 0 0 -1) [1 1 1] 0 3 (22- 22- 22-: 1 0 0) (43+ 43+ 22-: 0 -1 0) [2 2 1] 0 [0 1 2] 9 -0.250000 GraphAddEntries: 2 (11- 11- 11-: 0 0 -1) (21+ 21+ 11-: 0 0 -1) [1 1 1] 0 3 (22- 22- 22-: 1 1 0) (43+ 43+ 22-: 0 0 0) [2 2 1] 0 [0 1 2] 10 -0.250000 GraphAddEntries: 2 (11- 11- 21+: 0 0 1) (21+ 21+ 21+: 0 0 1) [1 1 1] 0 3 (22- 22- 43+: 1 0 0) (43+ 43+ 43+: 0 -1 0) [2 2 1] 0 [0 1 2] 7 -0.250000 GraphAddEntries: 2 (11- 11- 21+: 0 0 1) (21+ 21+ 21+: 0 0 1) [1 1 1] 0 3 (22- 22- 43+: 1 1 0) (43+ 43+ 43+: 0 0 0) [2 2 1] 0 [0 1 2] 8 -0.250000 GraphAddEntries: 2 (11- 11- 21+: 0 0 1) (21+ 21+ 21+: 0 0 1) [1 1 1] 0 3 (22- 22- 43+: 0 0 0) (43+ 43+ 43+: -1 -1 0) [2 2 1] 0 [0 1 2] 9 -0.250000 GraphAddEntries: 2 (11- 11- 21+: 0 0 1) (21+ 21+ 21+: 0 0 1) [1 1 1] 0 3 (22- 22- 43+: 0 1 0) (43+ 43+ 43+: -1 0 0) [2 2 1] 0 [0 1 2] 10 -0.250000 GraphAddEntries: 2 (10- 10- 10-: 0 0 0) (10- 23+ 10-: 0 -1 0) [1 2 1] 0 1 (5- 5- 5-: -1 0 0) (5- 11+ 5-: -1 0 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 2 (10- 10- 10-: 0 1 0) (10- 23+ 10-: 0 0 0) [1 2 1] 0 1 (5- 5- 5-: -1 0 0) (5- 11+ 5-: -1 0 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 2 (23+ 10- 23+: 0 0 0) (23+ 23+ 23+: 0 -1 0) [1 2 1] 0 1 (11+ 5- 11+: 1 0 0) (11+ 11+ 11+: 1 0 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 2 (23+ 10- 23+: 0 1 0) (23+ 23+ 23+: 0 0 0) [1 2 1] 0 1 (11+ 5- 11+: 1 0 0) (11+ 11+ 11+: 1 0 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 2 (23+ 10- 10-: 0 0 0) (23+ 23+ 10-: 0 -1 0) [1 2 1] 0 1 (11+ 5- 5-: 1 0 0) (11+ 11+ 5-: 1 0 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 2 (23+ 10- 10-: 0 1 0) (23+ 23+ 10-: 0 0 0) [1 2 1] 0 1 (11+ 5- 5-: 1 0 0) (11+ 11+ 5-: 1 0 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 2 (10- 10- 23+: 0 0 0) (10- 23+ 23+: 0 -1 0) [1 2 1] 0 1 (5- 5- 11+: -1 0 0) (5- 11+ 11+: -1 0 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 2 (10- 10- 23+: 0 1 0) (10- 23+ 23+: 0 0 0) [1 2 1] 0 1 (5- 5- 11+: -1 0 0) (5- 11+ 11+: -1 0 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 2 (10- 10- 10-: 2 0 0) (23+ 10- 10-: -1 0 0) [2 1 1] 0 1 (5- 5- 5-: 1 -1 0) (11+ 5- 5-: 0 -1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 2 (10- 10- 10-: 0 0 2) (10- 10- 23+: 0 0 -1) [1 1 2] 0 1 (5- 5- 5-: 0 -1 1) (5- 5- 11+: 0 -1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 2 (10- 10- 23+: 2 0 0) (23+ 10- 23+: -1 0 0) [2 1 1] 0 1 (5- 5- 11+: 1 -1 0) (11+ 5- 11+: 0 -1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 2 (23+ 10- 10-: 0 0 2) (23+ 10- 23+: 0 0 -1) [1 1 2] 0 1 (11+ 5- 5-: 0 -1 1) (11+ 5- 11+: 0 -1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 2 (10- 10- 10-: 1 0 0) (23+ 10- 10-: -2 0 0) [2 1 1] 0 1 (5- 5- 5-: 0 -1 0) (11+ 5- 5-: -1 -1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 2 (10- 10- 10-: 0 0 1) (10- 10- 23+: 0 0 -2) [1 1 2] 0 1 (5- 5- 5-: 0 -1 0) (5- 5- 11+: 0 -1 -1) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 2 (10- 10- 23+: 1 0 0) (23+ 10- 23+: -2 0 0) [2 1 1] 0 1 (5- 5- 11+: 0 -1 0) (11+ 5- 11+: -1 -1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 2 (23+ 10- 10-: 0 0 1) (23+ 10- 23+: 0 0 -2) [1 1 2] 0 1 (11+ 5- 5-: 0 -1 0) (11+ 5- 11+: 0 -1 -1) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 2 (10- 23+ 10-: 2 0 0) (23+ 23+ 10-: -1 0 0) [2 1 1] 0 1 (5- 11+ 5-: 1 1 0) (11+ 11+ 5-: 0 1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 2 (10- 23+ 10-: 0 0 2) (10- 23+ 23+: 0 0 -1) [1 1 2] 0 1 (5- 11+ 5-: 0 1 1) (5- 11+ 11+: 0 1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 2 (10- 23+ 23+: 2 0 0) (23+ 23+ 23+: -1 0 0) [2 1 1] 0 1 (5- 11+ 11+: 1 1 0) (11+ 11+ 11+: 0 1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 2 (23+ 23+ 10-: 0 0 2) (23+ 23+ 23+: 0 0 -1) [1 1 2] 0 1 (11+ 11+ 5-: 0 1 1) (11+ 11+ 11+: 0 1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 2 (10- 23+ 10-: 1 0 0) (23+ 23+ 10-: -2 0 0) [2 1 1] 0 1 (5- 11+ 5-: 0 1 0) (11+ 11+ 5-: -1 1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 2 (10- 23+ 10-: 0 0 1) (10- 23+ 23+: 0 0 -2) [1 1 2] 0 1 (5- 11+ 5-: 0 1 0) (5- 11+ 11+: 0 1 -1) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 2 (10- 23+ 23+: 1 0 0) (23+ 23+ 23+: -2 0 0) [2 1 1] 0 1 (5- 11+ 11+: 0 1 0) (11+ 11+ 11+: -1 1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 2 (23+ 23+ 10-: 0 0 1) (23+ 23+ 23+: 0 0 -2) [1 1 2] 0 1 (11+ 11+ 5-: 0 1 0) (11+ 11+ 11+: 0 1 -1) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 2 (10- 10- 10-: 0 0 0) (10- 10- 10-: 0 0 0) [1 1 1] 0 1 (5- 5- 5-: 0 -1 0) (5- 5- 5-: 0 -1 0) [1 1 1] 0 [0 1 2] 9 -1.000000 GraphAddEntries: 2 (23+ 10- 10-: 0 0 0) (23+ 10- 10-: 0 0 0) [1 1 1] 0 1 (11+ 5- 5-: 0 -1 0) (11+ 5- 5-: 0 -1 0) [1 1 1] 0 [0 1 2] 9 -1.000000 GraphAddEntries: 2 (10- 10- 23+: 0 0 0) (10- 10- 23+: 0 0 0) [1 1 1] 0 1 (5- 5- 11+: 0 -1 0) (5- 5- 11+: 0 -1 0) [1 1 1] 0 [0 1 2] 9 -1.000000 GraphAddEntries: 2 (23+ 10- 23+: 0 0 0) (23+ 10- 23+: 0 0 0) [1 1 1] 0 1 (11+ 5- 11+: 0 -1 0) (11+ 5- 11+: 0 -1 0) [1 1 1] 0 [0 1 2] 9 -1.000000 GraphAddEntries: 2 (10- 23+ 10-: 0 0 0) (10- 23+ 10-: 0 0 0) [1 1 1] 0 1 (5- 11+ 5-: 0 1 0) (5- 11+ 5-: 0 1 0) [1 1 1] 0 [0 1 2] 9 -1.000000 GraphAddEntries: 2 (23+ 23+ 10-: 0 0 0) (23+ 23+ 10-: 0 0 0) [1 1 1] 0 1 (11+ 11+ 5-: 0 1 0) (11+ 11+ 5-: 0 1 0) [1 1 1] 0 [0 1 2] 9 -1.000000 GraphAddEntries: 2 (10- 23+ 23+: 0 0 0) (10- 23+ 23+: 0 0 0) [1 1 1] 0 1 (5- 11+ 11+: 0 1 0) (5- 11+ 11+: 0 1 0) [1 1 1] 0 [0 1 2] 9 -1.000000 GraphAddEntries: 2 (23+ 23+ 23+: 0 0 0) (23+ 23+ 23+: 0 0 0) [1 1 1] 0 1 (11+ 11+ 11+: 0 1 0) (11+ 11+ 11+: 0 1 0) [1 1 1] 0 [0 1 2] 9 -1.000000 GraphAddEntries: 3 (22- 22- 22-: 0 0 1) (22- 43+ 43+: 0 -1 -2) [1 2 2] 0 2 (11- 11- 11-: -1 0 0) (11- 21+ 21+: -1 0 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 3 (22- 22- 22-: 0 1 1) (22- 43+ 43+: 0 0 -2) [1 2 2] 0 2 (11- 11- 11-: -1 0 0) (11- 21+ 21+: -1 0 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 3 (22- 22- 22-: 0 0 2) (22- 43+ 43+: 0 -1 -1) [1 2 2] 0 2 (11- 11- 11-: -1 0 1) (11- 21+ 21+: -1 0 0) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 3 (22- 22- 22-: 0 1 2) (22- 43+ 43+: 0 0 -1) [1 2 2] 0 2 (11- 11- 11-: -1 0 1) (11- 21+ 21+: -1 0 0) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 3 (43+ 22- 22-: 0 0 2) (43+ 43+ 43+: 0 -1 -1) [1 2 2] 0 2 (21+ 11- 11-: 1 0 1) (21+ 21+ 21+: 1 0 0) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 3 (43+ 22- 22-: 0 1 2) (43+ 43+ 43+: 0 0 -1) [1 2 2] 0 2 (21+ 11- 11-: 1 0 1) (21+ 21+ 21+: 1 0 0) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 3 (43+ 22- 22-: 0 0 1) (43+ 43+ 43+: 0 -1 -2) [1 2 2] 0 2 (21+ 11- 11-: 1 0 0) (21+ 21+ 21+: 1 0 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 3 (43+ 22- 22-: 0 1 1) (43+ 43+ 43+: 0 0 -2) [1 2 2] 0 2 (21+ 11- 11-: 1 0 0) (21+ 21+ 21+: 1 0 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 3 (22- 22- 22-: 2 0 1) (43+ 22- 43+: -1 0 -2) [2 1 2] 0 2 (11- 11- 11-: 1 -1 0) (21+ 11- 21+: 0 -1 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 3 (22- 22- 22-: 2 0 2) (43+ 22- 43+: -1 0 -1) [2 1 2] 0 2 (11- 11- 11-: 1 -1 1) (21+ 11- 21+: 0 -1 0) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 3 (22- 22- 22-: 1 0 1) (43+ 22- 43+: -2 0 -2) [2 1 2] 0 2 (11- 11- 11-: 0 -1 0) (21+ 11- 21+: -1 -1 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 3 (22- 22- 22-: 1 0 2) (43+ 22- 43+: -2 0 -1) [2 1 2] 0 2 (11- 11- 11-: 0 -1 1) (21+ 11- 21+: -1 -1 0) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 3 (22- 43+ 22-: 2 0 2) (43+ 43+ 43+: -1 0 -1) [2 1 2] 0 2 (11- 21+ 11-: 1 1 1) (21+ 21+ 21+: 0 1 0) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 3 (22- 43+ 22-: 2 0 1) (43+ 43+ 43+: -1 0 -2) [2 1 2] 0 2 (11- 21+ 11-: 1 1 0) (21+ 21+ 21+: 0 1 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 3 (22- 43+ 22-: 1 0 2) (43+ 43+ 43+: -2 0 -1) [2 1 2] 0 2 (11- 21+ 11-: 0 1 1) (21+ 21+ 21+: -1 1 0) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 3 (22- 43+ 22-: 1 0 1) (43+ 43+ 43+: -2 0 -2) [2 1 2] 0 2 (11- 21+ 11-: 0 1 0) (21+ 21+ 21+: -1 1 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 3 (22- 22- 22-: 0 0 0) (43+ 43+ 22-: -1 -1 0) [2 2 1] 0 2 (11- 11- 11-: 0 0 -1) (21+ 21+ 11-: 0 0 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 3 (22- 22- 22-: 0 1 0) (43+ 43+ 22-: -1 0 0) [2 2 1] 0 2 (11- 11- 11-: 0 0 -1) (21+ 21+ 11-: 0 0 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 3 (22- 22- 22-: 1 0 0) (43+ 43+ 22-: 0 -1 0) [2 2 1] 0 2 (11- 11- 11-: 0 0 -1) (21+ 21+ 11-: 0 0 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 3 (22- 22- 22-: 1 1 0) (43+ 43+ 22-: 0 0 0) [2 2 1] 0 2 (11- 11- 11-: 0 0 -1) (21+ 21+ 11-: 0 0 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 3 (22- 22- 43+: 1 0 0) (43+ 43+ 43+: 0 -1 0) [2 2 1] 0 2 (11- 11- 21+: 0 0 1) (21+ 21+ 21+: 0 0 1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 3 (22- 22- 43+: 1 1 0) (43+ 43+ 43+: 0 0 0) [2 2 1] 0 2 (11- 11- 21+: 0 0 1) (21+ 21+ 21+: 0 0 1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 3 (22- 22- 43+: 0 0 0) (43+ 43+ 43+: -1 -1 0) [2 2 1] 0 2 (11- 11- 21+: 0 0 1) (21+ 21+ 21+: 0 0 1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 3 (22- 22- 43+: 0 1 0) (43+ 43+ 43+: -1 0 0) [2 2 1] 0 2 (11- 11- 21+: 0 0 1) (21+ 21+ 21+: 0 0 1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 3 (23- 23- 23-: -1 0 0) (23- 40+ 40+: -1 0 0) [1 1 1] 0 4 (46- 46- 46-: 0 0 1) (46- 81+ 81+: 0 -1 0) [1 2 2] 0 [0 1 2] 7 -0.250000 GraphAddEntries: 3 (23- 23- 23-: -1 0 0) (23- 40+ 40+: -1 0 0) [1 1 1] 0 4 (46- 46- 46-: 0 1 1) (46- 81+ 81+: 0 0 0) [1 2 2] 0 [0 1 2] 8 -0.250000 GraphAddEntries: 3 (23- 23- 23-: -1 0 0) (23- 40+ 40+: -1 0 0) [1 1 1] 0 4 (46- 46- 46-: 0 0 0) (46- 81+ 81+: 0 -1 -1) [1 2 2] 0 [0 1 2] 9 -0.250000 GraphAddEntries: 3 (23- 23- 23-: -1 0 0) (23- 40+ 40+: -1 0 0) [1 1 1] 0 4 (46- 46- 46-: 0 1 0) (46- 81+ 81+: 0 0 -1) [1 2 2] 0 [0 1 2] 10 -0.250000 GraphAddEntries: 3 (40+ 23- 23-: 1 0 0) (40+ 40+ 40+: 1 0 0) [1 1 1] 0 4 (81+ 46- 46-: 0 0 0) (81+ 81+ 81+: 0 -1 -1) [1 2 2] 0 [0 1 2] 7 -0.250000 GraphAddEntries: 3 (40+ 23- 23-: 1 0 0) (40+ 40+ 40+: 1 0 0) [1 1 1] 0 4 (81+ 46- 46-: 0 1 0) (81+ 81+ 81+: 0 0 -1) [1 2 2] 0 [0 1 2] 8 -0.250000 GraphAddEntries: 3 (40+ 23- 23-: 1 0 0) (40+ 40+ 40+: 1 0 0) [1 1 1] 0 4 (81+ 46- 46-: 0 0 1) (81+ 81+ 81+: 0 -1 0) [1 2 2] 0 [0 1 2] 9 -0.250000 GraphAddEntries: 3 (40+ 23- 23-: 1 0 0) (40+ 40+ 40+: 1 0 0) [1 1 1] 0 4 (81+ 46- 46-: 0 1 1) (81+ 81+ 81+: 0 0 0) [1 2 2] 0 [0 1 2] 10 -0.250000 GraphAddEntries: 3 (23- 23- 23-: 0 -1 0) (40+ 23- 40+: 0 -1 0) [1 1 1] 0 4 (46- 46- 46-: 0 0 1) (81+ 46- 81+: -1 0 0) [2 1 2] 0 [0 1 2] 7 -0.250000 GraphAddEntries: 3 (23- 23- 23-: 0 -1 0) (40+ 23- 40+: 0 -1 0) [1 1 1] 0 4 (46- 46- 46-: 0 0 0) (81+ 46- 81+: -1 0 -1) [2 1 2] 0 [0 1 2] 8 -0.250000 GraphAddEntries: 3 (23- 23- 23-: 0 -1 0) (40+ 23- 40+: 0 -1 0) [1 1 1] 0 4 (46- 46- 46-: 1 0 1) (81+ 46- 81+: 0 0 0) [2 1 2] 0 [0 1 2] 9 -0.250000 GraphAddEntries: 3 (23- 23- 23-: 0 -1 0) (40+ 23- 40+: 0 -1 0) [1 1 1] 0 4 (46- 46- 46-: 1 0 0) (81+ 46- 81+: 0 0 -1) [2 1 2] 0 [0 1 2] 10 -0.250000 GraphAddEntries: 3 (23- 40+ 23-: 0 1 0) (40+ 40+ 40+: 0 1 0) [1 1 1] 0 4 (46- 81+ 46-: 0 0 0) (81+ 81+ 81+: -1 0 -1) [2 1 2] 0 [0 1 2] 7 -0.250000 GraphAddEntries: 3 (23- 40+ 23-: 0 1 0) (40+ 40+ 40+: 0 1 0) [1 1 1] 0 4 (46- 81+ 46-: 0 0 1) (81+ 81+ 81+: -1 0 0) [2 1 2] 0 [0 1 2] 8 -0.250000 GraphAddEntries: 3 (23- 40+ 23-: 0 1 0) (40+ 40+ 40+: 0 1 0) [1 1 1] 0 4 (46- 81+ 46-: 1 0 0) (81+ 81+ 81+: 0 0 -1) [2 1 2] 0 [0 1 2] 9 -0.250000 GraphAddEntries: 3 (23- 40+ 23-: 0 1 0) (40+ 40+ 40+: 0 1 0) [1 1 1] 0 4 (46- 81+ 46-: 1 0 1) (81+ 81+ 81+: 0 0 0) [2 1 2] 0 [0 1 2] 10 -0.250000 GraphAddEntries: 3 (23- 23- 23-: 0 0 -1) (40+ 40+ 23-: 0 0 -1) [1 1 1] 0 4 (46- 46- 46-: 0 0 0) (81+ 81+ 46-: -1 -1 0) [2 2 1] 0 [0 1 2] 7 -0.250000 GraphAddEntries: 3 (23- 23- 23-: 0 0 -1) (40+ 40+ 23-: 0 0 -1) [1 1 1] 0 4 (46- 46- 46-: 0 1 0) (81+ 81+ 46-: -1 0 0) [2 2 1] 0 [0 1 2] 8 -0.250000 GraphAddEntries: 3 (23- 23- 23-: 0 0 -1) (40+ 40+ 23-: 0 0 -1) [1 1 1] 0 4 (46- 46- 46-: 1 0 0) (81+ 81+ 46-: 0 -1 0) [2 2 1] 0 [0 1 2] 9 -0.250000 GraphAddEntries: 3 (23- 23- 23-: 0 0 -1) (40+ 40+ 23-: 0 0 -1) [1 1 1] 0 4 (46- 46- 46-: 1 1 0) (81+ 81+ 46-: 0 0 0) [2 2 1] 0 [0 1 2] 10 -0.250000 GraphAddEntries: 3 (23- 23- 40+: 0 0 1) (40+ 40+ 40+: 0 0 1) [1 1 1] 0 4 (46- 46- 81+: 1 0 0) (81+ 81+ 81+: 0 -1 0) [2 2 1] 0 [0 1 2] 7 -0.250000 GraphAddEntries: 3 (23- 23- 40+: 0 0 1) (40+ 40+ 40+: 0 0 1) [1 1 1] 0 4 (46- 46- 81+: 1 1 0) (81+ 81+ 81+: 0 0 0) [2 2 1] 0 [0 1 2] 8 -0.250000 GraphAddEntries: 3 (23- 23- 40+: 0 0 1) (40+ 40+ 40+: 0 0 1) [1 1 1] 0 4 (46- 46- 81+: 0 0 0) (81+ 81+ 81+: -1 -1 0) [2 2 1] 0 [0 1 2] 9 -0.250000 GraphAddEntries: 3 (23- 23- 40+: 0 0 1) (40+ 40+ 40+: 0 0 1) [1 1 1] 0 4 (46- 46- 81+: 0 1 0) (81+ 81+ 81+: -1 0 0) [2 2 1] 0 [0 1 2] 10 -0.250000 GraphAddEntries: 3 (22- 22- 22-: 0 0 0) (22- 43+ 22-: 0 -1 0) [1 2 1] 0 2 (11- 11- 11-: -1 0 0) (11- 21+ 11-: -1 0 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 3 (22- 22- 22-: 0 1 0) (22- 43+ 22-: 0 0 0) [1 2 1] 0 2 (11- 11- 11-: -1 0 0) (11- 21+ 11-: -1 0 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 3 (43+ 22- 43+: 0 0 0) (43+ 43+ 43+: 0 -1 0) [1 2 1] 0 2 (21+ 11- 21+: 1 0 0) (21+ 21+ 21+: 1 0 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 3 (43+ 22- 43+: 0 1 0) (43+ 43+ 43+: 0 0 0) [1 2 1] 0 2 (21+ 11- 21+: 1 0 0) (21+ 21+ 21+: 1 0 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 3 (43+ 22- 22-: 0 0 0) (43+ 43+ 22-: 0 -1 0) [1 2 1] 0 2 (21+ 11- 11-: 1 0 0) (21+ 21+ 11-: 1 0 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 3 (43+ 22- 22-: 0 1 0) (43+ 43+ 22-: 0 0 0) [1 2 1] 0 2 (21+ 11- 11-: 1 0 0) (21+ 21+ 11-: 1 0 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 3 (22- 22- 43+: 0 0 0) (22- 43+ 43+: 0 -1 0) [1 2 1] 0 2 (11- 11- 21+: -1 0 0) (11- 21+ 21+: -1 0 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 3 (22- 22- 43+: 0 1 0) (22- 43+ 43+: 0 0 0) [1 2 1] 0 2 (11- 11- 21+: -1 0 0) (11- 21+ 21+: -1 0 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 3 (22- 22- 22-: 2 0 0) (43+ 22- 22-: -1 0 0) [2 1 1] 0 2 (11- 11- 11-: 1 -1 0) (21+ 11- 11-: 0 -1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 3 (22- 22- 22-: 0 0 2) (22- 22- 43+: 0 0 -1) [1 1 2] 0 2 (11- 11- 11-: 0 -1 1) (11- 11- 21+: 0 -1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 3 (22- 22- 43+: 2 0 0) (43+ 22- 43+: -1 0 0) [2 1 1] 0 2 (11- 11- 21+: 1 -1 0) (21+ 11- 21+: 0 -1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 3 (43+ 22- 22-: 0 0 2) (43+ 22- 43+: 0 0 -1) [1 1 2] 0 2 (21+ 11- 11-: 0 -1 1) (21+ 11- 21+: 0 -1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 3 (22- 22- 22-: 1 0 0) (43+ 22- 22-: -2 0 0) [2 1 1] 0 2 (11- 11- 11-: 0 -1 0) (21+ 11- 11-: -1 -1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 3 (22- 22- 22-: 0 0 1) (22- 22- 43+: 0 0 -2) [1 1 2] 0 2 (11- 11- 11-: 0 -1 0) (11- 11- 21+: 0 -1 -1) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 3 (22- 22- 43+: 1 0 0) (43+ 22- 43+: -2 0 0) [2 1 1] 0 2 (11- 11- 21+: 0 -1 0) (21+ 11- 21+: -1 -1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 3 (43+ 22- 22-: 0 0 1) (43+ 22- 43+: 0 0 -2) [1 1 2] 0 2 (21+ 11- 11-: 0 -1 0) (21+ 11- 21+: 0 -1 -1) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 3 (22- 43+ 22-: 2 0 0) (43+ 43+ 22-: -1 0 0) [2 1 1] 0 2 (11- 21+ 11-: 1 1 0) (21+ 21+ 11-: 0 1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 3 (22- 43+ 22-: 0 0 2) (22- 43+ 43+: 0 0 -1) [1 1 2] 0 2 (11- 21+ 11-: 0 1 1) (11- 21+ 21+: 0 1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 3 (22- 43+ 43+: 2 0 0) (43+ 43+ 43+: -1 0 0) [2 1 1] 0 2 (11- 21+ 21+: 1 1 0) (21+ 21+ 21+: 0 1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 3 (43+ 43+ 22-: 0 0 2) (43+ 43+ 43+: 0 0 -1) [1 1 2] 0 2 (21+ 21+ 11-: 0 1 1) (21+ 21+ 21+: 0 1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 3 (22- 43+ 22-: 1 0 0) (43+ 43+ 22-: -2 0 0) [2 1 1] 0 2 (11- 21+ 11-: 0 1 0) (21+ 21+ 11-: -1 1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 3 (22- 43+ 22-: 0 0 1) (22- 43+ 43+: 0 0 -2) [1 1 2] 0 2 (11- 21+ 11-: 0 1 0) (11- 21+ 21+: 0 1 -1) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 3 (22- 43+ 43+: 1 0 0) (43+ 43+ 43+: -2 0 0) [2 1 1] 0 2 (11- 21+ 21+: 0 1 0) (21+ 21+ 21+: -1 1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 3 (43+ 43+ 22-: 0 0 1) (43+ 43+ 43+: 0 0 -2) [1 1 2] 0 2 (21+ 21+ 11-: 0 1 0) (21+ 21+ 21+: 0 1 -1) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 3 (22- 22- 22-: 0 0 0) (22- 22- 22-: 0 0 0) [1 1 1] 0 2 (11- 11- 11-: 0 -1 0) (11- 11- 11-: 0 -1 0) [1 1 1] 0 [0 1 2] 9 -1.000000 GraphAddEntries: 3 (43+ 22- 22-: 0 0 0) (43+ 22- 22-: 0 0 0) [1 1 1] 0 2 (21+ 11- 11-: 0 -1 0) (21+ 11- 11-: 0 -1 0) [1 1 1] 0 [0 1 2] 9 -1.000000 GraphAddEntries: 3 (22- 22- 43+: 0 0 0) (22- 22- 43+: 0 0 0) [1 1 1] 0 2 (11- 11- 21+: 0 -1 0) (11- 11- 21+: 0 -1 0) [1 1 1] 0 [0 1 2] 9 -1.000000 GraphAddEntries: 3 (43+ 22- 43+: 0 0 0) (43+ 22- 43+: 0 0 0) [1 1 1] 0 2 (21+ 11- 21+: 0 -1 0) (21+ 11- 21+: 0 -1 0) [1 1 1] 0 [0 1 2] 9 -1.000000 GraphAddEntries: 3 (22- 43+ 22-: 0 0 0) (22- 43+ 22-: 0 0 0) [1 1 1] 0 2 (11- 21+ 11-: 0 1 0) (11- 21+ 11-: 0 1 0) [1 1 1] 0 [0 1 2] 9 -1.000000 GraphAddEntries: 3 (43+ 43+ 22-: 0 0 0) (43+ 43+ 22-: 0 0 0) [1 1 1] 0 2 (21+ 21+ 11-: 0 1 0) (21+ 21+ 11-: 0 1 0) [1 1 1] 0 [0 1 2] 9 -1.000000 GraphAddEntries: 3 (22- 43+ 43+: 0 0 0) (22- 43+ 43+: 0 0 0) [1 1 1] 0 2 (11- 21+ 21+: 0 1 0) (11- 21+ 21+: 0 1 0) [1 1 1] 0 [0 1 2] 9 -1.000000 GraphAddEntries: 3 (43+ 43+ 43+: 0 0 0) (43+ 43+ 43+: 0 0 0) [1 1 1] 0 2 (21+ 21+ 21+: 0 1 0) (21+ 21+ 21+: 0 1 0) [1 1 1] 0 [0 1 2] 9 -1.000000 GraphAddEntries: 4 (46- 46- 46-: 0 0 1) (46- 81+ 81+: 0 -1 -2) [1 2 2] 0 3 (23- 23- 23-: -1 0 0) (23- 40+ 40+: -1 0 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 4 (46- 46- 46-: 0 1 1) (46- 81+ 81+: 0 0 -2) [1 2 2] 0 3 (23- 23- 23-: -1 0 0) (23- 40+ 40+: -1 0 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 4 (46- 46- 46-: 0 0 2) (46- 81+ 81+: 0 -1 -1) [1 2 2] 0 3 (23- 23- 23-: -1 0 1) (23- 40+ 40+: -1 0 0) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 4 (46- 46- 46-: 0 1 2) (46- 81+ 81+: 0 0 -1) [1 2 2] 0 3 (23- 23- 23-: -1 0 1) (23- 40+ 40+: -1 0 0) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 4 (81+ 46- 46-: 0 0 2) (81+ 81+ 81+: 0 -1 -1) [1 2 2] 0 3 (40+ 23- 23-: 1 0 1) (40+ 40+ 40+: 1 0 0) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 4 (81+ 46- 46-: 0 1 2) (81+ 81+ 81+: 0 0 -1) [1 2 2] 0 3 (40+ 23- 23-: 1 0 1) (40+ 40+ 40+: 1 0 0) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 4 (81+ 46- 46-: 0 0 1) (81+ 81+ 81+: 0 -1 -2) [1 2 2] 0 3 (40+ 23- 23-: 1 0 0) (40+ 40+ 40+: 1 0 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 4 (81+ 46- 46-: 0 1 1) (81+ 81+ 81+: 0 0 -2) [1 2 2] 0 3 (40+ 23- 23-: 1 0 0) (40+ 40+ 40+: 1 0 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 4 (46- 46- 46-: 2 0 1) (81+ 46- 81+: -1 0 -2) [2 1 2] 0 3 (23- 23- 23-: 1 -1 0) (40+ 23- 40+: 0 -1 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 4 (46- 46- 46-: 2 0 2) (81+ 46- 81+: -1 0 -1) [2 1 2] 0 3 (23- 23- 23-: 1 -1 1) (40+ 23- 40+: 0 -1 0) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 4 (46- 46- 46-: 1 0 1) (81+ 46- 81+: -2 0 -2) [2 1 2] 0 3 (23- 23- 23-: 0 -1 0) (40+ 23- 40+: -1 -1 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 4 (46- 46- 46-: 1 0 2) (81+ 46- 81+: -2 0 -1) [2 1 2] 0 3 (23- 23- 23-: 0 -1 1) (40+ 23- 40+: -1 -1 0) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 4 (46- 81+ 46-: 2 0 2) (81+ 81+ 81+: -1 0 -1) [2 1 2] 0 3 (23- 40+ 23-: 1 1 1) (40+ 40+ 40+: 0 1 0) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 4 (46- 81+ 46-: 2 0 1) (81+ 81+ 81+: -1 0 -2) [2 1 2] 0 3 (23- 40+ 23-: 1 1 0) (40+ 40+ 40+: 0 1 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 4 (46- 81+ 46-: 1 0 2) (81+ 81+ 81+: -2 0 -1) [2 1 2] 0 3 (23- 40+ 23-: 0 1 1) (40+ 40+ 40+: -1 1 0) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 4 (46- 81+ 46-: 1 0 1) (81+ 81+ 81+: -2 0 -2) [2 1 2] 0 3 (23- 40+ 23-: 0 1 0) (40+ 40+ 40+: -1 1 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 4 (46- 46- 46-: 0 0 0) (81+ 81+ 46-: -1 -1 0) [2 2 1] 0 3 (23- 23- 23-: 0 0 -1) (40+ 40+ 23-: 0 0 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 4 (46- 46- 46-: 0 1 0) (81+ 81+ 46-: -1 0 0) [2 2 1] 0 3 (23- 23- 23-: 0 0 -1) (40+ 40+ 23-: 0 0 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 4 (46- 46- 46-: 1 0 0) (81+ 81+ 46-: 0 -1 0) [2 2 1] 0 3 (23- 23- 23-: 0 0 -1) (40+ 40+ 23-: 0 0 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 4 (46- 46- 46-: 1 1 0) (81+ 81+ 46-: 0 0 0) [2 2 1] 0 3 (23- 23- 23-: 0 0 -1) (40+ 40+ 23-: 0 0 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 4 (46- 46- 81+: 1 0 0) (81+ 81+ 81+: 0 -1 0) [2 2 1] 0 3 (23- 23- 40+: 0 0 1) (40+ 40+ 40+: 0 0 1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 4 (46- 46- 81+: 1 1 0) (81+ 81+ 81+: 0 0 0) [2 2 1] 0 3 (23- 23- 40+: 0 0 1) (40+ 40+ 40+: 0 0 1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 4 (46- 46- 81+: 0 0 0) (81+ 81+ 81+: -1 -1 0) [2 2 1] 0 3 (23- 23- 40+: 0 0 1) (40+ 40+ 40+: 0 0 1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 4 (46- 46- 81+: 0 1 0) (81+ 81+ 81+: -1 0 0) [2 2 1] 0 3 (23- 23- 40+: 0 0 1) (40+ 40+ 40+: 0 0 1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 4 (49- 49- 49-: -1 0 0) (49- 60+ 60+: -1 0 0) [1 1 1] 0 5 (98- 98- 98-: 0 0 1) (98- 121+ 121+: 0 -1 0) [1 2 2] 0 [0 1 2] 7 -0.250000 GraphAddEntries: 4 (49- 49- 49-: -1 0 0) (49- 60+ 60+: -1 0 0) [1 1 1] 0 5 (98- 98- 98-: 0 1 1) (98- 121+ 121+: 0 0 0) [1 2 2] 0 [0 1 2] 8 -0.250000 GraphAddEntries: 4 (49- 49- 49-: -1 0 0) (49- 60+ 60+: -1 0 0) [1 1 1] 0 5 (98- 98- 98-: 0 0 0) (98- 121+ 121+: 0 -1 -1) [1 2 2] 0 [0 1 2] 9 -0.250000 GraphAddEntries: 4 (49- 49- 49-: -1 0 0) (49- 60+ 60+: -1 0 0) [1 1 1] 0 5 (98- 98- 98-: 0 1 0) (98- 121+ 121+: 0 0 -1) [1 2 2] 0 [0 1 2] 10 -0.250000 GraphAddEntries: 4 (60+ 49- 49-: 1 0 0) (60+ 60+ 60+: 1 0 0) [1 1 1] 0 5 (121+ 98- 98-: 0 0 0) (121+ 121+ 121+: 0 -1 -1) [1 2 2] 0 [0 1 2] 7 -0.250000 GraphAddEntries: 4 (60+ 49- 49-: 1 0 0) (60+ 60+ 60+: 1 0 0) [1 1 1] 0 5 (121+ 98- 98-: 0 1 0) (121+ 121+ 121+: 0 0 -1) [1 2 2] 0 [0 1 2] 8 -0.250000 GraphAddEntries: 4 (60+ 49- 49-: 1 0 0) (60+ 60+ 60+: 1 0 0) [1 1 1] 0 5 (121+ 98- 98-: 0 0 1) (121+ 121+ 121+: 0 -1 0) [1 2 2] 0 [0 1 2] 9 -0.250000 GraphAddEntries: 4 (60+ 49- 49-: 1 0 0) (60+ 60+ 60+: 1 0 0) [1 1 1] 0 5 (121+ 98- 98-: 0 1 1) (121+ 121+ 121+: 0 0 0) [1 2 2] 0 [0 1 2] 10 -0.250000 GraphAddEntries: 4 (49- 49- 49-: 0 -1 0) (60+ 49- 60+: 0 -1 0) [1 1 1] 0 5 (98- 98- 98-: 0 0 1) (121+ 98- 121+: -1 0 0) [2 1 2] 0 [0 1 2] 7 -0.250000 GraphAddEntries: 4 (49- 49- 49-: 0 -1 0) (60+ 49- 60+: 0 -1 0) [1 1 1] 0 5 (98- 98- 98-: 0 0 0) (121+ 98- 121+: -1 0 -1) [2 1 2] 0 [0 1 2] 8 -0.250000 GraphAddEntries: 4 (49- 49- 49-: 0 -1 0) (60+ 49- 60+: 0 -1 0) [1 1 1] 0 5 (98- 98- 98-: 1 0 1) (121+ 98- 121+: 0 0 0) [2 1 2] 0 [0 1 2] 9 -0.250000 GraphAddEntries: 4 (49- 49- 49-: 0 -1 0) (60+ 49- 60+: 0 -1 0) [1 1 1] 0 5 (98- 98- 98-: 1 0 0) (121+ 98- 121+: 0 0 -1) [2 1 2] 0 [0 1 2] 10 -0.250000 GraphAddEntries: 4 (49- 60+ 49-: 0 1 0) (60+ 60+ 60+: 0 1 0) [1 1 1] 0 5 (98- 121+ 98-: 0 0 0) (121+ 121+ 121+: -1 0 -1) [2 1 2] 0 [0 1 2] 7 -0.250000 GraphAddEntries: 4 (49- 60+ 49-: 0 1 0) (60+ 60+ 60+: 0 1 0) [1 1 1] 0 5 (98- 121+ 98-: 0 0 1) (121+ 121+ 121+: -1 0 0) [2 1 2] 0 [0 1 2] 8 -0.250000 GraphAddEntries: 4 (49- 60+ 49-: 0 1 0) (60+ 60+ 60+: 0 1 0) [1 1 1] 0 5 (98- 121+ 98-: 1 0 0) (121+ 121+ 121+: 0 0 -1) [2 1 2] 0 [0 1 2] 9 -0.250000 GraphAddEntries: 4 (49- 60+ 49-: 0 1 0) (60+ 60+ 60+: 0 1 0) [1 1 1] 0 5 (98- 121+ 98-: 1 0 1) (121+ 121+ 121+: 0 0 0) [2 1 2] 0 [0 1 2] 10 -0.250000 GraphAddEntries: 4 (49- 49- 49-: 0 0 -1) (60+ 60+ 49-: 0 0 -1) [1 1 1] 0 5 (98- 98- 98-: 0 0 0) (121+ 121+ 98-: -1 -1 0) [2 2 1] 0 [0 1 2] 7 -0.250000 GraphAddEntries: 4 (49- 49- 49-: 0 0 -1) (60+ 60+ 49-: 0 0 -1) [1 1 1] 0 5 (98- 98- 98-: 0 1 0) (121+ 121+ 98-: -1 0 0) [2 2 1] 0 [0 1 2] 8 -0.250000 GraphAddEntries: 4 (49- 49- 49-: 0 0 -1) (60+ 60+ 49-: 0 0 -1) [1 1 1] 0 5 (98- 98- 98-: 1 0 0) (121+ 121+ 98-: 0 -1 0) [2 2 1] 0 [0 1 2] 9 -0.250000 GraphAddEntries: 4 (49- 49- 49-: 0 0 -1) (60+ 60+ 49-: 0 0 -1) [1 1 1] 0 5 (98- 98- 98-: 1 1 0) (121+ 121+ 98-: 0 0 0) [2 2 1] 0 [0 1 2] 10 -0.250000 GraphAddEntries: 4 (49- 49- 60+: 0 0 1) (60+ 60+ 60+: 0 0 1) [1 1 1] 0 5 (98- 98- 121+: 1 0 0) (121+ 121+ 121+: 0 -1 0) [2 2 1] 0 [0 1 2] 7 -0.250000 GraphAddEntries: 4 (49- 49- 60+: 0 0 1) (60+ 60+ 60+: 0 0 1) [1 1 1] 0 5 (98- 98- 121+: 1 1 0) (121+ 121+ 121+: 0 0 0) [2 2 1] 0 [0 1 2] 8 -0.250000 GraphAddEntries: 4 (49- 49- 60+: 0 0 1) (60+ 60+ 60+: 0 0 1) [1 1 1] 0 5 (98- 98- 121+: 0 0 0) (121+ 121+ 121+: -1 -1 0) [2 2 1] 0 [0 1 2] 9 -0.250000 GraphAddEntries: 4 (49- 49- 60+: 0 0 1) (60+ 60+ 60+: 0 0 1) [1 1 1] 0 5 (98- 98- 121+: 0 1 0) (121+ 121+ 121+: -1 0 0) [2 2 1] 0 [0 1 2] 10 -0.250000 GraphAddEntries: 4 (46- 46- 46-: 0 0 0) (46- 81+ 46-: 0 -1 0) [1 2 1] 0 3 (23- 23- 23-: -1 0 0) (23- 40+ 23-: -1 0 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 4 (46- 46- 46-: 0 1 0) (46- 81+ 46-: 0 0 0) [1 2 1] 0 3 (23- 23- 23-: -1 0 0) (23- 40+ 23-: -1 0 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 4 (81+ 46- 81+: 0 0 0) (81+ 81+ 81+: 0 -1 0) [1 2 1] 0 3 (40+ 23- 40+: 1 0 0) (40+ 40+ 40+: 1 0 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 4 (81+ 46- 81+: 0 1 0) (81+ 81+ 81+: 0 0 0) [1 2 1] 0 3 (40+ 23- 40+: 1 0 0) (40+ 40+ 40+: 1 0 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 4 (81+ 46- 46-: 0 0 0) (81+ 81+ 46-: 0 -1 0) [1 2 1] 0 3 (40+ 23- 23-: 1 0 0) (40+ 40+ 23-: 1 0 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 4 (81+ 46- 46-: 0 1 0) (81+ 81+ 46-: 0 0 0) [1 2 1] 0 3 (40+ 23- 23-: 1 0 0) (40+ 40+ 23-: 1 0 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 4 (46- 46- 81+: 0 0 0) (46- 81+ 81+: 0 -1 0) [1 2 1] 0 3 (23- 23- 40+: -1 0 0) (23- 40+ 40+: -1 0 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 4 (46- 46- 81+: 0 1 0) (46- 81+ 81+: 0 0 0) [1 2 1] 0 3 (23- 23- 40+: -1 0 0) (23- 40+ 40+: -1 0 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 4 (46- 46- 46-: 2 0 0) (81+ 46- 46-: -1 0 0) [2 1 1] 0 3 (23- 23- 23-: 1 -1 0) (40+ 23- 23-: 0 -1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 4 (46- 46- 46-: 0 0 2) (46- 46- 81+: 0 0 -1) [1 1 2] 0 3 (23- 23- 23-: 0 -1 1) (23- 23- 40+: 0 -1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 4 (46- 46- 81+: 2 0 0) (81+ 46- 81+: -1 0 0) [2 1 1] 0 3 (23- 23- 40+: 1 -1 0) (40+ 23- 40+: 0 -1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 4 (81+ 46- 46-: 0 0 2) (81+ 46- 81+: 0 0 -1) [1 1 2] 0 3 (40+ 23- 23-: 0 -1 1) (40+ 23- 40+: 0 -1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 4 (46- 46- 46-: 1 0 0) (81+ 46- 46-: -2 0 0) [2 1 1] 0 3 (23- 23- 23-: 0 -1 0) (40+ 23- 23-: -1 -1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 4 (46- 46- 46-: 0 0 1) (46- 46- 81+: 0 0 -2) [1 1 2] 0 3 (23- 23- 23-: 0 -1 0) (23- 23- 40+: 0 -1 -1) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 4 (46- 46- 81+: 1 0 0) (81+ 46- 81+: -2 0 0) [2 1 1] 0 3 (23- 23- 40+: 0 -1 0) (40+ 23- 40+: -1 -1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 4 (81+ 46- 46-: 0 0 1) (81+ 46- 81+: 0 0 -2) [1 1 2] 0 3 (40+ 23- 23-: 0 -1 0) (40+ 23- 40+: 0 -1 -1) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 4 (46- 81+ 46-: 2 0 0) (81+ 81+ 46-: -1 0 0) [2 1 1] 0 3 (23- 40+ 23-: 1 1 0) (40+ 40+ 23-: 0 1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 4 (46- 81+ 46-: 0 0 2) (46- 81+ 81+: 0 0 -1) [1 1 2] 0 3 (23- 40+ 23-: 0 1 1) (23- 40+ 40+: 0 1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 4 (46- 81+ 81+: 2 0 0) (81+ 81+ 81+: -1 0 0) [2 1 1] 0 3 (23- 40+ 40+: 1 1 0) (40+ 40+ 40+: 0 1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 4 (81+ 81+ 46-: 0 0 2) (81+ 81+ 81+: 0 0 -1) [1 1 2] 0 3 (40+ 40+ 23-: 0 1 1) (40+ 40+ 40+: 0 1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 4 (46- 81+ 46-: 1 0 0) (81+ 81+ 46-: -2 0 0) [2 1 1] 0 3 (23- 40+ 23-: 0 1 0) (40+ 40+ 23-: -1 1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 4 (46- 81+ 46-: 0 0 1) (46- 81+ 81+: 0 0 -2) [1 1 2] 0 3 (23- 40+ 23-: 0 1 0) (23- 40+ 40+: 0 1 -1) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 4 (46- 81+ 81+: 1 0 0) (81+ 81+ 81+: -2 0 0) [2 1 1] 0 3 (23- 40+ 40+: 0 1 0) (40+ 40+ 40+: -1 1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 4 (81+ 81+ 46-: 0 0 1) (81+ 81+ 81+: 0 0 -2) [1 1 2] 0 3 (40+ 40+ 23-: 0 1 0) (40+ 40+ 40+: 0 1 -1) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 4 (46- 46- 46-: 0 0 0) (46- 46- 46-: 0 0 0) [1 1 1] 0 3 (23- 23- 23-: 0 -1 0) (23- 23- 23-: 0 -1 0) [1 1 1] 0 [0 1 2] 9 -1.000000 GraphAddEntries: 4 (81+ 46- 46-: 0 0 0) (81+ 46- 46-: 0 0 0) [1 1 1] 0 3 (40+ 23- 23-: 0 -1 0) (40+ 23- 23-: 0 -1 0) [1 1 1] 0 [0 1 2] 9 -1.000000 GraphAddEntries: 4 (46- 46- 81+: 0 0 0) (46- 46- 81+: 0 0 0) [1 1 1] 0 3 (23- 23- 40+: 0 -1 0) (23- 23- 40+: 0 -1 0) [1 1 1] 0 [0 1 2] 9 -1.000000 GraphAddEntries: 4 (81+ 46- 81+: 0 0 0) (81+ 46- 81+: 0 0 0) [1 1 1] 0 3 (40+ 23- 40+: 0 -1 0) (40+ 23- 40+: 0 -1 0) [1 1 1] 0 [0 1 2] 9 -1.000000 GraphAddEntries: 4 (46- 81+ 46-: 0 0 0) (46- 81+ 46-: 0 0 0) [1 1 1] 0 3 (23- 40+ 23-: 0 1 0) (23- 40+ 23-: 0 1 0) [1 1 1] 0 [0 1 2] 9 -1.000000 GraphAddEntries: 4 (81+ 81+ 46-: 0 0 0) (81+ 81+ 46-: 0 0 0) [1 1 1] 0 3 (40+ 40+ 23-: 0 1 0) (40+ 40+ 23-: 0 1 0) [1 1 1] 0 [0 1 2] 9 -1.000000 GraphAddEntries: 4 (46- 81+ 81+: 0 0 0) (46- 81+ 81+: 0 0 0) [1 1 1] 0 3 (23- 40+ 40+: 0 1 0) (23- 40+ 40+: 0 1 0) [1 1 1] 0 [0 1 2] 9 -1.000000 GraphAddEntries: 4 (81+ 81+ 81+: 0 0 0) (81+ 81+ 81+: 0 0 0) [1 1 1] 0 3 (40+ 40+ 40+: 0 1 0) (40+ 40+ 40+: 0 1 0) [1 1 1] 0 [0 1 2] 9 -1.000000 GraphAddEntries: 5 (98- 98- 98-: 0 0 1) (98- 121+ 121+: 0 -1 -2) [1 2 2] 0 4 (49- 49- 49-: -1 0 0) (49- 60+ 60+: -1 0 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 5 (98- 98- 98-: 0 1 1) (98- 121+ 121+: 0 0 -2) [1 2 2] 0 4 (49- 49- 49-: -1 0 0) (49- 60+ 60+: -1 0 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 5 (98- 98- 98-: 0 0 2) (98- 121+ 121+: 0 -1 -1) [1 2 2] 0 4 (49- 49- 49-: -1 0 1) (49- 60+ 60+: -1 0 0) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 5 (98- 98- 98-: 0 1 2) (98- 121+ 121+: 0 0 -1) [1 2 2] 0 4 (49- 49- 49-: -1 0 1) (49- 60+ 60+: -1 0 0) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 5 (121+ 98- 98-: 0 0 2) (121+ 121+ 121+: 0 -1 -1) [1 2 2] 0 4 (60+ 49- 49-: 1 0 1) (60+ 60+ 60+: 1 0 0) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 5 (121+ 98- 98-: 0 1 2) (121+ 121+ 121+: 0 0 -1) [1 2 2] 0 4 (60+ 49- 49-: 1 0 1) (60+ 60+ 60+: 1 0 0) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 5 (121+ 98- 98-: 0 0 1) (121+ 121+ 121+: 0 -1 -2) [1 2 2] 0 4 (60+ 49- 49-: 1 0 0) (60+ 60+ 60+: 1 0 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 5 (121+ 98- 98-: 0 1 1) (121+ 121+ 121+: 0 0 -2) [1 2 2] 0 4 (60+ 49- 49-: 1 0 0) (60+ 60+ 60+: 1 0 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 5 (98- 98- 98-: 2 0 1) (121+ 98- 121+: -1 0 -2) [2 1 2] 0 4 (49- 49- 49-: 1 -1 0) (60+ 49- 60+: 0 -1 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 5 (98- 98- 98-: 2 0 2) (121+ 98- 121+: -1 0 -1) [2 1 2] 0 4 (49- 49- 49-: 1 -1 1) (60+ 49- 60+: 0 -1 0) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 5 (98- 98- 98-: 1 0 1) (121+ 98- 121+: -2 0 -2) [2 1 2] 0 4 (49- 49- 49-: 0 -1 0) (60+ 49- 60+: -1 -1 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 5 (98- 98- 98-: 1 0 2) (121+ 98- 121+: -2 0 -1) [2 1 2] 0 4 (49- 49- 49-: 0 -1 1) (60+ 49- 60+: -1 -1 0) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 5 (98- 121+ 98-: 2 0 2) (121+ 121+ 121+: -1 0 -1) [2 1 2] 0 4 (49- 60+ 49-: 1 1 1) (60+ 60+ 60+: 0 1 0) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 5 (98- 121+ 98-: 2 0 1) (121+ 121+ 121+: -1 0 -2) [2 1 2] 0 4 (49- 60+ 49-: 1 1 0) (60+ 60+ 60+: 0 1 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 5 (98- 121+ 98-: 1 0 2) (121+ 121+ 121+: -2 0 -1) [2 1 2] 0 4 (49- 60+ 49-: 0 1 1) (60+ 60+ 60+: -1 1 0) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 5 (98- 121+ 98-: 1 0 1) (121+ 121+ 121+: -2 0 -2) [2 1 2] 0 4 (49- 60+ 49-: 0 1 0) (60+ 60+ 60+: -1 1 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 5 (98- 98- 98-: 0 0 0) (121+ 121+ 98-: -1 -1 0) [2 2 1] 0 4 (49- 49- 49-: 0 0 -1) (60+ 60+ 49-: 0 0 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 5 (98- 98- 98-: 0 1 0) (121+ 121+ 98-: -1 0 0) [2 2 1] 0 4 (49- 49- 49-: 0 0 -1) (60+ 60+ 49-: 0 0 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 5 (98- 98- 98-: 1 0 0) (121+ 121+ 98-: 0 -1 0) [2 2 1] 0 4 (49- 49- 49-: 0 0 -1) (60+ 60+ 49-: 0 0 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 5 (98- 98- 98-: 1 1 0) (121+ 121+ 98-: 0 0 0) [2 2 1] 0 4 (49- 49- 49-: 0 0 -1) (60+ 60+ 49-: 0 0 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 5 (98- 98- 121+: 1 0 0) (121+ 121+ 121+: 0 -1 0) [2 2 1] 0 4 (49- 49- 60+: 0 0 1) (60+ 60+ 60+: 0 0 1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 5 (98- 98- 121+: 1 1 0) (121+ 121+ 121+: 0 0 0) [2 2 1] 0 4 (49- 49- 60+: 0 0 1) (60+ 60+ 60+: 0 0 1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 5 (98- 98- 121+: 0 0 0) (121+ 121+ 121+: -1 -1 0) [2 2 1] 0 4 (49- 49- 60+: 0 0 1) (60+ 60+ 60+: 0 0 1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 5 (98- 98- 121+: 0 1 0) (121+ 121+ 121+: -1 0 0) [2 2 1] 0 4 (49- 49- 60+: 0 0 1) (60+ 60+ 60+: 0 0 1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 5 (100- 100- 100-: -1 0 0) (100- 115+ 115+: -1 0 0) [1 1 1] 0 6 (200- 200- 200-: 0 0 1) (200- 231+ 231+: 0 -1 0) [1 2 2] 0 [0 1 2] 7 -0.250000 GraphAddEntries: 5 (100- 100- 100-: -1 0 0) (100- 115+ 115+: -1 0 0) [1 1 1] 0 6 (200- 200- 200-: 0 1 1) (200- 231+ 231+: 0 0 0) [1 2 2] 0 [0 1 2] 8 -0.250000 GraphAddEntries: 5 (100- 100- 100-: -1 0 0) (100- 115+ 115+: -1 0 0) [1 1 1] 0 6 (200- 200- 200-: 0 0 0) (200- 231+ 231+: 0 -1 -1) [1 2 2] 0 [0 1 2] 9 -0.250000 GraphAddEntries: 5 (100- 100- 100-: -1 0 0) (100- 115+ 115+: -1 0 0) [1 1 1] 0 6 (200- 200- 200-: 0 1 0) (200- 231+ 231+: 0 0 -1) [1 2 2] 0 [0 1 2] 10 -0.250000 GraphAddEntries: 5 (115+ 100- 100-: 1 0 0) (115+ 115+ 115+: 1 0 0) [1 1 1] 0 6 (231+ 200- 200-: 0 0 0) (231+ 231+ 231+: 0 -1 -1) [1 2 2] 0 [0 1 2] 7 -0.250000 GraphAddEntries: 5 (115+ 100- 100-: 1 0 0) (115+ 115+ 115+: 1 0 0) [1 1 1] 0 6 (231+ 200- 200-: 0 1 0) (231+ 231+ 231+: 0 0 -1) [1 2 2] 0 [0 1 2] 8 -0.250000 GraphAddEntries: 5 (115+ 100- 100-: 1 0 0) (115+ 115+ 115+: 1 0 0) [1 1 1] 0 6 (231+ 200- 200-: 0 0 1) (231+ 231+ 231+: 0 -1 0) [1 2 2] 0 [0 1 2] 9 -0.250000 GraphAddEntries: 5 (115+ 100- 100-: 1 0 0) (115+ 115+ 115+: 1 0 0) [1 1 1] 0 6 (231+ 200- 200-: 0 1 1) (231+ 231+ 231+: 0 0 0) [1 2 2] 0 [0 1 2] 10 -0.250000 GraphAddEntries: 5 (100- 100- 100-: 0 -1 0) (115+ 100- 115+: 0 -1 0) [1 1 1] 0 6 (200- 200- 200-: 0 0 1) (231+ 200- 231+: -1 0 0) [2 1 2] 0 [0 1 2] 7 -0.250000 GraphAddEntries: 5 (100- 100- 100-: 0 -1 0) (115+ 100- 115+: 0 -1 0) [1 1 1] 0 6 (200- 200- 200-: 0 0 0) (231+ 200- 231+: -1 0 -1) [2 1 2] 0 [0 1 2] 8 -0.250000 GraphAddEntries: 5 (100- 100- 100-: 0 -1 0) (115+ 100- 115+: 0 -1 0) [1 1 1] 0 6 (200- 200- 200-: 1 0 1) (231+ 200- 231+: 0 0 0) [2 1 2] 0 [0 1 2] 9 -0.250000 GraphAddEntries: 5 (100- 100- 100-: 0 -1 0) (115+ 100- 115+: 0 -1 0) [1 1 1] 0 6 (200- 200- 200-: 1 0 0) (231+ 200- 231+: 0 0 -1) [2 1 2] 0 [0 1 2] 10 -0.250000 GraphAddEntries: 5 (100- 115+ 100-: 0 1 0) (115+ 115+ 115+: 0 1 0) [1 1 1] 0 6 (200- 231+ 200-: 0 0 0) (231+ 231+ 231+: -1 0 -1) [2 1 2] 0 [0 1 2] 7 -0.250000 GraphAddEntries: 5 (100- 115+ 100-: 0 1 0) (115+ 115+ 115+: 0 1 0) [1 1 1] 0 6 (200- 231+ 200-: 0 0 1) (231+ 231+ 231+: -1 0 0) [2 1 2] 0 [0 1 2] 8 -0.250000 GraphAddEntries: 5 (100- 115+ 100-: 0 1 0) (115+ 115+ 115+: 0 1 0) [1 1 1] 0 6 (200- 231+ 200-: 1 0 0) (231+ 231+ 231+: 0 0 -1) [2 1 2] 0 [0 1 2] 9 -0.250000 GraphAddEntries: 5 (100- 115+ 100-: 0 1 0) (115+ 115+ 115+: 0 1 0) [1 1 1] 0 6 (200- 231+ 200-: 1 0 1) (231+ 231+ 231+: 0 0 0) [2 1 2] 0 [0 1 2] 10 -0.250000 GraphAddEntries: 5 (100- 100- 100-: 0 0 -1) (115+ 115+ 100-: 0 0 -1) [1 1 1] 0 6 (200- 200- 200-: 0 0 0) (231+ 231+ 200-: -1 -1 0) [2 2 1] 0 [0 1 2] 7 -0.250000 GraphAddEntries: 5 (100- 100- 100-: 0 0 -1) (115+ 115+ 100-: 0 0 -1) [1 1 1] 0 6 (200- 200- 200-: 0 1 0) (231+ 231+ 200-: -1 0 0) [2 2 1] 0 [0 1 2] 8 -0.250000 GraphAddEntries: 5 (100- 100- 100-: 0 0 -1) (115+ 115+ 100-: 0 0 -1) [1 1 1] 0 6 (200- 200- 200-: 1 0 0) (231+ 231+ 200-: 0 -1 0) [2 2 1] 0 [0 1 2] 9 -0.250000 GraphAddEntries: 5 (100- 100- 100-: 0 0 -1) (115+ 115+ 100-: 0 0 -1) [1 1 1] 0 6 (200- 200- 200-: 1 1 0) (231+ 231+ 200-: 0 0 0) [2 2 1] 0 [0 1 2] 10 -0.250000 GraphAddEntries: 5 (100- 100- 115+: 0 0 1) (115+ 115+ 115+: 0 0 1) [1 1 1] 0 6 (200- 200- 231+: 1 0 0) (231+ 231+ 231+: 0 -1 0) [2 2 1] 0 [0 1 2] 7 -0.250000 GraphAddEntries: 5 (100- 100- 115+: 0 0 1) (115+ 115+ 115+: 0 0 1) [1 1 1] 0 6 (200- 200- 231+: 1 1 0) (231+ 231+ 231+: 0 0 0) [2 2 1] 0 [0 1 2] 8 -0.250000 GraphAddEntries: 5 (100- 100- 115+: 0 0 1) (115+ 115+ 115+: 0 0 1) [1 1 1] 0 6 (200- 200- 231+: 0 0 0) (231+ 231+ 231+: -1 -1 0) [2 2 1] 0 [0 1 2] 9 -0.250000 GraphAddEntries: 5 (100- 100- 115+: 0 0 1) (115+ 115+ 115+: 0 0 1) [1 1 1] 0 6 (200- 200- 231+: 0 1 0) (231+ 231+ 231+: -1 0 0) [2 2 1] 0 [0 1 2] 10 -0.250000 GraphAddEntries: 5 (98- 98- 98-: 0 0 0) (98- 121+ 98-: 0 -1 0) [1 2 1] 0 4 (49- 49- 49-: -1 0 0) (49- 60+ 49-: -1 0 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 5 (98- 98- 98-: 0 1 0) (98- 121+ 98-: 0 0 0) [1 2 1] 0 4 (49- 49- 49-: -1 0 0) (49- 60+ 49-: -1 0 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 5 (121+ 98- 121+: 0 0 0) (121+ 121+ 121+: 0 -1 0) [1 2 1] 0 4 (60+ 49- 60+: 1 0 0) (60+ 60+ 60+: 1 0 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 5 (121+ 98- 121+: 0 1 0) (121+ 121+ 121+: 0 0 0) [1 2 1] 0 4 (60+ 49- 60+: 1 0 0) (60+ 60+ 60+: 1 0 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 5 (121+ 98- 98-: 0 0 0) (121+ 121+ 98-: 0 -1 0) [1 2 1] 0 4 (60+ 49- 49-: 1 0 0) (60+ 60+ 49-: 1 0 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 5 (121+ 98- 98-: 0 1 0) (121+ 121+ 98-: 0 0 0) [1 2 1] 0 4 (60+ 49- 49-: 1 0 0) (60+ 60+ 49-: 1 0 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 5 (98- 98- 121+: 0 0 0) (98- 121+ 121+: 0 -1 0) [1 2 1] 0 4 (49- 49- 60+: -1 0 0) (49- 60+ 60+: -1 0 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 5 (98- 98- 121+: 0 1 0) (98- 121+ 121+: 0 0 0) [1 2 1] 0 4 (49- 49- 60+: -1 0 0) (49- 60+ 60+: -1 0 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 5 (98- 98- 98-: 2 0 0) (121+ 98- 98-: -1 0 0) [2 1 1] 0 4 (49- 49- 49-: 1 -1 0) (60+ 49- 49-: 0 -1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 5 (98- 98- 98-: 0 0 2) (98- 98- 121+: 0 0 -1) [1 1 2] 0 4 (49- 49- 49-: 0 -1 1) (49- 49- 60+: 0 -1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 5 (98- 98- 121+: 2 0 0) (121+ 98- 121+: -1 0 0) [2 1 1] 0 4 (49- 49- 60+: 1 -1 0) (60+ 49- 60+: 0 -1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 5 (121+ 98- 98-: 0 0 2) (121+ 98- 121+: 0 0 -1) [1 1 2] 0 4 (60+ 49- 49-: 0 -1 1) (60+ 49- 60+: 0 -1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 5 (98- 98- 98-: 1 0 0) (121+ 98- 98-: -2 0 0) [2 1 1] 0 4 (49- 49- 49-: 0 -1 0) (60+ 49- 49-: -1 -1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 5 (98- 98- 98-: 0 0 1) (98- 98- 121+: 0 0 -2) [1 1 2] 0 4 (49- 49- 49-: 0 -1 0) (49- 49- 60+: 0 -1 -1) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 5 (98- 98- 121+: 1 0 0) (121+ 98- 121+: -2 0 0) [2 1 1] 0 4 (49- 49- 60+: 0 -1 0) (60+ 49- 60+: -1 -1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 5 (121+ 98- 98-: 0 0 1) (121+ 98- 121+: 0 0 -2) [1 1 2] 0 4 (60+ 49- 49-: 0 -1 0) (60+ 49- 60+: 0 -1 -1) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 5 (98- 121+ 98-: 2 0 0) (121+ 121+ 98-: -1 0 0) [2 1 1] 0 4 (49- 60+ 49-: 1 1 0) (60+ 60+ 49-: 0 1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 5 (98- 121+ 98-: 0 0 2) (98- 121+ 121+: 0 0 -1) [1 1 2] 0 4 (49- 60+ 49-: 0 1 1) (49- 60+ 60+: 0 1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 5 (98- 121+ 121+: 2 0 0) (121+ 121+ 121+: -1 0 0) [2 1 1] 0 4 (49- 60+ 60+: 1 1 0) (60+ 60+ 60+: 0 1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 5 (121+ 121+ 98-: 0 0 2) (121+ 121+ 121+: 0 0 -1) [1 1 2] 0 4 (60+ 60+ 49-: 0 1 1) (60+ 60+ 60+: 0 1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 5 (98- 121+ 98-: 1 0 0) (121+ 121+ 98-: -2 0 0) [2 1 1] 0 4 (49- 60+ 49-: 0 1 0) (60+ 60+ 49-: -1 1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 5 (98- 121+ 98-: 0 0 1) (98- 121+ 121+: 0 0 -2) [1 1 2] 0 4 (49- 60+ 49-: 0 1 0) (49- 60+ 60+: 0 1 -1) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 5 (98- 121+ 121+: 1 0 0) (121+ 121+ 121+: -2 0 0) [2 1 1] 0 4 (49- 60+ 60+: 0 1 0) (60+ 60+ 60+: -1 1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 5 (121+ 121+ 98-: 0 0 1) (121+ 121+ 121+: 0 0 -2) [1 1 2] 0 4 (60+ 60+ 49-: 0 1 0) (60+ 60+ 60+: 0 1 -1) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 5 (98- 98- 98-: 0 0 0) (98- 98- 98-: 0 0 0) [1 1 1] 0 4 (49- 49- 49-: 0 -1 0) (49- 49- 49-: 0 -1 0) [1 1 1] 0 [0 1 2] 9 -1.000000 GraphAddEntries: 5 (121+ 98- 98-: 0 0 0) (121+ 98- 98-: 0 0 0) [1 1 1] 0 4 (60+ 49- 49-: 0 -1 0) (60+ 49- 49-: 0 -1 0) [1 1 1] 0 [0 1 2] 9 -1.000000 GraphAddEntries: 5 (98- 98- 121+: 0 0 0) (98- 98- 121+: 0 0 0) [1 1 1] 0 4 (49- 49- 60+: 0 -1 0) (49- 49- 60+: 0 -1 0) [1 1 1] 0 [0 1 2] 9 -1.000000 GraphAddEntries: 5 (121+ 98- 121+: 0 0 0) (121+ 98- 121+: 0 0 0) [1 1 1] 0 4 (60+ 49- 60+: 0 -1 0) (60+ 49- 60+: 0 -1 0) [1 1 1] 0 [0 1 2] 9 -1.000000 GraphAddEntries: 5 (98- 121+ 98-: 0 0 0) (98- 121+ 98-: 0 0 0) [1 1 1] 0 4 (49- 60+ 49-: 0 1 0) (49- 60+ 49-: 0 1 0) [1 1 1] 0 [0 1 2] 9 -1.000000 GraphAddEntries: 5 (121+ 121+ 98-: 0 0 0) (121+ 121+ 98-: 0 0 0) [1 1 1] 0 4 (60+ 60+ 49-: 0 1 0) (60+ 60+ 49-: 0 1 0) [1 1 1] 0 [0 1 2] 9 -1.000000 GraphAddEntries: 5 (98- 121+ 121+: 0 0 0) (98- 121+ 121+: 0 0 0) [1 1 1] 0 4 (49- 60+ 60+: 0 1 0) (49- 60+ 60+: 0 1 0) [1 1 1] 0 [0 1 2] 9 -1.000000 GraphAddEntries: 5 (121+ 121+ 121+: 0 0 0) (121+ 121+ 121+: 0 0 0) [1 1 1] 0 4 (60+ 60+ 60+: 0 1 0) (60+ 60+ 60+: 0 1 0) [1 1 1] 0 [0 1 2] 9 -1.000000 GraphAddEntries: 6 (200- 200- 200-: 0 0 1) (200- 231+ 231+: 0 -1 -2) [1 2 2] 0 5 (100- 100- 100-: -1 0 0) (100- 115+ 115+: -1 0 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 6 (200- 200- 200-: 0 1 1) (200- 231+ 231+: 0 0 -2) [1 2 2] 0 5 (100- 100- 100-: -1 0 0) (100- 115+ 115+: -1 0 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 6 (200- 200- 200-: 0 0 2) (200- 231+ 231+: 0 -1 -1) [1 2 2] 0 5 (100- 100- 100-: -1 0 1) (100- 115+ 115+: -1 0 0) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 6 (200- 200- 200-: 0 1 2) (200- 231+ 231+: 0 0 -1) [1 2 2] 0 5 (100- 100- 100-: -1 0 1) (100- 115+ 115+: -1 0 0) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 6 (231+ 200- 200-: 0 0 2) (231+ 231+ 231+: 0 -1 -1) [1 2 2] 0 5 (115+ 100- 100-: 1 0 1) (115+ 115+ 115+: 1 0 0) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 6 (231+ 200- 200-: 0 1 2) (231+ 231+ 231+: 0 0 -1) [1 2 2] 0 5 (115+ 100- 100-: 1 0 1) (115+ 115+ 115+: 1 0 0) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 6 (231+ 200- 200-: 0 0 1) (231+ 231+ 231+: 0 -1 -2) [1 2 2] 0 5 (115+ 100- 100-: 1 0 0) (115+ 115+ 115+: 1 0 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 6 (231+ 200- 200-: 0 1 1) (231+ 231+ 231+: 0 0 -2) [1 2 2] 0 5 (115+ 100- 100-: 1 0 0) (115+ 115+ 115+: 1 0 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 6 (200- 200- 200-: 2 0 1) (231+ 200- 231+: -1 0 -2) [2 1 2] 0 5 (100- 100- 100-: 1 -1 0) (115+ 100- 115+: 0 -1 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 6 (200- 200- 200-: 2 0 2) (231+ 200- 231+: -1 0 -1) [2 1 2] 0 5 (100- 100- 100-: 1 -1 1) (115+ 100- 115+: 0 -1 0) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 6 (200- 200- 200-: 1 0 1) (231+ 200- 231+: -2 0 -2) [2 1 2] 0 5 (100- 100- 100-: 0 -1 0) (115+ 100- 115+: -1 -1 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 6 (200- 200- 200-: 1 0 2) (231+ 200- 231+: -2 0 -1) [2 1 2] 0 5 (100- 100- 100-: 0 -1 1) (115+ 100- 115+: -1 -1 0) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 6 (200- 231+ 200-: 2 0 2) (231+ 231+ 231+: -1 0 -1) [2 1 2] 0 5 (100- 115+ 100-: 1 1 1) (115+ 115+ 115+: 0 1 0) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 6 (200- 231+ 200-: 2 0 1) (231+ 231+ 231+: -1 0 -2) [2 1 2] 0 5 (100- 115+ 100-: 1 1 0) (115+ 115+ 115+: 0 1 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 6 (200- 231+ 200-: 1 0 2) (231+ 231+ 231+: -2 0 -1) [2 1 2] 0 5 (100- 115+ 100-: 0 1 1) (115+ 115+ 115+: -1 1 0) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 6 (200- 231+ 200-: 1 0 1) (231+ 231+ 231+: -2 0 -2) [2 1 2] 0 5 (100- 115+ 100-: 0 1 0) (115+ 115+ 115+: -1 1 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 6 (200- 200- 200-: 0 0 0) (231+ 231+ 200-: -1 -1 0) [2 2 1] 0 5 (100- 100- 100-: 0 0 -1) (115+ 115+ 100-: 0 0 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 6 (200- 200- 200-: 0 1 0) (231+ 231+ 200-: -1 0 0) [2 2 1] 0 5 (100- 100- 100-: 0 0 -1) (115+ 115+ 100-: 0 0 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 6 (200- 200- 200-: 1 0 0) (231+ 231+ 200-: 0 -1 0) [2 2 1] 0 5 (100- 100- 100-: 0 0 -1) (115+ 115+ 100-: 0 0 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 6 (200- 200- 200-: 1 1 0) (231+ 231+ 200-: 0 0 0) [2 2 1] 0 5 (100- 100- 100-: 0 0 -1) (115+ 115+ 100-: 0 0 -1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 6 (200- 200- 231+: 1 0 0) (231+ 231+ 231+: 0 -1 0) [2 2 1] 0 5 (100- 100- 115+: 0 0 1) (115+ 115+ 115+: 0 0 1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 6 (200- 200- 231+: 1 1 0) (231+ 231+ 231+: 0 0 0) [2 2 1] 0 5 (100- 100- 115+: 0 0 1) (115+ 115+ 115+: 0 0 1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 6 (200- 200- 231+: 0 0 0) (231+ 231+ 231+: -1 -1 0) [2 2 1] 0 5 (100- 100- 115+: 0 0 1) (115+ 115+ 115+: 0 0 1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 6 (200- 200- 231+: 0 1 0) (231+ 231+ 231+: -1 0 0) [2 2 1] 0 5 (100- 100- 115+: 0 0 1) (115+ 115+ 115+: 0 0 1) [1 1 1] 0 [0 1 2] 7 -1.000000 GraphAddEntries: 6 (200- 200- 200-: 0 0 0) (200- 231+ 200-: 0 -1 0) [1 2 1] 0 5 (100- 100- 100-: -1 0 0) (100- 115+ 100-: -1 0 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 6 (200- 200- 200-: 0 1 0) (200- 231+ 200-: 0 0 0) [1 2 1] 0 5 (100- 100- 100-: -1 0 0) (100- 115+ 100-: -1 0 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 6 (231+ 200- 231+: 0 0 0) (231+ 231+ 231+: 0 -1 0) [1 2 1] 0 5 (115+ 100- 115+: 1 0 0) (115+ 115+ 115+: 1 0 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 6 (231+ 200- 231+: 0 1 0) (231+ 231+ 231+: 0 0 0) [1 2 1] 0 5 (115+ 100- 115+: 1 0 0) (115+ 115+ 115+: 1 0 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 6 (231+ 200- 200-: 0 0 0) (231+ 231+ 200-: 0 -1 0) [1 2 1] 0 5 (115+ 100- 100-: 1 0 0) (115+ 115+ 100-: 1 0 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 6 (231+ 200- 200-: 0 1 0) (231+ 231+ 200-: 0 0 0) [1 2 1] 0 5 (115+ 100- 100-: 1 0 0) (115+ 115+ 100-: 1 0 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 6 (200- 200- 231+: 0 0 0) (200- 231+ 231+: 0 -1 0) [1 2 1] 0 5 (100- 100- 115+: -1 0 0) (100- 115+ 115+: -1 0 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 6 (200- 200- 231+: 0 1 0) (200- 231+ 231+: 0 0 0) [1 2 1] 0 5 (100- 100- 115+: -1 0 0) (100- 115+ 115+: -1 0 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 6 (200- 200- 200-: 2 0 0) (231+ 200- 200-: -1 0 0) [2 1 1] 0 5 (100- 100- 100-: 1 -1 0) (115+ 100- 100-: 0 -1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 6 (200- 200- 200-: 0 0 2) (200- 200- 231+: 0 0 -1) [1 1 2] 0 5 (100- 100- 100-: 0 -1 1) (100- 100- 115+: 0 -1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 6 (200- 200- 231+: 2 0 0) (231+ 200- 231+: -1 0 0) [2 1 1] 0 5 (100- 100- 115+: 1 -1 0) (115+ 100- 115+: 0 -1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 6 (231+ 200- 200-: 0 0 2) (231+ 200- 231+: 0 0 -1) [1 1 2] 0 5 (115+ 100- 100-: 0 -1 1) (115+ 100- 115+: 0 -1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 6 (200- 200- 200-: 1 0 0) (231+ 200- 200-: -2 0 0) [2 1 1] 0 5 (100- 100- 100-: 0 -1 0) (115+ 100- 100-: -1 -1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 6 (200- 200- 200-: 0 0 1) (200- 200- 231+: 0 0 -2) [1 1 2] 0 5 (100- 100- 100-: 0 -1 0) (100- 100- 115+: 0 -1 -1) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 6 (200- 200- 231+: 1 0 0) (231+ 200- 231+: -2 0 0) [2 1 1] 0 5 (100- 100- 115+: 0 -1 0) (115+ 100- 115+: -1 -1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 6 (231+ 200- 200-: 0 0 1) (231+ 200- 231+: 0 0 -2) [1 1 2] 0 5 (115+ 100- 100-: 0 -1 0) (115+ 100- 115+: 0 -1 -1) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 6 (200- 231+ 200-: 2 0 0) (231+ 231+ 200-: -1 0 0) [2 1 1] 0 5 (100- 115+ 100-: 1 1 0) (115+ 115+ 100-: 0 1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 6 (200- 231+ 200-: 0 0 2) (200- 231+ 231+: 0 0 -1) [1 1 2] 0 5 (100- 115+ 100-: 0 1 1) (100- 115+ 115+: 0 1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 6 (200- 231+ 231+: 2 0 0) (231+ 231+ 231+: -1 0 0) [2 1 1] 0 5 (100- 115+ 115+: 1 1 0) (115+ 115+ 115+: 0 1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 6 (231+ 231+ 200-: 0 0 2) (231+ 231+ 231+: 0 0 -1) [1 1 2] 0 5 (115+ 115+ 100-: 0 1 1) (115+ 115+ 115+: 0 1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 6 (200- 231+ 200-: 1 0 0) (231+ 231+ 200-: -2 0 0) [2 1 1] 0 5 (100- 115+ 100-: 0 1 0) (115+ 115+ 100-: -1 1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 6 (200- 231+ 200-: 0 0 1) (200- 231+ 231+: 0 0 -2) [1 1 2] 0 5 (100- 115+ 100-: 0 1 0) (100- 115+ 115+: 0 1 -1) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 6 (200- 231+ 231+: 1 0 0) (231+ 231+ 231+: -2 0 0) [2 1 1] 0 5 (100- 115+ 115+: 0 1 0) (115+ 115+ 115+: -1 1 0) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 6 (231+ 231+ 200-: 0 0 1) (231+ 231+ 231+: 0 0 -2) [1 1 2] 0 5 (115+ 115+ 100-: 0 1 0) (115+ 115+ 115+: 0 1 -1) [1 1 1] 0 [0 1 2] 8 -1.000000 GraphAddEntries: 6 (200- 200- 200-: 0 0 0) (200- 200- 200-: 0 0 0) [1 1 1] 0 5 (100- 100- 100-: 0 -1 0) (100- 100- 100-: 0 -1 0) [1 1 1] 0 [0 1 2] 9 -1.000000 GraphAddEntries: 6 (231+ 200- 200-: 0 0 0) (231+ 200- 200-: 0 0 0) [1 1 1] 0 5 (115+ 100- 100-: 0 -1 0) (115+ 100- 100-: 0 -1 0) [1 1 1] 0 [0 1 2] 9 -1.000000 GraphAddEntries: 6 (200- 200- 231+: 0 0 0) (200- 200- 231+: 0 0 0) [1 1 1] 0 5 (100- 100- 115+: 0 -1 0) (100- 100- 115+: 0 -1 0) [1 1 1] 0 [0 1 2] 9 -1.000000 GraphAddEntries: 6 (231+ 200- 231+: 0 0 0) (231+ 200- 231+: 0 0 0) [1 1 1] 0 5 (115+ 100- 115+: 0 -1 0) (115+ 100- 115+: 0 -1 0) [1 1 1] 0 [0 1 2] 9 -1.000000 GraphAddEntries: 6 (200- 231+ 200-: 0 0 0) (200- 231+ 200-: 0 0 0) [1 1 1] 0 5 (100- 115+ 100-: 0 1 0) (100- 115+ 100-: 0 1 0) [1 1 1] 0 [0 1 2] 9 -1.000000 GraphAddEntries: 6 (231+ 231+ 200-: 0 0 0) (231+ 231+ 200-: 0 0 0) [1 1 1] 0 5 (115+ 115+ 100-: 0 1 0) (115+ 115+ 100-: 0 1 0) [1 1 1] 0 [0 1 2] 9 -1.000000 GraphAddEntries: 6 (200- 231+ 231+: 0 0 0) (200- 231+ 231+: 0 0 0) [1 1 1] 0 5 (100- 115+ 115+: 0 1 0) (100- 115+ 115+: 0 1 0) [1 1 1] 0 [0 1 2] 9 -1.000000 GraphAddEntries: 6 (231+ 231+ 231+: 0 0 0) (231+ 231+ 231+: 0 0 0) [1 1 1] 0 5 (115+ 115+ 115+: 0 1 0) (115+ 115+ 115+: 0 1 0) [1 1 1] 0 [0 1 2] 9 -1.000000 ############################################################# FacParts: 0 0 [1 1 1] FacParts: 1 1 [2 2 2] FacParts: 2 2 [2 2 2] FacParts: 3 3 [2 2 2] FacParts: 4 4 [2 2 2] FacParts: 5 5 [2 2 2] FacParts: 6 6 [2 2 2] ProcessPoolCreate: 1 # ProcessPoolSetPart: pool part ProcessPoolSetPart: 0 0 ProcessPoolSetPart: 0 1 ProcessPoolSetPart: 0 2 ProcessPoolSetPart: 0 3 ProcessPoolSetPart: 0 4 ProcessPoolSetPart: 0 5 ProcessPoolSetPart: 0 6 hypre-2.33.0/src/test/TEST_fac/sstruct_fac.jobs000077500000000000000000000032111477326011500212710ustar00rootroot00000000000000#!/bin/bash # Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) #============================================================================= # sstruct_fac: test suites for FAC solver. #============================================================================= mpirun -np 1 ./sstruct_fac -in 3lev.in -solver 99 -r 2 1 1 > sstruct_fac.out.0 mpirun -np 2 ./sstruct_fac -in 3lev.in -solver 99 -P 2 1 1 > sstruct_fac.out.1 # RDF: There is something wrong with the FAC code; these currently don't work # mpirun -np 1 ./sstruct_fac -in 3lev_multibox.in -solver 99 -r 2 3 1 \ # > sstruct_fac.out.2 # mpirun -np 6 ./sstruct_fac -in 3lev_multibox.in -solver 99 -P 2 3 1 \ # > sstruct_fac.out.3 # RDF: AddFEMBoxValues() breaks these for some reason # mpirun -np 1 ./sstruct_fac -in 4lev.in -solver 99 -r 1 2 2 > sstruct_fac.out.4 # mpirun -np 4 ./sstruct_fac -in 4lev.in -solver 99 -P 1 2 2 > sstruct_fac.out.5 # RDF: AddFEMBoxValues() breaks these for some reason # mpirun -np 1 ./sstruct_fac -in 5lev.in -solver 99 -r 1 5 1 > sstruct_fac.out.6 # mpirun -np 5 ./sstruct_fac -in 5lev.in -solver 99 -P 1 5 1 > sstruct_fac.out.7 # RLU: For the new memory model, these two examples does not work right now #mpirun -np 1 ./sstruct_fac -in 6lev.in -solver 99 -r 2 1 2 > sstruct_fac.out.8 #mpirun -np 4 ./sstruct_fac -in 6lev.in -solver 99 -P 2 1 2 > sstruct_fac.out.9 mpirun -np 1 ./sstruct_fac -in 7lev.in -solver 99 -r 1 1 2 > sstruct_fac.out.10 mpirun -np 2 ./sstruct_fac -in 7lev.in -solver 99 -P 1 1 2 > sstruct_fac.out.11 hypre-2.33.0/src/test/TEST_fac/sstruct_fac.saved000066400000000000000000000005721477326011500214420ustar00rootroot00000000000000# Output file: sstruct_fac.out.0 Iterations = 14 Final Relative Residual Norm = 9.546812e-07 # Output file: sstruct_fac.out.1 Iterations = 14 Final Relative Residual Norm = 9.546812e-07 # Output file: sstruct_fac.out.10 Iterations = 14 Final Relative Residual Norm = 7.049377e-07 # Output file: sstruct_fac.out.11 Iterations = 14 Final Relative Residual Norm = 7.049377e-07 hypre-2.33.0/src/test/TEST_fac/sstruct_fac.sh000077500000000000000000000051251477326011500207540ustar00rootroot00000000000000#!/bin/bash # Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) TNAME=`basename $0 .sh` #============================================================================= # sstruct_fac: Tests the sstruct_fac solver #============================================================================= tail -3 ${TNAME}.out.0 > ${TNAME}.testdata tail -3 ${TNAME}.out.1 > ${TNAME}.testdata.temp diff ${TNAME}.testdata ${TNAME}.testdata.temp >&2 #============================================================================= # tail -3 ${TNAME}.out.2 > ${TNAME}.testdata # tail -3 ${TNAME}.out.3 > ${TNAME}.testdata.temp # diff ${TNAME}.testdata ${TNAME}.testdata.temp >&2 #============================================================================= # tail -3 ${TNAME}.out.4 > ${TNAME}.testdata # tail -3 ${TNAME}.out.5 > ${TNAME}.testdata.temp # diff ${TNAME}.testdata ${TNAME}.testdata.temp >&2 #============================================================================= # tail -3 ${TNAME}.out.6 > ${TNAME}.testdata # tail -3 ${TNAME}.out.7 > ${TNAME}.testdata.temp # diff ${TNAME}.testdata ${TNAME}.testdata.temp >&2 #============================================================================= #tail -3 ${TNAME}.out.8 > ${TNAME}.testdata #tail -3 ${TNAME}.out.9 > ${TNAME}.testdata.temp #diff ${TNAME}.testdata ${TNAME}.testdata.temp >&2 #============================================================================= tail -3 ${TNAME}.out.10 > ${TNAME}.testdata tail -3 ${TNAME}.out.11 > ${TNAME}.testdata.temp diff ${TNAME}.testdata ${TNAME}.testdata.temp >&2 #============================================================================= # compare with baseline case #============================================================================= FILES="\ ${TNAME}.out.0\ ${TNAME}.out.1\ ${TNAME}.out.10\ ${TNAME}.out.11\ " # ${TNAME}.out.2\ # ${TNAME}.out.3\ # ${TNAME}.out.4\ # ${TNAME}.out.5\ # ${TNAME}.out.6\ # ${TNAME}.out.7\ # ${TNAME}.out.8\ # ${TNAME}.out.9\ for i in $FILES do echo "# Output file: $i" tail -3 $i done > ${TNAME}.out # Make sure that the output file is reasonable RUNCOUNT=`echo $FILES | wc -w` OUTCOUNT=`grep "Iterations" ${TNAME}.out | wc -l` if [ "$OUTCOUNT" != "$RUNCOUNT" ]; then echo "Incorrect number of runs in ${TNAME}.out" >&2 fi #============================================================================= # remove temporary files #============================================================================= rm -f ${TNAME}.testdata* hypre-2.33.0/src/test/TEST_fei/000077500000000000000000000000001477326011500161045ustar00rootroot00000000000000hypre-2.33.0/src/test/TEST_fei/.psrc000066400000000000000000000002131477326011500170500ustar00rootroot00000000000000insure++.report_file insure.log insure++.report_overwrite false insure++.summarize leaks outstanding insure++.suppress EXPR_NULL,PARM_NULL hypre-2.33.0/src/test/TEST_fei/BC.0000066400000000000000000000107041477326011500164530ustar00rootroot0000000000000064 1 1.000000000000e+00 0.000000000000e+00 0.000000000000e+00 2 1.000000000000e+00 0.000000000000e+00 0.000000000000e+00 4 1.000000000000e+00 0.000000000000e+00 0.000000000000e+00 7 1.000000000000e+00 0.000000000000e+00 0.000000000000e+00 10 1.000000000000e+00 0.000000000000e+00 0.000000000000e+00 13 1.000000000000e+00 0.000000000000e+00 0.000000000000e+00 17 1.000000000000e+00 0.000000000000e+00 0.000000000000e+00 32 1.000000000000e+00 0.000000000000e+00 0.000000000000e+00 47 1.000000000000e+00 0.000000000000e+00 0.000000000000e+00 61 1.000000000000e+00 0.000000000000e+00 0.000000000000e+00 62 1.000000000000e+00 0.000000000000e+00 0.000000000000e+00 64 1.000000000000e+00 0.000000000000e+00 0.000000000000e+00 67 1.000000000000e+00 0.000000000000e+00 0.000000000000e+00 70 1.000000000000e+00 0.000000000000e+00 0.000000000000e+00 73 1.000000000000e+00 0.000000000000e+00 0.000000000000e+00 77 1.000000000000e+00 0.000000000000e+00 0.000000000000e+00 92 1.000000000000e+00 0.000000000000e+00 0.000000000000e+00 107 1.000000000000e+00 0.000000000000e+00 0.000000000000e+00 121 1.000000000000e+00 0.000000000000e+00 0.000000000000e+00 122 1.000000000000e+00 0.000000000000e+00 0.000000000000e+00 124 1.000000000000e+00 0.000000000000e+00 0.000000000000e+00 127 1.000000000000e+00 0.000000000000e+00 0.000000000000e+00 130 1.000000000000e+00 0.000000000000e+00 0.000000000000e+00 133 1.000000000000e+00 0.000000000000e+00 0.000000000000e+00 137 1.000000000000e+00 0.000000000000e+00 0.000000000000e+00 152 1.000000000000e+00 0.000000000000e+00 0.000000000000e+00 167 1.000000000000e+00 0.000000000000e+00 0.000000000000e+00 182 1.000000000000e+00 0.000000000000e+00 0.000000000000e+00 193 1.000000000000e+00 0.000000000000e+00 0.000000000000e+00 194 1.000000000000e+00 0.000000000000e+00 0.000000000000e+00 196 1.000000000000e+00 0.000000000000e+00 0.000000000000e+00 199 1.000000000000e+00 0.000000000000e+00 0.000000000000e+00 202 1.000000000000e+00 0.000000000000e+00 0.000000000000e+00 205 1.000000000000e+00 0.000000000000e+00 0.000000000000e+00 209 1.000000000000e+00 0.000000000000e+00 0.000000000000e+00 224 1.000000000000e+00 0.000000000000e+00 0.000000000000e+00 239 1.000000000000e+00 0.000000000000e+00 0.000000000000e+00 254 1.000000000000e+00 0.000000000000e+00 0.000000000000e+00 265 1.000000000000e+00 0.000000000000e+00 0.000000000000e+00 266 1.000000000000e+00 0.000000000000e+00 0.000000000000e+00 268 1.000000000000e+00 0.000000000000e+00 0.000000000000e+00 271 1.000000000000e+00 0.000000000000e+00 0.000000000000e+00 274 1.000000000000e+00 0.000000000000e+00 0.000000000000e+00 277 1.000000000000e+00 0.000000000000e+00 0.000000000000e+00 281 1.000000000000e+00 0.000000000000e+00 0.000000000000e+00 296 1.000000000000e+00 0.000000000000e+00 0.000000000000e+00 311 1.000000000000e+00 0.000000000000e+00 0.000000000000e+00 326 1.000000000000e+00 0.000000000000e+00 0.000000000000e+00 337 1.000000000000e+00 0.000000000000e+00 0.000000000000e+00 338 1.000000000000e+00 0.000000000000e+00 0.000000000000e+00 340 1.000000000000e+00 0.000000000000e+00 0.000000000000e+00 343 1.000000000000e+00 0.000000000000e+00 0.000000000000e+00 346 1.000000000000e+00 0.000000000000e+00 0.000000000000e+00 350 1.000000000000e+00 0.000000000000e+00 0.000000000000e+00 362 1.000000000000e+00 0.000000000000e+00 0.000000000000e+00 374 1.000000000000e+00 0.000000000000e+00 0.000000000000e+00 385 1.000000000000e+00 0.000000000000e+00 0.000000000000e+00 386 1.000000000000e+00 0.000000000000e+00 0.000000000000e+00 388 1.000000000000e+00 0.000000000000e+00 0.000000000000e+00 391 1.000000000000e+00 0.000000000000e+00 0.000000000000e+00 394 1.000000000000e+00 0.000000000000e+00 0.000000000000e+00 398 1.000000000000e+00 0.000000000000e+00 0.000000000000e+00 410 1.000000000000e+00 0.000000000000e+00 0.000000000000e+00 422 1.000000000000e+00 0.000000000000e+00 0.000000000000e+00 hypre-2.33.0/src/test/TEST_fei/BC.1000066400000000000000000000063061477326011500164570ustar00rootroot0000000000000046 434 1.000000000000e+00 0.000000000000e+00 0.000000000000e+00 449 1.000000000000e+00 0.000000000000e+00 0.000000000000e+00 480 1.000000000000e+00 0.000000000000e+00 0.000000000000e+00 498 1.000000000000e+00 0.000000000000e+00 0.000000000000e+00 513 1.000000000000e+00 0.000000000000e+00 0.000000000000e+00 518 1.000000000000e+00 0.000000000000e+00 0.000000000000e+00 530 1.000000000000e+00 0.000000000000e+00 0.000000000000e+00 542 1.000000000000e+00 0.000000000000e+00 0.000000000000e+00 552 1.000000000000e+00 0.000000000000e+00 0.000000000000e+00 554 1.000000000000e+00 0.000000000000e+00 0.000000000000e+00 555 1.000000000000e+00 0.000000000000e+00 0.000000000000e+00 558 1.000000000000e+00 0.000000000000e+00 0.000000000000e+00 561 1.000000000000e+00 0.000000000000e+00 0.000000000000e+00 566 1.000000000000e+00 0.000000000000e+00 0.000000000000e+00 578 1.000000000000e+00 0.000000000000e+00 0.000000000000e+00 590 1.000000000000e+00 0.000000000000e+00 0.000000000000e+00 600 1.000000000000e+00 0.000000000000e+00 0.000000000000e+00 602 1.000000000000e+00 0.000000000000e+00 0.000000000000e+00 603 1.000000000000e+00 0.000000000000e+00 0.000000000000e+00 606 1.000000000000e+00 0.000000000000e+00 0.000000000000e+00 609 1.000000000000e+00 0.000000000000e+00 0.000000000000e+00 614 1.000000000000e+00 0.000000000000e+00 0.000000000000e+00 626 1.000000000000e+00 0.000000000000e+00 0.000000000000e+00 638 1.000000000000e+00 0.000000000000e+00 0.000000000000e+00 648 1.000000000000e+00 0.000000000000e+00 0.000000000000e+00 650 1.000000000000e+00 0.000000000000e+00 0.000000000000e+00 651 1.000000000000e+00 0.000000000000e+00 0.000000000000e+00 654 1.000000000000e+00 0.000000000000e+00 0.000000000000e+00 657 1.000000000000e+00 0.000000000000e+00 0.000000000000e+00 675 1.000000000000e+00 0.000000000000e+00 0.000000000000e+00 680 1.000000000000e+00 0.000000000000e+00 0.000000000000e+00 692 1.000000000000e+00 0.000000000000e+00 0.000000000000e+00 704 1.000000000000e+00 0.000000000000e+00 0.000000000000e+00 714 1.000000000000e+00 0.000000000000e+00 0.000000000000e+00 716 1.000000000000e+00 0.000000000000e+00 0.000000000000e+00 717 1.000000000000e+00 0.000000000000e+00 0.000000000000e+00 720 1.000000000000e+00 0.000000000000e+00 0.000000000000e+00 723 1.000000000000e+00 0.000000000000e+00 0.000000000000e+00 728 1.000000000000e+00 0.000000000000e+00 0.000000000000e+00 740 1.000000000000e+00 0.000000000000e+00 0.000000000000e+00 752 1.000000000000e+00 0.000000000000e+00 0.000000000000e+00 762 1.000000000000e+00 0.000000000000e+00 0.000000000000e+00 764 1.000000000000e+00 0.000000000000e+00 0.000000000000e+00 765 1.000000000000e+00 0.000000000000e+00 0.000000000000e+00 768 1.000000000000e+00 0.000000000000e+00 0.000000000000e+00 771 1.000000000000e+00 0.000000000000e+00 0.000000000000e+00 hypre-2.33.0/src/test/TEST_fei/BC.2000066400000000000000000000076141477326011500164630ustar00rootroot0000000000000056 775 1.000000000000e+00 0.000000000000e+00 0.000000000000e+00 778 1.000000000000e+00 0.000000000000e+00 0.000000000000e+00 781 1.000000000000e+00 0.000000000000e+00 0.000000000000e+00 783 1.000000000000e+00 0.000000000000e+00 0.000000000000e+00 784 1.000000000000e+00 0.000000000000e+00 0.000000000000e+00 795 1.000000000000e+00 0.000000000000e+00 0.000000000000e+00 807 1.000000000000e+00 0.000000000000e+00 0.000000000000e+00 813 1.000000000000e+00 0.000000000000e+00 0.000000000000e+00 817 1.000000000000e+00 0.000000000000e+00 0.000000000000e+00 820 1.000000000000e+00 0.000000000000e+00 0.000000000000e+00 823 1.000000000000e+00 0.000000000000e+00 0.000000000000e+00 825 1.000000000000e+00 0.000000000000e+00 0.000000000000e+00 826 1.000000000000e+00 0.000000000000e+00 0.000000000000e+00 837 1.000000000000e+00 0.000000000000e+00 0.000000000000e+00 849 1.000000000000e+00 0.000000000000e+00 0.000000000000e+00 855 1.000000000000e+00 0.000000000000e+00 0.000000000000e+00 859 1.000000000000e+00 0.000000000000e+00 0.000000000000e+00 862 1.000000000000e+00 0.000000000000e+00 0.000000000000e+00 865 1.000000000000e+00 0.000000000000e+00 0.000000000000e+00 867 1.000000000000e+00 0.000000000000e+00 0.000000000000e+00 868 1.000000000000e+00 0.000000000000e+00 0.000000000000e+00 879 1.000000000000e+00 0.000000000000e+00 0.000000000000e+00 891 1.000000000000e+00 0.000000000000e+00 0.000000000000e+00 900 1.000000000000e+00 0.000000000000e+00 0.000000000000e+00 904 1.000000000000e+00 0.000000000000e+00 0.000000000000e+00 907 1.000000000000e+00 0.000000000000e+00 0.000000000000e+00 910 1.000000000000e+00 0.000000000000e+00 0.000000000000e+00 912 1.000000000000e+00 0.000000000000e+00 0.000000000000e+00 913 1.000000000000e+00 0.000000000000e+00 0.000000000000e+00 924 1.000000000000e+00 0.000000000000e+00 0.000000000000e+00 936 1.000000000000e+00 0.000000000000e+00 0.000000000000e+00 945 1.000000000000e+00 0.000000000000e+00 0.000000000000e+00 949 1.000000000000e+00 0.000000000000e+00 0.000000000000e+00 952 1.000000000000e+00 0.000000000000e+00 0.000000000000e+00 955 1.000000000000e+00 0.000000000000e+00 0.000000000000e+00 957 1.000000000000e+00 0.000000000000e+00 0.000000000000e+00 958 1.000000000000e+00 0.000000000000e+00 0.000000000000e+00 969 1.000000000000e+00 0.000000000000e+00 0.000000000000e+00 981 1.000000000000e+00 0.000000000000e+00 0.000000000000e+00 993 1.000000000000e+00 0.000000000000e+00 0.000000000000e+00 997 1.000000000000e+00 0.000000000000e+00 0.000000000000e+00 1000 1.000000000000e+00 0.000000000000e+00 0.000000000000e+00 1003 1.000000000000e+00 0.000000000000e+00 0.000000000000e+00 1005 1.000000000000e+00 0.000000000000e+00 0.000000000000e+00 1006 1.000000000000e+00 0.000000000000e+00 0.000000000000e+00 1017 1.000000000000e+00 0.000000000000e+00 0.000000000000e+00 1029 1.000000000000e+00 0.000000000000e+00 0.000000000000e+00 1041 1.000000000000e+00 0.000000000000e+00 0.000000000000e+00 1045 1.000000000000e+00 0.000000000000e+00 0.000000000000e+00 1048 1.000000000000e+00 0.000000000000e+00 0.000000000000e+00 1051 1.000000000000e+00 0.000000000000e+00 0.000000000000e+00 1053 1.000000000000e+00 0.000000000000e+00 0.000000000000e+00 1054 1.000000000000e+00 0.000000000000e+00 0.000000000000e+00 1065 1.000000000000e+00 0.000000000000e+00 0.000000000000e+00 1077 1.000000000000e+00 0.000000000000e+00 0.000000000000e+00 1089 1.000000000000e+00 0.000000000000e+00 0.000000000000e+00 hypre-2.33.0/src/test/TEST_fei/BC.3000066400000000000000000000031451477326011500164570ustar00rootroot0000000000000023 1104 1.000000000000e+00 0.000000000000e+00 0.000000000000e+00 1108 1.000000000000e+00 0.000000000000e+00 0.000000000000e+00 1121 1.000000000000e+00 0.000000000000e+00 0.000000000000e+00 1135 1.000000000000e+00 0.000000000000e+00 0.000000000000e+00 1148 1.000000000000e+00 0.000000000000e+00 0.000000000000e+00 1170 1.000000000000e+00 0.000000000000e+00 0.000000000000e+00 1182 1.000000000000e+00 0.000000000000e+00 0.000000000000e+00 1187 1.000000000000e+00 0.000000000000e+00 0.000000000000e+00 1199 1.000000000000e+00 0.000000000000e+00 0.000000000000e+00 1211 1.000000000000e+00 0.000000000000e+00 0.000000000000e+00 1221 1.000000000000e+00 0.000000000000e+00 0.000000000000e+00 1223 1.000000000000e+00 0.000000000000e+00 0.000000000000e+00 1224 1.000000000000e+00 0.000000000000e+00 0.000000000000e+00 1227 1.000000000000e+00 0.000000000000e+00 0.000000000000e+00 1230 1.000000000000e+00 0.000000000000e+00 0.000000000000e+00 1235 1.000000000000e+00 0.000000000000e+00 0.000000000000e+00 1247 1.000000000000e+00 0.000000000000e+00 0.000000000000e+00 1259 1.000000000000e+00 0.000000000000e+00 0.000000000000e+00 1269 1.000000000000e+00 0.000000000000e+00 0.000000000000e+00 1271 1.000000000000e+00 0.000000000000e+00 0.000000000000e+00 1272 1.000000000000e+00 0.000000000000e+00 0.000000000000e+00 1275 1.000000000000e+00 0.000000000000e+00 0.000000000000e+00 1278 1.000000000000e+00 0.000000000000e+00 0.000000000000e+00 hypre-2.33.0/src/test/TEST_fei/RHS.0000066400000000000000000001255101477326011500166250ustar00rootroot00000000000000 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -2.0473340634998474e-03 -1.5673428304165506e-03 -1.5673428304165508e-03 2.5612482603748093e-03 -1.1280049454165837e-03 -1.1280049454165837e-03 2.2851318003331636e-03 1.6195472024998802e-03 -1.1223626099999186e-03 -2.2864762198331629e-03 1.0819116483332539e-03 -1.5555463391665502e-03 -2.2864762198331634e-03 -1.5555463391665508e-03 1.0819116483332548e-03 2.2851318003331632e-03 -1.1223626099999176e-03 1.6195472024998821e-03 2.0117041792915170e-03 1.6016396362498813e-03 1.6016396362498807e-03 -2.5229295371664785e-03 1.0701582379165880e-03 1.0701582379165858e-03 -2.5612482603749615e-03 -1.8495433474999710e-03 -1.8495433474999706e-03 3.1990142869999525e-03 -1.3025153216666471e-03 -1.3025153216666466e-03 2.8580632467916237e-03 1.9108036124999702e-03 -1.3254289841666473e-03 -2.8563948660832910e-03 1.2512888533333141e-03 -1.8661036141666375e-03 -2.8563948660832910e-03 -1.8661036141666373e-03 1.2512888533333154e-03 2.8580632467916237e-03 -1.3254289841666458e-03 1.9108036124999709e-03 2.5137754451666286e-03 1.9173300824999703e-03 1.9173300824999709e-03 -3.1548782332082867e-03 1.2641687191666472e-03 1.2641687191666470e-03 -1.6739034707078364e-03 -1.8635059858327814e-03 -1.5261125037495471e-03 2.6688356496658745e-03 -5.8866176249982455e-04 -1.1099023112496724e-03 1.8809400085827745e-03 1.9165079341660984e-03 -1.1328965183329967e-03 -2.3699441465409635e-03 5.6963389624983048e-04 -1.5357381445828785e-03 -1.9183312011660969e-03 -1.8656527954161138e-03 1.0797119120830147e-03 2.4026895798326202e-03 -6.0043470166648810e-04 1.5956700437495250e-03 1.6194396980411859e-03 1.8846806616661085e-03 1.5659285437495346e-03 -2.6097261177075587e-03 5.4743275333317052e-04 1.0633389783330169e-03 -2.0975725839166050e-03 -2.2821742933332658e-03 -1.8671408974999439e-03 3.3300971000415694e-03 -6.9009872958331227e-04 -1.3496585599999610e-03 2.3611810821665968e-03 2.3489462558332645e-03 -1.3861249199999591e-03 -2.9521648172915788e-03 6.7023415874997976e-04 -1.8891068808332767e-03 -2.4021286131249296e-03 -2.3126907029165987e-03 1.3166692949999582e-03 2.9989021296249101e-03 -7.3168557458331055e-04 1.9497610249999424e-03 2.0241963303749403e-03 2.3325552737499316e-03 1.9220961458332774e-03 -3.2625106278749033e-03 6.6491361208331214e-04 1.3035047924999589e-03 -1.2054013625001964e-03 -2.0381641700003318e-03 -1.4882975054169095e-03 2.6034962608754253e-03 -7.5523902500011940e-05 -1.1227696254168503e-03 1.3867538498752250e-03 2.0845084650003396e-03 -1.1754099483335242e-03 -2.2873750006253729e-03 9.0710342500014560e-05 -1.5232149316669146e-03 -1.4464634513752352e-03 -2.0543933050003352e-03 1.1119063137501814e-03 2.3405426302503815e-03 -1.0585054250001724e-04 1.5772080579169244e-03 1.1303421911251837e-03 2.0392068650003322e-03 1.5340782433335832e-03 -2.5218951176254108e-03 5.9506247500009612e-05 1.0864993958335095e-03 -1.5322714521664397e-03 -2.5112181904162951e-03 -1.8273320612497304e-03 3.2249873615828556e-03 -5.3970487916659644e-05 -1.3716179770831307e-03 1.7604456051664055e-03 2.5696446404162862e-03 -1.4222774458331222e-03 -2.8307733755829137e-03 7.7056289583322805e-05 -1.8564777537497246e-03 -1.8260671302080624e-03 -2.5528107091662877e-03 1.3601862137497969e-03 2.9045936556662357e-03 -1.1281142624998358e-04 1.9310902720830496e-03 1.4318531442081210e-03 2.5297249074996246e-03 1.8679095170830566e-03 -3.1327678086662016e-03 5.4384976249992121e-05 1.3185192349998045e-03 -6.9750535900011366e-04 -2.0647111575003360e-03 -1.4746678900002409e-03 2.3845825518753892e-03 3.5284607125005759e-04 -1.1785659275001931e-03 8.6039042550014016e-04 2.0994166575003421e-03 -1.2254634520835340e-03 -2.0622111226253370e-03 -3.0020767500004884e-04 -1.5000000858335775e-03 -9.2652532150015146e-04 -2.0876955825003402e-03 1.1530399600001885e-03 2.1216620223753454e-03 2.9883445750004831e-04 1.5472299675002522e-03 6.0415389225009864e-04 2.0350571862503318e-03 1.5255260533335816e-03 -2.2845470888753733e-03 -3.3353995750005401e-04 1.1529013745835222e-03 -9.4056302616695939e-04 -2.5144108258341171e-03 -1.7542775150005470e-03 2.9031167551675711e-03 5.1539201750016033e-04 -1.3835374350004306e-03 1.1361670562503540e-03 2.5548545412507964e-03 -1.4079424083337719e-03 -2.5158477975841167e-03 -4.4395928541680489e-04 -1.7515525283338784e-03 -1.2072157866670436e-03 -2.5574176950007958e-03 1.3544259833337549e-03 2.5953959089174750e-03 4.3333400208346812e-04 1.8363942016672399e-03 8.1994682908358932e-04 2.4859849629174403e-03 1.7806639800005534e-03 -2.7909999390008694e-03 -4.7377771750014755e-04 1.3258257216670793e-03 -1.6739034707081589e-03 -1.5261125037498418e-03 -1.8635059858331407e-03 2.6688356496663897e-03 -1.1099023112498862e-03 -5.8866176249993741e-04 2.4026895798330838e-03 1.5956700437498345e-03 -6.0043470166660292e-04 -1.9183312011664675e-03 1.0797119120832220e-03 -1.8656527954164727e-03 -2.3699441465414206e-03 -1.5357381445831738e-03 5.6963389624994129e-04 1.8809400085831375e-03 -1.1328965183332162e-03 1.9165079341664682e-03 1.6194396980414986e-03 1.5659285437498375e-03 1.8846806616664709e-03 -2.6097261177080622e-03 1.0633389783332233e-03 5.4743275333327644e-04 -2.0975725839167906e-03 -1.8671408975001102e-03 -2.2821742933334705e-03 3.3300971000418639e-03 -1.3496585600000794e-03 -6.9009872958337483e-04 2.9989021296251768e-03 1.9497610250001146e-03 -7.3168557458337517e-04 -2.4021286131251426e-03 1.3166692950000770e-03 -2.3126907029168038e-03 -2.9521648172918412e-03 -1.8891068808334455e-03 6.7023415875003885e-04 2.3611810821668063e-03 -1.3861249200000812e-03 2.3489462558334718e-03 2.0241963303751199e-03 1.9220961458334472e-03 2.3325552737501376e-03 -3.2625106278751925e-03 1.3035047925000767e-03 6.6491361208337167e-04 -1.3435132229168058e-03 -1.8153547395835222e-03 -1.8153547395835224e-03 2.8122835926252913e-03 -5.8564520458339404e-04 -5.8564520458339469e-04 2.0361492471252106e-03 1.9032007237501977e-03 -6.5089907416673452e-04 -2.0368684831252111e-03 5.9965549958339553e-04 -1.8470571470835251e-03 -2.0368684831252107e-03 -1.8470571470835251e-03 5.9965549958339553e-04 2.0361492471252110e-03 -6.5089907416673442e-04 1.9032007237501977e-03 1.2614533736251307e-03 1.8330468520835232e-03 1.8330468520835219e-03 -2.7287852713336158e-03 5.6305309000005861e-04 5.6305309000005872e-04 -1.6702314721253222e-03 -2.2793770850004394e-03 -2.2793770850004398e-03 3.5247699437923469e-03 -7.4412897958347590e-04 -7.4412897958347449e-04 2.5461987213754905e-03 2.3896109358337932e-03 -8.3194534125016143e-04 -2.5452966489588236e-03 7.6280513708347963e-04 -2.3266708654171159e-03 -2.5452966489588240e-03 -2.3266708654171150e-03 7.6280513708347909e-04 2.5461987213754905e-03 -8.3194534125016046e-04 2.3896109358337936e-03 1.5658233541253025e-03 2.3079947079171106e-03 2.3079947079171111e-03 -3.4221659706256602e-03 7.2171149041680579e-04 7.2171149041680665e-04 -8.9241299825002667e-04 -1.9761233004167256e-03 -1.7387508908333852e-03 2.7559752016667483e-03 -8.0705729166669231e-05 -6.4465435083335156e-04 1.5502558690417127e-03 2.0712200537500616e-03 -7.4333333708335525e-04 -1.9651572917500585e-03 1.4633835875000465e-04 -1.7842826141667178e-03 -1.5783263979583797e-03 -2.0288501320833937e-03 6.7432492541668731e-04 1.9943240699167252e-03 -1.8527571833333893e-04 1.8426421195833877e-03 7.8750848804168988e-04 1.9632175025000587e-03 1.7546120395833850e-03 -2.6521669407084114e-03 9.0178965000002923e-05 6.3944210833335362e-04 -1.1182323700407550e-03 -2.4762331537479796e-03 -2.1846033174982159e-03 3.4396757765388602e-03 -1.0362345749991472e-04 -8.1783355624933372e-04 1.9425591867900823e-03 2.5941907704145496e-03 -9.2436851874924664e-04 -2.4504165209563340e-03 1.8614324249984784e-04 -2.2242639774981837e-03 -1.9786938498733858e-03 -2.5460421166645895e-03 8.5182312249930544e-04 2.4852924367479720e-03 -2.3876277583313808e-04 2.3101988924981143e-03 9.8943459429086020e-04 2.4635223316646568e-03 2.1902744112482116e-03 -3.3096192534973002e-03 1.2080515916656753e-04 7.9877294374934940e-04 -3.8516000204156376e-04 -1.9619881616661427e-03 -1.6539518945828911e-03 2.5205133547909942e-03 3.2514208499991238e-04 -7.6401959583312991e-04 1.0125073172913967e-03 2.0550319029161183e-03 -8.4521660374977455e-04 -1.7313846789162042e-03 -2.0727266291661062e-04 -1.6680392137495548e-03 -1.0567042516247177e-03 -2.0297970887494582e-03 7.6315065499979690e-04 1.7790551616245257e-03 1.8514612874994993e-04 1.7264581483328726e-03 2.6757557574992851e-04 1.9119276666661566e-03 1.6689081545828884e-03 -2.4064024768743588e-03 -2.7818986999992510e-04 7.7271034999979457e-04 -5.3237332104174640e-04 -2.4175139850003574e-03 -2.0226365187502992e-03 3.0906660428754586e-03 4.4946234833340024e-04 -9.0949060750013396e-04 1.2872926405001917e-03 2.5266170950003740e-03 -9.7703551750014431e-04 -2.1405047005419839e-03 -3.0146794166671149e-04 -2.0061351712502965e-03 -1.3445043852501992e-03 -2.5027063400003689e-03 9.0686891000013429e-04 2.1936285417086584e-03 2.7334583333337413e-04 2.1058503075003124e-03 3.9434304291672591e-04 2.3547119333336827e-03 2.0087568687502965e-03 -2.9485478611671026e-03 -3.8244894333339037e-04 8.9382172875013201e-04 -1.2054013625001066e-03 -1.4882975054167982e-03 -2.0381641700001796e-03 2.6034962608752310e-03 -1.1227696254167661e-03 -7.5523902500007604e-05 2.3405426302502072e-03 1.5772080579168055e-03 -1.0585054250000879e-04 -1.4464634513751283e-03 1.1119063137500990e-03 -2.0543933050001812e-03 -2.2873750006252025e-03 -1.5232149316668014e-03 9.0710342500007512e-05 1.3867538498751227e-03 -1.1754099483334377e-03 2.0845084650001852e-03 1.1303421911251000e-03 1.5340782433334687e-03 2.0392068650001813e-03 -2.5218951176252235e-03 1.0864993958334297e-03 5.9506247500005261e-05 -1.5322714521664167e-03 -1.8273320612497029e-03 -2.5112181904162556e-03 3.2249873615828074e-03 -1.3716179770831092e-03 -5.3970487916658722e-05 2.9045936556661919e-03 1.9310902720830194e-03 -1.1281142624998151e-04 -1.8260671302080356e-03 1.3601862137497776e-03 -2.5528107091662491e-03 -2.8307733755828716e-03 -1.8564777537496975e-03 7.7056289583320867e-05 1.7604456051663791e-03 -1.4222774458331009e-03 2.5696446404162481e-03 1.4318531442080997e-03 1.8679095170830301e-03 2.5297249074995873e-03 -3.1327678086661556e-03 1.3185192349997842e-03 5.4384976249990868e-05 -8.9241299824997355e-04 -1.7387508908332824e-03 -1.9761233004166080e-03 2.7559752016665853e-03 -6.4465435083331480e-04 -8.0705729166664149e-05 1.9943240699166077e-03 1.8426421195832791e-03 -1.8527571833332773e-04 -1.5783263979582871e-03 6.7432492541664741e-04 -2.0288501320832731e-03 -1.9651572917499418e-03 -1.7842826141666137e-03 1.4633835874999597e-04 1.5502558690416205e-03 -7.4333333708331156e-04 2.0712200537499389e-03 7.8750848804164369e-04 1.7546120395832818e-03 1.9632175024999424e-03 -2.6521669407082549e-03 6.3944210833331524e-04 9.0178964999998641e-05 -1.1182323700413184e-03 -2.1846033174993174e-03 -2.4762331537492260e-03 3.4396757765405941e-03 -8.1783355624974615e-04 -1.0362345749996793e-04 2.4852924367492250e-03 2.3101988924992788e-03 -2.3876277583325967e-04 -1.9786938498743832e-03 8.5182312249973489e-04 -2.5460421166658732e-03 -2.4504165209575687e-03 -2.2242639774993048e-03 1.8614324249994192e-04 1.9425591867910613e-03 -9.2436851874971252e-04 2.5941907704158588e-03 9.8943459429135850e-04 2.1902744112493157e-03 2.4635223316658984e-03 -3.3096192534989685e-03 7.9877294374975153e-04 1.2080515916662857e-04 -4.7219527604203099e-04 -1.8654982016681060e-03 -1.8654982016681060e-03 2.7307956070437736e-03 -1.8020791208347257e-04 -1.8020791208347205e-04 1.5438873807511913e-03 1.9722494254181878e-03 -3.1815558791691267e-04 -1.5399338288761880e-03 2.5578751083353085e-04 -1.9181185708348140e-03 -1.5399338288761876e-03 -1.9181185708348134e-03 2.5578751083353058e-04 1.5438873807511909e-03 -3.1815558791691207e-04 1.9722494254181891e-03 3.4907205070860292e-04 1.8425389720847542e-03 1.8425389720847550e-03 -2.6155794854603506e-03 2.1140436416683002e-04 2.1140436416683107e-04 -6.0134345012488382e-04 -2.3376978374995490e-03 -2.3376978374995503e-03 3.3980567434576778e-03 -2.2798066041662245e-04 -2.2798066041662180e-04 1.9235313290412949e-03 2.4643833249995244e-03 -3.8418297166659197e-04 -1.9285565077912944e-03 3.1738565791660515e-04 -2.3872433245828726e-03 -1.9285565077912946e-03 -2.3872433245828726e-03 3.1738565791660542e-04 1.9235313290412951e-03 -3.8418297166659230e-04 2.4643833249995248e-03 4.5905627212491153e-04 2.2978383270828889e-03 2.2978383270828889e-03 -3.2457192079577073e-03 2.5749748416661704e-04 2.5749748416661726e-04 -6.6800905000046168e-06 -1.8236783362512445e-03 -1.7260482075011773e-03 2.5428353585017346e-03 1.9294588458346429e-04 -3.6207442916691429e-04 1.0521566758340511e-03 1.9230053695846446e-03 -4.7071236250032097e-04 -1.3531075681675892e-03 -7.2123654583382127e-05 -1.7276186108345117e-03 -1.0698364739590638e-03 -1.8823074191679501e-03 3.9024041875026578e-04 1.3831754773759432e-03 2.7481442083351521e-05 1.7896952512512217e-03 -1.1989131637508205e-04 1.7614851891678677e-03 1.6994526212511592e-03 -2.4286520627099894e-03 -1.2680847541675269e-04 4.0706531875027787e-04 -7.0606242375003607e-05 -2.2490434183334326e-03 -2.1192387000000946e-03 3.1054653298334713e-03 2.7972220750001239e-04 -4.0943441041668596e-04 1.3145346099583920e-03 2.3585288866667703e-03 -5.1635688083335627e-04 -1.6884009779167420e-03 -1.3526750541667268e-04 -2.0920175208334266e-03 -1.3505899574167259e-03 -2.3063397791667686e-03 4.4160604625001964e-04 1.7087100031250762e-03 8.8467199583336937e-05 2.1899702458334294e-03 -6.6474394500002544e-05 2.1618850770834292e-03 2.0598458850000917e-03 -2.9526383707084644e-03 -1.9795266791667508e-04 4.4562533500002062e-04 -6.9750535899992783e-04 -1.4746678899998466e-03 -2.0647111574997861e-03 2.3845825518747535e-03 -1.1785659274998776e-03 3.5284607124996310e-04 2.1216620223747794e-03 1.5472299674998396e-03 2.9883445749996829e-04 -9.2652532149990405e-04 1.1530399599998806e-03 -2.0876955824997833e-03 -2.0622111226247866e-03 -1.5000000858331770e-03 -3.0020767499996812e-04 8.6039042549991064e-04 -1.2254634520832070e-03 2.0994166574997818e-03 6.0415389224993720e-04 1.5255260533331744e-03 2.0350571862497893e-03 -2.2845470888747631e-03 1.1529013745832136e-03 -3.3353995749996510e-04 -9.4056302616677811e-04 -1.7542775150002079e-03 -2.5144108258336319e-03 2.9031167551670108e-03 -1.3835374350001637e-03 5.1539201750006090e-04 2.5953959089169737e-03 1.8363942016668847e-03 4.3333400208338431e-04 -1.2072157866668100e-03 1.3544259833334937e-03 -2.5574176950003053e-03 -2.5158477975836323e-03 -1.7515525283335401e-03 -4.4395928541671940e-04 1.1361670562501348e-03 -1.4079424083335002e-03 2.5548545412503038e-03 8.1994682908343125e-04 1.7806639800002097e-03 2.4859849629169611e-03 -2.7909999390003308e-03 1.3258257216668238e-03 -4.7377771750005653e-04 -3.8516000204191802e-04 -1.6539518945844125e-03 -1.9619881616679477e-03 2.5205133547933113e-03 -7.6401959583383269e-04 3.2514208500021184e-04 1.7790551616261609e-03 1.7264581483344599e-03 1.8514612875011931e-04 -1.0567042516256894e-03 7.6315065500049794e-04 -2.0297970887513238e-03 -1.7313846789177969e-03 -1.6680392137510879e-03 -2.0727266291680174e-04 1.0125073172923273e-03 -8.4521660375055192e-04 2.0550319029180083e-03 2.6757557575017446e-04 1.6689081545844223e-03 1.9119276666679148e-03 -2.4064024768765714e-03 7.7271035000050484e-04 -2.7818987000018130e-04 -5.3237332104182522e-04 -2.0226365187505989e-03 -2.4175139850007143e-03 3.0906660428759161e-03 -9.0949060750026938e-04 4.4946234833346784e-04 2.1936285417089832e-03 2.1058503075006233e-03 2.7334583333341506e-04 -1.3445043852503991e-03 9.0686891000026852e-04 -2.5027063400007397e-03 -2.1405047005423009e-03 -2.0061351712505936e-03 -3.0146794166675611e-04 1.2872926405003823e-03 -9.7703551750028873e-04 2.5266170950007483e-03 3.9434304291678424e-04 2.0087568687505932e-03 2.3547119333340301e-03 -2.9485478611675398e-03 8.9382172875026450e-04 -3.8244894333344708e-04 -6.6800905000005739e-06 -1.7260482075002052e-03 -1.8236783362502171e-03 2.5428353585003022e-03 -3.6207442916670959e-04 1.9294588458335592e-04 1.3831754773751641e-03 1.7896952512502123e-03 2.7481442083336135e-05 -1.0698364739584604e-03 3.9024041875004579e-04 -1.8823074191668897e-03 -1.3531075681668262e-03 -1.7276186108335387e-03 -7.2123654583341483e-05 1.0521566758334583e-03 -4.7071236250005588e-04 1.9230053695835614e-03 -1.1989131637501436e-04 1.6994526212502025e-03 1.7614851891668759e-03 -2.4286520627086212e-03 4.0706531875004819e-04 -1.2680847541668108e-04 -7.0606242374991355e-05 -2.1192386999997169e-03 -2.2490434183330323e-03 3.1054653298329179e-03 -4.0943441041661223e-04 2.7972220749996186e-04 1.7087100031247717e-03 2.1899702458330404e-03 8.8467199583321636e-05 -1.3505899574164858e-03 4.4160604624994109e-04 -2.3063397791663574e-03 -1.6884009779164410e-03 -2.0920175208330536e-03 -1.3526750541664886e-04 1.3145346099581578e-03 -5.1635688083326379e-04 2.3585288866663505e-03 -6.6474394499990429e-05 2.0598458849997244e-03 2.1618850770830440e-03 -2.9526383707079388e-03 4.4562533499994082e-04 -1.9795266791663931e-04 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 hypre-2.33.0/src/test/TEST_fei/RHS.1000066400000000000000000001266511477326011500166350ustar00rootroot00000000000000 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 3.9117152149987811e-04 -1.6685648693328132e-03 -1.6685648693328130e-03 2.4553807738325680e-03 -2.5938571666658487e-05 -2.5938571666658382e-05 9.8090309683302747e-04 1.7163175576661309e-03 -1.4875723916661974e-04 -9.7160249316636388e-04 8.3753089666640509e-05 -1.6629235411661485e-03 -9.7160249316636388e-04 -1.6629235411661477e-03 8.3753089666640170e-05 9.8090309683302769e-04 -1.4875723916661968e-04 1.7163175576661307e-03 -5.1217578749983988e-04 1.6051090231661664e-03 1.6051090231661658e-03 -2.3529777151659330e-03 1.0100455083330139e-04 1.0100455083330130e-04 8.3753089666703515e-05 -1.6629235411674062e-03 -9.7160249316709864e-04 1.7163175576674294e-03 -1.4875723916673219e-04 9.8090309683376950e-04 1.6051090231673801e-03 1.6051090231673803e-03 -5.1217578750022673e-04 1.0100455083337784e-04 1.0100455083337750e-04 -2.3529777151677124e-03 -1.6685648693340756e-03 -1.6685648693340748e-03 3.9117152150017366e-04 -2.5938571666678064e-05 -2.5938571666677485e-05 2.4553807738344250e-03 -1.4875723916673162e-04 1.7163175576674294e-03 9.8090309683376950e-04 -1.6629235411674060e-03 8.3753089666703772e-05 -9.7160249316709908e-04 -3.0020767500000829e-04 -2.0622111226250607e-03 -1.5000000858333780e-03 2.0994166575000611e-03 8.6039042550002567e-04 -1.2254634520833701e-03 3.5284607125000961e-04 2.3845825518750709e-03 -1.1785659275000346e-03 -2.0647111575000606e-03 -6.9750535900002075e-04 -1.4746678900000429e-03 -3.3353995750001059e-04 -2.2845470888750679e-03 1.1529013745833678e-03 2.0350571862500595e-03 6.0415389225001786e-04 1.5255260533333784e-03 2.9883445750000830e-04 2.1216620223750622e-03 1.5472299675000458e-03 -2.0876955825000622e-03 -9.2652532150002743e-04 1.1530399600000350e-03 -4.4395928541678456e-04 -2.5158477975840044e-03 -1.7515525283338003e-03 2.5548545412506824e-03 1.1361670562503032e-03 -1.4079424083337103e-03 5.1539201750013745e-04 2.9031167551674406e-03 -1.3835374350003691e-03 -2.5144108258340044e-03 -9.4056302616691775e-04 -1.7542775150004681e-03 -4.7377771750012674e-04 -2.7909999390007445e-03 1.3258257216670207e-03 2.4859849629173297e-03 8.1994682908355257e-04 1.7806639800004740e-03 4.3333400208344849e-04 2.5953959089173597e-03 1.8363942016671568e-03 -2.5574176950006822e-03 -1.2072157866669893e-03 1.3544259833336953e-03 9.0710342499973983e-05 -2.2873750006243555e-03 -1.5232149316662374e-03 2.0845084649994128e-03 1.3867538498746087e-03 -1.1754099483330021e-03 -7.5523902499979157e-05 2.6034962608742660e-03 -1.1227696254163498e-03 -2.0381641699994237e-03 -1.2054013624996595e-03 -1.4882975054162477e-03 5.9506247499982412e-05 -2.5218951176242889e-03 1.0864993958330266e-03 2.0392068649994254e-03 1.1303421911246811e-03 1.5340782433329006e-03 -1.0585054249997044e-04 2.3405426302493394e-03 1.5772080579162209e-03 -2.0543933049994197e-03 -1.4464634513745918e-03 1.1119063137496872e-03 7.7056289583338634e-05 -2.8307733755835009e-03 -1.8564777537501112e-03 2.5696446404168201e-03 1.7604456051667705e-03 -1.4222774458334168e-03 -5.3970487916671279e-05 3.2249873615835252e-03 -1.3716179770834141e-03 -2.5112181904168155e-03 -1.5322714521667571e-03 -1.8273320612501082e-03 5.4384976250003119e-05 -3.1327678086668512e-03 1.3185192350000773e-03 2.5297249075001494e-03 1.4318531442084176e-03 1.8679095170834443e-03 -1.1281142625000730e-04 2.9045936556668377e-03 1.9310902720834490e-03 -2.5528107091668177e-03 -1.8260671302084415e-03 1.3601862137500799e-03 5.6963389624993185e-04 -2.3699441465413855e-03 -1.5357381445831513e-03 1.9165079341664398e-03 1.8809400085831099e-03 -1.1328965183331993e-03 -5.8866176249992971e-04 2.6688356496663503e-03 -1.1099023112498693e-03 -1.8635059858331132e-03 -1.6739034707081344e-03 -1.5261125037498192e-03 5.4743275333326809e-04 -2.6097261177080240e-03 1.0633389783332075e-03 1.8846806616664435e-03 1.6194396980414741e-03 1.5659285437498146e-03 -6.0043470166659544e-04 2.4026895798330487e-03 1.5956700437498106e-03 -1.8656527954164454e-03 -1.9183312011664391e-03 1.0797119120832064e-03 6.7023415875001012e-04 -2.9521648172917102e-03 -1.8891068808333611e-03 2.3489462558333690e-03 2.3611810821667018e-03 -1.3861249200000194e-03 -6.9009872958334360e-04 3.3300971000417155e-03 -1.3496585600000191e-03 -2.2821742933333681e-03 -2.0975725839166974e-03 -1.8671408975000272e-03 6.6491361208334044e-04 -3.2625106278750477e-03 1.3035047925000188e-03 2.3325552737500344e-03 2.0241963303750297e-03 1.9220961458333624e-03 -7.3168557458334210e-04 2.9989021296250441e-03 1.9497610250000278e-03 -2.3126907029167002e-03 -2.4021286131250359e-03 1.3166692950000185e-03 1.0819116483332533e-03 -2.2864762198331642e-03 -1.5555463391665519e-03 1.6195472024998804e-03 2.2851318003331632e-03 -1.1223626099999178e-03 -1.1280049454165844e-03 2.5612482603748093e-03 -1.1280049454165837e-03 -1.5673428304165506e-03 -2.0473340634998474e-03 -1.5673428304165506e-03 1.0701582379165873e-03 -2.5229295371664785e-03 1.0701582379165884e-03 1.6016396362498820e-03 2.0117041792915170e-03 1.6016396362498815e-03 -1.1223626099999180e-03 2.2851318003331632e-03 1.6195472024998802e-03 -1.5555463391665495e-03 -2.2864762198331634e-03 1.0819116483332539e-03 1.2512888533334626e-03 -2.8563948660836301e-03 -1.8661036141668591e-03 1.9108036125001977e-03 2.8580632467919633e-03 -1.3254289841668036e-03 -1.3025153216668012e-03 3.1990142870003328e-03 -1.3025153216668015e-03 -1.8495433475001907e-03 -2.5612482603752655e-03 -1.8495433475001904e-03 1.2641687191667975e-03 -3.1548782332086610e-03 1.2641687191667971e-03 1.9173300825001984e-03 2.5137754451669274e-03 1.9173300825001977e-03 -1.3254289841668043e-03 2.8580632467919633e-03 1.9108036125001972e-03 -1.8661036141668585e-03 -2.8563948660836301e-03 1.2512888533334626e-03 -2.0727266291666949e-04 -1.7313846789166927e-03 -1.6680392137500251e-03 2.0550319029166968e-03 1.0125073172916818e-03 -8.4521660375001285e-04 3.2514208500000405e-04 2.5205133547917050e-03 -7.6401959583334523e-04 -1.9619881616666957e-03 -3.8516000204167234e-04 -1.6539518945833580e-03 -2.7818987000000290e-04 -2.4064024768750366e-03 7.7271035000001207e-04 1.9119276666666948e-03 2.6757557575000365e-04 1.6689081545833585e-03 1.8514612875000184e-04 1.7790551616250270e-03 1.7264581483333583e-03 -2.0297970887500297e-03 -1.0567042516250154e-03 7.6315065500001233e-04 -3.0146794166659933e-04 -2.1405047005411898e-03 -2.0061351712495528e-03 2.5266170949994377e-03 1.2872926404997145e-03 -9.7703551749978176e-04 4.4946234833323327e-04 3.0906660428743123e-03 -9.0949060749979699e-04 -2.4175139849994609e-03 -5.3237332104154886e-04 -2.0226365187495498e-03 -3.8244894333324872e-04 -2.9485478611660102e-03 8.9382172874980046e-04 2.3547119333328084e-03 3.9434304291657927e-04 2.0087568687495519e-03 2.7334583333327243e-04 2.1936285417078457e-03 2.1058503074995300e-03 -2.5027063399994422e-03 -1.3445043852497011e-03 9.0686890999979819e-04 1.4633835874991211e-04 -1.9651572917488056e-03 -1.7842826141655816e-03 2.0712200537487402e-03 1.5502558690407243e-03 -7.4333333708288200e-04 -8.0705729166617691e-05 2.7559752016649910e-03 -6.4465435083294184e-04 -1.9761233004154648e-03 -8.9241299824945823e-04 -1.7387508908322767e-03 9.0178964999944891e-05 -2.6521669407067214e-03 6.3944210833294520e-04 1.9632175024988071e-03 7.8750848804118821e-04 1.7546120395822663e-03 -1.8527571833322070e-04 1.9943240699154541e-03 1.8426421195822126e-03 -2.0288501320821009e-03 -1.5783263979573738e-03 6.7432492541625786e-04 1.8614324249996916e-04 -2.4504165209579334e-03 -2.2242639774996357e-03 2.5941907704162431e-03 1.9425591867913497e-03 -9.2436851874984913e-04 -1.0362345749998231e-04 3.4396757765411045e-03 -8.1783355624986758e-04 -2.4762331537495951e-03 -1.1182323700414843e-03 -2.1846033174996418e-03 1.2080515916664649e-04 -3.3096192534994595e-03 7.9877294374986970e-04 2.4635223316662636e-03 9.8943459429150552e-04 2.1902744112496410e-03 -2.3876277583329372e-04 2.4852924367495944e-03 2.3101988924996214e-03 -2.5460421166662514e-03 -1.9786938498746773e-03 8.5182312249986185e-04 5.9965549958367103e-04 -2.0368684831261479e-03 -1.8470571470843749e-03 1.9032007237510750e-03 2.0361492471261469e-03 -6.5089907416703355e-04 -5.8564520458366303e-04 2.8122835926265846e-03 -5.8564520458366336e-04 -1.8153547395843587e-03 -1.3435132229174236e-03 -1.8153547395843572e-03 5.6305309000031774e-04 -2.7287852713348713e-03 5.6305309000031763e-04 1.8330468520843658e-03 1.2614533736257107e-03 1.8330468520843667e-03 -6.5089907416703409e-04 2.0361492471261469e-03 1.9032007237510733e-03 -1.8470571470843747e-03 -2.0368684831261474e-03 5.9965549958367135e-04 7.6280513708362665e-04 -2.5452966489593141e-03 -2.3266708654175630e-03 2.3896109358342529e-03 2.5461987213759810e-03 -8.3194534125032049e-04 -7.4412897958361858e-04 3.5247699437930234e-03 -7.4412897958361902e-04 -2.2793770850008778e-03 -1.6702314721256434e-03 -2.2793770850008774e-03 7.2171149041694608e-04 -3.4221659706263194e-03 7.2171149041694478e-04 2.3079947079175543e-03 1.5658233541256043e-03 2.3079947079175543e-03 -8.3194534125031940e-04 2.5461987213759802e-03 2.3896109358342533e-03 -2.3266708654175634e-03 -2.5452966489593136e-03 7.6280513708362621e-04 1.0797119120831901e-03 -1.9183312011664098e-03 -1.8656527954164178e-03 1.5956700437497872e-03 2.4026895798330123e-03 -6.0043470166658600e-04 -1.1099023112498526e-03 2.6688356496663099e-03 -5.8866176249992061e-04 -1.5261125037497956e-03 -1.6739034707081090e-03 -1.8635059858330852e-03 1.0633389783331910e-03 -2.6097261177079846e-03 5.4743275333325953e-04 1.5659285437497907e-03 1.6194396980414496e-03 1.8846806616664158e-03 -1.1328965183331824e-03 1.8809400085830813e-03 1.9165079341664118e-03 -1.5357381445831281e-03 -2.3699441465413495e-03 5.6963389624992340e-04 1.3166692949998819e-03 -2.4021286131247870e-03 -2.3126907029164612e-03 1.9497610249998266e-03 2.9989021296247327e-03 -7.3168557458326718e-04 -1.3496585599998808e-03 3.3300971000413712e-03 -6.9009872958327118e-04 -1.8671408974998333e-03 -2.0975725839164801e-03 -2.2821742933331304e-03 1.3035047924998824e-03 -3.2625106278747094e-03 6.6491361208327257e-04 1.9220961458331627e-03 2.0241963303748193e-03 2.3325552737497928e-03 -1.3861249199998774e-03 2.3611810821664559e-03 2.3489462558331248e-03 -1.8891068808331636e-03 -2.9521648172914036e-03 6.7023415874993986e-04 -7.2123654583390584e-05 -1.3531075681677499e-03 -1.7276186108347164e-03 1.9230053695848733e-03 1.0521566758341756e-03 -4.7071236250037626e-04 1.9294588458348695e-04 2.5428353585020365e-03 -3.6207442916695647e-04 -1.8236783362514603e-03 -6.6800905000052512e-06 -1.7260482075013837e-03 -1.2680847541676727e-04 -2.4286520627102787e-03 4.0706531875032585e-04 1.7614851891680776e-03 -1.1989131637509636e-04 1.6994526212513609e-03 2.7481442083355197e-05 1.3831754773761069e-03 1.7896952512514324e-03 -1.8823074191681736e-03 -1.0698364739591898e-03 3.9024041875031223e-04 -1.3526750541672098e-04 -1.6884009779173420e-03 -2.0920175208341708e-03 2.3585288866676091e-03 1.3145346099588590e-03 -5.1635688083353950e-04 2.7972220750011143e-04 3.1054653298345763e-03 -4.0943441041683075e-04 -2.2490434183342328e-03 -7.0606242375028828e-05 -2.1192387000008479e-03 -1.9795266791674564e-04 -2.9526383707095139e-03 4.4562533500017843e-04 2.1618850770841976e-03 -6.6474394500026492e-05 2.0598458850008255e-03 8.8467199583368636e-05 1.7087100031256842e-03 2.1899702458342105e-03 -2.3063397791675891e-03 -1.3505899574172068e-03 4.4160604625017653e-04 2.5578751083354966e-04 -1.5399338288763021e-03 -1.9181185708349554e-03 1.9722494254183348e-03 1.5438873807513053e-03 -3.1815558791693560e-04 -1.8020791208348550e-04 2.7307956070439748e-03 -1.8020791208348593e-04 -1.8654982016682443e-03 -4.7219527604206585e-04 -1.8654982016682443e-03 2.1140436416684511e-04 -2.6155794854605448e-03 2.1140436416684560e-04 1.8425389720848912e-03 3.4907205070862791e-04 1.8425389720848919e-03 -3.1815558791693549e-04 1.5438873807513047e-03 1.9722494254183348e-03 -1.9181185708349556e-03 -1.5399338288763019e-03 2.5578751083354966e-04 3.1738565791646908e-04 -1.9285565077904643e-03 -2.3872433245818465e-03 2.4643833249984662e-03 1.9235313290404683e-03 -3.8418297166642690e-04 -2.2798066041652439e-04 3.3980567434562172e-03 -2.2798066041652455e-04 -2.3376978374985446e-03 -6.0134345012462589e-04 -2.3376978374985442e-03 2.5749748416650645e-04 -3.2457192079563108e-03 2.5749748416650645e-04 2.2978383270819028e-03 4.5905627212471399e-04 2.2978383270819032e-03 -3.8418297166642717e-04 1.9235313290404694e-03 2.4643833249984662e-03 -2.3872433245818473e-03 -1.9285565077904649e-03 3.1738565791646913e-04 6.7432492541607636e-04 -1.5783263979569520e-03 -2.0288501320815579e-03 1.8426421195817202e-03 1.9943240699149215e-03 -1.8527571833317120e-04 -6.4465435083276988e-04 2.7559752016642551e-03 -8.0705729166596142e-05 -1.7387508908318118e-03 -8.9241299824921970e-04 -1.9761233004149375e-03 6.3944210833277390e-04 -2.6521669407060114e-03 9.0178964999921215e-05 1.7546120395817984e-03 7.8750848804097766e-04 1.9632175024982823e-03 -7.4333333708268305e-04 1.5502558690403101e-03 2.0712200537481877e-03 -1.7842826141651045e-03 -1.9651572917482804e-03 1.4633835874987235e-04 8.5182312249965943e-04 -1.9786938498742067e-03 -2.5460421166656473e-03 2.3101988924990745e-03 2.4852924367490046e-03 -2.3876277583323747e-04 -8.1783355624967329e-04 3.4396757765402875e-03 -1.0362345749995771e-04 -2.1846033174991236e-03 -1.1182323700412193e-03 -2.4762331537490079e-03 7.9877294374968127e-04 -3.3096192534986736e-03 1.2080515916661783e-04 2.1902744112491214e-03 9.8943459429127068e-04 2.4635223316656798e-03 -9.2436851874963066e-04 1.9425591867908880e-03 2.5941907704156268e-03 -2.2242639774991070e-03 -2.4504165209573519e-03 1.8614324249992468e-04 1.1119063137500168e-03 -1.4464634513750212e-03 -2.0543933050000299e-03 1.5772080579166904e-03 2.3405426302500342e-03 -1.0585054250000161e-04 -1.1227696254166835e-03 2.6034962608750384e-03 -7.5523902500000746e-05 -1.4882975054166885e-03 -1.2054013625000177e-03 -2.0381641700000295e-03 1.0864993958333484e-03 -2.5218951176250374e-03 5.9506247500000782e-05 1.5340782433333560e-03 1.1303421911250163e-03 2.0392068650000295e-03 -1.1754099483333507e-03 1.3867538498750194e-03 2.0845084650000303e-03 -1.5232149316666882e-03 -2.2873750006250329e-03 9.0710342500001048e-05 1.3601862137498975e-03 -1.8260671302081975e-03 -2.5528107091664768e-03 1.9310902720831935e-03 2.9045936556664504e-03 -1.1281142624999193e-04 -1.3716179770832319e-03 3.2249873615830928e-03 -5.3970487916663710e-05 -1.8273320612498655e-03 -1.5322714521665527e-03 -2.5112181904164807e-03 1.3185192349999006e-03 -3.1327678086664340e-03 5.4384976249996106e-05 1.8679095170831951e-03 1.4318531442082272e-03 2.5297249074998120e-03 -1.4222774458332275e-03 1.7604456051665358e-03 2.5696446404164766e-03 -1.8564777537498625e-03 -2.8307733755831227e-03 7.7056289583328646e-05 8.3753089666557175e-05 -9.7160249316539861e-04 -1.6629235411644958e-03 1.7163175576644255e-03 9.8090309683205299e-04 -1.4875723916647131e-04 -2.5938571666632080e-05 2.4553807738301285e-03 -2.5938571666632663e-05 -1.6685648693311548e-03 3.9117152149948915e-04 -1.6685648693311552e-03 1.0100455083320084e-04 -2.3529777151635950e-03 1.0100455083320100e-04 1.6051090231645716e-03 -5.1217578749933052e-04 1.6051090231645714e-03 -1.4875723916647185e-04 9.8090309683205299e-04 1.7163175576644259e-03 -1.6629235411644958e-03 -9.7160249316539840e-04 8.3753089666557012e-05 3.9024041875016760e-04 -1.0698364739587934e-03 -1.8823074191674752e-03 1.7896952512507695e-03 1.3831754773755945e-03 2.7481442083344870e-05 -3.6207442916682219e-04 2.5428353585010941e-03 1.9294588458341555e-04 -1.7260482075007427e-03 -6.6800905000026856e-06 -1.8236783362507844e-03 4.0706531875017558e-04 -2.4286520627093775e-03 -1.2680847541672070e-04 1.6994526212507303e-03 -1.1989131637505164e-04 1.7614851891674234e-03 -4.7071236250020225e-04 1.0521566758337859e-03 1.9230053695841604e-03 -1.7276186108340762e-03 -1.3531075681672486e-03 -7.2123654583363533e-05 7.6315065500007922e-04 -1.0567042516251091e-03 -2.0297970887502093e-03 1.7264581483335119e-03 1.7790551616251840e-03 1.8514612875001848e-04 -7.6401959583341332e-04 2.5205133547919279e-03 3.2514208500003273e-04 -1.6539518945835048e-03 -3.8516000204170638e-04 -1.9619881616668704e-03 7.7271035000008026e-04 -2.4064024768752500e-03 -2.7818987000002800e-04 1.6689081545835061e-03 2.6757557575002761e-04 1.9119276666668646e-03 -8.4521660375008831e-04 1.0125073172917709e-03 2.0550319029168790e-03 -1.6680392137501732e-03 -1.7313846789168464e-03 -2.0727266291668765e-04 1.1530399599999485e-03 -9.2652532149995934e-04 -2.0876955824999069e-03 1.5472299674999311e-03 2.1216620223749052e-03 2.9883445749998629e-04 -1.1785659274999481e-03 2.3845825518748944e-03 3.5284607124998419e-04 -1.4746678899999338e-03 -6.9750535899996914e-04 -2.0647111574999075e-03 1.1529013745832824e-03 -2.2845470888748984e-03 -3.3353995749998478e-04 1.5255260533332650e-03 6.0415389224997298e-04 2.0350571862499090e-03 -1.2254634520832797e-03 8.6039042549996246e-04 2.0994166574999067e-03 -1.5000000858332667e-03 -2.0622111226249089e-03 -3.0020767499998660e-04 hypre-2.33.0/src/test/TEST_fei/RHS.2000066400000000000000000001300121477326011500166200ustar00rootroot00000000000000 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -3.0020767499996427e-04 -1.5000000858331549e-03 -2.0622111226247558e-03 2.0994166574997506e-03 -1.2254634520831884e-03 8.6039042549989849e-04 2.0350571862497585e-03 1.5255260533331514e-03 6.0415389224992809e-04 -3.3353995749995990e-04 1.1529013745831972e-03 -2.2845470888747284e-03 -2.0647111574997544e-03 -1.4746678899998243e-03 -6.9750535899991742e-04 3.5284607124995811e-04 -1.1785659274998607e-03 2.3845825518747175e-03 2.9883445749996417e-04 1.5472299674998162e-03 2.1216620223747477e-03 -2.0876955824997521e-03 1.1530399599998628e-03 -9.2652532149989039e-04 -4.4395928541684430e-04 -1.7515525283340340e-03 -2.5158477975843405e-03 2.5548545412510232e-03 -1.4079424083338968e-03 1.1361670562504542e-03 2.4859849629176615e-03 1.7806639800007113e-03 8.1994682908366142e-04 -4.7377771750018962e-04 1.3258257216671968e-03 -2.7909999390011162e-03 -2.5144108258343401e-03 -1.7542775150007034e-03 -9.4056302616704265e-04 5.1539201750020619e-04 -1.3835374350005532e-03 2.9031167551678283e-03 4.3333400208350666e-04 1.8363942016674038e-03 2.5953959089177053e-03 -2.5574176950010235e-03 1.3544259833338751e-03 -1.2072157866671496e-03 -2.0727266291679228e-04 -1.6680392137510150e-03 -1.7313846789177199e-03 2.0550319029179163e-03 -8.4521660375051462e-04 1.0125073172922820e-03 1.9119276666678291e-03 1.6689081545843486e-03 2.6757557575016259e-04 -2.7818987000016835e-04 7.7271035000047003e-04 -2.4064024768764643e-03 -1.9619881616678605e-03 -1.6539518945843392e-03 -3.8516000204190083e-04 3.2514208500019688e-04 -7.6401959583379886e-04 2.5205133547932003e-03 1.8514612875011194e-04 1.7264581483343827e-03 1.7790551616260826e-03 -2.0297970887512336e-03 7.6315065500046444e-04 -1.0567042516256423e-03 -3.0146794166666238e-04 -2.0061351712499691e-03 -2.1405047005416335e-03 2.5266170949999611e-03 -9.7703551749998515e-04 1.2872926404999816e-03 2.3547119333332976e-03 2.0087568687499682e-03 3.9434304291666156e-04 -3.8244894333332787e-04 8.9382172874998597e-04 -2.9485478611666217e-03 -2.4175139849999627e-03 -2.0226365187499696e-03 -5.3237332104165945e-04 4.4946234833332684e-04 -9.0949060749998618e-04 3.0906660428749542e-03 2.7334583333332946e-04 2.1058503074999676e-03 2.1936285417082997e-03 -2.5027063399999622e-03 9.0686890999998662e-04 -1.3445043852499808e-03 -7.2123654583310042e-05 -1.7276186108327947e-03 -1.3531075681662448e-03 1.9230053695827342e-03 -4.7071236249985330e-04 1.0521566758330053e-03 1.7614851891661174e-03 1.6994526212494707e-03 -1.1989131637496265e-04 -1.2680847541662665e-04 4.0706531874987368e-04 -2.4286520627075756e-03 -1.8236783362494315e-03 -1.7260482074994625e-03 -6.6800904999977143e-06 1.9294588458327247e-04 -3.6207442916655368e-04 2.5428353584992080e-03 2.7481442083324497e-05 1.7896952512494420e-03 1.3831754773745689e-03 -1.8823074191660792e-03 3.9024041874987817e-04 -1.0698364739579998e-03 -1.3526750541661259e-04 -2.0920175208324955e-03 -1.6884009779159896e-03 2.3585288866657212e-03 -5.1635688083312631e-04 1.3145346099578072e-03 2.1618850770824668e-03 2.0598458849991753e-03 -6.6474394499972959e-05 -1.9795266791658686e-04 4.4562533499982151e-04 -2.9526383707071521e-03 -2.2490434183324330e-03 -2.1192386999991509e-03 -7.0606242374971948e-05 2.7972220749988792e-04 -4.0943441041650294e-04 3.1054653298320878e-03 8.8467199583297648e-05 2.1899702458324562e-03 1.7087100031243155e-03 -2.3063397791657420e-03 4.4160604624982302e-04 -1.3505899574161248e-03 9.0710342500015874e-05 -1.5232149316669367e-03 -2.2873750006254068e-03 2.0845084650003708e-03 -1.1754099483335424e-03 1.3867538498752458e-03 2.0392068650003621e-03 1.5340782433336062e-03 1.1303421911252006e-03 5.9506247500010479e-05 1.0864993958335260e-03 -2.5218951176254490e-03 -2.0381641700003622e-03 -1.4882975054169312e-03 -1.2054013625002139e-03 -7.5523902500013079e-05 -1.1227696254168668e-03 2.6034962608754634e-03 -1.0585054250001886e-04 1.5772080579169476e-03 2.3405426302504171e-03 -2.0543933050003651e-03 1.1119063137501985e-03 -1.4464634513752577e-03 7.7056289583321829e-05 -1.8564777537496975e-03 -2.8307733755828712e-03 2.5696446404162485e-03 -1.4222774458331009e-03 1.7604456051663791e-03 2.5297249074995869e-03 1.8679095170830301e-03 1.4318531442081002e-03 5.4384976249991254e-05 1.3185192349997837e-03 -3.1327678086661560e-03 -2.5112181904162582e-03 -1.8273320612497037e-03 -1.5322714521664169e-03 -5.3970487916658865e-05 -1.3716179770831098e-03 3.2249873615828074e-03 -1.1281142624998186e-04 1.9310902720830222e-03 2.9045936556661928e-03 -2.5528107091662500e-03 1.3601862137497768e-03 -1.8260671302080356e-03 1.4633835875006547e-04 -1.7842826141674598e-03 -1.9651572917508738e-03 2.0712200537509220e-03 -7.4333333708366403e-04 1.5502558690423558e-03 1.9632175025008736e-03 1.7546120395841142e-03 7.8750848804201709e-04 9.0178965000040274e-05 6.3944210833361784e-04 -2.6521669407095121e-03 -1.9761233004175452e-03 -1.7387508908341066e-03 -8.9241299825039747e-04 -8.0705729166702733e-05 -6.4465435083362077e-04 2.7559752016678924e-03 -1.8527571833341574e-04 1.8426421195841521e-03 1.9943240699175535e-03 -2.0288501320842355e-03 6.7432492541696649e-04 -1.5783263979590350e-03 1.8614324249991080e-04 -2.2242639774989418e-03 -2.4504165209571689e-03 2.5941907704154343e-03 -9.2436851874956171e-04 1.9425591867907438e-03 2.4635223316654964e-03 2.1902744112489588e-03 9.8943459429119717e-04 1.2080515916660876e-04 7.9877294374962175e-04 -3.3096192534984295e-03 -2.4762331537488240e-03 -2.1846033174989614e-03 -1.1182323700411364e-03 -1.0362345749995000e-04 -8.1783355624961258e-04 3.4396757765400325e-03 -2.3876277583321975e-04 2.3101988924989036e-03 2.4852924367488199e-03 -2.5460421166654578e-03 8.5182312249959600e-04 -1.9786938498740601e-03 2.5578751083354207e-04 -1.9181185708348986e-03 -1.5399338288762561e-03 1.9722494254182758e-03 -3.1815558791692611e-04 1.5438873807512592e-03 1.8425389720848372e-03 1.8425389720848364e-03 3.4907205070861745e-04 2.1140436416683929e-04 2.1140436416683902e-04 -2.6155794854604668e-03 -1.8654982016681895e-03 -1.8654982016681892e-03 -4.7219527604205192e-04 -1.8020791208348059e-04 -1.8020791208348016e-04 2.7307956070438937e-03 -3.1815558791692606e-04 1.9722494254182758e-03 1.5438873807512594e-03 -1.9181185708348988e-03 2.5578751083354202e-04 -1.5399338288762561e-03 3.1738565791657262e-04 -2.3872433245826254e-03 -1.9285565077910938e-03 2.4643833249992694e-03 -3.8418297166655256e-04 1.9235313290410965e-03 2.2978383270826526e-03 2.2978383270826522e-03 4.5905627212486366e-04 2.5749748416659048e-04 2.5749748416659048e-04 -3.2457192079573685e-03 -2.3376978374993066e-03 -2.3376978374993066e-03 -6.0134345012482202e-04 -2.2798066041659884e-04 -2.2798066041659868e-04 3.3980567434573243e-03 -3.8418297166655207e-04 2.4643833249992689e-03 1.9235313290410956e-03 -2.3872433245826249e-03 3.1738565791657257e-04 -1.9285565077910936e-03 3.9024041874998817e-04 -1.8823074191666107e-03 -1.0698364739583016e-03 1.7896952512499471e-03 2.7481442083332425e-05 1.3831754773749581e-03 1.6994526212499499e-03 1.7614851891666148e-03 -1.1989131637499683e-04 4.0706531874998763e-04 -1.2680847541666194e-04 -2.4286520627082621e-03 -1.7260482074999506e-03 -1.8236783362499463e-03 -6.6800904999996617e-06 -3.6207442916665582e-04 1.9294588458332676e-04 2.5428353584999244e-03 -4.7071236249998552e-04 1.9230053695832761e-03 1.0521566758333024e-03 -1.7276186108332817e-03 -7.2123654583330682e-05 -1.3531075681666271e-03 5.6963389624994042e-04 -1.5357381445831738e-03 -2.3699441465414202e-03 1.9165079341664688e-03 -1.1328965183332162e-03 1.8809400085831375e-03 1.8846806616664717e-03 1.5659285437498375e-03 1.6194396980414982e-03 5.4743275333327612e-04 1.0633389783332224e-03 -2.6097261177080622e-03 -1.8635059858331407e-03 -1.5261125037498414e-03 -1.6739034707081591e-03 -5.8866176249993817e-04 -1.1099023112498860e-03 2.6688356496663897e-03 -6.0043470166660389e-04 1.5956700437498345e-03 2.4026895798330838e-03 -1.8656527954164740e-03 1.0797119120832222e-03 -1.9183312011664671e-03 6.7023415874996957e-04 -1.8891068808332477e-03 -2.9521648172915345e-03 2.3489462558332289e-03 -1.3861249199999387e-03 2.3611810821665617e-03 2.3325552737498961e-03 1.9220961458332481e-03 2.0241963303749095e-03 6.6491361208330206e-04 1.3035047924999403e-03 -3.2625106278748534e-03 -2.2821742933332319e-03 -1.8671408974999166e-03 -2.0975725839165733e-03 -6.9009872958330197e-04 -1.3496585599999406e-03 3.3300971000415200e-03 -7.3168557458329949e-04 1.9497610249999131e-03 2.9989021296248650e-03 -2.3126907029165640e-03 1.3166692949999404e-03 -2.4021286131248936e-03 5.9965549958307547e-04 -1.8470571470825393e-03 -2.0368684831241239e-03 1.9032007237491824e-03 -6.5089907416638725e-04 2.0361492471241242e-03 1.8330468520825452e-03 1.8330468520825446e-03 1.2614533736244572e-03 5.6305308999975818e-04 5.6305308999975840e-04 -2.7287852713321595e-03 -1.8153547395825531e-03 -1.8153547395825548e-03 -1.3435132229160890e-03 -5.8564520458308136e-04 -5.8564520458308103e-04 2.8122835926237899e-03 -6.5089907416638671e-04 1.9032007237491835e-03 2.0361492471241242e-03 -1.8470571470825395e-03 5.9965549958307526e-04 -2.0368684831241243e-03 7.6280513708346825e-04 -2.3266708654170812e-03 -2.5452966489587854e-03 2.3896109358337576e-03 -8.3194534125014691e-04 2.5461987213754524e-03 2.3079947079170759e-03 2.3079947079170759e-03 1.5658233541252788e-03 7.2171149041679516e-04 7.2171149041679635e-04 -3.4221659706256090e-03 -2.2793770850004051e-03 -2.2793770850004056e-03 -1.6702314721252971e-03 -7.4412897958346473e-04 -7.4412897958346441e-04 3.5247699437922931e-03 -8.3194534125014788e-04 2.3896109358337576e-03 2.5461987213754528e-03 -2.3266708654170803e-03 7.6280513708346868e-04 -2.5452966489587863e-03 6.7432492541693787e-04 -2.0288501320841474e-03 -1.5783263979589658e-03 1.8426421195840716e-03 -1.8527571833340759e-04 1.9943240699174659e-03 1.7546120395840357e-03 1.9632175025007872e-03 7.8750848804198218e-04 6.3944210833358998e-04 9.0178965000035842e-05 -2.6521669407093963e-03 -1.7387508908340303e-03 -1.9761233004174580e-03 -8.9241299825035790e-04 -6.4465435083359203e-04 -8.0705729166698993e-05 2.7559752016677709e-03 -7.4333333708363151e-04 2.0712200537508288e-03 1.5502558690422880e-03 -1.7842826141673815e-03 1.4633835875005975e-04 -1.9651572917507871e-03 8.5182312249943240e-04 -2.5460421166649677e-03 -1.9786938498736789e-03 2.3101988924984569e-03 -2.3876277583317340e-04 2.4852924367483420e-03 2.1902744112485373e-03 2.4635223316650224e-03 9.8943459429100700e-04 7.9877294374946714e-04 1.2080515916658556e-04 -3.3096192534977920e-03 -2.1846033174985412e-03 -2.4762331537483469e-03 -1.1182323700409205e-03 -8.1783355624945515e-04 -1.0362345749993000e-04 3.4396757765393707e-03 -9.2436851874938314e-04 2.5941907704149355e-03 1.9425591867903702e-03 -2.2242639774985151e-03 1.8614324249987535e-04 -2.4504165209566979e-03 7.6315065500018222e-04 -2.0297970887504816e-03 -1.0567042516252505e-03 1.7264581483337428e-03 1.8514612875004301e-04 1.7790551616254228e-03 1.6689081545837297e-03 1.9119276666671201e-03 2.6757557575006312e-04 7.7271035000018402e-04 -2.7818987000006475e-04 -2.4064024768755713e-03 -1.6539518945837257e-03 -1.9619881616671324e-03 -3.8516000204175810e-04 -7.6401959583351491e-04 3.2514208500007637e-04 2.5205133547922648e-03 -8.4521660375020107e-04 2.0550319029171539e-03 1.0125073172919071e-03 -1.6680392137503959e-03 -2.0727266291671557e-04 -1.7313846789170776e-03 1.0819116483332220e-03 -1.5555463391665038e-03 -2.2864762198330957e-03 1.6195472024998321e-03 -1.1223626099998850e-03 2.2851318003330959e-03 1.6016396362498345e-03 1.6016396362498351e-03 2.0117041792914576e-03 1.0701582379165568e-03 1.0701582379165561e-03 -2.5229295371664048e-03 -1.5673428304165044e-03 -1.5673428304165042e-03 -2.0473340634997871e-03 -1.1280049454165508e-03 -1.1280049454165512e-03 2.5612482603747343e-03 -1.1223626099998846e-03 1.6195472024998325e-03 2.2851318003330959e-03 -1.5555463391665057e-03 1.0819116483332218e-03 -2.2864762198330966e-03 1.2512888533333880e-03 -1.8661036141667477e-03 -2.8563948660834601e-03 1.9108036125000836e-03 -1.3254289841667256e-03 2.8580632467917933e-03 1.9173300825000837e-03 1.9173300825000845e-03 2.5137754451667782e-03 1.2641687191667222e-03 1.2641687191667222e-03 -3.1548782332084732e-03 -1.8495433475000809e-03 -1.8495433475000809e-03 -2.5612482603751133e-03 -1.3025153216667238e-03 -1.3025153216667236e-03 3.1990142870001420e-03 -1.3254289841667247e-03 1.9108036125000843e-03 2.8580632467917933e-03 -1.8661036141667483e-03 1.2512888533333880e-03 -2.8563948660834601e-03 1.0797119120830459e-03 -1.8656527954161689e-03 -1.9183312011661539e-03 1.5956700437495740e-03 -6.0043470166650642e-04 2.4026895798326918e-03 1.5659285437495825e-03 1.8846806616661640e-03 1.6194396980412345e-03 1.0633389783330502e-03 5.4743275333318700e-04 -2.6097261177076368e-03 -1.5261125037495933e-03 -1.8635059858328369e-03 -1.6739034707078859e-03 -1.1099023112497045e-03 -5.8866176249984254e-04 2.6688356496659543e-03 -1.1328965183330314e-03 1.9165079341661550e-03 1.8809400085828308e-03 -1.5357381445829236e-03 5.6963389624984739e-04 -2.3699441465410346e-03 1.3166692949999601e-03 -2.3126907029165987e-03 -2.4021286131249292e-03 1.9497610249999415e-03 -7.3168557458330979e-04 2.9989021296249118e-03 1.9220961458332774e-03 2.3325552737499312e-03 2.0241963303749399e-03 1.3035047924999609e-03 6.6491361208331095e-04 -3.2625106278749037e-03 -1.8671408974999441e-03 -2.2821742933332675e-03 -2.0975725839166045e-03 -1.3496585599999595e-03 -6.9009872958331313e-04 3.3300971000415685e-03 -1.3861249199999585e-03 2.3489462558332649e-03 2.3611810821665973e-03 -1.8891068808332778e-03 6.7023415874998052e-04 -2.9521648172915788e-03 1.1119063137503141e-03 -2.0543933050005776e-03 -1.4464634513754067e-03 1.5772080579171100e-03 -1.0585054250003009e-04 2.3405426302506587e-03 1.5340782433337654e-03 2.0392068650005746e-03 1.1303421911253182e-03 1.0864993958336388e-03 5.9506247500015934e-05 -2.5218951176257101e-03 -1.4882975054170862e-03 -2.0381641700005729e-03 -1.2054013625003388e-03 -1.1227696254169830e-03 -7.5523902500021712e-05 2.6034962608757323e-03 -1.1754099483336643e-03 2.0845084650005868e-03 1.3867538498753898e-03 -1.5232149316670954e-03 9.0710342500024982e-05 -2.2873750006256444e-03 1.3601862137495155e-03 -2.5528107091657569e-03 -1.8260671302076830e-03 1.9310902720826471e-03 -1.1281142624996047e-04 2.9045936556656325e-03 1.8679095170826691e-03 2.5297249074990990e-03 1.4318531442078231e-03 1.3185192349995300e-03 5.4384976249980527e-05 -3.1327678086655502e-03 -1.8273320612493490e-03 -2.5112181904157730e-03 -1.5322714521661209e-03 -1.3716179770828444e-03 -5.3970487916648849e-05 3.2249873615821855e-03 -1.4222774458328266e-03 2.5696446404157537e-03 1.7604456051660399e-03 -1.8564777537493401e-03 7.7056289583306542e-05 -2.8307733755823252e-03 1.1530399600000181e-03 -2.0876955825000309e-03 -9.2652532150001399e-04 1.5472299675000232e-03 2.9883445750000402e-04 2.1216620223750318e-03 1.5255260533333561e-03 2.0350571862500296e-03 6.0415389225000908e-04 1.1529013745833507e-03 -3.3353995750000554e-04 -2.2845470888750341e-03 -1.4746678900000208e-03 -2.0647111575000298e-03 -6.9750535900001045e-04 -1.1785659275000172e-03 3.5284607125000441e-04 2.3845825518750358e-03 -1.2254634520833519e-03 2.0994166575000303e-03 8.6039042550001298e-04 -1.5000000858333556e-03 -3.0020767500000384e-04 -2.0622111226250308e-03 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 hypre-2.33.0/src/test/TEST_fei/RHS.3000066400000000000000000001220451477326011500166300ustar00rootroot00000000000000 3.7609534350018935e-04 -2.0265408450010221e-03 -2.0265408450010221e-03 2.9416569055014836e-03 3.3670582500016234e-05 3.3670582500016518e-05 1.2113262818339444e-03 2.0731758116677122e-03 -9.6987790833382923e-05 -1.2229038499172833e-03 3.4680361250018031e-05 -1.9963207170843409e-03 -1.2229038499172830e-03 -1.9963207170843400e-03 3.4680361250017598e-05 1.2113262818339442e-03 -9.6987790833382570e-05 2.0731758116677122e-03 -4.9584920566691723e-04 1.9279697733343060e-03 1.9279697733343064e-03 -2.7987479071680775e-03 5.0352824166692712e-05 5.0352824166691906e-05 3.4680361249993271e-05 -1.9963207170828898e-03 -1.2229038499163942e-03 2.0731758116662065e-03 -9.6987790833312395e-05 1.2113262818330642e-03 1.9279697733329052e-03 1.9279697733329058e-03 -4.9584920566655673e-04 5.0352824166656107e-05 5.0352824166656283e-05 -2.7987479071660444e-03 -2.0265408449995498e-03 -2.0265408449995502e-03 3.7609534349991618e-04 3.3670582499991751e-05 3.3670582499991921e-05 2.9416569054993469e-03 -9.6987790833312368e-05 2.0731758116662052e-03 1.2113262818330642e-03 -1.9963207170828894e-03 3.4680361249992302e-05 -1.2229038499163947e-03 4.4160604624994077e-04 -2.3063397791663579e-03 -1.3505899574164858e-03 2.1899702458330408e-03 8.8467199583321405e-05 1.7087100031247717e-03 2.0598458849997257e-03 2.1618850770830436e-03 -6.6474394499990944e-05 4.4562533499994044e-04 -1.9795266791663987e-04 -2.9526383707079371e-03 -2.1192386999997169e-03 -2.2490434183330323e-03 -7.0606242374991138e-05 -4.0943441041661223e-04 2.7972220749996219e-04 3.1054653298329179e-03 -5.1635688083326390e-04 2.3585288866663501e-03 1.3145346099581576e-03 -2.0920175208330540e-03 -1.3526750541664886e-04 -1.6884009779164404e-03 9.0686891000044394e-04 -2.5027063400012242e-03 -1.3445043852506583e-03 2.1058503075010292e-03 2.7334583333346704e-04 2.1936285417094078e-03 2.0087568687509817e-03 2.3547119333344850e-03 3.9434304291686013e-04 8.9382172875043689e-04 -3.8244894333352097e-04 -2.9485478611681101e-03 -2.0226365187509896e-03 -2.4175139850011814e-03 -5.3237332104192812e-04 -9.0949060750044458e-04 4.4946234833355322e-04 3.0906660428765133e-03 -9.7703551750047760e-04 2.5266170950012357e-03 1.2872926405006308e-03 -2.0061351712509813e-03 -3.0146794166681389e-04 -2.1405047005427138e-03 1.3544259833337758e-03 -2.5574176950008336e-03 -1.2072157866670607e-03 1.8363942016672659e-03 4.3333400208347414e-04 2.5953959089175128e-03 1.7806639800005792e-03 2.4859849629174776e-03 8.1994682908360103e-04 1.3258257216670988e-03 -4.7377771750015465e-04 -2.7909999390009102e-03 -1.7542775150005720e-03 -2.5144108258341536e-03 -9.4056302616697305e-04 -1.3835374350004510e-03 5.1539201750016791e-04 2.9031167551676128e-03 -1.4079424083337936e-03 2.5548545412508341e-03 1.1361670562503702e-03 -1.7515525283339042e-03 -4.4395928541681096e-04 -2.5158477975841531e-03 3.4680361250043226e-05 -1.2229038499181903e-03 -1.9963207170858206e-03 2.0731758116692492e-03 1.2113262818348426e-03 -9.6987790833454751e-05 3.3670582500041401e-05 2.9416569055036659e-03 3.3670582500041204e-05 -2.0265408450025257e-03 3.7609534350046837e-04 -2.0265408450025248e-03 5.0352824166730205e-05 -2.7987479071701531e-03 5.0352824166729954e-05 1.9279697733357358e-03 -4.9584920566728488e-04 1.9279697733357356e-03 -9.6987790833454873e-05 1.2113262818348426e-03 2.0731758116692496e-03 -1.9963207170858211e-03 -1.2229038499181899e-03 3.4680361250044120e-05 4.4160604625011126e-04 -1.3505899574170063e-03 -2.3063397791672473e-03 2.1899702458338861e-03 1.7087100031254311e-03 8.8467199583355436e-05 -4.0943441041677025e-04 3.1054653298341161e-03 2.7972220750007050e-04 -2.1192387000005344e-03 -7.0606242375018000e-05 -2.2490434183339014e-03 4.4562533500011240e-04 -2.9526383707090789e-03 -1.9795266791671612e-04 2.0598458850005197e-03 -6.6474394500016382e-05 2.1618850770838780e-03 -5.1635688083346350e-04 1.3145346099586650e-03 2.3585288866672608e-03 -2.0920175208338611e-03 -1.6884009779170924e-03 -1.3526750541670090e-04 9.0686890999979830e-04 -1.3445043852497018e-03 -2.5027063399994422e-03 2.1058503074995304e-03 2.1936285417078448e-03 2.7334583333327275e-04 -9.0949060749979721e-04 3.0906660428743119e-03 4.4946234833323332e-04 -2.0226365187495489e-03 -5.3237332104154886e-04 -2.4175139849994605e-03 8.9382172874980014e-04 -2.9485478611660093e-03 -3.8244894333324851e-04 2.0087568687495515e-03 3.9434304291657970e-04 2.3547119333328084e-03 -9.7703551749978219e-04 1.2872926404997145e-03 2.5266170949994368e-03 -2.0061351712495528e-03 -2.1405047005411890e-03 -3.0146794166659987e-04 1.3544259833334130e-03 -1.2072157866667382e-03 -2.5574176950001509e-03 1.8363942016667773e-03 2.5953959089168206e-03 4.3333400208335894e-04 -1.3835374350000815e-03 2.9031167551668386e-03 5.1539201750003055e-04 -1.7542775150001049e-03 -9.4056302616672216e-04 -2.5144108258334827e-03 1.3258257216667447e-03 -2.7909999390001647e-03 -4.7377771750002813e-04 1.7806639800001039e-03 8.1994682908338192e-04 2.4859849629168141e-03 -1.4079424083334165e-03 1.1361670562500664e-03 2.5548545412501515e-03 -1.7515525283334364e-03 -2.5158477975834826e-03 -4.4395928541669284e-04 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 hypre-2.33.0/src/test/TEST_fei/SFEI.0000066400000000000000000040427571477326011500167360ustar00rootroot0000000000000072 24 0 431 0 1 2 60 61 62 75 76 77 15 16 17 3 4 5 63 64 65 78 79 80 18 19 20 8.0720617499468137e+00 8.5309020630874755e-01 8.5309020630874866e-01 -8.1158900710736592e+00 -4.9813469173467384e-01 -4.9813469173467456e-01 -5.9673665906171758e+00 -8.0691298599734185e-01 -2.8518284339481936e-01 5.9496470219332913e+00 4.4457574014113199e-01 7.7030545574852527e-01 5.9496470219332949e+00 7.7030545574852427e-01 4.4457574014113133e-01 -5.9673665906171784e+00 -2.8518284339481548e-01 -8.0691298599734118e-01 -4.8376465008275593e+00 -7.4018493515398032e-01 -7.4018493515397754e-01 4.9169139593221729e+00 2.6244405408240751e-01 2.6244405408240540e-01 8.5309020630874755e-01 3.4057114898744567e+00 1.5268257873584246e-01 -4.9354702522279664e-01 -3.1828054308834814e+00 -2.1170572218840160e-02 -8.0552519816492874e-01 -1.7656381296738688e+00 -5.3315509051431148e-02 4.2888526157768747e-01 1.6094141223792049e+00 7.4932151711152584e-02 7.7296731487912806e-01 1.7362412967158765e+00 7.8625133647942380e-02 -5.8614347666404487e-01 -1.6363743394253409e+00 -1.0750817275334590e-01 -7.3566587262340399e-01 -9.6403698661471959e-01 -1.3490124487312138e-01 5.6593878990961077e-01 7.9748797762787316e-01 1.0655634801800729e-02 8.5309020630874866e-01 1.5268257873584248e-01 3.4057114898744563e+00 -4.9354702522279742e-01 -2.1170572218839941e-02 -3.1828054308834814e+00 -5.8614347666404587e-01 -1.0750817275334620e-01 -1.6363743394253387e+00 7.7296731487912895e-01 7.8625133647942505e-02 1.7362412967158740e+00 4.2888526157768825e-01 7.4932151711152473e-02 1.6094141223792076e+00 -8.0552519816492951e-01 -5.3315509051430392e-02 -1.7656381296738717e+00 -7.3566587262340466e-01 -1.3490124487312199e-01 -9.6403698661471937e-01 5.6593878990961177e-01 1.0655634801801069e-02 7.9748797762787282e-01 -8.1158900710736575e+00 -4.9354702522279664e-01 -4.9354702522279759e-01 8.2872337276814907e+00 1.1677396902662959e-01 1.1677396902663033e-01 6.0952716489399821e+00 4.4241797268404875e-01 9.4981553973185556e-02 -6.1079425032853090e+00 -6.4092267203333816e-02 -5.9296868402692793e-01 -6.1079425032853134e+00 -5.9296868402692671e-01 -6.4092267203332470e-02 6.0952716489399856e+00 9.4981553973181393e-02 4.4241797268404748e-01 4.9501033964722065e+00 5.6565698527199337e-01 5.6565698527199026e-01 -5.0961053443893825e+00 -6.9222504502795656e-02 -6.9222504502793408e-02 -4.9813469173467373e-01 -3.1828054308834814e+00 -2.1170572218839938e-02 1.1677396902662956e-01 3.2026997738391150e+00 4.2281458957859654e-03 4.4870382303094003e-01 1.6211763896932447e+00 9.4580479291891430e-03 -6.5184733717184445e-02 -1.6149717527166201e+00 -9.2184996011831430e-03 -2.9122763307727029e-01 -1.6343455914004683e+00 -3.4126961818320696e-03 9.5606459747663117e-02 1.6128444616477242e+00 9.4831787742271842e-03 2.6436976438693044e-01 8.2310852364793119e-01 1.0897891132853887e-02 -7.0906957663034634e-02 -8.2770637382744561e-01 -2.6549573020100061e-04 -4.9813469173467445e-01 -2.1170572218840156e-02 -3.1828054308834814e+00 1.1677396902663030e-01 4.2281458957859662e-03 3.2026997738391150e+00 9.5606459747663852e-02 9.4831787742273767e-03 1.6128444616477211e+00 -2.9122763307727090e-01 -3.4126961818321117e-03 -1.6343455914004659e+00 -6.5184733717185361e-02 -9.2184996011832453e-03 -1.6149717527166230e+00 4.4870382303094108e-01 9.4580479291891013e-03 1.6211763896932478e+00 2.6436976438693122e-01 1.0897891132854094e-02 8.2310852364793130e-01 -7.0906957663035522e-02 -2.6549573020103178e-04 -8.2770637382744561e-01 -5.9673665906171758e+00 -8.0552519816492851e-01 -5.8614347666404587e-01 6.0952716489399821e+00 4.4870382303094009e-01 9.5606459747663838e-02 8.2182523008512458e+00 8.6341474364499238e-01 1.1394708000947236e-01 -8.1896784667551277e+00 -4.9917095810419015e-01 -4.7223669397700063e-01 -4.9657811928443305e+00 -7.4480465971109822e-01 -6.8019353511557176e-02 4.9517499599170653e+00 2.6062510520735777e-01 5.6055476640687307e-01 5.9848194153398477e+00 7.6724879573108440e-01 4.1810124744945726e-01 -6.1272670748315079e+00 -2.9049165163415741e-01 -6.1810029460860519e-02 -8.0691298599734185e-01 -1.7656381296738688e+00 -1.0750817275334618e-01 4.4241797268404870e-01 1.6211763896932447e+00 9.4831787742273750e-03 8.6341474364499227e-01 3.4423414083606922e+00 1.8422812993339022e-02 -4.8183014831617721e-01 -3.2713584912596829e+00 -7.3263369839230430e-02 -7.5549185182575707e-01 -9.6316794433956598e-01 -1.3300951140066488e-02 5.6055476640687418e-01 8.2341311361702751e-01 1.0070390146868789e-01 7.7083461227230021e-01 1.7960889588642346e+00 7.4428566943939220e-02 -5.9298710886893902e-01 -1.6828553052620812e+00 -8.9659664475499959e-03 -2.8518284339481936e-01 -5.3315509051431141e-02 -1.6363743394253387e+00 9.4981553973185542e-02 9.4580479291891430e-03 1.6128444616477211e+00 1.1394708000947235e-01 1.8422812993339019e-02 3.2935816113934040e+00 -5.0069380066372426e-01 -7.7780007409981200e-02 -3.2709150913455685e+00 -6.8448458295611192e-02 -1.3173842563771647e-02 -8.2829927117086621e-01 2.6062510520736187e-01 4.0839756195214932e-02 8.2341311361702840e-01 4.4864532895387155e-01 7.8949565444370470e-02 1.6691324276127886e+00 -6.3873965789736684e-02 -3.4008235369295810e-03 -1.6633829123291688e+00 5.9496470219332913e+00 4.2888526157768736e-01 7.7296731487912895e-01 -6.1079425032853081e+00 -6.5184733717184418e-02 -2.9122763307727090e-01 -8.1896784667551277e+00 -4.8183014831617738e-01 -5.0069380066372426e-01 8.2848546349840131e+00 1.1657549012044659e-01 8.5903296303408372e-01 4.9186255008219488e+00 5.5470142695587821e-01 2.5988476860043536e-01 -4.9657811928443305e+00 -6.8448458295606973e-02 -7.5549185182575618e-01 -5.9863322684794884e+00 -5.8000985811127925e-01 -8.0360010105699886e-01 6.0966072736250041e+00 9.5311019786235684e-02 4.5912834011009995e-01 4.4457574014113199e-01 1.6094141223792049e+00 7.8625133647942505e-02 -6.4092267203333803e-02 -1.6149717527166201e+00 -3.4126961818321082e-03 -4.9917095810419015e-01 -3.2713584912596829e+00 -7.7780007409981200e-02 1.1657549012044660e-01 3.3437593424066545e+00 1.8614831712627709e-02 2.5988476860043647e-01 7.9790932621878286e-01 4.0803164502523810e-02 -6.8019353511558425e-02 -8.2829927117086610e-01 -1.3300951140066682e-02 -2.8563663553048596e-01 -1.6839637610745017e+00 -5.3375703471871469e-02 9.5883215487553186e-02 1.6475104852170297e+00 9.8262283406573801e-03 7.7030545574852527e-01 7.4932151711152584e-02 1.7362412967158740e+00 -5.9296868402692793e-01 -9.2184996011831395e-03 -1.6343455914004659e+00 -4.7223669397700069e-01 -7.3263369839230430e-02 -3.2709150913455685e+00 8.5903296303408372e-01 1.8614831712627705e-02 3.4900808156011904e+00 5.5470142695587932e-01 9.8589204135997532e-02 7.9790932621878252e-01 -7.4480465971109910e-01 -1.3173842563770924e-02 -9.6316794433956598e-01 -7.9223615892264831e-01 -1.0538997465370326e-01 -1.8109501602748954e+00 4.1820635089918784e-01 8.9094990981099260e-03 1.6551473488246486e+00 5.9496470219332949e+00 7.7296731487912818e-01 4.2888526157768830e-01 -6.1079425032853125e+00 -2.9122763307727029e-01 -6.5184733717185347e-02 -4.9657811928443305e+00 -7.5549185182575707e-01 -6.8448458295611220e-02 4.9186255008219488e+00 2.5988476860043652e-01 5.5470142695587932e-01 8.2848546349840273e+00 8.5903296303408272e-01 1.1657549012044567e-01 -8.1896784667551419e+00 -5.0069380066372093e-01 -4.8183014831617638e-01 -5.9863322684794920e+00 -8.0360010105700175e-01 -5.8000985811127648e-01 6.0966072736250085e+00 4.5912834011010240e-01 9.5311019786233700e-02 7.7030545574852427e-01 1.7362412967158762e+00 7.4932151711152473e-02 -5.9296868402692671e-01 -1.6343455914004681e+00 -9.2184996011832471e-03 -7.4480465971109822e-01 -9.6316794433956587e-01 -1.3173842563771646e-02 5.5470142695587832e-01 7.9790932621878286e-01 9.8589204135997532e-02 8.5903296303408272e-01 3.4900808156012011e+00 1.8614831712627483e-02 -4.7223669397699930e-01 -3.2709150913455796e+00 -7.3263369839230014e-02 -7.9223615892264754e-01 -1.8109501602748987e+00 -1.0538997465370256e-01 4.1820635089918645e-01 1.6551473488246515e+00 8.9094990981095634e-03 4.4457574014113127e-01 7.8625133647942380e-02 1.6094141223792076e+00 -6.4092267203332456e-02 -3.4126961818320700e-03 -1.6149717527166230e+00 -6.8019353511557190e-02 -1.3300951140066488e-02 -8.2829927117086621e-01 2.5988476860043541e-01 4.0803164502523817e-02 7.9790932621878263e-01 1.1657549012044570e-01 1.8614831712627483e-02 3.3437593424066656e+00 -4.9917095810418971e-01 -7.7780007409981172e-02 -3.2713584912596949e+00 -2.8563663553048502e-01 -5.3375703471871330e-02 -1.6839637610745042e+00 9.5883215487552159e-02 9.8262283406573767e-03 1.6475104852170324e+00 -5.9673665906171784e+00 -5.8614347666404498e-01 -8.0552519816492951e-01 6.0952716489399865e+00 9.5606459747663144e-02 4.4870382303094108e-01 4.9517499599170653e+00 5.6055476640687407e-01 2.6062510520736187e-01 -4.9657811928443305e+00 -6.8019353511558439e-02 -7.4480465971109910e-01 -8.1896784667551437e+00 -4.7223669397699930e-01 -4.9917095810418965e-01 8.2182523008512600e+00 1.1394708000946852e-01 8.6341474364499193e-01 5.9848194153398522e+00 4.1810124744945992e-01 7.6724879573108162e-01 -6.1272670748315123e+00 -6.1810029460862892e-02 -2.9049165163415558e-01 -2.8518284339481548e-01 -1.6363743394253409e+00 -5.3315509051430399e-02 9.4981553973181393e-02 1.6128444616477242e+00 9.4580479291891013e-03 2.6062510520735777e-01 8.2341311361702763e-01 4.0839756195214932e-02 -6.8448458295607001e-02 -8.2829927117086610e-01 -1.3173842563770927e-02 -5.0069380066372093e-01 -3.2709150913455796e+00 -7.7780007409981172e-02 1.1394708000946850e-01 3.2935816113934164e+00 1.8422812993338276e-02 4.4864532895386794e-01 1.6691324276127906e+00 7.8949565444369735e-02 -6.3873965789732340e-02 -1.6633829123291717e+00 -3.4008235369295038e-03 -8.0691298599734118e-01 -1.0750817275334590e-01 -1.7656381296738717e+00 4.4241797268404748e-01 9.4831787742271825e-03 1.6211763896932478e+00 5.6055476640687307e-01 1.0070390146868791e-01 8.2341311361702840e-01 -7.5549185182575618e-01 -1.3300951140066679e-02 -9.6316794433956598e-01 -4.8183014831617632e-01 -7.3263369839230014e-02 -3.2713584912596945e+00 8.6341474364499193e-01 1.8422812993338276e-02 3.4423414083607033e+00 7.7083461227229944e-01 7.4428566943939553e-02 1.7960889588642366e+00 -5.9298710886893802e-01 -8.9659664475503168e-03 -1.6828553052620836e+00 -4.8376465008275602e+00 -7.3566587262340377e-01 -7.3566587262340466e-01 4.9501033964722065e+00 2.6436976438693044e-01 2.6436976438693122e-01 5.9848194153398477e+00 7.7083461227230021e-01 4.4864532895387155e-01 -5.9863322684794884e+00 -2.8563663553048591e-01 -7.9223615892264831e-01 -5.9863322684794920e+00 -7.9223615892264732e-01 -2.8563663553048502e-01 5.9848194153398513e+00 4.4864532895386805e-01 7.7083461227229944e-01 8.1703960304775194e+00 8.4316511864132537e-01 8.4316511864132249e-01 -8.2798272198428826e+00 -5.1347615717788675e-01 -5.1347615717788464e-01 -7.4018493515398032e-01 -9.6403698661471959e-01 -1.3490124487312202e-01 5.6565698527199326e-01 8.2310852364793119e-01 1.0897891132854092e-02 7.6724879573108440e-01 1.7960889588642346e+00 7.8949565444370470e-02 -5.8000985811127936e-01 -1.6839637610745017e+00 -1.0538997465370326e-01 -8.0360010105700164e-01 -1.8109501602748987e+00 -5.3375703471871316e-02 4.1810124744945992e-01 1.6691324276127906e+00 7.4428566943939567e-02 8.4316511864132537e-01 3.5438526429958612e+00 1.5061135481375285e-01 -4.7037725277160169e-01 -3.3732316451566975e+00 -2.1220455336219964e-02 -7.4018493515397754e-01 -1.3490124487312136e-01 -9.6403698661471937e-01 5.6565698527199026e-01 1.0897891132853891e-02 8.2310852364793130e-01 4.1810124744945720e-01 7.4428566943939206e-02 1.6691324276127886e+00 -8.0360010105699886e-01 -5.3375703471871469e-02 -1.8109501602748954e+00 -5.8000985811127648e-01 -1.0538997465370256e-01 -1.6839637610745042e+00 7.6724879573108140e-01 7.8949565444369735e-02 1.7960889588642366e+00 8.4316511864132249e-01 1.5061135481375285e-01 3.5438526429958599e+00 -4.7037725277159881e-01 -2.1220455336220266e-02 -3.3732316451566970e+00 4.9169139593221720e+00 5.6593878990961077e-01 5.6593878990961177e-01 -5.0961053443893825e+00 -7.0906957663034634e-02 -7.0906957663035522e-02 -6.1272670748315070e+00 -5.9298710886893902e-01 -6.3873965789736670e-02 6.0966072736250041e+00 9.5883215487553186e-02 4.1820635089918784e-01 6.0966072736250085e+00 4.1820635089918640e-01 9.5883215487552145e-02 -6.1272670748315115e+00 -6.3873965789732340e-02 -5.9298710886893802e-01 -8.2798272198428826e+00 -4.7037725277160169e-01 -4.7037725277159886e-01 8.5203382073230998e+00 1.1811692879695719e-01 1.1811692879695518e-01 2.6244405408240751e-01 7.9748797762787316e-01 1.0655634801801069e-02 -6.9222504502795656e-02 -8.2770637382744561e-01 -2.6549573020103183e-04 -2.9049165163415747e-01 -1.6828553052620809e+00 -3.4008235369295792e-03 9.5311019786235726e-02 1.6475104852170295e+00 8.9094990981099208e-03 4.5912834011010240e-01 1.6551473488246520e+00 9.8262283406573801e-03 -6.1810029460862871e-02 -1.6633829123291717e+00 -8.9659664475503185e-03 -5.1347615717788675e-01 -3.3732316451566975e+00 -2.1220455336220263e-02 1.1811692879695727e-01 3.4470304249058410e+00 4.4613788103327881e-03 2.6244405408240540e-01 1.0655634801800731e-02 7.9748797762787282e-01 -6.9222504502793408e-02 -2.6549573020100115e-04 -8.2770637382744561e-01 -6.1810029460860581e-02 -8.9659664475499994e-03 -1.6633829123291688e+00 4.5912834011009995e-01 9.8262283406573836e-03 1.6551473488246482e+00 9.5311019786233700e-02 8.9094990981095652e-03 1.6475104852170324e+00 -2.9049165163415558e-01 -3.4008235369295072e-03 -1.6828553052620836e+00 -5.1347615717788475e-01 -2.1220455336219957e-02 -3.3732316451566970e+00 1.1811692879695512e-01 4.4613788103327941e-03 3.4470304249058401e+00 60 61 62 120 121 122 135 136 137 75 76 77 63 64 65 123 124 125 138 139 140 78 79 80 8.1129077569453791e+00 8.5045259307419152e-01 8.5045259307419252e-01 -8.1639919363752362e+00 -5.0345838964549405e-01 -5.0345838964549627e-01 -5.8827240276334285e+00 -7.9835042623678498e-01 -2.7287448574970474e-01 5.8642934329182879e+00 4.4289354214830534e-01 7.6990076718374978e-01 5.8642934329182932e+00 7.6990076718374822e-01 4.4289354214830651e-01 -5.8827240276334338e+00 -2.7287448574970113e-01 -7.9835042623678532e-01 -4.7138980617281376e+00 -7.3667129186231928e-01 -7.3667129186231894e-01 4.8018434305882822e+00 2.4810769108805464e-01 2.4810769108805386e-01 8.5045259307419152e-01 3.5128230941190006e+00 1.5410739787516675e-01 -4.7769651647014266e-01 -3.2849750247870428e+00 -1.9668088615786037e-02 -8.0305399492482465e-01 -1.7729710789084918e+00 -5.1842535742923974e-02 4.1157342205385472e-01 1.6130926243243748e+00 7.3759335153143230e-02 7.6617671813068988e-01 1.7440582472893627e+00 7.9539574547347655e-02 -5.7508923679966839e-01 -1.6399474959880140e+00 -1.0692156533266008e-01 -7.2861745257879129e-01 -9.4571921505349099e-01 -1.3647061303944977e-01 5.5625446751469154e-01 7.7363884900430102e-01 7.4964951551617885e-03 8.5045259307419274e-01 1.5410739787516672e-01 3.5128230941190024e+00 -4.7769651647014361e-01 -1.9668088615785673e-02 -3.2849750247870428e+00 -5.7508923679966983e-01 -1.0692156533266042e-01 -1.6399474959880100e+00 7.6617671813069110e-01 7.9539574547347627e-02 1.7440582472893587e+00 4.1157342205385528e-01 7.3759335153143174e-02 1.6130926243243791e+00 -8.0305399492482565e-01 -5.1842535742923385e-02 -1.7729710789084967e+00 -7.2861745257879251e-01 -1.3647061303945013e-01 -9.4571921505349110e-01 5.5625446751469276e-01 7.4964951551620453e-03 7.7363884900430091e-01 -8.1639919363752362e+00 -4.7769651647014266e-01 -4.7769651647014361e-01 8.3502493190689222e+00 1.0670022963324660e-01 1.0670022963324841e-01 6.0218990292682246e+00 4.2749629361824742e-01 7.7827068480443032e-02 -6.0355625391501277e+00 -5.4519357463440811e-02 -5.8931235324236819e-01 -6.0355625391501349e+00 -5.8931235324236642e-01 -5.4519357463441082e-02 6.0218990292682300e+00 7.7827068480439257e-02 4.2749629361824670e-01 4.8347620227782002e+00 5.6290876751741448e-01 5.6290876751741403e-01 -4.9936923857080764e+00 -5.3404132073398045e-02 -5.3404132073397073e-02 -5.0345838964549428e-01 -3.2849750247870428e+00 -1.9668088615785680e-02 1.0670022963324659e-01 3.3114466257003556e+00 4.0775515202728357e-03 4.4864331574731958e-01 1.6276030495975906e+00 8.3385980669776882e-03 -4.9613082093512770e-02 -1.6241306764787213e+00 -7.1904188311577360e-03 -2.8500228569299924e-01 -1.6423587717280677e+00 -3.1416298536589937e-03 8.4046816168247038e-02 1.6209270680484462e+00 8.4242159783455197e-03 2.5609922646206940e-01 8.0160800791288656e-01 8.9605968694910550e-03 -5.7415830578876406e-02 -8.1012027826544819e-01 1.9917486551534132e-04 -5.0345838964549616e-01 -1.9668088615786054e-02 -3.2849750247870428e+00 1.0670022963324839e-01 4.0775515202728417e-03 3.3114466257003556e+00 8.4046816168248994e-02 8.4242159783458614e-03 1.6209270680484418e+00 -2.8500228569300101e-01 -3.1416298536589655e-03 -1.6423587717280628e+00 -4.9613082093514962e-02 -7.1904188311580249e-03 -1.6241306764787262e+00 4.4864331574732197e-01 8.3385980669776483e-03 1.6276030495975959e+00 2.5609922646207123e-01 8.9605968694913517e-03 8.0160800791288689e-01 -5.7415830578878578e-02 1.9917486551531986e-04 -8.1012027826544819e-01 -5.8827240276334285e+00 -8.0305399492482443e-01 -5.7508923679966983e-01 6.0218990292682255e+00 4.4864331574731953e-01 8.4046816168248994e-02 8.0326258789905509e+00 8.5539564461616924e-01 9.4331957324443619e-02 -8.0020565805768200e+00 -4.9255089075636938e-01 -4.6562590747684235e-01 -4.8525133003213767e+00 -7.4548988503011715e-01 -5.7610371210908957e-02 4.8380842562184228e+00 2.4634517419936516e-01 5.5083965381518363e-01 5.7793977399380738e+00 7.6367596524116610e-01 4.1511767021326790e-01 -5.9347129958836469e+00 -2.7296532909270887e-01 -4.6010582033720604e-02 -7.9835042623678509e-01 -1.7729710789084918e+00 -1.0692156533266041e-01 4.2749629361824742e-01 1.6276030495975906e+00 8.4242159783458649e-03 8.5539564461616924e-01 3.3700020328383973e+00 1.5127282960809944e-02 -4.6577228614810406e-01 -3.1941032489902033e+00 -7.3646746607117911e-02 -7.4695513652485424e-01 -9.4634346353800847e-01 -1.1550071843825446e-02 5.5083965381518385e-01 8.0075461060611164e-01 1.0113493416549786e-01 7.6066045709636931e-01 1.7122610906261340e+00 7.4503833426605770e-02 -5.8331420023622682e-01 -1.5972029922315303e+00 -7.0718827476552188e-03 -2.7287448574970469e-01 -5.1842535742923981e-02 -1.6399474959880100e+00 7.7827068480443046e-02 8.3385980669776864e-03 1.6209270680484418e+00 9.4331957324443660e-02 1.5127282960809948e-02 3.2201260629266439e+00 -4.8545333008159069e-01 -7.8266158868407348e-02 -3.1929714843706911e+00 -4.9193937712655518e-02 -9.9958091734127421e-03 -8.0931414368459109e-01 2.4634517419936891e-01 4.0839959746187558e-02 8.0075461060611230e-01 4.3049711757821912e-01 7.7224124610773784e-02 1.5806850267726569e+00 -4.1479564038523820e-02 -1.4254616000049165e-03 -1.5802596443105619e+00 5.8642934329182879e+00 4.1157342205385461e-01 7.6617671813069121e-01 -6.0355625391501286e+00 -4.9613082093512770e-02 -2.8500228569300101e-01 -8.0020565805768200e+00 -4.6577228614810406e-01 -4.8545333008159069e-01 8.1022807008206374e+00 1.0192616087546592e-01 8.5669237759055883e-01 4.8022912629249994e+00 5.5043045260749757e-01 2.5053568937129145e-01 -4.8525133003213785e+00 -4.9193937712651639e-02 -7.4695513652485435e-01 -5.7806501245988944e+00 -5.7543789183801142e-01 -7.9672670316185734e-01 5.9019171479832950e+00 7.6087162255461888e-02 4.4073267036875935e-01 4.4289354214830534e-01 1.6130926243243748e+00 7.9539574547347641e-02 -5.4519357463440811e-02 -1.6241306764787213e+00 -3.1416298536589690e-03 -4.9255089075636954e-01 -3.1941032489902028e+00 -7.8266158868407348e-02 1.0192616087546587e-01 3.2733855038603124e+00 1.6338098166775276e-02 2.5053568937129078e-01 7.7513266366773870e-01 4.1374171500835416e-02 -5.7610371210908520e-02 -8.0931414368459109e-01 -1.1550071843825296e-02 -2.7304251346864350e-01 -1.5970784527934843e+00 -5.2183434976091077e-02 8.2367740504300332e-02 1.5630157300945742e+00 7.8894513270243265e-03 7.6990076718374978e-01 7.3759335153143230e-02 1.7440582472893587e+00 -5.8931235324236819e-01 -7.1904188311577369e-03 -1.6423587717280628e+00 -4.6562590747684229e-01 -7.3646746607117897e-02 -3.1929714843706911e+00 8.5669237759055883e-01 1.6338098166775263e-02 3.4233118771472824e+00 5.5043045260749901e-01 1.0059253410572103e-01 7.7513266366773892e-01 -7.4548988503011848e-01 -9.9958091734121176e-03 -9.4634346353800880e-01 -7.9104267526841443e-01 -1.0689794983908048e-01 -1.7286877454494800e+00 4.1444722363593611e-01 7.0409570251287086e-03 1.5678586769818628e+00 5.8642934329182941e+00 7.6617671813068977e-01 4.1157342205385522e-01 -6.0355625391501340e+00 -2.8500228569299918e-01 -4.9613082093514997e-02 -4.8525133003213776e+00 -7.4695513652485424e-01 -4.9193937712655525e-02 4.8022912629249994e+00 2.5053568937129084e-01 5.5043045260749901e-01 8.1022807008206605e+00 8.5669237759055727e-01 1.0192616087546681e-01 -8.0020565805768449e+00 -4.8545333008158775e-01 -4.6577228614810318e-01 -5.7806501245988979e+00 -7.9672670316185723e-01 -5.7543789183801075e-01 5.9019171479833004e+00 4.4073267036876052e-01 7.6087162255461221e-02 7.6990076718374822e-01 1.7440582472893627e+00 7.3759335153143188e-02 -5.8931235324236642e-01 -1.6423587717280674e+00 -7.1904188311580249e-03 -7.4548988503011715e-01 -9.4634346353800847e-01 -9.9958091734127456e-03 5.5043045260749746e-01 7.7513266366773870e-01 1.0059253410572103e-01 8.5669237759055727e-01 3.4233118771473001e+00 1.6338098166775384e-02 -4.6562590747684007e-01 -3.1929714843707084e+00 -7.3646746607117536e-02 -7.9104267526841321e-01 -1.7286877454494842e+00 -1.0689794983908013e-01 4.1444722363593378e-01 1.5678586769818676e+00 7.0409570251284076e-03 4.4289354214830656e-01 7.9539574547347655e-02 1.6130926243243791e+00 -5.4519357463441068e-02 -3.1416298536589902e-03 -1.6241306764787260e+00 -5.7610371210908957e-02 -1.1550071843825449e-02 -8.0931414368459098e-01 2.5053568937129139e-01 4.1374171500835416e-02 7.7513266366773903e-01 1.0192616087546678e-01 1.6338098166775377e-02 3.2733855038603310e+00 -4.9255089075637126e-01 -7.8266158868407321e-02 -3.1941032489902219e+00 -2.7304251346864444e-01 -5.2183434976091195e-02 -1.5970784527934883e+00 8.2367740504301123e-02 7.8894513270245034e-03 1.5630157300945788e+00 -5.8827240276334356e+00 -5.7508923679966828e-01 -8.0305399492482565e-01 6.0218990292682317e+00 8.4046816168247052e-02 4.4864331574732197e-01 4.8380842562184219e+00 5.5083965381518385e-01 2.4634517419936888e-01 -4.8525133003213776e+00 -5.7610371210908506e-02 -7.4548988503011848e-01 -8.0020565805768449e+00 -4.6562590747683980e-01 -4.9255089075637137e-01 8.0326258789905758e+00 9.4331957324439872e-02 8.5539564461616946e-01 5.7793977399380800e+00 4.1511767021326779e-01 7.6367596524116577e-01 -5.9347129958836531e+00 -4.6010582033721513e-02 -2.7296532909270843e-01 -2.7287448574970125e-01 -1.6399474959880140e+00 -5.1842535742923385e-02 7.7827068480439271e-02 1.6209270680484460e+00 8.3385980669776500e-03 2.4634517419936514e-01 8.0075461060611164e-01 4.0839959746187558e-02 -4.9193937712651639e-02 -8.0931414368459109e-01 -9.9958091734121193e-03 -4.8545333008158775e-01 -3.1929714843707084e+00 -7.8266158868407334e-02 9.4331957324439830e-02 3.2201260629266626e+00 1.5127282960809240e-02 4.3049711757821585e-01 1.5806850267726604e+00 7.7224124610773201e-02 -4.1479564038519559e-02 -1.5802596443105670e+00 -1.4254616000047978e-03 -7.9835042623678520e-01 -1.0692156533266006e-01 -1.7729710789084967e+00 4.2749629361824670e-01 8.4242159783455162e-03 1.6276030495975959e+00 5.5083965381518363e-01 1.0113493416549785e-01 8.0075461060611219e-01 -7.4695513652485424e-01 -1.1550071843825293e-02 -9.4634346353800869e-01 -4.6577228614810340e-01 -7.3646746607117522e-02 -3.1941032489902215e+00 8.5539564461616968e-01 1.5127282960809247e-02 3.3700020328384155e+00 7.6066045709636931e-01 7.4503833426605673e-02 1.7122610906261384e+00 -5.8331420023622638e-01 -7.0718827476553758e-03 -1.5972029922315349e+00 -4.7138980617281376e+00 -7.2861745257879129e-01 -7.2861745257879240e-01 4.8347620227782002e+00 2.5609922646206940e-01 2.5609922646207128e-01 5.7793977399380747e+00 7.6066045709636920e-01 4.3049711757821907e-01 -5.7806501245988926e+00 -2.7304251346864350e-01 -7.9104267526841443e-01 -5.7806501245988979e+00 -7.9104267526841321e-01 -2.7304251346864450e-01 5.7793977399380809e+00 4.3049711757821590e-01 7.6066045709636931e-01 7.7249594857950159e+00 8.3213906875785471e-01 8.3213906875785471e-01 -7.8433186775234409e+00 -4.8669322857866121e-01 -4.8669322857866065e-01 -7.3667129186231917e-01 -9.4571921505349099e-01 -1.3647061303945013e-01 5.6290876751741448e-01 8.0160800791288633e-01 8.9605968694913569e-03 7.6367596524116621e-01 1.7122610906261340e+00 7.7224124610773770e-02 -5.7543789183801142e-01 -1.5970784527934843e+00 -1.0689794983908048e-01 -7.9672670316185723e-01 -1.7286877454494842e+00 -5.2183434976091195e-02 4.1511767021326768e-01 1.5806850267726604e+00 7.4503833426605673e-02 8.3213906875785471e-01 3.2832114086144144e+00 1.5240045678469191e-01 -4.6500558486751575e-01 -3.1062801206296364e+00 -1.7537013836940497e-02 -7.3667129186231872e-01 -1.3647061303944977e-01 -9.4571921505349121e-01 5.6290876751741403e-01 8.9605968694910550e-03 8.0160800791288689e-01 4.1511767021326790e-01 7.4503833426605756e-02 1.5806850267726569e+00 -7.9672670316185723e-01 -5.2183434976091077e-02 -1.7286877454494802e+00 -5.7543789183801086e-01 -1.0689794983908013e-01 -1.5970784527934883e+00 7.6367596524116588e-01 7.7224124610773187e-02 1.7122610906261384e+00 8.3213906875785493e-01 1.5240045678469191e-01 3.2832114086144149e+00 -4.6500558486751581e-01 -1.7537013836940941e-02 -3.1062801206296364e+00 4.8018434305882822e+00 5.5625446751469154e-01 5.5625446751469276e-01 -4.9936923857080764e+00 -5.7415830578876406e-02 -5.7415830578878592e-02 -5.9347129958836469e+00 -5.8331420023622660e-01 -4.1479564038523820e-02 5.9019171479832950e+00 8.2367740504300346e-02 4.1444722363593600e-01 5.9019171479832995e+00 4.1444722363593373e-01 8.2367740504301123e-02 -5.9347129958836522e+00 -4.1479564038519594e-02 -5.8331420023622649e-01 -7.8433186775234409e+00 -4.6500558486751581e-01 -4.6500558486751592e-01 8.1007593284439388e+00 9.4145748066212648e-02 9.4145748066212370e-02 2.4810769108805464e-01 7.7363884900430113e-01 7.4964951551620479e-03 -5.3404132073398017e-02 -8.1012027826544819e-01 1.9917486551531850e-04 -2.7296532909270887e-01 -1.5972029922315301e+00 -1.4254616000049147e-03 7.6087162255461874e-02 1.5630157300945742e+00 7.0409570251287077e-03 4.4073267036876052e-01 1.5678586769818676e+00 7.8894513270245051e-03 -4.6010582033721527e-02 -1.5802596443105670e+00 -7.0718827476553758e-03 -4.8669322857866126e-01 -3.1062801206296364e+00 -1.7537013836940951e-02 9.4145748066212676e-02 3.1893497793564389e+00 3.4082798117706322e-03 2.4810769108805383e-01 7.4964951551617877e-03 7.7363884900430102e-01 -5.3404132073397059e-02 1.9917486551534203e-04 -8.1012027826544808e-01 -4.6010582033720618e-02 -7.0718827476552205e-03 -1.5802596443105619e+00 4.4073267036875935e-01 7.8894513270243317e-03 1.5678586769818628e+00 7.6087162255461221e-02 7.0409570251284068e-03 1.5630157300945788e+00 -2.7296532909270843e-01 -1.4254616000047961e-03 -1.5972029922315349e+00 -4.8669322857866076e-01 -1.7537013836940500e-02 -3.1062801206296360e+00 9.4145748066212370e-02 3.4082798117706331e-03 3.1893497793564389e+00 15 16 17 75 76 77 90 91 92 30 31 32 18 19 20 78 79 80 93 94 95 33 34 35 7.5813251767757937e+00 1.6729351833081658e+00 7.9618194480882420e-01 -7.7506687873162381e+00 -1.3991308308134875e+00 -4.7318736668451078e-01 -5.4594754405521853e+00 -1.5226101505904135e+00 -2.4852340377364757e-01 5.5730428603900837e+00 1.2296256549738847e+00 7.2828853511779534e-01 5.5180195195043629e+00 1.5080652397612746e+00 4.1019525914166083e-01 -5.6546925984843384e+00 -1.0874566468904436e+00 -7.6479509540798485e-01 -4.3831962131983406e+00 -1.4085631098172249e+00 -6.8763144590078806e-01 4.5756454828808657e+00 1.0071346600682445e+00 2.3947157269865102e-01 1.6729351833081658e+00 3.9074799929619317e+00 3.0993673145733380e-01 -1.3958278739541250e+00 -3.5655613645775284e+00 -1.1447631493987528e-01 -1.5256872129629295e+00 -2.2074166089939129e+00 -9.8892267213552015e-02 1.2116845696583840e+00 1.9291367821295242e+00 2.1976953886224043e-01 1.5134106681219577e+00 2.1869714174880386e+00 1.5773014169925920e-01 -1.3803952833991273e+00 -1.9751487808926429e+00 -2.6006892108127705e-01 -1.4038780143564660e+00 -1.3769049339217609e+00 -2.7009066427144052e-01 1.3077579635841403e+00 1.1014434958063513e+00 5.6091755487311531e-02 7.9618194480882409e-01 3.0993673145733375e-01 3.4067338716047524e+00 -4.6894898032384669e-01 -1.1352180998014384e-01 -3.1881035952219534e+00 -5.3700704589456438e-01 -2.1057476608392731e-01 -1.6204877215609879e+00 7.2757871310224420e-01 2.2337506395938012e-01 1.7228240524293599e+00 3.9733357383197404e-01 1.5127542442517025e-01 1.6115294355857497e+00 -7.7197547857938487e-01 -2.0795662636631621e-01 -1.7680255531884437e+00 -6.8201212543134382e-01 -2.6877541970158669e-01 -9.5319906320503378e-01 5.3884939848609725e-01 1.1624140229009003e-01 7.8872857355655857e-01 -7.7506687873162381e+00 -1.3958278739541248e+00 -4.6894898032384658e-01 8.0573680110651793e+00 1.0809505113707876e+00 1.0281097407888089e-01 5.7124936540301521e+00 1.2445912081099568e+00 7.1259048703740904e-02 -5.8614112444445343e+00 -9.1563836618872119e-01 -5.6847271349459316e-01 -5.7918146969448134e+00 -1.4020266966958521e+00 -5.0219578063021991e-02 5.9044647101761001e+00 9.5035449005911288e-01 4.2537259239388236e-01 4.6060994791827650e+00 1.3079496581188637e+00 5.3994446909985616e-01 -4.8765311257486097e+00 -8.7035293082002341e-01 -5.1745812394898692e-02 -1.3991308308134875e+00 -3.5655613645775284e+00 -1.1352180998014384e-01 1.0809505113707878e+00 3.4480870075230676e+00 2.4554674835244074e-02 1.2534954254443209e+00 1.9468227379206440e+00 2.2249407550520333e-02 -9.1230463222467451e-01 -1.8003705797444403e+00 -1.2223210849370347e-01 -1.1127396346971723e+00 -1.9754084779093617e+00 -1.2981261038488394e-02 9.5252319062008484e-01 1.8269942608209027e+00 9.4279053983946370e-02 1.0139684652261405e+00 1.1288925745946221e+00 1.1794026878774182e-01 -8.7676249492599978e-01 -1.0094561586279052e+00 -1.0288225645116935e-02 -4.7318736668451072e-01 -1.1447631493987528e-01 -3.1881035952219534e+00 1.0281097407888090e-01 2.4554674835244091e-02 3.2094456855767248e+00 7.8864180361394962e-02 2.4372505170662910e-02 1.6034686279070334e+00 -2.7451437489432012e-01 -5.8220639829663766e-02 -1.6222816955813535e+00 -5.2066187642833682e-02 -1.7818811765557913e-02 -1.6203814223866493e+00 4.2980122421427192e-01 9.4686894550869510e-02 1.6244321592576465e+00 2.4738557082512788e-01 5.8688026449647455e-02 8.1536548752302151e-01 -5.9094020258011207e-02 -1.1786334471327009e-02 -8.2194524707446981e-01 -5.4594754405521853e+00 -1.5256872129629291e+00 -5.3700704589456438e-01 5.7124936540301521e+00 1.2534954254443211e+00 7.8864180361394975e-02 7.5880032017076227e+00 1.6676126573889412e+00 8.2782463767723566e-02 -7.6894815848043727e+00 -1.3760633719477844e+00 -4.2456890902958044e-01 -4.5051863187725978e+00 -1.4260888943163470e+00 -5.1863655424225531e-02 4.6104663987818313e+00 1.0132966511920027e+00 5.1737723137060487e-01 5.4457153196950365e+00 1.4742305194719256e+00 3.7393871894480563e-01 -5.7025352300854859e+00 -1.0807957742701302e+00 -3.9522984096159092e-02 -1.5226101505904135e+00 -2.2074166089939129e+00 -2.1057476608392728e-01 1.2445912081099570e+00 1.9468227379206440e+00 2.4372505170662910e-02 1.6676126573889412e+00 3.8816486039502816e+00 3.0271515468225201e-02 -1.3530837967662657e+00 -3.5896833208183270e+00 -1.5513522577428054e-01 -1.4423817078972661e+00 -1.3790368053353215e+00 -2.1200457191422804e-02 1.3023936291186189e+00 1.1296586537742908e+00 2.0202972145156436e-01 1.4811182835345278e+00 2.2001781799168985e+00 1.4482727641306789e-01 -1.3776401228980995e+00 -1.9821714404145541e+00 -1.4590569453889797e-02 -2.4852340377364757e-01 -9.8892267213552001e-02 -1.6204877215609879e+00 7.1259048703740932e-02 2.2249407550520336e-02 1.6034686279070334e+00 8.2782463767723580e-02 3.0271515468225201e-02 3.2436298700121187e+00 -4.5606220398531749e-01 -1.6694211205168391e-01 -3.2181500004271664e+00 -4.3829414710642237e-02 -1.7837833253376165e-02 -8.2118758960781402e-01 2.2899479575780682e-01 8.5338277333034965e-02 8.1399372309270257e-01 4.0506304567832141e-01 1.5532719972144371e-01 1.6336163768316281e+00 -3.9684331437985373e-02 -9.5141875546121864e-03 -1.6348832862475147e+00 5.5730428603900837e+00 1.2116845696583840e+00 7.2757871310224420e-01 -5.8614112444445343e+00 -9.1230463222467462e-01 -2.7451437489432018e-01 -7.6894815848043727e+00 -1.3530837967662659e+00 -4.5606220398531744e-01 7.9180471240071775e+00 1.0397399695890168e+00 8.1933421300811182e-01 4.5797638467299127e+00 1.2901166067077994e+00 2.3622962691385627e-01 -4.7480234499780787e+00 -8.5640523218443276e-01 -7.2637420580515255e-01 -5.5664182775451438e+00 -1.3444145971850723e+00 -7.5875243918889690e-01 5.7944807256449566e+00 9.2466711240524546e-01 4.3256067084947492e-01 1.2296256549738849e+00 1.9291367821295242e+00 2.2337506395938012e-01 -9.1563836618872096e-01 -1.8003705797444405e+00 -5.8220639829663766e-02 -1.3760633719477846e+00 -3.5896833208183270e+00 -1.6694211205168397e-01 1.0397399695890170e+00 3.5262733577375664e+00 1.8257638291430256e-01 1.0102536934432191e+00 1.1010952236603673e+00 8.7109809159779145e-02 -8.5415720308577603e-01 -1.0077775704489413e+00 -1.5888473978151818e-01 -1.0597327060471056e+00 -1.9793770883611157e+00 -2.0440293236475052e-01 9.2597232926326589e-01 1.8207031958453661e+00 9.5389167994154603e-02 7.2828853511779534e-01 2.1976953886224049e-01 1.7228240524293599e+00 -5.6847271349459327e-01 -1.2223210849370346e-01 -1.6222816955813535e+00 -4.2456890902958033e-01 -1.5513522577428057e-01 -3.2181500004271668e+00 8.1933421300811204e-01 1.8257638291430259e-01 3.4377810039259389e+00 5.1567031478936354e-01 1.9893783672755080e-01 7.9017826891260989e-01 -7.2003253472806605e-01 -1.5789543087550181e-01 -9.5460886964893521e-01 -7.4078020741111161e-01 -2.5172785037614243e-01 -1.7778650208552744e+00 3.9056130174808051e-01 8.5706857015534529e-02 1.6221222612448198e+00 5.5180195195043629e+00 1.5134106681219572e+00 3.9733357383197404e-01 -5.7918146969448143e+00 -1.1127396346971723e+00 -5.2066187642833710e-02 -4.5051863187725978e+00 -1.4423817078972661e+00 -4.3829414710642230e-02 4.5797638467299127e+00 1.0102536934432191e+00 5.1567031478936343e-01 7.8219937436111469e+00 1.6997752575261156e+00 9.7808273372185742e-02 -7.8619804683890253e+00 -1.4013683513025996e+00 -4.5165701859720131e-01 -5.4999490973962644e+00 -1.5230719810859903e+00 -5.3616045912748056e-01 5.7391534716572803e+00 1.2561220558917361e+00 7.2900918084634947e-02 1.5080652397612746e+00 2.1869714174880386e+00 1.5127542442517025e-01 -1.4020266966958519e+00 -1.9754084779093617e+00 -1.7818811765557913e-02 -1.4260888943163470e+00 -1.3790368053353215e+00 -1.7837833253376158e-02 1.2901166067077994e+00 1.1010952236603671e+00 1.9893783672755078e-01 1.6997752575261160e+00 3.9984823996140233e+00 3.5428814703922576e-02 -1.3799625071249122e+00 -3.6590550985034338e+00 -1.6248968141270004e-01 -1.5094392713822904e+00 -2.2455259755695507e+00 -2.0889357927286961e-01 1.2195602655242126e+00 1.9724773165552398e+00 2.1397829847860171e-02 4.1019525914166083e-01 1.5773014169925920e-01 1.6115294355857497e+00 -5.0219578063022012e-02 -1.2981261038488384e-02 -1.6203814223866491e+00 -5.1863655424225566e-02 -2.1200457191422804e-02 -8.2118758960781402e-01 2.3622962691385629e-01 8.7109809159779145e-02 7.9017826891260989e-01 9.7808273372185742e-02 3.5428814703922562e-02 3.3546314456557385e+00 -4.6476021025475056e-01 -1.6857422913871745e-01 -3.2838369868547717e+00 -2.5815961233371459e-01 -1.0179492044564681e-01 -1.6660419188644506e+00 8.0769896648009751e-02 2.4282102251314559e-02 1.6351087675595870e+00 -5.6546925984843392e+00 -1.3803952833991273e+00 -7.7197547857938487e-01 5.9044647101761001e+00 9.5252319062008473e-01 4.2980122421427192e-01 4.6104663987818322e+00 1.3023936291186187e+00 2.2899479575780679e-01 -4.7480234499780787e+00 -8.5415720308577603e-01 -7.2003253472806605e-01 -7.8619804683890253e+00 -1.3799625071249120e+00 -4.6476021025475045e-01 8.0251774404170373e+00 1.0609660171607820e+00 8.3901538055468228e-01 5.6284883615112724e+00 1.2066186825412590e+00 7.2803120774481223e-01 -5.9039003940347987e+00 -9.0798652583092943e-01 -2.6907438470937217e-01 -1.0874566468904436e+00 -1.9751487808926429e+00 -2.0795662636631623e-01 9.5035449005911288e-01 1.8269942608209029e+00 9.4686894550869510e-02 1.0132966511920027e+00 1.1296586537742905e+00 8.5338277333034965e-02 -8.5640523218443276e-01 -1.0077775704489413e+00 -1.5789543087550181e-01 -1.4013683513025998e+00 -3.6590550985034342e+00 -1.6857422913871747e-01 1.0609660171607820e+00 3.5433531292128562e+00 1.8701037687156399e-01 1.2334219049140858e+00 1.9867207270225999e+00 2.2387821073159031e-01 -9.1280883294850734e-01 -1.8447453209856304e+00 -5.6487473106523307e-02 -7.6479509540798485e-01 -2.6006892108127705e-01 -1.7680255531884435e+00 4.2537259239388236e-01 9.4279053983946370e-02 1.6244321592576465e+00 5.1737723137060498e-01 2.0202972145156434e-01 8.1399372309270235e-01 -7.2637420580515233e-01 -1.5888473978151818e-01 -9.5460886964893510e-01 -4.5165701859720125e-01 -1.6248968141270004e-01 -3.2838369868547717e+00 8.3901538055468228e-01 1.8701037687156399e-01 3.4542209178049417e+00 7.2940985193137642e-01 2.1983056909693094e-01 1.7807488841586485e+00 -5.6834873644020756e-01 -1.2170637912851047e-01 -1.6669242746217892e+00 -4.3831962131983406e+00 -1.4038780143564662e+00 -6.8201212543134382e-01 4.6060994791827650e+00 1.0139684652261405e+00 2.4738557082512794e-01 5.4457153196950365e+00 1.4811182835345278e+00 4.0506304567832147e-01 -5.5664182775451447e+00 -1.0597327060471058e+00 -7.4078020741111150e-01 -5.4999490973962653e+00 -1.5094392713822904e+00 -2.5815961233371459e-01 5.6284883615112724e+00 1.2334219049140858e+00 7.2940985193137642e-01 7.5472561664449751e+00 1.6322111811600728e+00 7.7768982572521794e-01 -7.7779957386943011e+00 -1.3876698430489645e+00 -4.7859634898387426e-01 -1.4085631098172249e+00 -1.3769049339217609e+00 -2.6877541970158669e-01 1.3079496581188637e+00 1.1288925745946221e+00 5.8688026449647455e-02 1.4742305194719258e+00 2.2001781799168985e+00 1.5532719972144371e-01 -1.3444145971850725e+00 -1.9793770883611159e+00 -2.5172785037614248e-01 -1.5230719810859903e+00 -2.2455259755695502e+00 -1.0179492044564681e-01 1.2066186825412588e+00 1.9867207270225997e+00 2.1983056909693099e-01 1.6322111811600726e+00 3.9567175946700770e+00 3.0247382463300998e-01 -1.3449603532038339e+00 -3.6707010783517706e+00 -1.1402142937765633e-01 -6.8763144590078817e-01 -2.7009066427144046e-01 -9.5319906320503389e-01 5.3994446909985627e-01 1.1794026878774182e-01 8.1536548752302163e-01 3.7393871894480563e-01 1.4482727641306789e-01 1.6336163768316283e+00 -7.5875243918889690e-01 -2.0440293236475054e-01 -1.7778650208552746e+00 -5.3616045912748067e-01 -2.0889357927286958e-01 -1.6660419188644506e+00 7.2803120774481234e-01 2.2387821073159031e-01 1.7807488841586485e+00 7.7768982572521794e-01 3.0247382463301004e-01 3.4693074355675257e+00 -4.3705987729752660e-01 -1.0573240465634942e-01 -3.3019321811560642e+00 4.5756454828808657e+00 1.3077579635841403e+00 5.3884939848609725e-01 -4.8765311257486106e+00 -8.7676249492599978e-01 -5.9094020258011221e-02 -5.7025352300854859e+00 -1.3776401228980995e+00 -3.9684331437985360e-02 5.7944807256449566e+00 9.2597232926326589e-01 3.9056130174808062e-01 5.7391534716572812e+00 1.2195602655242124e+00 8.0769896648009779e-02 -5.9039003940347987e+00 -9.1280883294850734e-01 -5.6834873644020745e-01 -7.7779957386942993e+00 -1.3449603532038339e+00 -4.3705987729752660e-01 8.1516828083800910e+00 1.0588812456048220e+00 9.4006368551543470e-02 1.0071346600682445e+00 1.1014434958063513e+00 1.1624140229009004e-01 -8.7035293082002374e-01 -1.0094561586279054e+00 -1.1786334471327011e-02 -1.0807957742701302e+00 -1.9821714404145541e+00 -9.5141875546121864e-03 9.2466711240524524e-01 1.8207031958453663e+00 8.5706857015534502e-02 1.2561220558917356e+00 1.9724773165552398e+00 2.4282102251314563e-02 -9.0798652583092931e-01 -1.8447453209856304e+00 -1.2170637912851047e-01 -1.3876698430489645e+00 -3.6707010783517706e+00 -1.0573240465634939e-01 1.0588812456048218e+00 3.6124499901729030e+00 2.2508944253860047e-02 2.3947157269865102e-01 5.6091755487311538e-02 7.8872857355655857e-01 -5.1745812394898706e-02 -1.0288225645116932e-02 -8.2194524707446981e-01 -3.9522984096159106e-02 -1.4590569453889793e-02 -1.6348832862475144e+00 4.3256067084947492e-01 9.5389167994154589e-02 1.6221222612448201e+00 7.2900918084634961e-02 2.1397829847860168e-02 1.6351087675595870e+00 -2.6907438470937217e-01 -5.6487473106523307e-02 -1.6669242746217892e+00 -4.7859634898387432e-01 -1.1402142937765633e-01 -3.3019321811560642e+00 9.4006368551543387e-02 2.2508944253860033e-02 3.3797253867388726e+00 75 76 77 135 136 137 150 151 152 90 91 92 78 79 80 138 139 140 153 154 155 93 94 95 7.2618559638984239e+00 1.6032944571767627e+00 7.7704037529899228e-01 -7.4343467167129136e+00 -1.3370406404297006e+00 -4.5600238570271512e-01 -5.1767141973269286e+00 -1.4562670465552994e+00 -2.2525450230054506e-01 5.2912753882610994e+00 1.1690437914115255e+00 7.1244529908647269e-01 5.1942833609439880e+00 1.4433014032225844e+00 3.8850151361776852e-01 -5.3347583026953433e+00 -1.0128586460090732e+00 -7.4330782941301732e-01 -4.1085876196171940e+00 -1.3468359311105147e+00 -6.6929667803954218e-01 4.3069921232488699e+00 9.3736261229371509e-01 2.1587420745258246e-01 1.6032944571767627e+00 3.8123802636587252e+00 3.0741080518127301e-01 -1.3187994162590020e+00 -3.4603998938521539e+00 -1.0619515717129252e-01 -1.4616205052596438e+00 -2.1357184011260717e+00 -9.1102589197167086e-02 1.1375184221085499e+00 1.8507894585995928e+00 2.1391284885989906e-01 1.4434686656312961e+00 2.0858945948203935e+00 1.5192330010948549e-01 -1.3093036997520662e+00 -1.8667927815101049e+00 -2.5465600641632535e-01 -1.3372661453876404e+00 -1.3147084824905948e+00 -2.6740243612235742e-01 1.2427082217417440e+00 1.0285552419002124e+00 4.6109234756483257e-02 7.7704037529899228e-01 3.0741080518127301e-01 3.3306309621905172e+00 -4.4217008156966903e-01 -1.0383745270584860e-01 -3.1013214975049594e+00 -5.1491220510224534e-01 -2.0529686700316407e-01 -1.5601989788395358e+00 7.0941354984623839e-01 2.1937883443898001e-01 1.6689620639350418e+00 3.7156862282992803e-01 1.4423550009615035e-01 1.5211853222348817e+00 -7.5667991393049605e-01 -2.0166134655357348e-01 -1.6861308683518348e+00 -6.6407320507481093e-01 -2.6719906205476635e-01 -9.0763698910373480e-01 5.1981285770206254e-01 1.0696958860094900e-01 7.3450998543962309e-01 -7.4343467167129136e+00 -1.3187994162590018e+00 -4.4217008156966914e-01 7.7577346486379692e+00 1.0074000537788945e+00 7.3375300064388707e-02 5.4370068861848679e+00 1.1727517777801146e+00 4.3015717910528460e-02 -5.5902878786415435e+00 -8.4611809921544090e-01 -5.4967303508201160e-01 -5.4782455201005602e+00 -1.3377556231457688e+00 -2.4322282750012143e-02 5.5925428789677625e+00 8.7269732114975762e-01 4.0182299253011572e-01 4.3352088625445697e+00 1.2478360239078279e+00 5.2311138471862562e-01 -4.6196131608801529e+00 -7.9801203799638210e-01 -2.5159995821961805e-02 -1.3370406404297006e+00 -3.4603998938521539e+00 -1.0383745270584860e-01 1.0074000537788945e+00 3.3522784266256185e+00 1.7898575701446658e-02 1.1944584887629963e+00 1.8692413181203098e+00 1.4044624389464180e-02 -8.4075051275500579e-01 -1.7268885778866754e+00 -1.1467999212192913e-01 -1.0437988136376044e+00 -1.8719768070212714e+00 -6.2312576169510645e-03 8.7963385385422366e-01 1.7221445569254852e+00 8.7119168190834623e-02 9.4847862837275809e-01 1.0592062968532030e+00 1.1000088059506062e-01 -8.0838105794656179e-01 -9.4360531976451645e-01 -4.3145464320764743e-03 -4.5600238570271506e-01 -1.0619515717129252e-01 -3.1013214975049594e+00 7.3375300064388735e-02 1.7898575701446651e-02 3.1342143272125571e+00 5.1920855743038612e-02 1.6227839630642515e-02 1.5474870040519781e+00 -2.5258378362613154e-01 -5.2295266303963334e-02 -1.5647790704902704e+00 -2.0975057485100302e-02 -7.6067228801498816e-03 -1.5378201606398767e+00 4.0977098783751964e-01 8.7840938973726024e-02 1.5363421057136557e+00 2.2542214622784471e-01 4.9561808444032823e-02 7.6175816173100541e-01 -3.0928063058844692e-02 -5.4320163944422423e-03 -7.7588087007409023e-01 -5.1767141973269295e+00 -1.4616205052596438e+00 -5.1491220510224534e-01 5.4370068861848679e+00 1.1944584887629965e+00 5.1920855743038619e-02 7.2062330377586443e+00 1.5966301768156921e+00 5.2514033456151479e-02 -7.3036266577887989e+00 -1.3083620735160064e+00 -3.9955729184687189e-01 -4.2372529799156373e+00 -1.3670036910630499e+00 -2.7350556846408702e-02 4.3423730338177933e+00 9.4326235476971931e-01 4.9706140957184208e-01 5.0995320059786691e+00 1.4095108105193177e+00 3.5345910247648255e-01 -5.3675511287086097e+00 -1.0068755610290248e+00 -1.3135347451985337e-02 -1.4562670465552996e+00 -2.1357184011260717e+00 -2.0529686700316407e-01 1.1727517777801149e+00 1.8692413181203098e+00 1.6227839630642518e-02 1.5966301768156916e+00 3.7284050090019139e+00 1.8767072208751394e-02 -1.2738593114470338e+00 -3.4249481876341905e+00 -1.4946421693261047e-01 -1.3775198671232742e+00 -1.3180361241070122e+00 -1.1843151478929063e-02 1.2365832585405361e+00 1.0569870670084582e+00 1.9868666343162994e-01 1.4108105970622464e+00 2.0771927480494181e+00 1.3868397457452078e-01 -1.3091295850729814e+00 -1.8531234293128251e+00 -5.7613144308396279e-03 -2.2525450230054503e-01 -9.1102589197167058e-02 -1.5601989788395358e+00 4.3015717910528460e-02 1.4044624389464175e-02 1.5474870040519779e+00 5.2514033456151486e-02 1.8767072208751394e-02 3.1077577960979039e+00 -4.3238553273649227e-01 -1.6284087669943922e-01 -3.0725285933378834e+00 -1.5294216745490198e-02 -7.0045574508722334e-03 -7.7419060854522526e-01 2.0414053140802743e-01 8.0394217433744919e-02 7.6003703518697763e-01 3.8089828553553545e-01 1.4848308665277229e-01 1.5213939310475979e+00 -7.6343165277153935e-03 -7.4097733725422463e-04 -1.5297575856618126e+00 5.2912753882610994e+00 1.1375184221085499e+00 7.0941354984623839e-01 -5.5902878786415435e+00 -8.4075051275500579e-01 -2.5258378362613154e-01 -7.3036266577887989e+00 -1.2738593114470338e+00 -4.3238553273649227e-01 7.5401837441544171e+00 9.6209096294793262e-01 8.0272790652062254e-01 4.3093853714873651e+00 1.2287511011565520e+00 2.1215377837461843e-01 -4.4834821949658235e+00 -7.8217553436472587e-01 -7.0843187234573457e-01 -5.2212971741356764e+00 -1.2785747446432818e+00 -7.3942549692138115e-01 5.4578494016289598e+00 8.4699961699701254e-01 4.0853145088825632e-01 1.1690437914115257e+00 1.8507894585995928e+00 2.1937883443898001e-01 -8.4611809921544112e-01 -1.7268885778866754e+00 -5.2295266303963341e-02 -1.3083620735160062e+00 -3.4249481876341905e+00 -1.6284087669943925e-01 9.6209096294793262e-01 3.3702596553244906e+00 1.7447728672717108e-01 9.4428785353822386e-01 1.0310017118738173e+00 8.2602766988916623e-02 -7.8576842810647241e-01 -9.4096217266449200e-01 -1.5105058671154786e-01 -9.8859504568653622e-01 -1.8515150920601040e+00 -1.9775291702643727e-01 8.5342103862677388e-01 1.6922632044475630e+00 8.7480758586319082e-02 7.1244529908647281e-01 2.1391284885989909e-01 1.6689620639350418e+00 -5.4967303508201171e-01 -1.1467999212192911e-01 -1.5647790704902704e+00 -3.9955729184687189e-01 -1.4946421693261047e-01 -3.0725285933378834e+00 8.0272790652062254e-01 1.7447728672717114e-01 3.3063795951050867e+00 4.9633308520167096e-01 1.9658716609572285e-01 7.3621981590401075e-01 -7.0652447082898007e-01 -1.4996635268187414e-01 -9.1012341879555014e-01 -7.2525009719989808e-01 -2.4911154973100660e-01 -1.6740572055697915e+00 3.6949860414899527e-01 7.8244809784627223e-02 1.5099268132493566e+00 5.1942833609439880e+00 1.4434686656312961e+00 3.7156862282992809e-01 -5.4782455201005593e+00 -1.0437988136376046e+00 -2.0975057485100299e-02 -4.2372529799156364e+00 -1.3775198671232742e+00 -1.5294216745490181e-02 4.3093853714873642e+00 9.4428785353822398e-01 4.9633308520167096e-01 7.2872156255840119e+00 1.6204425403283351e+00 6.5318919813036003e-02 -7.3234265284075653e+00 -1.3105684207380417e+00 -4.2385952419758621e-01 -5.1142485266796402e+00 -1.4540806620708688e+00 -5.1612261844942697e-01 5.3622891970880371e+00 1.1777687040719338e+00 4.3030789032965026e-02 1.4433014032225844e+00 2.0858945948203935e+00 1.4423550009615033e-01 -1.3377556231457690e+00 -1.8719768070212714e+00 -7.6067228801498851e-03 -1.3670036910630499e+00 -1.3180361241070122e+00 -7.0045574508722317e-03 1.2287511011565520e+00 1.0310017118738173e+00 1.9658716609572283e-01 1.6204425403283349e+00 3.7324106059996898e+00 2.3448948323376757e-02 -1.3006785684549256e+00 -3.3767643131596881e+00 -1.5752105587867482e-01 -1.4406011791542188e+00 -2.0958900446581459e+00 -2.0482620982319066e-01 1.1535440171104923e+00 1.8133603762522172e+00 1.2686931517636280e-02 3.8850151361776852e-01 1.5192330010948552e-01 1.5211853222348817e+00 -2.4322282750012133e-02 -6.2312576169510758e-03 -1.5378201606398767e+00 -2.7350556846408698e-02 -1.1843151478929063e-02 -7.7419060854522526e-01 2.1215377837461841e-01 8.2602766988916623e-02 7.3621981590401075e-01 6.5318919813036003e-02 2.3448948323376760e-02 3.1058537352314182e+00 -4.3533947365890585e-01 -1.6198681265875015e-01 -3.0245207465677466e+00 -2.3125969265517354e-01 -9.3292282392834089e-02 -1.5269759009012471e+00 5.2297794105077323e-02 1.5378488725685462e-02 1.5002485432837851e+00 -5.3347583026953433e+00 -1.3093036997520662e+00 -7.5667991393049605e-01 5.5925428789677625e+00 8.7963385385422388e-01 4.0977098783751964e-01 4.3423730338177933e+00 1.2365832585405361e+00 2.0414053140802743e-01 -4.4834821949658235e+00 -7.8576842810647241e-01 -7.0652447082898007e-01 -7.3234265284075635e+00 -1.3006785684549256e+00 -4.3533947365890591e-01 7.4946832851569063e+00 9.6797294514482635e-01 8.1630745966256080e-01 5.2432851423167621e+00 1.1395559939931541e+00 7.0942378049365606e-01 -5.5312173141904921e+00 -8.2799535521927570e-01 -2.4109890098337816e-01 -1.0128586460090729e+00 -1.8667927815101049e+00 -2.0166134655357348e-01 8.7269732114975762e-01 1.7221445569254854e+00 8.7840938973726024e-02 9.4326235476971931e-01 1.0569870670084582e+00 8.0394217433744905e-02 -7.8217553436472576e-01 -9.4096217266449189e-01 -1.4996635268187411e-01 -1.3105684207380419e+00 -3.3767643131596881e+00 -1.6198681265875015e-01 9.6797294514482668e-01 3.2678837111584604e+00 1.7640415730228523e-01 1.1533466151200933e+00 1.8257895350795237e+00 2.1732380420086236e-01 -8.3167663507255618e-01 -1.6882856028376425e+00 -4.8348606016419965e-02 -7.4330782941301743e-01 -2.5465600641632535e-01 -1.6861308683518348e+00 4.0182299253011572e-01 8.7119168190834623e-02 1.5363421057136557e+00 4.9706140957184208e-01 1.9868666343162994e-01 7.6003703518697763e-01 -7.0843187234573457e-01 -1.5105058671154786e-01 -9.1012341879555014e-01 -4.2385952419758621e-01 -1.5752105587867482e-01 -3.0245207465677466e+00 8.1630745966256080e-01 1.7640415730228526e-01 3.2069141661402591e+00 7.0857300961036207e-01 2.1472674443362624e-01 1.6464663683351246e+00 -5.4816564541854262e-01 -1.1370908435182800e-01 -1.5289846416608852e+00 -4.1085876196171940e+00 -1.3372661453876404e+00 -6.6407320507481093e-01 4.3352088625445697e+00 9.4847862837275798e-01 2.2542214622784471e-01 5.0995320059786691e+00 1.4108105970622464e+00 3.8089828553553545e-01 -5.2212971741356755e+00 -9.8859504568653633e-01 -7.2525009719989808e-01 -5.1142485266796402e+00 -1.4406011791542190e+00 -2.3125969265517357e-01 5.2432851423167630e+00 1.1533466151200933e+00 7.0857300961036207e-01 6.9691772522929973e+00 1.5492274693969021e+00 7.5325953348682628e-01 -7.2030699427004876e+00 -1.2954009397236042e+00 -4.4756997993068237e-01 -1.3468359311105149e+00 -1.3147084824905948e+00 -2.6719906205476635e-01 1.2478360239078279e+00 1.0592062968532030e+00 4.9561808444032823e-02 1.4095108105193175e+00 2.0771927480494181e+00 1.4848308665277227e-01 -1.2785747446432818e+00 -1.8515150920601040e+00 -2.4911154973100660e-01 -1.4540806620708686e+00 -2.0958900446581454e+00 -9.3292282392834089e-02 1.1395559939931541e+00 1.8257895350795235e+00 2.1472674443362624e-01 1.5492274693969021e+00 3.6559927809408501e+00 2.9918186997698093e-01 -1.2666389599925361e+00 -3.3560677417141500e+00 -1.0235061532880382e-01 -6.6929667803954218e-01 -2.6740243612235737e-01 -9.0763698910373480e-01 5.2311138471862562e-01 1.1000088059506062e-01 7.6175816173100541e-01 3.5345910247648255e-01 1.3868397457452075e-01 1.5213939310475979e+00 -7.3942549692138104e-01 -1.9775291702643721e-01 -1.6740572055697915e+00 -5.1612261844942697e-01 -2.0482620982319066e-01 -1.5269759009012471e+00 7.0942378049365606e-01 2.1732380420086236e-01 1.6464663683351246e+00 7.5325953348682617e-01 2.9918186997698099e-01 3.1893299852155499e+00 -4.1440900776524026e-01 -9.5208966375439297e-02 -3.0102783507545037e+00 4.3069921232488699e+00 1.2427082217417440e+00 5.1981285770206254e-01 -4.6196131608801529e+00 -8.0838105794656168e-01 -3.0928063058844713e-02 -5.3675511287086097e+00 -1.3091295850729814e+00 -7.6343165277154221e-03 5.4578494016289598e+00 8.5342103862677388e-01 3.6949860414899532e-01 5.3622891970880371e+00 1.1535440171104923e+00 5.2297794105077323e-02 -5.5312173141904921e+00 -8.3167663507255640e-01 -5.4816564541854274e-01 -7.2030699427004876e+00 -1.2666389599925365e+00 -4.1440900776524026e-01 7.5943208245138774e+00 9.6615296060562517e-01 5.9527776814203903e-02 9.3736261229371520e-01 1.0285552419002124e+00 1.0696958860094902e-01 -7.9801203799638210e-01 -9.4360531976451645e-01 -5.4320163944422475e-03 -1.0068755610290248e+00 -1.8531234293128254e+00 -7.4097733725422463e-04 8.4699961699701243e-01 1.6922632044475630e+00 7.8244809784627195e-02 1.1777687040719338e+00 1.8133603762522172e+00 1.5378488725685461e-02 -8.2799535521927570e-01 -1.6882856028376427e+00 -1.1370908435182799e-01 -1.2954009397236042e+00 -3.3560677417141500e+00 -9.5208966375439297e-02 9.6615296060562539e-01 3.3069032710291424e+00 1.4498157347701270e-02 2.1587420745258248e-01 4.6109234756483278e-02 7.3450998543962309e-01 -2.5159995821961816e-02 -4.3145464320764717e-03 -7.7588087007409046e-01 -1.3135347451985337e-02 -5.7613144308396209e-03 -1.5297575856618126e+00 4.0853145088825638e-01 8.7480758586319096e-02 1.5099268132493566e+00 4.3030789032965040e-02 1.2686931517636283e-02 1.5002485432837853e+00 -2.4109890098337816e-01 -4.8348606016419958e-02 -1.5289846416608854e+00 -4.4756997993068248e-01 -1.0235061532880382e-01 -3.0102783507545032e+00 5.9527776814203924e-02 1.4498157347701270e-02 3.1002161061785269e+00 30 31 32 90 91 92 105 106 107 45 46 47 33 34 35 93 94 95 108 109 110 48 49 50 6.4685010411259842e+00 2.1362638237576634e+00 6.7552016896579248e-01 -6.7158070586169369e+00 -1.9872366173036005e+00 -3.9633821074245196e-01 -4.4733167429822203e+00 -1.9046189817960888e+00 -1.7940838327017525e-01 4.6790714881997424e+00 1.7263936571082232e+00 6.3108340281607955e-01 4.5672207075564115e+00 1.9253993325916205e+00 3.2946260908902891e-01 -4.7862531621605031e+00 -1.6140302074106121e+00 -6.6076728731537504e-01 -3.5033261016407646e+00 -1.7666499696821047e+00 -5.8294058199572329e-01 3.7639098285182864e+00 1.4844789627348987e+00 1.8338828245282507e-01 2.1362638237576639e+00 4.4578309786716162e+00 4.3068982791463006e-01 -1.9868755404208918e+00 -4.0487558594973621e+00 -1.7995433398855676e-01 -1.9121829791053588e+00 -2.7380674460680625e+00 -1.1610853631073260e-01 1.7083668430550998e+00 2.3881257389336463e+00 3.3642302686515374e-01 1.9295079972732294e+00 2.7361899573631692e+00 2.0719892501446749e-01 -1.8891545675423875e+00 -2.4562790774830732e+00 -3.8216560676867128e-01 -1.7578261739565837e+00 -1.9081274817514542e+00 -3.7400747815685009e-01 1.7719005969392294e+00 1.5690831898315198e+00 7.7924175430559697e-02 6.7552016896579237e-01 4.3068982791462995e-01 3.2383123893703383e+00 -3.9470571004202204e-01 -1.7911558941997507e-01 -3.0262319687249617e+00 -4.4011586781405498e-01 -2.8095890800208179e-01 -1.5155117443798389e+00 6.2529855887104302e-01 3.3749319911125503e-01 1.6234391474419214e+00 3.2060691814434478e-01 1.9977615324950154e-01 1.5168681127951285e+00 -6.7528016654297163e-01 -3.3455799232435979e-01 -1.6753253603300318e+00 -5.7312650080681060e-01 -3.6954731031870675e-01 -8.9328816633689123e-01 4.6180259922467937e-01 1.9622061978973676e-01 7.3173759016433648e-01 -6.7158070586169369e+00 -1.9868755404208920e+00 -3.9470571004202215e-01 7.1182893635143420e+00 1.7847611905587857e+00 5.1841672403078957e-02 4.8013909378100745e+00 1.7562115794620810e+00 1.9993491932646594e-02 -5.0518031610585084e+00 -1.5287795303329554e+00 -4.9434851464013668e-01 -4.9113479683874663e+00 -1.9278042553677357e+00 -4.3795647397526123e-03 5.1157294080130598e+00 1.5731965143472906e+00 3.6122848840156707e-01 3.7878370642619563e+00 1.7742847540276245e+00 4.6693072032785798e-01 -4.1442885855365228e+00 -1.4449947122741986e+00 -6.5605836432398087e-03 -1.9872366173036007e+00 -4.0487558594973621e+00 -1.7911558941997507e-01 1.7847611905587859e+00 3.8415558777379442e+00 2.4624900601337825e-02 1.7657777043260916e+00 2.4148683783661040e+00 1.1957247790717020e-02 -1.5210524293604892e+00 -2.1702570251578468e+00 -2.1273253983446017e-01 -1.6560031623950624e+00 -2.4626880617356437e+00 -2.1444118653504022e-03 1.5760976971574232e+00 2.2229818336000600e+00 1.5831617743773943e-01 1.4931289160352499e+00 1.5994031688878589e+00 2.0095639198004045e-01 -1.4554732990183987e+00 -1.3971083122011134e+00 -1.8621766900492763e-03 -3.9633821074245185e-01 -1.7995433398855679e-01 -3.0262319687249617e+00 5.1841672403078978e-02 2.4624900601337815e-02 3.0581791376469591e+00 3.1383098101344514e-02 1.7925083605685500e-02 1.5113741080923986e+00 -2.1878356647391331e-01 -9.3527638604166852e-02 -1.5236014618593337e+00 -8.1639255459358614e-03 -4.9800980528989895e-03 -1.5366296582577905e+00 3.6300083370246222e-01 1.5811247513160875e-01 1.5320529356133212e+00 1.9509011975162291e-01 8.4562692097796682e-02 7.5786824433335220e-01 -1.8030021196207582e-02 -6.7630807908061674e-03 -7.7301133684394363e-01 -4.4733167429822203e+00 -1.9121829791053591e+00 -4.4011586781405498e-01 4.8013909378100745e+00 1.7657777043260916e+00 3.1383098101344507e-02 6.3545062403678036e+00 2.0930141932774879e+00 2.4017964397717636e-02 -6.5402085945313351e+00 -1.9171610643280437e+00 -3.3408795476330039e-01 -3.6118295035807262e+00 -1.7951160819728273e+00 -7.8356700731167309e-03 3.7949018115306163e+00 1.4963807239803382e+00 4.2716902300369719e-01 4.4236192355861670e+00 1.8444519341373318e+00 2.9166208442727348e-01 -4.7490633842003831e+00 -1.5751644303150205e+00 7.8073227204388624e-03 -1.9046189817960890e+00 -2.7380674460680625e+00 -2.8095890800208179e-01 1.7562115794620810e+00 2.4148683783661040e+00 1.7925083605685496e-02 2.0930141932774879e+00 4.3406980523027894e+00 1.3538542451998661e-02 -1.8913605317688438e+00 -3.9758525394685940e+00 -2.0659831097899883e-01 -1.8127172774654927e+00 -1.9159110809687823e+00 -5.9677736578992533e-03 1.7648498610347376e+00 1.5999018563217995e+00 2.7475339650240110e-01 1.8506975322222641e+00 2.6827696915632115e+00 1.8457719875887499e-01 -1.8560763749661464e+00 -2.4084069120484672e+00 2.7307713200193976e-03 -1.7940838327017525e-01 -1.1610853631073259e-01 -1.5155117443798389e+00 1.9993491932646594e-02 1.1957247790717012e-02 1.5113741080923986e+00 2.4017964397717629e-02 1.3538542451998660e-02 3.0259429471335317e+00 -3.6539762188702607e-01 -2.2587856093989372e-01 -2.9910484475167012e+00 3.9103350403299044e-03 1.5227561739280179e-03 -7.7018569943530868e-01 1.6381894219129683e-01 1.0640196007449457e-01 7.5479492081121213e-01 3.2255879617510819e-01 2.0224839648612661e-01 1.5067108483854104e+00 1.0506475420102017e-02 6.3181942733614507e-03 -1.5220769330907040e+00 4.6790714881997415e+00 1.7083668430550998e+00 6.2529855887104302e-01 -5.0518031610585084e+00 -1.5210524293604895e+00 -2.1878356647391337e-01 -6.5402085945313351e+00 -1.8913605317688440e+00 -3.6539762188702607e-01 6.8657636008441836e+00 1.6790386386585152e+00 7.1791557509413573e-01 3.7699508859550588e+00 1.7525097950115627e+00 1.7493150154948806e-01 -4.0255519400765358e+00 -1.4194281392967354e+00 -6.3976642538738537e-01 -4.6259744117329600e+00 -1.8089551656528444e+00 -6.5644723645063841e-01 4.9287521324003549e+00 1.5008809893537349e+00 3.6224921468429688e-01 1.7263936571082232e+00 2.3881257389336463e+00 3.3749319911125503e-01 -1.5287795303329554e+00 -2.1702570251578468e+00 -9.3527638604166852e-02 -1.9171610643280435e+00 -3.9758525394685940e+00 -2.2587856093989378e-01 1.6790386386585154e+00 3.8210446155912008e+00 3.1652224295664405e-01 1.4925448622962296e+00 1.5686413802139774e+00 1.1190002432174698e-01 -1.4148801335146386e+00 -1.3906055599341030e+00 -2.7922674654099588e-01 -1.5393590861155573e+00 -2.3999319768124323e+00 -3.2513122767953406e-01 1.5022026562282274e+00 2.1588353666341518e+00 1.5784870737494472e-01 6.3108340281607955e-01 3.3642302686515380e-01 1.6234391474419214e+00 -4.9434851464013668e-01 -2.1273253983446017e-01 -1.5236014618593337e+00 -3.3408795476330039e-01 -2.0659831097899883e-01 -2.9910484475167012e+00 7.1791557509413573e-01 3.1652224295664405e-01 3.2135527897546625e+00 4.3054843715933111e-01 2.7353899956968908e-01 7.3330016888566307e-01 -6.3823766097113521e-01 -2.7943727028535936e-01 -8.9841655007900922e-01 -6.3325585122860151e-01 -3.6650554730273865e-01 -1.6558900551707574e+00 3.2038256653362773e-01 1.3878939901007017e-01 1.4986644085435556e+00 4.5672207075564115e+00 1.9295079972732294e+00 3.2060691814434478e-01 -4.9113479683874663e+00 -1.6560031623950626e+00 -8.1639255459358059e-03 -3.6118295035807262e+00 -1.8127172774654929e+00 3.9103350403299217e-03 3.7699508859550588e+00 1.4925448622962296e+00 4.3054843715933105e-01 6.6567045917254015e+00 2.1767247288772342e+00 4.2228156591305126e-02 -6.7898883189846524e+00 -1.9858425258933936e+00 -3.6702680900429896e-01 -4.4974448835558674e+00 -1.9067070878608434e+00 -4.4362220009897341e-01 4.8166344892718405e+00 1.7624924651680991e+00 2.1519087713897867e-02 1.9253993325916205e+00 2.7361899573631692e+00 1.9977615324950154e-01 -1.9278042553677359e+00 -2.4626880617356437e+00 -4.9800980528989904e-03 -1.7951160819728273e+00 -1.9159110809687823e+00 1.5227561739280093e-03 1.7525097950115627e+00 1.5686413802139774e+00 2.7353899956968908e-01 2.1767247288772338e+00 4.5242594016425999e+00 2.4376224339702934e-02 -1.9707790873322921e+00 -4.1104092731281128e+00 -2.2362135938420577e-01 -1.8903127928437349e+00 -2.7603778500439642e+00 -2.8173790153120970e-01 1.7293783610361735e+00 2.4202955266567558e+00 1.1125225635493251e-02 3.2946260908902891e-01 2.0719892501446749e-01 1.5168681127951285e+00 -4.3795647397525820e-03 -2.1444118653504026e-03 -1.5366296582577905e+00 -7.8356700731167309e-03 -5.9677736578992498e-03 -7.7018569943530868e-01 1.7493150154948803e-01 1.1190002432174699e-01 7.3330016888566318e-01 4.2228156591305077e-02 2.4376224339702907e-02 3.1679000515653692e+00 -3.7623758381652811e-01 -2.3004409466873971e-01 -3.0925842543863351e+00 -1.9178705306529975e-01 -1.2292038253262934e-01 -1.5499527824204613e+00 3.3617604464875092e-02 1.7601489048701312e-02 1.5312840612537357e+00 -4.7862531621605040e+00 -1.8891545675423875e+00 -6.7528016654297174e-01 5.1157294080130598e+00 1.5760976971574232e+00 3.6300083370246228e-01 3.7949018115306172e+00 1.7648498610347376e+00 1.6381894219129683e-01 -4.0255519400765358e+00 -1.4148801335146386e+00 -6.3823766097113532e-01 -6.7898883189846515e+00 -1.9707790873322921e+00 -3.7623758381652805e-01 7.0558677677319448e+00 1.7446000225658906e+00 7.4212134320822642e-01 4.7120373594249259e+00 1.7028031685236260e+00 6.2918711816947404e-01 -5.0768429254788598e+00 -1.5135369608923595e+00 -2.0837282594082523e-01 -1.6140302074106121e+00 -2.4562790774830732e+00 -3.3455799232435984e-01 1.5731965143472908e+00 2.2229818336000600e+00 1.5811247513160875e-01 1.4963807239803379e+00 1.5999018563217995e+00 1.0640196007449455e-01 -1.4194281392967352e+00 -1.3906055599341034e+00 -2.7943727028535931e-01 -1.9858425258933932e+00 -4.1104092731281128e+00 -2.3004409466873971e-01 1.7446000225658906e+00 3.8997905130171588e+00 3.2770848194509916e-01 1.7268622002264629e+00 2.4330509269732858e+00 3.3979042341243304e-01 -1.5217385885192418e+00 -2.1984312193670159e+00 -8.7973983285176971e-02 -6.6076728731537515e-01 -3.8216560676867128e-01 -1.6753253603300318e+00 3.6122848840156707e-01 1.5831617743773940e-01 1.5320529356133212e+00 4.2716902300369713e-01 2.7475339650240105e-01 7.5479492081121213e-01 -6.3976642538738537e-01 -2.7922674654099588e-01 -8.9841655007900922e-01 -3.6702680900429885e-01 -2.2362135938420577e-01 -3.0925842543863347e+00 7.4212134320822642e-01 3.2770848194509916e-01 3.2659780490172734e+00 6.2649264050413422e-01 3.3405823607465135e-01 1.6679924629396106e+00 -4.8945097341056554e-01 -2.0982257926601794e-01 -1.5544922035860402e+00 -3.5033261016407637e+00 -1.7578261739565837e+00 -5.7312650080681060e-01 3.7878370642619568e+00 1.4931289160352499e+00 1.9509011975162291e-01 4.4236192355861679e+00 1.8506975322222643e+00 3.2255879617510819e-01 -4.6259744117329600e+00 -1.5393590861155573e+00 -6.3325585122860151e-01 -4.4974448835558665e+00 -1.8903127928437349e+00 -1.9178705306529972e-01 4.7120373594249259e+00 1.7268622002264631e+00 6.2649264050413422e-01 6.3005939068869683e+00 2.0421476838915726e+00 6.5092969877301321e-01 -6.5973421692304282e+00 -1.9253382794596743e+00 -3.9690185010316703e-01 -1.7666499696821050e+00 -1.9081274817514542e+00 -3.6954731031870669e-01 1.7742847540276245e+00 1.5994031688878589e+00 8.4562692097796682e-02 1.8444519341373318e+00 2.6827696915632111e+00 2.0224839648612664e-01 -1.8089551656528444e+00 -2.3999319768124323e+00 -3.6650554730273865e-01 -1.9067070878608434e+00 -2.7603778500439642e+00 -1.2292038253262934e-01 1.7028031685236262e+00 2.4330509269732863e+00 3.3405823607465135e-01 2.0421476838915718e+00 4.3861927416645248e+00 4.1572708067335556e-01 -1.8813753173843628e+00 -4.0329792204810300e+00 -1.7762316517785579e-01 -5.8294058199572329e-01 -3.7400747815685015e-01 -8.9328816633689101e-01 4.6693072032785804e-01 2.0095639198004045e-01 7.5786824433335220e-01 2.9166208442727348e-01 1.8457719875887499e-01 1.5067108483854104e+00 -6.5644723645063841e-01 -3.2513122767953417e-01 -1.6558900551707574e+00 -4.4362220009897346e-01 -2.8173790153120964e-01 -1.5499527824204615e+00 6.2918711816947415e-01 3.3979042341243304e-01 1.6679924629396106e+00 6.5092969877301332e-01 4.1572708067335562e-01 3.2208615060274148e+00 -3.5569960315228399e-01 -1.6017448745711038e-01 -3.0543020577576776e+00 3.7639098285182855e+00 1.7719005969392292e+00 4.6180259922467937e-01 -4.1442885855365219e+00 -1.4554732990183989e+00 -1.8030021196207589e-02 -4.7490633842003831e+00 -1.8560763749661464e+00 1.0506475420102031e-02 4.9287521324003540e+00 1.5022026562282276e+00 3.2038256653362773e-01 4.8166344892718405e+00 1.7293783610361733e+00 3.3617604464875085e-02 -5.0768429254788590e+00 -1.5217385885192416e+00 -4.8945097341056554e-01 -6.5973421692304290e+00 -1.8813753173843630e+00 -3.5569960315228388e-01 7.0582406142557153e+00 1.7111819656845200e+00 3.6871352115773443e-02 1.4844789627348989e+00 1.5690831898315198e+00 1.9622061978973676e-01 -1.4449947122741984e+00 -1.3971083122011134e+00 -6.7630807908061691e-03 -1.5751644303150205e+00 -2.4084069120484668e+00 6.3181942733614507e-03 1.5008809893537352e+00 2.1588353666341518e+00 1.3878939901007017e-01 1.7624924651680991e+00 2.4202955266567558e+00 1.7601489048701308e-02 -1.5135369608923595e+00 -2.1984312193670164e+00 -2.0982257926601797e-01 -1.9253382794596741e+00 -4.0329792204810300e+00 -1.6017448745711038e-01 1.7111819656845197e+00 3.8887115809752011e+00 1.7830445392064954e-02 1.8338828245282510e-01 7.7924175430559697e-02 7.3173759016433648e-01 -6.5605836432398087e-03 -1.8621766900492761e-03 -7.7301133684394363e-01 7.8073227204388616e-03 2.7307713200194115e-03 -1.5220769330907040e+00 3.6224921468429683e-01 1.5784870737494472e-01 1.4986644085435552e+00 2.1519087713897864e-02 1.1125225635493256e-02 1.5312840612537357e+00 -2.0837282594082523e-01 -8.7973983285176971e-02 -1.5544922035860402e+00 -3.9690185010316703e-01 -1.7762316517785576e-01 -3.0543020577576776e+00 3.6871352115773436e-02 1.7830445392064957e-02 3.1421964713167383e+00 90 91 92 150 151 152 165 166 167 105 106 107 93 94 95 153 154 155 168 169 170 108 109 110 6.1353225708463208e+00 2.0319088362863589e+00 6.6005707606227626e-01 -6.3771320299230254e+00 -1.8859693220526945e+00 -3.7738678008530641e-01 -4.2458991593721755e+00 -1.8157697416909291e+00 -1.6236878559806373e-01 4.4464411761137193e+00 1.6388084521147979e+00 6.1762869635453932e-01 4.2783604821533832e+00 1.8300238002233324e+00 3.0835130397645688e-01 -4.4977695946805083e+00 -1.5097391630554693e+00 -6.4484932729134792e-01 -3.2896310853199893e+00 -1.6809298548107272e+00 -5.6768732637064034e-01 3.5503076401822748e+00 1.3916669929853311e+00 1.6625514295208693e-01 2.0319088362863589e+00 4.2744489203420626e+00 4.2597707207863111e-01 -1.8778784616250448e+00 -3.8509840764263146e+00 -1.6663397706345889e-01 -1.8220275172648703e+00 -2.6411276293071024e+00 -1.0610611693735188e-01 1.6106033448859483e+00 2.2801216176871115e+00 3.2823244260282952e-01 1.8306692241153586e+00 2.5897583881109565e+00 1.9627294281002014e-01 -1.7899795606732409e+00 -2.2998275156697257e+00 -3.7497212535556901e-01 -1.6670493309077659e+00 -1.8252241442697885e+00 -3.6860637941843072e-01 1.6837534651832571e+00 1.4728344395328015e+00 6.5836141283330568e-02 6.6005707606227648e-01 4.2597707207863111e-01 3.1085802744568451e+00 -3.7593286456595010e-01 -1.6667897224327297e-01 -2.8819385299471594e+00 -4.2425517287239328e-01 -2.7419839191177353e-01 -1.4577707773938888e+00 6.1259924738614502e-01 3.3182612573501191e-01 1.5692167325952182e+00 3.0327928017430139e-01 1.9132768919117416e-01 1.4119439224570667e+00 -6.6405039555426359e-01 -3.2679641861986508e-01 -1.5786562539736821e+00 -5.6057064378850596e-01 -3.6698360313755968e-01 -8.5420772722542271e-01 4.4887347315839038e-01 1.8552649890765410e-01 6.8283235903102391e-01 -6.3771320299230263e+00 -1.8778784616250450e+00 -3.7593286456595032e-01 6.7879072029233853e+00 1.6746265707082431e+00 2.4018768214966617e-02 4.5730990689022049e+00 1.6604881216301026e+00 -1.8678910129960502e-03 -4.8215616908749253e+00 -1.4305145042042680e+00 -4.7778174218397657e-01 -4.6257374168164036e+00 -1.8332297951369743e+00 1.9245701163747020e-02 4.8285932255860118e+00 1.4658009767917759e+00 3.4508402839745350e-01 3.5713655638118298e+00 1.6884235821317106e+00 4.5264269448474598e-01 -3.9365339236090775e+00 -1.3477164902955443e+00 1.4591305502008467e-02 -1.8859693220526947e+00 -3.8509840764263146e+00 -1.6667897224327299e-01 1.6746265707082431e+00 3.6476080081656983e+00 1.2453910728591196e-02 1.6795502792186614e+00 2.3070197908885239e+00 3.9787346136887299e-04 -1.4243346949250197e+00 -2.0607177490813346e+00 -2.0218730715966968e-01 -1.5555476400576111e+00 -2.3112641717399987e+00 9.3300412674860844e-03 1.4720089750326775e+00 2.0657668425695404e+00 1.4920753949003626e-01 1.4022822535383810e+00 1.5062315230855112e+00 1.9022990473394663e-01 -1.3626164214626371e+00 -1.3036601674616246e+00 7.2470097215130919e-03 -3.7738678008530646e-01 -1.6663397706345889e-01 -2.8819385299471594e+00 2.4018768214966613e-02 1.2453910728591198e-02 2.9228339346717727e+00 7.7396322114585076e-03 5.2907535293010522e-03 1.4547945405226583e+00 -1.9903031070815572e-01 -8.3660119236449768e-02 -1.4616500546049531e+00 1.8703419451566009e-02 1.0116392646074921e-02 -1.4384717644934728e+00 3.4234725902981283e-01 1.4660844716723601e-01 1.4262645041277273e+00 1.7650220223255134e-01 7.1771780695593729e-02 7.0873211308503625e-01 7.1058096531068484e-03 4.0528115331117335e-03 -7.3056474336160937e-01 -4.2458991593721755e+00 -1.8220275172648701e+00 -4.2425517287239334e-01 4.5730990689022040e+00 1.6795502792186612e+00 7.7396322114585119e-03 6.0993779934096404e+00 2.0027167221778304e+00 1.9737349752288495e-03 -6.2749719816471758e+00 -1.8288605327810843e+00 -3.1132231340938632e-01 -3.4025727424199976e+00 -1.7104912316185088e+00 1.3133585891278696e-02 3.5819989804404559e+00 1.4033606880615797e+00 4.1228551579627443e-01 4.1779987106172047e+00 1.7574875961942078e+00 2.7273306539635056e-01 -4.5090308699301564e+00 -1.4817360039878167e+00 2.7711952011187577e-02 -1.8157697416909291e+00 -2.6411276293071024e+00 -2.7419839191177353e-01 1.6604881216301024e+00 2.3070197908885239e+00 5.2907535293010462e-03 2.0027167221778308e+00 4.2175878629855266e+00 -5.6235706568351449e-04 -1.7912655665242130e+00 -3.8359193019503715e+00 -1.9626940937370405e-01 -1.7255256480532326e+00 -1.8343399496959298e+00 7.4284764070775789e-03 1.6757543527913732e+00 1.5034506416817122e+00 2.6983525036420786e-01 1.7598086175040752e+00 2.5692695462010700e+00 1.7420573583908314e-01 -1.7662068578350076e+00 -2.2859409608034289e+00 1.4269942211490715e-02 -1.6236878559806370e-01 -1.0610611693735188e-01 -1.4577707773938886e+00 -1.8678910129960433e-03 3.9787346136887245e-04 1.4547945405226583e+00 1.9737349752288131e-03 -5.6235706568351796e-04 2.9467223531083051e+00 -3.5116429800328247e-01 -2.2128775132224290e-01 -2.8990496353476938e+00 2.5184511848552641e-02 1.5079489815283901e-02 -7.2964797789095626e-01 1.4490958982409410e-01 9.8981252221391980e-02 7.0594774036121044e-01 3.0816927693193391e-01 1.9520837129193072e-01 1.4308117389062207e+00 3.5163861034532763e-02 1.8289238535302808e-02 -1.4518079822658556e+00 4.4464411761137193e+00 1.6106033448859483e+00 6.1259924738614491e-01 -4.8215616908749253e+00 -1.4243346949250195e+00 -1.9903031070815572e-01 -6.2749719816471750e+00 -1.7912655665242130e+00 -3.5116429800328247e-01 6.6025845452960450e+00 1.5785935376958333e+00 7.0549641605140978e-01 3.5540810858560588e+00 1.6656712948196015e+00 1.5382165825423524e-01 -3.8122105610434769e+00 -1.3215800276492153e+00 -6.2776362339499969e-01 -4.3773679531716478e+00 -1.7190458837261513e+00 -6.4164414632256195e-01 4.6830053794714024e+00 1.4013579954232163e+00 3.4768505673721123e-01 1.6388084521147979e+00 2.2801216176871111e+00 3.3182612573501191e-01 -1.4305145042042675e+00 -2.0607177490813351e+00 -8.3660119236449768e-02 -1.8288605327810841e+00 -3.8359193019503710e+00 -2.2128775132224285e-01 1.5785935376958333e+00 3.6836205683325476e+00 3.0666900212312842e-01 1.4016502327986100e+00 1.4754255801534879e+00 1.0360051724073016e-01 -1.3198591104048076e+00 -1.2961190921410899e+00 -2.6982481505430678e-01 -1.4462314513554522e+00 -2.2788767493663089e+00 -3.1632795740077618e-01 1.4064133761363702e+00 2.0324651263659579e+00 1.4900499791490565e-01 6.1762869635453932e-01 3.2823244260282947e-01 1.5692167325952182e+00 -4.7778174218397645e-01 -2.0218730715966968e-01 -1.4616500546049531e+00 -3.1132231340938638e-01 -1.9626940937370405e-01 -2.8990496353476938e+00 7.0549641605140978e-01 3.0666900212312853e-01 3.1317871859043942e+00 4.1349439146776901e-01 2.6781209418683372e-01 6.8408628221711310e-01 -6.2660663182462362e-01 -2.6967065214155345e-01 -8.5752994443780017e-01 -6.2104684913469954e-01 -3.6188138448422419e-01 -1.5865889277994931e+00 3.0013803267896799e-01 1.2729521424635962e-01 1.4197283614732155e+00 4.2783604821533832e+00 1.8306692241153586e+00 3.0327928017430139e-01 -4.6257374168164045e+00 -1.5555476400576111e+00 1.8703419451565981e-02 -3.4025727424199976e+00 -1.7255256480532326e+00 2.5184511848552641e-02 3.5540810858560596e+00 1.4016502327986100e+00 4.1349439146776912e-01 6.1753940757839381e+00 2.0602724415889795e+00 1.4389510013746037e-02 -6.3005753538052982e+00 -1.8591714175385101e+00 -3.4683178222769234e-01 -4.1950473196396478e+00 -1.8124637748006180e+00 -4.2676258478721546e-01 4.5160971888879669e+00 1.6601165819470236e+00 -1.4567459410262614e-03 1.8300238002233324e+00 2.5897583881109565e+00 1.9132768919117421e-01 -1.8332297951369740e+00 -2.3112641717399987e+00 1.0116392646074904e-02 -1.7104912316185088e+00 -1.8343399496959303e+00 1.5079489815283903e-02 1.6656712948196013e+00 1.4754255801534879e+00 2.6781209418683372e-01 2.0602724415889786e+00 4.2158286586677649e+00 7.0678408493194565e-03 -1.8549181559765315e+00 -3.7827462733884061e+00 -2.1645852195330018e-01 -1.7931627893697999e+00 -2.6032073673444653e+00 -2.7430154711877497e-01 1.6358344354699017e+00 2.2505451352365911e+00 -6.4343761661035984e-04 3.0835130397645683e-01 1.9627294281002014e-01 1.4119439224570667e+00 1.9245701163746992e-02 9.3300412674860913e-03 -1.4384717644934728e+00 1.3133585891278703e-02 7.4284764070775893e-03 -7.2964797789095626e-01 1.5382165825423524e-01 1.0360051724073017e-01 6.8408628221711310e-01 1.4389510013746063e-02 7.0678408493194435e-03 2.9150238730741922e+00 -3.4832440127295594e-01 -2.1768441489247972e-01 -2.8268670728232910e+00 -1.6960561646331768e-01 -1.1052164502319059e-01 -1.4327917195289563e+00 8.9882584368097592e-03 4.5062413410368448e-03 1.4167244569883053e+00 -4.4977695946805083e+00 -1.7899795606732409e+00 -6.6405039555426348e-01 4.8285932255860118e+00 1.4720089750326775e+00 3.4234725902981283e-01 3.5819989804404555e+00 1.6757543527913732e+00 1.4490958982409413e-01 -3.8122105610434769e+00 -1.3198591104048076e+00 -6.2660663182462362e-01 -6.3005753538052964e+00 -1.8549181559765320e+00 -3.4832440127295589e-01 6.5705215489492748e+00 1.6153806825442081e+00 7.2516446134076118e-01 4.4054984354211433e+00 1.6074872170496619e+00 6.1375416312538289e-01 -4.7760566808676037e+00 -1.4058744003633403e+00 -1.8719404466820930e-01 -1.5097391630554693e+00 -2.2998275156697257e+00 -3.2679641861986508e-01 1.4658009767917759e+00 2.0657668425695404e+00 1.4660844716723603e-01 1.4033606880615797e+00 1.5034506416817122e+00 9.8981252221391980e-02 -1.3215800276492153e+00 -1.2961190921410897e+00 -2.6967065214155350e-01 -1.8591714175385099e+00 -3.7827462733884061e+00 -2.1768441489247972e-01 1.6153806825442079e+00 3.5736611422575426e+00 3.1470940650340468e-01 1.6221052091894694e+00 2.2607500666353557e+00 3.3097329797783120e-01 -1.4161569483438381e+00 -2.0249358119449288e+00 -7.7120918215966131e-02 -6.4484932729134792e-01 -3.7497212535556901e-01 -1.5786562539736821e+00 3.4508402839745350e-01 1.4920753949003621e-01 1.4262645041277273e+00 4.1228551579627443e-01 2.6983525036420791e-01 7.0594774036121066e-01 -6.2776362339499969e-01 -2.6982481505430678e-01 -8.5752994443780006e-01 -3.4683178222769229e-01 -2.1645852195330012e-01 -2.8268670728232910e+00 7.2516446134076118e-01 3.1470940650340468e-01 3.0111837437267091e+00 6.1205513972869507e-01 3.2740685985859175e-01 1.5538150418424268e+00 -4.7514441234914462e-01 -1.9990359385306455e-01 -1.4341577588233003e+00 -3.2896310853199893e+00 -1.6670493309077659e+00 -5.6057064378850596e-01 3.5713655638118298e+00 1.4022822535383808e+00 1.7650220223255134e-01 4.1779987106172056e+00 1.7598086175040752e+00 3.0816927693193391e-01 -4.3773679531716478e+00 -1.4462314513554524e+00 -6.2104684913469954e-01 -4.1950473196396478e+00 -1.7931627893697994e+00 -1.6960561646331773e-01 4.4054984354211433e+00 1.6221052091894692e+00 6.1205513972869519e-01 5.8962189544425092e+00 1.9355739642556298e+00 6.3268683750623156e-01 -6.1890353061614034e+00 -1.8133264728545382e+00 -3.7819034701289000e-01 -1.6809298548107272e+00 -1.8252241442697887e+00 -3.6698360313755968e-01 1.6884235821317102e+00 1.5062315230855112e+00 7.1771780695593715e-02 1.7574875961942080e+00 2.5692695462010704e+00 1.9520837129193072e-01 -1.7190458837261513e+00 -2.2788767493663094e+00 -3.6188138448422408e-01 -1.8124637748006180e+00 -2.6032073673444658e+00 -1.1052164502319056e-01 1.6074872170496624e+00 2.2607500666353557e+00 3.2740685985859169e-01 1.9355739642556302e+00 4.1419156908907073e+00 4.0997853330742018e-01 -1.7765328462937153e+00 -3.7708585658320799e+00 -1.6497891250856273e-01 -5.6768732637064034e-01 -3.6860637941843083e-01 -8.5420772722542271e-01 4.5264269448474598e-01 1.9022990473394663e-01 7.0873211308503625e-01 2.7273306539635050e-01 1.7420573583908314e-01 1.4308117389062207e+00 -6.4164414632256195e-01 -3.1632795740077629e-01 -1.5865889277994931e+00 -4.2676258478721546e-01 -2.7430154711877491e-01 -1.4327917195289563e+00 6.1375416312538311e-01 3.3097329797783120e-01 1.5538150418424268e+00 6.3268683750623178e-01 4.0997853330742018e-01 3.0281619087778653e+00 -3.3572270303229346e-01 -1.4615158792029923e-01 -2.8479324280576765e+00 3.5503076401822748e+00 1.6837534651832573e+00 4.4887347315839032e-01 -3.9365339236090775e+00 -1.3626164214626371e+00 7.1058096531068518e-03 -4.5090308699301564e+00 -1.7662068578350076e+00 3.5163861034532749e-02 4.6830053794714015e+00 1.4064133761363702e+00 3.0013803267896805e-01 4.5160971888879669e+00 1.6358344354699013e+00 8.9882584368097609e-03 -4.7760566808676046e+00 -1.4161569483438381e+00 -4.7514441234914462e-01 -6.1890353061614034e+00 -1.7765328462937149e+00 -3.3572270303229346e-01 6.6612465720265996e+00 1.5955117971456689e+00 1.0597680419631375e-02 1.3916669929853311e+00 1.4728344395328012e+00 1.8552649890765407e-01 -1.3477164902955443e+00 -1.3036601674616246e+00 4.0528115331117352e-03 -1.4817360039878167e+00 -2.2859409608034285e+00 1.8289238535302808e-02 1.4013579954232163e+00 2.0324651263659579e+00 1.2729521424635959e-01 1.6601165819470234e+00 2.2505451352365915e+00 4.5062413410368483e-03 -1.4058744003633403e+00 -2.0249358119449288e+00 -1.9990359385306455e-01 -1.8133264728545382e+00 -3.7708585658320799e+00 -1.4615158792029923e-01 1.5955117971456687e+00 3.6295508049067111e+00 6.3851772098991654e-03 1.6625514295208696e-01 6.5836141283330596e-02 6.8283235903102379e-01 1.4591305502008453e-02 7.2470097215130902e-03 -7.3056474336160937e-01 2.7711952011187535e-02 1.4269942211490722e-02 -1.4518079822658556e+00 3.4768505673721128e-01 1.4900499791490565e-01 1.4197283614732155e+00 -1.4567459410262796e-03 -6.4343761661035811e-04 1.4167244569883051e+00 -1.8719404466820930e-01 -7.7120918215966117e-02 -1.4341577588233001e+00 -3.7819034701289000e-01 -1.6497891250856275e-01 -2.8479324280576765e+00 1.0597680419631378e-02 6.3851772098991715e-03 2.9451777350158972e+00 3 4 5 63 64 65 78 79 80 18 19 20 6 7 8 66 67 68 81 82 83 21 22 23 7.5813251767757688e+00 7.9618194480881554e-01 1.6729351833081532e+00 -7.7506687873162141e+00 -4.7318736668450884e-01 -1.3991308308134824e+00 -5.6546925984843135e+00 -7.6479509540798207e-01 -1.0874566468904405e+00 5.5180195195043380e+00 4.1019525914166199e-01 1.5080652397612628e+00 5.5730428603900641e+00 7.2828853511778890e-01 1.2296256549738778e+00 -5.4594754405521648e+00 -2.4852340377364751e-01 -1.5226101505904039e+00 -4.3831962131983149e+00 -6.8763144590078307e-01 -1.4085631098172129e+00 4.5756454828808391e+00 2.3947157269865560e-01 1.0071346600682376e+00 7.9618194480881543e-01 3.4067338716047542e+00 3.0993673145733014e-01 -4.6894898032383719e-01 -3.1881035952219583e+00 -1.1352180998014201e-01 -7.7197547857937554e-01 -1.7680255531884488e+00 -2.0795662636631490e-01 3.9733357383196466e-01 1.6115294355857557e+00 1.5127542442516648e-01 7.2757871310223510e-01 1.7228240524293672e+00 2.2337506395937798e-01 -5.3700704589455506e-01 -1.6204877215609967e+00 -2.1057476608392398e-01 -6.8201212543133494e-01 -9.5319906320503600e-01 -2.6877541970158314e-01 5.3884939848608737e-01 7.8872857355656290e-01 1.1624140229008786e-01 1.6729351833081532e+00 3.0993673145733019e-01 3.9074799929619313e+00 -1.3958278739541119e+00 -1.1447631493987447e-01 -3.5655613645775319e+00 -1.3803952833991144e+00 -2.6006892108127583e-01 -1.9751487808926473e+00 1.5134106681219450e+00 1.5773014169925967e-01 2.1869714174880395e+00 1.2116845696583709e+00 2.1976953886223752e-01 1.9291367821295295e+00 -1.5256872129629169e+00 -9.8892267213551932e-02 -2.2074166089939173e+00 -1.4038780143564538e+00 -2.7009066427143841e-01 -1.3769049339217594e+00 1.3077579635841270e+00 5.6091755487313238e-02 1.1014434958063519e+00 -7.7506687873162141e+00 -4.6894898032383731e-01 -1.3958278739541121e+00 8.0573680110651544e+00 1.0281097407887865e-01 1.0809505113707818e+00 5.9044647101760743e+00 4.2537259239387881e-01 9.5035449005910944e-01 -5.7918146969447877e+00 -5.0219578063022470e-02 -1.4020266966958397e+00 -5.8614112444445130e+00 -5.6847271349458617e-01 -9.1563836618871175e-01 5.7124936540301299e+00 7.1259048703740474e-02 1.2445912081099455e+00 4.6060994791827383e+00 5.3994446909985072e-01 1.3079496581188510e+00 -4.8765311257485813e+00 -5.1745812394903321e-02 -8.7035293082001619e-01 -4.7318736668450878e-01 -3.1881035952219583e+00 -1.1447631493987444e-01 1.0281097407887867e-01 3.2094456855767297e+00 2.4554674835243626e-02 4.2980122421426997e-01 1.6244321592576521e+00 9.4686894550869330e-02 -5.2066187642831524e-02 -1.6203814223866551e+00 -1.7818811765556938e-02 -2.7451437489431840e-01 -1.6222816955813624e+00 -5.8220639829663370e-02 7.8864180361392755e-02 1.6034686279070431e+00 2.4372505170661800e-02 2.4738557082512586e-01 8.1536548752302496e-01 5.8688026449646574e-02 -5.9094020258008591e-02 -8.2194524707447347e-01 -1.1786334471326404e-02 -1.3991308308134824e+00 -1.1352180998014201e-01 -3.5655613645775319e+00 1.0809505113707818e+00 2.4554674835243626e-02 3.4480870075230712e+00 9.5252319062007884e-01 9.4279053983945565e-02 1.8269942608209082e+00 -1.1127396346971665e+00 -1.2981261038488621e-02 -1.9754084779093655e+00 -9.1230463222466940e-01 -1.2223210849370197e-01 -1.8003705797444480e+00 1.2534954254443162e+00 2.2249407550520500e-02 1.9468227379206515e+00 1.0139684652261349e+00 1.1794026878774079e-01 1.1288925745946232e+00 -8.7676249492599356e-01 -1.0288225645117959e-02 -1.0094561586279074e+00 -5.6546925984843153e+00 -7.7197547857937554e-01 -1.3803952833991142e+00 5.9044647101760734e+00 4.2980122421427003e-01 9.5252319062007895e-01 8.0251774404170284e+00 8.3901538055467995e-01 1.0609660171607802e+00 -7.8619804683890155e+00 -4.6476021025475239e-01 -1.3799625071249011e+00 -4.7480234499780503e+00 -7.2003253472805906e-01 -8.5415720308576659e-01 4.6104663987818038e+00 2.2899479575780640e-01 1.3023936291186073e+00 5.6284883615112467e+00 7.2803120774480734e-01 1.2066186825412464e+00 -5.9039003940347712e+00 -2.6907438470937711e-01 -9.0798652583092210e-01 -7.6479509540798196e-01 -1.7680255531884488e+00 -2.6006892108127577e-01 4.2537259239387870e-01 1.6244321592576521e+00 9.4279053983945552e-02 8.3901538055467995e-01 3.4542209178049608e+00 1.8701037687156413e-01 -4.5165701859719820e-01 -3.2838369868547903e+00 -1.6248968141269840e-01 -7.2637420580514911e-01 -9.5460886964893787e-01 -1.5888473978151701e-01 5.1737723137060121e-01 8.1399372309270601e-01 2.0202972145156300e-01 7.2940985193137331e-01 1.7807488841586534e+00 2.1983056909692955e-01 -5.6834873644020389e-01 -1.6669242746217952e+00 -1.2170637912850955e-01 -1.0874566468904407e+00 -2.0795662636631490e-01 -1.9751487808926473e+00 9.5035449005910944e-01 9.4686894550869330e-02 1.8269942608209082e+00 1.0609660171607800e+00 1.8701037687156413e-01 3.5433531292128766e+00 -1.4013683513025985e+00 -1.6857422913871839e-01 -3.6590550985034525e+00 -8.5640523218442921e-01 -1.5789543087550087e-01 -1.0077775704489438e+00 1.0132966511919992e+00 8.5338277333035131e-02 1.1296586537742930e+00 1.2334219049140829e+00 2.2387821073158995e-01 1.9867207270226039e+00 -9.1280883294850357e-01 -5.6487473106524529e-02 -1.8447453209856350e+00 5.5180195195043389e+00 3.9733357383196455e-01 1.5134106681219450e+00 -5.7918146969447886e+00 -5.2066187642831559e-02 -1.1127396346971667e+00 -7.8619804683890164e+00 -4.5165701859719809e-01 -1.4013683513025978e+00 7.8219937436111406e+00 9.7808273372186866e-02 1.6997752575261049e+00 4.5797638467298833e+00 5.1567031478935599e-01 1.0102536934432105e+00 -4.5051863187725703e+00 -4.3829414710641390e-02 -1.4423817078972547e+00 -5.4999490973962395e+00 -5.3616045912747534e-01 -1.5230719810859779e+00 5.7391534716572545e+00 7.2900918084639402e-02 1.2561220558917290e+00 4.1019525914166199e-01 1.6115294355857557e+00 1.5773014169925967e-01 -5.0219578063022498e-02 -1.6203814223866551e+00 -1.2981261038488616e-02 -4.6476021025475228e-01 -3.2838369868547903e+00 -1.6857422913871839e-01 9.7808273372186866e-02 3.3546314456557580e+00 3.5428814703922992e-02 2.3622962691385721e-01 7.9017826891261345e-01 8.7109809159779519e-02 -5.1863655424226135e-02 -8.2118758960781757e-01 -2.1200457191423074e-02 -2.5815961233371548e-01 -1.6660419188644562e+00 -1.0179492044564722e-01 8.0769896648010459e-02 1.6351087675595926e+00 2.4282102251314941e-02 1.5080652397612626e+00 1.5127542442516645e-01 2.1869714174880390e+00 -1.4020266966958395e+00 -1.7818811765556945e-02 -1.9754084779093655e+00 -1.3799625071249011e+00 -1.6248968141269843e-01 -3.6590550985034525e+00 1.6997752575261049e+00 3.5428814703922965e-02 3.9984823996140371e+00 1.2901166067077863e+00 1.9893783672754775e-01 1.1010952236603673e+00 -1.4260888943163346e+00 -1.7837833253375821e-02 -1.3790368053353208e+00 -1.5094392713822788e+00 -2.0889357927286747e-01 -2.2455259755695511e+00 1.2195602655241993e+00 2.1397829847861653e-02 1.9724773165552425e+00 5.5730428603900641e+00 7.2757871310223532e-01 1.2116845696583709e+00 -5.8614112444445139e+00 -2.7451437489431840e-01 -9.1230463222466940e-01 -4.7480234499780503e+00 -7.2637420580514911e-01 -8.5640523218442910e-01 4.5797638467298833e+00 2.3622962691385718e-01 1.2901166067077865e+00 7.9180471240071872e+00 8.1933421300810638e-01 1.0397399695890106e+00 -7.6894815848043816e+00 -4.5606220398531944e-01 -1.3530837967662559e+00 -5.5664182775451243e+00 -7.5875243918889168e-01 -1.3444145971850603e+00 5.7944807256449344e+00 4.3256067084948036e-01 9.2466711240523836e-01 7.2828853511778890e-01 1.7228240524293672e+00 2.1976953886223752e-01 -5.6847271349458617e-01 -1.6222816955813626e+00 -1.2223210849370197e-01 -7.2003253472805906e-01 -9.5460886964893787e-01 -1.5789543087550087e-01 5.1567031478935599e-01 7.9017826891261356e-01 1.9893783672754772e-01 8.1933421300810672e-01 3.4377810039259713e+00 1.8257638291430112e-01 -4.2456890902957328e-01 -3.2181500004271979e+00 -1.5513522577427763e-01 -7.4078020741110562e-01 -1.7778650208552824e+00 -2.5172785037613982e-01 3.9056130174807269e-01 1.6221222612448294e+00 8.5706857015532545e-02 1.2296256549738775e+00 2.2337506395937803e-01 1.9291367821295295e+00 -9.1563836618871208e-01 -5.8220639829663370e-02 -1.8003705797444480e+00 -8.5415720308576670e-01 -1.5888473978151704e-01 -1.0077775704489438e+00 1.0102536934432105e+00 8.7109809159779505e-02 1.1010952236603671e+00 1.0397399695890106e+00 1.8257638291430112e-01 3.5262733577375980e+00 -1.3760633719477797e+00 -1.6694211205168491e-01 -3.5896833208183567e+00 -1.0597327060470976e+00 -2.0440293236474916e-01 -1.9793770883611210e+00 9.2597232926325690e-01 9.5389167994155949e-02 1.8207031958453728e+00 -5.4594754405521648e+00 -5.3700704589455517e-01 -1.5256872129629169e+00 5.7124936540301308e+00 7.8864180361392783e-02 1.2534954254443162e+00 4.6104663987818038e+00 5.1737723137060132e-01 1.0132966511919994e+00 -4.5051863187725703e+00 -5.1863655424226149e-02 -1.4260888943163348e+00 -7.6894815848043816e+00 -4.2456890902957323e-01 -1.3760633719477795e+00 7.5880032017076298e+00 8.2782463767723871e-02 1.6676126573889329e+00 5.4457153196950161e+00 3.7393871894480019e-01 1.4742305194719141e+00 -5.7025352300854628e+00 -3.9522984096164032e-02 -1.0807957742701237e+00 -2.4852340377364751e-01 -1.6204877215609967e+00 -9.8892267213551946e-02 7.1259048703740474e-02 1.6034686279070431e+00 2.2249407550520503e-02 2.2899479575780640e-01 8.1399372309270601e-01 8.5338277333035131e-02 -4.3829414710641397e-02 -8.2118758960781746e-01 -1.7837833253375821e-02 -4.5606220398531944e-01 -3.2181500004271983e+00 -1.6694211205168491e-01 8.2782463767723857e-02 3.2436298700121502e+00 3.0271515468225284e-02 4.0506304567832174e-01 1.6336163768316365e+00 1.5532719972144390e-01 -3.9684331437984305e-02 -1.6348832862475229e+00 -9.5141875546120511e-03 -1.5226101505904037e+00 -2.1057476608392398e-01 -2.2074166089939173e+00 1.2445912081099457e+00 2.4372505170661807e-02 1.9468227379206515e+00 1.3023936291186076e+00 2.0202972145156300e-01 1.1296586537742930e+00 -1.4423817078972547e+00 -2.1200457191423081e-02 -1.3790368053353208e+00 -1.3530837967662563e+00 -1.5513522577427760e-01 -3.5896833208183563e+00 1.6676126573889329e+00 3.0271515468225284e-02 3.8816486039503100e+00 1.4811182835345174e+00 1.4482727641306592e-01 2.2001781799169025e+00 -1.3776401228980883e+00 -1.4590569453891519e-02 -1.9821714404145594e+00 -4.3831962131983149e+00 -6.8201212543133494e-01 -1.4038780143564538e+00 4.6060994791827383e+00 2.4738557082512586e-01 1.0139684652261347e+00 5.6284883615112475e+00 7.2940985193137342e-01 1.2334219049140827e+00 -5.4999490973962413e+00 -2.5815961233371548e-01 -1.5094392713822788e+00 -5.5664182775451243e+00 -7.4078020741110562e-01 -1.0597327060470978e+00 5.4457153196950161e+00 4.0506304567832174e-01 1.4811182835345174e+00 7.5472561664449485e+00 7.7768982572521339e-01 1.6322111811600610e+00 -7.7779957386942682e+00 -4.7859634898387904e-01 -1.3876698430489580e+00 -6.8763144590078318e-01 -9.5319906320503600e-01 -2.7009066427143835e-01 5.3994446909985072e-01 8.1536548752302473e-01 1.1794026878774076e-01 7.2803120774480723e-01 1.7807488841586534e+00 2.2387821073158998e-01 -5.3616045912747534e-01 -1.6660419188644562e+00 -2.0889357927286747e-01 -7.5875243918889168e-01 -1.7778650208552824e+00 -2.0440293236474918e-01 3.7393871894480030e-01 1.6336163768316365e+00 1.4482727641306589e-01 7.7768982572521361e-01 3.4693074355675271e+00 3.0247382463300815e-01 -4.3705987729752133e-01 -3.3019321811560678e+00 -1.0573240465634832e-01 -1.4085631098172129e+00 -2.6877541970158314e-01 -1.3769049339217594e+00 1.3079496581188510e+00 5.8688026449646567e-02 1.1288925745946232e+00 1.2066186825412464e+00 2.1983056909692955e-01 1.9867207270226037e+00 -1.5230719810859781e+00 -1.0179492044564722e-01 -2.2455259755695511e+00 -1.3444145971850605e+00 -2.5172785037613987e-01 -1.9793770883611210e+00 1.4742305194719141e+00 1.5532719972144388e-01 2.2001781799169025e+00 1.6322111811600606e+00 3.0247382463300809e-01 3.9567175946700743e+00 -1.3449603532038208e+00 -1.1402142937765808e-01 -3.6707010783517697e+00 4.5756454828808391e+00 5.3884939848608737e-01 1.3077579635841270e+00 -4.8765311257485813e+00 -5.9094020258008563e-02 -8.7676249492599334e-01 -5.9039003940347712e+00 -5.6834873644020401e-01 -9.1280883294850357e-01 5.7391534716572536e+00 8.0769896648010472e-02 1.2195602655241993e+00 5.7944807256449344e+00 3.9056130174807274e-01 9.2597232926325701e-01 -5.7025352300854628e+00 -3.9684331437984291e-02 -1.3776401228980881e+00 -7.7779957386942691e+00 -4.3705987729752133e-01 -1.3449603532038203e+00 8.1516828083800590e+00 9.4006368551548231e-02 1.0588812456048144e+00 2.3947157269865563e-01 7.8872857355656301e-01 5.6091755487313225e-02 -5.1745812394903314e-02 -8.2194524707447325e-01 -1.0288225645117957e-02 -2.6907438470937711e-01 -1.6669242746217954e+00 -5.6487473106524529e-02 7.2900918084639402e-02 1.6351087675595926e+00 2.1397829847861660e-02 4.3256067084948036e-01 1.6221222612448294e+00 9.5389167994155977e-02 -3.9522984096164032e-02 -1.6348832862475229e+00 -1.4590569453891505e-02 -4.7859634898387915e-01 -3.3019321811560678e+00 -1.1402142937765808e-01 9.4006368551548217e-02 3.3797253867388752e+00 2.2508944253861123e-02 1.0071346600682376e+00 1.1624140229008786e-01 1.1014434958063517e+00 -8.7035293082001619e-01 -1.1786334471326402e-02 -1.0094561586279074e+00 -9.0798652583092232e-01 -1.2170637912850957e-01 -1.8447453209856350e+00 1.2561220558917290e+00 2.4282102251314934e-02 1.9724773165552425e+00 9.2466711240523836e-01 8.5706857015532545e-02 1.8207031958453728e+00 -1.0807957742701237e+00 -9.5141875546120545e-03 -1.9821714404145594e+00 -1.3876698430489578e+00 -1.0573240465634832e-01 -3.6707010783517702e+00 1.0588812456048147e+00 2.2508944253861119e-02 3.6124499901729030e+00 63 64 65 123 124 125 138 139 140 78 79 80 66 67 68 126 127 128 141 142 143 81 82 83 7.2618559638982756e+00 7.7704037529896308e-01 1.6032944571766994e+00 -7.4343467167127528e+00 -4.5600238570271745e-01 -1.3370406404296677e+00 -5.3347583026951755e+00 -7.4330782941298557e-01 -1.0128586460090381e+00 5.1942833609438255e+00 3.8850151361776919e-01 1.4433014032225175e+00 5.2912753882609396e+00 7.1244529908644094e-01 1.1690437914114922e+00 -5.1767141973267750e+00 -2.2525450230054422e-01 -1.4562670465552339e+00 -4.1085876196170332e+00 -6.6929667803950821e-01 -1.3468359311104470e+00 4.3069921232486967e+00 2.1587420745258246e-01 9.3736261229367768e-01 7.7704037529896308e-01 3.3306309621905275e+00 3.0741080518126185e-01 -4.4217008156963661e-01 -3.1013214975049750e+00 -1.0383745270584230e-01 -7.5667991393046496e-01 -1.6861308683518377e+00 -2.0166134655356743e-01 3.7156862282989672e-01 1.5211853222348894e+00 1.4423550009613814e-01 7.0941354984620775e-01 1.6689620639350491e+00 2.1937883443897407e-01 -5.1491220510221469e-01 -1.5601989788395481e+00 -2.0529686700315200e-01 -6.6407320507478174e-01 -9.0763698910373392e-01 -2.6719906205475441e-01 5.1981285770203034e-01 7.3450998543962798e-01 1.0696958860094206e-01 1.6032944571766992e+00 3.0741080518126185e-01 3.8123802636587163e+00 -1.3187994162589332e+00 -1.0619515717129317e-01 -3.4603998938521552e+00 -1.3093036997519978e+00 -2.5465600641631292e-01 -1.8667927815100986e+00 1.4434686656312308e+00 1.5192330010948568e-01 2.0858945948203758e+00 1.1375184221084818e+00 2.1391284885988660e-01 1.8507894585995921e+00 -1.4616205052595796e+00 -9.1102589197166739e-02 -2.1357184011260588e+00 -1.3372661453875765e+00 -2.6740243612234438e-01 -1.3147084824905737e+00 1.2427082217416745e+00 4.6109234756483070e-02 1.0285552419002026e+00 -7.4343467167127528e+00 -4.4217008156963661e-01 -1.3187994162589334e+00 7.7577346486377987e+00 7.3375300064389679e-02 1.0074000537788579e+00 5.5925428789675848e+00 4.0182299253008036e-01 8.7269732114971976e-01 -5.4782455201003879e+00 -2.4322282750011262e-02 -1.3377556231456975e+00 -5.5902878786413739e+00 -5.4967303508197674e-01 -8.4611809921540271e-01 5.4370068861847036e+00 4.3015717910526628e-02 1.1727517777800422e+00 4.3352088625443983e+00 5.2311138471858898e-01 1.2478360239077546e+00 -4.6196131608799682e+00 -2.5159995821960990e-02 -7.9801203799634102e-01 -4.5600238570271751e-01 -3.1013214975049750e+00 -1.0619515717129320e-01 7.3375300064389748e-02 3.1342143272125726e+00 1.7898575701446900e-02 4.0977098783752169e-01 1.5363421057136641e+00 8.7840938973726607e-02 -2.0975057485101090e-02 -1.5378201606398847e+00 -7.6067228801501470e-03 -2.5258378362613348e-01 -1.5647790704902840e+00 -5.2295266303963750e-02 5.1920855743039535e-02 1.5474870040519908e+00 1.6227839630642685e-02 2.2542214622784629e-01 7.6175816173101041e-01 4.9561808444033233e-02 -3.0928063058845334e-02 -7.7588087007409534e-01 -5.4320163944423412e-03 -1.3370406404296682e+00 -1.0383745270584230e-01 -3.4603998938521552e+00 1.0074000537788581e+00 1.7898575701446900e-02 3.3522784266256265e+00 8.7963385385418691e-01 8.7119168190827517e-02 1.7221445569254856e+00 -1.0437988136375695e+00 -6.2312576169508823e-03 -1.8719768070212659e+00 -8.4075051275496993e-01 -1.1467999212192226e-01 -1.7268885778866812e+00 1.1944584887629635e+00 1.4044624389464010e-02 1.8692413181203094e+00 9.4847862837272379e-01 1.1000088059505334e-01 1.0592062968531937e+00 -8.0838105794652415e-01 -4.3145464320763181e-03 -9.4360531976451345e-01 -5.3347583026951755e+00 -7.5667991393046496e-01 -1.3093036997519978e+00 5.5925428789675848e+00 4.0977098783752175e-01 8.7963385385418669e-01 7.4946832851567411e+00 8.1630745966252738e-01 9.6797294514478993e-01 -7.3234265284074036e+00 -4.3533947365890679e-01 -1.3006785684548554e+00 -4.4834821949656449e+00 -7.0652447082894632e-01 -7.8576842810643432e-01 4.3423730338176201e+00 2.0414053140802618e-01 1.2365832585404644e+00 5.2432851423165943e+00 7.0942378049362076e-01 1.1395559939930822e+00 -5.5312173141903136e+00 -2.4109890098337805e-01 -8.2799535521923540e-01 -7.4330782941298557e-01 -1.6861308683518377e+00 -2.5465600641631292e-01 4.0182299253008036e-01 1.5363421057136641e+00 8.7119168190827517e-02 8.1630745966252738e-01 3.2069141661402711e+00 1.7640415730227857e-01 -4.2385952419755257e-01 -3.0245207465677630e+00 -1.5752105587866161e-01 -7.0843187234570104e-01 -9.1012341879554914e-01 -1.5105058671154087e-01 4.9706140957180905e-01 7.6003703518698218e-01 1.9868666343161676e-01 7.0857300961033065e-01 1.6464663683351253e+00 2.1472674443361309e-01 -5.4816564541850810e-01 -1.5289846416608923e+00 -1.1370908435182044e-01 -1.0128586460090381e+00 -2.0166134655356746e-01 -1.8667927815100986e+00 8.7269732114971954e-01 8.7840938973726607e-02 1.7221445569254856e+00 9.6797294514479015e-01 1.7640415730227857e-01 3.2678837111584698e+00 -1.3105684207380077e+00 -1.6198681265875067e-01 -3.3767643131596916e+00 -7.8217553436468823e-01 -1.4996635268186737e-01 -9.4096217266448923e-01 9.4326235476968390e-01 8.0394217433744919e-02 1.0569870670084489e+00 1.1533466151200591e+00 2.1732380420085548e-01 1.8257895350795161e+00 -8.3167663507251810e-01 -4.8348606016420027e-02 -1.6882856028376414e+00 5.1942833609438264e+00 3.7156862282989672e-01 1.4434686656312308e+00 -5.4782455201003870e+00 -2.0975057485101062e-02 -1.0437988136375698e+00 -7.3234265284074036e+00 -4.2385952419755252e-01 -1.3105684207380079e+00 7.2872156255838574e+00 6.5318919813035420e-02 1.6204425403282685e+00 4.3093853714871919e+00 4.9633308520163766e-01 9.4428785353818823e-01 -4.2372529799154703e+00 -1.5294216745488060e-02 -1.3775198671232065e+00 -5.1142485266794795e+00 -5.1612261844939222e-01 -1.4540806620708002e+00 5.3622891970878648e+00 4.3030789032964194e-02 1.1777687040718963e+00 3.8850151361776919e-01 1.5211853222348894e+00 1.5192330010948565e-01 -2.4322282750011234e-02 -1.5378201606398845e+00 -6.2312576169508858e-03 -4.3533947365890674e-01 -3.0245207465677630e+00 -1.6198681265875073e-01 6.5318919813035420e-02 3.1058537352314359e+00 2.3448948323376566e-02 2.1215377837461846e-01 7.3621981590401553e-01 8.2602766988916790e-02 -2.7350556846408011e-02 -7.7419060854523025e-01 -1.1843151478928759e-02 -2.3125969265517368e-01 -1.5269759009012540e+00 -9.3292282392834103e-02 5.2297794105076664e-02 1.5002485432837924e+00 1.5378488725685422e-02 1.4433014032225178e+00 1.4423550009613817e-01 2.0858945948203758e+00 -1.3377556231456975e+00 -7.6067228801501401e-03 -1.8719768070212659e+00 -1.3006785684548554e+00 -1.5752105587866166e-01 -3.3767643131596912e+00 1.6204425403282685e+00 2.3448948323376559e-02 3.7324106059996809e+00 1.2287511011564816e+00 1.9658716609570975e-01 1.0310017118738077e+00 -1.3670036910629828e+00 -7.0045574508714407e-03 -1.3180361241069904e+00 -1.4406011791541533e+00 -2.0482620982317717e-01 -2.0958900446581259e+00 1.1535440171104210e+00 1.2686931517635907e-02 1.8133603762522090e+00 5.2912753882609396e+00 7.0941354984620775e-01 1.1375184221084820e+00 -5.5902878786413730e+00 -2.5258378362613348e-01 -8.4075051275496993e-01 -4.4834821949656440e+00 -7.0843187234570104e-01 -7.8217553436468834e-01 4.3093853714871928e+00 2.1215377837461852e-01 1.2287511011564816e+00 7.5401837441542838e+00 8.0272790652059056e-01 9.6209096294789787e-01 -7.3036266577886702e+00 -4.3238553273649366e-01 -1.2738593114469652e+00 -5.2212971741355174e+00 -7.3942549692134607e-01 -1.2785747446432112e+00 5.4578494016287875e+00 4.0853145088825737e-01 8.4699961699697313e-01 7.1244529908644094e-01 1.6689620639350491e+00 2.1391284885988660e-01 -5.4967303508197685e-01 -1.5647790704902838e+00 -1.1467999212192229e-01 -7.0652447082894643e-01 -9.1012341879554914e-01 -1.4996635268186739e-01 4.9633308520163766e-01 7.3621981590401553e-01 1.9658716609570978e-01 8.0272790652059056e-01 3.3063795951051183e+00 1.7447728672716473e-01 -3.9955729184683858e-01 -3.0725285933379212e+00 -1.4946421693259709e-01 -7.2525009719986733e-01 -1.6740572055697975e+00 -2.4911154973099386e-01 3.6949860414895974e-01 1.5099268132493684e+00 7.8244809784619535e-02 1.1690437914114920e+00 2.1937883443897405e-01 1.8507894585995921e+00 -8.4611809921540293e-01 -5.2295266303963750e-02 -1.7268885778866812e+00 -7.8576842810643432e-01 -1.5105058671154087e-01 -9.4096217266448923e-01 9.4428785353818823e-01 8.2602766988916790e-02 1.0310017118738077e+00 9.6209096294789787e-01 1.7447728672716470e-01 3.3702596553245212e+00 -1.3083620735159749e+00 -1.6284087669944014e-01 -3.4249481876342154e+00 -9.8859504568650203e-01 -1.9775291702643016e-01 -1.8515150920601018e+00 8.5342103862673624e-01 8.7480758586319360e-02 1.6922632044475669e+00 -5.1767141973267758e+00 -5.1491220510221469e-01 -1.4616205052595796e+00 5.4370068861847036e+00 5.1920855743039569e-02 1.1944584887629635e+00 4.3423730338176192e+00 4.9706140957180900e-01 9.4326235476968390e-01 -4.2372529799154703e+00 -2.7350556846408011e-02 -1.3670036910629826e+00 -7.3036266577886702e+00 -3.9955729184683852e-01 -1.3083620735159749e+00 7.2062330377585209e+00 5.2514033456150390e-02 1.5966301768156281e+00 5.0995320059785172e+00 3.5345910247644735e-01 1.4095108105192502e+00 -5.3675511287084454e+00 -1.3135347451984974e-02 -1.0068755610289877e+00 -2.2525450230054422e-01 -1.5601989788395481e+00 -9.1102589197166739e-02 4.3015717910526635e-02 1.5474870040519908e+00 1.4044624389464010e-02 2.0414053140802615e-01 7.6003703518698218e-01 8.0394217433744905e-02 -1.5294216745488070e-02 -7.7419060854523025e-01 -7.0045574508714381e-03 -4.3238553273649361e-01 -3.0725285933379212e+00 -1.6284087669944014e-01 5.2514033456150397e-02 3.1077577960979421e+00 1.8767072208750912e-02 3.8089828553553567e-01 1.5213939310476097e+00 1.4848308665277227e-01 -7.6343165277129154e-03 -1.5297575856618246e+00 -7.4097733725379572e-04 -1.4562670465552339e+00 -2.0529686700315203e-01 -2.1357184011260593e+00 1.1727517777800422e+00 1.6227839630642685e-02 1.8692413181203087e+00 1.2365832585404646e+00 1.9868666343161676e-01 1.0569870670084489e+00 -1.3775198671232065e+00 -1.1843151478928761e-02 -1.3180361241069902e+00 -1.2738593114469654e+00 -1.4946421693259712e-01 -3.4249481876342158e+00 1.5966301768156281e+00 1.8767072208750912e-02 3.7284050090019254e+00 1.4108105970621809e+00 1.3868397457450685e-01 2.0771927480494039e+00 -1.3091295850729103e+00 -5.7613144308392913e-03 -1.8531234293128220e+00 -4.1085876196170332e+00 -6.6407320507478174e-01 -1.3372661453875765e+00 4.3352088625443974e+00 2.2542214622784629e-01 9.4847862837272401e-01 5.2432851423165943e+00 7.0857300961033054e-01 1.1533466151200591e+00 -5.1142485266794795e+00 -2.3125969265517365e-01 -1.4406011791541533e+00 -5.2212971741355174e+00 -7.2525009719986733e-01 -9.8859504568650203e-01 5.0995320059785172e+00 3.8089828553553567e-01 1.4108105970621811e+00 6.9691772522928437e+00 7.5325953348679353e-01 1.5492274693968358e+00 -7.2030699427003260e+00 -4.4756997993068337e-01 -1.2954009397235677e+00 -6.6929667803950821e-01 -9.0763698910373392e-01 -2.6740243612234443e-01 5.2311138471858898e-01 7.6175816173101041e-01 1.1000088059505336e-01 7.0942378049362076e-01 1.6464663683351253e+00 2.1732380420085548e-01 -5.1612261844939222e-01 -1.5269759009012540e+00 -2.0482620982317717e-01 -7.3942549692134607e-01 -1.6740572055697975e+00 -1.9775291702643016e-01 3.5345910247644741e-01 1.5213939310476097e+00 1.3868397457450685e-01 7.5325953348679342e-01 3.1893299852155543e+00 2.9918186997696761e-01 -4.1440900776520384e-01 -3.0102783507545139e+00 -9.5208966375431581e-02 -1.3468359311104470e+00 -2.6719906205475441e-01 -1.3147084824905739e+00 1.2478360239077546e+00 4.9561808444033240e-02 1.0592062968531937e+00 1.1395559939930819e+00 2.1472674443361314e-01 1.8257895350795161e+00 -1.4540806620708000e+00 -9.3292282392834103e-02 -2.0958900446581259e+00 -1.2785747446432112e+00 -2.4911154973099386e-01 -1.8515150920601018e+00 1.4095108105192500e+00 1.4848308665277227e-01 2.0771927480494039e+00 1.5492274693968362e+00 2.9918186997696766e-01 3.6559927809408341e+00 -1.2666389599924643e+00 -1.0235061532880385e-01 -3.3560677417141456e+00 4.3069921232486967e+00 5.1981285770203023e-01 1.2427082217416745e+00 -4.6196131608799682e+00 -3.0928063058845337e-02 -8.0838105794652415e-01 -5.5312173141903136e+00 -5.4816564541850810e-01 -8.3167663507251810e-01 5.3622891970878648e+00 5.2297794105076678e-02 1.1535440171104205e+00 5.4578494016287884e+00 3.6949860414895985e-01 8.5342103862673613e-01 -5.3675511287084454e+00 -7.6343165277129275e-03 -1.3091295850729103e+00 -7.2030699427003260e+00 -4.1440900776520379e-01 -1.2666389599924643e+00 7.5943208245137024e+00 5.9527776814203334e-02 9.6615296060558520e-01 2.1587420745258243e-01 7.3450998543962798e-01 4.6109234756483056e-02 -2.5159995821960983e-02 -7.7588087007409534e-01 -4.3145464320763233e-03 -2.4109890098337805e-01 -1.5289846416608921e+00 -4.8348606016420020e-02 4.3030789032964194e-02 1.5002485432837922e+00 1.2686931517635901e-02 4.0853145088825737e-01 1.5099268132493684e+00 8.7480758586319374e-02 -1.3135347451985002e-02 -1.5297575856618246e+00 -5.7613144308392740e-03 -4.4756997993068326e-01 -3.0102783507545148e+00 -1.0235061532880385e-01 5.9527776814203320e-02 3.1002161061785376e+00 1.4498157347701159e-02 9.3736261229367757e-01 1.0696958860094202e-01 1.0285552419002026e+00 -7.9801203799634113e-01 -5.4320163944423473e-03 -9.4360531976451334e-01 -8.2799535521923540e-01 -1.1370908435182046e-01 -1.6882856028376412e+00 1.1777687040718963e+00 1.5378488725685415e-02 1.8133603762522088e+00 8.4699961699697313e-01 7.8244809784619521e-02 1.6922632044475669e+00 -1.0068755610289879e+00 -7.4097733725380266e-04 -1.8531234293128220e+00 -1.2954009397235673e+00 -9.5208966375431595e-02 -3.3560677417141456e+00 9.6615296060558531e-01 1.4498157347701147e-02 3.3069032710291442e+00 18 19 20 78 79 80 93 94 95 33 34 35 21 22 23 81 82 83 96 97 98 36 37 38 7.2469677661292327e+00 1.5708672689008349e+00 1.5708672689008356e+00 -7.5307080851741084e+00 -1.3380455585465065e+00 -1.3380455585465096e+00 -5.2503916950771963e+00 -1.4492282296570598e+00 -9.8859578459786090e-01 5.2441294126281512e+00 1.1491066140193307e+00 1.4252266515187180e+00 5.2441294126281619e+00 1.4252266515187173e+00 1.1491066140193322e+00 -5.2503916950772060e+00 -9.8859578459786179e-01 -1.4492282296570598e+00 -4.0177497448988291e+00 -1.3049343658140276e+00 -1.3049343658140278e+00 4.3140146288417931e+00 9.3560340417657195e-01 9.3560340417657117e-01 1.5708672689008352e+00 3.9420448066443678e+00 6.2938322292124038e-01 -1.3369405067820528e+00 -3.6076465948135326e+00 -3.8248848176380146e-01 -1.4702186945881386e+00 -2.2156819073604619e+00 -4.0048407596282165e-01 1.1355684553774683e+00 1.9359336186395382e+00 4.4166966536114310e-01 1.4306676991065235e+00 2.1729597883370255e+00 4.4960869047060803e-01 -1.2763128658363145e+00 -1.9562041305862286e+00 -5.0761861548662957e-01 -1.3019696369211013e+00 -1.3550309961905878e+00 -5.3078947035888235e-01 1.2483382807427794e+00 1.0836254153298790e+00 3.0071906481914312e-01 1.5708672689008356e+00 6.2938322292124038e-01 3.9420448066443687e+00 -1.3369405067820528e+00 -3.8248848176380040e-01 -3.6076465948135339e+00 -1.2763128658363152e+00 -5.0761861548663023e-01 -1.9562041305862208e+00 1.4306676991065237e+00 4.4960869047060792e-01 2.1729597883370184e+00 1.1355684553774690e+00 4.4166966536114294e-01 1.9359336186395457e+00 -1.4702186945881395e+00 -4.0048407596282198e-01 -2.2156819073604690e+00 -1.3019696369211018e+00 -5.3078947035888246e-01 -1.3550309961905880e+00 1.2483382807427801e+00 3.0071906481914368e-01 1.0836254153298790e+00 -7.5307080851741084e+00 -1.3369405067820526e+00 -1.3369405067820526e+00 7.9715527953409531e+00 1.0435287431994789e+00 1.0435287431994822e+00 5.6182789151276342e+00 1.2112974198364450e+00 8.7537855941128717e-01 -5.6407023360225201e+00 -8.7038831057588328e-01 -1.3481389687875056e+00 -5.6407023360225308e+00 -1.3481389687875045e+00 -8.7038831057588328e-01 5.6182789151276440e+00 8.7537855941128762e-01 1.2112974198364435e+00 4.3382507817605225e+00 1.2443407164673841e+00 1.2443407164673843e+00 -4.7342486501375891e+00 -8.1907765276915512e-01 -8.1907765276915390e-01 -1.3380455585465061e+00 -3.6076465948135326e+00 -3.8248848176380040e-01 1.0435287431994791e+00 3.4953667276487659e+00 2.3321772778276417e-01 1.2178181323559629e+00 1.9592260037230358e+00 2.6620388667610989e-01 -8.5912795021420041e-01 -1.8136109676316856e+00 -2.8783548765138278e-01 -1.0686895016208446e+00 -1.9677709884176757e+00 -2.3092811262743590e-01 8.8998231608460043e-01 1.8199612068817397e+00 2.6951824239089389e-01 9.5286114466278782e-01 1.1148728959517069e+00 3.0699586276390034e-01 -8.3832732592127834e-01 -1.0003982833423544e+00 -1.7468363757104882e-01 -1.3380455585465096e+00 -3.8248848176380168e-01 -3.6076465948135339e+00 1.0435287431994822e+00 2.3321772778276417e-01 3.4953667276487677e+00 8.8998231608460321e-01 2.6951824239089545e-01 1.8199612068817321e+00 -1.0686895016208471e+00 -2.3092811262743657e-01 -1.9677709884176693e+00 -8.5912795021420485e-01 -2.8783548765138389e-01 -1.8136109676316947e+00 1.2178181323559674e+00 2.6620388667611095e-01 1.9592260037230453e+00 9.5286114466279070e-01 3.0699586276390139e-01 1.1148728959517085e+00 -8.3832732592128190e-01 -1.7468363757104985e-01 -1.0003982833423550e+00 -5.2503916950771963e+00 -1.4702186945881386e+00 -1.2763128658363150e+00 5.6182789151276333e+00 1.2178181323559629e+00 8.8998231608460310e-01 7.4967855279984281e+00 1.6275510726471607e+00 9.4707885121886792e-01 -7.4684567185682820e+00 -1.3064345080453139e+00 -1.2705671370959359e+00 -4.3665162975471565e+00 -1.3767203693070482e+00 -7.8134598871262173e-01 4.3551914079109615e+00 9.4310567505696485e-01 1.2188874050023280e+00 5.1806564799858359e+00 1.3939879173871248e+00 1.0937926362669952e+00 -5.5655476198302214e+00 -1.0290892255067123e+00 -8.2151521692792018e-01 -1.4492282296570598e+00 -2.2156819073604619e+00 -5.0761861548663023e-01 1.2112974198364450e+00 1.9592260037230358e+00 2.6951824239089539e-01 1.6275510726471611e+00 3.9048765509784888e+00 3.6392828433137303e-01 -1.2890966208399233e+00 -3.6116200993107794e+00 -4.1248736084080156e-01 -1.3928346563627676e+00 -1.3640026225620336e+00 -3.0794796660928081e-01 1.2188874050023291e+00 1.1118291998746943e+00 4.4300179482653568e-01 1.4033200919612094e+00 2.1823815965362838e+00 4.3021277305536515e-01 -1.3298964825873929e+00 -1.9670087218792283e+00 -2.7860715166745609e-01 -9.8859578459786090e-01 -4.0048407596282165e-01 -1.9562041305862208e+00 8.7537855941128717e-01 2.6620388667610989e-01 1.8199612068817321e+00 9.4707885121886792e-01 3.6392828433137303e-01 3.4898402729245399e+00 -1.2941808664497949e+00 -4.2495370841167956e-01 -3.6022224749833636e+00 -7.7150754380537245e-01 -3.0055456311196455e-01 -9.9291456857653881e-01 9.4310567505696474e-01 2.7393315656824102e-01 1.1118291998746943e+00 1.1233232006177207e+00 4.3812590912514521e-01 1.9421766193341823e+00 -8.3460209145181197e-01 -2.1619888921440350e-01 -1.8124661248690255e+00 5.2441294126281512e+00 1.1355684553774681e+00 1.4306676991065237e+00 -5.6407023360225210e+00 -8.5912795021420041e-01 -1.0686895016208471e+00 -7.4684567185682837e+00 -1.2890966208399233e+00 -1.2941808664497949e+00 7.5570607090909370e+00 9.6627084344909897e-01 1.6167516036092644e+00 4.3228597961769539e+00 1.2062707517058635e+00 9.5142182617135274e-01 -4.3665162975471556e+00 -7.7150754380537201e-01 -1.3928346563627665e+00 -5.1704892320953313e+00 -1.2428199276199878e+00 -1.4324101490871137e+00 5.5221146663372451e+00 8.5444199194705273e-01 1.1892740446333798e+00 1.1491066140193307e+00 1.9359336186395382e+00 4.4960869047060792e-01 -8.7038831057588351e-01 -1.8136109676316856e+00 -2.3092811262743657e-01 -1.3064345080453139e+00 -3.6116200993107790e+00 -4.2495370841167956e-01 9.6627084344909919e-01 3.5445669964675210e+00 3.6737051198157467e-01 9.5142182617135285e-01 1.0878919489982788e+00 2.7847795525582941e-01 -7.8134598871262184e-01 -9.9291456857653893e-01 -3.0794796660928075e-01 -9.7575778206978137e-01 -1.9592518856484507e+00 -3.9371605847723190e-01 8.6712730576381780e-01 1.8090049570621174e+00 2.6208868841761651e-01 1.4252266515187180e+00 4.4166966536114316e-01 2.1729597883370184e+00 -1.3481389687875056e+00 -2.8783548765138278e-01 -1.9677709884176695e+00 -1.2705671370959362e+00 -4.1248736084080156e-01 -3.6022224749833631e+00 1.6167516036092644e+00 3.6737051198157467e-01 3.9414093078387298e+00 1.2062707517058651e+00 4.3313585560571044e-01 1.0878919489982790e+00 -1.3767203693070496e+00 -3.0055456311196471e-01 -1.3640026225620336e+00 -1.4034953997653539e+00 -4.9090592953691470e-01 -2.2029814377469954e+00 1.1506728681219964e+00 2.4960730819263549e-01 1.9347164785360338e+00 5.2441294126281619e+00 1.4306676991065237e+00 1.1355684553774690e+00 -5.6407023360225299e+00 -1.0686895016208446e+00 -8.5912795021420485e-01 -4.3665162975471565e+00 -1.3928346563627676e+00 -7.7150754380537245e-01 4.3228597961769539e+00 9.5142182617135285e-01 1.2062707517058651e+00 7.5570607090909769e+00 1.6167516036092657e+00 9.6627084344910152e-01 -7.4684567185683228e+00 -1.2941808664497980e+00 -1.2890966208399242e+00 -5.1704892320953402e+00 -1.4324101490871135e+00 -1.2428199276199885e+00 5.5221146663372549e+00 1.1892740446333818e+00 8.5444199194705273e-01 1.4252266515187173e+00 2.1729597883370255e+00 4.4166966536114299e-01 -1.3481389687875045e+00 -1.9677709884176762e+00 -2.8783548765138389e-01 -1.3767203693070482e+00 -1.3640026225620336e+00 -3.0055456311196455e-01 1.2062707517058635e+00 1.0878919489982788e+00 4.3313585560571044e-01 1.6167516036092657e+00 3.9414093078387595e+00 3.6737051198157500e-01 -1.2705671370959357e+00 -3.6022224749833933e+00 -4.1248736084080073e-01 -1.4034953997653539e+00 -2.2029814377470025e+00 -4.9090592953691459e-01 1.1506728681219947e+00 1.9347164785360418e+00 2.4960730819263482e-01 1.1491066140193322e+00 4.4960869047060803e-01 1.9359336186395457e+00 -8.7038831057588328e-01 -2.3092811262743590e-01 -1.8136109676316949e+00 -7.8134598871262173e-01 -3.0794796660928087e-01 -9.9291456857653881e-01 9.5142182617135274e-01 2.7847795525582941e-01 1.0878919489982790e+00 9.6627084344910152e-01 3.6737051198157500e-01 3.5445669964675521e+00 -1.3064345080453177e+00 -4.2495370841168084e-01 -3.6116200993108110e+00 -9.7575778206978225e-01 -3.9371605847723201e-01 -1.9592518856484582e+00 8.6712730576381825e-01 2.6208868841761701e-01 1.8090049570621256e+00 -5.2503916950772060e+00 -1.2763128658363145e+00 -1.4702186945881390e+00 5.6182789151276440e+00 8.8998231608460043e-01 1.2178181323559676e+00 4.3551914079109615e+00 1.2188874050023291e+00 9.4310567505696474e-01 -4.3665162975471548e+00 -7.8134598871262206e-01 -1.3767203693070496e+00 -7.4684567185683228e+00 -1.2705671370959355e+00 -1.3064345080453177e+00 7.4967855279984690e+00 9.4707885121886970e-01 1.6275510726471625e+00 5.1806564799858448e+00 1.0937926362669947e+00 1.3939879173871257e+00 -5.5655476198302312e+00 -8.2151521692792184e-01 -1.0290892255067126e+00 -9.8859578459786179e-01 -1.9562041305862286e+00 -4.0048407596282198e-01 8.7537855941128762e-01 1.8199612068817397e+00 2.6620388667611095e-01 9.4310567505696463e-01 1.1118291998746943e+00 2.7393315656824102e-01 -7.7150754380537201e-01 -9.9291456857653893e-01 -3.0055456311196471e-01 -1.2941808664497980e+00 -3.6022224749833933e+00 -4.2495370841168079e-01 9.4707885121886970e-01 3.4898402729245714e+00 3.6392828433137347e-01 1.1233232006177218e+00 1.9421766193341898e+00 4.3812590912514565e-01 -8.3460209145181152e-01 -1.8124661248690337e+00 -2.1619888921440331e-01 -1.4492282296570598e+00 -5.0761861548662968e-01 -2.2156819073604690e+00 1.2112974198364437e+00 2.6951824239089389e-01 1.9592260037230451e+00 1.2188874050023280e+00 4.4300179482653573e-01 1.1118291998746943e+00 -1.3928346563627665e+00 -3.0794796660928075e-01 -1.3640026225620336e+00 -1.2890966208399237e+00 -4.1248736084080079e-01 -3.6116200993108110e+00 1.6275510726471625e+00 3.6392828433137347e-01 3.9048765509785199e+00 1.4033200919612092e+00 4.3021277305536454e-01 2.1823815965362909e+00 -1.3298964825873920e+00 -2.7860715166745642e-01 -1.9670087218792358e+00 -4.0177497448988291e+00 -1.3019696369211013e+00 -1.3019696369211018e+00 4.3382507817605225e+00 9.5286114466278782e-01 9.5286114466279070e-01 5.1806564799858359e+00 1.4033200919612094e+00 1.1233232006177207e+00 -5.1704892320953304e+00 -9.7575778206978137e-01 -1.4034953997653539e+00 -5.1704892320953402e+00 -1.4034953997653539e+00 -9.7575778206978214e-01 5.1806564799858448e+00 1.1233232006177221e+00 1.4033200919612090e+00 7.0554916265697072e+00 1.4970726206836344e+00 1.4970726206836344e+00 -7.3963271592124080e+00 -1.2953542391691162e+00 -1.2953542391691157e+00 -1.3049343658140273e+00 -1.3550309961905878e+00 -5.3078947035888246e-01 1.2443407164673841e+00 1.1148728959517071e+00 3.0699586276390139e-01 1.3939879173871246e+00 2.1823815965362834e+00 4.3812590912514521e-01 -1.2428199276199878e+00 -1.9592518856484507e+00 -4.9090592953691475e-01 -1.4324101490871133e+00 -2.2029814377470025e+00 -3.9371605847723201e-01 1.0937926362669947e+00 1.9421766193341896e+00 4.3021277305536454e-01 1.4970726206836344e+00 3.8926310501626107e+00 5.9818971187231385e-01 -1.2490294482840081e+00 -3.6147978423987506e+00 -3.5811279844369537e-01 -1.3049343658140278e+00 -5.3078947035888246e-01 -1.3550309961905880e+00 1.2443407164673843e+00 3.0699586276390028e-01 1.1148728959517085e+00 1.0937926362669952e+00 4.3021277305536515e-01 1.9421766193341823e+00 -1.4324101490871139e+00 -3.9371605847723190e-01 -2.2029814377469954e+00 -1.2428199276199885e+00 -4.9090592953691453e-01 -1.9592518856484584e+00 1.3939879173871255e+00 4.3812590912514571e-01 2.1823815965362909e+00 1.4970726206836344e+00 5.9818971187231373e-01 3.8926310501626116e+00 -1.2490294482840087e+00 -3.5811279844369598e-01 -3.6147978423987510e+00 4.3140146288417931e+00 1.2483382807427792e+00 1.2483382807427801e+00 -4.7342486501375891e+00 -8.3832732592127834e-01 -8.3832732592128190e-01 -5.5655476198302214e+00 -1.3298964825873931e+00 -8.3460209145181186e-01 5.5221146663372442e+00 8.6712730576381758e-01 1.1506728681219964e+00 5.5221146663372549e+00 1.1506728681219949e+00 8.6712730576381825e-01 -5.5655476198302303e+00 -8.3460209145181152e-01 -1.3298964825873920e+00 -7.3963271592124080e+00 -1.2490294482840083e+00 -1.2490294482840090e+00 7.9034270874941566e+00 9.8571689361589920e-01 9.8571689361589865e-01 9.3560340417657195e-01 1.0836254153298790e+00 3.0071906481914368e-01 -8.1907765276915512e-01 -1.0003982833423544e+00 -1.7468363757104985e-01 -1.0290892255067126e+00 -1.9670087218792283e+00 -2.1619888921440350e-01 8.5444199194705273e-01 1.8090049570621174e+00 2.4960730819263557e-01 1.1892740446333818e+00 1.9347164785360418e+00 2.6208868841761707e-01 -8.2151521692792184e-01 -1.8124661248690337e+00 -2.7860715166745642e-01 -1.2953542391691162e+00 -3.6147978423987501e+00 -3.5811279844369592e-01 9.8571689361589909e-01 3.5673241215613292e+00 2.1518741546720921e-01 9.3560340417657128e-01 3.0071906481914312e-01 1.0836254153298790e+00 -8.1907765276915412e-01 -1.7468363757104879e-01 -1.0003982833423548e+00 -8.2151521692792029e-01 -2.7860715166745620e-01 -1.8124661248690255e+00 1.1892740446333798e+00 2.6208868841761646e-01 1.9347164785360338e+00 8.5444199194705261e-01 2.4960730819263480e-01 1.8090049570621254e+00 -1.0290892255067126e+00 -2.1619888921440333e-01 -1.9670087218792358e+00 -1.2953542391691155e+00 -3.5811279844369542e-01 -3.6147978423987510e+00 9.8571689361589843e-01 2.1518741546720921e-01 3.5673241215613292e+00 78 79 80 138 139 140 153 154 155 93 94 95 81 82 83 141 142 143 156 157 158 96 97 98 6.6287983816382052e+00 1.4609330095218338e+00 1.4609330095218382e+00 -6.9100356857952443e+00 -1.2300326486397206e+00 -1.2300326486397193e+00 -4.7888313800456448e+00 -1.3518725245532635e+00 -8.8762933113376141e-01 4.7810225235426316e+00 1.0510835769948013e+00 1.3300324155127929e+00 4.7810225235426325e+00 1.3300324155127912e+00 1.0510835769947999e+00 -4.7888313800456430e+00 -8.8762933113375864e-01 -1.3518725245532617e+00 -3.6390499075992300e+00 -1.2146998705268388e+00 -1.2146998705268375e+00 3.9359049247622928e+00 8.4218537282415462e-01 8.4218537282415440e-01 1.4609330095218342e+00 3.6653207717990282e+00 6.0126981244527478e-01 -1.2255822296866761e+00 -3.3143994862037673e+00 -3.4536278385026997e-01 -1.3744889547030728e+00 -2.0587755991315535e+00 -3.6943199391269049e-01 1.0345373668400049e+00 1.7676083505891989e+00 4.1219011326631783e-01 1.3333900030550037e+00 2.0146615333215929e+00 4.2094913301068082e-01 -1.1778345842155982e+00 -1.7899460909097458e+00 -4.8011075738427839e-01 -1.2099227304608364e+00 -1.2634291376401672e+00 -5.0823594415050977e-01 1.1589681196493407e+00 9.7895965817541430e-01 2.6873242057547758e-01 1.4609330095218385e+00 6.0126981244527478e-01 3.6653207717990317e+00 -1.2255822296866812e+00 -3.4536278385027158e-01 -3.3143994862037678e+00 -1.1778345842156028e+00 -4.8011075738428066e-01 -1.7899460909097480e+00 1.3333900030550079e+00 4.2094913301068221e-01 2.0146615333215951e+00 1.0345373668400086e+00 4.1219011326631855e-01 1.7676083505891989e+00 -1.3744889547030763e+00 -3.6943199391269016e-01 -2.0587755991315544e+00 -1.2099227304608402e+00 -5.0823594415051176e-01 -1.2634291376401681e+00 1.1589681196493451e+00 2.6873242057547847e-01 9.7895965817541519e-01 -6.9100356857952452e+00 -1.2255822296866765e+00 -1.2255822296866814e+00 7.3687970515046750e+00 9.2626829920645337e-01 9.2626829920645204e-01 5.1618521065640488e+00 1.1121943803675158e+00 7.7032002858495441e-01 -5.1864075438080794e+00 -7.6543945752903830e-01 -1.2536523436231866e+00 -5.1864075438080786e+00 -1.2536523436231839e+00 -7.6543945752903686e-01 5.1618521065640470e+00 7.7032002858495119e-01 1.1121943803675141e+00 3.9591604312715414e+00 1.1568554795865793e+00 1.1568554795865780e+00 -4.3688109224929095e+00 -7.2096415690660054e-01 -7.2096415690660054e-01 -1.2300326486397204e+00 -3.3143994862037673e+00 -3.4536278385027158e-01 9.2626829920645337e-01 3.2138719231628170e+00 1.9928519923215121e-01 1.1208605093902146e+00 1.7913877353883025e+00 2.3452621911641233e-01 -7.5370098699608268e-01 -1.6513005804289045e+00 -2.5519010493343125e-01 -9.6842630210032266e-01 -1.8029364242861727e+00 -1.9994495878486626e-01 7.8526664883464359e-01 1.6560577049670757e+00 2.3751436339704260e-01 8.5954579246303320e-01 1.0108299354656083e+00 2.7572747440063566e-01 -7.3978131215821907e-01 -9.0351080806495920e-01 -1.4655540857767405e-01 -1.2300326486397191e+00 -3.4536278385026997e-01 -3.3143994862037678e+00 9.2626829920645226e-01 1.9928519923215118e-01 3.2138719231628174e+00 7.8526664883464281e-01 2.3751436339704252e-01 1.6560577049670764e+00 -9.6842630210032143e-01 -1.9994495878486629e-01 -1.8029364242861727e+00 -7.5370098699608123e-01 -2.5519010493343031e-01 -1.6513005804289038e+00 1.1208605093902133e+00 2.3452621911641144e-01 1.7913877353883014e+00 8.5954579246303187e-01 2.7572747440063550e-01 1.0108299354656076e+00 -7.3978131215821774e-01 -1.4655540857767388e-01 -9.0351080806495865e-01 -4.7888313800456457e+00 -1.3744889547030725e+00 -1.1778345842156028e+00 5.1618521065640497e+00 1.1208605093902149e+00 7.8526664883464248e-01 6.8616284843188140e+00 1.5213010221372265e+00 8.3103108009864435e-01 -6.8257363242442759e+00 -1.1963389621228986e+00 -1.1608647557405303e+00 -3.9930505851716362e+00 -1.2896837296747989e+00 -6.8413681035873564e-01 3.9783455494098021e+00 8.4792807459820785e-01 1.1273294067177861e+00 4.7052086829811355e+00 1.2997863111716539e+00 9.9777335375100507e-01 -5.0994165338122439e+00 -9.2936427079653283e-01 -7.1856433908721518e-01 -1.3518725245532632e+00 -2.0587755991315535e+00 -4.8011075738428061e-01 1.1121943803675158e+00 1.7913877353883025e+00 2.3751436339704252e-01 1.5213010221372270e+00 3.6048676012021503e+00 3.2624762275445374e-01 -1.1769959773245331e+00 -3.2943175120959021e+00 -3.8183469157876443e-01 -1.3038329973238947e+00 -1.2728088936467055e+00 -2.7630432924662357e-01 1.1273294067177870e+00 1.0071596086980323e+00 4.1910943167039927e-01 1.3071424167098038e+00 2.0089728046410587e+00 4.0183473498086258e-01 -1.2352657267306424e+00 -1.7864857450553824e+00 -2.4645637459309183e-01 -8.8762933113376141e-01 -3.6943199391269049e-01 -1.7899460909097480e+00 7.7032002858495441e-01 2.3452621911641230e-01 1.6560577049670764e+00 8.3103108009864446e-01 3.2624762275445374e-01 3.1841151516008113e+00 -1.1834479990071110e+00 -3.9460262054091627e-01 -3.2853047737670975e+00 -6.7322780117785774e-01 -2.6896170286441945e-01 -8.9580274888769462e-01 8.4792807459821062e-01 2.4783648555642013e-01 1.0071596086980332e+00 1.0247233288436057e+00 4.0953019569044241e-01 1.7591902202530199e+00 -7.2969738080668467e-01 -1.8514420579970217e-01 -1.6354690719544009e+00 4.7810225235426325e+00 1.0345373668400049e+00 1.3333900030550079e+00 -5.1864075438080794e+00 -7.5370098699608268e-01 -9.6842630210032143e-01 -6.8257363242442759e+00 -1.1769959773245331e+00 -1.1834479990071110e+00 6.9218785770266464e+00 8.5015406747397970e-01 1.5121893538397497e+00 3.9456660429331194e+00 1.1161537046846977e+00 8.5639243808404941e-01 -3.9930505851716354e+00 -6.7322780117785486e-01 -1.3038329973238931e+00 -4.6969455012461241e+00 -1.1476782115853150e+00 -1.3384808676973627e+00 5.0535728109677134e+00 7.5075783808510244e-01 1.0922163711498873e+00 1.0510835769948013e+00 1.7676083505891989e+00 4.2094913301068221e-01 -7.6543945752903830e-01 -1.6513005804289045e+00 -1.9994495878486632e-01 -1.1963389621228988e+00 -3.2943175120959016e+00 -3.9460262054091627e-01 8.5015406747397981e-01 3.2388533182139754e+00 3.3032135855517081e-01 8.5639243808405052e-01 9.8392825585912225e-01 2.5243082888385709e-01 -6.8413681035873664e-01 -8.9580274888769396e-01 -2.7630432924662374e-01 -8.7566951406865512e-01 -1.7791852657838290e+00 -3.6335036736584064e-01 7.6395466152649705e-01 1.6302161825340336e+00 2.3050095548853813e-01 1.3300324155127932e+00 4.1219011326631783e-01 2.0146615333215951e+00 -1.2536523436231866e+00 -2.5519010493343125e-01 -1.8029364242861727e+00 -1.1608647557405303e+00 -3.8183469157876448e-01 -3.2853047737670971e+00 1.5121893538397497e+00 3.3032135855517075e-01 3.6429594035287400e+00 1.1161537046846999e+00 4.1005081340849925e-01 9.8392825585912225e-01 -1.2896837296748007e+00 -2.6896170286441867e-01 -1.2728088936467052e+00 -1.3092555547698657e+00 -4.6515205221916051e-01 -2.0325455686800966e+00 1.0550809097711400e+00 2.1857626636578686e-01 1.7520464676706162e+00 4.7810225235426316e+00 1.3333900030550037e+00 1.0345373668400086e+00 -5.1864075438080786e+00 -9.6842630210032266e-01 -7.5370098699608123e-01 -3.9930505851716362e+00 -1.3038329973238945e+00 -6.7322780117785774e-01 3.9456660429331190e+00 8.5639243808405052e-01 1.1161537046846999e+00 6.9218785770266473e+00 1.5121893538397475e+00 8.5015406747397815e-01 -6.8257363242442723e+00 -1.1834479990071078e+00 -1.1769959773245313e+00 -4.6969455012461241e+00 -1.3384808676973639e+00 -1.1476782115853132e+00 5.0535728109677125e+00 1.0922163711498876e+00 7.5075783808510210e-01 1.3300324155127912e+00 2.0146615333215929e+00 4.1219011326631855e-01 -1.2536523436231839e+00 -1.8029364242861730e+00 -2.5519010493343031e-01 -1.2896837296747992e+00 -1.2728088936467050e+00 -2.6896170286441945e-01 1.1161537046846977e+00 9.8392825585912225e-01 4.1005081340849925e-01 1.5121893538397473e+00 3.6429594035287400e+00 3.3032135855516986e-01 -1.1608647557405278e+00 -3.2853047737670975e+00 -3.8183469157876293e-01 -1.3092555547698632e+00 -2.0325455686800966e+00 -4.6515205221915906e-01 1.0550809097711376e+00 1.7520464676706167e+00 2.1857626636578636e-01 1.0510835769948002e+00 4.2094913301068082e-01 1.7676083505891991e+00 -7.6543945752903697e-01 -1.9994495878486626e-01 -1.6513005804289040e+00 -6.8413681035873564e-01 -2.7630432924662351e-01 -8.9580274888769462e-01 8.5639243808404919e-01 2.5243082888385715e-01 9.8392825585912225e-01 8.5015406747397848e-01 3.3032135855516986e-01 3.2388533182139758e+00 -1.1963389621228968e+00 -3.9460262054091555e-01 -3.2943175120959030e+00 -8.7566951406865379e-01 -3.6335036736584048e-01 -1.7791852657838287e+00 7.6395466152649549e-01 2.3050095548853794e-01 1.6302161825340336e+00 -4.7888313800456430e+00 -1.1778345842155982e+00 -1.3744889547030763e+00 5.1618521065640479e+00 7.8526664883464348e-01 1.1208605093902133e+00 3.9783455494098026e+00 1.1273294067177870e+00 8.4792807459821051e-01 -3.9930505851716349e+00 -6.8413681035873652e-01 -1.2896837296748007e+00 -6.8257363242442741e+00 -1.1608647557405276e+00 -1.1963389621228970e+00 6.8616284843188105e+00 8.3103108009864135e-01 1.5213010221372241e+00 4.7052086829811346e+00 9.9777335375100562e-01 1.2997863111716519e+00 -5.0994165338122412e+00 -7.1856433908721495e-01 -9.2936427079653228e-01 -8.8762933113375864e-01 -1.7899460909097458e+00 -3.6943199391269022e-01 7.7032002858495119e-01 1.6560577049670762e+00 2.3452621911641144e-01 8.4792807459820796e-01 1.0071596086980323e+00 2.4783648555642013e-01 -6.7322780117785475e-01 -8.9580274888769396e-01 -2.6896170286441867e-01 -1.1834479990071078e+00 -3.2853047737670971e+00 -3.9460262054091561e-01 8.3103108009864113e-01 3.1841151516008095e+00 3.2624762275445224e-01 1.0247233288436028e+00 1.7591902202530187e+00 4.0953019569044091e-01 -7.2969738080668167e-01 -1.6354690719543998e+00 -1.8514420579970153e-01 -1.3518725245532617e+00 -4.8011075738427839e-01 -2.0587755991315544e+00 1.1121943803675141e+00 2.3751436339704260e-01 1.7913877353883016e+00 1.1273294067177861e+00 4.1910943167039932e-01 1.0071596086980332e+00 -1.3038329973238931e+00 -2.7630432924662374e-01 -1.2728088936467052e+00 -1.1769959773245311e+00 -3.8183469157876293e-01 -3.2943175120959021e+00 1.5213010221372241e+00 3.2624762275445224e-01 3.6048676012021494e+00 1.3071424167098022e+00 4.0183473498086253e-01 2.0089728046410569e+00 -1.2352657267306404e+00 -2.4645637459309164e-01 -1.7864857450553815e+00 -3.6390499075992300e+00 -1.2099227304608364e+00 -1.2099227304608402e+00 3.9591604312715414e+00 8.5954579246303320e-01 8.5954579246303187e-01 4.7052086829811355e+00 1.3071424167098038e+00 1.0247233288436057e+00 -4.6969455012461241e+00 -8.7566951406865501e-01 -1.3092555547698654e+00 -4.6969455012461241e+00 -1.3092555547698632e+00 -8.7566951406865390e-01 4.7052086829811337e+00 1.0247233288436028e+00 1.3071424167098022e+00 6.3755704625995833e+00 1.3881533770595489e+00 1.3881533770595476e+00 -6.7122073497419148e+00 -1.1847171157766339e+00 -1.1847171157766332e+00 -1.2146998705268388e+00 -1.2634291376401670e+00 -5.0823594415051176e-01 1.1568554795865793e+00 1.0108299354656085e+00 2.7572747440063550e-01 1.2997863111716539e+00 2.0089728046410582e+00 4.0953019569044236e-01 -1.1476782115853150e+00 -1.7791852657838292e+00 -4.6515205221916056e-01 -1.3384808676973641e+00 -2.0325455686800966e+00 -3.6335036736584053e-01 9.9777335375100573e-01 1.7591902202530187e+00 4.0183473498086253e-01 1.3881533770595487e+00 3.5569519288198976e+00 5.7101797518792052e-01 -1.1417095717592696e+00 -3.2607849170754908e+00 -3.2137201652435032e-01 -1.2146998705268377e+00 -5.0823594415050977e-01 -1.2634291376401678e+00 1.1568554795865780e+00 2.7572747440063572e-01 1.0108299354656076e+00 9.9777335375100518e-01 4.0183473498086258e-01 1.7591902202530199e+00 -1.3384808676973630e+00 -3.6335036736584064e-01 -2.0325455686800966e+00 -1.1476782115853132e+00 -4.6515205221915912e-01 -1.7791852657838292e+00 1.2997863111716521e+00 4.0953019569044091e-01 2.0089728046410569e+00 1.3881533770595476e+00 5.7101797518792052e-01 3.5569519288198959e+00 -1.1417095717592680e+00 -3.2137201652434993e-01 -3.2607849170754903e+00 3.9359049247622928e+00 1.1589681196493407e+00 1.1589681196493449e+00 -4.3688109224929104e+00 -7.3978131215821907e-01 -7.3978131215821774e-01 -5.0994165338122439e+00 -1.2352657267306424e+00 -7.2969738080668467e-01 5.0535728109677134e+00 7.6395466152649705e-01 1.0550809097711400e+00 5.0535728109677125e+00 1.0550809097711378e+00 7.6395466152649560e-01 -5.0994165338122412e+00 -7.2969738080668156e-01 -1.2352657267306404e+00 -6.7122073497419148e+00 -1.1417095717592698e+00 -1.1417095717592680e+00 7.2368007931615894e+00 8.6845030050783723e-01 8.6845030050783678e-01 8.4218537282415462e-01 9.7895965817541430e-01 2.6873242057547847e-01 -7.2096415690660076e-01 -9.0351080806495920e-01 -1.4655540857767391e-01 -9.2936427079653272e-01 -1.7864857450553824e+00 -1.8514420579970220e-01 7.5075783808510255e-01 1.6302161825340338e+00 2.1857626636578686e-01 1.0922163711498876e+00 1.7520464676706164e+00 2.3050095548853797e-01 -7.1856433908721495e-01 -1.6354690719543998e+00 -2.4645637459309161e-01 -1.1847171157766339e+00 -3.2607849170754912e+00 -3.2137201652434993e-01 8.6845030050783723e-01 3.2250282337701681e+00 1.8171836306501560e-01 8.4218537282415440e-01 2.6873242057547758e-01 9.7895965817541519e-01 -7.2096415690660054e-01 -1.4655540857767405e-01 -9.0351080806495876e-01 -7.1856433908721518e-01 -2.4645637459309180e-01 -1.6354690719544007e+00 1.0922163711498873e+00 2.3050095548853816e-01 1.7520464676706162e+00 7.5075783808510221e-01 2.1857626636578634e-01 1.6302161825340336e+00 -9.2936427079653217e-01 -1.8514420579970151e-01 -1.7864857450553815e+00 -1.1847171157766332e+00 -3.2137201652435032e-01 -3.2607849170754903e+00 8.6845030050783689e-01 1.8171836306501554e-01 3.2250282337701677e+00 33 34 35 93 94 95 108 109 110 48 49 50 36 37 38 96 97 98 111 112 113 51 52 53 6.1637556419986987e+00 1.9973658274323787e+00 1.2993445354001349e+00 -6.5055239578715875e+00 -1.8960468238619230e+00 -1.1120506270183661e+00 -4.2940399799022702e+00 -1.8056811751927229e+00 -7.6630225099662375e-01 4.3865557979013943e+00 1.6072530674358432e+00 1.1885611696472307e+00 4.3434724412121870e+00 1.8114317527557116e+00 9.3082248858281780e-01 -4.4422614856519091e+00 -1.4680824163406383e+00 -1.2177064851231869e+00 -3.1979425536527879e+00 -1.6206726077792708e+00 -1.0640573658484220e+00 3.5459840959662765e+00 1.3744323755506223e+00 7.4138853535641713e-01 1.9973658274323787e+00 4.4333982174962960e+00 8.5539115158846224e-01 -1.9026020233117920e+00 -4.0325293401860032e+00 -5.7017902959077349e-01 -1.8394197135008354e+00 -2.7122506009902394e+00 -5.0599048610368025e-01 1.5962346551834010e+00 2.3550068973465375e+00 6.5157931178352091e-01 1.8233655524643342e+00 2.6822955656606986e+00 5.9475582681695516e-01 -1.7466635405577169e+00 -2.3925203507040429e+00 -7.2631086866453554e-01 -1.6200011659383549e+00 -1.8487715347894442e+00 -7.0818972360907506e-01 1.6917204082285868e+00 1.5153711461661987e+00 4.0894381777912714e-01 1.2993445354001354e+00 8.5539115158846235e-01 3.6773320800449896e+00 -1.1175696757367328e+00 -5.7108734592566834e-01 -3.3537443393669553e+00 -1.0342452670095292e+00 -6.6760264160979821e-01 -1.7801153774048182e+00 1.1947556063765581e+00 6.6061677672906260e-01 1.9966542027924234e+00 9.2437719341393199e-01 5.8525032822665857e-01 1.7822215379529740e+00 -1.2539624453186633e+00 -6.3064517081381033e-01 -2.0579476840352382e+00 -1.0625779727055273e+00 -7.0750037904018048e-01 -1.2332486609309907e+00 1.0498780255798275e+00 4.7557728084527362e-01 9.6884824094761557e-01 -6.5055239578715875e+00 -1.9026020233117922e+00 -1.1175696757367326e+00 7.0328323704863687e+00 1.7309247691788516e+00 8.4956762394692409e-01 4.7226231123081561e+00 1.7109765330249607e+00 6.7348152523045068e-01 -4.8531364912394688e+00 -1.4579403337550996e+00 -1.1381724933748101e+00 -4.7964407546950163e+00 -1.8524008899550006e+00 -6.9327581526204840e-01 4.8765505719933850e+00 1.4601391760170555e+00 1.0268690872231860e+00 3.5609895645407903e+00 1.6782337932682447e+00 1.0400308908482008e+00 -4.0378944155226320e+00 -1.3673310244672203e+00 -6.4093114287517272e-01 -1.8960468238619235e+00 -4.0325293401860023e+00 -5.7108734592566845e-01 1.7309247691788514e+00 3.8334628921066924e+00 3.7396633085761810e-01 1.7176051502725211e+00 2.3951120647131332e+00 3.6001866825226125e-01 -1.4357262049915551e+00 -2.1462825727627632e+00 -4.8797226648994863e-01 -1.5962737144775117e+00 -2.4186517271373247e+00 -3.3823916103710594e-01 1.4817348063320426e+00 2.1754816008127205e+00 4.5313851560688839e-01 1.3981242296608991e+00 1.5514264940629057e+00 4.8388987986971099e-01 -1.4003422121133255e+00 -1.3580194116093609e+00 -2.7371462113375655e-01 -1.1120506270183661e+00 -5.7017902959077349e-01 -3.3537443393669553e+00 8.4956762394692409e-01 3.7396633085761788e-01 3.2588743007206444e+00 6.9923419485308302e-01 3.7272756124971534e-01 1.6643687717665276e+00 -8.8263158905396977e-01 -3.8455875738021927e-01 -1.8002234286068595e+00 -6.7784823915665116e-01 -3.8263997284868573e-01 -1.6764906956857422e+00 1.0297223576978025e+00 4.4699376753374287e-01 1.8083736455131567e+00 7.6795714623640710e-01 4.2475525940845316e-01 1.0027106853113519e+00 -6.7395086750523026e-01 -2.8106515922985087e-01 -9.0386893965212345e-01 -4.2940399799022702e+00 -1.8394197135008354e+00 -1.0342452670095292e+00 4.7226231123081561e+00 1.7176051502725211e+00 6.9923419485308302e-01 6.2667693472645842e+00 2.0388544720704860e+00 7.0530627174632454e-01 -6.3350944746281872e+00 -1.8174776940118369e+00 -1.0102784724515574e+00 -3.5084935367357182e+00 -1.7264253543064210e+00 -5.9657695675137079e-01 3.5895181623412498e+00 1.3983787529241836e+00 9.9734675262841221e-01 4.2000205248018023e+00 1.7281380674368527e+00 8.5374986460882663e-01 -4.6413031554496182e+00 -1.4996536808849508e+00 -6.1453638762419149e-01 -1.8056811751927231e+00 -2.7122506009902390e+00 -6.6760264160979821e-01 1.7109765330249607e+00 2.3951120647131328e+00 3.7272756124971540e-01 2.0388544720704860e+00 4.3178180930093504e+00 4.4345862971607214e-01 -1.7983510406908509e+00 -3.9458912195434661e+00 -5.6883777946707892e-01 -1.7513046195586834e+00 -1.8703606497023828e+00 -3.8198078938524804e-01 1.6527752057459164e+00 1.5481363669155408e+00 6.0626991157311239e-01 1.7455738509527992e+00 2.6227698075824062e+00 5.4916808777554760e-01 -1.7928432263519054e+00 -2.3553338619843407e+00 -3.5320297985232374e-01 -7.6630225099662375e-01 -5.0599048610368025e-01 -1.7801153774048184e+00 6.7348152523045057e-01 3.6001866825226131e-01 1.6643687717665276e+00 7.0530627174632454e-01 4.4345862971607219e-01 3.1869535359282128e+00 -1.0347603993268604e+00 -5.8785045238742251e-01 -3.2813017390106909e+00 -5.7767365159223583e-01 -3.6464009347520365e-01 -8.9278926427484195e-01 7.4796733425670714e-01 3.9221773007864236e-01 9.9675103441202739e-01 8.8653501780677746e-01 5.6329290892297457e-01 1.7471723751744506e+00 -6.3455384712454022e-01 -3.0050690500364380e-01 -1.6410393365908680e+00 4.3865557979013943e+00 1.5962346551834010e+00 1.1947556063765581e+00 -4.8531364912394688e+00 -1.4357262049915549e+00 -8.8263158905396977e-01 -6.3350944746281881e+00 -1.7983510406908514e+00 -1.0347603993268604e+00 6.5237944509912706e+00 1.5582615238902060e+00 1.3575510388156768e+00 3.5601406213197357e+00 1.6311114047978967e+00 7.6662039309628349e-01 -3.6959521152711043e+00 -1.2860717428545607e+00 -1.1902802172009777e+00 -4.2794575085191848e+00 -1.6564567326635338e+00 -1.1894368686365149e+00 4.6931497194455449e+00 1.3909981373289964e+00 9.7818203592980657e-01 1.6072530674358432e+00 2.3550068973465375e+00 6.6061677672906283e-01 -1.4579403337550996e+00 -2.1462825727627632e+00 -3.8455875738021927e-01 -1.8174776940118373e+00 -3.9458912195434661e+00 -5.8785045238742251e-01 1.5582615238902058e+00 3.7813231405692225e+00 6.1204240228024420e-01 1.4083560128816563e+00 1.5228677534296771e+00 4.0414817717310375e-01 -1.2975629242230244e+00 -1.3385666581844828e+00 -5.2840710243334343e-01 -1.4092791856097797e+00 -2.3345890565561058e+00 -6.0233042422057270e-01 1.4083895333920369e+00 2.1061317157013817e+00 4.2633938023914830e-01 1.1885611696472307e+00 6.5157931178352091e-01 1.9966542027924234e+00 -1.1381724933748103e+00 -4.8797226648994863e-01 -1.8002234286068595e+00 -1.0102784724515574e+00 -5.6883777946707892e-01 -3.2813017390106909e+00 1.3575510388156771e+00 6.1204240228024409e-01 3.6119299410372929e+00 9.8536672390604707e-01 5.8944392820275227e-01 9.7862175738134205e-01 -1.1733133068764399e+00 -5.1626270052754886e-01 -1.2454887315181040e+00 -1.1481005185178892e+00 -6.8312891493274075e-01 -2.0036515915311570e+00 9.3838585885174230e-01 4.0313601915079988e-01 1.7434595894557550e+00 4.3434724412121870e+00 1.8233655524643342e+00 9.2437719341393221e-01 -4.7964407546950163e+00 -1.5962737144775117e+00 -6.7784823915665116e-01 -3.5084935367357186e+00 -1.7513046195586834e+00 -5.7767365159223583e-01 3.5601406213197357e+00 1.4083560128816563e+00 9.8536672390604707e-01 6.4532903332736975e+00 2.0674693473558956e+00 7.5424443279722997e-01 -6.4726901436998876e+00 -1.8367516950952849e+00 -1.0640456321115230e+00 -4.2301102587831041e+00 -1.7826080655094718e+00 -1.0026366466163508e+00 4.6508312981081046e+00 1.6677471819390650e+00 6.5821581935955398e-01 1.8114317527557116e+00 2.6822955656606986e+00 5.8525032822665857e-01 -1.8524008899550006e+00 -2.4186517271373242e+00 -3.8263997284868573e-01 -1.7264253543064207e+00 -1.8703606497023828e+00 -3.6464009347520365e-01 1.6311114047978967e+00 1.5228677534296771e+00 5.8944392820275238e-01 2.0674693473558960e+00 4.4163130600275693e+00 4.6739733277235673e-01 -1.8189777453271585e+00 -4.0017237362524929e+00 -5.9054294801113749e-01 -1.7441800546158039e+00 -2.6703477241918208e+00 -6.4230045068965325e-01 1.6319715392948808e+00 2.3396074581660762e+00 3.3803187582291400e-01 9.3082248858281769e-01 5.9475582681695516e-01 1.7822215379529740e+00 -6.9327581526204840e-01 -3.3823916103710594e-01 -1.6764906956857424e+00 -5.9657695675137079e-01 -3.8198078938524810e-01 -8.9278926427484195e-01 7.6662039309628360e-01 4.0414817717310381e-01 9.7862175738134216e-01 7.5424443279723008e-01 4.6739733277235662e-01 3.3016522892772100e+00 -1.0759955397669270e+00 -6.0241543408102438e-01 -3.3609403150488322e+00 -7.6715992312005732e-01 -5.0160540652152419e-01 -1.7869613822004800e+00 6.8132092042407288e-01 3.5793945426248713e-01 1.6546860725983688e+00 -4.4422614856519091e+00 -1.7466635405577167e+00 -1.2539624453186633e+00 4.8765505719933842e+00 1.4817348063320428e+00 1.0297223576978025e+00 3.5895181623412498e+00 1.6527752057459160e+00 7.4796733425670714e-01 -3.6959521152711039e+00 -1.2975629242230244e+00 -1.1733133068764396e+00 -6.4726901436998858e+00 -1.8189777453271589e+00 -1.0759955397669272e+00 6.6090046153072235e+00 1.5700567206335083e+00 1.4030028515437232e+00 4.3352315317975059e+00 1.5368543499127540e+00 1.1589505941302605e+00 -4.7994011368164662e+00 -1.3782168725163206e+00 -8.3637184566646572e-01 -1.4680824163406383e+00 -2.3925203507040429e+00 -6.3064517081381033e-01 1.4601391760170559e+00 2.1754816008127205e+00 4.4699376753374287e-01 1.3983787529241836e+00 1.5481363669155408e+00 3.9221773007864236e-01 -1.2860717428545603e+00 -1.3385666581844828e+00 -5.1626270052754886e-01 -1.8367516950952847e+00 -4.0017237362524929e+00 -6.0241543408102427e-01 1.5700567206335083e+00 3.7919045611716009e+00 6.2487651421199764e-01 1.5668653051542312e+00 2.3392423600518795e+00 6.4013266602058028e-01 -1.4045341004384961e+00 -2.1219541438107221e+00 -3.5489737242258057e-01 -1.2177064851231869e+00 -7.2631086866453543e-01 -2.0579476840352382e+00 1.0268690872231860e+00 4.5313851560688839e-01 1.8083736455131563e+00 9.9734675262841221e-01 6.0626991157311239e-01 9.9675103441202761e-01 -1.1902802172009777e+00 -5.2840710243334343e-01 -1.2454887315181042e+00 -1.0640456321115230e+00 -5.9054294801113738e-01 -3.3609403150488322e+00 1.4030028515437234e+00 6.2487651421199775e-01 3.6508111737262636e+00 1.1711130465705890e+00 6.3535905302526552e-01 2.0050748965144733e+00 -1.1262994035302238e+00 -4.7438307530824758e-01 -1.7966340195637471e+00 -3.1979425536527879e+00 -1.6200011659383551e+00 -1.0625779727055273e+00 3.5609895645407903e+00 1.3981242296608989e+00 7.6795714623640710e-01 4.2000205248018023e+00 1.7455738509527989e+00 8.8653501780677746e-01 -4.2794575085191848e+00 -1.4092791856097797e+00 -1.1481005185178892e+00 -4.2301102587831041e+00 -1.7441800546158039e+00 -7.6715992312005743e-01 4.3352315317975059e+00 1.5668653051542312e+00 1.1711130465705888e+00 5.8838328043829673e+00 1.8527176158119643e+00 1.2036135910172769e+00 -6.2725641045679925e+00 -1.7898205954159545e+00 -1.0513803872875791e+00 -1.6206726077792710e+00 -1.8487715347894444e+00 -7.0750037904018059e-01 1.6782337932682447e+00 1.5514264940629057e+00 4.2475525940845316e-01 1.7281380674368532e+00 2.6227698075824057e+00 5.6329290892297457e-01 -1.6564567326635335e+00 -2.3345890565561058e+00 -6.8312891493274075e-01 -1.7826080655094718e+00 -2.6703477241918208e+00 -5.0160540652152419e-01 1.5368543499127538e+00 2.3392423600518790e+00 6.3535905302526552e-01 1.8527176158119643e+00 4.2585257429946548e+00 7.8876917890345466e-01 -1.7362064204775416e+00 -3.9182560891544744e+00 -5.1994169976570381e-01 -1.0640573658484220e+00 -7.0818972360907506e-01 -1.2332486609309907e+00 1.0400308908482008e+00 4.8388987986971099e-01 1.0027106853113519e+00 8.5374986460882663e-01 5.4916808777554760e-01 1.7471723751744506e+00 -1.1894368686365149e+00 -6.0233042422057270e-01 -2.0036515915311570e+00 -1.0026366466163508e+00 -6.4230045068965325e-01 -1.7869613822004797e+00 1.1589505941302605e+00 6.4013266602058028e-01 2.0050748965144733e+00 1.2036135910172772e+00 7.8876917890345477e-01 3.5595916028660346e+00 -1.0002140595032774e+00 -5.0913921404999241e-01 -3.2906879252036836e+00 3.5459840959662761e+00 1.6917204082285868e+00 1.0498780255798275e+00 -4.0378944155226311e+00 -1.4003422121133255e+00 -6.7395086750523026e-01 -4.6413031554496182e+00 -1.7928432263519054e+00 -6.3455384712454033e-01 4.6931497194455440e+00 1.4083895333920367e+00 9.3838585885174230e-01 4.6508312981081046e+00 1.6319715392948810e+00 6.8132092042407288e-01 -4.7994011368164653e+00 -1.4045341004384961e+00 -1.1262994035302238e+00 -6.2725641045679916e+00 -1.7362064204775418e+00 -1.0002140595032776e+00 6.8611976988367847e+00 1.6018444784657637e+00 7.6543337280763146e-01 1.3744323755506223e+00 1.5153711461661987e+00 4.7557728084527362e-01 -1.3673310244672203e+00 -1.3580194116093609e+00 -2.8106515922985087e-01 -1.4996536808849508e+00 -2.3553338619843407e+00 -3.0050690500364385e-01 1.3909981373289961e+00 2.1061317157013812e+00 4.0313601915079983e-01 1.6677471819390650e+00 2.3396074581660762e+00 3.5793945426248708e-01 -1.3782168725163206e+00 -2.1219541438107221e+00 -4.7438307530824758e-01 -1.7898205954159545e+00 -3.9182560891544744e+00 -5.0913921404999252e-01 1.6018444784657637e+00 3.7924531865252415e+00 3.2844159933317524e-01 7.4138853535641702e-01 4.0894381777912714e-01 9.6884824094761568e-01 -6.4093114287517272e-01 -2.7371462113375655e-01 -9.0386893965212345e-01 -6.1453638762419160e-01 -3.5320297985232374e-01 -1.6410393365908680e+00 9.7818203592980657e-01 4.2633938023914836e-01 1.7434595894557550e+00 6.5821581935955398e-01 3.3803187582291400e-01 1.6546860725983688e+00 -8.3637184566646572e-01 -3.5489737242258063e-01 -1.7966340195637471e+00 -1.0513803872875789e+00 -5.1994169976570381e-01 -3.2906879252036836e+00 7.6543337280763146e-01 3.2844159933317513e-01 3.2652363180086832e+00 93 94 95 153 154 155 168 169 170 108 109 110 96 97 98 156 157 158 171 172 173 111 112 113 5.6287327577280752e+00 1.8468378963984606e+00 1.2138016834080856e+00 -5.9629984610835232e+00 -1.7463615153819696e+00 -1.0240126300141297e+00 -3.9420113442322968e+00 -1.6796553632106499e+00 -6.9316993685800665e-01 4.0305854828828158e+00 1.4798478073023260e+00 1.1170905503014956e+00 3.9558537334191803e+00 1.6817708382279764e+00 8.5140029809955220e-01 -4.0540885709614738e+00 -1.3330068698347910e+00 -1.1426234987128678e+00 -2.9134825688242265e+00 -1.5037394107053756e+00 -9.9614912513665199e-01 3.2574089710714489e+00 1.2543066172040238e+00 6.7366265891252142e-01 1.8468378963984606e+00 4.1062224220383099e+00 8.1505494105857701e-01 -1.7532321049768607e+00 -3.6868890211681458e+00 -5.1859292906320287e-01 -1.7120509885972106e+00 -2.5389098107919930e+00 -4.6584706911887036e-01 1.4660092411432133e+00 2.1686601970972896e+00 6.1274803892776764e-01 1.6918515718683567e+00 2.4795711311945396e+00 5.5270819691736062e-01 -1.6148876279182083e+00 -2.1806943458937593e+00 -6.8860973613592869e-01 -1.4991165329980682e+00 -1.7332473519554563e+00 -6.7635246225278201e-01 1.5745885450803156e+00 1.3852867794792145e+00 3.6889101966707755e-01 1.2138016834080856e+00 8.1505494105857712e-01 3.4045553793439098e+00 -1.0338551525121655e+00 -5.2172143376612945e-01 -3.0614123551580503e+00 -9.6171836974295477e-01 -6.3149274625075758e-01 -1.6438769094565628e+00 1.1232496408460930e+00 6.2319107703683618e-01 1.8658561968875487e+00 8.4965523578069402e-01 5.4646282392912071e-01 1.6156516722832086e+00 -1.1812427612315310e+00 -5.8982911182526654e-01 -1.9031640216321188e+00 -9.9475178650964857e-01 -6.7747308241019177e-01 -1.1595262859485782e+00 9.8486150996142674e-01 4.3580753222781138e-01 8.8191632368064221e-01 -5.9629984610835249e+00 -1.7532321049768609e+00 -1.0338551525121655e+00 6.5045036928861721e+00 1.5742029712098442e+00 7.5362842153790799e-01 4.3717497751005254e+00 1.5826629999873532e+00 5.9562462462701338e-01 -4.5024765050889846e+00 -1.3220886881228175e+00 -1.0665779518373826e+00 -4.4135174936710033e+00 -1.7255057140418320e+00 -6.0944736436889635e-01 4.4903256551298281e+00 1.3220355412978231e+00 9.5310392324643334e-01 3.2727375639802112e+00 1.5637799806372785e+00 9.7493193556170310e-01 -3.7603242272532218e+00 -1.2418549859907884e+00 -5.6740843625461201e-01 -1.7463615153819698e+00 -3.6868890211681458e+00 -5.2172143376612956e-01 1.5742029712098442e+00 3.4939965159296857e+00 3.2460324284675318e-01 1.5911493597086142e+00 2.2084297709519580e+00 3.1822574635899686e-01 -1.3020311857067628e+00 -1.9599255169298986e+00 -4.4593292208466695e-01 -1.4614226848452982e+00 -2.2076985344110454e+00 -2.9398963566766229e-01 1.3424494330829544e+00 1.9615203690203151e+00 4.1105367746228283e-01 1.2770424566796355e+00 1.4220816004162784e+00 4.4390071072978915e-01 -1.2750288347470164e+00 -1.2315151838091489e+00 -2.3613938587936270e-01 -1.0240126300141297e+00 -5.1859292906320276e-01 -3.0614123551580499e+00 7.5362842153790810e-01 3.2460324284675324e-01 2.9757478521160055e+00 6.1797227770099061e-01 3.2879614157516945e-01 1.5278401537440753e+00 -8.0506023834148033e-01 -3.4198064778881432e-01 -1.6593591184179906e+00 -5.9331314389647738e-01 -3.3718263883738819e-01 -1.5144745113323974e+00 9.4994961437689029e-01 4.0253134541730196e-01 1.6398906686759627e+00 6.9686013363657107e-01 3.8343764313171808e-01 9.1459622334955337e-01 -5.9602443500027258e-01 -2.4161215728153754e-01 -8.2282891297715843e-01 -3.9420113442322964e+00 -1.7120509885972104e+00 -9.6171836974295466e-01 4.3717497751005254e+00 1.5911493597086137e+00 6.1797227770099084e-01 5.8280817980464033e+00 1.9065013350087272e+00 6.2396465492158648e-01 -5.8872144480741104e+00 -1.6831457257896580e+00 -9.2872211358183787e-01 -3.2269947468927977e+00 -1.6108006912404742e+00 -5.2197189527619858e-01 3.3031626116491051e+00 1.2766969003577429e+00 9.2936122476493610e-01 3.8664585667221041e+00 1.6089611130494519e+00 7.8178170043734929e-01 -4.3132322123189315e+00 -1.3773113024971944e+00 -5.4066747922387026e-01 -1.6796553632106499e+00 -2.5389098107919934e+00 -6.3149274625075758e-01 1.5826629999873532e+00 2.2084297709519585e+00 3.2879614157516945e-01 1.9065013350087272e+00 4.0659938849510038e+00 3.9763284696491541e-01 -1.6597274708773466e+00 -3.6747096088352933e+00 -5.2709510655160241e-01 -1.6352049806664184e+00 -1.7549389629796062e+00 -3.3988857057276811e-01 1.5335199715740020e+00 1.4180051885472706e+00 5.7360512745795433e-01 1.6246965746254751e+00 2.4612902563933572e+00 5.1095359898448245e-01 -1.6727930664411417e+00 -2.1851607182366974e+00 -3.1251129160739261e-01 -6.9316993685800665e-01 -4.6584706911887031e-01 -1.6438769094565628e+00 5.9562462462701338e-01 3.1822574635899686e-01 1.5278401537440753e+00 6.2396465492158670e-01 3.9763284696491530e-01 2.9780594515558874e+00 -9.5975673110462811e-01 -5.5094685639528940e-01 -3.0596706545563777e+00 -5.0579211867474039e-01 -3.2444945482363452e-01 -8.1342371197842511e-01 6.7768338371750458e-01 3.5735994503481816e-01 9.1016075669334584e-01 8.2007155154215716e-01 5.2925475034343272e-01 1.6192913171993362e+00 -5.5862542817088590e-01 -2.6122990836436888e-01 -1.5183804032012787e+00 4.0305854828828158e+00 1.4660092411432133e+00 1.1232496408460928e+00 -4.5024765050889846e+00 -1.3020311857067628e+00 -8.0506023834148033e-01 -5.8872144480741113e+00 -1.6597274708773466e+00 -9.5975673110462811e-01 6.0810700246784748e+00 1.4158019147151588e+00 1.2839096588557735e+00 3.2741236431995957e+00 1.5142115411623145e+00 6.9293439612031316e-01 -3.4115581415712848e+00 -1.1614277628136507e+00 -1.1255236691453934e+00 -3.9461993205111705e+00 -1.5363183625592771e+00 -1.1223753661142846e+00 4.3616692644846635e+00 1.2634820849363511e+00 9.1262230888360540e-01 1.4798478073023260e+00 2.1686601970972901e+00 6.2319107703683629e-01 -1.3220886881228175e+00 -1.9599255169298986e+00 -3.4198064778881432e-01 -1.6831457257896576e+00 -3.6747096088352933e+00 -5.5094685639528929e-01 1.4158019147151593e+00 3.5160457733564998e+00 5.6741318416789199e-01 1.2863401688760503e+00 1.3938654195442388e+00 3.6748145337200566e-01 -1.1713139802264576e+00 -1.2119949284585521e+00 -4.8867978034991399e-01 -1.2852759059172305e+00 -2.1653104646791359e+00 -5.6489470679437992e-01 1.2798344091626273e+00 1.9333691289048514e+00 3.8841627675166318e-01 1.1170905503014956e+00 6.1274803892776775e-01 1.8658561968875487e+00 -1.0665779518373826e+00 -4.4593292208466695e-01 -1.6593591184179906e+00 -9.2872211358183776e-01 -5.2709510655160252e-01 -3.0596706545563777e+00 1.2839096588557735e+00 5.6741318416789199e-01 3.4048939358843873e+00 9.1669043978295639e-01 5.5682046964547838e-01 8.9085596634239017e-01 -1.1077713251786085e+00 -4.7690713816515234e-01 -1.1698761473927126e+00 -1.0800345305051051e+00 -6.4962701605509299e-01 -1.8862737653187935e+00 8.6541527216270797e-01 3.6258049011537680e-01 1.6135735865715479e+00 3.9558537334191803e+00 1.6918515718683567e+00 8.4965523578069413e-01 -4.4135174936710033e+00 -1.4614226848452982e+00 -5.9331314389647738e-01 -3.2269947468927973e+00 -1.6352049806664182e+00 -5.0579211867474039e-01 3.2741236431995957e+00 1.2863401688760503e+00 9.1669043978295639e-01 5.8847628707622288e+00 1.9215554085640103e+00 6.6078451579535713e-01 -5.8949193218909892e+00 -1.6844610408383571e+00 -9.7783561084538617e-01 -3.8658942292298697e+00 -1.6615945596132475e+00 -9.3146311999882059e-01 4.2865855443036516e+00 1.5429361166549043e+00 5.8127380205641566e-01 1.6817708382279766e+00 2.4795711311945396e+00 5.4646282392912071e-01 -1.7255057140418324e+00 -2.2076985344110454e+00 -3.3718263883738819e-01 -1.6108006912404744e+00 -1.7549389629796062e+00 -3.2444945482363441e-01 1.5142115411623145e+00 1.3938654195442388e+00 5.5682046964547838e-01 1.9215554085640101e+00 4.0573028980293664e+00 4.1551715590951144e-01 -1.6704778988643518e+00 -3.6232964892167105e+00 -5.4845313592562894e-01 -1.6188322202869068e+00 -2.4855565841547644e+00 -6.0649114085902200e-01 1.5080787364792627e+00 2.1407511219939819e+00 2.9777592096156225e-01 8.5140029809955220e-01 5.5270819691736062e-01 1.6156516722832086e+00 -6.0944736436889635e-01 -2.9398963566766229e-01 -1.5144745113323974e+00 -5.2197189527619858e-01 -3.3988857057276811e-01 -8.1342371197842511e-01 6.9293439612031316e-01 3.6748145337200566e-01 8.9085596634239017e-01 6.6078451579535724e-01 4.1551715590951127e-01 2.9873392231113702e+00 -9.8378821860484367e-01 -5.5592483500803358e-01 -3.0344058417244253e+00 -6.9088874311930648e-01 -4.6118575127290362e-01 -1.6352407701053642e+00 6.0097701135402215e-01 3.1528198632248994e-01 1.5036979734036418e+00 -4.0540885709614747e+00 -1.6148876279182083e+00 -1.1812427612315310e+00 4.4903256551298281e+00 1.3424494330829544e+00 9.4994961437689041e-01 3.3031626116491055e+00 1.5335199715740020e+00 6.7768338371750458e-01 -3.4115581415712857e+00 -1.1713139802264572e+00 -1.1077713251786083e+00 -5.8949193218909883e+00 -1.6704778988643518e+00 -9.8378821860484356e-01 6.0359314595406373e+00 1.4133952209798011e+00 1.3196282929879606e+00 3.9667272338370703e+00 1.4119315863693278e+00 1.0879806032604971e+00 -4.4355809257328920e+00 -1.2446167049970678e+00 -7.6243958932786815e-01 -1.3330068698347910e+00 -2.1806943458937593e+00 -5.8982911182526654e-01 1.3220355412978233e+00 1.9615203690203153e+00 4.0253134541730201e-01 1.2766969003577429e+00 1.4180051885472706e+00 3.5735994503481816e-01 -1.1614277628136505e+00 -1.2119949284585521e+00 -4.7690713816515240e-01 -1.6844610408383571e+00 -3.6232964892167105e+00 -5.5592483500803358e-01 1.4133952209798009e+00 3.4196075774719952e+00 5.7531946666215517e-01 1.4397206196987726e+00 2.1401439270442317e+00 6.0261485546397753e-01 -1.2729526088473400e+00 -1.9232912985147910e+00 -3.1516452757979968e-01 -1.1426234987128678e+00 -6.8860973613592846e-01 -1.9031640216321188e+00 9.5310392324643334e-01 4.1105367746228283e-01 1.6398906686759627e+00 9.2936122476493610e-01 5.7360512745795433e-01 9.1016075669334584e-01 -1.1255236691453934e+00 -4.8867978034991394e-01 -1.1698761473927126e+00 -9.7783561084538639e-01 -5.4845313592562905e-01 -3.0344058417244257e+00 1.3196282929879608e+00 5.7531946666215517e-01 3.3405028916219615e+00 1.1006266097033619e+00 5.9884665263378711e-01 1.8597391814573365e+00 -1.0567372719990442e+00 -4.3308227180470799e-01 -1.6428474876993495e+00 -2.9134825688242265e+00 -1.4991165329980682e+00 -9.9475178650964857e-01 3.2727375639802112e+00 1.2770424566796355e+00 6.9686013363657107e-01 3.8664585667221036e+00 1.6246965746254751e+00 8.2007155154215727e-01 -3.9461993205111705e+00 -1.2852759059172305e+00 -1.0800345305051051e+00 -3.8658942292298693e+00 -1.6188322202869068e+00 -6.9088874311930659e-01 3.9667272338370703e+00 1.4397206196987726e+00 1.1006266097033617e+00 5.4170459153242554e+00 1.7191477817288736e+00 1.1268760598278096e+00 -5.7973931612983742e+00 -1.6573827735305526e+00 -9.7875929457583832e-01 -1.5037394107053756e+00 -1.7332473519554563e+00 -6.7747308241019177e-01 1.5637799806372783e+00 1.4220816004162784e+00 3.8343764313171808e-01 1.6089611130494521e+00 2.4612902563933572e+00 5.2925475034343261e-01 -1.5363183625592773e+00 -2.1653104646791359e+00 -6.4962701605509299e-01 -1.6615945596132475e+00 -2.4855565841547644e+00 -4.6118575127290368e-01 1.4119315863693278e+00 2.1401439270442313e+00 5.9884665263378711e-01 1.7191477817288736e+00 3.9849300789442204e+00 7.5405008126735407e-01 -1.6021681289070311e+00 -3.6243314620087310e+00 -4.7730327763810299e-01 -9.9614912513665210e-01 -6.7635246225278201e-01 -1.1595262859485782e+00 9.7493193556170310e-01 4.4390071072978915e-01 9.1459622334955337e-01 7.8178170043734929e-01 5.1095359898448245e-01 1.6192913171993362e+00 -1.1223753661142846e+00 -5.6489470679437992e-01 -1.8862737653187935e+00 -9.3146311999882070e-01 -6.0649114085902200e-01 -1.6352407701053642e+00 1.0879806032604971e+00 6.0261485546397753e-01 1.8597391814573363e+00 1.1268760598278096e+00 7.5405008126735407e-01 3.3318006848978641e+00 -9.2158268783760111e-01 -4.6378093653941960e-01 -3.0443865855313530e+00 3.2574089710714489e+00 1.5745885450803159e+00 9.8486150996142674e-01 -3.7603242272532222e+00 -1.2750288347470164e+00 -5.9602443500027269e-01 -4.3132322123189315e+00 -1.6727930664411417e+00 -5.5862542817088601e-01 4.3616692644846635e+00 1.2798344091626273e+00 8.6541527216270808e-01 4.2865855443036516e+00 1.5080787364792629e+00 6.0097701135402215e-01 -4.4355809257328920e+00 -1.2729526088473397e+00 -1.0567372719990442e+00 -5.7973931612983742e+00 -1.6021681289070313e+00 -9.2158268783760111e-01 6.4008667467436524e+00 1.4604409482203233e+00 6.8171602952964583e-01 1.2543066172040240e+00 1.3852867794792141e+00 4.3580753222781143e-01 -1.2418549859907886e+00 -1.2315151838091489e+00 -2.4161215728153751e-01 -1.3773113024971944e+00 -2.1851607182366974e+00 -2.6122990836436888e-01 1.2634820849363513e+00 1.9333691289048516e+00 3.6258049011537680e-01 1.5429361166549043e+00 2.1407511219939819e+00 3.1528198632248994e-01 -1.2446167049970680e+00 -1.9232912985147910e+00 -4.3308227180470804e-01 -1.6573827735305522e+00 -3.6243314620087310e+00 -4.6378093653941954e-01 1.4604409482203233e+00 3.5048916321913199e+00 2.8603526532435514e-01 6.7366265891252142e-01 3.6889101966707755e-01 8.8191632368064232e-01 -5.6740843625461190e-01 -2.3613938587936270e-01 -8.2282891297715843e-01 -5.4066747922387026e-01 -3.1251129160739261e-01 -1.5183804032012787e+00 9.1262230888360552e-01 3.8841627675166318e-01 1.6135735865715479e+00 5.8127380205641566e-01 2.9777592096156219e-01 1.5036979734036420e+00 -7.6243958932786804e-01 -3.1516452757979968e-01 -1.6428474876993495e+00 -9.7875929457583832e-01 -4.7730327763810299e-01 -3.0443865855313530e+00 6.8171602952964561e-01 2.8603526532435519e-01 3.0292555057533073e+00 6 7 8 66 67 68 81 82 83 21 22 23 9 10 11 69 70 71 84 85 86 24 25 26 6.4685010411258608e+00 6.7552016896576728e-01 2.1362638237575835e+00 -6.7158070586167984e+00 -3.9633821074245101e-01 -1.9872366173035412e+00 -4.7862531621603654e+00 -6.6076728731534884e-01 -1.6140302074105504e+00 4.5672207075562836e+00 3.2946260908902791e-01 1.9253993325915368e+00 4.6790714881996136e+00 6.3108340281605368e-01 1.7263936571081659e+00 -4.4733167429821012e+00 -1.7940838327017605e-01 -1.9046189817960097e+00 -3.5033261016406416e+00 -5.8294058199569654e-01 -1.7666499696820237e+00 3.7639098285181496e+00 1.8338828245282396e-01 1.4844789627348405e+00 6.7552016896576728e-01 3.2383123893703383e+00 4.3068982791461424e-01 -3.9470571004199340e-01 -3.0262319687249661e+00 -1.7911558941996295e-01 -6.7528016654294409e-01 -1.6753253603300300e+00 -3.3455799232434746e-01 3.2060691814431830e-01 1.5168681127951311e+00 1.9977615324948450e-01 6.2529855887101626e-01 1.6234391474419230e+00 3.3749319911124370e-01 -4.4011586781402962e-01 -1.5155117443798460e+00 -2.8095890800206580e-01 -5.7312650080678595e-01 -8.9328816633688857e-01 -3.6954731031869070e-01 4.6180259922465139e-01 7.3173759016433881e-01 1.9622061978972485e-01 2.1362638237575835e+00 4.3068982791461419e-01 4.4578309786715700e+00 -1.9868755404208021e+00 -1.7995433398855601e-01 -4.0487558594973292e+00 -1.8891545675422996e+00 -3.8216560676865452e-01 -2.4562790774830368e+00 1.9295079972731477e+00 2.0719892501446688e-01 2.7361899573631190e+00 1.7083668430550141e+00 3.3642302686513731e-01 2.3881257389336166e+00 -1.9121829791052798e+00 -1.1610853631073309e-01 -2.7380674460680190e+00 -1.7578261739565051e+00 -3.7400747815683316e-01 -1.9081274817514056e+00 1.7719005969391415e+00 7.7924175430558892e-02 1.5690831898314850e+00 -6.7158070586167975e+00 -3.9470571004199340e-01 -1.9868755404208025e+00 7.1182893635141893e+00 5.1841672403077313e-02 1.7847611905587191e+00 5.1157294080129079e+00 3.6122848840153693e-01 1.5731965143472217e+00 -4.9113479683873233e+00 -4.3795647397507683e-03 -1.9278042553676427e+00 -5.0518031610583645e+00 -4.9434851464010732e-01 -1.5287795303328906e+00 4.8013909378099431e+00 1.9993491932646969e-02 1.7562115794619915e+00 3.7878370642618204e+00 4.6693072032782795e-01 1.7742847540275339e+00 -4.1442885855363709e+00 -6.5605836432381052e-03 -1.4449947122741327e+00 -3.9633821074245118e-01 -3.0262319687249666e+00 -1.7995433398855606e-01 5.1841672403077313e-02 3.0581791376469627e+00 2.4624900601337110e-02 3.6300083370246128e-01 1.5320529356133235e+00 1.5811247513160831e-01 -8.1639255459342881e-03 -1.5366296582577934e+00 -4.9800980528979504e-03 -2.1878356647391253e-01 -1.5236014618593405e+00 -9.3527638604166519e-02 3.1383098101343210e-02 1.5113741080924057e+00 1.7925083605684553e-02 1.9509011975162199e-01 7.5786824433335442e-01 8.4562692097795933e-02 -1.8030021196205896e-02 -7.7301133684394641e-01 -6.7630807908054067e-03 -1.9872366173035412e+00 -1.7911558941996292e-01 -4.0487558594973292e+00 1.7847611905587191e+00 2.4624900601337110e-02 3.8415558777379193e+00 1.5760976971573579e+00 1.5831617743772661e-01 2.2229818336000338e+00 -1.6560031623950020e+00 -2.1444118653495972e-03 -2.4626880617356073e+00 -1.5210524293604264e+00 -2.1273253983444779e-01 -2.1702570251578264e+00 1.7657777043260339e+00 1.1957247790717282e-02 2.4148683783660738e+00 1.4931289160351917e+00 2.0095639198002771e-01 1.5994031688878232e+00 -1.4554732990183334e+00 -1.8621766900485770e-03 -1.3971083122010886e+00 -4.7862531621603672e+00 -6.7528016654294398e-01 -1.8891545675422992e+00 5.1157294080129079e+00 3.6300083370246122e-01 1.5760976971573579e+00 7.0558677677318045e+00 7.4212134320819789e-01 1.7446000225658242e+00 -6.7898883189845174e+00 -3.7623758381652700e-01 -1.9707790873322011e+00 -4.0255519400763919e+00 -6.3823766097110712e-01 -1.4148801335145749e+00 3.7949018115304822e+00 1.6381894219129753e-01 1.7648498610346504e+00 4.7120373594247962e+00 6.2918711816944528e-01 1.7028031685235383e+00 -5.0768429254787142e+00 -2.0837282594082404e-01 -1.5135369608922957e+00 -6.6076728731534884e-01 -1.6753253603300300e+00 -3.8216560676865446e-01 3.6122848840153687e-01 1.5320529356133235e+00 1.5831617743772661e-01 7.4212134320819778e-01 3.2659780490172752e+00 3.2770848194508639e-01 -3.6702680900427131e-01 -3.0925842543863427e+00 -2.2362135938418812e-01 -6.3976642538735728e-01 -8.9841655007900667e-01 -2.7922674654098367e-01 4.2716902300367049e-01 7.5479492081121491e-01 2.7475339650238412e-01 6.2649264050410858e-01 1.6679924629396090e+00 3.3405823607463442e-01 -4.8945097341053656e-01 -1.5544922035860440e+00 -2.0982257926600553e-01 -1.6140302074105506e+00 -3.3455799232434746e-01 -2.4562790774830368e+00 1.5731965143472217e+00 1.5811247513160831e-01 2.2229818336000338e+00 1.7446000225658245e+00 3.2770848194508634e-01 3.8997905130171358e+00 -1.9858425258933317e+00 -2.3004409466873943e-01 -4.1104092731280790e+00 -1.4194281392966697e+00 -2.7943727028534682e-01 -1.3906055599340774e+00 1.4963807239802775e+00 1.0640196007449500e-01 1.5999018563217633e+00 1.7268622002264038e+00 3.3979042341242033e-01 2.4330509269732508e+00 -1.5217385885191748e+00 -8.7973983285176471e-02 -2.1984312193669915e+00 4.5672207075562836e+00 3.2060691814431830e-01 1.9295079972731477e+00 -4.9113479683873233e+00 -8.1639255459342482e-03 -1.6560031623950020e+00 -6.7898883189845174e+00 -3.6702680900427143e-01 -1.9858425258933319e+00 6.6567045917252781e+00 4.2228156591303481e-02 2.1767247288771503e+00 3.7699508859549229e+00 4.3054843715930424e-01 1.4925448622961706e+00 -3.6118295035806005e+00 3.9103350403297535e-03 -1.8127172774654112e+00 -4.4974448835557439e+00 -4.4362220009894610e-01 -1.9067070878607617e+00 4.8166344892717037e+00 2.1519087713896344e-02 1.7624924651680403e+00 3.2946260908902791e-01 1.5168681127951311e+00 2.0719892501446688e-01 -4.3795647397507683e-03 -1.5366296582577934e+00 -2.1444118653496068e-03 -3.7623758381652700e-01 -3.0925842543863427e+00 -2.3004409466873940e-01 4.2228156591303481e-02 3.1679000515653755e+00 2.4376224339701894e-02 1.7493150154948678e-01 7.3330016888566540e-01 1.1190002432174660e-01 -7.8356700731151713e-03 -7.7018569943531145e-01 -5.9677736578983122e-03 -1.9178705306529867e-01 -1.5499527824204651e+00 -1.2292038253262870e-01 3.3617604464873455e-02 1.5312840612537397e+00 1.7601489048700712e-02 1.9253993325915368e+00 1.9977615324948453e-01 2.7361899573631190e+00 -1.9278042553676427e+00 -4.9800980528979522e-03 -2.4626880617356073e+00 -1.9707790873322013e+00 -2.2362135938418815e-01 -4.1104092731280790e+00 2.1767247288771499e+00 2.4376224339701897e-02 4.5242594016425537e+00 1.7525097950114739e+00 2.7353899956967170e-01 1.5686413802139414e+00 -1.7951160819727447e+00 1.5227561739279581e-03 -1.9159110809687325e+00 -1.8903127928436541e+00 -2.8173790153119199e-01 -2.7603778500439149e+00 1.7293783610360824e+00 1.1125225635492213e-02 2.4202955266567208e+00 4.6790714881996145e+00 6.2529855887101615e-01 1.7083668430550143e+00 -5.0518031610583645e+00 -2.1878356647391253e-01 -1.5210524293604264e+00 -4.0255519400763911e+00 -6.3976642538735728e-01 -1.4194281392966697e+00 3.7699508859549229e+00 1.7493150154948678e-01 1.7525097950114739e+00 6.8657636008440690e+00 7.1791557509410930e-01 1.6790386386584562e+00 -6.5402085945312303e+00 -3.6539762188702846e-01 -1.8913605317687607e+00 -4.6259744117328374e+00 -6.5644723645061021e-01 -1.8089551656527589e+00 4.9287521324002173e+00 3.6224921468429672e-01 1.5008809893536732e+00 6.3108340281605368e-01 1.6234391474419230e+00 3.3642302686513731e-01 -4.9434851464010721e-01 -1.5236014618593405e+00 -2.1273253983444779e-01 -6.3823766097110712e-01 -8.9841655007900667e-01 -2.7943727028534682e-01 4.3054843715930424e-01 7.3330016888566540e-01 2.7353899956967170e-01 7.1791557509410908e-01 3.2135527897546816e+00 3.1652224295663267e-01 -3.3408795476327435e-01 -2.9910484475167260e+00 -2.0659831097898204e-01 -6.3325585122857697e-01 -1.6558900551707603e+00 -3.6650554730272245e-01 3.2038256653359859e-01 1.4986644085435630e+00 1.3878939901005766e-01 1.7263936571081659e+00 3.3749319911124370e-01 2.3881257389336166e+00 -1.5287795303328906e+00 -9.3527638604166519e-02 -2.1702570251578268e+00 -1.4148801335145749e+00 -2.7922674654098367e-01 -1.3906055599340774e+00 1.4925448622961701e+00 1.1190002432174659e-01 1.5686413802139414e+00 1.6790386386584562e+00 3.1652224295663267e-01 3.8210446155912003e+00 -1.9171610643279904e+00 -2.2587856093989525e-01 -3.9758525394685824e+00 -1.5393590861155015e+00 -3.2513122767952207e-01 -2.3999319768124039e+00 1.5022026562281647e+00 1.5784870737494466e-01 2.1588353666341331e+00 -4.4733167429821021e+00 -4.4011586781402967e-01 -1.9121829791052798e+00 4.8013909378099431e+00 3.1383098101343189e-02 1.7657777043260339e+00 3.7949018115304822e+00 4.2716902300367054e-01 1.4963807239802775e+00 -3.6118295035806005e+00 -7.8356700731151696e-03 -1.7951160819727452e+00 -6.5402085945312285e+00 -3.3408795476327435e-01 -1.9171610643279899e+00 6.3545062403677077e+00 2.4017964397718507e-02 2.0930141932774129e+00 4.4236192355860533e+00 2.9166208442724639e-01 1.8444519341372527e+00 -4.7490633842002552e+00 7.8073227204400681e-03 -1.5751644303149639e+00 -1.7940838327017608e-01 -1.5155117443798460e+00 -1.1610853631073312e-01 1.9993491932646990e-02 1.5113741080924057e+00 1.1957247790717275e-02 1.6381894219129756e-01 7.5479492081121491e-01 1.0640196007449500e-01 3.9103350403297604e-03 -7.7018569943531145e-01 1.5227561739279581e-03 -3.6539762188702851e-01 -2.9910484475167256e+00 -2.2587856093989528e-01 2.4017964397718517e-02 3.0259429471335562e+00 1.3538542451999126e-02 3.2255879617510980e-01 1.5067108483854181e+00 2.0224839648612755e-01 1.0506475420101937e-02 -1.5220769330907116e+00 6.3181942733614377e-03 -1.9046189817960095e+00 -2.8095890800206580e-01 -2.7380674460680194e+00 1.7562115794619915e+00 1.7925083605684553e-02 2.4148683783660738e+00 1.7648498610346504e+00 2.7475339650238412e-01 1.5999018563217633e+00 -1.8127172774654114e+00 -5.9677736578983053e-03 -1.9159110809687323e+00 -1.8913605317687610e+00 -2.0659831097898204e-01 -3.9758525394685824e+00 2.0930141932774129e+00 1.3538542451999156e-02 4.3406980523027645e+00 1.8506975322221870e+00 1.8457719875885784e-01 2.6827696915631689e+00 -1.8560763749660598e+00 2.7307713200202389e-03 -2.4084069120484379e+00 -3.5033261016406412e+00 -5.7312650080678595e-01 -1.7578261739565051e+00 3.7878370642618204e+00 1.9509011975162199e-01 1.4931289160351917e+00 4.7120373594247962e+00 6.2649264050410858e-01 1.7268622002264036e+00 -4.4974448835557439e+00 -1.9178705306529864e-01 -1.8903127928436541e+00 -4.6259744117328374e+00 -6.3325585122857708e-01 -1.5393590861155013e+00 4.4236192355860533e+00 3.2255879617510980e-01 1.8506975322221870e+00 6.3005939068868573e+00 6.5092969877298779e-01 2.0421476838914949e+00 -6.5973421692303038e+00 -3.9690185010316698e-01 -1.9253382794596181e+00 -5.8294058199569654e-01 -8.9328816633688857e-01 -3.7400747815683316e-01 4.6693072032782795e-01 7.5786824433335453e-01 2.0095639198002768e-01 6.2918711816944528e-01 1.6679924629396090e+00 3.3979042341242033e-01 -4.4362220009894615e-01 -1.5499527824204651e+00 -2.8173790153119205e-01 -6.5644723645061021e-01 -1.6558900551707603e+00 -3.2513122767952202e-01 2.9166208442724645e-01 1.5067108483854181e+00 1.8457719875885784e-01 6.5092969877298779e-01 3.2208615060274171e+00 4.1572708067333902e-01 -3.5569960315225446e-01 -3.0543020577576847e+00 -1.6017448745709797e-01 -1.7666499696820237e+00 -3.6954731031869070e-01 -1.9081274817514058e+00 1.7742847540275339e+00 8.4562692097795933e-02 1.5994031688878232e+00 1.7028031685235381e+00 3.3405823607463442e-01 2.4330509269732508e+00 -1.9067070878607613e+00 -1.2292038253262870e-01 -2.7603778500439149e+00 -1.8089551656527589e+00 -3.6650554730272245e-01 -2.3999319768124043e+00 1.8444519341372527e+00 2.0224839648612755e-01 2.6827696915631689e+00 2.0421476838914949e+00 4.1572708067333897e-01 4.3861927416644821e+00 -1.8813753173842758e+00 -1.7762316517785529e-01 -4.0329792204810015e+00 3.7639098285181496e+00 4.6180259922465139e-01 1.7719005969391410e+00 -4.1442885855363709e+00 -1.8030021196205906e-02 -1.4554732990183334e+00 -5.0768429254787133e+00 -4.8945097341053656e-01 -1.5217385885191745e+00 4.8166344892717037e+00 3.3617604464873448e-02 1.7293783610360824e+00 4.9287521324002173e+00 3.2038256653359859e-01 1.5022026562281647e+00 -4.7490633842002552e+00 1.0506475420101937e-02 -1.8560763749660603e+00 -6.5973421692303038e+00 -3.5569960315225446e-01 -1.8813753173842755e+00 7.0582406142555740e+00 3.6871352115772062e-02 1.7111819656844565e+00 1.8338828245282399e-01 7.3173759016433881e-01 7.7924175430558892e-02 -6.5605836432380913e-03 -7.7301133684394641e-01 -1.8621766900485770e-03 -2.0837282594082404e-01 -1.5544922035860442e+00 -8.7973983285176471e-02 2.1519087713896330e-02 1.5312840612537393e+00 1.1125225635492217e-02 3.6224921468429666e-01 1.4986644085435630e+00 1.5784870737494466e-01 7.8073227204400681e-03 -1.5220769330907116e+00 2.7307713200202316e-03 -3.9690185010316698e-01 -3.0543020577576847e+00 -1.7762316517785531e-01 3.6871352115772076e-02 3.1421964713167467e+00 1.7830445392064360e-02 1.4844789627348403e+00 1.9622061978972488e-01 1.5690831898314852e+00 -1.4449947122741327e+00 -6.7630807908054119e-03 -1.3971083122010886e+00 -1.5135369608922957e+00 -2.0982257926600553e-01 -2.1984312193669915e+00 1.7624924651680403e+00 1.7601489048700712e-02 2.4202955266567203e+00 1.5008809893536734e+00 1.3878939901005766e-01 2.1588353666341327e+00 -1.5751644303149639e+00 6.3181942733614238e-03 -2.4084069120484379e+00 -1.9253382794596181e+00 -1.6017448745709795e-01 -4.0329792204810015e+00 1.7111819656844567e+00 1.7830445392064392e-02 3.8887115809751820e+00 66 67 68 126 127 128 141 142 143 81 82 83 69 70 71 129 130 131 144 145 146 84 85 86 6.1353225708463031e+00 6.6005707606227060e-01 2.0319088362863442e+00 -6.3771320299230032e+00 -3.7738678008530646e-01 -1.8859693220526836e+00 -4.4977695946804834e+00 -6.4484932729134281e-01 -1.5097391630554569e+00 4.2783604821533610e+00 3.0835130397645716e-01 1.8300238002233167e+00 4.4464411761136926e+00 6.1762869635453399e-01 1.6388084521147881e+00 -4.2458991593721498e+00 -1.6236878559806447e-01 -1.8157697416909131e+00 -3.2896310853199662e+00 -5.6768732637063613e-01 -1.6809298548107123e+00 3.5503076401822495e+00 1.6625514295208776e-01 1.3916669929853205e+00 6.6005707606227060e-01 3.1085802744568478e+00 4.2597707207862745e-01 -3.7593286456594355e-01 -2.8819385299471629e+00 -1.6667897224326989e-01 -6.6405039555425738e-01 -1.5786562539736841e+00 -3.2679641861986214e-01 3.0327928017429512e-01 1.4119439224570693e+00 1.9132768919117021e-01 6.1259924738613902e-01 1.5692167325952155e+00 3.3182612573500947e-01 -4.2425517287238779e-01 -1.4577707773938873e+00 -2.7419839191176976e-01 -5.6057064378850063e-01 -8.5420772722542215e-01 -3.6698360313755635e-01 4.4887347315838450e-01 6.8283235903102435e-01 1.8552649890765160e-01 2.0319088362863438e+00 4.2597707207862745e-01 4.2744489203420573e+00 -1.8778784616250284e+00 -1.6663397706345884e-01 -3.8509840764263110e+00 -1.7899795606732236e+00 -3.7497212535556590e-01 -2.2998275156697203e+00 1.8306692241153428e+00 1.9627294281002031e-01 2.5897583881109489e+00 1.6106033448859318e+00 3.2823244260282619e-01 2.2801216176871035e+00 -1.8220275172648555e+00 -1.0610611693735243e-01 -2.6411276293070913e+00 -1.6670493309077514e+00 -3.6860637941842805e-01 -1.8252241442697799e+00 1.6837534651832406e+00 6.5836141283331123e-02 1.4728344395327948e+00 -6.3771320299230041e+00 -3.7593286456594355e-01 -1.8778784616250286e+00 6.7879072029233614e+00 2.4018768214966131e-02 1.6746265707082306e+00 4.8285932255859851e+00 3.4508402839744734e-01 1.4658009767917624e+00 -4.6257374168163796e+00 1.9245701163747315e-02 -1.8332297951369567e+00 -4.8215616908748959e+00 -4.7778174218397051e-01 -1.4305145042042575e+00 4.5730990689021755e+00 -1.8678910129952297e-03 1.6604881216300855e+00 3.5713655638118054e+00 4.5264269448474115e-01 1.6884235821316946e+00 -3.9365339236090509e+00 1.4591305502007820e-02 -1.3477164902955330e+00 -3.7738678008530646e-01 -2.8819385299471629e+00 -1.6663397706345887e-01 2.4018768214966145e-02 2.9228339346717758e+00 1.2453910728590966e-02 3.4234725902981300e-01 1.4262645041277302e+00 1.4660844716723606e-01 1.8703419451566412e-02 -1.4384717644934759e+00 1.0116392646075103e-02 -1.9903031070815538e-01 -1.4616500546049518e+00 -8.3660119236449546e-02 7.7396322114581060e-03 1.4547945405226577e+00 5.2907535293008588e-03 1.7650220223255109e-01 7.0873211308503659e-01 7.1771780695593576e-02 7.1058096531071528e-03 -7.3056474336161015e-01 4.0528115331118705e-03 -1.8859693220526839e+00 -1.6667897224326989e-01 -3.8509840764263106e+00 1.6746265707082306e+00 1.2453910728590947e-02 3.6476080081656956e+00 1.4720089750326644e+00 1.4920753949003354e-01 2.0657668425695372e+00 -1.5555476400575992e+00 9.3300412674863272e-03 -2.3112641717399938e+00 -1.4243346949250069e+00 -2.0218730715966704e-01 -2.0607177490813289e+00 1.6795502792186496e+00 3.9787346136912691e-04 2.3070197908885146e+00 1.4022822535383697e+00 1.9022990473394441e-01 1.5062315230855046e+00 -1.3626164214626244e+00 7.2470097215127987e-03 -1.3036601674616199e+00 -4.4977695946804834e+00 -6.6405039555425738e-01 -1.7899795606732236e+00 4.8285932255859851e+00 3.4234725902981306e-01 1.4720089750326644e+00 6.5705215489492543e+00 7.2516446134075552e-01 1.6153806825441948e+00 -6.3005753538052787e+00 -3.4832440127295633e-01 -1.8549181559765140e+00 -3.8122105610434485e+00 -6.2660663182461762e-01 -1.3198591104047965e+00 3.5819989804404289e+00 1.4490958982409513e-01 1.6757543527913554e+00 4.4054984354211211e+00 6.1375416312537823e-01 1.6074872170496461e+00 -4.7760566808675797e+00 -1.8719404466821030e-01 -1.4058744003633294e+00 -6.4484932729134281e-01 -1.5786562539736841e+00 -3.7497212535556579e-01 3.4508402839744734e-01 1.4262645041277302e+00 1.4920753949003351e-01 7.2516446134075552e-01 3.0111837437267162e+00 3.1470940650340212e-01 -3.4683178222768629e-01 -2.8268670728232994e+00 -2.1645852195329648e-01 -6.2776362339499459e-01 -8.5752994443779951e-01 -2.6982481505430478e-01 4.1228551579626938e-01 7.0594774036121100e-01 2.6983525036420464e-01 6.1205513972869030e-01 1.5538150418424286e+00 3.2740685985858875e-01 -4.7514441234913907e-01 -1.4341577588233037e+00 -1.9990359385306228e-01 -1.5097391630554569e+00 -3.2679641861986214e-01 -2.2998275156697203e+00 1.4658009767917619e+00 1.4660844716723606e-01 2.0657668425695372e+00 1.6153806825441943e+00 3.1470940650340207e-01 3.5736611422575448e+00 -1.8591714175384983e+00 -2.1768441489247986e-01 -3.7827462733884065e+00 -1.3215800276492018e+00 -2.6967065214155067e-01 -1.2961190921410848e+00 1.4033606880615672e+00 9.8981252221392410e-02 1.5034506416817046e+00 1.6221052091894579e+00 3.3097329797782887e-01 2.2607500666353508e+00 -1.4161569483438250e+00 -7.7120918215966575e-02 -2.0249358119449266e+00 4.2783604821533601e+00 3.0327928017429512e-01 1.8306692241153428e+00 -4.6257374168163796e+00 1.8703419451566450e-02 -1.5555476400575992e+00 -6.3005753538052804e+00 -3.4683178222768640e-01 -1.8591714175384983e+00 6.1753940757839221e+00 1.4389510013745822e-02 2.0602724415889635e+00 3.5540810858560334e+00 4.1349439146776334e-01 1.4016502327986000e+00 -3.4025727424199737e+00 2.5184511848551777e-02 -1.7255256480532162e+00 -4.1950473196396274e+00 -4.2676258478721074e-01 -1.8124637748006038e+00 4.5160971888879446e+00 -1.4567459410255949e-03 1.6601165819470138e+00 3.0835130397645710e-01 1.4119439224570693e+00 1.9627294281002031e-01 1.9245701163747301e-02 -1.4384717644934759e+00 9.3300412674863133e-03 -3.4832440127295633e-01 -2.8268670728232990e+00 -2.1768441489247986e-01 1.4389510013745832e-02 2.9150238730741997e+00 7.0678408493192839e-03 1.5382165825423522e-01 6.8408628221711343e-01 1.0360051724073012e-01 1.3133585891278965e-02 -7.2964797789095659e-01 7.4284764070777732e-03 -1.6960561646331773e-01 -1.4327917195289588e+00 -1.1052164502319055e-01 8.9882584368096048e-03 1.4167244569883084e+00 4.5062413410366367e-03 1.8300238002233165e+00 1.9132768919117021e-01 2.5897583881109489e+00 -1.8332297951369565e+00 1.0116392646075112e-02 -2.3112641717399938e+00 -1.8549181559765140e+00 -2.1645852195329643e-01 -3.7827462733884070e+00 2.0602724415889635e+00 7.0678408493192882e-03 4.2158286586677622e+00 1.6656712948195844e+00 2.6781209418683016e-01 1.4754255801534821e+00 -1.7104912316184933e+00 1.5079489815283313e-02 -1.8343399496959201e+00 -1.7931627893697848e+00 -2.7430154711877208e-01 -2.6032073673444591e+00 1.6358344354698842e+00 -6.4343761660978186e-04 2.2505451352365875e+00 4.4464411761136935e+00 6.1259924738613902e-01 1.6106033448859320e+00 -4.8215616908748959e+00 -1.9903031070815538e-01 -1.4243346949250066e+00 -3.8122105610434489e+00 -6.2776362339499459e-01 -1.3215800276492018e+00 3.5540810858560334e+00 1.5382165825423522e-01 1.6656712948195844e+00 6.6025845452960112e+00 7.0549641605140412e-01 1.5785935376958229e+00 -6.2749719816471430e+00 -3.5116429800328286e-01 -1.7912655665241968e+00 -4.3773679531716230e+00 -6.4164414632255784e-01 -1.7190458837261364e+00 4.6830053794713749e+00 3.4768505673721195e-01 1.4013579954232054e+00 6.1762869635453388e-01 1.5692167325952153e+00 3.2823244260282625e-01 -4.7778174218397063e-01 -1.4616500546049518e+00 -2.0218730715966704e-01 -6.2660663182461762e-01 -8.5752994443779951e-01 -2.6967065214155067e-01 4.1349439146776340e-01 6.8408628221711343e-01 2.6781209418683022e-01 7.0549641605140401e-01 3.1317871859043835e+00 3.0666900212312620e-01 -3.1132231340938132e-01 -2.8990496353476853e+00 -1.9626940937370080e-01 -6.2104684913469443e-01 -1.5865889277994909e+00 -3.6188138448422091e-01 3.0013803267896261e-01 1.4197283614732141e+00 1.2729521424635740e-01 1.6388084521147881e+00 3.3182612573500947e-01 2.2801216176871031e+00 -1.4305145042042573e+00 -8.3660119236449546e-02 -2.0607177490813289e+00 -1.3198591104047965e+00 -2.6982481505430483e-01 -1.2961190921410848e+00 1.4016502327985998e+00 1.0360051724073011e-01 1.4754255801534821e+00 1.5785935376958227e+00 3.0666900212312620e-01 3.6836205683325343e+00 -1.8288605327810736e+00 -2.2128775132224277e-01 -3.8359193019503555e+00 -1.4462314513554433e+00 -3.1632795740077468e-01 -2.2788767493663022e+00 1.4064133761363604e+00 1.4900499791490590e-01 2.0324651263659521e+00 -4.2458991593721498e+00 -4.2425517287238773e-01 -1.8220275172648555e+00 4.5730990689021755e+00 7.7396322114580956e-03 1.6795502792186496e+00 3.5819989804404289e+00 4.1228551579626938e-01 1.4033606880615672e+00 -3.4025727424199737e+00 1.3133585891278944e-02 -1.7104912316184933e+00 -6.2749719816471430e+00 -3.1132231340938127e-01 -1.8288605327810739e+00 6.0993779934096084e+00 1.9737349752294007e-03 2.0027167221778153e+00 4.1779987106171816e+00 2.7273306539634645e-01 1.7574875961941943e+00 -4.5090308699301307e+00 2.7711952011187199e-02 -1.4817360039878069e+00 -1.6236878559806450e-01 -1.4577707773938875e+00 -1.0610611693735242e-01 -1.8678910129952435e-03 1.4547945405226577e+00 3.9787346136913255e-04 1.4490958982409510e-01 7.0594774036121100e-01 9.8981252221392410e-02 2.5184511848551767e-02 -7.2964797789095659e-01 1.5079489815283320e-02 -3.5116429800328286e-01 -2.8990496353476853e+00 -2.2128775132224277e-01 1.9737349752293816e-03 2.9467223531082953e+00 -5.6235706568315324e-04 3.0816927693193458e-01 1.4308117389062194e+00 1.9520837129193119e-01 3.5163861034531792e-02 -1.4518079822658545e+00 1.8289238535302430e-02 -1.8157697416909131e+00 -2.7419839191176976e-01 -2.6411276293070913e+00 1.6604881216300855e+00 5.2907535293008597e-03 2.3070197908885146e+00 1.6757543527913554e+00 2.6983525036420464e-01 1.5034506416817046e+00 -1.7255256480532162e+00 7.4284764070777698e-03 -1.8343399496959201e+00 -1.7912655665241968e+00 -1.9626940937370083e-01 -3.8359193019503555e+00 2.0027167221778153e+00 -5.6235706568315237e-04 4.2175878629855079e+00 1.7598086175040604e+00 1.7420573583908036e-01 2.5692695462010589e+00 -1.7662068578349914e+00 1.4269942211490395e-02 -2.2859409608034205e+00 -3.2896310853199662e+00 -5.6057064378850052e-01 -1.6670493309077514e+00 3.5713655638118054e+00 1.7650220223255109e-01 1.4022822535383697e+00 4.4054984354211211e+00 6.1205513972869041e-01 1.6221052091894579e+00 -4.1950473196396274e+00 -1.6960561646331773e-01 -1.7931627893697848e+00 -4.3773679531716230e+00 -6.2104684913469443e-01 -1.4462314513554433e+00 4.1779987106171816e+00 3.0816927693193458e-01 1.7598086175040604e+00 5.8962189544424923e+00 6.3268683750622789e-01 1.9355739642556180e+00 -6.1890353061613856e+00 -3.7819034701289100e-01 -1.8133264728545293e+00 -5.6768732637063613e-01 -8.5420772722542204e-01 -3.6860637941842805e-01 4.5264269448474115e-01 7.0873211308503647e-01 1.9022990473394441e-01 6.1375416312537823e-01 1.5538150418424286e+00 3.3097329797782893e-01 -4.2676258478721085e-01 -1.4327917195289588e+00 -2.7430154711877203e-01 -6.4164414632255795e-01 -1.5865889277994911e+00 -3.1632795740077468e-01 2.7273306539634640e-01 1.4308117389062194e+00 1.7420573583908036e-01 6.3268683750622778e-01 3.0281619087778671e+00 4.0997853330741774e-01 -3.3572270303228890e-01 -2.8479324280576801e+00 -1.4615158792029728e-01 -1.6809298548107126e+00 -3.6698360313755629e-01 -1.8252241442697799e+00 1.6884235821316944e+00 7.1771780695593562e-02 1.5062315230855046e+00 1.6074872170496459e+00 3.2740685985858875e-01 2.2607500666353513e+00 -1.8124637748006034e+00 -1.1052164502319055e-01 -2.6032073673444591e+00 -1.7190458837261364e+00 -3.6188138448422091e-01 -2.2788767493663022e+00 1.7574875961941943e+00 1.9520837129193114e-01 2.5692695462010589e+00 1.9355739642556180e+00 4.0997853330741774e-01 4.1419156908907029e+00 -1.7765328462937005e+00 -1.6497891250856331e-01 -3.7708585658320777e+00 3.5503076401822491e+00 4.4887347315838444e-01 1.6837534651832406e+00 -3.9365339236090509e+00 7.1058096531071667e-03 -1.3626164214626244e+00 -4.7760566808675797e+00 -4.7514441234913901e-01 -1.4161569483438250e+00 4.5160971888879455e+00 8.9882584368096048e-03 1.6358344354698844e+00 4.6830053794713749e+00 3.0013803267896261e-01 1.4064133761363604e+00 -4.5090308699301307e+00 3.5163861034531785e-02 -1.7662068578349914e+00 -6.1890353061613848e+00 -3.3572270303228890e-01 -1.7765328462937007e+00 6.6612465720265792e+00 1.0597680419632001e-02 1.5955117971456587e+00 1.6625514295208776e-01 6.8283235903102435e-01 6.5836141283331137e-02 1.4591305502007830e-02 -7.3056474336161015e-01 7.2470097215128022e-03 -1.8719404466821030e-01 -1.4341577588233034e+00 -7.7120918215966588e-02 -1.4567459410255879e-03 1.4167244569883080e+00 -6.4343761660978489e-04 3.4768505673721195e-01 1.4197283614732141e+00 1.4900499791490590e-01 2.7711952011187199e-02 -1.4518079822658545e+00 1.4269942211490388e-02 -3.7819034701289089e-01 -2.8479324280576801e+00 -1.6497891250856331e-01 1.0597680419632011e-02 2.9451777350159012e+00 6.3851772098994482e-03 1.3916669929853205e+00 1.8552649890765158e-01 1.4728344395327948e+00 -1.3477164902955328e+00 4.0528115331118705e-03 -1.3036601674616199e+00 -1.4058744003633292e+00 -1.9990359385306225e-01 -2.0249358119449266e+00 1.6601165819470136e+00 4.5062413410366401e-03 2.2505451352365875e+00 1.4013579954232054e+00 1.2729521424635742e-01 2.0324651263659521e+00 -1.4817360039878069e+00 1.8289238535302423e-02 -2.2859409608034205e+00 -1.8133264728545291e+00 -1.4615158792029723e-01 -3.7708585658320777e+00 1.5955117971456589e+00 6.3851772098994517e-03 3.6295508049067120e+00 21 22 23 81 82 83 96 97 98 36 37 38 24 25 26 84 85 86 99 100 101 39 40 41 6.1637556419986304e+00 1.2993445354000912e+00 1.9973658274323132e+00 -6.5055239578715014e+00 -1.1120506270183450e+00 -1.8960468238618773e+00 -4.4422614856518177e+00 -1.2177064851231443e+00 -1.4680824163405903e+00 4.3434724412120991e+00 9.3082248858279759e-01 1.8114317527556454e+00 4.3865557979012957e+00 1.1885611696471885e+00 1.6072530674357983e+00 -4.2940399799021760e+00 -7.6630225099660365e-01 -1.8056811751926574e+00 -3.1979425536526964e+00 -1.0640573658483790e+00 -1.6206726077792071e+00 3.5459840959661686e+00 7.4138853535639537e-01 1.3744323755505767e+00 1.2993445354000908e+00 3.6773320800449998e+00 8.5539115158843337e-01 -1.1175696757366784e+00 -3.3537443393669730e+00 -5.7108734592564581e-01 -1.2539624453186147e+00 -2.0579476840352364e+00 -6.3064517081378890e-01 9.2437719341388191e-01 1.7822215379529809e+00 5.8525032822662726e-01 1.1947556063765099e+00 1.9966542027924146e+00 6.6061677672904251e-01 -1.0342452670094813e+00 -1.7801153774048191e+00 -6.6760264160976801e-01 -1.0625779727054838e+00 -1.2332486609309787e+00 -7.0750037904015228e-01 1.0498780255797748e+00 9.6884824094761168e-01 4.7557728084525230e-01 1.9973658274323132e+00 8.5539115158843326e-01 4.4333982174962818e+00 -1.9026020233117138e+00 -5.7017902959075784e-01 -4.0325293401859987e+00 -1.7466635405576427e+00 -7.2631086866450678e-01 -2.3925203507040274e+00 1.8233655524642638e+00 5.9475582681694139e-01 2.6822955656606715e+00 1.5962346551833269e+00 6.5157931178349193e-01 2.3550068973465157e+00 -1.8394197135007664e+00 -5.0599048610366715e-01 -2.7122506009902065e+00 -1.6200011659382905e+00 -7.0818972360904664e-01 -1.8487715347894094e+00 1.6917204082285093e+00 4.0894381777911193e-01 1.5153711461661739e+00 -6.5055239578715023e+00 -1.1175696757366786e+00 -1.9026020233117138e+00 7.0328323704862674e+00 8.4956762394689600e-01 1.7309247691787955e+00 4.8765505719932776e+00 1.0268690872231336e+00 1.4601391760169988e+00 -4.7964407546949124e+00 -6.9327581526202120e-01 -1.8524008899549229e+00 -4.8531364912393533e+00 -1.1381724933747599e+00 -1.4579403337550452e+00 4.7226231123080460e+00 6.7348152523042593e-01 1.7109765330248825e+00 3.5609895645406855e+00 1.0400308908481497e+00 1.6782337932681701e+00 -4.0378944155225076e+00 -6.4093114287514552e-01 -1.3673310244671666e+00 -1.1120506270183452e+00 -3.3537443393669730e+00 -5.7017902959075784e-01 8.4956762394689600e-01 3.2588743007206675e+00 3.7396633085760589e-01 1.0297223576977790e+00 1.8083736455131629e+00 4.4699376753373177e-01 -6.7784823915662540e-01 -1.6764906956857539e+00 -3.8263997284866880e-01 -8.8263158905394412e-01 -1.8002234286068586e+00 -3.8455875738020812e-01 6.9923419485305693e-01 1.6643687717665321e+00 3.7272756124969864e-01 7.6795714623638445e-01 1.0027106853113474e+00 4.2475525940843767e-01 -6.7395086750520172e-01 -9.0386893965212445e-01 -2.8106515922983916e-01 -1.8960468238618773e+00 -5.7108734592564592e-01 -4.0325293401859996e+00 1.7309247691787955e+00 3.7396633085760578e-01 3.8334628921066978e+00 1.4817348063319888e+00 4.5313851560686580e-01 2.1754816008127134e+00 -1.5962737144774612e+00 -3.3823916103709450e-01 -2.4186517271373087e+00 -1.4357262049915003e+00 -4.8797226648992670e-01 -2.1462825727627495e+00 1.7176051502724716e+00 3.6001866825225082e-01 2.3951120647131097e+00 1.3981242296608520e+00 4.8388987986968918e-01 1.5514264940628806e+00 -1.4003422121132687e+00 -2.7371462113374467e-01 -1.3580194116093445e+00 -4.4422614856518177e+00 -1.2539624453186149e+00 -1.7466635405576427e+00 4.8765505719932776e+00 1.0297223576977790e+00 1.4817348063319888e+00 6.6090046153071489e+00 1.4030028515436788e+00 1.5700567206334572e+00 -6.4726901436998148e+00 -1.0759955397669065e+00 -1.8189777453270866e+00 -3.6959521152709924e+00 -1.1733133068763932e+00 -1.2975629242229731e+00 3.5895181623411427e+00 7.4796733425668527e-01 1.6527752057458431e+00 4.3352315317974188e+00 1.1589505941302143e+00 1.5368543499126837e+00 -4.7994011368163623e+00 -8.3637184566644285e-01 -1.3782168725162711e+00 -1.2177064851231445e+00 -2.0579476840352364e+00 -7.2631086866450678e-01 1.0268690872231336e+00 1.8083736455131634e+00 4.5313851560686580e-01 1.4030028515436790e+00 3.6508111737262849e+00 6.2487651421197765e-01 -1.0640456321114768e+00 -3.3609403150488619e+00 -5.9054294801110774e-01 -1.1902802172009317e+00 -1.2454887315180929e+00 -5.2840710243332345e-01 9.9734675262836625e-01 9.9675103441202517e-01 6.0626991157308341e-01 1.1711130465705488e+00 2.0050748965144725e+00 6.3535905302523810e-01 -1.1262994035301741e+00 -1.7966340195637545e+00 -4.7438307530822743e-01 -1.4680824163405903e+00 -6.3064517081378890e-01 -2.3925203507040274e+00 1.4601391760169986e+00 4.4699376753373182e-01 2.1754816008127134e+00 1.5700567206334570e+00 6.2487651421197765e-01 3.7919045611716165e+00 -1.8367516950952387e+00 -6.0241543408101617e-01 -4.0017237362525009e+00 -1.2860717428545065e+00 -5.1626270052752765e-01 -1.3385666581844657e+00 1.3983787529241334e+00 3.9221773007863270e-01 1.5481363669155148e+00 1.5668653051541876e+00 6.4013266602056040e-01 2.3392423600518657e+00 -1.4045341004384406e+00 -3.5489737242256991e-01 -2.1219541438107163e+00 4.3434724412120982e+00 9.2437719341388214e-01 1.8233655524642638e+00 -4.7964407546949124e+00 -6.7784823915662540e-01 -1.5962737144774615e+00 -6.4726901436998157e+00 -1.0640456321114768e+00 -1.8367516950952389e+00 6.4532903332736335e+00 7.5424443279720710e-01 2.0674693473558294e+00 3.5601406213196278e+00 9.8536672390600111e-01 1.4083560128816082e+00 -3.5084935367356156e+00 -5.7767365159221340e-01 -1.7513046195586144e+00 -4.2301102587830215e+00 -1.0026366466163048e+00 -1.7826080655094065e+00 4.6508312981080042e+00 6.5821581935953044e-01 1.6677471819390206e+00 9.3082248858279759e-01 1.7822215379529809e+00 5.9475582681694139e-01 -6.9327581526202131e-01 -1.6764906956857539e+00 -3.3823916103709450e-01 -1.0759955397669065e+00 -3.3609403150488619e+00 -6.0241543408101628e-01 7.5424443279720688e-01 3.3016522892772473e+00 4.6739733277234202e-01 7.6662039309625951e-01 9.7862175738133850e-01 4.0414817717309381e-01 -5.9657695675134614e-01 -8.9278926427484373e-01 -3.8198078938523256e-01 -7.6715992312003678e-01 -1.7869613822004871e+00 -5.0160540652151064e-01 6.8132092042404668e-01 1.6546860725983807e+00 3.5793945426247703e-01 1.8114317527556454e+00 5.8525032822662737e-01 2.6822955656606715e+00 -1.8524008899549227e+00 -3.8263997284866880e-01 -2.4186517271373087e+00 -1.8189777453270866e+00 -5.9054294801110763e-01 -4.0017237362525009e+00 2.0674693473558294e+00 4.6739733277234202e-01 4.4163130600275675e+00 1.6311114047978235e+00 5.8944392820272329e-01 1.5228677534296522e+00 -1.7264253543063515e+00 -3.6464009347518961e-01 -1.8703606497023464e+00 -1.7441800546157415e+00 -6.4230045068962460e-01 -2.6703477241917977e+00 1.6319715392948035e+00 3.3803187582289834e-01 2.3396074581660633e+00 4.3865557979012957e+00 1.1947556063765097e+00 1.5962346551833269e+00 -4.8531364912393533e+00 -8.8263158905394412e-01 -1.4357262049915005e+00 -3.6959521152709924e+00 -1.1902802172009317e+00 -1.2860717428545065e+00 3.5601406213196283e+00 7.6662039309625951e-01 1.6311114047978235e+00 6.5237944509911676e+00 1.3575510388156311e+00 1.5582615238901558e+00 -6.3350944746280877e+00 -1.0347603993268395e+00 -1.7983510406907794e+00 -4.2794575085190916e+00 -1.1894368686364696e+00 -1.6564567326634654e+00 4.6931497194454348e+00 9.7818203592978459e-01 1.3909981373289471e+00 1.1885611696471885e+00 1.9966542027924146e+00 6.5157931178349204e-01 -1.1381724933747599e+00 -1.8002234286068588e+00 -4.8797226648992670e-01 -1.1733133068763932e+00 -1.2454887315180927e+00 -5.1626270052752765e-01 9.8536672390600111e-01 9.7862175738133850e-01 5.8944392820272329e-01 1.3575510388156315e+00 3.6119299410372872e+00 6.1204240228022444e-01 -1.0102784724515115e+00 -3.2813017390106936e+00 -5.6883777946705005e-01 -1.1481005185178488e+00 -2.0036515915311495e+00 -6.8312891493271410e-01 9.3838585885169212e-01 1.7434595894557547e+00 4.0313601915077946e-01 1.6072530674357983e+00 6.6061677672904251e-01 2.3550068973465157e+00 -1.4579403337550452e+00 -3.8455875738020812e-01 -2.1462825727627490e+00 -1.2975629242229731e+00 -5.2840710243332345e-01 -1.3385666581844657e+00 1.4083560128816082e+00 4.0414817717309381e-01 1.5228677534296522e+00 1.5582615238901560e+00 6.1204240228022444e-01 3.7813231405692127e+00 -1.8174776940117914e+00 -5.8785045238741374e-01 -3.9458912195434457e+00 -1.4092791856097364e+00 -6.0233042422055372e-01 -2.3345890565560867e+00 1.4083895333919842e+00 4.2633938023913853e-01 2.1061317157013697e+00 -4.2940399799021760e+00 -1.0342452670094813e+00 -1.8394197135007664e+00 4.7226231123080460e+00 6.9923419485305705e-01 1.7176051502724716e+00 3.5895181623411427e+00 9.9734675262836625e-01 1.3983787529241336e+00 -3.5084935367356156e+00 -5.9657695675134614e-01 -1.7264253543063515e+00 -6.3350944746280886e+00 -1.0102784724515117e+00 -1.8174776940117916e+00 6.2667693472644883e+00 7.0530627174630245e-01 2.0388544720704194e+00 4.2000205248017144e+00 8.5374986460878033e-01 1.7281380674367885e+00 -4.6413031554495117e+00 -6.1453638762416707e-01 -1.4996536808849048e+00 -7.6630225099660365e-01 -1.7801153774048191e+00 -5.0599048610366704e-01 6.7348152523042604e-01 1.6643687717665321e+00 3.6001866825225087e-01 7.4796733425668527e-01 9.9675103441202517e-01 3.9221773007863270e-01 -5.7767365159221329e-01 -8.9278926427484373e-01 -3.6464009347518955e-01 -1.0347603993268397e+00 -3.2813017390106931e+00 -5.8785045238741374e-01 7.0530627174630223e-01 3.1869535359282199e+00 4.4345862971605815e-01 8.8653501780675970e-01 1.7471723751744515e+00 5.6329290892296258e-01 -6.3455384712451635e-01 -1.6410393365908729e+00 -3.0050690500363419e-01 -1.8056811751926574e+00 -6.6760264160976801e-01 -2.7122506009902065e+00 1.7109765330248825e+00 3.7272756124969858e-01 2.3951120647131101e+00 1.6527752057458429e+00 6.0626991157308341e-01 1.5481363669155148e+00 -1.7513046195586144e+00 -3.8198078938523267e-01 -1.8703606497023464e+00 -1.7983510406907794e+00 -5.6883777946704983e-01 -3.9458912195434457e+00 2.0388544720704189e+00 4.4345862971605821e-01 4.3178180930093184e+00 1.7455738509527374e+00 5.4916808777551851e-01 2.6227698075823755e+00 -1.7928432263518306e+00 -3.5320297985230820e-01 -2.3553338619843207e+00 -3.1979425536526964e+00 -1.0625779727054838e+00 -1.6200011659382905e+00 3.5609895645406855e+00 7.6795714623638445e-01 1.3981242296608520e+00 4.3352315317974197e+00 1.1711130465705488e+00 1.5668653051541876e+00 -4.2301102587830215e+00 -7.6715992312003667e-01 -1.7441800546157418e+00 -4.2794575085190925e+00 -1.1481005185178488e+00 -1.4092791856097364e+00 4.2000205248017144e+00 8.8653501780675970e-01 1.7455738509527374e+00 5.8838328043829096e+00 1.2036135910172376e+00 1.8527176158119067e+00 -6.2725641045679179e+00 -1.0513803872875611e+00 -1.7898205954159170e+00 -1.0640573658483792e+00 -1.2332486609309785e+00 -7.0818972360904675e-01 1.0400308908481495e+00 1.0027106853113477e+00 4.8388987986968923e-01 1.1589505941302141e+00 2.0050748965144725e+00 6.4013266602056051e-01 -1.0026366466163048e+00 -1.7869613822004871e+00 -6.4230045068962460e-01 -1.1894368686364696e+00 -2.0036515915311495e+00 -6.0233042422055372e-01 8.5374986460878033e-01 1.7471723751744515e+00 5.4916808777551851e-01 1.2036135910172374e+00 3.5595916028660461e+00 7.8876917890342879e-01 -1.0002140595032274e+00 -3.2906879252037022e+00 -5.0913921404997287e-01 -1.6206726077792071e+00 -7.0750037904015228e-01 -1.8487715347894094e+00 1.6782337932681703e+00 4.2475525940843767e-01 1.5514264940628806e+00 1.5368543499126837e+00 6.3535905302523799e-01 2.3392423600518653e+00 -1.7826080655094065e+00 -5.0160540652151064e-01 -2.6703477241917977e+00 -1.6564567326634654e+00 -6.8312891493271410e-01 -2.3345890565560867e+00 1.7281380674367885e+00 5.6329290892296258e-01 2.6227698075823751e+00 1.8527176158119067e+00 7.8876917890342890e-01 4.2585257429946450e+00 -1.7362064204774699e+00 -5.1994169976569049e-01 -3.9182560891544762e+00 3.5459840959661681e+00 1.0498780255797748e+00 1.6917204082285093e+00 -4.0378944155225076e+00 -6.7395086750520172e-01 -1.4003422121132683e+00 -4.7994011368163623e+00 -1.1262994035301741e+00 -1.4045341004384404e+00 4.6508312981080042e+00 6.8132092042404679e-01 1.6319715392948035e+00 4.6931497194454348e+00 9.3838585885169201e-01 1.4083895333919842e+00 -4.6413031554495117e+00 -6.3455384712451646e-01 -1.7928432263518308e+00 -6.2725641045679179e+00 -1.0002140595032272e+00 -1.7362064204774699e+00 6.8611976988366932e+00 7.6543337280760615e-01 1.6018444784657140e+00 7.4138853535639526e-01 9.6884824094761168e-01 4.0894381777911187e-01 -6.4093114287514552e-01 -9.0386893965212445e-01 -2.7371462113374467e-01 -8.3637184566644285e-01 -1.7966340195637545e+00 -3.5489737242256991e-01 6.5821581935953033e-01 1.6546860725983807e+00 3.3803187582289829e-01 9.7818203592978459e-01 1.7434595894557545e+00 4.2633938023913853e-01 -6.1453638762416718e-01 -1.6410393365908729e+00 -3.5320297985230820e-01 -1.0513803872875613e+00 -3.2906879252037027e+00 -5.1994169976569060e-01 7.6543337280760637e-01 3.2652363180087072e+00 3.2844159933316497e-01 1.3744323755505765e+00 4.7557728084525230e-01 1.5153711461661736e+00 -1.3673310244671666e+00 -2.8106515922983921e-01 -1.3580194116093447e+00 -1.3782168725162711e+00 -4.7438307530822743e-01 -2.1219541438107163e+00 1.6677471819390206e+00 3.5793945426247697e-01 2.3396074581660633e+00 1.3909981373289471e+00 4.0313601915077940e-01 2.1061317157013693e+00 -1.4996536808849044e+00 -3.0050690500363419e-01 -2.3553338619843203e+00 -1.7898205954159172e+00 -5.0913921404997287e-01 -3.9182560891544762e+00 1.6018444784657140e+00 3.2844159933316491e-01 3.7924531865252509e+00 81 82 83 141 142 143 156 157 158 96 97 98 84 85 86 144 145 146 159 160 161 99 100 101 5.6287327577281401e+00 1.2138016834081278e+00 1.8468378963985226e+00 -5.9629984610836031e+00 -1.0240126300141463e+00 -1.7463615153820111e+00 -4.0540885709615653e+00 -1.1426234987129100e+00 -1.3330068698348339e+00 3.9558537334192683e+00 8.5140029809956985e-01 1.6817708382280407e+00 4.0305854828829037e+00 1.1170905503015369e+00 1.4798478073023678e+00 -3.9420113442323803e+00 -6.9316993685802530e-01 -1.6796553632107134e+00 -2.9134825688243118e+00 -9.9614912513669296e-01 -1.5037394107054396e+00 3.2574089710715515e+00 6.7366265891253974e-01 1.2543066172040667e+00 1.2138016834081278e+00 3.4045553793439005e+00 8.1505494105860554e-01 -1.0338551525122186e+00 -3.0614123551580321e+00 -5.2172143376615088e-01 -1.1812427612315781e+00 -1.9031640216321242e+00 -5.8982911182528586e-01 8.4965523578074320e-01 1.6156516722832044e+00 5.4646282392915169e-01 1.1232496408461401e+00 1.8658561968875529e+00 6.2319107703685561e-01 -9.6171836974300118e-01 -1.6438769094565566e+00 -6.3149274625078722e-01 -9.9475178650969043e-01 -1.1595262859485893e+00 -6.7747308241022053e-01 9.8486150996147781e-01 8.8191632368064454e-01 4.3580753222783175e-01 1.8468378963985224e+00 8.1505494105860554e-01 4.1062224220383214e+00 -1.7532321049769373e+00 -5.1859292906321586e-01 -3.6868890211681467e+00 -1.6148876279182800e+00 -6.8860973613595744e-01 -2.1806943458937749e+00 1.6918515718684255e+00 5.5270819691737272e-01 2.4795711311945690e+00 1.4660092411432855e+00 6.1274803892779683e-01 2.1686601970973056e+00 -1.7120509885972766e+00 -4.6584706911888291e-01 -2.5389098107920200e+00 -1.4991165329981304e+00 -6.7635246225280921e-01 -1.7332473519554916e+00 1.5745885450803909e+00 3.6889101966709054e-01 1.3852867794792370e+00 -5.9629984610836049e+00 -1.0338551525122186e+00 -1.7532321049769377e+00 6.5045036928862690e+00 7.5362842153793230e-01 1.5742029712098973e+00 4.4903256551299355e+00 9.5310392324648618e-01 1.3220355412978753e+00 -4.4135174936711090e+00 -6.0944736436892089e-01 -1.7255057140419092e+00 -4.5024765050890894e+00 -1.0665779518374332e+00 -1.3220886881228706e+00 4.3717497751006258e+00 5.9562462462703725e-01 1.5826629999874307e+00 3.2727375639803125e+00 9.7493193556175251e-01 1.5637799806373547e+00 -3.7603242272533421e+00 -5.6740843625463533e-01 -1.2418549859908403e+00 -1.0240126300141463e+00 -3.0614123551580317e+00 -5.1859292906321586e-01 7.5362842153793230e-01 2.9757478521159806e+00 3.2460324284676340e-01 9.4994961437691061e-01 1.6398906686759591e+00 4.0253134541731056e-01 -5.9331314389650047e-01 -1.5144745113323883e+00 -3.3718263883740307e-01 -8.0506023834150142e-01 -1.6593591184179846e+00 -3.4198064778882381e-01 6.1797227770101248e-01 1.5278401537440651e+00 3.2879614157518422e-01 6.9686013363659005e-01 9.1459622334955559e-01 3.8343764313173206e-01 -5.9602443500029711e-01 -8.2282891297715577e-01 -2.4161215728154756e-01 -1.7463615153820113e+00 -5.2172143376615088e-01 -3.6868890211681475e+00 1.5742029712098973e+00 3.2460324284676345e-01 3.4939965159296795e+00 1.3424494330830055e+00 4.1105367746230481e-01 1.9615203690203236e+00 -1.4614226848453462e+00 -2.9398963566767233e-01 -2.2076985344110631e+00 -1.3020311857068132e+00 -4.4593292208468815e-01 -1.9599255169299061e+00 1.5911493597086588e+00 3.1822574635900619e-01 2.2084297709519740e+00 1.2770424566796788e+00 4.4390071072980947e-01 1.4220816004163028e+00 -1.2750288347470700e+00 -2.3613938587937247e-01 -1.2315151838091636e+00 -4.0540885709615653e+00 -1.1812427612315781e+00 -1.6148876279182800e+00 4.4903256551299364e+00 9.4994961437691061e-01 1.3424494330830052e+00 6.0359314595407216e+00 1.3196282929880059e+00 1.4133952209798482e+00 -5.8949193218910709e+00 -9.8378821860486276e-01 -1.6704778988644238e+00 -3.4115581415713914e+00 -1.1077713251786545e+00 -1.1713139802265073e+00 3.3031626116492072e+00 6.7768338371752557e-01 1.5335199715740737e+00 3.9667272338371555e+00 1.0879806032605417e+00 1.4119315863694000e+00 -4.4355809257329941e+00 -7.6243958932788758e-01 -1.2446167049971157e+00 -1.1426234987129100e+00 -1.9031640216321242e+00 -6.8860973613595744e-01 9.5310392324648618e-01 1.6398906686759591e+00 4.1105367746230470e-01 1.3196282929880061e+00 3.3405028916219552e+00 5.7531946666217415e-01 -9.7783561084543358e-01 -3.0344058417244093e+00 -5.4845313592565959e-01 -1.1255236691454393e+00 -1.1698761473927239e+00 -4.8867978034993420e-01 9.2936122476498195e-01 9.1016075669334795e-01 5.7360512745798398e-01 1.1006266097034019e+00 1.8597391814573401e+00 5.9884665263381642e-01 -1.0567372719990935e+00 -1.6428474876993442e+00 -4.3308227180472808e-01 -1.3330068698348339e+00 -5.8982911182528586e-01 -2.1806943458937749e+00 1.3220355412978753e+00 4.0253134541731056e-01 1.9615203690203233e+00 1.4133952209798479e+00 5.7531946666217437e-01 3.4196075774719894e+00 -1.6844610408384004e+00 -5.5592483500804046e-01 -3.6232964892167150e+00 -1.1614277628136991e+00 -4.7690713816517194e-01 -1.2119949284585660e+00 1.2766969003577877e+00 3.5735994503482638e-01 1.4180051885472933e+00 1.4397206196988117e+00 6.0261485546399496e-01 2.1401439270442468e+00 -1.2729526088473899e+00 -3.1516452757980812e-01 -1.9232912985147976e+00 3.9558537334192683e+00 8.4965523578074320e-01 1.6918515718684255e+00 -4.4135174936711090e+00 -5.9331314389650047e-01 -1.4614226848453462e+00 -5.8949193218910718e+00 -9.7783561084543336e-01 -1.6844610408384006e+00 5.8847628707623088e+00 6.6078451579537911e-01 1.9215554085640776e+00 3.2741236431996996e+00 9.1669043978300313e-01 1.2863401688760978e+00 -3.2269947468928963e+00 -5.0579211867476259e-01 -1.6352049806664868e+00 -3.8658942292299527e+00 -9.3146311999886544e-01 -1.6615945596133148e+00 4.2865855443037537e+00 5.8127380205643653e-01 1.5429361166549471e+00 8.5140029809956996e-01 1.6156516722832044e+00 5.5270819691737272e-01 -6.0944736436892100e-01 -1.5144745113323883e+00 -2.9398963566767233e-01 -9.8378821860486276e-01 -3.0344058417244093e+00 -5.5592483500804046e-01 6.6078451579537911e-01 2.9873392231113494e+00 4.1551715590952526e-01 6.9293439612033447e-01 8.9085596634239261e-01 3.6748145337201443e-01 -5.2197189527622045e-01 -8.1342371197842223e-01 -3.3988857057278216e-01 -6.9088874311932502e-01 -1.6352407701053588e+00 -4.6118575127291644e-01 6.0097701135404602e-01 1.5036979734036329e+00 3.1528198632249899e-01 1.6817708382280407e+00 5.4646282392915169e-01 2.4795711311945694e+00 -1.7255057140419094e+00 -3.3718263883740313e-01 -2.2076985344110631e+00 -1.6704778988644240e+00 -5.4845313592565970e-01 -3.6232964892167145e+00 1.9215554085640780e+00 4.1551715590952526e-01 4.0573028980293833e+00 1.5142115411623862e+00 5.5682046964550813e-01 1.3938654195442628e+00 -1.6108006912405419e+00 -3.2444945482364834e-01 -1.7549389629796419e+00 -1.6188322202869685e+00 -6.0649114085905020e-01 -2.4855565841547924e+00 1.5080787364793391e+00 2.9777592096157607e-01 2.1407511219939979e+00 4.0305854828829046e+00 1.1232496408461401e+00 1.4660092411432857e+00 -4.5024765050890894e+00 -8.0506023834150142e-01 -1.3020311857068130e+00 -3.4115581415713914e+00 -1.1255236691454393e+00 -1.1614277628136993e+00 3.2741236431996996e+00 6.9293439612033447e-01 1.5142115411623862e+00 6.0810700246785494e+00 1.2839096588558172e+00 1.4158019147152066e+00 -5.8872144480741841e+00 -9.5975673110464621e-01 -1.6597274708774170e+00 -3.9461993205112531e+00 -1.1223753661143281e+00 -1.5363183625593475e+00 4.3616692644847648e+00 9.1262230888362295e-01 1.2634820849363977e+00 1.1170905503015371e+00 1.8658561968875529e+00 6.1274803892779683e-01 -1.0665779518374334e+00 -1.6593591184179843e+00 -4.4593292208468815e-01 -1.1077713251786545e+00 -1.1698761473927239e+00 -4.7690713816517194e-01 9.1669043978300313e-01 8.9085596634239261e-01 5.5682046964550813e-01 1.2839096588558170e+00 3.4048939358843726e+00 5.6741318416791131e-01 -9.2872211358188361e-01 -3.0596706545563559e+00 -5.2709510655163228e-01 -1.0800345305051449e+00 -1.8862737653187955e+00 -6.4962701605512108e-01 8.6541527216275882e-01 1.6135735865715413e+00 3.6258049011539734e-01 1.4798478073023678e+00 6.2319107703685561e-01 2.1686601970973052e+00 -1.3220886881228706e+00 -3.4198064778882381e-01 -1.9599255169299059e+00 -1.1713139802265073e+00 -4.8867978034993426e-01 -1.2119949284585660e+00 1.2863401688760978e+00 3.6748145337201443e-01 1.3938654195442626e+00 1.4158019147152066e+00 5.6741318416791109e-01 3.5160457733564883e+00 -1.6831457257897000e+00 -5.5094685639529584e-01 -3.6747096088352915e+00 -1.2852759059172723e+00 -5.6489470679439824e-01 -2.1653104646791501e+00 1.2798344091626788e+00 3.8841627675167101e-01 1.9333691289048569e+00 -3.9420113442323812e+00 -9.6171836974300107e-01 -1.7120509885972770e+00 4.3717497751006258e+00 6.1797227770101248e-01 1.5911493597086588e+00 3.3031626116492072e+00 9.2936122476498195e-01 1.2766969003577879e+00 -3.2269947468928963e+00 -5.2197189527622057e-01 -1.6108006912405417e+00 -5.8872144480741833e+00 -9.2872211358188372e-01 -1.6831457257897000e+00 5.8280817980464716e+00 6.2396465492160702e-01 1.9065013350087909e+00 3.8664585667221831e+00 7.8178170043739437e-01 1.6089611130495181e+00 -4.3132322123190265e+00 -5.4066747922389058e-01 -1.3773113024972372e+00 -6.9316993685802530e-01 -1.6438769094565566e+00 -4.6584706911888285e-01 5.9562462462703714e-01 1.5278401537440651e+00 3.1822574635900625e-01 6.7768338371752568e-01 9.1016075669334784e-01 3.5735994503482638e-01 -5.0579211867476248e-01 -8.1342371197842223e-01 -3.2444945482364840e-01 -9.5975673110464621e-01 -3.0596706545563559e+00 -5.5094685639529606e-01 6.2396465492160702e-01 2.9780594515558598e+00 3.9763284696492829e-01 8.2007155154217326e-01 1.6192913171993295e+00 5.2925475034344416e-01 -5.5862542817090932e-01 -1.5183804032012675e+00 -2.6122990836437798e-01 -1.6796553632107132e+00 -6.3149274625078722e-01 -2.5389098107920200e+00 1.5826629999874307e+00 3.2879614157518422e-01 2.2084297709519740e+00 1.5335199715740735e+00 5.7360512745798398e-01 1.4180051885472933e+00 -1.6352049806664866e+00 -3.3988857057278216e-01 -1.7549389629796417e+00 -1.6597274708774166e+00 -5.2709510655163228e-01 -3.6747096088352920e+00 1.9065013350087907e+00 3.9763284696492829e-01 4.0659938849510135e+00 1.6246965746255353e+00 5.1095359898451120e-01 2.4612902563933834e+00 -1.6727930664412147e+00 -3.1251129160740604e-01 -2.1851607182367108e+00 -2.9134825688243118e+00 -9.9475178650969054e-01 -1.4991165329981304e+00 3.2727375639803125e+00 6.9686013363659005e-01 1.2770424566796790e+00 3.9667272338371555e+00 1.1006266097034019e+00 1.4397206196988115e+00 -3.8658942292299532e+00 -6.9088874311932491e-01 -1.6188322202869685e+00 -3.9461993205112531e+00 -1.0800345305051446e+00 -1.2852759059172720e+00 3.8664585667221831e+00 8.2007155154217326e-01 1.6246965746255353e+00 5.4170459153243096e+00 1.1268760598278476e+00 1.7191477817289331e+00 -5.7973931612984444e+00 -9.7875929457585231e-01 -1.6573827735305884e+00 -9.9614912513669296e-01 -1.1595262859485893e+00 -6.7635246225280921e-01 9.7493193556175251e-01 9.1459622334955570e-01 4.4390071072980947e-01 1.0879806032605417e+00 1.8597391814573403e+00 6.0261485546399507e-01 -9.3146311999886544e-01 -1.6352407701053588e+00 -6.0649114085905020e-01 -1.1223753661143281e+00 -1.8862737653187955e+00 -5.6489470679439835e-01 7.8178170043739426e-01 1.6192913171993295e+00 5.1095359898451120e-01 1.1268760598278476e+00 3.3318006848978494e+00 7.5405008126738005e-01 -9.2158268783764974e-01 -3.0443865855313308e+00 -4.6378093653943830e-01 -1.5037394107054398e+00 -6.7747308241022053e-01 -1.7332473519554918e+00 1.5637799806373547e+00 3.8343764313173206e-01 1.4220816004163028e+00 1.4119315863694000e+00 5.9884665263381642e-01 2.1401439270442468e+00 -1.6615945596133148e+00 -4.6118575127291644e-01 -2.4855565841547924e+00 -1.5363183625593471e+00 -6.4962701605512108e-01 -2.1653104646791501e+00 1.6089611130495181e+00 5.2925475034344416e-01 2.4612902563933834e+00 1.7191477817289329e+00 7.5405008126738005e-01 3.9849300789442315e+00 -1.6021681289071048e+00 -4.7730327763811470e-01 -3.6243314620087292e+00 3.2574089710715515e+00 9.8486150996147792e-01 1.5745885450803909e+00 -3.7603242272533421e+00 -5.9602443500029711e-01 -1.2750288347470702e+00 -4.4355809257329950e+00 -1.0567372719990940e+00 -1.2729526088473901e+00 4.2865855443037528e+00 6.0097701135404602e-01 1.5080787364793391e+00 4.3616692644847648e+00 8.6541527216275904e-01 1.2798344091626783e+00 -4.3132322123190265e+00 -5.5862542817090932e-01 -1.6727930664412147e+00 -5.7973931612984444e+00 -9.2158268783764985e-01 -1.6021681289071052e+00 6.4008667467437395e+00 6.8171602952966703e-01 1.4604409482203711e+00 6.7366265891253974e-01 8.8191632368064454e-01 3.6889101966709048e-01 -5.6740843625463533e-01 -8.2282891297715577e-01 -2.3613938587937244e-01 -7.6243958932788769e-01 -1.6428474876993442e+00 -3.1516452757980812e-01 5.8127380205643642e-01 1.5036979734036326e+00 2.9777592096157601e-01 9.1262230888362295e-01 1.6135735865715413e+00 3.8841627675167101e-01 -5.4066747922389069e-01 -1.5183804032012675e+00 -3.1251129160740604e-01 -9.7875929457585231e-01 -3.0443865855313312e+00 -4.7730327763811453e-01 6.8171602952966703e-01 3.0292555057532802e+00 2.8603526532436385e-01 1.2543066172040664e+00 4.3580753222783175e-01 1.3852867794792370e+00 -1.2418549859908403e+00 -2.4161215728154753e-01 -1.2315151838091636e+00 -1.2446167049971157e+00 -4.3308227180472808e-01 -1.9232912985147972e+00 1.5429361166549471e+00 3.1528198632249899e-01 2.1407511219939979e+00 1.2634820849363977e+00 3.6258049011539734e-01 1.9333691289048569e+00 -1.3773113024972372e+00 -2.6122990836437798e-01 -2.1851607182367108e+00 -1.6573827735305884e+00 -4.6378093653943830e-01 -3.6243314620087292e+00 1.4604409482203711e+00 2.8603526532436374e-01 3.5048916321913088e+00 36 37 38 96 97 98 111 112 113 51 52 53 39 40 41 99 100 101 114 115 116 54 55 56 5.2625211671188481e+00 1.6347190856205032e+00 1.6347190856205025e+00 -5.6452476391497139e+00 -1.5776116852571018e+00 -1.5776116852571025e+00 -3.6504386866527940e+00 -1.5007147169025787e+00 -1.1479276723008474e+00 3.6489421590497142e+00 1.3034467700720966e+00 1.4935905732153236e+00 3.6489421590497155e+00 1.4935905732153234e+00 1.3034467700720971e+00 -3.6504386866527949e+00 -1.1479276723008482e+00 -1.5007147169025781e+00 -2.5478809181311215e+00 -1.3007179652042347e+00 -1.3007179652042351e+00 2.9336004453681452e+00 1.0952156107568394e+00 1.0952156107568407e+00 1.6347190856205032e+00 4.0676773627564877e+00 1.1455849159223266e+00 -1.5924305083735069e+00 -3.6780566229468015e+00 -8.4355092650469499e-01 -1.5597112611977046e+00 -2.4660697923436437e+00 -7.9792981810943087e-01 1.3016624168471411e+00 2.1161930981803745e+00 8.5364491309436064e-01 1.5114306732606495e+00 2.4065218892784452e+00 8.6678700404235876e-01 -1.4148614814971061e+00 -2.1205603136441402e+00 -9.4257228476057819e-01 -1.3071736307780963e+00 -1.6382670296082014e+00 -9.2466796422771158e-01 1.4263647061181199e+00 1.3125614083274793e+00 6.4270416054336887e-01 1.6347190856205025e+00 1.1455849159223266e+00 4.0676773627564868e+00 -1.5924305083735064e+00 -8.4355092650469365e-01 -3.6780566229468028e+00 -1.4148614814971057e+00 -9.4257228476057797e-01 -2.1205603136441393e+00 1.5114306732606488e+00 8.6678700404235853e-01 2.4065218892784443e+00 1.3016624168471407e+00 8.5364491309436030e-01 2.1161930981803745e+00 -1.5597112611977042e+00 -7.9792981810943131e-01 -2.4660697923436437e+00 -1.3071736307780957e+00 -9.2466796422771091e-01 -1.6382670296082016e+00 1.4263647061181193e+00 6.4270416054336788e-01 1.3125614083274797e+00 -5.6452476391497139e+00 -1.5924305083735069e+00 -1.5924305083735064e+00 6.2552282214165267e+00 1.4450827812482847e+00 1.4450827812482858e+00 4.1364570189955563e+00 1.4557382985452669e+00 1.1593313393640556e+00 -4.1626832194339265e+00 -1.1967410729652201e+00 -1.5614551451294498e+00 -4.1626832194339283e+00 -1.5614551451294503e+00 -1.1967410729652204e+00 4.1364570189955581e+00 1.1593313393640570e+00 1.4557382985452663e+00 2.9386864042745646e+00 1.3960530499879984e+00 1.3960530499879988e+00 -3.4962145856646369e+00 -1.1055787426774286e+00 -1.1055787426774297e+00 -1.5776116852571014e+00 -3.6780566229468024e+00 -8.4355092650469343e-01 1.4450827812482847e+00 3.5002316816750128e+00 6.2186397989697662e-01 1.4610254396493327e+00 2.1587274077043404e+00 6.1955124313266352e-01 -1.1645243466489437e+00 -1.9263162501995328e+00 -6.5794213915073163e-01 -1.3311695622036734e+00 -2.1554843586557970e+00 -5.7870811830100943e-01 1.1965619526455655e+00 1.9273965665913453e+00 6.3807791042169704e-01 1.1315196538261481e+00 1.3531377536450861e+00 6.6137452583678269e-01 -1.1608842332596119e+00 -1.1796361778136522e+00 -4.6066647533168514e-01 -1.5776116852571025e+00 -8.4355092650469488e-01 -3.6780566229468028e+00 1.4450827812482856e+00 6.2186397989697684e-01 3.5002316816750145e+00 1.1965619526455666e+00 6.3807791042169792e-01 1.9273965665913437e+00 -1.3311695622036741e+00 -5.7870811830100988e-01 -2.1554843586557961e+00 -1.1645243466489448e+00 -6.5794213915073230e-01 -1.9263162501995348e+00 1.4610254396493341e+00 6.1955124313266485e-01 2.1587274077043417e+00 1.1315196538261489e+00 6.6137452583678302e-01 1.3531377536450868e+00 -1.1608842332596132e+00 -4.6066647533168503e-01 -1.1796361778136535e+00 -3.6504386866527936e+00 -1.5597112611977049e+00 -1.4148614814971052e+00 4.1364570189955563e+00 1.4610254396493327e+00 1.1965619526455666e+00 5.5570693196019514e+00 1.7487221288561665e+00 1.2063755033543817e+00 -5.5216571445996667e+00 -1.5045789557501899e+00 -1.4552685894631396e+00 -2.9951277905290437e+00 -1.4593461601262521e+00 -1.0199137865677399e+00 2.9876584801970876e+00 1.1279533984862076e+00 1.3538252522464176e+00 3.5352474941243481e+00 1.4196812483325256e+00 1.2011663644450716e+00 -4.0492086911374399e+00 -1.2337458382500845e+00 -1.0678852151634528e+00 -1.5007147169025785e+00 -2.4660697923436437e+00 -9.4257228476057775e-01 1.4557382985452665e+00 2.1587274077043404e+00 6.3807791042169792e-01 1.7487221288561665e+00 3.9605634789456396e+00 7.7461779046730361e-01 -1.4918513920556371e+00 -3.5965186652816463e+00 -8.1930767919827674e-01 -1.4878701158838576e+00 -1.6614873446909257e+00 -6.6507071634929282e-01 1.3538252522464178e+00 1.3478429838056587e+00 8.2551712294018176e-01 1.4461439307418431e+00 2.3520213726043062e+00 8.0387919681143860e-01 -1.5239933855476204e+00 -2.0950794407437292e+00 -6.1514134033247447e-01 -1.1479276723008471e+00 -7.9792981810943076e-01 -2.1205603136441393e+00 1.1593313393640554e+00 6.1955124313266374e-01 1.9273965665913437e+00 1.2063755033543822e+00 7.7461779046730339e-01 3.3718311312095590e+00 -1.4738418626965948e+00 -8.3617108829308218e-01 -3.5595350156972123e+00 -9.9723554034903672e-01 -6.3782338764097857e-01 -1.1560601363891074e+00 1.1279533984862065e+00 5.7809870646703909e-01 1.3478429838056583e+00 1.2373138959606929e+00 8.1142471636842561e-01 2.0457357304209625e+00 -1.1119690618188576e+00 -5.1176816239193978e-01 -1.8566509462970646e+00 3.6489421590497146e+00 1.3016624168471411e+00 1.5114306732606488e+00 -4.1626832194339265e+00 -1.1645243466489437e+00 -1.3311695622036741e+00 -5.5216571445996667e+00 -1.4918513920556371e+00 -1.4738418626965948e+00 5.5972392071786583e+00 1.2457607959889689e+00 1.7207138557277553e+00 2.9577891478027443e+00 1.3290872518039698e+00 1.1494195623893053e+00 -2.9951277905290432e+00 -9.9723554034903772e-01 -1.4878701158838574e+00 -3.5189957047943077e+00 -1.3290541299539993e+00 -1.4640522005809689e+00 3.9944933453258251e+00 1.1061549443675365e+00 1.3753696499873864e+00 1.3034467700720966e+00 2.1161930981803745e+00 8.6678700404235853e-01 -1.1967410729652204e+00 -1.9263162501995328e+00 -5.7870811830100988e-01 -1.5045789557501899e+00 -3.5965186652816468e+00 -8.3617108829308218e-01 1.2457607959889687e+00 3.4401111603245873e+00 7.8447629636514316e-01 1.1494195623893051e+00 1.3305323054774090e+00 6.0002538451723120e-01 -1.0199137865677397e+00 -1.1560601363891077e+00 -6.6507071634929260e-01 -1.1145232357625046e+00 -2.0739281030082739e+00 -7.6227242585987864e-01 1.1371299225952840e+00 1.8659865908961897e+00 5.9093366387853064e-01 1.4935905732153238e+00 8.5364491309436052e-01 2.4065218892784443e+00 -1.5614551451294498e+00 -6.5794213915073163e-01 -2.1554843586557961e+00 -1.4552685894631392e+00 -8.1930767919827674e-01 -3.5595350156972128e+00 1.7207138557277548e+00 7.8447629636514316e-01 3.9569937887574627e+00 1.3290872518039698e+00 7.9359390350176584e-01 1.3305323054774090e+00 -1.4593461601262523e+00 -6.3782338764097923e-01 -1.6614873446909255e+00 -1.4075526621760590e+00 -8.7583810098187409e-01 -2.3665431080297634e+00 1.3402308761478516e+00 5.5919619401059117e-01 2.0490018435603821e+00 3.6489421590497155e+00 1.5114306732606495e+00 1.3016624168471407e+00 -4.1626832194339292e+00 -1.3311695622036734e+00 -1.1645243466489448e+00 -2.9951277905290437e+00 -1.4878701158838576e+00 -9.9723554034903672e-01 2.9577891478027443e+00 1.1494195623893049e+00 1.3290872518039698e+00 5.5972392071786636e+00 1.7207138557277548e+00 1.2457607959889692e+00 -5.5216571445996712e+00 -1.4738418626965963e+00 -1.4918513920556364e+00 -3.5189957047943090e+00 -1.4640522005809684e+00 -1.3290541299539997e+00 3.9944933453258269e+00 1.3753696499873858e+00 1.1061549443675378e+00 1.4935905732153234e+00 2.4065218892784452e+00 8.5364491309436030e-01 -1.5614551451294501e+00 -2.1554843586557970e+00 -6.5794213915073230e-01 -1.4593461601262523e+00 -1.6614873446909257e+00 -6.3782338764097857e-01 1.3290872518039698e+00 1.3305323054774090e+00 7.9359390350176584e-01 1.7207138557277546e+00 3.9569937887574671e+00 7.8447629636514338e-01 -1.4552685894631396e+00 -3.5595350156972172e+00 -8.1930767919827663e-01 -1.4075526621760592e+00 -2.3665431080297643e+00 -8.7583810098187431e-01 1.3402308761478519e+00 2.0490018435603830e+00 5.5919619401059184e-01 1.3034467700720969e+00 8.6678700404235876e-01 2.1161930981803749e+00 -1.1967410729652204e+00 -5.7870811830100954e-01 -1.9263162501995350e+00 -1.0199137865677399e+00 -6.6507071634929282e-01 -1.1560601363891072e+00 1.1494195623893053e+00 6.0002538451723120e-01 1.3305323054774092e+00 1.2457607959889692e+00 7.8447629636514349e-01 3.4401111603245909e+00 -1.5045789557501905e+00 -8.3617108829308340e-01 -3.5965186652816499e+00 -1.1145232357625050e+00 -7.6227242585987876e-01 -2.0739281030082752e+00 1.1371299225952842e+00 5.9093366387853030e-01 1.8659865908961917e+00 -3.6504386866527949e+00 -1.4148614814971061e+00 -1.5597112611977042e+00 4.1364570189955581e+00 1.1965619526455655e+00 1.4610254396493338e+00 2.9876584801970880e+00 1.3538252522464178e+00 1.1279533984862067e+00 -2.9951277905290432e+00 -1.0199137865677399e+00 -1.4593461601262523e+00 -5.5216571445996703e+00 -1.4552685894631396e+00 -1.5045789557501905e+00 5.5570693196019558e+00 1.2063755033543833e+00 1.7487221288561665e+00 3.5352474941243495e+00 1.2011663644450712e+00 1.4196812483325261e+00 -4.0492086911374416e+00 -1.0678852151634519e+00 -1.2337458382500859e+00 -1.1479276723008482e+00 -2.1205603136441402e+00 -7.9792981810943131e-01 1.1593313393640570e+00 1.9273965665913453e+00 6.1955124313266485e-01 1.1279533984862076e+00 1.3478429838056589e+00 5.7809870646703909e-01 -9.9723554034903761e-01 -1.1560601363891074e+00 -6.3782338764097912e-01 -1.4738418626965968e+00 -3.5595350156972172e+00 -8.3617108829308329e-01 1.2063755033543835e+00 3.3718311312095635e+00 7.7461779046730461e-01 1.2373138959606940e+00 2.0457357304209633e+00 8.1142471636842672e-01 -1.1119690618188589e+00 -1.8566509462970657e+00 -5.1176816239194078e-01 -1.5007147169025783e+00 -9.4257228476057831e-01 -2.4660697923436437e+00 1.4557382985452665e+00 6.3807791042169704e-01 2.1587274077043421e+00 1.3538252522464176e+00 8.2551712294018176e-01 1.3478429838056583e+00 -1.4878701158838572e+00 -6.6507071634929260e-01 -1.6614873446909255e+00 -1.4918513920556364e+00 -8.1930767919827641e-01 -3.5965186652816499e+00 1.7487221288561663e+00 7.7461779046730450e-01 3.9605634789456423e+00 1.4461439307418429e+00 8.0387919681143827e-01 2.3520213726043075e+00 -1.5239933855476200e+00 -6.1514134033247359e-01 -2.0950794407437310e+00 -2.5478809181311215e+00 -1.3071736307780963e+00 -1.3071736307780957e+00 2.9386864042745651e+00 1.1315196538261481e+00 1.1315196538261489e+00 3.5352474941243486e+00 1.4461439307418431e+00 1.2373138959606929e+00 -3.5189957047943077e+00 -1.1145232357625046e+00 -1.4075526621760592e+00 -3.5189957047943086e+00 -1.4075526621760592e+00 -1.1145232357625050e+00 3.5352474941243495e+00 1.2373138959606940e+00 1.4461439307418429e+00 4.9370071412645045e+00 1.4695759712112251e+00 1.4695759712112255e+00 -5.3603162060680294e+00 -1.4553039230232485e+00 -1.4553039230232498e+00 -1.3007179652042344e+00 -1.6382670296082014e+00 -9.2466796422771091e-01 1.3960530499879984e+00 1.3531377536450861e+00 6.6137452583678313e-01 1.4196812483325256e+00 2.3520213726043062e+00 8.1142471636842561e-01 -1.3290541299539993e+00 -2.0739281030082739e+00 -8.7583810098187409e-01 -1.4640522005809689e+00 -2.3665431080297639e+00 -7.6227242585987876e-01 1.2011663644450712e+00 2.0457357304209633e+00 8.0387919681143838e-01 1.4695759712112249e+00 3.8186485314998393e+00 1.0161743965829537e+00 -1.3926523382376168e+00 -3.4908051475239548e+00 -7.3007434453013698e-01 -1.3007179652042351e+00 -9.2466796422771158e-01 -1.6382670296082014e+00 1.3960530499879986e+00 6.6137452583678258e-01 1.3531377536450868e+00 1.2011663644450716e+00 8.0387919681143860e-01 2.0457357304209625e+00 -1.4640522005809689e+00 -7.6227242585987876e-01 -2.3665431080297634e+00 -1.3290541299539997e+00 -8.7583810098187442e-01 -2.0739281030082752e+00 1.4196812483325261e+00 8.1142471636842672e-01 2.3520213726043075e+00 1.4695759712112251e+00 1.0161743965829537e+00 3.8186485314998393e+00 -1.3926523382376172e+00 -7.3007434453013631e-01 -3.4908051475239557e+00 2.9336004453681452e+00 1.4263647061181199e+00 1.4263647061181195e+00 -3.4962145856646369e+00 -1.1608842332596117e+00 -1.1608842332596132e+00 -4.0492086911374399e+00 -1.5239933855476204e+00 -1.1119690618188574e+00 3.9944933453258256e+00 1.1371299225952840e+00 1.3402308761478516e+00 3.9944933453258264e+00 1.3402308761478516e+00 1.1371299225952840e+00 -4.0492086911374416e+00 -1.1119690618188589e+00 -1.5239933855476200e+00 -5.3603162060680276e+00 -1.3926523382376172e+00 -1.3926523382376172e+00 6.0323610379877488e+00 1.2857735140024513e+00 1.2857735140024520e+00 1.0952156107568398e+00 1.3125614083274790e+00 6.4270416054336799e-01 -1.1055787426774286e+00 -1.1796361778136522e+00 -4.6066647533168503e-01 -1.2337458382500843e+00 -2.0950794407437292e+00 -5.1176816239193978e-01 1.1061549443675365e+00 1.8659865908961895e+00 5.5919619401059117e-01 1.3753696499873858e+00 2.0490018435603830e+00 5.9093366387853030e-01 -1.0678852151634519e+00 -1.8566509462970657e+00 -6.1514134033247359e-01 -1.4553039230232487e+00 -3.4908051475239548e+00 -7.3007434453013631e-01 1.2857735140024511e+00 3.3946218695943502e+00 5.2481630415374547e-01 1.0952156107568407e+00 6.4270416054336887e-01 1.3125614083274797e+00 -1.1055787426774297e+00 -4.6066647533168514e-01 -1.1796361778136533e+00 -1.0678852151634528e+00 -6.1514134033247447e-01 -1.8566509462970648e+00 1.3753696499873866e+00 5.9093366387853064e-01 2.0490018435603821e+00 1.1061549443675378e+00 5.5919619401059184e-01 1.8659865908961917e+00 -1.2337458382500857e+00 -5.1176816239194078e-01 -2.0950794407437310e+00 -1.4553039230232498e+00 -7.3007434453013698e-01 -3.4908051475239557e+00 1.2857735140024524e+00 5.2481630415374547e-01 3.3946218695943502e+00 96 97 98 156 157 158 171 172 173 111 112 113 99 100 101 159 160 161 174 175 176 114 115 116 4.7792173802832130e+00 1.5151980474136260e+00 1.5151980474136255e+00 -5.1518445494216509e+00 -1.4551786159613649e+00 -1.4551786159613638e+00 -3.3481720741650345e+00 -1.4030714904793782e+00 -1.0487320741374926e+00 3.3457139211527855e+00 1.2017289862440388e+00 1.3955990431294116e+00 3.3457139211527851e+00 1.3955990431294116e+00 1.2017289862440381e+00 -3.3481720741650345e+00 -1.0487320741374928e+00 -1.4030714904793782e+00 -2.3328341740055065e+00 -1.2127297323906705e+00 -1.2127297323906714e+00 2.7103776491684415e+00 1.0071858361818307e+00 1.0071858361818309e+00 1.5151980474136260e+00 3.7470824505503599e+00 1.0873586233090300e+00 -1.4786378314294621e+00 -3.3361436772488857e+00 -7.7432597912946433e-01 -1.4609951980732001e+00 -2.3030245655328447e+00 -7.4396751638496006e-01 1.2044086304998982e+00 1.9401878460906750e+00 8.0207516208412399e-01 1.4140824318374123e+00 2.2409450636484642e+00 8.1292242674402448e-01 -1.3168814376637497e+00 -1.9490846901650425e+00 -8.9326596754514220e-01 -1.2172510368305480e+00 -1.5483503505234950e+00 -8.8280814055489865e-01 1.3400763942460230e+00 1.2083879231807682e+00 5.9201139147728665e-01 1.5151980474136253e+00 1.0873586233090298e+00 3.7470824505503586e+00 -1.4786378314294617e+00 -7.7432597912946466e-01 -3.3361436772488848e+00 -1.3168814376637490e+00 -8.9326596754514187e-01 -1.9490846901650425e+00 1.4140824318374117e+00 8.1292242674402482e-01 2.2409450636484642e+00 1.2044086304998978e+00 8.0207516208412388e-01 1.9401878460906743e+00 -1.4609951980731992e+00 -7.4396751638496006e-01 -2.3030245655328438e+00 -1.2172510368305480e+00 -8.8280814055489776e-01 -1.5483503505234952e+00 1.3400763942460223e+00 5.9201139147728621e-01 1.2083879231807684e+00 -5.1518445494216509e+00 -1.4786378314294619e+00 -1.4786378314294617e+00 5.7764247429733482e+00 1.3178687918833873e+00 1.3178687918833862e+00 3.8359839997773313e+00 1.3596424233457685e+00 1.0571126702132632e+00 -3.8647214387857280e+00 -1.0894547905137093e+00 -1.4662978155114077e+00 -3.8647214387857294e+00 -1.4662978155114079e+00 -1.0894547905137084e+00 3.8359839997773326e+00 1.0571126702132634e+00 1.3596424233457685e+00 2.7191550845851200e+00 1.3116234149374253e+00 1.3116234149374262e+00 -3.2862604001200233e+00 -1.0118568629252664e+00 -1.0118568629252671e+00 -1.4551786159613651e+00 -3.3361436772488857e+00 -7.7432597912946477e-01 1.3178687918833873e+00 3.1623713634035369e+00 5.5213109969799101e-01 1.3587053568370910e+00 1.9805242764138764e+00 5.6190873346419501e-01 -1.0592878495805267e+00 -1.7495425692978621e+00 -6.0063841544876140e-01 -1.2285221286039616e+00 -1.9789887338041658e+00 -5.1947009386009935e-01 1.0896115326847977e+00 1.7519572394929037e+00 5.8077490848855240e-01 1.0403740682216025e+00 1.2476459736677068e+00 6.0910736001815002e-01 -1.0635711554810248e+00 -1.0778238726271105e+00 -4.0948761323056293e-01 -1.4551786159613638e+00 -7.7432597912946421e-01 -3.3361436772488848e+00 1.3178687918833862e+00 5.5213109969799101e-01 3.1623713634035360e+00 1.0896115326847968e+00 5.8077490848855184e-01 1.7519572394929031e+00 -1.2285221286039607e+00 -5.1947009386009924e-01 -1.9789887338041641e+00 -1.0592878495805260e+00 -6.0063841544876095e-01 -1.7495425692978621e+00 1.3587053568370902e+00 5.6190873346419468e-01 1.9805242764138764e+00 1.0403740682216016e+00 6.0910736001814902e-01 1.2476459736677066e+00 -1.0635711554810239e+00 -4.0948761323056226e-01 -1.0778238726271105e+00 -3.3481720741650345e+00 -1.4609951980732001e+00 -1.3168814376637492e+00 3.8359839997773322e+00 1.3587053568370910e+00 1.0896115326847968e+00 5.1628352926537389e+00 1.6448089238835926e+00 1.0966852264043863e+00 -5.1227203294990584e+00 -1.3948927383016656e+00 -1.3471113822770746e+00 -2.7797460319157765e+00 -1.3717374731963927e+00 -9.2370241951442245e-01 2.7684362795785034e+00 1.0374829948522253e+00 1.2647590733609069e+00 3.2786178660813174e+00 1.3295236270650272e+00 1.1085836301968945e+00 -3.7952350025110220e+00 -1.1428954930666781e+00 -9.7194422319173845e-01 -1.4030714904793780e+00 -2.3030245655328443e+00 -8.9326596754514176e-01 1.3596424233457685e+00 1.9805242764138764e+00 5.8077490848855184e-01 1.6448089238835923e+00 3.7135658996717242e+00 7.1426980172849330e-01 -1.3854442761559003e+00 -3.3322289312876090e+00 -7.6340977910556074e-01 -1.4029754357315269e+00 -1.5692913241508690e+00 -6.1246495339609197e-01 1.2647590733609069e+00 1.2445903991182123e+00 7.8125658879067961e-01 1.3574661467784399e+00 2.2235793091575573e+00 7.5557626097844632e-01 -1.4351853650019017e+00 -1.9577150633900473e+00 -5.6273685993937617e-01 -1.0487320741374928e+00 -7.4396751638496006e-01 -1.9490846901650425e+00 1.0571126702132629e+00 5.6190873346419501e-01 1.7519572394929031e+00 1.0966852264043867e+00 7.1426980172849319e-01 3.1179860509930513e+00 -1.3700778736921184e+00 -7.8084901036974264e-01 -3.2978965967542178e+00 -9.0598248624856692e-01 -5.8732207618435961e-01 -1.0557893842036932e+00 1.0374829948522248e+00 5.3177934101253621e-01 1.2445903991182119e+00 1.1503417316775055e+00 7.6607689327003281e-01 1.9087741982059885e+00 -1.0168301890692018e+00 -4.6189616653619525e-01 -1.7205372166872008e+00 3.3457139211527855e+00 1.2044086304998982e+00 1.4140824318374117e+00 -3.8647214387857276e+00 -1.0592878495805267e+00 -1.2285221286039607e+00 -5.1227203294990584e+00 -1.3854442761559003e+00 -1.3700778736921184e+00 5.2061039547074976e+00 1.1330192760185609e+00 1.6186066709688234e+00 2.7411452471652615e+00 1.2410915072367585e+00 1.0565363421905651e+00 -2.7797460319157765e+00 -9.0598248624856714e-01 -1.4029754357315269e+00 -3.2657252191058093e+00 -1.2399313070619740e+00 -1.3778230902926538e+00 3.7399498962808266e+00 1.0121265052917507e+00 1.2901730833234597e+00 1.2017289862440388e+00 1.9401878460906750e+00 8.1292242674402493e-01 -1.0894547905137093e+00 -1.7495425692978621e+00 -5.1947009386009924e-01 -1.3948927383016656e+00 -3.3322289312876090e+00 -7.8084901036974264e-01 1.1330192760185611e+00 3.1827187640338250e+00 7.2272214691389269e-01 1.0565363421905658e+00 1.2255979410532261e+00 5.5059086302490079e-01 -9.2370241951442311e-01 -1.0557893842036936e+00 -6.1246495339609230e-01 -1.0213161556097425e+00 -1.9381628718902386e+00 -7.1321103071049818e-01 1.0380814994863741e+00 1.7272192055016777e+00 5.3975965165361384e-01 1.3955990431294116e+00 8.0207516208412399e-01 2.2409450636484642e+00 -1.4662978155114077e+00 -6.0063841544876140e-01 -1.9789887338041645e+00 -1.3471113822770748e+00 -7.6340977910556063e-01 -3.2978965967542182e+00 1.6186066709688232e+00 7.2272214691389269e-01 3.7105863416451186e+00 1.2410915072367585e+00 7.4907777459467062e-01 1.2255979410532258e+00 -1.3717374731963923e+00 -5.8732207618435983e-01 -1.5692913241508690e+00 -1.3172225856595485e+00 -8.3004483010606622e-01 -2.2410830668415826e+00 1.2470720353094291e+00 5.0754001725206110e-01 1.9101303752040257e+00 3.3457139211527851e+00 1.4140824318374123e+00 1.2044086304998978e+00 -3.8647214387857289e+00 -1.2285221286039618e+00 -1.0592878495805260e+00 -2.7797460319157765e+00 -1.4029754357315269e+00 -9.0598248624856703e-01 2.7411452471652615e+00 1.0565363421905658e+00 1.2410915072367585e+00 5.2061039547075003e+00 1.6186066709688238e+00 1.1330192760185607e+00 -5.1227203294990593e+00 -1.3700778736921191e+00 -1.3854442761559005e+00 -3.2657252191058097e+00 -1.3778230902926529e+00 -1.2399313070619753e+00 3.7399498962808275e+00 1.2901730833234590e+00 1.0121265052917516e+00 1.3955990431294116e+00 2.2409450636484642e+00 8.0207516208412399e-01 -1.4662978155114077e+00 -1.9789887338041658e+00 -6.0063841544876095e-01 -1.3717374731963927e+00 -1.5692913241508690e+00 -5.8732207618435961e-01 1.2410915072367585e+00 1.2255979410532261e+00 7.4907777459467062e-01 1.6186066709688238e+00 3.7105863416451199e+00 7.2272214691389225e-01 -1.3471113822770748e+00 -3.2978965967542191e+00 -7.6340977910556063e-01 -1.3172225856595490e+00 -2.2410830668415818e+00 -8.3004483010606700e-01 1.2470720353094298e+00 1.9101303752040257e+00 5.0754001725206144e-01 1.2017289862440379e+00 8.1292242674402448e-01 1.9401878460906741e+00 -1.0894547905137084e+00 -5.1947009386009935e-01 -1.7495425692978621e+00 -9.2370241951442245e-01 -6.1246495339609197e-01 -1.0557893842036929e+00 1.0565363421905651e+00 5.5059086302490079e-01 1.2255979410532258e+00 1.1330192760185607e+00 7.2272214691389214e-01 3.1827187640338250e+00 -1.3948927383016647e+00 -7.8084901036974230e-01 -3.3322289312876094e+00 -1.0213161556097419e+00 -7.1321103071049730e-01 -1.9381628718902388e+00 1.0380814994863736e+00 5.3975965165361350e-01 1.7272192055016782e+00 -3.3481720741650345e+00 -1.3168814376637494e+00 -1.4609951980731997e+00 3.8359839997773331e+00 1.0896115326847979e+00 1.3587053568370902e+00 2.7684362795785034e+00 1.2647590733609069e+00 1.0374829948522248e+00 -2.7797460319157765e+00 -9.2370241951442311e-01 -1.3717374731963923e+00 -5.1227203294990593e+00 -1.3471113822770753e+00 -1.3948927383016647e+00 5.1628352926537397e+00 1.0966852264043869e+00 1.6448089238835923e+00 3.2786178660813174e+00 1.1085836301968937e+00 1.3295236270650281e+00 -3.7952350025110220e+00 -9.7194422319173779e-01 -1.1428954930666788e+00 -1.0487320741374928e+00 -1.9490846901650427e+00 -7.4396751638496006e-01 1.0571126702132636e+00 1.7519572394929037e+00 5.6190873346419479e-01 1.0374829948522253e+00 1.2445903991182123e+00 5.3177934101253621e-01 -9.0598248624856714e-01 -1.0557893842036936e+00 -5.8732207618435983e-01 -1.3700778736921193e+00 -3.2978965967542191e+00 -7.8084901036974219e-01 1.0966852264043869e+00 3.1179860509930521e+00 7.1426980172849330e-01 1.1503417316775058e+00 1.9087741982059880e+00 7.6607689327003337e-01 -1.0168301890692022e+00 -1.7205372166872011e+00 -4.6189616653619564e-01 -1.4030714904793782e+00 -8.9326596754514220e-01 -2.3030245655328438e+00 1.3596424233457687e+00 5.8077490848855229e-01 1.9805242764138764e+00 1.2647590733609069e+00 7.8125658879067961e-01 1.2445903991182119e+00 -1.4029754357315269e+00 -6.1246495339609253e-01 -1.5692913241508690e+00 -1.3854442761559005e+00 -7.6340977910556074e-01 -3.3322289312876086e+00 1.6448089238835923e+00 7.1426980172849330e-01 3.7135658996717238e+00 1.3574661467784404e+00 7.5557626097844555e-01 2.2235793091575577e+00 -1.4351853650019022e+00 -5.6273685993937572e-01 -1.9577150633900486e+00 -2.3328341740055065e+00 -1.2172510368305482e+00 -1.2172510368305476e+00 2.7191550845851205e+00 1.0403740682216025e+00 1.0403740682216018e+00 3.2786178660813174e+00 1.3574661467784399e+00 1.1503417316775055e+00 -3.2657252191058093e+00 -1.0213161556097425e+00 -1.3172225856595485e+00 -3.2657252191058097e+00 -1.3172225856595485e+00 -1.0213161556097419e+00 3.2786178660813174e+00 1.1503417316775058e+00 1.3574661467784401e+00 4.6254718016258698e+00 1.3754716990081390e+00 1.3754716990081401e+00 -5.0375780061565001e+00 -1.3678638675858490e+00 -1.3678638675858494e+00 -1.2127297323906705e+00 -1.5483503505234950e+00 -8.8280814055489776e-01 1.3116234149374253e+00 1.2476459736677070e+00 6.0910736001814902e-01 1.3295236270650272e+00 2.2235793091575573e+00 7.6607689327003281e-01 -1.2399313070619742e+00 -1.9381628718902386e+00 -8.3004483010606622e-01 -1.3778230902926529e+00 -2.2410830668415818e+00 -7.1321103071049730e-01 1.1085836301968937e+00 1.9087741982059883e+00 7.5557626097844577e-01 1.3754716990081390e+00 3.6421391612668703e+00 9.7245523628149622e-01 -1.2947182414621872e+00 -3.2945423530428073e+00 -6.7715174917666254e-01 -1.2127297323906716e+00 -8.8280814055489865e-01 -1.5483503505234952e+00 1.3116234149374262e+00 6.0910736001815013e-01 1.2476459736677066e+00 1.1085836301968945e+00 7.5557626097844632e-01 1.9087741982059885e+00 -1.3778230902926540e+00 -7.1321103071049818e-01 -2.2410830668415826e+00 -1.2399313070619753e+00 -8.3004483010606700e-01 -1.9381628718902388e+00 1.3295236270650281e+00 7.6607689327003337e-01 2.2235793091575577e+00 1.3754716990081399e+00 9.7245523628149610e-01 3.6421391612668721e+00 -1.2947182414621887e+00 -6.7715174917666276e-01 -3.2945423530428086e+00 2.7103776491684415e+00 1.3400763942460230e+00 1.3400763942460225e+00 -3.2862604001200233e+00 -1.0635711554810248e+00 -1.0635711554810239e+00 -3.7952350025110220e+00 -1.4351853650019017e+00 -1.0168301890692015e+00 3.7399498962808266e+00 1.0380814994863741e+00 1.2470720353094293e+00 3.7399498962808275e+00 1.2470720353094298e+00 1.0380814994863736e+00 -3.7952350025110220e+00 -1.0168301890692022e+00 -1.4351853650019022e+00 -5.0375780061565001e+00 -1.2947182414621876e+00 -1.2947182414621887e+00 5.7240309695684699e+00 1.1850750219724908e+00 1.1850750219724919e+00 1.0071858361818307e+00 1.2083879231807682e+00 5.9201139147728621e-01 -1.0118568629252664e+00 -1.0778238726271105e+00 -4.0948761323056226e-01 -1.1428954930666781e+00 -1.9577150633900473e+00 -4.6189616653619531e-01 1.0121265052917507e+00 1.7272192055016777e+00 5.0754001725206110e-01 1.2901730833234590e+00 1.9101303752040257e+00 5.3975965165361339e-01 -9.7194422319173768e-01 -1.7205372166872011e+00 -5.6273685993937572e-01 -1.3678638675858488e+00 -3.2945423530428073e+00 -6.7715174917666254e-01 1.1850750219724908e+00 3.2048810018606959e+00 4.7196132849983530e-01 1.0071858361818311e+00 5.9201139147728665e-01 1.2083879231807684e+00 -1.0118568629252671e+00 -4.0948761323056299e-01 -1.0778238726271105e+00 -9.7194422319173857e-01 -5.6273685993937617e-01 -1.7205372166872008e+00 1.2901730833234597e+00 5.3975965165361395e-01 1.9101303752040257e+00 1.0121265052917516e+00 5.0754001725206155e-01 1.7272192055016782e+00 -1.1428954930666788e+00 -4.6189616653619564e-01 -1.9577150633900486e+00 -1.3678638675858494e+00 -6.7715174917666276e-01 -3.2945423530428086e+00 1.1850750219724917e+00 4.7196132849983535e-01 3.2048810018606964e+00 9 10 11 69 70 71 84 85 86 24 25 26 12 13 14 72 73 74 87 88 89 27 28 29 5.0051518361480261e+00 5.2254517501680298e-01 2.1256630730061850e+00 -5.2610051902781905e+00 -2.9199324393136872e-01 -2.1101687157818434e+00 -3.6126737075436863e+00 -5.1874739418171656e-01 -1.7241623794251066e+00 3.3648591489325015e+00 2.3108351634175345e-01 1.9087730982442179e+00 3.5060119674618302e+00 4.9721393230322497e-01 1.8131728208021645e+00 -3.2687436339924232e+00 -1.0026242102923304e-01 -1.8643448488286616e+00 -2.4508814648158062e+00 -4.4941271241375252e-01 -1.7211780028735004e+00 2.7172810440877506e+00 1.0957314789428906e-01 1.5722449548565436e+00 5.2254517501680298e-01 2.9062691962708760e+00 5.0220822583467983e-01 -2.9652203402597338e-01 -2.6946917955729242e+00 -2.0456334015268629e-01 -5.4094901170252330e-01 -1.5020763513681843e+00 -4.1494797233248082e-01 2.2685148750191877e-01 1.3406124052350208e+00 2.1113611122883286e-01 4.9037696726470287e-01 1.4430989440806887e+00 4.0496347618684669e-01 -3.2459008076930818e-01 -1.3296797102869444e+00 -3.1051761568435116e-01 -4.3724391301758853e-01 -7.9534663123434313e-01 -4.2481083965815952e-01 3.5953140973196868e-01 6.3181394287580994e-01 2.3653195457731818e-01 2.1256630730061854e+00 5.0220822583467983e-01 4.8147700537164777e+00 -2.1178982517432297e+00 -2.0171362775269944e-01 -4.3977407614549069e+00 -1.9779336423163971e+00 -4.5554213707982494e-01 -2.8775063299114820e+00 1.9139019211382311e+00 2.1784631002211155e-01 3.1698756883217865e+00 1.8005723589701315e+00 4.0672017984423103e-01 2.7844294579537148e+00 -1.8757981664814192e+00 -9.7557480865417157e-02 -3.1459736616315110e+00 -1.7107208490062726e+00 -4.3400041476429319e-01 -2.3521950745641256e+00 1.8422135564327711e+00 6.2038944761211856e-02 2.0043406275700462e+00 -5.2610051902781905e+00 -2.9652203402597338e-01 -2.1178982517432297e+00 5.6951032973873463e+00 -1.8357838513957218e-02 2.0463140530858666e+00 3.9584341578518836e+00 2.6689146524194624e-01 1.7934244970919071e+00 -3.7168143069100235e+00 5.0603552504753582e-02 -2.0256085204123884e+00 -3.8942531575060513e+00 -3.8241433038959288e-01 -1.7509238326341159e+00 3.6031990115290253e+00 -4.2071892071469448e-02 1.8559291957203758e+00 2.7318070945319803e+00 3.6527887758912281e-01 1.8397879447156691e+00 -3.1164709066059704e+00 5.6592199665170768e-02 -1.6410250858240838e+00 -2.9199324393136872e-01 -2.6946917955729242e+00 -2.0171362775269944e-01 -1.8357838513957222e-02 2.7440730280461989e+00 -1.0427094652535499e-02 2.6612865389660056e-01 1.3550269642056174e+00 1.8235534079994759e-01 4.5117738207650623e-02 -1.3765582160191043e+00 3.9063987833327901e-02 -1.3951978699159201e-01 -1.3386020464938770e+00 -9.4573214691228980e-02 -2.5340247916466191e-02 1.3416335456246113e+00 -1.8451330235496749e-02 1.2724718186061698e-01 6.5694743386659671e-01 7.7809611876659232e-02 3.6717543388516086e-02 -6.8782891365711873e-01 2.5936326822025901e-02 -2.1101687157818434e+00 -2.0456334015268621e-01 -4.3977407614549069e+00 2.0463140530858666e+00 -1.0427094652535496e-02 4.1618078819348527e+00 1.8007446011184276e+00 1.8481866115006532e-01 2.6128010204130918e+00 -1.7809483809677842e+00 3.7914591527405561e-02 -2.8931952140985722e+00 -1.7397068478024007e+00 -2.6024364454900628e-01 -2.5330958182913044e+00 1.8610835521849285e+00 -3.2407956637411452e-02 2.8203409946206892e+00 1.5820207812826299e+00 2.4510349038032070e-01 2.0375915800058384e+00 -1.6593390431198256e+00 3.9805292933848158e-02 -1.8085096831296901e+00 -3.6126737075436863e+00 -5.4094901170252319e-01 -1.9779336423163971e+00 3.9584341578518836e+00 2.6612865389660051e-01 1.8007446011184276e+00 5.6175339828497313e+00 5.9558690726188213e-01 1.9730909839506701e+00 -5.3048778076157888e+00 -2.6237695217242846e-01 -2.0798444529775559e+00 -3.0139906808117036e+00 -5.1149019319692746e-01 -1.6048942306016798e+00 2.7435373808957362e+00 8.3576593583117587e-02 1.8314085100713640e+00 3.5113175242778558e+00 4.9075138801479273e-01 1.7702973267493047e+00 -3.8992808499040303e+00 -1.2122738568451311e-01 -1.7128690959941337e+00 -5.1874739418171656e-01 -1.5020763513681843e+00 -4.5554213707982494e-01 2.6689146524194624e-01 1.3550269642056174e+00 1.8481866115006534e-01 5.9558690726188201e-01 2.9255002527916827e+00 4.1506971379218016e-01 -2.5454539576296348e-01 -2.7494158252264231e+00 -2.3937247290060537e-01 -5.1388302771730854e-01 -7.9889976026277443e-01 -3.5532729444757644e-01 3.1126569747440974e-01 6.5410984648960868e-01 3.0534671743219349e-01 4.8816717959206118e-01 1.4805839449801752e+00 3.9852993911559009e-01 -3.7473543190831071e-01 -1.3648290716097027e+00 -2.5352312706202218e-01 -1.7241623794251066e+00 -4.1494797233248082e-01 -2.8775063299114820e+00 1.7934244970919069e+00 1.8235534079994759e-01 2.6128010204130918e+00 1.9730909839506705e+00 4.1506971379218016e-01 4.1800558548858744e+00 -2.0933004712756902e+00 -2.4713470942775254e-01 -4.4252655651904513e+00 -1.6079022640030343e+00 -3.5432011461012081e-01 -1.7951452777271704e+00 1.5868764549263914e+00 9.2897410903915803e-02 2.0377006618231515e+00 1.7962885386049230e+00 4.0572186607687349e-01 2.8055035369101229e+00 -1.7243153598700611e+00 -7.9641535202562661e-02 -2.5381439012031377e+00 3.3648591489325015e+00 2.2685148750191877e-01 1.9139019211382311e+00 -3.7168143069100235e+00 4.5117738207650637e-02 -1.7809483809677842e+00 -5.3048778076157888e+00 -2.5454539576296348e-01 -2.0933004712756897e+00 5.1401856805522455e+00 -1.8739573107806530e-02 2.1579074479799392e+00 2.7248655070334076e+00 3.1549871260522755e-01 1.5873807418127710e+00 -2.5396854609739350e+00 5.3415328539216302e-02 -1.7776480564629653e+00 -3.2731139510398739e+00 -3.2692983722140251e-01 -1.8510025862706780e+00 3.6045811900214662e+00 -4.0668460761841142e-02 1.8437093840461758e+00 2.3108351634175342e-01 1.3406124052350208e+00 2.1784631002211152e-01 5.0603552504753582e-02 -1.3765582160191043e+00 3.7914591527405561e-02 -2.6237695217242851e-01 -2.7494158252264231e+00 -2.4713470942775254e-01 -1.8739573107806516e-02 2.8354190600780980e+00 -1.9862993536036280e-02 9.8964469216245493e-02 6.3651894261344455e-01 1.0491653640268700e-01 3.8914057699301105e-02 -6.8440299937069382e-01 3.6182915698776463e-02 -1.1538057170459487e-01 -1.3615732685018305e+00 -1.1017723975917301e-01 -2.3068498777223740e-02 1.3593999011914886e+00 -1.9685410928018728e-02 1.9087730982442179e+00 2.1113611122883286e-01 3.1698756883217865e+00 -2.0256085204123884e+00 3.9063987833327901e-02 -2.8931952140985722e+00 -2.0798444529775555e+00 -2.3937247290060537e-01 -4.4252655651904504e+00 2.1579074479799383e+00 -1.9862993536036280e-02 4.8531656376482628e+00 1.8186310616797088e+00 3.0393634367553990e-01 2.0066593941850854e+00 -1.7570975045565072e+00 4.9509714649087884e-02 -2.3672502375473812e+00 -1.8326294657517019e+00 -3.1099691748278174e-01 -3.1413529380725125e+00 1.8098683357942889e+00 -3.3413773467365633e-02 2.7973632347537825e+00 3.5060119674618302e+00 4.9037696726470287e-01 1.8005723589701315e+00 -3.8942531575060513e+00 -1.3951978699159204e-01 -1.7397068478024011e+00 -3.0139906808117032e+00 -5.1388302771730854e-01 -1.6079022640030343e+00 2.7248655070334076e+00 9.8964469216245493e-02 1.8186310616797088e+00 5.3906521856712653e+00 5.6954735553610170e-01 1.8795897121384373e+00 -5.0295249483916882e+00 -2.4789041337015272e-01 -1.9733460502811544e+00 -3.4272729857239903e+00 -5.1832130493893658e-01 -1.8545823330339883e+00 3.7435121122669308e+00 2.6072574100093926e-01 1.6767443623323000e+00 4.9721393230322491e-01 1.4430989440806887e+00 4.0672017984423103e-01 -3.8241433038959288e-01 -1.3386020464938770e+00 -2.6024364454900628e-01 -5.1149019319692746e-01 -7.9889976026277443e-01 -3.5432011461012081e-01 3.1549871260522749e-01 6.3651894261344444e-01 3.0393634367553990e-01 5.6954735553610170e-01 2.8271230083144774e+00 3.9688047098878149e-01 -2.2134629529543798e-01 -2.6070880832516097e+00 -2.1357430731340418e-01 -4.8792604332345180e-01 -1.4580175990670414e+00 -4.2890338445994614e-01 2.2091686176085612e-01 1.2958665940666907e+00 1.4950445642392493e-01 1.8131728208021645e+00 4.0496347618684669e-01 2.7844294579537148e+00 -1.7509238326341159e+00 -9.4573214691228980e-02 -2.5330958182913044e+00 -1.6048942306016798e+00 -3.5532729444757638e-01 -1.7951452777271704e+00 1.5873807418127710e+00 1.0491653640268700e-01 2.0066593941850854e+00 1.8795897121384377e+00 3.9688047098878154e-01 4.0207416032605270e+00 -1.9962188840637067e+00 -2.3754818231801064e-01 -4.2121508238037677e+00 -1.6097584583670592e+00 -3.9784612882058407e-01 -2.7436694924041460e+00 1.6816521309131884e+00 1.7853433669908447e-01 2.4722309568270608e+00 -3.2687436339924236e+00 -3.2459008076930812e-01 -1.8757981664814192e+00 3.6031990115290253e+00 -2.5340247916466205e-02 1.8610835521849285e+00 2.7435373808957362e+00 3.1126569747440974e-01 1.5868764549263916e+00 -2.5396854609739350e+00 3.8914057699301098e-02 -1.7570975045565072e+00 -5.0295249483916882e+00 -2.2134629529543803e-01 -1.9962188840637063e+00 4.8256935128992673e+00 -3.8631353215943312e-02 2.0469263531149511e+00 3.1983175224921658e+00 1.9460521139299780e-01 1.7878732212143746e+00 -3.5327933844581474e+00 6.5123010630447550e-02 -1.6536450263390128e+00 -1.0026242102923305e-01 -1.3296797102869444e+00 -9.7557480865417184e-02 -4.2071892071469455e-02 1.3416335456246113e+00 -3.2407956637411452e-02 8.3576593583117573e-02 6.5410984648960868e-01 9.2897410903915789e-02 5.3415328539216309e-02 -6.8440299937069382e-01 4.9509714649087884e-02 -2.4789041337015272e-01 -2.6070880832516097e+00 -2.3754818231801056e-01 -3.8631353215943291e-02 2.6620723209277761e+00 -3.8144236192032818e-02 2.2421430607570783e-01 1.3041766856982737e+00 2.1038093662446908e-01 6.7649851488756768e-02 -1.3408216058310223e+00 5.2869793835399206e-02 -1.8643448488286616e+00 -3.1051761568435110e-01 -3.1459736616315119e+00 1.8559291957203758e+00 -1.8451330235496759e-02 2.8203409946206892e+00 1.8314085100713640e+00 3.0534671743219344e-01 2.0377006618231510e+00 -1.7776480564629653e+00 3.6182915698776463e-02 -2.3672502375473812e+00 -1.9733460502811546e+00 -2.1357430731340418e-01 -4.2121508238037677e+00 2.0469263531149515e+00 -3.8144236192032818e-02 4.5945274525166004e+00 1.7957323423137583e+00 1.8495756302159885e-01 3.0318463794245796e+00 -1.9146574456476686e+00 5.4200293272716513e-02 -2.7590407654023608e+00 -2.4508814648158057e+00 -4.3724391301758847e-01 -1.7107208490062726e+00 2.7318070945319803e+00 1.2724718186061698e-01 1.5820207812826301e+00 3.5113175242778558e+00 4.8816717959206124e-01 1.7962885386049230e+00 -3.2731139510398739e+00 -1.1538057170459488e-01 -1.8326294657517019e+00 -3.4272729857239908e+00 -4.8792604332345185e-01 -1.6097584583670592e+00 3.1983175224921658e+00 2.2421430607570783e-01 1.7957323423137588e+00 4.7745449463963343e+00 4.9113041421081738e-01 1.9695400154080724e+00 -5.0647186861186686e+00 -2.9020855369356768e-01 -1.9904729044843505e+00 -4.4941271241375252e-01 -7.9534663123434313e-01 -4.3400041476429313e-01 3.6527887758912281e-01 6.5694743386659671e-01 2.4510349038032070e-01 4.9075138801479268e-01 1.4805839449801752e+00 4.0572186607687355e-01 -3.2692983722140245e-01 -1.3615732685018305e+00 -3.1099691748278174e-01 -5.1832130493893658e-01 -1.4580175990670414e+00 -3.9784612882058401e-01 1.9460521139299777e-01 1.3041766856982737e+00 1.8495756302159885e-01 4.9113041421081727e-01 2.8392741067763154e+00 4.7322594060816320e-01 -2.4710203663363894e-01 -2.6660446725181464e+00 -1.6616539901929728e-01 -1.7211780028735002e+00 -4.2481083965815952e-01 -2.3521950745641256e+00 1.8397879447156693e+00 7.7809611876659232e-02 2.0375915800058384e+00 1.7702973267493047e+00 3.9852993911558998e-01 2.8055035369101233e+00 -1.8510025862706780e+00 -1.1017723975917301e-01 -3.1413529380725125e+00 -1.8545823330339883e+00 -4.2890338445994614e-01 -2.7436694924041451e+00 1.7878732212143746e+00 2.1038093662446911e-01 3.0318463794245796e+00 1.9695400154080722e+00 4.7322594060816320e-01 4.6082094050767228e+00 -1.9407355859092541e+00 -1.9605496434760245e-01 -4.2459333963764809e+00 2.7172810440877502e+00 3.5953140973196862e-01 1.8422135564327708e+00 -3.1164709066059699e+00 3.6717543388516079e-02 -1.6593390431198254e+00 -3.8992808499040299e+00 -3.7473543190831082e-01 -1.7243153598700609e+00 3.6045811900214662e+00 -2.3068498777223719e-02 1.8098683357942891e+00 3.7435121122669308e+00 2.2091686176085618e-01 1.6816521309131884e+00 -3.5327933844581478e+00 6.7649851488756768e-02 -1.9146574456476688e+00 -5.0647186861186686e+00 -2.4710203663363894e-01 -1.9407355859092545e+00 5.5478894807106700e+00 -3.9909699050924667e-02 1.9053134114065617e+00 1.0957314789428906e-01 6.3181394287580994e-01 6.2038944761211870e-02 5.6592199665170762e-02 -6.8782891365711862e-01 3.9805292933848144e-02 -1.2122738568451313e-01 -1.3648290716097027e+00 -7.9641535202562647e-02 -4.0668460761841149e-02 1.3593999011914886e+00 -3.3413773467365633e-02 2.6072574100093926e-01 1.2958665940666907e+00 1.7853433669908453e-01 6.5123010630447509e-02 -1.3408216058310223e+00 5.4200293272716513e-02 -2.9020855369356768e-01 -2.6660446725181464e+00 -1.9605496434760247e-01 -3.9909699050924674e-02 2.7724438254820001e+00 -2.5468594649330319e-02 1.5722449548565436e+00 2.3653195457731813e-01 2.0043406275700462e+00 -1.6410250858240838e+00 2.5936326822025891e-02 -1.8085096831296901e+00 -1.7128690959941335e+00 -2.5352312706202218e-01 -2.5381439012031377e+00 1.8437093840461760e+00 -1.9685410928018725e-02 2.7973632347537820e+00 1.6767443623323000e+00 1.4950445642392496e-01 2.4722309568270608e+00 -1.6536450263390128e+00 5.2869793835399199e-02 -2.7590407654023608e+00 -1.9904729044843503e+00 -1.6616539901929722e-01 -4.2459333963764809e+00 1.9053134114065617e+00 -2.5468594649330316e-02 4.0776929269607791e+00 69 70 71 129 130 131 144 145 146 84 85 86 72 73 74 132 133 134 147 148 149 87 88 89 4.8856105727490062e+00 5.2272502447035185e-01 2.0859976999892158e+00 -5.1375694593182075e+00 -2.8373732553512576e-01 -2.0712922243722787e+00 -3.5020452160019171e+00 -5.1792713235381171e-01 -1.6809062866414357e+00 3.2540811829424516e+00 2.2068952506364051e-01 1.8737264812321248e+00 3.4716310133082291e+00 4.9627487398993558e-01 1.7893413873541930e+00 -3.2391719897927040e+00 -9.9073047484929136e-02 -1.8416655464521563e+00 -2.4005561852189414e+00 -4.4649073241491272e-01 -1.6958178484124908e+00 2.6680200813320809e+00 1.0753881426485043e-01 1.5406163373028297e+00 5.2272502447035196e-01 2.8424039646662891e+00 5.0497262846707203e-01 -2.9641406489872812e-01 -2.6191558433347524e+00 -2.0259075881590521e-01 -5.4390827940975928e-01 -1.4432952689724521e+00 -4.1606319723942292e-01 2.2696909566152279e-01 1.2762376881594000e+00 2.1252664547221786e-01 4.9260585375661226e-01 1.4477659013398476e+00 4.0768343416693259e-01 -3.2378529140259571e-01 -1.3339080409350854e+00 -3.1156121918737550e-01 -4.3886053088688587e-01 -7.8729028094733977e-01 -4.2976624798929436e-01 3.6066819270948192e-01 6.1724188002409319e-01 2.3479871512577588e-01 2.0859976999892158e+00 5.0497262846707192e-01 4.7194776950540094e+00 -2.0761791929361606e+00 -1.9279119823428981e-01 -4.2908784413844900e+00 -1.9411019168115473e+00 -4.5587980639762599e-01 -2.7807576166174637e+00 1.8761009654664349e+00 2.0929789014326486e-01 3.0839330699418679e+00 1.7676092296014347e+00 4.0479633707848839e-01 2.7630929950512266e+00 -1.8481644166155107e+00 -9.6196344952823212e-02 -3.1354892881471579e+00 -1.6789271864390360e+00 -4.3294344315810246e-01 -2.3242747417231313e+00 1.8146648177451679e+00 5.8743937054015205e-02 1.9648963278251383e+00 -5.1375694593182075e+00 -2.9641406489872818e-01 -2.0761791929361597e+00 5.5759021466465573e+00 -3.1164248829928732e-02 2.0031119870278258e+00 3.8487376980447117e+00 2.6862167380295143e-01 1.7497435024232575e+00 -3.6079949940793457e+00 6.0459713481844653e-02 -1.9926469479906439e+00 -3.8635525506347230e+00 -3.7791857156201003e-01 -1.7174395531889475e+00 3.5757613807669220e+00 -4.7130992842381730e-02 1.8257847241788110e+00 2.6813185720213268e+00 3.6219616270745575e-01 1.8136799884648374e+00 -3.0726027934472389e+00 6.1350328140797994e-02 -1.6060545079789823e+00 -2.8373732553512576e-01 -2.6191558433347519e+00 -1.9279119823428978e-01 -3.1164248829928742e-02 2.6724947789048299e+00 -1.9123872403588264e-02 2.5561203546934819e-01 1.2885012978394064e+00 1.7392274844135211e-01 5.7845620053785872e-02 -1.3159894667504173e+00 4.9712442072077201e-02 -1.3286945305888365e-01 -1.3380197684107937e+00 -8.9409943948568202e-02 -3.5274224266947894e-02 1.3463549864231306e+00 -2.6873069558192762e-02 1.2085426491267705e-01 6.4248006771059440e-01 7.0695163434341901e-02 4.8733331255074876e-02 -6.7666605238199795e-01 3.3867730196867833e-02 -2.0712922243722787e+00 -2.0259075881590516e-01 -4.2908784413844892e+00 2.0031119870278253e+00 -1.9123872403588264e-02 4.0524780735695076e+00 1.7593135235794624e+00 1.8530152990421625e-01 2.5123541502386790e+00 -1.7405619891673612e+00 4.5484293421907129e-02 -2.8022822630831183e+00 -1.7111219279589804e+00 -2.5578137821198599e-01 -2.5074159964106824e+00 1.8394448531029912e+00 -3.6882720456949208e-02 2.8016327332640008e+00 1.5509819776432228e+00 2.4069302895360364e-01 2.0022836845837069e+00 -1.6298761998548819e+00 4.2899877608702265e-02 -1.7681719407776055e+00 -3.5020452160019171e+00 -5.4390827940975939e-01 -1.9411019168115473e+00 3.8487376980447108e+00 2.5561203546934824e-01 1.7593135235794624e+00 5.3717896810260743e+00 5.9483876421754067e-01 1.9108049962760707e+00 -5.0578339473288292e+00 -2.4731741419345424e-01 -2.0296899273437354e+00 -2.9653616474086362e+00 -5.1084248778739250e-01 -1.5707159382214648e+00 2.6964527808797607e+00 8.0602642917957379e-02 1.8032847508241558e+00 3.4162309841051082e+00 4.8802683129599428e-01 1.7384239874589775e+00 -3.8079703333162729e+00 -1.1701209251023342e-01 -1.6703194757619206e+00 -5.1792713235381183e-01 -1.4432952689724521e+00 -4.5587980639762599e-01 2.6862167380295143e-01 1.2885012978394064e+00 1.8530152990421631e-01 5.9483876421754067e-01 2.7522517671990117e+00 4.1170512546699822e-01 -2.5359261317235027e-01 -2.5700551742957871e+00 -2.4157444616890389e-01 -5.1630578531751348e-01 -7.8894867942975866e-01 -3.5502458086338984e-01 3.1107002930011812e-01 6.4072780356711023e-01 3.0714741817833219e-01 4.8911164849113953e-01 1.4334658996817586e+00 4.0064702174272609e-01 -3.7581658496807419e-01 -1.3126476455892890e+00 -2.5232226186235346e-01 -1.6809062866414357e+00 -4.1606319723942292e-01 -2.7807576166174637e+00 1.7497435024232577e+00 1.7392274844135211e-01 2.5123541502386790e+00 1.9108049962760707e+00 4.1170512546699822e-01 3.9508426385046747e+00 -2.0307063566668067e+00 -2.3653887581559635e-01 -4.2017541532504410e+00 -1.5734000734003939e+00 -3.5184818975197707e-01 -1.7530391614413456e+00 1.5555220071642597e+00 9.1859084626966028e-02 1.9989491020332260e+00 1.7562623144021663e+00 4.0318373940432661e-01 2.7254788131039662e+00 -1.6873201035571177e+00 -7.6220435132645814e-02 -2.4520737725712953e+00 3.2540811829424525e+00 2.2696909566152279e-01 1.8761009654664349e+00 -3.6079949940793457e+00 5.7845620053785865e-02 -1.7405619891673614e+00 -5.0578339473288292e+00 -2.5359261317235027e-01 -2.0307063566668067e+00 4.8988352673803339e+00 -3.1137086118932004e-02 2.1051672617908004e+00 2.6733152678297869e+00 3.1047729795870699e-01 1.5565677775201416e+00 -2.4931745522303475e+00 5.9081987276843523e-02 -1.7513931532113007e+00 -3.1789971210104881e+00 -3.2296919733457613e-01 -1.8214076875130749e+00 3.5117688964964393e+00 -4.6675104325001680e-02 1.8062331817811683e+00 2.2068952506364051e-01 1.2762376881593998e+00 2.0929789014326489e-01 6.0459713481844667e-02 -1.3159894667504173e+00 4.5484293421907129e-02 -2.4731741419345418e-01 -2.5700551742957871e+00 -2.3653887581559635e-01 -3.1137086118932018e-02 2.6654335671884191e+00 -3.1544605955847009e-02 9.0529118491491423e-02 6.2108147850050421e-01 9.9963519534176482e-02 4.7439186653422408e-02 -6.7502626245559072e-01 4.4523180667043347e-02 -1.0667265105305361e-01 -1.3119038009401165e+00 -1.0299089533220138e-01 -3.3990392324959089e-02 1.3102219705935885e+00 -2.8194506662747185e-02 1.8737264812321253e+00 2.1252664547221783e-01 3.0839330699418679e+00 -1.9926469479906437e+00 4.9712442072077201e-02 -2.8022822630831183e+00 -2.0296899273437354e+00 -2.4157444616890389e-01 -4.2017541532504410e+00 2.1051672617908004e+00 -3.1544605955846967e-02 4.6464210485961530e+00 1.7915251532300338e+00 3.0203028610833210e-01 1.9704237405656340e+00 -1.7313569259864536e+00 5.5122015189276889e-02 -2.3413584767742703e+00 -1.7967479575676801e+00 -3.0854432037792984e-01 -3.0744784483041041e+00 1.7800228626355534e+00 -3.7728016339224311e-02 2.7190954823082802e+00 3.4716310133082287e+00 4.9260585375661226e-01 1.7676092296014347e+00 -3.8635525506347230e+00 -1.3286945305888362e-01 -1.7111219279589804e+00 -2.9653616474086357e+00 -5.1630578531751348e-01 -1.5734000734003939e+00 2.6733152678297869e+00 9.0529118491491450e-02 1.7915251532300340e+00 5.4612700898601769e+00 5.7175613885600918e-01 1.8616637144197341e+00 -5.0979242109478404e+00 -2.5428915642018618e-01 -1.9531678067098661e+00 -3.4094880409329016e+00 -5.1665369532127570e-01 -1.8306058504954208e+00 3.7301100789259074e+00 2.6522697901374503e-01 1.6474975613134606e+00 4.9627487398993569e-01 1.4477659013398476e+00 4.0479633707848839e-01 -3.7791857156201003e-01 -1.3380197684107937e+00 -2.5578137821198599e-01 -5.1084248778739250e-01 -7.8894867942975866e-01 -3.5184818975197713e-01 3.1047729795870699e-01 6.2108147850050421e-01 3.0203028610833205e-01 5.7175613885600940e-01 2.9161650151576421e+00 3.9679321645643045e-01 -2.1183769264138416e-01 -2.6909460140105215e+00 -2.0615544447663095e-01 -4.8892692932906379e-01 -1.4756407991251539e+00 -4.3112289435558199e-01 2.1101737051519845e-01 1.3085428659782330e+00 1.4128806715292552e-01 1.7893413873541930e+00 4.0768343416693259e-01 2.7630929950512271e+00 -1.7174395531889475e+00 -8.9409943948568202e-02 -2.5074159964106824e+00 -1.5707159382214646e+00 -3.5502458086338984e-01 -1.7530391614413456e+00 1.5565677775201416e+00 9.9963519534176468e-02 1.9704237405656340e+00 1.8616637144197343e+00 3.9679321645643045e-01 4.0911593120026923e+00 -1.9902334579566587e+00 -2.4457341661433871e-01 -4.2855065476258796e+00 -1.5843349636155102e+00 -3.9612197287330064e-01 -2.7401842580763129e+00 1.6551510336885118e+00 1.8068974414205735e-01 2.4614699159346682e+00 -3.2391719897927032e+00 -3.2378529140259571e-01 -1.8481644166155105e+00 3.5757613807669211e+00 -3.5274224266947887e-02 1.8394448531029912e+00 2.6964527808797607e+00 3.1107002930011812e-01 1.5555220071642597e+00 -2.4931745522303475e+00 4.7439186653422408e-02 -1.7313569259864536e+00 -5.0979242109478404e+00 -2.1183769264138413e-01 -1.9902334579566581e+00 4.8986578595975825e+00 -4.2759547377335949e-02 2.0372915002120666e+00 3.1825793529887232e+00 1.8643971309444177e-01 1.7675947639202600e+00 -3.5231806212620969e+00 6.8707826640282285e-02 -1.6300983238409568e+00 -9.9073047484929136e-02 -1.3339080409350854e+00 -9.6196344952823198e-02 -4.7130992842381730e-02 1.3463549864231303e+00 -3.6882720456949201e-02 8.0602642917957393e-02 6.4072780356711023e-01 9.1859084626966028e-02 5.9081987276843509e-02 -6.7502626245559072e-01 5.5122015189276889e-02 -2.5428915642018624e-01 -2.6909460140105215e+00 -2.4457341661433873e-01 -4.2759547377335949e-02 2.7519848872926831e+00 -4.2478778157667277e-02 2.2811996282176997e-01 1.3191130267270945e+00 2.1468601788928482e-01 7.5448151108262196e-02 -1.3583003866088208e+00 5.8464142476250779e-02 -1.8416655464521563e+00 -3.1156121918737550e-01 -3.1354892881471579e+00 1.8257847241788108e+00 -2.6873069558192766e-02 2.8016327332640008e+00 1.8032847508241558e+00 3.0714741817833224e-01 1.9989491020332257e+00 -1.7513931532113007e+00 4.4523180667043347e-02 -2.3413584767742703e+00 -1.9531678067098663e+00 -2.0615544447663092e-01 -4.2855065476258796e+00 2.0372915002120666e+00 -4.2478778157667270e-02 4.6808813649693279e+00 1.7721695306300451e+00 1.7766147865410156e-01 3.0359772328272978e+00 -1.8923039994717554e+00 5.7736433880390389e-02 -2.7550861205465478e+00 -2.4005561852189414e+00 -4.3886053088688581e-01 -1.6789271864390356e+00 2.6813185720213268e+00 1.2085426491267703e-01 1.5509819776432228e+00 3.4162309841051082e+00 4.8911164849113953e-01 1.7562623144021665e+00 -3.1789971210104886e+00 -1.0667265105305360e-01 -1.7967479575676801e+00 -3.4094880409329020e+00 -4.8892692932906379e-01 -1.5843349636155100e+00 3.1825793529887236e+00 2.2811996282176997e-01 1.7721695306300453e+00 4.7134053592765079e+00 4.8904183986745176e-01 1.9406758742969967e+00 -5.0044929212293345e+00 -2.9266760482403409e-01 -1.9600795893502072e+00 -4.4649073241491272e-01 -7.8729028094733977e-01 -4.3294344315810246e-01 3.6219616270745575e-01 6.4248006771059440e-01 2.4069302895360367e-01 4.8802683129599428e-01 1.4334658996817584e+00 4.0318373940432661e-01 -3.2296919733457613e-01 -1.3119038009401165e+00 -3.0854432037792984e-01 -5.1665369532127570e-01 -1.4756407991251539e+00 -3.9612197287330064e-01 1.8643971309444179e-01 1.3191130267270950e+00 1.7766147865410148e-01 4.8904183986745176e-01 2.8222320822576972e+00 4.7433324258677811e-01 -2.3959092189457887e-01 -2.6424561953645345e+00 -1.5826175318947722e-01 -1.6958178484124908e+00 -4.2976624798929430e-01 -2.3242747417231313e+00 1.8136799884648374e+00 7.0695163434341915e-02 2.0022836845837069e+00 1.7384239874589773e+00 4.0064702174272609e-01 2.7254788131039662e+00 -1.8214076875130749e+00 -1.0299089533220140e-01 -3.0744784483041041e+00 -1.8306058504954208e+00 -4.3112289435558188e-01 -2.7401842580763125e+00 1.7675947639202603e+00 2.1468601788928482e-01 3.0359772328272987e+00 1.9406758742969967e+00 4.7433324258677806e-01 4.5739999133476861e+00 -1.9125432277200844e+00 -1.9648140797605229e-01 -4.1988021957591108e+00 2.6680200813320809e+00 3.6066819270948192e-01 1.8146648177451681e+00 -3.0726027934472393e+00 4.8733331255074855e-02 -1.6298761998548819e+00 -3.8079703333162729e+00 -3.7581658496807424e-01 -1.6873201035571177e+00 3.5117688964964393e+00 -3.3990392324959103e-02 1.7800228626355534e+00 3.7301100789259074e+00 2.1101737051519848e-01 1.6551510336885116e+00 -3.5231806212620969e+00 7.5448151108262182e-02 -1.8923039994717554e+00 -5.0044929212293345e+00 -2.3959092189457876e-01 -1.9125432277200844e+00 5.4983476125005160e+00 -4.6469146400406509e-02 1.8722048165346084e+00 1.0753881426485043e-01 6.1724188002409319e-01 5.8743937054015205e-02 6.1350328140797994e-02 -6.7666605238199795e-01 4.2899877608702265e-02 -1.1701209251023341e-01 -1.3126476455892890e+00 -7.6220435132645814e-02 -4.6675104325001680e-02 1.3102219705935887e+00 -3.7728016339224305e-02 2.6522697901374503e-01 1.3085428659782330e+00 1.8068974414205735e-01 6.8707826640282271e-02 -1.3583003866088208e+00 5.7736433880390375e-02 -2.9266760482403409e-01 -2.6424561953645345e+00 -1.9648140797605229e-01 -4.6469146400406502e-02 2.7540635633487272e+00 -2.9640133237242860e-02 1.5406163373028297e+00 2.3479871512577588e-01 1.9648963278251383e+00 -1.6060545079789823e+00 3.3867730196867826e-02 -1.7681719407776055e+00 -1.6703194757619206e+00 -2.5232226186235340e-01 -2.4520737725712953e+00 1.8062331817811683e+00 -2.8194506662747174e-02 2.7190954823082802e+00 1.6474975613134606e+00 1.4128806715292547e-01 2.4614699159346682e+00 -1.6300983238409568e+00 5.8464142476250792e-02 -2.7550861205465478e+00 -1.9600795893502072e+00 -1.5826175318947722e-01 -4.1988021957591108e+00 1.8722048165346081e+00 -2.9640133237242856e-02 4.0286723035864735e+00 24 25 26 84 85 86 99 100 101 39 40 41 27 28 29 87 88 89 102 103 104 42 43 44 4.6836793992097450e+00 9.3969284880623005e-01 1.9366360087166048e+00 -5.0097072096268818e+00 -7.9761493920103332e-01 -1.9743436371950656e+00 -3.2983017130001540e+00 -8.9403540275843374e-01 -1.5349334824275278e+00 3.1534584983313190e+00 6.4591077122983243e-01 1.7620611391735672e+00 3.2249098554914988e+00 8.7005808509652738e-01 1.6461777135253355e+00 -3.0863969894739527e+00 -4.9688791595487491e-01 -1.7245437731405997e+00 -2.1896787620181786e+00 -7.5811810693366855e-01 -1.5355649578534469e+00 2.5220369210866043e+00 4.9099465971542111e-01 1.4245109892011354e+00 9.3969284880622994e-01 3.1849444928396999e+00 9.3509944848713444e-01 -8.1130790538832265e-01 -2.8695964003989181e+00 -6.2616945749669251e-01 -9.4378787935210973e-01 -1.7662034862089049e+00 -7.3388316921478824e-01 6.4723918151491544e-01 1.5022588180392669e+00 6.0959715086167354e-01 8.7577338040679475e-01 1.6982603203534024e+00 7.4026705552430383e-01 -7.2902207360953630e-01 -1.4899524804108724e+00 -7.0058362779618066e-01 -7.5600502690101323e-01 -1.0408256129953097e+00 -7.6001086683025576e-01 7.7741747452304155e-01 7.8111434878163710e-01 5.3568346646480625e-01 1.9366360087166048e+00 9.3509944848713467e-01 4.6525094409273944e+00 -1.9903070680056321e+00 -6.2015191912962297e-01 -4.2480818183001574e+00 -1.7946111760981298e+00 -8.1008360553465708e-01 -2.7137464121173021e+00 1.7781157072990528e+00 6.1630020959978182e-01 3.0192516869300530e+00 1.6390273784997043e+00 7.3073220826964702e-01 2.6576993336165904e+00 -1.7691427780710860e+00 -4.9213542575560576e-01 -3.0293553421142039e+00 -1.5343176920167763e+00 -7.6151408599696879e-01 -2.2114311702893796e+00 1.7345996196762619e+00 4.0175317006029171e-01 1.8731542813470079e+00 -5.0097072096268818e+00 -8.1130790538832254e-01 -1.9903070680056325e+00 5.5558660008248264e+00 5.6593684701006686e-01 1.9571627896686061e+00 3.7323103539702762e+00 7.4981377328438503e-01 1.6427676174322561e+00 -3.5960903732137970e+00 -4.4917771710538451e-01 -1.9241246066452036e+00 -3.6900616040210767e+00 -8.3758496957039585e-01 -1.6391667338167621e+00 3.5034480557504488e+00 4.1568111617224285e-01 1.7776758160295447e+00 2.5266455424051433e+00 7.6295771443052030e-01 1.7092267923453275e+00 -3.0224107660889388e+00 -3.9631885883311280e-01 -1.5332346070081389e+00 -7.9761493920103343e-01 -2.8695964003989181e+00 -6.2015191912962297e-01 5.6593684701006697e-01 2.8030722803572510e+00 3.8957563766802938e-01 7.4914859707231707e-01 1.5232647097558722e+00 5.0806976598801501e-01 -4.3181167908524187e-01 -1.4210328753459023e+00 -3.6368776044291684e-01 -6.1641468447668923e-01 -1.5085478892528341e+00 -4.2294946387821114e-01 4.4805147629757441e-01 1.4000018680126511e+00 3.6320461865512615e-01 5.2288760612241447e-01 8.1639153067487669e-01 4.3149560992431529e-01 -4.4018322373940832e-01 -7.4355322380299615e-01 -2.8555648878473527e-01 -1.9743436371950651e+00 -6.2616945749669262e-01 -4.2480818183001574e+00 1.9571627896686064e+00 3.8957563766802938e-01 4.0275170691812185e+00 1.6695724722989631e+00 5.1830615291464199e-01 2.4705969486585397e+00 -1.6970553565213451e+00 -3.3623413643439826e-01 -2.7566413420068301e+00 -1.6085084609627485e+00 -5.6288196417810399e-01 -2.4222862538719410e+00 1.7839154428379274e+00 3.3761765915786357e-01 2.7157127499572136e+00 1.4487123907284161e+00 5.4452740730548377e-01 1.9123500087894048e+00 -1.5794556408547535e+00 -2.6474129893682419e-01 -1.6991673624074488e+00 -3.2983017130001540e+00 -9.4378787935210973e-01 -1.7946111760981296e+00 3.7323103539702762e+00 7.4914859707231707e-01 1.6695724722989631e+00 5.1882123813401355e+00 1.0603020121675957e+00 1.7504922913045948e+00 -4.9909821595305734e+00 -7.5656652579629369e-01 -1.8964135754876421e+00 -2.7239708916323928e+00 -8.7805707634693619e-01 -1.4412390402458026e+00 2.5665133621999101e+00 4.9445722492924760e-01 1.6849382336014931e+00 3.1772659583344338e+00 8.4098544266281738e-01 1.5652352437133656e+00 -3.6510472916816337e+00 -5.6648179533663867e-01 -1.5379744490868452e+00 -8.9403540275843352e-01 -1.7662034862089049e+00 -8.1008360553465708e-01 7.4981377328438503e-01 1.5232647097558722e+00 5.1830615291464199e-01 1.0603020121675957e+00 3.1463047982773849e+00 7.4322874465246469e-01 -7.4963581792277934e-01 -2.8698973337040172e+00 -6.3363297448429590e-01 -8.9453777965939729e-01 -1.0459225540869415e+00 -6.2690326759823067e-01 7.0330650581045673e-01 8.1112458693459966e-01 6.4575259773279603e-01 8.5449782483622228e-01 1.6984611868517290e+00 7.0920623906824032e-01 -8.2971111575804923e-01 -1.4971319078197223e+00 -5.4587388675096060e-01 -1.5349334824275280e+00 -7.3388316921478847e-01 -2.7137464121173021e+00 1.6427676174322559e+00 5.0806976598801490e-01 2.4705969486585397e+00 1.7504922913045944e+00 7.4322874465246469e-01 3.9239576831843204e+00 -1.9090698522629659e+00 -6.4321062825706143e-01 -4.1713922673640180e+00 -1.4292308104389941e+00 -6.1022720430448174e-01 -1.6651563662103845e+00 1.4605804767408912e+00 4.0156130573327287e-01 1.9112274964586953e+00 1.5959234416185686e+00 7.1039693420030514e-01 2.6047481489363888e+00 -1.5765296819668222e+00 -3.7593574879772623e-01 -2.3602352315462398e+00 3.1534584983313190e+00 6.4723918151491544e-01 1.7781157072990528e+00 -3.5960903732137970e+00 -4.3181167908524187e-01 -1.6970553565213453e+00 -4.9909821595305734e+00 -7.4963581792277934e-01 -1.9090698522629665e+00 4.9167496097205481e+00 4.7996178890019781e-01 2.0265338485339748e+00 2.5426555297624063e+00 6.9423130041023495e-01 1.4724010527217715e+00 -2.4437423223288453e+00 -3.4518254262116921e-01 -1.6940892479238865e+00 -3.0320578803497211e+00 -7.0038823962982966e-01 -1.7006605210046495e+00 3.4500090976086626e+00 4.0558600843367248e-01 1.7238243691580508e+00 6.4591077122983243e-01 1.5022588180392669e+00 6.1630020959978171e-01 -4.4917771710538446e-01 -1.4210328753459023e+00 -3.3623413643439826e-01 -7.5656652579629380e-01 -2.8698973337040172e+00 -6.4321062825706155e-01 4.7996178890019781e-01 2.8316615782673717e+00 4.4188710575243911e-01 5.1899482749539938e-01 7.9937469215484658e-01 4.2326427306436609e-01 -3.6792918827220850e-01 -7.3426805379297766e-01 -3.5094254516259960e-01 -5.0608117876409753e-01 -1.4949768778569741e+00 -4.9384984919101016e-01 4.3488722231255461e-01 1.3868800522383857e+00 3.4278557062848297e-01 1.7620611391735672e+00 6.0959715086167354e-01 3.0192516869300530e+00 -1.9241246066452036e+00 -3.6368776044291679e-01 -2.7566413420068301e+00 -1.8964135754876421e+00 -6.3363297448429612e-01 -4.1713922673640180e+00 2.0265338485339748e+00 4.4188710575243917e-01 4.6001345177306847e+00 1.6595298923366948e+00 6.2410750313022245e-01 1.8857011165666906e+00 -1.6644401211951430e+00 -3.2352186240771175e-01 -2.2473618971946414e+00 -1.6548216413825410e+00 -6.6780811754930225e-01 -2.9454435924112090e+00 1.6916750646662928e+00 3.1305895513989201e-01 2.6157517777492751e+00 3.2249098554914988e+00 8.7577338040679475e-01 1.6390273784997043e+00 -3.6900616040210767e+00 -6.1641468447668912e-01 -1.6085084609627485e+00 -2.7239708916323933e+00 -8.9453777965939718e-01 -1.4292308104389941e+00 2.5426555297624063e+00 5.1899482749539938e-01 1.6595298923366948e+00 5.0369837939369937e+00 1.0005852225965186e+00 1.7006268201467463e+00 -4.7999088917851571e+00 -7.0567160131585260e-01 -1.8342468868062285e+00 -3.1094391498162492e+00 -8.6952312564315215e-01 -1.6537968791544979e+00 3.5188313580639772e+00 6.9079376059637909e-01 1.5265989463793268e+00 8.7005808509652738e-01 1.6982603203534024e+00 7.3073220826964702e-01 -8.3758496957039585e-01 -1.5085478892528343e+00 -5.6288196417810388e-01 -8.7805707634693608e-01 -1.0459225540869412e+00 -6.1022720430448185e-01 6.9423130041023495e-01 7.9937469215484658e-01 6.2410750313022234e-01 1.0005852225965186e+00 3.0659158931104860e+00 7.1006922027900221e-01 -6.8248755372917913e-01 -2.7564466404724053e+00 -5.8680351292442678e-01 -8.1859991896898276e-01 -1.6856613826516296e+00 -7.3983390286927331e-01 6.5185491051221245e-01 1.4330275608450755e+00 4.3483765259741541e-01 1.6461777135253355e+00 7.4026705552430361e-01 2.6576993336165908e+00 -1.6391667338167621e+00 -4.2294946387821108e-01 -2.4222862538719410e+00 -1.4412390402458026e+00 -6.2690326759823067e-01 -1.6651563662103845e+00 1.4724010527217717e+00 4.2326427306436615e-01 1.8857011165666906e+00 1.7006268201467460e+00 7.1006922027900221e-01 3.8558360906476086e+00 -1.8533608202979064e+00 -6.1169667685706575e-01 -4.0597876741879029e+00 -1.4324475782760440e+00 -6.8080666818050095e-01 -2.5774404006221219e+00 1.5470085862426610e+00 4.6875552764633671e-01 2.3254341540614627e+00 -3.0863969894739527e+00 -7.2902207360953630e-01 -1.7691427780710860e+00 3.5034480557504488e+00 4.4805147629757441e-01 1.7839154428379271e+00 2.5665133621999097e+00 7.0330650581045662e-01 1.4605804767408910e+00 -2.4437423223288448e+00 -3.6792918827220850e-01 -1.6644401211951427e+00 -4.7999088917851571e+00 -6.8248755372917902e-01 -1.8533608202979062e+00 4.6925332836391052e+00 4.2209052567216254e-01 1.9584178582598311e+00 2.9862280560000949e+00 5.6582610941466016e-01 1.6342016677469011e+00 -3.4186745540016008e+00 -3.5983580158393030e-01 -1.5501717260214174e+00 -4.9688791595487486e-01 -1.4899524804108724e+00 -4.9213542575560576e-01 4.1568111617224285e-01 1.4000018680126511e+00 3.3761765915786357e-01 4.9445722492924771e-01 8.1112458693459966e-01 4.0156130573327281e-01 -3.4518254262116915e-01 -7.3426805379297766e-01 -3.2352186240771175e-01 -7.0567160131585260e-01 -2.7564466404724053e+00 -6.1169667685706575e-01 4.2209052567216260e-01 2.6961701583960145e+00 3.9593097626338558e-01 6.0058806503122575e-01 1.4407701416336824e+00 5.6804452421627982e-01 -3.8507487191298179e-01 -1.3673995803006924e+00 -2.7580050035041870e-01 -1.7245437731405997e+00 -7.0058362779618055e-01 -3.0293553421142039e+00 1.7776758160295447e+00 3.6320461865512610e-01 2.7157127499572136e+00 1.6849382336014933e+00 6.4575259773279603e-01 1.9112274964586953e+00 -1.6940892479238865e+00 -3.5094254516259960e-01 -2.2473618971946414e+00 -1.8342468868062285e+00 -5.8680351292442678e-01 -4.0597876741879029e+00 1.9584178582598311e+00 3.9593097626338547e-01 4.4506388695554495e+00 1.6570808411729758e+00 5.4456712906948479e-01 2.8723886514572752e+00 -1.8252328411931291e+00 -3.1112563583758579e-01 -2.6134628539318880e+00 -2.1896787620181781e+00 -7.5600502690101334e-01 -1.5343176920167763e+00 2.5266455424051437e+00 5.2288760612241447e-01 1.4487123907284161e+00 3.1772659583344338e+00 8.5449782483622228e-01 1.5959234416185686e+00 -3.0320578803497211e+00 -5.0608117876409753e-01 -1.6548216413825410e+00 -3.1094391498162492e+00 -8.1859991896898276e-01 -1.4324475782760440e+00 2.9862280560000949e+00 6.0058806503122586e-01 1.6570808411729758e+00 4.3764654899274751e+00 8.4038325983177020e-01 1.7377929806454544e+00 -4.7354292544829955e+00 -7.3767063118753973e-01 -1.8179227424900557e+00 -7.5811810693366855e-01 -1.0408256129953097e+00 -7.6151408599696879e-01 7.6295771443052030e-01 8.1639153067487669e-01 5.4452740730548377e-01 8.4098544266281750e-01 1.6984611868517290e+00 7.1039693420030514e-01 -7.0038823962982966e-01 -1.4949768778569741e+00 -6.6780811754930225e-01 -8.6952312564315215e-01 -1.6856613826516293e+00 -6.8080666818050095e-01 5.6582610941466005e-01 1.4407701416336822e+00 5.4456712906948490e-01 8.4038325983177020e-01 3.0166190764546732e+00 8.3191759365976603e-01 -6.8212305413311713e-01 -2.7507780621110482e+00 -5.2128019250826862e-01 -1.5355649578534467e+00 -7.6001086683025576e-01 -2.2114311702893796e+00 1.7092267923453275e+00 4.3149560992431529e-01 1.9123500087894048e+00 1.5652352437133656e+00 7.0920623906824032e-01 2.6047481489363888e+00 -1.7006605210046497e+00 -4.9384984919101005e-01 -2.9454435924112090e+00 -1.6537968791544984e+00 -7.3983390286927331e-01 -2.5774404006221219e+00 1.6342016677469011e+00 5.6804452421627982e-01 2.8723886514572756e+00 1.7377929806454546e+00 8.3191759365976614e-01 4.3277769493368865e+00 -1.7564343264384534e+00 -5.4696934797806251e-01 -3.9829485951972465e+00 2.5220369210866043e+00 7.7741747452304155e-01 1.7345996196762621e+00 -3.0224107660889388e+00 -4.4018322373940838e-01 -1.5794556408547533e+00 -3.6510472916816332e+00 -8.2971111575804912e-01 -1.5765296819668222e+00 3.4500090976086626e+00 4.3488722231255461e-01 1.6916750646662928e+00 3.5188313580639772e+00 6.5185491051221256e-01 1.5470085862426617e+00 -3.4186745540016013e+00 -3.8507487191298179e-01 -1.8252328411931289e+00 -4.7354292544829955e+00 -6.8212305413311736e-01 -1.7564343264384534e+00 5.3366844894959238e+00 4.7293265819574859e-01 1.7643692198679446e+00 4.9099465971542111e-01 7.8111434878163732e-01 4.0175317006029171e-01 -3.9631885883311280e-01 -7.4355322380299615e-01 -2.6474129893682424e-01 -5.6648179533663867e-01 -1.4971319078197223e+00 -3.7593574879772618e-01 4.0558600843367248e-01 1.3868800522383855e+00 3.1305895513989201e-01 6.9079376059637909e-01 1.4330275608450758e+00 4.6875552764633671e-01 -3.5983580158393036e-01 -1.3673995803006924e+00 -3.1112563583758579e-01 -7.3767063118753973e-01 -2.7507780621110482e+00 -5.4696934797806263e-01 4.7293265819574865e-01 2.7578408121693601e+00 3.1520437870367879e-01 1.4245109892011354e+00 5.3568346646480625e-01 1.8731542813470079e+00 -1.5332346070081389e+00 -2.8555648878473527e-01 -1.6991673624074488e+00 -1.5379744490868452e+00 -5.4587388675096060e-01 -2.3602352315462398e+00 1.7238243691580508e+00 3.4278557062848297e-01 2.6157517777492751e+00 1.5265989463793268e+00 4.3483765259741536e-01 2.3254341540614627e+00 -1.5501717260214174e+00 -2.7580050035041870e-01 -2.6134628539318880e+00 -1.8179227424900561e+00 -5.2128019250826862e-01 -3.9829485951972465e+00 1.7643692198679446e+00 3.1520437870367884e-01 3.8414738299250808e+00 84 85 86 144 145 146 159 160 161 99 100 101 87 88 89 147 148 149 162 163 164 102 103 104 4.4094453424793238e+00 9.0791270441243976e-01 1.8493710803336931e+00 -4.7312727612202146e+00 -7.5929248781907899e-01 -1.8859075552408453e+00 -3.1169705340461302e+00 -8.6823870246025592e-01 -1.4583495783069114e+00 2.9735429573603400e+00 6.1205254792590280e-01 1.6901107806334157e+00 3.0927207794773914e+00 8.4521474724536327e-01 1.5806341299075299e+00 -2.9573313923918243e+00 -4.7303576617760218e-01 -1.6623537703285378e+00 -2.0874830212843616e+00 -7.3403309068154199e-01 -1.4762327803323116e+00 2.4173486296254758e+00 4.6942004755477296e-01 1.3627276933339671e+00 9.0791270441243976e-01 3.0159305412813215e+00 9.1440254860174475e-01 -7.8443836822730806e-01 -2.6844994834502005e+00 -5.9977922827470542e-01 -9.1986115968806104e-01 -1.6749733423244921e+00 -7.1311589112817875e-01 6.2385280006088206e-01 1.4014821242866160e+00 5.9176299847369174e-01 8.5414186035150186e-01 1.6459597475120733e+00 7.2330902987291834e-01 -7.0557556355330286e-01 -1.4354130950509278e+00 -6.8483762787356894e-01 -7.3450308298782518e-01 -1.0138730270771956e+00 -7.4818903414941673e-01 7.5847080963167368e-01 7.4538653482280570e-01 5.1644720447751480e-01 1.8493710803336927e+00 9.1440254860174475e-01 4.4233084056779530e+00 -1.9077975691814066e+00 -5.8630920807151843e-01 -4.0046631906210592e+00 -1.7234230614893444e+00 -7.9199789291683109e-01 -2.5642143596703839e+00 1.7071966278260660e+00 5.8913508192389452e-01 2.8781830889240179e+00 1.5725789812448319e+00 7.1053021480202760e-01 2.5540385205877563e+00 -1.7025229740506995e+00 -4.7226009459404372e-01 -2.9374274734102030e+00 -1.4715628906548754e+00 -7.4537352265840751e-01 -2.1444892479489948e+00 1.6761598059717355e+00 3.8187287291313288e-01 1.7952642564609147e+00 -4.7312727612202137e+00 -7.8443836822730806e-01 -1.9077975691814069e+00 5.2892029219352450e+00 5.2407692631344338e-01 1.8681137114541990e+00 3.5547375921077293e+00 7.2787112636554485e-01 1.5673702423150546e+00 -3.4213206606455202e+00 -4.1427173468615269e-01 -1.8575730501775833e+00 -3.5655021210508226e+00 -8.1216626608186215e-01 -1.5679781920729157e+00 3.3788411117073101e+00 3.8861683371711614e-01 1.7143375239982752e+00 2.4246730266006198e+00 7.4073269763295579e-01 1.6526372254110411e+00 -2.9293591094343490e+00 -3.7042121503373682e-01 -1.4691098917466632e+00 -7.5929248781907910e-01 -2.6844994834502005e+00 -5.8630920807151843e-01 5.2407692631344338e-01 2.6226976802757811e+00 3.5693690552520579e-01 7.1484699716488842e-01 1.4202915205955051e+00 4.7924353884731791e-01 -3.9648683912975863e-01 -1.3226127858852939e+00 -3.3522760867768248e-01 -5.8739566249042652e-01 -1.4482240014438883e+00 -3.9780297766260903e-01 4.1598469320811715e-01 1.3446709088967028e+00 3.3675413201947907e-01 4.9684062516149086e-01 7.7870403550831924e-01 4.0776933126238402e-01 -4.0857425240867562e-01 -7.1102787449692628e-01 -2.6136411324257691e-01 -1.8859075552408455e+00 -5.9977922827470553e-01 -4.0046631906210601e+00 1.8681137114541992e+00 3.5693690552520579e-01 3.7839757464873318e+00 1.5920274562640686e+00 4.9752827513426578e-01 2.3162654687785742e+00 -1.6227206258052300e+00 -3.0783720105894835e-01 -2.6087659825057807e+00 -1.5421139276604894e+00 -5.3993396977711894e-01 -2.3150942454344658e+00 1.7207234392836397e+00 3.1508785519454413e-01 2.6138910261680217e+00 1.3868847512488121e+00 5.2260776259635133e-01 1.8353225115353473e+00 -1.5170072495441549e+00 -2.4461039933959391e-01 -1.6209313344079674e+00 -3.1169705340461302e+00 -9.1986115968806115e-01 -1.7234230614893444e+00 3.5547375921077289e+00 7.1484699716488842e-01 1.5920274562640686e+00 4.8974528877144694e+00 1.0312868193821279e+00 1.6594348363929388e+00 -4.6983108279095331e+00 -7.1577533160785956e-01 -1.8122469237573886e+00 -2.6238981825009655e+00 -8.5542974837837571e-01 -1.3743504451880451e+00 2.4649509893525270e+00 4.7094056498705061e-01 1.6251654185306776e+00 3.0428590347806290e+00 8.1604817747837588e-01 1.5007878604253664e+00 -3.5208209594987268e+00 -5.4205631933814569e-01 -1.4673951411782733e+00 -8.6823870246025592e-01 -1.6749733423244921e+00 -7.9199789291683109e-01 7.2787112636554485e-01 1.4202915205955051e+00 4.9752827513426573e-01 1.0312868193821276e+00 2.9583301586435629e+00 7.1620243694933838e-01 -7.1998074357151798e-01 -2.6701630631182347e+00 -6.1267676651568970e-01 -8.7690710317360621e-01 -1.0172117983448903e+00 -6.0821911291193542e-01 6.8171222510223572e-01 7.7662288492817988e-01 6.3127778123434131e-01 8.3370858787199431e-01 1.6418425766942508e+00 6.9326343468181950e-01 -8.0945220951652286e-01 -1.4347389370738826e+00 -5.2537815565530877e-01 -1.4583495783069111e+00 -7.1311589112817875e-01 -2.5642143596703839e+00 1.5673702423150546e+00 4.7924353884731791e-01 2.3162654687785742e+00 1.6594348363929388e+00 7.1620243694933838e-01 3.6661649502233882e+00 -1.8212566947954307e+00 -6.1196483340945518e-01 -3.9142598594254179e+00 -1.3658771493812962e+00 -5.8963835505777473e-01 -1.5855257575172812e+00 1.3982347134337409e+00 3.8414046932908574e-01 1.8338441199001749e+00 1.5318160402409533e+00 6.9117108473811517e-01 2.4978826622596038e+00 -1.5113724098990498e+00 -3.5603845026844783e-01 -2.2501572245486581e+00 2.9735429573603400e+00 6.2385280006088206e-01 1.7071966278260660e+00 -3.4213206606455202e+00 -3.9648683912975863e-01 -1.6227206258052305e+00 -4.6983108279095331e+00 -7.1998074357151776e-01 -1.8212566947954312e+00 4.6308504441512239e+00 4.4050484425407443e-01 1.9439500105195511e+00 2.4415961234093788e+00 6.6917316740696697e-01 1.4103223742906388e+00 -2.3452201476020251e+00 -3.2052161866649520e-01 -1.6379667719745838e+00 -2.8999375060785422e+00 -6.7537534681343092e-01 -1.6422924993981285e+00 3.3187996173146783e+00 3.7883373645927876e-01 1.6627675793371164e+00 6.1205254792590280e-01 1.4014821242866158e+00 5.8913508192389452e-01 -4.1427173468615264e-01 -1.3226127858852936e+00 -3.0783720105894830e-01 -7.1577533160785978e-01 -2.6701630631182347e+00 -6.1196483340945518e-01 4.4050484425407449e-01 2.6397311969370074e+00 4.0865926334415226e-01 4.9057768830407950e-01 7.6162389619261839e-01 4.0197258457694202e-01 -3.3850071703019219e-01 -7.0288848431358053e-01 -3.2602086899529975e-01 -4.7740025805783104e-01 -1.4323726985440532e+00 -4.7143690409526395e-01 4.0281296089797891e-01 1.3251998144449200e+00 3.1749287771397838e-01 1.6901107806334159e+00 5.9176299847369174e-01 2.8781830889240179e+00 -1.8575730501775836e+00 -3.3522760867768259e-01 -2.6087659825057807e+00 -1.8122469237573886e+00 -6.1267676651568936e-01 -3.9142598594254179e+00 1.9439500105195511e+00 4.0865926334415226e-01 4.3579719730114963e+00 1.6012253884285597e+00 6.0639193017242976e-01 1.8085470078315247e+00 -1.6052950503312837e+00 -3.0254886442783424e-01 -2.1817546168112942e+00 -1.5895077398301722e+00 -6.4843736963728738e-01 -2.8499507169550071e+00 1.6293365845149008e+00 2.9207641726821920e-01 2.5100291059304625e+00 3.0927207794773905e+00 8.5414186035150186e-01 1.5725789812448319e+00 -3.5655021210508222e+00 -5.8739566249042652e-01 -1.5421139276604894e+00 -2.6238981825009655e+00 -8.7690710317360621e-01 -1.3658771493812962e+00 2.4415961234093784e+00 4.9057768830407938e-01 1.6012253884285597e+00 4.9481046450929638e+00 9.8055950275192927e-01 1.6371221738533275e+00 -4.7064856056974502e+00 -6.8843943590050771e-01 -1.7732387871360782e+00 -3.0254352561094051e+00 -8.4955949388390184e-01 -1.5974958596812587e+00 3.4388996173789104e+00 6.7702264404093127e-01 1.4677991803324026e+00 8.4521474724536327e-01 1.6459597475120733e+00 7.1053021480202783e-01 -8.1216626608186215e-01 -1.4482240014438881e+00 -5.3993396977711894e-01 -8.5542974837837571e-01 -1.0172117983448903e+00 -5.8963835505777473e-01 6.6917316740696697e-01 7.6162389619261839e-01 6.0639193017242976e-01 9.8055950275192905e-01 3.0440651138329069e+00 6.9018967425355415e-01 -6.5282826704750341e-01 -2.7266323408659145e+00 -5.6364134346795947e-01 -7.9766878418235287e-01 -1.6703350259642911e+00 -7.2485387082020725e-01 6.2314564828583463e-01 1.4107544090813846e+00 4.1095571989504881e-01 1.5806341299075299e+00 7.2330902987291834e-01 2.5540385205877558e+00 -1.5679781920729157e+00 -3.9780297766260897e-01 -2.3150942454344658e+00 -1.3743504451880451e+00 -6.0821911291193542e-01 -1.5855257575172812e+00 1.4103223742906388e+00 4.0197258457694202e-01 1.8085470078315247e+00 1.6371221738533275e+00 6.9018967425355404e-01 3.7841722518616758e+00 -1.7969365642488300e+00 -6.0011480575901743e-01 -3.9893050150998555e+00 -1.3746620825875324e+00 -6.6376427598302334e-01 -2.5184813661920065e+00 1.4858486060458269e+00 4.5442988361317055e-01 2.2616486039626515e+00 -2.9573313923918243e+00 -7.0557556355330298e-01 -1.7025229740506995e+00 3.3788411117073101e+00 4.1598469320811726e-01 1.7207234392836395e+00 2.4649509893525270e+00 6.8171222510223572e-01 1.3982347134337409e+00 -2.3452201476020251e+00 -3.3850071703019219e-01 -1.6052950503312837e+00 -4.7064856056974502e+00 -6.5282826704750330e-01 -1.7969365642488300e+00 4.6039511413856564e+00 3.9700852159263134e-01 1.9025285550877191e+00 2.9020380348152912e+00 5.3798894213735005e-01 1.5783024408962008e+00 -3.3407441315694859e+00 -3.3578983440933519e-01 -1.4950345600704871e+00 -4.7303576617760218e-01 -1.4354130950509278e+00 -4.7226009459404372e-01 3.8861683371711608e-01 1.3446709088967028e+00 3.1508785519454413e-01 4.7094056498705061e-01 7.7662288492817988e-01 3.8414046932908574e-01 -3.2052161866649520e-01 -7.0288848431358064e-01 -3.0254886442783424e-01 -6.8843943590050782e-01 -2.7266323408659145e+00 -6.0011480575901743e-01 3.9700852159263117e-01 2.6741555730204540e+00 3.7477542933381491e-01 5.8504618945933162e-01 1.4199384437479203e+00 5.5708763081563284e-01 -3.5961528901152440e-01 -1.3504538903628343e+00 -2.5616761989218217e-01 -1.6623537703285378e+00 -6.8483762787356883e-01 -2.9374274734102030e+00 1.7143375239982748e+00 3.3675413201947901e-01 2.6138910261680213e+00 1.6251654185306779e+00 6.3127778123434131e-01 1.8338441199001749e+00 -1.6379667719745838e+00 -3.2602086899529975e-01 -2.1817546168112942e+00 -1.7732387871360782e+00 -5.6364134346795958e-01 -3.9893050150998550e+00 1.9025285550877193e+00 3.7477542933381491e-01 4.3959110980046168e+00 1.6026258863252414e+00 5.2244826770056751e-01 2.8214354817146452e+00 -1.7710980545027140e+00 -2.9075576995137414e-01 -2.5565946204661056e+00 -2.0874830212843620e+00 -7.3450308298782518e-01 -1.4715628906548752e+00 2.4246730266006198e+00 4.9684062516149075e-01 1.3868847512488123e+00 3.0428590347806290e+00 8.3370858787199431e-01 1.5318160402409531e+00 -2.8999375060785417e+00 -4.7740025805783104e-01 -1.5895077398301722e+00 -3.0254352561094051e+00 -7.9766878418235265e-01 -1.3746620825875322e+00 2.9020380348152912e+00 5.8504618945933162e-01 1.6026258863252414e+00 4.2778319975639780e+00 8.1787267181493117e-01 1.6799744620448611e+00 -4.6345463102882087e+00 -7.2389594907973842e-01 -1.7655684267872878e+00 -7.3403309068154199e-01 -1.0138730270771956e+00 -7.4537352265840751e-01 7.4073269763295568e-01 7.7870403550831913e-01 5.2260776259635133e-01 8.1604817747837588e-01 1.6418425766942508e+00 6.9117108473811517e-01 -6.7537534681343103e-01 -1.4323726985440532e+00 -6.4843736963728726e-01 -8.4955949388390184e-01 -1.6703350259642911e+00 -6.6376427598302334e-01 5.3798894213735005e-01 1.4199384437479201e+00 5.2244826770056763e-01 8.1787267181493106e-01 2.9901213382923917e+00 8.1850506096531150e-01 -6.5367455768473792e-01 -2.7140256426573419e+00 -4.9715700772162713e-01 -1.4762327803323116e+00 -7.4818903414941673e-01 -2.1444892479489948e+00 1.6526372254110413e+00 4.0776933126238402e-01 1.8353225115353473e+00 1.5007878604253664e+00 6.9326343468181939e-01 2.4978826622596038e+00 -1.6422924993981287e+00 -4.7143690409526395e-01 -2.8499507169550067e+00 -1.5974958596812590e+00 -7.2485387082020714e-01 -2.5184813661920060e+00 1.5783024408962012e+00 5.5708763081563284e-01 2.8214354817146452e+00 1.6799744620448613e+00 8.1850506096531150e-01 4.2655953151002937e+00 -1.6956808493657705e+00 -5.3214564866025960e-01 -3.9073146395138814e+00 2.4173486296254758e+00 7.5847080963167368e-01 1.6761598059717355e+00 -2.9293591094343490e+00 -4.0857425240867556e-01 -1.5170072495441549e+00 -3.5208209594987268e+00 -8.0945220951652286e-01 -1.5113724098990495e+00 3.3187996173146774e+00 4.0281296089797891e-01 1.6293365845149006e+00 3.4388996173789104e+00 6.2314564828583463e-01 1.4858486060458271e+00 -3.3407441315694859e+00 -3.5961528901152440e-01 -1.7710980545027140e+00 -4.6345463102882078e+00 -6.5367455768473792e-01 -1.6956808493657705e+00 5.2504226464717068e+00 4.4688688980597313e-01 1.7038135667792247e+00 4.6942004755477290e-01 7.4538653482280570e-01 3.8187287291313288e-01 -3.7042121503373682e-01 -7.1102787449692628e-01 -2.4461039933959391e-01 -5.4205631933814569e-01 -1.4347389370738826e+00 -3.5603845026844783e-01 3.7883373645927870e-01 1.3251998144449200e+00 2.9207641726821926e-01 6.7702264404093115e-01 1.4107544090813846e+00 4.5442988361317049e-01 -3.3578983440933513e-01 -1.3504538903628345e+00 -2.9075576995137414e-01 -7.2389594907973831e-01 -2.7140256426573419e+00 -5.3214564866025960e-01 4.4688688980597313e-01 2.7289055862418756e+00 2.9517109442515260e-01 1.3627276933339671e+00 5.1644720447751480e-01 1.7952642564609147e+00 -1.4691098917466632e+00 -2.6136411324257691e-01 -1.6209313344079674e+00 -1.4673951411782733e+00 -5.2537815565530877e-01 -2.2501572245486581e+00 1.6627675793371164e+00 3.1749287771397833e-01 2.5100291059304625e+00 1.4677991803324026e+00 4.1095571989504881e-01 2.2616486039626515e+00 -1.4950345600704871e+00 -2.5616761989218217e-01 -2.5565946204661052e+00 -1.7655684267872873e+00 -4.9715700772162708e-01 -3.9073146395138814e+00 1.7038135667792247e+00 2.9517109442515255e-01 3.7680558525825827e+00 39 40 41 99 100 101 114 115 116 54 55 56 42 43 44 102 103 104 117 118 119 57 58 59 4.0035793172215666e+00 1.1532074725245121e+00 1.5650955810337475e+00 -4.3556851922808795e+00 -1.1314522400814524e+00 -1.6441831472869819e+00 -2.7266640671623574e+00 -1.0785955124730284e+00 -1.2011479692270453e+00 2.6683955411075981e+00 9.0651455701234851e-01 1.4460069659136250e+00 2.6872403309747130e+00 1.0675361493473596e+00 1.3298894972184310e+00 -2.6339245697672000e+00 -7.5447140655382583e-01 -1.4188429890935086e+00 -1.7481145721141016e+00 -8.9926470555755511e-01 -1.2151055382030231e+00 2.1051732120206594e+00 7.3652568578164179e-01 1.1382875996447568e+00 1.1532074725245121e+00 3.4270199472291147e+00 1.2249774068445962e+00 -1.1561848786705771e+00 -3.0451980493519395e+00 -9.1821439214789113e-01 -1.1574448191843627e+00 -2.0502406060336753e+00 -9.1569953533519399e-01 9.1524871929992424e-01 1.7224200922135917e+00 8.8354814380132962e-01 1.0877514958884245e+00 1.9693942696564941e+00 9.5154360869118459e-01 -9.9288207243046578e-01 -1.7024415073645462e+00 -9.7294359354344018e-01 -9.0909317421524571e-01 -1.3292680522910389e+00 -9.6929986564437487e-01 1.0593972567877901e+00 1.0083139059419992e+00 7.1608822733379107e-01 1.5650955810337479e+00 1.2249774068445962e+00 4.1837932267226865e+00 -1.6710910511645776e+00 -9.1292374266228837e-01 -3.7850402932199048e+00 -1.4569605588306012e+00 -1.0302813821481631e+00 -2.3538972053542855e+00 1.4733663295630408e+00 8.9435097753408732e-01 2.6539413415965498e+00 1.3342166820834915e+00 9.3471996871050411e-01 2.3307793780280059e+00 -1.4982408253135906e+00 -7.8461274506266654e-01 -2.6954497428303879e+00 -1.2261806960043604e+00 -9.6754670376174567e-01 -1.9212668241638562e+00 1.4797945386328490e+00 6.4131622054567605e-01 1.5871401192211936e+00 -4.3556851922808795e+00 -1.1561848786705771e+00 -1.6710910511645776e+00 4.9869887591363433e+00 1.0188030135445025e+00 1.6594365993348803e+00 3.2100686562554870e+00 1.0714899093319883e+00 1.3278914978836009e+00 -3.1688179252322470e+00 -8.2979126918042667e-01 -1.6358321774911369e+00 -3.1962194963821027e+00 -1.1452150861605650e+00 -1.3651317938271341e+00 3.1044735734247833e+00 7.6738099370408319e-01 1.5229148804706947e+00 2.1030928603848738e+00 1.0157710160559832e+00 1.4273694401242696e+00 -2.6839012353062572e+00 -7.4225369862498825e-01 -1.2655573953305994e+00 -1.1314522400814524e+00 -3.0451980493519395e+00 -9.1292374266228837e-01 1.0188030135445025e+00 2.8996647312415225e+00 6.7947103332773851e-01 1.0753583810715366e+00 1.7528196681075077e+00 7.1007024357935344e-01 -7.9399407683305823e-01 -1.5588072116693825e+00 -6.5884745736860384e-01 -9.4711444134719969e-01 -1.7298520640798634e+00 -6.4654060335322827e-01 8.1323687719162108e-01 1.5382888474576930e+00 6.4942722900177163e-01 7.7934984061330703e-01 1.0526017739994491e+00 6.7638528274356302e-01 -8.1418735415925647e-01 -9.0951769570498697e-01 -4.9704198526830701e-01 -1.6441831472869817e+00 -9.1821439214789091e-01 -3.7850402932199048e+00 1.6594365993348799e+00 6.7947103332773851e-01 3.5848178373916038e+00 1.3712288960994943e+00 7.3237654103712979e-01 2.1318776353302997e+00 -1.4335687744166477e+00 -6.0806861070847451e-01 -2.4015090731048425e+00 -1.3201440091649685e+00 -7.5200575581846940e-01 -2.1124975895773197e+00 1.5310451973881867e+00 6.1492801373412176e-01 2.3899117696452263e+00 1.1769620757175689e+00 7.3150396512750526e-01 1.6308656607495513e+00 -1.3407768376715321e+00 -4.7999079455166027e-01 -1.4384259472146157e+00 -2.7266640671623574e+00 -1.1574448191843625e+00 -1.4569605588306009e+00 3.2100686562554870e+00 1.0753583810715364e+00 1.3712288960994943e+00 4.4125986089306855e+00 1.3100859498273469e+00 1.3693549142934867e+00 -4.3102145767040412e+00 -1.0719426903085698e+00 -1.5334907527722239e+00 -2.2327676342224207e+00 -1.0752683651174972e+00 -1.1466873606741619e+00 2.1701938637648870e+00 7.7059385289339233e-01 1.3867114638375675e+00 2.6203247712133564e+00 1.0101321067017133e+00 1.2263454801342479e+00 -3.1435396220755978e+00 -8.6151441588355970e-01 -1.2165020820878121e+00 -1.0785955124730284e+00 -2.0502406060336757e+00 -1.0302813821481631e+00 1.0714899093319885e+00 1.7528196681075079e+00 7.3237654103712979e-01 1.3100859498273469e+00 3.3301523226379737e+00 9.1538610529271280e-01 -1.0655138483952171e+00 -2.9915743977711657e+00 -8.8198029315456195e-01 -1.1033088162001667e+00 -1.3372094412888884e+00 -7.7900931265086115e-01 9.5611689638624986e-01 1.0493647645823148e+00 8.6899931026933042e-01 1.0415985332277167e+00 1.9292795860998042e+00 8.8226762199460751e-01 -1.1318731117048897e+00 -1.6825918963338700e+00 -7.0775859064019553e-01 -1.2011479692270453e+00 -9.1569953533519399e-01 -2.3538972053542855e+00 1.3278914978836009e+00 7.1007024357935344e-01 2.1318776353302997e+00 1.3693549142934871e+00 9.1538610529271280e-01 3.4111342340580295e+00 -1.5473899707776029e+00 -8.9465243597235133e-01 -3.6374191954744726e+00 -1.1250107753127978e+00 -7.4485614594933802e-01 -1.4011424967877504e+00 1.1930498787125945e+00 6.0658633362631997e-01 1.6318707454829351e+00 1.2665866027937240e+00 8.8174830801231063e-01 2.2301379415648581e+00 -1.2833341783659606e+00 -5.5858287325381351e-01 -2.0125616588196165e+00 2.6683955411075981e+00 9.1524871929992424e-01 1.4733663295630408e+00 -3.1688179252322470e+00 -7.9399407683305823e-01 -1.4335687744166477e+00 -4.3102145767040412e+00 -1.0655138483952169e+00 -1.5473899707776031e+00 4.3164147031698104e+00 8.3987189830058873e-01 1.6967486299200518e+00 2.1436093488912378e+00 9.3495525584827521e-01 1.2136035832333036e+00 -2.1204871501938873e+00 -6.4426433681728723e-01 -1.4461370073841380e+00 -2.5534222031687372e+00 -9.2248775372682768e-01 -1.3979140122714764e+00 3.0245222621302665e+00 7.3618414232360208e-01 1.4412912221334706e+00 9.0651455701234851e-01 1.7224200922135919e+00 8.9435097753408732e-01 -8.2979126918042667e-01 -1.5588072116693825e+00 -6.0806861070847451e-01 -1.0719426903085698e+00 -2.9915743977711653e+00 -8.9465243597235156e-01 8.3987189830058873e-01 2.8625602301979947e+00 7.7351684292459444e-01 7.9852316833971893e-01 1.0403778258537546e+00 6.3918546933779063e-01 -6.7101310825947325e-01 -8.9255680794287773e-01 -6.4184154232356283e-01 -7.4703491052070070e-01 -1.6770064768674759e+00 -7.5631879669034685e-01 7.7487235461651427e-01 1.4945867459855608e+00 5.9382809589826380e-01 1.4460069659136250e+00 8.8354814380132951e-01 2.6539413415965498e+00 -1.6358321774911366e+00 -6.5884745736860384e-01 -2.4015090731048425e+00 -1.5334907527722235e+00 -8.8198029315456172e-01 -3.6374191954744735e+00 1.6967486299200514e+00 7.7351684292459444e-01 4.0448334262179104e+00 1.3553562460497353e+00 8.2706439391029607e-01 1.6130648557408831e+00 -1.4109931307503512e+00 -6.0128348459709213e-01 -1.9557033756352165e+00 -1.3300572704433562e+00 -8.9356757700591460e-01 -2.5586917574468413e+00 1.4122614895736556e+00 5.5154943148995239e-01 2.2414837781060317e+00 2.6872403309747130e+00 1.0877514958884245e+00 1.3342166820834915e+00 -3.1962194963821027e+00 -9.4711444134719969e-01 -1.3201440091649685e+00 -2.2327676342224207e+00 -1.1033088162001667e+00 -1.1250107753127978e+00 2.1436093488912378e+00 7.9852316833971904e-01 1.3553562460497353e+00 4.3330233871034309e+00 1.2443920681380694e+00 1.3689345515344988e+00 -4.2015936139321015e+00 -1.0107220306574793e+00 -1.5266398541451389e+00 -2.5737499111967037e+00 -1.0478978238281984e+00 -1.3231681396987909e+00 3.0404575887639456e+00 9.7837637966683089e-01 1.2364552986539725e+00 1.0675361493473599e+00 1.9693942696564941e+00 9.3471996871050411e-01 -1.1452150861605650e+00 -1.7298520640798634e+00 -7.5200575581846951e-01 -1.0752683651174970e+00 -1.3372094412888884e+00 -7.4485614594933791e-01 9.3495525584827521e-01 1.0403778258537546e+00 8.2706439391029607e-01 1.2443920681380694e+00 3.2419644607688540e+00 8.9275932736193875e-01 -9.9211599567895492e-01 -2.8804576329575942e+00 -8.4357631175988734e-01 -9.7927683252090258e-01 -1.9178288101464036e+00 -9.2267003949018600e-01 9.4499280614421521e-01 1.6136113921936461e+00 6.0856456303514295e-01 1.3298894972184310e+00 9.5154360869118459e-01 2.3307793780280059e+00 -1.3651317938271341e+00 -6.4654060335322816e-01 -2.1124975895773197e+00 -1.1466873606741619e+00 -7.7900931265086115e-01 -1.4011424967877504e+00 1.2136035832333039e+00 6.3918546933779075e-01 1.6130648557408831e+00 1.3689345515344988e+00 8.9275932736193853e-01 3.4120308374819999e+00 -1.5383987730403126e+00 -8.6503153382393838e-01 -3.6095390773921827e+00 -1.1320748834379428e+00 -8.4197108017486544e-01 -2.2355014269442197e+00 1.2698651789933182e+00 6.4906412461197949e-01 2.0028055194505852e+00 -2.6339245697672000e+00 -9.9288207243046578e-01 -1.4982408253135904e+00 3.1044735734247833e+00 8.1323687719162097e-01 1.5310451973881869e+00 2.1701938637648870e+00 9.5611689638624986e-01 1.1930498787125943e+00 -2.1204871501938873e+00 -6.7101310825947325e-01 -1.4109931307503512e+00 -4.2015936139321015e+00 -9.9211599567895492e-01 -1.5383987730403126e+00 4.1826808698189053e+00 7.7043769459812483e-01 1.6818016585449536e+00 2.5365083101192205e+00 7.9749939930070446e-01 1.3342474517729606e+00 -3.0378512832346072e+00 -6.8127969110780595e-01 -1.2925114573144429e+00 -7.5447140655382583e-01 -1.7024415073645462e+00 -7.8461274506266654e-01 7.6738099370408319e-01 1.5382888474576930e+00 6.1492801373412176e-01 7.7059385289339222e-01 1.0493647645823145e+00 6.0658633362631986e-01 -6.4426433681728723e-01 -8.9255680794287773e-01 -6.0128348459709213e-01 -1.0107220306574796e+00 -2.8804576329575933e+00 -8.6503153382393838e-01 7.7043769459812494e-01 2.7363346655095078e+00 7.2755181803368252e-01 8.3923091590379739e-01 1.6206845790730378e+00 8.0848934868581246e-01 -7.3818568307080523e-01 -1.4692169083575357e+00 -5.0662775059624021e-01 -1.4188429890935086e+00 -9.7294359354344018e-01 -2.6954497428303874e+00 1.5229148804706947e+00 6.4942722900177174e-01 2.3899117696452263e+00 1.3867114638375677e+00 8.6899931026933042e-01 1.6318707454829351e+00 -1.4461370073841380e+00 -6.4184154232356283e-01 -1.9557033756352165e+00 -1.5266398541451391e+00 -8.4357631175988701e-01 -3.6095390773921827e+00 1.6818016585449536e+00 7.2755181803368252e-01 3.9905385451402959e+00 1.3726065072009028e+00 7.9264842366454924e-01 2.5198838634790826e+00 -1.5724146594313331e+00 -5.8026533334244368e-01 -2.2715127278897551e+00 -1.7481145721141016e+00 -9.0909317421524560e-01 -1.2261806960043606e+00 2.1030928603848738e+00 7.7934984061330703e-01 1.1769620757175692e+00 2.6203247712133564e+00 1.0415985332277167e+00 1.2665866027937240e+00 -2.5534222031687377e+00 -7.4703491052070070e-01 -1.3300572704433562e+00 -2.5737499111967033e+00 -9.7927683252090247e-01 -1.1320748834379428e+00 2.5365083101192205e+00 8.3923091590379739e-01 1.3726065072009026e+00 3.7156031435339587e+00 1.0028713366539603e+00 1.3685697872719886e+00 -4.1002423987718677e+00 -1.0276457091419322e+00 -1.4964121230985261e+00 -8.9926470555755522e-01 -1.3292680522910389e+00 -9.6754670376174579e-01 1.0157710160559832e+00 1.0526017739994491e+00 7.3150396512750537e-01 1.0101321067017133e+00 1.9292795860998042e+00 8.8174830801231063e-01 -9.2248775372682779e-01 -1.6770064768674759e+00 -8.9356757700591460e-01 -1.0478978238281984e+00 -1.9178288101464038e+00 -8.4197108017486555e-01 7.9749939930070424e-01 1.6206845790730378e+00 7.9264842366454935e-01 1.0028713366539603e+00 3.1582121312605489e+00 1.0437701060983375e+00 -9.5662357559977995e-01 -2.8366747311279208e+00 -7.4658544196017806e-01 -1.2151055382030234e+00 -9.6929986564437487e-01 -1.9212668241638562e+00 1.4273694401242696e+00 6.7638528274356302e-01 1.6308656607495511e+00 1.2263454801342477e+00 8.8226762199460751e-01 2.2301379415648581e+00 -1.3979140122714764e+00 -7.5631879669034685e-01 -2.5586917574468413e+00 -1.3231681396987911e+00 -9.2267003949018611e-01 -2.2355014269442197e+00 1.3342474517729606e+00 8.0848934868581246e-01 2.5198838634790826e+00 1.3685697872719889e+00 1.0437701060983375e+00 3.8135434006376756e+00 -1.4203444691301763e+00 -7.6262365769741269e-01 -3.4789708578762522e+00 2.1051732120206599e+00 1.0593972567877901e+00 1.4797945386328493e+00 -2.6839012353062572e+00 -8.1418735415925647e-01 -1.3407768376715321e+00 -3.1435396220755978e+00 -1.1318731117048895e+00 -1.2833341783659606e+00 3.0245222621302670e+00 7.7487235461651438e-01 1.4122614895736556e+00 3.0404575887639456e+00 9.4499280614421521e-01 1.2698651789933182e+00 -3.0378512832346076e+00 -7.3818568307080523e-01 -1.5724146594313333e+00 -4.1002423987718668e+00 -9.5662357559977995e-01 -1.4203444691301761e+00 4.7953814764734588e+00 8.6160730698621169e-01 1.4549489373991815e+00 7.3652568578164179e-01 1.0083139059419994e+00 6.4131622054567605e-01 -7.4225369862498825e-01 -9.0951769570498697e-01 -4.7999079455166027e-01 -8.6151441588355970e-01 -1.6825918963338700e+00 -5.5858287325381339e-01 7.3618414232360208e-01 1.4945867459855608e+00 5.5154943148995250e-01 9.7837637966683089e-01 1.6136113921936461e+00 6.4906412461197949e-01 -6.8127969110780595e-01 -1.4692169083575357e+00 -5.8026533334244390e-01 -1.0276457091419324e+00 -2.8366747311279208e+00 -7.6262365769741258e-01 8.6160730698621169e-01 2.7814891874031078e+00 5.3953288219772266e-01 1.1382875996447566e+00 7.1608822733379107e-01 1.5871401192211936e+00 -1.2655573953305996e+00 -4.9704198526830701e-01 -1.4384259472146155e+00 -1.2165020820878123e+00 -7.0775859064019553e-01 -2.0125616588196160e+00 1.4412912221334706e+00 5.9382809589826369e-01 2.2414837781060313e+00 1.2364552986539725e+00 6.0856456303514306e-01 2.0028055194505852e+00 -1.2925114573144427e+00 -5.0662775059624021e-01 -2.2715127278897551e+00 -1.4964121230985263e+00 -7.4658544196017818e-01 -3.4789708578762522e+00 1.4549489373991815e+00 5.3953288219772277e-01 3.3700417750224294e+00 99 100 101 159 160 161 174 175 176 114 115 116 102 103 104 162 163 164 177 178 179 117 118 119 3.7570035316107613e+00 1.1071360869068574e+00 1.4956464030406635e+00 -4.1039491258543919e+00 -1.0802899321491490e+00 -1.5722249339587375e+00 -2.5850256307522672e+00 -1.0437104590591504e+00 -1.1449968811002560e+00 2.5270035943545377e+00 8.6521279988110900e-01 1.3915745382145921e+00 2.5746683024257302e+00 1.0337294193847559e+00 1.2783850252423410e+00 -2.5215027419924256e+00 -7.2149820996613490e-01 -1.3706050830828187e+00 -1.6715086131106838e+00 -8.6846632638390298e-01 -1.1708461677598019e+00 2.0233106833187389e+00 7.0788662138561553e-01 1.0930670994040153e+00 1.1071360869068574e+00 3.2473576112409592e+00 1.1934615026911406e+00 -1.1179257939953293e+00 -2.8483045234059610e+00 -8.7960191930835319e-01 -1.1229039143219783e+00 -1.9646386699450531e+00 -8.8696796209799711e-01 8.8317210210098884e-01 1.6258017136459924e+00 8.5812069761674270e-01 1.0569367449669365e+00 1.9066019916966819e+00 9.2604733418174279e-01 -9.5987701729899799e-01 -1.6363603021963089e+00 -9.5034387975571288e-01 -8.7920363132950874e-01 -1.2989378072866578e+00 -9.5145087444242793e-01 1.0326654229710313e+00 9.6847998625034915e-01 6.9073510111486303e-01 1.4956464030406638e+00 1.1934615026911406e+00 3.9727930060670058e+00 -1.6093634244142987e+00 -8.6941841157072330e-01 -3.5584755279549207e+00 -1.4042306003086009e+00 -1.0057063406683255e+00 -2.2367925172920970e+00 1.4216032237645539e+00 8.6171735060261356e-01 2.5420520506091595e+00 1.2853518094229233e+00 9.0839499443990013e-01 2.2389121093329263e+00 -1.4461669531500398e+00 -7.5752591940881564e-01 -2.6131967353139864e+00 -1.1796954072372416e+00 -9.4694261514138278e-01 -1.8719596283064805e+00 1.4368549488820390e+00 6.1601943905559386e-01 1.5266672428583907e+00 -4.1039491258543919e+00 -1.1179257939953293e+00 -1.6093634244142985e+00 4.7493570688041489e+00 9.6620981391715866e-01 1.5882143038068948e+00 3.0724235846875954e+00 1.0413422362856279e+00 1.2731866024821628e+00 -3.0333551497409634e+00 -7.8729290565758325e-01 -1.5872530778326179e+00 -3.0920876365918897e+00 -1.1132515850271660e+00 -1.3099298579851582e+00 2.9973225420975460e+00 7.3268934239447736e-01 1.4760810079480566e+00 2.0260943259772399e+00 9.8838256488326159e-01 1.3872130394955828e+00 -2.6158056093792870e+00 -7.1015367280044783e-01 -1.2181485935006193e+00 -1.0802899321491490e+00 -2.8483045234059610e+00 -8.6941841157072330e-01 9.6620981391715888e-01 2.7042620845000922e+00 6.3544566489995480e-01 1.0339147402866906e+00 1.6540453014721059e+00 6.7463139333783739e-01 -7.5209439553692614e-01 -1.4602818567842397e+00 -6.2483746853718447e-01 -9.1107693252362076e-01 -1.6579186140698332e+00 -6.1298513694133094e-01 7.7309325472299839e-01 1.4684979505981872e+00 6.1655964377148831e-01 7.4730428847102381e-01 1.0097996042057731e+00 6.4783106782041489e-01 -7.7706083718817553e-01 -8.7009994651612454e-01 -4.6722675278045517e-01 -1.5722249339587377e+00 -8.7960191930835330e-01 -3.5584755279549203e+00 1.5882143038068948e+00 6.3544566489995480e-01 3.3575641697131027e+00 1.3118624347827716e+00 7.0234211863079354e-01 2.0086544874549794e+00 -1.3778144036139202e+00 -5.7170020357834017e-01 -2.2809085984562163e+00 -1.2690997238107931e+00 -7.2185618553682862e-01 -2.0166195324957932e+00 1.4803757004288380e+00 5.8455082678846437e-01 2.2967920385780021e+00 1.1311572701337014e+00 7.0382522164251904e-01 1.5699293664128997e+00 -1.2924706477687535e+00 -4.5300552353821050e-01 -1.3769364032520521e+00 -2.5850256307522677e+00 -1.1229039143219783e+00 -1.4042306003086009e+00 3.0724235846875954e+00 1.0339147402866908e+00 1.3118624347827712e+00 4.2131025301695182e+00 1.2726943853769612e+00 1.3061558626722849e+00 -4.1084512690866362e+00 -1.0257668137993585e+00 -1.4730103801431873e+00 -2.1584025237931628e+00 -1.0453221739131331e+00 -1.0960274072696783e+00 2.0923803219134882e+00 7.4012110081130256e-01 1.3419243839481310e+00 2.5292896623509340e+00 9.7871091988909154e-01 1.1790703311168089e+00 -3.0553166754894683e+00 -8.3144824432957731e-01 -1.1657446247985264e+00 -1.0437104590591502e+00 -1.9646386699450531e+00 -1.0057063406683253e+00 1.0413422362856279e+00 1.6540453014721059e+00 7.0234211863079365e-01 1.2726943853769612e+00 3.1894250304190765e+00 8.8195619302854888e-01 -1.0279202428658891e+00 -2.8376281223406044e+00 -8.5279321746352210e-01 -1.0788071948383129e+00 -1.3050280275764898e+00 -7.5330905709518448e-01 9.2681530782396704e-01 1.0109880598583822e+00 8.4809879333605964e-01 1.0144925497714243e+00 1.8841997419002297e+00 8.6028011440652086e-01 -1.1049065824946276e+00 -1.6313633137876475e+00 -6.8086860417488893e-01 -1.1449968811002560e+00 -8.8696796209799700e-01 -2.2367925172920970e+00 1.2731866024821630e+00 6.7463139333783728e-01 2.0086544874549790e+00 1.3061558626722849e+00 8.8195619302854866e-01 3.2348414566543680e+00 -1.4884601646456939e+00 -8.5922752139242387e-01 -3.4593507431252801e+00 -1.0796113484628644e+00 -7.1895155030607460e-01 -1.3405212138545153e+00 1.1466661934022651e+00 5.8312372097641352e-01 1.5724249671579056e+00 1.2235465340800831e+00 8.5898105876408648e-01 2.1589643940149541e+00 -1.2364867984279810e+00 -5.3354533231039114e-01 -1.9382208310103126e+00 2.5270035943545381e+00 8.8317210210098884e-01 1.4216032237645539e+00 -3.0333551497409634e+00 -7.5209439553692614e-01 -1.3778144036139204e+00 -4.1084512690866370e+00 -1.0279202428658891e+00 -1.4884601646456939e+00 4.1197880692284237e+00 7.9384770242873293e-01 1.6400488314823456e+00 2.0689104383517196e+00 9.0448844349383151e-01 1.1673176094425983e+00 -2.0450974978412439e+00 -6.1342591250768264e-01 -1.4056640908898661e+00 -2.4640434388766943e+00 -8.9244166944705827e-01 -1.3574874547680071e+00 2.9352452536108555e+00 7.0437397233400401e-01 1.4004564492279872e+00 8.6521279988110888e-01 1.6258017136459926e+00 8.6171735060261356e-01 -7.8729290565758325e-01 -1.4602818567842397e+00 -5.7170020357834017e-01 -1.0257668137993585e+00 -2.8376281223406039e+00 -8.5922752139242387e-01 7.9384770242873304e-01 2.7116629238612413e+00 7.3559020863298041e-01 7.6475529027355948e-01 9.9819569545986275e-01 6.1192721849470488e-01 -6.3442238809903628e-01 -8.5381247469694610e-01 -6.1236949697516430e-01 -7.1321335363803529e-01 -1.6244789307643139e+00 -7.3066803944443004e-01 7.3687966861061149e-01 1.4405410516190083e+00 5.6473048366005818e-01 1.3915745382145921e+00 8.5812069761674270e-01 2.5420520506091595e+00 -1.5872530778326182e+00 -6.2483746853718447e-01 -2.2809085984562163e+00 -1.4730103801431873e+00 -8.5279321746352199e-01 -3.4593507431252801e+00 1.6400488314823456e+00 7.3559020863298064e-01 3.8775605535695332e+00 1.3126411499322863e+00 8.0403656900092113e-01 1.5527893781698738e+00 -1.3661065944427060e+00 -5.7539929470832185e-01 -1.9045617861227648e+00 -1.2835018987917581e+00 -8.6986793452343436e-01 -2.4960071802207811e+00 1.3656074315810443e+00 5.2515043998181887e-01 2.1684263255764735e+00 2.5746683024257302e+00 1.0569367449669365e+00 1.2853518094229235e+00 -3.0920876365918901e+00 -9.1107693252362076e-01 -1.2690997238107931e+00 -2.1584025237931628e+00 -1.0788071948383129e+00 -1.0796113484628642e+00 2.0689104383517192e+00 7.6475529027355937e-01 1.3126411499322863e+00 4.2557421580430637e+00 1.2170905594731316e+00 1.3199533079787580e+00 -4.1178250139420944e+00 -9.8506679889928861e-01 -1.4810226535763320e+00 -2.5139757293884699e+00 -1.0226197654244205e+00 -1.2826752075764640e+00 2.9829700048951038e+00 9.5878809697201672e-01 1.1944626660924835e+00 1.0337294193847562e+00 1.9066019916966821e+00 9.0839499443990024e-01 -1.1132515850271660e+00 -1.6579186140698330e+00 -7.2185618553682862e-01 -1.0453221739131331e+00 -1.3050280275764898e+00 -7.1895155030607460e-01 9.0448844349383151e-01 9.9819569545986275e-01 8.0403656900092113e-01 1.2170905594731314e+00 3.2043228281283329e+00 8.6573939596775795e-01 -9.5621147595033962e-01 -2.8338437231507378e+00 -8.1535290563640206e-01 -9.5190829190724380e-01 -1.8991817253236922e+00 -9.0261522243463055e-01 9.1138510444616327e-01 1.5868515748358756e+00 5.8060490450535440e-01 1.2783850252423410e+00 9.2604733418174290e-01 2.2389121093329258e+00 -1.3099298579851579e+00 -6.1298513694133094e-01 -2.0166195324957932e+00 -1.0960274072696783e+00 -7.5330905709518448e-01 -1.3405212138545151e+00 1.1673176094425983e+00 6.1192721849470488e-01 1.5527893781698738e+00 1.3199533079787575e+00 8.6573939596775773e-01 3.3446819743909111e+00 -1.4926111373518522e+00 -8.4505840735693727e-01 -3.5415527235069915e+00 -1.0895717643205134e+00 -8.2009175204528184e-01 -2.1927252508710304e+00 1.2224842242635043e+00 6.2773040479452957e-01 1.9550352588346183e+00 -2.5215027419924256e+00 -9.5987701729899810e-01 -1.4461669531500396e+00 2.9973225420975460e+00 7.7309325472299839e-01 1.4803757004288385e+00 2.0923803219134882e+00 9.2681530782396715e-01 1.1466661934022651e+00 -2.0450974978412439e+00 -6.3442238809903628e-01 -1.3661065944427060e+00 -4.1178250139420944e+00 -9.5621147595033973e-01 -1.4926111373518522e+00 4.1003675196988132e+00 7.3732200234776413e-01 1.6379728142989740e+00 2.4736494427960412e+00 7.6402761665233720e-01 1.2915626550625328e+00 -2.9792945727301250e+00 -6.5074730019869409e-01 -1.2516926782480096e+00 -7.2149820996613490e-01 -1.6363603021963087e+00 -7.5752591940881553e-01 7.3268934239447736e-01 1.4684979505981872e+00 5.8455082678846437e-01 7.4012110081130256e-01 1.0109880598583822e+00 5.8312372097641352e-01 -6.1342591250768264e-01 -8.5381247469694621e-01 -5.7539929470832185e-01 -9.8506679889928850e-01 -2.8338437231507378e+00 -8.4505840735693716e-01 7.3732200234776424e-01 2.6940664426210552e+00 7.0078116171104121e-01 8.1702722217466595e-01 1.5947735928009852e+00 7.9187250351251182e-01 -7.0716874635510363e-01 -1.4443095458346180e+00 -4.8234459151435483e-01 -1.3706050830828187e+00 -9.5034387975571266e-01 -2.6131967353139860e+00 1.4760810079480566e+00 6.1655964377148820e-01 2.2967920385780021e+00 1.3419243839481310e+00 8.4809879333605975e-01 1.5724249671579058e+00 -1.4056640908898661e+00 -6.1236949697516430e-01 -1.9045617861227648e+00 -1.4810226535763320e+00 -8.1535290563640184e-01 -3.5415527235069915e+00 1.6379728142989742e+00 7.0078116171104121e-01 3.9351823922622606e+00 1.3336732789690375e+00 7.6732197933728841e-01 2.4827667914741487e+00 -1.5323596576151819e+00 -5.5469529578859933e-01 -2.2278549445285720e+00 -1.6715086131106838e+00 -8.7920363132950863e-01 -1.1796954072372416e+00 2.0260943259772395e+00 7.4730428847102381e-01 1.1311572701337012e+00 2.5292896623509340e+00 1.0144925497714243e+00 1.2235465340800831e+00 -2.4640434388766952e+00 -7.1321335363803529e-01 -1.2835018987917581e+00 -2.5139757293884699e+00 -9.5190829190724391e-01 -1.0895717643205134e+00 2.4736494427960412e+00 8.1702722217466595e-01 1.3336732789690378e+00 3.6613319354332945e+00 9.7558269525113184e-01 1.3284840586082243e+00 -4.0408375851816611e+00 -1.0100814787934591e+00 -1.4640920714415311e+00 -8.6846632638390309e-01 -1.2989378072866578e+00 -9.4694261514138256e-01 9.8838256488326159e-01 1.0097996042057733e+00 7.0382522164251904e-01 9.7871091988909165e-01 1.8841997419002297e+00 8.5898105876408648e-01 -8.9244166944705827e-01 -1.6244789307643139e+00 -8.6986793452343425e-01 -1.0226197654244205e+00 -1.8991817253236922e+00 -8.2009175204528173e-01 7.6402761665233732e-01 1.5947735928009852e+00 7.6732197933728841e-01 9.7558269525113206e-01 3.1462243273894046e+00 1.0274173866563832e+00 -9.2317603542043980e-01 -2.8123988029217291e+00 -7.2064334469017655e-01 -1.1708461677598021e+00 -9.5145087444242793e-01 -1.8719596283064805e+00 1.3872130394955828e+00 6.4783106782041489e-01 1.5699293664128997e+00 1.1790703311168089e+00 8.6028011440652086e-01 2.1589643940149541e+00 -1.3574874547680071e+00 -7.3066803944443004e-01 -2.4960071802207811e+00 -1.2826752075764640e+00 -9.0261522243463055e-01 -2.1927252508710304e+00 1.2915626550625328e+00 7.9187250351251159e-01 2.4827667914741491e+00 1.3284840586082245e+00 1.0274173866563829e+00 3.7863637191547537e+00 -1.3753212541788749e+00 -7.4266693607434298e-01 -3.4373322116584619e+00 2.0233106833187389e+00 1.0326654229710313e+00 1.4368549488820390e+00 -2.6158056093792870e+00 -7.7706083718817553e-01 -1.2924706477687535e+00 -3.0553166754894687e+00 -1.1049065824946276e+00 -1.2364867984279810e+00 2.9352452536108555e+00 7.3687966861061149e-01 1.3656074315810443e+00 2.9829700048951033e+00 9.1138510444616339e-01 1.2224842242635043e+00 -2.9792945727301250e+00 -7.0716874635510352e-01 -1.5323596576151819e+00 -4.0408375851816611e+00 -9.2317603542044002e-01 -1.3753212541788749e+00 4.7497285009558423e+00 8.3138200543054186e-01 1.4116917532641999e+00 7.0788662138561553e-01 9.6847998625034903e-01 6.1601943905559386e-01 -7.1015367280044783e-01 -8.7009994651612466e-01 -4.5300552353821050e-01 -8.3144824432957720e-01 -1.6313633137876475e+00 -5.3354533231039114e-01 7.0437397233400401e-01 1.4405410516190083e+00 5.2515043998181898e-01 9.5878809697201661e-01 1.5868515748358756e+00 6.2773040479452957e-01 -6.5074730019869409e-01 -1.4443095458346180e+00 -5.5469529578859933e-01 -1.0100814787934591e+00 -2.8123988029217299e+00 -7.4266693607434298e-01 8.3138200543054208e-01 2.7622989963548878e+00 5.1501280387960058e-01 1.0930670994040153e+00 6.9073510111486303e-01 1.5266672428583907e+00 -1.2181485935006193e+00 -4.6722675278045528e-01 -1.3769364032520521e+00 -1.1657446247985264e+00 -6.8086860417488881e-01 -1.9382208310103128e+00 1.4004564492279870e+00 5.6473048366005807e-01 2.1684263255764740e+00 1.1944626660924835e+00 5.8060490450535440e-01 1.9550352588346185e+00 -1.2516926782480096e+00 -4.8234459151435488e-01 -2.2278549445285720e+00 -1.4640920714415309e+00 -7.2064334469017655e-01 -3.4373322116584619e+00 1.4116917532642002e+00 5.1501280387960058e-01 3.3302155631799142e+00 120 121 122 192 193 194 207 208 209 135 136 137 123 124 125 195 196 197 210 211 212 138 139 140 4.5762876361999522e-02 1.4461740406926406e-02 1.4461740406926408e-02 -3.3647239937028471e-02 -2.8779990877610068e-03 -2.8779990877610072e-03 -2.8039447364912543e-02 -1.5240006000574539e-02 3.0902758049074475e-03 2.4112728540266082e-02 2.7252240200507068e-03 1.3880663468967835e-02 2.4112728540266082e-02 1.3880663468967845e-02 2.7252240200506964e-03 -2.8039447364912533e-02 3.0902758049074375e-03 -1.5240006000574553e-02 -2.2488197369961247e-02 -1.3605969409851723e-02 -1.3605969409851712e-02 1.8225998594283109e-02 -2.4339292026651247e-03 -2.4339292026651109e-03 1.4461740406926410e-02 3.7226336816462556e-02 1.1083677005985929e-02 -4.8721067778889869e-03 -1.7540977007330398e-03 7.2011475407815027e-03 -1.5253998243542328e-02 -1.9353408889405291e-02 2.5376488809701458e-03 3.2406506225661604e-03 -3.7049629783418104e-03 1.3957003628951360e-03 1.3880543228176905e-02 1.4731027268979112e-02 1.6660345023093838e-03 -8.5312102138891174e-03 -1.5349969226661829e-03 -5.9687941311528572e-03 -1.2639991904501857e-02 -1.6324674476758002e-02 -1.0275388899410771e-02 9.7143728821528219e-03 -9.2852231175373466e-03 -7.6400252623784687e-03 1.4461740406926408e-02 1.1083677005985931e-02 3.7226336816462563e-02 -4.8721067778889886e-03 7.2011475407815157e-03 -1.7540977007330359e-03 -8.5312102138891191e-03 -5.9687941311528398e-03 -1.5349969226661809e-03 1.3880543228176901e-02 1.6660345023093814e-03 1.4731027268979109e-02 3.2406506225661673e-03 1.3957003628951355e-03 -3.7049629783418203e-03 -1.5253998243542333e-02 2.5376488809701423e-03 -1.9353408889405295e-02 -1.2639991904501859e-02 -1.0275388899410778e-02 -1.6324674476757995e-02 9.7143728821528219e-03 -7.6400252623784852e-03 -9.2852231175373345e-03 -3.3647239937028471e-02 -4.8721067778889852e-03 -4.8721067778889886e-03 5.2486048554834387e-02 -1.2631973367514884e-02 -1.2631973367514886e-02 2.9623932951632591e-02 4.9520592094916480e-03 -1.1178952510905138e-02 -3.3046708310774740e-02 1.2023885938051692e-02 -9.4703660902227243e-03 -3.3046708310774747e-02 -9.4703660902227347e-03 1.2023885938051699e-02 2.9623932951632577e-02 -1.1178952510905126e-02 4.9520592094916722e-03 1.9874351953937542e-02 1.0051153877505407e-02 1.0051153877505393e-02 -3.1867609853459135e-02 1.1126299721482991e-02 1.1126299721482972e-02 -2.8779990877610059e-03 -1.7540977007330380e-03 7.2011475407815148e-03 -1.2631973367514884e-02 2.8432659377162797e-02 5.5756799858875548e-03 1.7835547102133618e-03 -3.4322715836225901e-03 -2.3563297426865116e-04 1.1964195416688684e-02 -1.3251544993099735e-02 4.1373820305692739e-03 3.4769673709687597e-03 -1.3105983323527556e-03 -1.7301912804768332e-03 -1.1035075626089038e-02 1.0349006476249641e-02 -2.0365700280579112e-03 -2.5309646662547416e-03 -8.2712160108356653e-03 -7.9714142549040575e-03 1.1851295249748865e-02 -1.0761937232768656e-02 -4.9404010195308887e-03 -2.8779990877610042e-03 7.2011475407815027e-03 -1.7540977007330363e-03 -1.2631973367514884e-02 5.5756799858875548e-03 2.8432659377162800e-02 -1.1035075626089040e-02 -2.0365700280578982e-03 1.0349006476249655e-02 3.4769673709687558e-03 -1.7301912804768324e-03 -1.3105983323527617e-03 1.1964195416688686e-02 4.1373820305692782e-03 -1.3251544993099740e-02 1.7835547102133624e-03 -2.3563297426865387e-04 -3.4322715836226062e-03 -2.5309646662547394e-03 -7.9714142549040610e-03 -8.2712160108356584e-03 1.1851295249748862e-02 -4.9404010195308948e-03 -1.0761937232768647e-02 -2.8039447364912543e-02 -1.5253998243542335e-02 -8.5312102138891191e-03 2.9623932951632591e-02 1.7835547102133629e-03 -1.1035075626089040e-02 4.7485573546142759e-02 1.6435733228293604e-02 -1.1274789696480591e-02 -3.4172223033335669e-02 -2.0811755014760215e-03 -2.9944390515830518e-03 -2.6857155226906775e-02 -1.4289965700530885e-02 1.0021488940556324e-02 2.0274142903915517e-02 -3.9692726794938425e-03 8.4090070659904245e-03 2.4789230730779672e-02 1.4301524014450265e-02 4.0377693882154729e-03 -3.3104054507315538e-02 3.0736001720858500e-03 1.1367249193279581e-02 -1.5240006000574539e-02 -1.9353408889405291e-02 -5.9687941311528407e-03 4.9520592094916462e-03 -3.4322715836225875e-03 -2.0365700280578977e-03 1.6435733228293604e-02 3.5143691379577700e-02 -7.9831129868948407e-03 -3.5877598857765166e-03 -2.2463027637347052e-03 -7.8326037723038706e-03 -1.5340992105213048e-02 -1.6195413621916427e-02 7.1876101585090554e-03 8.4090070659904037e-03 -8.2243912323480793e-03 9.8960150743482491e-03 1.4159547783279795e-02 1.6001971249879718e-02 2.6657283688730081e-03 -9.7875892954913443e-03 -1.6938745384303144e-03 4.0717273166791324e-03 3.0902758049074475e-03 2.5376488809701458e-03 -1.5349969226661809e-03 -1.1178952510905138e-02 -2.3563297426865072e-04 1.0349006476249655e-02 -1.1274789696480594e-02 -7.9831129868948390e-03 2.9134060403091362e-02 -1.8532335325142130e-03 -7.5345563084973210e-03 -2.2469495556347707e-03 1.0707136480006832e-02 7.1565974621684587e-03 -1.0852613982319077e-02 -3.9692726794938521e-03 7.1193346808563528e-03 -8.2243912323480967e-03 2.0368802312596725e-03 6.0434172325764680e-04 -3.1343804360789082e-03 1.2441955903219842e-02 -1.6646204775917905e-03 -1.3489734750293979e-02 2.4112728540266078e-02 3.2406506225661591e-03 1.3880543228176898e-02 -3.3046708310774747e-02 1.1964195416688680e-02 3.4769673709687558e-03 -3.4172223033335669e-02 -3.5877598857765166e-03 -1.8532335325142147e-03 5.0813099278597472e-02 -1.1028043161228804e-02 1.6134787948475754e-02 1.8626971086295602e-02 8.0619457089909988e-03 -3.8585053532754553e-03 -2.6857155226906761e-02 1.0707136480006818e-02 -1.5340992105213062e-02 -2.8090362152245654e-02 -8.7704098870077258e-03 -1.5877935646457678e-02 2.8613649818103694e-02 -1.0587715294239618e-02 3.4383680898390084e-03 2.7252240200507077e-03 -3.7049629783418091e-03 1.6660345023093803e-03 1.2023885938051692e-02 -1.3251544993099735e-02 -1.7301912804768324e-03 -2.0811755014760215e-03 -2.2463027637347061e-03 -7.5345563084973210e-03 -1.1028043161228802e-02 3.1715677093397780e-02 -7.6173329619600768e-03 -3.8585053532754509e-03 -9.1970374697357537e-03 6.9129116652019819e-03 1.0021488940556317e-02 -1.0852613982319067e-02 7.1876101585090588e-03 2.7376387196475921e-03 -1.9074642903535504e-03 2.4525541151363610e-03 -1.0540513602326034e-02 9.4442493841868490e-03 -1.3370298902225498e-03 1.3880663468967836e-02 1.3957003628951358e-03 1.4731027268979111e-02 -9.4703660902227243e-03 4.1373820305692748e-03 -1.3105983323527626e-03 -2.9944390515830527e-03 -7.8326037723038689e-03 -2.2469495556347707e-03 1.6134787948475750e-02 -7.6173329619600785e-03 3.7355160446349386e-02 8.0619457089909918e-03 9.3090589141053316e-03 -9.1970374697357554e-03 -1.4289965700530876e-02 7.1565974621684474e-03 -1.6195413621916427e-02 -1.4324940412468826e-02 -5.8194705372655534e-03 -1.9473239229681291e-02 3.0023141283708984e-03 -7.2933149820869256e-04 -3.6629495060074941e-03 2.4112728540266082e-02 1.3880543228176903e-02 3.2406506225661656e-03 -3.3046708310774740e-02 3.4769673709687610e-03 1.1964195416688687e-02 -2.6857155226906775e-02 -1.5340992105213048e-02 1.0707136480006834e-02 1.8626971086295602e-02 -3.8585053532754509e-03 8.0619457089909936e-03 5.0813099278597437e-02 1.6134787948475764e-02 -1.1028043161228811e-02 -3.4172223033335634e-02 -1.8532335325142175e-03 -3.5877598857765435e-03 -2.8090362152245658e-02 -1.5877935646457699e-02 -8.7704098870077189e-03 2.8613649818103697e-02 3.4383680898389868e-03 -1.0587715294239604e-02 1.3880663468967842e-02 1.4731027268979114e-02 1.3957003628951353e-03 -9.4703660902227347e-03 -1.3105983323527565e-03 4.1373820305692782e-03 -1.4289965700530887e-02 -1.6195413621916427e-02 7.1565974621684587e-03 8.0619457089909988e-03 -9.1970374697357537e-03 9.3090589141053368e-03 1.6134787948475764e-02 3.7355160446349400e-02 -7.6173329619600889e-03 -2.9944390515830675e-03 -2.2469495556347585e-03 -7.8326037723038880e-03 -1.4324940412468831e-02 -1.9473239229681309e-02 -5.8194705372655508e-03 3.0023141283709136e-03 -3.6629495060075097e-03 -7.2933149820867782e-04 2.7252240200506964e-03 1.6660345023093851e-03 -3.7049629783418182e-03 1.2023885938051699e-02 -1.7301912804768332e-03 -1.3251544993099740e-02 1.0021488940556326e-02 7.1876101585090554e-03 -1.0852613982319081e-02 -3.8585053532754553e-03 6.9129116652019811e-03 -9.1970374697357537e-03 -1.1028043161228813e-02 -7.6173329619600889e-03 3.1715677093397780e-02 -2.0811755014760068e-03 -7.5345563084973175e-03 -2.2463027637346766e-03 2.7376387196475995e-03 2.4525541151363692e-03 -1.9074642903535543e-03 -1.0540513602326041e-02 -1.3370298902225489e-03 9.4442493841868421e-03 -2.8039447364912536e-02 -8.5312102138891156e-03 -1.5253998243542330e-02 2.9623932951632570e-02 -1.1035075626089038e-02 1.7835547102133622e-03 2.0274142903915514e-02 8.4090070659904037e-03 -3.9692726794938521e-03 -2.6857155226906761e-02 1.0021488940556317e-02 -1.4289965700530878e-02 -3.4172223033335634e-02 -2.9944390515830657e-03 -2.0811755014760068e-03 4.7485573546142711e-02 -1.1274789696480575e-02 1.6435733228293618e-02 2.4789230730779661e-02 4.0377693882154850e-03 1.4301524014450248e-02 -3.3104054507315517e-02 1.1367249193279595e-02 3.0736001720858335e-03 3.0902758049074375e-03 -1.5349969226661833e-03 2.5376488809701432e-03 -1.1178952510905126e-02 1.0349006476249641e-02 -2.3563297426865441e-04 -3.9692726794938417e-03 -8.2243912323480793e-03 7.1193346808563528e-03 1.0707136480006816e-02 -1.0852613982319067e-02 7.1565974621684483e-03 -1.8532335325142169e-03 -2.2469495556347585e-03 -7.5345563084973175e-03 -1.1274789696480575e-02 2.9134060403091327e-02 -7.9831129868948424e-03 2.0368802312596768e-03 -3.1343804360789091e-03 6.0434172325765569e-04 1.2441955903219828e-02 -1.3489734750293971e-02 -1.6646204775917816e-03 -1.5240006000574555e-02 -5.9687941311528572e-03 -1.9353408889405295e-02 4.9520592094916722e-03 -2.0365700280579116e-03 -3.4322715836226070e-03 8.4090070659904245e-03 9.8960150743482491e-03 -8.2243912323480967e-03 -1.5340992105213062e-02 7.1876101585090571e-03 -1.6195413621916427e-02 -3.5877598857765427e-03 -7.8326037723038880e-03 -2.2463027637346766e-03 1.6435733228293618e-02 -7.9831129868948424e-03 3.5143691379577686e-02 1.4159547783279811e-02 2.6657283688730354e-03 1.6001971249879718e-02 -9.7875892954913633e-03 4.0717273166791558e-03 -1.6938745384303081e-03 -2.2488197369961247e-02 -1.2639991904501857e-02 -1.2639991904501859e-02 1.9874351953937545e-02 -2.5309646662547425e-03 -2.5309646662547394e-03 2.4789230730779675e-02 1.4159547783279795e-02 2.0368802312596729e-03 -2.8090362152245658e-02 2.7376387196475930e-03 -1.4324940412468826e-02 -2.8090362152245661e-02 -1.4324940412468829e-02 2.7376387196475990e-03 2.4789230730779661e-02 2.0368802312596777e-03 1.4159547783279811e-02 4.3273049624250763e-02 1.4410639297197513e-02 1.4410639297197500e-02 -3.4056941365295086e-02 -3.8488090481591480e-03 -3.8488090481591641e-03 -1.3605969409851721e-02 -1.6324674476757998e-02 -1.0275388899410778e-02 1.0051153877505407e-02 -8.2712160108356653e-03 -7.9714142549040610e-03 1.4301524014450265e-02 1.6001971249879718e-02 6.0434172325764658e-04 -8.7704098870077258e-03 -1.9074642903535504e-03 -5.8194705372655543e-03 -1.5877935646457699e-02 -1.9473239229681309e-02 2.4525541151363696e-03 4.0377693882154841e-03 -3.1343804360789104e-03 2.6657283688730337e-03 1.4410639297197514e-02 3.5809173830550635e-02 1.1351955384957943e-02 -4.5467716340515229e-03 -2.7001706367229157e-03 6.9916940993553986e-03 -1.3605969409851707e-02 -1.0275388899410771e-02 -1.6324674476757995e-02 1.0051153877505395e-02 -7.9714142549040575e-03 -8.2712160108356584e-03 4.0377693882154737e-03 2.6657283688730094e-03 -3.1343804360789091e-03 -1.5877935646457682e-02 2.4525541151363610e-03 -1.9473239229681291e-02 -8.7704098870077189e-03 -5.8194705372655508e-03 -1.9074642903535543e-03 1.4301524014450248e-02 6.0434172325765439e-04 1.6001971249879718e-02 1.4410639297197500e-02 1.1351955384957943e-02 3.5809173830550621e-02 -4.5467716340515090e-03 6.9916940993554168e-03 -2.7001706367229305e-03 1.8225998594283109e-02 9.7143728821528202e-03 9.7143728821528219e-03 -3.1867609853459128e-02 1.1851295249748865e-02 1.1851295249748863e-02 -3.3104054507315531e-02 -9.7875892954913443e-03 1.2441955903219842e-02 2.8613649818103690e-02 -1.0540513602326034e-02 3.0023141283708988e-03 2.8613649818103694e-02 3.0023141283709123e-03 -1.0540513602326038e-02 -3.3104054507315517e-02 1.2441955903219826e-02 -9.7875892954913633e-03 -3.4056941365295079e-02 -4.5467716340515246e-03 -4.5467716340515073e-03 5.6679362002894758e-02 -1.2135063631623531e-02 -1.2135063631623515e-02 -2.4339292026651239e-03 -9.2852231175373431e-03 -7.6400252623784852e-03 1.1126299721482991e-02 -1.0761937232768656e-02 -4.9404010195308939e-03 3.0736001720858505e-03 -1.6938745384303153e-03 -1.6646204775917900e-03 -1.0587715294239616e-02 9.4442493841868473e-03 -7.2933149820869256e-04 3.4383680898389876e-03 -3.6629495060075097e-03 -1.3370298902225478e-03 1.1367249193279597e-02 -1.3489734750293971e-02 4.0717273166791549e-03 -3.8488090481591472e-03 -2.7001706367229157e-03 6.9916940993554168e-03 -1.2135063631623531e-02 3.2149640397573870e-02 5.2479867318978371e-03 -2.4339292026651109e-03 -7.6400252623784687e-03 -9.2852231175373345e-03 1.1126299721482970e-02 -4.9404010195308887e-03 -1.0761937232768647e-02 1.1367249193279578e-02 4.0717273166791332e-03 -1.3489734750293979e-02 3.4383680898390093e-03 -1.3370298902225498e-03 -3.6629495060074907e-03 -1.0587715294239604e-02 -7.2933149820867760e-04 9.4442493841868421e-03 3.0736001720858335e-03 -1.6646204775917816e-03 -1.6938745384303079e-03 -3.8488090481591632e-03 6.9916940993553986e-03 -2.7001706367229322e-03 -1.2135063631623515e-02 5.2479867318978362e-03 3.2149640397573856e-02 192 193 194 264 265 266 279 280 281 207 208 209 195 196 197 267 268 269 282 283 284 210 211 212 5.4064061771379908e-02 1.6284411392800530e-02 1.6284411392800527e-02 -4.1849674436269003e-02 -3.7565946611247650e-03 -3.7565946611247672e-03 -3.3329068341307569e-02 -1.6968888658810546e-02 3.3866466780660262e-03 2.9188816376943462e-02 3.3793098526266538e-03 1.5770829334945963e-02 2.9188816376943465e-02 1.5770829334945963e-02 3.3793098526266503e-03 -3.3329068341307569e-02 3.3866466780660140e-03 -1.6968888658810556e-02 -2.6243191998164404e-02 -1.5353623183474900e-02 -1.5353623183474911e-02 2.2309308591781696e-02 -2.7420907550289452e-03 -2.7420907550289417e-03 1.6284411392800527e-02 4.2205075477027884e-02 1.1761095584863908e-02 -5.2102330645180080e-03 -4.9214836955055420e-03 7.4088763600627539e-03 -1.7224553453849888e-02 -2.1581936623679500e-02 2.6606608339116420e-03 3.4461141099119096e-03 -2.6383649353159651e-03 1.5070942510536168e-03 1.5535253743705483e-02 1.6861604730021199e-02 2.0470784931436474e-03 -9.4952319492416244e-03 -2.7636073820480646e-03 -6.3273106663260447e-03 -1.4184815611864481e-02 -1.7794685073268156e-02 -1.0994826672477781e-02 1.0849054833056083e-02 -9.3666024972318494e-03 -8.0626681842317534e-03 1.6284411392800527e-02 1.1761095584863906e-02 4.2205075477027870e-02 -5.2102330645180037e-03 7.4088763600627557e-03 -4.9214836955055385e-03 -9.4952319492416244e-03 -6.3273106663260404e-03 -2.7636073820480550e-03 1.5535253743705480e-02 2.0470784931436560e-03 1.6861604730021192e-02 3.4461141099119035e-03 1.5070942510536137e-03 -2.6383649353159673e-03 -1.7224553453849881e-02 2.6606608339116325e-03 -2.1581936623679514e-02 -1.4184815611864476e-02 -1.0994826672477776e-02 -1.7794685073268163e-02 1.0849054833056081e-02 -8.0626681842317534e-03 -9.3666024972318459e-03 -4.1849674436269003e-02 -5.2102330645180097e-03 -5.2102330645180037e-03 6.2454238894381696e-02 -1.3835248969667058e-02 -1.3835248969667055e-02 3.5707351587326901e-02 5.3846845388675233e-03 -1.2475068546298816e-02 -3.9326365844355185e-02 1.3100916746651826e-02 -1.0815056716569980e-02 -3.9326365844355199e-02 -1.0815056716569980e-02 1.3100916746651842e-02 3.5707351587326915e-02 -1.2475068546298804e-02 5.3846845388675242e-03 2.4060951458428747e-02 1.1475495387768198e-02 1.1475495387768209e-02 -3.7427487402484888e-02 1.2374510623766297e-02 1.2374510623766296e-02 -3.7565946611247637e-03 -4.9214836955055385e-03 7.4088763600627557e-03 -1.3835248969667056e-02 3.2718270951340812e-02 5.6659734697953167e-03 2.4404597877563309e-03 -2.2320266329507879e-03 -3.3752874643254481e-04 1.3241445597926808e-02 -1.4988577224833263e-02 4.4454081097531611e-03 3.5731015294988662e-03 -2.6760618007649725e-03 -1.7315257004258298e-03 -1.2089786615170234e-02 1.2041584414779294e-02 -1.9968648892182599e-03 -2.6018941243704016e-03 -8.1845075370012409e-03 -8.3537915651863467e-03 1.3028517455150455e-02 -1.1757198475064297e-02 -5.1005470383482590e-03 -3.7565946611247672e-03 7.4088763600627522e-03 -4.9214836955055394e-03 -1.3835248969667055e-02 5.6659734697953167e-03 3.2718270951340805e-02 -1.2089786615170229e-02 -1.9968648892182595e-03 1.2041584414779290e-02 3.5731015294988631e-03 -1.7315257004258200e-03 -2.6760618007649669e-03 1.3241445597926805e-02 4.4454081097531637e-03 -1.4988577224833273e-02 2.4404597877563366e-03 -3.3752874643255544e-04 -2.2320266329507827e-03 -2.6018941243703990e-03 -8.3537915651863432e-03 -8.1845075370012444e-03 1.3028517455150452e-02 -5.1005470383482555e-03 -1.1757198475064293e-02 -3.3329068341307562e-02 -1.7224553453849888e-02 -9.4952319492416244e-03 3.5707351587326894e-02 2.4404597877563309e-03 -1.2089786615170229e-02 5.5018943603626490e-02 1.8414201259151147e-02 -1.2570706307970648e-02 -4.1036224699635339e-02 -2.6188214532479096e-03 -3.6805684171979072e-03 -3.1465367685342215e-02 -1.6293395993137352e-02 1.0947600667614974e-02 2.4581011358443691e-02 -4.4265106805609659e-03 9.4162479240729700e-03 2.9237874679458584e-02 1.6218203359436169e-02 4.8962304245856458e-03 -3.8714520502570536e-02 3.4904171744524789e-03 1.2576214273306836e-02 -1.6968888658810546e-02 -2.1581936623679500e-02 -6.3273106663260404e-03 5.3846845388675225e-03 -2.2320266329507862e-03 -1.9968648892182590e-03 1.8414201259151150e-02 3.8867974993380724e-02 -8.4179687951973607e-03 -3.9739037678182395e-03 -4.3287137141528173e-03 -8.2951445893144852e-03 -1.7065765343754043e-02 -1.7729326017254771e-02 7.3802024381341320e-03 9.4162479240729648e-03 -8.1838646732425666e-03 1.0432961892842372e-02 1.5795510297785764e-02 1.7680625141373436e-02 2.9545823560325466e-03 -1.1002086249494572e-02 -2.4927324734737083e-03 4.2695422530471044e-03 3.3866466780660262e-03 2.6606608339116429e-03 -2.7636073820480542e-03 -1.2475068546298816e-02 -3.3752874643254384e-04 1.2041584414779290e-02 -1.2570706307970648e-02 -8.4179687951973607e-03 3.2533674022841262e-02 -2.0456483378369790e-03 -7.9994885765205925e-03 -4.1217440751986426e-03 1.1999807783022249e-02 7.7275783468681381e-03 -1.1811705529961775e-02 -4.4265106805609772e-03 7.5300422095848085e-03 -8.1838646732425770e-03 2.1653877963777731e-03 5.4050248598196983e-04 -2.7550406302406473e-03 1.3966091615201379e-02 -1.7037977581960606e-03 -1.4939296146928863e-02 2.9188816376943462e-02 3.4461141099119096e-03 1.5535253743705480e-02 -3.9326365844355185e-02 1.3241445597926806e-02 3.5731015294988640e-03 -4.1036224699635339e-02 -3.9739037678182421e-03 -2.0456483378369799e-03 5.8707347543329805e-02 -1.2081704896171455e-02 1.8283439692293058e-02 2.2700628141950448e-02 9.2349456534408896e-03 -4.0983169734221843e-03 -3.1465367685342222e-02 1.1999807783022237e-02 -1.7065765343754050e-02 -3.2663965146209152e-02 -1.0068014071294875e-02 -1.7808111564205913e-02 3.3895131313318200e-02 -1.1798690409017281e-02 3.6260472537217080e-03 3.3793098526266529e-03 -2.6383649353159677e-03 2.0470784931436560e-03 1.3100916746651826e-02 -1.4988577224833263e-02 -1.7315257004258205e-03 -2.6188214532479096e-03 -4.3287137141528181e-03 -7.9994885765205925e-03 -1.2081704896171457e-02 3.5164952080841846e-02 -8.0057393542158212e-03 -4.0983169734221756e-03 -9.2586849315008796e-03 7.2355289825239578e-03 1.0947600667614962e-02 -1.1811705529961766e-02 7.3802024381341312e-03 2.9147965310787199e-03 -2.6759545155295968e-03 2.4611744891094179e-03 -1.1543780475130629e-02 1.0537048770452447e-02 -1.3872307717489201e-03 1.5770829334945963e-02 1.5070942510536163e-03 1.6861604730021192e-02 -1.0815056716569980e-02 4.4454081097531611e-03 -2.6760618007649669e-03 -3.6805684171979081e-03 -8.2951445893144852e-03 -4.1217440751986426e-03 1.8283439692293058e-02 -8.0057393542158194e-03 4.1723748535569809e-02 9.2349456534408913e-03 1.0008046832806023e-02 -9.2586849315008882e-03 -1.6293395993137356e-02 7.7275783468681259e-03 -1.7729326017254778e-02 -1.6306191733338180e-02 -6.3707996541935534e-03 -2.1503898882717976e-02 3.8059981795635221e-03 -1.0164439427570724e-03 -3.2956375581537642e-03 2.9188816376943469e-02 1.5535253743705481e-02 3.4461141099119026e-03 -3.9326365844355199e-02 3.5731015294988666e-03 1.3241445597926803e-02 -3.1465367685342215e-02 -1.7065765343754043e-02 1.1999807783022249e-02 2.2700628141950445e-02 -4.0983169734221756e-03 9.2349456534408913e-03 5.8707347543329833e-02 1.8283439692293058e-02 -1.2081704896171462e-02 -4.1036224699635367e-02 -2.0456483378369973e-03 -3.9739037678182378e-03 -3.2663965146209159e-02 -1.7808111564205899e-02 -1.0068014071294882e-02 3.3895131313318207e-02 3.6260472537217067e-03 -1.1798690409017275e-02 1.5770829334945963e-02 1.6861604730021199e-02 1.5070942510536137e-03 -1.0815056716569979e-02 -2.6760618007649725e-03 4.4454081097531628e-03 -1.6293395993137356e-02 -1.7729326017254771e-02 7.7275783468681372e-03 9.2349456534408896e-03 -9.2586849315008796e-03 1.0008046832806023e-02 1.8283439692293055e-02 4.1723748535569823e-02 -8.0057393542158281e-03 -3.6805684171979003e-03 -4.1217440751986738e-03 -8.2951445893144939e-03 -1.6306191733338180e-02 -2.1503898882717962e-02 -6.3707996541935586e-03 3.8059981795635169e-03 -3.2956375581537599e-03 -1.0164439427570696e-03 3.3793098526266495e-03 2.0470784931436474e-03 -2.6383649353159669e-03 1.3100916746651842e-02 -1.7315257004258296e-03 -1.4988577224833273e-02 1.0947600667614974e-02 7.3802024381341320e-03 -1.1811705529961775e-02 -4.0983169734221843e-03 7.2355289825239578e-03 -9.2586849315008865e-03 -1.2081704896171462e-02 -8.0057393542158281e-03 3.5164952080841867e-02 -2.6188214532479066e-03 -7.9994885765205873e-03 -4.3287137141528311e-03 2.9147965310787260e-03 2.4611744891094218e-03 -2.6759545155295860e-03 -1.1543780475130638e-02 -1.3872307717489162e-03 1.0537048770452456e-02 -3.3329068341307569e-02 -9.4952319492416244e-03 -1.7224553453849881e-02 3.5707351587326915e-02 -1.2089786615170234e-02 2.4404597877563357e-03 2.4581011358443691e-02 9.4162479240729648e-03 -4.4265106805609772e-03 -3.1465367685342222e-02 1.0947600667614962e-02 -1.6293395993137356e-02 -4.1036224699635367e-02 -3.6805684171979003e-03 -2.6188214532479083e-03 5.5018943603626524e-02 -1.2570706307970641e-02 1.8414201259151153e-02 2.9237874679458580e-02 4.8962304245856346e-03 1.6218203359436176e-02 -3.8714520502570564e-02 1.2576214273306841e-02 3.4904171744524742e-03 3.3866466780660132e-03 -2.7636073820480646e-03 2.6606608339116325e-03 -1.2475068546298804e-02 1.2041584414779294e-02 -3.3752874643255544e-04 -4.4265106805609659e-03 -8.1838646732425666e-03 7.5300422095848085e-03 1.1999807783022239e-02 -1.1811705529961768e-02 7.7275783468681268e-03 -2.0456483378369960e-03 -4.1217440751986738e-03 -7.9994885765205873e-03 -1.2570706307970638e-02 3.2533674022841283e-02 -8.4179687951973572e-03 2.1653877963777905e-03 -2.7550406302406334e-03 5.4050248598197720e-04 1.3966091615201367e-02 -1.4939296146928870e-02 -1.7037977581960549e-03 -1.6968888658810556e-02 -6.3273106663260456e-03 -2.1581936623679510e-02 5.3846845388675242e-03 -1.9968648892182603e-03 -2.2320266329507814e-03 9.4162479240729700e-03 1.0432961892842374e-02 -8.1838646732425770e-03 -1.7065765343754050e-02 7.3802024381341312e-03 -1.7729326017254778e-02 -3.9739037678182395e-03 -8.2951445893144939e-03 -4.3287137141528320e-03 1.8414201259151153e-02 -8.4179687951973572e-03 3.8867974993380759e-02 1.5795510297785770e-02 2.9545823560325410e-03 1.7680625141373450e-02 -1.1002086249494579e-02 4.2695422530471122e-03 -2.4927324734737200e-03 -2.6243191998164404e-02 -1.4184815611864479e-02 -1.4184815611864476e-02 2.4060951458428743e-02 -2.6018941243704011e-03 -2.6018941243703990e-03 2.9237874679458580e-02 1.5795510297785764e-02 2.1653877963777749e-03 -3.2663965146209152e-02 2.9147965310787204e-03 -1.6306191733338176e-02 -3.2663965146209159e-02 -1.6306191733338180e-02 2.9147965310787269e-03 2.9237874679458580e-02 2.1653877963777918e-03 1.5795510297785770e-02 4.8578776497550887e-02 1.6245157346877610e-02 1.6245157346877620e-02 -3.9544355024314061e-02 -4.0279505025468147e-03 -4.0279505025468190e-03 -1.5353623183474902e-02 -1.7794685073268160e-02 -1.0994826672477776e-02 1.1475495387768198e-02 -8.1845075370012427e-03 -8.3537915651863432e-03 1.6218203359436169e-02 1.7680625141373439e-02 5.4050248598196940e-04 -1.0068014071294875e-02 -2.6759545155295964e-03 -6.3707996541935525e-03 -1.7808111564205899e-02 -2.1503898882717962e-02 2.4611744891094214e-03 4.8962304245856337e-03 -2.7550406302406369e-03 2.9545823560325393e-03 1.6245157346877610e-02 3.8800088840779290e-02 1.2264010512768455e-02 -5.6053376996919339e-03 -3.5666273433951207e-03 7.4991480479652929e-03 -1.5353623183474909e-02 -1.0994826672477783e-02 -1.7794685073268160e-02 1.1475495387768209e-02 -8.3537915651863467e-03 -8.1845075370012444e-03 4.8962304245856458e-03 2.9545823560325484e-03 -2.7550406302406473e-03 -1.7808111564205913e-02 2.4611744891094175e-03 -2.1503898882717972e-02 -1.0068014071294882e-02 -6.3707996541935586e-03 -2.6759545155295873e-03 1.6218203359436176e-02 5.4050248598197807e-04 1.7680625141373453e-02 1.6245157346877617e-02 1.2264010512768455e-02 3.8800088840779290e-02 -5.6053376996919486e-03 7.4991480479652921e-03 -3.5666273433951233e-03 2.2309308591781696e-02 1.0849054833056083e-02 1.0849054833056081e-02 -3.7427487402484895e-02 1.3028517455150455e-02 1.3028517455150452e-02 -3.8714520502570536e-02 -1.1002086249494574e-02 1.3966091615201378e-02 3.3895131313318200e-02 -1.1543780475130628e-02 3.8059981795635208e-03 3.3895131313318200e-02 3.8059981795635156e-03 -1.1543780475130638e-02 -3.8714520502570557e-02 1.3966091615201367e-02 -1.1002086249494577e-02 -3.9544355024314068e-02 -5.6053376996919382e-03 -5.6053376996919478e-03 6.4301312213521977e-02 -1.3498457658654286e-02 -1.3498457658654279e-02 -2.7420907550289460e-03 -9.3666024972318494e-03 -8.0626681842317534e-03 1.2374510623766299e-02 -1.1757198475064295e-02 -5.1005470383482555e-03 3.4904171744524798e-03 -2.4927324734737083e-03 -1.7037977581960608e-03 -1.1798690409017281e-02 1.0537048770452447e-02 -1.0164439427570728e-03 3.6260472537217084e-03 -3.2956375581537616e-03 -1.3872307717489164e-03 1.2576214273306839e-02 -1.4939296146928871e-02 4.2695422530471122e-03 -4.0279505025468173e-03 -3.5666273433951215e-03 7.4991480479652921e-03 -1.3498457658654288e-02 3.4881045723795162e-02 5.5019973942696627e-03 -2.7420907550289426e-03 -8.0626681842317534e-03 -9.3666024972318476e-03 1.2374510623766296e-02 -5.1005470383482590e-03 -1.1757198475064293e-02 1.2576214273306834e-02 4.2695422530471044e-03 -1.4939296146928861e-02 3.6260472537217106e-03 -1.3872307717489201e-03 -3.2956375581537651e-03 -1.1798690409017275e-02 -1.0164439427570696e-03 1.0537048770452456e-02 3.4904171744524742e-03 -1.7037977581960552e-03 -2.4927324734737195e-03 -4.0279505025468199e-03 7.4991480479652929e-03 -3.5666273433951198e-03 -1.3498457658654279e-02 5.5019973942696627e-03 3.4881045723795155e-02 135 136 137 207 208 209 222 223 224 150 151 152 138 139 140 210 211 212 225 226 227 153 154 155 3.9828823839810769e-02 1.4834499004315797e-02 1.2030179873241120e-02 -3.1210032487703130e-02 -8.4882114865346414e-03 -4.1210242078036840e-03 -2.1671451302592605e-02 -1.5285588188532120e-02 2.7841197750141733e-03 2.2031239309367477e-02 7.6807175516937368e-03 1.3370158519244855e-02 1.8526625510126009e-02 1.4381693608657466e-02 2.2509682608549035e-03 -2.6132221754299315e-02 -1.9351563710110801e-03 -1.3857330363414083e-02 -1.7163878828093389e-02 -1.3605778893127609e-02 -1.1385207759638031e-02 1.5790895713384191e-02 2.4178247745384523e-03 -1.0718640974992305e-03 1.4834499004315797e-02 4.2285525146652660e-02 1.3418456761367430e-02 -1.0481377630097538e-02 -4.7320740249424259e-03 6.4301545923345083e-03 -1.5461720995872542e-02 -2.4364569535259884e-02 3.3272282751078842e-03 8.0809115431153614e-03 -8.9486597278961905e-04 4.1680965778427273e-03 1.4422078110247028e-02 1.9504092803475995e-02 1.8973300693565323e-03 -1.3177410104795687e-02 -4.0591431123646621e-03 -8.8263440318066926e-03 -1.2571456821536939e-02 -2.0959605910260706e-02 -1.2503771457695892e-02 1.4354476894624518e-02 -6.7793593945113615e-03 -7.9111507865064733e-03 1.2030179873241120e-02 1.3418456761367430e-02 3.6886208620086243e-02 -6.0857769074361906e-03 6.0458280751549427e-03 -1.8993126734616712e-03 -7.0909405494393599e-03 -7.0749049349848976e-03 -1.0690881352271220e-03 1.3138760413350626e-02 4.4211454341758069e-03 1.5010060976926153e-02 2.8979077860942434e-03 1.7287753409826177e-03 -3.9611407132417713e-03 -1.5431721122920433e-02 -6.4801006997003267e-04 -1.9449362747446460e-02 -1.0327831400129340e-02 -1.2271483128974152e-02 -1.6171422720798571e-02 1.0869421907239342e-02 -5.6198074777517211e-03 -9.3459426068367834e-03 -3.1210032487703133e-02 -1.0481377630097542e-02 -6.0857769074361932e-03 5.6310879233162962e-02 -6.9944134306666097e-03 -1.3540867993089373e-02 2.7268991048821922e-02 1.0502284487367716e-02 -1.1229084098847939e-02 -3.6396087418625989e-02 6.9654082043565206e-03 -1.0215107687230733e-02 -3.1010148991327410e-02 -1.4706956959362635e-02 1.2346846707449502e-02 3.3002675032354170e-02 -6.3621558482812035e-03 5.3287032111094240e-03 1.7294757513906238e-02 1.4841623513441881e-02 1.1366777128866391e-02 -3.5261033930588756e-02 6.2355876632418719e-03 1.2028509639178880e-02 -8.4882114865346414e-03 -4.7320740249424259e-03 6.0458280751549427e-03 -6.9944134306666097e-03 2.4444105265546773e-02 3.0054125091865730e-03 7.5319582654880543e-03 -3.7912748718902441e-04 -2.2665005120450187e-03 7.0851037457021517e-03 -9.2361259159806745e-03 2.2445397410832263e-03 -2.1835070151662050e-03 -3.9287232069435659e-03 5.2559113273342424e-04 -6.2770303983639836e-03 6.6513364207116087e-03 -1.1025216144106055e-03 2.4858092454457478e-03 -5.6377484446534917e-03 -5.7639079053441447e-03 6.8402910740954859e-03 -7.1816426065491983e-03 -2.6884414263583889e-03 -4.1210242078036840e-03 6.4301545923345083e-03 -1.8993126734616710e-03 -1.3540867993089369e-02 3.0054125091865730e-03 2.8469874908403199e-02 -1.0552600534684332e-02 -3.9118423059005848e-03 1.0783693017717297e-02 3.6612844752189843e-03 -9.2620344412717407e-04 -1.1012534106035507e-03 1.1103726800950262e-02 6.2243011339064231e-03 -1.3475982721451061e-02 1.7835696625619047e-03 -1.5928474865585670e-05 -3.5988503073436260e-03 -9.4372823094522086e-04 -8.2413041076801405e-03 -8.3062774429027188e-03 1.2609640027791457e-02 -2.5645899028540202e-03 -1.0871891370357841e-02 -2.1671451302592605e-02 -1.5461720995872544e-02 -7.0909405494393616e-03 2.7268991048821922e-02 7.5319582654880543e-03 -1.0552600534684332e-02 4.0270616569071188e-02 1.6902645979994819e-02 -9.8158670106957072e-03 -3.1369124459287044e-02 -7.7273870997049687e-03 -1.2756826781972989e-03 -2.0803868392460727e-02 -1.4686220742023857e-02 8.5847463773592106e-03 1.8389354660998534e-02 1.3445228165805622e-03 6.2968043877553335e-03 1.8437814928269791e-02 1.4463013627336560e-02 3.2967537322532480e-03 -3.0522333052821052e-02 -2.3668118517986246e-03 1.0556786275648881e-02 -1.5285588188532120e-02 -2.4364569535259881e-02 -7.0749049349848976e-03 1.0502284487367720e-02 -3.7912748718902441e-04 -3.9118423059005848e-03 1.6902645979994822e-02 4.0180492509762293e-02 -9.9720145144950017e-03 -8.9477701191012331e-03 -4.7683511576631513e-03 -8.0043673975116660e-03 -1.5831327547545761e-02 -2.1026606621047435e-02 8.8528109760999171e-03 1.3194881863052076e-02 -5.6415678198507161e-03 1.1032095396281388e-02 1.4328211739694528e-02 2.0350387848628887e-02 3.0606988892313168e-03 -1.4863338214930031e-02 -4.3506577373809592e-03 6.0175238912795002e-03 2.7841197750141733e-03 3.3272282751078842e-03 -1.0690881352271213e-03 -1.1229084098847937e-02 -2.2665005120450178e-03 1.0783693017717297e-02 -9.8158670106957072e-03 -9.9720145144950034e-03 2.9116272461742674e-02 -3.3572986291384400e-04 -7.5835838698578312e-03 -1.7213742500525903e-03 9.4947737908002202e-03 9.0912471084649508e-03 -1.0974633052846593e-02 -5.4950394484692966e-03 6.0081092009767910e-03 -8.4292895928275314e-03 1.7869796489338719e-03 6.9117923727508488e-04 -3.9153482607000474e-03 1.2809847206178514e-02 7.0433507457313689e-04 -1.3790232187806069e-02 2.2031239309367477e-02 8.0809115431153648e-03 1.3138760413350626e-02 -3.6396087418625989e-02 7.0851037457021525e-03 3.6612844752189847e-03 -3.1369124459287044e-02 -8.9477701191012331e-03 -3.3572986291384308e-04 5.3376294123148080e-02 -6.1166554741805355e-03 1.7266024198641958e-02 1.6859040996146640e-02 1.2627285179525398e-02 -5.1391597178626330e-03 -2.9816163963445667e-02 6.3549893277171105e-03 -1.6368935326503485e-02 -2.5680538089718961e-02 -1.3218001256240907e-02 -1.5914895115849835e-02 3.0995339502415481e-02 -5.8658629465373497e-03 3.6926509359182626e-03 7.6807175516937368e-03 -8.9486597278962371e-04 4.4211454341758060e-03 6.9654082043565189e-03 -9.2361259159806745e-03 -9.2620344412717428e-04 -7.7273870997049705e-03 -4.7683511576631522e-03 -7.5835838698578304e-03 -6.1166554741805346e-03 2.7741640078416081e-02 -4.1279432744430657e-03 1.2371811405685214e-03 -6.7584777891930899e-03 5.8859514052439048e-03 5.8393653166850792e-03 -7.2669185794166820e-03 3.8703736706896977e-03 -2.0285024060425240e-03 -4.4213058453654317e-03 -8.3525285712778572e-04 -5.8501272333758257e-03 5.6044051819925745e-03 -7.0448706455355906e-04 1.3370158519244854e-02 4.1680965778427290e-03 1.5010060976926155e-02 -1.0215107687230733e-02 2.2445397410832259e-03 -1.1012534106035511e-03 -1.2756826781972982e-03 -8.0043673975116643e-03 -1.7213742500525905e-03 1.7266024198641958e-02 -4.1279432744430666e-03 3.7326122421518511e-02 6.2620853823263673e-03 1.0421959514057357e-02 -9.3048022694535749e-03 -1.5535222031188192e-02 4.0040820904338132e-03 -1.6309225383030822e-02 -1.2933561900686308e-02 -8.4556351772271266e-03 -1.9586225593175081e-02 3.0613061970893520e-03 -2.5073207423527161e-04 -4.3133024921290257e-03 1.8526625510126009e-02 1.4422078110247030e-02 2.8979077860942434e-03 -3.1010148991327410e-02 -2.1835070151662054e-03 1.1103726800950262e-02 -2.0803868392460727e-02 -1.5831327547545761e-02 9.4947737908002202e-03 1.6859040996146636e-02 1.2371811405685218e-03 6.2620853823263673e-03 4.4055072049424188e-02 1.7086523531965370e-02 -9.6191609889624431e-03 -3.2433011254103861e-02 -7.4608173764662547e-03 -2.0839048075383089e-03 -2.1764890940951982e-02 -1.6093241232491409e-02 -7.5122123039869726e-03 2.6571181023147150e-02 8.8231103888887046e-03 -1.0543215659683341e-02 1.4381693608657466e-02 1.9504092803475995e-02 1.7287753409826172e-03 -1.4706956959362635e-02 -3.9287232069435659e-03 6.2243011339064213e-03 -1.4686220742023859e-02 -2.1026606621047439e-02 9.0912471084649490e-03 1.2627285179525397e-02 -6.7584777891930899e-03 1.0421959514057357e-02 1.7086523531965370e-02 4.2401003527593961e-02 -9.4928879061426889e-03 -8.7768360941392030e-03 -5.0993343703236819e-03 -8.1674085258236339e-03 -1.4444132149792937e-02 -2.4377614212364906e-02 -7.0908082319079638e-03 8.5186436251703992e-03 -7.1434013119727423e-04 -2.7151784335370391e-03 2.2509682608549035e-03 1.8973300693565323e-03 -3.9611407132417696e-03 1.2346846707449505e-02 5.2559113273342468e-04 -1.3475982721451061e-02 8.5847463773592106e-03 8.8528109760999171e-03 -1.0974633052846594e-02 -5.1391597178626330e-03 5.8859514052439048e-03 -9.3048022694535732e-03 -9.6191609889624431e-03 -9.4928879061426889e-03 3.1464010540728206e-02 -5.0159924659956686e-04 -7.5266309119283864e-03 -2.2503998950380161e-03 2.2722831246576049e-03 3.0774818471526492e-03 -1.4205093191277337e-03 -1.0194924516896580e-02 -3.2196466125153506e-03 9.9234574304305247e-03 -2.6132221754299315e-02 -1.3177410104795687e-02 -1.5431721122920433e-02 3.3002675032354163e-02 -6.2770303983639844e-03 1.7835696625619069e-03 1.8389354660998534e-02 1.3194881863052076e-02 -5.4950394484692966e-03 -2.9816163963445667e-02 5.8393653166850792e-03 -1.5535222031188190e-02 -3.2433011254103868e-02 -8.7768360941392065e-03 -5.0159924659956751e-04 5.0791871055326843e-02 -6.4308255933506579e-03 1.7762822266262187e-02 2.2742874635736071e-02 9.0958288551458259e-03 1.3984870771325686e-02 -3.6545378412566769e-02 6.5320261557665600e-03 3.4323191490276822e-03 -1.9351563710110810e-03 -4.0591431123646621e-03 -6.4801006997003158e-04 -6.3621558482812035e-03 6.6513364207116095e-03 -1.5928474865585832e-05 1.3445228165805622e-03 -5.6415678198507169e-03 6.0081092009767918e-03 6.3549893277171105e-03 -7.2669185794166820e-03 4.0040820904338132e-03 -7.4608173764662538e-03 -5.0993343703236802e-03 -7.5266309119283864e-03 -6.4308255933506579e-03 2.5052468345881065e-02 -4.3619128640104889e-03 7.0620311600047480e-03 -1.6814256662385876e-04 3.4744764501854417e-03 7.4274118848067731e-03 -9.4686983180130718e-03 -9.3418542082154507e-04 -1.3857330363414085e-02 -8.8263440318066926e-03 -1.9449362747446460e-02 5.3287032111094240e-03 -1.1025216144106055e-03 -3.5988503073436273e-03 6.2968043877553326e-03 1.1032095396281388e-02 -8.4292895928275297e-03 -1.6368935326503485e-02 3.8703736706896977e-03 -1.6309225383030822e-02 -2.0839048075383107e-03 -8.1674085258236322e-03 -2.2503998950380152e-03 1.7762822266262183e-02 -4.3619128640104889e-03 3.5086397181803668e-02 1.3301726876266157e-02 5.4139852269645423e-03 1.6342634555296293e-02 -1.0379886243937222e-02 2.1417327421157958e-03 -1.3919038114135261e-03 -1.7163878828093389e-02 -1.2571456821536939e-02 -1.0327831400129340e-02 1.7294757513906241e-02 2.4858092454457478e-03 -9.4372823094522064e-04 1.8437814928269788e-02 1.4328211739694530e-02 1.7869796489338723e-03 -2.5680538089718964e-02 -2.0285024060425236e-03 -1.2933561900686305e-02 -2.1764890940951982e-02 -1.4444132149792939e-02 2.2722831246576062e-03 2.2742874635736071e-02 7.0620311600047472e-03 1.3301726876266157e-02 3.6913466111147500e-02 1.4422959236760128e-02 1.1871072569818741e-02 -3.0779605330295272e-02 -9.2549200045327490e-03 -5.0269406879155237e-03 -1.3605778893127609e-02 -2.0959605910260706e-02 -1.2271483128974152e-02 1.4841623513441881e-02 -5.6377484446534908e-03 -8.2413041076801405e-03 1.4463013627336560e-02 2.0350387848628887e-02 6.9117923727508379e-04 -1.3218001256240907e-02 -4.4213058453654325e-03 -8.4556351772271249e-03 -1.6093241232491409e-02 -2.4377614212364906e-02 3.0774818471526496e-03 9.0958288551458259e-03 -1.6814256662385963e-04 5.4139852269645431e-03 1.4422959236760128e-02 4.0494118670243093e-02 1.3677008423643644e-02 -9.9064038508244658e-03 -5.2800895396035745e-03 6.1087676788454748e-03 -1.1385207759638031e-02 -1.2503771457695892e-02 -1.6171422720798568e-02 1.1366777128866391e-02 -5.7639079053441447e-03 -8.3062774429027170e-03 3.2967537322532488e-03 3.0606988892313181e-03 -3.9153482607000465e-03 -1.5914895115849835e-02 -8.3525285712778637e-04 -1.9586225593175077e-02 -7.5122123039869718e-03 -7.0908082319079638e-03 -1.4205093191277331e-03 1.3984870771325684e-02 3.4744764501854408e-03 1.6342634555296293e-02 1.1871072569818735e-02 1.3677008423643644e-02 3.5363249151346907e-02 -5.7071590227892200e-03 5.9815566890153915e-03 -2.3061003699390795e-03 1.5790895713384191e-02 1.4354476894624517e-02 1.0869421907239342e-02 -3.5261033930588770e-02 6.8402910740954859e-03 1.2609640027791457e-02 -3.0522333052821045e-02 -1.4863338214930031e-02 1.2809847206178518e-02 3.0995339502415484e-02 -5.8501272333758257e-03 3.0613061970893528e-03 2.6571181023147150e-02 8.5186436251704026e-03 -1.0194924516896580e-02 -3.6545378412566762e-02 7.4274118848067731e-03 -1.0379886243937222e-02 -3.0779605330295268e-02 -9.9064038508244658e-03 -5.7071590227892183e-03 5.9750934487325005e-02 -6.5209541795668681e-03 -1.3068245554675612e-02 2.4178247745384514e-03 -6.7793593945113624e-03 -5.6198074777517211e-03 6.2355876632418728e-03 -7.1816426065491983e-03 -2.5645899028540206e-03 -2.3668118517986246e-03 -4.3506577373809592e-03 7.0433507457313776e-04 -5.8658629465373497e-03 5.6044051819925745e-03 -2.5073207423527151e-04 8.8231103888887028e-03 -7.1434013119727651e-04 -3.2196466125153497e-03 6.5320261557665618e-03 -9.4686983180130684e-03 2.1417327421157954e-03 -9.2549200045327490e-03 -5.2800895396035736e-03 5.9815566890153906e-03 -6.5209541795668673e-03 2.8170382545262863e-02 2.8271515616520326e-03 -1.0718640974992310e-03 -7.9111507865064750e-03 -9.3459426068367851e-03 1.2028509639178880e-02 -2.6884414263583889e-03 -1.0871891370357841e-02 1.0556786275648881e-02 6.0175238912795002e-03 -1.3790232187806069e-02 3.6926509359182609e-03 -7.0448706455355885e-04 -4.3133024921290257e-03 -1.0543215659683341e-02 -2.7151784335370400e-03 9.9234574304305247e-03 3.4323191490276831e-03 -9.3418542082154507e-04 -1.3919038114135252e-03 -5.0269406879155237e-03 6.1087676788454748e-03 -2.3061003699390778e-03 -1.3068245554675612e-02 2.8271515616520330e-03 3.2095915408051783e-02 207 208 209 279 280 281 294 295 296 222 223 224 210 211 212 282 283 284 297 298 299 225 226 227 4.5677127707613494e-02 1.6732313069363805e-02 1.3519202931205091e-02 -3.6663999846562149e-02 -9.9112997555779909e-03 -4.8026517060453877e-03 -2.5024977494681012e-02 -1.7154659678665828e-02 3.0557579661055368e-03 2.5568659720836540e-02 8.8777599701554567e-03 1.5040996202830075e-02 2.1397566767559831e-02 1.6314176011877318e-02 2.5643663520000083e-03 -2.9842726755227804e-02 -2.1950709926913405e-03 -1.5402079936611244e-02 -1.9477469595065453e-02 -1.5378642441018246e-02 -1.2741595295405118e-02 1.8365819495526549e-02 2.7154238165568254e-03 -1.2339965140789407e-03 1.6732313069363805e-02 4.7568562524702686e-02 1.4739259467690131e-02 -1.1594069846040837e-02 -6.7000363967524594e-03 6.8831256422789838e-03 -1.7460654108393505e-02 -2.7271643358408593e-02 3.6337391645923428e-03 8.8803440819769618e-03 -2.0949595635518127e-04 4.5785023970775166e-03 1.6179103532461200e-02 2.1934856346275029e-02 2.1928299843126694e-03 -1.4718288979435168e-02 -4.8485574016403485e-03 -9.6535587769279053e-03 -1.4092029509465597e-02 -2.3269275334174170e-02 -1.3707946649822630e-02 1.6073281759533129e-02 -7.2044104236469756e-03 -8.6659512292010833e-03 1.3519202931205088e-02 1.4739259467690129e-02 4.1596636198533904e-02 -6.6434641663701407e-03 6.5009839264764712e-03 -3.4388213771477036e-03 -7.9135492882233555e-03 -7.7724335127720996e-03 -1.7048305769021292e-03 1.4659577526557013e-02 5.0714916837257340e-03 1.7073013661261995e-02 3.1882966607538247e-03 1.9661241489910527e-03 -3.9471031027150322e-03 -1.7339170239575295e-02 -7.7186205012018210e-04 -2.1652776276009224e-02 -1.1592781848831181e-02 -1.3605011735262072e-02 -1.7865217918338883e-02 1.2121888424484049e-02 -6.1285519287290315e-03 -1.0060900608682904e-02 -3.6663999846562143e-02 -1.1594069846040837e-02 -6.6434641663701425e-03 6.4683113666753431e-02 -7.4587161088665466e-03 -1.5035367061923993e-02 3.1551884611468274e-02 1.1607365936416997e-02 -1.2529585579257669e-02 -4.1694762433515650e-02 7.4804184237686807e-03 -1.1465829896661939e-02 -3.5475791949724160e-02 -1.6685768908258944e-02 1.3656245197531712e-02 3.7815491186503354e-02 -7.0394740043774901e-03 5.8793616191842105e-03 1.9894227312544203e-02 1.6799272550222243e-02 1.2745642970077116e-02 -4.0110162547467298e-02 6.8909719571358967e-03 1.3392996917420665e-02 -9.9112997555779944e-03 -6.7000363967524559e-03 6.5009839264764703e-03 -7.4587161088665492e-03 2.8003500788096748e-02 3.1505058329087377e-03 8.8048711399946241e-03 3.5055587235407142e-04 -2.6285620586329436e-03 7.6484733489402381e-03 -1.0576183172016047e-02 2.4225717597801399e-03 -2.6774326994269924e-03 -4.8980047932386649e-03 6.4519427972988073e-04 -6.7346682775719161e-03 7.6623846410785292e-03 -1.0797690611276743e-03 2.9684697514508235e-03 -5.8584213040725266e-03 -6.1913968771656379e-03 7.3603026010577600e-03 -7.9837956354496548e-03 -2.8195278019689670e-03 -4.8026517060453877e-03 6.8831256422789838e-03 -3.4388213771477071e-03 -1.5035367061923991e-02 3.1505058329087377e-03 3.2479610863709762e-02 -1.1768519353133111e-02 -4.2149608995262246e-03 1.2327125442416131e-02 3.9456281828682245e-03 -1.0028190591609436e-03 -1.8389234215774844e-03 1.2459048740269390e-02 6.9409819808180766e-03 -1.5129071943844096e-02 2.1528674277813183e-03 2.8423692165452743e-05 -3.4220729818455831e-03 -1.0083106974090993e-03 -9.0180132287173975e-03 -8.9064677403013250e-03 1.4057304467592657e-02 -2.7672439607666836e-03 -1.2071378841409677e-02 -2.5024977494681015e-02 -1.7460654108393505e-02 -7.9135492882233573e-03 3.1551884611468281e-02 8.8048711399946224e-03 -1.1768519353133111e-02 4.6079458728173116e-02 1.9068094750107088e-02 -1.1007460060757958e-02 -3.6433965023684019e-02 -8.9669614406419872e-03 -1.5228871768366420e-03 -2.3740401875474951e-02 -1.6715463181758244e-02 9.5730455478189608e-03 2.1235136321414754e-02 1.5161149561963804e-03 7.0941362673314686e-03 2.1129833907713867e-02 1.6415940238156415e-02 3.8089512536959966e-03 -3.4796969174930040e-02 -2.6619423536607743e-03 1.1736282810104613e-02 -1.7154659678665828e-02 -2.7271643358408589e-02 -7.7724335127721004e-03 1.1607365936416996e-02 3.5055587235407164e-04 -4.2149608995262246e-03 1.9068094750107088e-02 4.5045202625325964e-02 -1.0937134279526011e-02 -9.9119677685590487e-03 -6.3815953479617188e-03 -8.7268339380783370e-03 -1.7730929145991375e-02 -2.3416697230290259e-02 9.6275818295379744e-03 1.4749091950234898e-02 -5.9898334266730718e-03 1.2070475555655604e-02 1.6046797231847487e-02 2.2748394248224252e-02 3.3607512837251557e-03 -1.6673793275390220e-02 -5.0843833825706484e-03 6.5925539609839141e-03 3.0557579661055359e-03 3.6337391645923410e-03 -1.7048305769021303e-03 -1.2529585579257669e-02 -2.6285620586329436e-03 1.2327125442416133e-02 -1.1007460060757956e-02 -1.0937134279526013e-02 3.2836815130056041e-02 -4.8505246989112642e-04 -8.3144911607344815e-03 -2.8428971415313331e-03 1.0659194686549044e-02 1.0114373718771179e-02 -1.2152984172807225e-02 -6.1115425768683423e-03 6.5765672962533042e-03 -9.0412190262259499e-03 2.0126230420179944e-03 7.1228246138316828e-04 -4.0401345268062140e-03 1.4406064992102518e-02 8.4322485789344406e-04 -1.5381875128199309e-02 2.5568659720836537e-02 8.8803440819769600e-03 1.4659577526557013e-02 -4.1694762433515650e-02 7.6484733489402398e-03 3.9456281828682228e-03 -3.6433965023684012e-02 -9.9119677685590470e-03 -4.8505246989112523e-04 6.0607934785125828e-02 -6.5390267796912923e-03 1.9346965065626543e-02 1.9475749364985116e-02 1.4301574216635721e-02 -5.6612418430968658e-03 -3.3792655287243983e-02 7.0523344740136464e-03 -1.8147195626861068e-02 -2.9061082103995394e-02 -1.4950472760732357e-02 -1.7690095273454512e-02 3.5330120977491559e-02 -6.4812588125838701e-03 4.0314144382518216e-03 8.8777599701554567e-03 -2.0949595635517921e-04 5.0714916837257323e-03 7.4804184237686798e-03 -1.0576183172016048e-02 -1.0028190591609438e-03 -8.9669614406419872e-03 -6.3815953479617171e-03 -8.3144911607344833e-03 -6.5390267796912914e-03 3.1218995755629364e-02 -4.3779938725154940e-03 1.5557734502251166e-03 -7.1103201392784844e-03 6.4130126403297294e-03 6.2725110452282202e-03 -8.0539494723705935e-03 4.0525098630510483e-03 -2.4160323138442551e-03 -5.2063781337527808e-03 -1.0558400215979285e-03 -6.2644423551999357e-03 6.3189264661054449e-03 -7.8587007309766825e-04 1.5040996202830077e-02 4.5785023970775158e-03 1.7073013661261998e-02 -1.1465829896661939e-02 2.4225717597801399e-03 -1.8389234215774851e-03 -1.5228871768366392e-03 -8.7268339380783370e-03 -2.8428971415313327e-03 1.9346965065626540e-02 -4.3779938725154932e-03 4.1982078755915274e-02 7.0800422945518499e-03 1.1537574805208265e-02 -1.0033733271554405e-02 -1.7487375428585639e-02 4.4000715886005279e-03 -1.8063255458643322e-02 -1.4587850862920177e-02 -9.4676588945391479e-03 -2.1762234949233062e-02 3.5959398019959313e-03 -3.6623384553346962e-04 -4.5140481746376382e-03 2.1397566767559831e-02 1.6179103532461197e-02 3.1882966607538277e-03 -3.5475791949724160e-02 -2.6774326994269924e-03 1.2459048740269388e-02 -2.3740401875474951e-02 -1.7730929145991375e-02 1.0659194686549044e-02 1.9475749364985116e-02 1.5557734502251170e-03 7.0800422945518516e-03 4.9442762644655046e-02 1.9317775318677188e-02 -1.0729995527184141e-02 -3.6830471463065520e-02 -8.2359783449575397e-03 -2.3835591773961424e-03 -2.4525833161561955e-02 -1.8120791706075005e-02 -8.5065300277529041e-03 3.0256419672626600e-02 9.7124795950874095e-03 -1.1766497649790895e-02 1.6314176011877318e-02 2.1934856346275029e-02 1.9661241489910561e-03 -1.6685768908258944e-02 -4.8980047932386649e-03 6.9409819808180749e-03 -1.6715463181758247e-02 -2.3416697230290263e-02 1.0114373718771179e-02 1.4301574216635721e-02 -7.1103201392784835e-03 1.1537574805208265e-02 1.9317775318677191e-02 4.7183646929643351e-02 -1.0467247163500819e-02 -1.0141755731379598e-02 -5.9043252119145382e-03 -9.0271603900382857e-03 -1.6335775749856646e-02 -2.7140523372255049e-02 -7.8890525111515297e-03 9.9452380240632014e-03 -6.4863252894137335e-04 -3.1755945890979166e-03 2.5643663520000083e-03 2.1928299843126699e-03 -3.9471031027150339e-03 1.3656245197531712e-02 6.4519427972988051e-04 -1.5129071943844098e-02 9.5730455478189591e-03 9.6275818295379744e-03 -1.2152984172807225e-02 -5.6612418430968658e-03 6.4130126403297294e-03 -1.0033733271554405e-02 -1.0729995527184143e-02 -1.0467247163500818e-02 3.4733581995173651e-02 -5.7170128501891947e-04 -8.2927284615094254e-03 -2.8258349718321757e-03 2.5562147400412637e-03 3.3637478287576596e-03 -1.6305027077899428e-03 -1.1386933182092020e-02 -3.4823909376576713e-03 1.0985648175369222e-02 -2.9842726755227807e-02 -1.4718288979435168e-02 -1.7339170239575295e-02 3.7815491186503347e-02 -6.7346682775719169e-03 2.1528674277813183e-03 2.1235136321414754e-02 1.4749091950234900e-02 -6.1115425768683415e-03 -3.3792655287243983e-02 6.2725110452282202e-03 -1.7487375428585639e-02 -3.6830471463065520e-02 -1.0141755731379600e-02 -5.7170128501891687e-04 5.7054475562223206e-02 -7.1249732178873502e-03 1.9788320953518641e-02 2.5673263944789818e-02 1.0481242583405711e-02 1.5681498769406856e-02 -4.1312513509393828e-02 7.2168406274052011e-03 3.8871023793413521e-03 -2.1950709926913392e-03 -4.8485574016403476e-03 -7.7186205012018188e-04 -7.0394740043774901e-03 7.6623846410785301e-03 2.8423692165452689e-05 1.5161149561963799e-03 -5.9898334266730710e-03 6.5765672962533051e-03 7.0523344740136464e-03 -8.0539494723705935e-03 4.4000715886005270e-03 -8.2359783449575379e-03 -5.9043252119145417e-03 -8.2927284615094254e-03 -7.1249732178873511e-03 2.7756338845906212e-02 -4.7314113950018468e-03 7.7752089724290804e-03 -1.5035834890884318e-04 3.7722891907924646e-03 8.2518381572746144e-03 -1.0471699625477343e-02 -9.8134986118028774e-04 -1.5402079936611242e-02 -9.6535587769279053e-03 -2.1652776276009221e-02 5.8793616191842105e-03 -1.0797690611276745e-03 -3.4220729818455822e-03 7.0941362673314695e-03 1.2070475555655604e-02 -9.0412190262259516e-03 -1.8147195626861068e-02 4.0525098630510483e-03 -1.8063255458643318e-02 -2.3835591773961424e-03 -9.0271603900382857e-03 -2.8258349718321765e-03 1.9788320953518644e-02 -4.7314113950018468e-03 3.8694637992086334e-02 1.4797181471930361e-02 6.0897414377528384e-03 1.7955148733654676e-02 -1.1626165571096234e-02 2.2791727666362166e-03 -1.6446280111847705e-03 -1.9477469595065453e-02 -1.4092029509465597e-02 -1.1592781848831181e-02 1.9894227312544199e-02 2.9684697514508235e-03 -1.0083106974090993e-03 2.1129833907713867e-02 1.6046797231847487e-02 2.0126230420179944e-03 -2.9061082103995394e-02 -2.4160323138442551e-03 -1.4587850862920181e-02 -2.4525833161561952e-02 -1.6335775749856642e-02 2.5562147400412650e-03 2.5673263944789818e-02 7.7752089724290804e-03 1.4797181471930361e-02 4.0953798771233764e-02 1.6233019078763553e-02 1.3279803699744819e-02 -3.4586739075658846e-02 -1.0179657461324451e-02 -5.4568795445740000e-03 -1.5378642441018248e-02 -2.3269275334174170e-02 -1.3605011735262072e-02 1.6799272550222243e-02 -5.8584213040725258e-03 -9.0180132287173975e-03 1.6415940238156415e-02 2.2748394248224255e-02 7.1228246138316763e-04 -1.4950472760732355e-02 -5.2063781337527816e-03 -9.4676588945391479e-03 -1.8120791706075005e-02 -2.7140523372255053e-02 3.3637478287576596e-03 1.0481242583405713e-02 -1.5035834890884383e-04 6.0897414377528375e-03 1.6233019078763556e-02 4.4713533514200793e-02 1.5143531958872856e-02 -1.1479567542722320e-02 -5.8369712692616779e-03 6.7813801717520675e-03 -1.2741595295405118e-02 -1.3707946649822628e-02 -1.7865217918338883e-02 1.2745642970077116e-02 -6.1913968771656388e-03 -8.9064677403013250e-03 3.8089512536959966e-03 3.3607512837251548e-03 -4.0401345268062131e-03 -1.7690095273454512e-02 -1.0558400215979293e-03 -2.1762234949233062e-02 -8.5065300277529041e-03 -7.8890525111515314e-03 -1.6305027077899430e-03 1.5681498769406853e-02 3.7722891907924646e-03 1.7955148733654676e-02 1.3279803699744817e-02 1.5143531958872858e-02 3.8790872944126524e-02 -6.5776760963122604e-03 6.5676636263472471e-03 -2.5414638353117927e-03 1.8365819495526549e-02 1.6073281759533129e-02 1.2121888424484049e-02 -4.0110162547467298e-02 7.3603026010577600e-03 1.4057304467592657e-02 -3.4796969174930040e-02 -1.6673793275390220e-02 1.4406064992102523e-02 3.5330120977491553e-02 -6.2644423551999357e-03 3.5959398019959313e-03 3.0256419672626593e-02 9.9452380240632032e-03 -1.1386933182092020e-02 -4.1312513509393828e-02 8.2518381572746161e-03 -1.1626165571096232e-02 -3.4586739075658846e-02 -1.1479567542722321e-02 -6.5776760963122596e-03 6.6854024161805317e-02 -7.2128573686162326e-03 -1.4590422836674614e-02 2.7154238165568254e-03 -7.2044104236469774e-03 -6.1285519287290324e-03 6.8909719571358975e-03 -7.9837956354496548e-03 -2.7672439607666841e-03 -2.6619423536607743e-03 -5.0843833825706475e-03 8.4322485789344341e-04 -6.4812588125838701e-03 6.3189264661054432e-03 -3.6623384553346929e-04 9.7124795950874077e-03 -6.4863252894137421e-04 -3.4823909376576713e-03 7.2168406274052011e-03 -1.0471699625477343e-02 2.2791727666362171e-03 -1.0179657461324453e-02 -5.8369712692616770e-03 6.5676636263472471e-03 -7.2128573686162344e-03 3.0910966399242238e-02 3.0543594218099411e-03 -1.2339965140789398e-03 -8.6659512292010851e-03 -1.0060900608682904e-02 1.3392996917420665e-02 -2.8195278019689666e-03 -1.2071378841409677e-02 1.1736282810104613e-02 6.5925539609839141e-03 -1.5381875128199309e-02 4.0314144382518199e-03 -7.8587007309766782e-04 -4.5140481746376400e-03 -1.1766497649790895e-02 -3.1755945890979175e-03 1.0985648175369223e-02 3.8871023793413525e-03 -9.8134986118028752e-04 -1.6446280111847716e-03 -5.4568795445739983e-03 6.7813801717520666e-03 -2.5414638353117936e-03 -1.4590422836674615e-02 3.0543594218099407e-03 3.5228646424056854e-02 150 151 152 222 223 224 237 238 239 165 166 167 153 154 155 225 226 227 240 241 242 168 169 170 3.2846888171983127e-02 1.2511061362147953e-02 8.9311259144861620e-03 -2.5074359541247340e-02 -1.2118534933711863e-02 -5.0571899888099785e-03 -1.4688666621433193e-02 -1.2666873395028144e-02 2.3197389869512347e-03 1.7361704651491398e-02 1.0809498760981327e-02 1.2110988282335063e-02 1.1869519062695606e-02 1.2380749403650708e-02 1.6261939560945730e-03 -2.1430977313596597e-02 -5.3834564952611359e-03 -1.1681796705992844e-02 -1.1579769061729254e-02 -1.1204322843587126e-02 -8.5525859543831538e-03 1.0695660651836249e-02 5.6718781408082782e-03 3.0352550931893687e-04 1.2511061362147956e-02 4.5784261748416079e-02 1.5166772697967627e-02 -1.4159787385388629e-02 -8.4719077774047281e-03 5.6805533834034007e-03 -1.2998158937039612e-02 -2.7874341874098769e-02 4.2842821333279957e-03 1.1173480168274755e-02 3.1166834103380143e-03 6.7185288234928465e-03 1.2411733472659189e-02 2.2889552210793914e-02 1.8417402692564523e-03 -1.5949498192367646e-02 -7.6950708935623283e-03 -1.1290303413278616e-02 -1.0070953013880715e-02 -2.4496808438330867e-02 -1.4227874677749823e-02 1.7082122525594708e-02 -3.2523683861513096e-03 -8.1736992164198816e-03 8.9311259144861620e-03 1.5166772697967623e-02 3.6062785074101808e-02 -6.9940764672147557e-03 4.8850234099375419e-03 -8.6513162746094669e-04 -5.3380044078672768e-03 -7.7532025727777253e-03 2.1563555695188093e-04 1.1658228560527104e-02 6.8532557754901555e-03 1.5321737971849174e-02 2.4012451705218156e-03 1.8286852457238467e-03 -5.2398462883719984e-03 -1.4725798375085883e-02 -3.6424523526977586e-03 -1.9452478277056429e-02 -7.4106004128220732e-03 -1.3700946555510993e-02 -1.6037614583399085e-02 1.1477880017454908e-02 -3.6371356481326952e-03 -1.0005087826614412e-02 -2.5074359541247343e-02 -1.4159787385388631e-02 -6.9940764672147574e-03 5.5881181505078543e-02 -6.2307743053401294e-04 -1.4177725959936322e-02 2.1901371099403266e-02 1.4101233556194170e-02 -1.1046636265084238e-02 -3.6012405630803164e-02 1.2032923508894565e-03 -1.0442138835197654e-02 -2.5883338564554957e-02 -1.8041779780618609e-02 1.2433909426641063e-02 3.2494847616890712e-02 -8.7512943355078305e-04 5.3889091602280711e-03 1.1909646809122001e-02 1.7656960198061226e-02 1.2132314094085222e-02 -3.5216943293889046e-02 7.3828792494718863e-04 1.2705444846478611e-02 -1.2118534933711867e-02 -8.4719077774047247e-03 4.8850234099375419e-03 -6.2307743053401391e-04 2.2408839169904781e-02 4.3382755464663344e-04 1.1309311768393879e-02 3.9661483848273142e-03 -4.3508814034459112e-03 1.4782882687334666e-03 -7.1145550841641659e-03 3.1951356130619825e-04 -6.2442094428756274e-03 -7.7941731017557641e-03 2.8019633553069650e-03 -8.0897985134276227e-04 4.5999920863356598e-03 -1.3131848784592935e-04 5.8422432452756587e-03 -1.9321854572854327e-03 -3.5532337448876861e-03 1.1649583760612676e-03 -5.6621582204576630e-03 -4.0489424501781158e-04 -5.0571899888099767e-03 5.6805533834033990e-03 -8.6513162746094756e-04 -1.4177725959936325e-02 4.3382755464663344e-04 2.8402802683584669e-02 -9.8598379088505137e-03 -5.7613935305540105e-03 1.1375855282518069e-02 3.8310392989923635e-03 -1.7833211081349807e-04 -1.3007105686346104e-04 9.9250729346443602e-03 8.2616155057578366e-03 -1.3841525853681296e-02 1.6057356629137997e-03 2.0347202856513082e-04 -4.7263011732147945e-03 6.7627848417826952e-04 -8.4094759382240172e-03 -8.9917146058350571e-03 1.3056627476868024e-02 -2.3026689278147567e-04 -1.1223913649047183e-02 -1.4688666621433193e-02 -1.2998158937039614e-02 -5.3380044078672759e-03 2.1901371099403266e-02 1.1309311768393877e-02 -9.8598379088505172e-03 3.2240017777073769e-02 1.4502254202484995e-02 -7.9939776575728982e-03 -2.5020622864036092e-02 -1.1328739374078496e-02 6.1383545900533349e-04 -1.4279779245392043e-02 -1.2557725078720746e-02 6.8856222012865309e-03 1.3636939698272661e-02 5.0364234905302162e-03 3.8062638555412280e-03 1.1281698621305869e-02 1.2082306039231400e-02 2.4346814088941912e-03 -2.5070958465194238e-02 -6.0456721108016320e-03 9.4514170495634039e-03 -1.2666873395028143e-02 -2.7874341874098769e-02 -7.7532025727777244e-03 1.4101233556194172e-02 3.9661483848273159e-03 -5.7613935305540105e-03 1.4502254202484995e-02 4.3677643564901690e-02 -1.1947316862924476e-02 -1.2326107416794635e-02 -7.9269056923244267e-03 -7.8724151393528147e-03 -1.3724596045936645e-02 -2.4847977955057970e-02 1.0504445219575219e-02 1.6047094366483685e-02 -2.0051328396365827e-03 1.1763430265637941e-02 1.1916846342936101e-02 2.3114994176388702e-02 3.1386480066655934e-03 -1.7849851610339529e-02 -8.1044277649999566e-03 7.9278046137302716e-03 2.3197389869512347e-03 4.2842821333279966e-03 2.1563555695188049e-04 -1.1046636265084241e-02 -4.3508814034459104e-03 1.1375855282518067e-02 -7.9939776575728982e-03 -1.1947316862924474e-02 2.9078330865573682e-02 1.3912515533757782e-03 -7.3547617354241266e-03 4.4687795396861942e-05 7.8882520266403810e-03 1.1026222640622830e-02 -1.1386449067268330e-02 -6.9328062645473421e-03 4.6767649337521849e-03 -9.3617551996258291e-03 1.5117295701057450e-03 5.6753274355483764e-04 -5.7092716131719535e-03 1.2862448050131340e-02 3.0981575505366630e-03 -1.4257033620374376e-02 1.7361704651491398e-02 1.1173480168274753e-02 1.1658228560527104e-02 -3.6012405630803164e-02 1.4782882687334670e-03 3.8310392989923635e-03 -2.5020622864036085e-02 -1.2326107416794633e-02 1.3912515533757795e-03 5.2104439120964921e-02 -7.1530233504985951e-04 1.7515755790304247e-02 1.2340633163783634e-02 1.5421737033911696e-02 -6.4137030563489687e-03 -2.9661629977095955e-02 1.3926263344932429e-03 -1.6569891371204685e-02 -2.0678157728411126e-02 -1.5723098555536309e-02 -1.5080263197123503e-02 2.9566039264106381e-02 -7.0162349803235620e-04 3.6675824214776618e-03 1.0809498760981329e-02 3.1166834103380143e-03 6.8532557754901564e-03 1.2032923508894567e-03 -7.1145550841641668e-03 -1.7833211081349782e-04 -1.1328739374078496e-02 -7.9269056923244267e-03 -7.3547617354241257e-03 -7.1530233504986103e-04 2.5536638095236770e-02 -6.7415186672284779e-04 4.8341881279136923e-03 -3.2923319353234349e-03 4.7383429305730002e-03 1.0056910609945295e-03 -5.6378289343133742e-03 5.9722343336982811e-04 -5.1370001682828287e-03 -7.9509657449898154e-03 -3.9109033466059500e-03 -6.7162842336782004e-04 3.2692658855404365e-03 -7.0673079866564784e-05 1.2110988282335065e-02 6.7185288234928456e-03 1.5321737971849176e-02 -1.0442138835197652e-02 3.1951356130619808e-04 -1.3007105686346191e-04 6.1383545900533327e-04 -7.8724151393528147e-03 4.4687795396862158e-05 1.7515755790304247e-02 -6.7415186672284768e-04 3.7083989222324018e-02 4.0662350829250606e-03 1.1201331491672585e-02 -1.0125367127637298e-02 -1.5933036361748892e-02 8.2928977440282960e-04 -1.6542981440981513e-02 -1.0796273447086018e-02 -1.0708199414646116e-02 -1.9662910462383824e-02 2.8646340294628558e-03 1.8610276984731735e-04 -5.9890849017039515e-03 1.1869519062695608e-02 1.2411733472659189e-02 2.4012451705218152e-03 -2.5883338564554957e-02 -6.2442094428756265e-03 9.9250729346443602e-03 -1.4279779245392043e-02 -1.3724596045936645e-02 7.8882520266403810e-03 1.2340633163783634e-02 4.8341881279136923e-03 4.0662350829250597e-03 3.6008982807866297e-02 1.5157120531136261e-02 -7.8997918795638677e-03 -2.6741644670811804e-02 -1.1245361649706753e-02 -2.7678194684040863e-04 -1.4750693797347371e-02 -1.3586504043362316e-02 -5.8812809106892350e-03 2.1436321243760645e-02 1.2397629050172197e-02 -1.0222950477638104e-02 1.2380749403650710e-02 2.2889552210793918e-02 1.8286852457238450e-03 -1.8041779780618609e-02 -7.7941731017557641e-03 8.2616155057578366e-03 -1.2557725078720742e-02 -2.4847977955057974e-02 1.1026222640622828e-02 1.5421737033911696e-02 -3.2923319353234349e-03 1.1201331491672583e-02 1.5157120531136267e-02 4.6142189006939963e-02 -1.1389377362965747e-02 -1.2605881631898113e-02 -8.6282456398396237e-03 -8.2225209092330713e-03 -1.1879122760535132e-02 -2.7848993373875277e-02 -7.9786883171443883e-03 1.2124902283073931e-02 3.3799807881181852e-03 -4.7272682944338876e-03 1.6261939560945726e-03 1.8417402692564528e-03 -5.2398462883720002e-03 1.2433909426641064e-02 2.8019633553069650e-03 -1.3841525853681296e-02 6.8856222012865301e-03 1.0504445219575217e-02 -1.1386449067268330e-02 -6.4137030563489704e-03 4.7383429305730002e-03 -1.0125367127637301e-02 -7.8997918795638677e-03 -1.1389377362965747e-02 3.1160509392716060e-02 1.2503067948517420e-03 -7.2575838260333569e-03 -9.2553905915253375e-04 1.7224531966188456e-03 3.8232467114714783e-03 -1.4670045149559291e-04 -9.6049906395799193e-03 -5.0627772971840092e-03 1.0504918454890997e-02 -2.1430977313596593e-02 -1.5949498192367642e-02 -1.4725798375085881e-02 3.2494847616890705e-02 -8.0897985134276249e-04 1.6057356629137992e-03 1.3636939698272663e-02 1.6047094366483685e-02 -6.9328062645473421e-03 -2.9661629977095955e-02 1.0056910609945291e-03 -1.5933036361748892e-02 -2.6741644670811804e-02 -1.2605881631898113e-02 1.2503067948517407e-03 5.0088928294140078e-02 -8.7262263132707328e-04 1.8101076897235068e-02 1.7734537277872272e-02 1.2192025340705818e-02 1.2832743648383693e-02 -3.6121000925671359e-02 9.9217153875156075e-04 3.8017779979978130e-03 -5.3834564952611359e-03 -7.6950708935623266e-03 -3.6424523526977603e-03 -8.7512943355078326e-04 4.5999920863356580e-03 2.0347202856513060e-04 5.0364234905302162e-03 -2.0051328396365827e-03 4.6767649337521849e-03 1.3926263344932427e-03 -5.6378289343133742e-03 8.2928977440282949e-04 -1.1245361649706753e-02 -8.6282456398396202e-03 -7.2575838260333560e-03 -8.7262263132707285e-04 2.2841904189771677e-02 -7.5223966194700744e-04 1.0259714284884890e-02 3.8644334319923499e-03 6.1195216660649724e-03 1.6878060999373943e-03 -7.3400514007477789e-03 -1.7677256210699456e-04 -1.1681796705992842e-02 -1.1290303413278616e-02 -1.9452478277056425e-02 5.3889091602280711e-03 -1.3131848784592940e-04 -4.7263011732147928e-03 3.8062638555412293e-03 1.1763430265637941e-02 -9.3617551996258309e-03 -1.6569891371204685e-02 5.9722343336982790e-04 -1.6542981440981513e-02 -2.7678194684040689e-04 -8.2225209092330696e-03 -9.2553905915253461e-04 1.8101076897235068e-02 -7.5223966194700766e-04 3.4820844413187786e-02 1.1644998935134331e-02 7.8017527390950841e-03 1.6537830906325365e-02 -1.0412778824100764e-02 2.3397603420177181e-04 -3.4962016948205895e-04 -1.1579769061729254e-02 -1.0070953013880715e-02 -7.4106004128220732e-03 1.1909646809122001e-02 5.8422432452756579e-03 6.7627848417826887e-04 1.1281698621305869e-02 1.1916846342936101e-02 1.5117295701057450e-03 -2.0678157728411122e-02 -5.1370001682828287e-03 -1.0796273447086018e-02 -1.4750693797347373e-02 -1.1879122760535132e-02 1.7224531966188461e-03 1.7734537277872272e-02 1.0259714284884891e-02 1.1644998935134331e-02 2.9882802728054877e-02 1.1691576527611909e-02 8.6287055598746991e-03 -2.3800064848867271e-02 -1.2623304458009885e-02 -5.9772918860037990e-03 -1.1204322843587126e-02 -2.4496808438330867e-02 -1.3700946555510993e-02 1.7656960198061226e-02 -1.9321854572854332e-03 -8.4094759382240172e-03 1.2082306039231400e-02 2.3114994176388699e-02 5.6753274355483797e-04 -1.5723098555536309e-02 -7.9509657449898154e-03 -1.0708199414646114e-02 -1.3586504043362316e-02 -2.7848993373875277e-02 3.8232467114714783e-03 1.2192025340705820e-02 3.8644334319923477e-03 7.8017527390950858e-03 1.1691576527611908e-02 4.3629182610988901e-02 1.5393349047207502e-02 -1.3108942663124599e-02 -8.3796572048885666e-03 5.2327406670522186e-03 -8.5525859543831538e-03 -1.4227874677749823e-02 -1.6037614583399085e-02 1.2132314094085224e-02 -3.5532337448876861e-03 -8.9917146058350588e-03 2.4346814088941912e-03 3.1386480066655951e-03 -5.7092716131719526e-03 -1.5080263197123503e-02 -3.9109033466059491e-03 -1.9662910462383821e-02 -5.8812809106892341e-03 -7.9786883171443883e-03 -1.4670045149559280e-04 1.2832743648383693e-02 6.1195216660649724e-03 1.6537830906325365e-02 8.6287055598746974e-03 1.5393349047207504e-02 3.4666196500728531e-02 -6.5143146490419142e-03 5.0191813664497769e-03 -6.5581569076839140e-04 1.0695660651836249e-02 1.7082122525594708e-02 1.1477880017454908e-02 -3.5216943293889046e-02 1.1649583760612676e-03 1.3056627476868024e-02 -2.5070958465194238e-02 -1.7849851610339529e-02 1.2862448050131340e-02 2.9566039264106378e-02 -6.7162842336781982e-04 2.8646340294628553e-03 2.1436321243760645e-02 1.2124902283073931e-02 -9.6049906395799193e-03 -3.6121000925671359e-02 1.6878060999373941e-03 -1.0412778824100764e-02 -2.3800064848867271e-02 -1.3108942663124599e-02 -6.5143146490419133e-03 5.8510946373918654e-02 -4.2936658783535031e-04 -1.3729505461194526e-02 5.6718781408082782e-03 -3.2523683861513083e-03 -3.6371356481326956e-03 7.3828792494718863e-04 -5.6621582204576630e-03 -2.3026689278147569e-04 -6.0456721108016337e-03 -8.1044277649999566e-03 3.0981575505366638e-03 -7.0162349803235631e-04 3.2692658855404365e-03 1.8610276984731768e-04 1.2397629050172197e-02 3.3799807881181860e-03 -5.0627772971840092e-03 9.9217153875156248e-04 -7.3400514007477772e-03 2.3397603420177170e-04 -1.2623304458009885e-02 -8.3796572048885666e-03 5.0191813664497761e-03 -4.2936658783535107e-04 2.6089416303586650e-02 3.9276211706265282e-04 3.0352550931893709e-04 -8.1736992164198816e-03 -1.0005087826614412e-02 1.2705444846478609e-02 -4.0489424501781169e-04 -1.1223913649047183e-02 9.4514170495634039e-03 7.9278046137302681e-03 -1.4257033620374376e-02 3.6675824214776622e-03 -7.0673079866564960e-05 -5.9890849017039532e-03 -1.0222950477638102e-02 -4.7272682944338876e-03 1.0504918454890997e-02 3.8017779979978125e-03 -1.7677256210699458e-04 -3.4962016948205895e-04 -5.9772918860037999e-03 5.2327406670522186e-03 -6.5581569076839097e-04 -1.3729505461194528e-02 3.9276211706265303e-04 3.1975637403099375e-02 222 223 224 294 295 296 309 310 311 237 238 239 225 226 227 297 298 299 312 313 314 240 241 242 3.7541519446038861e-02 1.4411313069090520e-02 1.0213478879786587e-02 -2.9356305168091068e-02 -1.3865567430673215e-02 -5.5581068867754484e-03 -1.7360456394464860e-02 -1.4586622120432042e-02 2.5260683783304609e-03 2.0360013837362998e-02 1.2361503932989378e-02 1.3597605032212051e-02 1.3902337943423335e-02 1.4269826163427467e-02 1.7338493186218604e-03 -2.4459700735472070e-02 -6.0652215130884701e-03 -1.3105060583360069e-02 -1.3365391471906591e-02 -1.2941324778009525e-02 -9.6734938272468804e-03 1.2737982543109405e-02 6.4160926766958833e-03 2.6565968843143942e-04 1.4411313069090520e-02 5.1409619620914275e-02 1.6823473323718759e-02 -1.5838238775094032e-02 -1.0519104544841409e-02 6.1761463916520168e-03 -1.4923614283415423e-02 -3.1529853901580668e-02 4.6245841182786041e-03 1.2415386539084758e-02 4.2642167850609333e-03 7.3991666574818402e-03 1.4185852388808042e-02 2.5832148086947070e-02 1.9736423472057848e-03 -1.7920356651444098e-02 -8.7740727804043288e-03 -1.2464218144951224e-02 -1.1520873205378642e-02 -2.7472276149806418e-02 -1.5599747531946054e-02 1.9190530918348877e-02 -3.2106771162894463e-03 -8.9330471614397257e-03 1.0213478879786589e-02 1.6823473323718759e-02 4.0468339278675151e-02 -7.7487811223136017e-03 5.2237746379069092e-03 -1.8419346891326784e-03 -6.0696370339963137e-03 -8.6521333665453438e-03 -4.0324428377317583e-04 1.3092080725256543e-02 7.7618699725336719e-03 1.7361004030446468e-02 2.7728730549129946e-03 2.2542390707088206e-03 -5.5081374615293137e-03 -1.6552213546621501e-02 -4.1659160039515227e-03 -2.1585606013577459e-02 -8.4794683552776983e-03 -1.5341286655780488e-02 -1.7750925047537714e-02 1.2771667398252995e-02 -3.9040209785908050e-03 -1.0739495813571273e-02 -2.9356305168091068e-02 -1.5838238775094032e-02 -7.7487811223136034e-03 6.3123839746981436e-02 -2.2820050535354486e-04 -1.5720819314247434e-02 2.5518986022975650e-02 1.5689600635504699e-02 -1.2176044519992147e-02 -4.0781188068603848e-02 1.0157841837535573e-03 -1.1531228145237687e-02 -2.9482323390349230e-02 -2.0431029310033412e-02 1.3763603442371732e-02 3.6692567994894169e-02 -7.7980617134469816e-04 6.0830896008968356e-03 1.3942873531949460e-02 1.9919087511669081e-02 1.3373793939594009e-02 -3.9658450669756561e-02 6.5280243089834886e-04 1.3956386118928294e-02 -1.3865567430673211e-02 -1.0519104544841409e-02 5.2237746379069075e-03 -2.2820050535354500e-04 2.5355374833614854e-02 3.0088877159431982e-04 1.3002751785455381e-02 5.1852725760920051e-03 -4.9667563898633943e-03 1.2256782043293245e-03 -8.2157032355320500e-03 2.5531569784479903e-04 -7.1781316664452505e-03 -9.0968195778213037e-03 3.2066118508988642e-03 -5.4076705850487938e-04 5.2563337231870972e-03 -1.0300116570147076e-05 6.6972082933206434e-03 -1.6433591845218670e-03 -3.7467192700162714e-03 8.8702837787154069e-04 -6.3219945901773324e-03 -2.6281518179507494e-04 -5.5581068867754484e-03 6.1761463916520168e-03 -1.8419346891326821e-03 -1.5720819314247431e-02 3.0088877159431987e-04 3.1932294389165429e-02 -1.1061421400783629e-02 -6.3865253240925476e-03 1.2919906760377433e-02 4.2096395618287531e-03 -1.7646234304754220e-04 -6.4951565040669273e-04 1.1205918304588827e-02 9.2573316517265206e-03 -1.5408256093112417e-02 1.7266237446489712e-03 2.7613251723654402e-04 -4.9389435165378744e-03 6.3268504135492113e-04 -9.2734043129640200e-03 -9.6295450425373710e-03 1.4565480949385042e-02 -1.7410735210529143e-04 -1.2384006157815826e-02 -1.7360456394464860e-02 -1.4923614283415427e-02 -6.0696370339963154e-03 2.5518986022975650e-02 1.3002751785455381e-02 -1.1061421400783629e-02 3.7544939714868164e-02 1.6731842732795665e-02 -9.0106833385805753e-03 -2.9708911622263336e-02 -1.3098337935213377e-02 6.3415330943775963e-04 -1.6536242867679525e-02 -1.4503183270528981e-02 7.8109906600988196e-03 1.5968871870902190e-02 5.7133849959126537e-03 4.4825640784412618e-03 1.3486834214136429e-02 1.3983372637075327e-02 2.7201743784456916e-03 -2.8914020938474713e-02 -6.9062166620812481e-03 1.0493859346936984e-02 -1.4586622120432042e-02 -3.1529853901580668e-02 -8.6521333665453455e-03 1.5689600635504699e-02 5.1852725760920069e-03 -6.3865253240925476e-03 1.6731842732795665e-02 4.9629309609660395e-02 -1.3097623927859852e-02 -1.3745012266374729e-02 -1.0282427210815953e-02 -8.4824217818312876e-03 -1.5662428355543552e-02 -2.7939427363974059e-02 1.1579176550032263e-02 1.8004109594554566e-02 -1.8883851748720277e-03 1.2985348737010112e-02 1.3639401259242246e-02 2.6324971464615255e-02 3.3341462642319762e-03 -2.0070891479746861e-02 -9.4994599991249477e-03 8.7200328490546798e-03 2.5260683783304609e-03 4.6245841182786032e-03 -4.0324428377317670e-04 -1.2176044519992145e-02 -4.9667563898633952e-03 1.2919906760377433e-02 -9.0106833385805753e-03 -1.3097623927859852e-02 3.3004008078733049e-02 1.1597899736672124e-03 -8.1317548649207788e-03 -1.3353293037031129e-03 8.8634350901449343e-03 1.2182436926349686e-02 -1.2607731675392255e-02 -7.5302605794660693e-03 5.1078964345037418e-03 -9.9934404589813904e-03 1.8386765632095979e-03 7.6817984249498861e-04 -5.6379504760079545e-03 1.4329018432686587e-02 3.5130378610170082e-03 -1.5946218641252598e-02 2.0360013837362998e-02 1.2415386539084756e-02 1.3092080725256543e-02 -4.0781188068603841e-02 1.2256782043293247e-03 4.2096395618287539e-03 -2.9708911622263339e-02 -1.3745012266374730e-02 1.1597899736672118e-03 5.9091527503449336e-02 -3.8468441963099010e-04 1.9430368773235982e-02 1.4438954948979088e-02 1.7427287928775518e-02 -7.0570127754367344e-03 -3.3327793704639508e-02 1.3650288335359500e-03 -1.8353424604079530e-02 -2.3728423001058135e-02 -1.7723691715681063e-02 -1.6681168240225093e-02 3.3655820106773419e-02 -5.7999310403876523e-04 4.1997265857528672e-03 1.2361503932989378e-02 4.2642167850609359e-03 7.7618699725336710e-03 1.0157841837535573e-03 -8.2157032355320500e-03 -1.7646234304754220e-04 -1.3098337935213377e-02 -1.0282427210815955e-02 -8.1317548649207771e-03 -3.8468441963098951e-04 2.9067148431471332e-02 -5.0691235802623159e-04 5.5883014141615926e-03 -3.1497565409439087e-03 5.1287533831285200e-03 8.3422779461694309e-04 -6.2684476282145862e-03 4.5774548758223724e-04 -5.9371562850667045e-03 -9.3928994084548668e-03 -4.4572291782790582e-03 -3.7963868561039833e-04 3.9778688074291017e-03 -7.6010098970819088e-05 1.3597605032212051e-02 7.3991666574818402e-03 1.7361004030446468e-02 -1.1531228145237687e-02 2.5531569784479919e-04 -6.4951565040669316e-04 6.3415330943776083e-04 -8.4824217818312859e-03 -1.3353293037031120e-03 1.9430368773235989e-02 -5.0691235802623170e-04 4.1673584986632331e-02 4.6459966556325512e-03 1.2371133953382307e-02 -1.0874839728240260e-02 -1.7713985788971421e-02 7.8693502838766602e-04 -1.8224161680516913e-02 -1.2190054796003673e-02 -1.1977286607816429e-02 -2.1874274765386222e-02 3.1271449596944286e-03 1.5406941057733646e-04 -6.0764678888255933e-03 1.3902337943423335e-02 1.4185852388808040e-02 2.7728730549129938e-03 -2.9482323390349230e-02 -7.1781316664452505e-03 1.1205918304588827e-02 -1.6536242867679522e-02 -1.5662428355543552e-02 8.8634350901449326e-03 1.4438954948979088e-02 5.5883014141615926e-03 4.6459966556325512e-03 4.0245561740501028e-02 1.7330666223902141e-02 -8.9240907842842842e-03 -3.0189152851429247e-02 -1.2473595107487061e-02 -5.8357311875691532e-04 -1.6921208483147012e-02 -1.5595633479013861e-02 -6.6654805850703486e-03 2.4542072959701552e-02 1.3804968581617942e-02 -1.1315078617167754e-02 1.4269826163427467e-02 2.5832148086947067e-02 2.2542390707088211e-03 -2.0431029310033412e-02 -9.0968195778213055e-03 9.2573316517265223e-03 -1.4503183270528979e-02 -2.7939427363974055e-02 1.2182436926349686e-02 1.7427287928775518e-02 -3.1497565409439095e-03 1.2371133953382307e-02 1.7330666223902148e-02 5.1324506619162831e-02 -1.2641257355517427e-02 -1.4462438471496053e-02 -9.6703390444508718e-03 -9.2388371265249639e-03 -1.3601482723131718e-02 -3.1346677675033574e-02 -8.8433580026698929e-03 1.3970353459085035e-02 4.0463654961138155e-03 -5.3416891174550554e-03 1.7338493186218613e-03 1.9736423472057848e-03 -5.5081374615293171e-03 1.3763603442371734e-02 3.2066118508988625e-03 -1.5408256093112419e-02 7.8109906600988188e-03 1.1579176550032265e-02 -1.2607731675392253e-02 -7.0570127754367344e-03 5.1287533831285200e-03 -1.0874839728240262e-02 -8.9240907842842842e-03 -1.2641257355517424e-02 3.4226279154919624e-02 1.4738973404379301e-03 -7.9451837839679268e-03 -1.0829091848236156e-03 2.0208327248338168e-03 4.2571793506586105e-03 -3.8207546654264453e-04 -1.0822069926643143e-02 -5.5589223424386876e-03 1.1637670454720889e-02 -2.4459700735472070e-02 -1.7920356651444098e-02 -1.6552213546621505e-02 3.6692567994894169e-02 -5.4076705850487905e-04 1.7266237446489712e-03 1.5968871870902190e-02 1.8004109594554566e-02 -7.5302605794660693e-03 -3.3327793704639508e-02 8.3422779461694309e-04 -1.7713985788971418e-02 -3.0189152851429247e-02 -1.4462438471496055e-02 1.4738973404379318e-03 5.5624986197107436e-02 -8.1122702214457185e-04 2.0110795417278716e-02 2.0226805612135215e-02 1.3911178554761896e-02 1.4307230833306813e-02 -4.0536584383498199e-02 9.8527325965619287e-04 4.1779125793865663e-03 -6.0652215130884701e-03 -8.7740727804043288e-03 -4.1659160039515227e-03 -7.7980617134469795e-04 5.2563337231870972e-03 2.7613251723654407e-04 5.7133849959126546e-03 -1.8883851748720277e-03 5.1078964345037418e-03 1.3650288335359494e-03 -6.2684476282145862e-03 7.8693502838766581e-04 -1.2473595107487061e-02 -9.6703390444508736e-03 -7.9451837839679251e-03 -8.1122702214457066e-04 2.4977904070510506e-02 -7.0561659571194164e-04 1.1410129790280195e-02 4.4708131238451491e-03 6.7785027453561202e-03 1.6413061943359993e-03 -8.1038062896009334e-03 -1.3275034185268074e-04 -1.3105060583360069e-02 -1.2464218144951226e-02 -2.1585606013577462e-02 6.0830896008968356e-03 -1.0300116570147239e-05 -4.9389435165378736e-03 4.4825640784412609e-03 1.2985348737010112e-02 -9.9934404589813904e-03 -1.8353424604079533e-02 4.5774548758223713e-04 -1.8224161680516916e-02 -5.8357311875691488e-04 -9.2388371265249621e-03 -1.0829091848236156e-03 2.0110795417278712e-02 -7.0561659571194164e-04 3.8124268883739931e-02 1.3023913502688273e-02 8.8246913319917769e-03 1.8201602806741136e-02 -1.1658304293108570e-02 1.5118642717414917e-04 -5.0081083604380382e-04 -1.3365391471906591e-02 -1.1520873205378642e-02 -8.4794683552777000e-03 1.3942873531949460e-02 6.6972082933206434e-03 6.3268504135492037e-04 1.3486834214136432e-02 1.3639401259242248e-02 1.8386765632095975e-03 -2.3728423001058135e-02 -5.9371562850667045e-03 -1.2190054796003673e-02 -1.6921208483147012e-02 -1.3601482723131718e-02 2.0208327248338168e-03 2.0226805612135215e-02 1.1410129790280195e-02 1.3023913502688273e-02 3.3782958587329374e-02 1.3443195761922020e-02 9.7687982289066215e-03 -2.7424448989438736e-02 -1.4130422891188038e-02 -6.6153829097118592e-03 -1.2941324778009525e-02 -2.7472276149806421e-02 -1.5341286655780490e-02 1.9919087511669077e-02 -1.6433591845218662e-03 -9.2734043129640183e-03 1.3983372637075327e-02 2.6324971464615255e-02 7.6817984249498796e-04 -1.7723691715681063e-02 -9.3928994084548668e-03 -1.1977286607816428e-02 -1.5595633479013861e-02 -3.1346677675033574e-02 4.2571793506586096e-03 1.3911178554761898e-02 4.4708131238451500e-03 8.8246913319917769e-03 1.3443195761922018e-02 4.8942664140425862e-02 1.7043914232664374e-02 -1.4996184492723882e-02 -9.8832363110695348e-03 5.6980128187511898e-03 -9.6734938272468804e-03 -1.5599747531946056e-02 -1.7750925047537714e-02 1.3373793939594009e-02 -3.7467192700162727e-03 -9.6295450425373710e-03 2.7201743784456907e-03 3.3341462642319775e-03 -5.6379504760079536e-03 -1.6681168240225093e-02 -4.4572291782790582e-03 -2.1874274765386222e-02 -6.6654805850703503e-03 -8.8433580026698929e-03 -3.8207546654264442e-04 1.4307230833306813e-02 6.7785027453561193e-03 1.8201602806741136e-02 9.7687982289066198e-03 1.7043914232664371e-02 3.8379593255246681e-02 -7.1498547277108063e-03 5.4904907406588092e-03 -1.3064252639759140e-03 1.2737982543109405e-02 1.9190530918348873e-02 1.2771667398252995e-02 -3.9658450669756568e-02 8.8702837787154069e-04 1.4565480949385042e-02 -2.8914020938474713e-02 -2.0070891479746861e-02 1.4329018432686589e-02 3.3655820106773419e-02 -3.7963868561039849e-04 3.1271449596944321e-03 2.4542072959701546e-02 1.3970353459085035e-02 -1.0822069926643143e-02 -4.0536584383498192e-02 1.6413061943359997e-03 -1.1658304293108570e-02 -2.7424448989438729e-02 -1.4996184492723882e-02 -7.1498547277108037e-03 6.5597629371583824e-02 -2.4250429156031094e-04 -1.5163082792556536e-02 6.4160926766958825e-03 -3.2106771162894463e-03 -3.9040209785908054e-03 6.5280243089834843e-04 -6.3219945901773324e-03 -1.7410735210529114e-04 -6.9062166620812481e-03 -9.4994599991249477e-03 3.5130378610170087e-03 -5.7999310403876469e-04 3.9778688074291000e-03 1.5406941057733635e-04 1.3804968581617942e-02 4.0463654961138164e-03 -5.5589223424386885e-03 9.8527325965619070e-04 -8.1038062896009316e-03 1.5118642717414898e-04 -1.4130422891188040e-02 -9.8832363110695331e-03 5.4904907406588092e-03 -2.4250429156031083e-04 2.8994940002719280e-02 3.2826623370748258e-04 2.6565968843143893e-04 -8.9330471614397222e-03 -1.0739495813571273e-02 1.3956386118928294e-02 -2.6281518179507510e-04 -1.2384006157815826e-02 1.0493859346936984e-02 8.7200328490546798e-03 -1.5946218641252598e-02 4.1997265857528655e-03 -7.6010098970819156e-05 -6.0764678888255959e-03 -1.1315078617167757e-02 -5.3416891174550545e-03 1.1637670454720887e-02 4.1779125793865654e-03 -1.3275034185268079e-04 -5.0081083604380317e-04 -6.6153829097118574e-03 5.6980128187511898e-03 -1.3064252639759105e-03 -1.5163082792556536e-02 3.2826623370748231e-04 3.5315754146764120e-02 165 166 167 237 238 239 252 253 254 180 181 182 168 169 170 240 241 242 255 256 257 183 184 185 2.6758301462276802e-02 8.0415511825071648e-03 5.4751186526255501e-03 -1.6746296582962696e-02 -1.2944463470187786e-02 -5.8589167488818893e-03 -8.7599192357911571e-03 -8.0442223655734987e-03 1.4767878049674399e-03 1.1542646116987907e-02 1.1443021412980205e-02 1.0293963847853294e-02 5.7147463650554509e-03 8.3360199139379792e-03 1.0930465333375324e-03 -1.5353345498207121e-02 -6.5217099776218876e-03 -8.8981756177813655e-03 -7.3071747158318084e-03 -6.9889023509745688e-03 -5.3772081866688970e-03 4.1510420884726213e-03 6.6787056549323948e-03 1.7953837145483335e-03 8.0415511825071631e-03 4.6769725208105302e-02 1.6411074745942184e-02 -1.5101900814636283e-02 -1.1661710844940758e-02 5.1445632150197672e-03 -8.5139213864422955e-03 -2.8808491922869054e-02 5.1313088910478382e-03 1.1878110324685756e-02 7.2223511337572042e-03 8.7602033825423115e-03 8.3153108007212526e-03 2.3697286448336716e-02 1.6621340046801126e-03 -1.6169141128450273e-02 -1.1288698144611732e-02 -1.3039543256303228e-02 -5.7373578939835307e-03 -2.5922832076058659e-02 -1.5511503698071333e-02 1.7287348915598223e-02 -7.6298017190094217e-06 -8.5582372848576546e-03 5.4751186526255501e-03 1.6411074745942184e-02 3.5475385812683280e-02 -7.7990500349289834e-03 3.8527355971121422e-03 1.6012160773334490e-03 -3.5591395147223075e-03 -8.1615895410621971e-03 2.2220056060798200e-03 9.6927946150535630e-03 8.6816902804028977e-03 1.5849846212716991e-02 1.9792000170095365e-03 1.8683830289113633e-03 -7.5080296871439800e-03 -1.3415157853032258e-02 -6.1611446126798993e-03 -1.9531864963479105e-02 -4.1710546137234397e-03 -1.4596749894214275e-02 -1.6409141152151620e-02 1.1797288731718345e-02 -1.8943996044122168e-03 -1.1699417906038817e-02 -1.6746296582962696e-02 -1.5101900814636283e-02 -7.7990500349289817e-03 5.1518841894729946e-02 4.7810068621494169e-03 -1.4731805101819704e-02 1.5069192690115167e-02 1.5015546116420347e-02 -1.0470136061374027e-02 -3.2031681139920477e-02 -3.7064053186954583e-03 -9.9925258962797747e-03 -1.9062540191658751e-02 -1.8647618026153872e-02 1.2081616820144823e-02 2.8298803140843466e-02 3.7205708412315318e-03 4.9852657497724707e-03 4.9915949521295282e-03 1.7789316481598826e-02 1.2586836178346475e-02 -3.2037914763276193e-02 -3.8505161419145040e-03 1.3339798346138720e-02 -1.2944463470187786e-02 -1.1661710844940758e-02 3.8527355971121413e-03 4.7810068621494169e-03 2.2129262175989758e-02 -2.1484093425522838e-03 1.2353217315153193e-02 8.3839928969579175e-03 -6.5136119187748625e-03 -3.3095947800508970e-03 -6.5677616372150924e-03 -1.4223450947778581e-03 -7.8587901615578201e-03 -1.1736103782094767e-02 5.0816756046144192e-03 3.8148358781424445e-03 3.9018719592873647e-03 7.3546364635101145e-04 6.8240747605261840e-03 1.5359647861709767e-03 -1.5196855377891069e-03 -3.6602864041747375e-03 -5.9855155541554015e-03 1.9341770458165396e-03 -5.8589167488818893e-03 5.1445632150197672e-03 1.6012160773334497e-03 -1.4731805101819704e-02 -2.1484093425522838e-03 2.8586768862840284e-02 -8.8264718939765428e-03 -7.6329715082378152e-03 1.2285875679169176e-02 4.1650307682683293e-03 5.9049826449202058e-04 1.7673461576607596e-03 8.3670201788233131e-03 1.0269909023844916e-02 -1.4449907205850231e-02 1.1055873894580373e-03 3.1163041871259977e-04 -6.9382561935504407e-03 2.4054026529798829e-03 -8.5694176241370816e-03 -1.0725273504477037e-02 1.3374152755148572e-02 2.0341975528578777e-03 -1.2127769873125955e-02 -8.7599192357911554e-03 -8.5139213864422972e-03 -3.5591395147223075e-03 1.5069192690115165e-02 1.2353217315153193e-02 -8.8264718939765428e-03 2.5206588483392495e-02 9.8914391522164757e-03 -5.6278189659835654e-03 -1.6785906230649635e-02 -1.2172916530183566e-02 2.4782770894050555e-03 -8.8141704915849373e-03 -8.4365859664213040e-03 4.7453586873905254e-03 7.5094332126410266e-03 6.4010779842721566e-03 1.0903105196940041e-03 4.8933532138698884e-03 7.7648455206258517e-03 1.6936791051445443e-03 -1.8318571641992857e-02 -7.2871560892205107e-03 8.0058049730482861e-03 -8.0442223655734987e-03 -2.8808491922869051e-02 -8.1615895410621954e-03 1.5015546116420343e-02 8.3839928969579175e-03 -7.6329715082378161e-03 9.8914391522164739e-03 4.4486777342037730e-02 -1.3564954130865758e-02 -1.3047865582951077e-02 -1.0522535871727631e-02 -7.3114447749566495e-03 -9.5622860741830917e-03 -2.6476433181342702e-02 1.1856178173191973e-02 1.6325876502114169e-02 1.5719028879368467e-03 1.1877337633913628e-02 7.5449090280598815e-03 2.3145625129349132e-02 3.0938464169695387e-03 -1.8123396776103213e-02 -1.1780837280342241e-02 9.8435977310472773e-03 1.4767878049674402e-03 5.1313088910478382e-03 2.2220056060798209e-03 -1.0470136061374027e-02 -6.5136119187748625e-03 1.2285875679169174e-02 -5.6278189659835654e-03 -1.3564954130865758e-02 2.9026797941218877e-02 3.1355809684049853e-03 -6.6872719584945822e-03 2.7434599063458106e-03 5.7050292127963486e-03 1.2604745321233936e-02 -1.1973910781038585e-02 -8.0480417962269686e-03 3.1036332613503725e-03 -1.0709413614533781e-02 1.4255692681040078e-03 4.6570290999687377e-04 -8.5115131312355485e-03 1.2403029569311785e-02 5.4604476245061796e-03 -1.5083301606005762e-02 1.1542646116987906e-02 1.1878110324685760e-02 9.6927946150535630e-03 -3.2031681139920470e-02 -3.3095947800508970e-03 4.1650307682683302e-03 -1.6785906230649638e-02 -1.3047865582951077e-02 3.1355809684049858e-03 4.7290338627664227e-02 3.6645551470099519e-03 1.6761654946011097e-02 6.4591811176936123e-03 1.5768929691410850e-02 -7.4877686449779700e-03 -2.6575182881328520e-02 -2.7469949511451340e-03 -1.5861948213298890e-02 -1.4548076704214950e-02 -1.5669407810441408e-02 -1.3638290727856103e-02 2.4648681093767853e-02 3.4622679614819555e-03 3.2329462883949880e-03 1.1443021412980205e-02 7.2223511337572033e-03 8.6816902804028977e-03 -3.7064053186954566e-03 -6.5677616372150915e-03 5.9049826449202047e-04 -1.2172916530183566e-02 -1.0522535871727632e-02 -6.6872719584945813e-03 3.6645551470099514e-03 2.4650569151779881e-02 2.4609639037698676e-03 6.2230881116634535e-03 2.0542575844484861e-04 3.4027606513561360e-03 -3.0548910085278509e-03 -5.6505158261866374e-03 -2.3615087795241154e-03 -5.9517432701213869e-03 -1.1385350268437207e-02 -6.5061387543927009e-03 3.5552914558746504e-03 2.0478175595846334e-03 4.1900639239047664e-04 1.0293963847853294e-02 8.7602033825423149e-03 1.5849846212716991e-02 -9.9925258962797730e-03 -1.4223450947778585e-03 1.7673461576607596e-03 2.4782770894050559e-03 -7.3114447749566495e-03 2.7434599063458111e-03 1.6761654946011097e-02 2.4609639037698680e-03 3.6335216504216866e-02 1.6073290270507720e-03 1.1378740176871164e-02 -1.1326766150443276e-02 -1.5359710877462265e-02 -2.0654452344834357e-03 -1.6644002028632171e-02 -8.0751634621057475e-03 -1.2236516750246651e-02 -1.9872414888255457e-02 2.2861753255275763e-03 4.3584439128125095e-04 -8.8526857136095212e-03 5.7147463650554509e-03 8.3153108007212526e-03 1.9792000170095365e-03 -1.9062540191658751e-02 -7.8587901615578201e-03 8.3670201788233131e-03 -8.8141704915849373e-03 -9.5622860741830917e-03 5.7050292127963486e-03 6.4591811176936123e-03 6.2230881116634544e-03 1.6073290270507711e-03 2.8514596578325765e-02 1.0765800277789322e-02 -5.6531287810366333e-03 -1.8727861165522143e-02 -1.2330509969279813e-02 1.6387250397686052e-03 -8.7909315198866477e-03 -8.9570414461420788e-03 -4.1557719584336033e-03 1.4706979307577667e-02 1.3404428460988773e-02 -9.4884027359783390e-03 8.3360199139379792e-03 2.3697286448336713e-02 1.8683830289113635e-03 -1.8647618026153868e-02 -1.1736103782094767e-02 1.0269909023844916e-02 -8.4365859664213040e-03 -2.6476433181342705e-02 1.2604745321233939e-02 1.5768929691410850e-02 2.0542575844484899e-04 1.1378740176871164e-02 1.0765800277789322e-02 4.7182401618660233e-02 -1.2947868569305153e-02 -1.3589905736870654e-02 -1.1591318662454464e-02 -7.7963540850196581e-03 -7.2340371287774909e-03 -2.8692033120504196e-02 -8.6038974395100613e-03 1.3037396975085181e-02 7.4107749209543295e-03 -6.7736574570265067e-03 1.0930465333375333e-03 1.6621340046801144e-03 -7.5080296871439817e-03 1.2081616820144823e-02 5.0816756046144192e-03 -1.4449907205850232e-02 4.7453586873905263e-03 1.1856178173191973e-02 -1.1973910781038585e-02 -7.4877686449779692e-03 3.4027606513561334e-03 -1.1326766150443278e-02 -5.6531287810366341e-03 -1.2947868569305156e-02 3.0731431740788483e-02 2.9687835524408487e-03 -6.5951205548966940e-03 1.4141075963941157e-03 8.8008863729416135e-04 4.4284595184696804e-03 1.7894689283816146e-03 -8.6279968045932919e-03 -6.8882188281104697e-03 1.1323605558911863e-02 -1.5353345498207119e-02 -1.6169141128450273e-02 -1.3415157853032256e-02 2.8298803140843466e-02 3.8148358781424445e-03 1.1055873894580373e-03 7.5094332126410266e-03 1.6325876502114169e-02 -8.0480417962269669e-03 -2.6575182881328527e-02 -3.0548910085278509e-03 -1.5359710877462265e-02 -1.8727861165522150e-02 -1.3589905736870659e-02 2.9687835524408492e-03 4.5628493484791824e-02 3.7057164851574237e-03 1.7352484979636529e-02 1.1313238286464602e-02 1.2594785400021628e-02 1.1064544273980605e-02 -3.2093578579683132e-02 -3.6272763915868858e-03 4.3315103312054643e-03 -6.5217099776218868e-03 -1.1288698144611734e-02 -6.1611446126798993e-03 3.7205708412315318e-03 3.9018719592873652e-03 3.1163041871259934e-04 6.4010779842721566e-03 1.5719028879368469e-03 3.1036332613503729e-03 -2.7469949511451331e-03 -5.6505158261866374e-03 -2.0654452344834357e-03 -1.2330509969279814e-02 -1.1591318662454463e-02 -6.5951205548966949e-03 3.7057164851574242e-03 2.2129187435986322e-02 2.5059363694014949e-03 1.0915580108315056e-02 7.7288367646788951e-03 8.2112097122122203e-03 -3.1437305209293365e-03 -6.8012664146365927e-03 6.8930064038333892e-04 -8.8981756177813655e-03 -1.3039543256303226e-02 -1.9531864963479105e-02 4.9852657497724698e-03 7.3546364635101091e-04 -6.9382561935504398e-03 1.0903105196940046e-03 1.1877337633913626e-02 -1.0709413614533781e-02 -1.5861948213298890e-02 -2.3615087795241154e-03 -1.6644002028632171e-02 1.6387250397686052e-03 -7.7963540850196581e-03 1.4141075963941159e-03 1.7352484979636529e-02 2.5059363694014940e-03 3.4102026377601562e-02 9.4475655727601551e-03 9.4990645562747032e-03 1.6753961462219961e-02 -9.7542280305515164e-03 -1.4203960850938365e-03 1.5534413639798545e-03 -7.3071747158318092e-03 -5.7373578939835307e-03 -4.1710546137234397e-03 4.9915949521295282e-03 6.8240747605261840e-03 2.4054026529798829e-03 4.8933532138698875e-03 7.5449090280598806e-03 1.4255692681040080e-03 -1.4548076704214950e-02 -5.9517432701213869e-03 -8.0751634621057475e-03 -8.7909315198866477e-03 -7.2340371287774900e-03 8.8008863729416211e-04 1.1313238286464604e-02 1.0915580108315056e-02 9.4475655727601551e-03 2.4249714685051597e-02 6.8796263988614480e-03 4.9828289802448817e-03 -1.4801718197582208e-02 -1.3241052002880163e-02 -6.8952370355539012e-03 -6.9889023509745705e-03 -2.5922832076058659e-02 -1.4596749894214273e-02 1.7789316481598823e-02 1.5359647861709767e-03 -8.5694176241370816e-03 7.7648455206258517e-03 2.3145625129349132e-02 4.6570290999687334e-04 -1.5669407810441405e-02 -1.1385350268437207e-02 -1.2236516750246651e-02 -8.9570414461420771e-03 -2.8692033120504199e-02 4.4284595184696804e-03 1.2594785400021629e-02 7.7288367646788959e-03 9.4990645562747032e-03 6.8796263988614471e-03 4.4246737122873477e-02 1.6526793266410048e-02 -1.3413222193549706e-02 -1.0656948338072418e-02 4.4826640174467055e-03 -5.3772081866688970e-03 -1.5511503698071331e-02 -1.6409141152151620e-02 1.2586836178346477e-02 -1.5196855377891077e-03 -1.0725273504477037e-02 1.6936791051445439e-03 3.0938464169695408e-03 -8.5115131312355485e-03 -1.3638290727856099e-02 -6.5061387543927001e-03 -1.9872414888255457e-02 -4.1557719584336033e-03 -8.6038974395100595e-03 1.7894689283816153e-03 1.1064544273980605e-02 8.2112097122122221e-03 1.6753961462219961e-02 4.9828289802448826e-03 1.6526793266410048e-02 3.4490015312746876e-02 -7.1566176647579124e-03 4.3093760341713933e-03 2.4848969727712094e-03 4.1510420884726205e-03 1.7287348915598220e-02 1.1797288731718345e-02 -3.2037914763276186e-02 -3.6602864041747375e-03 1.3374152755148574e-02 -1.8318571641992853e-02 -1.8123396776103213e-02 1.2403029569311786e-02 2.4648681093767853e-02 3.5552914558746513e-03 2.2861753255275742e-03 1.4706979307577667e-02 1.3037396975085181e-02 -8.6279968045932919e-03 -3.2093578579683132e-02 -3.1437305209293370e-03 -9.7542280305515164e-03 -1.4801718197582209e-02 -1.3413222193549706e-02 -7.1566176647579124e-03 5.3745080692716260e-02 4.4605985481989399e-03 -1.4321803881803558e-02 6.6787056549323948e-03 -7.6298017190095302e-06 -1.8943996044122162e-03 -3.8505161419145045e-03 -5.9855155541554015e-03 2.0341975528578773e-03 -7.2871560892205081e-03 -1.1780837280342240e-02 5.4604476245061788e-03 3.4622679614819550e-03 2.0478175595846342e-03 4.3584439128125079e-04 1.3404428460988771e-02 7.4107749209543260e-03 -6.8882188281104706e-03 -3.6272763915868866e-03 -6.8012664146365944e-03 -1.4203960850938365e-03 -1.3241052002880165e-02 -1.0656948338072417e-02 4.3093760341713933e-03 4.4605985481989399e-03 2.5773604908386701e-02 -2.0368510852001791e-03 1.7953837145483328e-03 -8.5582372848576529e-03 -1.1699417906038817e-02 1.3339798346138720e-02 1.9341770458165398e-03 -1.2127769873125954e-02 8.0058049730482861e-03 9.8435977310472773e-03 -1.5083301606005762e-02 3.2329462883949889e-03 4.1900639239047670e-04 -8.8526857136095229e-03 -9.4884027359783390e-03 -6.7736574570265050e-03 1.1323605558911862e-02 4.3315103312054652e-03 6.8930064038333903e-04 1.5534413639798554e-03 -6.8952370355539021e-03 4.4826640174467046e-03 2.4848969727712094e-03 -1.4321803881803557e-02 -2.0368510852001786e-03 3.2401231203117130e-02 237 238 239 309 310 311 324 325 326 252 253 254 240 241 242 312 313 314 327 328 329 255 256 257 3.0666457396886840e-02 1.0079138337732311e-02 6.6931956751973528e-03 -2.1022280428842560e-02 -1.5007728278488052e-02 -6.1221090026752391e-03 -1.1157996035332293e-02 -1.0101103217184311e-02 1.6645417623927343e-03 1.4602399756485614e-02 1.3315357012444537e-02 1.1618726223755399e-02 7.5944080015232316e-03 1.0297518827343350e-02 1.1038603784152474e-03 -1.8237074917714501e-02 -7.6255886427372688e-03 -1.0244067570943902e-02 -8.7787470781423398e-03 -8.7922323602931431e-03 -6.4490222345180382e-03 6.3328333051359958e-03 7.8346383211825767e-03 1.7348747683764497e-03 1.0079138337732309e-02 5.2659781603691690e-02 1.8112684925723602e-02 -1.7314994454900662e-02 -1.5049726506319481e-02 5.4741813260311819e-03 -1.0447500424477299e-02 -3.3183293948122250e-02 5.3421403104521687e-03 1.3533612878447952e-02 9.6045931685073450e-03 9.6766821571613766e-03 1.0219135269409129e-02 2.7413628186163747e-02 1.6147232390658637e-03 -1.8541081243185088e-02 -1.3366187709078778e-02 -1.4422077707696906e-02 -7.2382509075587971e-03 -2.9388966660276000e-02 -1.6781862067634490e-02 1.9709940544532456e-02 1.3101718654337153e-03 -9.0164721831027857e-03 6.6931956751973536e-03 1.8112684925723602e-02 3.9220332162652652e-02 -8.5850458871677311e-03 3.7288921027267673e-03 1.8872582239278998e-04 -4.2306018973589507e-03 -9.1310619585179328e-03 1.2062456489962726e-03 1.1044983073449324e-02 9.8400537720394303e-03 1.7743946642576482e-02 2.3627265084830741e-03 2.5289955212743865e-03 -7.3345468033992473e-03 -1.5065846556214546e-02 -7.2020216596136088e-03 -2.1423073852017440e-02 -5.1615652638079025e-03 -1.6248922908140749e-02 -1.7779658285261402e-02 1.2942154347419379e-02 -1.6286197954918959e-03 -1.1821971335940104e-02 -2.1022280428842560e-02 -1.7314994454900662e-02 -8.5850458871677311e-03 5.8107182410866896e-02 6.4323132209254856e-03 -1.6038922420201055e-02 1.8760197467362537e-02 1.7045485340725912e-02 -1.1301997743358900e-02 -3.6781727492691589e-02 -4.9710455797789786e-03 -1.0812771935808310e-02 -2.2419873306877350e-02 -2.1405316781205885e-02 1.3215411801457334e-02 3.2478558076897354e-02 4.9496637684412533e-03 5.7782489127730183e-03 7.1768754766795579e-03 2.0281634042237054e-02 1.3522937357969583e-02 -3.6298932203394862e-02 -5.0177395564441635e-03 1.4222139914336053e-02 -1.5007728278488050e-02 -1.5049726506319481e-02 3.7288921027267665e-03 6.4323132209254856e-03 2.5132797450513961e-02 -2.7981061602586409e-03 1.4439547465931617e-02 1.0996734903922657e-02 -7.3347770326814624e-03 -4.7116183042630478e-03 -8.1368400230364766e-03 -1.8140488565019841e-03 -9.2529943512369549e-03 -1.4107847014700048e-02 5.8576246713981936e-03 5.1725849462731120e-03 5.0098245274789359e-03 1.0890635018247709e-03 8.0130171225349187e-03 3.1330657245953113e-03 -1.2390864475310954e-03 -5.0851218216770811e-03 -6.9780090624548567e-03 2.5104382210234502e-03 -6.1221090026752391e-03 5.4741813260311819e-03 1.8872582239279063e-04 -1.6038922420201055e-02 -2.7981061602586409e-03 3.1524188830705679e-02 -9.8805336272468087e-03 -8.5045174899496621e-03 1.3824539471972966e-02 4.5305031427248319e-03 7.6964193608589397e-04 8.5019341211159958e-04 9.5016610242818784e-03 1.1378092343077644e-02 -1.5822734914991650e-02 1.0339012985410452e-03 3.3305377240827643e-04 -6.7794356749557409e-03 2.2840400822566882e-03 -9.2124269451833649e-03 -1.0766119309587990e-02 1.4691459502318658e-02 2.5600812177886709e-03 -1.3019357637647644e-02 -1.1157996035332293e-02 -1.0447500424477299e-02 -4.2306018973589515e-03 1.8760197467362540e-02 1.4439547465931620e-02 -9.8805336272468087e-03 3.0246346898606821e-02 1.2264960662339902e-02 -6.5315997391825267e-03 -2.2058181930371783e-02 -1.4460773447503799e-02 2.5437686751708924e-03 -1.0696420377750558e-02 -1.0387702426792083e-02 5.6006048618500223e-03 9.9557160863803992e-03 7.5664584464344145e-03 1.7655620112016510e-03 7.1581774935001591e-03 9.7140999105096437e-03 1.8541745218110964e-03 -2.2207839602395286e-02 -8.6890901864423841e-03 8.8786251937546211e-03 -1.0101103217184311e-02 -3.3183293948122250e-02 -9.1310619585179328e-03 1.7045485340725908e-02 1.0996734903922658e-02 -8.5045174899496621e-03 1.2264960662339900e-02 5.1305824680812941e-02 -1.4546117886439221e-02 -1.4938287845131456e-02 -1.4784490836172731e-02 -7.5112612879471904e-03 -1.1594727386031442e-02 -3.0121762014637898e-02 1.2915622377200960e-02 1.8645173784134002e-02 2.9932749822082195e-03 1.2986876463073385e-02 9.3765774695094683e-03 2.7278133077043836e-02 3.1264072334119234e-03 -2.0698078808362063e-02 -1.4484420845054777e-02 1.0664052549167731e-02 1.6645417623927345e-03 5.3421403104521679e-03 1.2062456489962735e-03 -1.1301997743358898e-02 -7.3347770326814624e-03 1.3824539471972963e-02 -6.5315997391825267e-03 -1.4546117886439221e-02 3.2670977679068854e-02 2.6978732413730734e-03 -7.3313520613049986e-03 1.5354710715342716e-04 6.5557838000215715e-03 1.3574888545538927e-02 -1.2895408262982503e-02 -8.4203144528838137e-03 3.1821729866675546e-03 -1.0705620161877392e-02 1.7773106103995951e-03 9.3275158159388297e-04 -7.5984305346207823e-03 1.3558402521238265e-02 6.1802935561731500e-03 -1.6655850947710833e-02 1.4602399756485614e-02 1.3533612878447952e-02 1.1044983073449326e-02 -3.6781727492691582e-02 -4.7116183042630478e-03 4.5305031427248319e-03 -2.2058181930371786e-02 -1.4938287845131454e-02 2.6978732413730747e-03 5.4355436910352876e-02 5.1084981082776745e-03 1.8345589513429669e-02 8.6808390913153451e-03 1.8081286244077826e-02 -8.0361652219218729e-03 -3.0173710576286688e-02 -3.8092267935830814e-03 -1.7500199588942240e-02 -1.7718325711837710e-02 -1.7915151758845806e-02 -1.5008420379240731e-02 2.9093269953033941e-02 4.6508874710199342e-03 3.9258362191279469e-03 1.3315357012444535e-02 9.6045931685073433e-03 9.8400537720394320e-03 -4.9710455797789795e-03 -8.1368400230364766e-03 7.6964193608589429e-04 -1.4460773447503803e-02 -1.4784490836172727e-02 -7.3313520613049986e-03 5.1084981082776737e-03 2.8731118098501991e-02 3.2698943303783663e-03 7.4212901623239074e-03 1.6309486358645022e-03 3.3920773898513360e-03 -4.1550192319324379e-03 -6.5508814790641266e-03 -3.1005424332813825e-03 -7.1421108736944268e-03 -1.4046149567714234e-02 -7.4461502021895805e-03 4.8838038498635276e-03 3.5517020031137288e-03 6.0637726842093626e-04 1.1618726223755399e-02 9.6766821571613766e-03 1.7743946642576482e-02 -1.0812771935808310e-02 -1.8140488565019839e-03 8.5019341211159806e-04 2.5437686751708919e-03 -7.5112612879471912e-03 1.5354710715342760e-04 1.8345589513429669e-02 3.2698943303783659e-03 4.0527815435553456e-02 2.1142377536760891e-03 1.2299497584112359e-02 -1.1443996320770384e-02 -1.6785927865260859e-02 -2.7354687079718088e-03 -1.7961087981083784e-02 -9.3083523336520944e-03 -1.3584628167810283e-02 -2.1851540438993872e-02 2.2847299686892105e-03 3.9933294857916315e-04 -8.0188778565469208e-03 7.5944080015232316e-03 1.0219135269409128e-02 2.3627265084830750e-03 -2.2419873306877346e-02 -9.2529943512369567e-03 9.5016610242818784e-03 -1.0696420377750558e-02 -1.1594727386031442e-02 6.5557838000215715e-03 8.6808390913153469e-03 7.4212901623239074e-03 2.1142377536760891e-03 3.2098002243370762e-02 1.3011535848147505e-02 -6.5825898464428843e-03 -2.2335217982913855e-02 -1.4037290692187130e-02 1.2253142626084501e-03 -1.0787302465792471e-02 -1.1026886111212102e-02 -4.8246601316413902e-03 1.7865564797124898e-02 1.5259937260787088e-02 -1.0352473370986787e-02 1.0297518827343350e-02 2.7413628186163747e-02 2.5289955212743865e-03 -2.1405316781205892e-02 -1.4107847014700048e-02 1.1378092343077644e-02 -1.0387702426792083e-02 -3.0121762014637898e-02 1.3574888545538928e-02 1.8081286244077826e-02 1.6309486358645022e-03 1.2299497584112359e-02 1.3011535848147505e-02 5.2705005588162254e-02 -1.4139239078107423e-02 -1.5916141002229572e-02 -1.4131053871067207e-02 -8.7588427586891664e-03 -8.9219517001720167e-03 -3.2858075041300637e-02 -9.4019136635685712e-03 1.5240770990830882e-02 9.4691555315152744e-03 -7.4814784936381466e-03 1.1038603784152465e-03 1.6147232390658645e-03 -7.3345468033992446e-03 1.3215411801457336e-02 5.8576246713981945e-03 -1.5822734914991650e-02 5.6006048618500223e-03 1.2915622377200960e-02 -1.2895408262982503e-02 -8.0361652219218746e-03 3.3920773898513368e-03 -1.1443996320770382e-02 -6.5825898464428843e-03 -1.4139239078107425e-02 3.3289914739135028e-02 3.2515717480408805e-03 -6.9150502290714448e-03 6.4011496582225963e-04 1.1871002117112778e-03 4.8488499147286285e-03 1.1094577070366071e-03 -9.7397939331100043e-03 -7.5746082850661070e-03 1.2457198890149889e-02 -1.8237074917714501e-02 -1.8541081243185088e-02 -1.5065846556214546e-02 3.2478558076897354e-02 5.1725849462731120e-03 1.0339012985410459e-03 9.9557160863804010e-03 1.8645173784134002e-02 -8.4203144528838154e-03 -3.0173710576286688e-02 -4.1550192319324370e-03 -1.6785927865260859e-02 -2.2335217982913855e-02 -1.5916141002229576e-02 3.2515717480408801e-03 5.0877231156407396e-02 4.9069285528000293e-03 1.9162547101578341e-02 1.4021613642325461e-02 1.4581813703506070e-02 1.2296389491272586e-02 -3.6587115485095578e-02 -4.6942595093661110e-03 4.5276792349263567e-03 -7.6255886427372688e-03 -1.3366187709078778e-02 -7.2020216596136088e-03 4.9496637684412533e-03 5.0098245274789359e-03 3.3305377240827621e-04 7.5664584464344153e-03 2.9932749822082203e-03 3.1821729866675546e-03 -3.8092267935830818e-03 -6.5508814790641266e-03 -2.7354687079718088e-03 -1.4037290692187130e-02 -1.4131053871067204e-02 -6.9150502290714448e-03 4.9069285528000293e-03 2.4340299179269380e-02 3.2629172382713932e-03 1.2457869668664460e-02 9.7357380553708302e-03 9.1986336411557790e-03 -4.4088143078326808e-03 -8.0310136851172581e-03 8.7576295815385789e-04 -1.0244067570943902e-02 -1.4422077707696908e-02 -2.1423073852017440e-02 5.7782489127730201e-03 1.0890635018247713e-03 -6.7794356749557409e-03 1.7655620112016512e-03 1.2986876463073385e-02 -1.0705620161877392e-02 -1.7500199588942240e-02 -3.1005424332813825e-03 -1.7961087981083784e-02 1.2253142626084497e-03 -8.7588427586891681e-03 6.4011496582225833e-04 1.9162547101578341e-02 3.2629172382713937e-03 3.6919702769039608e-02 1.0708668766436811e-02 1.0812745352165301e-02 1.8397884204596673e-02 -1.0896073894712128e-02 -1.8701396556673907e-03 9.1151573047580561e-04 -8.7787470781423398e-03 -7.2382509075587962e-03 -5.1615652638079025e-03 7.1768754766795579e-03 8.0130171225349187e-03 2.2840400822566886e-03 7.1581774935001591e-03 9.3765774695094683e-03 1.7773106103995955e-03 -1.7718325711837710e-02 -7.1421108736944268e-03 -9.3083523336520962e-03 -1.0787302465792469e-02 -8.9219517001720167e-03 1.1871002117112774e-03 1.4021613642325462e-02 1.2457869668664462e-02 1.0708668766436811e-02 2.8105951578525374e-02 8.7285621094777988e-03 6.0590439268231721e-03 -1.9178242935258029e-02 -1.5273712888761407e-02 -7.5462460001675460e-03 -8.7922323602931431e-03 -2.9388966660276003e-02 -1.6248922908140749e-02 2.0281634042237050e-02 3.1330657245953108e-03 -9.2124269451833666e-03 9.7140999105096437e-03 2.7278133077043833e-02 9.3275158159388308e-04 -1.7915151758845806e-02 -1.4046149567714234e-02 -1.3584628167810283e-02 -1.1026886111212103e-02 -3.2858075041300637e-02 4.8488499147286267e-03 1.4581813703506070e-02 9.7357380553708302e-03 1.0812745352165299e-02 8.7285621094777988e-03 5.0327935818450215e-02 1.8047020698889703e-02 -1.5571839535379510e-02 -1.4181681406169318e-02 4.4046104737568773e-03 -6.4490222345180382e-03 -1.6781862067634490e-02 -1.7779658285261398e-02 1.3522937357969580e-02 -1.2390864475310954e-03 -1.0766119309587987e-02 1.8541745218110960e-03 3.1264072334119229e-03 -7.5984305346207832e-03 -1.5008420379240727e-02 -7.4461502021895805e-03 -2.1851540438993875e-02 -4.8246601316413911e-03 -9.4019136635685712e-03 1.1094577070366062e-03 1.2296389491272588e-02 9.1986336411557790e-03 1.8397884204596669e-02 6.0590439268231721e-03 1.8047020698889703e-02 3.7949216087196903e-02 -7.4504425524762798e-03 4.4969508074663312e-03 5.3919056963385370e-04 6.3328333051359958e-03 1.9709940544532459e-02 1.2942154347419379e-02 -3.6298932203394862e-02 -5.0851218216770811e-03 1.4691459502318658e-02 -2.2207839602395286e-02 -2.0698078808362060e-02 1.3558402521238267e-02 2.9093269953033931e-02 4.8838038498635267e-03 2.2847299686892097e-03 1.7865564797124901e-02 1.5240770990830885e-02 -9.7397939331100043e-03 -3.6587115485095578e-02 -4.4088143078326817e-03 -1.0896073894712130e-02 -1.9178242935258029e-02 -1.5571839535379512e-02 -7.4504425524762798e-03 6.0980462170848945e-02 5.9293390880244649e-03 -1.5390435959367090e-02 7.8346383211825750e-03 1.3101718654337151e-03 -1.6286197954918956e-03 -5.0177395564441635e-03 -6.9780090624548558e-03 2.5600812177886709e-03 -8.6890901864423858e-03 -1.4484420845054777e-02 6.1802935561731500e-03 4.6508874710199342e-03 3.5517020031137275e-03 3.9933294857916397e-04 1.5259937260787088e-02 9.4691555315152727e-03 -7.5746082850661079e-03 -4.6942595093661093e-03 -8.0310136851172598e-03 -1.8701396556673909e-03 -1.5273712888761407e-02 -1.4181681406169318e-02 4.4969508074663303e-03 5.9293390880244649e-03 2.9344095598733501e-02 -2.5632907937819202e-03 1.7348747683764482e-03 -9.0164721831027857e-03 -1.1821971335940103e-02 1.4222139914336051e-02 2.5104382210234502e-03 -1.3019357637647644e-02 8.8786251937546211e-03 1.0664052549167731e-02 -1.6655850947710833e-02 3.9258362191279487e-03 6.0637726842093669e-04 -8.0188778565469208e-03 -1.0352473370986787e-02 -7.4814784936381457e-03 1.2457198890149890e-02 4.5276792349263567e-03 8.7576295815385789e-04 9.1151573047580409e-04 -7.5462460001675460e-03 4.4046104737568781e-03 5.3919056963385543e-04 -1.5390435959367090e-02 -2.5632907937819197e-03 3.5608152587585956e-02 123 124 125 195 196 197 210 211 212 138 139 140 126 127 128 198 199 200 213 214 215 141 142 143 3.9828823839810880e-02 1.2030179873241200e-02 1.4834499004315894e-02 -3.1210032487703279e-02 -4.1210242078037335e-03 -8.4882114865347177e-03 -2.6132221754299429e-02 -1.3857330363414183e-02 -1.9351563710111133e-03 1.8526625510126106e-02 2.2509682608549426e-03 1.4381693608657539e-02 2.2031239309367574e-02 1.3370158519244923e-02 7.6807175516937897e-03 -2.1671451302592681e-02 2.7841197750141837e-03 -1.5285588188532210e-02 -1.7163878828093452e-02 -1.1385207759638097e-02 -1.3605778893127671e-02 1.5790895713384278e-02 -1.0718640974992275e-03 2.4178247745384766e-03 1.2030179873241200e-02 3.6886208620086347e-02 1.3418456761367520e-02 -6.0857769074362167e-03 -1.8993126734616413e-03 6.0458280751549730e-03 -1.5431721122920527e-02 -1.9449362747446543e-02 -6.4801006997005283e-04 2.8979077860942495e-03 -3.9611407132418173e-03 1.7287753409826094e-03 1.3138760413350697e-02 1.5010060976926210e-02 4.4211454341758346e-03 -7.0909405494393920e-03 -1.0690881352270806e-03 -7.0749049349849262e-03 -1.0327831400129399e-02 -1.6171422720798630e-02 -1.2271483128974209e-02 1.0869421907239390e-02 -9.3459426068368337e-03 -5.6198074777517636e-03 1.4834499004315894e-02 1.3418456761367520e-02 4.2285525146652778e-02 -1.0481377630097594e-02 6.4301545923345351e-03 -4.7320740249424129e-03 -1.3177410104795746e-02 -8.8263440318067515e-03 -4.0591431123646552e-03 1.4422078110247110e-02 1.8973300693565657e-03 1.9504092803476081e-02 8.0809115431153926e-03 4.1680965778427307e-03 -8.9486597278966502e-04 -1.5461720995872636e-02 3.3272282751078998e-03 -2.4364569535259981e-02 -1.2571456821537010e-02 -1.2503771457695960e-02 -2.0959605910260779e-02 1.4354476894624584e-02 -7.9111507865065288e-03 -6.7793593945113910e-03 -3.1210032487703269e-02 -6.0857769074362175e-03 -1.0481377630097592e-02 5.6310879233163219e-02 -1.3540867993089447e-02 -6.9944134306666409e-03 3.3002675032354330e-02 5.3287032111094517e-03 -6.3621558482812243e-03 -3.1010148991327563e-02 1.2346846707449573e-02 -1.4706956959362694e-02 -3.6396087418626169e-02 -1.0215107687230765e-02 6.9654082043565761e-03 2.7268991048822053e-02 -1.1229084098848006e-02 1.0502284487367758e-02 1.7294757513906335e-02 1.1366777128866442e-02 1.4841623513441935e-02 -3.5261033930588923e-02 1.2028509639178959e-02 6.2355876632419101e-03 -4.1210242078037317e-03 -1.8993126734616413e-03 6.4301545923345351e-03 -1.3540867993089447e-02 2.8469874908403241e-02 3.0054125091865855e-03 1.7835696625619472e-03 -3.5988503073436798e-03 -1.5928474865593639e-05 1.1103726800950325e-02 -1.3475982721451093e-02 6.2243011339064413e-03 3.6612844752189808e-03 -1.1012534106035290e-03 -9.2620344412717699e-04 -1.0552600534684389e-02 1.0783693017717335e-02 -3.9118423059005944e-03 -9.4372823094520785e-04 -8.3062774429027552e-03 -8.2413041076801752e-03 1.2609640027791519e-02 -1.0871891370357874e-02 -2.5645899028540337e-03 -8.4882114865347177e-03 6.0458280751549739e-03 -4.7320740249424138e-03 -6.9944134306666409e-03 3.0054125091865855e-03 2.4444105265546794e-02 -6.2770303983640105e-03 -1.1025216144106081e-03 6.6513364207116225e-03 -2.1835070151662410e-03 5.2559113273344311e-04 -3.9287232069435650e-03 7.0851037457021915e-03 2.2445397410832289e-03 -9.2361259159806815e-03 7.5319582654881194e-03 -2.2665005120450364e-03 -3.7912748718904897e-04 2.4858092454457812e-03 -5.7639079053441837e-03 -5.6377484446535073e-03 6.8402910740955163e-03 -2.6884414263584032e-03 -7.1816426065492069e-03 -2.6132221754299429e-02 -1.5431721122920532e-02 -1.3177410104795742e-02 3.3002675032354330e-02 1.7835696625619476e-03 -6.2770303983640105e-03 5.0791871055327058e-02 1.7762822266262315e-02 -6.4308255933506857e-03 -3.2433011254104048e-02 -5.0159924659960893e-04 -8.7768360941392273e-03 -2.9816163963445795e-02 -1.5535222031188265e-02 5.8393653166851200e-03 1.8389354660998631e-02 -5.4950394484693244e-03 1.3194881863052125e-02 2.2742874635736186e-02 1.3984870771325758e-02 9.0958288551458415e-03 -3.6545378412566942e-02 3.4323191490276926e-03 6.5320261557666034e-03 -1.3857330363414185e-02 -1.9449362747446543e-02 -8.8263440318067498e-03 5.3287032111094534e-03 -3.5988503073436798e-03 -1.1025216144106079e-03 1.7762822266262315e-02 3.5086397181803813e-02 -4.3619128640105132e-03 -2.0839048075383167e-03 -2.2503998950380005e-03 -8.1674085258236755e-03 -1.6368935326503596e-02 -1.6309225383030888e-02 3.8703736706897298e-03 6.2968043877553639e-03 -8.4292895928275921e-03 1.1032095396281456e-02 1.3301726876266245e-02 1.6342634555296380e-02 5.4139852269645631e-03 -1.0379886243937280e-02 -1.3919038114134892e-03 2.1417327421158119e-03 -1.9351563710111133e-03 -6.4801006997005283e-04 -4.0591431123646552e-03 -6.3621558482812243e-03 -1.5928474865594018e-05 6.6513364207116234e-03 -6.4308255933506857e-03 -4.3619128640105132e-03 2.5052468345881106e-02 -7.4608173764663379e-03 -7.5266309119284324e-03 -5.0993343703236950e-03 6.3549893277171365e-03 4.0040820904338262e-03 -7.2669185794166941e-03 1.3445228165805899e-03 6.0081092009768317e-03 -5.6415678198507386e-03 7.0620311600048200e-03 3.4744764501854794e-03 -1.6814256662387567e-04 7.4274118848068156e-03 -9.3418542082154561e-04 -9.4686983180130857e-03 1.8526625510126106e-02 2.8979077860942491e-03 1.4422078110247110e-02 -3.1010148991327563e-02 1.1103726800950325e-02 -2.1835070151662406e-03 -3.2433011254104041e-02 -2.0839048075383150e-03 -7.4608173764663362e-03 4.4055072049424361e-02 -9.6191609889624951e-03 1.7086523531965478e-02 1.6859040996146733e-02 6.2620853823263786e-03 1.2371811405685333e-03 -2.0803868392460810e-02 9.4947737908002792e-03 -1.5831327547545845e-02 -2.1764890940952068e-02 -7.5122123039869995e-03 -1.6093241232491496e-02 2.6571181023147289e-02 -1.0543215659683412e-02 8.8231103888887757e-03 2.2509682608549426e-03 -3.9611407132418156e-03 1.8973300693565657e-03 1.2346846707449573e-02 -1.3475982721451093e-02 5.2559113273344322e-04 -5.0159924659960893e-04 -2.2503998950380000e-03 -7.5266309119284315e-03 -9.6191609889624951e-03 3.1464010540728282e-02 -9.4928879061427357e-03 -5.1391597178626382e-03 -9.3048022694536062e-03 5.8859514052439542e-03 8.5847463773592505e-03 -1.0974633052846624e-02 8.8528109760999535e-03 2.2722831246575984e-03 -1.4205093191277168e-03 3.0774818471526375e-03 -1.0194924516896622e-02 9.9234574304305698e-03 -3.2196466125153740e-03 1.4381693608657539e-02 1.7287753409826112e-03 1.9504092803476081e-02 -1.4706956959362692e-02 6.2243011339064413e-03 -3.9287232069435641e-03 -8.7768360941392273e-03 -8.1674085258236738e-03 -5.0993343703236932e-03 1.7086523531965478e-02 -9.4928879061427357e-03 4.2401003527594093e-02 1.2627285179525438e-02 1.0421959514057401e-02 -6.7584777891931238e-03 -1.4686220742023928e-02 9.0912471084650028e-03 -2.1026606621047515e-02 -1.4444132149793024e-02 -7.0908082319079838e-03 -2.4377614212364996e-02 8.5186436251704200e-03 -2.7151784335370534e-03 -7.1434013119730296e-04 2.2031239309367574e-02 1.3138760413350697e-02 8.0809115431153926e-03 -3.6396087418626169e-02 3.6612844752189812e-03 7.0851037457021915e-03 -2.9816163963445795e-02 -1.6368935326503596e-02 6.3549893277171365e-03 1.6859040996146733e-02 -5.1391597178626382e-03 1.2627285179525442e-02 5.3376294123148274e-02 1.7266024198642059e-02 -6.1166554741805814e-03 -3.1369124459287204e-02 -3.3572986291385604e-04 -8.9477701191012695e-03 -2.5680538089719068e-02 -1.5914895115849936e-02 -1.3218001256240954e-02 3.0995339502415641e-02 3.6926509359182977e-03 -5.8658629465373844e-03 1.3370158519244921e-02 1.5010060976926214e-02 4.1680965778427307e-03 -1.0215107687230765e-02 -1.1012534106035286e-03 2.2445397410832289e-03 -1.5535222031188265e-02 -1.6309225383030888e-02 4.0040820904338262e-03 6.2620853823263777e-03 -9.3048022694536062e-03 1.0421959514057402e-02 1.7266024198642059e-02 3.7326122421518594e-02 -4.1279432744430952e-03 -1.2756826781972863e-03 -1.7213742500525506e-03 -8.0043673975116920e-03 -1.2933561900686386e-02 -1.9586225593175154e-02 -8.4556351772271492e-03 3.0613061970893416e-03 -4.3133024921290812e-03 -2.5073207423526912e-04 7.6807175516937897e-03 4.4211454341758329e-03 -8.9486597278966339e-04 6.9654082043565753e-03 -9.2620344412717732e-04 -9.2361259159806815e-03 5.8393653166851200e-03 3.8703736706897293e-03 -7.2669185794166941e-03 1.2371811405685331e-03 5.8859514052439534e-03 -6.7584777891931220e-03 -6.1166554741805840e-03 -4.1279432744430952e-03 2.7741640078416119e-02 -7.7273870997050294e-03 -7.5835838698578885e-03 -4.7683511576631270e-03 -2.0285024060425422e-03 -8.3525285712779894e-04 -4.4213058453654169e-03 -5.8501272333758656e-03 -7.0448706455356069e-04 5.6044051819925944e-03 -2.1671451302592681e-02 -7.0909405494393911e-03 -1.5461720995872636e-02 2.7268991048822057e-02 -1.0552600534684389e-02 7.5319582654881194e-03 1.8389354660998634e-02 6.2968043877553621e-03 1.3445228165805899e-03 -2.0803868392460810e-02 8.5847463773592505e-03 -1.4686220742023928e-02 -3.1369124459287204e-02 -1.2756826781972861e-03 -7.7273870997050277e-03 4.0270616569071299e-02 -9.8158670106957713e-03 1.6902645979994919e-02 1.8437814928269878e-02 3.2967537322532562e-03 1.4463013627336631e-02 -3.0522333052821180e-02 1.0556786275648959e-02 -2.3668118517986515e-03 2.7841197750141829e-03 -1.0690881352270814e-03 3.3272282751079002e-03 -1.1229084098848006e-02 1.0783693017717335e-02 -2.2665005120450364e-03 -5.4950394484693226e-03 -8.4292895928275921e-03 6.0081092009768309e-03 9.4947737908002792e-03 -1.0974633052846626e-02 9.0912471084650028e-03 -3.3572986291385701e-04 -1.7213742500525508e-03 -7.5835838698578885e-03 -9.8158670106957748e-03 2.9116272461742729e-02 -9.9720145144950659e-03 1.7869796489338894e-03 -3.9153482607001081e-03 6.9117923727510212e-04 1.2809847206178606e-02 -1.3790232187806114e-02 7.0433507457314404e-04 -1.5285588188532213e-02 -7.0749049349849271e-03 -2.4364569535259978e-02 1.0502284487367761e-02 -3.9118423059005944e-03 -3.7912748718904946e-04 1.3194881863052128e-02 1.1032095396281459e-02 -5.6415678198507369e-03 -1.5831327547545841e-02 8.8528109760999552e-03 -2.1026606621047512e-02 -8.9477701191012695e-03 -8.0043673975116903e-03 -4.7683511576631261e-03 1.6902645979994923e-02 -9.9720145144950659e-03 4.0180492509762404e-02 1.4328211739694608e-02 3.0606988892313202e-03 2.0350387848628960e-02 -1.4863338214930091e-02 6.0175238912795392e-03 -4.3506577373809436e-03 -1.7163878828093448e-02 -1.0327831400129399e-02 -1.2571456821537009e-02 1.7294757513906335e-02 -9.4372823094520807e-04 2.4858092454457812e-03 2.2742874635736186e-02 1.3301726876266245e-02 7.0620311600048200e-03 -2.1764890940952068e-02 2.2722831246575989e-03 -1.4444132149793024e-02 -2.5680538089719075e-02 -1.2933561900686388e-02 -2.0285024060425422e-03 1.8437814928269878e-02 1.7869796489338886e-03 1.4328211739694608e-02 3.6913466111147611e-02 1.1871072569818815e-02 1.4422959236760211e-02 -3.0779605330295428e-02 -5.0269406879155654e-03 -9.2549200045328271e-03 -1.1385207759638093e-02 -1.6171422720798627e-02 -1.2503771457695961e-02 1.1366777128866440e-02 -8.3062774429027552e-03 -5.7639079053441837e-03 1.3984870771325758e-02 1.6342634555296380e-02 3.4744764501854794e-03 -7.5122123039870030e-03 -1.4205093191277172e-03 -7.0908082319079855e-03 -1.5914895115849936e-02 -1.9586225593175150e-02 -8.3525285712779894e-04 3.2967537322532545e-03 -3.9153482607001073e-03 3.0606988892313185e-03 1.1871072569818814e-02 3.5363249151347018e-02 1.3677008423643718e-02 -5.7071590227892356e-03 -2.3061003699390440e-03 5.9815566890154253e-03 -1.3605778893127671e-02 -1.2271483128974213e-02 -2.0959605910260779e-02 1.4841623513441935e-02 -8.2413041076801752e-03 -5.6377484446535073e-03 9.0958288551458381e-03 5.4139852269645631e-03 -1.6814256662387546e-04 -1.6093241232491499e-02 3.0774818471526371e-03 -2.4377614212364999e-02 -1.3218001256240952e-02 -8.4556351772271509e-03 -4.4213058453654169e-03 1.4463013627336631e-02 6.9117923727510103e-04 2.0350387848628960e-02 1.4422959236760211e-02 1.3677008423643718e-02 4.0494118670243197e-02 -9.9064038508244936e-03 6.1087676788455086e-03 -5.2800895396035649e-03 1.5790895713384278e-02 1.0869421907239392e-02 1.4354476894624582e-02 -3.5261033930588923e-02 1.2609640027791521e-02 6.8402910740955171e-03 -3.6545378412566935e-02 -1.0379886243937281e-02 7.4274118848068156e-03 2.6571181023147289e-02 -1.0194924516896622e-02 8.5186436251704200e-03 3.0995339502415644e-02 3.0613061970893398e-03 -5.8501272333758647e-03 -3.0522333052821184e-02 1.2809847206178605e-02 -1.4863338214930091e-02 -3.0779605330295425e-02 -5.7071590227892356e-03 -9.9064038508244918e-03 5.9750934487325262e-02 -1.3068245554675706e-02 -6.5209541795669098e-03 -1.0718640974992275e-03 -9.3459426068368337e-03 -7.9111507865065305e-03 1.2028509639178959e-02 -1.0871891370357874e-02 -2.6884414263584032e-03 3.4323191490276930e-03 -1.3919038114134899e-03 -9.3418542082154561e-04 -1.0543215659683412e-02 9.9234574304305680e-03 -2.7151784335370539e-03 3.6926509359182977e-03 -4.3133024921290829e-03 -7.0448706455356015e-04 1.0556786275648962e-02 -1.3790232187806114e-02 6.0175238912795383e-03 -5.0269406879155654e-03 -2.3061003699390431e-03 6.1087676788455086e-03 -1.3068245554675707e-02 3.2095915408051859e-02 2.8271515616520547e-03 2.4178247745384775e-03 -5.6198074777517619e-03 -6.7793593945113927e-03 6.2355876632419101e-03 -2.5645899028540345e-03 -7.1816426065492069e-03 6.5320261557666034e-03 2.1417327421158119e-03 -9.4686983180130857e-03 8.8231103888887739e-03 -3.2196466125153740e-03 -7.1434013119730144e-04 -5.8658629465373844e-03 -2.5073207423526912e-04 5.6044051819925935e-03 -2.3668118517986511e-03 7.0433507457314404e-04 -4.3506577373809436e-03 -9.2549200045328288e-03 5.9815566890154253e-03 -5.2800895396035658e-03 -6.5209541795669089e-03 2.8271515616520556e-03 2.8170382545262908e-02 195 196 197 267 268 269 282 283 284 210 211 212 198 199 200 270 271 272 285 286 287 213 214 215 4.5677127707613605e-02 1.3519202931205180e-02 1.6732313069363930e-02 -3.6663999846562295e-02 -4.8026517060453799e-03 -9.9112997555780014e-03 -2.9842726755227939e-02 -1.5402079936611338e-02 -2.1950709926913344e-03 2.1397566767559932e-02 2.5643663519999789e-03 1.6314176011877412e-02 2.5568659720836665e-02 1.5040996202830167e-02 8.8777599701554705e-03 -2.5024977494681116e-02 3.0557579661055654e-03 -1.7154659678665932e-02 -1.9477469595065529e-02 -1.2741595295405191e-02 -1.5378642441018338e-02 1.8365819495526674e-02 -1.2339965140789782e-03 2.7154238165568167e-03 1.3519202931205180e-02 4.1596636198534001e-02 1.4739259467690242e-02 -6.6434641663702231e-03 -3.4388213771476498e-03 6.5009839264765145e-03 -1.7339170239575423e-02 -2.1652776276009297e-02 -7.7186205012017115e-04 3.1882966607538824e-03 -3.9471031027151103e-03 1.9661241489911082e-03 1.4659577526557114e-02 1.7073013661262081e-02 5.0714916837257366e-03 -7.9135492882234267e-03 -1.7048305769020850e-03 -7.7724335127721715e-03 -1.1592781848831260e-02 -1.7865217918338953e-02 -1.3605011735262164e-02 1.2121888424484153e-02 -1.0060900608682973e-02 -6.1285519287290723e-03 1.6732313069363926e-02 1.4739259467690238e-02 4.7568562524702845e-02 -1.1594069846040967e-02 6.8831256422790324e-03 -6.7000363967524021e-03 -1.4718288979435307e-02 -9.6535587769279920e-03 -4.8485574016403120e-03 1.6179103532461318e-02 2.1928299843126274e-03 2.1934856346275143e-02 8.8803440819770797e-03 4.5785023970775955e-03 -2.0949595635522122e-04 -1.7460654108393637e-02 3.6337391645923892e-03 -2.7271643358408718e-02 -1.4092029509465700e-02 -1.3707946649822722e-02 -2.3269275334174288e-02 1.6073281759533282e-02 -8.6659512292011666e-03 -7.2044104236470225e-03 -3.6663999846562302e-02 -6.6434641663702214e-03 -1.1594069846040968e-02 6.4683113666753667e-02 -1.5035367061924080e-02 -7.4587161088666108e-03 3.7815491186503555e-02 5.8793616191842851e-03 -7.0394740043775344e-03 -3.5475791949724327e-02 1.3656245197531820e-02 -1.6685768908259069e-02 -4.1694762433515858e-02 -1.1465829896662040e-02 7.4804184237687275e-03 3.1551884611468434e-02 -1.2529585579257745e-02 1.1607365936417105e-02 1.9894227312544317e-02 1.2745642970077208e-02 1.6799272550222365e-02 -4.0110162547467507e-02 1.3392996917420767e-02 6.8909719571359461e-03 -4.8026517060453817e-03 -3.4388213771476498e-03 6.8831256422790324e-03 -1.5035367061924078e-02 3.2479610863709804e-02 3.1505058329087616e-03 2.1528674277812940e-03 -3.4220729818456412e-03 2.8423692165452635e-05 1.2459048740269457e-02 -1.5129071943844143e-02 6.9409819808181200e-03 3.9456281828682575e-03 -1.8389234215774432e-03 -1.0028190591609460e-03 -1.1768519353133168e-02 1.2327125442416164e-02 -4.2149608995262549e-03 -1.0083106974091175e-03 -8.9064677403013770e-03 -9.0180132287174530e-03 1.4057304467592735e-02 -1.2071378841409715e-02 -2.7672439607666988e-03 -9.9112997555779979e-03 6.5009839264765145e-03 -6.7000363967524056e-03 -7.4587161088666108e-03 3.1505058329087616e-03 2.8003500788096783e-02 -6.7346682775719733e-03 -1.0797690611276914e-03 7.6623846410785413e-03 -2.6774326994269773e-03 6.4519427972986978e-04 -4.8980047932386346e-03 7.6484733489402979e-03 2.4225717597801647e-03 -1.0576183172016057e-02 8.8048711399946276e-03 -2.6285620586329423e-03 3.5055587235402247e-04 2.9684697514508122e-03 -6.1913968771656796e-03 -5.8584213040725761e-03 7.3603026010578216e-03 -2.8195278019689978e-03 -7.9837956354496687e-03 -2.9842726755227943e-02 -1.7339170239575423e-02 -1.4718288979435305e-02 3.7815491186503555e-02 2.1528674277812940e-03 -6.7346682775719724e-03 5.7054475562223442e-02 1.9788320953518769e-02 -7.1249732178873997e-03 -3.6830471463065687e-02 -5.7170128501886157e-04 -1.0141755731379713e-02 -3.3792655287244157e-02 -1.7487375428585767e-02 6.2725110452282592e-03 2.1235136321414896e-02 -6.1115425768683970e-03 1.4749091950235009e-02 2.5673263944789936e-02 1.5681498769406964e-02 1.0481242583405825e-02 -4.1312513509394036e-02 3.8871023793414210e-03 7.2168406274052566e-03 -1.5402079936611334e-02 -2.1652776276009297e-02 -9.6535587769279920e-03 5.8793616191842833e-03 -3.4220729818456399e-03 -1.0797690611276912e-03 1.9788320953518772e-02 3.8694637992086417e-02 -4.7314113950018780e-03 -2.3835591773961914e-03 -2.8258349718321136e-03 -9.0271603900383638e-03 -1.8147195626861175e-02 -1.8063255458643394e-02 4.0525098630510743e-03 7.0941362673315337e-03 -9.0412190262260037e-03 1.2070475555655687e-02 1.4797181471930446e-02 1.7955148733654742e-02 6.0897414377528974e-03 -1.1626165571096332e-02 -1.6446280111847087e-03 2.2791727666362427e-03 -2.1950709926913353e-03 -7.7186205012017071e-04 -4.8485574016403129e-03 -7.0394740043775344e-03 2.8423692165452743e-05 7.6623846410785431e-03 -7.1249732178873988e-03 -4.7314113950018772e-03 2.7756338845906243e-02 -8.2359783449575483e-03 -8.2927284615094549e-03 -5.9043252119145139e-03 7.0523344740136872e-03 4.4000715886005556e-03 -8.0539494723706005e-03 1.5161149561963697e-03 6.5765672962533371e-03 -5.9898334266731091e-03 7.7752089724290891e-03 3.7722891907924633e-03 -1.5035834890889262e-04 8.2518381572746734e-03 -9.8134986118030335e-04 -1.0471699625477348e-02 2.1397566767559932e-02 3.1882966607538824e-03 1.6179103532461318e-02 -3.5475791949724327e-02 1.2459048740269455e-02 -2.6774326994269773e-03 -3.6830471463065687e-02 -2.3835591773961927e-03 -8.2359783449575483e-03 4.9442762644655178e-02 -1.0729995527184222e-02 1.9317775318677309e-02 1.9475749364985237e-02 7.0800422945519201e-03 1.5557734502251077e-03 -2.3740401875475055e-02 1.0659194686549104e-02 -1.7730929145991475e-02 -2.4525833161562042e-02 -8.5065300277529666e-03 -1.8120791706075112e-02 3.0256419672626756e-02 -1.1766497649790974e-02 9.7124795950874129e-03 2.5643663519999789e-03 -3.9471031027151094e-03 2.1928299843126274e-03 1.3656245197531820e-02 -1.5129071943844144e-02 6.4519427972987054e-04 -5.7170128501886353e-04 -2.8258349718321128e-03 -8.2927284615094549e-03 -1.0729995527184224e-02 3.4733581995173721e-02 -1.0467247163500899e-02 -5.6612418430969334e-03 -1.0033733271554475e-02 6.4130126403297667e-03 9.5730455478190320e-03 -1.2152984172807264e-02 9.6275818295380386e-03 2.5562147400413067e-03 -1.6305027077898823e-03 3.3637478287577051e-03 -1.1386933182092118e-02 1.0985648175369268e-02 -3.4823909376576691e-03 1.6314176011877412e-02 1.9661241489911069e-03 2.1934856346275143e-02 -1.6685768908259069e-02 6.9409819808181183e-03 -4.8980047932386328e-03 -1.0141755731379711e-02 -9.0271603900383621e-03 -5.9043252119145104e-03 1.9317775318677309e-02 -1.0467247163500899e-02 4.7183646929643497e-02 1.4301574216635825e-02 1.1537574805208357e-02 -7.1103201392785208e-03 -1.6715463181758351e-02 1.0114373718771240e-02 -2.3416697230290360e-02 -1.6335775749856750e-02 -7.8890525111515869e-03 -2.7140523372255160e-02 9.9452380240633211e-03 -3.1755945890979674e-03 -6.4863252894142506e-04 2.5568659720836658e-02 1.4659577526557114e-02 8.8803440819770797e-03 -4.1694762433515858e-02 3.9456281828682575e-03 7.6484733489402979e-03 -3.3792655287244157e-02 -1.8147195626861175e-02 7.0523344740136881e-03 1.9475749364985237e-02 -5.6612418430969334e-03 1.4301574216635827e-02 6.0607934785126071e-02 1.9346965065626675e-02 -6.5390267796913305e-03 -3.6433965023684192e-02 -4.8505246989110089e-04 -9.9119677685591441e-03 -2.9061082103995519e-02 -1.7690095273454616e-02 -1.4950472760732466e-02 3.5330120977491747e-02 4.0314144382517783e-03 -6.4812588125839152e-03 1.5040996202830167e-02 1.7073013661262081e-02 4.5785023970775929e-03 -1.1465829896662040e-02 -1.8389234215774432e-03 2.4225717597801642e-03 -1.7487375428585767e-02 -1.8063255458643394e-02 4.4000715886005556e-03 7.0800422945519210e-03 -1.0033733271554476e-02 1.1537574805208357e-02 1.9346965065626682e-02 4.1982078755915406e-02 -4.3779938725155235e-03 -1.5228871768367034e-03 -2.8428971415312898e-03 -8.7268339380784099e-03 -1.4587850862920278e-02 -2.1762234949233152e-02 -9.4676588945392225e-03 3.5959398019960193e-03 -4.5140481746377224e-03 -3.6623384553348740e-04 8.8777599701554705e-03 5.0714916837257366e-03 -2.0949595635522052e-04 7.4804184237687275e-03 -1.0028190591609460e-03 -1.0576183172016057e-02 6.2725110452282592e-03 4.0525098630510743e-03 -8.0539494723706005e-03 1.5557734502251077e-03 6.4130126403297676e-03 -7.1103201392785191e-03 -6.5390267796913305e-03 -4.3779938725155218e-03 3.1218995755629395e-02 -8.9669614406420062e-03 -8.3144911607345180e-03 -6.3815953479616980e-03 -2.4160323138442512e-03 -1.0558400215979293e-03 -5.2063781337527600e-03 -6.2644423551999773e-03 -7.8587007309766001e-04 6.3189264661054501e-03 -2.5024977494681116e-02 -7.9135492882234267e-03 -1.7460654108393637e-02 3.1551884611468441e-02 -1.1768519353133168e-02 8.8048711399946276e-03 2.1235136321414900e-02 7.0941362673315345e-03 1.5161149561963693e-03 -2.3740401875475055e-02 9.5730455478190320e-03 -1.6715463181758348e-02 -3.6433965023684185e-02 -1.5228871768367029e-03 -8.9669614406420062e-03 4.6079458728173255e-02 -1.1007460060758020e-02 1.9068094750107203e-02 2.1129833907713960e-02 3.8089512536960538e-03 1.6415940238156523e-02 -3.4796969174930185e-02 1.1736282810104694e-02 -2.6619423536607630e-03 3.0557579661055650e-03 -1.7048305769020852e-03 3.6337391645923883e-03 -1.2529585579257745e-02 1.2327125442416164e-02 -2.6285620586329419e-03 -6.1115425768683970e-03 -9.0412190262260037e-03 6.5765672962533389e-03 1.0659194686549103e-02 -1.2152984172807262e-02 1.0114373718771240e-02 -4.8505246989110018e-04 -2.8428971415312880e-03 -8.3144911607345180e-03 -1.1007460060758019e-02 3.2836815130056096e-02 -1.0937134279526074e-02 2.0126230420179783e-03 -4.0401345268062695e-03 7.1228246138314410e-04 1.4406064992102613e-02 -1.5381875128199340e-02 8.4322485789344037e-04 -1.7154659678665932e-02 -7.7724335127721707e-03 -2.7271643358408718e-02 1.1607365936417102e-02 -4.2149608995262549e-03 3.5055587235402236e-04 1.4749091950235009e-02 1.2070475555655685e-02 -5.9898334266731091e-03 -1.7730929145991475e-02 9.6275818295380386e-03 -2.3416697230290360e-02 -9.9119677685591441e-03 -8.7268339380784099e-03 -6.3815953479616971e-03 1.9068094750107203e-02 -1.0937134279526070e-02 4.5045202625326096e-02 1.6046797231847577e-02 3.3607512837252052e-03 2.2748394248224352e-02 -1.6673793275390342e-02 6.5925539609839731e-03 -5.0843833825706067e-03 -1.9477469595065532e-02 -1.1592781848831262e-02 -1.4092029509465700e-02 1.9894227312544317e-02 -1.0083106974091167e-03 2.9684697514508114e-03 2.5673263944789936e-02 1.4797181471930449e-02 7.7752089724290891e-03 -2.4525833161562038e-02 2.5562147400413058e-03 -1.6335775749856746e-02 -2.9061082103995519e-02 -1.4587850862920278e-02 -2.4160323138442521e-03 2.1129833907713960e-02 2.0126230420179783e-03 1.6046797231847577e-02 4.0953798771233840e-02 1.3279803699744901e-02 1.6233019078763650e-02 -3.4586739075658970e-02 -5.4568795445739801e-03 -1.0179657461324463e-02 -1.2741595295405191e-02 -1.7865217918338953e-02 -1.3707946649822724e-02 1.2745642970077206e-02 -8.9064677403013753e-03 -6.1913968771656796e-03 1.5681498769406957e-02 1.7955148733654742e-02 3.7722891907924650e-03 -8.5065300277529666e-03 -1.6305027077898816e-03 -7.8890525111515869e-03 -1.7690095273454616e-02 -2.1762234949233152e-02 -1.0558400215979293e-03 3.8089512536960521e-03 -4.0401345268062678e-03 3.3607512837252069e-03 1.3279803699744901e-02 3.8790872944126600e-02 1.5143531958872946e-02 -6.5776760963123428e-03 -2.5414638353117068e-03 6.5676636263472766e-03 -1.5378642441018338e-02 -1.3605011735262164e-02 -2.3269275334174288e-02 1.6799272550222365e-02 -9.0180132287174513e-03 -5.8584213040725770e-03 1.0481242583405824e-02 6.0897414377528974e-03 -1.5035834890889197e-04 -1.8120791706075112e-02 3.3637478287577051e-03 -2.7140523372255157e-02 -1.4950472760732464e-02 -9.4676588945392225e-03 -5.2063781337527608e-03 1.6415940238156519e-02 7.1228246138314443e-04 2.2748394248224356e-02 1.6233019078763650e-02 1.5143531958872948e-02 4.4713533514200904e-02 -1.1479567542722438e-02 6.7813801717521369e-03 -5.8369712692616163e-03 1.8365819495526674e-02 1.2121888424484152e-02 1.6073281759533282e-02 -4.0110162547467507e-02 1.4057304467592733e-02 7.3603026010578207e-03 -4.1312513509394036e-02 -1.1626165571096332e-02 8.2518381572746734e-03 3.0256419672626753e-02 -1.1386933182092118e-02 9.9452380240633194e-03 3.5330120977491747e-02 3.5959398019960189e-03 -6.2644423551999773e-03 -3.4796969174930185e-02 1.4406064992102613e-02 -1.6673793275390345e-02 -3.4586739075658970e-02 -6.5776760963123428e-03 -1.1479567542722436e-02 6.6854024161805553e-02 -1.4590422836674725e-02 -7.2128573686162890e-03 -1.2339965140789771e-03 -1.0060900608682973e-02 -8.6659512292011666e-03 1.3392996917420765e-02 -1.2071378841409715e-02 -2.8195278019689982e-03 3.8871023793414206e-03 -1.6446280111847081e-03 -9.8134986118030335e-04 -1.1766497649790974e-02 1.0985648175369270e-02 -3.1755945890979674e-03 4.0314144382517791e-03 -4.5140481746377241e-03 -7.8587007309765958e-04 1.1736282810104696e-02 -1.5381875128199341e-02 6.5925539609839731e-03 -5.4568795445739809e-03 -2.5414638353117086e-03 6.7813801717521377e-03 -1.4590422836674725e-02 3.5228646424056896e-02 3.0543594218099676e-03 2.7154238165568176e-03 -6.1285519287290731e-03 -7.2044104236470216e-03 6.8909719571359470e-03 -2.7672439607666988e-03 -7.9837956354496670e-03 7.2168406274052566e-03 2.2791727666362427e-03 -1.0471699625477348e-02 9.7124795950874129e-03 -3.4823909376576687e-03 -6.4863252894142409e-04 -6.4812588125839152e-03 -3.6623384553348729e-04 6.3189264661054510e-03 -2.6619423536607635e-03 8.4322485789344048e-04 -5.0843833825706085e-03 -1.0179657461324463e-02 6.5676636263472784e-03 -5.8369712692616180e-03 -7.2128573686162881e-03 3.0543594218099676e-03 3.0910966399242228e-02 138 139 140 210 211 212 225 226 227 153 154 155 141 142 143 213 214 215 228 229 230 156 157 158 3.5430852585227685e-02 1.1961606988277633e-02 1.1961606988277636e-02 -2.8765170970072904e-02 -9.3461810307692815e-03 -9.3461810307692780e-03 -2.0367667812815845e-02 -1.3750502079738823e-02 -1.4462489227424187e-03 1.7047803918301643e-02 6.5356031828100172e-03 1.3757801064199110e-02 1.7047803918301643e-02 1.3757801064199110e-02 6.5356031828100189e-03 -2.0367667812815852e-02 -1.4462489227424181e-03 -1.3750502079738819e-02 -1.3074844656546056e-02 -1.0968506563283503e-02 -1.0968506563283497e-02 1.3048890830419694e-02 3.2564273612472674e-03 3.2564273612472683e-03 1.1961606988277633e-02 4.1944493416423985e-02 1.6052137614183521e-02 -1.1501570779583171e-02 -4.9469844665707982e-03 4.4014732253769197e-03 -1.5760860595776614e-02 -2.4428687834847258e-02 -3.7204916474704365e-04 7.1406994200206991e-03 -1.2171358837422832e-03 4.9934312775004692e-03 1.3596424628076873e-02 1.9726105297143581e-02 5.1325217849713042e-03 -1.1104668805318532e-02 -3.4165383671774432e-03 -1.0337025306972166e-02 -9.7726761497128334e-03 -2.0615899397628500e-02 -1.4637930324834620e-02 1.5441045294015947e-02 -7.0453527636012720e-03 -5.2325591054783590e-03 1.1961606988277633e-02 1.6052137614183521e-02 4.1944493416423978e-02 -1.1501570779583166e-02 4.4014732253769189e-03 -4.9469844665707913e-03 -1.1104668805318527e-02 -1.0337025306972163e-02 -3.4165383671774406e-03 1.3596424628076869e-02 5.1325217849712999e-03 1.9726105297143585e-02 7.1406994200206948e-03 4.9934312775004666e-03 -1.2171358837422804e-03 -1.5760860595776617e-02 -3.7204916474704457e-04 -2.4428687834847258e-02 -9.7726761497128316e-03 -1.4637930324834632e-02 -2.0615899397628482e-02 1.5441045294015949e-02 -5.2325591054783616e-03 -7.0453527636012755e-03 -2.8765170970072900e-02 -1.1501570779583168e-02 -1.1501570779583168e-02 6.1232010952183807e-02 -7.5720500860384813e-03 -7.5720500860384943e-03 3.1034624120213409e-02 1.1302347812862283e-02 -6.8318961876335524e-03 -3.4670764719564706e-02 7.4567871135237211e-03 -1.5834721112043749e-02 -3.4670764719564727e-02 -1.5834721112043752e-02 7.4567871135237255e-03 3.1034624120213423e-02 -6.8318961876335490e-03 1.1302347812862282e-02 1.4276992339484887e-02 1.6040907557340656e-02 1.6040907557340642e-02 -3.9471551122893210e-02 6.9401956815722810e-03 6.9401956815722844e-03 -9.3461810307692815e-03 -4.9469844665707974e-03 4.4014732253769189e-03 -7.5720500860384813e-03 2.4720065243080808e-02 1.6898460025016992e-03 7.9046325448174689e-03 -4.4510976923829731e-04 -1.0489975816488555e-03 6.7668455106237816e-03 -9.5030911008784791e-03 3.4509679171690951e-03 -2.3320333469275660e-03 -3.8136336943085060e-03 2.4199821216677834e-04 -6.2675974002506032e-03 7.1459861448741422e-03 -2.0330779691412212e-03 3.5260338938174801e-03 -5.7565765597552294e-03 -5.2893972934320880e-03 7.3203499147272031e-03 -7.4006557972036381e-03 -1.4128125129923212e-03 -9.3461810307692798e-03 4.4014732253769189e-03 -4.9469844665707930e-03 -7.5720500860384926e-03 1.6898460025016992e-03 2.4720065243080812e-02 -6.2675974002506084e-03 -2.0330779691412251e-03 7.1459861448741465e-03 -2.3320333469275612e-03 2.4199821216677416e-04 -3.8136336943084929e-03 6.7668455106237859e-03 3.4509679171690986e-03 -9.5030911008784878e-03 7.9046325448174654e-03 -1.0489975816488505e-03 -4.4510976923830734e-04 3.5260338938174767e-03 -5.2893972934320924e-03 -5.7565765597552328e-03 7.3203499147272101e-03 -1.4128125129923225e-03 -7.4006557972036398e-03 -2.0367667812815848e-02 -1.5760860595776614e-02 -1.1104668805318529e-02 3.1034624120213412e-02 7.9046325448174689e-03 -6.2675974002506076e-03 4.3431658656140106e-02 1.8666156174053976e-02 -6.1270419259528072e-03 -3.0771857121892576e-02 -6.0688904656090292e-03 -6.8323564223209052e-03 -2.3574607304956252e-02 -1.6264554206001498e-02 5.3669602567270802e-03 1.7698539072325783e-02 -1.4932671089785130e-04 1.0897099041201305e-02 1.6903809502184806e-02 1.4028674147829571e-02 7.6428145662167527e-03 -3.4354499111199428e-02 -2.3558308884160310e-03 6.4247906896976893e-03 -1.3750502079738819e-02 -2.4428687834847258e-02 -1.0337025306972164e-02 1.1302347812862285e-02 -4.4510976923829953e-04 -2.0330779691412251e-03 1.8666156174053979e-02 4.0236821862901756e-02 -5.7833072221721580e-03 -7.3642921386726738e-03 -4.8085696541132292e-03 -9.2467072370524608e-03 -1.7209668673244978e-02 -2.1123906623070135e-02 5.0283594393313374e-03 1.0897099041201308e-02 -5.9036312114449548e-03 1.2882289000161534e-02 1.3323360131895867e-02 2.0575376108705225e-02 6.2354102181172103e-03 -1.5864500268356965e-02 -4.1022928788931072e-03 3.2540590777279032e-03 -1.4462489227424183e-03 -3.7204916474704359e-04 -3.4165383671774401e-03 -6.8318961876335524e-03 -1.0489975816488552e-03 7.1459861448741465e-03 -6.1270419259528072e-03 -5.7833072221721588e-03 2.5028187415029123e-02 -5.7612171976417726e-03 -8.5159384091426683e-03 -4.5519304601176324e-03 6.0878122755860450e-03 5.4014981398811408e-03 -7.3381398992023502e-03 -1.4932671089785428e-04 5.8986980384557941e-03 -5.9036312114449565e-03 6.1342211010049497e-03 4.0222394086094080e-03 -1.1085343619222504e-03 8.0936975682774116e-03 3.9785679076438608e-04 -9.8553992600386303e-03 1.7047803918301640e-02 7.1406994200206974e-03 1.3596424628076871e-02 -3.4670764719564706e-02 6.7668455106237816e-03 -2.3320333469275607e-03 -3.0771857121892579e-02 -7.3642921386726738e-03 -5.7612171976417709e-03 4.6471939469005338e-02 -5.6771721354679644e-03 1.8482171289792352e-02 1.6134232979659654e-02 1.0600821653489792e-02 -3.6949700341194124e-05 -2.3574607304956252e-02 6.0878122755860450e-03 -1.7209668673244981e-02 -1.9883241944499846e-02 -1.1325534181106876e-02 -1.6099774119103089e-02 2.9246494723946755e-02 -6.2291804044727981e-03 9.3610471193893933e-03 6.5356031828100172e-03 -1.2171358837422812e-03 5.1325217849713008e-03 7.4567871135237229e-03 -9.5030911008784791e-03 2.4199821216677438e-04 -6.0688904656090292e-03 -4.8085696541132292e-03 -8.5159384091426683e-03 -5.6771721354679644e-03 2.7434016469985514e-02 -5.3272544929742569e-03 -3.6949700341194476e-05 -6.8019654805584299e-03 5.8006962938569493e-03 5.3669602567270802e-03 -7.3381398992023485e-03 5.0283594393313365e-03 -1.6964635704038449e-03 -3.8675584141212192e-03 -6.8604758954738298e-04 -5.8798746812387878e-03 6.1024439626304692e-03 -1.6743352386620575e-03 1.3757801064199113e-02 4.9934312775004692e-03 1.9726105297143581e-02 -1.5834721112043749e-02 3.4509679171690947e-03 -3.8136336943084921e-03 -6.8323564223209060e-03 -9.2467072370524608e-03 -4.5519304601176324e-03 1.8482171289792352e-02 -5.3272544929742561e-03 4.2271537622457916e-02 1.0600821653489793e-02 1.2110988990162370e-02 -6.8019654805584291e-03 -1.6264554206001501e-02 5.4014981398811382e-03 -2.1123906623070135e-02 -1.2725952248616753e-02 -1.0074163835092916e-02 -2.4336303366490640e-02 8.8167899815016510e-03 -1.3087607595934382e-03 -1.3699032950561319e-03 1.7047803918301643e-02 1.3596424628076873e-02 7.1406994200206939e-03 -3.4670764719564720e-02 -2.3320333469275664e-03 6.7668455106237868e-03 -2.3574607304956249e-02 -1.7209668673244978e-02 6.0878122755860450e-03 1.6134232979659650e-02 -3.6949700341194666e-05 1.0600821653489793e-02 4.6471939469005373e-02 1.8482171289792359e-02 -5.6771721354679661e-03 -3.0771857121892593e-02 -5.7612171976417830e-03 -7.3642921386726703e-03 -1.9883241944499849e-02 -1.6099774119103100e-02 -1.1325534181106866e-02 2.9246494723946762e-02 9.3610471193893950e-03 -6.2291804044727981e-03 1.3757801064199113e-02 1.9726105297143581e-02 4.9934312775004631e-03 -1.5834721112043752e-02 -3.8136336943085051e-03 3.4509679171690981e-03 -1.6264554206001498e-02 -2.1123906623070135e-02 5.4014981398811408e-03 1.0600821653489793e-02 -6.8019654805584299e-03 1.2110988990162374e-02 1.8482171289792362e-02 4.2271537622457930e-02 -5.3272544929742561e-03 -6.8323564223209052e-03 -4.5519304601176463e-03 -9.2467072370524574e-03 -1.2725952248616753e-02 -2.4336303366490661e-02 -1.0074163835092903e-02 8.8167899815016493e-03 -1.3699032950561252e-03 -1.3087607595934382e-03 6.5356031828100198e-03 5.1325217849713042e-03 -1.2171358837422817e-03 7.4567871135237237e-03 2.4199821216677823e-04 -9.5030911008784878e-03 5.3669602567270802e-03 5.0283594393313374e-03 -7.3381398992023502e-03 -3.6949700341194612e-05 5.8006962938569493e-03 -6.8019654805584282e-03 -5.6771721354679644e-03 -5.3272544929742569e-03 2.7434016469985528e-02 -6.0688904656090318e-03 -8.5159384091426718e-03 -4.8085696541132362e-03 -1.6964635704038449e-03 -6.8604758954738071e-04 -3.8675584141212261e-03 -5.8798746812387878e-03 -1.6743352386620616e-03 6.1024439626304753e-03 -2.0367667812815852e-02 -1.1104668805318534e-02 -1.5760860595776617e-02 3.1034624120213416e-02 -6.2675974002506024e-03 7.9046325448174654e-03 1.7698539072325787e-02 1.0897099041201308e-02 -1.4932671089785455e-04 -2.3574607304956252e-02 5.3669602567270802e-03 -1.6264554206001505e-02 -3.0771857121892596e-02 -6.8323564223209052e-03 -6.0688904656090309e-03 4.3431658656140126e-02 -6.1270419259528055e-03 1.8666156174053983e-02 1.6903809502184810e-02 7.6428145662167614e-03 1.4028674147829564e-02 -3.4354499111199435e-02 6.4247906896976867e-03 -2.3558308884160297e-03 -1.4462489227424190e-03 -3.4165383671774440e-03 -3.7204916474704489e-04 -6.8318961876335490e-03 7.1459861448741413e-03 -1.0489975816488507e-03 -1.4932671089785070e-04 -5.9036312114449548e-03 5.8986980384557932e-03 6.0878122755860450e-03 -7.3381398992023485e-03 5.4014981398811373e-03 -5.7612171976417813e-03 -4.5519304601176471e-03 -8.5159384091426718e-03 -6.1270419259528046e-03 2.5028187415029133e-02 -5.7833072221721545e-03 6.1342211010049531e-03 -1.1085343619222474e-03 4.0222394086094123e-03 8.0936975682774047e-03 -9.8553992600386303e-03 3.9785679076438532e-04 -1.3750502079738821e-02 -1.0337025306972166e-02 -2.4428687834847258e-02 1.1302347812862282e-02 -2.0330779691412216e-03 -4.4510976923830739e-04 1.0897099041201305e-02 1.2882289000161534e-02 -5.9036312114449574e-03 -1.7209668673244981e-02 5.0283594393313365e-03 -2.1123906623070132e-02 -7.3642921386726720e-03 -9.2467072370524574e-03 -4.8085696541132362e-03 1.8666156174053986e-02 -5.7833072221721545e-03 4.0236821862901770e-02 1.3323360131895869e-02 6.2354102181172225e-03 2.0575376108705218e-02 -1.5864500268356965e-02 3.2540590777279032e-03 -4.1022928788931037e-03 -1.3074844656546056e-02 -9.7726761497128334e-03 -9.7726761497128316e-03 1.4276992339484885e-02 3.5260338938174806e-03 3.5260338938174771e-03 1.6903809502184806e-02 1.3323360131895865e-02 6.1342211010049497e-03 -1.9883241944499846e-02 -1.6964635704038447e-03 -1.2725952248616749e-02 -1.9883241944499849e-02 -1.2725952248616754e-02 -1.6964635704038453e-03 1.6903809502184810e-02 6.1342211010049523e-03 1.3323360131895865e-02 3.2149019202954252e-02 1.1303711547267985e-02 1.1303711547267977e-02 -2.7392302001263004e-02 -1.0092234705252855e-02 -1.0092234705252855e-02 -1.0968506563283503e-02 -2.0615899397628500e-02 -1.4637930324834632e-02 1.6040907557340656e-02 -5.7565765597552311e-03 -5.2893972934320915e-03 1.4028674147829571e-02 2.0575376108705225e-02 4.0222394086094080e-03 -1.1325534181106874e-02 -3.8675584141212192e-03 -1.0074163835092916e-02 -1.6099774119103096e-02 -2.4336303366490657e-02 -6.8604758954738092e-04 7.6428145662167614e-03 -1.1085343619222491e-03 6.2354102181172207e-03 1.1303711547267984e-02 3.9974513453114341e-02 1.6112340994218700e-02 -1.0622292955161500e-02 -4.8650174619017088e-03 4.3175484219616670e-03 -1.0968506563283496e-02 -1.4637930324834627e-02 -2.0615899397628482e-02 1.6040907557340642e-02 -5.2893972934320872e-03 -5.7565765597552328e-03 7.6428145662167518e-03 6.2354102181172086e-03 -1.1085343619222506e-03 -1.6099774119103086e-02 -6.8604758954738288e-04 -2.4336303366490647e-02 -1.1325534181106866e-02 -1.0074163835092903e-02 -3.8675584141212266e-03 1.4028674147829564e-02 4.0222394086094123e-03 2.0575376108705218e-02 1.1303711547267977e-02 1.6112340994218700e-02 3.9974513453114327e-02 -1.0622292955161480e-02 4.3175484219616679e-03 -4.8650174619017132e-03 1.3048890830419695e-02 1.5441045294015947e-02 1.5441045294015947e-02 -3.9471551122893203e-02 7.3203499147272040e-03 7.3203499147272101e-03 -3.4354499111199435e-02 -1.5864500268356965e-02 8.0936975682774082e-03 2.9246494723946748e-02 -5.8798746812387861e-03 8.8167899815016493e-03 2.9246494723946765e-02 8.8167899815016493e-03 -5.8798746812387887e-03 -3.4354499111199435e-02 8.0936975682774064e-03 -1.5864500268356962e-02 -2.7392302001263004e-02 -1.0622292955161499e-02 -1.0622292955161480e-02 6.4030971068241876e-02 -7.3052148537649511e-03 -7.3052148537649554e-03 3.2564273612472679e-03 -7.0453527636012720e-03 -5.2325591054783616e-03 6.9401956815722810e-03 -7.4006557972036372e-03 -1.4128125129923225e-03 -2.3558308884160314e-03 -4.1022928788931063e-03 3.9785679076438668e-04 -6.2291804044727981e-03 6.1024439626304675e-03 -1.3087607595934387e-03 9.3610471193893950e-03 -1.3699032950561254e-03 -1.6743352386620618e-03 6.4247906896976893e-03 -9.8553992600386303e-03 3.2540590777279032e-03 -1.0092234705252855e-02 -4.8650174619017088e-03 4.3175484219616688e-03 -7.3052148537649528e-03 2.8536177494064015e-02 1.6590033262722189e-03 3.2564273612472688e-03 -5.2325591054783582e-03 -7.0453527636012755e-03 6.9401956815722836e-03 -1.4128125129923212e-03 -7.4006557972036398e-03 6.4247906896976884e-03 3.2540590777279028e-03 -9.8553992600386303e-03 9.3610471193893933e-03 -1.6743352386620579e-03 -1.3699032950561343e-03 -6.2291804044727972e-03 -1.3087607595934380e-03 6.1024439626304744e-03 -2.3558308884160297e-03 3.9785679076438565e-04 -4.1022928788931046e-03 -1.0092234705252851e-02 4.3175484219616670e-03 -4.8650174619017114e-03 -7.3052148537649554e-03 1.6590033262722187e-03 2.8536177494064015e-02 210 211 212 282 283 284 297 298 299 225 226 227 213 214 215 285 286 287 300 301 302 228 229 230 3.9557112231917768e-02 1.3252643169864643e-02 1.3252643169864652e-02 -3.1971025268464397e-02 -1.0504150555797738e-02 -1.0504150555797750e-02 -2.2558405709875273e-02 -1.5232600623942419e-02 -1.5826319364338408e-03 1.8823694932829517e-02 7.2961912132505150e-03 1.5320429901890798e-02 1.8823694932829510e-02 1.5320429901890789e-02 7.2961912132505228e-03 -2.2558405709875273e-02 -1.5826319364338434e-03 -1.5232600623942419e-02 -1.4429483890614755e-02 -1.2155317115164262e-02 -1.2155317115164269e-02 1.4312818481252897e-02 3.6054359463323169e-03 3.6054359463323165e-03 1.3252643169864645e-02 4.7021175979423936e-02 1.7956933767445345e-02 -1.2752893384507686e-02 -5.4838837798894683e-03 4.9758300434886854e-03 -1.7559953478663119e-02 -2.7290068662142904e-02 -3.5046785171916447e-04 7.8928457877435257e-03 -1.4832980102593304e-03 5.5488689452666560e-03 1.5084964751001845e-02 2.2063416578164585e-02 5.7516123702002729e-03 -1.2334848726301863e-02 -3.7018459684216589e-03 -1.1522772158683607e-02 -1.0811298592944725e-02 -2.3070916338292970e-02 -1.6403333798968155e-02 1.7228540473807376e-02 -8.0545797985821840e-03 -5.9566713170300292e-03 1.3252643169864650e-02 1.7956933767445345e-02 4.7021175979423943e-02 -1.2752893384507686e-02 4.9758300434886949e-03 -5.4838837798894743e-03 -1.2334848726301868e-02 -1.1522772158683610e-02 -3.7018459684216498e-03 1.5084964751001852e-02 5.7516123702002694e-03 2.2063416578164598e-02 7.8928457877435274e-03 5.5488689452666560e-03 -1.4832980102593310e-03 -1.7559953478663126e-02 -3.5046785171917097e-04 -2.7290068662142911e-02 -1.0811298592944728e-02 -1.6403333798968158e-02 -2.3070916338292977e-02 1.7228540473807376e-02 -5.9566713170300213e-03 -8.0545797985821892e-03 -3.1971025268464397e-02 -1.2752893384507687e-02 -1.2752893384507687e-02 6.8564498974620802e-02 -8.5545850053408579e-03 -8.5545850053408475e-03 3.4462478746066401e-02 1.2524461116655608e-02 -7.7537310641018374e-03 -3.8570363916705125e-02 8.4032438253142921e-03 -1.7704418939075608e-02 -3.8570363916705132e-02 -1.7704418939075598e-02 8.4032438253142886e-03 3.4462478746066408e-02 -7.7537310641018278e-03 1.2524461116655608e-02 1.5609970787996473e-02 1.7948186201007320e-02 1.7948186201007327e-02 -4.3987674152875411e-02 7.8897372500487360e-03 7.8897372500487464e-03 -1.0504150555797741e-02 -5.4838837798894683e-03 4.9758300434886941e-03 -8.5545850053408562e-03 2.7900731374667320e-02 1.9373602895342234e-03 8.8655802446764801e-03 -6.2709075202833150e-04 -1.1853548255846222e-03 7.6403335116362334e-03 -1.0660173764888160e-02 3.9225921803953765e-03 -2.5873557393836415e-03 -4.1827534751868760e-03 2.4270762823918441e-04 -7.0783294226640821e-03 7.9924629205182490e-03 -2.2647571891333939e-03 3.9462655105214099e-03 -6.6249639658041799e-03 -5.9957150338103161e-03 8.2722414563521987e-03 -8.3143285573885478e-03 -1.6326630931291436e-03 -1.0504150555797750e-02 4.9758300434886854e-03 -5.4838837798894761e-03 -8.5545850053408458e-03 1.9373602895342234e-03 2.7900731374667309e-02 -7.0783294226640725e-03 -2.2647571891333865e-03 7.9924629205182490e-03 -2.5873557393836510e-03 2.4270762823918723e-04 -4.1827534751868794e-03 7.6403335116362230e-03 3.9225921803953670e-03 -1.0660173764888158e-02 8.8655802446764922e-03 -1.1853548255846280e-03 -6.2709075202832065e-04 3.9462655105214160e-03 -5.9957150338103091e-03 -6.6249639658041730e-03 8.2722414563521883e-03 -1.6326630931291380e-03 -8.3143285573885461e-03 -2.2558405709875273e-02 -1.7559953478663123e-02 -1.2334848726301868e-02 3.4462478746066401e-02 8.8655802446764801e-03 -7.0783294226640725e-03 4.8290920345691754e-02 2.0774638239748795e-02 -6.9439909564110499e-03 -3.3962715879070779e-02 -6.7341879274427294e-03 -7.6132332292318449e-03 -2.6155281486093473e-02 -1.8175639222138593e-02 6.0449490048945006e-03 1.9511978158916827e-02 -2.5143067265769346e-04 1.2098561377286144e-02 1.8507505023239283e-02 1.5622273497049120e-02 8.5558551797769167e-03 -3.8096479198874746e-02 -2.5412806805722599e-03 7.2710367726512744e-03 -1.5232600623942421e-02 -2.7290068662142904e-02 -1.1522772158683610e-02 1.2524461116655608e-02 -6.2709075202833106e-04 -2.2647571891333865e-03 2.0774638239748799e-02 4.4926162160021224e-02 -6.5786780200967109e-03 -8.1187287913929811e-03 -5.0765061191760039e-03 -1.0385882217812083e-02 -1.9125991303935667e-02 -2.3646630541516157e-02 5.6843943200965480e-03 1.2098561377286146e-02 -6.8036575505818868e-03 1.4421591605433525e-02 1.4765023590792412e-02 2.2872772603709794e-02 6.9593298425026928e-03 -1.7685363605211897e-02 -4.3549811382857457e-03 3.6867738176930235e-03 -1.5826319364338408e-03 -3.5046785171916403e-04 -3.7018459684216480e-03 -7.7537310641018365e-03 -1.1853548255846222e-03 7.9924629205182472e-03 -6.9439909564110508e-03 -6.5786780200967091e-03 2.8011654657441612e-02 -6.3351646748197885e-03 -9.5730439866951560e-03 -4.7516970137536823e-03 6.8888287771533760e-03 6.1680850903282868e-03 -8.2463101264015157e-03 -2.5143067265770089e-04 6.6591281260617420e-03 -6.8036575505818937e-03 6.7885098666965191e-03 4.4250603634629470e-03 -1.5332543246256380e-03 9.1896106605743218e-03 4.3527110424267790e-04 -1.0967352594175481e-02 1.8823694932829517e-02 7.8928457877435257e-03 1.5084964751001852e-02 -3.8570363916705132e-02 7.6403335116362334e-03 -2.5873557393836510e-03 -3.3962715879070772e-02 -8.1187287913929793e-03 -6.3351646748197894e-03 5.1637635175506076e-02 -6.4075290537062056e-03 2.0606200237225734e-02 1.7768782102913137e-02 1.1810878008564221e-02 -8.9572585721048813e-05 -2.6155281486093470e-02 6.8888287771533708e-03 -1.9125991303935670e-02 -2.1890281659709611e-02 -1.2633311071156327e-02 -1.7902533649716779e-02 3.2348530730330262e-02 -7.0733171688418302e-03 1.0349452965349355e-02 7.2961912132505132e-03 -1.4832980102593299e-03 5.7516123702002694e-03 8.4032438253142938e-03 -1.0660173764888160e-02 2.4270762823918750e-04 -6.7341879274427294e-03 -5.0765061191760039e-03 -9.5730439866951560e-03 -6.4075290537062056e-03 3.0638168791694866e-02 -6.0550745787161676e-03 -8.9572585721053990e-05 -7.7726019982998348e-03 6.5522438797557606e-03 6.0449490048945041e-03 -8.2463101264015209e-03 5.6843943200965558e-03 -1.8645354225151046e-03 -4.1237001136910940e-03 -7.1780869723425580e-04 -6.6485590540742174e-03 6.7244213410210746e-03 -1.8850309356461948e-03 1.5320429901890796e-02 5.5488689452666568e-03 2.2063416578164598e-02 -1.7704418939075605e-02 3.9225921803953756e-03 -4.1827534751868794e-03 -7.6132332292318493e-03 -1.0385882217812082e-02 -4.7516970137536840e-03 2.0606200237225734e-02 -6.0550745787161667e-03 4.7285794653807035e-02 1.1810878008564230e-02 1.3627229761087937e-02 -7.7726019982998322e-03 -1.8175639222138606e-02 6.1680850903282798e-03 -2.3646630541516167e-02 -1.4152253547580200e-02 -1.1306280553481209e-02 -2.7177988520230772e-02 9.9080367903454977e-03 -1.5195386270687884e-03 -1.8175396829842889e-03 1.8823694932829513e-02 1.5084964751001847e-02 7.8928457877435292e-03 -3.8570363916705132e-02 -2.5873557393836406e-03 7.6403335116362230e-03 -2.6155281486093467e-02 -1.9125991303935667e-02 6.8888287771533769e-03 1.7768782102913137e-02 -8.9572585721054261e-05 1.1810878008564228e-02 5.1637635175506069e-02 2.0606200237225723e-02 -6.4075290537062013e-03 -3.3962715879070779e-02 -6.3351646748197980e-03 -8.1187287913929759e-03 -2.1890281659709604e-02 -1.7902533649716772e-02 -1.2633311071156332e-02 3.2348530730330262e-02 1.0349452965349362e-02 -7.0733171688418355e-03 1.5320429901890789e-02 2.2063416578164585e-02 5.5488689452666586e-03 -1.7704418939075598e-02 -4.1827534751868760e-03 3.9225921803953670e-03 -1.8175639222138596e-02 -2.3646630541516157e-02 6.1680850903282868e-03 1.1810878008564219e-02 -7.7726019982998339e-03 1.3627229761087939e-02 2.0606200237225727e-02 4.7285794653807015e-02 -6.0550745787161606e-03 -7.6132332292318363e-03 -4.7516970137536927e-03 -1.0385882217812080e-02 -1.4152253547580193e-02 -2.7177988520230765e-02 -1.1306280553481207e-02 9.9080367903454803e-03 -1.8175396829842817e-03 -1.5195386270687944e-03 7.2961912132505236e-03 5.7516123702002720e-03 -1.4832980102593314e-03 8.4032438253142886e-03 2.4270762823918414e-04 -1.0660173764888160e-02 6.0449490048945006e-03 5.6843943200965480e-03 -8.2463101264015175e-03 -8.9572585721049084e-05 6.5522438797557606e-03 -7.7726019982998313e-03 -6.4075290537062013e-03 -6.0550745787161589e-03 3.0638168791694870e-02 -6.7341879274427380e-03 -9.5730439866951490e-03 -5.0765061191760169e-03 -1.8645354225151089e-03 -7.1780869723426231e-04 -4.1237001136910914e-03 -6.6485590540742096e-03 -1.8850309356461944e-03 6.7244213410210755e-03 -2.2558405709875273e-02 -1.2334848726301865e-02 -1.7559953478663126e-02 3.4462478746066408e-02 -7.0783294226640829e-03 8.8655802446764922e-03 1.9511978158916827e-02 1.2098561377286144e-02 -2.5143067265770137e-04 -2.6155281486093473e-02 6.0449490048945041e-03 -1.8175639222138606e-02 -3.3962715879070779e-02 -7.6132332292318371e-03 -6.7341879274427363e-03 4.8290920345691768e-02 -6.9439909564110456e-03 2.0774638239748802e-02 1.8507505023239283e-02 8.5558551797769097e-03 1.5622273497049127e-02 -3.8096479198874766e-02 7.2710367726512674e-03 -2.5412806805722547e-03 -1.5826319364338432e-03 -3.7018459684216580e-03 -3.5046785171917113e-04 -7.7537310641018270e-03 7.9924629205182490e-03 -1.1853548255846284e-03 -2.5143067265769368e-04 -6.8036575505818868e-03 6.6591281260617420e-03 6.8888287771533708e-03 -8.2463101264015209e-03 6.1680850903282798e-03 -6.3351646748197980e-03 -4.7516970137536901e-03 -9.5730439866951490e-03 -6.9439909564110464e-03 2.8011654657441619e-02 -6.5786780200967048e-03 6.7885098666965208e-03 -1.5332543246256249e-03 4.4250603634629531e-03 9.1896106605743131e-03 -1.0967352594175488e-02 4.3527110424267969e-04 -1.5232600623942423e-02 -1.1522772158683607e-02 -2.7290068662142911e-02 1.2524461116655608e-02 -2.2647571891333948e-03 -6.2709075202832011e-04 1.2098561377286144e-02 1.4421591605433527e-02 -6.8036575505818937e-03 -1.9125991303935670e-02 5.6843943200965558e-03 -2.3646630541516167e-02 -8.1187287913929776e-03 -1.0385882217812080e-02 -5.0765061191760151e-03 2.0774638239748802e-02 -6.5786780200967039e-03 4.4926162160021245e-02 1.4765023590792412e-02 6.9593298425026850e-03 2.2872772603709804e-02 -1.7685363605211897e-02 3.6867738176930192e-03 -4.3549811382857483e-03 -1.4429483890614759e-02 -1.0811298592944728e-02 -1.0811298592944728e-02 1.5609970787996473e-02 3.9462655105214090e-03 3.9462655105214160e-03 1.8507505023239279e-02 1.4765023590792412e-02 6.7885098666965182e-03 -2.1890281659709611e-02 -1.8645354225151043e-03 -1.4152253547580200e-02 -2.1890281659709604e-02 -1.4152253547580197e-02 -1.8645354225151085e-03 1.8507505023239283e-02 6.7885098666965217e-03 1.4765023590792412e-02 3.5481543099066051e-02 1.2500968824423270e-02 1.2500968824423276e-02 -2.9896476723507120e-02 -1.1172680229393592e-02 -1.1172680229393588e-02 -1.2155317115164264e-02 -2.3070916338292970e-02 -1.6403333798968155e-02 1.7948186201007320e-02 -6.6249639658041790e-03 -5.9957150338103100e-03 1.5622273497049123e-02 2.2872772603709794e-02 4.4250603634629453e-03 -1.2633311071156327e-02 -4.1237001136910931e-03 -1.1306280553481205e-02 -1.7902533649716772e-02 -2.7177988520230761e-02 -7.1780869723426263e-04 8.5558551797769132e-03 -1.5332543246256241e-03 6.9593298425026850e-03 1.2500968824423269e-02 4.4548107845652198e-02 1.8084560649226589e-02 -1.1936121866219257e-02 -4.8900571867173696e-03 4.9541872283017097e-03 -1.2155317115164269e-02 -1.6403333798968155e-02 -2.3070916338292977e-02 1.7948186201007327e-02 -5.9957150338103161e-03 -6.6249639658041730e-03 8.5558551797769149e-03 6.9593298425026911e-03 -1.5332543246256397e-03 -1.7902533649716775e-02 -7.1780869723425526e-04 -2.7177988520230772e-02 -1.2633311071156332e-02 -1.1306280553481205e-02 -4.1237001136910922e-03 1.5622273497049127e-02 4.4250603634629531e-03 2.2872772603709804e-02 1.2500968824423276e-02 1.8084560649226589e-02 4.4548107845652211e-02 -1.1936121866219264e-02 4.9541872283016966e-03 -4.8900571867173670e-03 1.4312818481252895e-02 1.7228540473807376e-02 1.7228540473807379e-02 -4.3987674152875411e-02 8.2722414563522004e-03 8.2722414563521866e-03 -3.8096479198874746e-02 -1.7685363605211894e-02 9.1896106605743218e-03 3.2348530730330255e-02 -6.6485590540742165e-03 9.9080367903454942e-03 3.2348530730330255e-02 9.9080367903454838e-03 -6.6485590540742105e-03 -3.8096479198874759e-02 9.1896106605743148e-03 -1.7685363605211897e-02 -2.9896476723507117e-02 -1.1936121866219255e-02 -1.1936121866219262e-02 7.1067229332218609e-02 -8.3283848555740000e-03 -8.3283848555740069e-03 3.6054359463323182e-03 -8.0545797985821840e-03 -5.9566713170300222e-03 7.8897372500487360e-03 -8.3143285573885478e-03 -1.6326630931291380e-03 -2.5412806805722595e-03 -4.3549811382857457e-03 4.3527110424267806e-04 -7.0733171688418311e-03 6.7244213410210746e-03 -1.5195386270687884e-03 1.0349452965349362e-02 -1.8175396829842793e-03 -1.8850309356461944e-03 7.2710367726512657e-03 -1.0967352594175486e-02 3.6867738176930183e-03 -1.1172680229393592e-02 -4.8900571867173713e-03 4.9541872283016975e-03 -8.3283848555740000e-03 3.1674417617112538e-02 1.9176718226367477e-03 3.6054359463323152e-03 -5.9566713170300283e-03 -8.0545797985821909e-03 7.8897372500487464e-03 -1.6326630931291436e-03 -8.3143285573885461e-03 7.2710367726512744e-03 3.6867738176930235e-03 -1.0967352594175481e-02 1.0349452965349356e-02 -1.8850309356461951e-03 -1.8175396829842895e-03 -7.0733171688418355e-03 -1.5195386270687940e-03 6.7244213410210764e-03 -2.5412806805722552e-03 4.3527110424267985e-04 -4.3549811382857500e-03 -1.1172680229393590e-02 4.9541872283017088e-03 -4.8900571867173670e-03 -8.3283848555740069e-03 1.9176718226367479e-03 3.1674417617112545e-02 153 154 155 225 226 227 240 241 242 168 169 170 156 157 158 228 229 230 243 244 245 171 172 173 2.9889901343064122e-02 9.3030703569347891e-03 8.0572466679425161e-03 -2.2185340748580570e-02 -1.2623387731540921e-02 -9.4770271678715785e-03 -1.3674415279305846e-02 -1.0973097695596398e-02 -9.7438395504606664e-04 1.2927910847658847e-02 9.1393787435406857e-03 1.1915203619181244e-02 1.0765496803300145e-02 1.1652483940934098e-02 5.0609873708104313e-03 -1.6332407445251131e-02 -4.2977701770307124e-03 -1.0956360164892560e-02 -8.8179025969696411e-03 -8.2730124491014311e-03 -7.4624780210891580e-03 7.4267570760840600e-03 6.0723350118598862e-03 3.8368116509651610e-03 9.3030703569347891e-03 4.5309326791694839e-02 1.7771624004310670e-02 -1.4998345225815227e-02 -8.4161019490238374e-03 3.1357900132048186e-03 -1.3384345161011167e-02 -2.7838788178212635e-02 4.4956295366228242e-04 9.7285518992880991e-03 2.4643423790750496e-03 7.7411383635894318e-03 1.1548667623530113e-02 2.2990346496368559e-02 5.2186029183570746e-03 -1.3409750912839243e-02 -6.6755304715568767e-03 -1.2869033359456683e-02 -6.9140427509124264e-03 -2.3919535731416697e-02 -1.6212413694244653e-02 1.8126194170825064e-02 -3.9140593369284037e-03 -5.2352711994229726e-03 8.0572466679425178e-03 1.7771624004310673e-02 4.0731069686696930e-02 -1.1766476883636483e-02 2.6660990605749607e-03 -3.4551022715648117e-03 -8.5066965705394310e-03 -1.1061602288901722e-02 -1.7983427308650908e-03 1.1559209805047200e-02 7.7674869390980533e-03 1.9449463954514822e-02 5.8571068690504366e-03 5.2651212491851970e-03 -2.7092797213604395e-03 -1.4705461336033149e-02 -3.7231660585919485e-03 -2.3882795968436617e-02 -6.1234164892235857e-03 -1.5898240887651412e-02 -2.0068810167618488e-02 1.5628487937392493e-02 -2.7873220180238069e-03 -8.2662027813663261e-03 -2.2185340748580574e-02 -1.4998345225815227e-02 -1.1766476883636483e-02 6.1286914220917484e-02 -7.9100227081302951e-04 -8.7439980355774900e-03 2.5461624679396163e-02 1.5296057920184051e-02 -7.5855572350086581e-03 -3.4353911455265541e-02 1.8010447213731629e-03 -1.5756122468624217e-02 -2.9362460638713884e-02 -1.9518770910345585e-02 8.2501649781997304e-03 3.0800632494485704e-02 -1.6460224614654891e-03 1.1129304451728141e-02 8.2629753891039180e-03 1.8687839576684094e-02 1.6300506413628131e-02 -3.9910433941343276e-02 1.1691986501980291e-03 8.1721787792908840e-03 -1.2623387731540921e-02 -8.4161019490238357e-03 2.6660990605749607e-03 -7.9100227081302995e-04 2.2725906580490188e-02 3.7855366744701357e-04 1.2072753265037416e-02 3.8472267206351744e-03 -2.4653231058250186e-03 1.6376780146713315e-03 -7.2226068197668624e-03 6.4355922375780507e-04 -6.7515860688907772e-03 -7.6119367951983834e-03 1.6314734973424468e-03 -1.1942027700812020e-03 4.9496811684754932e-03 -9.7332777503748906e-05 6.3473084190152664e-03 -2.3529024532606101e-03 -2.5461456193294246e-03 1.3024391426019169e-03 -5.9192664523511681e-03 -2.1088394646403487e-04 -9.4770271678715785e-03 3.1357900132048186e-03 -3.4551022715648117e-03 -8.7439980355774917e-03 3.7855366744701346e-04 2.4689363122060815e-02 -6.5533178451962163e-03 -3.2944294822930872e-03 7.6214640086024535e-03 -1.8633308206989058e-03 -1.0499680651072860e-04 -2.6067685165970340e-03 6.6455080575729625e-03 5.0162675236061095e-03 -9.7562339854360032e-03 7.4422277828134669e-03 1.7859837221641299e-04 -1.7692224547741374e-03 4.2962885974402809e-03 -5.1279711735449495e-03 -6.8754629166524256e-03 8.2536494315174850e-03 -1.8181211412559092e-04 -7.8480369856388649e-03 -1.3674415279305845e-02 -1.3384345161011167e-02 -8.5066965705394310e-03 2.5461624679396163e-02 1.2072753265037416e-02 -6.5533178451962154e-03 3.4514185378991528e-02 1.6541659638253069e-02 -5.7335323480519670e-03 -2.5090406588102576e-02 -9.7003045604621869e-03 -4.2356664621932332e-03 -1.6422725241729427e-02 -1.4366935998106877e-02 4.8592138020011081e-03 1.3961813552097316e-02 3.7537007089516322e-03 7.7634446737991705e-03 1.0012193689197217e-02 1.1519977089686903e-02 5.8968011123701628e-03 -2.8762270190544382e-02 -6.4365049823487813e-03 6.5097536378104313e-03 -1.0973097695596396e-02 -2.7838788178212639e-02 -1.1061602288901722e-02 1.5296057920184051e-02 3.8472267206351753e-03 -3.2944294822930863e-03 1.6541659638253069e-02 4.3607510185199129e-02 -7.6455360346921811e-03 -1.0738249552112051e-02 -7.7227519126044928e-03 -9.6771727274570403e-03 -1.5375842895269484e-02 -2.4868673839713390e-02 6.5546239853446547e-03 1.3707877652587708e-02 -2.3438571441582296e-03 1.3958321438165579e-02 1.0796922894381391e-02 2.3097936189837364e-02 6.3775349175818462e-03 -1.9255327962428289e-02 -7.7786020209829202e-03 4.7882601922519790e-03 -9.7438395504606621e-04 4.4956295366228220e-04 -1.7983427308650910e-03 -7.5855572350086581e-03 -2.4653231058250186e-03 7.6214640086024535e-03 -5.7335323480519670e-03 -7.6455360346921802e-03 2.4661339223169688e-02 -3.4057563512704431e-03 -8.9129736583114065e-03 -2.4867827582279027e-03 5.6852368613349320e-03 7.1791667064455660e-03 -7.5648495252748967e-03 -1.9587621474215942e-03 5.3958519502974095e-03 -6.9166303731482675e-03 5.0148786367463947e-03 4.0110795588923047e-03 -3.2256504174321778e-03 8.9578765387174023e-03 1.9881716295310405e-03 -1.0290547426823813e-02 1.2927910847658848e-02 9.7285518992880991e-03 1.1559209805047200e-02 -3.4353911455265541e-02 1.6376780146713302e-03 -1.8633308206989058e-03 -2.5090406588102573e-02 -1.0738249552112054e-02 -3.4057563512704418e-03 4.4936826097766884e-02 -1.1666830285078273e-03 1.8234473945339620e-02 1.2538059501403654e-02 1.3243635348909658e-02 -1.6602522345210450e-03 -2.3411419223347493e-02 1.9599675124470405e-03 -1.7110242726975419e-02 -1.5484087425487189e-02 -1.3285990733557233e-02 -1.4784284589435211e-02 2.7937028245373422e-02 -1.3789094611390204e-03 9.0301829725141728e-03 9.1393787435406840e-03 2.4643423790750487e-03 7.7674869390980516e-03 1.8010447213731629e-03 -7.2226068197668606e-03 -1.0499680651072861e-04 -9.7003045604621887e-03 -7.7227519126044945e-03 -8.9129736583114065e-03 -1.1666830285078276e-03 2.4725263855849888e-02 -1.2568467142645334e-03 3.6663667601156964e-03 -3.3373399210341321e-03 5.4324968792434794e-03 1.4145872433982873e-03 -5.4043584240658377e-03 1.2501243742579651e-03 -4.1263666067662807e-03 -7.0780203283166872e-03 -4.0255398186475836e-03 -1.0280232726915342e-03 3.5754711708630795e-03 -1.4975119486524086e-04 1.1915203619181244e-02 7.7411383635894327e-03 1.9449463954514822e-02 -1.5756122468624213e-02 6.4355922375780507e-04 -2.6067685165970323e-03 -4.2356664621932324e-03 -9.6771727274570420e-03 -2.4867827582279031e-03 1.8234473945339620e-02 -1.2568467142645332e-03 4.1027767469353958e-02 7.7965989294550521e-03 1.3119362551360293e-02 -7.5656544235175524e-03 -1.6367281645019865e-02 1.6871176533978442e-03 -2.0709118419527644e-02 -9.8379472287659139e-03 -1.2278630561487924e-02 -2.3751688235059708e-02 8.2507413106273110e-03 2.1472211104120432e-05 -3.3572190709389728e-03 1.0765496803300145e-02 1.1548667623530113e-02 5.8571068690504383e-03 -2.9362460638713884e-02 -6.7515860688907772e-03 6.6455080575729634e-03 -1.6422725241729427e-02 -1.5375842895269484e-02 5.6852368613349320e-03 1.2538059501403654e-02 3.6663667601156968e-03 7.7965989294550512e-03 3.7691078038908470e-02 1.6785995737772400e-02 -5.2692865225842508e-03 -2.5979716711501216e-02 -9.5151118816622221e-03 -5.0096908108376000e-03 -1.3232491800290324e-02 -1.3599112491106305e-02 -8.8761628712652231e-03 2.4002760048622576e-02 1.3240623215510575e-02 -6.8293105127263352e-03 1.1652483940934098e-02 2.2990346496368559e-02 5.2651212491851961e-03 -1.9518770910345585e-02 -7.6119367951983817e-03 5.0162675236061095e-03 -1.4366935998106876e-02 -2.4868673839713386e-02 7.1791667064455660e-03 1.3243635348909658e-02 -3.3373399210341317e-03 1.3119362551360293e-02 1.6785995737772397e-02 4.5641269099317802e-02 -6.9555028649454231e-03 -1.0616150686669164e-02 -7.8325207444143695e-03 -9.9227817987017769e-03 -9.9010794108225983e-03 -2.7544767930345316e-02 -1.0973902634909974e-02 1.2720821978328073e-02 2.5636236350192183e-03 -2.7277307320400239e-03 5.0609873708104304e-03 5.2186029183570737e-03 -2.7092797213604382e-03 8.2501649781997321e-03 1.6314734973424466e-03 -9.7562339854360032e-03 4.8592138020011081e-03 6.5546239853446547e-03 -7.5648495252748967e-03 -1.6602522345210450e-03 5.4324968792434803e-03 -7.5656544235175524e-03 -5.2692865225842525e-03 -6.9555028649454231e-03 2.6704624405859641e-02 -3.7453736435139988e-03 -8.9088867575337610e-03 -3.2968646284807800e-03 -1.3271775956210823e-03 -5.2098568629562695e-05 -2.3763963909746340e-03 -6.1682761547708883e-03 -2.9207090891789061e-03 6.5646542691846803e-03 -1.6332407445251131e-02 -1.3409750912839243e-02 -1.4705461336033145e-02 3.0800632494485704e-02 -1.1942027700812023e-03 7.4422277828134634e-03 1.3961813552097316e-02 1.3707877652587708e-02 -1.9587621474215942e-03 -2.3411419223347489e-02 1.4145872433982871e-03 -1.6367281645019865e-02 -2.5979716711501216e-02 -1.0616150686669162e-02 -3.7453736435139988e-03 4.2709787758996892e-02 -1.5860416793417212e-03 1.8722518821389013e-02 1.2507532500209929e-02 1.0206485588674430e-02 1.2321816169539385e-02 -3.4256222925690007e-02 1.4771955642709077e-03 -1.7096840017532225e-03 -4.2977701770307124e-03 -6.6755304715568750e-03 -3.7231660585919472e-03 -1.6460224614654895e-03 4.9496811684754932e-03 1.7859837221641310e-04 3.7537007089516318e-03 -2.3438571441582296e-03 5.3958519502974095e-03 1.9599675124470405e-03 -5.4043584240658377e-03 1.6871176533978442e-03 -9.5151118816622221e-03 -7.8325207444143695e-03 -8.9088867575337627e-03 -1.5860416793417203e-03 2.2316161861432971e-02 -1.5781094134485166e-03 8.7917385573066508e-03 2.5459131605239885e-03 6.8486516229724513e-03 2.5395394207948182e-03 -7.5554894062371449e-03 9.9942630690103847e-05 -1.0956360164892560e-02 -1.2869033359456683e-02 -2.3882795968436617e-02 1.1129304451728144e-02 -9.7332777503748893e-05 -1.7692224547741372e-03 7.7634446737991688e-03 1.3958321438165579e-02 -6.9166303731482684e-03 -1.7110242726975422e-02 1.2501243742579654e-03 -2.0709118419527640e-02 -5.0096908108375991e-03 -9.9227817987017769e-03 -3.2968646284807818e-03 1.8722518821389013e-02 -1.5781094134485166e-03 3.9195784044890158e-02 1.1083152832319695e-02 8.7473137062484430e-03 2.0159463482394537e-02 -1.5622127076530434e-02 5.1149783043874151e-04 -2.7806156829172212e-03 -8.8179025969696411e-03 -6.9140427509124264e-03 -6.1234164892235840e-03 8.2629753891039180e-03 6.3473084190152664e-03 4.2962885974402809e-03 1.0012193689197219e-02 1.0796922894381391e-02 5.0148786367463947e-03 -1.5484087425487189e-02 -4.1263666067662816e-03 -9.8379472287659121e-03 -1.3232491800290324e-02 -9.9010794108226000e-03 -1.3271775956210825e-03 1.2507532500209927e-02 8.7917385573066508e-03 1.1083152832319695e-02 2.6769588115265735e-02 8.1758834370252373e-03 7.2103832690571827e-03 -2.0017807871029639e-02 -1.3170364539227236e-02 -1.0316162021952961e-02 -8.2730124491014294e-03 -2.3919535731416700e-02 -1.5898240887651412e-02 1.8687839576684101e-02 -2.3529024532606101e-03 -5.1279711735449504e-03 1.1519977089686903e-02 2.3097936189837364e-02 4.0110795588923047e-03 -1.3285990733557233e-02 -7.0780203283166863e-03 -1.2278630561487926e-02 -1.3599112491106305e-02 -2.7544767930345312e-02 -5.2098568629562912e-05 1.0206485588674426e-02 2.5459131605239885e-03 8.7473137062484430e-03 8.1758834370252390e-03 4.2843176335678551e-02 1.7588249709488038e-02 -1.3432070018305702e-02 -7.5917992427005903e-03 3.0102982166850972e-03 -7.4624780210891580e-03 -1.6212413694244657e-02 -2.0068810167618488e-02 1.6300506413628135e-02 -2.5461456193294238e-03 -6.8754629166524273e-03 5.8968011123701619e-03 6.3775349175818462e-03 -3.2256504174321774e-03 -1.4784284589435211e-02 -4.0255398186475836e-03 -2.3751688235059704e-02 -8.8761628712652214e-03 -1.0973902634909974e-02 -2.3763963909746340e-03 1.2321816169539385e-02 6.8486516229724530e-03 2.0159463482394540e-02 7.2103832690571827e-03 1.7588249709488038e-02 3.8842751643158285e-02 -1.0606581482805277e-02 2.9435655170893071e-03 -2.7042069978153579e-03 7.4267570760840600e-03 1.8126194170825064e-02 1.5628487937392493e-02 -3.9910433941343276e-02 1.3024391426019169e-03 8.2536494315174850e-03 -2.8762270190544385e-02 -1.9255327962428286e-02 8.9578765387174006e-03 2.7937028245373422e-02 -1.0280232726915348e-03 8.2507413106273127e-03 2.4002760048622580e-02 1.2720821978328080e-02 -6.1682761547708891e-03 -3.4256222925690000e-02 2.5395394207948182e-03 -1.5622127076530438e-02 -2.0017807871029646e-02 -1.3432070018305702e-02 -1.0606581482805275e-02 6.3580189558527248e-02 -9.7357345912435923e-04 -8.6937705041481329e-03 6.0723350118598862e-03 -3.9140593369284037e-03 -2.7873220180238069e-03 1.1691986501980291e-03 -5.9192664523511681e-03 -1.8181211412559076e-04 -6.4365049823487822e-03 -7.7786020209829219e-03 1.9881716295310405e-03 -1.3789094611390200e-03 3.5754711708630795e-03 2.1472211104120323e-05 1.3240623215510575e-02 2.5636236350192174e-03 -2.9207090891789065e-03 1.4771955642709082e-03 -7.5554894062371449e-03 5.1149783043874151e-04 -1.3170364539227236e-02 -7.5917992427005912e-03 2.9435655170893063e-03 -9.7357345912435999e-04 2.6620121653317935e-02 4.2513603316509486e-04 3.8368116509651610e-03 -5.2352711994229726e-03 -8.2662027813663261e-03 8.1721787792908840e-03 -2.1088394646403497e-04 -7.8480369856388649e-03 6.5097536378104295e-03 4.7882601922519799e-03 -1.0290547426823813e-02 9.0301829725141711e-03 -1.4975119486524110e-04 -3.3572190709389707e-03 -6.8293105127263335e-03 -2.7277307320400243e-03 6.5646542691846803e-03 -1.7096840017532221e-03 9.9942630690103752e-05 -2.7806156829172221e-03 -1.0316162021952961e-02 3.0102982166850967e-03 -2.7042069978153579e-03 -8.6937705041481329e-03 4.2513603316509475e-04 2.8682174676315890e-02 225 226 227 297 298 299 312 313 314 240 241 242 228 229 230 300 301 302 315 316 317 243 244 245 3.3292069303111821e-02 1.0418409056299868e-02 9.0347901928188607e-03 -2.4569806498751023e-02 -1.4062959655801593e-02 -1.0486261970444780e-02 -1.5408561779138184e-02 -1.2352398621181395e-02 -1.1404146781626243e-03 1.4468353864403585e-02 1.0225582473617148e-02 1.3287173719222996e-02 1.1947989113732222e-02 1.3045210563608007e-02 5.5829033630742913e-03 -1.8102289289000109e-02 -4.7341146133343150e-03 -1.2234705148487957e-02 -9.9113541366439312e-03 -9.3027700238769301e-03 -8.3397183890454828e-03 8.2835994222856379e-03 6.7630408206692128e-03 4.2962329110246894e-03 1.0418409056299866e-02 5.0594469270469074e-02 1.9953423754873082e-02 -1.6749520197573919e-02 -9.1812589067567438e-03 3.6293434194530892e-03 -1.4977327917481180e-02 -3.1279386162359438e-02 4.6701393515327931e-04 1.0832170944995598e-02 2.7612580109347400e-03 8.5803479036421111e-03 1.2967207182563941e-02 2.5687001165729809e-02 5.7247528257808123e-03 -1.4968359792504259e-02 -7.2767423861309806e-03 -1.4395446037284525e-02 -7.7615154678463095e-03 -2.6858914220530973e-02 -1.8087050059144710e-02 2.0238936191546271e-02 -4.4464267713554880e-03 -5.8723857424731480e-03 9.0347901928188607e-03 1.9953423754873082e-02 4.5551826690688732e-02 -1.3229696607782646e-02 2.9986357856307518e-03 -3.5796469244888571e-03 -9.5562955032816276e-03 -1.2457073968385614e-02 -2.1157499853463871e-03 1.2958665054036303e-02 8.6949894891090312e-03 2.1784425473295423e-02 6.6520044699944015e-03 6.0364991778351432e-03 -3.2055928176646011e-03 -1.6441394350520697e-02 -4.1415995239943489e-03 -2.6668278376115063e-02 -6.9033456200609756e-03 -1.7921006579415012e-02 -2.2496992611040909e-02 1.7485272364796391e-02 -3.1638681356530307e-03 -9.2699914493283436e-03 -2.4569806498751030e-02 -1.6749520197573916e-02 -1.3229696607782646e-02 6.8070341649843435e-02 -9.2958476464785026e-04 -9.8802379688535356e-03 2.8476893520847278e-02 1.7014319777185063e-02 -8.4118430927862687e-03 -3.8208501119396047e-02 2.0933312927085752e-03 -1.7468430826280513e-02 -3.2645871189025323e-02 -2.1831026881298156e-02 9.2680683748211957e-03 3.4038458766991180e-02 -1.9154023123493077e-03 1.2510877299929259e-02 9.2283370229013680e-03 2.0894309028902880e-02 1.8119245452626487e-02 -4.4389852153410847e-02 1.4235740570727007e-03 9.0920173683260302e-03 -1.4062959655801593e-02 -9.1812589067567403e-03 2.9986357856307518e-03 -9.2958476464785004e-04 2.5204916738150871e-02 4.3429097694364912e-04 1.3518449044182080e-02 4.2797347639010851e-03 -2.7916489388419325e-03 1.8042916859828159e-03 -8.0413866360459080e-03 7.2886832437618913e-04 -7.4982138482063967e-03 -8.3398814129176518e-03 1.8519553814018038e-03 -1.3712382127762555e-03 5.3572731065492513e-03 -9.6622255598511551e-05 7.0859171090381185e-03 -2.6924259501225484e-03 -2.8900683478534578e-03 1.4533386422290791e-03 -6.5869717027583659e-03 -2.3541092605849172e-04 -1.0486261970444779e-02 3.6293434194530905e-03 -3.5796469244888580e-03 -9.8802379688535356e-03 4.3429097694364950e-04 2.7477108019386770e-02 -7.3799954766907080e-03 -3.7504244865079204e-03 8.5594933867951511e-03 -2.0135288978228821e-03 -1.1572777796162918e-04 -2.8240270450423672e-03 7.5225887403939850e-03 5.6728585526044277e-03 -1.0832196844868906e-02 8.1561209252995238e-03 1.8922800052405749e-04 -2.2506238027651384e-03 4.7481564306646636e-03 -5.8233304081142766e-03 -7.7845522445301523e-03 9.3331582174537350e-03 -2.3623827694139532e-04 -8.7655545444865028e-03 -1.5408561779138186e-02 -1.4977327917481180e-02 -9.5562955032816276e-03 2.8476893520847271e-02 1.3518449044182080e-02 -7.3799954766907080e-03 3.9068600721198263e-02 1.8586559009333696e-02 -6.3830704399330885e-03 -2.8348615740526776e-02 -1.0916834262011689e-02 -4.6491823610085511e-03 -1.8429935212775441e-02 -1.6110265619164180e-02 5.4816632451830279e-03 1.5540878886089512e-02 4.1427883938480034e-03 8.7351983678221907e-03 1.1359741573465428e-02 1.2935469097476992e-02 6.5119052282559386e-03 -3.2259001969160074e-02 -7.1788377461837246e-03 7.2397769396528285e-03 -1.2352398621181395e-02 -3.1279386162359431e-02 -1.2457073968385614e-02 1.7014319777185059e-02 4.2797347639010859e-03 -3.7504244865079208e-03 1.8586559009333696e-02 4.9230731327906778e-02 -8.5161975227074065e-03 -1.1922139266221338e-02 -8.8959175981801510e-03 -1.0712414682853198e-02 -1.7262963260919445e-02 -2.7912480408972321e-02 7.4009260203102105e-03 1.5261058194576878e-02 -2.7159902727166706e-03 1.5656356146288644e-02 1.2149980408189502e-02 2.6033065939724452e-02 7.0163744944960922e-03 -2.1474416240962961e-02 -8.7397575893037472e-03 5.3624539993591984e-03 -1.1404146781626241e-03 4.6701393515328040e-04 -2.1157499853463862e-03 -8.4118430927862687e-03 -2.7916489388419320e-03 8.5594933867951493e-03 -6.3830704399330867e-03 -8.5161975227074048e-03 2.7921741997016539e-02 -3.9766945664795866e-03 -1.0036378792611794e-02 -3.1165114859484635e-03 6.3410948635461029e-03 8.0044063473558875e-03 -8.4910368432972207e-03 -2.1171905839645045e-03 6.0608402239887499e-03 -7.7338679255923200e-03 5.7049269808149596e-03 4.6112597295699916e-03 -3.4430833319293828e-03 9.9831915169650096e-03 2.2007050180932238e-03 -1.1580985811697923e-02 1.4468353864403581e-02 1.0832170944995599e-02 1.2958665054036299e-02 -3.8208501119396047e-02 1.8042916859828161e-03 -2.0135288978228813e-03 -2.8348615740526783e-02 -1.1922139266221340e-02 -3.9766945664795866e-03 5.0361885279620454e-02 -1.3066237794595325e-03 2.0290451189165559e-02 1.3986425114731450e-02 1.4792328129879368e-02 -1.8860984784568901e-03 -2.5993569481100834e-02 2.2168657446658266e-03 -1.9093952307076393e-02 -1.7434073939774437e-02 -1.4820310438003194e-02 -1.6458408635034290e-02 3.1168096022042607e-02 -1.5965830218395377e-03 1.0179566641668171e-02 1.0225582473617148e-02 2.7612580109347400e-03 8.6949894891090312e-03 2.0933312927085756e-03 -8.0413866360459080e-03 -1.1572777796162905e-04 -1.0916834262011689e-02 -8.8959175981801510e-03 -1.0036378792611794e-02 -1.3066237794595338e-03 2.7873706681055703e-02 -1.4187355673584876e-03 4.0832388781724760e-03 -3.7637224115347799e-03 6.0841884117105345e-03 1.6239293076067886e-03 -6.0174823634830017e-03 1.4456735594463488e-03 -4.6383162351634885e-03 -7.9971337750059258e-03 -4.4762447565075778e-03 -1.1643076754702779e-03 4.0806780922593286e-03 -1.7776456582642636e-04 1.3287173719222996e-02 8.5803479036421128e-03 2.1784425473295427e-02 -1.7468430826280509e-02 7.2886832437618892e-04 -2.8240270450423672e-03 -4.6491823610085537e-03 -1.0712414682853199e-02 -3.1165114859484635e-03 2.0290451189165566e-02 -1.4187355673584876e-03 4.5979568129254141e-02 8.6894217216617574e-03 1.4663059082604141e-02 -8.4955647201689927e-03 -1.8165743709553820e-02 1.9099703852728759e-03 -2.3092415619048366e-02 -1.1013688480288055e-02 -1.3738804788839782e-02 -2.6576589732229101e-02 9.0299987470806274e-03 -1.2290656843847250e-05 -3.6588850001122875e-03 1.1947989113732219e-02 1.2967207182563941e-02 6.6520044699944006e-03 -3.2645871189025316e-02 -7.4982138482063967e-03 7.5225887403939850e-03 -1.8429935212775441e-02 -1.7262963260919448e-02 6.3410948635461029e-03 1.3986425114731450e-02 4.0832388781724760e-03 8.6894217216617574e-03 4.1829809975737368e-02 1.8800685613607260e-02 -5.9615004663407904e-03 -2.8590691380788236e-02 -1.0491707106522235e-02 -5.7081145533642132e-03 -1.4839501348321861e-02 -1.5316451701981823e-02 -9.9239925186615525e-03 2.6741774926709816e-02 1.4718204243286227e-02 -7.6115022572296950e-03 1.3045210563608011e-02 2.5687001165729806e-02 6.0364991778351432e-03 -2.1831026881298156e-02 -8.3398814129176536e-03 5.6728585526044251e-03 -1.6110265619164180e-02 -2.7912480408972321e-02 8.0044063473558875e-03 1.4792328129879370e-02 -3.7637224115347799e-03 1.4663059082604141e-02 1.8800685613607260e-02 5.0824064819084892e-02 -7.8595160882110517e-03 -1.1869202123758367e-02 -8.3150491871023004e-03 -1.1237887152561002e-02 -1.1080498546827697e-02 -3.0914721995961441e-02 -1.2249232551592519e-02 1.4252768863953762e-02 2.7347894316738014e-03 -3.0301873680350349e-03 5.5829033630742930e-03 5.7247528257808140e-03 -3.2055928176646003e-03 9.2680683748211957e-03 1.8519553814018033e-03 -1.0832196844868906e-02 5.4816632451830279e-03 7.4009260203102105e-03 -8.4910368432972207e-03 -1.8860984784568901e-03 6.0841884117105345e-03 -8.4955647201689945e-03 -5.9615004663407904e-03 -7.8595160882110517e-03 2.9610972742011896e-02 -4.0522039082059218e-03 -9.9211517935495069e-03 -3.2578645403187959e-03 -1.4439863053634422e-03 -1.4296269988069458e-05 -2.6202364907197294e-03 -6.9888458247114723e-03 -3.2668584874547347e-03 7.2915195150263529e-03 -1.8102289289000109e-02 -1.4968359792504257e-02 -1.6441394350520697e-02 3.4038458766991180e-02 -1.3712382127762555e-03 8.1561209252995238e-03 1.5540878886089512e-02 1.5261058194576878e-02 -2.1171905839645049e-03 -2.5993569481100834e-02 1.6239293076067886e-03 -1.8165743709553820e-02 -2.8590691380788236e-02 -1.1869202123758365e-02 -4.0522039082059218e-03 4.7156791352343720e-02 -1.8454319623760660e-03 2.0845312240956568e-02 1.3929351060896121e-02 1.1396272786132585e-02 1.3691596611442956e-02 -3.7978929915431357e-02 1.7729718030986945e-03 -1.9164972254540912e-03 -4.7341146133343167e-03 -7.2767423861309780e-03 -4.1415995239943515e-03 -1.9154023123493073e-03 5.3572731065492513e-03 1.8922800052405760e-04 4.1427883938480042e-03 -2.7159902727166702e-03 6.0608402239887499e-03 2.2168657446658266e-03 -6.0174823634830017e-03 1.9099703852728757e-03 -1.0491707106522235e-02 -8.3150491871022969e-03 -9.9211517935495069e-03 -1.8454319623760660e-03 2.4600051478180455e-02 -1.8315257382639132e-03 9.7680923495517043e-03 2.7116453021334332e-03 7.6253783006750633e-03 2.8589095065163859e-03 -8.3437056774301830e-03 1.0886014534702008e-04 -1.2234705148487957e-02 -1.4395446037284525e-02 -2.6668278376115063e-02 1.2510877299929259e-02 -9.6622255598511429e-05 -2.2506238027651384e-03 8.7351983678221907e-03 1.5656356146288644e-02 -7.7338679255923191e-03 -1.9093952307076389e-02 1.4456735594463484e-03 -2.3092415619048366e-02 -5.7081145533642149e-03 -1.1237887152561002e-02 -3.2578645403187915e-03 2.0845312240956565e-02 -1.8315257382639123e-03 4.3516192434200497e-02 1.2401835547004959e-02 9.8444300839036804e-03 2.2473952835273890e-02 -1.7456451446784413e-02 6.1502139406927276e-04 -2.9870950056347097e-03 -9.9113541366439312e-03 -7.7615154678463095e-03 -6.9033456200609756e-03 9.2283370229013662e-03 7.0859171090381185e-03 4.7481564306646636e-03 1.1359741573465426e-02 1.2149980408189502e-02 5.7049269808149604e-03 -1.7434073939774437e-02 -4.6383162351634885e-03 -1.1013688480288051e-02 -1.4839501348321861e-02 -1.1080498546827699e-02 -1.4439863053634428e-03 1.3929351060896123e-02 9.7680923495517043e-03 1.2401835547004957e-02 3.0197154809192037e-02 9.2113583792810608e-03 8.0950419221787872e-03 -2.2529655041714725e-02 -1.4735017996222892e-02 -1.1588940474950897e-02 -9.3027700238769301e-03 -2.6858914220530973e-02 -1.7921006579415012e-02 2.0894309028902880e-02 -2.6924259501225484e-03 -5.8233304081142774e-03 1.2935469097476990e-02 2.6033065939724452e-02 4.6112597295699916e-03 -1.4820310438003196e-02 -7.9971337750059258e-03 -1.3738804788839780e-02 -1.5316451701981825e-02 -3.0914721995961444e-02 -1.4296269988068808e-05 1.1396272786132585e-02 2.7116453021334315e-03 9.8444300839036821e-03 9.2113583792810590e-03 4.8257964791003180e-02 1.9696845614483816e-02 -1.4997877127931568e-02 -8.5394800912401685e-03 3.3449026183996556e-03 -8.3397183890454810e-03 -1.8087050059144710e-02 -2.2496992611040909e-02 1.8119245452626484e-02 -2.8900683478534574e-03 -7.7845522445301523e-03 6.5119052282559377e-03 7.0163744944960896e-03 -3.4430833319293807e-03 -1.6458408635034290e-02 -4.4762447565075778e-03 -2.6576589732229101e-02 -9.9239925186615525e-03 -1.2249232551592519e-02 -2.6202364907197294e-03 1.3691596611442956e-02 7.6253783006750625e-03 2.2473952835273890e-02 8.0950419221787889e-03 1.9696845614483819e-02 4.3588580688406577e-02 -1.1695669671762851e-02 3.3639973054432858e-03 -3.1410791132311837e-03 8.2835994222856379e-03 2.0238936191546271e-02 1.7485272364796391e-02 -4.4389852153410847e-02 1.4533386422290794e-03 9.3331582174537350e-03 -3.2259001969160081e-02 -2.1474416240962958e-02 9.9831915169650096e-03 3.1168096022042603e-02 -1.1643076754702774e-03 9.0299987470806222e-03 2.6741774926709812e-02 1.4252768863953763e-02 -6.9888458247114723e-03 -3.7978929915431357e-02 2.8589095065163846e-03 -1.7456451446784413e-02 -2.2529655041714731e-02 -1.4997877127931570e-02 -1.1695669671762849e-02 7.0963968708678951e-02 -1.1673521598806844e-03 -9.6906539030370362e-03 6.7630408206692120e-03 -4.4464267713554880e-03 -3.1638681356530294e-03 1.4235740570727009e-03 -6.5869717027583659e-03 -2.3623827694139530e-04 -7.1788377461837229e-03 -8.7397575893037472e-03 2.2007050180932229e-03 -1.5965830218395379e-03 4.0806780922593277e-03 -1.2290656843847114e-05 1.4718204243286225e-02 2.7347894316738005e-03 -3.2668584874547347e-03 1.7729718030986929e-03 -8.3437056774301847e-03 6.1502139406927232e-04 -1.4735017996222892e-02 -8.5394800912401703e-03 3.3639973054432858e-03 -1.1673521598806829e-03 2.9840874308154828e-02 4.9953183928722663e-04 4.2962329110246885e-03 -5.8723857424731480e-03 -9.2699914493283436e-03 9.0920173683260302e-03 -2.3541092605849180e-04 -8.7655545444865028e-03 7.2397769396528276e-03 5.3624539993591984e-03 -1.1580985811697923e-02 1.0179566641668168e-02 -1.7776456582642663e-04 -3.6588850001122858e-03 -7.6115022572296950e-03 -3.0301873680350358e-03 7.2915195150263529e-03 -1.9164972254540910e-03 1.0886014534702008e-04 -2.9870950056347088e-03 -1.1588940474950897e-02 3.3449026183996547e-03 -3.1410791132311829e-03 -9.6906539030370345e-03 4.9953183928722652e-04 3.2112071409464600e-02 168 169 170 240 241 242 255 256 257 183 184 185 171 172 173 243 244 245 258 259 260 186 187 188 2.5153701343611279e-02 4.5405349102381771e-03 3.5908663928609129e-03 -1.3013873937949319e-02 -1.3025440679265275e-02 -9.3471660247562618e-03 -7.8194687409800564e-03 -6.1178375785661864e-03 -9.5676547961384120e-04 7.5931303758620412e-03 9.3796783471486976e-03 9.2652377686367731e-03 4.8158258494629038e-03 7.4280614396227155e-03 3.6972542845027882e-03 -1.0903785051153555e-02 -5.0086228171729186e-03 -7.3408296540533324e-03 -5.9683539320398533e-03 -3.8772629800516048e-03 -3.4900169477705793e-03 1.4282409318655781e-04 6.6808893580463944e-03 4.5814196601935368e-03 4.5405349102381762e-03 4.5755371678483335e-02 1.8483746145825646e-02 -1.5657156900085990e-02 -1.0882918197573331e-02 2.5723568790576969e-03 -8.8357803962244765e-03 -2.8347265944725204e-02 1.5464054084348804e-03 9.9883790047155963e-03 5.9210852873297238e-03 9.5023238189029385e-03 7.3724188056910863e-03 2.3419658386366414e-02 4.7722585657371964e-03 -1.3287841095501660e-02 -9.6683890675182908e-03 -1.4183770473598277e-02 -2.3373728532329772e-03 -2.4910901083254812e-02 -1.6928926642214501e-02 1.8216818524400245e-02 -1.2866410591078387e-03 -5.7643937021455973e-03 3.5908663928609134e-03 1.8483746145825646e-02 3.9379188889902182e-02 -1.1757435782821023e-02 1.5041078292804292e-03 -1.4633170272884720e-04 -5.8917113473018687e-03 -1.1079501522928376e-02 5.8028303366339912e-04 8.7742758711704862e-03 9.3524957743081321e-03 1.8928381626910105e-02 4.6558674314974378e-03 5.0914255307206941e-03 -5.2266460530965460e-03 -1.2712946053260997e-02 -6.2212541804776283e-03 -2.2963333354949822e-02 -2.0484812202335996e-03 -1.6211789824469958e-02 -1.9837734983983515e-02 1.5389564708088652e-02 -9.1922975225894158e-04 -1.0713807455716973e-02 -1.3013873937949325e-02 -1.5657156900085994e-02 -1.1757435782821023e-02 5.6921191502834166e-02 4.8637417681808952e-03 -1.0555131939945969e-02 1.7944374962522217e-02 1.6408473518809998e-02 -8.2205119824534344e-03 -3.0348195548651612e-02 -2.9084321466718382e-03 -1.4513064031991903e-02 -2.1924384522280561e-02 -2.0311840234976640e-02 8.9902337106380972e-03 2.6823283742594239e-02 2.6654699750695387e-03 1.0034767634259079e-02 5.9416428914281331e-04 1.8547029043212808e-02 1.6075457490085265e-02 -3.6996560488211913e-02 -3.6072850235387617e-03 9.9456849022299086e-03 -1.3025440679265275e-02 -1.0882918197573329e-02 1.5041078292804286e-03 4.8637417681808960e-03 2.2218402558740812e-02 -1.2303910395011284e-03 1.3367259579061493e-02 7.9394990326341393e-03 -4.3446929083126376e-03 -2.6229889239999683e-03 -6.3377141011047126e-03 -1.6489555952328792e-03 -8.6202325900910266e-03 -1.1199213467236088e-02 3.3363885313340757e-03 3.0152856809760428e-03 3.9214063698137852e-03 1.4350381186593489e-03 6.7863184470879573e-03 5.3177228786452087e-04 -3.5538838728548227e-04 -3.7639432819501187e-03 -6.1912344831391289e-03 1.3038934510582762e-03 -9.3471660247562618e-03 2.5723568790576960e-03 -1.4633170272884677e-04 -1.0555131939945969e-02 -1.2303910395011287e-03 2.4691675012068495e-02 -6.7662700839750201e-03 -4.9909787203547273e-03 8.3202081245080956e-03 -7.9465982718787600e-04 -1.6096498913651492e-04 -2.4409105697423207e-04 6.3941167675144878e-03 7.0047553933382453e-03 -1.0155227828757744e-02 6.1728537574903056e-03 9.9389663467811494e-04 -4.4061876094592814e-03 5.1998116596097170e-03 -5.4132352949175407e-03 -9.2350381936188528e-03 9.6964456912506172e-03 1.2245611368358537e-03 -8.8250067450376390e-03 -7.8194687409800564e-03 -8.8357803962244765e-03 -5.8917113473018687e-03 1.7944374962522221e-02 1.3367259579061493e-02 -6.7662700839750201e-03 2.6129077385827253e-02 1.1910504816168082e-02 -4.7965399045568537e-03 -1.7179784737048377e-02 -1.0590343319189391e-02 -1.4330828480649542e-03 -1.0016049672543940e-02 -1.0257348621201798e-02 3.9204979301418214e-03 8.6482049996969984e-03 5.3879104051135929e-03 4.2140431751358258e-03 3.7372707678471348e-03 7.0108208218720774e-03 4.3228164462366797e-03 -2.1443624965321234e-02 -7.9930232855995789e-03 6.4302466323843789e-03 -6.1178375785661864e-03 -2.8347265944725204e-02 -1.1079501522928376e-02 1.6408473518809998e-02 7.9394990326341393e-03 -4.9909787203547273e-03 1.1910504816168082e-02 4.3803663926745243e-02 -9.5632680061692420e-03 -1.1421387055031389e-02 -9.7543881017836936e-03 -9.1854595239927554e-03 -1.1291162440648950e-02 -2.6137207936452109e-02 8.1429469900536483e-03 1.3991064032061172e-02 1.0882525342512804e-03 1.3917215935354228e-02 6.2919466728112907e-03 2.2590817932009771e-02 5.9769025306264370e-03 -1.9771601965604017e-02 -1.1183371442679411e-02 6.7821423174108057e-03 -9.5676547961384098e-04 1.5464054084348799e-03 5.8028303366339815e-04 -8.2205119824534344e-03 -4.3446929083126367e-03 8.3202081245080956e-03 -4.7965399045568529e-03 -9.5632680061692402e-03 2.4154133535539635e-02 -8.4884503893348771e-04 -8.4495885438769167e-03 6.5835349830743999e-04 4.7454223322170594e-03 8.9658874784499555e-03 -7.9599600299024610e-03 -3.7028480857900625e-03 4.3493622562946069e-03 -8.3241632361991391e-03 4.1395474169733061e-03 3.6383441957759926e-03 -6.3788633995050690e-03 9.6405407421573108e-03 3.8575501194033574e-03 -1.1049991526411918e-02 7.5931303758620420e-03 9.9883790047155963e-03 8.7742758711704862e-03 -3.0348195548651612e-02 -2.6229889239999696e-03 -7.9465982718787600e-04 -1.7179784737048377e-02 -1.1421387055031389e-02 -8.4884503893348858e-04 3.9978710171659493e-02 2.3414583733018727e-03 1.6493840880050827e-02 7.4643644302855670e-03 1.3482797603189364e-02 -3.3207423471489994e-03 -2.0538069828604583e-02 -1.4358659530779752e-03 -1.5663348480273741e-02 -1.0055010283799523e-02 -1.2806341237705384e-02 -1.2586405065898858e-02 2.3084855420296979e-02 2.4739481886078807e-03 7.9458840082216355e-03 9.3796783471486993e-03 5.9210852873297247e-03 9.3524957743081321e-03 -2.9084321466718386e-03 -6.3377141011047144e-03 -1.6096498913651481e-04 -1.0590343319189389e-02 -9.7543881017836936e-03 -8.4495885438769201e-03 2.3414583733018723e-03 2.3009267553736633e-02 2.0707695777669138e-03 5.1944949058494701e-03 1.1346412963678901e-05 4.6040418856956892e-03 -1.8296380008744001e-03 -4.9080272407265677e-03 -1.8803151956650100e-03 -4.4127135827943887e-03 -9.9179607774131564e-03 -6.4824839351317522e-03 2.8254954232299753e-03 1.9763909669980951e-03 9.4604542603946051e-04 9.2652377686367731e-03 9.5023238189029403e-03 1.8928381626910101e-02 -1.4513064031991901e-02 -1.6489555952328792e-03 -2.4409105697423218e-04 -1.4330828480649540e-03 -9.1854595239927520e-03 6.5835349830744173e-04 1.6493840880050823e-02 2.0707695777669134e-03 3.8621707911744428e-02 4.5896491668006092e-03 1.3075813262425937e-02 -8.7067297489802804e-03 -1.5068634005867268e-02 -1.4335208811931844e-03 -1.9642086907043665e-02 -6.2402476766223432e-03 -1.3242215208489125e-02 -2.2892941966611076e-02 6.9063007470582579e-03 8.6124454981215050e-04 -6.7225933573527383e-03 4.8158258494629064e-03 7.3724188056910880e-03 4.6558674314974386e-03 -2.1924384522280561e-02 -8.6202325900910249e-03 6.3941167675144878e-03 -1.0016049672543940e-02 -1.1291162440648950e-02 4.7454223322170594e-03 7.4643644302855670e-03 5.1944949058494692e-03 4.5896491668006084e-03 2.8942965195910827e-02 1.2470581355888183e-02 -4.4404559668637621e-03 -1.8572410685366018e-02 -1.0640790957954543e-02 -2.3046187739409630e-03 -7.4952765938692293e-03 -8.9529124735311487e-03 -6.3499316571678215e-03 1.6784965998400445e-02 1.4467603394796922e-02 -7.2900493000570572e-03 7.4280614396227155e-03 2.3419658386366414e-02 5.0914255307206949e-03 -2.0311840234976640e-02 -1.1199213467236086e-02 7.0047553933382453e-03 -1.0257348621201798e-02 -2.6137207936452109e-02 8.9658874784499572e-03 1.3482797603189364e-02 1.1346412963679335e-05 1.3075813262425937e-02 1.2470581355888183e-02 4.5833428814943650e-02 -8.6874213360257115e-03 -1.1667176856634719e-02 -1.0277569798457058e-02 -9.6935154370146916e-03 -5.0349390217222477e-03 -2.7858527655532726e-02 -1.1192274948060249e-02 1.3889864335835143e-02 6.2080852434042363e-03 -4.5646699438342082e-03 3.6972542845027882e-03 4.7722585657371929e-03 -5.2266460530965468e-03 8.9902337106381007e-03 3.3363885313340766e-03 -1.0155227828757744e-02 3.9204979301418214e-03 8.1429469900536483e-03 -7.9599600299024610e-03 -3.3207423471489994e-03 4.6040418856956892e-03 -8.7067297489802804e-03 -4.4404559668637621e-03 -8.6874213360257097e-03 2.5622369396604394e-02 -1.1603405396383674e-03 -8.4586446443905335e-03 -5.8434554491830840e-04 -1.3233514488437711e-03 8.2219055368703165e-04 -1.6703658286100096e-04 -6.3630956227878066e-03 -4.5317605460913919e-03 7.1775763919119584e-03 -1.0903785051153555e-02 -1.3287841095501660e-02 -1.2712946053260997e-02 2.6823283742594236e-02 3.0152856809760428e-03 6.1728537574903038e-03 8.6482049996969984e-03 1.3991064032061172e-02 -3.7028480857900616e-03 -2.0538069828604583e-02 -1.8296380008744006e-03 -1.5068634005867264e-02 -1.8572410685366018e-02 -1.1667176856634719e-02 -1.1603405396383687e-03 3.8344010932357467e-02 2.1240544209648539e-03 1.7182579171106591e-02 6.7406595197258548e-03 1.0272321993970336e-02 9.7757970129629234e-03 -3.0541893629250402e-02 -2.6180701749616208e-03 -4.8646125700310423e-04 -5.0086228171729195e-03 -9.6683890675182925e-03 -6.2212541804776292e-03 2.6654699750695387e-03 3.9214063698137843e-03 9.9389663467811494e-04 5.3879104051135929e-03 1.0882525342512800e-03 4.3493622562946069e-03 -1.4358659530779752e-03 -4.9080272407265677e-03 -1.4335208811931844e-03 -1.0640790957954543e-02 -1.0277569798457056e-02 -8.4586446443905353e-03 2.1240544209648539e-03 2.0686291896679837e-02 1.9323671512647899e-03 9.0481796416374983e-03 5.8089991266446709e-03 8.6775167872339479e-03 -2.1403347145800512e-03 -6.6509638206876595e-03 1.6027687658988840e-04 -7.3408296540533333e-03 -1.4183770473598279e-02 -2.2963333354949822e-02 1.0034767634259081e-02 1.4350381186593486e-03 -4.4061876094592806e-03 4.2140431751358249e-03 1.3917215935354228e-02 -8.3241632361991391e-03 -1.5663348480273741e-02 -1.8803151956650103e-03 -1.9642086907043665e-02 -2.3046187739409656e-03 -9.6935154370146916e-03 -5.8434554491830840e-04 1.7182579171106591e-02 1.9323671512647897e-03 3.6934733996462070e-02 8.1005578715511953e-03 1.0126176208588588e-02 1.9353479299264412e-02 -1.4223150943784653e-02 -1.6531963075889717e-03 -3.6809664315624706e-04 -5.9683539320398533e-03 -2.3373728532329772e-03 -2.0484812202335992e-03 5.9416428914281418e-04 6.7863184470879582e-03 5.1998116596097170e-03 3.7372707678471357e-03 6.2919466728112907e-03 4.1395474169733052e-03 -1.0055010283799525e-02 -4.4127135827943887e-03 -6.2402476766223449e-03 -7.4952765938692302e-03 -5.0349390217222477e-03 -1.3233514488437711e-03 6.7406595197258539e-03 9.0481796416375000e-03 8.1005578715511936e-03 2.2822174557751047e-02 3.1695771176735148e-03 2.6160404766599611e-03 -1.0375628324758241e-02 -1.3510996421460648e-02 -1.0443877079094463e-02 -3.8772629800516044e-03 -2.4910901083254812e-02 -1.6211789824469958e-02 1.8547029043212808e-02 5.3177228786452087e-04 -5.4132352949175415e-03 7.0108208218720783e-03 2.2590817932009767e-02 3.6383441957759935e-03 -1.2806341237705384e-02 -9.9179607774131581e-03 -1.3242215208489127e-02 -8.9529124735311487e-03 -2.7858527655532723e-02 8.2219055368703208e-04 1.0272321993970336e-02 5.8089991266446700e-03 1.0126176208588588e-02 3.1695771176735153e-03 4.2884004499785293e-02 1.8017911067426083e-02 -1.3363232285440599e-02 -9.1282043301035599e-03 2.2626183023989515e-03 -3.4900169477705793e-03 -1.6928926642214501e-02 -1.9837734983983515e-02 1.6075457490085265e-02 -3.5538838728548194e-04 -9.2350381936188528e-03 4.3228164462366806e-03 5.9769025306264378e-03 -6.3788633995050699e-03 -1.2586405065898858e-02 -6.4824839351317522e-03 -2.2892941966611076e-02 -6.3499316571678215e-03 -1.1192274948060249e-02 -1.6703658286100064e-04 9.7757970129629217e-03 8.6775167872339479e-03 1.9353479299264412e-02 2.6160404766599611e-03 1.8017911067426087e-02 3.7912594861075219e-02 -1.0363757755107568e-02 2.2867435274055168e-03 1.2455409662398948e-03 1.4282409318655846e-04 1.8216818524400245e-02 1.5389564708088652e-02 -3.6996560488211913e-02 -3.7639432819501196e-03 9.6964456912506190e-03 -2.1443624965321238e-02 -1.9771601965604017e-02 9.6405407421573108e-03 2.3084855420296986e-02 2.8254954232299753e-03 6.9063007470582579e-03 1.6784965998400445e-02 1.3889864335835144e-02 -6.3630956227878066e-03 -3.0541893629250406e-02 -2.1403347145800516e-03 -1.4223150943784653e-02 -1.0375628324758239e-02 -1.3363232285440596e-02 -1.0363757755107568e-02 5.9345061895657816e-02 4.1069339641094105e-03 -1.0682847566874839e-02 6.6808893580463944e-03 -1.2866410591078389e-03 -9.1922975225894191e-04 -3.6072850235387617e-03 -6.1912344831391289e-03 1.2245611368358539e-03 -7.9930232855995789e-03 -1.1183371442679411e-02 3.8575501194033582e-03 2.4739481886078799e-03 1.9763909669980959e-03 8.6124454981215039e-04 1.4467603394796923e-02 6.2080852434042372e-03 -4.5317605460913919e-03 -2.6180701749616204e-03 -6.6509638206876604e-03 -1.6531963075889717e-03 -1.3510996421460647e-02 -9.1282043301035582e-03 2.2867435274055168e-03 4.1069339641094113e-03 2.6255938925315261e-02 -1.1259127275175737e-03 4.5814196601935376e-03 -5.7643937021455973e-03 -1.0713807455716972e-02 9.9456849022299103e-03 1.3038934510582766e-03 -8.8250067450376390e-03 6.4302466323843798e-03 6.7821423174108057e-03 -1.1049991526411916e-02 7.9458840082216355e-03 9.4604542603946018e-04 -6.7225933573527401e-03 -7.2900493000570554e-03 -4.5646699438342073e-03 7.1775763919119584e-03 -4.8646125700310515e-04 1.6027687658988840e-04 -3.6809664315624836e-04 -1.0443877079094461e-02 2.2626183023989515e-03 1.2455409662398944e-03 -1.0682847566874839e-02 -1.1259127275175739e-03 2.9256378369523675e-02 240 241 242 312 313 314 327 328 329 255 256 257 243 244 245 315 316 317 330 331 332 258 259 260 2.8049685714814067e-02 5.7203125585012782e-03 4.5080685389522097e-03 -1.5675099079176483e-02 -1.4691051849295329e-02 -1.0165877469026979e-02 -9.4721844465822502e-03 -7.5417424974963468e-03 -1.1100648132604178e-03 9.3831241236627064e-03 1.0721546531302088e-02 1.0550686532122384e-02 6.0120243916163595e-03 8.8065347539060864e-03 4.0813138426628549e-03 -1.2684689750677311e-02 -5.7123462996600399e-03 -8.5417499961131151e-03 -6.8926805074567242e-03 -4.9254013303192314e-03 -4.3216024114287183e-03 1.2798195537996276e-03 7.6221481330614911e-03 4.9992257760917815e-03 5.7203125585012764e-03 5.1087628548540334e-02 2.0686858630701258e-02 -1.7803946078282725e-02 -1.3054993868336353e-02 2.7432297686981388e-03 -1.0348870391678549e-02 -3.2273298502809245e-02 1.3859860753884896e-03 1.1379934209785111e-02 7.4721185195101448e-03 1.0632151530075552e-02 8.8839504723565686e-03 2.6673820105788264e-02 5.1635889247650026e-03 -1.5142015527518369e-02 -1.1199763908364893e-02 -1.5916222934985763e-02 -3.2033680012618897e-03 -2.8110445929823639e-02 -1.8671109007311632e-02 2.0514002758098566e-02 -5.9506496450462273e-04 -6.0244829873310549e-03 4.5080685389522097e-03 2.0686858630701258e-02 4.3604750736787642e-02 -1.3243780444395521e-02 1.2403968267301199e-03 -8.0515492034155414e-04 -6.7895836297669617e-03 -1.2552997680652959e-02 -1.3934499803375309e-04 1.0170737287098752e-02 1.0597717686589285e-02 2.1175455069310702e-02 5.4133150382145506e-03 6.1438890516926584e-03 -5.3037347764677773e-03 -1.4376416971324187e-02 -7.2311842008802463e-03 -2.5503064025540232e-02 -2.7795510854110202e-03 -1.8227181938389136e-02 -2.1906597089002902e-02 1.7097211266632165e-02 -6.5749837579099127e-04 -1.1122309996712130e-02 -1.5675099079176479e-02 -1.7803946078282722e-02 -1.3243780444395517e-02 6.3365951260365247e-02 6.0803050258295722e-03 -1.1442355066275774e-02 2.1099671256119203e-02 1.8506035093970752e-02 -8.7138599534138435e-03 -3.4443873201265650e-02 -3.7082609444072981e-03 -1.5943949408411096e-02 -2.5064118095021688e-02 -2.2987032633534632e-02 9.7694271217994635e-03 3.0267509924534287e-02 3.4747115138188006e-03 1.1462952525849236e-02 1.8476209257083905e-03 2.0898208332279473e-02 1.7600553172732604e-02 -4.1397662991263275e-02 -4.4600203096739240e-03 1.0511012052114948e-02 -1.4691051849295329e-02 -1.3054993868336353e-02 1.2403968267301194e-03 6.0803050258295714e-03 2.4697266826210144e-02 -1.5152558078423773e-03 1.5255951946525112e-02 9.8012032287333097e-03 -4.7822989287086056e-03 -3.5323995100031182e-03 -7.4574464500669494e-03 -2.0629712390804380e-03 -9.8872330306233758e-03 -1.2992115385770112e-02 3.7936972421200956e-03 3.8657638334868333e-03 4.6094739317194041e-03 1.8390377599277487e-03 7.7468490414866302e-03 1.4415730206318771e-03 -8.7474337857966792e-05 -4.8381854574063247e-03 -7.0449613031213221e-03 1.5748684847114252e-03 -1.0165877469026977e-02 2.7432297686981379e-03 -8.0515492034155241e-04 -1.1442355066275774e-02 -1.5152558078423775e-03 2.7102552858308593e-02 -7.3843552222678582e-03 -5.5402884476472049e-03 9.3903917364691197e-03 -9.4858478537118045e-04 -1.5549962021264320e-04 -8.4304788213462130e-04 7.1049937276546158e-03 7.6652771330259330e-03 -1.1144916811628429e-02 6.7030451136533666e-03 1.1270411618338003e-03 -4.5132593678208844e-03 5.5749024409158564e-03 -5.7932272569726625e-03 -9.6054914162933842e-03 1.0558231260717950e-02 1.4687230691170106e-03 -9.5810741965588492e-03 -9.4721844465822502e-03 -1.0348870391678550e-02 -6.7895836297669617e-03 2.1099671256119199e-02 1.5255951946525112e-02 -7.3843552222678582e-03 3.0598075300594985e-02 1.3980084442239370e-02 -5.2485387825808097e-03 -2.1157574274830084e-02 -1.2343327231949660e-02 -1.7146174257557101e-03 -1.1748671745984885e-02 -1.1937647118117019e-02 4.4075844928281758e-03 1.0426227446347445e-02 6.2711839222301504e-03 5.0746187476480298e-03 5.2754674622719740e-03 8.3833619986783230e-03 4.7286600302593193e-03 -2.5021010997936383e-02 -9.2607375679277133e-03 6.9262317896358217e-03 -7.5417424974963477e-03 -3.2273298502809245e-02 -1.2552997680652959e-02 1.8506035093970748e-02 9.8012032287333097e-03 -5.5402884476472057e-03 1.3980084442239369e-02 5.0077284522673897e-02 -1.0151149657226848e-02 -1.3059891767593475e-02 -1.2795646991348613e-02 -9.8787912531111549e-03 -1.3190452723891719e-02 -2.9542000174474267e-02 8.8665838644766855e-03 1.5870942982059287e-02 1.9610524879910343e-03 1.5489289901533157e-02 7.7164095821066134e-03 2.6172263468451345e-02 6.4705369033036669e-03 -2.2281385111394471e-02 -1.3400858039217440e-02 7.2968163693246674e-03 -1.1100648132604178e-03 1.3859860753884907e-03 -1.3934499803375223e-04 -8.7138599534138453e-03 -4.7822989287086056e-03 9.3903917364691180e-03 -5.2485387825808106e-03 -1.0151149657226851e-02 2.7298730822515931e-02 -1.5345670395692560e-03 -9.4956806081258876e-03 -1.1697520691683549e-03 5.2284041542570705e-03 9.5361178796239069e-03 -8.6696452450268306e-03 -3.7197015010682895e-03 4.7490728958485100e-03 -8.5031983941723389e-03 4.7729889130565832e-03 4.5238777166492078e-03 -5.8466019094300095e-03 1.0325339022578959e-02 4.2340746265512206e-03 -1.2360579943153763e-02 9.3831241236627082e-03 1.1379934209785111e-02 1.0170737287098752e-02 -3.4443873201265657e-02 -3.5323995100031182e-03 -9.4858478537117937e-04 -2.1157574274830091e-02 -1.3059891767593475e-02 -1.5345670395692543e-03 4.5718085050537961e-02 3.1565000022399244e-03 1.8380695615631316e-02 9.1668118679126016e-03 1.5369557653170839e-02 -3.5082342308485762e-03 -2.3258094545512850e-02 -2.0400176373035171e-03 -1.7591347736691895e-02 -1.2234465203981412e-02 -1.4535516669456820e-02 -1.4128061673887287e-02 2.6825986183476726e-02 3.2618337191610454e-03 9.1593625636381196e-03 1.0721546531302088e-02 7.4721185195101465e-03 1.0597717686589283e-02 -3.7082609444072977e-03 -7.4574464500669511e-03 -1.5549962021264326e-04 -1.2343327231949659e-02 -1.2795646991348612e-02 -9.4956806081258876e-03 3.1565000022399218e-03 2.6439488196652119e-02 2.7227382146409827e-03 6.1117641481349501e-03 8.3566562171525868e-04 4.9537535008577962e-03 -2.4004702963492342e-03 -5.5938434347120730e-03 -2.4345109231496158e-03 -5.2053119926000974e-03 -1.1953729831568068e-02 -7.4317315190536339e-03 3.6675597836293271e-03 3.0533943698181753e-03 1.2432132684537182e-03 1.0550686532122384e-02 1.0632151530075558e-02 2.1175455069310702e-02 -1.5943949408411096e-02 -2.0629712390804376e-03 -8.4304788213462011e-04 -1.7146174257557112e-03 -9.8787912531111566e-03 -1.1697520691683568e-03 1.8380695615631312e-02 2.7227382146409835e-03 4.3128926307671005e-02 5.3327468451434493e-03 1.4398417883821235e-02 -9.0219147712247930e-03 -1.6650513169998833e-02 -1.9683638609631288e-03 -2.1615718666804933e-02 -7.3536149958378658e-03 -1.4799769502693016e-02 -2.5445540458506059e-02 7.3985660071063481e-03 9.5658822730995219e-04 -6.2084075291429525e-03 6.0120243916163586e-03 8.8839504723565686e-03 5.4133150382145506e-03 -2.5064118095021688e-02 -9.8872330306233758e-03 7.1049937276546149e-03 -1.1748671745984885e-02 -1.3190452723891716e-02 5.2284041542570705e-03 9.1668118679125998e-03 6.1117641481349492e-03 5.3327468451434485e-03 3.2472803074744712e-02 1.4501807632936913e-02 -4.9863673674428602e-03 -2.1457756719894368e-02 -1.2074695462879804e-02 -3.0437452439747385e-03 -9.0392457977361146e-03 -1.0671465470785860e-02 -7.2291781986168644e-03 1.9658153024363367e-02 1.6326324434752314e-02 -7.8201689552352301e-03 8.8065347539060864e-03 2.6673820105788264e-02 6.1438890516926610e-03 -2.2987032633534632e-02 -1.2992115385770112e-02 7.6652771330259330e-03 -1.1937647118117019e-02 -2.9542000174474271e-02 9.5361178796239069e-03 1.5369557653170838e-02 8.3566562171525911e-04 1.4398417883821237e-02 1.4501807632936915e-02 5.1101675818992789e-02 -9.4337434899073504e-03 -1.3402267970886162e-02 -1.2147927251985281e-02 -1.1010074133376561e-02 -6.1675192107470255e-03 -3.1653004714623290e-02 -1.2410776646999423e-02 1.5816566893270982e-02 7.7238859803566125e-03 -4.8891076778804134e-03 4.0813138426628558e-03 5.1635889247650018e-03 -5.3037347764677790e-03 9.7694271217994635e-03 3.7936972421200956e-03 -1.1144916811628429e-02 4.4075844928281758e-03 8.8665838644766855e-03 -8.6696452450268306e-03 -3.5082342308485762e-03 4.9537535008577962e-03 -9.0219147712247930e-03 -4.9863673674428611e-03 -9.4337434899073522e-03 2.8025568563593353e-02 -1.3446239630616065e-03 -9.1958937411282683e-03 -1.1470424887666784e-03 -1.3842487630090032e-03 7.8215077071031947e-04 -7.6533103444057968e-04 -7.0348511329284408e-03 -4.9301370718942746e-03 8.0270165639617433e-03 -1.2684689750677309e-02 -1.5142015527518369e-02 -1.4376416971324189e-02 3.0267509924534291e-02 3.8657638334868333e-03 6.7030451136533666e-03 1.0426227446347448e-02 1.5870942982059287e-02 -3.7197015010682886e-03 -2.3258094545512847e-02 -2.4004702963492329e-03 -1.6650513169998833e-02 -2.1457756719894368e-02 -1.3402267970886162e-02 -1.3446239630616065e-03 4.2684630769329740e-02 2.7981825220219411e-03 1.9199626589539810e-02 8.4952043347871313e-03 1.1658580032467019e-02 1.0979063617928822e-02 -3.4473031458914047e-02 -3.2487155752813049e-03 -7.9047971566907410e-04 -5.7123462996600399e-03 -1.1199763908364893e-02 -7.2311842008802463e-03 3.4747115138188006e-03 4.6094739317194041e-03 1.1270411618338001e-03 6.2711839222301504e-03 1.9610524879910343e-03 4.7490728958485100e-03 -2.0400176373035167e-03 -5.5938434347120730e-03 -1.9683638609631288e-03 -1.2074695462879802e-02 -1.2147927251985283e-02 -9.1958937411282683e-03 2.7981825220219411e-03 2.2801348346444341e-02 2.5378852953743692e-03 1.0278749904371019e-02 7.2649550148327271e-03 9.8242099976487644e-03 -2.9957684625985504e-03 -7.6952951859252505e-03 1.5723245226620093e-04 -8.5417499961131151e-03 -1.5916222934985767e-02 -2.5503064025540232e-02 1.1462952525849234e-02 1.8390377599277487e-03 -4.5132593678208878e-03 5.0746187476480298e-03 1.5489289901533157e-02 -8.5031983941723406e-03 -1.7591347736691895e-02 -2.4345109231496158e-03 -2.1615718666804933e-02 -3.0437452439747385e-03 -1.1010074133376560e-02 -1.1470424887666788e-03 1.9199626589539814e-02 2.5378852953743688e-03 4.0677851521858405e-02 9.3710731242749867e-03 1.1549061902404956e-02 2.1605602643075688e-02 -1.5931428010532305e-02 -2.0544668677282777e-03 -1.0011712218290217e-03 -6.8926805074567242e-03 -3.2033680012618902e-03 -2.7795510854110206e-03 1.8476209257083909e-03 7.7468490414866302e-03 5.5749024409158555e-03 5.2754674622719766e-03 7.7164095821066142e-03 4.7729889130565823e-03 -1.2234465203981413e-02 -5.2053119926000965e-03 -7.3536149958378667e-03 -9.0392457977361129e-03 -6.1675192107470255e-03 -1.3842487630090032e-03 8.4952043347871313e-03 1.0278749904371019e-02 9.3710731242749867e-03 2.6254214378330178e-02 4.2783801270332615e-03 3.4809161217514346e-03 -1.3706115591923414e-02 -1.5444189450388508e-02 -1.1682465755740969e-02 -4.9254013303192314e-03 -2.8110445929823643e-02 -1.8227181938389132e-02 2.0898208332279473e-02 1.4415730206318777e-03 -5.7932272569726617e-03 8.3833619986783230e-03 2.6172263468451341e-02 4.5238777166492104e-03 -1.4535516669456822e-02 -1.1953729831568068e-02 -1.4799769502693016e-02 -1.0671465470785856e-02 -3.1653004714623283e-02 7.8215077071032055e-04 1.1658580032467019e-02 7.2649550148327271e-03 1.1549061902404952e-02 4.2783801270332624e-03 4.8738523334538625e-02 1.9986610654311430e-02 -1.5086147019896152e-02 -1.1900134362439550e-02 1.9784776539789055e-03 -4.3216024114287191e-03 -1.8671109007311629e-02 -2.1906597089002902e-02 1.7600553172732604e-02 -8.7474337857966304e-05 -9.6054914162933842e-03 4.7286600302593202e-03 6.4705369033036669e-03 -5.8466019094300077e-03 -1.4128061673887287e-02 -7.4317315190536356e-03 -2.5445540458506059e-02 -7.2291781986168636e-03 -1.2410776646999423e-02 -7.6533103444057903e-04 1.0979063617928818e-02 9.8242099976487644e-03 2.1605602643075688e-02 3.4809161217514350e-03 1.9986610654311433e-02 4.2305034181870940e-02 -1.1110350658739297e-02 2.3197339559588043e-03 -3.4107491727370298e-04 1.2798195537996281e-03 2.0514002758098566e-02 1.7097211266632165e-02 -4.1397662991263275e-02 -4.8381854574063229e-03 1.0558231260717950e-02 -2.5021010997936383e-02 -2.2281385111394464e-02 1.0325339022578959e-02 2.6825986183476723e-02 3.6675597836293254e-03 7.3985660071063447e-03 1.9658153024363367e-02 1.5816566893270986e-02 -7.0348511329284399e-03 -3.4473031458914054e-02 -2.9957684625985504e-03 -1.5931428010532302e-02 -1.3706115591923414e-02 -1.5086147019896152e-02 -1.1110350658739299e-02 6.6833862278397382e-02 5.2033566162966016e-03 -1.1302717754835389e-02 7.6221481330614902e-03 -5.9506496450462284e-04 -6.5749837579099073e-04 -4.4600203096739248e-03 -7.0449613031213221e-03 1.4687230691170108e-03 -9.2607375679277133e-03 -1.3400858039217440e-02 4.2340746265512198e-03 3.2618337191610463e-03 3.0533943698181762e-03 9.5658822730995241e-04 1.6326324434752314e-02 7.7238859803566134e-03 -4.9301370718942738e-03 -3.2487155752813049e-03 -7.6952951859252505e-03 -2.0544668677282777e-03 -1.5444189450388508e-02 -1.1900134362439554e-02 2.3197339559588043e-03 5.2033566162965990e-03 2.9859033505033390e-02 -1.3370175635234441e-03 4.9992257760917815e-03 -6.0244829873310549e-03 -1.1122309996712128e-02 1.0511012052114948e-02 1.5748684847114252e-03 -9.5810741965588492e-03 6.9262317896358217e-03 7.2968163693246674e-03 -1.2360579943153763e-02 9.1593625636381178e-03 1.2432132684537180e-03 -6.2084075291429551e-03 -7.8201689552352318e-03 -4.8891076778804126e-03 8.0270165639617433e-03 -7.9047971566907366e-04 1.5723245226620061e-04 -1.0011712218290199e-03 -1.1682465755740969e-02 1.9784776539789042e-03 -3.4107491727370211e-04 -1.1302717754835387e-02 -1.3370175635234439e-03 3.2587601240708676e-02 126 127 128 198 199 200 213 214 215 141 142 143 129 130 131 201 202 203 216 217 218 144 145 146 3.2846888171983057e-02 8.9311259144860891e-03 1.2511061362147856e-02 -2.5074359541247197e-02 -5.0571899888100019e-03 -1.2118534933711827e-02 -2.1430977313596496e-02 -1.1681796705992753e-02 -5.3834564952611281e-03 1.1869519062695547e-02 1.6261939560946017e-03 1.2380749403650608e-02 1.7361704651491294e-02 1.2110988282334987e-02 1.0809498760981301e-02 -1.4688666621433141e-02 2.3197389869511996e-03 -1.2666873395028047e-02 -1.1579769061729209e-02 -8.5525859543830827e-03 -1.1204322843587040e-02 1.0695660651836143e-02 3.0352550931896273e-04 5.6718781408082652e-03 8.9311259144860908e-03 3.6062785074101718e-02 1.5166772697967497e-02 -6.9940764672146282e-03 -8.6513162746101283e-04 4.8850234099375349e-03 -1.4725798375085744e-02 -1.9452478277056321e-02 -3.6424523526977551e-03 2.4012451705217510e-03 -5.2398462883719247e-03 1.8286852457237478e-03 1.1658228560526982e-02 1.5321737971849086e-02 6.8532557754901469e-03 -5.3380044078672117e-03 2.1563555695181848e-04 -7.7532025727776246e-03 -7.4106004128220090e-03 -1.6037614583398994e-02 -1.3700946555510879e-02 1.1477880017454780e-02 -1.0005087826614353e-02 -3.6371356481326817e-03 1.2511061362147854e-02 1.5166772697967498e-02 4.5784261748415885e-02 -1.4159787385388450e-02 5.6805533834033226e-03 -8.4719077774047177e-03 -1.5949498192367479e-02 -1.1290303413278496e-02 -7.6950708935623396e-03 1.2411733472659083e-02 1.8417402692565085e-03 2.2889552210793748e-02 1.1173480168274607e-02 6.7185288234927493e-03 3.1166834103380295e-03 -1.2998158937039515e-02 4.2842821333279324e-03 -2.7874341874098610e-02 -1.0070953013880633e-02 -1.4227874677749702e-02 -2.4496808438330721e-02 1.7082122525594531e-02 -8.1736992164198052e-03 -3.2523683861513026e-03 -2.5074359541247201e-02 -6.9940764672146299e-03 -1.4159787385388450e-02 5.5881181505078252e-02 -1.4177725959936199e-02 -6.2307743053402389e-04 3.2494847616890477e-02 5.3889091602279332e-03 -8.7512943355076884e-04 -2.5883338564554815e-02 1.2433909426640962e-02 -1.8041779780618411e-02 -3.6012405630802928e-02 -1.0442138835197528e-02 1.2032923508894457e-03 2.1901371099403134e-02 -1.1046636265084141e-02 1.4101233556193995e-02 1.1909646809121892e-02 1.2132314094085082e-02 1.7656960198061050e-02 -3.5216943293888803e-02 1.2705444846478512e-02 7.3828792494718353e-04 -5.0571899888100019e-03 -8.6513162746101370e-04 5.6805533834033218e-03 -1.4177725959936200e-02 2.8402802683584603e-02 4.3382755464663647e-04 1.6057356629138708e-03 -4.7263011732147121e-03 2.0347202856512109e-04 9.9250729346442856e-03 -1.3841525853681249e-02 8.2616155057577464e-03 3.8310392989922876e-03 -1.3007105686351958e-04 -1.7833211081349278e-04 -9.8598379088504530e-03 1.1375855282518017e-02 -5.7613935305539333e-03 6.7627848417829901e-04 -8.9917146058349894e-03 -8.4094759382239356e-03 1.3056627476867913e-02 -1.1223913649047139e-02 -2.3026689278147437e-04 -1.2118534933711827e-02 4.8850234099375349e-03 -8.4719077774047160e-03 -6.2307743053402400e-04 4.3382755464663658e-04 2.2408839169904774e-02 -8.0897985134276867e-04 -1.3131848784593192e-04 4.5999920863356580e-03 -6.2442094428756065e-03 2.8019633553069516e-03 -7.7941731017557546e-03 1.4782882687334679e-03 3.1951356130620161e-04 -7.1145550841641659e-03 1.1309311768393844e-02 -4.3508814034458974e-03 3.9661483848273064e-03 5.8422432452756405e-03 -3.5532337448876778e-03 -1.9321854572854379e-03 1.1649583760612715e-03 -4.0489424501781451e-04 -5.6621582204576630e-03 -2.1430977313596496e-02 -1.4725798375085745e-02 -1.5949498192367479e-02 3.2494847616890477e-02 1.6057356629138716e-03 -8.0897985134276845e-04 5.0088928294139863e-02 1.8101076897234912e-02 -8.7262263132705810e-04 -2.6741644670811679e-02 1.2503067948516731e-03 -1.2605881631897941e-02 -2.9661629977095760e-02 -1.5933036361748764e-02 1.0056910609945186e-03 1.3636939698272548e-02 -6.9328062645472605e-03 1.6047094366483522e-02 1.7734537277872175e-02 1.2832743648383563e-02 1.2192025340705667e-02 -3.6121000925671144e-02 3.8017779979977453e-03 9.9217153875155446e-04 -1.1681796705992753e-02 -1.9452478277056325e-02 -1.1290303413278496e-02 5.3889091602279324e-03 -4.7263011732147104e-03 -1.3131848784593225e-04 1.8101076897234912e-02 3.4820844413187682e-02 -7.5223966194699703e-04 -2.7678194684033978e-04 -9.2553905915260986e-04 -8.2225209092329464e-03 -1.6569891371204539e-02 -1.6542981440981420e-02 5.9722343336981998e-04 3.8062638555411603e-03 -9.3617551996257632e-03 1.1763430265637823e-02 1.1644998935134255e-02 1.6537830906325265e-02 7.8017527390949731e-03 -1.0412778824100626e-02 -3.4962016948212357e-04 2.3397603420176872e-04 -5.3834564952611281e-03 -3.6424523526977547e-03 -7.6950708935623379e-03 -8.7512943355076873e-04 2.0347202856512119e-04 4.5999920863356580e-03 -8.7262263132705940e-04 -7.5223966194699725e-04 2.2841904189771684e-02 -1.1245361649706735e-02 -7.2575838260333370e-03 -8.6282456398396341e-03 1.3926263344932268e-03 8.2928977440282104e-04 -5.6378289343133768e-03 5.0364234905302110e-03 4.6767649337521667e-03 -2.0051328396365705e-03 1.0259714284884876e-02 6.1195216660649690e-03 3.8644334319923685e-03 1.6878060999373752e-03 -1.7677256210698952e-04 -7.3400514007477841e-03 1.1869519062695547e-02 2.4012451705217510e-03 1.2411733472659085e-02 -2.5883338564554815e-02 9.9250729346442874e-03 -6.2442094428756074e-03 -2.6741644670811686e-02 -2.7678194684034184e-04 -1.1245361649706735e-02 3.6008982807866220e-02 -7.8997918795638070e-03 1.5157120531136140e-02 1.2340633163783516e-02 4.0662350829249998e-03 4.8341881279136854e-03 -1.4279779245391977e-02 7.8882520266403237e-03 -1.3724596045936541e-02 -1.4750693797347319e-02 -5.8812809106891621e-03 -1.3586504043362212e-02 2.1436321243760510e-02 -1.0222950477638045e-02 1.2397629050172167e-02 1.6261939560946017e-03 -5.2398462883719238e-03 1.8417402692565068e-03 1.2433909426640962e-02 -1.3841525853681249e-02 2.8019633553069525e-03 1.2503067948516724e-03 -9.2553905915260899e-04 -7.2575838260333370e-03 -7.8997918795638087e-03 3.1160509392716015e-02 -1.1389377362965655e-02 -6.4137030563488967e-03 -1.0125367127637237e-02 4.7383429305729811e-03 6.8856222012864798e-03 -1.1386449067268290e-02 1.0504445219575139e-02 1.7224531966188131e-03 -1.4670045149565612e-04 3.8232467114714180e-03 -9.6049906395798273e-03 1.0504918454890953e-02 -5.0627772971839988e-03 1.2380749403650608e-02 1.8286852457237487e-03 2.2889552210793748e-02 -1.8041779780618411e-02 8.2616155057577481e-03 -7.7941731017557546e-03 -1.2605881631897940e-02 -8.2225209092329481e-03 -8.6282456398396358e-03 1.5157120531136140e-02 -1.1389377362965653e-02 4.6142189006939796e-02 1.5421737033911529e-02 1.1201331491672470e-02 -3.2923319353234228e-03 -1.2557725078720642e-02 1.1026222640622743e-02 -2.4847977955057821e-02 -1.1879122760535040e-02 -7.9786883171442773e-03 -2.7848993373875114e-02 1.2124902283073757e-02 -4.7272682944338234e-03 3.3799807881181938e-03 1.7361704651491294e-02 1.1658228560526984e-02 1.1173480168274606e-02 -3.6012405630802921e-02 3.8310392989922872e-03 1.4782882687334688e-03 -2.9661629977095760e-02 -1.6569891371204539e-02 1.3926263344932268e-03 1.2340633163783516e-02 -6.4137030563488967e-03 1.5421737033911529e-02 5.2104439120964713e-02 1.7515755790304122e-02 -7.1530233504985300e-04 -2.5020622864035960e-02 1.3912515533757172e-03 -1.2326107416794480e-02 -2.0678157728411029e-02 -1.5080263197123366e-02 -1.5723098555536164e-02 2.9566039264106163e-02 3.6675824214777060e-03 -7.0162349803235251e-04 1.2110988282334987e-02 1.5321737971849086e-02 6.7185288234927502e-03 -1.0442138835197528e-02 -1.3007105686351937e-04 3.1951356130620161e-04 -1.5933036361748764e-02 -1.6542981440981420e-02 8.2928977440282126e-04 4.0662350829250016e-03 -1.0125367127637239e-02 1.1201331491672470e-02 1.7515755790304118e-02 3.7083989222323921e-02 -6.7415186672284096e-04 6.1383545900538152e-04 4.4687795396810550e-05 -7.8724151393527193e-03 -1.0796273447085950e-02 -1.9662910462383731e-02 -1.0708199414646014e-02 2.8646340294627604e-03 -5.9890849017038960e-03 1.8610276984731817e-04 1.0809498760981305e-02 6.8532557754901477e-03 3.1166834103380290e-03 1.2032923508894452e-03 -1.7833211081349286e-04 -7.1145550841641668e-03 1.0056910609945186e-03 5.9722343336982020e-04 -5.6378289343133759e-03 4.8341881279136854e-03 4.7383429305729811e-03 -3.2923319353234223e-03 -7.1530233504985300e-04 -6.7415186672284064e-04 2.5536638095236746e-02 -1.1328739374078470e-02 -7.3547617354241040e-03 -7.9269056923244267e-03 -5.1370001682828174e-03 -3.9109033466059439e-03 -7.9509657449898189e-03 -6.7162842336781125e-04 -7.0673079866567860e-05 3.2692658855404308e-03 -1.4688666621433137e-02 -5.3380044078672109e-03 -1.2998158937039511e-02 2.1901371099403127e-02 -9.8598379088504547e-03 1.1309311768393844e-02 1.3636939698272548e-02 3.8062638555411599e-03 5.0364234905302110e-03 -1.4279779245391977e-02 6.8856222012864798e-03 -1.2557725078720643e-02 -2.5020622864035964e-02 6.1383545900538022e-04 -1.1328739374078470e-02 3.2240017777073707e-02 -7.9939776575728462e-03 1.4502254202484891e-02 1.1281698621305810e-02 2.4346814088941323e-03 1.2082306039231308e-02 -2.5070958465194117e-02 9.4514170495633501e-03 -6.0456721108016172e-03 2.3197389869511996e-03 2.1563555695181869e-04 4.2842821333279324e-03 -1.1046636265084141e-02 1.1375855282518017e-02 -4.3508814034458982e-03 -6.9328062645472623e-03 -9.3617551996257615e-03 4.6767649337521675e-03 7.8882520266403237e-03 -1.1386449067268288e-02 1.1026222640622743e-02 1.3912515533757175e-03 4.4687795396807515e-05 -7.3547617354241040e-03 -7.9939776575728445e-03 2.9078330865573633e-02 -1.1947316862924393e-02 1.5117295701057691e-03 -5.7092716131718867e-03 5.6753274355488600e-04 1.2862448050131238e-02 -1.4257033620374334e-02 3.0981575505366556e-03 -1.2666873395028047e-02 -7.7532025727776246e-03 -2.7874341874098610e-02 1.4101233556193993e-02 -5.7613935305539325e-03 3.9661483848273072e-03 1.6047094366483525e-02 1.1763430265637819e-02 -2.0051328396365710e-03 -1.3724596045936541e-02 1.0504445219575139e-02 -2.4847977955057818e-02 -1.2326107416794480e-02 -7.8724151393527193e-03 -7.9269056923244267e-03 1.4502254202484887e-02 -1.1947316862924395e-02 4.3677643564901537e-02 1.1916846342936016e-02 3.1386480066655023e-03 2.3114994176388556e-02 -1.7849851610339359e-02 7.9278046137301987e-03 -8.1044277649999566e-03 -1.1579769061729209e-02 -7.4106004128220099e-03 -1.0070953013880632e-02 1.1909646809121894e-02 6.7627848417829944e-04 5.8422432452756405e-03 1.7734537277872175e-02 1.1644998935134255e-02 1.0259714284884876e-02 -1.4750693797347319e-02 1.7224531966188133e-03 -1.1879122760535040e-02 -2.0678157728411029e-02 -1.0796273447085950e-02 -5.1370001682828174e-03 1.1281698621305812e-02 1.5117295701057687e-03 1.1916846342936016e-02 2.9882802728054821e-02 8.6287055598746297e-03 1.1691576527611821e-02 -2.3800064848867160e-02 -5.9772918860038085e-03 -1.2623304458009854e-02 -8.5525859543830809e-03 -1.6037614583398994e-02 -1.4227874677749700e-02 1.2132314094085082e-02 -8.9917146058349877e-03 -3.5532337448876796e-03 1.2832743648383563e-02 1.6537830906325268e-02 6.1195216660649690e-03 -5.8812809106891621e-03 -1.4670045149565633e-04 -7.9786883171442773e-03 -1.5080263197123370e-02 -1.9662910462383727e-02 -3.9109033466059439e-03 2.4346814088941323e-03 -5.7092716131718867e-03 3.1386480066655023e-03 8.6287055598746280e-03 3.4666196500728427e-02 1.5393349047207378e-02 -6.5143146490417927e-03 -6.5581569076844691e-04 5.0191813664497622e-03 -1.1204322843587038e-02 -1.3700946555510879e-02 -2.4496808438330717e-02 1.7656960198061046e-02 -8.4094759382239356e-03 -1.9321854572854379e-03 1.2192025340705667e-02 7.8017527390949739e-03 3.8644334319923690e-03 -1.3586504043362211e-02 3.8232467114714189e-03 -2.7848993373875114e-02 -1.5723098555536164e-02 -1.0708199414646014e-02 -7.9509657449898189e-03 1.2082306039231307e-02 5.6753274355488567e-04 2.3114994176388556e-02 1.1691576527611823e-02 1.5393349047207379e-02 4.3629182610988734e-02 -1.3108942663124437e-02 5.2327406670521614e-03 -8.3796572048885597e-03 1.0695660651836140e-02 1.1477880017454778e-02 1.7082122525594531e-02 -3.5216943293888803e-02 1.3056627476867911e-02 1.1649583760612720e-03 -3.6121000925671151e-02 -1.0412778824100627e-02 1.6878060999373752e-03 2.1436321243760510e-02 -9.6049906395798273e-03 1.2124902283073757e-02 2.9566039264106166e-02 2.8646340294627591e-03 -6.7162842336781169e-04 -2.5070958465194117e-02 1.2862448050131238e-02 -1.7849851610339359e-02 -2.3800064848867153e-02 -6.5143146490417945e-03 -1.3108942663124439e-02 5.8510946373918404e-02 -1.3729505461194428e-02 -4.2936658783534830e-04 3.0352550931896322e-04 -1.0005087826614353e-02 -8.1736992164198070e-03 1.2705444846478516e-02 -1.1223913649047139e-02 -4.0489424501781435e-04 3.8017779979977457e-03 -3.4962016948212270e-04 -1.7677256210698933e-04 -1.0222950477638045e-02 1.0504918454890953e-02 -4.7272682944338226e-03 3.6675824214777069e-03 -5.9890849017038960e-03 -7.0673079866567982e-05 9.4514170495633501e-03 -1.4257033620374334e-02 7.9278046137301987e-03 -5.9772918860038077e-03 -6.5581569076844561e-04 5.2327406670521605e-03 -1.3729505461194429e-02 3.1975637403099333e-02 3.9276211706265032e-04 5.6718781408082652e-03 -3.6371356481326817e-03 -3.2523683861513022e-03 7.3828792494718364e-04 -2.3026689278147437e-04 -5.6621582204576630e-03 9.9217153875155359e-04 2.3397603420176845e-04 -7.3400514007477841e-03 1.2397629050172167e-02 -5.0627772971839997e-03 3.3799807881181921e-03 -7.0162349803235251e-04 1.8610276984731811e-04 3.2692658855404313e-03 -6.0456721108016163e-03 3.0981575505366564e-03 -8.1044277649999566e-03 -1.2623304458009852e-02 5.0191813664497631e-03 -8.3796572048885579e-03 -4.2936658783534782e-04 3.9276211706265032e-04 2.6089416303586643e-02 198 199 200 270 271 272 285 286 287 213 214 215 201 202 203 273 274 275 288 289 290 216 217 218 3.7541519446038868e-02 1.0213478879786582e-02 1.4411313069090511e-02 -2.9356305168091082e-02 -5.5581068867754501e-03 -1.3865567430673204e-02 -2.4459700735472073e-02 -1.3105060583360056e-02 -6.0652215130884675e-03 1.3902337943423338e-02 1.7338493186218537e-03 1.4269826163427457e-02 2.0360013837363002e-02 1.3597605032212051e-02 1.2361503932989378e-02 -1.7360456394464867e-02 2.5260683783304631e-03 -1.4586622120432042e-02 -1.3365391471906587e-02 -9.6734938272468856e-03 -1.2941324778009525e-02 1.2737982543109413e-02 2.6565968843143297e-04 6.4160926766958816e-03 1.0213478879786584e-02 4.0468339278675158e-02 1.6823473323718745e-02 -7.7487811223136060e-03 -1.8419346891326977e-03 5.2237746379069023e-03 -1.6552213546621501e-02 -2.1585606013577459e-02 -4.1659160039515201e-03 2.7728730549129951e-03 -5.5081374615293119e-03 2.2542390707088180e-03 1.3092080725256543e-02 1.7361004030446471e-02 7.7618699725336754e-03 -6.0696370339963154e-03 -4.0324428377317800e-04 -8.6521333665453472e-03 -8.4794683552776948e-03 -1.7750925047537714e-02 -1.5341286655780488e-02 1.2771667398252999e-02 -1.0739495813571268e-02 -3.9040209785908015e-03 1.4411313069090511e-02 1.6823473323718745e-02 5.1409619620914261e-02 -1.5838238775094018e-02 6.1761463916520003e-03 -1.0519104544841420e-02 -1.7920356651444078e-02 -1.2464218144951205e-02 -8.7740727804043357e-03 1.4185852388808030e-02 1.9736423472057852e-03 2.5832148086947049e-02 1.2415386539084746e-02 7.3991666574818350e-03 4.2642167850609402e-03 -1.4923614283415414e-02 4.6245841182785997e-03 -3.1529853901580661e-02 -1.1520873205378632e-02 -1.5599747531946052e-02 -2.7472276149806414e-02 1.9190530918348860e-02 -8.9330471614397101e-03 -3.2106771162894402e-03 -2.9356305168091082e-02 -7.7487811223136051e-03 -1.5838238775094018e-02 6.3123839746981450e-02 -1.5720819314247417e-02 -2.2820050535354462e-04 3.6692567994894169e-02 6.0830896008968304e-03 -7.7980617134469480e-04 -2.9482323390349223e-02 1.3763603442371736e-02 -2.0431029310033405e-02 -4.0781188068603862e-02 -1.1531228145237701e-02 1.0157841837535465e-03 2.5518986022975657e-02 -1.2176044519992144e-02 1.5689600635504706e-02 1.3942873531949462e-02 1.3373793939594023e-02 1.9919087511669091e-02 -3.9658450669756574e-02 1.3956386118928290e-02 6.5280243089834409e-04 -5.5581068867754501e-03 -1.8419346891326959e-03 6.1761463916520020e-03 -1.5720819314247417e-02 3.1932294389165415e-02 3.0088877159432009e-04 1.7266237446489736e-03 -4.9389435165378606e-03 2.7613251723654104e-04 1.1205918304588815e-02 -1.5408256093112412e-02 9.2573316517265084e-03 4.2096395618287522e-03 -6.4951565040670010e-04 -1.7646234304754188e-04 -1.1061421400783620e-02 1.2919906760377428e-02 -6.3865253240925389e-03 6.3268504135491918e-04 -9.6295450425373675e-03 -9.2734043129640131e-03 1.4565480949385031e-02 -1.2384006157815821e-02 -1.7410735210529100e-04 -1.3865567430673204e-02 5.2237746379069023e-03 -1.0519104544841418e-02 -2.2820050535354535e-04 3.0088877159431987e-04 2.5355374833614865e-02 -5.4076705850487764e-04 -1.0300116570145734e-05 5.2563337231870989e-03 -7.1781316664452453e-03 3.2066118508988586e-03 -9.0968195778213020e-03 1.2256782043293245e-03 2.5531569784480136e-04 -8.2157032355320535e-03 1.3002751785455369e-02 -4.9667563898633926e-03 5.1852725760920069e-03 6.6972082933206391e-03 -3.7467192700162705e-03 -1.6433591845218646e-03 8.8702837787153896e-04 -2.6281518179507293e-04 -6.3219945901773298e-03 -2.4459700735472076e-02 -1.6552213546621501e-02 -1.7920356651444078e-02 3.6692567994894169e-02 1.7266237446489723e-03 -5.4076705850487797e-04 5.5624986197107415e-02 2.0110795417278695e-02 -8.1122702214456806e-04 -3.0189152851429236e-02 1.4738973404379398e-03 -1.4462438471496048e-02 -3.3327793704639501e-02 -1.7713985788971424e-02 8.3422779461693507e-04 1.5968871870902193e-02 -7.5302605794660710e-03 1.8004109594554566e-02 2.0226805612135208e-02 1.4307230833306820e-02 1.3911178554761908e-02 -4.0536584383498178e-02 4.1779125793865671e-03 9.8527325965618831e-04 -1.3105060583360053e-02 -2.1585606013577459e-02 -1.2464218144951205e-02 6.0830896008968339e-03 -4.9389435165378588e-03 -1.0300116570145572e-05 2.0110795417278695e-02 3.8124268883739904e-02 -7.0561659571193871e-04 -5.8357311875691640e-04 -1.0829091848236151e-03 -9.2388371265249465e-03 -1.8353424604079519e-02 -1.8224161680516913e-02 4.5774548758222868e-04 4.4825640784412592e-03 -9.9934404589813834e-03 1.2985348737010106e-02 1.3023913502688259e-02 1.8201602806741123e-02 8.8246913319917769e-03 -1.1658304293108563e-02 -5.0081083604380100e-04 1.5118642717414356e-04 -6.0652215130884684e-03 -4.1659160039515201e-03 -8.7740727804043375e-03 -7.7980617134469524e-04 2.7613251723654098e-04 5.2563337231870981e-03 -8.1122702214456697e-04 -7.0561659571193849e-04 2.4977904070510495e-02 -1.2473595107487051e-02 -7.9451837839679233e-03 -9.6703390444508736e-03 1.3650288335359465e-03 7.8693502838766678e-04 -6.2684476282145827e-03 5.7133849959126511e-03 5.1078964345037331e-03 -1.8883851748720242e-03 1.1410129790280187e-02 6.7785027453561141e-03 4.4708131238451474e-03 1.6413061943359923e-03 -1.3275034185267686e-04 -8.1038062896009230e-03 1.3902337943423338e-02 2.7728730549129946e-03 1.4185852388808030e-02 -2.9482323390349226e-02 1.1205918304588815e-02 -7.1781316664452444e-03 -3.0189152851429243e-02 -5.8357311875691640e-04 -1.2473595107487049e-02 4.0245561740501021e-02 -8.9240907842842825e-03 1.7330666223902134e-02 1.4438954948979092e-02 4.6459966556325590e-03 5.5883014141615943e-03 -1.6536242867679525e-02 8.8634350901449308e-03 -1.5662428355543549e-02 -1.6921208483147012e-02 -6.6654805850703573e-03 -1.5595633479013861e-02 2.4542072959701549e-02 -1.1315078617167747e-02 1.3804968581617930e-02 1.7338493186218546e-03 -5.5081374615293084e-03 1.9736423472057852e-03 1.3763603442371732e-02 -1.5408256093112409e-02 3.2066118508988590e-03 1.4738973404379390e-03 -1.0829091848236154e-03 -7.9451837839679216e-03 -8.9240907842842825e-03 3.4226279154919610e-02 -1.2641257355517424e-02 -7.0570127754367431e-03 -1.0874839728240267e-02 5.1287533831285113e-03 7.8109906600988205e-03 -1.2607731675392255e-02 1.1579176550032266e-02 2.0208327248338221e-03 -3.8207546654263694e-04 4.2571793506586209e-03 -1.0822069926643148e-02 1.1637670454720885e-02 -5.5589223424386824e-03 1.4269826163427457e-02 2.2542390707088180e-03 2.5832148086947049e-02 -2.0431029310033405e-02 9.2573316517265084e-03 -9.0968195778213020e-03 -1.4462438471496052e-02 -9.2388371265249465e-03 -9.6703390444508718e-03 1.7330666223902134e-02 -1.2641257355517422e-02 5.1324506619162810e-02 1.7427287928775511e-02 1.2371133953382308e-02 -3.1497565409439035e-03 -1.4503183270528974e-02 1.2182436926349681e-02 -2.7939427363974048e-02 -1.3601482723131711e-02 -8.8433580026698981e-03 -3.1346677675033574e-02 1.3970353459085037e-02 -5.3416891174550545e-03 4.0463654961138164e-03 2.0360013837363002e-02 1.3092080725256545e-02 1.2415386539084746e-02 -4.0781188068603869e-02 4.2096395618287513e-03 1.2256782043293245e-03 -3.3327793704639501e-02 -1.8353424604079519e-02 1.3650288335359461e-03 1.4438954948979092e-02 -7.0570127754367423e-03 1.7427287928775511e-02 5.9091527503449329e-02 1.9430368773235989e-02 -3.8468441963098517e-04 -2.9708911622263346e-02 1.1597899736672211e-03 -1.3745012266374732e-02 -2.3728423001058124e-02 -1.6681168240225107e-02 -1.7723691715681073e-02 3.3655820106773413e-02 4.1997265857528533e-03 -5.7999310403876187e-04 1.3597605032212051e-02 1.7361004030446471e-02 7.3991666574818368e-03 -1.1531228145237701e-02 -6.4951565040670032e-04 2.5531569784480163e-04 -1.7713985788971424e-02 -1.8224161680516913e-02 7.8693502838766678e-04 4.6459966556325599e-03 -1.0874839728240267e-02 1.2371133953382307e-02 1.9430368773235989e-02 4.1673584986632331e-02 -5.0691235802622790e-04 6.3415330943774988e-04 -1.3353293037031029e-03 -8.4824217818313015e-03 -1.2190054796003671e-02 -2.1874274765386222e-02 -1.1977286607816436e-02 3.1271449596944473e-03 -6.0764678888255933e-03 1.5406941057733678e-04 1.2361503932989378e-02 7.7618699725336754e-03 4.2642167850609368e-03 1.0157841837535456e-03 -1.7646234304754212e-04 -8.2157032355320517e-03 8.3422779461693540e-04 4.5774548758222868e-04 -6.2684476282145827e-03 5.5883014141615952e-03 5.1287533831285113e-03 -3.1497565409439035e-03 -3.8468441963098501e-04 -5.0691235802622779e-04 2.9067148431471325e-02 -1.3098337935213374e-02 -8.1317548649207649e-03 -1.0282427210815953e-02 -5.9371562850667045e-03 -4.4572291782790582e-03 -9.3928994084548634e-03 -3.7963868561039226e-04 -7.6010098970820592e-05 3.9778688074290991e-03 -1.7360456394464863e-02 -6.0696370339963154e-03 -1.4923614283415414e-02 2.5518986022975657e-02 -1.1061421400783620e-02 1.3002751785455369e-02 1.5968871870902193e-02 4.4825640784412583e-03 5.7133849959126511e-03 -1.6536242867679529e-02 7.8109906600988205e-03 -1.4503183270528974e-02 -2.9708911622263346e-02 6.3415330943775183e-04 -1.3098337935213372e-02 3.7544939714868164e-02 -9.0106833385805735e-03 1.6731842732795661e-02 1.3486834214136434e-02 2.7201743784457011e-03 1.3983372637075333e-02 -2.8914020938474717e-02 1.0493859346936980e-02 -6.9062166620812437e-03 2.5260683783304644e-03 -4.0324428377317843e-04 4.6245841182786006e-03 -1.2176044519992144e-02 1.2919906760377428e-02 -4.9667563898633934e-03 -7.5302605794660702e-03 -9.9934404589813852e-03 5.1078964345037340e-03 8.8634350901449308e-03 -1.2607731675392255e-02 1.2182436926349681e-02 1.1597899736672211e-03 -1.3353293037031042e-03 -8.1317548649207649e-03 -9.0106833385805753e-03 3.3004008078733042e-02 -1.3097623927859852e-02 1.8386765632095914e-03 -5.6379504760079545e-03 7.6817984249497354e-04 1.4329018432686585e-02 -1.5946218641252598e-02 3.5130378610170078e-03 -1.4586622120432040e-02 -8.6521333665453472e-03 -3.1529853901580661e-02 1.5689600635504706e-02 -6.3865253240925389e-03 5.1852725760920069e-03 1.8004109594554563e-02 1.2985348737010108e-02 -1.8883851748720242e-03 -1.5662428355543552e-02 1.1579176550032266e-02 -2.7939427363974048e-02 -1.3745012266374732e-02 -8.4824217818313015e-03 -1.0282427210815953e-02 1.6731842732795658e-02 -1.3097623927859852e-02 4.9629309609660388e-02 1.3639401259242245e-02 3.3341462642319957e-03 2.6324971464615262e-02 -2.0070891479746861e-02 8.7200328490546763e-03 -9.4994599991249512e-03 -1.3365391471906589e-02 -8.4794683552776966e-03 -1.1520873205378632e-02 1.3942873531949462e-02 6.3268504135491886e-04 6.6972082933206391e-03 2.0226805612135208e-02 1.3023913502688259e-02 1.1410129790280187e-02 -1.6921208483147009e-02 2.0208327248338221e-03 -1.3601482723131709e-02 -2.3728423001058124e-02 -1.2190054796003675e-02 -5.9371562850667036e-03 1.3486834214136432e-02 1.8386765632095912e-03 1.3639401259242245e-02 3.3782958587329354e-02 9.7687982289066198e-03 1.3443195761922022e-02 -2.7424448989438726e-02 -6.6153829097118436e-03 -1.4130422891188026e-02 -9.6734938272468839e-03 -1.7750925047537714e-02 -1.5599747531946052e-02 1.3373793939594023e-02 -9.6295450425373658e-03 -3.7467192700162701e-03 1.4307230833306820e-02 1.8201602806741126e-02 6.7785027453561141e-03 -6.6654805850703564e-03 -3.8207546654263650e-04 -8.8433580026698981e-03 -1.6681168240225100e-02 -2.1874274765386226e-02 -4.4572291782790582e-03 2.7201743784457041e-03 -5.6379504760079554e-03 3.3341462642319962e-03 9.7687982289066198e-03 3.8379593255246675e-02 1.7043914232664374e-02 -7.1498547277108280e-03 -1.3064252639758975e-03 5.4904907406588075e-03 -1.2941324778009525e-02 -1.5341286655780488e-02 -2.7472276149806414e-02 1.9919087511669091e-02 -9.2734043129640131e-03 -1.6433591845218646e-03 1.3911178554761905e-02 8.8246913319917752e-03 4.4708131238451456e-03 -1.5595633479013857e-02 4.2571793506586209e-03 -3.1346677675033574e-02 -1.7723691715681073e-02 -1.1977286607816435e-02 -9.3928994084548651e-03 1.3983372637075333e-02 7.6817984249497354e-04 2.6324971464615262e-02 1.3443195761922020e-02 1.7043914232664374e-02 4.8942664140425862e-02 -1.4996184492723899e-02 5.6980128187511924e-03 -9.8832363110695279e-03 1.2737982543109410e-02 1.2771667398252999e-02 1.9190530918348860e-02 -3.9658450669756574e-02 1.4565480949385033e-02 8.8702837787153917e-04 -4.0536584383498178e-02 -1.1658304293108561e-02 1.6413061943359932e-03 2.4542072959701549e-02 -1.0822069926643148e-02 1.3970353459085035e-02 3.3655820106773413e-02 3.1271449596944499e-03 -3.7963868561039237e-04 -2.8914020938474717e-02 1.4329018432686585e-02 -2.0070891479746861e-02 -2.7424448989438723e-02 -7.1498547277108263e-03 -1.4996184492723897e-02 6.5597629371583810e-02 -1.5163082792556530e-02 -2.4250429156030562e-04 2.6565968843143280e-04 -1.0739495813571268e-02 -8.9330471614397118e-03 1.3956386118928290e-02 -1.2384006157815819e-02 -2.6281518179507282e-04 4.1779125793865671e-03 -5.0081083604380057e-04 -1.3275034185267697e-04 -1.1315078617167747e-02 1.1637670454720883e-02 -5.3416891174550545e-03 4.1997265857528542e-03 -6.0764678888255933e-03 -7.6010098970820782e-05 1.0493859346936979e-02 -1.5946218641252598e-02 8.7200328490546781e-03 -6.6153829097118436e-03 -1.3064252639758975e-03 5.6980128187511907e-03 -1.5163082792556536e-02 3.5315754146764099e-02 3.2826623370747928e-04 6.4160926766958816e-03 -3.9040209785908015e-03 -3.2106771162894402e-03 6.5280243089834355e-04 -1.7410735210529054e-04 -6.3219945901773298e-03 9.8527325965618831e-04 1.5118642717414340e-04 -8.1038062896009230e-03 1.3804968581617928e-02 -5.5589223424386824e-03 4.0463654961138155e-03 -5.7999310403876177e-04 1.5406941057733678e-04 3.9778688074290983e-03 -6.9062166620812437e-03 3.5130378610170078e-03 -9.4994599991249512e-03 -1.4130422891188030e-02 5.4904907406588075e-03 -9.8832363110695279e-03 -2.4250429156030560e-04 3.2826623370747890e-04 2.8994940002719259e-02 141 142 143 213 214 215 228 229 230 156 157 158 144 145 146 216 217 218 231 232 233 159 160 161 2.9889901343064108e-02 8.0572466679424779e-03 9.3030703569347457e-03 -2.2185340748580511e-02 -9.4770271678715681e-03 -1.2623387731540897e-02 -1.6332407445251104e-02 -1.0956360164892516e-02 -4.2977701770307072e-03 1.0765496803300120e-02 5.0609873708104313e-03 1.1652483940934058e-02 1.2927910847658821e-02 1.1915203619181212e-02 9.1393787435406684e-03 -1.3674415279305822e-02 -9.7438395504607196e-04 -1.0973097695596352e-02 -8.8179025969696359e-03 -7.4624780210891303e-03 -8.2730124491013999e-03 7.4267570760840236e-03 3.8368116509651610e-03 6.0723350118598715e-03 8.0572466679424814e-03 4.0731069686696868e-02 1.7771624004310600e-02 -1.1766476883636410e-02 -3.4551022715648238e-03 2.6660990605749495e-03 -1.4705461336033086e-02 -2.3882795968436562e-02 -3.7231660585919420e-03 5.8571068690503993e-03 -2.7092797213604056e-03 5.2651212491851450e-03 1.1559209805047144e-02 1.9449463954514769e-02 7.7674869390980412e-03 -8.5066965705393859e-03 -1.7983427308651116e-03 -1.1061602288901660e-02 -6.1234164892235640e-03 -2.0068810167618436e-02 -1.5898240887651353e-02 1.5628487937392421e-02 -8.2662027813663018e-03 -2.7873220180238047e-03 9.3030703569347475e-03 1.7771624004310604e-02 4.5309326791694755e-02 -1.4998345225815148e-02 3.1357900132048177e-03 -8.4161019490238426e-03 -1.3409750912839188e-02 -1.2869033359456631e-02 -6.6755304715568880e-03 1.1548667623530068e-02 5.2186029183570789e-03 2.2990346496368486e-02 9.7285518992880366e-03 7.7411383635893928e-03 2.4643423790750617e-03 -1.3384345161011113e-02 4.4956295366227234e-04 -2.7838788178212556e-02 -6.9140427509124048e-03 -1.6212413694244601e-02 -2.3919535731416634e-02 1.8126194170824991e-02 -5.2352711994229457e-03 -3.9140593369284063e-03 -2.2185340748580518e-02 -1.1766476883636412e-02 -1.4998345225815146e-02 6.1286914220917324e-02 -8.7439980355774726e-03 -7.9100227081302550e-04 3.0800632494485607e-02 1.1129304451728075e-02 -1.6460224614654809e-03 -2.9362460638713804e-02 8.2501649781996957e-03 -1.9518770910345495e-02 -3.4353911455265423e-02 -1.5756122468624165e-02 1.8010447213731564e-03 2.5461624679396080e-02 -7.5855572350086295e-03 1.5296057920183960e-02 8.2629753891038903e-03 1.6300506413628065e-02 1.8687839576684025e-02 -3.9910433941343165e-02 8.1721787792908493e-03 1.1691986501980367e-03 -9.4770271678715663e-03 -3.4551022715648238e-03 3.1357900132048186e-03 -8.7439980355774743e-03 2.4689363122060805e-02 3.7855366744701157e-04 7.4422277828134521e-03 -1.7692224547741164e-03 1.7859837221641096e-04 6.6455080575729478e-03 -9.7562339854360032e-03 5.0162675236060982e-03 -1.8633308206988984e-03 -2.6067685165970362e-03 -1.0499680651072883e-04 -6.5533178451962042e-03 7.6214640086024483e-03 -3.2944294822930815e-03 4.2962885974402705e-03 -6.8754629166524152e-03 -5.1279711735449408e-03 8.2536494315174729e-03 -7.8480369856388614e-03 -1.8181211412559423e-04 -1.2623387731540897e-02 2.6660990605749495e-03 -8.4161019490238409e-03 -7.9100227081302528e-04 3.7855366744701167e-04 2.2725906580490184e-02 -1.1942027700811953e-03 -9.7332777503745274e-05 4.9496811684754949e-03 -6.7515860688907667e-03 1.6314734973424422e-03 -7.6119367951983860e-03 1.6376780146713230e-03 6.4355922375779987e-04 -7.2226068197668667e-03 1.2072753265037397e-02 -2.4653231058250152e-03 3.8472267206351865e-03 6.3473084190152559e-03 -2.5461456193294125e-03 -2.3529024532606014e-03 1.3024391426019078e-03 -2.1088394646403232e-04 -5.9192664523511716e-03 -1.6332407445251104e-02 -1.4705461336033086e-02 -1.3409750912839188e-02 3.0800632494485607e-02 7.4422277828134521e-03 -1.1942027700811960e-03 4.2709787758996809e-02 1.8722518821388937e-02 -1.5860416793417123e-03 -2.5979716711501167e-02 -3.7453736435140057e-03 -1.0616150686669098e-02 -2.3411419223347427e-02 -1.6367281645019816e-02 1.4145872433982817e-03 1.3961813552097262e-02 -1.9587621474215795e-03 1.3707877652587646e-02 1.2507532500209907e-02 1.2321816169539333e-02 1.0206485588674374e-02 -3.4256222925689903e-02 -1.7096840017532323e-03 1.4771955642709088e-03 -1.0956360164892516e-02 -2.3882795968436565e-02 -1.2869033359456631e-02 1.1129304451728071e-02 -1.7692224547741166e-03 -9.7332777503745261e-05 1.8722518821388937e-02 3.9195784044890103e-02 -1.5781094134485075e-03 -5.0096908108375627e-03 -3.2968646284808117e-03 -9.9227817987017145e-03 -1.7110242726975356e-02 -2.0709118419527599e-02 1.2501243742579597e-03 7.7634446737991298e-03 -6.9166303731482449e-03 1.3958321438165517e-02 1.1083152832319667e-02 2.0159463482394488e-02 8.7473137062483945e-03 -1.5622127076530370e-02 -2.7806156829172446e-03 5.1149783043874671e-04 -4.2977701770307072e-03 -3.7231660585919425e-03 -6.6755304715568897e-03 -1.6460224614654809e-03 1.7859837221641074e-04 4.9496811684754949e-03 -1.5860416793417112e-03 -1.5781094134485077e-03 2.2316161861432985e-02 -9.5151118816622030e-03 -8.9088867575337488e-03 -7.8325207444143886e-03 1.9599675124470309e-03 1.6871176533978386e-03 -5.4043584240658403e-03 3.7537007089516296e-03 5.3958519502973947e-03 -2.3438571441582175e-03 8.7917385573066369e-03 6.8486516229724495e-03 2.5459131605240068e-03 2.5395394207948052e-03 9.9942630690104972e-05 -7.5554894062371519e-03 1.0765496803300122e-02 5.8571068690504002e-03 1.1548667623530066e-02 -2.9362460638713804e-02 6.6455080575729469e-03 -6.7515860688907667e-03 -2.5979716711501167e-02 -5.0096908108375653e-03 -9.5151118816622030e-03 3.7691078038908421e-02 -5.2692865225842326e-03 1.6785995737772327e-02 1.2538059501403607e-02 7.7965989294550278e-03 3.6663667601156912e-03 -1.6422725241729386e-02 5.6852368613349137e-03 -1.5375842895269429e-02 -1.3232491800290316e-02 -8.8761628712651884e-03 -1.3599112491106253e-02 2.4002760048622507e-02 -6.8293105127263110e-03 1.3240623215510547e-02 5.0609873708104287e-03 -2.7092797213604030e-03 5.2186029183570789e-03 8.2501649781996957e-03 -9.7562339854360049e-03 1.6314734973424420e-03 -3.7453736435140057e-03 -3.2968646284808117e-03 -8.9088867575337488e-03 -5.2692865225842335e-03 2.6704624405859630e-02 -6.9555028649453910e-03 -1.6602522345210270e-03 -7.5656544235175299e-03 5.4324968792434664e-03 4.8592138020010882e-03 -7.5648495252748915e-03 6.5546239853446278e-03 -1.3271775956210843e-03 -2.3763963909746583e-03 -5.2098568629570935e-05 -6.1682761547708622e-03 6.5646542691846724e-03 -2.9207090891788983e-03 1.1652483940934056e-02 5.2651212491851450e-03 2.2990346496368486e-02 -1.9518770910345495e-02 5.0162675236060982e-03 -7.6119367951983860e-03 -1.0616150686669098e-02 -9.9227817987017145e-03 -7.8325207444143868e-03 1.6785995737772327e-02 -6.9555028649453910e-03 4.5641269099317712e-02 1.3243635348909596e-02 1.3119362551360239e-02 -3.3373399210341222e-03 -1.4366935998106818e-02 7.1791667064455382e-03 -2.4868673839713303e-02 -9.9010794108225653e-03 -1.0973902634909920e-02 -2.7544767930345236e-02 1.2720821978327993e-02 -2.7277307320400040e-03 2.5636236350192218e-03 1.2927910847658817e-02 1.1559209805047144e-02 9.7285518992880366e-03 -3.4353911455265423e-02 -1.8633308206988993e-03 1.6376780146713217e-03 -2.3411419223347427e-02 -1.7110242726975356e-02 1.9599675124470309e-03 1.2538059501403607e-02 -1.6602522345210268e-03 1.3243635348909592e-02 4.4936826097766766e-02 1.8234473945339554e-02 -1.1666830285078239e-03 -2.5090406588102503e-02 -3.4057563512704500e-03 -1.0738249552111979e-02 -1.5484087425487165e-02 -1.4784284589435148e-02 -1.3285990733557178e-02 2.7937028245373325e-02 9.0301829725141745e-03 -1.3789094611390239e-03 1.1915203619181209e-02 1.9449463954514769e-02 7.7411383635893928e-03 -1.5756122468624165e-02 -2.6067685165970379e-03 6.4355922375780041e-04 -1.6367281645019816e-02 -2.0709118419527599e-02 1.6871176533978384e-03 7.7965989294550286e-03 -7.5656544235175299e-03 1.3119362551360241e-02 1.8234473945339554e-02 4.1027767469353910e-02 -1.2568467142645295e-03 -4.2356664621932003e-03 -2.4867827582279226e-03 -9.6771727274569917e-03 -9.8379472287658826e-03 -2.3751688235059652e-02 -1.2278630561487883e-02 8.2507413106272676e-03 -3.3572190709389403e-03 2.1472211104113303e-05 9.1393787435406666e-03 7.7674869390980412e-03 2.4643423790750617e-03 1.8010447213731560e-03 -1.0499680651072867e-04 -7.2226068197668658e-03 1.4145872433982817e-03 1.2501243742579597e-03 -5.4043584240658403e-03 3.6663667601156921e-03 5.4324968792434664e-03 -3.3373399210341213e-03 -1.1666830285078243e-03 -1.2568467142645299e-03 2.4725263855849885e-02 -9.7003045604621696e-03 -8.9129736583113909e-03 -7.7227519126044988e-03 -4.1263666067662729e-03 -4.0255398186475767e-03 -7.0780203283166932e-03 -1.0280232726915313e-03 -1.4975119486524270e-04 3.5754711708630769e-03 -1.3674415279305822e-02 -8.5066965705393877e-03 -1.3384345161011110e-02 2.5461624679396083e-02 -6.5533178451962059e-03 1.2072753265037397e-02 1.3961813552097260e-02 7.7634446737991298e-03 3.7537007089516296e-03 -1.6422725241729386e-02 4.8592138020010873e-03 -1.4366935998106815e-02 -2.5090406588102507e-02 -4.2356664621931977e-03 -9.7003045604621696e-03 3.4514185378991466e-02 -5.7335323480519436e-03 1.6541659638252996e-02 1.0012193689197195e-02 5.8968011123701203e-03 1.1519977089686849e-02 -2.8762270190544299e-02 6.5097536378104018e-03 -6.4365049823487622e-03 -9.7438395504607185e-04 -1.7983427308651120e-03 4.4956295366227245e-04 -7.5855572350086286e-03 7.6214640086024483e-03 -2.4653231058250147e-03 -1.9587621474215790e-03 -6.9166303731482458e-03 5.3958519502973947e-03 5.6852368613349137e-03 -7.5648495252748915e-03 7.1791667064455382e-03 -3.4057563512704470e-03 -2.4867827582279239e-03 -8.9129736583113892e-03 -5.7335323480519436e-03 2.4661339223169682e-02 -7.6455360346921498e-03 5.0148786367463904e-03 -3.2256504174321479e-03 4.0110795588923099e-03 8.9578765387173711e-03 -1.0290547426823810e-02 1.9881716295310323e-03 -1.0973097695596349e-02 -1.1061602288901662e-02 -2.7838788178212556e-02 1.5296057920183962e-02 -3.2944294822930807e-03 3.8472267206351865e-03 1.3707877652587646e-02 1.3958321438165517e-02 -2.3438571441582175e-03 -1.5375842895269429e-02 6.5546239853446287e-03 -2.4868673839713303e-02 -1.0738249552111979e-02 -9.6771727274569935e-03 -7.7227519126044988e-03 1.6541659638252996e-02 -7.6455360346921498e-03 4.3607510185199039e-02 1.0796922894381359e-02 6.3775349175817951e-03 2.3097936189837284e-02 -1.9255327962428195e-02 4.7882601922519521e-03 -7.7786020209829141e-03 -8.8179025969696359e-03 -6.1234164892235640e-03 -6.9140427509124048e-03 8.2629753891038920e-03 4.2962885974402705e-03 6.3473084190152559e-03 1.2507532500209907e-02 1.1083152832319665e-02 8.7917385573066369e-03 -1.3232491800290316e-02 -1.3271775956210845e-03 -9.9010794108225636e-03 -1.5484087425487165e-02 -9.8379472287658844e-03 -4.1263666067662737e-03 1.0012193689197197e-02 5.0148786367463904e-03 1.0796922894381359e-02 2.6769588115265724e-02 7.2103832690571575e-03 8.1758834370252113e-03 -2.0017807871029601e-02 -1.0316162021952945e-02 -1.3170364539227207e-02 -7.4624780210891303e-03 -2.0068810167618436e-02 -1.6212413694244598e-02 1.6300506413628069e-02 -6.8754629166524134e-03 -2.5461456193294125e-03 1.2321816169539333e-02 2.0159463482394488e-02 6.8486516229724478e-03 -8.8761628712651884e-03 -2.3763963909746578e-03 -1.0973902634909920e-02 -1.4784284589435152e-02 -2.3751688235059652e-02 -4.0255398186475767e-03 5.8968011123701220e-03 -3.2256504174321479e-03 6.3775349175817951e-03 7.2103832690571575e-03 3.8842751643158223e-02 1.7588249709487969e-02 -1.0606581482805213e-02 -2.7042069978153848e-03 2.9435655170893093e-03 -8.2730124491013999e-03 -1.5898240887651349e-02 -2.3919535731416634e-02 1.8687839576684025e-02 -5.1279711735449408e-03 -2.3529024532606014e-03 1.0206485588674371e-02 8.7473137062483927e-03 2.5459131605240076e-03 -1.3599112491106253e-02 -5.2098568629571585e-05 -2.7544767930345233e-02 -1.3285990733557178e-02 -1.2278630561487879e-02 -7.0780203283166932e-03 1.1519977089686852e-02 4.0110795588923099e-03 2.3097936189837288e-02 8.1758834370252095e-03 1.7588249709487969e-02 4.2843176335678475e-02 -1.3432070018305625e-02 3.0102982166850777e-03 -7.5917992427005816e-03 7.4267570760840245e-03 1.5628487937392421e-02 1.8126194170824991e-02 -3.9910433941343165e-02 8.2536494315174729e-03 1.3024391426019087e-03 -3.4256222925689903e-02 -1.5622127076530370e-02 2.5395394207948048e-03 2.4002760048622510e-02 -6.1682761547708622e-03 1.2720821978327993e-02 2.7937028245373328e-02 8.2507413106272642e-03 -1.0280232726915307e-03 -2.8762270190544299e-02 8.9578765387173694e-03 -1.9255327962428195e-02 -2.0017807871029598e-02 -1.0606581482805213e-02 -1.3432070018305629e-02 6.3580189558527081e-02 -8.6937705041480948e-03 -9.7357345912436844e-04 3.8368116509651601e-03 -8.2662027813663018e-03 -5.2352711994229457e-03 8.1721787792908493e-03 -7.8480369856388614e-03 -2.1088394646403237e-04 -1.7096840017532325e-03 -2.7806156829172446e-03 9.9942630690105081e-05 -6.8293105127263127e-03 6.5646542691846733e-03 -2.7277307320400040e-03 9.0301829725141745e-03 -3.3572190709389420e-03 -1.4975119486524259e-04 6.5097536378104009e-03 -1.0290547426823808e-02 4.7882601922519512e-03 -1.0316162021952945e-02 -2.7042069978153844e-03 3.0102982166850772e-03 -8.6937705041480948e-03 2.8682174676315869e-02 4.2513603316509524e-04 6.0723350118598723e-03 -2.7873220180238060e-03 -3.9140593369284054e-03 1.1691986501980362e-03 -1.8181211412559417e-04 -5.9192664523511716e-03 1.4771955642709105e-03 5.1149783043874693e-04 -7.5554894062371519e-03 1.3240623215510545e-02 -2.9207090891788983e-03 2.5636236350192214e-03 -1.3789094611390247e-03 2.1472211104113303e-05 3.5754711708630769e-03 -6.4365049823487622e-03 1.9881716295310323e-03 -7.7786020209829141e-03 -1.3170364539227207e-02 2.9435655170893093e-03 -7.5917992427005816e-03 -9.7357345912436779e-04 4.2513603316509529e-04 2.6620121653317924e-02 213 214 215 285 286 287 300 301 302 228 229 230 216 217 218 288 289 290 303 304 305 231 232 233 3.3292069303111925e-02 9.0347901928190220e-03 1.0418409056300050e-02 -2.4569806498751304e-02 -1.0486261970444962e-02 -1.4062959655801833e-02 -1.8102289289000248e-02 -1.2234705148488172e-02 -4.7341146133343956e-03 1.1947989113732346e-02 5.5829033630743884e-03 1.3045210563608209e-02 1.4468353864403719e-02 1.3287173719223199e-02 1.0225582473617321e-02 -1.5408561779138272e-02 -1.1404146781626499e-03 -1.2352398621181614e-02 -9.9113541366439642e-03 -8.3397183890456042e-03 -9.3027700238770654e-03 8.2835994222857923e-03 4.2962329110247778e-03 6.7630408206693316e-03 9.0347901928190220e-03 4.5551826690689044e-02 1.9953423754873429e-02 -1.3229696607782879e-02 -3.5796469244887621e-03 2.9986357856307947e-03 -1.6441394350520978e-02 -2.6668278376115354e-02 -4.1415995239944305e-03 6.6520044699945220e-03 -3.2055928176647494e-03 6.0364991778352473e-03 1.2958665054036506e-02 2.1784425473295680e-02 8.6949894891091648e-03 -9.5562955032817698e-03 -2.1157499853462869e-03 -1.2457073968385819e-02 -6.9033456200610840e-03 -2.2496992611041142e-02 -1.7921006579415290e-02 1.7485272364796661e-02 -9.2699914493284442e-03 -3.1638681356530992e-03 1.0418409056300053e-02 1.9953423754873433e-02 5.0594469270469455e-02 -1.6749520197574204e-02 3.6293434194531343e-03 -9.1812589067567351e-03 -1.4968359792504474e-02 -1.4395446037284744e-02 -7.2767423861309459e-03 1.2967207182564142e-02 5.7247528257808981e-03 2.5687001165730135e-02 1.0832170944995778e-02 8.5803479036422412e-03 2.7612580109346776e-03 -1.4977327917481423e-02 4.6701393515326706e-04 -3.1279386162359805e-02 -7.7615154678464257e-03 -1.8087050059144977e-02 -2.6858914220531264e-02 2.0238936191546566e-02 -5.8723857424732486e-03 -4.4464267713555166e-03 -2.4569806498751300e-02 -1.3229696607782879e-02 -1.6749520197574200e-02 6.8070341649844185e-02 -9.8802379688537056e-03 -9.2958476464787020e-04 3.4038458766991631e-02 1.2510877299929469e-02 -1.9154023123493479e-03 -3.2645871189025705e-02 9.2680683748213675e-03 -2.1831026881298499e-02 -3.8208501119396533e-02 -1.7468430826280780e-02 2.0933312927086199e-03 2.8476893520847625e-02 -8.4118430927864005e-03 1.7014319777185365e-02 9.2283370229015206e-03 1.8119245452626758e-02 2.0894309028903199e-02 -4.4389852153411430e-02 9.0920173683261725e-03 1.4235740570727282e-03 -1.0486261970444962e-02 -3.5796469244887630e-03 3.6293434194531343e-03 -9.8802379688537056e-03 2.7477108019386819e-02 4.3429097694366246e-04 8.1561209252996609e-03 -2.2506238027652789e-03 1.8922800052406305e-04 7.5225887403941229e-03 -1.0832196844868924e-02 5.6728585526045205e-03 -2.0135288978229359e-03 -2.8240270450422787e-03 -1.1572777796162344e-04 -7.3799954766908191e-03 8.5594933867951892e-03 -3.7504244865079802e-03 4.7481564306647555e-03 -7.7845522445302547e-03 -5.8233304081143789e-03 9.3331582174538841e-03 -8.7655545444865202e-03 -2.3623827694139687e-04 -1.4062959655801835e-02 2.9986357856307960e-03 -9.1812589067567351e-03 -9.2958476464787064e-04 4.3429097694366235e-04 2.5204916738150888e-02 -1.3712382127762819e-03 -9.6622255598513909e-05 5.3572731065492591e-03 -7.4982138482065294e-03 1.8519553814018461e-03 -8.3398814129176362e-03 1.8042916859828660e-03 7.2886832437620865e-04 -8.0413866360458802e-03 1.3518449044182295e-02 -2.7916489388419732e-03 4.2797347639010348e-03 7.0859171090382408e-03 -2.8900683478535294e-03 -2.6924259501225809e-03 1.4533386422291175e-03 -2.3541092605849689e-04 -6.5869717027583503e-03 -1.8102289289000248e-02 -1.6441394350520978e-02 -1.4968359792504474e-02 3.4038458766991637e-02 8.1561209252996574e-03 -1.3712382127762813e-03 4.7156791352344123e-02 2.0845312240956933e-02 -1.8454319623761035e-03 -2.8590691380788558e-02 -4.0522039082059955e-03 -1.1869202123758589e-02 -2.5993569481101122e-02 -1.8165743709554105e-02 1.6239293076068212e-03 1.5540878886089748e-02 -2.1171905839645379e-03 1.5261058194577109e-02 1.3929351060896258e-02 1.3691596611443171e-02 1.1396272786132778e-02 -3.7978929915431836e-02 -1.9164972254541450e-03 1.7729718030987361e-03 -1.2234705148488173e-02 -2.6668278376115347e-02 -1.4395446037284744e-02 1.2510877299929470e-02 -2.2506238027652781e-03 -9.6622255598513530e-05 2.0845312240956933e-02 4.3516192434200837e-02 -1.8315257382639516e-03 -5.7081145533643294e-03 -3.2578645403186814e-03 -1.1237887152561195e-02 -1.9093952307076688e-02 -2.3092415619048616e-02 1.4456735594463766e-03 8.7351983678223052e-03 -7.7338679255924388e-03 1.5656356146288904e-02 1.2401835547005155e-02 2.2473952835274154e-02 9.8444300839038348e-03 -1.7456451446784680e-02 -2.9870950056346225e-03 6.1502139406928577e-04 -4.7341146133343956e-03 -4.1415995239944305e-03 -7.2767423861309459e-03 -1.9154023123493474e-03 1.8922800052406310e-04 5.3572731065492591e-03 -1.8454319623761031e-03 -1.8315257382639516e-03 2.4600051478180462e-02 -1.0491707106522417e-02 -9.9211517935496665e-03 -8.3150491871022639e-03 2.2168657446658743e-03 1.9099703852729142e-03 -6.0174823634829913e-03 4.1427883938480650e-03 6.0608402239888670e-03 -2.7159902727167244e-03 9.7680923495518726e-03 7.6253783006751778e-03 2.7116453021333612e-03 2.8589095065164535e-03 1.0886014534702609e-04 -8.3437056774301570e-03 1.1947989113732346e-02 6.6520044699945246e-03 1.2967207182564142e-02 -3.2645871189025705e-02 7.5225887403941221e-03 -7.4982138482065294e-03 -2.8590691380788558e-02 -5.7081145533643268e-03 -1.0491707106522417e-02 4.1829809975737653e-02 -5.9615004663408936e-03 1.8800685613607600e-02 1.3986425114731684e-02 8.6894217216618736e-03 4.0832388781725385e-03 -1.8429935212775618e-02 6.3410948635462044e-03 -1.7262963260919723e-02 -1.4839501348321946e-02 -9.9239925186616965e-03 -1.5316451701982080e-02 2.6741774926710156e-02 -7.6115022572298087e-03 1.4718204243286466e-02 5.5829033630743884e-03 -3.2055928176647486e-03 5.7247528257808981e-03 9.2680683748213658e-03 -1.0832196844868924e-02 1.8519553814018461e-03 -4.0522039082059981e-03 -3.2578645403186788e-03 -9.9211517935496665e-03 -5.9615004663408954e-03 2.9610972742011944e-02 -7.8595160882111922e-03 -1.8860984784569244e-03 -8.4955647201691072e-03 6.0841884117106525e-03 5.4816632451831155e-03 -8.4910368432972484e-03 7.4009260203103328e-03 -1.4439863053634708e-03 -2.6202364907196374e-03 -1.4296269988090058e-05 -6.9888458247115860e-03 7.2915195150263928e-03 -3.2668584874547841e-03 1.3045210563608209e-02 6.0364991778352473e-03 2.5687001165730132e-02 -2.1831026881298492e-02 5.6728585526045205e-03 -8.3398814129176362e-03 -1.1869202123758589e-02 -1.1237887152561195e-02 -8.3150491871022657e-03 1.8800685613607600e-02 -7.8595160882111922e-03 5.0824064819085302e-02 1.4792328129879580e-02 1.4663059082604381e-02 -3.7637224115348237e-03 -1.6110265619164423e-02 8.0044063473560158e-03 -2.7912480408972654e-02 -1.1080498546827897e-02 -1.2249232551592703e-02 -3.0914721995961805e-02 1.4252768863954011e-02 -3.0301873680350778e-03 2.7347894316737450e-03 1.4468353864403719e-02 1.2958665054036507e-02 1.0832170944995775e-02 -3.8208501119396533e-02 -2.0135288978229333e-03 1.8042916859828651e-03 -2.5993569481101125e-02 -1.9093952307076688e-02 2.2168657446658743e-03 1.3986425114731686e-02 -1.8860984784569239e-03 1.4792328129879580e-02 5.0361885279620877e-02 2.0290451189165927e-02 -1.3066237794595529e-03 -2.8348615740527095e-02 -3.9766945664796664e-03 -1.1922139266221569e-02 -1.7434073939774562e-02 -1.6458408635034560e-02 -1.4820310438003411e-02 3.1168096022043033e-02 1.0179566641668338e-02 -1.5965830218395596e-03 1.3287173719223199e-02 2.1784425473295680e-02 8.5803479036422412e-03 -1.7468430826280783e-02 -2.8240270450422796e-03 7.2886832437620876e-04 -1.8165743709554105e-02 -2.3092415619048619e-02 1.9099703852729142e-03 8.6894217216618736e-03 -8.4955647201691090e-03 1.4663059082604381e-02 2.0290451189165927e-02 4.5979568129254481e-02 -1.4187355673585136e-03 -4.6491823610086466e-03 -3.1165114859483421e-03 -1.0712414682853392e-02 -1.1013688480288258e-02 -2.6576589732229382e-02 -1.3738804788839995e-02 9.0299987470807905e-03 -3.6588850001124263e-03 -1.2290656843839932e-05 1.0225582473617321e-02 8.6949894891091648e-03 2.7612580109346793e-03 2.0933312927086207e-03 -1.1572777796162322e-04 -8.0413866360458802e-03 1.6239293076068212e-03 1.4456735594463766e-03 -6.0174823634829913e-03 4.0832388781725385e-03 6.0841884117106525e-03 -3.7637224115348233e-03 -1.3066237794595521e-03 -1.4187355673585139e-03 2.7873706681055713e-02 -1.0916834262011883e-02 -1.0036378792611957e-02 -8.8959175981801319e-03 -4.6383162351635665e-03 -4.4762447565076698e-03 -7.9971337750059050e-03 -1.1643076754702967e-03 -1.7776456582643113e-04 4.0806780922593407e-03 -1.5408561779138269e-02 -9.5562955032817698e-03 -1.4977327917481419e-02 2.8476893520847625e-02 -7.3799954766908191e-03 1.3518449044182292e-02 1.5540878886089748e-02 8.7351983678223052e-03 4.1427883938480650e-03 -1.8429935212775618e-02 5.4816632451831155e-03 -1.6110265619164423e-02 -2.8348615740527088e-02 -4.6491823610086492e-03 -1.0916834262011885e-02 3.9068600721198499e-02 -6.3830704399331951e-03 1.8586559009334029e-02 1.1359741573465539e-02 6.5119052282560522e-03 1.2935469097477191e-02 -3.2259001969160442e-02 7.2397769396529595e-03 -7.1788377461838547e-03 -1.1404146781626493e-03 -2.1157499853462869e-03 4.6701393515326695e-04 -8.4118430927864005e-03 8.5594933867951892e-03 -2.7916489388419719e-03 -2.1171905839645370e-03 -7.7338679255924397e-03 6.0608402239888670e-03 6.3410948635462044e-03 -8.4910368432972467e-03 8.0044063473560141e-03 -3.9766945664796664e-03 -3.1165114859483404e-03 -1.0036378792611956e-02 -6.3830704399331943e-03 2.7921741997016584e-02 -8.5161975227075522e-03 5.7049269808150584e-03 -3.4430833319295307e-03 4.6112597295700644e-03 9.9831915169651866e-03 -1.1580985811697933e-02 2.2007050180932711e-03 -1.2352398621181614e-02 -1.2457073968385819e-02 -3.1279386162359805e-02 1.7014319777185365e-02 -3.7504244865079806e-03 4.2797347639010348e-03 1.5261058194577109e-02 1.5656356146288908e-02 -2.7159902727167244e-03 -1.7262963260919723e-02 7.4009260203103337e-03 -2.7912480408972658e-02 -1.1922139266221571e-02 -1.0712414682853390e-02 -8.8959175981801336e-03 1.8586559009334033e-02 -8.5161975227075557e-03 4.9230731327907201e-02 1.2149980408189700e-02 7.0163744944962145e-03 2.6033065939724789e-02 -2.1474416240963305e-02 5.3624539993592894e-03 -8.7397575893037316e-03 -9.9113541366439642e-03 -6.9033456200610840e-03 -7.7615154678464266e-03 9.2283370229015189e-03 4.7481564306647555e-03 7.0859171090382400e-03 1.3929351060896258e-02 1.2401835547005155e-02 9.7680923495518709e-03 -1.4839501348321946e-02 -1.4439863053634708e-03 -1.1080498546827897e-02 -1.7434073939774562e-02 -1.1013688480288256e-02 -4.6383162351635665e-03 1.1359741573465540e-02 5.7049269808150576e-03 1.2149980408189700e-02 3.0197154809192130e-02 8.0950419221789364e-03 9.2113583792812238e-03 -2.2529655041714974e-02 -1.1588940474951091e-02 -1.4735017996223150e-02 -8.3397183890456042e-03 -2.2496992611041142e-02 -1.8087050059144977e-02 1.8119245452626762e-02 -7.7845522445302564e-03 -2.8900683478535298e-03 1.3691596611443174e-02 2.2473952835274154e-02 7.6253783006751778e-03 -9.9239925186616965e-03 -2.6202364907196357e-03 -1.2249232551592703e-02 -1.6458408635034567e-02 -2.6576589732229382e-02 -4.4762447565076698e-03 6.5119052282560531e-03 -3.4430833319295290e-03 7.0163744944962162e-03 8.0950419221789346e-03 4.3588580688406882e-02 1.9696845614484159e-02 -1.1695669671763059e-02 -3.1410791132310848e-03 3.3639973054433231e-03 -9.3027700238770654e-03 -1.7921006579415290e-02 -2.6858914220531264e-02 2.0894309028903199e-02 -5.8233304081143789e-03 -2.6924259501225800e-03 1.1396272786132776e-02 9.8444300839038313e-03 2.7116453021333617e-03 -1.5316451701982078e-02 -1.4296269988089408e-05 -3.0914721995961809e-02 -1.4820310438003413e-02 -1.3738804788839995e-02 -7.9971337750059050e-03 1.2935469097477191e-02 4.6112597295700653e-03 2.6033065939724792e-02 9.2113583792812221e-03 1.9696845614484156e-02 4.8257964791003555e-02 -1.4997877127931837e-02 3.3449026183997007e-03 -8.5394800912401651e-03 8.2835994222857905e-03 1.7485272364796661e-02 2.0238936191546562e-02 -4.4389852153411423e-02 9.3331582174538841e-03 1.4533386422291169e-03 -3.7978929915431836e-02 -1.7456451446784683e-02 2.8589095065164535e-03 2.6741774926710156e-02 -6.9888458247115860e-03 1.4252768863954015e-02 3.1168096022043033e-02 9.0299987470807870e-03 -1.1643076754702965e-03 -3.2259001969160442e-02 9.9831915169651866e-03 -2.1474416240963308e-02 -2.2529655041714981e-02 -1.1695669671763061e-02 -1.4997877127931835e-02 7.0963968708679701e-02 -9.6906539030372028e-03 -1.1673521598807002e-03 4.2962329110247778e-03 -9.2699914493284460e-03 -5.8723857424732477e-03 9.0920173683261725e-03 -8.7655545444865202e-03 -2.3541092605849673e-04 -1.9164972254541450e-03 -2.9870950056346225e-03 1.0886014534702623e-04 -7.6115022572298069e-03 7.2915195150263928e-03 -3.0301873680350783e-03 1.0179566641668338e-02 -3.6588850001124259e-03 -1.7776456582643124e-04 7.2397769396529603e-03 -1.1580985811697937e-02 5.3624539993592894e-03 -1.1588940474951093e-02 -3.1410791132310866e-03 3.3449026183996998e-03 -9.6906539030372062e-03 3.2112071409464642e-02 4.9953183928723931e-04 6.7630408206693316e-03 -3.1638681356531005e-03 -4.4464267713555175e-03 1.4235740570727286e-03 -2.3623827694139681e-04 -6.5869717027583503e-03 1.7729718030987361e-03 6.1502139406928598e-04 -8.3437056774301570e-03 1.4718204243286466e-02 -3.2668584874547841e-03 2.7347894316737450e-03 -1.5965830218395601e-03 -1.2290656843840257e-05 4.0806780922593398e-03 -7.1788377461838556e-03 2.2007050180932707e-03 -8.7397575893037316e-03 -1.4735017996223154e-02 3.3639973054433231e-03 -8.5394800912401633e-03 -1.1673521598806985e-03 4.9953183928723942e-04 2.9840874308154838e-02 156 157 158 228 229 230 243 244 245 171 172 173 159 160 161 231 232 233 246 247 248 174 175 176 2.6466948061492343e-02 4.9905399060784349e-03 4.9905399060784349e-03 -1.5581152674808561e-02 -1.2224900338060894e-02 -1.2224900338060892e-02 -1.0575052670119434e-02 -7.9348879564689941e-03 -3.1567536588132977e-03 7.5542438508191187e-03 7.1174336896032237e-03 9.5739108484758518e-03 7.5542438508191152e-03 9.5739108484758483e-03 7.1174336896032220e-03 -1.0575052670119425e-02 -3.1567536588132969e-03 -7.9348879564689959e-03 -6.4040838224935538e-03 -4.4770064833932017e-03 -4.4770064833932043e-03 1.5599060744103999e-03 6.1116639925788800e-03 6.1116639925788809e-03 4.9905399060784341e-03 4.3829865793162393e-02 1.9271027936135398e-02 -1.4901099445633099e-02 -6.2773479744611385e-03 1.1093573111004694e-03 -1.2335028112604951e-02 -2.6763319768893439e-02 -2.9771368225760802e-03 7.9217823279695548e-03 6.0848683706495933e-04 7.9701385810195535e-03 9.3542595952824815e-03 2.2105030253925947e-02 7.8302242787578313e-03 -1.0334161153705701e-02 -4.6226856499357446e-03 -1.3422275897713290e-02 -2.9289102925884576e-03 -2.2982424312668909e-02 -1.7139273434580785e-02 1.8232617175201735e-02 -5.8976051781940708e-03 -2.6420619521431107e-03 4.9905399060784341e-03 1.9271027936135401e-02 4.3829865793162393e-02 -1.4901099445633101e-02 1.1093573111004733e-03 -6.2773479744611411e-03 -1.0334161153705701e-02 -1.3422275897713281e-02 -4.6226856499357498e-03 9.3542595952824849e-03 7.8302242787578313e-03 2.2105030253925958e-02 7.9217823279695530e-03 7.9701385810195466e-03 6.0848683706496128e-04 -1.2335028112604946e-02 -2.9771368225760858e-03 -2.6763319768893443e-02 -2.9289102925884568e-03 -1.7139273434580778e-02 -2.2982424312668913e-02 1.8232617175201731e-02 -2.6420619521431016e-03 -5.8976051781940795e-03 -1.5581152674808561e-02 -1.4901099445633101e-02 -1.4901099445633099e-02 6.2682848811738925e-02 -2.3897093186210829e-03 -2.3897093186210786e-03 2.5866887537862617e-02 1.5144559168281460e-02 -3.2077855357691455e-03 -2.9592051727533084e-02 3.1978853423348494e-03 -1.9386136463632294e-02 -2.9592051727533087e-02 -1.9386136463632287e-02 3.1978853423348451e-03 2.5866887537862617e-02 -3.2077855357691386e-03 1.5144559168281474e-02 1.9940844003461062e-03 1.8695553274833139e-02 1.8695553274833146e-02 -4.1645452157935518e-02 2.8467329782061474e-03 2.8467329782061622e-03 -1.2224900338060894e-02 -6.2773479744611402e-03 1.1093573111004740e-03 -2.3897093186210851e-03 2.2494111980165418e-02 3.6798644376940365e-04 1.1605141627655151e-02 2.1449263071737904e-03 -4.9058666476456837e-04 2.4801744825498589e-03 -7.1089288255640750e-03 1.6774820674318640e-03 -6.1797190419260730e-03 -5.9766667348675083e-03 3.5627859200863083e-04 -2.3731284431488418e-03 5.0482125933550333e-03 -7.1082587003146495e-04 6.4576403780082755e-03 -4.1191896174491722e-03 -2.2076519457426944e-03 2.6245006535436060e-03 -6.2051177283523494e-03 -1.0203993377164666e-04 -1.2224900338060892e-02 1.1093573111004697e-03 -6.2773479744611411e-03 -2.3897093186210786e-03 3.6798644376940371e-04 2.2494111980165418e-02 -2.3731284431488375e-03 -7.1082587003145931e-04 5.0482125933550307e-03 -6.1797190419260730e-03 3.5627859200863159e-04 -5.9766667348675083e-03 2.4801744825498550e-03 1.6774820674318601e-03 -7.1089288255640785e-03 1.1605141627655153e-02 -4.9058666476456978e-04 2.1449263071737982e-03 6.4576403780082746e-03 -2.2076519457426900e-03 -4.1191896174491670e-03 2.6245006535435991e-03 -1.0203993377164509e-04 -6.2051177283523502e-03 -1.0575052670119432e-02 -1.2335028112604951e-02 -1.0334161153705701e-02 2.5866887537862617e-02 1.1605141627655151e-02 -2.3731284431488375e-03 3.3996137233971761e-02 1.6690792566370707e-02 -2.4983380934988559e-03 -2.1703734181218227e-02 -7.1347545492406123e-03 -7.6554731089178291e-03 -1.6478980587970520e-02 -1.4507644715959262e-02 2.0013851611289783e-03 1.1774059455913435e-02 1.8516654865826810e-03 1.0300329013448186e-02 6.5671306727447332e-03 9.6270843998447590e-03 7.9184941192117723e-03 -2.9446447461184359e-02 -5.7972567026484782e-03 2.6408925054822912e-03 -7.9348879564689941e-03 -2.6763319768893432e-02 -1.3422275897713281e-02 1.5144559168281460e-02 2.1449263071737900e-03 -7.1082587003145909e-04 1.6690792566370707e-02 4.1737592209088861e-02 -3.1995197684646327e-03 -8.1493188152596298e-03 -5.9277193097586351e-03 -1.0702406621958354e-02 -1.5347621262275951e-02 -2.3706403708932695e-02 2.5595358151721480e-03 1.0300329013448177e-02 -3.4806734905236136e-03 1.5112146353677488e-02 8.3965246968806129e-03 2.2055088842782282e-02 8.7760123281670020e-03 -1.9100377410976373e-02 -6.0594910809365753e-03 1.5873336611510966e-03 -3.1567536588132969e-03 -2.9771368225760802e-03 -4.6226856499357490e-03 -3.2077855357691455e-03 -4.9058666476456858e-04 5.0482125933550316e-03 -2.4983380934988563e-03 -3.1995197684646327e-03 2.1271311469932039e-02 -6.8410350077422076e-03 -9.7227216202053959e-03 -5.4031273001125084e-03 2.6412355426022696e-03 3.2094447923972694e-03 -5.1546800975438697e-03 1.8516654865826769e-03 5.6101669696199214e-03 -3.4806734905236205e-03 7.1161035891342036e-03 6.7612924922119105e-03 8.1964662365755251e-06 4.0949076775043539e-03 8.0906062178157806e-04 -7.6665539914079024e-03 7.5542438508191178e-03 7.9217823279695548e-03 9.3542595952824849e-03 -2.9592051727533084e-02 2.4801744825498598e-03 -6.1797190419260748e-03 -2.1703734181218227e-02 -8.1493188152596298e-03 -6.8410350077422067e-03 3.6327374803189247e-02 -1.9174439270625426e-03 1.6473892614412945e-02 1.0378906934647946e-02 1.0109087868293995e-02 1.8908243682299224e-03 -1.6478980587970520e-02 2.6412355426022674e-03 -1.5347621262275960e-02 -9.8302256657768969e-03 -1.0341138703281646e-02 -1.2222213864930023e-02 2.3344466573842419e-02 -2.7443787758118527e-03 1.2871612598948912e-02 7.1174336896032237e-03 6.0848683706495889e-04 7.8302242787578330e-03 3.1978853423348477e-03 -7.1089288255640750e-03 3.5627859200863159e-04 -7.1347545492406140e-03 -5.9277193097586342e-03 -9.7227216202053993e-03 -1.9174439270625431e-03 2.3286241270876185e-02 -2.5569046811796245e-03 1.8908243682299207e-03 -4.1198486703000513e-03 5.6984160506499187e-03 2.0013851611289783e-03 -5.1546800975438680e-03 2.5595358151721528e-03 -3.0701184107215715e-03 -5.2462303891589700e-03 -3.3877921742106847e-03 -2.0852116742722440e-03 3.6626791843844498e-03 -7.7703626099282939e-04 9.5739108484758501e-03 7.9701385810195535e-03 2.2105030253925961e-02 -1.9386136463632294e-02 1.6774820674318640e-03 -5.9766667348675100e-03 -7.6554731089178334e-03 -1.0702406621958351e-02 -5.4031273001125093e-03 1.6473892614412945e-02 -2.5569046811796236e-03 4.3246680991779356e-02 1.0109087868293998e-02 1.4062191413704499e-02 -4.1198486703000504e-03 -1.4507644715959266e-02 3.2094447923972647e-03 -2.3706403708932712e-02 -6.7000639083012346e-03 -1.2903388312812391e-02 -2.6260445308503237e-02 1.2092426865627826e-02 -7.5655723860280325e-04 1.1478047701068560e-04 7.5542438508191152e-03 9.3542595952824815e-03 7.9217823279695530e-03 -2.9592051727533087e-02 -6.1797190419260730e-03 2.4801744825498550e-03 -1.6478980587970520e-02 -1.5347621262275948e-02 2.6412355426022700e-03 1.0378906934647946e-02 1.8908243682299204e-03 1.0109087868293998e-02 3.6327374803189240e-02 1.6473892614412934e-02 -1.9174439270625413e-03 -2.1703734181218220e-02 -6.8410350077422102e-03 -8.1493188152596367e-03 -9.8302256657768917e-03 -1.2222213864930016e-02 -1.0341138703281648e-02 2.3344466573842416e-02 1.2871612598948921e-02 -2.7443787758118588e-03 9.5739108484758501e-03 2.2105030253925947e-02 7.9701385810195466e-03 -1.9386136463632284e-02 -5.9766667348675074e-03 1.6774820674318599e-03 -1.4507644715959262e-02 -2.3706403708932695e-02 3.2094447923972699e-03 1.0109087868293995e-02 -4.1198486703000513e-03 1.4062191413704501e-02 1.6473892614412934e-02 4.3246680991779342e-02 -2.5569046811796197e-03 -7.6554731089178187e-03 -5.4031273001125093e-03 -1.0702406621958361e-02 -6.7000639083012346e-03 -2.6260445308503227e-02 -1.2903388312812387e-02 1.2092426865627814e-02 1.1478047701069796e-04 -7.5655723860281409e-04 7.1174336896032220e-03 7.8302242787578313e-03 6.0848683706496171e-04 3.1978853423348455e-03 3.5627859200863089e-04 -7.1089288255640785e-03 2.0013851611289787e-03 2.5595358151721480e-03 -5.1546800975438697e-03 1.8908243682299224e-03 5.6984160506499187e-03 -4.1198486703000496e-03 -1.9174439270625418e-03 -2.5569046811796197e-03 2.3286241270876178e-02 -7.1347545492406140e-03 -9.7227216202053907e-03 -5.9277193097586316e-03 -3.0701184107215711e-03 -3.3877921742106881e-03 -5.2462303891589691e-03 -2.0852116742722413e-03 -7.7703626099282852e-04 3.6626791843844524e-03 -1.0575052670119427e-02 -1.0334161153705701e-02 -1.2335028112604948e-02 2.5866887537862614e-02 -2.3731284431488418e-03 1.1605141627655153e-02 1.1774059455913435e-02 1.0300329013448177e-02 1.8516654865826769e-03 -1.6478980587970520e-02 2.0013851611289787e-03 -1.4507644715959266e-02 -2.1703734181218216e-02 -7.6554731089178213e-03 -7.1347545492406158e-03 3.3996137233971747e-02 -2.4983380934988520e-03 1.6690792566370710e-02 6.5671306727447271e-03 7.9184941192117705e-03 9.6270843998447642e-03 -2.9446447461184352e-02 2.6408925054822851e-03 -5.7972567026484704e-03 -3.1567536588132973e-03 -4.6226856499357464e-03 -2.9771368225760863e-03 -3.2077855357691381e-03 5.0482125933550333e-03 -4.9058666476456988e-04 1.8516654865826806e-03 -3.4806734905236149e-03 5.6101669696199214e-03 2.6412355426022670e-03 -5.1546800975438671e-03 3.2094447923972642e-03 -6.8410350077422102e-03 -5.4031273001125093e-03 -9.7227216202053941e-03 -2.4983380934988537e-03 2.1271311469932028e-02 -3.1995197684646288e-03 7.1161035891342010e-03 8.1964662365732483e-06 6.7612924922119131e-03 4.0949076775043487e-03 -7.6665539914079015e-03 8.0906062178157719e-04 -7.9348879564689959e-03 -1.3422275897713288e-02 -2.6763319768893443e-02 1.5144559168281474e-02 -7.1082587003146527e-04 2.1449263071737987e-03 1.0300329013448189e-02 1.5112146353677488e-02 -3.4806734905236205e-03 -1.5347621262275960e-02 2.5595358151721528e-03 -2.3706403708932705e-02 -8.1493188152596350e-03 -1.0702406621958361e-02 -5.9277193097586299e-03 1.6690792566370710e-02 -3.1995197684646297e-03 4.1737592209088882e-02 8.3965246968806112e-03 8.7760123281670072e-03 2.2055088842782296e-02 -1.9100377410976390e-02 1.5873336611510879e-03 -6.0594910809365658e-03 -6.4040838224935530e-03 -2.9289102925884568e-03 -2.9289102925884568e-03 1.9940844003461062e-03 6.4576403780082755e-03 6.4576403780082746e-03 6.5671306727447323e-03 8.3965246968806112e-03 7.1161035891342036e-03 -9.8302256657768951e-03 -3.0701184107215715e-03 -6.7000639083012355e-03 -9.8302256657768917e-03 -6.7000639083012363e-03 -3.0701184107215715e-03 6.5671306727447254e-03 7.1161035891342010e-03 8.3965246968806112e-03 2.3756630718970426e-02 3.7341040689645752e-03 3.7341040689645747e-03 -1.2820441310758645e-02 -1.3005280121376400e-02 -1.3005280121376400e-02 -4.4770064833932026e-03 -2.2982424312668909e-02 -1.7139273434580781e-02 1.8695553274833139e-02 -4.1191896174491713e-03 -2.2076519457426909e-03 9.6270843998447608e-03 2.2055088842782282e-02 6.7612924922119105e-03 -1.0341138703281644e-02 -5.2462303891589700e-03 -1.2903388312812391e-02 -1.2222213864930016e-02 -2.6260445308503220e-02 -3.3877921742106881e-03 7.9184941192117723e-03 8.1964662365723810e-06 8.7760123281670054e-03 3.7341040689645747e-03 4.1338094541446949e-02 1.8624738104300157e-02 -1.2934876811249371e-02 -4.7930902226855409e-03 1.4760629426674881e-03 -4.4770064833932035e-03 -1.7139273434580785e-02 -2.2982424312668916e-02 1.8695553274833146e-02 -2.2076519457426944e-03 -4.1191896174491670e-03 7.9184941192117740e-03 8.7760123281669985e-03 8.1964662365763925e-06 -1.2222213864930026e-02 -3.3877921742106847e-03 -2.6260445308503237e-02 -1.0341138703281648e-02 -1.2903388312812387e-02 -5.2462303891589691e-03 9.6270843998447642e-03 6.7612924922119131e-03 2.2055088842782296e-02 3.7341040689645747e-03 1.8624738104300154e-02 4.1338094541446949e-02 -1.2934876811249375e-02 1.4760629426674738e-03 -4.7930902226855296e-03 1.5599060744104004e-03 1.8232617175201735e-02 1.8232617175201731e-02 -4.1645452157935511e-02 2.6245006535436065e-03 2.6245006535436000e-03 -2.9446447461184359e-02 -1.9100377410976376e-02 4.0949076775043548e-03 2.3344466573842419e-02 -2.0852116742722435e-03 1.2092426865627826e-02 2.3344466573842416e-02 1.2092426865627814e-02 -2.0852116742722413e-03 -2.9446447461184355e-02 4.0949076775043487e-03 -1.9100377410976390e-02 -1.2820441310758646e-02 -1.2934876811249371e-02 -1.2934876811249373e-02 6.5109949168967632e-02 -2.9239864753795048e-03 -2.9239864753795182e-03 6.1116639925788800e-03 -5.8976051781940691e-03 -2.6420619521431016e-03 2.8467329782061483e-03 -6.2051177283523494e-03 -1.0203993377164508e-04 -5.7972567026484791e-03 -6.0594910809365753e-03 8.0906062178157860e-04 -2.7443787758118527e-03 3.6626791843844498e-03 -7.5655723860280314e-04 1.2871612598948923e-02 1.1478047701069796e-04 -7.7703626099282852e-04 2.6408925054822842e-03 -7.6665539914079015e-03 1.5873336611510881e-03 -1.3005280121376401e-02 -4.7930902226855400e-03 1.4760629426674736e-03 -2.9239864753795026e-03 2.6844398540181294e-02 4.0523815991023830e-04 6.1116639925788791e-03 -2.6420619521431111e-03 -5.8976051781940795e-03 2.8467329782061630e-03 -1.0203993377164661e-04 -6.2051177283523502e-03 2.6408925054822916e-03 1.5873336611510966e-03 -7.6665539914079033e-03 1.2871612598948912e-02 -7.7703626099282939e-04 1.1478047701068517e-04 -2.7443787758118588e-03 -7.5655723860281409e-04 3.6626791843844524e-03 -5.7972567026484713e-03 8.0906062178157741e-04 -6.0594910809365658e-03 -1.3005280121376400e-02 1.4760629426674883e-03 -4.7930902226855313e-03 -2.9239864753795174e-03 4.0523815991023819e-04 2.6844398540181287e-02 228 229 230 300 301 302 315 316 317 243 244 245 231 232 233 303 304 305 318 319 320 246 247 248 2.9309209958904844e-02 5.6924334351978172e-03 5.6924334351978181e-03 -1.7199527512508989e-02 -1.3515986666686025e-02 -1.3515986666686028e-02 -1.1895093122513047e-02 -9.0131237429465390e-03 -3.5396980389925128e-03 8.5166405155559510e-03 7.9347634901029852e-03 1.0737385533860926e-02 8.5166405155559476e-03 1.0737385533860928e-02 7.9347634901029869e-03 -1.1895093122513046e-02 -3.5396980389925123e-03 -9.0131237429465424e-03 -7.2824664662501423e-03 -5.1335719203450033e-03 -5.1335719203450033e-03 1.9296892337684805e-03 6.8377979098083559e-03 6.8377979098083550e-03 5.6924334351978155e-03 4.8861250048653396e-02 2.1693779295549515e-02 -1.6816353608788772e-02 -6.6623658862555489e-03 1.3016353085503673e-03 -1.3823928322555327e-02 -3.0036644645926137e-02 -3.3996396982494976e-03 8.9980839896822394e-03 6.7082155310929583e-04 9.0201834521476468e-03 1.0661210942114710e-02 2.4742625020943442e-02 8.6971019990064388e-03 -1.1621291271731548e-02 -5.2355779946092603e-03 -1.5140916341944147e-02 -3.4660871870854067e-03 -2.5846599751615303e-02 -1.9258862143679490e-02 2.0375932023166291e-02 -6.4935083442998641e-03 -2.9132818713808357e-03 5.6924334351978190e-03 2.1693779295549519e-02 4.8861250048653403e-02 -1.6816353608788793e-02 1.3016353085503708e-03 -6.6623658862555576e-03 -1.1621291271731553e-02 -1.5140916341944151e-02 -5.2355779946092638e-03 1.0661210942114720e-02 8.6971019990064388e-03 2.4742625020943453e-02 8.9980839896822463e-03 9.0201834521476554e-03 6.7082155310928748e-04 -1.3823928322555331e-02 -3.3996396982494954e-03 -3.0036644645926154e-02 -3.4660871870854093e-03 -1.9258862143679494e-02 -2.5846599751615313e-02 2.0375932023166298e-02 -2.9132818713808310e-03 -6.4935083442998667e-03 -1.7199527512508993e-02 -1.6816353608788775e-02 -1.6816353608788789e-02 6.9312351486017165e-02 -2.7215337597175332e-03 -2.7215337597175241e-03 2.8765538269557852e-02 1.7003174919886704e-02 -3.4689833905104453e-03 -3.2979989985555784e-02 3.5958024564192578e-03 -2.1572816842663288e-02 -3.2979989985555784e-02 -2.1572816842663288e-02 3.5958024564192591e-03 2.8765538269557862e-02 -3.4689833905104479e-03 1.7003174919886715e-02 2.5585408992446460e-03 2.0846302023241663e-02 2.0846302023241666e-02 -4.6242461440756957e-02 3.1344082021324128e-03 3.1344082021324163e-03 -1.3515986666686026e-02 -6.6623658862555507e-03 1.3016353085503712e-03 -2.7215337597175332e-03 2.4672511352518141e-02 4.0543958543494949e-04 1.2842626057646814e-02 2.2766241489694306e-03 -5.6394959242825999e-04 2.7519496124521997e-03 -7.8353550836488452e-03 1.8540462619076330e-03 -6.8494933714762819e-03 -6.5298139368188610e-03 4.4551101996470366e-04 -2.6309741472310541e-03 5.5536477993759509e-03 -8.3409477439170372e-04 7.1923366499336977e-03 -4.5904342180807956e-03 -2.4975381098208491e-03 2.9310756250781850e-03 -6.8848141760594686e-03 -1.1104969921684682e-04 -1.3515986666686028e-02 1.3016353085503680e-03 -6.6623658862555541e-03 -2.7215337597175232e-03 4.0543958543494928e-04 2.4672511352518137e-02 -2.6309741472310467e-03 -8.3409477439169949e-04 5.5536477993759492e-03 -6.8494933714762880e-03 4.4551101996470724e-04 -6.5298139368188714e-03 2.7519496124521954e-03 1.8540462619076291e-03 -7.8353550836488400e-03 1.2842626057646819e-02 -5.6394959242826389e-04 2.2766241489694367e-03 7.1923366499336994e-03 -2.4975381098208444e-03 -4.5904342180807913e-03 2.9310756250781754e-03 -1.1104969921684481e-04 -6.8848141760594686e-03 -1.1895093122513047e-02 -1.3823928322555322e-02 -1.1621291271731553e-02 2.8765538269557852e-02 1.2842626057646814e-02 -2.6309741472310467e-03 3.8071973236587849e-02 1.8690114999973570e-02 -2.6969742973952746e-03 -2.4440593371805947e-02 -7.9733987834871949e-03 -8.5070988029072297e-03 -1.8480932571957258e-02 -1.6149220448064217e-02 2.2387953084248499e-03 1.3179006341678293e-02 2.1419795772339538e-03 1.1549988272138278e-02 7.7088218099344141e-03 1.0783666214525279e-02 8.7588386808386785e-03 -3.2908720591482164e-02 -6.5118392952728879e-03 2.9087162578632971e-03 -9.0131237429465390e-03 -3.0036644645926137e-02 -1.5140916341944154e-02 1.7003174919886701e-02 2.2766241489694285e-03 -8.3409477439170003e-04 1.8690114999973570e-02 4.6816933482930860e-02 -3.4728102419393607e-03 -9.2372573871780887e-03 -6.7646339440972612e-03 -1.1964881255184287e-02 -1.7293300273702170e-02 -2.6516177568627283e-02 2.8735304491456751e-03 1.1549988272138278e-02 -3.7643162371938715e-03 1.6949825156203181e-02 9.6044448230658292e-03 2.4894920058482577e-02 9.8112917291051163e-03 -2.1304041611237574e-02 -6.9067052945383355e-03 1.7780552790055281e-03 -3.5396980389925132e-03 -3.3996396982494980e-03 -5.2355779946092629e-03 -3.4689833905104453e-03 -5.6394959242825999e-04 5.5536477993759492e-03 -2.6969742973952742e-03 -3.4728102419393611e-03 2.3796930447831537e-02 -7.7575963956968011e-03 -1.0864298827663349e-02 -6.2572654415980668e-03 2.8685189375823395e-03 3.4570456659088170e-03 -5.7547085893108283e-03 2.1419795772339555e-03 6.2595198735721129e-03 -3.7643162371938702e-03 8.0358764219411807e-03 7.7143230890653102e-03 2.8404599483570115e-04 4.4168771858375576e-03 8.6980973173423118e-04 -8.6227559793311623e-03 8.5166405155559510e-03 8.9980839896822411e-03 1.0661210942114717e-02 -3.2979989985555784e-02 2.7519496124522001e-03 -6.8494933714762871e-03 -2.4440593371805951e-02 -9.2372573871780887e-03 -7.7575963956968003e-03 4.0738016513987264e-02 -2.1349506011829164e-03 1.8472250944829592e-02 1.1754054601710206e-02 1.1331934396879666e-02 2.1349721072226055e-03 -1.8480932571957265e-02 2.8685189375823412e-03 -1.7293300273702177e-02 -1.1357502317148651e-02 -1.1595394012985710e-02 -1.3824586878632812e-02 2.6250306615214217e-02 -2.9828849352497243e-03 1.4456542925341155e-02 7.9347634901029852e-03 6.7082155310929734e-04 8.6971019990064388e-03 3.5958024564192578e-03 -7.8353550836488452e-03 4.4551101996470686e-04 -7.9733987834871949e-03 -6.7646339440972647e-03 -1.0864298827663349e-02 -2.1349506011829182e-03 2.6054103325006784e-02 -2.8235157760532689e-03 2.1349721072226068e-03 -4.5257383068630953e-03 6.3472872407941364e-03 2.2387953084248486e-03 -5.7547085893108292e-03 2.8735304491456734e-03 -3.4639974521319715e-03 -6.0711846434796978e-03 -3.8205353332576362e-03 -2.3319865253676160e-03 4.2266956892836475e-03 -8.5508077193670296e-04 1.0737385533860926e-02 9.0201834521476468e-03 2.4742625020943453e-02 -2.1572816842663288e-02 1.8540462619076326e-03 -6.5298139368188705e-03 -8.5070988029072297e-03 -1.1964881255184284e-02 -6.2572654415980668e-03 1.8472250944829592e-02 -2.8235157760532685e-03 4.8283771747031655e-02 1.1331934396879663e-02 1.5670367150019373e-02 -4.5257383068630997e-03 -1.6149220448064220e-02 3.4570456659088183e-03 -2.6516177568627286e-02 -7.6386309828744394e-03 -1.4413770701743567e-02 -2.9529399902501828e-02 1.3326196200938995e-02 -7.9947479700233923e-04 3.3199838843404081e-04 8.5166405155559493e-03 1.0661210942114710e-02 8.9980839896822463e-03 -3.2979989985555777e-02 -6.8494933714762819e-03 2.7519496124521962e-03 -1.8480932571957258e-02 -1.7293300273702170e-02 2.8685189375823382e-03 1.1754054601710206e-02 2.1349721072226068e-03 1.1331934396879666e-02 4.0738016513987264e-02 1.8472250944829592e-02 -2.1349506011829186e-03 -2.4440593371805947e-02 -7.7575963956967968e-03 -9.2372573871780939e-03 -1.1357502317148650e-02 -1.3824586878632810e-02 -1.1595394012985708e-02 2.6250306615214214e-02 1.4456542925341157e-02 -2.9828849352497256e-03 1.0737385533860928e-02 2.4742625020943442e-02 9.0201834521476554e-03 -2.1572816842663288e-02 -6.5298139368188618e-03 1.8540462619076295e-03 -1.6149220448064217e-02 -2.6516177568627283e-02 3.4570456659088170e-03 1.1331934396879666e-02 -4.5257383068630962e-03 1.5670367150019373e-02 1.8472250944829596e-02 4.8283771747031655e-02 -2.8235157760532724e-03 -8.5070988029072332e-03 -6.2572654415980556e-03 -1.1964881255184292e-02 -7.6386309828744394e-03 -2.9529399902501828e-02 -1.4413770701743567e-02 1.3326196200938990e-02 3.3199838843403864e-04 -7.9947479700234183e-04 7.9347634901029869e-03 8.6971019990064388e-03 6.7082155310929116e-04 3.5958024564192600e-03 4.4551101996470404e-04 -7.8353550836488400e-03 2.2387953084248504e-03 2.8735304491456738e-03 -5.7547085893108274e-03 2.1349721072226060e-03 6.3472872407941382e-03 -4.5257383068630997e-03 -2.1349506011829182e-03 -2.8235157760532724e-03 2.6054103325006784e-02 -7.9733987834871897e-03 -1.0864298827663349e-02 -6.7646339440972543e-03 -3.4639974521319715e-03 -3.8205353332576349e-03 -6.0711846434796926e-03 -2.3319865253676199e-03 -8.5508077193670079e-04 4.2266956892836448e-03 -1.1895093122513044e-02 -1.1621291271731548e-02 -1.3823928322555331e-02 2.8765538269557862e-02 -2.6309741472310532e-03 1.2842626057646821e-02 1.3179006341678295e-02 1.1549988272138274e-02 2.1419795772339555e-03 -1.8480932571957261e-02 2.2387953084248486e-03 -1.6149220448064220e-02 -2.4440593371805944e-02 -8.5070988029072314e-03 -7.9733987834871862e-03 3.8071973236587849e-02 -2.6969742973952768e-03 1.8690114999973570e-02 7.7088218099344149e-03 8.7588386808386855e-03 1.0783666214525284e-02 -3.2908720591482171e-02 2.9087162578632984e-03 -6.5118392952728862e-03 -3.5396980389925123e-03 -5.2355779946092595e-03 -3.3996396982494946e-03 -3.4689833905104488e-03 5.5536477993759501e-03 -5.6394959242826433e-04 2.1419795772339538e-03 -3.7643162371938706e-03 6.2595198735721129e-03 2.8685189375823412e-03 -5.7547085893108292e-03 3.4570456659088174e-03 -7.7575963956967968e-03 -6.2572654415980582e-03 -1.0864298827663349e-02 -2.6969742973952768e-03 2.3796930447831540e-02 -3.4728102419393663e-03 8.0358764219411790e-03 2.8404599483569637e-04 7.7143230890653093e-03 4.4168771858375620e-03 -8.6227559793311641e-03 8.6980973173423248e-04 -9.0131237429465424e-03 -1.5140916341944147e-02 -3.0036644645926154e-02 1.7003174919886715e-02 -8.3409477439170372e-04 2.2766241489694367e-03 1.1549988272138280e-02 1.6949825156203181e-02 -3.7643162371938698e-03 -1.7293300273702177e-02 2.8735304491456738e-03 -2.6516177568627286e-02 -9.2372573871780939e-03 -1.1964881255184294e-02 -6.7646339440972543e-03 1.8690114999973573e-02 -3.4728102419393663e-03 4.6816933482930888e-02 9.6044448230658309e-03 9.8112917291051198e-03 2.4894920058482581e-02 -2.1304041611237584e-02 1.7780552790055268e-03 -6.9067052945383338e-03 -7.2824664662501414e-03 -3.4660871870854067e-03 -3.4660871870854093e-03 2.5585408992446473e-03 7.1923366499336968e-03 7.1923366499336994e-03 7.7088218099344158e-03 9.6044448230658275e-03 8.0358764219411807e-03 -1.1357502317148650e-02 -3.4639974521319707e-03 -7.6386309828744376e-03 -1.1357502317148650e-02 -7.6386309828744385e-03 -3.4639974521319715e-03 7.7088218099344141e-03 8.0358764219411790e-03 9.6044448230658309e-03 2.7201394949617735e-02 4.4210795996373229e-03 4.4210795996373229e-03 -1.5180108368183766e-02 -1.4685021872486211e-02 -1.4685021872486215e-02 -5.1335719203450033e-03 -2.5846599751615303e-02 -1.9258862143679494e-02 2.0846302023241663e-02 -4.5904342180807974e-03 -2.4975381098208444e-03 1.0783666214525280e-02 2.4894920058482581e-02 7.7143230890653102e-03 -1.1595394012985708e-02 -6.0711846434796995e-03 -1.4413770701743569e-02 -1.3824586878632812e-02 -2.9529399902501828e-02 -3.8205353332576349e-03 8.7588386808386837e-03 2.8404599483569486e-04 9.8112917291051215e-03 4.4210795996373238e-03 4.6796988344333879e-02 2.0891799366346133e-02 -1.4256333706279427e-02 -5.9383358819745380e-03 1.5732921039849765e-03 -5.1335719203450033e-03 -1.9258862143679487e-02 -2.5846599751615313e-02 2.0846302023241663e-02 -2.4975381098208478e-03 -4.5904342180807921e-03 8.7588386808386785e-03 9.8112917291051163e-03 2.8404599483569909e-04 -1.3824586878632810e-02 -3.8205353332576358e-03 -2.9529399902501828e-02 -1.1595394012985708e-02 -1.4413770701743567e-02 -6.0711846434796934e-03 1.0783666214525284e-02 7.7143230890653093e-03 2.4894920058482591e-02 4.4210795996373238e-03 2.0891799366346137e-02 4.6796988344333879e-02 -1.4256333706279429e-02 1.5732921039849682e-03 -5.9383358819745371e-03 1.9296892337684821e-03 2.0375932023166291e-02 2.0375932023166298e-02 -4.6242461440756957e-02 2.9310756250781850e-03 2.9310756250781754e-03 -3.2908720591482157e-02 -2.1304041611237574e-02 4.4168771858375585e-03 2.6250306615214217e-02 -2.3319865253676156e-03 1.3326196200938995e-02 2.6250306615214214e-02 1.3326196200938991e-02 -2.3319865253676199e-03 -3.2908720591482171e-02 4.4168771858375620e-03 -2.1304041611237584e-02 -1.5180108368183769e-02 -1.4256333706279427e-02 -1.4256333706279429e-02 7.2809708527708128e-02 -3.1577191921363999e-03 -3.1577191921363995e-03 6.8377979098083559e-03 -6.4935083442998615e-03 -2.9132818713808305e-03 3.1344082021324141e-03 -6.8848141760594686e-03 -1.1104969921684474e-04 -6.5118392952728870e-03 -6.9067052945383338e-03 8.6980973173423118e-04 -2.9828849352497239e-03 4.2266956892836475e-03 -7.9947479700233945e-04 1.4456542925341157e-02 3.3199838843403734e-04 -8.5508077193670101e-04 2.9087162578632993e-03 -8.6227559793311623e-03 1.7780552790055268e-03 -1.4685021872486211e-02 -5.9383358819745371e-03 1.5732921039849680e-03 -3.1577191921363995e-03 3.0287425598485677e-02 4.5773002481198867e-04 6.8377979098083559e-03 -2.9132818713808353e-03 -6.4935083442998667e-03 3.1344082021324171e-03 -1.1104969921684702e-04 -6.8848141760594686e-03 2.9087162578632980e-03 1.7780552790055283e-03 -8.6227559793311623e-03 1.4456542925341157e-02 -8.5508077193670274e-04 3.3199838843404102e-04 -2.9828849352497256e-03 -7.9947479700234151e-04 4.2266956892836448e-03 -6.5118392952728853e-03 8.6980973173423162e-04 -6.9067052945383303e-03 -1.4685021872486215e-02 1.5732921039849762e-03 -5.9383358819745345e-03 -3.1577191921363999e-03 4.5773002481198878e-04 3.0287425598485677e-02 171 172 173 243 244 245 258 259 260 186 187 188 174 175 176 246 247 248 261 262 263 189 190 191 2.4240132719570467e-02 2.4573936807546109e-04 8.8817532717040443e-05 -6.4746808301924513e-03 -1.2498069319663312e-02 -1.1583908912260738e-02 -5.6106715350998258e-03 -3.2036285971463437e-03 -2.5224919720308312e-03 3.3674225323245587e-03 7.2238424840649247e-03 6.6752330648876344e-03 2.5486888620197727e-03 5.4943465493640696e-03 5.2841574566308289e-03 -6.3990381744707158e-03 -3.6004800085464180e-03 -4.1142940356862648e-03 -5.6328768285906980e-03 -2.0199827681910887e-04 -2.4950255453626009e-04 -6.0389767455611134e-03 6.5402478006707275e-03 6.4219894202785901e-03 2.4573936807546136e-04 4.4247921080984742e-02 1.9495731888122918e-02 -1.5575281568713403e-02 -8.0890157864960555e-03 6.2721631002320415e-04 -8.1085683555891293e-03 -2.6862644397978780e-02 -1.6102030365876870e-03 8.0092168647395070e-03 3.6847123080314837e-03 9.4326541474960366e-03 5.4366055212858528e-03 2.2092101590912946e-02 7.0796979151765511e-03 -1.0192279510912946e-02 -7.2705652728580076e-03 -1.4320767816401271e-02 1.5736544168748886e-03 -2.3768267698026421e-02 -1.7343262648597133e-02 1.8610913264239765e-02 -4.0342418245699081e-03 -3.3610667592326162e-03 8.8817532717040145e-05 1.9495731888122918e-02 4.2082350293088273e-02 -1.4495051073848979e-02 -1.2752175199530708e-05 -2.1336384316592762e-03 -7.3293601768462911e-03 -1.2978305462817101e-02 -1.8394630779363166e-03 6.3594032263112818e-03 9.1848373996764252e-03 2.0599326957401728e-02 6.2767512225363562e-03 7.4681519838290557e-03 -2.2329115867654259e-03 -1.0267747165232273e-02 -5.4210194907437538e-03 -2.4957914582786938e-02 1.4342391985529570e-03 -1.6938999450056537e-02 -2.2224516555130663e-02 1.7932947235809904e-02 -7.9764469281146707e-04 -9.2932330162113705e-03 -6.4746808301924513e-03 -1.5575281568713399e-02 -1.4495051073848979e-02 6.0427025459355105e-02 3.1851265358687608e-03 -5.3943460476725096e-03 1.9064911265989599e-02 1.6589216486889019e-02 -5.0234367955496540e-03 -2.6685007795452537e-02 -1.2215109022054877e-03 -1.7822346871375204e-02 -2.2932131690466637e-02 -2.0525840538230689e-02 4.9871610985429927e-03 2.3152522404529932e-02 7.1113198502447772e-04 1.3788289011377302e-02 -5.8934222535261486e-03 1.8683598772963838e-02 1.8257115110694139e-02 -4.0659216560236862e-02 -1.8464407715965223e-03 5.7026155678319085e-03 -1.2498069319663314e-02 -8.0890157864960538e-03 -1.2752175199530681e-05 3.1851265358687608e-03 2.1738194945521785e-02 -1.9178525741038558e-04 1.3257805129595814e-02 5.8260048377259495e-03 -1.9816159295879873e-03 -1.1491604777001507e-03 -5.7704649630268235e-03 -9.8022394473514115e-04 -8.2878903385292108e-03 -9.1088811590458677e-03 1.4341253381950634e-03 1.3062027967885787e-03 3.5507642095376547e-03 1.2958385743036180e-03 6.5776864407451003e-03 -1.9442299442682762e-03 -7.0265307625172100e-05 -2.3917007671055823e-03 -6.2023721399483631e-03 5.0667870205953539e-04 -1.1583908912260738e-02 6.2721631002320404e-04 -2.1336384316592767e-03 -5.3943460476725113e-03 -1.9178525741038563e-04 2.2209243314944324e-02 -3.8249300504263010e-03 -2.1668280702553436e-03 5.2768783880730516e-03 -4.6764791064310487e-03 -4.1809915225919170e-04 -3.0017692634386937e-03 3.5078019636894989e-03 3.5598574264793757e-03 -7.0698047215090338e-03 1.0024678634876161e-02 9.1632520128115478e-04 -1.0593756809138505e-03 6.8136656365703182e-03 -2.7124936767763358e-03 -7.3049714158120657e-03 5.1335178816546171e-03 3.8580721891752387e-04 -6.9165621896844602e-03 -5.6106715350998258e-03 -8.1085683555891293e-03 -7.3293601768462911e-03 1.9064911265989599e-02 1.3257805129595816e-02 -3.8249300504263010e-03 2.5736380858190713e-02 1.2481459540577056e-02 -3.0073275147924758e-03 -1.5345404413266693e-02 -8.1979236369118993e-03 -4.3487224186061768e-03 -1.0220323570929264e-02 -1.0778806605861035e-02 2.2707717219881702e-03 8.1781515547087614e-03 3.7594128750016195e-03 6.4081710452349215e-03 1.2023107729622518e-03 5.3085686095087816e-03 5.9137462229016547e-03 -2.3005354932555535e-02 -7.7219475563212120e-03 3.9176511705464982e-03 -3.2036285971463437e-03 -2.6862644397978787e-02 -1.2978305462817101e-02 1.6589216486889019e-02 5.8260048377259486e-03 -2.1668280702553436e-03 1.2481459540577054e-02 4.1209225342286819e-02 -5.2950729316089814e-03 -8.9815537736468980e-03 -7.7132642042830983e-03 -1.0209828660355207e-02 -1.1692131374153435e-02 -2.4326675700669258e-02 4.2857822581374490e-03 1.0752307616540311e-02 -5.7466109604968163e-05 1.4832258599282486e-02 4.1533656766616547e-03 2.1065822069889380e-02 7.9815880379916840e-03 -2.0099035575721357e-02 -9.1410018373660439e-03 3.5504062296250142e-03 -2.5224919720308312e-03 -1.6102030365876879e-03 -1.8394630779363173e-03 -5.0234367955496540e-03 -1.9816159295879873e-03 5.2768783880730525e-03 -3.0073275147924758e-03 -5.2950729316089814e-03 2.0115050624823421e-02 -3.8415927561072215e-03 -9.3708359819858322e-03 -1.8613159169253858e-03 2.9328029912062989e-03 5.1000757028443512e-03 -5.0585319282494380e-03 -2.2938497930471193e-04 5.0473387139582148e-03 -5.0206786718404216e-03 5.7889703568272874e-03 6.0178672585703254e-03 -3.5361682791544649e-03 5.9024606697513091e-03 2.0924462043975973e-03 -8.0757711387904434e-03 3.3674225323245583e-03 8.0092168647395070e-03 6.3594032263112801e-03 -2.6685007795452534e-02 -1.1491604777001505e-03 -4.6764791064310487e-03 -1.5345404413266692e-02 -8.9815537736468963e-03 -3.8415927561072215e-03 3.2271057104446339e-02 8.3121837060533472e-04 1.4487243439186814e-02 6.9555782578765400e-03 1.0427845830486726e-02 -1.1425585997894652e-04 -1.4451023104199621e-02 -6.2410846161347431e-05 -1.3816770390946465e-02 -5.7212584887896510e-03 -9.8239842621947356e-03 -9.9308259906257749e-03 1.9608635907061064e-02 7.4882829387156618e-04 1.1533277438591366e-02 7.2238424840649247e-03 3.6847123080314863e-03 9.1848373996764252e-03 -1.2215109022054886e-03 -5.7704649630268235e-03 -4.1809915225919159e-04 -8.1979236369119010e-03 -7.7132642042830983e-03 -9.3708359819858322e-03 8.3121837060533494e-04 2.0826509824607178e-02 9.3479432904046032e-04 3.5717501249889825e-03 -7.7094560837924020e-04 5.2790444340808200e-03 -5.0723372890583407e-04 -4.0585517698162625e-03 -6.9567071356463177e-04 -3.0404945523998393e-03 -7.7718439172015825e-03 -5.6806599825180697e-03 1.3403518407638169e-03 1.5738483300683428e-03 7.6658966753002055e-04 6.6752330648876326e-03 9.4326541474960366e-03 2.0599326957401728e-02 -1.7822346871375204e-02 -9.8022394473514093e-04 -3.0017692634386954e-03 -4.3487224186061768e-03 -1.0209828660355207e-02 -1.8613159169253886e-03 1.4487243439186814e-02 9.3479432904046054e-04 3.9277000382868618e-02 6.5809786553166286e-03 1.3695972057751433e-02 -5.2940000612601446e-03 -1.3125844502874807e-02 -9.9961545267347916e-05 -2.1429252287962025e-02 -2.8994878382405192e-03 -1.3352496291524154e-02 -2.4421978035708211e-02 1.0452946471705636e-02 5.7908990759392316e-04 -3.8680117749758901e-03 2.5486888620197727e-03 5.4366055212858519e-03 6.2767512225363579e-03 -2.2932131690466637e-02 -8.2878903385292108e-03 3.5078019636894985e-03 -1.0220323570929264e-02 -1.1692131374153435e-02 2.9328029912062993e-03 6.9555782578765409e-03 3.5717501249889821e-03 6.5809786553166286e-03 2.7838008013246415e-02 1.2599111282277007e-02 -2.4282001302020867e-03 -1.6054667137097741e-02 -8.1213464365842893e-03 -5.0942288761024598e-03 -5.1009975754308639e-03 -7.9454029501548461e-03 -7.4701961908964351e-03 1.6965844840781775e-02 1.4439304170869947e-02 -4.3057096355478032e-03 5.4943465493640688e-03 2.2092101590912946e-02 7.4681519838290539e-03 -2.0525840538230686e-02 -9.1088811590458677e-03 3.5598574264793753e-03 -1.0778806605861037e-02 -2.4326675700669254e-02 5.1000757028443521e-03 1.0427845830486726e-02 -7.7094560837923998e-04 1.3695972057751433e-02 1.2599111282277003e-02 4.2486919979451261e-02 -4.3577929763358256e-03 -8.8637766578200904e-03 -7.6199406333468103e-03 -1.0558929814882245e-02 -2.0016674868444141e-03 -2.6091574802098574e-02 -1.2626491467707508e-02 1.3648787626628425e-02 3.3389963331755339e-03 -2.2808429119786384e-03 5.2841574566308289e-03 7.0796979151765511e-03 -2.2329115867654251e-03 4.9871610985429927e-03 1.4341253381950636e-03 -7.0698047215090329e-03 2.2707717219881702e-03 4.2857822581374490e-03 -5.0585319282494380e-03 -1.1425585997894652e-04 5.2790444340808200e-03 -5.2940000612601438e-03 -2.4282001302020880e-03 -4.3577929763358248e-03 2.1492478255534939e-02 -4.1427589078107518e-03 -9.3992340761235305e-03 -2.9253288646951714e-03 -2.4733769615202230e-03 -2.2007060861499042e-03 -2.7378711341973574e-03 -3.3834984176499827e-03 -2.1209168069806243e-03 3.8259700411416337e-03 -6.3990381744707175e-03 -1.0192279510912946e-02 -1.0267747165232275e-02 2.3152522404529932e-02 1.3062027967885791e-03 1.0024678634876161e-02 8.1781515547087597e-03 1.0752307616540309e-02 -2.2938497930471188e-04 -1.4451023104199621e-02 -5.0723372890583429e-04 -1.3125844502874807e-02 -1.6054667137097741e-02 -8.8637766578200921e-03 -4.1427589078107518e-03 3.0659476854618162e-02 3.9444554827623040e-04 1.5089077725254184e-02 2.0565171758385485e-03 7.9346442878695592e-03 6.9262119646161680e-03 -2.7141939573927333e-02 -8.2431035183581371e-04 -4.2742327695239691e-03 -3.6004800085464180e-03 -7.2705652728580067e-03 -5.4210194907437538e-03 7.1113198502447740e-04 3.5507642095376555e-03 9.1632520128115478e-04 3.7594128750016195e-03 -5.7466109604967946e-05 5.0473387139582148e-03 -6.2410846161347553e-05 -4.0585517698162633e-03 -9.9961545267348187e-05 -8.1213464365842893e-03 -7.6199406333468086e-03 -9.3992340761235305e-03 3.9444554827623024e-04 1.8838943207373605e-02 5.0638781595917996e-04 7.2376285916996063e-03 2.9302415384059605e-03 8.3193891338266320e-03 -3.1838170870987834e-04 -6.3134251696911718e-03 1.3077424710945229e-04 -4.1142940356862648e-03 -1.4320767816401271e-02 -2.4957914582786945e-02 1.3788289011377302e-02 1.2958385743036178e-03 -1.0593756809138511e-03 6.4081710452349215e-03 1.4832258599282484e-02 -5.0206786718404225e-03 -1.3816770390946465e-02 -6.9567071356463209e-04 -2.1429252287962025e-02 -5.0942288761024598e-03 -1.0558929814882247e-02 -2.9253288646951727e-03 1.5089077725254184e-02 5.0638781595917985e-04 3.8135431511857117e-02 5.2784108805522022e-03 9.8693092684131595e-03 2.0329737191980141e-02 -1.7538655359683419e-02 -9.2842591311029698e-04 -3.0726186156388403e-03 -5.6328768285906980e-03 1.5736544168748886e-03 1.4342391985529565e-03 -5.8934222535261468e-03 6.5776864407451011e-03 6.8136656365703182e-03 1.2023107729622507e-03 4.1533656766616547e-03 5.7889703568272874e-03 -5.7212584887896493e-03 -3.0404945523998385e-03 -2.8994878382405196e-03 -5.1009975754308639e-03 -2.0016674868444146e-03 -2.4733769615202230e-03 2.0565171758385467e-03 7.2376285916996063e-03 5.2784108805522031e-03 2.2503908123131199e-02 -1.0856170134443490e-03 -1.1378314130295365e-03 -3.4141809255946393e-03 -1.3414556073292651e-02 -1.2804589859712483e-02 -2.0199827681910941e-04 -2.3768267698026421e-02 -1.6938999450056537e-02 1.8683598772963841e-02 -1.9442299442682762e-03 -2.7124936767763353e-03 5.3085686095087816e-03 2.1065822069889380e-02 6.0178672585703254e-03 -9.8239842621947356e-03 -7.7718439172015817e-03 -1.3352496291524152e-02 -7.9454029501548444e-03 -2.6091574802098571e-02 -2.2007060861499038e-03 7.9346442878695592e-03 2.9302415384059605e-03 9.8693092684131577e-03 -1.0856170134443490e-03 4.1325420505040712e-02 1.8454721358122903e-02 -1.2869809167729144e-02 -5.7455677517412058e-03 8.6279761940054474e-04 -2.4950255453626041e-04 -1.7343262648597133e-02 -2.2224516555130663e-02 1.8257115110694142e-02 -7.0265307625172154e-05 -7.3049714158120666e-03 5.9137462229016547e-03 7.9815880379916840e-03 -3.5361682791544640e-03 -9.9308259906257749e-03 -5.6806599825180697e-03 -2.4421978035708204e-02 -7.4701961908964351e-03 -1.2626491467707507e-02 -2.7378711341973579e-03 6.9262119646161663e-03 8.3193891338266320e-03 2.0329737191980137e-02 -1.1378314130295365e-03 1.8454721358122907e-02 3.9979448997635364e-02 -1.2308717149123957e-02 9.6498087650665832e-04 -8.3680769612734258e-05 -6.0389767455611143e-03 1.8610913264239765e-02 1.7932947235809904e-02 -4.0659216560236862e-02 -2.3917007671055823e-03 5.1335178816546171e-03 -2.3005354932555535e-02 -2.0099035575721357e-02 5.9024606697513100e-03 1.9608635907061064e-02 1.3403518407638165e-03 1.0452946471705636e-02 1.6965844840781775e-02 1.3648787626628425e-02 -3.3834984176499827e-03 -2.7141939573927333e-02 -3.1838170870987742e-04 -1.7538655359683415e-02 -3.4141809255946397e-03 -1.2869809167729144e-02 -1.2308717149123957e-02 6.3685187990032643e-02 2.0788744876339572e-03 -6.1910013324641081e-03 6.5402478006707275e-03 -4.0342418245699081e-03 -7.9764469281146696e-04 -1.8464407715965230e-03 -6.2023721399483613e-03 3.8580721891752387e-04 -7.7219475563212112e-03 -9.1410018373660439e-03 2.0924462043975973e-03 7.4882829387156564e-04 1.5738483300683425e-03 5.7908990759392295e-04 1.4439304170869947e-02 3.3389963331755357e-03 -2.1209168069806243e-03 -8.2431035183581241e-04 -6.3134251696911718e-03 -9.2842591311029644e-04 -1.3414556073292653e-02 -5.7455677517412058e-03 9.6498087650665691e-04 2.0788744876339559e-03 2.6523764060072813e-02 -1.7533679451331387e-04 6.4219894202785901e-03 -3.3610667592326162e-03 -9.2932330162113705e-03 5.7026155678319085e-03 5.0667870205953550e-04 -6.9165621896844602e-03 3.9176511705464991e-03 3.5504062296250142e-03 -8.0757711387904416e-03 1.1533277438591366e-02 7.6658966753002065e-04 -3.8680117749758892e-03 -4.3057096355478023e-03 -2.2808429119786379e-03 3.8259700411416337e-03 -4.2742327695239682e-03 1.3077424710945186e-04 -3.0726186156388407e-03 -1.2804589859712483e-02 8.6279761940054453e-04 -8.3680769612734258e-05 -6.1910013324641081e-03 -1.7533679451331392e-04 2.7483907463772106e-02 243 244 245 315 316 317 330 331 332 258 259 260 246 247 248 318 319 320 333 334 335 261 262 263 2.6579773091860659e-02 9.1797296245411887e-04 7.0378585778103095e-04 -8.2963795761306185e-03 -1.3901038023843503e-02 -1.2682288935022781e-02 -6.8284180169871254e-03 -4.2293815436297609e-03 -2.8183386130729024e-03 4.4914041789060020e-03 8.2144778998003206e-03 7.7826652766717769e-03 3.4432707724700749e-03 6.5453170279541886e-03 5.9002593794161805e-03 -7.6554482897093958e-03 -4.0814474071919496e-03 -5.0935752695726857e-03 -6.2799514800275453e-03 -8.1438091884434140e-04 -8.4150603649672329e-04 -5.4542506803820483e-03 7.3484800033009274e-03 7.0489983402961098e-03 9.1797296245411887e-04 4.9244807748181123e-02 2.1956197043359153e-02 -1.7736632951279703e-02 -9.7200550208346725e-03 4.7560845051359901e-04 -9.4229257806515126e-03 -3.0462766316720423e-02 -2.1733857155414138e-03 9.2429826026451754e-03 4.9001265351514330e-03 1.0766293707744921e-02 6.7786515424458791e-03 2.5116508039244100e-02 7.8701964710515462e-03 -1.1668119997049028e-02 -8.6794386349357527e-03 -1.6245894244919901e-02 1.0646644289721925e-03 -2.6803776407992346e-02 -1.9344385013936403e-02 2.0823407192462874e-02 -3.5954059420934634e-03 -3.3046306982714864e-03 7.0378585778103117e-04 2.1956197043359160e-02 4.6600690062073798e-02 -1.6399829229124877e-02 -4.3295791679051268e-04 -2.9381388909200238e-03 -8.3729536115830800e-03 -1.4757344185571904e-02 -2.7557866077050244e-03 7.7032680767587644e-03 1.0431335964214668e-02 2.3164996759353632e-02 7.2521051681844195e-03 8.7794810964046677e-03 -1.8884582068078909e-03 -1.1739245771176300e-02 -6.4295678327121603e-03 -2.7986234344947833e-02 9.3973952020650470e-04 -1.9078301559424190e-02 -2.4755752605889580e-02 1.9913129988953532e-02 -4.6884260947972783e-04 -9.4413161651570529e-03 -8.2963795761306150e-03 -1.7736632951279706e-02 -1.6399829229124873e-02 6.6720846929784014e-02 4.1426928915608806e-03 -5.5365124304833559e-03 2.1954069327142899e-02 1.8707818439616837e-02 -5.0266962087952977e-03 -3.0327023055146462e-02 -1.8357109417127114e-03 -1.9709412719770360e-02 -2.6066740690079970e-02 -2.3014617247430105e-02 5.1866946580197632e-03 2.6194959972989786e-02 1.3746153791328413e-03 1.5647183159223137e-02 -5.0921487041262524e-03 2.0905783172102215e-02 2.0113527599592323e-02 -4.5087584204433394e-02 -2.5439487419902547e-03 5.7250451713386410e-03 -1.3901038023843505e-02 -9.7200550208346708e-03 -4.3295791679051274e-04 4.1426928915608806e-03 2.3811551552061317e-02 -2.6401345445254938e-04 1.4916117442833972e-02 7.2313935228874651e-03 -2.0671498587588825e-03 -1.7887942283050125e-03 -6.6530280530400603e-03 -1.3890122333344824e-03 -9.4513684714391429e-03 -1.0553301766231258e-02 1.6101318404374042e-03 1.9243287991391666e-03 4.1708875355357302e-03 1.6661783015527844e-03 7.4044835404523937e-03 -1.3468337734846305e-03 2.6294295803211735e-04 -3.2464219503987547e-03 -6.9406139968938895e-03 6.1388036331411796e-04 -1.2682288935022781e-02 4.7560845051359808e-04 -2.9381388909200238e-03 -5.5365124304833568e-03 -2.6401345445254949e-04 2.4127709632151183e-02 -3.9188132770148487e-03 -2.2955986916584994e-03 5.9817489729471962e-03 -5.3227397204493321e-03 -4.6701851587399590e-04 -3.8074851346635193e-03 3.6905634404966687e-03 3.6830571554632308e-03 -7.7508079458282570e-03 1.1064883177405468e-02 1.0931216567455467e-03 -7.0407950122201087e-04 7.4308312207788611e-03 -2.7045364351045010e-03 -7.4025939662020054e-03 5.2740765242893228e-03 4.7937983436716791e-04 -7.5063531662625605e-03 -6.8284180169871263e-03 -9.4229257806515126e-03 -8.3729536115830800e-03 2.1954069327142899e-02 1.4916117442833970e-02 -3.9188132770148478e-03 2.9630698909635385e-02 1.4364086644909176e-02 -3.0555451731539146e-03 -1.8661753795066970e-02 -9.5333101612285129e-03 -4.9718278559376218e-03 -1.1861848148550836e-02 -1.2276478571746177e-02 2.4128423951929371e-03 9.6961672834291260e-03 4.4767810082448371e-03 7.4511727318229137e-03 2.4455775411898898e-03 6.3345326418903511e-03 6.4533356502038943e-03 -2.6374493100792366e-02 -8.8588032242521361e-03 4.0017891404697109e-03 -4.2293815436297609e-03 -3.0462766316720419e-02 -1.4757344185571904e-02 1.8707818439616837e-02 7.2313935228874651e-03 -2.2955986916584998e-03 1.4364086644909180e-02 4.6716875954235959e-02 -5.3068709289846080e-03 -1.0455378918544200e-02 -1.0198450601933303e-02 -1.1210402898298688e-02 -1.3550859326928186e-02 -2.7344741919048485e-02 4.4701376444692678e-03 1.2257959679578167e-02 7.3842932890638745e-04 1.6565407578922667e-02 5.3884927051938043e-03 2.4337724207813088e-02 8.8705281474445313e-03 -2.2482737680195833e-02 -1.1018464176140681e-02 3.6641433336772168e-03 -2.8183386130729024e-03 -2.1733857155414146e-03 -2.7557866077050244e-03 -5.0266962087952977e-03 -2.0671498587588820e-03 5.9817489729471962e-03 -3.0555451731539150e-03 -5.3068709289846080e-03 2.2641193048119377e-02 -4.7750697415785137e-03 -1.0523715045146927e-02 -3.6893006583024858e-03 3.0520501380663203e-03 5.1282867047886104e-03 -5.5209656962594425e-03 1.0325126497643639e-04 5.5492740135656120e-03 -4.8043740406951106e-03 6.5585852975766183e-03 7.1983307748917430e-03 -2.7369912466536769e-03 5.9617630359812511e-03 2.1952300551858666e-03 -9.1155237714508307e-03 4.4914041789060029e-03 9.2429826026451754e-03 7.7032680767587644e-03 -3.0327023055146465e-02 -1.7887942283050125e-03 -5.3227397204493312e-03 -1.8661753795066970e-02 -1.0455378918544200e-02 -4.7750697415785128e-03 3.6965846246006344e-02 1.3593313306119099e-03 1.6427047571277276e-02 8.5133984218325187e-03 1.1965657428552412e-02 1.0305830142821513e-04 -1.6564350245795938e-02 -4.8333888222634719e-04 -1.5769208601832570e-02 -7.3671493575862227e-03 -1.1213143020004625e-02 -1.1461956274063993e-02 2.2949627606850726e-02 1.3726836872706876e-03 1.3095600388460161e-02 8.2144778998003206e-03 4.9001265351514330e-03 1.0431335964214666e-02 -1.8357109417127108e-03 -6.6530280530400594e-03 -4.6701851587399568e-04 -9.5333101612285146e-03 -1.0198450601933303e-02 -1.0523715045146929e-02 1.3593313306119099e-03 2.3720176411127388e-02 1.5363427890390151e-03 4.3053294723509935e-03 -8.3272657889194008e-05 5.7677927994325539e-03 -8.6232876987075253e-04 -4.6296845014876745e-03 -1.1694575681456538e-03 -3.5853586518454581e-03 -9.5604041158261800e-03 -6.6503914557068545e-03 1.9375698218942090e-03 2.5045369838975892e-03 1.0751110321871983e-03 7.7826652766717760e-03 1.0766293707744920e-02 2.3164996759353632e-02 -1.9709412719770357e-02 -1.3890122333344826e-03 -3.8074851346635193e-03 -4.9718278559376210e-03 -1.1210402898298687e-02 -3.6893006583024876e-03 1.6427047571277276e-02 1.5363427890390149e-03 4.3875970256537625e-02 7.5876574777699558e-03 1.5149301642271398e-02 -5.2326465947522679e-03 -1.4636646673072849e-02 -6.1845771827905981e-04 -2.3827642308483624e-02 -3.8373256060842669e-03 -1.4987461675190132e-02 -2.7399825334656975e-02 1.1357842529146083e-02 7.5339638604702132e-04 -3.0840669850323633e-03 3.4432707724700758e-03 6.7786515424458800e-03 7.2521051681844195e-03 -2.6066740690079967e-02 -9.4513684714391429e-03 3.6905634404966687e-03 -1.1861848148550836e-02 -1.3550859326928186e-02 3.0520501380663211e-03 8.5133984218325187e-03 4.3053294723509944e-03 7.5876574777699558e-03 3.1446479185464914e-02 1.4536846334117288e-02 -2.5658470804655500e-03 -1.8864744725245117e-02 -9.4034355747199434e-03 -6.1531489083942311e-03 -6.4547442986536393e-03 -9.4903439966288264e-03 -8.4999277202672564e-03 1.9844929482762053e-02 1.6275180020801930e-02 -4.3634525153903158e-03 6.5453170279541886e-03 2.5116508039244100e-02 8.7794810964046659e-03 -2.3014617247430105e-02 -1.0553301766231262e-02 3.6830571554632308e-03 -1.2276478571746177e-02 -2.7344741919048485e-02 5.1282867047886113e-03 1.1965657428552412e-02 -8.3272657889194116e-05 1.5149301642271400e-02 1.4536846334117292e-02 4.7388922238237458e-02 -4.4651982419894390e-03 -1.0141235006297055e-02 -9.5496409435920134e-03 -1.1913114536426680e-02 -2.8615437736492595e-03 -2.9610460309660420e-02 -1.4085715894564154e-02 1.5246053808498696e-02 4.6359873189398106e-03 -2.2760979259476158e-03 5.9002593794161805e-03 7.8701964710515444e-03 -1.8884582068078902e-03 5.1866946580197623e-03 1.6101318404374042e-03 -7.7508079458282570e-03 2.4128423951929375e-03 4.4701376444692678e-03 -5.5209656962594425e-03 1.0305830142821513e-04 5.7677927994325548e-03 -5.2326465947522679e-03 -2.5658470804655496e-03 -4.4651982419894390e-03 2.3734014755130713e-02 -4.7830909386857804e-03 -1.0368032353605026e-02 -4.1286735863034357e-03 -2.7303619292964945e-03 -2.7077549802014692e-03 -3.7358611349195955e-03 -3.5235547856092703e-03 -2.1772731795948390e-03 4.5233984097401685e-03 -7.6554482897093958e-03 -1.1668119997049028e-02 -1.1739245771176302e-02 2.6194959972989783e-02 1.9243287991391662e-03 1.1064883177405466e-02 9.6961672834291242e-03 1.2257959679578169e-02 1.0325126497643659e-04 -1.6564350245795938e-02 -8.6232876987075231e-04 -1.4636646673072849e-02 -1.8864744725245117e-02 -1.0141235006297055e-02 -4.7830909386857813e-03 3.4488952653838945e-02 8.8208187166000074e-04 1.7028189535738869e-02 3.4096992276661867e-03 8.8844603957828911e-03 7.9539765370941935e-03 -3.0705235877173581e-02 -1.2771469729433889e-03 -4.9913171322800475e-03 -4.0814474071919496e-03 -8.6794386349357527e-03 -6.4295678327121594e-03 1.3746153791328415e-03 4.1708875355357319e-03 1.0931216567455467e-03 4.4767810082448362e-03 7.3842932890638756e-04 5.5492740135656120e-03 -4.8333888222634714e-04 -4.6296845014876745e-03 -6.1845771827905949e-04 -9.4034355747199452e-03 -9.5496409435920152e-03 -1.0368032353605026e-02 8.8208187166000009e-04 2.1017050230456077e-02 1.0967500016434057e-03 8.2634663592706693e-03 4.2836903035129593e-03 9.6178784635715820e-03 -1.0287227541701065e-03 -7.3512933183957092e-03 5.9033769070099070e-05 -5.0935752695726866e-03 -1.6245894244919904e-02 -2.7986234344947833e-02 1.5647183159223137e-02 1.6661783015527846e-03 -7.0407950122200892e-04 7.4511727318229120e-03 1.6565407578922667e-02 -4.8043740406951106e-03 -1.5769208601832570e-02 -1.1694575681456536e-03 -2.3827642308483624e-02 -6.1531489083942311e-03 -1.1913114536426680e-02 -4.1286735863034357e-03 1.7028189535738869e-02 1.0967500016434055e-03 4.2543784947311092e-02 6.4780563708355821e-03 1.1271331540888951e-02 2.3057826563182768e-02 -1.9588669017821012e-02 -1.2712010735155639e-03 -4.1506077288418694e-03 -6.2799514800275453e-03 1.0646644289721925e-03 9.3973952020650492e-04 -5.0921487041262542e-03 7.4044835404523937e-03 7.4308312207788619e-03 2.4455775411898906e-03 5.3884927051938052e-03 6.5585852975766201e-03 -7.3671493575862218e-03 -3.5853586518454568e-03 -3.8373256060842660e-03 -6.4547442986536401e-03 -2.8615437736492604e-03 -2.7303619292964954e-03 3.4096992276661849e-03 8.2634663592706693e-03 6.4780563708355804e-03 2.5705097314785028e-02 -3.7529099379829530e-04 -4.6250316624869543e-04 -6.3663802432474392e-03 -1.5298913614596048e-02 -1.4377021707768107e-02 -8.1438091884434172e-04 -2.6803776407992346e-02 -1.9078301559424190e-02 2.0905783172102215e-02 -1.3468337734846314e-03 -2.7045364351045015e-03 6.3345326418903511e-03 2.4337724207813084e-02 7.1983307748917430e-03 -1.1213143020004625e-02 -9.5604041158261800e-03 -1.4987461675190132e-02 -9.4903439966288264e-03 -2.9610460309660417e-02 -2.7077549802014692e-03 8.8844603957828928e-03 4.2836903035129601e-03 1.1271331540888947e-02 -3.7529099379829541e-04 4.7000586333372216e-02 2.0621329498180043e-02 -1.4231617280499369e-02 -8.3005262377346782e-03 3.8706283595954234e-04 -8.4150603649672275e-04 -1.9344385013936403e-02 -2.4755752605889580e-02 2.0113527599592319e-02 2.6294295803211680e-04 -7.4025939662020045e-03 6.4533356502038952e-03 8.8705281474445313e-03 -2.7369912466536765e-03 -1.1461956274063993e-02 -6.6503914557068562e-03 -2.7399825334656975e-02 -8.4999277202672564e-03 -1.4085715894564154e-02 -3.7358611349195955e-03 7.9539765370941901e-03 9.6178784635715820e-03 2.3057826563182768e-02 -4.6250316624869598e-04 2.0621329498180043e-02 4.4984120741553786e-02 -1.3254946589813738e-02 7.0781329697914631e-04 -2.0109230164147254e-03 -5.4542506803820501e-03 2.0823407192462874e-02 1.9913129988953532e-02 -4.5087584204433394e-02 -3.2464219503987543e-03 5.2740765242893228e-03 -2.6374493100792363e-02 -2.2482737680195833e-02 5.9617630359812502e-03 2.2949627606850726e-02 1.9375698218942088e-03 1.1357842529146085e-02 1.9844929482762053e-02 1.5246053808498701e-02 -3.5235547856092711e-03 -3.0705235877173581e-02 -1.0287227541701065e-03 -1.9588669017821008e-02 -6.3663802432474374e-03 -1.4231617280499369e-02 -1.3254946589813736e-02 7.1193387016416032e-02 2.9824688424082845e-03 -6.1396416851261532e-03 7.3484800033009274e-03 -3.5954059420934626e-03 -4.6884260947972729e-04 -2.5439487419902551e-03 -6.9406139968938895e-03 4.7937983436716791e-04 -8.8588032242521344e-03 -1.1018464176140681e-02 2.1952300551858674e-03 1.3726836872706872e-03 2.5045369838975892e-03 7.5339638604702056e-04 1.6275180020801930e-02 4.6359873189398089e-03 -2.1772731795948390e-03 -1.2771469729433889e-03 -7.3512933183957092e-03 -1.2712010735155634e-03 -1.5298913614596048e-02 -8.3005262377346782e-03 7.0781329697914620e-04 2.9824688424082840e-03 3.0065779368421024e-02 -2.1850270998907136e-04 7.0489983402961098e-03 -3.3046306982714864e-03 -9.4413161651570546e-03 5.7250451713386410e-03 6.1388036331411807e-04 -7.5063531662625605e-03 4.0017891404697100e-03 3.6641433336772168e-03 -9.1155237714508307e-03 1.3095600388460162e-02 1.0751110321871988e-03 -3.0840669850323663e-03 -4.3634525153903167e-03 -2.2760979259476163e-03 4.5233984097401703e-03 -4.9913171322800466e-03 5.9033769070099504e-05 -4.1506077288418694e-03 -1.4377021707768108e-02 3.8706283595954202e-04 -2.0109230164147250e-03 -6.1396416851261550e-03 -2.1850270998907093e-04 3.0785392423419228e-02 129 130 131 201 202 203 216 217 218 144 145 146 132 133 134 204 205 206 219 220 221 147 148 149 2.6758301462276753e-02 5.4751186526254382e-03 8.0415511825070052e-03 -1.6746296582962509e-02 -5.8589167488818953e-03 -1.2944463470187653e-02 -1.5353345498206982e-02 -8.8981756177812232e-03 -6.5217099776218165e-03 5.7147463650553763e-03 1.0930465333375773e-03 8.3360199139378231e-03 1.1542646116987779e-02 1.0293963847853152e-02 1.1443021412980090e-02 -8.7599192357911138e-03 1.4767878049673755e-03 -8.0442223655733391e-03 -7.3071747158317789e-03 -5.3772081866687912e-03 -6.9889023509744318e-03 4.1510420884724730e-03 1.7953837145483645e-03 6.6787056549323220e-03 5.4751186526254400e-03 3.5475385812683030e-02 1.6411074745941844e-02 -7.7990500349286902e-03 1.6012160773332563e-03 3.8527355971121474e-03 -1.3415157853031944e-02 -1.9531864963478876e-02 -6.1611446126798074e-03 1.9792000170094260e-03 -7.5080296871437927e-03 1.8683830289111525e-03 9.6927946150532872e-03 1.5849846212716772e-02 8.6816902804028005e-03 -3.5591395147222009e-03 2.2220056060796331e-03 -8.1615895410619421e-03 -4.1710546137233477e-03 -1.6409141152151398e-02 -1.4596749894213969e-02 1.1797288731718029e-02 -1.1699417906038630e-02 -1.8943996044122220e-03 8.0415511825070052e-03 1.6411074745941844e-02 4.6769725208104837e-02 -1.5101900814635848e-02 5.1445632150195703e-03 -1.1661710844940668e-02 -1.6169141128449884e-02 -1.3039543256302927e-02 -1.1288698144611670e-02 8.3153108007210687e-03 1.6621340046802486e-03 2.3697286448336269e-02 1.1878110324685394e-02 8.7602033825420547e-03 7.2223511337571565e-03 -8.5139213864421238e-03 5.1313088910476500e-03 -2.8808491922868613e-02 -5.7373578939834118e-03 -1.5511503698071017e-02 -2.5922832076058253e-02 1.7287348915597800e-02 -8.5582372848574291e-03 -7.6298017190688360e-06 -1.6746296582962512e-02 -7.7990500349286885e-03 -1.5101900814635852e-02 5.1518841894729321e-02 -1.4731805101819387e-02 4.7810068621493163e-03 2.8298803140842953e-02 4.9852657497721983e-03 3.7205708412314533e-03 -1.9062540191658529e-02 1.2081616820144541e-02 -1.8647618026153414e-02 -3.2031681139919957e-02 -9.9925258962794763e-03 -3.7064053186953764e-03 1.5069192690114966e-02 -1.0470136061373762e-02 1.5015546116419903e-02 4.9915949521293877e-03 1.2586836178346146e-02 1.7789316481598389e-02 -3.2037914763275645e-02 1.3339798346138427e-02 -3.8505161419144264e-03 -5.8589167488818945e-03 1.6012160773332556e-03 5.1445632150195712e-03 -1.4731805101819389e-02 2.8586768862840124e-02 -2.1484093425522366e-03 1.1055873894581941e-03 -6.9382561935502282e-03 3.1163041871262211e-04 8.3670201788231639e-03 -1.4449907205850094e-02 1.0269909023844668e-02 4.1650307682681376e-03 1.7673461576605716e-03 5.9049826449198990e-04 -8.8264718939764022e-03 1.2285875679169020e-02 -7.6329715082375914e-03 2.4054026529799055e-03 -1.0725273504476841e-02 -8.5694176241368561e-03 1.3374152755148284e-02 -1.2127769873125811e-02 2.0341975528578365e-03 -1.2944463470187653e-02 3.8527355971121465e-03 -1.1661710844940667e-02 4.7810068621493163e-03 -2.1484093425522366e-03 2.2129262175989740e-02 3.8148358781423626e-03 7.3546364635096863e-04 3.9018719592873539e-03 -7.8587901615577282e-03 5.0816756046143403e-03 -1.1736103782094692e-02 -3.3095947800508229e-03 -1.4223450947778130e-03 -6.5677616372150967e-03 1.2353217315153067e-02 -6.5136119187747792e-03 8.3839928969578464e-03 6.8240747605261120e-03 -1.5196855377891203e-03 1.5359647861709069e-03 -3.6602864041746564e-03 1.9341770458164949e-03 -5.9855155541553981e-03 -1.5353345498206978e-02 -1.3415157853031944e-02 -1.6169141128449884e-02 2.8298803140842953e-02 1.1055873894581952e-03 3.8148358781423630e-03 4.5628493484791352e-02 1.7352484979636179e-02 3.7057164851573478e-03 -1.8727861165521938e-02 2.9687835524406692e-03 -1.3589905736870260e-02 -2.6575182881328097e-02 -1.5359710877461942e-02 -3.0548910085277823e-03 7.5094332126408522e-03 -8.0480417962267414e-03 1.6325876502113770e-02 1.1313238286464479e-02 1.1064544273980313e-02 1.2594785400021256e-02 -3.2093578579682633e-02 4.3315103312052744e-03 -3.6272763915868142e-03 -8.8981756177812232e-03 -1.9531864963478876e-02 -1.3039543256302927e-02 4.9852657497721983e-03 -6.9382561935502299e-03 7.3546364635096884e-04 1.7352484979636176e-02 3.4102026377601333e-02 2.5059363694014429e-03 1.6387250397686876e-03 1.4141075963939212e-03 -7.7963540850193936e-03 -1.5861948213298564e-02 -1.6644002028631949e-02 -2.3615087795240638e-03 1.0903105196939256e-03 -1.0709413614533586e-02 1.1877337633913332e-02 9.4475655727600215e-03 1.6753961462219726e-02 9.4990645562744360e-03 -9.7542280305512232e-03 1.5534413639796672e-03 -1.4203960850937948e-03 -6.5217099776218165e-03 -6.1611446126798065e-03 -1.1288698144611670e-02 3.7205708412314537e-03 3.1163041871262221e-04 3.9018719592873534e-03 3.7057164851573478e-03 2.5059363694014424e-03 2.2129187435986318e-02 -1.2330509969279682e-02 -6.5951205548966645e-03 -1.1591318662454395e-02 -2.7469949511450720e-03 -2.0654452344833897e-03 -5.6505158261866383e-03 6.4010779842720873e-03 3.1036332613503647e-03 1.5719028879367866e-03 1.0915580108314947e-02 8.2112097122121266e-03 7.7288367646788430e-03 -3.1437305209292676e-03 6.8930064038330791e-04 -6.8012664146365996e-03 5.7147463650553763e-03 1.9792000170094273e-03 8.3153108007210687e-03 -1.9062540191658525e-02 8.3670201788231639e-03 -7.8587901615577282e-03 -1.8727861165521935e-02 1.6387250397686866e-03 -1.2330509969279682e-02 2.8514596578325668e-02 -5.6531287810365153e-03 1.0765800277789100e-02 6.4591811176934241e-03 1.6073290270506779e-03 6.2230881116633815e-03 -8.8141704915848662e-03 5.7050292127962298e-03 -9.5622860741828956e-03 -8.7909315198866009e-03 -4.1557719584334836e-03 -8.9570414461418845e-03 1.4706979307577460e-02 -9.4884027359781863e-03 1.3404428460988637e-02 1.0930465333375769e-03 -7.5080296871437953e-03 1.6621340046802464e-03 1.2081616820144542e-02 -1.4449907205850090e-02 5.0816756046143403e-03 2.9687835524406687e-03 1.4141075963939212e-03 -6.5951205548966654e-03 -5.6531287810365153e-03 3.0731431740788344e-02 -1.2947868569304886e-02 -7.4877686449777540e-03 -1.1326766150443096e-02 3.4027606513561230e-03 4.7453586873904266e-03 -1.1973910781038443e-02 1.1856178173191722e-02 8.8008863729411137e-04 1.7894689283814386e-03 4.4284595184695035e-03 -8.6279968045930560e-03 1.1323605558911725e-02 -6.8882188281103873e-03 8.3360199139378231e-03 1.8683830289111497e-03 2.3697286448336276e-02 -1.8647618026153417e-02 1.0269909023844667e-02 -1.1736103782094692e-02 -1.3589905736870257e-02 -7.7963540850193953e-03 -1.1591318662454397e-02 1.0765800277789101e-02 -1.2947868569304882e-02 4.7182401618659761e-02 1.5768929691410458e-02 1.1378740176870876e-02 2.0542575844478784e-04 -8.4365859664211288e-03 1.2604745321233676e-02 -2.6476433181342268e-02 -7.2340371287773503e-03 -8.6038974395097993e-03 -2.8692033120503748e-02 1.3037396975084770e-02 -6.7736574570262924e-03 7.4107749209542748e-03 1.1542646116987776e-02 9.6927946150532872e-03 1.1878110324685394e-02 -3.2031681139919964e-02 4.1650307682681385e-03 -3.3095947800508225e-03 -2.6575182881328097e-02 -1.5861948213298564e-02 -2.7469949511450724e-03 6.4591811176934249e-03 -7.4877686449777558e-03 1.5768929691410458e-02 4.7290338627663769e-02 1.6761654946010753e-02 3.6645551470098734e-03 -1.6785906230649451e-02 3.1355809684047997e-03 -1.3047865582950685e-02 -1.4548076704214831e-02 -1.3638290727855783e-02 -1.5669407810441027e-02 2.4648681093767371e-02 3.2329462883951224e-03 3.4622679614818830e-03 1.0293963847853152e-02 1.5849846212716772e-02 8.7602033825420547e-03 -9.9925258962794763e-03 1.7673461576605712e-03 -1.4223450947778134e-03 -1.5359710877461944e-02 -1.6644002028631949e-02 -2.0654452344833901e-03 1.6073290270506775e-03 -1.1326766150443097e-02 1.1378740176870874e-02 1.6761654946010753e-02 3.6335216504216637e-02 2.4609639037698134e-03 2.4782770894051136e-03 2.7434599063456033e-03 -7.3114447749563927e-03 -8.0751634621056157e-03 -1.9872414888255231e-02 -1.2236516750246363e-02 2.2861753255273387e-03 -8.8526857136093130e-03 4.3584439128121507e-04 1.1443021412980089e-02 8.6816902804028005e-03 7.2223511337571582e-03 -3.7064053186953764e-03 5.9049826449198946e-04 -6.5677616372150959e-03 -3.0548910085277823e-03 -2.3615087795240634e-03 -5.6505158261866383e-03 6.2230881116633815e-03 3.4027606513561230e-03 2.0542575844478784e-04 3.6645551470098738e-03 2.4609639037698138e-03 2.4650569151779881e-02 -1.2172916530183438e-02 -6.6872719584945570e-03 -1.0522535871727559e-02 -5.9517432701213201e-03 -6.5061387543926038e-03 -1.1385350268437146e-02 3.5552914558745720e-03 4.1900639239049985e-04 2.0478175595846190e-03 -8.7599192357911138e-03 -3.5591395147222009e-03 -8.5139213864421220e-03 1.5069192690114966e-02 -8.8264718939764022e-03 1.2353217315153067e-02 7.5094332126408522e-03 1.0903105196939248e-03 6.4010779842720864e-03 -8.8141704915848662e-03 4.7453586873904257e-03 -8.4365859664211271e-03 -1.6785906230649447e-02 2.4782770894051136e-03 -1.2172916530183438e-02 2.5206588483392418e-02 -5.6278189659834501e-03 9.8914391522162762e-03 4.8933532138698338e-03 1.6936791051444479e-03 7.7648455206256843e-03 -1.8318571641992642e-02 8.0058049730481386e-03 -7.2871560892204257e-03 1.4767878049673753e-03 2.2220056060796335e-03 5.1313088910476500e-03 -1.0470136061373762e-02 1.2285875679169021e-02 -6.5136119187747792e-03 -8.0480417962267414e-03 -1.0709413614533588e-02 3.1036332613503638e-03 5.7050292127962306e-03 -1.1973910781038443e-02 1.2604745321233676e-02 3.1355809684047997e-03 2.7434599063456038e-03 -6.6872719584945570e-03 -5.6278189659834501e-03 2.9026797941218714e-02 -1.3564954130865477e-02 1.4255692681040433e-03 -8.5115131312353334e-03 4.6570290999702285e-04 1.2403029569311505e-02 -1.5083301606005607e-02 5.4604476245060998e-03 -8.0442223655733374e-03 -8.1615895410619421e-03 -2.8808491922868620e-02 1.5015546116419903e-02 -7.6329715082375914e-03 8.3839928969578464e-03 1.6325876502113770e-02 1.1877337633913330e-02 1.5719028879367871e-03 -9.5622860741828939e-03 1.1856178173191722e-02 -2.6476433181342268e-02 -1.3047865582950685e-02 -7.3114447749563945e-03 -1.0522535871727561e-02 9.8914391522162762e-03 -1.3564954130865475e-02 4.4486777342037265e-02 7.5449090280597375e-03 3.0938464169693140e-03 2.3145625129348701e-02 -1.8123396776102769e-02 9.8435977310470345e-03 -1.1780837280342163e-02 -7.3071747158317789e-03 -4.1710546137233477e-03 -5.7373578939834110e-03 4.9915949521293877e-03 2.4054026529799050e-03 6.8240747605261129e-03 1.1313238286464479e-02 9.4475655727600232e-03 1.0915580108314950e-02 -8.7909315198866009e-03 8.8008863729411115e-04 -7.2340371287773503e-03 -1.4548076704214831e-02 -8.0751634621056140e-03 -5.9517432701213192e-03 4.8933532138698338e-03 1.4255692681040431e-03 7.5449090280597375e-03 2.4249714685051549e-02 4.9828289802447811e-03 6.8796263988613084e-03 -1.4801718197582039e-02 -6.8952370355538969e-03 -1.3241052002880026e-02 -5.3772081866687912e-03 -1.6409141152151398e-02 -1.5511503698071015e-02 1.2586836178346147e-02 -1.0725273504476841e-02 -1.5196855377891203e-03 1.1064544273980313e-02 1.6753961462219726e-02 8.2112097122121266e-03 -4.1557719584334836e-03 1.7894689283814379e-03 -8.6038974395097976e-03 -1.3638290727855785e-02 -1.9872414888255231e-02 -6.5061387543926038e-03 1.6936791051444476e-03 -8.5115131312353300e-03 3.0938464169693158e-03 4.9828289802447802e-03 3.4490015312746626e-02 1.6526793266409712e-02 -7.1566176647576314e-03 2.4848969727710173e-03 4.3093760341713881e-03 -6.9889023509744309e-03 -1.4596749894213968e-02 -2.5922832076058257e-02 1.7789316481598389e-02 -8.5694176241368561e-03 1.5359647861709067e-03 1.2594785400021256e-02 9.4990645562744343e-03 7.7288367646788422e-03 -8.9570414461418845e-03 4.4284595184695035e-03 -2.8692033120503748e-02 -1.5669407810441027e-02 -1.2236516750246361e-02 -1.1385350268437146e-02 7.7648455206256843e-03 4.6570290999702058e-04 2.3145625129348705e-02 6.8796263988613084e-03 1.6526793266409708e-02 4.4246737122873046e-02 -1.3413222193549297e-02 4.4826640174465155e-03 -1.0656948338072340e-02 4.1510420884724739e-03 1.1797288731718029e-02 1.7287348915597800e-02 -3.2037914763275645e-02 1.3374152755148286e-02 -3.6602864041746569e-03 -3.2093578579682626e-02 -9.7542280305512215e-03 -3.1437305209292671e-03 1.4706979307577455e-02 -8.6279968045930560e-03 1.3037396975084770e-02 2.4648681093767371e-02 2.2861753255273396e-03 3.5552914558745720e-03 -1.8318571641992649e-02 1.2403029569311502e-02 -1.8123396776102765e-02 -1.4801718197582045e-02 -7.1566176647576288e-03 -1.3413222193549297e-02 5.3745080692715670e-02 -1.4321803881803248e-02 4.4605985481988514e-03 1.7953837145483641e-03 -1.1699417906038630e-02 -8.5582372848574274e-03 1.3339798346138427e-02 -1.2127769873125811e-02 1.9341770458164949e-03 4.3315103312052744e-03 1.5534413639796663e-03 6.8930064038330823e-04 -9.4884027359781863e-03 1.1323605558911721e-02 -6.7736574570262916e-03 3.2329462883951207e-03 -8.8526857136093130e-03 4.1900639239050001e-04 8.0058049730481404e-03 -1.5083301606005607e-02 9.8435977310470345e-03 -6.8952370355538969e-03 2.4848969727710168e-03 4.4826640174465155e-03 -1.4321803881803246e-02 3.2401231203116963e-02 -2.0368510852001353e-03 6.6787056549323220e-03 -1.8943996044122220e-03 -7.6298017190692697e-06 -3.8505161419144260e-03 2.0341975528578356e-03 -5.9855155541553981e-03 -3.6272763915868142e-03 -1.4203960850937953e-03 -6.8012664146366014e-03 1.3404428460988636e-02 -6.8882188281103873e-03 7.4107749209542748e-03 3.4622679614818830e-03 4.3584439128121485e-04 2.0478175595846186e-03 -7.2871560892204265e-03 5.4604476245060998e-03 -1.1780837280342163e-02 -1.3241052002880026e-02 4.3093760341713881e-03 -1.0656948338072340e-02 4.4605985481988514e-03 -2.0368510852001353e-03 2.5773604908386677e-02 201 202 203 273 274 275 288 289 290 216 217 218 204 205 206 276 277 278 291 292 293 219 220 221 3.0666457396886802e-02 6.6931956751972175e-03 1.0079138337732109e-02 -2.1022280428842337e-02 -6.1221090026752877e-03 -1.5007728278487936e-02 -1.8237074917714317e-02 -1.0244067570943734e-02 -7.6255886427372003e-03 7.5944080015231379e-03 1.1038603784153194e-03 1.0297518827343165e-02 1.4602399756485442e-02 1.1618726223755236e-02 1.3315357012444439e-02 -1.1157996035332228e-02 1.6645417623926460e-03 -1.0101103217184113e-02 -8.7787470781422912e-03 -6.4490222345179047e-03 -8.7922323602929592e-03 6.3328333051357981e-03 1.7348747683765043e-03 7.8346383211825091e-03 6.6931956751972166e-03 3.9220332162652409e-02 1.8112684925723224e-02 -8.5850458871673651e-03 1.8872582239256013e-04 3.7288921027268090e-03 -1.5065846556214187e-02 -2.1423073852017183e-02 -7.2020216596135169e-03 2.3627265084829232e-03 -7.3345468033990269e-03 2.5289955212741090e-03 1.1044983073448993e-02 1.7743946642576239e-02 9.8400537720393349e-03 -4.2306018973588050e-03 1.2062456489960608e-03 -9.1310619585176136e-03 -5.1615652638077880e-03 -1.7779658285261155e-02 -1.6248922908140399e-02 1.2942154347419008e-02 -1.1821971335939907e-02 -1.6286197954919293e-03 1.0079138337732109e-02 1.8112684925723224e-02 5.2659781603691183e-02 -1.7314994454900111e-02 5.4741813260309399e-03 -1.5049726506319389e-02 -1.8541081243184598e-02 -1.4422077707696546e-02 -1.3366187709078698e-02 1.0219135269408885e-02 1.6147232390660666e-03 2.7413628186163250e-02 1.3533612878447489e-02 9.6766821571610522e-03 9.6045931685072757e-03 -1.0447500424477068e-02 5.3421403104519285e-03 -3.3183293948121730e-02 -7.2382509075586349e-03 -1.6781862067634129e-02 -2.9388966660275507e-02 1.9709940544531929e-02 -9.0164721831025342e-03 1.3101718654336329e-03 -2.1022280428842337e-02 -8.5850458871673668e-03 -1.7314994454900114e-02 5.8107182410866223e-02 -1.6038922420200719e-02 6.4323132209253581e-03 3.2478558076896751e-02 5.7782489127726541e-03 4.9496637684411484e-03 -2.2419873306877062e-02 1.3215411801457022e-02 -2.1405316781205354e-02 -3.6781727492691006e-02 -1.0812771935807940e-02 -4.9710455797788771e-03 1.8760197467362287e-02 -1.1301997743358586e-02 1.7045485340725367e-02 7.1768754766793740e-03 1.3522937357969193e-02 2.0281634042236513e-02 -3.6298932203394231e-02 1.4222139914335748e-02 -5.0177395564440603e-03 -6.1221090026752859e-03 1.8872582239256100e-04 5.4741813260309382e-03 -1.6038922420200719e-02 3.1524188830705555e-02 -2.7981061602585819e-03 1.0339012985412625e-03 -6.7794356749555119e-03 3.3305377240831584e-04 9.5016610242817205e-03 -1.5822734914991511e-02 1.1378092343077382e-02 4.5305031427246003e-03 8.5019341211138881e-04 7.6964193608584962e-04 -9.8805336272466664e-03 1.3824539471972820e-02 -8.5045174899494036e-03 2.2840400822567424e-03 -1.0766119309587784e-02 -9.2124269451831046e-03 1.4691459502318344e-02 -1.3019357637647513e-02 2.5600812177886188e-03 -1.5007728278487939e-02 3.7288921027268072e-03 -1.5049726506319385e-02 6.4323132209253581e-03 -2.7981061602585819e-03 2.5132797450513972e-02 5.1725849462730036e-03 1.0890635018247037e-03 5.0098245274789203e-03 -9.2529943512368613e-03 5.8576246713981086e-03 -1.4107847014699956e-02 -4.7116183042629463e-03 -1.8140488565019158e-03 -8.1368400230364835e-03 1.4439547465931507e-02 -7.3347770326813808e-03 1.0996734903922578e-02 8.0130171225348511e-03 -1.2390864475311397e-03 3.1330657245952167e-03 -5.0851218216769710e-03 2.5104382210233978e-03 -6.9780090624548550e-03 -1.8237074917714317e-02 -1.5065846556214187e-02 -1.8541081243184595e-02 3.2478558076896751e-02 1.0339012985412625e-03 5.1725849462730036e-03 5.0877231156406862e-02 1.9162547101577939e-02 4.9069285527999287e-03 -2.2335217982913585e-02 3.2515717480406442e-03 -1.5916141002229104e-02 -3.0173710576286181e-02 -1.6785927865260491e-02 -4.1550192319323494e-03 9.9557160863801702e-03 -8.4203144528835448e-03 1.8645173784133513e-02 1.4021613642325308e-02 1.2296389491272245e-02 1.4581813703505598e-02 -3.6587115485094988e-02 4.5276792349261278e-03 -4.6942595093660156e-03 -1.0244067570943732e-02 -2.1423073852017183e-02 -1.4422077707696542e-02 5.7782489127726515e-03 -6.7794356749555128e-03 1.0890635018247037e-03 1.9162547101577939e-02 3.6919702769039345e-02 3.2629172382713251e-03 1.2253142626085941e-03 6.4011496582204344e-04 -8.7588427586888437e-03 -1.7500199588941869e-02 -1.7961087981083531e-02 -3.1005424332813205e-03 1.7655620112015128e-03 -1.0705620161877176e-02 1.2986876463073029e-02 1.0708668766436660e-02 1.8397884204596419e-02 1.0812745352164964e-02 -1.0896073894711755e-02 9.1151573047559614e-04 -1.8701396556673302e-03 -7.6255886427372003e-03 -7.2020216596135143e-03 -1.3366187709078697e-02 4.9496637684411492e-03 3.3305377240831584e-04 5.0098245274789203e-03 4.9069285527999305e-03 3.2629172382713251e-03 2.4340299179269376e-02 -1.4037290692187010e-02 -6.9150502290714483e-03 -1.4131053871067114e-02 -3.8092267935829973e-03 -2.7354687079717455e-03 -6.5508814790641284e-03 7.5664584464343434e-03 3.1821729866675719e-03 2.9932749822081379e-03 1.2457869668664370e-02 9.1986336411556801e-03 9.7357380553707677e-03 -4.4088143078325863e-03 8.7576295815381766e-04 -8.0310136851172702e-03 7.5944080015231379e-03 2.3627265084829232e-03 1.0219135269408885e-02 -2.2419873306877062e-02 9.5016610242817223e-03 -9.2529943512368647e-03 -2.2335217982913581e-02 1.2253142626085915e-03 -1.4037290692187008e-02 3.2098002243370644e-02 -6.5825898464427456e-03 1.3011535848147243e-02 8.6808390913150971e-03 2.1142377536759447e-03 7.4212901623238381e-03 -1.0696420377750463e-02 6.5557838000214301e-03 -1.1594727386031196e-02 -1.0787302465792403e-02 -4.8246601316412289e-03 -1.1026886111211859e-02 1.7865564797124631e-02 -1.0352473370986640e-02 1.5259937260786971e-02 1.1038603784153190e-03 -7.3345468033990269e-03 1.6147232390660666e-03 1.3215411801457022e-02 -1.5822734914991515e-02 5.8576246713981104e-03 3.2515717480406450e-03 6.4011496582204084e-04 -6.9150502290714483e-03 -6.5825898464427430e-03 3.3289914739134882e-02 -1.4139239078107144e-02 -8.0361652219216196e-03 -1.1443996320770186e-02 3.3920773898513507e-03 5.6006048618498974e-03 -1.2895408262982362e-02 1.2915622377200684e-02 1.1871002117112008e-03 1.1094577070364093e-03 4.8488499147283995e-03 -9.7397939331097163e-03 1.2457198890149753e-02 -7.5746082850660290e-03 1.0297518827343165e-02 2.5289955212741090e-03 2.7413628186163250e-02 -2.1405316781205354e-02 1.1378092343077382e-02 -1.4107847014699956e-02 -1.5916141002229107e-02 -8.7588427586888437e-03 -1.4131053871067114e-02 1.3011535848147243e-02 -1.4139239078107144e-02 5.2705005588161775e-02 1.8081286244077378e-02 1.2299497584112033e-02 1.6309486358644198e-03 -1.0387702426791864e-02 1.3574888545538654e-02 -3.0121762014637420e-02 -8.9219517001718450e-03 -9.4019136635682607e-03 -3.2858075041300130e-02 1.5240770990830387e-02 -7.4814784936379228e-03 9.4691555315152068e-03 1.4602399756485441e-02 1.1044983073448995e-02 1.3533612878447489e-02 -3.6781727492691006e-02 4.5305031427246003e-03 -4.7116183042629472e-03 -3.0173710576286181e-02 -1.7500199588941869e-02 -3.8092267935829973e-03 8.6808390913150988e-03 -8.0361652219216196e-03 1.8081286244077375e-02 5.4355436910352377e-02 1.8345589513429295e-02 5.1084981082775791e-03 -2.2058181930371550e-02 2.6978732413728375e-03 -1.4938287845130981e-02 -1.7718325711837561e-02 -1.5008420379240377e-02 -1.7915151758845338e-02 2.9093269953033376e-02 3.9258362191281378e-03 4.6508874710198423e-03 1.1618726223755236e-02 1.7743946642576235e-02 9.6766821571610505e-03 -1.0812771935807942e-02 8.5019341211138751e-04 -1.8140488565019154e-03 -1.6785927865260494e-02 -1.7961087981083531e-02 -2.7354687079717455e-03 2.1142377536759456e-03 -1.1443996320770188e-02 1.2299497584112034e-02 1.8345589513429291e-02 4.0527815435553234e-02 3.2698943303783009e-03 2.5437686751710186e-03 1.5354710715320425e-04 -7.5112612879468712e-03 -9.3083523336519505e-03 -2.1851540438993629e-02 -1.3584628167809937e-02 2.2847299686888848e-03 -8.0188778565467057e-03 3.9933294857910553e-04 1.3315357012444439e-02 9.8400537720393349e-03 9.6045931685072757e-03 -4.9710455797788771e-03 7.6964193608584995e-04 -8.1368400230364853e-03 -4.1550192319323494e-03 -3.1005424332813209e-03 -6.5508814790641284e-03 7.4212901623238381e-03 3.3920773898513507e-03 1.6309486358644192e-03 5.1084981082775774e-03 3.2698943303783013e-03 2.8731118098502009e-02 -1.4460773447503692e-02 -7.3313520613050038e-03 -1.4784490836172646e-02 -7.1421108736943670e-03 -7.4461502021894877e-03 -1.4046149567714161e-02 4.8838038498634296e-03 6.0637726842097638e-04 3.5517020031137166e-03 -1.1157996035332228e-02 -4.2306018973588050e-03 -1.0447500424477068e-02 1.8760197467362291e-02 -9.8805336272466664e-03 1.4439547465931506e-02 9.9557160863801702e-03 1.7655620112015128e-03 7.5664584464343442e-03 -1.0696420377750461e-02 5.6006048618498982e-03 -1.0387702426791863e-02 -2.2058181930371550e-02 2.5437686751710186e-03 -1.4460773447503692e-02 3.0246346898606731e-02 -6.5315997391823923e-03 1.2264960662339649e-02 7.1581774935000810e-03 1.8541745218109537e-03 9.7140999105094182e-03 -2.2207839602395040e-02 8.8786251937544788e-03 -8.6890901864423078e-03 1.6645417623926463e-03 1.2062456489960608e-03 5.3421403104519294e-03 -1.1301997743358586e-02 1.3824539471972820e-02 -7.3347770326813808e-03 -8.4203144528835466e-03 -1.0705620161877176e-02 3.1821729866675723e-03 6.5557838000214301e-03 -1.2895408262982362e-02 1.3574888545538654e-02 2.6978732413728375e-03 1.5354710715320230e-04 -7.3313520613050038e-03 -6.5315997391823914e-03 3.2670977679068715e-02 -1.4546117886438921e-02 1.7773106103996608e-03 -7.5984305346205551e-03 9.3275158159409613e-04 1.3558402521237944e-02 -1.6655850947710705e-02 6.1802935561730736e-03 -1.0101103217184115e-02 -9.1310619585176153e-03 -3.3183293948121730e-02 1.7045485340725367e-02 -8.5045174899494036e-03 1.0996734903922575e-02 1.8645173784133513e-02 1.2986876463073029e-02 2.9932749822081375e-03 -1.1594727386031194e-02 1.2915622377200682e-02 -3.0121762014637416e-02 -1.4938287845130982e-02 -7.5112612879468721e-03 -1.4784490836172646e-02 1.2264960662339650e-02 -1.4546117886438921e-02 5.1305824680812427e-02 9.3765774695092931e-03 3.1264072334116289e-03 2.7278133077043330e-02 -2.0698078808361522e-02 1.0664052549167472e-02 -1.4484420845054703e-02 -8.7787470781422912e-03 -5.1615652638077872e-03 -7.2382509075586349e-03 7.1768754766793758e-03 2.2840400822567433e-03 8.0130171225348511e-03 1.4021613642325310e-02 1.0708668766436660e-02 1.2457869668664372e-02 -1.0787302465792403e-02 1.1871002117112008e-03 -8.9219517001718433e-03 -1.7718325711837561e-02 -9.3083523336519505e-03 -7.1421108736943670e-03 7.1581774935000828e-03 1.7773106103996618e-03 9.3765774695092913e-03 2.8105951578525336e-02 6.0590439268230489e-03 8.7285621094776236e-03 -1.9178242935257855e-02 -7.5462460001675807e-03 -1.5273712888761299e-02 -6.4490222345179047e-03 -1.7779658285261152e-02 -1.6781862067634129e-02 1.3522937357969195e-02 -1.0766119309587784e-02 -1.2390864475311397e-03 1.2296389491272241e-02 1.8397884204596419e-02 9.1986336411556784e-03 -4.8246601316412306e-03 1.1094577070364093e-03 -9.4019136635682607e-03 -1.5008420379240377e-02 -2.1851540438993632e-02 -7.4461502021894868e-03 1.8541745218109546e-03 -7.5984305346205585e-03 3.1264072334116276e-03 6.0590439268230489e-03 3.7949216087196661e-02 1.8047020698889322e-02 -7.4504425524759277e-03 5.3919056963362948e-04 4.4969508074663642e-03 -8.7922323602929609e-03 -1.6248922908140399e-02 -2.9388966660275507e-02 2.0281634042236513e-02 -9.2124269451831012e-03 3.1330657245952158e-03 1.4581813703505598e-02 1.0812745352164964e-02 9.7357380553707677e-03 -1.1026886111211859e-02 4.8488499147283995e-03 -3.2858075041300130e-02 -1.7915151758845338e-02 -1.3584628167809937e-02 -1.4046149567714159e-02 9.7140999105094199e-03 9.3275158159409754e-04 2.7278133077043326e-02 8.7285621094776236e-03 1.8047020698889322e-02 5.0327935818449701e-02 -1.5571839535378995e-02 4.4046104737566517e-03 -1.4181681406169246e-02 6.3328333051357964e-03 1.2942154347419006e-02 1.9709940544531925e-02 -3.6298932203394231e-02 1.4691459502318344e-02 -5.0851218216769701e-03 -3.6587115485094988e-02 -1.0896073894711755e-02 -4.4088143078325863e-03 1.7865564797124627e-02 -9.7397939331097163e-03 1.5240770990830387e-02 2.9093269953033376e-02 2.2847299686888840e-03 4.8838038498634296e-03 -2.2207839602395044e-02 1.3558402521237946e-02 -2.0698078808361522e-02 -1.9178242935257855e-02 -7.4504425524759277e-03 -1.5571839535378995e-02 6.0980462170848307e-02 -1.5390435959366774e-02 5.9293390880243583e-03 1.7348747683765047e-03 -1.1821971335939907e-02 -9.0164721831025342e-03 1.4222139914335749e-02 -1.3019357637647513e-02 2.5104382210233978e-03 4.5276792349261286e-03 9.1151573047559766e-04 8.7576295815381766e-04 -1.0352473370986640e-02 1.2457198890149752e-02 -7.4814784936379228e-03 3.9258362191281343e-03 -8.0188778565467005e-03 6.0637726842097583e-04 8.8786251937544788e-03 -1.6655850947710708e-02 1.0664052549167474e-02 -7.5462460001675807e-03 5.3919056963362948e-04 4.4046104737566526e-03 -1.5390435959366774e-02 3.5608152587585845e-02 -2.5632907937818711e-03 7.8346383211825108e-03 -1.6286197954919299e-03 1.3101718654336325e-03 -5.0177395564440603e-03 2.5600812177886188e-03 -6.9780090624548550e-03 -4.6942595093660156e-03 -1.8701396556673299e-03 -8.0310136851172685e-03 1.5259937260786971e-02 -7.5746082850660281e-03 9.4691555315152068e-03 4.6508874710198414e-03 3.9933294857910526e-04 3.5517020031137188e-03 -8.6890901864423078e-03 6.1802935561730745e-03 -1.4484420845054703e-02 -1.5273712888761301e-02 4.4969508074663642e-03 -1.4181681406169249e-02 5.9293390880243609e-03 -2.5632907937818711e-03 2.9344095598733525e-02 144 145 146 216 217 218 231 232 233 159 160 161 147 148 149 219 220 221 234 235 236 162 163 164 2.5153701343611359e-02 3.5908663928611918e-03 4.5405349102385232e-03 -1.3013873937949776e-02 -9.3471660247564699e-03 -1.3025440679265721e-02 -1.0903785051153804e-02 -7.3408296540537436e-03 -5.0086228171730869e-03 4.8158258494630747e-03 3.6972542845028328e-03 7.4280614396231284e-03 7.5931303758622892e-03 9.2652377686371981e-03 9.3796783471490081e-03 -7.8194687409801657e-03 -9.5676547961378656e-04 -6.1178375785665810e-03 -5.9683539320398602e-03 -3.4900169477708421e-03 -3.8772629800519001e-03 1.4282409318688827e-04 4.5814196601936200e-03 6.6808893580466312e-03 3.5908663928611909e-03 3.9379188889903369e-02 1.8483746145827078e-02 -1.1757435782822461e-02 -1.4633170272831410e-04 1.5041078292803156e-03 -1.2712946053262142e-02 -2.2963333354951009e-02 -6.2212541804779094e-03 4.6558674314980415e-03 -5.2266460530971410e-03 5.0914255307217184e-03 8.7742758711714872e-03 1.8928381626911232e-02 9.3524957743084929e-03 -5.8917113473024663e-03 5.8028303366396876e-04 -1.1079501522929571e-02 -2.0484812202337748e-03 -1.9837734983984612e-02 -1.6211789824471242e-02 1.5389564708090130e-02 -1.0713807455717508e-02 -9.1922975225887209e-04 4.5405349102385232e-03 1.8483746145827078e-02 4.5755371678485014e-02 -1.5657156900087763e-02 2.5723568790581488e-03 -1.0882918197573635e-02 -1.3287841095502935e-02 -1.4183770473599576e-02 -9.6683890675184295e-03 7.3724188056918400e-03 4.7722585657369457e-03 2.3419658386368045e-02 9.9883790047167950e-03 9.5023238189040626e-03 5.9210852873298496e-03 -8.8357803962252502e-03 1.5464054084353351e-03 -2.8347265944726901e-02 -2.3373728532331763e-03 -1.6928926642215833e-02 -2.4910901083256311e-02 1.8216818524401976e-02 -5.7643937021461672e-03 -1.2866410591076288e-03 -1.3013873937949779e-02 -1.1757435782822461e-02 -1.5657156900087763e-02 5.6921191502836858e-02 -1.0555131939946789e-02 4.8637417681812673e-03 2.6823283742596064e-02 1.0034767634260498e-02 2.6654699750697287e-03 -2.1924384522281681e-02 8.9902337106388570e-03 -2.0311840234978527e-02 -3.0348195548653437e-02 -1.4513064031993381e-02 -2.9084321466720637e-03 1.7944374962523248e-02 -8.2205119824542202e-03 1.6408473518811830e-02 5.9416428914305791e-04 1.6075457490086802e-02 1.8547029043214563e-02 -3.6996560488214349e-02 9.9456849022306927e-03 -3.6072850235390466e-03 -9.3471660247564682e-03 -1.4633170272831410e-04 2.5723568790581488e-03 -1.0555131939946786e-02 2.4691675012068749e-02 -1.2303910395012278e-03 6.1728537574901373e-03 -4.4061876094598773e-03 9.9389663467811147e-04 6.3941167675149093e-03 -1.0155227828757956e-02 7.0047553933388559e-03 -7.9465982718758023e-04 -2.4409105697371979e-04 -1.6096498913647459e-04 -6.7662700839754156e-03 8.3202081245083645e-03 -4.9909787203552729e-03 5.1998116596098367e-03 -9.2350381936193836e-03 -5.4132352949180854e-03 9.6964456912513718e-03 -8.8250067450378576e-03 1.2245611368359465e-03 -1.3025440679265721e-02 1.5041078292803156e-03 -1.0882918197573629e-02 4.8637417681812664e-03 -1.2303910395012278e-03 2.2218402558740868e-02 3.0152856809762866e-03 1.4350381186595440e-03 3.9214063698138207e-03 -8.6202325900913909e-03 3.3363885313342587e-03 -1.1199213467236372e-02 -2.6229889240001903e-03 -1.6489555952330657e-03 -6.3377141011046962e-03 1.3367259579061978e-02 -4.3446929083128345e-03 7.9394990326343892e-03 6.7863184470881915e-03 -3.5538838728537314e-04 5.3177228786476329e-04 -3.7639432819504279e-03 1.3038934510583825e-03 -6.1912344831391419e-03 -1.0903785051153806e-02 -1.2712946053262142e-02 -1.3287841095502935e-02 2.6823283742596068e-02 6.1728537574901373e-03 3.0152856809762866e-03 3.8344010932358848e-02 1.7182579171107916e-02 2.1240544209650066e-03 -1.8572410685366848e-02 -1.1603405396380731e-03 -1.1667176856636022e-02 -2.0538069828605801e-02 -1.5068634005868456e-02 -1.8296380008745474e-03 8.6482049996977253e-03 -3.7028480857905569e-03 1.3991064032062499e-02 6.7406595197260308e-03 9.7757970129639660e-03 1.0272321993971533e-02 -3.0541893629252224e-02 -4.8646125700278840e-04 -2.6180701749618234e-03 -7.3408296540537436e-03 -2.2963333354951009e-02 -1.4183770473599575e-02 1.0034767634260498e-02 -4.4061876094598790e-03 1.4350381186595445e-03 1.7182579171107916e-02 3.6934733996463340e-02 1.9323671512649289e-03 -2.3046187739415151e-03 -5.8434554491776218e-04 -9.6935154370158816e-03 -1.5663348480274963e-02 -1.9642086907044803e-02 -1.8803151956651577e-03 4.2140431751363705e-03 -8.3241632361997393e-03 1.3917215935355547e-02 8.1005578715515458e-03 1.9353479299265577e-02 1.0126176208589729e-02 -1.4223150943786119e-02 -3.6809664315571732e-04 -1.6531963075891410e-03 -5.0086228171730869e-03 -6.2212541804779094e-03 -9.6683890675184295e-03 2.6654699750697296e-03 9.9389663467811104e-04 3.9214063698138207e-03 2.1240544209650066e-03 1.9323671512649285e-03 2.0686291896679844e-02 -1.0640790957954928e-02 -8.4586446443907469e-03 -1.0277569798457235e-02 -1.4358659530780866e-03 -1.4335208811932952e-03 -4.9080272407265538e-03 5.3879104051137942e-03 4.3493622562947153e-03 1.0882525342514116e-03 9.0481796416377915e-03 8.6775167872342671e-03 5.8089991266447741e-03 -2.1403347145802156e-03 1.6027687658993047e-04 -6.6509638206876352e-03 4.8158258494630755e-03 4.6558674314980423e-03 7.3724188056918391e-03 -2.1924384522281681e-02 6.3941167675149076e-03 -8.6202325900913892e-03 -1.8572410685366848e-02 -2.3046187739415155e-03 -1.0640790957954928e-02 2.8942965195911347e-02 -4.4404559668641047e-03 1.2470581355889136e-02 7.4643644302862973e-03 4.5896491668011661e-03 5.1944949058496791e-03 -1.0016049672544340e-02 4.7454223322174263e-03 -1.1291162440649830e-02 -7.4952765938693031e-03 -6.3499316571684452e-03 -8.9529124735319345e-03 1.6784965998401465e-02 -7.2900493000574735e-03 1.4467603394797437e-02 3.6972542845028328e-03 -5.2266460530971393e-03 4.7722585657369457e-03 8.9902337106388588e-03 -1.0155227828757954e-02 3.3363885313342600e-03 -1.1603405396380731e-03 -5.8434554491776022e-04 -8.4586446443907469e-03 -4.4404559668641038e-03 2.5622369396604658e-02 -8.6874213360263741e-03 -3.3207423471494349e-03 -8.7067297489808182e-03 4.6040418856958020e-03 3.9204979301421319e-03 -7.9599600299026969e-03 8.1429469900542849e-03 -1.3233514488437577e-03 -1.6703658286049356e-04 8.2219055368740494e-04 -6.3630956227884554e-03 7.1775763919122108e-03 -4.5317605460915766e-03 7.4280614396231284e-03 5.0914255307217167e-03 2.3419658386368045e-02 -2.0311840234978527e-02 7.0047553933388559e-03 -1.1199213467236372e-02 -1.1667176856636022e-02 -9.6935154370158816e-03 -1.0277569798457238e-02 1.2470581355889137e-02 -8.6874213360263741e-03 4.5833428814945447e-02 1.3482797603190631e-02 1.3075813262427185e-02 1.1346412963827762e-05 -1.0257348621202615e-02 8.9658874784506529e-03 -2.6137207936453775e-02 -5.0349390217225487e-03 -1.1192274948061425e-02 -2.7858527655534360e-02 1.3889864335836822e-02 -4.5646699438347338e-03 6.2080852434044315e-03 7.5931303758622884e-03 8.7742758711714872e-03 9.9883790047167933e-03 -3.0348195548653450e-02 -7.9465982718758045e-04 -2.6229889240001912e-03 -2.0538069828605801e-02 -1.5663348480274963e-02 -1.4358659530780869e-03 7.4643644302862973e-03 -3.3207423471494349e-03 1.3482797603190632e-02 3.9978710171660825e-02 1.6493840880052089e-02 2.3414583733020501e-03 -1.7179784737049144e-02 -8.4884503893314488e-04 -1.1421387055032687e-02 -1.0055010283799693e-02 -1.2586405065899982e-02 -1.2806341237706593e-02 2.3084855420298686e-02 7.9458840082215262e-03 2.4739481886080833e-03 9.2652377686371998e-03 1.8928381626911232e-02 9.5023238189040609e-03 -1.4513064031993381e-02 -2.4409105697371957e-04 -1.6489555952330659e-03 -1.5068634005868458e-02 -1.9642086907044803e-02 -1.4335208811932954e-03 4.5896491668011652e-03 -8.7067297489808182e-03 1.3075813262427185e-02 1.6493840880052089e-02 3.8621707911745642e-02 2.0707695777670734e-03 -1.4330828480654475e-03 6.5835349830803999e-04 -9.1854595239939246e-03 -6.2402476766226702e-03 -2.2892941966612231e-02 -1.3242215208490338e-02 6.9063007470595121e-03 -6.7225933573533438e-03 8.6124454981230609e-04 9.3796783471490081e-03 9.3524957743084929e-03 5.9210852873298496e-03 -2.9084321466720628e-03 -1.6096498913647467e-04 -6.3377141011046970e-03 -1.8296380008745474e-03 -1.8803151956651577e-03 -4.9080272407265538e-03 5.1944949058496791e-03 4.6040418856958020e-03 1.1346412963828196e-05 2.3414583733020501e-03 2.0707695777670725e-03 2.3009267553736654e-02 -1.0590343319189781e-02 -8.4495885438771144e-03 -9.7543881017838983e-03 -4.4127135827945387e-03 -6.4824839351320610e-03 -9.9179607774133142e-03 2.8254954232301913e-03 9.4604542603944218e-04 1.9763909669981384e-03 -7.8194687409801657e-03 -5.8917113473024654e-03 -8.8357803962252502e-03 1.7944374962523248e-02 -6.7662700839754156e-03 1.3367259579061982e-02 8.6482049996977253e-03 4.2140431751363722e-03 5.3879104051137942e-03 -1.0016049672544340e-02 3.9204979301421319e-03 -1.0257348621202615e-02 -1.7179784737049144e-02 -1.4330828480654497e-03 -1.0590343319189781e-02 2.6129077385827693e-02 -4.7965399045572215e-03 1.1910504816168996e-02 3.7372707678472571e-03 4.3228164462372556e-03 7.0108208218727834e-03 -2.1443624965322268e-02 6.4302466323847944e-03 -7.9930232855999102e-03 -9.5676547961378677e-04 5.8028303366396844e-04 1.5464054084353349e-03 -8.2205119824542185e-03 8.3202081245083662e-03 -4.3446929083128345e-03 -3.7028480857905569e-03 -8.3241632361997393e-03 4.3493622562947145e-03 4.7454223322174263e-03 -7.9599600299026969e-03 8.9658874784506546e-03 -8.4884503893314478e-04 6.5835349830804021e-04 -8.4495885438771144e-03 -4.7965399045572232e-03 2.4154133535539926e-02 -9.5632680061699844e-03 4.1395474169733755e-03 -6.3788633995057117e-03 3.6383441957756756e-03 9.6405407421581331e-03 -1.1049991526412159e-02 3.8575501194035534e-03 -6.1178375785665810e-03 -1.1079501522929573e-02 -2.8347265944726901e-02 1.6408473518811834e-02 -4.9909787203552738e-03 7.9394990326343892e-03 1.3991064032062503e-02 1.3917215935355547e-02 1.0882525342514114e-03 -1.1291162440649830e-02 8.1429469900542832e-03 -2.6137207936453775e-02 -1.1421387055032688e-02 -9.1854595239939281e-03 -9.7543881017838983e-03 1.1910504816168996e-02 -9.5632680061699844e-03 4.3803663926747047e-02 6.2919466728116186e-03 5.9769025306275038e-03 2.2590817932011377e-02 -1.9771601965605859e-02 6.7821423174114232e-03 -1.1183371442679658e-02 -5.9683539320398602e-03 -2.0484812202337739e-03 -2.3373728532331767e-03 5.9416428914305932e-04 5.1998116596098367e-03 6.7863184470881906e-03 6.7406595197260317e-03 8.1005578715515458e-03 9.0481796416377915e-03 -7.4952765938693048e-03 -1.3233514488437579e-03 -5.0349390217225495e-03 -1.0055010283799693e-02 -6.2402476766226702e-03 -4.4127135827945387e-03 3.7372707678472567e-03 4.1395474169733755e-03 6.2919466728116177e-03 2.2822174557751082e-02 2.6160404766601584e-03 3.1695771176737508e-03 -1.0375628324758576e-02 -1.0443877079094716e-02 -1.3510996421461091e-02 -3.4900169477708421e-03 -1.9837734983984612e-02 -1.6928926642215833e-02 1.6075457490086802e-02 -9.2350381936193836e-03 -3.5538838728537206e-04 9.7757970129639660e-03 1.9353479299265577e-02 8.6775167872342671e-03 -6.3499316571684452e-03 -1.6703658286049345e-04 -1.1192274948061425e-02 -1.2586405065899980e-02 -2.2892941966612231e-02 -6.4824839351320610e-03 4.3228164462372548e-03 -6.3788633995057117e-03 5.9769025306275047e-03 2.6160404766601589e-03 3.7912594861076419e-02 1.8017911067427467e-02 -1.0363757755108918e-02 1.2455409662404352e-03 2.2867435274054456e-03 -3.8772629800518993e-03 -1.6211789824471242e-02 -2.4910901083256311e-02 1.8547029043214563e-02 -5.4132352949180845e-03 5.3177228786476286e-04 1.0272321993971531e-02 1.0126176208589729e-02 5.8089991266447741e-03 -8.9529124735319328e-03 8.2219055368740440e-04 -2.7858527655534357e-02 -1.2806341237706593e-02 -1.3242215208490338e-02 -9.9179607774133142e-03 7.0108208218727834e-03 3.6383441957756773e-03 2.2590817932011377e-02 3.1695771176737529e-03 1.8017911067427467e-02 4.2884004499786882e-02 -1.3363232285442206e-02 2.2626183023993856e-03 -9.1282043301038167e-03 1.4282409318688654e-04 1.5389564708090130e-02 1.8216818524401976e-02 -3.6996560488214349e-02 9.6964456912513718e-03 -3.7639432819504270e-03 -3.0541893629252227e-02 -1.4223150943786119e-02 -2.1403347145802147e-03 1.6784965998401465e-02 -6.3630956227884545e-03 1.3889864335836822e-02 2.3084855420298686e-02 6.9063007470595121e-03 2.8254954232301917e-03 -2.1443624965322268e-02 9.6405407421581331e-03 -1.9771601965605859e-02 -1.0375628324758576e-02 -1.0363757755108919e-02 -1.3363232285442209e-02 5.9345061895660384e-02 -1.0682847566875658e-02 4.1069339641097245e-03 4.5814196601936200e-03 -1.0713807455717508e-02 -5.7643937021461681e-03 9.9456849022306927e-03 -8.8250067450378576e-03 1.3038934510583820e-03 -4.8646125700278916e-04 -3.6809664315571797e-04 1.6027687658993039e-04 -7.2900493000574752e-03 7.1775763919122108e-03 -4.5646699438347347e-03 7.9458840082215244e-03 -6.7225933573533420e-03 9.4604542603944218e-04 6.4302466323847944e-03 -1.1049991526412159e-02 6.7821423174114232e-03 -1.0443877079094714e-02 1.2455409662404347e-03 2.2626183023993838e-03 -1.0682847566875656e-02 2.9256378369523946e-02 -1.1259127275176633e-03 6.6808893580466294e-03 -9.1922975225887220e-04 -1.2866410591076292e-03 -3.6072850235390470e-03 1.2245611368359467e-03 -6.1912344831391427e-03 -2.6180701749618229e-03 -1.6531963075891410e-03 -6.6509638206876335e-03 1.4467603394797437e-02 -4.5317605460915766e-03 6.2080852434044324e-03 2.4739481886080837e-03 8.6124454981230641e-04 1.9763909669981380e-03 -7.9930232855999102e-03 3.8575501194035530e-03 -1.1183371442679658e-02 -1.3510996421461093e-02 2.2867435274054456e-03 -9.1282043301038132e-03 4.1069339641097253e-03 -1.1259127275176628e-03 2.6255938925315310e-02 216 217 218 288 289 290 303 304 305 231 232 233 219 220 221 291 292 293 306 307 308 234 235 236 2.8049685714814067e-02 4.5080685389522809e-03 5.7203125585013632e-03 -1.5675099079176583e-02 -1.0165877469026995e-02 -1.4691051849295403e-02 -1.2684689750677363e-02 -8.5417499961132071e-03 -5.7123462996600729e-03 6.0120243916164037e-03 4.0813138426628462e-03 8.8065347539061836e-03 9.3831241236627689e-03 1.0550686532122469e-02 1.0721546531302145e-02 -9.4721844465822762e-03 -1.1100648132603963e-03 -7.5417424974964474e-03 -6.8926805074567233e-03 -4.3216024114287859e-03 -4.9254013303193095e-03 1.2798195537997148e-03 4.9992257760917806e-03 7.6221481330615353e-03 4.5080685389522826e-03 4.3604750736787885e-02 2.0686858630701580e-02 -1.3243780444395880e-02 -8.0515492034141634e-04 1.2403968267300713e-03 -1.4376416971324467e-02 -2.5503064025540489e-02 -7.2311842008803105e-03 5.4133150382147154e-03 -5.3037347764679126e-03 6.1438890516929325e-03 1.0170737287099010e-02 2.1175455069310956e-02 1.0597717686589351e-02 -6.7895836297671144e-03 -1.3934499803362169e-04 -1.2552997680653254e-02 -2.7795510854110718e-03 -2.1906597089003148e-02 -1.8227181938389431e-02 1.7097211266632530e-02 -1.1122309996712251e-02 -6.5749837579096102e-04 5.7203125585013632e-03 2.0686858630701580e-02 5.1087628548540674e-02 -1.7803946078283155e-02 2.7432297686982576e-03 -1.3054993868336424e-02 -1.5142015527518678e-02 -1.5916222934986061e-02 -1.1199763908364926e-02 8.8839504723567594e-03 5.1635889247649124e-03 2.6673820105788632e-02 1.1379934209785404e-02 1.0632151530075828e-02 7.4721185195101786e-03 -1.0348870391678736e-02 1.3859860753886034e-03 -3.2273298502809626e-02 -3.2033680012619448e-03 -1.8671109007311934e-02 -2.8110445929823976e-02 2.0514002758098983e-02 -6.0244829873311850e-03 -5.9506496450457079e-04 -1.5675099079176583e-02 -1.3243780444395880e-02 -1.7803946078283152e-02 6.3365951260365844e-02 -1.1442355066275967e-02 6.0803050258296763e-03 3.0267509924534711e-02 1.1462952525849592e-02 3.4747115138188608e-03 -2.5064118095021948e-02 9.7694271217996370e-03 -2.2987032633535086e-02 -3.4443873201266073e-02 -1.5943949408411456e-02 -3.7082609444073558e-03 2.1099671256119445e-02 -8.7138599534140257e-03 1.8506035093971206e-02 1.8476209257084659e-03 1.7600553172732968e-02 2.0898208332279889e-02 -4.1397662991263844e-02 1.0511012052115121e-02 -4.4600203096739986e-03 -1.0165877469026993e-02 -8.0515492034141645e-04 2.7432297686982576e-03 -1.1442355066275967e-02 2.7102552858308634e-02 -1.5152558078424091e-03 6.7030451136532877e-03 -4.5132593678210309e-03 1.1270411618337893e-03 7.1049937276547164e-03 -1.1144916811628469e-02 7.6652771330260805e-03 -9.4858478537109057e-04 -8.4304788213449596e-04 -1.5549962021262645e-04 -7.3843552222679441e-03 9.3903917364691770e-03 -5.5402884476473454e-03 5.5749024409158616e-03 -9.6054914162935004e-03 -5.7932272569727918e-03 1.0558231260718131e-02 -9.5810741965588943e-03 1.4687230691170358e-03 -1.4691051849295405e-02 1.2403968267300711e-03 -1.3054993868336424e-02 6.0803050258296763e-03 -1.5152558078424087e-03 2.4697266826210141e-02 3.8657638334869057e-03 1.8390377599278118e-03 4.6094739317194084e-03 -9.8872330306234539e-03 3.7936972421201394e-03 -1.2992115385770182e-02 -3.5323995100031863e-03 -2.0629712390805000e-03 -7.4574464500669459e-03 1.5255951946525206e-02 -4.7822989287086481e-03 9.8012032287333843e-03 7.7468490414866710e-03 -8.7474337857918843e-05 1.4415730206319521e-03 -4.8381854574064166e-03 1.5748684847114529e-03 -7.0449613031213273e-03 -1.2684689750677366e-02 -1.4376416971324465e-02 -1.5142015527518678e-02 3.0267509924534711e-02 6.7030451136532859e-03 3.8657638334869049e-03 4.2684630769330024e-02 1.9199626589540116e-02 2.7981825220219857e-03 -2.1457756719894552e-02 -1.3446239630615134e-03 -1.3402267970886488e-02 -2.3258094545513135e-02 -1.6650513169999111e-02 -2.4004702963492737e-03 1.0426227446347624e-02 -3.7197015010684083e-03 1.5870942982059617e-02 8.4952043347871764e-03 1.0979063617929078e-02 1.1658580032467314e-02 -3.4473031458914477e-02 -7.9047971566898270e-04 -3.2487155752813578e-03 -8.5417499961132053e-03 -2.5503064025540489e-02 -1.5916222934986061e-02 1.1462952525849592e-02 -4.5132593678210309e-03 1.8390377599278120e-03 1.9199626589540112e-02 4.0677851521858661e-02 2.5378852953744087e-03 -3.0437452439748972e-03 -1.1470424887665370e-03 -1.1010074133376862e-02 -1.7591347736692176e-02 -2.1615718666805183e-02 -2.4345109231496504e-03 5.0746187476481729e-03 -8.5031983941724724e-03 1.5489289901533469e-02 9.3710731242750579e-03 2.1605602643075945e-02 1.1549061902405223e-02 -1.5931428010532662e-02 -1.0011712218288987e-03 -2.0544668677283224e-03 -5.7123462996600729e-03 -7.2311842008803097e-03 -1.1199763908364926e-02 3.4747115138188604e-03 1.1270411618337893e-03 4.6094739317194076e-03 2.7981825220219849e-03 2.5378852953744082e-03 2.2801348346444310e-02 -1.2074695462879873e-02 -9.1958937411282804e-03 -1.2147927251985314e-02 -2.0400176373035544e-03 -1.9683638609631678e-03 -5.5938434347120669e-03 6.2711839222301937e-03 4.7490728958485186e-03 1.9610524879910760e-03 1.0278749904371063e-02 9.8242099976488320e-03 7.2649550148327557e-03 -2.9957684625986029e-03 1.5723245226621484e-04 -7.6952951859252418e-03 6.0120243916164037e-03 5.4133150382147154e-03 8.8839504723567594e-03 -2.5064118095021948e-02 7.1049937276547181e-03 -9.8872330306234539e-03 -2.1457756719894548e-02 -3.0437452439748972e-03 -1.2074695462879878e-02 3.2472803074744823e-02 -4.9863673674429435e-03 1.4501807632937153e-02 9.1668118679127889e-03 5.3327468451435985e-03 6.1117641481349926e-03 -1.1748671745984986e-02 5.2284041542571599e-03 -1.3190452723891940e-02 -9.0392457977361302e-03 -7.2291781986170223e-03 -1.0671465470786054e-02 1.9658153024363606e-02 -7.8201689552353255e-03 1.6326324434752407e-02 4.0813138426628454e-03 -5.3037347764679100e-03 5.1635889247649142e-03 9.7694271217996370e-03 -1.1144916811628471e-02 3.7936972421201390e-03 -1.3446239630615134e-03 -1.1470424887665370e-03 -9.1958937411282821e-03 -4.9863673674429435e-03 2.8025568563593378e-02 -9.4337434899075014e-03 -3.5082342308486846e-03 -9.0219147712249110e-03 4.9537535008578049e-03 4.4075844928282461e-03 -8.6696452450268791e-03 8.8665838644768329e-03 -1.3842487630089922e-03 -7.6533103444045608e-04 7.8215077071042008e-04 -7.0348511329285960e-03 8.0270165639617867e-03 -4.9301370718943145e-03 8.8065347539061836e-03 6.1438890516929325e-03 2.6673820105788629e-02 -2.2987032633535086e-02 7.6652771330260813e-03 -1.2992115385770183e-02 -1.3402267970886488e-02 -1.1010074133376862e-02 -1.2147927251985310e-02 1.4501807632937146e-02 -9.4337434899075014e-03 5.1101675818993192e-02 1.5369557653171155e-02 1.4398417883821539e-02 8.3566562171530356e-04 -1.1937647118117217e-02 9.5361178796240613e-03 -2.9542000174474659e-02 -6.1675192107470949e-03 -1.2410776646999709e-02 -3.1653004714623650e-02 1.5816566893271405e-02 -4.8891076778805357e-03 7.7238859803566533e-03 9.3831241236627689e-03 1.0170737287099010e-02 1.1379934209785404e-02 -3.4443873201266073e-02 -9.4858478537109057e-04 -3.5323995100031863e-03 -2.3258094545513138e-02 -1.7591347736692176e-02 -2.0400176373035549e-03 9.1668118679127889e-03 -3.5082342308486846e-03 1.5369557653171152e-02 4.5718085050538246e-02 1.8380695615631604e-02 3.1565000022399725e-03 -2.1157574274830268e-02 -1.5345670395691667e-03 -1.3059891767593802e-02 -1.2234465203981453e-02 -1.4128061673887558e-02 -1.4535516669457111e-02 2.6825986183477132e-02 9.1593625636380641e-03 3.2618337191610992e-03 1.0550686532122469e-02 2.1175455069310952e-02 1.0632151530075830e-02 -1.5943949408411456e-02 -8.4304788213449694e-04 -2.0629712390804996e-03 -1.6650513169999114e-02 -2.1615718666805183e-02 -1.9683638609631678e-03 5.3327468451435985e-03 -9.0219147712249110e-03 1.4398417883821539e-02 1.8380695615631611e-02 4.3128926307671268e-02 2.7227382146410260e-03 -1.7146174257558443e-03 -1.1697520691682241e-03 -9.8787912531114481e-03 -7.3536149958379378e-03 -2.5445540458506308e-02 -1.4799769502693296e-02 7.3985660071066717e-03 -6.2084075291430861e-03 9.5658822730999783e-04 1.0721546531302145e-02 1.0597717686589351e-02 7.4721185195101786e-03 -3.7082609444073558e-03 -1.5549962021262623e-04 -7.4574464500669459e-03 -2.4004702963492733e-03 -2.4345109231496509e-03 -5.5938434347120669e-03 6.1117641481349926e-03 4.9537535008578049e-03 8.3566562171530291e-04 3.1565000022399717e-03 2.7227382146410252e-03 2.6439488196652108e-02 -1.2343327231949737e-02 -9.4956806081259119e-03 -1.2795646991348664e-02 -5.2053119926001234e-03 -7.4317315190536980e-03 -1.1953729831568101e-02 3.6675597836293827e-03 1.2432132684537069e-03 3.0533943698181879e-03 -9.4721844465822762e-03 -6.7895836297671135e-03 -1.0348870391678736e-02 2.1099671256119445e-02 -7.3843552222679432e-03 1.5255951946525206e-02 1.0426227446347624e-02 5.0746187476481729e-03 6.2711839222301937e-03 -1.1748671745984986e-02 4.4075844928282461e-03 -1.1937647118117218e-02 -2.1157574274830272e-02 -1.7146174257558421e-03 -1.2343327231949737e-02 3.0598075300595093e-02 -5.2485387825808956e-03 1.3980084442239589e-02 5.2754674622720113e-03 4.7286600302594651e-03 8.3833619986784964e-03 -2.5021010997936639e-02 6.9262317896359128e-03 -9.2607375679277810e-03 -1.1100648132603961e-03 -1.3934499803361930e-04 1.3859860753886036e-03 -8.7138599534140240e-03 9.3903917364691752e-03 -4.7822989287086481e-03 -3.7197015010684087e-03 -8.5031983941724724e-03 4.7490728958485178e-03 5.2284041542571590e-03 -8.6696452450268791e-03 9.5361178796240613e-03 -1.5345670395691675e-03 -1.1697520691682222e-03 -9.4956806081259119e-03 -5.2485387825808956e-03 2.7298730822515979e-02 -1.0151149657227014e-02 4.7729889130565875e-03 -5.8466019094301483e-03 4.5238777166491185e-03 1.0325339022579146e-02 -1.2360579943153815e-02 4.2340746265512579e-03 -7.5417424974964457e-03 -1.2552997680653254e-02 -3.2273298502809619e-02 1.8506035093971203e-02 -5.5402884476473454e-03 9.8012032287333843e-03 1.5870942982059617e-02 1.5489289901533469e-02 1.9610524879910764e-03 -1.3190452723891940e-02 8.8665838644768329e-03 -2.9542000174474656e-02 -1.3059891767593802e-02 -9.8787912531114481e-03 -1.2795646991348665e-02 1.3980084442239589e-02 -1.0151149657227014e-02 5.0077284522674299e-02 7.7164095821066914e-03 6.4705369033039428e-03 2.6172263468451706e-02 -2.2281385111394918e-02 7.2968163693248106e-03 -1.3400858039217501e-02 -6.8926805074567233e-03 -2.7795510854110713e-03 -3.2033680012619444e-03 1.8476209257084651e-03 5.5749024409158616e-03 7.7468490414866701e-03 8.4952043347871764e-03 9.3710731242750579e-03 1.0278749904371064e-02 -9.0392457977361302e-03 -1.3842487630089926e-03 -6.1675192107470966e-03 -1.2234465203981451e-02 -7.3536149958379395e-03 -5.2053119926001234e-03 5.2754674622720096e-03 4.7729889130565875e-03 7.7164095821066923e-03 2.6254214378330160e-02 3.4809161217514884e-03 4.2783801270333266e-03 -1.3706115591923515e-02 -1.1682465755740994e-02 -1.5444189450388586e-02 -4.3216024114287850e-03 -2.1906597089003148e-02 -1.8671109007311934e-02 1.7600553172732972e-02 -9.6054914162935004e-03 -8.7474337857918816e-05 1.0979063617929080e-02 2.1605602643075945e-02 9.8242099976488320e-03 -7.2291781986170223e-03 -7.6533103444045695e-04 -1.2410776646999709e-02 -1.4128061673887558e-02 -2.5445540458506305e-02 -7.4317315190536980e-03 4.7286600302594651e-03 -5.8466019094301465e-03 6.4705369033039445e-03 3.4809161217514884e-03 4.2305034181871190e-02 1.9986610654311739e-02 -1.1110350658739639e-02 -3.4107491727358155e-04 2.3197339559587683e-03 -4.9254013303193095e-03 -1.8227181938389431e-02 -2.8110445929823976e-02 2.0898208332279886e-02 -5.7932272569727926e-03 1.4415730206319526e-03 1.1658580032467314e-02 1.1549061902405223e-02 7.2649550148327574e-03 -1.0671465470786057e-02 7.8215077071042052e-04 -3.1653004714623650e-02 -1.4535516669457111e-02 -1.4799769502693299e-02 -1.1953729831568101e-02 8.3833619986784982e-03 4.5238777166491185e-03 2.6172263468451709e-02 4.2783801270333266e-03 1.9986610654311742e-02 4.8738523334538944e-02 -1.5086147019896551e-02 1.9784776539790131e-03 -1.1900134362439609e-02 1.2798195537997163e-03 1.7097211266632526e-02 2.0514002758098983e-02 -4.1397662991263851e-02 1.0558231260718129e-02 -4.8381854574064175e-03 -3.4473031458914477e-02 -1.5931428010532662e-02 -2.9957684625986024e-03 1.9658153024363609e-02 -7.0348511329285960e-03 1.5816566893271409e-02 2.6825986183477132e-02 7.3985660071066708e-03 3.6675597836293831e-03 -2.5021010997936636e-02 1.0325339022579146e-02 -2.2281385111394918e-02 -1.3706115591923512e-02 -1.1110350658739639e-02 -1.5086147019896553e-02 6.6833862278398007e-02 -1.1302717754835575e-02 5.2033566162966796e-03 4.9992257760917824e-03 -1.1122309996712251e-02 -6.0244829873311867e-03 1.0511012052115121e-02 -9.5810741965588961e-03 1.5748684847114529e-03 -7.9047971566898302e-04 -1.0011712218288987e-03 1.5723245226621481e-04 -7.8201689552353255e-03 8.0270165639617867e-03 -4.8891076778805340e-03 9.1593625636380641e-03 -6.2084075291430826e-03 1.2432132684537067e-03 6.9262317896359119e-03 -1.2360579943153815e-02 7.2968163693248106e-03 -1.1682465755740995e-02 -3.4107491727358242e-04 1.9784776539790131e-03 -1.1302717754835573e-02 3.2587601240708738e-02 -1.3370175635234651e-03 7.6221481330615353e-03 -6.5749837579096016e-04 -5.9506496450457112e-04 -4.4600203096739986e-03 1.4687230691170358e-03 -7.0449613031213264e-03 -3.2487155752813574e-03 -2.0544668677283219e-03 -7.6952951859252409e-03 1.6326324434752407e-02 -4.9301370718943145e-03 7.7238859803566533e-03 3.2618337191611000e-03 9.5658822730999805e-04 3.0533943698181879e-03 -9.2607375679277810e-03 4.2340746265512579e-03 -1.3400858039217502e-02 -1.5444189450388585e-02 2.3197339559587679e-03 -1.1900134362439609e-02 5.2033566162966814e-03 -1.3370175635234651e-03 2.9859033505033404e-02 159 160 161 231 232 233 246 247 248 174 175 176 162 163 164 234 235 236 249 250 251 177 178 179 2.4240132719570481e-02 8.8817532717031945e-05 2.4573936807544716e-04 -6.4746808301924001e-03 -1.1583908912260533e-02 -1.2498069319663092e-02 -6.3990381744707340e-03 -4.1142940356861781e-03 -3.6004800085463577e-03 2.5486888620197658e-03 5.2841574566307318e-03 5.4943465493639786e-03 3.3674225323245626e-03 6.6752330648875268e-03 7.2238424840647972e-03 -5.6106715350998518e-03 -2.5224919720307913e-03 -3.2036285971462786e-03 -5.6328768285907223e-03 -2.4950255453625413e-04 -2.0199827681910583e-04 -6.0389767455610978e-03 6.4219894202784678e-03 6.5402478006706070e-03 8.8817532717033368e-05 4.2082350293087226e-02 1.9495731888121773e-02 -1.4495051073847640e-02 -2.1336384316594900e-03 -1.2752175199441261e-05 -1.0267747165231505e-02 -2.4957914582785855e-02 -5.4210194907436315e-03 6.2767512225357786e-03 -2.2329115867651601e-03 7.4681519838281276e-03 6.3594032263105888e-03 2.0599326957400705e-02 9.1848373996762413e-03 -7.3293601768457265e-03 -1.8394630779365918e-03 -1.2978305462816067e-02 1.4342391985528811e-03 -2.2224516555129692e-02 -1.6938999450055513e-02 1.7932947235808575e-02 -9.2932330162111328e-03 -7.9764469281149548e-04 2.4573936807544797e-04 1.9495731888121773e-02 4.4247921080983570e-02 -1.5575281568711975e-02 6.2721631002303881e-04 -8.0890157864959185e-03 -1.0192279510912157e-02 -1.4320767816400213e-02 -7.2705652728579902e-03 5.4366055212852716e-03 7.0796979151766092e-03 2.2092101590911767e-02 8.0092168647387350e-03 9.4326541474950946e-03 3.6847123080314607e-03 -8.1085683555885170e-03 -1.6102030365878542e-03 -2.6862644397977555e-02 1.5736544168748075e-03 -1.7343262648596088e-02 -2.3768267698025352e-02 1.8610913264238374e-02 -3.3610667592323608e-03 -4.0342418245699931e-03 -6.4746808301923984e-03 -1.4495051073847636e-02 -1.5575281568711975e-02 6.0427025459352843e-02 -5.3943460476721791e-03 3.1851265358685834e-03 2.3152522404528739e-02 1.3788289011375934e-02 7.1113198502444823e-04 -2.2932131690465686e-02 4.9871610985426527e-03 -2.0525840538229173e-02 -2.6685007795451340e-02 -1.7822346871373834e-02 -1.2215109022054235e-03 1.9064911265988697e-02 -5.0234367955492784e-03 1.6589216486887520e-02 -5.8934222535260237e-03 1.8257115110692793e-02 1.8683598772962440e-02 -4.0659216560234801e-02 5.7026155678315520e-03 -1.8464407715964141e-03 -1.1583908912260533e-02 -2.1336384316594900e-03 6.2721631002303859e-04 -5.3943460476721791e-03 2.2209243314944300e-02 -1.9178525741037007e-04 1.0024678634876114e-02 -1.0593756809135844e-03 9.1632520128114134e-04 3.5078019636893341e-03 -7.0698047215090164e-03 3.5598574264791342e-03 -4.6764791064310817e-03 -3.0017692634389183e-03 -4.1809915225919485e-04 -3.8249300504261388e-03 5.2768783880729909e-03 -2.1668280702551303e-03 6.8136656365701776e-03 -7.3049714158118489e-03 -2.7124936767761189e-03 5.1335178816543066e-03 -6.9165621896844316e-03 3.8580721891750023e-04 -1.2498069319663092e-02 -1.2752175199441749e-05 -8.0890157864959185e-03 3.1851265358685851e-03 -1.9178525741037021e-04 2.1738194945521788e-02 1.3062027967884948e-03 1.2958385743035072e-03 3.5507642095376547e-03 -8.2878903385290078e-03 1.4341253381950129e-03 -9.1088811590457498e-03 -1.1491604777000694e-03 -9.8022394473504964e-04 -5.7704649630268574e-03 1.3257805129595537e-02 -1.9816159295879369e-03 5.8260048377258454e-03 6.5776864407449858e-03 -7.0265307625232327e-05 -1.9442299442683835e-03 -2.3917007671054348e-03 5.0667870205950926e-04 -6.2023721399483787e-03 -6.3990381744707331e-03 -1.0267747165231506e-02 -1.0192279510912157e-02 2.3152522404528742e-02 1.0024678634876114e-02 1.3062027967884946e-03 3.0659476854617472e-02 1.5089077725253284e-02 3.9444554827621072e-04 -1.6054667137097203e-02 -4.1427589078108021e-03 -8.8637766578192733e-03 -1.4451023104199002e-02 -1.3125844502874000e-02 -5.0723372890580350e-04 8.1781515547082601e-03 -2.2938497930454589e-04 1.0752307616539485e-02 2.0565171758386122e-03 6.9262119646154724e-03 7.9346442878688115e-03 -2.7141939573926140e-02 -4.2742327695240220e-03 -8.2431035183575994e-04 -4.1142940356861789e-03 -2.4957914582785852e-02 -1.4320767816400213e-02 1.3788289011375932e-02 -1.0593756809135846e-03 1.2958385743035072e-03 1.5089077725253286e-02 3.8135431511855958e-02 5.0638781595915632e-04 -5.0942288761018743e-03 -2.9253288646954242e-03 -1.0558929814881216e-02 -1.3816770390945626e-02 -2.1429252287960984e-02 -6.9567071356459176e-04 6.4081710452343578e-03 -5.0206786718401250e-03 1.4832258599281379e-02 5.2784108805521684e-03 2.0329737191979096e-02 9.8693092684122123e-03 -1.7538655359682048e-02 -3.0726186156390953e-03 -9.2842591311022966e-04 -3.6004800085463577e-03 -5.4210194907436306e-03 -7.2705652728579893e-03 7.1113198502444812e-04 9.1632520128114134e-04 3.5507642095376551e-03 3.9444554827621105e-04 5.0638781595915600e-04 1.8838943207373612e-02 -8.1213464365841245e-03 -9.3992340761233674e-03 -7.6199406333467834e-03 -6.2410846161340127e-05 -9.9961545267335868e-05 -4.0585517698162790e-03 3.7594128750015514e-03 5.0473387139581176e-03 -5.7466109604974668e-05 7.2376285916994710e-03 8.3193891338264794e-03 2.9302415384059670e-03 -3.1838170870986143e-04 1.3077424710944223e-04 -6.3134251696912048e-03 2.5486888620197662e-03 6.2767512225357829e-03 5.4366055212852725e-03 -2.2932131690465686e-02 3.5078019636893341e-03 -8.2878903385290078e-03 -1.6054667137097203e-02 -5.0942288761018752e-03 -8.1213464365841245e-03 2.7838008013246006e-02 -2.4282001302019397e-03 1.2599111282276268e-02 6.9555782578760465e-03 6.5809786553160743e-03 3.5717501249889062e-03 -1.0220323570928903e-02 2.9328029912061267e-03 -1.1692131374152729e-02 -5.1009975754309359e-03 -7.4701961908958739e-03 -7.9454029501542407e-03 1.6965844840780907e-02 -4.3057096355476237e-03 1.4439304170869660e-02 5.2841574566307318e-03 -2.2329115867651601e-03 7.0796979151766084e-03 4.9871610985426527e-03 -7.0698047215090156e-03 1.4341253381950133e-03 -4.1427589078108029e-03 -2.9253288646954242e-03 -9.3992340761233674e-03 -2.4282001302019410e-03 2.1492478255534894e-02 -4.3577929763355654e-03 -1.1425585997880644e-04 -5.2940000612598974e-03 5.2790444340807194e-03 2.2707717219880275e-03 -5.0585319282493929e-03 4.2857822581371880e-03 -2.4733769615201701e-03 -2.7378711341975847e-03 -2.2007060861500192e-03 -3.3834984176496917e-03 3.8259700411415777e-03 -2.1209168069805774e-03 5.4943465493639803e-03 7.4681519838281267e-03 2.2092101590911767e-02 -2.0525840538229180e-02 3.5598574264791329e-03 -9.1088811590457480e-03 -8.8637766578192750e-03 -1.0558929814881216e-02 -7.6199406333467834e-03 1.2599111282276265e-02 -4.3577929763355646e-03 4.2486919979449998e-02 1.0427845830485933e-02 1.3695972057750411e-02 -7.7094560837926785e-04 -1.0778806605860372e-02 5.1000757028440468e-03 -2.4326675700668036e-02 -2.0016674868444263e-03 -1.2626491467706519e-02 -2.6091574802097409e-02 1.3648787626627055e-02 -2.2808429119784094e-03 3.3389963331754888e-03 3.3674225323245622e-03 6.3594032263105896e-03 8.0092168647387368e-03 -2.6685007795451340e-02 -4.6764791064310808e-03 -1.1491604777000689e-03 -1.4451023104199002e-02 -1.3816770390945627e-02 -6.2410846161340289e-05 6.9555782578760465e-03 -1.1425585997880666e-04 1.0427845830485933e-02 3.2271057104445680e-02 1.4487243439185959e-02 8.3121837060528951e-04 -1.5345404413266176e-02 -3.8415927561073018e-03 -8.9815537736460688e-03 -5.7212584887897265e-03 -9.9308259906250342e-03 -9.8239842621939896e-03 1.9608635907059947e-02 1.1533277438591304e-02 7.4882829387150904e-04 6.6752330648875268e-03 2.0599326957400705e-02 9.4326541474950946e-03 -1.7822346871373834e-02 -3.0017692634389187e-03 -9.8022394473504942e-04 -1.3125844502874000e-02 -2.1429252287960984e-02 -9.9961545267335800e-05 6.5809786553160752e-03 -5.2940000612598983e-03 1.3695972057750411e-02 1.4487243439185962e-02 3.9277000382867550e-02 9.3479432904040730e-04 -4.3487224186056373e-03 -1.8613159169256724e-03 -1.0209828660354206e-02 -2.8994878382405101e-03 -2.4421978035707191e-02 -1.3352496291523182e-02 1.0452946471704408e-02 -3.8680117749756017e-03 5.7908990759385692e-04 7.2238424840647972e-03 9.1848373996762413e-03 3.6847123080314603e-03 -1.2215109022054237e-03 -4.1809915225919495e-04 -5.7704649630268582e-03 -5.0723372890580372e-04 -6.9567071356459198e-04 -4.0585517698162790e-03 3.5717501249889066e-03 5.2790444340807194e-03 -7.7094560837926871e-04 8.3121837060528897e-04 9.3479432904040763e-04 2.0826509824607188e-02 -8.1979236369117241e-03 -9.3708359819856726e-03 -7.7132642042830367e-03 -3.0404945523997899e-03 -5.6806599825179223e-03 -7.7718439172015418e-03 1.3403518407637486e-03 7.6658966753001101e-04 1.5738483300683334e-03 -5.6106715350998518e-03 -7.3293601768457273e-03 -8.1085683555885170e-03 1.9064911265988697e-02 -3.8249300504261388e-03 1.3257805129595537e-02 8.1781515547082618e-03 6.4081710452343578e-03 3.7594128750015514e-03 -1.0220323570928903e-02 2.2707717219880275e-03 -1.0778806605860371e-02 -1.5345404413266175e-02 -4.3487224186056382e-03 -8.1979236369117258e-03 2.5736380858190321e-02 -3.0073275147922975e-03 1.2481459540576317e-02 1.2023107729622954e-03 5.9137462229011022e-03 5.3085686095082317e-03 -2.3005354932554633e-02 3.9176511705463117e-03 -7.7219475563210290e-03 -2.5224919720307913e-03 -1.8394630779365916e-03 -1.6102030365878546e-03 -5.0234367955492793e-03 5.2768783880729909e-03 -1.9816159295879374e-03 -2.2938497930454567e-04 -5.0206786718401241e-03 5.0473387139581176e-03 2.9328029912061267e-03 -5.0585319282493929e-03 5.1000757028440459e-03 -3.8415927561073009e-03 -1.8613159169256726e-03 -9.3708359819856726e-03 -3.0073275147922975e-03 2.0115050624823359e-02 -5.2950729316086657e-03 5.7889703568271616e-03 -3.5361682791541591e-03 6.0178672585704312e-03 5.9024606697509231e-03 -8.0757711387904069e-03 2.0924462043975345e-03 -3.2036285971462786e-03 -1.2978305462816067e-02 -2.6862644397977552e-02 1.6589216486887520e-02 -2.1668280702551303e-03 5.8260048377258454e-03 1.0752307616539484e-02 1.4832258599281382e-02 -5.7466109604974180e-05 -1.1692131374152733e-02 4.2857822581371888e-03 -2.4326675700668036e-02 -8.9815537736460706e-03 -1.0209828660354208e-02 -7.7132642042830367e-03 1.2481459540576318e-02 -5.2950729316086666e-03 4.1209225342285501e-02 4.1533656766616425e-03 7.9815880379907420e-03 2.1065822069888225e-02 -2.0099035575719872e-02 3.5504062296247522e-03 -9.1410018373659589e-03 -5.6328768285907231e-03 1.4342391985528813e-03 1.5736544168748075e-03 -5.8934222535260237e-03 6.8136656365701768e-03 6.5776864407449849e-03 2.0565171758386127e-03 5.2784108805521684e-03 7.2376285916994710e-03 -5.1009975754309368e-03 -2.4733769615201701e-03 -2.0016674868444263e-03 -5.7212584887897256e-03 -2.8994878382405083e-03 -3.0404945523997895e-03 1.2023107729622951e-03 5.7889703568271608e-03 4.1533656766616425e-03 2.2503908123131203e-02 -1.1378314130294667e-03 -1.0856170134442803e-03 -3.4141809255947056e-03 -1.2804589859712244e-02 -1.3414556073292411e-02 -2.4950255453625467e-04 -2.2224516555129692e-02 -1.7343262648596088e-02 1.8257115110692786e-02 -7.3049714158118480e-03 -7.0265307625232327e-05 6.9262119646154724e-03 2.0329737191979100e-02 8.3193891338264776e-03 -7.4701961908958739e-03 -2.7378711341975847e-03 -1.2626491467706519e-02 -9.9308259906250324e-03 -2.4421978035707188e-02 -5.6806599825179223e-03 5.9137462229011022e-03 -3.5361682791541582e-03 7.9815880379907438e-03 -1.1378314130294658e-03 3.9979448997634337e-02 1.8454721358121828e-02 -1.2308717149122721e-02 -8.3680769612974083e-05 9.6498087650671123e-04 -2.0199827681910616e-04 -1.6938999450055513e-02 -2.3768267698025352e-02 1.8683598772962440e-02 -2.7124936767761189e-03 -1.9442299442683831e-03 7.9346442878688080e-03 9.8693092684122106e-03 2.9302415384059675e-03 -7.9454029501542425e-03 -2.2007060861500200e-03 -2.6091574802097416e-02 -9.8239842621939914e-03 -1.3352496291523181e-02 -7.7718439172015409e-03 5.3085686095082317e-03 6.0178672585704295e-03 2.1065822069888225e-02 -1.0856170134442805e-03 1.8454721358121831e-02 4.1325420505039609e-02 -1.2869809167727843e-02 8.6279761940035674e-04 -5.7455677517411121e-03 -6.0389767455610970e-03 1.7932947235808575e-02 1.8610913264238374e-02 -4.0659216560234801e-02 5.1335178816543066e-03 -2.3917007671054361e-03 -2.7141939573926140e-02 -1.7538655359682052e-02 -3.1838170870986056e-04 1.6965844840780907e-02 -3.3834984176496917e-03 1.3648787626627055e-02 1.9608635907059947e-02 1.0452946471704406e-02 1.3403518407637484e-03 -2.3005354932554633e-02 5.9024606697509249e-03 -2.0099035575719869e-02 -3.4141809255947052e-03 -1.2308717149122718e-02 -1.2869809167727845e-02 6.3685187990030506e-02 -6.1910013324637430e-03 2.0788744876338366e-03 6.4219894202784695e-03 -9.2932330162111328e-03 -3.3610667592323599e-03 5.7026155678315529e-03 -6.9165621896844325e-03 5.0667870205950926e-04 -4.2742327695240211e-03 -3.0726186156390953e-03 1.3077424710944245e-04 -4.3057096355476237e-03 3.8259700411415786e-03 -2.2808429119784098e-03 1.1533277438591304e-02 -3.8680117749756017e-03 7.6658966753001111e-04 3.9176511705463109e-03 -8.0757711387904069e-03 3.5504062296247514e-03 -1.2804589859712244e-02 -8.3680769612976685e-05 8.6279761940035653e-04 -6.1910013324637438e-03 2.7483907463772068e-02 -1.7533679451329985e-04 6.5402478006706070e-03 -7.9764469281149526e-04 -4.0342418245699939e-03 -1.8464407715964139e-03 3.8580721891750039e-04 -6.2023721399483787e-03 -8.2431035183576037e-04 -9.2842591311022890e-04 -6.3134251696912048e-03 1.4439304170869662e-02 -2.1209168069805774e-03 3.3389963331754888e-03 7.4882829387150861e-04 5.7908990759385670e-04 1.5738483300683319e-03 -7.7219475563210290e-03 2.0924462043975349e-03 -9.1410018373659589e-03 -1.3414556073292411e-02 9.6498087650671188e-04 -5.7455677517411121e-03 2.0788744876338357e-03 -1.7533679451329975e-04 2.6523764060072827e-02 231 232 233 303 304 305 318 319 320 246 247 248 234 235 236 306 307 308 321 322 323 249 250 251 2.6579773091860649e-02 7.0378585778102672e-04 9.1797296245410868e-04 -8.2963795761305976e-03 -1.2682288935022710e-02 -1.3901038023843416e-02 -7.6554482897094071e-03 -5.0935752695726528e-03 -4.0814474071919245e-03 3.4432707724700797e-03 5.9002593794161449e-03 6.5453170279541530e-03 4.4914041789060012e-03 7.7826652766717370e-03 8.2144778998002720e-03 -6.8284180169871323e-03 -2.8183386130728877e-03 -4.2293815436297323e-03 -6.2799514800275522e-03 -8.4150603649672004e-04 -8.1438091884433695e-04 -5.4542506803820397e-03 7.0489983402960638e-03 7.3484800033008788e-03 7.0378585778102694e-04 4.6600690062073617e-02 2.1956197043358945e-02 -1.6399829229124679e-02 -2.9381388909200646e-03 -4.3295791679049073e-04 -1.1739245771176181e-02 -2.7986234344947656e-02 -6.4295678327121160e-03 7.2521051681843319e-03 -1.8884582068078369e-03 8.7794810964045393e-03 7.7032680767586681e-03 2.3164996759353448e-02 1.0431335964214606e-02 -8.3729536115829950e-03 -2.7557866077050686e-03 -1.4757344185571744e-02 9.3973952020649592e-04 -2.4755752605889421e-02 -1.9078301559424016e-02 1.9913129988953327e-02 -9.4413161651570078e-03 -4.6884260947972989e-04 9.1797296245411009e-04 2.1956197043358945e-02 4.9244807748180894e-02 -1.7736632951279488e-02 4.7560845051357944e-04 -9.7200550208346292e-03 -1.1668119997048915e-02 -1.6245894244919745e-02 -8.6794386349357509e-03 6.7786515424458063e-03 7.8701964710515184e-03 2.5116508039243906e-02 9.2429826026450626e-03 1.0766293707744788e-02 4.9001265351514278e-03 -9.4229257806514154e-03 -2.1733857155414168e-03 -3.0462766316720201e-02 1.0646644289721793e-03 -1.9344385013936229e-02 -2.6803776407992169e-02 2.0823407192462663e-02 -3.3046306982714418e-03 -3.5954059420934782e-03 -8.2963795761305976e-03 -1.6399829229124679e-02 -1.7736632951279495e-02 6.6720846929783612e-02 -5.5365124304832944e-03 4.1426928915608311e-03 2.6194959972989585e-02 1.5647183159222953e-02 1.3746153791328328e-03 -2.6066740690079804e-02 5.1866946580197146e-03 -2.3014617247429862e-02 -3.0327023055146257e-02 -1.9709412719770156e-02 -1.8357109417126980e-03 2.1954069327142750e-02 -5.0266962087952395e-03 1.8707818439616618e-02 -5.0921487041262360e-03 2.0113527599592111e-02 2.0905783172102007e-02 -4.5087584204433040e-02 5.7250451713385820e-03 -2.5439487419902282e-03 -1.2682288935022710e-02 -2.9381388909200637e-03 4.7560845051358030e-04 -5.5365124304832944e-03 2.4127709632151176e-02 -2.6401345445254548e-04 1.1064883177405418e-02 -7.0407950122195818e-04 1.0931216567455406e-03 3.6905634404966305e-03 -7.7508079458282570e-03 3.6830571554631844e-03 -5.3227397204493095e-03 -3.8074851346635544e-03 -4.6701851587399498e-04 -3.9188132770148149e-03 5.9817489729471814e-03 -2.2955986916584643e-03 7.4308312207788125e-03 -7.4025939662019638e-03 -2.7045364351044620e-03 5.2740765242892665e-03 -7.5063531662625561e-03 4.7937983436715999e-04 -1.3901038023843416e-02 -4.3295791679049040e-04 -9.7200550208346257e-03 4.1426928915608320e-03 -2.6401345445254554e-04 2.3811551552061307e-02 1.9243287991391462e-03 1.6661783015527588e-03 4.1708875355357276e-03 -9.4513684714390752e-03 1.6101318404373893e-03 -1.0553301766231225e-02 -1.7887942283049919e-03 -1.3890122333344603e-03 -6.6530280530400672e-03 1.4916117442833877e-02 -2.0671498587588708e-03 7.2313935228874408e-03 7.4044835404523503e-03 2.6294295803210612e-04 -1.3468337734846591e-03 -3.2464219503987178e-03 6.1388036331411178e-04 -6.9406139968938921e-03 -7.6554482897094054e-03 -1.1739245771176179e-02 -1.1668119997048915e-02 2.6194959972989585e-02 1.1064883177405420e-02 1.9243287991391467e-03 3.4488952653838820e-02 1.7028189535738709e-02 8.8208187165999619e-04 -1.8864744725245030e-02 -4.7830909386857596e-03 -1.0141235006296930e-02 -1.6564350245795841e-02 -1.4636646673072712e-02 -8.6232876987074917e-04 9.6961672834290427e-03 1.0325126497645520e-04 1.2257959679578045e-02 3.4096992276661979e-03 7.9539765370940894e-03 8.8844603957827836e-03 -3.0705235877173363e-02 -4.9913171322800275e-03 -1.2771469729433767e-03 -5.0935752695726528e-03 -2.7986234344947656e-02 -1.6245894244919748e-02 1.5647183159222949e-02 -7.0407950122195731e-04 1.6661783015527593e-03 1.7028189535738709e-02 4.2543784947310898e-02 1.0967500016433995e-03 -6.1531489083941565e-03 -4.1286735863034808e-03 -1.1913114536426534e-02 -1.5769208601832431e-02 -2.3827642308483447e-02 -1.1694575681456482e-03 7.4511727318228391e-03 -4.8043740406950586e-03 1.6565407578922504e-02 6.4780563708355483e-03 2.3057826563182601e-02 1.1271331540888822e-02 -1.9588669017820807e-02 -4.1506077288419032e-03 -1.2712010735155491e-03 -4.0814474071919245e-03 -6.4295678327121169e-03 -8.6794386349357492e-03 1.3746153791328326e-03 1.0931216567455402e-03 4.1708875355357276e-03 8.8208187165999565e-04 1.0967500016433990e-03 2.1017050230456073e-02 -9.4034355747198862e-03 -1.0368032353604966e-02 -9.5496409435920186e-03 -4.8333888222634432e-04 -6.1845771827905645e-04 -4.6296845014876797e-03 4.4767810082448119e-03 5.5492740135655730e-03 7.3842932890639125e-04 8.2634663592706190e-03 9.6178784635715265e-03 4.2836903035129688e-03 -1.0287227541701037e-03 5.9033769070097213e-05 -7.3512933183957161e-03 3.4432707724700801e-03 7.2521051681843337e-03 6.7786515424458045e-03 -2.6066740690079804e-02 3.6905634404966296e-03 -9.4513684714390752e-03 -1.8864744725245030e-02 -6.1531489083941557e-03 -9.4034355747198862e-03 3.1446479185464837e-02 -2.5658470804655249e-03 1.4536846334117160e-02 8.5133984218324389e-03 7.5876574777698803e-03 4.3053294723509718e-03 -1.1861848148550777e-02 3.0520501380662903e-03 -1.3550859326928073e-02 -6.4547442986536505e-03 -8.4999277202671766e-03 -9.4903439966287362e-03 1.9844929482761915e-02 -4.3634525153902776e-03 1.6275180020801826e-02 5.9002593794161432e-03 -1.8884582068078378e-03 7.8701964710515201e-03 5.1866946580197146e-03 -7.7508079458282570e-03 1.6101318404373893e-03 -4.7830909386857596e-03 -4.1286735863034791e-03 -1.0368032353604967e-02 -2.5658470804655244e-03 2.3734014755130709e-02 -4.4651982419893948e-03 1.0305830142822619e-04 -5.2326465947522263e-03 5.7677927994325166e-03 2.4128423951929145e-03 -5.5209656962594373e-03 4.4701376444692279e-03 -2.7303619292964811e-03 -3.7358611349196311e-03 -2.7077549802014601e-03 -3.5235547856092351e-03 4.5233984097401590e-03 -2.1772731795948281e-03 6.5453170279541513e-03 8.7794810964045376e-03 2.5116508039243906e-02 -2.3014617247429862e-02 3.6830571554631836e-03 -1.0553301766231225e-02 -1.0141235006296930e-02 -1.1913114536426534e-02 -9.5496409435920152e-03 1.4536846334117158e-02 -4.4651982419893930e-03 4.7388922238237222e-02 1.1965657428552290e-02 1.5149301642271240e-02 -8.3272657889195878e-05 -1.2276478571746061e-02 5.1282867047885566e-03 -2.7344741919048288e-02 -2.8615437736492447e-03 -1.4085715894564001e-02 -2.9610460309660205e-02 1.5246053808498493e-02 -2.2760979259475846e-03 4.6359873189398019e-03 4.4914041789060003e-03 7.7032680767586681e-03 9.2429826026450609e-03 -3.0327023055146257e-02 -5.3227397204493104e-03 -1.7887942283049917e-03 -1.6564350245795837e-02 -1.5769208601832431e-02 -4.8333888222634410e-04 8.5133984218324407e-03 1.0305830142822619e-04 1.1965657428552290e-02 3.6965846246006212e-02 1.6427047571277113e-02 1.3593313306118973e-03 -1.8661753795066870e-02 -4.7750697415784972e-03 -1.0455378918544070e-02 -7.3671493575862305e-03 -1.1461956274063871e-02 -1.1213143020004515e-02 2.2949627606850539e-02 1.3095600388460100e-02 1.3726836872706674e-03 7.7826652766717370e-03 2.3164996759353448e-02 1.0766293707744786e-02 -1.9709412719770156e-02 -3.8074851346635544e-03 -1.3890122333344605e-03 -1.4636646673072712e-02 -2.3827642308483450e-02 -6.1845771827905667e-04 7.5876574777698821e-03 -5.2326465947522254e-03 1.5149301642271240e-02 1.6427047571277120e-02 4.3875970256537396e-02 1.5363427890390012e-03 -4.9718278559375403e-03 -3.6893006583025309e-03 -1.1210402898298546e-02 -3.8373256060842452e-03 -2.7399825334656791e-02 -1.4987461675189977e-02 1.1357842529145913e-02 -3.0840669850323030e-03 7.5339638604700484e-04 8.2144778998002720e-03 1.0431335964214607e-02 4.9001265351514278e-03 -1.8357109417126984e-03 -4.6701851587399503e-04 -6.6530280530400672e-03 -8.6232876987074960e-04 -1.1694575681456484e-03 -4.6296845014876797e-03 4.3053294723509718e-03 5.7677927994325140e-03 -8.3272657889196095e-05 1.3593313306118967e-03 1.5363427890390012e-03 2.3720176411127385e-02 -9.5333101612284522e-03 -1.0523715045146867e-02 -1.0198450601933281e-02 -3.5853586518454399e-03 -6.6503914557068076e-03 -9.5604041158261679e-03 1.9375698218941960e-03 1.0751110321871942e-03 2.5045369838975822e-03 -6.8284180169871341e-03 -8.3729536115829950e-03 -9.4229257806514154e-03 2.1954069327142747e-02 -3.9188132770148149e-03 1.4916117442833877e-02 9.6961672834290445e-03 7.4511727318228391e-03 4.4767810082448119e-03 -1.1861848148550779e-02 2.4128423951929145e-03 -1.2276478571746061e-02 -1.8661753795066873e-02 -4.9718278559375412e-03 -9.5333101612284522e-03 2.9630698909635305e-02 -3.0555451731538825e-03 1.4364086644909044e-02 2.4455775411898880e-03 6.4533356502038076e-03 6.3345326418902731e-03 -2.6374493100792200e-02 4.0017891404696710e-03 -8.8588032242520685e-03 -2.8183386130728877e-03 -2.7557866077050695e-03 -2.1733857155414168e-03 -5.0266962087952404e-03 5.9817489729471814e-03 -2.0671498587588703e-03 1.0325126497645415e-04 -4.8043740406950560e-03 5.5492740135655739e-03 3.0520501380662903e-03 -5.5209656962594373e-03 5.1282867047885566e-03 -4.7750697415784972e-03 -3.6893006583025318e-03 -1.0523715045146867e-02 -3.0555451731538825e-03 2.2641193048119367e-02 -5.3068709289845542e-03 6.5585852975765776e-03 -2.7369912466536188e-03 7.1983307748917248e-03 5.9617630359811834e-03 -9.1155237714508324e-03 2.1952300551858466e-03 -4.2293815436297332e-03 -1.4757344185571744e-02 -3.0462766316720201e-02 1.8707818439616622e-02 -2.2955986916584643e-03 7.2313935228874400e-03 1.2257959679578045e-02 1.6565407578922504e-02 7.3842932890639255e-04 -1.3550859326928072e-02 4.4701376444692270e-03 -2.7344741919048288e-02 -1.0455378918544070e-02 -1.1210402898298543e-02 -1.0198450601933282e-02 1.4364086644909037e-02 -5.3068709289845542e-03 4.6716875954235723e-02 5.3884927051937800e-03 8.8705281474444012e-03 2.4337724207812887e-02 -2.2482737680195611e-02 3.6641433336771726e-03 -1.1018464176140655e-02 -6.2799514800275522e-03 9.3973952020649592e-04 1.0646644289721793e-03 -5.0921487041262360e-03 7.4308312207788125e-03 7.4044835404523486e-03 3.4096992276661979e-03 6.4780563708355474e-03 8.2634663592706173e-03 -6.4547442986536505e-03 -2.7303619292964815e-03 -2.8615437736492456e-03 -7.3671493575862314e-03 -3.8373256060842435e-03 -3.5853586518454399e-03 2.4455775411898880e-03 6.5585852975765776e-03 5.3884927051937800e-03 2.5705097314785014e-02 -4.6250316624869088e-04 -3.7529099379829108e-04 -6.3663802432474357e-03 -1.4377021707768016e-02 -1.5298913614595950e-02 -8.4150603649672004e-04 -2.4755752605889421e-02 -1.9344385013936229e-02 2.0113527599592108e-02 -7.4025939662019655e-03 2.6294295803210640e-04 7.9539765370940894e-03 2.3057826563182598e-02 9.6178784635715282e-03 -8.4999277202671749e-03 -3.7358611349196302e-03 -1.4085715894564001e-02 -1.1461956274063873e-02 -2.7399825334656784e-02 -6.6503914557068076e-03 6.4533356502038076e-03 -2.7369912466536205e-03 8.8705281474444030e-03 -4.6250316624869012e-04 4.4984120741553592e-02 2.0621329498179842e-02 -1.3254946589813547e-02 -2.0109230164147658e-03 7.0781329697916376e-04 -8.1438091884433684e-04 -1.9078301559424016e-02 -2.6803776407992173e-02 2.0905783172102007e-02 -2.7045364351044616e-03 -1.3468337734846582e-03 8.8844603957827818e-03 1.1271331540888822e-02 4.2836903035129706e-03 -9.4903439966287344e-03 -2.7077549802014596e-03 -2.9610460309660212e-02 -1.1213143020004514e-02 -1.4987461675189977e-02 -9.5604041158261679e-03 6.3345326418902722e-03 7.1983307748917256e-03 2.4337724207812883e-02 -3.7529099379829129e-04 2.0621329498179845e-02 4.7000586333372001e-02 -1.4231617280499187e-02 3.8706283595952207e-04 -8.3005262377346505e-03 -5.4542506803820397e-03 1.9913129988953327e-02 2.0823407192462663e-02 -4.5087584204433040e-02 5.2740765242892673e-03 -3.2464219503987183e-03 -3.0705235877173363e-02 -1.9588669017820807e-02 -1.0287227541701032e-03 1.9844929482761915e-02 -3.5235547856092347e-03 1.5246053808498500e-02 2.2949627606850539e-02 1.1357842529145913e-02 1.9375698218941960e-03 -2.6374493100792200e-02 5.9617630359811852e-03 -2.2482737680195611e-02 -6.3663802432474340e-03 -1.3254946589813547e-02 -1.4231617280499185e-02 7.1193387016415643e-02 -6.1396416851260925e-03 2.9824688424082485e-03 7.0489983402960638e-03 -9.4413161651570078e-03 -3.3046306982714426e-03 5.7250451713385820e-03 -7.5063531662625561e-03 6.1388036331411178e-04 -4.9913171322800275e-03 -4.1506077288419024e-03 5.9033769070097444e-05 -4.3634525153902776e-03 4.5233984097401581e-03 -2.2760979259475846e-03 1.3095600388460098e-02 -3.0840669850323065e-03 1.0751110321871940e-03 4.0017891404696693e-03 -9.1155237714508307e-03 3.6641433336771739e-03 -1.4377021707768018e-02 -2.0109230164147653e-03 3.8706283595952114e-04 -6.1396416851260925e-03 3.0785392423419211e-02 -2.1850270998906957e-04 7.3484800033008797e-03 -4.6884260947973135e-04 -3.5954059420934773e-03 -2.5439487419902282e-03 4.7937983436715999e-04 -6.9406139968938912e-03 -1.2771469729433772e-03 -1.2712010735155489e-03 -7.3512933183957170e-03 1.6275180020801829e-02 -2.1772731795948281e-03 4.6359873189398011e-03 1.3726836872706672e-03 7.5339638604700473e-04 2.5045369838975831e-03 -8.8588032242520685e-03 2.1952300551858470e-03 -1.1018464176140653e-02 -1.5298913614595950e-02 7.0781329697916528e-04 -8.3005262377346505e-03 2.9824688424082493e-03 -2.1850270998906947e-04 3.0065779368421003e-02 264 265 266 336 337 338 348 349 350 279 280 281 267 268 269 339 340 341 351 352 353 282 283 284 1.3421811817207086e+01 1.2816336813373621e+00 1.2816336813373617e+00 -1.3497421593681063e+01 -8.2161504899395443e-01 -8.2161504899395377e-01 -9.9377379305883604e+00 -1.2016119255560940e+00 -5.2690199420086881e-01 9.9194617692726474e+00 7.3295005947651171e-01 1.1538499454331548e+00 9.9194617692726350e+00 1.1538499454331563e+00 7.3295005947651337e-01 -9.9377379305883515e+00 -5.2690199420087047e-01 -1.2016119255560931e+00 -8.0756664862207135e+00 -1.1046442029835220e+00 -1.1046442029835264e+00 8.1878285853261161e+00 4.8633948548741035e-01 4.8633948548741257e-01 1.2816336813373623e+00 5.5717938377718621e+00 2.0554654110474094e-01 -8.1519414219817132e-01 -5.3205615762848035e+00 -5.2979417161327383e-02 -1.1997234510172901e+00 -2.8841670725029824e+00 -8.7737173832900014e-02 7.1342042398499983e-01 2.7050387375269636e+00 1.1255452146197552e-01 1.1580076735324549e+00 2.8509250237110404e+00 1.1665197372288902e-01 -9.1599999571839708e-01 -2.7336376897160348e+00 -1.5058375811157138e-01 -1.1005650971542746e+00 -1.5505627680605367e+00 -1.8036939916854342e-01 8.7842090723331545e-01 1.3611715075544910e+00 3.6916711984736672e-02 1.2816336813373617e+00 2.0554654110474099e-01 5.5717938377718621e+00 -8.1519414219817055e-01 -5.2979417161327348e-02 -5.3205615762848035e+00 -9.1599999571839641e-01 -1.5058375811157129e-01 -2.7336376897160428e+00 1.1580076735324547e+00 1.1665197372288866e-01 2.8509250237110479e+00 7.1342042398499961e-01 1.1255452146197573e-01 2.7050387375269560e+00 -1.1997234510172894e+00 -8.7737173832900334e-02 -2.8841670725029731e+00 -1.1005650971542742e+00 -1.8036939916854261e-01 -1.5505627680605374e+00 8.7842090723331490e-01 3.6916711984736263e-02 1.3611715075544912e+00 -1.3497421593681064e+01 -8.1519414219817155e-01 -8.1519414219817077e-01 1.3700424172293111e+01 3.3336215112475753e-01 3.3336215112475720e-01 1.0107411116559231e+01 7.2942549644364274e-01 2.8366913988787595e-01 -1.0119494841312994e+01 -2.4477933480314540e-01 -9.2348582505607646e-01 -1.0119494841312981e+01 -9.2348582505607868e-01 -2.4477933480314823e-01 1.0107411116559220e+01 2.8366913988787806e-01 7.2942549644364318e-01 8.2304090343081437e+00 8.7719331664395250e-01 8.7719331664395739e-01 -8.4092441634126658e+00 -2.4019080204283572e-01 -2.4019080204283824e-01 -8.2161504899395443e-01 -5.3205615762848035e+00 -5.2979417161327348e-02 3.3336215112475753e-01 5.3118120404202385e+00 1.4797275296233715e-02 7.3957075209310208e-01 2.7204169228832416e+00 2.8169602441182041e-02 -2.4638720198280079e-01 -2.6910850213580266e+00 -3.1149228780962091e-02 -5.3647727566505399e-01 -2.7315361563111580e+00 -1.6923786927017972e-02 2.8567034728949703e-01 2.6925328551059020e+00 2.8129232947033331e-02 4.9021088189219320e-01 1.3941896697120251e+00 3.7401380479826364e-02 -2.4433460575774055e-01 -1.3757687341674165e+00 -7.4450582949680561e-03 -8.2161504899395377e-01 -5.2979417161327362e-02 -5.3205615762848035e+00 3.3336215112475720e-01 1.4797275296233715e-02 5.3118120404202385e+00 2.8567034728949692e-01 2.8129232947033265e-02 2.6925328551059104e+00 -5.3647727566505432e-01 -1.6923786927017861e-02 -2.7315361563111664e+00 -2.4638720198279992e-01 -3.1149228780962070e-02 -2.6910850213580182e+00 7.3957075209310108e-01 2.8169602441182037e-02 2.7204169228832331e+00 4.9021088189219308e-01 3.7401380479826184e-02 1.3941896697120253e+00 -2.4433460575774019e-01 -7.4450582949678965e-03 -1.3757687341674167e+00 -9.9377379305883604e+00 -1.1997234510172901e+00 -9.1599999571839641e-01 1.0107411116559231e+01 7.3957075209310197e-01 2.8567034728949692e-01 1.3646358188752883e+01 1.2926891984033699e+00 3.2619562042973582e-01 -1.3627462200231509e+01 -8.2383542593797532e-01 -7.8789511905133058e-01 -8.2414424560231225e+00 -1.1101949849207651e+00 -2.3834042431313152e-01 8.2321300426278956e+00 4.8587183248714061e-01 8.7291755775886093e-01 9.9646325630429082e+00 1.1482612535435543e+00 6.9657811084822674e-01 -1.0143889324139925e+01 -5.3263917465113719e-01 -2.3912609724346257e-01 -1.2016119255560940e+00 -2.8841670725029824e+00 -1.5058375811157129e-01 7.2942549644364263e-01 2.7204169228832411e+00 2.8129232947033265e-02 1.2926891984033702e+00 5.6581172146511847e+00 4.9914677838659376e-02 -8.0068812393866162e-01 -5.4733713969791777e+00 -1.0403272433187995e-01 -1.1234863465483544e+00 -1.5496390005000038e+00 -3.9847113685626281e-02 8.7291755775886115e-01 1.3944073199673774e+00 1.3562051912093362e-01 1.1534601863274598e+00 2.9398414113903000e+00 1.1142696222569344e-01 -9.2270604289022429e-01 -2.8056053989099374e+00 -3.0627796003242225e-02 -5.2690199420086881e-01 -8.7737173832900014e-02 -2.7336376897160428e+00 2.8366913988787595e-01 2.8169602441182037e-02 2.6925328551059104e+00 3.2619562042973588e-01 4.9914677838659369e-02 5.4670318888642102e+00 -8.2453927803020277e-01 -1.0991806202044885e-01 -5.4725074584734976e+00 -2.3854591966509600e-01 -3.9392531430914986e-02 -1.3764171585805707e+00 4.8587183248713833e-01 5.8765717287569560e-02 1.3944073199673768e+00 7.3667624635404672e-01 1.1683331789670989e-01 2.7937325158941047e+00 -2.4242564726262944e-01 -1.6635548179857025e-02 -2.7651422730614912e+00 9.9194617692726492e+00 7.1342042398499983e-01 1.1580076735324547e+00 -1.0119494841312994e+01 -2.4638720198280079e-01 -5.3647727566505432e-01 -1.3627462200231509e+01 -8.0068812393866162e-01 -8.2453927803020277e-01 1.3732183251959741e+01 3.3082171589066012e-01 1.2862918039156948e+00 8.1896340620866752e+00 8.6493572211797221e-01 4.8584601376735043e-01 -8.2414424560231243e+00 -2.3854591966509847e-01 -1.1234863465483542e+00 -9.9620515156886480e+00 -9.0602198442020088e-01 -1.1941454077498286e+00 1.0109171929937208e+01 2.8246536801312949e-01 7.4850281677794062e-01 7.3295005947651171e-01 2.7050387375269636e+00 1.1665197372288866e-01 -2.4477933480314540e-01 -2.6910850213580271e+00 -1.6923786927017868e-02 -8.2383542593797543e-01 -5.4733713969791786e+00 -1.0991806202044888e-01 3.3082171589066023e-01 5.5316829009681383e+00 5.0151138118107653e-02 4.8584601376734793e-01 1.3616859318201673e+00 5.8792970702217062e-02 -2.3834042431312877e-01 -1.3764171585805707e+00 -3.9847113685625810e-02 -5.2693538191435296e-01 -2.8069230587731422e+00 -8.7634083626835196e-02 2.8427277783408261e-01 2.7493890653756505e+00 2.8726963716714387e-02 1.1538499454331548e+00 1.1255452146197552e-01 2.8509250237110479e+00 -9.2348582505607668e-01 -3.1149228780962081e-02 -2.7315361563111664e+00 -7.8789511905133058e-01 -1.0403272433187995e-01 -5.4725074584734976e+00 1.2862918039156948e+00 5.0151138118107653e-02 5.7196227729163036e+00 8.6493572211797032e-01 1.3304471068180393e-01 1.3616859318201677e+00 -1.1101949849207637e+00 -3.9392531430915333e-02 -1.5496390005000040e+00 -1.1815900757686133e+00 -1.4775214252437982e-01 -2.9544905989312444e+00 6.9808853332996401e-01 2.6576256806250104e-02 2.7759394857683910e+00 9.9194617692726368e+00 1.1580076735324549e+00 7.1342042398499950e-01 -1.0119494841312981e+01 -5.3647727566505399e-01 -2.4638720198279995e-01 -8.2414424560231225e+00 -1.1234863465483547e+00 -2.3854591966509603e-01 8.1896340620866752e+00 4.8584601376734793e-01 8.6493572211797043e-01 1.3732183251959695e+01 1.2862918039156956e+00 3.3082171589066178e-01 -1.3627462200231463e+01 -8.2453927803020299e-01 -8.0068812393866151e-01 -9.9620515156886356e+00 -1.1941454077498241e+00 -9.0602198442020532e-01 1.0109171929937197e+01 7.4850281677793762e-01 2.8246536801313149e-01 1.1538499454331563e+00 2.8509250237110404e+00 1.1255452146197573e-01 -9.2348582505607846e-01 -2.7315361563111584e+00 -3.1149228780962070e-02 -1.1101949849207651e+00 -1.5496390005000038e+00 -3.9392531430914986e-02 8.6493572211797221e-01 1.3616859318201673e+00 1.3304471068180393e-01 1.2862918039156956e+00 5.7196227729162716e+00 5.0151138118108021e-02 -7.8789511905133280e-01 -5.4725074584734656e+00 -1.0403272433188039e-01 -1.1815900757686142e+00 -2.9544905989312351e+00 -1.4775214252438076e-01 6.9808853332996623e-01 2.7759394857683817e+00 2.6576256806250618e-02 7.3295005947651337e-01 1.1665197372288903e-01 2.7050387375269560e+00 -2.4477933480314834e-01 -1.6923786927017969e-02 -2.6910850213580182e+00 -2.3834042431313152e-01 -3.9847113685626288e-02 -1.3764171585805707e+00 4.8584601376735048e-01 5.8792970702217062e-02 1.3616859318201677e+00 3.3082171589066167e-01 5.0151138118108021e-02 5.5316829009681028e+00 -8.2383542593797576e-01 -1.0991806202044870e-01 -5.4733713969791475e+00 -5.2693538191435496e-01 -8.7634083626835418e-02 -2.8069230587731333e+00 2.8427277783408494e-01 2.8726963716714286e-02 2.7493890653756412e+00 -9.9377379305883515e+00 -9.1599999571839708e-01 -1.1997234510172894e+00 1.0107411116559222e+01 2.8567034728949703e-01 7.3957075209310108e-01 8.2321300426278956e+00 8.7291755775886115e-01 4.8587183248713844e-01 -8.2414424560231243e+00 -2.3834042431312874e-01 -1.1101949849207637e+00 -1.3627462200231465e+01 -7.8789511905133280e-01 -8.2383542593797565e-01 1.3646358188752842e+01 3.2619562042973721e-01 1.2926891984033690e+00 9.9646325630428976e+00 6.9657811084822285e-01 1.1482612535435588e+00 -1.0143889324139916e+01 -2.3912609724345985e-01 -5.3263917465113886e-01 -5.2690199420087047e-01 -2.7336376897160344e+00 -8.7737173832900334e-02 2.8366913988787801e-01 2.6925328551059020e+00 2.8169602441182037e-02 4.8587183248714050e-01 1.3944073199673774e+00 5.8765717287569574e-02 -2.3854591966509847e-01 -1.3764171585805707e+00 -3.9392531430915340e-02 -8.2453927803020299e-01 -5.4725074584734656e+00 -1.0991806202044870e-01 3.2619562042973721e-01 5.4670318888641756e+00 4.9914677838659625e-02 7.3667624635404794e-01 2.7937325158940971e+00 1.1683331789671031e-01 -2.4242564726263197e-01 -2.7651422730614832e+00 -1.6635548179857226e-02 -1.2016119255560929e+00 -1.5058375811157135e-01 -2.8841670725029731e+00 7.2942549644364307e-01 2.8129232947033331e-02 2.7204169228832331e+00 8.7291755775886104e-01 1.3562051912093362e-01 1.3944073199673772e+00 -1.1234863465483542e+00 -3.9847113685625803e-02 -1.5496390005000040e+00 -8.0068812393866140e-01 -1.0403272433188039e-01 -5.4733713969791475e+00 1.2926891984033690e+00 4.9914677838659625e-02 5.6581172146511518e+00 1.1534601863274596e+00 1.1142696222569273e-01 2.9398414113902924e+00 -9.2270604289022407e-01 -3.0627796003241788e-02 -2.8056053989099299e+00 -8.0756664862207135e+00 -1.1005650971542746e+00 -1.1005650971542742e+00 8.2304090343081437e+00 4.9021088189219320e-01 4.9021088189219308e-01 9.9646325630429082e+00 1.1534601863274601e+00 7.3667624635404672e-01 -9.9620515156886462e+00 -5.2693538191435296e-01 -1.1815900757686133e+00 -9.9620515156886356e+00 -1.1815900757686142e+00 -5.2693538191435496e-01 9.9646325630428976e+00 7.3667624635404794e-01 1.1534601863274598e+00 1.3580557759939639e+01 1.2658328036351798e+00 1.2658328036351847e+00 -1.3740462402735590e+01 -8.3708956337163987e-01 -8.3708956337164220e-01 -1.1046442029835220e+00 -1.5505627680605367e+00 -1.8036939916854261e-01 8.7719331664395284e-01 1.3941896697120253e+00 3.7401380479826177e-02 1.1482612535435543e+00 2.9398414113903000e+00 1.1683331789670989e-01 -9.0602198442020065e-01 -2.8069230587731417e+00 -1.4775214252437985e-01 -1.1941454077498239e+00 -2.9544905989312351e+00 -8.7634083626835432e-02 6.9657811084822263e-01 2.7937325158940967e+00 1.1142696222569272e-01 1.2658328036351800e+00 5.7978582387057394e+00 2.0244657225436030e-01 -7.8305388951736243e-01 -5.6136454099372477e+00 -5.2352607536831373e-02 -1.1046442029835264e+00 -1.8036939916854336e-01 -1.5505627680605374e+00 8.7719331664395739e-01 3.7401380479826364e-02 1.3941896697120253e+00 6.9657811084822674e-01 1.1142696222569345e-01 2.7937325158941047e+00 -1.1941454077498288e+00 -8.7634083626835196e-02 -2.9544905989312444e+00 -9.0602198442020532e-01 -1.4775214252438076e-01 -2.8069230587731333e+00 1.1482612535435588e+00 1.1683331789671030e-01 2.9398414113902924e+00 1.2658328036351847e+00 2.0244657225436036e-01 5.7978582387057411e+00 -7.8305388951736699e-01 -5.2352607536831131e-02 -5.6136454099372468e+00 8.1878285853261161e+00 8.7842090723331556e-01 8.7842090723331490e-01 -8.4092441634126658e+00 -2.4433460575774055e-01 -2.4433460575774019e-01 -1.0143889324139925e+01 -9.2270604289022429e-01 -2.4242564726262944e-01 1.0109171929937208e+01 2.8427277783408256e-01 6.9808853332996401e-01 1.0109171929937197e+01 6.9808853332996623e-01 2.8427277783408494e-01 -1.0143889324139916e+01 -2.4242564726263191e-01 -9.2270604289022418e-01 -1.3740462402735593e+01 -7.8305388951736254e-01 -7.8305388951736699e-01 1.4031312769227574e+01 3.3173796703059505e-01 3.3173796703059732e-01 4.8633948548741035e-01 1.3611715075544910e+00 3.6916711984736256e-02 -2.4019080204283577e-01 -1.3757687341674165e+00 -7.4450582949678957e-03 -5.3263917465113719e-01 -2.8056053989099374e+00 -1.6635548179857025e-02 2.8246536801312949e-01 2.7493890653756505e+00 2.6576256806250108e-02 7.4850281677793762e-01 2.7759394857683817e+00 2.8726963716714286e-02 -2.3912609724345990e-01 -2.7651422730614832e+00 -3.0627796003241795e-02 -8.3708956337163987e-01 -5.6136454099372477e+00 -5.2352607536831117e-02 3.3173796703059505e-01 5.6736617573775625e+00 1.4841077507197209e-02 4.8633948548741246e-01 3.6916711984736679e-02 1.3611715075544912e+00 -2.4019080204283830e-01 -7.4450582949680561e-03 -1.3757687341674167e+00 -2.3912609724346254e-01 -3.0627796003242228e-02 -2.7651422730614912e+00 7.4850281677794062e-01 2.8726963716714383e-02 2.7759394857683901e+00 2.8246536801313149e-01 2.6576256806250621e-02 2.7493890653756412e+00 -5.3263917465113897e-01 -1.6635548179857219e-02 -2.8056053989099299e+00 -8.3708956337164242e-01 -5.2352607536831394e-02 -5.6136454099372477e+00 3.3173796703059727e-01 1.4841077507197209e-02 5.6736617573775616e+00 336 337 338 384 385 386 396 397 398 348 349 350 339 340 341 387 388 389 399 400 401 351 352 353 1.3382151954685101e+01 1.2692587333838354e+00 1.2692587333838314e+00 -1.3467547303632273e+01 -8.1994500114435309e-01 -8.1994500114434998e-01 -9.7223440913786412e+00 -1.1811265940803803e+00 -5.0321925065825812e-01 9.7033238609204364e+00 7.2190310126835089e-01 1.1430051577934579e+00 9.7033238609204524e+00 1.1430051577934581e+00 7.2190310126834945e-01 -9.7223440913786590e+00 -5.0321925065825901e-01 -1.1811265940803815e+00 -7.8171004230266510e+00 -1.0902203939227766e+00 -1.0902203939227773e+00 7.9405362328902314e+00 4.6034424736012552e-01 4.6034424736012369e-01 1.2692587333838354e+00 5.6974237881045058e+00 2.0610152284928521e-01 -7.8773623129051684e-01 -5.4416922302616602e+00 -5.0556749705091900e-02 -1.1870612891669552e+00 -2.8707194155703299e+00 -8.5224098312148555e-02 6.8382786698351339e-01 2.6879457935545026e+00 1.1024561980007444e-01 1.1400068534737311e+00 2.8380057900453468e+00 1.1655126857118643e-01 -8.9340389854413971e-01 -2.7162318103603047e+00 -1.4878766423809439e-01 -1.0824098842518430e+00 -1.5087336968992486e+00 -1.8086016042326133e-01 8.5751784941237486e-01 1.3140017813871867e+00 3.2530261458049409e-02 1.2692587333838314e+00 2.0610152284928521e-01 5.6974237881045049e+00 -7.8773623129051296e-01 -5.0556749705091941e-02 -5.4416922302616602e+00 -8.9340389854413671e-01 -1.4878766423809384e-01 -2.7162318103602927e+00 1.1400068534737278e+00 1.1655126857118657e-01 2.8380057900453348e+00 6.8382786698350961e-01 1.1024561980007376e-01 2.6879457935545146e+00 -1.1870612891669516e+00 -8.5224098312148486e-02 -2.8707194155703410e+00 -1.0824098842518397e+00 -1.8086016042326081e-01 -1.5087336968992480e+00 8.5751784941237186e-01 3.2530261458049568e-02 1.3140017813871863e+00 -1.3467547303632273e+01 -7.8773623129051673e-01 -7.8773623129051284e-01 1.3687992151145794e+01 3.1441389500040545e-01 3.1441389500040184e-01 9.9059319556251531e+00 7.0275843280021222e-01 2.5498781534499065e-01 -9.9189715811997523e+00 -2.2600855808735767e-01 -9.0922761681747177e-01 -9.9189715811997701e+00 -9.0922761681747155e-01 -2.2600855808735451e-01 9.9059319556251690e+00 2.5498781534499104e-01 7.0275843280021144e-01 7.9827122999982825e+00 8.6407670137156645e-01 8.6407670137156689e-01 -8.1770778963626043e+00 -2.1326443832182918e-01 -2.1326443832182690e-01 -8.1994500114435309e-01 -5.4416922302616610e+00 -5.0556749705091927e-02 3.1441389500040540e-01 5.4401004479179331e+00 1.3814953098823720e-02 7.3067198926918642e-01 2.7067668499340587e+00 2.6107440462786805e-02 -2.1989018281667852e-01 -2.6803117009034256e+00 -2.8082804589146325e-02 -5.2059922690268190e-01 -2.7196464851003412e+00 -1.5858073959785154e-02 2.6412913156069162e-01 2.6804728141932821e+00 2.5943563367953684e-02 4.7190846757706018e-01 1.3499441994215913e+00 3.4563907644372352e-02 -2.2068907254363021e-01 -1.3356338952014377e+00 -5.9322363199130028e-03 -8.1994500114434998e-01 -5.0556749705091920e-02 -5.4416922302616602e+00 3.1441389500040184e-01 1.3814953098823713e-02 5.4401004479179313e+00 2.6412913156068846e-01 2.5943563367953358e-02 2.6804728141932697e+00 -5.2059922690267824e-01 -1.5858073959785179e-02 -2.7196464851003288e+00 -2.1989018281667622e-01 -2.8082804589145850e-02 -2.6803117009034372e+00 7.3067198926918464e-01 2.6107440462786867e-02 2.7067668499340711e+00 4.7190846757705734e-01 3.4563907644371929e-02 1.3499441994215904e+00 -2.2068907254362768e-01 -5.9322363199129568e-03 -1.3356338952014377e+00 -9.7223440913786412e+00 -1.1870612891669550e+00 -8.9340389854413671e-01 9.9059319556251531e+00 7.3067198926918653e-01 2.6412913156068846e-01 1.3228410942009782e+01 1.2711341520756847e+00 2.9261275272931686e-01 -1.3207473471738659e+01 -8.0485923486875244e-01 -7.6892597848877997e-01 -7.9958839760999378e+00 -1.1007431347072170e+00 -2.1819683412348237e-01 7.9865232757016100e+00 4.6007582722231166e-01 8.5207567864655531e-01 9.5645717881712855e+00 1.1326825628665327e+00 6.8259550934124158e-01 -9.7597364222905902e+00 -5.0190087269079209e-01 -2.1088636112139891e-01 -1.1811265940803803e+00 -2.8707194155703295e+00 -1.4878766423809384e-01 7.0275843280021233e-01 2.7067668499340587e+00 2.5943563367953358e-02 1.2711341520756849e+00 5.4870209088773070e+00 4.5184945548346851e-02 -7.7104869135396170e-01 -5.2974421463714778e+00 -1.0317773842712684e-01 -1.1034424690505507e+00 -1.5097834653454623e+00 -3.7019626986787818e-02 8.5207567864655542e-01 1.3487119812753248e+00 1.3498041175084066e-01 1.1304726415589259e+00 2.7861152112329748e+00 1.1035620569763528e-01 -9.0082315059648566e-01 -2.6506699240323961e+00 -2.7480096712766907e-02 -5.0321925065825812e-01 -8.5224098312148569e-02 -2.7162318103602927e+00 2.5498781534499065e-01 2.6107440462786805e-02 2.6804728141932692e+00 2.9261275272931686e-01 4.5184945548346865e-02 5.2946501648055033e+00 -7.9463445428933510e-01 -1.0905372038092899e-01 -5.2958371591519100e+00 -2.0739543206591590e-01 -3.5164980307841903e-02 -1.3343999726276863e+00 4.6007582722231172e-01 5.7582912546653112e-02 1.3487119812753243e+00 7.0451361137819568e-01 1.1383089454279849e-01 2.6354007137056685e+00 -2.0694086966130559e-01 -1.3263394099665853e-02 -2.6127667318398755e+00 9.7033238609204364e+00 6.8382786698351339e-01 1.1400068534737278e+00 -9.9189715811997541e+00 -2.1989018281667849e-01 -5.2059922690267824e-01 -1.3207473471738661e+01 -7.7104869135396181e-01 -7.9463445428933521e-01 1.3317196233465891e+01 3.0377339433327794e-01 1.2708907192064265e+00 7.9406637203901145e+00 8.5016033277292880e-01 4.6636671255104678e-01 -7.9958839760999387e+00 -2.0739543206591554e-01 -1.1034424690505511e+00 -9.5610839296565011e+00 -8.8977285005621742e-01 -1.1747503227155425e+00 9.7222291439184083e+00 2.5034556220305348e-01 7.1616218772690177e-01 7.2190310126835089e-01 2.6879457935545026e+00 1.1655126857118656e-01 -2.2600855808735770e-01 -2.6803117009034256e+00 -1.5858073959785182e-02 -8.0485923486875233e-01 -5.2974421463714787e+00 -1.0905372038092896e-01 3.0377339433327794e-01 5.3628546945845130e+00 4.6720167388094175e-02 4.6636671255104922e-01 1.3158862156599072e+00 5.8417139651595520e-02 -2.1819683412348517e-01 -1.3343999726276863e+00 -3.7019626986788207e-02 -5.0243191918020658e-01 -2.6499267329682032e+00 -8.5249774901391490e-02 2.5945333810712390e-01 2.5953938490718707e+00 2.5492620618017412e-02 1.1430051577934577e+00 1.1024561980007441e-01 2.8380057900453348e+00 -9.0922761681747177e-01 -2.8082804589146325e-02 -2.7196464851003288e+00 -7.6892597848877986e-01 -1.0317773842712682e-01 -5.2958371591519100e+00 1.2708907192064265e+00 4.6720167388094189e-02 5.5541867141888792e+00 8.5016033277292902e-01 1.3399544251976217e-01 1.3158862156599067e+00 -1.1007431347072170e+00 -3.5164980307841938e-02 -1.5097834653454623e+00 -1.1685128653850196e+00 -1.4813768440847019e-01 -2.8019192458537905e+00 6.8335338562567494e-01 2.3601978024654576e-02 2.6191076355573699e+00 9.7033238609204524e+00 1.1400068534737311e+00 6.8382786698350961e-01 -9.9189715811997701e+00 -5.2059922690268201e-01 -2.1989018281667616e-01 -7.9958839760999378e+00 -1.1034424690505509e+00 -2.0739543206591590e-01 7.9406637203901145e+00 4.6636671255104917e-01 8.5016033277292891e-01 1.3317196233465955e+01 1.2708907192064276e+00 3.0377339433327605e-01 -1.3207473471738723e+01 -7.9463445428933799e-01 -7.7104869135396137e-01 -9.5610839296565189e+00 -1.1747503227155420e+00 -8.8977285005621776e-01 9.7222291439184243e+00 7.1616218772690465e-01 2.5034556220305187e-01 1.1430051577934581e+00 2.8380057900453468e+00 1.1024561980007376e-01 -9.0922761681747155e-01 -2.7196464851003412e+00 -2.8082804589145846e-02 -1.1007431347072170e+00 -1.5097834653454623e+00 -3.5164980307841910e-02 8.5016033277292880e-01 1.3158862156599072e+00 1.3399544251976217e-01 1.2708907192064276e+00 5.5541867141889272e+00 4.6720167388093828e-02 -7.6892597848877930e-01 -5.2958371591519589e+00 -1.0317773842712674e-01 -1.1685128653850205e+00 -2.8019192458538020e+00 -1.4813768440847022e-01 6.8335338562567394e-01 2.6191076355573824e+00 2.3601978024654247e-02 7.2190310126834956e-01 1.1655126857118642e-01 2.6879457935545146e+00 -2.2600855808735454e-01 -1.5858073959785151e-02 -2.6803117009034372e+00 -2.1819683412348237e-01 -3.7019626986787818e-02 -1.3343999726276863e+00 4.6636671255104689e-01 5.8417139651595514e-02 1.3158862156599067e+00 3.0377339433327621e-01 4.6720167388093828e-02 5.3628546945845592e+00 -8.0485923486875233e-01 -1.0905372038092911e-01 -5.2974421463715249e+00 -5.0243191918020491e-01 -8.5249774901391143e-02 -2.6499267329682139e+00 2.5945333810712173e-01 2.5492620618017471e-02 2.5953938490718826e+00 -9.7223440913786590e+00 -8.9340389854413982e-01 -1.1870612891669514e+00 9.9059319556251708e+00 2.6412913156069168e-01 7.3067198926918464e-01 7.9865232757016100e+00 8.5207567864655542e-01 4.6007582722231166e-01 -7.9958839760999387e+00 -2.1819683412348514e-01 -1.1007431347072167e+00 -1.3207473471738723e+01 -7.6892597848877886e-01 -8.0485923486875233e-01 1.3228410942009848e+01 2.9261275272931769e-01 1.2711341520756863e+00 9.5645717881713015e+00 6.8259550934124047e-01 1.1326825628665336e+00 -9.7597364222906045e+00 -2.1088636112140144e-01 -5.0190087269079076e-01 -5.0321925065825912e-01 -2.7162318103603047e+00 -8.5224098312148500e-02 2.5498781534499099e-01 2.6804728141932821e+00 2.6107440462786864e-02 4.6007582722231166e-01 1.3487119812753248e+00 5.7582912546653119e-02 -2.0739543206591554e-01 -1.3343999726276863e+00 -3.5164980307841931e-02 -7.9463445428933799e-01 -5.2958371591519589e+00 -1.0905372038092913e-01 2.9261275272931769e-01 5.2946501648055504e+00 4.5184945548346948e-02 7.0451361137819701e-01 2.6354007137056805e+00 1.1383089454279857e-01 -2.0694086966130484e-01 -2.6127667318398875e+00 -1.3263394099665829e-02 -1.1811265940803815e+00 -1.4878766423809439e-01 -2.8707194155703415e+00 7.0275843280021133e-01 2.5943563367953688e-02 2.7067668499340707e+00 8.5207567864655531e-01 1.3498041175084066e-01 1.3487119812753243e+00 -1.1034424690505513e+00 -3.7019626986788200e-02 -1.5097834653454618e+00 -7.7104869135396092e-01 -1.0317773842712673e-01 -5.2974421463715267e+00 1.2711341520756863e+00 4.5184945548346948e-02 5.4870209088773567e+00 1.1304726415589266e+00 1.1035620569763523e-01 2.7861152112329877e+00 -9.0082315059648588e-01 -2.7480096712767195e-02 -2.6506699240324076e+00 -7.8171004230266510e+00 -1.0824098842518430e+00 -1.0824098842518395e+00 7.9827122999982825e+00 4.7190846757706018e-01 4.7190846757705734e-01 9.5645717881712873e+00 1.1304726415589259e+00 7.0451361137819568e-01 -9.5610839296565011e+00 -5.0243191918020669e-01 -1.1685128653850194e+00 -9.5610839296565189e+00 -1.1685128653850205e+00 -5.0243191918020480e-01 9.5645717881713015e+00 7.0451361137819701e-01 1.1304726415589266e+00 1.2795048503431303e+01 1.2389885700397902e+00 1.2389885700397902e+00 -1.2967636097432505e+01 -7.9252862173690342e-01 -7.9252862173690153e-01 -1.0902203939227766e+00 -1.5087336968992486e+00 -1.8086016042326081e-01 8.6407670137156645e-01 1.3499441994215911e+00 3.4563907644371936e-02 1.1326825628665329e+00 2.7861152112329748e+00 1.1383089454279849e-01 -8.8977285005621753e-01 -2.6499267329682032e+00 -1.4813768440847019e-01 -1.1747503227155420e+00 -2.8019192458538020e+00 -8.5249774901391143e-02 6.8259550934124036e-01 2.6354007137056805e+00 1.1035620569763521e-01 1.2389885700397900e+00 5.3576728768278787e+00 2.0262417384871134e-01 -7.6359977692459369e-01 -5.1685533254668705e+00 -4.7127562000394120e-02 -1.0902203939227773e+00 -1.8086016042326133e-01 -1.5087336968992482e+00 8.6407670137156689e-01 3.4563907644372352e-02 1.3499441994215906e+00 6.8259550934124136e-01 1.1035620569763525e-01 2.6354007137056685e+00 -1.1747503227155427e+00 -8.5249774901391490e-02 -2.8019192458537905e+00 -8.8977285005621776e-01 -1.4813768440847025e-01 -2.6499267329682143e+00 1.1326825628665336e+00 1.1383089454279857e-01 2.7861152112329872e+00 1.2389885700397905e+00 2.0262417384871137e-01 5.3576728768278787e+00 -7.6359977692459491e-01 -4.7127562000394564e-02 -5.1685533254668705e+00 7.9405362328902314e+00 8.5751784941237486e-01 8.5751784941237186e-01 -8.1770778963626043e+00 -2.2068907254363021e-01 -2.2068907254362768e-01 -9.7597364222905902e+00 -9.0082315059648566e-01 -2.0694086966130559e-01 9.7222291439184083e+00 2.5945333810712390e-01 6.8335338562567494e-01 9.7222291439184243e+00 6.8335338562567394e-01 2.5945333810712168e-01 -9.7597364222906045e+00 -2.0694086966130487e-01 -9.0082315059648588e-01 -1.2967636097432505e+01 -7.6359977692459369e-01 -7.6359977692459469e-01 1.3279192317649239e+01 2.9172829658084221e-01 2.9172829658084076e-01 4.6034424736012552e-01 1.3140017813871867e+00 3.2530261458049561e-02 -2.1326443832182918e-01 -1.3356338952014377e+00 -5.9322363199129542e-03 -5.0190087269079209e-01 -2.6506699240323961e+00 -1.3263394099665850e-02 2.5034556220305348e-01 2.5953938490718707e+00 2.3601978024654576e-02 7.1616218772690476e-01 2.6191076355573828e+00 2.5492620618017471e-02 -2.1088636112140138e-01 -2.6127667318398875e+00 -2.7480096712767191e-02 -7.9252862173690342e-01 -5.1685533254668705e+00 -4.7127562000394543e-02 2.9172829658084226e-01 5.2391206105241519e+00 1.2178429032018774e-02 4.6034424736012364e-01 3.2530261458049409e-02 1.3140017813871863e+00 -2.1326443832182690e-01 -5.9322363199130028e-03 -1.3356338952014377e+00 -2.1088636112139891e-01 -2.7480096712766900e-02 -2.6127667318398755e+00 7.1616218772690177e-01 2.5492620618017412e-02 2.6191076355573699e+00 2.5034556220305193e-01 2.3601978024654247e-02 2.5953938490718826e+00 -5.0190087269079087e-01 -1.3263394099665829e-02 -2.6506699240324076e+00 -7.9252862173690153e-01 -4.7127562000394078e-02 -5.1685533254668705e+00 2.9172829658084071e-01 1.2178429032018771e-02 5.2391206105241519e+00 279 280 281 348 349 350 360 361 362 294 295 296 282 283 284 351 352 353 363 364 365 297 298 299 1.2657852651303877e+01 2.6734257208876713e+00 1.1988914796075416e+00 -1.2896334690964242e+01 -2.3157440373725913e+00 -7.7694210370802652e-01 -9.1356080654862186e+00 -2.4176673736538503e+00 -4.6749242516335199e-01 9.2873118534842565e+00 2.0360606225964517e+00 1.0878637776639288e+00 9.2329203035425316e+00 2.4038040173945325e+00 6.7826503478525957e-01 -9.4054180690570313e+00 -1.8570357589663760e+00 -1.1376293949170726e+00 -7.3551815767033775e+00 -2.2422607878379468e+00 -1.0276096819790064e+00 7.6144575938802053e+00 1.7194175969521088e+00 4.4465331371072303e-01 2.6734257208876713e+00 6.3681910994086754e+00 4.4243586595536993e-01 -2.3098980140974752e+00 -5.9608123357109823e+00 -2.0621745006390885e-01 -2.4219731871078847e+00 -3.5719569102159929e+00 -1.7561092796259273e-01 2.0129358744175079e+00 3.2329941137323406e+00 3.2834331898822994e-01 2.4112390139899227e+00 3.5521595790154623e+00 2.4830271632993578e-01 -2.2359520582253536e+00 -3.2882758209136127e+00 -3.7709812371160045e-01 -2.2375984303952845e+00 -2.1939375997100146e+00 -3.8241403146909619e-01 2.1078210805308975e+00 1.8616378743941271e+00 1.2225863193366107e-01 1.1988914796075416e+00 4.4243586595537004e-01 5.5832483517738982e+00 -7.7066103585224066e-01 -2.0490072039564461e-01 -5.3368330383507061e+00 -8.4168003074534137e-01 -3.1304976753400848e-01 -2.7086598931320056e+00 1.0880557417761199e+00 3.3265364871156983e-01 2.8285179422949769e+00 6.6289577955199230e-01 2.4103559884084932e-01 2.7036124553800365e+00 -1.1463927343754132e+00 -3.1691247816539814e-01 -2.8829588981475847e+00 -1.0224836949888199e+00 -3.8129742128454247e-01 -1.5324481577001108e+00 8.3137449502616145e-01 2.0003527387180461e-01 1.3455212378814978e+00 -1.2896334690964240e+01 -2.3098980140974756e+00 -7.7066103585224044e-01 1.3272173446573900e+01 1.9111608475371611e+00 3.0556729170088298e-01 9.4668681278175413e+00 2.0539651065552946e+00 2.4155512397518650e-01 -9.6539325109365244e+00 -1.6364093651611864e+00 -8.7936256534604640e-01 -9.5820526042255043e+00 -2.2627719215981892e+00 -2.1791692006856656e-01 9.7305324992504048e+00 1.6849080685111595e+00 6.9783689477002886e-01 7.6534862619750177e+00 2.1074310557673019e+00 8.3171717141767176e-01 -7.9907405294905995e+00 -1.5483857775140661e+00 -2.0873596059691213e-01 -2.3157440373725917e+00 -5.9608123357109823e+00 -2.0490072039564458e-01 1.9111608475371606e+00 5.7777583259810310e+00 7.5109181526438445e-02 2.0681359649545232e+00 3.2558011425463351e+00 7.3817709251131680e-02 -1.6319172074140047e+00 -3.0485496733592483e+00 -2.0571266408951713e-01 -1.8916155150917888e+00 -3.2888853143870000e+00 -5.9309768706407660e-02 1.6891468784805272e+00 3.0884201913853335e+00 1.6712803615647709e-01 1.7298375973459539e+00 1.8971190823697788e+00 2.0201287677100491e-01 -1.5590045284397809e+00 -1.7208514188252482e+00 -4.8144650513481650e-02 -7.7694210370802663e-01 -2.0621745006390885e-01 -5.3368330383507052e+00 3.0556729170088304e-01 7.5109181526438459e-02 5.3303809680245173e+00 2.5231665671882902e-01 7.6587808320412454e-02 2.6749439849783059e+00 -5.0378231077188362e-01 -1.1717331059266622e-01 -2.7112902190251109e+00 -2.1827096639645843e-01 -7.1836112762135057e-02 -2.6932942351493288e+00 7.0486180236604290e-01 1.6796582649056027e-01 2.7202077362831747e+00 4.5598924643833505e-01 1.2594406761002344e-01 1.3796660697024852e+00 -2.1973961634772157e-01 -5.0380010528724456e-02 -1.3637812664633362e+00 -9.1356080654862204e+00 -2.4219731871078847e+00 -8.4168003074534137e-01 9.4668681278175395e+00 2.0681359649545232e+00 2.5231665671882908e-01 1.2631009183461540e+01 2.6530328995706585e+00 2.6986881242936950e-01 -1.2780086169109689e+01 -2.2750684309935849e+00 -7.1312795354719694e-01 -7.5133540351607593e+00 -2.2643863542061546e+00 -2.0537768418107366e-01 7.6579663828582785e+00 1.7291135653045695e+00 8.0845549555252660e-01 9.1074824059671222e+00 2.3484456504528932e+00 6.2669444334609192e-01 -9.4342778303478152e+00 -1.8373001079750193e+00 -1.9714973957320064e-01 -2.4176673736538499e+00 -3.5719569102159929e+00 -3.1304976753400837e-01 2.0539651065552946e+00 3.2558011425463356e+00 7.6587808320412468e-02 2.6530328995706580e+00 6.3331950117258184e+00 9.7036714450733710e-02 -2.2443922875293882e+00 -5.9903933853617257e+00 -2.4198668070700918e-01 -2.2848473182551556e+00 -2.1966410985371043e+00 -7.7111615582936180e-02 2.1021684345547236e+00 1.8978330310229448e+00 2.9414466309631193e-01 2.3576977650031927e+00 3.5708026227030500e+00 2.3060363067637515e-01 -2.2199572262454752e+00 -3.2986404138833261e+00 -6.6224752719877836e-02 -4.6749242516335204e-01 -1.7561092796259276e-01 -2.7086598931320056e+00 2.4155512397518650e-01 7.3817709251131694e-02 2.6749439849783059e+00 2.6986881242936939e-01 9.7036714450733738e-02 5.3748280681606371e+00 -7.5395557381771949e-01 -2.5737291362102865e-01 -5.3772184782477543e+00 -1.9481585635897514e-01 -7.2522937173169169e-02 -1.3626642467704189e+00 4.3624438116180247e-01 1.4386123322486827e-01 1.3779754830877489e+00 6.6826511405668620e-01 2.4417020226468411e-01 2.7370458349667155e+00 -1.9966957628299781e-01 -5.3379080434627212e-02 -2.7162507530432296e+00 9.2873118534842565e+00 2.0129358744175079e+00 1.0880557417761199e+00 -9.6539325109365244e+00 -1.6319172074140047e+00 -5.0378231077188362e-01 -1.2780086169109691e+01 -2.2443922875293887e+00 -7.5395557381771927e-01 1.3056252717260087e+01 1.8446405385026416e+00 1.2187035291052388e+00 7.6186259366432054e+00 2.0862326280147649e+00 4.4621511232814215e-01 -7.8262171163896666e+00 -1.5300306444198755e+00 -1.0739117398982756e+00 -9.2589170007331134e+00 -2.1774387371002852e+00 -1.1233284537062023e+00 9.5569622897814455e+00 1.6399698355286392e+00 7.0200369498457615e-01 2.0360606225964517e+00 3.2329941137323406e+00 3.3265364871156983e-01 -1.6364093651611864e+00 -3.0485496733592483e+00 -1.1717331059266625e-01 -2.2750684309935849e+00 -5.9903933853617257e+00 -2.5737291362102865e-01 1.8446405385026416e+00 5.8760176911810449e+00 2.9316247148734498e-01 1.7264037482280368e+00 1.8613801408432287e+00 1.4643486635665465e-01 -1.5276247520465556e+00 -1.7186308395758756e+00 -2.5448195091719705e-01 -1.8109977962061112e+00 -3.2952490036429998e+00 -3.1063430293943439e-01 1.6429954350803087e+00 3.0824309561832357e+00 1.6741149151475579e-01 1.0878637776639288e+00 3.2834331898822994e-01 2.8285179422949773e+00 -8.7936256534604640e-01 -2.0571266408951713e-01 -2.7112902190251109e+00 -7.1312795354719694e-01 -2.4198668070700921e-01 -5.3772184782477543e+00 1.2187035291052390e+00 2.9316247148734498e-01 5.6247183433969594e+00 8.0548409145401911e-01 2.9028687478287535e-01 1.3472905984585180e+00 -1.0661241413521139e+00 -2.5301881004213667e-01 -1.5342219493824307e+00 -1.1030879545612369e+00 -3.6535844292801362e-01 -2.9001292844952014e+00 6.4965121658340796e-01 1.5428393250822642e-01 2.7223330470000437e+00 9.2329203035425316e+00 2.4112390139899227e+00 6.6289577955199230e-01 -9.5820526042255043e+00 -1.8916155150917888e+00 -2.1827096639645840e-01 -7.5133540351607602e+00 -2.2848473182551556e+00 -1.9481585635897511e-01 7.6186259366432054e+00 1.7264037482280370e+00 8.0548409145401911e-01 1.2967730482548859e+01 2.7040083033044118e+00 2.9368094920812082e-01 -1.3037021127017040e+01 -2.3156750308957057e+00 -7.5272810565653503e-01 -9.1896899894457231e+00 -2.4159128320279293e+00 -8.3917367335702986e-01 9.5028410331144340e+00 2.0663996307482080e+00 2.4292778155486205e-01 2.4038040173945325e+00 3.5521595790154614e+00 2.4103559884084930e-01 -2.2627719215981887e+00 -3.2888853143870000e+00 -7.1836112762135057e-02 -2.2643863542061542e+00 -2.1966410985371043e+00 -7.2522937173169169e-02 2.0862326280147649e+00 1.8613801408432287e+00 2.9028687478287535e-01 2.7040083033044109e+00 6.4881516212981598e+00 1.0469822752736604e-01 -2.2897272959344210e+00 -6.0830906058564391e+00 -2.5303192893931781e-01 -2.3993808582105718e+00 -3.6265022451965199e+00 -3.1048577020219320e-01 2.0222214812356274e+00 3.2934279228202139e+00 7.1856047925723060e-02 6.7826503478525957e-01 2.4830271632993578e-01 2.7036124553800360e+00 -2.1791692006856656e-01 -5.9309768706407674e-02 -2.6932942351493288e+00 -2.0537768418107366e-01 -7.7111615582936194e-02 -1.3626642467704189e+00 4.4621511232814215e-01 1.4643486635665465e-01 1.3472905984585180e+00 2.9368094920812071e-01 1.0469822752736607e-01 5.5199160891355650e+00 -7.6877517881269641e-01 -2.6045565652338010e-01 -5.4632492753583106e+00 -4.7977244889097048e-01 -1.7914459428916457e-01 -2.7731164567156199e+00 2.5368113563178474e-01 7.6585824887932030e-02 2.7215050710195596e+00 -9.4054180690570295e+00 -2.2359520582253536e+00 -1.1463927343754134e+00 9.7305324992504048e+00 1.6891468784805275e+00 7.0486180236604279e-01 7.6579663828582794e+00 2.1021684345547236e+00 4.3624438116180247e-01 -7.8262171163896666e+00 -1.5276247520465558e+00 -1.0661241413521139e+00 -1.3037021127017038e+01 -2.2897272959344206e+00 -7.6877517881269641e-01 1.3229512526360766e+01 1.8807945276513969e+00 1.2482271245435146e+00 9.3603342996428758e+00 2.0040468237940479e+00 1.0867469478433449e+00 -9.7096893956485903e+00 -1.6228525582743649e+00 -4.9478820137447677e-01 -1.8570357589663755e+00 -3.2882758209136127e+00 -3.1691247816539819e-01 1.6849080685111595e+00 3.0884201913853344e+00 1.6796582649056027e-01 1.7291135653045693e+00 1.8978330310229448e+00 1.4386123322486827e-01 -1.5300306444198752e+00 -1.7186308395758756e+00 -2.5301881004213667e-01 -2.3156750308957061e+00 -6.0830906058564391e+00 -2.6045565652338010e-01 1.8807945276513971e+00 5.9018719351807274e+00 3.0009954137106115e-01 2.0386181947961841e+00 3.3117940381359334e+00 3.3272689359899532e-01 -1.6306929219813542e+00 -3.1099219293790132e+00 -1.1426654995456909e-01 -1.1376293949170726e+00 -3.7709812371160045e-01 -2.8829588981475842e+00 6.9783689477002886e-01 1.6712803615647706e-01 2.7202077362831747e+00 8.0845549555252649e-01 2.9414466309631193e-01 1.3779754830877484e+00 -1.0739117398982756e+00 -2.5448195091719700e-01 -1.5342219493824307e+00 -7.5272810565653514e-01 -2.5303192893931781e-01 -5.4632492753583106e+00 1.2482271245435146e+00 3.0009954137106115e-01 5.6477457233994075e+00 1.0892879815433032e+00 3.2818235272183716e-01 2.9086343339656353e+00 -8.7953825593749035e-01 -2.0494258977757193e-01 -2.7741331538476395e+00 -7.3551815767033766e+00 -2.2375984303952845e+00 -1.0224836949888199e+00 7.6534862619750177e+00 1.7298375973459539e+00 4.5598924643833505e-01 9.1074824059671240e+00 2.3576977650031932e+00 6.6826511405668609e-01 -9.2589170007331134e+00 -1.8109977962061112e+00 -1.1030879545612371e+00 -9.1896899894457231e+00 -2.3993808582105718e+00 -4.7977244889097054e-01 9.3603342996428758e+00 2.0386181947961841e+00 1.0892879815433032e+00 1.2597604960680252e+01 2.6081633483712290e+00 1.1696382411623814e+00 -1.2915119361383059e+01 -2.2863398207045931e+00 -7.7783648475967426e-01 -2.2422607878379468e+00 -2.1939375997100141e+00 -3.8129742128454247e-01 2.1074310557673019e+00 1.8971190823697786e+00 1.2594406761002344e-01 2.3484456504528932e+00 3.5708026227030500e+00 2.4417020226468406e-01 -2.1774387371002852e+00 -3.2952490036429989e+00 -3.6535844292801367e-01 -2.4159128320279293e+00 -3.6265022451965199e+00 -1.7914459428916457e-01 2.0040468237940479e+00 3.3117940381359330e+00 3.2818235272183705e-01 2.6081633483712290e+00 6.4495892387576230e+00 4.3113937672145825e-01 -2.2324745214193116e+00 -6.1136161334168513e+00 -2.0363554081628057e-01 -1.0276096819790064e+00 -3.8241403146909625e-01 -1.5324481577001108e+00 8.3171717141767165e-01 2.0201287677100493e-01 1.3796660697024852e+00 6.2669444334609170e-01 2.3060363067637515e-01 2.7370458349667155e+00 -1.1233284537062020e+00 -3.1063430293943439e-01 -2.9001292844952014e+00 -8.3917367335702997e-01 -3.1048577020219320e-01 -2.7731164567156199e+00 1.0867469478433449e+00 3.3272689359899532e-01 2.9086343339656349e+00 1.1696382411623811e+00 4.3113937672145819e-01 5.6851207901521219e+00 -7.2468499472725134e-01 -1.9294867315710973e-01 -5.5047731298760239e+00 7.6144575938802053e+00 2.1078210805308975e+00 8.3137449502616134e-01 -7.9907405294905995e+00 -1.5590045284397811e+00 -2.1973961634772157e-01 -9.4342778303478152e+00 -2.2199572262454748e+00 -1.9966957628299781e-01 9.5569622897814455e+00 1.6429954350803084e+00 6.4965121658340796e-01 9.5028410331144340e+00 2.0222214812356274e+00 2.5368113563178468e-01 -9.7096893956485886e+00 -1.6306929219813540e+00 -8.7953825593749035e-01 -1.2915119361383059e+01 -2.2324745214193111e+00 -7.2468499472725134e-01 1.3375566200093981e+01 1.8690912012390886e+00 2.8892559605410251e-01 1.7194175969521088e+00 1.8616378743941271e+00 2.0003527387180461e-01 -1.5483857775140661e+00 -1.7208514188252479e+00 -5.0380010528724456e-02 -1.8373001079750193e+00 -3.2986404138833265e+00 -5.3379080434627225e-02 1.6399698355286392e+00 3.0824309561832357e+00 1.5428393250822645e-01 2.0663996307482075e+00 3.2934279228202135e+00 7.6585824887932058e-02 -1.6228525582743649e+00 -3.1099219293790132e+00 -2.0494258977757193e-01 -2.2863398207045931e+00 -6.1136161334168513e+00 -1.9294867315710978e-01 1.8690912012390881e+00 6.0055331421068621e+00 7.0745322630069232e-02 4.4465331371072309e-01 1.2225863193366107e-01 1.3455212378814978e+00 -2.0873596059691216e-01 -4.8144650513481657e-02 -1.3637812664633362e+00 -1.9714973957320064e-01 -6.6224752719877836e-02 -2.7162507530432296e+00 7.0200369498457615e-01 1.6741149151475579e-01 2.7223330470000437e+00 2.4292778155486203e-01 7.1856047925723088e-02 2.7215050710195596e+00 -4.9478820137447677e-01 -1.1426654995456910e-01 -2.7741331538476395e+00 -7.7783648475967404e-01 -2.0363554081628057e-01 -5.5047731298760239e+00 2.8892559605410251e-01 7.0745322630069274e-02 5.5695789473291288e+00 348 349 350 396 397 398 408 409 410 360 361 362 351 352 353 399 400 401 411 412 413 363 364 365 1.2029483954662833e+01 2.5410615742419473e+00 1.1586082233486119e+00 -1.2273377234742904e+01 -2.1926420239370663e+00 -7.3997895780152689e-01 -8.6045024343735133e+00 -2.2934396562838142e+00 -4.2521322627828501e-01 8.7572459296674516e+00 1.9188339752173034e+00 1.0535082205097290e+00 8.6472955613370424e+00 2.2808794151085356e+00 6.3761341457928444e-01 -8.8237715010668616e+00 -1.7237559808030050e+00 -1.0959667461949989e+00 -6.8584281688132673e+00 -2.1254302819907682e+00 -9.9115940623044374e-01 7.1260538933292148e+00 1.5944929784468673e+00 4.0258847806763104e-01 2.5410615742419465e+00 6.1499551990904449e+00 4.3334092180306893e-01 -2.1696653803726367e+00 -5.7336567687615370e+00 -1.9179815859546245e-01 -2.3004475668170068e+00 -3.4226319017627156e+00 -1.6201595357074450e-01 1.8803341209329658e+00 3.0774404477826551e+00 3.1679653927915613e-01 2.2820343507415348e+00 3.3648041708830028e+00 2.3663852525407167e-01 -2.1054875152803247e+00 -3.0934554450329061e+00 -3.6545411800159944e-01 -2.1151232089618901e+00 -2.0755152973876028e+00 -3.7415665834935585e-01 1.9872936255154103e+00 1.7330595951886565e+00 1.0664890218086626e-01 1.1586082233486121e+00 4.3334092180306893e-01 5.4009388761374586e+00 -7.2196996970016225e-01 -1.8864721672430873e-01 -5.1449203003512389e+00 -7.9989064191657433e-01 -3.0166146019445755e-01 -2.5865065067157578e+00 1.0503525557761133e+00 3.2269900575620364e-01 2.7130142659520016e+00 6.1650658344830866e-01 2.2773710713910231e-01 2.5429084770243127e+00 -1.1113437320131803e+00 -3.0463516429483067e-01 -2.7303933782651679e+00 -9.8578305683054235e-01 -3.7392744729486299e-01 -1.4456403909792106e+00 7.9352003788742520e-01 1.8509425381008501e-01 1.2505989571976031e+00 -1.2273377234742904e+01 -2.1696653803726367e+00 -7.2196996970016247e-01 1.2668078128742142e+01 1.7760853008606685e+00 2.5558707994095864e-01 8.9446927355561101e+00 1.9242065635642127e+00 1.9417484880649111e-01 -9.1361431648313225e+00 -1.5101765031359480e+00 -8.4196589451642145e-01 -9.0089626409430910e+00 -2.1405221214490373e+00 -1.7283792201598452e-01 9.1593040415573146e+00 1.5487977585091173e+00 6.5387805904894691e-01 7.1620612381459052e+00 1.9927482157537628e+00 7.9712194852748719e-01 -7.5156531034841558e+00 -1.4214738337301382e+00 -1.6398815009131762e-01 -2.1926420239370668e+00 -5.7336567687615370e+00 -1.8864721672430879e-01 1.7760853008606683e+00 5.5610445142832523e+00 6.2262138700521968e-02 1.9529281881234901e+00 3.1013268637243812e+00 5.9945622210643458e-02 -1.5032130498487020e+00 -2.8986460644067984e+00 -1.9251586853616459e-01 -1.7646561572235628e+00 -3.1005411241380552e+00 -4.6822438530059338e-02 1.5580989406561483e+00 2.8983908558860838e+00 1.5381173256086283e-01 1.6093759331321975e+00 1.7720860102816303e+00 1.8869909571162796e-01 -1.4359771317631727e+00 -1.6000042868689592e+00 -3.6733065393124001e-02 -7.3997895780152689e-01 -1.9179815859546243e-01 -5.1449203003512389e+00 2.5558707994095858e-01 6.2262138700521968e-02 5.1507966486096741e+00 2.0656670277086131e-01 6.2623565300238229e-02 2.5575655239113484e+00 -4.6319949794847015e-01 -1.0563336669873828e-01 -2.5927075538498472e+00 -1.6754916915509305e-01 -5.5751660426020810e-02 -2.5413937343476323e+00 6.6608875118963939e-01 1.5538082127078384e-01 2.5626871990200497e+00 4.1583808368530717e-01 1.1139034153328395e-01 1.2854439475354895e+00 -1.7335299268167634e-01 -3.8473681084606394e-02 -1.2774717305278416e+00 -8.6045024343735150e+00 -2.3004475668170068e+00 -7.9989064191657433e-01 8.9446927355561101e+00 1.9529281881234901e+00 2.0656670277086137e-01 1.1906104413934912e+01 2.5183948291322116e+00 2.1850974111418933e-01 -1.2050752439460233e+01 -2.1445553302714160e+00 -6.6769541527289589e-01 -7.0253092332159985e+00 -2.1509887526817950e+00 -1.6289431327193746e-01 7.1700313593592497e+00 1.6039869871093622e+00 7.6940113041311931e-01 8.4795701499982652e+00 2.2253453911867549e+00 5.8781063569004255e-01 -8.8198345517987953e+00 -1.7046637457816012e+00 -1.5180783952680663e-01 -2.2934396562838142e+00 -3.4226319017627156e+00 -3.0166146019445750e-01 1.9242065635642125e+00 3.1013268637243812e+00 6.2623565300238243e-02 2.5183948291322116e+00 6.0251664311952879e+00 7.9098641952062745e-02 -2.1009825816639602e+00 -5.6710533833740273e+00 -2.3003367302457786e-01 -2.1642486777366137e+00 -2.0799991087911218e+00 -6.2231696360141205e-02 1.9808960407718164e+00 1.7694746268845216e+00 2.8499868511867454e-01 2.2278700979666053e+00 3.3422810757901029e+00 2.1882313435582024e-01 -2.0926966157504565e+00 -3.0645646036664300e+00 -5.1617197147619837e-02 -4.2521322627828506e-01 -1.6201595357074453e-01 -2.5865065067157578e+00 1.9417484880649111e-01 5.9945622210643458e-02 2.5575655239113484e+00 2.1850974111418939e-01 7.9098641952062745e-02 5.1016007229381310e+00 -7.0911018765836797e-01 -2.4689159005317288e-01 -5.0943071111547598e+00 -1.4763272348491496e-01 -5.6155382294844118e-02 -1.2749908253519400e+00 3.9298229931208600e-01 1.3328356581258816e-01 1.2833092566585256e+00 6.2396124871170455e-01 2.3126106340569635e-01 2.5353802384686071e+00 -1.4767200052290311e-01 -3.8525967462229180e-02 -2.5220512987541541e+00 8.7572459296674534e+00 1.8803341209329658e+00 1.0503525557761133e+00 -9.1361431648313243e+00 -1.5032130498487017e+00 -4.6319949794847021e-01 -1.2050752439460235e+01 -2.1009825816639602e+00 -7.0911018765836809e-01 1.2334437249729955e+01 1.7036513144321619e+00 1.1815825228284123e+00 7.1278127896544055e+00 1.9702121622080697e+00 4.0389763822243202e-01 -7.3414449491951643e+00 -1.4003914594100597e+00 -1.0369486127021164e+00 -8.6313123392110498e+00 -2.0532252756041101e+00 -1.0843150419044667e+00 8.9401569236459597e+00 1.5036147689536343e+00 6.5774062338646522e-01 1.9188339752173034e+00 3.0774404477826560e+00 3.2269900575620364e-01 -1.5101765031359478e+00 -2.8986460644067980e+00 -1.0563336669873827e-01 -2.1445553302714155e+00 -5.6710533833740273e+00 -2.4689159005317288e-01 1.7036513144321619e+00 5.5655446601855036e+00 2.7881278331896603e-01 1.6054384819951397e+00 1.7359198195285404e+00 1.3642538455666453e-01 -1.4045078242083013e+00 -1.5962433111899141e+00 -2.4090808248547810e-01 -1.6808030036973631e+00 -3.0618191578418963e+00 -2.9797616370057300e-01 1.5121188896684232e+00 2.8488569893159355e+00 1.5347202930612849e-01 1.0535082205097290e+00 3.1679653927915608e-01 2.7130142659520016e+00 -8.4196589451642134e-01 -1.9251586853616454e-01 -2.5927075538498472e+00 -6.6769541527289578e-01 -2.3003367302457792e-01 -5.0943071111547598e+00 1.1815825228284120e+00 2.7881278331896597e-01 5.3558998176997212e+00 7.6829680733134964e-01 2.8252408160529024e-01 1.2527297165992377e+00 -1.0349904215443326e+00 -2.3975753611453532e-01 -1.4489177947278555e+00 -1.0688445292718172e+00 -3.5705200172830892e-01 -2.7065119212334396e+00 6.1010870993597566e-01 1.4122567520017432e-01 2.5208005807149423e+00 8.6472955613370441e+00 2.2820343507415344e+00 6.1650658344830866e-01 -9.0089626409430927e+00 -1.7646561572235628e+00 -1.6754916915509305e-01 -7.0253092332159985e+00 -2.1642486777366137e+00 -1.4763272348491496e-01 7.1278127896544055e+00 1.6054384819951397e+00 7.6829680733134964e-01 1.2041096895591766e+01 2.5575604079997145e+00 2.3869213952972543e-01 -1.2106958004423381e+01 -2.1570686965222614e+00 -7.0156919788809358e-01 -8.5083304379012823e+00 -2.2864604194255724e+00 -7.9973735700330240e-01 8.8333550699005396e+00 1.9274007101716204e+00 1.9299291722202222e-01 2.2808794151085365e+00 3.3648041708830028e+00 2.2773710713910225e-01 -2.1405221214490373e+00 -3.1005411241380552e+00 -5.5751660426020803e-02 -2.1509887526817950e+00 -2.0799991087911218e+00 -5.6155382294844118e-02 1.9702121622080697e+00 1.7359198195285404e+00 2.8252408160529019e-01 2.5575604079997145e+00 6.0330113678082853e+00 8.5980816987387687e-02 -2.1434766194827728e+00 -5.6117978176061527e+00 -2.4097188846512982e-01 -2.2709968957343261e+00 -3.3623124821754260e+00 -3.0057916367908444e-01 1.8973324040316113e+00 3.0209151744909271e+00 5.7216089133299564e-02 6.3761341457928467e-01 2.3663852525407167e-01 2.5429084770243127e+00 -1.7283792201598452e-01 -4.6822438530059338e-02 -2.5413937343476323e+00 -1.6289431327193746e-01 -6.2231696360141212e-02 -1.2749908253519400e+00 4.0389763822243202e-01 1.3642538455666453e-01 1.2527297165992377e+00 2.3869213952972540e-01 8.5980816987387687e-02 5.1001521168234341e+00 -7.1721162235345448e-01 -2.4705713740942298e-01 -5.0329647524560350e+00 -4.3273775626286093e-01 -1.6453101633359443e-01 -2.5357409616242119e+00 2.0547842157279547e-01 6.1597561835094058e-02 2.4892999633328339e+00 -8.8237715010668634e+00 -2.1054875152803243e+00 -1.1113437320131800e+00 9.1593040415573164e+00 1.5580989406561485e+00 6.6608875118963939e-01 7.1700313593592497e+00 1.9808960407718164e+00 3.9298229931208600e-01 -7.3414449491951643e+00 -1.4045078242083013e+00 -1.0349904215443326e+00 -1.2106958004423381e+01 -2.1434766194827732e+00 -7.1721162235345437e-01 1.2307732789161440e+01 1.7201666316754700e+00 1.2025032129080953e+00 8.6797014876495329e+00 1.8777922243530849e+00 1.0485425009781895e+00 -9.0445952230421316e+00 -1.4834818784851198e+00 -4.4657098847704468e-01 -1.7237559808030050e+00 -3.0934554450329061e+00 -3.0463516429483067e-01 1.5487977585091173e+00 2.8983908558860838e+00 1.5538082127078387e-01 1.6039869871093619e+00 1.7694746268845218e+00 1.3328356581258816e-01 -1.4003914594100597e+00 -1.5962433111899139e+00 -2.3975753611453532e-01 -2.1570686965222614e+00 -5.6117978176061527e+00 -2.4705713740942303e-01 1.7201666316754700e+00 5.4370429547976427e+00 2.8257320480792725e-01 1.8975157794318678e+00 3.0364701767804179e+00 3.2018804773914200e-01 -1.4892510199904907e+00 -2.8398820405196945e+00 -9.9975801811652693e-02 -1.0959667461949991e+00 -3.6545411800159949e-01 -2.7303933782651684e+00 6.5387805904894680e-01 1.5381173256086281e-01 2.5626871990200497e+00 7.6940113041311919e-01 2.8499868511867454e-01 1.2833092566585256e+00 -1.0369486127021164e+00 -2.4090808248547810e-01 -1.4489177947278555e+00 -7.0156919788809380e-01 -2.4097188846512976e-01 -5.0329647524560350e+00 1.2025032129080953e+00 2.8257320480792725e-01 5.2291723572937165e+00 1.0478187073457566e+00 3.1683910596541470e-01 2.6759048376601107e+00 -8.3911655293070864e-01 -1.9088863950067197e-01 -2.5387977251833442e+00 -6.8584281688132673e+00 -2.1151232089618897e+00 -9.8578305683054235e-01 7.1620612381459052e+00 1.6093759331321975e+00 4.1583808368530711e-01 8.4795701499982652e+00 2.2278700979666053e+00 6.2396124871170444e-01 -8.6313123392110498e+00 -1.6808030036973631e+00 -1.0688445292718172e+00 -8.5083304379012823e+00 -2.2709968957343261e+00 -4.3273775626286093e-01 8.6797014876495346e+00 1.8975157794318678e+00 1.0478187073457568e+00 1.1570594221860576e+01 2.4547984263220872e+00 1.1220722721968661e+00 -1.1893856151728682e+01 -2.1226371284591781e+00 -7.2232496957441572e-01 -2.1254302819907678e+00 -2.0755152973876028e+00 -3.7392744729486294e-01 1.9927482157537626e+00 1.7720860102816303e+00 1.1139034153328395e-01 2.2253453911867558e+00 3.3422810757901029e+00 2.3126106340569633e-01 -2.0532252756041101e+00 -3.0618191578418963e+00 -3.5705200172830887e-01 -2.2864604194255720e+00 -3.3623124821754260e+00 -1.6453101633359440e-01 1.8777922243530849e+00 3.0364701767804179e+00 3.1683910596541470e-01 2.4547984263220868e+00 5.9120043179603750e+00 4.2077331556710373e-01 -2.0855682805952389e+00 -5.5631946434076003e+00 -1.8475336111473312e-01 -9.9115940623044385e-01 -3.7415665834935585e-01 -1.4456403909792106e+00 7.9712194852748719e-01 1.8869909571162793e-01 1.2854439475354891e+00 5.8781063569004244e-01 2.1882313435582024e-01 2.5353802384686071e+00 -1.0843150419044667e+00 -2.9797616370057300e-01 -2.7065119212334396e+00 -7.9973735700330240e-01 -3.0057916367908449e-01 -2.5357409616242119e+00 1.0485425009781899e+00 3.2018804773914200e-01 2.6759048376601107e+00 1.1220722721968661e+00 4.2077331556710373e-01 5.1872963035349677e+00 -6.8033555225437281e-01 -1.7577160764468075e-01 -4.9961320533623130e+00 7.1260538933292148e+00 1.9872936255154103e+00 7.9352003788742520e-01 -7.5156531034841558e+00 -1.4359771317631729e+00 -1.7335299268167634e-01 -8.8198345517987953e+00 -2.0926966157504570e+00 -1.4767200052290308e-01 8.9401569236459562e+00 1.5121188896684232e+00 6.1010870993597577e-01 8.8333550699005379e+00 1.8973324040316113e+00 2.0547842157279550e-01 -9.0445952230421298e+00 -1.4892510199904905e+00 -8.3911655293070875e-01 -1.1893856151728681e+01 -2.0855682805952394e+00 -6.8033555225437281e-01 1.2374373143178051e+01 1.7067481288839148e+00 2.3136992899346631e-01 1.5944929784468671e+00 1.7330595951886565e+00 1.8509425381008504e-01 -1.4214738337301382e+00 -1.6000042868689592e+00 -3.8473681084606401e-02 -1.7046637457816010e+00 -3.0645646036664300e+00 -3.8525967462229180e-02 1.5036147689536343e+00 2.8488569893159355e+00 1.4122567520017426e-01 1.9274007101716202e+00 3.0209151744909262e+00 6.1597561835094072e-02 -1.4834818784851196e+00 -2.8398820405196941e+00 -1.9088863950067192e-01 -2.1226371284591776e+00 -5.5631946434076003e+00 -1.7577160764468075e-01 1.7067481288839148e+00 5.4648138154671653e+00 5.5742404846835333e-02 4.0258847806763098e-01 1.0664890218086626e-01 1.2505989571976033e+00 -1.6398815009131762e-01 -3.6733065393124001e-02 -1.2774717305278416e+00 -1.5180783952680665e-01 -5.1617197147619837e-02 -2.5220512987541541e+00 6.5774062338646533e-01 1.5347202930612852e-01 2.5208005807149423e+00 1.9299291722202222e-01 5.7216089133299577e-02 2.4892999633328339e+00 -4.4657098847704468e-01 -9.9975801811652679e-02 -2.5387977251833442e+00 -7.2232496957441583e-01 -1.8475336111473314e-01 -4.9961320533623130e+00 2.3136992899346623e-01 5.5742404846835333e-02 5.0737533065822733e+00 294 295 296 360 361 362 372 373 374 309 310 311 297 298 299 363 364 365 375 376 377 312 313 314 1.0809270725870563e+01 3.4841205217112279e+00 1.0140051824415526e+00 -1.1149468774043044e+01 -3.2846501592184665e+00 -6.4603132383749462e-01 -7.5065445242710913e+00 -3.0917567771814571e+00 -3.4788623227669979e-01 7.7775207477156512e+00 2.8553687637515925e+00 9.3326960565618933e-01 7.6726316517134530e+00 3.1311954401643378e+00 5.4769810432872146e-01 -7.9524220033814599e+00 -2.7240031733052561e+00 -9.7719915797343371e-01 -5.9058214302337220e+00 -2.8727901928678676e+00 -8.6681900992228800e-01 6.2548336066296484e+00 2.5025155769458873e+00 3.4296283158345398e-01 3.4841205217112283e+00 7.2404603220092376e+00 6.2190718989843186e-01 -3.2836155000186005e+00 -6.7419434413510002e+00 -3.1304032352638567e-01 -3.1021446824430168e+00 -4.4154402820403682e+00 -2.1604776201213208e-01 2.8333956004496268e+00 3.9791974069421232e+00 4.9762806308714308e-01 3.1385708282174845e+00 4.4379421730354078e+00 3.3277182176118297e-01 -3.0808011226578778e+00 -4.0827106358751335e+00 -5.5524208360647820e-01 -2.8646221671911345e+00 -3.0476555726605383e+00 -5.3476612636184118e-01 2.8750965219322921e+00 2.6301500299402720e+00 1.6678922076008021e-01 1.0140051824415524e+00 6.2190718989843186e-01 5.2913495161454493e+00 -6.4268457588212735e-01 -3.1135467371710418e-01 -5.0531786361499593e+00 -6.8885169784198708e-01 -4.2349590249817276e-01 -2.5270874650085204e+00 9.2770144441145941e-01 4.9904843034630225e-01 2.6521047829890216e+00 5.3604232172439104e-01 3.2360702089227417e-01 2.5491477120991815e+00 -9.9333426025062055e-01 -5.0011876024172119e-01 -2.7295390594614393e+00 -8.5658667542019340e-01 -5.2995648711048038e-01 -1.4316262969422693e+00 7.0370826081752580e-01 3.2036318243047035e-01 1.2488294463285368e+00 -1.1149468774043042e+01 -3.2836155000186009e+00 -6.4268457588212735e-01 1.1645081586178797e+01 3.0309848073487151e+00 2.1099922864620355e-01 7.9344176166855025e+00 2.8935908088957820e+00 1.4578053127359078e-01 -8.2501035055108964e+00 -2.6079326480681031e+00 -7.5390276506195708e-01 -8.1132137917060021e+00 -3.1277467370687555e+00 -1.3208011857532706e-01 8.3782996524532845e+00 2.6772588803537212e+00 5.8709302012075359e-01 6.2852210856532293e+00 2.8757696206644230e+00 7.0855714782960910e-01 -6.7302338697108697e+00 -2.4583092321071800e+00 -1.2376246835074711e-01 -3.2846501592184669e+00 -6.7419434413510002e+00 -3.1135467371710424e-01 3.0309848073487147e+00 6.4457762784441393e+00 9.8912896351051299e-02 2.9072731338475566e+00 4.0134555596103008e+00 7.9022433931120628e-02 -2.5975515866774090e+00 -3.6828086522271923e+00 -3.4094696289852422e-01 -2.7805712207139130e+00 -4.0910015317459720e+00 -6.5904460398303874e-02 2.6831744580682395e+00 3.7761105220258537e+00 2.6957938269021492e-01 2.5159174381151272e+00 2.6690971741435305e+00 3.2583033803706013e-01 -2.4745768707698508e+00 -2.3886859088996566e+00 -5.5138953995515279e-02 -6.4603132383749451e-01 -3.1304032352638561e-01 -5.0531786361499593e+00 2.1099922864620357e-01 9.8912896351051258e-02 5.0593953222789843e+00 1.6303550155024690e-01 8.7868885433390165e-02 2.5077827478202472e+00 -4.0410918727017353e-01 -1.8246103855796209e-01 -2.5368953696728140e+00 -1.3444846333381186e-01 -7.5597385860529762e-02 -2.5512953328224097e+00 5.9191347531778726e-01 2.7044548829372428e-01 2.5684659969352679e+00 3.6060357813915145e-01 1.7684819152055889e-01 1.2824853798804514e+00 -1.4196280921190918e-01 -6.2976713653847077e-02 -1.2767601082697690e+00 -7.5065445242710904e+00 -3.1021446824430172e+00 -6.8885169784198708e-01 7.9344176166855025e+00 2.9072731338475566e+00 1.6303550155024690e-01 1.0572166987367666e+01 3.3947532508756955e+00 1.5812184981942148e-01 -1.0830351771527884e+01 -3.1627428907777015e+00 -5.6432575686312592e-01 -6.0468981575976022e+00 -2.9093971099420606e+00 -1.2077465299405250e-01 6.2926455785047120e+00 2.5194696753149848e+00 6.6687550525754036e-01 7.4157261381216451e+00 2.9967545503069659e+00 4.9077557592604587e-01 -7.8311618672829511e+00 -2.6439659271824225e+00 -1.0485632485409029e-01 -3.0917567771814571e+00 -4.4154402820403691e+00 -4.2349590249817282e-01 2.8935908088957816e+00 4.0134555596103008e+00 8.7868885433390165e-02 3.3947532508756955e+00 7.0398686413914602e+00 9.4437389273115069e-02 -3.1299720417998058e+00 -6.5990825108066034e+00 -3.2911302211395793e-01 -2.9328526648024287e+00 -3.0574970292416443e+00 -7.5133183451604441e-02 2.8670647003794207e+00 2.6697369418275141e+00 4.0668353333571117e-01 3.0067105873526914e+00 4.3364365852477773e+00 2.9972935915284471e-01 -3.0075378637199002e+00 -3.9874779059884338e+00 -6.0977059131326658e-02 -3.4788623227669979e-01 -2.1604776201213208e-01 -2.5270874650085204e+00 1.4578053127359075e-01 7.9022433931120628e-02 2.5077827478202472e+00 1.5812184981942151e-01 9.4437389273115069e-02 4.9845638867322490e+00 -6.0333843274378574e-01 -3.5319727282317104e-01 -4.9754056584124058e+00 -1.0411987734634703e-01 -6.4376220254964145e-02 -1.2731249728422727e+00 3.2579132094412039e-01 1.8895327278001373e-01 1.2785619147735434e+00 5.3076904036944450e-01 3.2195566180624652e-01 2.5190085154892037e+00 -1.0511820003974476e-01 -5.0747502700228556e-02 -2.5142989685520440e+00 7.7775207477156512e+00 2.8333956004496268e+00 9.2770144441145941e-01 -8.2501035055108964e+00 -2.5975515866774090e+00 -4.0410918727017364e-01 -1.0830351771527884e+01 -3.1299720417998058e+00 -6.0333843274378585e-01 1.1228650613270922e+01 2.8614349457556965e+00 1.0520767432925615e+00 6.2607730692121972e+00 2.8493877891253065e+00 3.4244773467002365e-01 -6.5791910381723930e+00 -2.4250651678879560e+00 -9.3408171559576458e-01 -7.6729155847571473e+00 -2.9455409404143529e+00 -9.6072516466289026e-01 8.0656174697695526e+00 2.5539114014488931e+00 5.8002857789857099e-01 2.8553687637515925e+00 3.9791974069421232e+00 4.9904843034630220e-01 -2.6079326480681027e+00 -3.6828086522271923e+00 -1.8246103855796209e-01 -3.1627428907777024e+00 -6.5990825108066034e+00 -3.5319727282317104e-01 2.8614349457556965e+00 6.3687932890805925e+00 4.8516482276356920e-01 2.5162862634478662e+00 2.6297397625748786e+00 1.9719120967148179e-01 -2.4206315466190249e+00 -2.3802688986789526e+00 -4.2710946375500136e-01 -2.5994319535368047e+00 -3.9767496450554303e+00 -4.8363416119624503e-01 2.5576490660464790e+00 3.6611792481705860e+00 2.6499747355102699e-01 9.3326960565618911e-01 4.9762806308714308e-01 2.6521047829890212e+00 -7.5390276506195708e-01 -3.4094696289852416e-01 -2.5368953696728140e+00 -5.6432575686312614e-01 -3.2911302211395799e-01 -4.9754056584124058e+00 1.0520767432925613e+00 4.8516482276356909e-01 5.2243301360087617e+00 6.6990061948988511e-01 4.0449625539571016e-01 1.2512479968289560e+00 -9.3163909801071387e-01 -4.2675823639919158e-01 -1.4375692037933301e+00 -9.3473440308129052e-01 -5.3123088315904221e-01 -2.6861901471722001e+00 5.2935505457845178e-01 2.4075996332429359e-01 2.5083774632240097e+00 7.6726316517134538e+00 3.1385708282174840e+00 5.3604232172439092e-01 -8.1132137917060021e+00 -2.7805712207139130e+00 -1.3444846333381186e-01 -6.0468981575976022e+00 -2.9328526648024287e+00 -1.0411987734634703e-01 6.2607730692121972e+00 2.5162862634478658e+00 6.6990061948988500e-01 1.1078327455772619e+01 3.5325129705095026e+00 1.9056326767347398e-01 -1.1268790234975658e+01 -3.2817306712786576e+00 -6.1394173318872902e-01 -7.5461479258479578e+00 -3.0900363346427033e+00 -6.9123049871172160e-01 7.9633179334289510e+00 2.8978208292628489e+00 1.4723436369286091e-01 3.1311954401643387e+00 4.4379421730354087e+00 3.2360702089227417e-01 -3.1277467370687555e+00 -4.0910015317459720e+00 -7.5597385860529789e-02 -2.9093971099420606e+00 -3.0574970292416443e+00 -6.4376220254964145e-02 2.8493877891253065e+00 2.6297397625748786e+00 4.0449625539571016e-01 3.5325129705095031e+00 7.3472229028496798e+00 1.1288567029628151e-01 -3.2618929480678722e+00 -6.8429973358890761e+00 -3.5465207815434546e-01 -3.0708106312381371e+00 -4.4519599198516557e+00 -4.2323018548282393e-01 2.8567512265176789e+00 4.0285509782683784e+00 7.6866923168398396e-02 5.4769810432872146e-01 3.3277182176118297e-01 2.5491477120991819e+00 -1.3208011857532709e-01 -6.5904460398303874e-02 -2.5512953328224097e+00 -1.2077465299405249e-01 -7.5133183451604468e-02 -1.2731249728422729e+00 3.4244773467002365e-01 1.9719120967148182e-01 1.2512479968289560e+00 1.9056326767347398e-01 1.1288567029628151e-01 5.2248053827460081e+00 -6.2705101945970609e-01 -3.6363146606573510e-01 -5.1631767221984015e+00 -3.6566715556991325e-01 -2.2542750855580818e-01 -2.5826248729428762e+00 1.6486383992677972e-01 8.7247916742505247e-02 2.5450208091318145e+00 -7.9524220033814608e+00 -3.0808011226578782e+00 -9.9333426025062066e-01 8.3782996524532827e+00 2.6831744580682395e+00 5.9191347531778715e-01 6.2926455785047120e+00 2.8670647003794207e+00 3.2579132094412039e-01 -6.5791910381723930e+00 -2.4206315466190249e+00 -9.3163909801071410e-01 -1.1268790234975659e+01 -3.2618929480678722e+00 -6.2705101945970587e-01 1.1592319171812507e+01 2.9757420489407624e+00 1.0915654629876901e+00 7.8285694506891090e+00 2.8212173668939755e+00 9.3031018439236335e-01 -8.2914305769301020e+00 -2.5838729569376229e+00 -3.8755606592092168e-01 -2.7240031733052561e+00 -4.0827106358751335e+00 -5.0011876024172119e-01 2.6772588803537212e+00 3.7761105220258537e+00 2.7044548829372428e-01 2.5194696753149848e+00 2.6697369418275136e+00 1.8895327278001373e-01 -2.4250651678879560e+00 -2.3802688986789526e+00 -4.2675823639919158e-01 -3.2817306712786580e+00 -6.8429973358890761e+00 -3.6363146606573510e-01 2.9757420489407616e+00 6.5424651249896417e+00 5.0364757519767123e-01 2.8535517615165369e+00 4.0449931118878375e+00 5.0087950922406288e-01 -2.5952233536541347e+00 -3.7273288302876852e+00 -1.7341738278882482e-01 -9.7719915797343360e-01 -5.5524208360647820e-01 -2.7295390594614393e+00 5.8709302012075359e-01 2.6957938269021492e-01 2.5684659969352679e+00 6.6687550525754025e-01 4.0668353333571122e-01 1.2785619147735434e+00 -9.3408171559576458e-01 -4.2710946375500136e-01 -1.4375692037933301e+00 -6.1394173318872913e-01 -3.5465207815434552e-01 -5.1631767221984015e+00 1.0915654629876901e+00 5.0364757519767112e-01 5.3506244543383978e+00 9.2813828870652715e-01 4.9442784926922106e-01 2.7204014675978732e+00 -7.4844967031458365e-01 -3.3733471497699280e-01 -2.5877688481919128e+00 -5.9058214302337220e+00 -2.8646221671911345e+00 -8.5658667542019340e-01 6.2852210856532293e+00 2.5159174381151272e+00 3.6060357813915145e-01 7.4157261381216451e+00 3.0067105873526918e+00 5.3076904036944450e-01 -7.6729155847571473e+00 -2.5994319535368047e+00 -9.3473440308129030e-01 -7.5461479258479587e+00 -3.0708106312381371e+00 -3.6566715556991319e-01 7.8285694506891090e+00 2.8535517615165369e+00 9.2813828870652715e-01 1.0522267222397373e+01 3.3280808850462629e+00 9.7367140651327178e-01 -1.0926898956022530e+01 -3.1693959200645412e+00 -6.3619407965699903e-01 -2.8727901928678676e+00 -3.0476555726605383e+00 -5.2995648711048049e-01 2.8757696206644234e+00 2.6690971741435305e+00 1.7684819152055892e-01 2.9967545503069664e+00 4.3364365852477773e+00 3.2195566180624652e-01 -2.9455409404143529e+00 -3.9767496450554307e+00 -5.3123088315904221e-01 -3.0900363346427033e+00 -4.4519599198516557e+00 -2.2542750855580812e-01 2.8212173668939755e+00 4.0449931118878375e+00 4.9442784926922106e-01 3.3280808850462624e+00 7.1163514893217057e+00 5.9747061660401746e-01 -3.1134549549867034e+00 -6.6905132230332258e+00 -3.0408744037471375e-01 -8.6681900992228800e-01 -5.3476612636184118e-01 -1.4316262969422695e+00 7.0855714782960910e-01 3.2583033803706007e-01 1.2824853798804514e+00 4.9077557592604593e-01 2.9972935915284477e-01 2.5190085154892032e+00 -9.6072516466289026e-01 -4.8363416119624497e-01 -2.6861901471722001e+00 -6.9123049871172160e-01 -4.2323018548282398e-01 -2.5826248729428762e+00 9.3031018439236324e-01 5.0087950922406310e-01 2.7204014675978732e+00 9.7367140651327166e-01 5.9747061660401746e-01 5.2559701430353396e+00 -5.8453964136439029e-01 -2.8227934997707504e-01 -5.0774241889455229e+00 6.2548336066296484e+00 2.8750965219322921e+00 7.0370826081752580e-01 -6.7302338697108697e+00 -2.4745768707698508e+00 -1.4196280921190918e-01 -7.8311618672829519e+00 -3.0075378637199006e+00 -1.0511820003974477e-01 8.0656174697695526e+00 2.5576490660464795e+00 5.2935505457845189e-01 7.9633179334289510e+00 2.8567512265176784e+00 1.6486383992677972e-01 -8.2914305769301020e+00 -2.5952233536541343e+00 -7.4844967031458365e-01 -1.0926898956022526e+01 -3.1134549549867034e+00 -5.8453964136439029e-01 1.1495956260118303e+01 2.9012962286341377e+00 1.8214316560787211e-01 2.5025155769458878e+00 2.6301500299402720e+00 3.2036318243047035e-01 -2.4583092321071800e+00 -2.3886859088996566e+00 -6.2976713653847077e-02 -2.6439659271824234e+00 -3.9874779059884338e+00 -5.0747502700228563e-02 2.5539114014488926e+00 3.6611792481705865e+00 2.4075996332429359e-01 2.8978208292628489e+00 4.0285509782683793e+00 8.7247916742505233e-02 -2.5838729569376229e+00 -3.7273288302876857e+00 -3.3733471497699286e-01 -3.1693959200645407e+00 -6.6905132230332249e+00 -2.8227934997707493e-01 2.9012962286341373e+00 6.4741256118297628e+00 8.4967218810874878e-02 3.4296283158345398e-01 1.6678922076008024e-01 1.2488294463285365e+00 -1.2376246835074711e-01 -5.5138953995515293e-02 -1.2767601082697690e+00 -1.0485632485409029e-01 -6.0977059131326651e-02 -2.5142989685520440e+00 5.8002857789857099e-01 2.6499747355102704e-01 2.5083774632240097e+00 1.4723436369286089e-01 7.6866923168398382e-02 2.5450208091318145e+00 -3.8755606592092173e-01 -1.7341738278882482e-01 -2.5877688481919128e+00 -6.3619407965699903e-01 -3.0408744037471375e-01 -5.0774241889455229e+00 1.8214316560787211e-01 8.4967218810874823e-02 5.1540243952748845e+00 360 361 362 408 409 410 420 421 422 372 373 374 363 364 365 411 412 413 423 424 425 375 376 377 1.0197249304781135e+01 3.2974477228150922e+00 9.8354795416514607e-01 -1.0532742547269288e+01 -3.1020842399911781e+00 -6.1024870793175034e-01 -7.1052669304976810e+00 -2.9343349200217097e+00 -3.1894290322559088e-01 7.3699037516724983e+00 2.6996513353216174e+00 9.0613620630287461e-01 7.1604467285074751e+00 2.9608352747436193e+00 5.1036098064310298e-01 -7.4395964419867671e+00 -2.5431236948410443e+00 -9.4679114034681822e-01 -5.5341161708322666e+00 -2.7207453183148429e+00 -8.3802197326915162e-01 5.8841223056248957e+00 2.3423538402884447e+00 3.1395958366218574e-01 3.2974477228150931e+00 6.8872260783517314e+00 6.0903068397099935e-01 -3.0923449512115639e+00 -6.3756472245329245e+00 -2.9076513535830706e-01 -2.9419584104948968e+00 -4.2365553236330920e+00 -1.9968156400340031e-01 2.6649269091192243e+00 3.7896211750011766e+00 4.8199525721786063e-01 2.9637650003854086e+00 4.1692634043430417e+00 3.1304899274531361e-01 -2.9056630166017978e+00 -3.8032441482080581e+00 -5.4025290104512669e-01 -2.7056046579447024e+00 -2.8970813190496933e+00 -5.2186598686189412e-01 2.7194314039332346e+00 2.4664173577278192e+00 1.4849065333455333e-01 9.8354795416514629e-01 6.0903068397099935e-01 5.0345890764869319e+00 -6.0959018614779859e-01 -2.9139764891996889e-01 -4.7824045754728299e+00 -6.6025611537485740e-01 -4.0995528709514856e-01 -2.4236604536662605e+00 9.0250825782124056e-01 4.8678569365756941e-01 2.5517232383312103e+00 5.0597425687109132e-01 3.0849807729725365e-01 2.3609677826977618e+00 -9.6865315196742241e-01 -4.8516037786564370e-01 -2.5492430951309997e+00 -8.3213107040314316e-01 -5.2106753398242112e-01 -1.3594473627476189e+00 6.7860005503574328e-01 3.0326639293735963e-01 1.1674753895018024e+00 -1.0532742547269290e+01 -3.0923449512115639e+00 -6.0959018614779836e-01 1.1036993399892031e+01 2.8397112605391506e+00 1.6704419739126361e-01 7.5332724288578996e+00 2.7276927932605077e+00 1.1172656146198630e-01 -7.8458170911419778e+00 -2.4400281622838671e+00 -7.2327409335828496e-01 -7.6047010458944282e+00 -2.9587959293478820e+00 -9.4151450901734102e-02 7.8673831065175621e+00 2.4939688839724461e+00 5.5847177776599788e-01 5.9114764200790111e+00 2.7232411599835844e+00 6.8090977881263270e-01 -6.3658646710408089e+00 -2.2934450549123744e+00 -9.1136585024061106e-02 -3.1020842399911781e+00 -6.3756472245329245e+00 -2.9139764891996889e-01 2.8397112605391506e+00 6.0836693760669514e+00 7.8060000936857471e-02 2.7533930053993769e+00 3.8246404070173439e+00 6.1008474506543689e-02 -2.4326012220280999e+00 -3.4921462830873917e+00 -3.2308517412207199e-01 -2.6047014102804962e+00 -3.8184089483738903e+00 -4.6739307213005968e-02 2.5038116427422938e+00 3.4967060928721994e+00 2.5378228783340767e-01 2.3581262024906562e+00 2.5093698265038609e+00 3.0816459556716652e-01 -2.3156552388717051e+00 -2.2281832464661488e+00 -3.9793228588927719e-02 -6.1024870793175023e-01 -2.9076513535830700e-01 -4.7824045754728299e+00 1.6704419739126364e-01 7.8060000936857471e-02 4.7973633214671878e+00 1.2561837430235692e-01 6.7692375819035200e-02 2.4055523916657418e+00 -3.7079710832669011e-01 -1.6529492423492481e-01 -2.4292370382208914e+00 -9.2161351116568160e-02 -5.2444807435866533e-02 -2.3699272013433936e+00 5.5511684360381119e-01 2.5037970577723717e-01 2.3795004037974126e+00 3.2859673179532578e-01 1.5709337483377292e-01 1.2007829562056547e+00 -1.0316897971774878e-01 -4.4720590337804358e-02 -1.2016302580988836e+00 -7.1052669304976810e+00 -2.9419584104948968e+00 -6.6025611537485740e-01 7.5332724288578987e+00 2.7533930053993769e+00 1.2561837430235692e-01 1.0135950735873596e+01 3.2359147513524600e+00 1.2368034826452239e-01 -1.0383516656809329e+01 -3.0076247787232315e+00 -5.2638702092163014e-01 -5.6812756338322883e+00 -2.7582899301913661e+00 -8.6675668208876247e-02 5.9229475553768873e+00 2.3590867374218276e+00 6.3998880865019947e-01 7.0002428739530327e+00 2.8432181806128494e+00 4.5748141942246928e-01 -7.4223543729221158e+00 -2.4837395553770198e+00 -7.3450146134182742e-02 -2.9343349200217101e+00 -4.2365553236330920e+00 -4.0995528709514856e-01 2.7276927932605077e+00 3.8246404070173430e+00 6.7692375819035214e-02 3.2359147513524604e+00 6.8268190767333987e+00 7.3866270037210052e-02 -2.9590621453889727e+00 -6.3696823802141784e+00 -3.1031696330700065e-01 -2.7788277533610342e+00 -2.9089258431939089e+00 -5.4782963311237165e-02 2.7103286929209656e+00 2.5058336066861169e+00 3.9517401383061251e-01 2.8481567714639326e+00 4.1433061108783491e+00 2.8157980151687706e-01 -2.8498681902261493e+00 -3.7854356542740315e+00 -4.3257247490347407e-02 -3.1894290322559088e-01 -1.9968156400340029e-01 -2.4236604536662605e+00 1.1172656146198630e-01 6.1008474506543696e-02 2.4055523916657413e+00 1.2368034826452248e-01 7.3866270037210024e-02 4.8508151230968375e+00 -5.7864679445802492e-01 -3.4305281041090940e-01 -4.8295023629860419e+00 -7.0782076149967163e-02 -4.4591634531826255e-02 -1.1998579426674931e+00 2.9519227141225607e-01 1.7509523115184708e-01 1.1974462578712857e+00 5.0575132318823013e-01 3.0941216527120641e-01 2.3983260627875236e+00 -6.7978730493411910e-02 -3.2056132020671230e-02 -2.3991190761015946e+00 7.3699037516724983e+00 2.6649269091192247e+00 9.0250825782124056e-01 -7.8458170911419751e+00 -2.4326012220280999e+00 -3.7079710832669011e-01 -1.0383516656809327e+01 -2.9590621453889723e+00 -5.7864679445802503e-01 1.0782866883070106e+01 2.6919808857840910e+00 1.0262967046113445e+00 5.8873125135566546e+00 2.6958703298958868e+00 3.0784488263951426e-01 -6.2075647795873241e+00 -2.2597273138655769e+00 -9.0968853543110129e-01 -7.2527971995305052e+00 -2.7880011833263438e+00 -9.3225084274847025e-01 7.6496125787698759e+00 2.3866137398097904e+00 5.5473343589218560e-01 2.6996513353216178e+00 3.7896211750011766e+00 4.8678569365756941e-01 -2.4400281622838675e+00 -3.4921462830873917e+00 -1.6529492423492481e-01 -3.0076247787232315e+00 -6.3696823802141784e+00 -3.4305281041090946e-01 2.6919808857840919e+00 6.1414516556243592e+00 4.6834232734999726e-01 2.3586054168568191e+00 2.4698947431376328e+00 1.8163469484381975e-01 -2.2581426646768095e+00 -2.2180749917012874e+00 -4.1115921302837277e-01 -2.4392702760797476e+00 -3.7758358341363745e+00 -4.6765822105658295e-01 2.3948282438011272e+00 3.4547719153760612e+00 2.5040245287940288e-01 9.0613620630287450e-01 4.8199525721786052e-01 2.5517232383312103e+00 -7.2327409335828496e-01 -3.2308517412207199e-01 -2.4292370382208914e+00 -5.2638702092163014e-01 -3.1031696330700065e-01 -4.8295023629860419e+00 1.0262967046113443e+00 4.6834232734999715e-01 5.0879292775133651e+00 6.3944847389798887e-01 3.9154013445066604e-01 1.1692761728729164e+00 -9.0678168280723548e-01 -4.1012468102302413e-01 -1.3636369092476053e+00 -9.0985348546922162e-01 -5.1980834054112679e-01 -2.5709865928194415e+00 4.9441489774416431e-01 2.2145743997469960e-01 2.3844342145564874e+00 7.1604467285074733e+00 2.9637650003854086e+00 5.0597425687109143e-01 -7.6047010458944282e+00 -2.6047014102804953e+00 -9.2161351116568188e-02 -5.6812756338322883e+00 -2.7788277533610346e+00 -7.0782076149967177e-02 5.8873125135566555e+00 2.3586054168568191e+00 6.3944847389798887e-01 1.0223084925330053e+01 3.3248910765150170e+00 1.4484871549652698e-01 -1.0404578433889657e+01 -3.0612684658344995e+00 -5.7850309146531542e-01 -7.0241231733371894e+00 -2.9233890558628204e+00 -6.6006079145711294e-01 7.4438341195593836e+00 2.7209251915816060e+00 1.1123586392335498e-01 2.9608352747436193e+00 4.1692634043430417e+00 3.0849807729725365e-01 -2.9587959293478820e+00 -3.8184089483738903e+00 -5.2444807435866547e-02 -2.7582899301913657e+00 -2.9089258431939089e+00 -4.4591634531826262e-02 2.6958703298958868e+00 2.4698947431376332e+00 3.9154013445066604e-01 3.3248910765150170e+00 6.7879873367511276e+00 8.6190296319513804e-02 -3.0561304294562346e+00 -6.2641828004974949e+00 -3.3949319458146843e-01 -2.8995129469049989e+00 -4.1745532441942572e+00 -4.0803681325765856e-01 2.6911325547459577e+00 3.7389253520277483e+00 5.8337941739385134e-02 5.1036098064310298e-01 3.1304899274531361e-01 2.3609677826977618e+00 -9.4151450901734102e-02 -4.6739307213005961e-02 -2.3699272013433936e+00 -8.6675668208876247e-02 -5.4782963311237179e-02 -1.1998579426674927e+00 3.0784488263951421e-01 1.8163469484381978e-01 1.1692761728729164e+00 1.4484871549652698e-01 8.6190296319513804e-02 4.7677722892972350e+00 -5.7932510213425548e-01 -3.4044578754184518e-01 -4.6933550206176733e+00 -3.2851985531694217e-01 -2.0521667362755913e-01 -2.3827555198770636e+00 1.2561749778266365e-01 6.6310747785000207e-02 2.3478794396377096e+00 -7.4395964419867662e+00 -2.9056630166017978e+00 -9.6865315196742241e-01 7.8673831065175621e+00 2.5038116427422938e+00 5.5511684360381108e-01 5.9229475553768856e+00 2.7103286929209660e+00 2.9519227141225607e-01 -6.2075647795873241e+00 -2.2581426646768095e+00 -9.0678168280723548e-01 -1.0404578433889659e+01 -3.0561304294562346e+00 -5.7932510213425548e-01 1.0730582555825031e+01 2.7541331159248701e+00 1.0573331083272883e+00 7.3016414984521365e+00 2.6530297169577097e+00 9.0017800186176922e-01 -7.7708150607078670e+00 -2.4013670578109982e+00 -3.5306028829620939e-01 -2.5431236948410443e+00 -3.8032441482080581e+00 -4.8516037786564370e-01 2.4939688839724456e+00 3.4967060928721994e+00 2.5037970577723717e-01 2.3590867374218276e+00 2.5058336066861169e+00 1.7509523115184708e-01 -2.2597273138655769e+00 -2.2180749917012874e+00 -4.1012468102302413e-01 -3.0612684658344995e+00 -6.2641828004974940e+00 -3.4044578754184524e-01 2.7541331159248701e+00 5.9639330084231910e+00 4.8154857677912316e-01 2.6734296664964132e+00 3.7518301843014301e+00 4.8414642025825549e-01 -2.4164989292744350e+00 -3.4328009518761000e+00 -1.5543908753594912e-01 -9.4679114034681811e-01 -5.4025290104512669e-01 -2.5492430951309992e+00 5.5847177776599799e-01 2.5378228783340762e-01 2.3795004037974126e+00 6.3998880865019947e-01 3.9517401383061251e-01 1.1974462578712857e+00 -9.0968853543110129e-01 -4.1115921302837277e-01 -1.3636369092476053e+00 -5.7850309146531553e-01 -3.3949319458146843e-01 -4.6933550206176733e+00 1.0573331083272883e+00 4.8154857677912316e-01 4.8910458416709925e+00 9.0022613377592109e-01 4.8074006007521952e-01 2.5231910846910979e+00 -7.2103706127617173e-01 -3.2033962986339498e-01 -2.3849485630345115e+00 -5.5341161708322666e+00 -2.7056046579447024e+00 -8.3213107040314316e-01 5.9114764200790111e+00 2.3581262024906562e+00 3.2859673179532572e-01 7.0002428739530318e+00 2.8481567714639326e+00 5.0575132318823013e-01 -7.2527971995305052e+00 -2.4392702760797476e+00 -9.0985348546922173e-01 -7.0241231733371894e+00 -2.8995129469049985e+00 -3.2851985531694217e-01 7.3016414984521365e+00 2.6734296664964132e+00 9.0022613377592098e-01 9.8473470422419762e+00 3.1437641910686471e+00 9.4022902340324932e-01 -1.0249671291026194e+01 -2.9790889505902007e+00 -6.0429880097341770e-01 -2.7207453183148429e+00 -2.8970813190496933e+00 -5.2106753398242112e-01 2.7232411599835844e+00 2.5093698265038609e+00 1.5709337483377292e-01 2.8432181806128489e+00 4.1433061108783500e+00 3.0941216527120641e-01 -2.7880011833263429e+00 -3.7758358341363749e+00 -5.1980834054112679e-01 -2.9233890558628204e+00 -4.1745532441942572e+00 -2.0521667362755913e-01 2.6530297169577097e+00 3.7518301843014301e+00 4.8074006007521952e-01 3.1437641910686480e+00 6.7073761258879925e+00 5.8350279437317953e-01 -2.9311176911187826e+00 -6.2644118501913102e+00 -2.8465584640227026e-01 -8.3802197326915184e-01 -5.2186598686189400e-01 -1.3594473627476189e+00 6.8090977881263270e-01 3.0816459556716652e-01 1.2007829562056547e+00 4.5748141942246923e-01 2.8157980151687706e-01 2.3983260627875236e+00 -9.3225084274847003e-01 -4.6765822105658295e-01 -2.5709865928194415e+00 -6.6006079145711294e-01 -4.0803681325765856e-01 -2.3827555198770636e+00 9.0017800186176911e-01 4.8414642025825555e-01 2.5231910846910979e+00 9.4022902340324932e-01 5.8350279437317931e-01 4.9380306797640721e+00 -5.4846461602538532e-01 -2.5983259053934277e-01 -4.7471413080042248e+00 5.8841223056248957e+00 2.7194314039332346e+00 6.7860005503574328e-01 -6.3658646710408089e+00 -2.3156552388717051e+00 -1.0316897971774880e-01 -7.4223543729221149e+00 -2.8498681902261493e+00 -6.7978730493411896e-02 7.6496125787698741e+00 2.3948282438011272e+00 4.9441489774416419e-01 7.4438341195593827e+00 2.6911325547459577e+00 1.2561749778266368e-01 -7.7708150607078670e+00 -2.4164989292744345e+00 -7.2103706127617173e-01 -1.0249671291026196e+01 -2.9311176911187831e+00 -5.4846461602538532e-01 1.0831136391742831e+01 2.7077478470107517e+00 1.4201693695014461e-01 2.3423538402884447e+00 2.4664173577278188e+00 3.0326639293735969e-01 -2.2934450549123744e+00 -2.2281832464661488e+00 -4.4720590337804358e-02 -2.4837395553770203e+00 -3.7854356542740315e+00 -3.2056132020671230e-02 2.3866137398097904e+00 3.4547719153760612e+00 2.2145743997469960e-01 2.7209251915816060e+00 3.7389253520277483e+00 6.6310747785000193e-02 -2.4013670578109974e+00 -3.4328009518761000e+00 -3.2033962986339498e-01 -2.9790889505902012e+00 -6.2644118501913102e+00 -2.5983259053934277e-01 2.7077478470107517e+00 6.0507170776759622e+00 6.5914362064153117e-02 3.1395958366218574e-01 1.4849065333455336e-01 1.1674753895018024e+00 -9.1136585024061106e-02 -3.9793228588927719e-02 -1.2016302580988836e+00 -7.3450146134182742e-02 -4.3257247490347379e-02 -2.3991190761015946e+00 5.5473343589218538e-01 2.5040245287940288e-01 2.3844342145564874e+00 1.1123586392335499e-01 5.8337941739385134e-02 2.3478794396377096e+00 -3.5306028829620939e-01 -1.5543908753594912e-01 -2.3849485630345115e+00 -6.0429880097341770e-01 -2.8465584640227026e-01 -4.7471413080042257e+00 1.4201693695014467e-01 6.5914362064153104e-02 4.8330501615432162e+00 267 268 269 339 340 341 351 352 353 282 283 284 270 271 272 342 343 344 354 355 356 285 286 287 1.2657852651303529e+01 1.1988914796074734e+00 2.6734257208875185e+00 -1.2896334690963871e+01 -7.7694210370801686e-01 -2.3157440373724936e+00 -9.4054180690566191e+00 -1.1376293949170009e+00 -1.8570357589662734e+00 9.2329203035421337e+00 6.7826503478525024e-01 2.4038040173943753e+00 9.2873118534838479e+00 1.0878637776638573e+00 2.0360606225963522e+00 -9.1356080654858207e+00 -4.6749242516334200e-01 -2.4176673736536931e+00 -7.3551815767029707e+00 -1.0276096819789329e+00 -2.2422607878377931e+00 7.6144575938797727e+00 4.4465331371071110e-01 1.7194175969520076e+00 1.1988914796074734e+00 5.5832483517739524e+00 4.4243586595534518e-01 -7.7066103585216428e-01 -5.3368330383507718e+00 -2.0490072039562685e-01 -1.1463927343753415e+00 -2.8829588981476042e+00 -3.1691247816538171e-01 6.6289577955191747e-01 2.7036124553800640e+00 2.4103559884082171e-01 1.0880557417760484e+00 2.8285179422949911e+00 3.3265364871155373e-01 -8.4168003074526943e-01 -2.7086598931320305e+00 -3.1304976753398173e-01 -1.0224836949887506e+00 -1.5324481577001123e+00 -3.8129742128451732e-01 8.3137449502608607e-01 1.3455212378815082e+00 2.0003527387178716e-01 2.6734257208875185e+00 4.4243586595534506e-01 6.3681910994086879e+00 -2.3098980140973109e+00 -2.0621745006390441e-01 -5.9608123357110143e+00 -2.2359520582251888e+00 -3.7709812371157364e-01 -3.2882758209136043e+00 2.4112390139897650e+00 2.4830271632993245e-01 3.5521595790154348e+00 2.0129358744173440e+00 3.2834331898820268e-01 3.2329941137323277e+00 -2.4219731871077288e+00 -1.7561092796258923e-01 -3.5719569102159614e+00 -2.2375984303951300e+00 -3.8241403146906933e-01 -2.1939375997099715e+00 2.1078210805307309e+00 1.2225863193365626e-01 1.8616378743941020e+00 -1.2896334690963871e+01 -7.7066103585216439e-01 -2.3098980140973109e+00 1.3272173446573513e+01 3.0556729170086733e-01 1.9111608475370532e+00 9.7305324992499749e+00 6.9783689476994903e-01 1.6849080685110507e+00 -9.5820526042250869e+00 -2.1791692006855184e-01 -2.2627719215980222e+00 -9.6539325109360963e+00 -8.7936256534596924e-01 -1.6364093651610783e+00 9.4668681278171221e+00 2.4155512397517354e-01 2.0539651065551263e+00 7.6534862619745914e+00 8.3171717141759260e-01 2.1074310557671390e+00 -7.9907405294901483e+00 -2.0873596059689711e-01 -1.5483857775139578e+00 -7.7694210370801686e-01 -5.3368330383507718e+00 -2.0621745006390441e-01 3.0556729170086733e-01 5.3303809680245839e+00 7.5109181526434823e-02 7.0486180236603113e-01 2.7202077362832027e+00 1.6796582649055766e-01 -2.1827096639644172e-01 -2.6932942351493590e+00 -7.1836112762128784e-02 -5.0378231077186952e-01 -2.7112902190251327e+00 -1.1717331059266300e-01 2.5231665671881293e-01 2.6749439849783294e+00 7.6587808320406237e-02 4.5598924643832095e-01 1.3796660697024952e+00 1.2594406761001792e-01 -2.1973961634770434e-01 -1.3637812664633484e+00 -5.0380010528720501e-02 -2.3157440373724936e+00 -2.0490072039562685e-01 -5.9608123357110143e+00 1.9111608475370532e+00 7.5109181526434837e-02 5.7777583259810736e+00 1.6891468784804178e+00 1.6712803615645788e-01 3.0884201913853384e+00 -1.8916155150916847e+00 -5.9309768706404323e-02 -3.2888853143869912e+00 -1.6319172074138959e+00 -2.0571266408949848e-01 -3.0485496733592461e+00 2.0681359649544206e+00 7.3817709251128905e-02 3.2558011425463209e+00 1.7298375973458513e+00 2.0201287677098603e-01 1.8971190823697537e+00 -1.5590045284396696e+00 -4.8144650513477980e-02 -1.7208514188252348e+00 -9.4054180690566191e+00 -1.1463927343753415e+00 -2.2359520582251888e+00 9.7305324992499749e+00 7.0486180236603113e-01 1.6891468784804178e+00 1.3229512526360370e+01 1.2482271245434418e+00 1.8807945276512914e+00 -1.3037021127016656e+01 -7.6877517881268742e-01 -2.2897272959342563e+00 -7.8262171163892269e+00 -1.0661241413520390e+00 -1.5276247520464470e+00 7.6579663828578486e+00 4.3624438116179143e-01 2.1021684345545570e+00 9.3603342996424725e+00 1.0867469478432690e+00 2.0040468237938862e+00 -9.7096893956481622e+00 -4.9478820137446505e-01 -1.6228525582742590e+00 -1.1376293949170009e+00 -2.8829588981476038e+00 -3.7709812371157359e-01 6.9783689476994903e-01 2.7202077362832027e+00 1.6712803615645788e-01 1.2482271245434422e+00 5.6477457233994501e+00 3.0009954137104400e-01 -7.5272810565645931e-01 -5.4632492753583630e+00 -2.5303192893928961e-01 -1.0739117398982019e+00 -1.5342219493824312e+00 -2.5448195091717940e-01 8.0845549555245200e-01 1.3779754830877595e+00 2.9414466309628418e-01 1.0892879815432328e+00 2.9086343339656495e+00 3.2818235272181051e-01 -8.7953825593741342e-01 -2.7741331538476639e+00 -2.0494258977755400e-01 -1.8570357589662734e+00 -3.1691247816538176e-01 -3.2882758209136047e+00 1.6849080685110502e+00 1.6796582649055766e-01 3.0884201913853384e+00 1.8807945276512914e+00 3.0009954137104400e-01 5.9018719351807576e+00 -2.3156750308956076e+00 -2.6045565652337938e-01 -6.0830906058564560e+00 -1.5300306444197673e+00 -2.5301881004211874e-01 -1.7186308395758629e+00 1.7291135653044658e+00 1.4386123322486624e-01 1.8978330310229186e+00 2.0386181947960864e+00 3.3272689359897822e-01 3.3117940381359232e+00 -1.6306929219812454e+00 -1.1426654995456631e-01 -3.1099219293790146e+00 9.2329203035421337e+00 6.6289577955191725e-01 2.4112390139897650e+00 -9.5820526042250869e+00 -2.1827096639644175e-01 -1.8916155150916845e+00 -1.3037021127016656e+01 -7.5272810565645942e-01 -2.3156750308956080e+00 1.2967730482548482e+01 2.9368094920810761e-01 2.7040083033042563e+00 7.6186259366427782e+00 8.0548409145394384e-01 1.7264037482279335e+00 -7.5133540351603427e+00 -1.9481585635896220e-01 -2.2848473182549962e+00 -9.1896899894453306e+00 -8.3917367335695414e-01 -2.4159128320277761e+00 9.5028410331140165e+00 2.4292778155484815e-01 2.0663996307481094e+00 6.7826503478525002e-01 2.7036124553800640e+00 2.4830271632993242e-01 -2.1791692006855184e-01 -2.6932942351493585e+00 -5.9309768706404309e-02 -7.6877517881268731e-01 -5.4632492753583639e+00 -2.6045565652337938e-01 2.9368094920810750e-01 5.5199160891356192e+00 1.0469822752736124e-01 4.4621511232812960e-01 1.3472905984585282e+00 1.4643486635665220e-01 -2.0537768418105912e-01 -1.3626642467704315e+00 -7.7111615582930781e-02 -4.7977244889095905e-01 -2.7731164567156448e+00 -1.7914459428916057e-01 2.5368113563177014e-01 2.7215050710195854e+00 7.6585824887929047e-02 2.4038040173943753e+00 2.4103559884082171e-01 3.5521595790154343e+00 -2.2627719215980222e+00 -7.1836112762128798e-02 -3.2888853143869912e+00 -2.2897272959342572e+00 -2.5303192893928961e-01 -6.0830906058564560e+00 2.7040083033042563e+00 1.0469822752736128e-01 6.4881516212981571e+00 2.0862326280146011e+00 2.9028687478284759e-01 1.8613801408432025e+00 -2.2643863542059970e+00 -7.2522937173164478e-02 -2.1966410985370595e+00 -2.3993808582104181e+00 -3.1048577020216550e-01 -3.6265022451964919e+00 2.0222214812354600e+00 7.1856047925717675e-02 3.2934279228202028e+00 9.2873118534838479e+00 1.0880557417760486e+00 2.0129358744173440e+00 -9.6539325109360981e+00 -5.0378231077186952e-01 -1.6319172074138959e+00 -7.8262171163892269e+00 -1.0739117398982019e+00 -1.5300306444197673e+00 7.6186259366427782e+00 4.4621511232812960e-01 2.0862326280146011e+00 1.3056252717259682e+01 1.2187035291051669e+00 1.8446405385025375e+00 -1.2780086169109298e+01 -7.5395557381771128e-01 -2.2443922875292270e+00 -9.2589170007327102e+00 -1.1233284537061285e+00 -2.1774387371001280e+00 9.5569622897810191e+00 7.0200369498456616e-01 1.6399698355285353e+00 1.0878637776638573e+00 2.8285179422949911e+00 3.2834331898820268e-01 -8.7936256534596935e-01 -2.7112902190251327e+00 -2.0571266408949848e-01 -1.0661241413520390e+00 -1.5342219493824312e+00 -2.5301881004211879e-01 8.0548409145394384e-01 1.3472905984585282e+00 2.9028687478284759e-01 1.2187035291051667e+00 5.6247183433969790e+00 2.9316247148732777e-01 -7.1312795354712244e-01 -5.3772184782477854e+00 -2.4198668070698132e-01 -1.1030879545611669e+00 -2.9001292844952111e+00 -3.6535844292798764e-01 6.4965121658332969e-01 2.7223330470000615e+00 1.5428393250820813e-01 2.0360606225963522e+00 3.3265364871155373e-01 3.2329941137323277e+00 -1.6364093651610783e+00 -1.1717331059266300e-01 -3.0485496733592456e+00 -1.5276247520464472e+00 -2.5448195091717940e-01 -1.7186308395758627e+00 1.7264037482279335e+00 1.4643486635665223e-01 1.8613801408432025e+00 1.8446405385025371e+00 2.9316247148732777e-01 5.8760176911810529e+00 -2.2750684309934863e+00 -2.5737291362102760e-01 -5.9903933853617204e+00 -1.8109977962060118e+00 -3.1063430293941724e-01 -3.2952490036429842e+00 1.6429954350802014e+00 1.6741149151475349e-01 3.0824309561832322e+00 -9.1356080654858225e+00 -8.4168003074526943e-01 -2.4219731871077297e+00 9.4668681278171238e+00 2.5231665671881293e-01 2.0681359649544211e+00 7.6579663828578486e+00 8.0845549555245189e-01 1.7291135653044658e+00 -7.5133540351603427e+00 -2.0537768418105909e-01 -2.2643863542059961e+00 -1.2780086169109298e+01 -7.1312795354712244e-01 -2.2750684309934868e+00 1.2631009183461156e+01 2.6986881242935734e-01 2.6530328995705039e+00 9.1074824059667314e+00 6.2669444334601510e-01 2.3484456504527413e+00 -9.4342778303473978e+00 -1.9714973957318613e-01 -1.8373001079749198e+00 -4.6749242516334188e-01 -2.7086598931320305e+00 -1.7561092796258923e-01 2.4155512397517354e-01 2.6749439849783294e+00 7.3817709251128905e-02 4.3624438116179137e-01 1.3779754830877595e+00 1.4386123322486627e-01 -1.9481585635896220e-01 -1.3626642467704315e+00 -7.2522937173164478e-02 -7.5395557381771117e-01 -5.3772184782477845e+00 -2.5737291362102760e-01 2.6986881242935734e-01 5.3748280681606735e+00 9.7036714450729242e-02 6.6826511405667799e-01 2.7370458349667355e+00 2.4417020226468128e-01 -1.9966957628298473e-01 -2.7162507530432509e+00 -5.3379080434624387e-02 -2.4176673736536931e+00 -3.1304976753398178e-01 -3.5719569102159605e+00 2.0539651065551263e+00 7.6587808320406237e-02 3.2558011425463209e+00 2.1021684345545570e+00 2.9414466309628412e-01 1.8978330310229186e+00 -2.2848473182549962e+00 -7.7111615582930768e-02 -2.1966410985370595e+00 -2.2443922875292261e+00 -2.4198668070698132e-01 -5.9903933853617204e+00 2.6530328995705035e+00 9.7036714450729242e-02 6.3331950117257954e+00 2.3576977650030395e+00 2.3060363067634665e-01 3.5708026227030167e+00 -2.2199572262453104e+00 -6.6224752719872326e-02 -3.2986404138833105e+00 -7.3551815767029698e+00 -1.0224836949887506e+00 -2.2375984303951300e+00 7.6534862619745914e+00 4.5598924643832095e-01 1.7298375973458511e+00 9.3603342996424725e+00 1.0892879815432330e+00 2.0386181947960864e+00 -9.1896899894453306e+00 -4.7977244889095910e-01 -2.3993808582104181e+00 -9.2589170007327120e+00 -1.1030879545611669e+00 -1.8109977962060120e+00 9.1074824059667314e+00 6.6826511405667799e-01 2.3576977650030395e+00 1.2597604960679913e+01 1.1696382411623112e+00 2.6081633483710847e+00 -1.2915119361382690e+01 -7.7783648475966605e-01 -2.2863398207045011e+00 -1.0276096819789329e+00 -1.5324481577001123e+00 -3.8241403146906927e-01 8.3171717141759249e-01 1.3796660697024952e+00 2.0201287677098603e-01 1.0867469478432690e+00 2.9086343339656495e+00 3.3272689359897833e-01 -8.3917367335695425e-01 -2.7731164567156448e+00 -3.1048577020216550e-01 -1.1233284537061285e+00 -2.9001292844952111e+00 -3.1063430293941724e-01 6.2669444334601498e-01 2.7370458349667355e+00 2.3060363067634662e-01 1.1696382411623114e+00 5.6851207901521637e+00 4.3113937672143277e-01 -7.2468499472717263e-01 -5.5047731298760754e+00 -1.9294867315709174e-01 -2.2422607878377931e+00 -3.8129742128451732e-01 -2.1939375997099719e+00 2.1074310557671390e+00 1.2594406761001792e-01 1.8971190823697537e+00 2.0040468237938862e+00 3.2818235272181051e-01 3.3117940381359237e+00 -2.4159128320277761e+00 -1.7914459428916063e-01 -3.6265022451964919e+00 -2.1774387371001280e+00 -3.6535844292798764e-01 -3.2952490036429847e+00 2.3484456504527409e+00 2.4417020226468125e-01 3.5708026227030167e+00 2.6081633483710842e+00 4.3113937672143277e-01 6.4495892387576248e+00 -2.2324745214191530e+00 -2.0363554081627694e-01 -6.1136161334168699e+00 7.6144575938797727e+00 8.3137449502608618e-01 2.1078210805307309e+00 -7.9907405294901483e+00 -2.1973961634770434e-01 -1.5590045284396696e+00 -9.7096893956481622e+00 -8.7953825593741342e-01 -1.6306929219812454e+00 9.5028410331140165e+00 2.5368113563177014e-01 2.0222214812354604e+00 9.5569622897810191e+00 6.4965121658332969e-01 1.6429954350802016e+00 -9.4342778303473995e+00 -1.9966957628298471e-01 -2.2199572262453104e+00 -1.2915119361382695e+01 -7.2468499472717252e-01 -2.2324745214191521e+00 1.3375566200093592e+01 2.8892559605408896e-01 1.8690912012389855e+00 4.4465331371071115e-01 1.3455212378815082e+00 1.2225863193365626e-01 -2.0873596059689711e-01 -1.3637812664633482e+00 -4.8144650513477980e-02 -4.9478820137446505e-01 -2.7741331538476643e+00 -1.1426654995456631e-01 2.4292778155484818e-01 2.7215050710195863e+00 7.1856047925717675e-02 7.0200369498456616e-01 2.7223330470000620e+00 1.6741149151475349e-01 -1.9714973957318610e-01 -2.7162507530432509e+00 -6.6224752719872312e-02 -7.7783648475966616e-01 -5.5047731298760763e+00 -2.0363554081627699e-01 2.8892559605408902e-01 5.5695789473291830e+00 7.0745322630066179e-02 1.7194175969520076e+00 2.0003527387178716e-01 1.8616378743941022e+00 -1.5483857775139578e+00 -5.0380010528720487e-02 -1.7208514188252348e+00 -1.6228525582742590e+00 -2.0494258977755400e-01 -3.1099219293790150e+00 2.0663996307481094e+00 7.6585824887929060e-02 3.2934279228202032e+00 1.6399698355285350e+00 1.5428393250820813e-01 3.0824309561832326e+00 -1.8373001079749196e+00 -5.3379080434624367e-02 -3.2986404138833105e+00 -2.2863398207045007e+00 -1.9294867315709172e-01 -6.1136161334168708e+00 1.8690912012389855e+00 7.0745322630066179e-02 6.0055331421068932e+00 339 340 341 387 388 389 399 400 401 351 352 353 342 343 344 390 391 392 402 403 404 354 355 356 1.2029483954662672e+01 1.1586082233485839e+00 2.5410615742418878e+00 -1.2273377234742732e+01 -7.3997895780152445e-01 -2.1926420239370255e+00 -8.8237715010666928e+00 -1.0959667461949694e+00 -1.7237559808029650e+00 8.6472955613368807e+00 6.3761341457928022e-01 2.2808794151084744e+00 8.7572459296673006e+00 1.0535082205096991e+00 1.9188339752172676e+00 -8.6045024343733658e+00 -4.2521322627828018e-01 -2.2934396562837547e+00 -6.8584281688131092e+00 -9.9115940623041632e-01 -2.1254302819907087e+00 7.1260538933290487e+00 4.0258847806762682e-01 1.5944929784468254e+00 1.1586082233485839e+00 5.4009388761374542e+00 4.3334092180305889e-01 -7.2196996970013272e-01 -5.1449203003512380e+00 -1.8864721672430182e-01 -1.1113437320131505e+00 -2.7303933782651670e+00 -3.0463516429482390e-01 6.1650658344828013e-01 2.5429084770243153e+00 2.2773710713909165e-01 1.0503525557760849e+00 2.7130142659520082e+00 3.2269900575619753e-01 -7.9989064191654635e-01 -2.5865065067157698e+00 -3.0166146019444717e-01 -9.8578305683051493e-01 -1.4456403909792099e+00 -3.7392744729485278e-01 7.9352003788739589e-01 1.2505989571976066e+00 1.8509425381007780e-01 2.5410615742418874e+00 4.3334092180305878e-01 6.1499551990904218e+00 -2.1696653803725732e+00 -1.9179815859546168e-01 -5.7336567687615201e+00 -2.1054875152802621e+00 -3.6545411800158878e-01 -3.0934554450328955e+00 2.2820343507414740e+00 2.3663852525407025e-01 3.3648041708829846e+00 1.8803341209329054e+00 3.1679653927914508e-01 3.0774404477826542e+00 -2.3004475668169477e+00 -1.6201595357074267e-01 -3.4226319017627049e+00 -2.1151232089618310e+00 -3.7415665834934592e-01 -2.0755152973875846e+00 1.9872936255153482e+00 1.0664890218086473e-01 1.7330595951886449e+00 -1.2273377234742728e+01 -7.2196996970013283e-01 -2.1696653803725736e+00 1.2668078128741955e+01 2.5558707994095642e-01 1.7760853008606243e+00 9.1593040415571370e+00 6.5387805904891516e-01 1.5487977585090751e+00 -9.0089626409429187e+00 -1.7283792201597961e-01 -2.1405221214489716e+00 -9.1361431648311591e+00 -8.4196589451638948e-01 -1.5101765031359082e+00 8.9446927355559538e+00 1.9417484880648575e-01 1.9242065635641477e+00 7.1620612381457383e+00 7.9712194852745788e-01 1.9927482157536991e+00 -7.5156531034839782e+00 -1.6398815009131312e-01 -1.4214738337300932e+00 -7.3997895780152445e-01 -5.1449203003512380e+00 -1.9179815859546165e-01 2.5558707994095631e-01 5.1507966486096715e+00 6.2262138700521399e-02 6.6608875118963706e-01 2.5626871990200537e+00 1.5538082127078354e-01 -1.6754916915509102e-01 -2.5413937343476372e+00 -5.5751660426019992e-02 -4.6319949794846854e-01 -2.5927075538498596e+00 -1.0563336669873795e-01 2.0656670277085934e-01 2.5575655239113622e+00 6.2623565300237188e-02 4.1583808368530500e-01 1.2854439475354933e+00 1.1139034153328317e-01 -1.7335299268167376e-01 -1.2774717305278458e+00 -3.8473681084605707e-02 -2.1926420239370255e+00 -1.8864721672430182e-01 -5.7336567687615201e+00 1.7760853008606243e+00 6.2262138700521399e-02 5.5610445142832416e+00 1.5580989406561050e+00 1.5381173256085512e-01 2.8983908558860785e+00 -1.7646561572235209e+00 -4.6822438530058220e-02 -3.1005411241380441e+00 -1.5032130498486609e+00 -1.9251586853615693e-01 -2.8986460644068019e+00 1.9529281881234501e+00 5.9945622210642459e-02 3.1013268637243789e+00 1.6093759331321564e+00 1.8869909571162100e-01 1.7720860102816196e+00 -1.4359771317631296e+00 -3.6733065393122918e-02 -1.6000042868689532e+00 -8.8237715010666928e+00 -1.1113437320131505e+00 -2.1054875152802621e+00 9.1593040415571370e+00 6.6608875118963695e-01 1.5580989406561052e+00 1.2307732789161278e+01 1.2025032129080646e+00 1.7201666316754300e+00 -1.2106958004423227e+01 -7.1721162235345082e-01 -2.1434766194827106e+00 -7.3414449491949920e+00 -1.0349904215443009e+00 -1.4045078242082620e+00 7.1700313593590828e+00 3.9298229931208056e-01 1.9808960407717524e+00 8.6797014876493659e+00 1.0485425009781613e+00 1.8777922243530227e+00 -9.0445952230419557e+00 -4.4657098847704035e-01 -1.4834818784850763e+00 -1.0959667461949694e+00 -2.7303933782651670e+00 -3.6545411800158867e-01 6.5387805904891505e-01 2.5626871990200537e+00 1.5381173256085509e-01 1.2025032129080644e+00 5.2291723572937281e+00 2.8257320480792036e-01 -7.0156919788806360e-01 -5.0329647524560519e+00 -2.4097188846511836e-01 -1.0369486127020857e+00 -1.4489177947278540e+00 -2.4090808248547127e-01 7.6940113041308922e-01 1.2833092566585285e+00 2.8499868511866322e-01 1.0478187073457272e+00 2.6759048376601093e+00 3.1683910596540377e-01 -8.3911655293067755e-01 -2.5387977251833478e+00 -1.9088863950066420e-01 -1.7237559808029654e+00 -3.0463516429482396e-01 -3.0934554450328955e+00 1.5487977585090753e+00 1.5538082127078356e-01 2.8983908558860785e+00 1.7201666316754300e+00 2.8257320480792036e-01 5.4370429547976507e+00 -2.1570686965222237e+00 -2.4705713740942267e-01 -5.6117978176061536e+00 -1.4003914594100191e+00 -2.3975753611452805e-01 -1.5962433111899088e+00 1.6039869871093224e+00 1.3328356581258705e-01 1.7694746268845114e+00 1.8975157794318289e+00 3.2018804773913562e-01 3.0364701767804072e+00 -1.4892510199904494e+00 -9.9975801811651860e-02 -2.8398820405196878e+00 8.6472955613368807e+00 6.1650658344828013e-01 2.2820343507414740e+00 -9.0089626409429204e+00 -1.6754916915509105e-01 -1.7646561572235209e+00 -1.2106958004423227e+01 -7.0156919788806360e-01 -2.1570686965222237e+00 1.2041096895591618e+01 2.3869213952972146e-01 2.5575604079996541e+00 7.1278127896542376e+00 7.6829680733131878e-01 1.6054384819951018e+00 -7.0253092332158360e+00 -1.4763272348490927e-01 -2.1642486777365519e+00 -8.5083304379011206e+00 -7.9973735700327442e-01 -2.2864604194255111e+00 8.8333550699003673e+00 1.9299291722201789e-01 1.9274007101715775e+00 6.3761341457928022e-01 2.5429084770243149e+00 2.3663852525407025e-01 -1.7283792201597956e-01 -2.5413937343476372e+00 -4.6822438530058200e-02 -7.1721162235345071e-01 -5.0329647524560519e+00 -2.4705713740942267e-01 2.3869213952972146e-01 5.1001521168234518e+00 8.5980816987386258e-02 4.0389763822242752e-01 1.2527297165992406e+00 1.3642538455666375e-01 -1.6289431327193313e-01 -1.2749908253519433e+00 -6.2231696360139574e-02 -4.3273775626285665e-01 -2.5357409616242146e+00 -1.6453101633359291e-01 2.0547842157279095e-01 2.4892999633328379e+00 6.1597561835093156e-02 2.2808794151084744e+00 2.2773710713909165e-01 3.3648041708829841e+00 -2.1405221214489716e+00 -5.5751660426019992e-02 -3.1005411241380441e+00 -2.1434766194827102e+00 -2.4097188846511833e-01 -5.6117978176061554e+00 2.5575604079996537e+00 8.5980816987386313e-02 6.0330113678082808e+00 1.9702121622080067e+00 2.8252408160527864e-01 1.7359198195285301e+00 -2.1509887526817328e+00 -5.6155382294842016e-02 -2.0799991087911027e+00 -2.2709968957342661e+00 -3.0057916367907411e-01 -3.3623124821754073e+00 1.8973324040315473e+00 5.7216089133297787e-02 3.0209151744909146e+00 8.7572459296672989e+00 1.0503525557760849e+00 1.8803341209329052e+00 -9.1361431648311591e+00 -4.6319949794846854e-01 -1.5032130498486609e+00 -7.3414449491949920e+00 -1.0369486127020857e+00 -1.4003914594100191e+00 7.1278127896542376e+00 4.0389763822242764e-01 1.9702121622080064e+00 1.2334437249729850e+01 1.1815825228283834e+00 1.7036513144321273e+00 -1.2050752439460133e+01 -7.0911018765836564e-01 -2.1009825816639012e+00 -8.6313123392108988e+00 -1.0843150419044385e+00 -2.0532252756040492e+00 8.9401569236457981e+00 6.5774062338646178e-01 1.5036147689535919e+00 1.0535082205096991e+00 2.7130142659520078e+00 3.1679653927914503e-01 -8.4196589451638948e-01 -2.5927075538498596e+00 -1.9251586853615693e-01 -1.0349904215443009e+00 -1.4489177947278540e+00 -2.3975753611452805e-01 7.6829680733131867e-01 1.2527297165992406e+00 2.8252408160527864e-01 1.1815825228283834e+00 5.3558998176997674e+00 2.7881278331895976e-01 -6.6769541527286613e-01 -5.0943071111548104e+00 -2.3003367302456651e-01 -1.0688445292717883e+00 -2.7065119212334467e+00 -3.5705200172829804e-01 6.1010870993594368e-01 2.5208005807149543e+00 1.4122567520016621e-01 1.9188339752172676e+00 3.2269900575619753e-01 3.0774404477826542e+00 -1.5101765031359082e+00 -1.0563336669873798e-01 -2.8986460644068015e+00 -1.4045078242082620e+00 -2.4090808248547130e-01 -1.5962433111899088e+00 1.6054384819951018e+00 1.3642538455666375e-01 1.7359198195285306e+00 1.7036513144321273e+00 2.7881278331895970e-01 5.5655446601855472e+00 -2.1445553302713849e+00 -2.4689159005317302e-01 -5.6710533833740664e+00 -1.6808030036973274e+00 -2.9797616370056695e-01 -3.0618191578418950e+00 1.5121188896683848e+00 1.5347202930612802e-01 2.8488569893159386e+00 -8.6045024343733658e+00 -7.9989064191654635e-01 -2.3004475668169477e+00 8.9446927355559538e+00 2.0656670277085934e-01 1.9529281881234501e+00 7.1700313593590828e+00 7.6940113041308922e-01 1.6039869871093224e+00 -7.0253092332158360e+00 -1.6289431327193313e-01 -2.1509887526817328e+00 -1.2050752439460132e+01 -6.6769541527286624e-01 -2.1445553302713845e+00 1.1906104413934816e+01 2.1850974111418564e-01 2.5183948291321552e+00 8.4795701499981178e+00 5.8781063569001513e-01 2.2253453911866963e+00 -8.8198345517986390e+00 -1.5180783952680332e-01 -1.7046637457815601e+00 -4.2521322627828018e-01 -2.5865065067157698e+00 -1.6201595357074267e-01 1.9417484880648572e-01 2.5575655239113622e+00 5.9945622210642459e-02 3.9298229931208056e-01 1.2833092566585285e+00 1.3328356581258705e-01 -1.4763272348490925e-01 -1.2749908253519433e+00 -5.6155382294842029e-02 -7.0911018765836564e-01 -5.0943071111548104e+00 -2.4689159005317304e-01 2.1850974111418564e-01 5.1016007229381790e+00 7.9098641952061302e-02 6.2396124871170033e-01 2.5353802384686182e+00 2.3126106340569477e-01 -1.4767200052289703e-01 -2.5220512987541657e+00 -3.8525967462227868e-02 -2.2934396562837551e+00 -3.0166146019444728e-01 -3.4226319017627049e+00 1.9242065635641479e+00 6.2623565300237202e-02 3.1013268637243789e+00 1.9808960407717524e+00 2.8499868511866322e-01 1.7694746268845114e+00 -2.1642486777365515e+00 -6.2231696360139574e-02 -2.0799991087911027e+00 -2.1009825816639012e+00 -2.3003367302456648e-01 -5.6710533833740664e+00 2.5183948291321552e+00 7.9098641952061288e-02 6.0251664311953164e+00 2.2278700979665462e+00 2.1882313435581008e-01 3.3422810757900940e+00 -2.0926966157503939e+00 -5.1617197147618324e-02 -3.0645646036664274e+00 -6.8584281688131092e+00 -9.8578305683051504e-01 -2.1151232089618310e+00 7.1620612381457383e+00 4.1583808368530500e-01 1.6093759331321567e+00 8.6797014876493677e+00 1.0478187073457272e+00 1.8975157794318291e+00 -8.5083304379011206e+00 -4.3273775626285660e-01 -2.2709968957342657e+00 -8.6313123392108988e+00 -1.0688445292717883e+00 -1.6808030036973278e+00 8.4795701499981178e+00 6.2396124871170033e-01 2.2278700979665467e+00 1.1570594221860413e+01 1.1220722721968395e+00 2.4547984263220277e+00 -1.1893856151728507e+01 -7.2232496957441139e-01 -2.1226371284591359e+00 -9.9115940623041632e-01 -1.4456403909792099e+00 -3.7415665834934592e-01 7.9712194852745810e-01 1.2854439475354933e+00 1.8869909571162102e-01 1.0485425009781610e+00 2.6759048376601098e+00 3.2018804773913562e-01 -7.9973735700327453e-01 -2.5357409616242146e+00 -3.0057916367907411e-01 -1.0843150419044387e+00 -2.7065119212334467e+00 -2.9797616370056695e-01 5.8781063569001524e-01 2.5353802384686182e+00 2.1882313435581005e-01 1.1220722721968392e+00 5.1872963035349615e+00 4.2077331556709402e-01 -6.8033555225434461e-01 -4.9961320533623095e+00 -1.7577160764467389e-01 -2.1254302819907087e+00 -3.7392744729485278e-01 -2.0755152973875850e+00 1.9927482157536989e+00 1.1139034153328316e-01 1.7720860102816196e+00 1.8777922243530227e+00 3.1683910596540377e-01 3.0364701767804072e+00 -2.2864604194255107e+00 -1.6453101633359291e-01 -3.3623124821754073e+00 -2.0532252756040497e+00 -3.5705200172829804e-01 -3.0618191578418954e+00 2.2253453911866963e+00 2.3126106340569477e-01 3.3422810757900940e+00 2.4547984263220286e+00 4.2077331556709413e-01 5.9120043179603501e+00 -2.0855682805951781e+00 -1.8475336111473176e-01 -5.5631946434075825e+00 7.1260538933290487e+00 7.9352003788739589e-01 1.9872936255153479e+00 -7.5156531034839782e+00 -1.7335299268167376e-01 -1.4359771317631296e+00 -9.0445952230419557e+00 -8.3911655293067755e-01 -1.4892510199904494e+00 8.8333550699003691e+00 2.0547842157279095e-01 1.8973324040315473e+00 8.9401569236457963e+00 6.1010870993594379e-01 1.5121188896683853e+00 -8.8198345517986390e+00 -1.4767200052289703e-01 -2.0926966157503943e+00 -1.1893856151728507e+01 -6.8033555225434450e-01 -2.0855682805951785e+00 1.2374373143177868e+01 2.3136992899346193e-01 1.7067481288838706e+00 4.0258847806762682e-01 1.2505989571976062e+00 1.0664890218086473e-01 -1.6398815009131312e-01 -1.2774717305278458e+00 -3.6733065393122925e-02 -4.4657098847704035e-01 -2.5387977251833478e+00 -9.9975801811651846e-02 1.9299291722201789e-01 2.4892999633328379e+00 5.7216089133297780e-02 6.5774062338646166e-01 2.5208005807149543e+00 1.5347202930612805e-01 -1.5180783952680332e-01 -2.5220512987541657e+00 -5.1617197147618317e-02 -7.2232496957441150e-01 -4.9961320533623095e+00 -1.8475336111473176e-01 2.3136992899346198e-01 5.0737533065822724e+00 5.5742404846834348e-02 1.5944929784468254e+00 1.8509425381007780e-01 1.7330595951886447e+00 -1.4214738337300932e+00 -3.8473681084605707e-02 -1.6000042868689530e+00 -1.4834818784850763e+00 -1.9088863950066420e-01 -2.8398820405196878e+00 1.9274007101715778e+00 6.1597561835093149e-02 3.0209151744909146e+00 1.5036147689535917e+00 1.4122567520016624e-01 2.8488569893159386e+00 -1.7046637457815601e+00 -3.8525967462227868e-02 -3.0645646036664274e+00 -2.1226371284591359e+00 -1.7577160764467384e-01 -5.5631946434075825e+00 1.7067481288838713e+00 5.5742404846834299e-02 5.4648138154671519e+00 282 283 284 351 352 353 363 364 365 297 298 299 285 286 287 354 355 356 366 367 368 300 301 302 1.2097829634812696e+01 2.5162596186557336e+00 2.5162596186557349e+00 -1.2485011497194590e+01 -2.2068679402578897e+00 -2.2068679402578875e+00 -8.7692784538618458e+00 -2.3018137577391968e+00 -1.6981210152249870e+00 8.7651437532199026e+00 1.9088061430229426e+00 2.2654580576096324e+00 8.7651437532199044e+00 2.2654580576096328e+00 1.9088061430229428e+00 -8.7692784538618493e+00 -1.6981210152249862e+00 -2.3018137577391973e+00 -6.7804791912714375e+00 -2.0812306790203712e+00 -2.0812306790203725e+00 7.1759304549372160e+00 1.5975095729541338e+00 1.5975095729541342e+00 2.5162596186557336e+00 6.3950723142656560e+00 9.5331906281302647e-01 -2.2065205931592256e+00 -5.9957655069797902e+00 -6.4912947200960847e-01 -2.3274921176741978e+00 -3.5765661828136723e+00 -6.5018745227746444e-01 1.8933518253241823e+00 3.2352484647508954e+00 7.0063830179703379e-01 2.2773272213334632e+00 3.5240111570113406e+00 7.1094215733946742e-01 -2.0750308124960224e+00 -3.2548704041483254e+00 -7.8325716958806502e-01 -2.0829780423967681e+00 -2.1588472447949245e+00 -7.9860895188871628e-01 2.0050829004128330e+00 1.8317174027088194e+00 5.1628352381432618e-01 2.5162596186557344e+00 9.5331906281302647e-01 6.3950723142656560e+00 -2.2065205931592260e+00 -6.4912947200960935e-01 -5.9957655069797910e+00 -2.0750308124960233e+00 -7.8325716958806513e-01 -3.2548704041483236e+00 2.2773272213334641e+00 7.1094215733946742e-01 3.5240111570113397e+00 1.8933518253241832e+00 7.0063830179703412e-01 3.2352484647508968e+00 -2.3274921176741987e+00 -6.5018745227746400e-01 -3.5765661828136737e+00 -2.0829780423967685e+00 -7.9860895188871617e-01 -2.1588472447949250e+00 2.0050829004128339e+00 5.1628352381432630e-01 1.8317174027088199e+00 -1.2485011497194590e+01 -2.2065205931592251e+00 -2.2065205931592260e+00 1.3029381482424192e+01 1.8365100704162129e+00 1.8365100704162107e+00 9.2465861152828364e+00 1.9892556566523381e+00 1.5574470094853676e+00 -9.2711619285380618e+00 -1.5554380532091800e+00 -2.1608990525346727e+00 -9.2711619285380618e+00 -2.1608990525346732e+00 -1.5554380532091805e+00 9.2465861152828381e+00 1.5574470094853659e+00 1.9892556566523383e+00 7.2071469308546394e+00 1.9948412972223175e+00 1.9948412972223191e+00 -7.7023652895737973e+00 -1.4551963348731549e+00 -1.4551963348731560e+00 -2.2068679402578897e+00 -5.9957655069797902e+00 -6.4912947200960935e-01 1.8365100704162132e+00 5.8189073536969378e+00 4.4276755396169765e-01 1.9985037636867837e+00 3.2651145416554637e+00 4.7418855235998258e-01 -1.5403311534130710e+00 -3.0581519868609783e+00 -5.0506307177926946e-01 -1.8070306460882277e+00 -3.2692407172068276e+00 -4.2654431985767849e-01 1.5803846363518201e+00 3.0691327143344771e+00 4.7934648672431390e-01 1.6241507830471837e+00 1.8718223842568993e+00 5.2431058989487755e-01 -1.4853195137428119e+00 -1.7018187828961815e+00 -3.3987631929431428e-01 -2.2068679402578875e+00 -6.4912947200960847e-01 -5.9957655069797910e+00 1.8365100704162105e+00 4.4276755396169787e-01 5.8189073536969351e+00 1.5803846363518177e+00 4.7934648672431313e-01 3.0691327143344758e+00 -1.8070306460882262e+00 -4.2654431985767782e-01 -3.2692407172068259e+00 -1.5403311534130690e+00 -5.0506307177926890e-01 -3.0581519868609783e+00 1.9985037636867824e+00 4.7418855235998164e-01 3.2651145416554641e+00 1.6241507830471820e+00 5.2431058989487656e-01 1.8718223842568988e+00 -1.4853195137428101e+00 -3.3987631929431367e-01 -1.7018187828961810e+00 -8.7692784538618458e+00 -2.3274921176741974e+00 -2.0750308124960228e+00 9.2465861152828346e+00 1.9985037636867840e+00 1.5803846363518177e+00 1.2416424975159476e+01 2.5760433276602752e+00 1.6940818192171265e+00 -1.2396460071857780e+01 -2.1618729247181365e+00 -2.1102718486429928e+00 -7.2323399719810784e+00 -2.1705539079990537e+00 -1.4067633297528532e+00 7.2256352418934933e+00 1.6121680425803804e+00 1.9712528060056060e+00 8.6622390462384953e+00 2.2155266152910853e+00 1.8229982848413175e+00 -9.1528068808735945e+00 -1.7423227988271366e+00 -1.4766515555239987e+00 -2.3018137577391968e+00 -3.5765661828136723e+00 -7.8325716958806513e-01 1.9892556566523381e+00 3.2651145416554637e+00 4.7934648672431313e-01 2.5760433276602752e+00 6.3645685435133057e+00 6.2209650486075807e-01 -2.1398224895022966e+00 -6.0189905419266729e+00 -6.6927711708829596e-01 -2.1948535571820660e+00 -2.1701072812067395e+00 -5.2654825301924868e-01 1.9712528060056060e+00 1.8679475271238408e+00 6.8542704510624930e-01 2.2320499582961872e+00 3.5415375323010121e+00 6.8182429267907951e-01 -2.1321119441908469e+00 -3.2735041386465396e+00 -4.8961178967479002e-01 -1.6981210152249870e+00 -6.5018745227746444e-01 -3.2548704041483236e+00 1.5574470094853676e+00 4.7418855235998258e-01 3.0691327143344758e+00 1.6940818192171265e+00 6.2209650486075807e-01 5.8266655699137297e+00 -2.1412166505510855e+00 -6.8540683143630732e-01 -6.0036982368717986e+00 -1.3913580472620923e+00 -5.1501515671552289e-01 -1.6921672185830512e+00 1.6121680425803824e+00 4.6554755564376316e-01 1.8679475271238419e+00 1.8634213452834496e+00 6.9105616639815515e-01 3.2461829979105685e+00 -1.4964225035281600e+00 -4.0227933883336409e-01 -3.0591929496794457e+00 8.7651437532199061e+00 1.8933518253241821e+00 2.2773272213334641e+00 -9.2711619285380582e+00 -1.5403311534130708e+00 -1.8070306460882262e+00 -1.2396460071857780e+01 -2.1398224895022961e+00 -2.1412166505510855e+00 1.2493537927041251e+01 1.7239451017308478e+00 2.5564865954096092e+00 7.1840122866803915e+00 1.9509055198563405e+00 1.6264793120729888e+00 -7.2323399719810810e+00 -1.3913580472620906e+00 -2.1948535571820669e+00 -8.6443453016903824e+00 -2.0173882239437968e+00 -2.2636548479342045e+00 9.1016133071257581e+00 1.5206974672098825e+00 1.9464625729395202e+00 1.9088061430229426e+00 3.2352484647508954e+00 7.1094215733946742e-01 -1.5554380532091800e+00 -3.0581519868609783e+00 -4.2654431985767782e-01 -2.1618729247181365e+00 -6.0189905419266729e+00 -6.8540683143630732e-01 1.7239451017308478e+00 5.8999052913283938e+00 6.2634281221810373e-01 1.6264793120729879e+00 1.8369826087213228e+00 4.7342055864134935e-01 -1.4067633297528526e+00 -1.6921672185830510e+00 -5.2654825301924846e-01 -1.6759307398417944e+00 -3.2634747502237782e+00 -6.3785448302729031e-01 1.5407744906951848e+00 3.0606481327938684e+00 4.6564835914160302e-01 2.2654580576096319e+00 7.0063830179703379e-01 3.5240111570113397e+00 -2.1608990525346727e+00 -5.0506307177926946e-01 -3.2692407172068259e+00 -2.1102718486429928e+00 -6.6927711708829585e-01 -6.0036982368717977e+00 2.5564865954096101e+00 6.2634281221810373e-01 6.4076847197610860e+00 1.9509055198563401e+00 6.7048384369252567e-01 1.8369826087213230e+00 -2.1705539079990537e+00 -5.1501515671552212e-01 -2.1701072812067395e+00 -2.2290875399112613e+00 -7.5591296371081662e-01 -3.5620753208839164e+00 1.8979621762123982e+00 4.4780335158624079e-01 3.2364430706755312e+00 8.7651437532199061e+00 2.2773272213334632e+00 1.8933518253241832e+00 -9.2711619285380618e+00 -1.8070306460882277e+00 -1.5403311534130690e+00 -7.2323399719810793e+00 -2.1948535571820655e+00 -1.3913580472620923e+00 7.1840122866803915e+00 1.6264793120729879e+00 1.9509055198563401e+00 1.2493537927041254e+01 2.5564865954096101e+00 1.7239451017308487e+00 -1.2396460071857787e+01 -2.1412166505510850e+00 -2.1398224895022966e+00 -8.6443453016903824e+00 -2.2636548479342031e+00 -2.0173882239437977e+00 9.1016133071257599e+00 1.9464625729395193e+00 1.5206974672098832e+00 2.2654580576096324e+00 3.5240111570113406e+00 7.0063830179703412e-01 -2.1608990525346732e+00 -3.2692407172068276e+00 -5.0506307177926879e-01 -2.1705539079990537e+00 -2.1701072812067395e+00 -5.1501515671552289e-01 1.9509055198563405e+00 1.8369826087213228e+00 6.7048384369252567e-01 2.5564865954096105e+00 6.4076847197610887e+00 6.2634281221810406e-01 -2.1102718486429932e+00 -6.0036982368718013e+00 -6.6927711708829618e-01 -2.2290875399112617e+00 -3.5620753208839169e+00 -7.5591296371081729e-01 1.8979621762123986e+00 3.2364430706755316e+00 4.4780335158624107e-01 1.9088061430229428e+00 7.1094215733946753e-01 3.2352484647508968e+00 -1.5554380532091803e+00 -4.2654431985767838e-01 -3.0581519868609783e+00 -1.4067633297528532e+00 -5.2654825301924857e-01 -1.6921672185830512e+00 1.6264793120729888e+00 4.7342055864134935e-01 1.8369826087213230e+00 1.7239451017308483e+00 6.2634281221810417e-01 5.8999052913283991e+00 -2.1618729247181374e+00 -6.8540683143630710e-01 -6.0189905419266774e+00 -1.6759307398417953e+00 -6.3785448302729031e-01 -3.2634747502237795e+00 1.5407744906951859e+00 4.6564835914160302e-01 3.0606481327938693e+00 -8.7692784538618493e+00 -2.0750308124960224e+00 -2.3274921176741987e+00 9.2465861152828399e+00 1.5803846363518201e+00 1.9985037636867826e+00 7.2256352418934933e+00 1.9712528060056056e+00 1.6121680425803824e+00 -7.2323399719810810e+00 -1.4067633297528526e+00 -2.1705539079990537e+00 -1.2396460071857787e+01 -2.1102718486429932e+00 -2.1618729247181379e+00 1.2416424975159487e+01 1.6940818192171250e+00 2.5760433276602765e+00 8.6622390462385006e+00 1.8229982848413164e+00 2.2155266152910875e+00 -9.1528068808735981e+00 -1.4766515555239983e+00 -1.7423227988271375e+00 -1.6981210152249857e+00 -3.2548704041483254e+00 -6.5018745227746400e-01 1.5574470094853659e+00 3.0691327143344771e+00 4.7418855235998175e-01 1.6121680425803802e+00 1.8679475271238408e+00 4.6554755564376304e-01 -1.3913580472620906e+00 -1.6921672185830507e+00 -5.1501515671552200e-01 -2.1412166505510846e+00 -6.0036982368718022e+00 -6.8540683143630710e-01 1.6940818192171245e+00 5.8266655699137360e+00 6.2209650486075763e-01 1.8634213452834480e+00 3.2461829979105690e+00 6.9105616639815493e-01 -1.4964225035281580e+00 -3.0591929496794465e+00 -4.0227933883336386e-01 -2.3018137577391973e+00 -7.8325716958806502e-01 -3.5765661828136737e+00 1.9892556566523381e+00 4.7934648672431390e-01 3.2651145416554641e+00 1.9712528060056060e+00 6.8542704510624930e-01 1.8679475271238419e+00 -2.1948535571820664e+00 -5.2654825301924846e-01 -2.1701072812067395e+00 -2.1398224895022966e+00 -6.6927711708829640e-01 -6.0189905419266774e+00 2.5760433276602770e+00 6.2209650486075752e-01 6.3645685435133137e+00 2.2320499582961881e+00 6.8182429267907918e-01 3.5415375323010143e+00 -2.1321119441908478e+00 -4.8961178967478991e-01 -3.2735041386465413e+00 -6.7804791912714375e+00 -2.0829780423967681e+00 -2.0829780423967685e+00 7.2071469308546394e+00 1.6241507830471837e+00 1.6241507830471820e+00 8.6622390462384953e+00 2.2320499582961872e+00 1.8634213452834496e+00 -8.6443453016903806e+00 -1.6759307398417940e+00 -2.2290875399112613e+00 -8.6443453016903824e+00 -2.2290875399112622e+00 -1.6759307398417953e+00 8.6622390462385006e+00 1.8634213452834480e+00 2.2320499582961881e+00 1.1829095589315065e+01 2.3978721301856805e+00 2.3978721301856813e+00 -1.2291550817994494e+01 -2.1294978946626739e+00 -2.1294978946626753e+00 -2.0812306790203712e+00 -2.1588472447949245e+00 -7.9860895188871617e-01 1.9948412972223177e+00 1.8718223842568993e+00 5.2431058989487656e-01 2.2155266152910862e+00 3.5415375323010121e+00 6.9105616639815515e-01 -2.0173882239437964e+00 -3.2634747502237778e+00 -7.5591296371081662e-01 -2.2636548479342031e+00 -3.5620753208839169e+00 -6.3785448302729031e-01 1.8229982848413164e+00 3.2461829979105685e+00 6.8182429267907918e-01 2.3978721301856805e+00 6.3545184711004854e+00 9.0375969855150629e-01 -2.0689645766420277e+00 -6.0296640696663459e+00 -6.0857434889679385e-01 -2.0812306790203725e+00 -7.9860895188871628e-01 -2.1588472447949250e+00 1.9948412972223188e+00 5.2431058989487755e-01 1.8718223842568988e+00 1.8229982848413178e+00 6.8182429267907951e-01 3.2461829979105685e+00 -2.2636548479342049e+00 -6.3785448302729031e-01 -3.5620753208839164e+00 -2.0173882239437977e+00 -7.5591296371081729e-01 -3.2634747502237795e+00 2.2155266152910875e+00 6.9105616639815493e-01 3.5415375323010143e+00 2.3978721301856818e+00 9.0375969855150629e-01 6.3545184711004854e+00 -2.0689645766420295e+00 -6.0857434889679396e-01 -6.0296640696663468e+00 7.1759304549372160e+00 2.0050829004128330e+00 2.0050829004128339e+00 -7.7023652895737973e+00 -1.4853195137428119e+00 -1.4853195137428101e+00 -9.1528068808735945e+00 -2.1321119441908474e+00 -1.4964225035281600e+00 9.1016133071257599e+00 1.5407744906951846e+00 1.8979621762123982e+00 9.1016133071257599e+00 1.8979621762123986e+00 1.5407744906951857e+00 -9.1528068808735981e+00 -1.4964225035281580e+00 -2.1321119441908483e+00 -1.2291550817994494e+01 -2.0689645766420273e+00 -2.0689645766420295e+00 1.2920372800126747e+01 1.7389989707834275e+00 1.7389989707834284e+00 1.5975095729541340e+00 1.8317174027088194e+00 5.1628352381432618e-01 -1.4551963348731549e+00 -1.7018187828961813e+00 -3.3987631929431367e-01 -1.7423227988271366e+00 -3.2735041386465400e+00 -4.0227933883336414e-01 1.5206974672098825e+00 3.0606481327938684e+00 4.4780335158624074e-01 1.9464625729395193e+00 3.2364430706755321e+00 4.6564835914160302e-01 -1.4766515555239981e+00 -3.0591929496794465e+00 -4.8961178967478980e-01 -2.1294978946626735e+00 -6.0296640696663459e+00 -6.0857434889679385e-01 1.7389989707834275e+00 5.9353713347102950e+00 4.1060656215709124e-01 1.5975095729541344e+00 5.1628352381432618e-01 1.8317174027088199e+00 -1.4551963348731558e+00 -3.3987631929431422e-01 -1.7018187828961810e+00 -1.4766515555239985e+00 -4.8961178967478997e-01 -3.0591929496794457e+00 1.9464625729395200e+00 4.6564835914160302e-01 3.2364430706755312e+00 1.5206974672098832e+00 4.4780335158624113e-01 3.0606481327938693e+00 -1.7423227988271377e+00 -4.0227933883336381e-01 -3.2735041386465413e+00 -2.1294978946626753e+00 -6.0857434889679374e-01 -6.0296640696663468e+00 1.7389989707834288e+00 4.1060656215709124e-01 5.9353713347102950e+00 351 352 353 399 400 401 411 412 413 363 364 365 354 355 356 402 403 404 414 415 416 366 367 368 1.1041438637390806e+01 2.3238005976279363e+00 2.3238005976279359e+00 -1.1429061605871210e+01 -2.0184952437246180e+00 -2.0184952437246166e+00 -7.9676864998663586e+00 -2.1288600222515277e+00 -1.5228067081013832e+00 7.9624198046232415e+00 1.7368277224652326e+00 2.0966184520800675e+00 7.9624198046232468e+00 2.0966184520800666e+00 1.7368277224652302e+00 -7.9676864998663621e+00 -1.5228067081013830e+00 -2.1288600222515299e+00 -6.1189097646076300e+00 -1.9214570417036909e+00 -1.9214570417036927e+00 6.5170661235742662e+00 1.4343722436079842e+00 1.4343722436079838e+00 2.3238005976279359e+00 5.9230148641224885e+00 8.9973331434079984e-01 -2.0118141676876173e+00 -5.5090142485034193e+00 -5.8700091217067474e-01 -2.1571116532254426e+00 -3.3004307309865961e+00 -5.9639690430648806e-01 1.7164338662042453e+00 2.9484015891306803e+00 6.4825493505002374e-01 2.1048772227644621e+00 3.2473645771054094e+00 6.5953405753999061e-01 -1.9012243103988291e+00 -2.9697095873356276e+00 -7.3236950753198782e-01 -1.9203108405830966e+00 -1.9927188229130501e+00 -7.5461842356227637e-01 1.8453492852983424e+00 1.6530923593801150e+00 4.6286344064061080e-01 2.3238005976279363e+00 8.9973331434080006e-01 5.9230148641224893e+00 -2.0118141676876178e+00 -5.8700091217067518e-01 -5.5090142485034201e+00 -1.9012243103988291e+00 -7.3236950753198715e-01 -2.9697095873356236e+00 2.1048772227644621e+00 6.5953405753999172e-01 3.2473645771054058e+00 1.7164338662042458e+00 6.4825493505002352e-01 2.9484015891306843e+00 -2.1571116532254435e+00 -5.9639690430648795e-01 -3.3004307309866019e+00 -1.9203108405830969e+00 -7.5461842356227582e-01 -1.9927188229130506e+00 1.8453492852983429e+00 4.6286344064061086e-01 1.6530923593801150e+00 -1.1429061605871212e+01 -2.0118141676876173e+00 -2.0118141676876178e+00 1.1994164756482819e+01 1.6380963006148814e+00 1.6380963006148797e+00 8.4519731709069781e+00 1.8148100543514356e+00 1.3781874878025062e+00 -8.4790358924580538e+00 -1.3768176203360905e+00 -1.9929638401068595e+00 -8.4790358924580609e+00 -1.9929638401068588e+00 -1.3768176203360871e+00 8.4519731709069834e+00 1.3781874878025058e+00 1.8148100543514372e+00 6.5464519448174858e+00 1.8384357627591517e+00 1.8384357627591537e+00 -7.0574296523269453e+00 -1.2879339773974081e+00 -1.2879339773974074e+00 -2.0184952437246180e+00 -5.5090142485034193e+00 -5.8700091217067518e-01 1.6380963006148812e+00 5.3450770871288249e+00 3.8389094034711169e-01 1.8281490998535463e+00 2.9791847349215006e+00 4.2005135676730981e-01 -1.3602518485584327e+00 -2.7780176871573317e+00 -4.4983192921180604e-01 -1.6329174381515068e+00 -2.9870373731600175e+00 -3.7311318831529744e-01 1.4016339085279441e+00 2.7871350797218968e+00 4.2443895164976814e-01 1.4611186516171946e+00 1.6940150148189055e+00 4.7211086629117699e-01 -1.3173334301790087e+00 -1.5313426077703587e+00 -2.9054608535758708e-01 -2.0184952437246162e+00 -5.8700091217067474e-01 -5.5090142485034201e+00 1.6380963006148801e+00 3.8389094034711174e-01 5.3450770871288249e+00 1.4016339085279421e+00 4.2443895164976725e-01 2.7871350797218915e+00 -1.6329174381515044e+00 -3.7311318831529777e-01 -2.9870373731600126e+00 -1.3602518485584318e+00 -4.4983192921180537e-01 -2.7780176871573348e+00 1.8281490998535452e+00 4.2005135676730954e-01 2.9791847349215046e+00 1.4611186516171935e+00 4.7211086629117605e-01 1.6940150148189055e+00 -1.3173334301790074e+00 -2.9054608535758686e-01 -1.5313426077703587e+00 -7.9676864998663577e+00 -2.1571116532254426e+00 -1.9012243103988289e+00 8.4519731709069781e+00 1.8281490998535459e+00 1.4016339085279421e+00 1.1294120803356652e+01 2.3855229418957724e+00 1.4946883928646670e+00 -1.1266471616380711e+01 -1.9683477806437883e+00 -1.9182541113126281e+00 -6.5776267161045539e+00 -2.0147702413160480e+00 -1.2401326433552144e+00 6.5675291486373535e+00 1.4472571207231026e+00 1.8093522899619332e+00 7.8272339276554970e+00 2.0477064089874868e+00 1.6540847997772070e+00 -8.3290722182048587e+00 -1.5684058962746299e+00 -1.3001483260650735e+00 -2.1288600222515273e+00 -3.3004307309865961e+00 -7.3236950753198715e-01 1.8148100543514356e+00 2.9791847349215006e+00 4.2443895164976725e-01 2.3855229418957724e+00 5.8249141652544543e+00 5.5879982248870053e-01 -1.9432675208474666e+00 -5.4624664573797563e+00 -6.1317746834109954e-01 -2.0352069429637285e+00 -2.0048731247685443e+00 -4.7354103081453780e-01 1.8093522899619319e+00 1.6890189358328502e+00 6.3979395316132892e-01 2.0606663255859656e+00 3.2297851091512597e+00 6.3096881582183173e-01 -1.9630171257323838e+00 -2.9551326320251707e+00 -4.3491353643400182e-01 -1.5228067081013832e+00 -5.9639690430648806e-01 -2.9697095873356236e+00 1.3781874878025062e+00 4.2005135676730981e-01 2.7871350797218915e+00 1.4946883928646673e+00 5.5879982248870053e-01 5.2819537249056445e+00 -1.9467301892033781e+00 -6.2948414190389468e-01 -5.4480567014467249e+00 -1.2230917598019675e+00 -4.6235730473332814e-01 -1.5210137178052965e+00 1.4472571207231035e+00 4.1812783510599549e-01 1.6890189358328509e+00 1.6898581021875909e+00 6.3979471746428607e-01 2.9252438611414666e+00 -1.3173624464711389e+00 -3.4853538088258118e-01 -2.7445715950142069e+00 7.9624198046232415e+00 1.7164338662042453e+00 2.1048772227644621e+00 -8.4790358924580538e+00 -1.3602518485584327e+00 -1.6329174381515048e+00 -1.1266471616380713e+01 -1.9432675208474663e+00 -1.9467301892033786e+00 1.1370749889005076e+01 1.5242249982159315e+00 2.3691893919722635e+00 6.5256884017201813e+00 1.7917533395394556e+00 1.4617598245633732e+00 -6.5776267161045539e+00 -1.2230917598019666e+00 -2.0352069429637298e+00 -7.8111443966827281e+00 -1.8487634210999859e+00 -2.0957108577352850e+00 8.2754205262775464e+00 1.3429623463482192e+00 1.7747389887537961e+00 1.7368277224652326e+00 2.9484015891306803e+00 6.5953405753999172e-01 -1.3768176203360909e+00 -2.7780176871573317e+00 -3.7311318831529777e-01 -1.9683477806437883e+00 -5.4624664573797563e+00 -6.2948414190389457e-01 1.5242249982159319e+00 5.3548332686850033e+00 5.6408515757232025e-01 1.4617598245633761e+00 1.6594830487935579e+00 4.2606573318830276e-01 -1.2401326433552178e+00 -1.5210137178052974e+00 -4.7354103081453935e-01 -1.5012943142711848e+00 -2.9454171233164752e+00 -5.8492250923505518e-01 1.3637798133617400e+00 2.7441970790496191e+00 4.1137592196817119e-01 2.0966184520800675e+00 6.4825493505002374e-01 3.2473645771054054e+00 -1.9929638401068595e+00 -4.4983192921180604e-01 -2.9870373731600131e+00 -1.9182541113126281e+00 -6.1317746834109954e-01 -5.4480567014467258e+00 2.3691893919722626e+00 5.6408515757232025e-01 5.8704820614696853e+00 1.7917533395394565e+00 6.2651647934254295e-01 1.6594830487935570e+00 -2.0147702413160489e+00 -4.6235730473332803e-01 -2.0048731247685461e+00 -2.0613515751635139e+00 -7.0802186505945452e-01 -3.2537341047593351e+00 1.7297785843072635e+00 3.9453199538080108e-01 2.9163716167659701e+00 7.9624198046232468e+00 2.1048772227644621e+00 1.7164338662042455e+00 -8.4790358924580591e+00 -1.6329174381515066e+00 -1.3602518485584318e+00 -6.5776267161045539e+00 -2.0352069429637285e+00 -1.2230917598019675e+00 6.5256884017201813e+00 1.4617598245633761e+00 1.7917533395394565e+00 1.1370749889005097e+01 2.3691893919722631e+00 1.5242249982159297e+00 -1.1266471616380736e+01 -1.9467301892033797e+00 -1.9432675208474688e+00 -7.8111443966827334e+00 -2.0957108577352836e+00 -1.8487634210999881e+00 8.2754205262775535e+00 1.7747389887537972e+00 1.3429623463482192e+00 2.0966184520800661e+00 3.2473645771054094e+00 6.4825493505002352e-01 -1.9929638401068586e+00 -2.9870373731600175e+00 -4.4983192921180531e-01 -2.0147702413160484e+00 -2.0048731247685447e+00 -4.6235730473332803e-01 1.7917533395394556e+00 1.6594830487935579e+00 6.2651647934254295e-01 2.3691893919722635e+00 5.8704820614697031e+00 5.6408515757231925e-01 -1.9182541113126279e+00 -5.4480567014467436e+00 -6.1317746834110010e-01 -2.0613515751635134e+00 -3.2537341047593382e+00 -7.0802186505945486e-01 1.7297785843072624e+00 2.9163716167659741e+00 3.9453199538080075e-01 1.7368277224652302e+00 6.5953405753999073e-01 2.9484015891306843e+00 -1.3768176203360871e+00 -3.7311318831529738e-01 -2.7780176871573348e+00 -1.2401326433552144e+00 -4.7354103081453780e-01 -1.5210137178052967e+00 1.4617598245633734e+00 4.2606573318830276e-01 1.6594830487935570e+00 1.5242249982159297e+00 5.6408515757231914e-01 5.3548332686850184e+00 -1.9683477806437868e+00 -6.2948414190389457e-01 -5.4624664573797723e+00 -1.5012943142711819e+00 -5.8492250923505362e-01 -2.9454171233164788e+00 1.3637798133617371e+00 4.1137592196817069e-01 2.7441970790496226e+00 -7.9676864998663639e+00 -1.9012243103988291e+00 -2.1571116532254431e+00 8.4519731709069834e+00 1.4016339085279441e+00 1.8281490998535452e+00 6.5675291486373535e+00 1.8093522899619316e+00 1.4472571207231035e+00 -6.5776267161045547e+00 -1.2401326433552176e+00 -2.0147702413160489e+00 -1.1266471616380734e+01 -1.9182541113126281e+00 -1.9683477806437872e+00 1.1294120803356677e+01 1.4946883928646677e+00 2.3855229418957764e+00 7.8272339276555041e+00 1.6540847997772050e+00 2.0477064089874890e+00 -8.3290722182048658e+00 -1.3001483260650741e+00 -1.5684058962746301e+00 -1.5228067081013830e+00 -2.9697095873356276e+00 -5.9639690430648784e-01 1.3781874878025058e+00 2.7871350797218968e+00 4.2005135676730948e-01 1.4472571207231024e+00 1.6890189358328505e+00 4.1812783510599544e-01 -1.2230917598019666e+00 -1.5210137178052974e+00 -4.6235730473332792e-01 -1.9467301892033799e+00 -5.4480567014467436e+00 -6.2948414190389457e-01 1.4946883928646679e+00 5.2819537249056632e+00 5.5879982248870108e-01 1.6898581021875907e+00 2.9252438611414702e+00 6.3979471746428651e-01 -1.3173624464711378e+00 -2.7445715950142118e+00 -3.4853538088258101e-01 -2.1288600222515295e+00 -7.3236950753198782e-01 -3.3004307309866019e+00 1.8148100543514372e+00 4.2443895164976808e-01 2.9791847349215046e+00 1.8093522899619332e+00 6.3979395316132892e-01 1.6890189358328509e+00 -2.0352069429637298e+00 -4.7354103081453935e-01 -2.0048731247685465e+00 -1.9432675208474688e+00 -6.1317746834109987e-01 -5.4624664573797723e+00 2.3855229418957764e+00 5.5879982248870097e-01 5.8249141652544782e+00 2.0606663255859679e+00 6.3096881582183151e-01 3.2297851091512659e+00 -1.9630171257323856e+00 -4.3491353643400243e-01 -2.9551326320251765e+00 -6.1189097646076300e+00 -1.9203108405830966e+00 -1.9203108405830966e+00 6.5464519448174858e+00 1.4611186516171948e+00 1.4611186516171935e+00 7.8272339276554987e+00 2.0606663255859656e+00 1.6898581021875909e+00 -7.8111443966827281e+00 -1.5012943142711848e+00 -2.0613515751635139e+00 -7.8111443966827325e+00 -2.0613515751635134e+00 -1.5012943142711821e+00 7.8272339276555041e+00 1.6898581021875909e+00 2.0606663255859683e+00 1.0622120491956007e+01 2.2045778328315744e+00 2.2045778328315770e+00 -1.1081841734111407e+01 -1.9332641822045318e+00 -1.9332641822045309e+00 -1.9214570417036909e+00 -1.9927188229130499e+00 -7.5461842356227582e-01 1.8384357627591514e+00 1.6940150148189055e+00 4.7211086629117593e-01 2.0477064089874868e+00 3.2297851091512597e+00 6.3979471746428607e-01 -1.8487634210999864e+00 -2.9454171233164752e+00 -7.0802186505945441e-01 -2.0957108577352832e+00 -3.2537341047593382e+00 -5.8492250923505362e-01 1.6540847997772052e+00 2.9252438611414702e+00 6.3096881582183151e-01 2.2045778328315739e+00 5.7452321197090646e+00 8.5102967928002071e-01 -1.8788734838164580e+00 -5.4024060538318377e+00 -5.4634128100052892e-01 -1.9214570417036927e+00 -7.5461842356227637e-01 -1.9927188229130506e+00 1.8384357627591537e+00 4.7211086629117699e-01 1.6940150148189055e+00 1.6540847997772070e+00 6.3096881582183162e-01 2.9252438611414666e+00 -2.0957108577352854e+00 -5.8492250923505518e-01 -3.2537341047593347e+00 -1.8487634210999881e+00 -7.0802186505945486e-01 -2.9454171233164788e+00 2.0477064089874890e+00 6.3979471746428640e-01 3.2297851091512655e+00 2.2045778328315766e+00 8.5102967928002071e-01 5.7452321197090654e+00 -1.8788734838164605e+00 -5.4634128100052937e-01 -5.4024060538318377e+00 6.5170661235742662e+00 1.8453492852983424e+00 1.8453492852983429e+00 -7.0574296523269435e+00 -1.3173334301790087e+00 -1.3173334301790072e+00 -8.3290722182048569e+00 -1.9630171257323838e+00 -1.3173624464711389e+00 8.2754205262775464e+00 1.3637798133617400e+00 1.7297785843072635e+00 8.2754205262775535e+00 1.7297785843072624e+00 1.3637798133617371e+00 -8.3290722182048640e+00 -1.3173624464711380e+00 -1.9630171257323856e+00 -1.1081841734111407e+01 -1.8788734838164580e+00 -1.8788734838164602e+00 1.1729508646718706e+01 1.5376788032316431e+00 1.5376788032316431e+00 1.4343722436079838e+00 1.6530923593801150e+00 4.6286344064061091e-01 -1.2879339773974081e+00 -1.5313426077703589e+00 -2.9054608535758686e-01 -1.5684058962746297e+00 -2.9551326320251707e+00 -3.4853538088258118e-01 1.3429623463482190e+00 2.7441970790496191e+00 3.9453199538080108e-01 1.7747389887537972e+00 2.9163716167659741e+00 4.1137592196817074e-01 -1.3001483260650744e+00 -2.7445715950142118e+00 -4.3491353643400249e-01 -1.9332641822045318e+00 -5.4024060538318377e+00 -5.4634128100052937e-01 1.5376788032316431e+00 5.3197918334458700e+00 3.5156492568511610e-01 1.4343722436079835e+00 4.6286344064061080e-01 1.6530923593801148e+00 -1.2879339773974077e+00 -2.9054608535758708e-01 -1.5313426077703587e+00 -1.3001483260650732e+00 -4.3491353643400182e-01 -2.7445715950142069e+00 1.7747389887537961e+00 4.1137592196817119e-01 2.9163716167659701e+00 1.3429623463482192e+00 3.9453199538080080e-01 2.7441970790496226e+00 -1.5684058962746299e+00 -3.4853538088258101e-01 -2.9551326320251765e+00 -1.9332641822045309e+00 -5.4634128100052881e-01 -5.4024060538318377e+00 1.5376788032316429e+00 3.5156492568511610e-01 5.3197918334458709e+00 297 298 299 363 364 365 375 376 377 312 313 314 300 301 302 366 367 368 378 379 380 315 316 317 1.0342702280784737e+01 3.2767832278874889e+00 2.0858953963417042e+00 -1.0809639820636466e+01 -3.1353352205874443e+00 -1.8327676276116796e+00 -7.2172151288608877e+00 -2.9397513401759685e+00 -1.3315557801640900e+00 7.3419075305150434e+00 2.6756011372669688e+00 1.8814701731323300e+00 7.3109508711432518e+00 2.9481879224944971e+00 1.5549757623133040e+00 -7.4349767258265986e+00 -2.4992896453229063e+00 -1.9312649392008705e+00 -5.4460760302304001e+00 -2.6522212398208627e+00 -1.6987343161133197e+00 5.9123470231113222e+00 2.3260251582582261e+00 1.2719813313026189e+00 3.2767832278874884e+00 7.1979689473987261e+00 1.3148030848297654e+00 -3.1449681017668887e+00 -6.7103939565576551e+00 -9.6003348671997646e-01 -2.9829074466897008e+00 -4.3741168226566653e+00 -8.4287790844392330e-01 2.6644771184311353e+00 3.9291903570720890e+00 1.0281791538359588e+00 2.9707941875792212e+00 4.3510713367488902e+00 9.5925413885315858e-01 -2.8662607995564904e+00 -3.9845491172842800e+00 -1.1265650562073966e+00 -2.6597354767724033e+00 -2.9583531824228140e+00 -1.0805127253109263e+00 2.7418172908876381e+00 2.5491824377017069e+00 7.0775279916333789e-01 2.0858953963417042e+00 1.3148030848297654e+00 5.9718341478210739e+00 -1.8403724024301784e+00 -9.6110186439363421e-01 -5.5880744445975123e+00 -1.6862515412061214e+00 -1.0483765817157700e+00 -2.9660266218942577e+00 1.8962754672321809e+00 1.0416297694009518e+00 3.2332227911546636e+00 1.5483454230084497e+00 9.4648724245216997e-01 2.9882656703265860e+00 -1.9757592815032705e+00 -1.0076155316180706e+00 -3.3225232782312193e+00 -1.7043072280298954e+00 -1.0810012498502861e+00 -1.9622986593843619e+00 1.6761741665871310e+00 7.9517513089487346e-01 1.6456003948050262e+00 -1.0809639820636468e+01 -3.1449681017668891e+00 -1.8403724024301789e+00 1.1462079528300876e+01 2.9331126472653040e+00 1.5065430107304205e+00 7.7742613656200117e+00 2.8104572620716208e+00 1.2184103987122301e+00 -7.9369644837922131e+00 -2.4916381802643599e+00 -1.8107659530386313e+00 -7.8917624293533386e+00 -2.9939858071646848e+00 -1.2555085780309159e+00 7.9970652825106807e+00 2.4962201405430311e+00 1.6785172552491487e+00 5.9322392210996799e+00 2.7169861307281393e+00 1.6565779192977732e+00 -6.5272786637492288e+00 -2.3261840914121628e+00 -1.1534016504898441e+00 -3.1353352205874443e+00 -6.7103939565576551e+00 -9.6110186439363432e-01 2.9331126472653049e+00 6.4247278840859474e+00 6.9449696566452035e-01 2.8193863247419975e+00 3.9806427315485693e+00 6.5202679933337226e-01 -2.4622515711620805e+00 -3.6442595393855752e+00 -8.1963374736710826e-01 -2.6722505533217906e+00 -4.0177734263088496e+00 -6.2637671541420703e-01 2.5299273364987904e+00 3.6978832681522062e+00 7.7695968296302353e-01 2.3634052344262373e+00 2.5950607481397689e+00 8.0417461824091441e-01 -2.3759941978610168e+00 -2.3258877096744106e+00 -5.2054573902687984e-01 -1.8327676276116793e+00 -9.6003348671997657e-01 -5.5880744445975123e+00 1.5065430107304207e+00 6.9449696566452024e-01 5.4330061307917150e+00 1.2577103100896401e+00 6.7140986209659714e-01 2.8049532580755945e+00 -1.4905679557466511e+00 -6.8354379022640399e-01 -2.9914871520916497e+00 -1.2340465479665577e+00 -6.8811106049871584e-01 -2.8313832364474671e+00 1.6837870433994042e+00 7.6814800792364768e-01 3.0218235363308654e+00 1.3130760721058150e+00 7.2953719427364960e-01 1.6890892092416863e+00 -1.2037343050003917e+00 -5.3190369251331893e-01 -1.5379273013032329e+00 -7.2172151288608903e+00 -2.9829074466897008e+00 -1.6862515412061212e+00 7.7742613656200117e+00 2.8193863247419975e+00 1.2577103100896401e+00 1.0400173126293115e+01 3.2951773976339491e+00 1.2876065417507185e+00 -1.0505272457336988e+01 -3.0063800512803978e+00 -1.6831530298698796e+00 -5.8511555622001294e+00 -2.7865200160200017e+00 -1.0957638121547961e+00 5.9628226696044324e+00 2.3619116233463999e+00 1.6153546732793733e+00 7.0697114630870406e+00 2.8124152011435823e+00 1.4319225946826428e+00 -7.6333254762065952e+00 -2.5130830328758287e+00 -1.1274257365715750e+00 -2.9397513401759681e+00 -4.3741168226566645e+00 -1.0483765817157700e+00 2.8104572620716208e+00 3.9806427315485693e+00 6.7140986209659714e-01 3.2951773976339491e+00 7.0065939452221837e+00 7.8415699095932401e-01 -2.9833613716100129e+00 -6.5568546212608592e+00 -9.3135986710636443e-01 -2.8240214551539458e+00 -2.9862310543022863e+00 -6.7614953277957812e-01 2.6950262119263928e+00 2.5910888212570118e+00 9.5067704147683929e-01 2.8417394323503742e+00 4.2528020748436166e+00 8.8801021650233780e-01 -2.8952661370424124e+00 -3.9139250746515692e+00 -6.3836812943338350e-01 -1.3315557801640900e+00 -8.4287790844392330e-01 -2.9660266218942577e+00 1.2184103987122299e+00 6.5202679933337226e-01 2.8049532580755945e+00 1.2876065417507183e+00 7.8415699095932412e-01 5.3044140928557688e+00 -1.7141589674959654e+00 -9.5506129213105662e-01 -5.4596481233842713e+00 -1.0671354071382599e+00 -6.4974962880800480e-01 -1.5238195449225105e+00 1.2887616548858194e+00 6.7071634259625834e-01 1.6810610518497358e+00 1.4764518554474446e+00 9.0493031094925769e-01 2.9283219009143324e+00 -1.1583802959978973e+00 -5.6414161445522737e-01 -2.7692560134943909e+00 7.3419075305150434e+00 2.6644771184311358e+00 1.8962754672321807e+00 -7.9369644837922131e+00 -2.4622515711620800e+00 -1.4905679557466511e+00 -1.0505272457336988e+01 -2.9833613716100120e+00 -1.7141589674959654e+00 1.0730737038400314e+01 2.6758237593642749e+00 2.1275368352596908e+00 5.9256228341137378e+00 2.6614209121901311e+00 1.3182919728667757e+00 -6.0920579039079330e+00 -2.2197999836457041e+00 -1.8607745850140240e+00 -7.1678344061405035e+00 -2.7148789905576916e+00 -1.8688976618536657e+00 7.7038618481485432e+00 2.3785701269899464e+00 1.5922948947516558e+00 2.6756011372669688e+00 3.9291903570720890e+00 1.0416297694009518e+00 -2.4916381802643599e+00 -3.6442595393855752e+00 -6.8354379022640399e-01 -3.0063800512803978e+00 -6.5568546212608592e+00 -9.5506129213105651e-01 2.6758237593642744e+00 6.3145786066998086e+00 1.0010243676003956e+00 2.3799109757135146e+00 2.5580567362878361e+00 6.9032127191263515e-01 -2.2387162861050944e+00 -2.3008369325336000e+00 -8.6476249029600594e-01 -2.4009256270156181e+00 -3.8866397324790261e+00 -9.5962591798920327e-01 2.4063242723207128e+00 3.5867651255993249e+00 7.3001808172868621e-01 1.8814701731323302e+00 1.0281791538359590e+00 3.2332227911546636e+00 -1.8107659530386315e+00 -8.1963374736710815e-01 -2.9914871520916493e+00 -1.6831530298698796e+00 -9.3135986710636454e-01 -5.4596481233842713e+00 2.1275368352596913e+00 1.0010243676003951e+00 5.8510972520286666e+00 1.5946471510967841e+00 9.2476623776744971e-01 1.6576981650744194e+00 -1.8338626868810612e+00 -8.4505252159423050e-01 -1.9777965273245890e+00 -1.8190814669795410e+00 -1.0564347580287425e+00 -3.2362072720551414e+00 1.5432089772803079e+00 6.9851113489264172e-01 2.9231208665979018e+00 7.3109508711432527e+00 2.9707941875792212e+00 1.5483454230084492e+00 -7.8917624293533386e+00 -2.6722505533217902e+00 -1.2340465479665577e+00 -5.8511555622001286e+00 -2.8240214551539458e+00 -1.0671354071382595e+00 5.9256228341137378e+00 2.3799109757135142e+00 1.5946471510967841e+00 1.0719412631024287e+01 3.3431996761330836e+00 1.3689416316315892e+00 -1.0760713179955637e+01 -3.0439015222514927e+00 -1.7704123762054054e+00 -7.1286175529170643e+00 -2.8891602334236275e+00 -1.6313255817230534e+00 7.6762623881448935e+00 2.7354289247250358e+00 1.1909857072964505e+00 2.9481879224944967e+00 4.3510713367488902e+00 9.4648724245216997e-01 -2.9939858071646848e+00 -4.0177734263088496e+00 -6.8811106049871584e-01 -2.7865200160200021e+00 -2.9862310543022867e+00 -6.4974962880800480e-01 2.6614209121901311e+00 2.5580567362878361e+00 9.2476623776744959e-01 3.3431996761330844e+00 7.1784546793156432e+00 8.2219407320064286e-01 -3.0199304230944675e+00 -6.6739223954003082e+00 -9.6623444227266342e-01 -2.8425109183676733e+00 -4.3204538419976890e+00 -1.0061091246470546e+00 2.6901386538291145e+00 3.9107979656567644e+00 6.1675670280617456e-01 1.5549757623133040e+00 9.5925413885315858e-01 2.9882656703265860e+00 -1.2555085780309156e+00 -6.2637671541420692e-01 -2.8313832364474671e+00 -1.0957638121547961e+00 -6.7614953277957812e-01 -1.5238195449225105e+00 1.3182919728667759e+00 6.9032127191263515e-01 1.6576981650744194e+00 1.3689416316315892e+00 8.2219407320064275e-01 5.5036856922373047e+00 -1.7858276094909742e+00 -9.8187257066383049e-01 -5.6130985875568546e+00 -1.3313722664233398e+00 -8.3353245593254477e-01 -2.9869919292429112e+00 1.2262628992883569e+00 6.4616179082372360e-01 2.8056437705314328e+00 -7.4349767258265986e+00 -2.8662607995564904e+00 -1.9757592815032705e+00 7.9970652825106807e+00 2.5299273364987904e+00 1.6837870433994042e+00 5.9628226696044324e+00 2.6950262119263928e+00 1.2887616548858192e+00 -6.0920579039079330e+00 -2.2387162861050944e+00 -1.8338626868810612e+00 -1.0760713179955637e+01 -3.0199304230944675e+00 -1.7858276094909744e+00 1.0918869431842415e+01 2.7025044147810822e+00 2.2044311918094861e+00 7.2696018323567984e+00 2.5653730054673218e+00 1.8357271771675634e+00 -7.8606114066241553e+00 -2.3679234599175341e+00 -1.4172574893869634e+00 -2.4992896453229068e+00 -3.9845491172842800e+00 -1.0076155316180706e+00 2.4962201405430307e+00 3.6978832681522062e+00 7.6814800792364768e-01 2.3619116233463999e+00 2.5910888212570118e+00 6.7071634259625834e-01 -2.2197999836457045e+00 -2.3008369325336000e+00 -8.4505252159423050e-01 -3.0439015222514922e+00 -6.6739223954003082e+00 -9.8187257066383049e-01 2.7025044147810822e+00 6.3740273171959849e+00 1.0253033994727814e+00 2.6076134326097673e+00 3.9100637661934603e+00 1.0065538687105184e+00 -2.4052584600601756e+00 -3.6137547275804751e+00 -6.3618099482707324e-01 -1.9312649392008703e+00 -1.1265650562073966e+00 -3.3225232782312188e+00 1.6785172552491485e+00 7.7695968296302353e-01 3.0218235363308654e+00 1.6153546732793733e+00 9.5067704147683929e-01 1.6810610518497358e+00 -1.8607745850140240e+00 -8.6476249029600594e-01 -1.9777965273245892e+00 -1.7704123762054049e+00 -9.6623444227266320e-01 -5.6130985875568546e+00 2.2044311918094857e+00 1.0253033994727816e+00 5.9530294504559809e+00 1.8576329428964311e+00 1.0029405862459151e+00 3.2565907548727089e+00 -1.7934841628141396e+00 -7.9831872138249349e-01 -2.9990864003966267e+00 -5.4460760302304010e+00 -2.6597354767724033e+00 -1.7043072280298959e+00 5.9322392210996799e+00 2.3634052344262377e+00 1.3130760721058150e+00 7.0697114630870406e+00 2.8417394323503746e+00 1.4764518554474446e+00 -7.1678344061405035e+00 -2.4009256270156181e+00 -1.8190814669795410e+00 -7.1286175529170652e+00 -2.8425109183676738e+00 -1.3313722664233398e+00 7.2696018323567984e+00 2.6076134326097673e+00 1.8576329428964311e+00 9.9298984445389120e+00 3.0432311006390083e+00 1.9316410182859538e+00 -1.0458922971794463e+01 -2.9528171778696928e+00 -1.7240409273028654e+00 -2.6522212398208627e+00 -2.9583531824228140e+00 -1.0810012498502859e+00 2.7169861307281393e+00 2.5950607481397694e+00 7.2953719427364960e-01 2.8124152011435823e+00 4.2528020748436166e+00 9.0493031094925758e-01 -2.7148789905576916e+00 -3.8866397324790261e+00 -1.0564347580287425e+00 -2.8891602334236275e+00 -4.3204538419976890e+00 -8.3353245593254477e-01 2.5653730054673223e+00 3.9100637661934603e+00 1.0029405862459153e+00 3.0432311006390078e+00 6.9582191526121298e+00 1.2089441204023701e+00 -2.8817449741758709e+00 -6.5506989848894470e+00 -8.7538374805961772e-01 -1.6987343161133199e+00 -1.0805127253109266e+00 -1.9622986593843619e+00 1.6565779192977732e+00 8.0417461824091430e-01 1.6890892092416863e+00 1.4319225946826428e+00 8.8801021650233780e-01 2.9283219009143320e+00 -1.8688976618536657e+00 -9.5962591798920327e-01 -3.2362072720551414e+00 -1.6313255817230534e+00 -1.0061091246470546e+00 -2.9869919292429108e+00 1.8357271771675632e+00 1.0065538687105184e+00 3.2565907548727089e+00 1.9316410182859538e+00 1.2089441204023701e+00 5.8239093349611100e+00 -1.6569111497438938e+00 -8.6143505590895608e-01 -5.5124133393074217e+00 5.9123470231113222e+00 2.7418172908876381e+00 1.6761741665871315e+00 -6.5272786637492288e+00 -2.3759941978610168e+00 -1.2037343050003917e+00 -7.6333254762065952e+00 -2.8952661370424124e+00 -1.1583802959978973e+00 7.7038618481485432e+00 2.4063242723207128e+00 1.5432089772803081e+00 7.6762623881448926e+00 2.6901386538291145e+00 1.2262628992883569e+00 -7.8606114066241544e+00 -2.4052584600601756e+00 -1.7934841628141396e+00 -1.0458922971794463e+01 -2.8817449741758709e+00 -1.6569111497438942e+00 1.1187667258969684e+01 2.7199835521020090e+00 1.3668638704005232e+00 2.3260251582582265e+00 2.5491824377017069e+00 7.9517513089487357e-01 -2.3261840914121628e+00 -2.3258877096744106e+00 -5.3190369251331893e-01 -2.5130830328758287e+00 -3.9139250746515697e+00 -5.6414161445522737e-01 2.3785701269899464e+00 3.5867651255993245e+00 6.9851113489264161e-01 2.7354289247250354e+00 3.9107979656567644e+00 6.4616179082372360e-01 -2.3679234599175341e+00 -3.6137547275804751e+00 -7.9831872138249327e-01 -2.9528171778696928e+00 -6.5506989848894470e+00 -8.6143505590895630e-01 2.7199835521020095e+00 6.3575209678381057e+00 6.1595102764875553e-01 1.2719813313026189e+00 7.0775279916333789e-01 1.6456003948050262e+00 -1.1534016504898441e+00 -5.2054573902687984e-01 -1.5379273013032326e+00 -1.1274257365715750e+00 -6.3836812943338361e-01 -2.7692560134943909e+00 1.5922948947516558e+00 7.3001808172868610e-01 2.9231208665979014e+00 1.1909857072964505e+00 6.1675670280617467e-01 2.8056437705314328e+00 -1.4172574893869636e+00 -6.3618099482707324e-01 -2.9990864003966271e+00 -1.7240409273028656e+00 -8.7538374805961772e-01 -5.5124133393074217e+00 1.3668638704005232e+00 6.1595102764875564e-01 5.4443180225673125e+00 363 364 365 411 412 413 423 424 425 375 376 377 366 367 368 414 415 416 426 427 428 378 379 380 9.3943612454567020e+00 3.0070527783919148e+00 1.9314829921439909e+00 -9.8531426339606547e+00 -2.8675916661175598e+00 -1.6751947830996208e+00 -6.5962710049413582e+00 -2.7123090914532999e+00 -1.2012334901057231e+00 6.7156669253706820e+00 2.4477872559236347e+00 1.7517114482623162e+00 6.6187554635241952e+00 2.7138924603517278e+00 1.4129207661353846e+00 -6.7413933002884727e+00 -2.2580090315644972e+00 -1.7939083228710690e+00 -4.9349996335249315e+00 -2.4409492992340889e+00 -1.5754605467937466e+00 5.3970229383638397e+00 2.1101265937021680e+00 1.1496819363284700e+00 3.0070527783919156e+00 6.6126138971634125e+00 1.2371099294092478e+00 -2.8755385312424777e+00 -6.1069953451036536e+00 -8.7062839327206321e-01 -2.7528850746491194e+00 -4.0649670265540090e+00 -7.7156993671016028e-01 2.4305534764940382e+00 3.6070810619697991e+00 9.5739818114466402e-01 2.7323671730869896e+00 3.9843107498357644e+00 8.8330295000696757e-01 -2.6275513333888192e+00 -3.6075174783401085e+00 -1.0551668583326481e+00 -2.4417209830666460e+00 -2.7437619635551815e+00 -1.0185726648632745e+00 2.5277224943741201e+00 2.3192361045839789e+00 6.3812679261726823e-01 1.9314829921439911e+00 1.2371099294092480e+00 5.4840176951450736e+00 -1.6876346232548027e+00 -8.7481128270389685e-01 -5.0804509347381952e+00 -1.5544907858146406e+00 -9.8038882316818254e-01 -2.7313217749894445e+00 1.7655030595270966e+00 9.7287946971602501e-01 3.0033642820066424e+00 1.4123150815193353e+00 8.7524983217686803e-01 2.6948579149052030e+00 -1.8415283201936798e+00 -9.3372272231013853e-01 -3.0406198765534334e+00 -1.5808990308342203e+00 -1.0217528779102851e+00 -1.8235325860354663e+00 1.5552516269069208e+00 7.2543647479036155e-01 1.4936852802596210e+00 -9.8531426339606529e+00 -2.8755385312424777e+00 -1.6876346232548027e+00 1.0519151093102534e+01 2.6575724953514275e+00 1.3409160020252606e+00 7.1539706740093578e+00 2.5785494108807177e+00 1.0826462923915954e+00 -7.3154958585627270e+00 -2.2533244909598822e+00 -1.6801400268746403e+00 -7.2030772012839703e+00 -2.7624232920022367e+00 -1.1099144145463671e+00 7.3042799476691451e+00 2.2517921262855616e+00 1.5433303015435949e+00 5.4161994826298576e+00 2.5077452761020975e+00 1.5362733105163866e+00 -6.0218855036035386e+00 -2.1043729944152076e+00 -1.0254768418010303e+00 -2.8675916661175598e+00 -6.1069953451036536e+00 -8.7481128270389674e-01 2.6575724953514275e+00 5.8277051304674847e+00 6.0760807085186441e-01 2.5924926305382918e+00 3.6582611608939497e+00 5.7931312604792640e-01 -2.2271105370346262e+00 -3.3220304084848729e+00 -7.4601745456202118e-01 -2.4309979930081358e+00 -3.6429011190549603e+00 -5.4889227112067096e-01 2.2841842352310517e+00 3.3188376990769921e+00 7.0198736183839039e-01 2.1460306912850284e+00 2.3666255522240949e+00 7.3458373968122515e-01 -2.1545798562454781e+00 -2.0995026700190342e+00 -4.5377129003281896e-01 -1.6751947830996203e+00 -8.7062839327206332e-01 -5.0804509347381952e+00 1.3409160020252608e+00 6.0760807085186463e-01 4.9343406201342015e+00 1.1170246859936175e+00 5.9497613758093715e-01 2.5695364894548258e+00 -1.3536300737411231e+00 -6.0890859403601294e-01 -2.7511562996720929e+00 -1.0867723349356075e+00 -6.0944232750864447e-01 -2.5421170635751533e+00 1.5410475361675373e+00 6.8998710032694555e-01 2.7258201287998642e+00 1.1855536929429213e+00 6.5840051009879608e-01 1.5353749245606600e+00 -1.0689447253529851e+00 -4.6199250404182218e-01 -1.3913478649641098e+00 -6.5962710049413582e+00 -2.7528850746491194e+00 -1.5544907858146406e+00 7.1539706740093578e+00 2.5924926305382918e+00 1.1170246859936175e+00 9.6366827097984817e+00 3.0569799184915030e+00 1.1462904491601948e+00 -9.7312893335397685e+00 -2.7680876396566929e+00 -1.5398604733340355e+00 -5.3432022716981082e+00 -2.5762872689252778e+00 -9.6535381494445527e-01 5.4492870269885891e+00 2.1442560848590642e+00 1.4916665490348042e+00 6.4679902071157889e+00 2.5963270310919055e+00 1.3032990653265450e+00 -7.0371680077329799e+00 -2.2927956817496744e+00 -9.9857567542203263e-01 -2.7123090914533008e+00 -4.0649670265540090e+00 -9.8038882316818254e-01 2.5785494108807177e+00 3.6582611608939497e+00 5.9497613758093715e-01 3.0569799184915034e+00 6.5683908565754265e+00 7.0592223258273967e-01 -2.7366264346891342e+00 -6.0990902288506579e+00 -8.5563448201945091e-01 -2.6111947998803395e+00 -2.7716733758459271e+00 -6.0388416104033760e-01 2.4787001646834552e+00 2.3606716669077108e+00 8.8777772088513485e-01 2.6215249644355438e+00 3.9542052846910614e+00 8.1905922315185886e-01 -2.6756241324684447e+00 -3.6057983378175544e+00 -5.6782784797270081e-01 -1.2012334901057231e+00 -7.7156993671016028e-01 -2.7313217749894445e+00 1.0826462923915956e+00 5.7931312604792640e-01 2.5695364894548258e+00 1.1462904491601951e+00 7.0592223258273967e-01 4.9480567758606799e+00 -1.5803632324827377e+00 -8.8705020768860832e-01 -5.0900809227168597e+00 -9.4042857740379615e-01 -5.8043534687457887e-01 -1.3793893586020047e+00 1.1638625269510039e+00 6.0657143553702453e-01 1.5292476580405909e+00 1.3547017841371567e+00 8.4168997748010299e-01 2.6986862974264221e+00 -1.0254757526476934e+00 -4.9444128037444596e-01 -2.5447351644742113e+00 6.7156669253706802e+00 2.4305534764940382e+00 1.7655030595270966e+00 -7.3154958585627261e+00 -2.2271105370346262e+00 -1.3536300737411231e+00 -9.7312893335397703e+00 -2.7366264346891342e+00 -1.5803632324827372e+00 9.9605863989170054e+00 2.4272129337798640e+00 1.9932797080728135e+00 5.4121908827099254e+00 2.4495306622504849e+00 1.1881357685529728e+00 -5.5795251178020715e+00 -1.9988616269353252e+00 -1.7395777699937660e+00 -6.5658370351601842e+00 -2.4971193624453942e+00 -1.7443031112281200e+00 7.1037031380671394e+00 2.1524208885800915e+00 1.4709556512928659e+00 2.4477872559236351e+00 3.6070810619697991e+00 9.7287946971602501e-01 -2.2533244909598822e+00 -3.3220304084848729e+00 -6.0890859403601305e-01 -2.7680876396566925e+00 -6.0990902288506579e+00 -8.8705020768860832e-01 2.4272129337798649e+00 5.8623000517619186e+00 9.2384309842176404e-01 2.1618817061836753e+00 2.3303118680672061e+00 6.2343485744402538e-01 -2.0160597014149859e+00 -2.0743960312391501e+00 -7.9486331469805760e-01 -2.1785945224669288e+00 -3.5808202280286552e+00 -8.9154247196074921e-01 2.1791844586113149e+00 3.2766439148044122e+00 6.6220716280161462e-01 1.7517114482623162e+00 9.5739818114466402e-01 3.0033642820066420e+00 -1.6801400268746403e+00 -7.4601745456202118e-01 -2.7511562996720929e+00 -1.5398604733340358e+00 -8.5563448201945091e-01 -5.0900809227168597e+00 1.9932797080728135e+00 9.2384309842176426e-01 5.4956491181539002e+00 1.4705003063382123e+00 8.6282986090453351e-01 1.5045518066081509e+00 -1.7131152557536979e+00 -7.7609027201470671e-01 -1.8366420337964999e+00 -1.6952551153075561e+00 -9.9347327786019890e-01 -3.0170023153985279e+00 1.4128794085965870e+00 6.2714434598541580e-01 2.6913163648152869e+00 6.6187554635241943e+00 2.7323671730869892e+00 1.4123150815193353e+00 -7.2030772012839703e+00 -2.4309979930081358e+00 -1.0867723349356075e+00 -5.3432022716981100e+00 -2.6111947998803400e+00 -9.4042857740379637e-01 5.4121908827099263e+00 2.1618817061836753e+00 1.4705003063382123e+00 9.6871234865799778e+00 3.0770407628258258e+00 1.2043870145673474e+00 -9.7185007357962778e+00 -2.7691403714622860e+00 -1.6140149125571845e+00 -6.4613306535899504e+00 -2.6666288079736833e+00 -1.5013359184309081e+00 7.0080410295542066e+00 2.5066723302279530e+00 1.0553493409026038e+00 2.7138924603517274e+00 3.9843107498357635e+00 8.7524983217686825e-01 -2.7624232920022367e+00 -3.6429011190549603e+00 -6.0944232750864447e-01 -2.5762872689252778e+00 -2.7716733758459271e+00 -5.8043534687457887e-01 2.4495306622504853e+00 2.3303118680672057e+00 8.6282986090453362e-01 3.0770407628258267e+00 6.5186913563481736e+00 7.3254583358332281e-01 -2.7521869589626111e+00 -5.9937995471932934e+00 -8.8734119991120997e-01 -2.6151493294262744e+00 -3.9708268493505203e+00 -9.3907677124422995e-01 2.4655829638883611e+00 3.5458869171935570e+00 5.4567011887394046e-01 1.4129207661353846e+00 8.8330295000696757e-01 2.6948579149052030e+00 -1.1099144145463673e+00 -5.4889227112067096e-01 -2.5421170635751533e+00 -9.6535381494445527e-01 -6.0388416104033760e-01 -1.3793893586020047e+00 1.1881357685529728e+00 6.2343485744402538e-01 1.5045518066081507e+00 1.2043870145673474e+00 7.3254583358332270e-01 4.9299469001566312e+00 -1.6213630345630192e+00 -8.9646965910182830e-01 -5.0269172387257903e+00 -1.1944905360160334e+00 -7.6108793290631471e-01 -2.7056379053780106e+00 1.0856782508141691e+00 5.7105038313483547e-01 2.5247049446109742e+00 -6.7413933002884727e+00 -2.6275513333888192e+00 -1.8415283201936798e+00 7.3042799476691451e+00 2.2841842352310517e+00 1.5410475361675373e+00 5.4492870269885891e+00 2.4787001646834552e+00 1.1638625269510037e+00 -5.5795251178020715e+00 -2.0160597014149859e+00 -1.7131152557536979e+00 -9.7185007357962778e+00 -2.7521869589626107e+00 -1.6213630345630192e+00 9.8807047659368710e+00 2.4243075672820003e+00 2.0497514827616552e+00 6.5969170812274696e+00 2.3397481404730209e+00 1.7054668024507964e+00 -7.1917696679352510e+00 -2.1311421139031115e+00 -1.2841217378205987e+00 -2.2580090315644972e+00 -3.6075174783401085e+00 -9.3372272231013842e-01 2.2517921262855616e+00 3.3188376990769921e+00 6.8998710032694555e-01 2.1442560848590642e+00 2.3606716669077108e+00 6.0657143553702453e-01 -1.9988616269353250e+00 -2.0743960312391501e+00 -7.7609027201470671e-01 -2.7691403714622855e+00 -5.9937995471932934e+00 -8.9646965910182830e-01 2.4243075672820003e+00 5.6993676372143973e+00 9.3765127586244279e-01 2.3763648197454099e+00 3.5448560483546530e+00 9.3692336377690799e-01 -2.1707095682099293e+00 -3.2480199947812012e+00 -5.6485052207664854e-01 -1.7939083228710690e+00 -1.0551668583326481e+00 -3.0406198765534334e+00 1.5433303015435949e+00 7.0198736183839050e-01 2.7258201287998642e+00 1.4916665490348042e+00 8.8777772088513485e-01 1.5292476580405909e+00 -1.7395777699937660e+00 -7.9486331469805749e-01 -1.8366420337964999e+00 -1.6140149125571841e+00 -8.8734119991120997e-01 -5.0269172387257903e+00 2.0497514827616552e+00 9.3765127586244257e-01 5.3828624370396856e+00 1.7269339626968649e+00 9.3502327475363978e-01 2.9811511366410204e+00 -1.6641812906148996e+00 -7.2506826039769134e-01 -2.7149022114454389e+00 -4.9349996335249324e+00 -2.4417209830666460e+00 -1.5808990308342206e+00 5.4161994826298576e+00 2.1460306912850289e+00 1.1855536929429213e+00 6.4679902071157880e+00 2.6215249644355438e+00 1.3547017841371567e+00 -6.5658370351601825e+00 -2.1785945224669288e+00 -1.6952551153075559e+00 -6.4613306535899504e+00 -2.6151493294262740e+00 -1.1944905360160336e+00 6.5969170812274687e+00 2.3763648197454099e+00 1.7269339626968652e+00 9.0438322018267048e+00 2.7977113149452686e+00 1.7898683017239860e+00 -9.5627716505247502e+00 -2.7061669554514012e+00 -1.5864130593431207e+00 -2.4409492992340889e+00 -2.7437619635551824e+00 -1.0217528779102854e+00 2.5077452761020975e+00 2.3666255522240949e+00 6.5840051009879608e-01 2.5963270310919055e+00 3.9542052846910614e+00 8.4168997748010299e-01 -2.4971193624453942e+00 -3.5808202280286552e+00 -9.9347327786019890e-01 -2.6666288079736837e+00 -3.9708268493505203e+00 -7.6108793290631471e-01 2.3397481404730209e+00 3.5448560483546530e+00 9.3502327475363978e-01 2.7977113149452690e+00 6.4176855397232941e+00 1.1398768763133134e+00 -2.6368342929591249e+00 -5.9879633840587463e+00 -7.9867654996905468e-01 -1.5754605467937466e+00 -1.0185726648632745e+00 -1.8235325860354663e+00 1.5362733105163866e+00 7.3458373968122515e-01 1.5353749245606600e+00 1.3032990653265448e+00 8.1905922315185886e-01 2.6986862974264221e+00 -1.7443031112281200e+00 -8.9154247196074921e-01 -3.0170023153985279e+00 -1.5013359184309081e+00 -9.3907677124422984e-01 -2.7056379053780106e+00 1.7054668024507964e+00 9.3692336377690799e-01 2.9811511366410204e+00 1.7898683017239863e+00 1.1398768763133129e+00 5.3683116355706577e+00 -1.5138079035649388e+00 -7.8125129485505118e-01 -5.0373511873867569e+00 5.3970229383638380e+00 2.5277224943741201e+00 1.5552516269069208e+00 -6.0218855036035386e+00 -2.1545798562454785e+00 -1.0689447253529851e+00 -7.0371680077329799e+00 -2.6756241324684447e+00 -1.0254757526476934e+00 7.1037031380671376e+00 2.1791844586113149e+00 1.4128794085965874e+00 7.0080410295542066e+00 2.4655829638883611e+00 1.0856782508141694e+00 -7.1917696679352510e+00 -2.1707095682099289e+00 -1.6641812906148996e+00 -9.5627716505247520e+00 -2.6368342929591249e+00 -1.5138079035649386e+00 1.0304827723811339e+01 2.4652579330091808e+00 1.2186003858628423e+00 2.1101265937021680e+00 2.3192361045839789e+00 7.2543647479036155e-01 -2.1043729944152076e+00 -2.0995026700190342e+00 -4.6199250404182218e-01 -2.2927956817496740e+00 -3.6057983378175544e+00 -4.9444128037444607e-01 2.1524208885800920e+00 3.2766439148044118e+00 6.2714434598541591e-01 2.5066723302279525e+00 3.5458869171935570e+00 5.7105038313483547e-01 -2.1311421139031115e+00 -3.2480199947812012e+00 -7.2506826039769157e-01 -2.7061669554514016e+00 -5.9879633840587463e+00 -7.8125129485505129e-01 2.4652579330091808e+00 5.7995174500945890e+00 5.3912213575839918e-01 1.1496819363284700e+00 6.3812679261726823e-01 1.4936852802596210e+00 -1.0254768418010303e+00 -4.5377129003281885e-01 -1.3913478649641098e+00 -9.9857567542203252e-01 -5.6782784797270081e-01 -2.5447351644742113e+00 1.4709556512928661e+00 6.6220716280161462e-01 2.6913163648152869e+00 1.0553493409026038e+00 5.4567011887394035e-01 2.5247049446109746e+00 -1.2841217378205985e+00 -5.6485052207664865e-01 -2.7149022114454389e+00 -1.5864130593431209e+00 -7.9867654996905468e-01 -5.0373511873867569e+00 1.2186003858628420e+00 5.3912213575839929e-01 4.9786298385846344e+00 270 271 272 342 343 344 354 355 356 285 286 287 273 274 275 345 346 347 357 358 359 288 289 290 1.0809270725870778e+01 1.0140051824415801e+00 3.4841205217113309e+00 -1.1149468774043271e+01 -6.4603132383750572e-01 -3.2846501592185513e+00 -7.9524220033816526e+00 -9.7719915797345924e-01 -2.7240031733053338e+00 7.6726316517136395e+00 5.4769810432873034e-01 3.1311954401644377e+00 7.7775207477158244e+00 9.3326960565621564e-01 2.8553687637516698e+00 -7.5065445242712556e+00 -3.4788623227670445e-01 -3.0917567771815464e+00 -5.9058214302338801e+00 -8.6681900992231609e-01 -2.8727901928679587e+00 6.2548336066298154e+00 3.4296283158345975e-01 2.5025155769459624e+00 1.0140051824415806e+00 5.2913495161455044e+00 6.2190718989844918e-01 -6.4268457588215311e-01 -5.0531786361500126e+00 -3.1135467371711606e-01 -9.9333426025064930e-01 -2.7295390594614708e+00 -5.0011876024173463e-01 5.3604232172441424e-01 2.5491477120992108e+00 3.2360702089228899e-01 9.2770144441148683e-01 2.6521047829890407e+00 4.9904843034631552e-01 -6.8885169784201139e-01 -2.5270874650085364e+00 -4.2349590249818725e-01 -8.5658667542021882e-01 -1.4316262969422855e+00 -5.2995648711049614e-01 7.0370826081755133e-01 1.2488294463285479e+00 3.2036318243048212e-01 3.4841205217113300e+00 6.2190718989844929e-01 7.2404603220093557e+00 -3.2836155000187084e+00 -3.1304032352639194e-01 -6.7419434413511059e+00 -3.0808011226579799e+00 -5.5524208360649419e-01 -4.0827106358752081e+00 3.1385708282175835e+00 3.3277182176118852e-01 4.4379421730355002e+00 2.8333956004497249e+00 4.9762806308715912e-01 3.9791974069421836e+00 -3.1021446824431127e+00 -2.1604776201213521e-01 -4.4154402820404410e+00 -2.8646221671912273e+00 -5.3476612636185905e-01 -3.0476555726606067e+00 2.8750965219323898e+00 1.6678922076008351e-01 2.6301500299403284e+00 -1.1149468774043271e+01 -6.4268457588215300e-01 -3.2836155000187084e+00 1.1645081586179039e+01 2.1099922864621135e-01 3.0309848073488022e+00 8.3782996524534923e+00 5.8709302012077702e-01 2.6772588803538033e+00 -8.1132137917062011e+00 -1.3208011857533228e-01 -3.1277467370688616e+00 -8.2501035055110847e+00 -7.5390276506198362e-01 -2.6079326480681839e+00 7.9344176166856792e+00 1.4578053127359414e-01 2.8935908088958771e+00 6.2852210856534008e+00 7.0855714782963763e-01 2.8757696206645202e+00 -6.7302338697110544e+00 -1.2376246835075108e-01 -2.4583092321072590e+00 -6.4603132383750572e-01 -5.0531786361500126e+00 -3.1304032352639194e-01 2.1099922864621132e-01 5.0593953222790367e+00 9.8912896351054838e-02 5.9191347531779837e-01 2.5684659969352959e+00 2.7044548829372944e-01 -1.3444846333381838e-01 -2.5512953328224377e+00 -7.5597385860533856e-02 -4.0410918727018219e-01 -2.5368953696728305e+00 -1.8246103855796614e-01 1.6303550155025326e-01 2.5077827478202619e+00 8.7868885433394037e-02 3.6060357813915950e-01 1.2824853798804634e+00 1.7684819152056358e-01 -1.4196280921191601e-01 -1.2767601082697797e+00 -6.2976713653850283e-02 -3.2846501592185504e+00 -3.1135467371711611e-01 -6.7419434413511059e+00 3.0309848073488017e+00 9.8912896351054894e-02 6.4457762784442307e+00 2.6831744580683217e+00 2.6957938269022541e-01 3.7761105220259177e+00 -2.7805712207139930e+00 -6.5904460398306219e-02 -4.0910015317460502e+00 -2.5975515866774872e+00 -3.4094696289853621e-01 -3.6828086522272430e+00 2.9072731338476339e+00 7.9022433931122182e-02 4.0134555596103594e+00 2.5159174381152019e+00 3.2583033803707301e-01 2.6690971741435856e+00 -2.4745768707699285e+00 -5.5138953995517020e-02 -2.3886859088997028e+00 -7.9524220033816526e+00 -9.9333426025064930e-01 -3.0808011226579803e+00 8.3782996524534905e+00 5.9191347531779825e-01 2.6831744580683212e+00 1.1592319171812745e+01 1.0915654629877178e+00 2.9757420489408459e+00 -1.1268790234975894e+01 -6.2705101945971586e-01 -3.2618929480679784e+00 -6.5791910381725724e+00 -9.3163909801074163e-01 -2.4206315466191031e+00 6.2926455785048798e+00 3.2579132094412538e-01 2.8670647003795144e+00 7.8285694506892991e+00 9.3031018439239310e-01 2.8212173668940710e+00 -8.2914305769302992e+00 -3.8755606592092812e-01 -2.5838729569377019e+00 -9.7719915797345924e-01 -2.7295390594614708e+00 -5.5524208360649419e-01 5.8709302012077702e-01 2.5684659969352959e+00 2.6957938269022541e-01 1.0915654629877183e+00 5.3506244543384600e+00 5.0364757519768388e-01 -6.1394173318875156e-01 -5.1631767221984610e+00 -3.5465207815435951e-01 -9.3408171559579056e-01 -1.4375692037933445e+00 -4.2710946375501352e-01 6.6687550525756256e-01 1.2785619147735547e+00 4.0668353333572449e-01 9.2813828870655157e-01 2.7204014675979060e+00 4.9442784926923550e-01 -7.4844967031460763e-01 -2.5877688481919403e+00 -3.3733471497700390e-01 -2.7240031733053338e+00 -5.0011876024173463e-01 -4.0827106358752081e+00 2.6772588803538033e+00 2.7044548829372944e-01 3.7761105220259177e+00 2.9757420489408464e+00 5.0364757519768377e-01 6.5424651249897376e+00 -3.2817306712787429e+00 -3.6363146606574065e-01 -6.8429973358891836e+00 -2.4250651678880319e+00 -4.2675823639920396e-01 -2.3802688986789984e+00 2.5194696753150585e+00 1.8895327278001633e-01 2.6697369418275678e+00 2.8535517615166137e+00 5.0087950922407720e-01 4.0449931118879112e+00 -2.5952233536542124e+00 -1.7341738278882776e-01 -3.7273288302877492e+00 7.6726316517136386e+00 5.3604232172441424e-01 3.1385708282175835e+00 -8.1132137917062028e+00 -1.3444846333381838e-01 -2.7805712207139930e+00 -1.1268790234975890e+01 -6.1394173318875134e-01 -3.2817306712787429e+00 1.1078327455772847e+01 1.9056326767347959e-01 3.5325129705096083e+00 6.2607730692123660e+00 6.6990061948990975e-01 2.5162862634479422e+00 -6.0468981575977638e+00 -1.0411987734635020e-01 -2.9328526648025188e+00 -7.5461479258481399e+00 -6.9123049871174835e-01 -3.0900363346427984e+00 7.9633179334291446e+00 1.4723436369286513e-01 2.8978208292629288e+00 5.4769810432873034e-01 2.5491477120992108e+00 3.3277182176118852e-01 -1.3208011857533228e-01 -2.5512953328224377e+00 -6.5904460398306219e-02 -6.2705101945971597e-01 -5.1631767221984610e+00 -3.6363146606574065e-01 1.9056326767347953e-01 5.2248053827460685e+00 1.1288567029628495e-01 3.4244773467003037e-01 1.2512479968289669e+00 1.9719120967148529e-01 -1.2077465299405689e-01 -1.2731249728422840e+00 -7.5133183451607036e-02 -3.6566715556992008e-01 -2.5826248729429069e+00 -2.2542750855581239e-01 1.6486383992678494e-01 2.5450208091318434e+00 8.7247916742507786e-02 3.1311954401644377e+00 3.2360702089228899e-01 4.4379421730355002e+00 -3.1277467370688616e+00 -7.5597385860533883e-02 -4.0910015317460502e+00 -3.2618929480679788e+00 -3.5465207815435951e-01 -6.8429973358891836e+00 3.5325129705096083e+00 1.1288567029628493e-01 7.3472229028498068e+00 2.8493877891254060e+00 4.0449625539572576e-01 2.6297397625749359e+00 -2.9093971099421561e+00 -6.4376220254966240e-02 -3.0574970292417141e+00 -3.0708106312382344e+00 -4.2323018548284097e-01 -4.4519599198517463e+00 2.8567512265177779e+00 7.6866923168400991e-02 4.0285509782684557e+00 7.7775207477158226e+00 9.2770144441148683e-01 2.8333956004497249e+00 -8.2501035055110830e+00 -4.0410918727018225e-01 -2.5975515866774872e+00 -6.5791910381725724e+00 -9.3408171559579034e-01 -2.4250651678880319e+00 6.2607730692123660e+00 3.4244773467003042e-01 2.8493877891254060e+00 1.1228650613271089e+01 1.0520767432925884e+00 2.8614349457557724e+00 -1.0830351771528042e+01 -6.0333843274379084e-01 -3.1299720417998964e+00 -7.6729155847573161e+00 -9.6072516466292035e-01 -2.9455409404144470e+00 8.0656174697697320e+00 5.8002857789857831e-01 2.5539114014489694e+00 9.3326960565621553e-01 2.6521047829890407e+00 4.9762806308715918e-01 -7.5390276506198384e-01 -2.5368953696728300e+00 -3.4094696289853610e-01 -9.3163909801074163e-01 -1.4375692037933445e+00 -4.2675823639920407e-01 6.6990061948990964e-01 1.2512479968289669e+00 4.0449625539572576e-01 1.0520767432925884e+00 5.2243301360087733e+00 4.8516482276358164e-01 -5.6432575686314901e-01 -4.9754056584124102e+00 -3.2911302211397181e-01 -9.3473440308131528e-01 -2.6861901471722200e+00 -5.3123088315905742e-01 5.2935505457847587e-01 2.5083774632240257e+00 2.4075996332430477e-01 2.8553687637516703e+00 4.9904843034631552e-01 3.9791974069421836e+00 -2.6079326480681839e+00 -1.8246103855796611e-01 -3.6828086522272430e+00 -2.4206315466191031e+00 -4.2710946375501352e-01 -2.3802688986789984e+00 2.5162862634479426e+00 1.9719120967148529e-01 2.6297397625749359e+00 2.8614349457557720e+00 4.8516482276358169e-01 6.3687932890806342e+00 -3.1627428907777766e+00 -3.5319727282317392e-01 -6.5990825108066549e+00 -2.5994319535368784e+00 -4.8363416119625935e-01 -3.9767496450554907e+00 2.5576490660465563e+00 2.6499747355103037e-01 3.6611792481706367e+00 -7.5065445242712556e+00 -6.8885169784201139e-01 -3.1021446824431127e+00 7.9344176166856792e+00 1.6303550155025320e-01 2.9072731338476339e+00 6.2926455785048807e+00 6.6687550525756256e-01 2.5194696753150585e+00 -6.0468981575977638e+00 -1.2077465299405689e-01 -2.9093971099421561e+00 -1.0830351771528042e+01 -5.6432575686314912e-01 -3.1627428907777766e+00 1.0572166987367819e+01 1.5812184981942401e-01 3.3947532508757834e+00 7.4157261381218049e+00 4.9077557592607057e-01 2.9967545503070561e+00 -7.8311618672831242e+00 -1.0485632485409330e-01 -2.6439659271824967e+00 -3.4788623227670445e-01 -2.5270874650085364e+00 -2.1604776201213521e-01 1.4578053127359411e-01 2.5077827478202623e+00 7.9022433931122169e-02 3.2579132094412538e-01 1.2785619147735545e+00 1.8895327278001633e-01 -1.0411987734635020e-01 -1.2731249728422842e+00 -6.4376220254966240e-02 -6.0333843274379084e-01 -4.9754056584124102e+00 -3.5319727282317387e-01 1.5812184981942409e-01 4.9845638867322535e+00 9.4437389273116623e-02 5.3076904036945027e-01 2.5190085154892192e+00 3.2195566180625018e-01 -1.0511820003974820e-01 -2.5142989685520591e+00 -5.0747502700230256e-02 -3.0917567771815464e+00 -4.2349590249818730e-01 -4.4154402820404401e+00 2.8935908088958779e+00 8.7868885433394037e-02 4.0134555596103603e+00 2.8670647003795149e+00 4.0668353333572455e-01 2.6697369418275678e+00 -2.9328526648025193e+00 -7.5133183451607036e-02 -3.0574970292417141e+00 -3.1299720417998955e+00 -3.2911302211397175e-01 -6.5990825108066549e+00 3.3947532508757829e+00 9.4437389273116609e-02 7.0398686413915197e+00 3.0067105873527797e+00 2.9972935915285936e-01 4.3364365852478466e+00 -3.0075378637199925e+00 -6.0977059131328455e-02 -3.9874779059884928e+00 -5.9058214302338801e+00 -8.5658667542021882e-01 -2.8646221671912273e+00 6.2852210856534008e+00 3.6060357813915950e-01 2.5159174381152019e+00 7.8285694506892991e+00 9.2813828870655157e-01 2.8535517615166137e+00 -7.5461479258481390e+00 -3.6566715556992008e-01 -3.0708106312382348e+00 -7.6729155847573161e+00 -9.3473440308131528e-01 -2.5994319535368779e+00 7.4157261381218049e+00 5.3076904036945027e-01 3.0067105873527797e+00 1.0522267222397581e+01 9.7367140651330009e-01 3.3280808850463570e+00 -1.0926898956022747e+01 -6.3619407965700736e-01 -3.1693959200646220e+00 -8.6681900992231609e-01 -1.4316262969422855e+00 -5.3476612636185905e-01 7.0855714782963752e-01 1.2824853798804634e+00 3.2583033803707295e-01 9.3031018439239310e-01 2.7204014675979060e+00 5.0087950922407731e-01 -6.9123049871174835e-01 -2.5826248729429069e+00 -4.2323018548284097e-01 -9.6072516466292035e-01 -2.6861901471722200e+00 -4.8363416119625929e-01 4.9077557592607057e-01 2.5190085154892197e+00 2.9972935915285936e-01 9.7367140651330009e-01 5.2559701430354027e+00 5.9747061660403500e-01 -5.8453964136441661e-01 -5.0774241889455798e+00 -2.8227934997708704e-01 -2.8727901928679587e+00 -5.2995648711049614e-01 -3.0476555726606067e+00 2.8757696206645202e+00 1.7684819152056358e-01 2.6690971741435860e+00 2.8212173668940710e+00 4.9442784926923555e-01 4.0449931118879112e+00 -3.0900363346427988e+00 -2.2542750855581239e-01 -4.4519599198517463e+00 -2.9455409404144475e+00 -5.3123088315905753e-01 -3.9767496450554907e+00 2.9967545503070561e+00 3.2195566180625018e-01 4.3364365852478466e+00 3.3280808850463570e+00 5.9747061660403489e-01 7.1163514893218203e+00 -3.1134549549867994e+00 -3.0408744037471835e-01 -6.6905132230333288e+00 6.2548336066298154e+00 7.0370826081755122e-01 2.8750965219323898e+00 -6.7302338697110535e+00 -1.4196280921191601e-01 -2.4745768707699285e+00 -8.2914305769302992e+00 -7.4844967031460785e-01 -2.5952233536542120e+00 7.9633179334291437e+00 1.6486383992678491e-01 2.8567512265177779e+00 8.0656174697697320e+00 5.2935505457847587e-01 2.5576490660465563e+00 -7.8311618672831234e+00 -1.0511820003974826e-01 -3.0075378637199921e+00 -1.0926898956022752e+01 -5.8453964136441650e-01 -3.1134549549868002e+00 1.1495956260118533e+01 1.8214316560787663e-01 2.9012962286342185e+00 3.4296283158345975e-01 1.2488294463285479e+00 1.6678922076008351e-01 -1.2376246835075108e-01 -1.2767601082697797e+00 -5.5138953995517020e-02 -3.8755606592092806e-01 -2.5877688481919403e+00 -1.7341738278882779e-01 1.4723436369286511e-01 2.5450208091318434e+00 7.6866923168400977e-02 5.8002857789857831e-01 2.5083774632240257e+00 2.6499747355103037e-01 -1.0485632485409330e-01 -2.5142989685520591e+00 -6.0977059131328414e-02 -6.3619407965700725e-01 -5.0774241889455798e+00 -3.0408744037471835e-01 1.8214316560787663e-01 5.1540243952749414e+00 8.4967218810877002e-02 2.5025155769459619e+00 3.2036318243048212e-01 2.6301500299403284e+00 -2.4583092321072590e+00 -6.2976713653850283e-02 -2.3886859088997023e+00 -2.5838729569377028e+00 -3.3733471497700390e-01 -3.7273288302877483e+00 2.8978208292629288e+00 8.7247916742507800e-02 4.0285509782684557e+00 2.5539114014489699e+00 2.4075996332430474e-01 3.6611792481706358e+00 -2.6439659271824967e+00 -5.0747502700230242e-02 -3.9874779059884924e+00 -3.1693959200646225e+00 -2.8227934997708720e-01 -6.6905132230333280e+00 2.9012962286342194e+00 8.4967218810877002e-02 6.4741256118298569e+00 342 343 344 390 391 392 402 403 404 354 355 356 345 346 347 393 394 395 405 406 407 357 358 359 1.0197249304781124e+01 9.8354795416515495e-01 3.2974477228151189e+00 -1.0532742547269285e+01 -6.1024870793174713e-01 -3.1020842399911919e+00 -7.4395964419867893e+00 -9.4679114034682565e-01 -2.5431236948410643e+00 7.1604467285074938e+00 5.1036098064309854e-01 2.9608352747436513e+00 7.3699037516725152e+00 9.0613620630288350e-01 2.6996513353216343e+00 -7.1052669304976943e+00 -3.1894290322558871e-01 -2.9343349200217386e+00 -5.5341161708323003e+00 -8.3802197326915939e-01 -2.7207453183148718e+00 5.8841223056249348e+00 3.1395958366218341e-01 2.3423538402884683e+00 9.8354795416515495e-01 5.0345890764868821e+00 6.0903068397100502e-01 -6.0959018614781268e-01 -4.7824045754727784e+00 -2.9139764891997488e-01 -9.6865315196743296e-01 -2.5492430951309708e+00 -4.8516037786564781e-01 5.0597425687110564e-01 2.3609677826977333e+00 3.0849807729726275e-01 9.0250825782125099e-01 2.5517232383311823e+00 4.8678569365757302e-01 -6.6025611537486939e-01 -2.4236604536662312e+00 -4.0995528709515616e-01 -8.3213107040315293e-01 -1.3594473627476058e+00 -5.2106753398242689e-01 6.7860005503575660e-01 1.1674753895017882e+00 3.0326639293736585e-01 3.2974477228151189e+00 6.0903068397100502e-01 6.8872260783516959e+00 -3.0923449512115972e+00 -2.9076513535830595e-01 -6.3756472245328863e+00 -2.9056630166018320e+00 -5.4025290104513191e-01 -3.8032441482080439e+00 2.9637650003854388e+00 3.1304899274531106e-01 4.1692634043430337e+00 2.6649269091192593e+00 4.8199525721786707e-01 3.7896211750011592e+00 -2.9419584104949257e+00 -1.9968156400339895e-01 -4.2365553236330804e+00 -2.7056046579447326e+00 -5.2186598686189889e-01 -2.8970813190496965e+00 2.7194314039332705e+00 1.4849065333455250e-01 2.4664173577278206e+00 -1.0532742547269283e+01 -6.0959018614781268e-01 -3.0923449512115964e+00 1.1036993399892030e+01 1.6704419739126519e-01 2.8397112605391710e+00 7.8673831065175888e+00 5.5847177776601109e-01 2.4939688839724701e+00 -7.6047010458944513e+00 -9.4151450901734490e-02 -2.9587959293479189e+00 -7.8458170911419955e+00 -7.2327409335829729e-01 -2.4400281622838902e+00 7.5332724288579183e+00 1.1172656146198655e-01 2.7276927932605441e+00 5.9114764200790475e+00 6.8090977881264314e-01 2.7232411599836177e+00 -6.3658646710408506e+00 -9.1136585024061259e-02 -2.2934450549124015e+00 -6.1024870793174713e-01 -4.7824045754727784e+00 -2.9076513535830595e-01 1.6704419739126519e-01 4.7973633214671372e+00 7.8060000936858151e-02 5.5511684360380842e-01 2.3795004037973841e+00 2.5037970577723584e-01 -9.2161351116570187e-02 -2.3699272013433657e+00 -5.2444807435867907e-02 -3.7079710832668883e-01 -2.4292370382208599e+00 -1.6529492423492440e-01 1.2561837430235828e-01 2.4055523916657111e+00 6.7692375819036463e-02 3.2859673179532511e-01 1.2007829562056405e+00 1.5709337483377303e-01 -1.0316897971775094e-01 -1.2016302580988687e+00 -4.4720590337805413e-02 -3.1020842399911923e+00 -2.9139764891997494e-01 -6.3756472245328863e+00 2.8397112605391714e+00 7.8060000936858193e-02 6.0836693760669078e+00 2.5038116427423174e+00 2.5378228783341350e-01 3.4967060928721820e+00 -2.6047014102805153e+00 -4.6739307213006051e-02 -3.8184089483738779e+00 -2.4326012220281221e+00 -3.2308517412207732e-01 -3.4921462830873700e+00 2.7533930053993938e+00 6.1008474506543453e-02 3.8246404070173274e+00 2.3581262024906771e+00 3.0816459556717107e-01 2.5093698265038595e+00 -2.3156552388717304e+00 -3.9793228588927726e-02 -2.2281832464661457e+00 -7.4395964419867884e+00 -9.6865315196743296e-01 -2.9056630166018325e+00 7.8673831065175879e+00 5.5511684360380853e-01 2.5038116427423178e+00 1.0730582555825013e+01 1.0573331083272954e+00 2.7541331159248887e+00 -1.0404578433889640e+01 -5.7932510213424993e-01 -3.0561304294562679e+00 -6.2075647795873650e+00 -9.0678168280724580e-01 -2.2581426646768339e+00 5.9229475553769255e+00 2.9519227141225446e-01 2.7103286929210020e+00 7.3016414984521578e+00 9.0017800186177732e-01 2.6530297169577439e+00 -7.7708150607078927e+00 -3.5306028829620673e-01 -2.4013670578110236e+00 -9.4679114034682565e-01 -2.5492430951309708e+00 -5.4025290104513191e-01 5.5847177776601120e-01 2.3795004037973841e+00 2.5378228783341350e-01 1.0573331083272954e+00 4.8910458416709313e+00 4.8154857677912621e-01 -5.7850309146532697e-01 -4.6933550206176111e+00 -3.3949319458147614e-01 -9.0968853543110983e-01 -1.3636369092475920e+00 -4.1115921302837655e-01 6.3998880865021002e-01 1.1974462578712712e+00 3.9517401383061940e-01 9.0022613377592831e-01 2.5231910846910717e+00 4.8074006007522485e-01 -7.2103706127618239e-01 -2.3849485630344835e+00 -3.2033962986340020e-01 -2.5431236948410638e+00 -4.8516037786564775e-01 -3.8032441482080439e+00 2.4939688839724701e+00 2.5037970577723584e-01 3.4967060928721816e+00 2.7541331159248905e+00 4.8154857677912621e-01 5.9639330084231368e+00 -3.0612684658345133e+00 -3.4044578754184174e-01 -6.2641828004974434e+00 -2.2597273138656018e+00 -4.1012468102302857e-01 -2.2180749917012834e+00 2.3590867374218494e+00 1.7509523115184575e-01 2.5058336066861178e+00 2.6734296664964301e+00 4.8414642025825816e-01 3.7518301843014159e+00 -2.4164989292744590e+00 -1.5543908753594790e-01 -3.4328009518760840e+00 7.1604467285074946e+00 5.0597425687110564e-01 2.9637650003854388e+00 -7.6047010458944513e+00 -9.2161351116570173e-02 -2.6047014102805153e+00 -1.0404578433889640e+01 -5.7850309146532697e-01 -3.0612684658345137e+00 1.0223084925330028e+01 1.4484871549652628e-01 3.3248910765150432e+00 5.8873125135566946e+00 6.3944847389800097e-01 2.3586054168568404e+00 -5.6812756338323247e+00 -7.0782076149967885e-02 -2.7788277533610666e+00 -7.0241231733372080e+00 -6.6006079145712271e-01 -2.9233890558628488e+00 7.4438341195594075e+00 1.1123586392335472e-01 2.7209251915816259e+00 5.1036098064309865e-01 2.3609677826977333e+00 3.1304899274531106e-01 -9.4151450901734546e-02 -2.3699272013433657e+00 -4.6739307213006051e-02 -5.7932510213424993e-01 -4.6933550206176111e+00 -3.4044578754184168e-01 1.4484871549652625e-01 4.7677722892971719e+00 8.6190296319513554e-02 3.0784488263951204e-01 1.1692761728729022e+00 1.8163469484381825e-01 -8.6675668208876427e-02 -1.1998579426674785e+00 -5.4782963311237262e-02 -3.2851985531693961e-01 -2.3827555198770360e+00 -2.0521667362755755e-01 1.2561749778266343e-01 2.3478794396376825e+00 6.6310747784999860e-02 2.9608352747436508e+00 3.0849807729726281e-01 4.1692634043430337e+00 -2.9587959293479189e+00 -5.2444807435867914e-02 -3.8184089483738779e+00 -3.0561304294562670e+00 -3.3949319458147620e-01 -6.2641828004974434e+00 3.3248910765150428e+00 8.6190296319513540e-02 6.7879873367510815e+00 2.6958703298959232e+00 3.9154013445067393e-01 2.4698947431376341e+00 -2.7582899301913990e+00 -4.4591634531826727e-02 -2.9089258431939156e+00 -2.8995129469050287e+00 -4.0803681325766483e-01 -4.1745532441942474e+00 2.6911325547459963e+00 5.8337941739385252e-02 3.7389253520277381e+00 7.3699037516725152e+00 9.0250825782125110e-01 2.6649269091192593e+00 -7.8458170911419964e+00 -3.7079710832668883e-01 -2.4326012220281221e+00 -6.2075647795873659e+00 -9.0968853543110995e-01 -2.2597273138656018e+00 5.8873125135566946e+00 3.0784488263951199e-01 2.6958703298959237e+00 1.0782866883070072e+01 1.0262967046113516e+00 2.6919808857841070e+00 -1.0383516656809293e+01 -5.7864679445801892e-01 -2.9590621453890016e+00 -7.2527971995305212e+00 -9.3225084274847747e-01 -2.7880011833263740e+00 7.6496125787698963e+00 5.5473343589218016e-01 2.3866137398098135e+00 9.0613620630288350e-01 2.5517232383311823e+00 4.8199525721786707e-01 -7.2327409335829718e-01 -2.4292370382208599e+00 -3.2308517412207738e-01 -9.0678168280724580e-01 -1.3636369092475920e+00 -4.1012468102302857e-01 6.3944847389800086e-01 1.1692761728729022e+00 3.9154013445067387e-01 1.0262967046113520e+00 5.0879292775132923e+00 4.6834232735000014e-01 -5.2638702092164213e-01 -4.8295023629859690e+00 -3.1031696330700870e-01 -9.0985348546922917e-01 -2.5709865928194127e+00 -5.1980834054113179e-01 4.9441489774417879e-01 2.3844342145564568e+00 2.2145743997470627e-01 2.6996513353216343e+00 4.8678569365757302e-01 3.7896211750011592e+00 -2.4400281622838902e+00 -1.6529492423492434e-01 -3.4921462830873695e+00 -2.2581426646768339e+00 -4.1115921302837655e-01 -2.2180749917012834e+00 2.3586054168568404e+00 1.8163469484381825e-01 2.4698947431376341e+00 2.6919808857841074e+00 4.6834232735000014e-01 6.1414516556242900e+00 -3.0076247787232413e+00 -3.4305281041090530e-01 -6.3696823802141154e+00 -2.4392702760797653e+00 -4.6765822105658561e-01 -3.7758358341363563e+00 2.3948282438011499e+00 2.5040245287940049e-01 3.4547719153760426e+00 -7.1052669304976961e+00 -6.6025611537486939e-01 -2.9419584104949257e+00 7.5332724288579183e+00 1.2561837430235828e-01 2.7533930053993934e+00 5.9229475553769255e+00 6.3998880865021002e-01 2.3590867374218494e+00 -5.6812756338323247e+00 -8.6675668208876414e-02 -2.7582899301913990e+00 -1.0383516656809295e+01 -5.2638702092164202e-01 -3.0076247787232413e+00 1.0135950735873559e+01 1.2368034826452146e-01 3.2359147513524826e+00 7.0002428739530469e+00 4.5748141942248044e-01 2.8432181806128756e+00 -7.4223543729221344e+00 -7.3450146134182340e-02 -2.4837395553770407e+00 -3.1894290322558866e-01 -2.4236604536662312e+00 -1.9968156400339893e-01 1.1172656146198655e-01 2.4055523916657107e+00 6.1008474506543460e-02 2.9519227141225446e-01 1.1974462578712715e+00 1.7509523115184575e-01 -7.0782076149967899e-02 -1.1998579426674785e+00 -4.4591634531826733e-02 -5.7864679445801892e-01 -4.8295023629859690e+00 -3.4305281041090530e-01 1.2368034826452148e-01 4.8508151230967655e+00 7.3866270037209525e-02 5.0575132318822558e-01 2.3983260627874938e+00 3.0941216527120363e-01 -6.7978730493412687e-02 -2.3991190761015644e+00 -3.2056132020671466e-02 -2.9343349200217390e+00 -4.0995528709515616e-01 -4.2365553236330804e+00 2.7276927932605441e+00 6.7692375819036463e-02 3.8246404070173265e+00 2.7103286929210020e+00 3.9517401383061945e-01 2.5058336066861173e+00 -2.7788277533610666e+00 -5.4782963311237255e-02 -2.9089258431939156e+00 -2.9590621453890016e+00 -3.1031696330700864e-01 -6.3696823802141145e+00 3.2359147513524826e+00 7.3866270037209525e-02 6.8268190767333445e+00 2.8481567714639606e+00 2.8157980151688417e-01 4.1433061108783367e+00 -2.8498681902261831e+00 -4.3257247490347372e-02 -3.7854356542740164e+00 -5.5341161708323012e+00 -8.3213107040315293e-01 -2.7056046579447326e+00 5.9114764200790484e+00 3.2859673179532506e-01 2.3581262024906771e+00 7.3016414984521578e+00 9.0022613377592819e-01 2.6734296664964305e+00 -7.0241231733372080e+00 -3.2851985531693961e-01 -2.8995129469050287e+00 -7.2527971995305220e+00 -9.0985348546922928e-01 -2.4392702760797653e+00 7.0002428739530469e+00 5.0575132318822558e-01 2.8481567714639606e+00 9.8473470422419656e+00 9.4022902340325476e-01 3.1437641910686702e+00 -1.0249671291026187e+01 -6.0429880097341160e-01 -2.9790889505902167e+00 -8.3802197326915928e-01 -1.3594473627476058e+00 -5.2186598686189889e-01 6.8090977881264314e-01 1.2007829562056407e+00 3.0816459556717107e-01 9.0017800186177710e-01 2.5231910846910712e+00 4.8414642025825816e-01 -6.6006079145712271e-01 -2.3827555198770360e+00 -4.0803681325766472e-01 -9.3225084274847736e-01 -2.5709865928194127e+00 -4.6765822105658572e-01 4.5748141942248044e-01 2.3983260627874938e+00 2.8157980151688405e-01 9.4022902340325465e-01 4.9380306797640277e+00 5.8350279437318264e-01 -5.4846461602539642e-01 -4.7471413080041769e+00 -2.5983259053934765e-01 -2.7207453183148722e+00 -5.2106753398242700e-01 -2.8970813190496965e+00 2.7232411599836177e+00 1.5709337483377303e-01 2.5093698265038600e+00 2.6530297169577439e+00 4.8074006007522480e-01 3.7518301843014159e+00 -2.9233890558628488e+00 -2.0521667362755758e-01 -4.1745532441942474e+00 -2.7880011833263740e+00 -5.1980834054113179e-01 -3.7758358341363563e+00 2.8432181806128756e+00 3.0941216527120363e-01 4.1433061108783367e+00 3.1437641910686698e+00 5.8350279437318264e-01 6.7073761258879614e+00 -2.9311176911188146e+00 -2.8465584640226782e-01 -6.2644118501912747e+00 5.8841223056249348e+00 6.7860005503575671e-01 2.7194314039332705e+00 -6.3658646710408506e+00 -1.0316897971775092e-01 -2.3156552388717304e+00 -7.7708150607078927e+00 -7.2103706127618239e-01 -2.4164989292744594e+00 7.4438341195594067e+00 1.2561749778266343e-01 2.6911325547459968e+00 7.6496125787698963e+00 4.9441489774417879e-01 2.3948282438011499e+00 -7.4223543729221353e+00 -6.7978730493412673e-02 -2.8498681902261831e+00 -1.0249671291026187e+01 -5.4846461602539642e-01 -2.9311176911188150e+00 1.0831136391742829e+01 1.4201693695014367e-01 2.7077478470107748e+00 3.1395958366218341e-01 1.1674753895017882e+00 1.4849065333455250e-01 -9.1136585024061287e-02 -1.2016302580988691e+00 -3.9793228588927726e-02 -3.5306028829620673e-01 -2.3849485630344831e+00 -1.5543908753594790e-01 1.1123586392335472e-01 2.3478794396376825e+00 5.8337941739385252e-02 5.5473343589218016e-01 2.3844342145564568e+00 2.5040245287940055e-01 -7.3450146134182354e-02 -2.3991190761015644e+00 -4.3257247490347359e-02 -6.0429880097341138e-01 -4.7471413080041769e+00 -2.8465584640226782e-01 1.4201693695014367e-01 4.8330501615431665e+00 6.5914362064152632e-02 2.3423538402884678e+00 3.0326639293736585e-01 2.4664173577278206e+00 -2.2934450549124019e+00 -4.4720590337805413e-02 -2.2281832464661457e+00 -2.4013670578110236e+00 -3.2033962986340025e-01 -3.4328009518760840e+00 2.7209251915816259e+00 6.6310747784999874e-02 3.7389253520277381e+00 2.3866137398098139e+00 2.2145743997470629e-01 3.4547719153760421e+00 -2.4837395553770407e+00 -3.2056132020671479e-02 -3.7854356542740164e+00 -2.9790889505902167e+00 -2.5983259053934754e-01 -6.2644118501912764e+00 2.7077478470107748e+00 6.5914362064152646e-02 6.0507170776759240e+00 285 286 287 354 355 356 366 367 368 300 301 302 288 289 290 357 358 359 369 370 371 303 304 305 1.0342702280784028e+01 2.0858953963414293e+00 3.2767832278870599e+00 -1.0809639820635679e+01 -1.8327676276115037e+00 -3.1353352205871015e+00 -7.4349767258258792e+00 -1.9312649392005998e+00 -2.4992896453225804e+00 7.3109508711425475e+00 1.5549757623131346e+00 2.9481879224940792e+00 7.3419075305143435e+00 1.8814701731320689e+00 2.6756011372666442e+00 -7.2172151288602038e+00 -1.3315557801639279e+00 -2.9397513401755564e+00 -5.4460760302297597e+00 -1.6987343161130624e+00 -2.6522212398204652e+00 5.9123470231106072e+00 1.2719813313024604e+00 2.3260251582579112e+00 2.0858953963414288e+00 5.9718341478209194e+00 1.3148030848295906e+00 -1.8403724024298760e+00 -5.5880744445973995e+00 -9.6110186439349587e-01 -1.9757592815029832e+00 -3.3225232782310892e+00 -1.0076155316179369e+00 1.5483454230081715e+00 2.9882656703265003e+00 9.4648724245200055e-01 1.8962754672318984e+00 3.2332227911545455e+00 1.0416297694008190e+00 -1.6862515412058463e+00 -2.9660266218941809e+00 -1.0483765817156021e+00 -1.7043072280296359e+00 -1.9622986593842493e+00 -1.0810012498501234e+00 1.6761741665868426e+00 1.6456003948049549e+00 7.9517513089474523e-01 3.2767832278870594e+00 1.3148030848295904e+00 7.1979689473984125e+00 -3.1449681017664162e+00 -9.6003348671986599e-01 -6.7103939565573985e+00 -2.8662607995560445e+00 -1.1265650562072247e+00 -3.9845491172840548e+00 2.9707941875787842e+00 9.5925413885305100e-01 4.3510713367486060e+00 2.6644771184306975e+00 1.0281791538357932e+00 3.9291903570718736e+00 -2.9829074466892695e+00 -8.4287790844381960e-01 -4.3741168226563909e+00 -2.6597354767719978e+00 -1.0805127253107618e+00 -2.9583531824225533e+00 2.7418172908871878e+00 7.0775279916323730e-01 2.5491824377014995e+00 -1.0809639820635677e+01 -1.8403724024298760e+00 -3.1449681017664157e+00 1.1462079528300000e+01 1.5065430107302289e+00 2.9331126472649283e+00 7.9970652825098814e+00 1.6785172552488512e+00 2.4962201405426701e+00 -7.8917624293525579e+00 -1.2555085780307311e+00 -2.9939858071642220e+00 -7.9369644837914377e+00 -1.8107659530383426e+00 -2.4916381802640011e+00 7.7742613656192523e+00 1.2184103987120511e+00 2.8104572620711661e+00 5.9322392210989694e+00 1.6565779192974883e+00 2.7169861307276992e+00 -6.5272786637484348e+00 -1.1534016504896698e+00 -2.3261840914118137e+00 -1.8327676276115037e+00 -5.5880744445973995e+00 -9.6003348671986588e-01 1.5065430107302289e+00 5.4330061307916289e+00 6.9449696566443331e-01 1.6837870433992217e+00 3.0218235363307779e+00 7.6814800792356352e-01 -1.2340465479663822e+00 -2.8313832364474050e+00 -6.8811106049860937e-01 -1.4905679557464735e+00 -2.9914871520915725e+00 -6.8354379022632095e-01 1.2577103100894671e+00 2.8049532580755430e+00 6.7140986209649212e-01 1.3130760721056514e+00 1.6890892092416139e+00 7.2953719427354791e-01 -1.2037343050002103e+00 -1.5379273013031853e+00 -5.3190369251323866e-01 -3.1353352205871010e+00 -9.6110186439349610e-01 -6.7103939565573985e+00 2.9331126472649274e+00 6.9449696566443331e-01 6.4247278840857343e+00 2.5299273364984360e+00 7.7695968296288842e-01 3.6978832681520228e+00 -2.6722505533214429e+00 -6.2637671541412288e-01 -4.0177734263086196e+00 -2.4622515711617332e+00 -8.1963374736697714e-01 -3.6442595393854020e+00 2.8193863247416555e+00 6.5202679933329055e-01 3.9806427315483512e+00 2.3634052344259162e+00 8.0417461824078473e-01 2.5950607481395616e+00 -2.3759941978606598e+00 -5.2054573902680079e-01 -2.3258877096742450e+00 -7.4349767258258792e+00 -1.9757592815029827e+00 -2.8662607995560445e+00 7.9970652825098814e+00 1.6837870433992217e+00 2.5299273364984356e+00 1.0918869431841635e+01 2.2044311918091988e+00 2.7025044147807376e+00 -1.0760713179954879e+01 -1.7858276094907946e+00 -3.0199304230940269e+00 -6.0920579039072020e+00 -1.8338626868807870e+00 -2.2387162861047551e+00 5.9628226696037157e+00 1.2887616548856493e+00 2.6950262119259607e+00 7.2696018323561100e+00 1.8357271771672909e+00 2.5653730054669035e+00 -7.8606114066233861e+00 -1.4172574893867955e+00 -2.3679234599172014e+00 -1.9312649392005998e+00 -3.3225232782310892e+00 -1.1265650562072247e+00 1.6785172552488512e+00 3.0218235363307770e+00 7.7695968296288842e-01 2.2044311918091988e+00 5.9530294504558352e+00 1.0253033994726488e+00 -1.7704123762051278e+00 -5.6130985875567534e+00 -9.6623444227249489e-01 -1.8607745850137447e+00 -1.9777965273244760e+00 -8.6476249029587526e-01 1.6153546732791015e+00 1.6810610518496638e+00 9.5067704147667342e-01 1.8576329428961720e+00 3.2565907548725859e+00 1.0029405862457541e+00 -1.7934841628138520e+00 -2.9990864003965436e+00 -7.9831872138236615e-01 -2.4992896453225804e+00 -1.0076155316179369e+00 -3.9845491172840544e+00 2.4962201405426701e+00 7.6814800792356352e-01 3.6978832681520228e+00 2.7025044147807376e+00 1.0253033994726488e+00 6.3740273171957931e+00 -3.0439015222511538e+00 -9.8187257066374645e-01 -6.6739223954000693e+00 -2.2197999836453692e+00 -8.4505252159410349e-01 -2.3008369325334352e+00 2.3619116233460709e+00 6.7071634259617907e-01 2.5910888212568048e+00 2.6076134326094533e+00 1.0065538687103910e+00 3.9100637661932471e+00 -2.4052584600598288e+00 -6.3618099482699553e-01 -3.6137547275803024e+00 7.3109508711425466e+00 1.5483454230081715e+00 2.9707941875787842e+00 -7.8917624293525579e+00 -1.2340465479663822e+00 -2.6722505533214429e+00 -1.0760713179954879e+01 -1.7704123762051278e+00 -3.0439015222511534e+00 1.0719412631023545e+01 1.3689416316314169e+00 3.3431996761326523e+00 5.9256228341130237e+00 1.5946471510965172e+00 2.3799109757131811e+00 -5.8511555621994296e+00 -1.0671354071380945e+00 -2.8240214551535217e+00 -7.1286175529163929e+00 -1.6313255817227885e+00 -2.8891602334232154e+00 7.6762623881441439e+00 1.1909857072962873e+00 2.7354289247247077e+00 1.5549757623131346e+00 2.9882656703265003e+00 9.5925413885305111e-01 -1.2555085780307313e+00 -2.8313832364474054e+00 -6.2637671541412288e-01 -1.7858276094907948e+00 -5.6130985875567534e+00 -9.8187257066374667e-01 1.3689416316314169e+00 5.5036856922372301e+00 8.2219407320053772e-01 1.3182919728666034e+00 1.6576981650743474e+00 6.9032127191255388e-01 -1.0957638121546285e+00 -1.5238195449224636e+00 -6.7614953277947587e-01 -1.3313722664231795e+00 -2.9869919292428295e+00 -8.3353245593244396e-01 1.2262628992881797e+00 2.8056437705313746e+00 6.4616179082364444e-01 2.9481879224940792e+00 9.4648724245200055e-01 4.3510713367486069e+00 -2.9939858071642220e+00 -6.8811106049860937e-01 -4.0177734263086204e+00 -3.0199304230940269e+00 -9.6623444227249511e-01 -6.6739223954000693e+00 3.3431996761326528e+00 8.2219407320053783e-01 7.1784546793153474e+00 2.6614209121897017e+00 9.2476623776728728e-01 2.5580567362876279e+00 -2.7865200160195798e+00 -6.4974962880790421e-01 -2.9862310543020216e+00 -2.8425109183672737e+00 -1.0061091246468932e+00 -4.3204538419974217e+00 2.6901386538286713e+00 6.1675670280607620e-01 3.9107979656565490e+00 7.3419075305143444e+00 1.8962754672318989e+00 2.6644771184306975e+00 -7.9369644837914377e+00 -1.4905679557464737e+00 -2.4622515711617332e+00 -6.0920579039072020e+00 -1.8607745850137445e+00 -2.2197999836453692e+00 5.9256228341130246e+00 1.3182919728666034e+00 2.6614209121897017e+00 1.0730737038399598e+01 2.1275368352594199e+00 2.6758237593639405e+00 -1.0505272457336289e+01 -1.7141589674957969e+00 -2.9833613716095857e+00 -7.1678344061398338e+00 -1.8688976618533968e+00 -2.7148789905572790e+00 7.7038618481477963e+00 1.5922948947514899e+00 2.3785701269896200e+00 1.8814701731320689e+00 3.2332227911545455e+00 1.0281791538357932e+00 -1.8107659530383426e+00 -2.9914871520915725e+00 -8.1963374736697714e-01 -1.8338626868807870e+00 -1.9777965273244760e+00 -8.4505252159410349e-01 1.5946471510965168e+00 1.6576981650743474e+00 9.2476623776728728e-01 2.1275368352594199e+00 5.8510972520285645e+00 1.0010243676002688e+00 -1.6831530298696165e+00 -5.4596481233842082e+00 -9.3135986710620389e-01 -1.8190814669792910e+00 -3.2362072720550290e+00 -1.0564347580285867e+00 1.5432089772800310e+00 2.9231208665978294e+00 6.9851113489251881e-01 2.6756011372666442e+00 1.0416297694008190e+00 3.9291903570718736e+00 -2.4916381802640011e+00 -6.8354379022632117e-01 -3.6442595393854025e+00 -2.2387162861047556e+00 -8.6476249029587549e-01 -2.3008369325334352e+00 2.3799109757131811e+00 6.9032127191255388e-01 2.5580567362876279e+00 2.6758237593639405e+00 1.0010243676002688e+00 6.3145786066996532e+00 -3.0063800512800709e+00 -9.5506129213097724e-01 -6.5568546212606602e+00 -2.4009256270153081e+00 -9.5962591798907693e-01 -3.8866397324788222e+00 2.4063242723203682e+00 7.3001808172860883e-01 3.5867651255991619e+00 -7.2172151288602038e+00 -1.6862515412058463e+00 -2.9829074466892695e+00 7.7742613656192532e+00 1.2577103100894673e+00 2.8193863247416564e+00 5.9628226696037165e+00 1.6153546732791015e+00 2.3619116233460709e+00 -5.8511555621994296e+00 -1.0957638121546283e+00 -2.7865200160195802e+00 -1.0505272457336289e+01 -1.6831530298696169e+00 -3.0063800512800700e+00 1.0400173126292431e+01 1.2876065417505551e+00 3.2951773976335317e+00 7.0697114630863869e+00 1.4319225946823830e+00 2.8124152011431782e+00 -7.6333254762058669e+00 -1.1274257365714155e+00 -2.5130830328755085e+00 -1.3315557801639279e+00 -2.9660266218941804e+00 -8.4287790844381960e-01 1.2184103987120514e+00 2.8049532580755430e+00 6.5202679933329055e-01 1.2887616548856493e+00 1.6810610518496638e+00 6.7071634259617918e-01 -1.0671354071380943e+00 -1.5238195449224636e+00 -6.4974962880790421e-01 -1.7141589674957971e+00 -5.4596481233842082e+00 -9.5506129213097735e-01 1.2876065417505556e+00 5.3044140928557288e+00 7.8415699095922409e-01 1.4764518554472887e+00 2.9283219009142609e+00 9.0493031094915999e-01 -1.1583802959977252e+00 -2.7692560134943434e+00 -5.6414161445515076e-01 -2.9397513401755564e+00 -1.0483765817156019e+00 -4.3741168226563909e+00 2.8104572620711656e+00 6.7140986209649234e-01 3.9806427315483512e+00 2.6950262119259607e+00 9.5067704147667342e-01 2.5910888212568048e+00 -2.8240214551535217e+00 -6.7614953277947587e-01 -2.9862310543020216e+00 -2.9833613716095861e+00 -9.3135986710620400e-01 -6.5568546212606602e+00 3.2951773976335317e+00 7.8415699095922398e-01 7.0065939452219288e+00 2.8417394323499798e+00 8.8801021650217882e-01 4.2528020748433608e+00 -2.8952661370419732e+00 -6.3836812943328658e-01 -3.9139250746513654e+00 -5.4460760302297588e+00 -1.7043072280296361e+00 -2.6597354767719978e+00 5.9322392210989694e+00 1.3130760721056514e+00 2.3634052344259162e+00 7.2696018323561091e+00 1.8576329428961720e+00 2.6076134326094533e+00 -7.1286175529163929e+00 -1.3313722664231795e+00 -2.8425109183672737e+00 -7.1678344061398338e+00 -1.8190814669792907e+00 -2.4009256270153085e+00 7.0697114630863869e+00 1.4764518554472887e+00 2.8417394323499798e+00 9.9298984445382565e+00 1.9316410182857040e+00 3.0432311006386219e+00 -1.0458922971793738e+01 -1.7240409273027091e+00 -2.9528171778693828e+00 -1.6987343161130621e+00 -1.9622986593842495e+00 -1.0805127253107618e+00 1.6565779192974883e+00 1.6890892092416139e+00 8.0417461824078473e-01 1.8357271771672905e+00 3.2565907548725859e+00 1.0065538687103912e+00 -1.6313255817227885e+00 -2.9869919292428295e+00 -1.0061091246468932e+00 -1.8688976618533968e+00 -3.2362072720550286e+00 -9.5962591798907704e-01 1.4319225946823830e+00 2.9283219009142605e+00 8.8801021650217871e-01 1.9316410182857031e+00 5.8239093349609696e+00 1.2089441204022136e+00 -1.6569111497436184e+00 -5.5124133393073222e+00 -8.6143505590883285e-01 -2.6522212398204652e+00 -1.0810012498501234e+00 -2.9583531824225533e+00 2.7169861307276992e+00 7.2953719427354802e-01 2.5950607481395616e+00 2.5653730054669035e+00 1.0029405862457541e+00 3.9100637661932471e+00 -2.8891602334232154e+00 -8.3353245593244418e-01 -4.3204538419974217e+00 -2.7148789905572790e+00 -1.0564347580285867e+00 -3.8866397324788222e+00 2.8124152011431782e+00 9.0493031094916010e-01 4.2528020748433608e+00 3.0432311006386219e+00 1.2089441204022136e+00 6.9582191526118482e+00 -2.8817449741754433e+00 -8.7538374805952146e-01 -6.5506989848892152e+00 5.9123470231106072e+00 1.6761741665868428e+00 2.7418172908871874e+00 -6.5272786637484348e+00 -1.2037343050002103e+00 -2.3759941978606598e+00 -7.8606114066233861e+00 -1.7934841628138523e+00 -2.4052584600598292e+00 7.6762623881441439e+00 1.2262628992881794e+00 2.6901386538286722e+00 7.7038618481477954e+00 1.5432089772800315e+00 2.4063242723203682e+00 -7.6333254762058669e+00 -1.1583802959977250e+00 -2.8952661370419732e+00 -1.0458922971793738e+01 -1.6569111497436189e+00 -2.8817449741754437e+00 1.1187667258968879e+01 1.3668638704003524e+00 2.7199835521016693e+00 1.2719813313024604e+00 1.6456003948049549e+00 7.0775279916323730e-01 -1.1534016504896696e+00 -1.5379273013031853e+00 -5.2054573902680079e-01 -1.4172574893867955e+00 -2.9990864003965436e+00 -6.3618099482699542e-01 1.1909857072962875e+00 2.8056437705313746e+00 6.1675670280607608e-01 1.5922948947514899e+00 2.9231208665978294e+00 7.3001808172860871e-01 -1.1274257365714155e+00 -2.7692560134943434e+00 -6.3836812943328647e-01 -1.7240409273027086e+00 -5.5124133393073222e+00 -8.7538374805952113e-01 1.3668638704003524e+00 5.4443180225672343e+00 6.1595102764867993e-01 2.3260251582579112e+00 7.9517513089474523e-01 2.5491824377014995e+00 -2.3261840914118133e+00 -5.3190369251323866e-01 -2.3258877096742450e+00 -2.3679234599172010e+00 -7.9831872138236604e-01 -3.6137547275803024e+00 2.7354289247247072e+00 6.4616179082364444e-01 3.9107979656565490e+00 2.3785701269896196e+00 6.9851113489251870e-01 3.5867651255991619e+00 -2.5130830328755080e+00 -5.6414161445515076e-01 -3.9139250746513659e+00 -2.9528171778693832e+00 -8.6143505590883285e-01 -6.5506989848892152e+00 2.7199835521016689e+00 6.1595102764867993e-01 6.3575209678379156e+00 354 355 356 402 403 404 414 415 416 366 367 368 357 358 359 405 406 407 417 418 419 369 370 371 9.3943612454564676e+00 1.9314829921438874e+00 3.0070527783917540e+00 -9.8531426339603918e+00 -1.6751947830995608e+00 -2.8675916661174350e+00 -6.7413933002882240e+00 -1.7939083228709636e+00 -2.2580090315643786e+00 6.6187554635239527e+00 1.4129207661353249e+00 2.7138924603515675e+00 6.7156669253704235e+00 1.7517114482622147e+00 2.4477872559235139e+00 -6.5962710049411060e+00 -1.2012334901056654e+00 -2.7123090914531396e+00 -4.9349996335246962e+00 -1.5754605467936473e+00 -2.4409492992339361e+00 5.3970229383635724e+00 1.1496819363284101e+00 2.1101265937020526e+00 1.9314829921438870e+00 5.4840176951450452e+00 1.2371099294091812e+00 -1.6876346232546844e+00 -5.0804509347381854e+00 -8.7481128270384434e-01 -1.8415283201935697e+00 -3.0406198765534036e+00 -9.3372272231008924e-01 1.4123150815192262e+00 2.6948579149051914e+00 8.7524983217680052e-01 1.7655030595269867e+00 3.0033642820066051e+00 9.7287946971597461e-01 -1.5544907858145336e+00 -2.7313217749894250e+00 -9.8038882316811493e-01 -1.5808990308341202e+00 -1.8235325860354294e+00 -1.0217528779102214e+00 1.5552516269068071e+00 1.4936852802596001e+00 7.2543647479031304e-01 3.0070527783917540e+00 1.2371099294091812e+00 6.6126138971633237e+00 -2.8755385312422947e+00 -8.7062839327202435e-01 -6.1069953451035897e+00 -2.6275513333886469e+00 -1.0551668583325795e+00 -3.6075174783400459e+00 2.7323671730868213e+00 8.8330295000692849e-01 3.9843107498356747e+00 2.4305534764938663e+00 9.5739818114459796e-01 3.6070810619697253e+00 -2.7528850746489533e+00 -7.7156993671012297e-01 -4.0649670265539104e+00 -2.4417209830664905e+00 -1.0185726648632105e+00 -2.7437619635550865e+00 2.5277224943739434e+00 6.3812679261722927e-01 2.3192361045839078e+00 -9.8531426339603883e+00 -1.6876346232546842e+00 -2.8755385312422943e+00 1.0519151093102229e+01 1.3409160020251916e+00 2.6575724953512863e+00 7.3042799476688618e+00 1.5433303015434736e+00 2.2517921262854270e+00 -7.2030772012836923e+00 -1.1099144145462971e+00 -2.7624232920020542e+00 -7.3154958585624348e+00 -1.6801400268745250e+00 -2.2533244909597450e+00 7.1539706740090745e+00 1.0826462923915292e+00 2.5785494108805351e+00 5.4161994826295903e+00 1.5362733105162742e+00 2.5077452761019239e+00 -6.0218855036032384e+00 -1.0254768418009619e+00 -2.1043729944150766e+00 -1.6751947830995606e+00 -5.0804509347381845e+00 -8.7062839327202390e-01 1.3409160020251913e+00 4.9343406201342015e+00 6.0760807085183377e-01 1.5410475361674736e+00 2.7258201287998514e+00 6.8998710032691679e-01 -1.0867723349355443e+00 -2.5421170635751511e+00 -6.0944232750860472e-01 -1.3536300737410585e+00 -2.7511562996720729e+00 -6.0890859403598330e-01 1.1170246859935542e+00 2.5695364894548161e+00 5.9497613758089696e-01 1.1855536929428627e+00 1.5353749245606401e+00 6.5840051009875844e-01 -1.0689447253529183e+00 -1.3913478649640993e+00 -4.6199250404179348e-01 -2.8675916661174354e+00 -8.7481128270384434e-01 -6.1069953451035888e+00 2.6575724953512867e+00 6.0760807085183366e-01 5.8277051304674377e+00 2.2841842352309190e+00 7.0198736183833632e-01 3.3188376990769459e+00 -2.4309979930080066e+00 -5.4889227112063999e-01 -3.6429011190548932e+00 -2.2271105370344935e+00 -7.4601745456196966e-01 -3.3220304084848165e+00 2.5924926305381639e+00 5.7931312604789720e-01 3.6582611608938751e+00 2.1460306912849081e+00 7.3458373968117507e-01 2.3666255522240220e+00 -2.1545798562453418e+00 -4.5377129003278827e-01 -2.0995026700189809e+00 -6.7413933002882240e+00 -1.8415283201935693e+00 -2.6275513333886473e+00 7.3042799476688618e+00 1.5410475361674738e+00 2.2841842352309190e+00 9.8807047659366383e+00 2.0497514827615455e+00 2.4243075672818781e+00 -9.7185007357960487e+00 -1.6213630345629577e+00 -2.7521869589624419e+00 -5.5795251178017971e+00 -1.7131152557535900e+00 -2.0160597014148567e+00 5.4492870269883227e+00 1.1638625269509424e+00 2.4787001646832834e+00 6.5969170812272280e+00 1.7054668024506918e+00 2.3397481404728575e+00 -7.1917696679349792e+00 -1.2841217378205358e+00 -2.1311421139029894e+00 -1.7939083228709634e+00 -3.0406198765534036e+00 -1.0551668583325795e+00 1.5433303015434736e+00 2.7258201287998514e+00 7.0198736183833643e-01 2.0497514827615455e+00 5.3828624370396811e+00 9.3765127586239316e-01 -1.6140149125570753e+00 -5.0269172387258028e+00 -8.8734119991114158e-01 -1.7395777699936537e+00 -1.8366420337964613e+00 -7.9486331469800597e-01 1.4916665490346945e+00 1.5292476580405703e+00 8.8777772088506568e-01 1.7269339626967632e+00 2.9811511366409911e+00 9.3502327475357438e-01 -1.6641812906147837e+00 -2.7149022114454260e+00 -7.2506826039764216e-01 -2.2580090315643786e+00 -9.3372272231008913e-01 -3.6075174783400459e+00 2.2517921262854275e+00 6.8998710032691690e-01 3.3188376990769459e+00 2.4243075672818777e+00 9.3765127586239316e-01 5.6993676372143822e+00 -2.7691403714621670e+00 -8.9646965910180110e-01 -5.9937995471932588e+00 -1.9988616269351991e+00 -7.7609027201465797e-01 -2.0743960312390963e+00 2.1442560848589420e+00 6.0657143553699722e-01 2.3606716669076384e+00 2.3763648197452971e+00 9.3692336377686147e-01 3.5448560483545926e+00 -2.1707095682097997e+00 -5.6485052207662012e-01 -3.2480199947811590e+00 6.6187554635239527e+00 1.4123150815192262e+00 2.7323671730868213e+00 -7.2030772012836932e+00 -1.0867723349355440e+00 -2.4309979930080066e+00 -9.7185007357960469e+00 -1.6140149125570749e+00 -2.7691403714621665e+00 9.6871234865797557e+00 1.2043870145672859e+00 3.0770407628256633e+00 5.4121908827096572e+00 1.4705003063381066e+00 2.1618817061835491e+00 -5.3432022716978489e+00 -9.4042857740373564e-01 -2.6111947998801726e+00 -6.4613306535897150e+00 -1.5013359184308053e+00 -2.6666288079735252e+00 7.0080410295539393e+00 1.0553493409025416e+00 2.5066723302278349e+00 1.4129207661353247e+00 2.6948579149051910e+00 8.8330295000692849e-01 -1.1099144145462971e+00 -2.5421170635751511e+00 -5.4889227112064010e-01 -1.6213630345629575e+00 -5.0269172387258028e+00 -8.9646965910180132e-01 1.2043870145672857e+00 4.9299469001566543e+00 7.3254583358328407e-01 1.1881357685529077e+00 1.5045518066081303e+00 6.2343485744399574e-01 -9.6535381494439132e-01 -1.3793893586019945e+00 -6.0388416104029730e-01 -1.1944905360159748e+00 -2.7056379053779982e+00 -7.6108793290627719e-01 1.0856782508141021e+00 2.5247049446109724e+00 5.7105038313480705e-01 2.7138924603515671e+00 8.7524983217680052e-01 3.9843107498356747e+00 -2.7624232920020542e+00 -6.0944232750860472e-01 -3.6429011190548932e+00 -2.7521869589624428e+00 -8.8734119991114158e-01 -5.9937995471932579e+00 3.0770407628256633e+00 7.3254583358328396e-01 6.5186913563481088e+00 2.4495306622503144e+00 8.6282986090446767e-01 2.3303118680671324e+00 -2.5762872689251131e+00 -5.8043534687454112e-01 -2.7716733758458276e+00 -2.6151493294261208e+00 -9.3907677124416600e-01 -3.9708268493504355e+00 2.4655829638881857e+00 5.4567011887390138e-01 3.5458869171934957e+00 6.7156669253704235e+00 1.7655030595269867e+00 2.4305534764938663e+00 -7.3154958585624348e+00 -1.3536300737410585e+00 -2.2271105370344935e+00 -5.5795251178017962e+00 -1.7395777699936534e+00 -1.9988616269351991e+00 5.4121908827096572e+00 1.1881357685529079e+00 2.4495306622503144e+00 9.9605863989167336e+00 1.9932797080727063e+00 2.4272129337797370e+00 -9.7312893335395056e+00 -1.5803632324826766e+00 -2.7366264346889642e+00 -6.5658370351599356e+00 -1.7443031112280154e+00 -2.4971193624452321e+00 7.1037031380668569e+00 1.4709556512928030e+00 2.1524208885799698e+00 1.7517114482622147e+00 3.0033642820066051e+00 9.5739818114459818e-01 -1.6801400268745250e+00 -2.7511562996720729e+00 -7.4601745456196977e-01 -1.7131152557535900e+00 -1.8366420337964613e+00 -7.7609027201465797e-01 1.4705003063381064e+00 1.5045518066081298e+00 8.6282986090446756e-01 1.9932797080727067e+00 5.4956491181538656e+00 9.2384309842171475e-01 -1.5398604733339312e+00 -5.0900809227168411e+00 -8.5563448201938486e-01 -1.6952551153074584e+00 -3.0170023153984920e+00 -9.9347327786013673e-01 1.4128794085964762e+00 2.6913163648152665e+00 6.2714434598536839e-01 2.4477872559235139e+00 9.7287946971597450e-01 3.6070810619697253e+00 -2.2533244909597450e+00 -6.0890859403598341e-01 -3.3220304084848165e+00 -2.0160597014148571e+00 -7.9486331469800608e-01 -2.0743960312390963e+00 2.1618817061835491e+00 6.2343485744399585e-01 2.3303118680671324e+00 2.4272129337797370e+00 9.2384309842171475e-01 5.8623000517618644e+00 -2.7680876396565681e+00 -8.8705020768858056e-01 -6.0990902288505868e+00 -2.1785945224668124e+00 -8.9154247196070113e-01 -3.5808202280285855e+00 2.1791844586111830e+00 6.6220716280158554e-01 3.2766439148043598e+00 -6.5962710049411060e+00 -1.5544907858145338e+00 -2.7528850746489533e+00 7.1539706740090745e+00 1.1170246859935542e+00 2.5924926305381639e+00 5.4492870269883227e+00 1.4916665490346945e+00 2.1442560848589425e+00 -5.3432022716978489e+00 -9.6535381494439143e-01 -2.5762872689251131e+00 -9.7312893335395056e+00 -1.5398604733339312e+00 -2.7680876396565686e+00 9.6366827097982277e+00 1.1462904491601351e+00 3.0569799184913387e+00 6.4679902071155482e+00 1.3032990653264429e+00 2.5963270310917488e+00 -7.0371680077327081e+00 -9.9857567542197034e-01 -2.2927956817495558e+00 -1.2012334901056654e+00 -2.7313217749894254e+00 -7.7156993671012297e-01 1.0826462923915292e+00 2.5695364894548161e+00 5.7931312604789709e-01 1.1638625269509424e+00 1.5292476580405703e+00 6.0657143553699722e-01 -9.4042857740373553e-01 -1.3793893586019945e+00 -5.8043534687454112e-01 -1.5803632324826766e+00 -5.0900809227168411e+00 -8.8705020768858034e-01 1.1462904491601349e+00 4.9480567758606737e+00 7.0592223258270181e-01 1.3547017841371012e+00 2.6986862974264030e+00 8.4168997748006746e-01 -1.0254757526476301e+00 -2.5447351644742016e+00 -4.9444128037441881e-01 -2.7123090914531396e+00 -9.8038882316811493e-01 -4.0649670265539104e+00 2.5785494108805351e+00 5.9497613758089707e-01 3.6582611608938751e+00 2.4787001646832838e+00 8.8777772088506579e-01 2.3606716669076384e+00 -2.6111947998801726e+00 -6.0388416104029730e-01 -2.7716733758458276e+00 -2.7366264346889642e+00 -8.5563448201938497e-01 -6.0990902288505859e+00 3.0569799184913382e+00 7.0592223258270181e-01 6.5683908565753297e+00 2.6215249644353893e+00 8.1905922315179458e-01 3.9542052846909677e+00 -2.6756241324682697e+00 -5.6782784797266161e-01 -3.6057983378174843e+00 -4.9349996335246953e+00 -1.5808990308341202e+00 -2.4417209830664905e+00 5.4161994826295903e+00 1.1855536929428627e+00 2.1460306912849081e+00 6.5969170812272280e+00 1.7269339626967635e+00 2.3763648197452967e+00 -6.4613306535897159e+00 -1.1944905360159748e+00 -2.6151493294261208e+00 -6.5658370351599364e+00 -1.6952551153074586e+00 -2.1785945224668124e+00 6.4679902071155473e+00 1.3547017841371012e+00 2.6215249644353893e+00 9.0438322018264898e+00 1.7898683017238908e+00 2.7977113149451229e+00 -9.5627716505245068e+00 -1.5864130593430643e+00 -2.7061669554512924e+00 -1.5754605467936473e+00 -1.8235325860354294e+00 -1.0185726648632105e+00 1.5362733105162742e+00 1.5353749245606401e+00 7.3458373968117507e-01 1.7054668024506918e+00 2.9811511366409911e+00 9.3692336377686147e-01 -1.5013359184308055e+00 -2.7056379053779978e+00 -9.3907677124416600e-01 -1.7443031112280154e+00 -3.0170023153984920e+00 -8.9154247196070113e-01 1.3032990653264429e+00 2.6986862974264030e+00 8.1905922315179458e-01 1.7898683017238910e+00 5.3683116355706293e+00 1.1398768763132527e+00 -1.5138079035648306e+00 -5.0373511873867436e+00 -7.8125129485500544e-01 -2.4409492992339361e+00 -1.0217528779102214e+00 -2.7437619635550865e+00 2.5077452761019239e+00 6.5840051009875844e-01 2.3666255522240216e+00 2.3397481404728575e+00 9.3502327475357450e-01 3.5448560483545926e+00 -2.6666288079735256e+00 -7.6108793290627719e-01 -3.9708268493504351e+00 -2.4971193624452326e+00 -9.9347327786013662e-01 -3.5808202280285850e+00 2.5963270310917488e+00 8.4168997748006746e-01 3.9542052846909677e+00 2.7977113149451234e+00 1.1398768763132530e+00 6.4176855397232133e+00 -2.6368342929589583e+00 -7.9867654996901805e-01 -5.9879633840586877e+00 5.3970229383635724e+00 1.5552516269068071e+00 2.5277224943739434e+00 -6.0218855036032384e+00 -1.0689447253529183e+00 -2.1545798562453418e+00 -7.1917696679349792e+00 -1.6641812906147837e+00 -2.1707095682097992e+00 7.0080410295539401e+00 1.0856782508141021e+00 2.4655829638881852e+00 7.1037031380668578e+00 1.4128794085964762e+00 2.1791844586111830e+00 -7.0371680077327072e+00 -1.0254757526476301e+00 -2.6756241324682701e+00 -9.5627716505245068e+00 -1.5138079035648306e+00 -2.6368342929589583e+00 1.0304827723811059e+01 1.2186003858627765e+00 2.4652579330090560e+00 1.1496819363284101e+00 1.4936852802596001e+00 6.3812679261722927e-01 -1.0254768418009617e+00 -1.3913478649640993e+00 -4.5377129003278827e-01 -1.2841217378205356e+00 -2.7149022114454260e+00 -5.6485052207662012e-01 1.0553493409025418e+00 2.5247049446109724e+00 5.4567011887390127e-01 1.4709556512928030e+00 2.6913163648152665e+00 6.6220716280158565e-01 -9.9857567542197023e-01 -2.5447351644742016e+00 -5.6782784797266161e-01 -1.5864130593430641e+00 -5.0373511873867436e+00 -7.9867654996901805e-01 1.2186003858627763e+00 4.9786298385846317e+00 5.3912213575837131e-01 2.1101265937020526e+00 7.2543647479031292e-01 2.3192361045839078e+00 -2.1043729944150766e+00 -4.6199250404179354e-01 -2.0995026700189805e+00 -2.1311421139029894e+00 -7.2506826039764205e-01 -3.2480199947811590e+00 2.5066723302278349e+00 5.7105038313480705e-01 3.5458869171934961e+00 2.1524208885799698e+00 6.2714434598536828e-01 3.2766439148043598e+00 -2.2927956817495563e+00 -4.9444128037441892e-01 -3.6057983378174847e+00 -2.7061669554512919e+00 -7.8125129485500544e-01 -5.9879633840586877e+00 2.4652579330090560e+00 5.3912213575837131e-01 5.7995174500945481e+00 300 301 302 366 367 368 378 379 380 315 316 317 303 304 305 369 370 371 381 382 383 318 319 320 8.8858402982250055e+00 2.6993055604345155e+00 2.6993055604345173e+00 -9.4116879688430561e+00 -2.6125330223072849e+00 -2.6125330223072845e+00 -6.1646072814072026e+00 -2.4504869377980989e+00 -1.9769087827715368e+00 6.1664549386758480e+00 2.1872755762446139e+00 2.4300969414052171e+00 6.1664549386758400e+00 2.4300969414052176e+00 2.1872755762446139e+00 -6.1646072814071955e+00 -1.9769087827715381e+00 -2.4504869377980976e+00 -4.3918409683927182e+00 -2.1404077106576920e+00 -2.1404077106576933e+00 4.9139933244734788e+00 1.8636583754502660e+00 1.8636583754502660e+00 2.6993055604345155e+00 6.6115985317605430e+00 1.7942873956020622e+00 -2.6319926255498638e+00 -6.1404382000121176e+00 -1.4167791225909820e+00 -2.5257308587110372e+00 -3.9848025092319950e+00 -1.3086421336551901e+00 2.1877903124687532e+00 3.5509478204849527e+00 1.3780632471379102e+00 2.4643642135708461e+00 3.9060821401811991e+00 1.3987794933786237e+00 -2.3345214783055352e+00 -3.5461247580237436e+00 -1.4943194953221917e+00 -2.1623164138253910e+00 -2.6193493171417233e+00 -1.4389856952990308e+00 2.3031012899177119e+00 2.2220862919828841e+00 1.0875963107487996e+00 2.6993055604345177e+00 1.7942873956020622e+00 6.6115985317605439e+00 -2.6319926255498647e+00 -1.4167791225909825e+00 -6.1404382000121176e+00 -2.3345214783055366e+00 -1.4943194953221928e+00 -3.5461247580237485e+00 2.4643642135708475e+00 1.3987794933786240e+00 3.9060821401812054e+00 2.1877903124687532e+00 1.3780632471379111e+00 3.5509478204849478e+00 -2.5257308587110372e+00 -1.3086421336551912e+00 -3.9848025092319879e+00 -2.1623164138253919e+00 -1.4389856952990305e+00 -2.6193493171417255e+00 2.3031012899177132e+00 1.0875963107488003e+00 2.2220862919828841e+00 -9.4116879688430579e+00 -2.6319926255498638e+00 -2.6319926255498651e+00 1.0164164949433344e+01 2.4552195465299227e+00 2.4552195465299214e+00 6.7943656130935874e+00 2.3834002016283975e+00 1.9999416161182093e+00 -6.8238319989701317e+00 -2.0586354757703407e+00 -2.5094241629544149e+00 -6.8238319989701228e+00 -2.5094241629544154e+00 -2.0586354757703416e+00 6.7943656130935803e+00 1.9999416161182109e+00 2.3834002016283966e+00 4.9198655870335459e+00 2.2508794066608866e+00 2.2508794066608884e+00 -5.6134097958707470e+00 -1.8893885066627980e+00 -1.8893885066627980e+00 -2.6125330223072849e+00 -6.1404382000121176e+00 -1.4167791225909825e+00 2.4552195465299227e+00 5.8805290714739007e+00 1.1194215047247495e+00 2.3932166760524303e+00 3.6056786170448714e+00 1.0761663845264660e+00 -2.0169320708028153e+00 -3.2890109815807476e+00 -1.1283095391643485e+00 -2.2266746074692212e+00 -3.5907876623167212e+00 -1.0252461768813932e+00 2.0588798594569386e+00 3.2885474240913766e+00 1.1043799300969057e+00 1.9230058349309926e+00 2.2739107122685631e+00 1.1115615084624428e+00 -1.9741822163909641e+00 -2.0284289809691263e+00 -8.4119448917384088e-01 -2.6125330223072840e+00 -1.4167791225909816e+00 -6.1404382000121176e+00 2.4552195465299214e+00 1.1194215047247493e+00 5.8805290714739016e+00 2.0588798594569391e+00 1.1043799300969057e+00 3.2885474240913815e+00 -2.2266746074692216e+00 -1.0252461768813927e+00 -3.5907876623167270e+00 -2.0169320708028136e+00 -1.1283095391643485e+00 -3.2890109815807405e+00 2.3932166760524285e+00 1.0761663845264660e+00 3.6056786170448629e+00 1.9230058349309922e+00 1.1115615084624419e+00 2.2739107122685640e+00 -1.9741822163909633e+00 -8.4119448917384043e-01 -2.0284289809691258e+00 -6.1646072814072026e+00 -2.5257308587110372e+00 -2.3345214783055366e+00 6.7943656130935874e+00 2.3932166760524303e+00 2.0588798594569391e+00 9.2341847399262562e+00 2.8160182589645215e+00 2.1054751690142757e+00 -9.2039455502775134e+00 -2.5012049260531182e+00 -2.4255238985489509e+00 -4.9766571231718792e+00 -2.3419281199735047e+00 -1.7838574256598394e+00 4.9735582453218186e+00 1.9151295769187342e+00 2.2146971910277351e+00 5.9752856438329847e+00 2.3109882561347908e+00 2.0207090286122456e+00 -6.6321842873180579e+00 -2.0664888633328156e+00 -1.8558584455968719e+00 -2.4504869377980989e+00 -3.9848025092319950e+00 -1.4943194953221928e+00 2.3834002016283975e+00 3.6056786170448709e+00 1.1043799300969059e+00 2.8160182589645215e+00 6.4570448065525943e+00 1.3086028017604148e+00 -2.4846123027686571e+00 -6.0175846979181209e+00 -1.3519103338893153e+00 -2.3865860008508624e+00 -2.6499707307098808e+00 -1.1216157348495626e+00 2.2146971910277360e+00 2.2660348892119884e+00 1.3145023371404949e+00 2.3556375959387177e+00 3.8155843272428132e+00 1.2977890191229160e+00 -2.4480680061417543e+00 -3.4919847021922692e+00 -1.0574285240596624e+00 -1.9769087827715373e+00 -1.3086421336551901e+00 -3.5461247580237485e+00 1.9999416161182095e+00 1.0761663845264660e+00 3.2885474240913815e+00 2.1054751690142761e+00 1.3086028017604145e+00 5.6851550785851668e+00 -2.4496855019064796e+00 -1.3738767012733768e+00 -5.9570521599295736e+00 -1.7467685248555473e+00 -1.0777501341419748e+00 -1.9987029351065351e+00 1.9151295769187322e+00 9.8679821582169547e-01 2.2660348892119870e+00 2.0708034992235644e+00 1.3032904782251906e+00 3.4292080163684275e+00 -1.9179870517412181e+00 -9.1458891126322550e-01 -3.1670655551971070e+00 6.1664549386758472e+00 2.1877903124687532e+00 2.4643642135708475e+00 -6.8238319989701317e+00 -2.0169320708028149e+00 -2.2266746074692216e+00 -9.2039455502775098e+00 -2.4846123027686571e+00 -2.4496855019064796e+00 9.2844012285800019e+00 2.1678903490821808e+00 2.7676831973800300e+00 4.9350677979312296e+00 2.1739977013900948e+00 1.9512472452811656e+00 -4.9766571231718801e+00 -1.7467685248555491e+00 -2.3865860008508610e+00 -5.9486589195032895e+00 -2.1888322653842001e+00 -2.3654642994320207e+00 6.5671696267357307e+00 1.9074668008701920e+00 2.2451157534265422e+00 2.1872755762446134e+00 3.5509478204849527e+00 1.3987794933786240e+00 -2.0586354757703407e+00 -3.2890109815807476e+00 -1.0252461768813925e+00 -2.5012049260531182e+00 -6.0175846979181209e+00 -1.3738767012733764e+00 2.1678903490821813e+00 5.7852582369545047e+00 1.3210460490745572e+00 1.9512472452811644e+00 2.2438275694062000e+00 1.0239188764064300e+00 -1.7838574256598378e+00 -1.9987029351065357e+00 -1.1216157348495612e+00 -1.9203269734207284e+00 -3.4643901948961049e+00 -1.2467047271443903e+00 1.9576116302960669e+00 3.1896551826558510e+00 1.0236989212891103e+00 2.4300969414052176e+00 1.3780632471379100e+00 3.9060821401812054e+00 -2.5094241629544149e+00 -1.1283095391643485e+00 -3.5907876623167279e+00 -2.4255238985489509e+00 -1.3519103338893150e+00 -5.9570521599295736e+00 2.7676831973800295e+00 1.3210460490745572e+00 6.4381098123899383e+00 2.1739977013900935e+00 1.2644681590179854e+00 2.2438275694062009e+00 -2.3419281199735025e+00 -1.0777501341419755e+00 -2.6499707307098799e+00 -2.2985491503501785e+00 -1.3836563193156786e+00 -3.8237974833934598e+00 2.2036474916517061e+00 9.7804887128086515e-01 3.4335885143722975e+00 6.1664549386758400e+00 2.4643642135708461e+00 2.1877903124687537e+00 -6.8238319989701228e+00 -2.2266746074692212e+00 -2.0169320708028136e+00 -4.9766571231718792e+00 -2.3865860008508624e+00 -1.7467685248555473e+00 4.9350677979312305e+00 1.9512472452811642e+00 2.1739977013900935e+00 9.2844012285799682e+00 2.7676831973800287e+00 2.1678903490821795e+00 -9.2039455502774796e+00 -2.4496855019064783e+00 -2.4846123027686544e+00 -5.9486589195032815e+00 -2.3654642994320185e+00 -2.1888322653842005e+00 6.5671696267357227e+00 2.2451157534265413e+00 1.9074668008701912e+00 2.4300969414052176e+00 3.9060821401811991e+00 1.3780632471379106e+00 -2.5094241629544154e+00 -3.5907876623167212e+00 -1.1283095391643485e+00 -2.3419281199735043e+00 -2.6499707307098808e+00 -1.0777501341419748e+00 2.1739977013900948e+00 2.2438275694062004e+00 1.2644681590179854e+00 2.7676831973800287e+00 6.4381098123899116e+00 1.3210460490745570e+00 -2.4255238985489491e+00 -5.9570521599295478e+00 -1.3519103338893146e+00 -2.2985491503501785e+00 -3.8237974833934527e+00 -1.3836563193156797e+00 2.2036474916517075e+00 3.4335885143722913e+00 9.7804887128086559e-01 2.1872755762446139e+00 1.3987794933786237e+00 3.5509478204849478e+00 -2.0586354757703416e+00 -1.0252461768813932e+00 -3.2890109815807405e+00 -1.7838574256598394e+00 -1.1216157348495626e+00 -1.9987029351065351e+00 1.9512472452811658e+00 1.0239188764064300e+00 2.2438275694062009e+00 2.1678903490821795e+00 1.3210460490745570e+00 5.7852582369544789e+00 -2.5012049260531164e+00 -1.3738767012733755e+00 -6.0175846979180969e+00 -1.9203269734207289e+00 -1.2467047271443901e+00 -3.4643901948961000e+00 1.9576116302960680e+00 1.0236989212891103e+00 3.1896551826558444e+00 -6.1646072814071937e+00 -2.3345214783055352e+00 -2.5257308587110372e+00 6.7943656130935803e+00 2.0588798594569391e+00 2.3932166760524285e+00 4.9735582453218186e+00 2.2146971910277360e+00 1.9151295769187322e+00 -4.9766571231718792e+00 -1.7838574256598378e+00 -2.3419281199735025e+00 -9.2039455502774796e+00 -2.4255238985489491e+00 -2.5012049260531168e+00 9.2341847399262278e+00 2.1054751690142757e+00 2.8160182589645180e+00 5.9752856438329776e+00 2.0207090286122438e+00 2.3109882561347912e+00 -6.6321842873180508e+00 -1.8558584455968710e+00 -2.0664888633328142e+00 -1.9769087827715379e+00 -3.5461247580237427e+00 -1.3086421336551912e+00 1.9999416161182109e+00 3.2885474240913766e+00 1.0761663845264660e+00 1.9151295769187342e+00 2.2660348892119884e+00 9.8679821582169558e-01 -1.7467685248555491e+00 -1.9987029351065357e+00 -1.0777501341419755e+00 -2.4496855019064787e+00 -5.9570521599295478e+00 -1.3738767012733755e+00 2.1054751690142752e+00 5.6851550785851428e+00 1.3086028017604139e+00 2.0708034992235653e+00 3.4292080163684213e+00 1.3032904782251920e+00 -1.9179870517412199e+00 -3.1670655551971012e+00 -9.1458891126322595e-01 -2.4504869377980976e+00 -1.4943194953221914e+00 -3.9848025092319879e+00 2.3834002016283966e+00 1.1043799300969057e+00 3.6056786170448629e+00 2.2146971910277351e+00 1.3145023371404951e+00 2.2660348892119870e+00 -2.3865860008508610e+00 -1.1216157348495612e+00 -2.6499707307098799e+00 -2.4846123027686549e+00 -1.3519103338893146e+00 -6.0175846979180969e+00 2.8160182589645175e+00 1.3086028017604139e+00 6.4570448065525667e+00 2.3556375959387159e+00 1.2977890191229147e+00 3.8155843272428065e+00 -2.4480680061417530e+00 -1.0574285240596615e+00 -3.4919847021922621e+00 -4.3918409683927173e+00 -2.1623164138253910e+00 -2.1623164138253919e+00 4.9198655870335468e+00 1.9230058349309929e+00 1.9230058349309920e+00 5.9752856438329847e+00 2.3556375959387181e+00 2.0708034992235644e+00 -5.9486589195032904e+00 -1.9203269734207287e+00 -2.2985491503501785e+00 -5.9486589195032824e+00 -2.2985491503501785e+00 -1.9203269734207289e+00 5.9752856438329776e+00 2.0708034992235653e+00 2.3556375959387159e+00 8.3617628837295257e+00 2.4260365926306071e+00 2.4260365926306080e+00 -8.9430409510297455e+00 -2.3942909851275838e+00 -2.3942909851275838e+00 -2.1404077106576920e+00 -2.6193493171417237e+00 -1.4389856952990305e+00 2.2508794066608870e+00 2.2739107122685636e+00 1.1115615084624417e+00 2.3109882561347903e+00 3.8155843272428132e+00 1.3032904782251906e+00 -2.1888322653842001e+00 -3.4643901948961049e+00 -1.3836563193156786e+00 -2.3654642994320185e+00 -3.8237974833934523e+00 -1.2467047271443898e+00 2.0207090286122438e+00 3.4292080163684213e+00 1.2977890191229144e+00 2.4260365926306071e+00 6.2212458094309220e+00 1.5844595236194503e+00 -2.3139090085646168e+00 -5.8324118698794400e+00 -1.2277537876708995e+00 -2.1404077106576933e+00 -1.4389856952990308e+00 -2.6193493171417255e+00 2.2508794066608884e+00 1.1115615084624426e+00 2.2739107122685636e+00 2.0207090286122456e+00 1.2977890191229160e+00 3.4292080163684275e+00 -2.3654642994320207e+00 -1.2467047271443901e+00 -3.8237974833934594e+00 -2.1888322653842005e+00 -1.3836563193156797e+00 -3.4643901948961000e+00 2.3109882561347908e+00 1.3032904782251920e+00 3.8155843272428069e+00 2.4260365926306076e+00 1.5844595236194503e+00 6.2212458094309255e+00 -2.3139090085646181e+00 -1.2277537876709002e+00 -5.8324118698794392e+00 4.9139933244734788e+00 2.3031012899177119e+00 2.3031012899177128e+00 -5.6134097958707478e+00 -1.9741822163909641e+00 -1.9741822163909633e+00 -6.6321842873180588e+00 -2.4480680061417543e+00 -1.9179870517412181e+00 6.5671696267357316e+00 1.9576116302960667e+00 2.2036474916517061e+00 6.5671696267357227e+00 2.2036474916517070e+00 1.9576116302960676e+00 -6.6321842873180508e+00 -1.9179870517412199e+00 -2.4480680061417526e+00 -8.9430409510297455e+00 -2.3139090085646172e+00 -2.3139090085646181e+00 9.7724867435916725e+00 2.1897858709730689e+00 2.1897858709730684e+00 1.8636583754502660e+00 2.2220862919828841e+00 1.0875963107488003e+00 -1.8893885066627980e+00 -2.0284289809691258e+00 -8.4119448917384043e-01 -2.0664888633328160e+00 -3.4919847021922692e+00 -9.1458891126322550e-01 1.9074668008701923e+00 3.1896551826558515e+00 9.7804887128086515e-01 2.2451157534265418e+00 3.4335885143722913e+00 1.0236989212891103e+00 -1.8558584455968710e+00 -3.1670655551971016e+00 -1.0574285240596615e+00 -2.3942909851275833e+00 -5.8324118698794392e+00 -1.2277537876709002e+00 2.1897858709730689e+00 5.6745611192269099e+00 9.5162160884885272e-01 1.8636583754502660e+00 1.0875963107487996e+00 2.2220862919828841e+00 -1.8893885066627980e+00 -8.4119448917384065e-01 -2.0284289809691258e+00 -1.8558584455968719e+00 -1.0574285240596624e+00 -3.1670655551971070e+00 2.2451157534265422e+00 1.0236989212891103e+00 3.4335885143722975e+00 1.9074668008701912e+00 9.7804887128086548e-01 3.1896551826558444e+00 -2.0664888633328147e+00 -9.1458891126322595e-01 -3.4919847021922621e+00 -2.3942909851275833e+00 -1.2277537876708995e+00 -5.8324118698794392e+00 2.1897858709730684e+00 9.5162160884885305e-01 5.6745611192269099e+00 366 367 368 414 415 416 426 427 428 378 379 380 369 370 371 417 418 419 429 430 431 381 382 383 7.9930612509684593e+00 2.4741476693225928e+00 2.4741476693225946e+00 -8.5056857703509561e+00 -2.3827217355745232e+00 -2.3827217355745223e+00 -5.5951685511818212e+00 -2.2624568280439341e+00 -1.7889588912488990e+00 5.5964130140066297e+00 1.9945162629827893e+00 2.2428299194592825e+00 5.5964130140066359e+00 2.2428299194592842e+00 1.9945162629827882e+00 -5.5951685511818257e+00 -1.7889588912488998e+00 -2.2624568280439359e+00 -3.9835632872600439e+00 -1.9726627761566764e+00 -1.9726627761566766e+00 4.4936988809929233e+00 1.6953063792593670e+00 1.6953063792593659e+00 2.4741476693225923e+00 6.0150514965060644e+00 1.6780910871948915e+00 -2.4126818557176191e+00 -5.5202196785606832e+00 -1.2886786056426041e+00 -2.3361302485165312e+00 -3.6700993276707230e+00 -1.2057548467584258e+00 2.0006994116324615e+00 3.2226986988235700e+00 1.2777525526392992e+00 2.2768626145187976e+00 3.5894124352857695e+00 1.2950054072549408e+00 -2.1461490793462565e+00 -3.2238086497337703e+00 -1.3956150701768610e+00 -1.9909334961511884e+00 -2.4405666930427219e+00 -1.3534692848882115e+00 2.1341849842577454e+00 2.0275317183924937e+00 9.9266876037696927e-01 2.4741476693225946e+00 1.6780910871948913e+00 6.0150514965060680e+00 -2.4126818557176213e+00 -1.2886786056426049e+00 -5.5202196785606850e+00 -2.1461490793462588e+00 -1.3956150701768617e+00 -3.2238086497337677e+00 2.2768626145187998e+00 1.2950054072549426e+00 3.5894124352857650e+00 2.0006994116324650e+00 1.2777525526393019e+00 3.2226986988235748e+00 -2.3361302485165338e+00 -1.2057548467584276e+00 -3.6700993276707292e+00 -1.9909334961511909e+00 -1.3534692848882126e+00 -2.4405666930427237e+00 2.1341849842577485e+00 9.9266876037697072e-01 2.0275317183924941e+00 -8.5056857703509561e+00 -2.4126818557176191e+00 -2.4126818557176213e+00 9.2704323991958262e+00 2.2203821884138866e+00 2.2203821884138866e+00 6.2240417867368203e+00 2.1967106768168430e+00 1.8083891979933118e+00 -6.2565512851011995e+00 -1.8598818629604938e+00 -2.3246179195784369e+00 -6.2565512851012057e+00 -2.3246179195784387e+00 -1.8598818629604918e+00 6.2240417867368256e+00 1.8083891979933127e+00 2.1967106768168443e+00 4.5049324090590703e+00 2.0859992897148745e+00 2.0859992897148749e+00 -5.2046600411751820e+00 -1.7142997146823649e+00 -1.7142997146823640e+00 -2.3827217355745232e+00 -5.5202196785606823e+00 -1.2886786056426049e+00 2.2203821884138870e+00 5.2630710481690350e+00 9.9037971477576825e-01 2.1984384149770531e+00 3.2736854326790867e+00 9.6888751771677661e-01 -1.8201385588653940e+00 -2.9584383667302800e+00 -1.0214549185240915e+00 -2.0323819461546919e+00 -3.2611836123035216e+00 -9.1551799739777451e-01 1.8599540542352317e+00 2.9605848360777136e+00 9.9703819810596361e-01 1.7494941323317454e+00 2.0776607696991092e+00 1.0146794620660138e+00 -1.7930265493633102e+00 -1.8351604290304595e+00 -7.4533337110004960e-01 -2.3827217355745218e+00 -1.2886786056426043e+00 -5.5202196785606850e+00 2.2203821884138861e+00 9.9037971477576836e-01 5.2630710481690333e+00 1.8599540542352309e+00 9.9703819810596306e-01 2.9605848360777083e+00 -2.0323819461546897e+00 -9.1551799739777517e-01 -3.2611836123035158e+00 -1.8201385588653947e+00 -1.0214549185240924e+00 -2.9584383667302836e+00 2.1984384149770531e+00 9.6888751771677717e-01 3.2736854326790907e+00 1.7494941323317450e+00 1.0146794620660136e+00 2.0776607696991092e+00 -1.7930265493633100e+00 -7.4533337110004994e-01 -1.8351604290304588e+00 -5.5951685511818212e+00 -2.3361302485165312e+00 -2.1461490793462588e+00 6.2240417867368203e+00 2.1984384149770531e+00 1.8599540542352306e+00 8.4667031650068711e+00 2.6127572861010089e+00 1.8986080588981546e+00 -8.4324556780230218e+00 -2.2916089309251326e+00 -2.2197771913006137e+00 -4.5651211867217043e+00 -2.1728434869688096e+00 -1.6048071945883637e+00 4.5574208888671741e+00 1.7437576440313176e+00 2.0432499645033673e+00 5.4847536041944780e+00 2.1381753068009695e+00 1.8452170228599503e+00 -6.1401740288787980e+00 -1.8925459854998743e+00 -1.6762956352614640e+00 -2.2624568280439341e+00 -3.6700993276707230e+00 -1.3956150701768617e+00 2.1967106768168430e+00 3.2736854326790867e+00 9.9703819810596306e-01 2.6127572861010093e+00 5.9639212902621459e+00 1.1949203599670235e+00 -2.2797058683674569e+00 -5.5068327952863303e+00 -1.2429209308772489e+00 -2.2199326196966220e+00 -2.4675150648905939e+00 -1.0237854001734934e+00 2.0432499645033659e+00 2.0723702682101868e+00 1.2253771241692717e+00 2.1835912350976039e+00 3.5613160258861751e+00 1.2042921972739833e+00 -2.2742138464108113e+00 -3.2268458291899496e+00 -9.5930647828863558e-01 -1.7889588912488987e+00 -1.2057548467584258e+00 -3.2238086497337672e+00 1.8083891979933118e+00 9.6888751771677661e-01 2.9605848360777092e+00 1.8986080588981542e+00 1.1949203599670235e+00 5.1874944569040853e+00 -2.2491368041439679e+00 -1.2651327347960404e+00 -5.4511458880917969e+00 -1.5751746121462300e+00 -9.8354513646042285e-01 -1.8081761363799620e+00 1.7437576440313169e+00 8.9718200670019654e-01 2.0723702682101872e+00 1.9022972481588893e+00 1.2139044966674082e+00 3.1669372254435966e+00 -1.7397818415425770e+00 -8.2046166303651535e-01 -2.9042561124300503e+00 5.5964130140066297e+00 2.0006994116324615e+00 2.2768626145187998e+00 -6.2565512851011986e+00 -1.8201385588653938e+00 -2.0323819461546897e+00 -8.4324556780230218e+00 -2.2797058683674569e+00 -2.2491368041439679e+00 8.5219094271561247e+00 1.9560314689025291e+00 2.5684200217048052e+00 4.5228151649896562e+00 2.0051189289728932e+00 1.7760980108159115e+00 -4.5651211867217025e+00 -1.5751746121462300e+00 -2.2199326196966225e+00 -5.4625823769743329e+00 -2.0175083095115358e+00 -2.1978257757596866e+00 6.0755729206678470e+00 1.7306775393827325e+00 2.0778964987154480e+00 1.9945162629827891e+00 3.2226986988235700e+00 1.2950054072549428e+00 -1.8598818629604938e+00 -2.9584383667302805e+00 -9.1551799739777517e-01 -2.2916089309251322e+00 -5.5068327952863303e+00 -1.2651327347960399e+00 1.9560314689025289e+00 5.2819714782712124e+00 1.2056774853450287e+00 1.7760980108159132e+00 2.0481526829316627e+00 9.2930851946680038e-01 -1.6048071945883648e+00 -1.8081761363799627e+00 -1.0237854001734950e+00 -1.7434225140141748e+00 -3.2028620009293789e+00 -1.1528476579756166e+00 1.7730747597869361e+00 2.9234864392995061e+00 9.2729237827615330e-01 2.2428299194592820e+00 1.2777525526392992e+00 3.5894124352857650e+00 -2.3246179195784364e+00 -1.0214549185240915e+00 -3.2611836123035154e+00 -2.2197771913006141e+00 -1.2429209308772491e+00 -5.4511458880917969e+00 2.5684200217048048e+00 1.2056774853450289e+00 5.9479816273572919e+00 2.0051189289728915e+00 1.1763059360558092e+00 2.0481526829316610e+00 -2.1728434869688078e+00 -9.8354513646042241e-01 -2.4675150648905930e+00 -2.1254423084569551e+00 -1.2932812552615347e+00 -3.5737931161417533e+00 2.0263120361678357e+00 8.8146626708315945e-01 3.1680909358529385e+00 5.5964130140066368e+00 2.2768626145187980e+00 2.0006994116324650e+00 -6.2565512851012057e+00 -2.0323819461546915e+00 -1.8201385588653944e+00 -4.5651211867217043e+00 -2.2199326196966220e+00 -1.5751746121462302e+00 4.5228151649896562e+00 1.7760980108159132e+00 2.0051189289728915e+00 8.5219094271561460e+00 2.5684200217048105e+00 1.9560314689025291e+00 -8.4324556780230431e+00 -2.2491368041439714e+00 -2.2797058683674596e+00 -5.4625823769743391e+00 -2.1978257757596871e+00 -2.0175083095115367e+00 6.0755729206678550e+00 2.0778964987154502e+00 1.7306775393827323e+00 2.2428299194592847e+00 3.5894124352857695e+00 1.2777525526393019e+00 -2.3246179195784391e+00 -3.2611836123035212e+00 -1.0214549185240924e+00 -2.1728434869688096e+00 -2.4675150648905930e+00 -9.8354513646042263e-01 2.0051189289728928e+00 2.0481526829316627e+00 1.1763059360558092e+00 2.5684200217048101e+00 5.9479816273573123e+00 1.2056774853450294e+00 -2.2197771913006177e+00 -5.4511458880918156e+00 -1.2429209308772513e+00 -2.1254423084569578e+00 -3.5737931161417582e+00 -1.2932812552615363e+00 2.0263120361678379e+00 3.1680909358529443e+00 8.8146626708315989e-01 1.9945162629827884e+00 1.2950054072549411e+00 3.2226986988235748e+00 -1.8598818629604921e+00 -9.1551799739777462e-01 -2.9584383667302836e+00 -1.6048071945883633e+00 -1.0237854001734932e+00 -1.8081761363799620e+00 1.7760980108159110e+00 9.2930851946680038e-01 2.0481526829316610e+00 1.9560314689025295e+00 1.2056774853450294e+00 5.2819714782712257e+00 -2.2916089309251326e+00 -1.2651327347960406e+00 -5.5068327952863463e+00 -1.7434225140141739e+00 -1.1528476579756157e+00 -3.2028620009293824e+00 1.7730747597869345e+00 9.2729237827615318e-01 2.9234864392995092e+00 -5.5951685511818257e+00 -2.1461490793462565e+00 -2.3361302485165338e+00 6.2240417867368247e+00 1.8599540542352317e+00 2.1984384149770531e+00 4.5574208888671741e+00 2.0432499645033659e+00 1.7437576440313169e+00 -4.5651211867217025e+00 -1.6048071945883648e+00 -2.1728434869688082e+00 -8.4324556780230431e+00 -2.2197771913006177e+00 -2.2916089309251322e+00 8.4667031650068889e+00 1.8986080588981569e+00 2.6127572861010115e+00 5.4847536041944833e+00 1.8452170228599503e+00 2.1381753068009703e+00 -6.1401740288788034e+00 -1.6762956352614662e+00 -1.8925459854998743e+00 -1.7889588912488998e+00 -3.2238086497337703e+00 -1.2057548467584278e+00 1.8083891979933127e+00 2.9605848360777132e+00 9.6888751771677706e-01 1.7437576440313174e+00 2.0723702682101868e+00 8.9718200670019654e-01 -1.5751746121462300e+00 -1.8081761363799627e+00 -9.8354513646042241e-01 -2.2491368041439714e+00 -5.4511458880918156e+00 -1.2651327347960406e+00 1.8986080588981569e+00 5.1874944569041030e+00 1.1949203599670248e+00 1.9022972481588905e+00 3.1669372254436010e+00 1.2139044966674088e+00 -1.7397818415425776e+00 -2.9042561124300557e+00 -8.2046166303651558e-01 -2.2624568280439354e+00 -1.3956150701768610e+00 -3.6700993276707292e+00 2.1967106768168447e+00 9.9703819810596361e-01 3.2736854326790907e+00 2.0432499645033673e+00 1.2253771241692717e+00 2.0723702682101872e+00 -2.2199326196966225e+00 -1.0237854001734950e+00 -2.4675150648905926e+00 -2.2797058683674596e+00 -1.2429209308772513e+00 -5.5068327952863463e+00 2.6127572861010115e+00 1.1949203599670246e+00 5.9639212902621672e+00 2.1835912350976052e+00 1.2042921972739840e+00 3.5613160258861800e+00 -2.2742138464108126e+00 -9.5930647828863680e-01 -3.2268458291899536e+00 -3.9835632872600439e+00 -1.9909334961511886e+00 -1.9909334961511909e+00 4.5049324090590694e+00 1.7494941323317454e+00 1.7494941323317450e+00 5.4847536041944780e+00 2.1835912350976039e+00 1.9022972481588893e+00 -5.4625823769743311e+00 -1.7434225140141748e+00 -2.1254423084569551e+00 -5.4625823769743374e+00 -2.1254423084569578e+00 -1.7434225140141739e+00 5.4847536041944833e+00 1.9022972481588905e+00 2.1835912350976052e+00 7.7589380231800344e+00 2.2463881128117320e+00 2.2463881128117325e+00 -8.3246495994193506e+00 -2.2219724097776496e+00 -2.2219724097776483e+00 -1.9726627761566764e+00 -2.4405666930427219e+00 -1.3534692848882126e+00 2.0859992897148745e+00 2.0776607696991092e+00 1.0146794620660133e+00 2.1381753068009690e+00 3.5613160258861751e+00 1.2139044966674082e+00 -2.0175083095115358e+00 -3.2028620009293789e+00 -1.2932812552615345e+00 -2.1978257757596871e+00 -3.5737931161417582e+00 -1.1528476579756157e+00 1.8452170228599503e+00 3.1669372254436010e+00 1.2042921972739840e+00 2.2463881128117320e+00 5.8671395358880041e+00 1.4950712638617443e+00 -2.1277828707596282e+00 -5.4558317468030291e+00 -1.1283492217437845e+00 -1.9726627761566768e+00 -1.3534692848882113e+00 -2.4405666930427241e+00 2.0859992897148749e+00 1.0146794620660138e+00 2.0776607696991092e+00 1.8452170228599503e+00 1.2042921972739833e+00 3.1669372254435966e+00 -2.1978257757596866e+00 -1.1528476579756166e+00 -3.5737931161417533e+00 -2.0175083095115371e+00 -1.2932812552615363e+00 -3.2028620009293824e+00 2.1381753068009699e+00 1.2139044966674088e+00 3.5613160258861800e+00 2.2463881128117320e+00 1.4950712638617440e+00 5.8671395358880041e+00 -2.1277828707596282e+00 -1.1283492217437854e+00 -5.4558317468030282e+00 4.4936988809929233e+00 2.1341849842577454e+00 2.1341849842577485e+00 -5.2046600411751811e+00 -1.7930265493633102e+00 -1.7930265493633100e+00 -6.1401740288787980e+00 -2.2742138464108108e+00 -1.7397818415425768e+00 6.0755729206678488e+00 1.7730747597869361e+00 2.0263120361678357e+00 6.0755729206678541e+00 2.0263120361678379e+00 1.7730747597869352e+00 -6.1401740288788034e+00 -1.7397818415425776e+00 -2.2742138464108126e+00 -8.3246495994193523e+00 -2.1277828707596282e+00 -2.1277828707596278e+00 9.1648129760235086e+00 2.0012333278638064e+00 2.0012333278638050e+00 1.6953063792593670e+00 2.0275317183924937e+00 9.9266876037697094e-01 -1.7142997146823651e+00 -1.8351604290304595e+00 -7.4533337110004994e-01 -1.8925459854998743e+00 -3.2268458291899496e+00 -8.2046166303651547e-01 1.7306775393827323e+00 2.9234864392995066e+00 8.8146626708315956e-01 2.0778964987154502e+00 3.1680909358529434e+00 9.2729237827615341e-01 -1.6762956352614660e+00 -2.9042561124300557e+00 -9.5930647828863669e-01 -2.2219724097776501e+00 -5.4558317468030300e+00 -1.1283492217437854e+00 2.0012333278638059e+00 5.3029850239085494e+00 8.5202332843270290e-01 1.6953063792593663e+00 9.9266876037696916e-01 2.0275317183924946e+00 -1.7142997146823640e+00 -7.4533337110004971e-01 -1.8351604290304588e+00 -1.6762956352614637e+00 -9.5930647828863547e-01 -2.9042561124300503e+00 2.0778964987154480e+00 9.2729237827615341e-01 3.1680909358529381e+00 1.7306775393827323e+00 8.8146626708316000e-01 2.9234864392995097e+00 -1.8925459854998741e+00 -8.2046166303651535e-01 -3.2268458291899536e+00 -2.2219724097776483e+00 -1.1283492217437847e+00 -5.4558317468030300e+00 2.0012333278638050e+00 8.5202332843270256e-01 5.3029850239085485e+00 hypre-2.33.0/src/test/TEST_fei/SFEI.1000066400000000000000000040777121477326011500167360ustar00rootroot0000000000000073 24 432 773 45 46 47 105 106 107 447 448 449 432 433 434 48 49 50 108 109 110 450 451 452 435 436 437 5.0051518361481122e+00 2.1256630730062498e+00 5.2254517501681996e-01 -5.2610051902782891e+00 -2.1101687157818998e+00 -2.9199324393136988e-01 -3.2687436339925000e+00 -1.8643448488287224e+00 -1.0026242102923262e-01 3.5060119674619137e+00 1.8131728208022169e+00 4.9721393230323996e-01 3.3648591489325788e+00 1.9087730982442810e+00 2.3108351634175511e-01 -3.6126737075437707e+00 -1.7241623794251599e+00 -5.1874739418173266e-01 -2.4508814648158745e+00 -1.7211780028735590e+00 -4.4941271241376712e-01 2.7172810440878283e+00 1.5722449548565940e+00 1.0957314789428863e-01 2.1256630730062493e+00 4.8147700537165576e+00 5.0220822583469615e-01 -2.1178982517433025e+00 -4.3977407614549771e+00 -2.0171362775269983e-01 -1.8757981664814802e+00 -3.1459736616315834e+00 -9.7557480865416532e-02 1.8005723589701979e+00 2.7844294579537761e+00 4.0672017984424508e-01 1.9139019211382955e+00 3.1698756883218566e+00 2.1784631002211288e-01 -1.9779336423164671e+00 -2.8775063299115429e+00 -4.5554213707984015e-01 -1.7107208490063313e+00 -2.3521950745641895e+00 -4.3400041476430717e-01 1.8422135564328377e+00 2.0043406275701003e+00 6.2038944761210982e-02 5.2254517501682007e-01 5.0220822583469626e-01 2.9062691962708991e+00 -2.9652203402599120e-01 -2.0456334015269867e-01 -2.6946917955729428e+00 -3.2459008076932333e-01 -3.1051761568436587e-01 -1.3296797102869569e+00 4.9037696726472119e-01 4.0496347618685985e-01 1.4430989440807063e+00 2.2685148750193404e-01 2.1113611122884757e-01 1.3406124052350310e+00 -5.4094901170254239e-01 -4.1494797233249436e-01 -1.5020763513681989e+00 -4.3724391301760440e-01 -4.2481083965817473e-01 -7.9534663123435445e-01 3.5953140973198583e-01 2.3653195457733003e-01 6.3181394287581683e-01 -5.2610051902782899e+00 -2.1178982517433025e+00 -2.9652203402599120e-01 5.6951032973874591e+00 2.0463140530859305e+00 -1.8357838513958419e-02 3.6031990115291141e+00 1.8559291957204442e+00 -4.2071892071471488e-02 -3.8942531575061476e+00 -1.7509238326341738e+00 -3.8241433038960881e-01 -3.7168143069101132e+00 -2.0256085204124608e+00 5.0603552504754089e-02 3.9584341578519817e+00 1.7934244970919679e+00 2.6689146524196261e-01 2.7318070945320594e+00 1.8397879447157364e+00 3.6527887758913835e-01 -3.1164709066060614e+00 -1.6410250858241411e+00 5.6592199665173079e-02 -2.1101687157818998e+00 -4.3977407614549771e+00 -2.0456334015269861e-01 2.0463140530859305e+00 4.1618078819349167e+00 -1.0427094652536335e-02 1.8610835521849831e+00 2.8203409946207518e+00 -3.2407956637412902e-02 -1.7397068478024595e+00 -2.5330958182913581e+00 -2.6024364454901755e-01 -1.7809483809678399e+00 -2.8931952140986339e+00 3.7914591527405943e-02 1.8007446011184884e+00 2.6128010204131447e+00 1.8481866115007692e-01 1.5820207812826819e+00 2.0375915800058935e+00 2.4510349038033166e-01 -1.6593390431198838e+00 -1.8085096831297376e+00 3.9805292933849719e-02 -2.9199324393136988e-01 -2.0171362775269983e-01 -2.6946917955729428e+00 -1.8357838513958433e-02 -1.0427094652536356e-02 2.7440730280462180e+00 -2.5340247916466978e-02 -1.8451330235497530e-02 1.3416335456246242e+00 -1.3951978699159262e-01 -9.4573214691229146e-02 -1.3386020464938897e+00 4.5117738207651685e-02 3.9063987833328893e-02 -1.3765582160191152e+00 2.6612865389660162e-01 1.8235534079994811e-01 1.3550269642056278e+00 1.2724718186061754e-01 7.7809611876659260e-02 6.5694743386660370e-01 3.6717543388517022e-02 2.5936326822026606e-02 -6.8782891365712628e-01 -3.2687436339925000e+00 -1.8757981664814802e+00 -3.2459008076932333e-01 3.6031990115291133e+00 1.8610835521849831e+00 -2.5340247916466975e-02 4.8256935128993659e+00 2.0469263531150146e+00 -3.8631353215944672e-02 -5.0295249483917948e+00 -1.9962188840637616e+00 -2.2134629529545050e-01 -2.5396854609740060e+00 -1.7570975045565671e+00 3.8914057699301396e-02 2.7435373808958152e+00 1.5868764549264427e+00 3.1126569747442373e-01 3.1983175224922471e+00 1.7878732212144335e+00 1.9460521139300929e-01 -3.5327933844582389e+00 -1.6536450263390639e+00 6.5123010630449563e-02 -1.8643448488287224e+00 -3.1459736616315834e+00 -3.1051761568436587e-01 1.8559291957204442e+00 2.8203409946207518e+00 -1.8451330235497544e-02 2.0469263531150146e+00 4.5945274525166946e+00 -3.8144236192034164e-02 -1.9733460502812215e+00 -4.2121508238038485e+00 -2.1357430731341634e-01 -1.7776480564630270e+00 -2.3672502375474460e+00 3.6182915698776665e-02 1.8314085100714306e+00 2.0377006618232065e+00 3.0534671743220704e-01 1.7957323423138174e+00 3.0318463794246546e+00 1.8495756302161032e-01 -1.9146574456477352e+00 -2.7590407654024274e+00 5.4200293272718414e-02 -1.0026242102923262e-01 -9.7557480865416532e-02 -1.3296797102869571e+00 -4.2071892071471467e-02 -3.2407956637412888e-02 1.3416335456246242e+00 -3.8631353215944686e-02 -3.8144236192034144e-02 2.6620723209278099e+00 -2.4789041337015408e-01 -2.3754818231801203e-01 -2.6070880832516430e+00 5.3415328539218085e-02 4.9509714649089639e-02 -6.8440299937070126e-01 8.3576593583116796e-02 9.2897410903915401e-02 6.5410984648961579e-01 2.2421430607570930e-01 2.1038093662447002e-01 1.3041766856982926e+00 6.7649851488758697e-02 5.2869793835400483e-02 -1.3408216058310418e+00 3.5060119674619137e+00 1.8005723589701979e+00 4.9037696726472113e-01 -3.8942531575061476e+00 -1.7397068478024595e+00 -1.3951978699159265e-01 -5.0295249483917948e+00 -1.9733460502812215e+00 -2.4789041337015405e-01 5.3906521856713798e+00 1.8795897121384952e+00 5.6954735553611879e-01 2.7248655070334866e+00 1.8186310616797747e+00 9.8964469216246617e-02 -3.0139906808117907e+00 -1.6079022640030907e+00 -5.1388302771732586e-01 -3.4272729857240782e+00 -1.8545823330340525e+00 -5.1832130493895323e-01 3.7435121122670294e+00 1.6767443623323550e+00 2.6072574100094070e-01 1.8131728208022164e+00 2.7844294579537761e+00 4.0496347618685985e-01 -1.7509238326341738e+00 -2.5330958182913577e+00 -9.4573214691229146e-02 -1.9962188840637616e+00 -4.2121508238038494e+00 -2.3754818231801197e-01 1.8795897121384950e+00 4.0207416032606007e+00 3.9688047098879348e-01 1.5873807418128227e+00 2.0066593941851401e+00 1.0491653640268797e-01 -1.6048942306017355e+00 -1.7951452777272170e+00 -3.5532729444758848e-01 -1.6097584583671094e+00 -2.7436694924042113e+00 -3.9784612882059595e-01 1.6816521309132444e+00 2.4722309568271186e+00 1.7853433669908542e-01 4.9721393230323996e-01 4.0672017984424502e-01 1.4430989440807058e+00 -3.8241433038960881e-01 -2.6024364454901755e-01 -1.3386020464938897e+00 -2.2134629529545050e-01 -2.1357430731341631e-01 -2.6070880832516425e+00 5.6954735553611879e-01 3.9688047098879348e-01 2.8271230083145151e+00 3.1549871260524126e-01 3.0393634367555311e-01 6.3651894261345165e-01 -5.1149019319694411e-01 -3.5432011461013257e-01 -7.9889976026278564e-01 -4.8792604332346651e-01 -4.2890338445995985e-01 -1.4580175990670639e+00 2.2091686176086966e-01 1.4950445642393437e-01 1.2958665940667096e+00 3.3648591489325788e+00 1.9139019211382955e+00 2.2685148750193410e-01 -3.7168143069101123e+00 -1.7809483809678399e+00 4.5117738207651671e-02 -2.5396854609740060e+00 -1.7776480564630268e+00 5.3415328539218092e-02 2.7248655070334866e+00 1.5873807418128227e+00 3.1549871260524132e-01 5.1401856805523405e+00 2.1579074479800053e+00 -1.8739573107806821e-02 -5.3048778076158909e+00 -2.0933004712757479e+00 -2.5454539576297769e-01 -3.2731139510399547e+00 -1.8510025862707402e+00 -3.2692983722141622e-01 3.6045811900215576e+00 1.8437093840462302e+00 -4.0668460761842933e-02 1.9087730982442812e+00 3.1698756883218575e+00 2.1113611122884751e-01 -2.0256085204124612e+00 -2.8931952140986339e+00 3.9063987833328900e-02 -1.7570975045565675e+00 -2.3672502375474460e+00 4.9509714649089626e-02 1.8186310616797750e+00 2.0066593941851401e+00 3.0393634367555317e-01 2.1579074479800053e+00 4.8531656376483472e+00 -1.9862993536036516e-02 -2.0798444529776270e+00 -4.4252655651905259e+00 -2.3937247290061908e-01 -1.8326294657517628e+00 -3.1413529380725866e+00 -3.1099691748279484e-01 1.8098683357943564e+00 2.7973632347538477e+00 -3.3413773467367278e-02 2.3108351634175511e-01 2.1784631002211291e-01 1.3406124052350310e+00 5.0603552504754075e-02 3.7914591527405950e-02 -1.3765582160191152e+00 3.8914057699301396e-02 3.6182915698776665e-02 -6.8440299937070126e-01 9.8964469216246617e-02 1.0491653640268797e-01 6.3651894261345177e-01 -1.8739573107806828e-02 -1.9862993536036513e-02 2.8354190600781219e+00 -2.6237695217243046e-01 -2.4713470942775409e-01 -2.7494158252264467e+00 -1.1538057170459620e-01 -1.1017723975917421e-01 -1.3615732685018471e+00 -2.3068498777223730e-02 -1.9685410928018725e-02 1.3593999011915057e+00 -3.6126737075437707e+00 -1.9779336423164673e+00 -5.4094901170254250e-01 3.9584341578519817e+00 1.8007446011184887e+00 2.6612865389660156e-01 2.7435373808958152e+00 1.8314085100714306e+00 8.3576593583116796e-02 -3.0139906808117907e+00 -1.6048942306017355e+00 -5.1149019319694422e-01 -5.3048778076158909e+00 -2.0798444529776270e+00 -2.6237695217243051e-01 5.6175339828498423e+00 1.9730909839507313e+00 5.9558690726190033e-01 3.5113175242779446e+00 1.7702973267493700e+00 4.9075138801480911e-01 -3.8992808499041303e+00 -1.7128690959941903e+00 -1.2122738568451261e-01 -1.7241623794251602e+00 -2.8775063299115433e+00 -4.1494797233249436e-01 1.7934244970919679e+00 2.6128010204131447e+00 1.8235534079994811e-01 1.5868764549264427e+00 2.0377006618232065e+00 9.2897410903915401e-02 -1.6079022640030907e+00 -1.7951452777272170e+00 -3.5432011461013257e-01 -2.0933004712757479e+00 -4.4252655651905259e+00 -2.4713470942775409e-01 1.9730909839507313e+00 4.1800558548859428e+00 4.1506971379219304e-01 1.7962885386049767e+00 2.8055035369101882e+00 4.0572186607688560e-01 -1.7243153598701197e+00 -2.5381439012031950e+00 -7.9641535202562286e-02 -5.1874739418173266e-01 -4.5554213707984020e-01 -1.5020763513681992e+00 2.6689146524196261e-01 1.8481866115007689e-01 1.3550269642056278e+00 3.1126569747442367e-01 3.0534671743220704e-01 6.5410984648961579e-01 -5.1388302771732586e-01 -3.5532729444758848e-01 -7.9889976026278575e-01 -2.5454539576297769e-01 -2.3937247290061908e-01 -2.7494158252264471e+00 5.9558690726190033e-01 4.1506971379219304e-01 2.9255002527917111e+00 4.8816717959207667e-01 3.9852993911560425e-01 1.4805839449801961e+00 -3.7473543190832703e-01 -2.5352312706203334e-01 -1.3648290716097196e+00 -2.4508814648158745e+00 -1.7107208490063313e+00 -4.3724391301760440e-01 2.7318070945320594e+00 1.5820207812826816e+00 1.2724718186061751e-01 3.1983175224922471e+00 1.7957323423138176e+00 2.2421430607570927e-01 -3.4272729857240782e+00 -1.6097584583671092e+00 -4.8792604332346645e-01 -3.2731139510399547e+00 -1.8326294657517628e+00 -1.1538057170459617e-01 3.5113175242779446e+00 1.7962885386049767e+00 4.8816717959207662e-01 4.7745449463964427e+00 1.9695400154081339e+00 4.9113041421083237e-01 -5.0647186861187858e+00 -1.9904729044844058e+00 -2.9020855369357018e-01 -1.7211780028735590e+00 -2.3521950745641895e+00 -4.2481083965817479e-01 1.8397879447157366e+00 2.0375915800058935e+00 7.7809611876659260e-02 1.7878732212144335e+00 3.0318463794246546e+00 2.1038093662446997e-01 -1.8545823330340527e+00 -2.7436694924042104e+00 -4.2890338445995974e-01 -1.8510025862707402e+00 -3.1413529380725866e+00 -1.1017723975917421e-01 1.7702973267493700e+00 2.8055035369101877e+00 3.9852993911560425e-01 1.9695400154081346e+00 4.6082094050768259e+00 4.7322594060817752e-01 -1.9407355859093220e+00 -4.2459333963765733e+00 -1.9605496434760367e-01 -4.4941271241376712e-01 -4.3400041476430717e-01 -7.9534663123435423e-01 3.6527887758913835e-01 2.4510349038033163e-01 6.5694743386660370e-01 1.9460521139300929e-01 1.8495756302161032e-01 1.3041766856982926e+00 -5.1832130493895312e-01 -3.9784612882059595e-01 -1.4580175990670641e+00 -3.2692983722141622e-01 -3.1099691748279479e-01 -1.3615732685018469e+00 4.9075138801480911e-01 4.0572186607688560e-01 1.4805839449801959e+00 4.9113041421083237e-01 4.7322594060817758e-01 2.8392741067763620e+00 -2.4710203663365249e-01 -1.6616539901930691e-01 -2.6660446725181886e+00 2.7172810440878283e+00 1.8422135564328377e+00 3.5953140973198583e-01 -3.1164709066060619e+00 -1.6593390431198838e+00 3.6717543388517009e-02 -3.5327933844582389e+00 -1.9146574456477354e+00 6.7649851488758683e-02 3.7435121122670294e+00 1.6816521309132444e+00 2.2091686176086969e-01 3.6045811900215572e+00 1.8098683357943559e+00 -2.3068498777223740e-02 -3.8992808499041303e+00 -1.7243153598701197e+00 -3.7473543190832703e-01 -5.0647186861187858e+00 -1.9407355859093223e+00 -2.4710203663365254e-01 5.5478894807108006e+00 1.9053134114066217e+00 -3.9909699050926187e-02 1.5722449548565940e+00 2.0043406275701003e+00 2.3653195457733001e-01 -1.6410250858241411e+00 -1.8085096831297374e+00 2.5936326822026599e-02 -1.6536450263390639e+00 -2.7590407654024274e+00 5.2869793835400483e-02 1.6767443623323550e+00 2.4722309568271186e+00 1.4950445642393437e-01 1.8437093840462304e+00 2.7973632347538477e+00 -1.9685410928018728e-02 -1.7128690959941901e+00 -2.5381439012031950e+00 -2.5352312706203334e-01 -1.9904729044844058e+00 -4.2459333963765724e+00 -1.6616539901930691e-01 1.9053134114066215e+00 4.0776929269608653e+00 -2.5468594649331315e-02 1.0957314789428864e-01 6.2038944761210996e-02 6.3181394287581683e-01 5.6592199665173079e-02 3.9805292933849726e-02 -6.8782891365712628e-01 6.5123010630449535e-02 5.4200293272718414e-02 -1.3408216058310418e+00 2.6072574100094070e-01 1.7853433669908542e-01 1.2958665940667096e+00 -4.0668460761842926e-02 -3.3413773467367291e-02 1.3593999011915052e+00 -1.2122738568451261e-01 -7.9641535202562300e-02 -1.3648290716097196e+00 -2.9020855369357024e-01 -1.9605496434760367e-01 -2.6660446725181886e+00 -3.9909699050926180e-02 -2.5468594649331308e-02 2.7724438254820445e+00 105 106 107 165 166 167 180 181 182 447 448 449 108 109 110 168 169 170 183 184 185 450 451 452 4.8856105727489387e+00 2.0859976999891594e+00 5.2272502447033664e-01 -5.1375694593181294e+00 -2.0712922243722307e+00 -2.8373732553512521e-01 -3.2391719897926374e+00 -1.8416655464521006e+00 -9.9073047484930052e-02 3.4716310133081563e+00 1.7893413873541464e+00 4.9627487398992065e-01 3.2540811829423903e+00 1.8737264812320675e+00 2.2068952506364167e-01 -3.5020452160018496e+00 -1.6809062866413897e+00 -5.1792713235379706e-01 -2.4005561852188828e+00 -1.6958178484124358e+00 -4.4649073241489962e-01 2.6680200813320143e+00 1.5406163373027839e+00 1.0753881426485121e-01 2.0859976999891590e+00 4.7194776950539463e+00 5.0497262846705748e-01 -2.0761791929360949e+00 -4.2908784413844350e+00 -1.9279119823428961e-01 -1.8481644166154554e+00 -3.1354892881470966e+00 -9.6196344952824170e-02 1.7676092296013741e+00 2.7630929950511756e+00 4.0479633707847418e-01 1.8761009654663781e+00 3.0839330699418106e+00 2.0929789014326611e-01 -1.9411019168114847e+00 -2.7807576166174193e+00 -4.5587980639761189e-01 -1.6789271864389810e+00 -2.3242747417230767e+00 -4.3294344315808980e-01 1.8146648177451061e+00 1.9648963278250937e+00 5.8743937054016086e-02 5.2272502447033675e-01 5.0497262846705759e-01 2.8424039646662753e+00 -2.9641406489871130e-01 -2.0259075881589383e-01 -2.6191558433347426e+00 -3.2378529140258139e-01 -3.1156121918736174e-01 -1.3339080409350783e+00 4.9260585375659566e-01 4.0768343416692077e-01 1.4477659013398361e+00 2.2696909566150808e-01 2.1252664547220354e-01 1.2762376881593984e+00 -5.4390827940974196e-01 -4.1606319723941076e-01 -1.4432952689724465e+00 -4.3886053088687088e-01 -4.2976624798927987e-01 -7.8729028094733455e-01 3.6066819270946548e-01 2.3479871512576447e-01 6.1724188002409219e-01 -5.1375694593181294e+00 -2.0761791929360949e+00 -2.9641406489871130e-01 5.5759021466464649e+00 2.0031119870277712e+00 -3.1164248829928139e-02 3.5757613807668451e+00 1.8257847241787470e+00 -4.7130992842379892e-02 -3.8635525506346386e+00 -1.7174395531888944e+00 -3.7791857156199304e-01 -3.6079949940792737e+00 -1.9926469479905764e+00 6.0459713481842640e-02 3.8487376980446326e+00 1.7497435024232040e+00 2.6862167380293461e-01 2.6813185720212589e+00 1.8136799884647730e+00 3.6219616270744048e-01 -3.0726027934471611e+00 -1.6060545079789290e+00 6.1350328140796724e-02 -2.0712922243722307e+00 -4.2908784413844359e+00 -2.0259075881589383e-01 2.0031119870277707e+00 4.0524780735694605e+00 -1.9123872403587865e-02 1.8394448531029444e+00 2.8016327332639497e+00 -3.6882720456947848e-02 -1.7111219279589291e+00 -2.5074159964106397e+00 -2.5578137821197455e-01 -1.7405619891673136e+00 -2.8022822630830704e+00 4.5484293421905686e-02 1.7593135235794106e+00 2.5123541502386422e+00 1.8530152990420484e-01 1.5509819776431775e+00 2.0022836845836620e+00 2.4069302895359343e-01 -1.6298761998548306e+00 -1.7681719407775687e+00 4.2899877608701432e-02 -2.8373732553512526e-01 -1.9279119823428961e-01 -2.6191558433347426e+00 -3.1164248829928142e-02 -1.9123872403587865e-02 2.6724947789048201e+00 -3.5274224266947374e-02 -2.6873069558192408e-02 1.3463549864231235e+00 -1.3286945305888348e-01 -8.9409943948568188e-02 -1.3380197684107868e+00 5.7845620053785053e-02 4.9712442072076563e-02 -1.3159894667504155e+00 2.5561203546934796e-01 1.7392274844135211e-01 1.2885012978394050e+00 1.2085426491267705e-01 7.0695163434341998e-02 6.4248006771059318e-01 4.8733331255074126e-02 3.3867730196867334e-02 -6.7666605238199684e-01 -3.2391719897926379e+00 -1.8481644166154554e+00 -3.2378529140258133e-01 3.5757613807668456e+00 1.8394448531029439e+00 -3.5274224266947360e-02 4.8986578595975017e+00 2.0372915002120107e+00 -4.2759547377334270e-02 -5.0979242109477525e+00 -1.9902334579566103e+00 -2.1183769264137095e-01 -2.4931745522302871e+00 -1.7313569259863970e+00 4.7439186653420624e-02 2.6964527808796941e+00 1.5555220071642144e+00 3.1107002930010397e-01 3.1825793529886628e+00 1.7675947639202054e+00 1.8643971309442978e-01 -3.5231806212620271e+00 -1.6300983238409119e+00 6.8707826640281258e-02 -1.8416655464521008e+00 -3.1354892881470962e+00 -3.1156121918736174e-01 1.8257847241787470e+00 2.8016327332639492e+00 -2.6873069558192408e-02 2.0372915002120107e+00 4.6808813649692533e+00 -4.2478778157665625e-02 -1.9531678067098051e+00 -4.2855065476258147e+00 -2.0615544447661807e-01 -1.7513931532112443e+00 -2.3413584767742139e+00 4.4523180667041591e-02 1.8032847508240941e+00 1.9989491020331811e+00 3.0714741817831842e-01 1.7721695306299912e+00 3.0359772328272410e+00 1.7766147865408990e-01 -1.8923039994716939e+00 -2.7550861205465007e+00 5.7736433880389453e-02 -9.9073047484930066e-02 -9.6196344952824170e-02 -1.3339080409350781e+00 -4.7130992842379885e-02 -3.6882720456947855e-02 1.3463549864231235e+00 -4.2759547377334284e-02 -4.2478778157665653e-02 2.7519848872926618e+00 -2.5428915642018640e-01 -2.4457341661433890e-01 -2.6909460140105019e+00 5.9081987276841705e-02 5.5122015189275189e-02 -6.7502626245558872e-01 8.0602642917958683e-02 9.1859084626966930e-02 6.4072780356710923e-01 2.2811996282177047e-01 2.1468601788928543e-01 1.3191130267270907e+00 7.5448151108259850e-02 5.8464142476249016e-02 -1.3583003866088164e+00 3.4716310133081563e+00 1.7676092296013739e+00 4.9260585375659555e-01 -3.8635525506346386e+00 -1.7111219279589294e+00 -1.3286945305888348e-01 -5.0979242109477525e+00 -1.9531678067098051e+00 -2.5428915642018646e-01 5.4612700898600828e+00 1.8616637144196821e+00 5.7175613885599275e-01 2.6733152678297198e+00 1.7915251532299707e+00 9.0529118491493060e-02 -2.9653616474085620e+00 -1.5734000734003433e+00 -5.1630578531749705e-01 -3.4094880409328336e+00 -1.8306058504953602e+00 -5.1665369532126149e-01 3.7301100789258306e+00 1.6474975613134106e+00 2.6522697901374548e-01 1.7893413873541464e+00 2.7630929950511756e+00 4.0768343416692077e-01 -1.7174395531888944e+00 -2.5074159964106397e+00 -8.9409943948568188e-02 -1.9902334579566103e+00 -4.2855065476258147e+00 -2.4457341661433890e-01 1.8616637144196821e+00 4.0911593120026364e+00 3.9679321645641885e-01 1.5565677775200959e+00 1.9704237405655878e+00 9.9963519534177647e-02 -1.5707159382214142e+00 -1.7530391614413094e+00 -3.5502458086337857e-01 -1.5843349636154656e+00 -2.7401842580762654e+00 -3.9612197287329076e-01 1.6551510336884616e+00 2.4614699159346296e+00 1.8068974414205782e-01 4.9627487398992065e-01 4.0479633707847418e-01 1.4477659013398361e+00 -3.7791857156199304e-01 -2.5578137821197461e-01 -1.3380197684107868e+00 -2.1183769264137098e-01 -2.0615544447661799e-01 -2.6909460140105019e+00 5.7175613885599263e-01 3.9679321645641891e-01 2.9161650151576182e+00 3.1047729795869233e-01 3.0203028610831772e-01 6.2108147850050321e-01 -5.1084248778737551e-01 -3.5184818975196525e-01 -7.8894867942975377e-01 -4.8892692932904885e-01 -4.3112289435556761e-01 -1.4756407991251459e+00 2.1101737051518299e-01 1.4128806715291467e-01 1.3085428659782294e+00 3.2540811829423903e+00 1.8761009654663781e+00 2.2696909566150805e-01 -3.6079949940792737e+00 -1.7405619891673139e+00 5.7845620053785053e-02 -2.4931745522302871e+00 -1.7513931532112443e+00 5.9081987276841698e-02 2.6733152678297198e+00 1.5565677775200959e+00 3.1047729795869233e-01 4.8988352673802735e+00 2.1051672617907422e+00 -3.1137086118929902e-02 -5.0578339473287661e+00 -2.0307063566667605e+00 -2.5359261317233572e-01 -3.1789971210104309e+00 -1.8214076875130192e+00 -3.2296919733456297e-01 3.5117688964963749e+00 1.8062331817811224e+00 -4.6675104325000313e-02 1.8737264812320675e+00 3.0839330699418102e+00 2.1252664547220351e-01 -1.9926469479905766e+00 -2.8022822630830708e+00 4.9712442072076521e-02 -1.7313569259863972e+00 -2.3413584767742139e+00 5.5122015189275196e-02 1.7915251532299707e+00 1.9704237405655882e+00 3.0203028610831767e-01 2.1051672617907418e+00 4.6464210485960997e+00 -3.1544605955844907e-02 -2.0296899273436715e+00 -4.2017541532503992e+00 -2.4157444616888962e-01 -1.7967479575676244e+00 -3.0744784483040504e+00 -3.0854432037791696e-01 1.7800228626354897e+00 2.7190954823082376e+00 -3.7728016339223222e-02 2.2068952506364167e-01 2.0929789014326611e-01 1.2762376881593984e+00 6.0459713481842613e-02 4.5484293421905672e-02 -1.3159894667504153e+00 4.7439186653420624e-02 4.4523180667041584e-02 -6.7502626245558861e-01 9.0529118491493088e-02 9.9963519534177647e-02 6.2108147850050321e-01 -3.1137086118929902e-02 -3.1544605955844900e-02 2.6654335671884199e+00 -2.4731741419345604e-01 -2.3653887581559774e-01 -2.5700551742957907e+00 -1.0667265105305528e-01 -1.0299089533220304e-01 -1.3119038009401174e+00 -3.3990392324956833e-02 -2.8194506662745384e-02 1.3102219705935900e+00 -3.5020452160018496e+00 -1.9411019168114849e+00 -5.4390827940974196e-01 3.8487376980446326e+00 1.7593135235794106e+00 2.5561203546934802e-01 2.6964527808796945e+00 1.8032847508240941e+00 8.0602642917958697e-02 -2.9653616474085620e+00 -1.5707159382214142e+00 -5.1084248778737551e-01 -5.0578339473287652e+00 -2.0296899273436715e+00 -2.4731741419345604e-01 5.3717896810260051e+00 1.9108049962760201e+00 5.9483876421752402e-01 3.4162309841050460e+00 1.7384239874589160e+00 4.8802683129597929e-01 -3.8079703333162023e+00 -1.6703194757618705e+00 -1.1701209251023456e-01 -1.6809062866413897e+00 -2.7807576166174193e+00 -4.1606319723941082e-01 1.7497435024232040e+00 2.5123541502386422e+00 1.7392274844135211e-01 1.5555220071642144e+00 1.9989491020331811e+00 9.1859084626966930e-02 -1.5734000734003433e+00 -1.7530391614413094e+00 -3.5184818975196525e-01 -2.0307063566667600e+00 -4.2017541532503992e+00 -2.3653887581559774e-01 1.9108049962760203e+00 3.9508426385046422e+00 4.1170512546698679e-01 1.7562623144021217e+00 2.7254788131039245e+00 4.0318373940431601e-01 -1.6873201035570675e+00 -2.4520737725712634e+00 -7.6220435132646744e-02 -5.1792713235379706e-01 -4.5587980639761194e-01 -1.4432952689724465e+00 2.6862167380293461e-01 1.8530152990420484e-01 1.2885012978394050e+00 3.1107002930010397e-01 3.0714741817831842e-01 6.4072780356710923e-01 -5.1630578531749705e-01 -3.5502458086337857e-01 -7.8894867942975377e-01 -2.5359261317233572e-01 -2.4157444616888959e-01 -2.5700551742957907e+00 5.9483876421752402e-01 4.1170512546698668e-01 2.7522517671990121e+00 4.8911164849112521e-01 4.0064702174271211e-01 1.4334658996817564e+00 -3.7581658496805803e-01 -2.5232226186234208e-01 -1.3126476455892917e+00 -2.4005561852188828e+00 -1.6789271864389810e+00 -4.3886053088687088e-01 2.6813185720212589e+00 1.5509819776431775e+00 1.2085426491267706e-01 3.1825793529886619e+00 1.7721695306299912e+00 2.2811996282177047e-01 -3.4094880409328336e+00 -1.5843349636154656e+00 -4.8892692932904880e-01 -3.1789971210104304e+00 -1.7967479575676246e+00 -1.0667265105305528e-01 3.4162309841050460e+00 1.7562623144021217e+00 4.8911164849112510e-01 4.7134053592764538e+00 1.9406758742969439e+00 4.8904183986743910e-01 -5.0044929212292741e+00 -1.9600795893501637e+00 -2.9266760482403509e-01 -1.6958178484124358e+00 -2.3242747417230762e+00 -4.2976624798927981e-01 1.8136799884647730e+00 2.0022836845836620e+00 7.0695163434341998e-02 1.7675947639202056e+00 3.0359772328272410e+00 2.1468601788928543e-01 -1.8306058504953602e+00 -2.7401842580762654e+00 -4.3112289435556755e-01 -1.8214076875130187e+00 -3.0744784483040499e+00 -1.0299089533220304e-01 1.7384239874589156e+00 2.7254788131039245e+00 4.0064702174271205e-01 1.9406758742969441e+00 4.5739999133476354e+00 4.7433324258676568e-01 -1.9125432277200232e+00 -4.1988021957590718e+00 -1.9648140797605324e-01 -4.4649073241489962e-01 -4.3294344315808980e-01 -7.8729028094733444e-01 3.6219616270744048e-01 2.4069302895359349e-01 6.4248006771059318e-01 1.8643971309442975e-01 1.7766147865408990e-01 1.3191130267270907e+00 -5.1665369532126149e-01 -3.9612197287329076e-01 -1.4756407991251459e+00 -3.2296919733456297e-01 -3.0854432037791696e-01 -1.3119038009401174e+00 4.8802683129597935e-01 4.0318373940431607e-01 1.4334658996817564e+00 4.8904183986743910e-01 4.7433324258676568e-01 2.8222320822576954e+00 -2.3959092189456477e-01 -1.5826175318946775e-01 -2.6424561953645371e+00 2.6680200813320147e+00 1.8146648177451059e+00 3.6066819270946548e-01 -3.0726027934471611e+00 -1.6298761998548306e+00 4.8733331255074119e-02 -3.5231806212620271e+00 -1.8923039994716941e+00 7.5448151108259850e-02 3.7301100789258310e+00 1.6551510336884616e+00 2.1101737051518302e-01 3.5117688964963754e+00 1.7800228626354899e+00 -3.3990392324956833e-02 -3.8079703333162023e+00 -1.6873201035570675e+00 -3.7581658496805814e-01 -5.0044929212292741e+00 -1.9125432277200238e+00 -2.3959092189456485e-01 5.4983476125004476e+00 1.8722048165345588e+00 -4.6469146400404684e-02 1.5406163373027839e+00 1.9648963278250935e+00 2.3479871512576447e-01 -1.6060545079789290e+00 -1.7681719407775685e+00 3.3867730196867327e-02 -1.6300983238409119e+00 -2.7550861205465003e+00 5.8464142476249044e-02 1.6474975613134104e+00 2.4614699159346292e+00 1.4128806715291470e-01 1.8062331817811221e+00 2.7190954823082381e+00 -2.8194506662745391e-02 -1.6703194757618705e+00 -2.4520737725712634e+00 -2.5232226186234208e-01 -1.9600795893501637e+00 -4.1988021957590709e+00 -1.5826175318946761e-01 1.8722048165345591e+00 4.0286723035864433e+00 -2.9640133237241611e-02 1.0753881426485121e-01 5.8743937054016093e-02 6.1724188002409219e-01 6.1350328140796745e-02 4.2899877608701432e-02 -6.7666605238199684e-01 6.8707826640281300e-02 5.7736433880389453e-02 -1.3583003866088164e+00 2.6522697901374548e-01 1.8068974414205782e-01 1.3085428659782294e+00 -4.6675104325000320e-02 -3.7728016339223215e-02 1.3102219705935902e+00 -1.1701209251023455e-01 -7.6220435132646744e-02 -1.3126476455892917e+00 -2.9266760482403509e-01 -1.9648140797605326e-01 -2.6424561953645371e+00 -4.6469146400404719e-02 -2.9640133237241607e-02 2.7540635633487307e+00 48 49 50 108 109 110 450 451 452 435 436 437 51 52 53 111 112 113 453 454 455 438 439 440 4.6836793992093257e+00 1.9366360087161998e+00 9.3969284880603188e-01 -5.0097072096263719e+00 -1.9743436371947283e+00 -7.9761493920093729e-01 -3.0863969894735273e+00 -1.7245437731402067e+00 -4.9688791595479209e-01 3.2249098554910440e+00 1.6461777135250182e+00 8.7005808509633709e-01 3.1534584983308833e+00 1.7620611391731691e+00 6.4591077122974083e-01 -3.2983017129996881e+00 -1.5349334824272076e+00 -8.9403540275823656e-01 -2.1896787620177971e+00 -1.5355649578530690e+00 -7.5811810693348447e-01 2.5220369210861318e+00 1.4245109892008256e+00 4.9099465971534006e-01 1.9366360087161996e+00 4.6525094409269760e+00 9.3509944848693671e-01 -1.9903070680051385e+00 -4.2480818182998110e+00 -6.2015191912952794e-01 -1.7691427780706694e+00 -3.0293553421138020e+00 -4.9213542575552316e-01 1.6390273784992595e+00 2.6576993336162658e+00 7.3073220826945740e-01 1.7781157072986264e+00 3.0192516869296457e+00 6.1630020959969034e-01 -1.7946111760976726e+00 -2.7137464121169734e+00 -8.1008360553446024e-01 -1.5343176920163994e+00 -2.2114311702889968e+00 -7.6151408599678483e-01 1.7345996196757945e+00 1.8731542813466953e+00 4.0175317006021111e-01 9.3969284880603199e-01 9.3509944848693671e-01 3.1849444928395894e+00 -8.1130790538808173e-01 -6.2616945749652975e-01 -2.8695964003988594e+00 -7.2902207360933335e-01 -7.0058362779598926e-01 -1.4899524804108235e+00 8.7577338040657671e-01 7.4026705552414918e-01 1.6982603203533004e+00 6.4723918151470805e-01 6.0959715086148025e-01 1.5022588180392138e+00 -9.4378787935188557e-01 -7.3388316921463193e-01 -1.7662034862087994e+00 -7.5600502690082871e-01 -7.6001086683007069e-01 -1.0408256129952147e+00 7.7741747452281318e-01 5.3568346646465592e-01 7.8111434878159347e-01 -5.0097072096263711e+00 -1.9903070680051385e+00 -8.1130790538808173e-01 5.5558660008242056e+00 1.9571627896681958e+00 5.6593684700995139e-01 3.5034480557499288e+00 1.7776758160290655e+00 4.1568111617214254e-01 -3.6900616040205203e+00 -1.6391667338163760e+00 -8.3758496957016393e-01 -3.5960903732132641e+00 -1.9241246066447173e+00 -4.4917771710527443e-01 3.7323103539697056e+00 1.6427676174318648e+00 7.4981377328414556e-01 2.5266455424046765e+00 1.7092267923448654e+00 7.6295771443029570e-01 -3.0224107660883601e+00 -1.5332346070077607e+00 -3.9631885883301460e-01 -1.9743436371947287e+00 -4.2480818182998110e+00 -6.2616945749652975e-01 1.9571627896681962e+00 4.0275170691809281e+00 3.8957563766795150e-01 1.7839154428375807e+00 2.7157127499568805e+00 3.3761765915779574e-01 -1.6085084609623794e+00 -2.4222862538716714e+00 -5.6288196417794778e-01 -1.6970553565209914e+00 -2.7566413420064921e+00 -3.3623413643432398e-01 1.6695724722985841e+00 2.4705969486582662e+00 5.1830615291448046e-01 1.4487123907281032e+00 1.9123500087890877e+00 5.4452740730533233e-01 -1.5794556408543663e+00 -1.6991673624071890e+00 -2.6474129893675813e-01 -7.9761493920093729e-01 -6.2015191912952794e-01 -2.8695964003988594e+00 5.6593684700995150e-01 3.8957563766795145e-01 2.8030722803572159e+00 4.4805147629747727e-01 3.6320461865503489e-01 1.4000018680126229e+00 -6.1641468447658432e-01 -4.2294946387813709e-01 -1.5085478892527806e+00 -4.3181167908514245e-01 -3.6368776044282430e-01 -1.4210328753458725e+00 7.4914859707220882e-01 5.0806976598793940e-01 1.5232647097558176e+00 5.2288760612232577e-01 4.3149560992422675e-01 8.1639153067482939e-01 -4.4018322373929936e-01 -2.8555648878466350e-01 -7.4355322380297284e-01 -3.0863969894735268e+00 -1.7691427780706697e+00 -7.2902207360933335e-01 3.5034480557499288e+00 1.7839154428375812e+00 4.4805147629747727e-01 4.6925332836386477e+00 1.9584178582594227e+00 4.2209052567207733e-01 -4.7999088917846713e+00 -1.8533608202975766e+00 -6.8248755372898384e-01 -2.4437423223284012e+00 -1.6644401211947337e+00 -3.6792918827211596e-01 2.5665133621994340e+00 1.4605804767405619e+00 7.0330650581025478e-01 2.9862280559996943e+00 1.6342016677465108e+00 5.6582610941447165e-01 -3.4186745540011065e+00 -1.5501717260210974e+00 -3.5983580158384748e-01 -1.7245437731402067e+00 -3.0293553421138020e+00 -7.0058362779598926e-01 1.7776758160290653e+00 2.7157127499568796e+00 3.6320461865503489e-01 1.9584178582594229e+00 4.4506388695550418e+00 3.9593097626330531e-01 -1.8342468868057940e+00 -4.0597876741875707e+00 -5.8680351292424326e-01 -1.6940892479234728e+00 -2.2473618971942511e+00 -3.5094254516251244e-01 1.6849382336010494e+00 1.9112274964583811e+00 6.4575259773260585e-01 1.6570808411726083e+00 2.8723886514568973e+00 5.4456712906930715e-01 -1.8252328411926733e+00 -2.6134628539315781e+00 -3.1112563583750785e-01 -4.9688791595479215e-01 -4.9213542575552310e-01 -1.4899524804108235e+00 4.1568111617214260e-01 3.3761765915779574e-01 1.4000018680126229e+00 4.2209052567207733e-01 3.9593097626330537e-01 2.6961701583959736e+00 -7.0567160131575990e-01 -6.1169667685699947e-01 -2.7564466404723440e+00 -3.4518254262108294e-01 -3.2352186240763131e-01 -7.3426805379295468e-01 4.9445722492915434e-01 4.0156130573320747e-01 8.1112458693455525e-01 6.0058806503114759e-01 5.6804452421620155e-01 1.4407701416336354e+00 -3.8507487191288720e-01 -2.7580050035035625e-01 -1.3673995803006664e+00 3.2249098554910445e+00 1.6390273784992595e+00 8.7577338040657682e-01 -3.6900616040205203e+00 -1.6085084609623792e+00 -6.1641468447658432e-01 -4.7999088917846704e+00 -1.8342468868057940e+00 -7.0567160131576001e-01 5.0369837939364741e+00 1.7006268201463957e+00 1.0005852225963079e+00 2.5426555297619311e+00 1.6595298923362574e+00 5.1899482749529935e-01 -2.7239708916318830e+00 -1.4292308104386422e+00 -8.9453777965918002e-01 -3.1094391498158225e+00 -1.6537968791540807e+00 -8.6952312564294876e-01 3.5188313580634483e+00 1.5265989463789853e+00 6.9079376059628861e-01 1.6461777135250182e+00 2.6576993336162653e+00 7.4026705552414918e-01 -1.6391667338163762e+00 -2.4222862538716714e+00 -4.2294946387813709e-01 -1.8533608202975769e+00 -4.0597876741875698e+00 -6.1169667685699947e-01 1.7006268201463957e+00 3.8558360906473363e+00 7.1006922027885333e-01 1.4724010527214384e+00 1.8857011165663764e+00 4.2326427306429526e-01 -1.4412390402454460e+00 -1.6651563662101314e+00 -6.2690326759807735e-01 -1.4324475782757478e+00 -2.5774404006218168e+00 -6.8080666818035696e-01 1.5470085862422951e+00 2.3254341540612118e+00 4.6875552764627287e-01 8.7005808509633698e-01 7.3073220826945740e-01 1.6982603203533004e+00 -8.3758496957016393e-01 -5.6288196417794756e-01 -1.5085478892527806e+00 -6.8248755372898384e-01 -5.8680351292424326e-01 -2.7564466404723440e+00 1.0005852225963077e+00 7.1006922027885333e-01 3.0659158931103736e+00 6.9423130041003522e-01 6.2410750313003649e-01 7.9937469215479973e-01 -8.7805707634672081e-01 -6.1022720430433186e-01 -1.0459225540868444e+00 -8.1859991896880469e-01 -7.3983390286909534e-01 -1.6856613826515332e+00 6.5185491051199373e-01 4.3483765259727131e-01 1.4330275608450285e+00 3.1534584983308833e+00 1.7781157072986264e+00 6.4723918151470816e-01 -3.5960903732132641e+00 -1.6970553565209914e+00 -4.3181167908514251e-01 -2.4437423223284016e+00 -1.6940892479234728e+00 -3.4518254262108294e-01 2.5426555297619311e+00 1.4724010527214384e+00 6.9423130041003522e-01 4.9167496097200711e+00 2.0265338485335525e+00 4.7996178890010194e-01 -4.9909821595300645e+00 -1.9090698522626253e+00 -7.4963581792257217e-01 -3.0320578803493126e+00 -1.7006605210042502e+00 -7.0038823962963570e-01 3.4500090976081577e+00 1.7238243691577226e+00 4.0558600843358755e-01 1.7620611391731691e+00 3.0192516869296457e+00 6.0959715086148025e-01 -1.9241246066447171e+00 -2.7566413420064926e+00 -3.6368776044282436e-01 -1.6644401211947337e+00 -2.2473618971942511e+00 -3.2352186240763131e-01 1.6595298923362574e+00 1.8857011165663764e+00 6.2410750313003649e-01 2.0265338485335525e+00 4.6001345177302673e+00 4.4188710575234985e-01 -1.8964135754871900e+00 -4.1713922673636796e+00 -6.3363297448410294e-01 -1.6548216413821688e+00 -2.9454435924108271e+00 -6.6780811754912139e-01 1.6916750646658325e+00 2.6157517777489621e+00 3.1305895513981319e-01 6.4591077122974083e-01 6.1630020959969034e-01 1.5022588180392138e+00 -4.4917771710527443e-01 -3.3623413643432387e-01 -1.4210328753458725e+00 -3.6792918827211596e-01 -3.5094254516251239e-01 -7.3426805379295457e-01 5.1899482749529935e-01 4.2326427306429526e-01 7.9937469215479973e-01 4.7996178890010205e-01 4.4188710575234985e-01 2.8316615782673287e+00 -7.5656652579618922e-01 -6.4321062825698794e-01 -2.8698973337039506e+00 -5.0608117876401248e-01 -4.9384984919092506e-01 -1.4949768778569228e+00 4.3488722231245031e-01 3.4278557062841392e-01 1.3868800522383586e+00 -3.2983017129996881e+00 -1.7946111760976724e+00 -9.4378787935188546e-01 3.7323103539697056e+00 1.6695724722985841e+00 7.4914859707220871e-01 2.5665133621994336e+00 1.6849382336010494e+00 4.9445722492915428e-01 -2.7239708916318830e+00 -1.4412390402454460e+00 -8.7805707634672103e-01 -4.9909821595300645e+00 -1.8964135754871903e+00 -7.5656652579618933e-01 5.1882123813395911e+00 1.7504922913042309e+00 1.0603020121673712e+00 3.1772659583339951e+00 1.5652352437129380e+00 8.4098544266260866e-01 -3.6510472916810919e+00 -1.5379744490864944e+00 -5.6648179533654663e-01 -1.5349334824272076e+00 -2.7137464121169734e+00 -7.3388316921463193e-01 1.6427676174318648e+00 2.4705969486582662e+00 5.0806976598793940e-01 1.4605804767405619e+00 1.9112274964583811e+00 4.0156130573320736e-01 -1.4292308104386422e+00 -1.6651563662101316e+00 -6.1022720430433186e-01 -1.9090698522626250e+00 -4.1713922673636805e+00 -6.4321062825698794e-01 1.7504922913042305e+00 3.9239576831840433e+00 7.4322874465230848e-01 1.5959234416182684e+00 2.6047481489360798e+00 7.1039693420015904e-01 -1.5765296819664516e+00 -2.3602352315459867e+00 -3.7593574879766234e-01 -8.9403540275823656e-01 -8.1008360553446024e-01 -1.7662034862087994e+00 7.4981377328414556e-01 5.1830615291448046e-01 1.5232647097558176e+00 7.0330650581025489e-01 6.4575259773260585e-01 8.1112458693455525e-01 -8.9453777965918002e-01 -6.2690326759807735e-01 -1.0459225540868444e+00 -7.4963581792257217e-01 -6.3363297448410305e-01 -2.8698973337039506e+00 1.0603020121673712e+00 7.4322874465230826e-01 3.1463047982772667e+00 8.5449782483603787e-01 7.0920623906805624e-01 1.6984611868516295e+00 -8.2971111575782153e-01 -5.4587388675081050e-01 -1.4971319078196745e+00 -2.1896787620177967e+00 -1.5343176920163994e+00 -7.5600502690082871e-01 2.5266455424046765e+00 1.4487123907281032e+00 5.2288760612232577e-01 2.9862280559996943e+00 1.6570808411726083e+00 6.0058806503114759e-01 -3.1094391498158220e+00 -1.4324475782757480e+00 -8.1859991896880457e-01 -3.0320578803493121e+00 -1.6548216413821688e+00 -5.0608117876401248e-01 3.1772659583339955e+00 1.5959234416182682e+00 8.5449782483603776e-01 4.3764654899271029e+00 1.7377929806450993e+00 8.4038325983159745e-01 -4.7354292544825389e+00 -1.8179227424897642e+00 -7.3767063118746234e-01 -1.5355649578530690e+00 -2.2114311702889968e+00 -7.6001086683007069e-01 1.7092267923448654e+00 1.9123500087890879e+00 4.3149560992422681e-01 1.6342016677465108e+00 2.8723886514568973e+00 5.6804452421620155e-01 -1.6537968791540807e+00 -2.5774404006218168e+00 -7.3983390286909523e-01 -1.7006605210042498e+00 -2.9454435924108271e+00 -4.9384984919092506e-01 1.5652352437129380e+00 2.6047481489360798e+00 7.0920623906805624e-01 1.7377929806450996e+00 4.3277769493365152e+00 8.3191759365959284e-01 -1.7564343264380144e+00 -3.9829485951969410e+00 -5.4696934797798602e-01 -7.5811810693348458e-01 -7.6151408599678472e-01 -1.0408256129952149e+00 7.6295771443029570e-01 5.4452740730533233e-01 8.1639153067482939e-01 5.6582610941447165e-01 5.4456712906930727e-01 1.4407701416336354e+00 -8.6952312564294876e-01 -6.8080666818035696e-01 -1.6856613826515332e+00 -7.0038823962963581e-01 -6.6780811754912150e-01 -1.4949768778569228e+00 8.4098544266260866e-01 7.1039693420015915e-01 1.6984611868516295e+00 8.4038325983159745e-01 8.3191759365959284e-01 3.0166190764545737e+00 -6.8212305413290475e-01 -5.2128019250812863e-01 -2.7507780621109963e+00 2.5220369210861318e+00 1.7345996196757945e+00 7.7741747452281318e-01 -3.0224107660883601e+00 -1.5794556408543663e+00 -4.4018322373929936e-01 -3.4186745540011065e+00 -1.8252328411926733e+00 -3.8507487191288720e-01 3.5188313580634487e+00 1.5470085862422951e+00 6.5185491051199373e-01 3.4500090976081577e+00 1.6916750646658327e+00 4.3488722231245031e-01 -3.6510472916810923e+00 -1.5765296819664516e+00 -8.2971111575782153e-01 -4.7354292544825389e+00 -1.7564343264380144e+00 -6.8212305413290486e-01 5.3366844894953616e+00 1.7643692198675844e+00 4.7293265819565539e-01 1.4245109892008256e+00 1.8731542813466953e+00 5.3568346646465581e-01 -1.5332346070077612e+00 -1.6991673624071890e+00 -2.8555648878466350e-01 -1.5501717260210974e+00 -2.6134628539315781e+00 -2.7580050035035625e-01 1.5265989463789853e+00 2.3254341540612118e+00 4.3483765259727136e-01 1.7238243691577224e+00 2.6157517777489616e+00 3.4278557062841392e-01 -1.5379744490864944e+00 -2.3602352315459871e+00 -5.4587388675081061e-01 -1.8179227424897639e+00 -3.9829485951969410e+00 -5.2128019250812863e-01 1.7643692198675840e+00 3.8414738299248268e+00 3.1520437870361745e-01 4.9099465971534001e-01 4.0175317006021111e-01 7.8111434878159347e-01 -3.9631885883301460e-01 -2.6474129893675813e-01 -7.4355322380297284e-01 -3.5983580158384748e-01 -3.1112563583750796e-01 -1.3673995803006664e+00 6.9079376059628861e-01 4.6875552764627287e-01 1.4330275608450282e+00 4.0558600843358755e-01 3.1305895513981313e-01 1.3868800522383586e+00 -5.6648179533654663e-01 -3.7593574879766223e-01 -1.4971319078196745e+00 -7.3767063118746246e-01 -5.4696934797798602e-01 -2.7507780621109963e+00 4.7293265819565539e-01 3.1520437870361750e-01 2.7578408121693290e+00 108 109 110 168 169 170 183 184 185 450 451 452 111 112 113 171 172 173 186 187 188 453 454 455 4.4094453424794038e+00 1.8493710803337622e+00 9.0791270441247474e-01 -4.7312727612203069e+00 -1.8859075552409017e+00 -7.5929248781909631e-01 -2.9573313923918967e+00 -1.6623537703286038e+00 -4.7303576617761683e-01 3.0927207794774674e+00 1.5806341299075819e+00 8.4521474724539669e-01 2.9735429573604146e+00 1.6901107806334830e+00 6.1205254792591834e-01 -3.1169705340462110e+00 -1.4583495783069664e+00 -8.6823870246028856e-01 -2.0874830212844255e+00 -1.4762327803323747e+00 -7.3403309068157196e-01 2.4173486296255562e+00 1.3627276933340196e+00 4.6942004755478584e-01 1.8493710803337622e+00 4.4233084056780347e+00 9.1440254860178016e-01 -1.9077975691814895e+00 -4.0046631906211267e+00 -5.8630920807153475e-01 -1.7025229740507701e+00 -2.9374274734102745e+00 -4.7226009459405865e-01 1.5725789812449056e+00 2.5540385205878118e+00 7.1053021480206136e-01 1.7071966278261370e+00 2.8781830889240902e+00 5.8913508192391040e-01 -1.7234230614894224e+00 -2.5642143596704430e+00 -7.9199789291686418e-01 -1.4715628906549396e+00 -2.1444892479490605e+00 -7.4537352265843826e-01 1.6761598059718161e+00 1.7952642564609684e+00 3.8187287291314581e-01 9.0791270441247474e-01 9.1440254860178016e-01 3.0159305412813509e+00 -7.8443836822734891e-01 -5.9977922827473318e-01 -2.6844994834502200e+00 -7.0557556355333806e-01 -6.8483762787360236e-01 -1.4354130950509385e+00 8.5414186035153949e-01 7.2330902987294510e-01 1.6459597475120940e+00 6.2385280006091726e-01 5.9176299847372549e-01 1.4014821242866273e+00 -9.1986115968810078e-01 -7.1311589112820739e-01 -1.6749733423245137e+00 -7.3450308298785738e-01 -7.4818903414944915e-01 -1.0138730270772127e+00 7.5847080963171398e-01 5.1644720447754111e-01 7.4538653482281325e-01 -4.7312727612203060e+00 -1.9077975691814895e+00 -7.8443836822734891e-01 5.2892029219353587e+00 1.8681137114542665e+00 5.2407692631346248e-01 3.3788411117073980e+00 1.7143375239983545e+00 3.8861683371713340e-01 -3.5655021210509155e+00 -1.5679781920729783e+00 -8.1216626608190212e-01 -3.4213206606456095e+00 -1.8575730501776646e+00 -4.1427173468617046e-01 3.5547375921078266e+00 1.5673702423151208e+00 7.2787112636558349e-01 2.4246730266006971e+00 1.6526372254111172e+00 7.4073269763299199e-01 -2.9293591094344471e+00 -1.4691098917467258e+00 -3.7042121503375197e-01 -1.8859075552409017e+00 -4.0046631906211276e+00 -5.9977922827473318e-01 1.8681137114542663e+00 3.7839757464873878e+00 3.5693690552521862e-01 1.7207234392836972e+00 2.6138910261680786e+00 3.1508785519455595e-01 -1.5421139276605489e+00 -2.3150942454345107e+00 -5.3993396977714569e-01 -1.6227206258052875e+00 -2.6087659825058394e+00 -3.0783720105896029e-01 1.5920274562641312e+00 2.3162654687786230e+00 4.9752827513429154e-01 1.3868847512488636e+00 1.8353225115353995e+00 5.2260776259637565e-01 -1.5170072495442193e+00 -1.6209313344080105e+00 -2.4461039933960402e-01 -7.5929248781909642e-01 -5.8630920807153497e-01 -2.6844994834502200e+00 5.2407692631346248e-01 3.5693690552521862e-01 2.6226976802757962e+00 4.1598469320813319e-01 3.3675413201949400e-01 1.3446709088967099e+00 -5.8739566249044417e-01 -3.9780297766262113e-01 -1.4482240014438996e+00 -3.9648683912977462e-01 -3.3522760867769785e-01 -1.3226127858853014e+00 7.1484699716490741e-01 4.7924353884733117e-01 1.4202915205955171e+00 4.9684062516150573e-01 4.0776933126239867e-01 7.7870403550832734e-01 -4.0857425240869372e-01 -2.6136411324258868e-01 -7.1102787449693039e-01 -2.9573313923918967e+00 -1.7025229740507704e+00 -7.0557556355333784e-01 3.3788411117073980e+00 1.7207234392836970e+00 4.1598469320813319e-01 4.6039511413857310e+00 1.9025285550877884e+00 3.9700852159264599e-01 -4.7064856056975275e+00 -1.7969365642488846e+00 -6.5282826704753716e-01 -2.3452201476020984e+00 -1.6052950503313530e+00 -3.3850071703020723e-01 2.4649509893526069e+00 1.3982347134337976e+00 6.8171222510226881e-01 2.9020380348153569e+00 1.5783024408962658e+00 5.3798894213738069e-01 -3.3407441315695685e+00 -1.4950345600705413e+00 -3.3578983440934806e-01 -1.6623537703286038e+00 -2.9374274734102745e+00 -6.8483762787360236e-01 1.7143375239983545e+00 2.6138910261680790e+00 3.3675413201949406e-01 1.9025285550877880e+00 4.3959110980046852e+00 3.7477542933382890e-01 -1.7732387871361497e+00 -3.9893050150999088e+00 -5.6364134346799144e-01 -1.6379667719746529e+00 -2.1817546168113622e+00 -3.2602086899531413e-01 1.6251654185307531e+00 1.8338441199002296e+00 6.3127778123437295e-01 1.6026258863253036e+00 2.8214354817147083e+00 5.2244826770059682e-01 -1.7710980545027919e+00 -2.5565946204661576e+00 -2.9075576995138636e-01 -4.7303576617761683e-01 -4.7226009459405877e-01 -1.4354130950509387e+00 3.8861683371713340e-01 3.1508785519455590e-01 1.3446709088967099e+00 3.9700852159264594e-01 3.7477542933382896e-01 2.6741555730204611e+00 -6.8843943590052403e-01 -6.0011480575902931e-01 -2.7266323408659239e+00 -3.2052161866650991e-01 -3.0254886442784834e-01 -7.0288848431358497e-01 4.7094056498706727e-01 3.8414046932909768e-01 7.7662288492818798e-01 5.8504618945934550e-01 5.5708763081564683e-01 1.4199384437479274e+00 -3.5961528901154105e-01 -2.5616761989219305e-01 -1.3504538903628380e+00 3.0927207794774674e+00 1.5725789812449056e+00 8.5414186035153949e-01 -3.5655021210509155e+00 -1.5421139276605489e+00 -5.8739566249044406e-01 -4.7064856056975275e+00 -1.7732387871361499e+00 -6.8843943590052414e-01 4.9481046450930473e+00 1.6371221738533843e+00 9.8055950275196591e-01 2.4415961234094565e+00 1.6012253884286329e+00 4.9057768830409593e-01 -2.6238981825010508e+00 -1.3658771493813560e+00 -8.7690710317364173e-01 -3.0254352561094753e+00 -1.5974958596813276e+00 -8.4955949388393526e-01 3.4388996173789983e+00 1.4677991803324599e+00 6.7702264404094592e-01 1.5806341299075819e+00 2.5540385205878113e+00 7.2330902987294521e-01 -1.5679781920729783e+00 -2.3150942454345107e+00 -3.9780297766262113e-01 -1.7969365642488846e+00 -3.9893050150999088e+00 -6.0011480575902931e-01 1.6371221738533841e+00 3.7841722518617189e+00 6.9018967425357980e-01 1.4103223742906932e+00 1.8085470078315771e+00 4.0197258457695362e-01 -1.3743504451881041e+00 -1.5855257575173238e+00 -6.0821911291196029e-01 -1.3746620825875808e+00 -2.5184813661920558e+00 -6.6376427598304688e-01 1.4858486060458880e+00 2.2616486039626920e+00 4.5442988361318060e-01 8.4521474724539669e-01 7.1053021480206136e-01 1.6459597475120940e+00 -8.1216626608190212e-01 -5.3993396977714569e-01 -1.4482240014438996e+00 -6.5282826704753716e-01 -5.6364134346799166e-01 -2.7266323408659239e+00 9.8055950275196613e-01 6.9018967425357969e-01 3.0440651138329273e+00 6.6917316740700128e-01 6.0639193017246262e-01 7.6162389619262694e-01 -8.5542974837841401e-01 -5.8963835505780182e-01 -1.0172117983449078e+00 -7.9766878418238418e-01 -7.2485387082023867e-01 -1.6703350259643075e+00 6.2314564828587338e-01 4.1095571989507418e-01 1.4107544090813917e+00 2.9735429573604151e+00 1.7071966278261370e+00 6.2385280006091715e-01 -3.4213206606456099e+00 -1.6227206258052875e+00 -3.9648683912977462e-01 -2.3452201476020984e+00 -1.6379667719746527e+00 -3.2052161866650991e-01 2.4415961234094565e+00 1.4103223742906932e+00 6.6917316740700128e-01 4.6308504441513039e+00 1.9439500105196226e+00 4.4050484425408987e-01 -4.6983108279096193e+00 -1.8212566947954898e+00 -7.1998074357155140e-01 -2.8999375060786092e+00 -1.6422924993981947e+00 -6.7537534681346223e-01 3.3187996173147627e+00 1.6627675793371719e+00 3.7883373645929180e-01 1.6901107806334834e+00 2.8781830889240902e+00 5.9176299847372549e-01 -1.8575730501776644e+00 -2.6087659825058394e+00 -3.3522760867769780e-01 -1.6052950503313528e+00 -2.1817546168113622e+00 -3.0254886442784834e-01 1.6012253884286329e+00 1.8085470078315773e+00 6.0639193017246262e-01 1.9439500105196226e+00 4.3579719730115691e+00 4.0865926334416702e-01 -1.8122469237574657e+00 -3.9142598594254787e+00 -6.1267676651572167e-01 -1.5895077398302355e+00 -2.8499507169550728e+00 -6.4843736963731746e-01 1.6293365845149799e+00 2.5100291059305162e+00 2.9207641726823175e-01 6.1205254792591834e-01 5.8913508192391040e-01 1.4014821242866273e+00 -4.1427173468617051e-01 -3.0783720105896029e-01 -1.3226127858853014e+00 -3.3850071703020723e-01 -3.2602086899531413e-01 -7.0288848431358497e-01 4.9057768830409593e-01 4.0197258457695362e-01 7.6162389619262705e-01 4.4050484425408981e-01 4.0865926334416725e-01 2.6397311969370163e+00 -7.1577533160787754e-01 -6.1196483340946839e-01 -2.6701630631182467e+00 -4.7740025805784514e-01 -4.7143690409527811e-01 -1.4323726985440612e+00 4.0281296089799629e-01 3.1749287771398971e-01 1.3251998144449244e+00 -3.1169705340462110e+00 -1.7234230614894224e+00 -9.1986115968810089e-01 3.5547375921078270e+00 1.5920274562641312e+00 7.1484699716490741e-01 2.4649509893526069e+00 1.6251654185307531e+00 4.7094056498706727e-01 -2.6238981825010508e+00 -1.3743504451881041e+00 -8.5542974837841401e-01 -4.6983108279096193e+00 -1.8122469237574657e+00 -7.1577533160787754e-01 4.8974528877145653e+00 1.6594348363930025e+00 1.0312868193821658e+00 3.0428590347807014e+00 1.5007878604254383e+00 8.1604817747841074e-01 -3.5208209594988200e+00 -1.4673951411783335e+00 -5.4205631933816056e-01 -1.4583495783069664e+00 -2.5642143596704434e+00 -7.1311589112820739e-01 1.5673702423151212e+00 2.3162654687786230e+00 4.7924353884733117e-01 1.3982347134337976e+00 1.8338441199002296e+00 3.8414046932909773e-01 -1.3658771493813560e+00 -1.5855257575173238e+00 -5.8963835505780182e-01 -1.8212566947954894e+00 -3.9142598594254783e+00 -6.1196483340946839e-01 1.6594348363930025e+00 3.6661649502234392e+00 7.1620243694936525e-01 1.5318160402410057e+00 2.4978826622596562e+00 6.9117108473814026e-01 -1.5113724098991144e+00 -2.2501572245487016e+00 -3.5603845026845826e-01 -8.6823870246028856e-01 -7.9199789291686407e-01 -1.6749733423245137e+00 7.2787112636558349e-01 4.9752827513429154e-01 1.4202915205955171e+00 6.8171222510226859e-01 6.3127778123437284e-01 7.7662288492818787e-01 -8.7690710317364173e-01 -6.0821911291196029e-01 -1.0172117983449078e+00 -7.1998074357155151e-01 -6.1267676651572156e-01 -2.6701630631182467e+00 1.0312868193821658e+00 7.1620243694936525e-01 2.9583301586435851e+00 8.3370858787202518e-01 6.9326343468185003e-01 1.6418425766942666e+00 -8.0945220951656116e-01 -5.2537815565533363e-01 -1.4347389370738901e+00 -2.0874830212844255e+00 -1.4715628906549396e+00 -7.3450308298785738e-01 2.4246730266006971e+00 1.3868847512488638e+00 4.9684062516150573e-01 2.9020380348153569e+00 1.6026258863253031e+00 5.8504618945934550e-01 -3.0254352561094757e+00 -1.3746620825875808e+00 -7.9766878418238418e-01 -2.8999375060786092e+00 -1.5895077398302355e+00 -4.7740025805784514e-01 3.0428590347807014e+00 1.5318160402410057e+00 8.3370858787202506e-01 4.2778319975640393e+00 1.6799744620449204e+00 8.1787267181495971e-01 -4.6345463102882851e+00 -1.7655684267873377e+00 -7.2389594907975074e-01 -1.4762327803323745e+00 -2.1444892479490605e+00 -7.4818903414944915e-01 1.6526372254111172e+00 1.8353225115353995e+00 4.0776933126239867e-01 1.5783024408962658e+00 2.8214354817147078e+00 5.5708763081564683e-01 -1.5974958596813276e+00 -2.5184813661920558e+00 -7.2485387082023867e-01 -1.6422924993981947e+00 -2.8499507169550724e+00 -4.7143690409527805e-01 1.5007878604254383e+00 2.4978826622596562e+00 6.9326343468184992e-01 1.6799744620449206e+00 4.2655953151003558e+00 8.1850506096534037e-01 -1.6956808493658446e+00 -3.9073146395139302e+00 -5.3214564866027170e-01 -7.3403309068157196e-01 -7.4537352265843826e-01 -1.0138730270772127e+00 7.4073269763299199e-01 5.2260776259637565e-01 7.7870403550832734e-01 5.3798894213738069e-01 5.2244826770059682e-01 1.4199384437479274e+00 -8.4955949388393504e-01 -6.6376427598304688e-01 -1.6703350259643075e+00 -6.7537534681346212e-01 -6.4843736963731746e-01 -1.4323726985440612e+00 8.1604817747841085e-01 6.9117108473814026e-01 1.6418425766942666e+00 8.1787267181495971e-01 8.1850506096534037e-01 2.9901213382924068e+00 -6.5367455768477334e-01 -4.9715700772165050e-01 -2.7140256426573481e+00 2.4173486296255562e+00 1.6761598059718159e+00 7.5847080963171398e-01 -2.9293591094344471e+00 -1.5170072495442193e+00 -4.0857425240869372e-01 -3.3407441315695685e+00 -1.7710980545027919e+00 -3.5961528901154105e-01 3.4388996173789979e+00 1.4858486060458880e+00 6.2314564828587349e-01 3.3187996173147631e+00 1.6293365845149801e+00 4.0281296089799640e-01 -3.5208209594988200e+00 -1.5113724098991144e+00 -8.0945220951656116e-01 -4.6345463102882851e+00 -1.6956808493658451e+00 -6.5367455768477345e-01 5.2504226464718009e+00 1.7038135667792866e+00 4.4688688980598790e-01 1.3627276933340196e+00 1.7952642564609689e+00 5.1644720447754111e-01 -1.4691098917467262e+00 -1.6209313344080105e+00 -2.6136411324258868e-01 -1.4950345600705413e+00 -2.5565946204661572e+00 -2.5616761989219311e-01 1.4677991803324595e+00 2.2616486039626915e+00 4.1095571989507423e-01 1.6627675793371719e+00 2.5100291059305162e+00 3.1749287771398971e-01 -1.4673951411783335e+00 -2.2501572245487012e+00 -5.2537815565533363e-01 -1.7655684267873377e+00 -3.9073146395139311e+00 -4.9715700772165033e-01 1.7038135667792864e+00 3.7680558525826240e+00 2.9517109442516226e-01 4.6942004755478584e-01 3.8187287291314581e-01 7.4538653482281325e-01 -3.7042121503375192e-01 -2.4461039933960402e-01 -7.1102787449693028e-01 -3.3578983440934801e-01 -2.9075576995138636e-01 -1.3504538903628380e+00 6.7702264404094592e-01 4.5442988361318054e-01 1.4107544090813917e+00 3.7883373645929175e-01 2.9207641726823175e-01 1.3251998144449244e+00 -5.4205631933816067e-01 -3.5603845026845826e-01 -1.4347389370738901e+00 -7.2389594907975074e-01 -5.3214564866027170e-01 -2.7140256426573481e+00 4.4688688980598795e-01 2.9517109442516232e-01 2.7289055862418774e+00 51 52 53 111 112 113 453 454 455 438 439 440 54 55 56 114 115 116 456 457 458 441 442 443 4.0035793172212903e+00 1.5650955810334668e+00 1.1532074725243060e+00 -4.3556851922805189e+00 -1.6441831472867532e+00 -1.1314522400813127e+00 -2.6339245697669034e+00 -1.4188429890932344e+00 -7.5447140655370204e-01 2.6872403309744075e+00 1.3298894972182180e+00 1.0675361493471631e+00 2.6683955411072997e+00 1.4460069659133539e+00 9.0651455701221573e-01 -2.7266640671620488e+00 -1.2011479692268350e+00 -1.0785955124728253e+00 -1.7481145721138551e+00 -1.2151055382027678e+00 -8.9926470555736659e-01 2.1051732120203295e+00 1.1382875996445527e+00 7.3652568578152111e-01 1.5650955810334664e+00 4.1837932267223668e+00 1.2249774068443744e+00 -1.6710910511642074e+00 -3.7850402932196472e+00 -9.1292374266214016e-01 -1.4982408253132820e+00 -2.6954497428300845e+00 -7.8461274506253353e-01 1.3342166820831740e+00 2.3307793780277706e+00 9.3471996871029406e-01 1.4733663295627275e+00 2.6539413415962523e+00 8.9435097753394510e-01 -1.4569605588302776e+00 -2.3538972053540523e+00 -1.0302813821479451e+00 -1.2261806960040995e+00 -1.9212668241635773e+00 -9.6754670376154295e-01 1.4797945386324993e+00 1.5871401192209720e+00 6.4131622054554738e-01 1.1532074725243058e+00 1.2249774068443740e+00 3.4270199472289371e+00 -1.1561848786703066e+00 -9.1821439214771339e-01 -3.0451980493518165e+00 -9.9288207243024029e-01 -9.7294359354322502e-01 -1.7024415073644401e+00 1.0877514958881909e+00 9.5154360869101717e-01 1.9693942696563311e+00 9.1524871929969542e-01 8.8354814380111735e-01 1.7224200922134814e+00 -1.1574448191841245e+00 -9.1569953533502857e-01 -2.0502406060335083e+00 -9.0909317421505376e-01 -9.6929986564417314e-01 -1.3292680522908862e+00 1.0593972567875334e+00 7.1608822733363142e-01 1.0083139059419013e+00 -4.3556851922805198e+00 -1.6710910511642076e+00 -1.1561848786703066e+00 4.9869887591358717e+00 1.6594365993345810e+00 1.0188030135443205e+00 3.1044735734243942e+00 1.5229148804703347e+00 7.6738099370392099e-01 -3.1962194963817017e+00 -1.3651317938268546e+00 -1.1452150861603068e+00 -3.1688179252318549e+00 -1.6358321774907798e+00 -8.2979126918025337e-01 3.2100686562550811e+00 1.3278914978833245e+00 1.0714899093317216e+00 2.1030928603845487e+00 1.4273694401239327e+00 1.0157710160557347e+00 -2.6839012353058211e+00 -1.2655573953303312e+00 -7.4225369862483026e-01 -1.6441831472867530e+00 -3.7850402932196476e+00 -9.1821439214771328e-01 1.6594365993345810e+00 3.5848178373913946e+00 6.7947103332761960e-01 1.5310451973879367e+00 2.3899117696449821e+00 6.1492801373401507e-01 -1.3201440091647119e+00 -2.1124975895771287e+00 -7.5200575581830043e-01 -1.4335687744163947e+00 -2.4015090731046023e+00 -6.0806861070836093e-01 1.3712288960992334e+00 2.1318776353301123e+00 7.3237654103695538e-01 1.1769620757173582e+00 1.6308656607493268e+00 7.3150396512734250e-01 -1.3407768376712499e+00 -1.4384259472144365e+00 -4.7999079455155697e-01 -1.1314522400813125e+00 -9.1292374266214016e-01 -3.0451980493518165e+00 1.0188030135443209e+00 6.7947103332761960e-01 2.8996647312414359e+00 8.1323687719146953e-01 6.4942722900162830e-01 1.5382888474576197e+00 -9.4711444134704281e-01 -6.4654060335311669e-01 -1.7298520640797517e+00 -7.9399407683290468e-01 -6.5884745736846195e-01 -1.5588072116693070e+00 1.0753583810713765e+00 7.1007024357924253e-01 1.7528196681073942e+00 7.7934984061317802e-01 6.7638528274342824e-01 1.0526017739993463e+00 -8.1418735415908461e-01 -4.9704198526820043e-01 -9.0951769570492025e-01 -2.6339245697669038e+00 -1.4982408253132820e+00 -9.9288207243024018e-01 3.1044735734243942e+00 1.5310451973879367e+00 8.1323687719146953e-01 4.1826808698185669e+00 1.6818016585446511e+00 7.7043769459798872e-01 -4.2015936139317542e+00 -1.5383987730400766e+00 -9.9211599567873965e-01 -2.1204871501935627e+00 -1.4109931307500541e+00 -6.7101310825932914e-01 2.1701938637645521e+00 1.1930498787123636e+00 9.5611689638602748e-01 2.5365083101189438e+00 1.3342474517726792e+00 7.9749939930049796e-01 -3.0378512832342386e+00 -1.2925114573142180e+00 -6.8127969110767372e-01 -1.4188429890932348e+00 -2.6954497428300845e+00 -9.7294359354322502e-01 1.5229148804703350e+00 2.3899117696449816e+00 6.4942722900162830e-01 1.6818016585446511e+00 3.9905385451399882e+00 7.2755181803355318e-01 -1.5266398541448276e+00 -3.6095390773919402e+00 -8.4357631175968284e-01 -1.4461370073838327e+00 -1.9557033756349296e+00 -6.4184154232342561e-01 1.3867114638372529e+00 1.6318707454827126e+00 8.6899931026911892e-01 1.3726065072006473e+00 2.5198838634788068e+00 7.9264842366435251e-01 -1.5724146594309909e+00 -2.2715127278895331e+00 -5.8026533334231833e-01 -7.5447140655370204e-01 -7.8461274506253365e-01 -1.7024415073644406e+00 7.6738099370392099e-01 6.1492801373401507e-01 1.5382888474576200e+00 7.7043769459798872e-01 7.2755181803355318e-01 2.7363346655094296e+00 -1.0107220306573375e+00 -8.6503153382383624e-01 -2.8804576329574814e+00 -6.4426433681715023e-01 -6.0128348459696512e-01 -8.9255680794281200e-01 7.7059385289324989e-01 6.0658633362622061e-01 1.0493647645822155e+00 8.3923091590368115e-01 8.0848934868569067e-01 1.6206845790729405e+00 -7.3818568307065158e-01 -5.0662775059614440e-01 -1.4692169083574707e+00 2.6872403309744080e+00 1.3342166820831742e+00 1.0877514958881909e+00 -3.1962194963817012e+00 -1.3201440091647119e+00 -9.4711444134704281e-01 -4.2015936139317533e+00 -1.5266398541448276e+00 -1.0107220306573375e+00 4.3330233871030712e+00 1.3689345515342570e+00 1.2443920681378455e+00 2.1436093488909029e+00 1.3553562460494286e+00 7.9852316833956949e-01 -2.2327676342220739e+00 -1.1250107753125602e+00 -1.1033088161999363e+00 -2.5737499111964186e+00 -1.3231681396985011e+00 -1.0478978238279839e+00 3.0404575887635654e+00 1.2364552986537409e+00 9.7837637966669277e-01 1.3298894972182180e+00 2.3307793780277706e+00 9.5154360869101717e-01 -1.3651317938268546e+00 -2.1124975895771287e+00 -6.4654060335311669e-01 -1.5383987730400768e+00 -3.6095390773919407e+00 -8.6503153382383624e-01 1.3689345515342568e+00 3.4120308374818080e+00 8.9275932736177888e-01 1.2136035832330676e+00 1.6130648557406608e+00 6.3918546933768394e-01 -1.1466873606739181e+00 -1.4011424967875774e+00 -7.7900931265069728e-01 -1.1320748834377454e+00 -2.2355014269440039e+00 -8.4197108017471223e-01 1.2698651789930537e+00 2.0028055194504124e+00 6.4906412461188157e-01 1.0675361493471631e+00 9.3471996871029406e-01 1.9693942696563311e+00 -1.1452150861603068e+00 -7.5200575581830031e-01 -1.7298520640797517e+00 -9.9211599567873987e-01 -8.4357631175968284e-01 -2.8804576329574809e+00 1.2443920681378458e+00 8.9275932736177888e-01 3.2419644607686862e+00 9.3495525584805683e-01 8.2706439391009401e-01 1.0403778258536525e+00 -1.0752683651172705e+00 -7.4485614594918070e-01 -1.3372094412887319e+00 -9.7927683252071940e-01 -9.2267003948999393e-01 -1.9178288101462528e+00 9.4499280614397119e-01 6.0856456303499140e-01 1.6136113921935475e+00 2.6683955411072997e+00 1.4733663295627275e+00 9.1524871929969553e-01 -3.1688179252318549e+00 -1.4335687744163947e+00 -7.9399407683290468e-01 -2.1204871501935632e+00 -1.4461370073838329e+00 -6.4426433681715023e-01 2.1436093488909029e+00 1.2136035832330674e+00 9.3495525584805683e-01 4.3164147031694720e+00 1.6967486299197485e+00 8.3987189830044173e-01 -4.3102145767036912e+00 -1.5473899707773666e+00 -1.0655138483949909e+00 -2.5534222031684597e+00 -1.3979140122711906e+00 -9.2248775372661729e-01 3.0245222621298948e+00 1.4412912221332417e+00 7.3618414232346807e-01 1.4460069659133539e+00 2.6539413415962523e+00 8.8354814380111746e-01 -1.6358321774907798e+00 -2.4015090731046027e+00 -6.5884745736846195e-01 -1.4109931307500538e+00 -1.9557033756349296e+00 -6.0128348459696512e-01 1.3553562460494288e+00 1.6130648557406604e+00 8.2706439391009390e-01 1.6967486299197485e+00 4.0448334262176173e+00 7.7351684292445810e-01 -1.5334907527719108e+00 -3.6374191954742430e+00 -8.8198029315435289e-01 -1.3300572704431035e+00 -2.5586917574465691e+00 -8.9356757700571943e-01 1.4122614895733183e+00 2.2414837781058146e+00 5.5154943148982871e-01 9.0651455701221573e-01 8.9435097753394499e-01 1.7224200922134816e+00 -8.2979126918025337e-01 -6.0806861070836093e-01 -1.5588072116693070e+00 -6.7101310825932903e-01 -6.4184154232342561e-01 -8.9255680794281200e-01 7.9852316833956949e-01 6.3918546933768394e-01 1.0403778258536525e+00 8.3987189830044184e-01 7.7351684292445821e-01 2.8625602301979161e+00 -1.0719426903084164e+00 -8.9465243597224453e-01 -2.9915743977710507e+00 -7.4703491052057758e-01 -7.5631879669021751e-01 -1.6770064768673745e+00 7.7487235461635007e-01 5.9382809589816121e-01 1.4945867459854938e+00 -2.7266640671620488e+00 -1.4569605588302774e+00 -1.1574448191841245e+00 3.2100686562550815e+00 1.3712288960992334e+00 1.0753583810713765e+00 2.1701938637645521e+00 1.3867114638372529e+00 7.7059385289324989e-01 -2.2327676342220739e+00 -1.1466873606739181e+00 -1.0752683651172705e+00 -4.3102145767036912e+00 -1.5334907527719108e+00 -1.0719426903084166e+00 4.4125986089303213e+00 1.3693549142932442e+00 1.3100859498271118e+00 2.6203247712130682e+00 1.2263454801339533e+00 1.0101321067014952e+00 -3.1435396220752123e+00 -1.2165020820875772e+00 -8.6151441588342037e-01 -1.2011479692268352e+00 -2.3538972053540523e+00 -9.1569953533502857e-01 1.3278914978833245e+00 2.1318776353301123e+00 7.1007024357924275e-01 1.1930498787123636e+00 1.6318707454827126e+00 6.0658633362622061e-01 -1.1250107753125602e+00 -1.4011424967875774e+00 -7.4485614594918070e-01 -1.5473899707773664e+00 -3.6374191954742425e+00 -8.9465243597224442e-01 1.3693549142932440e+00 3.4111342340578470e+00 9.1538610529255005e-01 1.2665866027935275e+00 2.2301379415646458e+00 8.8174830801215853e-01 -1.2833341783656984e+00 -2.0125616588194464e+00 -5.5858287325371692e-01 -1.0785955124728253e+00 -1.0302813821479451e+00 -2.0502406060335079e+00 1.0714899093317216e+00 7.3237654103695549e-01 1.7528196681073942e+00 9.5611689638602748e-01 8.6899931026911903e-01 1.0493647645822155e+00 -1.1033088161999363e+00 -7.7900931265069728e-01 -1.3372094412887319e+00 -1.0655138483949909e+00 -8.8198029315435289e-01 -2.9915743977710507e+00 1.3100859498271118e+00 9.1538610529254982e-01 3.3301523226378014e+00 1.0415985332275266e+00 8.8226762199440922e-01 1.9292795860996501e+00 -1.1318731117046359e+00 -7.0775859064003810e-01 -1.6825918963337703e+00 -1.7481145721138549e+00 -1.2261806960040991e+00 -9.0909317421505398e-01 2.1030928603845491e+00 1.1769620757173582e+00 7.7934984061317802e-01 2.5365083101189438e+00 1.3726065072006470e+00 8.3923091590368104e-01 -2.5737499111964182e+00 -1.1320748834377452e+00 -9.7927683252071940e-01 -2.5534222031684592e+00 -1.3300572704431037e+00 -7.4703491052057758e-01 2.6203247712130682e+00 1.2665866027935273e+00 1.0415985332275266e+00 3.7156031435337171e+00 1.3685697872717495e+00 1.0028713366537836e+00 -4.1002423987715471e+00 -1.4964121230983345e+00 -1.0276457091418179e+00 -1.2151055382027678e+00 -1.9212668241635773e+00 -9.6929986564417314e-01 1.4273694401239327e+00 1.6308656607493268e+00 6.7638528274342835e-01 1.3342474517726792e+00 2.5198838634788063e+00 8.0848934868569067e-01 -1.3231681396985011e+00 -2.2355014269440039e+00 -9.2267003948999415e-01 -1.3979140122711908e+00 -2.5586917574465691e+00 -7.5631879669021740e-01 1.2263454801339533e+00 2.2301379415646458e+00 8.8226762199440922e-01 1.3685697872717495e+00 3.8135434006374096e+00 1.0437701060981519e+00 -1.4203444691298566e+00 -3.4789708578760381e+00 -7.6262365769729434e-01 -8.9926470555736659e-01 -9.6754670376154284e-01 -1.3292680522908862e+00 1.0157710160557345e+00 7.3150396512734250e-01 1.0526017739993463e+00 7.9749939930049807e-01 7.9264842366435262e-01 1.6206845790729405e+00 -1.0478978238279839e+00 -8.4197108017471201e-01 -1.9178288101462528e+00 -9.2248775372661729e-01 -8.9356757700571932e-01 -1.6770064768673745e+00 1.0101321067014952e+00 8.8174830801215864e-01 1.9292795860996501e+00 1.0028713366537838e+00 1.0437701060981517e+00 3.1582121312603970e+00 -9.5662357559954458e-01 -7.4658544196003118e-01 -2.8366747311278200e+00 2.1051732120203295e+00 1.4797945386324993e+00 1.0593972567875334e+00 -2.6839012353058211e+00 -1.3407768376712501e+00 -8.1418735415908461e-01 -3.0378512832342386e+00 -1.5724146594309911e+00 -7.3818568307065158e-01 3.0404575887635654e+00 1.2698651789930537e+00 9.4499280614397130e-01 3.0245222621298948e+00 1.4122614895733181e+00 7.7487235461635007e-01 -3.1435396220752123e+00 -1.2833341783656986e+00 -1.1318731117046359e+00 -4.1002423987715479e+00 -1.4203444691298563e+00 -9.5662357559954447e-01 4.7953814764730316e+00 1.4549489373989255e+00 8.6160730698606081e-01 1.1382875996445527e+00 1.5871401192209720e+00 7.1608822733363142e-01 -1.2655573953303312e+00 -1.4384259472144365e+00 -4.9704198526820043e-01 -1.2925114573142180e+00 -2.2715127278895335e+00 -5.0662775059614451e-01 1.2364552986537409e+00 2.0028055194504124e+00 6.0856456303499140e-01 1.4412912221332417e+00 2.2414837781058146e+00 5.9382809589816121e-01 -1.2165020820875772e+00 -2.0125616588194464e+00 -7.0775859064003821e-01 -1.4964121230983343e+00 -3.4789708578760385e+00 -7.4658544196003129e-01 1.4549489373989257e+00 3.3700417750222558e+00 5.3953288219762918e-01 7.3652568578152111e-01 6.4131622054554727e-01 1.0083139059419013e+00 -7.4225369862483026e-01 -4.7999079455155697e-01 -9.0951769570492025e-01 -6.8127969110767372e-01 -5.8026533334231833e-01 -1.4692169083574707e+00 9.7837637966669277e-01 6.4906412461188157e-01 1.6136113921935473e+00 7.3618414232346818e-01 5.5154943148982882e-01 1.4945867459854938e+00 -8.6151441588342037e-01 -5.5858287325371703e-01 -1.6825918963337698e+00 -1.0276457091418179e+00 -7.6262365769729423e-01 -2.8366747311278200e+00 8.6160730698606069e-01 5.3953288219762907e-01 2.7814891874030372e+00 111 112 113 171 172 173 186 187 188 453 454 455 114 115 116 174 175 176 189 190 191 456 457 458 3.7570035316108079e+00 1.4956464030407046e+00 1.1071360869068869e+00 -4.1039491258544505e+00 -1.5722249339587717e+00 -1.0802899321491697e+00 -2.5215027419924705e+00 -1.3706050830828578e+00 -7.2149820996615277e-01 2.5746683024257755e+00 1.2783850252423723e+00 1.0337294193847846e+00 2.5270035943545834e+00 1.3915745382146314e+00 8.6521279988112743e-01 -2.5850256307523143e+00 -1.1449968811002866e+00 -1.0437104590591786e+00 -1.6715086131107202e+00 -1.1708461677598379e+00 -8.6846632638393040e-01 2.0233106833187873e+00 1.0930670994040450e+00 7.0788662138563208e-01 1.4956464030407046e+00 3.9727930060670595e+00 1.1934615026911730e+00 -1.6093634244143507e+00 -3.5584755279549651e+00 -8.6941841157074462e-01 -1.4461669531500838e+00 -2.6131967353140331e+00 -7.5752591940883474e-01 1.2853518094229672e+00 2.2389121093329627e+00 9.0839499443993021e-01 1.4216032237645981e+00 2.5420520506092061e+00 8.6171735060263321e-01 -1.4042306003086464e+00 -2.2367925172921339e+00 -1.0057063406683557e+00 -1.1796954072372783e+00 -1.8719596283065223e+00 -9.4694261514141242e-01 1.4368549488820883e+00 1.5266672428584245e+00 6.1601943905561107e-01 1.1071360869068869e+00 1.1934615026911732e+00 3.2473576112409908e+00 -1.1179257939953675e+00 -8.7960191930837828e-01 -2.8483045234059845e+00 -9.5987701729902952e-01 -9.5034387975574330e-01 -1.6363603021963264e+00 1.0569367449669687e+00 9.2604733418176732e-01 1.9066019916967081e+00 8.8317210210102004e-01 8.5812069761677268e-01 1.6258017136460106e+00 -1.1229039143220116e+00 -8.8696796209802131e-01 -1.9646386699450797e+00 -8.7920363132953527e-01 -9.5145087444245624e-01 -1.2989378072866820e+00 1.0326654229710670e+00 6.9073510111488579e-01 9.6847998625036347e-01 -4.1039491258544496e+00 -1.6093634244143511e+00 -1.1179257939953673e+00 4.7493570688042261e+00 1.5882143038069376e+00 9.6620981391718441e-01 2.9973225420976055e+00 1.4760810079481073e+00 7.3268934239449968e-01 -3.0920876365919483e+00 -1.3099298579851981e+00 -1.1132515850272027e+00 -3.0333551497410216e+00 -1.5872530778326686e+00 -7.8729290565760635e-01 3.0724235846876549e+00 1.2731866024822023e+00 1.0413422362856641e+00 2.0260943259772866e+00 1.3872130394956292e+00 9.8838256488329701e-01 -2.6158056093793500e+00 -1.2181485935006577e+00 -7.1015367280046882e-01 -1.5722249339587717e+00 -3.5584755279549651e+00 -8.7960191930837828e-01 1.5882143038069376e+00 3.3575641697131395e+00 6.3544566489997134e-01 1.4803757004288745e+00 2.2967920385780403e+00 5.8455082678847925e-01 -1.2690997238108288e+00 -2.0166195324958238e+00 -7.2185618553685238e-01 -1.3778144036139559e+00 -2.2809085984562536e+00 -5.7170020357835494e-01 1.3118624347828078e+00 2.0086544874550087e+00 7.0234211863081708e-01 1.1311572701337309e+00 1.5699293664129328e+00 7.0382522164254224e-01 -1.2924706477687931e+00 -1.3769364032520792e+00 -4.5300552353822393e-01 -1.0802899321491701e+00 -8.6941841157074462e-01 -2.8483045234059845e+00 9.6620981391718441e-01 6.3544566489997123e-01 2.7042620845001113e+00 7.7309325472301949e-01 6.1655964377150807e-01 1.4684979505982008e+00 -9.1107693252364286e-01 -6.1298513694134682e-01 -1.6579186140698523e+00 -7.5209439553694701e-01 -6.2483746853720412e-01 -1.4602818567842524e+00 1.0339147402867135e+00 6.7463139333785338e-01 1.6540453014721241e+00 7.4730428847104202e-01 6.4783106782043354e-01 1.0097996042057895e+00 -7.7706083718819918e-01 -4.6722675278047016e-01 -8.7009994651613509e-01 -2.5215027419924705e+00 -1.4461669531500843e+00 -9.5987701729902952e-01 2.9973225420976055e+00 1.4803757004288745e+00 7.7309325472301949e-01 4.1003675196988683e+00 1.6379728142990182e+00 7.3732200234778322e-01 -4.1178250139421504e+00 -1.4926111373518867e+00 -9.5621147595037015e-01 -2.0450974978412906e+00 -1.3661065944427484e+00 -6.3442238809905516e-01 2.0923803219135371e+00 1.1466661934022984e+00 9.2681530782399724e-01 2.4736494427960833e+00 1.2915626550625723e+00 7.6402761665236651e-01 -2.9792945727301818e+00 -1.2516926782480429e+00 -6.5074730019871163e-01 -1.3706050830828578e+00 -2.6131967353140326e+00 -9.5034387975574319e-01 1.4760810079481070e+00 2.2967920385780403e+00 6.1655964377150818e-01 1.6379728142990182e+00 3.9351823922623117e+00 7.0078116171105942e-01 -1.4810226535763757e+00 -3.5415527235070323e+00 -8.1535290563643081e-01 -1.4056640908899092e+00 -1.9045617861228081e+00 -6.1236949697518250e-01 1.3419243839481747e+00 1.5724249671579393e+00 8.4809879333608840e-01 1.3336732789690737e+00 2.4827667914741922e+00 7.6732197933731650e-01 -1.5323596576152301e+00 -2.2278549445286080e+00 -5.5469529578861598e-01 -7.2149820996615266e-01 -7.5752591940883451e-01 -1.6363603021963264e+00 7.3268934239449968e-01 5.8455082678847925e-01 1.4684979505982005e+00 7.3732200234778345e-01 7.0078116171105942e-01 2.6940664426210712e+00 -9.8506679889930915e-01 -8.4505840735695259e-01 -2.8338437231507596e+00 -6.1342591250770118e-01 -5.7539929470833961e-01 -8.5381247469695665e-01 7.4012110081132243e-01 5.8312372097642784e-01 1.0109880598583973e+00 8.1702722217468304e-01 7.9187250351252925e-01 1.5947735928010027e+00 -7.0716874635512472e-01 -4.8234459151436854e-01 -1.4443095458346304e+00 2.5746683024257755e+00 1.2853518094229672e+00 1.0569367449669687e+00 -3.0920876365919487e+00 -1.2690997238108288e+00 -9.1107693252364275e-01 -4.1178250139421504e+00 -1.4810226535763757e+00 -9.8506679889930915e-01 4.2557421580431205e+00 1.3199533079787922e+00 1.2170905594731636e+00 2.0689104383517662e+00 1.3126411499323287e+00 7.6475529027357925e-01 -2.1584025237932121e+00 -1.0796113484628977e+00 -1.0788071948383442e+00 -2.5139757293885130e+00 -1.2826752075765040e+00 -1.0226197654244513e+00 2.9829700048951606e+00 1.1944626660925168e+00 9.5878809697203593e-01 1.2783850252423723e+00 2.2389121093329631e+00 9.2604733418176743e-01 -1.3099298579851979e+00 -2.0166195324958234e+00 -6.1298513694134682e-01 -1.4926111373518869e+00 -3.5415527235070323e+00 -8.4505840735695259e-01 1.3199533079787922e+00 3.3446819743909448e+00 8.6573939596778138e-01 1.1673176094426319e+00 1.5527893781699074e+00 6.1192721849471976e-01 -1.0960274072697127e+00 -1.3405212138545419e+00 -7.5330905709520746e-01 -1.0895717643205416e+00 -2.1927252508710651e+00 -8.2009175204530471e-01 1.2224842242635421e+00 1.9550352588346478e+00 6.2773040479454334e-01 1.0337294193847846e+00 9.0839499443993033e-01 1.9066019916967081e+00 -1.1132515850272027e+00 -7.2185618553685238e-01 -1.6579186140698519e+00 -9.5621147595037015e-01 -8.1535290563643081e-01 -2.8338437231507596e+00 1.2170905594731631e+00 8.6573939596778127e-01 3.2043228281283649e+00 9.0448844349386182e-01 8.0403656900095000e-01 9.9819569545987807e-01 -1.0453221739131651e+00 -7.1895155030609736e-01 -1.3050280275765136e+00 -9.5190829190727011e-01 -9.0261522243465775e-01 -1.8991817253237189e+00 9.1138510444619725e-01 5.8060490450537627e-01 1.5868515748358929e+00 2.5270035943545834e+00 1.4216032237645981e+00 8.8317210210102004e-01 -3.0333551497410216e+00 -1.3778144036139559e+00 -7.5209439553694690e-01 -2.0450974978412906e+00 -1.4056640908899092e+00 -6.1342591250770118e-01 2.0689104383517667e+00 1.1673176094426319e+00 9.0448844349386182e-01 4.1197880692284796e+00 1.6400488314823898e+00 7.9384770242875247e-01 -4.1084512690866912e+00 -1.4884601646457283e+00 -1.0279202428659195e+00 -2.4640434388767378e+00 -1.3574874547680467e+00 -8.9244166944708814e-01 2.9352452536109115e+00 1.4004564492280207e+00 7.0437397233402177e-01 1.3915745382146310e+00 2.5420520506092061e+00 8.5812069761677268e-01 -1.5872530778326688e+00 -2.2809085984562536e+00 -6.2483746853720412e-01 -1.3661065944427484e+00 -1.9045617861228084e+00 -5.7539929470833961e-01 1.3126411499323289e+00 1.5527893781699074e+00 8.0403656900095011e-01 1.6400488314823898e+00 3.8775605535695830e+00 7.3559020863299918e-01 -1.4730103801432310e+00 -3.4593507431253196e+00 -8.5279321746355063e-01 -1.2835018987917943e+00 -2.4960071802208246e+00 -8.6986793452346278e-01 1.3656074315810915e+00 2.1684263255765091e+00 5.2515043998183530e-01 8.6521279988112743e-01 8.6171735060263321e-01 1.6258017136460106e+00 -7.8729290565760623e-01 -5.7170020357835494e-01 -1.4602818567842524e+00 -6.3442238809905516e-01 -6.1236949697518250e-01 -8.5381247469695665e-01 7.6475529027357925e-01 6.1192721849471976e-01 9.9819569545987807e-01 7.9384770242875213e-01 7.3559020863299907e-01 2.7116629238612573e+00 -1.0257668137993796e+00 -8.5922752139243941e-01 -2.8376281223406257e+00 -7.1321335363805183e-01 -7.3066803944444769e-01 -1.6244789307643321e+00 7.3687966861063314e-01 5.6473048366007228e-01 1.4405410516190202e+00 -2.5850256307523147e+00 -1.4042306003086464e+00 -1.1229039143220116e+00 3.0724235846876553e+00 1.3118624347828078e+00 1.0339147402867135e+00 2.0923803219135371e+00 1.3419243839481747e+00 7.4012110081132243e-01 -2.1584025237932125e+00 -1.0960274072697129e+00 -1.0453221739131651e+00 -4.1084512690866921e+00 -1.4730103801432308e+00 -1.0257668137993796e+00 4.2131025301695750e+00 1.3061558626723198e+00 1.2726943853769936e+00 2.5292896623509784e+00 1.1790703311168489e+00 9.7871091988912284e-01 -3.0553166754895265e+00 -1.1657446247985601e+00 -8.3144824432959619e-01 -1.1449968811002869e+00 -2.2367925172921344e+00 -8.8696796209802131e-01 1.2731866024822025e+00 2.0086544874550087e+00 6.7463139333785338e-01 1.1466661934022984e+00 1.5724249671579391e+00 5.8312372097642773e-01 -1.0796113484628977e+00 -1.3405212138545419e+00 -7.1895155030609725e-01 -1.4884601646457283e+00 -3.4593507431253192e+00 -8.5922752139243930e-01 1.3061558626723198e+00 3.2348414566543999e+00 8.8195619302857187e-01 1.2235465340801119e+00 2.1589643940149892e+00 8.5898105876410935e-01 -1.2364867984280183e+00 -1.9382208310103410e+00 -5.3354533231040435e-01 -1.0437104590591786e+00 -1.0057063406683557e+00 -1.9646386699450797e+00 1.0413422362856639e+00 7.0234211863081697e-01 1.6540453014721241e+00 9.2681530782399724e-01 8.4809879333608840e-01 1.0109880598583976e+00 -1.0788071948383442e+00 -7.5330905709520746e-01 -1.3050280275765136e+00 -1.0279202428659195e+00 -8.5279321746355063e-01 -2.8376281223406257e+00 1.2726943853769939e+00 8.8195619302857176e-01 3.1894250304191063e+00 1.0144925497714508e+00 8.6028011440654772e-01 1.8841997419002561e+00 -1.1049065824946622e+00 -6.8086860417491069e-01 -1.6313633137876644e+00 -1.6715086131107202e+00 -1.1796954072372783e+00 -8.7920363132953516e-01 2.0260943259772866e+00 1.1311572701337309e+00 7.4730428847104180e-01 2.4736494427960833e+00 1.3336732789690737e+00 8.1702722217468293e-01 -2.5139757293885125e+00 -1.0895717643205418e+00 -9.5190829190727000e-01 -2.4640434388767383e+00 -1.2835018987917943e+00 -7.1321335363805183e-01 2.5292896623509784e+00 1.2235465340801119e+00 1.0144925497714508e+00 3.6613319354333402e+00 1.3284840586082587e+00 9.7558269525115793e-01 -4.0408375851817180e+00 -1.4640920714415602e+00 -1.0100814787934762e+00 -1.1708461677598379e+00 -1.8719596283065223e+00 -9.5145087444245635e-01 1.3872130394956295e+00 1.5699293664129328e+00 6.4783106782043354e-01 1.2915626550625723e+00 2.4827667914741922e+00 7.9187250351252925e-01 -1.2826752075765040e+00 -2.1927252508710655e+00 -9.0261522243465775e-01 -1.3574874547680473e+00 -2.4960071802208246e+00 -7.3066803944444769e-01 1.1790703311168491e+00 2.1589643940149887e+00 8.6028011440654772e-01 1.3284840586082587e+00 3.7863637191548025e+00 1.0274173866564107e+00 -1.3753212541789197e+00 -3.4373322116585037e+00 -7.4266693607435941e-01 -8.6846632638393051e-01 -9.4694261514141254e-01 -1.2989378072866820e+00 9.8838256488329701e-01 7.0382522164254224e-01 1.0097996042057895e+00 7.6402761665236651e-01 7.6732197933731650e-01 1.5947735928010027e+00 -1.0226197654244513e+00 -8.2009175204530460e-01 -1.8991817253237189e+00 -8.9244166944708803e-01 -8.6986793452346278e-01 -1.6244789307643321e+00 9.7871091988912284e-01 8.5898105876410935e-01 1.8841997419002561e+00 9.7558269525115793e-01 1.0274173866564107e+00 3.1462243273894379e+00 -9.2317603542047355e-01 -7.2064334469019842e-01 -2.8123988029217539e+00 2.0233106833187873e+00 1.4368549488820883e+00 1.0326654229710670e+00 -2.6158056093793500e+00 -1.2924706477687931e+00 -7.7706083718819918e-01 -2.9792945727301809e+00 -1.5323596576152299e+00 -7.0716874635512472e-01 2.9829700048951611e+00 1.2224842242635421e+00 9.1138510444619703e-01 2.9352452536109115e+00 1.3656074315810918e+00 7.3687966861063314e-01 -3.0553166754895265e+00 -1.2364867984280183e+00 -1.1049065824946624e+00 -4.0408375851817180e+00 -1.3753212541789197e+00 -9.2317603542047322e-01 4.7497285009559160e+00 1.4116917532642381e+00 8.3138200543056251e-01 1.0930670994040452e+00 1.5266672428584247e+00 6.9073510111488579e-01 -1.2181485935006577e+00 -1.3769364032520792e+00 -4.6722675278047010e-01 -1.2516926782480431e+00 -2.2278549445286080e+00 -4.8234459151436859e-01 1.1944626660925168e+00 1.9550352588346478e+00 5.8060490450537627e-01 1.4004564492280207e+00 2.1684263255765091e+00 5.6473048366007228e-01 -1.1657446247985601e+00 -1.9382208310103413e+00 -6.8086860417491080e-01 -1.4640920714415604e+00 -3.4373322116585041e+00 -7.2064334469019820e-01 1.4116917532642379e+00 3.3302155631799510e+00 5.1501280387961346e-01 7.0788662138563208e-01 6.1601943905561118e-01 9.6847998625036358e-01 -7.1015367280046870e-01 -4.5300552353822399e-01 -8.7009994651613509e-01 -6.5074730019871163e-01 -5.5469529578861587e-01 -1.4443095458346304e+00 9.5878809697203604e-01 6.2773040479454334e-01 1.5868515748358929e+00 7.0437397233402177e-01 5.2515043998183530e-01 1.4405410516190202e+00 -8.3144824432959630e-01 -5.3354533231040446e-01 -1.6313633137876644e+00 -1.0100814787934762e+00 -7.4266693607435930e-01 -2.8123988029217539e+00 8.3138200543056262e-01 5.1501280387961335e-01 2.7622989963549065e+00 54 55 56 114 115 116 456 457 458 441 442 443 57 58 59 117 118 119 459 460 461 444 445 446 3.1308529330248822e+00 1.1042329446981116e+00 1.1042329446981114e+00 -3.4492470216264461e+00 -1.2105640496282357e+00 -1.2105640496282357e+00 -2.0308982519646226e+00 -1.0261614964033579e+00 -8.1087968457663495e-01 2.0267335632646248e+00 9.4618599054521613e-01 1.0447716667464531e+00 2.0267335632646248e+00 1.0447716667464539e+00 9.4618599054521602e-01 -2.0308982519646230e+00 -8.1087968457663528e-01 -1.0261614964033581e+00 -1.2370584026063911e+00 -8.3929646432442384e-01 -8.3929646432442351e-01 1.5637818686079497e+00 7.9171109294287134e-01 7.9171109294287090e-01 1.1042329446981116e+00 3.5054446869083318e+00 1.3113908607368647e+00 -1.2476663464832876e+00 -3.1039464599822200e+00 -1.0110938826200142e+00 -1.1333140841989022e+00 -2.2224443921234847e+00 -9.1811449535858680e-01 9.6278744266089733e-01 1.8813055963191503e+00 9.7591620428690251e-01 1.0778511754119882e+00 2.1490804818150404e+00 9.9250489906049300e-01 -1.0491226099020952e+00 -1.8716465069444543e+00 -1.0691241499046380e+00 -8.5877488015973447e-01 -1.5455927617656178e+00 -1.0144956188724252e+00 1.1440063579730220e+00 1.2077993557732547e+00 7.3301618267140356e-01 1.1042329446981116e+00 1.3113908607368647e+00 3.5054446869083309e+00 -1.2476663464832876e+00 -1.0110938826200142e+00 -3.1039464599822195e+00 -1.0491226099020952e+00 -1.0691241499046378e+00 -1.8716465069444543e+00 1.0778511754119884e+00 9.9250489906049311e-01 2.1490804818150391e+00 9.6278744266089700e-01 9.7591620428690318e-01 1.8813055963191507e+00 -1.1333140841989024e+00 -9.1811449535858725e-01 -2.2224443921234847e+00 -8.5877488015973458e-01 -1.0144956188724255e+00 -1.5455927617656176e+00 1.1440063579730220e+00 7.3301618267140400e-01 1.2077993557732543e+00 -3.4492470216264461e+00 -1.2476663464832880e+00 -1.2476663464832878e+00 4.1227121019050550e+00 1.2351772572069410e+00 1.2351772572069410e+00 2.5116737394607815e+00 1.1604954058086183e+00 9.3255605551867271e-01 -2.5354307453359399e+00 -1.0019937876885994e+00 -1.2394424219540612e+00 -2.5354307453359395e+00 -1.2394424219540623e+00 -1.0019937876885994e+00 2.5116737394607820e+00 9.3255605551867304e-01 1.1604954058086185e+00 1.5598775215928915e+00 1.0690112574996000e+00 1.0690112574995998e+00 -2.1858285901211829e+00 -9.0813741990788344e-01 -9.0813741990788299e-01 -1.2105640496282359e+00 -3.1039464599822195e+00 -1.0110938826200144e+00 1.2351772572069410e+00 2.9306519195193976e+00 7.8048899644321224e-01 1.1718156702853064e+00 1.9210696266946006e+00 7.3536220395701590e-01 -9.5158740861689672e-01 -1.6822710444666444e+00 -7.7811208876536297e-01 -1.0635359172673140e+00 -1.9031340736556177e+00 -7.0944607499267387e-01 9.8582262677972399e-01 1.6717240406211964e+00 7.7191632445330105e-01 8.3893069918438612e-01 1.2562574970372586e+00 7.6292297383135921e-01 -1.0060588779439108e+00 -1.0903515057679702e+00 -5.5203845230683679e-01 -1.2105640496282355e+00 -1.0110938826200142e+00 -3.1039464599822191e+00 1.2351772572069410e+00 7.8048899644321224e-01 2.9306519195193972e+00 9.8582262677972365e-01 7.7191632445330094e-01 1.6717240406211966e+00 -1.0635359172673144e+00 -7.0944607499267387e-01 -1.9031340736556173e+00 -9.5158740861689639e-01 -7.7811208876536353e-01 -1.6822710444666442e+00 1.1718156702853069e+00 7.3536220395701613e-01 1.9210696266945997e+00 8.3893069918438612e-01 7.6292297383135943e-01 1.2562574970372584e+00 -1.0060588779439108e+00 -5.5203845230683701e-01 -1.0903515057679700e+00 -2.0308982519646226e+00 -1.1333140841989024e+00 -1.0491226099020952e+00 2.5116737394607820e+00 1.1718156702853069e+00 9.8582262677972365e-01 3.4417240401515734e+00 1.2927435040729915e+00 9.2732270250957183e-01 -3.3978591407220726e+00 -1.1356705848083111e+00 -1.0862078958862309e+00 -1.6524583322218307e+00 -1.0647652235514899e+00 -7.9662044304648871e-01 1.6531495951557393e+00 8.5445502923024796e-01 1.0106811098033484e+00 1.9530854339553394e+00 9.6389027787449877e-01 8.3880628729528273e-01 -2.4784170838149069e+00 -9.4915458890434223e-01 -8.3068177755311090e-01 -1.0261614964033576e+00 -2.2224443921234851e+00 -1.0691241499046378e+00 1.1604954058086183e+00 1.9210696266946006e+00 7.7191632445330072e-01 1.2927435040729915e+00 3.3336405716165833e+00 8.8992367767444869e-01 -1.1302032612546387e+00 -2.9816196164644451e+00 -9.2880859871848520e-01 -1.0988621505153193e+00 -1.5560347443522531e+00 -7.7436852622464458e-01 1.0106811098033484e+00 1.2627172176322212e+00 9.2476831993435371e-01 1.0115112647214313e+00 2.0471846577208037e+00 8.8280391150128412e-01 -1.2202043762330732e+00 -1.8045133207240263e+00 -6.9711095871561912e-01 -8.1087968457663495e-01 -9.1811449535858680e-01 -1.8716465069444543e+00 9.3255605551867271e-01 7.3536220395701590e-01 1.6717240406211968e+00 9.2732270250957172e-01 8.8992367767444880e-01 2.7322222200267214e+00 -1.1009611002069895e+00 -9.4491654593887953e-01 -2.9158370216989740e+00 -7.7180939684974270e-01 -7.2695223794035635e-01 -1.0649637497650590e+00 8.5445502923024774e-01 6.6273662420647006e-01 1.2627172176322212e+00 8.8782523372537547e-01 8.8768970971408423e-01 1.7485706618357129e+00 -9.1850883935050043e-01 -5.8572893631419631e-01 -1.5627868617073650e+00 2.0267335632646248e+00 9.6278744266089733e-01 1.0778511754119884e+00 -2.5354307453359404e+00 -9.5158740861689661e-01 -1.0635359172673144e+00 -3.3978591407220726e+00 -1.1302032612546387e+00 -1.1009611002069897e+00 3.4572575454056040e+00 9.7104268988891052e-01 1.2565878351040682e+00 1.6261958572110655e+00 9.8225183886620915e-01 8.7923594169069608e-01 -1.6524583322218314e+00 -7.7180939684974326e-01 -1.0988621505153202e+00 -1.9381797047557503e+00 -9.4173003942041822e-01 -1.0199022286396244e+00 2.4137409571543005e+00 8.7924813472567998e-01 1.0695864444224950e+00 9.4618599054521579e-01 1.8813055963191503e+00 9.9250489906049311e-01 -1.0019937876885994e+00 -1.6822710444666444e+00 -7.0944607499267387e-01 -1.1356705848083113e+00 -2.9816196164644451e+00 -9.4491654593887964e-01 9.7104268988891107e-01 2.8097176837747844e+00 9.0415669815360178e-01 8.7923594169069585e-01 1.2519691973325457e+00 7.0351568246395424e-01 -7.9662044304648882e-01 -1.0649637497650593e+00 -7.7436852622464469e-01 -7.8320374199671261e-01 -1.7902142330913400e+00 -8.4858612554790958e-01 9.2102393541528926e-01 1.5760761663610094e+00 6.7713999302605798e-01 1.0447716667464531e+00 9.7591620428690251e-01 2.1490804818150391e+00 -1.2394424219540614e+00 -7.7811208876536297e-01 -1.9031340736556173e+00 -1.0862078958862311e+00 -9.2880859871848542e-01 -2.9158370216989744e+00 1.2565878351040682e+00 9.0415669815360189e-01 3.2822609647088821e+00 9.8225183886620782e-01 8.7017642737328038e-01 1.2519691973325453e+00 -1.0647652235514893e+00 -7.2695223794035613e-01 -1.5560347443522526e+00 -9.3841975865622562e-01 -9.4600641229909721e-01 -2.0509696504449901e+00 1.0452239593312775e+00 6.2963000790951718e-01 1.7426648462953671e+00 2.0267335632646248e+00 1.0778511754119882e+00 9.6278744266089689e-01 -2.5354307453359399e+00 -1.0635359172673140e+00 -9.5158740861689628e-01 -1.6524583322218307e+00 -1.0988621505153195e+00 -7.7180939684974270e-01 1.6261958572110655e+00 8.7923594169069597e-01 9.8225183886620770e-01 3.4572575454056018e+00 1.2565878351040689e+00 9.7104268988891018e-01 -3.3978591407220731e+00 -1.1009611002069895e+00 -1.1302032612546382e+00 -1.9381797047557501e+00 -1.0199022286396242e+00 -9.4173003942041766e-01 2.4137409571543000e+00 1.0695864444224952e+00 8.7924813472567931e-01 1.0447716667464539e+00 2.1490804818150404e+00 9.7591620428690318e-01 -1.2394424219540623e+00 -1.9031340736556177e+00 -7.7811208876536364e-01 -1.0647652235514899e+00 -1.5560347443522531e+00 -7.2695223794035624e-01 9.8225183886620915e-01 1.2519691973325457e+00 8.7017642737328038e-01 1.2565878351040687e+00 3.2822609647088830e+00 9.0415669815360256e-01 -1.0862078958862325e+00 -2.9158370216989744e+00 -9.2880859871848642e-01 -9.3841975865622629e-01 -2.0509696504449910e+00 -9.4600641229909754e-01 1.0452239593312787e+00 1.7426648462953676e+00 6.2963000790951718e-01 9.4618599054521602e-01 9.9250489906049311e-01 1.8813055963191507e+00 -1.0019937876885994e+00 -7.0944607499267387e-01 -1.6822710444666440e+00 -7.9662044304648871e-01 -7.7436852622464458e-01 -1.0649637497650590e+00 8.7923594169069608e-01 7.0351568246395424e-01 1.2519691973325453e+00 9.7104268988891040e-01 9.0415669815360256e-01 2.8097176837747844e+00 -1.1356705848083113e+00 -9.4491654593887975e-01 -2.9816196164644446e+00 -7.8320374199671283e-01 -8.4858612554790991e-01 -1.7902142330913402e+00 9.2102393541528949e-01 6.7713999302605821e-01 1.5760761663610088e+00 -2.0308982519646226e+00 -1.0491226099020954e+00 -1.1333140841989024e+00 2.5116737394607824e+00 9.8582262677972399e-01 1.1718156702853066e+00 1.6531495951557391e+00 1.0106811098033484e+00 8.5445502923024763e-01 -1.6524583322218311e+00 -7.9662044304648894e-01 -1.0647652235514893e+00 -3.3978591407220731e+00 -1.0862078958862325e+00 -1.1356705848083113e+00 3.4417240401515738e+00 9.2732270250957205e-01 1.2927435040729922e+00 1.9530854339553396e+00 8.3880628729528284e-01 9.6389027787449910e-01 -2.4784170838149069e+00 -8.3068177755311146e-01 -9.4915458890434201e-01 -8.1087968457663517e-01 -1.8716465069444546e+00 -9.1811449535858725e-01 9.3255605551867304e-01 1.6717240406211964e+00 7.3536220395701601e-01 8.5445502923024774e-01 1.2627172176322212e+00 6.6273662420647006e-01 -7.7180939684974337e-01 -1.0649637497650593e+00 -7.2695223794035602e-01 -1.1009611002069895e+00 -2.9158370216989735e+00 -9.4491654593887953e-01 9.2732270250957205e-01 2.7322222200267210e+00 8.8992367767444902e-01 8.8782523372537603e-01 1.7485706618357133e+00 8.8768970971408434e-01 -9.1850883935050043e-01 -1.5627868617073648e+00 -5.8572893631419620e-01 -1.0261614964033581e+00 -1.0691241499046380e+00 -2.2224443921234847e+00 1.1604954058086185e+00 7.7191632445330105e-01 1.9210696266945999e+00 1.0106811098033484e+00 9.2476831993435371e-01 1.2627172176322212e+00 -1.0988621505153202e+00 -7.7436852622464469e-01 -1.5560347443522526e+00 -1.1302032612546384e+00 -9.2880859871848642e-01 -2.9816196164644446e+00 1.2927435040729922e+00 8.8992367767444924e-01 3.3336405716165833e+00 1.0115112647214315e+00 8.8280391150128457e-01 2.0471846577208042e+00 -1.2202043762330737e+00 -6.9711095871561946e-01 -1.8045133207240256e+00 -1.2370584026063911e+00 -8.5877488015973458e-01 -8.5877488015973458e-01 1.5598775215928915e+00 8.3893069918438612e-01 8.3893069918438612e-01 1.9530854339553392e+00 1.0115112647214313e+00 8.8782523372537558e-01 -1.9381797047557505e+00 -7.8320374199671261e-01 -9.3841975865622540e-01 -1.9381797047557501e+00 -9.3841975865622629e-01 -7.8320374199671283e-01 1.9530854339553398e+00 8.8782523372537603e-01 1.0115112647214315e+00 2.9012517959126392e+00 9.4501146808602543e-01 9.4501146808602521e-01 -3.2538823732983180e+00 -1.1028802849045458e+00 -1.1028802849045454e+00 -8.3929646432442362e-01 -1.5455927617656178e+00 -1.0144956188724252e+00 1.0690112574996000e+00 1.2562574970372586e+00 7.6292297383135943e-01 9.6389027787449888e-01 2.0471846577208037e+00 8.8768970971408434e-01 -9.4173003942041822e-01 -1.7902142330913400e+00 -9.4600641229909710e-01 -1.0199022286396242e+00 -2.0509696504449910e+00 -8.4858612554790969e-01 8.3880628729528284e-01 1.7485706618357133e+00 8.8280391150128457e-01 9.4501146808602543e-01 3.1343110125343570e+00 1.0743032556925269e+00 -1.0157905583709403e+00 -2.7995471838261849e+00 -7.9863169401982192e-01 -8.3929646432442340e-01 -1.0144956188724252e+00 -1.5455927617656176e+00 1.0690112574995996e+00 7.6292297383135921e-01 1.2562574970372584e+00 8.3880628729528273e-01 8.8280391150128412e-01 1.7485706618357129e+00 -1.0199022286396244e+00 -8.4858612554790969e-01 -2.0509696504449901e+00 -9.4173003942041766e-01 -9.4600641229909754e-01 -1.7902142330913400e+00 9.6389027787449888e-01 8.8768970971408445e-01 2.0471846577208042e+00 9.4501146808602510e-01 1.0743032556925269e+00 3.1343110125343574e+00 -1.0157905583709408e+00 -7.9863169401982248e-01 -2.7995471838261849e+00 1.5637818686079497e+00 1.1440063579730217e+00 1.1440063579730220e+00 -2.1858285901211829e+00 -1.0060588779439108e+00 -1.0060588779439108e+00 -2.4784170838149069e+00 -1.2202043762330732e+00 -9.1850883935050054e-01 2.4137409571543005e+00 9.2102393541528926e-01 1.0452239593312775e+00 2.4137409571543000e+00 1.0452239593312787e+00 9.2102393541528937e-01 -2.4784170838149069e+00 -9.1850883935050076e-01 -1.2202043762330739e+00 -3.2538823732983180e+00 -1.0157905583709403e+00 -1.0157905583709408e+00 4.0052813481327636e+00 1.0503083991788360e+00 1.0503083991788356e+00 7.9171109294287134e-01 1.2077993557732547e+00 7.3301618267140400e-01 -9.0813741990788355e-01 -1.0903515057679702e+00 -5.5203845230683701e-01 -9.4915458890434223e-01 -1.8045133207240263e+00 -5.8572893631419631e-01 8.7924813472567998e-01 1.5760761663610097e+00 6.2963000790951718e-01 1.0695864444224954e+00 1.7426648462953676e+00 6.7713999302605821e-01 -8.3068177755311157e-01 -1.5627868617073650e+00 -6.9711095871561957e-01 -1.1028802849045460e+00 -2.7995471838261849e+00 -7.9863169401982259e-01 1.0503083991788360e+00 2.7306585035959152e+00 5.9372385774949554e-01 7.9171109294287090e-01 7.3301618267140356e-01 1.2077993557732543e+00 -9.0813741990788288e-01 -5.5203845230683679e-01 -1.0903515057679700e+00 -8.3068177755311079e-01 -6.9711095871561901e-01 -1.5627868617073650e+00 1.0695864444224950e+00 6.7713999302605787e-01 1.7426648462953671e+00 8.7924813472567931e-01 6.2963000790951718e-01 1.5760761663610088e+00 -9.4915458890434223e-01 -5.8572893631419609e-01 -1.8045133207240258e+00 -1.1028802849045451e+00 -7.9863169401982192e-01 -2.7995471838261849e+00 1.0503083991788353e+00 5.9372385774949554e-01 2.7306585035959152e+00 114 115 116 174 175 176 189 190 191 456 457 458 117 118 119 177 178 179 462 463 464 459 460 461 3.0045948238427371e+00 1.0836432810561978e+00 1.0836432810561971e+00 -3.3209083814455682e+00 -1.1854968846998175e+00 -1.1854968846998175e+00 -1.9858689518970101e+00 -1.0167282174094323e+00 -7.9869467223629409e-01 1.9827442554689059e+00 9.3183874609756356e-01 1.0326443330034079e+00 1.9827442554689061e+00 1.0326443330034083e+00 9.3183874609756334e-01 -1.9858689518970110e+00 -7.9869467223629464e-01 -1.0167282174094325e+00 -1.2224185280110769e+00 -8.3112872650567704e-01 -8.3112872650567715e-01 1.5449814784701175e+00 7.8392214069405175e-01 7.8392214069405175e-01 1.0836432810561978e+00 3.3977036118317918e+00 1.3018753402154339e+00 -1.2368503342214683e+00 -2.9821806304521377e+00 -9.9300914895210646e-01 -1.1220561987603426e+00 -2.1931608467059771e+00 -9.1071110674704403e-01 9.5587385827230964e-01 1.8433447117807775e+00 9.7063644240007285e-01 1.0707825130337389e+00 2.1169428804645425e+00 9.8423514575981375e-01 -1.0388269337892995e+00 -1.8366156750745153e+00 -1.0665111247752648e+00 -8.5120526987871581e-01 -1.5432292959015081e+00 -1.0138787407021970e+00 1.1386390842875795e+00 1.1971952440570273e+00 7.2736319280129147e-01 1.0836432810561971e+00 1.3018753402154339e+00 3.3977036118317905e+00 -1.2368503342214681e+00 -9.9300914895210624e-01 -2.9821806304521385e+00 -1.0388269337892986e+00 -1.0665111247752643e+00 -1.8366156750745140e+00 1.0707825130337389e+00 9.8423514575981386e-01 2.1169428804645412e+00 9.5587385827230886e-01 9.7063644240007263e-01 1.8433447117807771e+00 -1.1220561987603421e+00 -9.1071110674704425e-01 -2.1931608467059771e+00 -8.5120526987871536e-01 -1.0138787407021965e+00 -1.5432292959015079e+00 1.1386390842875791e+00 7.2736319280129114e-01 1.1971952440570270e+00 -3.3209083814455691e+00 -1.2368503342214683e+00 -1.2368503342214678e+00 4.0073819830921362e+00 1.2135642707207521e+00 1.2135642707207519e+00 2.4727803672529443e+00 1.1559326006226671e+00 9.2291297245464332e-01 -2.4999491389142658e+00 -9.8815020936351439e-01 -1.2323918696847553e+00 -2.4999491389142654e+00 -1.2323918696847553e+00 -9.8815020936351394e-01 2.4727803672529456e+00 9.2291297245464388e-01 1.1559326006226671e+00 1.5483388445813806e+00 1.0651027691117045e+00 1.0651027691117045e+00 -2.1804749029053068e+00 -9.0012019964002932e-01 -9.0012019964002943e-01 -1.1854968846998175e+00 -2.9821806304521381e+00 -9.9300914895210612e-01 1.2135642707207521e+00 2.8058111199498761e+00 7.5825397461903998e-01 1.1583193831371834e+00 1.8813194445459231e+00 7.2288989021185213e-01 -9.3987975020942049e-01 -1.6393380505490125e+00 -7.6711302335014175e-01 -1.0526072744545980e+00 -1.8627311699317217e+00 -6.9467268276756911e-01 9.7055494348689542e-01 1.6306174561989872e+00 7.6123435012310203e-01 8.3111879452878878e-01 1.2437635245775509e+00 7.5451244274465945e-01 -9.9557348250978417e-01 -1.0772616943394648e+00 -5.4209580262883628e-01 -1.1854968846998175e+00 -9.9300914895210668e-01 -2.9821806304521381e+00 1.2135642707207523e+00 7.5825397461904021e-01 2.8058111199498770e+00 9.7055494348689497e-01 7.6123435012310225e-01 1.6306174561989859e+00 -1.0526072744545982e+00 -6.9467268276756966e-01 -1.8627311699317215e+00 -9.3987975020942016e-01 -7.6711302335014198e-01 -1.6393380505490125e+00 1.1583193831371839e+00 7.2288989021185279e-01 1.8813194445459240e+00 8.3111879452878890e-01 7.5451244274465934e-01 1.2437635245775509e+00 -9.9557348250978428e-01 -5.4209580262883628e-01 -1.0772616943394651e+00 -1.9858689518970101e+00 -1.1220561987603423e+00 -1.0388269337892986e+00 2.4727803672529443e+00 1.1583193831371834e+00 9.7055494348689475e-01 3.4197495783549208e+00 1.2863107710505350e+00 9.1646830336969920e-01 -3.3771607752075647e+00 -1.1243940021361505e+00 -1.0743759508243294e+00 -1.6404729974276837e+00 -1.0562214304492163e+00 -7.8365361313953175e-01 1.6384637608137793e+00 8.4609535477060371e-01 1.0036075006322522e+00 1.9605570171441704e+00 9.5648307529310694e-01 8.2843864443182913e-01 -2.4880479990335567e+00 -9.4453695290571948e-01 -8.2221289416751464e-01 -1.0167282174094323e+00 -2.1931608467059771e+00 -1.0665111247752643e+00 1.1559326006226671e+00 1.8813194445459231e+00 7.6123435012310214e-01 1.2863107710505353e+00 3.3241516775857614e+00 8.8350136567372273e-01 -1.1249693983665250e+00 -2.9628627130700562e+00 -9.2232032224338545e-01 -1.0973762076932225e+00 -1.5516317290157768e+00 -7.6689740069748824e-01 1.0036075006322527e+00 1.2539860239828313e+00 9.2248411967623301e-01 1.0109363263762994e+00 2.0641251234925653e+00 8.7937145874562406e-01 -1.2177133752125748e+00 -1.8159269808152718e+00 -6.9086244650254269e-01 -7.9869467223629409e-01 -9.1071110674704414e-01 -1.8366156750745140e+00 9.2291297245464332e-01 7.2288989021185224e-01 1.6306174561989859e+00 9.1646830336969942e-01 8.8350136567372251e-01 2.7140030306669889e+00 -1.0963942121798689e+00 -9.3934318458288413e-01 -2.8980298275197933e+00 -7.6509249348143882e-01 -7.2057418691749953e-01 -1.0527030421008046e+00 8.4609535477060349e-01 6.5730697864409171e-01 1.2539860239828307e+00 8.8735965658829918e-01 8.8798634055510928e-01 1.7599611435546259e+00 -9.1265490928564330e-01 -5.8105609683734849e-01 -1.5712191097083181e+00 1.9827442554689059e+00 9.5587385827230964e-01 1.0707825130337389e+00 -2.4999491389142658e+00 -9.3987975020942049e-01 -1.0526072744545982e+00 -3.3771607752075647e+00 -1.1249693983665248e+00 -1.0963942121798689e+00 3.4420344379133838e+00 9.6008803573005097e-01 1.2516992804807905e+00 1.6158400394106724e+00 9.7616349487538179e-01 8.7081432968684969e-01 -1.6404729974276844e+00 -7.6509249348143960e-01 -1.0973762076932232e+00 -1.9476980143475897e+00 -9.3757650197748477e-01 -1.0188414373912449e+00 2.4246621931041430e+00 8.7539275515712678e-01 1.0719230085175553e+00 9.3183874609756356e-01 1.8433447117807771e+00 9.8423514575981386e-01 -9.8815020936351439e-01 -1.6393380505490125e+00 -6.9467268276756966e-01 -1.1243940021361507e+00 -2.9628627130700562e+00 -9.3934318458288402e-01 9.6008803573005130e-01 2.7900207800885828e+00 8.9529186582694797e-01 8.7081432968684991e-01 1.2397218945424240e+00 6.9502239168040658e-01 -7.8365361313953275e-01 -1.0527030421008052e+00 -7.6689740069748880e-01 -7.7670507379773068e-01 -1.8009917209239732e+00 -8.4582788392402930e-01 9.1016178692246363e-01 1.5828081402320631e+00 6.7219174870480281e-01 1.0326443330034079e+00 9.7063644240007285e-01 2.1169428804645412e+00 -1.2323918696847553e+00 -7.6711302335014175e-01 -1.8627311699317215e+00 -1.0743759508243298e+00 -9.2232032224338545e-01 -2.8980298275197933e+00 1.2516992804807903e+00 8.9529186582694797e-01 3.2713853106890278e+00 9.7616349487538134e-01 8.6516718837839091e-01 1.2397218945424235e+00 -1.0562214304492168e+00 -7.2057418691749997e-01 -1.5516317290157766e+00 -9.3319554203184252e-01 -9.4341079619757906e-01 -2.0679423844409044e+00 1.0356776846305649e+00 6.2232283210319472e-01 1.7522850252122022e+00 1.9827442554689061e+00 1.0707825130337389e+00 9.5587385827230864e-01 -2.4999491389142654e+00 -1.0526072744545980e+00 -9.3987975020942027e-01 -1.6404729974276837e+00 -1.0973762076932225e+00 -7.6509249348143882e-01 1.6158400394106724e+00 8.7081432968684980e-01 9.7616349487538134e-01 3.4420344379133847e+00 1.2516992804807905e+00 9.6008803573005075e-01 -3.3771607752075674e+00 -1.0963942121798693e+00 -1.1249693983665245e+00 -1.9476980143475906e+00 -1.0188414373912447e+00 -9.3757650197748443e-01 2.4246621931041430e+00 1.0719230085175551e+00 8.7539275515712667e-01 1.0326443330034081e+00 2.1169428804645425e+00 9.7063644240007263e-01 -1.2323918696847553e+00 -1.8627311699317217e+00 -7.6711302335014186e-01 -1.0562214304492163e+00 -1.5516317290157768e+00 -7.2057418691749953e-01 9.7616349487538179e-01 1.2397218945424240e+00 8.6516718837839079e-01 1.2516992804807905e+00 3.2713853106890305e+00 8.9529186582694786e-01 -1.0743759508243305e+00 -2.8980298275197969e+00 -9.2232032224338611e-01 -9.3319554203184274e-01 -2.0679423844409048e+00 -9.4341079619757928e-01 1.0356776846305646e+00 1.7522850252122026e+00 6.2232283210319495e-01 9.3183874609756323e-01 9.8423514575981363e-01 1.8433447117807766e+00 -9.8815020936351394e-01 -6.9467268276756899e-01 -1.6393380505490125e+00 -7.8365361313953186e-01 -7.6689740069748813e-01 -1.0527030421008046e+00 8.7081432968684969e-01 6.9502239168040647e-01 1.2397218945424235e+00 9.6008803573005075e-01 8.9529186582694786e-01 2.7900207800885841e+00 -1.1243940021361505e+00 -9.3934318458288402e-01 -2.9628627130700584e+00 -7.7670507379773035e-01 -8.4582788392402897e-01 -1.8009917209239736e+00 9.1016178692246308e-01 6.7219174870480258e-01 1.5828081402320635e+00 -1.9858689518970110e+00 -1.0388269337892995e+00 -1.1220561987603423e+00 2.4727803672529456e+00 9.7055494348689542e-01 1.1583193831371836e+00 1.6384637608137793e+00 1.0036075006322527e+00 8.4609535477060360e-01 -1.6404729974276842e+00 -7.8365361313953275e-01 -1.0562214304492168e+00 -3.3771607752075665e+00 -1.0743759508243302e+00 -1.1243940021361505e+00 3.4197495783549239e+00 9.1646830336970020e-01 1.2863107710505359e+00 1.9605570171441711e+00 8.2843864443182946e-01 9.5648307529310728e-01 -2.4880479990335576e+00 -8.2221289416751508e-01 -9.4453695290571993e-01 -7.9869467223629453e-01 -1.8366156750745153e+00 -9.1071110674704425e-01 9.2291297245464388e-01 1.6306174561989872e+00 7.2288989021185279e-01 8.4609535477060371e-01 1.2539860239828313e+00 6.5730697864409171e-01 -7.6509249348143960e-01 -1.0527030421008055e+00 -7.2057418691749997e-01 -1.0963942121798695e+00 -2.8980298275197969e+00 -9.3934318458288402e-01 9.1646830336970031e-01 2.7140030306669907e+00 8.8350136567372317e-01 8.8735965658829952e-01 1.7599611435546270e+00 8.8798634055511005e-01 -9.1265490928564375e-01 -1.5712191097083186e+00 -5.8105609683734893e-01 -1.0167282174094323e+00 -1.0665111247752648e+00 -2.1931608467059776e+00 1.1559326006226673e+00 7.6123435012310203e-01 1.8813194445459238e+00 1.0036075006322522e+00 9.2248411967623289e-01 1.2539860239828309e+00 -1.0973762076932232e+00 -7.6689740069748880e-01 -1.5516317290157766e+00 -1.1249693983665243e+00 -9.2232032224338567e-01 -2.9628627130700576e+00 1.2863107710505357e+00 8.8350136567372317e-01 3.3241516775857640e+00 1.0109363263762996e+00 8.7937145874562417e-01 2.0641251234925657e+00 -1.2177133752125748e+00 -6.9086244650254258e-01 -1.8159269808152723e+00 -1.2224185280110769e+00 -8.5120526987871570e-01 -8.5120526987871536e-01 1.5483388445813806e+00 8.3111879452878867e-01 8.3111879452878878e-01 1.9605570171441706e+00 1.0109363263762994e+00 8.8735965658829907e-01 -1.9476980143475897e+00 -7.7670507379773068e-01 -9.3319554203184241e-01 -1.9476980143475902e+00 -9.3319554203184263e-01 -7.7670507379773024e-01 1.9605570171441709e+00 8.8735965658829952e-01 1.0109363263762994e+00 2.9754125927085533e+00 9.4667461605735403e-01 9.4667461605735426e-01 -3.3270509148720180e+00 -1.1149835078424530e+00 -1.1149835078424528e+00 -8.3112872650567704e-01 -1.5432292959015081e+00 -1.0138787407021965e+00 1.0651027691117045e+00 1.2437635245775509e+00 7.5451244274465934e-01 9.5648307529310694e-01 2.0641251234925648e+00 8.8798634055510950e-01 -9.3757650197748477e-01 -1.8009917209239736e+00 -9.4341079619757895e-01 -1.0188414373912444e+00 -2.0679423844409048e+00 -8.4582788392402897e-01 8.2843864443182935e-01 1.7599611435546270e+00 8.7937145874562417e-01 9.4667461605735415e-01 3.2162534780238916e+00 1.0809027527265334e+00 -1.0091524390195887e+00 -2.8719398683822472e+00 -7.9965557394812148e-01 -8.3112872650567715e-01 -1.0138787407021970e+00 -1.5432292959015084e+00 1.0651027691117048e+00 7.5451244274465945e-01 1.2437635245775509e+00 8.2843864443182902e-01 8.7937145874562406e-01 1.7599611435546259e+00 -1.0188414373912449e+00 -8.4582788392402930e-01 -2.0679423844409039e+00 -9.3757650197748466e-01 -9.4341079619757917e-01 -1.8009917209239736e+00 9.5648307529310728e-01 8.8798634055511005e-01 2.0641251234925657e+00 9.4667461605735426e-01 1.0809027527265334e+00 3.2162534780238916e+00 -1.0091524390195887e+00 -7.9965557394812126e-01 -2.8719398683822472e+00 1.5449814784701175e+00 1.1386390842875795e+00 1.1386390842875791e+00 -2.1804749029053068e+00 -9.9557348250978417e-01 -9.9557348250978428e-01 -2.4880479990335567e+00 -1.2177133752125751e+00 -9.1265490928564308e-01 2.4246621931041430e+00 9.1016178692246352e-01 1.0356776846305646e+00 2.4246621931041430e+00 1.0356776846305646e+00 9.1016178692246308e-01 -2.4880479990335576e+00 -9.1265490928564375e-01 -1.2177133752125748e+00 -3.3270509148720180e+00 -1.0091524390195887e+00 -1.0091524390195887e+00 4.0893159511660357e+00 1.0506156501869830e+00 1.0506156501869834e+00 7.8392214069405175e-01 1.1971952440570273e+00 7.2736319280129125e-01 -9.0012019964002932e-01 -1.0772616943394651e+00 -5.4209580262883628e-01 -9.4453695290571948e-01 -1.8159269808152714e+00 -5.8105609683734838e-01 8.7539275515712689e-01 1.5828081402320631e+00 6.2232283210319472e-01 1.0719230085175551e+00 1.7522850252122026e+00 6.7219174870480258e-01 -8.2221289416751508e-01 -1.5712191097083190e+00 -6.9086244650254269e-01 -1.1149835078424528e+00 -2.8719398683822472e+00 -7.9965557394812126e-01 1.0506156501869830e+00 2.8040592437440099e+00 5.9179214630755994e-01 7.8392214069405186e-01 7.2736319280129147e-01 1.1971952440570270e+00 -9.0012019964002943e-01 -5.4209580262883639e-01 -1.0772616943394651e+00 -8.2221289416751475e-01 -6.9086244650254280e-01 -1.5712191097083181e+00 1.0719230085175555e+00 6.7219174870480281e-01 1.7522850252122022e+00 8.7539275515712667e-01 6.2232283210319483e-01 1.5828081402320635e+00 -9.4453695290572015e-01 -5.8105609683734882e-01 -1.8159269808152723e+00 -1.1149835078424528e+00 -7.9965557394812148e-01 -2.8719398683822472e+00 1.0506156501869832e+00 5.9179214630756005e-01 2.8040592437440099e+00 57 58 59 117 118 119 459 460 461 444 445 446 465 466 467 483 484 485 489 490 491 471 472 473 2.8097176837748266e+00 9.0415669815367039e-01 9.7104268988898257e-01 -2.9816196164645072e+00 -9.4491654593892749e-01 -1.1356705848083826e+00 -1.7902142330913990e+00 -8.4858612554797430e-01 -7.8320374199676768e-01 1.5760761663610507e+00 6.7713999302610450e-01 9.2102393541537508e-01 1.8813055963192191e+00 9.9250489906056527e-01 9.4618599054527508e-01 -1.6822710444666948e+00 -7.0944607499272860e-01 -1.0019937876886889e+00 -1.0649637497651054e+00 -7.7436852622471519e-01 -7.9662044304656199e-01 1.2519691973326108e+00 7.0351568246400531e-01 8.7923594169076835e-01 9.0415669815366995e-01 3.2822609647089638e+00 1.2565878351041642e+00 -9.2880859871858013e-01 -2.9158370216990321e+00 -1.0862078958863288e+00 -9.4600641229918414e-01 -2.0509696504450710e+00 -9.3841975865629967e-01 6.2963000790958090e-01 1.7426648462954244e+00 1.0452239593313932e+00 9.7591620428700043e-01 2.1490804818151323e+00 1.0447716667465334e+00 -7.7811208876543714e-01 -1.9031340736556861e+00 -1.2394424219541813e+00 -7.2695223794042252e-01 -1.5560347443523432e+00 -1.0647652235515870e+00 8.7017642737337253e-01 1.2519691973326112e+00 9.8225183886630596e-01 9.7104268988898268e-01 1.2565878351041642e+00 3.4572575454056977e+00 -1.1302032612547377e+00 -1.1009611002070587e+00 -3.3978591407221668e+00 -9.4173003942051059e-01 -1.0199022286397166e+00 -1.9381797047558234e+00 8.7924813472574603e-01 1.0695864444225605e+00 2.4137409571544146e+00 9.6278744266100147e-01 1.0778511754120919e+00 2.0267335632647066e+00 -9.5158740861697422e-01 -1.0635359172673913e+00 -2.5354307453360616e+00 -7.7180939684981364e-01 -1.0988621505154195e+00 -1.6524583322219306e+00 9.8225183886630607e-01 8.7923594169076880e-01 1.6261958572111654e+00 -2.9816196164645072e+00 -9.2880859871858001e-01 -1.1302032612547377e+00 3.3336405716166713e+00 8.8992367767451608e-01 1.2927435040730904e+00 2.0471846577208863e+00 8.8280391150137416e-01 1.0115112647215068e+00 -1.8045133207240840e+00 -6.9711095871568418e-01 -1.2202043762331907e+00 -2.2224443921235801e+00 -1.0691241499047379e+00 -1.0261614964034400e+00 1.9210696266946712e+00 7.7191632445337677e-01 1.1604954058087418e+00 1.2627172176322856e+00 9.2476831993445097e-01 1.0106811098034487e+00 -1.5560347443523430e+00 -7.7436852622471541e-01 -1.0988621505154195e+00 -9.4491654593892727e-01 -2.9158370216990321e+00 -1.1009611002070585e+00 8.8992367767451652e-01 2.7322222200267618e+00 9.2732270250964211e-01 8.8768970971414629e-01 1.7485706618357701e+00 8.8782523372542799e-01 -5.8572893631424172e-01 -1.5627868617074039e+00 -9.1850883935058292e-01 -9.1811449535865686e-01 -1.8716465069445207e+00 -8.1087968457669313e-01 7.3536220395706886e-01 1.6717240406212455e+00 9.3255605551875964e-01 6.6273662420651736e-01 1.2627172176322858e+00 8.5445502923031802e-01 -7.2695223794042263e-01 -1.0649637497651057e+00 -7.7180939684981342e-01 -1.1356705848083826e+00 -1.0862078958863286e+00 -3.3978591407221668e+00 1.2927435040730901e+00 9.2732270250964188e-01 3.4417240401516680e+00 9.6389027787459103e-01 8.3880628729537621e-01 1.9530854339554118e+00 -9.4915458890440807e-01 -8.3068177755317774e-01 -2.4784170838150206e+00 -1.1333140841990055e+00 -1.0491226099021986e+00 -2.0308982519647047e+00 1.1718156702853832e+00 9.8582262677980126e-01 2.5116737394609041e+00 8.5445502923031758e-01 1.0106811098034485e+00 1.6531495951558384e+00 -1.0647652235515863e+00 -7.9662044304656221e-01 -1.6524583322219302e+00 -1.7902142330913990e+00 -9.4600641229918425e-01 -9.4173003942051048e-01 2.0471846577208863e+00 8.8768970971414618e-01 9.6389027787459103e-01 3.1343110125344227e+00 1.0743032556926078e+00 9.4501146808609449e-01 -2.7995471838262280e+00 -7.9863169401988099e-01 -1.0157905583710494e+00 -1.5455927617657068e+00 -1.0144956188725174e+00 -8.3929646432450011e-01 1.2562574970373248e+00 7.6292297383142915e-01 1.0690112574997137e+00 1.7485706618357648e+00 8.8280391150137383e-01 8.3880628729537610e-01 -2.0509696504450665e+00 -8.4858612554797408e-01 -1.0199022286397159e+00 -8.4858612554797430e-01 -2.0509696504450710e+00 -1.0199022286397166e+00 8.8280391150137427e-01 1.7485706618357701e+00 8.3880628729537599e-01 1.0743032556926080e+00 3.1343110125344236e+00 9.4501146808609460e-01 -7.9863169401988143e-01 -2.7995471838262271e+00 -1.0157905583710496e+00 -1.0144956188725178e+00 -1.5455927617657068e+00 -8.3929646432450034e-01 7.6292297383142960e-01 1.2562574970373250e+00 1.0690112574997144e+00 8.8768970971414585e-01 2.0471846577208828e+00 9.6389027787459147e-01 -9.4600641229918414e-01 -1.7902142330913953e+00 -9.4173003942051048e-01 -7.8320374199676768e-01 -9.3841975865629956e-01 -1.9381797047558234e+00 1.0115112647215068e+00 8.8782523372542799e-01 1.9530854339554122e+00 9.4501146808609437e-01 9.4501146808609493e-01 2.9012517959126831e+00 -1.1028802849045931e+00 -1.1028802849045927e+00 -3.2538823732983930e+00 -8.5877488015981396e-01 -8.5877488015981385e-01 -1.2370584026064537e+00 8.3893069918444485e-01 8.3893069918444474e-01 1.5598775215929845e+00 8.8782523372542732e-01 1.0115112647215061e+00 1.9530854339554080e+00 -9.3841975865629901e-01 -7.8320374199676734e-01 -1.9381797047558187e+00 1.5760761663610505e+00 6.2963000790958090e-01 8.7924813472574603e-01 -1.8045133207240838e+00 -5.8572893631424172e-01 -9.4915458890440785e-01 -2.7995471838262271e+00 -7.9863169401988143e-01 -1.1028802849045929e+00 2.7306585035959388e+00 5.9372385774953818e-01 1.0503083991789131e+00 1.2077993557733189e+00 7.3301618267147128e-01 7.9171109294292596e-01 -1.0903515057680173e+00 -5.5203845230688797e-01 -9.0813741990796593e-01 -1.5627868617074003e+00 -6.9711095871568440e-01 -8.3068177755317762e-01 1.7426648462954208e+00 6.7713999302610450e-01 1.0695864444225596e+00 6.7713999302610450e-01 1.7426648462954244e+00 1.0695864444225602e+00 -6.9711095871568418e-01 -1.5627868617074039e+00 -8.3068177755317774e-01 -7.9863169401988121e-01 -2.7995471838262271e+00 -1.1028802849045924e+00 5.9372385774953829e-01 2.7306585035959392e+00 1.0503083991789126e+00 7.3301618267147106e-01 1.2077993557733187e+00 7.9171109294292585e-01 -5.5203845230688797e-01 -1.0903515057680169e+00 -9.0813741990796559e-01 -5.8572893631424139e-01 -1.8045133207240804e+00 -9.4915458890440740e-01 6.2963000790958057e-01 1.5760761663610467e+00 8.7924813472574526e-01 9.2102393541537519e-01 1.0452239593313932e+00 2.4137409571544146e+00 -1.2202043762331907e+00 -9.1850883935058303e-01 -2.4784170838150201e+00 -1.0157905583710494e+00 -1.0157905583710496e+00 -3.2538823732983921e+00 1.0503083991789131e+00 1.0503083991789124e+00 4.0052813481328844e+00 1.1440063579731445e+00 1.1440063579731443e+00 1.5637818686080469e+00 -1.0060588779440025e+00 -1.0060588779440023e+00 -2.1858285901213272e+00 -9.1850883935058281e-01 -1.2202043762331907e+00 -2.4784170838150166e+00 1.0452239593313932e+00 9.2102393541537508e-01 2.4137409571544106e+00 1.8813055963192189e+00 9.7591620428700043e-01 9.6278744266100147e-01 -2.2224443921235801e+00 -9.1811449535865686e-01 -1.1333140841990055e+00 -1.5455927617657068e+00 -1.0144956188725178e+00 -8.5877488015981385e-01 1.2077993557733191e+00 7.3301618267147106e-01 1.1440063579731445e+00 3.5054446869084241e+00 1.3113908607369671e+00 1.1042329446981964e+00 -3.1039464599822879e+00 -1.0110938826200915e+00 -1.2476663464834150e+00 -1.8716465069445165e+00 -1.0691241499047379e+00 -1.0491226099021991e+00 2.1490804818151288e+00 9.9250489906056516e-01 1.0778511754120916e+00 9.9250489906056527e-01 2.1490804818151323e+00 1.0778511754120919e+00 -1.0691241499047379e+00 -1.8716465069445207e+00 -1.0491226099021986e+00 -1.0144956188725176e+00 -1.5455927617657068e+00 -8.5877488015981385e-01 7.3301618267147128e-01 1.2077993557733187e+00 1.1440063579731443e+00 1.3113908607369671e+00 3.5054446869084246e+00 1.1042329446981967e+00 -1.0110938826200917e+00 -3.1039464599822879e+00 -1.2476663464834150e+00 -9.1811449535865652e-01 -2.2224443921235757e+00 -1.1333140841990057e+00 9.7591620428700032e-01 1.8813055963192153e+00 9.6278744266100103e-01 9.4618599054527519e-01 1.0447716667465332e+00 2.0267335632647061e+00 -1.0261614964034402e+00 -8.1087968457669302e-01 -2.0308982519647047e+00 -8.3929646432450011e-01 -8.3929646432450034e-01 -1.2370584026064537e+00 7.9171109294292596e-01 7.9171109294292585e-01 1.5637818686080469e+00 1.1042329446981967e+00 1.1042329446981967e+00 3.1308529330249448e+00 -1.2105640496282979e+00 -1.2105640496282979e+00 -3.4492470216265403e+00 -8.1087968457669224e-01 -1.0261614964034396e+00 -2.0308982519647003e+00 1.0447716667465328e+00 9.4618599054527475e-01 2.0267335632647026e+00 -1.6822710444666948e+00 -7.7811208876543714e-01 -9.5158740861697433e-01 1.9210696266946710e+00 7.3536220395706886e-01 1.1718156702853832e+00 1.2562574970373250e+00 7.6292297383142960e-01 8.3893069918444485e-01 -1.0903515057680175e+00 -5.5203845230688797e-01 -1.0060588779440025e+00 -3.1039464599822875e+00 -1.0110938826200917e+00 -1.2105640496282977e+00 2.9306519195194447e+00 7.8048899644327052e-01 1.2351772572070356e+00 1.6717240406212408e+00 7.7191632445337699e-01 9.8582262677980104e-01 -1.9031340736556823e+00 -7.0944607499272871e-01 -1.0635359172673906e+00 -7.0944607499272860e-01 -1.9031340736556859e+00 -1.0635359172673915e+00 7.7191632445337677e-01 1.6717240406212455e+00 9.8582262677980115e-01 7.6292297383142893e-01 1.2562574970373250e+00 8.3893069918444474e-01 -5.5203845230688797e-01 -1.0903515057680169e+00 -1.0060588779440021e+00 -1.0110938826200915e+00 -3.1039464599822879e+00 -1.2105640496282979e+00 7.8048899644327041e-01 2.9306519195194451e+00 1.2351772572070359e+00 7.3536220395706819e-01 1.9210696266946665e+00 1.1718156702853826e+00 -7.7811208876543669e-01 -1.6822710444666911e+00 -9.5158740861697333e-01 -1.0019937876886889e+00 -1.2394424219541811e+00 -2.5354307453360621e+00 1.1604954058087418e+00 9.3255605551875964e-01 2.5116737394609037e+00 1.0690112574997137e+00 1.0690112574997144e+00 1.5598775215929848e+00 -9.0813741990796593e-01 -9.0813741990796559e-01 -2.1858285901213272e+00 -1.2476663464834150e+00 -1.2476663464834150e+00 -3.4492470216265403e+00 1.2351772572070359e+00 1.2351772572070361e+00 4.1227121019051989e+00 9.3255605551875920e-01 1.1604954058087420e+00 2.5116737394608992e+00 -1.2394424219541811e+00 -1.0019937876886893e+00 -2.5354307453360572e+00 -1.0649637497651054e+00 -7.2695223794042252e-01 -7.7180939684981364e-01 1.2627172176322856e+00 6.6273662420651736e-01 8.5445502923031758e-01 1.7485706618357653e+00 8.8768970971414585e-01 8.8782523372542721e-01 -1.5627868617074003e+00 -5.8572893631424139e-01 -9.1850883935058281e-01 -1.8716465069445163e+00 -9.1811449535865652e-01 -8.1087968457669224e-01 1.6717240406212408e+00 7.3536220395706819e-01 9.3255605551875931e-01 2.7322222200267445e+00 8.8992367767451519e-01 9.2732270250964011e-01 -2.9158370216990153e+00 -9.4491654593892549e-01 -1.1009611002070558e+00 -7.7436852622471519e-01 -1.5560347443523430e+00 -1.0988621505154195e+00 9.2476831993445086e-01 1.2627172176322858e+00 1.0106811098034483e+00 8.8280391150137383e-01 2.0471846577208828e+00 1.0115112647215061e+00 -6.9711095871568440e-01 -1.8045133207240800e+00 -1.2202043762331907e+00 -1.0691241499047377e+00 -2.2224443921235757e+00 -1.0261614964034396e+00 7.7191632445337699e-01 1.9210696266946667e+00 1.1604954058087420e+00 8.8992367767451497e-01 3.3336405716166535e+00 1.2927435040730890e+00 -9.2880859871858001e-01 -2.9816196164644908e+00 -1.1302032612547361e+00 -7.9662044304656188e-01 -1.0647652235515870e+00 -1.6524583322219306e+00 1.0106811098034487e+00 8.5445502923031802e-01 1.6531495951558384e+00 8.3880628729537610e-01 9.6389027787459169e-01 1.9530854339554078e+00 -8.3068177755317762e-01 -9.4915458890440740e-01 -2.4784170838150166e+00 -1.0491226099021991e+00 -1.1333140841990055e+00 -2.0308982519647003e+00 9.8582262677980104e-01 1.1718156702853826e+00 2.5116737394608992e+00 9.2732270250964011e-01 1.2927435040730890e+00 3.4417240401516507e+00 -1.0862078958863279e+00 -1.1356705848083808e+00 -3.3978591407221499e+00 1.2519691973326108e+00 8.7017642737337253e-01 9.8225183886630607e-01 -1.5560347443523430e+00 -7.2695223794042252e-01 -1.0647652235515863e+00 -2.0509696504450665e+00 -9.4600641229918403e-01 -9.3841975865629901e-01 1.7426648462954208e+00 6.2963000790958057e-01 1.0452239593313932e+00 2.1490804818151288e+00 9.7591620428700032e-01 1.0447716667465328e+00 -1.9031340736556821e+00 -7.7811208876543669e-01 -1.2394424219541811e+00 -2.9158370216990153e+00 -9.2880859871857979e-01 -1.0862078958863277e+00 3.2822609647089469e+00 9.0415669815366917e-01 1.2565878351041628e+00 7.0351568246400531e-01 1.2519691973326112e+00 8.7923594169076880e-01 -7.7436852622471553e-01 -1.0649637497651057e+00 -7.9662044304656199e-01 -8.4858612554797408e-01 -1.7902142330913953e+00 -7.8320374199676734e-01 6.7713999302610450e-01 1.5760761663610467e+00 9.2102393541537497e-01 9.9250489906056516e-01 1.8813055963192153e+00 9.4618599054527475e-01 -7.0944607499272871e-01 -1.6822710444666911e+00 -1.0019937876886893e+00 -9.4491654593892571e-01 -2.9816196164644908e+00 -1.1356705848083810e+00 9.0415669815366928e-01 2.8097176837748097e+00 9.7104268988898124e-01 8.7923594169076846e-01 9.8225183886630607e-01 1.6261958572111652e+00 -1.0988621505154195e+00 -7.7180939684981342e-01 -1.6524583322219302e+00 -1.0199022286397157e+00 -9.4173003942051059e-01 -1.9381797047558187e+00 1.0695864444225596e+00 8.7924813472574515e-01 2.4137409571544106e+00 1.0778511754120916e+00 9.6278744266100114e-01 2.0267335632647021e+00 -1.0635359172673906e+00 -9.5158740861697333e-01 -2.5354307453360572e+00 -1.1009611002070558e+00 -1.1302032612547364e+00 -3.3978591407221499e+00 1.2565878351041624e+00 9.7104268988898124e-01 3.4572575454056786e+00 117 118 119 177 178 179 462 463 464 459 460 461 483 484 485 501 502 503 504 505 506 489 490 491 2.7900207800884433e+00 8.9529186582674836e-01 9.6008803572983903e-01 -2.9628627130698617e+00 -9.3934318458274058e-01 -1.1243940021359395e+00 -1.8009917209237891e+00 -8.4582788392383956e-01 -7.7670507379756815e-01 1.5828081402319307e+00 6.7219174870466536e-01 9.1016178692221428e-01 1.8433447117805675e+00 9.8423514575960125e-01 9.3183874609738881e-01 -1.6393380505488560e+00 -6.9467268276740890e-01 -9.8815020936325182e-01 -1.0527030421006620e+00 -7.6689740069728196e-01 -7.8365361313931969e-01 1.2397218945422255e+00 6.9502239168025648e-01 8.7081432968663752e-01 8.9529186582674847e-01 3.2713853106887734e+00 1.2516992804805083e+00 -9.2232032224311156e-01 -2.8980298275196126e+00 -1.0743759508240476e+00 -9.4341079619732604e-01 -2.0679423844406570e+00 -9.3319554203162636e-01 6.2232283210301120e-01 1.7522850252120243e+00 1.0356776846302327e+00 9.7063644239978908e-01 2.1169428804642623e+00 1.0326443330031754e+00 -7.6711302334992848e-01 -1.8627311699315114e+00 -1.2323918696844063e+00 -7.2057418691730690e-01 -1.5516317290155039e+00 -1.0562214304489337e+00 8.6516718837812412e-01 1.2397218945422257e+00 9.7616349487509857e-01 9.6008803572983903e-01 1.2516992804805083e+00 3.4420344379130943e+00 -1.1249693983662339e+00 -1.0963942121796655e+00 -3.3771607752072756e+00 -9.3757650197721554e-01 -1.0188414373909758e+00 -1.9476980143473654e+00 8.7539275515693238e-01 1.0719230085173612e+00 2.4246621931037966e+00 9.5587385827200733e-01 1.0707825130334374e+00 1.9827442554686616e+00 -9.3987975020919390e-01 -1.0526072744543713e+00 -2.4999491389138981e+00 -7.6509249348123420e-01 -1.0973762076929308e+00 -1.6404729974273851e+00 9.7616349487509813e-01 8.7081432968663708e-01 1.6158400394103736e+00 -2.9628627130698617e+00 -9.2232032224311178e-01 -1.1249693983662337e+00 3.3241516775854918e+00 8.8350136567352477e-01 1.2863107710502455e+00 2.0641251234923108e+00 8.7937145874536327e-01 1.0109363263760771e+00 -1.8159269808150891e+00 -6.9086244650235384e-01 -1.2177133752122336e+00 -2.1931608467056889e+00 -1.0665111247749728e+00 -1.0167282174091929e+00 1.8813194445457078e+00 7.6123435012288199e-01 1.1559326006223074e+00 1.2539860239826346e+00 9.2248411967594979e-01 1.0036075006319609e+00 -1.5516317290155044e+00 -7.6689740069728252e-01 -1.0973762076929319e+00 -9.3934318458274058e-01 -2.8980298275196126e+00 -1.0963942121796655e+00 8.8350136567352477e-01 2.7140030306668601e+00 9.1646830336949581e-01 8.8798634055492709e-01 1.7599611435544489e+00 8.8735965658814342e-01 -5.8105609683721615e-01 -1.5712191097081913e+00 -9.1265490928540349e-01 -9.1071110674683886e-01 -1.8366156750743130e+00 -7.9869467223612600e-01 7.2288989021169825e-01 1.6306174561988354e+00 9.2291297245439063e-01 6.5730697864395216e-01 1.2539860239826341e+00 8.4609535477039866e-01 -7.2057418691730657e-01 -1.0527030421006620e+00 -7.6509249348123431e-01 -1.1243940021359395e+00 -1.0743759508240476e+00 -3.3771607752072761e+00 1.2863107710502455e+00 9.1646830336949581e-01 3.4197495783546339e+00 9.5648307529283827e-01 8.2843864443155990e-01 1.9605570171439470e+00 -9.4453695290552597e-01 -8.2221289416732035e-01 -2.4880479990332116e+00 -1.1220561987600410e+00 -1.0388269337889977e+00 -1.9858689518967665e+00 1.1583193831369576e+00 9.7055494348666849e-01 2.4727803672525779e+00 8.4609535477039877e-01 1.0036075006319605e+00 1.6384637608134809e+00 -1.0562214304489335e+00 -7.8365361313931958e-01 -1.6404729974273857e+00 -1.8009917209237891e+00 -9.4341079619732615e-01 -9.3757650197721554e-01 2.0641251234923108e+00 8.8798634055492709e-01 9.5648307529283827e-01 3.2162534780236633e+00 1.0809027527262938e+00 9.4667461605714953e-01 -2.8719398683820869e+00 -7.9965557394794795e-01 -1.0091524390192737e+00 -1.5432292959012404e+00 -1.0138787407019272e+00 -8.3112872650545555e-01 1.2437635245773504e+00 7.5451244274445617e-01 1.0651027691113719e+00 1.7599611435544475e+00 8.7937145874536293e-01 8.2843864443156001e-01 -2.0679423844406557e+00 -8.4582788392383945e-01 -1.0188414373909762e+00 -8.4582788392383945e-01 -2.0679423844406570e+00 -1.0188414373909758e+00 8.7937145874536327e-01 1.7599611435544491e+00 8.2843864443155990e-01 1.0809027527262938e+00 3.2162534780236642e+00 9.4667461605714975e-01 -7.9965557394794795e-01 -2.8719398683820865e+00 -1.0091524390192734e+00 -1.0138787407019270e+00 -1.5432292959012406e+00 -8.3112872650545555e-01 7.5451244274445650e-01 1.2437635245773497e+00 1.0651027691113721e+00 8.8798634055492698e-01 2.0641251234923090e+00 9.5648307529283816e-01 -9.4341079619732582e-01 -1.8009917209237876e+00 -9.3757650197721576e-01 -7.7670507379756826e-01 -9.3319554203162636e-01 -1.9476980143473650e+00 1.0109363263760773e+00 8.8735965658814342e-01 1.9605570171439470e+00 9.4667461605714953e-01 9.4667461605714964e-01 2.9754125927083899e+00 -1.1149835078423065e+00 -1.1149835078423060e+00 -3.3270509148717635e+00 -8.5120526987848444e-01 -8.5120526987848444e-01 -1.2224185280108888e+00 8.3111879452861548e-01 8.3111879452861526e-01 1.5483388445810984e+00 8.8735965658814320e-01 1.0109363263760767e+00 1.9605570171439455e+00 -9.3319554203162580e-01 -7.7670507379756804e-01 -1.9476980143473648e+00 1.5828081402319312e+00 6.2232283210301131e-01 8.7539275515693227e-01 -1.8159269808150893e+00 -5.8105609683721615e-01 -9.4453695290552597e-01 -2.8719398683820869e+00 -7.9965557394794795e-01 -1.1149835078423063e+00 2.8040592437438971e+00 5.9179214630743437e-01 1.0506156501867561e+00 1.1971952440568336e+00 7.2736319280109618e-01 7.8392214069389166e-01 -1.0772616943393201e+00 -5.4209580262868906e-01 -9.0012019963978873e-01 -1.5712191097081902e+00 -6.9086244650235351e-01 -8.2221289416732035e-01 1.7522850252120235e+00 6.7219174870466547e-01 1.0719230085173617e+00 6.7219174870466536e-01 1.7522850252120243e+00 1.0719230085173612e+00 -6.9086244650235373e-01 -1.5712191097081913e+00 -8.2221289416732035e-01 -7.9965557394794795e-01 -2.8719398683820869e+00 -1.1149835078423063e+00 5.9179214630743437e-01 2.8040592437438967e+00 1.0506156501867561e+00 7.2736319280109574e-01 1.1971952440568336e+00 7.8392214069389154e-01 -5.4209580262868917e-01 -1.0772616943393196e+00 -9.0012019963978851e-01 -5.8105609683721615e-01 -1.8159269808150871e+00 -9.4453695290552564e-01 6.2232283210301098e-01 1.5828081402319301e+00 8.7539275515693238e-01 9.1016178692221439e-01 1.0356776846302327e+00 2.4246621931037966e+00 -1.2177133752122333e+00 -9.1265490928540349e-01 -2.4880479990332116e+00 -1.0091524390192737e+00 -1.0091524390192734e+00 -3.3270509148717640e+00 1.0506156501867565e+00 1.0506156501867563e+00 4.0893159511656387e+00 1.1386390842872256e+00 1.1386390842872258e+00 1.5449814784698288e+00 -9.9557348250951871e-01 -9.9557348250951794e-01 -2.1804749029048742e+00 -9.1265490928540349e-01 -1.2177133752122329e+00 -2.4880479990332107e+00 1.0356776846302327e+00 9.1016178692221428e-01 2.4246621931037957e+00 1.8433447117805675e+00 9.7063644239978908e-01 9.5587385827200733e-01 -2.1931608467056889e+00 -9.1071110674683886e-01 -1.1220561987600410e+00 -1.5432292959012404e+00 -1.0138787407019270e+00 -8.5120526987848444e-01 1.1971952440568336e+00 7.2736319280109574e-01 1.1386390842872256e+00 3.3977036118314952e+00 1.3018753402151324e+00 1.0836432810559495e+00 -2.9821806304519165e+00 -9.9300914895187886e-01 -1.2368503342210959e+00 -1.8366156750743119e+00 -1.0665111247749723e+00 -1.0388269337889977e+00 2.1169428804642614e+00 9.8423514575960080e-01 1.0707825130334379e+00 9.8423514575960103e-01 2.1169428804642623e+00 1.0707825130334374e+00 -1.0665111247749728e+00 -1.8366156750743130e+00 -1.0388269337889977e+00 -1.0138787407019274e+00 -1.5432292959012408e+00 -8.5120526987848444e-01 7.2736319280109618e-01 1.1971952440568336e+00 1.1386390842872258e+00 1.3018753402151322e+00 3.3977036118314952e+00 1.0836432810559498e+00 -9.9300914895187942e-01 -2.9821806304519161e+00 -1.2368503342210961e+00 -9.1071110674683931e-01 -2.1931608467056876e+00 -1.1220561987600413e+00 9.7063644239978908e-01 1.8433447117805670e+00 9.5587385827200810e-01 9.3183874609738881e-01 1.0326443330031754e+00 1.9827442554686616e+00 -1.0167282174091929e+00 -7.9869467223612589e-01 -1.9858689518967665e+00 -8.3112872650545544e-01 -8.3112872650545544e-01 -1.2224185280108886e+00 7.8392214069389166e-01 7.8392214069389143e-01 1.5449814784698288e+00 1.0836432810559495e+00 1.0836432810559495e+00 3.0045948238425382e+00 -1.1854968846996314e+00 -1.1854968846996312e+00 -3.3209083814452680e+00 -7.9869467223612589e-01 -1.0167282174091921e+00 -1.9858689518967654e+00 1.0326443330031749e+00 9.3183874609738859e-01 1.9827442554686614e+00 -1.6393380505488560e+00 -7.6711302334992859e-01 -9.3987975020919401e-01 1.8813194445457078e+00 7.2288989021169825e-01 1.1583193831369578e+00 1.2437635245773504e+00 7.5451244274445650e-01 8.3111879452861548e-01 -1.0772616943393201e+00 -5.4209580262868917e-01 -9.9557348250951849e-01 -2.9821806304519165e+00 -9.9300914895187964e-01 -1.1854968846996314e+00 2.8058111199497104e+00 7.5825397461886923e-01 1.2135642707204732e+00 1.6306174561988347e+00 7.6123435012288210e-01 9.7055494348666871e-01 -1.8627311699315108e+00 -6.9467268276740912e-01 -1.0526072744543720e+00 -6.9467268276740890e-01 -1.8627311699315114e+00 -1.0526072744543715e+00 7.6123435012288188e-01 1.6306174561988351e+00 9.7055494348666849e-01 7.5451244274445617e-01 1.2437635245773497e+00 8.3111879452861526e-01 -5.4209580262868906e-01 -1.0772616943393198e+00 -9.9557348250951794e-01 -9.9300914895187886e-01 -2.9821806304519161e+00 -1.1854968846996312e+00 7.5825397461886934e-01 2.8058111199497100e+00 1.2135642707204726e+00 7.2288989021169803e-01 1.8813194445457055e+00 1.1583193831369569e+00 -7.6711302334992781e-01 -1.6393380505488544e+00 -9.3987975020919379e-01 -9.8815020936325171e-01 -1.2323918696844061e+00 -2.4999491389138981e+00 1.1559326006223074e+00 9.2291297245439041e-01 2.4727803672525779e+00 1.0651027691113719e+00 1.0651027691113721e+00 1.5483388445810984e+00 -9.0012019963978873e-01 -9.0012019963978851e-01 -2.1804749029048742e+00 -1.2368503342210961e+00 -1.2368503342210964e+00 -3.3209083814452680e+00 1.2135642707204732e+00 1.2135642707204726e+00 4.0073819830916850e+00 9.2291297245439063e-01 1.1559326006223067e+00 2.4727803672525765e+00 -1.2323918696844061e+00 -9.8815020936325171e-01 -2.4999491389138977e+00 -1.0527030421006620e+00 -7.2057418691730690e-01 -7.6509249348123420e-01 1.2539860239826346e+00 6.5730697864395204e-01 8.4609535477039877e-01 1.7599611435544475e+00 8.8798634055492709e-01 8.8735965658814320e-01 -1.5712191097081902e+00 -5.8105609683721604e-01 -9.1265490928540371e-01 -1.8366156750743121e+00 -9.1071110674683919e-01 -7.9869467223612589e-01 1.6306174561988347e+00 7.2288989021169792e-01 9.2291297245439063e-01 2.7140030306668552e+00 8.8350136567352466e-01 9.1646830336949536e-01 -2.8980298275196072e+00 -9.3934318458273958e-01 -1.0963942121796653e+00 -7.6689740069728207e-01 -1.5516317290155042e+00 -1.0973762076929310e+00 9.2248411967594990e-01 1.2539860239826341e+00 1.0036075006319605e+00 8.7937145874536304e-01 2.0641251234923086e+00 1.0109363263760767e+00 -6.9086244650235351e-01 -1.8159269808150871e+00 -1.2177133752122329e+00 -1.0665111247749723e+00 -2.1931608467056876e+00 -1.0167282174091923e+00 7.6123435012288199e-01 1.8813194445457055e+00 1.1559326006223067e+00 8.8350136567352444e-01 3.3241516775854860e+00 1.2863107710502444e+00 -9.2232032224311100e-01 -2.9628627130698559e+00 -1.1249693983662334e+00 -7.8365361313931969e-01 -1.0562214304489337e+00 -1.6404729974273851e+00 1.0036075006319609e+00 8.4609535477039866e-01 1.6384637608134807e+00 8.2843864443155990e-01 9.5648307529283816e-01 1.9605570171439455e+00 -8.2221289416732035e-01 -9.4453695290552553e-01 -2.4880479990332107e+00 -1.0388269337889975e+00 -1.1220561987600413e+00 -1.9858689518967654e+00 9.7055494348666871e-01 1.1583193831369567e+00 2.4727803672525761e+00 9.1646830336949558e-01 1.2863107710502448e+00 3.4197495783546272e+00 -1.0743759508240469e+00 -1.1243940021359387e+00 -3.3771607752072712e+00 1.2397218945422255e+00 8.6516718837812412e-01 9.7616349487509813e-01 -1.5516317290155044e+00 -7.2057418691730668e-01 -1.0562214304489335e+00 -2.0679423844406557e+00 -9.4341079619732582e-01 -9.3319554203162591e-01 1.7522850252120235e+00 6.2232283210301109e-01 1.0356776846302327e+00 2.1169428804642609e+00 9.7063644239978908e-01 1.0326443330031752e+00 -1.8627311699315108e+00 -7.6711302334992781e-01 -1.2323918696844061e+00 -2.8980298275196072e+00 -9.2232032224311100e-01 -1.0743759508240471e+00 3.2713853106887680e+00 8.9529186582674813e-01 1.2516992804805078e+00 6.9502239168025648e-01 1.2397218945422257e+00 8.7081432968663708e-01 -7.6689740069728252e-01 -1.0527030421006620e+00 -7.8365361313931958e-01 -8.4582788392383956e-01 -1.8009917209237876e+00 -7.7670507379756804e-01 6.7219174870466547e-01 1.5828081402319301e+00 9.1016178692221439e-01 9.8423514575960069e-01 1.8433447117805670e+00 9.3183874609738848e-01 -6.9467268276740923e-01 -1.6393380505488544e+00 -9.8815020936325160e-01 -9.3934318458273980e-01 -2.9628627130698559e+00 -1.1243940021359387e+00 8.9529186582674813e-01 2.7900207800884385e+00 9.6008803572983903e-01 8.7081432968663741e-01 9.7616349487509857e-01 1.6158400394103736e+00 -1.0973762076929319e+00 -7.6509249348123431e-01 -1.6404729974273857e+00 -1.0188414373909762e+00 -9.3757650197721587e-01 -1.9476980143473648e+00 1.0719230085173617e+00 8.7539275515693249e-01 2.4246621931037957e+00 1.0707825130334379e+00 9.5587385827200810e-01 1.9827442554686614e+00 -1.0526072744543720e+00 -9.3987975020919357e-01 -2.4999491389138981e+00 -1.0963942121796655e+00 -1.1249693983662337e+00 -3.3771607752072708e+00 1.2516992804805085e+00 9.6008803572983881e-01 3.4420344379130903e+00 465 466 467 483 484 485 489 490 491 471 472 473 468 469 470 486 487 488 492 493 494 474 475 476 2.8625602301979236e+00 7.7351684292447254e-01 8.3987189830045661e-01 -2.9915743977710614e+00 -8.9465243597225530e-01 -1.0719426903084317e+00 -1.6770064768673878e+00 -7.5631879669023139e-01 -7.4703491052059079e-01 1.4945867459855038e+00 5.9382809589817198e-01 7.7487235461636672e-01 1.7224200922134958e+00 8.9435097753396042e-01 9.0651455701222994e-01 -1.5588072116693175e+00 -6.0806861070837304e-01 -8.2979126918027202e-01 -8.9255680794282133e-01 -6.4184154232344004e-01 -6.7101310825934402e-01 1.0403778258536658e+00 6.3918546933769538e-01 7.9852316833958481e-01 7.7351684292447231e-01 4.0448334262176431e+00 1.6967486299197769e+00 -8.8198029315437232e-01 -3.6374191954742634e+00 -1.5334907527719392e+00 -8.9356757700573830e-01 -2.5586917574465988e+00 -1.3300572704431279e+00 5.5154943148984092e-01 2.2414837781058372e+00 1.4122614895733494e+00 8.8354814380113655e-01 2.6539413415962847e+00 1.4460069659133794e+00 -6.5884745736847428e-01 -2.4015090731046285e+00 -1.6358321774908142e+00 -6.0128348459697645e-01 -1.9557033756349598e+00 -1.4109931307500818e+00 8.2706439391011277e-01 1.6130648557406850e+00 1.3553562460494570e+00 8.3987189830045672e-01 1.6967486299197772e+00 4.3164147031695030e+00 -1.0655138483950122e+00 -1.5473899707773886e+00 -4.3102145767037214e+00 -9.2248775372663772e-01 -1.3979140122712188e+00 -2.5534222031684886e+00 7.3618414232348162e-01 1.4412912221332637e+00 3.0245222621299317e+00 9.1524871929971618e-01 1.4733663295627579e+00 2.6683955411073317e+00 -7.9399407683291845e-01 -1.4335687744164185e+00 -3.1688179252318966e+00 -6.4426433681716266e-01 -1.4461370073838624e+00 -2.1204871501935969e+00 9.3495525584807759e-01 1.2136035832330903e+00 2.1436093488909371e+00 -2.9915743977710614e+00 -8.8198029315437232e-01 -1.0655138483950120e+00 3.3301523226378182e+00 9.1538610529256481e-01 1.3100859498271333e+00 1.9292795860996681e+00 8.8226762199442810e-01 1.0415985332275453e+00 -1.6825918963337827e+00 -7.0775859064005242e-01 -1.1318731117046594e+00 -2.0502406060335270e+00 -1.0302813821479655e+00 -1.0785955124728441e+00 1.7528196681074077e+00 7.3237654103697114e-01 1.0714899093317467e+00 1.0493647645822270e+00 8.6899931026913835e-01 9.5611689638604802e-01 -1.3372094412887496e+00 -7.7900931265071260e-01 -1.1033088161999574e+00 -8.9465243597225530e-01 -3.6374191954742634e+00 -1.5473899707773882e+00 9.1538610529256481e-01 3.4111342340578648e+00 1.3693549142932655e+00 8.8174830801217330e-01 2.2301379415646694e+00 1.2665866027935464e+00 -5.5858287325372658e-01 -2.0125616588194646e+00 -1.2833341783657226e+00 -9.1569953533504356e-01 -2.3538972053540776e+00 -1.2011479692268545e+00 7.1007024357925252e-01 2.1318776353301327e+00 1.3278914978833507e+00 6.0658633362622993e-01 1.6318707454827361e+00 1.1930498787123851e+00 -7.4485614594919547e-01 -1.4011424967875961e+00 -1.1250107753125815e+00 -1.0719426903084317e+00 -1.5334907527719390e+00 -4.3102145767037223e+00 1.3100859498271336e+00 1.3693549142932657e+00 4.4125986089303542e+00 1.0101321067015161e+00 1.2263454801339808e+00 2.6203247712130988e+00 -8.6151441588343436e-01 -1.2165020820875982e+00 -3.1435396220752505e+00 -1.1574448191841458e+00 -1.4569605588303078e+00 -2.7266640671620799e+00 1.0753583810713911e+00 1.3712288960992574e+00 3.2100686562551228e+00 7.7059385289326265e-01 1.3867114638372817e+00 2.1701938637645855e+00 -1.0752683651172918e+00 -1.1466873606739407e+00 -2.2327676342221081e+00 -1.6770064768673878e+00 -8.9356757700573830e-01 -9.2248775372663772e-01 1.9292795860996677e+00 8.8174830801217341e-01 1.0101321067015161e+00 3.1582121312604241e+00 1.0437701060981712e+00 1.0028713366538020e+00 -2.8366747311278422e+00 -7.4658544196004573e-01 -9.5662357559956657e-01 -1.3292680522909031e+00 -9.6754670376156271e-01 -8.9926470555738469e-01 1.0526017739993585e+00 7.3150396512735805e-01 1.0157710160557587e+00 1.6206845790729576e+00 7.9264842366437138e-01 7.9749939930051750e-01 -1.9178288101462762e+00 -8.4197108017472777e-01 -1.0478978238280046e+00 -7.5631879669023139e-01 -2.5586917574465988e+00 -1.3979140122712190e+00 8.8226762199442821e-01 2.2301379415646689e+00 1.2263454801339808e+00 1.0437701060981712e+00 3.8135434006374496e+00 1.3685697872717741e+00 -7.6262365769730722e-01 -3.4789708578760705e+00 -1.4203444691298874e+00 -9.6929986564419224e-01 -1.9212668241636075e+00 -1.2151055382027924e+00 6.7638528274344067e-01 1.6308656607493506e+00 1.4273694401239656e+00 8.0848934868570299e-01 2.5198838634788410e+00 1.3342474517727068e+00 -9.2267003949001303e-01 -2.2355014269440336e+00 -1.3231681396985284e+00 -7.4703491052059079e-01 -1.3300572704431279e+00 -2.5534222031684886e+00 1.0415985332275453e+00 1.2665866027935464e+00 2.6203247712130988e+00 1.0028713366538018e+00 1.3685697872717744e+00 3.7156031435337544e+00 -1.0276457091418316e+00 -1.4964121230983551e+00 -4.1002423987715915e+00 -9.0909317421507185e-01 -1.2261806960041244e+00 -1.7481145721138809e+00 7.7934984061319035e-01 1.1769620757173784e+00 2.1030928603845838e+00 8.3923091590369336e-01 1.3726065072006730e+00 2.5365083101189789e+00 -9.7927683252073794e-01 -1.1320748834377652e+00 -2.5737499111964537e+00 1.4945867459855038e+00 5.5154943148984092e-01 7.3618414232348162e-01 -1.6825918963337831e+00 -5.5858287325372658e-01 -8.6151441588343425e-01 -2.8366747311278417e+00 -7.6262365769730733e-01 -1.0276457091418318e+00 2.7814891874030567e+00 5.3953288219763895e-01 8.6160730698607657e-01 1.0083139059419137e+00 6.4131622054556037e-01 7.3652568578153355e-01 -9.0951769570492935e-01 -4.7999079455156701e-01 -7.4225369862484614e-01 -1.4692169083574849e+00 -5.8026533334233121e-01 -6.8127969110768749e-01 1.6136113921935655e+00 6.4906412461189233e-01 9.7837637966670798e-01 5.9382809589817198e-01 2.2414837781058372e+00 1.4412912221332637e+00 -7.0775859064005253e-01 -2.0125616588194646e+00 -1.2165020820875982e+00 -7.4658544196004573e-01 -3.4789708578760714e+00 -1.4964121230983549e+00 5.3953288219763884e-01 3.3700417750222851e+00 1.4549489373989504e+00 7.1608822733364563e-01 1.5871401192209955e+00 1.1382875996445718e+00 -4.9704198526820947e-01 -1.4384259472144554e+00 -1.2655573953303565e+00 -5.0662775059615339e-01 -2.2715127278895624e+00 -1.2925114573142402e+00 6.0856456303500517e-01 2.0028055194504368e+00 1.2364552986537631e+00 7.7487235461636683e-01 1.4122614895733492e+00 3.0245222621299317e+00 -1.1318731117046597e+00 -1.2833341783657228e+00 -3.1435396220752505e+00 -9.5662357559956657e-01 -1.4203444691298872e+00 -4.1002423987715915e+00 8.6160730698607668e-01 1.4549489373989504e+00 4.7953814764730858e+00 1.0593972567875558e+00 1.4797945386325315e+00 2.1051732120203628e+00 -8.1418735415909971e-01 -1.3407768376712759e+00 -2.6839012353058660e+00 -7.3818568307066534e-01 -1.5724146594310233e+00 -3.0378512832342821e+00 9.4499280614399361e-01 1.2698651789930788e+00 3.0404575887636089e+00 1.7224200922134958e+00 8.8354814380113655e-01 9.1524871929971607e-01 -2.0502406060335274e+00 -9.1569953533504389e-01 -1.1574448191841460e+00 -1.3292680522909031e+00 -9.6929986564419224e-01 -9.0909317421507174e-01 1.0083139059419137e+00 7.1608822733364552e-01 1.0593972567875560e+00 3.4270199472289677e+00 1.2249774068443959e+00 1.1532074725243251e+00 -3.0451980493518422e+00 -9.1821439214772993e-01 -1.1561848786703315e+00 -1.7024415073644585e+00 -9.7294359354324467e-01 -9.9288207243026039e-01 1.9693942696563553e+00 9.5154360869103338e-01 1.0877514958882120e+00 8.9435097753396031e-01 2.6539413415962847e+00 1.4733663295627575e+00 -1.0302813821479655e+00 -2.3538972053540776e+00 -1.4569605588303074e+00 -9.6754670376156282e-01 -1.9212668241636077e+00 -1.2261806960041244e+00 6.4131622054556037e-01 1.5871401192209955e+00 1.4797945386325315e+00 1.2249774068443955e+00 4.1837932267224138e+00 1.5650955810334941e+00 -9.1292374266215415e-01 -3.7850402932196867e+00 -1.6710910511642441e+00 -7.8461274506254675e-01 -2.6954497428301227e+00 -1.4982408253133117e+00 9.3471996871031393e-01 2.3307793780278026e+00 1.3342166820832033e+00 9.0651455701222983e-01 1.4460069659133796e+00 2.6683955411073312e+00 -1.0785955124728441e+00 -1.2011479692268545e+00 -2.7266640671620799e+00 -8.9926470555738469e-01 -1.2151055382027922e+00 -1.7481145721138809e+00 7.3652568578153355e-01 1.1382875996445718e+00 2.1051732120203623e+00 1.1532074725243251e+00 1.5650955810334939e+00 4.0035793172213303e+00 -1.1314522400813276e+00 -1.6441831472867765e+00 -4.3556851922805704e+00 -7.5447140655371403e-01 -1.4188429890932612e+00 -2.6339245697669398e+00 1.0675361493471824e+00 1.3298894972182396e+00 2.6872403309744453e+00 -1.5588072116693177e+00 -6.5884745736847428e-01 -7.9399407683291856e-01 1.7528196681074077e+00 7.1007024357925252e-01 1.0753583810713911e+00 1.0526017739993583e+00 6.7638528274344067e-01 7.7934984061319035e-01 -9.0951769570492935e-01 -4.9704198526820947e-01 -8.1418735415909960e-01 -3.0451980493518427e+00 -9.1292374266215415e-01 -1.1314522400813272e+00 2.8996647312414590e+00 6.7947103332763070e-01 1.0188030135443380e+00 1.5382888474576348e+00 6.4942722900164096e-01 8.1323687719148352e-01 -1.7298520640797710e+00 -6.4654060335312724e-01 -9.4711444134705736e-01 -6.0806861070837293e-01 -2.4015090731046280e+00 -1.4335687744164189e+00 7.3237654103697114e-01 2.1318776353301327e+00 1.3712288960992574e+00 7.3150396512735805e-01 1.6308656607493506e+00 1.1769620757173784e+00 -4.7999079455156707e-01 -1.4384259472144554e+00 -1.3407768376712756e+00 -9.1821439214773004e-01 -3.7850402932196867e+00 -1.6441831472867765e+00 6.7947103332763070e-01 3.5848178373914283e+00 1.6594365993346103e+00 6.1492801373402539e-01 2.3899117696450132e+00 1.5310451973879615e+00 -7.5200575581831619e-01 -2.1124975895771554e+00 -1.3201440091647358e+00 -8.2979126918027191e-01 -1.6358321774908142e+00 -3.1688179252318966e+00 1.0714899093317467e+00 1.3278914978833507e+00 3.2100686562551228e+00 1.0157710160557587e+00 1.4273694401239656e+00 2.1030928603845838e+00 -7.4225369862484614e-01 -1.2655573953303565e+00 -2.6839012353058660e+00 -1.1561848786703313e+00 -1.6710910511642434e+00 -4.3556851922805704e+00 1.0188030135443382e+00 1.6594365993346105e+00 4.9869887591359339e+00 7.6738099370393598e-01 1.5229148804703694e+00 3.1044735734244409e+00 -1.1452150861603319e+00 -1.3651317938268823e+00 -3.1962194963817487e+00 -8.9255680794282133e-01 -6.0128348459697656e-01 -6.4426433681716266e-01 1.0493647645822270e+00 6.0658633362622982e-01 7.7059385289326265e-01 1.6206845790729578e+00 8.0848934868570299e-01 8.3923091590369325e-01 -1.4692169083574849e+00 -5.0662775059615339e-01 -7.3818568307066534e-01 -1.7024415073644585e+00 -7.8461274506254675e-01 -7.5447140655371403e-01 1.5382888474576348e+00 6.1492801373402539e-01 7.6738099370393598e-01 2.7363346655094571e+00 7.2755181803356583e-01 7.7043769459800249e-01 -2.8804576329575129e+00 -8.6503153382384812e-01 -1.0107220306573521e+00 -6.4184154232344004e-01 -1.9557033756349598e+00 -1.4461370073838624e+00 8.6899931026913846e-01 1.6318707454827361e+00 1.3867114638372817e+00 7.9264842366437138e-01 2.5198838634788414e+00 1.3726065072006726e+00 -5.8026533334233110e-01 -2.2715127278895624e+00 -1.5724146594310235e+00 -9.7294359354324467e-01 -2.6954497428301227e+00 -1.4188429890932615e+00 6.4942722900164096e-01 2.3899117696450132e+00 1.5229148804703692e+00 7.2755181803356606e-01 3.9905385451400388e+00 1.6818016585446822e+00 -8.4357631175970216e-01 -3.6095390773919860e+00 -1.5266398541448583e+00 -6.7101310825934402e-01 -1.4109931307500818e+00 -2.1204871501935965e+00 9.5611689638604802e-01 1.1930498787123851e+00 2.1701938637645859e+00 7.9749939930051750e-01 1.3342474517727068e+00 2.5365083101189789e+00 -6.8127969110768749e-01 -1.2925114573142404e+00 -3.0378512832342821e+00 -9.9288207243026039e-01 -1.4982408253133117e+00 -2.6339245697669407e+00 8.1323687719148363e-01 1.5310451973879615e+00 3.1044735734244409e+00 7.7043769459800238e-01 1.6818016585446820e+00 4.1826808698186220e+00 -9.9211599567876074e-01 -1.5383987730401025e+00 -4.2015936139318084e+00 1.0403778258536658e+00 8.2706439391011277e-01 9.3495525584807759e-01 -1.3372094412887499e+00 -7.4485614594919547e-01 -1.0752683651172918e+00 -1.9178288101462762e+00 -9.2267003949001303e-01 -9.7927683252073794e-01 1.6136113921935658e+00 6.0856456303500517e-01 9.4499280614399350e-01 1.9693942696563553e+00 9.3471996871031393e-01 1.0675361493471827e+00 -1.7298520640797710e+00 -7.5200575581831619e-01 -1.1452150861603316e+00 -2.8804576329575124e+00 -8.4357631175970238e-01 -9.9211599567876074e-01 3.2419644607687230e+00 8.9275932736179553e-01 1.2443920681378680e+00 6.3918546933769549e-01 1.6130648557406848e+00 1.2136035832330903e+00 -7.7900931265071272e-01 -1.4011424967875961e+00 -1.1466873606739409e+00 -8.4197108017472777e-01 -2.2355014269440332e+00 -1.1320748834377652e+00 6.4906412461189233e-01 2.0028055194504368e+00 1.2698651789930788e+00 9.5154360869103338e-01 2.3307793780278026e+00 1.3298894972182393e+00 -6.4654060335312724e-01 -2.1124975895771554e+00 -1.3651317938268821e+00 -8.6503153382384801e-01 -3.6095390773919851e+00 -1.5383987730401025e+00 8.9275932736179542e-01 3.4120308374818471e+00 1.3689345515342815e+00 7.9852316833958481e-01 1.3553562460494570e+00 2.1436093488909371e+00 -1.1033088161999574e+00 -1.1250107753125815e+00 -2.2327676342221081e+00 -1.0478978238280043e+00 -1.3231681396985282e+00 -2.5737499111964537e+00 9.7837637966670776e-01 1.2364552986537631e+00 3.0404575887636089e+00 1.0877514958882117e+00 1.3342166820832033e+00 2.6872403309744453e+00 -9.4711444134705725e-01 -1.3201440091647361e+00 -3.1962194963817492e+00 -1.0107220306573521e+00 -1.5266398541448580e+00 -4.2015936139318084e+00 1.2443920681378680e+00 1.3689345515342815e+00 4.3330233871031272e+00 432 433 434 447 448 449 564 565 566 516 517 518 435 436 437 450 451 452 567 568 569 519 520 521 4.0207416032605465e+00 1.8795897121384633e+00 3.9688047098878598e-01 -4.2121508238037926e+00 -1.9962188840637300e+00 -2.3754818231800998e-01 -2.5330958182913195e+00 -1.7509238326341423e+00 -9.4573214691228591e-02 2.7844294579537339e+00 1.8131728208021871e+00 4.0496347618685202e-01 2.4722309568270835e+00 1.6816521309132155e+00 1.7853433669908383e-01 -2.7436694924041696e+00 -1.6097584583670821e+00 -3.9784612882058995e-01 -1.7951452777271908e+00 -1.6048942306017062e+00 -3.5532729444758232e-01 2.0066593941851090e+00 1.5873807418127952e+00 1.0491653640268638e-01 1.8795897121384633e+00 5.3906521856713043e+00 5.6954735553610814e-01 -1.9733460502811861e+00 -5.0295249483917246e+00 -2.4789041337015233e-01 -1.7397068478024269e+00 -3.8942531575060855e+00 -1.3951978699159168e-01 1.8005723589701634e+00 3.5060119674618591e+00 4.9037696726471069e-01 1.6767443623323264e+00 3.7435121122669721e+00 2.6072574100093848e-01 -1.8545823330340181e+00 -3.4272729857240263e+00 -5.1832130493894513e-01 -1.6079022640030616e+00 -3.0139906808117418e+00 -5.1388302771731675e-01 1.8186310616797396e+00 2.7248655070334427e+00 9.8964469216244758e-02 3.9688047098878593e-01 5.6954735553610802e-01 2.8271230083144805e+00 -2.1357430731340971e-01 -2.2134629529544322e-01 -2.6070880832516119e+00 -2.6024364454901100e-01 -3.8241433038959971e-01 -1.3386020464938739e+00 4.0672017984423681e-01 4.9721393230323047e-01 1.4430989440806874e+00 1.4950445642392954e-01 2.2091686176086223e-01 1.2958665940666942e+00 -4.2890338445995141e-01 -4.8792604332345729e-01 -1.4580175990670461e+00 -3.5432011461012564e-01 -5.1149019319693412e-01 -7.9889976026277720e-01 3.0393634367554551e-01 3.1549871260523338e-01 6.3651894261344555e-01 -4.2121508238037935e+00 -1.9733460502811861e+00 -2.1357430731340976e-01 4.5945274525166315e+00 2.0469263531149799e+00 -3.8144236192033547e-02 2.8203409946207092e+00 1.8559291957204089e+00 -1.8451330235496957e-02 -3.1459736616315372e+00 -1.8643448488286896e+00 -3.1051761568435793e-01 -2.7590407654023887e+00 -1.9146574456477017e+00 5.4200293272717831e-02 3.0318463794246089e+00 1.7957323423137868e+00 1.8495756302160574e-01 2.0377006618231763e+00 1.8314085100713966e+00 3.0534671743220043e-01 -2.3672502375474096e+00 -1.7776480564629948e+00 3.6182915698777442e-02 -1.9962188840637300e+00 -5.0295249483917228e+00 -2.2134629529544317e-01 2.0469263531149799e+00 4.8256935128992984e+00 -3.8631353215944082e-02 1.8610835521849514e+00 3.6031990115290569e+00 -2.5340247916466500e-02 -1.8757981664814476e+00 -3.2687436339924498e+00 -3.2459008076931506e-01 -1.6536450263390374e+00 -3.5327933844581847e+00 6.5123010630449008e-02 1.7878732212144017e+00 3.1983175224921991e+00 1.9460521139300460e-01 1.5868764549264160e+00 2.7435373808957717e+00 3.1126569747441679e-01 -1.7570975045565351e+00 -2.5396854609739670e+00 3.8914057699302104e-02 -2.3754818231800998e-01 -2.4789041337015233e-01 -2.6070880832516119e+00 -3.8144236192033547e-02 -3.8631353215944103e-02 2.6620723209277792e+00 -3.2407956637411986e-02 -4.2071892071470093e-02 1.3416335456246093e+00 -9.7557480865416490e-02 -1.0026242102923236e-01 -1.3296797102869420e+00 5.2869793835399581e-02 6.7649851488757268e-02 -1.3408216058310265e+00 2.1038093662446883e-01 2.2421430607570769e-01 1.3041766856982770e+00 9.2897410903915456e-02 8.3576593583117212e-02 6.5410984648961001e-01 4.9509714649088231e-02 5.3415328539216718e-02 -6.8440299937069515e-01 -2.5330958182913199e+00 -1.7397068478024269e+00 -2.6024364454901100e-01 2.8203409946207092e+00 1.8610835521849514e+00 -3.2407956637411993e-02 4.1618078819348572e+00 2.0463140530858923e+00 -1.0427094652535822e-02 -4.3977407614549140e+00 -2.1101687157818638e+00 -2.0456334015269184e-01 -1.8085096831297109e+00 -1.6593390431198525e+00 3.9805292933849191e-02 2.0375915800058615e+00 1.5820207812826534e+00 2.4510349038032661e-01 2.6128010204131136e+00 1.8007446011184547e+00 1.8481866115007106e-01 -2.8931952140985966e+00 -1.7809483809678086e+00 3.7914591527406671e-02 -1.7509238326341423e+00 -3.8942531575060855e+00 -3.8241433038959960e-01 1.8559291957204089e+00 3.6031990115290569e+00 -4.2071892071470107e-02 2.0463140530858923e+00 5.6951032973873721e+00 -1.8357838513957662e-02 -2.1178982517432621e+00 -5.2610051902782109e+00 -2.9652203402598160e-01 -1.6410250858241120e+00 -3.1164709066060112e+00 5.6592199665172239e-02 1.8397879447157008e+00 2.7318070945320154e+00 3.6527887758913125e-01 1.7934244970919357e+00 3.9584341578519258e+00 2.6689146524195451e-01 -2.0256085204124217e+00 -3.7168143069100616e+00 5.0603552504755067e-02 -9.4573214691228577e-02 -1.3951978699159165e-01 -1.3386020464938737e+00 -1.8451330235496961e-02 -2.5340247916466510e-02 1.3416335456246091e+00 -1.0427094652535815e-02 -1.8357838513957642e-02 2.7440730280461851e+00 -2.0171362775269866e-01 -2.9199324393136800e-01 -2.6946917955729108e+00 2.5936326822025929e-02 3.6717543388516148e-02 -6.8782891365712007e-01 7.7809611876659107e-02 1.2724718186061690e-01 6.5694743386659793e-01 1.8235534079994745e-01 2.6612865389660051e-01 1.3550269642056192e+00 3.9063987833327610e-02 4.5117738207650235e-02 -1.3765582160191063e+00 2.7844294579537339e+00 1.8005723589701634e+00 4.0672017984423670e-01 -3.1459736616315372e+00 -1.8757981664814476e+00 -9.7557480865416477e-02 -4.3977407614549149e+00 -2.1178982517432625e+00 -2.0171362775269866e-01 4.8147700537164928e+00 2.1256630730062125e+00 5.0220822583468638e-01 2.0043406275700710e+00 1.8422135564328037e+00 6.2038944761210857e-02 -2.3521950745641540e+00 -1.7107208490063006e+00 -4.3400041476430068e-01 -2.8775063299115082e+00 -1.9779336423164304e+00 -4.5554213707983265e-01 3.1698756883218162e+00 1.9139019211382613e+00 2.1784631002211086e-01 1.8131728208021871e+00 3.5060119674618591e+00 4.9721393230323041e-01 -1.8643448488286900e+00 -3.2687436339924503e+00 -1.0026242102923233e-01 -2.1101687157818638e+00 -5.2610051902782118e+00 -2.9199324393136800e-01 2.1256630730062125e+00 5.0051518361480403e+00 5.2254517501680975e-01 1.5722449548565676e+00 2.7172810440877848e+00 1.0957314789428810e-01 -1.7211780028735273e+00 -2.4508814648158355e+00 -4.4941271241376002e-01 -1.7241623794251313e+00 -3.6126737075437210e+00 -5.1874739418172433e-01 1.9087730982442463e+00 3.3648591489325339e+00 2.3108351634175295e-01 4.0496347618685202e-01 4.9037696726471069e-01 1.4430989440806874e+00 -3.1051761568435787e-01 -3.2459008076931517e-01 -1.3296797102869420e+00 -2.0456334015269187e-01 -2.9652203402598154e-01 -2.6946917955729108e+00 5.0220822583468638e-01 5.2254517501680964e-01 2.9062691962708653e+00 2.3653195457732376e-01 3.5953140973197645e-01 6.3181394287581105e-01 -4.2481083965816574e-01 -4.3724391301759513e-01 -7.9534663123434624e-01 -4.1494797233248615e-01 -5.4094901170253085e-01 -1.5020763513681878e+00 2.1113611122883960e-01 2.2685148750192580e-01 1.3406124052350226e+00 2.4722309568270839e+00 1.6767443623323268e+00 1.4950445642392954e-01 -2.7590407654023879e+00 -1.6536450263390374e+00 5.2869793835399574e-02 -1.8085096831297109e+00 -1.6410250858241120e+00 2.5936326822025908e-02 2.0043406275700710e+00 1.5722449548565676e+00 2.3653195457732379e-01 4.0776929269608120e+00 1.9053134114065902e+00 -2.5468594649331308e-02 -4.2459333963765147e+00 -1.9904729044843756e+00 -1.6616539901930283e-01 -2.5381439012031666e+00 -1.7128690959941621e+00 -2.5352312706202801e-01 2.7973632347538144e+00 1.8437093840462022e+00 -1.9685410928019367e-02 1.6816521309132151e+00 3.7435121122669721e+00 2.2091686176086228e-01 -1.9146574456477017e+00 -3.5327933844581856e+00 6.7649851488757254e-02 -1.6593390431198525e+00 -3.1164709066060112e+00 3.6717543388516141e-02 1.8422135564328037e+00 2.7172810440877853e+00 3.5953140973197650e-01 1.9053134114065902e+00 5.5478894807107224e+00 -3.9909699050926076e-02 -1.9407355859092859e+00 -5.0647186861187139e+00 -2.4710203663364680e-01 -1.7243153598700895e+00 -3.8992808499040783e+00 -3.7473543190831882e-01 1.8098683357943210e+00 3.6045811900215097e+00 -2.3068498777224569e-02 1.7853433669908381e-01 2.6072574100093848e-01 1.2958665940666942e+00 5.4200293272717817e-02 6.5123010630449035e-02 -1.3408216058310263e+00 3.9805292933849205e-02 5.6592199665172239e-02 -6.8782891365712007e-01 6.2038944761210871e-02 1.0957314789428810e-01 6.3181394287581105e-01 -2.5468594649331298e-02 -3.9909699050926103e-02 2.7724438254820125e+00 -1.9605496434760158e-01 -2.9020855369356696e-01 -2.6660446725181579e+00 -7.9641535202562036e-02 -1.2122738568451234e-01 -1.3648290716097109e+00 -3.3413773467366702e-02 -4.0668460761842364e-02 1.3593999011914968e+00 -2.7436694924041705e+00 -1.8545823330340183e+00 -4.2890338445995130e-01 3.0318463794246089e+00 1.7878732212144017e+00 2.1038093662446880e-01 2.0375915800058615e+00 1.8397879447157008e+00 7.7809611876659093e-02 -2.3521950745641540e+00 -1.7211780028735273e+00 -4.2481083965816574e-01 -4.2459333963765156e+00 -1.9407355859092856e+00 -1.9605496434760161e-01 4.6082094050767601e+00 1.9695400154081000e+00 4.7322594060816986e-01 2.8055035369101544e+00 1.7702973267493358e+00 3.9852993911559675e-01 -3.1413529380725467e+00 -1.8510025862707065e+00 -1.1017723975917243e-01 -1.6097584583670823e+00 -3.4272729857240263e+00 -4.8792604332345724e-01 1.7957323423137865e+00 3.1983175224921991e+00 2.2421430607570772e-01 1.5820207812826532e+00 2.7318070945320154e+00 1.2724718186061693e-01 -1.7107208490063006e+00 -2.4508814648158355e+00 -4.3724391301759513e-01 -1.9904729044843754e+00 -5.0647186861187139e+00 -2.9020855369356696e-01 1.9695400154081002e+00 4.7745449463963761e+00 4.9113041421082448e-01 1.7962885386049485e+00 3.5113175242778980e+00 4.8816717959206835e-01 -1.8326294657517306e+00 -3.2731139510399121e+00 -1.1538057170459456e-01 -3.9784612882059001e-01 -5.1832130493894513e-01 -1.4580175990670459e+00 1.8495756302160576e-01 1.9460521139300457e-01 1.3041766856982770e+00 2.4510349038032661e-01 3.6527887758913136e-01 6.5694743386659793e-01 -4.3400041476430068e-01 -4.4941271241376002e-01 -7.9534663123434624e-01 -1.6616539901930291e-01 -2.4710203663364677e-01 -2.6660446725181579e+00 4.7322594060816986e-01 4.9113041421082448e-01 2.8392741067763279e+00 4.0572186607687977e-01 4.9075138801480128e-01 1.4805839449801854e+00 -3.1099691748278868e-01 -3.2692983722140967e-01 -1.3615732685018380e+00 -1.7951452777271908e+00 -1.6079022640030616e+00 -3.5432011461012558e-01 2.0377006618231768e+00 1.5868764549264160e+00 9.2897410903915456e-02 2.6128010204131131e+00 1.7934244970919357e+00 1.8235534079994745e-01 -2.8775063299115082e+00 -1.7241623794251313e+00 -4.1494797233248615e-01 -2.5381439012031670e+00 -1.7243153598700893e+00 -7.9641535202562022e-02 2.8055035369101544e+00 1.7962885386049485e+00 4.0572186607687971e-01 4.1800558548859170e+00 1.9730909839507009e+00 4.1506971379218649e-01 -4.4252655651904975e+00 -2.0933004712757182e+00 -2.4713470942775262e-01 -1.6048942306017062e+00 -3.0139906808117423e+00 -5.1149019319693412e-01 1.8314085100713966e+00 2.7435373808957717e+00 8.3576593583117212e-02 1.8007446011184549e+00 3.9584341578519258e+00 2.6612865389660056e-01 -1.9779336423164304e+00 -3.6126737075437214e+00 -5.4094901170253074e-01 -1.7128690959941621e+00 -3.8992808499040787e+00 -1.2122738568451234e-01 1.7702973267493358e+00 3.5113175242778984e+00 4.9075138801480123e-01 1.9730909839507007e+00 5.6175339828497952e+00 5.9558690726189090e-01 -2.0798444529775901e+00 -5.3048778076158474e+00 -2.6237695217242857e-01 -3.5532729444758232e-01 -5.1388302771731675e-01 -7.9889976026277720e-01 3.0534671743220043e-01 3.1126569747441674e-01 6.5410984648961001e-01 1.8481866115007103e-01 2.6689146524195451e-01 1.3550269642056194e+00 -4.5554213707983265e-01 -5.1874739418172433e-01 -1.5020763513681878e+00 -2.5352312706202801e-01 -3.7473543190831882e-01 -1.3648290716097109e+00 3.9852993911559681e-01 4.8816717959206835e-01 1.4805839449801854e+00 4.1506971379218655e-01 5.9558690726189090e-01 2.9255002527917058e+00 -2.3937247290061203e-01 -2.5454539576297053e-01 -2.7494158252264436e+00 2.0066593941851090e+00 1.8186310616797399e+00 3.0393634367554556e-01 -2.3672502375474096e+00 -1.7570975045565351e+00 4.9509714649088238e-02 -2.8931952140985966e+00 -2.0256085204124217e+00 3.9063987833327610e-02 3.1698756883218162e+00 1.9087730982442461e+00 2.1113611122883963e-01 2.7973632347538140e+00 1.8098683357943208e+00 -3.3413773467366695e-02 -3.1413529380725467e+00 -1.8326294657517306e+00 -3.1099691748278868e-01 -4.4252655651904975e+00 -2.0798444529775901e+00 -2.3937247290061220e-01 4.8531656376483108e+00 2.1579074479799707e+00 -1.9862993536036860e-02 1.5873807418127952e+00 2.7248655070334427e+00 3.1549871260523338e-01 -1.7776480564629951e+00 -2.5396854609739665e+00 5.3415328539216739e-02 -1.7809483809678084e+00 -3.7168143069100612e+00 4.5117738207650256e-02 1.9139019211382613e+00 3.3648591489325335e+00 2.2685148750192577e-01 1.8437093840462022e+00 3.6045811900215101e+00 -4.0668460761842370e-02 -1.8510025862707065e+00 -3.2731139510399121e+00 -3.2692983722140967e-01 -2.0933004712757182e+00 -5.3048778076158483e+00 -2.5454539576297053e-01 2.1579074479799703e+00 5.1401856805523014e+00 -1.8739573107807148e-02 1.0491653640268636e-01 9.8964469216244758e-02 6.3651894261344555e-01 3.6182915698777442e-02 3.8914057699302104e-02 -6.8440299937069515e-01 3.7914591527406658e-02 5.0603552504755123e-02 -1.3765582160191063e+00 2.1784631002211083e-01 2.3108351634175292e-01 1.3406124052350221e+00 -1.9685410928019363e-02 -2.3068498777224555e-02 1.3593999011914968e+00 -1.1017723975917243e-01 -1.1538057170459459e-01 -1.3615732685018380e+00 -2.4713470942775262e-01 -2.6237695217242862e-01 -2.7494158252264436e+00 -1.9862993536036839e-02 -1.8739573107807113e-02 2.8354190600781179e+00 447 448 449 180 181 182 612 613 614 564 565 566 450 451 452 183 184 185 615 616 617 567 568 569 4.0911593120026035e+00 1.8616637144196295e+00 3.9679321645640764e-01 -4.2855065476257730e+00 -1.9902334579565639e+00 -2.4457341661433990e-01 -2.5074159964106064e+00 -1.7174395531888393e+00 -8.9409943948569784e-02 2.7630929950511338e+00 1.7893413873540989e+00 4.0768343416690933e-01 2.4614699159345950e+00 1.6551510336884081e+00 1.8068974414205960e-01 -2.7401842580762246e+00 -1.5843349636154216e+00 -3.9612197287327933e-01 -1.7530391614412739e+00 -1.5707159382213598e+00 -3.5502458086336652e-01 1.9704237405655454e+00 1.5565677775200482e+00 9.9963519534178674e-02 1.8616637144196297e+00 5.4612700898600099e+00 5.7175613885597620e-01 -1.9531678067097369e+00 -5.0979242109476868e+00 -2.5428915642018779e-01 -1.7111219279588732e+00 -3.8635525506345627e+00 -1.3286945305888570e-01 1.7676092296013048e+00 3.4716310133080905e+00 4.9260585375657878e-01 1.6474975613133571e+00 3.7301100789257555e+00 2.6522697901374798e-01 -1.8306058504952962e+00 -3.4094880409327715e+00 -5.1665369532124494e-01 -1.5734000734002889e+00 -2.9653616474084847e+00 -5.1630578531747962e-01 1.7915251532299044e+00 2.6733152678296523e+00 9.0529118491494504e-02 3.9679321645640764e-01 5.7175613885597643e-01 2.9161650151576182e+00 -2.0615544447660322e-01 -2.1183769264135552e-01 -2.6909460140105064e+00 -2.5578137821196262e-01 -3.7791857156197606e-01 -1.3380197684107913e+00 4.0479633707846008e-01 4.9627487398990605e-01 1.4477659013398372e+00 1.4128806715290299e-01 2.1101737051516614e-01 1.3085428659782323e+00 -4.3112289435555429e-01 -4.8892692932903531e-01 -1.4756407991251448e+00 -3.5184818975195409e-01 -5.1084248778735919e-01 -7.8894867942975233e-01 3.0203028610830374e-01 3.1047729795867740e-01 6.2108147850050588e-01 -4.2855065476257721e+00 -1.9531678067097371e+00 -2.0615544447660322e-01 4.6808813649692000e+00 2.0372915002119498e+00 -4.2478778157665077e-02 2.8016327332639048e+00 1.8257847241786758e+00 -2.6873069558190785e-02 -3.1354892881470411e+00 -1.8416655464520391e+00 -3.1156121918734658e-01 -2.7550861205464563e+00 -1.8923039994716255e+00 5.7736433880387815e-02 3.0359772328271895e+00 1.7721695306299350e+00 1.7766147865407461e-01 1.9989491020331358e+00 1.8032847508240244e+00 3.0714741817830277e-01 -2.3413584767741593e+00 -1.7513931532111835e+00 4.4523180667040863e-02 -1.9902334579565639e+00 -5.0979242109476868e+00 -2.1183769264135546e-01 2.0372915002119498e+00 4.8986578595974430e+00 -4.2759547377333756e-02 1.8394448531028953e+00 3.5757613807667772e+00 -3.5274224266945882e-02 -1.8481644166153939e+00 -3.2391719897925784e+00 -3.2378529140256596e-01 -1.6300983238408644e+00 -3.5231806212619610e+00 6.8707826640279857e-02 1.7675947639201484e+00 3.1825793529886073e+00 1.8643971309441396e-01 1.5555220071641658e+00 2.6964527808796257e+00 3.1107002930008770e-01 -1.7313569259863382e+00 -2.4931745522302271e+00 4.7439186653419868e-02 -2.4457341661433990e-01 -2.5428915642018779e-01 -2.6909460140105064e+00 -4.2478778157665084e-02 -4.2759547377333743e-02 2.7519848872926671e+00 -3.6882720456947168e-02 -4.7130992842378754e-02 1.3463549864231268e+00 -9.6196344952825558e-02 -9.9073047484931342e-02 -1.3339080409350828e+00 5.8464142476248565e-02 7.5448151108258865e-02 -1.3583003866088195e+00 2.1468601788928679e-01 2.2811996282177183e-01 1.3191130267270939e+00 9.1859084626968041e-02 8.0602642917960252e-02 6.4072780356711168e-01 5.5122015189274294e-02 5.9081987276840726e-02 -6.7502626245559161e-01 -2.5074159964106064e+00 -1.7111219279588730e+00 -2.5578137821196267e-01 2.8016327332639048e+00 1.8394448531028953e+00 -3.6882720456947175e-02 4.0524780735694348e+00 2.0031119870277139e+00 -1.9123872403586470e-02 -4.2908784413843986e+00 -2.0712922243721823e+00 -2.0259075881588112e-01 -1.7681719407775323e+00 -1.6298761998547742e+00 4.2899877608700010e-02 2.0022836845836185e+00 1.5509819776431315e+00 2.4069302895358111e-01 2.5123541502386098e+00 1.7593135235793544e+00 1.8530152990419152e-01 -2.8022822630830309e+00 -1.7405619891672648e+00 4.5484293421905075e-02 -1.7174395531888393e+00 -3.8635525506345627e+00 -3.7791857156197606e-01 1.8257847241786758e+00 3.5757613807667772e+00 -4.7130992842378754e-02 2.0031119870277143e+00 5.5759021466463947e+00 -3.1164248829926130e-02 -2.0761791929360234e+00 -5.1375694593180681e+00 -2.9641406489869315e-01 -1.6060545079788735e+00 -3.0726027934470821e+00 6.1350328140794677e-02 1.8136799884647059e+00 2.6813185720211936e+00 3.6219616270742266e-01 1.7497435024231478e+00 3.8487376980445585e+00 2.6862167380291535e-01 -1.9926469479905080e+00 -3.6079949940792089e+00 6.0459713481841752e-02 -8.9409943948569812e-02 -1.3286945305888567e-01 -1.3380197684107913e+00 -2.6873069558190774e-02 -3.5274224266945896e-02 1.3463549864231268e+00 -1.9123872403586463e-02 -3.1164248829926147e-02 2.6724947789048330e+00 -1.9279119823429214e-01 -2.8373732553512793e-01 -2.6191558433347559e+00 3.3867730196866078e-02 4.8733331255072274e-02 -6.7666605238199917e-01 7.0695163434343886e-02 1.2085426491267902e-01 6.4248006771059585e-01 1.7392274844135425e-01 2.5561203546935107e-01 1.2885012978394126e+00 4.9712442072074974e-02 5.7845620053783291e-02 -1.3159894667504226e+00 2.7630929950511338e+00 1.7676092296013048e+00 4.0479633707846008e-01 -3.1354892881470411e+00 -1.8481644166153943e+00 -9.6196344952825544e-02 -4.2908784413843986e+00 -2.0761791929360234e+00 -1.9279119823429214e-01 4.7194776950538992e+00 2.0859976999890981e+00 5.0497262846704283e-01 1.9648963278250491e+00 1.8146648177450369e+00 5.8743937054018237e-02 -2.3242747417230230e+00 -1.6789271864389241e+00 -4.3294344315807515e-01 -2.7807576166173780e+00 -1.9411019168114148e+00 -4.5587980639759657e-01 3.0839330699417604e+00 1.8761009654663168e+00 2.0929789014326800e-01 1.7893413873540991e+00 3.4716310133080905e+00 4.9627487398990600e-01 -1.8416655464520393e+00 -3.2391719897925784e+00 -9.9073047484931342e-02 -2.0712922243721823e+00 -5.1375694593180690e+00 -2.8373732553512798e-01 2.0859976999890981e+00 4.8856105727488881e+00 5.2272502447032165e-01 1.5406163373027359e+00 2.6680200813319455e+00 1.0753881426485346e-01 -1.6958178484123776e+00 -2.4005561852188269e+00 -4.4649073241488446e-01 -1.6809062866413416e+00 -3.5020452160017852e+00 -5.1792713235378141e-01 1.8737264812320080e+00 3.2540811829423344e+00 2.2068952506364362e-01 4.0768343416690933e-01 4.9260585375657878e-01 1.4477659013398370e+00 -3.1156121918734658e-01 -3.2378529140256596e-01 -1.3339080409350830e+00 -2.0259075881588112e-01 -2.9641406489869304e-01 -2.6191558433347555e+00 5.0497262846704283e-01 5.2272502447032165e-01 2.8424039646662838e+00 2.3479871512575246e-01 3.6066819270944822e-01 6.1724188002409508e-01 -4.2976624798926594e-01 -4.3886053088685695e-01 -7.8729028094733344e-01 -4.1606319723939916e-01 -5.4390827940972486e-01 -1.4432952689724496e+00 2.1252664547218844e-01 2.2696909566149207e-01 1.2762376881594057e+00 2.4614699159345950e+00 1.6474975613133571e+00 1.4128806715290304e-01 -2.7550861205464572e+00 -1.6300983238408644e+00 5.8464142476248579e-02 -1.7681719407775325e+00 -1.6060545079788735e+00 3.3867730196866071e-02 1.9648963278250491e+00 1.5406163373027359e+00 2.3479871512575246e-01 4.0286723035864132e+00 1.8722048165345060e+00 -2.9640133237240546e-02 -4.1988021957590345e+00 -1.9600795893501211e+00 -1.5826175318945540e-01 -2.4520737725712305e+00 -1.6703194757618163e+00 -2.5232226186232959e-01 2.7190954823081981e+00 1.8062331817810755e+00 -2.8194506662744891e-02 1.6551510336884081e+00 3.7301100789257555e+00 2.1101737051516620e-01 -1.8923039994716255e+00 -3.5231806212619601e+00 7.5448151108258865e-02 -1.6298761998547742e+00 -3.0726027934470821e+00 4.8733331255072267e-02 1.8146648177450369e+00 2.6680200813319455e+00 3.6066819270944817e-01 1.8722048165345055e+00 5.4983476125003756e+00 -4.6469146400403116e-02 -1.9125432277199597e+00 -5.0044929212292173e+00 -2.3959092189454714e-01 -1.6873201035570129e+00 -3.8079703333161286e+00 -3.7581658496803971e-01 1.7800228626354229e+00 3.5117688964963110e+00 -3.3990392324955883e-02 1.8068974414205954e-01 2.6522697901374792e-01 1.3085428659782321e+00 5.7736433880387857e-02 6.8707826640279857e-02 -1.3583003866088195e+00 4.2899877608700010e-02 6.1350328140794677e-02 -6.7666605238199917e-01 5.8743937054018237e-02 1.0753881426485343e-01 6.1724188002409508e-01 -2.9640133237240539e-02 -4.6469146400403116e-02 2.7540635633487374e+00 -1.9648140797605521e-01 -2.9266760482403703e-01 -2.6424561953645451e+00 -7.6220435132648437e-02 -1.1701209251023711e-01 -1.3126476455892973e+00 -3.7728016339221460e-02 -4.6675104324998593e-02 1.3102219705935962e+00 -2.7401842580762246e+00 -1.8306058504952962e+00 -4.3112289435555429e-01 3.0359772328271895e+00 1.7675947639201488e+00 2.1468601788928685e-01 2.0022836845836185e+00 1.8136799884647059e+00 7.0695163434343899e-02 -2.3242747417230225e+00 -1.6958178484123776e+00 -4.2976624798926594e-01 -4.1988021957590353e+00 -1.9125432277199597e+00 -1.9648140797605523e-01 4.5739999133475910e+00 1.9406758742968917e+00 4.7433324258675180e-01 2.7254788131038854e+00 1.7384239874588499e+00 4.0064702174269756e-01 -3.0744784483040033e+00 -1.8214076875129619e+00 -1.0299089533220415e-01 -1.5843349636154214e+00 -3.4094880409327724e+00 -4.8892692932903548e-01 1.7721695306299350e+00 3.1825793529886073e+00 2.2811996282177180e-01 1.5509819776431315e+00 2.6813185720211936e+00 1.2085426491267902e-01 -1.6789271864389241e+00 -2.4005561852188264e+00 -4.3886053088685695e-01 -1.9600795893501211e+00 -5.0044929212292173e+00 -2.9266760482403703e-01 1.9406758742968917e+00 4.7134053592764094e+00 4.8904183986742500e-01 1.7562623144020781e+00 3.4162309841049860e+00 4.8911164849111038e-01 -1.7967479575675704e+00 -3.1789971210103793e+00 -1.0667265105305654e-01 -3.9612197287327933e-01 -5.1665369532124494e-01 -1.4756407991251448e+00 1.7766147865407461e-01 1.8643971309441396e-01 1.3191130267270939e+00 2.4069302895358111e-01 3.6219616270742266e-01 6.4248006771059585e-01 -4.3294344315807520e-01 -4.4649073241488435e-01 -7.8729028094733344e-01 -1.5826175318945537e-01 -2.3959092189454714e-01 -2.6424561953645451e+00 4.7433324258675180e-01 4.8904183986742489e-01 2.8222320822576994e+00 4.0318373940430452e-01 4.8802683129596230e-01 1.4334658996817580e+00 -3.0854432037790241e-01 -3.2296919733454738e-01 -1.3119038009401243e+00 -1.7530391614412741e+00 -1.5734000734002889e+00 -3.5184818975195409e-01 1.9989491020331358e+00 1.5555220071641658e+00 9.1859084626968054e-02 2.5123541502386102e+00 1.7497435024231478e+00 1.7392274844135425e-01 -2.7807576166173784e+00 -1.6809062866413416e+00 -4.1606319723939911e-01 -2.4520737725712305e+00 -1.6873201035570129e+00 -7.6220435132648451e-02 2.7254788131038854e+00 1.7562623144020781e+00 4.0318373940430452e-01 3.9508426385046223e+00 1.9108049962759663e+00 4.1170512546697458e-01 -4.2017541532503699e+00 -2.0307063566667143e+00 -2.3653887581559946e-01 -1.5707159382213596e+00 -2.9653616474084847e+00 -5.1084248778735919e-01 1.8032847508240244e+00 2.6964527808796257e+00 8.0602642917960252e-02 1.7593135235793542e+00 3.8487376980445585e+00 2.5561203546935107e-01 -1.9411019168114143e+00 -3.5020452160017852e+00 -5.4390827940972497e-01 -1.6703194757618163e+00 -3.8079703333161286e+00 -1.1701209251023714e-01 1.7384239874588499e+00 3.4162309841049860e+00 4.8802683129596230e-01 1.9108049962759663e+00 5.3717896810259420e+00 5.9483876421750637e-01 -2.0296899273436049e+00 -5.0578339473287119e+00 -2.4731741419345840e-01 -3.5502458086336652e-01 -5.1630578531747950e-01 -7.8894867942975222e-01 3.0714741817830271e-01 3.1107002930008770e-01 6.4072780356711168e-01 1.8530152990419149e-01 2.6862167380291535e-01 1.2885012978394126e+00 -4.5587980639759657e-01 -5.1792713235378141e-01 -1.4432952689724499e+00 -2.5232226186232964e-01 -3.7581658496803982e-01 -1.3126476455892973e+00 4.0064702174269756e-01 4.8911164849111050e-01 1.4334658996817580e+00 4.1170512546697463e-01 5.9483876421750637e-01 2.7522517671990232e+00 -2.4157444616887389e-01 -2.5359261317231896e-01 -2.5700551742958062e+00 1.9704237405655454e+00 1.7915251532299044e+00 3.0203028610830374e-01 -2.3413584767741593e+00 -1.7313569259863379e+00 5.5122015189274280e-02 -2.8022822630830313e+00 -1.9926469479905078e+00 4.9712442072074946e-02 3.0839330699417604e+00 1.8737264812320080e+00 2.1252664547218841e-01 2.7190954823081985e+00 1.7800228626354231e+00 -3.7728016339221453e-02 -3.0744784483040033e+00 -1.7967479575675700e+00 -3.0854432037790241e-01 -4.2017541532503699e+00 -2.0296899273436049e+00 -2.4157444616887380e-01 4.6464210485960615e+00 2.1051672617906840e+00 -3.1544605955844067e-02 1.5565677775200479e+00 2.6733152678296519e+00 3.1047729795867740e-01 -1.7513931532111835e+00 -2.4931745522302271e+00 5.9081987276840726e-02 -1.7405619891672650e+00 -3.6079949940792089e+00 5.7845620053783284e-02 1.8761009654663168e+00 3.2540811829423344e+00 2.2696909566149209e-01 1.8062331817810757e+00 3.5117688964963110e+00 -4.6675104324998606e-02 -1.8214076875129619e+00 -3.1789971210103793e+00 -3.2296919733454738e-01 -2.0307063566667143e+00 -5.0578339473287119e+00 -2.5359261317231901e-01 2.1051672617906845e+00 4.8988352673802300e+00 -3.1137086118928927e-02 9.9963519534178688e-02 9.0529118491494476e-02 6.2108147850050588e-01 4.4523180667040863e-02 4.7439186653419868e-02 -6.7502626245559172e-01 4.5484293421905062e-02 6.0459713481841725e-02 -1.3159894667504226e+00 2.0929789014326800e-01 2.2068952506364364e-01 1.2762376881594057e+00 -2.8194506662744898e-02 -3.3990392324955869e-02 1.3102219705935962e+00 -1.0299089533220418e-01 -1.0667265105305657e-01 -1.3119038009401243e+00 -2.3653887581559946e-01 -2.4731741419345840e-01 -2.5700551742958062e+00 -3.1544605955844074e-02 -3.1137086118928917e-02 2.6654335671884373e+00 516 517 518 564 565 566 576 577 578 528 529 530 519 520 521 567 568 569 579 580 581 531 532 533 3.8210446155911799e+00 1.6790386386584240e+00 3.1652224295662645e-01 -3.9758525394685567e+00 -1.9171610643279600e+00 -2.2587856093989464e-01 -2.1702570251578082e+00 -1.5287795303328569e+00 -9.3527638604165936e-02 2.3881257389335921e+00 1.7263936571081353e+00 3.3749319911123737e-01 2.1588353666341149e+00 1.5022026562281321e+00 1.5784870737494414e-01 -2.3999319768123826e+00 -1.5393590861154718e+00 -3.2513122767951586e-01 -1.3906055599340608e+00 -1.4148801335145420e+00 -2.7922674654097740e-01 1.5686413802139194e+00 1.4925448622961393e+00 1.1190002432174583e-01 1.6790386386584242e+00 6.8657636008439900e+00 7.1791557509409509e-01 -1.8913605317687177e+00 -6.5402085945311548e+00 -3.6539762188702768e-01 -1.5210524293603911e+00 -5.0518031610582845e+00 -2.1878356647391151e-01 1.7083668430549701e+00 4.6790714881995390e+00 6.2529855887100216e-01 1.5008809893536403e+00 4.9287521324001391e+00 3.6224921468429555e-01 -1.8089551656527170e+00 -4.6259744117327664e+00 -6.5644723645059633e-01 -1.4194281392966388e+00 -4.0255519400763129e+00 -6.3976642538734296e-01 1.7525097950114306e+00 3.7699508859548492e+00 1.7493150154948539e-01 3.1652224295662651e-01 7.1791557509409520e-01 3.2135527897546727e+00 -2.0659831097897427e-01 -3.3408795476326131e-01 -2.9910484475167194e+00 -2.1273253983444132e-01 -4.9434851464009311e-01 -1.5236014618593365e+00 3.3642302686512915e-01 6.3108340281604058e-01 1.6234391474419163e+00 1.3878939901005174e-01 3.2038256653358499e-01 1.4986644085435594e+00 -3.6650554730271456e-01 -6.3325585122856443e-01 -1.6558900551707536e+00 -2.7943727028534104e-01 -6.3823766097109313e-01 -8.9841655007900090e-01 2.7353899956966393e-01 4.3054843715929136e-01 7.3330016888566174e-01 -3.9758525394685571e+00 -1.8913605317687181e+00 -2.0659831097897419e-01 4.3406980523027325e+00 2.0930141932773725e+00 1.3538542451998892e-02 2.4148683783660494e+00 1.7562115794619471e+00 1.7925083605684212e-02 -2.7380674460679879e+00 -1.9046189817959689e+00 -2.8095890800205764e-01 -2.4084069120484153e+00 -1.8560763749660167e+00 2.7307713200205200e-03 2.6827696915631400e+00 1.8506975322221477e+00 1.8457719875884993e-01 1.5999018563217422e+00 1.7648498610346066e+00 2.7475339650237607e-01 -1.9159110809687037e+00 -1.8127172774653704e+00 -5.9677736578977181e-03 -1.9171610643279595e+00 -6.5402085945311548e+00 -3.3408795476326125e-01 2.0930141932773720e+00 6.3545062403676340e+00 2.4017964397718083e-02 1.7657777043260003e+00 4.8013909378098685e+00 3.1383098101342474e-02 -1.9121829791052378e+00 -4.4733167429820329e+00 -4.4011586781401674e-01 -1.5751644303149324e+00 -4.7490633842001824e+00 7.8073227204405711e-03 1.8444519341372130e+00 4.4236192355859876e+00 2.9166208442723396e-01 1.4963807239802480e+00 3.7949018115304090e+00 4.2716902300365761e-01 -1.7951160819727041e+00 -3.6118295035805317e+00 -7.8356700731143213e-03 -2.2587856093989461e-01 -3.6539762188702768e-01 -2.9910484475167189e+00 1.3538542451998887e-02 2.4017964397718073e-02 3.0259429471335491e+00 1.1957247790717074e-02 1.9993491932646806e-02 1.5113741080924017e+00 -1.1610853631073284e-01 -1.7940838327017561e-01 -1.5155117443798416e+00 6.3181942733615626e-03 1.0506475420102157e-02 -1.5220769330907082e+00 2.0224839648612719e-01 3.2255879617510919e-01 1.5067108483854139e+00 1.0640196007449469e-01 1.6381894219129711e-01 7.5479492081121169e-01 1.5227561739280201e-03 3.9103350403299590e-03 -7.7018569943530801e-01 -2.1702570251578073e+00 -1.5210524293603911e+00 -2.1273253983444132e-01 2.4148683783660490e+00 1.7657777043260003e+00 1.1957247790717072e-02 3.8415558777378935e+00 1.7847611905586820e+00 2.4624900601336645e-02 -4.0487558594972981e+00 -1.9872366173035074e+00 -1.7911558941995626e-01 -1.3971083122010695e+00 -1.4554732990182977e+00 -1.8621766900484115e-03 1.5994031688877994e+00 1.4931289160351588e+00 2.0095639198002119e-01 2.2229818336000089e+00 1.5760976971573211e+00 1.5831617743772025e-01 -2.4626880617355766e+00 -1.6560031623949671e+00 -2.1444118653490920e-03 -1.5287795303328569e+00 -5.0518031610582845e+00 -4.9434851464009311e-01 1.7562115794619471e+00 4.8013909378098685e+00 1.9993491932646802e-02 1.7847611905586820e+00 7.1182893635140996e+00 5.1841672403076390e-02 -1.9868755404207554e+00 -6.7158070586167176e+00 -3.9470571004197924e-01 -1.4449947122740985e+00 -4.1442885855362910e+00 -6.5605836432377097e-03 1.7742847540274900e+00 3.7878370642617476e+00 4.6693072032781396e-01 1.5731965143471889e+00 5.1157294080128191e+00 3.6122848840152288e-01 -1.9278042553675971e+00 -4.9113479683872399e+00 -4.3795647397498281e-03 -9.3527638604165936e-02 -2.1878356647391151e-01 -1.5236014618593365e+00 1.7925083605684216e-02 3.1383098101342460e-02 1.5113741080924017e+00 2.4624900601336652e-02 5.1841672403076383e-02 3.0581791376469547e+00 -1.7995433398855529e-01 -3.9633821074244963e-01 -3.0262319687249564e+00 -6.7630807908050632e-03 -1.8030021196205143e-02 -7.7301133684394319e-01 8.4562692097795447e-02 1.9509011975162105e-01 7.5786824433335109e-01 1.5811247513160742e-01 3.6300083370245956e-01 1.5320529356133139e+00 -4.9800980528974872e-03 -8.1639255459332108e-03 -1.5366296582577839e+00 2.3881257389335921e+00 1.7083668430549701e+00 3.3642302686512909e-01 -2.7380674460679879e+00 -1.9121829791052378e+00 -1.1610853631073281e-01 -4.0487558594972981e+00 -1.9868755404207554e+00 -1.7995433398855529e-01 4.4578309786715336e+00 2.1362638237575413e+00 4.3068982791460553e-01 1.5690831898314621e+00 1.7719005969390969e+00 7.7924175430558462e-02 -1.9081274817513769e+00 -1.7578261739564649e+00 -3.7400747815682489e-01 -2.4562790774830088e+00 -1.8891545675422541e+00 -3.8216560676864580e-01 2.7361899573630839e+00 1.9295079972731046e+00 2.0719892501446563e-01 1.7263936571081349e+00 4.6790714881995390e+00 6.3108340281604047e-01 -1.9046189817959687e+00 -4.4733167429820329e+00 -1.7940838327017561e-01 -1.9872366173035074e+00 -6.7158070586167176e+00 -3.9633821074244963e-01 2.1362638237575413e+00 6.4685010411257862e+00 6.7552016896575373e-01 1.4844789627348087e+00 3.7639098285180750e+00 1.8338828245282313e-01 -1.7666499696819835e+00 -3.5033261016405755e+00 -5.8294058199568344e-01 -1.6140302074105202e+00 -4.7862531621602837e+00 -6.6076728731533474e-01 1.9253993325914949e+00 4.5672207075562072e+00 3.2946260908902580e-01 3.3749319911123737e-01 6.2529855887100216e-01 1.6234391474419163e+00 -2.8095890800205769e-01 -4.4011586781401679e-01 -1.5155117443798416e+00 -1.7911558941995626e-01 -3.9470571004197930e-01 -3.0262319687249573e+00 4.3068982791460553e-01 6.7552016896575373e-01 3.2383123893703258e+00 1.9622061978971866e-01 4.6180259922463751e-01 7.3173759016433548e-01 -3.6954731031868260e-01 -5.7312650080677330e-01 -8.9328816633688279e-01 -3.3455799232434158e-01 -6.7528016654292977e-01 -1.6753253603300178e+00 1.9977615324947662e-01 3.2060691814430570e-01 1.5168681127951218e+00 2.1588353666341149e+00 1.5008809893536403e+00 1.3878939901005172e-01 -2.4084069120484153e+00 -1.5751644303149326e+00 6.3181942733615696e-03 -1.3971083122010695e+00 -1.4449947122740985e+00 -6.7630807908050702e-03 1.5690831898314621e+00 1.4844789627348087e+00 1.9622061978971866e-01 3.8887115809751593e+00 1.7111819656844234e+00 1.7830445392064020e-02 -4.0329792204809740e+00 -1.9253382794595875e+00 -1.6017448745709173e-01 -2.1984312193669679e+00 -1.5135369608922615e+00 -2.0982257926599918e-01 2.4202955266566923e+00 1.7624924651680072e+00 1.7601489048699941e-02 1.5022026562281323e+00 4.9287521324001391e+00 3.2038256653358493e-01 -1.8560763749660167e+00 -4.7490633842001824e+00 1.0506475420102157e-02 -1.4554732990182981e+00 -4.1442885855362910e+00 -1.8030021196205129e-02 1.7719005969390969e+00 3.7639098285180750e+00 4.6180259922463751e-01 1.7111819656844232e+00 7.0582406142554905e+00 3.6871352115771201e-02 -1.8813753173842331e+00 -6.5973421692302274e+00 -3.5569960315224086e-01 -1.5217385885191428e+00 -5.0768429254786271e+00 -4.8945097341052229e-01 1.7293783610360387e+00 4.8166344892716220e+00 3.3617604464872261e-02 1.5784870737494416e-01 3.6224921468429555e-01 1.4986644085435594e+00 2.7307713200205139e-03 7.8073227204405972e-03 -1.5220769330907080e+00 -1.8621766900484100e-03 -6.5605836432376923e-03 -7.7301133684394319e-01 7.7924175430558462e-02 1.8338828245282310e-01 7.3173759016433548e-01 1.7830445392064045e-02 3.6871352115771208e-02 3.1421964713167383e+00 -1.7762316517785484e-01 -3.9690185010316570e-01 -3.0543020577576780e+00 -8.7973983285176000e-02 -2.0837282594082293e-01 -1.5544922035860347e+00 1.1125225635492078e-02 2.1519087713895702e-02 1.5312840612537306e+00 -2.3999319768123817e+00 -1.8089551656527163e+00 -3.6650554730271445e-01 2.6827696915631405e+00 1.8444519341372130e+00 2.0224839648612719e-01 1.5994031688877999e+00 1.7742847540274900e+00 8.4562692097795433e-02 -1.9081274817513769e+00 -1.7666499696819835e+00 -3.6954731031868260e-01 -4.0329792204809740e+00 -1.8813753173842327e+00 -1.7762316517785487e-01 4.3861927416644502e+00 2.0421476838914558e+00 4.1572708067333097e-01 2.4330509269732241e+00 1.7028031685234948e+00 3.3405823607462626e-01 -2.7603778500438816e+00 -1.9067070878607209e+00 -1.2292038253262776e-01 -1.5393590861154718e+00 -4.6259744117327664e+00 -6.3325585122856443e-01 1.8506975322221477e+00 4.4236192355859876e+00 3.2255879617510919e-01 1.4931289160351591e+00 3.7878370642617476e+00 1.9509011975162105e-01 -1.7578261739564649e+00 -3.5033261016405755e+00 -5.7312650080677330e-01 -1.9253382794595872e+00 -6.5973421692302274e+00 -3.9690185010316570e-01 2.0421476838914558e+00 6.3005939068867889e+00 6.5092969877297502e-01 1.7268622002263740e+00 4.7120373594247171e+00 6.2649264050409537e-01 -1.8903127928436132e+00 -4.4974448835556711e+00 -1.9178705306529711e-01 -3.2513122767951597e-01 -6.5644723645059644e-01 -1.6558900551707536e+00 1.8457719875884995e-01 2.9166208442723390e-01 1.5067108483854139e+00 2.0095639198002124e-01 4.6693072032781396e-01 7.5786824433335109e-01 -3.7400747815682495e-01 -5.8294058199568344e-01 -8.9328816633688279e-01 -1.6017448745709167e-01 -3.5569960315224086e-01 -3.0543020577576780e+00 4.1572708067333092e-01 6.5092969877297502e-01 3.2208615060274073e+00 3.3979042341241428e-01 6.2918711816943096e-01 1.6679924629395979e+00 -2.8173790153118394e-01 -4.4362220009893327e-01 -1.5499527824204562e+00 -1.3906055599340608e+00 -1.4194281392966388e+00 -2.7943727028534104e-01 1.5999018563217422e+00 1.4963807239802480e+00 1.0640196007449469e-01 2.2229818336000089e+00 1.5731965143471889e+00 1.5811247513160745e-01 -2.4562790774830088e+00 -1.6140302074105202e+00 -3.3455799232434152e-01 -2.1984312193669679e+00 -1.5217385885191428e+00 -8.7973983285176013e-02 2.4330509269732241e+00 1.7268622002263738e+00 3.3979042341241428e-01 3.8997905130170931e+00 1.7446000225657887e+00 3.2770848194507995e-01 -4.1104092731280311e+00 -1.9858425258932986e+00 -2.3004409466873774e-01 -1.4148801335145418e+00 -4.0255519400763129e+00 -6.3823766097109302e-01 1.7648498610346062e+00 3.7949018115304090e+00 1.6381894219129711e-01 1.5760976971573211e+00 5.1157294080128182e+00 3.6300083370245956e-01 -1.8891545675422543e+00 -4.7862531621602837e+00 -6.7528016654292977e-01 -1.5135369608922611e+00 -5.0768429254786271e+00 -2.0837282594082290e-01 1.7028031685234946e+00 4.7120373594247171e+00 6.2918711816943107e-01 1.7446000225657889e+00 7.0558677677316908e+00 7.4212134320818224e-01 -1.9707790873321547e+00 -6.7898883189844126e+00 -3.7623758381652406e-01 -2.7922674654097740e-01 -6.3976642538734296e-01 -8.9841655007900068e-01 2.7475339650237607e-01 4.2716902300365761e-01 7.5479492081121169e-01 1.5831617743772025e-01 3.6122848840152294e-01 1.5320529356133139e+00 -3.8216560676864580e-01 -6.6076728731533474e-01 -1.6753253603300178e+00 -2.0982257926599920e-01 -4.8945097341052229e-01 -1.5544922035860347e+00 3.3405823607462626e-01 6.2649264050409537e-01 1.6679924629395979e+00 3.2770848194507995e-01 7.4212134320818246e-01 3.2659780490172441e+00 -2.2362135938418021e-01 -3.6702680900425849e-01 -3.0925842543863142e+00 1.5686413802139192e+00 1.7525097950114306e+00 2.7353899956966393e-01 -1.9159110809687034e+00 -1.7951160819727041e+00 1.5227561739280218e-03 -2.4626880617355766e+00 -1.9278042553675974e+00 -4.9800980528974803e-03 2.7361899573630835e+00 1.9253993325914949e+00 1.9977615324947667e-01 2.4202955266566923e+00 1.7293783610360387e+00 1.1125225635492078e-02 -2.7603778500438807e+00 -1.8903127928436132e+00 -2.8173790153118400e-01 -4.1104092731280311e+00 -1.9707790873321551e+00 -2.2362135938418023e-01 4.5242594016424986e+00 2.1767247288771059e+00 2.4376224339700971e-02 1.4925448622961393e+00 3.7699508859548492e+00 4.3054843715929136e-01 -1.8127172774653704e+00 -3.6118295035805317e+00 3.9103350403299590e-03 -1.6560031623949669e+00 -4.9113479683872399e+00 -8.1639255459332403e-03 1.9295079972731048e+00 4.5672207075562072e+00 3.2060691814430575e-01 1.7624924651680072e+00 4.8166344892716211e+00 2.1519087713895695e-02 -1.9067070878607209e+00 -4.4974448835556711e+00 -4.4362220009893327e-01 -1.9858425258932986e+00 -6.7898883189844126e+00 -3.6702680900425855e-01 2.1767247288771059e+00 6.6567045917251750e+00 4.2228156591301962e-02 1.1190002432174583e-01 1.7493150154948539e-01 7.3330016888566174e-01 -5.9677736578977215e-03 -7.8356700731143352e-03 -7.7018569943530812e-01 -2.1444118653490985e-03 -4.3795647397498558e-03 -1.5366296582577841e+00 2.0719892501446563e-01 3.2946260908902580e-01 1.5168681127951218e+00 1.7601489048699938e-02 3.3617604464872254e-02 1.5312840612537306e+00 -1.2292038253262777e-01 -1.9178705306529711e-01 -1.5499527824204562e+00 -2.3004409466873774e-01 -3.7623758381652406e-01 -3.0925842543863142e+00 2.4376224339700957e-02 4.2228156591301969e-02 3.1679000515653484e+00 564 565 566 612 613 614 624 625 626 576 577 578 567 568 569 615 616 617 627 628 629 579 580 581 3.6836205683325756e+00 1.5785935376958862e+00 3.0666900212313897e-01 -3.8359193019504079e+00 -1.8288605327811338e+00 -2.2128775132224301e-01 -2.0607177490813595e+00 -1.4305145042043230e+00 -8.3660119236449657e-02 2.2801216176871444e+00 1.6388084521148472e+00 3.3182612573502263e-01 2.0324651263659823e+00 1.4064133761364246e+00 1.4900499791490596e-01 -2.2788767493663427e+00 -1.4462314513555004e+00 -3.1632795740078706e-01 -1.2961190921411132e+00 -1.3198591104048611e+00 -2.6982481505431777e-01 1.4754255801535208e+00 1.4016502327986597e+00 1.0360051724072984e-01 1.5785935376958864e+00 6.6025845452961693e+00 7.0549641605143365e-01 -1.7912655665242845e+00 -6.2749719816472931e+00 -3.5116429800328303e-01 -1.4243346949250726e+00 -4.8215616908750523e+00 -1.9903031070815533e-01 1.6106033448860189e+00 4.4464411761138321e+00 6.1259924738616922e-01 1.4013579954232682e+00 4.6830053794715258e+00 3.4768505673721167e-01 -1.7190458837262228e+00 -4.3773679531717580e+00 -6.4164414632258637e-01 -1.3215800276492655e+00 -3.8122105610435995e+00 -6.2776362339502434e-01 1.6656712948196721e+00 3.5540810858561729e+00 1.5382165825423433e-01 3.0666900212313902e-01 7.0549641605143354e-01 3.1317871859044035e+00 -1.9626940937371806e-01 -3.1132231340940825e-01 -2.8990496353476982e+00 -2.0218730715968006e-01 -4.7778174218400116e-01 -1.4616500546049545e+00 3.2823244260284368e-01 6.1762869635456130e-01 1.5692167325952249e+00 1.2729521424636975e-01 3.0013803267899214e-01 1.4197283614732168e+00 -3.6188138448423834e-01 -6.2104684913472108e-01 -1.5865889277994998e+00 -2.6967065214156344e-01 -6.2660663182464771e-01 -8.5752994443780639e-01 2.6781209418684759e-01 4.1349439146779121e-01 6.8408628221711421e-01 -3.8359193019504079e+00 -1.7912655665242847e+00 -1.9626940937371806e-01 4.2175878629855736e+00 2.0027167221778979e+00 -5.6235706568341496e-04 2.3070197908885559e+00 1.6604881216301768e+00 5.2907535293008415e-03 -2.6411276293071464e+00 -1.8157697416909948e+00 -2.7419839191178780e-01 -2.2859409608034613e+00 -1.7662068578350802e+00 1.4269942211490453e-02 2.5692695462011139e+00 1.7598086175041399e+00 1.7420573583909751e-01 1.5034506416817432e+00 1.6757543527914449e+00 2.6983525036422251e-01 -1.8343399496959731e+00 -1.7255256480532994e+00 7.4284764070782277e-03 -1.8288605327811338e+00 -6.2749719816472922e+00 -3.1132231340940830e-01 2.0027167221778979e+00 6.0993779934097514e+00 1.9737349752289744e-03 1.6795502792187111e+00 4.5730990689023212e+00 7.7396322114580670e-03 -1.8220275172649367e+00 -4.2458991593722812e+00 -4.2425517287241576e-01 -1.4817360039878651e+00 -4.5090308699302710e+00 2.7711952011187237e-02 1.7574875961942751e+00 4.1779987106173078e+00 2.7273306539637321e-01 1.4033606880616265e+00 3.5819989804405692e+00 4.1228551579629730e-01 -1.7104912316185747e+00 -3.4025727424201033e+00 1.3133585891279756e-02 -2.2128775132224301e-01 -3.5116429800328303e-01 -2.8990496353476987e+00 -5.6235706568341149e-04 1.9737349752289909e-03 2.9467223531083100e+00 3.9787346136886963e-04 -1.8678910129958878e-03 1.4547945405226606e+00 -1.0610611693735207e-01 -1.6236878559806400e-01 -1.4577707773938906e+00 1.8289238535302829e-02 3.5163861034532645e-02 -1.4518079822658569e+00 1.9520837129193092e-01 3.0816927693193430e-01 1.4308117389062220e+00 9.8981252221392146e-02 1.4490958982409449e-01 7.0594774036121166e-01 1.5079489815283786e-02 2.5184511848552429e-02 -7.2964797789095737e-01 -2.0607177490813595e+00 -1.4243346949250726e+00 -2.0218730715968006e-01 2.3070197908885559e+00 1.6795502792187107e+00 3.9787346136886529e-04 3.6476080081657232e+00 1.6746265707082972e+00 1.2453910728590938e-02 -3.8509840764263483e+00 -1.8859693220527443e+00 -1.6667897224328337e-01 -1.3036601674616486e+00 -1.3626164214626908e+00 7.2470097215129575e-03 1.5062315230855441e+00 1.4022822535384287e+00 1.9022990473395734e-01 2.0657668425695661e+00 1.4720089750327310e+00 1.4920753949004689e-01 -2.3112641717400333e+00 -1.5555476400576611e+00 9.3300412674866464e-03 -1.4305145042043230e+00 -4.8215616908750523e+00 -4.7778174218400116e-01 1.6604881216301763e+00 4.5730990689023212e+00 -1.8678910129958722e-03 1.6746265707082979e+00 6.7879072029235177e+00 2.4018768214966003e-02 -1.8778784616251190e+00 -6.3771320299231427e+00 -3.7593286456597491e-01 -1.3477164902955987e+00 -3.9365339236092058e+00 1.4591305502008111e-02 1.6884235821317848e+00 3.5713655638119444e+00 4.5264269448477140e-01 1.4658009767918287e+00 4.8285932255861415e+00 3.4508402839747876e-01 -1.8332297951370480e+00 -4.6257374168165253e+00 1.9245701163748307e-02 -8.3660119236449670e-02 -1.9903031070815536e-01 -1.4616500546049547e+00 5.2907535293008319e-03 7.7396322114580600e-03 1.4547945405226606e+00 1.2453910728590934e-02 2.4018768214966006e-02 2.9228339346717740e+00 -1.6663397706345884e-01 -3.7738678008530635e-01 -2.8819385299471607e+00 4.0528115331118931e-03 7.1058096531072543e-03 -7.3056474336161048e-01 7.1771780695593562e-02 1.7650220223255106e-01 7.0873211308503736e-01 1.4660844716723606e-01 3.4234725902981289e-01 1.4262645041277309e+00 1.0116392646075154e-02 1.8703419451566332e-02 -1.4384717644934759e+00 2.2801216176871444e+00 1.6106033448860189e+00 3.2823244260284368e-01 -2.6411276293071464e+00 -1.8220275172649363e+00 -1.0610611693735207e-01 -3.8509840764263483e+00 -1.8778784616251187e+00 -1.6663397706345884e-01 4.2744489203421070e+00 2.0319088362864250e+00 4.2597707207864538e-01 1.4728344395328332e+00 1.6837534651833295e+00 6.5836141283330943e-02 -1.8252241442698323e+00 -1.6670493309078303e+00 -3.6860637941844532e-01 -2.2998275156697585e+00 -1.7899795606733129e+00 -3.7497212535558394e-01 2.5897583881110018e+00 1.8306692241154254e+00 1.9627294281001983e-01 1.6388084521148469e+00 4.4464411761138312e+00 6.1762869635456130e-01 -1.8157697416909948e+00 -4.2458991593722804e+00 -1.6236878559806400e-01 -1.8859693220527438e+00 -6.3771320299231418e+00 -3.7738678008530629e-01 2.0319088362864246e+00 6.1353225708464256e+00 6.6005707606229869e-01 1.3916669929853791e+00 3.5503076401823894e+00 1.6625514295208746e-01 -1.6809298548107936e+00 -3.2896310853200905e+00 -5.6768732637066299e-01 -1.5097391630555164e+00 -4.4977695946806238e+00 -6.4484932729137090e-01 1.8300238002233979e+00 4.2783604821534906e+00 3.0835130397645627e-01 3.3182612573502268e-01 6.1259924738616922e-01 1.5692167325952249e+00 -2.7419839191178780e-01 -4.2425517287241576e-01 -1.4577707773938904e+00 -1.6667897224328332e-01 -3.7593286456597491e-01 -2.8819385299471607e+00 4.2597707207864527e-01 6.6005707606229858e-01 3.1085802744568514e+00 1.8552649890766448e-01 4.4887347315841492e-01 6.8283235903102513e-01 -3.6698360313757422e-01 -5.6057064378852783e-01 -8.5420772722542893e-01 -3.2679641861987518e-01 -6.6405039555428791e-01 -1.5786562539736906e+00 1.9132768919118823e-01 3.0327928017432376e-01 1.4119439224570693e+00 2.0324651263659828e+00 1.4013579954232682e+00 1.2729521424636972e-01 -2.2859409608034609e+00 -1.4817360039878653e+00 1.8289238535302836e-02 -1.3036601674616486e+00 -1.3477164902955987e+00 4.0528115331118948e-03 1.4728344395328332e+00 1.3916669929853791e+00 1.8552649890766448e-01 3.6295508049067351e+00 1.5955117971457213e+00 6.3851772098992435e-03 -3.7708585658321119e+00 -1.8133264728545839e+00 -1.4615158792030952e-01 -2.0249358119449541e+00 -1.4058744003633936e+00 -1.9990359385307524e-01 2.2505451352366252e+00 1.6601165819470731e+00 4.5062413410363825e-03 1.4064133761364246e+00 4.6830053794715258e+00 3.0013803267899214e-01 -1.7662068578350802e+00 -4.5090308699302710e+00 3.5163861034532604e-02 -1.3626164214626908e+00 -3.9365339236092058e+00 7.1058096531072612e-03 1.6837534651833292e+00 3.5503076401823885e+00 4.4887347315841492e-01 1.5955117971457216e+00 6.6612465720267240e+00 1.0597680419631616e-02 -1.7765328462937882e+00 -6.1890353061615153e+00 -3.3572270303231810e-01 -1.4161569483438894e+00 -4.7760566808677316e+00 -4.7514441234916960e-01 1.6358344354699734e+00 4.5160971888880850e+00 8.9882584368086924e-03 1.4900499791490596e-01 3.4768505673721167e-01 1.4197283614732168e+00 1.4269942211490451e-02 2.7711952011187223e-02 -1.4518079822658569e+00 7.2470097215129583e-03 1.4591305502008132e-02 -7.3056474336161048e-01 6.5836141283330929e-02 1.6625514295208746e-01 6.8283235903102524e-01 6.3851772098992366e-03 1.0597680419631590e-02 2.9451777350158976e+00 -1.6497891250856297e-01 -3.7819034701289028e-01 -2.8479324280576765e+00 -7.7120918215966366e-02 -1.8719404466820991e-01 -1.4341577588233037e+00 -6.4343761661013205e-04 -1.4567459410259687e-03 1.4167244569883082e+00 -2.2788767493663427e+00 -1.7190458837262228e+00 -3.6188138448423834e-01 2.5692695462011139e+00 1.7574875961942751e+00 1.9520837129193097e-01 1.5062315230855441e+00 1.6884235821317850e+00 7.1771780695593576e-02 -1.8252241442698323e+00 -1.6809298548107934e+00 -3.6698360313757422e-01 -3.7708585658321119e+00 -1.7765328462937884e+00 -1.6497891250856303e-01 4.1419156908907508e+00 1.9355739642556948e+00 4.0997853330743472e-01 2.2607500666353886e+00 1.6074872170497345e+00 3.2740685985860662e-01 -2.6032073673445102e+00 -1.8124637748006858e+00 -1.1052164502319006e-01 -1.4462314513555004e+00 -4.3773679531717580e+00 -6.2104684913472108e-01 1.7598086175041399e+00 4.1779987106173069e+00 3.0816927693193430e-01 1.4022822535384287e+00 3.5713655638119448e+00 1.7650220223255103e-01 -1.6670493309078303e+00 -3.2896310853200905e+00 -5.6057064378852794e-01 -1.8133264728545844e+00 -6.1890353061615162e+00 -3.7819034701289028e-01 1.9355739642556951e+00 5.8962189544426060e+00 6.3268683750625387e-01 1.6221052091895152e+00 4.4054984354212570e+00 6.1205513972871750e-01 -1.7931627893698643e+00 -4.1950473196397526e+00 -1.6960561646331687e-01 -3.1632795740078701e-01 -6.4164414632258637e-01 -1.5865889277994998e+00 1.7420573583909754e-01 2.7273306539637315e-01 1.4308117389062220e+00 1.9022990473395734e-01 4.5264269448477140e-01 7.0873211308503736e-01 -3.6860637941844532e-01 -5.6768732637066299e-01 -8.5420772722542881e-01 -1.4615158792030949e-01 -3.3572270303231810e-01 -2.8479324280576770e+00 4.0997853330743467e-01 6.3268683750625365e-01 3.0281619087778702e+00 3.3097329797784147e-01 6.1375416312540787e-01 1.5538150418424346e+00 -2.7430154711878929e-01 -4.2676258478723833e-01 -1.4327917195289586e+00 -1.2961190921411132e+00 -1.3215800276492655e+00 -2.6967065214156344e-01 1.5034506416817432e+00 1.4033606880616263e+00 9.8981252221392146e-02 2.0657668425695661e+00 1.4658009767918287e+00 1.4660844716723606e-01 -2.2998275156697581e+00 -1.5097391630555164e+00 -3.2679641861987524e-01 -2.0249358119449541e+00 -1.4161569483438892e+00 -7.7120918215966366e-02 2.2607500666353886e+00 1.6221052091895152e+00 3.3097329797784147e-01 3.5736611422575755e+00 1.6153806825442603e+00 3.1470940650341528e-01 -3.7827462733884483e+00 -1.8591714175385592e+00 -2.1768441489247969e-01 -1.3198591104048611e+00 -3.8122105610435999e+00 -6.2660663182464771e-01 1.6757543527914449e+00 3.5819989804405692e+00 1.4490958982409449e-01 1.4720089750327308e+00 4.8285932255861415e+00 3.4234725902981289e-01 -1.7899795606733129e+00 -4.4977695946806238e+00 -6.6405039555428780e-01 -1.4058744003633936e+00 -4.7760566808677316e+00 -1.8719404466820991e-01 1.6074872170497347e+00 4.4054984354212561e+00 6.1375416312540776e-01 1.6153806825442600e+00 6.5705215489494124e+00 7.2516446134078638e-01 -1.8549181559766041e+00 -6.3005753538054252e+00 -3.4832440127295550e-01 -2.6982481505431777e-01 -6.2776362339502434e-01 -8.5752994443780639e-01 2.6983525036422251e-01 4.1228551579629735e-01 7.0594774036121155e-01 1.4920753949004689e-01 3.4508402839747865e-01 1.4262645041277309e+00 -3.7497212535558389e-01 -6.4484932729137079e-01 -1.5786562539736906e+00 -1.9990359385307524e-01 -4.7514441234916960e-01 -1.4341577588233037e+00 3.2740685985860657e-01 6.1205513972871761e-01 1.5538150418424346e+00 3.1470940650341522e-01 7.2516446134078638e-01 3.0111837437267259e+00 -2.1645852195331450e-01 -3.4683178222771499e-01 -2.8268670728233025e+00 1.4754255801535208e+00 1.6656712948196721e+00 2.6781209418684759e-01 -1.8343399496959731e+00 -1.7104912316185747e+00 1.5079489815283783e-02 -2.3112641717400333e+00 -1.8332297951370480e+00 1.0116392646075147e-02 2.5897583881110018e+00 1.8300238002233979e+00 1.9132768919118820e-01 2.2505451352366252e+00 1.6358344354699734e+00 -6.4343761661013314e-04 -2.6032073673445102e+00 -1.7931627893698643e+00 -2.7430154711878929e-01 -3.7827462733884483e+00 -1.8549181559766039e+00 -2.1645852195331444e-01 4.2158286586678182e+00 2.0602724415890474e+00 7.0678408493188251e-03 1.4016502327986597e+00 3.5540810858561738e+00 4.1349439146779121e-01 -1.7255256480532994e+00 -3.4025727424201033e+00 2.5184511848552433e-02 -1.5555476400576611e+00 -4.6257374168165244e+00 1.8703419451566346e-02 1.8306692241154257e+00 4.2783604821534906e+00 3.0327928017432376e-01 1.6601165819470731e+00 4.5160971888880859e+00 -1.4567459410259628e-03 -1.8124637748006855e+00 -4.1950473196397526e+00 -4.2676258478723833e-01 -1.8591714175385592e+00 -6.3005753538054243e+00 -3.4683178222771488e-01 2.0602724415890470e+00 6.1753940757840580e+00 1.4389510013745088e-02 1.0360051724072984e-01 1.5382165825423430e-01 6.8408628221711421e-01 7.4284764070782347e-03 1.3133585891279753e-02 -7.2964797789095737e-01 9.3300412674866533e-03 1.9245701163748307e-02 -1.4384717644934759e+00 1.9627294281001981e-01 3.0835130397645621e-01 1.4119439224570693e+00 4.5062413410363825e-03 8.9882584368086819e-03 1.4167244569883082e+00 -1.1052164502319006e-01 -1.6960561646331687e-01 -1.4327917195289586e+00 -2.1768441489247969e-01 -3.4832440127295544e-01 -2.8268670728233021e+00 7.0678408493188138e-03 1.4389510013745067e-02 2.9150238730742029e+00 528 529 530 576 577 578 588 589 590 540 541 542 531 532 533 579 580 581 591 592 593 543 544 545 3.5262733577375718e+00 1.0397399695890277e+00 1.8257638291430414e-01 -3.5896833208183332e+00 -1.3760633719477939e+00 -1.6694211205168372e-01 -1.8003705797444467e+00 -9.1563836618873251e-01 -5.8220639829663537e-02 1.9291367821295320e+00 1.2296256549738944e+00 2.2337506395938109e-01 1.8207031958453668e+00 9.2597232926327600e-01 9.5389167994155574e-02 -1.9793770883611166e+00 -1.0597327060471149e+00 -2.0440293236475229e-01 -1.0077775704489429e+00 -8.5415720308578647e-01 -1.5888473978152057e-01 1.1010952236603706e+00 1.0102536934432287e+00 8.7109809159779270e-02 1.0397399695890279e+00 7.9180471240072334e+00 8.1933421300811993e-01 -1.3530837967662868e+00 -7.6894815848044260e+00 -4.5606220398531716e-01 -9.1230463222468794e-01 -5.8614112444445938e+00 -2.7451437489431879e-01 1.2116845696584071e+00 5.5730428603901405e+00 7.2757871310225064e-01 9.2466711240525812e-01 5.7944807256450064e+00 4.3256067084947902e-01 -1.3444145971850912e+00 -5.5664182775451927e+00 -7.5875243918890667e-01 -8.5640523218444542e-01 -4.7480234499781320e+00 -7.2637420580516454e-01 1.2901166067078214e+00 4.5797638467299633e+00 2.3622962691385749e-01 1.8257638291430414e-01 8.1933421300812004e-01 3.4377810039259433e+00 -1.5513522577428396e-01 -4.2456890902958899e-01 -3.2181500004271686e+00 -1.2223210849370555e-01 -5.6847271349460238e-01 -1.6222816955813568e+00 2.1976953886224407e-01 7.2828853511780345e-01 1.7228240524293643e+00 8.5706857015536653e-02 3.9056130174808967e-01 1.6221222612448187e+00 -2.5172785037614526e-01 -7.4078020741111927e-01 -1.7778650208552740e+00 -1.5789543087550384e-01 -7.2003253472807460e-01 -9.5460886964893610e-01 1.9893783672755422e-01 5.1567031478937209e-01 7.9017826891260912e-01 -3.5896833208183332e+00 -1.3530837967662868e+00 -1.5513522577428396e-01 3.8816486039502895e+00 1.6676126573889603e+00 3.0271515468225492e-02 1.9468227379206522e+00 1.2445912081099788e+00 2.4372505170662449e-02 -2.2074166089939236e+00 -1.5226101505904333e+00 -2.1057476608392994e-01 -1.9821714404145561e+00 -1.3776401228981201e+00 -1.4590569453891958e-02 2.2001781799169029e+00 1.4811182835345467e+00 1.4482727641307230e-01 1.1296586537742941e+00 1.3023936291186400e+00 2.0202972145156931e-01 -1.3790368053353279e+00 -1.4423817078972856e+00 -2.1200457191423591e-02 -1.3760633719477937e+00 -7.6894815848044260e+00 -4.2456890902958910e-01 1.6676126573889598e+00 7.5880032017076733e+00 8.2782463767724218e-02 1.2534954254443331e+00 5.7124936540302080e+00 7.8864180361394129e-02 -1.5256872129629504e+00 -5.4594754405522377e+00 -5.3700704589457082e-01 -1.0807957742701415e+00 -5.7025352300855330e+00 -3.9522984096164768e-02 1.4742305194719425e+00 5.4457153196950827e+00 3.7393871894481667e-01 1.0132966511920141e+00 4.6104663987818819e+00 5.1737723137061742e-01 -1.4260888943163672e+00 -4.5051863187726466e+00 -5.1863655424227592e-02 -1.6694211205168372e-01 -4.5606220398531716e-01 -3.2181500004271690e+00 3.0271515468225478e-02 8.2782463767724274e-02 3.2436298700121200e+00 2.2249407550520666e-02 7.1259048703741612e-02 1.6034686279070367e+00 -9.8892267213552085e-02 -2.4852340377364779e-01 -1.6204877215609907e+00 -9.5141875546123217e-03 -3.9684331437985818e-02 -1.6348832862475124e+00 1.5532719972144338e-01 4.0506304567832069e-01 1.6336163768316259e+00 8.5338277333034881e-02 2.2899479575780674e-01 8.1399372309270135e-01 -1.7837833253376331e-02 -4.3829414710642646e-02 -8.2118758960781257e-01 -1.8003705797444467e+00 -9.1230463222468805e-01 -1.2223210849370554e-01 1.9468227379206522e+00 1.2534954254443329e+00 2.2249407550520663e-02 3.4480870075230814e+00 1.0809505113708020e+00 2.4554674835244025e-02 -3.5655613645775448e+00 -1.3991308308135002e+00 -1.1352180998014576e-01 -1.0094561586279074e+00 -8.7676249492601244e-01 -1.0288225645118259e-02 1.1288925745946254e+00 1.0139684652261520e+00 1.1794026878774450e-01 1.8269942608209033e+00 9.5252319062009760e-01 9.4279053983949521e-02 -1.9754084779093641e+00 -1.1127396346971838e+00 -1.2981261038489126e-02 -9.1563836618873251e-01 -5.8614112444445938e+00 -5.6847271349460249e-01 1.2445912081099788e+00 5.7124936540302080e+00 7.1259048703741626e-02 1.0809505113708020e+00 8.0573680110652521e+00 1.0281097407888051e-01 -1.3958278739541492e+00 -7.7506687873163065e+00 -4.6894898032385418e-01 -8.7035293082003695e-01 -4.8765311257486639e+00 -5.1745812394904583e-02 1.3079496581188832e+00 4.6060994791828165e+00 5.3994446909986749e-01 9.5035449005912565e-01 5.9044647101761516e+00 4.2537259239389630e-01 -1.4020266966958745e+00 -5.7918146969448632e+00 -5.0219578063024677e-02 -5.8220639829663537e-02 -2.7451437489431885e-01 -1.6222816955813568e+00 2.4372505170662452e-02 7.8864180361394157e-02 1.6034686279070367e+00 2.4554674835244022e-02 1.0281097407888053e-01 3.2094456855767359e+00 -1.1447631493987492e-01 -4.7318736668450939e-01 -3.1881035952219654e+00 -1.1786334471326763e-02 -5.9094020258010062e-02 -8.2194524707446870e-01 5.8688026449646942e-02 2.4738557082512638e-01 8.1536548752302029e-01 9.4686894550869150e-02 4.2980122421426992e-01 1.6244321592576441e+00 -1.7818811765557406e-02 -5.2066187642832544e-02 -1.6203814223866462e+00 1.9291367821295320e+00 1.2116845696584071e+00 2.1976953886224412e-01 -2.2074166089939236e+00 -1.5256872129629504e+00 -9.8892267213552071e-02 -3.5655613645775444e+00 -1.3958278739541488e+00 -1.1447631493987495e-01 3.9074799929619504e+00 1.6729351833081876e+00 3.0993673145733652e-01 1.1014434958063553e+00 1.3077579635841627e+00 5.6091755487313488e-02 -1.3769049339217669e+00 -1.4038780143564866e+00 -2.7009066427144457e-01 -1.9751487808926458e+00 -1.3803952833991500e+00 -2.6006892108128199e-01 2.1869714174880448e+00 1.5134106681219786e+00 1.5773014169925939e-01 1.2296256549738944e+00 5.5730428603901405e+00 7.2828853511780345e-01 -1.5226101505904333e+00 -5.4594754405522377e+00 -2.4852340377364776e-01 -1.3991308308135004e+00 -7.7506687873163065e+00 -4.7318736668450945e-01 1.6729351833081876e+00 7.5813251767758549e+00 7.9618194480883075e-01 1.0071346600682562e+00 4.5756454828809172e+00 2.3947157269865560e-01 -1.4085631098172426e+00 -4.3831962131983886e+00 -6.8763144590079806e-01 -1.0874566468904547e+00 -5.6546925984843890e+00 -7.6479509540799606e-01 1.5080652397612950e+00 5.5180195195044099e+00 4.1019525914166138e-01 2.2337506395938109e-01 7.2757871310225064e-01 1.7228240524293643e+00 -2.1057476608392994e-01 -5.3700704589457082e-01 -1.6204877215609907e+00 -1.1352180998014573e-01 -4.6894898032385418e-01 -3.1881035952219650e+00 3.0993673145733652e-01 7.9618194480883075e-01 3.4067338716047617e+00 1.1624140229009179e-01 5.3884939848610391e-01 7.8872857355655857e-01 -2.6877541970158875e-01 -6.8201212543134981e-01 -9.5319906320503378e-01 -2.0795662636631776e-01 -7.7197547857939153e-01 -1.7680255531884430e+00 1.5127542442517333e-01 3.9733357383198120e-01 1.6115294355857475e+00 1.8207031958453670e+00 9.2466711240525812e-01 8.5706857015536667e-02 -1.9821714404145563e+00 -1.0807957742701415e+00 -9.5141875546123147e-03 -1.0094561586279072e+00 -8.7035293082003706e-01 -1.1786334471326761e-02 1.1014434958063553e+00 1.0071346600682562e+00 1.1624140229009181e-01 3.6124499901728950e+00 1.0588812456048335e+00 2.2508944253861227e-02 -3.6707010783517635e+00 -1.3876698430489736e+00 -1.0573240465635210e-01 -1.8447453209856259e+00 -9.0798652583094164e-01 -1.2170637912851352e-01 1.9724773165552365e+00 1.2561220558917456e+00 2.4282102251314990e-02 9.2597232926327600e-01 5.7944807256450064e+00 3.9056130174808967e-01 -1.3776401228981201e+00 -5.7025352300855330e+00 -3.9684331437985818e-02 -8.7676249492601244e-01 -4.8765311257486639e+00 -5.9094020258010062e-02 1.3077579635841627e+00 4.5756454828809163e+00 5.3884939848610391e-01 1.0588812456048335e+00 8.1516828083801265e+00 9.4006368551548855e-02 -1.3449603532038514e+00 -7.7779957386943330e+00 -4.3705987729753804e-01 -9.1280883294851956e-01 -5.9039003940348413e+00 -5.6834873644022033e-01 1.2195602655242341e+00 5.7391534716573211e+00 8.0769896648011513e-02 9.5389167994155574e-02 4.3256067084947908e-01 1.6221222612448187e+00 -1.4590569453891951e-02 -3.9522984096164782e-02 -1.6348832862475124e+00 -1.0288225645118259e-02 -5.1745812394904597e-02 -8.2194524707446881e-01 5.6091755487313488e-02 2.3947157269865560e-01 7.8872857355655857e-01 2.2508944253861227e-02 9.4006368551548855e-02 3.3797253867388624e+00 -1.1402142937765788e-01 -4.7859634898387760e-01 -3.3019321811560549e+00 -5.6487473106524348e-02 -2.6907438470937672e-01 -1.6669242746217821e+00 2.1397829847862180e-02 7.2900918084640220e-02 1.6351087675595790e+00 -1.9793770883611170e+00 -1.3444145971850909e+00 -2.5172785037614531e-01 2.2001781799169029e+00 1.4742305194719427e+00 1.5532719972144338e-01 1.1288925745946254e+00 1.3079496581188830e+00 5.8688026449646942e-02 -1.3769049339217669e+00 -1.4085631098172424e+00 -2.6877541970158875e-01 -3.6707010783517631e+00 -1.3449603532038517e+00 -1.1402142937765788e-01 3.9567175946700712e+00 1.6322111811600883e+00 3.0247382463301320e-01 1.9867207270225964e+00 1.2066186825412781e+00 2.1983056909693538e-01 -2.2455259755695494e+00 -1.5230719810860069e+00 -1.0179492044564703e-01 -1.0597327060471149e+00 -5.5664182775451927e+00 -7.4078020741111927e-01 1.4811182835345467e+00 5.4457153196950818e+00 4.0506304567832069e-01 1.0139684652261520e+00 4.6060994791828165e+00 2.4738557082512638e-01 -1.4038780143564868e+00 -4.3831962131983886e+00 -6.8201212543134981e-01 -1.3876698430489738e+00 -7.7779957386943330e+00 -4.7859634898387771e-01 1.6322111811600883e+00 7.5472561664450089e+00 7.7768982572522749e-01 1.2334219049140951e+00 5.6284883615113142e+00 7.2940985193138774e-01 -1.5094392713823093e+00 -5.4999490973963034e+00 -2.5815961233371532e-01 -2.0440293236475232e-01 -7.5875243918890667e-01 -1.7778650208552744e+00 1.4482727641307230e-01 3.7393871894481656e-01 1.6336163768316256e+00 1.1794026878774450e-01 5.3994446909986760e-01 8.1536548752302029e-01 -2.7009066427144457e-01 -6.8763144590079806e-01 -9.5319906320503378e-01 -1.0573240465635210e-01 -4.3705987729753804e-01 -3.3019321811560549e+00 3.0247382463301331e-01 7.7768982572522738e-01 3.4693074355675160e+00 2.2387821073159234e-01 7.2803120774482277e-01 1.7807488841586430e+00 -2.0889357927287397e-01 -5.3616045912749133e-01 -1.6660419188644431e+00 -1.0077775704489429e+00 -8.5640523218444542e-01 -1.5789543087550381e-01 1.1296586537742941e+00 1.0132966511920141e+00 8.5338277333034854e-02 1.8269942608209035e+00 9.5035449005912542e-01 9.4686894550869163e-02 -1.9751487808926458e+00 -1.0874566468904547e+00 -2.0795662636631773e-01 -1.8447453209856257e+00 -9.1280883294851956e-01 -5.6487473106524348e-02 1.9867207270225962e+00 1.2334219049140949e+00 2.2387821073159234e-01 3.5433531292128384e+00 1.0609660171607926e+00 1.8701037687156663e-01 -3.6590550985034183e+00 -1.4013683513026076e+00 -1.6857422913871706e-01 -8.5415720308578647e-01 -4.7480234499781311e+00 -7.2003253472807460e-01 1.3023936291186400e+00 4.6104663987818819e+00 2.2899479575780674e-01 9.5252319062009760e-01 5.9044647101761516e+00 4.2980122421426992e-01 -1.3803952833991500e+00 -5.6546925984843890e+00 -7.7197547857939164e-01 -9.0798652583094164e-01 -5.9039003940348413e+00 -2.6907438470937672e-01 1.2066186825412781e+00 5.6284883615113142e+00 7.2803120774482255e-01 1.0609660171607924e+00 8.0251774404170639e+00 8.3901538055469405e-01 -1.3799625071249333e+00 -7.8619804683890493e+00 -4.6476021025475023e-01 -1.5888473978152057e-01 -7.2637420580516454e-01 -9.5460886964893610e-01 2.0202972145156925e-01 5.1737723137061742e-01 8.1399372309270135e-01 9.4279053983949521e-02 4.2537259239389635e-01 1.6244321592576443e+00 -2.6006892108128199e-01 -7.6479509540799606e-01 -1.7680255531884428e+00 -1.2170637912851348e-01 -5.6834873644022021e-01 -1.6669242746217823e+00 2.1983056909693538e-01 7.2940985193138774e-01 1.7807488841586432e+00 1.8701037687156663e-01 8.3901538055469382e-01 3.4542209178049244e+00 -1.6248968141270528e-01 -4.5165701859721441e-01 -3.2838369868547508e+00 1.1010952236603706e+00 1.2901166067078214e+00 1.9893783672755427e-01 -1.3790368053353279e+00 -1.4260888943163672e+00 -1.7837833253376328e-02 -1.9754084779093641e+00 -1.4020266966958745e+00 -1.7818811765557413e-02 2.1869714174880444e+00 1.5080652397612950e+00 1.5127542442517333e-01 1.9724773165552363e+00 1.2195602655242341e+00 2.1397829847862194e-02 -2.2455259755695494e+00 -1.5094392713823093e+00 -2.0889357927287397e-01 -3.6590550985034183e+00 -1.3799625071249333e+00 -1.6248968141270531e-01 3.9984823996140091e+00 1.6997752575261340e+00 3.5428814703923221e-02 1.0102536934432287e+00 4.5797638467299633e+00 5.1567031478937198e-01 -1.4423817078972854e+00 -4.5051863187726466e+00 -4.3829414710642646e-02 -1.1127396346971836e+00 -5.7918146969448632e+00 -5.2066187642832530e-02 1.5134106681219786e+00 5.5180195195044099e+00 3.9733357383198120e-01 1.2561220558917456e+00 5.7391534716573211e+00 7.2900918084640248e-02 -1.5230719810860072e+00 -5.4999490973963034e+00 -5.3616045912749133e-01 -1.4013683513026074e+00 -7.8619804683890493e+00 -4.5165701859721441e-01 1.6997752575261338e+00 7.8219937436111691e+00 9.7808273372187365e-02 8.7109809159779270e-02 2.3622962691385752e-01 7.9017826891260912e-01 -2.1200457191423605e-02 -5.1863655424227592e-02 -8.2118758960781257e-01 -1.2981261038489126e-02 -5.0219578063024663e-02 -1.6203814223866464e+00 1.5773014169925936e-01 4.1019525914166133e-01 1.6115294355857470e+00 2.4282102251314996e-02 8.0769896648011499e-02 1.6351087675595790e+00 -1.0179492044564703e-01 -2.5815961233371532e-01 -1.6660419188644429e+00 -1.6857422913871709e-01 -4.6476021025475012e-01 -3.2838369868547512e+00 3.5428814703923228e-02 9.7808273372187352e-02 3.3546314456557171e+00 576 577 578 624 625 626 636 637 638 588 589 590 579 580 581 627 628 629 639 640 641 591 592 593 3.3702596553244923e+00 9.6209096294786545e-01 1.7447728672715873e-01 -3.4249481876341812e+00 -1.3083620735159416e+00 -1.6284087669943900e-01 -1.7268885778866647e+00 -8.4611809921537062e-01 -5.2295266303963077e-02 1.8507894585995703e+00 1.1690437914114602e+00 2.1937883443896794e-01 1.6922632044475523e+00 8.5342103862670471e-01 8.7480758586318749e-02 -1.8515150920600820e+00 -9.8859504568647183e-01 -1.9775291702642439e-01 -9.4096217266447812e-01 -7.8576842810640324e-01 -1.5105058671153507e-01 1.0310017118737920e+00 9.4428785353815736e-01 8.2602766988916138e-02 9.6209096294786545e-01 7.5401837441541177e+00 8.0272790652056414e-01 -1.2738593114469103e+00 -7.3036266577885076e+00 -4.3238553273649050e-01 -8.4075051275493795e-01 -5.5902878786412193e+00 -2.5258378362613099e-01 1.1375184221084278e+00 5.2912753882607939e+00 7.0941354984618143e-01 8.4699961699694293e-01 5.4578494016286374e+00 4.0853145088825454e-01 -1.2785747446431588e+00 -5.2212971741353753e+00 -7.3942549692132020e-01 -7.8217553436465670e-01 -4.4834821949654984e+00 -7.0843187234567462e-01 1.2287511011564298e+00 4.3093853714870516e+00 2.1215377837461619e-01 1.7447728672715876e-01 8.0272790652056403e-01 3.3063795951050929e+00 -1.4946421693258749e-01 -3.9955729184681477e-01 -3.0725285933378994e+00 -1.1467999212191667e-01 -5.4967303508195064e-01 -1.5647790704902740e+00 2.1391284885987649e-01 7.1244529908641563e-01 1.6689620639350347e+00 7.8244809784614316e-02 3.6949860414893498e-01 1.5099268132493602e+00 -2.4911154973098390e-01 -7.2525009719984224e-01 -1.6740572055697847e+00 -1.4996635268186143e-01 -7.0652447082891989e-01 -9.1012341879553982e-01 1.9658716609570026e-01 4.9633308520161301e-01 7.3621981590401098e-01 -3.4249481876341812e+00 -1.2738593114469099e+00 -1.4946421693258749e-01 3.7284050090018814e+00 1.5966301768155733e+00 1.8767072208750398e-02 1.8692413181202869e+00 1.1727517777799867e+00 1.6227839630642043e-02 -2.1357184011260273e+00 -1.4562670465551801e+00 -2.0529686700314206e-01 -1.8531234293128025e+00 -1.3091295850728553e+00 -5.7613144308388429e-03 2.0771927480493750e+00 1.4108105970621287e+00 1.3868397457449735e-01 1.0569870670084323e+00 1.2365832585404100e+00 1.9868666343160674e-01 -1.3180361241069651e+00 -1.3775198671231526e+00 -1.1843151478928235e-02 -1.3083620735159420e+00 -7.3036266577885076e+00 -3.9955729184681488e-01 1.5966301768155733e+00 7.2062330377583637e+00 5.2514033456149155e-02 1.1944584887629308e+00 5.4370068861845526e+00 5.1920855743037987e-02 -1.4616205052595257e+00 -5.1767141973266346e+00 -5.1491220510219005e-01 -1.0068755610289577e+00 -5.3675511287082989e+00 -1.3135347451983786e-02 1.4095108105191985e+00 5.0995320059783795e+00 3.5345910247642376e-01 9.4326235476965226e-01 4.3423730338174780e+00 4.9706140957178407e-01 -1.3670036910629315e+00 -4.2372529799153336e+00 -2.7350556846406637e-02 -1.6284087669943900e-01 -4.3238553273649050e-01 -3.0725285933378998e+00 1.8767072208750422e-02 5.2514033456149224e-02 3.1077577960979199e+00 1.4044624389463705e-02 4.3015717910525345e-02 1.5474870040519815e+00 -9.1102589197165837e-02 -2.2525450230054223e-01 -1.5601989788395385e+00 -7.4097733725363407e-04 -7.6343165277120897e-03 -1.5297575856618166e+00 1.4848308665277110e-01 3.8089828553553307e-01 1.5213939310476017e+00 8.0394217433744239e-02 2.0414053140802421e-01 7.6003703518697774e-01 -7.0045574508710001e-03 -1.5294216745486974e-02 -7.7419060854522592e-01 -1.7268885778866647e+00 -8.4075051275493795e-01 -1.1467999212191667e-01 1.8692413181202872e+00 1.1944584887629306e+00 1.4044624389463699e-02 3.3522784266256020e+00 1.0074000537788244e+00 1.7898575701446484e-02 -3.4603998938521254e+00 -1.3370406404296344e+00 -1.0383745270583665e-01 -9.4360531976450246e-01 -8.0838105794649229e-01 -4.3145464320760961e-03 1.0592062968531775e+00 9.4847862837269303e-01 1.1000088059504780e-01 1.7221445569254694e+00 8.7963385385415438e-01 8.7119168190822008e-02 -1.8719768070212444e+00 -1.0437988136375376e+00 -6.2312576169505900e-03 -8.4611809921537073e-01 -5.5902878786412193e+00 -5.4967303508195076e-01 1.1727517777799867e+00 5.4370068861845526e+00 4.3015717910525345e-02 1.0074000537788244e+00 7.7577346486376291e+00 7.3375300064387958e-02 -1.3187994162588765e+00 -7.4343467167125947e+00 -4.4217008156961085e-01 -7.9801203799631004e-01 -4.6196131608798172e+00 -2.5159995821959741e-02 1.2478360239077011e+00 4.3352088625442571e+00 5.2311138471856311e-01 8.7269732114968646e-01 5.5925428789674267e+00 4.0182299253005460e-01 -1.3377556231456433e+00 -5.4782455201002360e+00 -2.4322282750009794e-02 -5.2295266303963077e-02 -2.5258378362613093e-01 -1.5647790704902740e+00 1.6227839630642046e-02 5.1920855743038001e-02 1.5474870040519815e+00 1.7898575701446491e-02 7.3375300064387985e-02 3.1342143272125553e+00 -1.0619515717129199e-01 -4.5600238570271395e-01 -3.1013214975049577e+00 -5.4320163944419951e-03 -3.0928063058843807e-02 -7.7588087007409112e-01 4.9561808444032379e-02 2.2542214622784393e-01 7.6175816173100619e-01 8.7840938973725649e-02 4.0977098783751825e-01 1.5363421057136548e+00 -7.6067228801495563e-03 -2.0975057485099428e-02 -1.5378201606398756e+00 1.8507894585995703e+00 1.1375184221084278e+00 2.1391284885987649e-01 -2.1357184011260273e+00 -1.4616205052595257e+00 -9.1102589197165837e-02 -3.4603998938521250e+00 -1.3187994162588763e+00 -1.0619515717129199e-01 3.8123802636586759e+00 1.6032944571766445e+00 3.0741080518125119e-01 1.0285552419001864e+00 1.2427082217416199e+00 4.6109234756482410e-02 -1.3147084824905484e+00 -1.3372661453875243e+00 -2.6740243612233422e-01 -1.8667927815100767e+00 -1.3093036997519423e+00 -2.5465600641630254e-01 2.0858945948203456e+00 1.4434686656311766e+00 1.5192330010948440e-01 1.1690437914114604e+00 5.2912753882607948e+00 7.1244529908641574e-01 -1.4562670465551801e+00 -5.1767141973266337e+00 -2.2525450230054217e-01 -1.3370406404296342e+00 -7.4343467167125947e+00 -4.5600238570271379e-01 1.6032944571766443e+00 7.2618559638981237e+00 7.7704037529893710e-01 9.3736261229364803e-01 4.3069921232485573e+00 2.1587420745258040e-01 -1.3468359311103961e+00 -4.1085876196169009e+00 -6.6929667803948345e-01 -1.0128586460090061e+00 -5.3347583026950298e+00 -7.4330782941295959e-01 1.4433014032224660e+00 5.1942833609436825e+00 3.8850151361776586e-01 2.1937883443896797e-01 7.0941354984618155e-01 1.6689620639350347e+00 -2.0529686700314204e-01 -5.1491220510219005e-01 -1.5601989788395385e+00 -1.0383745270583668e-01 -4.4217008156961080e-01 -3.1013214975049572e+00 3.0741080518125125e-01 7.7704037529893699e-01 3.3306309621905061e+00 1.0696958860093665e-01 5.1981285770200458e-01 7.3450998543962354e-01 -2.6719906205474442e-01 -6.6407320507475676e-01 -9.0763698910372459e-01 -2.0166134655356113e-01 -7.5667991393043821e-01 -1.6861308683518232e+00 1.4423550009612882e-01 3.7156862282987257e-01 1.5211853222348797e+00 1.6922632044475523e+00 8.4699961699694271e-01 7.8244809784614316e-02 -1.8531234293128025e+00 -1.0068755610289575e+00 -7.4097733725363808e-04 -9.4360531976450246e-01 -7.9801203799631004e-01 -5.4320163944419943e-03 1.0285552419001864e+00 9.3736261229364781e-01 1.0696958860093665e-01 3.3069032710291273e+00 9.6615296060555433e-01 1.4498157347700925e-02 -3.3560677417141238e+00 -1.2954009397235373e+00 -9.5208966375426335e-02 -1.6882856028376272e+00 -8.2799535521920486e-01 -1.1370908435181488e-01 1.8133603762521893e+00 1.1777687040718650e+00 1.5378488725685063e-02 8.5342103862670471e-01 5.4578494016286374e+00 3.6949860414893498e-01 -1.3091295850728555e+00 -5.3675511287082980e+00 -7.6343165277121035e-03 -8.0838105794649229e-01 -4.6196131608798172e+00 -3.0928063058843810e-02 1.2427082217416199e+00 4.3069921232485555e+00 5.1981285770200458e-01 9.6615296060555445e-01 7.5943208245135452e+00 5.9527776814202266e-02 -1.2666389599924119e+00 -7.2030699427001794e+00 -4.1440900776517881e-01 -8.3167663507248613e-01 -5.5312173141901608e+00 -5.4816564541848201e-01 1.1535440171103684e+00 5.3622891970877173e+00 5.2297794105075179e-02 8.7480758586318749e-02 4.0853145088825465e-01 1.5099268132493602e+00 -5.7613144308388429e-03 -1.3135347451983784e-02 -1.5297575856618166e+00 -4.3145464320760944e-03 -2.5159995821959741e-02 -7.7588087007409112e-01 4.6109234756482417e-02 2.1587420745258040e-01 7.3450998543962354e-01 1.4498157347700923e-02 5.9527776814202252e-02 3.1002161061785269e+00 -1.0235061532880300e-01 -4.4756997993068087e-01 -3.0102783507545037e+00 -4.8348606016419569e-02 -2.4109890098337586e-01 -1.5289846416608848e+00 1.2686931517635461e-02 4.3030789032962979e-02 1.5002485432837842e+00 -1.8515150920600820e+00 -1.2785747446431588e+00 -2.4911154973098390e-01 2.0771927480493750e+00 1.4095108105191987e+00 1.4848308665277107e-01 1.0592062968531777e+00 1.2478360239077011e+00 4.9561808444032386e-02 -1.3147084824905484e+00 -1.3468359311103959e+00 -2.6719906205474442e-01 -3.3560677417141247e+00 -1.2666389599924117e+00 -1.0235061532880302e-01 3.6559927809408035e+00 1.5492274693967851e+00 2.9918186997695767e-01 1.8257895350794968e+00 1.1395559939930298e+00 2.1472674443360323e-01 -2.0958900446580979e+00 -1.4540806620707480e+00 -9.3292282392833173e-02 -9.8859504568647183e-01 -5.2212971741353753e+00 -7.2525009719984224e-01 1.4108105970621287e+00 5.0995320059783795e+00 3.8089828553553301e-01 9.4847862837269303e-01 4.3352088625442571e+00 2.2542214622784393e-01 -1.3372661453875243e+00 -4.1085876196169009e+00 -6.6407320507475676e-01 -1.2954009397235375e+00 -7.2030699427001794e+00 -4.4756997993068082e-01 1.5492274693967851e+00 6.9691772522927078e+00 7.5325953348676866e-01 1.1533466151200273e+00 5.2432851423164522e+00 7.0857300961030534e-01 -1.4406011791541022e+00 -5.1142485266793400e+00 -2.3125969265517132e-01 -1.9775291702642439e-01 -7.3942549692132020e-01 -1.6740572055697847e+00 1.3868397457449735e-01 3.5345910247642365e-01 1.5213939310476017e+00 1.1000088059504778e-01 5.2311138471856300e-01 7.6175816173100619e-01 -2.6740243612233416e-01 -6.6929667803948345e-01 -9.0763698910372459e-01 -9.5208966375426307e-02 -4.1440900776517881e-01 -3.0102783507545041e+00 2.9918186997695767e-01 7.5325953348676877e-01 3.1893299852155383e+00 2.1732380420084929e-01 7.0942378049359445e-01 1.6464663683351128e+00 -2.0482620982316757e-01 -5.1612261844936769e-01 -1.5269759009012460e+00 -9.4096217266447812e-01 -7.8217553436465670e-01 -1.4996635268186140e-01 1.0569870670084323e+00 9.4326235476965226e-01 8.0394217433744239e-02 1.7221445569254694e+00 8.7269732114968646e-01 8.7840938973725649e-02 -1.8667927815100764e+00 -1.0128586460090061e+00 -2.0166134655356113e-01 -1.6882856028376272e+00 -8.3167663507248613e-01 -4.8348606016419583e-02 1.8257895350794968e+00 1.1533466151200273e+00 2.1732380420084929e-01 3.2678837111584418e+00 9.6797294514475629e-01 1.7640415730227230e-01 -3.3767643131596579e+00 -1.3105684207379735e+00 -1.6198681265874942e-01 -7.8576842810640324e-01 -4.4834821949654993e+00 -7.0652447082891989e-01 1.2365832585404100e+00 4.3423730338174789e+00 2.0414053140802421e-01 8.7963385385415438e-01 5.5925428789674267e+00 4.0977098783751825e-01 -1.3093036997519423e+00 -5.3347583026950289e+00 -7.5667991393043821e-01 -8.2799535521920486e-01 -5.5312173141901608e+00 -2.4109890098337586e-01 1.1395559939930295e+00 5.2432851423164522e+00 7.0942378049359445e-01 9.6797294514475629e-01 7.4946832851565732e+00 8.1630745966249996e-01 -1.3006785684548019e+00 -7.3234265284072411e+00 -4.3533947365890302e-01 -1.5105058671153510e-01 -7.0843187234567462e-01 -9.1012341879554004e-01 1.9868666343160674e-01 4.9706140957178413e-01 7.6003703518697774e-01 8.7119168190821980e-02 4.0182299253005455e-01 1.5363421057136548e+00 -2.5465600641630248e-01 -7.4330782941295948e-01 -1.6861308683518232e+00 -1.1370908435181491e-01 -5.4816564541848201e-01 -1.5289846416608848e+00 2.1472674443360329e-01 7.0857300961030523e-01 1.6464663683351128e+00 1.7640415730227230e-01 8.1630745966249996e-01 3.2069141661402449e+00 -1.5752105587865214e-01 -4.2385952419752804e-01 -3.0245207465677426e+00 1.0310017118737920e+00 1.2287511011564298e+00 1.9658716609570026e-01 -1.3180361241069654e+00 -1.3670036910629317e+00 -7.0045574508710053e-03 -1.8719768070212444e+00 -1.3377556231456436e+00 -7.6067228801495572e-03 2.0858945948203456e+00 1.4433014032224665e+00 1.4423550009612879e-01 1.8133603762521897e+00 1.1535440171103684e+00 1.2686931517635456e-02 -2.0958900446580975e+00 -1.4406011791541020e+00 -2.0482620982316760e-01 -3.3767643131596579e+00 -1.3006785684548021e+00 -1.5752105587865214e-01 3.7324106059996391e+00 1.6204425403282157e+00 2.3448948323375855e-02 9.4428785353815736e-01 4.3093853714870516e+00 4.9633308520161301e-01 -1.3775198671231526e+00 -4.2372529799153336e+00 -1.5294216745486984e-02 -1.0437988136375376e+00 -5.4782455201002360e+00 -2.0975057485099445e-02 1.4434686656311766e+00 5.1942833609436834e+00 3.7156862282987269e-01 1.1777687040718650e+00 5.3622891970877173e+00 4.3030789032962986e-02 -1.4540806620707480e+00 -5.1142485266793418e+00 -5.1612261844936769e-01 -1.3105684207379735e+00 -7.3234265284072411e+00 -4.2385952419752798e-01 1.6204425403282152e+00 7.2872156255837002e+00 6.5318919813033643e-02 8.2602766988916138e-02 2.1215377837461616e-01 7.3621981590401098e-01 -1.1843151478928239e-02 -2.7350556846406630e-02 -7.7419060854522592e-01 -6.2312576169505892e-03 -2.4322282750009808e-02 -1.5378201606398756e+00 1.5192330010948438e-01 3.8850151361776586e-01 1.5211853222348795e+00 1.5378488725685063e-02 5.2297794105075165e-02 1.5002485432837844e+00 -9.3292282392833159e-02 -2.3125969265517132e-01 -1.5269759009012460e+00 -1.6198681265874942e-01 -4.3533947365890308e-01 -3.0245207465677426e+00 2.3448948323375848e-02 6.5318919813033657e-02 3.1058537352314151e+00 540 541 542 588 589 590 600 601 602 552 553 554 543 544 545 591 592 593 603 604 605 555 556 557 3.3437593424066523e+00 1.1657549012044915e-01 1.8614831712628087e-02 -3.2713584912596820e+00 -4.9917095810419315e-01 -7.7780007409981158e-02 -1.6149717527166232e+00 -6.4092267203336620e-02 -3.4126961818323311e-03 1.6094141223792082e+00 4.4457574014113527e-01 7.8625133647943046e-02 1.6475104852170317e+00 9.5883215487555642e-02 9.8262283406574617e-03 -1.6839637610745040e+00 -2.8563663553048874e-01 -5.3375703471871906e-02 -8.2829927117086832e-01 -6.8019353511560895e-02 -1.3300951140067180e-02 7.9790932621878563e-01 2.5988476860043935e-01 4.0803164502523956e-02 1.1657549012044915e-01 8.2848546349841374e+00 8.5903296303410481e-01 -4.8183014831619975e-01 -8.1896784667552538e+00 -5.0069380066372227e-01 -6.5184733717187596e-02 -6.1079425032854457e+00 -2.9122763307727290e-01 4.2888526157771167e-01 5.9496470219334237e+00 7.7296731487915138e-01 9.5311019786237516e-02 6.0966072736251391e+00 4.5912834011010495e-01 -5.8000985811130223e-01 -5.9863322684796181e+00 -8.0360010105702462e-01 -6.8448458295610193e-02 -4.9657811928444637e+00 -7.5549185182578071e-01 5.5470142695590208e-01 4.9186255008220812e+00 2.5988476860043946e-01 1.8614831712628087e-02 8.5903296303410492e-01 3.4900808156011918e+00 -7.3263369839234177e-02 -4.7223669397702150e-01 -3.2709150913455658e+00 -9.2184996011835437e-03 -5.9296868402694991e-01 -1.6343455914004683e+00 7.4932151711156636e-02 7.7030545574854692e-01 1.7362412967158807e+00 8.9094990981101758e-03 4.1820635089920921e-01 1.6551473488246513e+00 -1.0538997465370716e-01 -7.9223615892266941e-01 -1.8109501602749019e+00 -1.3173842563771436e-02 -7.4480465971112098e-01 -9.6316794433957220e-01 9.8589204136001529e-02 5.5470142695590086e-01 7.9790932621878563e-01 -3.2713584912596820e+00 -4.8183014831619958e-01 -7.3263369839234149e-02 3.4423414083606940e+00 8.6341474364501514e-01 1.8422812993338606e-02 1.6211763896932485e+00 4.4241797268407140e-01 9.4831787742278139e-03 -1.7656381296738766e+00 -8.0691298599736416e-01 -1.0750817275334998e-01 -1.6828553052620836e+00 -5.9298710886896155e-01 -8.9659664475508372e-03 1.7960889588642404e+00 7.7083461227232253e-01 7.4428566943943550e-02 8.2341311361703040e-01 5.6055476640689628e-01 1.0070390146869213e-01 -9.6316794433957276e-01 -7.5549185182577983e-01 -1.3300951140067121e-02 -4.9917095810419310e-01 -8.1896784667552520e+00 -4.7223669397702150e-01 8.6341474364501503e-01 8.2182523008513719e+00 1.1394708000947006e-01 4.4870382303094430e-01 6.0952716489401180e+00 9.5606459747665448e-02 -8.0552519816495405e-01 -5.9673665906173063e+00 -5.8614347666406785e-01 -2.9049165163415969e-01 -6.1272670748316411e+00 -6.1810029460864530e-02 7.6724879573110738e-01 5.9848194153399765e+00 4.1810124744948218e-01 2.6062510520736154e-01 4.9517499599171986e+00 5.6055476640689683e-01 -7.4480465971112264e-01 -4.9657811928444637e+00 -6.8019353511560660e-02 -7.7780007409981158e-02 -5.0069380066372227e-01 -3.2709150913455658e+00 1.8422812993338613e-02 1.1394708000947006e-01 3.2935816113934031e+00 9.4580479291889851e-03 9.4981553973183683e-02 1.6128444616477240e+00 -5.3315509051430961e-02 -2.8518284339481803e-01 -1.6363743394253421e+00 -3.4008235369294209e-03 -6.3873965789734949e-02 -1.6633829123291712e+00 7.8949565444370318e-02 4.4864532895387038e-01 1.6691324276127899e+00 4.0839756195214939e-02 2.6062510520736060e-01 8.2341311361703007e-01 -1.3173842563771326e-02 -6.8448458295609485e-02 -8.2829927117086866e-01 -1.6149717527166230e+00 -6.5184733717187637e-02 -9.2184996011835454e-03 1.6211763896932485e+00 4.4870382303094430e-01 9.4580479291889851e-03 3.2026997738391296e+00 1.1677396902663359e-01 4.2281458957860738e-03 -3.1828054308834957e+00 -4.9813469173467878e-01 -2.1170572218840493e-02 -8.2770637382744794e-01 -7.0906957663037978e-02 -2.6549573020104240e-04 8.2310852364793397e-01 2.6436976438693427e-01 1.0897891132854462e-02 1.6128444616477315e+00 9.5606459747666725e-02 9.4831787742277740e-03 -1.6343455914004767e+00 -2.9122763307727445e-01 -3.4126961818322088e-03 -6.4092267203336606e-02 -6.1079425032854457e+00 -5.9296868402694980e-01 4.4241797268407140e-01 6.0952716489401180e+00 9.4981553973183655e-02 1.1677396902663355e-01 8.2872337276816470e+00 1.1677396902663217e-01 -4.9354702522282157e-01 -8.1158900710738102e+00 -4.9354702522281962e-01 -6.9222504502797572e-02 -5.0961053443895192e+00 -6.9222504502797905e-02 5.6565698527201658e-01 4.9501033964723398e+00 5.6565698527201647e-01 9.4981553973184890e-02 6.0952716489401277e+00 4.4241797268407157e-01 -5.9296868402695124e-01 -6.1079425032854564e+00 -6.4092267203336106e-02 -3.4126961818323311e-03 -2.9122763307727295e-01 -1.6343455914004683e+00 9.4831787742278156e-03 9.5606459747665434e-02 1.6128444616477240e+00 4.2281458957860738e-03 1.1677396902663223e-01 3.2026997738391296e+00 -2.1170572218840659e-02 -4.9813469173467773e-01 -3.1828054308834961e+00 -2.6549573020110296e-04 -7.0906957663037229e-02 -8.2770637382744816e-01 1.0897891132854470e-02 2.6436976438693327e-01 8.2310852364793385e-01 9.4580479291892471e-03 4.4870382303094408e-01 1.6211763896932556e+00 -9.2184996011835229e-03 -6.5184733717187068e-02 -1.6149717527166310e+00 1.6094141223792080e+00 4.2888526157771167e-01 7.4932151711156650e-02 -1.7656381296738766e+00 -8.0552519816495383e-01 -5.3315509051430961e-02 -3.1828054308834957e+00 -4.9354702522282168e-01 -2.1170572218840659e-02 3.4057114898744754e+00 8.5309020630877297e-01 1.5268257873584687e-01 7.9748797762787571e-01 5.6593878990963542e-01 1.0655634801801568e-02 -9.6403698661472625e-01 -7.3566587262342831e-01 -1.3490124487312627e-01 -1.6363743394253487e+00 -5.8614347666406941e-01 -1.0750817275335045e-01 1.7362412967158887e+00 7.7296731487915327e-01 7.8625133647943254e-02 4.4457574014113527e-01 5.9496470219334237e+00 7.7030545574854692e-01 -8.0691298599736438e-01 -5.9673665906173072e+00 -2.8518284339481798e-01 -4.9813469173467878e-01 -8.1158900710738102e+00 -4.9813469173467767e-01 8.5309020630877286e-01 8.0720617499469594e+00 8.5309020630877141e-01 2.6244405408240967e-01 4.9169139593223061e+00 2.6244405408241034e-01 -7.4018493515400308e-01 -4.8376465008276881e+00 -7.4018493515400319e-01 -2.8518284339481947e-01 -5.9673665906173152e+00 -8.0691298599736561e-01 7.7030545574854858e-01 5.9496470219334325e+00 4.4457574014113604e-01 7.8625133647943060e-02 7.7296731487915138e-01 1.7362412967158807e+00 -1.0750817275334999e-01 -5.8614347666406785e-01 -1.6363743394253421e+00 -2.1170572218840489e-02 -4.9354702522281979e-01 -3.1828054308834961e+00 1.5268257873584687e-01 8.5309020630877153e-01 3.4057114898744740e+00 1.0655634801801334e-02 5.6593878990963409e-01 7.9748797762787582e-01 -1.3490124487312602e-01 -7.3566587262342664e-01 -9.6403698661472592e-01 -5.3315509051431106e-02 -8.0552519816495227e-01 -1.7656381296738826e+00 7.4932151711156497e-02 4.2888526157770956e-01 1.6094141223792153e+00 1.6475104852170315e+00 9.5311019786237530e-02 8.9094990981101758e-03 -1.6828553052620836e+00 -2.9049165163415969e-01 -3.4008235369294231e-03 -8.2770637382744794e-01 -6.9222504502797572e-02 -2.6549573020110274e-04 7.9748797762787582e-01 2.6244405408240973e-01 1.0655634801801334e-02 3.4470304249058512e+00 1.1811692879695894e-01 4.4613788103328297e-03 -3.3732316451567073e+00 -5.1347615717788964e-01 -2.1220455336220492e-02 -1.6633829123291779e+00 -6.1810029460864634e-02 -8.9659664475507678e-03 1.6551473488246584e+00 4.5912834011010534e-01 9.8262283406574356e-03 9.5883215487555642e-02 6.0966072736251382e+00 4.1820635089920921e-01 -5.9298710886896155e-01 -6.1272670748316411e+00 -6.3873965789734949e-02 -7.0906957663037951e-02 -5.0961053443895201e+00 -7.0906957663037215e-02 5.6593878990963553e-01 4.9169139593223052e+00 5.6593878990963409e-01 1.1811692879695902e-01 8.5203382073232437e+00 1.1811692879695931e-01 -4.7037725277162440e-01 -8.2798272198430229e+00 -4.7037725277162401e-01 -6.3873965789735532e-02 -6.1272670748316509e+00 -5.9298710886896211e-01 4.1820635089920999e-01 6.0966072736251480e+00 9.5883215487555670e-02 9.8262283406574617e-03 4.5912834011010489e-01 1.6551473488246511e+00 -8.9659664475508355e-03 -6.1810029460864516e-02 -1.6633829123291712e+00 -2.6549573020104436e-04 -6.9222504502797932e-02 -8.2770637382744794e-01 1.0655634801801568e-02 2.6244405408241034e-01 7.9748797762787582e-01 4.4613788103328297e-03 1.1811692879695936e-01 3.4470304249058512e+00 -2.1220455336220828e-02 -5.1347615717788975e-01 -3.3732316451567073e+00 -3.4008235369294895e-03 -2.9049165163416069e-01 -1.6828553052620907e+00 8.9094990981103440e-03 9.5311019786238252e-02 1.6475104852170392e+00 -1.6839637610745040e+00 -5.8000985811130223e-01 -1.0538997465370717e-01 1.7960889588642404e+00 7.6724879573110749e-01 7.8949565444370318e-02 8.2310852364793397e-01 5.6565698527201647e-01 1.0897891132854470e-02 -9.6403698661472637e-01 -7.4018493515400308e-01 -1.3490124487312602e-01 -3.3732316451567073e+00 -4.7037725277162429e-01 -2.1220455336220825e-02 3.5438526429958745e+00 8.4316511864134847e-01 1.5061135481375745e-01 1.6691324276127972e+00 4.1810124744948213e-01 7.4428566943943869e-02 -1.8109501602749094e+00 -8.0360010105702484e-01 -5.3375703471872024e-02 -2.8563663553048874e-01 -5.9863322684796181e+00 -7.9223615892266941e-01 7.7083461227232242e-01 5.9848194153399765e+00 4.4864532895387038e-01 2.6436976438693427e-01 4.9501033964723398e+00 2.6436976438693321e-01 -7.3566587262342831e-01 -4.8376465008276881e+00 -7.3566587262342642e-01 -5.1347615717788975e-01 -8.2798272198430229e+00 -5.1347615717788975e-01 8.4316511864134835e-01 8.1703960304776562e+00 8.4316511864134791e-01 4.4864532895387244e-01 5.9848194153399863e+00 7.7083461227232331e-01 -7.9223615892267174e-01 -5.9863322684796278e+00 -2.8563663553048912e-01 -5.3375703471871913e-02 -8.0360010105702462e-01 -1.8109501602749016e+00 7.4428566943943536e-02 4.1810124744948224e-01 1.6691324276127899e+00 1.0897891132854458e-02 5.6565698527201647e-01 8.2310852364793385e-01 -1.3490124487312627e-01 -7.4018493515400330e-01 -9.6403698661472592e-01 -2.1220455336220488e-02 -4.7037725277162395e-01 -3.3732316451567073e+00 1.5061135481375743e-01 8.4316511864134791e-01 3.5438526429958745e+00 7.8949565444370401e-02 7.6724879573110749e-01 1.7960889588642477e+00 -1.0538997465370731e-01 -5.8000985811130190e-01 -1.6839637610745111e+00 -8.2829927117086832e-01 -6.8448458295610193e-02 -1.3173842563771437e-02 8.2341311361703040e-01 2.6062510520736154e-01 4.0839756195214939e-02 1.6128444616477315e+00 9.4981553973184904e-02 9.4580479291892471e-03 -1.6363743394253483e+00 -2.8518284339481947e-01 -5.3315509051431106e-02 -1.6633829123291779e+00 -6.3873965789735573e-02 -3.4008235369294947e-03 1.6691324276127972e+00 4.4864532895387244e-01 7.8949565444370401e-02 3.2935816113934302e+00 1.1394708000947194e-01 1.8422812993338936e-02 -3.2709150913455947e+00 -5.0069380066372549e-01 -7.7780007409981464e-02 -6.8019353511560868e-02 -4.9657811928444637e+00 -7.4480465971112098e-01 5.6055476640689639e-01 4.9517499599171986e+00 2.6062510520736060e-01 9.5606459747666739e-02 6.0952716489401269e+00 4.4870382303094414e-01 -5.8614347666406941e-01 -5.9673665906173161e+00 -8.0552519816495227e-01 -6.1810029460864627e-02 -6.1272670748316500e+00 -2.9049165163416069e-01 4.1810124744948207e-01 5.9848194153399854e+00 7.6724879573110760e-01 1.1394708000947187e-01 8.2182523008514110e+00 8.6341474364501658e-01 -4.7223669397702289e-01 -8.1896784667552929e+00 -4.9917095810419476e-01 -1.3300951140067178e-02 -7.5549185182578071e-01 -9.6316794433957220e-01 1.0070390146869213e-01 5.6055476640689694e-01 8.2341311361703007e-01 9.4831787742277740e-03 4.4241797268407146e-01 1.6211763896932556e+00 -1.0750817275335046e-01 -8.0691298599736572e-01 -1.7656381296738826e+00 -8.9659664475507696e-03 -5.9298710886896211e-01 -1.6828553052620907e+00 7.4428566943943855e-02 7.7083461227232331e-01 1.7960889588642477e+00 1.8422812993338936e-02 8.6341474364501658e-01 3.4423414083607224e+00 -7.3263369839234427e-02 -4.8183014831619997e-01 -3.2713584912597105e+00 7.9790932621878552e-01 5.5470142695590219e-01 9.8589204136001529e-02 -9.6316794433957276e-01 -7.4480465971112275e-01 -1.3173842563771325e-02 -1.6343455914004767e+00 -5.9296868402695124e-01 -9.2184996011835194e-03 1.7362412967158884e+00 7.7030545574854870e-01 7.4932151711156497e-02 1.6551473488246584e+00 4.1820635089921004e-01 8.9094990981103440e-03 -1.8109501602749092e+00 -7.9223615892267185e-01 -1.0538997465370731e-01 -3.2709150913455947e+00 -4.7223669397702295e-01 -7.3263369839234441e-02 3.4900808156012220e+00 8.5903296303410770e-01 1.8614831712628184e-02 2.5988476860043935e-01 4.9186255008220803e+00 5.5470142695590086e-01 -7.5549185182577971e-01 -4.9657811928444637e+00 -6.8448458295609499e-02 -2.9122763307727445e-01 -6.1079425032854564e+00 -6.5184733717187068e-02 7.7296731487915316e-01 5.9496470219334325e+00 4.2888526157770973e-01 4.5912834011010534e-01 6.0966072736251480e+00 9.5311019786238210e-02 -8.0360010105702484e-01 -5.9863322684796270e+00 -5.8000985811130190e-01 -5.0069380066372560e-01 -8.1896784667552929e+00 -4.8183014831619997e-01 8.5903296303410748e-01 8.2848546349841783e+00 1.1657549012044949e-01 4.0803164502523956e-02 2.5988476860043941e-01 7.9790932621878563e-01 -1.3300951140067123e-02 -6.8019353511560673e-02 -8.2829927117086877e-01 -3.4126961818322062e-03 -6.4092267203336120e-02 -1.6149717527166310e+00 7.8625133647943254e-02 4.4457574014113610e-01 1.6094141223792153e+00 9.8262283406574374e-03 9.5883215487555670e-02 1.6475104852170392e+00 -5.3375703471872010e-02 -2.8563663553048912e-01 -1.6839637610745113e+00 -7.7780007409981464e-02 -4.9917095810419487e-01 -3.2713584912597105e+00 1.8614831712628181e-02 1.1657549012044950e-01 3.3437593424066812e+00 588 589 590 636 637 638 648 649 650 600 601 602 591 592 593 639 640 641 651 652 653 603 604 605 3.2733855038603390e+00 1.0192616087546194e-01 1.6338098166774510e-02 -3.1941032489902295e+00 -4.9255089075636832e-01 -7.8266158868407612e-02 -1.6241306764787342e+00 -5.4519357463436405e-02 -3.1416298536588640e-03 1.6130926243243862e+00 4.4289354214830384e-01 7.9539574547347100e-02 1.5630157300945879e+00 8.2367740504296211e-02 7.8894513270243612e-03 -1.5970784527934967e+00 -2.7304251346864084e-01 -5.2183434976090501e-02 -8.0931414368459520e-01 -5.7610371210904010e-02 -1.1550071843824478e-02 7.7513266366774181e-01 2.5053568937128756e-01 4.1374171500835465e-02 1.0192616087546191e-01 8.1022807008204971e+00 8.5669237759052641e-01 -4.6577228614806954e-01 -8.0020565805766797e+00 -4.8545333008158720e-01 -4.9613082093509848e-02 -6.0355625391499661e+00 -2.8500228569299735e-01 4.1157342205382230e-01 5.8642934329181324e+00 7.6617671813065868e-01 7.6087162255458488e-02 5.9019171479831369e+00 4.4073267036876035e-01 -5.7543789183797867e-01 -5.7806501245987407e+00 -7.9672670316182681e-01 -4.9193937712651029e-02 -4.8525133003212089e+00 -7.4695513652482304e-01 5.5043045260746593e-01 4.8022912629248307e+00 2.5053568937128895e-01 1.6338098166774510e-02 8.5669237759052641e-01 3.4233118771473032e+00 -7.3646746607111388e-02 -4.6562590747680715e-01 -3.1929714843707169e+00 -7.1904188311571783e-03 -5.8931235324233333e-01 -1.6423587717280750e+00 7.3759335153137248e-02 7.6990076718371747e-01 1.7440582472893646e+00 7.0409570251279904e-03 4.1444722363590031e-01 1.5678586769818763e+00 -1.0689794983907433e-01 -7.9104267526838268e-01 -1.7286877454494880e+00 -9.9958091734120083e-03 -7.4548988503008584e-01 -9.4634346353800691e-01 1.0059253410571510e-01 5.5043045260746504e-01 7.7513266366774203e-01 -3.1941032489902295e+00 -4.6577228614806965e-01 -7.3646746607111416e-02 3.3700020328384186e+00 8.5539564461613771e-01 1.5127282960808772e-02 1.6276030495976030e+00 4.2749629361821229e-01 8.4242159783449750e-03 -1.7729710789084987e+00 -7.9835042623675379e-01 -1.0692156533265414e-01 -1.5972029922315440e+00 -5.8331420023619307e-01 -7.0718827476548927e-03 1.7122610906261422e+00 7.6066045709633823e-01 7.4503833426599594e-02 8.0075461060611552e-01 5.5083965381515054e-01 1.0113493416549192e-01 -9.4634346353800691e-01 -7.4695513652482237e-01 -1.1550071843824807e-02 -4.9255089075636832e-01 -8.0020565805766779e+00 -4.6562590747680710e-01 8.5539564461613782e-01 8.0326258789904141e+00 9.4331957324437304e-02 4.4864331574731919e-01 6.0218990292680648e+00 8.4046816168244082e-02 -8.0305399492479512e-01 -5.8827240276332748e+00 -5.7508923679963631e-01 -2.7296532909270688e-01 -5.9347129958834914e+00 -4.6010582033718585e-02 7.6367596524113479e-01 5.7793977399379237e+00 4.1511767021323465e-01 2.4634517419936541e-01 4.8380842562182540e+00 5.5083965381515165e-01 -7.4548988503008662e-01 -4.8525133003212106e+00 -5.7610371210905585e-02 -7.8266158868407612e-02 -4.8545333008158720e-01 -3.1929714843707178e+00 1.5127282960808772e-02 9.4331957324437318e-02 3.2201260629266715e+00 8.3385980669775615e-03 7.7827068480436606e-02 1.6209270680484544e+00 -5.1842535742923072e-02 -2.7287448574969969e-01 -1.6399474959880216e+00 -1.4254616000047618e-03 -4.1479564038517325e-02 -1.5802596443105763e+00 7.7224124610773076e-02 4.3049711757821563e-01 1.5806850267726695e+00 4.0839959746187642e-02 2.4634517419936358e-01 8.0075461060611508e-01 -9.9958091734115764e-03 -4.9193937712648954e-02 -8.0931414368459509e-01 -1.6241306764787342e+00 -4.9613082093509821e-02 -7.1904188311571835e-03 1.6276030495976028e+00 4.4864331574731914e-01 8.3385980669775615e-03 3.3114466257003792e+00 1.0670022963324385e-01 4.0775515202727559e-03 -3.2849750247870650e+00 -5.0345838964549405e-01 -1.9668088615785069e-02 -8.1012027826545241e-01 -5.7415830578873644e-02 1.9917486551532736e-04 8.0160800791289000e-01 2.5609922646206751e-01 8.9605968694904774e-03 1.6209270680484484e+00 8.4046816168244012e-02 8.4242159783450427e-03 -1.6423587717280692e+00 -2.8500228569299707e-01 -3.1416298536589057e-03 -5.4519357463436419e-02 -6.0355625391499661e+00 -5.8931235324233344e-01 4.2749629361821229e-01 6.0218990292680648e+00 7.7827068480436593e-02 1.0670022963324385e-01 8.3502493190687694e+00 1.0670022963324344e-01 -4.7769651647011019e-01 -8.1639919363750941e+00 -4.7769651647010880e-01 -5.3404132073394180e-02 -4.9936923857079041e+00 -5.3404132073395290e-02 5.6290876751738128e-01 4.8347620227780324e+00 5.6290876751738173e-01 7.7827068480438397e-02 6.0218990292680576e+00 4.2749629361821367e-01 -5.8931235324233444e-01 -6.0355625391499599e+00 -5.4519357463437931e-02 -3.1416298536588597e-03 -2.8500228569299735e-01 -1.6423587717280748e+00 8.4242159783449767e-03 8.4046816168244082e-02 1.6209270680484547e+00 4.0775515202727533e-03 1.0670022963324351e-01 3.3114466257003801e+00 -1.9668088615785208e-02 -5.0345838964549350e-01 -3.2849750247870650e+00 1.9917486551545411e-04 -5.7415830578873395e-02 -8.1012027826545241e-01 8.9605968694904808e-03 2.5609922646206745e-01 8.0160800791288966e-01 8.3385980669775511e-03 4.4864331574731825e-01 1.6276030495975973e+00 -7.1904188311571245e-03 -4.9613082093509113e-02 -1.6241306764787284e+00 1.6130926243243862e+00 4.1157342205382230e-01 7.3759335153137262e-02 -1.7729710789084989e+00 -8.0305399492479512e-01 -5.1842535742923072e-02 -3.2849750247870646e+00 -4.7769651647011019e-01 -1.9668088615785215e-02 3.5128230941190184e+00 8.5045259307416254e-01 1.5410739787516112e-01 7.7363884900430424e-01 5.5625446751466034e-01 7.4964951551615257e-03 -9.4571921505348944e-01 -7.2861745257876209e-01 -1.3647061303944441e-01 -1.6399474959880160e+00 -5.7508923679963764e-01 -1.0692156533265451e-01 1.7440582472893595e+00 7.6617671813065980e-01 7.9539574547347294e-02 4.4289354214830384e-01 5.8642934329181324e+00 7.6990076718371758e-01 -7.9835042623675401e-01 -5.8827240276332748e+00 -2.7287448574969969e-01 -5.0345838964549405e-01 -8.1639919363750941e+00 -5.0345838964549350e-01 8.5045259307416254e-01 8.1129077569452388e+00 8.5045259307416099e-01 2.4810769108805217e-01 4.8018434305881161e+00 2.4810769108805306e-01 -7.3667129186228841e-01 -4.7138980617279760e+00 -7.3667129186228864e-01 -2.7287448574970119e-01 -5.8827240276332669e+00 -7.9835042623675423e-01 7.6990076718371825e-01 5.8642934329181253e+00 4.4289354214830423e-01 7.9539574547347100e-02 7.6617671813065868e-01 1.7440582472893646e+00 -1.0692156533265414e-01 -5.7508923679963631e-01 -1.6399474959880216e+00 -1.9668088615785069e-02 -4.7769651647010880e-01 -3.2849750247870646e+00 1.5410739787516112e-01 8.5045259307416088e-01 3.5128230941190184e+00 7.4964951551613011e-03 5.5625446751465901e-01 7.7363884900430413e-01 -1.3647061303944424e-01 -7.2861745257876109e-01 -9.4571921505348921e-01 -5.1842535742923385e-02 -8.0305399492479357e-01 -1.7729710789084927e+00 7.3759335153137151e-02 4.1157342205382125e-01 1.6130926243243806e+00 1.5630157300945879e+00 7.6087162255458488e-02 7.0409570251279887e-03 -1.5972029922315436e+00 -2.7296532909270682e-01 -1.4254616000047634e-03 -8.1012027826545241e-01 -5.3404132073394180e-02 1.9917486551545248e-04 7.7363884900430424e-01 2.4810769108805217e-01 7.4964951551613054e-03 3.1893497793564678e+00 9.4145748066209539e-02 3.4082798117706149e-03 -3.1062801206296649e+00 -4.8669322857866065e-01 -1.7537013836940198e-02 -1.5802596443105705e+00 -4.6010582033717023e-02 -7.0718827476546463e-03 1.5678586769818708e+00 4.4073267036875857e-01 7.8894513270242606e-03 8.2367740504296211e-02 5.9019171479831369e+00 4.1444722363590031e-01 -5.8331420023619307e-01 -5.9347129958834914e+00 -4.1479564038517366e-02 -5.7415830578873658e-02 -4.9936923857079041e+00 -5.7415830578873409e-02 5.5625446751466046e-01 4.8018434305881152e+00 5.5625446751465901e-01 9.4145748066209484e-02 8.1007593284438020e+00 9.4145748066210622e-02 -4.6500558486748217e-01 -7.8433186775233050e+00 -4.6500558486748245e-01 -4.1479564038519448e-02 -5.9347129958834834e+00 -5.8331420023619418e-01 4.1444722363590170e-01 5.9019171479831307e+00 8.2367740504297404e-02 7.8894513270243612e-03 4.4073267036876035e-01 1.5678586769818763e+00 -7.0718827476548944e-03 -4.6010582033718557e-02 -1.5802596443105761e+00 1.9917486551532742e-04 -5.3404132073395283e-02 -8.1012027826545252e-01 7.4964951551615222e-03 2.4810769108805300e-01 7.7363884900430413e-01 3.4082798117706118e-03 9.4145748066210580e-02 3.1893497793564691e+00 -1.7537013836940341e-02 -4.8669322857866204e-01 -3.1062801206296653e+00 -1.4254616000048594e-03 -2.7296532909270732e-01 -1.5972029922315385e+00 7.0409570251282558e-03 7.6087162255459237e-02 1.5630157300945826e+00 -1.5970784527934967e+00 -5.7543789183797867e-01 -1.0689794983907434e-01 1.7122610906261422e+00 7.6367596524113479e-01 7.7224124610773062e-02 8.0160800791289000e-01 5.6290876751738117e-01 8.9605968694904843e-03 -9.4571921505348933e-01 -7.3667129186228830e-01 -1.3647061303944419e-01 -3.1062801206296649e+00 -4.6500558486748234e-01 -1.7537013836940341e-02 3.2832114086144371e+00 8.3213906875782495e-01 1.5240045678468636e-01 1.5806850267726638e+00 4.1511767021323454e-01 7.4503833426599719e-02 -1.7286877454494820e+00 -7.9672670316182648e-01 -5.2183434976090737e-02 -2.7304251346864084e-01 -5.7806501245987407e+00 -7.9104267526838268e-01 7.6066045709633823e-01 5.7793977399379228e+00 4.3049711757821563e-01 2.5609922646206756e-01 4.8347620227780315e+00 2.5609922646206745e-01 -7.2861745257876220e-01 -4.7138980617279760e+00 -7.2861745257876109e-01 -4.8669322857866071e-01 -7.8433186775233050e+00 -4.8669322857866204e-01 8.3213906875782495e-01 7.7249594857948853e+00 8.3213906875782562e-01 4.3049711757821646e-01 5.7793977399379148e+00 7.6066045709633912e-01 -7.9104267526838301e-01 -5.7806501245987336e+00 -2.7304251346864178e-01 -5.2183434976090501e-02 -7.9672670316182681e-01 -1.7286877454494880e+00 7.4503833426599594e-02 4.1511767021323465e-01 1.5806850267726695e+00 8.9605968694904756e-03 5.6290876751738173e-01 8.0160800791288989e-01 -1.3647061303944441e-01 -7.3667129186228841e-01 -9.4571921505348910e-01 -1.7537013836940202e-02 -4.6500558486748250e-01 -3.1062801206296653e+00 1.5240045678468636e-01 8.3213906875782551e-01 3.2832114086144375e+00 7.7224124610773284e-02 7.6367596524113512e-01 1.7122610906261364e+00 -1.0689794983907448e-01 -5.7543789183797922e-01 -1.5970784527934911e+00 -8.0931414368459509e-01 -4.9193937712651063e-02 -9.9958091734120118e-03 8.0075461060611552e-01 2.4634517419936539e-01 4.0839959746187642e-02 1.6209270680484484e+00 7.7827068480438411e-02 8.3385980669775511e-03 -1.6399474959880160e+00 -2.7287448574970125e-01 -5.1842535742923385e-02 -1.5802596443105705e+00 -4.1479564038519462e-02 -1.4254616000048612e-03 1.5806850267726638e+00 4.3049711757821646e-01 7.7224124610773284e-02 3.2201260629266479e+00 9.4331957324438484e-02 1.5127282960809009e-02 -3.1929714843706942e+00 -4.8545333008158703e-01 -7.8266158868407210e-02 -5.7610371210903996e-02 -4.8525133003212089e+00 -7.4548988503008584e-01 5.5083965381515043e-01 4.8380842562182540e+00 2.4634517419936358e-01 8.4046816168244012e-02 6.0218990292680576e+00 4.4864331574731825e-01 -5.7508923679963764e-01 -5.8827240276332669e+00 -8.0305399492479357e-01 -4.6010582033717072e-02 -5.9347129958834826e+00 -2.7296532909270738e-01 4.1511767021323465e-01 5.7793977399379157e+00 7.6367596524113524e-01 9.4331957324438442e-02 8.0326258789903839e+00 8.5539564461613782e-01 -4.6562590747680827e-01 -8.0020565805766495e+00 -4.9255089075636771e-01 -1.1550071843824478e-02 -7.4695513652482304e-01 -9.4634346353800702e-01 1.0113493416549192e-01 5.5083965381515154e-01 8.0075461060611519e-01 8.4242159783450427e-03 4.2749629361821367e-01 1.6276030495975973e+00 -1.0692156533265448e-01 -7.9835042623675401e-01 -1.7729710789084927e+00 -7.0718827476546463e-03 -5.8331420023619418e-01 -1.5972029922315383e+00 7.4503833426599719e-02 7.6066045709633912e-01 1.7122610906261366e+00 1.5127282960809002e-02 8.5539564461613771e-01 3.3700020328383964e+00 -7.3646746607111957e-02 -4.6577228614807076e-01 -3.1941032489902064e+00 7.7513266366774181e-01 5.5043045260746593e-01 1.0059253410571510e-01 -9.4634346353800691e-01 -7.4548988503008662e-01 -9.9958091734115781e-03 -1.6423587717280692e+00 -5.8931235324233444e-01 -7.1904188311571219e-03 1.7440582472893595e+00 7.6990076718371825e-01 7.3759335153137151e-02 1.5678586769818708e+00 4.1444722363590170e-01 7.0409570251282541e-03 -1.7286877454494824e+00 -7.9104267526838290e-01 -1.0689794983907448e-01 -3.1929714843706942e+00 -4.6562590747680832e-01 -7.3646746607111971e-02 3.4233118771472806e+00 8.5669237759052619e-01 1.6338098166774628e-02 2.5053568937128756e-01 4.8022912629248307e+00 5.5043045260746504e-01 -7.4695513652482237e-01 -4.8525133003212106e+00 -4.9193937712648947e-02 -2.8500228569299696e-01 -6.0355625391499599e+00 -4.9613082093509162e-02 7.6617671813065980e-01 5.8642934329181262e+00 4.1157342205382130e-01 4.4073267036875857e-01 5.9019171479831307e+00 7.6087162255459223e-02 -7.9672670316182648e-01 -5.7806501245987336e+00 -5.7543789183797922e-01 -4.8545333008158703e-01 -8.0020565805766513e+00 -4.6577228614807081e-01 8.5669237759052619e-01 8.1022807008204651e+00 1.0192616087546243e-01 4.1374171500835465e-02 2.5053568937128889e-01 7.7513266366774214e-01 -1.1550071843824807e-02 -5.7610371210905571e-02 -8.0931414368459509e-01 -3.1416298536589057e-03 -5.4519357463437959e-02 -1.6241306764787284e+00 7.9539574547347294e-02 4.4289354214830423e-01 1.6130926243243806e+00 7.8894513270242606e-03 8.2367740504297432e-02 1.5630157300945826e+00 -5.2183434976090751e-02 -2.7304251346864178e-01 -1.5970784527934914e+00 -7.8266158868407210e-02 -4.9255089075636760e-01 -3.1941032489902064e+00 1.6338098166774624e-02 1.0192616087546240e-01 3.2733855038603159e+00 435 436 437 450 451 452 567 568 569 519 520 521 438 439 440 453 454 455 570 571 572 522 523 524 3.8558360906474256e+00 1.7006268201464800e+00 7.1006922027888897e-01 -4.0597876741876719e+00 -1.8533608202976588e+00 -6.1169667685701756e-01 -2.4222862538717509e+00 -1.6391667338164684e+00 -4.2294946387815574e-01 2.6576993336163568e+00 1.6461777135250970e+00 7.4026705552418637e-01 2.3254341540612784e+00 1.5470085862423808e+00 4.6875552764628853e-01 -2.5774404006218954e+00 -1.4324475782758181e+00 -6.8080666818039048e-01 -1.6651563662101971e+00 -1.4412390402455308e+00 -6.2690326759811354e-01 1.8857011165664554e+00 1.4724010527215183e+00 4.2326427306431269e-01 1.7006268201464800e+00 5.0369837939366224e+00 1.0005852225963583e+00 -1.8342468868058979e+00 -4.7999088917848107e+00 -7.0567160131578399e-01 -1.6085084609624685e+00 -3.6900616040206682e+00 -6.1641468447661074e-01 1.6390273784993645e+00 3.2249098554911662e+00 8.7577338040662822e-01 1.5265989463790648e+00 3.5188313580635802e+00 6.9079376059631070e-01 -1.6537968791541771e+00 -3.1094391498159299e+00 -8.6952312564299561e-01 -1.4292308104387257e+00 -2.7239708916320096e+00 -8.9453777965923087e-01 1.6595298923363591e+00 2.5426555297620483e+00 5.1899482749532333e-01 7.1006922027888908e-01 1.0005852225963581e+00 3.0659158931104220e+00 -5.8680351292428556e-01 -6.8248755372902914e-01 -2.7564466404723809e+00 -5.6288196417798464e-01 -8.3758496957021844e-01 -1.5085478892528077e+00 7.3073220826950236e-01 8.7005808509638316e-01 1.6982603203533375e+00 4.3483765259730378e-01 6.5185491051204325e-01 1.4330275608450471e+00 -7.3983390286913675e-01 -8.1859991896884643e-01 -1.6856613826515632e+00 -6.1022720430436772e-01 -8.7805707634677210e-01 -1.0459225540868726e+00 6.2410750313007934e-01 6.9423130041008163e-01 7.9937469215481594e-01 -4.0597876741876719e+00 -1.8342468868058974e+00 -5.8680351292428568e-01 4.4506388695551626e+00 1.9584178582595231e+00 3.9593097626332485e-01 2.7157127499569751e+00 1.7776758160291786e+00 3.6320461865505665e-01 -3.0293553421139121e+00 -1.7245437731403019e+00 -7.0058362779603423e-01 -2.6134628539316589e+00 -1.8252328411927801e+00 -3.1112563583752584e-01 2.8723886514569941e+00 1.6570808411726949e+00 5.4456712906934768e-01 1.9112274964584619e+00 1.6849382336011545e+00 6.4575259773265004e-01 -2.2473618971943488e+00 -1.6940892479235712e+00 -3.5094254516253282e-01 -1.8533608202976588e+00 -4.7999088917848116e+00 -6.8248755372902914e-01 1.9584178582595233e+00 4.6925332836387810e+00 4.2209052567209826e-01 1.7839154428376673e+00 3.5034480557500669e+00 4.4805147629750103e-01 -1.7691427780707705e+00 -3.0863969894736427e+00 -7.2902207360938087e-01 -1.5501717260211734e+00 -3.4186745540012309e+00 -3.5983580158386663e-01 1.6342016677466020e+00 2.9862280559997965e+00 5.6582610941451428e-01 1.4605804767406414e+00 2.5665133621995526e+00 7.0330650581030185e-01 -1.6644401211948303e+00 -2.4437423223285122e+00 -3.6792918827213766e-01 -6.1169667685701734e-01 -7.0567160131578388e-01 -2.7564466404723809e+00 3.9593097626332485e-01 4.2209052567209820e-01 2.6961701583960060e+00 3.3761765915781278e-01 4.1568111617216680e-01 1.4000018680126436e+00 -4.9213542575554436e-01 -4.9688791595481308e-01 -1.4899524804108479e+00 -2.7580050035037074e-01 -3.8507487191290901e-01 -1.3673995803006804e+00 5.6804452421622120e-01 6.0058806503116724e-01 1.4407701416336540e+00 4.0156130573322413e-01 4.9445722492917732e-01 8.1112458693457101e-01 -3.2352186240765046e-01 -3.4518254262110343e-01 -7.3426805379296556e-01 -2.4222862538717509e+00 -1.6085084609624685e+00 -5.6288196417798464e-01 2.7157127499569746e+00 1.7839154428376673e+00 3.3761765915781278e-01 4.0275170691810347e+00 1.9571627896682995e+00 3.8957563766797160e-01 -4.2480818182999291e+00 -1.9743436371948171e+00 -6.2616945749656927e-01 -1.6991673624072563e+00 -1.5794556408544582e+00 -2.6474129893677362e-01 1.9123500087891683e+00 1.4487123907281785e+00 5.4452740730536764e-01 2.4705969486583479e+00 1.6695724722986776e+00 5.1830615291451831e-01 -2.7566413420065894e+00 -1.6970553565210793e+00 -3.3623413643434225e-01 -1.6391667338164684e+00 -3.6900616040206677e+00 -8.3758496957021822e-01 1.7776758160291786e+00 3.5034480557500669e+00 4.1568111617216680e-01 1.9571627896682993e+00 5.5558660008243921e+00 5.6593684700998081e-01 -1.9903070680052579e+00 -5.0097072096265309e+00 -8.1130790538813846e-01 -1.5332346070078493e+00 -3.0224107660885013e+00 -3.9631885883303730e-01 1.7092267923449724e+00 2.5266455424047916e+00 7.6295771443034732e-01 1.6427676174319596e+00 3.7323103539698579e+00 7.4981377328420140e-01 -1.9241246066448330e+00 -3.5960903732134080e+00 -4.4917771710530074e-01 -4.2294946387815574e-01 -6.1641468447661074e-01 -1.5085478892528075e+00 3.6320461865505671e-01 4.4805147629750103e-01 1.4000018680126436e+00 3.8957563766797160e-01 5.6593684700998081e-01 2.8030722803572568e+00 -6.2015191912955336e-01 -7.9761493920096460e-01 -2.8695964003989061e+00 -2.8555648878468032e-01 -4.4018322373932495e-01 -7.4355322380298405e-01 4.3149560992424818e-01 5.2288760612234764e-01 8.1639153067484571e-01 5.0806976598795939e-01 7.4914859707223724e-01 1.5232647097558449e+00 -3.6368776044284640e-01 -4.3181167908516660e-01 -1.4210328753458941e+00 2.6576993336163568e+00 1.6390273784993643e+00 7.3073220826950247e-01 -3.0293553421139121e+00 -1.7691427780707707e+00 -4.9213542575554425e-01 -4.2480818182999300e+00 -1.9903070680052584e+00 -6.2015191912955336e-01 4.6525094409271119e+00 1.9366360087163015e+00 9.3509944848698567e-01 1.8731542813467743e+00 1.7345996196759039e+00 4.0175317006023031e-01 -2.2114311702890928e+00 -1.5343176920164880e+00 -7.6151408599682824e-01 -2.7137464121170671e+00 -1.7946111760977825e+00 -8.1008360553450776e-01 3.0192516869297585e+00 1.7781157072987299e+00 6.1630020959971399e-01 1.6461777135250968e+00 3.2249098554911662e+00 8.7005808509638316e-01 -1.7245437731403019e+00 -3.0863969894736427e+00 -4.9688791595481308e-01 -1.9743436371948166e+00 -5.0097072096265300e+00 -7.9761493920096449e-01 1.9366360087163015e+00 4.6836793992094616e+00 9.3969284880608095e-01 1.4245109892008996e+00 2.5220369210862486e+00 4.9099465971535983e-01 -1.5355649578531583e+00 -2.1896787620178921e+00 -7.5811810693352788e-01 -1.5349334824272871e+00 -3.2983017129998151e+00 -8.9403540275828464e-01 1.7620611391732661e+00 3.1534584983310028e+00 6.4591077122976492e-01 7.4026705552418637e-01 8.7577338040662822e-01 1.6982603203533375e+00 -7.0058362779603423e-01 -7.2902207360938087e-01 -1.4899524804108479e+00 -6.2616945749656927e-01 -8.1130790538813868e-01 -2.8695964003989061e+00 9.3509944848698567e-01 9.3969284880608095e-01 3.1849444928396471e+00 5.3568346646469045e-01 7.7741747452286569e-01 7.8111434878160890e-01 -7.6001086683011398e-01 -7.5600502690087201e-01 -1.0408256129952422e+00 -7.3388316921467045e-01 -9.4378787935193964e-01 -1.7662034862088387e+00 6.0959715086152488e-01 6.4723918151475623e-01 1.5022588180392398e+00 2.3254341540612784e+00 1.5265989463790648e+00 4.3483765259730378e-01 -2.6134628539316589e+00 -1.5501717260211731e+00 -2.7580050035037074e-01 -1.6991673624072561e+00 -1.5332346070078493e+00 -2.8555648878468032e-01 1.8731542813467743e+00 1.4245109892008994e+00 5.3568346646469045e-01 3.8414738299248947e+00 1.7643692198676684e+00 3.1520437870363127e-01 -3.9829485951970200e+00 -1.8179227424898337e+00 -5.2128019250816016e-01 -2.3602352315460551e+00 -1.5379744490865777e+00 -5.4587388675084525e-01 2.6157517777490433e+00 1.7238243691578017e+00 3.4278557062843018e-01 1.5470085862423808e+00 3.5188313580635793e+00 6.5185491051204314e-01 -1.8252328411927803e+00 -3.4186745540012309e+00 -3.8507487191290901e-01 -1.5794556408544582e+00 -3.0224107660885018e+00 -4.4018322373932495e-01 1.7345996196759041e+00 2.5220369210862486e+00 7.7741747452286569e-01 1.7643692198676686e+00 5.3366844894955019e+00 4.7293265819567648e-01 -1.7564343264381148e+00 -4.7354292544826544e+00 -6.8212305413295249e-01 -1.5765296819665393e+00 -3.6510472916812291e+00 -8.2971111575787426e-01 1.6916750646659391e+00 3.4500090976082864e+00 4.3488722231247440e-01 4.6875552764628864e-01 6.9079376059631059e-01 1.4330275608450471e+00 -3.1112563583752584e-01 -3.5983580158386669e-01 -1.3673995803006804e+00 -2.6474129893677362e-01 -3.9631885883303730e-01 -7.4355322380298405e-01 4.0175317006023031e-01 4.9099465971535983e-01 7.8111434878160879e-01 3.1520437870363133e-01 4.7293265819567631e-01 2.7578408121693458e+00 -5.4696934797800412e-01 -7.3767063118748122e-01 -2.7507780621110172e+00 -3.7593574879767772e-01 -5.6648179533656906e-01 -1.4971319078196936e+00 3.1305895513983117e-01 4.0558600843360748e-01 1.3868800522383733e+00 -2.5774404006218954e+00 -1.6537968791541773e+00 -7.3983390286913675e-01 2.8723886514569941e+00 1.6342016677466018e+00 5.6804452421622120e-01 1.9123500087891683e+00 1.7092267923449724e+00 4.3149560992424818e-01 -2.2114311702890923e+00 -1.5355649578531581e+00 -7.6001086683011398e-01 -3.9829485951970209e+00 -1.7564343264381148e+00 -5.4696934797800412e-01 4.3277769493366112e+00 1.7377929806451822e+00 8.3191759365963291e-01 2.6047481489361610e+00 1.5652352437130381e+00 7.0920623906809932e-01 -2.9454435924109257e+00 -1.7006605210043440e+00 -4.9384984919094532e-01 -1.4324475782758181e+00 -3.1094391498159299e+00 -8.1859991896884665e-01 1.6570808411726949e+00 2.9862280559997965e+00 6.0058806503116724e-01 1.4487123907281785e+00 2.5266455424047916e+00 5.2288760612234764e-01 -1.5343176920164880e+00 -2.1896787620178917e+00 -7.5600502690087201e-01 -1.8179227424898337e+00 -4.7354292544826544e+00 -7.3767063118748133e-01 1.7377929806451822e+00 4.3764654899271997e+00 8.4038325983163742e-01 1.5959234416183414e+00 3.1772659583341070e+00 8.5449782483608150e-01 -1.6548216413822570e+00 -3.0320578803494169e+00 -5.0608117876403302e-01 -6.8080666818039060e-01 -8.6952312564299561e-01 -1.6856613826515632e+00 5.4456712906934768e-01 5.6582610941451428e-01 1.4407701416336540e+00 5.4452740730536764e-01 7.6295771443034732e-01 8.1639153067484582e-01 -7.6151408599682835e-01 -7.5811810693352788e-01 -1.0408256129952420e+00 -5.2128019250816027e-01 -6.8212305413295260e-01 -2.7507780621110167e+00 8.3191759365963291e-01 8.4038325983163753e-01 3.0166190764546053e+00 7.1039693420019412e-01 8.4098544266265762e-01 1.6984611868516606e+00 -6.6780811754916325e-01 -7.0038823962968066e-01 -1.4949768778569432e+00 -1.6651563662101969e+00 -1.4292308104387257e+00 -6.1022720430436772e-01 1.9112274964584619e+00 1.4605804767406414e+00 4.0156130573322413e-01 2.4705969486583479e+00 1.6427676174319596e+00 5.0806976598795950e-01 -2.7137464121170671e+00 -1.5349334824272873e+00 -7.3388316921467056e-01 -2.3602352315460551e+00 -1.5765296819665393e+00 -3.7593574879767777e-01 2.6047481489361610e+00 1.5959234416183412e+00 7.1039693420019412e-01 3.9239576831841370e+00 1.7504922913043217e+00 7.4322874465234734e-01 -4.1713922673637880e+00 -1.9090698522627119e+00 -6.4321062825700825e-01 -1.4412390402455308e+00 -2.7239708916320096e+00 -8.7805707634677221e-01 1.6849382336011547e+00 2.5665133621995526e+00 4.9445722492917737e-01 1.6695724722986778e+00 3.7323103539698579e+00 7.4914859707223724e-01 -1.7946111760977830e+00 -3.2983017129998147e+00 -9.4378787935193975e-01 -1.5379744490865774e+00 -3.6510472916812291e+00 -5.6648179533656906e-01 1.5652352437130379e+00 3.1772659583341065e+00 8.4098544266265773e-01 1.7504922913043215e+00 5.1882123813397492e+00 1.0603020121674267e+00 -1.8964135754872997e+00 -4.9909821595302128e+00 -7.5656652579621664e-01 -6.2690326759811343e-01 -8.9453777965923109e-01 -1.0459225540868726e+00 6.4575259773265004e-01 7.0330650581030207e-01 8.1112458693457101e-01 5.1830615291451854e-01 7.4981377328420129e-01 1.5232647097558452e+00 -8.1008360553450776e-01 -8.9403540275828464e-01 -1.7662034862088385e+00 -5.4587388675084525e-01 -8.2971111575787426e-01 -1.4971319078196936e+00 7.0920623906809921e-01 8.5449782483608150e-01 1.6984611868516606e+00 7.4322874465234712e-01 1.0603020121674267e+00 3.1463047982773187e+00 -6.3363297448414835e-01 -7.4963581792262157e-01 -2.8698973337039901e+00 1.8857011165664559e+00 1.6595298923363591e+00 6.2410750313007934e-01 -2.2473618971943488e+00 -1.6644401211948303e+00 -3.2352186240765046e-01 -2.7566413420065894e+00 -1.9241246066448328e+00 -3.6368776044284645e-01 3.0192516869297581e+00 1.7620611391732659e+00 6.0959715086152488e-01 2.6157517777490433e+00 1.6916750646659391e+00 3.1305895513983117e-01 -2.9454435924109252e+00 -1.6548216413822567e+00 -6.6780811754916325e-01 -4.1713922673637862e+00 -1.8964135754872993e+00 -6.3363297448414824e-01 4.6001345177303925e+00 2.0265338485336559e+00 4.4188710575237161e-01 1.4724010527215183e+00 2.5426555297620483e+00 6.9423130041008163e-01 -1.6940892479235712e+00 -2.4437423223285122e+00 -3.4518254262110343e-01 -1.6970553565210795e+00 -3.5960903732134075e+00 -4.3181167908516666e-01 1.7781157072987299e+00 3.1534584983310028e+00 6.4723918151475623e-01 1.7238243691578017e+00 3.4500090976082864e+00 4.0558600843360748e-01 -1.7006605210043440e+00 -3.0320578803494169e+00 -7.0038823962968066e-01 -1.9090698522627119e+00 -4.9909821595302137e+00 -7.4963581792262157e-01 2.0265338485336559e+00 4.9167496097202132e+00 4.7996178890012570e-01 4.2326427306431252e-01 5.1899482749532333e-01 7.9937469215481594e-01 -3.5094254516253282e-01 -3.6792918827213761e-01 -7.3426805379296556e-01 -3.3623413643434225e-01 -4.4917771710530069e-01 -1.4210328753458938e+00 6.1630020959971399e-01 6.4591077122976492e-01 1.5022588180392398e+00 3.4278557062843018e-01 4.3488722231247440e-01 1.3868800522383733e+00 -4.9384984919094538e-01 -5.0608117876403313e-01 -1.4949768778569430e+00 -6.4321062825700814e-01 -7.5656652579621686e-01 -2.8698973337039901e+00 4.4188710575237167e-01 4.7996178890012564e-01 2.8316615782673633e+00 450 451 452 183 184 185 615 616 617 567 568 569 453 454 455 186 187 188 618 619 620 570 571 572 3.7841722518616825e+00 1.6371221738533523e+00 6.9018967425356548e-01 -3.9893050150998657e+00 -1.7969365642488535e+00 -6.0011480575902121e-01 -2.3150942454344814e+00 -1.5679781920729448e+00 -3.9780297766261402e-01 2.5540385205877763e+00 1.5806341299075537e+00 7.2330902987293055e-01 2.2616486039626658e+00 1.4858486060458553e+00 4.5442988361317516e-01 -2.5184813661920264e+00 -1.3746620825875544e+00 -6.6376427598303434e-01 -1.5855257575172994e+00 -1.3743504451880733e+00 -6.0821911291194752e-01 1.8085470078315484e+00 1.4103223742906650e+00 4.0197258457694701e-01 1.6371221738533521e+00 4.9481046450929860e+00 9.8055950275194537e-01 -1.7732387871361102e+00 -4.7064856056974680e+00 -6.8843943590051293e-01 -1.5421139276605162e+00 -3.5655021210508577e+00 -5.8739566249043362e-01 1.5725789812448665e+00 3.0927207794774185e+00 8.5414186035151884e-01 1.4677991803324275e+00 3.4388996173789468e+00 6.7702264404093793e-01 -1.5974958596812905e+00 -3.0254352561094335e+00 -8.4955949388391705e-01 -1.3658771493813235e+00 -2.6238981825010028e+00 -8.7690710317362286e-01 1.6012253884285941e+00 2.4415961234094135e+00 4.9057768830408632e-01 6.9018967425356559e-01 9.8055950275194526e-01 3.0440651138329016e+00 -5.6364134346797434e-01 -6.5282826704751851e-01 -2.7266323408659048e+00 -5.3993396977713148e-01 -8.1216626608188058e-01 -1.4482240014438863e+00 7.1053021480204337e-01 8.4521474724537837e-01 1.6459597475120762e+00 4.1095571989506030e-01 6.2314564828585250e-01 1.4107544090813846e+00 -7.2485387082022146e-01 -7.9766878418236664e-01 -1.6703350259642946e+00 -5.8963835505778694e-01 -8.5542974837839325e-01 -1.0172117983448967e+00 6.0639193017244530e-01 6.6917316740698318e-01 7.6162389619262061e-01 -3.9893050150998657e+00 -1.7732387871361104e+00 -5.6364134346797445e-01 4.3959110980046345e+00 1.9025285550877491e+00 3.7477542933382013e-01 2.6138910261680417e+00 1.7143375239983121e+00 3.3675413201948556e-01 -2.9374274734102306e+00 -1.6623537703285682e+00 -6.8483762787358438e-01 -2.5565946204661247e+00 -1.7710980545027495e+00 -2.9075576995137992e-01 2.8214354817146705e+00 1.6026258863252694e+00 5.2244826770058095e-01 1.8338441199001985e+00 1.6251654185307129e+00 6.3127778123435629e-01 -2.1817546168113249e+00 -1.6379667719746163e+00 -3.2602086899530597e-01 -1.7969365642488535e+00 -4.7064856056974680e+00 -6.5282826704751851e-01 1.9025285550877491e+00 4.6039511413856733e+00 3.9700852159263633e-01 1.7207234392836650e+00 3.3788411117073434e+00 4.1598469320812365e-01 -1.7025229740507319e+00 -2.9573313923918509e+00 -7.0557556355331874e-01 -1.4950345600705104e+00 -3.3407441315695183e+00 -3.3578983440934107e-01 1.5783024408962303e+00 2.9020380348153170e+00 5.3798894213736392e-01 1.3982347134337663e+00 2.4649509893525616e+00 6.8171222510225105e-01 -1.6052950503313157e+00 -2.3452201476020575e+00 -3.3850071703019852e-01 -6.0011480575902110e-01 -6.8843943590051293e-01 -2.7266323408659048e+00 3.7477542933381996e-01 3.9700852159263628e-01 2.6741555730204425e+00 3.1508785519454863e-01 3.8861683371712297e-01 1.3446709088966997e+00 -4.7226009459404955e-01 -4.7303576617760773e-01 -1.4354130950509263e+00 -2.5616761989218639e-01 -3.5961528901153111e-01 -1.3504538903628323e+00 5.5708763081563817e-01 5.8504618945933662e-01 1.4199384437479192e+00 3.8414046932909041e-01 4.7094056498705716e-01 7.7662288492818154e-01 -3.0254886442784013e-01 -3.2052161866650136e-01 -7.0288848431358075e-01 -2.3150942454344809e+00 -1.5421139276605162e+00 -5.3993396977713148e-01 2.6138910261680417e+00 1.7207234392836650e+00 3.1508785519454868e-01 3.7839757464873451e+00 1.8681137114542286e+00 3.5693690552521085e-01 -4.0046631906210797e+00 -1.8859075552408695e+00 -5.9977922827471797e-01 -1.6209313344079852e+00 -1.5170072495441842e+00 -2.4461039933959880e-01 1.8353225115353702e+00 1.3868847512488356e+00 5.2260776259636244e-01 2.3162654687785937e+00 1.5920274562640975e+00 4.9752827513427789e-01 -2.6087659825058052e+00 -1.6227206258052569e+00 -3.0783720105895329e-01 -1.5679781920729452e+00 -3.5655021210508582e+00 -8.1216626608188058e-01 1.7143375239983123e+00 3.3788411117073438e+00 3.8861683371712297e-01 1.8681137114542286e+00 5.2892029219352841e+00 5.2407692631345104e-01 -1.9077975691814448e+00 -4.7312727612202430e+00 -7.8443836822732649e-01 -1.4691098917466909e+00 -2.9293591094343925e+00 -3.7042121503374403e-01 1.6526372254110764e+00 2.4246730266006535e+00 7.4073269763297234e-01 1.5673702423150846e+00 3.5547375921077706e+00 7.2787112636556284e-01 -1.8575730501776211e+00 -3.4213206606455584e+00 -4.1427173468616013e-01 -3.9780297766261402e-01 -5.8739566249043351e-01 -1.4482240014438863e+00 3.3675413201948551e-01 4.1598469320812365e-01 1.3446709088966997e+00 3.5693690552521090e-01 5.2407692631345104e-01 2.6226976802757758e+00 -5.8630920807152487e-01 -7.5929248781908554e-01 -2.6844994834501970e+00 -2.6136411324258185e-01 -4.0857425240868328e-01 -7.1102787449692650e-01 4.0776933126239029e-01 4.9684062516149691e-01 7.7870403550832101e-01 4.7924353884732324e-01 7.1484699716489619e-01 1.4202915205955076e+00 -3.3522760867768930e-01 -3.9648683912976568e-01 -1.3226127858852943e+00 2.5540385205877763e+00 1.5725789812448665e+00 7.1053021480204337e-01 -2.9374274734102306e+00 -1.7025229740507319e+00 -4.7226009459404966e-01 -4.0046631906210797e+00 -1.9077975691814451e+00 -5.8630920807152487e-01 4.4233084056779797e+00 1.8493710803337240e+00 9.1440254860176073e-01 1.7952642564609376e+00 1.6761598059717726e+00 3.8187287291313921e-01 -2.1444892479490241e+00 -1.4715628906549052e+00 -7.4537352265842172e-01 -2.5642143596704079e+00 -1.7234230614893804e+00 -7.9199789291684664e-01 2.8781830889240498e+00 1.7071966278260995e+00 5.8913508192390118e-01 1.5806341299075535e+00 3.0927207794774185e+00 8.4521474724537837e-01 -1.6623537703285682e+00 -2.9573313923918509e+00 -4.7303576617760767e-01 -1.8859075552408695e+00 -4.7312727612202448e+00 -7.5929248781908543e-01 1.8493710803337238e+00 4.4094453424793469e+00 9.0791270441245486e-01 1.3627276933339900e+00 2.4173486296255104e+00 4.6942004755477895e-01 -1.4762327803323405e+00 -2.0874830212843887e+00 -7.3403309068155564e-01 -1.4583495783069358e+00 -3.1169705340461631e+00 -8.6823870246027102e-01 1.6901107806334466e+00 2.9735429573603716e+00 6.1205254792590913e-01 7.2330902987293044e-01 8.5414186035151884e-01 1.6459597475120762e+00 -6.8483762787358438e-01 -7.0557556355331874e-01 -1.4354130950509263e+00 -5.9977922827471786e-01 -7.8443836822732660e-01 -2.6844994834501970e+00 9.1440254860176073e-01 9.0791270441245486e-01 3.0159305412813233e+00 5.1644720447752634e-01 7.5847080963169178e-01 7.4538653482280748e-01 -7.4818903414943150e-01 -7.3450308298783951e-01 -1.0138730270772016e+00 -7.1311589112819129e-01 -9.1986115968807869e-01 -1.6749733423244990e+00 5.9176299847370750e-01 6.2385280006089838e-01 1.4014821242866180e+00 2.2616486039626658e+00 1.4677991803324275e+00 4.1095571989506030e-01 -2.5565946204661247e+00 -1.4950345600705104e+00 -2.5616761989218639e-01 -1.6209313344079852e+00 -1.4691098917466912e+00 -2.6136411324258185e-01 1.7952642564609378e+00 1.3627276933339900e+00 5.1644720447752634e-01 3.7680558525826000e+00 1.7038135667792516e+00 2.9517109442515699e-01 -3.9073146395139027e+00 -1.7655684267873086e+00 -4.9715700772163701e-01 -2.2501572245486772e+00 -1.4673951411782997e+00 -5.2537815565531987e-01 2.5100291059304869e+00 1.6627675793371415e+00 3.1749287771398294e-01 1.4858486060458553e+00 3.4388996173789459e+00 6.2314564828585250e-01 -1.7710980545027495e+00 -3.3407441315695183e+00 -3.5961528901153117e-01 -1.5170072495441842e+00 -2.9293591094343920e+00 -4.0857425240868339e-01 1.6761598059717728e+00 2.4173486296255104e+00 7.5847080963169178e-01 1.7038135667792513e+00 5.2504226464717485e+00 4.4688688980597996e-01 -1.6956808493658042e+00 -4.6345463102882416e+00 -6.5367455768475369e-01 -1.5113724098990784e+00 -3.5208209594987689e+00 -8.0945220951654040e-01 1.6293365845149370e+00 3.3187996173147170e+00 4.0281296089798624e-01 4.5442988361317521e-01 6.7702264404093793e-01 1.4107544090813844e+00 -2.9075576995137992e-01 -3.3578983440934101e-01 -1.3504538903628323e+00 -2.4461039933959880e-01 -3.7042121503374403e-01 -7.1102787449692650e-01 3.8187287291313921e-01 4.6942004755477895e-01 7.4538653482280748e-01 2.9517109442515699e-01 4.4688688980597996e-01 2.7289055862418756e+00 -5.3214564866026537e-01 -7.2389594907974386e-01 -2.7140256426573437e+00 -3.5603845026845271e-01 -5.4205631933815279e-01 -1.4347389370738863e+00 2.9207641726822547e-01 3.7883373645928520e-01 1.3251998144449217e+00 -2.5184813661920264e+00 -1.5974958596812905e+00 -7.2485387082022146e-01 2.8214354817146705e+00 1.5783024408962305e+00 5.5708763081563817e-01 1.8353225115353702e+00 1.6526372254110764e+00 4.0776933126239029e-01 -2.1444892479490241e+00 -1.4762327803323407e+00 -7.4818903414943150e-01 -3.9073146395139018e+00 -1.6956808493658040e+00 -5.3214564866026526e-01 4.2655953151003221e+00 1.6799744620448878e+00 8.1850506096532427e-01 2.4978826622596273e+00 1.5007878604253992e+00 6.9326343468183360e-01 -2.8499507169550373e+00 -1.6422924993981591e+00 -4.7143690409526995e-01 -1.3746620825875544e+00 -3.0254352561094331e+00 -7.9766878418236664e-01 1.6026258863252694e+00 2.9020380348153170e+00 5.8504618945933662e-01 1.3868847512488356e+00 2.4246730266006531e+00 4.9684062516149691e-01 -1.4715628906549052e+00 -2.0874830212843891e+00 -7.3450308298783951e-01 -1.7655684267873086e+00 -4.6345463102882407e+00 -7.2389594907974375e-01 1.6799744620448880e+00 4.2778319975640029e+00 8.1787267181494350e-01 1.5318160402409768e+00 3.0428590347806610e+00 8.3370858787200830e-01 -1.5895077398302009e+00 -2.8999375060785724e+00 -4.7740025805783687e-01 -6.6376427598303434e-01 -8.4955949388391694e-01 -1.6703350259642946e+00 5.2244826770058095e-01 5.3798894213736392e-01 1.4199384437479192e+00 5.2260776259636244e-01 7.4073269763297234e-01 7.7870403550832101e-01 -7.4537352265842172e-01 -7.3403309068155553e-01 -1.0138730270772016e+00 -4.9715700772163707e-01 -6.5367455768475369e-01 -2.7140256426573437e+00 8.1850506096532427e-01 8.1787267181494350e-01 2.9901213382923970e+00 6.9117108473812627e-01 8.1604817747839142e-01 1.6418425766942577e+00 -6.4843736963730114e-01 -6.7537534681344513e-01 -1.4323726985440559e+00 -1.5855257575172994e+00 -1.3658771493813235e+00 -5.8963835505778694e-01 1.8338441199001985e+00 1.3982347134337663e+00 3.8414046932909041e-01 2.3162654687785937e+00 1.5673702423150846e+00 4.7924353884732329e-01 -2.5642143596704083e+00 -1.4583495783069356e+00 -7.1311589112819129e-01 -2.2501572245486772e+00 -1.5113724098990784e+00 -3.5603845026845271e-01 2.4978826622596273e+00 1.5318160402409768e+00 6.9117108473812627e-01 3.6661649502234108e+00 1.6594348363929676e+00 7.1620243694935060e-01 -3.9142598594254463e+00 -1.8212566947954574e+00 -6.1196483340946073e-01 -1.3743504451880733e+00 -2.6238981825010028e+00 -8.5542974837839325e-01 1.6251654185307129e+00 2.4649509893525621e+00 4.7094056498705716e-01 1.5920274562640975e+00 3.5547375921077711e+00 7.1484699716489608e-01 -1.7234230614893806e+00 -3.1169705340461635e+00 -9.1986115968807869e-01 -1.4673951411782997e+00 -3.5208209594987685e+00 -5.4205631933815279e-01 1.5007878604253995e+00 3.0428590347806614e+00 8.1604817747839142e-01 1.6594348363929674e+00 4.8974528877145129e+00 1.0312868193821452e+00 -1.8122469237574244e+00 -4.6983108279095731e+00 -7.1577533160786699e-01 -6.0821911291194752e-01 -8.7690710317362286e-01 -1.0172117983448969e+00 6.3127778123435641e-01 6.8171222510225116e-01 7.7662288492818154e-01 4.9752827513427789e-01 7.2787112636556284e-01 1.4202915205955076e+00 -7.9199789291684664e-01 -8.6823870246027102e-01 -1.6749733423244990e+00 -5.2537815565531987e-01 -8.0945220951654040e-01 -1.4347389370738863e+00 6.9326343468183360e-01 8.3370858787200830e-01 1.6418425766942577e+00 7.1620243694935060e-01 1.0312868193821454e+00 2.9583301586435740e+00 -6.1267676651570480e-01 -7.1998074357153363e-01 -2.6701630631182391e+00 1.8085470078315486e+00 1.6012253884285939e+00 6.0639193017244530e-01 -2.1817546168113249e+00 -1.6052950503313159e+00 -3.0254886442784013e-01 -2.6087659825058056e+00 -1.8575730501776211e+00 -3.3522760867768930e-01 2.8781830889240494e+00 1.6901107806334470e+00 5.9176299847370739e-01 2.5100291059304864e+00 1.6293365845149370e+00 2.9207641726822542e-01 -2.8499507169550373e+00 -1.5895077398302013e+00 -6.4843736963730114e-01 -3.9142598594254463e+00 -1.8122469237574241e+00 -6.1267676651570480e-01 4.3579719730115292e+00 1.9439500105195844e+00 4.0865926334415870e-01 1.4103223742906650e+00 2.4415961234094135e+00 6.6917316740698318e-01 -1.6379667719746160e+00 -2.3452201476020575e+00 -3.2052161866650136e-01 -1.6227206258052567e+00 -3.4213206606455588e+00 -3.9648683912976557e-01 1.7071966278260995e+00 2.9735429573603716e+00 6.2385280006089838e-01 1.6627675793371415e+00 3.3187996173147165e+00 3.7883373645928509e-01 -1.6422924993981591e+00 -2.8999375060785724e+00 -6.7537534681344535e-01 -1.8212566947954574e+00 -4.6983108279095713e+00 -7.1998074357153352e-01 1.9439500105195844e+00 4.6308504441512603e+00 4.4050484425408104e-01 4.0197258457694701e-01 4.9057768830408638e-01 7.6162389619262050e-01 -3.2602086899530597e-01 -3.3850071703019852e-01 -7.0288848431358075e-01 -3.0783720105895324e-01 -4.1427173468616013e-01 -1.3226127858852941e+00 5.8913508192390118e-01 6.1205254792590913e-01 1.4014821242866180e+00 3.1749287771398294e-01 4.0281296089798618e-01 1.3251998144449217e+00 -4.7143690409526995e-01 -4.7740025805783687e-01 -1.4323726985440564e+00 -6.1196483340946073e-01 -7.1577533160786699e-01 -2.6701630631182391e+00 4.0865926334415864e-01 4.4050484425408110e-01 2.6397311969370110e+00 519 520 521 567 568 569 579 580 581 531 532 533 522 523 524 570 571 572 582 583 584 534 535 536 3.7813231405692647e+00 1.5582615238903166e+00 6.1204240228028828e-01 -3.9458912195435270e+00 -1.8174776940119448e+00 -5.8785045238744615e-01 -2.1462825727628205e+00 -1.4579403337552215e+00 -3.8455875738024503e-01 2.3550068973466121e+00 1.6072530674359495e+00 6.6061677672910823e-01 2.1061317157014310e+00 1.4083895333921532e+00 4.2633938023917162e-01 -2.3345890565561747e+00 -1.4092791856098814e+00 -6.0233042422061633e-01 -1.3385666581845366e+00 -1.2975629242231381e+00 -5.2840710243339029e-01 1.5228677534297508e+00 1.4083560128817678e+00 4.0414817717312884e-01 1.5582615238903161e+00 6.5237944509915087e+00 1.3575510388157750e+00 -1.7983510406910022e+00 -6.3350944746284164e+00 -1.0347603993269123e+00 -1.4357262049916701e+00 -4.8531364912397423e+00 -8.8263158905402606e-01 1.5962346551835540e+00 4.3865557979016323e+00 1.1947556063766578e+00 1.3909981373291047e+00 4.6931497194458043e+00 9.7818203592985820e-01 -1.6564567326636821e+00 -4.2794575085194104e+00 -1.1894368686366106e+00 -1.2860717428546695e+00 -3.6959521152713606e+00 -1.1902802172010811e+00 1.6311114047980495e+00 3.5601406213199849e+00 7.6662039309633834e-01 6.1204240228028828e-01 1.3575510388157750e+00 3.6119299410373245e+00 -5.6883777946713876e-01 -1.0102784724516511e+00 -3.2813017390107038e+00 -4.8797226648999426e-01 -1.1381724933749167e+00 -1.8002234286068866e+00 6.5157931178358197e-01 1.1885611696473239e+00 1.9966542027924681e+00 4.0313601915084263e-01 9.3838585885184422e-01 1.7434595894557761e+00 -6.8312891493280015e-01 -1.1481005185179778e+00 -2.0036515915311965e+00 -5.1626270052759227e-01 -1.1733133068765400e+00 -1.2454887315181502e+00 5.8944392820281299e-01 9.8536672390614410e-01 9.7862175738136792e-01 -3.9458912195435261e+00 -1.7983510406910026e+00 -5.6883777946713887e-01 4.3178180930094356e+00 2.0388544720706321e+00 4.4345862971610400e-01 2.3951120647132087e+00 1.7109765330251245e+00 3.7272756124974932e-01 -2.7122506009903393e+00 -1.8056811751928665e+00 -6.6760264160985883e-01 -2.3553338619844086e+00 -1.7928432263520635e+00 -3.5320297985235460e-01 2.6227698075824990e+00 1.7455738509529375e+00 5.4916808777560566e-01 1.5481363669156127e+00 1.6527752057460701e+00 6.0626991157317522e-01 -1.8703606497024818e+00 -1.7513046195588338e+00 -3.8198078938528113e-01 -1.8174776940119448e+00 -6.3350944746284164e+00 -1.0102784724516509e+00 2.0388544720706325e+00 6.2667693472648036e+00 7.0530627174637384e-01 1.7176051502726342e+00 4.7226231123084199e+00 6.9923419485313654e-01 -1.8394197135009847e+00 -4.2940399799024993e+00 -1.0342452670096247e+00 -1.4996536808850560e+00 -4.6413031554498687e+00 -6.1453638762423968e-01 1.7281380674369973e+00 4.2000205248020208e+00 8.5374986460891766e-01 1.3983787529242899e+00 3.5895181623414976e+00 9.9734675262851102e-01 -1.7264253543065695e+00 -3.5084935367359584e+00 -5.9657695675142275e-01 -5.8785045238744604e-01 -1.0347603993269123e+00 -3.2813017390107038e+00 4.4345862971610400e-01 7.0530627174637395e-01 3.1869535359282160e+00 3.6001866825228601e-01 6.7348152523050764e-01 1.6643687717665432e+00 -5.0599048610371378e-01 -7.6630225099667393e-01 -1.7801153774048435e+00 -3.0050690500366689e-01 -6.3455384712459528e-01 -1.6410393365908797e+00 5.6329290892300687e-01 8.8653501780682586e-01 1.7471723751744719e+00 3.9221773007866623e-01 7.4796733425676154e-01 9.9675103441205393e-01 -3.6464009347523652e-01 -5.7767365159228778e-01 -8.9278926427485772e-01 -2.1462825727628201e+00 -1.4357262049916701e+00 -4.8797226648999426e-01 2.3951120647132087e+00 1.7176051502726346e+00 3.6001866825228590e-01 3.8334628921067733e+00 1.7309247691789786e+00 3.7396633085764430e-01 -4.0325293401861018e+00 -1.8960468238620356e+00 -5.7108734592571475e-01 -1.3580194116094164e+00 -1.4003422121134457e+00 -2.7371462113377998e-01 1.5514264940629796e+00 1.3981242296610044e+00 4.8388987986975535e-01 2.1754816008127893e+00 1.4817348063321609e+00 4.5313851560693552e-01 -2.4186517271374139e+00 -1.5962737144776278e+00 -3.3823916103713164e-01 -1.4579403337552215e+00 -4.8531364912397406e+00 -1.1381724933749167e+00 1.7109765330251250e+00 4.7226231123084208e+00 6.7348152523050764e-01 1.7309247691789784e+00 7.0328323704866875e+00 8.4956762394698515e-01 -1.9026020233119578e+00 -6.5055239578718664e+00 -1.1175696757368387e+00 -1.3673310244673380e+00 -4.0378944155229162e+00 -6.4093114287522723e-01 1.6782337932684050e+00 3.5609895645410381e+00 1.0400308908483031e+00 1.4601391760171745e+00 4.8765505719936764e+00 1.0268690872232953e+00 -1.8524008899551663e+00 -4.7964407546952987e+00 -6.9327581526210691e-01 -3.8455875738024503e-01 -8.8263158905402583e-01 -1.8002234286068866e+00 3.7272756124974937e-01 6.9923419485313654e-01 1.6643687717665432e+00 3.7396633085764436e-01 8.4956762394698515e-01 3.2588743007206831e+00 -5.7017902959080913e-01 -1.1120506270184218e+00 -3.3537443393670032e+00 -2.8106515922987529e-01 -6.7395086750528810e-01 -9.0386893965213966e-01 4.2475525940848669e-01 7.6795714623645828e-01 1.0027106853113774e+00 4.4699376753376874e-01 1.0297223576978620e+00 1.8083736455131973e+00 -3.8263997284871998e-01 -6.7784823915670667e-01 -1.6764906956857717e+00 2.3550068973466121e+00 1.5962346551835540e+00 6.5157931178358197e-01 -2.7122506009903398e+00 -1.8394197135009847e+00 -5.0599048610371367e-01 -4.0325293401861018e+00 -1.9026020233119580e+00 -5.7017902959080913e-01 4.4333982174964168e+00 1.9973658274325243e+00 8.5539115158852486e-01 1.5153711461662702e+00 1.6917204082287456e+00 4.0894381777915878e-01 -1.8487715347895413e+00 -1.6200011659384943e+00 -7.0818972360913446e-01 -2.3925203507041277e+00 -1.7466635405578719e+00 -7.2631086866459937e-01 2.6822955656608110e+00 1.8233655524644856e+00 5.9475582681699046e-01 1.6072530674359495e+00 4.3865557979016323e+00 1.1885611696473242e+00 -1.8056811751928663e+00 -4.2940399799024993e+00 -7.6630225099667382e-01 -1.8960468238620356e+00 -6.5055239578718673e+00 -1.1120506270184218e+00 1.9973658274325243e+00 6.1637556419989457e+00 1.2993445354002298e+00 1.3744323755507251e+00 3.5459840959665230e+00 7.4138853535646565e-01 -1.6206726077794107e+00 -3.1979425536530024e+00 -1.0640573658485120e+00 -1.4680824163407427e+00 -4.4422614856521649e+00 -1.2177064851232846e+00 1.8114317527558566e+00 4.3434724412124339e+00 9.3082248858287131e-01 6.6061677672910823e-01 1.1947556063766578e+00 1.9966542027924681e+00 -6.6760264160985883e-01 -1.0342452670096245e+00 -1.7801153774048437e+00 -5.7108734592571486e-01 -1.1175696757368383e+00 -3.3537443393670032e+00 8.5539115158852486e-01 1.2993445354002295e+00 3.6773320800450557e+00 4.7557728084531681e-01 1.0498780255799298e+00 9.6884824094764033e-01 -7.0750037904024010e-01 -1.0625779727056170e+00 -1.2332486609310336e+00 -6.3064517081385474e-01 -1.2539624453187641e+00 -2.0579476840352968e+00 5.8525032822671896e-01 9.2437719341402791e-01 1.7822215379530124e+00 2.1061317157014314e+00 1.3909981373291049e+00 4.0313601915084268e-01 -2.3553338619844082e+00 -1.4996536808850560e+00 -3.0050690500366689e-01 -1.3580194116094162e+00 -1.3673310244673380e+00 -2.8106515922987524e-01 1.5153711461662702e+00 1.3744323755507251e+00 4.7557728084531675e-01 3.7924531865253028e+00 1.6018444784658772e+00 3.2844159933319722e-01 -3.9182560891545517e+00 -1.7898205954160560e+00 -5.0913921405003393e-01 -2.1219541438107847e+00 -1.3782168725164317e+00 -4.7438307530829255e-01 2.3396074581661579e+00 1.6677471819391751e+00 3.5793945426251128e-01 1.4083895333921530e+00 4.6931497194458052e+00 9.3838585885184422e-01 -1.7928432263520637e+00 -4.6413031554498687e+00 -6.3455384712459528e-01 -1.4003422121134457e+00 -4.0378944155229162e+00 -6.7395086750528810e-01 1.6917204082287456e+00 3.5459840959665225e+00 1.0498780255799298e+00 1.6018444784658772e+00 6.8611976988370671e+00 7.6543337280768364e-01 -1.7362064204776944e+00 -6.2725641045682385e+00 -1.0002140595033751e+00 -1.4045341004386098e+00 -4.7994011368167424e+00 -1.1262994035303300e+00 1.6319715392950382e+00 4.6508312981083737e+00 6.8132092042412906e-01 4.2633938023917162e-01 9.7818203592985831e-01 1.7434595894557761e+00 -3.5320297985235460e-01 -6.1453638762423968e-01 -1.6410393365908795e+00 -2.7371462113377992e-01 -6.4093114287522712e-01 -9.0386893965213966e-01 4.0894381777915878e-01 7.4138853535646565e-01 9.6884824094764033e-01 3.2844159933319722e-01 7.6543337280768364e-01 3.2652363180087058e+00 -5.1994169976573446e-01 -1.0513803872876260e+00 -3.2906879252037147e+00 -3.5489737242260333e-01 -8.3637184566651857e-01 -1.7966340195637827e+00 3.3803187582294492e-01 6.5821581935960416e-01 1.6546860725983936e+00 -2.3345890565561747e+00 -1.6564567326636821e+00 -6.8312891493280015e-01 2.6227698075824986e+00 1.7281380674369973e+00 5.6329290892300676e-01 1.5514264940629796e+00 1.6782337932684050e+00 4.2475525940848680e-01 -1.8487715347895413e+00 -1.6206726077794107e+00 -7.0750037904024010e-01 -3.9182560891545517e+00 -1.7362064204776946e+00 -5.1994169976573457e-01 4.2585257429947561e+00 1.8527176158120997e+00 7.8876917890351217e-01 2.3392423600519585e+00 1.5368543499129035e+00 6.3535905302532691e-01 -2.6703477241919269e+00 -1.7826080655096186e+00 -5.0160540652155716e-01 -1.4092791856098814e+00 -4.2794575085194104e+00 -1.1481005185179778e+00 1.7455738509529375e+00 4.2000205248020208e+00 8.8653501780682586e-01 1.3981242296610044e+00 3.5609895645410377e+00 7.6795714623645828e-01 -1.6200011659384943e+00 -3.1979425536530020e+00 -1.0625779727056170e+00 -1.7898205954160558e+00 -6.2725641045682385e+00 -1.0513803872876262e+00 1.8527176158120997e+00 5.8838328043831822e+00 1.2036135910173629e+00 1.5668653051543329e+00 4.3352315317977475e+00 1.1711130465706825e+00 -1.7441800546159438e+00 -4.2301102587833377e+00 -7.6715992312010739e-01 -6.0233042422061633e-01 -1.1894368686366106e+00 -2.0036515915311965e+00 5.4916808777560577e-01 8.5374986460891789e-01 1.7471723751744719e+00 4.8388987986975535e-01 1.0400308908483031e+00 1.0027106853113774e+00 -7.0818972360913446e-01 -1.0640573658485120e+00 -1.2332486609310336e+00 -5.0913921405003382e-01 -1.0002140595033751e+00 -3.2906879252037147e+00 7.8876917890351217e-01 1.2036135910173631e+00 3.5595916028660830e+00 6.4013266602062335e-01 1.1589505941303573e+00 2.0050748965145266e+00 -6.4230045068971220e-01 -1.0026366466164440e+00 -1.7869613822005135e+00 -1.3385666581845366e+00 -1.2860717428546695e+00 -5.1626270052759227e-01 1.5481363669156127e+00 1.3983787529242901e+00 3.9221773007866623e-01 2.1754816008127893e+00 1.4601391760171745e+00 4.4699376753376885e-01 -2.3925203507041277e+00 -1.4680824163407427e+00 -6.3064517081385474e-01 -2.1219541438107847e+00 -1.4045341004386096e+00 -3.5489737242260333e-01 2.3392423600519590e+00 1.5668653051543326e+00 6.4013266602062335e-01 3.7919045611716924e+00 1.5700567206336213e+00 6.2487651421204404e-01 -4.0017237362526057e+00 -1.8367516950953982e+00 -6.0241543408105158e-01 -1.2975629242231386e+00 -3.6959521152713606e+00 -1.1733133068765400e+00 1.6527752057460698e+00 3.5895181623414976e+00 7.4796733425676132e-01 1.4817348063321609e+00 4.8765505719936764e+00 1.0297223576978620e+00 -1.7466635405578717e+00 -4.4422614856521641e+00 -1.2539624453187641e+00 -1.3782168725164319e+00 -4.7994011368167424e+00 -8.3637184566651845e-01 1.5368543499129035e+00 4.3352315317977475e+00 1.1589505941303573e+00 1.5700567206336216e+00 6.6090046153075273e+00 1.4030028515438295e+00 -1.8189777453273150e+00 -6.4726901437001825e+00 -1.0759955397669863e+00 -5.2840710243339029e-01 -1.1902802172010811e+00 -1.2454887315181502e+00 6.0626991157317522e-01 9.9734675262851091e-01 9.9675103441205404e-01 4.5313851560693552e-01 1.0268690872232953e+00 1.8083736455131973e+00 -7.2631086866459960e-01 -1.2177064851232846e+00 -2.0579476840352964e+00 -4.7438307530829260e-01 -1.1262994035303300e+00 -1.7966340195637827e+00 6.3535905302532703e-01 1.1711130465706825e+00 2.0050748965145262e+00 6.2487651421204427e-01 1.4030028515438295e+00 3.6508111737263498e+00 -5.9054294801119989e-01 -1.0640456321116234e+00 -3.3609403150488975e+00 1.5228677534297508e+00 1.6311114047980495e+00 5.8944392820281299e-01 -1.8703606497024818e+00 -1.7264253543065693e+00 -3.6464009347523646e-01 -2.4186517271374139e+00 -1.8524008899551663e+00 -3.8263997284871998e-01 2.6822955656608114e+00 1.8114317527558570e+00 5.8525032822671885e-01 2.3396074581661574e+00 1.6319715392950382e+00 3.3803187582294492e-01 -2.6703477241919269e+00 -1.7441800546159436e+00 -6.4230045068971220e-01 -4.0017237362526057e+00 -1.8189777453273148e+00 -5.9054294801119989e-01 4.4163130600277096e+00 2.0674693473560497e+00 4.6739733277239104e-01 1.4083560128817678e+00 3.5601406213199853e+00 9.8536672390614410e-01 -1.7513046195588338e+00 -3.5084935367359584e+00 -5.7767365159228778e-01 -1.5962737144776278e+00 -4.7964407546952987e+00 -6.7784823915670667e-01 1.8233655524644858e+00 4.3434724412124339e+00 9.2437719341402791e-01 1.6677471819391751e+00 4.6508312981083737e+00 6.5821581935960416e-01 -1.7826080655096184e+00 -4.2301102587833377e+00 -1.0026366466164440e+00 -1.8367516950953982e+00 -6.4726901437001816e+00 -1.0640456321116234e+00 2.0674693473560497e+00 6.4532903332739853e+00 7.5424443279728470e-01 4.0414817717312884e-01 7.6662039309633834e-01 9.7862175738136792e-01 -3.8198078938528118e-01 -5.9657695675142275e-01 -8.9278926427485772e-01 -3.3823916103713164e-01 -6.9327581526210691e-01 -1.6764906956857717e+00 5.9475582681699046e-01 9.3082248858287131e-01 1.7822215379530124e+00 3.5793945426251128e-01 6.8132092042412906e-01 1.6546860725983936e+00 -5.0160540652155716e-01 -7.6715992312010728e-01 -1.7869613822005135e+00 -6.0241543408105147e-01 -1.0759955397669863e+00 -3.3609403150488975e+00 4.6739733277239109e-01 7.5424443279728470e-01 3.3016522892772660e+00 567 568 569 615 616 617 627 628 629 579 580 581 570 571 572 618 619 620 630 631 632 582 583 584 3.5160457733564874e+00 1.4158019147151604e+00 5.6741318416789277e-01 -3.6747096088352809e+00 -1.6831457257896567e+00 -5.5094685639528784e-01 -1.9599255169298864e+00 -1.3220886881228189e+00 -3.4198064778881365e-01 2.1686601970972781e+00 1.4798478073023242e+00 6.2319107703683607e-01 1.9333691289048478e+00 1.2798344091626297e+00 3.8841627675166268e-01 -2.1653104646791324e+00 -1.2852759059172314e+00 -5.6489470679438014e-01 -1.2119949284585469e+00 -1.1713139802264594e+00 -4.8867978034991422e-01 1.3938654195442344e+00 1.2863401688760512e+00 3.6748145337200477e-01 1.4158019147151608e+00 6.0810700246784668e+00 1.2839096588557757e+00 -1.6597274708773513e+00 -5.8872144480741024e+00 -9.5975673110462734e-01 -1.3020311857067650e+00 -4.5024765050889757e+00 -8.0506023834147900e-01 1.4660092411432193e+00 4.0305854828828069e+00 1.1232496408460957e+00 1.2634820849363535e+00 4.3616692644846662e+00 9.1262230888360407e-01 -1.5363183625592831e+00 -3.9461993205111705e+00 -1.1223753661142866e+00 -1.1614277628136529e+00 -3.4115581415712848e+00 -1.1255236691453940e+00 1.5142115411623194e+00 3.2741236431995953e+00 6.9293439612031238e-01 5.6741318416789277e-01 1.2839096588557757e+00 3.4048939358843739e+00 -5.2709510655160507e-01 -9.2872211358184220e-01 -3.0596706545563652e+00 -4.4593292208466850e-01 -1.0665779518373861e+00 -1.6593591184179775e+00 6.1274803892777008e-01 1.1170905503014972e+00 1.8658561968875365e+00 3.6258049011537857e-01 8.6541527216271286e-01 1.6135735865715437e+00 -6.4962701605509521e-01 -1.0800345305051071e+00 -1.8862737653187889e+00 -4.7690713816515318e-01 -1.1077713251786108e+00 -1.1698761473927071e+00 5.5682046964548082e-01 9.1669043978296016e-01 8.9085596634238451e-01 -3.6747096088352809e+00 -1.6597274708773511e+00 -5.2709510655160496e-01 4.0659938849509905e+00 1.9065013350087292e+00 3.9763284696491541e-01 2.2084297709519451e+00 1.5826629999873574e+00 3.2879614157516990e-01 -2.5389098107919801e+00 -1.6796553632106515e+00 -6.3149274625075957e-01 -2.1851607182366930e+00 -1.6727930664411452e+00 -3.1251129160739288e-01 2.4612902563933536e+00 1.6246965746254771e+00 5.1095359898448423e-01 1.4180051885472658e+00 1.5335199715740053e+00 5.7360512745795544e-01 -1.7549389629796011e+00 -1.6352049806664208e+00 -3.3988857057276822e-01 -1.6831457257896569e+00 -5.8872144480741024e+00 -9.2872211358184198e-01 1.9065013350087290e+00 5.8280817980463917e+00 6.2396465492158715e-01 1.5911493597086126e+00 4.3717497751005165e+00 6.1797227770099072e-01 -1.7120509885972126e+00 -3.9420113442322862e+00 -9.6171836974295832e-01 -1.3773113024971950e+00 -4.3132322123189306e+00 -5.4066747922387071e-01 1.6089611130494559e+00 3.8664585667221032e+00 7.8178170043735251e-01 1.2766969003577429e+00 3.3031626116491051e+00 9.2936122476493788e-01 -1.6108006912404769e+00 -3.2269947468927964e+00 -5.2197189527619881e-01 -5.5094685639528795e-01 -9.5975673110462700e-01 -3.0596706545563648e+00 3.9763284696491552e-01 6.2396465492158726e-01 2.9780594515558731e+00 3.1822574635899642e-01 5.9562462462701382e-01 1.5278401537440622e+00 -4.6584706911886969e-01 -6.9316993685800554e-01 -1.6438769094565493e+00 -2.6122990836436916e-01 -5.5862542817088734e-01 -1.5183804032012738e+00 5.2925475034343217e-01 8.2007155154215605e-01 1.6192913171993313e+00 3.5735994503481716e-01 6.7768338371750403e-01 9.1016075669334029e-01 -3.2444945482363485e-01 -5.0579211867474139e-01 -8.1342371197841867e-01 -1.9599255169298866e+00 -1.3020311857067650e+00 -4.4593292208466850e-01 2.2084297709519456e+00 1.5911493597086124e+00 3.1822574635899642e-01 3.4939965159296458e+00 1.5742029712098431e+00 3.2460324284675268e-01 -3.6868890211681067e+00 -1.7463615153819647e+00 -5.2172143376613056e-01 -1.2315151838091438e+00 -1.2750288347470193e+00 -2.3613938587936292e-01 1.4220816004162748e+00 1.2770424566796357e+00 4.4390071072979009e-01 1.9615203690202960e+00 1.3424494330829551e+00 4.1105367746228411e-01 -2.2076985344110271e+00 -1.4614226848452976e+00 -2.9398963566766184e-01 -1.3220886881228189e+00 -4.5024765050889757e+00 -1.0665779518373861e+00 1.5826629999873574e+00 4.3717497751005165e+00 5.9562462462701382e-01 1.5742029712098433e+00 6.5045036928861313e+00 7.5362842153790677e-01 -1.7532321049768651e+00 -5.9629984610834841e+00 -1.0338551525121704e+00 -1.2418549859907904e+00 -3.7603242272532218e+00 -5.6740843625461235e-01 1.5637799806372845e+00 3.2727375639802103e+00 9.7493193556170610e-01 1.3220355412978237e+00 4.4903256551298121e+00 9.5310392324643689e-01 -1.7255057140418359e+00 -4.4135174936709873e+00 -6.0944736436889635e-01 -3.4198064778881365e-01 -8.0506023834147900e-01 -1.6593591184179775e+00 3.2879614157516990e-01 6.1797227770099061e-01 1.5278401537440622e+00 3.2460324284675263e-01 7.5362842153790699e-01 2.9757478521159642e+00 -5.1859292906320142e-01 -1.0240126300141246e+00 -3.0614123551580108e+00 -2.4161215728153768e-01 -5.9602443500027313e-01 -8.2282891297715244e-01 3.8343764313171824e-01 6.9686013363657007e-01 9.1459622334954793e-01 4.0253134541730018e-01 9.4994961437688652e-01 1.6398906686759438e+00 -3.3718263883738858e-01 -5.9331314389647749e-01 -1.5144745113323779e+00 2.1686601970972781e+00 1.4660092411432195e+00 6.1274803892777008e-01 -2.5389098107919801e+00 -1.7120509885972124e+00 -4.6584706911886958e-01 -3.6868890211681067e+00 -1.7532321049768653e+00 -5.1859292906320142e-01 4.1062224220382699e+00 1.8468378963984609e+00 8.1505494105857779e-01 1.3852867794792099e+00 1.5745885450803214e+00 3.6889101966707749e-01 -1.7332473519554532e+00 -1.4991165329980713e+00 -6.7635246225278300e-01 -2.1806943458937411e+00 -1.6148876279182125e+00 -6.8860973613592924e-01 2.4795711311945223e+00 1.6918515718683598e+00 5.5270819691735851e-01 1.4798478073023242e+00 4.0305854828828060e+00 1.1170905503014970e+00 -1.6796553632106512e+00 -3.9420113442322862e+00 -6.9316993685800576e-01 -1.7463615153819649e+00 -5.9629984610834841e+00 -1.0240126300141246e+00 1.8468378963984606e+00 5.6287327577280344e+00 1.2138016834080858e+00 1.2543066172040240e+00 3.2574089710714476e+00 6.7366265891252053e-01 -1.5037394107053796e+00 -2.9134825688242247e+00 -9.9614912513665355e-01 -1.3330068698347899e+00 -4.0540885709614587e+00 -1.1426234987128674e+00 1.6817708382279779e+00 3.9558537334191648e+00 8.5140029809954876e-01 6.2319107703683607e-01 1.1232496408460957e+00 1.8658561968875367e+00 -6.3149274625075957e-01 -9.6171836974295810e-01 -1.6438769094565493e+00 -5.2172143376613056e-01 -1.0338551525121702e+00 -3.0614123551580108e+00 8.1505494105857779e-01 1.2138016834080860e+00 3.4045553793438712e+00 4.3580753222781288e-01 9.8486150996143118e-01 8.8191632368063677e-01 -6.7747308241019366e-01 -9.9475178650965101e-01 -1.1595262859485731e+00 -5.8982911182526621e-01 -1.1812427612315330e+00 -1.9031640216321004e+00 5.4646282392912404e-01 8.4965523578069946e-01 1.6156516722831904e+00 1.9333691289048478e+00 1.2634820849363537e+00 3.6258049011537857e-01 -2.1851607182366930e+00 -1.3773113024971950e+00 -2.6122990836436916e-01 -1.2315151838091440e+00 -1.2418549859907906e+00 -2.4161215728153768e-01 1.3852867794792099e+00 1.2543066172040243e+00 4.3580753222781288e-01 3.5048916321913155e+00 1.4604409482203260e+00 2.8603526532435553e-01 -3.6243314620087266e+00 -1.6573827735305526e+00 -4.6378093653942065e-01 -1.9232912985147812e+00 -1.2446167049970693e+00 -4.3308227180470849e-01 2.1407511219939721e+00 1.5429361166549032e+00 3.1528198632248955e-01 1.2798344091626301e+00 4.3616692644846653e+00 8.6541527216271275e-01 -1.6727930664411454e+00 -4.3132322123189315e+00 -5.5862542817088723e-01 -1.2750288347470193e+00 -3.7603242272532218e+00 -5.9602443500027313e-01 1.5745885450803214e+00 3.2574089710714476e+00 9.8486150996143129e-01 1.4604409482203258e+00 6.4008667467436542e+00 6.8171602952964638e-01 -1.6021681289070386e+00 -5.7973931612983742e+00 -9.2158268783760544e-01 -1.2729526088473420e+00 -4.4355809257328858e+00 -1.0567372719990462e+00 1.5080787364792689e+00 4.2865855443036454e+00 6.0097701135402248e-01 3.8841627675166268e-01 9.1262230888360407e-01 1.6135735865715437e+00 -3.1251129160739288e-01 -5.4066747922387060e-01 -1.5183804032012738e+00 -2.3613938587936290e-01 -5.6740843625461235e-01 -8.2282891297715255e-01 3.6889101966707749e-01 6.7366265891252042e-01 8.8191632368063677e-01 2.8603526532435558e-01 6.8171602952964661e-01 3.0292555057533010e+00 -4.7730327763810321e-01 -9.7875929457583699e-01 -3.0443865855313463e+00 -3.1516452757979924e-01 -7.6243958932786671e-01 -1.6428474876993389e+00 2.9777592096156280e-01 5.8127380205641599e-01 1.5036979734036309e+00 -2.1653104646791324e+00 -1.5363183625592831e+00 -6.4962701605509510e-01 2.4612902563933532e+00 1.6089611130494559e+00 5.2925475034343217e-01 1.4220816004162748e+00 1.5637799806372845e+00 3.8343764313171824e-01 -1.7332473519554532e+00 -1.5037394107053794e+00 -6.7747308241019366e-01 -3.6243314620087261e+00 -1.6021681289070386e+00 -4.7730327763810321e-01 3.9849300789442155e+00 1.7191477817288785e+00 7.5405008126735540e-01 2.1401439270442228e+00 1.4119315863693345e+00 5.9884665263378889e-01 -2.4855565841547560e+00 -1.6615945596132520e+00 -4.6118575127290329e-01 -1.2852759059172314e+00 -3.9461993205111705e+00 -1.0800345305051071e+00 1.6246965746254771e+00 3.8664585667221032e+00 8.2007155154215605e-01 1.2770424566796357e+00 3.2727375639802103e+00 6.9686013363657007e-01 -1.4991165329980713e+00 -2.9134825688242247e+00 -9.9475178650965101e-01 -1.6573827735305522e+00 -5.7973931612983733e+00 -9.7875929457583699e-01 1.7191477817288789e+00 5.4170459153242545e+00 1.1268760598278116e+00 1.4397206196987713e+00 3.9667272338370649e+00 1.1006266097033621e+00 -1.6188322202869088e+00 -3.8658942292298635e+00 -6.9088874311930559e-01 -5.6489470679438014e-01 -1.1223753661142866e+00 -1.8862737653187889e+00 5.1095359898448423e-01 7.8178170043735262e-01 1.6192913171993315e+00 4.4390071072979009e-01 9.7493193556170610e-01 9.1459622334954793e-01 -6.7635246225278300e-01 -9.9614912513665343e-01 -1.1595262859485733e+00 -4.6378093653942082e-01 -9.2158268783760544e-01 -3.0443865855313463e+00 7.5405008126735551e-01 1.1268760598278114e+00 3.3318006848978561e+00 6.0261485546397675e-01 1.0879806032604988e+00 1.8597391814573261e+00 -6.0649114085902345e-01 -9.3146311999882347e-01 -1.6352407701053535e+00 -1.2119949284585469e+00 -1.1614277628136529e+00 -4.7690713816515318e-01 1.4180051885472658e+00 1.2766969003577429e+00 3.5735994503481716e-01 1.9615203690202960e+00 1.3220355412978240e+00 4.0253134541730018e-01 -2.1806943458937411e+00 -1.3330068698347897e+00 -5.8982911182526632e-01 -1.9232912985147810e+00 -1.2729526088473420e+00 -3.1516452757979924e-01 2.1401439270442228e+00 1.4397206196987713e+00 6.0261485546397675e-01 3.4196075774719583e+00 1.4133952209797995e+00 5.7531946666215406e-01 -3.6232964892166746e+00 -1.6844610408383534e+00 -5.5592483500803003e-01 -1.1713139802264594e+00 -3.4115581415712848e+00 -1.1077713251786108e+00 1.5335199715740053e+00 3.3031626116491046e+00 6.7768338371750403e-01 1.3424494330829551e+00 4.4903256551298121e+00 9.4994961437688652e-01 -1.6148876279182125e+00 -4.0540885709614587e+00 -1.1812427612315330e+00 -1.2446167049970693e+00 -4.4355809257328858e+00 -7.6243958932786682e-01 1.4119315863693345e+00 3.9667272338370645e+00 1.0879806032604988e+00 1.4133952209797997e+00 6.0359314595406000e+00 1.3196282929879590e+00 -1.6704778988643549e+00 -5.8949193218909510e+00 -9.8378821860483912e-01 -4.8867978034991427e-01 -1.1255236691453940e+00 -1.1698761473927071e+00 5.7360512745795544e-01 9.2936122476493788e-01 9.1016075669334029e-01 4.1105367746228405e-01 9.5310392324643689e-01 1.6398906686759438e+00 -6.8860973613592924e-01 -1.1426234987128674e+00 -1.9031640216321004e+00 -4.3308227180470849e-01 -1.0567372719990462e+00 -1.6428474876993389e+00 5.9884665263378889e-01 1.1006266097033621e+00 1.8597391814573261e+00 5.7531946666215417e-01 1.3196282929879595e+00 3.3405028916219246e+00 -5.4845313592563105e-01 -9.7783561084538828e-01 -3.0344058417243893e+00 1.3938654195442344e+00 1.5142115411623194e+00 5.5682046964548082e-01 -1.7549389629796011e+00 -1.6108006912404766e+00 -3.2444945482363491e-01 -2.2076985344110271e+00 -1.7255057140418362e+00 -3.3718263883738869e-01 2.4795711311945223e+00 1.6817708382279777e+00 5.4646282392912393e-01 2.1407511219939721e+00 1.5080787364792689e+00 2.9777592096156286e-01 -2.4855565841547560e+00 -1.6188322202869088e+00 -6.0649114085902345e-01 -3.6232964892166746e+00 -1.6704778988643549e+00 -5.4845313592563105e-01 4.0573028980293300e+00 1.9215554085640112e+00 4.1551715590951105e-01 1.2863401688760512e+00 3.2741236431995953e+00 9.1669043978296016e-01 -1.6352049806664208e+00 -3.2269947468927960e+00 -5.0579211867474139e-01 -1.4614226848452974e+00 -4.4135174936709873e+00 -5.9331314389647749e-01 1.6918515718683595e+00 3.9558537334191648e+00 8.4965523578069946e-01 1.5429361166549029e+00 4.2865855443036462e+00 5.8127380205641588e-01 -1.6615945596132520e+00 -3.8658942292298635e+00 -9.3146311999882347e-01 -1.6844610408383531e+00 -5.8949193218909519e+00 -9.7783561084538817e-01 1.9215554085640107e+00 5.8847628707621924e+00 6.6078451579535635e-01 3.6748145337200472e-01 6.9293439612031238e-01 8.9085596634238451e-01 -3.3988857057276828e-01 -5.2197189527619869e-01 -8.1342371197841878e-01 -2.9398963566766184e-01 -6.0944736436889646e-01 -1.5144745113323779e+00 5.5270819691735851e-01 8.5140029809954876e-01 1.6156516722831904e+00 3.1528198632248955e-01 6.0097701135402248e-01 1.5036979734036309e+00 -4.6118575127290334e-01 -6.9088874311930559e-01 -1.6352407701053535e+00 -5.5592483500803003e-01 -9.8378821860483923e-01 -3.0344058417243893e+00 4.1551715590951099e-01 6.6078451579535658e-01 2.9873392231113347e+00 531 532 533 579 580 581 591 592 593 543 544 545 534 535 536 582 583 584 594 595 596 546 547 548 3.5445669964675290e+00 9.6627084344911651e-01 3.6737051198158099e-01 -3.6116200993107905e+00 -1.3064345080453310e+00 -4.2495370841168323e-01 -1.8136109676316883e+00 -8.7038831057590116e-01 -2.3092811262743970e-01 1.9359336186395437e+00 1.1491066140193467e+00 4.4960869047061419e-01 1.8090049570621181e+00 8.6712730576383601e-01 2.6208868841762029e-01 -1.9592518856484544e+00 -9.7575778206979735e-01 -3.9371605847723801e-01 -9.9291456857654037e-01 -7.8134598871263905e-01 -3.0794796660928764e-01 1.0878919489982832e+00 9.5142182617136950e-01 2.7847795525583308e-01 9.6627084344911651e-01 7.5570607090910187e+00 1.6167516036092915e+00 -1.2890966208399521e+00 -7.4684567185683610e+00 -1.2941808664498107e+00 -8.5912795021422039e-01 -5.6407023360225992e+00 -1.0686895016208608e+00 1.1355684553774992e+00 5.2441294126282241e+00 1.4306676991065523e+00 8.5444199194706782e-01 5.5221146663373215e+00 1.1892740446333963e+00 -1.2428199276200165e+00 -5.1704892320953997e+00 -1.4324101490871410e+00 -7.7150754380538789e-01 -4.3665162975472294e+00 -1.3928346563627971e+00 1.2062707517058935e+00 4.3228597961770276e+00 9.5142182617136939e-01 3.6737051198158099e-01 1.6167516036092915e+00 3.9414093078387435e+00 -4.1248736084081217e-01 -1.2705671370959639e+00 -3.6022224749833724e+00 -2.8783548765139000e-01 -1.3481389687875349e+00 -1.9677709884176731e+00 4.4166966536115432e-01 1.4252266515187444e+00 2.1729597883370273e+00 2.4960730819264107e-01 1.1506728681220262e+00 1.9347164785360373e+00 -4.9090592953692508e-01 -1.4034953997653798e+00 -2.2029814377470029e+00 -3.0055456311197043e-01 -1.3767203693070766e+00 -1.3640026225620427e+00 4.3313585560572126e-01 1.2062707517058928e+00 1.0878919489982830e+00 -3.6116200993107901e+00 -1.2890966208399526e+00 -4.1248736084081222e-01 3.9048765509785039e+00 1.6275510726471900e+00 3.6392828433137941e-01 1.9592260037230420e+00 1.2112974198364757e+00 2.6951824239090083e-01 -2.2156819073604721e+00 -1.4492282296570869e+00 -5.0761861548664100e-01 -1.9670087218792303e+00 -1.3298964825874233e+00 -2.7860715166746275e-01 2.1823815965362914e+00 1.4033200919612356e+00 4.3021277305537575e-01 1.1118291998746981e+00 1.2188874050023581e+00 4.4300179482654722e-01 -1.3640026225620425e+00 -1.3928346563627960e+00 -3.0794796660928730e-01 -1.3064345080453310e+00 -7.4684567185683610e+00 -1.2705671370959637e+00 1.6275510726471900e+00 7.4967855279985107e+00 9.4707885121888447e-01 1.2178181323559820e+00 5.6182789151277124e+00 8.8998231608461753e-01 -1.4702186945881683e+00 -5.2503916950772691e+00 -1.2763128658363441e+00 -1.0290892255067272e+00 -5.5655476198302987e+00 -8.2151521692793761e-01 1.3939879173871530e+00 5.1806564799859034e+00 1.0937926362670236e+00 9.4310567505698006e-01 4.3551914079110352e+00 1.2188874050023590e+00 -1.3767203693070775e+00 -4.3665162975472303e+00 -7.8134598871263894e-01 -4.2495370841168323e-01 -1.2941808664498109e+00 -3.6022224749833724e+00 3.6392828433137941e-01 9.4707885121888458e-01 3.4898402729245470e+00 2.6620388667611411e-01 8.7537855941130460e-01 1.8199612068817337e+00 -4.0048407596282820e-01 -9.8859578459787656e-01 -1.9562041305862261e+00 -2.1619888921440655e-01 -8.3460209145182884e-01 -1.8124661248690257e+00 4.3812590912515109e-01 1.1233232006177354e+00 1.9421766193341852e+00 2.7393315656824424e-01 9.4310567505698062e-01 1.1118291998746985e+00 -3.0055456311197093e-01 -7.7150754380538877e-01 -9.9291456857654026e-01 -1.8136109676316885e+00 -8.5912795021422039e-01 -2.8783548765138994e-01 1.9592260037230420e+00 1.2178181323559820e+00 2.6620388667611422e-01 3.4953667276487606e+00 1.0435287431994991e+00 2.3321772778276795e-01 -3.6076465948135295e+00 -1.3380455585465238e+00 -3.8248848176380773e-01 -1.0003982833423557e+00 -8.3832732592129899e-01 -1.7468363757105332e-01 1.1148728959517122e+00 9.5286114466280580e-01 3.0699586276390750e-01 1.8199612068817381e+00 8.8998231608461975e-01 2.6951824239090194e-01 -1.9677709884176773e+00 -1.0686895016208635e+00 -2.3092811262744029e-01 -8.7038831057590138e-01 -5.6407023360225992e+00 -1.3481389687875351e+00 1.2112974198364754e+00 5.6182789151277124e+00 8.7537855941130460e-01 1.0435287431994988e+00 7.9715527953410197e+00 1.0435287431994973e+00 -1.3369405067820845e+00 -7.5307080851741741e+00 -1.3369405067820839e+00 -8.1907765276917122e-01 -4.7342486501376717e+00 -8.1907765276917244e-01 1.2443407164674143e+00 4.3382507817605971e+00 1.2443407164674143e+00 8.7537855941130394e-01 5.6182789151277159e+00 1.2112974198364770e+00 -1.3481389687875358e+00 -5.6407023360226027e+00 -8.7038831057590127e-01 -2.3092811262743973e-01 -1.0686895016208611e+00 -1.9677709884176731e+00 2.6951824239090078e-01 8.8998231608461753e-01 1.8199612068817337e+00 2.3321772778276795e-01 1.0435287431994973e+00 3.4953667276487597e+00 -3.8248848176380729e-01 -1.3380455585465223e+00 -3.6076465948135295e+00 -1.7468363757105265e-01 -8.3832732592129700e-01 -1.0003982833423557e+00 3.0699586276390672e-01 9.5286114466280381e-01 1.1148728959517114e+00 2.6620388667611372e-01 1.2178181323559807e+00 1.9592260037230451e+00 -2.8783548765138950e-01 -8.5912795021421906e-01 -1.8136109676316918e+00 1.9359336186395437e+00 1.1355684553774992e+00 4.4166966536115432e-01 -2.2156819073604721e+00 -1.4702186945881683e+00 -4.0048407596282826e-01 -3.6076465948135295e+00 -1.3369405067820845e+00 -3.8248848176380718e-01 3.9420448066443692e+00 1.5708672689008636e+00 6.2938322292125171e-01 1.0836254153298830e+00 1.2483382807428118e+00 3.0071906481915006e-01 -1.3550309961905969e+00 -1.3019696369211300e+00 -5.3078947035889357e-01 -1.9562041305862294e+00 -1.2763128658363447e+00 -5.0761861548664189e-01 2.1729597883370317e+00 1.4306676991065537e+00 4.4960869047061452e-01 1.1491066140193467e+00 5.2441294126282241e+00 1.4252266515187442e+00 -1.4492282296570869e+00 -5.2503916950772682e+00 -9.8859578459787656e-01 -1.3380455585465234e+00 -7.5307080851741732e+00 -1.3380455585465223e+00 1.5708672689008634e+00 7.2469677661292913e+00 1.5708672689008631e+00 9.3560340417658605e-01 4.3140146288418686e+00 9.3560340417658716e-01 -1.3049343658140544e+00 -4.0177497448988966e+00 -1.3049343658140546e+00 -9.8859578459787600e-01 -5.2503916950772727e+00 -1.4492282296570889e+00 1.4252266515187451e+00 5.2441294126282285e+00 1.1491066140193471e+00 4.4960869047061419e-01 1.4306676991065523e+00 2.1729597883370273e+00 -5.0761861548664100e-01 -1.2763128658363441e+00 -1.9562041305862261e+00 -3.8248848176380773e-01 -1.3369405067820839e+00 -3.6076465948135295e+00 6.2938322292125171e-01 1.5708672689008631e+00 3.9420448066443692e+00 3.0071906481914945e-01 1.2483382807428112e+00 1.0836254153298834e+00 -5.3078947035889323e-01 -1.3019696369211293e+00 -1.3550309961905969e+00 -4.0048407596282776e-01 -1.4702186945881679e+00 -2.2156819073604757e+00 4.4166966536115443e-01 1.1355684553774987e+00 1.9359336186395468e+00 1.8090049570621181e+00 8.5444199194706782e-01 2.4960730819264107e-01 -1.9670087218792303e+00 -1.0290892255067272e+00 -2.1619888921440661e-01 -1.0003982833423559e+00 -8.1907765276917122e-01 -1.7468363757105265e-01 1.0836254153298830e+00 9.3560340417658605e-01 3.0071906481914945e-01 3.5673241215613141e+00 9.8571689361591430e-01 2.1518741546721232e-01 -3.6147978423987404e+00 -1.2953542391691282e+00 -3.5811279844370120e-01 -1.8124661248690290e+00 -8.2151521692793694e-01 -2.7860715166746269e-01 1.9347164785360405e+00 1.1892740446333958e+00 2.6208868841762017e-01 8.6712730576383601e-01 5.5221146663373215e+00 1.1506728681220260e+00 -1.3298964825874233e+00 -5.5655476198302987e+00 -8.3460209145182884e-01 -8.3832732592129899e-01 -4.7342486501376726e+00 -8.3832732592129700e-01 1.2483382807428118e+00 4.3140146288418686e+00 1.2483382807428112e+00 9.8571689361591441e-01 7.9034270874942196e+00 9.8571689361591552e-01 -1.2490294482840385e+00 -7.3963271592124631e+00 -1.2490294482840385e+00 -8.3460209145182818e-01 -5.5655476198303031e+00 -1.3298964825874247e+00 1.1506728681220266e+00 5.5221146663373268e+00 8.6712730576383601e-01 2.6208868841762023e-01 1.1892740446333960e+00 1.9347164785360369e+00 -2.7860715166746275e-01 -8.2151521692793761e-01 -1.8124661248690257e+00 -1.7468363757105329e-01 -8.1907765276917255e-01 -1.0003982833423557e+00 3.0071906481915006e-01 9.3560340417658727e-01 1.0836254153298837e+00 2.1518741546721235e-01 9.8571689361591575e-01 3.5673241215613154e+00 -3.5811279844370153e-01 -1.2953542391691293e+00 -3.6147978423987408e+00 -2.1619888921440678e-01 -1.0290892255067290e+00 -1.9670087218792351e+00 2.4960730819264171e-01 8.5444199194706960e-01 1.8090049570621221e+00 -1.9592518856484544e+00 -1.2428199276200165e+00 -4.9090592953692508e-01 2.1823815965362914e+00 1.3939879173871530e+00 4.3812590912515109e-01 1.1148728959517122e+00 1.2443407164674143e+00 3.0699586276390672e-01 -1.3550309961905971e+00 -1.3049343658140546e+00 -5.3078947035889323e-01 -3.6147978423987408e+00 -1.2490294482840389e+00 -3.5811279844370153e-01 3.8926310501626076e+00 1.4970726206836598e+00 5.9818971187232395e-01 1.9421766193341887e+00 1.0937926362670236e+00 4.3021277305537625e-01 -2.2029814377470065e+00 -1.4324101490871417e+00 -3.9371605847723806e-01 -9.7575778206979724e-01 -5.1704892320953997e+00 -1.4034953997653798e+00 1.4033200919612356e+00 5.1806564799859034e+00 1.1233232006177354e+00 9.5286114466280569e-01 4.3382507817605971e+00 9.5286114466280381e-01 -1.3019696369211298e+00 -4.0177497448988966e+00 -1.3019696369211291e+00 -1.2953542391691282e+00 -7.3963271592124631e+00 -1.2953542391691293e+00 1.4970726206836598e+00 7.0554916265697551e+00 1.4970726206836598e+00 1.1233232006177354e+00 5.1806564799859078e+00 1.4033200919612372e+00 -1.4034953997653810e+00 -5.1704892320954041e+00 -9.7575778206979757e-01 -3.9371605847723801e-01 -1.4324101490871415e+00 -2.2029814377470029e+00 4.3021277305537581e-01 1.0937926362670236e+00 1.9421766193341854e+00 3.0699586276390750e-01 1.2443407164674143e+00 1.1148728959517114e+00 -5.3078947035889357e-01 -1.3049343658140546e+00 -1.3550309961905969e+00 -3.5811279844370120e-01 -1.2490294482840389e+00 -3.6147978423987412e+00 5.9818971187232395e-01 1.4970726206836598e+00 3.8926310501626071e+00 4.3812590912515104e-01 1.3939879173871534e+00 2.1823815965362949e+00 -4.9090592953692563e-01 -1.2428199276200167e+00 -1.9592518856484578e+00 -9.9291456857654037e-01 -7.7150754380538789e-01 -3.0055456311197037e-01 1.1118291998746981e+00 9.4310567505697995e-01 2.7393315656824424e-01 1.8199612068817381e+00 8.7537855941130394e-01 2.6620388667611367e-01 -1.9562041305862294e+00 -9.8859578459787600e-01 -4.0048407596282776e-01 -1.8124661248690292e+00 -8.3460209145182818e-01 -2.1619888921440678e-01 1.9421766193341887e+00 1.1233232006177354e+00 4.3812590912515104e-01 3.4898402729245612e+00 9.4707885121888502e-01 3.6392828433137991e-01 -3.6022224749833875e+00 -1.2941808664498122e+00 -4.2495370841168389e-01 -7.8134598871263905e-01 -4.3665162975472294e+00 -1.3767203693070766e+00 1.2188874050023581e+00 4.3551914079110343e+00 9.4310567505698062e-01 8.8998231608461975e-01 5.6182789151277159e+00 1.2178181323559807e+00 -1.2763128658363447e+00 -5.2503916950772735e+00 -1.4702186945881679e+00 -8.2151521692793683e-01 -5.5655476198303031e+00 -1.0290892255067290e+00 1.0937926362670238e+00 5.1806564799859087e+00 1.3939879173871534e+00 9.4707885121888480e-01 7.4967855279985285e+00 1.6275510726471922e+00 -1.2705671370959655e+00 -7.4684567185683823e+00 -1.3064345080453332e+00 -3.0794796660928764e-01 -1.3928346563627969e+00 -1.3640026225620427e+00 4.4300179482654722e-01 1.2188874050023590e+00 1.1118291998746987e+00 2.6951824239090189e-01 1.2112974198364770e+00 1.9592260037230451e+00 -5.0761861548664178e-01 -1.4492282296570889e+00 -2.2156819073604757e+00 -2.7860715166746264e-01 -1.3298964825874249e+00 -1.9670087218792354e+00 4.3021277305537631e-01 1.4033200919612372e+00 2.1823815965362954e+00 3.6392828433137986e-01 1.6275510726471925e+00 3.9048765509785195e+00 -4.1248736084081289e-01 -1.2890966208399552e+00 -3.6116200993108061e+00 1.0878919489982832e+00 1.2062707517058935e+00 4.3313585560572132e-01 -1.3640026225620425e+00 -1.3767203693070778e+00 -3.0055456311197093e-01 -1.9677709884176773e+00 -1.3481389687875356e+00 -2.8783548765138955e-01 2.1729597883370313e+00 1.4252266515187451e+00 4.4166966536115443e-01 1.9347164785360405e+00 1.1506728681220268e+00 2.4960730819264171e-01 -2.2029814377470065e+00 -1.4034953997653812e+00 -4.9090592953692563e-01 -3.6022224749833871e+00 -1.2705671370959655e+00 -4.1248736084081306e-01 3.9414093078387573e+00 1.6167516036092944e+00 3.6737051198158166e-01 9.5142182617136950e-01 4.3228597961770276e+00 1.2062707517058928e+00 -1.3928346563627960e+00 -4.3665162975472303e+00 -7.7150754380538888e-01 -1.0686895016208635e+00 -5.6407023360226027e+00 -8.5912795021421906e-01 1.4306676991065534e+00 5.2441294126282285e+00 1.1355684553774987e+00 1.1892740446333958e+00 5.5221146663373268e+00 8.5444199194706971e-01 -1.4324101490871413e+00 -5.1704892320954041e+00 -1.2428199276200167e+00 -1.2941808664498122e+00 -7.4684567185683823e+00 -1.2890966208399552e+00 1.6167516036092944e+00 7.5570607090910373e+00 9.6627084344911829e-01 2.7847795525583308e-01 9.5142182617136961e-01 1.0878919489982830e+00 -3.0794796660928730e-01 -7.8134598871263894e-01 -9.9291456857654026e-01 -2.3092811262744029e-01 -8.7038831057590149e-01 -1.8136109676316918e+00 4.4960869047061458e-01 1.1491066140193471e+00 1.9359336186395468e+00 2.6208868841762017e-01 8.6712730576383601e-01 1.8090049570621221e+00 -3.9371605847723806e-01 -9.7575778206979757e-01 -1.9592518856484578e+00 -4.2495370841168378e-01 -1.3064345080453332e+00 -3.6116200993108052e+00 3.6737051198158160e-01 9.6627084344911840e-01 3.5445669964675428e+00 579 580 581 627 628 629 639 640 641 591 592 593 582 583 584 630 631 632 642 643 644 594 595 596 3.2388533182139563e+00 8.5015406747395850e-01 3.3032135855516215e-01 -3.2943175120958799e+00 -1.1963389621228757e+00 -3.9460262054091061e-01 -1.6513005804288932e+00 -7.6543945752901654e-01 -1.9994495878486179e-01 1.7676083505891838e+00 1.0510835769947799e+00 4.2094913301067277e-01 1.6302161825340196e+00 7.6395466152647540e-01 2.3050095548853339e-01 -1.7791852657838114e+00 -8.7566951406863469e-01 -3.6335036736583259e-01 -8.9580274888768552e-01 -6.8413681035871665e-01 -2.7630432924661591e-01 9.8392825585911015e-01 8.5639243808402932e-01 2.5243082888385249e-01 8.5015406747395839e-01 6.9218785770265461e+00 1.5121893538397126e+00 -1.1769959773244969e+00 -6.8257363242441702e+00 -1.1834479990070876e+00 -7.5370098699606281e-01 -5.1864075438079782e+00 -9.6842630210030234e-01 1.0345373668399716e+00 4.7810225235425410e+00 1.3333900030549692e+00 7.5075783808508356e-01 5.0535728109676112e+00 1.0922163711498669e+00 -1.1476782115852810e+00 -4.6969455012460308e+00 -1.3384808676973301e+00 -6.7322780117783787e-01 -3.9930505851715457e+00 -1.3038329973238600e+00 1.1161537046846655e+00 3.9456660429330275e+00 8.5639243808403120e-01 3.3032135855516215e-01 1.5121893538397129e+00 3.6429594035287112e+00 -3.8183469157875000e-01 -1.1608647557404947e+00 -3.2853047737670757e+00 -2.5519010493342337e-01 -1.2536523436231486e+00 -1.8029364242861585e+00 4.1219011326630373e-01 1.3300324155127579e+00 2.0146615333215725e+00 2.1857626636577965e-01 1.0550809097711040e+00 1.7520464676705991e+00 -4.6515205221914629e-01 -1.3092555547698312e+00 -2.0325455686800735e+00 -2.6896170286441157e-01 -1.2896837296747652e+00 -1.2728088936466870e+00 4.1005081340848587e-01 1.1161537046846643e+00 9.8392825585911070e-01 -3.2943175120958799e+00 -1.1769959773244969e+00 -3.8183469157874994e-01 3.6048676012021206e+00 1.5213010221371890e+00 3.2624762275444491e-01 1.7913877353882879e+00 1.1121943803674785e+00 2.3751436339703519e-01 -2.0587755991315326e+00 -1.3518725245532284e+00 -4.8011075738426495e-01 -1.7864857450553639e+00 -1.2352657267306051e+00 -2.4645637459308450e-01 2.0089728046410338e+00 1.3071424167097692e+00 4.0183473498084982e-01 1.0071596086980206e+00 1.1273294067177526e+00 4.1910943167038606e-01 -1.2728088936466866e+00 -1.3038329973238583e+00 -2.7630432924661641e-01 -1.1963389621228753e+00 -6.8257363242441720e+00 -1.1608647557404950e+00 1.5213010221371890e+00 6.8616284843187092e+00 8.3103108009862281e-01 1.1208605093901933e+00 5.1618521065639484e+00 7.8526664883462427e-01 -1.3744889547030372e+00 -4.7888313800455542e+00 -1.1778345842155644e+00 -9.2936427079651285e-01 -5.0994165338121391e+00 -7.1856433908719686e-01 1.2997863111716188e+00 4.7052086829810413e+00 9.9777335375097409e-01 8.4792807459818975e-01 3.9783455494097120e+00 1.1273294067177537e+00 -1.2896837296747654e+00 -3.9930505851715425e+00 -6.8413681035871843e-01 -3.9460262054091055e-01 -1.1834479990070876e+00 -3.2853047737670757e+00 3.2624762275444491e-01 8.3103108009862281e-01 3.1841151516007917e+00 2.3452621911640739e-01 7.7032002858493187e-01 1.6560577049670653e+00 -3.6943199391268178e-01 -8.8762933113374054e-01 -1.7899460909097322e+00 -1.8514420579969754e-01 -7.2969738080666280e-01 -1.6354690719543856e+00 4.0953019569043325e-01 1.0247233288435842e+00 1.7591902202530019e+00 2.4783648555641549e-01 8.4792807459818897e-01 1.0071596086980206e+00 -2.6896170286441140e-01 -6.7322780117783665e-01 -8.9580274888768563e-01 -1.6513005804288929e+00 -7.5370098699606281e-01 -2.5519010493342337e-01 1.7913877353882879e+00 1.1208605093901933e+00 2.3452621911640742e-01 3.2138719231627992e+00 9.2626829920643150e-01 1.9928519923214694e-01 -3.3143994862037474e+00 -1.2300326486396995e+00 -3.4536278385026270e-01 -9.0351080806494999e-01 -7.3978131215819865e-01 -1.4655540857767010e-01 1.0108299354655961e+00 8.5954579246301388e-01 2.7572747440062850e-01 1.6560577049670635e+00 7.8526664883462405e-01 2.3751436339703547e-01 -1.8029364242861567e+00 -9.6842630210030167e-01 -1.9994495878486221e-01 -7.6543945752901654e-01 -5.1864075438079791e+00 -1.2536523436231486e+00 1.1121943803674785e+00 5.1618521065639476e+00 7.7032002858493209e-01 9.2626829920643172e-01 7.3687970515045604e+00 9.2626829920643250e-01 -1.2255822296866403e+00 -6.9100356857951386e+00 -1.2255822296866403e+00 -7.2096415690658133e-01 -4.3688109224928091e+00 -7.2096415690658133e-01 1.1568554795865436e+00 3.9591604312714503e+00 1.1568554795865449e+00 7.7032002858493276e-01 5.1618521065639476e+00 1.1121943803674805e+00 -1.2536523436231493e+00 -5.1864075438079755e+00 -7.6543945752901865e-01 -1.9994495878486179e-01 -9.6842630210030245e-01 -1.8029364242861585e+00 2.3751436339703524e-01 7.8526664883462427e-01 1.6560577049670653e+00 1.9928519923214696e-01 9.2626829920643261e-01 3.2138719231627997e+00 -3.4536278385026264e-01 -1.2300326486396997e+00 -3.3143994862037469e+00 -1.4655540857767010e-01 -7.3978131215819920e-01 -9.0351080806495021e-01 2.7572747440062839e-01 8.5954579246301432e-01 1.0108299354655965e+00 2.3452621911640747e-01 1.1208605093901935e+00 1.7913877353882863e+00 -2.5519010493342353e-01 -7.5370098699606281e-01 -1.6513005804288918e+00 1.7676083505891838e+00 1.0345373668399716e+00 4.1219011326630384e-01 -2.0587755991315322e+00 -1.3744889547030374e+00 -3.6943199391268178e-01 -3.3143994862037478e+00 -1.2255822296866405e+00 -3.4536278385026259e-01 3.6653207717990011e+00 1.4609330095218003e+00 6.0126981244525912e-01 9.7895965817540276e-01 1.1589681196493060e+00 2.6873242057547037e-01 -1.2634291376401490e+00 -1.2099227304608045e+00 -5.0823594415049689e-01 -1.7899460909097313e+00 -1.1778345842155646e+00 -4.8011075738426540e-01 2.0146615333215721e+00 1.3333900030549688e+00 4.2094913301067338e-01 1.0510835769947799e+00 4.7810225235425419e+00 1.3300324155127579e+00 -1.3518725245532284e+00 -4.7888313800455542e+00 -8.8762933113374054e-01 -1.2300326486396995e+00 -6.9100356857951386e+00 -1.2300326486397000e+00 1.4609330095218003e+00 6.6287983816381120e+00 1.4609330095218003e+00 8.4218537282413619e-01 3.9359049247622022e+00 8.4218537282413619e-01 -1.2146998705268057e+00 -3.6390499075991478e+00 -1.2146998705268066e+00 -8.8762933113374110e-01 -4.7888313800455533e+00 -1.3518725245532297e+00 1.3300324155127587e+00 4.7810225235425401e+00 1.0510835769947817e+00 4.2094913301067277e-01 1.3333900030549695e+00 2.0146615333215725e+00 -4.8011075738426490e-01 -1.1778345842155644e+00 -1.7899460909097322e+00 -3.4536278385026259e-01 -1.2255822296866403e+00 -3.3143994862037469e+00 6.0126981244525912e-01 1.4609330095218003e+00 3.6653207717990020e+00 2.6873242057547048e-01 1.1589681196493062e+00 9.7895965817540276e-01 -5.0823594415049655e-01 -1.2099227304608042e+00 -1.2634291376401494e+00 -3.6943199391268217e-01 -1.3744889547030381e+00 -2.0587755991315317e+00 4.1219011326630423e-01 1.0345373668399713e+00 1.7676083505891831e+00 1.6302161825340196e+00 7.5075783808508345e-01 2.1857626636577959e-01 -1.7864857450553639e+00 -9.2936427079651285e-01 -1.8514420579969751e-01 -9.0351080806494999e-01 -7.2096415690658133e-01 -1.4655540857767008e-01 9.7895965817540265e-01 8.4218537282413619e-01 2.6873242057547048e-01 3.2250282337701353e+00 8.6845030050781657e-01 1.8171836306501143e-01 -3.2607849170754566e+00 -1.1847171157766119e+00 -3.2137201652434289e-01 -1.6354690719543841e+00 -7.1856433908719675e-01 -2.4645637459308481e-01 1.7520464676705971e+00 1.0922163711498665e+00 2.3050095548853372e-01 7.6395466152647551e-01 5.0535728109676121e+00 1.0550809097711040e+00 -1.2352657267306053e+00 -5.0994165338121391e+00 -7.2969738080666269e-01 -7.3978131215819865e-01 -4.3688109224928082e+00 -7.3978131215819920e-01 1.1589681196493060e+00 3.9359049247622022e+00 1.1589681196493060e+00 8.6845030050781635e-01 7.2368007931614624e+00 8.6845030050781702e-01 -1.1417095717592345e+00 -6.7122073497417984e+00 -1.1417095717592360e+00 -7.2969738080666358e-01 -5.0994165338121391e+00 -1.2352657267306071e+00 1.0550809097711047e+00 5.0535728109676086e+00 7.6395466152647751e-01 2.3050095548853336e-01 1.0922163711498669e+00 1.7520464676705991e+00 -2.4645637459308450e-01 -7.1856433908719675e-01 -1.6354690719543856e+00 -1.4655540857767010e-01 -7.2096415690658133e-01 -9.0351080806495021e-01 2.6873242057547037e-01 8.4218537282413619e-01 9.7895965817540276e-01 1.8171836306501146e-01 8.6845030050781702e-01 3.2250282337701348e+00 -3.2137201652434250e-01 -1.1847171157766125e+00 -3.2607849170754566e+00 -1.8514420579969770e-01 -9.2936427079651296e-01 -1.7864857450553631e+00 2.1857626636577976e-01 7.5075783808508334e-01 1.6302161825340182e+00 -1.7791852657838114e+00 -1.1476782115852808e+00 -4.6515205221914629e-01 2.0089728046410338e+00 1.2997863111716190e+00 4.0953019569043325e-01 1.0108299354655961e+00 1.1568554795865436e+00 2.7572747440062834e-01 -1.2634291376401490e+00 -1.2146998705268057e+00 -5.0823594415049655e-01 -3.2607849170754561e+00 -1.1417095717592345e+00 -3.2137201652434250e-01 3.5569519288198581e+00 1.3881533770595145e+00 5.7101797518790709e-01 1.7591902202530005e+00 9.9777335375097354e-01 4.0183473498084993e-01 -2.0325455686800717e+00 -1.3384808676973288e+00 -3.6335036736583298e-01 -8.7566951406863469e-01 -4.6969455012460308e+00 -1.3092555547698308e+00 1.3071424167097692e+00 4.7052086829810413e+00 1.0247233288435840e+00 8.5954579246301388e-01 3.9591604312714503e+00 8.5954579246301432e-01 -1.2099227304608045e+00 -3.6390499075991483e+00 -1.2099227304608042e+00 -1.1847171157766119e+00 -6.7122073497417984e+00 -1.1847171157766125e+00 1.3881533770595145e+00 6.3755704625994776e+00 1.3881533770595154e+00 1.0247233288435844e+00 4.7052086829810404e+00 1.3071424167097705e+00 -1.3092555547698312e+00 -4.6969455012460282e+00 -8.7566951406863625e-01 -3.6335036736583259e-01 -1.3384808676973299e+00 -2.0325455686800735e+00 4.0183473498084971e-01 9.9777335375097409e-01 1.7591902202530019e+00 2.7572747440062850e-01 1.1568554795865447e+00 1.0108299354655963e+00 -5.0823594415049689e-01 -1.2146998705268068e+00 -1.2634291376401494e+00 -3.2137201652434294e-01 -1.1417095717592358e+00 -3.2607849170754566e+00 5.7101797518790709e-01 1.3881533770595156e+00 3.5569519288198594e+00 4.0953019569043392e-01 1.2997863111716201e+00 2.0089728046410338e+00 -4.6515205221914696e-01 -1.1476782115852817e+00 -1.7791852657838103e+00 -8.9580274888768563e-01 -6.7322780117783765e-01 -2.6896170286441162e-01 1.0071596086980206e+00 8.4792807459818975e-01 2.4783648555641549e-01 1.6560577049670635e+00 7.7032002858493276e-01 2.3452621911640745e-01 -1.7899460909097313e+00 -8.8762933113374110e-01 -3.6943199391268217e-01 -1.6354690719543843e+00 -7.2969738080666358e-01 -1.8514420579969773e-01 1.7591902202530005e+00 1.0247233288435844e+00 4.0953019569043392e-01 3.1841151516007855e+00 8.3103108009862336e-01 3.2624762275444541e-01 -3.2853047737670691e+00 -1.1834479990070879e+00 -3.9460262054091078e-01 -6.8413681035871665e-01 -3.9930505851715457e+00 -1.2896837296747652e+00 1.1273294067177524e+00 3.9783455494097120e+00 8.4792807459818909e-01 7.8526664883462383e-01 5.1618521065639476e+00 1.1208605093901935e+00 -1.1778345842155646e+00 -4.7888313800455533e+00 -1.3744889547030381e+00 -7.1856433908719675e-01 -5.0994165338121391e+00 -9.2936427079651296e-01 9.9777335375097354e-01 4.7052086829810404e+00 1.2997863111716201e+00 8.3103108009862336e-01 6.8616284843187030e+00 1.5213010221371908e+00 -1.1608647557404956e+00 -6.8257363242441649e+00 -1.1963389621228773e+00 -2.7630432924661585e-01 -1.3038329973238600e+00 -1.2728088936466870e+00 4.1910943167038606e-01 1.1273294067177537e+00 1.0071596086980206e+00 2.3751436339703547e-01 1.1121943803674805e+00 1.7913877353882863e+00 -4.8011075738426540e-01 -1.3518725245532297e+00 -2.0587755991315317e+00 -2.4645637459308481e-01 -1.2352657267306071e+00 -1.7864857450553628e+00 4.0183473498084998e-01 1.3071424167097707e+00 2.0089728046410333e+00 3.2624762275444541e-01 1.5213010221371905e+00 3.6048676012021152e+00 -3.8183469157875094e-01 -1.1769959773244982e+00 -3.2943175120958741e+00 9.8392825585911026e-01 1.1161537046846655e+00 4.1005081340848587e-01 -1.2728088936466866e+00 -1.2896837296747654e+00 -2.6896170286441140e-01 -1.8029364242861567e+00 -1.2536523436231493e+00 -2.5519010493342353e-01 2.0146615333215716e+00 1.3300324155127585e+00 4.1219011326630423e-01 1.7520464676705969e+00 1.0550809097711049e+00 2.1857626636577973e-01 -2.0325455686800717e+00 -1.3092555547698312e+00 -4.6515205221914696e-01 -3.2853047737670691e+00 -1.1608647557404954e+00 -3.8183469157875088e-01 3.6429594035287050e+00 1.5121893538397126e+00 3.3032135855516292e-01 8.5639243808402932e-01 3.9456660429330275e+00 1.1161537046846643e+00 -1.3038329973238583e+00 -3.9930505851715434e+00 -6.7322780117783676e-01 -9.6842630210030167e-01 -5.1864075438079764e+00 -7.5370098699606281e-01 1.3333900030549688e+00 4.7810225235425392e+00 1.0345373668399713e+00 1.0922163711498665e+00 5.0535728109676086e+00 7.5075783808508345e-01 -1.3384808676973288e+00 -4.6969455012460291e+00 -1.1476782115852815e+00 -1.1834479990070874e+00 -6.8257363242441649e+00 -1.1769959773244985e+00 1.5121893538397124e+00 6.9218785770265328e+00 8.5015406747395961e-01 2.5243082888385249e-01 8.5639243808403120e-01 9.8392825585911081e-01 -2.7630432924661641e-01 -6.8413681035871843e-01 -8.9580274888768563e-01 -1.9994495878486221e-01 -7.6543945752901865e-01 -1.6513005804288918e+00 4.2094913301067333e-01 1.0510835769947815e+00 1.7676083505891831e+00 2.3050095548853372e-01 7.6395466152647751e-01 1.6302161825340180e+00 -3.6335036736583309e-01 -8.7566951406863625e-01 -1.7791852657838105e+00 -3.9460262054091066e-01 -1.1963389621228770e+00 -3.2943175120958745e+00 3.3032135855516287e-01 8.5015406747395994e-01 3.2388533182139505e+00 543 544 545 591 592 593 603 604 605 555 556 557 546 547 548 594 595 596 606 607 608 558 559 560 3.3546314456557500e+00 9.7808273372186366e-02 3.5428814703922791e-02 -3.2838369868547836e+00 -4.6476021025475134e-01 -1.6857422913871789e-01 -1.6203814223866535e+00 -5.0219578063022061e-02 -1.2981261038488585e-02 1.6115294355857537e+00 4.1019525914166116e-01 1.5773014169925920e-01 1.6351087675595979e+00 8.0769896648010098e-02 2.4282102251314983e-02 -1.6660419188644613e+00 -2.5815961233371532e-01 -1.0179492044564699e-01 -8.2118758960781701e-01 -5.1863655424225399e-02 -2.1200457191422804e-02 7.9017826891261289e-01 2.3622962691385652e-01 8.7109809159779270e-02 9.7808273372186366e-02 7.8219937436111193e+00 1.6997752575261003e+00 -4.5165701859719609e-01 -7.8619804683889951e+00 -1.4013683513025907e+00 -5.2066187642832454e-02 -5.7918146969447761e+00 -1.1127396346971630e+00 3.9733357383196333e-01 5.5180195195043256e+00 1.5134106681219415e+00 7.2900918084638153e-02 5.7391534716572519e+00 1.2561220558917281e+00 -5.3616045912747268e-01 -5.4999490973962377e+00 -1.5230719810859761e+00 -4.3829414710642896e-02 -4.5051863187725596e+00 -1.4423817078972503e+00 5.1567031478935477e-01 4.5797638467298736e+00 1.0102536934432105e+00 3.5428814703922791e-02 1.6997752575261003e+00 3.9984823996140286e+00 -1.6248968141269787e-01 -1.3799625071248962e+00 -3.6590550985034431e+00 -1.7818811765557253e-02 -1.4020266966958361e+00 -1.9754084779093621e+00 1.5127542442516631e-01 1.5080652397612591e+00 2.1869714174880359e+00 2.1397829847861070e-02 1.2195602655241959e+00 1.9724773165552476e+00 -2.0889357927286670e-01 -1.5094392713822757e+00 -2.2455259755695556e+00 -1.7837833253376376e-02 -1.4260888943163315e+00 -1.3790368053353186e+00 1.9893783672754747e-01 1.2901166067077836e+00 1.1010952236603671e+00 -3.2838369868547836e+00 -4.5165701859719609e-01 -1.6248968141269793e-01 3.4542209178049537e+00 8.3901538055467739e-01 1.8701037687156294e-01 1.6244321592576507e+00 4.2537259239387681e-01 9.4279053983945191e-02 -1.7680255531884466e+00 -7.6479509540797963e-01 -2.6006892108127500e-01 -1.6669242746218016e+00 -5.6834873644020190e-01 -1.2170637912850926e-01 1.7807488841586590e+00 7.2940985193137164e-01 2.1983056909692891e-01 8.1399372309270590e-01 5.1737723137059932e-01 2.0202972145156220e-01 -9.5460886964893754e-01 -7.2637420580514733e-01 -1.5888473978151704e-01 -4.6476021025475128e-01 -7.8619804683889951e+00 -1.3799625071248962e+00 8.3901538055467739e-01 8.0251774404170071e+00 1.0609660171607729e+00 4.2980122421427069e-01 5.9044647101760610e+00 9.5252319062007540e-01 -7.7197547857937410e-01 -5.6546925984843019e+00 -1.3803952833991111e+00 -2.6907438470937600e-01 -5.9039003940347685e+00 -9.0798652583092010e-01 7.2803120774480479e-01 5.6284883615112458e+00 1.2066186825412433e+00 2.2899479575780757e-01 4.6104663987817931e+00 1.3023936291186027e+00 -7.2003253472805739e-01 -4.7480234499780396e+00 -8.5415720308576659e-01 -1.6857422913871789e-01 -1.4013683513025912e+00 -3.6590550985034431e+00 1.8701037687156294e-01 1.0609660171607727e+00 3.5433531292128673e+00 9.4686894550869205e-02 9.5035449005910355e-01 1.8269942608209051e+00 -2.0795662636631390e-01 -1.0874566468904348e+00 -1.9751487808926442e+00 -5.6487473106524119e-02 -9.1280883294849868e-01 -1.8447453209856404e+00 2.2387821073158881e-01 1.2334219049140780e+00 1.9867207270226082e+00 8.5338277333035201e-02 1.0132966511919939e+00 1.1296586537742903e+00 -1.5789543087549990e-01 -8.5640523218442366e-01 -1.0077775704489429e+00 -1.6203814223866535e+00 -5.2066187642832426e-02 -1.7818811765557257e-02 1.6244321592576507e+00 4.2980122421427069e-01 9.4686894550869191e-02 3.2094456855767297e+00 1.0281097407887974e-01 2.4554674835243828e-02 -3.1881035952219583e+00 -4.7318736668450961e-01 -1.1447631493987459e-01 -8.2194524707447325e-01 -5.9094020258009756e-02 -1.1786334471326699e-02 8.1536548752302462e-01 2.4738557082512661e-01 5.8688026449646782e-02 1.6034686279070351e+00 7.8864180361393449e-02 2.4372505170662147e-02 -1.6222816955813550e+00 -2.7451437489431868e-01 -5.8220639829663440e-02 -5.0219578063022088e-02 -5.7918146969447761e+00 -1.4020266966958361e+00 4.2537259239387681e-01 5.9044647101760610e+00 9.5035449005910333e-01 1.0281097407887974e-01 8.0573680110651438e+00 1.0809505113707785e+00 -4.6894898032383603e-01 -7.7506687873162043e+00 -1.3958278739541092e+00 -5.1745812394901641e-02 -4.8765311257485715e+00 -8.7035293082001441e-01 5.3994446909984806e-01 4.6060994791827277e+00 1.3079496581188483e+00 7.1259048703741598e-02 5.7124936540301112e+00 1.2445912081099411e+00 -5.6847271349458472e-01 -5.8614112444444926e+00 -9.1563836618871197e-01 -1.2981261038488580e-02 -1.1127396346971630e+00 -1.9754084779093621e+00 9.4279053983945205e-02 9.5252319062007551e-01 1.8269942608209051e+00 2.4554674835243831e-02 1.0809505113707782e+00 3.4480870075230694e+00 -1.1352180998014180e-01 -1.3991308308134787e+00 -3.5655613645775297e+00 -1.0288225645117563e-02 -8.7676249492599057e-01 -1.0094561586279065e+00 1.1794026878774017e-01 1.0139684652261318e+00 1.1288925745946223e+00 2.2249407550520680e-02 1.2534954254443116e+00 1.9468227379206424e+00 -1.2223210849370159e-01 -9.1230463222466529e-01 -1.8003705797444403e+00 1.6115294355857535e+00 3.9733357383196333e-01 1.5127542442516634e-01 -1.7680255531884466e+00 -7.7197547857937410e-01 -2.0795662636631390e-01 -3.1881035952219583e+00 -4.6894898032383603e-01 -1.1352180998014180e-01 3.4067338716047537e+00 7.9618194480881399e-01 3.0993673145732975e-01 7.8872857355656223e-01 5.3884939848608604e-01 1.1624140229008781e-01 -9.5319906320503489e-01 -6.8201212543133338e-01 -2.6877541970158275e-01 -1.6204877215609896e+00 -5.3700704589455384e-01 -2.1057476608392336e-01 1.7228240524293597e+00 7.2757871310223354e-01 2.2337506395937795e-01 4.1019525914166116e-01 5.5180195195043256e+00 1.5080652397612591e+00 -7.6479509540797963e-01 -5.6546925984843019e+00 -1.0874566468904348e+00 -4.7318736668450961e-01 -7.7506687873162061e+00 -1.3991308308134787e+00 7.9618194480881388e-01 7.5813251767757581e+00 1.6729351833081501e+00 2.3947157269865410e-01 4.5756454828808284e+00 1.0071346600682356e+00 -6.8763144590078062e-01 -4.3831962131983051e+00 -1.4085631098172104e+00 -2.4852340377364815e-01 -5.4594754405521471e+00 -1.5226101505903979e+00 7.2828853511778702e-01 5.5730428603900446e+00 1.2296256549738762e+00 1.5773014169925920e-01 1.5134106681219412e+00 2.1869714174880359e+00 -2.6006892108127500e-01 -1.3803952833991111e+00 -1.9751487808926442e+00 -1.1447631493987459e-01 -1.3958278739541095e+00 -3.5655613645775293e+00 3.0993673145732975e-01 1.6729351833081503e+00 3.9074799929619308e+00 5.6091755487312558e-02 1.3077579635841241e+00 1.1014434958063508e+00 -2.7009066427143752e-01 -1.4038780143564511e+00 -1.3769049339217583e+00 -9.8892267213552182e-02 -1.5256872129629135e+00 -2.2074166089939080e+00 2.1976953886223716e-01 1.2116845696583685e+00 1.9291367821295222e+00 1.6351087675595979e+00 7.2900918084638167e-02 2.1397829847861066e-02 -1.6669242746218016e+00 -2.6907438470937606e-01 -5.6487473106524133e-02 -8.2194524707447325e-01 -5.1745812394901641e-02 -1.0288225645117565e-02 7.8872857355656223e-01 2.3947157269865410e-01 5.6091755487312558e-02 3.3797253867389068e+00 9.4006368551547551e-02 2.2508944253860973e-02 -3.3019321811560975e+00 -4.7859634898387937e-01 -1.1402142937765772e-01 -1.6348832862475233e+00 -3.9522984096161659e-02 -1.4590569453890702e-02 1.6221222612448294e+00 4.3256067084947880e-01 9.5389167994155477e-02 8.0769896648010070e-02 5.7391534716572519e+00 1.2195602655241959e+00 -5.6834873644020178e-01 -5.9039003940347685e+00 -9.1280883294849879e-01 -5.9094020258009736e-02 -4.8765311257485706e+00 -8.7676249492599034e-01 5.3884939848608604e-01 4.5756454828808284e+00 1.3077579635841241e+00 9.4006368551547537e-02 8.1516828083800910e+00 1.0588812456048149e+00 -4.3705987729751872e-01 -7.7779957386943011e+00 -1.3449603532038190e+00 -3.9684331437986664e-02 -5.7025352300854548e+00 -1.3776401228980837e+00 3.9056130174807163e-01 5.7944807256449256e+00 9.2597232926325712e-01 2.4282102251314979e-02 1.2561220558917285e+00 1.9724773165552476e+00 -1.2170637912850926e-01 -9.0798652583091999e-01 -1.8447453209856404e+00 -1.1786334471326695e-02 -8.7035293082001441e-01 -1.0094561586279065e+00 1.1624140229008778e-01 1.0071346600682358e+00 1.1014434958063508e+00 2.2508944253860956e-02 1.0588812456048149e+00 3.6124499901729354e+00 -1.0573240465634812e-01 -1.3876698430489594e+00 -3.6707010783518004e+00 -9.5141875546126409e-03 -1.0807957742701217e+00 -1.9821714404145592e+00 8.5706857015532600e-02 9.2466711240523669e-01 1.8207031958453732e+00 -1.6660419188644613e+00 -5.3616045912747268e-01 -2.0889357927286673e-01 1.7807488841586587e+00 7.2803120774480479e-01 2.2387821073158884e-01 8.1536548752302462e-01 5.3994446909984806e-01 1.1794026878774018e-01 -9.5319906320503489e-01 -6.8763144590078062e-01 -2.7009066427143752e-01 -3.3019321811560975e+00 -4.3705987729751872e-01 -1.0573240465634810e-01 3.4693074355675551e+00 7.7768982572521206e-01 3.0247382463300754e-01 1.6336163768316367e+00 3.7393871894479752e-01 1.4482727641306492e-01 -1.7778650208552822e+00 -7.5875243918889002e-01 -2.0440293236474913e-01 -2.5815961233371532e-01 -5.4999490973962377e+00 -1.5094392713822757e+00 7.2940985193137164e-01 5.6284883615112458e+00 1.2334219049140782e+00 2.4738557082512661e-01 4.6060994791827286e+00 1.0139684652261318e+00 -6.8201212543133338e-01 -4.3831962131983051e+00 -1.4038780143564511e+00 -4.7859634898387937e-01 -7.7779957386943011e+00 -1.3876698430489594e+00 7.7768982572521217e-01 7.5472561664449778e+00 1.6322111811600606e+00 4.0506304567832269e-01 5.4457153196950081e+00 1.4811182835345136e+00 -7.4078020741110351e-01 -5.5664182775451154e+00 -1.0597327060470976e+00 -1.0179492044564702e-01 -1.5230719810859763e+00 -2.2455259755695556e+00 2.1983056909692891e-01 1.2066186825412433e+00 1.9867207270226082e+00 5.8688026449646769e-02 1.3079496581188483e+00 1.1288925745946223e+00 -2.6877541970158275e-01 -1.4085631098172102e+00 -1.3769049339217583e+00 -1.1402142937765772e-01 -1.3449603532038190e+00 -3.6707010783518004e+00 3.0247382463300754e-01 1.6322111811600604e+00 3.9567175946701041e+00 1.5532719972144404e-01 1.4742305194719114e+00 2.2001781799169016e+00 -2.5172785037613926e-01 -1.3444145971850578e+00 -1.9793770883611215e+00 -8.2118758960781701e-01 -4.3829414710642889e-02 -1.7837833253376376e-02 8.1399372309270601e-01 2.2899479575780757e-01 8.5338277333035187e-02 1.6034686279070351e+00 7.1259048703741612e-02 2.2249407550520683e-02 -1.6204877215609896e+00 -2.4852340377364820e-01 -9.8892267213552182e-02 -1.6348832862475233e+00 -3.9684331437986678e-02 -9.5141875546126305e-03 1.6336163768316367e+00 4.0506304567832269e-01 1.5532719972144407e-01 3.2436298700121200e+00 8.2782463767724301e-02 3.0271515468225520e-02 -3.2181500004271681e+00 -4.5606220398531849e-01 -1.6694211205168430e-01 -5.1863655424225399e-02 -4.5051863187725605e+00 -1.4260888943163315e+00 5.1737723137059932e-01 4.6104663987817931e+00 1.0132966511919939e+00 7.8864180361393421e-02 5.7124936540301112e+00 1.2534954254443116e+00 -5.3700704589455373e-01 -5.4594754405521462e+00 -1.5256872129629135e+00 -3.9522984096161652e-02 -5.7025352300854548e+00 -1.0807957742701220e+00 3.7393871894479747e-01 5.4457153196950081e+00 1.4742305194719114e+00 8.2782463767724301e-02 7.5880032017075836e+00 1.6676126573889256e+00 -4.2456890902957212e-01 -7.6894815848043345e+00 -1.3760633719477757e+00 -2.1200457191422793e-02 -1.4423817078972505e+00 -1.3790368053353186e+00 2.0202972145156220e-01 1.3023936291186029e+00 1.1296586537742903e+00 2.4372505170662147e-02 1.2445912081099413e+00 1.9468227379206420e+00 -2.1057476608392336e-01 -1.5226101505903979e+00 -2.2074166089939080e+00 -1.4590569453890702e-02 -1.3776401228980837e+00 -1.9821714404145592e+00 1.4482727641306492e-01 1.4811182835345134e+00 2.2001781799169016e+00 3.0271515468225516e-02 1.6676126573889252e+00 3.8816486039502776e+00 -1.5513522577427727e-01 -1.3530837967662503e+00 -3.5896833208183256e+00 7.9017826891261289e-01 5.1567031478935477e-01 1.9893783672754747e-01 -9.5460886964893754e-01 -7.2003253472805728e-01 -1.5789543087549987e-01 -1.6222816955813550e+00 -5.6847271349458484e-01 -1.2223210849370157e-01 1.7228240524293597e+00 7.2828853511778702e-01 2.1976953886223716e-01 1.6221222612448294e+00 3.9056130174807174e-01 8.5706857015532600e-02 -1.7778650208552818e+00 -7.4078020741110351e-01 -2.5172785037613932e-01 -3.2181500004271681e+00 -4.2456890902957206e-01 -1.5513522577427727e-01 3.4377810039259407e+00 8.1933421300810394e-01 1.8257638291430076e-01 2.3622962691385652e-01 4.5797638467298736e+00 1.2901166067077836e+00 -7.2637420580514733e-01 -4.7480234499780396e+00 -8.5640523218442355e-01 -2.7451437489431868e-01 -5.8614112444444926e+00 -9.1230463222466529e-01 7.2757871310223354e-01 5.5730428603900446e+00 1.2116845696583685e+00 4.3256067084947886e-01 5.7944807256449256e+00 9.2466711240523669e-01 -7.5875243918888990e-01 -5.5664182775451163e+00 -1.3444145971850578e+00 -4.5606220398531849e-01 -7.6894815848043345e+00 -1.3530837967662501e+00 8.1933421300810394e-01 7.9180471240071393e+00 1.0397399695890082e+00 8.7109809159779270e-02 1.0102536934432105e+00 1.1010952236603671e+00 -1.5888473978151704e-01 -8.5415720308576670e-01 -1.0077775704489429e+00 -5.8220639829663440e-02 -9.1563836618871197e-01 -1.8003705797444403e+00 2.2337506395937790e-01 1.2296256549738758e+00 1.9291367821295222e+00 9.5389167994155477e-02 9.2597232926325712e-01 1.8207031958453734e+00 -2.0440293236474913e-01 -1.0597327060470978e+00 -1.9793770883611215e+00 -1.6694211205168427e-01 -1.3760633719477755e+00 -3.5896833208183252e+00 1.8257638291430078e-01 1.0397399695890082e+00 3.5262733577375682e+00 591 592 593 639 640 641 651 652 653 603 604 605 594 595 596 642 643 644 654 655 656 606 607 608 3.1058537352314173e+00 6.5318919813033879e-02 2.3448948323375920e-02 -3.0245207465677439e+00 -4.3533947365890402e-01 -1.6198681265874970e-01 -1.5378201606398714e+00 -2.4322282750009507e-02 -6.2312576169504660e-03 1.5211853222348757e+00 3.8850151361776630e-01 1.5192330010948471e-01 1.5002485432837902e+00 5.2297794105075401e-02 1.5378488725685081e-02 -1.5269759009012518e+00 -2.3125969265517235e-01 -9.3292282392833561e-02 -7.7419060854522748e-01 -2.7350556846406658e-02 -1.1843151478928306e-02 7.3621981590401220e-01 2.1215377837461685e-01 8.2602766988916401e-02 6.5318919813033879e-02 7.2872156255837304e+00 1.6204425403282250e+00 -4.2385952419753337e-01 -7.3234265284072722e+00 -1.3105684207379802e+00 -2.0975057485098463e-02 -5.4782455201002582e+00 -1.0437988136375411e+00 3.7156862282987679e-01 5.1942833609437029e+00 1.4434686656311859e+00 4.3030789032965228e-02 5.3622891970877538e+00 1.1777687040718741e+00 -5.1612261844937446e-01 -5.1142485266793747e+00 -1.4540806620707609e+00 -1.5294216745487737e-02 -4.2372529799153629e+00 -1.3775198671231657e+00 4.9633308520161662e-01 4.3093853714870800e+00 9.4428785353816325e-01 2.3448948323375910e-02 1.6204425403282254e+00 3.7324106059996436e+00 -1.5752105587865406e-01 -1.3006785684548108e+00 -3.3767643131596623e+00 -7.6067228801491244e-03 -1.3377556231456524e+00 -1.8719768070212413e+00 1.4423550009613006e-01 1.4433014032224747e+00 2.0858945948203447e+00 1.2686931517636359e-02 1.1535440171103777e+00 1.8133603762521979e+00 -2.0482620982316993e-01 -1.4406011791541118e+00 -2.0958900446581077e+00 -7.0045574508712429e-03 -1.3670036910629408e+00 -1.3180361241069714e+00 1.9658716609570143e-01 1.2287511011564385e+00 1.0310017118737951e+00 -3.0245207465677439e+00 -4.2385952419753342e-01 -1.5752105587865403e-01 3.2069141661402489e+00 8.1630745966250629e-01 1.7640415730227352e-01 1.5363421057136504e+00 4.0182299253006026e-01 8.7119168190822882e-02 -1.6861308683518201e+00 -7.4330782941296558e-01 -2.5465600641630465e-01 -1.5289846416608910e+00 -5.4816564541848800e-01 -1.1370908435181634e-01 1.6464663683351206e+00 7.0857300961031144e-01 2.1472674443360568e-01 7.6003703518697963e-01 4.9706140957178974e-01 1.9868666343160929e-01 -9.1012341879554248e-01 -7.0843187234568072e-01 -1.5105058671153626e-01 -4.3533947365890402e-01 -7.3234265284072713e+00 -1.3006785684548110e+00 8.1630745966250640e-01 7.4946832851566034e+00 9.6797294514476184e-01 4.0977098783751731e-01 5.5925428789674498e+00 8.7963385385415793e-01 -7.5667991393044243e-01 -5.3347583026950511e+00 -1.3093036997519514e+00 -2.4109890098337897e-01 -5.5312173141901990e+00 -8.2799535521921230e-01 7.0942378049360211e-01 5.2432851423164868e+00 1.1395559939930411e+00 2.0414053140802552e-01 4.3423730338175091e+00 1.2365832585404224e+00 -7.0652447082892411e-01 -4.4834821949655286e+00 -7.8576842810640835e-01 -1.6198681265874970e-01 -1.3105684207379804e+00 -3.3767643131596623e+00 1.7640415730227355e-01 9.6797294514476206e-01 3.2678837111584444e+00 8.7840938973725330e-02 8.7269732114969167e-01 1.7221445569254663e+00 -2.0166134655356202e-01 -1.0128586460090112e+00 -1.8667927815100747e+00 -4.8348606016420222e-02 -8.3167663507249234e-01 -1.6882856028376347e+00 2.1732380420085104e-01 1.1533466151200342e+00 1.8257895350795048e+00 8.0394217433744627e-02 9.4326235476965836e-01 1.0569870670084365e+00 -1.4996635268186223e-01 -7.8217553436466236e-01 -9.4096217266448079e-01 -1.5378201606398714e+00 -2.0975057485098463e-02 -7.6067228801491096e-03 1.5363421057136508e+00 4.0977098783751731e-01 8.7840938973725330e-02 3.1342143272125385e+00 7.3375300064386209e-02 1.7898575701446092e-02 -3.1013214975049390e+00 -4.5600238570271223e-01 -1.0619515717129145e-01 -7.7588087007409268e-01 -3.0928063058842704e-02 -5.4320163944417306e-03 7.6175816173100730e-01 2.2542214622784343e-01 4.9561808444032088e-02 1.5474870040519819e+00 5.1920855743036773e-02 1.6227839630641672e-02 -1.5647790704902742e+00 -2.5258378362613026e-01 -5.2295266303962869e-02 -2.4322282750009510e-02 -5.4782455201002591e+00 -1.3377556231456524e+00 4.0182299253006021e-01 5.5925428789674498e+00 8.7269732114969167e-01 7.3375300064386251e-02 7.7577346486376335e+00 1.0074000537788266e+00 -4.4217008156961501e-01 -7.4343467167125983e+00 -1.3187994162588845e+00 -2.5159995821961878e-02 -4.6196131608798501e+00 -7.9801203799631759e-01 5.2311138471856988e-01 4.3352088625442864e+00 1.2478360239077126e+00 4.3015717910526073e-02 5.4370068861845819e+00 1.1727517777799992e+00 -5.4967303508195442e-01 -5.5902878786412469e+00 -8.4611809921537562e-01 -6.2312576169504591e-03 -1.0437988136375411e+00 -1.8719768070212413e+00 8.7119168190822868e-02 8.7963385385415793e-01 1.7221445569254663e+00 1.7898575701446089e-02 1.0074000537788268e+00 3.3522784266255843e+00 -1.0383745270583704e-01 -1.3370406404296369e+00 -3.4603998938521086e+00 -4.3145464320765766e-03 -8.0838105794649684e-01 -9.4360531976450512e-01 1.1000088059504882e-01 9.4847862837269736e-01 1.0592062968531808e+00 1.4044624389463757e-02 1.1944584887629353e+00 1.8692413181202894e+00 -1.1467999212191707e-01 -8.4075051275494239e-01 -1.7268885778866661e+00 1.5211853222348757e+00 3.7156862282987679e-01 1.4423550009613009e-01 -1.6861308683518199e+00 -7.5667991393044232e-01 -2.0166134655356199e-01 -3.1013214975049390e+00 -4.4217008156961501e-01 -1.0383745270583704e-01 3.3306309621904888e+00 7.7704037529894099e-01 3.0741080518125274e-01 7.3450998543962531e-01 5.1981285770200891e-01 1.0696958860093773e-01 -9.0763698910372748e-01 -6.6407320507476131e-01 -2.6719906205474647e-01 -1.5601989788395390e+00 -5.1491220510219426e-01 -2.0529686700314403e-01 1.6689620639350353e+00 7.0941354984618599e-01 2.1937883443896894e-01 3.8850151361776630e-01 5.1942833609437029e+00 1.4433014032224747e+00 -7.4330782941296558e-01 -5.3347583026950511e+00 -1.0128586460090112e+00 -4.5600238570271223e-01 -7.4343467167125983e+00 -1.3370406404296364e+00 7.7704037529894110e-01 7.2618559638981264e+00 1.6032944571766519e+00 2.1587420745258315e-01 4.3069921232485857e+00 9.3736261229365547e-01 -6.6929667803949044e-01 -4.1085876196169275e+00 -1.3468359311104077e+00 -2.2525450230054325e-01 -5.1767141973266604e+00 -1.4562670465551928e+00 7.1244529908641963e-01 5.2912753882608197e+00 1.1690437914114662e+00 1.5192330010948468e-01 1.4434686656311859e+00 2.0858945948203447e+00 -2.5465600641630470e-01 -1.3093036997519514e+00 -1.8667927815100747e+00 -1.0619515717129145e-01 -1.3187994162588847e+00 -3.4603998938521090e+00 3.0741080518125274e-01 1.6032944571766519e+00 3.8123802636586621e+00 4.6109234756483410e-02 1.2427082217416296e+00 1.0285552419001904e+00 -2.6740243612233688e-01 -1.3372661453875336e+00 -1.3147084824905544e+00 -9.1102589197166323e-02 -1.4616205052595348e+00 -2.1357184011260326e+00 2.1391284885987780e-01 1.1375184221084371e+00 1.8507894585995723e+00 1.5002485432837902e+00 4.3030789032965235e-02 1.2686931517636354e-02 -1.5289846416608910e+00 -2.4109890098337897e-01 -4.8348606016420222e-02 -7.7588087007409268e-01 -2.5159995821961871e-02 -4.3145464320765766e-03 7.3450998543962531e-01 2.1587420745258315e-01 4.6109234756483410e-02 3.1002161061785491e+00 5.9527776814204653e-02 1.4498157347701447e-02 -3.0102783507545254e+00 -4.4756997993068537e-01 -1.0235061532880442e-01 -1.5297575856618266e+00 -1.3135347451985704e-02 -5.7613144308397216e-03 1.5099268132493711e+00 4.0853145088825893e-01 8.7480758586319735e-02 5.2297794105075388e-02 5.3622891970877538e+00 1.1535440171103779e+00 -5.4816564541848800e-01 -5.5312173141901990e+00 -8.3167663507249234e-01 -3.0928063058842686e-02 -4.6196131608798510e+00 -8.0838105794649684e-01 5.1981285770200891e-01 4.3069921232485857e+00 1.2427082217416296e+00 5.9527776814204653e-02 7.5943208245136065e+00 9.6615296060556399e-01 -4.1440900776518508e-01 -7.2030699427002363e+00 -1.2666389599924242e+00 -7.6343165277128200e-03 -5.3675511287083415e+00 -1.3091295850728688e+00 3.6949860414893787e-01 5.4578494016286809e+00 8.5342103862671115e-01 1.5378488725685081e-02 1.1777687040718741e+00 1.8133603762521979e+00 -1.1370908435181634e-01 -8.2799535521921230e-01 -1.6882856028376347e+00 -5.4320163944417254e-03 -7.9801203799631748e-01 -9.4360531976450512e-01 1.0696958860093773e-01 9.3736261229365547e-01 1.0285552419001904e+00 1.4498157347701445e-02 9.6615296060556399e-01 3.3069032710291517e+00 -9.5208966375427889e-02 -1.2954009397235484e+00 -3.3560677417141487e+00 -7.4097733725370443e-04 -1.0068755610289668e+00 -1.8531234293128158e+00 7.8244809784615066e-02 8.4699961699695114e-01 1.6922632044475643e+00 -1.5269759009012518e+00 -5.1612261844937435e-01 -2.0482620982316993e-01 1.6464663683351204e+00 7.0942378049360200e-01 2.1732380420085101e-01 7.6175816173100730e-01 5.2311138471856988e-01 1.1000088059504881e-01 -9.0763698910372748e-01 -6.6929667803949044e-01 -2.6740243612233688e-01 -3.0102783507545254e+00 -4.1440900776518497e-01 -9.5208966375427903e-02 3.1893299852155614e+00 7.5325953348677688e-01 2.9918186997696106e-01 1.5213939310476112e+00 3.5345910247642942e-01 1.3868397457449994e-01 -1.6740572055697960e+00 -7.3942549692132797e-01 -1.9775291702642611e-01 -2.3125969265517229e-01 -5.1142485266793747e+00 -1.4406011791541120e+00 7.0857300961031144e-01 5.2432851423164868e+00 1.1533466151200342e+00 2.2542214622784340e-01 4.3352088625442864e+00 9.4847862837269736e-01 -6.6407320507476131e-01 -4.1085876196169275e+00 -1.3372661453875336e+00 -4.4756997993068537e-01 -7.2030699427002363e+00 -1.2954009397235484e+00 7.5325953348677688e-01 6.9691772522927646e+00 1.5492274693967989e+00 3.8089828553553567e-01 5.0995320059784186e+00 1.4108105970621423e+00 -7.2525009719984690e-01 -5.2212971741354153e+00 -9.8859504568647871e-01 -9.3292282392833548e-02 -1.4540806620707609e+00 -2.0958900446581077e+00 2.1472674443360568e-01 1.1395559939930409e+00 1.8257895350795048e+00 4.9561808444032095e-02 1.2478360239077126e+00 1.0592062968531808e+00 -2.6719906205474647e-01 -1.3468359311104077e+00 -1.3147084824905544e+00 -1.0235061532880442e-01 -1.2666389599924244e+00 -3.3560677417141487e+00 2.9918186997696106e-01 1.5492274693967987e+00 3.6559927809408292e+00 1.4848308665277210e-01 1.4095108105192113e+00 2.0771927480493901e+00 -2.4911154973098582e-01 -1.2785747446431708e+00 -1.8515150920600947e+00 -7.7419060854522748e-01 -1.5294216745487740e-02 -7.0045574508712394e-03 7.6003703518697963e-01 2.0414053140802552e-01 8.0394217433744614e-02 1.5474870040519819e+00 4.3015717910526059e-02 1.4044624389463757e-02 -1.5601989788395390e+00 -2.2525450230054328e-01 -9.1102589197166323e-02 -1.5297575856618266e+00 -7.6343165277128339e-03 -7.4097733725371137e-04 1.5213939310476112e+00 3.8089828553553567e-01 1.4848308665277210e-01 3.1077577960979390e+00 5.2514033456150008e-02 1.8767072208750742e-02 -3.0725285933379185e+00 -4.3238553273649327e-01 -1.6284087669944003e-01 -2.7350556846406665e-02 -4.2372529799153629e+00 -1.3670036910629408e+00 4.9706140957178968e-01 4.3423730338175091e+00 9.4326235476965836e-01 5.1920855743036773e-02 5.4370068861845819e+00 1.1944584887629353e+00 -5.1491220510219426e-01 -5.1767141973266604e+00 -1.4616205052595348e+00 -1.3135347451985718e-02 -5.3675511287083406e+00 -1.0068755610289668e+00 3.5345910247642948e-01 5.0995320059784186e+00 1.4095108105192113e+00 5.2514033456149953e-02 7.2062330377584152e+00 1.5966301768155877e+00 -3.9955729184681765e-01 -7.3036266577885600e+00 -1.3083620735159507e+00 -1.1843151478928308e-02 -1.3775198671231657e+00 -1.3180361241069714e+00 1.9868666343160929e-01 1.2365832585404224e+00 1.0569870670084365e+00 1.6227839630641665e-02 1.1727517777799994e+00 1.8692413181202894e+00 -2.0529686700314403e-01 -1.4562670465551930e+00 -2.1357184011260322e+00 -5.7613144308397216e-03 -1.3091295850728688e+00 -1.8531234293128158e+00 1.3868397457449996e-01 1.4108105970621423e+00 2.0771927480493901e+00 1.8767072208750755e-02 1.5966301768155877e+00 3.7284050090019059e+00 -1.4946421693258899e-01 -1.2738593114469241e+00 -3.4249481876342038e+00 7.3621981590401220e-01 4.9633308520161662e-01 1.9658716609570143e-01 -9.1012341879554248e-01 -7.0652447082892411e-01 -1.4996635268186223e-01 -1.5647790704902744e+00 -5.4967303508195431e-01 -1.1467999212191707e-01 1.6689620639350353e+00 7.1244529908641963e-01 2.1391284885987782e-01 1.5099268132493711e+00 3.6949860414893770e-01 7.8244809784615066e-02 -1.6740572055697958e+00 -7.2525009719984690e-01 -2.4911154973098576e-01 -3.0725285933379185e+00 -3.9955729184681765e-01 -1.4946421693258899e-01 3.3063795951051134e+00 8.0272790652056902e-01 1.7447728672715976e-01 2.1215377837461688e-01 4.3093853714870800e+00 1.2287511011564385e+00 -7.0843187234568072e-01 -4.4834821949655286e+00 -7.8217553436466236e-01 -2.5258378362613021e-01 -5.5902878786412460e+00 -8.4075051275494239e-01 7.0941354984618599e-01 5.2912753882608197e+00 1.1375184221084371e+00 4.0853145088825893e-01 5.4578494016286800e+00 8.4699961699695114e-01 -7.3942549692132786e-01 -5.2212971741354153e+00 -1.2785747446431710e+00 -4.3238553273649327e-01 -7.3036266577885609e+00 -1.2738593114469237e+00 8.0272790652056891e-01 7.5401837441541710e+00 9.6209096294787266e-01 8.2602766988916401e-02 9.4428785353816325e-01 1.0310017118737951e+00 -1.5105058671153626e-01 -7.8576842810640835e-01 -9.4096217266448079e-01 -5.2295266303962862e-02 -8.4611809921537540e-01 -1.7268885778866661e+00 2.1937883443896894e-01 1.1690437914114662e+00 1.8507894585995723e+00 8.7480758586319735e-02 8.5342103862671115e-01 1.6922632044475643e+00 -1.9775291702642614e-01 -9.8859504568647871e-01 -1.8515150920600947e+00 -1.6284087669943997e-01 -1.3083620735159507e+00 -3.4249481876342038e+00 1.7447728672715979e-01 9.6209096294787255e-01 3.3702596553245141e+00 438 439 440 453 454 455 570 571 572 522 523 524 441 442 443 456 457 458 573 574 575 525 526 527 3.4120308374819146e+00 1.3689345515343907e+00 8.9275932736186769e-01 -3.6095390773920748e+00 -1.5383987730402082e+00 -8.6503153382389264e-01 -2.1124975895772375e+00 -1.3651317938270107e+00 -6.4654060335317864e-01 2.3307793780279051e+00 1.3298894972183366e+00 9.5154360869111021e-01 2.0028055194505097e+00 1.2698651789932003e+00 6.4906412461193641e-01 -2.2355014269441269e+00 -1.1320748834378556e+00 -8.4197108017479827e-01 -1.4011424967876749e+00 -1.1466873606740529e+00 -7.7900931265078821e-01 1.6130648557407863e+00 1.2136035832331988e+00 6.3918546933774423e-01 1.3689345515343907e+00 4.3330233871032702e+00 1.2443920681379697e+00 -1.5266398541449993e+00 -4.2015936139319452e+00 -1.0107220306574149e+00 -1.3201440091648533e+00 -3.1962194963819268e+00 -9.4711444134712930e-01 1.3342166820833492e+00 2.6872403309745794e+00 1.0877514958883199e+00 1.2364552986538682e+00 3.0404575887637773e+00 9.7837637966676971e-01 -1.3231681396986623e+00 -2.5737499111965789e+00 -1.0478978238281034e+00 -1.1250107753126910e+00 -2.2327676342222667e+00 -1.1033088162000635e+00 1.3553562460495983e+00 2.1436093488910899e+00 7.9852316833965342e-01 8.9275932736186769e-01 1.2443920681379697e+00 3.2419644607687790e+00 -8.4357631175979586e-01 -9.9211599567885900e-01 -2.8804576329575431e+00 -7.5200575581839380e-01 -1.1452150861604506e+00 -1.7298520640798170e+00 9.3471996871041063e-01 1.0675361493472726e+00 1.9693942696564253e+00 6.0856456303507478e-01 9.4499280614410652e-01 1.6136113921936044e+00 -9.2267003949010118e-01 -9.7927683252082154e-01 -1.9178288101463399e+00 -7.4485614594926775e-01 -1.0752683651173960e+00 -1.3372094412888209e+00 8.2706439391020592e-01 9.3495525584817796e-01 1.0403778258537120e+00 -3.6095390773920748e+00 -1.5266398541449995e+00 -8.4357631175979575e-01 3.9905385451401583e+00 1.6818016585448190e+00 7.2755181803362445e-01 2.3899117696451202e+00 1.5229148804705352e+00 6.4942722900170724e-01 -2.6954497428302568e+00 -1.4188429890933867e+00 -9.7294359354334414e-01 -2.2715127278896574e+00 -1.5724146594311810e+00 -5.8026533334238795e-01 2.5198838634789635e+00 1.3726065072007896e+00 7.9264842366446187e-01 1.6318707454828376e+00 1.3867114638374267e+00 8.6899931026923583e-01 -1.9557033756350908e+00 -1.4461370073840023e+00 -6.4184154232350266e-01 -1.5383987730402080e+00 -4.2015936139319443e+00 -9.9211599567885900e-01 1.6818016585448188e+00 4.1826808698187525e+00 7.7043769459806355e-01 1.5310451973880757e+00 3.1044735734246136e+00 8.1323687719155313e-01 -1.4982408253134529e+00 -2.6339245697670712e+00 -9.9288207243036519e-01 -1.2925114573143426e+00 -3.0378512832344446e+00 -6.8127969110774700e-01 1.3342474517728364e+00 2.5365083101191002e+00 7.9749939930061275e-01 1.1930498787124915e+00 2.1701938637647391e+00 9.5611689638615049e-01 -1.4109931307502190e+00 -2.1204871501937448e+00 -6.7101310825941007e-01 -8.6503153382389297e-01 -1.0107220306574149e+00 -2.8804576329575435e+00 7.2755181803362445e-01 7.7043769459806355e-01 2.7363346655094714e+00 6.1492801373407402e-01 7.6738099370401058e-01 1.5382888474576637e+00 -7.8461274506260736e-01 -7.5447140655377032e-01 -1.7024415073645021e+00 -5.0662775059619691e-01 -7.3818568307073629e-01 -1.4692169083575084e+00 8.0848934868575861e-01 8.3923091590374588e-01 1.6206845790729971e+00 6.0658633362627534e-01 7.7059385289332805e-01 1.0493647645822719e+00 -6.0128348459703518e-01 -6.4426433681722584e-01 -8.9255680794285064e-01 -2.1124975895772375e+00 -1.3201440091648531e+00 -7.5200575581839380e-01 2.3899117696451202e+00 1.5310451973880754e+00 6.1492801373407402e-01 3.5848178373915269e+00 1.6594365993347489e+00 6.7947103332768610e-01 -3.7850402932198053e+00 -1.6441831472868824e+00 -9.1821439214781264e-01 -1.4384259472145362e+00 -1.3407768376714060e+00 -4.7999079455161420e-01 1.6308656607494536e+00 1.1769620757174755e+00 7.3150396512743299e-01 2.1318776353302207e+00 1.3712288960993781e+00 7.3237654103705185e-01 -2.4015090731047413e+00 -1.4335687744165355e+00 -6.0806861070842522e-01 -1.3651317938270104e+00 -3.1962194963819277e+00 -1.1452150861604506e+00 1.5229148804705348e+00 3.1044735734246141e+00 7.6738099370401047e-01 1.6594365993347489e+00 4.9869887591361506e+00 1.0188030135444226e+00 -1.6710910511644141e+00 -4.3556851922807356e+00 -1.1561848786704572e+00 -1.2655573953304795e+00 -2.6839012353060658e+00 -7.4225369862491841e-01 1.4273694401241213e+00 2.1030928603847325e+00 1.0157710160558735e+00 1.3278914978834784e+00 3.2100686562553120e+00 1.0714899093318699e+00 -1.6358321774909792e+00 -3.1688179252320792e+00 -8.2979126918035151e-01 -6.4654060335317864e-01 -9.4711444134712930e-01 -1.7298520640798170e+00 6.4942722900170724e-01 8.1323687719155313e-01 1.5382888474576637e+00 6.7947103332768610e-01 1.0188030135444226e+00 2.8996647312414989e+00 -9.1292374266222354e-01 -1.1314522400813918e+00 -3.0451980493518991e+00 -4.9704198526825855e-01 -8.1418735415917920e-01 -9.0951769570495877e-01 6.7638528274350307e-01 7.7934984061324974e-01 1.0526017739994051e+00 7.1007024357930426e-01 1.0753583810714653e+00 1.7528196681074619e+00 -6.5884745736854022e-01 -7.9399407683298973e-01 -1.5588072116693543e+00 2.3307793780279051e+00 1.3342166820833492e+00 9.3471996871041063e-01 -2.6954497428302564e+00 -1.4982408253134529e+00 -7.8461274506260736e-01 -3.7850402932198053e+00 -1.6710910511644144e+00 -9.1292374266222354e-01 4.1837932267225595e+00 1.5650955810336240e+00 1.2249774068444987e+00 1.5871401192210959e+00 1.4797945386326929e+00 6.4131622054561899e-01 -1.9212668241637356e+00 -1.2261806960042447e+00 -9.6754670376165630e-01 -2.3538972053541869e+00 -1.4569605588304571e+00 -1.0302813821480663e+00 2.6539413415964241e+00 1.4733663295629018e+00 8.9435097753402615e-01 1.3298894972183366e+00 2.6872403309745798e+00 1.0675361493472726e+00 -1.4188429890933865e+00 -2.6339245697670708e+00 -7.5447140655377032e-01 -1.6441831472868824e+00 -4.3556851922807356e+00 -1.1314522400813918e+00 1.5650955810336240e+00 4.0035793172214582e+00 1.1532074725244212e+00 1.1382875996446653e+00 2.1051732120205138e+00 7.3652568578158850e-01 -1.2151055382029101e+00 -1.7481145721139943e+00 -8.9926470555747173e-01 -1.2011479692269520e+00 -2.7266640671622246e+00 -1.0785955124729383e+00 1.4460069659135049e+00 2.6683955411074711e+00 9.0651455701229111e-01 9.5154360869111021e-01 1.0877514958883199e+00 1.9693942696564253e+00 -9.7294359354334403e-01 -9.9288207243036508e-01 -1.7024415073645021e+00 -9.1821439214781253e-01 -1.1561848786704572e+00 -3.0451980493518991e+00 1.2249774068444985e+00 1.1532074725244212e+00 3.4270199472290499e+00 7.1608822733371935e-01 1.0593972567876755e+00 1.0083139059419577e+00 -9.6929986564428572e-01 -9.0909317421516056e-01 -1.3292680522909734e+00 -9.1569953533512094e-01 -1.1574448191842563e+00 -2.0502406060336069e+00 8.8354814380123514e-01 9.1524871929982232e-01 1.7224200922135491e+00 2.0028055194505097e+00 1.2364552986538684e+00 6.0856456303507467e-01 -2.2715127278896574e+00 -1.2925114573143426e+00 -5.0662775059619691e-01 -1.4384259472145364e+00 -1.2655573953304795e+00 -4.9704198526825855e-01 1.5871401192210961e+00 1.1382875996446653e+00 7.1608822733371924e-01 3.3700417750223610e+00 1.4549489373990678e+00 5.3953288219768136e-01 -3.4789708578761673e+00 -1.4964121230984428e+00 -7.4658544196011312e-01 -2.0125616588195432e+00 -1.2165020820877066e+00 -7.0775859064012470e-01 2.2414837781059385e+00 1.4412912221333689e+00 5.9382809589821883e-01 1.2698651789932001e+00 3.0404575887637773e+00 9.4499280614410630e-01 -1.5724146594311805e+00 -3.0378512832344451e+00 -7.3818568307073618e-01 -1.3407768376714060e+00 -2.6839012353060658e+00 -8.1418735415917920e-01 1.4797945386326929e+00 2.1051732120205138e+00 1.0593972567876753e+00 1.4549489373990681e+00 4.7953814764732794e+00 8.6160730698614529e-01 -1.4203444691300355e+00 -4.1002423987717371e+00 -9.5662357559967581e-01 -1.2833341783658438e+00 -3.1435396220754295e+00 -1.1318731117047767e+00 1.4122614895735053e+00 3.0245222621301053e+00 7.7487235461644255e-01 6.4906412461193641e-01 9.7837637966676971e-01 1.6136113921936044e+00 -5.8026533334238795e-01 -6.8127969110774722e-01 -1.4692169083575084e+00 -4.7999079455161420e-01 -7.4225369862491841e-01 -9.0951769570495877e-01 6.4131622054561899e-01 7.3652568578158850e-01 1.0083139059419577e+00 5.3953288219768147e-01 8.6160730698614529e-01 2.7814891874030860e+00 -7.6262365769736151e-01 -1.0276457091418834e+00 -2.8366747311278862e+00 -5.5858287325377076e-01 -8.6151441588349820e-01 -1.6825918963338296e+00 5.5154943148989777e-01 7.3618414232354323e-01 1.4945867459855355e+00 -2.2355014269441273e+00 -1.3231681396986625e+00 -9.2267003949010118e-01 2.5198838634789635e+00 1.3342474517728364e+00 8.0848934868575861e-01 1.6308656607494534e+00 1.4273694401241213e+00 6.7638528274350307e-01 -1.9212668241637356e+00 -1.2151055382029101e+00 -9.6929986564428583e-01 -3.4789708578761678e+00 -1.4203444691300355e+00 -7.6262365769736151e-01 3.8135434006375712e+00 1.3685697872718849e+00 1.0437701060982574e+00 2.2301379415647689e+00 1.2263454801341171e+00 8.8226762199452002e-01 -2.5586917574467267e+00 -1.3979140122713509e+00 -7.5631879669029123e-01 -1.1320748834378556e+00 -2.5737499111965794e+00 -9.7927683252082143e-01 1.3726065072007896e+00 2.5365083101191002e+00 8.3923091590374588e-01 1.1769620757174755e+00 2.1030928603847325e+00 7.7934984061324974e-01 -1.2261806960042447e+00 -1.7481145721139939e+00 -9.0909317421516056e-01 -1.4964121230984431e+00 -4.1002423987717371e+00 -1.0276457091418831e+00 1.3685697872718849e+00 3.7156031435338641e+00 1.0028713366538835e+00 1.2665866027936377e+00 2.6203247712132334e+00 1.0415985332276330e+00 -1.3300572704432450e+00 -2.5534222031686196e+00 -7.4703491052064774e-01 -8.4197108017479816e-01 -1.0478978238281034e+00 -1.9178288101463399e+00 7.9264842366446187e-01 7.9749939930061287e-01 1.6206845790729973e+00 7.3150396512743299e-01 1.0157710160558735e+00 1.0526017739994051e+00 -9.6754670376165630e-01 -8.9926470555747162e-01 -1.3292680522909734e+00 -7.4658544196011312e-01 -9.5662357559967603e-01 -2.8366747311278862e+00 1.0437701060982574e+00 1.0028713366538837e+00 3.1582121312604925e+00 8.8174830801224369e-01 1.0101321067016167e+00 1.9292795860997407e+00 -8.9356757700582878e-01 -9.2248775372673475e-01 -1.6770064768674366e+00 -1.4011424967876749e+00 -1.1250107753126910e+00 -7.4485614594926775e-01 1.6318707454828376e+00 1.1930498787124915e+00 6.0658633362627534e-01 2.1318776353302207e+00 1.3278914978834784e+00 7.1007024357930426e-01 -2.3538972053541873e+00 -1.2011479692269520e+00 -9.1569953533512094e-01 -2.0125616588195432e+00 -1.2833341783658438e+00 -5.5858287325377076e-01 2.2301379415647689e+00 1.2665866027936377e+00 8.8174830801224369e-01 3.4111342340579562e+00 1.3693549142933787e+00 9.1538610529264086e-01 -3.6374191954743775e+00 -1.5473899707774983e+00 -8.9465243597230559e-01 -1.1466873606740529e+00 -2.2327676342222662e+00 -1.0752683651173960e+00 1.3867114638374267e+00 2.1701938637647387e+00 7.7059385289332805e-01 1.3712288960993779e+00 3.2100686562553120e+00 1.0753583810714653e+00 -1.4569605588304571e+00 -2.7266640671622251e+00 -1.1574448191842563e+00 -1.2165020820877066e+00 -3.1435396220754295e+00 -8.6151441588349820e-01 1.2263454801341171e+00 2.6203247712132329e+00 1.0101321067016167e+00 1.3693549142933792e+00 4.4125986089305300e+00 1.3100859498272428e+00 -1.5334907527720851e+00 -4.3102145767038929e+00 -1.0719426903085036e+00 -7.7900931265078821e-01 -1.1033088162000633e+00 -1.3372094412888209e+00 8.6899931026923594e-01 9.5611689638615049e-01 1.0493647645822719e+00 7.3237654103705163e-01 1.0714899093318699e+00 1.7528196681074619e+00 -1.0302813821480663e+00 -1.0785955124729381e+00 -2.0502406060336069e+00 -7.0775859064012470e-01 -1.1318731117047767e+00 -1.6825918963338298e+00 8.8226762199452002e-01 1.0415985332276330e+00 1.9292795860997407e+00 9.1538610529264086e-01 1.3100859498272430e+00 3.3301523226379048e+00 -8.8198029315446913e-01 -1.0655138483951168e+00 -2.9915743977711227e+00 1.6130648557407861e+00 1.3553562460495983e+00 8.2706439391020592e-01 -1.9557033756350906e+00 -1.4109931307502190e+00 -6.0128348459703518e-01 -2.4015090731047413e+00 -1.6358321774909788e+00 -6.5884745736854022e-01 2.6539413415964237e+00 1.4460069659135049e+00 8.8354814380123525e-01 2.2414837781059385e+00 1.4122614895735053e+00 5.5154943148989777e-01 -2.5586917574467267e+00 -1.3300572704432445e+00 -8.9356757700582867e-01 -3.6374191954743775e+00 -1.5334907527720847e+00 -8.8198029315446935e-01 4.0448334262177870e+00 1.6967486299199177e+00 7.7351684292453560e-01 1.2136035832331988e+00 2.1436093488910899e+00 9.3495525584817807e-01 -1.4461370073840023e+00 -2.1204871501937448e+00 -6.4426433681722561e-01 -1.4335687744165355e+00 -3.1688179252320792e+00 -7.9399407683298961e-01 1.4733663295629018e+00 2.6683955411074711e+00 9.1524871929982221e-01 1.4412912221333689e+00 3.0245222621301053e+00 7.3618414232354323e-01 -1.3979140122713509e+00 -2.5534222031686196e+00 -9.2248775372673475e-01 -1.5473899707774987e+00 -4.3102145767038929e+00 -1.0655138483951170e+00 1.6967486299199177e+00 4.3164147031696682e+00 8.3987189830052511e-01 6.3918546933774434e-01 7.9852316833965331e-01 1.0403778258537120e+00 -6.4184154232350266e-01 -6.7101310825941007e-01 -8.9255680794285053e-01 -6.0806861070842522e-01 -8.2979126918035151e-01 -1.5588072116693543e+00 8.9435097753402604e-01 9.0651455701229122e-01 1.7224200922135493e+00 5.9382809589821883e-01 7.7487235461644244e-01 1.4945867459855355e+00 -7.5631879669029112e-01 -7.4703491052064774e-01 -1.6770064768674366e+00 -8.9465243597230570e-01 -1.0719426903085036e+00 -2.9915743977711227e+00 7.7351684292453560e-01 8.3987189830052511e-01 2.8625602301979676e+00 453 454 455 186 187 188 618 619 620 570 571 572 456 457 458 189 190 191 621 622 623 573 574 575 3.3446819743909582e+00 1.3199533079788490e+00 8.6573939596781835e-01 -3.5415527235070585e+00 -1.4926111373519388e+00 -8.4505840735697269e-01 -2.0166195324958562e+00 -1.3099298579852663e+00 -6.1298513694137247e-01 2.2389121093330071e+00 1.2783850252424200e+00 9.2604733418180696e-01 1.9550352588346753e+00 1.2224842242636071e+00 6.2773040479456488e-01 -2.1927252508711041e+00 -1.0895717643205871e+00 -8.2009175204534079e-01 -1.3405212138545779e+00 -1.0960274072697720e+00 -7.5330905709524854e-01 1.5527893781699562e+00 1.1673176094426883e+00 6.1192721849474396e-01 1.3199533079788486e+00 4.2557421580431747e+00 1.2170905594732162e+00 -1.4810226535764512e+00 -4.1178250139422001e+00 -9.8506679889933968e-01 -1.2690997238108905e+00 -3.0920876365920344e+00 -9.1107693252367861e-01 1.2853518094230481e+00 2.5746683024258363e+00 1.0569367449670275e+00 1.1944626660925712e+00 2.9829700048952410e+00 9.5878809697206613e-01 -1.2826752075765762e+00 -2.5139757293885685e+00 -1.0226197654245039e+00 -1.0796113484629564e+00 -2.1584025237932911e+00 -1.0788071948384028e+00 1.3126411499324064e+00 2.0689104383518435e+00 7.6475529027361466e-01 8.6573939596781824e-01 1.2170905594732166e+00 3.2043228281283729e+00 -8.1535290563648211e-01 -9.5621147595042266e-01 -2.8338437231507552e+00 -7.2185618553689368e-01 -1.1132515850272675e+00 -1.6579186140698658e+00 9.0839499443998295e-01 1.0337294193848305e+00 1.9066019916967354e+00 5.8060490450541391e-01 9.1138510444625997e-01 1.5868515748359036e+00 -9.0261522243470460e-01 -9.5190829190731274e-01 -1.8991817253237420e+00 -7.1895155030613545e-01 -1.0453221739132201e+00 -1.3050280275765465e+00 8.0403656900100129e-01 9.0448844349391633e-01 9.9819569545989706e-01 -3.5415527235070585e+00 -1.4810226535764517e+00 -8.1535290563648233e-01 3.9351823922623517e+00 1.6379728142990888e+00 7.0078116171108962e-01 2.2967920385780864e+00 1.4760810079481987e+00 6.1655964377154326e-01 -2.6131967353140944e+00 -1.3706050830829226e+00 -9.5034387975579726e-01 -2.2278549445286471e+00 -1.5323596576153158e+00 -5.5469529578864663e-01 2.4827667914742464e+00 1.3336732789691339e+00 7.6732197933736646e-01 1.5724249671579880e+00 1.3419243839482529e+00 8.4809879333614369e-01 -1.9045617861228727e+00 -1.4056640908899840e+00 -6.1236949697521592e-01 -1.4926111373519388e+00 -4.1178250139422001e+00 -9.5621147595042300e-01 1.6379728142990890e+00 4.1003675196989144e+00 7.3732200234781475e-01 1.4803757004289313e+00 2.9973225420976872e+00 7.7309325472305501e-01 -1.4461669531501595e+00 -2.5215027419925282e+00 -9.5987701729908670e-01 -1.2516926782480944e+00 -2.9792945727302582e+00 -6.5074730019874305e-01 1.2915626550626411e+00 2.4736494427961357e+00 7.6402761665241892e-01 1.1466661934023537e+00 2.0923803219136126e+00 9.2681530782405441e-01 -1.3661065944428217e+00 -2.0450974978413639e+00 -6.3442238809909024e-01 -8.4505840735697269e-01 -9.8506679889933957e-01 -2.8338437231507552e+00 7.0078116171108973e-01 7.3732200234781475e-01 2.6940664426210592e+00 5.8455082678850412e-01 7.3268934239453976e-01 1.4684979505982052e+00 -7.5752591940886593e-01 -7.2149820996618064e-01 -1.6363603021963393e+00 -4.8234459151439096e-01 -7.0716874635516302e-01 -1.4443095458346324e+00 7.9187250351255623e-01 8.1702722217470747e-01 1.5947735928010132e+00 5.8312372097645038e-01 7.4012110081135607e-01 1.0109880598584162e+00 -5.7539929470837103e-01 -6.1342591250773493e-01 -8.5381247469696619e-01 -2.0166195324958562e+00 -1.2690997238108908e+00 -7.2185618553689390e-01 2.2967920385780869e+00 1.4803757004289313e+00 5.8455082678850423e-01 3.3575641697131680e+00 1.5882143038070091e+00 6.3544566489999921e-01 -3.5584755279550060e+00 -1.5722249339588212e+00 -8.7960191930842213e-01 -1.3769364032521159e+00 -1.2924706477688628e+00 -4.5300552353824919e-01 1.5699293664129812e+00 1.1311572701337795e+00 7.0382522164258232e-01 2.0086544874550425e+00 1.3118624347828696e+00 7.0234211863086193e-01 -2.2809085984563007e+00 -1.3778144036140152e+00 -5.7170020357838192e-01 -1.3099298579852663e+00 -3.0920876365920344e+00 -1.1132515850272677e+00 1.4760810079481987e+00 2.9973225420976872e+00 7.3268934239453976e-01 1.5882143038070085e+00 4.7493570688043194e+00 9.6620981391722749e-01 -1.6093634244144448e+00 -4.1039491258545144e+00 -1.1179257939954368e+00 -1.2181485935007228e+00 -2.6158056093794526e+00 -7.1015367280050778e-01 1.3872130394957143e+00 2.0260943259773598e+00 9.8838256488335996e-01 1.2731866024822704e+00 3.0724235846877428e+00 1.0413422362857341e+00 -1.5872530778327585e+00 -3.0333551497411064e+00 -7.8729290565764853e-01 -6.1298513694137258e-01 -9.1107693252367861e-01 -1.6579186140698658e+00 6.1655964377154326e-01 7.7309325472305501e-01 1.4684979505982052e+00 6.3544566489999921e-01 9.6620981391722771e-01 2.7042620845001104e+00 -8.6941841157077948e-01 -1.0802899321491988e+00 -2.8483045234059943e+00 -4.6722675278049541e-01 -7.7706083718824126e-01 -8.7009994651614486e-01 6.4783106782046562e-01 7.4730428847107067e-01 1.0097996042058086e+00 6.7463139333787814e-01 1.0339147402867488e+00 1.6540453014721410e+00 -6.2483746853723898e-01 -7.5209439553698365e-01 -1.4602818567842595e+00 2.2389121093330075e+00 1.2853518094230485e+00 9.0839499443998295e-01 -2.6131967353140944e+00 -1.4461669531501595e+00 -7.5752591940886593e-01 -3.5584755279550060e+00 -1.6093634244144448e+00 -8.6941841157077948e-01 3.9727930060671168e+00 1.4956464030407717e+00 1.1934615026912274e+00 1.5266672428584727e+00 1.4368549488821785e+00 6.1601943905564260e-01 -1.8719596283065849e+00 -1.1796954072373420e+00 -9.4694261514146261e-01 -2.2367925172921792e+00 -1.4042306003087270e+00 -1.0057063406684115e+00 2.5420520506092683e+00 1.4216032237646756e+00 8.6171735060266585e-01 1.2783850252424200e+00 2.5746683024258363e+00 1.0337294193848308e+00 -1.3706050830829226e+00 -2.5215027419925282e+00 -7.2149820996618064e-01 -1.5722249339588212e+00 -4.1039491258545153e+00 -1.0802899321491988e+00 1.4956464030407715e+00 3.7570035316108510e+00 1.1071360869069364e+00 1.0930670994040914e+00 2.0233106833188619e+00 7.0788662138565939e-01 -1.1708461677598994e+00 -1.6715086131107726e+00 -8.6846632638397603e-01 -1.1449968811003353e+00 -2.5850256307523773e+00 -1.0437104590592281e+00 1.3915745382146958e+00 2.5270035943546434e+00 8.6521279988115651e-01 9.2604733418180696e-01 1.0569367449670277e+00 1.9066019916967354e+00 -9.5034387975579726e-01 -9.5987701729908659e-01 -1.6363603021963393e+00 -8.7960191930842213e-01 -1.1179257939954370e+00 -2.8483045234059947e+00 1.1934615026912274e+00 1.1071360869069360e+00 3.2473576112410139e+00 6.9073510111492531e-01 1.0326654229711332e+00 9.6847998625038223e-01 -9.5145087444250620e-01 -8.7920363132958224e-01 -1.2989378072867137e+00 -8.8696796209806117e-01 -1.1229039143220705e+00 -1.9646386699451104e+00 8.5812069761682741e-01 8.8317210210107888e-01 1.6258017136460261e+00 1.9550352588346753e+00 1.1944626660925715e+00 5.8060490450541391e-01 -2.2278549445286471e+00 -1.2516926782480944e+00 -4.8234459151439096e-01 -1.3769364032521159e+00 -1.2181485935007228e+00 -4.6722675278049541e-01 1.5266672428584727e+00 1.0930670994040914e+00 6.9073510111492531e-01 3.3302155631799653e+00 1.4116917532642979e+00 5.1501280387963477e-01 -3.4373322116585312e+00 -1.4640920714416001e+00 -7.2064334469023306e-01 -1.9382208310103697e+00 -1.1657446247986152e+00 -6.8086860417495021e-01 2.1684263255765495e+00 1.4004564492280718e+00 5.6473048366009548e-01 1.2224842242636071e+00 2.9829700048952419e+00 9.1138510444625997e-01 -1.5323596576153158e+00 -2.9792945727302582e+00 -7.0716874635516302e-01 -1.2924706477688628e+00 -2.6158056093794526e+00 -7.7706083718824126e-01 1.4368549488821785e+00 2.0233106833188619e+00 1.0326654229711334e+00 1.4116917532642979e+00 4.7497285009559942e+00 8.3138200543059815e-01 -1.3753212541790001e+00 -4.0408375851817704e+00 -9.2317603542053372e-01 -1.2364867984280832e+00 -3.0553166754896082e+00 -1.1049065824947277e+00 1.3656074315811779e+00 2.9352452536109905e+00 7.3687966861067333e-01 6.2773040479456488e-01 9.5878809697206613e-01 1.5868515748359036e+00 -5.5469529578864651e-01 -6.5074730019874294e-01 -1.4443095458346322e+00 -4.5300552353824913e-01 -7.1015367280050767e-01 -8.7009994651614486e-01 6.1601943905564260e-01 7.0788662138565916e-01 9.6847998625038223e-01 5.1501280387963477e-01 8.3138200543059837e-01 2.7622989963548998e+00 -7.4266693607438605e-01 -1.0100814787934989e+00 -2.8123988029217557e+00 -5.3354533231042667e-01 -8.3144824432962805e-01 -1.6313633137876771e+00 5.2515043998186628e-01 7.0437397233405352e-01 1.4405410516190247e+00 -2.1927252508711041e+00 -1.2826752075765762e+00 -9.0261522243470471e-01 2.4827667914742464e+00 1.2915626550626409e+00 7.9187250351255623e-01 1.5699293664129812e+00 1.3872130394957147e+00 6.4783106782046562e-01 -1.8719596283065849e+00 -1.1708461677598994e+00 -9.5145087444250631e-01 -3.4373322116585312e+00 -1.3753212541789999e+00 -7.4266693607438605e-01 3.7863637191548434e+00 1.3284840586083142e+00 1.0274173866564544e+00 2.1589643940150283e+00 1.1790703311169226e+00 8.6028011440659835e-01 -2.4960071802208788e+00 -1.3574874547681166e+00 -7.3066803944447734e-01 -1.0895717643205869e+00 -2.5139757293885689e+00 -9.5190829190731263e-01 1.3336732789691339e+00 2.4736494427961357e+00 8.1702722217470747e-01 1.1311572701337795e+00 2.0260943259773598e+00 7.4730428847107078e-01 -1.1796954072373420e+00 -1.6715086131107728e+00 -8.7920363132958212e-01 -1.4640920714416001e+00 -4.0408375851817704e+00 -1.0100814787934989e+00 1.3284840586083138e+00 3.6613319354333735e+00 9.7558269525119901e-01 1.2235465340801559e+00 2.5292896623510353e+00 1.0144925497714963e+00 -1.2835018987918543e+00 -2.4640434388767929e+00 -7.1321335363807958e-01 -8.2009175204534079e-01 -1.0226197654245042e+00 -1.8991817253237420e+00 7.6732197933736634e-01 7.6402761665241892e-01 1.5947735928010132e+00 7.0382522164258232e-01 9.8838256488336018e-01 1.0097996042058086e+00 -9.4694261514146261e-01 -8.6846632638397603e-01 -1.2989378072867137e+00 -7.2064334469023306e-01 -9.2317603542053372e-01 -2.8123988029217557e+00 1.0274173866564542e+00 9.7558269525119889e-01 3.1462243273894517e+00 8.5898105876414477e-01 9.7871091988917625e-01 1.8841997419002823e+00 -8.6986793452351152e-01 -8.9244166944714054e-01 -1.6244789307643446e+00 -1.3405212138545777e+00 -1.0796113484629564e+00 -7.1895155030613545e-01 1.5724249671579877e+00 1.1466661934023537e+00 5.8312372097645027e-01 2.0086544874550425e+00 1.2731866024822704e+00 6.7463139333787814e-01 -2.2367925172921792e+00 -1.1449968811003350e+00 -8.8696796209806117e-01 -1.9382208310103695e+00 -1.2364867984280830e+00 -5.3354533231042667e-01 2.1589643940150283e+00 1.2235465340801559e+00 8.5898105876414477e-01 3.2348414566544172e+00 1.3061558626723762e+00 8.8195619302861150e-01 -3.4593507431253498e+00 -1.4884601646457813e+00 -8.5922752139246095e-01 -1.0960274072697720e+00 -2.1584025237932911e+00 -1.0453221739132201e+00 1.3419243839482531e+00 2.0923803219136126e+00 7.4012110081135607e-01 1.3118624347828696e+00 3.0724235846877428e+00 1.0339147402867488e+00 -1.4042306003087268e+00 -2.5850256307523769e+00 -1.1229039143220703e+00 -1.1657446247986152e+00 -3.0553166754896082e+00 -8.3144824432962783e-01 1.1790703311169226e+00 2.5292896623510348e+00 9.7871091988917613e-01 1.3061558626723762e+00 4.2131025301696354e+00 1.2726943853770507e+00 -1.4730103801433077e+00 -4.1084512690867498e+00 -1.0257668137994127e+00 -7.5330905709524854e-01 -1.0788071948384028e+00 -1.3050280275765467e+00 8.4809879333614357e-01 9.2681530782405452e-01 1.0109880598584164e+00 7.0234211863086193e-01 1.0413422362857341e+00 1.6540453014721410e+00 -1.0057063406684115e+00 -1.0437104590592279e+00 -1.9646386699451106e+00 -6.8086860417495021e-01 -1.1049065824947277e+00 -1.6313633137876773e+00 8.6028011440659835e-01 1.0144925497714963e+00 1.8841997419002823e+00 8.8195619302861139e-01 1.2726943853770507e+00 3.1894250304191232e+00 -8.5279321746360504e-01 -1.0279202428659771e+00 -2.8376281223406288e+00 1.5527893781699562e+00 1.3126411499324064e+00 8.0403656900100129e-01 -1.9045617861228727e+00 -1.3661065944428221e+00 -5.7539929470837103e-01 -2.2809085984563007e+00 -1.5872530778327583e+00 -6.2483746853723887e-01 2.5420520506092683e+00 1.3915745382146958e+00 8.5812069761682741e-01 2.1684263255765490e+00 1.3656074315811781e+00 5.2515043998186628e-01 -2.4960071802208788e+00 -1.2835018987918545e+00 -8.6986793452351152e-01 -3.4593507431253498e+00 -1.4730103801433074e+00 -8.5279321746360526e-01 3.8775605535696296e+00 1.6400488314824617e+00 7.3559020863303104e-01 1.1673176094426883e+00 2.0689104383518435e+00 9.0448844349391644e-01 -1.4056640908899840e+00 -2.0450974978413639e+00 -6.1342591250773482e-01 -1.3778144036140152e+00 -3.0333551497411064e+00 -7.5209439553698376e-01 1.4216032237646756e+00 2.5270035943546434e+00 8.8317210210107888e-01 1.4004564492280718e+00 2.9352452536109905e+00 7.0437397233405363e-01 -1.3574874547681168e+00 -2.4640434388767929e+00 -8.9244166944714054e-01 -1.4884601646457811e+00 -4.1084512690867498e+00 -1.0279202428659771e+00 1.6400488314824617e+00 4.1197880692285347e+00 7.9384770242878655e-01 6.1192721849474396e-01 7.6475529027361477e-01 9.9819569545989695e-01 -6.1236949697521603e-01 -6.3442238809909024e-01 -8.5381247469696619e-01 -5.7170020357838192e-01 -7.8729290565764853e-01 -1.4602818567842595e+00 8.6171735060266585e-01 8.6521279988115640e-01 1.6258017136460261e+00 5.6473048366009537e-01 7.3687966861067333e-01 1.4405410516190247e+00 -7.3066803944447734e-01 -7.1321335363807947e-01 -1.6244789307643446e+00 -8.5922752139246095e-01 -1.0257668137994129e+00 -2.8376281223406288e+00 7.3559020863303126e-01 7.9384770242878655e-01 2.7116629238612511e+00 522 523 524 570 571 572 582 583 584 534 535 536 525 526 527 573 574 575 585 586 587 537 538 539 3.4401111603245504e+00 1.2457607959889252e+00 7.8447629636511551e-01 -3.5965186652816019e+00 -1.5045789557501443e+00 -8.3617108829306230e-01 -1.9263162501995015e+00 -1.1967410729651713e+00 -5.7870811830098801e-01 2.1161930981803354e+00 1.3034467700720549e+00 8.6678700404232933e-01 1.8659865908961679e+00 1.1371299225952376e+00 5.9093366387851121e-01 -2.0739281030082437e+00 -1.1145232357624666e+00 -7.6227242585985200e-01 -1.1560601363890848e+00 -1.0199137865676962e+00 -6.6507071634926451e-01 1.3305323054773783e+00 1.1494195623892611e+00 6.0002538451721055e-01 1.2457607959889250e+00 5.5972392071785446e+00 1.7207138557276926e+00 -1.4918513920555756e+00 -5.5216571445995504e+00 -1.4738418626965515e+00 -1.1645243466488970e+00 -4.1626832194338075e+00 -1.3311695622036257e+00 1.3016624168470790e+00 3.6489421590496134e+00 1.5114306732605862e+00 1.1061549443674952e+00 3.9944933453257185e+00 1.3753696499873431e+00 -1.3290541299539409e+00 -3.5189957047942206e+00 -1.4640522005809102e+00 -9.9723554034899453e-01 -2.9951277905289433e+00 -1.4878701158837953e+00 1.3290872518039099e+00 2.9577891478026452e+00 1.1494195623892605e+00 7.8447629636511507e-01 1.7207138557276924e+00 3.9569937887574049e+00 -8.1930767919823844e-01 -1.4552685894630775e+00 -3.5595350156971697e+00 -6.5794213915070254e-01 -1.5614551451293823e+00 -2.1554843586557557e+00 8.5364491309432133e-01 1.4935905732152663e+00 2.4065218892783942e+00 5.5919619401056542e-01 1.3402308761477877e+00 2.0490018435603519e+00 -8.7583810098183701e-01 -1.4075526621760057e+00 -2.3665431080297226e+00 -6.3782338764095203e-01 -1.4593461601261908e+00 -1.6614873446908831e+00 7.9359390350172843e-01 1.3290872518039099e+00 1.3305323054773779e+00 -3.5965186652816019e+00 -1.4918513920555756e+00 -8.1930767919823855e-01 3.9605634789455824e+00 1.7487221288561035e+00 7.7461779046727663e-01 2.1587274077042999e+00 1.4557382985451990e+00 6.3807791042166806e-01 -2.4660697923435926e+00 -1.5007147169025210e+00 -9.4257228476053811e-01 -2.0950794407436999e+00 -1.5239933855475551e+00 -6.1514134033244727e-01 2.3520213726042658e+00 1.4461439307417894e+00 8.0387919681140130e-01 1.3478429838056283e+00 1.3538252522463565e+00 8.2551712294014257e-01 -1.6614873446908840e+00 -1.4878701158837961e+00 -6.6507071634926451e-01 -1.5045789557501443e+00 -5.5216571445995504e+00 -1.4552685894630777e+00 1.7487221288561039e+00 5.5570693196018359e+00 1.2063755033543397e+00 1.4610254396492843e+00 4.1364570189954373e+00 1.1965619526455180e+00 -1.5597112611976407e+00 -3.6504386866526932e+00 -1.4148614814970428e+00 -1.2337458382500426e+00 -4.0492086911373324e+00 -1.0678852151634097e+00 1.4196812483324668e+00 3.5352474941242606e+00 1.2011663644450128e+00 1.1279533984861636e+00 2.9876584801969868e+00 1.3538252522463556e+00 -1.4593461601261910e+00 -2.9951277905289437e+00 -1.0199137865676955e+00 -8.3617108829306241e-01 -1.4738418626965517e+00 -3.5595350156971697e+00 7.7461779046727663e-01 1.2063755033543397e+00 3.3718311312095244e+00 6.1955124313264276e-01 1.1593313393640092e+00 1.9273965665913133e+00 -7.9792981810940289e-01 -1.1479276723008081e+00 -2.1205603136441016e+00 -5.1176816239192202e-01 -1.1119690618188136e+00 -1.8566509462970435e+00 8.1142471636839986e-01 1.2373138959606560e+00 2.0457357304209332e+00 5.7809870646702000e-01 1.1279533984861643e+00 1.3478429838056281e+00 -6.3782338764095248e-01 -9.9723554034899542e-01 -1.1560601363890850e+00 -1.9263162501995015e+00 -1.1645243466488970e+00 -6.5794213915070254e-01 2.1587274077042999e+00 1.4610254396492841e+00 6.1955124313264276e-01 3.5002316816749661e+00 1.4450827812482319e+00 6.2186397989695308e-01 -3.6780566229467468e+00 -1.5776116852570552e+00 -8.4355092650466257e-01 -1.1796361778136291e+00 -1.1608842332595626e+00 -4.6066647533166466e-01 1.3531377536450546e+00 1.1315196538261072e+00 6.6137452583675405e-01 1.9273965665913144e+00 1.1965619526455185e+00 6.3807791042166739e-01 -2.1554843586557579e+00 -1.3311695622036259e+00 -5.7870811830098767e-01 -1.1967410729651713e+00 -4.1626832194338075e+00 -1.5614551451293825e+00 1.4557382985451988e+00 4.1364570189954373e+00 1.1593313393640090e+00 1.4450827812482319e+00 6.2552282214163766e+00 1.4450827812482312e+00 -1.5924305083734369e+00 -5.6452476391495869e+00 -1.5924305083734367e+00 -1.1055787426773822e+00 -3.4962145856645179e+00 -1.1055787426773820e+00 1.3960530499879336e+00 2.9386864042744678e+00 1.3960530499879333e+00 1.1593313393640083e+00 4.1364570189954399e+00 1.4557382985451974e+00 -1.5614551451293825e+00 -4.1626832194338093e+00 -1.1967410729651704e+00 -5.7870811830098789e-01 -1.3311695622036257e+00 -2.1554843586557557e+00 6.3807791042166806e-01 1.1965619526455180e+00 1.9273965665913133e+00 6.2186397989695319e-01 1.4450827812482314e+00 3.5002316816749657e+00 -8.4355092650466279e-01 -1.5776116852570550e+00 -3.6780566229467464e+00 -4.6066647533166472e-01 -1.1608842332595624e+00 -1.1796361778136291e+00 6.6137452583675405e-01 1.1315196538261068e+00 1.3531377536450546e+00 6.1955124313264276e-01 1.4610254396492843e+00 2.1587274077043008e+00 -6.5794213915070265e-01 -1.1645243466488973e+00 -1.9263162501995028e+00 2.1161930981803354e+00 1.3016624168470790e+00 8.5364491309432133e-01 -2.4660697923435926e+00 -1.5597112611976405e+00 -7.9792981810940289e-01 -3.6780566229467468e+00 -1.5924305083734367e+00 -8.4355092650466268e-01 4.0676773627564220e+00 1.6347190856204425e+00 1.1455849159222846e+00 1.3125614083274491e+00 1.4263647061180529e+00 6.4270416054334101e-01 -1.6382670296081594e+00 -1.3071736307780408e+00 -9.2466796422767250e-01 -2.1205603136441020e+00 -1.4148614814970428e+00 -9.4257228476053734e-01 2.4065218892783964e+00 1.5114306732605864e+00 8.6678700404232889e-01 1.3034467700720547e+00 3.6489421590496134e+00 1.4935905732152663e+00 -1.5007147169025210e+00 -3.6504386866526932e+00 -1.1479276723008078e+00 -1.5776116852570554e+00 -5.6452476391495869e+00 -1.5776116852570550e+00 1.6347190856204428e+00 5.2625211671187380e+00 1.6347190856204425e+00 1.0952156107568005e+00 2.9336004453680458e+00 1.0952156107568003e+00 -1.3007179652041803e+00 -2.5478809181310398e+00 -1.3007179652041803e+00 -1.1479276723008072e+00 -3.6504386866526950e+00 -1.5007147169025199e+00 1.4935905732152668e+00 3.6489421590496161e+00 1.3034467700720540e+00 8.6678700404232933e-01 1.5114306732605862e+00 2.4065218892783937e+00 -9.4257228476053800e-01 -1.4148614814970430e+00 -2.1205603136441016e+00 -8.4355092650466268e-01 -1.5924305083734367e+00 -3.6780566229467464e+00 1.1455849159222844e+00 1.6347190856204421e+00 4.0676773627564220e+00 6.4270416054334123e-01 1.4263647061180533e+00 1.3125614083274488e+00 -9.2466796422767294e-01 -1.3071736307780411e+00 -1.6382670296081594e+00 -7.9792981810940278e-01 -1.5597112611976414e+00 -2.4660697923435930e+00 8.5364491309432156e-01 1.3016624168470794e+00 2.1161930981803367e+00 1.8659865908961679e+00 1.1061549443674954e+00 5.5919619401056542e-01 -2.0950794407436995e+00 -1.2337458382500424e+00 -5.1176816239192202e-01 -1.1796361778136288e+00 -1.1055787426773822e+00 -4.6066647533166472e-01 1.3125614083274491e+00 1.0952156107568005e+00 6.4270416054334123e-01 3.3946218695943351e+00 1.2857735140024080e+00 5.2481630415372760e-01 -3.4908051475239334e+00 -1.4553039230232130e+00 -7.3007434453011144e-01 -1.8566509462970444e+00 -1.0678852151634102e+00 -6.1514134033244694e-01 2.0490018435603541e+00 1.3753696499873440e+00 5.9093366387851098e-01 1.1371299225952376e+00 3.9944933453257185e+00 1.3402308761477877e+00 -1.5239933855475551e+00 -4.0492086911373333e+00 -1.1119690618188138e+00 -1.1608842332595626e+00 -3.4962145856645179e+00 -1.1608842332595624e+00 1.4263647061180527e+00 2.9336004453680458e+00 1.4263647061180533e+00 1.2857735140024080e+00 6.0323610379876413e+00 1.2857735140024076e+00 -1.3926523382375551e+00 -5.3603162060679432e+00 -1.3926523382375553e+00 -1.1119690618188129e+00 -4.0492086911373342e+00 -1.5239933855475540e+00 1.3402308761477877e+00 3.9944933453257212e+00 1.1371299225952369e+00 5.9093366387851121e-01 1.3753696499873431e+00 2.0490018435603519e+00 -6.1514134033244727e-01 -1.0678852151634097e+00 -1.8566509462970435e+00 -4.6066647533166466e-01 -1.1055787426773820e+00 -1.1796361778136291e+00 6.4270416054334101e-01 1.0952156107568003e+00 1.3125614083274488e+00 5.2481630415372749e-01 1.2857735140024071e+00 3.3946218695943351e+00 -7.3007434453011111e-01 -1.4553039230232123e+00 -3.4908051475239330e+00 -5.1176816239192180e-01 -1.2337458382500424e+00 -2.0950794407437003e+00 5.5919619401056542e-01 1.1061549443674952e+00 1.8659865908961693e+00 -2.0739281030082437e+00 -1.3290541299539409e+00 -8.7583810098183712e-01 2.3520213726042658e+00 1.4196812483324666e+00 8.1142471636839986e-01 1.3531377536450546e+00 1.3960530499879336e+00 6.6137452583675405e-01 -1.6382670296081596e+00 -1.3007179652041803e+00 -9.2466796422767294e-01 -3.4908051475239334e+00 -1.3926523382375549e+00 -7.3007434453011133e-01 3.8186485314998064e+00 1.4695759712111744e+00 1.0161743965829180e+00 2.0457357304209345e+00 1.2011663644450128e+00 8.0387919681140052e-01 -2.3665431080297243e+00 -1.4640522005809105e+00 -7.6227242585985167e-01 -1.1145232357624666e+00 -3.5189957047942202e+00 -1.4075526621760055e+00 1.4461439307417894e+00 3.5352474941242602e+00 1.2373138959606560e+00 1.1315196538261070e+00 2.9386864042744678e+00 1.1315196538261068e+00 -1.3071736307780408e+00 -2.5478809181310398e+00 -1.3071736307780411e+00 -1.4553039230232128e+00 -5.3603162060679432e+00 -1.4553039230232123e+00 1.4695759712111744e+00 4.9370071412644352e+00 1.4695759712111747e+00 1.2373138959606558e+00 3.5352474941242624e+00 1.4461439307417883e+00 -1.4075526621760062e+00 -3.5189957047942224e+00 -1.1145232357624661e+00 -7.6227242585985189e-01 -1.4640522005809102e+00 -2.3665431080297226e+00 8.0387919681140119e-01 1.2011663644450128e+00 2.0457357304209332e+00 6.6137452583675405e-01 1.3960530499879333e+00 1.3531377536450546e+00 -9.2466796422767250e-01 -1.3007179652041803e+00 -1.6382670296081594e+00 -7.3007434453011144e-01 -1.3926523382375553e+00 -3.4908051475239330e+00 1.0161743965829180e+00 1.4695759712111749e+00 3.8186485314998069e+00 8.1142471636839952e-01 1.4196812483324668e+00 2.3520213726042667e+00 -8.7583810098183712e-01 -1.3290541299539413e+00 -2.0739281030082455e+00 -1.1560601363890848e+00 -9.9723554034899453e-01 -6.3782338764095203e-01 1.3478429838056283e+00 1.1279533984861636e+00 5.7809870646702000e-01 1.9273965665913144e+00 1.1593313393640083e+00 6.1955124313264276e-01 -2.1205603136441020e+00 -1.1479276723008072e+00 -7.9792981810940278e-01 -1.8566509462970440e+00 -1.1119690618188129e+00 -5.1176816239192180e-01 2.0457357304209345e+00 1.2373138959606556e+00 8.1142471636839963e-01 3.3718311312095288e+00 1.2063755033543397e+00 7.7461779046727608e-01 -3.5595350156971755e+00 -1.4738418626965517e+00 -8.3617108829306197e-01 -1.0199137865676962e+00 -2.9951277905289433e+00 -1.4593461601261908e+00 1.3538252522463565e+00 2.9876584801969877e+00 1.1279533984861643e+00 1.1965619526455185e+00 4.1364570189954391e+00 1.4610254396492841e+00 -1.4148614814970426e+00 -3.6504386866526950e+00 -1.5597112611976414e+00 -1.0678852151634102e+00 -4.0492086911373342e+00 -1.2337458382500424e+00 1.2011663644450128e+00 3.5352474941242624e+00 1.4196812483324668e+00 1.2063755033543397e+00 5.5570693196018421e+00 1.7487221288561035e+00 -1.4552685894630792e+00 -5.5216571445995584e+00 -1.5045789557501446e+00 -6.6507071634926451e-01 -1.4878701158837953e+00 -1.6614873446908831e+00 8.2551712294014246e-01 1.3538252522463556e+00 1.3478429838056281e+00 6.3807791042166739e-01 1.4557382985451977e+00 2.1587274077043008e+00 -9.4257228476053734e-01 -1.5007147169025199e+00 -2.4660697923435930e+00 -6.1514134033244694e-01 -1.5239933855475540e+00 -2.0950794407437003e+00 8.0387919681140052e-01 1.4461439307417883e+00 2.3520213726042667e+00 7.7461779046727619e-01 1.7487221288561030e+00 3.9605634789455868e+00 -8.1930767919823799e-01 -1.4918513920555749e+00 -3.5965186652816068e+00 1.3305323054773783e+00 1.3290872518039096e+00 7.9359390350172843e-01 -1.6614873446908840e+00 -1.4593461601261912e+00 -6.3782338764095248e-01 -2.1554843586557575e+00 -1.5614551451293825e+00 -6.5794213915070254e-01 2.4065218892783964e+00 1.4935905732152668e+00 8.5364491309432156e-01 2.0490018435603541e+00 1.3402308761477875e+00 5.5919619401056542e-01 -2.3665431080297248e+00 -1.4075526621760062e+00 -8.7583810098183723e-01 -3.5595350156971755e+00 -1.4552685894630788e+00 -8.1930767919823799e-01 3.9569937887574129e+00 1.7207138557276933e+00 7.8447629636511540e-01 1.1494195623892614e+00 2.9577891478026452e+00 1.3290872518039099e+00 -1.4878701158837966e+00 -2.9951277905289437e+00 -9.9723554034899542e-01 -1.3311695622036259e+00 -4.1626832194338093e+00 -1.1645243466488973e+00 1.5114306732605862e+00 3.6489421590496161e+00 1.3016624168470794e+00 1.3753696499873440e+00 3.9944933453257212e+00 1.1061549443674952e+00 -1.4640522005809105e+00 -3.5189957047942233e+00 -1.3290541299539413e+00 -1.4738418626965517e+00 -5.5216571445995584e+00 -1.4918513920555747e+00 1.7207138557276935e+00 5.5972392071785508e+00 1.2457607959889245e+00 6.0002538451721055e-01 1.1494195623892607e+00 1.3305323054773779e+00 -6.6507071634926451e-01 -1.0199137865676955e+00 -1.1560601363890848e+00 -5.7870811830098756e-01 -1.1967410729651704e+00 -1.9263162501995028e+00 8.6678700404232889e-01 1.3034467700720540e+00 2.1161930981803367e+00 5.9093366387851098e-01 1.1371299225952369e+00 1.8659865908961695e+00 -7.6227242585985167e-01 -1.1145232357624661e+00 -2.0739281030082455e+00 -8.3617108829306175e-01 -1.5045789557501443e+00 -3.5965186652816064e+00 7.8447629636511540e-01 1.2457607959889248e+00 3.4401111603245567e+00 570 571 572 618 619 620 630 631 632 582 583 584 573 574 575 621 622 623 633 634 635 585 586 587 3.1827187640337611e+00 1.1330192760184652e+00 7.2272214691383085e-01 -3.3322289312875242e+00 -1.3948927383015672e+00 -7.8084901036969878e-01 -1.7495425692978122e+00 -1.0894547905136025e+00 -5.1947009386005583e-01 1.9401878460906059e+00 1.2017289862439509e+00 8.1292242674396142e-01 1.7272192055016247e+00 1.0380814994862717e+00 5.3975965165357231e-01 -1.9381628718901662e+00 -1.0213161556096590e+00 -7.1321103071043779e-01 -1.0557893842036488e+00 -9.2370241951432919e-01 -6.1246495339603080e-01 1.2255979410531614e+00 1.0565363421904708e+00 5.5059086302485893e-01 1.1330192760184654e+00 5.2061039547072596e+00 1.6186066709686835e+00 -1.3854442761557584e+00 -5.1227203294988195e+00 -1.3700778736920229e+00 -1.0592878495804272e+00 -3.8647214387854789e+00 -1.2285221286038608e+00 1.2044086304997579e+00 3.3457139211525835e+00 1.4140824318372707e+00 1.0121265052916597e+00 3.7399498962805806e+00 1.2901730833233651e+00 -1.2399313070618416e+00 -3.2657252191056090e+00 -1.3778230902925195e+00 -9.0598248624847577e-01 -2.7797460319155585e+00 -1.4029754357313864e+00 1.2410915072366215e+00 2.7411452471650439e+00 1.0565363421904719e+00 7.2272214691383097e-01 1.6186066709686839e+00 3.7105863416450058e+00 -7.6340977910547059e-01 -1.3471113822769369e+00 -3.2978965967541374e+00 -6.0063841544869812e-01 -1.4662978155112527e+00 -1.9789887338040946e+00 8.0207516208403384e-01 1.3955990431292855e+00 2.2409450636483670e+00 5.0754001725200382e-01 1.2470720353092821e+00 1.9101303752039538e+00 -8.3004483010598085e-01 -1.3172225856594280e+00 -2.2410830668414814e+00 -5.8732207618430099e-01 -1.3717374731962551e+00 -1.5692913241507744e+00 7.4907777459458291e-01 1.2410915072366220e+00 1.2255979410531621e+00 -3.3322289312875242e+00 -1.3854442761557588e+00 -7.6340977910547070e-01 3.7135658996716066e+00 1.6448089238834489e+00 7.1426980172843135e-01 1.9805242764138045e+00 1.3596424233456097e+00 5.8077490848848756e-01 -2.3030245655327435e+00 -1.4030714904792481e+00 -8.9326596754504850e-01 -1.9577150633899743e+00 -1.4351853650017492e+00 -5.6273685993931633e-01 2.2235793091574552e+00 1.3574661467783162e+00 7.5557626097835850e-01 1.2445903991181473e+00 1.2647590733607663e+00 7.8125658879058768e-01 -1.5692913241507731e+00 -1.4029754357313853e+00 -6.1246495339603069e-01 -1.3948927383015675e+00 -5.1227203294988195e+00 -1.3471113822769369e+00 1.6448089238834482e+00 5.1628352926534999e+00 1.0966852264042928e+00 1.3587053568369893e+00 3.8359839997770822e+00 1.0896115326846980e+00 -1.4609951980730578e+00 -3.3481720741648320e+00 -1.3168814376636082e+00 -1.1428954930665860e+00 -3.7952350025107742e+00 -9.7194422319164653e-01 1.3295236270648936e+00 3.2786178660811163e+00 1.1085836301967622e+00 1.0374829948521327e+00 2.7684362795782844e+00 1.2647590733607672e+00 -1.3717374731962539e+00 -2.7797460319155576e+00 -9.2370241951432985e-01 -7.8084901036969889e-01 -1.3700778736920227e+00 -3.2978965967541374e+00 7.1426980172843124e-01 1.0966852264042930e+00 3.1179860509929895e+00 5.6190873346415193e-01 1.0571126702131595e+00 1.7519572394928546e+00 -7.4396751638489866e-01 -1.0487320741374078e+00 -1.9490846901649754e+00 -4.6189616653615584e-01 -1.0168301890691021e+00 -1.7205372166871482e+00 7.6607689326997397e-01 1.1503417316774227e+00 1.9087741982059172e+00 5.3177934101249602e-01 1.0374829948521325e+00 1.2445903991181477e+00 -5.8732207618430055e-01 -9.0598248624847533e-01 -1.0557893842036494e+00 -1.7495425692978124e+00 -1.0592878495804272e+00 -6.0063841544869800e-01 1.9805242764138045e+00 1.3587053568369893e+00 5.6190873346415193e-01 3.1623713634034862e+00 1.3178687918832741e+00 5.5213109969794527e-01 -3.3361436772488142e+00 -1.4551786159612718e+00 -7.7432597912939904e-01 -1.0778238726270646e+00 -1.0635711554809173e+00 -4.0948761323052091e-01 1.2476459736676406e+00 1.0403740682215150e+00 6.0910736001808830e-01 1.7519572394928575e+00 1.0896115326846982e+00 5.8077490848848767e-01 -1.9789887338040975e+00 -1.2285221286038612e+00 -5.1947009386005616e-01 -1.0894547905136029e+00 -3.8647214387854780e+00 -1.4662978155112527e+00 1.3596424233456097e+00 3.8359839997770822e+00 1.0571126702131592e+00 1.3178687918832743e+00 5.7764247429730649e+00 1.3178687918832743e+00 -1.4786378314293021e+00 -5.1518445494214244e+00 -1.4786378314293018e+00 -1.0118568629251647e+00 -3.2862604001197560e+00 -1.0118568629251645e+00 1.3116234149372759e+00 2.7191550845849051e+00 1.3116234149372761e+00 1.0571126702131597e+00 3.8359839997770853e+00 1.3596424233456106e+00 -1.4662978155112518e+00 -3.8647214387854811e+00 -1.0894547905136036e+00 -5.1947009386005583e-01 -1.2285221286038610e+00 -1.9789887338040946e+00 5.8077490848848745e-01 1.0896115326846980e+00 1.7519572394928544e+00 5.5213109969794538e-01 1.3178687918832745e+00 3.1623713634034853e+00 -7.7432597912939904e-01 -1.4551786159612721e+00 -3.3361436772488151e+00 -4.0948761323052124e-01 -1.0635711554809177e+00 -1.0778238726270644e+00 6.0910736001808830e-01 1.0403740682215152e+00 1.2476459736676411e+00 5.6190873346415227e-01 1.3587053568369902e+00 1.9805242764138078e+00 -6.0063841544869800e-01 -1.0592878495804277e+00 -1.7495425692978155e+00 1.9401878460906059e+00 1.2044086304997579e+00 8.0207516208403384e-01 -2.3030245655327439e+00 -1.4609951980730580e+00 -7.4396751638489866e-01 -3.3361436772488151e+00 -1.4786378314293021e+00 -7.7432597912939916e-01 3.7470824505502605e+00 1.5151980474134952e+00 1.0873586233089358e+00 1.2083879231807046e+00 1.3400763942458704e+00 5.9201139147722670e-01 -1.5483503505234024e+00 -1.2172510368304250e+00 -8.8280814055480994e-01 -1.9490846901649777e+00 -1.3168814376636082e+00 -8.9326596754504917e-01 2.2409450636483692e+00 1.4140824318372702e+00 8.1292242674396198e-01 1.2017289862439506e+00 3.3457139211525835e+00 1.3955990431292855e+00 -1.4030714904792478e+00 -3.3481720741648320e+00 -1.0487320741374078e+00 -1.4551786159612723e+00 -5.1518445494214236e+00 -1.4551786159612721e+00 1.5151980474134952e+00 4.7792173802830282e+00 1.5151980474134954e+00 1.0071858361817472e+00 2.7103776491682257e+00 1.0071858361817470e+00 -1.2127297323905486e+00 -2.3328341740053324e+00 -1.2127297323905490e+00 -1.0487320741374080e+00 -3.3481720741648346e+00 -1.4030714904792490e+00 1.3955990431292851e+00 3.3457139211525853e+00 1.2017289862439520e+00 8.1292242674396142e-01 1.4140824318372707e+00 2.2409450636483670e+00 -8.9326596754504839e-01 -1.3168814376636082e+00 -1.9490846901649754e+00 -7.7432597912939916e-01 -1.4786378314293023e+00 -3.3361436772488151e+00 1.0873586233089358e+00 1.5151980474134954e+00 3.7470824505502609e+00 5.9201139147722692e-01 1.3400763942458707e+00 1.2083879231807046e+00 -8.8280814055480961e-01 -1.2172510368304252e+00 -1.5483503505234026e+00 -7.4396751638489889e-01 -1.4609951980730578e+00 -2.3030245655327466e+00 8.0207516208403340e-01 1.2044086304997577e+00 1.9401878460906086e+00 1.7272192055016247e+00 1.0121265052916597e+00 5.0754001725200382e-01 -1.9577150633899745e+00 -1.1428954930665860e+00 -4.6189616653615584e-01 -1.0778238726270646e+00 -1.0118568629251647e+00 -4.0948761323052124e-01 1.2083879231807046e+00 1.0071858361817470e+00 5.9201139147722681e-01 3.2048810018606231e+00 1.1850750219723898e+00 4.7196132849979550e-01 -3.2945423530427180e+00 -1.3678638675857646e+00 -6.7715174917660437e-01 -1.7205372166871515e+00 -9.7194422319164719e-01 -5.6273685993931710e-01 1.9101303752039565e+00 1.2901730833233658e+00 5.3975965165357309e-01 1.0380814994862717e+00 3.7399498962805802e+00 1.2470720353092821e+00 -1.4351853650017488e+00 -3.7952350025107733e+00 -1.0168301890691021e+00 -1.0635711554809173e+00 -3.2862604001197555e+00 -1.0635711554809177e+00 1.3400763942458704e+00 2.7103776491682261e+00 1.3400763942458707e+00 1.1850750219723900e+00 5.7240309695681795e+00 1.1850750219723900e+00 -1.2947182414620433e+00 -5.0375780061562621e+00 -1.2947182414620440e+00 -1.0168301890691023e+00 -3.7952350025107773e+00 -1.4351853650017503e+00 1.2470720353092810e+00 3.7399498962805824e+00 1.0380814994862726e+00 5.3975965165357243e-01 1.2901730833233653e+00 1.9101303752039540e+00 -5.6273685993931633e-01 -9.7194422319164642e-01 -1.7205372166871482e+00 -4.0948761323052091e-01 -1.0118568629251645e+00 -1.0778238726270644e+00 5.9201139147722670e-01 1.0071858361817470e+00 1.2083879231807046e+00 4.7196132849979561e-01 1.1850750219723898e+00 3.2048810018606226e+00 -6.7715174917660403e-01 -1.3678638675857642e+00 -3.2945423530427176e+00 -4.6189616653615584e-01 -1.1428954930665860e+00 -1.9577150633899776e+00 5.0754001725200348e-01 1.0121265052916597e+00 1.7272192055016276e+00 -1.9381628718901664e+00 -1.2399313070618416e+00 -8.3004483010598085e-01 2.2235793091574552e+00 1.3295236270648936e+00 7.6607689326997397e-01 1.2476459736676406e+00 1.3116234149372759e+00 6.0910736001808830e-01 -1.5483503505234024e+00 -1.2127297323905486e+00 -8.8280814055480961e-01 -3.2945423530427180e+00 -1.2947182414620433e+00 -6.7715174917660403e-01 3.6421391612667535e+00 1.3754716990080209e+00 9.7245523628141062e-01 1.9087741982059196e+00 1.1085836301967618e+00 7.5557626097835895e-01 -2.2410830668414836e+00 -1.3778230902925186e+00 -7.1321103071043812e-01 -1.0213161556096588e+00 -3.2657252191056090e+00 -1.3172225856594277e+00 1.3574661467783158e+00 3.2786178660811163e+00 1.1503417316774227e+00 1.0403740682215150e+00 2.7191550845849051e+00 1.0403740682215152e+00 -1.2172510368304255e+00 -2.3328341740053324e+00 -1.2172510368304252e+00 -1.3678638675857644e+00 -5.0375780061562621e+00 -1.3678638675857642e+00 1.3754716990080209e+00 4.6254718016256726e+00 1.3754716990080214e+00 1.1503417316774234e+00 3.2786178660811194e+00 1.3574661467783169e+00 -1.3172225856594280e+00 -3.2657252191056112e+00 -1.0213161556096597e+00 -7.1321103071043779e-01 -1.3778230902925195e+00 -2.2410830668414818e+00 7.5557626097835850e-01 1.1085836301967620e+00 1.9087741982059172e+00 6.0910736001808807e-01 1.3116234149372761e+00 1.2476459736676411e+00 -8.8280814055480994e-01 -1.2127297323905490e+00 -1.5483503505234026e+00 -6.7715174917660437e-01 -1.2947182414620437e+00 -3.2945423530427180e+00 9.7245523628141062e-01 1.3754716990080209e+00 3.6421391612667544e+00 7.6607689326997441e-01 1.3295236270648940e+00 2.2235793091574583e+00 -8.3004483010598074e-01 -1.2399313070618414e+00 -1.9381628718901696e+00 -1.0557893842036488e+00 -9.0598248624847577e-01 -5.8732207618430099e-01 1.2445903991181473e+00 1.0374829948521329e+00 5.3177934101249602e-01 1.7519572394928573e+00 1.0571126702131599e+00 5.6190873346415227e-01 -1.9490846901649777e+00 -1.0487320741374082e+00 -7.4396751638489889e-01 -1.7205372166871515e+00 -1.0168301890691023e+00 -4.6189616653615595e-01 1.9087741982059196e+00 1.1503417316774234e+00 7.6607689326997452e-01 3.1179860509930002e+00 1.0966852264042941e+00 7.1426980172843257e-01 -3.2978965967541463e+00 -1.3700778736920241e+00 -7.8084901036970034e-01 -9.2370241951432919e-01 -2.7797460319155585e+00 -1.3717374731962551e+00 1.2647590733607665e+00 2.7684362795782844e+00 1.0374829948521325e+00 1.0896115326846982e+00 3.8359839997770848e+00 1.3587053568369902e+00 -1.3168814376636080e+00 -3.3481720741648346e+00 -1.4609951980730580e+00 -9.7194422319164719e-01 -3.7952350025107773e+00 -1.1428954930665862e+00 1.1085836301967615e+00 3.2786178660811194e+00 1.3295236270648940e+00 1.0966852264042939e+00 5.1628352926535106e+00 1.6448089238834502e+00 -1.3471113822769372e+00 -5.1227203294988310e+00 -1.3948927383015695e+00 -6.1246495339603069e-01 -1.4029754357313864e+00 -1.5692913241507744e+00 7.8125658879058768e-01 1.2647590733607672e+00 1.2445903991181477e+00 5.8077490848848778e-01 1.3596424233456110e+00 1.9805242764138080e+00 -8.9326596754504917e-01 -1.4030714904792490e+00 -2.3030245655327466e+00 -5.6273685993931710e-01 -1.4351853650017503e+00 -1.9577150633899776e+00 7.5557626097835895e-01 1.3574661467783169e+00 2.2235793091574583e+00 7.1426980172843257e-01 1.6448089238834502e+00 3.7135658996716190e+00 -7.6340977910547103e-01 -1.3854442761557602e+00 -3.3322289312875353e+00 1.2255979410531614e+00 1.2410915072366215e+00 7.4907777459458291e-01 -1.5692913241507735e+00 -1.3717374731962542e+00 -5.8732207618430055e-01 -1.9789887338040975e+00 -1.4662978155112518e+00 -6.0063841544869800e-01 2.2409450636483688e+00 1.3955990431292851e+00 8.0207516208403329e-01 1.9101303752039565e+00 1.2470720353092810e+00 5.0754001725200337e-01 -2.2410830668414836e+00 -1.3172225856594280e+00 -8.3004483010598062e-01 -3.2978965967541463e+00 -1.3471113822769369e+00 -7.6340977910547081e-01 3.7105863416450156e+00 1.6186066709686837e+00 7.2272214691383185e-01 1.0565363421904708e+00 2.7411452471650444e+00 1.2410915072366220e+00 -1.4029754357313853e+00 -2.7797460319155580e+00 -9.0598248624847544e-01 -1.2285221286038612e+00 -3.8647214387854811e+00 -1.0592878495804277e+00 1.4140824318372704e+00 3.3457139211525853e+00 1.2044086304997577e+00 1.2901730833233658e+00 3.7399498962805833e+00 1.0121265052916597e+00 -1.3778230902925186e+00 -3.2657252191056116e+00 -1.2399313070618416e+00 -1.3700778736920243e+00 -5.1227203294988302e+00 -1.3854442761557602e+00 1.6186066709686839e+00 5.2061039547072703e+00 1.1330192760184670e+00 5.5059086302485905e-01 1.0565363421904719e+00 1.2255979410531621e+00 -6.1246495339603080e-01 -9.2370241951432985e-01 -1.0557893842036492e+00 -5.1947009386005616e-01 -1.0894547905136036e+00 -1.7495425692978155e+00 8.1292242674396198e-01 1.2017289862439520e+00 1.9401878460906086e+00 5.3975965165357309e-01 1.0380814994862726e+00 1.7272192055016276e+00 -7.1321103071043812e-01 -1.0213161556096597e+00 -1.9381628718901696e+00 -7.8084901036970011e-01 -1.3948927383015695e+00 -3.3322289312875357e+00 7.2272214691383196e-01 1.1330192760184667e+00 3.1827187640337717e+00 534 535 536 582 583 584 594 595 596 546 547 548 537 538 539 585 586 587 597 598 599 549 550 551 3.3016522892772993e+00 7.5424443279731213e-01 4.6739733277240808e-01 -3.3609403150489356e+00 -1.0759955397670165e+00 -6.0241543408106590e-01 -1.6764906956857832e+00 -6.9327581526213489e-01 -3.3823916103714380e-01 1.7822215379530288e+00 9.3082248858289740e-01 5.9475582681700800e-01 1.6546860725984081e+00 6.8132092042415682e-01 3.5793945426252344e-01 -1.7869613822005335e+00 -7.6715992312013204e-01 -5.0160540652157337e-01 -8.9278926427486671e-01 -5.9657695675144817e-01 -3.8198078938529745e-01 9.7862175738138180e-01 7.6662039309636532e-01 4.0414817717314089e-01 7.5424443279731201e-01 6.4532903332741380e+00 2.0674693473561274e+00 -1.0640456321116731e+00 -6.4726901437003370e+00 -1.8367516950954588e+00 -6.7784823915673365e-01 -4.7964407546954346e+00 -1.5962737144776853e+00 9.2437719341407609e-01 4.3434724412125520e+00 1.8233655524645620e+00 6.5821581935962903e-01 4.6508312981085087e+00 1.6677471819392304e+00 -1.0026366466164913e+00 -4.2301102587834558e+00 -1.7826080655096890e+00 -5.7767365159231177e-01 -3.5084935367360783e+00 -1.7513046195589075e+00 9.8536672390619129e-01 3.5601406213201074e+00 1.4083560128818204e+00 4.6739733277240814e-01 2.0674693473561274e+00 4.4163130600277842e+00 -5.9054294801123086e-01 -1.8189777453273934e+00 -4.0017237362526679e+00 -3.8263997284873685e-01 -1.8524008899552469e+00 -2.4186517271374548e+00 5.8525032822674916e-01 1.8114317527559280e+00 2.6822955656608638e+00 3.3803187582296013e-01 1.6319715392951155e+00 2.3396074581662001e+00 -6.4230045068974184e-01 -1.7441800546160122e+00 -2.6703477241919802e+00 -3.6464009347525150e-01 -1.7264253543066419e+00 -1.8703606497025316e+00 5.8944392820284264e-01 1.6311114047981239e+00 1.5228677534297868e+00 -3.3609403150489352e+00 -1.0640456321116734e+00 -5.9054294801123086e-01 3.6508111737263977e+00 1.4030028515438833e+00 6.2487651421206869e-01 1.8083736455132133e+00 1.0268690872233488e+00 4.5313851560695895e-01 -2.0579476840353226e+00 -1.2177064851233328e+00 -7.2631086866463168e-01 -1.7966340195638015e+00 -1.1262994035303822e+00 -4.7438307530831475e-01 2.0050748965145555e+00 1.1711130465707282e+00 6.3535905302535634e-01 9.9675103441206758e-01 9.9734675262855932e-01 6.0626991157320576e-01 -1.2454887315181737e+00 -1.1902802172011318e+00 -5.2840710243341227e-01 -1.0759955397670165e+00 -6.4726901437003379e+00 -1.8189777453273930e+00 1.4030028515438835e+00 6.6090046153076853e+00 1.5700567206336831e+00 1.0297223576978909e+00 4.8765505719938167e+00 1.4817348063322204e+00 -1.2539624453188152e+00 -4.4422614856522875e+00 -1.7466635405579507e+00 -8.3637184566654543e-01 -4.7994011368168836e+00 -1.3782168725164883e+00 1.1589505941304070e+00 4.3352315317978691e+00 1.5368543499129759e+00 7.4796733425678708e-01 3.5895181623416219e+00 1.6527752057461460e+00 -1.1733133068765904e+00 -3.6959521152714885e+00 -1.2975629242231927e+00 -6.0241543408106590e-01 -1.8367516950954585e+00 -4.0017237362526688e+00 6.2487651421206869e-01 1.5700567206336833e+00 3.7919045611717470e+00 4.4699376753378195e-01 1.4601391760172364e+00 2.1754816008128217e+00 -6.3064517081387816e-01 -1.4680824163407975e+00 -2.3925203507041690e+00 -3.5489737242261549e-01 -1.4045341004386691e+00 -2.1219541438108189e+00 6.4013266602064667e-01 1.5668653051543862e+00 2.3392423600520011e+00 3.9221773007867822e-01 1.3983787529243461e+00 1.5481363669156512e+00 -5.1626270052761525e-01 -1.2860717428547264e+00 -1.3385666581845650e+00 -1.6764906956857832e+00 -6.7784823915673365e-01 -3.8263997284873685e-01 1.8083736455132133e+00 1.0297223576978909e+00 4.4699376753378195e-01 3.2588743007206835e+00 8.4956762394701324e-01 3.7396633085765651e-01 -3.3537443393670086e+00 -1.1120506270184469e+00 -5.7017902959082589e-01 -9.0386893965214865e-01 -6.7395086750531619e-01 -2.8106515922988728e-01 1.0027106853113916e+00 7.6795714623648315e-01 4.2475525940850273e-01 1.6643687717665543e+00 6.9923419485316274e-01 3.7272756124976580e-01 -1.8002234286069021e+00 -8.8263158905405359e-01 -3.8455875738025685e-01 -6.9327581526213500e-01 -4.7964407546954346e+00 -1.8524008899552471e+00 1.0268690872233488e+00 4.8765505719938176e+00 1.4601391760172364e+00 8.4956762394701335e-01 7.0328323704868216e+00 1.7309247691790393e+00 -1.1175696757368911e+00 -6.5055239578719828e+00 -1.9026020233120398e+00 -6.4093114287525399e-01 -4.0378944155230565e+00 -1.3673310244673962e+00 1.0400308908483546e+00 3.5609895645411589e+00 1.6782337932684812e+00 6.7348152523053384e-01 4.7226231123085523e+00 1.7109765330252047e+00 -1.1381724933749688e+00 -4.8531364912398782e+00 -1.4579403337552783e+00 -3.3823916103714385e-01 -1.5962737144776853e+00 -2.4186517271374548e+00 4.5313851560695889e-01 1.4817348063322204e+00 2.1754816008128217e+00 3.7396633085765651e-01 1.7309247691790390e+00 3.8334628921067946e+00 -5.7108734592573740e-01 -1.8960468238620893e+00 -4.0325293401861320e+00 -2.7371462113379164e-01 -1.4003422121135054e+00 -1.3580194116094453e+00 4.8388987986977799e-01 1.3981242296610568e+00 1.5514264940630169e+00 3.6001866825229761e-01 1.7176051502726912e+00 2.3951120647132491e+00 -4.8797226649001718e-01 -1.4357262049917281e+00 -2.1462825727628503e+00 1.7822215379530288e+00 9.2437719341407609e-01 5.8525032822674916e-01 -2.0579476840353226e+00 -1.2539624453188152e+00 -6.3064517081387828e-01 -3.3537443393670086e+00 -1.1175696757368914e+00 -5.7108734592573740e-01 3.6773320800450704e+00 1.2993445354002755e+00 8.5539115158855594e-01 9.6884824094765365e-01 1.0498780255799809e+00 4.7557728084533873e-01 -1.2332486609310569e+00 -1.0625779727056617e+00 -7.0750037904026941e-01 -1.7801153774048586e+00 -1.0342452670096722e+00 -6.6760264160988936e-01 1.9966542027924923e+00 1.1947556063767075e+00 6.6061677672913033e-01 9.3082248858289740e-01 4.3434724412125520e+00 1.8114317527559280e+00 -1.2177064851233328e+00 -4.4422614856522875e+00 -1.4680824163407977e+00 -1.1120506270184469e+00 -6.5055239578719828e+00 -1.8960468238620898e+00 1.2993445354002762e+00 6.1637556419990478e+00 1.9973658274325965e+00 7.4138853535648974e-01 3.5459840959666455e+00 1.3744323755507768e+00 -1.0640573658485577e+00 -3.1979425536531085e+00 -1.6206726077794777e+00 -7.6630225099669758e-01 -4.2940399799026157e+00 -1.8056811751929376e+00 1.1885611696473701e+00 4.3865557979017513e+00 1.6072530674360006e+00 5.9475582681700800e-01 1.8233655524645618e+00 2.6822955656608647e+00 -7.2631086866463168e-01 -1.7466635405579505e+00 -2.3925203507041690e+00 -5.7017902959082600e-01 -1.9026020233120398e+00 -4.0325293401861320e+00 8.5539115158855594e-01 1.9973658274325963e+00 4.4333982174964603e+00 4.0894381777917471e-01 1.6917204082288253e+00 1.5153711461663077e+00 -7.0818972360916521e-01 -1.6200011659385629e+00 -1.8487715347895901e+00 -5.0599048610372943e-01 -1.8394197135010586e+00 -2.7122506009903922e+00 6.5157931178361261e-01 1.5962346551836299e+00 2.3550068973466498e+00 1.6546860725984081e+00 6.5821581935962903e-01 3.3803187582296013e-01 -1.7966340195638018e+00 -8.3637184566654532e-01 -3.5489737242261549e-01 -9.0386893965214865e-01 -6.4093114287525399e-01 -2.7371462113379164e-01 9.6884824094765365e-01 7.4138853535648974e-01 4.0894381777917471e-01 3.2652363180087201e+00 7.6543337280771007e-01 3.2844159933320838e-01 -3.2906879252037329e+00 -1.0513803872876499e+00 -5.1994169976574955e-01 -1.6410393365908935e+00 -6.1453638762426444e-01 -3.5320297985236998e-01 1.7434595894557945e+00 9.7818203592988484e-01 4.2633938023918327e-01 6.8132092042415704e-01 4.6508312981085087e+00 1.6319715392951157e+00 -1.1262994035303822e+00 -4.7994011368168836e+00 -1.4045341004386691e+00 -6.7395086750531619e-01 -4.0378944155230565e+00 -1.4003422121135054e+00 1.0498780255799809e+00 3.5459840959666455e+00 1.6917204082288253e+00 7.6543337280771007e-01 6.8611976988372065e+00 1.6018444784659343e+00 -1.0002140595034243e+00 -6.2725641045683611e+00 -1.7362064204777687e+00 -6.3455384712462037e-01 -4.6413031554500011e+00 -1.7928432263521412e+00 9.3838585885189363e-01 4.6931497194459402e+00 1.4083895333922085e+00 3.5793945426252344e-01 1.6677471819392304e+00 2.3396074581662001e+00 -4.7438307530831481e-01 -1.3782168725164883e+00 -2.1219541438108194e+00 -2.8106515922988728e-01 -1.3673310244673962e+00 -1.3580194116094453e+00 4.7557728084533879e-01 1.3744323755507768e+00 1.5153711461663075e+00 3.2844159933320832e-01 1.6018444784659345e+00 3.7924531865253357e+00 -5.0913921405005524e-01 -1.7898205954161057e+00 -3.9182560891545921e+00 -3.0050690500367783e-01 -1.4996536808851100e+00 -2.3553338619844504e+00 4.0313601915086378e-01 1.3909981373291593e+00 2.1061317157014638e+00 -1.7869613822005332e+00 -1.0026366466164911e+00 -6.4230045068974184e-01 2.0050748965145555e+00 1.1589505941304070e+00 6.4013266602064667e-01 1.0027106853113918e+00 1.0400308908483546e+00 4.8388987986977799e-01 -1.2332486609310569e+00 -1.0640573658485577e+00 -7.0818972360916521e-01 -3.2906879252037333e+00 -1.0002140595034248e+00 -5.0913921405005524e-01 3.5595916028661119e+00 1.2036135910174068e+00 7.8876917890354092e-01 1.7471723751744901e+00 8.5374986460896374e-01 5.4916808777563486e-01 -2.0036515915312250e+00 -1.1894368686366592e+00 -6.0233042422063776e-01 -7.6715992312013204e-01 -4.2301102587834549e+00 -1.7441800546160122e+00 1.1711130465707282e+00 4.3352315317978691e+00 1.5668653051543862e+00 7.6795714623648315e-01 3.5609895645411589e+00 1.3981242296610568e+00 -1.0625779727056617e+00 -3.1979425536531081e+00 -1.6200011659385631e+00 -1.0513803872876497e+00 -6.2725641045683611e+00 -1.7898205954161059e+00 1.2036135910174066e+00 5.8838328043832897e+00 1.8527176158121637e+00 8.8653501780684929e-01 4.2000205248021345e+00 1.7455738509530052e+00 -1.1481005185180226e+00 -4.2794575085195277e+00 -1.4092791856099303e+00 -5.0160540652157337e-01 -1.7826080655096888e+00 -2.6703477241919802e+00 6.3535905302535645e-01 1.5368543499129759e+00 2.3392423600520011e+00 4.2475525940850273e-01 1.6782337932684814e+00 1.5514264940630167e+00 -7.0750037904026930e-01 -1.6206726077794777e+00 -1.8487715347895901e+00 -5.1994169976574944e-01 -1.7362064204777685e+00 -3.9182560891545921e+00 7.8876917890354081e-01 1.8527176158121637e+00 4.2585257429948067e+00 5.6329290892302208e-01 1.7281380674370663e+00 2.6227698075825518e+00 -6.8312891493282879e-01 -1.6564567326637532e+00 -2.3345890565562146e+00 -8.9278926427486671e-01 -5.7767365159231177e-01 -3.6464009347525145e-01 9.9675103441206758e-01 7.4796733425678708e-01 3.9221773007867822e-01 1.6643687717665545e+00 6.7348152523053395e-01 3.6001866825229761e-01 -1.7801153774048590e+00 -7.6630225099669769e-01 -5.0599048610372943e-01 -1.6410393365908933e+00 -6.3455384712462037e-01 -3.0050690500367777e-01 1.7471723751744901e+00 8.8653501780684929e-01 5.6329290892302208e-01 3.1869535359282470e+00 7.0530627174639893e-01 4.4345862971611977e-01 -3.2813017390107397e+00 -1.0347603993269401e+00 -5.8785045238745892e-01 -5.9657695675144817e-01 -3.5084935367360783e+00 -1.7264253543066419e+00 9.9734675262855932e-01 3.5895181623416215e+00 1.3983787529243461e+00 6.9923419485316274e-01 4.7226231123085531e+00 1.7176051502726912e+00 -1.0342452670096722e+00 -4.2940399799026165e+00 -1.8394197135010586e+00 -6.1453638762426432e-01 -4.6413031554500002e+00 -1.4996536808851100e+00 8.5374986460896363e-01 4.2000205248021345e+00 1.7281380674370665e+00 7.0530627174639904e-01 6.2667693472649493e+00 2.0388544720707076e+00 -1.0102784724516982e+00 -6.3350944746285656e+00 -1.8174776940120001e+00 -3.8198078938529745e-01 -1.7513046195589075e+00 -1.8703606497025316e+00 6.0626991157320587e-01 1.6527752057461462e+00 1.5481363669156512e+00 3.7272756124976586e-01 1.7109765330252045e+00 2.3951120647132491e+00 -6.6760264160988936e-01 -1.8056811751929374e+00 -2.7122506009903922e+00 -3.5320297985236998e-01 -1.7928432263521410e+00 -2.3553338619844504e+00 5.4916808777563486e-01 1.7455738509530050e+00 2.6227698075825518e+00 4.4345862971611988e-01 2.0388544720707076e+00 4.3178180930095094e+00 -5.6883777946716862e-01 -1.7983510406910783e+00 -3.9458912195435865e+00 9.7862175738138180e-01 9.8536672390619129e-01 5.8944392820284264e-01 -1.2454887315181737e+00 -1.1733133068765902e+00 -5.1626270052761525e-01 -1.8002234286069021e+00 -1.1381724933749688e+00 -4.8797226649001713e-01 1.9966542027924925e+00 1.1885611696473701e+00 6.5157931178361261e-01 1.7434595894557945e+00 9.3838585885189374e-01 4.0313601915086378e-01 -2.0036515915312250e+00 -1.1481005185180226e+00 -6.8312891493282879e-01 -3.2813017390107397e+00 -1.0102784724516982e+00 -5.6883777946716840e-01 3.6119299410373711e+00 1.3575510388158252e+00 6.1204240228031037e-01 7.6662039309636532e-01 3.5601406213201070e+00 1.6311114047981237e+00 -1.1902802172011318e+00 -3.6959521152714885e+00 -1.2860717428547266e+00 -8.8263158905405370e-01 -4.8531364912398782e+00 -1.4357262049917281e+00 1.1947556063767073e+00 4.3865557979017513e+00 1.5962346551836299e+00 9.7818203592988484e-01 4.6931497194459411e+00 1.3909981373291593e+00 -1.1894368686366592e+00 -4.2794575085195286e+00 -1.6564567326637529e+00 -1.0347603993269401e+00 -6.3350944746285656e+00 -1.7983510406910783e+00 1.3575510388158252e+00 6.5237944509916614e+00 1.5582615238903716e+00 4.0414817717314089e-01 1.4083560128818204e+00 1.5228677534297868e+00 -5.2840710243341227e-01 -1.2975629242231927e+00 -1.3385666581845650e+00 -3.8455875738025685e-01 -1.4579403337552781e+00 -2.1462825727628498e+00 6.6061677672913033e-01 1.6072530674360006e+00 2.3550068973466498e+00 4.2633938023918339e-01 1.4083895333922085e+00 2.1061317157014643e+00 -6.0233042422063776e-01 -1.4092791856099300e+00 -2.3345890565562142e+00 -5.8785045238745881e-01 -1.8174776940120001e+00 -3.9458912195435865e+00 6.1204240228031048e-01 1.5582615238903716e+00 3.7813231405693148e+00 582 583 584 630 631 632 642 643 644 594 595 596 585 586 587 633 634 635 645 646 647 597 598 599 2.9873392231113436e+00 6.6078451579535380e-01 4.1551715590950905e-01 -3.0344058417243982e+00 -9.8378821860483789e-01 -5.5592483500803014e-01 -1.5144745113323861e+00 -6.0944736436889357e-01 -2.9398963566766090e-01 1.6156516722831971e+00 8.5140029809954787e-01 5.5270819691735773e-01 1.5036979734036349e+00 6.0097701135401949e-01 3.1528198632248855e-01 -1.6352407701053560e+00 -6.9088874311930337e-01 -4.6118575127290173e-01 -8.1342371197842189e-01 -5.2197189527619592e-01 -3.3988857057276672e-01 8.9085596634238662e-01 6.9293439612031005e-01 3.6748145337200405e-01 6.6078451579535380e-01 5.8847628707621924e+00 1.9215554085640025e+00 -9.7783561084538273e-01 -5.8949193218909492e+00 -1.6844610408383498e+00 -5.9331314389647427e-01 -4.4135174936709829e+00 -1.4614226848452929e+00 8.4965523578069158e-01 3.9558537334191608e+00 1.6918515718683511e+00 5.8127380205641321e-01 4.2865855443036365e+00 1.5429361166548992e+00 -9.3146311999881748e-01 -3.8658942292298542e+00 -1.6615945596132429e+00 -5.0579211867473828e-01 -3.2269947468927862e+00 -1.6352049806664137e+00 9.1669043978295361e-01 3.2741236431995850e+00 1.2863401688760465e+00 4.1551715590950905e-01 1.9215554085640023e+00 4.0573028980293344e+00 -5.4845313592562706e-01 -1.6704778988643452e+00 -3.6232964892166803e+00 -3.3718263883738631e-01 -1.7255057140418255e+00 -2.2076985344110316e+00 5.4646282392911871e-01 1.6817708382279695e+00 2.4795711311945245e+00 2.9777592096156075e-01 1.5080787364792576e+00 2.1407511219939721e+00 -6.0649114085901945e-01 -1.6188322202868999e+00 -2.4855565841547538e+00 -3.2444945482363280e-01 -1.6108006912404675e+00 -1.7549389629796002e+00 5.5682046964547627e-01 1.5142115411623089e+00 1.3938654195442337e+00 -3.0344058417243982e+00 -9.7783561084538251e-01 -5.4845313592562683e-01 3.3405028916219335e+00 1.3196282929879548e+00 5.7531946666215239e-01 1.6398906686759516e+00 9.5310392324643012e-01 4.1105367746228139e-01 -1.9031640216321062e+00 -1.1426234987128632e+00 -6.8860973613592591e-01 -1.6428474876993424e+00 -1.0567372719990404e+00 -4.3308227180470638e-01 1.8597391814573276e+00 1.1006266097033575e+00 5.9884665263378511e-01 9.1016075669334273e-01 9.2936122476493233e-01 5.7360512745795234e-01 -1.1698761473927086e+00 -1.1255236691453889e+00 -4.8867978034991222e-01 -9.8378821860483812e-01 -5.8949193218909501e+00 -1.6704778988643452e+00 1.3196282929879550e+00 6.0359314595405982e+00 1.4133952209797949e+00 9.4994961437688552e-01 4.4903256551298059e+00 1.3424494330829493e+00 -1.1812427612315270e+00 -4.0540885709614551e+00 -1.6148876279182034e+00 -7.6243958932786504e-01 -4.4355809257328751e+00 -1.2446167049970638e+00 1.0879806032604933e+00 3.9667272338370552e+00 1.4119315863693240e+00 6.7768338371750192e-01 3.3031626116490944e+00 1.5335199715739976e+00 -1.1077713251786050e+00 -3.4115581415712755e+00 -1.1713139802264536e+00 -5.5592483500803014e-01 -1.6844610408383498e+00 -3.6232964892166803e+00 5.7531946666215261e-01 1.4133952209797949e+00 3.4196075774719672e+00 4.0253134541729985e-01 1.3220355412978182e+00 1.9615203690203027e+00 -5.8982911182526432e-01 -1.3330068698347861e+00 -2.1806943458937460e+00 -3.1516452757979840e-01 -1.2729526088473360e+00 -1.9232912985147830e+00 6.0261485546397509e-01 1.4397206196987673e+00 2.1401439270442228e+00 3.5735994503481661e-01 1.2766969003577382e+00 1.4180051885472664e+00 -4.7690713816515073e-01 -1.1614277628136473e+00 -1.2119949284585483e+00 -1.5144745113323861e+00 -5.9331314389647438e-01 -3.3718263883738631e-01 1.6398906686759516e+00 9.4994961437688552e-01 4.0253134541729985e-01 2.9757478521159895e+00 7.5362842153790477e-01 3.2460324284675174e-01 -3.0614123551580343e+00 -1.0240126300141248e+00 -5.1859292906320020e-01 -8.2282891297715577e-01 -5.9602443500026958e-01 -2.4161215728153629e-01 9.1459622334955004e-01 6.9686013363656774e-01 3.8343764313171641e-01 1.5278401537440724e+00 6.1797227770098773e-01 3.2879614157516801e-01 -1.6593591184179870e+00 -8.0506023834147711e-01 -3.4198064778881287e-01 -6.0944736436889357e-01 -4.4135174936709820e+00 -1.7255057140418255e+00 9.5310392324643012e-01 4.4903256551298067e+00 1.3220355412978182e+00 7.5362842153790477e-01 6.5045036928861437e+00 1.5742029712098387e+00 -1.0338551525121620e+00 -5.9629984610834974e+00 -1.7532321049768549e+00 -5.6740843625460946e-01 -3.7603242272532098e+00 -1.2418549859907841e+00 9.7493193556169933e-01 3.2727375639801997e+00 1.5637799806372734e+00 5.9562462462701082e-01 4.3717497751005130e+00 1.5826629999873483e+00 -1.0665779518373788e+00 -4.5024765050889721e+00 -1.3220886881228131e+00 -2.9398963566766090e-01 -1.4614226848452929e+00 -2.2076985344110316e+00 4.1105367746228139e-01 1.3424494330829495e+00 1.9615203690203027e+00 3.2460324284675179e-01 1.5742029712098382e+00 3.4939965159296684e+00 -5.2172143376612778e-01 -1.7463615153819632e+00 -3.6868890211681276e+00 -2.3613938587936165e-01 -1.2750288347470125e+00 -1.2315151838091454e+00 4.4390071072978743e-01 1.2770424566796306e+00 1.4220816004162740e+00 3.1822574635899564e-01 1.5911493597086088e+00 2.2084297709519531e+00 -4.4593292208466540e-01 -1.3020311857067592e+00 -1.9599255169298946e+00 1.6156516722831971e+00 8.4965523578069158e-01 5.4646282392911871e-01 -1.9031640216321062e+00 -1.1812427612315270e+00 -5.8982911182526432e-01 -3.0614123551580348e+00 -1.0338551525121620e+00 -5.2172143376612767e-01 3.4045553793438930e+00 1.2138016834080814e+00 8.1505494105857412e-01 8.8191632368063888e-01 9.8486150996142319e-01 4.3580753222780977e-01 -1.1595262859485738e+00 -9.9475178650964469e-01 -6.7747308241018944e-01 -1.6438769094565584e+00 -9.6171836974295077e-01 -6.3149274625075558e-01 1.8658561968875440e+00 1.1232496408460890e+00 6.2319107703683396e-01 8.5140029809954776e-01 3.9558537334191617e+00 1.6817708382279697e+00 -1.1426234987128630e+00 -4.0540885709614551e+00 -1.3330068698347861e+00 -1.0240126300141248e+00 -5.9629984610834965e+00 -1.7463615153819629e+00 1.2138016834080809e+00 5.6287327577280504e+00 1.8468378963984549e+00 6.7366265891251853e-01 3.2574089710714378e+00 1.2543066172040198e+00 -9.9614912513664844e-01 -2.9134825688242154e+00 -1.5037394107053708e+00 -6.9316993685800410e-01 -3.9420113442322853e+00 -1.6796553632106452e+00 1.1170905503014921e+00 4.0305854828828052e+00 1.4798478073023216e+00 5.5270819691735762e-01 1.6918515718683509e+00 2.4795711311945250e+00 -6.8860973613592591e-01 -1.6148876279182034e+00 -2.1806943458937460e+00 -5.1859292906320020e-01 -1.7532321049768551e+00 -3.6868890211681276e+00 8.1505494105857412e-01 1.8468378963984549e+00 4.1062224220382904e+00 3.6889101966707594e-01 1.5745885450803110e+00 1.3852867794792096e+00 -6.7635246225277934e-01 -1.4991165329980627e+00 -1.7332473519554505e+00 -4.6584706911886842e-01 -1.7120509885972044e+00 -2.5389098107919859e+00 6.1274803892776575e-01 1.4660092411432091e+00 2.1686601970972843e+00 1.5036979734036346e+00 5.8127380205641332e-01 2.9777592096156080e-01 -1.6428474876993422e+00 -7.6243958932786493e-01 -3.1516452757979840e-01 -8.2282891297715566e-01 -5.6740843625460946e-01 -2.3613938587936167e-01 8.8191632368063888e-01 6.7366265891251853e-01 3.6889101966707594e-01 3.0292555057533068e+00 6.8171602952964350e-01 2.8603526532435430e-01 -3.0443865855313512e+00 -9.7875929457583555e-01 -4.7730327763810171e-01 -1.5183804032012795e+00 -5.4066747922386815e-01 -3.1251129160739144e-01 1.6135735865715479e+00 9.1262230888360285e-01 3.8841627675166207e-01 6.0097701135401949e-01 4.2865855443036365e+00 1.5080787364792576e+00 -1.0567372719990404e+00 -4.4355809257328760e+00 -1.2729526088473360e+00 -5.9602443500026958e-01 -3.7603242272532098e+00 -1.2750288347470125e+00 9.8486150996142308e-01 3.2574089710714373e+00 1.5745885450803110e+00 6.8171602952964361e-01 6.4008667467436435e+00 1.4604409482203198e+00 -9.2158268783759834e-01 -5.7973931612983653e+00 -1.6021681289070280e+00 -5.5862542817088390e-01 -4.3132322123189235e+00 -1.6727930664411370e+00 8.6541527216270520e-01 4.3616692644846564e+00 1.2798344091626239e+00 3.1528198632248855e-01 1.5429361166548992e+00 2.1407511219939721e+00 -4.3308227180470638e-01 -1.2446167049970638e+00 -1.9232912985147830e+00 -2.4161215728153632e-01 -1.2418549859907841e+00 -1.2315151838091454e+00 4.3580753222780988e-01 1.2543066172040198e+00 1.3852867794792096e+00 2.8603526532435430e-01 1.4604409482203200e+00 3.5048916321913195e+00 -4.6378093653941793e-01 -1.6573827735305484e+00 -3.6243314620087288e+00 -2.6122990836436799e-01 -1.3773113024971901e+00 -2.1851607182366966e+00 3.6258049011537558e-01 1.2634820849363484e+00 1.9333691289048514e+00 -1.6352407701053560e+00 -9.3146311999881748e-01 -6.0649114085901945e-01 1.8597391814573276e+00 1.0879806032604933e+00 6.0261485546397509e-01 9.1459622334955004e-01 9.7493193556169933e-01 4.4390071072978743e-01 -1.1595262859485738e+00 -9.9614912513664844e-01 -6.7635246225277934e-01 -3.0443865855313517e+00 -9.2158268783759822e-01 -4.6378093653941804e-01 3.3318006848978596e+00 1.1268760598278063e+00 7.5405008126735196e-01 1.6192913171993359e+00 7.8178170043734596e-01 5.1095359898448067e-01 -1.8862737653187922e+00 -1.1223753661142812e+00 -5.6489470679437803e-01 -6.9088874311930337e-01 -3.8658942292298542e+00 -1.6188322202868999e+00 1.1006266097033575e+00 3.9667272338370552e+00 1.4397206196987669e+00 6.9686013363656774e-01 3.2727375639801992e+00 1.2770424566796308e+00 -9.9475178650964469e-01 -2.9134825688242154e+00 -1.4991165329980627e+00 -9.7875929457583555e-01 -5.7973931612983645e+00 -1.6573827735305482e+00 1.1268760598278065e+00 5.4170459153242465e+00 1.7191477817288701e+00 8.2007155154215472e-01 3.8664585667220956e+00 1.6246965746254705e+00 -1.0800345305051018e+00 -3.9461993205111638e+00 -1.2852759059172270e+00 -4.6118575127290173e-01 -1.6615945596132431e+00 -2.4855565841547529e+00 5.9884665263378523e-01 1.4119315863693240e+00 2.1401439270442228e+00 3.8343764313171635e-01 1.5637799806372734e+00 1.4220816004162740e+00 -6.7747308241018944e-01 -1.5037394107053712e+00 -1.7332473519554505e+00 -4.7730327763810165e-01 -1.6021681289070278e+00 -3.6243314620087284e+00 7.5405008126735196e-01 1.7191477817288698e+00 3.9849300789442155e+00 5.2925475034343106e-01 1.6089611130494470e+00 2.4612902563933550e+00 -6.4962701605509121e-01 -1.5363183625592733e+00 -2.1653104646791341e+00 -8.1342371197842200e-01 -5.0579211867473828e-01 -3.2444945482363280e-01 9.1016075669334262e-01 6.7768338371750181e-01 3.5735994503481661e-01 1.5278401537440727e+00 5.9562462462701082e-01 3.1822574635899570e-01 -1.6438769094565584e+00 -6.9316993685800410e-01 -4.6584706911886842e-01 -1.5183804032012795e+00 -5.5862542817088390e-01 -2.6122990836436805e-01 1.6192913171993359e+00 8.2007155154215461e-01 5.2925475034343106e-01 2.9780594515558905e+00 6.2396465492158482e-01 3.9763284696491419e-01 -3.0596706545563817e+00 -9.5975673110462623e-01 -5.5094685639528818e-01 -5.2197189527619603e-01 -3.2269947468927866e+00 -1.6108006912404673e+00 9.2936122476493221e-01 3.3031626116490940e+00 1.2766969003577382e+00 6.1797227770098784e-01 4.3717497751005130e+00 1.5911493597086088e+00 -9.6171836974295088e-01 -3.9420113442322853e+00 -1.7120509885972042e+00 -5.4066747922386815e-01 -4.3132322123189235e+00 -1.3773113024971901e+00 7.8178170043734596e-01 3.8664585667220956e+00 1.6089611130494472e+00 6.2396465492158493e-01 5.8280817980463988e+00 1.9065013350087223e+00 -9.2872211358183510e-01 -5.8872144480741104e+00 -1.6831457257896543e+00 -3.3988857057276672e-01 -1.6352049806664137e+00 -1.7549389629795999e+00 5.7360512745795234e-01 1.5335199715739978e+00 1.4180051885472664e+00 3.2879614157516801e-01 1.5826629999873483e+00 2.2084297709519536e+00 -6.3149274625075547e-01 -1.6796553632106457e+00 -2.5389098107919859e+00 -3.1251129160739138e-01 -1.6727930664411370e+00 -2.1851607182366966e+00 5.1095359898448067e-01 1.6246965746254705e+00 2.4612902563933550e+00 3.9763284696491413e-01 1.9065013350087225e+00 4.0659938849510056e+00 -5.2709510655160108e-01 -1.6597274708773440e+00 -3.6747096088352960e+00 8.9085596634238673e-01 9.1669043978295339e-01 5.5682046964547627e-01 -1.1698761473927084e+00 -1.1077713251786050e+00 -4.7690713816515073e-01 -1.6593591184179870e+00 -1.0665779518373790e+00 -4.4593292208466540e-01 1.8658561968875436e+00 1.1170905503014921e+00 6.1274803892776575e-01 1.6135735865715481e+00 8.6541527216270497e-01 3.6258049011537563e-01 -1.8862737653187922e+00 -1.0800345305051018e+00 -6.4962701605509110e-01 -3.0596706545563817e+00 -9.2872211358183510e-01 -5.2709510655160097e-01 3.4048939358843899e+00 1.2839096588557708e+00 5.6741318416789066e-01 6.9293439612031005e-01 3.2741236431995850e+00 1.5142115411623089e+00 -1.1255236691453889e+00 -3.4115581415712755e+00 -1.1614277628136473e+00 -8.0506023834147722e-01 -4.5024765050889721e+00 -1.3020311857067592e+00 1.1232496408460890e+00 4.0305854828828052e+00 1.4660092411432091e+00 9.1262230888360285e-01 4.3616692644846564e+00 1.2634820849363479e+00 -1.1223753661142810e+00 -3.9461993205111634e+00 -1.5363183625592733e+00 -9.5975673110462623e-01 -5.8872144480741104e+00 -1.6597274708773437e+00 1.2839096588557706e+00 6.0810700246784730e+00 1.4158019147151566e+00 3.6748145337200405e-01 1.2863401688760463e+00 1.3938654195442337e+00 -4.8867978034991216e-01 -1.1713139802264536e+00 -1.2119949284585483e+00 -3.4198064778881287e-01 -1.3220886881228131e+00 -1.9599255169298946e+00 6.2319107703683407e-01 1.4798478073023218e+00 2.1686601970972847e+00 3.8841627675166202e-01 1.2798344091626241e+00 1.9333691289048511e+00 -5.6489470679437814e-01 -1.2852759059172270e+00 -2.1653104646791341e+00 -5.5094685639528818e-01 -1.6831457257896543e+00 -3.6747096088352960e+00 5.6741318416789077e-01 1.4158019147151568e+00 3.5160457733565025e+00 546 547 548 594 595 596 606 607 608 558 559 560 549 550 551 597 598 599 609 610 611 561 562 563 3.1679000515653728e+00 4.2228156591304168e-02 2.4376224339702306e-02 -3.0925842543863391e+00 -3.7623758381652778e-01 -2.3004409466873954e-01 -1.5366296582577954e+00 -4.3795647397518386e-03 -2.1444118653501337e-03 1.5168681127951336e+00 3.2946260908902891e-01 2.0719892501446729e-01 1.5312840612537360e+00 3.3617604464874100e-02 1.7601489048700823e-02 -1.5499527824204615e+00 -1.9178705306529914e-01 -1.2292038253262878e-01 -7.7018569943531157e-01 -7.8356700731159364e-03 -5.9677736578987433e-03 7.3330016888566585e-01 1.7493150154948753e-01 1.1190002432174681e-01 4.2228156591304182e-02 6.6567045917252434e+00 2.1767247288771321e+00 -3.6702680900426521e-01 -6.7898883189844819e+00 -1.9858425258933179e+00 -8.1639255459332732e-03 -4.9113479683872940e+00 -1.6560031623949860e+00 3.2060691814431164e-01 4.5672207075562552e+00 1.9295079972731271e+00 2.1519087713896295e-02 4.8166344892716655e+00 1.7624924651680243e+00 -4.4362220009893916e-01 -4.4974448835557110e+00 -1.9067070878607426e+00 3.9103350403300909e-03 -3.6118295035805690e+00 -1.8127172774653917e+00 4.3054843715929791e-01 3.7699508859548905e+00 1.4925448622961552e+00 2.4376224339702310e-02 2.1767247288771325e+00 4.5242594016425395e+00 -2.2362135938418484e-01 -1.9707790873321824e+00 -4.1104092731280666e+00 -4.9800980528973502e-03 -1.9278042553676247e+00 -2.4626880617356002e+00 1.9977615324948089e-01 1.9253993325915195e+00 2.7361899573631101e+00 1.1125225635492311e-02 1.7293783610360633e+00 2.4202955266567079e+00 -2.8173790153118816e-01 -1.8903127928436370e+00 -2.7603778500439011e+00 1.5227561739280856e-03 -1.7951160819727274e+00 -1.9159110809687212e+00 2.7353899956966826e-01 1.7525097950114548e+00 1.5686413802139332e+00 -3.0925842543863391e+00 -3.6702680900426532e-01 -2.2362135938418484e-01 3.2659780490172694e+00 7.4212134320819134e-01 3.2770848194508356e-01 1.5320529356133259e+00 3.6122848840153027e-01 1.5831617743772350e-01 -1.6753253603300309e+00 -6.6076728731534229e-01 -3.8216560676865025e-01 -1.5544922035860393e+00 -4.8945097341052990e-01 -2.0982257926600259e-01 1.6679924629396032e+00 6.2649264050410258e-01 3.3405823607463064e-01 7.5479492081121513e-01 4.2716902300366427e-01 2.7475339650238029e-01 -8.9841655007900578e-01 -6.3976642538735040e-01 -2.7922674654098051e-01 -3.7623758381652778e-01 -6.7898883189844819e+00 -1.9707790873321824e+00 7.4212134320819134e-01 7.0558677677317627e+00 1.7446000225658083e+00 3.6300083370246095e-01 5.1157294080128759e+00 1.5760976971573408e+00 -6.7528016654293743e-01 -4.7862531621603361e+00 -1.8891545675422772e+00 -2.0837282594082385e-01 -5.0768429254786716e+00 -1.5135369608922793e+00 6.2918711816943784e-01 4.7120373594247589e+00 1.7028031685235181e+00 1.6381894219129739e-01 3.7949018115304503e+00 1.7648498610346290e+00 -6.3823766097110068e-01 -4.0255519400763564e+00 -1.4148801335145589e+00 -2.3004409466873951e-01 -1.9858425258933177e+00 -4.1104092731280675e+00 3.2770848194508362e-01 1.7446000225658083e+00 3.8997905130171260e+00 1.5811247513160803e-01 1.5731965143472073e+00 2.2229818336000293e+00 -3.3455799232434491e-01 -1.6140302074105370e+00 -2.4562790774830296e+00 -8.7973983285176249e-02 -1.5217385885191588e+00 -2.1984312193669799e+00 3.3979042341241716e-01 1.7268622002263896e+00 2.4330509269732388e+00 1.0640196007449487e-01 1.4963807239802640e+00 1.5999018563217551e+00 -2.7943727028534415e-01 -1.4194281392966550e+00 -1.3906055599340712e+00 -1.5366296582577954e+00 -8.1639255459332837e-03 -4.9800980528973650e-03 1.5320529356133259e+00 3.6300083370246095e-01 1.5811247513160803e-01 3.0581791376469782e+00 5.1841672403076910e-02 2.4624900601336933e-02 -3.0262319687249799e+00 -3.9633821074245124e-01 -1.7995433398855590e-01 -7.7301133684394663e-01 -1.8030021196204973e-02 -6.7630807908049869e-03 7.5786824433335465e-01 1.9509011975162138e-01 8.4562692097795489e-02 1.5113741080924110e+00 3.1383098101342509e-02 1.7925083605684060e-02 -1.5236014618593470e+00 -2.1878356647391217e-01 -9.3527638604166255e-02 -4.3795647397518083e-03 -4.9113479683872940e+00 -1.9278042553676247e+00 3.6122848840153032e-01 5.1157294080128759e+00 1.5731965143472073e+00 5.1841672403076904e-02 7.1182893635141724e+00 1.7847611905587044e+00 -3.9470571004198640e-01 -6.7158070586167815e+00 -1.9868755404207810e+00 -6.5605836432382804e-03 -4.1442885855363354e+00 -1.4449947122741165e+00 4.6693072032782040e-01 3.7878370642617885e+00 1.7742847540275144e+00 1.9993491932646913e-02 4.8013909378099164e+00 1.7562115794619704e+00 -4.9434851464010054e-01 -5.0518031610583369e+00 -1.5287795303328751e+00 -2.1444118653501350e-03 -1.6560031623949860e+00 -2.4626880617356002e+00 1.5831617743772350e-01 1.5760976971573408e+00 2.2229818336000293e+00 2.4624900601336909e-02 1.7847611905587042e+00 3.8415558777379260e+00 -1.7911558941995964e-01 -1.9872366173035272e+00 -4.0487558594973319e+00 -1.8621766900486763e-03 -1.4554732990183159e+00 -1.3971083122010808e+00 2.0095639198002418e-01 1.4931289160351764e+00 1.5994031688878141e+00 1.1957247790717331e-02 1.7657777043260190e+00 2.4148683783660698e+00 -2.1273253983444451e-01 -1.5210524293604095e+00 -2.1702570251578255e+00 1.5168681127951336e+00 3.2060691814431169e-01 1.9977615324948089e-01 -1.6753253603300309e+00 -6.7528016654293743e-01 -3.3455799232434491e-01 -3.0262319687249799e+00 -3.9470571004198651e-01 -1.7911558941995970e-01 3.2383123893703489e+00 6.7552016896576106e-01 4.3068982791460997e-01 7.3173759016433915e-01 4.6180259922464423e-01 1.9622061978972177e-01 -8.9328816633688746e-01 -5.7312650080677974e-01 -3.6954731031868682e-01 -1.5155117443798503e+00 -4.4011586781402301e-01 -2.8095890800206152e-01 1.6234391474419274e+00 6.2529855887100938e-01 3.3749319911124059e-01 3.2946260908902880e-01 4.5672207075562552e+00 1.9253993325915191e+00 -6.6076728731534229e-01 -4.7862531621603361e+00 -1.6140302074105370e+00 -3.9633821074245112e-01 -6.7158070586167815e+00 -1.9872366173035272e+00 6.7552016896576095e-01 6.4685010411258466e+00 2.1362638237575640e+00 1.8338828245282396e-01 3.7639098285181158e+00 1.4844789627348249e+00 -5.8294058199568921e-01 -3.5033261016406119e+00 -1.7666499696820051e+00 -1.7940838327017619e-01 -4.4733167429820755e+00 -1.9046189817959898e+00 6.3108340281604758e-01 4.6790714881995870e+00 1.7263936571081513e+00 2.0719892501446727e-01 1.9295079972731271e+00 2.7361899573631101e+00 -3.8216560676865025e-01 -1.8891545675422772e+00 -2.4562790774830301e+00 -1.7995433398855587e-01 -1.9868755404207810e+00 -4.0487558594973319e+00 4.3068982791461002e-01 2.1362638237575644e+00 4.4578309786715700e+00 7.7924175430558823e-02 1.7719005969391184e+00 1.5690831898314754e+00 -3.7400747815682844e-01 -1.7578261739564849e+00 -1.9081274817513936e+00 -1.1610853631073316e-01 -1.9121829791052594e+00 -2.7380674460680101e+00 3.3642302686513309e-01 1.7083668430549916e+00 2.3881257389336117e+00 1.5312840612537360e+00 2.1519087713896289e-02 1.1125225635492316e-02 -1.5544922035860393e+00 -2.0837282594082385e-01 -8.7973983285176249e-02 -7.7301133684394685e-01 -6.5605836432382682e-03 -1.8621766900486720e-03 7.3173759016433904e-01 1.8338828245282399e-01 7.7924175430558809e-02 3.1421964713167321e+00 3.6871352115771618e-02 1.7830445392064208e-02 -3.0543020577576727e+00 -3.9690185010316609e-01 -1.7762316517785479e-01 -1.5220769330907105e+00 7.8073227204398660e-03 2.7307713200200798e-03 1.4986644085435619e+00 3.6224921468429638e-01 1.5784870737494433e-01 3.3617604464874093e-02 4.8166344892716646e+00 1.7293783610360631e+00 -4.8945097341052990e-01 -5.0768429254786724e+00 -1.5217385885191590e+00 -1.8030021196204983e-02 -4.1442885855363354e+00 -1.4554732990183159e+00 4.6180259922464423e-01 3.7639098285181158e+00 1.7719005969391184e+00 3.6871352115771638e-02 7.0582406142555190e+00 1.7111819656844383e+00 -3.5569960315224697e-01 -6.5973421692302576e+00 -1.8813753173842542e+00 1.0506475420102523e-02 -4.7490633842002197e+00 -1.8560763749660383e+00 3.2038256653359171e-01 4.9287521324001800e+00 1.5022026562281479e+00 1.7601489048700830e-02 1.7624924651680243e+00 2.4202955266567079e+00 -2.0982257926600259e-01 -1.5135369608922793e+00 -2.1984312193669804e+00 -6.7630807908049886e-03 -1.4449947122741165e+00 -1.3971083122010808e+00 1.9622061978972177e-01 1.4844789627348249e+00 1.5690831898314752e+00 1.7830445392064173e-02 1.7111819656844389e+00 3.8887115809751598e+00 -1.6017448745709462e-01 -1.9253382794596021e+00 -4.0329792204809785e+00 6.3181942733617352e-03 -1.5751644303149486e+00 -2.4084069120484273e+00 1.3878939901005483e-01 1.5008809893536572e+00 2.1588353666341242e+00 -1.5499527824204615e+00 -4.4362220009893916e-01 -2.8173790153118816e-01 1.6679924629396032e+00 6.2918711816943784e-01 3.3979042341241716e-01 7.5786824433335465e-01 4.6693072032782040e-01 2.0095639198002418e-01 -8.9328816633688746e-01 -5.8294058199568943e-01 -3.7400747815682844e-01 -3.0543020577576723e+00 -3.5569960315224691e-01 -1.6017448745709462e-01 3.2208615060274042e+00 6.5092969877298079e-01 4.1572708067333453e-01 1.5067108483854166e+00 2.9166208442723945e-01 1.8457719875885351e-01 -1.6558900551707576e+00 -6.5644723645060232e-01 -3.2513122767951830e-01 -1.9178705306529911e-01 -4.4974448835557110e+00 -1.8903127928436370e+00 6.2649264050410247e-01 4.7120373594247589e+00 1.7268622002263896e+00 1.9509011975162138e-01 3.7878370642617885e+00 1.4931289160351764e+00 -5.7312650080677974e-01 -3.5033261016406123e+00 -1.7578261739564851e+00 -3.9690185010316603e-01 -6.5973421692302576e+00 -1.9253382794596017e+00 6.5092969877298079e-01 6.3005939068868155e+00 2.0421476838914758e+00 3.2255879617510957e-01 4.4236192355860222e+00 1.8506975322221684e+00 -6.3325585122857142e-01 -4.6259744117328037e+00 -1.5393590861154864e+00 -1.2292038253262881e-01 -1.9067070878607426e+00 -2.7603778500439016e+00 3.3405823607463064e-01 1.7028031685235183e+00 2.4330509269732383e+00 8.4562692097795503e-02 1.7742847540275144e+00 1.5994031688878139e+00 -3.6954731031868687e-01 -1.7666499696820051e+00 -1.9081274817513934e+00 -1.7762316517785479e-01 -1.8813753173842542e+00 -4.0329792204809785e+00 4.1572708067333464e-01 2.0421476838914758e+00 4.3861927416644599e+00 2.0224839648612730e-01 1.8444519341372341e+00 2.6827696915631556e+00 -3.6650554730271895e-01 -1.8089551656527390e+00 -2.3999319768123941e+00 -7.7018569943531157e-01 3.9103350403300943e-03 1.5227561739280908e-03 7.5479492081121513e-01 1.6381894219129742e-01 1.0640196007449487e-01 1.5113741080924110e+00 1.9993491932646906e-02 1.1957247790717334e-02 -1.5155117443798503e+00 -1.7940838327017622e-01 -1.1610853631073317e-01 -1.5220769330907107e+00 1.0506475420102510e-02 6.3181942733617213e-03 1.5067108483854170e+00 3.2255879617510957e-01 2.0224839648612730e-01 3.0259429471335633e+00 2.4017964397718281e-02 1.3538542451999017e-02 -2.9910484475167340e+00 -3.6539762188702851e-01 -2.2587856093989517e-01 -7.8356700731159259e-03 -3.6118295035805690e+00 -1.7951160819727274e+00 4.2716902300366427e-01 3.7949018115304503e+00 1.4963807239802640e+00 3.1383098101342516e-02 4.8013909378099164e+00 1.7657777043260192e+00 -4.4011586781402301e-01 -4.4733167429820755e+00 -1.9121829791052591e+00 7.8073227204398521e-03 -4.7490633842002197e+00 -1.5751644303149488e+00 2.9166208442723945e-01 4.4236192355860222e+00 1.8444519341372341e+00 2.4017964397718285e-02 6.3545062403676855e+00 2.0930141932773942e+00 -3.3408795476326775e-01 -6.5402085945312063e+00 -1.9171610643279764e+00 -5.9677736578987433e-03 -1.8127172774653915e+00 -1.9159110809687212e+00 2.7475339650238029e-01 1.7648498610346293e+00 1.5999018563217551e+00 1.7925083605684053e-02 1.7562115794619704e+00 2.4148683783660698e+00 -2.8095890800206152e-01 -1.9046189817959898e+00 -2.7380674460680106e+00 2.7307713200200867e-03 -1.8560763749660383e+00 -2.4084069120484273e+00 1.8457719875885351e-01 1.8506975322221684e+00 2.6827696915631556e+00 1.3538542451999000e-02 2.0930141932773938e+00 4.3406980523027592e+00 -2.0659831097897810e-01 -1.8913605317687403e+00 -3.9758525394685815e+00 7.3330016888566585e-01 4.3054843715929786e-01 2.7353899956966826e-01 -8.9841655007900578e-01 -6.3823766097110068e-01 -2.7943727028534415e-01 -1.5236014618593470e+00 -4.9434851464010054e-01 -2.1273253983444454e-01 1.6234391474419274e+00 6.3108340281604758e-01 3.3642302686513315e-01 1.4986644085435619e+00 3.2038256653359171e-01 1.3878939901005480e-01 -1.6558900551707576e+00 -6.3325585122857131e-01 -3.6650554730271895e-01 -2.9910484475167340e+00 -3.3408795476326764e-01 -2.0659831097897807e-01 3.2135527897546901e+00 7.1791557509410264e-01 3.1652224295662962e-01 1.7493150154948753e-01 3.7699508859548905e+00 1.7525097950114545e+00 -6.3976642538735040e-01 -4.0255519400763564e+00 -1.4194281392966552e+00 -2.1878356647391217e-01 -5.0518031610583360e+00 -1.5210524293604093e+00 6.2529855887100916e-01 4.6790714881995870e+00 1.7083668430549916e+00 3.6224921468429633e-01 4.9287521324001800e+00 1.5008809893536572e+00 -6.5644723645060221e-01 -4.6259744117328037e+00 -1.8089551656527390e+00 -3.6539762188702851e-01 -6.5402085945312081e+00 -1.8913605317687405e+00 7.1791557509410253e-01 6.8657636008440468e+00 1.6790386386584408e+00 1.1190002432174681e-01 1.4925448622961552e+00 1.5686413802139334e+00 -2.7922674654098051e-01 -1.4148801335145587e+00 -1.3906055599340712e+00 -9.3527638604166269e-02 -1.5287795303328751e+00 -2.1702570251578255e+00 3.3749319911124059e-01 1.7263936571081513e+00 2.3881257389336117e+00 1.5784870737494433e-01 1.5022026562281476e+00 2.1588353666341247e+00 -3.2513122767951835e-01 -1.5393590861154864e+00 -2.3999319768123941e+00 -2.2587856093989517e-01 -1.9171610643279764e+00 -3.9758525394685815e+00 3.1652224295662956e-01 1.6790386386584413e+00 3.8210446155912021e+00 594 595 596 642 643 644 654 655 656 606 607 608 597 598 599 645 646 647 657 658 659 609 610 611 2.9150238730742171e+00 1.4389510013744939e-02 7.0678408493187305e-03 -2.8268670728233154e+00 -3.4832440127295666e-01 -2.1768441489248044e-01 -1.4384717644934835e+00 1.9245701163748345e-02 9.3300412674867869e-03 1.4119439224570767e+00 3.0835130397645755e-01 1.9627294281002070e-01 1.4167244569883120e+00 8.9882584368087028e-03 4.5062413410363157e-03 -1.4327917195289626e+00 -1.6960561646331743e-01 -1.1052164502319052e-01 -7.2964797789096114e-01 1.3133585891279602e-02 7.4284764070781661e-03 6.8408628221711776e-01 1.5382165825423502e-01 1.0360051724073031e-01 1.4389510013744925e-02 6.1753940757839239e+00 2.0602724415889542e+00 -3.4683178222768146e-01 -6.3005753538052787e+00 -1.8591714175384941e+00 1.8703419451567199e-02 -4.6257374168163681e+00 -1.5555476400575925e+00 3.0327928017429040e-01 4.2783604821533512e+00 1.8306692241153315e+00 -1.4567459410265793e-03 4.5160971888879295e+00 1.6601165819470058e+00 -4.2676258478720658e-01 -4.1950473196396150e+00 -1.8124637748005907e+00 2.5184511848552464e-02 -3.4025727424199594e+00 -1.7255256480532051e+00 4.1349439146775807e-01 3.5540810858560175e+00 1.4016502327985911e+00 7.0678408493187322e-03 2.0602724415889533e+00 4.2158286586677738e+00 -2.1645852195329313e-01 -1.8549181559765029e+00 -3.7827462733884203e+00 1.0116392646075603e-02 -1.8332297951369430e+00 -2.3112641717399969e+00 1.9132768919116705e-01 1.8300238002233058e+00 2.5897583881109494e+00 -6.4343761661043064e-04 1.6358344354698713e+00 2.2505451352365853e+00 -2.7430154711876920e-01 -1.7931627893697741e+00 -2.6032073673444551e+00 1.5079489815283769e-02 -1.7104912316184815e+00 -1.8343399496959172e+00 2.6781209418682672e-01 1.6656712948195704e+00 1.4754255801534801e+00 -2.8268670728233154e+00 -3.4683178222768141e-01 -2.1645852195329315e-01 3.0111837437267308e+00 7.2516446134075163e-01 3.1470940650340062e-01 1.4262645041277378e+00 3.4508402839744157e-01 1.4920753949003110e-01 -1.5786562539736908e+00 -6.4484932729133915e-01 -3.7497212535556346e-01 -1.4341577588233065e+00 -4.7514441234913435e-01 -1.9990359385305995e-01 1.5538150418424315e+00 6.1205513972868686e-01 3.2740685985858586e-01 7.0594774036121533e-01 4.1228551579626477e-01 2.6983525036420170e-01 -8.5752994443780306e-01 -6.2776362339498992e-01 -2.6982481505430261e-01 -3.4832440127295672e-01 -6.3005753538052787e+00 -1.8549181559765029e+00 7.2516446134075174e-01 6.5705215489492543e+00 1.6153806825441892e+00 3.4234725902981361e-01 4.8285932255859727e+00 1.4720089750326566e+00 -6.6405039555425360e-01 -4.4977695946804737e+00 -1.7899795606732114e+00 -1.8719404466820977e-01 -4.7760566808675646e+00 -1.4058744003633201e+00 6.1375416312537423e-01 4.4054984354211078e+00 1.6074872170496322e+00 1.4490958982409535e-01 3.5819989804404151e+00 1.6757543527913432e+00 -6.2660663182461329e-01 -3.8122105610434329e+00 -1.3198591104047868e+00 -2.1768441489248044e-01 -1.8591714175384941e+00 -3.7827462733884194e+00 3.1470940650340062e-01 1.6153806825441892e+00 3.5736611422575595e+00 1.4660844716723634e-01 1.4658009767917544e+00 2.0657668425695417e+00 -3.2679641861986081e-01 -1.5097391630554515e+00 -2.2998275156697234e+00 -7.7120918215966533e-02 -1.4161569483438170e+00 -2.0249358119449266e+00 3.3097329797782760e-01 1.6221052091894521e+00 2.2607500666353495e+00 9.8981252221392702e-02 1.4033606880615608e+00 1.5034506416817042e+00 -2.6967065214154889e-01 -1.3215800276491938e+00 -1.2961190921410854e+00 -1.4384717644934835e+00 1.8703419451567213e-02 1.0116392646075603e-02 1.4262645041277378e+00 3.4234725902981361e-01 1.4660844716723639e-01 2.9228339346717918e+00 2.4018768214965354e-02 1.2453910728590648e-02 -2.8819385299471771e+00 -3.7738678008530724e-01 -1.6663397706345909e-01 -7.3056474336161425e-01 7.1058096531079994e-03 4.0528115331122843e-03 7.0873211308504069e-01 1.7650220223255134e-01 7.1771780695593534e-02 1.4547945405226714e+00 7.7396322114577270e-03 5.2907535293004572e-03 -1.4616500546049660e+00 -1.9903031070815599e-01 -8.3660119236449754e-02 1.9245701163748331e-02 -4.6257374168163681e+00 -1.8332297951369427e+00 3.4508402839744157e-01 4.8285932255859736e+00 1.4658009767917544e+00 2.4018768214965312e-02 6.7879072029233551e+00 1.6746265707082222e+00 -3.7593286456593822e-01 -6.3771320299230014e+00 -1.8778784616250148e+00 1.4591305502008711e-02 -3.9365339236090331e+00 -1.3477164902955230e+00 4.5264269448473615e-01 3.5713655638117903e+00 1.6884235821316793e+00 -1.8678910129955803e-03 4.5730990689021729e+00 1.6604881216300718e+00 -4.7778174218396474e-01 -4.8215616908748906e+00 -1.4305145042042471e+00 9.3300412674867765e-03 -1.5555476400575927e+00 -2.3112641717399969e+00 1.4920753949003110e-01 1.4720089750326566e+00 2.0657668425695417e+00 1.2453910728590608e-02 1.6746265707082220e+00 3.6476080081657085e+00 -1.6667897224326766e-01 -1.8859693220526790e+00 -3.8509840764263212e+00 7.2470097215131379e-03 -1.3626164214626160e+00 -1.3036601674616202e+00 1.9022990473394241e-01 1.4022822535383632e+00 1.5062315230855035e+00 3.9787346136909568e-04 1.6795502792186447e+00 2.3070197908885239e+00 -2.0218730715966474e-01 -1.4243346949249993e+00 -2.0607177490813391e+00 1.4119439224570765e+00 3.0327928017429034e-01 1.9132768919116702e-01 -1.5786562539736908e+00 -6.6405039555425360e-01 -3.2679641861986081e-01 -2.8819385299471771e+00 -3.7593286456593822e-01 -1.6667897224326772e-01 3.1085802744568602e+00 6.6005707606226760e-01 4.2597707207862523e-01 6.8283235903102857e-01 4.4887347315838000e-01 1.8552649890764944e-01 -8.5420772722542582e-01 -5.6057064378849752e-01 -3.6698360313755396e-01 -1.4577707773939013e+00 -4.2425517287238357e-01 -2.7419839191176726e-01 1.5692167325952289e+00 6.1259924738613536e-01 3.3182612573500803e-01 3.0835130397645749e-01 4.2783604821533512e+00 1.8300238002233058e+00 -6.4484932729133904e-01 -4.4977695946804737e+00 -1.5097391630554515e+00 -3.7738678008530735e-01 -6.3771320299230014e+00 -1.8859693220526785e+00 6.6005707606226749e-01 6.1353225708463004e+00 2.0319088362863340e+00 1.6625514295208754e-01 3.5503076401822362e+00 1.3916669929853129e+00 -5.6768732637063235e-01 -3.2896310853199546e+00 -1.6809298548107006e+00 -1.6236878559806517e-01 -4.2458991593721480e+00 -1.8157697416909038e+00 6.1762869635452999e-01 4.4464411761136891e+00 1.6388084521147821e+00 1.9627294281002070e-01 1.8306692241153315e+00 2.5897583881109498e+00 -3.7497212535556346e-01 -1.7899795606732114e+00 -2.2998275156697234e+00 -1.6663397706345912e-01 -1.8778784616250146e+00 -3.8509840764263217e+00 4.2597707207862523e-01 2.0319088362863331e+00 4.2744489203420635e+00 6.5836141283330929e-02 1.6837534651832278e+00 1.4728344395327935e+00 -3.6860637941842567e-01 -1.6670493309077405e+00 -1.8252241442697763e+00 -1.0610611693735275e-01 -1.8220275172648446e+00 -2.6411276293070989e+00 3.2823244260282314e-01 1.6106033448859176e+00 2.2801216176871120e+00 1.4167244569883120e+00 -1.4567459410265802e-03 -6.4343761661043780e-04 -1.4341577588233065e+00 -1.8719404466820974e-01 -7.7120918215966505e-02 -7.3056474336161437e-01 1.4591305502008701e-02 7.2470097215131361e-03 6.8283235903102857e-01 1.6625514295208751e-01 6.5836141283330929e-02 2.9451777350158990e+00 1.0597680419631108e-02 6.3851772098990397e-03 -2.8479324280576779e+00 -3.7819034701289084e-01 -1.6497891250856325e-01 -1.4518079822658643e+00 2.7711952011187285e-02 1.4269942211490597e-02 1.4197283614732241e+00 3.4768505673721262e-01 1.4900499791490640e-01 8.9882584368087114e-03 4.5160971888879287e+00 1.6358344354698713e+00 -4.7514441234913435e-01 -4.7760566808675637e+00 -1.4161569483438170e+00 7.1058096531079959e-03 -3.9365339236090335e+00 -1.3626164214626160e+00 4.4887347315838000e-01 3.5503076401822353e+00 1.6837534651832278e+00 1.0597680419631101e-02 6.6612465720265552e+00 1.5955117971456483e+00 -3.3572270303228408e-01 -6.1890353061613634e+00 -1.7765328462936862e+00 3.5163861034532909e-02 -4.5090308699301227e+00 -1.7662068578349797e+00 3.0013803267895633e-01 4.6830053794713651e+00 1.4064133761363509e+00 4.5062413410363166e-03 1.6601165819470058e+00 2.2505451352365857e+00 -1.9990359385305995e-01 -1.4058744003633201e+00 -2.0249358119449266e+00 4.0528115331122877e-03 -1.3477164902955230e+00 -1.3036601674616202e+00 1.8552649890764944e-01 1.3916669929853129e+00 1.4728344395327935e+00 6.3851772098990432e-03 1.5955117971456485e+00 3.6295508049067045e+00 -1.4615158792029492e-01 -1.8133264728545206e+00 -3.7708585658320692e+00 1.8289238535302892e-02 -1.4817360039877996e+00 -2.2859409608034253e+00 1.2729521424635437e-01 1.4013579954231961e+00 2.0324651263659579e+00 -1.4327917195289626e+00 -4.2676258478720658e-01 -2.7430154711876920e-01 1.5538150418424312e+00 6.1375416312537412e-01 3.3097329797782760e-01 7.0873211308504069e-01 4.5264269448473615e-01 1.9022990473394238e-01 -8.5420772722542593e-01 -5.6768732637063235e-01 -3.6860637941842567e-01 -2.8479324280576774e+00 -3.3572270303228408e-01 -1.4615158792029492e-01 3.0281619087778657e+00 6.3268683750622445e-01 4.0997853330741540e-01 1.4308117389062294e+00 2.7273306539634146e-01 1.7420573583907722e-01 -1.5865889277995007e+00 -6.4164414632255318e-01 -3.1632795740077280e-01 -1.6960561646331745e-01 -4.1950473196396141e+00 -1.7931627893697741e+00 6.1205513972868686e-01 4.4054984354211078e+00 1.6221052091894521e+00 1.7650220223255134e-01 3.5713655638117903e+00 1.4022822535383630e+00 -5.6057064378849752e-01 -3.2896310853199546e+00 -1.6670493309077403e+00 -3.7819034701289095e-01 -6.1890353061613625e+00 -1.8133264728545209e+00 6.3268683750622445e-01 5.8962189544424737e+00 1.9355739642556054e+00 3.0816927693193602e-01 4.1779987106171754e+00 1.7598086175040510e+00 -6.2104684913469144e-01 -4.3773679531716159e+00 -1.4462314513554357e+00 -1.1052164502319049e-01 -1.8124637748005907e+00 -2.6032073673444556e+00 3.2740685985858586e-01 1.6074872170496322e+00 2.2607500666353495e+00 7.1771780695593534e-02 1.6884235821316793e+00 1.5062315230855035e+00 -3.6698360313755396e-01 -1.6809298548107006e+00 -1.8252241442697767e+00 -1.6497891250856325e-01 -1.7765328462936862e+00 -3.7708585658320688e+00 4.0997853330741535e-01 1.9355739642556056e+00 4.1419156908906931e+00 1.9520837129193205e-01 1.7574875961941823e+00 2.5692695462010620e+00 -3.6188138448421825e-01 -1.7190458837261222e+00 -2.2788767493663067e+00 -7.2964797789096114e-01 2.5184511848552457e-02 1.5079489815283779e-02 7.0594774036121533e-01 1.4490958982409533e-01 9.8981252221392702e-02 1.4547945405226714e+00 -1.8678910129955855e-03 3.9787346136910436e-04 -1.4577707773939013e+00 -1.6236878559806517e-01 -1.0610611693735274e-01 -1.4518079822658643e+00 3.5163861034532909e-02 1.8289238535302885e-02 1.4308117389062294e+00 3.0816927693193602e-01 1.9520837129193205e-01 2.9467223531083366e+00 1.9737349752298183e-03 -5.6235706568296892e-04 -2.8990496353477262e+00 -3.5116429800328575e-01 -2.2128775132224487e-01 1.3133585891279616e-02 -3.4025727424199603e+00 -1.7104912316184815e+00 4.1228551579626471e-01 3.5819989804404155e+00 1.4033606880615610e+00 7.7396322114577270e-03 4.5730990689021729e+00 1.6795502792186450e+00 -4.2425517287238351e-01 -4.2458991593721489e+00 -1.8220275172648446e+00 2.7711952011187257e-02 -4.5090308699301227e+00 -1.4817360039877994e+00 2.7273306539634146e-01 4.1779987106171763e+00 1.7574875961941823e+00 1.9737349752298183e-03 6.0993779934096404e+00 2.0027167221778086e+00 -3.1132231340937577e-01 -6.2749719816471723e+00 -1.8288605327810712e+00 7.4284764070781661e-03 -1.7255256480532051e+00 -1.8343399496959172e+00 2.6983525036420170e-01 1.6757543527913432e+00 1.5034506416817042e+00 5.2907535293004512e-03 1.6604881216300718e+00 2.3070197908885244e+00 -2.7419839191176731e-01 -1.8157697416909038e+00 -2.6411276293070989e+00 1.4269942211490617e-02 -1.7662068578349797e+00 -2.2859409608034253e+00 1.7420573583907728e-01 1.7598086175040510e+00 2.5692695462010620e+00 -5.6235706568293423e-04 2.0027167221778086e+00 4.2175878629855443e+00 -1.9626940937369702e-01 -1.7912655665241854e+00 -3.8359193019503937e+00 6.8408628221711776e-01 4.1349439146775813e-01 2.6781209418682672e-01 -8.5752994443780306e-01 -6.2660663182461318e-01 -2.6967065214154889e-01 -1.4616500546049660e+00 -4.7778174218396474e-01 -2.0218730715966476e-01 1.5692167325952289e+00 6.1762869635452999e-01 3.2823244260282319e-01 1.4197283614732241e+00 3.0013803267895633e-01 1.2729521424635434e-01 -1.5865889277995007e+00 -6.2104684913469133e-01 -3.6188138448421825e-01 -2.8990496353477266e+00 -3.1132231340937577e-01 -1.9626940937369700e-01 3.1317871859044262e+00 7.0549641605140045e-01 3.0666900212312459e-01 1.5382165825423502e-01 3.5540810858560179e+00 1.6656712948195702e+00 -6.2776362339498981e-01 -3.8122105610434329e+00 -1.3215800276491938e+00 -1.9903031070815602e-01 -4.8215616908748897e+00 -1.4243346949249993e+00 6.1259924738613525e-01 4.4464411761136891e+00 1.6106033448859178e+00 3.4768505673721262e-01 4.6830053794713651e+00 1.4013579954231958e+00 -6.4164414632255318e-01 -4.3773679531716150e+00 -1.7190458837261222e+00 -3.5116429800328575e-01 -6.2749719816471723e+00 -1.7912655665241854e+00 7.0549641605140057e-01 6.6025845452960379e+00 1.5785935376958162e+00 1.0360051724073031e-01 1.4016502327985911e+00 1.4754255801534804e+00 -2.6982481505430261e-01 -1.3198591104047868e+00 -1.2961190921410854e+00 -8.3660119236449754e-02 -1.4305145042042473e+00 -2.0607177490813386e+00 3.3182612573500808e-01 1.6388084521147821e+00 2.2801216176871124e+00 1.4900499791490643e-01 1.4064133761363509e+00 2.0324651263659579e+00 -3.1632795740077280e-01 -1.4462314513554355e+00 -2.2788767493663062e+00 -2.2128775132224487e-01 -1.8288605327810714e+00 -3.8359193019503941e+00 3.0666900212312459e-01 1.5785935376958160e+00 3.6836205683325742e+00 441 442 443 456 457 458 573 574 575 525 526 527 444 445 446 459 460 461 489 490 491 471 472 473 2.8097176837747493e+00 9.7104268988886255e-01 9.0415669815355715e-01 -2.9816196164643993e+00 -1.1356705848082633e+00 -9.4491654593884633e-01 -1.6822710444666107e+00 -1.0019937876885401e+00 -7.0944607499263768e-01 1.8813055963191054e+00 9.4618599054517660e-01 9.9250489906044559e-01 1.5760761663609775e+00 9.2102393541523309e-01 6.7713999302602690e-01 -1.7902142330912976e+00 -7.8320374199667575e-01 -8.4858612554786672e-01 -1.0649637497650262e+00 -7.9662044304644042e-01 -7.7436852622459829e-01 1.2519691973325004e+00 8.7923594169064789e-01 7.0351568246391960e-01 9.7104268988886244e-01 3.4572575454055370e+00 1.2565878351040047e+00 -1.1302032612545734e+00 -3.3978591407220065e+00 -1.1009611002069430e+00 -9.5158740861684532e-01 -2.5354307453358595e+00 -1.0635359172672629e+00 9.6278744266083005e-01 2.0267335632645724e+00 1.0778511754119215e+00 8.7924813472563557e-01 2.4137409571542214e+00 1.0695864444224512e+00 -9.4173003942035838e-01 -1.9381797047556983e+00 -1.0199022286395638e+00 -7.7180939684969685e-01 -1.6524583322217630e+00 -1.0988621505152547e+00 9.8225183886614509e-01 1.6261958572109982e+00 8.7923594169064734e-01 9.0415669815355704e-01 1.2565878351040047e+00 3.2822609647088234e+00 -9.2880859871842503e-01 -1.0862078958861683e+00 -2.9158370216989318e+00 -7.7811208876531524e-01 -1.2394424219539837e+00 -1.9031340736555720e+00 9.7591620428684001e-01 1.0447716667464018e+00 2.1490804818149800e+00 6.2963000790947588e-01 1.0452239593312043e+00 1.7426648462953263e+00 -9.4600641229904148e-01 -9.3841975865617722e-01 -2.0509696504449333e+00 -7.2695223794031305e-01 -1.0647652235514262e+00 -1.5560347443521918e+00 8.7017642737322098e-01 9.8225183886614531e-01 1.2519691973325002e+00 -2.9816196164643993e+00 -1.1302032612545734e+00 -9.2880859871842503e-01 3.3336405716165225e+00 1.2927435040729272e+00 8.8992367767440417e-01 1.9210696266945537e+00 1.1604954058085379e+00 7.7191632445325176e-01 -2.2224443921234229e+00 -1.0261614964033041e+00 -1.0691241499045734e+00 -1.8045133207239830e+00 -1.2202043762329973e+00 -6.9711095871557716e-01 2.0471846577207460e+00 1.0115112647213813e+00 8.8280391150122606e-01 1.2627172176321764e+00 1.0106811098032826e+00 9.2476831993429109e-01 -1.5560347443521914e+00 -1.0988621505152547e+00 -7.7436852622459795e-01 -1.1356705848082633e+00 -3.3978591407220065e+00 -1.0862078958861683e+00 1.2927435040729269e+00 3.4417240401515077e+00 9.2732270250952564e-01 1.1718156702852560e+00 2.5116737394607016e+00 9.8582262677967281e-01 -1.1333140841988354e+00 -2.0308982519645706e+00 -1.0491226099020285e+00 -9.4915458890429794e-01 -2.4784170838148269e+00 -8.3068177755306727e-01 9.6389027787443915e-01 1.9530854339552872e+00 8.3880628729522244e-01 8.5445502923020156e-01 1.6531495951556712e+00 1.0106811098032833e+00 -1.0647652235514264e+00 -1.6524583322217636e+00 -7.9662044304644053e-01 -9.4491654593884633e-01 -1.1009611002069430e+00 -2.9158370216989318e+00 8.8992367767440417e-01 9.2732270250952586e-01 2.7322222200266908e+00 7.3536220395698115e-01 9.3255605551861598e-01 1.6717240406211644e+00 -9.1811449535854150e-01 -8.1087968457659731e-01 -1.8716465069444113e+00 -5.8572893631416600e-01 -9.1850883935044614e-01 -1.5627868617073344e+00 8.8768970971404337e-01 8.8782523372534006e-01 1.7485706618356709e+00 6.6273662420643831e-01 8.5445502923020111e-01 1.2627172176321766e+00 -7.2695223794031283e-01 -7.7180939684969674e-01 -1.0649637497650257e+00 -1.6822710444666109e+00 -9.5158740861684532e-01 -7.7811208876531524e-01 1.9210696266945537e+00 1.1718156702852558e+00 7.3536220395698126e-01 2.9306519195193697e+00 1.2351772572068784e+00 7.8048899644317393e-01 -3.1039464599821796e+00 -1.2105640496281946e+00 -1.0110938826199640e+00 -1.0903515057679363e+00 -1.0060588779438502e+00 -5.5203845230680371e-01 1.2562574970372127e+00 8.3893069918434637e-01 7.6292297383131324e-01 1.6717240406211611e+00 9.8582262677967170e-01 7.7191632445325142e-01 -1.9031340736555686e+00 -1.0635359172672625e+00 -7.0944607499263701e-01 -1.0019937876885403e+00 -2.5354307453358600e+00 -1.2394424219539837e+00 1.1604954058085379e+00 2.5116737394607012e+00 9.3255605551861587e-01 1.2351772572068784e+00 4.1227121019049635e+00 1.2351772572068782e+00 -1.2476663464832045e+00 -3.4492470216263884e+00 -1.2476663464832052e+00 -9.0813741990782859e-01 -2.1858285901210848e+00 -9.0813741990782915e-01 1.0690112574995256e+00 1.5598775215928269e+00 1.0690112574995250e+00 9.3255605551861565e-01 2.5116737394606972e+00 1.1604954058085379e+00 -1.2394424219539832e+00 -2.5354307453358560e+00 -1.0019937876885396e+00 -7.0944607499263768e-01 -1.0635359172672629e+00 -1.9031340736555720e+00 7.7191632445325176e-01 9.8582262677967281e-01 1.6717240406211646e+00 7.8048899644317415e-01 1.2351772572068784e+00 2.9306519195193688e+00 -1.0110938826199642e+00 -1.2105640496281946e+00 -3.1039464599821800e+00 -5.5203845230680337e-01 -1.0060588779438504e+00 -1.0903515057679365e+00 7.6292297383131402e-01 8.3893069918434648e-01 1.2562574970372122e+00 7.3536220395698093e-01 1.1718156702852549e+00 1.9210696266945502e+00 -7.7811208876531490e-01 -9.5158740861684465e-01 -1.6822710444666071e+00 1.8813055963191054e+00 9.6278744266083005e-01 9.7591620428684023e-01 -2.2224443921234229e+00 -1.1333140841988354e+00 -9.1811449535854150e-01 -3.1039464599821800e+00 -1.2476663464832050e+00 -1.0110938826199642e+00 3.5054446869082772e+00 1.1042329446980574e+00 1.3113908607367988e+00 1.2077993557732107e+00 1.1440063579729431e+00 7.3301618267136037e-01 -1.5455927617655585e+00 -8.5877488015968306e-01 -1.0144956188723653e+00 -1.8716465069444084e+00 -1.0491226099020277e+00 -1.0691241499045732e+00 2.1490804818149765e+00 1.0778511754119211e+00 9.9250489906044481e-01 9.4618599054517660e-01 2.0267335632645724e+00 1.0447716667464015e+00 -1.0261614964033041e+00 -2.0308982519645706e+00 -8.1087968457659720e-01 -1.2105640496281949e+00 -3.4492470216263884e+00 -1.2105640496281946e+00 1.1042329446980574e+00 3.1308529330248485e+00 1.1042329446980574e+00 7.9171109294283482e-01 1.5637818686078846e+00 7.9171109294283493e-01 -8.3929646432437444e-01 -1.2370584026063485e+00 -8.3929646432437377e-01 -8.1087968457659676e-01 -2.0308982519645666e+00 -1.0261614964033035e+00 1.0447716667464009e+00 2.0267335632645689e+00 9.4618599054517571e-01 9.9250489906044559e-01 1.0778511754119215e+00 2.1490804818149800e+00 -1.0691241499045734e+00 -1.0491226099020285e+00 -1.8716465069444113e+00 -1.0110938826199640e+00 -1.2476663464832052e+00 -3.1039464599821800e+00 1.3113908607367988e+00 1.1042329446980574e+00 3.5054446869082772e+00 7.3301618267136015e-01 1.1440063579729431e+00 1.2077993557732114e+00 -1.0144956188723659e+00 -8.5877488015968306e-01 -1.5455927617655578e+00 -9.1811449535854117e-01 -1.1333140841988347e+00 -2.2224443921234194e+00 9.7591620428683978e-01 9.6278744266083016e-01 1.8813055963191021e+00 1.5760761663609777e+00 8.7924813472563568e-01 6.2963000790947588e-01 -1.8045133207239830e+00 -9.4915458890429816e-01 -5.8572893631416589e-01 -1.0903515057679365e+00 -9.0813741990782859e-01 -5.5203845230680348e-01 1.2077993557732107e+00 7.9171109294283482e-01 7.3301618267135993e-01 2.7306585035958824e+00 1.0503083991787838e+00 5.9372385774946690e-01 -2.7995471838261432e+00 -1.1028802849045112e+00 -7.9863169401978229e-01 -1.5627868617073311e+00 -8.3068177755306627e-01 -6.9711095871557660e-01 1.7426648462953227e+00 1.0695864444224503e+00 6.7713999302602579e-01 9.2102393541523309e-01 2.4137409571542214e+00 1.0452239593312043e+00 -1.2202043762329970e+00 -2.4784170838148269e+00 -9.1850883935044625e-01 -1.0060588779438502e+00 -2.1858285901210848e+00 -1.0060588779438504e+00 1.1440063579729431e+00 1.5637818686078846e+00 1.1440063579729431e+00 1.0503083991787840e+00 4.0052813481326668e+00 1.0503083991787840e+00 -1.0157905583708706e+00 -3.2538823732982545e+00 -1.0157905583708695e+00 -9.1850883935044614e-01 -2.4784170838148230e+00 -1.2202043762329970e+00 1.0452239593312040e+00 2.4137409571542179e+00 9.2102393541523231e-01 6.7713999302602690e-01 1.0695864444224512e+00 1.7426648462953263e+00 -6.9711095871557716e-01 -8.3068177755306727e-01 -1.5627868617073346e+00 -5.5203845230680360e-01 -9.0813741990782904e-01 -1.0903515057679365e+00 7.3301618267136037e-01 7.9171109294283493e-01 1.2077993557732112e+00 5.9372385774946679e-01 1.0503083991787840e+00 2.7306585035958828e+00 -7.9863169401978362e-01 -1.1028802849045112e+00 -2.7995471838261432e+00 -5.8572893631416612e-01 -9.4915458890429738e-01 -1.8045133207239799e+00 6.2963000790947621e-01 8.7924813472563534e-01 1.5760761663609744e+00 -1.7902142330912976e+00 -9.4173003942035838e-01 -9.4600641229904159e-01 2.0471846577207460e+00 9.6389027787443915e-01 8.8768970971404326e-01 1.2562574970372127e+00 1.0690112574995256e+00 7.6292297383131402e-01 -1.5455927617655583e+00 -8.3929646432437444e-01 -1.0144956188723659e+00 -2.7995471838261432e+00 -1.0157905583708706e+00 -7.9863169401978362e-01 3.1343110125343041e+00 9.4501146808597924e-01 1.0743032556924732e+00 1.7485706618356682e+00 8.3880628729522266e-01 8.8280391150122672e-01 -2.0509696504449306e+00 -1.0199022286395643e+00 -8.4858612554786639e-01 -7.8320374199667575e-01 -1.9381797047556983e+00 -9.3841975865617722e-01 1.0115112647213811e+00 1.9530854339552874e+00 8.8782523372534006e-01 8.3893069918434637e-01 1.5598775215928269e+00 8.3893069918434648e-01 -8.5877488015968306e-01 -1.2370584026063483e+00 -8.5877488015968306e-01 -1.1028802849045107e+00 -3.2538823732982545e+00 -1.1028802849045110e+00 9.4501146808597947e-01 2.9012517959125983e+00 9.4501146808597891e-01 8.8782523372533950e-01 1.9530854339552832e+00 1.0115112647213804e+00 -9.3841975865617644e-01 -1.9381797047556948e+00 -7.8320374199667475e-01 -8.4858612554786661e-01 -1.0199022286395638e+00 -2.0509696504449337e+00 8.8280391150122617e-01 8.3880628729522255e-01 1.7485706618356709e+00 7.6292297383131324e-01 1.0690112574995250e+00 1.2562574970372122e+00 -1.0144956188723653e+00 -8.3929646432437377e-01 -1.5455927617655578e+00 -7.9863169401978240e-01 -1.0157905583708697e+00 -2.7995471838261432e+00 1.0743032556924730e+00 9.4501146808597891e-01 3.1343110125343028e+00 8.8768970971404226e-01 9.6389027787443793e-01 2.0471846577207415e+00 -9.4600641229904026e-01 -9.4173003942035738e-01 -1.7902142330912931e+00 -1.0649637497650262e+00 -7.7180939684969685e-01 -7.2695223794031305e-01 1.2627172176321764e+00 8.5445502923020156e-01 6.6273662420643842e-01 1.6717240406211609e+00 9.3255605551861565e-01 7.3536220395698093e-01 -1.8716465069444084e+00 -8.1087968457659676e-01 -9.1811449535854117e-01 -1.5627868617073308e+00 -9.1850883935044614e-01 -5.8572893631416612e-01 1.7485706618356682e+00 8.8782523372533950e-01 8.8768970971404226e-01 2.7322222200266779e+00 9.2732270250952409e-01 8.8992367767440317e-01 -2.9158370216989185e+00 -1.1009611002069417e+00 -9.4491654593884467e-01 -7.9662044304644031e-01 -1.6524583322217630e+00 -1.0647652235514262e+00 1.0106811098032829e+00 1.6531495951556712e+00 8.5445502923020122e-01 9.8582262677967192e-01 2.5116737394606967e+00 1.1718156702852549e+00 -1.0491226099020277e+00 -2.0308982519645666e+00 -1.1333140841988347e+00 -8.3068177755306627e-01 -2.4784170838148230e+00 -9.4915458890429749e-01 8.3880628729522266e-01 1.9530854339552832e+00 9.6389027787443782e-01 9.2732270250952442e-01 3.4417240401514926e+00 1.2927435040729249e+00 -1.0862078958861672e+00 -3.3978591407219914e+00 -1.1356705848082609e+00 -7.7436852622459817e-01 -1.0988621505152547e+00 -1.5560347443521918e+00 9.2476831993429098e-01 1.0106811098032833e+00 1.2627172176321766e+00 7.7191632445325142e-01 1.1604954058085379e+00 1.9210696266945502e+00 -1.0691241499045729e+00 -1.0261614964033037e+00 -2.2224443921234194e+00 -6.9711095871557649e-01 -1.2202043762329970e+00 -1.8045133207239799e+00 8.8280391150122672e-01 1.0115112647213806e+00 2.0471846577207415e+00 8.8992367767440317e-01 1.2927435040729245e+00 3.3336405716165087e+00 -9.2880859871842436e-01 -1.1302032612545720e+00 -2.9816196164643856e+00 1.2519691973325002e+00 9.8225183886614520e-01 8.7017642737322110e-01 -1.5560347443521914e+00 -1.0647652235514264e+00 -7.2695223794031283e-01 -1.9031340736555689e+00 -1.2394424219539832e+00 -7.7811208876531501e-01 2.1490804818149765e+00 1.0447716667464009e+00 9.7591620428683978e-01 1.7426648462953227e+00 1.0452239593312038e+00 6.2963000790947621e-01 -2.0509696504449311e+00 -9.3841975865617644e-01 -9.4600641229904026e-01 -2.9158370216989185e+00 -1.0862078958861667e+00 -9.2880859871842436e-01 3.2822609647088088e+00 1.2565878351040036e+00 9.0415669815355570e-01 8.7923594169064778e-01 1.6261958572109982e+00 9.8225183886614531e-01 -1.0988621505152549e+00 -1.6524583322217636e+00 -7.7180939684969674e-01 -1.0635359172672625e+00 -2.5354307453358560e+00 -9.5158740861684477e-01 1.0778511754119211e+00 2.0267335632645689e+00 9.6278744266082994e-01 1.0695864444224503e+00 2.4137409571542179e+00 8.7924813472563534e-01 -1.0199022286395643e+00 -1.9381797047556948e+00 -9.4173003942035738e-01 -1.1009611002069417e+00 -3.3978591407219918e+00 -1.1302032612545720e+00 1.2565878351040034e+00 3.4572575454055219e+00 9.7104268988886100e-01 7.0351568246391960e-01 8.7923594169064745e-01 1.2519691973325000e+00 -7.7436852622459795e-01 -7.9662044304644053e-01 -1.0649637497650257e+00 -7.0944607499263701e-01 -1.0019937876885396e+00 -1.6822710444666074e+00 9.9250489906044481e-01 9.4618599054517571e-01 1.8813055963191021e+00 6.7713999302602590e-01 9.2102393541523231e-01 1.5760761663609744e+00 -8.4858612554786639e-01 -7.8320374199667486e-01 -1.7902142330912933e+00 -9.4491654593884467e-01 -1.1356705848082607e+00 -2.9816196164643856e+00 9.0415669815355570e-01 9.7104268988886078e-01 2.8097176837747364e+00 456 457 458 189 190 191 621 622 623 573 574 575 459 460 461 462 463 464 504 505 506 489 490 491 2.7900207800889443e+00 9.6008803573056678e-01 8.9529186582743336e-01 -2.9628627130705527e+00 -1.1243940021366641e+00 -9.3934318458323451e-01 -1.6393380505493989e+00 -9.8815020936415154e-01 -6.9467268276795791e-01 1.8433447117812916e+00 9.3183874609798711e-01 9.8423514576032944e-01 1.5828081402323968e+00 9.1016178692306937e-01 6.7219174870513676e-01 -1.8009917209244342e+00 -7.7670507379812403e-01 -8.4582788392449049e-01 -1.0527030421011552e+00 -7.8365361314004722e-01 -7.6689740069798829e-01 1.2397218945429083e+00 8.7081432968736516e-01 6.9502239168077073e-01 9.6008803573056678e-01 3.4420344379141103e+00 1.2516992804814775e+00 -1.1249693983672315e+00 -3.3771607752082913e+00 -1.0963942121803658e+00 -9.3987975020996994e-01 -2.4999491389151656e+00 -1.0526072744551478e+00 9.5587385827304094e-01 1.9827442554695049e+00 1.0707825130344701e+00 8.7539275515759984e-01 2.4246621931049996e+00 1.0719230085180278e+00 -9.3757650197813791e-01 -1.9476980143481468e+00 -1.0188414373918979e+00 -7.6509249348193620e-01 -1.6404729974284116e+00 -1.0973762076939300e+00 9.7616349487606902e-01 1.6158400394114008e+00 8.7081432968736538e-01 8.9529186582743359e-01 1.2516992804814775e+00 3.2713853106896726e+00 -9.2232032224405180e-01 -1.0743759508250164e+00 -2.8980298275202592e+00 -7.6711302335065912e-01 -1.2323918696856044e+00 -1.8627311699322371e+00 9.7063644240076086e-01 1.0326443330039727e+00 2.1169428804652277e+00 6.2232283210364037e-01 1.0356776846313722e+00 1.7522850252126465e+00 -9.4341079619819357e-01 -9.3319554203236710e-01 -2.0679423844415181e+00 -7.2057418691796715e-01 -1.0562214304499020e+00 -1.5516317290164408e+00 8.6516718837903772e-01 9.7616349487606824e-01 1.2397218945429083e+00 -2.9628627130705527e+00 -1.1249693983672318e+00 -9.2232032224405147e-01 3.3241516775864430e+00 1.2863107710512405e+00 8.8350136567420412e-01 1.8813194445464532e+00 1.1559326006235411e+00 7.6123435012363494e-01 -2.1931608467066823e+00 -1.0167282174100136e+00 -1.0665111247759722e+00 -1.8159269808157286e+00 -1.2177133752134053e+00 -6.9086244650300088e-01 2.0641251234931963e+00 1.0109363263768389e+00 8.7937145874625655e-01 1.2539860239833112e+00 1.0036075006329579e+00 9.2248411967691779e-01 -1.5516317290164408e+00 -1.0973762076939293e+00 -7.6689740069798806e-01 -1.1243940021366643e+00 -3.3771607752082913e+00 -1.0743759508250161e+00 1.2863107710512409e+00 3.4197495783556446e+00 9.1646830337019569e-01 1.1583193831377310e+00 2.4727803672538422e+00 9.7055494348744387e-01 -1.1220561987610718e+00 -1.9858689518976076e+00 -1.0388269337900287e+00 -9.4453695290619166e-01 -2.4880479990344111e+00 -8.2221289416798704e-01 9.5648307529375898e-01 1.9605570171447266e+00 8.2843864443248139e-01 8.4609535477109921e-01 1.6384637608145056e+00 1.0036075006329583e+00 -1.0562214304499022e+00 -1.6404729974284111e+00 -7.8365361314004711e-01 -9.3934318458323451e-01 -1.0963942121803658e+00 -2.8980298275202587e+00 8.8350136567420412e-01 9.1646830337019580e-01 2.7140030306673242e+00 7.2288989021222627e-01 9.2291297245525772e-01 1.6306174561993589e+00 -9.1071110674754130e-01 -7.9869467223670298e-01 -1.8366156750750098e+00 -5.8105609683767079e-01 -9.1265490928622728e-01 -1.5712191097086392e+00 8.8798634055555381e-01 8.8735965658867810e-01 1.7599611435550697e+00 6.5730697864442944e-01 8.4609535477109921e-01 1.2539860239833116e+00 -7.2057418691796737e-01 -7.6509249348193586e-01 -1.0527030421011552e+00 -1.6393380505493986e+00 -9.3987975020996994e-01 -7.6711302335065912e-01 1.8813194445464532e+00 1.1583193831377308e+00 7.2288989021222627e-01 2.8058111199502846e+00 1.2135642707214309e+00 7.5825397461945432e-01 -2.9821806304526834e+00 -1.1854968847002676e+00 -9.9300914895265635e-01 -1.0772616943398199e+00 -9.9557348251042954e-01 -5.4209580262919266e-01 1.2437635245780416e+00 8.3111879452920812e-01 7.5451244274515084e-01 1.6306174561993578e+00 9.7055494348744320e-01 7.6123435012363450e-01 -1.8627311699322360e+00 -1.0526072744551467e+00 -6.9467268276795746e-01 -9.8815020936415154e-01 -2.4999491389151656e+00 -1.2323918696856044e+00 1.1559326006235409e+00 2.4727803672538422e+00 9.2291297245525772e-01 1.2135642707214309e+00 4.0073819830932438e+00 1.2135642707214320e+00 -1.2368503342223722e+00 -3.3209083814463058e+00 -1.2368503342223720e+00 -9.0012019964061407e-01 -2.1804749029063646e+00 -9.0012019964061407e-01 1.0651027691125117e+00 1.5483388445820689e+00 1.0651027691125114e+00 9.2291297245525761e-01 2.4727803672538422e+00 1.1559326006235415e+00 -1.2323918696856047e+00 -2.4999491389151647e+00 -9.8815020936415143e-01 -6.9467268276795791e-01 -1.0526072744551478e+00 -1.8627311699322371e+00 7.6123435012363494e-01 9.7055494348744387e-01 1.6306174561993587e+00 7.5825397461945454e-01 1.2135642707214320e+00 2.8058111199502855e+00 -9.9300914895265713e-01 -1.1854968847002685e+00 -2.9821806304526839e+00 -5.4209580262919288e-01 -9.9557348251043021e-01 -1.0772616943398203e+00 7.5451244274515128e-01 8.3111879452920856e-01 1.2437635245780423e+00 7.2288989021222649e-01 1.1583193831377314e+00 1.8813194445464538e+00 -7.6711302335065967e-01 -9.3987975020997006e-01 -1.6393380505493984e+00 1.8433447117812916e+00 9.5587385827304083e-01 9.7063644240076108e-01 -2.1931608467066828e+00 -1.1220561987610718e+00 -9.1071110674754130e-01 -2.9821806304526839e+00 -1.2368503342223722e+00 -9.9300914895265691e-01 3.3977036118325188e+00 1.0836432810567986e+00 1.3018753402161654e+00 1.1971952440575002e+00 1.1386390842884384e+00 7.2736319280176509e-01 -1.5432292959021610e+00 -8.5120526987927381e-01 -1.0138787407028504e+00 -1.8366156750750093e+00 -1.0388269337900287e+00 -1.0665111247759727e+00 2.1169428804652268e+00 1.0707825130344697e+00 9.8423514576032967e-01 9.3183874609798711e-01 1.9827442554695049e+00 1.0326443330039727e+00 -1.0167282174100136e+00 -1.9858689518976076e+00 -7.9869467223670298e-01 -1.1854968847002676e+00 -3.3209083814463050e+00 -1.1854968847002683e+00 1.0836432810567984e+00 3.0045948238432261e+00 1.0836432810567986e+00 7.8392214069444055e-01 1.5449814784708220e+00 7.8392214069444055e-01 -8.3112872650621439e-01 -1.2224185280115347e+00 -8.3112872650621428e-01 -7.9869467223670265e-01 -1.9858689518976069e+00 -1.0167282174100138e+00 1.0326443330039727e+00 1.9827442554695032e+00 9.3183874609798711e-01 9.8423514576032944e-01 1.0707825130344704e+00 2.1169428804652282e+00 -1.0665111247759722e+00 -1.0388269337900287e+00 -1.8366156750750098e+00 -9.9300914895265635e-01 -1.2368503342223720e+00 -2.9821806304526839e+00 1.3018753402161651e+00 1.0836432810567986e+00 3.3977036118325192e+00 7.2736319280176498e-01 1.1386390842884382e+00 1.1971952440575000e+00 -1.0138787407028500e+00 -8.5120526987927370e-01 -1.5432292959021607e+00 -9.1071110674754108e-01 -1.1220561987610715e+00 -2.1931608467066823e+00 9.7063644240076086e-01 9.5587385827304006e-01 1.8433447117812909e+00 1.5828081402323966e+00 8.7539275515759984e-01 6.2232283210364037e-01 -1.8159269808157286e+00 -9.4453695290619155e-01 -5.8105609683767079e-01 -1.0772616943398199e+00 -9.0012019964061407e-01 -5.4209580262919288e-01 1.1971952440574998e+00 7.8392214069444055e-01 7.2736319280176498e-01 2.8040592437443159e+00 1.0506156501875392e+00 5.9179214630786725e-01 -2.8719398683826705e+00 -1.1149835078428136e+00 -7.9965557394854492e-01 -1.5712191097086385e+00 -8.2221289416798671e-01 -6.9086244650300110e-01 1.7522850252126458e+00 1.0719230085180274e+00 6.7219174870513676e-01 9.1016178692306937e-01 2.4246621931049996e+00 1.0356776846313722e+00 -1.2177133752134053e+00 -2.4880479990344111e+00 -9.1265490928622728e-01 -9.9557348251042954e-01 -2.1804749029063646e+00 -9.9557348251043021e-01 1.1386390842884384e+00 1.5449814784708220e+00 1.1386390842884382e+00 1.0506156501875392e+00 4.0893159511670421e+00 1.0506156501875394e+00 -1.0091524390203563e+00 -3.3270509148726730e+00 -1.0091524390203566e+00 -9.1265490928622717e-01 -2.4880479990344102e+00 -1.2177133752134055e+00 1.0356776846313724e+00 2.4246621931049979e+00 9.1016178692306948e-01 6.7219174870513687e-01 1.0719230085180278e+00 1.7522850252126465e+00 -6.9086244650300088e-01 -8.2221289416798704e-01 -1.5712191097086394e+00 -5.4209580262919266e-01 -9.0012019964061407e-01 -1.0772616943398203e+00 7.2736319280176509e-01 7.8392214069444055e-01 1.1971952440575000e+00 5.9179214630786714e-01 1.0506156501875392e+00 2.8040592437443155e+00 -7.9965557394854481e-01 -1.1149835078428139e+00 -2.8719398683826705e+00 -5.8105609683767079e-01 -9.4453695290619155e-01 -1.8159269808157283e+00 6.2232283210364059e-01 8.7539275515759951e-01 1.5828081402323959e+00 -1.8009917209244342e+00 -9.3757650197813791e-01 -9.4341079619819357e-01 2.0641251234931968e+00 9.5648307529375898e-01 8.8798634055555381e-01 1.2437635245780416e+00 1.0651027691125117e+00 7.5451244274515128e-01 -1.5432292959021607e+00 -8.3112872650621439e-01 -1.0138787407028502e+00 -2.8719398683826705e+00 -1.0091524390203566e+00 -7.9965557394854492e-01 3.2162534780244751e+00 9.4667461605785297e-01 1.0809027527271173e+00 1.7599611435550693e+00 8.2843864443248127e-01 8.7937145874625677e-01 -2.0679423844415177e+00 -1.0188414373918975e+00 -8.4582788392449038e-01 -7.7670507379812392e-01 -1.9476980143481468e+00 -9.3319554203236699e-01 1.0109363263768389e+00 1.9605570171447264e+00 8.8735965658867810e-01 8.3111879452920800e-01 1.5483388445820687e+00 8.3111879452920856e-01 -8.5120526987927381e-01 -1.2224185280115347e+00 -8.5120526987927370e-01 -1.1149835078428136e+00 -3.3270509148726726e+00 -1.1149835078428136e+00 9.4667461605785297e-01 2.9754125927089783e+00 9.4667461605785308e-01 8.8735965658867799e-01 1.9605570171447262e+00 1.0109363263768392e+00 -9.3319554203236710e-01 -1.9476980143481459e+00 -7.7670507379812415e-01 -8.4582788392449049e-01 -1.0188414373918979e+00 -2.0679423844415177e+00 8.7937145874625666e-01 8.2843864443248139e-01 1.7599611435550697e+00 7.5451244274515084e-01 1.0651027691125114e+00 1.2437635245780423e+00 -1.0138787407028502e+00 -8.3112872650621417e-01 -1.5432292959021610e+00 -7.9965557394854492e-01 -1.0091524390203566e+00 -2.8719398683826709e+00 1.0809027527271176e+00 9.4667461605785308e-01 3.2162534780244747e+00 8.8798634055555370e-01 9.5648307529375864e-01 2.0641251234931963e+00 -9.4341079619819368e-01 -9.3757650197813736e-01 -1.8009917209244335e+00 -1.0527030421011552e+00 -7.6509249348193620e-01 -7.2057418691796715e-01 1.2539860239833114e+00 8.4609535477109921e-01 6.5730697864442944e-01 1.6306174561993578e+00 9.2291297245525761e-01 7.2288989021222638e-01 -1.8366156750750093e+00 -7.9869467223670265e-01 -9.1071110674754108e-01 -1.5712191097086385e+00 -9.1265490928622717e-01 -5.8105609683767068e-01 1.7599611435550688e+00 8.8735965658867799e-01 8.8798634055555370e-01 2.7140030306673202e+00 9.1646830337019525e-01 8.8350136567420390e-01 -2.8980298275202570e+00 -1.0963942121803649e+00 -9.3934318458323407e-01 -7.8365361314004722e-01 -1.6404729974284116e+00 -1.0562214304499020e+00 1.0036075006329579e+00 1.6384637608145058e+00 8.4609535477109921e-01 9.7055494348744309e-01 2.4727803672538418e+00 1.1583193831377316e+00 -1.0388269337900289e+00 -1.9858689518976069e+00 -1.1220561987610715e+00 -8.2221289416798671e-01 -2.4880479990344107e+00 -9.4453695290619166e-01 8.2843864443248139e-01 1.9605570171447262e+00 9.5648307529375876e-01 9.1646830337019525e-01 3.4197495783556411e+00 1.2863107710512409e+00 -1.0743759508250159e+00 -3.3771607752082877e+00 -1.1243940021366643e+00 -7.6689740069798829e-01 -1.0973762076939300e+00 -1.5516317290164408e+00 9.2248411967691779e-01 1.0036075006329586e+00 1.2539860239833116e+00 7.6123435012363472e-01 1.1559326006235415e+00 1.8813194445464538e+00 -1.0665111247759727e+00 -1.0167282174100141e+00 -2.1931608467066823e+00 -6.9086244650300110e-01 -1.2177133752134059e+00 -1.8159269808157283e+00 8.7937145874625677e-01 1.0109363263768394e+00 2.0641251234931963e+00 8.8350136567420412e-01 1.2863107710512411e+00 3.3241516775864408e+00 -9.2232032224405203e-01 -1.1249693983672315e+00 -2.9628627130705505e+00 1.2397218945429083e+00 9.7616349487606902e-01 8.6516718837903772e-01 -1.5516317290164408e+00 -1.0562214304499022e+00 -7.2057418691796760e-01 -1.8627311699322360e+00 -1.2323918696856047e+00 -7.6711302335065967e-01 2.1169428804652273e+00 1.0326443330039727e+00 9.7063644240076086e-01 1.7522850252126461e+00 1.0356776846313724e+00 6.2232283210364059e-01 -2.0679423844415177e+00 -9.3319554203236676e-01 -9.4341079619819368e-01 -2.8980298275202570e+00 -1.0743759508250157e+00 -9.2232032224405192e-01 3.2713853106896709e+00 1.2516992804814768e+00 8.9529186582743336e-01 8.7081432968736516e-01 1.6158400394114010e+00 9.7616349487606824e-01 -1.0973762076939293e+00 -1.6404729974284111e+00 -7.6509249348193586e-01 -1.0526072744551467e+00 -2.4999491389151642e+00 -9.3987975020997006e-01 1.0707825130344697e+00 1.9827442554695032e+00 9.5587385827304006e-01 1.0719230085180274e+00 2.4246621931049983e+00 8.7539275515759951e-01 -1.0188414373918975e+00 -1.9476980143481462e+00 -9.3757650197813736e-01 -1.0963942121803649e+00 -3.3771607752082877e+00 -1.1249693983672315e+00 1.2516992804814766e+00 3.4420344379141072e+00 9.6008803573056634e-01 6.9502239168077073e-01 8.7081432968736550e-01 1.2397218945429083e+00 -7.6689740069798806e-01 -7.8365361314004711e-01 -1.0527030421011552e+00 -6.9467268276795746e-01 -9.8815020936415154e-01 -1.6393380505493984e+00 9.8423514576032967e-01 9.3183874609798700e-01 1.8433447117812904e+00 6.7219174870513687e-01 9.1016178692306948e-01 1.5828081402323961e+00 -8.4582788392449038e-01 -7.7670507379812426e-01 -1.8009917209244335e+00 -9.3934318458323418e-01 -1.1243940021366643e+00 -2.9628627130705509e+00 8.9529186582743336e-01 9.6008803573056622e-01 2.7900207800889429e+00 525 526 527 573 574 575 585 586 587 537 538 539 471 472 473 489 490 491 492 493 494 474 475 476 2.8625602301979467e+00 8.3987189830047970e-01 7.7351684292449352e-01 -2.9915743977710894e+00 -1.0719426903084575e+00 -8.9465243597227351e-01 -1.5588072116693357e+00 -8.2979126918029844e-01 -6.0806861070839091e-01 1.7224200922135198e+00 9.0651455701225203e-01 8.9435097753398329e-01 1.4945867459855200e+00 7.7487235461639181e-01 5.9382809589818797e-01 -1.6770064768674098e+00 -7.4703491052061066e-01 -7.5631879669025204e-01 -8.9255680794283521e-01 -6.7101310825936589e-01 -6.4184154232346091e-01 1.0403778258536847e+00 7.9852316833960879e-01 6.3918546933771259e-01 8.3987189830047981e-01 4.3164147031695688e+00 1.6967486299198258e+00 -1.0655138483950477e+00 -4.3102145767037898e+00 -1.5473899707774279e+00 -7.9399407683294376e-01 -3.1688179252319650e+00 -1.4335687744164605e+00 9.1524871929975160e-01 2.6683955411073859e+00 1.4733663295628066e+00 7.3618414232350371e-01 3.0245222621299979e+00 1.4412912221333019e+00 -9.2248775372667091e-01 -2.5534222031685396e+00 -1.3979140122712639e+00 -6.4426433681718531e-01 -2.1204871501936506e+00 -1.4461370073839106e+00 9.3495525584811134e-01 2.1436093488909935e+00 1.2136035832331280e+00 7.7351684292449341e-01 1.6967486299198256e+00 4.0448334262177017e+00 -8.8198029315440452e-01 -1.5334907527719897e+00 -3.6374191954743114e+00 -6.5884745736849726e-01 -1.6358321774908702e+00 -2.4015090731046738e+00 8.8354814380116964e-01 1.4460069659134236e+00 2.6539413415963380e+00 5.5154943148986046e-01 1.4122614895734014e+00 2.2414837781058776e+00 -8.9356757700576905e-01 -1.3300572704431683e+00 -2.5586917574466477e+00 -6.0128348459699754e-01 -1.4109931307501284e+00 -1.9557033756350084e+00 8.2706439391014375e-01 1.3553562460495054e+00 1.6130648557407230e+00 -2.9915743977710894e+00 -1.0655138483950477e+00 -8.8198029315440496e-01 3.3301523226378555e+00 1.3100859498271722e+00 9.1538610529259135e-01 1.7528196681074328e+00 1.0714899093317887e+00 7.3237654103699912e-01 -2.0502406060335607e+00 -1.0785955124728777e+00 -1.0302813821480004e+00 -1.6825918963338040e+00 -1.1318731117046996e+00 -7.0775859064007751e-01 1.9292795860996983e+00 1.0415985332275766e+00 8.8226762199445929e-01 1.0493647645822468e+00 9.5611689638608277e-01 8.6899931026917177e-01 -1.3372094412887778e+00 -1.1033088161999949e+00 -7.7900931265073892e-01 -1.0719426903084570e+00 -4.3102145767037889e+00 -1.5334907527719897e+00 1.3100859498271722e+00 4.4125986089304261e+00 1.3693549142933064e+00 1.0753583810714196e+00 3.2100686562551952e+00 1.3712288960993009e+00 -1.1574448191841851e+00 -2.7266640671621372e+00 -1.4569605588303589e+00 -8.6151441588345801e-01 -3.1435396220753185e+00 -1.2165020820876371e+00 1.0101321067015514e+00 2.6203247712131508e+00 1.2263454801340270e+00 7.7059385289328730e-01 2.1701938637646427e+00 1.3867114638373321e+00 -1.0752683651173283e+00 -2.2327676342221676e+00 -1.1466873606739800e+00 -8.9465243597227373e-01 -1.5473899707774283e+00 -3.6374191954743114e+00 9.1538610529259168e-01 1.3693549142933066e+00 3.4111342340579047e+00 7.1007024357927206e-01 1.3278914978833951e+00 2.1318776353301696e+00 -9.1569953533507142e-01 -1.2011479692268900e+00 -2.3538972053541216e+00 -5.5858287325374278e-01 -1.2833341783657646e+00 -2.0125616588194974e+00 8.8174830801219872e-01 1.2665866027935799e+00 2.2301379415647085e+00 6.0658633362624725e-01 1.1930498787124226e+00 1.6318707454827746e+00 -7.4485614594922089e-01 -1.1250107753126204e+00 -1.4011424967876271e+00 -1.5588072116693359e+00 -7.9399407683294376e-01 -6.5884745736849726e-01 1.7528196681074328e+00 1.0753583810714193e+00 7.1007024357927206e-01 2.8996647312414887e+00 1.0188030135443689e+00 6.7947103332765124e-01 -3.0451980493518778e+00 -1.1314522400813534e+00 -9.1292374266217990e-01 -9.0951769570494334e-01 -8.1418735415912769e-01 -4.9704198526822707e-01 1.0526017739993785e+00 7.7934984061321266e-01 6.7638528274346288e-01 1.5382888474576544e+00 8.1323687719150883e-01 6.4942722900166461e-01 -1.7298520640797959e+00 -9.4711444134708489e-01 -6.4654060335314645e-01 -8.2979126918029844e-01 -3.1688179252319655e+00 -1.6358321774908702e+00 1.0714899093317887e+00 3.2100686562551952e+00 1.3278914978833951e+00 1.0188030135443689e+00 4.9869887591360271e+00 1.6594365993346605e+00 -1.1561848786703746e+00 -4.3556851922806450e+00 -1.6710910511643018e+00 -7.4225369862487178e-01 -2.6839012353059384e+00 -1.2655573953303993e+00 1.0157710160557978e+00 2.1030928603846384e+00 1.4273694401240176e+00 7.6738099370396307e-01 3.1044735734245106e+00 1.5229148804704258e+00 -1.1452150861603725e+00 -3.1962194963818216e+00 -1.3651317938269272e+00 -6.0806861070839091e-01 -1.4335687744164607e+00 -2.4015090731046738e+00 7.3237654103699901e-01 1.3712288960993007e+00 2.1318776353301696e+00 6.7947103332765124e-01 1.6594365993346609e+00 3.5848178373914799e+00 -9.1821439214775957e-01 -1.6441831472868178e+00 -3.7850402932197440e+00 -4.7999079455158405e-01 -1.3407768376713216e+00 -1.4384259472144874e+00 7.3150396512738425e-01 1.1769620757174133e+00 1.6308656607493899e+00 6.1492801373404382e-01 1.5310451973880039e+00 2.3899117696450602e+00 -7.5200575581834317e-01 -1.3201440091647787e+00 -2.1124975895771936e+00 1.7224200922135198e+00 9.1524871929975160e-01 8.8354814380116964e-01 -2.0502406060335607e+00 -1.1574448191841848e+00 -9.1569953533507142e-01 -3.0451980493518773e+00 -1.1561848786703746e+00 -9.1821439214775935e-01 3.4270199472290126e+00 1.1532074725243602e+00 1.2249774068444323e+00 1.0083139059419324e+00 1.0593972567875964e+00 7.1608822733367117e-01 -1.3292680522909317e+00 -9.0909317421510272e-01 -9.6929986564422443e-01 -1.7024415073644836e+00 -9.9288207243029625e-01 -9.7294359354327953e-01 1.9693942696563882e+00 1.0877514958882502e+00 9.5154360869106114e-01 9.0651455701225203e-01 2.6683955411073863e+00 1.4460069659134238e+00 -1.0785955124728779e+00 -2.7266640671621372e+00 -1.2011479692268900e+00 -1.1314522400813536e+00 -4.3556851922806441e+00 -1.6441831472868178e+00 1.1532074725243602e+00 4.0035793172213934e+00 1.5650955810335407e+00 7.3652568578155420e-01 2.1051732120204187e+00 1.1382875996446062e+00 -8.9926470555741544e-01 -1.7481145721139242e+00 -1.2151055382028328e+00 -7.5447140655373579e-01 -2.6339245697669948e+00 -1.4188429890933063e+00 1.0675361493472149e+00 2.6872403309745030e+00 1.3298894972182760e+00 8.9435097753398329e-01 1.4733663295628068e+00 2.6539413415963380e+00 -1.0302813821480004e+00 -1.4569605588303589e+00 -2.3538972053541216e+00 -9.1292374266217990e-01 -1.6710910511643022e+00 -3.7850402932197431e+00 1.2249774068444323e+00 1.5650955810335407e+00 4.1837932267224804e+00 6.4131622054558113e-01 1.4797945386325857e+00 1.5871401192210337e+00 -9.6754670376159502e-01 -1.2261806960041657e+00 -1.9212668241636548e+00 -7.8461274506256951e-01 -1.4982408253133601e+00 -2.6954497428301787e+00 9.3471996871034702e-01 1.3342166820832535e+00 2.3307793780278465e+00 1.4945867459855200e+00 7.3618414232350360e-01 5.5154943148986058e-01 -1.6825918963338040e+00 -8.6151441588345823e-01 -5.5858287325374278e-01 -9.0951769570494334e-01 -7.4225369862487167e-01 -4.7999079455158405e-01 1.0083139059419326e+00 7.3652568578155420e-01 6.4131622054558113e-01 2.7814891874030794e+00 8.6160730698610122e-01 5.3953288219765427e-01 -2.8366747311278693e+00 -1.0276457091418525e+00 -7.6262365769732698e-01 -1.4692169083575020e+00 -6.8127969110770892e-01 -5.8026533334235131e-01 1.6136113921935873e+00 9.7837637966673219e-01 6.4906412461190910e-01 7.7487235461639181e-01 3.0245222621299979e+00 1.4122614895734014e+00 -1.1318731117046996e+00 -3.1435396220753185e+00 -1.2833341783657648e+00 -8.1418735415912780e-01 -2.6839012353059384e+00 -1.3407768376713216e+00 1.0593972567875964e+00 2.1051732120204187e+00 1.4797945386325857e+00 8.6160730698610122e-01 4.7953814764731657e+00 1.4549489373989928e+00 -9.5662357559960365e-01 -4.1002423987716563e+00 -1.4203444691299369e+00 -7.3818568307069099e-01 -3.0378512832343469e+00 -1.5724146594310775e+00 9.4499280614403114e-01 3.0404575887636769e+00 1.2698651789931210e+00 5.9382809589818808e-01 1.4412912221333019e+00 2.2414837781058776e+00 -7.0775859064007762e-01 -1.2165020820876371e+00 -2.0125616588194974e+00 -4.9704198526822707e-01 -1.2655573953303993e+00 -1.4384259472144876e+00 7.1608822733367117e-01 1.1382875996446060e+00 1.5871401192210337e+00 5.3953288219765438e-01 1.4549489373989928e+00 3.3700417750223242e+00 -7.4658544196006937e-01 -1.4964121230983887e+00 -3.4789708578761172e+00 -5.0662775059616949e-01 -1.2925114573142771e+00 -2.2715127278896046e+00 6.0856456303502893e-01 1.2364552986538015e+00 2.0028055194504706e+00 -1.6770064768674098e+00 -9.2248775372667102e-01 -8.9356757700576905e-01 1.9292795860996983e+00 1.0101321067015514e+00 8.8174830801219872e-01 1.0526017739993785e+00 1.0157710160557978e+00 7.3150396512738436e-01 -1.3292680522909317e+00 -8.9926470555741544e-01 -9.6754670376159502e-01 -2.8366747311278693e+00 -9.5662357559960354e-01 -7.4658544196006937e-01 3.1582121312604614e+00 1.0028713366538313e+00 1.0437701060982014e+00 1.6206845790729802e+00 7.9749939930054936e-01 7.9264842366440236e-01 -1.9178288101463068e+00 -1.0478978238280396e+00 -8.4197108017475297e-01 -7.4703491052061066e-01 -2.5534222031685396e+00 -1.3300572704431683e+00 1.0415985332275763e+00 2.6203247712131508e+00 1.2665866027935799e+00 7.7934984061321266e-01 2.1030928603846384e+00 1.1769620757174137e+00 -9.0909317421510272e-01 -1.7481145721139242e+00 -1.2261806960041657e+00 -1.0276457091418527e+00 -4.1002423987716563e+00 -1.4964121230983887e+00 1.0028713366538313e+00 3.7156031435338077e+00 1.3685697872718130e+00 8.3923091590371435e-01 2.5365083101190296e+00 1.3726065072007145e+00 -9.7927683252076758e-01 -2.5737499111965065e+00 -1.1320748834377978e+00 -7.5631879669025182e-01 -1.3979140122712639e+00 -2.5586917574466477e+00 8.8226762199445929e-01 1.2263454801340270e+00 2.2301379415647085e+00 6.7638528274346288e-01 1.4273694401240176e+00 1.6308656607493899e+00 -9.6929986564422443e-01 -1.2151055382028331e+00 -1.9212668241636548e+00 -7.6262365769732698e-01 -1.4203444691299372e+00 -3.4789708578761172e+00 1.0437701060982016e+00 1.3685697872718130e+00 3.8135434006375046e+00 8.0848934868572431e-01 1.3342474517727507e+00 2.5198838634788920e+00 -9.2267003949004345e-01 -1.3231681396985748e+00 -2.2355014269440745e+00 -8.9255680794283521e-01 -6.4426433681718520e-01 -6.0128348459699743e-01 1.0493647645822468e+00 7.7059385289328730e-01 6.0658633362624725e-01 1.5382888474576544e+00 7.6738099370396307e-01 6.1492801373404393e-01 -1.7024415073644839e+00 -7.5447140655373579e-01 -7.8461274506256951e-01 -1.4692169083575020e+00 -7.3818568307069099e-01 -5.0662775059616960e-01 1.6206845790729802e+00 8.3923091590371435e-01 8.0848934868572431e-01 2.7363346655094833e+00 7.7043769459802558e-01 7.2755181803358804e-01 -2.8804576329575444e+00 -1.0107220306573781e+00 -8.6503153382386722e-01 -6.7101310825936589e-01 -2.1204871501936506e+00 -1.4109931307501284e+00 9.5611689638608288e-01 2.1701938637646427e+00 1.1930498787124226e+00 8.1323687719150906e-01 3.1044735734245101e+00 1.5310451973880039e+00 -9.9288207243029636e-01 -2.6339245697669948e+00 -1.4982408253133608e+00 -6.8127969110770892e-01 -3.0378512832343469e+00 -1.2925114573142771e+00 7.9749939930054936e-01 2.5365083101190296e+00 1.3342474517727507e+00 7.7043769459802536e-01 4.1826808698186895e+00 1.6818016585447313e+00 -9.9211599567879460e-01 -4.2015936139318795e+00 -1.5383987730401421e+00 -6.4184154232346091e-01 -1.4461370073839106e+00 -1.9557033756350082e+00 8.6899931026917188e-01 1.3867114638373321e+00 1.6318707454827746e+00 6.4942722900166461e-01 1.5229148804704260e+00 2.3899117696450602e+00 -9.7294359354327919e-01 -1.4188429890933063e+00 -2.6954497428301791e+00 -5.8026533334235131e-01 -1.5724146594310775e+00 -2.2715127278896046e+00 7.9264842366440236e-01 1.3726065072007145e+00 2.5198838634788916e+00 7.2755181803358815e-01 1.6818016585447315e+00 3.9905385451401036e+00 -8.4357631175973424e-01 -1.5266398541449087e+00 -3.6095390773920384e+00 1.0403778258536847e+00 9.3495525584811134e-01 8.2706439391014375e-01 -1.3372094412887776e+00 -1.0752683651173283e+00 -7.4485614594922089e-01 -1.7298520640797959e+00 -1.1452150861603723e+00 -7.5200575581834317e-01 1.9693942696563882e+00 1.0675361493472146e+00 9.3471996871034713e-01 1.6136113921935873e+00 9.4499280614403114e-01 6.0856456303502870e-01 -1.9178288101463068e+00 -9.7927683252076769e-01 -9.2267003949004334e-01 -2.8804576329575440e+00 -9.9211599567879460e-01 -8.4357631175973413e-01 3.2419644607687634e+00 1.2443920681379053e+00 8.9275932736182173e-01 7.9852316833960879e-01 2.1436093488909940e+00 1.3553562460495054e+00 -1.1033088161999949e+00 -2.2327676342221676e+00 -1.1250107753126204e+00 -9.4711444134708489e-01 -3.1962194963818211e+00 -1.3201440091647787e+00 1.0877514958882502e+00 2.6872403309745030e+00 1.3342166820832535e+00 9.7837637966673219e-01 3.0404575887636773e+00 1.2364552986538015e+00 -1.0478978238280399e+00 -2.5737499111965065e+00 -1.3231681396985748e+00 -1.0107220306573779e+00 -4.2015936139318786e+00 -1.5266398541449087e+00 1.2443920681379053e+00 4.3330233871032009e+00 1.3689345515343219e+00 6.3918546933771259e-01 1.2136035832331280e+00 1.6130648557407230e+00 -7.7900931265073903e-01 -1.1466873606739800e+00 -1.4011424967876271e+00 -6.4654060335314634e-01 -1.3651317938269272e+00 -2.1124975895771936e+00 9.5154360869106125e-01 1.3298894972182760e+00 2.3307793780278465e+00 6.4906412461190910e-01 1.2698651789931210e+00 2.0028055194504710e+00 -8.4197108017475297e-01 -1.1320748834377978e+00 -2.2355014269440741e+00 -8.6503153382386722e-01 -1.5383987730401421e+00 -3.6095390773920375e+00 8.9275932736182162e-01 1.3689345515343219e+00 3.4120308374818924e+00 573 574 575 621 622 623 633 634 635 585 586 587 489 490 491 504 505 506 507 508 509 492 493 494 2.7116629238612480e+00 7.9384770242881242e-01 7.3559020863305502e-01 -2.8376281223406319e+00 -1.0257668137994389e+00 -8.5922752139247782e-01 -1.4602818567842646e+00 -7.8729290565767995e-01 -5.7170020357840179e-01 1.6258017136460381e+00 8.6521279988117883e-01 8.6171735060269006e-01 1.4405410516190293e+00 7.3687966861070364e-01 5.6473048366011325e-01 -1.6244789307643557e+00 -7.1321335363810079e-01 -7.3066803944450065e-01 -8.5381247469697474e-01 -6.3442238809911666e-01 -6.1236949697524146e-01 9.9819569545991271e-01 7.6475529027364142e-01 6.1192721849476261e-01 7.9384770242881264e-01 4.1197880692285791e+00 1.6400488314825157e+00 -1.0279202428660188e+00 -4.1084512690867978e+00 -1.4884601646458220e+00 -7.5209439553701052e-01 -3.0333551497411695e+00 -1.3778144036140596e+00 8.8317210210112318e-01 2.5270035943546900e+00 1.4216032237647331e+00 7.0437397233407784e-01 2.9352452536110527e+00 1.4004564492281115e+00 -8.9244166944717984e-01 -2.4640434388768355e+00 -1.3574874547681701e+00 -6.1342591250776013e-01 -2.0450974978414203e+00 -1.4056640908900411e+00 9.0448844349395741e-01 2.0689104383519017e+00 1.1673176094427313e+00 7.3559020863305502e-01 1.6400488314825157e+00 3.8775605535696638e+00 -8.5279321746364445e-01 -1.4730103801433649e+00 -3.4593507431253743e+00 -6.2483746853726418e-01 -1.5872530778328238e+00 -2.2809085984563358e+00 8.5812069761686793e-01 1.3915745382147446e+00 2.5420520506093136e+00 5.2515043998188904e-01 1.3656074315812414e+00 2.1684263255765810e+00 -8.6986793452354749e-01 -1.2835018987918991e+00 -2.4960071802209214e+00 -5.7539929470839435e-01 -1.3661065944428761e+00 -1.9045617861229227e+00 8.0403656900103937e-01 1.3126411499324628e+00 1.5527893781699940e+00 -2.8376281223406319e+00 -1.0279202428660188e+00 -8.5279321746364434e-01 3.1894250304191378e+00 1.2726943853770929e+00 8.8195619302864015e-01 1.6540453014721528e+00 1.0413422362857840e+00 7.0234211863089402e-01 -1.9646386699451333e+00 -1.0437104590592647e+00 -1.0057063406684508e+00 -1.6313633137876877e+00 -1.1049065824947752e+00 -6.8086860417497896e-01 1.8841997419003025e+00 1.0144925497715302e+00 8.6028011440663565e-01 1.0109880598584313e+00 9.2681530782409582e-01 8.4809879333618365e-01 -1.3050280275765724e+00 -1.0788071948384443e+00 -7.5330905709527840e-01 -1.0257668137994389e+00 -4.1084512690867978e+00 -1.4730103801433645e+00 1.2726943853770929e+00 4.2131025301696852e+00 1.3061558626724192e+00 1.0339147402867757e+00 3.0724235846878081e+00 1.3118624347829162e+00 -1.1229039143221149e+00 -2.5850256307524244e+00 -1.4042306003087863e+00 -8.3144824432965247e-01 -3.0553166754896717e+00 -1.1657446247986571e+00 9.7871091988921644e-01 2.5292896623510797e+00 1.1790703311169786e+00 7.4012110081138172e-01 2.0923803219136707e+00 1.3419243839483119e+00 -1.0453221739132621e+00 -2.1584025237933511e+00 -1.0960274072698166e+00 -8.5922752139247760e-01 -1.4884601646458218e+00 -3.4593507431253743e+00 8.8195619302864003e-01 1.3061558626724188e+00 3.2348414566544328e+00 6.7463139333789657e-01 1.2731866024823202e+00 2.0086544874550682e+00 -8.8696796209809092e-01 -1.1449968811003721e+00 -2.2367925172922121e+00 -5.3354533231044365e-01 -1.2364867984281305e+00 -1.9382208310103921e+00 8.5898105876417152e-01 1.2235465340801894e+00 2.1589643940150598e+00 5.8312372097646770e-01 1.1466661934023947e+00 1.5724249671580253e+00 -7.1895155030616442e-01 -1.0796113484629990e+00 -1.3405212138546061e+00 -1.4602818567842646e+00 -7.5209439553701052e-01 -6.2483746853726407e-01 1.6540453014721528e+00 1.0339147402867757e+00 6.7463139333789657e-01 2.7042620845001091e+00 9.6620981391725869e-01 6.3544566490001908e-01 -2.8483045234060000e+00 -1.0802899321492205e+00 -8.6941841157080380e-01 -8.7009994651615341e-01 -7.7706083718827190e-01 -4.6722675278051412e-01 1.0097996042058235e+00 7.4730428847109254e-01 6.4783106782048983e-01 1.4684979505982125e+00 7.7309325472308144e-01 6.1655964377156902e-01 -1.6579186140698812e+00 -9.1107693252370536e-01 -6.1298513694139167e-01 -7.8729290565767995e-01 -3.0333551497411695e+00 -1.5872530778328238e+00 1.0413422362857838e+00 3.0724235846878081e+00 1.2731866024823202e+00 9.6620981391725846e-01 4.7493570688043869e+00 1.5882143038070611e+00 -1.1179257939954881e+00 -4.1039491258545624e+00 -1.6093634244145121e+00 -7.1015367280053665e-01 -2.6158056093795290e+00 -1.2181485935007710e+00 9.8838256488340626e-01 2.0260943259774158e+00 1.3872130394957780e+00 7.3268934239456918e-01 2.9973225420977521e+00 1.4760810079482654e+00 -1.1132515850273152e+00 -3.0920876365921011e+00 -1.3099298579853162e+00 -5.7170020357840190e-01 -1.3778144036140596e+00 -2.2809085984563353e+00 7.0234211863089402e-01 1.3118624347829162e+00 2.0086544874550678e+00 6.3544566490001908e-01 1.5882143038070609e+00 3.3575641697131884e+00 -8.7960191930845411e-01 -1.5722249339588588e+00 -3.5584755279550340e+00 -4.5300552353826790e-01 -1.2924706477689138e+00 -1.3769364032521445e+00 7.0382522164261174e-01 1.1311572701338164e+00 1.5699293664130192e+00 5.8455082678852277e-01 1.4803757004289748e+00 2.2967920385781255e+00 -7.2185618553692499e-01 -1.2690997238109361e+00 -2.0166195324958860e+00 1.6258017136460381e+00 8.8317210210112318e-01 8.5812069761686793e-01 -1.9646386699451335e+00 -1.1229039143221149e+00 -8.8696796209809092e-01 -2.8483045234060005e+00 -1.1179257939954883e+00 -8.7960191930845433e-01 3.2473576112410285e+00 1.1071360869069740e+00 1.1934615026912672e+00 9.6847998625039755e-01 1.0326654229711827e+00 6.9073510111495484e-01 -1.2989378072867390e+00 -8.7920363132961810e-01 -9.5145087444254495e-01 -1.6363603021963531e+00 -9.5987701729912933e-01 -9.5034387975583845e-01 1.9066019916967614e+00 1.0569367449670710e+00 9.2604733418183738e-01 8.6521279988117905e-01 2.5270035943546900e+00 1.3915745382147446e+00 -1.0437104590592647e+00 -2.5850256307524249e+00 -1.1449968811003721e+00 -1.0802899321492205e+00 -4.1039491258545633e+00 -1.5722249339588585e+00 1.1071360869069737e+00 3.7570035316108816e+00 1.4956464030408207e+00 7.0788662138568059e-01 2.0233106833189205e+00 1.0930670994041276e+00 -8.6846632638401067e-01 -1.6715086131108146e+00 -1.1708461677599473e+00 -7.2149820996620251e-01 -2.5215027419925762e+00 -1.3706050830829732e+00 1.0337294193848663e+00 2.5746683024258865e+00 1.2783850252424571e+00 8.6171735060269006e-01 1.4216032237647331e+00 2.5420520506093141e+00 -1.0057063406684508e+00 -1.4042306003087861e+00 -2.2367925172922121e+00 -8.6941841157080391e-01 -1.6093634244145121e+00 -3.5584755279550344e+00 1.1934615026912674e+00 1.4956464030408207e+00 3.9727930060671537e+00 6.1601943905566581e-01 1.4368549488822429e+00 1.5266672428585095e+00 -9.4694261514149924e-01 -1.1796954072373891e+00 -1.8719596283066329e+00 -7.5752591940888914e-01 -1.4461669531502155e+00 -2.6131967353141432e+00 9.0839499444002192e-01 1.2853518094231062e+00 2.2389121093330453e+00 1.4405410516190293e+00 7.0437397233407761e-01 5.2515043998188915e-01 -1.6313633137876877e+00 -8.3144824432965236e-01 -5.3354533231044365e-01 -8.7009994651615352e-01 -7.1015367280053665e-01 -4.5300552353826801e-01 9.6847998625039766e-01 7.0788662138568059e-01 6.1601943905566592e-01 2.7622989963548967e+00 8.3138200543062524e-01 5.1501280387965132e-01 -2.8123988029217601e+00 -1.0100814787935168e+00 -7.4266693607440681e-01 -1.4443095458346398e+00 -6.5074730019876703e-01 -5.5469529578867005e-01 1.5868515748359169e+00 9.5878809697208967e-01 6.2773040479458198e-01 7.3687966861070364e-01 2.9352452536110527e+00 1.3656074315812414e+00 -1.1049065824947752e+00 -3.0553166754896721e+00 -1.2364867984281305e+00 -7.7706083718827190e-01 -2.6158056093795290e+00 -1.2924706477689138e+00 1.0326654229711827e+00 2.0233106833189201e+00 1.4368549488822429e+00 8.3138200543062535e-01 4.7497285009560581e+00 1.4116917532643429e+00 -9.2317603542057802e-01 -4.0408375851818139e+00 -1.3753212541790607e+00 -7.0716874635519111e-01 -2.9792945727303204e+00 -1.5323596576153795e+00 9.1138510444630649e-01 2.9829700048953058e+00 1.2224842242636556e+00 5.6473048366011325e-01 1.4004564492281115e+00 2.1684263255765810e+00 -6.8086860417497896e-01 -1.1657446247986569e+00 -1.9382208310103921e+00 -4.6722675278051412e-01 -1.2181485935007710e+00 -1.3769364032521445e+00 6.9073510111495495e-01 1.0930670994041276e+00 1.5266672428585095e+00 5.1501280387965132e-01 1.4116917532643429e+00 3.3302155631799817e+00 -7.2064334469025937e-01 -1.4640920714416312e+00 -3.4373322116585556e+00 -4.8234459151440795e-01 -1.2516926782481339e+00 -2.2278549445286826e+00 5.8060490450544200e-01 1.1944626660926119e+00 1.9550352588347015e+00 -1.6244789307643557e+00 -8.9244166944717984e-01 -8.6986793452354749e-01 1.8841997419003025e+00 9.7871091988921655e-01 8.5898105876417141e-01 1.0097996042058237e+00 9.8838256488340626e-01 7.0382522164261185e-01 -1.2989378072867390e+00 -8.6846632638401078e-01 -9.4694261514149936e-01 -2.8123988029217601e+00 -9.2317603542057769e-01 -7.2064334469025937e-01 3.1462243273894654e+00 9.7558269525123009e-01 1.0274173866564882e+00 1.5947735928010265e+00 7.6402761665245766e-01 7.6732197933740354e-01 -1.8991817253237646e+00 -1.0226197654245428e+00 -8.2009175204536799e-01 -7.1321335363810079e-01 -2.4640434388768355e+00 -1.2835018987918994e+00 1.0144925497715302e+00 2.5292896623510797e+00 1.2235465340801894e+00 7.4730428847109254e-01 2.0260943259774158e+00 1.1311572701338166e+00 -8.7920363132961810e-01 -1.6715086131108146e+00 -1.1796954072373891e+00 -1.0100814787935171e+00 -4.0408375851818139e+00 -1.4640920714416312e+00 9.7558269525123031e-01 3.6613319354334020e+00 1.3284840586083571e+00 8.1702722217472745e-01 2.4736494427961815e+00 1.3336732789691799e+00 -9.5190829190734616e-01 -2.5139757293886156e+00 -1.0895717643206220e+00 -7.3066803944450065e-01 -1.3574874547681701e+00 -2.4960071802209214e+00 8.6028011440663588e-01 1.1790703311169788e+00 2.1589643940150594e+00 6.4783106782048983e-01 1.3872130394957778e+00 1.5699293664130192e+00 -9.5145087444254484e-01 -1.1708461677599473e+00 -1.8719596283066329e+00 -7.4266693607440715e-01 -1.3753212541790605e+00 -3.4373322116585552e+00 1.0274173866564882e+00 1.3284840586083575e+00 3.7863637191548785e+00 7.9187250351257821e-01 1.2915626550626933e+00 2.4827667914742930e+00 -9.0261522243474079e-01 -1.2826752075766299e+00 -2.1927252508711392e+00 -8.5381247469697474e-01 -6.1342591250776013e-01 -5.7539929470839435e-01 1.0109880598584311e+00 7.4012110081138172e-01 5.8312372097646781e-01 1.4684979505982125e+00 7.3268934239456918e-01 5.8455082678852277e-01 -1.6363603021963531e+00 -7.2149820996620251e-01 -7.5752591940888903e-01 -1.4443095458346398e+00 -7.0716874635519111e-01 -4.8234459151440795e-01 1.5947735928010265e+00 8.1702722217472756e-01 7.9187250351257810e-01 2.6940664426210681e+00 7.3732200234783962e-01 7.0078116171111327e-01 -2.8338437231507712e+00 -9.8506679889936433e-01 -8.4505840735698967e-01 -6.3442238809911655e-01 -2.0450974978414203e+00 -1.3661065944428761e+00 9.2681530782409582e-01 2.0923803219136707e+00 1.1466661934023947e+00 7.7309325472308144e-01 2.9973225420977521e+00 1.4803757004289746e+00 -9.5987701729912922e-01 -2.5215027419925762e+00 -1.4461669531502153e+00 -6.5074730019876703e-01 -2.9792945727303204e+00 -1.2516926782481339e+00 7.6402761665245766e-01 2.4736494427961815e+00 1.2915626550626933e+00 7.3732200234783940e-01 4.1003675196989704e+00 1.6379728142991441e+00 -9.5621147595046285e-01 -4.1178250139422587e+00 -1.4926111373519801e+00 -6.1236949697524135e-01 -1.4056640908900411e+00 -1.9045617861229227e+00 8.4809879333618354e-01 1.3419243839483119e+00 1.5724249671580257e+00 6.1655964377156902e-01 1.4760810079482656e+00 2.2967920385781255e+00 -9.5034387975583845e-01 -1.3706050830829730e+00 -2.6131967353141432e+00 -5.5469529578866994e-01 -1.5323596576153795e+00 -2.2278549445286826e+00 7.6732197933740354e-01 1.3336732789691799e+00 2.4827667914742935e+00 7.0078116171111327e-01 1.6379728142991445e+00 3.9351823922624041e+00 -8.1535290563652119e-01 -1.4810226535765088e+00 -3.5415527235070989e+00 9.9819569545991271e-01 9.0448844349395752e-01 8.0403656900103948e-01 -1.3050280275765724e+00 -1.0453221739132621e+00 -7.1895155030616431e-01 -1.6579186140698812e+00 -1.1132515850273152e+00 -7.2185618553692499e-01 1.9066019916967614e+00 1.0337294193848663e+00 9.0839499444002181e-01 1.5868515748359169e+00 9.1138510444630638e-01 5.8060490450544200e-01 -1.8991817253237651e+00 -9.5190829190734616e-01 -9.0261522243474079e-01 -2.8338437231507712e+00 -9.5621147595046296e-01 -8.1535290563652107e-01 3.2043228281284000e+00 1.2170905594732568e+00 8.6573939596784721e-01 7.6475529027364131e-01 2.0689104383519012e+00 1.3126411499324626e+00 -1.0788071948384443e+00 -2.1584025237933511e+00 -1.0796113484629988e+00 -9.1107693252370536e-01 -3.0920876365921011e+00 -1.2690997238109363e+00 1.0569367449670710e+00 2.5746683024258865e+00 1.2853518094231062e+00 9.5878809697208978e-01 2.9829700048953058e+00 1.1944626660926119e+00 -1.0226197654245426e+00 -2.5139757293886151e+00 -1.2826752075766299e+00 -9.8506679889936444e-01 -4.1178250139422587e+00 -1.4810226535765085e+00 1.2170905594732568e+00 4.2557421580432333e+00 1.3199533079788919e+00 6.1192721849476261e-01 1.1673176094427313e+00 1.5527893781699940e+00 -7.5330905709527840e-01 -1.0960274072698166e+00 -1.3405212138546061e+00 -6.1298513694139167e-01 -1.3099298579853165e+00 -2.0166195324958860e+00 9.2604733418183738e-01 1.2783850252424573e+00 2.2389121093330453e+00 6.2773040479458198e-01 1.2224842242636556e+00 1.9550352588347018e+00 -8.2009175204536822e-01 -1.0895717643206220e+00 -2.1927252508711392e+00 -8.4505840735698989e-01 -1.4926111373519801e+00 -3.5415527235070989e+00 8.6573939596784710e-01 1.3199533079788921e+00 3.3446819743909888e+00 537 538 539 585 586 587 597 598 599 549 550 551 474 475 476 492 493 494 495 496 497 477 478 479 2.8316615782673460e+00 4.7996178890013774e-01 4.4188710575238332e-01 -2.8698973337039759e+00 -7.5656652579622874e-01 -6.4321062825701592e-01 -1.4210328753458861e+00 -4.4917771710531584e-01 -3.3623413643435185e-01 1.5022588180392360e+00 6.4591077122977547e-01 6.1630020959972476e-01 1.3868800522383737e+00 4.3488722231248933e-01 3.4278557062843995e-01 -1.4949768778569468e+00 -5.0608117876404468e-01 -4.9384984919095731e-01 -7.3426805379296556e-01 -3.6792918827215049e-01 -3.5094254516254508e-01 7.9937469215481938e-01 5.1899482749533687e-01 4.2326427306432213e-01 4.7996178890013780e-01 4.9167496097202505e+00 2.0265338485337114e+00 -7.4963581792264933e-01 -4.9909821595302564e+00 -1.9090698522627543e+00 -4.3181167908518026e-01 -3.5960903732134670e+00 -1.6970553565211248e+00 6.4723918151478554e-01 3.1534584983310485e+00 1.7781157072987863e+00 4.0558600843361903e-01 3.4500090976083526e+00 1.7238243691578463e+00 -7.0038823962970820e-01 -3.0320578803494707e+00 -1.7006605210044008e+00 -3.4518254262111525e-01 -2.4437423223285699e+00 -1.6940892479236287e+00 6.9423130041011005e-01 2.5426555297621105e+00 1.4724010527215645e+00 4.4188710575238332e-01 2.0265338485337110e+00 4.6001345177304245e+00 -6.3363297448417510e-01 -1.8964135754873601e+00 -4.1713922673638093e+00 -3.6368776044285950e-01 -1.9241246066449005e+00 -2.7566413420066218e+00 6.0959715086155253e-01 1.7620611391733185e+00 3.0192516869298016e+00 3.1305895513984222e-01 1.6916750646660055e+00 2.6157517777490842e+00 -6.6780811754918878e-01 -1.6548216413823085e+00 -2.9454435924109759e+00 -3.2352186240766140e-01 -1.6644401211948869e+00 -2.2473618971944003e+00 6.2410750313010599e-01 1.6595298923364199e+00 1.8857011165664967e+00 -2.8698973337039759e+00 -7.4963581792264933e-01 -6.3363297448417499e-01 3.1463047982773120e+00 1.0603020121674556e+00 7.4322874465236710e-01 1.5232647097558405e+00 7.4981377328423493e-01 5.1830615291454052e-01 -1.7662034862088407e+00 -8.9403540275831017e-01 -8.1008360553453351e-01 -1.4971319078196972e+00 -8.2971111575790668e-01 -5.4587388675086612e-01 1.6984611868516712e+00 8.5449782483610703e-01 7.0920623906812519e-01 8.1112458693457401e-01 7.0330650581032983e-01 6.4575259773267679e-01 -1.0459225540868828e+00 -8.9453777965926062e-01 -6.2690326759813497e-01 -7.5656652579622874e-01 -4.9909821595302555e+00 -1.8964135754873603e+00 1.0603020121674553e+00 5.1882123813397971e+00 1.7504922913043681e+00 7.4914859707225023e-01 3.7323103539699227e+00 1.6695724722987266e+00 -9.4378787935196973e-01 -3.2983017129998653e+00 -1.7946111760978438e+00 -5.6648179533658116e-01 -3.6510472916813015e+00 -1.5379744490866261e+00 8.4098544266268704e-01 3.1772659583341647e+00 1.5652352437130990e+00 4.9445722492918953e-01 2.5665133621996148e+00 1.6849382336012162e+00 -8.7805707634680186e-01 -2.7239708916320753e+00 -1.4412390402455801e+00 -6.4321062825701580e-01 -1.9090698522627538e+00 -4.1713922673638102e+00 7.4322874465236721e-01 1.7504922913043681e+00 3.9239576831841498e+00 5.0806976598796871e-01 1.6427676174320127e+00 2.4705969486583714e+00 -7.3388316921469110e-01 -1.5349334824273284e+00 -2.7137464121170991e+00 -3.7593574879768632e-01 -1.5765296819665919e+00 -2.3602352315460875e+00 7.1039693420021421e-01 1.5959234416183823e+00 2.6047481489362014e+00 4.0156130573323240e-01 1.4605804767406860e+00 1.9112274964585019e+00 -6.1022720430438848e-01 -1.4292308104387736e+00 -1.6651563662102289e+00 -1.4210328753458861e+00 -4.3181167908518020e-01 -3.6368776044285950e-01 1.5232647097558405e+00 7.4914859707225023e-01 5.0806976598796860e-01 2.8030722803572363e+00 5.6593684700999580e-01 3.8957563766798142e-01 -2.8695964003988892e+00 -7.9761493920097470e-01 -6.2015191912956491e-01 -7.4355322380298372e-01 -4.4018322373934093e-01 -2.8555648878469070e-01 8.1639153067484949e-01 5.2288760612235985e-01 4.3149560992426078e-01 1.4000018680126383e+00 4.4805147629751441e-01 3.6320461865506976e-01 -1.5085478892528053e+00 -6.1641468447662429e-01 -4.2294946387816573e-01 -4.4917771710531584e-01 -3.5960903732134675e+00 -1.9241246066449003e+00 7.4981377328423493e-01 3.7323103539699227e+00 1.6427676174320125e+00 5.6593684700999580e-01 5.5558660008244471e+00 1.9571627896683521e+00 -8.1130790538817232e-01 -5.0097072096265718e+00 -1.9903070680053248e+00 -3.9631885883305085e-01 -3.0224107660885808e+00 -1.5332346070079028e+00 7.6295771443037985e-01 2.5266455424048546e+00 1.7092267923450393e+00 4.1568111617218029e-01 3.5034480557501300e+00 1.7776758160292465e+00 -8.3758496957025130e-01 -3.6900616040207335e+00 -1.6391667338165221e+00 -3.3623413643435185e-01 -1.6970553565211248e+00 -2.7566413420066218e+00 5.1830615291454052e-01 1.6695724722987266e+00 2.4705969486583710e+00 3.8957563766798142e-01 1.9571627896683521e+00 4.0275170691810454e+00 -6.2616945749659081e-01 -1.9743436371948566e+00 -4.2480818182999487e+00 -2.6474129893678244e-01 -1.5794556408545120e+00 -1.6991673624072887e+00 5.4452740730538873e-01 1.4487123907282211e+00 1.9123500087892089e+00 3.3761765915782127e-01 1.7839154428377118e+00 2.7157127499570111e+00 -5.6288196417800618e-01 -1.6085084609625173e+00 -2.4222862538717775e+00 1.5022588180392358e+00 6.4723918151478554e-01 6.0959715086155253e-01 -1.7662034862088407e+00 -9.4378787935196973e-01 -7.3388316921469110e-01 -2.8695964003988896e+00 -8.1130790538817232e-01 -6.2616945749659081e-01 3.1849444928396387e+00 9.3969284880610648e-01 9.3509944848701154e-01 7.8111434878161168e-01 7.7741747452289856e-01 5.3568346646471177e-01 -1.0408256129952527e+00 -7.5600502690089788e-01 -7.6001086683014019e-01 -1.4899524804108459e+00 -7.2902207360940918e-01 -7.0058362779606109e-01 1.6982603203533424e+00 8.7577338040665775e-01 7.4026705552420768e-01 6.4591077122977547e-01 3.1534584983310485e+00 1.7620611391733185e+00 -8.9403540275831017e-01 -3.2983017129998653e+00 -1.5349334824273286e+00 -7.9761493920097470e-01 -5.0097072096265700e+00 -1.9743436371948568e+00 9.3969284880610671e-01 4.6836793992094918e+00 1.9366360087163526e+00 4.9099465971537026e-01 2.5220369210863112e+00 1.4245109892009418e+00 -7.5811810693355364e-01 -2.1896787620179419e+00 -1.5355649578532111e+00 -4.9688791595482340e-01 -3.0863969894736907e+00 -1.7245437731403552e+00 8.7005808509640892e-01 3.2249098554912168e+00 1.6461777135251385e+00 6.1630020959972476e-01 1.7781157072987863e+00 3.0192516869298016e+00 -8.1008360553453351e-01 -1.7946111760978438e+00 -2.7137464121170991e+00 -6.2015191912956480e-01 -1.9903070680053248e+00 -4.2480818182999496e+00 9.3509944848701154e-01 1.9366360087163528e+00 4.6525094409271430e+00 4.0175317006024097e-01 1.7345996196759699e+00 1.8731542813468141e+00 -7.6151408599685366e-01 -1.5343176920165402e+00 -2.2114311702891429e+00 -4.9213542575555458e-01 -1.7691427780708260e+00 -3.0293553421139578e+00 7.3073220826952867e-01 1.6390273784994249e+00 2.6576993336163914e+00 1.3868800522383735e+00 4.0558600843361908e-01 3.1305895513984217e-01 -1.4971319078196970e+00 -5.6648179533658105e-01 -3.7593574879768632e-01 -7.4355322380298372e-01 -3.9631885883305085e-01 -2.6474129893678239e-01 7.8111434878161146e-01 4.9099465971537026e-01 4.0175317006024097e-01 2.7578408121693605e+00 4.7293265819569025e-01 3.1520437870364065e-01 -2.7507780621110345e+00 -7.3767063118749299e-01 -5.4696934797801577e-01 -1.3673995803006833e+00 -3.5983580158387796e-01 -3.1112563583753655e-01 1.4330275608450529e+00 6.9079376059632291e-01 4.6875552764629741e-01 4.3488722231248933e-01 3.4500090976083526e+00 1.6916750646660055e+00 -8.2971111575790657e-01 -3.6510472916813019e+00 -1.5765296819665924e+00 -4.4018322373934093e-01 -3.0224107660885808e+00 -1.5794556408545117e+00 7.7741747452289856e-01 2.5220369210863112e+00 1.7345996196759699e+00 4.7293265819569025e-01 5.3366844894955952e+00 1.7643692198677221e+00 -6.8212305413298413e-01 -4.7354292544827317e+00 -1.7564343264381812e+00 -3.8507487191292289e-01 -3.4186745540013010e+00 -1.8252328411928458e+00 6.5185491051207545e-01 3.5188313580636534e+00 1.5470085862424341e+00 3.4278557062843990e-01 1.7238243691578465e+00 2.6157517777490842e+00 -5.4587388675086612e-01 -1.5379744490866261e+00 -2.3602352315460875e+00 -2.8555648878469070e-01 -1.5332346070079028e+00 -1.6991673624072887e+00 5.3568346646471177e-01 1.4245109892009415e+00 1.8731542813468138e+00 3.1520437870364054e-01 1.7643692198677223e+00 3.8414738299249427e+00 -5.2128019250818092e-01 -1.8179227424898770e+00 -3.9829485951970773e+00 -2.7580050035037990e-01 -1.5501717260212187e+00 -2.6134628539317024e+00 4.3483765259732482e-01 1.5265989463791132e+00 2.3254341540613135e+00 -1.4949768778569468e+00 -7.0038823962970831e-01 -6.6780811754918878e-01 1.6984611868516712e+00 8.4098544266268704e-01 7.1039693420021410e-01 8.1639153067484937e-01 7.6295771443037974e-01 5.4452740730538873e-01 -1.0408256129952527e+00 -7.5811810693355364e-01 -7.6151408599685366e-01 -2.7507780621110345e+00 -6.8212305413298424e-01 -5.2128019250818114e-01 3.0166190764546283e+00 8.4038325983166295e-01 8.3191759365965856e-01 1.4407701416336596e+00 5.6582610941454159e-01 5.4456712906937332e-01 -1.6856613826515761e+00 -8.6952312564302492e-01 -6.8080666818041147e-01 -5.0608117876404468e-01 -3.0320578803494711e+00 -1.6548216413823085e+00 8.5449782483610692e-01 3.1772659583341651e+00 1.5959234416183823e+00 5.2288760612235985e-01 2.5266455424048546e+00 1.4487123907282211e+00 -7.5600502690089788e-01 -2.1896787620179419e+00 -1.5343176920165402e+00 -7.3767063118749299e-01 -4.7354292544827326e+00 -1.8179227424898767e+00 8.4038325983166295e-01 4.3764654899272637e+00 1.7377929806452359e+00 6.0058806503117768e-01 2.9862280559998520e+00 1.6570808411727473e+00 -8.1859991896887185e-01 -3.1094391498159890e+00 -1.4324475782758606e+00 -4.9384984919095737e-01 -1.7006605210044006e+00 -2.9454435924109759e+00 7.0920623906812508e-01 1.5652352437130987e+00 2.6047481489362014e+00 4.3149560992426073e-01 1.7092267923450390e+00 1.9123500087892089e+00 -7.6001086683014019e-01 -1.5355649578532111e+00 -2.2114311702891429e+00 -5.4696934797801577e-01 -1.7564343264381812e+00 -3.9829485951970764e+00 8.3191759365965856e-01 1.7377929806452357e+00 4.3277769493366751e+00 5.6804452421623186e-01 1.6342016677466580e+00 2.8723886514570478e+00 -7.3983390286916251e-01 -1.6537968791542368e+00 -2.5774404006219389e+00 -7.3426805379296556e-01 -3.4518254262111531e-01 -3.2352186240766140e-01 8.1112458693457401e-01 4.9445722492918953e-01 4.0156130573323240e-01 1.4000018680126383e+00 4.1568111617218034e-01 3.3761765915782127e-01 -1.4899524804108459e+00 -4.9688791595482340e-01 -4.9213542575555452e-01 -1.3673995803006833e+00 -3.8507487191292283e-01 -2.7580050035037990e-01 1.4407701416336596e+00 6.0058806503117768e-01 5.6804452421623186e-01 2.6961701583959985e+00 4.2209052567210936e-01 3.9593097626333568e-01 -2.7564466404723751e+00 -7.0567160131579509e-01 -6.1169667685702533e-01 -3.6792918827215049e-01 -2.4437423223285699e+00 -1.6644401211948869e+00 7.0330650581032983e-01 2.5665133621996148e+00 1.4605804767406860e+00 4.4805147629751441e-01 3.5034480557501300e+00 1.7839154428377120e+00 -7.2902207360940907e-01 -3.0863969894736907e+00 -1.7691427780708260e+00 -3.5983580158387796e-01 -3.4186745540013006e+00 -1.5501717260212187e+00 5.6582610941454148e-01 2.9862280559998520e+00 1.6342016677466580e+00 4.2209052567210936e-01 4.6925332836388289e+00 1.9584178582595784e+00 -6.8248755372905701e-01 -4.7999088917848631e+00 -1.8533608202977025e+00 -3.5094254516254508e-01 -1.6940892479236285e+00 -2.2473618971944003e+00 6.4575259773267679e-01 1.6849382336012162e+00 1.9112274964585017e+00 3.6320461865506981e-01 1.7776758160292465e+00 2.7157127499570111e+00 -7.0058362779606109e-01 -1.7245437731403550e+00 -3.0293553421139583e+00 -3.1112563583753650e-01 -1.8252328411928458e+00 -2.6134628539317024e+00 5.4456712906937321e-01 1.6570808411727473e+00 2.8723886514570474e+00 3.9593097626333557e-01 1.9584178582595781e+00 4.4506388695552062e+00 -5.8680351292431210e-01 -1.8342468868059580e+00 -4.0597876741877048e+00 7.9937469215481938e-01 6.9423130041011016e-01 6.2410750313010599e-01 -1.0459225540868828e+00 -8.7805707634680186e-01 -6.1022720430438848e-01 -1.5085478892528053e+00 -8.3758496957025119e-01 -5.6288196417800629e-01 1.6982603203533424e+00 8.7005808509640892e-01 7.3073220826952867e-01 1.4330275608450529e+00 6.5185491051207545e-01 4.3483765259732493e-01 -1.6856613826515758e+00 -8.1859991896887174e-01 -7.3983390286916251e-01 -2.7564466404723751e+00 -6.8248755372905701e-01 -5.8680351292431210e-01 3.0659158931104242e+00 1.0005852225963869e+00 7.1006922027891006e-01 5.1899482749533687e-01 2.5426555297621101e+00 1.6595298923364199e+00 -8.9453777965926073e-01 -2.7239708916320757e+00 -1.4292308104387736e+00 -6.1641468447662429e-01 -3.6900616040207330e+00 -1.6085084609625169e+00 8.7577338040665775e-01 3.2249098554912168e+00 1.6390273784994249e+00 6.9079376059632291e-01 3.5188313580636539e+00 1.5265989463791132e+00 -8.6952312564302503e-01 -3.1094391498159890e+00 -1.6537968791542372e+00 -7.0567160131579532e-01 -4.7999088917848622e+00 -1.8342468868059580e+00 1.0005852225963869e+00 5.0369837939366775e+00 1.7006268201465282e+00 4.2326427306432224e-01 1.4724010527215645e+00 1.8857011165664967e+00 -6.2690326759813486e-01 -1.4412390402455804e+00 -1.6651563662102291e+00 -4.2294946387816579e-01 -1.6391667338165223e+00 -2.4222862538717775e+00 7.4026705552420757e-01 1.6461777135251385e+00 2.6576993336163914e+00 4.6875552764629741e-01 1.5470085862424341e+00 2.3254341540613135e+00 -6.8080666818041147e-01 -1.4324475782758606e+00 -2.5774404006219389e+00 -6.1169667685702522e-01 -1.8533608202977030e+00 -4.0597876741877048e+00 7.1006922027890995e-01 1.7006268201465280e+00 3.8558360906474500e+00 585 586 587 633 634 635 645 646 647 597 598 599 492 493 494 507 508 509 510 511 512 495 496 497 2.6397311969370092e+00 4.4050484425408731e-01 4.0865926334416475e-01 -2.6701630631182383e+00 -7.1577533160787365e-01 -6.1196483340946528e-01 -1.3226127858852943e+00 -4.1427173468616779e-01 -3.0783720105895807e-01 1.4014821242866200e+00 6.1205254792591512e-01 5.8913508192390707e-01 1.3251998144449220e+00 4.0281296089799357e-01 3.1749287771398788e-01 -1.4323726985440584e+00 -4.7740025805784270e-01 -4.7143690409527572e-01 -7.0288848431358208e-01 -3.3850071703020496e-01 -3.2602086899531196e-01 7.6162389619262316e-01 4.9057768830409321e-01 4.0197258457695140e-01 4.4050484425408731e-01 4.6308504441512861e+00 1.9439500105196124e+00 -7.1998074357154740e-01 -4.6983108279096006e+00 -1.8212566947954807e+00 -3.9648683912977162e-01 -3.4213206606455921e+00 -1.6227206258052789e+00 6.2385280006091237e-01 2.9735429573603986e+00 1.7071966278261277e+00 3.7883373645929058e-01 3.3187996173147485e+00 1.6627675793371639e+00 -6.7537534681345923e-01 -2.8999375060785977e+00 -1.6422924993981864e+00 -3.2052161866650741e-01 -2.3452201476020864e+00 -1.6379667719746436e+00 6.6917316740699562e-01 2.4415961234094445e+00 1.4103223742906856e+00 4.0865926334416491e-01 1.9439500105196124e+00 4.3579719730115540e+00 -6.1267676651571801e-01 -1.8122469237574561e+00 -3.9142598594254645e+00 -3.3522760867769535e-01 -1.8575730501776553e+00 -2.6087659825058256e+00 5.9176299847372105e-01 1.6901107806334745e+00 2.8781830889240752e+00 2.9207641726823075e-01 1.6293365845149701e+00 2.5100291059305073e+00 -6.4843736963731469e-01 -1.5895077398302269e+00 -2.8499507169550631e+00 -3.0254886442784606e-01 -1.6052950503313441e+00 -2.1817546168113515e+00 6.0639193017245752e-01 1.6012253884286252e+00 1.8085470078315682e+00 -2.6701630631182378e+00 -7.1998074357154740e-01 -6.1267676651571801e-01 2.9583301586435753e+00 1.0312868193821605e+00 7.1620243694936114e-01 1.4202915205955084e+00 7.2787112636557927e-01 4.9752827513428854e-01 -1.6749733423245039e+00 -8.6823870246028412e-01 -7.9199789291685962e-01 -1.4347389370738874e+00 -8.0945220951655628e-01 -5.2537815565533064e-01 1.6418425766942635e+00 8.3370858787202085e-01 6.9326343468184626e-01 7.7662288492818432e-01 6.8171222510226470e-01 6.3127778123436906e-01 -1.0172117983449023e+00 -8.7690710317363751e-01 -6.0821911291195707e-01 -7.1577533160787388e-01 -4.6983108279096015e+00 -1.8122469237574561e+00 1.0312868193821603e+00 4.8974528877145458e+00 1.6594348363929929e+00 7.1484699716490274e-01 3.5547375921078084e+00 1.5920274562641226e+00 -9.1986115968809457e-01 -3.1169705340461942e+00 -1.7234230614894122e+00 -5.4205631933815879e-01 -3.5208209594988049e+00 -1.4673951411783255e+00 8.1604817747840719e-01 3.0428590347806903e+00 1.5007878604254301e+00 4.7094056498706399e-01 2.4649509893525945e+00 1.6251654185307436e+00 -8.5542974837840746e-01 -2.6238981825010388e+00 -1.3743504451880966e+00 -6.1196483340946539e-01 -1.8212566947954807e+00 -3.9142598594254649e+00 7.1620243694936125e-01 1.6594348363929932e+00 3.6661649502234255e+00 4.7924353884732795e-01 1.5673702423151121e+00 2.3162654687786097e+00 -7.1311589112820228e-01 -1.4583495783069584e+00 -2.5642143596704288e+00 -3.5603845026845693e-01 -1.5113724098991053e+00 -2.2501572245486940e+00 6.9117108473813715e-01 1.5318160402409977e+00 2.4978826622596477e+00 3.8414046932909512e-01 1.3982347134337896e+00 1.8338441199002196e+00 -5.8963835505779694e-01 -1.3658771493813486e+00 -1.5855257575173154e+00 -1.3226127858852943e+00 -3.9648683912977167e-01 -3.3522760867769541e-01 1.4202915205955084e+00 7.1484699716490285e-01 4.7924353884732795e-01 2.6226976802757767e+00 5.2407692631345859e-01 3.5693690552521573e-01 -2.6844994834501987e+00 -7.5929248781909109e-01 -5.8630920807153064e-01 -7.1102787449692750e-01 -4.0857425240869050e-01 -2.6136411324258679e-01 7.7870403550832401e-01 4.9684062516150246e-01 4.0776933126239595e-01 1.3446709088967015e+00 4.1598469320812992e-01 3.3675413201949145e-01 -1.4482240014438899e+00 -5.8739566249044028e-01 -3.9780297766261841e-01 -4.1427173468616779e-01 -3.4213206606455921e+00 -1.8575730501776553e+00 7.2787112636557938e-01 3.5547375921078084e+00 1.5673702423151121e+00 5.2407692631345837e-01 5.2892029219353249e+00 1.8681137114542556e+00 -7.8443836822734347e-01 -4.7312727612202767e+00 -1.9077975691814786e+00 -3.7042121503375058e-01 -2.9293591094344325e+00 -1.4691098917467182e+00 7.4073269763298899e-01 2.4246730266006851e+00 1.6526372254111090e+00 3.8861683371713029e-01 3.3788411117073789e+00 1.7143375239983449e+00 -8.1216626608189568e-01 -3.5655021210508964e+00 -1.5679781920729701e+00 -3.0783720105895807e-01 -1.6227206258052789e+00 -2.6087659825058256e+00 4.9752827513428854e-01 1.5920274562641226e+00 2.3162654687786102e+00 3.5693690552521562e-01 1.8681137114542556e+00 3.7839757464873602e+00 -5.9977922827472874e-01 -1.8859075552408917e+00 -4.0046631906210992e+00 -2.4461039933960302e-01 -1.5170072495442108e+00 -1.6209313344080027e+00 5.2260776259637332e-01 1.3868847512488558e+00 1.8353225115353908e+00 3.1508785519455329e-01 1.7207234392836877e+00 2.6138910261680635e+00 -5.3993396977714125e-01 -1.5421139276605409e+00 -2.3150942454344969e+00 1.4014821242866200e+00 6.2385280006091226e-01 5.9176299847372105e-01 -1.6749733423245039e+00 -9.1986115968809457e-01 -7.1311589112820228e-01 -2.6844994834501987e+00 -7.8443836822734347e-01 -5.9977922827472852e-01 3.0159305412813278e+00 9.0791270441246874e-01 9.1440254860177417e-01 7.4538653482280992e-01 7.5847080963170821e-01 5.1644720447753734e-01 -1.0138730270772081e+00 -7.3450308298785227e-01 -7.4818903414944438e-01 -1.4354130950509290e+00 -7.0557556355333273e-01 -6.8483762787359737e-01 1.6459597475120822e+00 8.5414186035153394e-01 7.2330902987294032e-01 6.1205254792591512e-01 2.9735429573603986e+00 1.6901107806334745e+00 -8.6823870246028434e-01 -3.1169705340461946e+00 -1.4583495783069584e+00 -7.5929248781909120e-01 -4.7312727612202767e+00 -1.8859075552408915e+00 9.0791270441246863e-01 4.4094453424793727e+00 1.8493710803337520e+00 4.6942004755478417e-01 2.4173486296255442e+00 1.3627276933340124e+00 -7.3403309068156919e-01 -2.0874830212844149e+00 -1.4762327803323674e+00 -4.7303576617761367e-01 -2.9573313923918794e+00 -1.6623537703285951e+00 8.4521474724539081e-01 3.0927207794774501e+00 1.5806341299075739e+00 5.8913508192390707e-01 1.7071966278261272e+00 2.8781830889240752e+00 -7.9199789291685962e-01 -1.7234230614894122e+00 -2.5642143596704288e+00 -5.8630920807153064e-01 -1.9077975691814786e+00 -4.0046631906210992e+00 9.1440254860177417e-01 1.8493710803337515e+00 4.4233084056780054e+00 3.8187287291314431e-01 1.6761598059718057e+00 1.7952642564609593e+00 -7.4537352265843504e-01 -1.4715628906549307e+00 -2.1444892479490498e+00 -4.7226009459405532e-01 -1.7025229740507599e+00 -2.9374274734102568e+00 7.1053021480205547e-01 1.5725789812448974e+00 2.5540385205877962e+00 1.3251998144449220e+00 3.7883373645929058e-01 2.9207641726823086e-01 -1.4347389370738874e+00 -5.4205631933815879e-01 -3.5603845026845704e-01 -7.1102787449692750e-01 -3.7042121503375058e-01 -2.4461039933960302e-01 7.4538653482280992e-01 4.6942004755478417e-01 3.8187287291314431e-01 2.7289055862418761e+00 4.4688688980598645e-01 2.9517109442516137e-01 -2.7140256426573455e+00 -7.2389594907974852e-01 -5.3214564866027025e-01 -1.3504538903628343e+00 -3.3578983440934668e-01 -2.9075576995138508e-01 1.4107544090813873e+00 6.7702264404094359e-01 4.5442988361317899e-01 4.0281296089799357e-01 3.3187996173147485e+00 1.6293365845149703e+00 -8.0945220951655628e-01 -3.5208209594988054e+00 -1.5113724098991053e+00 -4.0857425240869050e-01 -2.9293591094344325e+00 -1.5170072495442108e+00 7.5847080963170821e-01 2.4173486296255438e+00 1.6761598059718057e+00 4.4688688980598634e-01 5.2504226464717858e+00 1.7038135667792782e+00 -6.5367455768477023e-01 -4.6345463102882709e+00 -1.6956808493658357e+00 -3.5961528901153827e-01 -3.3407441315695534e+00 -1.7710980545027817e+00 6.2314564828586716e-01 3.4388996173789836e+00 1.4858486060458800e+00 3.1749287771398788e-01 1.6627675793371641e+00 2.5100291059305073e+00 -5.2537815565533064e-01 -1.4673951411783253e+00 -2.2501572245486940e+00 -2.6136411324258679e-01 -1.4691098917467185e+00 -1.6209313344080027e+00 5.1644720447753734e-01 1.3627276933340124e+00 1.7952642564609591e+00 2.9517109442516143e-01 1.7038135667792786e+00 3.7680558525826173e+00 -4.9715700772164811e-01 -1.7655684267873299e+00 -3.9073146395139222e+00 -2.5616761989219128e-01 -1.4950345600705335e+00 -2.5565946204661469e+00 4.1095571989507040e-01 1.4677991803324528e+00 2.2616486039626831e+00 -1.4323726985440584e+00 -6.7537534681345912e-01 -6.4843736963731458e-01 1.6418425766942633e+00 8.1604817747840730e-01 6.9117108473813704e-01 7.7870403550832401e-01 7.4073269763298899e-01 5.2260776259637332e-01 -1.0138730270772081e+00 -7.3403309068156919e-01 -7.4537352265843504e-01 -2.7140256426573455e+00 -6.5367455768477034e-01 -4.9715700772164811e-01 2.9901213382924023e+00 8.1787267181495638e-01 8.1850506096533715e-01 1.4199384437479226e+00 5.3798894213737813e-01 5.2244826770059427e-01 -1.6703350259643006e+00 -8.4955949388393215e-01 -6.6376427598304422e-01 -4.7740025805784264e-01 -2.8999375060785977e+00 -1.5895077398302269e+00 8.3370858787202085e-01 3.0428590347806903e+00 1.5318160402409973e+00 4.9684062516150240e-01 2.4246730266006851e+00 1.3868847512488558e+00 -7.3450308298785227e-01 -2.0874830212844149e+00 -1.4715628906549307e+00 -7.2389594907974852e-01 -4.6345463102882709e+00 -1.7655684267873295e+00 8.1787267181495615e-01 4.2778319975640260e+00 1.6799744620449120e+00 5.8504618945934206e-01 2.9020380348153441e+00 1.6026258863252945e+00 -7.9766878418237808e-01 -3.0254352561094624e+00 -1.3746620825875731e+00 -4.7143690409527572e-01 -1.6422924993981862e+00 -2.8499507169550631e+00 6.9326343468184626e-01 1.5007878604254303e+00 2.4978826622596477e+00 4.0776933126239606e-01 1.6526372254111090e+00 1.8353225115353908e+00 -7.4818903414944438e-01 -1.4762327803323674e+00 -2.1444892479490498e+00 -5.3214564866027025e-01 -1.6956808493658362e+00 -3.9073146395139222e+00 8.1850506096533737e-01 1.6799744620449120e+00 4.2655953151003461e+00 5.5708763081564383e-01 1.5783024408962580e+00 2.8214354817146967e+00 -7.2485387082023345e-01 -1.5974958596813205e+00 -2.5184813661920455e+00 -7.0288848431358208e-01 -3.2052161866650736e-01 -3.0254886442784601e-01 7.7662288492818421e-01 4.7094056498706399e-01 3.8414046932909507e-01 1.3446709088967017e+00 3.8861683371713029e-01 3.1508785519455329e-01 -1.4354130950509292e+00 -4.7303576617761367e-01 -4.7226009459405538e-01 -1.3504538903628343e+00 -3.5961528901153827e-01 -2.5616761989219122e-01 1.4199384437479226e+00 5.8504618945934206e-01 5.5708763081564383e-01 2.6741555730204469e+00 3.9700852159264294e-01 3.7477542933382602e-01 -2.7266323408659101e+00 -6.8843943590051992e-01 -6.0011480575902554e-01 -3.3850071703020490e-01 -2.3452201476020864e+00 -1.6052950503313441e+00 6.8171222510226470e-01 2.4649509893525945e+00 1.3982347134337896e+00 4.1598469320812992e-01 3.3788411117073784e+00 1.7207234392836874e+00 -7.0557556355333273e-01 -2.9573313923918798e+00 -1.7025229740507601e+00 -3.3578983440934668e-01 -3.3407441315695539e+00 -1.4950345600705335e+00 5.3798894213737813e-01 2.9020380348153436e+00 1.5783024408962580e+00 3.9700852159264294e-01 4.6039511413857079e+00 1.9025285550877782e+00 -6.5282826704753161e-01 -4.7064856056975044e+00 -1.7969365642488750e+00 -3.2602086899531196e-01 -1.6379667719746434e+00 -2.1817546168113515e+00 6.3127778123436906e-01 1.6251654185307436e+00 1.8338441199002198e+00 3.3675413201949139e-01 1.7143375239983447e+00 2.6138910261680635e+00 -6.8483762787359737e-01 -1.6623537703285949e+00 -2.9374274734102568e+00 -2.9075576995138508e-01 -1.7710980545027817e+00 -2.5565946204661474e+00 5.2244826770059416e-01 1.6026258863252945e+00 2.8214354817146963e+00 3.7477542933382602e-01 1.9025285550877777e+00 4.3959110980046621e+00 -5.6364134346798644e-01 -1.7732387871361408e+00 -3.9893050150998879e+00 7.6162389619262294e-01 6.6917316740699562e-01 6.0639193017245763e-01 -1.0172117983449023e+00 -8.5542974837840746e-01 -5.8963835505779705e-01 -1.4482240014438896e+00 -8.1216626608189568e-01 -5.3993396977714114e-01 1.6459597475120822e+00 8.4521474724539081e-01 7.1053021480205558e-01 1.4107544090813868e+00 6.2314564828586727e-01 4.1095571989507029e-01 -1.6703350259643006e+00 -7.9766878418237830e-01 -7.2485387082023345e-01 -2.7266323408659101e+00 -6.5282826704753139e-01 -5.6364134346798644e-01 3.0440651138329100e+00 9.8055950275195913e-01 6.9018967425357436e-01 4.9057768830409315e-01 2.4415961234094445e+00 1.6012253884286249e+00 -8.7690710317363740e-01 -2.6238981825010388e+00 -1.3658771493813486e+00 -5.8739566249044028e-01 -3.5655021210508959e+00 -1.5421139276605409e+00 8.5414186035153394e-01 3.0927207794774501e+00 1.5725789812448974e+00 6.7702264404094370e-01 3.4388996173789841e+00 1.4677991803324528e+00 -8.4955949388393215e-01 -3.0254352561094624e+00 -1.5974958596813205e+00 -6.8843943590051992e-01 -4.7064856056975044e+00 -1.7732387871361412e+00 9.8055950275195924e-01 4.9481046450930251e+00 1.6371221738533757e+00 4.0197258457695140e-01 1.4103223742906854e+00 1.8085470078315686e+00 -6.0821911291195707e-01 -1.3743504451880966e+00 -1.5855257575173156e+00 -3.9780297766261835e-01 -1.5679781920729696e+00 -2.3150942454344974e+00 7.2330902987294021e-01 1.5806341299075739e+00 2.5540385205877962e+00 4.5442988361317893e-01 1.4858486060458800e+00 2.2616486039626831e+00 -6.6376427598304422e-01 -1.3746620825875733e+00 -2.5184813661920455e+00 -6.0011480575902554e-01 -1.7969365642488748e+00 -3.9893050150998879e+00 6.9018967425357447e-01 1.6371221738533752e+00 3.7841722518616989e+00 549 550 551 597 598 599 609 610 611 561 562 563 477 478 479 495 496 497 498 499 500 480 481 482 2.8354190600780975e+00 -1.8739573107806631e-02 -1.9862993536036339e-02 -2.7494158252264218e+00 -2.6237695217242857e-01 -2.4713470942775245e-01 -1.3765582160191014e+00 5.0603552504753839e-02 3.7914591527405901e-02 1.3406124052350181e+00 2.3108351634175336e-01 2.1784631002211133e-01 1.3593999011914917e+00 -2.3068498777223698e-02 -1.9685410928018850e-02 -1.3615732685018336e+00 -1.1538057170459523e-01 -1.1017723975917319e-01 -6.8440299937069493e-01 3.8914057699301091e-02 3.6182915698776526e-02 6.3651894261344555e-01 9.8964469216245757e-02 1.0491653640268707e-01 -1.8739573107806627e-02 5.1401856805522828e+00 2.1579074479799747e+00 -2.5454539576297103e-01 -5.3048778076158278e+00 -2.0933004712757195e+00 4.5117738207650734e-02 -3.7168143069100625e+00 -1.7809483809678137e+00 2.2685148750192824e-01 3.3648591489325343e+00 1.9139019211382660e+00 -4.0668460761842593e-02 3.6045811900215092e+00 1.8437093840462047e+00 -3.2692983722141017e-01 -3.2731139510399121e+00 -1.8510025862707113e+00 5.3415328539217474e-02 -2.5396854609739696e+00 -1.7776480564629995e+00 3.1549871260523515e-01 2.7248655070334489e+00 1.5873807418127992e+00 -1.9862993536036339e-02 2.1579074479799738e+00 4.8531656376482948e+00 -2.3937247290061278e-01 -2.0798444529775946e+00 -4.4252655651904780e+00 3.9063987833327894e-02 -2.0256085204124283e+00 -2.8931952140985970e+00 2.1113611122884210e-01 1.9087730982442523e+00 3.1698756883218171e+00 -3.3413773467366861e-02 1.8098683357943262e+00 2.7973632347538122e+00 -3.1099691748278929e-01 -1.8326294657517352e+00 -3.1413529380725476e+00 4.9509714649088959e-02 -1.7570975045565391e+00 -2.3672502375474140e+00 3.0393634367554739e-01 1.8186310616797459e+00 2.0066593941851130e+00 -2.7494158252264218e+00 -2.5454539576297103e-01 -2.3937247290061278e-01 2.9255002527916840e+00 5.9558690726189056e-01 4.1506971379218616e-01 1.3550269642056143e+00 2.6689146524195489e-01 1.8481866115007162e-01 -1.5020763513681830e+00 -5.1874739418172422e-01 -4.5554213707983227e-01 -1.3648290716097056e+00 -3.7473543190831854e-01 -2.5352312706202768e-01 1.4805839449801803e+00 4.8816717959206835e-01 3.9852993911559664e-01 6.5410984648960968e-01 3.1126569747441640e-01 3.0534671743220027e-01 -7.9889976026277720e-01 -5.1388302771731664e-01 -3.5532729444758210e-01 -2.6237695217242862e-01 -5.3048778076158287e+00 -2.0798444529775955e+00 5.9558690726189045e-01 5.6175339828497775e+00 1.9730909839507020e+00 2.6612865389660018e-01 3.9584341578519275e+00 1.8007446011184602e+00 -5.4094901170253351e-01 -3.6126737075437223e+00 -1.9779336423164358e+00 -1.2122738568451194e-01 -3.8992808499040779e+00 -1.7128690959941641e+00 4.9075138801480156e-01 3.5113175242778980e+00 1.7702973267493407e+00 8.3576593583116587e-02 2.7435373808957753e+00 1.8314085100714008e+00 -5.1149019319693612e-01 -3.0139906808117485e+00 -1.6048942306017102e+00 -2.4713470942775245e-01 -2.0933004712757191e+00 -4.4252655651904780e+00 4.1506971379218616e-01 1.9730909839507027e+00 4.1800558548858975e+00 1.8235534079994714e-01 1.7934244970919391e+00 2.6128010204131118e+00 -4.1494797233248792e-01 -1.7241623794251346e+00 -2.8775063299115056e+00 -7.9641535202561814e-02 -1.7243153598700922e+00 -2.5381439012031630e+00 4.0572186607687993e-01 1.7962885386049514e+00 2.8055035369101526e+00 9.2897410903915068e-02 1.5868764549264183e+00 2.0377006618231790e+00 -3.5432011461012697e-01 -1.6079022640030656e+00 -1.7951452777271930e+00 -1.3765582160191014e+00 4.5117738207650686e-02 3.9063987833327873e-02 1.3550269642056143e+00 2.6612865389660018e-01 1.8235534079994711e-01 2.7440730280461869e+00 -1.8357838513957746e-02 -1.0427094652535910e-02 -2.6946917955729126e+00 -2.9199324393136816e-01 -2.0171362775269869e-01 -6.8782891365711984e-01 3.6717543388516342e-02 2.5936326822026082e-02 6.5694743386659760e-01 1.2724718186061704e-01 7.7809611876659135e-02 1.3416335456246131e+00 -2.5340247916466385e-02 -1.8451330235496968e-02 -1.3386020464938779e+00 -1.3951978699159204e-01 -9.4573214691228674e-02 5.0603552504753825e-02 -3.7168143069100625e+00 -2.0256085204124283e+00 2.6689146524195478e-01 3.9584341578519275e+00 1.7934244970919393e+00 -1.8357838513957753e-02 5.6951032973873819e+00 2.0463140530858981e+00 -2.9652203402598398e-01 -5.2610051902782198e+00 -2.1178982517432674e+00 5.6592199665172351e-02 -3.1164709066060166e+00 -1.6410250858241149e+00 3.6527887758913158e-01 2.7318070945320208e+00 1.8397879447157057e+00 -4.2071892071470780e-02 3.6031990115290657e+00 1.8559291957204131e+00 -3.8241433038960149e-01 -3.8942531575060979e+00 -1.7509238326341467e+00 3.7914591527405901e-02 -1.7809483809678135e+00 -2.8931952140985970e+00 1.8481866115007156e-01 1.8007446011184602e+00 2.6128010204131118e+00 -1.0427094652535907e-02 2.0463140530858985e+00 4.1618078819348625e+00 -2.0456334015269373e-01 -2.1101687157818700e+00 -4.3977407614549211e+00 3.9805292933849268e-02 -1.6593390431198571e+00 -1.8085096831297134e+00 2.4510349038032697e-01 1.5820207812826577e+00 2.0375915800058659e+00 -3.2407956637412444e-02 1.8610835521849558e+00 2.8203409946207181e+00 -2.6024364454901255e-01 -1.7397068478024331e+00 -2.5330958182913275e+00 1.3406124052350181e+00 2.2685148750192818e-01 2.1113611122884210e-01 -1.5020763513681830e+00 -5.4094901170253351e-01 -4.1494797233248798e-01 -2.6946917955729126e+00 -2.9652203402598393e-01 -2.0456334015269373e-01 2.9062691962708680e+00 5.2254517501681197e-01 5.0220822583468838e-01 6.3181394287581072e-01 3.5953140973197834e-01 2.3653195457732501e-01 -7.9534663123434657e-01 -4.3724391301759719e-01 -4.2481083965816785e-01 -1.3296797102869458e+00 -3.2459008076931656e-01 -3.1051761568435959e-01 1.4430989440806918e+00 4.9037696726471303e-01 4.0496347618685369e-01 2.3108351634175336e-01 3.3648591489325343e+00 1.9087730982442523e+00 -5.1874739418172400e-01 -3.6126737075437223e+00 -1.7241623794251346e+00 -2.9199324393136811e-01 -5.2610051902782198e+00 -2.1101687157818700e+00 5.2254517501681197e-01 5.0051518361480474e+00 2.1256630730062183e+00 1.0957314789428800e-01 2.7172810440877897e+00 1.5722449548565705e+00 -4.4941271241376030e-01 -2.4508814648158403e+00 -1.7211780028735322e+00 -1.0026242102923213e-01 -3.2687436339924578e+00 -1.8643448488286949e+00 4.9721393230323246e-01 3.5060119674618702e+00 1.8131728208021916e+00 2.1784631002211133e-01 1.9139019211382657e+00 3.1698756883218167e+00 -4.5554213707983232e-01 -1.9779336423164358e+00 -2.8775063299115056e+00 -2.0171362775269866e-01 -2.1178982517432674e+00 -4.3977407614549211e+00 5.0220822583468838e-01 2.1256630730062178e+00 4.8147700537164981e+00 6.2038944761210683e-02 1.8422135564328075e+00 2.0043406275700733e+00 -4.3400041476430068e-01 -1.7107208490063046e+00 -2.3521950745641576e+00 -9.7557480865416130e-02 -1.8757981664814507e+00 -3.1459736616315452e+00 4.0672017984423842e-01 1.8005723589701685e+00 2.7844294579537414e+00 1.3593999011914919e+00 -4.0668460761842613e-02 -3.3413773467366861e-02 -1.3648290716097058e+00 -1.2122738568451194e-01 -7.9641535202561814e-02 -6.8782891365711984e-01 5.6592199665172344e-02 3.9805292933849261e-02 6.3181394287581072e-01 1.0957314789428800e-01 6.2038944761210690e-02 2.7724438254820134e+00 -3.9909699050926187e-02 -2.5468594649331319e-02 -2.6660446725181592e+00 -2.9020855369356746e-01 -1.9605496434760189e-01 -1.3408216058310303e+00 6.5123010630448785e-02 5.4200293272717796e-02 1.2958665940666980e+00 2.6072574100093898e-01 1.7853433669908411e-01 -2.3068498777223709e-02 3.6045811900215092e+00 1.8098683357943264e+00 -3.7473543190831848e-01 -3.8992808499040779e+00 -1.7243153598700922e+00 3.6717543388516349e-02 -3.1164709066060166e+00 -1.6593390431198571e+00 3.5953140973197839e-01 2.7172810440877897e+00 1.8422135564328077e+00 -3.9909699050926201e-02 5.5478894807107277e+00 1.9053134114065930e+00 -2.4710203663364647e-01 -5.0647186861187201e+00 -1.9407355859092896e+00 6.7649851488758170e-02 -3.5327933844581922e+00 -1.9146574456477046e+00 2.2091686176086336e-01 3.7435121122669814e+00 1.6816521309132184e+00 -1.9685410928018853e-02 1.8437093840462047e+00 2.7973632347538122e+00 -2.5352312706202768e-01 -1.7128690959941644e+00 -2.5381439012031630e+00 2.5936326822026089e-02 -1.6410250858241149e+00 -1.8085096831297136e+00 2.3653195457732501e-01 1.5722449548565707e+00 2.0043406275700733e+00 -2.5468594649331315e-02 1.9053134114065924e+00 4.0776929269608155e+00 -1.6616539901930280e-01 -1.9904729044843785e+00 -4.2459333963765191e+00 5.2869793835400115e-02 -1.6536450263390394e+00 -2.7590407654023941e+00 1.4950445642393032e-01 1.6767443623323299e+00 2.4722309568270897e+00 -1.3615732685018336e+00 -3.2692983722141017e-01 -3.1099691748278929e-01 1.4805839449801803e+00 4.9075138801480156e-01 4.0572186607687993e-01 6.5694743386659760e-01 3.6527887758913158e-01 2.4510349038032697e-01 -7.9534663123434657e-01 -4.4941271241376035e-01 -4.3400041476430062e-01 -2.6660446725181592e+00 -2.4710203663364649e-01 -1.6616539901930272e-01 2.8392741067763296e+00 4.9113041421082482e-01 4.7322594060817025e-01 1.3041766856982808e+00 1.9460521139300410e-01 1.8495756302160538e-01 -1.4580175990670505e+00 -5.1832130493894524e-01 -3.9784612882059012e-01 -1.1538057170459522e-01 -3.2731139510399121e+00 -1.8326294657517352e+00 4.8816717959206823e-01 3.5113175242778980e+00 1.7962885386049512e+00 1.2724718186061704e-01 2.7318070945320208e+00 1.5820207812826577e+00 -4.3724391301759719e-01 -2.4508814648158403e+00 -1.7107208490063046e+00 -2.9020855369356746e-01 -5.0647186861187201e+00 -1.9904729044843787e+00 4.9113041421082482e-01 4.7745449463963814e+00 1.9695400154081044e+00 2.2421430607570780e-01 3.1983175224922062e+00 1.7957323423137903e+00 -4.8792604332345924e-01 -3.4272729857240356e+00 -1.6097584583670859e+00 -1.1017723975917319e-01 -1.8510025862707113e+00 -3.1413529380725476e+00 3.9852993911559664e-01 1.7702973267493403e+00 2.8055035369101526e+00 7.7809611876659135e-02 1.8397879447157057e+00 2.0375915800058659e+00 -4.2481083965816779e-01 -1.7211780028735322e+00 -2.3521950745641580e+00 -1.9605496434760183e-01 -1.9407355859092901e+00 -4.2459333963765200e+00 4.7322594060817025e-01 1.9695400154081042e+00 4.6082094050767672e+00 2.1038093662446886e-01 1.7878732212144048e+00 3.0318463794246169e+00 -4.2890338445995313e-01 -1.8545823330340234e+00 -2.7436694924041776e+00 -6.8440299937069482e-01 5.3415328539217488e-02 4.9509714649088953e-02 6.5410984648960968e-01 8.3576593583116587e-02 9.2897410903915068e-02 1.3416335456246131e+00 -4.2071892071470780e-02 -3.2407956637412451e-02 -1.3296797102869458e+00 -1.0026242102923213e-01 -9.7557480865416130e-02 -1.3408216058310298e+00 6.7649851488758170e-02 5.2869793835400122e-02 1.3041766856982808e+00 2.2421430607570786e-01 2.1038093662446886e-01 2.6620723209277934e+00 -3.8631353215944360e-02 -3.8144236192033852e-02 -2.6070880832516270e+00 -2.4789041337015288e-01 -2.3754818231801056e-01 3.8914057699301105e-02 -2.5396854609739696e+00 -1.7570975045565396e+00 3.1126569747441640e-01 2.7435373808957753e+00 1.5868764549264183e+00 -2.5340247916466389e-02 3.6031990115290657e+00 1.8610835521849560e+00 -3.2459008076931661e-01 -3.2687436339924578e+00 -1.8757981664814509e+00 6.5123010630448813e-02 -3.5327933844581922e+00 -1.6536450263390394e+00 1.9460521139300413e-01 3.1983175224922062e+00 1.7878732212144051e+00 -3.8631353215944353e-02 4.8256935128993188e+00 2.0469263531149839e+00 -2.2134629529544428e-01 -5.0295249483917450e+00 -1.9962188840637347e+00 3.6182915698776526e-02 -1.7776480564629993e+00 -2.3672502375474140e+00 3.0534671743220021e-01 1.8314085100714008e+00 2.0377006618231790e+00 -1.8451330235496971e-02 1.8559291957204134e+00 2.8203409946207176e+00 -3.1051761568435959e-01 -1.8643448488286949e+00 -3.1459736616315452e+00 5.4200293272717782e-02 -1.9146574456477046e+00 -2.7590407654023941e+00 1.8495756302160543e-01 1.7957323423137905e+00 3.0318463794246169e+00 -3.8144236192033831e-02 2.0469263531149844e+00 4.5945274525166502e+00 -2.1357430731341068e-01 -1.9733460502811910e+00 -4.2121508238038121e+00 6.3651894261344555e-01 3.1549871260523515e-01 3.0393634367554739e-01 -7.9889976026277720e-01 -5.1149019319693623e-01 -3.5432011461012702e-01 -1.3386020464938784e+00 -3.8241433038960149e-01 -2.6024364454901255e-01 1.4430989440806921e+00 4.9721393230323246e-01 4.0672017984423836e-01 1.2958665940666982e+00 2.2091686176086331e-01 1.4950445642393029e-01 -1.4580175990670505e+00 -4.8792604332345924e-01 -4.2890338445995319e-01 -2.6070880832516270e+00 -2.2134629529544425e-01 -2.1357430731341068e-01 2.8271230083144974e+00 5.6954735553611058e-01 3.9688047098878765e-01 9.8964469216245757e-02 2.7248655070334489e+00 1.8186310616797461e+00 -5.1388302771731675e-01 -3.0139906808117485e+00 -1.6079022640030656e+00 -1.3951978699159204e-01 -3.8942531575060979e+00 -1.7397068478024331e+00 4.9037696726471303e-01 3.5060119674618702e+00 1.8005723589701685e+00 2.6072574100093898e-01 3.7435121122669810e+00 1.6767443623323299e+00 -5.1832130493894535e-01 -3.4272729857240356e+00 -1.8545823330340234e+00 -2.4789041337015286e-01 -5.0295249483917459e+00 -1.9733460502811910e+00 5.6954735553611058e-01 5.3906521856713283e+00 1.8795897121384688e+00 1.0491653640268706e-01 1.5873807418127992e+00 2.0066593941851130e+00 -3.5532729444758210e-01 -1.6048942306017102e+00 -1.7951452777271930e+00 -9.4573214691228688e-02 -1.7509238326341467e+00 -2.5330958182913275e+00 4.0496347618685363e-01 1.8131728208021918e+00 2.7844294579537419e+00 1.7853433669908414e-01 1.6816521309132184e+00 2.4722309568270897e+00 -3.9784612882059017e-01 -1.6097584583670856e+00 -2.7436694924041785e+00 -2.3754818231801056e-01 -1.9962188840637347e+00 -4.2121508238038112e+00 3.9688047098878754e-01 1.8795897121384688e+00 4.0207416032605661e+00 597 598 599 645 646 647 657 658 659 609 610 611 495 496 497 510 511 512 513 514 515 498 499 500 2.6654335671884337e+00 -3.1137086118931519e-02 -3.1544605955846482e-02 -2.5700551742958031e+00 -2.4731741419345532e-01 -2.3653887581559754e-01 -1.3159894667504217e+00 6.0459713481844701e-02 4.5484293421907067e-02 1.2762376881594042e+00 2.2068952506364115e-01 2.0929789014326561e-01 1.3102219705935951e+00 -3.3990392324958756e-02 -2.8194506662746865e-02 -1.3119038009401225e+00 -1.0667265105305417e-01 -1.0299089533220186e-01 -6.7502626245559161e-01 4.7439186653422338e-02 4.4523180667043263e-02 6.2108147850050544e-01 9.0529118491491700e-02 9.9963519534176801e-02 -3.1137086118931494e-02 4.8988352673803481e+00 2.1051672617907995e+00 -2.5359261317234871e-01 -5.0578339473288461e+00 -2.0307063566668080e+00 5.7845620053785046e-02 -3.6079949940793479e+00 -1.7405619891673612e+00 2.2696909566152190e-01 3.2540811829424556e+00 1.8761009654664340e+00 -4.6675104325001229e-02 3.5117688964964451e+00 1.8062331817811674e+00 -3.2296919733457574e-01 -3.1789971210104917e+00 -1.8214076875130729e+00 5.9081987276843967e-02 -2.4931745522303466e+00 -1.7513931532112987e+00 3.1047729795870649e-01 2.6733152678297860e+00 1.5565677775201401e+00 -3.1544605955846482e-02 2.1051672617907999e+00 4.6464210485961672e+00 -2.4157444616890189e-01 -2.0296899273437337e+00 -4.2017541532504570e+00 4.9712442072076646e-02 -1.9926469479906401e+00 -2.8022822630831214e+00 2.1252664547221667e-01 1.8737264812321235e+00 3.0839330699418710e+00 -3.7728016339223958e-02 1.7800228626355505e+00 2.7190954823082847e+00 -3.0854432037792939e-01 -1.7967479575676775e+00 -3.0744784483041077e+00 5.5122015189277292e-02 -1.7313569259864507e+00 -2.3413584767742686e+00 3.0203028610833133e-01 1.7915251532300307e+00 1.9704237405656322e+00 -2.5700551742958031e+00 -2.5359261317234871e-01 -2.4157444616890189e-01 2.7522517671990290e+00 5.9483876421753945e-01 4.1170512546699756e-01 1.2885012978394108e+00 2.6862167380294938e-01 1.8530152990421503e-01 -1.4432952689724561e+00 -5.1792713235381116e-01 -4.5587980639762521e-01 -1.3126476455892957e+00 -3.7581658496807263e-01 -2.5232226186235196e-01 1.4334658996817640e+00 4.8911164849113820e-01 4.0064702174272460e-01 6.4072780356711123e-01 3.1107002930011668e-01 3.0714741817833080e-01 -7.8894867942975966e-01 -5.1630578531751214e-01 -3.5502458086338889e-01 -2.4731741419345538e-01 -5.0578339473288452e+00 -2.0296899273437337e+00 5.9483876421753956e-01 5.3717896810260930e+00 1.9108049962760716e+00 2.5561203546934924e-01 3.8487376980447134e+00 1.7593135235794621e+00 -5.4390827940975839e-01 -3.5020452160019211e+00 -1.9411019168115464e+00 -1.1701209251023420e-01 -3.8079703333162787e+00 -1.6703194757619193e+00 4.8802683129599395e-01 3.4162309841051122e+00 1.7384239874589744e+00 8.0602642917956810e-02 2.6964527808797594e+00 1.8032847508241532e+00 -5.1084248778739183e-01 -2.9653616474086339e+00 -1.5707159382214630e+00 -2.3653887581559754e-01 -2.0307063566668089e+00 -4.2017541532504570e+00 4.1170512546699756e-01 1.9108049962760711e+00 3.9508426385046915e+00 1.7392274844135294e-01 1.7497435024232562e+00 2.5123541502386839e+00 -4.1606319723942242e-01 -1.6809062866414359e+00 -2.7807576166174686e+00 -7.6220435132646452e-02 -1.6873201035571177e+00 -2.4520737725713015e+00 4.0318373940432661e-01 1.7562623144021661e+00 2.7254788131039707e+00 9.1859084626965737e-02 1.5555220071642584e+00 1.9989491020332260e+00 -3.5184818975197674e-01 -1.5734000734003921e+00 -1.7530391614413454e+00 -1.3159894667504217e+00 5.7845620053785046e-02 4.9712442072076611e-02 1.2885012978394108e+00 2.5561203546934924e-01 1.7392274844135294e-01 2.6724947789048317e+00 -3.1164248829928024e-02 -1.9123872403587806e-02 -2.6191558433347542e+00 -2.8373732553512648e-01 -1.9279119823429056e-01 -6.7666605238199939e-01 4.8733331255074230e-02 3.3867730196867424e-02 6.4248006771059563e-01 1.2085426491267758e-01 7.0695163434342359e-02 1.3463549864231288e+00 -3.5274224266947450e-02 -2.6873069558192395e-02 -1.3380197684107922e+00 -1.3286945305888404e-01 -8.9409943948568549e-02 6.0459713481844687e-02 -3.6079949940793479e+00 -1.9926469479906399e+00 2.6862167380294943e-01 3.8487376980447130e+00 1.7497435024232562e+00 -3.1164248829928066e-02 5.5759021466465573e+00 2.0031119870278249e+00 -2.9641406489872746e-01 -5.1375694593182093e+00 -2.0761791929361597e+00 6.1350328140797758e-02 -3.0726027934472380e+00 -1.6060545079789792e+00 3.6219616270745519e-01 2.6813185720213242e+00 1.8136799884648338e+00 -4.7130992842382397e-02 3.5757613807669171e+00 1.8257847241788083e+00 -3.7791857156200942e-01 -3.8635525506347177e+00 -1.7174395531889448e+00 4.5484293421907060e-02 -1.7405619891673609e+00 -2.8022822630831210e+00 1.8530152990421506e-01 1.7593135235794621e+00 2.5123541502386839e+00 -1.9123872403587820e-02 2.0031119870278249e+00 4.0524780735695103e+00 -2.0259075881590488e-01 -2.0712922243722796e+00 -4.2908784413844927e+00 4.2899877608702106e-02 -1.6298761998548814e+00 -1.7681719407776055e+00 2.4069302895360364e-01 1.5509819776432217e+00 2.0022836845837069e+00 -3.6882720456949618e-02 1.8394448531029906e+00 2.8016327332639985e+00 -2.5578137821198582e-01 -1.7111219279589795e+00 -2.5074159964106801e+00 1.2762376881594044e+00 2.2696909566152196e-01 2.1252664547221664e-01 -1.4432952689724563e+00 -5.4390827940975839e-01 -4.1606319723942242e-01 -2.6191558433347546e+00 -2.9641406489872746e-01 -2.0259075881590485e-01 2.8424039646662909e+00 5.2272502447035185e-01 5.0497262846707180e-01 6.1724188002409452e-01 3.6066819270948119e-01 2.3479871512577499e-01 -7.8729028094734077e-01 -4.3886053088688493e-01 -4.2976624798929330e-01 -1.3339080409350841e+00 -3.2378529140259521e-01 -3.1156121918737484e-01 1.4477659013398458e+00 4.9260585375661159e-01 4.0768343416693198e-01 2.2068952506364115e-01 3.2540811829424556e+00 1.8737264812321235e+00 -5.1792713235381116e-01 -3.5020452160019211e+00 -1.6809062866414359e+00 -2.8373732553512654e-01 -5.1375694593182093e+00 -2.0712922243722796e+00 5.2272502447035185e-01 4.8856105727490107e+00 2.0859976999892167e+00 1.0753881426485086e-01 2.6680200813320814e+00 1.5406163373028283e+00 -4.4649073241491294e-01 -2.4005561852189405e+00 -1.6958178484124891e+00 -9.9073047484928400e-02 -3.2391719897927009e+00 -1.8416655464521550e+00 4.9627487398993547e-01 3.4716310133082260e+00 1.7893413873541912e+00 2.0929789014326558e-01 1.8761009654664340e+00 3.0839330699418710e+00 -4.5587980639762521e-01 -1.9411019168115460e+00 -2.7807576166174686e+00 -1.9279119823429056e-01 -2.0761791929361593e+00 -4.2908784413844927e+00 5.0497262846707180e-01 2.0859976999892167e+00 4.7194776950540129e+00 5.8743937054015719e-02 1.8146648177451670e+00 1.9648963278251379e+00 -4.3294344315810263e-01 -1.6789271864390336e+00 -2.3242747417231309e+00 -9.6196344952822727e-02 -1.8481644166155098e+00 -3.1354892881471548e+00 4.0479633707848822e-01 1.7676092296014336e+00 2.7630929950512240e+00 1.3102219705935951e+00 -4.6675104325001215e-02 -3.7728016339223944e-02 -1.3126476455892957e+00 -1.1701209251023423e-01 -7.6220435132646439e-02 -6.7666605238199939e-01 6.1350328140797765e-02 4.2899877608702092e-02 6.1724188002409452e-01 1.0753881426485086e-01 5.8743937054015719e-02 2.7540635633487360e+00 -4.6469146400406010e-02 -2.9640133237242516e-02 -2.6424561953645429e+00 -2.9266760482403481e-01 -1.9648140797605296e-01 -1.3583003866088212e+00 6.8707826640282313e-02 5.7736433880390292e-02 1.3085428659782332e+00 2.6522697901374526e-01 1.8068974414205780e-01 -3.3990392324958769e-02 3.5117688964964446e+00 1.7800228626355510e+00 -3.7581658496807263e-01 -3.8079703333162787e+00 -1.6873201035571173e+00 4.8733331255074230e-02 -3.0726027934472380e+00 -1.6298761998548814e+00 3.6066819270948114e-01 2.6680200813320814e+00 1.8146648177451670e+00 -4.6469146400406038e-02 5.4983476125005257e+00 1.8722048165346079e+00 -2.3959092189457859e-01 -5.0044929212293425e+00 -1.9125432277200836e+00 7.5448151108262529e-02 -3.5231806212620946e+00 -1.8923039994717537e+00 2.1101737051519831e-01 3.7301100789259056e+00 1.6551510336885100e+00 -2.8194506662746862e-02 1.8062331817811674e+00 2.7190954823082851e+00 -2.5232226186235207e-01 -1.6703194757619191e+00 -2.4520737725713015e+00 3.3867730196867424e-02 -1.6060545079789792e+00 -1.7681719407776055e+00 2.3479871512577496e-01 1.5406163373028281e+00 1.9648963278251379e+00 -2.9640133237242551e-02 1.8722048165346079e+00 4.0286723035864824e+00 -1.5826175318947677e-01 -1.9600795893502063e+00 -4.1988021957591188e+00 5.8464142476251063e-02 -1.6300983238409550e+00 -2.7550861205465464e+00 1.4128806715292486e-01 1.6474975613134581e+00 2.4614699159346665e+00 -1.3119038009401223e+00 -3.2296919733457580e-01 -3.0854432037792934e-01 1.4334658996817640e+00 4.8802683129599400e-01 4.0318373940432667e-01 6.4248006771059574e-01 3.6219616270745519e-01 2.4069302895360364e-01 -7.8729028094734066e-01 -4.4649073241491294e-01 -4.3294344315810263e-01 -2.6424561953645429e+00 -2.3959092189457859e-01 -1.5826175318947677e-01 2.8222320822577043e+00 4.8904183986745159e-01 4.7433324258677789e-01 1.3191130267270945e+00 1.8643971309444166e-01 1.7766147865410134e-01 -1.4756407991251532e+00 -5.1665369532127592e-01 -3.9612197287330086e-01 -1.0667265105305418e-01 -3.1789971210104921e+00 -1.7967479575676775e+00 4.8911164849113820e-01 3.4162309841051122e+00 1.7562623144021661e+00 1.2085426491267758e-01 2.6813185720213242e+00 1.5509819776432217e+00 -4.3886053088688493e-01 -2.4005561852189405e+00 -1.6789271864390338e+00 -2.9266760482403481e-01 -5.0044929212293416e+00 -1.9600795893502063e+00 4.8904183986745164e-01 4.7134053592765142e+00 1.9406758742969950e+00 2.2811996282176930e-01 3.1825793529887205e+00 1.7721695306300427e+00 -4.8892692932906301e-01 -3.4094880409328985e+00 -1.5843349636155075e+00 -1.0299089533220186e-01 -1.8214076875130729e+00 -3.0744784483041072e+00 4.0064702174272460e-01 1.7384239874589744e+00 2.7254788131039707e+00 7.0695163434342359e-02 1.8136799884648336e+00 2.0022836845837069e+00 -4.2976624798929330e-01 -1.6958178484124891e+00 -2.3242747417231300e+00 -1.9648140797605293e-01 -1.9125432277200831e+00 -4.1988021957591188e+00 4.7433324258677800e-01 1.9406758742969950e+00 4.5739999133476923e+00 2.1468601788928421e-01 1.7675947639202576e+00 3.0359772328272960e+00 -4.3112289435558115e-01 -1.8306058504954184e+00 -2.7401842580763094e+00 -6.7502626245559161e-01 5.9081987276843967e-02 5.5122015189277299e-02 6.4072780356711123e-01 8.0602642917956810e-02 9.1859084626965737e-02 1.3463549864231288e+00 -4.7130992842382403e-02 -3.6882720456949618e-02 -1.3339080409350841e+00 -9.9073047484928400e-02 -9.6196344952822727e-02 -1.3583003866088212e+00 7.5448151108262557e-02 5.8464142476251063e-02 1.3191130267270945e+00 2.2811996282176927e-01 2.1468601788928421e-01 2.7519848872926751e+00 -4.2759547377336678e-02 -4.2478778157667887e-02 -2.6909460140105121e+00 -2.5428915642018501e-01 -2.4457341661433796e-01 4.7439186653422331e-02 -2.4931745522303466e+00 -1.7313569259864507e+00 3.1107002930011668e-01 2.6964527808797594e+00 1.5555220071642584e+00 -3.5274224266947457e-02 3.5757613807669166e+00 1.8394448531029908e+00 -3.2378529140259515e-01 -3.2391719897927014e+00 -1.8481644166155098e+00 6.8707826640282341e-02 -3.5231806212620946e+00 -1.6300983238409550e+00 1.8643971309444168e-01 3.1825793529887205e+00 1.7675947639202578e+00 -4.2759547377336664e-02 4.8986578595975709e+00 2.0372915002120644e+00 -2.1183769264138386e-01 -5.0979242109478280e+00 -1.9902334579566561e+00 4.4523180667043270e-02 -1.7513931532112987e+00 -2.3413584767742686e+00 3.0714741817833069e-01 1.8032847508241532e+00 1.9989491020332257e+00 -2.6873069558192384e-02 1.8257847241788081e+00 2.8016327332639985e+00 -3.1156121918737484e-01 -1.8416655464521550e+00 -3.1354892881471548e+00 5.7736433880390278e-02 -1.8923039994717537e+00 -2.7550861205465456e+00 1.7766147865410134e-01 1.7721695306300425e+00 3.0359772328272965e+00 -4.2478778157667915e-02 2.0372915002120644e+00 4.6808813649693173e+00 -2.0615544447663070e-01 -1.9531678067098643e+00 -4.2855065476258662e+00 6.2108147850050532e-01 3.1047729795870649e-01 3.0203028610833133e-01 -7.8894867942975966e-01 -5.1084248778739194e-01 -3.5184818975197663e-01 -1.3380197684107922e+00 -3.7791857156200948e-01 -2.5578137821198582e-01 1.4477659013398456e+00 4.9627487398993547e-01 4.0479633707848822e-01 1.3085428659782332e+00 2.1101737051519834e-01 1.4128806715292491e-01 -1.4756407991251530e+00 -4.8892692932906290e-01 -4.3112289435558115e-01 -2.6909460140105121e+00 -2.1183769264138391e-01 -2.0615544447663073e-01 2.9161650151576328e+00 5.7175613885600851e-01 3.9679321645642984e-01 9.0529118491491700e-02 2.6733152678297860e+00 1.7915251532300307e+00 -5.1630578531751203e-01 -2.9653616474086339e+00 -1.5734000734003921e+00 -1.3286945305888404e-01 -3.8635525506347177e+00 -1.7111219279589795e+00 4.9260585375661159e-01 3.4716310133082260e+00 1.7676092296014334e+00 2.6522697901374526e-01 3.7301100789259056e+00 1.6474975613134581e+00 -5.1665369532127592e-01 -3.4094880409328985e+00 -1.8306058504954184e+00 -2.5428915642018501e-01 -5.0979242109478271e+00 -1.9531678067098639e+00 5.7175613885600862e-01 5.4612700898601636e+00 1.8616637144197310e+00 9.9963519534176801e-02 1.5565677775201401e+00 1.9704237405656322e+00 -3.5502458086338889e-01 -1.5707159382214626e+00 -1.7530391614413456e+00 -8.9409943948568549e-02 -1.7174395531889448e+00 -2.5074159964106801e+00 4.0768343416693198e-01 1.7893413873541912e+00 2.7630929950512240e+00 1.8068974414205780e-01 1.6551510336885100e+00 2.4614699159346665e+00 -3.9612197287330075e-01 -1.5843349636155077e+00 -2.7401842580763094e+00 -2.4457341661433801e-01 -1.9902334579566558e+00 -4.2855065476258680e+00 3.9679321645642984e-01 1.8616637144197310e+00 4.0911593120026808e+00 174 175 176 246 247 248 261 262 263 189 190 191 177 178 179 249 250 251 660 661 662 462 463 464 2.5270400925500574e-02 -4.4756189026583151e-03 -4.4756189026583142e-03 2.2215794041191414e-03 -1.2028129426682646e-02 -1.2028129426682648e-02 -2.7600248085731436e-03 1.9131419298794235e-04 -2.7875146788491874e-03 -3.5615476124512284e-04 5.4397244898517650e-03 2.9954683042053929e-03 -3.5615476124512186e-04 2.9954683042053916e-03 5.4397244898517615e-03 -2.7600248085731484e-03 -2.7875146788491874e-03 1.9131419298794148e-04 -7.2147436244104921e-03 3.7578103673474089e-03 3.7578103673474072e-03 -1.4044877565572690e-02 6.9069456537976456e-03 6.9069456537976456e-03 -4.4756189026583168e-03 4.2965727345942721e-02 1.9418975002273558e-02 -1.5440902867744834e-02 -3.4695048642912492e-03 -3.7897894396520421e-04 -6.6046462892936720e-03 -2.4740015547231767e-02 -3.9453454986929475e-03 6.4004175394431970e-03 7.2062422394997207e-04 8.6711109751933906e-03 2.9152547198843973e-03 2.0154513508173409e-02 8.2651894649734530e-03 -7.3994214732188415e-03 -4.3788249581279692e-03 -1.3547773669142759e-02 5.6964977682552433e-03 -2.2999737168978615e-02 -1.6839401449418121e-02 1.8908419505332827e-02 -8.2527825394365147e-03 -1.6437758812213553e-03 -4.4756189026583133e-03 1.9418975002273554e-02 4.2965727345942707e-02 -1.5440902867744830e-02 -3.7897894396520860e-04 -3.4695048642912501e-03 -7.3994214732188372e-03 -1.3547773669142758e-02 -4.3788249581279649e-03 2.9152547198843960e-03 8.2651894649734513e-03 2.0154513508173415e-02 6.4004175394431935e-03 8.6711109751933801e-03 7.2062422394997380e-04 -6.6046462892936685e-03 -3.9453454986929475e-03 -2.4740015547231757e-02 5.6964977682552416e-03 -1.6839401449418121e-02 -2.2999737168978598e-02 1.8908419505332820e-02 -1.6437758812213575e-03 -8.2527825394365130e-03 2.2215794041191409e-03 -1.5440902867744834e-02 -1.5440902867744830e-02 6.2121493314245060e-02 -3.1832979015279222e-04 -3.1832979015278761e-04 1.8123531134748076e-02 1.5635925907989033e-02 -1.6848135804760347e-03 -2.1815167311468306e-02 1.0347453582210766e-03 -1.9408384633480366e-02 -2.1815167311468292e-02 -1.9408384633480359e-02 1.0347453582210686e-03 1.8123531134748072e-02 -1.6848135804760343e-03 1.5635925907989033e-02 -1.4004802976345659e-02 1.8715869798344675e-02 1.8715869798344657e-02 -4.2954997388578081e-02 1.4658898072992478e-03 1.4658898072992456e-03 -1.2028129426682650e-02 -3.4695048642912492e-03 -3.7897894396520860e-04 -3.1832979015279113e-04 2.1329266123263729e-02 2.7184673745433654e-04 1.2078940834493304e-02 2.2405161139471010e-03 -9.7773854172657058e-05 6.1180080513162241e-04 -5.2365611941376580e-03 6.9295437664619011e-04 -6.9650831425971628e-03 -5.7254623534966883e-03 4.9706887681943110e-05 -8.2100639258868323e-04 3.2253748943071757e-03 1.4242805344061432e-04 6.8805988028252055e-03 -5.8643249586740583e-03 -7.7322113802607922e-04 5.6120830957115050e-04 -6.4993037609183523e-03 9.3037880940860201e-05 -1.2028129426682650e-02 -3.7897894396520410e-04 -3.4695048642912505e-03 -3.1832979015278810e-04 2.7184673745433638e-04 2.1329266123263725e-02 -8.2100639258868410e-04 1.4242805344061529e-04 3.2253748943071778e-03 -6.9650831425971680e-03 4.9706887681942141e-05 -5.7254623534966961e-03 6.1180080513162578e-04 6.9295437664618849e-04 -5.2365611941376520e-03 1.2078940834493304e-02 -9.7773854172658820e-05 2.2405161139471010e-03 6.8805988028252081e-03 -7.7322113802607781e-04 -5.8643249586740574e-03 5.6120830957114996e-04 9.3037880940858873e-05 -6.4993037609183523e-03 -2.7600248085731444e-03 -6.6046462892936702e-03 -7.3994214732188389e-03 1.8123531134748069e-02 1.2078940834493302e-02 -8.2100639258868432e-04 2.3764145219659971e-02 1.1589801370586185e-02 -1.0014665493540537e-03 -1.1952066550985102e-02 -5.4683142099158791e-03 -5.7670356402046586e-03 -9.1664848258916683e-03 -1.0020626577953553e-02 5.1342273028432371e-04 6.6868563247218750e-03 1.8653572676154504e-03 7.1814306740766104e-03 -2.0483937925446756e-03 3.0892563533146803e-03 6.0704679657621928e-03 -2.2647562701135319e-02 -6.5297687488465143e-03 1.2236086852431007e-03 1.9131419298794319e-04 -2.4740015547231771e-02 -1.3547773669142758e-02 1.5635925907989033e-02 2.2405161139471019e-03 1.4242805344061527e-04 1.1589801370586187e-02 3.7004130829189241e-02 -1.5219629169213767e-03 -6.2155911085151451e-03 -4.7707003150469132e-03 -1.0137439025577207e-02 -1.0795474879407428e-02 -2.1315204518078106e-02 9.9422513275885713e-04 7.1814306740766130e-03 -1.5120521067314451e-03 1.4374617141409902e-02 1.5631034170084709e-03 1.8967482234435007e-02 8.8617983377707356e-03 -1.9150509574725673e-02 -5.8741566904831040e-03 8.3410694626121407e-04 -2.7875146788491870e-03 -3.9453454986929475e-03 -4.3788249581279658e-03 -1.6848135804760351e-03 -9.7773854172657166e-05 3.2253748943071778e-03 -1.0014665493540528e-03 -1.5219629169213769e-03 1.7073208863205989e-02 -5.3297632613702331e-03 -9.1830019996671890e-03 -4.0833498053503125e-03 9.7826651197335671e-04 1.7037062675286448e-03 -3.3359958810359235e-03 1.8653572676154500e-03 4.9484554941972769e-03 -1.5120521067314460e-03 5.9568327034585922e-03 7.3214648313144684e-03 -7.4388481597899509e-04 2.0031015870021081e-03 7.7445767641378012e-04 -6.2444761902885216e-03 -3.5615476124512132e-04 6.4004175394431970e-03 2.9152547198843955e-03 -2.1815167311468306e-02 6.1180080513162285e-04 -6.9650831425971688e-03 -1.1952066550985102e-02 -6.2155911085151451e-03 -5.3297632613702323e-03 2.5200977304613226e-02 -4.4971967401163807e-04 1.1253657411678927e-02 5.5475802783062859e-03 7.1770953300530965e-03 1.6895100790122420e-03 -9.1664848258916735e-03 9.7826651197335541e-04 -1.0795474879407428e-02 -2.3696495238936270e-03 -7.1972883420627094e-03 -6.2528376311819425e-03 1.4910965390564324e-02 -1.3049810620117844e-03 1.3484736703981214e-02 5.4397244898517650e-03 7.2062422394997142e-04 8.2651894649734495e-03 1.0347453582210766e-03 -5.2365611941376580e-03 4.9706887681942114e-05 -5.4683142099158782e-03 -4.7707003150469140e-03 -9.1830019996671890e-03 -4.4971967401163801e-04 1.8490945286991953e-02 -7.6920982038871353e-04 1.6895100790122399e-03 -1.8318288914716133e-03 5.2186465164417491e-03 5.1342273028432664e-04 -3.3359958810359257e-03 9.9422513275885908e-04 -2.2681464237971107e-03 -5.2192833959392431e-03 -4.3151181261696543e-03 -4.9122234964477974e-04 1.1828001666894317e-03 -2.6043805563044403e-04 2.9954683042053925e-03 8.6711109751933906e-03 2.0154513508173419e-02 -1.9408384633480370e-02 6.9295437664619001e-04 -5.7254623534966961e-03 -5.7670356402046603e-03 -1.0137439025577207e-02 -4.0833498053503108e-03 1.1253657411678924e-02 -7.6920982038871375e-04 3.7733583750269584e-02 7.1770953300530991e-03 1.3095580470473624e-02 -1.8318288914716105e-03 -1.0020626577953560e-02 1.7037062675286454e-03 -2.1315204518078112e-02 1.3242589630992202e-03 -1.2727136120126777e-02 -2.3901108139047340e-02 1.2445566842601952e-02 -5.2956712374916824e-04 -1.0311435509989038e-03 -3.5615476124512240e-04 2.9152547198843964e-03 6.4004175394431935e-03 -2.1815167311468292e-02 -6.9650831425971628e-03 6.1180080513162534e-04 -9.1664848258916683e-03 -1.0795474879407428e-02 9.7826651197335649e-04 5.5475802783062859e-03 1.6895100790122394e-03 7.1770953300530991e-03 2.5200977304613216e-02 1.1253657411678913e-02 -4.4971967401163666e-04 -1.1952066550985100e-02 -5.3297632613702305e-03 -6.2155911085151443e-03 -2.3696495238936274e-03 -6.2528376311819459e-03 -7.1972883420627050e-03 1.4910965390564317e-02 1.3484736703981211e-02 -1.3049810620117857e-03 2.9954683042053925e-03 2.0154513508173409e-02 8.6711109751933801e-03 -1.9408384633480359e-02 -5.7254623534966883e-03 6.9295437664618849e-04 -1.0020626577953553e-02 -2.1315204518078106e-02 1.7037062675286452e-03 7.1770953300530965e-03 -1.8318288914716135e-03 1.3095580470473624e-02 1.1253657411678919e-02 3.7733583750269556e-02 -7.6920982038871082e-04 -5.7670356402046586e-03 -4.0833498053503099e-03 -1.0137439025577189e-02 1.3242589630992206e-03 -2.3901108139047344e-02 -1.2727136120126761e-02 1.2445566842601941e-02 -1.0311435509989032e-03 -5.2956712374916521e-04 5.4397244898517615e-03 8.2651894649734530e-03 7.2062422394997435e-04 1.0347453582210684e-03 4.9706887681943306e-05 -5.2365611941376520e-03 5.1342273028432382e-04 9.9422513275885648e-04 -3.3359958810359235e-03 1.6895100790122412e-03 5.2186465164417491e-03 -1.8318288914716120e-03 -4.4971967401163682e-04 -7.6920982038871061e-04 1.8490945286991946e-02 -5.4683142099158791e-03 -9.1830019996671872e-03 -4.7707003150469175e-03 -2.2681464237971080e-03 -4.3151181261696561e-03 -5.2192833959392466e-03 -4.9122234964477324e-04 -2.6043805563044468e-04 1.1828001666894295e-03 -2.7600248085731488e-03 -7.3994214732188406e-03 -6.6046462892936702e-03 1.8123531134748069e-02 -8.2100639258868378e-04 1.2078940834493306e-02 6.6868563247218741e-03 7.1814306740766139e-03 1.8653572676154498e-03 -9.1664848258916735e-03 5.1342273028432653e-04 -1.0020626577953558e-02 -1.1952066550985100e-02 -5.7670356402046569e-03 -5.4683142099158782e-03 2.3764145219659975e-02 -1.0014665493540517e-03 1.1589801370586184e-02 -2.0483937925446730e-03 6.0704679657621954e-03 3.0892563533146756e-03 -2.2647562701135319e-02 1.2236086852430998e-03 -6.5297687488465143e-03 -2.7875146788491874e-03 -4.3788249581279692e-03 -3.9453454986929475e-03 -1.6848135804760343e-03 3.2253748943071757e-03 -9.7773854172658711e-05 1.8653572676154504e-03 -1.5120521067314456e-03 4.9484554941972769e-03 9.7826651197335541e-04 -3.3359958810359257e-03 1.7037062675286456e-03 -5.3297632613702314e-03 -4.0833498053503099e-03 -9.1830019996671890e-03 -1.0014665493540513e-03 1.7073208863205989e-02 -1.5219629169213754e-03 5.9568327034585922e-03 -7.4388481597899140e-04 7.3214648313144684e-03 2.0031015870021064e-03 -6.2444761902885225e-03 7.7445767641378120e-04 1.9131419298794238e-04 -1.3547773669142759e-02 -2.4740015547231761e-02 1.5635925907989030e-02 1.4242805344061454e-04 2.2405161139471010e-03 7.1814306740766113e-03 1.4374617141409902e-02 -1.5120521067314464e-03 -1.0795474879407428e-02 9.9422513275885908e-04 -2.1315204518078112e-02 -6.2155911085151425e-03 -1.0137439025577188e-02 -4.7707003150469149e-03 1.1589801370586187e-02 -1.5219629169213760e-03 3.7004130829189234e-02 1.5631034170084737e-03 8.8617983377707408e-03 1.8967482234434997e-02 -1.9150509574725666e-02 8.3410694626121341e-04 -5.8741566904831049e-03 -7.2147436244104921e-03 5.6964977682552433e-03 5.6964977682552416e-03 -1.4004802976345661e-02 6.8805988028252055e-03 6.8805988028252081e-03 -2.0483937925446752e-03 1.5631034170084726e-03 5.9568327034585922e-03 -2.3696495238936261e-03 -2.2681464237971107e-03 1.3242589630992202e-03 -2.3696495238936278e-03 1.3242589630992219e-03 -2.2681464237971080e-03 -2.0483937925446717e-03 5.9568327034585922e-03 1.5631034170084735e-03 2.4479299185555886e-02 -5.6006526827123235e-03 -5.6006526827123192e-03 5.5763340480768694e-03 -1.3552492548137306e-02 -1.3552492548137306e-02 3.7578103673474080e-03 -2.2999737168978615e-02 -1.6839401449418125e-02 1.8715869798344668e-02 -5.8643249586740583e-03 -7.7322113802607759e-04 3.0892563533146803e-03 1.8967482234435007e-02 7.3214648313144684e-03 -7.1972883420627094e-03 -5.2192833959392431e-03 -1.2727136120126775e-02 -6.2528376311819459e-03 -2.3901108139047344e-02 -4.3151181261696561e-03 6.0704679657621954e-03 -7.4388481597898988e-04 8.8617983377707391e-03 -5.6006526827123218e-03 4.0399887615538588e-02 1.7969266613256270e-02 -1.2582625828811981e-02 -6.3903137135533469e-04 5.0234705139914600e-04 3.7578103673474072e-03 -1.6839401449418121e-02 -2.2999737168978605e-02 1.8715869798344657e-02 -7.7322113802607900e-04 -5.8643249586740574e-03 6.0704679657621928e-03 8.8617983377707338e-03 -7.4388481597899552e-04 -6.2528376311819416e-03 -4.3151181261696543e-03 -2.3901108139047347e-02 -7.1972883420627068e-03 -1.2727136120126761e-02 -5.2192833959392474e-03 3.0892563533146773e-03 7.3214648313144684e-03 1.8967482234435000e-02 -5.6006526827123192e-03 1.7969266613256266e-02 4.0399887615538574e-02 -1.2582625828811969e-02 5.0234705139915034e-04 -6.3903137135533578e-04 -1.4044877565572690e-02 1.8908419505332827e-02 1.8908419505332823e-02 -4.2954997388578095e-02 5.6120830957115061e-04 5.6120830957114985e-04 -2.2647562701135319e-02 -1.9150509574725673e-02 2.0031015870021086e-03 1.4910965390564324e-02 -4.9122234964478007e-04 1.2445566842601950e-02 1.4910965390564317e-02 1.2445566842601940e-02 -4.9122234964477302e-04 -2.2647562701135323e-02 2.0031015870021064e-03 -1.9150509574725669e-02 5.5763340480768685e-03 -1.2582625828811979e-02 -1.2582625828811972e-02 6.6896735527215923e-02 -1.6939384913255996e-03 -1.6939384913255994e-03 6.9069456537976456e-03 -8.2527825394365147e-03 -1.6437758812213566e-03 1.4658898072992480e-03 -6.4993037609183523e-03 9.3037880940858805e-05 -6.5297687488465152e-03 -5.8741566904831032e-03 7.7445767641378055e-04 -1.3049810620117844e-03 1.1828001666894308e-03 -5.2956712374916824e-04 1.3484736703981211e-02 -1.0311435509989032e-03 -2.6043805563044512e-04 1.2236086852431007e-03 -6.2444761902885225e-03 8.3410694626121341e-04 -1.3552492548137306e-02 -6.3903137135533665e-04 5.0234705139915120e-04 -1.6939384913256009e-03 2.7358093936791297e-02 2.2983150558596692e-04 6.9069456537976456e-03 -1.6437758812213553e-03 -8.2527825394365130e-03 1.4658898072992454e-03 9.3037880940860147e-05 -6.4993037609183523e-03 1.2236086852431009e-03 8.3410694626121417e-04 -6.2444761902885233e-03 1.3484736703981214e-02 -2.6043805563044398e-04 -1.0311435509989027e-03 -1.3049810620117859e-03 -5.2956712374916499e-04 1.1828001666894295e-03 -6.5297687488465143e-03 7.7445767641378077e-04 -5.8741566904831049e-03 -1.3552492548137306e-02 5.0234705139914535e-04 -6.3903137135533621e-04 -1.6939384913255988e-03 2.2983150558596703e-04 2.7358093936791301e-02 177 178 179 249 250 251 660 661 662 462 463 464 501 502 503 663 664 665 666 667 668 504 505 506 1.8490945286991984e-02 -7.6920982038875593e-04 -4.4971967401166257e-04 -4.7707003150468854e-03 -9.1830019996674232e-03 -5.4683142099160196e-03 -5.2192833959392032e-03 -4.3151181261697584e-03 -2.2681464237971705e-03 1.1828001666894521e-03 -2.6043805563045032e-04 -4.9122234964482474e-04 7.2062422394988902e-04 8.2651894649736248e-03 5.4397244898519203e-03 -5.2365611941376372e-03 4.9706887681954528e-05 1.0347453582211408e-03 -3.3359958810359170e-03 9.9422513275891373e-04 5.1342273028435461e-04 -1.8318288914716792e-03 5.2186465164418931e-03 1.6895100790122618e-03 -7.6920982038875528e-04 3.7733583750270673e-02 1.1253657411679552e-02 -1.0137439025578043e-02 -4.0833498053502422e-03 -5.7670356402051495e-03 -1.2727136120127625e-02 -2.3901108139048357e-02 1.3242589630994032e-03 -5.2956712374920901e-04 -1.0311435509989992e-03 1.2445566842603060e-02 8.6711109751941746e-03 2.0154513508174425e-02 2.9954683042053326e-03 6.9295437664621819e-04 -5.7254623534967021e-03 -1.9408384633481657e-02 1.7037062675287337e-03 -2.1315204518079119e-02 -1.0020626577954134e-02 1.3095580470474511e-02 -1.8318288914716801e-03 7.1770953300535857e-03 -4.4971967401166279e-04 1.1253657411679550e-02 2.5200977304613622e-02 -6.2155911085156525e-03 -5.3297632613703598e-03 -1.1952066550985479e-02 -7.1972883420631847e-03 -6.2528376311824143e-03 -2.3696495238934266e-03 -1.3049810620118364e-03 1.3484736703981547e-02 1.4910965390565117e-02 6.4004175394437009e-03 2.9152547198847954e-03 -3.5615476124526492e-04 6.1180080513164843e-04 -6.9650831425973614e-03 -2.1815167311469215e-02 9.7826651197340658e-04 -1.0795474879408025e-02 -9.1664848258919927e-03 7.1770953300535831e-03 1.6895100790122633e-03 5.5475802783066354e-03 -4.7707003150468854e-03 -1.0137439025578043e-02 -6.2155911085156543e-03 3.7004130829190372e-02 -1.5219629169214636e-03 1.1589801370586832e-02 1.8967482234435999e-02 8.8617983377715284e-03 1.5631034170083382e-03 -5.8741566904830615e-03 8.3410694626127446e-04 -1.9150509574726943e-02 -2.4740015547232840e-02 -1.3547773669143670e-02 1.9131419298806649e-04 2.2405161139470602e-03 1.4242805344061887e-04 1.5635925907990282e-02 -1.5120521067315429e-03 1.4374617141410851e-02 7.1814306740771135e-03 -2.1315204518079112e-02 9.9422513275891481e-04 -1.0795474879408032e-02 -9.1830019996674232e-03 -4.0833498053502422e-03 -5.3297632613703598e-03 -1.5219629169214630e-03 1.7073208863206017e-02 -1.0014665493541088e-03 7.3214648313145959e-03 -7.4388481597910925e-04 5.9568327034587778e-03 7.7445767641380375e-04 -6.2444761902885051e-03 2.0031015870022309e-03 -3.9453454986930160e-03 -4.3788249581278860e-03 -2.7875146788492663e-03 -9.7773854172656082e-05 3.2253748943071900e-03 -1.6848135804761481e-03 4.9484554941974209e-03 -1.5120521067315486e-03 1.8653572676154643e-03 1.7037062675287395e-03 -3.3359958810359131e-03 9.7826651197340984e-04 -5.4683142099160222e-03 -5.7670356402051495e-03 -1.1952066550985479e-02 1.1589801370586832e-02 -1.0014665493541088e-03 2.3764145219660374e-02 3.0892563533150819e-03 6.0704679657626855e-03 -2.0483937925448595e-03 -6.5297687488466809e-03 1.2236086852431558e-03 -2.2647562701136228e-02 -6.6046462892941672e-03 -7.3994214732193402e-03 -2.7600248085729779e-03 1.2078940834493615e-02 -8.2100639258870850e-04 1.8123531134748929e-02 1.8653572676154662e-03 7.1814306740771126e-03 6.6868563247222349e-03 -1.0020626577954134e-02 5.1342273028435678e-04 -9.1664848258919927e-03 -5.2192833959392023e-03 -1.2727136120127623e-02 -7.1972883420631864e-03 1.8967482234435999e-02 7.3214648313145968e-03 3.0892563533150832e-03 4.0399887615539587e-02 1.7969266613257276e-02 -5.6006526827126254e-03 -6.3903137135529859e-04 5.0234705139918200e-04 -1.2582625828813074e-02 -2.2999737168979555e-02 -1.6839401449419072e-02 3.7578103673476270e-03 -5.8643249586740860e-03 -7.7322113802611586e-04 1.8715869798345917e-02 -7.4388481597910318e-04 8.8617983377715179e-03 6.0704679657626881e-03 -2.3901108139048353e-02 -4.3151181261697532e-03 -6.2528376311824186e-03 -4.3151181261697593e-03 -2.3901108139048360e-02 -6.2528376311824134e-03 8.8617983377715301e-03 -7.4388481597910817e-04 6.0704679657626855e-03 1.7969266613257279e-02 4.0399887615539594e-02 -5.6006526827126289e-03 5.0234705139917701e-04 -6.3903137135530412e-04 -1.2582625828813076e-02 -1.6839401449419082e-02 -2.2999737168979548e-02 3.7578103673476292e-03 -7.7322113802611857e-04 -5.8643249586740817e-03 1.8715869798345920e-02 7.3214648313146028e-03 1.8967482234436006e-02 3.0892563533150828e-03 -1.2727136120127628e-02 -5.2192833959391945e-03 -7.1972883420631899e-03 -2.2681464237971714e-03 1.3242589630994041e-03 -2.3696495238934258e-03 1.5631034170083382e-03 5.9568327034587778e-03 -2.0483937925448600e-03 -5.6006526827126245e-03 -5.6006526827126289e-03 2.4479299185555990e-02 -1.3552492548137663e-02 -1.3552492548137672e-02 5.5763340480772423e-03 5.6964977682555495e-03 5.6964977682555460e-03 -7.2147436244105372e-03 6.8805988028253990e-03 6.8805988028254007e-03 -1.4004802976346136e-02 5.9568327034587691e-03 1.5631034170083414e-03 -2.0483937925448604e-03 1.3242589630994078e-03 -2.2681464237971731e-03 -2.3696495238934205e-03 1.1828001666894519e-03 -5.2956712374920933e-04 -1.3049810620118364e-03 -5.8741566904830624e-03 7.7445767641380375e-04 -6.5297687488466800e-03 -6.3903137135529892e-04 5.0234705139917647e-04 -1.3552492548137663e-02 2.7358093936791353e-02 2.2983150558597901e-04 -1.6939384913256964e-03 -8.2527825394365893e-03 -1.6437758812214479e-03 6.9069456537978451e-03 -6.4993037609183454e-03 9.3037880940864673e-05 1.4658898072993337e-03 -6.2444761902885086e-03 8.3410694626127792e-04 1.2236086852431610e-03 -1.0311435509990064e-03 -2.6043805563044707e-04 1.3484736703981540e-02 -2.6043805563045054e-04 -1.0311435509989992e-03 1.3484736703981546e-02 8.3410694626127511e-04 -6.2444761902885060e-03 1.2236086852431558e-03 5.0234705139918221e-04 -6.3903137135530119e-04 -1.3552492548137672e-02 2.2983150558597917e-04 2.7358093936791360e-02 -1.6939384913256894e-03 -1.6437758812214460e-03 -8.2527825394365876e-03 6.9069456537978486e-03 9.3037880940863738e-05 -6.4993037609183454e-03 1.4658898072993300e-03 7.7445767641380571e-04 -5.8741566904830685e-03 -6.5297687488466809e-03 -5.2956712374920803e-04 1.1828001666894508e-03 -1.3049810620118331e-03 -4.9122234964482452e-04 1.2445566842603058e-02 1.4910965390565117e-02 -1.9150509574726943e-02 2.0031015870022313e-03 -2.2647562701136228e-02 -1.2582625828813077e-02 -1.2582625828813074e-02 5.5763340480772423e-03 -1.6939384913256974e-03 -1.6939384913256907e-03 6.6896735527218171e-02 1.8908419505334083e-02 1.8908419505334069e-02 -1.4044877565573084e-02 5.6120830957118021e-04 5.6120830957117067e-04 -4.2954997388580128e-02 2.0031015870022218e-03 -1.9150509574726946e-02 -2.2647562701136222e-02 1.2445566842603064e-02 -4.9122234964482962e-04 1.4910965390565120e-02 7.2062422394988924e-04 8.6711109751941729e-03 6.4004175394437009e-03 -2.4740015547232840e-02 -3.9453454986930168e-03 -6.6046462892941672e-03 -2.2999737168979555e-02 -1.6839401449419082e-02 5.6964977682555495e-03 -8.2527825394365911e-03 -1.6437758812214473e-03 1.8908419505334083e-02 4.2965727345943824e-02 1.9418975002274644e-02 -4.4756189026585640e-03 -3.4695048642912583e-03 -3.7897894396522573e-04 -1.5440902867746064e-02 -4.3788249581278972e-03 -1.3547773669143675e-02 -7.3994214732193454e-03 2.0154513508174418e-02 8.2651894649736195e-03 2.9152547198848036e-03 8.2651894649736265e-03 2.0154513508174425e-02 2.9152547198847954e-03 -1.3547773669143670e-02 -4.3788249581278860e-03 -7.3994214732193376e-03 -1.6839401449419072e-02 -2.2999737168979548e-02 5.6964977682555469e-03 -1.6437758812214470e-03 -8.2527825394365893e-03 1.8908419505334065e-02 1.9418975002274644e-02 4.2965727345943824e-02 -4.4756189026585614e-03 -3.7897894396522725e-04 -3.4695048642912683e-03 -1.5440902867746055e-02 -3.9453454986930229e-03 -2.4740015547232843e-02 -6.6046462892941638e-03 8.6711109751941677e-03 7.2062422394987926e-04 6.4004175394436992e-03 5.4397244898519211e-03 2.9954683042053331e-03 -3.5615476124526460e-04 1.9131419298806714e-04 -2.7875146788492663e-03 -2.7600248085729792e-03 3.7578103673476275e-03 3.7578103673476283e-03 -7.2147436244105372e-03 6.9069456537978469e-03 6.9069456537978486e-03 -1.4044877565573082e-02 -4.4756189026585640e-03 -4.4756189026585614e-03 2.5270400925500681e-02 -1.2028129426682967e-02 -1.2028129426682972e-02 2.2215794041194410e-03 -2.7875146788492624e-03 1.9131419298806795e-04 -2.7600248085729844e-03 2.9954683042053296e-03 5.4397244898519246e-03 -3.5615476124527213e-04 -5.2365611941376372e-03 6.9295437664621787e-04 6.1180080513164930e-04 2.2405161139470611e-03 -9.7773854172656082e-05 1.2078940834493616e-02 -5.8643249586740852e-03 -7.7322113802611716e-04 6.8805988028253981e-03 -6.4993037609183454e-03 9.3037880940863670e-05 5.6120830957118021e-04 -3.4695048642912579e-03 -3.7897894396522660e-04 -1.2028129426682967e-02 2.1329266123263777e-02 2.7184673745434993e-04 -3.1832979015281119e-04 3.2253748943071887e-03 1.4242805344061768e-04 -8.2100639258871479e-04 -5.7254623534966926e-03 4.9706887681951458e-05 -6.9650831425973510e-03 4.9706887681954745e-05 -5.7254623534967030e-03 -6.9650831425973614e-03 1.4242805344061890e-04 3.2253748943071887e-03 -8.2100639258870893e-04 -7.7322113802611738e-04 -5.8643249586740808e-03 6.8805988028254007e-03 9.3037880940864714e-05 -6.4993037609183454e-03 5.6120830957117056e-04 -3.7897894396522568e-04 -3.4695048642912683e-03 -1.2028129426682972e-02 2.7184673745434988e-04 2.1329266123263777e-02 -3.1832979015280149e-04 -9.7773854172660609e-05 2.2405161139470659e-03 1.2078940834493623e-02 6.9295437664621494e-04 -5.2365611941376337e-03 6.1180080513164540e-04 1.0347453582211408e-03 -1.9408384633481657e-02 -2.1815167311469211e-02 1.5635925907990282e-02 -1.6848135804761486e-03 1.8123531134748933e-02 1.8715869798345917e-02 1.8715869798345920e-02 -1.4004802976346136e-02 1.4658898072993335e-03 1.4658898072993298e-03 -4.2954997388580128e-02 -1.5440902867746064e-02 -1.5440902867746052e-02 2.2215794041194436e-03 -3.1832979015281049e-04 -3.1832979015280094e-04 6.2121493314247420e-02 -1.6848135804761379e-03 1.5635925907990279e-02 1.8123531134748929e-02 -1.9408384633481660e-02 1.0347453582211432e-03 -2.1815167311469215e-02 -3.3359958810359170e-03 1.7037062675287341e-03 9.7826651197340702e-04 -1.5120521067315436e-03 4.9484554941974217e-03 1.8653572676154665e-03 -7.4388481597910340e-04 7.3214648313146037e-03 5.9568327034587700e-03 -6.2444761902885086e-03 7.7445767641380581e-04 2.0031015870022209e-03 -4.3788249581278964e-03 -3.9453454986930229e-03 -2.7875146788492620e-03 3.2253748943071887e-03 -9.7773854172660826e-05 -1.6848135804761386e-03 1.7073208863206020e-02 -1.5219629169214604e-03 -1.0014665493541068e-03 -4.0833498053502414e-03 -9.1830019996674232e-03 -5.3297632613703580e-03 9.9422513275891373e-04 -2.1315204518079122e-02 -1.0795474879408027e-02 1.4374617141410848e-02 -1.5120521067315477e-03 7.1814306740771126e-03 8.8617983377715179e-03 1.8967482234436003e-02 1.5631034170083412e-03 8.3410694626127803e-04 -5.8741566904830676e-03 -1.9150509574726946e-02 -1.3547773669143675e-02 -2.4740015547232843e-02 1.9131419298806882e-04 1.4242805344061725e-04 2.2405161139470667e-03 1.5635925907990279e-02 -1.5219629169214597e-03 3.7004130829190393e-02 1.1589801370586836e-02 -1.0137439025578045e-02 -4.7707003150468785e-03 -6.2155911085156577e-03 5.1342273028435472e-04 -1.0020626577954134e-02 -9.1664848258919927e-03 7.1814306740771135e-03 1.8653572676154639e-03 6.6868563247222349e-03 6.0704679657626872e-03 3.0892563533150823e-03 -2.0483937925448604e-03 1.2236086852431606e-03 -6.5297687488466826e-03 -2.2647562701136222e-02 -7.3994214732193454e-03 -6.6046462892941620e-03 -2.7600248085729853e-03 -8.2100639258871522e-04 1.2078940834493627e-02 1.8123531134748929e-02 -1.0014665493541081e-03 1.1589801370586832e-02 2.3764145219660388e-02 -5.7670356402051495e-03 -5.4683142099160214e-03 -1.1952066550985480e-02 -1.8318288914716788e-03 1.3095580470474511e-02 7.1770953300535822e-03 -2.1315204518079112e-02 1.7037062675287402e-03 -1.0020626577954135e-02 -2.3901108139048353e-02 -1.2727136120127628e-02 1.3242589630994075e-03 -1.0311435509990062e-03 -5.2956712374920803e-04 1.2445566842603064e-02 2.0154513508174418e-02 8.6711109751941677e-03 2.9954683042053296e-03 -5.7254623534966935e-03 6.9295437664621451e-04 -1.9408384633481657e-02 -4.0833498053502396e-03 -1.0137439025578043e-02 -5.7670356402051495e-03 3.7733583750270659e-02 -7.6920982038875744e-04 1.1253657411679554e-02 5.2186465164418940e-03 -1.8318288914716805e-03 1.6895100790122637e-03 9.9422513275891525e-04 -3.3359958810359131e-03 5.1342273028435689e-04 -4.3151181261697532e-03 -5.2192833959391945e-03 -2.2681464237971731e-03 -2.6043805563044707e-04 1.1828001666894512e-03 -4.9122234964482940e-04 8.2651894649736213e-03 7.2062422394987839e-04 5.4397244898519246e-03 4.9706887681951025e-05 -5.2365611941376337e-03 1.0347453582211436e-03 -9.1830019996674214e-03 -4.7707003150468819e-03 -5.4683142099160222e-03 -7.6920982038875744e-04 1.8490945286991970e-02 -4.4971967401166382e-04 1.6895100790122618e-03 7.1770953300535857e-03 5.5475802783066354e-03 -1.0795474879408030e-02 9.7826651197340984e-04 -9.1664848258919927e-03 -6.2528376311824195e-03 -7.1972883420631907e-03 -2.3696495238934214e-03 1.3484736703981540e-02 -1.3049810620118334e-03 1.4910965390565124e-02 2.9152547198848040e-03 6.4004175394437000e-03 -3.5615476124527257e-04 -6.9650831425973510e-03 6.1180080513164497e-04 -2.1815167311469215e-02 -5.3297632613703572e-03 -6.2155911085156577e-03 -1.1952066550985477e-02 1.1253657411679555e-02 -4.4971967401166458e-04 2.5200977304613618e-02 180 181 182 252 253 254 678 679 680 612 613 614 183 184 185 255 256 257 681 682 683 615 616 617 2.4650569151779860e-02 3.6645551470098972e-03 2.4609639037698298e-03 -1.0522535871727573e-02 -1.2172916530183488e-02 -6.6872719584945717e-03 -6.5677616372150889e-03 -3.7064053186954037e-03 5.9049826449199629e-04 7.2223511337571617e-03 1.1443021412980139e-02 8.6816902804028335e-03 2.0478175595846256e-03 3.5552914558745958e-03 4.1900639239049724e-04 -1.1385350268437152e-02 -5.9517432701213461e-03 -6.5061387543926385e-03 -5.6505158261866330e-03 -3.0548910085278040e-03 -2.3615087795240807e-03 2.0542575844480660e-04 6.2230881116634093e-03 3.4027606513561300e-03 3.6645551470098972e-03 4.7290338627663887e-02 1.6761654946010868e-02 -1.3047865582950804e-02 -1.6785906230649503e-02 3.1355809684048500e-03 -3.3095947800508381e-03 -3.2031681139920130e-02 4.1650307682681931e-03 1.1878110324685501e-02 1.1542646116987812e-02 9.6927946150533687e-03 3.4622679614819164e-03 2.4648681093767531e-02 3.2329462883950951e-03 -1.5669407810441145e-02 -1.4548076704214860e-02 -1.3638290727855896e-02 -2.7469949511450937e-03 -2.6575182881328232e-02 -1.5861948213298671e-02 1.5768929691410583e-02 6.4591811176934865e-03 -7.4877686449778269e-03 2.4609639037698307e-03 1.6761654946010871e-02 3.6335216504216700e-02 -7.3114447749564786e-03 2.4782770894051023e-03 2.7434599063456853e-03 -1.4223450947778229e-03 -9.9925258962795770e-03 1.7673461576606399e-03 8.7602033825421449e-03 1.0293963847853204e-02 1.5849846212716834e-02 4.3584439128123030e-04 2.2861753255274042e-03 -8.8526857136093911e-03 -1.2236516750246458e-02 -8.0751634621056591e-03 -1.9872414888255301e-02 -2.0654452344834062e-03 -1.5359710877462055e-02 -1.6644002028632022e-02 1.1378740176870973e-02 1.6073290270507072e-03 -1.1326766150443163e-02 -1.0522535871727573e-02 -1.3047865582950804e-02 -7.3114447749564769e-03 4.4486777342037397e-02 9.8914391522163421e-03 -1.3564954130865569e-02 8.3839928969578637e-03 1.5015546116420043e-02 -7.6329715082376600e-03 -2.8808491922868752e-02 -8.0442223655733929e-03 -8.1615895410620150e-03 -1.1780837280342200e-02 -1.8123396776102915e-02 9.8435977310471143e-03 2.3145625129348847e-02 7.5449090280597861e-03 3.0938464169693860e-03 1.5719028879368113e-03 1.6325876502113899e-02 1.1877337633913427e-02 -2.6476433181342410e-02 -9.5622860741829598e-03 1.1856178173191810e-02 -1.2172916530183483e-02 -1.6785906230649506e-02 2.4782770894051015e-03 9.8914391522163421e-03 2.5206588483392439e-02 -5.6278189659834908e-03 1.2353217315153113e-02 1.5069192690115037e-02 -8.8264718939764543e-03 -8.5139213864421810e-03 -8.7599192357911224e-03 -3.5591395147222364e-03 -7.2871560892204630e-03 -1.8318571641992722e-02 8.0058049730481994e-03 7.7648455206257398e-03 4.8933532138698520e-03 1.6936791051444786e-03 6.4010779842721150e-03 7.5094332126409173e-03 1.0903105196939471e-03 -8.4365859664211895e-03 -8.8141704915848870e-03 4.7453586873904621e-03 -6.6872719584945717e-03 3.1355809684048496e-03 2.7434599063456818e-03 -1.3564954130865567e-02 -5.6278189659834908e-03 2.9026797941218749e-02 -6.5136119187748079e-03 -1.0470136061373843e-02 1.2285875679169066e-02 5.1313088910477055e-03 1.4767878049673968e-03 2.2220056060796986e-03 5.4604476245061337e-03 1.2403029569311589e-02 -1.5083301606005664e-02 4.6570290999698393e-04 1.4255692681040353e-03 -8.5115131312354063e-03 3.1036332613503686e-03 -8.0480417962268090e-03 -1.0709413614533647e-02 1.2604745321233766e-02 5.7050292127962705e-03 -1.1973910781038492e-02 -6.5677616372150889e-03 -3.3095947800508389e-03 -1.4223450947778234e-03 8.3839928969578637e-03 1.2353217315153113e-02 -6.5136119187748096e-03 2.2129262175989733e-02 4.7810068621493441e-03 -2.1484093425522491e-03 -1.1661710844940693e-02 -1.2944463470187708e-02 3.8527355971121591e-03 -5.9855155541553972e-03 -3.6602864041746781e-03 1.9341770458165064e-03 1.5359647861709256e-03 6.8240747605261397e-03 -1.5196855377891227e-03 3.9018719592873565e-03 3.8148358781423838e-03 7.3546364635097708e-04 -1.1736103782094703e-02 -7.8587901615577594e-03 5.0816756046143646e-03 -3.7064053186954046e-03 -3.2031681139920130e-02 -9.9925258962795787e-03 1.5015546116420043e-02 1.5069192690115037e-02 -1.0470136061373847e-02 4.7810068621493441e-03 5.1518841894729529e-02 -1.4731805101819489e-02 -1.5101900814635983e-02 -1.6746296582962564e-02 -7.7990500349287718e-03 -3.8505161419144633e-03 -3.2037914763275832e-02 1.3339798346138527e-02 1.7789316481598524e-02 4.9915949521294389e-03 1.2586836178346258e-02 3.7205708412314802e-03 2.8298803140843126e-02 4.9852657497722781e-03 -1.8647618026153563e-02 -1.9062540191658595e-02 1.2081616820144640e-02 5.9049826449199651e-04 4.1650307682681931e-03 1.7673461576606401e-03 -7.6329715082376582e-03 -8.8264718939764560e-03 1.2285875679169066e-02 -2.1484093425522487e-03 -1.4731805101819489e-02 2.8586768862840155e-02 5.1445632150196241e-03 -5.8589167488819014e-03 1.6012160773333198e-03 2.0341975528578547e-03 1.3374152755148380e-02 -1.2127769873125856e-02 -8.5694176241369203e-03 2.4054026529799007e-03 -1.0725273504476907e-02 3.1163041871261641e-04 1.1055873894581575e-03 -6.9382561935502950e-03 1.0269909023844748e-02 8.3670201788232142e-03 -1.4449907205850135e-02 7.2223511337571600e-03 1.1878110324685498e-02 8.7602033825421432e-03 -2.8808491922868752e-02 -8.5139213864421828e-03 5.1313088910477055e-03 -1.1661710844940693e-02 -1.5101900814635983e-02 5.1445632150196232e-03 4.6769725208104983e-02 8.0415511825070556e-03 1.6411074745941948e-02 -7.6298017190364184e-06 1.7287348915597935e-02 -8.5582372848574985e-03 -2.5922832076058375e-02 -5.7373578939834500e-03 -1.5511503698071125e-02 -1.1288698144611684e-02 -1.6169141128450006e-02 -1.3039543256303023e-02 2.3697286448336425e-02 8.3153108007211294e-03 1.6621340046802094e-03 1.1443021412980137e-02 1.1542646116987812e-02 1.0293963847853204e-02 -8.0442223655733912e-03 -8.7599192357911224e-03 1.4767878049673966e-03 -1.2944463470187708e-02 -1.6746296582962575e-02 -5.8589167488819023e-03 8.0415511825070556e-03 2.6758301462276750e-02 5.4751186526254738e-03 6.6787056549323541e-03 4.1510420884725259e-03 1.7953837145483552e-03 -6.9889023509744751e-03 -7.3071747158317815e-03 -5.3772081866688267e-03 -6.5217099776218443e-03 -1.5353345498207018e-02 -8.8981756177812701e-03 8.3360199139378768e-03 5.7147463650554014e-03 1.0930465333375623e-03 8.6816902804028335e-03 9.6927946150533704e-03 1.5849846212716834e-02 -8.1615895410620150e-03 -3.5591395147222364e-03 2.2220056060796986e-03 3.8527355971121578e-03 -7.7990500349287735e-03 1.6012160773333198e-03 1.6411074745941948e-02 5.4751186526254747e-03 3.5475385812683086e-02 -1.8943996044122177e-03 1.1797288731718128e-02 -1.1699417906038685e-02 -1.4596749894214063e-02 -4.1710546137233790e-03 -1.6409141152151464e-02 -6.1611446126798404e-03 -1.3415157853032041e-02 -1.9531864963478949e-02 1.8683830289112084e-03 1.9792000170094585e-03 -7.5080296871438525e-03 2.0478175595846243e-03 3.4622679614819156e-03 4.3584439128123090e-04 -1.1780837280342200e-02 -7.2871560892204621e-03 5.4604476245061337e-03 -5.9855155541553972e-03 -3.8505161419144628e-03 2.0341975528578547e-03 -7.6298017190364184e-06 6.6787056549323541e-03 -1.8943996044122181e-03 2.5773604908386680e-02 4.4605985481988930e-03 -2.0368510852001569e-03 -1.0656948338072373e-02 -1.3241052002880086e-02 4.3093760341713925e-03 -6.8012664146365987e-03 -3.6272763915868467e-03 -1.4203960850938141e-03 7.4107749209543026e-03 1.3404428460988696e-02 -6.8882188281104255e-03 3.5552914558745967e-03 2.4648681093767531e-02 2.2861753255274050e-03 -1.8123396776102915e-02 -1.8318571641992722e-02 1.2403029569311589e-02 -3.6602864041746772e-03 -3.2037914763275832e-02 1.3374152755148380e-02 1.7287348915597935e-02 4.1510420884725259e-03 1.1797288731718128e-02 4.4605985481988939e-03 5.3745080692715878e-02 -1.4321803881803355e-02 -1.3413222193549422e-02 -1.4801718197582104e-02 -7.1566176647577216e-03 -3.1437305209292945e-03 -3.2093578579682799e-02 -9.7542280305513169e-03 1.3037396975084903e-02 1.4706979307577523e-02 -8.6279968045931375e-03 4.1900639239049724e-04 3.2329462883950943e-03 -8.8526857136093876e-03 9.8435977310471177e-03 8.0058049730481994e-03 -1.5083301606005664e-02 1.9341770458165064e-03 1.3339798346138527e-02 -1.2127769873125856e-02 -8.5582372848574968e-03 1.7953837145483550e-03 -1.1699417906038687e-02 -2.0368510852001565e-03 -1.4321803881803350e-02 3.2401231203117019e-02 4.4826640174465728e-03 -6.8952370355539055e-03 2.4848969727710836e-03 6.8930064038331778e-04 4.3315103312053351e-03 1.5534413639797316e-03 -6.7736574570263618e-03 -9.4884027359782453e-03 1.1323605558911775e-02 -1.1385350268437152e-02 -1.5669407810441145e-02 -1.2236516750246458e-02 2.3145625129348840e-02 7.7648455206257390e-03 4.6570290999698393e-04 1.5359647861709260e-03 1.7789316481598528e-02 -8.5694176241369203e-03 -2.5922832076058375e-02 -6.9889023509744760e-03 -1.4596749894214063e-02 -1.0656948338072373e-02 -1.3413222193549418e-02 4.4826640174465710e-03 4.4246737122873157e-02 6.8796263988613561e-03 1.6526793266409819e-02 7.7288367646788560e-03 1.2594785400021367e-02 9.4990645562745210e-03 -2.8692033120503883e-02 -8.9570414461419470e-03 4.4284595184695633e-03 -5.9517432701213461e-03 -1.4548076704214860e-02 -8.0751634621056591e-03 7.5449090280597861e-03 4.8933532138698520e-03 1.4255692681040344e-03 6.8240747605261397e-03 4.9915949521294389e-03 2.4054026529799002e-03 -5.7373578939834500e-03 -7.3071747158317815e-03 -4.1710546137233790e-03 -1.3241052002880090e-02 -1.4801718197582104e-02 -6.8952370355539047e-03 6.8796263988613569e-03 2.4249714685051538e-02 4.9828289802448158e-03 1.0915580108314994e-02 1.1313238286464522e-02 9.4475655727600701e-03 -7.2340371287773972e-03 -8.7909315198866095e-03 8.8008863729412709e-04 -6.5061387543926385e-03 -1.3638290727855893e-02 -1.9872414888255301e-02 3.0938464169693852e-03 1.6936791051444791e-03 -8.5115131312354080e-03 -1.5196855377891225e-03 1.2586836178346258e-02 -1.0725273504476905e-02 -1.5511503698071125e-02 -5.3772081866688267e-03 -1.6409141152151460e-02 4.3093760341713942e-03 -7.1566176647577199e-03 2.4848969727710836e-03 1.6526793266409823e-02 4.9828289802448158e-03 3.4490015312746682e-02 8.2112097122121613e-03 1.1064544273980412e-02 1.6753961462219805e-02 -8.6038974395098878e-03 -4.1557719584335209e-03 1.7894689283815119e-03 -5.6505158261866339e-03 -2.7469949511450941e-03 -2.0654452344834057e-03 1.5719028879368109e-03 6.4010779842721159e-03 3.1036332613503682e-03 3.9018719592873565e-03 3.7205708412314806e-03 3.1163041871261609e-04 -1.1288698144611687e-02 -6.5217099776218451e-03 -6.1611446126798386e-03 -6.8012664146366005e-03 -3.1437305209292953e-03 6.8930064038331810e-04 7.7288367646788543e-03 1.0915580108314994e-02 8.2112097122121613e-03 2.2129187435986304e-02 3.7057164851573730e-03 2.5059363694014602e-03 -1.1591318662454414e-02 -1.2330509969279729e-02 -6.5951205548966741e-03 -3.0548910085278040e-03 -2.6575182881328232e-02 -1.5359710877462060e-02 1.6325876502113899e-02 7.5094332126409181e-03 -8.0480417962268090e-03 3.8148358781423834e-03 2.8298803140843119e-02 1.1055873894581555e-03 -1.6169141128450006e-02 -1.5353345498207018e-02 -1.3415157853032041e-02 -3.6272763915868459e-03 -3.2093578579682799e-02 4.3315103312053325e-03 1.2594785400021366e-02 1.1313238286464519e-02 1.1064544273980414e-02 3.7057164851573730e-03 4.5628493484791491e-02 1.7352484979636294e-02 -1.3589905736870382e-02 -1.8727861165521997e-02 2.9687835524407303e-03 -2.3615087795240807e-03 -1.5861948213298671e-02 -1.6644002028632022e-02 1.1877337633913427e-02 1.0903105196939469e-03 -1.0709413614533649e-02 7.3546364635097708e-04 4.9852657497722781e-03 -6.9382561935502959e-03 -1.3039543256303023e-02 -8.8981756177812718e-03 -1.9531864963478949e-02 -1.4203960850938141e-03 -9.7542280305513152e-03 1.5534413639797305e-03 9.4990645562745210e-03 9.4475655727600701e-03 1.6753961462219805e-02 2.5059363694014606e-03 1.7352484979636294e-02 3.4102026377601395e-02 -7.7963540850194812e-03 1.6387250397686662e-03 1.4141075963939945e-03 2.0542575844480725e-04 1.5768929691410583e-02 1.1378740176870973e-02 -2.6476433181342410e-02 -8.4365859664211895e-03 1.2604745321233764e-02 -1.1736103782094703e-02 -1.8647618026153563e-02 1.0269909023844746e-02 2.3697286448336425e-02 8.3360199139378768e-03 1.8683830289112093e-03 7.4107749209543017e-03 1.3037396975084901e-02 -6.7736574570263636e-03 -2.8692033120503890e-02 -7.2340371287773972e-03 -8.6038974395098861e-03 -1.1591318662454416e-02 -1.3589905736870385e-02 -7.7963540850194812e-03 4.7182401618659907e-02 1.0765800277789173e-02 -1.2947868569304981e-02 6.2230881116634093e-03 6.4591811176934865e-03 1.6073290270507065e-03 -9.5622860741829598e-03 -8.8141704915848870e-03 5.7050292127962697e-03 -7.8587901615577577e-03 -1.9062540191658595e-02 8.3670201788232160e-03 8.3153108007211277e-03 5.7147463650554023e-03 1.9792000170094580e-03 1.3404428460988695e-02 1.4706979307577524e-02 -9.4884027359782453e-03 -8.9570414461419470e-03 -8.7909315198866095e-03 -4.1557719584335209e-03 -1.2330509969279729e-02 -1.8727861165521997e-02 1.6387250397686664e-03 1.0765800277789169e-02 2.8514596578325675e-02 -5.6531287810365561e-03 3.4027606513561300e-03 -7.4877686449778269e-03 -1.1326766150443163e-02 1.1856178173191808e-02 4.7453586873904621e-03 -1.1973910781038492e-02 5.0816756046143637e-03 1.2081616820144640e-02 -1.4449907205850135e-02 1.6621340046802085e-03 1.0930465333375619e-03 -7.5080296871438534e-03 -6.8882188281104255e-03 -8.6279968045931375e-03 1.1323605558911775e-02 4.4284595184695633e-03 8.8008863729412720e-04 1.7894689283815121e-03 -6.5951205548966741e-03 2.9687835524407312e-03 1.4141075963939945e-03 -1.2947868569304981e-02 -5.6531287810365569e-03 3.0731431740788375e-02 252 253 254 324 325 326 726 727 728 678 679 680 255 256 257 327 328 329 729 730 731 681 682 683 2.8731118098501995e-02 5.1084981082776485e-03 3.2698943303783468e-03 -1.4784490836172698e-02 -1.4460773447503775e-02 -7.3313520613050012e-03 -8.1368400230364766e-03 -4.9710455797789465e-03 7.6964193608588301e-04 9.6045931685073208e-03 1.3315357012444507e-02 9.8400537720394043e-03 3.5517020031137240e-03 4.8838038498634989e-03 6.0637726842094884e-04 -1.4046149567714212e-02 -7.1421108736944103e-03 -7.4461502021895562e-03 -6.5508814790641232e-03 -4.1550192319324128e-03 -3.1005424332813643e-03 1.6309486358644745e-03 7.4212901623238875e-03 3.3920773898513407e-03 5.1084981082776476e-03 5.4355436910352752e-02 1.8345589513429589e-02 -1.4938287845131340e-02 -2.2058181930371720e-02 2.6978732413730309e-03 -4.7116183042630244e-03 -3.6781727492691443e-02 4.5305031427247790e-03 1.3533612878447850e-02 1.4602399756485574e-02 1.1044983073449246e-02 4.6508874710199143e-03 2.9093269953033796e-02 3.9258362191279877e-03 -1.7915151758845699e-02 -1.7718325711837672e-02 -1.5008420379240646e-02 -3.8092267935830601e-03 -3.0173710576286570e-02 -1.7500199588942150e-02 1.8081286244077718e-02 8.6808390913152844e-03 -8.0361652219218260e-03 3.2698943303783486e-03 1.8345589513429589e-02 4.0527815435553394e-02 -7.5112612879471175e-03 2.5437686751709201e-03 1.5354710715338661e-04 -1.8140488565019700e-03 -1.0812771935808225e-02 8.5019341211155057e-04 9.6766821571613020e-03 1.1618726223755361e-02 1.7743946642576419e-02 3.9933294857915231e-04 2.2847299686891373e-03 -8.0188778565468775e-03 -1.3584628167810201e-02 -9.3083523336520615e-03 -2.1851540438993820e-02 -2.7354687079717932e-03 -1.6785927865260775e-02 -1.7961087981083718e-02 1.2299497584112282e-02 2.1142377536760557e-03 -1.1443996320770349e-02 -1.4784490836172696e-02 -1.4938287845131340e-02 -7.5112612879471175e-03 5.1305824680812809e-02 1.2264960662339836e-02 -1.4546117886439159e-02 1.0996734903922632e-02 1.7045485340725773e-02 -8.5045174899495962e-03 -3.3183293948122125e-02 -1.0101103217184266e-02 -9.1310619585178564e-03 -1.4484420845054755e-02 -2.0698078808361931e-02 1.0664052549167677e-02 2.7278133077043718e-02 9.3765774695094214e-03 3.1264072334118505e-03 2.9932749822081960e-03 1.8645173784133887e-02 1.2986876463073295e-02 -3.0121762014637780e-02 -1.1594727386031378e-02 1.2915622377200904e-02 -1.4460773447503779e-02 -2.2058181930371724e-02 2.5437686751709201e-03 1.2264960662339836e-02 3.0246346898606804e-02 -6.5315997391824981e-03 1.4439547465931591e-02 1.8760197467362474e-02 -9.8805336272467757e-03 -1.0447500424477247e-02 -1.1157996035332280e-02 -4.2306018973589151e-03 -8.6890901864423650e-03 -2.2207839602395217e-02 8.8786251937545829e-03 9.7140999105095917e-03 7.1581774935001383e-03 1.8541745218110665e-03 7.5664584464343971e-03 9.9557160863803455e-03 1.7655620112016174e-03 -1.0387702426792029e-02 -1.0696420377750536e-02 5.6006048618499962e-03 -7.3313520613050012e-03 2.6978732413730291e-03 1.5354710715338661e-04 -1.4546117886439159e-02 -6.5315997391824981e-03 3.2670977679068833e-02 -7.3347770326814467e-03 -1.1301997743358834e-02 1.3824539471972933e-02 5.3421403104521280e-03 1.6645417623927183e-03 1.2062456489962325e-03 6.1802935561731326e-03 1.3558402521238201e-02 -1.6655850947710805e-02 9.3275158159391832e-04 1.7773106103996040e-03 -7.5984305346207355e-03 3.1821729866675559e-03 -8.4203144528837651e-03 -1.0705620161877349e-02 1.3574888545538871e-02 6.5557838000215429e-03 -1.2895408262982482e-02 -8.1368400230364766e-03 -4.7116183042630244e-03 -1.8140488565019696e-03 1.0996734903922632e-02 1.4439547465931589e-02 -7.3347770326814476e-03 2.5132797450513958e-02 6.4323132209254535e-03 -2.7981061602586278e-03 -1.5049726506319449e-02 -1.5007728278488021e-02 3.7288921027267808e-03 -6.9780090624548541e-03 -5.0851218216770560e-03 2.5104382210234398e-03 3.1330657245952865e-03 8.0130171225349031e-03 -1.2390864475311089e-03 5.0098245274789255e-03 5.1725849462730851e-03 1.0890635018247540e-03 -1.4107847014700026e-02 -9.2529943512369307e-03 5.8576246713981789e-03 -4.9710455797789465e-03 -3.6781727492691443e-02 -1.0812771935808225e-02 1.7045485340725773e-02 1.8760197467362474e-02 -1.1301997743358834e-02 6.4323132209254553e-03 5.8107182410866723e-02 -1.6038922420200975e-02 -1.7314994454900531e-02 -2.1022280428842501e-02 -8.5850458871676409e-03 -5.0177395564441410e-03 -3.6298932203394710e-02 1.4222139914335984e-02 2.0281634042236922e-02 7.1768754766795093e-03 1.3522937357969490e-02 4.9496637684412256e-03 3.2478558076897202e-02 5.7782489127729247e-03 -2.1405316781205757e-02 -2.2419873306877267e-02 1.3215411801457267e-02 7.6964193608588301e-04 4.5305031427247790e-03 8.5019341211155209e-04 -8.5045174899495979e-03 -9.8805336272467723e-03 1.3824539471972931e-02 -2.7981061602586274e-03 -1.6038922420200975e-02 3.1524188830705645e-02 5.4741813260311273e-03 -6.1221090026752443e-03 1.8872582239274163e-04 2.5600812177886587e-03 1.4691459502318583e-02 -1.3019357637647612e-02 -9.2124269451833024e-03 2.2840400822567004e-03 -1.0766119309587940e-02 3.3305377240828532e-04 1.0339012985410923e-03 -6.7794356749556898e-03 1.1378092343077576e-02 9.5016610242818419e-03 -1.5822734914991622e-02 9.6045931685073242e-03 1.3533612878447853e-02 9.6766821571613020e-03 -3.3183293948122125e-02 -1.0447500424477247e-02 5.3421403104521280e-03 -1.5049726506319454e-02 -1.7314994454900534e-02 5.4741813260311273e-03 5.2659781603691565e-02 1.0079138337732265e-02 1.8112684925723509e-02 1.3101718654336980e-03 1.9709940544532338e-02 -9.0164721831027337e-03 -2.9388966660275885e-02 -7.2382509075587572e-03 -1.6781862067634407e-02 -1.3366187709078752e-02 -1.8541081243184980e-02 -1.4422077707696820e-02 2.7413628186163629e-02 1.0219135269409069e-02 1.6147232390658992e-03 1.3315357012444509e-02 1.4602399756485574e-02 1.1618726223755361e-02 -1.0101103217184266e-02 -1.1157996035332280e-02 1.6645417623927183e-03 -1.5007728278488021e-02 -2.1022280428842494e-02 -6.1221090026752443e-03 1.0079138337732265e-02 3.0666457396886820e-02 6.6931956751973207e-03 7.8346383211825611e-03 6.3328333051359516e-03 1.7348747683764549e-03 -8.7922323602931014e-03 -8.7787470781423276e-03 -6.4490222345180079e-03 -7.6255886427372514e-03 -1.8237074917714449e-02 -1.0244067570943857e-02 1.0297518827343307e-02 7.5944080015232064e-03 1.1038603784152572e-03 9.8400537720394043e-03 1.1044983073449246e-02 1.7743946642576423e-02 -9.1310619585178547e-03 -4.2306018973589151e-03 1.2062456489962329e-03 3.7288921027267804e-03 -8.5850458871676392e-03 1.8872582239274076e-04 1.8112684925723505e-02 6.6931956751973207e-03 3.9220332162652576e-02 -1.6286197954919000e-03 1.2942154347419292e-02 -1.1821971335940061e-02 -1.6248922908140666e-02 -5.1615652638078739e-03 -1.7779658285261336e-02 -7.2020216596135828e-03 -1.5065846556214461e-02 -2.1423073852017367e-02 2.5289955212743158e-03 2.3627265084830368e-03 -7.3345468033991952e-03 3.5517020031137245e-03 4.6508874710199143e-03 3.9933294857915247e-04 -1.4484420845054755e-02 -8.6890901864423668e-03 6.1802935561731344e-03 -6.9780090624548550e-03 -5.0177395564441419e-03 2.5600812177886587e-03 1.3101718654336971e-03 7.8346383211825611e-03 -1.6286197954918996e-03 2.9344095598733497e-02 5.9293390880244415e-03 -2.5632907937819106e-03 -1.4181681406169305e-02 -1.5273712888761381e-02 4.4969508074663364e-03 -8.0310136851172529e-03 -4.6942595093660919e-03 -1.8701396556673753e-03 9.4691555315152571e-03 1.5259937260787058e-02 -7.5746082850660940e-03 4.8838038498634989e-03 2.9093269953033796e-02 2.2847299686891342e-03 -2.0698078808361935e-02 -2.2207839602395214e-02 1.3558402521238199e-02 -5.0851218216770560e-03 -3.6298932203394710e-02 1.4691459502318581e-02 1.9709940544532338e-02 6.3328333051359499e-03 1.2942154347419292e-02 5.9293390880244450e-03 6.0980462170848758e-02 -1.5390435959367016e-02 -1.5571839535379401e-02 -1.9178242935257973e-02 -7.4504425524762000e-03 -4.4088143078326600e-03 -3.6587115485095439e-02 -1.0896073894712040e-02 1.5240770990830765e-02 1.7865564797124825e-02 -9.7397939331099470e-03 6.0637726842094840e-04 3.9258362191279851e-03 -8.0188778565468757e-03 1.0664052549167677e-02 8.8786251937545847e-03 -1.6655850947710805e-02 2.5104382210234403e-03 1.4222139914335985e-02 -1.3019357637647612e-02 -9.0164721831027354e-03 1.7348747683764553e-03 -1.1821971335940059e-02 -2.5632907937819110e-03 -1.5390435959367021e-02 3.5608152587585908e-02 4.4046104737568313e-03 -7.5462460001675478e-03 5.3919056963380946e-04 8.7576295815384726e-04 4.5276792349263160e-03 9.1151573047576614e-04 -7.4814784936380980e-03 -1.0352473370986754e-02 1.2457198890149859e-02 -1.4046149567714212e-02 -1.7915151758845702e-02 -1.3584628167810199e-02 2.7278133077043718e-02 9.7140999105095882e-03 9.3275158159391983e-04 3.1330657245952865e-03 2.0281634042236922e-02 -9.2124269451833024e-03 -2.9388966660275892e-02 -8.7922323602931014e-03 -1.6248922908140666e-02 -1.4181681406169301e-02 -1.5571839535379399e-02 4.4046104737568304e-03 5.0327935818450104e-02 8.7285621094777555e-03 1.8047020698889617e-02 9.7357380553708128e-03 1.4581813703505964e-02 1.0812745352165219e-02 -3.2858075041300519e-02 -1.1026886111212039e-02 4.8488499147285808e-03 -7.1421108736944103e-03 -1.7718325711837672e-02 -9.3083523336520597e-03 9.3765774695094249e-03 7.1581774935001374e-03 1.7773106103996048e-03 8.0130171225349031e-03 7.1768754766795085e-03 2.2840400822566999e-03 -7.2382509075587581e-03 -8.7787470781423276e-03 -5.1615652638078748e-03 -1.5273712888761379e-02 -1.9178242935257970e-02 -7.5462460001675495e-03 8.7285621094777572e-03 2.8105951578525360e-02 6.0590439268231417e-03 1.2457869668664441e-02 1.4021613642325421e-02 1.0708668766436771e-02 -8.9219517001719768e-03 -1.0787302465792457e-02 1.1871002117112648e-03 -7.4461502021895562e-03 -1.5008420379240647e-02 -2.1851540438993820e-02 3.1264072334118505e-03 1.8541745218110647e-03 -7.5984305346207363e-03 -1.2390864475311087e-03 1.3522937357969490e-02 -1.0766119309587941e-02 -1.6781862067634407e-02 -6.4490222345180079e-03 -1.7779658285261336e-02 4.4969508074663373e-03 -7.4504425524761992e-03 5.3919056963381033e-04 1.8047020698889617e-02 6.0590439268231426e-03 3.7949216087196848e-02 9.1986336411557547e-03 1.2296389491272510e-02 1.8397884204596607e-02 -9.4019136635684897e-03 -4.8246601316413538e-03 1.1094577070365646e-03 -6.5508814790641232e-03 -3.8092267935830610e-03 -2.7354687079717932e-03 2.9932749822081960e-03 7.5664584464343963e-03 3.1821729866675559e-03 5.0098245274789264e-03 4.9496637684412256e-03 3.3305377240828510e-04 -1.3366187709078752e-02 -7.6255886427372514e-03 -7.2020216596135837e-03 -8.0310136851172529e-03 -4.4088143078326592e-03 8.7576295815384704e-04 9.7357380553708128e-03 1.2457869668664441e-02 9.1986336411557547e-03 2.4340299179269363e-02 4.9069285528000042e-03 3.2629172382713763e-03 -1.4131053871067171e-02 -1.4037290692187097e-02 -6.9150502290714431e-03 -4.1550192319324128e-03 -3.0173710576286570e-02 -1.6785927865260775e-02 1.8645173784133887e-02 9.9557160863803455e-03 -8.4203144528837651e-03 5.1725849462730860e-03 3.2478558076897202e-02 1.0339012985410923e-03 -1.8541081243184980e-02 -1.8237074917714452e-02 -1.5065846556214462e-02 -4.6942595093660911e-03 -3.6587115485095432e-02 4.5276792349263160e-03 1.4581813703505966e-02 1.4021613642325421e-02 1.2296389491272510e-02 4.9069285528000051e-03 5.0877231156407257e-02 1.9162547101578244e-02 -1.5916141002229468e-02 -2.2335217982913772e-02 3.2515717480408393e-03 -3.1005424332813643e-03 -1.7500199588942150e-02 -1.7961087981083718e-02 1.2986876463073295e-02 1.7655620112016182e-03 -1.0705620161877349e-02 1.0890635018247546e-03 5.7782489127729247e-03 -6.7794356749556898e-03 -1.4422077707696820e-02 -1.0244067570943857e-02 -2.1423073852017364e-02 -1.8701396556673759e-03 -1.0896073894712041e-02 9.1151573047576755e-04 1.0812745352165219e-02 1.0708668766436773e-02 1.8397884204596607e-02 3.2629172382713763e-03 1.9162547101578241e-02 3.6919702769039518e-02 -8.7588427586890866e-03 1.2253142626084893e-03 6.4011496582221886e-04 1.6309486358644751e-03 1.8081286244077722e-02 1.2299497584112282e-02 -3.0121762014637784e-02 -1.0387702426792029e-02 1.3574888545538873e-02 -1.4107847014700026e-02 -2.1405316781205760e-02 1.1378092343077576e-02 2.7413628186163629e-02 1.0297518827343307e-02 2.5289955212743154e-03 9.4691555315152571e-03 1.5240770990830769e-02 -7.4814784936380998e-03 -3.2858075041300519e-02 -8.9219517001719751e-03 -9.4019136635684897e-03 -1.4131053871067171e-02 -1.5916141002229461e-02 -8.7588427586890848e-03 5.2705005588162129e-02 1.3011535848147435e-02 -1.4139239078107366e-02 7.4212901623238884e-03 8.6808390913152827e-03 2.1142377536760557e-03 -1.1594727386031378e-02 -1.0696420377750536e-02 6.5557838000215429e-03 -9.2529943512369324e-03 -2.2419873306877273e-02 9.5016610242818419e-03 1.0219135269409069e-02 7.5944080015232056e-03 2.3627265084830372e-03 1.5259937260787056e-02 1.7865564797124825e-02 -1.0352473370986754e-02 -1.1026886111212039e-02 -1.0787302465792459e-02 -4.8246601316413538e-03 -1.4037290692187100e-02 -2.2335217982913772e-02 1.2253142626084896e-03 1.3011535848147435e-02 3.2098002243370734e-02 -6.5825898464428548e-03 3.3920773898513407e-03 -8.0361652219218260e-03 -1.1443996320770349e-02 1.2915622377200904e-02 5.6006048618499962e-03 -1.2895408262982480e-02 5.8576246713981798e-03 1.3215411801457265e-02 -1.5822734914991626e-02 1.6147232390658992e-03 1.1038603784152574e-03 -7.3345468033991952e-03 -7.5746082850660940e-03 -9.7397939331099470e-03 1.2457198890149861e-02 4.8488499147285816e-03 1.1871002117112648e-03 1.1094577070365646e-03 -6.9150502290714448e-03 3.2515717480408384e-03 6.4011496582222147e-04 -1.4139239078107366e-02 -6.5825898464428557e-03 3.3289914739135007e-02 612 613 614 678 679 680 690 691 692 624 625 626 615 616 617 681 682 683 693 694 695 627 628 629 2.5536638095236718e-02 -7.1530233504984357e-04 -6.7415186672283045e-04 -7.9269056923244197e-03 -1.1328739374078313e-02 -7.3547617354240051e-03 -7.1145550841641703e-03 1.2032923508894157e-03 -1.7833211081349153e-04 3.1166834103380585e-03 1.0809498760981166e-02 6.8532557754900697e-03 3.2692658855404200e-03 -6.7162842336779824e-04 -7.0673079866572495e-05 -7.9509657449898241e-03 -5.1370001682827489e-03 -3.9109033466058866e-03 -5.6378289343133776e-03 1.0056910609944985e-03 5.9722343336980816e-04 -3.2923319353234002e-03 4.8341881279136273e-03 4.7383429305729091e-03 -7.1530233504984281e-04 5.2104439120964186e-02 1.7515755790303789e-02 -1.2326107416794194e-02 -2.5020622864035648e-02 1.3912515533756392e-03 1.4782882687334386e-03 -3.6012405630802415e-02 3.8310392989921883e-03 1.1173480168274338e-02 1.7361704651491065e-02 1.1658228560526760e-02 -7.0162349803233669e-04 2.9566039264105688e-02 3.6675824214777311e-03 -1.5723098555535858e-02 -2.0678157728410813e-02 -1.5080263197123092e-02 1.3926263344932101e-03 -2.9661629977095337e-02 -1.6569891371204251e-02 1.5421737033911240e-02 1.2340633163783267e-02 -6.4137030563487579e-03 -6.7415186672283034e-04 1.7515755790303785e-02 3.7083989222323657e-02 -7.8724151393525423e-03 6.1383545900543595e-04 4.4687795396665050e-05 3.1951356130619386e-04 -1.0442138835197306e-02 -1.3007105686364264e-04 6.7185288234925793e-03 1.2110988282334798e-02 1.5321737971848897e-02 1.8610276984732581e-04 2.8646340294626108e-03 -5.9890849017037260e-03 -1.0708199414645798e-02 -1.0796273447085752e-02 -1.9662910462383529e-02 8.2928977440281312e-04 -1.5933036361748476e-02 -1.6542981440981232e-02 1.1201331491672253e-02 4.0662350829249079e-03 -1.0125367127637095e-02 -7.9269056923244232e-03 -1.2326107416794194e-02 -7.8724151393525389e-03 4.3677643564901128e-02 1.4502254202484618e-02 -1.1947316862924173e-02 3.9661483848273402e-03 1.4101233556193676e-02 -5.7613935305538015e-03 -2.7874341874098235e-02 -1.2666873395027818e-02 -7.7532025727774598e-03 -8.1044277649999705e-03 -1.7849851610339012e-02 7.9278046137300356e-03 2.3114994176388202e-02 1.1916846342935807e-02 3.1386480066653826e-03 -2.0051328396365540e-03 1.6047094366483217e-02 1.1763430265637590e-02 -2.4847977955057481e-02 -1.3724596045936299e-02 1.0504445219574955e-02 -1.1328739374078313e-02 -2.5020622864035644e-02 6.1383545900543573e-04 1.4502254202484617e-02 3.2240017777073492e-02 -7.9939776575726970e-03 1.1309311768393697e-02 2.1901371099402829e-02 -9.8598379088502917e-03 -1.2998158937039268e-02 -1.4688666621433010e-02 -5.3380044078671007e-03 -6.0456721108015374e-03 -2.5070958465193818e-02 9.4514170495631766e-03 1.2082306039231085e-02 1.1281698621305666e-02 2.4346814088940481e-03 5.0364234905301442e-03 1.3636939698272295e-02 3.8062638555410697e-03 -1.2557725078720416e-02 -1.4279779245391828e-02 6.8856222012863583e-03 -7.3547617354240043e-03 1.3912515533756403e-03 4.4687795396665267e-05 -1.1947316862924171e-02 -7.9939776575726970e-03 2.9078330865573494e-02 -4.3508814034458523e-03 -1.1046636265083931e-02 1.1375855282517909e-02 4.2842821333278231e-03 2.3197389869511371e-03 2.1563555695169011e-04 3.0981575505366135e-03 1.2862448050130993e-02 -1.4257033620374233e-02 5.6753274355494606e-04 1.5117295701057836e-03 -5.7092716131717201e-03 4.6767649337520990e-03 -6.9328062645471070e-03 -9.3617551996256106e-03 1.1026222640622547e-02 7.8882520266401832e-03 -1.1386449067268194e-02 -7.1145550841641703e-03 1.4782882687334386e-03 3.1951356130619353e-04 3.9661483848273393e-03 1.1309311768393697e-02 -4.3508814034458523e-03 2.2408839169904743e-02 -6.2307743053400784e-04 4.3382755464662568e-04 -8.4719077774047125e-03 -1.2118534933711664e-02 4.8850234099374725e-03 -5.6621582204576682e-03 1.1649583760612462e-03 -4.0489424501780416e-04 -1.9321854572854178e-03 5.8422432452755668e-03 -3.5532337448876210e-03 4.5999920863356450e-03 -8.0897985134275241e-04 -1.3131848784592577e-04 -7.7941731017557624e-03 -6.2442094428755250e-03 2.8019633553069113e-03 1.2032923508894157e-03 -3.6012405630802415e-02 -1.0442138835197306e-02 1.4101233556193676e-02 2.1901371099402829e-02 -1.1046636265083931e-02 -6.2307743053400741e-04 5.5881181505077593e-02 -1.4177725959935940e-02 -1.4159787385388114e-02 -2.5074359541246889e-02 -6.9940764672144435e-03 7.3828792494715805e-04 -3.5216943293888289e-02 1.2705444846478281e-02 1.7656960198060706e-02 1.1909646809121667e-02 1.2132314094084841e-02 -8.7512943355076277e-04 3.2494847616889963e-02 5.3889091602277598e-03 -1.8041779780618061e-02 -2.5883338564554489e-02 1.2433909426640724e-02 -1.7833211081349164e-04 3.8310392989921883e-03 -1.3007105686364199e-04 -5.7613935305538006e-03 -9.8598379088502917e-03 1.1375855282517909e-02 4.3382755464662585e-04 -1.4177725959935940e-02 2.8402802683584475e-02 5.6805533834031925e-03 -5.0571899888099724e-03 -8.6513162746114239e-04 -2.3026689278146754e-04 1.3056627476867680e-02 -1.1223913649047044e-02 -8.4094759382237674e-03 6.7627848417831159e-04 -8.9917146058348524e-03 2.0347202856512136e-04 1.6057356629139161e-03 -4.7263011732145525e-03 8.2616155057575833e-03 9.9250729346441122e-03 -1.3841525853681145e-02 3.1166834103380581e-03 1.1173480168274335e-02 6.7185288234925776e-03 -2.7874341874098235e-02 -1.2998158937039265e-02 4.2842821333278231e-03 -8.4719077774047143e-03 -1.4159787385388110e-02 5.6805533834031917e-03 4.5784261748415503e-02 1.2511061362147613e-02 1.5166772697967222e-02 -3.2523683861512827e-03 1.7082122525594198e-02 -8.1736992164196387e-03 -2.4496808438330384e-02 -1.0070953013880449e-02 -1.4227874677749452e-02 -7.6950708935623405e-03 -1.5949498192367163e-02 -1.1290303413278264e-02 2.2889552210793394e-02 1.2411733472658849e-02 1.8417402692565495e-03 1.0809498760981166e-02 1.7361704651491065e-02 1.2110988282334798e-02 -1.2666873395027816e-02 -1.4688666621433010e-02 2.3197389869511376e-03 -1.2118534933711666e-02 -2.5074359541246885e-02 -5.0571899888099741e-03 1.2511061362147614e-02 3.2846888171982905e-02 8.9311259144859260e-03 5.6718781408081967e-03 1.0695660651835911e-02 3.0352550931898631e-04 -1.1204322843586844e-02 -1.1579769061729113e-02 -8.5525859543829352e-03 -5.3834564952610518e-03 -2.1430977313596257e-02 -1.1681796705992547e-02 1.2380749403650394e-02 1.1869519062695389e-02 1.6261939560946151e-03 6.8532557754900697e-03 1.1658228560526760e-02 1.5321737971848898e-02 -7.7532025727774598e-03 -5.3380044078671007e-03 2.1563555695168957e-04 4.8850234099374733e-03 -6.9940764672144417e-03 -8.6513162746114239e-04 1.5166772697967224e-02 8.9311259144859260e-03 3.6062785074101517e-02 -3.6371356481326202e-03 1.1477880017454549e-02 -1.0005087826614223e-02 -1.3700946555510640e-02 -7.4106004128218789e-03 -1.6037614583398828e-02 -3.6424523526976983e-03 -1.4725798375085470e-02 -1.9452478277056134e-02 1.8286852457236481e-03 2.4012451705216651e-03 -5.2398462883717738e-03 3.2692658855404196e-03 -7.0162349803233636e-04 1.8610276984732586e-04 -8.1044277649999705e-03 -6.0456721108015391e-03 3.0981575505366139e-03 -5.6621582204576682e-03 7.3828792494715805e-04 -2.3026689278146770e-04 -3.2523683861512822e-03 5.6718781408081958e-03 -3.6371356481326202e-03 2.6089416303586639e-02 -4.2936658783533242e-04 3.9276211706263834e-04 -8.3796572048885666e-03 -1.2623304458009691e-02 5.0191813664497023e-03 -7.3400514007477928e-03 9.9217153875152606e-04 2.3397603420175487e-04 3.3799807881182251e-03 1.2397629050172020e-02 -5.0627772971839494e-03 -6.7162842336779814e-04 2.9566039264105694e-02 2.8646340294626099e-03 -1.7849851610339012e-02 -2.5070958465193818e-02 1.2862448050130993e-02 1.1649583760612464e-03 -3.5216943293888289e-02 1.3056627476867680e-02 1.7082122525594198e-02 1.0695660651835913e-02 1.1477880017454549e-02 -4.2936658783533318e-04 5.8510946373917787e-02 -1.3729505461194169e-02 -1.3108942663124120e-02 -2.3800064848866861e-02 -6.5143146490416106e-03 1.6878060999373510e-03 -3.6121000925670624e-02 -1.0412778824100405e-02 1.2124902283073464e-02 2.1436321243760211e-02 -9.6049906395796417e-03 -7.0673079866572712e-05 3.6675824214777311e-03 -5.9890849017037312e-03 7.9278046137300374e-03 9.4514170495631766e-03 -1.4257033620374233e-02 -4.0489424501780416e-04 1.2705444846478281e-02 -1.1223913649047044e-02 -8.1736992164196387e-03 3.0352550931898609e-04 -1.0005087826614223e-02 3.9276211706263813e-04 -1.3729505461194171e-02 3.1975637403099222e-02 5.2327406670520313e-03 -5.9772918860037695e-03 -6.5581569076857962e-04 -1.7677256210698694e-04 3.8017779979976395e-03 -3.4962016948225194e-04 -4.7272682944337020e-03 -1.0222950477637877e-02 1.0504918454890847e-02 -7.9509657449898241e-03 -1.5723098555535858e-02 -1.0708199414645798e-02 2.3114994176388206e-02 1.2082306039231085e-02 5.6753274355494585e-04 -1.9321854572854182e-03 1.7656960198060706e-02 -8.4094759382237691e-03 -2.4496808438330388e-02 -1.1204322843586842e-02 -1.3700946555510640e-02 -8.3796572048885631e-03 -1.3108942663124118e-02 5.2327406670520313e-03 4.3629182610988360e-02 1.1691576527611604e-02 1.5393349047207100e-02 3.8644334319923842e-03 1.2192025340705388e-02 7.8017527390947979e-03 -2.7848993373874746e-02 -1.3586504043361963e-02 3.8232467114713252e-03 -5.1370001682827507e-03 -2.0678157728410813e-02 -1.0796273447085754e-02 1.1916846342935810e-02 1.1281698621305666e-02 1.5117295701057836e-03 5.8422432452755668e-03 1.1909646809121667e-02 6.7627848417831159e-04 -1.0070953013880453e-02 -1.1579769061729113e-02 -7.4106004128218798e-03 -1.2623304458009688e-02 -2.3800064848866858e-02 -5.9772918860037678e-03 1.1691576527611602e-02 2.9882802728054679e-02 8.6287055598744718e-03 1.0259714284884737e-02 1.7734537277871949e-02 1.1644998935134069e-02 -1.1879122760534825e-02 -1.4750693797347194e-02 1.7224531966187665e-03 -3.9109033466058858e-03 -1.5080263197123092e-02 -1.9662910462383529e-02 3.1386480066653804e-03 2.4346814088940464e-03 -5.7092716131717175e-03 -3.5532337448876202e-03 1.2132314094084841e-02 -8.9917146058348524e-03 -1.4227874677749452e-02 -8.5525859543829352e-03 -1.6037614583398828e-02 5.0191813664497023e-03 -6.5143146490416097e-03 -6.5581569076858070e-04 1.5393349047207102e-02 8.6287055598744718e-03 3.4666196500728212e-02 6.1195216660648918e-03 1.2832743648383316e-02 1.6537830906325070e-02 -7.9786883171441125e-03 -5.8812809106890459e-03 -1.4670045149577896e-04 -5.6378289343133776e-03 1.3926263344932104e-03 8.2928977440281312e-04 -2.0051328396365540e-03 5.0364234905301434e-03 4.6767649337520990e-03 4.5999920863356459e-03 -8.7512943355076331e-04 2.0347202856512152e-04 -7.6950708935623405e-03 -5.3834564952610509e-03 -3.6424523526976983e-03 -7.3400514007477937e-03 1.6878060999373520e-03 -1.7677256210698678e-04 3.8644334319923850e-03 1.0259714284884737e-02 6.1195216660648918e-03 2.2841904189771653e-02 -8.7262263132705615e-04 -7.5223966194698923e-04 -8.6282456398396185e-03 -1.1245361649706572e-02 -7.2575838260332502e-03 1.0056910609944976e-03 -2.9661629977095341e-02 -1.5933036361748476e-02 1.6047094366483213e-02 1.3636939698272295e-02 -6.9328062645471079e-03 -8.0897985134275241e-04 3.2494847616889970e-02 1.6057356629139178e-03 -1.5949498192367163e-02 -2.1430977313596257e-02 -1.4725798375085471e-02 9.9217153875152475e-04 -3.6121000925670631e-02 3.8017779979976408e-03 1.2192025340705386e-02 1.7734537277871949e-02 1.2832743648383318e-02 -8.7262263132705626e-04 5.0088928294139343e-02 1.8101076897234579e-02 -1.2605881631897643e-02 -2.6741644670811332e-02 1.2503067948515954e-03 5.9722343336980751e-04 -1.6569891371204251e-02 -1.6542981440981229e-02 1.1763430265637592e-02 3.8062638555410701e-03 -9.3617551996256106e-03 -1.3131848784592566e-04 5.3889091602277606e-03 -4.7263011732145491e-03 -1.1290303413278264e-02 -1.1681796705992547e-02 -1.9452478277056130e-02 2.3397603420175449e-04 -1.0412778824100405e-02 -3.4962016948225302e-04 7.8017527390947979e-03 1.1644998935134069e-02 1.6537830906325067e-02 -7.5223966194698944e-04 1.8101076897234575e-02 3.4820844413187432e-02 -8.2225209092327643e-03 -2.7678194684027440e-04 -9.2553905915273909e-04 -3.2923319353234011e-03 1.5421737033911240e-02 1.1201331491672252e-02 -2.4847977955057481e-02 -1.2557725078720416e-02 1.1026222640622547e-02 -7.7941731017557615e-03 -1.8041779780618057e-02 8.2616155057575833e-03 2.2889552210793394e-02 1.2380749403650394e-02 1.8286852457236476e-03 3.3799807881182255e-03 1.2124902283073459e-02 -4.7272682944337003e-03 -2.7848993373874743e-02 -1.1879122760534823e-02 -7.9786883171441125e-03 -8.6282456398396237e-03 -1.2605881631897643e-02 -8.2225209092327643e-03 4.6142189006939387e-02 1.5157120531135855e-02 -1.1389377362965449e-02 4.8341881279136273e-03 1.2340633163783267e-02 4.0662350829249079e-03 -1.3724596045936300e-02 -1.4279779245391828e-02 7.8882520266401850e-03 -6.2442094428755250e-03 -2.5883338564554485e-02 9.9250729346441104e-03 1.2411733472658851e-02 1.1869519062695386e-02 2.4012451705216651e-03 1.2397629050172020e-02 2.1436321243760204e-02 -1.0222950477637879e-02 -1.3586504043361963e-02 -1.4750693797347194e-02 -5.8812809106890450e-03 -1.1245361649706574e-02 -2.6741644670811332e-02 -2.7678194684027397e-04 1.5157120531135857e-02 3.6008982807865991e-02 -7.8997918795636630e-03 4.7383429305729091e-03 -6.4137030563487570e-03 -1.0125367127637097e-02 1.0504445219574957e-02 6.8856222012863583e-03 -1.1386449067268194e-02 2.8019633553069117e-03 1.2433909426640724e-02 -1.3841525853681145e-02 1.8417402692565493e-03 1.6261939560946149e-03 -5.2398462883717746e-03 -5.0627772971839494e-03 -9.6049906395796417e-03 1.0504918454890846e-02 3.8232467114713248e-03 1.7224531966187663e-03 -1.4670045149577917e-04 -7.2575838260332494e-03 1.2503067948515965e-03 -9.2553905915273779e-04 -1.1389377362965445e-02 -7.8997918795636647e-03 3.1160509392715873e-02 678 679 680 726 727 728 738 739 740 690 691 692 681 682 683 729 730 731 741 742 743 693 694 695 2.9067148431471287e-02 -3.8468441963099341e-04 -5.0691235802623582e-04 -1.0282427210815933e-02 -1.3098337935213460e-02 -8.1317548649208222e-03 -8.2157032355320275e-03 1.0157841837535662e-03 -1.7646234304754307e-04 4.2642167850609125e-03 1.2361503932989454e-02 7.7618699725337144e-03 3.9778688074291017e-03 -3.7963868561040109e-04 -7.6010098970819874e-05 -9.3928994084548530e-03 -5.9371562850667435e-03 -4.4572291782790903e-03 -6.2684476282145740e-03 8.3422779461695003e-04 4.5774548758224012e-04 -3.1497565409439160e-03 5.5883014141616290e-03 5.1287533831285582e-03 -3.8468441963099379e-04 5.9091527503449641e-02 1.9430368773236215e-02 -1.3745012266374951e-02 -2.9708911622263544e-02 1.1597899736672907e-03 1.2256782043293425e-03 -4.0781188068604209e-02 4.2096395618288294e-03 1.2415386539084954e-02 2.0360013837363158e-02 1.3092080725256697e-02 -5.7999310403876795e-04 3.3655820106773753e-02 4.1997265857528273e-03 -1.7723691715681288e-02 -2.3728423001058273e-02 -1.6681168240225291e-02 1.3650288335359669e-03 -3.3327793704639792e-02 -1.8353424604079720e-02 1.7427287928775737e-02 1.4438954948979274e-02 -7.0570127754368507e-03 -5.0691235802623582e-04 1.9430368773236215e-02 4.1673584986632435e-02 -8.4824217818314368e-03 6.3415330943769502e-04 -1.3353293037029819e-03 2.5531569784480504e-04 -1.1531228145237866e-02 -6.4951565040659298e-04 7.3991666574819721e-03 1.3597605032212185e-02 1.7361004030446596e-02 1.5406941057733844e-04 3.1271449596945691e-03 -6.0764678888257156e-03 -1.1977286607816591e-02 -1.2190054796003803e-02 -2.1874274765386354e-02 7.8693502838767654e-04 -1.7713985788971622e-02 -1.8224161680517034e-02 1.2371133953382473e-02 4.6459966556326353e-03 -1.0874839728240363e-02 -1.0282427210815934e-02 -1.3745012266374949e-02 -8.4824217818314368e-03 4.9629309609660659e-02 1.6731842732795852e-02 -1.3097623927860002e-02 5.1852725760919826e-03 1.5689600635504942e-02 -6.3865253240926326e-03 -3.1529853901580931e-02 -1.4586622120432196e-02 -8.6521333665454600e-03 -9.4994599991249477e-03 -2.0070891479747111e-02 8.7200328490547908e-03 2.6324971464615505e-02 1.3639401259242390e-02 3.3341462642320794e-03 -1.8883851748720450e-03 1.8004109594554792e-02 1.2985348737010264e-02 -2.7939427363974298e-02 -1.5662428355543722e-02 1.1579176550032400e-02 -1.3098337935213460e-02 -2.9708911622263547e-02 6.3415330943769545e-04 1.6731842732795855e-02 3.7544939714868282e-02 -9.0106833385806776e-03 1.3002751785455459e-02 2.5518986022975861e-02 -1.1061421400783727e-02 -1.4923614283415593e-02 -1.7360456394464950e-02 -6.0696370339963935e-03 -6.9062166620812958e-03 -2.8914020938474928e-02 1.0493859346937097e-02 1.3983372637075492e-02 1.3486834214136531e-02 2.7201743784457657e-03 5.7133849959126867e-03 1.5968871870902377e-02 4.4825640784413295e-03 -1.4503183270529144e-02 -1.6536242867679633e-02 7.8109906600989099e-03 -8.1317548649208239e-03 1.1597899736672914e-03 -1.3353293037029824e-03 -1.3097623927860002e-02 -9.0106833385806759e-03 3.3004008078733112e-02 -4.9667563898634255e-03 -1.2176044519992291e-02 1.2919906760377497e-02 4.6245841182786804e-03 2.5260683783305060e-03 -4.0324428377308714e-04 3.5130378610170351e-03 1.4329018432686752e-02 -1.5946218641252660e-02 7.6817984249493505e-04 1.8386765632095749e-03 -5.6379504760080724e-03 5.1078964345037834e-03 -7.5302605794661769e-03 -9.9934404589814910e-03 1.2182436926349816e-02 8.8634350901450262e-03 -1.2607731675392321e-02 -8.2157032355320275e-03 1.2256782043293421e-03 2.5531569784480510e-04 5.1852725760919817e-03 1.3002751785455459e-02 -4.9667563898634255e-03 2.5355374833614861e-02 -2.2820050535354774e-04 3.0088877159432443e-04 -1.0519104544841411e-02 -1.3865567430673307e-02 5.2237746379069456e-03 -6.3219945901773246e-03 8.8702837787155468e-04 -2.6281518179507824e-04 -1.6433591845218783e-03 6.6972082933206868e-03 -3.7467192700163091e-03 5.2563337231871007e-03 -5.4076705850488686e-04 -1.0300116570152219e-05 -9.0968195778213037e-03 -7.1781316664453008e-03 3.2066118508988894e-03 1.0157841837535660e-03 -4.0781188068604209e-02 -1.1531228145237866e-02 1.5689600635504942e-02 2.5518986022975861e-02 -1.2176044519992293e-02 -2.2820050535354765e-04 6.3123839746981880e-02 -1.5720819314247597e-02 -1.5838238775094271e-02 -2.9356305168091290e-02 -7.7487811223137327e-03 6.5280243089835418e-04 -3.9658450669756935e-02 1.3956386118928445e-02 1.9919087511669327e-02 1.3942873531949618e-02 1.3373793939594186e-02 -7.7980617134470933e-04 3.6692567994894523e-02 6.0830896008969597e-03 -2.0431029310033665e-02 -2.9482323390349455e-02 1.3763603442371904e-02 -1.7646234304754285e-04 4.2096395618288294e-03 -6.4951565040659211e-04 -6.3865253240926317e-03 -1.1061421400783727e-02 1.2919906760377495e-02 3.0088877159432454e-04 -1.5720819314247597e-02 3.1932294389165498e-02 6.1761463916520922e-03 -5.5581068867754588e-03 -1.8419346891325986e-03 -1.7410735210529230e-04 1.4565480949385189e-02 -1.2384006157815881e-02 -9.2734043129641223e-03 6.3268504135490357e-04 -9.6295450425374612e-03 2.7613251723655155e-04 1.7266237446489328e-03 -4.9389435165379794e-03 9.2573316517266264e-03 1.1205918304588934e-02 -1.5408256093112483e-02 4.2642167850609116e-03 1.2415386539084953e-02 7.3991666574819721e-03 -3.1529853901580925e-02 -1.4923614283415593e-02 4.6245841182786795e-03 -1.0519104544841411e-02 -1.5838238775094271e-02 6.1761463916520922e-03 5.1409619620914546e-02 1.4411313069090683e-02 1.6823473323718939e-02 -3.2106771162894558e-03 1.9190530918349109e-02 -8.9330471614398298e-03 -2.7472276149806643e-02 -1.1520873205378767e-02 -1.5599747531946222e-02 -8.7740727804043166e-03 -1.7920356651444317e-02 -1.2464218144951368e-02 2.5832148086947310e-02 1.4185852388808203e-02 1.9736423472057371e-03 1.2361503932989456e-02 2.0360013837363158e-02 1.3597605032212185e-02 -1.4586622120432196e-02 -1.7360456394464950e-02 2.5260683783305060e-03 -1.3865567430673307e-02 -2.9356305168091287e-02 -5.5581068867754588e-03 1.4411313069090683e-02 3.7541519446038951e-02 1.0213478879786693e-02 6.4160926766959258e-03 1.2737982543109568e-02 2.6565968843141941e-04 -1.2941324778009662e-02 -1.3365391471906659e-02 -9.6734938272469845e-03 -6.0652215130885100e-03 -2.4459700735472233e-02 -1.3105060583360199e-02 1.4269826163427615e-02 1.3902337943423448e-02 1.7338493186218383e-03 7.7618699725337135e-03 1.3092080725256697e-02 1.7361004030446596e-02 -8.6521333665454583e-03 -6.0696370339963935e-03 -4.0324428377308931e-04 5.2237746379069465e-03 -7.7487811223137335e-03 -1.8419346891325951e-03 1.6823473323718932e-02 1.0213478879786693e-02 4.0468339278675262e-02 -3.9040209785908405e-03 1.2771667398253150e-02 -1.0739495813571360e-02 -1.5341286655780646e-02 -8.4794683552777850e-03 -1.7750925047537822e-02 -4.1659160039515504e-03 -1.6552213546621678e-02 -2.1585606013577577e-02 2.2542390707089009e-03 2.7728730549130567e-03 -5.5081374615294203e-03 3.9778688074291026e-03 -5.7999310403876816e-04 1.5406941057733844e-04 -9.4994599991249477e-03 -6.9062166620812958e-03 3.5130378610170347e-03 -6.3219945901773246e-03 6.5280243089835396e-04 -1.7410735210529241e-04 -3.2106771162894558e-03 6.4160926766959267e-03 -3.9040209785908379e-03 2.8994940002719283e-02 -2.4250429156030915e-04 3.2826623370748508e-04 -9.8832363110695383e-03 -1.4130422891188141e-02 5.4904907406588465e-03 -8.1038062896009195e-03 9.8527325965620154e-04 1.5118642717415037e-04 4.0463654961137938e-03 1.3804968581618032e-02 -5.5589223424387249e-03 -3.7963868561040033e-04 3.3655820106773746e-02 3.1271449596945687e-03 -2.0070891479747114e-02 -2.8914020938474925e-02 1.4329018432686752e-02 8.8702837787155478e-04 -3.9658450669756935e-02 1.4565480949385189e-02 1.9190530918349106e-02 1.2737982543109568e-02 1.2771667398253150e-02 -2.4250429156030909e-04 6.5597629371584282e-02 -1.5163082792556714e-02 -1.4996184492724114e-02 -2.7424448989438934e-02 -7.1498547277109494e-03 1.6413061943360240e-03 -4.0536584383498553e-02 -1.1658304293108719e-02 1.3970353459085257e-02 2.4542072959701761e-02 -1.0822069926643281e-02 -7.6010098970819928e-05 4.1997265857528282e-03 -6.0764678888257182e-03 8.7200328490547926e-03 1.0493859346937097e-02 -1.5946218641252660e-02 -2.6281518179507840e-04 1.3956386118928443e-02 -1.2384006157815878e-02 -8.9330471614398298e-03 2.6565968843141898e-04 -1.0739495813571361e-02 3.2826623370748529e-04 -1.5163082792556709e-02 3.5315754146764203e-02 5.6980128187512722e-03 -6.6153829097118644e-03 -1.3064252639758134e-03 -1.3275034185268500e-04 4.1779125793866409e-03 -5.0081083604371860e-04 -5.3416891174551378e-03 -1.1315078617167856e-02 1.1637670454720953e-02 -9.3928994084548547e-03 -1.7723691715681285e-02 -1.1977286607816591e-02 2.6324971464615505e-02 1.3983372637075492e-02 7.6817984249493527e-04 -1.6433591845218783e-03 1.9919087511669327e-02 -9.2734043129641223e-03 -2.7472276149806643e-02 -1.2941324778009662e-02 -1.5341286655780646e-02 -9.8832363110695348e-03 -1.4996184492724119e-02 5.6980128187512722e-03 4.8942664140426126e-02 1.3443195761922171e-02 1.7043914232664565e-02 4.4708131238451214e-03 1.3911178554762101e-02 8.8246913319918983e-03 -3.1346677675033838e-02 -1.5595633479014034e-02 4.2571793506586911e-03 -5.9371562850667444e-03 -2.3728423001058273e-02 -1.2190054796003803e-02 1.3639401259242394e-02 1.3486834214136531e-02 1.8386765632095741e-03 6.6972082933206859e-03 1.3942873531949618e-02 6.3268504135490357e-04 -1.1520873205378767e-02 -1.3365391471906659e-02 -8.4794683552777850e-03 -1.4130422891188141e-02 -2.7424448989438934e-02 -6.6153829097118644e-03 1.3443195761922168e-02 3.3782958587329458e-02 9.7687982289067291e-03 1.1410129790280275e-02 2.0226805612135360e-02 1.3023913502688389e-02 -1.3601482723131865e-02 -1.6921208483147102e-02 2.0208327248338615e-03 -4.4572291782790903e-03 -1.6681168240225291e-02 -2.1874274765386354e-02 3.3341462642320786e-03 2.7201743784457657e-03 -5.6379504760080698e-03 -3.7467192700163091e-03 1.3373793939594186e-02 -9.6295450425374612e-03 -1.5599747531946224e-02 -9.6734938272469845e-03 -1.7750925047537822e-02 5.4904907406588448e-03 -7.1498547277109512e-03 -1.3064252639758134e-03 1.7043914232664565e-02 9.7687982289067291e-03 3.8379593255246820e-02 6.7785027453561566e-03 1.4307230833306980e-02 1.8201602806741258e-02 -8.8433580026700195e-03 -6.6654805850704405e-03 -3.8207546654255345e-04 -6.2684476282145740e-03 1.3650288335359671e-03 7.8693502838767665e-04 -1.8883851748720457e-03 5.7133849959126876e-03 5.1078964345037834e-03 5.2563337231871007e-03 -7.7980617134470868e-04 2.7613251723655145e-04 -8.7740727804043166e-03 -6.0652215130885100e-03 -4.1659160039515513e-03 -8.1038062896009195e-03 1.6413061943360229e-03 -1.3275034185268500e-04 4.4708131238451222e-03 1.1410129790280275e-02 6.7785027453561566e-03 2.4977904070510506e-02 -8.1122702214458204e-04 -7.0561659571195053e-04 -9.6703390444508666e-03 -1.2473595107487148e-02 -7.9451837839679823e-03 8.3422779461695025e-04 -3.3327793704639792e-02 -1.7713985788971622e-02 1.8004109594554788e-02 1.5968871870902377e-02 -7.5302605794661751e-03 -5.4076705850488664e-04 3.6692567994894523e-02 1.7266237446489324e-03 -1.7920356651444314e-02 -2.4459700735472233e-02 -1.6552213546621678e-02 9.8527325965620241e-04 -4.0536584383498553e-02 4.1779125793866409e-03 1.3911178554762101e-02 2.0226805612135360e-02 1.4307230833306980e-02 -8.1122702214458324e-04 5.5624986197107790e-02 2.0110795417278924e-02 -1.4462438471496268e-02 -3.0189152851429483e-02 1.4738973404380025e-03 4.5774548758224049e-04 -1.8353424604079720e-02 -1.8224161680517038e-02 1.2985348737010266e-02 4.4825640784413303e-03 -9.9934404589814892e-03 -1.0300116570152273e-05 6.0830896008969605e-03 -4.9389435165379802e-03 -1.2464218144951369e-02 -1.3105060583360199e-02 -2.1585606013577577e-02 1.5118642717415001e-04 -1.1658304293108719e-02 -5.0081083604371838e-04 8.8246913319919001e-03 1.3023913502688387e-02 1.8201602806741258e-02 -7.0561659571195085e-04 2.0110795417278924e-02 3.8124268883740070e-02 -9.2388371265250888e-03 -5.8357311875696909e-04 -1.0829091848235176e-03 -3.1497565409439165e-03 1.7427287928775737e-02 1.2371133953382475e-02 -2.7939427363974298e-02 -1.4503183270529144e-02 1.2182436926349818e-02 -9.0968195778213020e-03 -2.0431029310033669e-02 9.2573316517266264e-03 2.5832148086947310e-02 1.4269826163427616e-02 2.2542390707088996e-03 4.0463654961137938e-03 1.3970353459085261e-02 -5.3416891174551369e-03 -3.1346677675033838e-02 -1.3601482723131868e-02 -8.8433580026700195e-03 -9.6703390444508666e-03 -1.4462438471496268e-02 -9.2388371265250905e-03 5.1324506619163129e-02 1.7330666223902343e-02 -1.2641257355517570e-02 5.5883014141616290e-03 1.4438954948979274e-02 4.6459966556326353e-03 -1.5662428355543722e-02 -1.6536242867679636e-02 8.8634350901450280e-03 -7.1781316664453008e-03 -2.9482323390349459e-02 1.1205918304588933e-02 1.4185852388808201e-02 1.3902337943423448e-02 2.7728730549130536e-03 1.3804968581618034e-02 2.4542072959701761e-02 -1.1315078617167854e-02 -1.5595633479014034e-02 -1.6921208483147102e-02 -6.6654805850704405e-03 -1.2473595107487148e-02 -3.0189152851429479e-02 -5.8357311875696909e-04 1.7330666223902343e-02 4.0245561740501201e-02 -8.9240907842843865e-03 5.1287533831285582e-03 -7.0570127754368507e-03 -1.0874839728240363e-02 1.1579176550032400e-02 7.8109906600989099e-03 -1.2607731675392321e-02 3.2066118508988898e-03 1.3763603442371904e-02 -1.5408256093112483e-02 1.9736423472057367e-03 1.7338493186218377e-03 -5.5081374615294229e-03 -5.5589223424387241e-03 -1.0822069926643281e-02 1.1637670454720951e-02 4.2571793506586903e-03 2.0208327248338615e-03 -3.8207546654255476e-04 -7.9451837839679823e-03 1.4738973404380034e-03 -1.0829091848235167e-03 -1.2641257355517575e-02 -8.9240907842843865e-03 3.4226279154919707e-02 624 625 626 690 691 692 702 703 704 636 637 638 627 628 629 693 694 695 705 706 707 639 640 641 2.7741640078416084e-02 -6.1166554741805719e-03 -4.1279432744430909e-03 -4.7683511576631201e-03 -7.7273870997050138e-03 -7.5835838698578729e-03 -9.2361259159806711e-03 6.9654082043565657e-03 -9.2620344412717461e-04 -8.9486597278966296e-04 7.6807175516937758e-03 4.4211454341758268e-03 5.6044051819925849e-03 -5.8501272333758595e-03 -7.0448706455356199e-04 -4.4213058453654083e-03 -2.0285024060425396e-03 -8.3525285712779504e-04 -7.2669185794166881e-03 5.8393653166851130e-03 3.8703736706897237e-03 -6.7584777891931212e-03 1.2371811405685309e-03 5.8859514052439429e-03 -6.1166554741805736e-03 5.3376294123148253e-02 1.7266024198642062e-02 -8.9477701191012851e-03 -3.1369124459287190e-02 -3.3572986291383641e-04 7.0851037457022011e-03 -3.6396087418626155e-02 3.6612844752189925e-03 8.0809115431154169e-03 2.2031239309367574e-02 1.3138760413350702e-02 -5.8658629465373835e-03 3.0995339502415644e-02 3.6926509359182713e-03 -1.3218001256240973e-02 -2.5680538089719065e-02 -1.5914895115849950e-02 6.3549893277171530e-03 -2.9816163963445799e-02 -1.6368935326503593e-02 1.2627285179525457e-02 1.6859040996146740e-02 -5.1391597178626512e-03 -4.1279432744430909e-03 1.7266024198642066e-02 3.7326122421518573e-02 -8.0043673975117025e-03 -1.2756826781973082e-03 -1.7213742500525354e-03 2.2445397410832376e-03 -1.0215107687230780e-02 -1.1012534106035182e-03 4.1680965778427481e-03 1.3370158519244925e-02 1.5010060976926209e-02 -2.5073207423526999e-04 3.0613061970893654e-03 -4.3133024921290942e-03 -8.4556351772271648e-03 -1.2933561900686385e-02 -1.9586225593175147e-02 4.0040820904338366e-03 -1.5535222031188272e-02 -1.6309225383030881e-02 1.0421959514057413e-02 6.2620853823263890e-03 -9.3048022694536096e-03 -4.7683511576631175e-03 -8.9477701191012886e-03 -8.0043673975117042e-03 4.0180492509762383e-02 1.6902645979994923e-02 -9.9720145144950659e-03 -3.7912748718906458e-04 1.0502284487367784e-02 -3.9118423059005952e-03 -2.4364569535259964e-02 -1.5285588188532210e-02 -7.0749049349849366e-03 -4.3506577373809375e-03 -1.4863338214930105e-02 6.0175238912795392e-03 2.0350387848628960e-02 1.4328211739694605e-02 3.0606988892313419e-03 -5.6415678198507482e-03 1.3194881863052140e-02 1.1032095396281463e-02 -2.1026606621047512e-02 -1.5831327547545845e-02 8.8528109760999570e-03 -7.7273870997050156e-03 -3.1369124459287197e-02 -1.2756826781973069e-03 1.6902645979994923e-02 4.0270616569071285e-02 -9.8158670106957731e-03 7.5319582654880908e-03 2.7268991048822057e-02 -1.0552600534684388e-02 -1.5461720995872638e-02 -2.1671451302592674e-02 -7.0909405494393998e-03 -2.3668118517986420e-03 -3.0522333052821180e-02 1.0556786275648962e-02 1.4463013627336639e-02 1.8437814928269874e-02 3.2967537322532744e-03 1.3445228165805700e-03 1.8389354660998641e-02 6.2968043877553708e-03 -1.4686220742023937e-02 -2.0803868392460810e-02 8.5847463773592574e-03 -7.5835838698578729e-03 -3.3572986291383554e-04 -1.7213742500525354e-03 -9.9720145144950693e-03 -9.8158670106957748e-03 2.9116272461742719e-02 -2.2665005120450299e-03 -1.1229084098848013e-02 1.0783693017717328e-02 3.3272282751079102e-03 2.7841197750141915e-03 -1.0690881352270691e-03 7.0433507457314524e-04 1.2809847206178612e-02 -1.3790232187806107e-02 6.9117923727507967e-04 1.7869796489338751e-03 -3.9153482607001168e-03 6.0081092009768317e-03 -5.4950394484693330e-03 -8.4292895928275904e-03 9.0912471084650080e-03 9.4947737908002792e-03 -1.0974633052846620e-02 -9.2361259159806711e-03 7.0851037457022028e-03 2.2445397410832376e-03 -3.7912748718906247e-04 7.5319582654880908e-03 -2.2665005120450295e-03 2.4444105265546776e-02 -6.9944134306666548e-03 3.0054125091865920e-03 -4.7320740249423843e-03 -8.4882114865346865e-03 6.0458280751549808e-03 -7.1816426065492087e-03 6.8402910740955319e-03 -2.6884414263584093e-03 -5.6377484446535212e-03 2.4858092454457630e-03 -5.7639079053441906e-03 6.6513364207116234e-03 -6.2770303983640235e-03 -1.1025216144106144e-03 -3.9287232069435511e-03 -2.1835070151662202e-03 5.2559113273343313e-04 6.9654082043565640e-03 -3.6396087418626155e-02 -1.0215107687230780e-02 1.0502284487367784e-02 2.7268991048822057e-02 -1.1229084098848013e-02 -6.9944134306666548e-03 5.6310879233163205e-02 -1.3540867993089451e-02 -1.0481377630097618e-02 -3.1210032487703265e-02 -6.0857769074362349e-03 6.2355876632419118e-03 -3.5261033930588936e-02 1.2028509639178966e-02 1.4841623513441957e-02 1.7294757513906339e-02 1.1366777128866462e-02 -6.3621558482812434e-03 3.3002675032354337e-02 5.3287032111094691e-03 -1.4706956959362714e-02 -3.1010148991327563e-02 1.2346846707449580e-02 -9.2620344412717450e-04 3.6612844752189921e-03 -1.1012534106035182e-03 -3.9118423059005952e-03 -1.0552600534684388e-02 1.0783693017717326e-02 3.0054125091865920e-03 -1.3540867993089447e-02 2.8469874908403227e-02 6.4301545923345386e-03 -4.1210242078037118e-03 -1.8993126734616213e-03 -2.5645899028540332e-03 1.2609640027791521e-02 -1.0871891370357874e-02 -8.2413041076801821e-03 -9.4372823094521663e-04 -8.3062774429027604e-03 -1.5928474865588163e-05 1.7835696625619283e-03 -3.5988503073436850e-03 6.2243011339064465e-03 1.1103726800950323e-02 -1.3475982721451093e-02 -8.9486597278966371e-04 8.0809115431154169e-03 4.1680965778427490e-03 -2.4364569535259964e-02 -1.5461720995872640e-02 3.3272282751079111e-03 -4.7320740249423843e-03 -1.0481377630097616e-02 6.4301545923345386e-03 4.2285525146652750e-02 1.4834499004315892e-02 1.3418456761367520e-02 -6.7793593945113927e-03 1.4354476894624603e-02 -7.9111507865065375e-03 -2.0959605910260779e-02 -1.2571456821537014e-02 -1.2503771457695968e-02 -4.0591431123646309e-03 -1.3177410104795759e-02 -8.8263440318067567e-03 1.9504092803476081e-02 1.4422078110247113e-02 1.8973300693565464e-03 7.6807175516937758e-03 2.2031239309367574e-02 1.3370158519244927e-02 -1.5285588188532212e-02 -2.1671451302592674e-02 2.7841197750141915e-03 -8.4882114865346865e-03 -3.1210032487703265e-02 -4.1210242078037126e-03 1.4834499004315892e-02 3.9828823839810831e-02 1.2030179873241198e-02 2.4178247745384679e-03 1.5790895713384288e-02 -1.0718640974992364e-03 -1.3605778893127682e-02 -1.7163878828093445e-02 -1.1385207759638102e-02 -1.9351563710110929e-03 -2.6132221754299419e-02 -1.3857330363414185e-02 1.4381693608657545e-02 1.8526625510126096e-02 2.2509682608549244e-03 4.4211454341758268e-03 1.3138760413350700e-02 1.5010060976926209e-02 -7.0749049349849366e-03 -7.0909405494393998e-03 -1.0690881352270688e-03 6.0458280751549808e-03 -6.0857769074362340e-03 -1.8993126734616224e-03 1.3418456761367520e-02 1.2030179873241198e-02 3.6886208620086319e-02 -5.6198074777517610e-03 1.0869421907239404e-02 -9.3459426068368389e-03 -1.2271483128974218e-02 -1.0327831400129399e-02 -1.6171422720798627e-02 -6.4801006997003592e-04 -1.5431721122920532e-02 -1.9449362747446533e-02 1.7287753409826316e-03 2.8979077860942660e-03 -3.9611407132418321e-03 5.6044051819925849e-03 -5.8658629465373853e-03 -2.5073207423526934e-04 -4.3506577373809375e-03 -2.3668118517986415e-03 7.0433507457314556e-04 -7.1816426065492087e-03 6.2355876632419101e-03 -2.5645899028540332e-03 -6.7793593945113927e-03 2.4178247745384675e-03 -5.6198074777517619e-03 2.8170382545262902e-02 -6.5209541795669089e-03 2.8271515616520556e-03 -5.2800895396035545e-03 -9.2549200045328062e-03 5.9815566890154227e-03 -9.4686983180130874e-03 6.5320261557666060e-03 2.1417327421158097e-03 -7.1434013119730687e-04 8.8231103888887601e-03 -3.2196466125153696e-03 -5.8501272333758578e-03 3.0995339502415644e-02 3.0613061970893671e-03 -1.4863338214930105e-02 -3.0522333052821184e-02 1.2809847206178612e-02 6.8402910740955301e-03 -3.5261033930588936e-02 1.2609640027791521e-02 1.4354476894624603e-02 1.5790895713384288e-02 1.0869421907239406e-02 -6.5209541795669098e-03 5.9750934487325269e-02 -1.3068245554675713e-02 -9.9064038508245265e-03 -3.0779605330295421e-02 -5.7071590227892634e-03 7.4274118848068312e-03 -3.6545378412566949e-02 -1.0379886243937288e-02 8.5186436251704460e-03 2.6571181023147292e-02 -1.0194924516896634e-02 -7.0448706455356243e-04 3.6926509359182713e-03 -4.3133024921290933e-03 6.0175238912795392e-03 1.0556786275648962e-02 -1.3790232187806107e-02 -2.6884414263584093e-03 1.2028509639178966e-02 -1.0871891370357874e-02 -7.9111507865065357e-03 -1.0718640974992370e-03 -9.3459426068368389e-03 2.8271515616520556e-03 -1.3068245554675711e-02 3.2095915408051852e-02 6.1087676788455208e-03 -5.0269406879155454e-03 -2.3061003699390292e-03 -9.3418542082155016e-04 3.4323191490277039e-03 -1.3919038114134875e-03 -2.7151784335370630e-03 -1.0543215659683410e-02 9.9234574304305680e-03 -4.4213058453654083e-03 -1.3218001256240971e-02 -8.4556351772271630e-03 2.0350387848628960e-02 1.4463013627336641e-02 6.9117923727507967e-04 -5.6377484446535212e-03 1.4841623513441961e-02 -8.2413041076801821e-03 -2.0959605910260779e-02 -1.3605778893127684e-02 -1.2271483128974218e-02 -5.2800895396035528e-03 -9.9064038508245231e-03 6.1087676788455191e-03 4.0494118670243183e-02 1.4422959236760215e-02 1.3677008423643730e-02 -1.6814256662389627e-04 9.0958288551458693e-03 5.4139852269645822e-03 -2.4377614212364992e-02 -1.6093241232491510e-02 3.0774818471526522e-03 -2.0285024060425387e-03 -2.5680538089719065e-02 -1.2933561900686383e-02 1.4328211739694605e-02 1.8437814928269874e-02 1.7869796489338756e-03 2.4858092454457630e-03 1.7294757513906339e-02 -9.4372823094521674e-04 -1.2571456821537010e-02 -1.7163878828093445e-02 -1.0327831400129399e-02 -9.2549200045328097e-03 -3.0779605330295421e-02 -5.0269406879155471e-03 1.4422959236760216e-02 3.6913466111147590e-02 1.1871072569818820e-02 7.0620311600047931e-03 2.2742874635736182e-02 1.3301726876266242e-02 -1.4444132149793027e-02 -2.1764890940952061e-02 2.2722831246576088e-03 -8.3525285712779526e-04 -1.5914895115849950e-02 -1.9586225593175147e-02 3.0606988892313437e-03 3.2967537322532753e-03 -3.9153482607001194e-03 -5.7639079053441906e-03 1.1366777128866462e-02 -8.3062774429027587e-03 -1.2503771457695968e-02 -1.1385207759638104e-02 -1.6171422720798627e-02 5.9815566890154227e-03 -5.7071590227892668e-03 -2.3061003699390292e-03 1.3677008423643730e-02 1.1871072569818820e-02 3.5363249151347004e-02 3.4744764501854542e-03 1.3984870771325774e-02 1.6342634555296377e-02 -7.0908082319079994e-03 -7.5122123039870160e-03 -1.4205093191276971e-03 -7.2669185794166881e-03 6.3549893277171513e-03 4.0040820904338366e-03 -5.6415678198507482e-03 1.3445228165805700e-03 6.0081092009768309e-03 6.6513364207116225e-03 -6.3621558482812434e-03 -1.5928474865588380e-05 -4.0591431123646309e-03 -1.9351563710110920e-03 -6.4801006997003592e-04 -9.4686983180130874e-03 7.4274118848068303e-03 -9.3418542082155016e-04 -1.6814256662389562e-04 7.0620311600047931e-03 3.4744764501854534e-03 2.5052468345881099e-02 -6.4308255933507022e-03 -4.3619128640105219e-03 -5.0993343703236681e-03 -7.4608173764663076e-03 -7.5266309119284263e-03 5.8393653166851130e-03 -2.9816163963445799e-02 -1.5535222031188272e-02 1.3194881863052140e-02 1.8389354660998641e-02 -5.4950394484693322e-03 -6.2770303983640235e-03 3.3002675032354330e-02 1.7835696625619275e-03 -1.3177410104795759e-02 -2.6132221754299412e-02 -1.5431721122920532e-02 6.5320261557666078e-03 -3.6545378412566942e-02 3.4323191490277035e-03 9.0958288551458676e-03 2.2742874635736182e-02 1.3984870771325772e-02 -6.4308255933507022e-03 5.0791871055327044e-02 1.7762822266262308e-02 -8.7768360941392499e-03 -3.2433011254104041e-02 -5.0159924659958551e-04 3.8703736706897237e-03 -1.6368935326503593e-02 -1.6309225383030881e-02 1.1032095396281463e-02 6.2968043877553725e-03 -8.4292895928275904e-03 -1.1025216144106137e-03 5.3287032111094691e-03 -3.5988503073436868e-03 -8.8263440318067567e-03 -1.3857330363414189e-02 -1.9449362747446526e-02 2.1417327421158093e-03 -1.0379886243937288e-02 -1.3919038114134869e-03 5.4139852269645830e-03 1.3301726876266242e-02 1.6342634555296373e-02 -4.3619128640105210e-03 1.7762822266262312e-02 3.5086397181803779e-02 -8.1674085258236894e-03 -2.0839048075383306e-03 -2.2503998950379822e-03 -6.7584777891931212e-03 1.2627285179525457e-02 1.0421959514057413e-02 -2.1026606621047515e-02 -1.4686220742023937e-02 9.0912471084650080e-03 -3.9287232069435511e-03 -1.4706956959362711e-02 6.2243011339064456e-03 1.9504092803476078e-02 1.4381693608657545e-02 1.7287753409826309e-03 -7.1434013119730773e-04 8.5186436251704443e-03 -2.7151784335370625e-03 -2.4377614212364989e-02 -1.4444132149793029e-02 -7.0908082319080011e-03 -5.0993343703236672e-03 -8.7768360941392516e-03 -8.1674085258236894e-03 4.2401003527594086e-02 1.7086523531965485e-02 -9.4928879061427444e-03 1.2371811405685312e-03 1.6859040996146737e-02 6.2620853823263881e-03 -1.5831327547545845e-02 -2.0803868392460810e-02 9.4947737908002792e-03 -2.1835070151662202e-03 -3.1010148991327563e-02 1.1103726800950323e-02 1.4422078110247117e-02 1.8526625510126096e-02 2.8979077860942669e-03 8.8231103888887601e-03 2.6571181023147292e-02 -1.0543215659683410e-02 -1.6093241232491510e-02 -2.1764890940952058e-02 -7.5122123039870151e-03 -7.4608173764663084e-03 -3.2433011254104041e-02 -2.0839048075383276e-03 1.7086523531965485e-02 4.4055072049424354e-02 -9.6191609889625020e-03 5.8859514052439421e-03 -5.1391597178626512e-03 -9.3048022694536114e-03 8.8528109760999570e-03 8.5847463773592592e-03 -1.0974633052846620e-02 5.2559113273343357e-04 1.2346846707449581e-02 -1.3475982721451093e-02 1.8973300693565470e-03 2.2509682608549239e-03 -3.9611407132418329e-03 -3.2196466125153696e-03 -1.0194924516896634e-02 9.9234574304305680e-03 3.0774818471526527e-03 2.2722831246576097e-03 -1.4205093191276973e-03 -7.5266309119284263e-03 -5.0159924659958595e-04 -2.2503998950379805e-03 -9.4928879061427444e-03 -9.6191609889625020e-03 3.1464010540728268e-02 690 691 692 738 739 740 750 751 752 702 703 704 693 694 695 741 742 743 753 754 755 705 706 707 3.1218995755629378e-02 -6.5390267796913105e-03 -4.3779938725155079e-03 -6.3815953479617214e-03 -8.9669614406420010e-03 -8.3144911607344954e-03 -1.0576183172016055e-02 7.4804184237687059e-03 -1.0028190591609442e-03 -2.0949595635519163e-04 8.8777599701554636e-03 5.0714916837257262e-03 6.3189264661054510e-03 -6.2644423551999583e-03 -7.8587007309765893e-04 -5.2063781337527712e-03 -2.4160323138442547e-03 -1.0558400215979267e-03 -8.0539494723705952e-03 6.2725110452282410e-03 4.0525098630510605e-03 -7.1103201392784957e-03 1.5557734502251127e-03 6.4130126403297467e-03 -6.5390267796913105e-03 6.0607934785125939e-02 1.9346965065626599e-02 -9.9119677685590817e-03 -3.6433965023684088e-02 -4.8505246989113591e-04 7.6484733489402598e-03 -4.1694762433515720e-02 3.9456281828682176e-03 8.8803440819769947e-03 2.5568659720836578e-02 1.4659577526557048e-02 -6.4812588125838736e-03 3.5330120977491629e-02 4.0314144382518069e-03 -1.4950472760732384e-02 -2.9061082103995439e-02 -1.7690095273454550e-02 7.0523344740136525e-03 -3.3792655287244039e-02 -1.8147195626861096e-02 1.4301574216635748e-02 1.9475749364985154e-02 -5.6612418430968901e-03 -4.3779938725155088e-03 1.9346965065626599e-02 4.1982078755915329e-02 -8.7268339380783665e-03 -1.5228871768366578e-03 -2.8428971415313362e-03 2.4225717597801486e-03 -1.1465829896661965e-02 -1.8389234215774803e-03 4.5785023970775487e-03 1.5040996202830106e-02 1.7073013661262036e-02 -3.6623384553347005e-04 3.5959398019959595e-03 -4.5140481746376764e-03 -9.4676588945391792e-03 -1.4587850862920224e-02 -2.1762234949233100e-02 4.4000715886005340e-03 -1.7487375428585691e-02 -1.8063255458643339e-02 1.1537574805208299e-02 7.0800422945518681e-03 -1.0033733271554433e-02 -6.3815953479617240e-03 -9.9119677685590782e-03 -8.7268339380783683e-03 4.5045202625326033e-02 1.9068094750107137e-02 -1.0937134279526032e-02 3.5055587235405933e-04 1.1607365936417027e-02 -4.2149608995262289e-03 -2.7271643358408638e-02 -1.7154659678665866e-02 -7.7724335127721256e-03 -5.0843833825706536e-03 -1.6673793275390269e-02 6.5925539609839445e-03 2.2748394248224293e-02 1.6046797231847522e-02 3.3607512837251709e-03 -5.9898334266730770e-03 1.4749091950234940e-02 1.2070475555655632e-02 -2.3416697230290297e-02 -1.7730929145991409e-02 9.6275818295380056e-03 -8.9669614406420045e-03 -3.6433965023684088e-02 -1.5228871768366574e-03 1.9068094750107140e-02 4.6079458728173178e-02 -1.1007460060757977e-02 8.8048711399946328e-03 3.1551884611468337e-02 -1.1768519353133125e-02 -1.7460654108393550e-02 -2.5024977494681050e-02 -7.9135492882233798e-03 -2.6619423536607856e-03 -3.4796969174930102e-02 1.1736282810104654e-02 1.6415940238156453e-02 2.1129833907713901e-02 3.8089512536960087e-03 1.5161149561963860e-03 2.1235136321414813e-02 7.0941362673314808e-03 -1.6715463181758278e-02 -2.3740401875474985e-02 9.5730455478189903e-03 -8.3144911607344954e-03 -4.8505246989113786e-04 -2.8428971415313383e-03 -1.0937134279526028e-02 -1.1007460060757975e-02 3.2836815130056075e-02 -2.6285620586329467e-03 -1.2529585579257681e-02 1.2327125442416140e-02 3.6337391645923432e-03 3.0557579661055325e-03 -1.7048305769021229e-03 8.4322485789345306e-04 1.4406064992102547e-02 -1.5381875128199333e-02 7.1228246138317478e-04 2.0126230420180052e-03 -4.0401345268062210e-03 6.5765672962533146e-03 -6.1115425768683493e-03 -9.0412190262259585e-03 1.0114373718771190e-02 1.0659194686549056e-02 -1.2152984172807241e-02 -1.0576183172016054e-02 7.6484733489402598e-03 2.4225717597801486e-03 3.5055587235405933e-04 8.8048711399946328e-03 -2.6285620586329458e-03 2.8003500788096769e-02 -7.4587161088665709e-03 3.1505058329087446e-03 -6.7000363967524429e-03 -9.9112997555780031e-03 6.5009839264764929e-03 -7.9837956354496618e-03 7.3603026010577860e-03 -2.8195278019689813e-03 -5.8584213040725423e-03 2.9684697514508231e-03 -6.1913968771656553e-03 7.6623846410785344e-03 -6.7346682775719395e-03 -1.0797690611276823e-03 -4.8980047932386580e-03 -2.6774326994269903e-03 6.4519427972987802e-04 7.4804184237687050e-03 -4.1694762433515713e-02 -1.1465829896661965e-02 1.1607365936417027e-02 3.1551884611468330e-02 -1.2529585579257681e-02 -7.4587161088665692e-03 6.4683113666753500e-02 -1.5035367061924008e-02 -1.1594069846040875e-02 -3.6663999846562198e-02 -6.6434641663701607e-03 6.8909719571358984e-03 -4.0110162547467361e-02 1.3392996917420706e-02 1.6799272550222275e-02 1.9894227312544234e-02 1.2745642970077138e-02 -7.0394740043774945e-03 3.7815491186503417e-02 5.8793616191842191e-03 -1.6685768908258975e-02 -3.5475791949724209e-02 1.3656245197531757e-02 -1.0028190591609442e-03 3.9456281828682185e-03 -1.8389234215774814e-03 -4.2149608995262289e-03 -1.1768519353133127e-02 1.2327125442416140e-02 3.1505058329087451e-03 -1.5035367061924010e-02 3.2479610863709776e-02 6.8831256422789890e-03 -4.8026517060454042e-03 -3.4388213771476914e-03 -2.7672439607666806e-03 1.4057304467592674e-02 -1.2071378841409694e-02 -9.0180132287174079e-03 -1.0083106974090922e-03 -8.9064677403013319e-03 2.8423692165448515e-05 2.1528674277813261e-03 -3.4220729818455935e-03 6.9409819808180818e-03 1.2459048740269410e-02 -1.5129071943844117e-02 -2.0949595635519003e-04 8.8803440819769947e-03 4.5785023970775487e-03 -2.7271643358408641e-02 -1.7460654108393550e-02 3.6337391645923428e-03 -6.7000363967524429e-03 -1.1594069846040875e-02 6.8831256422789890e-03 4.7568562524702755e-02 1.6732313069363850e-02 1.4739259467690172e-02 -7.2044104236469808e-03 1.6073281759533178e-02 -8.6659512292011198e-03 -2.3269275334174205e-02 -1.4092029509465628e-02 -1.3707946649822661e-02 -4.8485574016403441e-03 -1.4718288979435213e-02 -9.6535587769279278e-03 2.1934856346275060e-02 1.6179103532461239e-02 2.1928299843126530e-03 8.8777599701554636e-03 2.5568659720836578e-02 1.5040996202830106e-02 -1.7154659678665869e-02 -2.5024977494681050e-02 3.0557579661055320e-03 -9.9112997555780031e-03 -3.6663999846562184e-02 -4.8026517060454042e-03 1.6732313069363847e-02 4.5677127707613535e-02 1.3519202931205124e-02 2.7154238165568358e-03 1.8365819495526584e-02 -1.2339965140789509e-03 -1.5378642441018275e-02 -1.9477469595065470e-02 -1.2741595295405139e-02 -2.1950709926913487e-03 -2.9842726755227849e-02 -1.5402079936611274e-02 1.6314176011877346e-02 2.1397566767559859e-02 2.5643663520000010e-03 5.0714916837257254e-03 1.4659577526557050e-02 1.7073013661262033e-02 -7.7724335127721256e-03 -7.9135492882233798e-03 -1.7048305769021229e-03 6.5009839264764929e-03 -6.6434641663701607e-03 -3.4388213771476966e-03 1.4739259467690174e-02 1.3519202931205124e-02 4.1596636198533952e-02 -6.1285519287290428e-03 1.2121888424484082e-02 -1.0060900608682933e-02 -1.3605011735262101e-02 -1.1592781848831208e-02 -1.7865217918338911e-02 -7.7186205012018405e-04 -1.7339170239575350e-02 -2.1652776276009249e-02 1.9661241489910696e-03 3.1882966607538390e-03 -3.9471031027150686e-03 6.3189264661054527e-03 -6.4812588125838727e-03 -3.6623384553346951e-04 -5.0843833825706536e-03 -2.6619423536607860e-03 8.4322485789345317e-04 -7.9837956354496618e-03 6.8909719571358993e-03 -2.7672439607666806e-03 -7.2044104236469800e-03 2.7154238165568363e-03 -6.1285519287290419e-03 3.0910966399242245e-02 -7.2128573686162396e-03 3.0543594218099481e-03 -5.8369712692616788e-03 -1.0179657461324479e-02 6.5676636263472541e-03 -1.0471699625477346e-02 7.2168406274052098e-03 2.2791727666362175e-03 -6.4863252894137215e-04 9.7124795950874285e-03 -3.4823909376576808e-03 -6.2644423551999574e-03 3.5330120977491629e-02 3.5959398019959586e-03 -1.6673793275390265e-02 -3.4796969174930102e-02 1.4406064992102546e-02 7.3603026010577860e-03 -4.0110162547467361e-02 1.4057304467592674e-02 1.6073281759533178e-02 1.8365819495526584e-02 1.2121888424484082e-02 -7.2128573686162387e-03 6.6854024161805428e-02 -1.4590422836674671e-02 -1.1479567542722354e-02 -3.4586739075658908e-02 -6.5776760963122786e-03 8.2518381572746300e-03 -4.1312513509393918e-02 -1.1626165571096254e-02 9.9452380240632361e-03 3.0256419672626648e-02 -1.1386933182092062e-02 -7.8587007309765839e-04 4.0314144382518060e-03 -4.5140481746376755e-03 6.5925539609839436e-03 1.1736282810104654e-02 -1.5381875128199333e-02 -2.8195278019689809e-03 1.3392996917420706e-02 -1.2071378841409694e-02 -8.6659512292011198e-03 -1.2339965140789502e-03 -1.0060900608682932e-02 3.0543594218099481e-03 -1.4590422836674669e-02 3.5228646424056903e-02 6.7813801717520918e-03 -5.4568795445739966e-03 -2.5414638353117710e-03 -9.8134986118029403e-04 3.8871023793413824e-03 -1.6446280111847562e-03 -3.1755945890979348e-03 -1.1766497649790934e-02 1.0985648175369254e-02 -5.2063781337527738e-03 -1.4950472760732384e-02 -9.4676588945391792e-03 2.2748394248224300e-02 1.6415940238156453e-02 7.1228246138317565e-04 -5.8584213040725423e-03 1.6799272550222271e-02 -9.0180132287174062e-03 -2.3269275334174212e-02 -1.5378642441018275e-02 -1.3605011735262101e-02 -5.8369712692616770e-03 -1.1479567542722354e-02 6.7813801717520935e-03 4.4713533514200834e-02 1.6233019078763584e-02 1.5143531958872891e-02 -1.5035834890884925e-04 1.0481242583405746e-02 6.0897414377528523e-03 -2.7140523372255084e-02 -1.8120791706075043e-02 3.3637478287576791e-03 -2.4160323138442551e-03 -2.9061082103995439e-02 -1.4587850862920221e-02 1.6046797231847522e-02 2.1129833907713905e-02 2.0126230420180061e-03 2.9684697514508226e-03 1.9894227312544234e-02 -1.0083106974090920e-03 -1.4092029509465625e-02 -1.9477469595065470e-02 -1.1592781848831210e-02 -1.0179657461324477e-02 -3.4586739075658915e-02 -5.4568795445739957e-03 1.6233019078763587e-02 4.0953798771233792e-02 1.3279803699744849e-02 7.7752089724290960e-03 2.5673263944789863e-02 1.4797181471930383e-02 -1.6335775749856674e-02 -2.4525833161561976e-02 2.5562147400412794e-03 -1.0558400215979267e-03 -1.7690095273454547e-02 -2.1762234949233097e-02 3.3607512837251705e-03 3.8089512536960087e-03 -4.0401345268062210e-03 -6.1913968771656553e-03 1.2745642970077136e-02 -8.9064677403013319e-03 -1.3707946649822661e-02 -1.2741595295405139e-02 -1.7865217918338908e-02 6.5676636263472541e-03 -6.5776760963122786e-03 -2.5414638353117706e-03 1.5143531958872887e-02 1.3279803699744845e-02 3.8790872944126559e-02 3.7722891907924698e-03 1.5681498769406891e-02 1.7955148733654697e-02 -7.8890525111515453e-03 -8.5065300277529163e-03 -1.6305027077899202e-03 -8.0539494723705952e-03 7.0523344740136525e-03 4.4000715886005331e-03 -5.9898334266730788e-03 1.5161149561963867e-03 6.5765672962533155e-03 7.6623846410785344e-03 -7.0394740043774945e-03 2.8423692165448948e-05 -4.8485574016403432e-03 -2.1950709926913487e-03 -7.7186205012018427e-04 -1.0471699625477346e-02 8.2518381572746317e-03 -9.8134986118029381e-04 -1.5035834890884947e-04 7.7752089724290952e-03 3.7722891907924689e-03 2.7756338845906225e-02 -7.1249732178873633e-03 -4.7314113950018529e-03 -5.9043252119145477e-03 -8.2359783449575535e-03 -8.2927284615094340e-03 6.2725110452282427e-03 -3.3792655287244039e-02 -1.7487375428585691e-02 1.4749091950234940e-02 2.1235136321414813e-02 -6.1115425768683493e-03 -6.7346682775719395e-03 3.7815491186503417e-02 2.1528674277813266e-03 -1.4718288979435213e-02 -2.9842726755227859e-02 -1.7339170239575354e-02 7.2168406274052098e-03 -4.1312513509393918e-02 3.8871023793413824e-03 1.0481242583405747e-02 2.5673263944789863e-02 1.5681498769406891e-02 -7.1249732178873641e-03 5.7054475562223317e-02 1.9788320953518693e-02 -1.0141755731379636e-02 -3.6830471463065589e-02 -5.7170128501889735e-04 4.0525098630510613e-03 -1.8147195626861092e-02 -1.8063255458643339e-02 1.2070475555655630e-02 7.0941362673314799e-03 -9.0412190262259585e-03 -1.0797690611276823e-03 5.8793616191842209e-03 -3.4220729818455926e-03 -9.6535587769279278e-03 -1.5402079936611274e-02 -2.1652776276009245e-02 2.2791727666362175e-03 -1.1626165571096254e-02 -1.6446280111847551e-03 6.0897414377528523e-03 1.4797181471930385e-02 1.7955148733654697e-02 -4.7314113950018537e-03 1.9788320953518689e-02 3.8694637992086361e-02 -9.0271603900383048e-03 -2.3835591773961485e-03 -2.8258349718321618e-03 -7.1103201392784948e-03 1.4301574216635748e-02 1.1537574805208298e-02 -2.3416697230290297e-02 -1.6715463181758278e-02 1.0114373718771190e-02 -4.8980047932386571e-03 -1.6685768908258975e-02 6.9409819808180818e-03 2.1934856346275060e-02 1.6314176011877346e-02 1.9661241489910696e-03 -6.4863252894137107e-04 9.9452380240632361e-03 -3.1755945890979348e-03 -2.7140523372255084e-02 -1.6335775749856674e-02 -7.8890525111515453e-03 -5.9043252119145460e-03 -1.0141755731379640e-02 -9.0271603900383031e-03 4.7183646929643400e-02 1.9317775318677229e-02 -1.0467247163500854e-02 1.5557734502251123e-03 1.9475749364985150e-02 7.0800422945518681e-03 -1.7730929145991413e-02 -2.3740401875474985e-02 1.0659194686549056e-02 -2.6774326994269916e-03 -3.5475791949724209e-02 1.2459048740269410e-02 1.6179103532461239e-02 2.1397566767559859e-02 3.1882966607538407e-03 9.7124795950874268e-03 3.0256419672626652e-02 -1.1766497649790930e-02 -1.8120791706075046e-02 -2.4525833161561979e-02 -8.5065300277529145e-03 -8.2359783449575535e-03 -3.6830471463065596e-02 -2.3835591773961481e-03 1.9317775318677233e-02 4.9442762644655094e-02 -1.0729995527184177e-02 6.4130126403297467e-03 -5.6612418430968909e-03 -1.0033733271554435e-02 9.6275818295380074e-03 9.5730455478189903e-03 -1.2152984172807241e-02 6.4519427972987802e-04 1.3656245197531759e-02 -1.5129071943844117e-02 2.1928299843126534e-03 2.5643663520000005e-03 -3.9471031027150686e-03 -3.4823909376576791e-03 -1.1386933182092062e-02 1.0985648175369254e-02 3.3637478287576795e-03 2.5562147400412798e-03 -1.6305027077899205e-03 -8.2927284615094340e-03 -5.7170128501889518e-04 -2.8258349718321626e-03 -1.0467247163500858e-02 -1.0729995527184177e-02 3.4733581995173686e-02 636 637 638 702 703 704 714 715 716 648 649 650 639 640 641 705 706 707 717 718 719 651 652 653 3.1715677093397787e-02 -1.1028043161228802e-02 -7.6173329619600837e-03 -2.2463027637347130e-03 -2.0811755014760311e-03 -7.5345563084973123e-03 -1.3251544993099747e-02 1.2023885938051683e-02 -1.7301912804768308e-03 -3.7049629783418038e-03 2.7252240200507155e-03 1.6660345023093914e-03 9.4442493841868525e-03 -1.0540513602326024e-02 -1.3370298902225491e-03 -1.9074642903535591e-03 2.7376387196475825e-03 2.4525541151363618e-03 -1.0852613982319072e-02 1.0021488940556312e-02 7.1876101585090441e-03 -9.1970374697357415e-03 -3.8585053532754392e-03 6.9129116652019758e-03 -1.1028043161228802e-02 5.0813099278597486e-02 1.6134787948475764e-02 -3.5877598857765153e-03 -3.4172223033335669e-02 -1.8532335325142243e-03 1.1964195416688694e-02 -3.3046708310774747e-02 3.4769673709687536e-03 3.2406506225661543e-03 2.4112728540266089e-02 1.3880543228176900e-02 -1.0587715294239616e-02 2.8613649818103697e-02 3.4383680898389920e-03 -8.7704098870077258e-03 -2.8090362152245658e-02 -1.5877935646457696e-02 1.0707136480006825e-02 -2.6857155226906775e-02 -1.5340992105213048e-02 8.0619457089909797e-03 1.8626971086295605e-02 -3.8585053532754466e-03 -7.6173329619600837e-03 1.6134787948475761e-02 3.7355160446349414e-02 -7.8326037723038776e-03 -2.9944390515830579e-03 -2.2469495556347776e-03 4.1373820305692852e-03 -9.4703660902227312e-03 -1.3105983323527669e-03 1.3957003628951334e-03 1.3880663468967845e-02 1.4731027268979124e-02 -7.2933149820868844e-04 3.0023141283709058e-03 -3.6629495060075028e-03 -5.8194705372655604e-03 -1.4324940412468831e-02 -1.9473239229681309e-02 7.1565974621684569e-03 -1.4289965700530885e-02 -1.6195413621916427e-02 9.3090589141053282e-03 8.0619457089909970e-03 -9.1970374697357554e-03 -2.2463027637347139e-03 -3.5877598857765149e-03 -7.8326037723038776e-03 3.5143691379577707e-02 1.6435733228293607e-02 -7.9831129868948338e-03 -3.4322715836225949e-03 4.9520592094916410e-03 -2.0365700280578990e-03 -1.9353408889405295e-02 -1.5240006000574541e-02 -5.9687941311528407e-03 -1.6938745384303205e-03 -9.7875892954913373e-03 4.0717273166791454e-03 1.6001971249879725e-02 1.4159547783279793e-02 2.6657283688730198e-03 -8.2243912323480810e-03 8.4090070659904002e-03 9.8960150743482370e-03 -1.6195413621916413e-02 -1.5340992105213048e-02 7.1876101585090502e-03 -2.0811755014760302e-03 -3.4172223033335676e-02 -2.9944390515830579e-03 1.6435733228293607e-02 4.7485573546142752e-02 -1.1274789696480578e-02 1.7835547102133674e-03 2.9623932951632580e-02 -1.1035075626089037e-02 -1.5253998243542328e-02 -2.8039447364912540e-02 -8.5312102138891122e-03 3.0736001720858379e-03 -3.3104054507315524e-02 1.1367249193279598e-02 1.4301524014450260e-02 2.4789230730779668e-02 4.0377693882154755e-03 -3.9692726794938382e-03 2.0274142903915510e-02 8.4090070659903968e-03 -1.4289965700530868e-02 -2.6857155226906765e-02 1.0021488940556314e-02 -7.5345563084973132e-03 -1.8532335325142234e-03 -2.2469495556347776e-03 -7.9831129868948355e-03 -1.1274789696480578e-02 2.9134060403091359e-02 -2.3563297426865354e-04 -1.1178952510905126e-02 1.0349006476249648e-02 2.5376488809701354e-03 3.0902758049074332e-03 -1.5349969226661946e-03 -1.6646204775917820e-03 1.2441955903219828e-02 -1.3489734750293985e-02 6.0434172325765146e-04 2.0368802312596863e-03 -3.1343804360789008e-03 7.1193346808563485e-03 -3.9692726794938373e-03 -8.2243912323480776e-03 7.1565974621684431e-03 1.0707136480006820e-02 -1.0852613982319070e-02 -1.3251544993099747e-02 1.1964195416688694e-02 4.1373820305692852e-03 -3.4322715836225940e-03 1.7835547102133674e-03 -2.3563297426865398e-04 2.8432659377162814e-02 -1.2631973367514888e-02 5.5756799858875557e-03 -1.7540977007330521e-03 -2.8779990877610094e-03 7.2011475407815061e-03 -1.0761937232768658e-02 1.1851295249748869e-02 -4.9404010195308974e-03 -8.2712160108356653e-03 -2.5309646662547394e-03 -7.9714142549040627e-03 1.0349006476249657e-02 -1.1035075626089044e-02 -2.0365700280578990e-03 -1.3105983323527628e-03 3.4769673709687580e-03 -1.7301912804768352e-03 1.2023885938051683e-02 -3.3046708310774747e-02 -9.4703660902227312e-03 4.9520592094916410e-03 2.9623932951632587e-02 -1.1178952510905126e-02 -1.2631973367514890e-02 5.2486048554834401e-02 -1.2631973367514881e-02 -4.8721067778889730e-03 -3.3647239937028492e-02 -4.8721067778889800e-03 1.1126299721482980e-02 -3.1867609853459121e-02 1.1126299721482991e-02 1.0051153877505402e-02 1.9874351953937542e-02 1.0051153877505400e-02 -1.1178952510905128e-02 2.9623932951632584e-02 4.9520592094916428e-03 -9.4703660902227069e-03 -3.3046708310774733e-02 1.2023885938051686e-02 -1.7301912804768304e-03 3.4769673709687536e-03 -1.3105983323527669e-03 -2.0365700280578982e-03 -1.1035075626089037e-02 1.0349006476249648e-02 5.5756799858875565e-03 -1.2631973367514877e-02 2.8432659377162814e-02 7.2011475407815113e-03 -2.8779990877610181e-03 -1.7540977007330573e-03 -4.9404010195308930e-03 1.1851295249748860e-02 -1.0761937232768658e-02 -7.9714142549040592e-03 -2.5309646662547347e-03 -8.2712160108356619e-03 -2.3563297426865972e-04 1.7835547102133717e-03 -3.4322715836225836e-03 4.1373820305692713e-03 1.1964195416688686e-02 -1.3251544993099731e-02 -3.7049629783418030e-03 3.2406506225661526e-03 1.3957003628951323e-03 -1.9353408889405295e-02 -1.5253998243542326e-02 2.5376488809701354e-03 -1.7540977007330504e-03 -4.8721067778889730e-03 7.2011475407815122e-03 3.7226336816462577e-02 1.4461740406926405e-02 1.1083677005985927e-02 -9.2852231175373362e-03 9.7143728821528098e-03 -7.6400252623784852e-03 -1.6324674476758002e-02 -1.2639991904501852e-02 -1.0275388899410778e-02 -1.5349969226661972e-03 -8.5312102138891070e-03 -5.9687941311528355e-03 1.4731027268979105e-02 1.3880543228176896e-02 1.6660345023093886e-03 2.7252240200507155e-03 2.4112728540266089e-02 1.3880663468967845e-02 -1.5240006000574541e-02 -2.8039447364912543e-02 3.0902758049074332e-03 -2.8779990877610094e-03 -3.3647239937028492e-02 -2.8779990877610163e-03 1.4461740406926405e-02 4.5762876361999563e-02 1.4461740406926410e-02 -2.4339292026651161e-03 1.8225998594283102e-02 -2.4339292026651234e-03 -1.3605969409851721e-02 -2.2488197369961244e-02 -1.3605969409851719e-02 3.0902758049074354e-03 -2.8039447364912543e-02 -1.5240006000574541e-02 1.3880663468967828e-02 2.4112728540266082e-02 2.7252240200507129e-03 1.6660345023093931e-03 1.3880543228176903e-02 1.4731027268979124e-02 -5.9687941311528407e-03 -8.5312102138891122e-03 -1.5349969226661955e-03 7.2011475407815070e-03 -4.8721067778889800e-03 -1.7540977007330539e-03 1.1083677005985927e-02 1.4461740406926406e-02 3.7226336816462591e-02 -7.6400252623784722e-03 9.7143728821528150e-03 -9.2852231175373431e-03 -1.0275388899410778e-02 -1.2639991904501855e-02 -1.6324674476758005e-02 2.5376488809701384e-03 -1.5253998243542328e-02 -1.9353408889405298e-02 1.3957003628951247e-03 3.2406506225661560e-03 -3.7049629783418056e-03 9.4442493841868508e-03 -1.0587715294239615e-02 -7.2933149820868736e-04 -1.6938745384303209e-03 3.0736001720858388e-03 -1.6646204775917818e-03 -1.0761937232768659e-02 1.1126299721482980e-02 -4.9404010195308939e-03 -9.2852231175373379e-03 -2.4339292026651161e-03 -7.6400252623784722e-03 3.2149640397573877e-02 -1.2135063631623522e-02 5.2479867318978414e-03 -2.7001706367229339e-03 -3.8488090481591610e-03 6.9916940993554099e-03 -1.3489734750293983e-02 1.1367249193279586e-02 4.0717273166791359e-03 -3.6629495060074954e-03 3.4383680898390050e-03 -1.3370298902225500e-03 -1.0540513602326024e-02 2.8613649818103708e-02 3.0023141283709032e-03 -9.7875892954913373e-03 -3.3104054507315524e-02 1.2441955903219828e-02 1.1851295249748867e-02 -3.1867609853459128e-02 1.1851295249748860e-02 9.7143728821528115e-03 1.8225998594283102e-02 9.7143728821528132e-03 -1.2135063631623524e-02 5.6679362002894793e-02 -1.2135063631623533e-02 -4.5467716340515125e-03 -3.4056941365295093e-02 -4.5467716340515125e-03 1.2441955903219830e-02 -3.3104054507315524e-02 -9.7875892954913356e-03 3.0023141283708850e-03 2.8613649818103690e-02 -1.0540513602326027e-02 -1.3370298902225491e-03 3.4383680898389920e-03 -3.6629495060075019e-03 4.0717273166791454e-03 1.1367249193279595e-02 -1.3489734750293985e-02 -4.9404010195308974e-03 1.1126299721482991e-02 -1.0761937232768658e-02 -7.6400252623784852e-03 -2.4339292026651221e-03 -9.2852231175373431e-03 5.2479867318978414e-03 -1.2135063631623533e-02 3.2149640397573884e-02 6.9916940993554177e-03 -3.8488090481591554e-03 -2.7001706367229257e-03 -1.6646204775917829e-03 3.0736001720858466e-03 -1.6938745384303189e-03 -7.2933149820868801e-04 -1.0587715294239620e-02 9.4442493841868473e-03 -1.9074642903535591e-03 -8.7704098870077258e-03 -5.8194705372655595e-03 1.6001971249879725e-02 1.4301524014450263e-02 6.0434172325765157e-04 -8.2712160108356671e-03 1.0051153877505400e-02 -7.9714142549040575e-03 -1.6324674476758002e-02 -1.3605969409851719e-02 -1.0275388899410778e-02 -2.7001706367229331e-03 -4.5467716340515160e-03 6.9916940993554177e-03 3.5809173830550649e-02 1.4410639297197511e-02 1.1351955384957946e-02 -3.1343804360789056e-03 4.0377693882154772e-03 2.6657283688730155e-03 -1.9473239229681298e-02 -1.5877935646457696e-02 2.4525541151363649e-03 2.7376387196475825e-03 -2.8090362152245661e-02 -1.4324940412468831e-02 1.4159547783279793e-02 2.4789230730779668e-02 2.0368802312596855e-03 -2.5309646662547399e-03 1.9874351953937542e-02 -2.5309646662547347e-03 -1.2639991904501852e-02 -2.2488197369961244e-02 -1.2639991904501855e-02 -3.8488090481591615e-03 -3.4056941365295093e-02 -3.8488090481591537e-03 1.4410639297197513e-02 4.3273049624250777e-02 1.4410639297197511e-02 2.0368802312596855e-03 2.4789230730779665e-02 1.4159547783279793e-02 -1.4324940412468817e-02 -2.8090362152245661e-02 2.7376387196475865e-03 2.4525541151363614e-03 -1.5877935646457692e-02 -1.9473239229681305e-02 2.6657283688730198e-03 4.0377693882154746e-03 -3.1343804360789004e-03 -7.9714142549040627e-03 1.0051153877505400e-02 -8.2712160108356619e-03 -1.0275388899410778e-02 -1.3605969409851719e-02 -1.6324674476758005e-02 6.9916940993554099e-03 -4.5467716340515116e-03 -2.7001706367229261e-03 1.1351955384957948e-02 1.4410639297197513e-02 3.5809173830550635e-02 6.0434172325765396e-04 1.4301524014450256e-02 1.6001971249879718e-02 -5.8194705372655482e-03 -8.7704098870077241e-03 -1.9074642903535574e-03 -1.0852613982319074e-02 1.0707136480006825e-02 7.1565974621684561e-03 -8.2243912323480793e-03 -3.9692726794938391e-03 7.1193346808563502e-03 1.0349006476249657e-02 -1.1178952510905128e-02 -2.3563297426865940e-04 -1.5349969226661981e-03 3.0902758049074358e-03 2.5376488809701380e-03 -1.3489734750293983e-02 1.2441955903219830e-02 -1.6646204775917829e-03 -3.1343804360789039e-03 2.0368802312596855e-03 6.0434172325765341e-04 2.9134060403091362e-02 -1.1274789696480578e-02 -7.9831129868948355e-03 -2.2469495556347798e-03 -1.8532335325142269e-03 -7.5345563084973210e-03 1.0021488940556312e-02 -2.6857155226906775e-02 -1.4289965700530885e-02 8.4090070659904002e-03 2.0274142903915510e-02 -3.9692726794938373e-03 -1.1035075626089044e-02 2.9623932951632580e-02 1.7835547102133724e-03 -8.5312102138891087e-03 -2.8039447364912543e-02 -1.5253998243542330e-02 1.1367249193279586e-02 -3.3104054507315524e-02 3.0736001720858466e-03 4.0377693882154781e-03 2.4789230730779665e-02 1.4301524014450256e-02 -1.1274789696480580e-02 4.7485573546142752e-02 1.6435733228293600e-02 -2.9944390515830362e-03 -3.4172223033335669e-02 -2.0811755014760284e-03 7.1876101585090441e-03 -1.5340992105213048e-02 -1.6195413621916427e-02 9.8960150743482352e-03 8.4090070659903968e-03 -8.2243912323480758e-03 -2.0365700280578995e-03 4.9520592094916419e-03 -3.4322715836225836e-03 -5.9687941311528355e-03 -1.5240006000574541e-02 -1.9353408889405298e-02 4.0717273166791359e-03 -9.7875892954913356e-03 -1.6938745384303192e-03 2.6657283688730159e-03 1.4159547783279793e-02 1.6001971249879718e-02 -7.9831129868948355e-03 1.6435733228293600e-02 3.5143691379577693e-02 -7.8326037723038585e-03 -3.5877598857765114e-03 -2.2463027637347078e-03 -9.1970374697357415e-03 8.0619457089909797e-03 9.3090589141053282e-03 -1.6195413621916413e-02 -1.4289965700530866e-02 7.1565974621684431e-03 -1.3105983323527626e-03 -9.4703660902227087e-03 4.1373820305692713e-03 1.4731027268979105e-02 1.3880663468967826e-02 1.3957003628951240e-03 -3.6629495060074959e-03 3.0023141283708850e-03 -7.2933149820868714e-04 -1.9473239229681298e-02 -1.4324940412468817e-02 -5.8194705372655482e-03 -2.2469495556347789e-03 -2.9944390515830358e-03 -7.8326037723038585e-03 3.7355160446349372e-02 1.6134787948475744e-02 -7.6173329619600733e-03 -3.8585053532754388e-03 1.8626971086295605e-02 8.0619457089909970e-03 -1.5340992105213048e-02 -2.6857155226906765e-02 1.0707136480006818e-02 3.4769673709687584e-03 -3.3046708310774733e-02 1.1964195416688684e-02 1.3880543228176896e-02 2.4112728540266082e-02 3.2406506225661543e-03 3.4383680898390054e-03 2.8613649818103690e-02 -1.0587715294239622e-02 -1.5877935646457696e-02 -2.8090362152245654e-02 -8.7704098870077241e-03 -1.8532335325142282e-03 -3.4172223033335669e-02 -3.5877598857765153e-03 1.6134787948475744e-02 5.0813099278597458e-02 -1.1028043161228799e-02 6.9129116652019776e-03 -3.8585053532754457e-03 -9.1970374697357537e-03 7.1876101585090502e-03 1.0021488940556314e-02 -1.0852613982319070e-02 -1.7301912804768354e-03 1.2023885938051685e-02 -1.3251544993099731e-02 1.6660345023093890e-03 2.7252240200507120e-03 -3.7049629783418060e-03 -1.3370298902225498e-03 -1.0540513602326029e-02 9.4442493841868473e-03 2.4525541151363657e-03 2.7376387196475856e-03 -1.9074642903535561e-03 -7.5345563084973210e-03 -2.0811755014760254e-03 -2.2463027637347052e-03 -7.6173329619600733e-03 -1.1028043161228799e-02 3.1715677093397773e-02 702 703 704 750 751 752 762 763 764 714 715 716 705 706 707 753 754 755 765 766 767 717 718 719 3.5164952080841923e-02 -1.2081704896171585e-02 -8.0057393542159062e-03 -4.3287137141527574e-03 -2.6188214532478528e-03 -7.9994885765206601e-03 -1.4988577224833322e-02 1.3100916746651977e-02 -1.7315257004258669e-03 -2.6383649353160484e-03 3.3793098526266017e-03 2.0470784931436105e-03 1.0537048770452513e-02 -1.1543780475130763e-02 -1.3872307717488887e-03 -2.6759545155295170e-03 2.9147965310787984e-03 2.4611744891094786e-03 -1.1811705529961828e-02 1.0947600667615090e-02 7.3802024381342127e-03 -9.2586849315009611e-03 -4.0983169734222684e-03 7.2355289825240185e-03 -1.2081704896171585e-02 5.8707347543330131e-02 1.8283439692293259e-02 -3.9739037678183792e-03 -4.1036224699635672e-02 -2.0456483378369175e-03 1.3241445597926943e-02 -3.9326365844355504e-02 3.5731015294989607e-03 3.4461141099120423e-03 2.9188816376943726e-02 1.5535253743705664e-02 -1.1798690409017413e-02 3.3895131313318526e-02 3.6260472537216447e-03 -1.0068014071295041e-02 -3.2663965146209423e-02 -1.7808111564206100e-02 1.1999807783022381e-02 -3.1465367685342506e-02 -1.7065765343754237e-02 9.2349456534410370e-03 2.2700628141950729e-02 -4.0983169734222693e-03 -8.0057393542159044e-03 1.8283439692293256e-02 4.1723748535569948e-02 -8.2951445893146049e-03 -3.6805684171980386e-03 -4.1217440751985870e-03 4.4454081097532348e-03 -1.0815056716570157e-02 -2.6760618007648884e-03 1.5070942510537031e-03 1.5770829334946137e-02 1.6861604730021323e-02 -1.0164439427571316e-03 3.8059981795636618e-03 -3.2956375581538445e-03 -6.3707996541936662e-03 -1.6306191733338360e-02 -2.1503898882718094e-02 7.7275783468682213e-03 -1.6293395993137550e-02 -1.7729326017254899e-02 1.0008046832806143e-02 9.2349456534410457e-03 -9.2586849315009611e-03 -4.3287137141527592e-03 -3.9739037678183792e-03 -8.2951445893146031e-03 3.8867974993380912e-02 1.8414201259151365e-02 -8.4179687951974509e-03 -2.2320266329508747e-03 5.3846845388676838e-03 -1.9968648892183267e-03 -2.1581936623679646e-02 -1.6968888658810743e-02 -6.3273106663261471e-03 -2.4927324734736376e-03 -1.1002086249494756e-02 4.2695422530471799e-03 1.7680625141373585e-02 1.5795510297785944e-02 2.9545823560326381e-03 -8.1838646732426638e-03 9.4162479240731296e-03 1.0432961892842499e-02 -1.7729326017254899e-02 -1.7065765343754244e-02 7.3802024381342136e-03 -2.6188214532478515e-03 -4.1036224699635672e-02 -3.6805684171980386e-03 1.8414201259151362e-02 5.5018943603626844e-02 -1.2570706307970783e-02 2.4404597877562646e-03 3.5707351587327234e-02 -1.2089786615170366e-02 -1.7224553453850083e-02 -3.3329068341307833e-02 -9.4952319492417839e-03 3.4904171744525726e-03 -3.8714520502570890e-02 1.2576214273306978e-02 1.6218203359436367e-02 2.9237874679458847e-02 4.8962304245857785e-03 -4.4265106805610761e-03 2.4581011358443983e-02 9.4162479240731262e-03 -1.6293395993137543e-02 -3.1465367685342506e-02 1.0947600667615090e-02 -7.9994885765206601e-03 -2.0456483378369196e-03 -4.1217440751985870e-03 -8.4179687951974509e-03 -1.2570706307970782e-02 3.2533674022841352e-02 -3.3752874643251489e-04 -1.2475068546298953e-02 1.2041584414779354e-02 2.6606608339116971e-03 3.3866466780661042e-03 -2.7636073820479830e-03 -1.7037977581960996e-03 1.3966091615201523e-02 -1.4939296146928936e-02 5.4050248598192083e-04 2.1653877963777215e-03 -2.7550406302407210e-03 7.5300422095848857e-03 -4.4265106805610709e-03 -8.1838646732426568e-03 7.7275783468682153e-03 1.1999807783022374e-02 -1.1811705529961828e-02 -1.4988577224833318e-02 1.3241445597926945e-02 4.4454081097532348e-03 -2.2320266329508729e-03 2.4404597877562646e-03 -3.3752874643251424e-04 3.2718270951340854e-02 -1.3835248969667207e-02 5.6659734697953766e-03 -4.9214836955054578e-03 -3.7565946611247138e-03 7.4088763600628424e-03 -1.1757198475064356e-02 1.3028517455150598e-02 -5.1005470383483163e-03 -8.1845075370013277e-03 -2.6018941243704796e-03 -8.3537915651864334e-03 1.2041584414779358e-02 -1.2089786615170364e-02 -1.9968648892183219e-03 -2.6760618007648940e-03 3.5731015294989581e-03 -1.7315257004258660e-03 1.3100916746651977e-02 -3.9326365844355511e-02 -1.0815056716570157e-02 5.3846845388676838e-03 3.5707351587327241e-02 -1.2475068546298953e-02 -1.3835248969667207e-02 6.2454238894382098e-02 -1.3835248969667209e-02 -5.2102330645181624e-03 -4.1849674436269330e-02 -5.2102330645181615e-03 1.2374510623766447e-02 -3.7427487402485249e-02 1.2374510623766443e-02 1.1475495387768389e-02 2.4060951458429028e-02 1.1475495387768382e-02 -1.2475068546298958e-02 3.5707351587327241e-02 5.3846845388676751e-03 -1.0815056716570150e-02 -3.9326365844355511e-02 1.3100916746651977e-02 -1.7315257004258669e-03 3.5731015294989603e-03 -2.6760618007648893e-03 -1.9968648892183262e-03 -1.2089786615170368e-02 1.2041584414779354e-02 5.6659734697953774e-03 -1.3835248969667209e-02 3.2718270951340861e-02 7.4088763600628398e-03 -3.7565946611247117e-03 -4.9214836955054570e-03 -5.1005470383483163e-03 1.3028517455150601e-02 -1.1757198475064358e-02 -8.3537915651864404e-03 -2.6018941243704822e-03 -8.1845075370013277e-03 -3.3752874643251023e-04 2.4404597877562607e-03 -2.2320266329508703e-03 4.4454081097532348e-03 1.3241445597926947e-02 -1.4988577224833325e-02 -2.6383649353160462e-03 3.4461141099120405e-03 1.5070942510537026e-03 -2.1581936623679649e-02 -1.7224553453850083e-02 2.6606608339116980e-03 -4.9214836955054604e-03 -5.2102330645181641e-03 7.4088763600628407e-03 4.2205075477028023e-02 1.6284411392800711e-02 1.1761095584864042e-02 -9.3666024972319292e-03 1.0849054833056258e-02 -8.0626681842318419e-03 -1.7794685073268288e-02 -1.4184815611864644e-02 -1.0994826672477902e-02 -2.7636073820479787e-03 -9.4952319492417839e-03 -6.3273106663261454e-03 1.6861604730021323e-02 1.5535253743705669e-02 2.0470784931436118e-03 3.3793098526266017e-03 2.9188816376943722e-02 1.5770829334946137e-02 -1.6968888658810740e-02 -3.3329068341307833e-02 3.3866466780661042e-03 -3.7565946611247138e-03 -4.1849674436269323e-02 -3.7565946611247108e-03 1.6284411392800711e-02 5.4064061771380179e-02 1.6284411392800704e-02 -2.7420907550290267e-03 2.2309308591781978e-02 -2.7420907550290263e-03 -1.5353623183475084e-02 -2.6243191998164630e-02 -1.5353623183475077e-02 3.3866466780661094e-03 -3.3329068341307833e-02 -1.6968888658810733e-02 1.5770829334946133e-02 2.9188816376943726e-02 3.3793098526266022e-03 2.0470784931436096e-03 1.5535253743705665e-02 1.6861604730021323e-02 -6.3273106663261462e-03 -9.4952319492417839e-03 -2.7636073820479830e-03 7.4088763600628433e-03 -5.2102330645181633e-03 -4.9214836955054587e-03 1.1761095584864042e-02 1.6284411392800707e-02 4.2205075477028030e-02 -8.0626681842318471e-03 1.0849054833056260e-02 -9.3666024972319309e-03 -1.0994826672477906e-02 -1.4184815611864644e-02 -1.7794685073268285e-02 2.6606608339117027e-03 -1.7224553453850086e-02 -2.1581936623679642e-02 1.5070942510536948e-03 3.4461141099120388e-03 -2.6383649353160436e-03 1.0537048770452511e-02 -1.1798690409017411e-02 -1.0164439427571318e-03 -2.4927324734736376e-03 3.4904171744525722e-03 -1.7037977581960996e-03 -1.1757198475064354e-02 1.2374510623766445e-02 -5.1005470383483171e-03 -9.3666024972319309e-03 -2.7420907550290276e-03 -8.0626681842318453e-03 3.4881045723795245e-02 -1.3498457658654437e-02 5.5019973942697252e-03 -3.5666273433950439e-03 -4.0279505025467626e-03 7.4991480479653779e-03 -1.4939296146928939e-02 1.2576214273306982e-02 4.2695422530471807e-03 -3.2956375581538440e-03 3.6260472537216430e-03 -1.3872307717488898e-03 -1.1543780475130763e-02 3.3895131313318526e-02 3.8059981795636627e-03 -1.1002086249494756e-02 -3.8714520502570890e-02 1.3966091615201523e-02 1.3028517455150598e-02 -3.7427487402485242e-02 1.3028517455150601e-02 1.0849054833056258e-02 2.2309308591781978e-02 1.0849054833056256e-02 -1.3498457658654438e-02 6.4301312213522366e-02 -1.3498457658654435e-02 -5.6053376996921030e-03 -3.9544355024314394e-02 -5.6053376996920961e-03 1.3966091615201532e-02 -3.8714520502570890e-02 -1.1002086249494752e-02 3.8059981795636562e-03 3.3895131313318526e-02 -1.1543780475130765e-02 -1.3872307717488889e-03 3.6260472537216447e-03 -3.2956375581538449e-03 4.2695422530471799e-03 1.2576214273306978e-02 -1.4939296146928934e-02 -5.1005470383483163e-03 1.2374510623766443e-02 -1.1757198475064358e-02 -8.0626681842318436e-03 -2.7420907550290267e-03 -9.3666024972319309e-03 5.5019973942697252e-03 -1.3498457658654435e-02 3.4881045723795245e-02 7.4991480479653806e-03 -4.0279505025467635e-03 -3.5666273433950478e-03 -1.7037977581961035e-03 3.4904171744525722e-03 -2.4927324734736397e-03 -1.0164439427571279e-03 -1.1798690409017409e-02 1.0537048770452513e-02 -2.6759545155295170e-03 -1.0068014071295041e-02 -6.3707996541936662e-03 1.7680625141373585e-02 1.6218203359436367e-02 5.4050248598192126e-04 -8.1845075370013259e-03 1.1475495387768387e-02 -8.3537915651864386e-03 -1.7794685073268288e-02 -1.5353623183475083e-02 -1.0994826672477906e-02 -3.5666273433950443e-03 -5.6053376996921022e-03 7.4991480479653806e-03 3.8800088840779436e-02 1.6245157346877794e-02 1.2264010512768590e-02 -2.7550406302407327e-03 4.8962304245857872e-03 2.9545823560326373e-03 -2.1503898882718094e-02 -1.7808111564206107e-02 2.4611744891094830e-03 2.9147965310787989e-03 -3.2663965146209423e-02 -1.6306191733338363e-02 1.5795510297785944e-02 2.9237874679458847e-02 2.1653877963777207e-03 -2.6018941243704796e-03 2.4060951458429028e-02 -2.6018941243704822e-03 -1.4184815611864644e-02 -2.6243191998164626e-02 -1.4184815611864644e-02 -4.0279505025467626e-03 -3.9544355024314380e-02 -4.0279505025467652e-03 1.6245157346877794e-02 4.8578776497551122e-02 1.6245157346877790e-02 2.1653877963777159e-03 2.9237874679458847e-02 1.5795510297785940e-02 -1.6306191733338353e-02 -3.2663965146209423e-02 2.9147965310787997e-03 2.4611744891094795e-03 -1.7808111564206103e-02 -2.1503898882718094e-02 2.9545823560326386e-03 4.8962304245857803e-03 -2.7550406302407214e-03 -8.3537915651864334e-03 1.1475495387768382e-02 -8.1845075370013277e-03 -1.0994826672477902e-02 -1.5353623183475077e-02 -1.7794685073268285e-02 7.4991480479653797e-03 -5.6053376996920952e-03 -3.5666273433950487e-03 1.2264010512768589e-02 1.6245157346877790e-02 3.8800088840779415e-02 5.4050248598191887e-04 1.6218203359436363e-02 1.7680625141373574e-02 -6.3707996541936584e-03 -1.0068014071295038e-02 -2.6759545155295170e-03 -1.1811705529961828e-02 1.1999807783022381e-02 7.7275783468682231e-03 -8.1838646732426620e-03 -4.4265106805610761e-03 7.5300422095848840e-03 1.2041584414779358e-02 -1.2475068546298958e-02 -3.3752874643251001e-04 -2.7636073820479787e-03 3.3866466780661090e-03 2.6606608339117023e-03 -1.4939296146928936e-02 1.3966091615201532e-02 -1.7037977581961035e-03 -2.7550406302407331e-03 2.1653877963777150e-03 5.4050248598191866e-04 3.2533674022841359e-02 -1.2570706307970787e-02 -8.4179687951974527e-03 -4.1217440751985870e-03 -2.0456483378369123e-03 -7.9994885765206601e-03 1.0947600667615090e-02 -3.1465367685342499e-02 -1.6293395993137547e-02 9.4162479240731296e-03 2.4581011358443986e-02 -4.4265106805610717e-03 -1.2089786615170364e-02 3.5707351587327234e-02 2.4404597877562620e-03 -9.4952319492417857e-03 -3.3329068341307833e-02 -1.7224553453850083e-02 1.2576214273306982e-02 -3.8714520502570883e-02 3.4904171744525730e-03 4.8962304245857837e-03 2.9237874679458847e-02 1.6218203359436360e-02 -1.2570706307970787e-02 5.5018943603626844e-02 1.8414201259151351e-02 -3.6805684171980326e-03 -4.1036224699635665e-02 -2.6188214532478485e-03 7.3802024381342127e-03 -1.7065765343754237e-02 -1.7729326017254902e-02 1.0432961892842497e-02 9.4162479240731262e-03 -8.1838646732426551e-03 -1.9968648892183223e-03 5.3846845388676751e-03 -2.2320266329508721e-03 -6.3273106663261454e-03 -1.6968888658810733e-02 -2.1581936623679646e-02 4.2695422530471807e-03 -1.1002086249494751e-02 -2.4927324734736397e-03 2.9545823560326381e-03 1.5795510297785940e-02 1.7680625141373574e-02 -8.4179687951974527e-03 1.8414201259151351e-02 3.8867974993380891e-02 -8.2951445893145962e-03 -3.9739037678183740e-03 -4.3287137141527574e-03 -9.2586849315009611e-03 9.2349456534410405e-03 1.0008046832806143e-02 -1.7729326017254899e-02 -1.6293395993137540e-02 7.7275783468682153e-03 -2.6760618007648936e-03 -1.0815056716570150e-02 4.4454081097532348e-03 1.6861604730021323e-02 1.5770829334946133e-02 1.5070942510536968e-03 -3.2956375581538475e-03 3.8059981795636562e-03 -1.0164439427571270e-03 -2.1503898882718094e-02 -1.6306191733338353e-02 -6.3707996541936584e-03 -4.1217440751985844e-03 -3.6805684171980330e-03 -8.2951445893145979e-03 4.1723748535569954e-02 1.8283439692293253e-02 -8.0057393542159062e-03 -4.0983169734222684e-03 2.2700628141950729e-02 9.2349456534410457e-03 -1.7065765343754244e-02 -3.1465367685342506e-02 1.1999807783022374e-02 3.5731015294989577e-03 -3.9326365844355504e-02 1.3241445597926947e-02 1.5535253743705667e-02 2.9188816376943733e-02 3.4461141099120384e-03 3.6260472537216430e-03 3.3895131313318526e-02 -1.1798690409017409e-02 -1.7808111564206110e-02 -3.2663965146209423e-02 -1.0068014071295038e-02 -2.0456483378369131e-03 -4.1036224699635672e-02 -3.9739037678183731e-03 1.8283439692293249e-02 5.8707347543330124e-02 -1.2081704896171587e-02 7.2355289825240211e-03 -4.0983169734222702e-03 -9.2586849315009611e-03 7.3802024381342118e-03 1.0947600667615090e-02 -1.1811705529961828e-02 -1.7315257004258662e-03 1.3100916746651979e-02 -1.4988577224833325e-02 2.0470784931436127e-03 3.3793098526266009e-03 -2.6383649353160449e-03 -1.3872307717488902e-03 -1.1543780475130766e-02 1.0537048770452513e-02 2.4611744891094825e-03 2.9147965310787993e-03 -2.6759545155295187e-03 -7.9994885765206601e-03 -2.6188214532478480e-03 -4.3287137141527574e-03 -8.0057393542159044e-03 -1.2081704896171585e-02 3.5164952080841916e-02 183 184 185 255 256 257 681 682 683 615 616 617 186 187 188 258 259 260 684 685 686 618 619 620 2.3009267553736626e-02 2.3414583733019061e-03 2.0707695777669429e-03 -9.7543881017837369e-03 -1.0590343319189493e-02 -8.4495885438769860e-03 -6.3377141011047005e-03 -2.9084321466718746e-03 -1.6096498913651490e-04 5.9210852873297403e-03 9.3796783471487809e-03 9.3524957743082154e-03 1.9763909669981055e-03 2.8254954232300130e-03 9.4604542603946929e-04 -9.9179607774131789e-03 -4.4127135827944294e-03 -6.4824839351318268e-03 -4.9080272407265590e-03 -1.8296380008744225e-03 -1.8803151956650345e-03 1.1346412963701724e-05 5.1944949058495195e-03 4.6040418856957326e-03 2.3414583733019070e-03 3.9978710171659694e-02 1.6493840880051028e-02 -1.1421387055031550e-02 -1.7179784737048502e-02 -8.4884503893347763e-04 -2.6229889240000004e-03 -3.0348195548651875e-02 -7.9465982718787144e-04 9.9883790047157420e-03 7.5931303758620767e-03 8.7742758711706111e-03 2.4739481886079055e-03 2.3084855420297222e-02 7.9458840082216875e-03 -1.2806341237705531e-02 -1.0055010283799539e-02 -1.2586405065899012e-02 -1.4358659530779884e-03 -2.0538069828604746e-02 -1.5663348480273915e-02 1.3482797603189519e-02 7.4643644302856667e-03 -3.3207423471490524e-03 2.0707695777669429e-03 1.6493840880051024e-02 3.8621707911744609e-02 -9.1854595239928890e-03 -1.4330828480649985e-03 6.5835349830752770e-04 -1.6489555952328965e-03 -1.4513064031992082e-02 -2.4409105697415629e-04 9.5023238189030738e-03 9.2652377686368564e-03 1.8928381626910275e-02 8.6124454981215907e-04 6.9063007470583802e-03 -6.7225933573528346e-03 -1.3242215208489286e-02 -6.2402476766224117e-03 -2.2892941966611246e-02 -1.4335208811931969e-03 -1.5068634005867434e-02 -1.9642086907043818e-02 1.3075813262426099e-02 4.5896491668006630e-03 -8.7067297489803654e-03 -9.7543881017837369e-03 -1.1421387055031549e-02 -9.1854595239928890e-03 4.3803663926745499e-02 1.1910504816168222e-02 -9.5632680061693513e-03 7.9394990326341723e-03 1.6408473518810217e-02 -4.9909787203547898e-03 -2.8347265944725447e-02 -6.1178375785662558e-03 -1.1079501522928518e-02 -1.1183371442679446e-02 -1.9771601965604242e-02 6.7821423174108863e-03 2.2590817932009986e-02 6.2919466728113506e-03 5.9769025306265376e-03 1.0882525342512999e-03 1.3991064032061334e-02 1.3917215935354390e-02 -2.6137207936452331e-02 -1.1291162440649070e-02 8.1429469900537420e-03 -1.0590343319189493e-02 -1.7179784737048499e-02 -1.4330828480649987e-03 1.1910504816168224e-02 2.6129077385827315e-02 -4.7965399045569092e-03 1.3367259579061612e-02 1.7944374962522370e-02 -6.7662700839750834e-03 -8.8357803962245789e-03 -7.8194687409800633e-03 -5.8917113473019424e-03 -7.9930232855996569e-03 -2.1443624965321383e-02 6.4302466323844553e-03 7.0108208218721598e-03 3.7372707678471544e-03 4.3228164462367430e-03 5.3879104051136380e-03 8.6482049996971060e-03 4.2140431751358735e-03 -1.0257348621201909e-02 -1.0016049672543988e-02 3.9204979301418665e-03 -8.4495885438769843e-03 -8.4884503893347763e-04 6.5835349830752727e-04 -9.5632680061693513e-03 -4.7965399045569092e-03 2.4154133535539673e-02 -4.3446929083126749e-03 -8.2205119824535385e-03 8.3202081245081373e-03 1.5464054084349099e-03 -9.5676547961384478e-04 5.8028303366348336e-04 3.8575501194033986e-03 9.6405407421574271e-03 -1.1049991526411953e-02 3.6383441957760004e-03 4.1395474169733442e-03 -6.3788633995051705e-03 4.3493622562946485e-03 -3.7028480857901158e-03 -8.3241632361992154e-03 8.9658874784500544e-03 4.7454223322171123e-03 -7.9599600299024888e-03 -6.3377141011046996e-03 -2.6229889240000004e-03 -1.6489555952328972e-03 7.9394990326341723e-03 1.3367259579061614e-02 -4.3446929083126758e-03 2.2218402558740805e-02 4.8637417681809542e-03 -1.2303910395011408e-03 -1.0882918197573380e-02 -1.3025440679265393e-02 1.5041078292804269e-03 -6.1912344831391245e-03 -3.7639432819501590e-03 1.3038934510582923e-03 5.3177228786455155e-04 6.7863184470880206e-03 -3.5538838728548530e-04 3.9214063698137938e-03 3.0152856809760797e-03 1.4350381186593675e-03 -1.1199213467236126e-02 -8.6202325900911116e-03 3.3363885313341130e-03 -2.9084321466718746e-03 -3.0348195548651875e-02 -1.4513064031992083e-02 1.6408473518810217e-02 1.7944374962522370e-02 -8.2205119824535385e-03 4.8637417681809559e-03 5.6921191502834548e-02 -1.0555131939946089e-02 -1.5657156900086219e-02 -1.3013873937949399e-02 -1.1757435782821204e-02 -3.6072850235387942e-03 -3.6996560488212246e-02 9.9456849022300196e-03 1.8547029043213020e-02 5.9416428914284237e-04 1.6075457490085460e-02 2.6654699750695661e-03 2.6823283742594496e-02 1.0034767634259232e-02 -2.0311840234976879e-02 -2.1924384522280720e-02 8.9902337106382117e-03 -1.6096498913651506e-04 -7.9465982718787188e-04 -2.4409105697415455e-04 -4.9909787203547889e-03 -6.7662700839750843e-03 8.3202081245081390e-03 -1.2303910395011410e-03 -1.0555131939946089e-02 2.4691675012068513e-02 2.5723568790577338e-03 -9.3471660247563398e-03 -1.4633170272876903e-04 1.2245611368358652e-03 9.6964456912507230e-03 -8.8250067450376633e-03 -5.4132352949176083e-03 5.1998116596097647e-03 -9.2350381936189309e-03 9.9389663467812578e-04 6.1728537574903342e-03 -4.4061876094593734e-03 7.0047553933383303e-03 6.3941167675145606e-03 -1.0155227828757763e-02 5.9210852873297377e-03 9.9883790047157438e-03 9.5023238189030773e-03 -2.8347265944725447e-02 -8.8357803962245806e-03 1.5464054084349099e-03 -1.0882918197573381e-02 -1.5657156900086216e-02 2.5723568790577342e-03 4.5755371678483585e-02 4.5405349102382343e-03 1.8483746145825874e-02 -1.2866410591078114e-03 1.8216818524400456e-02 -5.7643937021456711e-03 -2.4910901083255010e-02 -2.3373728532330002e-03 -1.6928926642214688e-02 -9.6683890675183081e-03 -1.3287841095501820e-02 -1.4183770473598445e-02 2.3419658386366643e-02 7.3724188056911765e-03 4.7722585657372068e-03 9.3796783471487826e-03 7.5931303758620776e-03 9.2652377686368546e-03 -6.1178375785662558e-03 -7.8194687409800633e-03 -9.5676547961384478e-04 -1.3025440679265393e-02 -1.3013873937949404e-02 -9.3471660247563398e-03 4.5405349102382335e-03 2.5153701343611286e-02 3.5908663928609576e-03 6.6808893580464568e-03 1.4282409318660053e-04 4.5814196601935819e-03 -3.8772629800516451e-03 -5.9683539320398464e-03 -3.4900169477706166e-03 -5.0086228171729637e-03 -1.0903785051153582e-02 -7.3408296540534140e-03 7.4280614396227875e-03 4.8158258494629281e-03 3.6972542845028194e-03 9.3524957743082154e-03 8.7742758711706129e-03 1.8928381626910275e-02 -1.1079501522928515e-02 -5.8917113473019424e-03 5.8028303366348336e-04 1.5041078292804262e-03 -1.1757435782821202e-02 -1.4633170272876947e-04 1.8483746145825874e-02 3.5908663928609580e-03 3.9379188889902363e-02 -9.1922975225895709e-04 1.5389564708088842e-02 -1.0713807455717048e-02 -1.6211789824470139e-02 -2.0484812202336226e-03 -1.9837734983983665e-02 -6.2212541804776934e-03 -1.2712946053261157e-02 -2.2963333354949992e-02 5.0914255307207973e-03 4.6558674314975106e-03 -5.2266460530966501e-03 1.9763909669981063e-03 2.4739481886079055e-03 8.6124454981215928e-04 -1.1183371442679446e-02 -7.9930232855996569e-03 3.8575501194033986e-03 -6.1912344831391236e-03 -3.6072850235387942e-03 1.2245611368358654e-03 -1.2866410591078118e-03 6.6808893580464560e-03 -9.1922975225895666e-04 2.6255938925315272e-02 4.1069339641094564e-03 -1.1259127275175856e-03 -9.1282043301036016e-03 -1.3510996421460777e-02 2.2867435274055311e-03 -6.6509638206876491e-03 -2.6180701749616425e-03 -1.6531963075889853e-03 6.2080852434042537e-03 1.4467603394797052e-02 -4.5317605460914283e-03 2.8254954232300130e-03 2.3084855420297222e-02 6.9063007470583828e-03 -1.9771601965604242e-02 -2.1443624965321387e-02 9.6405407421574288e-03 -3.7639432819501599e-03 -3.6996560488212253e-02 9.6964456912507230e-03 1.8216818524400456e-02 1.4282409318660085e-04 1.5389564708088844e-02 4.1069339641094573e-03 5.9345061895658226e-02 -1.0682847566874964e-02 -1.3363232285440780e-02 -1.0375628324758305e-02 -1.0363757755107714e-02 -2.1403347145800724e-03 -3.0541893629250680e-02 -1.4223150943784820e-02 1.3889864335835332e-02 1.6784965998400583e-02 -6.3630956227878864e-03 9.4604542603946918e-04 7.9458840082216892e-03 -6.7225933573528355e-03 6.7821423174108863e-03 6.4302466323844535e-03 -1.1049991526411953e-02 1.3038934510582920e-03 9.9456849022300196e-03 -8.8250067450376633e-03 -5.7643937021456693e-03 4.5814196601935819e-03 -1.0713807455717048e-02 -1.1259127275175852e-03 -1.0682847566874962e-02 2.9256378369523710e-02 2.2626183023989796e-03 -1.0443877079094551e-02 1.2455409662399653e-03 1.6027687658989203e-04 -4.8646125700309718e-04 -3.6809664315618276e-04 -4.5646699438342663e-03 -7.2900493000571283e-03 7.1775763919120009e-03 -9.9179607774131789e-03 -1.2806341237705531e-02 -1.3242215208489288e-02 2.2590817932009986e-02 7.0108208218721607e-03 3.6383441957759995e-03 5.3177228786455166e-04 1.8547029043213020e-02 -5.4132352949176100e-03 -2.4910901083255010e-02 -3.8772629800516456e-03 -1.6211789824470142e-02 -9.1282043301036016e-03 -1.3363232285440776e-02 2.2626183023989805e-03 4.2884004499785522e-02 3.1695771176735517e-03 1.8017911067426295e-02 5.8089991266446778e-03 1.0272321993970473e-02 1.0126176208588713e-02 -2.7858527655532955e-02 -8.9529124735312510e-03 8.2219055368705453e-04 -4.4127135827944294e-03 -1.0055010283799539e-02 -6.2402476766224126e-03 6.2919466728113506e-03 3.7372707678471544e-03 4.1395474169733442e-03 6.7863184470880206e-03 5.9416428914284205e-04 5.1998116596097656e-03 -2.3373728532329998e-03 -5.9683539320398455e-03 -2.0484812202336221e-03 -1.3510996421460773e-02 -1.0375628324758305e-02 -1.0443877079094551e-02 3.1695771176735521e-03 2.2822174557751047e-02 2.6160404766599910e-03 9.0481796416375816e-03 6.7406595197258739e-03 8.1005578715512665e-03 -5.0349390217222997e-03 -7.4952765938692302e-03 -1.3233514488437807e-03 -6.4824839351318251e-03 -1.2586405065899010e-02 -2.2892941966611246e-02 5.9769025306265376e-03 4.3228164462367430e-03 -6.3788633995051705e-03 -3.5538838728548574e-04 1.6075457490085460e-02 -9.2350381936189309e-03 -1.6928926642214688e-02 -3.4900169477706166e-03 -1.9837734983983665e-02 2.2867435274055311e-03 -1.0363757755107714e-02 1.2455409662399648e-03 1.8017911067426298e-02 2.6160404766599910e-03 3.7912594861075399e-02 8.6775167872340190e-03 9.7757970129630414e-03 1.9353479299264568e-02 -1.1192274948060387e-02 -6.3499316571678927e-03 -1.6703658286092550e-04 -4.9080272407265599e-03 -1.4358659530779882e-03 -1.4335208811931976e-03 1.0882525342512997e-03 5.3879104051136380e-03 4.3493622562946477e-03 3.9214063698137930e-03 2.6654699750695656e-03 9.9389663467812578e-04 -9.6683890675183064e-03 -5.0086228171729637e-03 -6.2212541804776951e-03 -6.6509638206876508e-03 -2.1403347145800724e-03 1.6027687658989203e-04 5.8089991266446796e-03 9.0481796416375833e-03 8.6775167872340190e-03 2.0686291896679827e-02 2.1240544209648795e-03 1.9323671512648114e-03 -1.0277569798457085e-02 -1.0640790957954643e-02 -8.4586446443906064e-03 -1.8296380008744227e-03 -2.0538069828604746e-02 -1.5068634005867434e-02 1.3991064032061334e-02 8.6482049996971060e-03 -3.7028480857901162e-03 3.0152856809760788e-03 2.6823283742594496e-02 6.1728537574903342e-03 -1.3287841095501820e-02 -1.0903785051153582e-02 -1.2712946053261159e-02 -2.6180701749616434e-03 -3.0541893629250676e-02 -4.8646125700309718e-04 1.0272321993970473e-02 6.7406595197258747e-03 9.7757970129630414e-03 2.1240544209648804e-03 3.8344010932357675e-02 1.7182579171106788e-02 -1.1667176856634879e-02 -1.8572410685366143e-02 -1.1603405396383598e-03 -1.8803151956650341e-03 -1.5663348480273915e-02 -1.9642086907043818e-02 1.3917215935354390e-02 4.2140431751358735e-03 -8.3241632361992189e-03 1.4350381186593671e-03 1.0034767634259232e-02 -4.4061876094593734e-03 -1.4183770473598445e-02 -7.3408296540534140e-03 -2.2963333354949992e-02 -1.6531963075889860e-03 -1.4223150943784820e-02 -3.6809664315618266e-04 1.0126176208588713e-02 8.1005578715512682e-03 1.9353479299264564e-02 1.9323671512648116e-03 1.7182579171106788e-02 3.6934733996462243e-02 -9.6935154370148165e-03 -2.3046187739410116e-03 -5.8434554491822643e-04 1.1346412963701182e-05 1.3482797603189519e-02 1.3075813262426100e-02 -2.6137207936452331e-02 -1.0257348621201911e-02 8.9658874784500544e-03 -1.1199213467236126e-02 -2.0311840234976879e-02 7.0047553933383295e-03 2.3419658386366643e-02 7.4280614396227867e-03 5.0914255307207964e-03 6.2080852434042554e-03 1.3889864335835332e-02 -4.5646699438342672e-03 -2.7858527655532959e-02 -5.0349390217222997e-03 -1.1192274948060387e-02 -1.0277569798457085e-02 -1.1667176856634877e-02 -9.6935154370148165e-03 4.5833428814943913e-02 1.2470581355888327e-02 -8.6874213360258155e-03 5.1944949058495195e-03 7.4643644302856658e-03 4.5896491668006630e-03 -1.1291162440649070e-02 -1.0016049672543988e-02 4.7454223322171132e-03 -8.6202325900911134e-03 -2.1924384522280720e-02 6.3941167675145606e-03 7.3724188056911765e-03 4.8158258494629290e-03 4.6558674314975106e-03 1.4467603394797053e-02 1.6784965998400583e-02 -7.2900493000571274e-03 -8.9529124735312510e-03 -7.4952765938692285e-03 -6.3499316571678918e-03 -1.0640790957954643e-02 -1.8572410685366140e-02 -2.3046187739410142e-03 1.2470581355888327e-02 2.8942965195910903e-02 -4.4404559668638141e-03 4.6040418856957326e-03 -3.3207423471490524e-03 -8.7067297489803654e-03 8.1429469900537420e-03 3.9204979301418683e-03 -7.9599600299024905e-03 3.3363885313341148e-03 8.9902337106382117e-03 -1.0155227828757763e-02 4.7722585657372085e-03 3.6972542845028190e-03 -5.2266460530966527e-03 -4.5317605460914283e-03 -6.3630956227878864e-03 7.1775763919120009e-03 8.2219055368705496e-04 -1.3233514488437805e-03 -1.6703658286092615e-04 -8.4586446443906064e-03 -1.1603405396383604e-03 -5.8434554491822730e-04 -8.6874213360258155e-03 -4.4404559668638150e-03 2.5622369396604429e-02 255 256 257 327 328 329 729 730 731 681 682 683 258 259 260 330 331 332 732 733 734 684 685 686 2.6439488196652056e-02 3.1565000022398524e-03 2.7227382146409228e-03 -1.2795646991348518e-02 -1.2343327231949473e-02 -9.4956806081257731e-03 -7.4574464500669459e-03 -3.7082609444072144e-03 -1.5549962021265228e-04 7.4721185195100927e-03 1.0721546531301935e-02 1.0597717686589117e-02 3.0533943698181536e-03 3.6675597836292456e-03 1.2432132684537136e-03 -1.1953729831567986e-02 -5.2053119926000193e-03 -7.4317315190535020e-03 -5.5938434347120652e-03 -2.4004702963491813e-03 -2.4345109231495581e-03 8.3566562171520653e-04 6.1117641481348538e-03 4.9537535008577329e-03 3.1565000022398529e-03 4.5718085050537462e-02 1.8380695615630906e-02 -1.3059891767593120e-02 -2.1157574274829810e-02 -1.5345670395692972e-03 -3.5323995100030388e-03 -3.4443873201265067e-02 -9.4858478537121656e-04 1.1379934209784786e-02 9.3831241236626162e-03 1.0170737287098488e-02 3.2618337191609760e-03 2.6825986183476196e-02 9.1593625636380519e-03 -1.4535516669456464e-02 -1.2234465203981323e-02 -1.4128061673886954e-02 -2.0400176373034699e-03 -2.3258094545512462e-02 -1.7591347736691507e-02 1.5369557653170478e-02 9.1668118679123761e-03 -3.5082342308484691e-03 2.7227382146409232e-03 1.8380695615630917e-02 4.3128926307670581e-02 -9.8787912531108635e-03 -1.7146174257555969e-03 -1.1697520691685164e-03 -2.0629712390803807e-03 -1.5943949408410693e-02 -8.4304788213475737e-04 1.0632151530075268e-02 1.0550686532122202e-02 2.1175455069310366e-02 9.5658822730991175e-04 7.3985660071060645e-03 -6.2084075291427730e-03 -1.4799769502692661e-02 -7.3536149958377279e-03 -2.5445540458505687e-02 -1.9683638609630854e-03 -1.6650513169998479e-02 -2.1615718666804572e-02 1.4398417883820893e-02 5.3327468451433097e-03 -9.0219147712246317e-03 -1.2795646991348521e-02 -1.3059891767593118e-02 -9.8787912531108635e-03 5.0077284522673300e-02 1.3980084442239072e-02 -1.0151149657226631e-02 9.8012032287332230e-03 1.8506035093970252e-02 -5.5402884476470652e-03 -3.2273298502808703e-02 -7.5417424974961976e-03 -1.2552997680652645e-02 -1.3400858039217345e-02 -2.2281385111393947e-02 7.2968163693244888e-03 2.6172263468450835e-02 7.7164095821064755e-03 6.4705369033034241e-03 1.9610524879909836e-03 1.5870942982058916e-02 1.5489289901532775e-02 -2.9542000174473764e-02 -1.3190452723891445e-02 8.8665838644764981e-03 -1.2343327231949473e-02 -2.1157574274829810e-02 -1.7146174257555975e-03 1.3980084442239072e-02 3.0598075300594801e-02 -5.2485387825806978e-03 1.5255951946524886e-02 2.1099671256118873e-02 -7.3843552222677238e-03 -1.0348870391678314e-02 -9.4721844465822068e-03 -6.7895836297667961e-03 -9.2607375679275676e-03 -2.5021010997936039e-02 6.9262317896356812e-03 8.3833619986781079e-03 5.2754674622719246e-03 4.7286600302591710e-03 6.2711839222300541e-03 1.0426227446347221e-02 5.0746187476478771e-03 -1.1937647118116764e-02 -1.1748671745984752e-02 4.4075844928280787e-03 -9.4956806081257731e-03 -1.5345670395692985e-03 -1.1697520691685164e-03 -1.0151149657226629e-02 -5.2485387825806978e-03 2.7298730822515813e-02 -4.7822989287085293e-03 -8.7138599534136302e-03 9.3903917364690399e-03 1.3859860753884050e-03 -1.1100648132604171e-03 -1.3934499803390976e-04 4.2340746265511460e-03 1.0325339022578721e-02 -1.2360579943153691e-02 4.5238777166492269e-03 4.7729889130565294e-03 -5.8466019094298109e-03 4.7490728958484484e-03 -3.7197015010681711e-03 -8.5031983941721585e-03 9.5361178796237022e-03 5.2284041542569612e-03 -8.6696452450267629e-03 -7.4574464500669450e-03 -3.5323995100030397e-03 -2.0629712390803812e-03 9.8012032287332230e-03 1.5255951946524886e-02 -4.7822989287085293e-03 2.4697266826210110e-02 6.0803050258294395e-03 -1.5152558078423454e-03 -1.3054993868336254e-02 -1.4691051849295114e-02 1.2403968267301420e-03 -7.0449613031213117e-03 -4.8381854574062189e-03 1.5748684847113879e-03 1.4415730206317960e-03 7.7468490414865174e-03 -8.7474337857988368e-05 4.6094739317193859e-03 3.8657638334867500e-03 1.8390377599276889e-03 -1.2992115385770010e-02 -9.8872330306232215e-03 3.7936972421200245e-03 -3.7082609444072144e-03 -3.4443873201265067e-02 -1.5943949408410693e-02 1.8506035093970249e-02 2.1099671256118870e-02 -8.7138599534136302e-03 6.0803050258294387e-03 6.3365951260364387e-02 -1.1442355066275535e-02 -1.7803946078282236e-02 -1.5675099079176323e-02 -1.3243780444395146e-02 -4.4600203096738320e-03 -4.1397662991262539e-02 1.0511012052114715e-02 2.0898208332278959e-02 1.8476209257082994e-03 1.7600553172732174e-02 3.4747115138187242e-03 3.0267509924533722e-02 1.1462952525848858e-02 -2.2987032633534094e-02 -2.5064118095021331e-02 9.7694271217992415e-03 -1.5549962021265220e-04 -9.4858478537121667e-04 -8.4304788213475758e-04 -5.5402884476470644e-03 -7.3843552222677238e-03 9.3903917364690399e-03 -1.5152558078423450e-03 -1.1442355066275535e-02 2.7102552858308517e-02 2.7432297686980373e-03 -1.0165877469026851e-02 -8.0515492034171189e-04 1.4687230691169827e-03 1.0558231260717730e-02 -9.5810741965587833e-03 -5.7932272569725142e-03 5.5749024409157836e-03 -9.6054914162932263e-03 1.1270411618337930e-03 6.7030451136533310e-03 -4.5132593678207057e-03 7.6652771330257639e-03 7.1049937276544779e-03 -1.1144916811628366e-02 7.4721185195100927e-03 1.1379934209784786e-02 1.0632151530075264e-02 -3.2273298502808703e-02 -1.0348870391678314e-02 1.3859860753884046e-03 -1.3054993868336253e-02 -1.7803946078282236e-02 2.7432297686980356e-03 5.1087628548539772e-02 5.7203125585011550e-03 2.0686858630700817e-02 -5.9506496450468247e-04 2.0514002758098081e-02 -6.0244829873308987e-03 -2.8110445929823168e-02 -3.2033680012618147e-03 -1.8671109007311233e-02 -1.1199763908364819e-02 -1.5142015527518012e-02 -1.5916222934985378e-02 2.6673820105787775e-02 8.8839504723563500e-03 5.1635889247649983e-03 1.0721546531301937e-02 9.3831241236626162e-03 1.0550686532122204e-02 -7.5417424974961985e-03 -9.4721844465822085e-03 -1.1100648132604174e-03 -1.4691051849295114e-02 -1.5675099079176327e-02 -1.0165877469026851e-02 5.7203125585011550e-03 2.8049685714814001e-02 4.5080685389521143e-03 7.6221481330613810e-03 1.2798195537995270e-03 4.9992257760917182e-03 -4.9254013303191273e-03 -6.8926805074567086e-03 -4.3216024114286272e-03 -5.7123462996599567e-03 -1.2684689750677207e-02 -8.5417499961129486e-03 8.8065347539059285e-03 6.0120243916163031e-03 4.0813138426628081e-03 1.0597717686589117e-02 1.0170737287098490e-02 2.1175455069310362e-02 -1.2552997680652645e-02 -6.7895836297667961e-03 -1.3934499803390965e-04 1.2403968267301398e-03 -1.3243780444395148e-02 -8.0515492034171233e-04 2.0686858630700813e-02 4.5080685389521135e-03 4.3604750736787240e-02 -6.5749837579099713e-04 1.7097211266631763e-02 -1.1122309996711962e-02 -1.8227181938388744e-02 -2.7795510854109595e-03 -2.1906597089002569e-02 -7.2311842008801223e-03 -1.4376416971323865e-02 -2.5503064025539843e-02 6.1438890516924329e-03 5.4133150382144005e-03 -5.3037347764675891e-03 3.0533943698181532e-03 3.2618337191609756e-03 9.5658822730991197e-04 -1.3400858039217346e-02 -9.2607375679275676e-03 4.2340746265511469e-03 -7.0449613031213117e-03 -4.4600203096738329e-03 1.4687230691169827e-03 -5.9506496450468182e-04 7.6221481330613801e-03 -6.5749837579099778e-04 2.9859033505033338e-02 5.2033566162964888e-03 -1.3370175635234161e-03 -1.1900134362439443e-02 -1.5444189450388288e-02 2.3197339559588013e-03 -7.6952951859252461e-03 -3.2487155752812381e-03 -2.0544668677282270e-03 7.7238859803565353e-03 1.6326324434752078e-02 -4.9301370718942018e-03 3.6675597836292452e-03 2.6825986183476196e-02 7.3985660071060628e-03 -2.2281385111393950e-02 -2.5021010997936036e-02 1.0325339022578723e-02 -4.8381854574062197e-03 -4.1397662991262539e-02 1.0558231260717730e-02 2.0514002758098081e-02 1.2798195537995277e-03 1.7097211266631766e-02 5.2033566162964888e-03 6.6833862278396564e-02 -1.1302717754835148e-02 -1.5086147019895709e-02 -1.3706115591923265e-02 -1.1110350658738964e-02 -2.9957684625984819e-03 -3.4473031458913492e-02 -1.5931428010531892e-02 1.5816566893270545e-02 1.9658153024363037e-02 -7.0348511329282664e-03 1.2432132684537141e-03 9.1593625636380519e-03 -6.2084075291427687e-03 7.2968163693244888e-03 6.9262317896356829e-03 -1.2360579943153691e-02 1.5748684847113881e-03 1.0511012052114715e-02 -9.5810741965587833e-03 -6.0244829873308987e-03 4.9992257760917182e-03 -1.1122309996711963e-02 -1.3370175635234159e-03 -1.1302717754835144e-02 3.2587601240708572e-02 1.9784776539788105e-03 -1.1682465755740817e-02 -3.4107491727385000e-04 1.5723245226619020e-04 -7.9047971566911682e-04 -1.0011712218291665e-03 -4.8891076778802764e-03 -7.8201689552350913e-03 8.0270165639616583e-03 -1.1953729831567986e-02 -1.4535516669456464e-02 -1.4799769502692661e-02 2.6172263468450838e-02 8.3833619986781079e-03 4.5238777166492269e-03 1.4415730206317951e-03 2.0898208332278959e-02 -5.7932272569725125e-03 -2.8110445929823164e-02 -4.9254013303191273e-03 -1.8227181938388744e-02 -1.1900134362439443e-02 -1.5086147019895709e-02 1.9784776539788105e-03 4.8738523334538056e-02 4.2783801270331635e-03 1.9986610654310996e-02 7.2649550148326664e-03 1.1658580032466694e-02 1.1549061902404628e-02 -3.1653004714622762e-02 -1.0671465470785617e-02 7.8215077071024878e-04 -5.2053119926000193e-03 -1.2234465203981325e-02 -7.3536149958377270e-03 7.7164095821064755e-03 5.2754674622719237e-03 4.7729889130565294e-03 7.7468490414865174e-03 1.8476209257082979e-03 5.5749024409157844e-03 -3.2033680012618147e-03 -6.8926805074567069e-03 -2.7795510854109590e-03 -1.5444189450388288e-02 -1.3706115591923269e-02 -1.1682465755740813e-02 4.2783801270331627e-03 2.6254214378330112e-02 3.4809161217513561e-03 1.0278749904370872e-02 8.4952043347870446e-03 9.3710731242748271e-03 -6.1675192107469041e-03 -9.0392457977360730e-03 -1.3842487630089959e-03 -7.4317315190535029e-03 -1.4128061673886954e-02 -2.5445540458505687e-02 6.4705369033034223e-03 4.7286600302591693e-03 -5.8466019094298161e-03 -8.7474337857988368e-05 1.7600553172732174e-02 -9.6054914162932263e-03 -1.8671109007311233e-02 -4.3216024114286263e-03 -2.1906597089002566e-02 2.3197339559588013e-03 -1.1110350658738966e-02 -3.4107491727385000e-04 1.9986610654310989e-02 3.4809161217513548e-03 4.2305034181870531e-02 9.8242099976486117e-03 1.0979063617928541e-02 2.1605602643075320e-02 -1.2410776646999105e-02 -7.2291781986166901e-03 -7.6533103444071434e-04 -5.5938434347120643e-03 -2.0400176373034699e-03 -1.9683638609630854e-03 1.9610524879909831e-03 6.2711839222300532e-03 4.7490728958484475e-03 4.6094739317193850e-03 3.4747115138187238e-03 1.1270411618337934e-03 -1.1199763908364819e-02 -5.7123462996599567e-03 -7.2311842008801214e-03 -7.6952951859252461e-03 -2.9957684625984810e-03 1.5723245226618987e-04 7.2649550148326655e-03 1.0278749904370872e-02 9.8242099976486117e-03 2.2801348346444286e-02 2.7981825220218773e-03 2.5378852953743107e-03 -1.2147927251985186e-02 -1.2074695462879620e-02 -9.1958937411281468e-03 -2.4004702963491809e-03 -2.3258094545512462e-02 -1.6650513169998483e-02 1.5870942982058916e-02 1.0426227446347219e-02 -3.7197015010681711e-03 3.8657638334867492e-03 3.0267509924533722e-02 6.7030451136533319e-03 -1.5142015527518007e-02 -1.2684689750677207e-02 -1.4376416971323868e-02 -3.2487155752812381e-03 -3.4473031458913478e-02 -7.9047971566911747e-04 1.1658580032466691e-02 8.4952043347870411e-03 1.0979063617928541e-02 2.7981825220218777e-03 4.2684630769329247e-02 1.9199626589539394e-02 -1.3402267970885806e-02 -2.1457756719894083e-02 -1.3446239630616392e-03 -2.4345109231495585e-03 -1.7591347736691507e-02 -2.1615718666804572e-02 1.5489289901532775e-02 5.0746187476478780e-03 -8.5031983941721585e-03 1.8390377599276887e-03 1.1462952525848861e-02 -4.5132593678207048e-03 -1.5916222934985375e-02 -8.5417499961129469e-03 -2.5503064025539843e-02 -2.0544668677282270e-03 -1.5931428010531892e-02 -1.0011712218291674e-03 1.1549061902404630e-02 9.3710731242748271e-03 2.1605602643075320e-02 2.5378852953743102e-03 1.9199626589539390e-02 4.0677851521857947e-02 -1.1010074133376244e-02 -3.0437452439746040e-03 -1.1470424887668257e-03 8.3566562171520642e-04 1.5369557653170478e-02 1.4398417883820893e-02 -2.9542000174473764e-02 -1.1937647118116766e-02 9.5361178796237039e-03 -1.2992115385770008e-02 -2.2987032633534094e-02 7.6652771330257639e-03 2.6673820105787772e-02 8.8065347539059303e-03 6.1438890516924329e-03 7.7238859803565353e-03 1.5816566893270545e-02 -4.8891076778802764e-03 -3.1653004714622762e-02 -6.1675192107469041e-03 -1.2410776646999105e-02 -1.2147927251985187e-02 -1.3402267970885805e-02 -1.1010074133376244e-02 5.1101675818992207e-02 1.4501807632936613e-02 -9.4337434899071544e-03 6.1117641481348538e-03 9.1668118679123761e-03 5.3327468451433106e-03 -1.3190452723891445e-02 -1.1748671745984754e-02 5.2284041542569612e-03 -9.8872330306232197e-03 -2.5064118095021334e-02 7.1049937276544779e-03 8.8839504723563500e-03 6.0120243916163031e-03 5.4133150382143997e-03 1.6326324434752078e-02 1.9658153024363037e-02 -7.8201689552350913e-03 -1.0671465470785612e-02 -9.0392457977360730e-03 -7.2291781986166901e-03 -1.2074695462879620e-02 -2.1457756719894080e-02 -3.0437452439746032e-03 1.4501807632936611e-02 3.2472803074744518e-02 -4.9863673674427561e-03 4.9537535008577337e-03 -3.5082342308484695e-03 -9.0219147712246317e-03 8.8665838644764981e-03 4.4075844928280778e-03 -8.6696452450267629e-03 3.7936972421200249e-03 9.7694271217992432e-03 -1.1144916811628370e-02 5.1635889247649983e-03 4.0813138426628081e-03 -5.3037347764675925e-03 -4.9301370718942000e-03 -7.0348511329282664e-03 8.0270165639616583e-03 7.8215077071024889e-04 -1.3842487630089959e-03 -7.6533103444071499e-04 -9.1958937411281468e-03 -1.3446239630616401e-03 -1.1470424887668252e-03 -9.4337434899071544e-03 -4.9863673674427561e-03 2.8025568563593232e-02 615 616 617 681 682 683 693 694 695 627 628 629 618 619 620 684 685 686 696 697 698 630 631 632 2.4725263855849840e-02 -1.1666830285078135e-03 -1.2568467142645137e-03 -7.7227519126044884e-03 -9.7003045604619510e-03 -8.9129736583112157e-03 -7.2226068197668806e-03 1.8010447213731228e-03 -1.0499680651073672e-04 2.4643423790751086e-03 9.1393787435404758e-03 7.7674869390978851e-03 3.5754711708630557e-03 -1.0280232726915227e-03 -1.4975119486524064e-04 -7.0780203283166924e-03 -4.1263666067661835e-03 -4.0255398186474708e-03 -5.4043584240658464e-03 1.4145872433982594e-03 1.2501243742579428e-03 -3.3373399210340914e-03 3.6663667601156127e-03 5.4324968792433502e-03 -1.1666830285078139e-03 4.4936826097766329e-02 1.8234473945339200e-02 -1.0738249552111785e-02 -2.5090406588102170e-02 -3.4057563512703477e-03 1.6376780146712868e-03 -3.4353911455264931e-02 -1.8633308206988332e-03 9.7285518992878753e-03 1.2927910847658675e-02 1.1559209805046957e-02 -1.3789094611389918e-03 2.7937028245372881e-02 9.0301829725139802e-03 -1.3285990733556964e-02 -1.5484087425487028e-02 -1.4784284589434881e-02 1.9599675124469954e-03 -2.3411419223347125e-02 -1.7110242726975058e-02 1.3243635348909400e-02 1.2538059501403369e-02 -1.6602522345210114e-03 -1.2568467142645133e-03 1.8234473945339204e-02 4.1027767469353549e-02 -9.6771727274568269e-03 -4.2356664621931309e-03 -2.4867827582280206e-03 6.4355922375779174e-04 -1.5756122468623908e-02 -2.6067685165971190e-03 7.7411383635892679e-03 1.1915203619180999e-02 1.9449463954514509e-02 2.1472211104122763e-05 8.2507413106271427e-03 -3.3572190709388076e-03 -1.2278630561487673e-02 -9.8379472287656814e-03 -2.3751688235059354e-02 1.6871176533978078e-03 -1.6367281645019532e-02 -2.0709118419527335e-02 1.3119362551360023e-02 7.7965989294549193e-03 -7.5656544235174197e-03 -7.7227519126044884e-03 -1.0738249552111785e-02 -9.6771727274568252e-03 4.3607510185198588e-02 1.6541659638252670e-02 -7.6455360346920093e-03 3.8472267206352152e-03 1.5296057920183695e-02 -3.2944294822930291e-03 -2.7838788178212170e-02 -1.0973097695596139e-02 -1.1061602288901481e-02 -7.7786020209829202e-03 -1.9255327962427880e-02 4.7882601922518558e-03 2.3097936189836941e-02 1.0796922894381155e-02 6.3775349175816997e-03 -2.3438571441581771e-03 1.3707877652587427e-02 1.3958321438165276e-02 -2.4868673839712974e-02 -1.5375842895269160e-02 6.5546239853445116e-03 -9.7003045604619510e-03 -2.5090406588102170e-02 -4.2356664621931318e-03 1.6541659638252670e-02 3.4514185378991195e-02 -5.7335323480518403e-03 1.2072753265037152e-02 2.5461624679395715e-02 -6.5533178451960827e-03 -1.3384345161010872e-02 -1.3674415279305728e-02 -8.5066965705392593e-03 -6.4365049823486269e-03 -2.8762270190543913e-02 6.5097536378102621e-03 1.1519977089686651e-02 1.0012193689197072e-02 5.8968011123700257e-03 3.7537007089515472e-03 1.3961813552097016e-02 7.7634446737990231e-03 -1.4366935998106574e-02 -1.6422725241729198e-02 4.8592138020010014e-03 -8.9129736583112157e-03 -3.4057563512703477e-03 -2.4867827582280206e-03 -7.6455360346920085e-03 -5.7335323480518403e-03 2.4661339223169598e-02 -2.4653231058249648e-03 -7.5855572350085072e-03 7.6214640086023945e-03 4.4956295366229061e-04 -9.7438395504603520e-04 -1.7983427308652072e-03 1.9881716295309902e-03 8.9578765387172063e-03 -1.0290547426823770e-02 4.0110795588922093e-03 5.0148786367462724e-03 -3.2256504174320091e-03 5.3958519502972776e-03 -1.9587621474215634e-03 -6.9166303731481278e-03 7.1791667064454194e-03 5.6852368613348157e-03 -7.5648495252748551e-03 -7.2226068197668832e-03 1.6376780146712870e-03 6.4355922375779152e-04 3.8472267206352139e-03 1.2072753265037152e-02 -2.4653231058249644e-03 2.2725906580490163e-02 -7.9100227081301542e-04 3.7855366744700381e-04 -8.4161019490238444e-03 -1.2623387731540632e-02 2.6660990605749074e-03 -5.9192664523511742e-03 1.3024391426018846e-03 -2.1088394646403156e-04 -2.3529024532605866e-03 6.3473084190151189e-03 -2.5461456193293531e-03 4.9496811684754810e-03 -1.1942027700811782e-03 -9.7332777503748229e-05 -7.6119367951983739e-03 -6.7515860688906158e-03 1.6314734973423943e-03 1.8010447213731241e-03 -3.4353911455264931e-02 -1.5756122468623911e-02 1.5296057920183695e-02 2.5461624679395715e-02 -7.5855572350085063e-03 -7.9100227081301520e-04 6.1286914220916568e-02 -8.7439980355773078e-03 -1.4998345225814877e-02 -2.2185340748580251e-02 -1.1766476883636212e-02 1.1691986501979950e-03 -3.9910433941342582e-02 8.1721787792907001e-03 1.8687839576683716e-02 8.2629753891037255e-03 1.6300506413627798e-02 -1.6460224614654588e-03 3.0800632494485138e-02 1.1129304451727898e-02 -1.9518770910345186e-02 -2.9362460638713402e-02 8.2501649781995413e-03 -1.0499680651073674e-04 -1.8633308206988340e-03 -2.6067685165971190e-03 -3.2944294822930291e-03 -6.5533178451960836e-03 7.6214640086023954e-03 3.7855366744700365e-04 -8.7439980355773061e-03 2.4689363122060753e-02 3.1357900132047700e-03 -9.4770271678713703e-03 -3.4551022715649258e-03 -1.8181211412558653e-04 8.2536494315173254e-03 -7.8480369856388302e-03 -5.1279711735448446e-03 4.2962885974401682e-03 -6.8754629166523171e-03 1.7859837221640725e-04 7.4422277828132899e-03 -1.7692224547739875e-03 5.0162675236060158e-03 6.6455080575728107e-03 -9.7562339854359685e-03 2.4643423790751103e-03 9.7285518992878753e-03 7.7411383635892670e-03 -2.7838788178212177e-02 -1.3384345161010874e-02 4.4956295366229061e-04 -8.4161019490238444e-03 -1.4998345225814873e-02 3.1357900132047700e-03 4.5309326791694346e-02 9.3030703569345671e-03 1.7771624004310260e-02 -3.9140593369283621e-03 1.8126194170824700e-02 -5.2352711994228425e-03 -2.3919535731416322e-02 -6.9140427509122859e-03 -1.6212413694244310e-02 -6.6755304715569062e-03 -1.3409750912838966e-02 -1.2869033359456402e-02 2.2990346496368153e-02 1.1548667623529870e-02 5.2186029183569644e-03 9.1393787435404758e-03 1.2927910847658677e-02 1.1915203619180999e-02 -1.0973097695596136e-02 -1.3674415279305727e-02 -9.7438395504603455e-04 -1.2623387731540632e-02 -2.2185340748580248e-02 -9.4770271678713703e-03 9.3030703569345671e-03 2.9889901343063994e-02 8.0572466679423305e-03 6.0723350118597457e-03 7.4267570760838736e-03 3.8368116509650638e-03 -8.2730124491012594e-03 -8.8179025969695960e-03 -7.4624780210890019e-03 -4.2977701770306109e-03 -1.6332407445250965e-02 -1.0956360164892303e-02 1.1652483940933852e-02 1.0765496803300001e-02 5.0609873708103150e-03 7.7674869390978825e-03 1.1559209805046957e-02 1.9449463954514509e-02 -1.1061602288901479e-02 -8.5066965705392593e-03 -1.7983427308652074e-03 2.6660990605749078e-03 -1.1766476883636214e-02 -3.4551022715649258e-03 1.7771624004310260e-02 8.0572466679423305e-03 4.0731069686696555e-02 -2.7873220180237232e-03 1.5628487937392171e-02 -8.2662027813661942e-03 -1.5898240887651075e-02 -6.1234164892234591e-03 -2.0068810167618197e-02 -3.7231660585918527e-03 -1.4705461336032823e-02 -2.3882795968436277e-02 5.2651212491850851e-03 5.8571068690503048e-03 -2.7092797213602712e-03 3.5754711708630552e-03 -1.3789094611389922e-03 2.1472211104122708e-05 -7.7786020209829202e-03 -6.4365049823486261e-03 1.9881716295309902e-03 -5.9192664523511742e-03 1.1691986501979946e-03 -1.8181211412558667e-04 -3.9140593369283612e-03 6.0723350118597457e-03 -2.7873220180237232e-03 2.6620121653317869e-02 -9.7357345912434026e-04 4.2513603316507995e-04 -7.5917992427005782e-03 -1.3170364539226929e-02 2.9435655170892460e-03 -7.5554894062371614e-03 1.4771955642708611e-03 5.1149783043871885e-04 2.5636236350192673e-03 1.3240623215510283e-02 -2.9207090891788488e-03 -1.0280232726915231e-03 2.7937028245372881e-02 8.2507413106271410e-03 -1.9255327962427880e-02 -2.8762270190543913e-02 8.9578765387172063e-03 1.3024391426018846e-03 -3.9910433941342582e-02 8.2536494315173254e-03 1.8126194170824693e-02 7.4267570760838736e-03 1.5628487937392171e-02 -9.7357345912434004e-04 6.3580189558526318e-02 -8.6937705041479248e-03 -1.3432070018305394e-02 -2.0017807871029327e-02 -1.0606581482805034e-02 2.5395394207947562e-03 -3.4256222925689403e-02 -1.5622127076530119e-02 1.2720821978327803e-02 2.4002760048622149e-02 -6.1682761547707642e-03 -1.4975119486524059e-04 9.0301829725139802e-03 -3.3572190709388076e-03 4.7882601922518558e-03 6.5097536378102630e-03 -1.0290547426823770e-02 -2.1088394646403159e-04 8.1721787792907001e-03 -7.8480369856388302e-03 -5.2352711994228425e-03 3.8368116509650638e-03 -8.2662027813661942e-03 4.2513603316508017e-04 -8.6937705041479248e-03 2.8682174676315775e-02 3.0102982166850386e-03 -1.0316162021952725e-02 -2.7042069978154629e-03 9.9942630690102248e-05 -1.7096840017531742e-03 -2.7806156829173244e-03 -2.7277307320399628e-03 -6.8293105127261861e-03 6.5646542691846117e-03 -7.0780203283166915e-03 -1.3285990733556964e-02 -1.2278630561487673e-02 2.3097936189836937e-02 1.1519977089686651e-02 4.0110795588922093e-03 -2.3529024532605871e-03 1.8687839576683716e-02 -5.1279711735448446e-03 -2.3919535731416322e-02 -8.2730124491012594e-03 -1.5898240887651075e-02 -7.5917992427005764e-03 -1.3432070018305394e-02 3.0102982166850386e-03 4.2843176335678058e-02 8.1758834370250465e-03 1.7588249709487632e-02 2.5459131605240475e-03 1.0206485588674203e-02 8.7473137062482539e-03 -2.7544767930344868e-02 -1.3599112491106008e-02 -5.2098568629540686e-05 -4.1263666067661827e-03 -1.5484087425487028e-02 -9.8379472287656814e-03 1.0796922894381155e-02 1.0012193689197074e-02 5.0148786367462742e-03 6.3473084190151189e-03 8.2629753891037255e-03 4.2962885974401691e-03 -6.9140427509122851e-03 -8.8179025969695960e-03 -6.1234164892234599e-03 -1.3170364539226927e-02 -2.0017807871029327e-02 -1.0316162021952725e-02 8.1758834370250465e-03 2.6769588115265603e-02 7.2103832690570127e-03 8.7917385573064478e-03 1.2507532500209759e-02 1.1083152832319457e-02 -9.9010794108223693e-03 -1.3232491800290217e-02 -1.3271775956210496e-03 -4.0255398186474708e-03 -1.4784284589434879e-02 -2.3751688235059354e-02 6.3775349175816988e-03 5.8968011123700249e-03 -3.2256504174320087e-03 -2.5461456193293522e-03 1.6300506413627798e-02 -6.8754629166523163e-03 -1.6212413694244310e-02 -7.4624780210890002e-03 -2.0068810167618197e-02 2.9435655170892464e-03 -1.0606581482805038e-02 -2.7042069978154611e-03 1.7588249709487632e-02 7.2103832690570135e-03 3.8842751643157869e-02 6.8486516229723090e-03 1.2321816169539123e-02 2.0159463482394203e-02 -1.0973902634909750e-02 -8.8761628712650462e-03 -2.3763963909747372e-03 -5.4043584240658464e-03 1.9599675124469954e-03 1.6871176533978082e-03 -2.3438571441581771e-03 3.7537007089515476e-03 5.3958519502972768e-03 4.9496811684754810e-03 -1.6460224614654594e-03 1.7859837221640749e-04 -6.6755304715569071e-03 -4.2977701770306109e-03 -3.7231660585918540e-03 -7.5554894062371614e-03 2.5395394207947571e-03 9.9942630690101923e-05 2.5459131605240475e-03 8.7917385573064478e-03 6.8486516229723090e-03 2.2316161861432940e-02 -1.5860416793416899e-03 -1.5781094134484825e-03 -7.8325207444143782e-03 -9.5151118816619897e-03 -8.9088867575335684e-03 1.4145872433982589e-03 -2.3411419223347125e-02 -1.6367281645019532e-02 1.3707877652587427e-02 1.3961813552097014e-02 -1.9587621474215634e-03 -1.1942027700811786e-03 3.0800632494485138e-02 7.4422277828132899e-03 -1.3409750912838966e-02 -1.6332407445250965e-02 -1.4705461336032821e-02 1.4771955642708611e-03 -3.4256222925689403e-02 -1.7096840017531739e-03 1.0206485588674201e-02 1.2507532500209761e-02 1.2321816169539122e-02 -1.5860416793416895e-03 4.2709787758996372e-02 1.8722518821388583e-02 -1.0616150686668916e-02 -2.5979716711500799e-02 -3.7453736435139003e-03 1.2501243742579430e-03 -1.7110242726975058e-02 -2.0709118419527335e-02 1.3958321438165276e-02 7.7634446737990231e-03 -6.9166303731481278e-03 -9.7332777503748608e-05 1.1129304451727898e-02 -1.7692224547739884e-03 -1.2869033359456401e-02 -1.0956360164892303e-02 -2.3882795968436274e-02 5.1149783043871841e-04 -1.5622127076530119e-02 -2.7806156829173244e-03 8.7473137062482539e-03 1.1083152832319457e-02 2.0159463482394203e-02 -1.5781094134484821e-03 1.8722518821388579e-02 3.9195784044889742e-02 -9.9227817987015601e-03 -5.0096908108374855e-03 -3.2968646284808958e-03 -3.3373399210340901e-03 1.3243635348909400e-02 1.3119362551360023e-02 -2.4868673839712974e-02 -1.4366935998106576e-02 7.1791667064454202e-03 -7.6119367951983739e-03 -1.9518770910345186e-02 5.0162675236060158e-03 2.2990346496368157e-02 1.1652483940933853e-02 5.2651212491850851e-03 2.5636236350192682e-03 1.2720821978327803e-02 -2.7277307320399628e-03 -2.7544767930344868e-02 -9.9010794108223710e-03 -1.0973902634909750e-02 -7.8325207444143764e-03 -1.0616150686668916e-02 -9.9227817987015618e-03 4.5641269099317261e-02 1.6785995737772008e-02 -6.9555028649452653e-03 3.6663667601156127e-03 1.2538059501403369e-02 7.7965989294549176e-03 -1.5375842895269158e-02 -1.6422725241729198e-02 5.6852368613348149e-03 -6.7515860688906158e-03 -2.9362460638713398e-02 6.6455080575728107e-03 1.1548667623529870e-02 1.0765496803299999e-02 5.8571068690503048e-03 1.3240623215510281e-02 2.4002760048622149e-02 -6.8293105127261843e-03 -1.3599112491106007e-02 -1.3232491800290215e-02 -8.8761628712650462e-03 -9.5151118816619879e-03 -2.5979716711500799e-02 -5.0096908108374838e-03 1.6785995737772008e-02 3.7691078038908102e-02 -5.2692865225841346e-03 5.4324968792433493e-03 -1.6602522345210116e-03 -7.5656544235174188e-03 6.5546239853445116e-03 4.8592138020010014e-03 -7.5648495252748568e-03 1.6314734973423939e-03 8.2501649781995395e-03 -9.7562339854359668e-03 5.2186029183569635e-03 5.0609873708103150e-03 -2.7092797213602712e-03 -2.9207090891788488e-03 -6.1682761547707651e-03 6.5646542691846126e-03 -5.2098568629540957e-05 -1.3271775956210496e-03 -2.3763963909747372e-03 -8.9088867575335684e-03 -3.7453736435139008e-03 -3.2968646284808967e-03 -6.9555028649452644e-03 -5.2692865225841337e-03 2.6704624405859533e-02 681 682 683 729 730 731 741 742 743 693 694 695 684 685 686 732 733 734 744 745 746 696 697 698 2.7873706681055724e-02 -1.3066237794595536e-03 -1.4187355673585178e-03 -8.8959175981801319e-03 -1.0916834262011954e-02 -1.0036378792612009e-02 -8.0413866360458768e-03 2.0933312927086229e-03 -1.1572777796162691e-04 2.7612580109346719e-03 1.0225582473617384e-02 8.6949894891092186e-03 4.0806780922593364e-03 -1.1643076754702959e-03 -1.7776456582643330e-04 -7.9971337750059050e-03 -4.6383162351635969e-03 -4.4762447565076992e-03 -6.0174823634829896e-03 1.6239293076068255e-03 1.4456735594463796e-03 -3.7637224115348346e-03 4.0832388781725671e-03 6.0841884117106889e-03 -1.3066237794595553e-03 5.0361885279620995e-02 2.0290451189166028e-02 -1.1922139266221614e-02 -2.8348615740527178e-02 -3.9766945664796993e-03 1.8042916859828692e-03 -3.8208501119396679e-02 -2.0135288978229545e-03 1.0832170944995823e-02 1.4468353864403771e-02 1.2958665054036563e-02 -1.5965830218395679e-03 3.1168096022043151e-02 1.0179566641668405e-02 -1.4820310438003477e-02 -1.7434073939774596e-02 -1.6458408635034640e-02 2.2168657446658743e-03 -2.5993569481101216e-02 -1.9093952307076768e-02 1.4792328129879640e-02 1.3986425114731750e-02 -1.8860984784569289e-03 -1.4187355673585173e-03 2.0290451189166031e-02 4.5979568129254585e-02 -1.0712414682853427e-02 -4.6491823610086604e-03 -3.1165114859483091e-03 7.2886832437620919e-04 -1.7468430826280842e-02 -2.8240270450422531e-03 8.5803479036422794e-03 1.3287173719223264e-02 2.1784425473295770e-02 -1.2290656843840474e-05 9.0299987470808165e-03 -3.6588850001124762e-03 -1.3738804788840060e-02 -1.1013688480288308e-02 -2.6576589732229469e-02 1.9099703852729151e-03 -1.8165743709554184e-02 -2.3092415619048692e-02 1.4663059082604440e-02 8.6894217216618996e-03 -8.4955647201691471e-03 -8.8959175981801301e-03 -1.1922139266221611e-02 -1.0712414682853427e-02 4.9230731327907347e-02 1.8586559009334112e-02 -8.5161975227075852e-03 4.2797347639010391e-03 1.7014319777185403e-02 -3.7504244865079845e-03 -3.1279386162359930e-02 -1.2352398621181667e-02 -1.2457073968385855e-02 -8.7397575893037403e-03 -2.1474416240963374e-02 5.3624539993593050e-03 2.6033065939724882e-02 1.2149980408189756e-02 7.0163744944962223e-03 -2.7159902727167239e-03 1.5261058194577159e-02 1.5656356146288953e-02 -2.7912480408972748e-02 -1.7262963260919785e-02 7.4009260203103657e-03 -1.0916834262011952e-02 -2.8348615740527185e-02 -4.6491823610086604e-03 1.8586559009334112e-02 3.9068600721198596e-02 -6.3830704399332212e-03 1.3518449044182387e-02 2.8476893520847733e-02 -7.3799954766908564e-03 -1.4977327917481494e-02 -1.5408561779138311e-02 -9.5562955032818028e-03 -7.1788377461838989e-03 -3.2259001969160560e-02 7.2397769396529985e-03 1.2935469097477241e-02 1.1359741573465568e-02 6.5119052282560722e-03 4.1427883938481005e-03 1.5540878886089821e-02 8.7351983678223260e-03 -1.6110265619164496e-02 -1.8429935212775670e-02 5.4816632451831432e-03 -1.0036378792612009e-02 -3.9766945664797002e-03 -3.1165114859483100e-03 -8.5161975227075835e-03 -6.3830704399332203e-03 2.7921741997016622e-02 -2.7916489388419966e-03 -8.4118430927864231e-03 8.5594933867952135e-03 4.6701393515325026e-04 -1.1404146781626660e-03 -2.1157499853462734e-03 2.2007050180932897e-03 9.9831915169652195e-03 -1.1580985811697949e-02 4.6112597295701096e-03 5.7049269808150983e-03 -3.4430833319295667e-03 6.0608402239888974e-03 -2.1171905839645322e-03 -7.7338679255924640e-03 8.0044063473560436e-03 6.3410948635462252e-03 -8.4910368432972640e-03 -8.0413866360458768e-03 1.8042916859828688e-03 7.2886832437620919e-04 4.2797347639010417e-03 1.3518449044182389e-02 -2.7916489388419975e-03 2.5204916738150940e-02 -9.2958476464786056e-04 4.3429097694366316e-04 -9.1812589067567733e-03 -1.4062959655801933e-02 2.9986357856308069e-03 -6.5869717027583546e-03 1.4533386422291134e-03 -2.3541092605849443e-04 -2.6924259501225835e-03 7.0859171090382894e-03 -2.8900683478535420e-03 5.3572731065492686e-03 -1.3712382127762802e-03 -9.6622255598505561e-05 -8.3398814129176588e-03 -7.4982138482065867e-03 1.8519553814018608e-03 2.0933312927086238e-03 -3.8208501119396679e-02 -1.7468430826280842e-02 1.7014319777185403e-02 2.8476893520847729e-02 -8.4118430927864231e-03 -9.2958476464785947e-04 6.8070341649844407e-02 -9.8802379688537473e-03 -1.6749520197574266e-02 -2.4569806498751408e-02 -1.3229696607782917e-02 1.4235740570727345e-03 -4.4389852153411576e-02 9.0920173683262072e-03 2.0894309028903268e-02 9.2283370229015570e-03 1.8119245452626824e-02 -1.9154023123493383e-03 3.4038458766991769e-02 1.2510877299929484e-02 -2.1831026881298565e-02 -3.2645871189025816e-02 9.2680683748214091e-03 -1.1572777796162684e-04 -2.0135288978229537e-03 -2.8240270450422540e-03 -3.7504244865079863e-03 -7.3799954766908564e-03 8.5594933867952118e-03 4.3429097694366316e-04 -9.8802379688537473e-03 2.7477108019386885e-02 3.6293434194531429e-03 -1.0486261970445030e-02 -3.5796469244887613e-03 -2.3623827694139820e-04 9.3331582174539223e-03 -8.7655545444865323e-03 -5.8233304081144023e-03 4.7481564306647902e-03 -7.7845522445302911e-03 1.8922800052406132e-04 8.1561209252997199e-03 -2.2506238027653076e-03 5.6728585526045448e-03 7.5225887403941585e-03 -1.0832196844868944e-02 2.7612580109346702e-03 1.0832170944995823e-02 8.5803479036422794e-03 -3.1279386162359930e-02 -1.4977327917481494e-02 4.6701393515325047e-04 -9.1812589067567715e-03 -1.6749520197574259e-02 3.6293434194531425e-03 5.0594469270469622e-02 1.0418409056300107e-02 1.9953423754873533e-02 -4.4464267713555279e-03 2.0238936191546642e-02 -5.8723857424732764e-03 -2.6858914220531365e-02 -7.7615154678464613e-03 -1.8087050059145064e-02 -7.2767423861309546e-03 -1.4968359792504540e-02 -1.4395446037284799e-02 2.5687001165730246e-02 1.2967207182564194e-02 5.7247528257809380e-03 1.0225582473617384e-02 1.4468353864403769e-02 1.3287173719223264e-02 -1.2352398621181666e-02 -1.5408561779138311e-02 -1.1404146781626651e-03 -1.4062959655801933e-02 -2.4569806498751408e-02 -1.0486261970445030e-02 1.0418409056300105e-02 3.3292069303112001e-02 9.0347901928190654e-03 6.7630408206693707e-03 8.2835994222858287e-03 4.2962329110248091e-03 -9.3027700238771036e-03 -9.9113541366439781e-03 -8.3397183890456406e-03 -4.7341146133344312e-03 -1.8102289289000290e-02 -1.2234705148488227e-02 1.3045210563608267e-02 1.1947989113732387e-02 5.5829033630744266e-03 8.6949894891092186e-03 1.2958665054036563e-02 2.1784425473295770e-02 -1.2457073968385858e-02 -9.5562955032818045e-03 -2.1157499853462734e-03 2.9986357856308064e-03 -1.3229696607782915e-02 -3.5796469244887595e-03 1.9953423754873533e-02 9.0347901928190637e-03 4.5551826690689183e-02 -3.1638681356531192e-03 1.7485272364796724e-02 -9.2699914493284755e-03 -1.7921006579415366e-02 -6.9033456200611118e-03 -2.2496992611041221e-02 -4.1415995239944686e-03 -1.6441394350521048e-02 -2.6668278376115431e-02 6.0364991778352525e-03 6.6520044699945359e-03 -3.2055928176647807e-03 4.0806780922593364e-03 -1.5965830218395672e-03 -1.2290656843840094e-05 -8.7397575893037385e-03 -7.1788377461838998e-03 2.2007050180932902e-03 -6.5869717027583537e-03 1.4235740570727343e-03 -2.3623827694139801e-04 -4.4464267713555270e-03 6.7630408206693715e-03 -3.1638681356531183e-03 2.9840874308154866e-02 -1.1673521598807046e-03 4.9953183928724137e-04 -8.5394800912401616e-03 -1.4735017996223234e-02 3.3639973054433452e-03 -8.3437056774301570e-03 1.7729718030987480e-03 6.1502139406928577e-04 2.7347894316737324e-03 1.4718204243286556e-02 -3.2668584874548058e-03 -1.1643076754702954e-03 3.1168096022043144e-02 9.0299987470808130e-03 -2.1474416240963374e-02 -3.2259001969160553e-02 9.9831915169652161e-03 1.4533386422291132e-03 -4.4389852153411569e-02 9.3331582174539240e-03 2.0238936191546639e-02 8.2835994222858304e-03 1.7485272364796727e-02 -1.1673521598807052e-03 7.0963968708679909e-02 -9.6906539030372427e-03 -1.4997877127931887e-02 -2.2529655041715037e-02 -1.1695669671763088e-02 2.8589095065164527e-03 -3.7978929915431975e-02 -1.7456451446784725e-02 1.4252768863954051e-02 2.6741774926710243e-02 -6.9888458247116146e-03 -1.7776456582643330e-04 1.0179566641668402e-02 -3.6588850001124753e-03 5.3624539993593033e-03 7.2397769396529994e-03 -1.1580985811697949e-02 -2.3541092605849437e-04 9.0920173683262072e-03 -8.7655545444865323e-03 -5.8723857424732764e-03 4.2962329110248099e-03 -9.2699914493284755e-03 4.9953183928724148e-04 -9.6906539030372461e-03 3.2112071409464676e-02 3.3449026183997050e-03 -1.1588940474951168e-02 -3.1410791132310606e-03 1.0886014534703487e-04 -1.9164972254541671e-03 -2.9870950056346069e-03 -3.0301873680350804e-03 -7.6115022572298390e-03 7.2915195150264093e-03 -7.9971337750059050e-03 -1.4820310438003477e-02 -1.3738804788840061e-02 2.6033065939724886e-02 1.2935469097477245e-02 4.6112597295701096e-03 -2.6924259501225844e-03 2.0894309028903268e-02 -5.8233304081144015e-03 -2.6858914220531365e-02 -9.3027700238771018e-03 -1.7921006579415370e-02 -8.5394800912401616e-03 -1.4997877127931891e-02 3.3449026183997041e-03 4.8257964791003694e-02 9.2113583792812689e-03 1.9696845614484256e-02 2.7116453021333560e-03 1.1396272786132819e-02 9.8444300839038591e-03 -3.0914721995961916e-02 -1.5316451701982137e-02 -1.4296269988097973e-05 -4.6383162351635969e-03 -1.7434073939774596e-02 -1.1013688480288308e-02 1.2149980408189756e-02 1.1359741573465570e-02 5.7049269808150983e-03 7.0859171090382894e-03 9.2283370229015536e-03 4.7481564306647911e-03 -7.7615154678464613e-03 -9.9113541366439781e-03 -6.9033456200611127e-03 -1.4735017996223234e-02 -2.2529655041715047e-02 -1.1588940474951168e-02 9.2113583792812672e-03 3.0197154809192168e-02 8.0950419221789711e-03 9.7680923495519351e-03 1.3929351060896298e-02 1.2401835547005212e-02 -1.1080498546827950e-02 -1.4839501348321975e-02 -1.4439863053634836e-03 -4.4762447565076992e-03 -1.6458408635034640e-02 -2.6576589732229469e-02 7.0163744944962223e-03 6.5119052282560722e-03 -3.4430833319295689e-03 -2.8900683478535420e-03 1.8119245452626824e-02 -7.7845522445302911e-03 -1.8087050059145064e-02 -8.3397183890456406e-03 -2.2496992611041221e-02 3.3639973054433452e-03 -1.1695669671763088e-02 -3.1410791132310614e-03 1.9696845614484256e-02 8.0950419221789728e-03 4.3588580688406993e-02 7.6253783006752307e-03 1.3691596611443226e-02 2.2473952835274223e-02 -1.2249232551592744e-02 -9.9239925186617277e-03 -2.6202364907196131e-03 -6.0174823634829896e-03 2.2168657446658751e-03 1.9099703852729147e-03 -2.7159902727167239e-03 4.1427883938481014e-03 6.0608402239888982e-03 5.3572731065492686e-03 -1.9154023123493379e-03 1.8922800052406132e-04 -7.2767423861309546e-03 -4.7341146133344321e-03 -4.1415995239944695e-03 -8.3437056774301570e-03 2.8589095065164535e-03 1.0886014534703509e-04 2.7116453021333565e-03 9.7680923495519351e-03 7.6253783006752299e-03 2.4600051478180472e-02 -1.8454319623761001e-03 -1.8315257382639485e-03 -8.3150491871022744e-03 -1.0491707106522495e-02 -9.9211517935497203e-03 1.6239293076068255e-03 -2.5993569481101216e-02 -1.8165743709554184e-02 1.5261058194577159e-02 1.5540878886089821e-02 -2.1171905839645314e-03 -1.3712382127762791e-03 3.4038458766991769e-02 8.1561209252997199e-03 -1.4968359792504540e-02 -1.8102289289000290e-02 -1.6441394350521055e-02 1.7729718030987471e-03 -3.7978929915431975e-02 -1.9164972254541671e-03 1.1396272786132818e-02 1.3929351060896294e-02 1.3691596611443226e-02 -1.8454319623761005e-03 4.7156791352344248e-02 2.0845312240957023e-02 -1.1869202123758631e-02 -2.8590691380788659e-02 -4.0522039082060337e-03 1.4456735594463792e-03 -1.9093952307076768e-02 -2.3092415619048692e-02 1.5656356146288956e-02 8.7351983678223243e-03 -7.7338679255924640e-03 -9.6622255598505507e-05 1.2510877299929488e-02 -2.2506238027653067e-03 -1.4395446037284799e-02 -1.2234705148488229e-02 -2.6668278376115434e-02 6.1502139406928598e-04 -1.7456451446784725e-02 -2.9870950056346069e-03 9.8444300839038625e-03 1.2401835547005212e-02 2.2473952835274223e-02 -1.8315257382639485e-03 2.0845312240957026e-02 4.3516192434200934e-02 -1.1237887152561224e-02 -5.7081145533643303e-03 -3.2578645403186536e-03 -3.7637224115348333e-03 1.4792328129879639e-02 1.4663059082604440e-02 -2.7912480408972748e-02 -1.6110265619164493e-02 8.0044063473560436e-03 -8.3398814129176588e-03 -2.1831026881298565e-02 5.6728585526045448e-03 2.5687001165730246e-02 1.3045210563608269e-02 6.0364991778352525e-03 2.7347894316737315e-03 1.4252768863954048e-02 -3.0301873680350809e-03 -3.0914721995961916e-02 -1.1080498546827950e-02 -1.2249232551592744e-02 -8.3150491871022761e-03 -1.1869202123758631e-02 -1.1237887152561224e-02 5.0824064819085454e-02 1.8800685613607690e-02 -7.8595160882112269e-03 4.0832388781725671e-03 1.3986425114731750e-02 8.6894217216618996e-03 -1.7262963260919785e-02 -1.8429935212775670e-02 6.3410948635462252e-03 -7.4982138482065867e-03 -3.2645871189025816e-02 7.5225887403941585e-03 1.2967207182564194e-02 1.1947989113732384e-02 6.6520044699945368e-03 1.4718204243286556e-02 2.6741774926710243e-02 -7.6115022572298390e-03 -1.5316451701982139e-02 -1.4839501348321975e-02 -9.9239925186617277e-03 -1.0491707106522495e-02 -2.8590691380788652e-02 -5.7081145533643294e-03 1.8800685613607683e-02 4.1829809975737743e-02 -5.9615004663409223e-03 6.0841884117106889e-03 -1.8860984784569285e-03 -8.4955647201691471e-03 7.4009260203103657e-03 5.4816632451831432e-03 -8.4910368432972640e-03 1.8519553814018608e-03 9.2680683748214109e-03 -1.0832196844868944e-02 5.7247528257809380e-03 5.5829033630744266e-03 -3.2055928176647807e-03 -3.2668584874548058e-03 -6.9888458247116137e-03 7.2915195150264102e-03 -1.4296269988098786e-05 -1.4439863053634836e-03 -2.6202364907196140e-03 -9.9211517935497203e-03 -4.0522039082060328e-03 -3.2578645403186527e-03 -7.8595160882112269e-03 -5.9615004663409223e-03 2.9610972742011993e-02 627 628 629 693 694 695 705 706 707 639 640 641 630 631 632 696 697 698 708 709 710 642 643 644 2.7434016469985618e-02 -5.6771721354682385e-03 -5.3272544929745076e-03 -4.8085696541129768e-03 -6.0688904656089546e-03 -8.5159384091428557e-03 -9.5030911008785381e-03 7.4567871135240958e-03 2.4199821216673519e-04 -1.2171358837425603e-03 6.5356031828100016e-03 5.1325217849712106e-03 6.1024439626305473e-03 -5.8798746812391157e-03 -1.6743352386620293e-03 -3.8675584141209885e-03 -1.6964635704037642e-03 -6.8604758954723868e-04 -7.3381398992024222e-03 5.3669602567273421e-03 5.0283594393315803e-03 -6.8019654805586780e-03 -3.6949700341373695e-05 5.8006962938571072e-03 -5.6771721354682350e-03 4.6471939469006358e-02 1.8482171289793237e-02 -7.3642921386734015e-03 -3.0771857121893582e-02 -5.7612171976416738e-03 6.7668455106240739e-03 -3.4670764719565983e-02 -2.3320333469274328e-03 7.1406994200213878e-03 1.7047803918302250e-02 1.3596424628077634e-02 -6.2291804044730600e-03 2.9246494723947965e-02 9.3610471193893638e-03 -1.1325534181107594e-02 -1.9883241944500397e-02 -1.6099774119103925e-02 6.0878122755863382e-03 -2.3574607304957123e-02 -1.7209668673245818e-02 1.0600821653490503e-02 1.6134232979660528e-02 -3.6949700341377652e-05 -5.3272544929745076e-03 1.8482171289793233e-02 4.2271537622458714e-02 -9.2467072370531443e-03 -6.8323564223215921e-03 -4.5519304601173757e-03 3.4509679171693063e-03 -1.5834721112044758e-02 -3.8136336943082709e-03 4.9934312775010642e-03 1.3757801064199684e-02 1.9726105297144313e-02 -1.3087607595936158e-03 8.8167899815025531e-03 -1.3699032950563971e-03 -1.0074163835093566e-02 -1.2725952248617309e-02 -2.4336303366491414e-02 5.4014981398814010e-03 -1.6264554206002303e-02 -2.1123906623070881e-02 1.2110988990163069e-02 1.0600821653490499e-02 -6.8019654805586815e-03 -4.8085696541129786e-03 -7.3642921386734015e-03 -9.2467072370531443e-03 4.0236821862902623e-02 1.8666156174054888e-02 -5.7833072221724364e-03 -4.4510976923857118e-04 1.1302347812863283e-02 -2.0330779691414163e-03 -2.4428687834848060e-02 -1.3750502079739435e-02 -1.0337025306972844e-02 -4.1022928788928817e-03 -1.5864500268357989e-02 3.2540590777281157e-03 2.0575376108705988e-02 1.3323360131896431e-02 6.2354102181178522e-03 -5.9036312114452366e-03 1.0897099041202046e-02 1.2882289000162287e-02 -2.1123906623070898e-02 -1.7209668673245828e-02 5.0283594393315889e-03 -6.0688904656089546e-03 -3.0771857121893582e-02 -6.8323564223215921e-03 1.8666156174054885e-02 4.3431658656141112e-02 -6.1270419259531004e-03 7.9046325448174169e-03 3.1034624120214668e-02 -6.2675974002508756e-03 -1.5760860595777436e-02 -2.0367667812816442e-02 -1.1104668805319243e-02 -2.3558308884159083e-03 -3.4354499111200684e-02 6.4247906896979746e-03 1.4028674147830340e-02 1.6903809502185379e-02 7.6428145662174535e-03 -1.4932671089805063e-04 1.7698539072326665e-02 1.0897099041202040e-02 -1.6264554206002306e-02 -2.3574607304957130e-02 5.3669602567273465e-03 -8.5159384091428557e-03 -5.7612171976416746e-03 -4.5519304601173757e-03 -5.7833072221724364e-03 -6.1270419259530987e-03 2.5028187415029247e-02 -1.0489975816488166e-03 -6.8318961876339202e-03 7.1459861448742272e-03 -3.7204916474688579e-04 -1.4462489227423160e-03 -3.4165383671771981e-03 3.9785679076434900e-04 8.0936975682778071e-03 -9.8553992600386997e-03 4.0222394086092943e-03 6.1342211010049228e-03 -1.1085343619225401e-03 5.8986980384559571e-03 -1.4932671089804676e-04 -5.9036312114452297e-03 5.4014981398813984e-03 6.0878122755863321e-03 -7.3381398992024291e-03 -9.5030911008785381e-03 6.7668455106240722e-03 3.4509679171693063e-03 -4.4510976923857329e-04 7.9046325448174186e-03 -1.0489975816488169e-03 2.4720065243080895e-02 -7.5720500860388430e-03 1.6898460025017764e-03 -4.9469844665705641e-03 -9.3461810307693197e-03 4.4014732253771392e-03 -7.4006557972036997e-03 7.3203499147275509e-03 -1.4128125129923904e-03 -5.7565765597554644e-03 3.5260338938174346e-03 -5.2893972934323370e-03 7.1459861448742341e-03 -6.2675974002508678e-03 -2.0330779691414150e-03 -3.8136336943082904e-03 -2.3320333469274424e-03 2.4199821216673819e-04 7.4567871135240958e-03 -3.4670764719565983e-02 -1.5834721112044758e-02 1.1302347812863283e-02 3.1034624120214668e-02 -6.8318961876339193e-03 -7.5720500860388430e-03 6.1232010952185646e-02 -7.5720500860388491e-03 -1.1501570779584145e-02 -2.8765170970073799e-02 -1.1501570779584120e-02 6.9401956815726210e-03 -3.9471551122894827e-02 6.9401956815726262e-03 1.6040907557341652e-02 1.4276992339485626e-02 1.6040907557341662e-02 -6.8318961876339228e-03 3.1034624120214668e-02 1.1302347812863262e-02 -1.5834721112044751e-02 -3.4670764719565997e-02 7.4567871135241036e-03 2.4199821216673464e-04 -2.3320333469274337e-03 -3.8136336943082718e-03 -2.0330779691414167e-03 -6.2675974002508747e-03 7.1459861448742272e-03 1.6898460025017766e-03 -7.5720500860388491e-03 2.4720065243080888e-02 4.4014732253771331e-03 -9.3461810307693145e-03 -4.9469844665705658e-03 -1.4128125129923902e-03 7.3203499147275544e-03 -7.4006557972037023e-03 -5.2893972934323344e-03 3.5260338938174311e-03 -5.7565765597554696e-03 -1.0489975816488095e-03 7.9046325448174186e-03 -4.4510976923856365e-04 3.4509679171693072e-03 6.7668455106240722e-03 -9.5030911008785555e-03 -1.2171358837425601e-03 7.1406994200213887e-03 4.9934312775010651e-03 -2.4428687834848060e-02 -1.5760860595777439e-02 -3.7204916474688579e-04 -4.9469844665705667e-03 -1.1501570779584143e-02 4.4014732253771331e-03 4.1944493416424769e-02 1.1961606988278207e-02 1.6052137614184288e-02 -7.0453527636015053e-03 1.5441045294016929e-02 -5.2325591054786028e-03 -2.0615899397629207e-02 -9.7726761497133295e-03 -1.4637930324835364e-02 -3.4165383671771890e-03 -1.1104668805319250e-02 -1.0337025306972851e-02 1.9726105297144327e-02 1.3596424628077643e-02 5.1325217849712123e-03 6.5356031828100033e-03 1.7047803918302247e-02 1.3757801064199686e-02 -1.3750502079739435e-02 -2.0367667812816438e-02 -1.4462489227423164e-03 -9.3461810307693197e-03 -2.8765170970073806e-02 -9.3461810307693145e-03 1.1961606988278207e-02 3.5430852585228143e-02 1.1961606988278197e-02 3.2564273612472132e-03 1.3048890830420455e-02 3.2564273612472150e-03 -1.0968506563284026e-02 -1.3074844656546398e-02 -1.0968506563284037e-02 -1.4462489227423160e-03 -2.0367667812816438e-02 -1.3750502079739435e-02 1.3757801064199684e-02 1.7047803918302250e-02 6.5356031828100042e-03 5.1325217849712114e-03 1.3596424628077634e-02 1.9726105297144313e-02 -1.0337025306972843e-02 -1.1104668805319243e-02 -3.4165383671771981e-03 4.4014732253771392e-03 -1.1501570779584120e-02 -4.9469844665705658e-03 1.6052137614184288e-02 1.1961606988278195e-02 4.1944493416424734e-02 -5.2325591054786080e-03 1.5441045294016912e-02 -7.0453527636015045e-03 -1.4637930324835341e-02 -9.7726761497133174e-03 -2.0615899397629207e-02 -3.7204916474688215e-04 -1.5760860595777412e-02 -2.4428687834848029e-02 4.9934312775010425e-03 7.1406994200213661e-03 -1.2171358837425534e-03 6.1024439626305490e-03 -6.2291804044730600e-03 -1.3087607595936156e-03 -4.1022928788928808e-03 -2.3558308884159078e-03 3.9785679076434906e-04 -7.4006557972036988e-03 6.9401956815726218e-03 -1.4128125129923897e-03 -7.0453527636015062e-03 3.2564273612472137e-03 -5.2325591054786080e-03 2.8536177494064091e-02 -7.3052148537653006e-03 1.6590033262722955e-03 -4.8650174619014799e-03 -1.0092234705252908e-02 4.3175484219618900e-03 -9.8553992600386980e-03 6.4247906896979685e-03 3.2540590777281153e-03 -1.3699032950563836e-03 9.3610471193893690e-03 -1.6743352386620366e-03 -5.8798746812391131e-03 2.9246494723947969e-02 8.8167899815025565e-03 -1.5864500268357989e-02 -3.4354499111200684e-02 8.0936975682778054e-03 7.3203499147275492e-03 -3.9471551122894834e-02 7.3203499147275527e-03 1.5441045294016929e-02 1.3048890830420457e-02 1.5441045294016912e-02 -7.3052148537653006e-03 6.4030971068243639e-02 -7.3052148537653050e-03 -1.0622292955162420e-02 -2.7392302001263844e-02 -1.0622292955162430e-02 8.0936975682778141e-03 -3.4354499111200670e-02 -1.5864500268357971e-02 8.8167899815025479e-03 2.9246494723947976e-02 -5.8798746812391183e-03 -1.6743352386620293e-03 9.3610471193893638e-03 -1.3699032950563964e-03 3.2540590777281157e-03 6.4247906896979746e-03 -9.8553992600386997e-03 -1.4128125129923906e-03 6.9401956815726253e-03 -7.4006557972037023e-03 -5.2325591054786028e-03 3.2564273612472145e-03 -7.0453527636015036e-03 1.6590033262722952e-03 -7.3052148537653050e-03 2.8536177494064091e-02 4.3175484219618761e-03 -1.0092234705252903e-02 -4.8650174619014755e-03 3.9785679076434228e-04 -2.3558308884159091e-03 -4.1022928788928808e-03 -1.3087607595936085e-03 -6.2291804044730609e-03 6.1024439626305646e-03 -3.8675584141209880e-03 -1.1325534181107594e-02 -1.0074163835093568e-02 2.0575376108705985e-02 1.4028674147830341e-02 4.0222394086092935e-03 -5.7565765597554644e-03 1.6040907557341652e-02 -5.2893972934323344e-03 -2.0615899397629207e-02 -1.0968506563284026e-02 -1.4637930324835341e-02 -4.8650174619014807e-03 -1.0622292955162423e-02 4.3175484219618761e-03 3.9974513453115097e-02 1.1303711547268516e-02 1.6112340994219477e-02 -1.1085343619225416e-03 7.6428145662174370e-03 6.2354102181178366e-03 -2.4336303366491414e-02 -1.6099774119103905e-02 -6.8604758954723987e-04 -1.6964635704037646e-03 -1.9883241944500401e-02 -1.2725952248617311e-02 1.3323360131896431e-02 1.6903809502185382e-02 6.1342211010049236e-03 3.5260338938174355e-03 1.4276992339485626e-02 3.5260338938174303e-03 -9.7726761497133295e-03 -1.3074844656546399e-02 -9.7726761497133208e-03 -1.0092234705252908e-02 -2.7392302001263837e-02 -1.0092234705252903e-02 1.1303711547268515e-02 3.2149019202954647e-02 1.1303711547268516e-02 6.1342211010049271e-03 1.6903809502185379e-02 1.3323360131896424e-02 -1.2725952248617315e-02 -1.9883241944500401e-02 -1.6964635704037638e-03 -6.8604758954723846e-04 -1.6099774119103925e-02 -2.4336303366491414e-02 6.2354102181178522e-03 7.6428145662174526e-03 -1.1085343619225399e-03 -5.2893972934323378e-03 1.6040907557341662e-02 -5.7565765597554705e-03 -1.4637930324835364e-02 -1.0968506563284037e-02 -2.0615899397629207e-02 4.3175484219618917e-03 -1.0622292955162430e-02 -4.8650174619014755e-03 1.6112340994219480e-02 1.1303711547268518e-02 3.9974513453115104e-02 4.0222394086092839e-03 1.4028674147830341e-02 2.0575376108705981e-02 -1.0074163835093570e-02 -1.1325534181107596e-02 -3.8675584141209919e-03 -7.3381398992024222e-03 6.0878122755863391e-03 5.4014981398814010e-03 -5.9036312114452366e-03 -1.4932671089805041e-04 5.8986980384559580e-03 7.1459861448742341e-03 -6.8318961876339228e-03 -1.0489975816488099e-03 -3.4165383671771882e-03 -1.4462489227423164e-03 -3.7204916474688270e-04 -9.8553992600386997e-03 8.0936975682778106e-03 3.9785679076434315e-04 -1.1085343619225436e-03 6.1342211010049254e-03 4.0222394086092839e-03 2.5028187415029251e-02 -6.1270419259531004e-03 -5.7833072221724346e-03 -4.5519304601173991e-03 -5.7612171976416833e-03 -8.5159384091428592e-03 5.3669602567273421e-03 -2.3574607304957123e-02 -1.6264554206002303e-02 1.0897099041202047e-02 1.7698539072326665e-02 -1.4932671089804762e-04 -6.2675974002508678e-03 3.1034624120214668e-02 7.9046325448174186e-03 -1.1104668805319250e-02 -2.0367667812816435e-02 -1.5760860595777412e-02 6.4247906896979703e-03 -3.4354499111200670e-02 -2.3558308884159091e-03 7.6428145662174379e-03 1.6903809502185375e-02 1.4028674147830341e-02 -6.1270419259531004e-03 4.3431658656141105e-02 1.8666156174054867e-02 -6.8323564223215826e-03 -3.0771857121893589e-02 -6.0688904656089563e-03 5.0283594393315803e-03 -1.7209668673245818e-02 -2.1123906623070881e-02 1.2882289000162288e-02 1.0897099041202040e-02 -5.9036312114452297e-03 -2.0330779691414150e-03 1.1302347812863262e-02 -4.4510976923856397e-04 -1.0337025306972851e-02 -1.3750502079739435e-02 -2.4428687834848032e-02 3.2540590777281144e-03 -1.5864500268357971e-02 -4.1022928788928808e-03 6.2354102181178383e-03 1.3323360131896424e-02 2.0575376108705985e-02 -5.7833072221724355e-03 1.8666156174054867e-02 4.0236821862902609e-02 -9.2467072370531270e-03 -7.3642921386733772e-03 -4.8085696541130003e-03 -6.8019654805586789e-03 1.0600821653490499e-02 1.2110988990163069e-02 -2.1123906623070895e-02 -1.6264554206002306e-02 5.4014981398813984e-03 -3.8136336943082913e-03 -1.5834721112044751e-02 3.4509679171693076e-03 1.9726105297144327e-02 1.3757801064199682e-02 4.9934312775010425e-03 -1.3699032950563812e-03 8.8167899815025496e-03 -1.3087607595936093e-03 -2.4336303366491414e-02 -1.2725952248617311e-02 -1.0074163835093570e-02 -4.5519304601173982e-03 -6.8323564223215809e-03 -9.2467072370531287e-03 4.2271537622458735e-02 1.8482171289793226e-02 -5.3272544929745102e-03 -3.6949700341373586e-05 1.6134232979660528e-02 1.0600821653490499e-02 -1.7209668673245825e-02 -2.3574607304957130e-02 6.0878122755863321e-03 -2.3320333469274432e-03 -3.4670764719566004e-02 6.7668455106240722e-03 1.3596424628077645e-02 1.7047803918302247e-02 7.1406994200213661e-03 9.3610471193893690e-03 2.9246494723947976e-02 -6.2291804044730609e-03 -1.6099774119103908e-02 -1.9883241944500401e-02 -1.1325534181107596e-02 -5.7612171976416833e-03 -3.0771857121893592e-02 -7.3642921386733789e-03 1.8482171289793230e-02 4.6471939469006379e-02 -5.6771721354682385e-03 5.8006962938571072e-03 -3.6949700341377761e-05 -6.8019654805586815e-03 5.0283594393315881e-03 5.3669602567273473e-03 -7.3381398992024291e-03 2.4199821216673814e-04 7.4567871135241019e-03 -9.5030911008785555e-03 5.1325217849712123e-03 6.5356031828100033e-03 -1.2171358837425547e-03 -1.6743352386620366e-03 -5.8798746812391183e-03 6.1024439626305646e-03 -6.8604758954724009e-04 -1.6964635704037640e-03 -3.8675584141209911e-03 -8.5159384091428592e-03 -6.0688904656089580e-03 -4.8085696541129994e-03 -5.3272544929745119e-03 -5.6771721354682385e-03 2.7434016469985653e-02 693 694 695 741 742 743 753 754 755 705 706 707 696 697 698 744 745 746 756 757 758 708 709 710 3.0638168791694897e-02 -6.4075290537063331e-03 -6.0550745787162821e-03 -5.0765061191758824e-03 -6.7341879274426955e-03 -9.5730439866952392e-03 -1.0660173764888189e-02 8.4032438253144656e-03 2.4270762823916010e-04 -1.4832980102594542e-03 7.2961912132505097e-03 5.7516123702002252e-03 6.7244213410211119e-03 -6.6485590540743709e-03 -1.8850309356461857e-03 -4.1237001136909743e-03 -1.8645354225150664e-03 -7.1780869723418500e-04 -8.2463101264015522e-03 6.0449490048946290e-03 5.6843943200966720e-03 -7.7726019982999519e-03 -8.9572585721136688e-05 6.5522438797558317e-03 -6.4075290537063331e-03 5.1637635175506486e-02 2.0606200237226122e-02 -8.1187287913932898e-03 -3.3962715879071209e-02 -6.3351646748197477e-03 7.6403335116363609e-03 -3.8570363916705701e-02 -2.5873557393835804e-03 7.8928457877438310e-03 1.8823694932829791e-02 1.5084964751002192e-02 -7.0733171688419656e-03 3.2348530730330810e-02 1.0349452965349360e-02 -1.2633311071156656e-02 -2.1890281659709854e-02 -1.7902533649717139e-02 6.8888287771535000e-03 -2.6155281486093876e-02 -1.9125991303936052e-02 1.1810878008564554e-02 1.7768782102913539e-02 -8.9572585721135549e-05 -6.0550745787162821e-03 2.0606200237226122e-02 4.7285794653807355e-02 -1.0385882217812389e-02 -7.6132332292321433e-03 -4.7516970137535530e-03 3.9225921803954745e-03 -1.7704418939076049e-02 -4.1827534751867632e-03 5.5488689452669214e-03 1.5320429901891058e-02 2.2063416578164925e-02 -1.5195386270688751e-03 9.9080367903458862e-03 -1.8175396829844107e-03 -1.1306280553481507e-02 -1.4152253547580452e-02 -2.7177988520231098e-02 6.1680850903283943e-03 -1.8175639222138967e-02 -2.3646630541516507e-02 1.3627229761088258e-02 1.1810878008564545e-02 -7.7726019982999467e-03 -5.0765061191758824e-03 -8.1187287913932916e-03 -1.0385882217812389e-02 4.4926162160021620e-02 2.0774638239749198e-02 -6.5786780200968358e-03 -6.2709075202844946e-04 1.2524461116656036e-02 -2.2647571891334828e-03 -2.7290068662143258e-02 -1.5232600623942692e-02 -1.1522772158683903e-02 -4.3549811382856468e-03 -1.7685363605212352e-02 3.6867738176931107e-03 2.2872772603710137e-02 1.4765023590792670e-02 6.9593298425029600e-03 -6.8036575505820056e-03 1.2098561377286472e-02 1.4421591605433859e-02 -2.3646630541516511e-02 -1.9125991303936045e-02 5.6843943200966703e-03 -6.7341879274426955e-03 -3.3962715879071202e-02 -7.6132332292321424e-03 2.0774638239749198e-02 4.8290920345692205e-02 -6.9439909564111852e-03 8.8655802446764645e-03 3.4462478746066970e-02 -7.0783294226642096e-03 -1.7559953478663490e-02 -2.2558405709875540e-02 -1.2334848726302191e-02 -2.5412806805721953e-03 -3.8096479198875328e-02 7.2710367726514001e-03 1.5622273497049472e-02 1.8507505023239539e-02 8.5558551797772168e-03 -2.5143067265777407e-04 1.9511978158917229e-02 1.2098561377286474e-02 -1.8175639222138974e-02 -2.6155281486093876e-02 6.0449490048946264e-03 -9.5730439866952375e-03 -6.3351646748197495e-03 -4.7516970137535513e-03 -6.5786780200968349e-03 -6.9439909564111861e-03 2.8011654657441674e-02 -1.1853548255846074e-03 -7.7537310641020004e-03 7.9924629205182889e-03 -3.5046785171910034e-04 -1.5826319364337991e-03 -3.7018459684215405e-03 4.3527110424266256e-04 9.1896106605745039e-03 -1.0967352594175531e-02 4.4250603634629028e-03 6.7885098666965113e-03 -1.5332543246257637e-03 6.6591281260618123e-03 -2.5143067265778459e-04 -6.8036575505820152e-03 6.1680850903284030e-03 6.8888287771535052e-03 -8.2463101264015574e-03 -1.0660173764888189e-02 7.6403335116363618e-03 3.9225921803954737e-03 -6.2709075202845022e-04 8.8655802446764645e-03 -1.1853548255846072e-03 2.7900731374667351e-02 -8.5545850053410175e-03 1.9373602895342631e-03 -5.4838837798893720e-03 -1.0504150555797764e-02 4.9758300434887956e-03 -8.3143285573885842e-03 8.2722414563523600e-03 -1.6326630931291736e-03 -6.6249639658042874e-03 3.9462655105213908e-03 -5.9957150338104297e-03 7.9924629205182941e-03 -7.0783294226642070e-03 -2.2647571891334819e-03 -4.1827534751867693e-03 -2.5873557393835860e-03 2.4270762823916281e-04 8.4032438253144656e-03 -3.8570363916705701e-02 -1.7704418939076046e-02 1.2524461116656036e-02 3.4462478746066963e-02 -7.7537310641019996e-03 -8.5545850053410175e-03 6.8564498974621593e-02 -8.5545850053410227e-03 -1.2752893384508111e-02 -3.1971025268464806e-02 -1.2752893384508102e-02 7.8897372500489060e-03 -4.3987674152876147e-02 7.8897372500488956e-03 1.7948186201007767e-02 1.5609970787996814e-02 1.7948186201007767e-02 -7.7537310641019874e-03 3.4462478746066970e-02 1.2524461116656033e-02 -1.7704418939076056e-02 -3.8570363916705701e-02 8.4032438253144638e-03 2.4270762823915988e-04 -2.5873557393835791e-03 -4.1827534751867623e-03 -2.2647571891334837e-03 -7.0783294226642104e-03 7.9924629205182889e-03 1.9373602895342631e-03 -8.5545850053410227e-03 2.7900731374667354e-02 4.9758300434887964e-03 -1.0504150555797762e-02 -5.4838837798893711e-03 -1.6326630931291783e-03 8.2722414563523635e-03 -8.3143285573885842e-03 -5.9957150338104306e-03 3.9462655105213891e-03 -6.6249639658042900e-03 -1.1853548255846072e-03 8.8655802446764628e-03 -6.2709075202844653e-04 3.9225921803954763e-03 7.6403335116363609e-03 -1.0660173764888193e-02 -1.4832980102594546e-03 7.8928457877438275e-03 5.5488689452669231e-03 -2.7290068662143258e-02 -1.7559953478663490e-02 -3.5046785171910093e-04 -5.4838837798893737e-03 -1.2752893384508111e-02 4.9758300434887973e-03 4.7021175979424304e-02 1.3252643169864903e-02 1.7956933767445688e-02 -8.0545797985823071e-03 1.7228540473807816e-02 -5.9566713170301332e-03 -2.3070916338293296e-02 -1.0811298592944956e-02 -1.6403333798968484e-02 -3.7018459684215526e-03 -1.2334848726302191e-02 -1.1522772158683912e-02 2.2063416578164942e-02 1.5084964751002196e-02 5.7516123702002330e-03 7.2961912132505115e-03 1.8823694932829791e-02 1.5320429901891058e-02 -1.5232600623942692e-02 -2.2558405709875537e-02 -1.5826319364337994e-03 -1.0504150555797764e-02 -3.1971025268464806e-02 -1.0504150555797761e-02 1.3252643169864903e-02 3.9557112231917983e-02 1.3252643169864900e-02 3.6054359463322892e-03 1.4312818481253240e-02 3.6054359463322970e-03 -1.2155317115164509e-02 -1.4429483890614920e-02 -1.2155317115164509e-02 -1.5826319364338056e-03 -2.2558405709875544e-02 -1.5232600623942693e-02 1.5320429901891062e-02 1.8823694932829791e-02 7.2961912132505167e-03 5.7516123702002252e-03 1.5084964751002192e-02 2.2063416578164925e-02 -1.1522772158683903e-02 -1.2334848726302187e-02 -3.7018459684215414e-03 4.9758300434887956e-03 -1.2752893384508104e-02 -5.4838837798893729e-03 1.7956933767445688e-02 1.3252643169864900e-02 4.7021175979424304e-02 -5.9566713170301462e-03 1.7228540473807813e-02 -8.0545797985822967e-03 -1.6403333798968477e-02 -1.0811298592944952e-02 -2.3070916338293293e-02 -3.5046785171910630e-04 -1.7559953478663484e-02 -2.7290068662143261e-02 5.5488689452669188e-03 7.8928457877438189e-03 -1.4832980102594488e-03 6.7244213410211110e-03 -7.0733171688419664e-03 -1.5195386270688747e-03 -4.3549811382856485e-03 -2.5412806805721957e-03 4.3527110424266288e-04 -8.3143285573885842e-03 7.8897372500489060e-03 -1.6326630931291781e-03 -8.0545797985823054e-03 3.6054359463322905e-03 -5.9566713170301480e-03 3.1674417617112628e-02 -8.3283848555741787e-03 1.9176718226367865e-03 -4.8900571867172664e-03 -1.1172680229393618e-02 4.9541872283018155e-03 -1.0967352594175531e-02 7.2710367726514062e-03 3.6867738176931202e-03 -1.8175396829844107e-03 1.0349452965349351e-02 -1.8850309356461888e-03 -6.6485590540743709e-03 3.2348530730330810e-02 9.9080367903458880e-03 -1.7685363605212352e-02 -3.8096479198875322e-02 9.1896106605745074e-03 8.2722414563523600e-03 -4.3987674152876154e-02 8.2722414563523652e-03 1.7228540473807820e-02 1.4312818481253242e-02 1.7228540473807813e-02 -8.3283848555741787e-03 7.1067229332219456e-02 -8.3283848555741700e-03 -1.1936121866219666e-02 -2.9896476723507509e-02 -1.1936121866219663e-02 9.1896106605744900e-03 -3.8096479198875335e-02 -1.7685363605212348e-02 9.9080367903458914e-03 3.2348530730330817e-02 -6.6485590540743692e-03 -1.8850309356461857e-03 1.0349452965349358e-02 -1.8175396829844136e-03 3.6867738176931107e-03 7.2710367726514001e-03 -1.0967352594175531e-02 -1.6326630931291736e-03 7.8897372500488956e-03 -8.3143285573885842e-03 -5.9566713170301332e-03 3.6054359463322961e-03 -8.0545797985822967e-03 1.9176718226367865e-03 -8.3283848555741700e-03 3.1674417617112628e-02 4.9541872283017981e-03 -1.1172680229393621e-02 -4.8900571867172725e-03 4.3527110424266624e-04 -2.5412806805722044e-03 -4.3549811382856572e-03 -1.5195386270688662e-03 -7.0733171688419543e-03 6.7244213410211163e-03 -4.1237001136909743e-03 -1.2633311071156656e-02 -1.1306280553481506e-02 2.2872772603710140e-02 1.5622273497049472e-02 4.4250603634629028e-03 -6.6249639658042874e-03 1.7948186201007767e-02 -5.9957150338104306e-03 -2.3070916338293296e-02 -1.2155317115164509e-02 -1.6403333798968477e-02 -4.8900571867172664e-03 -1.1936121866219665e-02 4.9541872283017981e-03 4.4548107845652551e-02 1.2500968824423510e-02 1.8084560649226929e-02 -1.5332543246257459e-03 8.5558551797772150e-03 6.9593298425029608e-03 -2.7177988520231115e-02 -1.7902533649717139e-02 -7.1780869723418609e-04 -1.8645354225150673e-03 -2.1890281659709854e-02 -1.4152253547580450e-02 1.4765023590792672e-02 1.8507505023239539e-02 6.7885098666965122e-03 3.9462655105213908e-03 1.5609970787996814e-02 3.9462655105213891e-03 -1.0811298592944954e-02 -1.4429483890614919e-02 -1.0811298592944952e-02 -1.1172680229393618e-02 -2.9896476723507506e-02 -1.1172680229393621e-02 1.2500968824423512e-02 3.5481543099066246e-02 1.2500968824423512e-02 6.7885098666965217e-03 1.8507505023239550e-02 1.4765023590792674e-02 -1.4152253547580457e-02 -2.1890281659709864e-02 -1.8645354225150692e-03 -7.1780869723418511e-04 -1.7902533649717143e-02 -2.7177988520231101e-02 6.9593298425029591e-03 8.5558551797772185e-03 -1.5332543246257633e-03 -5.9957150338104306e-03 1.7948186201007767e-02 -6.6249639658042909e-03 -1.6403333798968484e-02 -1.2155317115164510e-02 -2.3070916338293293e-02 4.9541872283018172e-03 -1.1936121866219663e-02 -4.8900571867172716e-03 1.8084560649226929e-02 1.2500968824423512e-02 4.4548107845652545e-02 4.4250603634629114e-03 1.5622273497049470e-02 2.2872772603710147e-02 -1.1306280553481514e-02 -1.2633311071156651e-02 -4.1237001136909856e-03 -8.2463101264015522e-03 6.8888287771534983e-03 6.1680850903283943e-03 -6.8036575505820056e-03 -2.5143067265777467e-04 6.6591281260618140e-03 7.9924629205182923e-03 -7.7537310641019874e-03 -1.1853548255846081e-03 -3.7018459684215526e-03 -1.5826319364338052e-03 -3.5046785171910581e-04 -1.0967352594175530e-02 9.1896106605744900e-03 4.3527110424266614e-04 -1.5332543246257479e-03 6.7885098666965200e-03 4.4250603634629123e-03 2.8011654657441685e-02 -6.9439909564111748e-03 -6.5786780200968262e-03 -4.7516970137535825e-03 -6.3351646748197685e-03 -9.5730439866952427e-03 6.0449490048946290e-03 -2.6155281486093876e-02 -1.8175639222138967e-02 1.2098561377286472e-02 1.9511978158917229e-02 -2.5143067265778437e-04 -7.0783294226642070e-03 3.4462478746066977e-02 8.8655802446764628e-03 -1.2334848726302191e-02 -2.2558405709875544e-02 -1.7559953478663480e-02 7.2710367726514045e-03 -3.8096479198875335e-02 -2.5412806805722049e-03 8.5558551797772116e-03 1.8507505023239553e-02 1.5622273497049470e-02 -6.9439909564111757e-03 4.8290920345692226e-02 2.0774638239749198e-02 -7.6132332292321398e-03 -3.3962715879071230e-02 -6.7341879274427060e-03 5.6843943200966720e-03 -1.9125991303936052e-02 -2.3646630541516504e-02 1.4421591605433860e-02 1.2098561377286475e-02 -6.8036575505820160e-03 -2.2647571891334815e-03 1.2524461116656034e-02 -6.2709075202844545e-04 -1.1522772158683912e-02 -1.5232600623942695e-02 -2.7290068662143264e-02 3.6867738176931219e-03 -1.7685363605212348e-02 -4.3549811382856563e-03 6.9593298425029634e-03 1.4765023590792676e-02 2.2872772603710147e-02 -6.5786780200968262e-03 2.0774638239749198e-02 4.4926162160021633e-02 -1.0385882217812389e-02 -8.1187287913932846e-03 -5.0765061191759085e-03 -7.7726019982999519e-03 1.1810878008564554e-02 1.3627229761088258e-02 -2.3646630541516507e-02 -1.8175639222138974e-02 6.1680850903284030e-03 -4.1827534751867693e-03 -1.7704418939076053e-02 3.9225921803954771e-03 2.2063416578164942e-02 1.5320429901891062e-02 5.5488689452669196e-03 -1.8175396829844114e-03 9.9080367903458949e-03 -1.5195386270688662e-03 -2.7177988520231115e-02 -1.4152253547580458e-02 -1.1306280553481514e-02 -4.7516970137535834e-03 -7.6132332292321416e-03 -1.0385882217812389e-02 4.7285794653807410e-02 2.0606200237226126e-02 -6.0550745787162812e-03 -8.9572585721136742e-05 1.7768782102913539e-02 1.1810878008564545e-02 -1.9125991303936045e-02 -2.6155281486093872e-02 6.8888287771535052e-03 -2.5873557393835860e-03 -3.8570363916705694e-02 7.6403335116363626e-03 1.5084964751002196e-02 1.8823694932829791e-02 7.8928457877438189e-03 1.0349452965349351e-02 3.2348530730330810e-02 -7.0733171688419543e-03 -1.7902533649717139e-02 -2.1890281659709861e-02 -1.2633311071156653e-02 -6.3351646748197703e-03 -3.3962715879071237e-02 -8.1187287913932864e-03 2.0606200237226126e-02 5.1637635175506534e-02 -6.4075290537063288e-03 6.5522438797558317e-03 -8.9572585721135549e-05 -7.7726019982999467e-03 5.6843943200966720e-03 6.0449490048946264e-03 -8.2463101264015556e-03 2.4270762823916386e-04 8.4032438253144638e-03 -1.0660173764888193e-02 5.7516123702002313e-03 7.2961912132505167e-03 -1.4832980102594490e-03 -1.8850309356461886e-03 -6.6485590540743683e-03 6.7244213410211163e-03 -7.1780869723418609e-04 -1.8645354225150688e-03 -4.1237001136909847e-03 -9.5730439866952410e-03 -6.7341879274427051e-03 -5.0765061191759093e-03 -6.0550745787162803e-03 -6.4075290537063288e-03 3.0638168791694922e-02 639 640 641 705 706 707 717 718 719 651 652 653 642 643 644 708 709 710 720 721 722 654 655 656 3.1464010540728241e-02 -9.6191609889624916e-03 -9.4928879061427357e-03 -2.2503998950379684e-03 -5.0159924659958226e-04 -7.5266309119284211e-03 -1.3475982721451080e-02 1.2346846707449564e-02 5.2559113273343411e-04 -3.9611407132418199e-03 2.2509682608549235e-03 1.8973300693565477e-03 9.9234574304305490e-03 -1.0194924516896624e-02 -3.2196466125153679e-03 -1.4205093191277007e-03 2.2722831246576084e-03 3.0774818471526531e-03 -1.0974633052846617e-02 8.5847463773592488e-03 8.8528109760999518e-03 -9.3048022694536044e-03 -5.1391597178626442e-03 5.8859514052439377e-03 -9.6191609889624916e-03 4.4055072049424292e-02 1.7086523531965467e-02 -2.0839048075383284e-03 -3.2433011254103986e-02 -7.4608173764663024e-03 1.1103726800950321e-02 -3.1010148991327525e-02 -2.1835070151662219e-03 2.8979077860942521e-03 1.8526625510126075e-02 1.4422078110247099e-02 -1.0543215659683396e-02 2.6571181023147258e-02 8.8231103888887531e-03 -7.5122123039870065e-03 -2.1764890940952041e-02 -1.6093241232491499e-02 9.4947737908002705e-03 -2.0803868392460793e-02 -1.5831327547545838e-02 6.2620853823263829e-03 1.6859040996146716e-02 1.2371811405685301e-03 -9.4928879061427357e-03 1.7086523531965467e-02 4.2401003527594051e-02 -8.1674085258236894e-03 -8.7768360941392516e-03 -5.0993343703236525e-03 6.2243011339064456e-03 -1.4706956959362704e-02 -3.9287232069435485e-03 1.7287753409826229e-03 1.4381693608657537e-02 1.9504092803476064e-02 -2.7151784335370569e-03 8.5186436251704443e-03 -7.1434013119731283e-04 -7.0908082319079951e-03 -1.4444132149793015e-02 -2.4377614212364986e-02 9.0912471084650028e-03 -1.4686220742023933e-02 -2.1026606621047508e-02 1.0421959514057407e-02 1.2627285179525450e-02 -6.7584777891931177e-03 -2.2503998950379684e-03 -2.0839048075383315e-03 -8.1674085258236894e-03 3.5086397181803744e-02 1.7762822266262305e-02 -4.3619128640105167e-03 -3.5988503073436798e-03 5.3287032111094638e-03 -1.1025216144106096e-03 -1.9449362747446519e-02 -1.3857330363414173e-02 -8.8263440318067481e-03 -1.3919038114134875e-03 -1.0379886243937285e-02 2.1417327421158062e-03 1.6342634555296356e-02 1.3301726876266231e-02 5.4139852269645804e-03 -8.4292895928275869e-03 6.2968043877553717e-03 1.1032095396281459e-02 -1.6309225383030874e-02 -1.6368935326503579e-02 3.8703736706897215e-03 -5.0159924659958226e-04 -3.2433011254103999e-02 -8.7768360941392516e-03 1.7762822266262298e-02 5.0791871055326981e-02 -6.4308255933506961e-03 1.7835696625619268e-03 3.3002675032354302e-02 -6.2770303983640165e-03 -1.5431721122920513e-02 -2.6132221754299405e-02 -1.3177410104795747e-02 3.4323191490276969e-03 -3.6545378412566908e-02 6.5320261557665991e-03 1.3984870771325755e-02 2.2742874635736154e-02 9.0958288551458658e-03 -5.4950394484693296e-03 1.8389354660998624e-02 1.3194881863052135e-02 -1.5535222031188258e-02 -2.9816163963445774e-02 5.8393653166851087e-03 -7.5266309119284194e-03 -7.4608173764663024e-03 -5.0993343703236542e-03 -4.3619128640105167e-03 -6.4308255933506935e-03 2.5052468345881075e-02 -1.5928474865591687e-05 -6.3621558482812347e-03 6.6513364207116173e-03 -6.4801006997003939e-04 -1.9351563710110942e-03 -4.0591431123646353e-03 -9.3418542082154604e-04 7.4274118848068199e-03 -9.4686983180130788e-03 3.4744764501854590e-03 7.0620311600047888e-03 -1.6814256662389161e-04 6.0081092009768248e-03 1.3445228165805717e-03 -5.6415678198507473e-03 4.0040820904338314e-03 6.3549893277171417e-03 -7.2669185794166872e-03 -1.3475982721451080e-02 1.1103726800950318e-02 6.2243011339064456e-03 -3.5988503073436785e-03 1.7835696625619268e-03 -1.5928474865591850e-05 2.8469874908403227e-02 -1.3540867993089437e-02 3.0054125091865877e-03 -1.8993126734616385e-03 -4.1210242078037161e-03 6.4301545923345360e-03 -1.0871891370357864e-02 1.2609640027791512e-02 -2.5645899028540306e-03 -8.3062774429027517e-03 -9.4372823094521652e-04 -8.2413041076801804e-03 1.0783693017717318e-02 -1.0552600534684381e-02 -3.9118423059005952e-03 -1.1012534106035249e-03 3.6612844752189869e-03 -9.2620344412717374e-04 1.2346846707449564e-02 -3.1010148991327528e-02 -1.4706956959362704e-02 5.3287032111094621e-03 3.3002675032354302e-02 -6.3621558482812339e-03 -1.3540867993089435e-02 5.6310879233163171e-02 -6.9944134306666470e-03 -6.0857769074362175e-03 -3.1210032487703245e-02 -1.0481377630097597e-02 1.2028509639178944e-02 -3.5261033930588909e-02 6.2355876632419023e-03 1.1366777128866447e-02 1.7294757513906321e-02 1.4841623513441952e-02 -1.1229084098848001e-02 2.7268991048822029e-02 1.0502284487367775e-02 -1.0215107687230768e-02 -3.6396087418626127e-02 6.9654082043565579e-03 5.2559113273343422e-04 -2.1835070151662219e-03 -3.9287232069435468e-03 -1.1025216144106098e-03 -6.2770303983640157e-03 6.6513364207116173e-03 3.0054125091865877e-03 -6.9944134306666470e-03 2.4444105265546787e-02 6.0458280751549713e-03 -8.4882114865346917e-03 -4.7320740249423990e-03 -2.6884414263584045e-03 6.8402910740955223e-03 -7.1816426065492035e-03 -5.7639079053441802e-03 2.4858092454457647e-03 -5.6377484446535168e-03 -2.2665005120450304e-03 7.5319582654880951e-03 -3.7912748718906257e-04 2.2445397410832319e-03 7.0851037457021933e-03 -9.2361259159806745e-03 -3.9611407132418191e-03 2.8979077860942530e-03 1.7287753409826238e-03 -1.9449362747446519e-02 -1.5431721122920513e-02 -6.4801006997004015e-04 -1.8993126734616374e-03 -6.0857769074362167e-03 6.0458280751549713e-03 3.6886208620086292e-02 1.2030179873241184e-02 1.3418456761367503e-02 -9.3459426068368268e-03 1.0869421907239387e-02 -5.6198074777517489e-03 -1.6171422720798613e-02 -1.0327831400129389e-02 -1.2271483128974208e-02 -1.0690881352270762e-03 -7.0909405494393903e-03 -7.0749049349849297e-03 1.5010060976926193e-02 1.3138760413350679e-02 4.4211454341758294e-03 2.2509682608549226e-03 1.8526625510126075e-02 1.4381693608657537e-02 -1.3857330363414173e-02 -2.6132221754299398e-02 -1.9351563710110946e-03 -4.1210242078037135e-03 -3.1210032487703248e-02 -8.4882114865346917e-03 1.2030179873241184e-02 3.9828823839810831e-02 1.4834499004315879e-02 -1.0718640974992323e-03 1.5790895713384271e-02 2.4178247745384679e-03 -1.1385207759638090e-02 -1.7163878828093438e-02 -1.3605778893127675e-02 2.7841197750141894e-03 -2.1671451302592661e-02 -1.5285588188532203e-02 1.3370158519244911e-02 2.2031239309367557e-02 7.6807175516937706e-03 1.8973300693565455e-03 1.4422078110247099e-02 1.9504092803476071e-02 -8.8263440318067481e-03 -1.3177410104795747e-02 -4.0591431123646344e-03 6.4301545923345360e-03 -1.0481377630097599e-02 -4.7320740249423990e-03 1.3418456761367503e-02 1.4834499004315880e-02 4.2285525146652736e-02 -7.9111507865065236e-03 1.4354476894624588e-02 -6.7793593945113884e-03 -1.2503771457695956e-02 -1.2571456821537002e-02 -2.0959605910260776e-02 3.3272282751079076e-03 -1.5461720995872629e-02 -2.4364569535259954e-02 4.1680965778427359e-03 8.0809115431154013e-03 -8.9486597278965385e-04 9.9234574304305490e-03 -1.0543215659683395e-02 -2.7151784335370552e-03 -1.3919038114134879e-03 3.4323191490276961e-03 -9.3418542082154604e-04 -1.0871891370357864e-02 1.2028509639178946e-02 -2.6884414263584041e-03 -9.3459426068368250e-03 -1.0718640974992336e-03 -7.9111507865065253e-03 3.2095915408051824e-02 -1.3068245554675686e-02 2.8271515616520499e-03 -2.3061003699390375e-03 -5.0269406879155506e-03 6.1087676788455138e-03 -1.3790232187806091e-02 1.0556786275648943e-02 6.0175238912795349e-03 -4.3133024921290699e-03 3.6926509359182834e-03 -7.0448706455356709e-04 -1.0194924516896624e-02 2.6571181023147258e-02 8.5186436251704425e-03 -1.0379886243937285e-02 -3.6545378412566908e-02 7.4274118848068199e-03 1.2609640027791510e-02 -3.5261033930588909e-02 6.8402910740955215e-03 1.0869421907239387e-02 1.5790895713384268e-02 1.4354476894624586e-02 -1.3068245554675688e-02 5.9750934487325200e-02 -6.5209541795669020e-03 -5.7071590227892495e-03 -3.0779605330295400e-02 -9.9064038508245179e-03 1.2809847206178594e-02 -3.0522333052821152e-02 -1.4863338214930100e-02 3.0613061970893576e-03 3.0995339502415613e-02 -5.8501272333758552e-03 -3.2196466125153679e-03 8.8231103888887531e-03 -7.1434013119731196e-04 2.1417327421158062e-03 6.5320261557665982e-03 -9.4686983180130788e-03 -2.5645899028540315e-03 6.2355876632419031e-03 -7.1816426065492035e-03 -5.6198074777517489e-03 2.4178247745384679e-03 -6.7793593945113901e-03 2.8271515616520499e-03 -6.5209541795669028e-03 2.8170382545262884e-02 5.9815566890154132e-03 -9.2549200045328028e-03 -5.2800895396035502e-03 7.0433507457314253e-04 -2.3668118517986407e-03 -4.3506577373809332e-03 -2.5073207423526457e-04 -5.8658629465373766e-03 5.6044051819925831e-03 -1.4205093191276999e-03 -7.5122123039870065e-03 -7.0908082319079968e-03 1.6342634555296359e-02 1.3984870771325758e-02 3.4744764501854599e-03 -8.3062774429027535e-03 1.1366777128866445e-02 -5.7639079053441802e-03 -1.6171422720798613e-02 -1.1385207759638090e-02 -1.2503771457695956e-02 -2.3061003699390388e-03 -5.7071590227892512e-03 5.9815566890154132e-03 3.5363249151346983e-02 1.1871072569818803e-02 1.3677008423643717e-02 -3.9153482607001073e-03 3.2967537322532658e-03 3.0606988892313354e-03 -1.9586225593175126e-02 -1.5914895115849922e-02 -8.3525285712779493e-04 2.2722831246576088e-03 -2.1764890940952041e-02 -1.4444132149793018e-02 1.3301726876266231e-02 2.2742874635736154e-02 7.0620311600047888e-03 -9.4372823094521652e-04 1.7294757513906321e-02 2.4858092454457647e-03 -1.0327831400129387e-02 -1.7163878828093438e-02 -1.2571456821537000e-02 -5.0269406879155498e-03 -3.0779605330295386e-02 -9.2549200045328028e-03 1.1871072569818801e-02 3.6913466111147569e-02 1.4422959236760209e-02 1.7869796489338753e-03 1.8437814928269854e-02 1.4328211739694599e-02 -1.2933561900686367e-02 -2.5680538089719034e-02 -2.0285024060425379e-03 3.0774818471526531e-03 -1.6093241232491499e-02 -2.4377614212364986e-02 5.4139852269645813e-03 9.0958288551458641e-03 -1.6814256662389272e-04 -8.2413041076801804e-03 1.4841623513441952e-02 -5.6377484446535168e-03 -1.2271483128974209e-02 -1.3605778893127675e-02 -2.0959605910260776e-02 6.1087676788455130e-03 -9.9064038508245127e-03 -5.2800895396035536e-03 1.3677008423643717e-02 1.4422959236760206e-02 4.0494118670243183e-02 6.9117923727508054e-04 1.4463013627336636e-02 2.0350387848628956e-02 -8.4556351772271596e-03 -1.3218001256240966e-02 -4.4213058453654083e-03 -1.0974633052846615e-02 9.4947737908002705e-03 9.0912471084650028e-03 -8.4292895928275869e-03 -5.4950394484693296e-03 6.0081092009768239e-03 1.0783693017717318e-02 -1.1229084098848001e-02 -2.2665005120450304e-03 -1.0690881352270764e-03 2.7841197750141894e-03 3.3272282751079080e-03 -1.3790232187806091e-02 1.2809847206178594e-02 7.0433507457314253e-04 -3.9153482607001064e-03 1.7869796489338758e-03 6.9117923727508032e-04 2.9116272461742698e-02 -9.8158670106957644e-03 -9.9720145144950624e-03 -1.7213742500525359e-03 -3.3572986291383750e-04 -7.5835838698578659e-03 8.5847463773592505e-03 -2.0803868392460793e-02 -1.4686220742023932e-02 6.2968043877553717e-03 1.8389354660998624e-02 1.3445228165805717e-03 -1.0552600534684382e-02 2.7268991048822026e-02 7.5319582654880934e-03 -7.0909405494393903e-03 -2.1671451302592664e-02 -1.5461720995872633e-02 1.0556786275648943e-02 -3.0522333052821152e-02 -2.3668118517986415e-03 3.2967537322532671e-03 1.8437814928269857e-02 1.4463013627336636e-02 -9.8158670106957644e-03 4.0270616569071251e-02 1.6902645979994912e-02 -1.2756826781973006e-03 -3.1369124459287148e-02 -7.7273870997050086e-03 8.8528109760999535e-03 -1.5831327547545838e-02 -2.1026606621047508e-02 1.1032095396281459e-02 1.3194881863052137e-02 -5.6415678198507473e-03 -3.9118423059005944e-03 1.0502284487367773e-02 -3.7912748718906225e-04 -7.0749049349849305e-03 -1.5285588188532200e-02 -2.4364569535259954e-02 6.0175238912795349e-03 -1.4863338214930102e-02 -4.3506577373809349e-03 3.0606988892313363e-03 1.4328211739694599e-02 2.0350387848628956e-02 -9.9720145144950624e-03 1.6902645979994912e-02 4.0180492509762362e-02 -8.0043673975116990e-03 -8.9477701191012764e-03 -4.7683511576631105e-03 -9.3048022694536027e-03 6.2620853823263812e-03 1.0421959514057406e-02 -1.6309225383030874e-02 -1.5535222031188258e-02 4.0040820904338314e-03 -1.1012534106035247e-03 -1.0215107687230768e-02 2.2445397410832315e-03 1.5010060976926193e-02 1.3370158519244911e-02 4.1680965778427368e-03 -4.3133024921290716e-03 3.0613061970893589e-03 -2.5073207423526489e-04 -1.9586225593175126e-02 -1.2933561900686367e-02 -8.4556351772271578e-03 -1.7213742500525359e-03 -1.2756826781973006e-03 -8.0043673975116990e-03 3.7326122421518532e-02 1.7266024198642031e-02 -4.1279432744430865e-03 -5.1391597178626442e-03 1.6859040996146716e-02 1.2627285179525452e-02 -1.6368935326503579e-02 -2.9816163963445767e-02 6.3549893277171417e-03 3.6612844752189878e-03 -3.6396087418626120e-02 7.0851037457021933e-03 1.3138760413350679e-02 2.2031239309367557e-02 8.0809115431153995e-03 3.6926509359182821e-03 3.0995339502415613e-02 -5.8658629465373749e-03 -1.5914895115849925e-02 -2.5680538089719041e-02 -1.3218001256240964e-02 -3.3572986291383576e-04 -3.1369124459287148e-02 -8.9477701191012764e-03 1.7266024198642035e-02 5.3376294123148184e-02 -6.1166554741805658e-03 5.8859514052439386e-03 1.2371811405685303e-03 -6.7584777891931177e-03 3.8703736706897211e-03 5.8393653166851096e-03 -7.2669185794166872e-03 -9.2620344412717363e-04 6.9654082043565579e-03 -9.2361259159806745e-03 4.4211454341758294e-03 7.6807175516937706e-03 -8.9486597278965873e-04 -7.0448706455356687e-04 -5.8501272333758552e-03 5.6044051819925831e-03 -8.3525285712779407e-04 -2.0285024060425374e-03 -4.4213058453654065e-03 -7.5835838698578668e-03 -7.7273870997050086e-03 -4.7683511576631114e-03 -4.1279432744430865e-03 -6.1166554741805684e-03 2.7741640078416070e-02 705 706 707 753 754 755 765 766 767 717 718 719 708 709 710 756 757 758 768 769 770 720 721 722 3.4733581995173637e-02 -1.0729995527184127e-02 -1.0467247163500806e-02 -2.8258349718321757e-03 -5.7170128501890104e-04 -8.2927284615094063e-03 -1.5129071943844096e-02 1.3656245197531698e-02 6.4519427972987986e-04 -3.9471031027150270e-03 2.5643663519999958e-03 2.1928299843126599e-03 1.0985648175369215e-02 -1.1386933182092008e-02 -3.4823909376576635e-03 -1.6305027077899450e-03 2.5562147400412642e-03 3.3637478287576596e-03 -1.2152984172807224e-02 9.5730455478189435e-03 9.6275818295379605e-03 -1.0033733271554395e-02 -5.6612418430968640e-03 6.4130126403297138e-03 -1.0729995527184127e-02 4.9442762644654990e-02 1.9317775318677139e-02 -2.3835591773961372e-03 -3.6830471463065444e-02 -8.2359783449575206e-03 1.2459048740269362e-02 -3.5475791949724104e-02 -2.6774326994269890e-03 3.1882966607538182e-03 2.1397566767559786e-02 1.6179103532461162e-02 -1.1766497649790873e-02 3.0256419672626527e-02 9.7124795950873852e-03 -8.5065300277528816e-03 -2.4525833161561900e-02 -1.8120791706074956e-02 1.0659194686549021e-02 -2.3740401875474906e-02 -1.7730929145991326e-02 7.0800422945518247e-03 1.9475749364985057e-02 1.5557734502251157e-03 -1.0467247163500809e-02 1.9317775318677136e-02 4.7183646929643316e-02 -9.0271603900382701e-03 -1.0141755731379576e-02 -5.9043252119145460e-03 6.9409819808180584e-03 -1.6685768908258902e-02 -4.8980047932386779e-03 1.9661241489910500e-03 1.6314176011877277e-02 2.1934856346274990e-02 -3.1755945890979088e-03 9.9452380240631771e-03 -6.4863252894136803e-04 -7.8890525111515071e-03 -1.6335775749856597e-02 -2.7140523372255004e-02 1.0114373718771162e-02 -1.6715463181758202e-02 -2.3416697230290228e-02 1.1537574805208234e-02 1.4301574216635684e-02 -7.1103201392784723e-03 -2.8258349718321757e-03 -2.3835591773961355e-03 -9.0271603900382701e-03 3.8694637992086292e-02 1.9788320953518602e-02 -4.7314113950018390e-03 -3.4220729818455762e-03 5.8793616191842001e-03 -1.0797690611276758e-03 -2.1652776276009190e-02 -1.5402079936611206e-02 -9.6535587769278827e-03 -1.6446280111847770e-03 -1.1626165571096209e-02 2.2791727666362153e-03 1.7955148733654645e-02 1.4797181471930328e-02 6.0897414377528289e-03 -9.0412190262259377e-03 7.0941362673314521e-03 1.2070475555655578e-02 -1.8063255458643287e-02 -1.8147195626861026e-02 4.0525098630510431e-03 -5.7170128501889995e-04 -3.6830471463065444e-02 -1.0141755731379577e-02 1.9788320953518602e-02 5.7054475562223143e-02 -7.1249732178873381e-03 2.1528674277813097e-03 3.7815491186503271e-02 -6.7346682775719013e-03 -1.7339170239575267e-02 -2.9842726755227755e-02 -1.4718288979435135e-02 3.8871023793413512e-03 -4.1312513509393751e-02 7.2168406274051872e-03 1.5681498769406815e-02 2.5673263944789762e-02 1.0481242583405694e-02 -6.1115425768683302e-03 2.1235136321414702e-02 1.4749091950234867e-02 -1.7487375428585594e-02 -3.3792655287243907e-02 6.2725110452282037e-03 -8.2927284615094063e-03 -8.2359783449575188e-03 -5.9043252119145460e-03 -4.7314113950018390e-03 -7.1249732178873381e-03 2.7756338845906198e-02 2.8423692165458598e-05 -7.0394740043774728e-03 7.6623846410785179e-03 -7.7186205012018242e-04 -2.1950709926913366e-03 -4.8485574016403493e-03 -9.8134986118028904e-04 8.2518381572745988e-03 -1.0471699625477336e-02 3.7722891907924555e-03 7.7752089724290648e-03 -1.5035834890883613e-04 6.5765672962532938e-03 1.5161149561963780e-03 -5.9898334266730597e-03 4.4000715886005114e-03 7.0523344740136273e-03 -8.0539494723705866e-03 -1.5129071943844096e-02 1.2459048740269362e-02 6.9409819808180593e-03 -3.4220729818455757e-03 2.1528674277813114e-03 2.8423692165457893e-05 3.2479610863709728e-02 -1.5035367061923960e-02 3.1505058329087299e-03 -3.4388213771477101e-03 -4.8026517060453739e-03 6.8831256422789613e-03 -1.2071378841409668e-02 1.4057304467592627e-02 -2.7672439607666762e-03 -8.9064677403013111e-03 -1.0083106974090915e-03 -9.0180132287173715e-03 1.2327125442416128e-02 -1.1768519353133080e-02 -4.2149608995262159e-03 -1.8389234215774992e-03 3.9456281828682115e-03 -1.0028190591609412e-03 1.3656245197531695e-02 -3.5475791949724104e-02 -1.6685768908258906e-02 5.8793616191841992e-03 3.7815491186503264e-02 -7.0394740043774728e-03 -1.5035367061923958e-02 6.4683113666753320e-02 -7.4587161088665250e-03 -6.6434641663701260e-03 -3.6663999846562059e-02 -1.1594069846040811e-02 1.3392996917420638e-02 -4.0110162547467208e-02 6.8909719571358793e-03 1.2745642970077083e-02 1.9894227312544140e-02 1.6799272550222202e-02 -1.2529585579257643e-02 3.1551884611468212e-02 1.1607365936416968e-02 -1.1465829896661900e-02 -4.1694762433515574e-02 7.4804184237686590e-03 6.4519427972987986e-04 -2.6774326994269890e-03 -4.8980047932386779e-03 -1.0797690611276758e-03 -6.7346682775719013e-03 7.6623846410785170e-03 3.1505058329087290e-03 -7.4587161088665284e-03 2.8003500788096727e-02 6.5009839264764677e-03 -9.9112997555779719e-03 -6.7000363967524602e-03 -2.8195278019689626e-03 7.3603026010577435e-03 -7.9837956354496496e-03 -6.1913968771656240e-03 2.9684697514508196e-03 -5.8584213040725154e-03 -2.6285620586329415e-03 8.8048711399946085e-03 3.5055587235409164e-04 2.4225717597801308e-03 7.6484733489402181e-03 -1.0576183172016036e-02 -3.9471031027150261e-03 3.1882966607538182e-03 1.9661241489910474e-03 -2.1652776276009193e-02 -1.7339170239575263e-02 -7.7186205012018286e-04 -3.4388213771477084e-03 -6.6434641663701260e-03 6.5009839264764677e-03 4.1596636198533883e-02 1.3519202931205060e-02 1.4739259467690101e-02 -1.0060900608682897e-02 1.2121888424484023e-02 -6.1285519287290219e-03 -1.7865217918338866e-02 -1.1592781848831155e-02 -1.3605011735262049e-02 -1.7048305769021498e-03 -7.9135492882233399e-03 -7.7724335127720857e-03 1.7073013661261970e-02 1.4659577526556980e-02 5.0714916837257228e-03 2.5643663519999949e-03 2.1397566767559783e-02 1.6314176011877277e-02 -1.5402079936611206e-02 -2.9842726755227755e-02 -2.1950709926913366e-03 -4.8026517060453756e-03 -3.6663999846562066e-02 -9.9112997555779701e-03 1.3519202931205059e-02 4.5677127707613445e-02 1.6732313069363770e-02 -1.2339965140789372e-03 1.8365819495526493e-02 2.7154238165568202e-03 -1.2741595295405082e-02 -1.9477469595065414e-02 -1.5378642441018209e-02 3.0557579661055277e-03 -2.5024977494680981e-02 -1.7154659678665786e-02 1.5040996202830035e-02 2.5568659720836481e-02 8.8777599701554428e-03 2.1928299843126599e-03 1.6179103532461162e-02 2.1934856346274987e-02 -9.6535587769278827e-03 -1.4718288979435137e-02 -4.8485574016403502e-03 6.8831256422789613e-03 -1.1594069846040811e-02 -6.7000363967524594e-03 1.4739259467690101e-02 1.6732313069363770e-02 4.7568562524702665e-02 -8.6659512292010677e-03 1.6073281759533094e-02 -7.2044104236469687e-03 -1.3707946649822592e-02 -1.4092029509465557e-02 -2.3269275334174139e-02 3.6337391645923345e-03 -1.7460654108393460e-02 -2.7271643358408561e-02 4.5785023970775010e-03 8.8803440819769392e-03 -2.0949595635516756e-04 1.0985648175369215e-02 -1.1766497649790873e-02 -3.1755945890979097e-03 -1.6446280111847773e-03 3.8871023793413508e-03 -9.8134986118028882e-04 -1.2071378841409667e-02 1.3392996917420638e-02 -2.8195278019689631e-03 -1.0060900608682897e-02 -1.2339965140789374e-03 -8.6659512292010677e-03 3.5228646424056834e-02 -1.4590422836674583e-02 3.0543594218099355e-03 -2.5414638353117944e-03 -5.4568795445739879e-03 6.7813801717520553e-03 -1.5381875128199298e-02 1.1736282810104587e-02 6.5925539609839028e-03 -4.5140481746376235e-03 4.0314144382518052e-03 -7.8587007309766544e-04 -1.1386933182092008e-02 3.0256419672626531e-02 9.9452380240631771e-03 -1.1626165571096209e-02 -4.1312513509393751e-02 8.2518381572745988e-03 1.4057304467592629e-02 -4.0110162547467215e-02 7.3603026010577444e-03 1.2121888424484023e-02 1.8365819495526493e-02 1.6073281759533094e-02 -1.4590422836674586e-02 6.6854024161805220e-02 -7.2128573686162205e-03 -6.5776760963122405e-03 -3.4586739075658762e-02 -1.1479567542722294e-02 1.4406064992102494e-02 -3.4796969174929963e-02 -1.6673793275390179e-02 3.5959398019959126e-03 3.5330120977491483e-02 -6.2644423551999210e-03 -3.4823909376576639e-03 9.7124795950873852e-03 -6.4863252894136749e-04 2.2791727666362153e-03 7.2168406274051855e-03 -1.0471699625477336e-02 -2.7672439607666762e-03 6.8909719571358802e-03 -7.9837956354496514e-03 -6.1285519287290219e-03 2.7154238165568211e-03 -7.2044104236469687e-03 3.0543594218099355e-03 -7.2128573686162179e-03 3.0910966399242210e-02 6.5676636263472333e-03 -1.0179657461324428e-02 -5.8369712692616718e-03 8.4322485789344189e-04 -2.6619423536607687e-03 -5.0843833825706553e-03 -3.6623384553346669e-04 -6.4812588125838545e-03 6.3189264661054380e-03 -1.6305027077899458e-03 -8.5065300277528798e-03 -7.8890525111515054e-03 1.7955148733654645e-02 1.5681498769406815e-02 3.7722891907924555e-03 -8.9064677403013093e-03 1.2745642970077083e-02 -6.1913968771656249e-03 -1.7865217918338866e-02 -1.2741595295405082e-02 -1.3707946649822594e-02 -2.5414638353117944e-03 -6.5776760963122405e-03 6.5676636263472324e-03 3.8790872944126489e-02 1.3279803699744781e-02 1.5143531958872820e-02 -4.0401345268061932e-03 3.8089512536959805e-03 3.3607512837251379e-03 -2.1762234949233038e-02 -1.7690095273454463e-02 -1.0558400215979250e-03 2.5562147400412642e-03 -2.4525833161561900e-02 -1.6335775749856597e-02 1.4797181471930324e-02 2.5673263944789766e-02 7.7752089724290631e-03 -1.0083106974090920e-03 1.9894227312544140e-02 2.9684697514508196e-03 -1.1592781848831153e-02 -1.9477469595065414e-02 -1.4092029509465556e-02 -5.4568795445739888e-03 -3.4586739075658762e-02 -1.0179657461324427e-02 1.3279803699744781e-02 4.0953798771233715e-02 1.6233019078763504e-02 2.0126230420179931e-03 2.1129833907713821e-02 1.6046797231847442e-02 -1.4587850862920139e-02 -2.9061082103995349e-02 -2.4160323138442529e-03 3.3637478287576591e-03 -1.8120791706074960e-02 -2.7140523372255004e-02 6.0897414377528289e-03 1.0481242583405694e-02 -1.5035834890883586e-04 -9.0180132287173715e-03 1.6799272550222205e-02 -5.8584213040725154e-03 -1.3605011735262049e-02 -1.5378642441018209e-02 -2.3269275334174139e-02 6.7813801717520553e-03 -1.1479567542722289e-02 -5.8369712692616735e-03 1.5143531958872821e-02 1.6233019078763507e-02 4.4713533514200751e-02 7.1228246138317392e-04 1.6415940238156373e-02 2.2748394248224217e-02 -9.4676588945391271e-03 -1.4950472760732319e-02 -5.2063781337527973e-03 -1.2152984172807224e-02 1.0659194686549019e-02 1.0114373718771162e-02 -9.0412190262259377e-03 -6.1115425768683319e-03 6.5765672962532938e-03 1.2327125442416124e-02 -1.2529585579257643e-02 -2.6285620586329410e-03 -1.7048305769021511e-03 3.0557579661055281e-03 3.6337391645923350e-03 -1.5381875128199298e-02 1.4406064992102494e-02 8.4322485789344178e-04 -4.0401345268061932e-03 2.0126230420179922e-03 7.1228246138317305e-04 3.2836815130056048e-02 -1.1007460060757930e-02 -1.0937134279525990e-02 -2.8428971415313644e-03 -4.8505246989112702e-04 -8.3144911607344728e-03 9.5730455478189452e-03 -2.3740401875474906e-02 -1.6715463181758199e-02 7.0941362673314513e-03 2.1235136321414702e-02 1.5161149561963780e-03 -1.1768519353133080e-02 3.1551884611468219e-02 8.8048711399946085e-03 -7.9135492882233382e-03 -2.5024977494680981e-02 -1.7460654108393460e-02 1.1736282810104585e-02 -3.4796969174929963e-02 -2.6619423536607695e-03 3.8089512536959801e-03 2.1129833907713821e-02 1.6415940238156373e-02 -1.1007460060757930e-02 4.6079458728173074e-02 1.9068094750107047e-02 -1.5228871768366275e-03 -3.6433965023683956e-02 -8.9669614406419733e-03 9.6275818295379605e-03 -1.7730929145991326e-02 -2.3416697230290228e-02 1.2070475555655578e-02 1.4749091950234867e-02 -5.9898334266730597e-03 -4.2149608995262142e-03 1.1607365936416966e-02 3.5055587235409262e-04 -7.7724335127720857e-03 -1.7154659678665786e-02 -2.7271643358408558e-02 6.5925539609839028e-03 -1.6673793275390182e-02 -5.0843833825706553e-03 3.3607512837251358e-03 1.6046797231847442e-02 2.2748394248224217e-02 -1.0937134279525990e-02 1.9068094750107040e-02 4.5045202625325936e-02 -8.7268339380783006e-03 -9.9119677685590209e-03 -6.3815953479617457e-03 -1.0033733271554395e-02 7.0800422945518221e-03 1.1537574805208234e-02 -1.8063255458643287e-02 -1.7487375428585594e-02 4.4000715886005123e-03 -1.8389234215774998e-03 -1.1465829896661901e-02 2.4225717597801313e-03 1.7073013661261970e-02 1.5040996202830035e-02 4.5785023970775010e-03 -4.5140481746376252e-03 3.5959398019959100e-03 -3.6623384553346636e-04 -2.1762234949233038e-02 -1.4587850862920138e-02 -9.4676588945391271e-03 -2.8428971415313652e-03 -1.5228871768366271e-03 -8.7268339380783023e-03 4.1982078755915239e-02 1.9346965065626491e-02 -4.3779938725154793e-03 -5.6612418430968640e-03 1.9475749364985057e-02 1.4301574216635684e-02 -1.8147195626861026e-02 -3.3792655287243907e-02 7.0523344740136291e-03 3.9456281828682124e-03 -4.1694762433515574e-02 7.6484733489402172e-03 1.4659577526556982e-02 2.5568659720836478e-02 8.8803440819769392e-03 4.0314144382518086e-03 3.5330120977491483e-02 -6.4812588125838545e-03 -1.7690095273454463e-02 -2.9061082103995349e-02 -1.4950472760732319e-02 -4.8505246989112702e-04 -3.6433965023683963e-02 -9.9119677685590227e-03 1.9346965065626491e-02 6.0607934785125772e-02 -6.5390267796912732e-03 6.4130126403297164e-03 1.5557734502251153e-03 -7.1103201392784723e-03 4.0525098630510431e-03 6.2725110452282046e-03 -8.0539494723705866e-03 -1.0028190591609410e-03 7.4804184237686590e-03 -1.0576183172016036e-02 5.0714916837257228e-03 8.8777599701554428e-03 -2.0949595635516723e-04 -7.8587007309766500e-04 -6.2644423551999210e-03 6.3189264661054380e-03 -1.0558400215979257e-03 -2.4160323138442529e-03 -5.2063781337527981e-03 -8.3144911607344711e-03 -8.9669614406419768e-03 -6.3815953479617439e-03 -4.3779938725154802e-03 -6.5390267796912723e-03 3.1218995755629364e-02 186 187 188 258 259 260 684 685 686 618 619 620 189 190 191 261 262 263 687 688 689 621 622 623 2.0826509824607209e-02 8.3121837060534296e-04 9.3479432904046802e-04 -7.7132642042831209e-03 -8.1979236369119548e-03 -9.3708359819858773e-03 -5.7704649630268305e-03 -1.2215109022054981e-03 -4.1809915225919880e-04 3.6847123080314889e-03 7.2238424840649733e-03 9.1848373996764807e-03 1.5738483300683490e-03 1.3403518407638297e-03 7.6658966753002521e-04 -7.7718439172015912e-03 -3.0404945523998575e-03 -5.6806599825181018e-03 -4.0585517698162642e-03 -5.0723372890583830e-04 -6.9567071356464044e-04 -7.7094560837923966e-04 3.5717501249890055e-03 5.2790444340808512e-03 8.3121837060534296e-04 3.2271057104446506e-02 1.4487243439186967e-02 -8.9815537736470281e-03 -1.5345404413266799e-02 -3.8415927561072220e-03 -1.1491604777001652e-03 -2.6685007795452784e-02 -4.6764791064310661e-03 8.0092168647396232e-03 3.3674225323245596e-03 6.3594032263114006e-03 7.4882829387157171e-04 1.9608635907061280e-02 1.1533277438591415e-02 -9.8239842621948674e-03 -5.7212584887896371e-03 -9.9308259906259033e-03 -6.2410846161352514e-05 -1.4451023104199738e-02 -1.3816770390946613e-02 1.0427845830486863e-02 6.9555782578766242e-03 -1.1425585997896744e-04 9.3479432904046802e-04 1.4487243439186967e-02 3.9277000382868840e-02 -1.0209828660355368e-02 -4.3487224186062566e-03 -1.8613159169253543e-03 -9.8022394473514830e-04 -1.7822346871375429e-02 -3.0017692634386776e-03 9.4326541474961754e-03 6.6752330648876691e-03 2.0599326957401930e-02 5.7908990759392783e-04 1.0452946471705828e-02 -3.8680117749759369e-03 -1.3352496291524326e-02 -2.8994878382405309e-03 -2.4421978035708398e-02 -9.9961545267351535e-05 -1.3125844502874942e-02 -2.1429252287962205e-02 1.3695972057751608e-02 6.5809786553167118e-03 -5.2940000612601941e-03 -7.7132642042831209e-03 -8.9815537736470316e-03 -1.0209828660355368e-02 4.1209225342287110e-02 1.2481459540577187e-02 -5.2950729316090352e-03 5.8260048377259729e-03 1.6589216486889258e-02 -2.1668280702553657e-03 -2.6862644397979030e-02 -3.2036285971463602e-03 -1.2978305462817290e-02 -9.1410018373660751e-03 -2.0099035575721628e-02 3.5504062296250545e-03 2.1065822069889613e-02 4.1533656766616694e-03 7.9815880379918332e-03 -5.7466109604959435e-05 1.0752307616540441e-02 1.4832258599282661e-02 -2.4326675700669490e-02 -1.1692131374153557e-02 4.2857822581374968e-03 -8.1979236369119565e-03 -1.5345404413266799e-02 -4.3487224186062557e-03 1.2481459540577187e-02 2.5736380858190817e-02 -3.0073275147925052e-03 1.3257805129595904e-02 1.9064911265989769e-02 -3.8249300504263283e-03 -8.1085683555892282e-03 -5.6106715350998345e-03 -7.3293601768463935e-03 -7.7219475563212589e-03 -2.3005354932555733e-02 3.9176511705465329e-03 5.3085686095088701e-03 1.2023107729622507e-03 5.9137462229017458e-03 3.7594128750016468e-03 8.1781515547088516e-03 6.4081710452350065e-03 -1.0778806605861157e-02 -1.0220323570929331e-02 2.2707717219881945e-03 -9.3708359819858790e-03 -3.8415927561072228e-03 -1.8613159169253539e-03 -5.2950729316090343e-03 -3.0073275147925048e-03 2.0115050624823470e-02 -1.9816159295880050e-03 -5.0234367955497138e-03 5.2768783880730724e-03 -1.6102030365876773e-03 -2.5224919720308438e-03 -1.8394630779362850e-03 2.0924462043976143e-03 5.9024606697513768e-03 -8.0757711387904659e-03 6.0178672585703341e-03 5.7889703568273169e-03 -3.5361682791545134e-03 5.0473387139582417e-03 -2.2938497930473253e-04 -5.0206786718404650e-03 5.1000757028444050e-03 2.9328029912063275e-03 -5.0585319282494554e-03 -5.7704649630268305e-03 -1.1491604777001648e-03 -9.8022394473514852e-04 5.8260048377259746e-03 1.3257805129595901e-02 -1.9816159295880055e-03 2.1738194945521840e-02 3.1851265358687937e-03 -1.9178525741038606e-04 -8.0890157864961024e-03 -1.2498069319663388e-02 -1.2752175199540953e-05 -6.2023721399483726e-03 -2.3917007671056091e-03 5.0667870205954330e-04 -1.9442299442682656e-03 6.5776864407451402e-03 -7.0265307625167939e-05 3.5507642095376699e-03 1.3062027967885932e-03 1.2958385743036304e-03 -9.1088811590459041e-03 -8.2878903385292663e-03 1.4341253381950747e-03 -1.2215109022054981e-03 -2.6685007795452784e-02 -1.7822346871375429e-02 1.6589216486889255e-02 1.9064911265989769e-02 -5.0234367955497130e-03 3.1851265358687933e-03 6.0427025459355584e-02 -5.3943460476725607e-03 -1.5575281568713619e-02 -6.4746808301924755e-03 -1.4495051073849212e-02 -1.8464407715965360e-03 -4.0659216560237271e-02 5.7026155678319658e-03 1.8683598772964084e-02 -5.8934222535261807e-03 1.8257115110694371e-02 7.1113198502448867e-04 2.3152522404530158e-02 1.3788289011377505e-02 -2.0525840538230949e-02 -2.2932131690466814e-02 4.9871610985430526e-03 -4.1809915225919821e-04 -4.6764791064310661e-03 -3.0017692634386785e-03 -2.1668280702553657e-03 -3.8249300504263283e-03 5.2768783880730707e-03 -1.9178525741038604e-04 -5.3943460476725599e-03 2.2209243314944383e-02 6.2721631002321564e-04 -1.1583908912260799e-02 -2.1336384316592654e-03 3.8580721891752403e-04 5.1335178816546648e-03 -6.9165621896844776e-03 -2.7124936767763635e-03 6.8136656365703563e-03 -7.3049714158121082e-03 9.1632520128116302e-04 1.0024678634876209e-02 -1.0593756809138791e-03 3.5598574264794104e-03 3.5078019636895271e-03 -7.0698047215090468e-03 3.6847123080314893e-03 8.0092168647396232e-03 9.4326541474961754e-03 -2.6862644397979030e-02 -8.1085683555892282e-03 -1.6102030365876777e-03 -8.0890157864961024e-03 -1.5575281568713625e-02 6.2721631002321510e-04 4.4247921080985020e-02 2.4573936807546293e-04 1.9495731888123136e-02 -4.0342418245699098e-03 1.8610913264240005e-02 -3.3610667592326518e-03 -2.3768267698026629e-02 1.5736544168749049e-03 -1.7343262648597316e-02 -7.2705652728580258e-03 -1.0192279510913064e-02 -1.4320767816401438e-02 2.2092101590913175e-02 5.4366055212859334e-03 7.0796979151765659e-03 7.2238424840649733e-03 3.3674225323245596e-03 6.6752330648876682e-03 -3.2036285971463602e-03 -5.6106715350998336e-03 -2.5224919720308434e-03 -1.2498069319663388e-02 -6.4746808301924755e-03 -1.1583908912260799e-02 2.4573936807546282e-04 2.4240132719570519e-02 8.8817532717038600e-05 6.5402478006707674e-03 -6.0389767455611334e-03 6.4219894202786282e-03 -2.0199827681910925e-04 -5.6328768285907006e-03 -2.4950255453626063e-04 -3.6004800085464410e-03 -6.3990381744707201e-03 -4.1142940356862900e-03 5.4943465493641000e-03 2.5486888620197819e-03 5.2841574566308575e-03 9.1848373996764807e-03 6.3594032263114006e-03 2.0599326957401930e-02 -1.2978305462817290e-02 -7.3293601768463935e-03 -1.8394630779362850e-03 -1.2752175199542580e-05 -1.4495051073849213e-02 -2.1336384316592663e-03 1.9495731888123136e-02 8.8817532717039033e-05 4.2082350293088544e-02 -7.9764469281147325e-04 1.7932947235810164e-02 -9.2932330162114225e-03 -1.6938999450056745e-02 1.4342391985529717e-03 -2.2224516555130865e-02 -5.4210194907437937e-03 -1.0267747165232407e-02 -2.4957914582787153e-02 7.4681519838292144e-03 6.2767512225364568e-03 -2.2329115867654684e-03 1.5738483300683499e-03 7.4882829387157193e-04 5.7908990759392783e-04 -9.1410018373660751e-03 -7.7219475563212606e-03 2.0924462043976134e-03 -6.2023721399483735e-03 -1.8464407715965364e-03 3.8580721891752387e-04 -4.0342418245699089e-03 6.5402478006707674e-03 -7.9764469281147390e-04 2.6523764060072876e-02 2.0788744876339719e-03 -1.7533679451331595e-04 -5.7455677517412301e-03 -1.3414556073292729e-02 9.6498087650666461e-04 -6.3134251696911805e-03 -8.2431035183581957e-04 -9.2842591311030685e-04 3.3389963331755422e-03 1.4439304170870032e-02 -2.1209168069806338e-03 1.3403518407638297e-03 1.9608635907061280e-02 1.0452946471705830e-02 -2.0099035575721628e-02 -2.3005354932555726e-02 5.9024606697513776e-03 -2.3917007671056091e-03 -4.0659216560237271e-02 5.1335178816546648e-03 1.8610913264240008e-02 -6.0389767455611316e-03 1.7932947235810164e-02 2.0788744876339728e-03 6.3685187990033143e-02 -6.1910013324641723e-03 -1.2869809167729365e-02 -3.4141809255946410e-03 -1.2308717149124168e-02 -3.1838170870988761e-04 -2.7141939573927566e-02 -1.7538655359683648e-02 1.3648787626628665e-02 1.6965844840781934e-02 -3.3834984176500322e-03 7.6658966753002564e-04 1.1533277438591416e-02 -3.8680117749759391e-03 3.5504062296250537e-03 3.9176511705465312e-03 -8.0757711387904642e-03 5.0667870205954319e-04 5.7026155678319675e-03 -6.9165621896844776e-03 -3.3610667592326522e-03 6.4219894202786273e-03 -9.2932330162114225e-03 -1.7533679451331595e-04 -6.1910013324641732e-03 2.7483907463772175e-02 8.6279761940056437e-04 -1.2804589859712555e-02 -8.3680769612702057e-05 1.3077424710945730e-04 -4.2742327695239795e-03 -3.0726186156388186e-03 -2.2808429119786731e-03 -4.3057096355478379e-03 3.8259700411416480e-03 -7.7718439172015921e-03 -9.8239842621948674e-03 -1.3352496291524324e-02 2.1065822069889613e-02 5.3085686095088692e-03 6.0178672585703358e-03 -1.9442299442682660e-03 1.8683598772964088e-02 -2.7124936767763640e-03 -2.3768267698026625e-02 -2.0199827681910941e-04 -1.6938999450056745e-02 -5.7455677517412283e-03 -1.2869809167729365e-02 8.6279761940056307e-04 4.1325420505040969e-02 -1.0856170134443636e-03 1.8454721358123111e-02 2.9302415384059631e-03 7.9346442878696771e-03 9.8693092684133139e-03 -2.6091574802098810e-02 -7.9454029501549433e-03 -2.2007060861498956e-03 -3.0404945523998575e-03 -5.7212584887896371e-03 -2.8994878382405309e-03 4.1533656766616685e-03 1.2023107729622500e-03 5.7889703568273169e-03 6.5776864407451410e-03 -5.8934222535261807e-03 6.8136656365703581e-03 1.5736544168749051e-03 -5.6328768285907015e-03 1.4342391985529719e-03 -1.3414556073292731e-02 -3.4141809255946419e-03 -1.2804589859712556e-02 -1.0856170134443636e-03 2.2503908123131234e-02 -1.1378314130295504e-03 7.2376285916996522e-03 2.0565171758385329e-03 5.2784108805522274e-03 -2.0016674868444185e-03 -5.1009975754308613e-03 -2.4733769615202365e-03 -5.6806599825181027e-03 -9.9308259906259050e-03 -2.4421978035708398e-02 7.9815880379918332e-03 5.9137462229017449e-03 -3.5361682791545113e-03 -7.0265307625168942e-05 1.8257115110694371e-02 -7.3049714158121073e-03 -1.7343262648597316e-02 -2.4950255453626031e-04 -2.2224516555130865e-02 9.6498087650666298e-04 -1.2308717149124165e-02 -8.3680769612701732e-05 1.8454721358123111e-02 -1.1378314130295504e-03 3.9979448997635579e-02 8.3193891338266754e-03 6.9262119646162712e-03 2.0329737191980318e-02 -1.2626491467707678e-02 -7.4701961908965244e-03 -2.7378711341973267e-03 -4.0585517698162642e-03 -6.2410846161352405e-05 -9.9961545267351318e-05 -5.7466109604959327e-05 3.7594128750016468e-03 5.0473387139582417e-03 3.5507642095376699e-03 7.1113198502448889e-04 9.1632520128116291e-04 -7.2705652728580258e-03 -3.6004800085464410e-03 -5.4210194907437937e-03 -6.3134251696911805e-03 -3.1838170870988848e-04 1.3077424710945730e-04 2.9302415384059610e-03 7.2376285916996522e-03 8.3193891338266737e-03 1.8838943207373636e-02 3.9444554827623702e-04 5.0638781595919037e-04 -7.6199406333468320e-03 -8.1213464365843431e-03 -9.3992340761235825e-03 -5.0723372890583852e-04 -1.4451023104199736e-02 -1.3125844502874941e-02 1.0752307616540441e-02 8.1781515547088516e-03 -2.2938497930473196e-04 1.3062027967885937e-03 2.3152522404530158e-02 1.0024678634876208e-02 -1.0192279510913064e-02 -6.3990381744707201e-03 -1.0267747165232407e-02 -8.2431035183581957e-04 -2.7141939573927562e-02 -4.2742327695239795e-03 7.9346442878696754e-03 2.0565171758385329e-03 6.9262119646162721e-03 3.9444554827623674e-04 3.0659476854618312e-02 1.5089077725254332e-02 -8.8637766578202170e-03 -1.6054667137097842e-02 -4.1427589078107587e-03 -6.9567071356464011e-04 -1.3816770390946613e-02 -2.1429252287962205e-02 1.4832258599282664e-02 6.4081710452350065e-03 -5.0206786718404650e-03 1.2958385743036310e-03 1.3788289011377509e-02 -1.0593756809138791e-03 -1.4320767816401436e-02 -4.1142940356862900e-03 -2.4957914582787153e-02 -9.2842591311030685e-04 -1.7538655359683648e-02 -3.0726186156388186e-03 9.8693092684133139e-03 5.2784108805522265e-03 2.0329737191980318e-02 5.0638781595919048e-04 1.5089077725254332e-02 3.8135431511857332e-02 -1.0558929814882403e-02 -5.0942288761025370e-03 -2.9253288646951419e-03 -7.7094560837923966e-04 1.0427845830486863e-02 1.3695972057751606e-02 -2.4326675700669490e-02 -1.0778806605861155e-02 5.1000757028444050e-03 -9.1088811590459059e-03 -2.0525840538230953e-02 3.5598574264794100e-03 2.2092101590913168e-02 5.4943465493640991e-03 7.4681519838292144e-03 3.3389963331755422e-03 1.3648787626628661e-02 -2.2808429119786731e-03 -2.6091574802098810e-02 -2.0016674868444193e-03 -1.2626491467707677e-02 -7.6199406333468337e-03 -8.8637766578202187e-03 -1.0558929814882403e-02 4.2486919979451553e-02 1.2599111282277137e-02 -4.3577929763358742e-03 3.5717501249890055e-03 6.9555782578766250e-03 6.5809786553167118e-03 -1.1692131374153557e-02 -1.0220323570929331e-02 2.9328029912063271e-03 -8.2878903385292680e-03 -2.2932131690466814e-02 3.5078019636895254e-03 5.4366055212859317e-03 2.5486888620197827e-03 6.2767512225364560e-03 1.4439304170870033e-02 1.6965844840781934e-02 -4.3057096355478370e-03 -7.9454029501549433e-03 -5.1009975754308622e-03 -7.4701961908965253e-03 -8.1213464365843448e-03 -1.6054667137097842e-02 -5.0942288761025387e-03 1.2599111282277134e-02 2.7838008013246523e-02 -2.4282001302021127e-03 5.2790444340808512e-03 -1.1425585997896750e-04 -5.2940000612601941e-03 4.2857822581374968e-03 2.2707717219881949e-03 -5.0585319282494554e-03 1.4341253381950747e-03 4.9871610985430534e-03 -7.0698047215090468e-03 7.0796979151765659e-03 5.2841574566308575e-03 -2.2329115867654697e-03 -2.1209168069806338e-03 -3.3834984176500322e-03 3.8259700411416471e-03 -2.2007060861498947e-03 -2.4733769615202365e-03 -2.7378711341973271e-03 -9.3992340761235825e-03 -4.1427589078107596e-03 -2.9253288646951432e-03 -4.3577929763358733e-03 -2.4282001302021123e-03 2.1492478255534991e-02 258 259 260 330 331 332 732 733 734 684 685 686 261 262 263 333 334 335 735 736 737 687 688 689 2.3720176411127353e-02 1.3593313306119565e-03 1.5363427890390698e-03 -1.0198450601933355e-02 -9.5333101612286465e-03 -1.0523715045147026e-02 -6.6530280530400360e-03 -1.8357109417127800e-03 -4.6701851587399124e-04 4.9001265351514669e-03 8.2144778998004160e-03 1.0431335964214798e-02 2.5045369838975918e-03 1.9375698218942802e-03 1.0751110321872074e-03 -9.5604041158262199e-03 -3.5853586518454924e-03 -6.6503914557069716e-03 -4.6296845014876589e-03 -8.6232876987078896e-04 -1.1694575681457031e-03 -8.3272657889146059e-05 4.3053294723510594e-03 5.7677927994326120e-03 1.3593313306119561e-03 3.6965846246006802e-02 1.6427047571277886e-02 -1.0455378918544790e-02 -1.8661753795067345e-02 -4.7750697415784756e-03 -1.7887942283050832e-03 -3.0327023055147343e-02 -5.3227397204493182e-03 9.2429826026457305e-03 4.4914041789060159e-03 7.7032680767592700e-03 1.3726836872707438e-03 2.2949627606851521e-02 1.3095600388460216e-02 -1.1213143020005166e-02 -7.3671493575861811e-03 -1.1461956274064537e-02 -4.8333888222636936e-04 -1.6564350245796389e-02 -1.5769208601833177e-02 1.1965657428552989e-02 8.5133984218328917e-03 1.0305830142812817e-04 1.5363427890390698e-03 1.6427047571277886e-02 4.3875970256538332e-02 -1.1210402898299401e-02 -4.9718278559380061e-03 -3.6893006583022963e-03 -1.3890122333345598e-03 -1.9709412719771339e-02 -3.8074851346633770e-03 1.0766293707745608e-02 7.7826652766718671e-03 2.3164996759354354e-02 7.5339638604708008e-04 1.1357842529146943e-02 -3.0840669850325498e-03 -1.4987461675190827e-02 -3.8373256060842973e-03 -2.7399825334657697e-02 -6.1845771827908811e-04 -1.4636646673073427e-02 -2.3827642308484359e-02 1.5149301642272135e-02 7.5876574777703617e-03 -5.2326465947524214e-03 -1.0198450601933357e-02 -1.0455378918544790e-02 -1.1210402898299403e-02 4.6716875954236889e-02 1.4364086644909705e-02 -5.3068709289848057e-03 7.2313935228875545e-03 1.8707818439617913e-02 -2.2955986916586256e-03 -3.0462766316721297e-02 -4.2293815436298303e-03 -1.4757344185572637e-02 -1.1018464176140766e-02 -2.2482737680196888e-02 3.6641433336773782e-03 2.4337724207813910e-02 5.3884927051938399e-03 8.8705281474452079e-03 7.3842932890641510e-04 1.2257959679578767e-02 1.6565407578923462e-02 -2.7344741919049360e-02 -1.3550859326928705e-02 4.4701376444694395e-03 -9.5333101612286465e-03 -1.8661753795067345e-02 -4.9718278559380069e-03 1.4364086644909705e-02 2.9630698909635669e-02 -3.0555451731540274e-03 1.4916117442834172e-02 2.1954069327143555e-02 -3.9188132770149493e-03 -9.4229257806519653e-03 -6.8284180169871159e-03 -8.3729536115834877e-03 -8.8588032242522680e-03 -2.6374493100793015e-02 4.0017891404698280e-03 6.3345326418907588e-03 2.4455775411898724e-03 6.4533356502042925e-03 4.4767810082448952e-03 9.6961672834294937e-03 7.4511727318233301e-03 -1.2276478571746659e-02 -1.1861848148551110e-02 2.4128423951930295e-03 -1.0523715045147024e-02 -4.7750697415784747e-03 -3.6893006583022963e-03 -5.3068709289848066e-03 -3.0555451731540265e-03 2.2641193048119408e-02 -2.0671498587589211e-03 -5.0266962087955362e-03 5.9817489729472257e-03 -2.1733857155413140e-03 -2.8183386130729285e-03 -2.7557866077048453e-03 2.1952300551859108e-03 5.9617630359814948e-03 -9.1155237714508498e-03 7.1983307748916901e-03 6.5585852975767016e-03 -2.7369912466538786e-03 5.5492740135656702e-03 1.0325126497633542e-04 -4.8043740406952997e-03 5.1282867047888012e-03 3.0520501380664334e-03 -5.5209656962594660e-03 -6.6530280530400360e-03 -1.7887942283050834e-03 -1.3890122333345609e-03 7.2313935228875545e-03 1.4916117442834172e-02 -2.0671498587589211e-03 2.3811551552061307e-02 4.1426928915610272e-03 -2.6401345445256147e-04 -9.7200550208347888e-03 -1.3901038023843657e-02 -4.3295791679058858e-04 -6.9406139968938791e-03 -3.2464219503988805e-03 6.1388036331413997e-04 -1.3468337734845377e-03 7.4044835404524735e-03 2.6294295803217719e-04 4.1708875355357337e-03 1.9243287991392419e-03 1.6661783015528744e-03 -1.0553301766231357e-02 -9.4513684714392920e-03 1.6101318404374424e-03 -1.8357109417127815e-03 -3.0327023055147340e-02 -1.9709412719771339e-02 1.8707818439617913e-02 2.1954069327143555e-02 -5.0266962087955362e-03 4.1426928915610263e-03 6.6720846929785638e-02 -5.5365124304835572e-03 -1.7736632951280744e-02 -8.2963795761306774e-03 -1.6399829229125838e-02 -2.5439487419903544e-03 -4.5087584204434851e-02 5.7250451713388587e-03 2.0905783172103221e-02 -5.0921487041263010e-03 2.0113527599593305e-02 1.3746153791328898e-03 2.6194959972990647e-02 1.5647183159224139e-02 -2.3014617247431195e-02 -2.6066740690080664e-02 5.1866946580199809e-03 -4.6701851587399124e-04 -5.3227397204493173e-03 -3.8074851346633770e-03 -2.2955986916586265e-03 -3.9188132770149493e-03 5.9817489729472257e-03 -2.6401345445256164e-04 -5.5365124304835563e-03 2.4127709632151186e-02 4.7560845051369685e-04 -1.2682288935022920e-02 -2.9381388909198959e-03 4.7937983436718254e-04 5.2740765242895119e-03 -7.5063531662625691e-03 -2.7045364351046303e-03 7.4308312207789461e-03 -7.4025939662021364e-03 1.0931216567455562e-03 1.1064883177405508e-02 -7.0407950122217578e-04 3.6830571554633765e-03 3.6905634404967745e-03 -7.7508079458282622e-03 4.9001265351514669e-03 9.2429826026457322e-03 1.0766293707745607e-02 -3.0462766316721294e-02 -9.4229257806519636e-03 -2.1733857155413136e-03 -9.7200550208347870e-03 -1.7736632951280744e-02 4.7560845051369653e-04 4.9244807748181962e-02 9.1797296245415020e-04 2.1956197043359965e-02 -3.5954059420933854e-03 2.0823407192463870e-02 -3.3046306982716352e-03 -2.6803776407993116e-02 1.0646644289722231e-03 -1.9344385013937163e-02 -8.6794386349357804e-03 -1.1668119997049607e-02 -1.6245894244920681e-02 2.5116508039244954e-02 6.7786515424463224e-03 7.8701964710515063e-03 8.2144778998004143e-03 4.4914041789060159e-03 7.7826652766718671e-03 -4.2293815436298295e-03 -6.8284180169871150e-03 -2.8183386130729293e-03 -1.3901038023843657e-02 -8.2963795761306774e-03 -1.2682288935022920e-02 9.1797296245415053e-04 2.6579773091860638e-02 7.0378585778105925e-04 7.3484800033010080e-03 -5.4542506803820319e-03 7.0489983402961896e-03 -8.1438091884436623e-04 -6.2799514800275201e-03 -8.4150603649674888e-04 -4.0814474071919921e-03 -7.6554482897093993e-03 -5.0935752695727629e-03 6.5453170279542693e-03 3.4432707724700883e-03 5.9002593794162447e-03 1.0431335964214798e-02 7.7032680767592700e-03 2.3164996759354354e-02 -1.4757344185572637e-02 -8.3729536115834877e-03 -2.7557866077048444e-03 -4.3295791679058879e-04 -1.6399829229125834e-02 -2.9381388909198954e-03 2.1956197043359972e-02 7.0378585778105773e-04 4.6600690062074526e-02 -4.6884260947969579e-04 1.9913129988954469e-02 -9.4413161651571986e-03 -1.9078301559424922e-02 9.3973952020653191e-04 -2.4755752605890285e-02 -6.4295678327122591e-03 -1.1739245771176859e-02 -2.7986234344948614e-02 8.7794810964053407e-03 7.2521051681848419e-03 -1.8884582068080689e-03 2.5045369838975914e-03 1.3726836872707438e-03 7.5339638604707954e-04 -1.1018464176140764e-02 -8.8588032242522680e-03 2.1952300551859108e-03 -6.9406139968938791e-03 -2.5439487419903544e-03 4.7937983436718254e-04 -3.5954059420933845e-03 7.3484800033010080e-03 -4.6884260947969688e-04 3.0065779368421013e-02 2.9824688424083942e-03 -2.1850270998908264e-04 -8.3005262377347719e-03 -1.5298913614596217e-02 7.0781329697910608e-04 -7.3512933183956771e-03 -1.2771469729434401e-03 -1.2712010735156250e-03 4.6359873189398756e-03 1.6275180020802131e-02 -2.1772731795948767e-03 1.9375698218942795e-03 2.2949627606851524e-02 1.1357842529146945e-02 -2.2482737680196888e-02 -2.6374493100793015e-02 5.9617630359814948e-03 -3.2464219503988805e-03 -4.5087584204434851e-02 5.2740765242895137e-03 2.0823407192463870e-02 -5.4542506803820336e-03 1.9913129988954472e-02 2.9824688424083929e-03 7.1193387016417559e-02 -6.1396416851263761e-03 -1.4231617280500288e-02 -6.3663802432474470e-03 -1.3254946589814614e-02 -1.0287227541701523e-03 -3.0705235877174424e-02 -1.9588669017821990e-02 1.5246053808499686e-02 1.9844929482762702e-02 -3.5235547856094594e-03 1.0751110321872077e-03 1.3095600388460216e-02 -3.0840669850325480e-03 3.6641433336773773e-03 4.0017891404698271e-03 -9.1155237714508498e-03 6.1388036331414019e-04 5.7250451713388596e-03 -7.5063531662625691e-03 -3.3046306982716356e-03 7.0489983402961896e-03 -9.4413161651571969e-03 -2.1850270998908256e-04 -6.1396416851263779e-03 3.0785392423419246e-02 3.8706283595963818e-04 -1.4377021707768263e-02 -2.0109230164145836e-03 5.9033769070103177e-05 -4.9913171322800206e-03 -4.1506077288417011e-03 -2.2760979259477511e-03 -4.3634525153904268e-03 4.5233984097402102e-03 -9.5604041158262182e-03 -1.1213143020005166e-02 -1.4987461675190829e-02 2.4337724207813907e-02 6.3345326418907571e-03 7.1983307748916901e-03 -1.3468337734845379e-03 2.0905783172103225e-02 -2.7045364351046312e-03 -2.6803776407993113e-02 -8.1438091884436623e-04 -1.9078301559424922e-02 -8.3005262377347719e-03 -1.4231617280500286e-02 3.8706283595963797e-04 4.7000586333373000e-02 -3.7529099379831563e-04 2.0621329498180817e-02 4.2836903035129801e-03 8.8844603957834375e-03 1.1271331540889646e-02 -2.9610460309661250e-02 -9.4903439966292774e-03 -2.7077549802013937e-03 -3.5853586518454932e-03 -7.3671493575861793e-03 -3.8373256060842973e-03 5.3884927051938416e-03 2.4455775411898724e-03 6.5585852975767033e-03 7.4044835404524735e-03 -5.0921487041263001e-03 7.4308312207789469e-03 1.0646644289722229e-03 -6.2799514800275201e-03 9.3973952020653148e-04 -1.5298913614596215e-02 -6.3663802432474487e-03 -1.4377021707768263e-02 -3.7529099379831569e-04 2.5705097314785014e-02 -4.6250316624871788e-04 8.2634663592707595e-03 3.4096992276661624e-03 6.4780563708356229e-03 -2.8615437736492755e-03 -6.4547442986536002e-03 -2.7303619292965279e-03 -6.6503914557069707e-03 -1.1461956274064537e-02 -2.7399825334657697e-02 8.8705281474452079e-03 6.4533356502042925e-03 -2.7369912466538790e-03 2.6294295803217736e-04 2.0113527599593305e-02 -7.4025939662021364e-03 -1.9344385013937170e-02 -8.4150603649674877e-04 -2.4755752605890285e-02 7.0781329697910641e-04 -1.3254946589814614e-02 -2.0109230164145832e-03 2.0621329498180817e-02 -4.6250316624871750e-04 4.4984120741554501e-02 9.6178784635717034e-03 7.9539765370947070e-03 2.3057826563183524e-02 -1.4085715894564881e-02 -8.4999277202676797e-03 -3.7358611349194437e-03 -4.6296845014876589e-03 -4.8333888222636980e-04 -6.1845771827908778e-04 7.3842932890641510e-04 4.4767810082448961e-03 5.5492740135656702e-03 4.1708875355357328e-03 1.3746153791328907e-03 1.0931216567455562e-03 -8.6794386349357804e-03 -4.0814474071919921e-03 -6.4295678327122600e-03 -7.3512933183956779e-03 -1.0287227541701523e-03 5.9033769070103393e-05 4.2836903035129792e-03 8.2634663592707595e-03 9.6178784635717017e-03 2.1017050230456046e-02 8.8208187166003349e-04 1.0967500016434450e-03 -9.5496409435920533e-03 -9.4034355747200649e-03 -1.0368032353605127e-02 -8.6232876987078896e-04 -1.6564350245796389e-02 -1.4636646673073425e-02 1.2257959679578765e-02 9.6961672834294920e-03 1.0325126497633496e-04 1.9243287991392423e-03 2.6194959972990647e-02 1.1064883177405508e-02 -1.1668119997049605e-02 -7.6554482897093993e-03 -1.1739245771176861e-02 -1.2771469729434407e-03 -3.0705235877174421e-02 -4.9913171322800197e-03 8.8844603957834410e-03 3.4096992276661628e-03 7.9539765370947053e-03 8.8208187166003284e-04 3.4488952653839416e-02 1.7028189535739511e-02 -1.0141235006297655e-02 -1.8864744725245509e-02 -4.7830909386857492e-03 -1.1694575681457028e-03 -1.5769208601833180e-02 -2.3827642308484359e-02 1.6565407578923465e-02 7.4511727318233301e-03 -4.8043740406952997e-03 1.6661783015528742e-03 1.5647183159224143e-02 -7.0407950122217567e-04 -1.6245894244920681e-02 -5.0935752695727646e-03 -2.7986234344948614e-02 -1.2712010735156257e-03 -1.9588669017821986e-02 -4.1506077288417020e-03 1.1271331540889646e-02 6.4780563708356229e-03 2.3057826563183521e-02 1.0967500016434452e-03 1.7028189535739514e-02 4.2543784947311904e-02 -1.1913114536427433e-02 -6.1531489083946709e-03 -4.1286735863032701e-03 -8.3272657889145191e-05 1.1965657428552989e-02 1.5149301642272135e-02 -2.7344741919049356e-02 -1.2276478571746659e-02 5.1282867047888012e-03 -1.0553301766231357e-02 -2.3014617247431191e-02 3.6830571554633765e-03 2.5116508039244950e-02 6.5453170279542710e-03 8.7794810964053442e-03 4.6359873189398739e-03 1.5246053808499679e-02 -2.2760979259477520e-03 -2.9610460309661250e-02 -2.8615437736492764e-03 -1.4085715894564877e-02 -9.5496409435920568e-03 -1.0141235006297652e-02 -1.1913114536427431e-02 4.7388922238238346e-02 1.4536846334117833e-02 -4.4651982419896047e-03 4.3053294723510594e-03 8.5133984218328934e-03 7.5876574777703617e-03 -1.3550859326928705e-02 -1.1861848148551108e-02 3.0520501380664339e-03 -9.4513684714392903e-03 -2.6066740690080664e-02 3.6905634404967745e-03 6.7786515424463224e-03 3.4432707724700888e-03 7.2521051681848419e-03 1.6275180020802131e-02 1.9844929482762695e-02 -4.3634525153904268e-03 -9.4903439966292774e-03 -6.4547442986535985e-03 -8.4999277202676780e-03 -9.4034355747200631e-03 -1.8864744725245512e-02 -6.1531489083946692e-03 1.4536846334117830e-02 3.1446479185465198e-02 -2.5658470804656459e-03 5.7677927994326120e-03 1.0305830142812861e-04 -5.2326465947524214e-03 4.4701376444694386e-03 2.4128423951930299e-03 -5.5209656962594651e-03 1.6101318404374426e-03 5.1866946580199809e-03 -7.7508079458282614e-03 7.8701964710515063e-03 5.9002593794162464e-03 -1.8884582068080691e-03 -2.1772731795948758e-03 -3.5235547856094594e-03 4.5233984097402110e-03 -2.7077549802013933e-03 -2.7303619292965283e-03 -3.7358611349194428e-03 -1.0368032353605127e-02 -4.7830909386857492e-03 -4.1286735863032675e-03 -4.4651982419896038e-03 -2.5658470804656463e-03 2.3734014755130720e-02 618 619 620 684 685 686 696 697 698 630 631 632 621 622 623 687 688 689 699 700 701 633 634 635 2.3286241270876164e-02 -1.9174439270625600e-03 -2.5569046811796440e-03 -5.9277193097585952e-03 -7.1347545492406106e-03 -9.7227216202054149e-03 -7.1089288255640586e-03 3.1978853423348793e-03 3.5627859200863116e-04 6.0848683706492745e-04 7.1174336896032255e-03 7.8302242787578261e-03 3.6626791843844468e-03 -2.0852116742722691e-03 -7.7703626099282354e-04 -5.2462303891589439e-03 -3.0701184107215719e-03 -3.3877921742106764e-03 -5.1546800975438645e-03 2.0013851611289956e-03 2.5595358151721732e-03 -4.1198486703000782e-03 1.8908243682299072e-03 5.6984160506499326e-03 -1.9174439270625604e-03 3.6327374803189337e-02 1.6473892614413083e-02 -8.1493188152597703e-03 -2.1703734181218327e-02 -6.8410350077422041e-03 2.4801744825498728e-03 -2.9592051727533264e-02 -6.1797190419260730e-03 7.9217823279696866e-03 7.5542438508191447e-03 9.3542595952826133e-03 -2.7443787758118661e-03 2.3344466573842593e-02 1.2871612598948919e-02 -1.0341138703281771e-02 -9.8302256657769073e-03 -1.2222213864930156e-02 2.6412355426022891e-03 -1.6478980587970621e-02 -1.5347621262276095e-02 1.0109087868294123e-02 1.0378906934648052e-02 1.8908243682299064e-03 -2.5569046811796444e-03 1.6473892614413083e-02 4.3246680991779494e-02 -1.0702406621958517e-02 -7.6554731089179592e-03 -5.4031273001124676e-03 1.6774820674318779e-03 -1.9386136463632506e-02 -5.9766667348674762e-03 7.9701385810197010e-03 9.5739108484758952e-03 2.2105030253926117e-02 -7.5655723860281810e-04 1.2092426865628041e-02 1.1478047701066378e-04 -1.2903388312812545e-02 -6.7000639083012658e-03 -2.6260445308503404e-02 3.2094447923972933e-03 -1.4507644715959391e-02 -2.3706403708932868e-02 1.4062191413704657e-02 1.0109087868294120e-02 -4.1198486703000782e-03 -5.9277193097585952e-03 -8.1493188152597720e-03 -1.0702406621958517e-02 4.1737592209089042e-02 1.6690792566370856e-02 -3.1995197684646531e-03 2.1449263071737661e-03 1.5144559168281696e-02 -7.1082587003148002e-04 -2.6763319768893616e-02 -7.9348879564690427e-03 -1.3422275897713446e-02 -6.0594910809365510e-03 -1.9100377410976612e-02 1.5873336611511081e-03 2.2055088842782455e-02 8.3965246968806424e-03 8.7760123281671633e-03 -3.4806734905236431e-03 1.0300329013448307e-02 1.5112146353677657e-02 -2.3706403708932865e-02 -1.5347621262276094e-02 2.5595358151721732e-03 -7.1347545492406097e-03 -2.1703734181218327e-02 -7.6554731089179592e-03 1.6690792566370856e-02 3.3996137233971845e-02 -2.4983380934988737e-03 1.1605141627655151e-02 2.5866887537862794e-02 -2.3731284431488509e-03 -1.2335028112605083e-02 -1.0575052670119454e-02 -1.0334161153705831e-02 -5.7972567026484774e-03 -2.9446447461184543e-02 2.6408925054823007e-03 9.6270843998448874e-03 6.5671306727447453e-03 7.9184941192119041e-03 1.8516654865826630e-03 1.1774059455913541e-02 1.0300329013448314e-02 -1.4507644715959396e-02 -1.6478980587970624e-02 2.0013851611289969e-03 -9.7227216202054167e-03 -6.8410350077422032e-03 -5.4031273001124694e-03 -3.1995197684646531e-03 -2.4983380934988733e-03 2.1271311469932011e-02 -4.9058666476456652e-04 -3.2077855357691776e-03 5.0482125933550273e-03 -2.9771368225760724e-03 -3.1567536588132960e-03 -4.6226856499357195e-03 8.0906062178157871e-04 4.0949076775043860e-03 -7.6665539914078876e-03 6.7612924922119001e-03 7.1161035891342131e-03 8.1964662365426738e-06 5.6101669696199379e-03 1.8516654865826637e-03 -3.4806734905236431e-03 3.2094447923972924e-03 2.6412355426022891e-03 -5.1546800975438628e-03 -7.1089288255640577e-03 2.4801744825498724e-03 1.6774820674318775e-03 2.1449263071737648e-03 1.1605141627655151e-02 -4.9058666476456641e-04 2.2494111980165394e-02 -2.3897093186211007e-03 3.6798644376940723e-04 -6.2773479744611194e-03 -1.2224900338060904e-02 1.1093573111004818e-03 -6.2051177283523355e-03 2.6245006535436217e-03 -1.0203993377164601e-04 -4.1191896174491852e-03 6.4576403780082815e-03 -2.2076519457427087e-03 5.0482125933550281e-03 -2.3731284431488522e-03 -7.1082587003147481e-04 -5.9766667348674840e-03 -6.1797190419260748e-03 3.5627859200863018e-04 3.1978853423348785e-03 -2.9592051727533264e-02 -1.9386136463632506e-02 1.5144559168281696e-02 2.5866887537862794e-02 -3.2077855357691776e-03 -2.3897093186211003e-03 6.2682848811739217e-02 -2.3897093186211055e-03 -1.4901099445633325e-02 -1.5581152674808611e-02 -1.4901099445633323e-02 2.8467329782061691e-03 -4.1645452157935817e-02 2.8467329782061760e-03 1.8695553274833358e-02 1.9940844003461353e-03 1.8695553274833365e-02 -3.2077855357691733e-03 2.5866887537862787e-02 1.5144559168281694e-02 -1.9386136463632513e-02 -2.9592051727533271e-02 3.1978853423348819e-03 3.5627859200863143e-04 -6.1797190419260739e-03 -5.9766667348674753e-03 -7.1082587003148002e-04 -2.3731284431488509e-03 5.0482125933550273e-03 3.6798644376940739e-04 -2.3897093186211059e-03 2.2494111980165390e-02 1.1093573111004877e-03 -1.2224900338060908e-02 -6.2773479744611159e-03 -1.0203993377164638e-04 2.6245006535436256e-03 -6.2051177283523364e-03 -2.2076519457427143e-03 6.4576403780082850e-03 -4.1191896174491895e-03 -4.9058666476456641e-04 1.1605141627655156e-02 2.1449263071737631e-03 1.6774820674318824e-03 2.4801744825498732e-03 -7.1089288255640620e-03 6.0848683706492832e-04 7.9217823279696883e-03 7.9701385810196992e-03 -2.6763319768893616e-02 -1.2335028112605083e-02 -2.9771368225760719e-03 -6.2773479744611194e-03 -1.4901099445633328e-02 1.1093573111004874e-03 4.3829865793162552e-02 4.9905399060784766e-03 1.9271027936135578e-02 -5.8976051781940760e-03 1.8232617175201953e-02 -2.6420619521431224e-03 -2.2982424312669072e-02 -2.9289102925884798e-03 -1.7139273434580948e-02 -4.6226856499357195e-03 -1.0334161153705826e-02 -1.3422275897713450e-02 2.2105030253926117e-02 9.3542595952826116e-03 7.8302242787578226e-03 7.1174336896032255e-03 7.5542438508191447e-03 9.5739108484758969e-03 -7.9348879564690410e-03 -1.0575052670119454e-02 -3.1567536588132960e-03 -1.2224900338060904e-02 -1.5581152674808614e-02 -1.2224900338060906e-02 4.9905399060784766e-03 2.6466948061492329e-02 4.9905399060784774e-03 6.1116639925788861e-03 1.5599060744104602e-03 6.1116639925788861e-03 -4.4770064833932416e-03 -6.4040838224935521e-03 -4.4770064833932425e-03 -3.1567536588132938e-03 -1.0575052670119453e-02 -7.9348879564690427e-03 9.5739108484758952e-03 7.5542438508191421e-03 7.1174336896032281e-03 7.8302242787578243e-03 9.3542595952826116e-03 2.2105030253926114e-02 -1.3422275897713448e-02 -1.0334161153705831e-02 -4.6226856499357195e-03 1.1093573111004814e-03 -1.4901099445633323e-02 -6.2773479744611151e-03 1.9271027936135578e-02 4.9905399060784766e-03 4.3829865793162552e-02 -2.6420619521431211e-03 1.8232617175201953e-02 -5.8976051781940795e-03 -1.7139273434580941e-02 -2.9289102925884802e-03 -2.2982424312669069e-02 -2.9771368225760711e-03 -1.2335028112605076e-02 -2.6763319768893613e-02 7.9701385810197027e-03 7.9217823279696883e-03 6.0848683706492875e-04 3.6626791843844468e-03 -2.7443787758118657e-03 -7.5655723860281821e-04 -6.0594910809365519e-03 -5.7972567026484756e-03 8.0906062178157892e-04 -6.2051177283523355e-03 2.8467329782061687e-03 -1.0203993377164629e-04 -5.8976051781940769e-03 6.1116639925788861e-03 -2.6420619521431207e-03 2.6844398540181263e-02 -2.9239864753795213e-03 4.0523815991024036e-04 -4.7930902226855279e-03 -1.3005280121376415e-02 1.4760629426674857e-03 -7.6665539914078885e-03 2.6408925054822981e-03 1.5873336611511041e-03 1.1478047701067627e-04 1.2871612598948923e-02 -7.7703626099282364e-04 -2.0852116742722691e-03 2.3344466573842593e-02 1.2092426865628040e-02 -1.9100377410976612e-02 -2.9446447461184536e-02 4.0949076775043869e-03 2.6245006535436217e-03 -4.1645452157935824e-02 2.6245006535436260e-03 1.8232617175201953e-02 1.5599060744104602e-03 1.8232617175201953e-02 -2.9239864753795217e-03 6.5109949168967923e-02 -2.9239864753795265e-03 -1.2934876811249590e-02 -1.2820441310758685e-02 -1.2934876811249597e-02 4.0949076775043843e-03 -2.9446447461184532e-02 -1.9100377410976612e-02 1.2092426865628045e-02 2.3344466573842603e-02 -2.0852116742722726e-03 -7.7703626099282386e-04 1.2871612598948921e-02 1.1478047701066459e-04 1.5873336611511074e-03 2.6408925054823003e-03 -7.6665539914078876e-03 -1.0203993377164587e-04 2.8467329782061760e-03 -6.2051177283523364e-03 -2.6420619521431215e-03 6.1116639925788861e-03 -5.8976051781940812e-03 4.0523815991024036e-04 -2.9239864753795256e-03 2.6844398540181263e-02 1.4760629426674872e-03 -1.3005280121376419e-02 -4.7930902226855253e-03 8.0906062178157795e-04 -5.7972567026484730e-03 -6.0594910809365493e-03 -7.5655723860282320e-04 -2.7443787758118653e-03 3.6626791843844537e-03 -5.2462303891589439e-03 -1.0341138703281769e-02 -1.2903388312812545e-02 2.2055088842782455e-02 9.6270843998448874e-03 6.7612924922119018e-03 -4.1191896174491852e-03 1.8695553274833358e-02 -2.2076519457427148e-03 -2.2982424312669072e-02 -4.4770064833932416e-03 -1.7139273434580944e-02 -4.7930902226855296e-03 -1.2934876811249590e-02 1.4760629426674885e-03 4.1338094541447108e-02 3.7341040689645986e-03 1.8624738104300327e-02 8.1964662365452759e-06 7.9184941192118972e-03 8.7760123281671546e-03 -2.6260445308503390e-02 -1.2222213864930151e-02 -3.3877921742106760e-03 -3.0701184107215719e-03 -9.8302256657769056e-03 -6.7000639083012676e-03 8.3965246968806424e-03 6.5671306727447453e-03 7.1161035891342131e-03 6.4576403780082815e-03 1.9940844003461353e-03 6.4576403780082850e-03 -2.9289102925884798e-03 -6.4040838224935521e-03 -2.9289102925884802e-03 -1.3005280121376413e-02 -1.2820441310758686e-02 -1.3005280121376419e-02 3.7341040689645982e-03 2.3756630718970422e-02 3.7341040689646012e-03 7.1161035891342071e-03 6.5671306727447462e-03 8.3965246968806459e-03 -6.7000639083012658e-03 -9.8302256657769038e-03 -3.0701184107215745e-03 -3.3877921742106760e-03 -1.2222213864930158e-02 -2.6260445308503404e-02 8.7760123281671633e-03 7.9184941192119041e-03 8.1964662365433785e-06 -2.2076519457427100e-03 1.8695553274833368e-02 -4.1191896174491895e-03 -1.7139273434580948e-02 -4.4770064833932425e-03 -2.2982424312669079e-02 1.4760629426674859e-03 -1.2934876811249598e-02 -4.7930902226855261e-03 1.8624738104300334e-02 3.7341040689646008e-03 4.1338094541447115e-02 6.7612924922118992e-03 9.6270843998448874e-03 2.2055088842782469e-02 -1.2903388312812554e-02 -1.0341138703281776e-02 -5.2462303891589405e-03 -5.1546800975438645e-03 2.6412355426022895e-03 3.2094447923972933e-03 -3.4806734905236431e-03 1.8516654865826630e-03 5.6101669696199379e-03 5.0482125933550273e-03 -3.2077855357691733e-03 -4.9058666476456663e-04 -4.6226856499357195e-03 -3.1567536588132943e-03 -2.9771368225760711e-03 -7.6665539914078885e-03 4.0949076775043843e-03 8.0906062178157806e-04 8.1964662365446254e-06 7.1161035891342071e-03 6.7612924922118992e-03 2.1271311469932018e-02 -2.4983380934988733e-03 -3.1995197684646553e-03 -5.4031273001124772e-03 -6.8410350077422024e-03 -9.7227216202054149e-03 2.0013851611289956e-03 -1.6478980587970617e-02 -1.4507644715959391e-02 1.0300329013448307e-02 1.1774059455913543e-02 1.8516654865826634e-03 -2.3731284431488513e-03 2.5866887537862787e-02 1.1605141627655156e-02 -1.0334161153705824e-02 -1.0575052670119454e-02 -1.2335028112605079e-02 2.6408925054822981e-03 -2.9446447461184529e-02 -5.7972567026484730e-03 7.9184941192118972e-03 6.5671306727447462e-03 9.6270843998448874e-03 -2.4983380934988720e-03 3.3996137233971838e-02 1.6690792566370852e-02 -7.6554731089179514e-03 -2.1703734181218331e-02 -7.1347545492406097e-03 2.5595358151721728e-03 -1.5347621262276094e-02 -2.3706403708932868e-02 1.5112146353677658e-02 1.0300329013448314e-02 -3.4806734905236431e-03 -7.1082587003147471e-04 1.5144559168281696e-02 2.1449263071737614e-03 -1.3422275897713446e-02 -7.9348879564690444e-03 -2.6763319768893613e-02 1.5873336611511041e-03 -1.9100377410976612e-02 -6.0594910809365484e-03 8.7760123281671563e-03 8.3965246968806459e-03 2.2055088842782469e-02 -3.1995197684646553e-03 1.6690792566370852e-02 4.1737592209089042e-02 -1.0702406621958517e-02 -8.1493188152597720e-03 -5.9277193097586021e-03 -4.1198486703000782e-03 1.0109087868294123e-02 1.4062191413704657e-02 -2.3706403708932865e-02 -1.4507644715959398e-02 3.2094447923972924e-03 -5.9766667348674840e-03 -1.9386136463632506e-02 1.6774820674318822e-03 2.2105030253926121e-02 9.5739108484758934e-03 7.9701385810197027e-03 1.1478047701067693e-04 1.2092426865628041e-02 -7.5655723860282341e-04 -2.6260445308503390e-02 -6.7000639083012667e-03 -1.2903388312812554e-02 -5.4031273001124772e-03 -7.6554731089179540e-03 -1.0702406621958517e-02 4.3246680991779508e-02 1.6473892614413087e-02 -2.5569046811796444e-03 1.8908243682299068e-03 1.0378906934648050e-02 1.0109087868294122e-02 -1.5347621262276094e-02 -1.6478980587970621e-02 2.6412355426022891e-03 -6.1797190419260748e-03 -2.9592051727533271e-02 2.4801744825498732e-03 9.3542595952826133e-03 7.5542438508191439e-03 7.9217823279696883e-03 1.2871612598948923e-02 2.3344466573842596e-02 -2.7443787758118653e-03 -1.2222213864930151e-02 -9.8302256657769038e-03 -1.0341138703281776e-02 -6.8410350077422024e-03 -2.1703734181218327e-02 -8.1493188152597703e-03 1.6473892614413080e-02 3.6327374803189337e-02 -1.9174439270625582e-03 5.6984160506499326e-03 1.8908243682299072e-03 -4.1198486703000773e-03 2.5595358151721732e-03 2.0013851611289969e-03 -5.1546800975438628e-03 3.5627859200863013e-04 3.1978853423348811e-03 -7.1089288255640603e-03 7.8302242787578226e-03 7.1174336896032281e-03 6.0848683706492810e-04 -7.7703626099282419e-04 -2.0852116742722721e-03 3.6626791843844533e-03 -3.3877921742106768e-03 -3.0701184107215745e-03 -5.2462303891589405e-03 -9.7227216202054149e-03 -7.1347545492406097e-03 -5.9277193097586030e-03 -2.5569046811796444e-03 -1.9174439270625582e-03 2.3286241270876164e-02 684 685 686 732 733 734 744 745 746 696 697 698 687 688 689 735 736 737 747 748 749 699 700 701 2.6054103325006735e-02 -2.1349506011828930e-03 -2.8235157760532364e-03 -6.7646339440972760e-03 -7.9733987834870474e-03 -1.0864298827663181e-02 -7.8353550836488522e-03 3.5958024564192127e-03 4.4551101996469146e-04 6.7082155310935275e-04 7.9347634901028516e-03 8.6971019990062983e-03 4.2266956892836292e-03 -2.3319865253675965e-03 -8.5508077193669212e-04 -6.0711846434797091e-03 -3.4639974521319147e-03 -3.8205353332575521e-03 -5.7547085893108283e-03 2.2387953084248222e-03 2.8735304491456391e-03 -4.5257383068630476e-03 2.1349721072225661e-03 6.3472872407940306e-03 -2.1349506011828939e-03 4.0738016513986994e-02 1.8472250944829325e-02 -9.2372573871779759e-03 -2.4440593371805722e-02 -7.7575963956966615e-03 2.7519496124521520e-03 -3.2979989985555430e-02 -6.8494933714761622e-03 8.9980839896821301e-03 8.5166405155558990e-03 1.0661210942114589e-02 -2.9828849352496857e-03 2.6250306615213919e-02 1.4456542925340925e-02 -1.1595394012985583e-02 -1.1357502317148610e-02 -1.3824586878632642e-02 2.8685189375823013e-03 -1.8480932571957105e-02 -1.7293300273701961e-02 1.1331934396879552e-02 1.1754054601710041e-02 2.1349721072225665e-03 -2.8235157760532360e-03 1.8472250944829322e-02 4.8283771747031287e-02 -1.1964881255184162e-02 -8.5070988029071325e-03 -6.2572654415980903e-03 1.8540462619076070e-03 -2.1572816842663042e-02 -6.5298139368188731e-03 9.0201834521475618e-03 1.0737385533860784e-02 2.4742625020943189e-02 -7.9947479700233652e-04 1.3326196200938844e-02 3.3199838843409464e-04 -1.4413770701743411e-02 -7.6386309828743179e-03 -2.9529399902501544e-02 3.4570456659087736e-03 -1.6149220448064029e-02 -2.6516177568627033e-02 1.5670367150019193e-02 1.1331934396879552e-02 -4.5257383068630485e-03 -6.7646339440972742e-03 -9.2372573871779776e-03 -1.1964881255184160e-02 4.6816933482930506e-02 1.8690114999973317e-02 -3.4728102419393182e-03 2.2766241489694723e-03 1.7003174919886520e-02 -8.3409477439170328e-04 -3.0036644645925845e-02 -9.0131237429464123e-03 -1.5140916341943977e-02 -6.9067052945383407e-03 -2.1304041611237338e-02 1.7780552790055031e-03 2.4894920058482328e-02 9.6044448230656956e-03 9.8112917291050417e-03 -3.7643162371938208e-03 1.1549988272138174e-02 1.6949825156202997e-02 -2.6516177568627029e-02 -1.7293300273701965e-02 2.8735304491456404e-03 -7.9733987834870474e-03 -2.4440593371805722e-02 -8.5070988029071308e-03 1.8690114999973317e-02 3.8071973236587606e-02 -2.6969742973952391e-03 1.2842626057646606e-02 2.8765538269557547e-02 -2.6309741472310185e-03 -1.3823928322555155e-02 -1.1895093122513002e-02 -1.1621291271731423e-02 -6.5118392952727665e-03 -3.2908720591481817e-02 2.9087162578632468e-03 1.0783666214525159e-02 7.7088218099343611e-03 8.7588386808385918e-03 2.1419795772339135e-03 1.3179006341678141e-02 1.1549988272138167e-02 -1.6149220448064026e-02 -1.8480932571957098e-02 2.2387953084248217e-03 -1.0864298827663179e-02 -7.7575963956966615e-03 -6.2572654415980903e-03 -3.4728102419393178e-03 -2.6969742973952382e-03 2.3796930447831492e-02 -5.6394959242825121e-04 -3.4689833905104050e-03 5.5536477993759345e-03 -3.3996396982494204e-03 -3.5396980389924551e-03 -5.2355779946092820e-03 8.6980973173420928e-04 4.4168771858374960e-03 -8.6227559793311693e-03 7.7143230890651827e-03 8.0358764219410489e-03 2.8404599483576056e-04 6.2595198735720097e-03 2.1419795772339143e-03 -3.7643162371938186e-03 3.4570456659087701e-03 2.8685189375823004e-03 -5.7547085893108248e-03 -7.8353550836488539e-03 2.7519496124521507e-03 1.8540462619076070e-03 2.2766241489694736e-03 1.2842626057646606e-02 -5.6394959242825143e-04 2.4672511352518092e-02 -2.7215337597174985e-03 4.0543958543494114e-04 -6.6623658862555524e-03 -1.3515986666685804e-02 1.3016353085503578e-03 -6.8848141760594686e-03 2.9310756250781420e-03 -1.1104969921684526e-04 -4.5904342180807618e-03 7.1923366499335754e-03 -2.4975381098208049e-03 5.5536477993759336e-03 -2.6309741472310172e-03 -8.3409477439169797e-04 -6.5298139368188618e-03 -6.8494933714761588e-03 4.4551101996469027e-04 3.5958024564192118e-03 -3.2979989985555430e-02 -2.1572816842663042e-02 1.7003174919886520e-02 2.8765538269557547e-02 -3.4689833905104058e-03 -2.7215337597174989e-03 6.9312351486016457e-02 -2.7215337597174972e-03 -1.6816353608788574e-02 -1.7199527512508840e-02 -1.6816353608788574e-02 3.1344082021323759e-03 -4.6242461440756451e-02 3.1344082021323716e-03 2.0846302023241434e-02 2.5585408992445970e-03 2.0846302023241444e-02 -3.4689833905104106e-03 2.8765538269557554e-02 1.7003174919886527e-02 -2.1572816842663049e-02 -3.2979989985555423e-02 3.5958024564192084e-03 4.4551101996469168e-04 -6.8494933714761614e-03 -6.5298139368188740e-03 -8.3409477439170317e-04 -2.6309741472310181e-03 5.5536477993759336e-03 4.0543958543494131e-04 -2.7215337597174972e-03 2.4672511352518092e-02 1.3016353085503749e-03 -1.3515986666685803e-02 -6.6623658862555559e-03 -1.1104969921684764e-04 2.9310756250781446e-03 -6.8848141760594677e-03 -2.4975381098208084e-03 7.1923366499335754e-03 -4.5904342180807627e-03 -5.6394959242825620e-04 1.2842626057646602e-02 2.2766241489694762e-03 1.8540462619076076e-03 2.7519496124521559e-03 -7.8353550836488418e-03 6.7082155310935491e-04 8.9980839896821319e-03 9.0201834521475635e-03 -3.0036644645925842e-02 -1.3823928322555155e-02 -3.3996396982494208e-03 -6.6623658862555524e-03 -1.6816353608788574e-02 1.3016353085503751e-03 4.8861250048653028e-02 5.6924334351977374e-03 2.1693779295549196e-02 -6.4935083442998233e-03 2.0375932023166059e-02 -2.9132818713807863e-03 -2.5846599751615070e-02 -3.4660871870853651e-03 -1.9258862143679265e-02 -5.2355779946092855e-03 -1.1621291271731433e-02 -1.5140916341943977e-02 2.4742625020943185e-02 1.0661210942114592e-02 8.6971019990062948e-03 7.9347634901028499e-03 8.5166405155558973e-03 1.0737385533860782e-02 -9.0131237429464123e-03 -1.1895093122512999e-02 -3.5396980389924555e-03 -1.3515986666685804e-02 -1.7199527512508844e-02 -1.3515986666685803e-02 5.6924334351977374e-03 2.9309209958904757e-02 5.6924334351977357e-03 6.8377979098082397e-03 1.9296892337684344e-03 6.8377979098082397e-03 -5.1335719203449469e-03 -7.2824664662501379e-03 -5.1335719203449495e-03 -3.5396980389924525e-03 -1.1895093122513009e-02 -9.0131237429464089e-03 1.0737385533860784e-02 8.5166405155558938e-03 7.9347634901028516e-03 8.6971019990062966e-03 1.0661210942114589e-02 2.4742625020943189e-02 -1.5140916341943977e-02 -1.1621291271731423e-02 -5.2355779946092820e-03 1.3016353085503589e-03 -1.6816353608788578e-02 -6.6623658862555559e-03 2.1693779295549193e-02 5.6924334351977366e-03 4.8861250048653021e-02 -2.9132818713807794e-03 2.0375932023166052e-02 -6.4935083442998233e-03 -1.9258862143679254e-02 -3.4660871870853629e-03 -2.5846599751615077e-02 -3.3996396982494226e-03 -1.3823928322555161e-02 -3.0036644645925849e-02 9.0201834521475704e-03 8.9980839896821319e-03 6.7082155310935004e-04 4.2266956892836292e-03 -2.9828849352496857e-03 -7.9947479700233685e-04 -6.9067052945383416e-03 -6.5118392952727665e-03 8.6980973173420939e-04 -6.8848141760594686e-03 3.1344082021323759e-03 -1.1104969921684774e-04 -6.4935083442998233e-03 6.8377979098082397e-03 -2.9132818713807794e-03 3.0287425598485622e-02 -3.1577191921363613e-03 4.5773002481197880e-04 -5.9383358819745380e-03 -1.4685021872485974e-02 1.5732921039849637e-03 -8.6227559793311676e-03 2.9087162578632490e-03 1.7780552790055003e-03 3.3199838843408613e-04 1.4456542925340925e-02 -8.5508077193668724e-04 -2.3319865253675970e-03 2.6250306615213916e-02 1.3326196200938847e-02 -2.1304041611237338e-02 -3.2908720591481824e-02 4.4168771858374969e-03 2.9310756250781412e-03 -4.6242461440756451e-02 2.9310756250781446e-03 2.0375932023166055e-02 1.9296892337684352e-03 2.0375932023166052e-02 -3.1577191921363613e-03 7.2809708527707434e-02 -3.1577191921363578e-03 -1.4256333706279260e-02 -1.5180108368183622e-02 -1.4256333706279267e-02 4.4168771858374986e-03 -3.2908720591481831e-02 -2.1304041611237338e-02 1.3326196200938851e-02 2.6250306615213909e-02 -2.3319865253675961e-03 -8.5508077193669212e-04 1.4456542925340928e-02 3.3199838843409480e-04 1.7780552790055040e-03 2.9087162578632464e-03 -8.6227559793311693e-03 -1.1104969921684526e-04 3.1344082021323716e-03 -6.8848141760594686e-03 -2.9132818713807846e-03 6.8377979098082397e-03 -6.4935083442998233e-03 4.5773002481197880e-04 -3.1577191921363583e-03 3.0287425598485629e-02 1.5732921039849680e-03 -1.4685021872485975e-02 -5.9383358819745380e-03 8.6980973173421427e-04 -6.5118392952727665e-03 -6.9067052945383407e-03 -7.9947479700234010e-04 -2.9828849352496849e-03 4.2266956892836197e-03 -6.0711846434797108e-03 -1.1595394012985582e-02 -1.4413770701743409e-02 2.4894920058482328e-02 1.0783666214525161e-02 7.7143230890651844e-03 -4.5904342180807618e-03 2.0846302023241437e-02 -2.4975381098208092e-03 -2.5846599751615074e-02 -5.1335719203449461e-03 -1.9258862143679254e-02 -5.9383358819745380e-03 -1.4256333706279257e-02 1.5732921039849682e-03 4.6796988344333545e-02 4.4210795996372570e-03 2.0891799366345856e-02 2.8404599483575709e-04 8.7588386808385918e-03 9.8112917291050313e-03 -2.9529399902501544e-02 -1.3824586878632640e-02 -3.8205353332575508e-03 -3.4639974521319147e-03 -1.1357502317148610e-02 -7.6386309828743179e-03 9.6044448230656956e-03 7.7088218099343603e-03 8.0358764219410472e-03 7.1923366499335754e-03 2.5585408992445978e-03 7.1923366499335754e-03 -3.4660871870853646e-03 -7.2824664662501379e-03 -3.4660871870853625e-03 -1.4685021872485974e-02 -1.5180108368183624e-02 -1.4685021872485975e-02 4.4210795996372570e-03 2.7201394949617663e-02 4.4210795996372570e-03 8.0358764219410454e-03 7.7088218099343585e-03 9.6044448230656922e-03 -7.6386309828743179e-03 -1.1357502317148608e-02 -3.4639974521319121e-03 -3.8205353332575530e-03 -1.3824586878632642e-02 -2.9529399902501544e-02 9.8112917291050417e-03 8.7588386808385918e-03 2.8404599483576403e-04 -2.4975381098208053e-03 2.0846302023241441e-02 -4.5904342180807618e-03 -1.9258862143679265e-02 -5.1335719203449495e-03 -2.5846599751615077e-02 1.5732921039849628e-03 -1.4256333706279267e-02 -5.9383358819745389e-03 2.0891799366345859e-02 4.4210795996372579e-03 4.6796988344333552e-02 7.7143230890651809e-03 1.0783666214525180e-02 2.4894920058482331e-02 -1.4413770701743421e-02 -1.1595394012985594e-02 -6.0711846434797091e-03 -5.7547085893108283e-03 2.8685189375823013e-03 3.4570456659087740e-03 -3.7643162371938203e-03 2.1419795772339143e-03 6.2595198735720080e-03 5.5536477993759353e-03 -3.4689833905104106e-03 -5.6394959242825587e-04 -5.2355779946092846e-03 -3.5396980389924525e-03 -3.3996396982494226e-03 -8.6227559793311693e-03 4.4168771858374978e-03 8.6980973173421384e-04 2.8404599483575666e-04 8.0358764219410454e-03 7.7143230890651801e-03 2.3796930447831492e-02 -2.6969742973952451e-03 -3.4728102419393199e-03 -6.2572654415980773e-03 -7.7575963956966554e-03 -1.0864298827663181e-02 2.2387953084248222e-03 -1.8480932571957105e-02 -1.6149220448064033e-02 1.1549988272138174e-02 1.3179006341678141e-02 2.1419795772339148e-03 -2.6309741472310172e-03 2.8765538269557554e-02 1.2842626057646600e-02 -1.1621291271731433e-02 -1.1895093122513006e-02 -1.3823928322555161e-02 2.9087162578632494e-03 -3.2908720591481831e-02 -6.5118392952727665e-03 8.7588386808385935e-03 7.7088218099343594e-03 1.0783666214525180e-02 -2.6969742973952443e-03 3.8071973236587613e-02 1.8690114999973327e-02 -8.5070988029071429e-03 -2.4440593371805711e-02 -7.9733987834870457e-03 2.8735304491456395e-03 -1.7293300273701961e-02 -2.6516177568627033e-02 1.6949825156202993e-02 1.1549988272138167e-02 -3.7643162371938186e-03 -8.3409477439169786e-04 1.7003174919886527e-02 2.2766241489694744e-03 -1.5140916341943977e-02 -9.0131237429464106e-03 -3.0036644645925849e-02 1.7780552790055003e-03 -2.1304041611237341e-02 -6.9067052945383399e-03 9.8112917291050313e-03 9.6044448230656922e-03 2.4894920058482331e-02 -3.4728102419393208e-03 1.8690114999973327e-02 4.6816933482930520e-02 -1.1964881255184164e-02 -9.2372573871779828e-03 -6.7646339440972664e-03 -4.5257383068630485e-03 1.1331934396879552e-02 1.5670367150019196e-02 -2.6516177568627029e-02 -1.6149220448064026e-02 3.4570456659087706e-03 -6.5298139368188618e-03 -2.1572816842663049e-02 1.8540462619076076e-03 2.4742625020943185e-02 1.0737385533860786e-02 9.0201834521475704e-03 3.3199838843408548e-04 1.3326196200938851e-02 -7.9947479700233966e-04 -2.9529399902501537e-02 -7.6386309828743171e-03 -1.4413770701743423e-02 -6.2572654415980781e-03 -8.5070988029071447e-03 -1.1964881255184164e-02 4.8283771747031266e-02 1.8472250944829335e-02 -2.8235157760532351e-03 2.1349721072225656e-03 1.1754054601710043e-02 1.1331934396879552e-02 -1.7293300273701961e-02 -1.8480932571957098e-02 2.8685189375823004e-03 -6.8494933714761570e-03 -3.2979989985555416e-02 2.7519496124521568e-03 1.0661210942114590e-02 8.5166405155558938e-03 8.9980839896821319e-03 1.4456542925340921e-02 2.6250306615213909e-02 -2.9828849352496857e-03 -1.3824586878632642e-02 -1.1357502317148606e-02 -1.1595394012985592e-02 -7.7575963956966554e-03 -2.4440593371805711e-02 -9.2372573871779811e-03 1.8472250944829332e-02 4.0738016513986980e-02 -2.1349506011828934e-03 6.3472872407940297e-03 2.1349721072225674e-03 -4.5257383068630485e-03 2.8735304491456408e-03 2.2387953084248213e-03 -5.7547085893108257e-03 4.4551101996469005e-04 3.5958024564192084e-03 -7.8353550836488400e-03 8.6971019990062931e-03 7.9347634901028516e-03 6.7082155310935047e-04 -8.5508077193668735e-04 -2.3319865253675961e-03 4.2266956892836206e-03 -3.8205353332575495e-03 -3.4639974521319121e-03 -6.0711846434797091e-03 -1.0864298827663182e-02 -7.9733987834870457e-03 -6.7646339440972656e-03 -2.8235157760532342e-03 -2.1349506011828934e-03 2.6054103325006718e-02 630 631 632 696 697 698 708 709 710 642 643 644 633 634 635 699 700 701 711 712 713 645 646 647 2.6704624405859526e-02 -5.2692865225840799e-03 -6.9555028649451907e-03 -3.2968646284809678e-03 -3.7453736435138717e-03 -8.9088867575334938e-03 -9.7562339854359668e-03 8.2501649781994545e-03 1.6314734973423774e-03 -2.7092797213601918e-03 5.0609873708102743e-03 5.2186029183569358e-03 6.5646542691845961e-03 -6.1682761547706992e-03 -2.9207090891788211e-03 -2.3763963909747953e-03 -1.3271775956210409e-03 -5.2098568629546866e-05 -7.5648495252748429e-03 4.8592138020009529e-03 6.5546239853444474e-03 -7.5656544235173564e-03 -1.6602522345209871e-03 5.4324968792432930e-03 -5.2692865225840791e-03 3.7691078038907984e-02 1.6785995737771842e-02 -5.0096908108374257e-03 -2.5979716711500660e-02 -9.5151118816618994e-03 6.6455080575727483e-03 -2.9362460638713211e-02 -6.7515860688905542e-03 5.8571068690502423e-03 1.0765496803299940e-02 1.1548667623529770e-02 -6.8293105127261245e-03 2.4002760048621983e-02 1.3240623215510169e-02 -8.8761628712649785e-03 -1.3232491800290180e-02 -1.3599112491105882e-02 5.6852368613347637e-03 -1.6422725241729118e-02 -1.5375842895269035e-02 7.7965989294548560e-03 1.2538059501403251e-02 3.6663667601155893e-03 -6.9555028649451907e-03 1.6785995737771838e-02 4.5641269099317067e-02 -9.9227817987014647e-03 -1.0616150686668808e-02 -7.8325207444143955e-03 5.0162675236059689e-03 -1.9518770910345016e-02 -7.6119367951983825e-03 5.2651212491850253e-03 1.1652483940933754e-02 2.2990346496367994e-02 -2.7277307320399376e-03 1.2720821978327667e-02 2.5636236350192968e-03 -1.0973902634909658e-02 -9.9010794108222774e-03 -2.7544767930344695e-02 7.1791667064453552e-03 -1.4366935998106449e-02 -2.4868673839712821e-02 1.3119362551359901e-02 1.3243635348909287e-02 -3.3373399210340667e-03 -3.2968646284809678e-03 -5.0096908108374248e-03 -9.9227817987014647e-03 3.9195784044889562e-02 1.8722518821388406e-02 -1.5781094134484680e-03 -1.7692224547739270e-03 1.1129304451727797e-02 -9.7332777503751522e-05 -2.3882795968436125e-02 -1.0956360164892202e-02 -1.2869033359456297e-02 -2.7806156829173747e-03 -1.5622127076529985e-02 5.1149783043871874e-04 2.0159463482394082e-02 1.1083152832319365e-02 8.7473137062481741e-03 -6.9166303731480637e-03 7.7634446737989615e-03 1.3958321438165163e-02 -2.0709118419527203e-02 -1.7110242726974915e-02 1.2501243742579261e-03 -3.7453736435138717e-03 -2.5979716711500653e-02 -1.0616150686668808e-02 1.8722518821388409e-02 4.2709787758996191e-02 -1.5860416793416761e-03 7.4422277828132136e-03 3.0800632494484923e-02 -1.1942027700811704e-03 -1.4705461336032693e-02 -1.6332407445250895e-02 -1.3409750912838867e-02 -1.7096840017531527e-03 -3.4256222925689174e-02 1.4771955642708483e-03 1.2321816169539028e-02 1.2507532500209697e-02 1.0206485588674104e-02 -1.9587621474215448e-03 1.3961813552096903e-02 1.3707877652587328e-02 -1.6367281645019393e-02 -2.3411419223346983e-02 1.4145872433982407e-03 -8.9088867575334938e-03 -9.5151118816618994e-03 -7.8325207444143955e-03 -1.5781094134484682e-03 -1.5860416793416756e-03 2.2316161861432940e-02 1.7859837221640809e-04 -1.6460224614654460e-03 4.9496811684754801e-03 -3.7231660585918115e-03 -4.2977701770305736e-03 -6.6755304715569140e-03 9.9942630690095201e-05 2.5395394207947293e-03 -7.5554894062371770e-03 6.8486516229722500e-03 8.7917385573063733e-03 2.5459131605240779e-03 5.3958519502972264e-03 3.7537007089515177e-03 -2.3438571441581559e-03 1.6871176533977937e-03 1.9599675124469776e-03 -5.4043584240658516e-03 -9.7562339854359650e-03 6.6455080575727465e-03 5.0162675236059698e-03 -1.7692224547739277e-03 7.4422277828132136e-03 1.7859837221640814e-04 2.4689363122060722e-02 -8.7439980355772350e-03 3.7855366744699883e-04 -3.4551022715649626e-03 -9.4770271678712766e-03 3.1357900132047518e-03 -7.8480369856388215e-03 8.2536494315172577e-03 -1.8181211412558772e-04 -6.8754629166522729e-03 4.2962885974401266e-03 -5.1279711735447969e-03 7.6214640086023806e-03 -6.5533178451960290e-03 -3.2944294822930074e-03 -2.6067685165971598e-03 -1.8633308206988072e-03 -1.0499680651073554e-04 8.2501649781994545e-03 -2.9362460638713214e-02 -1.9518770910345016e-02 1.1129304451727797e-02 3.0800632494484923e-02 -1.6460224614654455e-03 -8.7439980355772350e-03 6.1286914220916193e-02 -7.9100227081301325e-04 -1.1766476883636101e-02 -2.2185340748580105e-02 -1.4998345225814742e-02 8.1721787792906272e-03 -3.9910433941342298e-02 1.1691986501979879e-03 1.6300506413627670e-02 8.2629753891036526e-03 1.8687839576683560e-02 -7.5855572350084412e-03 2.5461624679395549e-02 1.5296057920183570e-02 -1.5756122468623773e-02 -3.4353911455264695e-02 1.8010447213730948e-03 1.6314734973423770e-03 -6.7515860688905516e-03 -7.6119367951983825e-03 -9.7332777503751630e-05 -1.1942027700811706e-03 4.9496811684754801e-03 3.7855366744699877e-04 -7.9100227081301379e-04 2.2725906580490150e-02 2.6660990605748940e-03 -1.2623387731540515e-02 -8.4161019490238357e-03 -2.1088394646402950e-04 1.3024391426018716e-03 -5.9192664523511820e-03 -2.5461456193293279e-03 6.3473084190150634e-03 -2.3529024532605745e-03 -2.4653231058249479e-03 1.2072753265037045e-02 3.8472267206352351e-03 6.4355922375778588e-04 1.6376780146712686e-03 -7.2226068197668927e-03 -2.7092797213601927e-03 5.8571068690502423e-03 5.2651212491850244e-03 -2.3882795968436125e-02 -1.4705461336032693e-02 -3.7231660585918128e-03 -3.4551022715649644e-03 -1.1766476883636103e-02 2.6660990605748931e-03 4.0731069686696410e-02 8.0572466679422524e-03 1.7771624004310097e-02 -8.2662027813661387e-03 1.5628487937392035e-02 -2.7873220180236963e-03 -2.0068810167618086e-02 -6.1234164892234053e-03 -1.5898240887650940e-02 -1.7983427308652642e-03 -8.5066965705391864e-03 -1.1061602288901396e-02 1.9449463954514364e-02 1.1559209805046849e-02 7.7674869390978278e-03 5.0609873708102743e-03 1.0765496803299940e-02 1.1652483940933754e-02 -1.0956360164892201e-02 -1.6332407445250895e-02 -4.2977701770305736e-03 -9.4770271678712784e-03 -2.2185340748580099e-02 -1.2623387731540517e-02 8.0572466679422524e-03 2.9889901343063949e-02 9.3030703569344803e-03 3.8368116509650261e-03 7.4267570760837955e-03 6.0723350118596919e-03 -7.4624780210889455e-03 -8.8179025969695821e-03 -8.2730124491011917e-03 -9.7438395504602664e-04 -1.3674415279305688e-02 -1.0973097695596045e-02 1.1915203619180900e-02 1.2927910847658593e-02 9.1393787435404029e-03 5.2186029183569332e-03 1.1548667623529773e-02 2.2990346496367990e-02 -1.2869033359456298e-02 -1.3409750912838869e-02 -6.6755304715569149e-03 3.1357900132047518e-03 -1.4998345225814738e-02 -8.4161019490238374e-03 1.7771624004310094e-02 9.3030703569344821e-03 4.5309326791694166e-02 -5.2352711994227887e-03 1.8126194170824551e-02 -3.9140593369283525e-03 -1.6212413694244185e-02 -6.9140427509122287e-03 -2.3919535731416183e-02 4.4956295366229597e-04 -1.3384345161010750e-02 -2.7838788178212014e-02 7.7411383635892003e-03 9.7285518992877833e-03 2.4643423790751328e-03 6.5646542691845961e-03 -6.8293105127261262e-03 -2.7277307320399367e-03 -2.7806156829173756e-03 -1.7096840017531527e-03 9.9942630690095404e-05 -7.8480369856388198e-03 8.1721787792906272e-03 -2.1088394646402917e-04 -8.2662027813661387e-03 3.8368116509650252e-03 -5.2352711994227887e-03 2.8682174676315751e-02 -8.6937705041478346e-03 4.2513603316507599e-04 -2.7042069978155288e-03 -1.0316162021952640e-02 3.0102982166850087e-03 -1.0290547426823761e-02 6.5097536378101988e-03 4.7882601922518159e-03 -3.3572190709387213e-03 9.0301829725139039e-03 -1.4975119486523950e-04 -6.1682761547706992e-03 2.4002760048621986e-02 1.2720821978327666e-02 -1.5622127076529985e-02 -3.4256222925689181e-02 2.5395394207947293e-03 8.2536494315172577e-03 -3.9910433941342291e-02 1.3024391426018716e-03 1.5628487937392035e-02 7.4267570760837938e-03 1.8126194170824547e-02 -8.6937705041478346e-03 6.3580189558525957e-02 -9.7357345912433397e-04 -1.0606581482804939e-02 -2.0017807871029216e-02 -1.3432070018305254e-02 8.9578765387171161e-03 -2.8762270190543730e-02 -1.9255327962427720e-02 8.2507413106270612e-03 2.7937028245372680e-02 -1.0280232726915068e-03 -2.9207090891788219e-03 1.3240623215510172e-02 2.5636236350192977e-03 5.1149783043871885e-04 1.4771955642708483e-03 -7.5554894062371770e-03 -1.8181211412558764e-04 1.1691986501979881e-03 -5.9192664523511820e-03 -2.7873220180236959e-03 6.0723350118596911e-03 -3.9140593369283534e-03 4.2513603316507605e-04 -9.7357345912433332e-04 2.6620121653317869e-02 2.9435655170892286e-03 -1.3170364539226815e-02 -7.5917992427005886e-03 1.9881716295309633e-03 -6.4365049823485662e-03 -7.7786020209829254e-03 2.1472211104117315e-05 -1.3789094611389848e-03 3.5754711708630609e-03 -2.3763963909747949e-03 -8.8761628712649785e-03 -1.0973902634909657e-02 2.0159463482394082e-02 1.2321816169539028e-02 6.8486516229722509e-03 -6.8754629166522729e-03 1.6300506413627673e-02 -2.5461456193293284e-03 -2.0068810167618086e-02 -7.4624780210889446e-03 -1.6212413694244185e-02 -2.7042069978155305e-03 -1.0606581482804939e-02 2.9435655170892286e-03 3.8842751643157751e-02 7.2103832690569476e-03 1.7588249709487472e-02 -3.2256504174319337e-03 5.8968011123699728e-03 6.3775349175816528e-03 -2.3751688235059222e-02 -1.4784284589434753e-02 -4.0255398186474344e-03 -1.3271775956210409e-03 -1.3232491800290182e-02 -9.9010794108222774e-03 1.1083152832319365e-02 1.2507532500209698e-02 8.7917385573063733e-03 4.2962885974401266e-03 8.2629753891036491e-03 6.3473084190150634e-03 -6.1234164892234053e-03 -8.8179025969695804e-03 -6.9140427509122287e-03 -1.0316162021952640e-02 -2.0017807871029216e-02 -1.3170364539226815e-02 7.2103832690569468e-03 2.6769588115265582e-02 8.1758834370249684e-03 5.0148786367462317e-03 1.0012193689197023e-02 1.0796922894381066e-02 -9.8379472287655877e-03 -1.5484087425486973e-02 -4.1263666067661497e-03 -5.2098568629546757e-05 -1.3599112491105880e-02 -2.7544767930344691e-02 8.7473137062481759e-03 1.0206485588674104e-02 2.5459131605240792e-03 -5.1279711735447969e-03 1.8687839576683560e-02 -2.3529024532605745e-03 -1.5898240887650940e-02 -8.2730124491011917e-03 -2.3919535731416183e-02 3.0102982166850091e-03 -1.3432070018305254e-02 -7.5917992427005886e-03 1.7588249709487476e-02 8.1758834370249684e-03 4.2843176335677885e-02 4.0110795588921859e-03 1.1519977089686549e-02 2.3097936189836788e-02 -1.2278630561487563e-02 -1.3285990733556853e-02 -7.0780203283167149e-03 -7.5648495252748412e-03 5.6852368613347637e-03 7.1791667064453543e-03 -6.9166303731480628e-03 -1.9587621474215443e-03 5.3958519502972264e-03 7.6214640086023806e-03 -7.5855572350084412e-03 -2.4653231058249479e-03 -1.7983427308652638e-03 -9.7438395504602664e-04 4.4956295366229586e-04 -1.0290547426823761e-02 8.9578765387171161e-03 1.9881716295309633e-03 -3.2256504174319337e-03 5.0148786367462308e-03 4.0110795588921885e-03 2.4661339223169577e-02 -5.7335323480517840e-03 -7.6455360346919382e-03 -2.4867827582280900e-03 -3.4057563512703160e-03 -8.9129736583111411e-03 4.8592138020009537e-03 -1.6422725241729115e-02 -1.4366935998106451e-02 7.7634446737989615e-03 1.3961813552096905e-02 3.7537007089515177e-03 -6.5533178451960298e-03 2.5461624679395549e-02 1.2072753265037046e-02 -8.5066965705391864e-03 -1.3674415279305687e-02 -1.3384345161010750e-02 6.5097536378101988e-03 -2.8762270190543730e-02 -6.4365049823485662e-03 5.8968011123699728e-03 1.0012193689197021e-02 1.1519977089686549e-02 -5.7335323480517831e-03 3.4514185378991077e-02 1.6541659638252527e-02 -4.2356664621930875e-03 -2.5090406588102018e-02 -9.7003045604618678e-03 6.5546239853444491e-03 -1.5375842895269035e-02 -2.4868673839712821e-02 1.3958321438165163e-02 1.3707877652587328e-02 -2.3438571441581559e-03 -3.2944294822930074e-03 1.5296057920183570e-02 3.8472267206352351e-03 -1.1061602288901396e-02 -1.0973097695596047e-02 -2.7838788178212011e-02 4.7882601922518159e-03 -1.9255327962427723e-02 -7.7786020209829254e-03 6.3775349175816537e-03 1.0796922894381066e-02 2.3097936189836788e-02 -7.6455360346919382e-03 1.6541659638252527e-02 4.3607510185198414e-02 -9.6771727274567419e-03 -1.0738249552111685e-02 -7.7227519126045127e-03 -7.5656544235173564e-03 7.7965989294548569e-03 1.3119362551359901e-02 -2.0709118419527203e-02 -1.6367281645019393e-02 1.6871176533977935e-03 -2.6067685165971589e-03 -1.5756122468623773e-02 6.4355922375778567e-04 1.9449463954514364e-02 1.1915203619180898e-02 7.7411383635892011e-03 -3.3572190709387200e-03 8.2507413106270577e-03 2.1472211104117287e-05 -2.3751688235059226e-02 -9.8379472287655860e-03 -1.2278630561487562e-02 -2.4867827582280896e-03 -4.2356664621930875e-03 -9.6771727274567419e-03 4.1027767469353389e-02 1.8234473945339027e-02 -1.2568467142644963e-03 -1.6602522345209880e-03 1.2538059501403255e-02 1.3243635348909287e-02 -1.7110242726974915e-02 -2.3411419223346986e-02 1.9599675124469780e-03 -1.8633308206988076e-03 -3.4353911455264695e-02 1.6376780146712684e-03 1.1559209805046849e-02 1.2927910847658595e-02 9.7285518992877833e-03 9.0301829725139039e-03 2.7937028245372683e-02 -1.3789094611389846e-03 -1.4784284589434753e-02 -1.5484087425486973e-02 -1.3285990733556850e-02 -3.4057563512703152e-03 -2.5090406588102018e-02 -1.0738249552111683e-02 1.8234473945339023e-02 4.4936826097766135e-02 -1.1666830285078005e-03 5.4324968792432921e-03 3.6663667601155884e-03 -3.3373399210340667e-03 1.2501243742579259e-03 1.4145872433982407e-03 -5.4043584240658507e-03 -1.0499680651073588e-04 1.8010447213730944e-03 -7.2226068197668927e-03 7.7674869390978269e-03 9.1393787435404029e-03 2.4643423790751337e-03 -1.4975119486523934e-04 -1.0280232726915075e-03 3.5754711708630600e-03 -4.0255398186474344e-03 -4.1263666067661497e-03 -7.0780203283167132e-03 -8.9129736583111394e-03 -9.7003045604618678e-03 -7.7227519126045118e-03 -1.2568467142644974e-03 -1.1666830285078005e-03 2.4725263855849840e-02 696 697 698 744 745 746 756 757 758 708 709 710 699 700 701 747 748 749 759 760 761 711 712 713 2.9610972742011972e-02 -5.9615004663408720e-03 -7.8595160882111610e-03 -3.2578645403187096e-03 -4.0522039082059981e-03 -9.9211517935496509e-03 -1.0832196844868929e-02 9.2680683748213328e-03 1.8519553814018432e-03 -3.2055928176647082e-03 5.5829033630743824e-03 5.7247528257809025e-03 7.2915195150263859e-03 -6.9888458247115599e-03 -3.2668584874547798e-03 -2.6202364907196626e-03 -1.4439863053634743e-03 -1.4296269988094666e-05 -8.4910368432972484e-03 5.4816632451830946e-03 7.4009260203103050e-03 -8.4955647201690881e-03 -1.8860984784569094e-03 6.0841884117106351e-03 -5.9615004663408728e-03 4.1829809975737618e-02 1.8800685613607534e-02 -5.7081145533642852e-03 -2.8590691380788489e-02 -1.0491707106522405e-02 7.5225887403940891e-03 -3.2645871189025621e-02 -7.4982138482065190e-03 6.6520044699944804e-03 1.1947989113732325e-02 1.2967207182564095e-02 -7.6115022572297913e-03 2.6741774926710080e-02 1.4718204243286445e-02 -9.9239925186616566e-03 -1.4839501348321935e-02 -1.5316451701982018e-02 6.3410948635461827e-03 -1.8429935212775580e-02 -1.7262963260919653e-02 8.6894217216618407e-03 1.3986425114731632e-02 4.0832388781725385e-03 -7.8595160882111628e-03 1.8800685613607530e-02 5.0824064819085260e-02 -1.1237887152561146e-02 -1.1869202123758521e-02 -8.3150491871022917e-03 5.6728585526044971e-03 -2.1831026881298413e-02 -8.3398814129176553e-03 6.0364991778352082e-03 1.3045210563608176e-02 2.5687001165730083e-02 -3.0301873680350679e-03 1.4252768863953933e-02 2.7347894316737541e-03 -1.2249232551592657e-02 -1.1080498546827858e-02 -3.0914721995961743e-02 8.0044063473559898e-03 -1.6110265619164368e-02 -2.7912480408972588e-02 1.4663059082604324e-02 1.4792328129879535e-02 -3.7637224115348116e-03 -3.2578645403187091e-03 -5.7081145533642878e-03 -1.1237887152561144e-02 4.3516192434200809e-02 2.0845312240956867e-02 -1.8315257382639396e-03 -2.2506238027652516e-03 1.2510877299929404e-02 -9.6622255598506157e-05 -2.6668278376115309e-02 -1.2234705148488139e-02 -1.4395446037284706e-02 -2.9870950056346403e-03 -1.7456451446784624e-02 6.1502139406928100e-04 2.2473952835274116e-02 1.2401835547005129e-02 9.8444300839037931e-03 -7.7338679255924171e-03 8.7351983678222739e-03 1.5656356146288845e-02 -2.3092415619048578e-02 -1.9093952307076639e-02 1.4456735594463675e-03 -4.0522039082059990e-03 -2.8590691380788489e-02 -1.1869202123758521e-02 2.0845312240956870e-02 4.7156791352344074e-02 -1.8454319623760901e-03 8.1561209252996609e-03 3.4038458766991547e-02 -1.3712382127762717e-03 -1.6441394350520919e-02 -1.8102289289000231e-02 -1.4968359792504434e-02 -1.9164972254541394e-03 -3.7978929915431746e-02 1.7729718030987272e-03 1.3691596611443126e-02 1.3929351060896236e-02 1.1396272786132726e-02 -2.1171905839645231e-03 1.5540878886089694e-02 1.5261058194577050e-02 -1.8165743709554052e-02 -2.5993569481101077e-02 1.6239293076068084e-03 -9.9211517935496492e-03 -1.0491707106522405e-02 -8.3150491871022882e-03 -1.8315257382639403e-03 -1.8454319623760905e-03 2.4600051478180483e-02 1.8922800052405855e-04 -1.9154023123493294e-03 5.3572731065492591e-03 -4.1415995239944279e-03 -4.7341146133343887e-03 -7.2767423861309650e-03 1.0886014534702933e-04 2.8589095065164336e-03 -8.3437056774301691e-03 7.6253783006751770e-03 9.7680923495518553e-03 2.7116453021333864e-03 6.0608402239888488e-03 4.1427883938480676e-03 -2.7159902727167066e-03 1.9099703852729010e-03 2.2168657446658604e-03 -6.0174823634829983e-03 -1.0832196844868931e-02 7.5225887403940900e-03 5.6728585526044980e-03 -2.2506238027652520e-03 8.1561209252996574e-03 1.8922800052405855e-04 2.7477108019386839e-02 -9.8802379688536709e-03 4.3429097694365780e-04 -3.5796469244887903e-03 -1.0486261970444945e-02 3.6293434194531221e-03 -8.7655545444865236e-03 9.3331582174538547e-03 -2.3623827694139535e-04 -7.7845522445302408e-03 4.7481564306647503e-03 -5.8233304081143546e-03 8.5594933867951910e-03 -7.3799954766907965e-03 -3.7504244865079603e-03 -2.8240270450423013e-03 -2.0135288978229346e-03 -1.1572777796162376e-04 9.2680683748213293e-03 -3.2645871189025628e-02 -2.1831026881298413e-02 1.2510877299929404e-02 3.4038458766991547e-02 -1.9154023123493294e-03 -9.8802379688536709e-03 6.8070341649844046e-02 -9.2958476464785719e-04 -1.3229696607782808e-02 -2.4569806498751248e-02 -1.6749520197574128e-02 9.0920173683261499e-03 -4.4389852153411305e-02 1.4235740570727219e-03 1.8119245452626692e-02 9.2283370229014824e-03 2.0894309028903123e-02 -8.4118430927863728e-03 2.8476893520847549e-02 1.7014319777185268e-02 -1.7468430826280718e-02 -3.8208501119396436e-02 2.0933312927086029e-03 1.8519553814018430e-03 -7.4982138482065207e-03 -8.3398814129176553e-03 -9.6622255598506415e-05 -1.3712382127762713e-03 5.3572731065492591e-03 4.3429097694365780e-04 -9.2958476464785806e-04 2.5204916738150916e-02 2.9986357856307874e-03 -1.4062959655801810e-02 -9.1812589067567490e-03 -2.3541092605849518e-04 1.4533386422291023e-03 -6.5869717027583607e-03 -2.8900683478535125e-03 7.0859171090382304e-03 -2.6924259501225731e-03 -2.7916489388419741e-03 1.3518449044182281e-02 4.2797347639010582e-03 7.2886832437619922e-04 1.8042916859828449e-03 -8.0413866360458924e-03 -3.2055928176647095e-03 6.6520044699944804e-03 6.0364991778352074e-03 -2.6668278376115309e-02 -1.6441394350520923e-02 -4.1415995239944279e-03 -3.5796469244887890e-03 -1.3229696607782808e-02 2.9986357856307878e-03 4.5551826690689003e-02 9.0347901928189908e-03 1.9953423754873367e-02 -9.2699914493284286e-03 1.7485272364796599e-02 -3.1638681356530845e-03 -2.2496992611041110e-02 -6.9033456200610650e-03 -1.7921006579415238e-02 -2.1157499853463155e-03 -9.5562955032817316e-03 -1.2457073968385760e-02 2.1784425473295642e-02 1.2958665054036460e-02 8.6949894891091561e-03 5.5829033630743841e-03 1.1947989113732323e-02 1.3045210563608176e-02 -1.2234705148488139e-02 -1.8102289289000231e-02 -4.7341146133343896e-03 -1.0486261970444945e-02 -2.4569806498751248e-02 -1.4062959655801810e-02 9.0347901928189908e-03 3.3292069303111932e-02 1.0418409056300015e-02 4.2962329110247657e-03 8.2835994222857645e-03 6.7630408206693160e-03 -8.3397183890455834e-03 -9.9113541366439677e-03 -9.3027700238770411e-03 -1.1404146781626486e-03 -1.5408561779138264e-02 -1.2352398621181569e-02 1.3287173719223166e-02 1.4468353864403701e-02 1.0225582473617300e-02 5.7247528257809025e-03 1.2967207182564097e-02 2.5687001165730083e-02 -1.4395446037284706e-02 -1.4968359792504434e-02 -7.2767423861309667e-03 3.6293434194531217e-03 -1.6749520197574131e-02 -9.1812589067567490e-03 1.9953423754873363e-02 1.0418409056300018e-02 5.0594469270469414e-02 -5.8723857424732365e-03 2.0238936191546503e-02 -4.4464267713555132e-03 -1.8087050059144936e-02 -7.7615154678464049e-03 -2.6858914220531219e-02 4.6701393515326305e-04 -1.4977327917481369e-02 -3.1279386162359736e-02 8.5803479036422083e-03 1.0832170944995731e-02 2.7612580109347045e-03 7.2915195150263842e-03 -7.6115022572297913e-03 -3.0301873680350674e-03 -2.9870950056346403e-03 -1.9164972254541396e-03 1.0886014534702914e-04 -8.7655545444865236e-03 9.0920173683261517e-03 -2.3541092605849532e-04 -9.2699914493284286e-03 4.2962329110247657e-03 -5.8723857424732356e-03 3.2112071409464656e-02 -9.6906539030371733e-03 4.9953183928723682e-04 -3.1410791132311048e-03 -1.1588940474951072e-02 3.3449026183996946e-03 -1.1580985811697945e-02 7.2397769396529360e-03 5.3624539993592686e-03 -3.6588850001123977e-03 1.0179566641668320e-02 -1.7776456582643238e-04 -6.9888458247115599e-03 2.6741774926710080e-02 1.4252768863953933e-02 -1.7456451446784621e-02 -3.7978929915431753e-02 2.8589095065164345e-03 9.3331582174538529e-03 -4.4389852153411312e-02 1.4533386422291019e-03 1.7485272364796599e-02 8.2835994222857662e-03 2.0238936191546503e-02 -9.6906539030371733e-03 7.0963968708679576e-02 -1.1673521598806987e-03 -1.1695669671762998e-02 -2.2529655041714919e-02 -1.4997877127931766e-02 9.9831915169651467e-03 -3.2259001969160359e-02 -2.1474416240963211e-02 9.0299987470807350e-03 3.1168096022042954e-02 -1.1643076754702835e-03 -3.2668584874547802e-03 1.4718204243286447e-02 2.7347894316737524e-03 6.1502139406928132e-04 1.7729718030987276e-03 -8.3437056774301691e-03 -2.3623827694139524e-04 1.4235740570727215e-03 -6.5869717027583598e-03 -3.1638681356530841e-03 6.7630408206693169e-03 -4.4464267713555132e-03 4.9953183928723693e-04 -1.1673521598806991e-03 2.9840874308154863e-02 3.3639973054433196e-03 -1.4735017996223116e-02 -8.5394800912401668e-03 2.2007050180932637e-03 -7.1788377461838391e-03 -8.7397575893037455e-03 -1.2290656843842100e-05 -1.5965830218395577e-03 4.0806780922593407e-03 -2.6202364907196626e-03 -9.9239925186616566e-03 -1.2249232551592657e-02 2.2473952835274116e-02 1.3691596611443122e-02 7.6253783006751761e-03 -7.7845522445302425e-03 1.8119245452626692e-02 -2.8900683478535125e-03 -2.2496992611041110e-02 -8.3397183890455834e-03 -1.8087050059144936e-02 -3.1410791132311048e-03 -1.1695669671762998e-02 3.3639973054433205e-03 4.3588580688406840e-02 8.0950419221789034e-03 1.9696845614484093e-02 -3.4430833319294978e-03 6.5119052282560114e-03 7.0163744944961625e-03 -2.6576589732229334e-02 -1.6458408635034505e-02 -4.4762447565076594e-03 -1.4439863053634743e-03 -1.4839501348321935e-02 -1.1080498546827860e-02 1.2401835547005129e-02 1.3929351060896236e-02 9.7680923495518553e-03 4.7481564306647494e-03 9.2283370229014842e-03 7.0859171090382304e-03 -6.9033456200610650e-03 -9.9113541366439677e-03 -7.7615154678464058e-03 -1.1588940474951074e-02 -2.2529655041714926e-02 -1.4735017996223116e-02 8.0950419221789052e-03 3.0197154809192137e-02 9.2113583792811891e-03 5.7049269808150515e-03 1.1359741573465518e-02 1.2149980408189662e-02 -1.1013688480288216e-02 -1.7434073939774544e-02 -4.6383162351635622e-03 -1.4296269988095642e-05 -1.5316451701982021e-02 -3.0914721995961743e-02 9.8444300839037914e-03 1.1396272786132726e-02 2.7116453021333864e-03 -5.8233304081143546e-03 2.0894309028903123e-02 -2.6924259501225731e-03 -1.7921006579415238e-02 -9.3027700238770394e-03 -2.6858914220531219e-02 3.3449026183996933e-03 -1.4997877127931766e-02 -8.5394800912401668e-03 1.9696845614484100e-02 9.2113583792811891e-03 4.8257964791003499e-02 4.6112597295700697e-03 1.2935469097477141e-02 2.6033065939724723e-02 -1.3738804788839952e-02 -1.4820310438003368e-02 -7.9971337750059206e-03 -8.4910368432972484e-03 6.3410948635461836e-03 8.0044063473559898e-03 -7.7338679255924197e-03 -2.1171905839645231e-03 6.0608402239888497e-03 8.5594933867951910e-03 -8.4118430927863710e-03 -2.7916489388419737e-03 -2.1157499853463151e-03 -1.1404146781626486e-03 4.6701393515326262e-04 -1.1580985811697945e-02 9.9831915169651484e-03 2.2007050180932641e-03 -3.4430833319294973e-03 5.7049269808150515e-03 4.6112597295700705e-03 2.7921741997016605e-02 -6.3830704399331709e-03 -8.5161975227075210e-03 -3.1165114859483759e-03 -3.9766945664796629e-03 -1.0036378792611938e-02 5.4816632451830955e-03 -1.8429935212775580e-02 -1.6110265619164368e-02 8.7351983678222739e-03 1.5540878886089694e-02 4.1427883938480667e-03 -7.3799954766907965e-03 2.8476893520847549e-02 1.3518449044182283e-02 -9.5562955032817316e-03 -1.5408561779138264e-02 -1.4977327917481369e-02 7.2397769396529343e-03 -3.2259001969160365e-02 -7.1788377461838391e-03 6.5119052282560114e-03 1.1359741573465518e-02 1.2935469097477141e-02 -6.3830704399331717e-03 3.9068600721198471e-02 1.8586559009333953e-02 -4.6491823610086067e-03 -2.8348615740527036e-02 -1.0916834262011866e-02 7.4009260203103050e-03 -1.7262963260919653e-02 -2.7912480408972588e-02 1.5656356146288845e-02 1.5261058194577048e-02 -2.7159902727167061e-03 -3.7504244865079594e-03 1.7014319777185268e-02 4.2797347639010590e-03 -1.2457073968385763e-02 -1.2352398621181569e-02 -3.1279386162359736e-02 5.3624539993592695e-03 -2.1474416240963211e-02 -8.7397575893037437e-03 7.0163744944961625e-03 1.2149980408189662e-02 2.6033065939724723e-02 -8.5161975227075210e-03 1.8586559009333949e-02 4.9230731327907153e-02 -1.0712414682853331e-02 -1.1922139266221498e-02 -8.8959175981801579e-03 -8.4955647201690881e-03 8.6894217216618407e-03 1.4663059082604324e-02 -2.3092415619048578e-02 -1.8165743709554049e-02 1.9099703852729010e-03 -2.8240270450423013e-03 -1.7468430826280718e-02 7.2886832437619867e-04 2.1784425473295642e-02 1.3287173719223166e-02 8.5803479036422083e-03 -3.6588850001123977e-03 9.0299987470807367e-03 -1.2290656843841748e-05 -2.6576589732229337e-02 -1.1013688480288216e-02 -1.3738804788839952e-02 -3.1165114859483768e-03 -4.6491823610086067e-03 -1.0712414682853331e-02 4.5979568129254425e-02 2.0290451189165854e-02 -1.4187355673585017e-03 -1.8860984784569096e-03 1.3986425114731631e-02 1.4792328129879533e-02 -1.9093952307076636e-02 -2.5993569481101070e-02 2.2168657446658604e-03 -2.0135288978229346e-03 -3.8208501119396436e-02 1.8042916859828458e-03 1.2958665054036462e-02 1.4468353864403699e-02 1.0832170944995731e-02 1.0179566641668322e-02 3.1168096022042954e-02 -1.5965830218395579e-03 -1.6458408635034505e-02 -1.7434073939774544e-02 -1.4820310438003366e-02 -3.9766945664796629e-03 -2.8348615740527036e-02 -1.1922139266221496e-02 2.0290451189165854e-02 5.0361885279620808e-02 -1.3066237794595395e-03 6.0841884117106351e-03 4.0832388781725385e-03 -3.7637224115348112e-03 1.4456735594463675e-03 1.6239293076068084e-03 -6.0174823634829983e-03 -1.1572777796162346e-04 2.0933312927086034e-03 -8.0413866360458906e-03 8.6949894891091561e-03 1.0225582473617302e-02 2.7612580109347049e-03 -1.7776456582643243e-04 -1.1643076754702837e-03 4.0806780922593398e-03 -4.4762447565076602e-03 -4.6383162351635613e-03 -7.9971337750059223e-03 -1.0036378792611938e-02 -1.0916834262011864e-02 -8.8959175981801579e-03 -1.4187355673585026e-03 -1.3066237794595397e-03 2.7873706681055731e-02 642 643 644 708 709 710 720 721 722 654 655 656 645 646 647 711 712 713 723 724 725 657 658 659 3.1160509392715939e-02 -7.8997918795637497e-03 -1.1389377362965577e-02 -9.2553905915265106e-04 1.2503067948516169e-03 -7.2575838260333135e-03 -1.3841525853681197e-02 1.2433909426640861e-02 2.8019633553069481e-03 -5.2398462883718700e-03 1.6261939560946262e-03 1.8417402692565501e-03 1.0504918454890903e-02 -9.6049906395797406e-03 -5.0627772971839884e-03 -1.4670045149570393e-04 1.7224531966187799e-03 3.8232467114713538e-03 -1.1386449067268241e-02 6.8856222012864251e-03 1.0504445219575059e-02 -1.0125367127637178e-02 -6.4137030563488195e-03 4.7383429305729681e-03 -7.8997918795637515e-03 3.6008982807866109e-02 1.5157120531136039e-02 -2.7678194684030172e-04 -2.6741644670811537e-02 -1.1245361649706695e-02 9.9250729346442232e-03 -2.5883338564554669e-02 -6.2442094428755961e-03 2.4012451705216968e-03 1.1869519062695474e-02 1.2411733472658984e-02 -1.0222950477637976e-02 2.1436321243760381e-02 1.2397629050172138e-02 -5.8812809106891014e-03 -1.4750693797347256e-02 -1.3586504043362108e-02 7.8882520266402630e-03 -1.4279779245391902e-02 -1.3724596045936434e-02 4.0662350829249383e-03 1.2340633163783402e-02 4.8341881279136741e-03 -1.1389377362965573e-02 1.5157120531136036e-02 4.6142189006939616e-02 -8.2225209092328718e-03 -1.2605881631897804e-02 -8.6282456398396202e-03 8.2616155057576805e-03 -1.8041779780618244e-02 -7.7941731017557607e-03 1.8286852457236789e-03 1.2380749403650524e-02 2.2889552210793595e-02 -4.7272682944337532e-03 1.2124902283073606e-02 3.3799807881181960e-03 -7.9786883171441940e-03 -1.1879122760534955e-02 -2.7848993373874947e-02 1.1026222640622658e-02 -1.2557725078720539e-02 -2.4847977955057662e-02 1.1201331491672364e-02 1.5421737033911385e-02 -3.2923319353234210e-03 -9.2553905915264932e-04 -2.7678194684030129e-04 -8.2225209092328683e-03 3.4820844413187599e-02 1.8101076897234787e-02 -7.5223966194699747e-04 -4.7263011732146592e-03 5.3889091602278404e-03 -1.3131848784591786e-04 -1.9452478277056248e-02 -1.1681796705992687e-02 -1.1290303413278399e-02 -3.4962016948218298e-04 -1.0412778824100520e-02 2.3397603420176132e-04 1.6537830906325195e-02 1.1644998935134189e-02 7.8017527390948846e-03 -9.3617551996257008e-03 3.8062638555411057e-03 1.1763430265637722e-02 -1.6542981440981333e-02 -1.6569891371204425e-02 5.9722343336981684e-04 1.2503067948516169e-03 -2.6741644670811537e-02 -1.2605881631897806e-02 1.8101076897234791e-02 5.0088928294139669e-02 -8.7262263132706060e-04 1.6057356629139159e-03 3.2494847616890254e-02 -8.0897985134275143e-04 -1.4725798375085624e-02 -2.1430977313596392e-02 -1.5949498192367337e-02 3.8017779979976716e-03 -3.6121000925670936e-02 9.9217153875155143e-04 1.2832743648383452e-02 1.7734537277872085e-02 1.2192025340705516e-02 -6.9328062645471790e-03 1.3636939698272435e-02 1.6047094366483373e-02 -1.5933036361748632e-02 -2.9661629977095573e-02 1.0056910609945132e-03 -7.2575838260333135e-03 -1.1245361649706699e-02 -8.6282456398396202e-03 -7.5223966194699757e-04 -8.7262263132706049e-04 2.2841904189771663e-02 2.0347202856511829e-04 -8.7512943355076841e-04 4.5999920863356511e-03 -3.6424523526977447e-03 -5.3834564952611099e-03 -7.6950708935623353e-03 -1.7677256210698434e-04 1.6878060999373705e-03 -7.3400514007477867e-03 6.1195216660649499e-03 1.0259714284884845e-02 3.8644334319923690e-03 4.6767649337521493e-03 5.0364234905301945e-03 -2.0051328396365671e-03 8.2928977440281898e-04 1.3926263344932238e-03 -5.6378289343133742e-03 -1.3841525853681199e-02 9.9250729346442232e-03 8.2616155057576805e-03 -4.7263011732146601e-03 1.6057356629139174e-03 2.0347202856511857e-04 2.8402802683584544e-02 -1.4177725959936098e-02 4.3382755464662802e-04 -8.6513162746105782e-04 -5.0571899888100158e-03 5.6805533834032636e-03 -1.1223913649047094e-02 1.3056627476867817e-02 -2.3026689278147301e-04 -8.9917146058349356e-03 6.7627848417832232e-04 -8.4094759382238593e-03 1.1375855282517970e-02 -9.8598379088503905e-03 -5.7613935305538639e-03 -1.3007105686357184e-04 3.8310392989922247e-03 -1.7833211081349162e-04 1.2433909426640861e-02 -2.5883338564554673e-02 -1.8041779780618244e-02 5.3889091602278404e-03 3.2494847616890254e-02 -8.7512943355076830e-04 -1.4177725959936096e-02 5.5881181505077968e-02 -6.2307743053400448e-04 -6.9940764672145215e-03 -2.5074359541247065e-02 -1.4159787385388293e-02 1.2705444846478408e-02 -3.5216943293888574e-02 7.3828792494717789e-04 1.2132314094084967e-02 1.1909646809121792e-02 1.7656960198060869e-02 -1.1046636265084042e-02 2.1901371099402989e-02 1.4101233556193830e-02 -1.0442138835197401e-02 -3.6012405630802692e-02 1.2032923508894370e-03 2.8019633553069481e-03 -6.2442094428755944e-03 -7.7941731017557624e-03 -1.3131848784591780e-04 -8.0897985134275186e-04 4.5999920863356511e-03 4.3382755464662791e-04 -6.2307743053400470e-04 2.2408839169904750e-02 4.8850234099375046e-03 -1.2118534933711794e-02 -8.4719077774047212e-03 -4.0489424501780503e-04 1.1649583760612518e-03 -5.6621582204576621e-03 -3.5532337448876562e-03 5.8422432452756301e-03 -1.9321854572854221e-03 -4.3508814034458930e-03 1.1309311768393813e-02 3.9661483848273237e-03 3.1951356130619011e-04 1.4782882687334508e-03 -7.1145550841641590e-03 -5.2398462883718709e-03 2.4012451705216972e-03 1.8286852457236784e-03 -1.9452478277056245e-02 -1.4725798375085622e-02 -3.6424523526977452e-03 -8.6513162746105761e-04 -6.9940764672145189e-03 4.8850234099375054e-03 3.6062785074101628e-02 8.9311259144860232e-03 1.5166772697967387e-02 -1.0005087826614292e-02 1.1477880017454659e-02 -3.6371356481326679e-03 -1.6037614583398922e-02 -7.4106004128219501e-03 -1.3700946555510764e-02 2.1563555695176253e-04 -5.3380044078671467e-03 -7.7532025727775301e-03 1.5321737971848992e-02 1.1658228560526868e-02 6.8532557754901347e-03 1.6261939560946262e-03 1.1869519062695476e-02 1.2380749403650524e-02 -1.1681796705992686e-02 -2.1430977313596392e-02 -5.3834564952611099e-03 -5.0571899888100140e-03 -2.5074359541247065e-02 -1.2118534933711796e-02 8.9311259144860215e-03 3.2846888171982995e-02 1.2511061362147760e-02 3.0352550931899742e-04 1.0695660651836036e-02 5.6718781408082513e-03 -8.5525859543830237e-03 -1.1579769061729164e-02 -1.1204322843586951e-02 2.3197389869511606e-03 -1.4688666621433073e-02 -1.2666873395027957e-02 1.2110988282334912e-02 1.7361704651491186e-02 1.0809498760981272e-02 1.8417402692565495e-03 1.2411733472658986e-02 2.2889552210793595e-02 -1.1290303413278401e-02 -1.5949498192367337e-02 -7.6950708935623353e-03 5.6805533834032636e-03 -1.4159787385388294e-02 -8.4719077774047177e-03 1.5166772697967386e-02 1.2511061362147760e-02 4.5784261748415746e-02 -8.1736992164197341e-03 1.7082122525594372e-02 -3.2523683861513017e-03 -1.4227874677749597e-02 -1.0070953013880552e-02 -2.4496808438330568e-02 4.2842821333278673e-03 -1.2998158937039404e-02 -2.7874341874098450e-02 6.7185288234926487e-03 1.1173480168274470e-02 3.1166834103380256e-03 1.0504918454890905e-02 -1.0222950477637976e-02 -4.7272682944337540e-03 -3.4962016948218363e-04 3.8017779979976716e-03 -1.7677256210698434e-04 -1.1223913649047094e-02 1.2705444846478406e-02 -4.0489424501780524e-04 -1.0005087826614294e-02 3.0352550931899721e-04 -8.1736992164197324e-03 3.1975637403099298e-02 -1.3729505461194317e-02 3.9276211706264750e-04 -6.5581569076851370e-04 -5.9772918860038337e-03 5.2327406670520851e-03 -1.4257033620374289e-02 9.4514170495632807e-03 7.9278046137301172e-03 -5.9890849017038257e-03 3.6675824214777710e-03 -7.0673079866573810e-05 -9.6049906395797423e-03 2.1436321243760381e-02 1.2124902283073608e-02 -1.0412778824100520e-02 -3.6121000925670936e-02 1.6878060999373705e-03 1.3056627476867817e-02 -3.5216943293888574e-02 1.1649583760612516e-03 1.1477880017454659e-02 1.0695660651836036e-02 1.7082122525594372e-02 -1.3729505461194317e-02 5.8510946373918182e-02 -4.2936658783534521e-04 -6.5143146490416852e-03 -2.3800064848867056e-02 -1.3108942663124269e-02 1.2862448050131130e-02 -2.5070958465193981e-02 -1.7849851610339185e-02 2.8646340294626450e-03 2.9566039264105958e-02 -6.7162842336780605e-04 -5.0627772971839884e-03 1.2397629050172139e-02 3.3799807881181938e-03 2.3397603420176113e-04 9.9217153875155056e-04 -7.3400514007477867e-03 -2.3026689278147290e-04 7.3828792494717767e-04 -5.6621582204576613e-03 -3.6371356481326674e-03 5.6718781408082513e-03 -3.2523683861513013e-03 3.9276211706264729e-04 -4.2936658783534435e-04 2.6089416303586660e-02 5.0191813664497457e-03 -1.2623304458009826e-02 -8.3796572048885718e-03 3.0981575505366491e-03 -6.0456721108016016e-03 -8.1044277649999618e-03 1.8610276984732437e-04 -7.0162349803234850e-04 3.2692658855404304e-03 -1.4670045149570393e-04 -5.8812809106891031e-03 -7.9786883171441940e-03 1.6537830906325192e-02 1.2832743648383455e-02 6.1195216660649499e-03 -8.9917146058349356e-03 1.2132314094084964e-02 -3.5532337448876562e-03 -1.6037614583398918e-02 -8.5525859543830254e-03 -1.4227874677749597e-02 -6.5581569076851218e-04 -6.5143146490416852e-03 5.0191813664497457e-03 3.4666196500728351e-02 8.6287055598745707e-03 1.5393349047207263e-02 -5.7092716131718216e-03 2.4346814088940729e-03 3.1386480066654225e-03 -1.9662910462383647e-02 -1.5080263197123252e-02 -3.9109033466059361e-03 1.7224531966187804e-03 -1.4750693797347256e-02 -1.1879122760534955e-02 1.1644998935134191e-02 1.7734537277872085e-02 1.0259714284884845e-02 6.7627848417832286e-04 1.1909646809121790e-02 5.8422432452756301e-03 -7.4106004128219492e-03 -1.1579769061729164e-02 -1.0070953013880552e-02 -5.9772918860038337e-03 -2.3800064848867056e-02 -1.2623304458009825e-02 8.6287055598745690e-03 2.9882802728054780e-02 1.1691576527611734e-02 1.5117295701057986e-03 1.1281698621305750e-02 1.1916846342935928e-02 -1.0796273447085870e-02 -2.0678157728410935e-02 -5.1370001682828036e-03 3.8232467114713538e-03 -1.3586504043362108e-02 -2.7848993373874951e-02 7.8017527390948863e-03 1.2192025340705518e-02 3.8644334319923685e-03 -8.4094759382238593e-03 1.7656960198060869e-02 -1.9321854572854221e-03 -1.3700946555510764e-02 -1.1204322843586951e-02 -2.4496808438330568e-02 5.2327406670520851e-03 -1.3108942663124269e-02 -8.3796572048885718e-03 1.5393349047207263e-02 1.1691576527611736e-02 4.3629182610988575e-02 5.6753274355494606e-04 1.2082306039231199e-02 2.3114994176388390e-02 -1.0708199414645897e-02 -1.5723098555536000e-02 -7.9509657449898258e-03 -1.1386449067268241e-02 7.8882520266402648e-03 1.1026222640622658e-02 -9.3617551996257025e-03 -6.9328062645471807e-03 4.6767649337521510e-03 1.1375855282517966e-02 -1.1046636265084042e-02 -4.3508814034458939e-03 2.1563555695176264e-04 2.3197389869511606e-03 4.2842821333278665e-03 -1.4257033620374287e-02 1.2862448050131130e-02 3.0981575505366504e-03 -5.7092716131718207e-03 1.5117295701057988e-03 5.6753274355494498e-04 2.9078330865573564e-02 -7.9939776575727785e-03 -1.1947316862924297e-02 4.4687795396747450e-05 1.3912515533756487e-03 -7.3547617354240815e-03 6.8856222012864243e-03 -1.4279779245391902e-02 -1.2557725078720539e-02 3.8062638555411057e-03 1.3636939698272435e-02 5.0364234905301945e-03 -9.8598379088503905e-03 2.1901371099402989e-02 1.1309311768393813e-02 -5.3380044078671475e-03 -1.4688666621433073e-02 -1.2998158937039407e-02 9.4514170495632807e-03 -2.5070958465193981e-02 -6.0456721108016033e-03 2.4346814088940724e-03 1.1281698621305750e-02 1.2082306039231197e-02 -7.9939776575727785e-03 3.2240017777073596e-02 1.4502254202484775e-02 6.1383545900543920e-04 -2.5020622864035814e-02 -1.1328739374078432e-02 1.0504445219575057e-02 -1.3724596045936434e-02 -2.4847977955057662e-02 1.1763430265637722e-02 1.6047094366483373e-02 -2.0051328396365666e-03 -5.7613935305538648e-03 1.4101233556193832e-02 3.9661483848273237e-03 -7.7532025727775301e-03 -1.2666873395027953e-02 -2.7874341874098454e-02 7.9278046137301172e-03 -1.7849851610339185e-02 -8.1044277649999618e-03 3.1386480066654225e-03 1.1916846342935926e-02 2.3114994176388390e-02 -1.1947316862924297e-02 1.4502254202484769e-02 4.3677643564901343e-02 -7.8724151393526134e-03 -1.2326107416794333e-02 -7.9269056923244215e-03 -1.0125367127637178e-02 4.0662350829249383e-03 1.1201331491672364e-02 -1.6542981440981333e-02 -1.5933036361748632e-02 8.2928977440281952e-04 -1.3007105686357184e-04 -1.0442138835197399e-02 3.1951356130619033e-04 1.5321737971848992e-02 1.2110988282334912e-02 6.7185288234926496e-03 -5.9890849017038275e-03 2.8646340294626437e-03 1.8610276984732443e-04 -1.9662910462383644e-02 -1.0796273447085870e-02 -1.0708199414645899e-02 4.4687795396747016e-05 6.1383545900543660e-04 -7.8724151393526134e-03 3.7083989222323810e-02 1.7515755790303976e-02 -6.7415186672283847e-04 -6.4137030563488195e-03 1.2340633163783402e-02 1.5421737033911385e-02 -1.6569891371204428e-02 -2.9661629977095573e-02 1.3926263344932234e-03 3.8310392989922247e-03 -3.6012405630802699e-02 1.4782882687334503e-03 1.1658228560526866e-02 1.7361704651491193e-02 1.1173480168274469e-02 3.6675824214777715e-03 2.9566039264105955e-02 -7.0162349803234818e-04 -1.5080263197123253e-02 -2.0678157728410935e-02 -1.5723098555536000e-02 1.3912515533756492e-03 -2.5020622864035821e-02 -1.2326107416794333e-02 1.7515755790303976e-02 5.2104439120964470e-02 -7.1530233504984932e-04 4.7383429305729689e-03 4.8341881279136741e-03 -3.2923319353234210e-03 5.9722343336981662e-04 1.0056910609945130e-03 -5.6378289343133742e-03 -1.7833211081349162e-04 1.2032923508894370e-03 -7.1145550841641590e-03 6.8532557754901347e-03 1.0809498760981272e-02 3.1166834103380251e-03 -7.0673079866573904e-05 -6.7162842336780583e-04 3.2692658855404304e-03 -3.9109033466059335e-03 -5.1370001682828036e-03 -7.9509657449898258e-03 -7.3547617354240815e-03 -1.1328739374078432e-02 -7.9269056923244249e-03 -6.7415186672283803e-04 -7.1530233504984845e-04 2.5536638095236746e-02 708 709 710 756 757 758 768 769 770 720 721 722 711 712 713 759 760 761 771 772 773 723 724 725 3.4226279154919617e-02 -8.9240907842843033e-03 -1.2641257355517452e-02 -1.0829091848235791e-03 1.4738973404379307e-03 -7.9451837839679424e-03 -1.5408256093112426e-02 1.3763603442371760e-02 3.2066118508988729e-03 -5.5081374615293379e-03 1.7338493186218693e-03 1.9736423472057852e-03 1.1637670454720892e-02 -1.0822069926643162e-02 -5.5589223424386955e-03 -3.8207546654262696e-04 2.0208327248338199e-03 4.2571793506586183e-03 -1.2607731675392265e-02 7.8109906600988344e-03 1.1579176550032285e-02 -1.0874839728240281e-02 -7.0570127754367457e-03 5.1287533831285322e-03 -8.9240907842843033e-03 4.0245561740501069e-02 1.7330666223902187e-02 -5.8357311875692551e-04 -3.0189152851429292e-02 -1.2473595107487084e-02 1.1205918304588855e-02 -2.9482323390349278e-02 -7.1781316664452678e-03 2.7728730549129985e-03 1.3902337943423356e-02 1.4185852388808071e-02 -1.1315078617167771e-02 2.4542072959701594e-02 1.3804968581617972e-02 -6.6654805850703625e-03 -1.6921208483147029e-02 -1.5595633479013903e-02 8.8634350901449516e-03 -1.6536242867679546e-02 -1.5662428355543580e-02 4.6459966556325599e-03 1.4438954948979121e-02 5.5883014141616047e-03 -1.2641257355517455e-02 1.7330666223902187e-02 5.1324506619162893e-02 -9.2388371265249934e-03 -1.4462438471496097e-02 -9.6703390444508614e-03 9.2573316517265379e-03 -2.0431029310033454e-02 -9.0968195778212968e-03 2.2542390707088306e-03 1.4269826163427497e-02 2.5832148086947115e-02 -5.3416891174550597e-03 1.3970353459085075e-02 4.0463654961138068e-03 -8.8433580026699137e-03 -1.3601482723131750e-02 -3.1346677675033643e-02 1.2182436926349714e-02 -1.4503183270529012e-02 -2.7939427363974100e-02 1.2371133953382341e-02 1.7427287928775549e-02 -3.1497565409439130e-03 -1.0829091848235791e-03 -5.8357311875692616e-04 -9.2388371265249934e-03 3.8124268883739959e-02 2.0110795417278771e-02 -7.0561659571194326e-04 -4.9389435165379013e-03 6.0830896008968582e-03 -1.0300116570146005e-05 -2.1585606013577494e-02 -1.3105060583360102e-02 -1.2464218144951260e-02 -5.0081083604378409e-04 -1.1658304293108605e-02 1.5118642717414522e-04 1.8201602806741171e-02 1.3023913502688304e-02 8.8246913319918133e-03 -9.9934404589814164e-03 4.4825640784412757e-03 1.2985348737010148e-02 -1.8224161680516951e-02 -1.8353424604079582e-02 4.5774548758223529e-04 1.4738973404379303e-03 -3.0189152851429292e-02 -1.4462438471496097e-02 2.0110795417278771e-02 5.5624986197107498e-02 -8.1122702214457337e-04 1.7266237446489803e-03 3.6692567994894246e-02 -5.4076705850488046e-04 -1.6552213546621546e-02 -2.4459700735472108e-02 -1.7920356651444137e-02 4.1779125793865628e-03 -4.0536584383498275e-02 9.8527325965619872e-04 1.4307230833306846e-02 2.0226805612135249e-02 1.3911178554761943e-02 -7.5302605794660849e-03 1.5968871870902235e-02 1.8004109594554601e-02 -1.7713985788971466e-02 -3.3327793704639563e-02 8.3422779461694624e-04 -7.9451837839679424e-03 -1.2473595107487084e-02 -9.6703390444508614e-03 -7.0561659571194326e-04 -8.1122702214457185e-04 2.4977904070510492e-02 2.7613251723654353e-04 -7.7980617134469903e-04 5.2563337231870972e-03 -4.1659160039515357e-03 -6.0652215130884857e-03 -8.7740727804043270e-03 -1.3275034185267708e-04 1.6413061943360040e-03 -8.1038062896009247e-03 6.7785027453561271e-03 1.1410129790280221e-02 4.4708131238451456e-03 5.1078964345037557e-03 5.7133849959126667e-03 -1.8883851748720286e-03 7.8693502838767177e-04 1.3650288335359537e-03 -6.2684476282145827e-03 -1.5408256093112426e-02 1.1205918304588851e-02 9.2573316517265379e-03 -4.9389435165379013e-03 1.7266237446489803e-03 2.7613251723654331e-04 3.1932294389165457e-02 -1.5720819314247465e-02 3.0088877159432220e-04 -1.8419346891326734e-03 -5.5581068867754657e-03 6.1761463916520281e-03 -1.2384006157815833e-02 1.4565480949385073e-02 -1.7410735210529507e-04 -9.6295450425373900e-03 6.3268504135492590e-04 -9.2734043129640391e-03 1.2919906760377445e-02 -1.1061421400783651e-02 -6.3865253240925537e-03 -6.4951565040668037e-04 4.2096395618287557e-03 -1.7646234304754532e-04 1.3763603442371760e-02 -2.9482323390349272e-02 -2.0431029310033454e-02 6.0830896008968599e-03 3.6692567994894246e-02 -7.7980617134469914e-04 -1.5720819314247465e-02 6.3123839746981547e-02 -2.2820050535354597e-04 -7.7487811223136164e-03 -2.9356305168091141e-02 -1.5838238775094070e-02 1.3956386118928313e-02 -3.9658450669756651e-02 6.5280243089835103e-04 1.3373793939594040e-02 1.3942873531949493e-02 1.9919087511669126e-02 -1.2176044519992170e-02 2.5518986022975695e-02 1.5689600635504734e-02 -1.1531228145237717e-02 -4.0781188068603938e-02 1.0157841837535615e-03 3.2066118508988725e-03 -7.1781316664452678e-03 -9.0968195778212985e-03 -1.0300116570145897e-05 -5.4076705850488003e-04 5.2563337231870972e-03 3.0088877159432193e-04 -2.2820050535354391e-04 2.5355374833614875e-02 5.2237746379069153e-03 -1.3865567430673253e-02 -1.0519104544841416e-02 -2.6281518179507157e-04 8.8702837787154373e-04 -6.3219945901773307e-03 -3.7467192700162849e-03 6.6972082933206582e-03 -1.6433591845218694e-03 -4.9667563898634090e-03 1.3002751785455411e-02 5.1852725760919999e-03 2.5531569784480320e-04 1.2256782043293312e-03 -8.2157032355320500e-03 -5.5081374615293388e-03 2.7728730549129998e-03 2.2542390707088328e-03 -2.1585606013577497e-02 -1.6552213546621546e-02 -4.1659160039515357e-03 -1.8419346891326749e-03 -7.7487811223136190e-03 5.2237746379069135e-03 4.0468339278675186e-02 1.0213478879786613e-02 1.6823473323718800e-02 -1.0739495813571283e-02 1.2771667398253025e-02 -3.9040209785908184e-03 -1.7750925047537735e-02 -8.4794683552777174e-03 -1.5341286655780526e-02 -4.0324428377315621e-04 -6.0696370339963276e-03 -8.6521333665453629e-03 1.7361004030446499e-02 1.3092080725256573e-02 7.7618699725336901e-03 1.7338493186218685e-03 1.3902337943423358e-02 1.4269826163427497e-02 -1.3105060583360105e-02 -2.4459700735472108e-02 -6.0652215130884849e-03 -5.5581068867754675e-03 -2.9356305168091134e-02 -1.3865567430673253e-02 1.0213478879786613e-02 3.7541519446038889e-02 1.4411313069090560e-02 2.6565968843144576e-04 1.2737982543109443e-02 6.4160926766958989e-03 -9.6734938272469012e-03 -1.3365391471906603e-02 -1.2941324778009557e-02 2.5260683783304653e-03 -1.7360456394464877e-02 -1.4586622120432075e-02 1.3597605032212088e-02 2.0360013837363036e-02 1.2361503932989411e-02 1.9736423472057844e-03 1.4185852388808071e-02 2.5832148086947115e-02 -1.2464218144951260e-02 -1.7920356651444137e-02 -8.7740727804043270e-03 6.1761463916520281e-03 -1.5838238775094070e-02 -1.0519104544841420e-02 1.6823473323718800e-02 1.4411313069090563e-02 5.1409619620914337e-02 -8.9330471614397361e-03 1.9190530918348922e-02 -3.2106771162894480e-03 -1.5599747531946092e-02 -1.1520873205378668e-02 -2.7472276149806470e-02 4.6245841182786136e-03 -1.4923614283415461e-02 -3.1529853901580730e-02 7.3991666574818593e-03 1.2415386539084788e-02 4.2642167850609272e-03 1.1637670454720892e-02 -1.1315078617167771e-02 -5.3416891174550615e-03 -5.0081083604378539e-04 4.1779125793865637e-03 -1.3275034185267716e-04 -1.2384006157815833e-02 1.3956386118928313e-02 -2.6281518179507168e-04 -1.0739495813571285e-02 2.6565968843144565e-04 -8.9330471614397378e-03 3.5315754146764147e-02 -1.5163082792556570e-02 3.2826623370748182e-04 -1.3064252639759086e-03 -6.6153829097118774e-03 5.6980128187511907e-03 -1.5946218641252619e-02 1.0493859346937008e-02 8.7200328490546937e-03 -6.0764678888256141e-03 4.1997265857528889e-03 -7.6010098970820037e-05 -1.0822069926643162e-02 2.4542072959701594e-02 1.3970353459085073e-02 -1.1658304293108605e-02 -4.0536584383498275e-02 1.6413061943360027e-03 1.4565480949385073e-02 -3.9658450669756651e-02 8.8702837787154329e-04 1.2771667398253025e-02 1.2737982543109441e-02 1.9190530918348922e-02 -1.5163082792556567e-02 6.5597629371583976e-02 -2.4250429156030562e-04 -7.1498547277108271e-03 -2.7424448989438809e-02 -1.4996184492723930e-02 1.4329018432686622e-02 -2.8914020938474772e-02 -2.0070891479746906e-02 3.1271449596944438e-03 3.3655820106773496e-02 -3.7963868561039882e-04 -5.5589223424386955e-03 1.3804968581617970e-02 4.0463654961138068e-03 1.5118642717414557e-04 9.8527325965619829e-04 -8.1038062896009230e-03 -1.7410735210529482e-04 6.5280243089835092e-04 -6.3219945901773324e-03 -3.9040209785908176e-03 6.4160926766958989e-03 -3.2106771162894484e-03 3.2826623370748182e-04 -2.4250429156030562e-04 2.8994940002719301e-02 5.4904907406588283e-03 -1.4130422891188078e-02 -9.8832363110695504e-03 3.5130378610170169e-03 -6.9062166620812663e-03 -9.4994599991249547e-03 1.5406941057733787e-04 -5.7999310403876534e-04 3.9778688074291043e-03 -3.8207546654262696e-04 -6.6654805850703625e-03 -8.8433580026699137e-03 1.8201602806741168e-02 1.4307230833306846e-02 6.7785027453561280e-03 -9.6295450425373900e-03 1.3373793939594040e-02 -3.7467192700162849e-03 -1.7750925047537735e-02 -9.6734938272469029e-03 -1.5599747531946092e-02 -1.3064252639759071e-03 -7.1498547277108254e-03 5.4904907406588283e-03 3.8379593255246716e-02 9.7687982289066475e-03 1.7043914232664419e-02 -5.6379504760079788e-03 2.7201743784456968e-03 3.3341462642319875e-03 -2.1874274765386253e-02 -1.6681168240225138e-02 -4.4572291782790704e-03 2.0208327248338199e-03 -1.6921208483147026e-02 -1.3601482723131750e-02 1.3023913502688304e-02 2.0226805612135249e-02 1.1410129790280221e-02 6.3268504135492590e-04 1.3942873531949491e-02 6.6972082933206582e-03 -8.4794683552777191e-03 -1.3365391471906603e-02 -1.1520873205378666e-02 -6.6153829097118774e-03 -2.7424448989438816e-02 -1.4130422891188082e-02 9.7687982289066458e-03 3.3782958587329395e-02 1.3443195761922058e-02 1.8386765632096014e-03 1.3486834214136462e-02 1.3639401259242279e-02 -1.2190054796003706e-02 -2.3728423001058162e-02 -5.9371562850667210e-03 4.2571793506586183e-03 -1.5595633479013901e-02 -3.1346677675033637e-02 8.8246913319918133e-03 1.3911178554761941e-02 4.4708131238451439e-03 -9.2734043129640408e-03 1.9919087511669126e-02 -1.6433591845218698e-03 -1.5341286655780523e-02 -1.2941324778009560e-02 -2.7472276149806470e-02 5.6980128187511924e-03 -1.4996184492723934e-02 -9.8832363110695504e-03 1.7043914232664419e-02 1.3443195761922060e-02 4.8942664140425925e-02 7.6817984249498384e-04 1.3983372637075366e-02 2.6324971464615314e-02 -1.1977286607816462e-02 -1.7723691715681104e-02 -9.3928994084548616e-03 -1.2607731675392265e-02 8.8634350901449499e-03 1.2182436926349714e-02 -9.9934404589814146e-03 -7.5302605794660849e-03 5.1078964345037539e-03 1.2919906760377445e-02 -1.2176044519992170e-02 -4.9667563898634099e-03 -4.0324428377315534e-04 2.5260683783304648e-03 4.6245841182786128e-03 -1.5946218641252619e-02 1.4329018432686622e-02 3.5130378610170165e-03 -5.6379504760079770e-03 1.8386765632096022e-03 7.6817984249498514e-04 3.3004008078733063e-02 -9.0106833385805996e-03 -1.3097623927859884e-02 -1.3353293037030771e-03 1.1597899736672137e-03 -8.1317548649207892e-03 7.8109906600988344e-03 -1.6536242867679546e-02 -1.4503183270529012e-02 4.4825640784412757e-03 1.5968871870902235e-02 5.7133849959126676e-03 -1.1061421400783651e-02 2.5518986022975695e-02 1.3002751785455411e-02 -6.0696370339963276e-03 -1.7360456394464881e-02 -1.4923614283415461e-02 1.0493859346937006e-02 -2.8914020938474772e-02 -6.9062166620812680e-03 2.7201743784456968e-03 1.3486834214136458e-02 1.3983372637075366e-02 -9.0106833385805961e-03 3.7544939714868192e-02 1.6731842732795703e-02 6.3415330943775898e-04 -2.9708911622263384e-02 -1.3098337935213408e-02 1.1579176550032287e-02 -1.5662428355543580e-02 -2.7939427363974100e-02 1.2985348737010148e-02 1.8004109594554601e-02 -1.8883851748720294e-03 -6.3865253240925537e-03 1.5689600635504734e-02 5.1852725760919999e-03 -8.6521333665453629e-03 -1.4586622120432071e-02 -3.1529853901580730e-02 8.7200328490546937e-03 -2.0070891479746906e-02 -9.4994599991249564e-03 3.3341462642319875e-03 1.3639401259242279e-02 2.6324971464615311e-02 -1.3097623927859885e-02 1.6731842732795706e-02 4.9629309609660451e-02 -8.4824217818313206e-03 -1.3745012266374762e-02 -1.0282427210815945e-02 -1.0874839728240281e-02 4.6459966556325607e-03 1.2371133953382341e-02 -1.8224161680516951e-02 -1.7713985788971463e-02 7.8693502838767199e-04 -6.4951565040668080e-04 -1.1531228145237717e-02 2.5531569784480315e-04 1.7361004030446502e-02 1.3597605032212088e-02 7.3991666574818593e-03 -6.0764678888256141e-03 3.1271449596944438e-03 1.5406941057733798e-04 -2.1874274765386247e-02 -1.2190054796003706e-02 -1.1977286607816462e-02 -1.3353293037030789e-03 6.3415330943775898e-04 -8.4824217818313188e-03 4.1673584986632366e-02 1.9430368773236041e-02 -5.0691235802623484e-04 -7.0570127754367475e-03 1.4438954948979121e-02 1.7427287928775553e-02 -1.8353424604079578e-02 -3.3327793704639570e-02 1.3650288335359537e-03 4.2096395618287531e-03 -4.0781188068603938e-02 1.2256782043293304e-03 1.3092080725256573e-02 2.0360013837363036e-02 1.2415386539084786e-02 4.1997265857528897e-03 3.3655820106773496e-02 -5.7999310403876523e-04 -1.6681168240225138e-02 -2.3728423001058162e-02 -1.7723691715681104e-02 1.1597899736672129e-03 -2.9708911622263388e-02 -1.3745012266374762e-02 1.9430368773236038e-02 5.9091527503449398e-02 -3.8468441963099422e-04 5.1287533831285330e-03 5.5883014141616056e-03 -3.1497565409439139e-03 4.5774548758223551e-04 8.3422779461694635e-04 -6.2684476282145827e-03 -1.7646234304754548e-04 1.0157841837535608e-03 -8.2157032355320500e-03 7.7618699725336910e-03 1.2361503932989411e-02 4.2642167850609272e-03 -7.6010098970819793e-05 -3.7963868561040033e-04 3.9778688074291052e-03 -4.4572291782790704e-03 -5.9371562850667210e-03 -9.3928994084548634e-03 -8.1317548649207892e-03 -1.3098337935213408e-02 -1.0282427210815948e-02 -5.0691235802623517e-04 -3.8468441963099450e-04 2.9067148431471325e-02 189 190 191 261 262 263 687 688 689 621 622 623 462 463 464 660 661 662 666 667 668 504 505 506 1.8490945286991928e-02 -4.4971967401162685e-04 -7.6920982038869413e-04 -4.7707003150469132e-03 -5.4683142099156796e-03 -9.1830019996668750e-03 -5.2365611941376988e-03 1.0347453582210391e-03 4.9706887681932275e-05 7.2062422395003929e-04 5.4397244898515681e-03 8.2651894649731859e-03 1.1828001666894096e-03 -4.9122234964475947e-04 -2.6043805563044284e-04 -5.2192833959392596e-03 -2.2681464237970443e-03 -4.3151181261694869e-03 -3.3359958810359421e-03 5.1342273028430756e-04 9.9422513275882114e-04 -1.8318288914715617e-03 1.6895100790121961e-03 5.2186465164415574e-03 -4.4971967401162631e-04 2.5200977304612959e-02 1.1253657411678530e-02 -6.2155911085149153e-03 -1.1952066550984871e-02 -5.3297632613700414e-03 6.1180080513159921e-04 -2.1815167311467772e-02 -6.9650831425969164e-03 6.4004175394429697e-03 -3.5615476124503426e-04 2.9152547198843057e-03 -1.3049810620117471e-03 1.4910965390563889e-02 1.3484736703980774e-02 -7.1972883420625021e-03 -2.3696495238937532e-03 -6.2528376311817525e-03 9.7826651197332527e-04 -9.1664848258915105e-03 -1.0795474879407092e-02 7.1770953300528970e-03 5.5475802783060864e-03 1.6895100790121956e-03 -7.6920982038869434e-04 1.1253657411678534e-02 3.7733583750268876e-02 -1.0137439025576856e-02 -5.7670356402044392e-03 -4.0833498053503324e-03 6.9295437664615358e-04 -1.9408384633479759e-02 -5.7254623534966926e-03 8.6711109751931043e-03 2.9954683042053118e-03 2.0154513508172846e-02 -5.2956712374915100e-04 1.2445566842601494e-02 -1.0311435509988199e-03 -1.2727136120126364e-02 1.3242589630991933e-03 -2.3901108139046744e-02 1.7037062675285888e-03 -1.0020626577953240e-02 -2.1315204518077561e-02 1.3095580470473213e-02 7.1770953300528944e-03 -1.8318288914715608e-03 -4.7707003150469132e-03 -6.2155911085149153e-03 -1.0137439025576855e-02 3.7004130829188520e-02 1.1589801370585785e-02 -1.5219629169213277e-03 2.2405161139471474e-03 1.5635925907988513e-02 1.4242805344060817e-04 -2.4740015547231129e-02 1.9131419298794652e-04 -1.3547773669142327e-02 -5.8741566904831326e-03 -1.9150509574725059e-02 8.3410694626117514e-04 1.8967482234434445e-02 1.5631034170084275e-03 8.8617983377704494e-03 -1.5120521067313807e-03 7.1814306740764031e-03 1.4374617141409453e-02 -2.1315204518077564e-02 -1.0795474879407090e-02 9.9422513275882049e-04 -5.4683142099156788e-03 -1.1952066550984870e-02 -5.7670356402044392e-03 1.1589801370585786e-02 2.3764145219659707e-02 -1.0014665493540166e-03 1.2078940834492910e-02 1.8123531134747600e-02 -8.2100639258866047e-04 -6.6046462892934664e-03 -2.7600248085732533e-03 -7.3994214732186247e-03 -6.5297687488462776e-03 -2.2647562701134782e-02 1.2236086852430576e-03 3.0892563533145762e-03 -2.0483937925445551e-03 6.0704679657619708e-03 1.8653572676153973e-03 6.6868563247216633e-03 7.1814306740764014e-03 -1.0020626577953239e-02 -9.1664848258915087e-03 5.1342273028430723e-04 -9.1830019996668750e-03 -5.3297632613700414e-03 -4.0833498053503350e-03 -1.5219629169213281e-03 -1.0014665493540157e-03 1.7073208863205958e-02 -9.7773854172664973e-05 -1.6848135804759707e-03 3.2253748943071609e-03 -3.9453454986927983e-03 -2.7875146788491007e-03 -4.3788249581279996e-03 7.7445767641374651e-04 2.0031015870020283e-03 -6.2444761902885667e-03 7.3214648313142394e-03 5.9568327034583788e-03 -7.4388481597890250e-04 4.9484554941970947e-03 1.8653572676154008e-03 -1.5120521067313749e-03 1.7037062675285834e-03 9.7826651197332136e-04 -3.3359958810359400e-03 -5.2365611941376979e-03 6.1180080513159867e-04 6.9295437664615401e-04 2.2405161139471470e-03 1.2078940834492909e-02 -9.7773854172665135e-05 2.1329266123263736e-02 -3.1832979015277677e-04 2.7184673745431784e-04 -3.4695048642912263e-03 -1.2028129426682244e-02 -3.7897894396517532e-04 -6.4993037609183809e-03 5.6120830957112232e-04 9.3037880940853059e-05 -5.8643249586740357e-03 6.8805988028249627e-03 -7.7322113802603043e-04 3.2253748943071609e-03 -8.2100639258865494e-04 1.4242805344061340e-04 -5.7254623534966952e-03 -6.9650831425969182e-03 4.9706887681932017e-05 1.0347453582210382e-03 -2.1815167311467775e-02 -1.9408384633479756e-02 1.5635925907988513e-02 1.8123531134747600e-02 -1.6848135804759705e-03 -3.1832979015277628e-04 6.2121493314243686e-02 -3.1832979015278387e-04 -1.5440902867744315e-02 2.2215794041189904e-03 -1.5440902867744324e-02 1.4658898072991990e-03 -4.2954997388576964e-02 1.4658898072992010e-03 1.8715869798344081e-02 -1.4004802976345364e-02 1.8715869798344078e-02 -1.6848135804759801e-03 1.8123531134747600e-02 1.5635925907988516e-02 -1.9408384633479756e-02 -2.1815167311467765e-02 1.0347453582210348e-03 4.9706887681932248e-05 -6.9650831425969173e-03 -5.7254623534966917e-03 1.4242805344060844e-04 -8.2100639258866047e-04 3.2253748943071613e-03 2.7184673745431844e-04 -3.1832979015278387e-04 2.1329266123263732e-02 -3.7897894396516989e-04 -1.2028129426682247e-02 -3.4695048642912206e-03 9.3037880940852205e-05 5.6120830957113121e-04 -6.4993037609183809e-03 -7.7322113802603682e-04 6.8805988028249635e-03 -5.8643249586740418e-03 -9.7773854172664187e-05 1.2078940834492907e-02 2.2405161139471413e-03 6.9295437664615867e-04 6.1180080513160225e-04 -5.2365611941376953e-03 7.2062422395004016e-04 6.4004175394429697e-03 8.6711109751931026e-03 -2.4740015547231129e-02 -6.6046462892934664e-03 -3.9453454986927983e-03 -3.4695048642912263e-03 -1.5440902867744315e-02 -3.7897894396517000e-04 4.2965727345942048e-02 -4.4756189026581581e-03 1.9418975002272878e-02 -8.2527825394364748e-03 1.8908419505332223e-02 -1.6437758812212846e-03 -2.2999737168978095e-02 5.6964977682550585e-03 -1.6839401449417590e-02 -4.3788249581279970e-03 -7.3994214732186229e-03 -1.3547773669142324e-02 2.0154513508172836e-02 2.9152547198843005e-03 8.2651894649731928e-03 5.4397244898515681e-03 -3.5615476124503274e-04 2.9954683042053118e-03 1.9131419298794804e-04 -2.7600248085732533e-03 -2.7875146788491007e-03 -1.2028129426682244e-02 2.2215794041189904e-03 -1.2028129426682244e-02 -4.4756189026581581e-03 2.5270400925500494e-02 -4.4756189026581615e-03 6.9069456537973967e-03 -1.4044877565572430e-02 6.9069456537973993e-03 3.7578103673472805e-03 -7.2147436244104756e-03 3.7578103673472796e-03 -2.7875146788491020e-03 -2.7600248085732550e-03 1.9131419298794696e-04 2.9954683042053070e-03 -3.5615476124503383e-04 5.4397244898515672e-03 8.2651894649731876e-03 2.9152547198843057e-03 2.0154513508172846e-02 -1.3547773669142329e-02 -7.3994214732186247e-03 -4.3788249581279996e-03 -3.7897894396517407e-04 -1.5440902867744320e-02 -3.4695048642912215e-03 1.9418975002272874e-02 -4.4756189026581615e-03 4.2965727345942055e-02 -1.6437758812212822e-03 1.8908419505332227e-02 -8.2527825394364783e-03 -1.6839401449417604e-02 5.6964977682550629e-03 -2.2999737168978098e-02 -3.9453454986927905e-03 -6.6046462892934690e-03 -2.4740015547231133e-02 8.6711109751931095e-03 6.4004175394429697e-03 7.2062422395003896e-04 1.1828001666894087e-03 -1.3049810620117471e-03 -5.2956712374915111e-04 -5.8741566904831309e-03 -6.5297687488462784e-03 7.7445767641374651e-04 -6.4993037609183809e-03 1.4658898072991992e-03 9.3037880940852327e-05 -8.2527825394364748e-03 6.9069456537973967e-03 -1.6437758812212831e-03 2.7358093936791318e-02 -1.6939384913255391e-03 2.2983150558595367e-04 -6.3903137135535280e-04 -1.3552492548136858e-02 5.0234705139915088e-04 -6.2444761902885667e-03 1.2236086852430563e-03 8.3410694626117352e-04 -1.0311435509988203e-03 1.3484736703980770e-02 -2.6043805563044349e-04 -4.9122234964475969e-04 1.4910965390563889e-02 1.2445566842601495e-02 -1.9150509574725059e-02 -2.2647562701134775e-02 2.0031015870020279e-03 5.6120830957112199e-04 -4.2954997388576964e-02 5.6120830957113164e-04 1.8908419505332220e-02 -1.4044877565572430e-02 1.8908419505332227e-02 -1.6939384913255398e-03 6.6896735527214535e-02 -1.6939384913255420e-03 -1.2582625828811526e-02 5.5763340480766586e-03 -1.2582625828811516e-02 2.0031015870020366e-03 -2.2647562701134778e-02 -1.9150509574725059e-02 1.2445566842601497e-02 1.4910965390563883e-02 -4.9122234964475730e-04 -2.6043805563044284e-04 1.3484736703980772e-02 -1.0311435509988203e-03 8.3410694626117503e-04 1.2236086852430578e-03 -6.2444761902885667e-03 9.3037880940853086e-05 1.4658898072992014e-03 -6.4993037609183809e-03 -1.6437758812212844e-03 6.9069456537973993e-03 -8.2527825394364766e-03 2.2983150558595367e-04 -1.6939384913255418e-03 2.7358093936791311e-02 5.0234705139915207e-04 -1.3552492548136860e-02 -6.3903137135535107e-04 7.7445767641374673e-04 -6.5297687488462784e-03 -5.8741566904831309e-03 -5.2956712374915328e-04 -1.3049810620117479e-03 1.1828001666894076e-03 -5.2192833959392596e-03 -7.1972883420625012e-03 -1.2727136120126364e-02 1.8967482234434445e-02 3.0892563533145758e-03 7.3214648313142377e-03 -5.8643249586740357e-03 1.8715869798344081e-02 -7.7322113802603758e-04 -2.2999737168978095e-02 3.7578103673472801e-03 -1.6839401449417601e-02 -6.3903137135535356e-04 -1.2582625828811530e-02 5.0234705139915185e-04 4.0399887615537949e-02 -5.6006526827121232e-03 1.7969266613255638e-02 -7.4388481597890542e-04 6.0704679657619708e-03 8.8617983377704563e-03 -2.3901108139046747e-02 -6.2528376311817525e-03 -4.3151181261694895e-03 -2.2681464237970443e-03 -2.3696495238937536e-03 1.3242589630991929e-03 1.5631034170084262e-03 -2.0483937925445551e-03 5.9568327034583788e-03 6.8805988028249618e-03 -1.4004802976345366e-02 6.8805988028249635e-03 5.6964977682550603e-03 -7.2147436244104765e-03 5.6964977682550629e-03 -1.3552492548136856e-02 5.5763340480766586e-03 -1.3552492548136862e-02 -5.6006526827121232e-03 2.4479299185555796e-02 -5.6006526827121232e-03 5.9568327034583797e-03 -2.0483937925445529e-03 1.5631034170084262e-03 1.3242589630991942e-03 -2.3696495238937519e-03 -2.2681464237970417e-03 -4.3151181261694860e-03 -6.2528376311817525e-03 -2.3901108139046744e-02 8.8617983377704476e-03 6.0704679657619691e-03 -7.4388481597890380e-04 -7.7322113802603054e-04 1.8715869798344078e-02 -5.8643249586740427e-03 -1.6839401449417590e-02 3.7578103673472792e-03 -2.2999737168978098e-02 5.0234705139915120e-04 -1.2582625828811516e-02 -6.3903137135535052e-04 1.7969266613255638e-02 -5.6006526827121223e-03 4.0399887615537956e-02 7.3214648313142333e-03 3.0892563533145736e-03 1.8967482234434441e-02 -1.2727136120126362e-02 -7.1972883420624986e-03 -5.2192833959392596e-03 -3.3359958810359421e-03 9.7826651197332527e-04 1.7037062675285893e-03 -1.5120521067313801e-03 1.8653572676153975e-03 4.9484554941970947e-03 3.2253748943071609e-03 -1.6848135804759803e-03 -9.7773854172664132e-05 -4.3788249581279970e-03 -2.7875146788491015e-03 -3.9453454986927896e-03 -6.2444761902885684e-03 2.0031015870020366e-03 7.7445767641374629e-04 -7.4388481597890597e-04 5.9568327034583797e-03 7.3214648313142333e-03 1.7073208863205961e-02 -1.0014665493540179e-03 -1.5219629169213322e-03 -4.0833498053503298e-03 -5.3297632613700380e-03 -9.1830019996668767e-03 5.1342273028430756e-04 -9.1664848258915105e-03 -1.0020626577953240e-02 7.1814306740764031e-03 6.6868563247216642e-03 1.8653572676154010e-03 -8.2100639258865494e-04 1.8123531134747600e-02 1.2078940834492903e-02 -7.3994214732186229e-03 -2.7600248085732550e-03 -6.6046462892934690e-03 1.2236086852430558e-03 -2.2647562701134782e-02 -6.5297687488462793e-03 6.0704679657619708e-03 -2.0483937925445525e-03 3.0892563533145741e-03 -1.0014665493540179e-03 2.3764145219659711e-02 1.1589801370585781e-02 -5.7670356402044409e-03 -1.1952066550984866e-02 -5.4683142099156788e-03 9.9422513275882114e-04 -1.0795474879407092e-02 -2.1315204518077561e-02 1.4374617141409453e-02 7.1814306740764031e-03 -1.5120521067313747e-03 1.4242805344061356e-04 1.5635925907988516e-02 2.2405161139471400e-03 -1.3547773669142324e-02 1.9131419298794652e-04 -2.4740015547231133e-02 8.3410694626117341e-04 -1.9150509574725059e-02 -5.8741566904831326e-03 8.8617983377704546e-03 1.5631034170084275e-03 1.8967482234434441e-02 -1.5219629169213322e-03 1.1589801370585785e-02 3.7004130829188533e-02 -1.0137439025576855e-02 -6.2155911085149135e-03 -4.7707003150469105e-03 -1.8318288914715617e-03 7.1770953300528961e-03 1.3095580470473213e-02 -2.1315204518077557e-02 -1.0020626577953240e-02 1.7037062675285832e-03 -5.7254623534966943e-03 -1.9408384633479756e-02 6.9295437664615932e-04 2.0154513508172836e-02 2.9954683042053070e-03 8.6711109751931095e-03 -1.0311435509988167e-03 1.2445566842601501e-02 -5.2956712374915306e-04 -2.3901108139046740e-02 1.3242589630991937e-03 -1.2727136120126364e-02 -4.0833498053503298e-03 -5.7670356402044400e-03 -1.0137439025576849e-02 3.7733583750268869e-02 1.1253657411678527e-02 -7.6920982038869261e-04 1.6895100790121956e-03 5.5475802783060881e-03 7.1770953300528944e-03 -1.0795474879407090e-02 -9.1664848258915087e-03 9.7826651197332158e-04 -6.9650831425969182e-03 -2.1815167311467765e-02 6.1180080513160268e-04 2.9152547198843014e-03 -3.5615476124503534e-04 6.4004175394429697e-03 1.3484736703980770e-02 1.4910965390563885e-02 -1.3049810620117477e-03 -6.2528376311817516e-03 -2.3696495238937519e-03 -7.1972883420624977e-03 -5.3297632613700380e-03 -1.1952066550984870e-02 -6.2155911085149135e-03 1.1253657411678530e-02 2.5200977304612952e-02 -4.4971967401162598e-04 5.2186465164415574e-03 1.6895100790121956e-03 -1.8318288914715606e-03 9.9422513275882049e-04 5.1342273028430734e-04 -3.3359958810359400e-03 4.9706887681932017e-05 1.0347453582210356e-03 -5.2365611941376953e-03 8.2651894649731928e-03 5.4397244898515672e-03 7.2062422395003864e-04 -2.6043805563044338e-04 -4.9122234964475665e-04 1.1828001666894078e-03 -4.3151181261694895e-03 -2.2681464237970421e-03 -5.2192833959392605e-03 -9.1830019996668767e-03 -5.4683142099156805e-03 -4.7707003150469105e-03 -7.6920982038869261e-04 -4.4971967401162560e-04 1.8490945286991921e-02 621 622 623 687 688 689 699 700 701 633 634 635 504 505 506 666 667 668 669 670 671 507 508 509 2.1492478255534894e-02 -2.4282001302020216e-03 -4.3577929763357112e-03 -2.9253288646952707e-03 -4.1427589078107596e-03 -9.3992340761234437e-03 -7.0698047215090069e-03 4.9871610985428496e-03 1.4341253381950400e-03 -2.2329115867653045e-03 5.2841574566307769e-03 7.0796979151765554e-03 3.8259700411415968e-03 -3.3834984176498595e-03 -2.1209168069805983e-03 -2.7378711341974546e-03 -2.4733769615201953e-03 -2.2007060861499498e-03 -5.0585319282494120e-03 2.2707717219881090e-03 4.2857822581373372e-03 -5.2940000612600379e-03 -1.1425585997889602e-04 5.2790444340807732e-03 -2.4282001302020216e-03 2.7838008013246200e-02 1.2599111282276676e-02 -5.0942288761022126e-03 -1.6054667137097491e-02 -8.1213464365842113e-03 3.5078019636894187e-03 -2.2932131690466196e-02 -8.2878903385291119e-03 6.2767512225361099e-03 2.5486888620197753e-03 5.4366055212856012e-03 -4.3057096355477199e-03 1.6965844840781369e-02 1.4439304170869803e-02 -7.4701961908961818e-03 -5.1009975754308916e-03 -7.9454029501545790e-03 2.9328029912062208e-03 -1.0220323570929094e-02 -1.1692131374153120e-02 6.5809786553163848e-03 6.9555782578763206e-03 3.5717501249889409e-03 -4.3577929763357120e-03 1.2599111282276677e-02 4.2486919979450685e-02 -1.0558929814881803e-02 -8.8637766578197382e-03 -7.6199406333467877e-03 3.5598574264792643e-03 -2.0525840538230027e-02 -9.1088811590458001e-03 7.4681519838286610e-03 5.4943465493640159e-03 2.2092101590912426e-02 -2.2808429119785447e-03 1.3648787626627832e-02 3.3389963331755001e-03 -1.2626491467707069e-02 -2.0016674868444159e-03 -2.6091574802098054e-02 5.1000757028442159e-03 -1.0778806605860740e-02 -2.4326675700668710e-02 1.3695972057750984e-02 1.0427845830486384e-02 -7.7094560837925896e-04 -2.9253288646952716e-03 -5.0942288761022126e-03 -1.0558929814881803e-02 3.8135431511856582e-02 1.5089077725253790e-02 5.0638781595917161e-04 -1.0593756809137336e-03 1.3788289011376713e-02 1.2958385743035716e-03 -2.4957914582786449e-02 -4.1142940356862197e-03 -1.4320767816400799e-02 -3.0726186156389470e-03 -1.7538655359682818e-02 -9.2842591311027042e-04 2.0329737191979662e-02 5.2784108805521814e-03 9.8693092684127466e-03 -5.0206786718402872e-03 6.4081710452346761e-03 1.4832258599282002e-02 -2.1429252287961553e-02 -1.3816770390946097e-02 -6.9567071356461062e-04 -4.1427589078107596e-03 -1.6054667137097495e-02 -8.8637766578197382e-03 1.5089077725253789e-02 3.0659476854617850e-02 3.9444554827622352e-04 1.0024678634876126e-02 2.3152522404529408e-02 1.3062027967885386e-03 -1.0267747165231943e-02 -6.3990381744707166e-03 -1.0192279510912597e-02 -4.2742327695239786e-03 -2.7141939573926806e-02 -8.2431035183578769e-04 6.9262119646158644e-03 2.0565171758385719e-03 7.9346442878692365e-03 -2.2938497930464520e-04 8.1781515547085445e-03 1.0752307616539950e-02 -1.3125844502874450e-02 -1.4451023104199347e-02 -5.0723372890581597e-04 -9.3992340761234437e-03 -8.1213464365842130e-03 -7.6199406333467877e-03 5.0638781595917150e-04 3.9444554827622330e-04 1.8838943207373584e-02 9.1632520128114286e-04 7.1113198502446753e-04 3.5507642095376534e-03 -5.4210194907436992e-03 -3.6004800085463885e-03 -7.2705652728579945e-03 1.3077424710945300e-04 -3.1838170870987249e-04 -6.3134251696911814e-03 8.3193891338265522e-03 7.2376285916995430e-03 2.9302415384059597e-03 5.0473387139581653e-03 3.7594128750015870e-03 -5.7466109604968000e-05 -9.9961545267342699e-05 -6.2410846161346632e-05 -4.0585517698162642e-03 -7.0698047215090078e-03 3.5078019636894187e-03 3.5598574264792647e-03 -1.0593756809137358e-03 1.0024678634876126e-02 9.1632520128114242e-04 2.2209243314944296e-02 -5.3943460476723578e-03 -1.9178525741037614e-04 -2.1336384316593777e-03 -1.1583908912260629e-02 6.2721631002313064e-04 -6.9165621896844385e-03 5.1335178816544706e-03 3.8580721891751265e-04 -7.3049714158119625e-03 6.8136656365702488e-03 -2.7124936767762391e-03 5.2768783880730143e-03 -3.8249300504262225e-03 -2.1668280702552443e-03 -3.0017692634387938e-03 -4.6764791064310566e-03 -4.1809915225919344e-04 4.9871610985428496e-03 -2.2932131690466196e-02 -2.0525840538230030e-02 1.3788289011376714e-02 2.3152522404529405e-02 7.1113198502446742e-04 -5.3943460476723578e-03 6.0427025459354092e-02 3.1851265358686784e-03 -1.4495051073848408e-02 -6.4746808301924296e-03 -1.5575281568712787e-02 5.7026155678317585e-03 -4.0659216560235946e-02 -1.8464407715964735e-03 1.8257115110693545e-02 -5.8934222535260913e-03 1.8683598772963231e-02 -5.0234367955494918e-03 1.9064911265989189e-02 1.6589216486888377e-02 -1.7822346871374611e-02 -2.6685007795452013e-02 -1.2215109022054526e-03 1.4341253381950398e-03 -8.2878903385291119e-03 -9.1088811590458001e-03 1.2958385743035714e-03 1.3062027967885388e-03 3.5507642095376529e-03 -1.9178525741037593e-04 3.1851265358686766e-03 2.1738194945521757e-02 -1.2752175199496826e-05 -1.2498069319663196e-02 -8.0890157864959896e-03 5.0667870205952444e-04 -2.3917007671055150e-03 -6.2023721399483605e-03 -7.0265307625202349e-05 6.5776864407450421e-03 -1.9442299442683259e-03 -1.9816159295879634e-03 1.3257805129595677e-02 5.8260048377258879e-03 -9.8022394473509756e-04 -1.1491604777001130e-03 -5.7704649630268313e-03 -2.2329115867653045e-03 6.2767512225361099e-03 7.4681519838286619e-03 -2.4957914582786449e-02 -1.0267747165231942e-02 -5.4210194907437000e-03 -2.1336384316593777e-03 -1.4495051073848408e-02 -1.2752175199496555e-05 4.2082350293087781e-02 8.8817532717037841e-05 1.9495731888122408e-02 -9.2932330162112612e-03 1.7932947235809328e-02 -7.9764469281147607e-04 -2.2224516555130219e-02 1.4342391985529210e-03 -1.6938999450056079e-02 -1.8394630779364368e-03 -7.3293601768460474e-03 -1.2978305462816656e-02 2.0599326957401274e-02 6.3594032263109912e-03 9.1848373996763280e-03 5.2841574566307760e-03 2.5486888620197762e-03 5.4943465493640167e-03 -4.1142940356862197e-03 -6.3990381744707140e-03 -3.6004800085463885e-03 -1.1583908912260629e-02 -6.4746808301924287e-03 -1.2498069319663196e-02 8.8817532717036269e-05 2.4240132719570446e-02 2.4573936807545404e-04 6.4219894202785302e-03 -6.0389767455611039e-03 6.5402478006706677e-03 -2.4950255453625548e-04 -5.6328768285906997e-03 -2.0199827681910561e-04 -2.5224919720308082e-03 -5.6106715350998293e-03 -3.2036285971463090e-03 6.6752330648875702e-03 3.3674225323245552e-03 7.2238424840648597e-03 7.0796979151765554e-03 5.4366055212856004e-03 2.2092101590912423e-02 -1.4320767816400801e-02 -1.0192279510912597e-02 -7.2705652728579954e-03 6.2721631002313108e-04 -1.5575281568712787e-02 -8.0890157864959913e-03 1.9495731888122411e-02 2.4573936807545442e-04 4.4247921080984194e-02 -3.3610667592325113e-03 1.8610913264239151e-02 -4.0342418245699384e-03 -1.7343262648596661e-02 1.5736544168748505e-03 -2.3768267698025935e-02 -1.6102030365877553e-03 -8.1085683555888639e-03 -2.6862644397978239e-02 9.4326541474956289e-03 8.0092168647391809e-03 3.6847123080314664e-03 3.8259700411415972e-03 -4.3057096355477199e-03 -2.2808429119785447e-03 -3.0726186156389470e-03 -4.2742327695239812e-03 1.3077424710945300e-04 -6.9165621896844385e-03 5.7026155678317576e-03 5.0667870205952444e-04 -9.2932330162112612e-03 6.4219894202785293e-03 -3.3610667592325113e-03 2.7483907463772078e-02 -6.1910013324639529e-03 -1.7533679451330828e-04 -8.3680769612834004e-05 -1.2804589859712364e-02 8.6279761940046928e-04 -8.0757711387904191e-03 3.9176511705464202e-03 3.5504062296249040e-03 -3.8680117749757673e-03 1.1533277438591314e-02 7.6658966753001393e-04 -3.3834984176498591e-03 1.6965844840781369e-02 1.3648787626627835e-02 -1.7538655359682818e-02 -2.7141939573926806e-02 -3.1838170870987249e-04 5.1335178816544714e-03 -4.0659216560235946e-02 -2.3917007671055155e-03 1.7932947235809321e-02 -6.0389767455611056e-03 1.8610913264239151e-02 -6.1910013324639520e-03 6.3685187990031700e-02 2.0788744876339043e-03 -1.2308717149123422e-02 -3.4141809255946688e-03 -1.2869809167728587e-02 5.9024606697511391e-03 -2.3005354932555129e-02 -2.0099035575720708e-02 1.0452946471705115e-02 1.9608635907060568e-02 1.3403518407637829e-03 -2.1209168069805983e-03 1.4439304170869804e-02 3.3389963331754966e-03 -9.2842591311026999e-04 -8.2431035183578737e-04 -6.3134251696911814e-03 3.8580721891751281e-04 -1.8464407715964733e-03 -6.2023721399483613e-03 -7.9764469281147748e-04 6.5402478006706677e-03 -4.0342418245699401e-03 -1.7533679451330815e-04 2.0788744876339038e-03 2.6523764060072806e-02 9.6498087650667523e-04 -1.3414556073292533e-02 -5.7455677517411607e-03 2.0924462043975700e-03 -7.7219475563211244e-03 -9.1410018373660022e-03 5.7908990759389660e-04 7.4882829387154092e-04 1.5738483300683373e-03 -2.7378711341974533e-03 -7.4701961908961827e-03 -1.2626491467707068e-02 2.0329737191979662e-02 6.9262119646158662e-03 8.3193891338265522e-03 -7.3049714158119634e-03 1.8257115110693545e-02 -7.0265307625201156e-05 -2.2224516555130219e-02 -2.4950255453625570e-04 -1.7343262648596661e-02 -8.3680769612834655e-05 -1.2308717149123422e-02 9.6498087650667512e-04 3.9979448997634878e-02 -1.1378314130295040e-03 1.8454721358122421e-02 -3.5361682791543261e-03 5.9137462229014162e-03 7.9815880379912798e-03 -2.4421978035707736e-02 -9.9308259906254505e-03 -5.6806599825179969e-03 -2.4733769615201957e-03 -5.1009975754308908e-03 -2.0016674868444154e-03 5.2784108805521814e-03 2.0565171758385710e-03 7.2376285916995430e-03 6.8136656365702488e-03 -5.8934222535260913e-03 6.5776864407450421e-03 1.4342391985529210e-03 -5.6328768285907006e-03 1.5736544168748507e-03 -1.2804589859712364e-02 -3.4141809255946692e-03 -1.3414556073292533e-02 -1.1378314130295044e-03 2.2503908123131178e-02 -1.0856170134443169e-03 5.7889703568272223e-03 1.2023107729622719e-03 4.1533656766616417e-03 -2.8994878382405122e-03 -5.7212584887896692e-03 -3.0404945523998124e-03 -2.2007060861499489e-03 -7.9454029501545790e-03 -2.6091574802098054e-02 9.8693092684127466e-03 7.9346442878692348e-03 2.9302415384059566e-03 -2.7124936767762382e-03 1.8683598772963231e-02 -1.9442299442683259e-03 -1.6938999450056079e-02 -2.0199827681910621e-04 -2.3768267698025935e-02 8.6279761940046907e-04 -1.2869809167728584e-02 -5.7455677517411615e-03 1.8454721358122421e-02 -1.0856170134443169e-03 4.1325420505040199e-02 6.0178672585703540e-03 5.3085686095085474e-03 2.1065822069888870e-02 -1.3352496291523724e-02 -9.8239842621944129e-03 -7.7718439172015461e-03 -5.0585319282494129e-03 2.9328029912062208e-03 5.1000757028442159e-03 -5.0206786718402880e-03 -2.2938497930464482e-04 5.0473387139581653e-03 5.2768783880730143e-03 -5.0234367955494909e-03 -1.9816159295879634e-03 -1.8394630779364357e-03 -2.5224919720308082e-03 -1.6102030365877558e-03 -8.0757711387904173e-03 5.9024606697511400e-03 2.0924462043975705e-03 -3.5361682791543274e-03 5.7889703568272232e-03 6.0178672585703540e-03 2.0115050624823366e-02 -3.0073275147923968e-03 -5.2950729316088409e-03 -1.8613159169255039e-03 -3.8415927561072441e-03 -9.3708359819857454e-03 2.2707717219881090e-03 -1.0220323570929094e-02 -1.0778806605860742e-02 6.4081710452346761e-03 8.1781515547085428e-03 3.7594128750015870e-03 -3.8249300504262225e-03 1.9064911265989189e-02 1.3257805129595677e-02 -7.3293601768460465e-03 -5.6106715350998284e-03 -8.1085683555888639e-03 3.9176511705464210e-03 -2.3005354932555129e-02 -7.7219475563211244e-03 5.9137462229014162e-03 1.2023107729622728e-03 5.3085686095085483e-03 -3.0073275147923968e-03 2.5736380858190515e-02 1.2481459540576733e-02 -4.3487224186059522e-03 -1.5345404413266461e-02 -8.1979236369118143e-03 4.2857822581373363e-03 -1.1692131374153120e-02 -2.4326675700668710e-02 1.4832258599282000e-02 1.0752307616539950e-02 -5.7466109604968054e-05 -2.1668280702552439e-03 1.6589216486888377e-02 5.8260048377258879e-03 -1.2978305462816656e-02 -3.2036285971463090e-03 -2.6862644397978235e-02 3.5504062296249040e-03 -2.0099035575720708e-02 -9.1410018373660022e-03 7.9815880379912833e-03 4.1533656766616417e-03 2.1065822069888867e-02 -5.2950729316088426e-03 1.2481459540576736e-02 4.1209225342286222e-02 -1.0209828660354784e-02 -8.9815537736465459e-03 -7.7132642042830567e-03 -5.2940000612600371e-03 6.5809786553163848e-03 1.3695972057750982e-02 -2.1429252287961553e-02 -1.3125844502874450e-02 -9.9961545267342807e-05 -3.0017692634387938e-03 -1.7822346871374607e-02 -9.8022394473509756e-04 2.0599326957401274e-02 6.6752330648875702e-03 9.4326541474956289e-03 -3.8680117749757695e-03 1.0452946471705114e-02 5.7908990759389660e-04 -2.4421978035707736e-02 -2.8994878382405118e-03 -1.3352496291523724e-02 -1.8613159169255031e-03 -4.3487224186059530e-03 -1.0209828660354784e-02 3.9277000382868119e-02 1.4487243439186441e-02 9.3479432904043300e-04 -1.1425585997889551e-04 6.9555782578763214e-03 1.0427845830486384e-02 -1.3816770390946096e-02 -1.4451023104199347e-02 -6.2410846161346632e-05 -4.6764791064310557e-03 -2.6685007795452013e-02 -1.1491604777001130e-03 6.3594032263109921e-03 3.3674225323245548e-03 8.0092168647391791e-03 1.1533277438591311e-02 1.9608635907060572e-02 7.4882829387154059e-04 -9.9308259906254522e-03 -5.7212584887896701e-03 -9.8239842621944129e-03 -3.8415927561072445e-03 -1.5345404413266458e-02 -8.9815537736465459e-03 1.4487243439186443e-02 3.2271057104446027e-02 8.3121837060531304e-04 5.2790444340807723e-03 3.5717501249889409e-03 -7.7094560837925885e-04 -6.9567071356461127e-04 -5.0723372890581608e-04 -4.0585517698162642e-03 -4.1809915225919365e-04 -1.2215109022054526e-03 -5.7704649630268313e-03 9.1848373996763280e-03 7.2238424840648597e-03 3.6847123080314651e-03 7.6658966753001415e-04 1.3403518407637826e-03 1.5738483300683369e-03 -5.6806599825179986e-03 -3.0404945523998124e-03 -7.7718439172015461e-03 -9.3708359819857454e-03 -8.1979236369118143e-03 -7.7132642042830558e-03 9.3479432904043354e-04 8.3121837060531282e-04 2.0826509824607153e-02 633 634 635 699 700 701 711 712 713 645 646 647 507 508 509 669 670 671 672 673 674 510 511 512 2.5622369396604436e-02 -4.4404559668638505e-03 -8.6874213360258849e-03 -5.8434554491815455e-04 -1.1603405396383225e-03 -8.4586446443906220e-03 -1.0155227828757791e-02 8.9902337106382881e-03 3.3363885313341308e-03 -5.2266460530967082e-03 3.6972542845028203e-03 4.7722585657371782e-03 7.1775763919120156e-03 -6.3630956227879584e-03 -4.5317605460914534e-03 -1.6703658286087064e-04 -1.3233514488437753e-03 8.2219055368709746e-04 -7.9599600299025183e-03 3.9204979301418969e-03 8.1429469900538079e-03 -8.7067297489804227e-03 -3.3207423471491018e-03 4.6040418856957430e-03 -4.4404559668638505e-03 2.8942965195910955e-02 1.2470581355888433e-02 -2.3046187739410784e-03 -1.8572410685366227e-02 -1.0640790957954682e-02 6.3941167675146127e-03 -2.1924384522280852e-02 -8.6202325900911498e-03 4.6558674314975800e-03 4.8158258494629550e-03 7.3724188056912649e-03 -7.2900493000571725e-03 1.6784965998400694e-02 1.4467603394797105e-02 -6.3499316571679664e-03 -7.4952765938692380e-03 -8.9529124735313430e-03 4.7454223322171548e-03 -1.0016049672544033e-02 -1.1291162440649169e-02 4.5896491668007307e-03 7.4643644302857517e-03 5.1944949058495404e-03 -8.6874213360258867e-03 1.2470581355888435e-02 4.5833428814944101e-02 -9.6935154370149604e-03 -1.1667176856635035e-02 -1.0277569798457092e-02 7.0047553933384084e-03 -2.0311840234977101e-02 -1.1199213467236159e-02 5.0914255307209144e-03 7.4280614396228318e-03 2.3419658386366844e-02 -4.5646699438343192e-03 1.3889864335835528e-02 6.2080852434042702e-03 -1.1192274948060519e-02 -5.0349390217223310e-03 -2.7858527655533146e-02 8.9658874784501377e-03 -1.0257348621201996e-02 -2.6137207936452529e-02 1.3075813262426243e-02 1.3482797603189670e-02 1.1346412963716902e-05 -5.8434554491815422e-04 -2.3046187739410784e-03 -9.6935154370149604e-03 3.6934733996462361e-02 1.7182579171106938e-02 1.9323671512648292e-03 -4.4061876094594471e-03 1.0034767634259402e-02 1.4350381186593875e-03 -2.2963333354950124e-02 -7.3408296540534530e-03 -1.4183770473598594e-02 -3.6809664315611609e-04 -1.4223150943784993e-02 -1.6531963075890092e-03 1.9353479299264700e-02 8.1005578715513012e-03 1.0126176208588850e-02 -8.3241632361992900e-03 4.2140431751359351e-03 1.3917215935354540e-02 -1.9642086907043950e-02 -1.5663348480274057e-02 -1.8803151956650482e-03 -1.1603405396383218e-03 -1.8572410685366227e-02 -1.1667176856635033e-02 1.7182579171106941e-02 3.8344010932357821e-02 2.1240544209648986e-03 6.1728537574903021e-03 2.6823283742594715e-02 3.0152856809761053e-03 -1.2712946053261290e-02 -1.0903785051153608e-02 -1.3287841095501973e-02 -4.8646125700305766e-04 -3.0541893629250891e-02 -2.6180701749616698e-03 9.7757970129631697e-03 6.7406595197258973e-03 1.0272321993970617e-02 -3.7028480857901787e-03 8.6482049996971823e-03 1.3991064032061486e-02 -1.5068634005867575e-02 -2.0538069828604892e-02 -1.8296380008744387e-03 -8.4586446443906220e-03 -1.0640790957954682e-02 -1.0277569798457092e-02 1.9323671512648298e-03 2.1240544209648986e-03 2.0686291896679816e-02 9.9389663467812665e-04 2.6654699750695912e-03 3.9214063698137947e-03 -6.2212541804777290e-03 -5.0086228171729820e-03 -9.6683890675183203e-03 1.6027687658989870e-04 -2.1403347145800941e-03 -6.6509638206876413e-03 8.6775167872340537e-03 9.0481796416376110e-03 5.8089991266446926e-03 4.3493622562946564e-03 5.3879104051136597e-03 1.0882525342513173e-03 -1.4335208811932156e-03 -1.4358659530780040e-03 -4.9080272407265556e-03 -1.0155227828757791e-02 6.3941167675146118e-03 7.0047553933384066e-03 -4.4061876094594436e-03 6.1728537574903004e-03 9.9389663467812665e-04 2.4691675012068554e-02 -1.0555131939946191e-02 -1.2303910395011540e-03 -1.4633170272871786e-04 -9.3471660247563537e-03 2.5723568790577888e-03 -8.8250067450376876e-03 9.6964456912508185e-03 1.2245611368358787e-03 -9.2350381936189881e-03 5.1998116596097717e-03 -5.4132352949176725e-03 8.3202081245081771e-03 -6.7662700839751320e-03 -4.9909787203548583e-03 -2.4409105697408983e-04 -7.9465982718782450e-04 -1.6096498913651308e-04 8.9902337106382915e-03 -2.1924384522280852e-02 -2.0311840234977101e-02 1.0034767634259400e-02 2.6823283742594711e-02 2.6654699750695912e-03 -1.0555131939946191e-02 5.6921191502834874e-02 4.8637417681810001e-03 -1.1757435782821372e-02 -1.3013873937949467e-02 -1.5657156900086424e-02 9.9456849022301046e-03 -3.6996560488212545e-02 -3.6072850235388328e-03 1.6075457490085640e-02 5.9416428914287728e-04 1.8547029043213231e-02 -8.2205119824536321e-03 1.7944374962522481e-02 1.6408473518810432e-02 -1.4513064031992264e-02 -3.0348195548652090e-02 -2.9084321466719041e-03 3.3363885313341299e-03 -8.6202325900911498e-03 -1.1199213467236159e-02 1.4350381186593872e-03 3.0152856809761057e-03 3.9214063698137938e-03 -1.2303910395011538e-03 4.8637417681810001e-03 2.2218402558740830e-02 1.5041078292804197e-03 -1.3025440679265445e-02 -1.0882918197573430e-02 1.3038934510583020e-03 -3.7639432819501950e-03 -6.1912344831391262e-03 -3.5538838728547435e-04 6.7863184470880441e-03 5.3177228786458342e-04 -4.3446929083126975e-03 1.3367259579061659e-02 7.9394990326342070e-03 -1.6489555952329160e-03 -2.6229889240000255e-03 -6.3377141011046970e-03 -5.2266460530967073e-03 4.6558674314975792e-03 5.0914255307209152e-03 -2.2963333354950120e-02 -1.2712946053261290e-02 -6.2212541804777290e-03 -1.4633170272871743e-04 -1.1757435782821370e-02 1.5041078292804193e-03 3.9379188889902501e-02 3.5908663928609866e-03 1.8483746145826031e-02 -1.0713807455717109e-02 1.5389564708089021e-02 -9.1922975225894256e-04 -1.9837734983983790e-02 -2.0484812202336434e-03 -1.6211789824470288e-02 5.8028303366354614e-04 -5.8917113473020083e-03 -1.1079501522928654e-02 1.8928381626910407e-02 8.7742758711707291e-03 9.3524957743082483e-03 3.6972542845028194e-03 4.8158258494629550e-03 7.4280614396228318e-03 -7.3408296540534530e-03 -1.0903785051153607e-02 -5.0086228171729820e-03 -9.3471660247563537e-03 -1.3013873937949463e-02 -1.3025440679265440e-02 3.5908663928609875e-03 2.5153701343611293e-02 4.5405349102382708e-03 4.5814196601935845e-03 1.4282409318663761e-04 6.6808893580464811e-03 -3.4900169477706461e-03 -5.9683539320398464e-03 -3.8772629800516781e-03 -9.5676547961383589e-04 -7.8194687409800772e-03 -6.1178375785662957e-03 9.2652377686368980e-03 7.5931303758621079e-03 9.3796783471488121e-03 4.7722585657371782e-03 7.3724188056912658e-03 2.3419658386366844e-02 -1.4183770473598594e-02 -1.3287841095501976e-02 -9.6683890675183237e-03 2.5723568790577888e-03 -1.5657156900086424e-02 -1.0882918197573432e-02 1.8483746145826034e-02 4.5405349102382708e-03 4.5755371678483786e-02 -5.7643937021457335e-03 1.8216818524400668e-02 -1.2866410591077845e-03 -1.6928926642214841e-02 -2.3373728532330258e-03 -2.4910901083255190e-02 1.5464054084349714e-03 -8.8357803962246656e-03 -2.8347265944725655e-02 9.5023238189032126e-03 9.9883790047158878e-03 5.9210852873297585e-03 7.1775763919120173e-03 -7.2900493000571717e-03 -4.5646699438343201e-03 -3.6809664315611663e-04 -4.8646125700305896e-04 1.6027687658989881e-04 -8.8250067450376894e-03 9.9456849022301046e-03 1.3038934510583020e-03 -1.0713807455717109e-02 4.5814196601935853e-03 -5.7643937021457335e-03 2.9256378369523744e-02 -1.0682847566875051e-02 -1.1259127275175963e-03 1.2455409662400260e-03 -1.0443877079094567e-02 2.2626183023990291e-03 -1.1049991526411982e-02 6.4302466323844960e-03 6.7821423174109505e-03 -6.7225933573529049e-03 7.9458840082216667e-03 9.4604542603946636e-04 -6.3630956227879593e-03 1.6784965998400691e-02 1.3889864335835528e-02 -1.4223150943784993e-02 -3.0541893629250895e-02 -2.1403347145800937e-03 9.6964456912508185e-03 -3.6996560488212545e-02 -3.7639432819501950e-03 1.5389564708089019e-02 1.4282409318663620e-04 1.8216818524400668e-02 -1.0682847566875051e-02 5.9345061895658531e-02 4.1069339641094963e-03 -1.0363757755107877e-02 -1.0375628324758345e-02 -1.3363232285440972e-02 9.6405407421575277e-03 -2.1443624965321508e-02 -1.9771601965604457e-02 6.9063007470585363e-03 2.3084855420297423e-02 2.8254954232300351e-03 -4.5317605460914534e-03 1.4467603394797105e-02 6.2080852434042684e-03 -1.6531963075890092e-03 -2.6180701749616698e-03 -6.6509638206876413e-03 1.2245611368358784e-03 -3.6072850235388328e-03 -6.1912344831391254e-03 -9.1922975225894256e-04 6.6808893580464794e-03 -1.2866410591077849e-03 -1.1259127275175965e-03 4.1069339641094955e-03 2.6255938925315293e-02 2.2867435274055198e-03 -1.3510996421460818e-02 -9.1282043301036311e-03 3.8575501194034246e-03 -7.9930232855996899e-03 -1.1183371442679479e-02 8.6124454981218097e-04 2.4739481886079328e-03 1.9763909669981085e-03 -1.6703658286087086e-04 -6.3499316571679646e-03 -1.1192274948060519e-02 1.9353479299264703e-02 9.7757970129631697e-03 8.6775167872340537e-03 -9.2350381936189881e-03 1.6075457490085640e-02 -3.5538838728547446e-04 -1.9837734983983793e-02 -3.4900169477706461e-03 -1.6928926642214841e-02 1.2455409662400273e-03 -1.0363757755107878e-02 2.2867435274055202e-03 3.7912594861075517e-02 2.6160404766600140e-03 1.8017911067426447e-02 -6.3788633995052451e-03 4.3228164462368063e-03 5.9769025306266573e-03 -2.2892941966611371e-02 -1.2586405065899146e-02 -6.4824839351318511e-03 -1.3233514488437755e-03 -7.4952765938692397e-03 -5.0349390217223310e-03 8.1005578715513029e-03 6.7406595197258973e-03 9.0481796416376128e-03 5.1998116596097717e-03 5.9416428914287869e-04 6.7863184470880441e-03 -2.0484812202336438e-03 -5.9683539320398455e-03 -2.3373728532330258e-03 -1.0443877079094567e-02 -1.0375628324758347e-02 -1.3510996421460822e-02 2.6160404766600140e-03 2.2822174557751044e-02 3.1695771176735799e-03 4.1395474169733434e-03 3.7372707678471695e-03 6.2919466728113879e-03 -6.2402476766224447e-03 -1.0055010283799560e-02 -4.4127135827944450e-03 8.2219055368709746e-04 -8.9529124735313430e-03 -2.7858527655533143e-02 1.0126176208588850e-02 1.0272321993970617e-02 5.8089991266446926e-03 -5.4132352949176725e-03 1.8547029043213231e-02 5.3177228786458299e-04 -1.6211789824470288e-02 -3.8772629800516781e-03 -2.4910901083255190e-02 2.2626183023990295e-03 -1.3363232285440969e-02 -9.1282043301036293e-03 1.8017911067426447e-02 3.1695771176735803e-03 4.2884004499785702e-02 3.6383441957759544e-03 7.0108208218722396e-03 2.2590817932010177e-02 -1.3242215208489432e-02 -1.2806341237705677e-02 -9.9179607774131928e-03 -7.9599600299025183e-03 4.7454223322171548e-03 8.9658874784501377e-03 -8.3241632361992900e-03 -3.7028480857901778e-03 4.3493622562946555e-03 8.3202081245081771e-03 -8.2205119824536321e-03 -4.3446929083126975e-03 5.8028303366354657e-04 -9.5676547961383643e-04 1.5464054084349710e-03 -1.1049991526411982e-02 9.6405407421575277e-03 3.8575501194034233e-03 -6.3788633995052451e-03 4.1395474169733434e-03 3.6383441957759562e-03 2.4154133535539721e-02 -4.7965399045569517e-03 -9.5632680061694380e-03 6.5835349830760349e-04 -8.4884503893342721e-04 -8.4495885438770034e-03 3.9204979301418969e-03 -1.0016049672544033e-02 -1.0257348621201996e-02 4.2140431751359351e-03 8.6482049996971840e-03 5.3879104051136597e-03 -6.7662700839751320e-03 1.7944374962522481e-02 1.3367259579061663e-02 -5.8917113473020083e-03 -7.8194687409800789e-03 -8.8357803962246656e-03 6.4302466323844969e-03 -2.1443624965321508e-02 -7.9930232855996916e-03 4.3228164462368063e-03 3.7372707678471691e-03 7.0108208218722396e-03 -4.7965399045569500e-03 2.6129077385827367e-02 1.1910504816168314e-02 -1.4330828480650553e-03 -1.7179784737048578e-02 -1.0590343319189531e-02 8.1429469900538079e-03 -1.1291162440649169e-02 -2.6137207936452529e-02 1.3917215935354540e-02 1.3991064032061486e-02 1.0882525342513166e-03 -4.9909787203548583e-03 1.6408473518810432e-02 7.9394990326342070e-03 -1.1079501522928654e-02 -6.1178375785662957e-03 -2.8347265944725652e-02 6.7821423174109514e-03 -1.9771601965604461e-02 -1.1183371442679481e-02 5.9769025306266581e-03 6.2919466728113870e-03 2.2590817932010177e-02 -9.5632680061694397e-03 1.1910504816168318e-02 4.3803663926745715e-02 -9.1854595239930243e-03 -1.1421387055031703e-02 -9.7543881017837560e-03 -8.7067297489804227e-03 4.5896491668007307e-03 1.3075813262426243e-02 -1.9642086907043950e-02 -1.5068634005867575e-02 -1.4335208811932156e-03 -2.4409105697409178e-04 -1.4513064031992264e-02 -1.6489555952329160e-03 1.8928381626910414e-02 9.2652377686368997e-03 9.5023238189032144e-03 -6.7225933573529014e-03 6.9063007470585363e-03 8.6124454981218097e-04 -2.2892941966611371e-02 -6.2402476766224464e-03 -1.3242215208489432e-02 6.5835349830760262e-04 -1.4330828480650564e-03 -9.1854595239930243e-03 3.8621707911744740e-02 1.6493840880051173e-02 2.0707695777669602e-03 -3.3207423471491018e-03 7.4643644302857535e-03 1.3482797603189670e-02 -1.5663348480274057e-02 -2.0538069828604892e-02 -1.4358659530780038e-03 -7.9465982718782461e-04 -3.0348195548652094e-02 -2.6229889240000251e-03 8.7742758711707308e-03 7.5931303758621079e-03 9.9883790047158860e-03 7.9458840082216684e-03 2.3084855420297430e-02 2.4739481886079332e-03 -1.2586405065899146e-02 -1.0055010283799560e-02 -1.2806341237705679e-02 -8.4884503893342721e-04 -1.7179784737048585e-02 -1.1421387055031703e-02 1.6493840880051173e-02 3.9978710171659840e-02 2.3414583733019278e-03 4.6040418856957430e-03 5.1944949058495404e-03 1.1346412963716144e-05 -1.8803151956650478e-03 -1.8296380008744383e-03 -4.9080272407265556e-03 -1.6096498913651368e-04 -2.9084321466719028e-03 -6.3377141011046970e-03 9.3524957743082501e-03 9.3796783471488138e-03 5.9210852873297576e-03 9.4604542603946636e-04 2.8254954232300347e-03 1.9763909669981098e-03 -6.4824839351318520e-03 -4.4127135827944442e-03 -9.9179607774131946e-03 -8.4495885438770034e-03 -1.0590343319189531e-02 -9.7543881017837578e-03 2.0707695777669602e-03 2.3414583733019278e-03 2.3009267553736622e-02 645 646 647 711 712 713 723 724 725 657 658 659 510 511 512 672 673 674 675 676 677 513 514 515 3.0731431740788337e-02 -5.6531287810365231e-03 -1.2947868569304903e-02 1.4141075963939437e-03 2.9687835524406722e-03 -6.5951205548966741e-03 -1.4449907205850099e-02 1.2081616820144558e-02 5.0816756046143481e-03 -7.5080296871437996e-03 1.0930465333375745e-03 1.6621340046802607e-03 1.1323605558911726e-02 -8.6279968045930612e-03 -6.8882188281104012e-03 1.7894689283814496e-03 8.8008863729410985e-04 4.4284595184695035e-03 -1.1973910781038453e-02 4.7453586873904370e-03 1.1856178173191741e-02 -1.1326766150443111e-02 -7.4877686449777671e-03 3.4027606513561291e-03 -5.6531287810365231e-03 2.8514596578325658e-02 1.0765800277789121e-02 1.6387250397686863e-03 -1.8727861165521938e-02 -1.2330509969279703e-02 8.3670201788231795e-03 -1.9062540191658539e-02 -7.8587901615577421e-03 1.9792000170094355e-03 5.7147463650553841e-03 8.3153108007210791e-03 -9.4884027359782123e-03 1.4706979307577469e-02 1.3404428460988667e-02 -4.1557719584334896e-03 -8.7909315198866026e-03 -8.9570414461419036e-03 5.7050292127962410e-03 -8.8141704915848749e-03 -9.5622860741829165e-03 1.6073290270506837e-03 6.4591811176934405e-03 6.2230881116633980e-03 -1.2947868569304907e-02 1.0765800277789122e-02 4.7182401618659803e-02 -7.7963540850194057e-03 -1.3589905736870274e-02 -1.1591318662454391e-02 1.0269909023844691e-02 -1.8647618026153445e-02 -1.1736103782094689e-02 1.8683830289111505e-03 8.3360199139378369e-03 2.3697286448336304e-02 -6.7736574570263081e-03 1.3037396975084783e-02 7.4107749209542714e-03 -8.6038974395098097e-03 -7.2340371287773556e-03 -2.8692033120503783e-02 1.2604745321233700e-02 -8.4365859664211479e-03 -2.6476433181342306e-02 1.1378740176870896e-02 1.5768929691410485e-02 2.0542575844479543e-04 1.4141075963939420e-03 1.6387250397686863e-03 -7.7963540850194066e-03 3.4102026377601333e-02 1.7352484979636203e-02 2.5059363694014481e-03 -6.9382561935502499e-03 4.9852657497722018e-03 7.3546364635097253e-04 -1.9531864963478886e-02 -8.8981756177812354e-03 -1.3039543256302940e-02 1.5534413639796791e-03 -9.7542280305512302e-03 -1.4203960850937966e-03 1.6753961462219746e-02 9.4475655727600388e-03 9.4990645562744447e-03 -1.0709413614533602e-02 1.0903105196939271e-03 1.1877337633913352e-02 -1.6644002028631966e-02 -1.5861948213298591e-02 -2.3615087795240716e-03 2.9687835524406726e-03 -1.8727861165521938e-02 -1.3589905736870276e-02 1.7352484979636203e-02 4.5628493484791366e-02 3.7057164851573557e-03 1.1055873894581939e-03 2.8298803140842987e-02 3.8148358781423691e-03 -1.3415157853031965e-02 -1.5353345498206989e-02 -1.6169141128449898e-02 4.3315103312052813e-03 -3.2093578579682668e-02 -3.6272763915868146e-03 1.1064544273980327e-02 1.1313238286464489e-02 1.2594785400021263e-02 -8.0480417962267535e-03 7.5094332126408722e-03 1.6325876502113795e-02 -1.5359710877461973e-02 -2.6575182881328128e-02 -3.0548910085277932e-03 -6.5951205548966741e-03 -1.2330509969279707e-02 -1.1591318662454390e-02 2.5059363694014485e-03 3.7057164851573539e-03 2.2129187435986311e-02 3.1163041871261956e-04 3.7205708412314628e-03 3.9018719592873521e-03 -6.1611446126798248e-03 -6.5217099776218304e-03 -1.1288698144611673e-02 6.8930064038331290e-04 -3.1437305209292762e-03 -6.8012664146366040e-03 8.2112097122121440e-03 1.0915580108314973e-02 7.7288367646788491e-03 3.1036332613503686e-03 6.4010779842721011e-03 1.5719028879367949e-03 -2.0654452344833953e-03 -2.7469949511450807e-03 -5.6505158261866400e-03 -1.4449907205850099e-02 8.3670201788231813e-03 1.0269909023844691e-02 -6.9382561935502508e-03 1.1055873894581950e-03 3.1163041871261918e-04 2.8586768862840138e-02 -1.4731805101819422e-02 -2.1484093425522418e-03 1.6012160773332762e-03 -5.8589167488819049e-03 5.1445632150195798e-03 -1.2127769873125829e-02 1.3374152755148312e-02 2.0341975528578400e-03 -1.0725273504476862e-02 2.4054026529799089e-03 -8.5694176241368717e-03 1.2285875679169033e-02 -8.8264718939764265e-03 -7.6329715082376123e-03 1.7673461576605939e-03 4.1650307682681515e-03 5.9049826449199391e-04 1.2081616820144558e-02 -1.9062540191658539e-02 -1.8647618026153442e-02 4.9852657497722018e-03 2.8298803140842984e-02 3.7205708412314624e-03 -1.4731805101819422e-02 5.1518841894729377e-02 4.7810068621493293e-03 -7.7990500349287006e-03 -1.6746296582962516e-02 -1.5101900814635867e-02 1.3339798346138456e-02 -3.2037914763275693e-02 -3.8505161419144320e-03 1.2586836178346165e-02 4.9915949521293955e-03 1.7789316481598413e-02 -1.0470136061373777e-02 1.5069192690114986e-02 1.5015546116419930e-02 -9.9925258962794989e-03 -3.2031681139919999e-02 -3.7064053186953915e-03 5.0816756046143481e-03 -7.8587901615577421e-03 -1.1736103782094689e-02 7.3546364635097285e-04 3.8148358781423695e-03 3.9018719592873530e-03 -2.1484093425522422e-03 4.7810068621493267e-03 2.2129262175989747e-02 3.8527355971121535e-03 -1.2944463470187679e-02 -1.1661710844940675e-02 1.9341770458165004e-03 -3.6602864041746642e-03 -5.9855155541553989e-03 -1.5196855377891236e-03 6.8240747605261250e-03 1.5359647861709123e-03 -6.5136119187747940e-03 1.2353217315153091e-02 8.3839928969578516e-03 -1.4223450947778164e-03 -3.3095947800508294e-03 -6.5677616372150959e-03 -7.5080296871437996e-03 1.9792000170094364e-03 1.8683830289111495e-03 -1.9531864963478890e-02 -1.3415157853031963e-02 -6.1611446126798248e-03 1.6012160773332758e-03 -7.7990500349286989e-03 3.8527355971121535e-03 3.5475385812683037e-02 5.4751186526254460e-03 1.6411074745941865e-02 -1.1699417906038649e-02 1.1797288731718045e-02 -1.8943996044122279e-03 -1.6409141152151412e-02 -4.1710546137233538e-03 -1.4596749894213987e-02 2.2220056060796530e-03 -3.5591395147222130e-03 -8.1615895410619525e-03 1.5849846212716786e-02 9.6927946150533028e-03 8.6816902804028196e-03 1.0930465333375754e-03 5.7147463650553849e-03 8.3360199139378369e-03 -8.8981756177812354e-03 -1.5353345498206989e-02 -6.5217099776218304e-03 -5.8589167488819049e-03 -1.6746296582962516e-02 -1.2944463470187679e-02 5.4751186526254460e-03 2.6758301462276757e-02 8.0415511825070174e-03 1.7953837145483669e-03 4.1510420884724808e-03 6.6787056549323367e-03 -5.3772081866687998e-03 -7.3071747158317780e-03 -6.9889023509744422e-03 1.4767878049673810e-03 -8.7599192357911120e-03 -8.0442223655733530e-03 1.0293963847853173e-02 1.1542646116987779e-02 1.1443021412980113e-02 1.6621340046802590e-03 8.3153108007210808e-03 2.3697286448336304e-02 -1.3039543256302940e-02 -1.6169141128449898e-02 -1.1288698144611671e-02 5.1445632150195798e-03 -1.5101900814635865e-02 -1.1661710844940675e-02 1.6411074745941865e-02 8.0415511825070139e-03 4.6769725208104865e-02 -8.5582372848574412e-03 1.7287348915597817e-02 -7.6298017190691613e-06 -1.5511503698071038e-02 -5.7373578939834162e-03 -2.5922832076058274e-02 5.1313088910476543e-03 -8.5139213864421377e-03 -2.8808491922868641e-02 8.7602033825420703e-03 1.1878110324685408e-02 7.2223511337571608e-03 1.1323605558911728e-02 -9.4884027359782123e-03 -6.7736574570263081e-03 1.5534413639796785e-03 4.3315103312052804e-03 6.8930064038331290e-04 -1.2127769873125829e-02 1.3339798346138456e-02 1.9341770458165004e-03 -1.1699417906038649e-02 1.7953837145483669e-03 -8.5582372848574412e-03 3.2401231203117005e-02 -1.4321803881803277e-02 -2.0368510852001405e-03 2.4848969727710238e-03 -6.8952370355539151e-03 4.4826640174465224e-03 -1.5083301606005631e-02 8.0058049730481699e-03 9.8435977310470570e-03 -8.8526857136093356e-03 3.2329462883951307e-03 4.1900639239049752e-04 -8.6279968045930612e-03 1.4706979307577465e-02 1.3037396975084783e-02 -9.7542280305512302e-03 -3.2093578579682668e-02 -3.1437305209292762e-03 1.3374152755148310e-02 -3.2037914763275693e-02 -3.6602864041746642e-03 1.1797288731718047e-02 4.1510420884724808e-03 1.7287348915597817e-02 -1.4321803881803277e-02 5.3745080692715747e-02 4.4605985481988592e-03 -7.1566176647576349e-03 -1.4801718197582074e-02 -1.3413222193549307e-02 1.2403029569311519e-02 -1.8318571641992677e-02 -1.8123396776102800e-02 2.2861753255273383e-03 2.4648681093767409e-02 3.5552914558745832e-03 -6.8882188281104012e-03 1.3404428460988667e-02 7.4107749209542714e-03 -1.4203960850937970e-03 -3.6272763915868146e-03 -6.8012664146366040e-03 2.0341975528578391e-03 -3.8505161419144316e-03 -5.9855155541553989e-03 -1.8943996044122275e-03 6.6787056549323367e-03 -7.6298017190692697e-06 -2.0368510852001400e-03 4.4605985481988592e-03 2.5773604908386705e-02 4.3093760341714020e-03 -1.3241052002880062e-02 -1.0656948338072356e-02 5.4604476245061094e-03 -7.2871560892204430e-03 -1.1780837280342172e-02 4.3584439128121621e-04 3.4622679614818891e-03 2.0478175595846212e-03 1.7894689283814488e-03 -4.1557719584334905e-03 -8.6038974395098097e-03 1.6753961462219746e-02 1.1064544273980327e-02 8.2112097122121423e-03 -1.0725273504476862e-02 1.2586836178346167e-02 -1.5196855377891236e-03 -1.6409141152151412e-02 -5.3772081866687998e-03 -1.5511503698071038e-02 2.4848969727710246e-03 -7.1566176647576358e-03 4.3093760341714003e-03 3.4490015312746647e-02 4.9828289802447880e-03 1.6526793266409733e-02 -8.5115131312353490e-03 1.6936791051444537e-03 3.0938464169693201e-03 -1.9872414888255245e-02 -1.3638290727855815e-02 -6.5061387543926246e-03 8.8008863729410964e-04 -8.7909315198866026e-03 -7.2340371287773556e-03 9.4475655727600388e-03 1.1313238286464489e-02 1.0915580108314973e-02 2.4054026529799089e-03 4.9915949521293973e-03 6.8240747605261250e-03 -4.1710546137233538e-03 -7.3071747158317789e-03 -5.7373578939834144e-03 -6.8952370355539151e-03 -1.4801718197582067e-02 -1.3241052002880062e-02 4.9828289802447889e-03 2.4249714685051559e-02 6.8796263988613214e-03 1.4255692681040470e-03 4.8933532138698398e-03 7.5449090280597505e-03 -8.0751634621056261e-03 -1.4548076704214836e-02 -5.9517432701213331e-03 4.4284595184695026e-03 -8.9570414461419036e-03 -2.8692033120503783e-02 9.4990645562744447e-03 1.2594785400021263e-02 7.7288367646788474e-03 -8.5694176241368717e-03 1.7789316481598413e-02 1.5359647861709119e-03 -1.4596749894213987e-02 -6.9889023509744422e-03 -2.5922832076058274e-02 4.4826640174465224e-03 -1.3413222193549311e-02 -1.0656948338072353e-02 1.6526793266409733e-02 6.8796263988613205e-03 4.4246737122873074e-02 4.6570290999702654e-04 7.7648455206256999e-03 2.3145625129348740e-02 -1.2236516750246380e-02 -1.5669407810441054e-02 -1.1385350268437153e-02 -1.1973910781038453e-02 5.7050292127962419e-03 1.2604745321233696e-02 -1.0709413614533602e-02 -8.0480417962267535e-03 3.1036332613503690e-03 1.2285875679169032e-02 -1.0470136061373777e-02 -6.5136119187747940e-03 2.2220056060796517e-03 1.4767878049673810e-03 5.1313088910476534e-03 -1.5083301606005630e-02 1.2403029569311519e-02 5.4604476245061111e-03 -8.5115131312353490e-03 1.4255692681040479e-03 4.6570290999702621e-04 2.9026797941218718e-02 -5.6278189659834657e-03 -1.3564954130865503e-02 2.7434599063456372e-03 3.1355809684048084e-03 -6.6872719584945639e-03 4.7453586873904370e-03 -8.8141704915848749e-03 -8.4365859664211479e-03 1.0903105196939274e-03 7.5094332126408713e-03 6.4010779842721020e-03 -8.8264718939764265e-03 1.5069192690114986e-02 1.2353217315153091e-02 -3.5591395147222121e-03 -8.7599192357911138e-03 -8.5139213864421394e-03 8.0058049730481681e-03 -1.8318571641992677e-02 -7.2871560892204422e-03 1.6936791051444539e-03 4.8933532138698390e-03 7.7648455206256999e-03 -5.6278189659834657e-03 2.5206588483392425e-02 9.8914391522163005e-03 2.4782770894051136e-03 -1.6785906230649458e-02 -1.2172916530183460e-02 1.1856178173191741e-02 -9.5622860741829147e-03 -2.6476433181342303e-02 1.1877337633913351e-02 1.6325876502113795e-02 1.5719028879367953e-03 -7.6329715082376131e-03 1.5015546116419936e-02 8.3839928969578533e-03 -8.1615895410619508e-03 -8.0442223655733548e-03 -2.8808491922868634e-02 9.8435977310470570e-03 -1.8123396776102800e-02 -1.1780837280342174e-02 3.0938464169693201e-03 7.5449090280597514e-03 2.3145625129348733e-02 -1.3564954130865501e-02 9.8914391522163005e-03 4.4486777342037306e-02 -7.3114447749564136e-03 -1.3047865582950711e-02 -1.0522535871727561e-02 -1.1326766150443111e-02 1.6073290270506846e-03 1.1378740176870896e-02 -1.6644002028631966e-02 -1.5359710877461973e-02 -2.0654452344833953e-03 1.7673461576605937e-03 -9.9925258962794972e-03 -1.4223450947778164e-03 1.5849846212716786e-02 1.0293963847853175e-02 8.7602033825420686e-03 -8.8526857136093373e-03 2.2861753255273387e-03 4.3584439128121631e-04 -1.9872414888255249e-02 -8.0751634621056261e-03 -1.2236516750246380e-02 2.7434599063456376e-03 2.4782770894051132e-03 -7.3114447749564136e-03 3.6335216504216658e-02 1.6761654946010788e-02 2.4609639037698229e-03 -7.4877686449777662e-03 6.4591811176934397e-03 1.5768929691410485e-02 -1.5861948213298591e-02 -2.6575182881328128e-02 -2.7469949511450807e-03 4.1650307682681506e-03 -3.2031681139919999e-02 -3.3095947800508277e-03 9.6927946150533011e-03 1.1542646116987781e-02 1.1878110324685408e-02 3.2329462883951324e-03 2.4648681093767409e-02 3.4622679614818895e-03 -1.3638290727855813e-02 -1.4548076704214838e-02 -1.5669407810441054e-02 3.1355809684048097e-03 -1.6785906230649454e-02 -1.3047865582950713e-02 1.6761654946010791e-02 4.7290338627663804e-02 3.6645551470098838e-03 3.4027606513561304e-03 6.2230881116633980e-03 2.0542575844479576e-04 -2.3615087795240716e-03 -3.0548910085277923e-03 -5.6505158261866400e-03 5.9049826449199369e-04 -3.7064053186953911e-03 -6.5677616372150950e-03 8.6816902804028196e-03 1.1443021412980115e-02 7.2223511337571574e-03 4.1900639239049773e-04 3.5552914558745832e-03 2.0478175595846212e-03 -6.5061387543926246e-03 -5.9517432701213339e-03 -1.1385350268437153e-02 -6.6872719584945631e-03 -1.2172916530183460e-02 -1.0522535871727561e-02 2.4609639037698229e-03 3.6645551470098833e-03 2.4650569151779874e-02 hypre-2.33.0/src/test/TEST_fei/SFEI.2000066400000000000000000041346471477326011500167400ustar00rootroot0000000000000074 24 774 1091 12 13 14 72 73 74 87 88 89 27 28 29 774 775 776 816 817 818 828 829 830 786 787 788 4.0207416032605261e+00 3.9688047098878076e-01 1.8795897121384362e+00 -4.2121508238037659e+00 -2.3754818231801031e-01 -1.9962188840637043e+00 -2.7436694924041456e+00 -3.9784612882058357e-01 -1.6097584583670586e+00 2.4722309568270626e+00 1.7853433669908414e-01 1.6816521309131867e+00 2.7844294579537094e+00 4.0496347618684686e-01 1.8131728208021629e+00 -2.5330958182912995e+00 -9.4573214691228855e-02 -1.7509238326341141e+00 -1.7951452777271695e+00 -3.5532729444757533e-01 -1.6048942306016791e+00 2.0066593941850841e+00 1.0491653640268726e-01 1.5873807418127701e+00 3.9688047098878065e-01 2.8271230083144778e+00 5.6954735553610047e-01 -2.1357430731340310e-01 -2.6070880832516101e+00 -2.2134629529543631e-01 -4.2890338445994514e-01 -1.4580175990670430e+00 -4.8792604332345069e-01 1.4950445642392424e-01 1.2958665940666929e+00 2.2091686176085440e-01 4.0672017984423009e-01 1.4430989440806847e+00 4.9721393230322386e-01 -2.6024364454900589e-01 -1.3386020464938730e+00 -3.8241433038959172e-01 -3.5432011461012025e-01 -7.9889976026277298e-01 -5.1149019319692657e-01 3.0393634367553946e-01 6.3651894261344366e-01 3.1549871260522666e-01 1.8795897121384360e+00 5.6954735553610059e-01 5.3906521856712635e+00 -1.9733460502811520e+00 -2.4789041337015280e-01 -5.0295249483916846e+00 -1.8545823330339866e+00 -5.1832130493893602e-01 -3.4272729857239908e+00 1.6767443623322986e+00 2.6072574100093920e-01 3.7435121122669304e+00 1.8005723589701299e+00 4.9037696726470326e-01 3.5060119674618240e+00 -1.7397068478024000e+00 -1.3951978699159215e-01 -3.8942531575060446e+00 -1.6079022640030340e+00 -5.1388302771730698e-01 -3.0139906808117014e+00 1.8186310616797083e+00 9.8964469216246159e-02 2.7248655070334058e+00 -4.2121508238037659e+00 -2.1357430731340316e-01 -1.9733460502811517e+00 4.5945274525165996e+00 -3.8144236192033075e-02 2.0469263531149484e+00 3.0318463794245800e+00 1.8495756302159794e-01 1.7957323423137570e+00 -2.7590407654023625e+00 5.4200293272717005e-02 -1.9146574456476664e+00 -3.1459736616315066e+00 -3.1051761568435154e-01 -1.8643448488286598e+00 2.8203409946206843e+00 -1.8451330235496534e-02 1.8559291957203738e+00 2.0377006618231501e+00 3.0534671743219211e-01 1.8314085100713628e+00 -2.3672502375473794e+00 3.6182915698775929e-02 -1.7776480564629642e+00 -2.3754818231801034e-01 -2.6070880832516101e+00 -2.4789041337015275e-01 -3.8144236192033054e-02 2.6620723209277775e+00 -3.8631353215943562e-02 2.1038093662446894e-01 1.3041766856982757e+00 2.2421430607570803e-01 5.2869793835399338e-02 -1.3408216058310249e+00 6.7649851488756879e-02 -9.7557480865416699e-02 -1.3296797102869407e+00 -1.0026242102923265e-01 -3.2407956637411750e-02 1.3416335456246073e+00 -4.2071892071469781e-02 9.2897410903915498e-02 6.5410984648960802e-01 8.3576593583117323e-02 4.9509714649088092e-02 -6.8440299937069282e-01 5.3415328539216496e-02 -1.9962188840637043e+00 -2.2134629529543637e-01 -5.0295249483916846e+00 2.0469263531149484e+00 -3.8631353215943562e-02 4.8256935128992628e+00 1.7878732212143720e+00 1.9460521139299625e-01 3.1983175224921663e+00 -1.6536450263390114e+00 6.5123010630448203e-02 -3.5327933844581461e+00 -1.8757981664814163e+00 -3.2459008076930823e-01 -3.2687436339924165e+00 1.8610835521849263e+00 -2.5340247916465955e-02 3.6031990115290178e+00 1.5868764549263901e+00 3.1126569747440791e-01 2.7435373808957331e+00 -1.7570975045565054e+00 3.8914057699300578e-02 -2.5396854609739314e+00 -2.7436694924041456e+00 -4.2890338445994508e-01 -1.8545823330339868e+00 3.0318463794245796e+00 2.1038093662446897e-01 1.7878732212143720e+00 4.6082094050767290e+00 4.7322594060816231e-01 1.9695400154080720e+00 -4.2459333963764880e+00 -1.9605496434760208e-01 -1.9407355859092532e+00 -2.3521950745641238e+00 -4.2481083965815986e-01 -1.7211780028734989e+00 2.0375915800058371e+00 7.7809611876659343e-02 1.8397879447156680e+00 2.8055035369101224e+00 3.9852993911558859e-01 1.7702973267493038e+00 -3.1413529380725116e+00 -1.1017723975917346e-01 -1.8510025862706772e+00 -3.9784612882058351e-01 -1.4580175990670428e+00 -5.1832130493893602e-01 1.8495756302159799e-01 1.3041766856982757e+00 1.9460521139299625e-01 4.7322594060816225e-01 2.8392741067763221e+00 4.9113041421081671e-01 -1.6616539901929661e-01 -2.6660446725181539e+00 -2.4710203663363739e-01 -4.3400041476429257e-01 -7.9534663123434235e-01 -4.4941271241375186e-01 2.4510349038032042e-01 6.5694743386659593e-01 3.6527887758912192e-01 4.0572186607687311e-01 1.4805839449801759e+00 4.9075138801479207e-01 -3.1099691748278135e-01 -1.3615732685018309e+00 -3.2692983722140173e-01 -1.6097584583670583e+00 -4.8792604332345069e-01 -3.4272729857239908e+00 1.7957323423137572e+00 2.2421430607570803e-01 3.1983175224921667e+00 1.9695400154080720e+00 4.9113041421081671e-01 4.7745449463963423e+00 -1.9904729044843505e+00 -2.9020855369356785e-01 -5.0647186861186757e+00 -1.7107208490062717e+00 -4.3724391301758875e-01 -2.4508814648158035e+00 1.5820207812826299e+00 1.2724718186061720e-01 2.7318070945319786e+00 1.7962885386049230e+00 4.8816717959205991e-01 3.5113175242778567e+00 -1.8326294657517019e+00 -1.1538057170459561e-01 -3.2731139510398730e+00 2.4722309568270626e+00 1.4950445642392424e-01 1.6767443623322991e+00 -2.7590407654023621e+00 5.2869793835399352e-02 -1.6536450263390112e+00 -4.2459333963764871e+00 -1.6616539901929667e-01 -1.9904729044843508e+00 4.0776929269607880e+00 -2.5468594649330666e-02 1.9053134114065611e+00 2.0043406275700444e+00 2.3653195457731865e-01 1.5722449548565427e+00 -1.8085096831296892e+00 2.5936326822025690e-02 -1.6410250858240829e+00 -2.5381439012031382e+00 -2.5352312706202124e-01 -1.7128690959941333e+00 2.7973632347537825e+00 -1.9685410928018378e-02 1.8437093840461753e+00 1.7853433669908414e-01 1.2958665940666929e+00 2.6072574100093915e-01 5.4200293272717012e-02 -1.3408216058310249e+00 6.5123010630448244e-02 -1.9605496434760217e-01 -2.6660446725181539e+00 -2.9020855369356785e-01 -2.5468594649330701e-02 2.7724438254820085e+00 -3.9909699050925181e-02 6.2038944761211259e-02 6.3181394287580894e-01 1.0957314789428854e-01 3.9805292933848602e-02 -6.8782891365711785e-01 5.6592199665171448e-02 -7.9641535202562161e-02 -1.3648290716097029e+00 -1.2122738568451263e-01 -3.3413773467366098e-02 1.3593999011914886e+00 -4.0668460761841690e-02 1.6816521309131867e+00 2.2091686176085437e-01 3.7435121122669304e+00 -1.9146574456476664e+00 6.7649851488756893e-02 -3.5327933844581461e+00 -1.9407355859092532e+00 -2.4710203663363739e-01 -5.0647186861186748e+00 1.9053134114065613e+00 -3.9909699050925146e-02 5.5478894807106762e+00 1.8422135564327689e+00 3.5953140973196890e-01 2.7172810440877466e+00 -1.6593390431198247e+00 3.6717543388515704e-02 -3.1164709066059668e+00 -1.7243153598700605e+00 -3.7473543190830894e-01 -3.8992808499040290e+00 1.8098683357942880e+00 -2.3068498777223070e-02 3.6045811900214639e+00 2.7844294579537090e+00 4.0672017984423009e-01 1.8005723589701299e+00 -3.1459736616315066e+00 -9.7557480865416726e-02 -1.8757981664814163e+00 -2.3521950745641238e+00 -4.3400041476429246e-01 -1.7107208490062713e+00 2.0043406275700448e+00 6.2038944761211245e-02 1.8422135564327686e+00 4.8147700537164591e+00 5.0220822583468006e-01 2.1256630730061818e+00 -4.3977407614548891e+00 -2.0171362775269883e-01 -2.1178982517432270e+00 -2.8775063299114749e+00 -4.5554213707982361e-01 -1.9779336423163965e+00 3.1698756883217798e+00 2.1784631002211155e-01 1.9139019211382304e+00 4.0496347618684680e-01 1.4430989440806847e+00 4.9037696726470337e-01 -3.1051761568435154e-01 -1.3296797102869407e+00 -3.2459008076930823e-01 -4.2481083965815986e-01 -7.9534663123434235e-01 -4.3724391301758880e-01 2.3653195457731863e-01 6.3181394287580894e-01 3.5953140973196890e-01 5.0220822583467994e-01 2.9062691962708604e+00 5.2254517501680320e-01 -2.0456334015268701e-01 -2.6946917955729082e+00 -2.9652203402597405e-01 -4.1494797233248110e-01 -1.5020763513681785e+00 -5.4094901170252363e-01 2.1113611122883413e-01 1.3406124052350152e+00 2.2685148750191958e-01 1.8131728208021629e+00 4.9721393230322380e-01 3.5060119674618240e+00 -1.8643448488286598e+00 -1.0026242102923265e-01 -3.2687436339924170e+00 -1.7211780028734991e+00 -4.4941271241375186e-01 -2.4508814648158035e+00 1.5722449548565427e+00 1.0957314789428854e-01 2.7172810440877466e+00 2.1256630730061818e+00 5.2254517501680309e-01 5.0051518361480056e+00 -2.1101687157818398e+00 -2.9199324393136816e-01 -5.2610051902781709e+00 -1.7241623794251058e+00 -5.1874739418171523e-01 -3.6126737075436788e+00 1.9087730982442173e+00 2.3108351634175361e-01 3.3648591489324948e+00 -2.5330958182912995e+00 -2.6024364454900589e-01 -1.7397068478024000e+00 2.8203409946206843e+00 -3.2407956637411750e-02 1.8610835521849260e+00 2.0375915800058371e+00 2.4510349038032042e-01 1.5820207812826299e+00 -1.8085096831296892e+00 3.9805292933848588e-02 -1.6593390431198245e+00 -4.3977407614548882e+00 -2.0456334015268696e-01 -2.1101687157818398e+00 4.1618078819348350e+00 -1.0427094652535497e-02 2.0463140530858643e+00 2.6128010204130856e+00 1.8481866115006484e-01 1.8007446011184274e+00 -2.8931952140985655e+00 3.7914591527405270e-02 -1.7809483809677831e+00 -9.4573214691228827e-02 -1.3386020464938730e+00 -1.3951978699159212e-01 -1.8451330235496534e-02 1.3416335456246073e+00 -2.5340247916465952e-02 7.7809611876659357e-02 6.5694743386659604e-01 1.2724718186061723e-01 2.5936326822025693e-02 -6.8782891365711785e-01 3.6717543388515704e-02 -2.0171362775269883e-01 -2.6946917955729082e+00 -2.9199324393136816e-01 -1.0427094652535487e-02 2.7440730280461820e+00 -1.8357838513957135e-02 1.8235534079994720e-01 1.3550269642056114e+00 2.6612865389660040e-01 3.9063987833327450e-02 -1.3765582160190988e+00 4.5117738207650103e-02 -1.7509238326341141e+00 -3.8241433038959172e-01 -3.8942531575060446e+00 1.8559291957203741e+00 -4.2071892071469781e-02 3.6031990115290178e+00 1.8397879447156680e+00 3.6527887758912198e-01 2.7318070945319786e+00 -1.6410250858240829e+00 5.6592199665171448e-02 -3.1164709066059664e+00 -2.1178982517432270e+00 -2.9652203402597410e-01 -5.2610051902781709e+00 2.0463140530858643e+00 -1.8357838513957139e-02 5.6951032973873241e+00 1.7934244970919060e+00 2.6689146524194501e-01 3.9584341578518769e+00 -2.0256085204123879e+00 5.0603552504753201e-02 -3.7168143069100164e+00 -1.7951452777271695e+00 -3.5432011461012025e-01 -1.6079022640030340e+00 2.0377006618231501e+00 9.2897410903915484e-02 1.5868764549263901e+00 2.8055035369101224e+00 4.0572186607687322e-01 1.7962885386049230e+00 -2.5381439012031382e+00 -7.9641535202562175e-02 -1.7243153598700602e+00 -2.8775063299114754e+00 -4.1494797233248110e-01 -1.7241623794251058e+00 2.6128010204130856e+00 1.8235534079994722e-01 1.7934244970919060e+00 4.1800558548858664e+00 4.1506971379217916e-01 1.9730909839506690e+00 -4.4252655651904433e+00 -2.4713470942775240e-01 -2.0933004712756880e+00 -3.5532729444757533e-01 -7.9889976026277298e-01 -5.1388302771730698e-01 3.0534671743219216e-01 6.5410984648960802e-01 3.1126569747440797e-01 3.9852993911558870e-01 1.4805839449801759e+00 4.8816717959205985e-01 -2.5352312706202129e-01 -1.3648290716097029e+00 -3.7473543190830894e-01 -4.5554213707982372e-01 -1.5020763513681785e+00 -5.1874739418171523e-01 1.8481866115006484e-01 1.3550269642056114e+00 2.6689146524194496e-01 4.1506971379217916e-01 2.9255002527916751e+00 5.9558690726188057e-01 -2.3937247290060473e-01 -2.7494158252264160e+00 -2.5454539576296226e-01 -1.6048942306016791e+00 -5.1149019319692657e-01 -3.0139906808117014e+00 1.8314085100713628e+00 8.3576593583117323e-02 2.7435373808957331e+00 1.7702973267493034e+00 4.9075138801479201e-01 3.5113175242778567e+00 -1.7128690959941331e+00 -1.2122738568451262e-01 -3.8992808499040286e+00 -1.9779336423163965e+00 -5.4094901170252374e-01 -3.6126737075436788e+00 1.8007446011184274e+00 2.6612865389660040e-01 3.9584341578518760e+00 1.9730909839506692e+00 5.9558690726188068e-01 5.6175339828497224e+00 -2.0798444529775555e+00 -2.6237695217242885e-01 -5.3048778076157808e+00 2.0066593941850841e+00 3.0393634367553946e-01 1.8186310616797083e+00 -2.3672502375473794e+00 4.9509714649088085e-02 -1.7570975045565054e+00 -3.1413529380725120e+00 -3.1099691748278135e-01 -1.8326294657517019e+00 2.7973632347537825e+00 -3.3413773467366098e-02 1.8098683357942877e+00 3.1698756883217798e+00 2.1113611122883408e-01 1.9087730982442173e+00 -2.8931952140985659e+00 3.9063987833327443e-02 -2.0256085204123879e+00 -4.4252655651904433e+00 -2.3937247290060468e-01 -2.0798444529775555e+00 4.8531656376482548e+00 -1.9862993536035784e-02 2.1579074479799383e+00 1.0491653640268726e-01 6.3651894261344366e-01 9.8964469216246159e-02 3.6182915698775929e-02 -6.8440299937069282e-01 3.8914057699300578e-02 -1.1017723975917343e-01 -1.3615732685018309e+00 -1.1538057170459562e-01 -1.9685410928018381e-02 1.3593999011914886e+00 -2.3068498777223057e-02 2.1784631002211152e-01 1.3406124052350155e+00 2.3108351634175361e-01 3.7914591527405311e-02 -1.3765582160190986e+00 5.0603552504753208e-02 -2.4713470942775231e-01 -2.7494158252264160e+00 -2.6237695217242890e-01 -1.9862993536035781e-02 2.8354190600780917e+00 -1.8739573107805978e-02 1.5873807418127701e+00 3.1549871260522666e-01 2.7248655070334058e+00 -1.7776480564629642e+00 5.3415328539216489e-02 -2.5396854609739314e+00 -1.8510025862706772e+00 -3.2692983722140173e-01 -3.2731139510398739e+00 1.8437093840461756e+00 -4.0668460761841704e-02 3.6045811900214639e+00 1.9139019211382304e+00 2.2685148750191958e-01 3.3648591489324948e+00 -1.7809483809677831e+00 4.5117738207650082e-02 -3.7168143069100164e+00 -2.0933004712756880e+00 -2.5454539576296226e-01 -5.3048778076157808e+00 2.1579074479799378e+00 -1.8739573107805985e-02 5.1401856805522383e+00 72 73 74 132 133 134 147 148 149 87 88 89 816 817 818 858 859 860 870 871 872 828 829 830 4.0911593120027021e+00 3.9679321645643761e-01 1.8616637144197661e+00 -4.2855065476258947e+00 -2.4457341661433690e-01 -1.9902334579566876e+00 -2.7401842580763387e+00 -3.9612197287330841e-01 -1.5843349636155382e+00 2.4614699159346904e+00 1.8068974414205680e-01 1.6551510336885467e+00 2.7630929950512586e+00 4.0768343416694008e-01 1.7893413873542250e+00 -2.5074159964107094e+00 -8.9409943948568008e-02 -1.7174395531889837e+00 -1.7530391614413716e+00 -3.5502458086339689e-01 -1.5707159382214995e+00 1.9704237405656639e+00 9.9963519534176010e-02 1.5565677775201732e+00 3.9679321645643756e-01 2.9161650151576319e+00 5.7175613885601984e-01 -2.0615544447664047e-01 -2.6909460140105086e+00 -2.1183769264139404e-01 -4.3112289435559076e-01 -1.4756407991251546e+00 -4.8892692932907256e-01 1.4128806715293279e-01 1.3085428659782321e+00 2.1101737051520980e-01 4.0479633707849833e-01 1.4477659013398512e+00 4.9627487398994569e-01 -2.5578137821199393e-01 -1.3380197684107951e+00 -3.7791857156202135e-01 -3.5184818975198484e-01 -7.8894867942976277e-01 -5.1084248778740360e-01 3.0203028610834121e-01 6.2108147850050555e-01 3.1047729795871687e-01 1.8616637144197665e+00 5.7175613885601972e-01 5.4612700898602107e+00 -1.9531678067099076e+00 -2.5428915642018329e-01 -5.0979242109478689e+00 -1.8306058504954617e+00 -5.1665369532128702e-01 -3.4094880409329416e+00 1.6474975613134935e+00 2.6522697901374404e-01 3.7301100789259567e+00 1.7676092296014794e+00 4.9260585375662325e-01 3.4716310133082771e+00 -1.7111219279590169e+00 -1.3286945305888323e-01 -3.8635525506347763e+00 -1.5734000734004288e+00 -5.1630578531752380e-01 -2.9653616474086877e+00 1.7915251532300758e+00 9.0529118491490729e-02 2.6733152678298344e+00 -4.2855065476258947e+00 -2.0615544447664041e-01 -1.9531678067099074e+00 4.6808813649693519e+00 -4.2478778157669143e-02 2.0372915002121030e+00 3.0359772328273325e+00 1.7766147865411100e-01 1.7721695306300806e+00 -2.7550861205465749e+00 5.7736433880391312e-02 -1.8923039994717983e+00 -3.1354892881471965e+00 -3.1156121918738472e-01 -1.8416655464521954e+00 2.8016327332640332e+00 -2.6873069558193206e-02 1.8257847241788552e+00 1.9989491020332575e+00 3.0714741817834079e-01 1.8032847508241987e+00 -2.3413584767743076e+00 4.4523180667044117e-02 -1.7513931532113394e+00 -2.4457341661433690e-01 -2.6909460140105086e+00 -2.5428915642018329e-01 -4.2478778157669143e-02 2.7519848872926707e+00 -4.2759547377337996e-02 2.1468601788928296e-01 1.3191130267270930e+00 2.2811996282176808e-01 5.8464142476252028e-02 -1.3583003866088199e+00 7.5448151108263722e-02 -9.6196344952821630e-02 -1.3339080409350859e+00 -9.9073047484927304e-02 -3.6882720456950596e-02 1.3463549864231315e+00 -4.7130992842383784e-02 9.1859084626964793e-02 6.4072780356711134e-01 8.0602642917955547e-02 5.5122015189278527e-02 -6.7502626245559183e-01 5.9081987276845209e-02 -1.9902334579566874e+00 -2.1183769264139404e-01 -5.0979242109478697e+00 2.0372915002121039e+00 -4.2759547377337975e-02 4.8986578595976091e+00 1.7675947639202965e+00 1.8643971309445156e-01 3.1825793529887587e+00 -1.6300983238409865e+00 6.8707826640283548e-02 -3.5231806212621413e+00 -1.8481644166155511e+00 -3.2378529140260554e-01 -3.2391719897927449e+00 1.8394448531030245e+00 -3.5274224266948352e-02 3.5757613807669690e+00 1.5555220071642912e+00 3.1107002930012712e-01 2.6964527808798073e+00 -1.7313569259864914e+00 4.7439186653423254e-02 -2.4931745522303896e+00 -2.7401842580763387e+00 -4.3112289435559076e-01 -1.8306058504954617e+00 3.0359772328273320e+00 2.1468601788928296e-01 1.7675947639202965e+00 4.5739999133477269e+00 4.7433324258678722e-01 1.9406758742970325e+00 -4.1988021957591473e+00 -1.9648140797605182e-01 -1.9125432277201271e+00 -2.3242747417231691e+00 -4.2976624798930324e-01 -1.6958178484125286e+00 2.0022836845837388e+00 7.0695163434341624e-02 1.8136799884648800e+00 2.7254788131040000e+00 4.0064702174273442e-01 1.7384239874590190e+00 -3.0744784483041436e+00 -1.0299089533220079e-01 -1.8214076875131129e+00 -3.9612197287330836e-01 -1.4756407991251546e+00 -5.1665369532128702e-01 1.7766147865411103e-01 1.3191130267270930e+00 1.8643971309445165e-01 4.7433324258678722e-01 2.8222320822577052e+00 4.8904183986746108e-01 -1.5826175318948438e-01 -2.6424561953645420e+00 -2.3959092189458969e-01 -4.3294344315811240e-01 -7.8729028094734332e-01 -4.4649073241492299e-01 2.4069302895361172e-01 6.4248006771059563e-01 3.6219616270746707e-01 4.0318373940433438e-01 1.4334658996817653e+00 4.8802683129600549e-01 -3.0854432037793911e-01 -1.3119038009401200e+00 -3.2296919733458612e-01 -1.5843349636155382e+00 -4.8892692932907256e-01 -3.4094880409329416e+00 1.7721695306300804e+00 2.2811996282176811e-01 3.1825793529887587e+00 1.9406758742970325e+00 4.8904183986746119e-01 4.7134053592765506e+00 -1.9600795893502363e+00 -2.9266760482403376e-01 -5.0044929212293860e+00 -1.6789271864390731e+00 -4.3886053088689503e-01 -2.4005561852189810e+00 1.5509819776432541e+00 1.2085426491267683e-01 2.6813185720213717e+00 1.7562623144021969e+00 4.8911164849114830e-01 3.4162309841051561e+00 -1.7967479575677161e+00 -1.0667265105305324e-01 -3.1789971210105308e+00 2.4614699159346900e+00 1.4128806715293279e-01 1.6474975613134935e+00 -2.7550861205465744e+00 5.8464142476252000e-02 -1.6300983238409865e+00 -4.1988021957591473e+00 -1.5826175318948441e-01 -1.9600795893502363e+00 4.0286723035865046e+00 -2.9640133237243450e-02 1.8722048165346437e+00 1.9648963278251697e+00 2.3479871512578293e-01 1.5406163373028607e+00 -1.7681719407776320e+00 3.3867730196868145e-02 -1.6060545079790174e+00 -2.4520737725713255e+00 -2.5232226186236001e-01 -1.6703194757619555e+00 2.7190954823083144e+00 -2.8194506662747740e-02 1.8062331817811996e+00 1.8068974414205680e-01 1.3085428659782319e+00 2.6522697901374398e-01 5.7736433880391284e-02 -1.3583003866088199e+00 6.8707826640283576e-02 -1.9648140797605182e-01 -2.6424561953645420e+00 -2.9266760482403370e-01 -2.9640133237243450e-02 2.7540635633487360e+00 -4.6469146400407398e-02 5.8743937054014678e-02 6.1724188002409464e-01 1.0753881426484976e-01 4.2899877608702931e-02 -6.7666605238199995e-01 6.1350328140799028e-02 -7.6220435132645481e-02 -1.3126476455892950e+00 -1.1701209251023287e-01 -3.7728016339224998e-02 1.3102219705935940e+00 -4.6675104325002548e-02 1.6551510336885462e+00 2.1101737051520975e-01 3.7301100789259567e+00 -1.8923039994717983e+00 7.5448151108263778e-02 -3.5231806212621413e+00 -1.9125432277201271e+00 -2.3959092189458972e-01 -5.0044929212293860e+00 1.8722048165346434e+00 -4.6469146400407391e-02 5.4983476125005764e+00 1.8146648177452134e+00 3.6066819270949307e-01 2.6680200813321302e+00 -1.6298761998549194e+00 4.8733331255075236e-02 -3.0726027934472953e+00 -1.6873201035571546e+00 -3.7581658496808451e-01 -3.8079703333163315e+00 1.7800228626355967e+00 -3.3990392324959852e-02 3.5117688964964922e+00 2.7630929950512586e+00 4.0479633707849833e-01 1.7676092296014791e+00 -3.1354892881471965e+00 -9.6196344952821658e-02 -1.8481644166155511e+00 -2.3242747417231691e+00 -4.3294344315811245e-01 -1.6789271864390731e+00 1.9648963278251699e+00 5.8743937054014678e-02 1.8146648177452134e+00 4.7194776950540689e+00 5.0497262846708224e-01 2.0859976999892598e+00 -4.2908784413845407e+00 -1.9279119823429025e-01 -2.0761791929362090e+00 -2.7807576166175032e+00 -4.5587980639763526e-01 -1.9411019168115933e+00 3.0839330699419132e+00 2.0929789014326466e-01 1.8761009654664766e+00 4.0768343416694008e-01 1.4477659013398514e+00 4.9260585375662325e-01 -3.1156121918738472e-01 -1.3339080409350859e+00 -3.2378529140260554e-01 -4.2976624798930324e-01 -7.8729028094734332e-01 -4.3886053088689503e-01 2.3479871512578293e-01 6.1724188002409464e-01 3.6066819270949307e-01 5.0497262846708224e-01 2.8424039646663068e+00 5.2272502447036262e-01 -2.0259075881591285e-01 -2.6191558433347688e+00 -2.9641406489873923e-01 -4.1606319723943097e-01 -1.4432952689724612e+00 -5.4390827940977071e-01 2.1252664547222666e-01 1.2762376881594062e+00 2.2696909566153242e-01 1.7893413873542250e+00 4.9627487398994569e-01 3.4716310133082766e+00 -1.8416655464521954e+00 -9.9073047484927290e-02 -3.2391719897927449e+00 -1.6958178484125286e+00 -4.4649073241492299e-01 -2.4005561852189810e+00 1.5406163373028605e+00 1.0753881426484976e-01 2.6680200813321302e+00 2.0859976999892602e+00 5.2272502447036262e-01 4.8856105727490693e+00 -2.0712922243723160e+00 -2.8373732553512621e-01 -5.1375694593182768e+00 -1.6809062866414697e+00 -5.1792713235382148e-01 -3.5020452160019722e+00 1.8737264812321648e+00 2.2068952506364031e-01 3.2540811829425023e+00 -2.5074159964107094e+00 -2.5578137821199393e-01 -1.7111219279590169e+00 2.8016327332640332e+00 -3.6882720456950596e-02 1.8394448531030245e+00 2.0022836845837388e+00 2.4069302895361172e-01 1.5509819776432541e+00 -1.7681719407776315e+00 4.2899877608702931e-02 -1.6298761998549192e+00 -4.2908784413845407e+00 -2.0259075881591287e-01 -2.0712922243723164e+00 4.0524780735695547e+00 -1.9123872403588493e-02 2.0031119870278671e+00 2.5123541502387137e+00 1.8530152990422333e-01 1.7593135235795010e+00 -2.8022822630831570e+00 4.5484293421907664e-02 -1.7405619891673962e+00 -8.9409943948568008e-02 -1.3380197684107951e+00 -1.3286945305888323e-01 -2.6873069558193213e-02 1.3463549864231315e+00 -3.5274224266948352e-02 7.0695163434341610e-02 6.4248006771059563e-01 1.2085426491267684e-01 3.3867730196868145e-02 -6.7666605238199995e-01 4.8733331255075236e-02 -1.9279119823429025e-01 -2.6191558433347688e+00 -2.8373732553512632e-01 -1.9123872403588496e-02 2.6724947789048477e+00 -3.1164248829929082e-02 1.7392274844135253e-01 1.2885012978394139e+00 2.5561203546934869e-01 4.9712442072077763e-02 -1.3159894667504246e+00 5.7845620053786288e-02 -1.7174395531889837e+00 -3.7791857156202141e-01 -3.8635525506347763e+00 1.8257847241788554e+00 -4.7130992842383798e-02 3.5757613807669690e+00 1.8136799884648800e+00 3.6219616270746707e-01 2.6813185720213721e+00 -1.6060545079790174e+00 6.1350328140799035e-02 -3.0726027934472948e+00 -2.0761791929362090e+00 -2.9641406489873928e-01 -5.1375694593182768e+00 2.0031119870278666e+00 -3.1164248829929145e-02 5.5759021466466336e+00 1.7497435024232957e+00 2.6862167380296154e-01 3.8487376980447729e+00 -1.9926469479906881e+00 6.0459713481845583e-02 -3.6079949940794025e+00 -1.7530391614413718e+00 -3.5184818975198484e-01 -1.5734000734004288e+00 1.9989491020332575e+00 9.1859084626964779e-02 1.5555220071642912e+00 2.7254788131040000e+00 4.0318373940433438e-01 1.7562623144021969e+00 -2.4520737725713255e+00 -7.6220435132645481e-02 -1.6873201035571548e+00 -2.7807576166175032e+00 -4.1606319723943086e-01 -1.6809062866414697e+00 2.5123541502387137e+00 1.7392274844135253e-01 1.7497435024232957e+00 3.9508426385047142e+00 4.1170512546700566e-01 1.9108049962761084e+00 -4.2017541532504845e+00 -2.3653887581559629e-01 -2.0307063566668409e+00 -3.5502458086339694e-01 -7.8894867942976288e-01 -5.1630578531752369e-01 3.0714741817834079e-01 6.4072780356711134e-01 3.1107002930012717e-01 4.0064702174273448e-01 1.4334658996817651e+00 4.8911164849114830e-01 -2.5232226186236001e-01 -1.3126476455892950e+00 -3.7581658496808451e-01 -4.5587980639763526e-01 -1.4432952689724612e+00 -5.1792713235382160e-01 1.8530152990422330e-01 1.2885012978394139e+00 2.6862167380296154e-01 4.1170512546700566e-01 2.7522517671990276e+00 5.9483876421755133e-01 -2.4157444616891210e-01 -2.5700551742957995e+00 -2.5359261317235915e-01 -1.5707159382214995e+00 -5.1084248778740360e-01 -2.9653616474086877e+00 1.8032847508241989e+00 8.0602642917955533e-02 2.6964527808798073e+00 1.7384239874590190e+00 4.8802683129600549e-01 3.4162309841051561e+00 -1.6703194757619551e+00 -1.1701209251023284e-01 -3.8079703333163319e+00 -1.9411019168115933e+00 -5.4390827940977071e-01 -3.5020452160019717e+00 1.7593135235795008e+00 2.5561203546934869e-01 3.8487376980447729e+00 1.9108049962761084e+00 5.9483876421755122e-01 5.3717896810261427e+00 -2.0296899273437794e+00 -2.4731741419345421e-01 -5.0578339473288905e+00 1.9704237405656639e+00 3.0203028610834121e-01 1.7915251532300758e+00 -2.3413584767743076e+00 5.5122015189278520e-02 -1.7313569259864912e+00 -3.0744784483041432e+00 -3.0854432037793911e-01 -1.7967479575677161e+00 2.7190954823083144e+00 -3.7728016339224998e-02 1.7800228626355967e+00 3.0839330699419127e+00 2.1252664547222658e-01 1.8737264812321648e+00 -2.8022822630831574e+00 4.9712442072077791e-02 -1.9926469479906881e+00 -4.2017541532504836e+00 -2.4157444616891205e-01 -2.0296899273437794e+00 4.6464210485962010e+00 -3.1544605955847689e-02 2.1051672617908403e+00 9.9963519534176024e-02 6.2108147850050555e-01 9.0529118491490729e-02 4.4523180667044117e-02 -6.7502626245559183e-01 4.7439186653423254e-02 -1.0299089533220079e-01 -1.3119038009401200e+00 -1.0667265105305321e-01 -2.8194506662747747e-02 1.3102219705935942e+00 -3.3990392324959838e-02 2.0929789014326466e-01 1.2762376881594062e+00 2.2068952506364031e-01 4.5484293421907664e-02 -1.3159894667504246e+00 6.0459713481845569e-02 -2.3653887581559629e-01 -2.5700551742957991e+00 -2.4731741419345415e-01 -3.1544605955847647e-02 2.6654335671884297e+00 -3.1137086118932754e-02 1.5565677775201734e+00 3.1047729795871681e-01 2.6733152678298349e+00 -1.7513931532113394e+00 5.9081987276845209e-02 -2.4931745522303892e+00 -1.8214076875131129e+00 -3.2296919733458607e-01 -3.1789971210105308e+00 1.8062331817811996e+00 -4.6675104325002534e-02 3.5117688964964922e+00 1.8761009654664766e+00 2.2696909566153239e-01 3.2540811829425023e+00 -1.7405619891673962e+00 5.7845620053786281e-02 -3.6079949940794025e+00 -2.0307063566668404e+00 -2.5359261317235920e-01 -5.0578339473288905e+00 2.1051672617908403e+00 -3.1137086118932771e-02 4.8988352673803872e+00 27 28 29 87 88 89 102 103 104 42 43 44 786 787 788 828 829 830 840 841 842 798 799 800 3.8558360906475175e+00 7.1006922027895003e-01 1.7006268201466230e+00 -4.0597876741877927e+00 -6.1169667685704288e-01 -1.8533608202977918e+00 -2.5774404006220184e+00 -6.8080666818045066e-01 -1.4324475782759407e+00 2.3254341540613779e+00 4.6875552764631440e-01 1.5470085862425336e+00 2.6576993336164834e+00 7.4026705552424987e-01 1.6461777135252249e+00 -2.4222862538718539e+00 -4.2294946387818622e-01 -1.6391667338166278e+00 -1.6651563662102984e+00 -6.2690326759817649e-01 -1.4412390402456774e+00 1.8857011165665836e+00 4.2326427306434150e-01 1.4724010527216553e+00 7.1006922027895003e-01 3.0659158931104509e+00 1.0005852225964440e+00 -5.8680351292436228e-01 -2.7564466404723884e+00 -6.8248755372911007e-01 -7.3983390286921080e-01 -1.6856613826515989e+00 -8.1859991896892015e-01 4.3483765259736418e-01 1.4330275608450624e+00 6.5185491051213540e-01 7.3073220826958019e-01 1.6982603203533728e+00 8.7005808509646076e-01 -5.6288196417804892e-01 -1.5085478892528223e+00 -8.3758496957031436e-01 -6.1022720430442912e-01 -1.0459225540869097e+00 -8.7805707634686025e-01 6.2410750313015673e-01 7.9937469215483281e-01 6.9423130041016434e-01 1.7006268201466230e+00 1.0005852225964442e+00 5.0369837939368152e+00 -1.8342468868060759e+00 -7.0567160131582019e-01 -4.7999088917849901e+00 -1.6537968791543505e+00 -8.6952312564308032e-01 -3.1094391498161023e+00 1.5265989463792058e+00 6.9079376059634712e-01 3.5188313580637951e+00 1.6390273784995468e+00 8.7577338040671771e-01 3.2249098554913442e+00 -1.6085084609626181e+00 -6.1641468447665326e-01 -3.6900616040208871e+00 -1.4292308104388696e+00 -8.9453777965931980e-01 -2.7239708916322147e+00 1.6595298923365398e+00 5.1899482749536419e-01 2.5426555297622411e+00 -4.0597876741877927e+00 -5.8680351292436228e-01 -1.8342468868060762e+00 4.4506388695553127e+00 3.9593097626335749e-01 1.9584178582596883e+00 2.8723886514571468e+00 5.4456712906942240e-01 1.6570808411728477e+00 -2.6134628539317837e+00 -3.1112563583755803e-01 -1.8252328411929706e+00 -3.0293553421140693e+00 -7.0058362779611350e-01 -1.7245437731404623e+00 2.7157127499571043e+00 3.6320461865509485e-01 1.7776758160293777e+00 1.9112274964585887e+00 6.4575259773272886e-01 1.6849382336013374e+00 -2.2473618971945077e+00 -3.5094254516256901e-01 -1.6940892479237417e+00 -6.1169667685704299e-01 -2.7564466404723884e+00 -7.0567160131582041e-01 3.9593097626335749e-01 2.6961701583960060e+00 4.2209052567213251e-01 5.6804452421625262e-01 1.4407701416336691e+00 6.0058806503119855e-01 -2.7580050035039672e-01 -1.3673995803006873e+00 -3.8507487191294854e-01 -4.9213542575557723e-01 -1.4899524804108615e+00 -4.9688791595484605e-01 3.3761765915784003e-01 1.4000018680126485e+00 4.1568111617220771e-01 4.0156130573325027e-01 8.1112458693458678e-01 4.9445722492921496e-01 -3.2352186240768344e-01 -7.3426805379297244e-01 -3.4518254262113873e-01 -1.8533608202977918e+00 -6.8248755372911007e-01 -4.7999088917849901e+00 1.9584178582596887e+00 4.2209052567213251e-01 4.6925332836389479e+00 1.6342016677467637e+00 5.6582610941459344e-01 2.9862280559999577e+00 -1.5501717260213048e+00 -3.5983580158390066e-01 -3.4186745540014316e+00 -1.7691427780709399e+00 -7.2902207360946458e-01 -3.0863969894738097e+00 1.7839154428378063e+00 4.4805147629754116e-01 3.5034480557502734e+00 1.4605804767407757e+00 7.0330650581038490e-01 2.5665133621997449e+00 -1.6644401211949991e+00 -3.6792918827217580e-01 -2.4437423223286916e+00 -2.5774404006220180e+00 -7.3983390286921080e-01 -1.6537968791543509e+00 2.8723886514571468e+00 5.6804452421625262e-01 1.6342016677467637e+00 4.3277769493367666e+00 8.3191759365970575e-01 1.7377929806453318e+00 -3.9829485951971497e+00 -5.4696934797803609e-01 -1.7564343264383009e+00 -2.2114311702892477e+00 -7.6001086683019059e-01 -1.5355649578533135e+00 1.9123500087892960e+00 4.3149560992428510e-01 1.7092267923451647e+00 2.6047481489362849e+00 7.0920623906817526e-01 1.5652352437132151e+00 -2.9454435924110802e+00 -4.9384984919098046e-01 -1.7006605210045094e+00 -6.8080666818045066e-01 -1.6856613826515989e+00 -8.6952312564308032e-01 5.4456712906942240e-01 1.4407701416336691e+00 5.6582610941459344e-01 8.3191759365970586e-01 3.0166190764546470e+00 8.4038325983171025e-01 -5.2128019250821933e-01 -2.7507780621110398e+00 -6.8212305413304275e-01 -7.6151408599690407e-01 -1.0408256129952789e+00 -7.5811810693360382e-01 5.4452740730543037e-01 8.1639153067486314e-01 7.6295771443044136e-01 7.1039693420025407e-01 1.6984611868516981e+00 8.4098544266274389e-01 -6.6780811754923863e-01 -1.4949768778569608e+00 -7.0038823962976138e-01 -1.4324475782759407e+00 -8.1859991896892015e-01 -3.1094391498161018e+00 1.6570808411728475e+00 6.0058806503119866e-01 2.9862280559999572e+00 1.7377929806453316e+00 8.4038325983171003e-01 4.3764654899273534e+00 -1.8179227424899551e+00 -7.3767063118751319e-01 -4.7354292544828471e+00 -1.5343176920166437e+00 -7.5600502690094840e-01 -2.1896787620180467e+00 1.4487123907283068e+00 5.2288760612238427e-01 2.5266455424049825e+00 1.5959234416184640e+00 8.5449782483615710e-01 3.1772659583342837e+00 -1.6548216413824108e+00 -5.0608117876406800e-01 -3.0320578803495826e+00 2.3254341540613779e+00 4.3483765259736418e-01 1.5265989463792056e+00 -2.6134628539317837e+00 -2.7580050035039677e-01 -1.5501717260213050e+00 -3.9829485951971497e+00 -5.2128019250821922e-01 -1.8179227424899547e+00 3.8414738299250004e+00 3.1520437870365714e-01 1.7643692198678194e+00 1.8731542813469000e+00 5.3568346646475284e-01 1.4245109892010257e+00 -1.6991673624073600e+00 -2.8555648878471040e-01 -1.5332346070080058e+00 -2.3602352315461563e+00 -5.4587388675090709e-01 -1.5379744490867215e+00 2.6157517777491694e+00 3.4278557062845882e-01 1.7238243691579358e+00 4.6875552764631434e-01 1.4330275608450624e+00 6.9079376059634712e-01 -3.1112563583755803e-01 -1.3673995803006873e+00 -3.5983580158390066e-01 -5.4696934797803609e-01 -2.7507780621110398e+00 -7.3767063118751319e-01 3.1520437870365714e-01 2.7578408121693596e+00 4.7293265819571584e-01 4.0175317006026307e-01 7.8111434878162433e-01 4.9099465971539236e-01 -2.6474129893680065e-01 -7.4355322380299094e-01 -3.9631885883307777e-01 -3.7593574879770386e-01 -1.4971319078197103e+00 -5.6648179533660625e-01 3.1305895513986393e-01 1.3868800522383815e+00 4.0558600843364240e-01 1.5470085862425336e+00 6.5185491051213540e-01 3.5188313580637951e+00 -1.8252328411929706e+00 -3.8507487191294859e-01 -3.4186745540014316e+00 -1.7564343264383009e+00 -6.8212305413304275e-01 -4.7354292544828462e+00 1.7643692198678191e+00 4.7293265819571584e-01 5.3366844894957381e+00 1.7345996196760975e+00 7.7741747452296095e-01 2.5220369210864408e+00 -1.5794556408546176e+00 -4.4018322373937080e-01 -3.0224107660887394e+00 -1.5765296819666932e+00 -8.2971111575796885e-01 -3.6510472916814494e+00 1.6916750646661318e+00 4.3488722231251803e-01 3.4500090976084916e+00 2.6576993336164834e+00 7.3073220826958019e-01 1.6390273784995466e+00 -3.0293553421140693e+00 -4.9213542575557723e-01 -1.7691427780709399e+00 -2.2114311702892477e+00 -7.6151408599690407e-01 -1.5343176920166437e+00 1.8731542813469002e+00 4.0175317006026307e-01 1.7345996196760975e+00 4.6525094409272700e+00 9.3509944848706628e-01 1.9366360087164647e+00 -4.2480818183000597e+00 -6.2015191912959156e-01 -1.9903070680054611e+00 -2.7137464121171941e+00 -8.1008360553458725e-01 -1.7946111760979691e+00 3.0192516869299180e+00 6.1630020959975029e-01 1.7781157072989033e+00 7.4026705552424987e-01 1.6982603203533730e+00 8.7577338040671771e-01 -7.0058362779611350e-01 -1.4899524804108617e+00 -7.2902207360946458e-01 -7.6001086683019070e-01 -1.0408256129952789e+00 -7.5600502690094840e-01 5.3568346646475296e-01 7.8111434878162433e-01 7.7741747452296095e-01 9.3509944848706628e-01 3.1849444928396817e+00 9.3969284880616122e-01 -6.2616945749663588e-01 -2.8695964003989189e+00 -8.1130790538823838e-01 -7.3388316921473407e-01 -1.7662034862088751e+00 -9.4378787935203123e-01 6.0959715086160537e-01 1.5022588180392558e+00 6.4723918151484205e-01 1.6461777135252254e+00 8.7005808509646076e-01 3.2249098554913433e+00 -1.7245437731404625e+00 -4.9688791595484605e-01 -3.0863969894738092e+00 -1.5355649578533137e+00 -7.5811810693360382e-01 -2.1896787620180467e+00 1.4245109892010257e+00 4.9099465971539236e-01 2.5220369210864408e+00 1.9366360087164647e+00 9.3969284880616144e-01 4.6836793992096206e+00 -1.9743436371949508e+00 -7.9761493920100235e-01 -5.0097072096267254e+00 -1.5349334824274161e+00 -8.9403540275836402e-01 -3.2983017129999981e+00 1.7620611391734278e+00 6.4591077122980101e-01 3.1534584983311733e+00 -2.4222862538718539e+00 -5.6288196417804892e-01 -1.6085084609626181e+00 2.7157127499571043e+00 3.3761765915784003e-01 1.7839154428378068e+00 1.9123500087892960e+00 5.4452740730543037e-01 1.4487123907283066e+00 -1.6991673624073602e+00 -2.6474129893680065e-01 -1.5794556408546176e+00 -4.2480818183000597e+00 -6.2616945749663577e-01 -1.9743436371949508e+00 4.0275170691811395e+00 3.8957563766800335e-01 1.9571627896684656e+00 2.4705969486584518e+00 5.1830615291458471e-01 1.6695724722988308e+00 -2.7566413420067208e+00 -3.3623413643437244e-01 -1.6970553565212223e+00 -4.2294946387818622e-01 -1.5085478892528223e+00 -6.1641468447665315e-01 3.6320461865509485e-01 1.4000018680126485e+00 4.4805147629754116e-01 4.3149560992428510e-01 8.1639153067486314e-01 5.2288760612238427e-01 -2.8555648878471040e-01 -7.4355322380299094e-01 -4.4018322373937074e-01 -6.2015191912959167e-01 -2.8695964003989189e+00 -7.9761493920100235e-01 3.8957563766800335e-01 2.8030722803572603e+00 5.6593684701002833e-01 5.0806976598798992e-01 1.5232647097558609e+00 7.4914859707228065e-01 -3.6368776044288503e-01 -1.4210328753459001e+00 -4.3181167908520773e-01 -1.6391667338166278e+00 -8.3758496957031436e-01 -3.6900616040208871e+00 1.7776758160293777e+00 4.1568111617220771e-01 3.5034480557502730e+00 1.7092267923451647e+00 7.6295771443044136e-01 2.5266455424049825e+00 -1.5332346070080058e+00 -3.9631885883307783e-01 -3.0224107660887389e+00 -1.9903070680054611e+00 -8.1130790538823827e-01 -5.0097072096267254e+00 1.9571627896684662e+00 5.6593684701002844e-01 5.5558660008246337e+00 1.6427676174321197e+00 7.4981377328430032e-01 3.7323103539700844e+00 -1.9241246066450337e+00 -4.4917771710534626e-01 -3.5960903732136189e+00 -1.6651563662102986e+00 -6.1022720430442912e-01 -1.4292308104388696e+00 1.9112274964585882e+00 4.0156130573325022e-01 1.4605804767407757e+00 2.6047481489362849e+00 7.1039693420025407e-01 1.5959234416184640e+00 -2.3602352315461563e+00 -3.7593574879770375e-01 -1.5765296819666927e+00 -2.7137464121171941e+00 -7.3388316921473407e-01 -1.5349334824274159e+00 2.4705969486584518e+00 5.0806976598798992e-01 1.6427676174321197e+00 3.9239576831842342e+00 7.4322874465240996e-01 1.7504922913044683e+00 -4.1713922673639106e+00 -6.4321062825703668e-01 -1.9090698522628480e+00 -6.2690326759817649e-01 -1.0459225540869097e+00 -8.9453777965931980e-01 6.4575259773272886e-01 8.1112458693458678e-01 7.0330650581038490e-01 7.0920623906817537e-01 1.6984611868516981e+00 8.5449782483615710e-01 -5.4587388675090709e-01 -1.4971319078197103e+00 -8.2971111575796885e-01 -8.1008360553458747e-01 -1.7662034862088751e+00 -8.9403540275836413e-01 5.1830615291458471e-01 1.5232647097558609e+00 7.4981377328430021e-01 7.4322874465240996e-01 3.1463047982773529e+00 1.0603020121675168e+00 -6.3363297448422773e-01 -2.8698973337040030e+00 -7.4963581792270606e-01 -1.4412390402456774e+00 -8.7805707634686025e-01 -2.7239708916322147e+00 1.6849382336013374e+00 4.9445722492921496e-01 2.5665133621997449e+00 1.5652352437132153e+00 8.4098544266274411e-01 3.1772659583342842e+00 -1.5379744490867215e+00 -5.6648179533660625e-01 -3.6510472916814494e+00 -1.7946111760979688e+00 -9.4378787935203134e-01 -3.2983017129999981e+00 1.6695724722988308e+00 7.4914859707228065e-01 3.7323103539700844e+00 1.7504922913044683e+00 1.0603020121675168e+00 5.1882123813399552e+00 -1.8964135754874842e+00 -7.5656652579625794e-01 -4.9909821595304056e+00 1.8857011165665836e+00 6.2410750313015673e-01 1.6595298923365398e+00 -2.2473618971945082e+00 -3.2352186240768349e-01 -1.6644401211949991e+00 -2.9454435924110802e+00 -6.6780811754923863e-01 -1.6548216413824108e+00 2.6157517777491699e+00 3.1305895513986387e-01 1.6916750646661318e+00 3.0192516869299180e+00 6.0959715086160537e-01 1.7620611391734280e+00 -2.7566413420067208e+00 -3.6368776044288503e-01 -1.9241246066450335e+00 -4.1713922673639106e+00 -6.3363297448422762e-01 -1.8964135754874842e+00 4.6001345177305470e+00 4.4188710575240814e-01 2.0265338485338278e+00 4.2326427306434150e-01 7.9937469215483281e-01 5.1899482749536419e-01 -3.5094254516256912e-01 -7.3426805379297244e-01 -3.6792918827217580e-01 -4.9384984919098052e-01 -1.4949768778569608e+00 -5.0608117876406800e-01 3.4278557062845877e-01 1.3868800522383815e+00 4.3488722231251803e-01 6.1630020959975029e-01 1.5022588180392558e+00 6.4591077122980112e-01 -3.3623413643437244e-01 -1.4210328753459001e+00 -4.4917771710534626e-01 -6.4321062825703679e-01 -2.8698973337040030e+00 -7.5656652579625816e-01 4.4188710575240814e-01 2.8316615782673669e+00 4.7996178890016444e-01 1.4724010527216551e+00 6.9423130041016434e-01 2.5426555297622411e+00 -1.6940892479237419e+00 -3.4518254262113873e-01 -2.4437423223286916e+00 -1.7006605210045096e+00 -7.0038823962976138e-01 -3.0320578803495821e+00 1.7238243691579358e+00 4.0558600843364240e-01 3.4500090976084916e+00 1.7781157072989033e+00 6.4723918151484205e-01 3.1534584983311733e+00 -1.6970553565212223e+00 -4.3181167908520779e-01 -3.5960903732136185e+00 -1.9090698522628482e+00 -7.4963581792270617e-01 -4.9909821595304056e+00 2.0265338485338273e+00 4.7996178890016455e-01 4.9167496097203918e+00 87 88 89 147 148 149 162 163 164 102 103 104 828 829 830 870 871 872 882 883 884 840 841 842 3.7841722518616829e+00 6.9018967425356548e-01 1.6371221738533543e+00 -3.9893050150998675e+00 -6.0011480575902199e-01 -1.7969365642488546e+00 -2.5184813661920247e+00 -6.6376427598303489e-01 -1.3746620825875551e+00 2.2616486039626658e+00 4.5442988361317499e-01 1.4858486060458569e+00 2.5540385205877802e+00 7.2330902987293111e-01 1.5806341299075550e+00 -2.3150942454344841e+00 -3.9780297766261435e-01 -1.5679781920729470e+00 -1.5855257575173010e+00 -6.0821911291194741e-01 -1.3743504451880750e+00 1.8085470078315495e+00 4.0197258457694734e-01 1.4103223742906652e+00 6.9018967425356537e-01 3.0440651138329025e+00 9.8055950275194581e-01 -5.6364134346797479e-01 -2.7266323408659052e+00 -6.5282826704751928e-01 -7.2485387082022223e-01 -1.6703350259642931e+00 -7.9766878418236709e-01 4.1095571989506141e-01 1.4107544090813822e+00 6.2314564828585350e-01 7.1053021480204381e-01 1.6459597475120789e+00 8.4521474724537915e-01 -5.3993396977713148e-01 -1.4482240014438892e+00 -8.1216626608188136e-01 -5.8963835505778783e-01 -1.0172117983448965e+00 -8.5542974837839436e-01 6.0639193017244597e-01 7.6162389619262072e-01 6.6917316740698329e-01 1.6371221738533539e+00 9.8055950275194592e-01 4.9481046450929895e+00 -1.7732387871361126e+00 -6.8843943590051426e-01 -4.7064856056974724e+00 -1.5974958596812940e+00 -8.4955949388391905e-01 -3.0254352561094340e+00 1.4677991803324313e+00 6.7702264404093793e-01 3.4388996173789481e+00 1.5725789812448698e+00 8.5414186035152029e-01 3.0927207794774256e+00 -1.5421139276605187e+00 -5.8739566249043418e-01 -3.5655021210508648e+00 -1.3658771493813271e+00 -8.7690710317362375e-01 -2.6238981825010077e+00 1.6012253884285981e+00 4.9057768830408732e-01 2.4415961234094161e+00 -3.9893050150998675e+00 -5.6364134346797479e-01 -1.7732387871361130e+00 4.3959110980046372e+00 3.7477542933382113e-01 1.9025285550877520e+00 2.8214354817146705e+00 5.2244826770058295e-01 1.6026258863252714e+00 -2.5565946204661252e+00 -2.9075576995138036e-01 -1.7710980545027528e+00 -2.9374274734102346e+00 -6.8483762787358538e-01 -1.6623537703285707e+00 2.6138910261680457e+00 3.3675413201948595e-01 1.7143375239983150e+00 1.8338441199002009e+00 6.3127778123435707e-01 1.6251654185307161e+00 -2.1817546168113271e+00 -3.2602086899530669e-01 -1.6379667719746178e+00 -6.0011480575902199e-01 -2.7266323408659052e+00 -6.8843943590051426e-01 3.7477542933382113e-01 2.6741555730204443e+00 3.9700852159263772e-01 5.5708763081563895e-01 1.4199384437479179e+00 5.8504618945933706e-01 -2.5616761989218734e-01 -1.3504538903628303e+00 -3.5961528901153234e-01 -4.7226009459405072e-01 -1.4354130950509292e+00 -4.7303576617760884e-01 3.1508785519454963e-01 1.3446709088967026e+00 3.8861683371712441e-01 3.8414046932909141e-01 7.7662288492818177e-01 4.7094056498705839e-01 -3.0254886442784129e-01 -7.0288848431358097e-01 -3.2052161866650225e-01 -1.7969365642488548e+00 -6.5282826704751917e-01 -4.7064856056974733e+00 1.9025285550877522e+00 3.9700852159263772e-01 4.6039511413856777e+00 1.5783024408962334e+00 5.3798894213736637e-01 2.9020380348153165e+00 -1.4950345600705135e+00 -3.3578983440934168e-01 -3.3407441315695205e+00 -1.7025229740507348e+00 -7.0557556355332007e-01 -2.9573313923918572e+00 1.7207234392836670e+00 4.1598469320812426e-01 3.3788411117073496e+00 1.3982347134337694e+00 6.8171222510225205e-01 2.4649509893525661e+00 -1.6052950503313193e+00 -3.3850071703019952e-01 -2.3452201476020593e+00 -2.5184813661920247e+00 -7.2485387082022223e-01 -1.5974958596812940e+00 2.8214354817146705e+00 5.5708763081563895e-01 1.5783024408962334e+00 4.2655953151003141e+00 8.1850506096532605e-01 1.6799744620448893e+00 -3.9073146395138947e+00 -5.3214564866026526e-01 -1.6956808493658082e+00 -2.1444892479490267e+00 -7.4818903414943261e-01 -1.4762327803323436e+00 1.8353225115353715e+00 4.0776933126239073e-01 1.6526372254110802e+00 2.4978826622596273e+00 6.9326343468183460e-01 1.5007878604254037e+00 -2.8499507169550364e+00 -4.7143690409527061e-01 -1.6422924993981609e+00 -6.6376427598303500e-01 -1.6703350259642928e+00 -8.4955949388391905e-01 5.2244826770058295e-01 1.4199384437479177e+00 5.3798894213736626e-01 8.1850506096532594e-01 2.9901213382923886e+00 8.1787267181494494e-01 -4.9715700772163918e-01 -2.7140256426573339e+00 -6.5367455768475657e-01 -7.4537352265842349e-01 -1.0138730270772025e+00 -7.3403309068155764e-01 5.2260776259636399e-01 7.7870403550832124e-01 7.4073269763297489e-01 6.9117108473812816e-01 1.6418425766942553e+00 8.1604817747839409e-01 -6.4843736963730325e-01 -1.4323726985440539e+00 -6.7537534681344713e-01 -1.3746620825875548e+00 -7.9766878418236697e-01 -3.0254352561094340e+00 1.6026258863252714e+00 5.8504618945933706e-01 2.9020380348153165e+00 1.6799744620448893e+00 8.1787267181494494e-01 4.2778319975639967e+00 -1.7655684267873109e+00 -7.2389594907974342e-01 -4.6345463102882345e+00 -1.4715628906549074e+00 -7.3450308298784073e-01 -2.0874830212843922e+00 1.3868847512488371e+00 4.9684062516149724e-01 2.4246730266006566e+00 1.5318160402409786e+00 8.3370858787200897e-01 3.0428590347806614e+00 -1.5895077398302042e+00 -4.7740025805783748e-01 -2.8999375060785706e+00 2.2616486039626658e+00 4.1095571989506141e-01 1.4677991803324313e+00 -2.5565946204661252e+00 -2.5616761989218734e-01 -1.4950345600705137e+00 -3.9073146395138947e+00 -4.9715700772163907e-01 -1.7655684267873106e+00 3.7680558525825916e+00 2.9517109442515738e-01 1.7038135667792551e+00 1.7952642564609405e+00 5.1644720447752801e-01 1.3627276933339940e+00 -1.6209313344079872e+00 -2.6136411324258252e-01 -1.4691098917466952e+00 -2.2501572245486772e+00 -5.2537815565532131e-01 -1.4673951411783042e+00 2.5100291059304869e+00 3.1749287771398377e-01 1.6627675793371437e+00 4.5442988361317499e-01 1.4107544090813822e+00 6.7702264404093804e-01 -2.9075576995138042e-01 -1.3504538903628303e+00 -3.3578983440934168e-01 -5.3214564866026526e-01 -2.7140256426573339e+00 -7.2389594907974331e-01 2.9517109442515738e-01 2.7289055862418650e+00 4.4688688980598029e-01 3.8187287291313954e-01 7.4538653482280770e-01 4.6942004755477951e-01 -2.4461039933959913e-01 -7.1102787449692650e-01 -3.7042121503374481e-01 -3.5603845026845310e-01 -1.4347389370738832e+00 -5.4205631933815335e-01 2.9207641726822592e-01 1.3251998144449189e+00 3.7883373645928542e-01 1.4858486060458569e+00 6.2314564828585362e-01 3.4388996173789486e+00 -1.7710980545027530e+00 -3.5961528901153234e-01 -3.3407441315695205e+00 -1.6956808493658082e+00 -6.5367455768475657e-01 -4.6345463102882336e+00 1.7038135667792551e+00 4.4688688980598035e-01 5.2504226464717414e+00 1.6761598059717766e+00 7.5847080963169367e-01 2.4173486296255158e+00 -1.5170072495441871e+00 -4.0857425240868395e-01 -2.9293591094343965e+00 -1.5113724098990822e+00 -8.0945220951654195e-01 -3.5208209594987703e+00 1.6293365845149415e+00 4.0281296089798740e-01 3.3187996173147161e+00 2.5540385205877802e+00 7.1053021480204381e-01 1.5725789812448701e+00 -2.9374274734102346e+00 -4.7226009459405072e-01 -1.7025229740507348e+00 -2.1444892479490267e+00 -7.4537352265842349e-01 -1.4715628906549074e+00 1.7952642564609405e+00 3.8187287291313954e-01 1.6761598059717766e+00 4.4233084056779903e+00 9.1440254860176240e-01 1.8493710803337278e+00 -4.0046631906210903e+00 -5.8630920807152587e-01 -1.9077975691814490e+00 -2.5642143596704128e+00 -7.9199789291684719e-01 -1.7234230614893842e+00 2.8781830889240529e+00 5.8913508192390207e-01 1.7071966278261015e+00 7.2330902987293111e-01 1.6459597475120789e+00 8.5414186035152040e-01 -6.8483762787358515e-01 -1.4354130950509292e+00 -7.0557556355332018e-01 -7.4818903414943261e-01 -1.0138730270772025e+00 -7.3450308298784073e-01 5.1644720447752801e-01 7.4538653482280770e-01 7.5847080963169367e-01 9.1440254860176240e-01 3.0159305412813326e+00 9.0791270441245708e-01 -5.9977922827471908e-01 -2.6844994834502072e+00 -7.8443836822732860e-01 -7.1311589112819318e-01 -1.6749733423245008e+00 -9.1986115968808080e-01 5.9176299847370883e-01 1.4014821242866202e+00 6.2385280006089938e-01 1.5806341299075550e+00 8.4521474724537915e-01 3.0927207794774252e+00 -1.6623537703285711e+00 -4.7303576617760884e-01 -2.9573313923918567e+00 -1.4762327803323436e+00 -7.3403309068155764e-01 -2.0874830212843922e+00 1.3627276933339940e+00 4.6942004755477951e-01 2.4173486296255153e+00 1.8493710803337282e+00 9.0791270441245708e-01 4.4094453424793612e+00 -1.8859075552408733e+00 -7.5929248781908698e-01 -4.7312727612202581e+00 -1.4583495783069398e+00 -8.6823870246027224e-01 -3.1169705340461702e+00 1.6901107806334503e+00 6.1205254792591024e-01 2.9735429573603760e+00 -2.3150942454344845e+00 -5.3993396977713148e-01 -1.5421139276605185e+00 2.6138910261680457e+00 3.1508785519454957e-01 1.7207234392836670e+00 1.8353225115353715e+00 5.2260776259636388e-01 1.3868847512488371e+00 -1.6209313344079872e+00 -2.4461039933959913e-01 -1.5170072495441871e+00 -4.0046631906210903e+00 -5.9977922827471919e-01 -1.8859075552408728e+00 3.7839757464873558e+00 3.5693690552521179e-01 1.8681137114542321e+00 2.3162654687785977e+00 4.9752827513427850e-01 1.5920274562641001e+00 -2.6087659825058096e+00 -3.0783720105895418e-01 -1.6227206258052580e+00 -3.9780297766261435e-01 -1.4482240014438892e+00 -5.8739566249043429e-01 3.3675413201948595e-01 1.3446709088967026e+00 4.1598469320812431e-01 4.0776933126239068e-01 7.7870403550832124e-01 4.9684062516149724e-01 -2.6136411324258257e-01 -7.1102787449692650e-01 -4.0857425240868395e-01 -5.8630920807152598e-01 -2.6844994834502072e+00 -7.5929248781908676e-01 3.5693690552521179e-01 2.6226976802757860e+00 5.2407692631345248e-01 4.7924353884732407e-01 1.4202915205955093e+00 7.1484699716489697e-01 -3.3522760867768980e-01 -1.3226127858852963e+00 -3.9648683912976590e-01 -1.5679781920729470e+00 -8.1216626608188125e-01 -3.5655021210508653e+00 1.7143375239983150e+00 3.8861683371712441e-01 3.3788411117073496e+00 1.6526372254110802e+00 7.4073269763297500e-01 2.4246730266006566e+00 -1.4691098917466954e+00 -3.7042121503374476e-01 -2.9293591094343965e+00 -1.9077975691814490e+00 -7.8443836822732871e-01 -4.7312727612202581e+00 1.8681137114542321e+00 5.2407692631345248e-01 5.2892029219352992e+00 1.5673702423150886e+00 7.2787112636556428e-01 3.5547375921077773e+00 -1.8575730501776253e+00 -4.1427173468616157e-01 -3.4213206606455633e+00 -1.5855257575173010e+00 -5.8963835505778772e-01 -1.3658771493813273e+00 1.8338441199002009e+00 3.8414046932909135e-01 1.3982347134337694e+00 2.4978826622596273e+00 6.9117108473812816e-01 1.5318160402409786e+00 -2.2501572245486772e+00 -3.5603845026845310e-01 -1.5113724098990819e+00 -2.5642143596704123e+00 -7.1311589112819307e-01 -1.4583495783069393e+00 2.3162654687785977e+00 4.7924353884732407e-01 1.5673702423150886e+00 3.6661649502234122e+00 7.1620243694935204e-01 1.6594348363929718e+00 -3.9142598594254467e+00 -6.1196483340946184e-01 -1.8212566947954600e+00 -6.0821911291194741e-01 -1.0172117983448967e+00 -8.7690710317362375e-01 6.3127778123435707e-01 7.7662288492818177e-01 6.8171222510225216e-01 6.9326343468183471e-01 1.6418425766942555e+00 8.3370858787200908e-01 -5.2537815565532131e-01 -1.4347389370738832e+00 -8.0945220951654184e-01 -7.9199789291684730e-01 -1.6749733423245010e+00 -8.6823870246027224e-01 4.9752827513427844e-01 1.4202915205955093e+00 7.2787112636556417e-01 7.1620243694935204e-01 2.9583301586435713e+00 1.0312868193821465e+00 -6.1267676651570591e-01 -2.6701630631182374e+00 -7.1998074357153430e-01 -1.3743504451880748e+00 -8.5542974837839436e-01 -2.6238981825010077e+00 1.6251654185307163e+00 4.7094056498705839e-01 2.4649509893525661e+00 1.5007878604254037e+00 8.1604817747839409e-01 3.0428590347806614e+00 -1.4673951411783042e+00 -5.4205631933815335e-01 -3.5208209594987703e+00 -1.7234230614893842e+00 -9.1986115968808080e-01 -3.1169705340461702e+00 1.5920274562641004e+00 7.1484699716489697e-01 3.5547375921077773e+00 1.6594348363929718e+00 1.0312868193821467e+00 4.8974528877145147e+00 -1.8122469237574284e+00 -7.1577533160786821e-01 -4.6983108279095731e+00 1.8085470078315495e+00 6.0639193017244586e-01 1.6012253884285981e+00 -2.1817546168113271e+00 -3.0254886442784124e-01 -1.6052950503313193e+00 -2.8499507169550373e+00 -6.4843736963730325e-01 -1.5895077398302038e+00 2.5100291059304864e+00 2.9207641726822592e-01 1.6293365845149415e+00 2.8781830889240534e+00 5.9176299847370895e-01 1.6901107806334505e+00 -2.6087659825058092e+00 -3.3522760867768986e-01 -1.8575730501776253e+00 -3.9142598594254467e+00 -6.1267676651570580e-01 -1.8122469237574284e+00 4.3579719730115301e+00 4.0865926334415975e-01 1.9439500105195866e+00 4.0197258457694740e-01 7.6162389619262072e-01 4.9057768830408738e-01 -3.2602086899530669e-01 -7.0288848431358097e-01 -3.3850071703019952e-01 -4.7143690409527061e-01 -1.4323726985440537e+00 -4.7740025805783753e-01 3.1749287771398382e-01 1.3251998144449191e+00 4.0281296089798740e-01 5.8913508192390207e-01 1.4014821242866202e+00 6.1205254792591024e-01 -3.0783720105895407e-01 -1.3226127858852963e+00 -4.1427173468616157e-01 -6.1196483340946173e-01 -2.6701630631182374e+00 -7.1577533160786810e-01 4.0865926334415986e-01 2.6397311969370083e+00 4.4050484425408187e-01 1.4103223742906652e+00 6.6917316740698329e-01 2.4415961234094161e+00 -1.6379667719746178e+00 -3.2052161866650225e-01 -2.3452201476020598e+00 -1.6422924993981609e+00 -6.7537534681344713e-01 -2.8999375060785706e+00 1.6627675793371437e+00 3.7883373645928542e-01 3.3187996173147165e+00 1.7071966278261015e+00 6.2385280006089938e-01 2.9735429573603760e+00 -1.6227206258052580e+00 -3.9648683912976596e-01 -3.4213206606455633e+00 -1.8212566947954598e+00 -7.1998074357153430e-01 -4.6983108279095731e+00 1.9439500105195866e+00 4.4050484425408210e-01 4.6308504441512586e+00 42 43 44 102 103 104 117 118 119 57 58 59 798 799 800 840 841 842 483 484 485 465 466 467 3.4120308374818684e+00 8.9275932736181962e-01 1.3689345515343188e+00 -3.6095390773920148e+00 -8.6503153382386433e-01 -1.5383987730401381e+00 -2.2355014269440634e+00 -8.4197108017475175e-01 -1.1320748834377961e+00 2.0028055194504599e+00 6.4906412461190766e-01 1.2698651789931197e+00 2.3307793780278376e+00 9.5154360869105969e-01 1.3298894972182738e+00 -2.1124975895771847e+00 -6.4654060335314556e-01 -1.3651317938269263e+00 -1.4011424967876238e+00 -7.7900931265073847e-01 -1.1466873606739794e+00 1.6130648557407197e+00 6.3918546933771181e-01 1.2136035832331271e+00 8.9275932736181962e-01 3.2419644607687399e+00 1.2443920681379022e+00 -8.4357631175973313e-01 -2.8804576329575209e+00 -9.9211599567879294e-01 -9.2267003949004245e-01 -1.9178288101462959e+00 -9.7927683252076603e-01 6.0856456303502848e-01 1.6136113921935769e+00 9.4499280614403081e-01 9.3471996871034635e-01 1.9693942696563798e+00 1.0675361493472135e+00 -7.5200575581834261e-01 -1.7298520640797874e+00 -1.1452150861603716e+00 -7.4485614594922034e-01 -1.3372094412887745e+00 -1.0752683651173274e+00 8.2706439391014375e-01 1.0403778258536818e+00 9.3495525584811101e-01 1.3689345515343190e+00 1.2443920681379022e+00 4.3330233871031743e+00 -1.5266398541449060e+00 -1.0107220306573743e+00 -4.2015936139318528e+00 -1.3231681396985735e+00 -1.0478978238280383e+00 -2.5737499111964945e+00 1.2364552986537998e+00 9.7837637966672930e-01 3.0404575887636645e+00 1.3342166820832528e+00 1.0877514958882488e+00 2.6872403309744932e+00 -1.3201440091647774e+00 -9.4711444134708300e-01 -3.1962194963818105e+00 -1.1250107753126195e+00 -1.1033088161999938e+00 -2.2327676342221641e+00 1.3553562460495052e+00 7.9852316833960790e-01 2.1436093488909900e+00 -3.6095390773920148e+00 -8.4357631175973335e-01 -1.5266398541449060e+00 3.9905385451400801e+00 7.2755181803358671e-01 1.6818016585447284e+00 2.5198838634788809e+00 7.9264842366440158e-01 1.3726065072007125e+00 -2.2715127278895935e+00 -5.8026533334235064e-01 -1.5724146594310762e+00 -2.6954497428301711e+00 -9.7294359354327797e-01 -1.4188429890933043e+00 2.3899117696450523e+00 6.4942722900166427e-01 1.5229148804704253e+00 1.6318707454827717e+00 8.6899931026917132e-01 1.3867114638373312e+00 -1.9557033756350055e+00 -6.4184154232346047e-01 -1.4461370073839095e+00 -8.6503153382386422e-01 -2.8804576329575213e+00 -1.0107220306573743e+00 7.2755181803358671e-01 2.7363346655094616e+00 7.7043769459802347e-01 8.0848934868572264e-01 1.6206845790729703e+00 8.3923091590371179e-01 -5.0662775059616871e-01 -1.4692169083574917e+00 -7.3818568307068999e-01 -7.8461274506256873e-01 -1.7024415073644763e+00 -7.5447140655373446e-01 6.1492801373404304e-01 1.5382888474576470e+00 7.6738099370396240e-01 6.0658633362624670e-01 1.0493647645822439e+00 7.7059385289328641e-01 -6.0128348459699732e-01 -8.9255680794283276e-01 -6.4426433681718476e-01 -1.5383987730401381e+00 -9.9211599567879283e-01 -4.2015936139318528e+00 1.6818016585447280e+00 7.7043769459802336e-01 4.1826808698186637e+00 1.3342474517727496e+00 7.9749939930054936e-01 2.5365083101190176e+00 -1.2925114573142753e+00 -6.8127969110770759e-01 -3.0378512832343345e+00 -1.4982408253133594e+00 -9.9288207243029569e-01 -2.6339245697669873e+00 1.5310451973880017e+00 8.1323687719150795e-01 3.1044735734245008e+00 1.1930498787124217e+00 9.5611689638608255e-01 2.1701938637646392e+00 -1.4109931307501282e+00 -6.7101310825936555e-01 -2.1204871501936475e+00 -2.2355014269440634e+00 -9.2267003949004234e-01 -1.3231681396985735e+00 2.5198838634788809e+00 8.0848934868572286e-01 1.3342474517727494e+00 3.8135434006374855e+00 1.0437701060981999e+00 1.3685697872718101e+00 -3.4789708578760985e+00 -7.6262365769732532e-01 -1.4203444691299356e+00 -1.9212668241636517e+00 -9.6929986564422366e-01 -1.2151055382028324e+00 1.6308656607493868e+00 6.7638528274346255e-01 1.4273694401240173e+00 2.2301379415647054e+00 8.8226762199445896e-01 1.2263454801340268e+00 -2.5586917574466441e+00 -7.5631879669025115e-01 -1.3979140122712628e+00 -8.4197108017475164e-01 -1.9178288101462959e+00 -1.0478978238280383e+00 7.9264842366440180e-01 1.6206845790729703e+00 7.9749939930054936e-01 1.0437701060981996e+00 3.1582121312604428e+00 1.0028713366538289e+00 -7.4658544196006793e-01 -2.8366747311278515e+00 -9.5662357559960298e-01 -9.6754670376159468e-01 -1.3292680522909284e+00 -8.9926470555741478e-01 7.3150396512738391e-01 1.0526017739993760e+00 1.0157710160557976e+00 8.8174830801219806e-01 1.9292795860996956e+00 1.0101321067015507e+00 -8.9356757700576883e-01 -1.6770064768674064e+00 -9.2248775372667047e-01 -1.1320748834377958e+00 -9.7927683252076592e-01 -2.5737499111964941e+00 1.3726065072007123e+00 8.3923091590371179e-01 2.5365083101190176e+00 1.3685697872718106e+00 1.0028713366538291e+00 3.7156031435337864e+00 -1.4964121230983849e+00 -1.0276457091418492e+00 -4.1002423987716341e+00 -1.2261806960041650e+00 -9.0909317421510205e-01 -1.7481145721139209e+00 1.1769620757174124e+00 7.7934984061321155e-01 2.1030928603846348e+00 1.2665866027935786e+00 1.0415985332275752e+00 2.6203247712131468e+00 -1.3300572704431679e+00 -7.4703491052060977e-01 -2.5534222031685356e+00 2.0028055194504604e+00 6.0856456303502859e-01 1.2364552986537996e+00 -2.2715127278895930e+00 -5.0662775059616871e-01 -1.2925114573142751e+00 -3.4789708578760985e+00 -7.4658544196006793e-01 -1.4964121230983851e+00 3.3700417750223060e+00 5.3953288219765339e-01 1.4549489373989903e+00 1.5871401192210306e+00 7.1608822733367072e-01 1.1382875996446051e+00 -1.4384259472144845e+00 -4.9704198526822690e-01 -1.2655573953303989e+00 -2.0125616588194939e+00 -7.0775859064007729e-01 -1.2165020820876367e+00 2.2414837781058741e+00 5.9382809589818764e-01 1.4412912221333007e+00 6.4906412461190766e-01 1.6136113921935769e+00 9.7837637966672930e-01 -5.8026533334235064e-01 -1.4692169083574917e+00 -6.8127969110770747e-01 -7.6262365769732576e-01 -2.8366747311278515e+00 -1.0276457091418489e+00 5.3953288219765327e-01 2.7814891874030616e+00 8.6160730698609933e-01 6.4131622054558068e-01 1.0083139059419297e+00 7.3652568578155297e-01 -4.7999079455158361e-01 -9.0951769570494045e-01 -7.4225369862487112e-01 -5.5858287325374223e-01 -1.6825918963338005e+00 -8.6151441588345712e-01 5.5154943148986046e-01 1.4945867459855164e+00 7.3618414232350282e-01 1.2698651789931197e+00 9.4499280614403092e-01 3.0404575887636645e+00 -1.5724146594310762e+00 -7.3818568307068988e-01 -3.0378512832343341e+00 -1.4203444691299356e+00 -9.5662357559960309e-01 -4.1002423987716341e+00 1.4549489373989903e+00 8.6160730698609944e-01 4.7953814764731453e+00 1.4797945386325850e+00 1.0593972567875960e+00 2.1051732120204152e+00 -1.3407768376713205e+00 -8.1418735415912735e-01 -2.6839012353059335e+00 -1.2833341783657639e+00 -1.1318731117046990e+00 -3.1435396220753145e+00 1.4122614895734011e+00 7.7487235461639137e-01 3.0245222621299925e+00 2.3307793780278381e+00 9.3471996871034646e-01 1.3342166820832528e+00 -2.6954497428301711e+00 -7.8461274506256873e-01 -1.4982408253133594e+00 -1.9212668241636517e+00 -9.6754670376159468e-01 -1.2261806960041652e+00 1.5871401192210306e+00 6.4131622054558068e-01 1.4797945386325850e+00 4.1837932267224724e+00 1.2249774068444312e+00 1.5650955810335396e+00 -3.7850402932197356e+00 -9.1292374266217946e-01 -1.6710910511643013e+00 -2.3538972053541212e+00 -1.0302813821480001e+00 -1.4569605588303585e+00 2.6539413415963375e+00 8.9435097753398307e-01 1.4733663295628061e+00 9.5154360869105969e-01 1.9693942696563798e+00 1.0877514958882490e+00 -9.7294359354327808e-01 -1.7024415073644763e+00 -9.9288207243029569e-01 -9.6929986564422355e-01 -1.3292680522909288e+00 -9.0909317421510194e-01 7.1608822733367072e-01 1.0083139059419295e+00 1.0593972567875960e+00 1.2249774068444315e+00 3.4270199472290046e+00 1.1532074725243591e+00 -9.1821439214775857e-01 -3.0451980493518693e+00 -1.1561848786703739e+00 -9.1569953533507098e-01 -2.0502406060335598e+00 -1.1574448191841842e+00 8.8354814380116931e-01 1.7224200922135191e+00 9.1524871929975138e-01 1.3298894972182738e+00 1.0675361493472133e+00 2.6872403309744928e+00 -1.4188429890933041e+00 -7.5447140655373446e-01 -2.6339245697669873e+00 -1.2151055382028320e+00 -8.9926470555741478e-01 -1.7481145721139213e+00 1.1382875996446051e+00 7.3652568578155297e-01 2.1051732120204152e+00 1.5650955810335396e+00 1.1532074725243588e+00 4.0035793172213845e+00 -1.6441831472868158e+00 -1.1314522400813516e+00 -4.3556851922806334e+00 -1.2011479692268896e+00 -1.0785955124728774e+00 -2.7266640671621363e+00 1.4460069659134234e+00 9.0651455701225148e-01 2.6683955411073854e+00 -2.1124975895771847e+00 -7.5200575581834272e-01 -1.3201440091647771e+00 2.3899117696450518e+00 6.1492801373404316e-01 1.5310451973880019e+00 1.6308656607493868e+00 7.3150396512738403e-01 1.1769620757174124e+00 -1.4384259472144845e+00 -4.7999079455158361e-01 -1.3407768376713205e+00 -3.7850402932197356e+00 -9.1821439214775868e-01 -1.6441831472868160e+00 3.5848178373914692e+00 6.7947103332765124e-01 1.6594365993346596e+00 2.1318776353301683e+00 7.3237654103699890e-01 1.3712288960993002e+00 -2.4015090731046729e+00 -6.0806861070839069e-01 -1.4335687744164600e+00 -6.4654060335314567e-01 -1.7298520640797874e+00 -9.4711444134708300e-01 6.4942722900166427e-01 1.5382888474576470e+00 8.1323687719150795e-01 6.7638528274346255e-01 1.0526017739993760e+00 7.7934984061321155e-01 -4.9704198526822702e-01 -9.0951769570494045e-01 -8.1418735415912735e-01 -9.1292374266217946e-01 -3.0451980493518693e+00 -1.1314522400813514e+00 6.7947103332765080e-01 2.8996647312414789e+00 1.0188030135443680e+00 7.1007024357927184e-01 1.7528196681074315e+00 1.0753583810714185e+00 -6.5884745736849748e-01 -1.5588072116693354e+00 -7.9399407683294376e-01 -1.3651317938269263e+00 -1.1452150861603716e+00 -3.1962194963818105e+00 1.5229148804704253e+00 7.6738099370396240e-01 3.1044735734245008e+00 1.4273694401240171e+00 1.0157710160557976e+00 2.1030928603846348e+00 -1.2655573953303989e+00 -7.4225369862487112e-01 -2.6839012353059344e+00 -1.6710910511643013e+00 -1.1561848786703739e+00 -4.3556851922806334e+00 1.6594365993346594e+00 1.0188030135443682e+00 4.9869887591360147e+00 1.3278914978833944e+00 1.0714899093317882e+00 3.2100686562551926e+00 -1.6358321774908697e+00 -8.2979126918029789e-01 -3.1688179252319637e+00 -1.4011424967876238e+00 -7.4485614594922023e-01 -1.1250107753126195e+00 1.6318707454827717e+00 6.0658633362624670e-01 1.1930498787124217e+00 2.2301379415647054e+00 8.8174830801219795e-01 1.2665866027935786e+00 -2.0125616588194939e+00 -5.5858287325374212e-01 -1.2833341783657639e+00 -2.3538972053541212e+00 -9.1569953533507087e-01 -1.2011479692268896e+00 2.1318776353301683e+00 7.1007024357927195e-01 1.3278914978833944e+00 3.4111342340579092e+00 9.1538610529259168e-01 1.3693549142933064e+00 -3.6374191954743167e+00 -8.9465243597227406e-01 -1.5473899707774281e+00 -7.7900931265073847e-01 -1.3372094412887745e+00 -1.1033088161999940e+00 8.6899931026917121e-01 1.0493647645822441e+00 9.5611689638608255e-01 8.8226762199445885e-01 1.9292795860996956e+00 1.0415985332275755e+00 -7.0775859064007718e-01 -1.6825918963338005e+00 -1.1318731117046990e+00 -1.0302813821480001e+00 -2.0502406060335598e+00 -1.0785955124728774e+00 7.3237654103699890e-01 1.7528196681074315e+00 1.0714899093317882e+00 9.1538610529259190e-01 3.3301523226378613e+00 1.3100859498271722e+00 -8.8198029315440496e-01 -2.9915743977710951e+00 -1.0655138483950477e+00 -1.1466873606739794e+00 -1.0752683651173274e+00 -2.2327676342221636e+00 1.3867114638373312e+00 7.7059385289328641e-01 2.1701938637646392e+00 1.2263454801340268e+00 1.0101321067015507e+00 2.6203247712131468e+00 -1.2165020820876367e+00 -8.6151441588345712e-01 -3.1435396220753136e+00 -1.4569605588303587e+00 -1.1574448191841842e+00 -2.7266640671621363e+00 1.3712288960993004e+00 1.0753583810714185e+00 3.2100686562551926e+00 1.3693549142933064e+00 1.3100859498271720e+00 4.4125986089304288e+00 -1.5334907527719901e+00 -1.0719426903084572e+00 -4.3102145767037943e+00 1.6130648557407197e+00 8.2706439391014364e-01 1.3553562460495052e+00 -1.9557033756350057e+00 -6.0128348459699732e-01 -1.4109931307501282e+00 -2.5586917574466446e+00 -8.9356757700576883e-01 -1.3300572704431681e+00 2.2414837781058741e+00 5.5154943148986035e-01 1.4122614895734011e+00 2.6539413415963380e+00 8.8354814380116942e-01 1.4460069659134236e+00 -2.4015090731046729e+00 -6.5884745736849759e-01 -1.6358321774908697e+00 -3.6374191954743167e+00 -8.8198029315440507e-01 -1.5334907527719897e+00 4.0448334262177079e+00 7.7351684292449374e-01 1.6967486299198264e+00 6.3918546933771181e-01 1.0403778258536818e+00 7.9852316833960790e-01 -6.4184154232346047e-01 -8.9255680794283276e-01 -6.7101310825936566e-01 -7.5631879669025126e-01 -1.6770064768674064e+00 -7.4703491052060977e-01 5.9382809589818764e-01 1.4945867459855164e+00 7.7487235461639148e-01 8.9435097753398318e-01 1.7224200922135191e+00 9.0651455701225148e-01 -6.0806861070839069e-01 -1.5588072116693350e+00 -8.2979126918029800e-01 -8.9465243597227417e-01 -2.9915743977710951e+00 -1.0719426903084572e+00 7.7351684292449385e-01 2.8625602301979516e+00 8.3987189830047992e-01 1.2136035832331269e+00 9.3495525584811112e-01 2.1436093488909900e+00 -1.4461370073839090e+00 -6.4426433681718476e-01 -2.1204871501936475e+00 -1.3979140122712628e+00 -9.2248775372667047e-01 -2.5534222031685356e+00 1.4412912221333007e+00 7.3618414232350282e-01 3.0245222621299925e+00 1.4733663295628066e+00 9.1524871929975149e-01 2.6683955411073854e+00 -1.4335687744164602e+00 -7.9399407683294365e-01 -3.1688179252319628e+00 -1.5473899707774286e+00 -1.0655138483950475e+00 -4.3102145767037943e+00 1.6967486299198262e+00 8.3987189830047981e-01 4.3164147031695732e+00 102 103 104 162 163 164 177 178 179 117 118 119 840 841 842 882 883 884 501 502 503 483 484 485 3.3446819743908858e+00 8.6573939596772820e-01 1.3199533079787120e+00 -3.5415527235069573e+00 -8.4505840735692039e-01 -1.4926111373518094e+00 -2.1927252508709949e+00 -8.2009175204525298e-01 -1.0895717643204768e+00 1.9550352588345923e+00 6.2773040479451236e-01 1.2224842242634542e+00 2.2389121093328876e+00 9.2604733418171148e-01 1.2783850252423032e+00 -2.0166195324957634e+00 -6.1298513694131052e-01 -1.3099298579851051e+00 -1.3405212138544862e+00 -7.5330905709515306e-01 -1.0960274072696321e+00 1.5527893781698341e+00 6.1192721849468601e-01 1.1673176094425546e+00 8.6573939596772809e-01 3.2043228281283103e+00 1.2170905594730870e+00 -8.1535290563636120e-01 -2.8338437231507254e+00 -9.5621147595029710e-01 -9.0261522243459213e-01 -1.8991817253236685e+00 -9.5190829190720794e-01 5.8060490450532531e-01 1.5868515748358620e+00 9.1138510444611398e-01 9.0839499443985883e-01 1.9066019916966552e+00 1.0337294193847191e+00 -7.2185618553679531e-01 -1.6579186140698172e+00 -1.1132515850271141e+00 -7.1895155030604474e-01 -1.3050280275764614e+00 -1.0453221739130885e+00 8.0403656900088072e-01 9.9819569545984554e-01 9.0448844349378832e-01 1.3199533079787120e+00 1.2170905594730872e+00 4.2557421580430024e+00 -1.4810226535762705e+00 -9.8506679889926274e-01 -4.1178250139420367e+00 -1.2826752075764052e+00 -1.0226197654243778e+00 -2.5139757293884197e+00 1.1944626660924398e+00 9.5878809697199163e-01 2.9829700048950327e+00 1.2853518094228598e+00 1.0569367449668892e+00 2.5746683024256769e+00 -1.2690997238107431e+00 -9.1107693252359023e-01 -3.0920876365918151e+00 -1.0796113484628187e+00 -1.0788071948382665e+00 -2.1584025237930966e+00 1.3126411499322250e+00 7.6475529027353095e-01 2.0689104383516557e+00 -3.5415527235069573e+00 -8.1535290563636142e-01 -1.4810226535762709e+00 3.9351823922622122e+00 7.0078116171101756e-01 1.6379728142989176e+00 2.4827667914741007e+00 7.6732197933724910e-01 1.3336732789689889e+00 -2.2278549445285361e+00 -5.5469529578857590e-01 -1.5323596576151148e+00 -2.6131967353139345e+00 -9.5034387975567014e-01 -1.3706050830827676e+00 2.2967920385779621e+00 6.1655964377146033e-01 1.4760810079479851e+00 1.5724249671578667e+00 8.4809879333601745e-01 1.3419243839480690e+00 -1.9045617861227122e+00 -6.1236949697513854e-01 -1.4056640908898079e+00 -8.4505840735692062e-01 -2.8338437231507254e+00 -9.8506679889926296e-01 7.0078116171101756e-01 2.6940664426210508e+00 7.3732200234773915e-01 7.9187250351248972e-01 1.5947735928009719e+00 8.1702722217464541e-01 -4.8234459151433778e-01 -1.4443095458346116e+00 -7.0716874635507476e-01 -7.5752591940879188e-01 -1.6363603021962947e+00 -7.2149820996611291e-01 5.8455082678844505e-01 1.4684979505981794e+00 7.3268934239444650e-01 5.8312372097639609e-01 1.0109880598583660e+00 7.4012110081127613e-01 -5.7539929470829787e-01 -8.5381247469693677e-01 -6.1342591250765710e-01 -1.4926111373518096e+00 -9.5621147595029754e-01 -4.1178250139420367e+00 1.6379728142989174e+00 7.3732200234773926e-01 4.1003675196987581e+00 1.2915626550624775e+00 7.6402761665229613e-01 2.4736494427959932e+00 -1.2516926782479689e+00 -6.5074730019866966e-01 -2.9792945727300597e+00 -1.4461669531499808e+00 -9.5987701729895325e-01 -2.5215027419923759e+00 1.4803757004287919e+00 7.7309325472296941e-01 2.9973225420974772e+00 1.1466661934022220e+00 9.2681530782392285e-01 2.0923803219134260e+00 -1.3661065944426483e+00 -6.3442238809900908e-01 -2.0450974978411840e+00 -2.1927252508709949e+00 -9.0261522243459213e-01 -1.2826752075764054e+00 2.4827667914741007e+00 7.9187250351248961e-01 1.2915626550624775e+00 3.7863637191547141e+00 1.0274173866563463e+00 1.3284840586081781e+00 -3.4373322116584344e+00 -7.4266693607432133e-01 -1.3753212541788113e+00 -1.8719596283064286e+00 -9.5145087444238741e-01 -1.1708461677597528e+00 1.5699293664128584e+00 6.4783106782038824e-01 1.3872130394955142e+00 2.1589643940149190e+00 8.6028011440648033e-01 1.1790703311167499e+00 -2.4960071802207322e+00 -7.3066803944440561e-01 -1.3574874547679514e+00 -8.2009175204525298e-01 -1.8991817253236682e+00 -1.0226197654243778e+00 7.6732197933724899e-01 1.5947735928009719e+00 7.6402761665229602e-01 1.0274173866563465e+00 3.1462243273893877e+00 9.7558269525109786e-01 -7.2064334469014846e-01 -2.8123988029217220e+00 -9.2317603542039284e-01 -9.4694261514134292e-01 -1.2989378072866300e+00 -8.6846632638386678e-01 7.0382522164248695e-01 1.0097996042057555e+00 9.8838256488321097e-01 8.5898105876405817e-01 1.8841997419002037e+00 9.7871091988904846e-01 -8.6986793452339550e-01 -1.6244789307642993e+00 -8.9244166944701697e-01 -1.0895717643204765e+00 -9.5190829190720816e-01 -2.5139757293884197e+00 1.3336732789689889e+00 8.1702722217464541e-01 2.4736494427959936e+00 1.3284840586081781e+00 9.7558269525109809e-01 3.6613319354332621e+00 -1.4640920714414976e+00 -1.0100814787934398e+00 -4.0408375851816123e+00 -1.1796954072371912e+00 -8.7920363132947077e-01 -1.6715086131106400e+00 1.1311572701336614e+00 7.4730428847099928e-01 2.0260943259771786e+00 1.2235465340800475e+00 1.0144925497713875e+00 2.5292896623508834e+00 -1.2835018987917093e+00 -7.1321335363801253e-01 -2.4640434388766463e+00 1.9550352588345923e+00 5.8060490450532531e-01 1.1944626660924398e+00 -2.2278549445285361e+00 -4.8234459151433778e-01 -1.2516926782479689e+00 -3.4373322116584344e+00 -7.2064334469014846e-01 -1.4640920714414976e+00 3.3302155631798955e+00 5.1501280387958392e-01 1.4116917532641529e+00 1.5266672428583519e+00 6.9073510111483216e-01 1.0930670994039786e+00 -1.3769364032520213e+00 -4.6722675278043491e-01 -1.2181485935005680e+00 -1.9382208310102864e+00 -6.8086860417485850e-01 -1.1657446247984824e+00 2.1684263255764371e+00 5.6473048366003964e-01 1.4004564492279459e+00 6.2773040479451236e-01 1.5868515748358623e+00 9.5878809697199185e-01 -5.5469529578857590e-01 -1.4443095458346116e+00 -6.5074730019866955e-01 -7.4266693607432110e-01 -2.8123988029217220e+00 -1.0100814787934400e+00 5.1501280387958392e-01 2.7622989963548874e+00 8.3138200543051433e-01 6.1601943905556977e-01 9.6847998625033260e-01 7.0788662138559411e-01 -4.5300552353819118e-01 -8.7009994651611444e-01 -7.1015367280041763e-01 -5.3354533231037393e-01 -1.6313633137876329e+00 -8.3144824432955178e-01 5.2515043998179545e-01 1.4405410516190003e+00 7.0437397233397936e-01 1.2224842242634544e+00 9.1138510444611398e-01 2.9829700048950336e+00 -1.5323596576151148e+00 -7.0716874635507476e-01 -2.9792945727300597e+00 -1.3753212541788107e+00 -9.2317603542039262e-01 -4.0408375851816123e+00 1.4116917532641529e+00 8.3138200543051421e-01 4.7497285009557748e+00 1.4368549488819702e+00 1.0326654229709795e+00 2.0233106833186780e+00 -1.2924706477686989e+00 -7.7706083718814167e-01 -2.6158056093792030e+00 -1.2364867984279313e+00 -1.1049065824945770e+00 -3.0553166754893981e+00 1.3656074315809770e+00 7.3687966861058019e-01 2.9352452536107885e+00 2.2389121093328876e+00 9.0839499443985872e-01 1.2853518094228598e+00 -2.6131967353139345e+00 -7.5752591940879188e-01 -1.4461669531499808e+00 -1.8719596283064290e+00 -9.4694261514134292e-01 -1.1796954072371912e+00 1.5266672428583516e+00 6.1601943905556977e-01 1.4368549488819702e+00 3.9727930060669614e+00 1.1934615026910982e+00 1.4956464030406118e+00 -3.5584755279548874e+00 -8.6941841157069577e-01 -1.6093634244142261e+00 -2.2367925172920593e+00 -1.0057063406682825e+00 -1.4042306003085379e+00 2.5420520506091071e+00 8.6171735060258770e-01 1.4216032237644938e+00 9.2604733418171148e-01 1.9066019916966550e+00 1.0569367449668892e+00 -9.5034387975567014e-01 -1.6363603021962947e+00 -9.5987701729895325e-01 -9.5145087444238741e-01 -1.2989378072866302e+00 -8.7920363132947066e-01 6.9073510111483205e-01 9.6847998625033260e-01 1.0326654229709795e+00 1.1934615026910982e+00 3.2473576112409384e+00 1.1071360869068185e+00 -8.7960191930831877e-01 -2.8483045234059521e+00 -1.1179257939952743e+00 -8.8696796209796624e-01 -1.9646386699450256e+00 -1.1229039143219313e+00 8.5812069761669996e-01 1.6258017136459766e+00 8.8317210210094321e-01 1.2783850252423032e+00 1.0337294193847191e+00 2.5746683024256769e+00 -1.3706050830827674e+00 -7.2149820996611302e-01 -2.5215027419923759e+00 -1.1708461677597528e+00 -8.6846632638386678e-01 -1.6715086131106400e+00 1.0930670994039786e+00 7.0788662138559411e-01 2.0233106833186780e+00 1.4956464030406118e+00 1.1071360869068185e+00 3.7570035316107258e+00 -1.5722249339586976e+00 -1.0802899321491248e+00 -4.1039491258543377e+00 -1.1449968811002182e+00 -1.0437104590591115e+00 -2.5850256307522144e+00 1.3915745382145412e+00 8.6521279988108568e-01 2.5270035943544875e+00 -2.0166195324957634e+00 -7.2185618553679531e-01 -1.2690997238107431e+00 2.2967920385779612e+00 5.8455082678844505e-01 1.4803757004287919e+00 1.5699293664128584e+00 7.0382522164248695e-01 1.1311572701336614e+00 -1.3769364032520213e+00 -4.5300552353819112e-01 -1.2924706477686985e+00 -3.5584755279548870e+00 -8.7960191930831877e-01 -1.5722249339586978e+00 3.3575641697130787e+00 6.3544566489993237e-01 1.5882143038068377e+00 2.0086544874549497e+00 7.0234211863075868e-01 1.3118624347827212e+00 -2.2809085984561754e+00 -5.7170020357831908e-01 -1.3778144036138726e+00 -6.1298513694131040e-01 -1.6579186140698172e+00 -9.1107693252359023e-01 6.1655964377146033e-01 1.4684979505981794e+00 7.7309325472296930e-01 6.4783106782038824e-01 1.0097996042057553e+00 7.4730428847099928e-01 -4.6722675278043491e-01 -8.7009994651611444e-01 -7.7706083718814167e-01 -8.6941841157069599e-01 -2.8483045234059512e+00 -1.0802899321491248e+00 6.3544566489993215e-01 2.7042620845000891e+00 9.6620981391712357e-01 6.7463139333781719e-01 1.6540453014720886e+00 1.0339147402866606e+00 -6.2483746853715638e-01 -1.4602818567842304e+00 -7.5209439553689650e-01 -1.3099298579851051e+00 -1.1132515850271141e+00 -3.0920876365918155e+00 1.4760810079479851e+00 7.3268934239444650e-01 2.9973225420974772e+00 1.3872130394955142e+00 9.8838256488321108e-01 2.0260943259771786e+00 -1.2181485935005680e+00 -7.1015367280041763e-01 -2.6158056093792030e+00 -1.6093634244142261e+00 -1.1179257939952745e+00 -4.1039491258543377e+00 1.5882143038068375e+00 9.6620981391712357e-01 4.7493570688040725e+00 1.2731866024821104e+00 1.0413422362855733e+00 3.0724235846875203e+00 -1.5872530778325471e+00 -7.8729290565755017e-01 -3.0333551497408919e+00 -1.3405212138544862e+00 -7.1895155030604474e-01 -1.0796113484628187e+00 1.5724249671578667e+00 5.8312372097639609e-01 1.1466661934022220e+00 2.1589643940149186e+00 8.5898105876405817e-01 1.2235465340800473e+00 -1.9382208310102864e+00 -5.3354533231037393e-01 -1.2364867984279313e+00 -2.2367925172920597e+00 -8.8696796209796613e-01 -1.1449968811002182e+00 2.0086544874549497e+00 6.7463139333781719e-01 1.2731866024821101e+00 3.2348414566543418e+00 8.8195619302851780e-01 1.3061558626722394e+00 -3.4593507431252437e+00 -8.5922752139240544e-01 -1.4884601646456512e+00 -7.5330905709515283e-01 -1.3050280275764614e+00 -1.0788071948382665e+00 8.4809879333601734e-01 1.0109880598583660e+00 9.2681530782392296e-01 8.6028011440648056e-01 1.8841997419002037e+00 1.0144925497713875e+00 -6.8086860417485862e-01 -1.6313633137876329e+00 -1.1049065824945767e+00 -1.0057063406682825e+00 -1.9646386699450256e+00 -1.0437104590591115e+00 7.0234211863075879e-01 1.6540453014720886e+00 1.0413422362855735e+00 8.8195619302851780e-01 3.1894250304190486e+00 1.2726943853769148e+00 -8.5279321746347958e-01 -2.8376281223405888e+00 -1.0279202428658445e+00 -1.0960274072696321e+00 -1.0453221739130885e+00 -2.1584025237930966e+00 1.3419243839480690e+00 7.4012110081127636e-01 2.0923803219134265e+00 1.1790703311167499e+00 9.7871091988904846e-01 2.5292896623508834e+00 -1.1657446247984824e+00 -8.3144824432955178e-01 -3.0553166754893981e+00 -1.4042306003085381e+00 -1.1229039143219313e+00 -2.5850256307522148e+00 1.3118624347827212e+00 1.0339147402866606e+00 3.0724235846875203e+00 1.3061558626722396e+00 1.2726943853769150e+00 4.2131025301694542e+00 -1.4730103801431258e+00 -1.0257668137993305e+00 -4.1084512690865775e+00 1.5527893781698341e+00 8.0403656900088072e-01 1.3126411499322250e+00 -1.9045617861227120e+00 -5.7539929470829787e-01 -1.3661065944426485e+00 -2.4960071802207326e+00 -8.6986793452339550e-01 -1.2835018987917095e+00 2.1684263255764371e+00 5.2515043998179545e-01 1.3656074315809772e+00 2.5420520506091075e+00 8.5812069761669996e-01 1.3915745382145412e+00 -2.2809085984561754e+00 -6.2483746853715638e-01 -1.5872530778325469e+00 -3.4593507431252446e+00 -8.5279321746347969e-01 -1.4730103801431260e+00 3.8775605535694835e+00 7.3559020863295499e-01 1.6400488314822881e+00 6.1192721849468590e-01 9.9819569545984577e-01 7.6475529027353095e-01 -6.1236949697513854e-01 -8.5381247469693677e-01 -6.3442238809900919e-01 -7.3066803944440573e-01 -1.6244789307642993e+00 -7.1321335363801253e-01 5.6473048366003964e-01 1.4405410516190003e+00 7.3687966861058019e-01 8.6171735060258770e-01 1.6258017136459766e+00 8.6521279988108568e-01 -5.7170020357831908e-01 -1.4602818567842304e+00 -7.8729290565755006e-01 -8.5922752139240555e-01 -2.8376281223405893e+00 -1.0257668137993305e+00 7.3559020863295510e-01 2.7116629238612342e+00 7.9384770242870561e-01 1.1673176094425544e+00 9.0448844349378832e-01 2.0689104383516557e+00 -1.4056640908898079e+00 -6.1342591250765710e-01 -2.0450974978411840e+00 -1.3574874547679514e+00 -8.9244166944701697e-01 -2.4640434388766459e+00 1.4004564492279457e+00 7.0437397233397936e-01 2.9352452536107885e+00 1.4216032237644938e+00 8.8317210210094310e-01 2.5270035943544875e+00 -1.3778144036138724e+00 -7.5209439553689639e-01 -3.0333551497408919e+00 -1.4884601646456510e+00 -1.0279202428658447e+00 -4.1084512690865767e+00 1.6400488314822881e+00 7.9384770242870584e-01 4.1197880692283668e+00 774 775 776 816 817 818 828 829 830 786 787 788 777 778 779 819 820 821 831 832 833 789 790 791 3.8210446155911861e+00 3.1652224295662901e-01 1.6790386386584364e+00 -3.9758525394685647e+00 -2.2587856093989481e-01 -1.9171610643279715e+00 -2.3999319768123883e+00 -3.2513122767951791e-01 -1.5393590861154836e+00 2.1588353666341193e+00 1.5784870737494422e-01 1.5022026562281450e+00 2.3881257389335984e+00 3.3749319911123993e-01 1.7263936571081469e+00 -2.1702570251578126e+00 -9.3527638604165811e-02 -1.5287795303328706e+00 -1.3906055599340656e+00 -2.7922674654098006e-01 -1.4148801335145555e+00 1.5686413802139274e+00 1.1190002432174657e-01 1.4925448622961519e+00 3.1652224295662890e-01 3.2135527897546758e+00 7.1791557509410142e-01 -2.0659831097897763e-01 -2.9910484475167203e+00 -3.3408795476326708e-01 -3.6650554730271800e-01 -1.6558900551707538e+00 -6.3325585122856998e-01 1.3878939901005458e-01 1.4986644085435583e+00 3.2038256653359098e-01 3.3642302686513226e-01 1.6234391474419159e+00 6.3108340281604614e-01 -2.1273253983444426e-01 -1.5236014618593350e+00 -4.9434851464009955e-01 -2.7943727028534354e-01 -8.9841655007900123e-01 -6.3823766097109924e-01 2.7353899956966787e-01 7.3330016888566152e-01 4.3054843715929708e-01 1.6790386386584362e+00 7.1791557509410142e-01 6.8657636008440219e+00 -1.8913605317687359e+00 -3.6539762188702790e-01 -6.5402085945311850e+00 -1.8089551656527352e+00 -6.5644723645060155e-01 -4.6259744117327948e+00 1.5008809893536543e+00 3.6224921468429616e-01 4.9287521324001702e+00 1.7083668430549874e+00 6.2529855887100783e-01 4.6790714881995674e+00 -1.5210524293604060e+00 -2.1878356647391137e-01 -5.0518031610583174e+00 -1.4194281392966519e+00 -6.3976642538734918e-01 -4.0255519400763449e+00 1.7525097950114517e+00 1.7493150154948706e-01 3.7699508859548789e+00 -3.9758525394685651e+00 -2.0659831097897763e-01 -1.8913605317687361e+00 4.3406980523027423e+00 1.3538542451998998e-02 2.0930141932773889e+00 2.6827696915631498e+00 1.8457719875885309e-01 1.8506975322221646e+00 -2.4084069120484224e+00 2.7307713200201422e-03 -1.8560763749660347e+00 -2.7380674460679968e+00 -2.8095890800206108e-01 -1.9046189817959855e+00 2.4148683783660569e+00 1.7925083605684053e-02 1.7562115794619666e+00 1.5999018563217493e+00 2.7475339650237984e-01 1.7648498610346257e+00 -1.9159110809687152e+00 -5.9677736578987468e-03 -1.8127172774653879e+00 -2.2587856093989478e-01 -2.9910484475167203e+00 -3.6539762188702796e-01 1.3538542451998994e-02 3.0259429471335499e+00 2.4017964397718316e-02 2.0224839648612705e-01 1.5067108483854130e+00 3.2255879617510924e-01 6.3181942733615401e-03 -1.5220769330907069e+00 1.0506475420102204e-02 -1.1610853631073267e-01 -1.5155117443798400e+00 -1.7940838327017555e-01 1.1957247790717109e-02 1.5113741080924004e+00 1.9993491932646795e-02 1.0640196007449461e-01 7.5479492081121091e-01 1.6381894219129700e-01 1.5227561739281123e-03 -7.7018569943530757e-01 3.9103350403300397e-03 -1.9171610643279715e+00 -3.3408795476326708e-01 -6.5402085945311850e+00 2.0930141932773889e+00 2.4017964397718288e-02 6.3545062403676660e+00 1.8444519341372301e+00 2.9166208442723873e-01 4.4236192355860133e+00 -1.5751644303149455e+00 7.8073227204399761e-03 -4.7490633842002099e+00 -1.9121829791052543e+00 -4.4011586781402212e-01 -4.4733167429820586e+00 1.7657777043260143e+00 3.1383098101342322e-02 4.8013909378098978e+00 1.4963807239802602e+00 4.2716902300366349e-01 3.7949018115304392e+00 -1.7951160819727234e+00 -7.8356700731158462e-03 -3.6118295035805592e+00 -2.3999319768123883e+00 -3.6650554730271800e-01 -1.8089551656527352e+00 2.6827696915631494e+00 2.0224839648612702e-01 1.8444519341372301e+00 4.3861927416644555e+00 4.1572708067333397e-01 2.0421476838914727e+00 -4.0329792204809767e+00 -1.7762316517785476e-01 -1.8813753173842505e+00 -1.9081274817513871e+00 -3.6954731031868621e-01 -1.7666499696820015e+00 1.5994031688878081e+00 8.4562692097795239e-02 1.7742847540275106e+00 2.4330509269732303e+00 3.3405823607462998e-01 1.7028031685235143e+00 -2.7603778500438922e+00 -1.2292038253262869e-01 -1.9067070878607388e+00 -3.2513122767951791e-01 -1.6558900551707540e+00 -6.5644723645060155e-01 1.8457719875885306e-01 1.5067108483854130e+00 2.9166208442723873e-01 4.1572708067333397e-01 3.2208615060274028e+00 6.5092969877297968e-01 -1.6017448745709437e-01 -3.0543020577576723e+00 -3.5569960315224619e-01 -3.7400747815682772e-01 -8.9328816633688313e-01 -5.8294058199568832e-01 2.0095639198002385e-01 7.5786824433335043e-01 4.6693072032781963e-01 3.3979042341241661e-01 1.6679924629395972e+00 6.2918711816943662e-01 -2.8173790153118755e-01 -1.5499527824204553e+00 -4.4362220009893827e-01 -1.5393590861154836e+00 -6.3325585122857020e-01 -4.6259744117327948e+00 1.8506975322221648e+00 3.2255879617510924e-01 4.4236192355860124e+00 2.0421476838914727e+00 6.5092969877297990e-01 6.3005939068868120e+00 -1.9253382794595999e+00 -3.9690185010316609e-01 -6.5973421692302496e+00 -1.7578261739564813e+00 -5.7312650080677863e-01 -3.5033261016406021e+00 1.4931289160351731e+00 1.9509011975162083e-01 3.7878370642617787e+00 1.7268622002263863e+00 6.2649264050410136e-01 4.7120373594247464e+00 -1.8903127928436330e+00 -1.9178705306529864e-01 -4.4974448835556977e+00 2.1588353666341193e+00 1.3878939901005458e-01 1.5008809893536543e+00 -2.4084069120484224e+00 6.3181942733615383e-03 -1.5751644303149457e+00 -4.0329792204809767e+00 -1.6017448745709442e-01 -1.9253382794595997e+00 3.8887115809751585e+00 1.7830445392064295e-02 1.7111819656844363e+00 1.5690831898314694e+00 1.9622061978972150e-01 1.4844789627348218e+00 -1.3971083122010757e+00 -6.7630807908050060e-03 -1.4449947122741134e+00 -2.1984312193669728e+00 -2.0982257926600223e-01 -1.5135369608922757e+00 2.4202955266566999e+00 1.7601489048700809e-02 1.7624924651680207e+00 1.5784870737494422e-01 1.4986644085435583e+00 3.6224921468429622e-01 2.7307713200201414e-03 -1.5220769330907069e+00 7.8073227204400143e-03 -1.7762316517785476e-01 -3.0543020577576723e+00 -3.9690185010316614e-01 1.7830445392064295e-02 3.1421964713167321e+00 3.6871352115771951e-02 7.7924175430558545e-02 7.3173759016433482e-01 1.8338828245282346e-01 -1.8621766900486299e-03 -7.7301133684394252e-01 -6.5605836432381633e-03 -8.7973983285176055e-02 -1.5544922035860331e+00 -2.0837282594082346e-01 1.1125225635492236e-02 1.5312840612537291e+00 2.1519087713896205e-02 1.5022026562281450e+00 3.2038256653359104e-01 4.9287521324001684e+00 -1.8560763749660347e+00 1.0506475420102190e-02 -4.7490633842002099e+00 -1.8813753173842507e+00 -3.5569960315224630e-01 -6.5973421692302514e+00 1.7111819656844363e+00 3.6871352115771944e-02 7.0582406142555154e+00 1.7719005969391148e+00 4.6180259922464351e-01 3.7639098285181047e+00 -1.4554732990183130e+00 -1.8030021196204990e-02 -4.1442885855363238e+00 -1.5217385885191559e+00 -4.8945097341052890e-01 -5.0768429254786582e+00 1.7293783610360596e+00 3.3617604464873954e-02 4.8166344892716522e+00 2.3881257389335984e+00 3.3642302686513231e-01 1.7083668430549874e+00 -2.7380674460679972e+00 -1.1610853631073267e-01 -1.9121829791052543e+00 -1.9081274817513871e+00 -3.7400747815682772e-01 -1.7578261739564813e+00 1.5690831898314694e+00 7.7924175430558545e-02 1.7719005969391148e+00 4.4578309786715362e+00 4.3068982791460864e-01 2.1362638237575569e+00 -4.0487558594972990e+00 -1.7995433398855479e-01 -1.9868755404207739e+00 -2.4562790774830141e+00 -3.8216560676864936e-01 -1.8891545675422721e+00 2.7361899573630941e+00 2.0719892501446646e-01 1.9295079972731215e+00 3.3749319911123993e-01 1.6234391474419159e+00 6.2529855887100783e-01 -2.8095890800206114e-01 -1.5155117443798400e+00 -4.4011586781402212e-01 -3.6954731031868621e-01 -8.9328816633688324e-01 -5.7312650080677863e-01 1.9622061978972147e-01 7.3173759016433482e-01 4.6180259922464351e-01 4.3068982791460864e-01 3.2383123893703192e+00 6.7552016896575906e-01 -1.7911558941995931e-01 -3.0262319687249501e+00 -3.9470571004198568e-01 -3.3455799232434397e-01 -1.6753253603300173e+00 -6.7528016654293577e-01 1.9977615324948067e-01 1.5168681127951202e+00 3.2060691814431136e-01 1.7263936571081469e+00 6.3108340281604625e-01 4.6790714881995674e+00 -1.9046189817959853e+00 -1.7940838327017555e-01 -4.4733167429820586e+00 -1.7666499696820017e+00 -5.8294058199568832e-01 -3.5033261016406025e+00 1.4844789627348218e+00 1.8338828245282346e-01 3.7639098285181043e+00 2.1362638237575564e+00 6.7552016896575906e-01 6.4685010411258057e+00 -1.9872366173035194e+00 -3.9633821074244902e-01 -6.7158070586167407e+00 -1.6140302074105324e+00 -6.6076728731534073e-01 -4.7862531621603139e+00 1.9253993325915142e+00 3.2946260908902730e-01 4.5672207075562348e+00 -2.1702570251578122e+00 -2.1273253983444426e-01 -1.5210524293604060e+00 2.4148683783660569e+00 1.1957247790717112e-02 1.7657777043260141e+00 1.5994031688878085e+00 2.0095639198002385e-01 1.4931289160351733e+00 -1.3971083122010757e+00 -1.8621766900486264e-03 -1.4554732990183130e+00 -4.0487558594972990e+00 -1.7911558941995925e-01 -1.9872366173035194e+00 3.8415558777378931e+00 2.4624900601336569e-02 1.7847611905586969e+00 2.2229818336000138e+00 1.5831617743772342e-01 1.5760976971573364e+00 -2.4626880617355846e+00 -2.1444118653498948e-03 -1.6560031623949811e+00 -9.3527638604165811e-02 -1.5236014618593350e+00 -2.1878356647391137e-01 1.7925083605684053e-02 1.5113741080924001e+00 3.1383098101342329e-02 8.4562692097795239e-02 7.5786824433335043e-01 1.9509011975162086e-01 -6.7630807908050043e-03 -7.7301133684394252e-01 -1.8030021196204983e-02 -1.7995433398855479e-01 -3.0262319687249501e+00 -3.9633821074244902e-01 2.4624900601336590e-02 3.0581791376469472e+00 5.1841672403076175e-02 1.5811247513160720e-01 1.5320529356133121e+00 3.6300083370245928e-01 -4.9800980528974352e-03 -1.5366296582577825e+00 -8.1639255459331848e-03 -1.5287795303328708e+00 -4.9434851464009960e-01 -5.0518031610583174e+00 1.7562115794619666e+00 1.9993491932646778e-02 4.8013909378098978e+00 1.7742847540275106e+00 4.6693072032781963e-01 3.7878370642617787e+00 -1.4449947122741136e+00 -6.5605836432381659e-03 -4.1442885855363238e+00 -1.9868755404207739e+00 -3.9470571004198557e-01 -6.7158070586167415e+00 1.7847611905586973e+00 5.1841672403076196e-02 7.1182893635141262e+00 1.5731965143472029e+00 3.6122848840152988e-01 5.1157294080128519e+00 -1.9278042553676193e+00 -4.3795647397515281e-03 -4.9113479683872727e+00 -1.3906055599340656e+00 -2.7943727028534354e-01 -1.4194281392966519e+00 1.5999018563217491e+00 1.0640196007449461e-01 1.4963807239802605e+00 2.4330509269732303e+00 3.3979042341241661e-01 1.7268622002263863e+00 -2.1984312193669728e+00 -8.7973983285176041e-02 -1.5217385885191561e+00 -2.4562790774830141e+00 -3.3455799232434397e-01 -1.6140302074105324e+00 2.2229818336000138e+00 1.5811247513160720e-01 1.5731965143472029e+00 3.8997905130170984e+00 3.2770848194508262e-01 1.7446000225658027e+00 -4.1104092731280399e+00 -2.3004409466873846e-01 -1.9858425258933103e+00 -2.7922674654098006e-01 -8.9841655007900123e-01 -6.3976642538734918e-01 2.7475339650237984e-01 7.5479492081121091e-01 4.2716902300366344e-01 3.3405823607462992e-01 1.6679924629395972e+00 6.2649264050410136e-01 -2.0982257926600223e-01 -1.5544922035860331e+00 -4.8945097341052884e-01 -3.8216560676864936e-01 -1.6753253603300173e+00 -6.6076728731534073e-01 1.5831617743772342e-01 1.5320529356133121e+00 3.6122848840152982e-01 3.2770848194508262e-01 3.2659780490172450e+00 7.4212134320818912e-01 -2.2362135938418432e-01 -3.0925842543863138e+00 -3.6702680900426454e-01 -1.4148801335145555e+00 -6.3823766097109924e-01 -4.0255519400763449e+00 1.7648498610346257e+00 1.6381894219129700e-01 3.7949018115304392e+00 1.7028031685235145e+00 6.2918711816943662e-01 4.7120373594247464e+00 -1.5135369608922757e+00 -2.0837282594082343e-01 -5.0768429254786582e+00 -1.8891545675422721e+00 -6.7528016654293566e-01 -4.7862531621603139e+00 1.5760976971573368e+00 3.6300083370245934e-01 5.1157294080128519e+00 1.7446000225658027e+00 7.4212134320818923e-01 7.0558677677317272e+00 -1.9707790873321764e+00 -3.7623758381652594e-01 -6.7898883189844463e+00 1.5686413802139274e+00 2.7353899956966787e-01 1.7525097950114517e+00 -1.9159110809687154e+00 1.5227561739281088e-03 -1.7951160819727234e+00 -2.7603778500438922e+00 -2.8173790153118755e-01 -1.8903127928436325e+00 2.4202955266566999e+00 1.1125225635492238e-02 1.7293783610360594e+00 2.7361899573630941e+00 1.9977615324948061e-01 1.9253993325915144e+00 -2.4626880617355846e+00 -4.9800980528974205e-03 -1.9278042553676193e+00 -4.1104092731280399e+00 -2.2362135938418434e-01 -1.9707790873321764e+00 4.5242594016425102e+00 2.4376224339702001e-02 2.1767247288771254e+00 1.1190002432174657e-01 7.3330016888566130e-01 1.7493150154948700e-01 -5.9677736578987398e-03 -7.7018569943530757e-01 -7.8356700731158496e-03 -1.2292038253262869e-01 -1.5499527824204553e+00 -1.9178705306529864e-01 1.7601489048700809e-02 1.5312840612537288e+00 3.3617604464873961e-02 2.0719892501446646e-01 1.5168681127951202e+00 3.2946260908902725e-01 -2.1444118653498956e-03 -1.5366296582577825e+00 -4.3795647397515429e-03 -2.3004409466873846e-01 -3.0925842543863138e+00 -3.7623758381652594e-01 2.4376224339702018e-02 3.1679000515653479e+00 4.2228156591303641e-02 1.4925448622961519e+00 4.3054843715929708e-01 3.7699508859548789e+00 -1.8127172774653879e+00 3.9103350403300466e-03 -3.6118295035805588e+00 -1.9067070878607388e+00 -4.4362220009893838e-01 -4.4974448835556986e+00 1.7624924651680209e+00 2.1519087713896198e-02 4.8166344892716522e+00 1.9295079972731217e+00 3.2060691814431147e-01 4.5672207075562339e+00 -1.6560031623949814e+00 -8.1639255459331848e-03 -4.9113479683872727e+00 -1.9858425258933106e+00 -3.6702680900426460e-01 -6.7898883189844454e+00 2.1767247288771254e+00 4.2228156591303648e-02 6.6567045917252079e+00 816 817 818 858 859 860 870 871 872 828 829 830 819 820 821 861 862 863 873 874 875 831 832 833 3.6836205683325507e+00 3.0666900212312287e-01 1.5785935376958080e+00 -3.8359193019503692e+00 -2.2128775132224379e-01 -1.8288605327810614e+00 -2.2788767493662938e+00 -3.1632795740077113e-01 -1.4462314513554286e+00 2.0324651263659459e+00 1.4900499791490576e-01 1.4064133761363438e+00 2.2801216176871022e+00 3.3182612573500653e-01 1.6388084521147745e+00 -2.0607177490813298e+00 -8.3660119236449559e-02 -1.4305145042042402e+00 -1.2961190921410795e+00 -2.6982481505430139e-01 -1.3198591104047803e+00 1.4754255801534737e+00 1.0360051724073001e-01 1.4016502327985847e+00 3.0666900212312287e-01 3.1317871859044040e+00 7.0549641605139657e-01 -1.9626940937369569e-01 -2.8990496353477071e+00 -3.1132231340937355e-01 -3.6188138448421647e-01 -1.5865889277994909e+00 -6.2104684913468822e-01 1.2729521424635359e-01 1.4197283614732152e+00 3.0013803267895445e-01 3.2823244260282158e-01 1.5692167325952222e+00 6.1762869635452700e-01 -2.0218730715966352e-01 -1.4616500546049600e+00 -4.7778174218396213e-01 -2.6967065214154762e-01 -8.5752994443779917e-01 -6.2660663182461018e-01 2.6781209418682533e-01 6.8408628221711487e-01 4.1349439146775591e-01 1.5785935376958078e+00 7.0549641605139657e-01 6.6025845452959970e+00 -1.7912655665241755e+00 -3.5116429800328375e-01 -6.2749719816471332e+00 -1.7190458837261136e+00 -6.4164414632254996e-01 -4.3773679531715919e+00 1.4013579954231890e+00 3.4768505673721101e-01 4.6830053794713384e+00 1.6106033448859098e+00 6.1259924738613236e-01 4.4464411761136686e+00 -1.4243346949249927e+00 -1.9903031070815530e-01 -4.8215616908748666e+00 -1.3215800276491874e+00 -6.2776362339498692e-01 -3.8122105610434147e+00 1.6656712948195624e+00 1.5382165825423458e-01 3.5540810858560010e+00 -3.8359193019503692e+00 -1.9626940937369564e-01 -1.7912655665241755e+00 4.2175878629855186e+00 -5.6235706568319617e-04 2.0027167221777979e+00 2.5692695462010477e+00 1.7420573583907600e-01 1.7598086175040422e+00 -2.2859409608034120e+00 1.4269942211490607e-02 -1.7662068578349703e+00 -2.6411276293070873e+00 -2.7419839191176559e-01 -1.8157697416908949e+00 2.3070197908885142e+00 5.2907535293004572e-03 1.6604881216300629e+00 1.5034506416816975e+00 2.6983525036420020e-01 1.6757543527913350e+00 -1.8343399496959092e+00 7.4284764070781757e-03 -1.7255256480531969e+00 -2.2128775132224379e-01 -2.8990496353477067e+00 -3.5116429800328380e-01 -5.6235706568318836e-04 2.9467223531083171e+00 1.9737349752293413e-03 1.9520837129193133e-01 1.4308117389062207e+00 3.0816927693193458e-01 1.8289238535302968e-02 -1.4518079822658554e+00 3.5163861034532756e-02 -1.0610611693735253e-01 -1.4577707773938955e+00 -1.6236878559806456e-01 3.9787346136903681e-04 1.4547945405226654e+00 -1.8678910129956117e-03 9.8981252221392396e-02 7.0594774036121211e-01 1.4490958982409485e-01 1.5079489815283724e-02 -7.2964797789095837e-01 2.5184511848552350e-02 -1.8288605327810614e+00 -3.1132231340937355e-01 -6.2749719816471332e+00 2.0027167221777984e+00 1.9737349752293335e-03 6.0993779934096022e+00 1.7574875961941738e+00 2.7273306539633968e-01 4.1779987106171532e+00 -1.4817360039877920e+00 2.7711952011187497e-02 -4.5090308699300978e+00 -1.8220275172648361e+00 -4.2425517287238135e-01 -4.2458991593721294e+00 1.6795502792186374e+00 7.7396322114575656e-03 4.5730990689021516e+00 1.4033606880615546e+00 4.1228551579626249e-01 3.5819989804403987e+00 -1.7104912316184735e+00 1.3133585891279616e-02 -3.4025727424199448e+00 -2.2788767493662938e+00 -3.6188138448421647e-01 -1.7190458837261138e+00 2.5692695462010477e+00 1.9520837129193133e-01 1.7574875961941738e+00 4.1419156908906727e+00 4.0997853330741330e-01 1.9355739642555956e+00 -3.7708585658320510e+00 -1.6497891250856245e-01 -1.7765328462936767e+00 -1.8252241442697685e+00 -3.6698360313755218e-01 -1.6809298548106923e+00 1.5062315230854961e+00 7.1771780695593312e-02 1.6884235821316711e+00 2.2607500666353393e+00 3.2740685985858420e-01 1.6074872170496239e+00 -2.6032073673444440e+00 -1.1052164502319009e-01 -1.8124637748005823e+00 -3.1632795740077113e-01 -1.5865889277994909e+00 -6.4164414632254996e-01 1.7420573583907595e-01 1.4308117389062207e+00 2.7273306539633968e-01 4.0997853330741324e-01 3.0281619087778506e+00 6.3268683750622112e-01 -1.4615158792029392e-01 -2.8479324280576637e+00 -3.3572270303228180e-01 -3.6860637941842389e-01 -8.5420772722542249e-01 -5.6768732637062969e-01 1.9022990473394130e-01 7.0873211308503770e-01 4.5264269448473360e-01 3.3097329797782615e-01 1.5538150418424246e+00 6.1375416312537134e-01 -2.7430154711876775e-01 -1.4327917195289572e+00 -4.2676258478720430e-01 -1.4462314513554286e+00 -6.2104684913468833e-01 -4.3773679531715919e+00 1.7598086175040419e+00 3.0816927693193452e-01 4.1779987106171532e+00 1.9355739642555958e+00 6.3268683750622123e-01 5.8962189544424453e+00 -1.8133264728545122e+00 -3.7819034701288906e-01 -6.1890353061613332e+00 -1.6670493309077323e+00 -5.6057064378849475e-01 -3.2896310853199395e+00 1.4022822535383566e+00 1.7650220223255075e-01 3.5713655638117734e+00 1.6221052091894446e+00 6.1205513972868386e-01 4.4054984354210864e+00 -1.7931627893697659e+00 -1.6960561646331687e-01 -4.1950473196395954e+00 2.0324651263659459e+00 1.2729521424635357e-01 1.4013579954231890e+00 -2.2859409608034120e+00 1.8289238535302961e-02 -1.4817360039877920e+00 -3.7708585658320501e+00 -1.4615158792029387e-01 -1.8133264728545118e+00 3.6295508049066854e+00 6.3851772098988428e-03 1.5955117971456398e+00 1.4728344395327870e+00 1.8552649890764833e-01 1.3916669929853065e+00 -1.3036601674616144e+00 4.0528115331122825e-03 -1.3477164902955165e+00 -2.0249358119449172e+00 -1.9990359385305895e-01 -1.4058744003633139e+00 2.2505451352365760e+00 4.5062413410361830e-03 1.6601165819469987e+00 1.4900499791490576e-01 1.4197283614732152e+00 3.4768505673721101e-01 1.4269942211490609e-02 -1.4518079822658554e+00 2.7711952011187542e-02 -1.6497891250856245e-01 -2.8479324280576637e+00 -3.7819034701288912e-01 6.3851772098988419e-03 2.9451777350158834e+00 1.0597680419630688e-02 6.5836141283330735e-02 6.8283235903102590e-01 1.6625514295208699e-01 7.2470097215131275e-03 -7.3056474336161115e-01 1.4591305502008732e-02 -7.7120918215966158e-02 -1.4341577588233003e+00 -1.8719404466820910e-01 -6.4343761661041416e-04 1.4167244569883066e+00 -1.4567459410266548e-03 1.4064133761363438e+00 3.0013803267895450e-01 4.6830053794713393e+00 -1.7662068578349703e+00 3.5163861034532756e-02 -4.5090308699300987e+00 -1.7765328462936765e+00 -3.3572270303228180e-01 -6.1890353061613332e+00 1.5955117971456398e+00 1.0597680419630677e-02 6.6612465720265197e+00 1.6837534651832196e+00 4.4887347315837761e-01 3.5503076401822193e+00 -1.3626164214626093e+00 7.1058096531079976e-03 -3.9365339236090149e+00 -1.4161569483438099e+00 -4.7514441234913174e-01 -4.7760566808675415e+00 1.6358344354698631e+00 8.9882584368086455e-03 4.5160971888879091e+00 2.2801216176871022e+00 3.2823244260282153e-01 1.6106033448859098e+00 -2.6411276293070873e+00 -1.0610611693735254e-01 -1.8220275172648361e+00 -1.8252241442697688e+00 -3.6860637941842389e-01 -1.6670493309077326e+00 1.4728344395327868e+00 6.5836141283330721e-02 1.6837534651832193e+00 4.2744489203420555e+00 4.2597707207862356e-01 2.0319088362863256e+00 -3.8509840764263137e+00 -1.6663397706345900e-01 -1.8778784616250062e+00 -2.2998275156697159e+00 -3.7497212535556168e-01 -1.7899795606732030e+00 2.5897583881109414e+00 1.9627294281002039e-01 1.8306692241153233e+00 3.3182612573500653e-01 1.5692167325952224e+00 6.1259924738613236e-01 -2.7419839191176559e-01 -1.4577707773938955e+00 -4.2425517287238124e-01 -3.6698360313755224e-01 -8.5420772722542249e-01 -5.6057064378849486e-01 1.8552649890764836e-01 6.8283235903102590e-01 4.4887347315837761e-01 4.2597707207862356e-01 3.1085802744568563e+00 6.6005707606226460e-01 -1.6667897224326664e-01 -2.8819385299471736e+00 -3.7593286456593589e-01 -3.2679641861985947e-01 -1.5786562539736870e+00 -6.6405039555425072e-01 1.9132768919116566e-01 1.4119439224570736e+00 3.0327928017428829e-01 1.6388084521147745e+00 6.1762869635452700e-01 4.4464411761136686e+00 -1.8157697416908947e+00 -1.6236878559806459e-01 -4.2458991593721294e+00 -1.6809298548106923e+00 -5.6768732637062957e-01 -3.2896310853199395e+00 1.3916669929853067e+00 1.6625514295208699e-01 3.5503076401822193e+00 2.0319088362863251e+00 6.6005707606226460e-01 6.1353225708462844e+00 -1.8859693220526723e+00 -3.7738678008530652e-01 -6.3771320299229819e+00 -1.5097391630554449e+00 -6.4484932729133626e-01 -4.4977695946804559e+00 1.8300238002232976e+00 3.0835130397645694e-01 4.2783604821533361e+00 -2.0607177490813298e+00 -2.0218730715966352e-01 -1.4243346949249927e+00 2.3070197908885146e+00 3.9787346136903985e-04 1.6795502792186374e+00 1.5062315230854961e+00 1.9022990473394130e-01 1.4022822535383566e+00 -1.3036601674616144e+00 7.2470097215131292e-03 -1.3626164214626093e+00 -3.8509840764263137e+00 -1.6667897224326664e-01 -1.8859693220526721e+00 3.6476080081657010e+00 1.2453910728590666e-02 1.6746265707082155e+00 2.0657668425695359e+00 1.4920753949003010e-01 1.4720089750326499e+00 -2.3112641717399898e+00 9.3300412674866291e-03 -1.5555476400575858e+00 -8.3660119236449573e-02 -1.4616500546049600e+00 -1.9903031070815524e-01 5.2907535293004616e-03 1.4547945405226654e+00 7.7396322114575639e-03 7.1771780695593312e-02 7.0873211308503758e-01 1.7650220223255078e-01 4.0528115331122877e-03 -7.3056474336161115e-01 7.1058096531080080e-03 -1.6663397706345900e-01 -2.8819385299471736e+00 -3.7738678008530652e-01 1.2453910728590662e-02 2.9228339346717869e+00 2.4018768214965357e-02 1.4660844716723614e-01 1.4262645041277349e+00 3.4234725902981289e-01 1.0116392646075683e-02 -1.4384717644934804e+00 1.8703419451567213e-02 -1.4305145042042404e+00 -4.7778174218396213e-01 -4.8215616908748675e+00 1.6604881216300629e+00 -1.8678910129956091e-03 4.5730990689021507e+00 1.6884235821316711e+00 4.5264269448473365e-01 3.5713655638117734e+00 -1.3477164902955165e+00 1.4591305502008715e-02 -3.9365339236090149e+00 -1.8778784616250062e+00 -3.7593286456593589e-01 -6.3771320299229819e+00 1.6746265707082155e+00 2.4018768214965378e-02 6.7879072029233374e+00 1.4658009767917477e+00 3.4508402839743924e-01 4.8285932255859532e+00 -1.8332297951369347e+00 1.9245701163748172e-02 -4.6257374168163512e+00 -1.2961190921410797e+00 -2.6967065214154762e-01 -1.3215800276491874e+00 1.5034506416816975e+00 9.8981252221392396e-02 1.4033606880615546e+00 2.2607500666353393e+00 3.3097329797782615e-01 1.6221052091894452e+00 -2.0249358119449172e+00 -7.7120918215966158e-02 -1.4161569483438099e+00 -2.2998275156697159e+00 -3.2679641861985953e-01 -1.5097391630554449e+00 2.0657668425695359e+00 1.4660844716723614e-01 1.4658009767917477e+00 3.5736611422575466e+00 3.1470940650339918e-01 1.6153806825441817e+00 -3.7827462733884065e+00 -2.1768441489247997e-01 -1.8591714175384864e+00 -2.6982481505430134e-01 -8.5752994443779917e-01 -6.2776362339498681e-01 2.6983525036420020e-01 7.0594774036121211e-01 4.1228551579626249e-01 3.2740685985858420e-01 1.5538150418424244e+00 6.1205513972868386e-01 -1.9990359385305895e-01 -1.4341577588233001e+00 -4.7514441234913174e-01 -3.7497212535556168e-01 -1.5786562539736868e+00 -6.4484932729133626e-01 1.4920753949003010e-01 1.4262645041277346e+00 3.4508402839743929e-01 3.1470940650339924e-01 3.0111837437267210e+00 7.2516446134074852e-01 -2.1645852195329171e-01 -2.8268670728233061e+00 -3.4683178222767924e-01 -1.3198591104047803e+00 -6.2660663182461018e-01 -3.8122105610434147e+00 1.6757543527913350e+00 1.4490958982409488e-01 3.5819989804403987e+00 1.6074872170496242e+00 6.1375416312537112e-01 4.4054984354210864e+00 -1.4058744003633137e+00 -1.8719404466820910e-01 -4.7760566808675415e+00 -1.7899795606732030e+00 -6.6405039555425083e-01 -4.4977695946804568e+00 1.4720089750326499e+00 3.4234725902981289e-01 4.8285932255859532e+00 1.6153806825441817e+00 7.2516446134074852e-01 6.5705215489492277e+00 -1.8549181559764938e+00 -3.4832440127295594e-01 -6.3005753538052556e+00 1.4754255801534737e+00 2.6781209418682533e-01 1.6656712948195627e+00 -1.8343399496959092e+00 1.5079489815283731e-02 -1.7104912316184735e+00 -2.6032073673444445e+00 -2.7430154711876775e-01 -1.7931627893697659e+00 2.2505451352365760e+00 -6.4343761661041438e-04 1.6358344354698631e+00 2.5897583881109418e+00 1.9132768919116566e-01 1.8300238002232976e+00 -2.3112641717399902e+00 1.0116392646075690e-02 -1.8332297951369347e+00 -3.7827462733884065e+00 -2.1645852195329177e-01 -1.8549181559764938e+00 4.2158286586677587e+00 7.0678408493187331e-03 2.0602724415889444e+00 1.0360051724073002e-01 6.8408628221711498e-01 1.5382165825423458e-01 7.4284764070781740e-03 -7.2964797789095837e-01 1.3133585891279609e-02 -1.1052164502319013e-01 -1.4327917195289572e+00 -1.6960561646331690e-01 4.5062413410361813e-03 1.4167244569883066e+00 8.9882584368086438e-03 1.9627294281002039e-01 1.4119439224570736e+00 3.0835130397645694e-01 9.3300412674866221e-03 -1.4384717644934806e+00 1.9245701163748158e-02 -2.1768441489247992e-01 -2.8268670728233061e+00 -3.4832440127295594e-01 7.0678408493187227e-03 2.9150238730742082e+00 1.4389510013744907e-02 1.4016502327985847e+00 4.1349439146775596e-01 3.5540810858560010e+00 -1.7255256480531969e+00 2.5184511848552350e-02 -3.4025727424199448e+00 -1.8124637748005823e+00 -4.2676258478720430e-01 -4.1950473196395954e+00 1.6601165819469987e+00 -1.4567459410266695e-03 4.5160971888879091e+00 1.8306692241153235e+00 3.0327928017428835e-01 4.2783604821533361e+00 -1.5555476400575861e+00 1.8703419451567185e-02 -4.6257374168163503e+00 -1.8591714175384861e+00 -3.4683178222767919e-01 -6.3005753538052556e+00 2.0602724415889453e+00 1.4389510013744918e-02 6.1753940757839008e+00 786 787 788 828 829 830 840 841 842 798 799 800 789 790 791 831 832 833 843 844 845 801 802 803 3.7813231405691701e+00 6.1204240228019691e-01 1.5582615238900870e+00 -3.9458912195433942e+00 -5.8785045238739875e-01 -1.8174776940117230e+00 -2.3345890565560414e+00 -6.0233042422052718e-01 -1.4092791856096745e+00 2.1061317157013351e+00 4.2633938023912404e-01 1.4083895333919134e+00 2.3550068973464668e+00 6.6061677672901431e-01 1.6072530674357328e+00 -2.1462825727627117e+00 -3.8455875738019235e-01 -1.4579403337549715e+00 -1.3385666581844353e+00 -5.2840710243329658e-01 -1.2975629242229056e+00 1.5228677534296091e+00 4.0414817717307905e-01 1.4083560128815420e+00 6.1204240228019691e-01 3.6119299410372516e+00 1.3575510388155707e+00 -5.6883777946701319e-01 -3.2813017390106691e+00 -1.0102784724514531e+00 -6.8312891493267813e-01 -2.0036515915311224e+00 -1.1481005185177939e+00 4.0313601915075298e-01 1.7434595894557379e+00 9.3838585885163106e-01 6.5157931178345518e-01 1.9966542027923837e+00 1.1885611696471319e+00 -4.8797226648989916e-01 -1.8002234286068386e+00 -1.1381724933746955e+00 -5.1626270052750189e-01 -1.2454887315180678e+00 -1.1733133068763337e+00 5.8944392820268732e-01 9.7862175738132429e-01 9.8536672390594371e-01 1.5582615238900872e+00 1.3575510388155709e+00 6.5237944509910069e+00 -1.7983510406906873e+00 -1.0347603993268069e+00 -6.3350944746279305e+00 -1.6564567326633759e+00 -1.1894368686364121e+00 -4.2794575085189521e+00 1.3909981373288802e+00 9.7818203592975228e-01 4.6931497194452749e+00 1.5962346551832345e+00 1.1947556063764488e+00 4.3865557979011482e+00 -1.4357262049914310e+00 -8.8263158905390915e-01 -4.8531364912391854e+00 -1.2860717428544424e+00 -1.1902802172008724e+00 -3.6959521152708437e+00 1.6311114047977335e+00 7.6662039309622709e-01 3.5601406213194822e+00 -3.9458912195433933e+00 -5.6883777946701308e-01 -1.7983510406906871e+00 4.3178180930092500e+00 4.4345862971603844e-01 2.0388544720703274e+00 2.6227698075823147e+00 5.4916808777548309e-01 1.7455738509526533e+00 -2.3553338619842741e+00 -3.5320297985228877e-01 -1.7928432263517349e+00 -2.7122506009901417e+00 -6.6760264160973015e-01 -1.8056811751925697e+00 2.3951120647130604e+00 3.7272756124967743e-01 1.7109765330247826e+00 1.5481363669154733e+00 6.0626991157304655e-01 1.6527752057457512e+00 -1.8703606497022884e+00 -3.8198078938521257e-01 -1.7513046195585245e+00 -5.8785045238739886e-01 -3.2813017390106691e+00 -1.0347603993268066e+00 4.4345862971603855e-01 3.1869535359282013e+00 7.0530627174627103e-01 5.6329290892294359e-01 1.7471723751744346e+00 8.8653501780673027e-01 -3.0050690500362015e-01 -1.6410393365908615e+00 -6.3455384712448393e-01 -5.0599048610364739e-01 -1.7801153774047995e+00 -7.6630225099657345e-01 3.6001866825223616e-01 1.6643687717665183e+00 6.7348152523039195e-01 3.9221773007861915e-01 9.9675103441201107e-01 7.4796733425665363e-01 -3.6464009347517068e-01 -8.9278926427483518e-01 -5.7767365159218309e-01 -1.8174776940117230e+00 -1.0102784724514533e+00 -6.3350944746279287e+00 2.0388544720703279e+00 7.0530627174627103e-01 6.2667693472643329e+00 1.7281380674367004e+00 8.5374986460872471e-01 4.2000205248015767e+00 -1.4996536808848389e+00 -6.1453638762413632e-01 -4.6413031554493553e+00 -1.8394197135006753e+00 -1.0342452670094220e+00 -4.2940399799020312e+00 1.7176051502724028e+00 6.9923419485302329e-01 4.7226231123078799e+00 1.3983787529240701e+00 9.9734675262830863e-01 3.5895181623409962e+00 -1.7264253543062633e+00 -5.9657695675131461e-01 -3.5084935367354722e+00 -2.3345890565560414e+00 -6.8312891493267824e-01 -1.6564567326633759e+00 2.6227698075823147e+00 5.6329290892294348e-01 1.7281380674367004e+00 4.2585257429945838e+00 7.8876917890339393e-01 1.8527176158118244e+00 -3.9182560891544269e+00 -5.1994169976567117e-01 -1.7362064204773762e+00 -1.8487715347893519e+00 -7.0750037904011542e-01 -1.6206726077791229e+00 1.5514264940628373e+00 4.2475525940841713e-01 1.6782337932680735e+00 2.3392423600518271e+00 6.3535905302520246e-01 1.5368543499125944e+00 -2.6703477241917426e+00 -5.0160540652149099e-01 -1.7826080655093188e+00 -6.0233042422052718e-01 -2.0036515915311224e+00 -1.1894368686364121e+00 5.4916808777548309e-01 1.7471723751744346e+00 8.5374986460872471e-01 7.8876917890339404e-01 3.5595916028660159e+00 1.2036135910171846e+00 -5.0913921404994689e-01 -3.2906879252036823e+00 -1.0002140595031683e+00 -7.0818972360901100e-01 -1.2332486609309534e+00 -1.0640573658483252e+00 4.8388987986966264e-01 1.0027106853113328e+00 1.0400308908480880e+00 6.4013266602053576e-01 2.0050748965144494e+00 1.1589505941301570e+00 -6.4230045068958996e-01 -1.7869613822004742e+00 -1.0026366466162493e+00 -1.4092791856096745e+00 -1.1481005185177939e+00 -4.2794575085189530e+00 1.7455738509526535e+00 8.8653501780673027e-01 4.2000205248015776e+00 1.8527176158118248e+00 1.2036135910171846e+00 5.8838328043827790e+00 -1.7898205954158544e+00 -1.0513803872875314e+00 -6.2725641045677696e+00 -1.6200011659382068e+00 -1.0625779727054288e+00 -3.1979425536525685e+00 1.3981242296607890e+00 7.6795714623635325e-01 3.5609895645405385e+00 1.5668653051541295e+00 1.1711130465704949e+00 4.3352315317972856e+00 -1.7441800546156598e+00 -7.6715992312000736e-01 -4.2301102587828892e+00 2.1061317157013355e+00 4.0313601915075298e-01 1.3909981373288802e+00 -2.3553338619842741e+00 -3.0050690500362021e-01 -1.4996536808848389e+00 -3.9182560891544269e+00 -5.0913921404994700e-01 -1.7898205954158544e+00 3.7924531865252136e+00 3.2844159933315059e-01 1.6018444784656440e+00 1.5153711461661312e+00 4.7557728084522533e-01 1.3744323755505141e+00 -1.3580194116093121e+00 -2.8106515922982411e-01 -1.3673310244670944e+00 -2.1219541438106884e+00 -4.7438307530820112e-01 -1.3782168725162054e+00 2.3396074581660233e+00 3.5793945426246271e-01 1.6677471819389555e+00 4.2633938023912404e-01 1.7434595894557379e+00 9.7818203592975228e-01 -3.5320297985228888e-01 -1.6410393365908615e+00 -6.1453638762413632e-01 -5.1994169976567117e-01 -3.2906879252036823e+00 -1.0513803872875311e+00 3.2844159933315059e-01 3.2652363180086925e+00 7.6543337280757318e-01 4.0894381777909250e-01 9.6884824094759736e-01 7.4138853535636551e-01 -2.7371462113373013e-01 -9.0386893965211579e-01 -6.4093114287511155e-01 -3.5489737242255626e-01 -1.7966340195637427e+00 -8.3637184566641121e-01 3.3803187582287930e-01 1.6546860725983741e+00 6.5821581935949980e-01 1.4083895333919134e+00 9.3838585885163106e-01 4.6931497194452749e+00 -1.7928432263517349e+00 -6.3455384712448393e-01 -4.6413031554493562e+00 -1.7362064204773762e+00 -1.0002140595031679e+00 -6.2725641045677687e+00 1.6018444784656440e+00 7.6543337280757318e-01 6.8611976988365218e+00 1.6917204082284136e+00 1.0498780255797122e+00 3.5459840959660212e+00 -1.4003422121131965e+00 -6.7395086750516642e-01 -4.0378944155223389e+00 -1.4045341004383736e+00 -1.1262994035301128e+00 -4.7994011368162086e+00 1.6319715392947096e+00 6.8132092042401338e-01 4.6508312981078550e+00 2.3550068973464677e+00 6.5157931178345518e-01 1.5962346551832347e+00 -2.7122506009901426e+00 -5.0599048610364739e-01 -1.8394197135006753e+00 -1.8487715347893519e+00 -7.0818972360901111e-01 -1.6200011659382068e+00 1.5153711461661312e+00 4.0894381777909250e-01 1.6917204082284136e+00 4.4333982174962072e+00 8.5539115158839474e-01 1.9973658274322239e+00 -4.0325293401859392e+00 -5.7017902959073619e-01 -1.9026020233116125e+00 -2.3925203507039852e+00 -7.2631086866447003e-01 -1.7466635405575501e+00 2.6822955656606133e+00 5.9475582681692141e-01 1.8233655524641734e+00 6.6061677672901442e-01 1.9966542027923837e+00 1.1947556063764488e+00 -6.6760264160973015e-01 -1.7801153774047993e+00 -1.0342452670094218e+00 -7.0750037904011553e-01 -1.2332486609309534e+00 -1.0625779727054285e+00 4.7557728084522533e-01 9.6884824094759736e-01 1.0498780255797122e+00 8.5539115158839496e-01 3.6773320800449594e+00 1.2993445354000330e+00 -5.7108734592561716e-01 -3.3537443393669442e+00 -1.1175696757366129e+00 -6.3064517081376215e-01 -2.0579476840352102e+00 -1.2539624453185532e+00 5.8525032822659040e-01 1.7822215379529651e+00 9.2437719341382329e-01 1.6072530674357330e+00 1.1885611696471319e+00 4.3865557979011482e+00 -1.8056811751925697e+00 -7.6630225099657345e-01 -4.2940399799020312e+00 -1.6206726077791229e+00 -1.0640573658483252e+00 -3.1979425536525685e+00 1.3744323755505141e+00 7.4138853535636562e-01 3.5459840959660212e+00 1.9973658274322248e+00 1.2993445354000333e+00 6.1637556419984803e+00 -1.8960468238618100e+00 -1.1120506270183108e+00 -6.5055239578713309e+00 -1.4680824163405293e+00 -1.2177064851230890e+00 -4.4422614856516764e+00 1.8114317527555601e+00 9.3082248858276673e-01 4.3434724412119596e+00 -2.1462825727627117e+00 -4.8797226648989905e-01 -1.4357262049914312e+00 2.3951120647130604e+00 3.6001866825223611e-01 1.7176051502724026e+00 1.5514264940628373e+00 4.8388987986966264e-01 1.3981242296607890e+00 -1.3580194116093121e+00 -2.7371462113373013e-01 -1.4003422121131965e+00 -4.0325293401859401e+00 -5.7108734592561716e-01 -1.8960468238618102e+00 3.8334628921066498e+00 3.7396633085758951e-01 1.7309247691787188e+00 2.1754816008126818e+00 4.5313851560683832e-01 1.4817348063319198e+00 -2.4186517271372652e+00 -3.3823916103707952e-01 -1.5962737144773935e+00 -3.8455875738019230e-01 -1.8002234286068384e+00 -8.8263158905390904e-01 3.7272756124967743e-01 1.6643687717665183e+00 6.9923419485302307e-01 4.2475525940841707e-01 1.0027106853113328e+00 7.6795714623635325e-01 -2.8106515922982411e-01 -9.0386893965211579e-01 -6.7395086750516642e-01 -5.7017902959073608e-01 -3.3537443393669442e+00 -1.1120506270183108e+00 3.7396633085758951e-01 3.2588743007206440e+00 8.4956762394685803e-01 4.4699376753371706e-01 1.8083736455131481e+00 1.0297223576977441e+00 -3.8263997284864826e-01 -1.6764906956857446e+00 -6.7784823915659231e-01 -1.4579403337549715e+00 -1.1381724933746955e+00 -4.8531364912391854e+00 1.7109765330247828e+00 6.7348152523039195e-01 4.7226231123078799e+00 1.6782337932680735e+00 1.0400308908480880e+00 3.5609895645405381e+00 -1.3673310244670946e+00 -6.4093114287511155e-01 -4.0378944155223389e+00 -1.9026020233116130e+00 -1.1175696757366129e+00 -6.5055239578713318e+00 1.7309247691787188e+00 8.4956762394685814e-01 7.0328323704860747e+00 1.4601391760169293e+00 1.0268690872230697e+00 4.8765505719931150e+00 -1.8524008899548248e+00 -6.9327581526198612e-01 -4.7964407546947534e+00 -1.3385666581844353e+00 -5.1626270052750189e-01 -1.2860717428544421e+00 1.5481363669154735e+00 3.9221773007861915e-01 1.3983787529240701e+00 2.3392423600518275e+00 6.4013266602053565e-01 1.5668653051541293e+00 -2.1219541438106884e+00 -3.5489737242255620e-01 -1.4045341004383736e+00 -2.3925203507039847e+00 -6.3064517081376215e-01 -1.4680824163405295e+00 2.1754816008126818e+00 4.4699376753371695e-01 1.4601391760169293e+00 3.7919045611715978e+00 6.2487651421195201e-01 1.5700567206333940e+00 -4.0017237362524707e+00 -6.0241543408100273e-01 -1.8367516950951770e+00 -5.2840710243329658e-01 -1.2454887315180678e+00 -1.1902802172008724e+00 6.0626991157304655e-01 9.9675103441201107e-01 9.9734675262830863e-01 6.3535905302520246e-01 2.0050748965144494e+00 1.1711130465704949e+00 -4.7438307530820112e-01 -1.7966340195637427e+00 -1.1262994035301128e+00 -7.2631086866447014e-01 -2.0579476840352102e+00 -1.2177064851230890e+00 4.5313851560683838e-01 1.8083736455131481e+00 1.0268690872230697e+00 6.2487651421195212e-01 3.6508111737262698e+00 1.4030028515436199e+00 -5.9054294801107154e-01 -3.3609403150488575e+00 -1.0640456321114193e+00 -1.2975629242229056e+00 -1.1733133068763340e+00 -3.6959521152708428e+00 1.6527752057457512e+00 7.4796733425665374e-01 3.5895181623409962e+00 1.5368543499125940e+00 1.1589505941301570e+00 4.3352315317972856e+00 -1.3782168725162054e+00 -8.3637184566641132e-01 -4.7994011368162086e+00 -1.7466635405575504e+00 -1.2539624453185532e+00 -4.4422614856516764e+00 1.4817348063319196e+00 1.0297223576977441e+00 4.8765505719931150e+00 1.5700567206333942e+00 1.4030028515436201e+00 6.6090046153070112e+00 -1.8189777453269971e+00 -1.0759955397668750e+00 -6.4726901436996815e+00 1.5228677534296091e+00 5.8944392820268732e-01 1.6311114047977338e+00 -1.8703606497022887e+00 -3.6464009347517073e-01 -1.7264253543062633e+00 -2.6703477241917422e+00 -6.4230045068958996e-01 -1.7441800546156598e+00 2.3396074581660229e+00 3.3803187582287930e-01 1.6319715392947096e+00 2.6822955656606133e+00 5.8525032822659040e-01 1.8114317527555601e+00 -2.4186517271372652e+00 -3.8263997284864826e-01 -1.8524008899548245e+00 -4.0017237362524707e+00 -5.9054294801107188e-01 -1.8189777453269973e+00 4.4163130600275204e+00 4.6739733277232276e-01 2.0674693473557419e+00 4.0414817717307905e-01 9.7862175738132429e-01 7.6662039309622709e-01 -3.8198078938521263e-01 -8.9278926427483529e-01 -5.9657695675131461e-01 -5.0160540652149099e-01 -1.7869613822004742e+00 -7.6715992312000736e-01 3.5793945426246271e-01 1.6546860725983741e+00 6.8132092042401349e-01 5.9475582681692130e-01 1.7822215379529653e+00 9.3082248858276673e-01 -3.3823916103707952e-01 -1.6764906956857446e+00 -6.9327581526198612e-01 -6.0241543408100262e-01 -3.3609403150488575e+00 -1.0759955397668750e+00 4.6739733277232276e-01 3.3016522892772473e+00 7.5424443279717601e-01 1.4083560128815418e+00 9.8536672390594371e-01 3.5601406213194822e+00 -1.7513046195585242e+00 -5.7767365159218298e-01 -3.5084935367354722e+00 -1.7826080655093188e+00 -1.0026366466162493e+00 -4.2301102587828892e+00 1.6677471819389560e+00 6.5821581935949991e-01 4.6508312981078550e+00 1.8233655524641734e+00 9.2437719341382341e-01 4.3434724412119596e+00 -1.5962737144773935e+00 -6.7784823915659242e-01 -4.7964407546947534e+00 -1.8367516950951770e+00 -1.0640456321114196e+00 -6.4726901436996815e+00 2.0674693473557419e+00 7.5424443279717601e-01 6.4532903332735012e+00 828 829 830 870 871 872 882 883 884 840 841 842 831 832 833 873 874 875 885 886 887 843 844 845 3.5160457733565327e+00 5.6741318416792907e-01 1.4158019147152499e+00 -3.6747096088353430e+00 -5.5094685639530605e-01 -1.6831457257897440e+00 -2.1653104646791870e+00 -5.6489470679441556e-01 -1.2852759059173111e+00 1.9333691289048869e+00 3.8841627675168044e-01 1.2798344091627227e+00 2.1686601970973411e+00 6.2319107703687338e-01 1.4798478073024093e+00 -1.9599255169299346e+00 -3.4198064778883325e-01 -1.3220886881229164e+00 -1.2119949284585885e+00 -4.8867978034995174e-01 -1.1713139802265498e+00 1.3938654195442919e+00 3.6748145337202354e-01 1.2863401688761391e+00 5.6741318416792907e-01 3.4048939358844144e+00 1.2839096588558583e+00 -5.2709510655165637e-01 -3.0596706545563874e+00 -9.2872211358192047e-01 -6.4962701605514439e-01 -1.8862737653188231e+00 -1.0800345305051802e+00 3.6258049011541393e-01 1.6135735865715606e+00 8.6541527216279834e-01 6.1274803892782148e-01 1.8658561968875771e+00 1.1170905503015742e+00 -4.4593292208470597e-01 -1.6593591184180023e+00 -1.0665779518374752e+00 -4.7690713816518948e-01 -1.1698761473927441e+00 -1.1077713251786945e+00 5.5682046964553167e-01 8.9085596634240383e-01 9.1669043978304021e-01 1.4158019147152499e+00 1.2839096588558581e+00 6.0810700246786755e+00 -1.6597274708774781e+00 -9.5975673110466742e-01 -5.8872144480743049e+00 -1.5363183625594041e+00 -1.1223753661143672e+00 -3.9461993205113512e+00 1.2634820849364412e+00 9.1262230888364515e-01 4.3616692644848776e+00 1.4660092411433461e+00 1.1232496408461794e+00 4.0305854828830023e+00 -1.3020311857068581e+00 -8.0506023834152352e-01 -4.5024765050892048e+00 -1.1614277628137419e+00 -1.1255236691454797e+00 -3.4115581415714931e+00 1.5142115411624451e+00 6.9293439612035468e-01 3.2741236431997960e+00 -3.6747096088353426e+00 -5.2709510655165626e-01 -1.6597274708774779e+00 4.0659938849510757e+00 3.9763284696494033e-01 1.9065013350088518e+00 2.4612902563934318e+00 5.1095359898453474e-01 1.6246965746255908e+00 -2.1851607182367490e+00 -3.1251129160741820e-01 -1.6727930664412787e+00 -2.5389098107920667e+00 -6.3149274625081198e-01 -1.6796553632107709e+00 2.2084297709520113e+00 3.2879614157519726e-01 1.5826629999874955e+00 1.4180051885473239e+00 5.7360512745800907e-01 1.5335199715741346e+00 -1.7549389629796830e+00 -3.3988857057279459e-01 -1.6352049806665456e+00 -5.5094685639530594e-01 -3.0596706545563874e+00 -9.5975673110466730e-01 3.9763284696494033e-01 2.9780594515558865e+00 6.2396465492162556e-01 5.2925475034345626e-01 1.6192913171993482e+00 8.2007155154219180e-01 -2.6122990836438625e-01 -1.5183804032012829e+00 -5.5862542817092842e-01 -4.6584706911889517e-01 -1.6438769094565726e+00 -6.9316993685804318e-01 3.1822574635901502e-01 1.5278401537440776e+00 5.9562462462705712e-01 3.5735994503483509e-01 9.1016075669335894e-01 6.7768338371754477e-01 -3.2444945482365950e-01 -8.1342371197842933e-01 -5.0579211867478002e-01 -1.6831457257897440e+00 -9.2872211358192047e-01 -5.8872144480743049e+00 1.9065013350088522e+00 6.2396465492162545e-01 5.8280817980465871e+00 1.6089611130495731e+00 7.8178170043742967e-01 3.8664585667222782e+00 -1.3773113024972798e+00 -5.4066747922390945e-01 -4.3132322123191367e+00 -1.7120509885973358e+00 -9.6171836974303804e-01 -3.9420113442324762e+00 1.5911493597087036e+00 6.1797227770103291e-01 4.3717497751007359e+00 1.2766969003578297e+00 9.2936122476502003e-01 3.3031626116493049e+00 -1.6108006912405983e+00 -5.2197189527623922e-01 -3.2269947468929896e+00 -2.1653104646791865e+00 -6.4962701605514439e-01 -1.5363183625594041e+00 2.4612902563934314e+00 5.2925475034345626e-01 1.6089611130495733e+00 3.9849300789442883e+00 7.5405008126740392e-01 1.7191477817289864e+00 -3.6243314620087768e+00 -4.7730327763812741e-01 -1.6021681289071641e+00 -1.7332473519555316e+00 -6.7747308241024373e-01 -1.5037394107054929e+00 1.4220816004163324e+00 3.8343764313174461e-01 1.5637799806374157e+00 2.1401439270442779e+00 5.9884665263383985e-01 1.4119315863694566e+00 -2.4855565841548337e+00 -4.6118575127292871e-01 -1.6615945596133712e+00 -5.6489470679441567e-01 -1.8862737653188226e+00 -1.1223753661143672e+00 5.1095359898453474e-01 1.6192913171993486e+00 7.8178170043742978e-01 7.5405008126740403e-01 3.3318006848978876e+00 1.1268760598278831e+00 -4.6378093653945529e-01 -3.0443865855313610e+00 -9.2158268783768915e-01 -6.7635246225283374e-01 -1.1595262859486086e+00 -9.9614912513672871e-01 4.4390071072982695e-01 9.1459622334956725e-01 9.7493193556179347e-01 6.0261485546401272e-01 1.8597391814573621e+00 1.0879806032605808e+00 -6.0649114085907341e-01 -1.6352407701053728e+00 -9.3146311999890230e-01 -1.2852759059173111e+00 -1.0800345305051804e+00 -3.9461993205113512e+00 1.6246965746255908e+00 8.2007155154219180e-01 3.8664585667222777e+00 1.7191477817289864e+00 1.1268760598278831e+00 5.4170459153244126e+00 -1.6573827735306303e+00 -9.7875929457587296e-01 -5.7973931612985590e+00 -1.4991165329981844e+00 -9.9475178650972529e-01 -2.9134825688243948e+00 1.2770424566797192e+00 6.9686013363660926e-01 3.2727375639804079e+00 1.4397206196988512e+00 1.1006266097034383e+00 3.9667272338372479e+00 -1.6188322202870209e+00 -6.9088874311934301e-01 -3.8658942292300420e+00 1.9333691289048873e+00 3.6258049011541399e-01 1.2634820849364412e+00 -2.1851607182367490e+00 -2.6122990836438625e-01 -1.3773113024972798e+00 -3.6243314620087772e+00 -4.6378093653945535e-01 -1.6573827735306303e+00 3.5048916321913506e+00 2.8603526532437268e-01 1.4604409482204175e+00 1.3852867794792671e+00 4.3580753222784885e-01 1.2543066172041066e+00 -1.2315151838091862e+00 -2.4161215728155649e-01 -1.2418549859908858e+00 -1.9232912985148209e+00 -4.3308227180474534e-01 -1.2446167049971582e+00 2.1407511219940285e+00 3.1528198632250781e-01 1.5429361166549900e+00 3.8841627675168044e-01 1.6135735865715606e+00 9.1262230888364493e-01 -3.1251129160741825e-01 -1.5183804032012829e+00 -5.4066747922390945e-01 -4.7730327763812741e-01 -3.0443865855313610e+00 -9.7875929457587296e-01 2.8603526532437273e-01 3.0292555057533073e+00 6.8171602952968846e-01 3.6889101966710292e-01 8.8191632368065564e-01 6.7366265891255839e-01 -2.3613938587938132e-01 -8.2282891297716332e-01 -5.6740843625465631e-01 -3.1516452757981711e-01 -1.6428474876993575e+00 -7.6243958932790812e-01 2.9777592096158784e-01 1.5036979734036415e+00 5.8127380205645529e-01 1.2798344091627227e+00 8.6541527216279834e-01 4.3616692644848776e+00 -1.6727930664412787e+00 -5.5862542817092842e-01 -4.3132322123191376e+00 -1.6021681289071645e+00 -9.2158268783768893e-01 -5.7973931612985590e+00 1.4604409482204168e+00 6.8171602952968802e-01 6.4008667467438700e+00 1.5745885450804546e+00 9.8486150996151789e-01 3.2574089710716478e+00 -1.2750288347471161e+00 -5.9602443500031876e-01 -3.7603242272534545e+00 -1.2729526088474352e+00 -1.0567372719991355e+00 -4.4355809257331016e+00 1.5080787364793999e+00 6.0097701135406634e-01 4.2865855443038559e+00 2.1686601970973411e+00 6.1274803892782148e-01 1.4660092411433461e+00 -2.5389098107920667e+00 -4.6584706911889517e-01 -1.7120509885973363e+00 -1.7332473519555316e+00 -6.7635246225283374e-01 -1.4991165329981846e+00 1.3852867794792671e+00 3.6889101966710297e-01 1.5745885450804544e+00 4.1062224220383721e+00 8.1505494105863097e-01 1.8468378963985819e+00 -3.6868890211681862e+00 -5.1859292906322985e-01 -1.7532321049770041e+00 -2.1806943458938055e+00 -6.8860973613598309e-01 -1.6148876279183417e+00 2.4795711311946098e+00 5.5270819691738571e-01 1.6918515718684850e+00 6.2319107703687326e-01 1.8658561968875771e+00 1.1232496408461794e+00 -6.3149274625081186e-01 -1.6438769094565726e+00 -9.6171836974303804e-01 -6.7747308241024384e-01 -1.1595262859486088e+00 -9.9475178650972540e-01 4.3580753222784885e-01 8.8191632368065564e-01 9.8486150996151800e-01 8.1505494105863097e-01 3.4045553793439267e+00 1.2138016834081649e+00 -5.2172143376616897e-01 -3.0614123551580508e+00 -1.0338551525122601e+00 -5.8982911182530373e-01 -1.9031640216321437e+00 -1.1812427612316185e+00 5.4646282392917522e-01 1.6156516722832150e+00 8.4965523578078028e-01 1.4798478073024091e+00 1.1170905503015744e+00 4.0305854828830041e+00 -1.6796553632107709e+00 -6.9316993685804340e-01 -3.9420113442324762e+00 -1.5037394107054929e+00 -9.9614912513672871e-01 -2.9134825688243948e+00 1.2543066172041066e+00 6.7366265891255839e-01 3.2574089710716478e+00 1.8468378963985819e+00 1.2138016834081651e+00 5.6287327577282351e+00 -1.7463615153820551e+00 -1.0240126300141681e+00 -5.9629984610837150e+00 -1.3330068698348743e+00 -1.1426234987129478e+00 -4.0540885709616585e+00 1.6817708382280956e+00 8.5140029809958928e-01 3.9558537334193580e+00 -1.9599255169299346e+00 -4.4593292208470597e-01 -1.3020311857068583e+00 2.2084297709520113e+00 3.1822574635901502e-01 1.5911493597087036e+00 1.4220816004163324e+00 4.4390071072982695e-01 1.2770424566797189e+00 -1.2315151838091865e+00 -2.3613938587938132e-01 -1.2750288347471164e+00 -3.6868890211681862e+00 -5.2172143376616897e-01 -1.7463615153820553e+00 3.4939965159297115e+00 3.2460324284677322e-01 1.5742029712099459e+00 1.9615203690203449e+00 4.1105367746232291e-01 1.3424494330830501e+00 -2.2076985344110924e+00 -2.9398963566768133e-01 -1.4614226848453897e+00 -3.4198064778883325e-01 -1.6593591184180023e+00 -8.0506023834152363e-01 3.2879614157519726e-01 1.5278401537440776e+00 6.1797227770103291e-01 3.8343764313174455e-01 9.1459622334956725e-01 6.9686013363660948e-01 -2.4161215728155649e-01 -8.2282891297716332e-01 -5.9602443500031876e-01 -5.1859292906322974e-01 -3.0614123551580508e+00 -1.0240126300141679e+00 3.2460324284677322e-01 2.9757478521159961e+00 7.5362842153795540e-01 4.0253134541732022e-01 1.6398906686759700e+00 9.4994961437693248e-01 -3.3718263883741562e-01 -1.5144745113323945e+00 -5.9331314389652012e-01 -1.3220886881229159e+00 -1.0665779518374752e+00 -4.5024765050892048e+00 1.5826629999874955e+00 5.9562462462705712e-01 4.3717497751007359e+00 1.5637799806374157e+00 9.7493193556179347e-01 3.2727375639804079e+00 -1.2418549859908858e+00 -5.6740843625465620e-01 -3.7603242272534541e+00 -1.7532321049770039e+00 -1.0338551525122601e+00 -5.9629984610837150e+00 1.5742029712099463e+00 7.5362842153795528e-01 6.5045036928863968e+00 1.3220355412979214e+00 9.5310392324652882e-01 4.4903256551300439e+00 -1.7255057140419729e+00 -6.0944736436894220e-01 -4.4135174936712120e+00 -1.2119949284585885e+00 -4.7690713816518948e-01 -1.1614277628137422e+00 1.4180051885473239e+00 3.5735994503483515e-01 1.2766969003578295e+00 2.1401439270442779e+00 6.0261485546401283e-01 1.4397206196988512e+00 -1.9232912985148209e+00 -3.1516452757981711e-01 -1.2729526088474352e+00 -2.1806943458938055e+00 -5.8982911182530373e-01 -1.3330068698348745e+00 1.9615203690203449e+00 4.0253134541732022e-01 1.3220355412979214e+00 3.4196075774720081e+00 5.7531946666219214e-01 1.4133952209798912e+00 -3.6232964892167399e+00 -5.5592483500804968e-01 -1.6844610408384426e+00 -4.8867978034995180e-01 -1.1698761473927439e+00 -1.1255236691454797e+00 5.7360512745800907e-01 9.1016075669335894e-01 9.2936122476502003e-01 5.9884665263383985e-01 1.8597391814573621e+00 1.1006266097034383e+00 -4.3308227180474540e-01 -1.6428474876993573e+00 -1.0567372719991353e+00 -6.8860973613598309e-01 -1.9031640216321437e+00 -1.1426234987129475e+00 4.1105367746232296e-01 1.6398906686759700e+00 9.5310392324652882e-01 5.7531946666219214e-01 3.3405028916219708e+00 1.3196282929880470e+00 -5.4845313592568345e-01 -3.0344058417244160e+00 -9.7783561084547155e-01 -1.1713139802265498e+00 -1.1077713251786947e+00 -3.4115581415714931e+00 1.5335199715741346e+00 6.7768338371754477e-01 3.3031626116493049e+00 1.4119315863694568e+00 1.0879806032605808e+00 3.9667272338372488e+00 -1.2446167049971582e+00 -7.6243958932790823e-01 -4.4355809257331016e+00 -1.6148876279183420e+00 -1.1812427612316185e+00 -4.0540885709616585e+00 1.3424494330830501e+00 9.4994961437693248e-01 4.4903256551300439e+00 1.4133952209798915e+00 1.3196282929880472e+00 6.0359314595408220e+00 -1.6704778988644826e+00 -9.8378821860488341e-01 -5.8949193218911660e+00 1.3938654195442921e+00 5.5682046964553167e-01 1.5142115411624446e+00 -1.7549389629796828e+00 -3.2444945482365944e-01 -1.6108006912405983e+00 -2.4855565841548342e+00 -6.0649114085907341e-01 -1.6188322202870209e+00 2.1407511219940285e+00 2.9777592096158784e-01 1.5080787364793997e+00 2.4795711311946098e+00 5.4646282392917522e-01 1.6817708382280956e+00 -2.2076985344110924e+00 -3.3718263883741562e-01 -1.7255057140419727e+00 -3.6232964892167399e+00 -5.4845313592568357e-01 -1.6704778988644824e+00 4.0573028980294188e+00 4.1551715590953719e-01 1.9215554085641344e+00 3.6748145337202354e-01 8.9085596634240383e-01 6.9293439612035468e-01 -3.3988857057279465e-01 -8.1342371197842933e-01 -5.2197189527623922e-01 -4.6118575127292871e-01 -1.6352407701053728e+00 -6.9088874311934312e-01 3.1528198632250787e-01 1.5036979734036413e+00 6.0097701135406634e-01 5.5270819691738593e-01 1.6156516722832150e+00 8.5140029809958917e-01 -2.9398963566768133e-01 -1.5144745113323945e+00 -6.0944736436894220e-01 -5.5592483500804968e-01 -3.0344058417244164e+00 -9.8378821860488330e-01 4.1551715590953708e-01 2.9873392231113529e+00 6.6078451579539754e-01 1.2863401688761389e+00 9.1669043978304021e-01 3.2741236431997955e+00 -1.6352049806665458e+00 -5.0579211867478002e-01 -3.2269947468929896e+00 -1.6615945596133712e+00 -9.3146311999890230e-01 -3.8658942292300420e+00 1.5429361166549900e+00 5.8127380205645540e-01 4.2865855443038559e+00 1.6918515718684852e+00 8.4965523578078028e-01 3.9558537334193580e+00 -1.4614226848453897e+00 -5.9331314389652012e-01 -4.4135174936712112e+00 -1.6844610408384428e+00 -9.7783561084547166e-01 -5.8949193218911642e+00 1.9215554085641344e+00 6.6078451579539765e-01 5.8847628707623967e+00 798 799 800 840 841 842 483 484 485 465 466 467 801 802 803 843 844 845 486 487 488 468 469 470 3.4401111603246792e+00 7.8447629636530847e-01 1.2457607959892274e+00 -3.5965186652817889e+00 -8.3617108829319409e-01 -1.5045789557504470e+00 -2.0739281030084280e+00 -7.6227242586003774e-01 -1.1145232357627317e+00 1.8659865908962965e+00 5.9093366387864166e-01 1.1371299225955638e+00 2.1161930981805326e+00 8.6678700404252784e-01 1.3034467700723349e+00 -1.9263162501996436e+00 -5.7870811830113167e-01 -1.1967410729655128e+00 -1.1560601363892180e+00 -6.6507071634946158e-01 -1.0199137865679997e+00 1.3305323054775711e+00 6.0002538451734766e-01 1.1494195623895647e+00 7.8447629636530825e-01 3.9569937887576723e+00 1.7207138557281221e+00 -8.1930767919851621e-01 -3.5595350156973495e+00 -1.4552685894635076e+00 -8.7583810098210035e-01 -2.3665431080299841e+00 -1.4075526621763810e+00 5.5919619401075071e-01 2.0490018435605353e+00 1.3402308761482498e+00 8.5364491309460300e-01 2.4065218892786744e+00 1.4935905732156640e+00 -6.5794213915090649e-01 -2.1554843586559582e+00 -1.5614551451298659e+00 -6.3782338764114099e-01 -1.6614873446911620e+00 -1.4593461601266209e+00 7.9359390350200187e-01 1.3305323054775715e+00 1.3290872518043395e+00 1.2457607959892274e+00 1.7207138557281223e+00 5.5972392071792116e+00 -1.4918513920560108e+00 -1.4738418626968459e+00 -5.5216571446002165e+00 -1.3290541299543546e+00 -1.4640522005813237e+00 -3.5189957047948086e+00 1.1061549443677858e+00 1.3753696499876344e+00 3.9944933453264415e+00 1.3016624168475215e+00 1.5114306732610281e+00 3.6489421590502369e+00 -1.1645243466492168e+00 -1.3311695622039457e+00 -4.1626832194345651e+00 -9.9723554034929152e-01 -1.4878701158842333e+00 -2.9951277905296183e+00 1.3290872518043393e+00 1.1494195623895653e+00 2.9577891478033194e+00 -3.5965186652817889e+00 -8.1930767919851633e-01 -1.4918513920560110e+00 3.9605634789458555e+00 7.7461779046746715e-01 1.7487221288565391e+00 2.3520213726045309e+00 8.0387919681166853e-01 1.4461439307421697e+00 -2.0950794407438846e+00 -6.1514134033263523e-01 -1.5239933855480232e+00 -2.4660697923438764e+00 -9.4257228476082355e-01 -1.5007147169029240e+00 2.1587274077045047e+00 6.3807791042187478e-01 1.4557382985456893e+00 1.3478429838058195e+00 8.2551712294042556e-01 1.3538252522467924e+00 -1.6614873446911604e+00 -6.6507071634946135e-01 -1.4878701158842320e+00 -8.3617108829319386e-01 -3.5595350156973491e+00 -1.4738418626968464e+00 7.7461779046746715e-01 3.3718311312096447e+00 1.2063755033546346e+00 8.1142471636858049e-01 2.0457357304211121e+00 1.2373138959609138e+00 -5.1176816239204925e-01 -1.8566509462971679e+00 -1.1119690618191314e+00 -7.9792981810959662e-01 -2.1205603136442930e+00 -1.1479276723010812e+00 6.1955124313278287e-01 1.9273965665914516e+00 1.1593313393643414e+00 5.7809870646714989e-01 1.3478429838058195e+00 1.1279533984864598e+00 -6.3782338764114055e-01 -1.1560601363892178e+00 -9.9723554034929074e-01 -1.5045789557504474e+00 -1.4552685894635078e+00 -5.5216571446002165e+00 1.7487221288565395e+00 1.2063755033546346e+00 5.5570693196025029e+00 1.4196812483328802e+00 1.2011663644454267e+00 3.5352474941248482e+00 -1.2337458382503330e+00 -1.0678852151637006e+00 -4.0492086911380554e+00 -1.5597112611980835e+00 -1.4148614814974849e+00 -3.6504386866533163e+00 1.4610254396496041e+00 1.1965619526458382e+00 4.1364570189961949e+00 1.1279533984864605e+00 1.3538252522467937e+00 2.9876584801976618e+00 -1.4593461601266204e+00 -1.0199137865680004e+00 -2.9951277905296179e+00 -2.0739281030084284e+00 -8.7583810098210035e-01 -1.3290541299543546e+00 2.3520213726045300e+00 8.1142471636858049e-01 1.4196812483328802e+00 3.8186485315000582e+00 1.0161743965831715e+00 1.4695759712115364e+00 -3.4908051475241093e+00 -7.3007434453028974e-01 -1.3926523382380003e+00 -1.6382670296084298e+00 -9.2466796422794340e-01 -1.3007179652045631e+00 1.3531377536452502e+00 6.6137452583695011e-01 1.3960530499883985e+00 2.0457357304211166e+00 8.0387919681166897e-01 1.2011663644454265e+00 -2.3665431080299872e+00 -7.6227242586003818e-01 -1.4640522005813239e+00 -7.6227242586003774e-01 -2.3665431080299841e+00 -1.4640522005813237e+00 8.0387919681166853e-01 2.0457357304211121e+00 1.2011663644454265e+00 1.0161743965831713e+00 3.8186485315000582e+00 1.4695759712115362e+00 -7.3007434453028963e-01 -3.4908051475241102e+00 -1.3926523382380007e+00 -9.2466796422794384e-01 -1.6382670296084298e+00 -1.3007179652045633e+00 6.6137452583695033e-01 1.3531377536452502e+00 1.3960530499883987e+00 8.1142471636858171e-01 2.3520213726045349e+00 1.4196812483328802e+00 -8.7583810098210058e-01 -2.0739281030084316e+00 -1.3290541299543548e+00 -1.1145232357627317e+00 -1.4075526621763810e+00 -3.5189957047948086e+00 1.4461439307421700e+00 1.2373138959609136e+00 3.5352474941248486e+00 1.4695759712115362e+00 1.4695759712115364e+00 4.9370071412649512e+00 -1.4553039230234672e+00 -1.4553039230234674e+00 -5.3603162060685774e+00 -1.3071736307784279e+00 -1.3071736307784276e+00 -2.5478809181315860e+00 1.1315196538263872e+00 1.1315196538263870e+00 2.9386864042751313e+00 1.2373138959609153e+00 1.4461439307421715e+00 3.5352474941248535e+00 -1.4075526621763816e+00 -1.1145232357627326e+00 -3.5189957047948122e+00 1.8659865908962965e+00 5.5919619401075082e-01 1.1061549443677858e+00 -2.0950794407438846e+00 -5.1176816239204925e-01 -1.2337458382503332e+00 -3.4908051475241093e+00 -7.3007434453029008e-01 -1.4553039230234674e+00 3.3946218695944603e+00 5.2481630415385316e-01 1.2857735140027204e+00 1.3125614083276389e+00 6.4270416054353163e-01 1.0952156107570699e+00 -1.1796361778137663e+00 -4.6066647533180272e-01 -1.1055787426777093e+00 -1.8566509462971723e+00 -6.1514134033263568e-01 -1.0678852151637011e+00 2.0490018435605384e+00 5.9093366387864232e-01 1.3753696499876347e+00 5.9093366387864166e-01 2.0490018435605353e+00 1.3753696499876342e+00 -6.1514134033263523e-01 -1.8566509462971679e+00 -1.0678852151637006e+00 -7.3007434453028952e-01 -3.4908051475241102e+00 -1.4553039230234674e+00 5.2481630415385316e-01 3.3946218695944612e+00 1.2857735140027211e+00 6.4270416054353174e-01 1.3125614083276389e+00 1.0952156107570699e+00 -4.6066647533180266e-01 -1.1796361778137667e+00 -1.1055787426777095e+00 -5.1176816239204981e-01 -2.0950794407438900e+00 -1.2337458382503339e+00 5.5919619401075071e-01 1.8659865908963007e+00 1.1061549443677867e+00 1.1371299225955636e+00 1.3402308761482498e+00 3.9944933453264415e+00 -1.5239933855480232e+00 -1.1119690618191314e+00 -4.0492086911380554e+00 -1.3926523382380001e+00 -1.3926523382380007e+00 -5.3603162060685774e+00 1.2857735140027204e+00 1.2857735140027211e+00 6.0323610379884229e+00 1.4263647061185285e+00 1.4263647061185283e+00 2.9336004453687172e+00 -1.1608842332599063e+00 -1.1608842332599065e+00 -3.4962145856653333e+00 -1.1119690618191320e+00 -1.5239933855480250e+00 -4.0492086911380607e+00 1.3402308761482495e+00 1.1371299225955649e+00 3.9944933453264455e+00 2.1161930981805326e+00 8.5364491309460300e-01 1.3016624168475213e+00 -2.4660697923438764e+00 -7.9792981810959662e-01 -1.5597112611980832e+00 -1.6382670296084301e+00 -9.2466796422794395e-01 -1.3071736307784281e+00 1.3125614083276389e+00 6.4270416054353174e-01 1.4263647061185285e+00 4.0676773627567124e+00 1.1455849159225746e+00 1.6347190856208522e+00 -3.6780566229469573e+00 -8.4355092650487284e-01 -1.5924305083739345e+00 -2.1205603136442974e+00 -9.4257228476082466e-01 -1.4148614814974851e+00 2.4065218892786779e+00 8.6678700404252873e-01 1.5114306732610285e+00 8.6678700404252784e-01 2.4065218892786744e+00 1.5114306732610281e+00 -9.4257228476082344e-01 -2.1205603136442930e+00 -1.4148614814974849e+00 -9.2466796422794340e-01 -1.6382670296084298e+00 -1.3071736307784276e+00 6.4270416054353163e-01 1.3125614083276393e+00 1.4263647061185283e+00 1.1455849159225742e+00 4.0676773627567124e+00 1.6347190856208518e+00 -8.4355092650487240e-01 -3.6780566229469569e+00 -1.5924305083739341e+00 -7.9792981810959707e-01 -2.4660697923438808e+00 -1.5597112611980830e+00 8.5364491309460300e-01 2.1161930981805361e+00 1.3016624168475213e+00 1.3034467700723351e+00 1.4935905732156640e+00 3.6489421590502373e+00 -1.5007147169029240e+00 -1.1479276723010812e+00 -3.6504386866533163e+00 -1.3007179652045631e+00 -1.3007179652045631e+00 -2.5478809181315860e+00 1.0952156107570696e+00 1.0952156107570699e+00 2.9336004453687172e+00 1.6347190856208518e+00 1.6347190856208518e+00 5.2625211671193171e+00 -1.5776116852573516e+00 -1.5776116852573523e+00 -5.6452476391502904e+00 -1.1479276723010825e+00 -1.5007147169029260e+00 -3.6504386866533203e+00 1.4935905732156647e+00 1.3034467700723364e+00 3.6489421590502409e+00 -1.9263162501996438e+00 -6.5794213915090649e-01 -1.1645243466492168e+00 2.1587274077045051e+00 6.1955124313278287e-01 1.4610254396496041e+00 1.3531377536452505e+00 6.6137452583695033e-01 1.1315196538263872e+00 -1.1796361778137663e+00 -4.6066647533180266e-01 -1.1608842332599063e+00 -3.6780566229469573e+00 -8.4355092650487251e-01 -1.5776116852573516e+00 3.5002316816751180e+00 6.2186397989710496e-01 1.4450827812485918e+00 1.9273965665914559e+00 6.3807791042187545e-01 1.1965619526458386e+00 -2.1554843586559618e+00 -5.7870811830113233e-01 -1.3311695622039461e+00 -5.7870811830113167e-01 -2.1554843586559582e+00 -1.3311695622039454e+00 6.3807791042187478e-01 1.9273965665914514e+00 1.1965619526458380e+00 6.6137452583695000e-01 1.3531377536452507e+00 1.1315196538263868e+00 -4.6066647533180272e-01 -1.1796361778137667e+00 -1.1608842332599065e+00 -8.4355092650487273e-01 -3.6780566229469569e+00 -1.5776116852573521e+00 6.2186397989710496e-01 3.5002316816751180e+00 1.4450827812485920e+00 6.1955124313278342e-01 2.1587274077045091e+00 1.4610254396496047e+00 -6.5794213915090649e-01 -1.9263162501996478e+00 -1.1645243466492174e+00 -1.1967410729655126e+00 -1.5614551451298659e+00 -4.1626832194345651e+00 1.4557382985456893e+00 1.1593313393643414e+00 4.1364570189961949e+00 1.3960530499883985e+00 1.3960530499883987e+00 2.9386864042751313e+00 -1.1055787426777093e+00 -1.1055787426777093e+00 -3.4962145856653337e+00 -1.5924305083739343e+00 -1.5924305083739336e+00 -5.6452476391502904e+00 1.4450827812485918e+00 1.4450827812485920e+00 6.2552282214172354e+00 1.1593313393643427e+00 1.4557382985456906e+00 4.1364570189962002e+00 -1.5614551451298659e+00 -1.1967410729655135e+00 -4.1626832194345695e+00 -1.1560601363892180e+00 -6.3782338764114099e-01 -9.9723554034929152e-01 1.3478429838058195e+00 5.7809870646714978e-01 1.1279533984864605e+00 2.0457357304211166e+00 8.1142471636858160e-01 1.2373138959609153e+00 -1.8566509462971723e+00 -5.1176816239204981e-01 -1.1119690618191318e+00 -2.1205603136442979e+00 -7.9792981810959707e-01 -1.1479276723010825e+00 1.9273965665914559e+00 6.1955124313278342e-01 1.1593313393643425e+00 3.3718311312096607e+00 7.7461779046746881e-01 1.2063755033546364e+00 -3.5595350156973646e+00 -8.3617108829319575e-01 -1.4738418626968488e+00 -6.6507071634946147e-01 -1.6614873446911620e+00 -1.4878701158842333e+00 8.2551712294042545e-01 1.3478429838058195e+00 1.3538252522467937e+00 8.0387919681166908e-01 2.3520213726045354e+00 1.4461439307421715e+00 -6.1514134033263579e-01 -2.0950794407438895e+00 -1.5239933855480250e+00 -9.4257228476082466e-01 -2.4660697923438808e+00 -1.5007147169029258e+00 6.3807791042187556e-01 2.1587274077045091e+00 1.4557382985456906e+00 7.7461779046746881e-01 3.9605634789458732e+00 1.7487221288565420e+00 -8.1930767919851710e-01 -3.5965186652818053e+00 -1.4918513920560135e+00 -1.0199137865679997e+00 -1.4593461601266209e+00 -2.9951277905296183e+00 1.3538252522467924e+00 1.1279533984864598e+00 2.9876584801976618e+00 1.2011663644454267e+00 1.4196812483328807e+00 3.5352474941248535e+00 -1.0678852151637013e+00 -1.2337458382503341e+00 -4.0492086911380607e+00 -1.4148614814974851e+00 -1.5597112611980830e+00 -3.6504386866533203e+00 1.1965619526458389e+00 1.4610254396496047e+00 4.1364570189961993e+00 1.2063755033546366e+00 1.7487221288565418e+00 5.5570693196025207e+00 -1.4552685894635087e+00 -1.5045789557504496e+00 -5.5216571446002352e+00 1.3305323054775711e+00 7.9359390350200187e-01 1.3290872518043393e+00 -1.6614873446911607e+00 -6.3782338764114055e-01 -1.4593461601266204e+00 -2.3665431080299868e+00 -8.7583810098210058e-01 -1.4075526621763816e+00 2.0490018435605384e+00 5.5919619401075071e-01 1.3402308761482493e+00 2.4065218892786779e+00 8.5364491309460289e-01 1.4935905732156647e+00 -2.1554843586559622e+00 -6.5794213915090649e-01 -1.5614551451298659e+00 -3.5595350156973646e+00 -8.1930767919851710e-01 -1.4552685894635087e+00 3.9569937887576874e+00 7.8447629636530924e-01 1.7207138557281234e+00 6.0002538451734766e-01 1.3305323054775713e+00 1.1494195623895653e+00 -6.6507071634946135e-01 -1.1560601363892178e+00 -1.0199137865680004e+00 -7.6227242586003818e-01 -2.0739281030084316e+00 -1.1145232357627328e+00 5.9093366387864232e-01 1.8659865908963007e+00 1.1371299225955651e+00 8.6678700404252873e-01 2.1161930981805366e+00 1.3034467700723364e+00 -5.7870811830113233e-01 -1.9263162501996478e+00 -1.1967410729655137e+00 -8.3617108829319586e-01 -3.5965186652818053e+00 -1.5045789557504499e+00 7.8447629636530947e-01 3.4401111603246948e+00 1.2457607959892298e+00 1.1494195623895647e+00 1.3290872518043395e+00 2.9577891478033194e+00 -1.4878701158842320e+00 -9.9723554034929074e-01 -2.9951277905296179e+00 -1.4640522005813239e+00 -1.3290541299543550e+00 -3.5189957047948122e+00 1.3753696499876349e+00 1.1061549443677863e+00 3.9944933453264460e+00 1.5114306732610288e+00 1.3016624168475213e+00 3.6489421590502413e+00 -1.3311695622039461e+00 -1.1645243466492174e+00 -4.1626832194345695e+00 -1.4738418626968488e+00 -1.4918513920560137e+00 -5.5216571446002352e+00 1.7207138557281234e+00 1.2457607959892298e+00 5.5972392071792276e+00 840 841 842 882 883 884 501 502 503 483 484 485 843 844 845 885 886 887 894 895 896 486 487 488 3.1827187640338397e+00 7.2272214691394987e-01 1.1330192760186499e+00 -3.3322289312876427e+00 -7.8084901036977827e-01 -1.3948927383017520e+00 -1.9381628718902828e+00 -7.1321103071055281e-01 -1.0213161556098194e+00 1.7272192055017039e+00 5.3975965165365081e-01 1.0380814994864722e+00 1.9401878460907247e+00 8.1292242674408410e-01 1.2017289862441198e+00 -1.7495425692978941e+00 -5.1947009386014131e-01 -1.0894547905138117e+00 -1.0557893842037274e+00 -6.1246495339615192e-01 -9.2370241951451382e-01 1.2255979410532800e+00 5.5059086302494009e-01 1.0565363421906557e+00 7.2272214691394987e-01 3.7105863416451763e+00 1.6186066709689526e+00 -7.6340977910564811e-01 -3.2978965967542493e+00 -1.3471113822772058e+00 -8.3004483010614838e-01 -2.2410830668416510e+00 -1.3172225856596615e+00 5.0754001725211761e-01 1.9101303752040697e+00 1.2470720353095737e+00 8.0207516208421248e-01 2.2409450636485415e+00 1.3955990431295318e+00 -6.0063841544882324e-01 -1.9789887338042154e+00 -1.4662978155115576e+00 -5.8732207618441645e-01 -1.5692913241509496e+00 -1.3717374731965237e+00 7.4907777459475722e-01 1.2255979410532791e+00 1.2410915072368915e+00 1.1330192760186499e+00 1.6186066709689528e+00 5.2061039547076735e+00 -1.3854442761560337e+00 -1.3700778736922026e+00 -5.1227203294992334e+00 -1.2399313070621014e+00 -1.3778230902927791e+00 -3.2657252191059727e+00 1.0121265052918365e+00 1.2901730833235430e+00 3.7399498962810345e+00 1.2044086305000352e+00 1.4140824318375478e+00 3.3457139211529610e+00 -1.0592878495806213e+00 -1.2285221286040549e+00 -3.8647214387859474e+00 -9.0598248624865496e-01 -1.4029754357316604e+00 -2.7797460319159746e+00 1.2410915072368920e+00 1.0565363421906551e+00 2.7411452471654605e+00 -3.3322289312876423e+00 -7.6340977910564811e-01 -1.3854442761560337e+00 3.7135658996717860e+00 7.1426980172854981e-01 1.6448089238837238e+00 2.2235793091576279e+00 7.5557626097852992e-01 1.3574661467785551e+00 -1.9577150633900922e+00 -5.6273685993943312e-01 -1.4351853650020481e+00 -2.3030245655329220e+00 -8.9326596754523158e-01 -1.4030714904795003e+00 1.9805242764139286e+00 5.8077490848861535e-01 1.3596424233459221e+00 1.2445903991182645e+00 7.8125658879076854e-01 1.2647590733610419e+00 -1.5692913241509503e+00 -6.1246495339615170e-01 -1.4029754357316613e+00 -7.8084901036977827e-01 -3.2978965967542493e+00 -1.3700778736922026e+00 7.1426980172854981e-01 3.1179860509930641e+00 1.0966852264044726e+00 7.6607689327008610e-01 1.9087741982060302e+00 1.1503417316775790e+00 -4.6189616653623200e-01 -1.7205372166872261e+00 -1.0168301890692972e+00 -7.4396751638501790e-01 -1.9490846901650909e+00 -1.0487320741375721e+00 5.6190873346423531e-01 1.7519572394929341e+00 1.0571126702133631e+00 5.3177934101257318e-01 1.2445903991182645e+00 1.0374829948523121e+00 -5.8732207618441690e-01 -1.0557893842037269e+00 -9.0598248624865541e-01 -1.3948927383017522e+00 -1.3471113822772058e+00 -5.1227203294992343e+00 1.6448089238837240e+00 1.0966852264044726e+00 5.1628352926539147e+00 1.3295236270651538e+00 1.1085836301970213e+00 3.2786178660814800e+00 -1.1428954930667625e+00 -9.7194422319182339e-01 -3.7952350025112285e+00 -1.4609951980733353e+00 -1.3168814376638855e+00 -3.3481720741652108e+00 1.3587053568371830e+00 1.0896115326848919e+00 3.8359839997775511e+00 1.0374829948523119e+00 1.2647590733610410e+00 2.7684362795787005e+00 -1.3717374731965244e+00 -9.2370241951451315e-01 -2.7797460319159746e+00 -1.9381628718902828e+00 -8.3004483010614838e-01 -1.2399313070621014e+00 2.2235793091576279e+00 7.6607689327008588e-01 1.3295236270651536e+00 3.6421391612669236e+00 9.7245523628157304e-01 1.3754716990082476e+00 -3.2945423530428362e+00 -6.7715174917671495e-01 -1.2947182414623257e+00 -1.5483503505235743e+00 -8.8280814055498258e-01 -1.2127297323907871e+00 1.2476459736677610e+00 6.0910736001820887e-01 1.3116234149375705e+00 1.9087741982060311e+00 7.5557626097852937e-01 1.1085836301970218e+00 -2.2410830668416510e+00 -7.1321103071055258e-01 -1.3778230902927797e+00 -7.1321103071055281e-01 -2.2410830668416510e+00 -1.3778230902927791e+00 7.5557626097852981e-01 1.9087741982060302e+00 1.1085836301970213e+00 9.7245523628157304e-01 3.6421391612669232e+00 1.3754716990082472e+00 -6.7715174917671461e-01 -3.2945423530428370e+00 -1.2947182414623255e+00 -8.8280814055498236e-01 -1.5483503505235743e+00 -1.2127297323907871e+00 6.0910736001820898e-01 1.2476459736677608e+00 1.3116234149375705e+00 7.6607689327008599e-01 2.2235793091576284e+00 1.3295236270651536e+00 -8.3004483010614882e-01 -1.9381628718902832e+00 -1.2399313070621016e+00 -1.0213161556098194e+00 -1.3172225856596611e+00 -3.2657252191059727e+00 1.3574661467785551e+00 1.1503417316775792e+00 3.2786178660814800e+00 1.3754716990082474e+00 1.3754716990082474e+00 4.6254718016259950e+00 -1.3678638675859189e+00 -1.3678638675859194e+00 -5.0375780061566644e+00 -1.2172510368306659e+00 -1.2172510368306659e+00 -2.3328341740056637e+00 1.0403740682216835e+00 1.0403740682216835e+00 2.7191550845853150e+00 1.1503417316775790e+00 1.3574661467785547e+00 3.2786178660814813e+00 -1.3172225856596622e+00 -1.0213161556098189e+00 -3.2657252191059740e+00 1.7272192055017039e+00 5.0754001725211761e-01 1.0121265052918362e+00 -1.9577150633900924e+00 -4.6189616653623194e-01 -1.1428954930667625e+00 -3.2945423530428362e+00 -6.7715174917671472e-01 -1.3678638675859192e+00 3.2048810018607061e+00 4.7196132849987077e-01 1.1850750219725825e+00 1.2083879231808208e+00 5.9201139147734416e-01 1.0071858361819090e+00 -1.0778238726271454e+00 -4.0948761323060318e-01 -1.0118568629253648e+00 -1.7205372166872266e+00 -5.6273685993943268e-01 -9.7194422319182339e-01 1.9101303752040697e+00 5.3975965165365059e-01 1.2901730833235425e+00 5.3975965165365081e-01 1.9101303752040697e+00 1.2901730833235430e+00 -5.6273685993943290e-01 -1.7205372166872261e+00 -9.7194422319182361e-01 -6.7715174917671483e-01 -3.2945423530428370e+00 -1.3678638675859194e+00 4.7196132849987077e-01 3.2048810018607075e+00 1.1850750219725830e+00 5.9201139147734405e-01 1.2083879231808208e+00 1.0071858361819088e+00 -4.0948761323060323e-01 -1.0778238726271454e+00 -1.0118568629253648e+00 -4.6189616653623194e-01 -1.9577150633900930e+00 -1.1428954930667630e+00 5.0754001725211784e-01 1.7272192055017044e+00 1.0121265052918369e+00 1.0380814994864720e+00 1.2470720353095739e+00 3.7399498962810345e+00 -1.4351853650020483e+00 -1.0168301890692972e+00 -3.7952350025112285e+00 -1.2947182414623257e+00 -1.2947182414623259e+00 -5.0375780061566644e+00 1.1850750219725821e+00 1.1850750219725830e+00 5.7240309695686813e+00 1.3400763942461713e+00 1.3400763942461718e+00 2.7103776491686400e+00 -1.0635711554811280e+00 -1.0635711554811282e+00 -3.2862604001202680e+00 -1.0168301890692970e+00 -1.4351853650020474e+00 -3.7952350025112302e+00 1.2470720353095748e+00 1.0380814994864718e+00 3.7399498962810362e+00 1.9401878460907247e+00 8.0207516208421259e-01 1.2044086305000354e+00 -2.3030245655329220e+00 -7.4396751638501790e-01 -1.4609951980733351e+00 -1.5483503505235743e+00 -8.8280814055498236e-01 -1.2172510368306659e+00 1.2083879231808210e+00 5.9201139147734405e-01 1.3400763942461713e+00 3.7470824505504328e+00 1.0873586233091197e+00 1.5151980474137490e+00 -3.3361436772489315e+00 -7.7432597912952728e-01 -1.4786378314296165e+00 -1.9490846901650913e+00 -8.9326596754523102e-01 -1.3168814376638855e+00 2.2409450636485424e+00 8.1292242674408355e-01 1.4140824318375480e+00 8.1292242674408399e-01 2.2409450636485420e+00 1.4140824318375476e+00 -8.9326596754523158e-01 -1.9490846901650909e+00 -1.3168814376638855e+00 -8.8280814055498258e-01 -1.5483503505235738e+00 -1.2172510368306657e+00 5.9201139147734416e-01 1.2083879231808208e+00 1.3400763942461718e+00 1.0873586233091195e+00 3.7470824505504328e+00 1.5151980474137490e+00 -7.7432597912952783e-01 -3.3361436772489315e+00 -1.4786378314296167e+00 -7.4396751638501790e-01 -2.3030245655329233e+00 -1.4609951980733353e+00 8.0207516208421326e-01 1.9401878460907249e+00 1.2044086305000359e+00 1.2017289862441198e+00 1.3955990431295315e+00 3.3457139211529618e+00 -1.4030714904795003e+00 -1.0487320741375721e+00 -3.3481720741652108e+00 -1.2127297323907871e+00 -1.2127297323907869e+00 -2.3328341740056637e+00 1.0071858361819088e+00 1.0071858361819088e+00 2.7103776491686400e+00 1.5151980474137490e+00 1.5151980474137490e+00 4.7792173802833675e+00 -1.4551786159614488e+00 -1.4551786159614484e+00 -5.1518445494218437e+00 -1.0487320741375721e+00 -1.4030714904795001e+00 -3.3481720741652117e+00 1.3955990431295324e+00 1.2017289862441192e+00 3.3457139211529627e+00 -1.7495425692978941e+00 -6.0063841544882324e-01 -1.0592878495806213e+00 1.9805242764139286e+00 5.6190873346423531e-01 1.3587053568371834e+00 1.2476459736677610e+00 6.0910736001820898e-01 1.0403740682216835e+00 -1.0778238726271454e+00 -4.0948761323060318e-01 -1.0635711554811280e+00 -3.3361436772489315e+00 -7.7432597912952783e-01 -1.4551786159614488e+00 3.1623713634035626e+00 5.5213109969803509e-01 1.3178687918834937e+00 1.7519572394929350e+00 5.8077490848861535e-01 1.0896115326848919e+00 -1.9789887338042165e+00 -5.1947009386014120e-01 -1.2285221286040551e+00 -5.1947009386014131e-01 -1.9789887338042158e+00 -1.2285221286040546e+00 5.8077490848861535e-01 1.7519572394929344e+00 1.0896115326848916e+00 6.0910736001820898e-01 1.2476459736677608e+00 1.0403740682216835e+00 -4.0948761323060318e-01 -1.0778238726271454e+00 -1.0635711554811282e+00 -7.7432597912952716e-01 -3.3361436772489315e+00 -1.4551786159614488e+00 5.5213109969803520e-01 3.1623713634035626e+00 1.3178687918834939e+00 5.6190873346423487e-01 1.9805242764139290e+00 1.3587053568371832e+00 -6.0063841544882346e-01 -1.7495425692978945e+00 -1.0592878495806215e+00 -1.0894547905138119e+00 -1.4662978155115576e+00 -3.8647214387859474e+00 1.3596424233459221e+00 1.0571126702133631e+00 3.8359839997775511e+00 1.3116234149375705e+00 1.3116234149375703e+00 2.7191550845853145e+00 -1.0118568629253648e+00 -1.0118568629253648e+00 -3.2862604001202680e+00 -1.4786378314296165e+00 -1.4786378314296165e+00 -5.1518445494218428e+00 1.3178687918834937e+00 1.3178687918834937e+00 5.7764247429735889e+00 1.0571126702133629e+00 1.3596424233459217e+00 3.8359839997775520e+00 -1.4662978155115587e+00 -1.0894547905138112e+00 -3.8647214387859488e+00 -1.0557893842037274e+00 -5.8732207618441645e-01 -9.0598248624865496e-01 1.2445903991182647e+00 5.3177934101257318e-01 1.0374829948523121e+00 1.9087741982060311e+00 7.6607689327008599e-01 1.1503417316775790e+00 -1.7205372166872268e+00 -4.6189616653623194e-01 -1.0168301890692970e+00 -1.9490846901650916e+00 -7.4396751638501790e-01 -1.0487320741375721e+00 1.7519572394929350e+00 5.6190873346423498e-01 1.0571126702133629e+00 3.1179860509930668e+00 7.1426980172854948e-01 1.0966852264044722e+00 -3.2978965967542528e+00 -7.8084901036977794e-01 -1.3700778736922028e+00 -6.1246495339615170e-01 -1.5692913241509496e+00 -1.4029754357316604e+00 7.8125658879076854e-01 1.2445903991182645e+00 1.2647590733610410e+00 7.5557626097852948e-01 2.2235793091576279e+00 1.3574661467785547e+00 -5.6273685993943268e-01 -1.9577150633900930e+00 -1.4351853650020476e+00 -8.9326596754523102e-01 -2.3030245655329229e+00 -1.4030714904795003e+00 5.8077490848861535e-01 1.9805242764139288e+00 1.3596424233459217e+00 7.1426980172854948e-01 3.7135658996717882e+00 1.6448089238837236e+00 -7.6340977910564844e-01 -3.3322289312876450e+00 -1.3854442761560342e+00 -9.2370241951451404e-01 -1.3717374731965239e+00 -2.7797460319159746e+00 1.2647590733610417e+00 1.0374829948523121e+00 2.7684362795787005e+00 1.1085836301970218e+00 1.3295236270651538e+00 3.2786178660814813e+00 -9.7194422319182339e-01 -1.1428954930667632e+00 -3.7952350025112302e+00 -1.3168814376638855e+00 -1.4609951980733351e+00 -3.3481720741652112e+00 1.0896115326848919e+00 1.3587053568371832e+00 3.8359839997775520e+00 1.0966852264044724e+00 1.6448089238837236e+00 5.1628352926539174e+00 -1.3471113822772069e+00 -1.3948927383017518e+00 -5.1227203294992378e+00 1.2255979410532800e+00 7.4907777459475722e-01 1.2410915072368918e+00 -1.5692913241509503e+00 -5.8732207618441701e-01 -1.3717374731965246e+00 -2.2410830668416515e+00 -8.3004483010614882e-01 -1.3172225856596622e+00 1.9101303752040697e+00 5.0754001725211806e-01 1.2470720353095746e+00 2.2409450636485424e+00 8.0207516208421326e-01 1.3955990431295322e+00 -1.9789887338042167e+00 -6.0063841544882346e-01 -1.4662978155115587e+00 -3.2978965967542528e+00 -7.6340977910564856e-01 -1.3471113822772065e+00 3.7105863416451799e+00 7.2272214691395009e-01 1.6186066709689542e+00 5.5059086302494009e-01 1.2255979410532791e+00 1.0565363421906551e+00 -6.1246495339615170e-01 -1.0557893842037271e+00 -9.2370241951451326e-01 -7.1321103071055258e-01 -1.9381628718902832e+00 -1.0213161556098189e+00 5.3975965165365070e-01 1.7272192055017044e+00 1.0380814994864718e+00 8.1292242674408355e-01 1.9401878460907249e+00 1.2017289862441192e+00 -5.1947009386014120e-01 -1.7495425692978943e+00 -1.0894547905138114e+00 -7.8084901036977783e-01 -3.3322289312876450e+00 -1.3948927383017518e+00 7.2272214691394998e-01 3.1827187640338419e+00 1.1330192760186499e+00 1.0565363421906560e+00 1.2410915072368915e+00 2.7411452471654609e+00 -1.4029754357316613e+00 -9.0598248624865541e-01 -2.7797460319159746e+00 -1.3778230902927795e+00 -1.2399313070621019e+00 -3.2657252191059740e+00 1.2901730833235425e+00 1.0121265052918369e+00 3.7399498962810354e+00 1.4140824318375480e+00 1.2044086305000359e+00 3.3457139211529627e+00 -1.2285221286040551e+00 -1.0592878495806215e+00 -3.8647214387859488e+00 -1.3700778736922028e+00 -1.3854442761560342e+00 -5.1227203294992378e+00 1.6186066709689542e+00 1.1330192760186502e+00 5.2061039547076771e+00 483 484 485 501 502 503 504 505 506 489 490 491 486 487 488 894 895 896 507 508 509 492 493 494 2.7116629238612231e+00 7.3559020863296065e-01 7.9384770242871139e-01 -2.8376281223405804e+00 -8.5922752139240810e-01 -1.0257668137993357e+00 -1.6244789307642975e+00 -7.3066803944441072e-01 -7.1321335363801730e-01 1.4405410516189971e+00 5.6473048366004375e-01 7.3687966861058762e-01 1.6258017136459739e+00 8.6171735060259325e-01 8.6521279988108990e-01 -1.4602818567842266e+00 -5.7170020357832385e-01 -7.8729290565755816e-01 -8.5381247469693644e-01 -6.1236949697514464e-01 -6.3442238809901574e-01 9.9819569545984743e-01 6.1192721849469001e-01 7.6475529027353772e-01 7.3559020863296065e-01 3.8775605535694839e+00 1.6400488314823016e+00 -8.5279321746349146e-01 -3.4593507431252415e+00 -1.4730103801431418e+00 -8.6986793452340638e-01 -2.4960071802207393e+00 -1.2835018987917219e+00 5.2515043998180133e-01 2.1684263255764420e+00 1.3656074315809958e+00 8.5812069761671150e-01 2.5420520506091155e+00 1.3915745382145535e+00 -6.2483746853716426e-01 -2.2809085984561799e+00 -1.5872530778325666e+00 -5.7539929470830431e-01 -1.9045617861227238e+00 -1.3661065944426638e+00 8.0403656900089215e-01 1.5527893781698430e+00 1.3126411499322423e+00 7.9384770242871106e-01 1.6400488314823016e+00 4.1197880692283686e+00 -1.0279202428658556e+00 -1.4884601646456601e+00 -4.1084512690865775e+00 -8.9244166944702785e-01 -1.3574874547679645e+00 -2.4640434388766530e+00 7.0437397233398480e-01 1.4004564492279548e+00 2.9352452536108000e+00 8.8317210210095487e-01 1.4216032237645095e+00 2.5270035943544928e+00 -7.5209439553690394e-01 -1.3778144036138835e+00 -3.0333551497409039e+00 -6.1342591250766354e-01 -1.4056640908898226e+00 -2.0450974978411964e+00 9.0448844349379975e-01 1.1673176094425652e+00 2.0689104383516699e+00 -2.8376281223405804e+00 -8.5279321746349157e-01 -1.0279202428658556e+00 3.1894250304190441e+00 8.8195619302852535e-01 1.2726943853769259e+00 1.8841997419002057e+00 8.6028011440649088e-01 1.0144925497713966e+00 -1.6313633137876316e+00 -6.8086860417486672e-01 -1.1049065824945907e+00 -1.9646386699450260e+00 -1.0057063406682945e+00 -1.0437104590591209e+00 1.6540453014720871e+00 7.0234211863076856e-01 1.0413422362855891e+00 1.0109880598583678e+00 8.4809879333602922e-01 9.2681530782393484e-01 -1.3050280275764663e+00 -7.5330905709516160e-01 -1.0788071948382791e+00 -8.5922752139240799e-01 -3.4593507431252406e+00 -1.4884601646456599e+00 8.8195619302852513e-01 3.2348414566543364e+00 1.3061558626722500e+00 8.5898105876406505e-01 2.1589643940149226e+00 1.2235465340800553e+00 -5.3354533231037771e-01 -1.9382208310102882e+00 -1.2364867984279442e+00 -8.8696796209797313e-01 -2.2367925172920633e+00 -1.1449968811002267e+00 6.7463139333782174e-01 2.0086544874549510e+00 1.2731866024821241e+00 5.8312372097640008e-01 1.5724249671578743e+00 1.1466661934022331e+00 -7.1895155030605262e-01 -1.3405212138544917e+00 -1.0796113484628314e+00 -1.0257668137993354e+00 -1.4730103801431413e+00 -4.1084512690865775e+00 1.2726943853769259e+00 1.3061558626722503e+00 4.2131025301694596e+00 9.7871091988905989e-01 1.1790703311167647e+00 2.5292896623508909e+00 -8.3144824432955688e-01 -1.1657446247984931e+00 -3.0553166754894101e+00 -1.1229039143219424e+00 -1.4042306003085547e+00 -2.5850256307522215e+00 1.0339147402866671e+00 1.3118624347827332e+00 3.0724235846875332e+00 7.4012110081128246e-01 1.3419243839480848e+00 2.0923803219134394e+00 -1.0453221739130998e+00 -1.0960274072696441e+00 -2.1584025237931117e+00 -1.6244789307642977e+00 -8.6986793452340649e-01 -8.9244166944702785e-01 1.8841997419002057e+00 8.5898105876406505e-01 9.7871091988905989e-01 3.1462243273893833e+00 1.0274173866563554e+00 9.7558269525110664e-01 -2.8123988029217153e+00 -7.2064334469015590e-01 -9.2317603542040627e-01 -1.2989378072866342e+00 -9.4694261514135414e-01 -8.6846632638387622e-01 1.0097996042057582e+00 7.0382522164249584e-01 9.8838256488322562e-01 1.5947735928009719e+00 7.6732197933726032e-01 7.6402761665230778e-01 -1.8991817253236707e+00 -8.2009175204526052e-01 -1.0226197654243896e+00 -7.3066803944441072e-01 -2.4960071802207393e+00 -1.3574874547679645e+00 8.6028011440649088e-01 2.1589643940149226e+00 1.1790703311167645e+00 1.0274173866563554e+00 3.7863637191547128e+00 1.3284840586081881e+00 -7.4266693607432521e-01 -3.4373322116584322e+00 -1.3753212541788278e+00 -9.5145087444239707e-01 -1.8719596283064399e+00 -1.1708461677597644e+00 6.4783106782039501e-01 1.5699293664128664e+00 1.3872130394955327e+00 7.9187250351249405e-01 2.4827667914741083e+00 1.2915626550624915e+00 -9.0261522243460179e-01 -2.1927252508709993e+00 -1.2826752075764210e+00 -7.1321335363801730e-01 -1.2835018987917217e+00 -2.4640434388766530e+00 1.0144925497713966e+00 1.2235465340800551e+00 2.5292896623508914e+00 9.7558269525110664e-01 1.3284840586081890e+00 3.6613319354332607e+00 -1.0100814787934429e+00 -1.4640920714415040e+00 -4.0408375851816158e+00 -8.7920363132948010e-01 -1.1796954072372048e+00 -1.6715086131106478e+00 7.4730428847100538e-01 1.1311572701336710e+00 2.0260943259771920e+00 8.1702722217464985e-01 1.3336732789690009e+00 2.4736494427960016e+00 -9.5190829190721715e-01 -1.0895717643204854e+00 -2.5139757293884282e+00 1.4405410516189971e+00 5.2515043998180133e-01 7.0437397233398469e-01 -1.6313633137876316e+00 -5.3354533231037760e-01 -8.3144824432955688e-01 -2.8123988029217153e+00 -7.4266693607432510e-01 -1.0100814787934429e+00 2.7622989963548785e+00 5.1501280387958759e-01 8.3138200543052054e-01 9.6847998625033416e-01 6.1601943905557588e-01 7.0788662138559855e-01 -8.7009994651611478e-01 -4.5300552353819606e-01 -7.1015367280042530e-01 -1.4443095458346094e+00 -5.5469529578858157e-01 -6.5074730019867544e-01 1.5868515748358616e+00 6.2773040479451603e-01 9.5878809697199685e-01 5.6473048366004386e-01 2.1684263255764424e+00 1.4004564492279548e+00 -6.8086860417486683e-01 -1.9382208310102882e+00 -1.1657446247984928e+00 -7.2064334469015567e-01 -3.4373322116584322e+00 -1.4640920714415040e+00 5.1501280387958759e-01 3.3302155631798924e+00 1.4116917532641646e+00 6.9073510111484016e-01 1.5266672428583603e+00 1.0930670994039871e+00 -4.6722675278044057e-01 -1.3769364032520270e+00 -1.2181485935005820e+00 -4.8234459151434206e-01 -2.2278549445285418e+00 -1.2516926782479789e+00 5.8060490450533342e-01 1.9550352588345956e+00 1.1944626660924516e+00 7.3687966861058762e-01 1.3656074315809958e+00 2.9352452536107996e+00 -1.1049065824945907e+00 -1.2364867984279444e+00 -3.0553166754894101e+00 -9.2317603542040605e-01 -1.3753212541788276e+00 -4.0408375851816158e+00 8.3138200543052054e-01 1.4116917532641651e+00 4.7497285009557837e+00 1.0326654229709931e+00 1.4368549488819899e+00 2.0233106833186909e+00 -7.7706083718815089e-01 -1.2924706477687133e+00 -2.6158056093792235e+00 -7.0716874635508209e-01 -1.5323596576151326e+00 -2.9792945727300726e+00 9.1138510444612786e-01 1.2224842242634677e+00 2.9829700048950492e+00 1.6258017136459737e+00 8.5812069761671161e-01 8.8317210210095487e-01 -1.9646386699450258e+00 -8.8696796209797313e-01 -1.1229039143219426e+00 -1.2989378072866344e+00 -9.5145087444239707e-01 -8.7920363132948010e-01 9.6847998625033416e-01 6.9073510111484016e-01 1.0326654229709933e+00 3.2473576112409277e+00 1.1934615026911080e+00 1.1071360869068272e+00 -2.8483045234059405e+00 -8.7960191930832698e-01 -1.1179257939952891e+00 -1.6363603021962922e+00 -9.5034387975568091e-01 -9.5987701729896480e-01 1.9066019916966568e+00 9.2604733418171858e-01 1.0569367449669016e+00 8.6171735060259336e-01 2.5420520506091151e+00 1.4216032237645098e+00 -1.0057063406682942e+00 -2.2367925172920637e+00 -1.4042306003085547e+00 -9.4694261514135414e-01 -1.8719596283064397e+00 -1.1796954072372046e+00 6.1601943905557588e-01 1.5266672428583603e+00 1.4368549488819902e+00 1.1934615026911080e+00 3.9727930060669587e+00 1.4956464030406242e+00 -8.6941841157070232e-01 -3.5584755279548808e+00 -1.6093634244142465e+00 -7.5752591940879743e-01 -2.6131967353139425e+00 -1.4461669531499965e+00 9.0839499443987048e-01 2.2389121093328930e+00 1.2853518094228786e+00 8.6521279988108979e-01 1.3915745382145535e+00 2.5270035943544928e+00 -1.0437104590591209e+00 -1.1449968811002269e+00 -2.5850256307522210e+00 -8.6846632638387622e-01 -1.1708461677597646e+00 -1.6715086131106478e+00 7.0788662138559855e-01 1.0930670994039871e+00 2.0233106833186909e+00 1.1071360869068270e+00 1.4956464030406242e+00 3.7570035316107178e+00 -1.0802899321491288e+00 -1.5722249339587044e+00 -4.1039491258543368e+00 -7.2149820996611791e-01 -1.3706050830827796e+00 -2.5215027419923826e+00 1.0337294193847280e+00 1.2783850252423115e+00 2.5746683024256858e+00 -1.4602818567842266e+00 -6.2483746853716449e-01 -7.5209439553690394e-01 1.6540453014720871e+00 6.7463139333782163e-01 1.0339147402866671e+00 1.0097996042057582e+00 6.4783106782039512e-01 7.4730428847100527e-01 -8.7009994651611478e-01 -4.6722675278044062e-01 -7.7706083718815100e-01 -2.8483045234059405e+00 -8.6941841157070221e-01 -1.0802899321491291e+00 2.7042620845000775e+00 6.3544566489993770e-01 9.6620981391713268e-01 1.4684979505981766e+00 6.1655964377146788e-01 7.7309325472297696e-01 -1.6579186140698170e+00 -6.1298513694131540e-01 -9.1107693252359823e-01 -5.7170020357832385e-01 -2.2809085984561803e+00 -1.3778144036138837e+00 7.0234211863076845e-01 2.0086544874549510e+00 1.3118624347827330e+00 7.0382522164249584e-01 1.5699293664128664e+00 1.1311572701336710e+00 -4.5300552353819601e-01 -1.3769364032520270e+00 -1.2924706477687133e+00 -8.7960191930832698e-01 -3.5584755279548808e+00 -1.5722249339587044e+00 6.3544566489993770e-01 3.3575641697130703e+00 1.5882143038068510e+00 5.8455082678844972e-01 2.2967920385779670e+00 1.4803757004288025e+00 -7.2185618553680431e-01 -2.0166195324957670e+00 -1.2690997238107564e+00 -7.8729290565755816e-01 -1.5872530778325666e+00 -3.0333551497409039e+00 1.0413422362855891e+00 1.2731866024821241e+00 3.0724235846875332e+00 9.8838256488322562e-01 1.3872130394955324e+00 2.0260943259771920e+00 -7.1015367280042518e-01 -1.2181485935005820e+00 -2.6158056093792235e+00 -1.1179257939952891e+00 -1.6093634244142463e+00 -4.1039491258543368e+00 9.6620981391713290e-01 1.5882143038068512e+00 4.7493570688040796e+00 7.3268934239445460e-01 1.4760810079480049e+00 2.9973225420974905e+00 -1.1132515850271285e+00 -1.3099298579851189e+00 -3.0920876365918319e+00 -8.5381247469693644e-01 -5.7539929470830431e-01 -6.1342591250766354e-01 1.0109880598583678e+00 5.8312372097640008e-01 7.4012110081128246e-01 1.5947735928009719e+00 7.9187250351249405e-01 8.1702722217464974e-01 -1.4443095458346094e+00 -4.8234459151434206e-01 -7.0716874635508209e-01 -1.6363603021962925e+00 -7.5752591940879754e-01 -7.2149820996611791e-01 1.4684979505981766e+00 5.8455082678844961e-01 7.3268934239445460e-01 2.6940664426210450e+00 7.0078116171102300e-01 7.3732200234774559e-01 -2.8338437231507223e+00 -8.4505840735692339e-01 -9.8506679889926896e-01 -6.1236949697514464e-01 -1.9045617861227235e+00 -1.4056640908898224e+00 8.4809879333602900e-01 1.5724249671578743e+00 1.3419243839480850e+00 7.6732197933726032e-01 2.4827667914741083e+00 1.3336732789690009e+00 -5.5469529578858168e-01 -2.2278549445285418e+00 -1.5323596576151324e+00 -9.5034387975568091e-01 -2.6131967353139425e+00 -1.3706050830827796e+00 6.1655964377146788e-01 2.2967920385779665e+00 1.4760810079480047e+00 7.0078116171102312e-01 3.9351823922622162e+00 1.6379728142989312e+00 -8.1535290563637230e-01 -3.5415527235069586e+00 -1.4810226535762872e+00 -6.3442238809901574e-01 -1.3661065944426638e+00 -2.0450974978411964e+00 9.2681530782393495e-01 1.1466661934022333e+00 2.0923803219134394e+00 7.6402761665230789e-01 1.2915626550624915e+00 2.4736494427960016e+00 -6.5074730019867544e-01 -1.2516926782479789e+00 -2.9792945727300726e+00 -9.5987701729896480e-01 -1.4461669531499965e+00 -2.5215027419923826e+00 7.7309325472297696e-01 1.4803757004288025e+00 2.9973225420974905e+00 7.3732200234774536e-01 1.6379728142989314e+00 4.1003675196987661e+00 -9.5621147595030864e-01 -1.4926111373518198e+00 -4.1178250139420456e+00 9.9819569545984754e-01 8.0403656900089215e-01 9.0448844349379975e-01 -1.3050280275764667e+00 -7.1895155030605273e-01 -1.0453221739130998e+00 -1.8991817253236707e+00 -9.0261522243460157e-01 -9.5190829190721726e-01 1.5868515748358618e+00 5.8060490450533331e-01 9.1138510444612775e-01 1.9066019916966570e+00 9.0839499443987048e-01 1.0337294193847280e+00 -1.6579186140698172e+00 -7.2185618553680431e-01 -1.1132515850271285e+00 -2.8338437231507223e+00 -8.1535290563637230e-01 -9.5621147595030864e-01 3.2043228281283103e+00 8.6573939596773530e-01 1.2170905594730990e+00 6.1192721849469001e-01 1.5527893781698430e+00 1.1673176094425652e+00 -7.5330905709516160e-01 -1.3405212138544917e+00 -1.0960274072696441e+00 -8.2009175204526041e-01 -2.1927252508709998e+00 -1.0895717643204854e+00 6.2773040479451603e-01 1.9550352588345956e+00 1.2224842242634677e+00 9.2604733418171858e-01 2.2389121093328934e+00 1.2783850252423115e+00 -6.1298513694131551e-01 -2.0166195324957670e+00 -1.3099298579851189e+00 -8.4505840735692328e-01 -3.5415527235069586e+00 -1.4926111373518196e+00 8.6573939596773530e-01 3.3446819743908853e+00 1.3199533079787242e+00 7.6475529027353784e-01 1.3126411499322423e+00 2.0689104383516699e+00 -1.0788071948382791e+00 -1.0796113484628314e+00 -2.1584025237931117e+00 -1.0226197654243894e+00 -1.2826752075764207e+00 -2.5139757293884282e+00 9.5878809697199685e-01 1.1944626660924513e+00 2.9829700048950487e+00 1.0569367449669016e+00 1.2853518094228784e+00 2.5746683024256858e+00 -9.1107693252359812e-01 -1.2690997238107564e+00 -3.0920876365918319e+00 -9.8506679889926918e-01 -1.4810226535762869e+00 -4.1178250139420465e+00 1.2170905594730987e+00 1.3199533079787242e+00 4.2557421580430130e+00 777 778 779 819 820 821 831 832 833 789 790 791 780 781 782 822 823 824 834 835 836 792 793 794 3.5262733577375838e+00 1.8257638291430459e-01 1.0397399695890295e+00 -3.5896833208183447e+00 -1.6694211205168474e-01 -1.3760633719477970e+00 -1.9793770883611279e+00 -2.0440293236475263e-01 -1.0597327060471173e+00 1.8207031958453768e+00 9.5389167994155769e-02 9.2597232926327766e-01 1.9291367821295413e+00 2.2337506395938178e-01 1.2296256549738978e+00 -1.8003705797444562e+00 -5.8220639829664057e-02 -9.1563836618873418e-01 -1.0077775704489507e+00 -1.5888473978152079e-01 -8.5415720308578769e-01 1.1010952236603784e+00 8.7109809159779727e-02 1.0102536934432309e+00 1.8257638291430461e-01 3.4377810039259540e+00 8.1933421300812104e-01 -1.5513522577428357e-01 -3.2181500004271792e+00 -4.2456890902958844e-01 -2.5172785037614565e-01 -1.7778650208552842e+00 -7.4078020741111972e-01 8.5706857015536278e-02 1.6221222612448289e+00 3.9056130174808856e-01 2.1976953886224365e-01 1.7228240524293739e+00 7.2828853511780389e-01 -1.2223210849370525e-01 -1.6222816955813664e+00 -5.6847271349460182e-01 -1.5789543087550370e-01 -9.5460886964894398e-01 -7.2003253472807460e-01 1.9893783672755372e-01 7.9017826891261678e-01 5.1567031478937098e-01 1.0397399695890295e+00 8.1933421300812115e-01 7.9180471240072459e+00 -1.3530837967662852e+00 -4.5606220398532032e-01 -7.6894815848044384e+00 -1.3444145971850920e+00 -7.5875243918890611e-01 -5.5664182775452034e+00 9.2466711240525723e-01 4.3256067084948013e-01 5.7944807256450179e+00 1.2116845696584035e+00 7.2757871310225086e-01 5.5730428603901494e+00 -9.1230463222468683e-01 -2.7451437489432107e-01 -5.8614112444446036e+00 -8.5640523218444420e-01 -7.2637420580516443e-01 -4.7480234499781382e+00 1.2901166067078185e+00 2.3622962691385840e-01 4.5797638467299677e+00 -3.5896833208183443e+00 -1.5513522577428357e-01 -1.3530837967662854e+00 3.8816486039503015e+00 3.0271515468226061e-02 1.6676126573889603e+00 2.2001781799169131e+00 1.4482727641307125e-01 1.4811182835345462e+00 -1.9821714404145652e+00 -1.4590569453891360e-02 -1.3776401228981188e+00 -2.2074166089939329e+00 -2.1057476608392961e-01 -1.5226101505904324e+00 1.9468227379206611e+00 2.4372505170662775e-02 1.2445912081099768e+00 1.1296586537743014e+00 2.0202972145156850e-01 1.3023936291186378e+00 -1.3790368053353352e+00 -2.1200457191423404e-02 -1.4423817078972845e+00 -1.6694211205168474e-01 -3.2181500004271792e+00 -4.5606220398532038e-01 3.0271515468226057e-02 3.2436298700121307e+00 8.2782463767725828e-02 1.5532719972144449e-01 1.6336163768316361e+00 4.0506304567832385e-01 -9.5141875546127363e-03 -1.6348832862475222e+00 -3.9684331437987427e-02 -9.8892267213552904e-02 -1.6204877215610007e+00 -2.4852340377365018e-01 2.2249407550521062e-02 1.6034686279070467e+00 7.1259048703743069e-02 8.5338277333035631e-02 8.1399372309270945e-01 2.2899479575780923e-01 -1.7837833253376838e-02 -8.2118758960782046e-01 -4.3829414710644020e-02 -1.3760633719477968e+00 -4.2456890902958844e-01 -7.6894815848044384e+00 1.6676126573889603e+00 8.2782463767725883e-02 7.5880032017076848e+00 1.4742305194719449e+00 3.7393871894481379e-01 5.4457153196950925e+00 -1.0807957742701415e+00 -3.9522984096163442e-02 -5.7025352300855436e+00 -1.5256872129629495e+00 -5.3700704589457005e-01 -5.4594754405522474e+00 1.2534954254443340e+00 7.8864180361395225e-02 5.7124936540302187e+00 1.0132966511920145e+00 5.1737723137061564e-01 4.6104663987818881e+00 -1.4260888943163661e+00 -5.1863655424227023e-02 -4.5051863187726529e+00 -1.9793770883611279e+00 -2.5172785037614565e-01 -1.3444145971850920e+00 2.2001781799169131e+00 1.5532719972144451e-01 1.4742305194719449e+00 3.9567175946701014e+00 3.0247382463301353e-01 1.6322111811600921e+00 -3.6707010783517928e+00 -1.1402142937765805e-01 -1.3449603532038532e+00 -1.3769049339217747e+00 -2.6877541970158919e-01 -1.4085631098172438e+00 1.1288925745946332e+00 5.8688026449647532e-02 1.3079496581188839e+00 1.9867207270226181e+00 2.1983056909693532e-01 1.2066186825412784e+00 -2.2455259755695711e+00 -1.0179492044564757e-01 -1.5230719810860096e+00 -2.0440293236475263e-01 -1.7778650208552840e+00 -7.5875243918890622e-01 1.4482727641307125e-01 1.6336163768316359e+00 3.7393871894481390e-01 3.0247382463301353e-01 3.4693074355675440e+00 7.7768982572522749e-01 -1.0573240465635170e-01 -3.3019321811560829e+00 -4.3705987729753565e-01 -2.7009066427144385e-01 -9.5319906320504111e-01 -6.8763144590079683e-01 1.1794026878774380e-01 8.1536548752302840e-01 5.3994446909986493e-01 2.2387821073159248e-01 1.7807488841586641e+00 7.2803120774482155e-01 -2.0889357927287297e-01 -1.6660419188644640e+00 -5.3616045912748889e-01 -1.0597327060471173e+00 -7.4078020741111972e-01 -5.5664182775452034e+00 1.4811182835345464e+00 4.0506304567832391e-01 5.4457153196950925e+00 1.6322111811600923e+00 7.7768982572522749e-01 7.5472561664450444e+00 -1.3876698430489771e+00 -4.7859634898387987e-01 -7.7779957386943712e+00 -1.4038780143564855e+00 -6.8201212543134970e-01 -4.3831962131983948e+00 1.0139684652261525e+00 2.4738557082512858e-01 4.6060994791828236e+00 1.2334219049140984e+00 7.2940985193138785e-01 5.6284883615113381e+00 -1.5094392713823106e+00 -2.5815961233371687e-01 -5.4999490973963283e+00 1.8207031958453765e+00 8.5706857015536278e-02 9.2466711240525712e-01 -1.9821714404145654e+00 -9.5141875546127502e-03 -1.0807957742701417e+00 -3.6707010783517928e+00 -1.0573240465635167e-01 -1.3876698430489771e+00 3.6124499901729235e+00 2.2508944253861164e-02 1.0588812456048342e+00 1.1014434958063621e+00 1.1624140229009143e-01 1.0071346600682560e+00 -1.0094561586279147e+00 -1.1786334471327020e-02 -8.7035293082003584e-01 -1.8447453209856473e+00 -1.2170637912851301e-01 -9.0798652583094164e-01 1.9724773165552578e+00 2.4282102251315260e-02 1.2561220558917485e+00 9.5389167994155755e-02 1.6221222612448289e+00 4.3256067084948013e-01 -1.4590569453891363e-02 -1.6348832862475222e+00 -3.9522984096163435e-02 -1.1402142937765800e-01 -3.3019321811560838e+00 -4.7859634898387976e-01 2.2508944253861161e-02 3.3797253867388917e+00 9.4006368551548508e-02 5.6091755487313218e-02 7.8872857355656600e-01 2.3947157269865590e-01 -1.0288225645117909e-02 -8.2194524707447669e-01 -5.1745812394903251e-02 -5.6487473106524466e-02 -1.6669242746218040e+00 -2.6907438470937761e-01 2.1397829847861628e-02 1.6351087675596006e+00 7.2900918084639513e-02 9.2597232926327766e-01 3.9056130174808862e-01 5.7944807256450179e+00 -1.3776401228981188e+00 -3.9684331437987427e-02 -5.7025352300855436e+00 -1.3449603532038530e+00 -4.3705987729753565e-01 -7.7779957386943703e+00 1.0588812456048342e+00 9.4006368551548508e-02 8.1516828083801656e+00 1.3077579635841599e+00 5.3884939848610303e-01 4.5756454828809234e+00 -8.7676249492601155e-01 -5.9094020258011269e-02 -4.8765311257486728e+00 -9.1280883294851944e-01 -5.6834873644021888e-01 -5.9039003940348671e+00 1.2195602655242315e+00 8.0769896648011624e-02 5.7391534716573469e+00 1.9291367821295413e+00 2.1976953886224360e-01 1.2116845696584038e+00 -2.2074166089939329e+00 -9.8892267213552931e-02 -1.5256872129629493e+00 -1.3769049339217747e+00 -2.7009066427144385e-01 -1.4038780143564855e+00 1.1014434958063621e+00 5.6091755487313218e-02 1.3077579635841599e+00 3.9074799929619783e+00 3.0993673145733658e-01 1.6729351833081874e+00 -3.5655613645775723e+00 -1.1447631493987587e-01 -1.3958278739541470e+00 -1.9751487808926667e+00 -2.6006892108128160e-01 -1.3803952833991475e+00 2.1869714174880643e+00 1.5773014169926022e-01 1.5134106681219777e+00 2.2337506395938178e-01 1.7228240524293739e+00 7.2757871310225086e-01 -2.1057476608392961e-01 -1.6204877215610007e+00 -5.3700704589457005e-01 -2.6877541970158919e-01 -9.5319906320504111e-01 -6.8201212543134970e-01 1.1624140229009143e-01 7.8872857355656589e-01 5.3884939848610292e-01 3.0993673145733658e-01 3.4067338716047901e+00 7.9618194480883153e-01 -1.1352180998014544e-01 -3.1881035952219925e+00 -4.6894898032385279e-01 -2.0795662636631801e-01 -1.7680255531884641e+00 -7.7197547857939197e-01 1.5127542442517247e-01 1.6115294355857681e+00 3.9733357383197898e-01 1.2296256549738978e+00 7.2828853511780389e-01 5.5730428603901494e+00 -1.5226101505904324e+00 -2.4852340377365018e-01 -5.4594754405522474e+00 -1.4085631098172438e+00 -6.8763144590079683e-01 -4.3831962131983948e+00 1.0071346600682560e+00 2.3947157269865588e-01 4.5756454828809234e+00 1.6729351833081876e+00 7.9618194480883153e-01 7.5813251767758869e+00 -1.3991308308135031e+00 -4.7318736668451339e-01 -7.7506687873163393e+00 -1.0874566468904567e+00 -7.6479509540799662e-01 -5.6546925984844112e+00 1.5080652397612946e+00 4.1019525914166421e-01 5.5180195195044313e+00 -1.8003705797444562e+00 -1.2223210849370522e-01 -9.1230463222468672e-01 1.9468227379206615e+00 2.2249407550521055e-02 1.2534954254443342e+00 1.1288925745946332e+00 1.1794026878774383e-01 1.0139684652261525e+00 -1.0094561586279147e+00 -1.0288225645117903e-02 -8.7676249492601144e-01 -3.5655613645775723e+00 -1.1352180998014541e-01 -1.3991308308135029e+00 3.4480870075231089e+00 2.4554674835244324e-02 1.0809505113708029e+00 1.8269942608209249e+00 9.4279053983948688e-02 9.5252319062009783e-01 -1.9754084779093855e+00 -1.2981261038488980e-02 -1.1127396346971854e+00 -5.8220639829664057e-02 -1.6222816955813664e+00 -2.7451437489432107e-01 2.4372505170662778e-02 1.6034686279070467e+00 7.8864180361395225e-02 5.8688026449647532e-02 8.1536548752302840e-01 2.4738557082512858e-01 -1.1786334471327020e-02 -8.2194524707447669e-01 -5.9094020258011262e-02 -1.1447631493987588e-01 -3.1881035952219920e+00 -4.7318736668451339e-01 2.4554674835244334e-02 3.2094456855767630e+00 1.0281097407888183e-01 9.4686894550870121e-02 1.6244321592576658e+00 4.2980122421427402e-01 -1.7818811765557829e-02 -1.6203814223866682e+00 -5.2066187642833911e-02 -9.1563836618873418e-01 -5.6847271349460193e-01 -5.8614112444446036e+00 1.2445912081099768e+00 7.1259048703743097e-02 5.7124936540302169e+00 1.3079496581188839e+00 5.3994446909986493e-01 4.6060994791828236e+00 -8.7035293082003584e-01 -5.1745812394903223e-02 -4.8765311257486728e+00 -1.3958278739541468e+00 -4.6894898032385279e-01 -7.7506687873163411e+00 1.0809505113708029e+00 1.0281097407888183e-01 8.0573680110652859e+00 9.5035449005912587e-01 4.2537259239389336e-01 5.9044647101761782e+00 -1.4020266966958730e+00 -5.0219578063023865e-02 -5.7918146969448880e+00 -1.0077775704489509e+00 -1.5789543087550370e-01 -8.5640523218444420e-01 1.1296586537743014e+00 8.5338277333035631e-02 1.0132966511920145e+00 1.9867207270226181e+00 2.2387821073159250e-01 1.2334219049140986e+00 -1.8447453209856473e+00 -5.6487473106524466e-02 -9.1280883294851933e-01 -1.9751487808926664e+00 -2.0795662636631798e-01 -1.0874566468904567e+00 1.8269942608209249e+00 9.4686894550870121e-02 9.5035449005912598e-01 3.5433531292128961e+00 1.8701037687156696e-01 1.0609660171607957e+00 -3.6590550985034760e+00 -1.6857422913871864e-01 -1.4013683513026145e+00 -1.5888473978152079e-01 -9.5460886964894387e-01 -7.2637420580516443e-01 2.0202972145156850e-01 8.1399372309270945e-01 5.1737723137061564e-01 2.1983056909693535e-01 1.7807488841586641e+00 7.2940985193138785e-01 -1.2170637912851304e-01 -1.6669242746218038e+00 -5.6834873644021888e-01 -2.6006892108128160e-01 -1.7680255531884641e+00 -7.6479509540799662e-01 9.4279053983948674e-02 1.6244321592576658e+00 4.2537259239389336e-01 1.8701037687156696e-01 3.4542209178049808e+00 8.3901538055469560e-01 -1.6248968141270415e-01 -3.2838369868548076e+00 -4.5165701859721230e-01 -8.5415720308578769e-01 -7.2003253472807460e-01 -4.7480234499781382e+00 1.3023936291186378e+00 2.2899479575780918e-01 4.6104663987818881e+00 1.2066186825412781e+00 7.2803120774482155e-01 5.6284883615113372e+00 -9.0798652583094175e-01 -2.6907438470937761e-01 -5.9039003940348671e+00 -1.3803952833991473e+00 -7.7197547857939197e-01 -5.6546925984844112e+00 9.5252319062009783e-01 4.2980122421427402e-01 5.9044647101761782e+00 1.0609660171607957e+00 8.3901538055469560e-01 8.0251774404171350e+00 -1.3799625071249328e+00 -4.6476021025475467e-01 -7.8619804683891203e+00 1.1010952236603784e+00 1.9893783672755372e-01 1.2901166067078185e+00 -1.3790368053353352e+00 -1.7837833253376838e-02 -1.4260888943163663e+00 -2.2455259755695711e+00 -2.0889357927287300e-01 -1.5094392713823106e+00 1.9724773165552578e+00 2.1397829847861632e-02 1.2195602655242315e+00 2.1869714174880643e+00 1.5127542442517247e-01 1.5080652397612946e+00 -1.9754084779093852e+00 -1.7818811765557829e-02 -1.4020266966958730e+00 -3.6590550985034760e+00 -1.6248968141270415e-01 -1.3799625071249326e+00 3.9984823996140664e+00 3.5428814703923436e-02 1.6997752575261371e+00 8.7109809159779727e-02 7.9017826891261678e-01 2.3622962691385846e-01 -2.1200457191423404e-02 -8.2118758960782035e-01 -5.1863655424227016e-02 -1.0179492044564757e-01 -1.6660419188644640e+00 -2.5815961233371687e-01 2.4282102251315260e-02 1.6351087675596006e+00 8.0769896648011597e-02 1.5773014169926022e-01 1.6115294355857681e+00 4.1019525914166421e-01 -1.2981261038488972e-02 -1.6203814223866682e+00 -5.0219578063023837e-02 -1.6857422913871867e-01 -3.2838369868548081e+00 -4.6476021025475456e-01 3.5428814703923402e-02 3.3546314456557744e+00 9.7808273372188045e-02 1.0102536934432309e+00 5.1567031478937098e-01 4.5797638467299677e+00 -1.4423817078972845e+00 -4.3829414710644013e-02 -4.5051863187726529e+00 -1.5230719810860096e+00 -5.3616045912748889e-01 -5.4999490973963283e+00 1.2561220558917485e+00 7.2900918084639499e-02 5.7391534716573469e+00 1.5134106681219777e+00 3.9733357383197893e-01 5.5180195195044321e+00 -1.1127396346971854e+00 -5.2066187642833876e-02 -5.7918146969448889e+00 -1.4013683513026145e+00 -4.5165701859721230e-01 -7.8619804683891203e+00 1.6997752575261369e+00 9.7808273372188045e-02 7.8219937436112392e+00 819 820 821 861 862 863 873 874 875 831 832 833 822 823 824 864 865 866 876 877 878 834 835 836 3.3702596553245066e+00 1.7447728672716584e-01 9.6209096294790442e-01 -3.4249481876342034e+00 -1.6284087669943981e-01 -1.3083620735159807e+00 -1.8515150920601038e+00 -1.9775291702643230e-01 -9.8859504568650969e-01 1.6922632044475676e+00 8.7480758586319873e-02 8.5342103862674479e-01 1.8507894585995863e+00 2.1937883443897530e-01 1.1690437914114984e+00 -1.7268885778866743e+00 -5.2295266303963278e-02 -8.4611809921541048e-01 -9.4096217266448856e-01 -1.5105058671154264e-01 -7.8576842810644232e-01 1.0310017118738084e+00 8.2602766988916748e-02 9.4428785353819600e-01 1.7447728672716586e-01 3.3063795951051058e+00 8.0272790652059789e-01 -1.4946421693260026e-01 -3.0725285933379074e+00 -3.9955729184684607e-01 -2.4911154973099672e-01 -1.6740572055697980e+00 -7.2525009719987410e-01 7.8244809784621477e-02 1.5099268132493677e+00 3.6949860414896801e-01 2.1391284885988901e-01 1.6689620639350424e+00 7.1244529908644783e-01 -1.1467999212192351e-01 -1.5647790704902760e+00 -5.4967303508198473e-01 -1.4996635268186850e-01 -9.1012341879554870e-01 -7.0652447082895375e-01 1.9658716609571267e-01 7.3621981590401342e-01 4.9633308520164532e-01 9.6209096294790430e-01 8.0272790652059767e-01 7.5401837441543096e+00 -1.2738593114469821e+00 -4.3238553273649361e-01 -7.3036266577886941e+00 -1.2785747446432292e+00 -7.3942549692135706e-01 -5.2212971741355574e+00 8.4699961699698378e-01 4.0853145088825976e-01 5.4578494016288346e+00 1.1375184221084964e+00 7.0941354984621541e-01 5.2912753882609715e+00 -8.4075051275497592e-01 -2.5258378362613210e-01 -5.5902878786414085e+00 -7.8217553436469600e-01 -7.0843187234571037e-01 -4.4834821949656867e+00 1.2287511011564984e+00 2.1215377837461857e-01 4.3093853714872346e+00 -3.4249481876342034e+00 -1.4946421693260023e-01 -1.2738593114469818e+00 3.7284050090019174e+00 1.8767072208751130e-02 1.5966301768156430e+00 2.0771927480494092e+00 1.3868397457451109e-01 1.4108105970621980e+00 -1.8531234293128251e+00 -5.7613144308401674e-03 -1.3091295850729290e+00 -2.1357184011260566e+00 -2.0529686700315522e-01 -1.4562670465552496e+00 1.8692413181203038e+00 1.6227839630642331e-02 1.1727517777800602e+00 1.0569870670084498e+00 1.9868666343162056e-01 1.2365832585404826e+00 -1.3180361241069949e+00 -1.1843151478928910e-02 -1.3775198671232236e+00 -1.6284087669943981e-01 -3.0725285933379074e+00 -4.3238553273649361e-01 1.8767072208751141e-02 3.1077577960979283e+00 5.2514033456150924e-02 1.4848308665277235e-01 1.5213939310476083e+00 3.8089828553553617e-01 -7.4097733725409117e-04 -1.5297575856618235e+00 -7.6343165277142173e-03 -9.1102589197166753e-02 -1.5601989788395410e+00 -2.2525450230054450e-01 1.4044624389464066e-02 1.5474870040519833e+00 4.3015717910527336e-02 8.0394217433744863e-02 7.6003703518698051e-01 2.0414053140802671e-01 -7.0045574508717529e-03 -7.7419060854522814e-01 -1.5294216745488943e-02 -1.3083620735159807e+00 -3.9955729184684607e-01 -7.3036266577886950e+00 1.5966301768156430e+00 5.2514033456150938e-02 7.2062330377585457e+00 1.4095108105192677e+00 3.5345910247645773e-01 5.0995320059785572e+00 -1.0068755610289981e+00 -1.3135347451987023e-02 -5.3675511287084889e+00 -1.4616205052595928e+00 -5.1491220510222258e-01 -5.1767141973268078e+00 1.1944584887629683e+00 5.1920855743038515e-02 5.4370068861847383e+00 9.4326235476969100e-01 4.9706140957181821e-01 4.3423730338176618e+00 -1.3670036910629988e+00 -2.7350556846408289e-02 -4.2372529799155112e+00 -1.8515150920601038e+00 -2.4911154973099667e-01 -1.2785747446432292e+00 2.0771927480494097e+00 1.4848308665277235e-01 1.4095108105192677e+00 3.6559927809408488e+00 2.9918186997697194e-01 1.5492274693968540e+00 -3.3560677417141602e+00 -1.0235061532880485e-01 -1.2666389599924839e+00 -1.3147084824905773e+00 -2.6719906205475757e-01 -1.3468359311104645e+00 1.0592062968531946e+00 4.9561808444032747e-02 1.2478360239077737e+00 1.8257895350795188e+00 2.1472674443361683e-01 1.1395559939931004e+00 -2.0958900446581312e+00 -9.3292282392834186e-02 -1.4540806620708184e+00 -1.9775291702643230e-01 -1.6740572055697980e+00 -7.3942549692135695e-01 1.3868397457451112e-01 1.5213939310476086e+00 3.5345910247645773e-01 2.9918186997697194e-01 3.1893299852155650e+00 7.5325953348680408e-01 -9.5208966375434190e-02 -3.0102783507545245e+00 -4.1440900776521483e-01 -2.6740243612234799e-01 -9.0763698910373347e-01 -6.6929667803951853e-01 1.1000088059505522e-01 7.6175816173100830e-01 5.2311138471860008e-01 2.1732380420085734e-01 1.6464663683351271e+00 7.0942378049363142e-01 -2.0482620982318109e-01 -1.5269759009012533e+00 -5.1612261844940288e-01 -9.8859504568650980e-01 -7.2525009719987410e-01 -5.2212971741355574e+00 1.4108105970621980e+00 3.8089828553553623e-01 5.0995320059785563e+00 1.5492274693968544e+00 7.5325953348680408e-01 6.9691772522928987e+00 -1.2954009397235797e+00 -4.4756997993068637e-01 -7.2030699427003837e+00 -1.3372661453875903e+00 -6.6407320507478906e-01 -4.1085876196170714e+00 9.4847862837272989e-01 2.2542214622784509e-01 4.3352088625444392e+00 1.1533466151200664e+00 7.0857300961033953e-01 5.2432851423166369e+00 -1.4406011791541686e+00 -2.3125969265517390e-01 -5.1142485266795195e+00 1.6922632044475676e+00 7.8244809784621464e-02 8.4699961699698378e-01 -1.8531234293128251e+00 -7.4097733725408423e-04 -1.0068755610289981e+00 -3.3560677417141602e+00 -9.5208966375434162e-02 -1.2954009397235795e+00 3.3069032710291570e+00 1.4498157347701773e-02 9.6615296060559752e-01 1.0285552419002040e+00 1.0696958860094403e-01 9.3736261229368778e-01 -9.4360531976451323e-01 -5.4320163944421695e-03 -7.9801203799635212e-01 -1.6882856028376434e+00 -1.1370908435182267e-01 -8.2799535521924617e-01 1.8133603762522124e+00 1.5378488725685504e-02 1.1777687040719067e+00 8.7480758586319873e-02 1.5099268132493677e+00 4.0853145088825971e-01 -5.7613144308401639e-03 -1.5297575856618235e+00 -1.3135347451987021e-02 -1.0235061532880489e-01 -3.0102783507545245e+00 -4.4756997993068631e-01 1.4498157347701776e-02 3.1002161061785483e+00 5.9527776814206158e-02 4.6109234756483951e-02 7.3450998543962631e-01 2.1587420745258457e-01 -4.3145464320768576e-03 -7.7588087007409345e-01 -2.5159995821963380e-02 -4.8348606016420569e-02 -1.5289846416608925e+00 -2.4109890098338049e-01 1.2686931517636862e-02 1.5002485432837915e+00 4.3030789032966636e-02 8.5342103862674479e-01 3.6949860414896796e-01 5.4578494016288337e+00 -1.3091295850729290e+00 -7.6343165277142095e-03 -5.3675511287084889e+00 -1.2666389599924839e+00 -4.1440900776521483e-01 -7.2030699427003837e+00 9.6615296060559752e-01 5.9527776814206172e-02 7.5943208245137654e+00 1.2427082217416903e+00 5.1981285770203867e-01 4.3069921232487385e+00 -8.0838105794653148e-01 -3.0928063058844543e-02 -4.6196131608800144e+00 -8.3167663507252654e-01 -5.4816564541851798e-01 -5.5312173141903616e+00 1.1535440171104381e+00 5.2297794105077101e-02 5.3622891970879101e+00 1.8507894585995863e+00 2.1391284885988904e-01 1.1375184221084964e+00 -2.1357184011260566e+00 -9.1102589197166739e-02 -1.4616205052595928e+00 -1.3147084824905773e+00 -2.6740243612234799e-01 -1.3372661453875903e+00 1.0285552419002040e+00 4.6109234756483958e-02 1.2427082217416903e+00 3.8123802636587025e+00 3.0741080518126412e-01 1.6032944571767109e+00 -3.4603998938521392e+00 -1.0619515717129230e-01 -1.3187994162589469e+00 -1.8667927815100938e+00 -2.5465600641631603e-01 -1.3093036997520122e+00 2.0858945948203735e+00 1.5192330010948546e-01 1.4434686656312448e+00 2.1937883443897530e-01 1.6689620639350422e+00 7.0941354984621541e-01 -2.0529686700315522e-01 -1.5601989788395410e+00 -5.1491220510222246e-01 -2.6719906205475752e-01 -9.0763698910373347e-01 -6.6407320507478906e-01 1.0696958860094403e-01 7.3450998543962642e-01 5.1981285770203878e-01 3.0741080518126412e-01 3.3306309621905119e+00 7.7704037529896985e-01 -1.0383745270584353e-01 -3.1013214975049572e+00 -4.4217008156964527e-01 -2.0166134655356840e-01 -1.6861308683518321e+00 -7.5667991393047251e-01 1.4423550009614125e-01 1.5211853222348821e+00 3.7156862282990522e-01 1.1690437914114984e+00 7.1244529908644783e-01 5.2912753882609715e+00 -1.4562670465552496e+00 -2.2525450230054445e-01 -5.1767141973268078e+00 -1.3468359311104645e+00 -6.6929667803951853e-01 -4.1085876196170714e+00 9.3736261229368778e-01 2.1587420745258457e-01 4.3069921232487394e+00 1.6032944571767112e+00 7.7704037529896985e-01 7.2618559638982942e+00 -1.3370406404296715e+00 -4.5600238570271512e-01 -7.4343467167127759e+00 -1.0128586460090441e+00 -7.4330782941299434e-01 -5.3347583026952110e+00 1.4433014032225329e+00 3.8850151361776858e-01 5.1942833609438583e+00 -1.7268885778866743e+00 -1.1467999212192349e-01 -8.4075051275497603e-01 1.8692413181203036e+00 1.4044624389464069e-02 1.1944584887629681e+00 1.0592062968531943e+00 1.1000088059505524e-01 9.4847862837272989e-01 -9.4360531976451323e-01 -4.3145464320768559e-03 -8.0838105794653137e-01 -3.4603998938521392e+00 -1.0383745270584355e-01 -1.3370406404296711e+00 3.3522784266256100e+00 1.7898575701446554e-02 1.0074000537788632e+00 1.7221445569254801e+00 8.7119168190829280e-02 8.7963385385419290e-01 -1.8719768070212610e+00 -6.2312576169509084e-03 -1.0437988136375755e+00 -5.2295266303963278e-02 -1.5647790704902760e+00 -2.5258378362613210e-01 1.6227839630642331e-02 1.5474870040519830e+00 5.1920855743038542e-02 4.9561808444032747e-02 7.6175816173100830e-01 2.2542214622784509e-01 -5.4320163944421608e-03 -7.7588087007409345e-01 -3.0928063058844553e-02 -1.0619515717129231e-01 -3.1013214975049572e+00 -4.5600238570271523e-01 1.7898575701446560e-02 3.1342143272125553e+00 7.3375300064388499e-02 8.7840938973725941e-02 1.5363421057136573e+00 4.0977098783751986e-01 -7.6067228801498165e-03 -1.5378201606398778e+00 -2.0975057485100149e-02 -8.4611809921541048e-01 -5.4967303508198462e-01 -5.5902878786414076e+00 1.1727517777800602e+00 4.3015717910527322e-02 5.4370068861847383e+00 1.2478360239077735e+00 5.2311138471860008e-01 4.3352088625444392e+00 -7.9801203799635201e-01 -2.5159995821963398e-02 -4.6196131608800135e+00 -1.3187994162589469e+00 -4.4217008156964516e-01 -7.4343467167127750e+00 1.0074000537788632e+00 7.3375300064388430e-02 7.7577346486378245e+00 8.7269732114972665e-01 4.0182299253009046e-01 5.5925428789676213e+00 -1.3377556231457142e+00 -2.4322282750011519e-02 -5.4782455201004234e+00 -9.4096217266448878e-01 -1.4996635268186850e-01 -7.8217553436469589e-01 1.0569870670084498e+00 8.0394217433744863e-02 9.4326235476969089e-01 1.8257895350795186e+00 2.1732380420085737e-01 1.1533466151200664e+00 -1.6882856028376436e+00 -4.8348606016420562e-02 -8.3167663507252654e-01 -1.8667927815100938e+00 -2.0166134655356843e-01 -1.0128586460090443e+00 1.7221445569254799e+00 8.7840938973725913e-02 8.7269732114972687e-01 3.2678837111584587e+00 1.7640415730227998e-01 9.6797294514479615e-01 -3.3767643131596818e+00 -1.6198681265875028e-01 -1.3105684207380137e+00 -1.5105058671154267e-01 -9.1012341879554870e-01 -7.0843187234571037e-01 1.9868666343162056e-01 7.6003703518698051e-01 4.9706140957181821e-01 2.1472674443361689e-01 1.6464663683351271e+00 7.0857300961033953e-01 -1.1370908435182270e-01 -1.5289846416608925e+00 -5.4816564541851798e-01 -2.5465600641631603e-01 -1.6861308683518321e+00 -7.4330782941299423e-01 8.7119168190829280e-02 1.5363421057136573e+00 4.0182299253009052e-01 1.7640415730227998e-01 3.2069141661402609e+00 8.1630745966253648e-01 -1.5752105587866527e-01 -3.0245207465677519e+00 -4.2385952419756207e-01 -7.8576842810644232e-01 -7.0652447082895375e-01 -4.4834821949656867e+00 1.2365832585404823e+00 2.0414053140802671e-01 4.3423730338176618e+00 1.1395559939931004e+00 7.0942378049363142e-01 5.2432851423166378e+00 -8.2799535521924628e-01 -2.4109890098338049e-01 -5.5312173141903607e+00 -1.3093036997520122e+00 -7.5667991393047251e-01 -5.3347583026952110e+00 8.7963385385419313e-01 4.0977098783751986e-01 5.5925428789676213e+00 9.6797294514479615e-01 8.1630745966253637e-01 7.4946832851567713e+00 -1.3006785684548712e+00 -4.3533947365890613e-01 -7.3234265284074329e+00 1.0310017118738086e+00 1.9658716609571267e-01 1.2287511011564982e+00 -1.3180361241069951e+00 -7.0045574508717477e-03 -1.3670036910629988e+00 -2.0958900446581321e+00 -2.0482620982318112e-01 -1.4406011791541689e+00 1.8133603762522126e+00 1.2686931517636861e-02 1.1535440171104381e+00 2.0858945948203735e+00 1.4423550009614125e-01 1.4433014032225329e+00 -1.8719768070212610e+00 -7.6067228801498191e-03 -1.3377556231457144e+00 -3.3767643131596818e+00 -1.5752105587866527e-01 -1.3006785684548716e+00 3.7324106059996747e+00 2.3448948323376573e-02 1.6204425403282838e+00 8.2602766988916748e-02 7.3621981590401353e-01 2.1215377837461857e-01 -1.1843151478928915e-02 -7.7419060854522814e-01 -2.7350556846408292e-02 -9.3292282392834186e-02 -1.5269759009012531e+00 -2.3125969265517388e-01 1.5378488725685504e-02 1.5002485432837915e+00 5.2297794105077115e-02 1.5192330010948546e-01 1.5211853222348821e+00 3.8850151361776858e-01 -6.2312576169509084e-03 -1.5378201606398778e+00 -2.4322282750011519e-02 -1.6198681265875026e-01 -3.0245207465677519e+00 -4.3533947365890607e-01 2.3448948323376573e-02 3.1058537352314239e+00 6.5318919813035545e-02 9.4428785353819600e-01 4.9633308520164537e-01 4.3093853714872337e+00 -1.3775198671232236e+00 -1.5294216745488913e-02 -4.2372529799155112e+00 -1.4540806620708184e+00 -5.1612261844940288e-01 -5.1142485266795195e+00 1.1777687040719069e+00 4.3030789032966636e-02 5.3622891970879101e+00 1.4434686656312445e+00 3.7156862282990516e-01 5.1942833609438583e+00 -1.0437988136375753e+00 -2.0975057485100149e-02 -5.4782455201004234e+00 -1.3105684207380139e+00 -4.2385952419756212e-01 -7.3234265284074329e+00 1.6204425403282838e+00 6.5318919813035586e-02 7.2872156255838876e+00 789 790 791 831 832 833 843 844 845 801 802 803 792 793 794 834 835 836 846 847 848 804 805 806 3.5445669964675379e+00 3.6737051198159537e-01 9.6627084344915448e-01 -3.6116200993108074e+00 -4.2495370841169111e-01 -1.3064345080453683e+00 -1.9592518856484711e+00 -3.9371605847725200e-01 -9.7575778206983232e-01 1.8090049570621296e+00 2.6208868841762828e-01 8.6712730576387431e-01 1.9359336186395530e+00 4.4960869047062840e-01 1.1491066140193820e+00 -1.8136109676316916e+00 -2.3092811262744853e-01 -8.7038831057594002e-01 -9.9291456857654770e-01 -3.0794796660930179e-01 -7.8134598871267569e-01 1.0878919489982968e+00 2.7847795525584129e-01 9.5142182617140636e-01 3.6737051198159559e-01 3.9414093078387697e+00 1.6167516036093570e+00 -4.1248736084083787e-01 -3.6022224749833875e+00 -1.2705671370960285e+00 -4.9090592953694978e-01 -2.2029814377470300e+00 -1.4034953997654405e+00 2.4960730819265570e-01 1.9347164785360533e+00 1.1506728681220928e+00 4.4166966536117952e-01 2.1729597883370482e+00 1.4252266515188059e+00 -2.8783548765140415e-01 -1.9677709884176831e+00 -1.3481389687876029e+00 -3.0055456311198497e-01 -1.3640026225620663e+00 -1.3767203693071413e+00 4.3313585560574597e-01 1.0878919489982970e+00 1.2062707517059572e+00 9.6627084344915426e-01 1.6167516036093568e+00 7.5570607090911857e+00 -1.2890966208400192e+00 -1.2941808664498469e+00 -7.4684567185685307e+00 -1.2428199276200798e+00 -1.4324101490872043e+00 -5.1704892320955587e+00 8.5444199194710602e-01 1.1892740446334318e+00 5.5221146663374983e+00 1.1355684553775636e+00 1.4306676991066172e+00 5.2441294126283777e+00 -8.5912795021425692e-01 -1.0686895016209006e+00 -5.6407023360227679e+00 -7.7150754380542530e-01 -1.3928346563628606e+00 -4.3665162975473946e+00 1.2062707517059568e+00 9.5142182617140647e-01 4.3228597961771920e+00 -3.6116200993108074e+00 -4.1248736084083776e-01 -1.2890966208400192e+00 3.9048765509785319e+00 3.6392828433139363e-01 1.6275510726472562e+00 2.1823815965363194e+00 4.3021277305540057e-01 1.4033200919612978e+00 -1.9670087218792489e+00 -2.7860715166747668e-01 -1.3298964825874917e+00 -2.2156819073604921e+00 -5.0761861548666687e-01 -1.4492282296571506e+00 1.9592260037230520e+00 2.6951824239091682e-01 1.2112974198365456e+00 1.1118291998747123e+00 4.4300179482657248e-01 1.2188874050024237e+00 -1.3640026225620669e+00 -3.0794796660930196e-01 -1.3928346563628613e+00 -4.2495370841169111e-01 -3.6022224749833875e+00 -1.2941808664498469e+00 3.6392828433139357e-01 3.4898402729245572e+00 9.4707885121892010e-01 4.3812590912516491e-01 1.9421766193342018e+00 1.1233232006177691e+00 -2.1619888921441480e-01 -1.8124661248690370e+00 -8.3460209145186592e-01 -4.0048407596284163e-01 -1.9562041305862350e+00 -9.8859578459791031e-01 2.6620388667612149e-01 1.8199612068817377e+00 8.7537855941134179e-01 2.7393315656825218e-01 1.1118291998747116e+00 9.4310567505701592e-01 -3.0055456311198447e-01 -9.9291456857654792e-01 -7.7150754380542441e-01 -1.3064345080453683e+00 -1.2705671370960283e+00 -7.4684567185685307e+00 1.6275510726472557e+00 9.4707885121892033e-01 7.4967855279986768e+00 1.3939879173872163e+00 1.0937926362670862e+00 5.1806564799860633e+00 -1.0290892255067652e+00 -8.2151521692797291e-01 -5.5655476198304736e+00 -1.4702186945882314e+00 -1.2763128658364089e+00 -5.2503916950774228e+00 1.2178181323560173e+00 8.8998231608465694e-01 5.6182789151278811e+00 9.4310567505701715e-01 1.2188874050024223e+00 4.3551914079111995e+00 -1.3767203693071404e+00 -7.8134598871267569e-01 -4.3665162975473928e+00 -1.9592518856484711e+00 -4.9090592953694978e-01 -1.2428199276200798e+00 2.1823815965363194e+00 4.3812590912516486e-01 1.3939879173872163e+00 3.8926310501626409e+00 5.9818971187234804e-01 1.4970726206837195e+00 -3.6147978423987661e+00 -3.5811279844371524e-01 -1.2490294482841042e+00 -1.3550309961906208e+00 -5.3078947035891799e-01 -1.3049343658141150e+00 1.1148728959517251e+00 3.0699586276392204e-01 1.2443407164674807e+00 1.9421766193342047e+00 4.3021277305540034e-01 1.0937926362670864e+00 -2.2029814377470331e+00 -3.9371605847725222e-01 -1.4324101490872043e+00 -3.9371605847725200e-01 -2.2029814377470300e+00 -1.4324101490872045e+00 4.3021277305540062e-01 1.9421766193342018e+00 1.0937926362670862e+00 5.9818971187234793e-01 3.8926310501626413e+00 1.4970726206837193e+00 -3.5811279844371563e-01 -3.6147978423987657e+00 -1.2490294482841042e+00 -5.3078947035891777e-01 -1.3550309961906208e+00 -1.3049343658141150e+00 3.0699586276392110e-01 1.1148728959517260e+00 1.2443407164674809e+00 4.3812590912516508e-01 2.1823815965363211e+00 1.3939879173872163e+00 -4.9090592953694945e-01 -1.9592518856484742e+00 -1.2428199276200791e+00 -9.7575778206983232e-01 -1.4034953997654405e+00 -5.1704892320955587e+00 1.4033200919612976e+00 1.1233232006177691e+00 5.1806564799860633e+00 1.4970726206837195e+00 1.4970726206837193e+00 7.0554916265699141e+00 -1.2953542391691653e+00 -1.2953542391691635e+00 -7.3963271592126372e+00 -1.3019696369211897e+00 -1.3019696369211902e+00 -4.0177497448990449e+00 9.5286114466283944e-01 9.5286114466284122e-01 4.3382507817607605e+00 1.1233232006177707e+00 1.4033200919612967e+00 5.1806564799860659e+00 -1.4034953997654400e+00 -9.7575778206983244e-01 -5.1704892320955622e+00 1.8090049570621296e+00 2.4960730819265570e-01 8.5444199194710579e-01 -1.9670087218792489e+00 -2.1619888921441480e-01 -1.0290892255067652e+00 -3.6147978423987661e+00 -3.5811279844371557e-01 -1.2953542391691653e+00 3.5673241215613345e+00 2.1518741546722056e-01 9.8571689361595405e-01 1.0836254153298970e+00 3.0071906481916416e-01 9.3560340417662236e-01 -1.0003982833423635e+00 -1.7468363757106176e-01 -8.1907765276921107e-01 -1.8124661248690399e+00 -2.7860715166747707e-01 -8.2151521692797458e-01 1.9347164785360573e+00 2.6208868841762856e-01 1.1892740446334336e+00 2.6208868841762828e-01 1.9347164785360533e+00 1.1892740446334318e+00 -2.7860715166747674e-01 -1.8124661248690370e+00 -8.2151521692797280e-01 -3.5811279844371524e-01 -3.6147978423987657e+00 -1.2953542391691635e+00 2.1518741546722056e-01 3.5673241215613336e+00 9.8571689361595261e-01 3.0071906481916366e-01 1.0836254153298965e+00 9.3560340417662102e-01 -1.7468363757106098e-01 -1.0003982833423635e+00 -8.1907765276920952e-01 -2.1619888921441480e-01 -1.9670087218792507e+00 -1.0290892255067643e+00 2.4960730819265511e-01 1.8090049570621320e+00 8.5444199194710480e-01 8.6712730576387453e-01 1.1506728681220928e+00 5.5221146663374965e+00 -1.3298964825874917e+00 -8.3460209145186592e-01 -5.5655476198304727e+00 -1.2490294482841042e+00 -1.2490294482841042e+00 -7.3963271592126372e+00 9.8571689361595427e-01 9.8571689361595261e-01 7.9034270874944097e+00 1.2483382807428782e+00 1.2483382807428784e+00 4.3140146288420329e+00 -8.3832732592133663e-01 -8.3832732592133863e-01 -4.7342486501378520e+00 -8.3460209145186703e-01 -1.3298964825874902e+00 -5.5655476198304772e+00 1.1506728681220921e+00 8.6712730576387453e-01 5.5221146663375009e+00 1.9359336186395530e+00 4.4166966536117941e-01 1.1355684553775636e+00 -2.2156819073604921e+00 -4.0048407596284163e-01 -1.4702186945882314e+00 -1.3550309961906208e+00 -5.3078947035891766e-01 -1.3019696369211897e+00 1.0836254153298970e+00 3.0071906481916366e-01 1.2483382807428782e+00 3.9420448066443727e+00 6.2938322292127624e-01 1.5708672689009235e+00 -3.6076465948135223e+00 -3.8248848176382227e-01 -1.3369405067821518e+00 -1.9562041305862379e+00 -5.0761861548666631e-01 -1.2763128658364087e+00 2.1729597883370504e+00 4.4960869047062851e-01 1.4306676991066170e+00 4.4960869047062851e-01 2.1729597883370482e+00 1.4306676991066174e+00 -5.0761861548666687e-01 -1.9562041305862350e+00 -1.2763128658364087e+00 -5.3078947035891799e-01 -1.3550309961906208e+00 -1.3019696369211902e+00 3.0071906481916416e-01 1.0836254153298965e+00 1.2483382807428789e+00 6.2938322292127613e-01 3.9420448066443732e+00 1.5708672689009235e+00 -3.8248848176382128e-01 -3.6076465948135232e+00 -1.3369405067821518e+00 -4.0048407596284213e-01 -2.2156819073604948e+00 -1.4702186945882318e+00 4.4166966536117924e-01 1.9359336186395557e+00 1.1355684553775633e+00 1.1491066140193817e+00 1.4252266515188059e+00 5.2441294126283786e+00 -1.4492282296571504e+00 -9.8859578459791009e-01 -5.2503916950774228e+00 -1.3049343658141150e+00 -1.3049343658141150e+00 -4.0177497448990449e+00 9.3560340417662236e-01 9.3560340417662102e-01 4.3140146288420329e+00 1.5708672689009235e+00 1.5708672689009233e+00 7.2469677661294174e+00 -1.3380455585465565e+00 -1.3380455585465576e+00 -7.5307080851743162e+00 -9.8859578459791142e-01 -1.4492282296571495e+00 -5.2503916950774254e+00 1.4252266515188059e+00 1.1491066140193817e+00 5.2441294126283804e+00 -1.8136109676316916e+00 -2.8783548765140415e-01 -8.5912795021425692e-01 1.9592260037230518e+00 2.6620388667612149e-01 1.2178181323560175e+00 1.1148728959517251e+00 3.0699586276392110e-01 9.5286114466283944e-01 -1.0003982833423635e+00 -1.7468363757106098e-01 -8.3832732592133663e-01 -3.6076465948135223e+00 -3.8248848176382128e-01 -1.3380455585465565e+00 3.4953667276487468e+00 2.3321772778277616e-01 1.0435287431995361e+00 1.8199612068817403e+00 2.6951824239091554e-01 8.8998231608465539e-01 -1.9677709884176855e+00 -2.3092811262744795e-01 -1.0686895016208990e+00 -2.3092811262744850e-01 -1.9677709884176831e+00 -1.0686895016209006e+00 2.6951824239091682e-01 1.8199612068817377e+00 8.8998231608465694e-01 3.0699586276392204e-01 1.1148728959517258e+00 9.5286114466284133e-01 -1.7468363757106176e-01 -1.0003982833423637e+00 -8.3832732592133863e-01 -3.8248848176382227e-01 -3.6076465948135228e+00 -1.3380455585465576e+00 2.3321772778277616e-01 3.4953667276487472e+00 1.0435287431995375e+00 2.6620388667612255e-01 1.9592260037230547e+00 1.2178181323560195e+00 -2.8783548765140499e-01 -1.8136109676316952e+00 -8.5912795021425858e-01 -8.7038831057594002e-01 -1.3481389687876029e+00 -5.6407023360227679e+00 1.2112974198365456e+00 8.7537855941134179e-01 5.6182789151278811e+00 1.2443407164674809e+00 1.2443407164674809e+00 4.3382507817607596e+00 -8.1907765276921107e-01 -8.1907765276920952e-01 -4.7342486501378520e+00 -1.3369405067821523e+00 -1.3369405067821520e+00 -7.5307080851743162e+00 1.0435287431995361e+00 1.0435287431995377e+00 7.9715527953411796e+00 8.7537855941134324e-01 1.2112974198365440e+00 5.6182789151278847e+00 -1.3481389687876026e+00 -8.7038831057593968e-01 -5.6407023360227715e+00 -9.9291456857654770e-01 -3.0055456311198497e-01 -7.7150754380542530e-01 1.1118291998747123e+00 2.7393315656825223e-01 9.4310567505701715e-01 1.9421766193342052e+00 4.3812590912516514e-01 1.1233232006177707e+00 -1.8124661248690401e+00 -2.1619888921441477e-01 -8.3460209145186703e-01 -1.9562041305862379e+00 -4.0048407596284219e-01 -9.8859578459791142e-01 1.8199612068817403e+00 2.6620388667612260e-01 8.7537855941134324e-01 3.4898402729245683e+00 3.6392828433139390e-01 9.4707885121892210e-01 -3.6022224749834000e+00 -4.2495370841169183e-01 -1.2941808664498495e+00 -3.0794796660930179e-01 -1.3640026225620663e+00 -1.3928346563628606e+00 4.4300179482657248e-01 1.1118291998747116e+00 1.2188874050024223e+00 4.3021277305540034e-01 2.1823815965363211e+00 1.4033200919612967e+00 -2.7860715166747702e-01 -1.9670087218792507e+00 -1.3298964825874904e+00 -5.0761861548666631e-01 -2.2156819073604943e+00 -1.4492282296571497e+00 2.6951824239091554e-01 1.9592260037230549e+00 1.2112974198365440e+00 3.6392828433139390e-01 3.9048765509785417e+00 1.6275510726472553e+00 -4.1248736084083709e-01 -3.6116200993108185e+00 -1.2890966208400176e+00 -7.8134598871267569e-01 -1.3767203693071410e+00 -4.3665162975473946e+00 1.2188874050024234e+00 9.4310567505701604e-01 4.3551914079111995e+00 1.0937926362670862e+00 1.3939879173872163e+00 5.1806564799860668e+00 -8.2151521692797458e-01 -1.0290892255067643e+00 -5.5655476198304772e+00 -1.2763128658364087e+00 -1.4702186945882318e+00 -5.2503916950774254e+00 8.8998231608465539e-01 1.2178181323560193e+00 5.6182789151278847e+00 9.4707885121892232e-01 1.6275510726472553e+00 7.4967855279986919e+00 -1.2705671370960283e+00 -1.3064345080453696e+00 -7.4684567185685449e+00 1.0878919489982968e+00 4.3313585560574597e-01 1.2062707517059570e+00 -1.3640026225620669e+00 -3.0055456311198447e-01 -1.3767203693071406e+00 -2.2029814377470327e+00 -4.9090592953694945e-01 -1.4034953997654402e+00 1.9347164785360573e+00 2.4960730819265511e-01 1.1506728681220921e+00 2.1729597883370504e+00 4.4166966536117924e-01 1.4252266515188059e+00 -1.9677709884176857e+00 -2.8783548765140493e-01 -1.3481389687876029e+00 -3.6022224749834000e+00 -4.1248736084083709e-01 -1.2705671370960285e+00 3.9414093078387813e+00 3.6737051198159543e-01 1.6167516036093574e+00 2.7847795525584129e-01 1.0878919489982970e+00 9.5142182617140647e-01 -3.0794796660930190e-01 -9.9291456857654803e-01 -7.8134598871267569e-01 -3.9371605847725222e-01 -1.9592518856484742e+00 -9.7575778206983244e-01 2.6208868841762856e-01 1.8090049570621327e+00 8.6712730576387442e-01 4.4960869047062851e-01 1.9359336186395557e+00 1.1491066140193820e+00 -2.3092811262744797e-01 -1.8136109676316956e+00 -8.7038831057593979e-01 -4.2495370841169194e-01 -3.6116200993108185e+00 -1.3064345080453694e+00 3.6737051198159554e-01 3.5445669964675504e+00 9.6627084344915448e-01 9.5142182617140636e-01 1.2062707517059572e+00 4.3228597961771920e+00 -1.3928346563628613e+00 -7.7150754380542430e-01 -4.3665162975473946e+00 -1.4324101490872043e+00 -1.2428199276200793e+00 -5.1704892320955613e+00 1.1892740446334336e+00 8.5444199194710468e-01 5.5221146663375009e+00 1.4306676991066172e+00 1.1355684553775633e+00 5.2441294126283795e+00 -1.0686895016208990e+00 -8.5912795021425870e-01 -5.6407023360227715e+00 -1.2941808664498495e+00 -1.2890966208400179e+00 -7.4684567185685458e+00 1.6167516036093574e+00 9.6627084344915448e-01 7.5570607090912008e+00 831 832 833 873 874 875 885 886 887 843 844 845 834 835 836 876 877 878 888 889 890 846 847 848 3.2388533182139669e+00 3.3032135855517220e-01 8.5015406747398359e-01 -3.2943175120958954e+00 -3.9460262054091644e-01 -1.1963389621229019e+00 -1.7791852657838261e+00 -3.6335036736584236e-01 -8.7566951406865856e-01 1.6302161825340300e+00 2.3050095548853902e-01 7.6395466152650149e-01 1.7676083505892000e+00 4.2094913301068304e-01 1.0510835769948053e+00 -1.6513005804289054e+00 -1.9994495878486762e-01 -7.6543945752904363e-01 -8.9580274888769362e-01 -2.7630432924662557e-01 -6.8413681035874130e-01 9.8392825585912291e-01 2.5243082888385776e-01 8.5639243808405485e-01 3.3032135855517225e-01 3.6429594035287343e+00 1.5121893538397559e+00 -3.8183469157876770e-01 -3.2853047737670908e+00 -1.1608647557405387e+00 -4.6515205221916345e-01 -2.0325455686800948e+00 -1.3092555547698717e+00 2.1857626636578861e-01 1.7520464676706138e+00 1.0550809097711484e+00 4.1219011326632099e-01 2.0146615333215969e+00 1.3300324155128003e+00 -2.5519010493343297e-01 -1.8029364242861750e+00 -1.2536523436231948e+00 -2.6896170286442039e-01 -1.2728088936467068e+00 -1.2896837296748080e+00 4.1005081340850258e-01 9.8392825585912225e-01 1.1161537046847076e+00 8.5015406747398348e-01 1.5121893538397559e+00 6.9218785770266553e+00 -1.1769959773245409e+00 -1.1834479990071116e+00 -6.8257363242442857e+00 -1.1476782115853226e+00 -1.3384808676973705e+00 -4.6969455012461365e+00 7.5075783808510632e-01 1.0922163711498905e+00 5.0535728109677294e+00 1.0345373668400135e+00 1.3333900030550119e+00 4.7810225235426520e+00 -7.5370098699608690e-01 -9.6842630210032665e-01 -5.1864075438080999e+00 -6.7322780117785930e-01 -1.3038329973239009e+00 -3.9930505851716531e+00 1.1161537046847065e+00 8.5639243808405263e-01 3.9456660429331381e+00 -3.2943175120958954e+00 -3.8183469157876770e-01 -1.1769959773245406e+00 3.6048676012021437e+00 3.2624762275445474e-01 1.5213010221372347e+00 2.0089728046410569e+00 4.0183473498086636e-01 1.3071424167098111e+00 -1.7864857450553790e+00 -2.4645637459309377e-01 -1.2352657267306517e+00 -2.0587755991315566e+00 -4.8011075738428266e-01 -1.3518725245532712e+00 1.7913877353883043e+00 2.3751436339704490e-01 1.1121943803675256e+00 1.0071596086980328e+00 4.1910943167040299e-01 1.1273294067177961e+00 -1.2728088936467070e+00 -2.7630432924662518e-01 -1.3038329973239033e+00 -3.9460262054091644e-01 -3.2853047737670908e+00 -1.1834479990071118e+00 3.2624762275445479e-01 3.1841151516008024e+00 8.3103108009864712e-01 4.0953019569044302e-01 1.7591902202530161e+00 1.0247233288436068e+00 -1.8514420579970270e-01 -1.6354690719543963e+00 -7.2969738080668733e-01 -3.6943199391269155e-01 -1.7899460909097480e+00 -8.8762933113376374e-01 2.3452621911641292e-01 1.6560577049670768e+00 7.7032002858495718e-01 2.4783648555642052e-01 1.0071596086980328e+00 8.4792807459821273e-01 -2.6896170286442056e-01 -8.9580274888769340e-01 -6.7322780117786030e-01 -1.1963389621229019e+00 -1.1608647557405385e+00 -6.8257363242442857e+00 1.5213010221372345e+00 8.3103108009864712e-01 6.8616284843188255e+00 1.2997863111716621e+00 9.9777335375101450e-01 4.7052086829811488e+00 -9.2936427079653661e-01 -7.1856433908721984e-01 -5.0994165338122590e+00 -1.3744889547030814e+00 -1.1778345842156077e+00 -4.7888313800456661e+00 1.1208605093902191e+00 7.8526664883464836e-01 5.1618521065640701e+00 8.4792807459821207e-01 1.1273294067177948e+00 3.9783455494098217e+00 -1.2896837296748078e+00 -6.8413681035873974e-01 -3.9930505851716562e+00 -1.7791852657838261e+00 -4.6515205221916350e-01 -1.1476782115853228e+00 2.0089728046410569e+00 4.0953019569044302e-01 1.2997863111716621e+00 3.5569519288198901e+00 5.7101797518792352e-01 1.3881533770595555e+00 -3.2607849170754823e+00 -3.2137201652435204e-01 -1.1417095717592791e+00 -1.2634291376401687e+00 -5.0823594415051343e-01 -1.2146998705268466e+00 1.0108299354656090e+00 2.7572747440063772e-01 1.1568554795865886e+00 1.7591902202530152e+00 4.0183473498086614e-01 9.9777335375101484e-01 -2.0325455686800940e+00 -3.6335036736584175e-01 -1.3384808676973718e+00 -3.6335036736584236e-01 -2.0325455686800948e+00 -1.3384808676973710e+00 4.0183473498086636e-01 1.7591902202530161e+00 9.9777335375101439e-01 5.7101797518792352e-01 3.5569519288198896e+00 1.3881533770595547e+00 -3.2137201652435171e-01 -3.2607849170754819e+00 -1.1417095717592780e+00 -5.0823594415051310e-01 -1.2634291376401683e+00 -1.2146998705268457e+00 2.7572747440063761e-01 1.0108299354656085e+00 1.1568554795865873e+00 4.0953019569044236e-01 2.0089728046410551e+00 1.2997863111716603e+00 -4.6515205221916262e-01 -1.7791852657838241e+00 -1.1476782115853223e+00 -8.7566951406865856e-01 -1.3092555547698717e+00 -4.6969455012461365e+00 1.3071424167098111e+00 1.0247233288436068e+00 4.7052086829811488e+00 1.3881533770595555e+00 1.3881533770595549e+00 6.3755704625995895e+00 -1.1847171157766359e+00 -1.1847171157766359e+00 -6.7122073497419228e+00 -1.2099227304608444e+00 -1.2099227304608444e+00 -3.6390499075992468e+00 8.5954579246303697e-01 8.5954579246303675e-01 3.9591604312715605e+00 1.0247233288436060e+00 1.3071424167098096e+00 4.7052086829811461e+00 -1.3092555547698708e+00 -8.7566951406865656e-01 -4.6969455012461356e+00 1.6302161825340298e+00 2.1857626636578861e-01 7.5075783808510643e-01 -1.7864857450553790e+00 -1.8514420579970273e-01 -9.2936427079653672e-01 -3.2607849170754823e+00 -3.2137201652435177e-01 -1.1847171157766361e+00 3.2250282337701583e+00 1.8171836306501657e-01 8.6845030050784178e-01 9.7895965817541486e-01 2.6873242057547947e-01 8.4218537282415862e-01 -9.0351080806495854e-01 -1.4655540857767513e-01 -7.2096415690660565e-01 -1.6354690719543954e+00 -2.4645637459309344e-01 -7.1856433908721928e-01 1.7520464676706120e+00 2.3050095548853852e-01 1.0922163711498909e+00 2.3050095548853899e-01 1.7520464676706136e+00 1.0922163711498905e+00 -2.4645637459309377e-01 -1.6354690719543963e+00 -7.1856433908721984e-01 -3.2137201652435199e-01 -3.2607849170754819e+00 -1.1847171157766359e+00 1.8171836306501657e-01 3.2250282337701579e+00 8.6845030050784178e-01 2.6873242057547947e-01 9.7895965817541475e-01 8.4218537282415862e-01 -1.4655540857767513e-01 -9.0351080806495843e-01 -7.2096415690660554e-01 -1.8514420579970250e-01 -1.7864857450553777e+00 -9.2936427079653616e-01 2.1857626636578845e-01 1.6302161825340284e+00 7.5075783808510643e-01 7.6395466152650149e-01 1.0550809097711484e+00 5.0535728109677294e+00 -1.2352657267306517e+00 -7.2969738080668733e-01 -5.0994165338122590e+00 -1.1417095717592791e+00 -1.1417095717592780e+00 -6.7122073497419228e+00 8.6845030050784189e-01 8.6845030050784178e-01 7.2368007931616001e+00 1.1589681196493500e+00 1.1589681196493498e+00 3.9359049247623119e+00 -7.3978131215822396e-01 -7.3978131215822351e-01 -4.3688109224929308e+00 -7.2969738080668645e-01 -1.2352657267306495e+00 -5.0994165338122572e+00 1.0550809097711480e+00 7.6395466152649960e-01 5.0535728109677276e+00 1.7676083505892000e+00 4.1219011326632093e-01 1.0345373668400133e+00 -2.0587755991315566e+00 -3.6943199391269155e-01 -1.3744889547030819e+00 -1.2634291376401687e+00 -5.0823594415051310e-01 -1.2099227304608444e+00 9.7895965817541486e-01 2.6873242057547947e-01 1.1589681196493500e+00 3.6653207717990401e+00 6.0126981244527689e-01 1.4609330095218427e+00 -3.3143994862037780e+00 -3.4536278385027258e-01 -1.2255822296866863e+00 -1.7899460909097469e+00 -4.8011075738428188e-01 -1.1778345842156068e+00 2.0146615333215956e+00 4.2094913301068215e-01 1.3333900030550123e+00 4.2094913301068304e-01 2.0146615333215969e+00 1.3333900030550119e+00 -4.8011075738428255e-01 -1.7899460909097480e+00 -1.1778345842156079e+00 -5.0823594415051354e-01 -1.2634291376401683e+00 -1.2099227304608444e+00 2.6873242057547952e-01 9.7895965817541475e-01 1.1589681196493500e+00 6.0126981244527689e-01 3.6653207717990401e+00 1.4609330095218429e+00 -3.4536278385027286e-01 -3.3143994862037784e+00 -1.2255822296866865e+00 -3.6943199391269116e-01 -2.0587755991315548e+00 -1.3744889547030807e+00 4.1219011326632060e-01 1.7676083505891984e+00 1.0345373668400137e+00 1.0510835769948053e+00 1.3300324155128003e+00 4.7810225235426520e+00 -1.3518725245532712e+00 -8.8762933113376385e-01 -4.7888313800456661e+00 -1.2146998705268466e+00 -1.2146998705268457e+00 -3.6390499075992468e+00 8.4218537282415862e-01 8.4218537282415862e-01 3.9359049247623119e+00 1.4609330095218427e+00 1.4609330095218434e+00 6.6287983816382345e+00 -1.2300326486397255e+00 -1.2300326486397253e+00 -6.9100356857952754e+00 -8.8762933113376274e-01 -1.3518725245532695e+00 -4.7888313800456626e+00 1.3300324155127994e+00 1.0510835769948030e+00 4.7810225235426511e+00 -1.6513005804289054e+00 -2.5519010493343292e-01 -7.5370098699608712e-01 1.7913877353883043e+00 2.3452621911641292e-01 1.1208605093902191e+00 1.0108299354656087e+00 2.7572747440063761e-01 8.5954579246303697e-01 -9.0351080806495854e-01 -1.4655540857767516e-01 -7.3978131215822396e-01 -3.3143994862037780e+00 -3.4536278385027280e-01 -1.2300326486397259e+00 3.2138719231628263e+00 1.9928519923215268e-01 9.2626829920645937e-01 1.6560577049670759e+00 2.3751436339704465e-01 7.8526664883464825e-01 -1.8029364242861736e+00 -1.9994495878486720e-01 -9.6842630210032699e-01 -1.9994495878486762e-01 -1.8029364242861750e+00 -9.6842630210032665e-01 2.3751436339704490e-01 1.6560577049670768e+00 7.8526664883464825e-01 2.7572747440063772e-01 1.0108299354656085e+00 8.5954579246303675e-01 -1.4655540857767513e-01 -9.0351080806495843e-01 -7.3978131215822351e-01 -3.4536278385027253e-01 -3.3143994862037776e+00 -1.2300326486397253e+00 1.9928519923215268e-01 3.2138719231628254e+00 9.2626829920645881e-01 2.3452621911641267e-01 1.7913877353883025e+00 1.1208605093902184e+00 -2.5519010493343264e-01 -1.6513005804289036e+00 -7.5370098699608667e-01 -7.6543945752904363e-01 -1.2536523436231948e+00 -5.1864075438081008e+00 1.1121943803675256e+00 7.7032002858495729e-01 5.1618521065640710e+00 1.1568554795865886e+00 1.1568554795865873e+00 3.9591604312715605e+00 -7.2096415690660565e-01 -7.2096415690660554e-01 -4.3688109224929317e+00 -1.2255822296866865e+00 -1.2255822296866865e+00 -6.9100356857952754e+00 9.2626829920645937e-01 9.2626829920645881e-01 7.3687970515047096e+00 7.7032002858495630e-01 1.1121943803675238e+00 5.1618521065640683e+00 -1.2536523436231937e+00 -7.6543945752904152e-01 -5.1864075438080999e+00 -8.9580274888769362e-01 -2.6896170286442034e-01 -6.7322780117785930e-01 1.0071596086980328e+00 2.4783648555642052e-01 8.4792807459821218e-01 1.7591902202530152e+00 4.0953019569044236e-01 1.0247233288436060e+00 -1.6354690719543954e+00 -1.8514420579970250e-01 -7.2969738080668645e-01 -1.7899460909097469e+00 -3.6943199391269116e-01 -8.8762933113376274e-01 1.6560577049670757e+00 2.3452621911641267e-01 7.7032002858495630e-01 3.1841151516007984e+00 3.2624762275445396e-01 8.3103108009864513e-01 -3.2853047737670860e+00 -3.9460262054091566e-01 -1.1834479990071105e+00 -2.7630432924662557e-01 -1.2728088936467068e+00 -1.3038329973239011e+00 4.1910943167040299e-01 1.0071596086980328e+00 1.1273294067177950e+00 4.0183473498086614e-01 2.0089728046410551e+00 1.3071424167098096e+00 -2.4645637459309347e-01 -1.7864857450553777e+00 -1.2352657267306495e+00 -4.8011075738428188e-01 -2.0587755991315548e+00 -1.3518725245532695e+00 2.3751436339704468e-01 1.7913877353883025e+00 1.1121943803675238e+00 3.2624762275445407e-01 3.6048676012021392e+00 1.5213010221372323e+00 -3.8183469157876676e-01 -3.2943175120958905e+00 -1.1769959773245398e+00 -6.8413681035874130e-01 -1.2896837296748083e+00 -3.9930505851716536e+00 1.1273294067177964e+00 8.4792807459821273e-01 3.9783455494098217e+00 9.9777335375101472e-01 1.2997863111716603e+00 4.7052086829811461e+00 -7.1856433908721928e-01 -9.2936427079653616e-01 -5.0994165338122572e+00 -1.1778345842156068e+00 -1.3744889547030807e+00 -4.7888313800456634e+00 7.8526664883464825e-01 1.1208605093902184e+00 5.1618521065640692e+00 8.3103108009864513e-01 1.5213010221372318e+00 6.8616284843188184e+00 -1.1608647557405367e+00 -1.1963389621228993e+00 -6.8257363242442786e+00 9.8392825585912291e-01 4.1005081340850258e-01 1.1161537046847063e+00 -1.2728088936467070e+00 -2.6896170286442056e-01 -1.2896837296748078e+00 -2.0325455686800940e+00 -4.6515205221916262e-01 -1.3092555547698708e+00 1.7520464676706125e+00 2.1857626636578847e-01 1.0550809097711478e+00 2.0146615333215956e+00 4.1219011326632060e-01 1.3300324155127994e+00 -1.8029364242861734e+00 -2.5519010493343258e-01 -1.2536523436231934e+00 -3.2853047737670860e+00 -3.8183469157876671e-01 -1.1608647557405369e+00 3.6429594035287298e+00 3.3032135855517131e-01 1.5121893538397551e+00 2.5243082888385776e-01 9.8392825585912236e-01 8.5639243808405263e-01 -2.7630432924662518e-01 -8.9580274888769340e-01 -6.8413681035873963e-01 -3.6335036736584181e-01 -1.7791852657838241e+00 -8.7566951406865656e-01 2.3050095548853852e-01 1.6302161825340284e+00 7.6395466152649960e-01 4.2094913301068226e-01 1.7676083505891984e+00 1.0510835769948033e+00 -1.9994495878486720e-01 -1.6513005804289036e+00 -7.6543945752904152e-01 -3.9460262054091561e-01 -3.2943175120958905e+00 -1.1963389621228990e+00 3.3032135855517131e-01 3.2388533182139625e+00 8.5015406747398159e-01 8.5639243808405485e-01 1.1161537046847076e+00 3.9456660429331385e+00 -1.3038329973239033e+00 -6.7322780117786030e-01 -3.9930505851716562e+00 -1.3384808676973718e+00 -1.1476782115853221e+00 -4.6969455012461356e+00 1.0922163711498905e+00 7.5075783808510643e-01 5.0535728109677276e+00 1.3333900030550123e+00 1.0345373668400135e+00 4.7810225235426511e+00 -9.6842630210032710e-01 -7.5370098699608667e-01 -5.1864075438080999e+00 -1.1834479990071107e+00 -1.1769959773245393e+00 -6.8257363242442786e+00 1.5121893538397551e+00 8.5015406747398159e-01 6.9218785770266518e+00 801 802 803 843 844 845 486 487 488 468 469 470 804 805 806 846 847 848 852 853 854 810 811 812 3.3016522892772611e+00 4.6739733277232920e-01 7.5424443279718656e-01 -3.3609403150488726e+00 -6.0241543408100762e-01 -1.0759955397668857e+00 -1.7869613822004802e+00 -5.0160540652149721e-01 -7.6715992312001680e-01 1.6546860725983790e+00 3.5793945426246698e-01 6.8132092042402359e-01 1.7822215379529784e+00 5.9475582681692774e-01 9.3082248858277739e-01 -1.6764906956857561e+00 -3.3823916103708429e-01 -6.9327581526199733e-01 -8.9278926427484040e-01 -3.8198078938521862e-01 -5.9657695675132438e-01 9.7862175738133106e-01 4.0414817717308377e-01 7.6662039309623720e-01 4.6739733277232920e-01 4.4163130600275515e+00 2.0674693473557704e+00 -5.9054294801108242e-01 -4.0017237362524938e+00 -1.8189777453270248e+00 -6.4230045068960018e-01 -2.6703477241917617e+00 -1.7441800546156858e+00 3.3803187582288530e-01 2.3396074581660371e+00 1.6319715392947385e+00 5.8525032822660139e-01 2.6822955656606391e+00 1.8114317527555872e+00 -3.8263997284865492e-01 -2.4186517271372874e+00 -1.8524008899548552e+00 -3.6464009347517695e-01 -1.8703606497023086e+00 -1.7264253543062906e+00 5.8944392820269786e-01 1.5228677534296255e+00 1.6311114047977613e+00 7.5424443279718656e-01 2.0674693473557708e+00 6.4532903332735589e+00 -1.0640456321114371e+00 -1.8367516950951961e+00 -6.4726901436997366e+00 -1.0026366466162653e+00 -1.7826080655093459e+00 -4.2301102587829336e+00 6.5821581935950979e-01 1.6677471819389753e+00 4.6508312981079030e+00 9.2437719341384061e-01 1.8233655524642007e+00 4.3434724412120111e+00 -6.7784823915660319e-01 -1.5962737144774151e+00 -4.7964407546948129e+00 -5.7767365159219297e-01 -1.7513046195585513e+00 -3.5084935367355188e+00 9.8536672390596070e-01 1.4083560128815631e+00 3.5601406213195297e+00 -3.3609403150488730e+00 -5.9054294801108254e-01 -1.0640456321114371e+00 3.6508111737262885e+00 6.2487651421195956e-01 1.4030028515436384e+00 2.0050748965144582e+00 6.3535905302521334e-01 1.1711130465705111e+00 -1.7966340195637489e+00 -4.7438307530820856e-01 -1.1262994035301312e+00 -2.0579476840352258e+00 -7.2631086866448069e-01 -1.2177064851231059e+00 1.8083736455131614e+00 4.5313851560684604e-01 1.0268690872230883e+00 9.9675103441201818e-01 6.0626991157305732e-01 9.9734675262832573e-01 -1.2454887315180776e+00 -5.2840710243330480e-01 -1.1902802172008902e+00 -6.0241543408100762e-01 -4.0017237362524947e+00 -1.8367516950951961e+00 6.2487651421195956e-01 3.7919045611716165e+00 1.5700567206334124e+00 6.4013266602054231e-01 2.3392423600518404e+00 1.5668653051541461e+00 -3.5489737242256036e-01 -2.1219541438106986e+00 -1.4045341004383920e+00 -6.3064517081376992e-01 -2.3925203507040056e+00 -1.4680824163405475e+00 4.4699376753372200e-01 2.1754816008126991e+00 1.4601391760169489e+00 3.9221773007862348e-01 1.5481363669154875e+00 1.3983787529240881e+00 -5.1626270052750900e-01 -1.3385666581844469e+00 -1.2860717428544604e+00 -1.0759955397668854e+00 -1.8189777453270248e+00 -6.4726901436997375e+00 1.4030028515436384e+00 1.5700567206334122e+00 6.6090046153070681e+00 1.1589505941301732e+00 1.5368543499126215e+00 4.3352315317973282e+00 -8.3637184566642131e-01 -1.3782168725162243e+00 -4.7994011368162557e+00 -1.2539624453185714e+00 -1.7466635405575772e+00 -4.4422614856517271e+00 1.0297223576977561e+00 1.4817348063319404e+00 4.8765505719931737e+00 7.4796733425666406e-01 1.6527752057457783e+00 3.5895181623410424e+00 -1.1733133068763515e+00 -1.2975629242229265e+00 -3.6959521152708903e+00 -1.7869613822004802e+00 -6.4230045068960029e-01 -1.0026366466162655e+00 2.0050748965144582e+00 6.4013266602054231e-01 1.1589505941301732e+00 3.5595916028660199e+00 7.8876917890340426e-01 1.2036135910172003e+00 -3.2906879252036849e+00 -5.0913921404995421e-01 -1.0002140595031856e+00 -1.2332486609309630e+00 -7.0818972360902110e-01 -1.0640573658483408e+00 1.0027106853113401e+00 4.8388987986967019e-01 1.0400308908481057e+00 1.7471723751744415e+00 5.4916808777549342e-01 8.5374986460874103e-01 -2.0036515915311317e+00 -6.0233042422053518e-01 -1.1894368686364289e+00 -5.0160540652149721e-01 -2.6703477241917617e+00 -1.7826080655093459e+00 6.3535905302521334e-01 2.3392423600518404e+00 1.5368543499126210e+00 7.8876917890340414e-01 4.2585257429945989e+00 1.8527176158118503e+00 -5.1994169976567717e-01 -3.9182560891544367e+00 -1.7362064204774050e+00 -7.0750037904012675e-01 -1.8487715347893712e+00 -1.6206726077791489e+00 4.2475525940842379e-01 1.5514264940628530e+00 1.6782337932681035e+00 5.6329290892294992e-01 2.6227698075823351e+00 1.7281380674367282e+00 -6.8312891493268924e-01 -2.3345890565560574e+00 -1.6564567326634039e+00 -7.6715992312001680e-01 -1.7441800546156860e+00 -4.2301102587829336e+00 1.1711130465705113e+00 1.5668653051541461e+00 4.3352315317973282e+00 1.2036135910172003e+00 1.8527176158118506e+00 5.8838328043828145e+00 -1.0513803872875407e+00 -1.7898205954158717e+00 -6.2725641045678113e+00 -1.0625779727054456e+00 -1.6200011659382318e+00 -3.1979425536526103e+00 7.6795714623636346e-01 1.3981242296608085e+00 3.5609895645405869e+00 8.8653501780674027e-01 1.7455738509526795e+00 4.2000205248016211e+00 -1.1481005185178113e+00 -1.4092791856096947e+00 -4.2794575085189983e+00 1.6546860725983790e+00 3.3803187582288530e-01 6.5821581935950968e-01 -1.7966340195637489e+00 -3.5489737242256031e-01 -8.3637184566642131e-01 -3.2906879252036849e+00 -5.1994169976567717e-01 -1.0513803872875405e+00 3.2652363180086930e+00 3.2844159933315487e-01 7.6543337280758350e-01 9.6884824094760447e-01 4.0894381777909844e-01 7.4138853535637517e-01 -9.0386893965212145e-01 -2.7371462113373463e-01 -6.4093114287512243e-01 -1.6410393365908671e+00 -3.5320297985229498e-01 -6.1453638762414653e-01 1.7434595894557445e+00 4.2633938023912887e-01 9.7818203592976261e-01 3.5793945426246698e-01 2.3396074581660371e+00 1.6677471819389749e+00 -4.7438307530820856e-01 -2.1219541438106986e+00 -1.3782168725162243e+00 -5.0913921404995410e-01 -3.9182560891544367e+00 -1.7898205954158726e+00 3.2844159933315487e-01 3.7924531865252185e+00 1.6018444784656636e+00 4.7557728084523287e-01 1.5153711461661459e+00 1.3744323755505325e+00 -2.8106515922982866e-01 -1.3580194116093240e+00 -1.3673310244671155e+00 -3.0050690500362454e-01 -2.3553338619842896e+00 -1.4996536808848582e+00 4.0313601915076042e-01 2.1061317157013475e+00 1.3909981373288995e+00 6.8132092042402359e-01 1.6319715392947387e+00 4.6508312981079039e+00 -1.1262994035301312e+00 -1.4045341004383920e+00 -4.7994011368162566e+00 -1.0002140595031854e+00 -1.7362064204774055e+00 -6.2725641045678104e+00 7.6543337280758372e-01 1.6018444784656638e+00 6.8611976988365662e+00 1.0498780255797306e+00 1.6917204082284416e+00 3.5459840959660691e+00 -6.7395086750517763e-01 -1.4003422121132181e+00 -4.0378944155223939e+00 -6.3455384712449447e-01 -1.7928432263517637e+00 -4.6413031554494051e+00 9.3838585885164927e-01 1.4083895333919361e+00 4.6931497194453264e+00 1.7822215379529784e+00 5.8525032822660139e-01 9.2437719341384061e-01 -2.0579476840352262e+00 -6.3064517081377003e-01 -1.2539624453185718e+00 -1.2332486609309630e+00 -7.0750037904012664e-01 -1.0625779727054456e+00 9.6884824094760447e-01 4.7557728084523287e-01 1.0498780255797306e+00 3.6773320800449913e+00 8.5539115158840684e-01 1.2993445354000523e+00 -3.3537443393669735e+00 -5.7108734592562616e-01 -1.1175696757366329e+00 -1.7801153774048126e+00 -6.6760264160974159e-01 -1.0342452670094398e+00 1.9966542027924004e+00 6.6061677672902341e-01 1.1947556063764677e+00 5.9475582681692774e-01 2.6822955656606391e+00 1.8233655524642007e+00 -7.2631086866448058e-01 -2.3925203507040051e+00 -1.7466635405575774e+00 -7.0818972360902110e-01 -1.8487715347893712e+00 -1.6200011659382318e+00 4.0894381777909838e-01 1.5153711461661457e+00 1.6917204082284416e+00 8.5539115158840662e-01 4.4333982174962498e+00 1.9973658274322525e+00 -5.7017902959074374e-01 -4.0325293401859792e+00 -1.9026020233116434e+00 -5.0599048610365394e-01 -2.7122506009901688e+00 -1.8394197135007031e+00 6.5157931178346562e-01 2.3550068973464899e+00 1.5962346551832622e+00 9.3082248858277739e-01 1.8114317527555872e+00 4.3434724412120111e+00 -1.2177064851231059e+00 -1.4680824163405475e+00 -4.4422614856517271e+00 -1.0640573658483408e+00 -1.6206726077791487e+00 -3.1979425536526103e+00 7.4138853535637517e-01 1.3744323755505328e+00 3.5459840959660687e+00 1.2993445354000521e+00 1.9973658274322528e+00 6.1637556419985486e+00 -1.1120506270183244e+00 -1.8960468238618335e+00 -6.5055239578714090e+00 -7.6630225099658400e-01 -1.8056811751925970e+00 -4.2940399799020836e+00 1.1885611696471494e+00 1.6072530674357550e+00 4.3865557979012024e+00 -1.6764906956857564e+00 -3.8263997284865492e-01 -6.7784823915660319e-01 1.8083736455131614e+00 4.4699376753372200e-01 1.0297223576977561e+00 1.0027106853113399e+00 4.2475525940842379e-01 7.6795714623636357e-01 -9.0386893965212145e-01 -2.8106515922982861e-01 -6.7395086750517774e-01 -3.3537443393669739e+00 -5.7017902959074374e-01 -1.1120506270183244e+00 3.2588743007206724e+00 3.7396633085759529e-01 8.4956762394687146e-01 1.6643687717665308e+00 3.7272756124968415e-01 6.9923419485303451e-01 -1.8002234286068530e+00 -3.8455875738019790e-01 -8.8263158905392114e-01 -3.3823916103708429e-01 -2.4186517271372878e+00 -1.5962737144774148e+00 4.5313851560684615e-01 2.1754816008126991e+00 1.4817348063319407e+00 4.8388987986967019e-01 1.5514264940628530e+00 1.3981242296608085e+00 -2.7371462113373463e-01 -1.3580194116093240e+00 -1.4003422121132181e+00 -5.7108734592562616e-01 -4.0325293401859792e+00 -1.8960468238618335e+00 3.7396633085759529e-01 3.8334628921066862e+00 1.7309247691787439e+00 3.6001866825224133e-01 2.3951120647130835e+00 1.7176051502724248e+00 -4.8797226648990716e-01 -2.1462825727627317e+00 -1.4357262049914525e+00 -6.9327581526199733e-01 -1.8524008899548552e+00 -4.7964407546948120e+00 1.0268690872230883e+00 1.4601391760169491e+00 4.8765505719931737e+00 1.0400308908481057e+00 1.6782337932681037e+00 3.5609895645405860e+00 -6.4093114287512243e-01 -1.3673310244671155e+00 -4.0378944155223930e+00 -1.1175696757366329e+00 -1.9026020233116441e+00 -6.5055239578714090e+00 8.4956762394687146e-01 1.7309247691787442e+00 7.0328323704861582e+00 6.7348152523040361e-01 1.7109765330248135e+00 4.7226231123079403e+00 -1.1381724933747150e+00 -1.4579403337549959e+00 -4.8531364912392476e+00 -8.9278926427484040e-01 -3.6464009347517701e-01 -5.7767365159219297e-01 9.9675103441201818e-01 3.9221773007862354e-01 7.4796733425666406e-01 1.7471723751744415e+00 5.6329290892294992e-01 8.8653501780674027e-01 -1.6410393365908671e+00 -3.0050690500362454e-01 -6.3455384712449436e-01 -1.7801153774048126e+00 -5.0599048610365394e-01 -7.6630225099658422e-01 1.6643687717665308e+00 3.6001866825224133e-01 6.7348152523040361e-01 3.1869535359282182e+00 4.4345862971604549e-01 7.0530627174628213e-01 -3.2813017390106873e+00 -5.8785045238740463e-01 -1.0347603993268186e+00 -3.8198078938521862e-01 -1.8703606497023084e+00 -1.7513046195585515e+00 6.0626991157305732e-01 1.5481363669154875e+00 1.6527752057457783e+00 5.4916808777549342e-01 2.6227698075823351e+00 1.7455738509526788e+00 -3.5320297985229498e-01 -2.3553338619842896e+00 -1.7928432263517640e+00 -6.6760264160974148e-01 -2.7122506009901688e+00 -1.8056811751925970e+00 3.7272756124968415e-01 2.3951120647130830e+00 1.7109765330248137e+00 4.4345862971604544e-01 4.3178180930092820e+00 2.0388544720703567e+00 -5.6883777946702430e-01 -3.9458912195434213e+00 -1.7983510406907166e+00 -5.9657695675132438e-01 -1.7264253543062906e+00 -3.5084935367355192e+00 9.9734675262832584e-01 1.3983787529240881e+00 3.5895181623410424e+00 8.5374986460874103e-01 1.7281380674367282e+00 4.2000205248016211e+00 -6.1453638762414642e-01 -1.4996536808848582e+00 -4.6413031554494051e+00 -1.0342452670094398e+00 -1.8394197135007031e+00 -4.2940399799020836e+00 6.9923419485303451e-01 1.7176051502724248e+00 4.7226231123079403e+00 7.0530627174628224e-01 2.0388544720703567e+00 6.2667693472643933e+00 -1.0102784724514715e+00 -1.8174776940117467e+00 -6.3350944746279900e+00 9.7862175738133117e-01 5.8944392820269786e-01 9.8536672390596058e-01 -1.2454887315180776e+00 -5.1626270052750900e-01 -1.1733133068763515e+00 -2.0036515915311317e+00 -6.8312891493268924e-01 -1.1481005185178113e+00 1.7434595894557448e+00 4.0313601915076042e-01 9.3838585885164938e-01 1.9966542027924004e+00 6.5157931178346562e-01 1.1885611696471496e+00 -1.8002234286068532e+00 -4.8797226648990721e-01 -1.1381724933747150e+00 -3.2813017390106873e+00 -5.6883777946702430e-01 -1.0102784724514715e+00 3.6119299410372729e+00 6.1204240228020601e-01 1.3575510388155902e+00 4.0414817717308377e-01 1.5228677534296255e+00 1.4083560128815631e+00 -5.2840710243330480e-01 -1.3385666581844469e+00 -1.2975629242229265e+00 -6.0233042422053518e-01 -2.3345890565560574e+00 -1.4092791856096945e+00 4.2633938023912882e-01 2.1061317157013471e+00 1.4083895333919361e+00 6.6061677672902341e-01 2.3550068973464899e+00 1.6072530674357548e+00 -3.8455875738019790e-01 -2.1462825727627317e+00 -1.4579403337549959e+00 -5.8785045238740474e-01 -3.9458912195434213e+00 -1.8174776940117467e+00 6.1204240228020601e-01 3.7813231405691949e+00 1.5582615238901105e+00 7.6662039309623731e-01 1.6311114047977615e+00 3.5601406213195301e+00 -1.1902802172008902e+00 -1.2860717428544604e+00 -3.6959521152708903e+00 -1.1894368686364287e+00 -1.6564567326634041e+00 -4.2794575085189974e+00 9.7818203592976261e-01 1.3909981373288998e+00 4.6931497194453264e+00 1.1947556063764673e+00 1.5962346551832620e+00 4.3865557979012024e+00 -8.8263158905392103e-01 -1.4357262049914525e+00 -4.8531364912392467e+00 -1.0347603993268186e+00 -1.7983510406907164e+00 -6.3350944746279918e+00 1.3575510388155902e+00 1.5582615238901107e+00 6.5237944509910699e+00 843 844 845 885 886 887 894 895 896 486 487 488 846 847 848 888 889 890 897 898 899 852 853 854 2.9873392231113352e+00 4.1551715590952365e-01 6.6078451579537667e-01 -3.0344058417243951e+00 -5.5592483500803902e-01 -9.8378821860486021e-01 -1.6352407701053582e+00 -4.6118575127291561e-01 -6.9088874311932380e-01 1.5036979734036313e+00 3.1528198632249821e-01 6.0097701135404402e-01 1.6156516722831984e+00 5.5270819691737194e-01 8.5140029809956830e-01 -1.5144745113323819e+00 -2.9398963566767145e-01 -6.0944736436891911e-01 -8.1342371197842267e-01 -3.3988857057278132e-01 -5.2197189527621923e-01 8.9085596634239272e-01 3.6748145337201377e-01 6.9293439612033347e-01 4.1551715590952365e-01 4.0573028980293655e+00 1.9215554085640714e+00 -5.4845313592565714e-01 -3.6232964892166981e+00 -1.6704778988644178e+00 -6.0649114085904843e-01 -2.4855565841547897e+00 -1.6188322202869645e+00 2.9777592096157535e-01 2.1407511219939961e+00 1.5080787364793342e+00 5.4646282392915013e-01 2.4795711311945619e+00 1.6817708382280363e+00 -3.3718263883740229e-01 -2.2076985344110556e+00 -1.7255057140419050e+00 -3.2444945482364723e-01 -1.7549389629796404e+00 -1.6108006912405379e+00 5.5682046964550680e-01 1.3938654195442619e+00 1.5142115411623824e+00 6.6078451579537645e-01 1.9215554085640714e+00 5.8847628707622839e+00 -9.7783561084542903e-01 -1.6844610408383953e+00 -5.8949193218910478e+00 -9.3146311999886255e-01 -1.6615945596133113e+00 -3.8658942292299465e+00 5.8127380205643508e-01 1.5429361166549453e+00 4.2865855443037466e+00 8.4965523578074054e-01 1.6918515718684224e+00 3.9558537334192567e+00 -5.9331314389649892e-01 -1.4614226848453429e+00 -4.4135174936710957e+00 -5.0579211867476070e-01 -1.6352049806664826e+00 -3.2269947468928919e+00 9.1669043978300069e-01 1.2863401688760951e+00 3.2741236431996952e+00 -3.0344058417243951e+00 -5.4845313592565714e-01 -9.7783561084542925e-01 3.3405028916219401e+00 5.7531946666217215e-01 1.3196282929880017e+00 1.8597391814573387e+00 5.9884665263381420e-01 1.1006266097033994e+00 -1.6428474876993431e+00 -4.3308227180472669e-01 -1.0567372719990902e+00 -1.9031640216321177e+00 -6.8860973613595589e-01 -1.1426234987129069e+00 1.6398906686759522e+00 4.1105367746230353e-01 9.5310392324648263e-01 9.1016075669334795e-01 5.7360512745798187e-01 9.2936122476497884e-01 -1.1698761473927237e+00 -4.8867978034993270e-01 -1.1255236691454364e+00 -5.5592483500803902e-01 -3.6232964892166981e+00 -1.6844610408383955e+00 5.7531946666217215e-01 3.4196075774719743e+00 1.4133952209798437e+00 6.0261485546399418e-01 2.1401439270442446e+00 1.4397206196988097e+00 -3.1516452757980767e-01 -1.9232912985147959e+00 -1.2729526088473877e+00 -5.8982911182528464e-01 -2.1806943458937686e+00 -1.3330068698348307e+00 4.0253134541730978e-01 1.9615203690203160e+00 1.3220355412978722e+00 3.5735994503482593e-01 1.4180051885472924e+00 1.2766969003577857e+00 -4.7690713816517122e-01 -1.2119949284585658e+00 -1.1614277628136971e+00 -9.8378821860486021e-01 -1.6704778988644184e+00 -5.8949193218910478e+00 1.3196282929880017e+00 1.4133952209798433e+00 6.0359314595407003e+00 1.0879806032605392e+00 1.4119315863693958e+00 3.9667272338371502e+00 -7.6243958932788669e-01 -1.2446167049971131e+00 -4.4355809257329879e+00 -1.1812427612315757e+00 -1.6148876279182773e+00 -4.0540885709615537e+00 9.4994961437690895e-01 1.3424494330830026e+00 4.4903256551299231e+00 6.7768338371752423e-01 1.5335199715740697e+00 3.3031626116492037e+00 -1.1077713251786532e+00 -1.1713139802265047e+00 -3.4115581415713878e+00 -1.6352407701053582e+00 -6.0649114085904843e-01 -9.3146311999886255e-01 1.8597391814573387e+00 6.0261485546399407e-01 1.0879806032605392e+00 3.3318006848978601e+00 7.5405008126737905e-01 1.1268760598278462e+00 -3.0443865855313419e+00 -4.6378093653943708e-01 -9.2158268783764630e-01 -1.1595262859485895e+00 -6.7635246225280832e-01 -9.9614912513669107e-01 9.1459622334955604e-01 4.4390071072980858e-01 9.7493193556174984e-01 1.6192913171993375e+00 5.1095359898450921e-01 7.8178170043739126e-01 -1.8862737653188035e+00 -5.6489470679439724e-01 -1.1223753661143263e+00 -4.6118575127291561e-01 -2.4855565841547897e+00 -1.6615945596133113e+00 5.9884665263381431e-01 2.1401439270442446e+00 1.4119315863693958e+00 7.5405008126737894e-01 3.9849300789442403e+00 1.7191477817289313e+00 -4.7730327763811453e-01 -3.6243314620087395e+00 -1.6021681289071006e+00 -6.7747308241021942e-01 -1.7332473519554914e+00 -1.5037394107054369e+00 3.8343764313173151e-01 1.4220816004163024e+00 1.5637799806373509e+00 5.2925475034344405e-01 2.4612902563933905e+00 1.6089611130495152e+00 -6.4962701605512030e-01 -2.1653104646791577e+00 -1.5363183625593440e+00 -6.9088874311932380e-01 -1.6188322202869645e+00 -3.8658942292299470e+00 1.1006266097033994e+00 1.4397206196988099e+00 3.9667272338371506e+00 1.1268760598278462e+00 1.7191477817289313e+00 5.4170459153243202e+00 -9.7875929457585287e-01 -1.6573827735305884e+00 -5.7973931612984515e+00 -9.9475178650968876e-01 -1.4991165329981282e+00 -2.9134825688243087e+00 6.9686013363658972e-01 1.2770424566796776e+00 3.2727375639803089e+00 8.2007155154217348e-01 1.6246965746255333e+00 3.8664585667221885e+00 -1.0800345305051440e+00 -1.2852759059172709e+00 -3.9461993205112593e+00 1.5036979734036313e+00 2.9777592096157535e-01 5.8127380205643508e-01 -1.6428474876993431e+00 -3.1516452757980767e-01 -7.6243958932788669e-01 -3.0443865855313419e+00 -4.7730327763811453e-01 -9.7875929457585287e-01 3.0292555057532913e+00 2.8603526532436346e-01 6.8171602952966603e-01 8.8191632368064454e-01 3.6889101966709020e-01 6.7366265891253896e-01 -8.2282891297715599e-01 -2.3613938587937217e-01 -5.6740843625463433e-01 -1.5183804032012762e+00 -3.1251129160740554e-01 -5.4066747922389002e-01 1.6135735865715501e+00 3.8841627675167123e-01 9.1262230888362372e-01 3.1528198632249821e-01 2.1407511219939961e+00 1.5429361166549453e+00 -4.3308227180472675e-01 -1.9232912985147959e+00 -1.2446167049971131e+00 -4.6378093653943708e-01 -3.6243314620087395e+00 -1.6573827735305884e+00 2.8603526532436341e-01 3.5048916321913199e+00 1.4604409482203693e+00 4.3580753222783097e-01 1.3852867794792372e+00 1.2543066172040651e+00 -2.4161215728154709e-01 -1.2315151838091636e+00 -1.2418549859908381e+00 -2.6122990836437737e-01 -2.1851607182367188e+00 -1.3773113024972368e+00 3.6258049011539617e-01 1.9333691289048653e+00 1.2634820849363972e+00 6.0097701135404424e-01 1.5080787364793347e+00 4.2865855443037466e+00 -1.0567372719990902e+00 -1.2729526088473877e+00 -4.4355809257329879e+00 -9.2158268783764652e-01 -1.6021681289071006e+00 -5.7973931612984524e+00 6.8171602952966592e-01 1.4604409482203697e+00 6.4008667467437474e+00 9.8486150996147526e-01 1.5745885450803883e+00 3.2574089710715470e+00 -5.9602443500029589e-01 -1.2750288347470682e+00 -3.7603242272533364e+00 -5.5862542817090732e-01 -1.6727930664412110e+00 -4.3132322123190328e+00 8.6541527216275571e-01 1.2798344091626763e+00 4.3616692644847701e+00 1.6156516722831984e+00 5.4646282392915013e-01 8.4965523578074065e-01 -1.9031640216321175e+00 -5.8982911182528464e-01 -1.1812427612315757e+00 -1.1595262859485895e+00 -6.7747308241021942e-01 -9.9475178650968865e-01 8.8191632368064465e-01 4.3580753222783097e-01 9.8486150996147537e-01 3.4045553793438899e+00 8.1505494105860410e-01 1.2138016834081251e+00 -3.0614123551580215e+00 -5.2172143376614966e-01 -1.0338551525122155e+00 -1.6438769094565597e+00 -6.3149274625078577e-01 -9.6171836974299885e-01 1.8658561968875551e+00 6.2319107703685461e-01 1.1232496408461381e+00 5.5270819691737194e-01 2.4795711311945614e+00 1.6918515718684224e+00 -6.8860973613595589e-01 -2.1806943458937686e+00 -1.6148876279182773e+00 -6.7635246225280832e-01 -1.7332473519554914e+00 -1.4991165329981282e+00 3.6889101966709020e-01 1.3852867794792372e+00 1.5745885450803885e+00 8.1505494105860410e-01 4.1062224220383117e+00 1.8468378963985201e+00 -5.1859292906321508e-01 -3.6868890211681351e+00 -1.7532321049769339e+00 -4.6584706911888224e-01 -2.5389098107920223e+00 -1.7120509885972743e+00 6.1274803892779606e-01 2.1686601970973074e+00 1.4660092411432832e+00 8.5140029809956830e-01 1.6817708382280365e+00 3.9558537334192563e+00 -1.1426234987129069e+00 -1.3330068698348310e+00 -4.0540885709615537e+00 -9.9614912513669096e-01 -1.5037394107054369e+00 -2.9134825688243091e+00 6.7366265891253896e-01 1.2543066172040651e+00 3.2574089710715470e+00 1.2138016834081251e+00 1.8468378963985197e+00 5.6287327577281232e+00 -1.0240126300141448e+00 -1.7463615153820082e+00 -5.9629984610835871e+00 -6.9316993685802442e-01 -1.6796553632107107e+00 -3.9420113442323794e+00 1.1170905503015356e+00 1.4798478073023664e+00 4.0305854828829029e+00 -1.5144745113323819e+00 -3.3718263883740235e-01 -5.9331314389649892e-01 1.6398906686759522e+00 4.0253134541730978e-01 9.4994961437690895e-01 9.1459622334955604e-01 3.8343764313173162e-01 6.9686013363658972e-01 -8.2282891297715621e-01 -2.4161215728154709e-01 -5.9602443500029589e-01 -3.0614123551580215e+00 -5.1859292906321508e-01 -1.0240126300141448e+00 2.9757478521159690e+00 3.2460324284676256e-01 7.5362842153793053e-01 1.5278401537440687e+00 3.2879614157518361e-01 6.1797227770101182e-01 -1.6593591184179881e+00 -3.4198064778882331e-01 -8.0506023834150087e-01 -2.9398963566767156e-01 -2.2076985344110556e+00 -1.4614226848453431e+00 4.1105367746230359e-01 1.9615203690203160e+00 1.3424494330830024e+00 4.4390071072980858e-01 1.4220816004163026e+00 1.2770424566796776e+00 -2.3613938587937217e-01 -1.2315151838091636e+00 -1.2750288347470682e+00 -5.2172143376614966e-01 -3.6868890211681351e+00 -1.7463615153820085e+00 3.2460324284676256e-01 3.4939965159296675e+00 1.5742029712098933e+00 3.1822574635900563e-01 2.2084297709519767e+00 1.5911493597086581e+00 -4.4593292208468743e-01 -1.9599255169299088e+00 -1.3020311857068119e+00 -6.0944736436891922e-01 -1.7255057140419050e+00 -4.4135174936710948e+00 9.5310392324648263e-01 1.3220355412978722e+00 4.4903256551299231e+00 9.7493193556174984e-01 1.5637799806373511e+00 3.2727375639803089e+00 -5.6740843625463433e-01 -1.2418549859908383e+00 -3.7603242272533368e+00 -1.0338551525122155e+00 -1.7532321049769337e+00 -5.9629984610835871e+00 7.5362842153793053e-01 1.5742029712098937e+00 6.5045036928862494e+00 5.9562462462703547e-01 1.5826629999874258e+00 4.3717497751006258e+00 -1.0665779518374310e+00 -1.3220886881228673e+00 -4.5024765050890885e+00 -8.1342371197842267e-01 -3.2444945482364723e-01 -5.0579211867476082e-01 9.1016075669334795e-01 3.5735994503482593e-01 6.7768338371752423e-01 1.6192913171993377e+00 5.2925475034344405e-01 8.2007155154217348e-01 -1.5183804032012762e+00 -2.6122990836437737e-01 -5.5862542817090743e-01 -1.6438769094565597e+00 -4.6584706911888224e-01 -6.9316993685802419e-01 1.5278401537440687e+00 3.1822574635900563e-01 5.9562462462703547e-01 2.9780594515558834e+00 3.9763284696492779e-01 6.2396465492160635e-01 -3.0596706545563794e+00 -5.5094685639529672e-01 -9.5975673110464699e-01 -3.3988857057278132e-01 -1.7549389629796404e+00 -1.6352049806664830e+00 5.7360512745798187e-01 1.4180051885472924e+00 1.5335199715740697e+00 5.1095359898450921e-01 2.4612902563933905e+00 1.6246965746255333e+00 -3.1251129160740559e-01 -2.1851607182367188e+00 -1.6727930664412107e+00 -6.3149274625078566e-01 -2.5389098107920218e+00 -1.6796553632107103e+00 3.2879614157518350e-01 2.2084297709519771e+00 1.5826629999874258e+00 3.9763284696492784e-01 4.0659938849510358e+00 1.9065013350087905e+00 -5.2709510655163061e-01 -3.6747096088353151e+00 -1.6597274708774139e+00 -5.2197189527621934e-01 -1.6108006912405382e+00 -3.2269947468928919e+00 9.2936122476497895e-01 1.2766969003577857e+00 3.3031626116492037e+00 7.8178170043739126e-01 1.6089611130495152e+00 3.8664585667221889e+00 -5.4066747922389014e-01 -1.3773113024972368e+00 -4.3132322123190328e+00 -9.6171836974299874e-01 -1.7120509885972743e+00 -3.9420113442323803e+00 6.1797227770101171e-01 1.5911493597086583e+00 4.3717497751006258e+00 6.2396465492160613e-01 1.9065013350087903e+00 5.8280817980464956e+00 -9.2872211358188128e-01 -1.6831457257897005e+00 -5.8872144480742072e+00 8.9085596634239272e-01 5.5682046964550669e-01 9.1669043978300058e-01 -1.1698761473927237e+00 -4.7690713816517127e-01 -1.1077713251786530e+00 -1.8862737653188035e+00 -6.4962701605512019e-01 -1.0800345305051440e+00 1.6135735865715501e+00 3.6258049011539617e-01 8.6541527216275571e-01 1.8658561968875551e+00 6.1274803892779617e-01 1.1170905503015356e+00 -1.6593591184179881e+00 -4.4593292208468749e-01 -1.0665779518374308e+00 -3.0596706545563794e+00 -5.2709510655163072e-01 -9.2872211358188106e-01 3.4048939358843970e+00 5.6741318416791076e-01 1.2839096588558168e+00 3.6748145337201382e-01 1.3938654195442615e+00 1.2863401688760949e+00 -4.8867978034993270e-01 -1.2119949284585656e+00 -1.1713139802265045e+00 -5.6489470679439735e-01 -2.1653104646791572e+00 -1.2852759059172709e+00 3.8841627675167117e-01 1.9333691289048653e+00 1.2798344091626763e+00 6.2319107703685461e-01 2.1686601970973074e+00 1.4798478073023662e+00 -3.4198064778882326e-01 -1.9599255169299086e+00 -1.3220886881228673e+00 -5.5094685639529661e-01 -3.6747096088353155e+00 -1.6831457257897013e+00 5.6741318416791087e-01 3.5160457733565140e+00 1.4158019147152059e+00 6.9293439612033347e-01 1.5142115411623824e+00 3.2741236431996952e+00 -1.1255236691454364e+00 -1.1614277628136973e+00 -3.4115581415713878e+00 -1.1223753661143263e+00 -1.5363183625593440e+00 -3.9461993205112593e+00 9.1262230888362361e-01 1.2634820849363968e+00 4.3616692644847701e+00 1.1232496408461379e+00 1.4660092411432832e+00 4.0305854828829037e+00 -8.0506023834150109e-01 -1.3020311857068125e+00 -4.5024765050890885e+00 -9.5975673110464710e-01 -1.6597274708774139e+00 -5.8872144480742108e+00 1.2839096588558170e+00 1.4158019147152057e+00 6.0810700246785760e+00 468 469 470 486 487 488 492 493 494 474 475 476 810 811 812 852 853 854 495 496 497 477 478 479 2.8316615782673411e+00 4.4188710575233636e-01 4.7996178890008767e-01 -2.8698973337039595e+00 -6.4321062825697861e-01 -7.5656652579617512e-01 -1.4949768778569232e+00 -4.9384984919091163e-01 -5.0608117876399927e-01 1.3868800522383626e+00 3.4278557062840276e-01 4.3488722231243276e-01 1.5022588180392156e+00 6.1630020959967746e-01 6.4591077122972818e-01 -1.4210328753458781e+00 -3.3623413643431260e-01 -4.4917771710525695e-01 -7.3426805379295601e-01 -3.5094254516249801e-01 -3.6792918827210080e-01 7.9937469215479695e-01 4.2326427306428444e-01 5.1899482749528358e-01 4.4188710575233625e-01 4.6001345177302220e+00 2.0265338485334881e+00 -6.3363297448407196e-01 -4.1713922673636485e+00 -1.8964135754871201e+00 -6.6780811754909131e-01 -2.9454435924107738e+00 -1.6548216413821089e+00 3.1305895513979975e-01 2.6157517777489194e+00 1.6916750646657563e+00 6.0959715086144850e-01 3.0192516869295938e+00 1.7620611391731080e+00 -3.6368776044280965e-01 -2.7566413420064508e+00 -1.9241246066446400e+00 -3.2352186240761854e-01 -2.2473618971941933e+00 -1.6644401211946687e+00 6.2410750313000574e-01 1.8857011165663309e+00 1.6595298923361854e+00 4.7996178890008756e-01 2.0265338485334885e+00 4.9167496097200187e+00 -7.4963581792253953e-01 -1.9090698522625764e+00 -4.9909821595300068e+00 -7.0038823962960350e-01 -1.7006605210041861e+00 -3.0320578803492548e+00 4.0558600843357362e-01 1.7238243691576718e+00 3.4500090976080848e+00 6.4723918151467419e-01 1.7781157072985607e+00 3.1534584983308269e+00 -4.3181167908512719e-01 -1.6970553565209388e+00 -3.5960903732131930e+00 -3.4518254262106918e-01 -1.6940892479234062e+00 -2.4437423223283359e+00 6.9423130041000258e-01 1.4724010527213860e+00 2.5426555297618596e+00 -2.8698973337039595e+00 -6.3363297448407196e-01 -7.4963581792253942e-01 3.1463047982772676e+00 7.4322874465228517e-01 1.0603020121673379e+00 1.6984611868516217e+00 7.0920623906802627e-01 8.5449782483600845e-01 -1.4971319078196748e+00 -5.4587388675078596e-01 -8.2971111575778389e-01 -1.7662034862087934e+00 -8.1008360553442982e-01 -8.9403540275820670e-01 1.5232647097558198e+00 5.1830615291445470e-01 7.4981377328410670e-01 8.1112458693455314e-01 6.4575259773257465e-01 7.0330650581022192e-01 -1.0459225540868340e+00 -6.2690326759805282e-01 -8.9453777965914516e-01 -6.4321062825697861e-01 -4.1713922673636485e+00 -1.9090698522625764e+00 7.4322874465228528e-01 3.9239576831840224e+00 1.7504922913041772e+00 7.1039693420013617e-01 2.6047481489360402e+00 1.5959234416182224e+00 -3.7593574879765235e-01 -2.3602352315459556e+00 -1.5765296819663930e+00 -7.3388316921460850e-01 -2.7137464121169348e+00 -1.5349334824271603e+00 5.0806976598792930e-01 2.4705969486582360e+00 1.6427676174318049e+00 4.0156130573319826e-01 1.9112274964583367e+00 1.4605804767405113e+00 -6.1022720430430843e-01 -1.6651563662100968e+00 -1.4292308104385865e+00 -7.5656652579617500e-01 -1.8964135754871208e+00 -4.9909821595300077e+00 1.0603020121673379e+00 1.7504922913041772e+00 5.1882123813395298e+00 8.4098544266257480e-01 1.5652352437128685e+00 3.1772659583339338e+00 -5.6648179533653265e-01 -1.5379744490864389e+00 -3.6510472916810146e+00 -9.4378787935185082e-01 -1.7946111760976018e+00 -3.2983017129996277e+00 7.4914859707219394e-01 1.6695724722985268e+00 3.7323103539696287e+00 4.9445722492914035e-01 1.6849382336009784e+00 2.5665133621993639e+00 -8.7805707634668684e-01 -1.4412390402453892e+00 -2.7239708916318071e+00 -1.4949768778569237e+00 -6.6780811754909120e-01 -7.0038823962960350e-01 1.6984611868516220e+00 7.1039693420013617e-01 8.4098544266257480e-01 3.0166190764545728e+00 8.3191759365956441e-01 8.4038325983156903e-01 -2.7507780621110030e+00 -5.2128019250810431e-01 -6.8212305413286767e-01 -1.0408256129952040e+00 -7.6151408599675507e-01 -7.5811810693345472e-01 8.1639153067482639e-01 5.4452740730530724e-01 7.6295771443025795e-01 1.4407701416336369e+00 5.4456712906927640e-01 5.6582610941443923e-01 -1.6856613826515268e+00 -6.8080666818033342e-01 -8.6952312564291490e-01 -4.9384984919091163e-01 -2.9454435924107738e+00 -1.7006605210041859e+00 7.0920623906802627e-01 2.6047481489360398e+00 1.5652352437128685e+00 8.3191759365956441e-01 4.3277769493364699e+00 1.7377929806450421e+00 -5.4696934797797414e-01 -3.9829485951969072e+00 -1.7564343264379416e+00 -7.6001086683004071e-01 -2.2114311702889409e+00 -1.5355649578530084e+00 4.3149560992421304e-01 1.9123500087890422e+00 1.7092267923447895e+00 5.6804452421619056e-01 2.8723886514568457e+00 1.6342016677464479e+00 -7.3983390286906636e-01 -2.5774404006217773e+00 -1.6537968791540119e+00 -5.0608117876399938e-01 -1.6548216413821089e+00 -3.0320578803492548e+00 8.5449782483600845e-01 1.5959234416182224e+00 3.1772659583339338e+00 8.4038325983156892e-01 1.7377929806450425e+00 4.3764654899270603e+00 -7.3767063118745124e-01 -1.8179227424897195e+00 -4.7354292544824821e+00 -7.5600502690079863e-01 -1.5343176920163386e+00 -2.1896787620177398e+00 5.2288760612231233e-01 1.4487123907280544e+00 2.5266455424046055e+00 6.0058806503113649e-01 1.6570808411725486e+00 2.9862280559996397e+00 -8.1859991896877593e-01 -1.4324475782757013e+00 -3.1094391498157621e+00 1.3868800522383626e+00 3.1305895513979981e-01 4.0558600843357362e-01 -1.4971319078196748e+00 -3.7593574879765240e-01 -5.6648179533653253e-01 -2.7507780621110030e+00 -5.4696934797797414e-01 -7.3767063118745124e-01 2.7578408121693396e+00 3.1520437870360685e-01 4.7293265819563907e-01 7.8111434878159103e-01 4.0175317006019834e-01 4.9099465971532763e-01 -7.4355322380297428e-01 -2.6474129893674714e-01 -3.9631885883299822e-01 -1.3673995803006720e+00 -3.1112563583749453e-01 -3.5983580158383355e-01 1.4330275608450302e+00 4.6875552764626333e-01 6.9079376059627506e-01 3.4278557062840276e-01 2.6157517777489194e+00 1.7238243691576718e+00 -5.4587388675078596e-01 -2.3602352315459556e+00 -1.5379744490864387e+00 -5.2128019250810442e-01 -3.9829485951969072e+00 -1.8179227424897195e+00 3.1520437870360685e-01 3.8414738299248028e+00 1.7643692198675265e+00 5.3568346646463083e-01 1.8731542813466500e+00 1.4245109892007772e+00 -2.8555648878465184e-01 -1.6991673624071530e+00 -1.5332346070077001e+00 -2.7580050035034603e-01 -2.6134628539315381e+00 -1.5501717260210475e+00 4.3483765259724660e-01 2.3254341540611811e+00 1.5265989463789300e+00 4.3488722231243276e-01 1.6916750646657566e+00 3.4500090976080848e+00 -8.2971111575778389e-01 -1.5765296819663930e+00 -3.6510472916810146e+00 -6.8212305413286756e-01 -1.7564343264379416e+00 -4.7354292544824812e+00 4.7293265819563918e-01 1.7643692198675263e+00 5.3366844894952870e+00 7.7741747452277488e-01 1.7345996196757183e+00 2.5220369210860603e+00 -4.4018322373928154e-01 -1.5794556408543041e+00 -3.0224107660882713e+00 -3.8507487191287149e-01 -1.8252328411925991e+00 -3.4186745540010373e+00 6.5185491051195599e-01 1.5470085862422356e+00 3.5188313580633723e+00 1.5022588180392156e+00 6.0959715086144850e-01 6.4723918151467408e-01 -1.7662034862087936e+00 -7.3388316921460850e-01 -9.4378787935185082e-01 -1.0408256129952040e+00 -7.6001086683004071e-01 -7.5600502690079863e-01 7.8111434878159103e-01 5.3568346646463094e-01 7.7741747452277477e-01 3.1849444928395951e+00 9.3509944848690718e-01 9.3969284880600257e-01 -2.8695964003988732e+00 -6.2616945749650454e-01 -8.1130790538804287e-01 -1.4899524804108268e+00 -7.0058362779595795e-01 -7.2902207360930049e-01 1.6982603203532955e+00 7.4026705552412508e-01 8.7577338040654140e-01 6.1630020959967735e-01 3.0192516869295938e+00 1.7781157072985603e+00 -8.1008360553442982e-01 -2.7137464121169348e+00 -1.7946111760976016e+00 -7.6151408599675496e-01 -2.2114311702889409e+00 -1.5343176920163386e+00 4.0175317006019834e-01 1.8731542813466500e+00 1.7345996196757183e+00 9.3509944848690707e-01 4.6525094409269361e+00 1.9366360087161405e+00 -6.2015191912951484e-01 -4.2480818182997817e+00 -1.9903070680050623e+00 -4.9213542575551150e-01 -3.0293553421137505e+00 -1.7691427780706055e+00 7.3073220826942742e-01 2.6576993336162262e+00 1.6390273784991880e+00 6.4591077122972818e-01 1.7620611391731080e+00 3.1534584983308269e+00 -8.9403540275820670e-01 -1.5349334824271603e+00 -3.2983017129996264e+00 -7.5811810693345472e-01 -1.5355649578530084e+00 -2.1896787620177398e+00 4.9099465971532763e-01 1.4245109892007770e+00 2.5220369210860603e+00 9.3969284880600268e-01 1.9366360087161403e+00 4.6836793992092876e+00 -7.9761493920092585e-01 -1.9743436371946821e+00 -5.0097072096263195e+00 -4.9688791595478027e-01 -1.7245437731401461e+00 -3.0863969894734717e+00 8.7005808509630789e-01 1.6461777135249711e+00 3.2249098554909827e+00 -1.4210328753458781e+00 -3.6368776044280965e-01 -4.3181167908512719e-01 1.5232647097558198e+00 5.0806976598792930e-01 7.4914859707219394e-01 8.1639153067482650e-01 4.3149560992421299e-01 5.2288760612231233e-01 -7.4355322380297428e-01 -2.8555648878465179e-01 -4.4018322373928148e-01 -2.8695964003988732e+00 -6.2015191912951484e-01 -7.9761493920092585e-01 2.8030722803572341e+00 3.8957563766794012e-01 5.6593684700993441e-01 1.4000018680126303e+00 3.6320461865502029e-01 4.4805147629746245e-01 -1.5085478892527844e+00 -4.2294946387812632e-01 -6.1641468447656877e-01 -3.3623413643431260e-01 -2.7566413420064508e+00 -1.6970553565209388e+00 5.1830615291445448e-01 2.4705969486582360e+00 1.6695724722985268e+00 5.4452740730530724e-01 1.9123500087890419e+00 1.4487123907280541e+00 -2.6474129893674714e-01 -1.6991673624071530e+00 -1.5794556408543041e+00 -6.2616945749650466e-01 -4.2480818182997808e+00 -1.9743436371946823e+00 3.8957563766794012e-01 4.0275170691809086e+00 1.9571627896681352e+00 3.3761765915778574e-01 2.7157127499568401e+00 1.7839154428375301e+00 -5.6288196417792258e-01 -2.4222862538716416e+00 -1.6085084609623217e+00 -4.4917771710525695e-01 -1.9241246066446400e+00 -3.5960903732131926e+00 7.4981377328410670e-01 1.6427676174318049e+00 3.7323103539696278e+00 7.6295771443025795e-01 1.7092267923447892e+00 2.5266455424046055e+00 -3.9631885883299822e-01 -1.5332346070077001e+00 -3.0224107660882713e+00 -8.1130790538804287e-01 -1.9903070680050619e+00 -5.0097072096263195e+00 5.6593684700993441e-01 1.9571627896681356e+00 5.5558660008241336e+00 4.1568111617212689e-01 1.7776758160289878e+00 3.5034480557498600e+00 -8.3758496957012663e-01 -1.6391667338163154e+00 -3.6900616040204444e+00 -7.3426805379295590e-01 -3.2352186240761854e-01 -3.4518254262106918e-01 8.1112458693455325e-01 4.0156130573319826e-01 4.9445722492914035e-01 1.4407701416336369e+00 5.6804452421619056e-01 6.0058806503113649e-01 -1.3673995803006722e+00 -2.7580050035034603e-01 -3.8507487191287149e-01 -1.4899524804108268e+00 -4.9213542575551150e-01 -4.9688791595478021e-01 1.4000018680126303e+00 3.3761765915778574e-01 4.1568111617212689e-01 2.6961701583959909e+00 3.9593097626329304e-01 4.2209052567206451e-01 -2.7564466404723564e+00 -6.1169667685699158e-01 -7.0567160131574747e-01 -3.5094254516249801e-01 -2.2473618971941933e+00 -1.6940892479234064e+00 6.4575259773257454e-01 1.9112274964583369e+00 1.6849382336009784e+00 5.4456712906927640e-01 2.8723886514568457e+00 1.6570808411725486e+00 -3.1112563583749453e-01 -2.6134628539315381e+00 -1.8252328411925989e+00 -7.0058362779595784e-01 -3.0293553421137505e+00 -1.7245437731401458e+00 3.6320461865502029e-01 2.7157127499568401e+00 1.7776758160289881e+00 3.9593097626329304e-01 4.4506388695550019e+00 1.9584178582593614e+00 -5.8680351292421251e-01 -4.0597876741875414e+00 -1.8342468868057251e+00 -3.6792918827210086e-01 -1.6644401211946684e+00 -2.4437423223283359e+00 7.0330650581022203e-01 1.4605804767405113e+00 2.5665133621993639e+00 5.6582610941443923e-01 1.6342016677464477e+00 2.9862280559996401e+00 -3.5983580158383355e-01 -1.5501717260210475e+00 -3.4186745540010377e+00 -7.2902207360930049e-01 -1.7691427780706053e+00 -3.0863969894734726e+00 4.4805147629746245e-01 1.7839154428375303e+00 3.5034480557498600e+00 4.2209052567206440e-01 1.9584178582593617e+00 4.6925332836386033e+00 -6.8248755372895187e-01 -1.8533608202975294e+00 -4.7999088917846198e+00 7.9937469215479695e-01 6.2410750313000585e-01 6.9423130041000247e-01 -1.0459225540868338e+00 -6.1022720430430843e-01 -8.7805707634668695e-01 -1.6856613826515270e+00 -7.3983390286906625e-01 -8.1859991896877593e-01 1.4330275608450305e+00 4.3483765259724660e-01 6.5185491051195599e-01 1.6982603203532953e+00 7.3073220826942742e-01 8.7005808509630789e-01 -1.5085478892527844e+00 -5.6288196417792258e-01 -8.3758496957012663e-01 -2.7564466404723569e+00 -5.8680351292421251e-01 -6.8248755372895187e-01 3.0659158931103785e+00 7.1006922027882990e-01 1.0005852225962744e+00 4.2326427306428449e-01 1.8857011165663311e+00 1.4724010527213862e+00 -6.2690326759805282e-01 -1.6651563662100968e+00 -1.4412390402453892e+00 -6.8080666818033331e-01 -2.5774404006217768e+00 -1.4324475782757005e+00 4.6875552764626338e-01 2.3254341540611811e+00 1.5470085862422358e+00 7.4026705552412508e-01 2.6576993336162262e+00 1.6461777135249713e+00 -4.2294946387812632e-01 -2.4222862538716416e+00 -1.6391667338163154e+00 -6.1169667685699136e-01 -4.0597876741875414e+00 -1.8533608202975294e+00 7.1006922027882990e-01 3.8558360906473186e+00 1.7006268201463415e+00 5.1899482749528358e-01 1.6595298923361850e+00 2.5426555297618596e+00 -8.9453777965914505e-01 -1.4292308104385865e+00 -2.7239708916318066e+00 -8.6952312564291490e-01 -1.6537968791540121e+00 -3.1094391498157616e+00 6.9079376059627506e-01 1.5265989463789300e+00 3.5188313580633723e+00 8.7577338040654140e-01 1.6390273784991878e+00 3.2249098554909836e+00 -6.1641468447656877e-01 -1.6085084609623219e+00 -3.6900616040204444e+00 -7.0567160131574747e-01 -1.8342468868057253e+00 -4.7999088917846198e+00 1.0005852225962746e+00 1.7006268201463417e+00 5.0369837939364182e+00 486 487 488 894 895 896 507 508 509 492 493 494 852 853 854 897 898 899 510 511 512 495 496 497 2.6397311969370159e+00 4.0865926334422153e-01 4.4050484425414776e-01 -2.6701630631182618e+00 -6.1196483340950947e-01 -7.1577533160793838e-01 -1.4323726985440810e+00 -4.7143690409532935e-01 -4.7740025805789560e-01 1.3251998144449286e+00 3.1749287771403090e-01 4.0281296089806046e-01 1.4014821242866498e+00 5.8913508192396480e-01 6.1205254792597186e-01 -1.3226127858853083e+00 -3.0783720105900564e-01 -4.1427173468623862e-01 -7.0288848431359241e-01 -3.2602086899536836e-01 -3.3850071703026396e-01 7.6162389619264981e-01 4.0197258457699570e-01 4.9057768830415649e-01 4.0865926334422148e-01 4.3579719730118116e+00 1.9439500105198924e+00 -6.1267676651585046e-01 -3.9142598594256643e+00 -1.8122469237577559e+00 -6.4843736963743748e-01 -2.8499507169553078e+00 -1.5895077398304740e+00 2.9207641726828226e-01 2.5100291059307023e+00 1.6293365845152803e+00 5.9176299847385394e-01 2.8781830889243443e+00 1.6901107806337374e+00 -3.3522760867775525e-01 -2.6087659825060459e+00 -1.8575730501779824e+00 -3.0254886442789769e-01 -2.1817546168116113e+00 -1.6052950503316170e+00 6.0639193017258497e-01 1.8085470078317742e+00 1.6012253884289191e+00 4.4050484425414765e-01 1.9439500105198930e+00 4.6308504441515792e+00 -7.1998074357168829e-01 -1.8212566947956998e+00 -4.6983108279099151e+00 -6.7537534681359035e-01 -1.6422924993984527e+00 -2.8999375060788570e+00 3.7883373645934526e-01 1.6627675793373764e+00 3.3187996173150749e+00 6.2385280006105415e-01 1.7071966278264135e+00 2.9735429573606811e+00 -3.9648683912983557e-01 -1.6227206258055129e+00 -3.4213206606459425e+00 -3.2052161866656254e-01 -1.6379667719749220e+00 -2.3452201476023768e+00 6.6917316740713162e-01 1.4103223742909057e+00 2.4415961234097581e+00 -2.6701630631182618e+00 -6.1267676651585035e-01 -7.1998074357168829e-01 2.9583301586436370e+00 7.1620243694946506e-01 1.0312868193823108e+00 1.6418425766943205e+00 6.9326343468197205e-01 8.3370858787214452e-01 -1.4347389370739088e+00 -5.2537815565543122e-01 -8.0945220951671193e-01 -1.6749733423245718e+00 -7.9199789291699396e-01 -8.6823870246041635e-01 1.4202915205955404e+00 4.9752827513439862e-01 7.2787112636574391e-01 7.7662288492820952e-01 6.3127778123450040e-01 6.8171222510240215e-01 -1.0172117983449653e+00 -6.0821911291206077e-01 -8.7690710317378506e-01 -6.1196483340950947e-01 -3.9142598594256648e+00 -1.8212566947956996e+00 7.1620243694946495e-01 3.6661649502235818e+00 1.6594348363932290e+00 6.9117108473823330e-01 2.4978826622598400e+00 1.5318160402411907e+00 -3.5603845026849718e-01 -2.2501572245488459e+00 -1.5113724098993484e+00 -7.1311589112830676e-01 -2.5642143596706402e+00 -1.4583495783071652e+00 4.7924353884737525e-01 2.3162654687787838e+00 1.5673702423153695e+00 3.8414046932913559e-01 1.8338441199004241e+00 1.3982347134340041e+00 -5.8963835505789708e-01 -1.5855257575174775e+00 -1.3658771493815796e+00 -7.1577533160793816e-01 -1.8122469237577554e+00 -4.6983108279099159e+00 1.0312868193823110e+00 1.6594348363932285e+00 4.8974528877148815e+00 8.1604817747854708e-01 1.5007878604257154e+00 3.0428590347809674e+00 -5.4205631933821707e-01 -1.4673951411785531e+00 -3.5208209594991540e+00 -9.1986115968824600e-01 -1.7234230614897181e+00 -3.1169705340464966e+00 7.1484699716497124e-01 1.5920274562643728e+00 3.5547375921081832e+00 4.7094056498712283e-01 1.6251654185310418e+00 2.4649509893529054e+00 -8.5542974837855257e-01 -1.3743504451883322e+00 -2.6238981825013732e+00 -1.4323726985440810e+00 -6.4843736963743748e-01 -6.7537534681359035e-01 1.6418425766943205e+00 6.9117108473823319e-01 8.1604817747854719e-01 2.9901213382924476e+00 8.1850506096545339e-01 8.1787267181507106e-01 -2.7140256426573575e+00 -4.9715700772174126e-01 -6.5367455768491523e-01 -1.0138730270772691e+00 -7.4537352265855983e-01 -7.3403309068169165e-01 7.7870403550835132e-01 5.2260776259647557e-01 7.4073269763314165e-01 1.4199384437479432e+00 5.2244826770071628e-01 5.3798894213750592e-01 -1.6703350259643563e+00 -6.6376427598314014e-01 -8.4955949388406893e-01 -4.7143690409532935e-01 -2.8499507169553078e+00 -1.6422924993984522e+00 6.9326343468197194e-01 2.4978826622598400e+00 1.5007878604257154e+00 8.1850506096545328e-01 4.2655953151005699e+00 1.6799744620451458e+00 -5.3214564866031844e-01 -3.9073146395141007e+00 -1.6956808493661299e+00 -7.4818903414957039e-01 -2.1444892479493034e+00 -1.4762327803326167e+00 4.0776933126245302e-01 1.8353225115355980e+00 1.6526372254114199e+00 5.5708763081569246e-01 2.8214354817149410e+00 1.5783024408965169e+00 -7.2485387082035402e-01 -2.5184813661922378e+00 -1.5974958596815994e+00 -4.7740025805789554e-01 -1.5895077398304736e+00 -2.8999375060788570e+00 8.3370858787214464e-01 1.5318160402411904e+00 3.0428590347809674e+00 8.1787267181507117e-01 1.6799744620451458e+00 4.2778319975642454e+00 -7.2389594907979549e-01 -1.7655684267875151e+00 -4.6345463102885498e+00 -7.3450308298797684e-01 -1.4715628906551821e+00 -2.0874830212846618e+00 4.9684062516155858e-01 1.3868847512490616e+00 2.4246730266009915e+00 5.8504618945938991e-01 1.6026258863255392e+00 2.9020380348155967e+00 -7.9766878418249743e-01 -1.3746620825877667e+00 -3.0254352561097342e+00 1.3251998144449286e+00 2.9207641726828226e-01 3.7883373645934532e-01 -1.4347389370739088e+00 -3.5603845026849718e-01 -5.4205631933821707e-01 -2.7140256426573575e+00 -5.3214564866031844e-01 -7.2389594907979549e-01 2.7289055862418734e+00 2.9517109442520012e-01 4.4688688980604652e-01 7.4538653482283534e-01 3.8187287291319671e-01 4.6942004755483552e-01 -7.1102787449693849e-01 -2.4461039933964593e-01 -3.7042121503381470e-01 -1.3504538903628405e+00 -2.9075576995143626e-01 -3.3578983440940002e-01 1.4107544090814081e+00 4.5442988361321890e-01 6.7702264404100032e-01 3.1749287771403079e-01 2.5100291059307023e+00 1.6627675793373764e+00 -5.2537815565543122e-01 -2.2501572245488459e+00 -1.4673951411785531e+00 -4.9715700772174143e-01 -3.9073146395141007e+00 -1.7655684267875154e+00 2.9517109442520012e-01 3.7680558525827554e+00 1.7038135667795125e+00 5.1644720447763837e-01 1.7952642564611625e+00 1.3627276933342123e+00 -2.6136411324263231e-01 -1.6209313344081684e+00 -1.4691098917469669e+00 -2.5616761989223036e-01 -2.5565946204663419e+00 -1.4950345600707404e+00 4.1095571989516722e-01 2.2616486039628363e+00 1.4677991803326755e+00 4.0281296089806046e-01 1.6293365845152805e+00 3.3187996173150749e+00 -8.0945220951671193e-01 -1.5113724098993484e+00 -3.5208209594991540e+00 -6.5367455768491511e-01 -1.6956808493661297e+00 -4.6345463102885498e+00 4.4688688980604652e-01 1.7038135667795122e+00 5.2504226464721375e+00 7.5847080963186475e-01 1.6761598059721214e+00 2.4173486296258533e+00 -4.0857425240876111e-01 -1.5170072495444684e+00 -2.9293591094348170e+00 -3.5961528901159906e-01 -1.7710980545030894e+00 -3.3407441315698714e+00 6.2314564828601759e-01 1.4858486060461229e+00 3.4388996173793260e+00 1.4014821242866498e+00 5.9176299847385394e-01 6.2385280006105426e-01 -1.6749733423245716e+00 -7.1311589112830664e-01 -9.1986115968824622e-01 -1.0138730270772691e+00 -7.4818903414957039e-01 -7.3450308298797695e-01 7.4538653482283523e-01 5.1644720447763826e-01 7.5847080963186475e-01 3.0159305412814046e+00 9.1440254860190950e-01 9.0791270441260175e-01 -2.6844994834502391e+00 -5.9977922827483965e-01 -7.8443836822750868e-01 -1.4354130950509572e+00 -6.8483762787372915e-01 -7.0557556355347084e-01 1.6459597475121484e+00 7.2330902987304457e-01 8.5414186035168238e-01 5.8913508192396491e-01 2.8781830889243438e+00 1.7071966278264135e+00 -7.9199789291699396e-01 -2.5642143596706406e+00 -1.7234230614897181e+00 -7.4537352265855994e-01 -2.1444892479493034e+00 -1.4715628906551821e+00 3.8187287291319671e-01 1.7952642564611625e+00 1.6761598059721214e+00 9.1440254860190939e-01 4.4233084056782888e+00 1.8493710803340204e+00 -5.8630920807159226e-01 -4.0046631906213346e+00 -1.9077975691818132e+00 -4.7226009459410806e-01 -2.9374274734105237e+00 -1.7025229740510381e+00 7.1053021480218503e-01 2.5540385205880085e+00 1.5725789812451969e+00 6.1205254792597175e-01 1.6901107806337374e+00 2.9735429573606811e+00 -8.6823870246041612e-01 -1.4583495783071652e+00 -3.1169705340464966e+00 -7.3403309068169176e-01 -1.4762327803326167e+00 -2.0874830212846618e+00 4.6942004755483552e-01 1.3627276933342123e+00 2.4173486296258533e+00 9.0791270441260152e-01 1.8493710803340204e+00 4.4094453424796471e+00 -7.5929248781915204e-01 -1.8859075552411124e+00 -4.7312727612206151e+00 -4.7303576617766541e-01 -1.6623537703288562e+00 -2.9573313923921547e+00 8.4521474724551793e-01 1.5806341299077806e+00 3.0927207794777463e+00 -1.3226127858853083e+00 -3.3522760867775520e-01 -3.9648683912983562e-01 1.4202915205955404e+00 4.7924353884737519e-01 7.1484699716497124e-01 7.7870403550835121e-01 4.0776933126245302e-01 4.9684062516155858e-01 -7.1102787449693861e-01 -2.6136411324263231e-01 -4.0857425240876111e-01 -2.6844994834502391e+00 -5.8630920807159226e-01 -7.5929248781915204e-01 2.6226976802757997e+00 3.5693690552526613e-01 5.2407692631353375e-01 1.3446709088967150e+00 3.3675413201955096e-01 4.1598469320819231e-01 -1.4482240014439203e+00 -3.9780297766266559e-01 -5.8739566249050723e-01 -3.0783720105900564e-01 -2.6087659825060459e+00 -1.6227206258055127e+00 4.9752827513439879e-01 2.3162654687787838e+00 1.5920274562643728e+00 5.2260776259647557e-01 1.8353225115355980e+00 1.3868847512490614e+00 -2.4461039933964593e-01 -1.6209313344081688e+00 -1.5170072495444684e+00 -5.9977922827483965e-01 -4.0046631906213328e+00 -1.8859075552411126e+00 3.5693690552526619e-01 3.7839757464875543e+00 1.8681137114545296e+00 3.1508785519459653e-01 2.6138910261682824e+00 1.7207234392839150e+00 -5.3993396977724717e-01 -2.3150942454346715e+00 -1.5421139276607860e+00 -4.1427173468623862e-01 -1.8575730501779826e+00 -3.4213206606459421e+00 7.2787112636574391e-01 1.5673702423153695e+00 3.5547375921081832e+00 7.4073269763314165e-01 1.6526372254114197e+00 2.4246730266009919e+00 -3.7042121503381475e-01 -1.4691098917469667e+00 -2.9293591094348170e+00 -7.8443836822750868e-01 -1.9077975691818128e+00 -4.7312727612206151e+00 5.2407692631353375e-01 1.8681137114545296e+00 5.2892029219357424e+00 3.8861683371719469e-01 1.7143375239986696e+00 3.3788411117077199e+00 -8.1216626608205389e-01 -1.5679781920732272e+00 -3.5655021210512636e+00 -7.0288848431359241e-01 -3.0254886442789769e-01 -3.2052161866656254e-01 7.7662288492820952e-01 3.8414046932913565e-01 4.7094056498712283e-01 1.4199384437479434e+00 5.5708763081569246e-01 5.8504618945938991e-01 -1.3504538903628405e+00 -2.5616761989223036e-01 -3.5961528901159900e-01 -1.4354130950509572e+00 -4.7226009459410806e-01 -4.7303576617766541e-01 1.3446709088967150e+00 3.1508785519459653e-01 3.8861683371719469e-01 2.6741555730204536e+00 3.7477542933387720e-01 3.9700852159269628e-01 -2.7266323408659314e+00 -6.0011480575906584e-01 -6.8843943590057710e-01 -3.2602086899536831e-01 -2.1817546168116113e+00 -1.6379667719749220e+00 6.3127778123450040e-01 1.8338441199004245e+00 1.6251654185310418e+00 5.2244826770071640e-01 2.8214354817149405e+00 1.6026258863255394e+00 -2.9075576995143632e-01 -2.5565946204663419e+00 -1.7710980545030894e+00 -6.8483762787372904e-01 -2.9374274734105237e+00 -1.6623537703288558e+00 3.3675413201955096e-01 2.6138910261682828e+00 1.7143375239986696e+00 3.7477542933387714e-01 4.3959110980049187e+00 1.9025285550880484e+00 -5.6364134346811279e-01 -3.9893050151000891e+00 -1.7732387871364323e+00 -3.3850071703026396e-01 -1.6052950503316172e+00 -2.3452201476023768e+00 6.8171222510240204e-01 1.3982347134340041e+00 2.4649509893529054e+00 5.3798894213750592e-01 1.5783024408965172e+00 2.9020380348155963e+00 -3.3578983440940002e-01 -1.4950345600707404e+00 -3.3407441315698714e+00 -7.0557556355347084e-01 -1.7025229740510381e+00 -2.9573313923921547e+00 4.1598469320819237e-01 1.7207234392839152e+00 3.3788411117077199e+00 3.9700852159269634e-01 1.9025285550880480e+00 4.6039511413859868e+00 -6.5282826704766361e-01 -1.7969365642490891e+00 -4.7064856056978064e+00 7.6162389619264981e-01 6.0639193017258497e-01 6.6917316740713151e-01 -1.0172117983449653e+00 -5.8963835505789708e-01 -8.5542974837855268e-01 -1.6703350259643563e+00 -7.2485387082035413e-01 -7.9766878418249743e-01 1.4107544090814081e+00 4.1095571989516722e-01 6.2314564828601759e-01 1.6459597475121484e+00 7.1053021480218503e-01 8.4521474724551793e-01 -1.4482240014439203e+00 -5.3993396977724717e-01 -8.1216626608205389e-01 -2.7266323408659314e+00 -5.6364134346811290e-01 -6.5282826704766350e-01 3.0440651138329682e+00 6.9018967425367428e-01 9.8055950275210113e-01 4.0197258457699570e-01 1.8085470078317740e+00 1.4103223742909057e+00 -6.0821911291206077e-01 -1.5855257575174775e+00 -1.3743504451883322e+00 -6.6376427598314014e-01 -2.5184813661922378e+00 -1.3746620825877669e+00 4.5442988361321884e-01 2.2616486039628358e+00 1.4858486060461227e+00 7.2330902987304457e-01 2.5540385205880085e+00 1.5806341299077808e+00 -3.9780297766266559e-01 -2.3150942454346710e+00 -1.5679781920732272e+00 -6.0011480575906573e-01 -3.9893050151000891e+00 -1.7969365642490889e+00 6.9018967425367428e-01 3.7841722518618575e+00 1.6371221738536066e+00 4.9057768830415655e-01 1.6012253884289191e+00 2.4415961234097576e+00 -8.7690710317378506e-01 -1.3658771493815796e+00 -2.6238981825013732e+00 -8.4955949388406893e-01 -1.5974958596815994e+00 -3.0254352561097342e+00 6.7702264404100032e-01 1.4677991803326755e+00 3.4388996173793260e+00 8.5414186035168238e-01 1.5725789812451967e+00 3.0927207794777467e+00 -5.8739566249050723e-01 -1.5421139276607858e+00 -3.5655021210512636e+00 -6.8843943590057699e-01 -1.7732387871364321e+00 -4.7064856056978064e+00 9.8055950275210113e-01 1.6371221738536068e+00 4.9481046450933484e+00 780 781 782 822 823 824 834 835 836 792 793 794 783 784 785 825 826 827 837 838 839 795 796 797 3.3437593424066487e+00 1.8614831712627542e-02 1.1657549012044573e-01 -3.2713584912596776e+00 -7.7780007409981186e-02 -4.9917095810418982e-01 -1.6839637610745024e+00 -5.3375703471871407e-02 -2.8563663553048541e-01 1.6475104852170308e+00 9.8262283406573871e-03 9.5883215487552215e-02 1.6094141223792096e+00 7.8625133647942547e-02 4.4457574014113216e-01 -1.6149717527166245e+00 -3.4126961818322487e-03 -6.4092267203333372e-02 -8.2829927117086899e-01 -1.3300951140066561e-02 -6.8019353511557634e-02 7.9790932621878541e-01 4.0803164502523935e-02 2.5988476860043613e-01 1.8614831712627546e-02 3.4900808156011829e+00 8.5903296303407450e-01 -7.3263369839228834e-02 -3.2709150913455622e+00 -4.7223669397699131e-01 -1.0538997465370165e-01 -1.8109501602748956e+00 -7.9223615892263977e-01 8.9094990981097057e-03 1.6551473488246498e+00 4.1820635089917846e-01 7.4932151711150891e-02 1.7362412967158776e+00 7.7030545574851694e-01 -9.2184996011828429e-03 -1.6343455914004701e+00 -5.9296868402691871e-01 -1.3173842563770704e-02 -9.6316794433956721e-01 -7.4480465971109067e-01 9.8589204135995867e-02 7.9790932621878541e-01 5.5470142695587032e-01 1.1657549012044574e-01 8.5903296303407461e-01 8.2848546349839598e+00 -4.8183014831616855e-01 -5.0069380066371982e-01 -8.1896784667550744e+00 -5.8000985811127048e-01 -8.0360010105699331e-01 -5.9863322684794440e+00 9.5311019786234741e-02 4.5912834011010095e-01 6.0966072736249579e+00 4.2888526157767820e-01 7.7296731487912107e-01 5.9496470219332513e+00 -6.5184733717183113e-02 -2.9122763307727056e-01 -6.1079425032852663e+00 -6.8448458295605863e-02 -7.5549185182574807e-01 -4.9657811928442879e+00 5.5470142695586921e-01 2.5988476860043608e-01 4.9186255008219035e+00 -3.2713584912596776e+00 -7.3263369839228834e-02 -4.8183014831616838e-01 3.4423414083606860e+00 1.8422812993338221e-02 8.6341474364498416e-01 1.7960889588642344e+00 7.4428566943938165e-02 7.7083461227229200e-01 -1.6828553052620823e+00 -8.9659664475501919e-03 -5.9298710886892991e-01 -1.7656381296738726e+00 -1.0750817275334459e-01 -8.0691298599733341e-01 1.6211763896932494e+00 9.4831787742272362e-03 4.4241797268403937e-01 8.2341311361703029e-01 1.0070390146868639e-01 5.6055476640686519e-01 -9.6316794433956754e-01 -1.3300951140066537e-02 -7.5549185182574863e-01 -7.7780007409981186e-02 -3.2709150913455622e+00 -5.0069380066371993e-01 1.8422812993338221e-02 3.2935816113933987e+00 1.1394708000946761e-01 7.8949565444369749e-02 1.6691324276127890e+00 4.4864532895386794e-01 -3.4008235369293411e-03 -1.6633829123291703e+00 -6.3873965789732451e-02 -5.3315509051430600e-02 -1.6363743394253436e+00 -2.8518284339481575e-01 9.4580479291891048e-03 1.6128444616477260e+00 9.4981553973181199e-02 4.0839756195214912e-02 8.2341311361703029e-01 2.6062510520735815e-01 -1.3173842563770848e-02 -8.2829927117086899e-01 -6.8448458295606918e-02 -4.9917095810418977e-01 -4.7223669397699136e-01 -8.1896784667550726e+00 8.6341474364498416e-01 1.1394708000946760e-01 8.2182523008511943e+00 7.6724879573107585e-01 4.1810124744945082e-01 5.9848194153398024e+00 -2.9049165163415691e-01 -6.1810029460860560e-02 -6.1272670748314617e+00 -8.0552519816492107e-01 -5.8614347666403754e-01 -5.9673665906171340e+00 4.4870382303094042e-01 9.5606459747662992e-02 6.0952716489399386e+00 2.6062510520735738e-01 5.6055476640686419e-01 4.9517499599170209e+00 -7.4480465971109000e-01 -6.8019353511557273e-02 -4.9657811928442870e+00 -1.6839637610745024e+00 -1.0538997465370165e-01 -5.8000985811127048e-01 1.7960889588642344e+00 7.8949565444369749e-02 7.6724879573107585e-01 3.5438526429958688e+00 1.5061135481375179e-01 8.4316511864131716e-01 -3.3732316451567073e+00 -2.1220455336219933e-02 -4.7037725277159209e-01 -9.6403698661472093e-01 -1.3490124487312058e-01 -7.4018493515397177e-01 8.2310852364793385e-01 1.0897891132853884e-02 5.6565698527198405e-01 1.6691324276127968e+00 7.4428566943937874e-02 4.1810124744945043e-01 -1.8109501602749036e+00 -5.3375703471871323e-02 -8.0360010105699309e-01 -5.3375703471871407e-02 -1.8109501602748954e+00 -8.0360010105699342e-01 7.4428566943938165e-02 1.6691324276127890e+00 4.1810124744945076e-01 1.5061135481375182e-01 3.5438526429958697e+00 8.4316511864131716e-01 -2.1220455336220172e-02 -3.3732316451567073e+00 -4.7037725277159242e-01 -1.3490124487312041e-01 -9.6403698661472126e-01 -7.4018493515397199e-01 1.0897891132853832e-02 8.2310852364793397e-01 5.6565698527198394e-01 7.8949565444369776e-02 1.7960889588642421e+00 7.6724879573107618e-01 -1.0538997465370156e-01 -1.6839637610745108e+00 -5.8000985811127048e-01 -2.8563663553048541e-01 -7.9223615892263954e-01 -5.9863322684794440e+00 7.7083461227229189e-01 4.4864532895386794e-01 5.9848194153398016e+00 8.4316511864131716e-01 8.4316511864131727e-01 8.1703960304774856e+00 -5.1347615717788675e-01 -5.1347615717788597e-01 -8.2798272198428506e+00 -7.3566587262339567e-01 -7.3566587262339678e-01 -4.8376465008275167e+00 2.6436976438693011e-01 2.6436976438693088e-01 4.9501033964721621e+00 4.4864532895386816e-01 7.7083461227229144e-01 5.9848194153398131e+00 -7.9223615892263954e-01 -2.8563663553048585e-01 -5.9863322684794547e+00 1.6475104852170308e+00 8.9094990981097074e-03 9.5311019786234741e-02 -1.6828553052620823e+00 -3.4008235369293420e-03 -2.9049165163415686e-01 -3.3732316451567073e+00 -2.1220455336220176e-02 -5.1347615717788675e-01 3.4470304249058521e+00 4.4613788103327681e-03 1.1811692879695601e-01 7.9748797762787571e-01 1.0655634801800873e-02 2.6244405408240712e-01 -8.2770637382744849e-01 -2.6549573020099118e-04 -6.9222504502794810e-02 -1.6633829123291781e+00 -8.9659664475502387e-03 -6.1810029460861907e-02 1.6551473488246582e+00 9.8262283406574148e-03 4.5912834011010251e-01 9.8262283406573871e-03 1.6551473488246498e+00 4.5912834011010090e-01 -8.9659664475501971e-03 -1.6633829123291703e+00 -6.1810029460860547e-02 -2.1220455336219926e-02 -3.3732316451567073e+00 -5.1347615717788608e-01 4.4613788103327681e-03 3.4470304249058512e+00 1.1811692879695554e-01 1.0655634801800805e-02 7.9748797762787571e-01 2.6244405408240640e-01 -2.6549573020101703e-04 -8.2770637382744838e-01 -6.9222504502793852e-02 -3.4008235369293784e-03 -1.6828553052620903e+00 -2.9049165163415674e-01 8.9094990981095652e-03 1.6475104852170390e+00 9.5311019786234297e-02 9.5883215487552215e-02 4.1820635089917846e-01 6.0966072736249597e+00 -5.9298710886892980e-01 -6.3873965789732423e-02 -6.1272670748314617e+00 -4.7037725277159215e-01 -4.7037725277159259e-01 -8.2798272198428506e+00 1.1811692879695602e-01 1.1811692879695557e-01 8.5203382073230678e+00 5.6593878990960167e-01 5.6593878990960333e-01 4.9169139593221285e+00 -7.0906957663033482e-02 -7.0906957663034620e-02 -5.0961053443893363e+00 -6.3873965789731119e-02 -5.9298710886892914e-01 -6.1272670748314724e+00 4.1820635089917679e-01 9.5883215487552353e-02 6.0966072736249703e+00 1.6094141223792096e+00 7.4932151711150891e-02 4.2888526157767820e-01 -1.7656381296738726e+00 -5.3315509051430600e-02 -8.0552519816492107e-01 -9.6403698661472104e-01 -1.3490124487312041e-01 -7.3566587262339556e-01 7.9748797762787571e-01 1.0655634801800800e-02 5.6593878990960156e-01 3.4057114898744798e+00 1.5268257873584126e-01 8.5309020630874066e-01 -3.1828054308835059e+00 -2.1170572218840129e-02 -4.9354702522278748e-01 -1.6363743394253512e+00 -1.0750817275334430e-01 -5.8614347666403610e-01 1.7362412967158851e+00 7.8625133647942672e-02 7.7296731487911974e-01 7.8625133647942533e-02 1.7362412967158773e+00 7.7296731487912107e-01 -1.0750817275334459e-01 -1.6363743394253438e+00 -5.8614347666403743e-01 -1.3490124487312058e-01 -9.6403698661472148e-01 -7.3566587262339678e-01 1.0655634801800873e-02 7.9748797762787571e-01 5.6593878990960311e-01 1.5268257873584126e-01 3.4057114898744807e+00 8.5309020630874199e-01 -2.1170572218839927e-02 -3.1828054308835063e+00 -4.9354702522278882e-01 -5.3315509051430426e-02 -1.7656381296738801e+00 -8.0552519816492218e-01 7.4932151711150821e-02 1.6094141223792175e+00 4.2888526157767914e-01 4.4457574014113210e-01 7.7030545574851694e-01 5.9496470219332513e+00 -8.0691298599733341e-01 -2.8518284339481570e-01 -5.9673665906171331e+00 -7.4018493515397177e-01 -7.4018493515397199e-01 -4.8376465008275167e+00 2.6244405408240712e-01 2.6244405408240645e-01 4.9169139593221285e+00 8.5309020630874055e-01 8.5309020630874188e-01 8.0720617499468013e+00 -4.9813469173467539e-01 -4.9813469173467634e-01 -8.1158900710736468e+00 -2.8518284339481548e-01 -8.0691298599733341e-01 -5.9673665906171438e+00 7.7030545574851628e-01 4.4457574014113299e-01 5.9496470219332611e+00 -1.6149717527166245e+00 -9.2184996011828411e-03 -6.5184733717183099e-02 1.6211763896932496e+00 9.4580479291891013e-03 4.4870382303094031e-01 8.2310852364793397e-01 1.0897891132853830e-02 2.6436976438693016e-01 -8.2770637382744849e-01 -2.6549573020101497e-04 -7.0906957663033468e-02 -3.1828054308835059e+00 -2.1170572218839900e-02 -4.9813469173467545e-01 3.2026997738391403e+00 4.2281458957860391e-03 1.1677396902662943e-01 1.6128444616477344e+00 9.4831787742270732e-03 9.5606459747662353e-02 -1.6343455914004787e+00 -3.4126961818323007e-03 -2.9122763307727029e-01 -3.4126961818322491e-03 -1.6343455914004699e+00 -2.9122763307727062e-01 9.4831787742272362e-03 1.6128444616477260e+00 9.5606459747663006e-02 1.0897891132853886e-02 8.2310852364793397e-01 2.6436976438693088e-01 -2.6549573020099107e-04 -8.2770637382744838e-01 -7.0906957663034606e-02 -2.1170572218840129e-02 -3.1828054308835063e+00 -4.9813469173467634e-01 4.2281458957860382e-03 3.2026997738391403e+00 1.1677396902663009e-01 9.4580479291891013e-03 1.6211763896932581e+00 4.4870382303094203e-01 -9.2184996011828932e-03 -1.6149717527166336e+00 -6.5184733717184501e-02 -6.4092267203333386e-02 -5.9296868402691871e-01 -6.1079425032852654e+00 4.4241797268403932e-01 9.4981553973181171e-02 6.0952716489399386e+00 5.6565698527198405e-01 5.6565698527198405e-01 4.9501033964721621e+00 -6.9222504502794824e-02 -6.9222504502793852e-02 -5.0961053443893363e+00 -4.9354702522278748e-01 -4.9354702522278870e-01 -8.1158900710736468e+00 1.1677396902662948e-01 1.1677396902663012e-01 8.2872337276814747e+00 9.4981553973180588e-02 4.4241797268403782e-01 6.0952716489399501e+00 -5.9296868402691760e-01 -6.4092267203332817e-02 -6.1079425032852779e+00 -8.2829927117086899e-01 -1.3173842563770700e-02 -6.8448458295605891e-02 8.2341311361703029e-01 4.0839756195214919e-02 2.6062510520735738e-01 1.6691324276127968e+00 7.8949565444369776e-02 4.4864532895386811e-01 -1.6633829123291781e+00 -3.4008235369293819e-03 -6.3873965789731077e-02 -1.6363743394253512e+00 -5.3315509051430419e-02 -2.8518284339481548e-01 1.6128444616477344e+00 9.4580479291891013e-03 9.4981553973180602e-02 3.2935816113934315e+00 1.8422812993338103e-02 1.1394708000946746e-01 -3.2709150913455955e+00 -7.7780007409981394e-02 -5.0069380066372127e-01 -1.3300951140066564e-02 -9.6316794433956721e-01 -7.5549185182574830e-01 1.0070390146868639e-01 8.2341311361703029e-01 5.6055476640686419e-01 7.4428566943937888e-02 1.7960889588642419e+00 7.7083461227229144e-01 -8.9659664475502370e-03 -1.6828553052620903e+00 -5.9298710886892914e-01 -1.0750817275334430e-01 -1.7656381296738801e+00 -8.0691298599733330e-01 9.4831787742270749e-03 1.6211763896932581e+00 4.4241797268403799e-01 1.8422812993338110e-02 3.4423414083607176e+00 8.6341474364498449e-01 -7.3263369839228348e-02 -3.2713584912597105e+00 -4.8183014831616733e-01 -6.8019353511557648e-02 -7.4480465971109067e-01 -4.9657811928442861e+00 5.6055476640686519e-01 2.6062510520735815e-01 4.9517499599170209e+00 4.1810124744945043e-01 7.6724879573107607e-01 5.9848194153398131e+00 -6.1810029460861921e-02 -2.9049165163415674e-01 -6.1272670748314724e+00 -5.8614347666403599e-01 -8.0552519816492218e-01 -5.9673665906171438e+00 9.5606459747662381e-02 4.4870382303094197e-01 6.0952716489399501e+00 1.1394708000946746e-01 8.6341474364498438e-01 8.2182523008512334e+00 -4.7223669397698992e-01 -4.9917095810419188e-01 -8.1896784667551152e+00 7.9790932621878541e-01 9.8589204135995867e-02 5.5470142695586921e-01 -9.6316794433956754e-01 -1.3173842563770848e-02 -7.4480465971109000e-01 -1.8109501602749036e+00 -1.0538997465370158e-01 -7.9223615892263954e-01 1.6551473488246582e+00 8.9094990981095652e-03 4.1820635089917679e-01 1.7362412967158851e+00 7.4932151711150821e-02 7.7030545574851628e-01 -1.6343455914004787e+00 -9.2184996011828880e-03 -5.9296868402691760e-01 -3.2709150913455955e+00 -7.3263369839228348e-02 -4.7223669397698986e-01 3.4900808156012157e+00 1.8614831712627546e-02 8.5903296303407473e-01 4.0803164502523935e-02 7.9790932621878541e-01 2.5988476860043608e-01 -1.3300951140066537e-02 -8.2829927117086910e-01 -6.8019353511557260e-02 -5.3375703471871323e-02 -1.6839637610745108e+00 -2.8563663553048591e-01 9.8262283406574131e-03 1.6475104852170390e+00 9.5883215487552340e-02 7.8625133647942658e-02 1.6094141223792175e+00 4.4457574014113310e-01 -3.4126961818322973e-03 -1.6149717527166336e+00 -6.4092267203332817e-02 -7.7780007409981422e-02 -3.2713584912597105e+00 -4.9917095810419199e-01 1.8614831712627559e-02 3.3437593424066820e+00 1.1657549012044634e-01 2.5988476860043613e-01 5.5470142695587032e-01 4.9186255008219035e+00 -7.5549185182574863e-01 -6.8448458295606932e-02 -4.9657811928442861e+00 -8.0360010105699309e-01 -5.8000985811127037e-01 -5.9863322684794547e+00 4.5912834011010251e-01 9.5311019786234241e-02 6.0966072736249695e+00 7.7296731487911985e-01 4.2888526157767909e-01 5.9496470219332611e+00 -2.9122763307727029e-01 -6.5184733717184487e-02 -6.1079425032852779e+00 -5.0069380066372116e-01 -4.8183014831616733e-01 -8.1896784667551170e+00 8.5903296303407473e-01 1.1657549012044631e-01 8.2848546349840042e+00 822 823 824 864 865 866 876 877 878 834 835 836 825 826 827 867 868 869 879 880 881 837 838 839 3.2733855038603434e+00 1.6338098166775349e-02 1.0192616087546652e-01 -3.1941032489902339e+00 -7.8266158868407598e-02 -4.9255089075637293e-01 -1.5970784527935000e+00 -5.2183434976091431e-02 -2.7304251346864566e-01 1.5630157300945906e+00 7.8894513270243629e-03 8.2367740504301151e-02 1.6130926243243899e+00 7.9539574547348141e-02 4.4289354214830867e-01 -1.6241306764787375e+00 -3.1416298536589568e-03 -5.4519357463441345e-02 -8.0931414368459631e-01 -1.1550071843825400e-02 -5.7610371210908909e-02 7.7513266366774380e-01 4.1374171500835541e-02 2.5053568937129250e-01 1.6338098166775349e-02 3.4233118771473143e+00 8.5669237759056616e-01 -7.3646746607118826e-02 -3.1929714843707218e+00 -4.6562590747684696e-01 -1.0689794983908150e-01 -1.7286877454494978e+00 -7.9104267526842165e-01 7.0409570251288127e-03 1.5678586769818796e+00 4.1444722363594039e-01 7.3759335153144048e-02 1.7440582472893751e+00 7.6990076718375688e-01 -7.1904188311577855e-03 -1.6423587717280785e+00 -5.8931235324237397e-01 -9.9958091734122009e-03 -9.4634346353801513e-01 -7.4548988503012537e-01 1.0059253410572208e-01 7.7513266366774369e-01 5.5043045260750445e-01 1.0192616087546646e-01 8.5669237759056616e-01 8.1022807008207138e+00 -4.6577228614810900e-01 -4.8545333008159242e-01 -8.0020565805768982e+00 -5.7543789183801763e-01 -7.9672670316186511e-01 -5.7806501245989521e+00 7.6087162255462581e-02 4.4073267036876285e-01 5.9019171479833545e+00 4.1157342205385927e-01 7.6617671813069876e-01 5.8642934329183465e+00 -4.9613082093513075e-02 -2.8500228569300129e-01 -6.0355625391501881e+00 -4.9193937712652319e-02 -7.4695513652486056e-01 -4.8525133003214229e+00 5.5043045260750345e-01 2.5053568937129117e-01 4.8022912629250429e+00 -3.1941032489902339e+00 -7.3646746607118840e-02 -4.6577228614810900e-01 3.3700020328384293e+00 1.5127282960809707e-02 8.5539564461617723e-01 1.7122610906261515e+00 7.4503833426606797e-02 7.6066045709637686e-01 -1.5972029922315472e+00 -7.0718827476552283e-03 -5.8331420023623304e-01 -1.7729710789085078e+00 -1.0692156533266163e-01 -7.9835042623679275e-01 1.6276030495976066e+00 8.4242159783455561e-03 4.2749629361825242e-01 8.0075461060611675e-01 1.0113493416549892e-01 5.5083965381519007e-01 -9.4634346353801491e-01 -1.1550071843825208e-02 -7.4695513652486167e-01 -7.8266158868407584e-02 -3.1929714843707218e+00 -4.8545333008159242e-01 1.5127282960809705e-02 3.2201260629266741e+00 9.4331957324442564e-02 7.7224124610773881e-02 1.5806850267726726e+00 4.3049711757822090e-01 -1.4254616000049796e-03 -1.5802596443105787e+00 -4.1479564038522598e-02 -5.1842535742923967e-02 -1.6399474959880249e+00 -2.7287448574970502e-01 8.3385980669777940e-03 1.6209270680484575e+00 7.7827068480441977e-02 4.0839959746187704e-02 8.0075461060611719e-01 2.4634517419936877e-01 -9.9958091734125443e-03 -8.0931414368459620e-01 -4.9193937712654082e-02 -4.9255089075637293e-01 -4.6562590747684690e-01 -8.0020565805768999e+00 8.5539564461617701e-01 9.4331957324442564e-02 8.0326258789906291e+00 7.6367596524117376e-01 4.1511767021327273e-01 5.7793977399381342e+00 -2.7296532909271093e-01 -4.6010582033720875e-02 -5.9347129958837090e+00 -8.0305399492483243e-01 -5.7508923679967638e-01 -5.8827240276334880e+00 4.4864331574732286e-01 8.4046816168248023e-02 6.0218990292682841e+00 2.4634517419936675e-01 5.5083965381518929e-01 4.8380842562184680e+00 -7.4548988503012414e-01 -5.7610371210907875e-02 -4.8525133003214229e+00 -1.5970784527935000e+00 -1.0689794983908150e-01 -5.7543789183801763e-01 1.7122610906261515e+00 7.7224124610773881e-02 7.6367596524117376e-01 3.2832114086144513e+00 1.5240045678469336e-01 8.3213906875786325e-01 -3.1062801206296733e+00 -1.7537013836940687e-02 -4.6500558486752158e-01 -9.4571921505349721e-01 -1.3647061303945149e-01 -7.3667129186232683e-01 8.0160800791289177e-01 8.9605968694910741e-03 5.6290876751742092e-01 1.5806850267726655e+00 7.4503833426606589e-02 4.1511767021327345e-01 -1.7286877454494904e+00 -5.2183434976091139e-02 -7.9672670316186522e-01 -5.2183434976091424e-02 -1.7286877454494975e+00 -7.9672670316186511e-01 7.4503833426606797e-02 1.5806850267726726e+00 4.1511767021327273e-01 1.5240045678469338e-01 3.2832114086144517e+00 8.3213906875786314e-01 -1.7537013836941066e-02 -3.1062801206296724e+00 -4.6500558486752125e-01 -1.3647061303945113e-01 -9.4571921505349754e-01 -7.3667129186232616e-01 8.9605968694912060e-03 8.0160800791289177e-01 5.6290876751742058e-01 7.7224124610773576e-02 1.7122610906261451e+00 7.6367596524117332e-01 -1.0689794983908128e-01 -1.5970784527934931e+00 -5.7543789183801730e-01 -2.7304251346864566e-01 -7.9104267526842165e-01 -5.7806501245989521e+00 7.6066045709637697e-01 4.3049711757822084e-01 5.7793977399381333e+00 8.3213906875786325e-01 8.3213906875786314e-01 7.7249594857950994e+00 -4.8669322857866504e-01 -4.8669322857866482e-01 -7.8433186775235262e+00 -7.2861745257879840e-01 -7.2861745257880006e-01 -4.7138980617281829e+00 2.5609922646207095e-01 2.5609922646207117e-01 4.8347620227782464e+00 4.3049711757821768e-01 7.6066045709637575e-01 5.7793977399381244e+00 -7.9104267526841943e-01 -2.7304251346864405e-01 -5.7806501245989423e+00 1.5630157300945906e+00 7.0409570251288144e-03 7.6087162255462568e-02 -1.5972029922315472e+00 -1.4254616000049796e-03 -2.7296532909271098e-01 -3.1062801206296733e+00 -1.7537013836941069e-02 -4.8669322857866498e-01 3.1893497793564767e+00 3.4082798117706639e-03 9.4145748066213758e-02 7.7363884900430613e-01 7.4964951551621944e-03 2.4810769108805625e-01 -8.1012027826545363e-01 1.9917486551532465e-04 -5.3404132073398336e-02 -1.5802596443105723e+00 -7.0718827476554452e-03 -4.6010582033721062e-02 1.5678586769818725e+00 7.8894513270244757e-03 4.4073267036876274e-01 7.8894513270243629e-03 1.5678586769818796e+00 4.4073267036876285e-01 -7.0718827476552370e-03 -1.5802596443105790e+00 -4.6010582033720826e-02 -1.7537013836940691e-02 -3.1062801206296724e+00 -4.8669322857866482e-01 3.4082798117706608e-03 3.1893497793564762e+00 9.4145748066213217e-02 7.4964951551618284e-03 7.7363884900430591e-01 2.4810769108805550e-01 1.9917486551534872e-04 -8.1012027826545363e-01 -5.3404132073397739e-02 -1.4254616000048074e-03 -1.5972029922315401e+00 -2.7296532909270993e-01 7.0409570251285282e-03 1.5630157300945837e+00 7.6087162255461735e-02 8.2367740504301151e-02 4.1444722363594033e-01 5.9019171479833545e+00 -5.8331420023623304e-01 -4.1479564038522584e-02 -5.9347129958837082e+00 -4.6500558486752158e-01 -4.6500558486752130e-01 -7.8433186775235262e+00 9.4145748066213883e-02 9.4145748066213231e-02 8.1007593284440276e+00 5.5625446751469798e-01 5.5625446751469931e-01 4.8018434305883284e+00 -5.7415830578877211e-02 -5.7415830578877135e-02 -4.9936923857081235e+00 -4.1479564038520961e-02 -5.8331420023623226e-01 -5.9347129958836984e+00 4.1444722363593972e-01 8.2367740504299819e-02 5.9019171479833457e+00 1.6130926243243899e+00 7.3759335153144048e-02 4.1157342205385927e-01 -1.7729710789085080e+00 -5.1842535742923961e-02 -8.0305399492483243e-01 -9.4571921505349721e-01 -1.3647061303945113e-01 -7.2861745257879851e-01 7.7363884900430602e-01 7.4964951551618293e-03 5.5625446751469798e-01 3.5128230941190335e+00 1.5410739787516819e-01 8.5045259307419918e-01 -3.2849750247870735e+00 -1.9668088615785603e-02 -4.7769651647014766e-01 -1.6399474959880180e+00 -1.0692156533266101e-01 -5.7508923679967472e-01 1.7440582472893678e+00 7.9539574547347613e-02 7.6617671813069699e-01 7.9539574547348141e-02 1.7440582472893751e+00 7.6617671813069876e-01 -1.0692156533266162e-01 -1.6399474959880249e+00 -5.7508923679967638e-01 -1.3647061303945152e-01 -9.4571921505349743e-01 -7.2861745257880017e-01 7.4964951551621953e-03 7.7363884900430591e-01 5.5625446751469931e-01 1.5410739787516819e-01 3.5128230941190348e+00 8.5045259307420107e-01 -1.9668088615786075e-02 -3.2849750247870744e+00 -4.7769651647014993e-01 -5.1842535742923711e-02 -1.7729710789085020e+00 -8.0305399492483409e-01 7.3759335153144354e-02 1.6130926243243828e+00 4.1157342205386116e-01 4.4289354214830867e-01 7.6990076718375700e-01 5.8642934329183474e+00 -7.9835042623679275e-01 -2.7287448574970502e-01 -5.8827240276334880e+00 -7.3667129186232672e-01 -7.3667129186232627e-01 -4.7138980617281829e+00 2.4810769108805625e-01 2.4810769108805547e-01 4.8018434305883284e+00 8.5045259307419907e-01 8.5045259307420107e-01 8.1129077569454537e+00 -5.0345838964549772e-01 -5.0345838964549816e-01 -8.1639919363753179e+00 -2.7287448574970247e-01 -7.9835042623679120e-01 -5.8827240276334800e+00 7.6990076718375533e-01 4.4289354214830667e-01 5.8642934329183376e+00 -1.6241306764787371e+00 -7.1904188311577837e-03 -4.9613082093513075e-02 1.6276030495976066e+00 8.3385980669777940e-03 4.4864331574732286e-01 8.0160800791289177e-01 8.9605968694912060e-03 2.5609922646207095e-01 -8.1012027826545352e-01 1.9917486551534845e-04 -5.7415830578877183e-02 -3.2849750247870735e+00 -1.9668088615786065e-02 -5.0345838964549772e-01 3.3114466257003881e+00 4.0775515202728348e-03 1.0670022963324732e-01 1.6209270680484500e+00 8.4242159783457209e-03 8.4046816168247482e-02 -1.6423587717280712e+00 -3.1416298536590401e-03 -2.8500228569300046e-01 -3.1416298536589616e-03 -1.6423587717280785e+00 -2.8500228569300134e-01 8.4242159783455561e-03 1.6209270680484575e+00 8.4046816168248023e-02 8.9605968694910776e-03 8.0160800791289177e-01 2.5609922646207123e-01 1.9917486551532390e-04 -8.1012027826545352e-01 -5.7415830578877142e-02 -1.9668088615785607e-02 -3.2849750247870744e+00 -5.0345838964549816e-01 4.0775515202728348e-03 3.3114466257003876e+00 1.0670022963324802e-01 8.3385980669775268e-03 1.6276030495975993e+00 4.4864331574732236e-01 -7.1904188311577482e-03 -1.6241306764787300e+00 -4.9613082093512964e-02 -5.4519357463441373e-02 -5.8931235324237397e-01 -6.0355625391501881e+00 4.2749629361825242e-01 7.7827068480441977e-02 6.0218990292682841e+00 5.6290876751742092e-01 5.6290876751742058e-01 4.8347620227782455e+00 -5.3404132073398322e-02 -5.3404132073397760e-02 -4.9936923857081243e+00 -4.7769651647014755e-01 -4.7769651647014988e-01 -8.1639919363753197e+00 1.0670022963324730e-01 1.0670022963324803e-01 8.3502493190690021e+00 7.7827068480439660e-02 4.2749629361825225e-01 6.0218990292682761e+00 -5.8931235324237274e-01 -5.4519357463440665e-02 -6.0355625391501784e+00 -8.0931414368459631e-01 -9.9958091734122009e-03 -4.9193937712652333e-02 8.0075461060611675e-01 4.0839959746187704e-02 2.4634517419936672e-01 1.5806850267726655e+00 7.7224124610773576e-02 4.3049711757821774e-01 -1.5802596443105723e+00 -1.4254616000048074e-03 -4.1479564038520961e-02 -1.6399474959880180e+00 -5.1842535742923704e-02 -2.7287448574970247e-01 1.6209270680484500e+00 8.3385980669775234e-03 7.7827068480439660e-02 3.2201260629266466e+00 1.5127282960809237e-02 9.4331957324439594e-02 -3.1929714843706929e+00 -7.8266158868407321e-02 -4.8545333008158809e-01 -1.1550071843825404e-02 -9.4634346353801513e-01 -7.4695513652486067e-01 1.0113493416549892e-01 8.0075461060611719e-01 5.5083965381518929e-01 7.4503833426606603e-02 1.7122610906261451e+00 7.6066045709637575e-01 -7.0718827476554478e-03 -1.5972029922315401e+00 -5.8331420023623226e-01 -1.0692156533266101e-01 -1.7729710789085020e+00 -7.9835042623679142e-01 8.4242159783457227e-03 1.6276030495975995e+00 4.2749629361825237e-01 1.5127282960809238e-02 3.3700020328384017e+00 8.5539564461617557e-01 -7.3646746607118577e-02 -3.1941032489902055e+00 -4.6577228614810884e-01 -5.7610371210908923e-02 -7.4548988503012548e-01 -4.8525133003214229e+00 5.5083965381519007e-01 2.4634517419936877e-01 4.8380842562184672e+00 4.1511767021327345e-01 7.6367596524117320e-01 5.7793977399381244e+00 -4.6010582033721062e-02 -2.7296532909270987e-01 -5.9347129958836984e+00 -5.7508923679967472e-01 -8.0305399492483398e-01 -5.8827240276334791e+00 8.4046816168247496e-02 4.4864331574732236e-01 6.0218990292682744e+00 9.4331957324439580e-02 8.5539564461617545e-01 8.0326258789905918e+00 -4.6562590747684562e-01 -4.9255089075637015e-01 -8.0020565805768591e+00 7.7513266366774380e-01 1.0059253410572207e-01 5.5043045260750345e-01 -9.4634346353801480e-01 -9.9958091734125443e-03 -7.4548988503012414e-01 -1.7286877454494904e+00 -1.0689794983908131e-01 -7.9104267526841943e-01 1.5678586769818725e+00 7.0409570251285265e-03 4.1444722363593972e-01 1.7440582472893680e+00 7.3759335153144381e-02 7.6990076718375533e-01 -1.6423587717280712e+00 -7.1904188311577490e-03 -5.8931235324237274e-01 -3.1929714843706929e+00 -7.3646746607118563e-02 -4.6562590747684568e-01 3.4233118771472855e+00 1.6338098166775089e-02 8.5669237759056338e-01 4.1374171500835541e-02 7.7513266366774369e-01 2.5053568937129123e-01 -1.1550071843825208e-02 -8.0931414368459620e-01 -5.7610371210907854e-02 -5.2183434976091139e-02 -1.5970784527934931e+00 -2.7304251346864405e-01 7.8894513270244739e-03 1.5630157300945835e+00 8.2367740504299805e-02 7.9539574547347613e-02 1.6130926243243828e+00 4.4289354214830667e-01 -3.1416298536590362e-03 -1.6241306764787300e+00 -5.4519357463440658e-02 -7.8266158868407334e-02 -3.1941032489902055e+00 -4.9255089075637015e-01 1.6338098166775089e-02 3.2733855038603146e+00 1.0192616087546508e-01 2.5053568937129256e-01 5.5043045260750456e-01 4.8022912629250438e+00 -7.4695513652486167e-01 -4.9193937712654075e-02 -4.8525133003214229e+00 -7.9672670316186534e-01 -5.7543789183801730e-01 -5.7806501245989423e+00 4.4073267036876279e-01 7.6087162255461735e-02 5.9019171479833457e+00 7.6617671813069677e-01 4.1157342205386122e-01 5.8642934329183376e+00 -2.8500228569300057e-01 -4.9613082093512964e-02 -6.0355625391501784e+00 -4.8545333008158809e-01 -4.6577228614810873e-01 -8.0020565805768573e+00 8.5669237759056349e-01 1.0192616087546515e-01 8.1022807008206748e+00 792 793 794 834 835 836 846 847 848 804 805 806 795 796 797 837 838 839 849 850 851 807 808 809 3.3546314456557433e+00 3.5428814703923603e-02 9.7808273372188378e-02 -3.2838369868547765e+00 -1.6857422913871814e-01 -4.6476021025475317e-01 -1.6660419188644524e+00 -1.0179492044564757e-01 -2.5815961233371687e-01 1.6351087675595888e+00 2.4282102251315135e-02 8.0769896648012193e-02 1.6115294355857543e+00 1.5773014169926028e-01 4.1019525914166355e-01 -1.6203814223866539e+00 -1.2981261038489175e-02 -5.0219578063024795e-02 -8.2118758960781513e-01 -2.1200457191423706e-02 -5.1863655424227884e-02 7.9017826891261167e-01 8.7109809159779672e-02 2.3622962691385863e-01 3.5428814703923610e-02 3.9984823996140397e+00 1.6997752575261487e+00 -1.6248968141270712e-01 -3.6590550985034476e+00 -1.3799625071249468e+00 -2.0889357927287597e-01 -2.2455259755695636e+00 -1.5094392713823219e+00 2.1397829847862392e-02 1.9724773165552494e+00 1.2195602655242457e+00 1.5127542442517508e-01 2.1869714174880559e+00 1.5080652397613072e+00 -1.7818811765557670e-02 -1.9754084779093741e+00 -1.4020266966958868e+00 -1.7837833253376525e-02 -1.3790368053353350e+00 -1.4260888943163790e+00 1.9893783672755616e-01 1.1010952236603755e+00 1.2901166067078327e+00 9.7808273372188392e-02 1.6997752575261489e+00 7.8219937436112339e+00 -4.5165701859721935e-01 -1.4013683513026185e+00 -7.8619804683891150e+00 -5.3616045912749632e-01 -1.5230719810860192e+00 -5.4999490973963461e+00 7.2900918084640873e-02 1.2561220558917550e+00 5.7391534716573647e+00 3.9733357383198586e-01 1.5134106681219910e+00 5.5180195195044481e+00 -5.2066187642833404e-02 -1.1127396346971921e+00 -5.7918146969449067e+00 -4.3829414710643125e-02 -1.4423817078972969e+00 -4.5051863187726786e+00 5.1567031478937697e-01 1.0102536934432362e+00 4.5797638467299961e+00 -3.2838369868547765e+00 -1.6248968141270714e-01 -4.5165701859721935e-01 3.4542209178049506e+00 1.8701037687156821e-01 8.3901538055470104e-01 1.7807488841586532e+00 2.1983056909693735e-01 7.2940985193139363e-01 -1.6669242746217920e+00 -1.2170637912851467e-01 -5.6834873644022554e-01 -1.7680255531884512e+00 -2.6006892108128427e-01 -7.6479509540800261e-01 1.6244321592576514e+00 9.4279053983950589e-02 4.2537259239390129e-01 8.1399372309270401e-01 2.0202972145157119e-01 5.1737723137062230e-01 -9.5460886964893943e-01 -1.5888473978152193e-01 -7.2637420580517076e-01 -1.6857422913871817e-01 -3.6590550985034476e+00 -1.4013683513026187e+00 1.8701037687156824e-01 3.5433531292128664e+00 1.0609660171608020e+00 2.2387821073159395e-01 1.9867207270226082e+00 1.2334219049141042e+00 -5.6487473106524647e-02 -1.8447453209856368e+00 -9.1280883294852666e-01 -2.0795662636631915e-01 -1.9751487808926558e+00 -1.0874566468904630e+00 9.4686894550869580e-02 1.8269942608209127e+00 9.5035449005913319e-01 8.5338277333035228e-02 1.1296586537742992e+00 1.0132966511920214e+00 -1.5789543087550495e-01 -1.0077775704489467e+00 -8.5640523218445197e-01 -4.6476021025475317e-01 -1.3799625071249464e+00 -7.8619804683891150e+00 8.3901538055470104e-01 1.0609660171608020e+00 8.0251774404171279e+00 7.2803120774482855e-01 1.2066186825412892e+00 5.6284883615113559e+00 -2.6907438470937833e-01 -9.0798652583094952e-01 -5.9039003940348849e+00 -7.7197547857939763e-01 -1.3803952833991620e+00 -5.6546925984844290e+00 4.2980122421427203e-01 9.5252319062010526e-01 5.9044647101761951e+00 2.2899479575780779e-01 1.3023936291186513e+00 4.6104663987819157e+00 -7.2003253472808015e-01 -8.5415720308579368e-01 -4.7480234499781666e+00 -1.6660419188644524e+00 -2.0889357927287597e-01 -5.3616045912749632e-01 1.7807488841586534e+00 2.2387821073159395e-01 7.2803120774482855e-01 3.4693074355675302e+00 3.0247382463301564e-01 7.7768982572523326e-01 -3.3019321811560673e+00 -1.0573240465635318e-01 -4.3705987729754270e-01 -9.5319906320503733e-01 -2.7009066427144690e-01 -6.8763144590080372e-01 8.1536548752302296e-01 1.1794026878774561e-01 5.3994446909987270e-01 1.6336163768316290e+00 1.4482727641307397e-01 3.7393871894482100e-01 -1.7778650208552778e+00 -2.0440293236475376e-01 -7.5875243918891266e-01 -1.0179492044564756e-01 -2.2455259755695636e+00 -1.5230719810860194e+00 2.1983056909693735e-01 1.9867207270226082e+00 1.2066186825412892e+00 3.0247382463301564e-01 3.9567175946700885e+00 1.6322111811601010e+00 -1.1402142937765843e-01 -3.6707010783517791e+00 -1.3449603532038634e+00 -2.6877541970159080e-01 -1.3769049339217738e+00 -1.4085631098172535e+00 5.8688026449647199e-02 1.1288925745946303e+00 1.3079496581188945e+00 1.5532719972144385e-01 2.2001781799169100e+00 1.4742305194719543e+00 -2.5172785037614720e-01 -1.9793770883611221e+00 -1.3444145971851020e+00 -2.5815961233371687e-01 -1.5094392713823221e+00 -5.4999490973963461e+00 7.2940985193139363e-01 1.2334219049141042e+00 5.6284883615113550e+00 7.7768982572523315e-01 1.6322111811601010e+00 7.5472561664450524e+00 -4.7859634898387970e-01 -1.3876698430489831e+00 -7.7779957386943810e+00 -6.8201212543135514e-01 -1.4038780143564984e+00 -4.3831962131984197e+00 2.4738557082512752e-01 1.0139684652261594e+00 4.6060994791828502e+00 4.0506304567832196e-01 1.4811182835345578e+00 5.4457153196951138e+00 -7.4078020741112438e-01 -1.0597327060471218e+00 -5.5664182775452256e+00 1.6351087675595883e+00 2.1397829847862399e-02 7.2900918084640873e-02 -1.6669242746217920e+00 -5.6487473106524647e-02 -2.6907438470937833e-01 -3.3019321811560673e+00 -1.1402142937765843e-01 -4.7859634898387970e-01 3.3797253867388748e+00 2.2508944253861362e-02 9.4006368551549313e-02 7.8872857355656101e-01 5.6091755487313821e-02 2.3947157269865682e-01 -8.2194524707447136e-01 -1.0288225645118308e-02 -5.1745812394904903e-02 -1.6348832862475153e+00 -1.4590569453892038e-02 -3.9522984096164747e-02 1.6221222612448216e+00 9.5389167994155921e-02 4.3256067084948058e-01 2.4282102251315139e-02 1.9724773165552494e+00 1.2561220558917552e+00 -1.2170637912851467e-01 -1.8447453209856368e+00 -9.0798652583094930e-01 -1.0573240465635317e-01 -3.6707010783517791e+00 -1.3876698430489831e+00 2.2508944253861352e-02 3.6124499901729097e+00 1.0588812456048415e+00 1.1624140229009286e-01 1.1014434958063604e+00 1.0071346600682638e+00 -1.1786334471326890e-02 -1.0094561586279114e+00 -8.7035293082004428e-01 -9.5141875546123390e-03 -1.9821714404145616e+00 -1.0807957742701488e+00 8.5706857015537694e-02 1.8207031958453705e+00 9.2466711240526500e-01 8.0769896648012179e-02 1.2195602655242457e+00 5.7391534716573647e+00 -5.6834873644022554e-01 -9.1280883294852688e-01 -5.9039003940348858e+00 -4.3705987729754264e-01 -1.3449603532038634e+00 -7.7779957386943828e+00 9.4006368551549313e-02 1.0588812456048418e+00 8.1516828083801780e+00 5.3884939848610913e-01 1.3077579635841741e+00 4.5756454828809501e+00 -5.9094020258010700e-02 -8.7676249492601954e-01 -4.8765311257486994e+00 -3.9684331437986248e-02 -1.3776401228981312e+00 -5.7025352300855676e+00 3.9056130174809434e-01 9.2597232926328299e-01 5.7944807256450419e+00 1.6115294355857546e+00 1.5127542442517508e-01 3.9733357383198598e-01 -1.7680255531884512e+00 -2.0795662636631912e-01 -7.7197547857939774e-01 -9.5319906320503733e-01 -2.6877541970159080e-01 -6.8201212543135514e-01 7.8872857355656101e-01 1.1624140229009286e-01 5.3884939848610924e-01 3.4067338716047670e+00 3.0993673145733891e-01 7.9618194480883664e-01 -3.1881035952219681e+00 -1.1352180998014690e-01 -4.6894898032385945e-01 -1.6204877215609914e+00 -2.1057476608393177e-01 -5.3700704589457593e-01 1.7228240524293654e+00 2.2337506395938247e-01 7.2757871310225641e-01 1.5773014169926031e-01 2.1869714174880568e+00 1.5134106681219910e+00 -2.6006892108128432e-01 -1.9751487808926556e+00 -1.3803952833991620e+00 -2.7009066427144685e-01 -1.3769049339217738e+00 -1.4038780143564984e+00 5.6091755487313821e-02 1.1014434958063604e+00 1.3077579635841741e+00 3.0993673145733885e-01 3.9074799929619584e+00 1.6729351833081996e+00 -1.1447631493987540e-01 -3.5655613645775510e+00 -1.3958278739541610e+00 -9.8892267213552515e-02 -2.2074166089939289e+00 -1.5256872129629624e+00 2.1976953886224612e-01 1.9291367821295344e+00 1.2116845696584182e+00 4.1019525914166360e-01 1.5080652397613072e+00 5.5180195195044481e+00 -7.6479509540800272e-01 -1.0874566468904630e+00 -5.6546925984844290e+00 -6.8763144590080372e-01 -1.4085631098172535e+00 -4.3831962131984197e+00 2.3947157269865679e-01 1.0071346600682636e+00 4.5756454828809501e+00 7.9618194480883664e-01 1.6729351833081993e+00 7.5813251767758914e+00 -4.7318736668451133e-01 -1.3991308308135082e+00 -7.7506687873163447e+00 -2.4852340377364857e-01 -1.5226101505904446e+00 -5.4594754405522679e+00 7.2828853511780900e-01 1.2296256549739020e+00 5.5730428603901707e+00 -1.6203814223866539e+00 -1.7818811765557659e-02 -5.2066187642833404e-02 1.6244321592576514e+00 9.4686894550869566e-02 4.2980122421427197e-01 8.1536548752302285e-01 5.8688026449647213e-02 2.4738557082512749e-01 -8.2194524707447125e-01 -1.1786334471326898e-02 -5.9094020258010728e-02 -3.1881035952219681e+00 -1.1447631493987541e-01 -4.7318736668451139e-01 3.2094456855767386e+00 2.4554674835244171e-02 1.0281097407888110e-01 1.6034686279070371e+00 2.4372505170662674e-02 7.8864180361394601e-02 -1.6222816955813568e+00 -5.8220639829663731e-02 -2.7451437489431985e-01 -1.2981261038489175e-02 -1.9754084779093741e+00 -1.1127396346971921e+00 9.4279053983950589e-02 1.8269942608209127e+00 9.5252319062010526e-01 1.1794026878774561e-01 1.1288925745946305e+00 1.0139684652261594e+00 -1.0288225645118308e-02 -1.0094561586279112e+00 -8.7676249492601954e-01 -1.1352180998014690e-01 -3.5655613645775510e+00 -1.3991308308135082e+00 2.4554674835244168e-02 3.4480870075230858e+00 1.0809505113708098e+00 2.2249407550520722e-02 1.9468227379206549e+00 1.2534954254443404e+00 -1.2223210849370668e-01 -1.8003705797444487e+00 -9.1230463222469460e-01 -5.0219578063024801e-02 -1.4020266966958868e+00 -5.7918146969449058e+00 4.2537259239390124e-01 9.5035449005913319e-01 5.9044647101761951e+00 5.3994446909987270e-01 1.3079496581188945e+00 4.6060994791828493e+00 -5.1745812394904903e-02 -8.7035293082004428e-01 -4.8765311257487003e+00 -4.6894898032385945e-01 -1.3958278739541607e+00 -7.7506687873163447e+00 1.0281097407888108e-01 1.0809505113708098e+00 8.0573680110652912e+00 7.1259048703741987e-02 1.2445912081099901e+00 5.7124936540302391e+00 -5.6847271349460771e-01 -9.1563836618873939e-01 -5.8614112444446249e+00 -8.2118758960781535e-01 -1.7837833253376532e-02 -4.3829414710643125e-02 8.1399372309270401e-01 8.5338277333035228e-02 2.2899479575780779e-01 1.6336163768316290e+00 1.5532719972144385e-01 4.0506304567832202e-01 -1.6348832862475153e+00 -9.5141875546123425e-03 -3.9684331437986275e-02 -1.6204877215609914e+00 -9.8892267213552515e-02 -2.4852340377364857e-01 1.6034686279070371e+00 2.2249407550520718e-02 7.1259048703741987e-02 3.2436298700121187e+00 3.0271515468225554e-02 8.2782463767724329e-02 -3.2181500004271659e+00 -1.6694211205168402e-01 -4.5606220398531810e-01 -2.1200457191423709e-02 -1.3790368053353350e+00 -1.4423817078972969e+00 2.0202972145157116e-01 1.1296586537742990e+00 1.3023936291186513e+00 1.4482727641307400e-01 2.2001781799169100e+00 1.4811182835345578e+00 -1.4590569453892054e-02 -1.9821714404145616e+00 -1.3776401228981314e+00 -2.1057476608393177e-01 -2.2074166089939289e+00 -1.5226101505904444e+00 2.4372505170662671e-02 1.9468227379206551e+00 1.2445912081099904e+00 3.0271515468225565e-02 3.8816486039502940e+00 1.6676126573889716e+00 -1.5513522577428582e-01 -3.5896833208183332e+00 -1.3530837967662981e+00 -5.1863655424227897e-02 -1.4260888943163790e+00 -4.5051863187726786e+00 5.1737723137062230e-01 1.0132966511920214e+00 4.6104663987819148e+00 3.7393871894482095e-01 1.4742305194719543e+00 5.4457153196951138e+00 -3.9522984096164775e-02 -1.0807957742701488e+00 -5.7025352300855676e+00 -5.3700704589457593e-01 -1.5256872129629622e+00 -5.4594754405522679e+00 7.8864180361394601e-02 1.2534954254443404e+00 5.7124936540302400e+00 8.2782463767724329e-02 1.6676126573889716e+00 7.5880032017076999e+00 -4.2456890902959377e-01 -1.3760633719478008e+00 -7.6894815848044535e+00 7.9017826891261167e-01 1.9893783672755619e-01 5.1567031478937697e-01 -9.5460886964893943e-01 -1.5789543087550495e-01 -7.2003253472808015e-01 -1.7778650208552778e+00 -2.5172785037614714e-01 -7.4078020741112449e-01 1.6221222612448216e+00 8.5706857015537680e-02 3.9056130174809434e-01 1.7228240524293654e+00 2.1976953886224612e-01 7.2828853511780900e-01 -1.6222816955813570e+00 -1.2223210849370669e-01 -5.6847271349460782e-01 -3.2181500004271664e+00 -1.5513522577428582e-01 -4.2456890902959366e-01 3.4377810039259415e+00 1.8257638291430536e-01 8.1933421300812548e-01 8.7109809159779672e-02 1.1010952236603755e+00 1.0102536934432362e+00 -1.5888473978152193e-01 -1.0077775704489467e+00 -8.5415720308579368e-01 -2.0440293236475376e-01 -1.9793770883611219e+00 -1.0597327060471218e+00 9.5389167994155921e-02 1.8207031958453705e+00 9.2597232926328299e-01 2.2337506395938247e-01 1.9291367821295347e+00 1.2296256549739022e+00 -5.8220639829663724e-02 -1.8003705797444483e+00 -9.1563836618873951e-01 -1.6694211205168402e-01 -3.5896833208183332e+00 -1.3760633719478008e+00 1.8257638291430539e-01 3.5262733577375700e+00 1.0397399695890346e+00 2.3622962691385863e-01 1.2901166067078327e+00 4.5797638467299961e+00 -7.2637420580517076e-01 -8.5640523218445197e-01 -4.7480234499781666e+00 -7.5875243918891289e-01 -1.3444145971851023e+00 -5.5664182775452256e+00 4.3256067084948058e-01 9.2466711240526533e-01 5.7944807256450419e+00 7.2757871310225641e-01 1.2116845696584182e+00 5.5730428603901716e+00 -2.7451437489431979e-01 -9.1230463222469460e-01 -5.8614112444446258e+00 -4.5606220398531816e-01 -1.3530837967662985e+00 -7.6894815848044535e+00 8.1933421300812581e-01 1.0397399695890346e+00 7.9180471240072627e+00 834 835 836 876 877 878 888 889 890 846 847 848 837 838 839 879 880 881 891 892 893 849 850 851 3.1058537352314204e+00 2.3448948323377142e-02 6.5318919813036960e-02 -3.0245207465677502e+00 -1.6198681265875051e-01 -4.3533947365890746e-01 -1.5269759009012536e+00 -9.3292282392834699e-02 -2.3125969265517532e-01 1.5002485432837920e+00 1.5378488725685794e-02 5.2297794105078635e-02 1.5211853222348837e+00 1.5192330010948615e-01 3.8850151361777019e-01 -1.5378201606398787e+00 -6.2312576169513655e-03 -2.4322282750013316e-02 -7.7419060854522737e-01 -1.1843151478929479e-02 -2.7350556846409711e-02 7.3621981590401264e-01 8.2602766988917026e-02 2.1215377837462002e-01 2.3448948323377145e-02 3.7324106059996938e+00 1.6204425403283380e+00 -1.5752105587867571e-01 -3.3767643131596916e+00 -1.3006785684549276e+00 -2.0482620982319080e-01 -2.0958900446581530e+00 -1.4406011791542215e+00 1.2686931517636585e-02 1.8133603762522239e+00 1.1535440171104945e+00 1.4423550009615205e-01 2.0858945948203971e+00 1.4433014032225873e+00 -7.6067228801509450e-03 -1.8719768070212750e+00 -1.3377556231457726e+00 -7.0045574508719455e-03 -1.3180361241070144e+00 -1.3670036910630528e+00 1.9658716609572363e-01 1.0310017118738197e+00 1.2287511011565548e+00 6.5318919813036946e-02 1.6204425403283380e+00 7.2872156255840199e+00 -4.2385952419758788e-01 -1.3105684207380439e+00 -7.3234265284075724e+00 -5.1612261844942697e-01 -1.4540806620708699e+00 -5.1142485266796527e+00 4.3030789032965887e-02 1.1777687040719351e+00 5.3622891970880522e+00 3.7156862282993214e-01 1.4434686656312996e+00 5.1942833609439942e+00 -2.0975057485103140e-02 -1.0437988136376082e+00 -5.4782455201005691e+00 -1.5294216745489510e-02 -1.3775198671232747e+00 -4.2372529799156435e+00 4.9633308520167263e-01 9.4428785353822642e-01 4.3093853714873731e+00 -3.0245207465677502e+00 -1.5752105587867571e-01 -4.2385952419758788e-01 3.2069141661402640e+00 1.7640415730228576e-01 8.1630745966256291e-01 1.6464663683351315e+00 2.1472674443362663e-01 7.0857300961036451e-01 -1.5289846416608928e+00 -1.1370908435182805e-01 -5.4816564541854462e-01 -1.6861308683518379e+00 -2.5465600641632635e-01 -7.4330782941301965e-01 1.5363421057136586e+00 8.7119168190835483e-02 4.0182299253011772e-01 7.6003703518697963e-01 1.9868666343163024e-01 4.9706140957184380e-01 -9.1012341879555281e-01 -1.5105058671154845e-01 -7.0843187234573701e-01 -1.6198681265875051e-01 -3.3767643131596916e+00 -1.3105684207380439e+00 1.7640415730228576e-01 3.2678837111584635e+00 9.6797294514482757e-01 2.1732380420086270e-01 1.8257895350795310e+00 1.1533466151200960e+00 -4.8348606016420353e-02 -1.6882856028376501e+00 -8.3167663507255829e-01 -2.0166134655357462e-01 -1.8667927815101066e+00 -1.0128586460090747e+00 8.7840938973726690e-02 1.7221445569254881e+00 8.7269732114975940e-01 8.0394217433744933e-02 1.0569870670084605e+00 9.4326235476972120e-01 -1.4996635268187464e-01 -9.4096217266449445e-01 -7.8217553436472742e-01 -4.3533947365890752e-01 -1.3006785684549274e+00 -7.3234265284075741e+00 8.1630745966256291e-01 9.6797294514482768e-01 7.4946832851569134e+00 7.0942378049365606e-01 1.1395559939931537e+00 5.2432851423167754e+00 -2.4109890098337958e-01 -8.2799535521927525e-01 -5.5312173141905063e+00 -7.5667991393050049e-01 -1.3093036997520688e+00 -5.3347583026953513e+00 4.0977098783752308e-01 8.7963385385422699e-01 5.5925428789677722e+00 2.0414053140802707e-01 1.2365832585405356e+00 4.3423730338177995e+00 -7.0652447082898173e-01 -7.8576842810647407e-01 -4.4834821949658314e+00 -1.5269759009012536e+00 -2.0482620982319080e-01 -5.1612261844942697e-01 1.6464663683351315e+00 2.1732380420086270e-01 7.0942378049365618e-01 3.1893299852155730e+00 2.9918186997698093e-01 7.5325953348682706e-01 -3.0102783507545281e+00 -9.5208966375439144e-02 -4.1440900776523931e-01 -9.0763698910373758e-01 -2.6740243612235765e-01 -6.6929667803954229e-01 7.6175816173100797e-01 1.1000088059506104e-01 5.2311138471862551e-01 1.5213939310476041e+00 1.3868397457452020e-01 3.5345910247648149e-01 -1.6740572055697980e+00 -1.9775291702643769e-01 -7.3942549692138182e-01 -9.3292282392834686e-02 -2.0958900446581530e+00 -1.4540806620708699e+00 2.1472674443362663e-01 1.8257895350795310e+00 1.1395559939931537e+00 2.9918186997698099e-01 3.6559927809408728e+00 1.5492274693969041e+00 -1.0235061532880452e-01 -3.3560677417141749e+00 -1.2666389599925367e+00 -2.6719906205476779e-01 -1.3147084824905975e+00 -1.3468359311105154e+00 4.9561808444033913e-02 1.0592062968532063e+00 1.2478360239078281e+00 1.4848308665277232e-01 2.0771927480494243e+00 1.4095108105193179e+00 -2.4911154973100688e-01 -1.8515150920601107e+00 -1.2785747446432825e+00 -2.3125969265517529e-01 -1.4406011791542215e+00 -5.1142485266796527e+00 7.0857300961036451e-01 1.1533466151200957e+00 5.2432851423167754e+00 7.5325953348682728e-01 1.5492274693969041e+00 6.9691772522930311e+00 -4.4756997993068559e-01 -1.2954009397236066e+00 -7.2030699427005214e+00 -6.6407320507481504e-01 -1.3372661453876433e+00 -4.1085876196172002e+00 2.2542214622784792e-01 9.4847862837276153e-01 4.3352088625445777e+00 3.8089828553553601e-01 1.4108105970622464e+00 5.0995320059786806e+00 -7.2525009719989963e-01 -9.8859504568653855e-01 -5.2212971741356871e+00 1.5002485432837920e+00 1.2686931517636587e-02 4.3030789032965887e-02 -1.5289846416608928e+00 -4.8348606016420360e-02 -2.4109890098337958e-01 -3.0102783507545281e+00 -1.0235061532880456e-01 -4.4756997993068565e-01 3.1002161061785523e+00 1.4498157347701586e-02 5.9527776814205402e-02 7.3450998543962509e-01 4.6109234756483659e-02 2.1587420745258368e-01 -7.7588087007409245e-01 -4.3145464320766894e-03 -2.5159995821962513e-02 -1.5297575856618191e+00 -5.7613144308397805e-03 -1.3135347451985760e-02 1.5099268132493631e+00 8.7480758586319554e-02 4.0853145088825848e-01 1.5378488725685797e-02 1.8133603762522239e+00 1.1777687040719351e+00 -1.1370908435182805e-01 -1.6882856028376501e+00 -8.2799535521927525e-01 -9.5208966375439144e-02 -3.3560677417141749e+00 -1.2954009397236068e+00 1.4498157347701589e-02 3.3069032710291673e+00 9.6615296060562661e-01 1.0696958860094968e-01 1.0285552419002144e+00 9.3736261229371542e-01 -5.4320163944428304e-03 -9.4360531976451900e-01 -7.9801203799638198e-01 -7.4097733725425260e-04 -1.8531234293128309e+00 -1.0068755610290254e+00 7.8244809784627223e-02 1.6922632044475692e+00 8.4699961699701265e-01 5.2297794105078670e-02 1.1535440171104949e+00 5.3622891970880522e+00 -5.4816564541854462e-01 -8.3167663507255840e-01 -5.5312173141905063e+00 -4.1440900776523942e-01 -1.2666389599925370e+00 -7.2030699427005223e+00 5.9527776814205430e-02 9.6615296060562661e-01 7.5943208245139129e+00 5.1981285770206664e-01 1.2427082217417467e+00 4.3069921232488779e+00 -3.0928063058847793e-02 -8.0838105794656523e-01 -4.6196131608801618e+00 -7.6343165277151931e-03 -1.3091295850729814e+00 -5.3675511287086213e+00 3.6949860414899643e-01 8.5342103862677565e-01 5.4578494016289731e+00 1.5211853222348837e+00 1.4423550009615208e-01 3.7156862282993208e-01 -1.6861308683518379e+00 -2.0166134655357462e-01 -7.5667991393050060e-01 -9.0763698910373758e-01 -2.6719906205476779e-01 -6.6407320507481504e-01 7.3450998543962509e-01 1.0696958860094967e-01 5.1981285770206664e-01 3.3306309621905243e+00 3.0741080518127506e-01 7.7704037529899683e-01 -3.1013214975049643e+00 -1.0383745270584993e-01 -4.4217008156967347e-01 -1.5601989788395374e+00 -2.0529686700316527e-01 -5.1491220510224922e-01 1.6689620639350442e+00 2.1937883443898121e-01 7.0941354984624305e-01 1.5192330010948615e-01 2.0858945948203971e+00 1.4434686656312994e+00 -2.5465600641632630e-01 -1.8667927815101071e+00 -1.3093036997520691e+00 -2.6740243612235765e-01 -1.3147084824905972e+00 -1.3372661453876433e+00 4.6109234756483646e-02 1.0285552419002144e+00 1.2427082217417467e+00 3.0741080518127506e-01 3.8123802636587327e+00 1.6032944571767656e+00 -1.0619515717129377e-01 -3.4603998938521592e+00 -1.3187994162590053e+00 -9.1102589197166933e-02 -2.1357184011260735e+00 -1.4616205052596469e+00 2.1391284885989992e-01 1.8507894585995948e+00 1.1375184221085526e+00 3.8850151361777013e-01 1.4433014032225873e+00 5.1942833609439942e+00 -7.4330782941301965e-01 -1.0128586460090747e+00 -5.3347583026953513e+00 -6.6929667803954229e-01 -1.3468359311105154e+00 -4.1085876196172002e+00 2.1587420745258373e-01 9.3736261229371542e-01 4.3069921232488770e+00 7.7704037529899672e-01 1.6032944571767658e+00 7.2618559638984364e+00 -4.5600238570271856e-01 -1.3370406404297048e+00 -7.4343467167129269e+00 -2.2525450230054461e-01 -1.4562670465552994e+00 -5.1767141973269357e+00 7.1244529908647458e-01 1.1690437914115277e+00 5.2912753882611057e+00 -1.5378201606398787e+00 -7.6067228801509406e-03 -2.0975057485103143e-02 1.5363421057136586e+00 8.7840938973726690e-02 4.0977098783752314e-01 7.6175816173100797e-01 4.9561808444033913e-02 2.2542214622784792e-01 -7.7588087007409245e-01 -5.4320163944428295e-03 -3.0928063058847790e-02 -3.1013214975049643e+00 -1.0619515717129378e-01 -4.5600238570271856e-01 3.1342143272125620e+00 1.7898575701447310e-02 7.3375300064391691e-02 1.5474870040519793e+00 1.6227839630643531e-02 5.1920855743041457e-02 -1.5647790704902722e+00 -5.2295266303963972e-02 -2.5258378362613482e-01 -6.2312576169513672e-03 -1.8719768070212750e+00 -1.0437988136376082e+00 8.7119168190835455e-02 1.7221445569254883e+00 8.7963385385422699e-01 1.1000088059506102e-01 1.0592062968532061e+00 9.4847862837276153e-01 -4.3145464320766928e-03 -9.4360531976451900e-01 -8.0838105794656523e-01 -1.0383745270584996e-01 -3.4603998938521592e+00 -1.3370406404297048e+00 1.7898575701447310e-02 3.3522784266256247e+00 1.0074000537788981e+00 1.4044624389464093e-02 1.8692413181203120e+00 1.1944584887629999e+00 -1.1467999212192996e-01 -1.7268885778866774e+00 -8.4075051275500901e-01 -2.4322282750013285e-02 -1.3377556231457723e+00 -5.4782455201005691e+00 4.0182299253011772e-01 8.7269732114975940e-01 5.5925428789677722e+00 5.2311138471862539e-01 1.2478360239078283e+00 4.3352088625445777e+00 -2.5159995821962534e-02 -7.9801203799638198e-01 -4.6196131608801618e+00 -4.4217008156967347e-01 -1.3187994162590055e+00 -7.4343467167129269e+00 7.3375300064391705e-02 1.0074000537788983e+00 7.7577346486379835e+00 4.3015717910527634e-02 1.1727517777801144e+00 5.4370068861848750e+00 -5.4967303508201337e-01 -8.4611809921544301e-01 -5.5902878786415524e+00 -7.7419060854522737e-01 -7.0045574508719524e-03 -1.5294216745489503e-02 7.6003703518697963e-01 8.0394217433744933e-02 2.0414053140802707e-01 1.5213939310476039e+00 1.4848308665277232e-01 3.8089828553553601e-01 -1.5297575856618191e+00 -7.4097733725423873e-04 -7.6343165277151931e-03 -1.5601989788395372e+00 -9.1102589197166947e-02 -2.2525450230054456e-01 1.5474870040519790e+00 1.4044624389464098e-02 4.3015717910527627e-02 3.1077577960979061e+00 1.8767072208751137e-02 5.2514033456150827e-02 -3.0725285933378848e+00 -1.6284087669943939e-01 -4.3238553273649227e-01 -1.1843151478929474e-02 -1.3180361241070142e+00 -1.3775198671232747e+00 1.9868666343163024e-01 1.0569870670084605e+00 1.2365832585405356e+00 1.3868397457452014e-01 2.0771927480494234e+00 1.4108105970622469e+00 -5.7613144308397805e-03 -1.8531234293128309e+00 -1.3091295850729814e+00 -2.0529686700316530e-01 -2.1357184011260735e+00 -1.4562670465552991e+00 1.6227839630643538e-02 1.8692413181203120e+00 1.1727517777801144e+00 1.8767072208751130e-02 3.7284050090019134e+00 1.5966301768156916e+00 -1.4946421693261064e-01 -3.4249481876341923e+00 -1.2738593114470333e+00 -2.7350556846409718e-02 -1.3670036910630528e+00 -4.2372529799156435e+00 4.9706140957184386e-01 9.4326235476972120e-01 4.3423730338178004e+00 3.5345910247648149e-01 1.4095108105193179e+00 5.0995320059786806e+00 -1.3135347451985732e-02 -1.0068755610290252e+00 -5.3675511287086213e+00 -5.1491220510224922e-01 -1.4616205052596469e+00 -5.1767141973269348e+00 5.1920855743041464e-02 1.1944584887630001e+00 5.4370068861848742e+00 5.2514033456150827e-02 1.5966301768156919e+00 7.2062330377586470e+00 -3.9955729184687300e-01 -1.3083620735160080e+00 -7.3036266577888034e+00 7.3621981590401264e-01 1.9658716609572363e-01 4.9633308520167263e-01 -9.1012341879555281e-01 -1.4996635268187464e-01 -7.0652447082898173e-01 -1.6740572055697980e+00 -2.4911154973100691e-01 -7.2525009719989963e-01 1.5099268132493628e+00 7.8244809784627209e-02 3.6949860414899643e-01 1.6689620639350440e+00 2.1391284885989995e-01 7.1244529908647458e-01 -1.5647790704902722e+00 -1.1467999212192995e-01 -5.4967303508201348e-01 -3.0725285933378848e+00 -1.4946421693261061e-01 -3.9955729184687305e-01 3.3063795951050885e+00 1.7447728672717172e-01 8.0272790652062476e-01 8.2602766988917026e-02 1.0310017118738197e+00 9.4428785353822642e-01 -1.5105058671154845e-01 -9.4096217266449456e-01 -7.8576842810647407e-01 -1.9775291702643769e-01 -1.8515150920601107e+00 -9.8859504568653866e-01 8.7480758586319568e-02 1.6922632044475692e+00 8.5342103862677565e-01 2.1937883443898121e-01 1.8507894585995948e+00 1.1690437914115277e+00 -5.2295266303963958e-02 -1.7268885778866774e+00 -8.4611809921544312e-01 -1.6284087669943939e-01 -3.4249481876341923e+00 -1.3083620735160082e+00 1.7447728672717172e-01 3.3702596553244915e+00 9.6209096294793395e-01 2.1215377837462002e-01 1.2287511011565551e+00 4.3093853714873731e+00 -7.0843187234573712e-01 -7.8217553436472731e-01 -4.4834821949658314e+00 -7.3942549692138182e-01 -1.2785747446432825e+00 -5.2212971741356871e+00 4.0853145088825848e-01 8.4699961699701265e-01 5.4578494016289723e+00 7.0941354984624305e-01 1.1375184221085528e+00 5.2912753882611057e+00 -2.5258378362613482e-01 -8.4075051275500912e-01 -5.5902878786415524e+00 -4.3238553273649238e-01 -1.2738593114470333e+00 -7.3036266577888043e+00 8.0272790652062465e-01 9.6209096294793428e-01 7.5401837441544259e+00 804 805 806 846 847 848 852 853 854 810 811 812 807 808 809 849 850 851 855 856 857 813 814 815 3.1679000515653750e+00 2.4376224339701033e-02 4.2228156591302163e-02 -3.0925842543863409e+00 -2.3004409466873890e-01 -3.7623758381652594e-01 -1.5499527824204675e+00 -1.2292038253262788e-01 -1.9178705306529764e-01 1.5312840612537415e+00 1.7601489048699851e-02 3.3617604464871949e-02 1.5168681127951329e+00 2.0719892501446635e-01 3.2946260908902714e-01 -1.5366296582577956e+00 -2.1444118653490309e-03 -4.3795647397494152e-03 -7.7018569943531145e-01 -5.9677736578973729e-03 -7.8356700731137437e-03 7.3330016888566496e-01 1.1190002432174598e-01 1.7493150154948556e-01 2.4376224339701030e-02 4.5242594016425022e+00 2.1767247288770695e+00 -2.2362135938417163e-01 -4.1104092731280426e+00 -1.9707790873321143e+00 -2.8173790153117612e-01 -2.7603778500438687e+00 -1.8903127928435777e+00 1.1125225635491919e-02 2.4202955266566861e+00 1.7293783610359970e+00 1.9977615324946821e-01 2.7361899573630719e+00 1.9253993325914580e+00 -4.9800980528972019e-03 -2.4626880617355704e+00 -1.9278042553675556e+00 1.5227561739279694e-03 -1.9159110809686832e+00 -1.7951160819726666e+00 2.7353899956965583e-01 1.5686413802139050e+00 1.7525097950113904e+00 4.2228156591302149e-02 2.1767247288770699e+00 6.6567045917251502e+00 -3.6702680900424489e-01 -1.9858425258932739e+00 -6.7898883189843797e+00 -4.4362220009892062e-01 -1.9067070878606842e+00 -4.4974448835556258e+00 2.1519087713895626e-02 1.7624924651679821e+00 4.8166344892715713e+00 3.2060691814429215e-01 1.9295079972730675e+00 4.5672207075561611e+00 -8.1639255459330391e-03 -1.6560031623949396e+00 -4.9113479683871866e+00 3.9103350403298688e-03 -1.8127172774653324e+00 -3.6118295035804753e+00 4.3054843715927860e-01 1.4925448622961122e+00 3.7699508859547901e+00 -3.0925842543863409e+00 -2.2362135938417166e-01 -3.6702680900424489e-01 3.2659780490172698e+00 3.2770848194507451e-01 7.4212134320816980e-01 1.6679924629396059e+00 3.3405823607461849e-01 6.2649264050408382e-01 -1.5544922035860458e+00 -2.0982257926599338e-01 -4.8945097341050869e-01 -1.6753253603300267e+00 -3.8216560676863814e-01 -6.6076728731532275e-01 1.5320529356133255e+00 1.5831617743771373e-01 3.6122848840150801e-01 7.5479492081121458e-01 2.7475339650236807e-01 4.2716902300364479e-01 -8.9841655007900134e-01 -2.7922674654097185e-01 -6.3976642538733008e-01 -2.3004409466873896e-01 -4.1104092731280426e+00 -1.9858425258932746e+00 3.2770848194507451e-01 3.8997905130171096e+00 1.7446000225657616e+00 3.3979042341240884e-01 2.4330509269732179e+00 1.7268622002263492e+00 -8.7973983285176138e-02 -2.1984312193669666e+00 -1.5217385885191133e+00 -3.3455799232433603e-01 -2.4562790774830026e+00 -1.6140302074104940e+00 1.5811247513160798e-01 2.2229818336000071e+00 1.5731965143471589e+00 1.0640196007449490e-01 1.5999018563217275e+00 1.4963807239802205e+00 -2.7943727028533516e-01 -1.3906055599340508e+00 -1.4194281392966088e+00 -3.7623758381652600e-01 -1.9707790873321143e+00 -6.7898883189843797e+00 7.4212134320816991e-01 1.7446000225657614e+00 7.0558677677316561e+00 6.2918711816941819e-01 1.7028031685234539e+00 4.7120373594246674e+00 -2.0837282594082343e-01 -1.5135369608922322e+00 -5.0768429254785721e+00 -6.7528016654291678e-01 -1.8891545675422134e+00 -4.7862531621602340e+00 3.6300083370246072e-01 1.5760976971572913e+00 5.1157294080127613e+00 1.6381894219129742e-01 1.7648498610345658e+00 3.7949018115303477e+00 -6.3823766097107981e-01 -1.4148801335145125e+00 -4.0255519400762481e+00 -1.5499527824204675e+00 -2.8173790153117612e-01 -4.4362220009892062e-01 1.6679924629396057e+00 3.3979042341240884e-01 6.2918711816941808e-01 3.2208615060274215e+00 4.1572708067332342e-01 6.5092969877296358e-01 -3.0543020577576931e+00 -1.6017448745708557e-01 -3.5569960315222676e-01 -8.9328816633688346e-01 -3.7400747815681740e-01 -5.8294058199567167e-01 7.5786824433335398e-01 2.0095639198001525e-01 4.6693072032780009e-01 1.5067108483854155e+00 1.8457719875884193e-01 2.9166208442722108e-01 -1.6558900551707521e+00 -3.2513122767951036e-01 -6.5644723645058378e-01 -1.2292038253262788e-01 -2.7603778500438687e+00 -1.9067070878606844e+00 3.3405823607461849e-01 2.4330509269732179e+00 1.7028031685234539e+00 4.1572708067332342e-01 4.3861927416644448e+00 2.0421476838914212e+00 -1.7762316517785512e-01 -4.0329792204809749e+00 -1.8813753173841932e+00 -3.6954731031867494e-01 -1.9081274817513565e+00 -1.7666499696819469e+00 8.4562692097795336e-02 1.5994031688877850e+00 1.7742847540274491e+00 2.0224839648612727e-01 2.6827696915631183e+00 1.8444519341371763e+00 -3.6650554730270657e-01 -2.3999319768123657e+00 -1.8089551656526770e+00 -1.9178705306529761e-01 -1.8903127928435777e+00 -4.4974448835556258e+00 6.2649264050408382e-01 1.7268622002263492e+00 4.7120373594246674e+00 6.5092969877296358e-01 2.0421476838914217e+00 6.3005939068867516e+00 -3.9690185010316648e-01 -1.9253382794595633e+00 -6.5973421692301839e+00 -5.7312650080676131e-01 -1.7578261739564285e+00 -3.5033261016405217e+00 1.9509011975162102e-01 1.4931289160351324e+00 3.7878370642616876e+00 3.2255879617510930e-01 1.8506975322221118e+00 4.4236192355859316e+00 -6.3325585122855199e-01 -1.5393590861154454e+00 -4.6259744117327068e+00 1.5312840612537415e+00 1.1125225635491917e-02 2.1519087713895626e-02 -1.5544922035860458e+00 -8.7973983285176138e-02 -2.0837282594082343e-01 -3.0543020577576931e+00 -1.7762316517785509e-01 -3.9690185010316659e-01 3.1421964713167556e+00 1.7830445392063805e-02 3.6871352115770827e-02 7.3173759016433848e-01 7.7924175430558573e-02 1.8338828245282349e-01 -7.7301133684394641e-01 -1.8621766900481567e-03 -6.5605836432371840e-03 -1.5220769330907093e+00 2.7307713200209263e-03 7.8073227204415452e-03 1.4986644085435601e+00 1.5784870737494419e-01 3.6224921468429572e-01 1.7601489048699858e-02 2.4202955266566861e+00 1.7624924651679821e+00 -2.0982257926599338e-01 -2.1984312193669666e+00 -1.5135369608922322e+00 -1.6017448745708571e-01 -4.0329792204809749e+00 -1.9253382794595639e+00 1.7830445392063805e-02 3.8887115809751633e+00 1.7111819656843947e+00 1.9622061978971281e-01 1.5690831898314479e+00 1.4844789627347823e+00 -6.7630807908049314e-03 -1.3971083122010595e+00 -1.4449947122740685e+00 6.3181942733615756e-03 -2.4084069120483997e+00 -1.5751644303149051e+00 1.3878939901004578e-01 2.1588353666341034e+00 1.5008809893536110e+00 3.3617604464871956e-02 1.7293783610359972e+00 4.8166344892715713e+00 -4.8945097341050869e-01 -1.5217385885191135e+00 -5.0768429254785703e+00 -3.5569960315222682e-01 -1.8813753173841932e+00 -6.5973421692301857e+00 3.6871352115770799e-02 1.7111819656843950e+00 7.0582406142554426e+00 4.6180259922462408e-01 1.7719005969390560e+00 3.7639098285180159e+00 -1.8030021196204758e-02 -1.4554732990182677e+00 -4.1442885855362244e+00 1.0506475420101996e-02 -1.8560763749659761e+00 -4.7490633842001193e+00 3.2038256653357122e-01 1.5022026562281023e+00 4.9287521324000725e+00 1.5168681127951329e+00 1.9977615324946821e-01 3.2060691814429221e-01 -1.6753253603300267e+00 -3.3455799232433603e-01 -6.7528016654291678e-01 -8.9328816633688346e-01 -3.6954731031867494e-01 -5.7312650080676142e-01 7.3173759016433848e-01 1.9622061978971281e-01 4.6180259922462408e-01 3.2383123893703405e+00 4.3068982791459809e-01 6.7552016896574207e-01 -3.0262319687249741e+00 -1.7911558941995009e-01 -3.9470571004196497e-01 -1.5155117443798432e+00 -2.8095890800204959e-01 -4.4011586781400425e-01 1.6234391474419154e+00 3.3749319911123177e-01 6.2529855887098917e-01 2.0719892501446632e-01 2.7361899573630719e+00 1.9295079972730675e+00 -3.8216560676863814e-01 -2.4562790774830026e+00 -1.8891545675422134e+00 -3.7400747815681734e-01 -1.9081274817513565e+00 -1.7578261739564289e+00 7.7924175430558545e-02 1.5690831898314479e+00 1.7719005969390560e+00 4.3068982791459809e-01 4.4578309786715282e+00 2.1362638237575053e+00 -1.7995433398855579e-01 -4.0487558594972981e+00 -1.9868755404207150e+00 -1.1610853631073306e-01 -2.7380674460679661e+00 -1.9121829791052005e+00 3.3642302686512132e-01 2.3881257389335766e+00 1.7083668430549295e+00 3.2946260908902703e-01 1.9253993325914578e+00 4.5672207075561611e+00 -6.6076728731532275e-01 -1.6140302074104940e+00 -4.7862531621602340e+00 -5.8294058199567178e-01 -1.7666499696819471e+00 -3.5033261016405217e+00 1.8338828245282346e-01 1.4844789627347823e+00 3.7639098285180159e+00 6.7552016896574185e-01 2.1362638237575053e+00 6.4685010411257471e+00 -3.9633821074245063e-01 -1.9872366173034806e+00 -6.7158070586166723e+00 -1.7940838327017578e-01 -1.9046189817959309e+00 -4.4733167429819751e+00 6.3108340281602848e-01 1.7263936571081080e+00 4.6790714881994786e+00 -1.5366296582577956e+00 -4.9800980528972149e-03 -8.1639255459330547e-03 1.5320529356133255e+00 1.5811247513160798e-01 3.6300083370246067e-01 7.5786824433335398e-01 8.4562692097795336e-02 1.9509011975162102e-01 -7.7301133684394641e-01 -6.7630807908049314e-03 -1.8030021196204740e-02 -3.0262319687249741e+00 -1.7995433398855576e-01 -3.9633821074245063e-01 3.0581791376469716e+00 2.4624900601336604e-02 5.1841672403076133e-02 1.5113741080924026e+00 1.7925083605683900e-02 3.1383098101341836e-02 -1.5236014618593376e+00 -9.3527638604165950e-02 -2.1878356647391120e-01 -2.1444118653490231e-03 -2.4626880617355704e+00 -1.6560031623949398e+00 1.5831617743771370e-01 2.2229818336000067e+00 1.5760976971572913e+00 2.0095639198001525e-01 1.5994031688877850e+00 1.4931289160351324e+00 -1.8621766900481550e-03 -1.3971083122010595e+00 -1.4554732990182677e+00 -1.7911558941995009e-01 -4.0487558594972981e+00 -1.9872366173034812e+00 2.4624900601336604e-02 3.8415558777378984e+00 1.7847611905586522e+00 1.1957247790716954e-02 2.4148683783660325e+00 1.7657777043259726e+00 -2.1273253983443516e-01 -2.1702570251577953e+00 -1.5210524293603604e+00 -4.3795647397494274e-03 -1.9278042553675556e+00 -4.9113479683871883e+00 3.6122848840150806e-01 1.5731965143471589e+00 5.1157294080127613e+00 4.6693072032780025e-01 1.7742847540274491e+00 3.7878370642616876e+00 -6.5605836432371771e-03 -1.4449947122740685e+00 -4.1442885855362244e+00 -3.9470571004196497e-01 -1.9868755404207152e+00 -6.7158070586166723e+00 5.1841672403076140e-02 1.7847611905586522e+00 7.1182893635140472e+00 1.9993491932646594e-02 1.7562115794619051e+00 4.8013909378098028e+00 -4.9434851464007934e-01 -1.5287795303328273e+00 -5.0518031610582170e+00 -7.7018569943531145e-01 1.5227561739279676e-03 3.9103350403298515e-03 7.5479492081121469e-01 1.0640196007449489e-01 1.6381894219129745e-01 1.5067108483854155e+00 2.0224839648612727e-01 3.2255879617510930e-01 -1.5220769330907093e+00 6.3181942733615618e-03 1.0506475420101996e-02 -1.5155117443798432e+00 -1.1610853631073306e-01 -1.7940838327017575e-01 1.5113741080924028e+00 1.1957247790716954e-02 1.9993491932646597e-02 3.0259429471335371e+00 1.3538542451998464e-02 2.4017964397717327e-02 -2.9910484475167065e+00 -2.2587856093989411e-01 -3.6539762188702674e-01 -5.9677736578973798e-03 -1.9159110809686832e+00 -1.8127172774653326e+00 2.7475339650236807e-01 1.5999018563217278e+00 1.7648498610345658e+00 1.8457719875884193e-01 2.6827696915631183e+00 1.8506975322221118e+00 2.7307713200209124e-03 -2.4084069120483993e+00 -1.8560763749659763e+00 -2.8095890800204959e-01 -2.7380674460679661e+00 -1.9046189817959309e+00 1.7925083605683900e-02 2.4148683783660330e+00 1.7562115794619051e+00 1.3538542451998474e-02 4.3406980523026961e+00 2.0930141932773330e+00 -2.0659831097896628e-01 -3.9758525394685256e+00 -1.8913605317686761e+00 -7.8356700731137610e-03 -1.7951160819726666e+00 -3.6118295035804748e+00 4.2716902300364479e-01 1.4963807239802205e+00 3.7949018115303481e+00 2.9166208442722108e-01 1.8444519341371761e+00 4.4236192355859316e+00 7.8073227204415174e-03 -1.5751644303149053e+00 -4.7490633842001193e+00 -4.4011586781400425e-01 -1.9121829791052007e+00 -4.4733167429819742e+00 3.1383098101341843e-02 1.7657777043259726e+00 4.8013909378098028e+00 2.4017964397717338e-02 2.0930141932773330e+00 6.3545062403675621e+00 -3.3408795476324860e-01 -1.9171610643279302e+00 -6.5402085945310748e+00 7.3330016888566507e-01 2.7353899956965583e-01 4.3054843715927865e-01 -8.9841655007900134e-01 -2.7943727028533516e-01 -6.3823766097107981e-01 -1.6558900551707521e+00 -3.6650554730270662e-01 -6.3325585122855199e-01 1.4986644085435601e+00 1.3878939901004575e-01 3.2038256653357122e-01 1.6234391474419154e+00 3.3642302686512132e-01 6.3108340281602848e-01 -1.5236014618593381e+00 -2.1273253983443516e-01 -4.9434851464007928e-01 -2.9910484475167061e+00 -2.0659831097896619e-01 -3.3408795476324860e-01 3.2135527897546576e+00 3.1652224295662035e-01 7.1791557509408122e-01 1.1190002432174598e-01 1.5686413802139050e+00 1.4925448622961124e+00 -2.7922674654097185e-01 -1.3906055599340508e+00 -1.4148801335145125e+00 -3.2513122767951042e-01 -2.3999319768123653e+00 -1.5393590861154454e+00 1.5784870737494419e-01 2.1588353666341034e+00 1.5022026562281023e+00 3.3749319911123177e-01 2.3881257389335770e+00 1.7263936571081082e+00 -9.3527638604165936e-02 -2.1702570251577957e+00 -1.5287795303328273e+00 -2.2587856093989409e-01 -3.9758525394685251e+00 -1.9171610643279300e+00 3.1652224295662035e-01 3.8210446155911533e+00 1.6790386386583926e+00 1.7493150154948556e-01 1.7525097950113906e+00 3.7699508859547901e+00 -6.3976642538733008e-01 -1.4194281392966088e+00 -4.0255519400762481e+00 -6.5644723645058367e-01 -1.8089551656526772e+00 -4.6259744117327068e+00 3.6224921468429572e-01 1.5008809893536113e+00 4.9287521324000716e+00 6.2529855887098906e-01 1.7083668430549295e+00 4.6790714881994786e+00 -2.1878356647391120e-01 -1.5210524293603602e+00 -5.0518031610582170e+00 -3.6539762188702674e-01 -1.8913605317686764e+00 -6.5402085945310748e+00 7.1791557509408122e-01 1.6790386386583926e+00 6.8657636008439047e+00 846 847 848 888 889 890 897 898 899 852 853 854 849 850 851 891 892 893 900 901 902 855 856 857 2.9150238730742157e+00 7.0678408493190393e-03 1.4389510013745341e-02 -2.8268670728233154e+00 -2.1768441489248044e-01 -3.4832440127295661e-01 -1.4327917195289626e+00 -1.1052164502319055e-01 -1.6960561646331751e-01 1.4167244569883122e+00 4.5062413410364762e-03 8.9882584368088589e-03 1.4119439224570700e+00 1.9627294281002028e-01 3.0835130397645688e-01 -1.4384717644934772e+00 9.3300412674869049e-03 1.9245701163748529e-02 -7.2964797789095881e-01 7.4284764070781748e-03 1.3133585891279647e-02 6.8408628221711520e-01 1.0360051724073016e-01 1.5382165825423483e-01 7.0678408493190384e-03 4.2158286586677782e+00 2.0602724415889639e+00 -2.1645852195329582e-01 -3.7827462733884234e+00 -1.8549181559765135e+00 -2.7430154711877153e-01 -2.6032073673444622e+00 -1.7931627893697841e+00 -6.4343761660987954e-04 2.2505451352365915e+00 1.6358344354698822e+00 1.9132768919116999e-01 2.5897583881109481e+00 1.8300238002233145e+00 1.0116392646075030e-02 -2.3112641717399947e+00 -1.8332297951369543e+00 1.5079489815283299e-02 -1.8343399496959210e+00 -1.7104912316184913e+00 2.6781209418682961e-01 1.4754255801534835e+00 1.6656712948195822e+00 1.4389510013745353e-02 2.0602724415889644e+00 6.1753940757839381e+00 -3.4683178222768579e-01 -1.8591714175385006e+00 -6.3005753538052973e+00 -4.2676258478721024e-01 -1.8124637748006023e+00 -4.1950473196396292e+00 -1.4567459410255051e-03 1.6601165819470136e+00 4.5160971888879473e+00 3.0327928017429517e-01 1.8306692241153399e+00 4.2783604821533592e+00 1.8703419451566283e-02 -1.5555476400575992e+00 -4.6257374168163787e+00 2.5184511848551680e-02 -1.7255256480532155e+00 -3.4025727424199737e+00 4.1349439146776285e-01 1.4016502327985996e+00 3.5540810858560334e+00 -2.8268670728233154e+00 -2.1645852195329576e-01 -3.4683178222768568e-01 3.0111837437267330e+00 3.1470940650340207e-01 7.2516446134075596e-01 1.5538150418424321e+00 3.2740685985858864e-01 6.1205513972869041e-01 -1.4341577588233070e+00 -1.9990359385306206e-01 -4.7514441234913862e-01 -1.5786562539736853e+00 -3.7497212535556568e-01 -6.4484932729134314e-01 1.4262645041277320e+00 1.4920753949003315e-01 3.4508402839744662e-01 7.0594774036121333e-01 2.6983525036420419e-01 4.1228551579626882e-01 -8.5752994443780162e-01 -2.6982481505430472e-01 -6.2776362339499436e-01 -2.1768441489248044e-01 -3.7827462733884234e+00 -1.8591714175385006e+00 3.1470940650340207e-01 3.5736611422575613e+00 1.6153806825441956e+00 3.3097329797782893e-01 2.2607500666353539e+00 1.6221052091894577e+00 -7.7120918215966755e-02 -2.0249358119449301e+00 -1.4161569483438237e+00 -3.2679641861986203e-01 -2.2998275156697199e+00 -1.5097391630554560e+00 1.4660844716723617e-01 2.0657668425695377e+00 1.4658009767917606e+00 9.8981252221392743e-02 1.5034506416817059e+00 1.4033606880615666e+00 -2.6967065214155050e-01 -1.2961190921410866e+00 -1.3215800276492007e+00 -3.4832440127295666e-01 -1.8549181559765133e+00 -6.3005753538052973e+00 7.2516446134075607e-01 1.6153806825441956e+00 6.5705215489492730e+00 6.1375416312537801e-01 1.6074872170496448e+00 4.4054984354211237e+00 -1.8719404466821071e-01 -1.4058744003633290e+00 -4.7760566808675824e+00 -6.6405039555425727e-01 -1.7899795606732205e+00 -4.4977695946804834e+00 3.4234725902981306e-01 1.4720089750326637e+00 4.8285932255859851e+00 1.4490958982409560e-01 1.6757543527913543e+00 3.5819989804404306e+00 -6.2660663182461751e-01 -1.3198591104047961e+00 -3.8122105610434498e+00 -1.4327917195289626e+00 -2.7430154711877147e-01 -4.2676258478721030e-01 1.5538150418424321e+00 3.3097329797782882e-01 6.1375416312537801e-01 3.0281619087778671e+00 4.0997853330741774e-01 6.3268683750622778e-01 -2.8479324280576788e+00 -1.4615158792029675e-01 -3.3572270303228813e-01 -8.5420772722542448e-01 -3.6860637941842772e-01 -5.6768732637063590e-01 7.0873211308503847e-01 1.9022990473394411e-01 4.5264269448474048e-01 1.4308117389062265e+00 1.7420573583907961e-01 2.7273306539634545e-01 -1.5865889277994982e+00 -3.1632795740077452e-01 -6.4164414632255728e-01 -1.1052164502319052e-01 -2.6032073673444622e+00 -1.8124637748006023e+00 3.2740685985858864e-01 2.2607500666353539e+00 1.6074872170496450e+00 4.0997853330741774e-01 4.1419156908907029e+00 1.9355739642556171e+00 -1.6497891250856361e-01 -3.7708585658320772e+00 -1.7765328462936993e+00 -3.6698360313755674e-01 -1.8252241442697805e+00 -1.6809298548107119e+00 7.1771780695593659e-02 1.5062315230855061e+00 1.6884235821316931e+00 1.9520837129193208e-01 2.5692695462010664e+00 1.7574875961941940e+00 -3.6188138448422119e-01 -2.2788767493663098e+00 -1.7190458837261355e+00 -1.6960561646331751e-01 -1.7931627893697839e+00 -4.1950473196396292e+00 6.1205513972869041e-01 1.6221052091894577e+00 4.4054984354211237e+00 6.3268683750622778e-01 1.9355739642556167e+00 5.8962189544424906e+00 -3.7819034701289145e-01 -1.8133264728545282e+00 -6.1890353061613821e+00 -5.6057064378850097e-01 -1.6670493309077488e+00 -3.2896310853199662e+00 1.7650220223255128e-01 1.4022822535383694e+00 3.5713655638118054e+00 3.0816927693193596e-01 1.7598086175040604e+00 4.1779987106171879e+00 -6.2104684913469499e-01 -1.4462314513554437e+00 -4.3773679531716301e+00 1.4167244569883122e+00 -6.4343761660987141e-04 -1.4567459410255272e-03 -1.4341577588233070e+00 -7.7120918215966755e-02 -1.8719404466821069e-01 -2.8479324280576788e+00 -1.6497891250856364e-01 -3.7819034701289139e-01 2.9451777350158994e+00 6.3851772098994205e-03 1.0597680419631978e-02 6.8283235903102635e-01 6.5836141283331290e-02 1.6625514295208815e-01 -7.3056474336161203e-01 7.2470097215128603e-03 1.4591305502007854e-02 -1.4518079822658614e+00 1.4269942211490194e-02 2.7711952011186633e-02 1.4197283614732217e+00 1.4900499791490654e-01 3.4768505673721306e-01 4.5062413410364675e-03 2.2505451352365915e+00 1.6601165819470136e+00 -1.9990359385306208e-01 -2.0249358119449301e+00 -1.4058744003633290e+00 -1.4615158792029678e-01 -3.7708585658320772e+00 -1.8133264728545286e+00 6.3851772098994109e-03 3.6295508049067089e+00 1.5955117971456576e+00 1.8552649890765160e-01 1.4728344395327959e+00 1.3916669929853200e+00 4.0528115331119703e-03 -1.3036601674616217e+00 -1.3477164902955321e+00 1.8289238535302565e-02 -2.2859409608034276e+00 -1.4817360039878074e+00 1.2729521424635673e-01 2.0324651263659597e+00 1.4013579954232056e+00 8.9882584368088467e-03 1.6358344354698822e+00 4.5160971888879473e+00 -4.7514441234913851e-01 -1.4161569483438237e+00 -4.7760566808675824e+00 -3.3572270303228807e-01 -1.7765328462936993e+00 -6.1890353061613839e+00 1.0597680419631982e-02 1.5955117971456576e+00 6.6612465720265757e+00 4.4887347315838455e-01 1.6837534651832378e+00 3.5503076401822495e+00 7.1058096531075032e-03 -1.3626164214626242e+00 -3.9365339236090513e+00 3.5163861034532153e-02 -1.7662068578349910e+00 -4.5090308699301378e+00 3.0013803267896139e-01 1.4064133761363606e+00 4.6830053794713820e+00 1.4119439224570700e+00 1.9132768919116999e-01 3.0327928017429506e-01 -1.5786562539736853e+00 -3.2679641861986197e-01 -6.6405039555425727e-01 -8.5420772722542448e-01 -3.6698360313755668e-01 -5.6057064378850086e-01 6.8283235903102635e-01 1.8552649890765158e-01 4.4887347315838455e-01 3.1085802744568363e+00 4.2597707207862723e-01 6.6005707606227060e-01 -2.8819385299471518e+00 -1.6667897224326983e-01 -3.7593286456594344e-01 -1.4577707773938919e+00 -2.7419839191176998e-01 -4.2425517287238784e-01 1.5692167325952200e+00 3.3182612573500991e-01 6.1259924738613936e-01 1.9627294281002028e-01 2.5897583881109481e+00 1.8306692241153399e+00 -3.7497212535556568e-01 -2.2998275156697199e+00 -1.7899795606732207e+00 -3.6860637941842772e-01 -1.8252241442697807e+00 -1.6670493309077488e+00 6.5836141283331276e-02 1.4728344395327959e+00 1.6837534651832380e+00 4.2597707207862723e-01 4.2744489203420430e+00 2.0319088362863393e+00 -1.6663397706345856e-01 -3.8509840764262977e+00 -1.8778784616250239e+00 -1.0610611693735268e-01 -2.6411276293070949e+00 -1.8220275172648526e+00 3.2823244260282575e-01 2.2801216176871066e+00 1.6106033448859289e+00 3.0835130397645688e-01 1.8300238002233145e+00 4.2783604821533592e+00 -6.4484932729134303e-01 -1.5097391630554560e+00 -4.4977695946804834e+00 -5.6768732637063579e-01 -1.6809298548107117e+00 -3.2896310853199662e+00 1.6625514295208815e-01 1.3916669929853200e+00 3.5503076401822495e+00 6.6005707606227060e-01 2.0319088362863393e+00 6.1353225708462862e+00 -3.7738678008530585e-01 -1.8859693220526816e+00 -6.3771320299229872e+00 -1.6236878559806511e-01 -1.8157697416909129e+00 -4.2458991593721533e+00 6.1762869635453399e-01 1.6388084521147883e+00 4.4464411761136953e+00 -1.4384717644934772e+00 1.0116392646075023e-02 1.8703419451566242e-02 1.4262645041277320e+00 1.4660844716723617e-01 3.4234725902981300e-01 7.0873211308503847e-01 7.1771780695593659e-02 1.7650220223255131e-01 -7.3056474336161203e-01 4.0528115331119668e-03 7.1058096531074963e-03 -2.8819385299471518e+00 -1.6663397706345856e-01 -3.7738678008530596e-01 2.9228339346717647e+00 1.2453910728590688e-02 2.4018768214965527e-02 1.4547945405226625e+00 5.2907535293007443e-03 7.7396322114579481e-03 -1.4616500546049567e+00 -8.3660119236449657e-02 -1.9903031070815563e-01 9.3300412674869031e-03 -2.3112641717399947e+00 -1.5555476400575987e+00 1.4920753949003310e-01 2.0657668425695377e+00 1.4720089750326637e+00 1.9022990473394411e-01 1.5062315230855061e+00 1.4022822535383694e+00 7.2470097215128568e-03 -1.3036601674616217e+00 -1.3626164214626242e+00 -1.6667897224326983e-01 -3.8509840764262977e+00 -1.8859693220526812e+00 1.2453910728590685e-02 3.6476080081656845e+00 1.6746265707082282e+00 3.9787346136916854e-04 2.3070197908885195e+00 1.6795502792186501e+00 -2.0218730715966682e-01 -2.0607177490813333e+00 -1.4243346949250075e+00 1.9245701163748540e-02 -1.8332297951369543e+00 -4.6257374168163787e+00 3.4508402839744667e-01 1.4658009767917606e+00 4.8285932255859851e+00 4.5264269448474048e-01 1.6884235821316931e+00 3.5713655638118054e+00 1.4591305502007847e-02 -1.3477164902955321e+00 -3.9365339236090513e+00 -3.7593286456594349e-01 -1.8778784616250237e+00 -6.3771320299229881e+00 2.4018768214965527e-02 1.6746265707082275e+00 6.7879072029233471e+00 -1.8678910129950642e-03 1.6604881216300840e+00 4.5730990689021809e+00 -4.7778174218397007e-01 -1.4305145042042562e+00 -4.8215616908749004e+00 -7.2964797789095870e-01 1.5079489815283308e-02 2.5184511848551673e-02 7.0594774036121322e-01 9.8981252221392729e-02 1.4490958982409557e-01 1.4308117389062265e+00 1.9520837129193208e-01 3.0816927693193596e-01 -1.4518079822658614e+00 1.8289238535302552e-02 3.5163861034532146e-02 -1.4577707773938919e+00 -1.0610611693735271e-01 -1.6236878559806511e-01 1.4547945405226625e+00 3.9787346136917028e-04 -1.8678910129950712e-03 2.9467223531083251e+00 -5.6235706568278851e-04 1.9737349752300508e-03 -2.8990496353477146e+00 -2.2128775132224437e-01 -3.5116429800328530e-01 7.4284764070781679e-03 -1.8343399496959210e+00 -1.7255256480532153e+00 2.6983525036420425e-01 1.5034506416817057e+00 1.6757543527913543e+00 1.7420573583907961e-01 2.5692695462010664e+00 1.7598086175040606e+00 1.4269942211490187e-02 -2.2859409608034280e+00 -1.7662068578349908e+00 -2.7419839191176998e-01 -2.6411276293070944e+00 -1.8157697416909131e+00 5.2907535293007391e-03 2.3070197908885195e+00 1.6604881216300837e+00 -5.6235706568279371e-04 4.2175878629855372e+00 2.0027167221778175e+00 -1.9626940937369999e-01 -3.8359193019503861e+00 -1.7912655665241970e+00 1.3133585891279654e-02 -1.7104912316184910e+00 -3.4025727424199732e+00 4.1228551579626876e-01 1.4033606880615666e+00 3.5819989804404306e+00 2.7273306539634545e-01 1.7574875961941940e+00 4.1779987106171879e+00 2.7711952011186647e-02 -1.4817360039878069e+00 -4.5090308699301378e+00 -4.2425517287238784e-01 -1.8220275172648526e+00 -4.2458991593721533e+00 7.7396322114579273e-03 1.6795502792186503e+00 4.5730990689021809e+00 1.9737349752300716e-03 2.0027167221778175e+00 6.0993779934096413e+00 -3.1132231340938044e-01 -1.8288605327810781e+00 -6.2749719816471767e+00 6.8408628221711520e-01 2.6781209418682961e-01 4.1349439146776285e-01 -8.5752994443780162e-01 -2.6967065214155045e-01 -6.2660663182461773e-01 -1.5865889277994982e+00 -3.6188138448422114e-01 -6.2104684913469499e-01 1.4197283614732217e+00 1.2729521424635670e-01 3.0013803267896133e-01 1.5692167325952200e+00 3.2823244260282564e-01 6.1762869635453399e-01 -1.4616500546049567e+00 -2.0218730715966682e-01 -4.7778174218397007e-01 -2.8990496353477146e+00 -1.9626940937369999e-01 -3.1132231340938038e-01 3.1317871859044146e+00 3.0666900212312659e-01 7.0549641605140478e-01 1.0360051724073016e-01 1.4754255801534835e+00 1.4016502327985993e+00 -2.6982481505430472e-01 -1.2961190921410866e+00 -1.3198591104047961e+00 -3.1632795740077452e-01 -2.2788767493663098e+00 -1.4462314513554435e+00 1.4900499791490657e-01 2.0324651263659597e+00 1.4064133761363604e+00 3.3182612573500991e-01 2.2801216176871066e+00 1.6388084521147883e+00 -8.3660119236449670e-02 -2.0607177490813329e+00 -1.4305145042042562e+00 -2.2128775132224437e-01 -3.8359193019503861e+00 -1.8288605327810776e+00 3.0666900212312659e-01 3.6836205683325662e+00 1.5785935376958253e+00 1.5382165825423483e-01 1.6656712948195824e+00 3.5540810858560334e+00 -6.2776362339499425e-01 -1.3215800276492007e+00 -3.8122105610434498e+00 -6.4164414632255728e-01 -1.7190458837261355e+00 -4.3773679531716301e+00 3.4768505673721306e-01 1.4013579954232056e+00 4.6830053794713820e+00 6.1259924738613936e-01 1.6106033448859287e+00 4.4464411761136953e+00 -1.9903031070815563e-01 -1.4243346949250073e+00 -4.8215616908749004e+00 -3.5116429800328530e-01 -1.7912655665241974e+00 -6.2749719816471758e+00 7.0549641605140490e-01 1.5785935376958251e+00 6.6025845452960450e+00 810 811 812 852 853 854 495 496 497 477 478 479 813 814 815 855 856 857 498 499 500 480 481 482 2.8354190600781060e+00 -1.9862993536037408e-02 -1.8739573107807717e-02 -2.7494158252264302e+00 -2.4713470942775234e-01 -2.6237695217242835e-01 -1.3615732685018365e+00 -1.1017723975917246e-01 -1.1538057170459454e-01 1.3593999011914950e+00 -1.9685410928019745e-02 -2.3068498777224881e-02 1.3406124052350208e+00 2.1784631002211097e-01 2.3108351634175298e-01 -1.3765582160191050e+00 3.7914591527406748e-02 5.0603552504755178e-02 -6.8440299937069649e-01 3.6182915698777608e-02 3.8914057699302285e-02 6.3651894261344699e-01 1.0491653640268656e-01 9.8964469216244910e-02 -1.9862993536037394e-02 4.8531656376483090e+00 2.1579074479799796e+00 -2.3937247290061436e-01 -4.4252655651904904e+00 -2.0798444529776003e+00 -3.1099691748279096e-01 -3.1413529380725556e+00 -1.8326294657517408e+00 -3.3413773467366938e-02 2.7973632347538202e+00 1.8098683357943324e+00 2.1113611122884171e-01 3.1698756883218251e+00 1.9087730982442568e+00 3.9063987833328088e-02 -2.8931952140986037e+00 -2.0256085204124332e+00 4.9509714649088668e-02 -2.3672502375474220e+00 -1.7570975045565462e+00 3.0393634367554784e-01 2.0066593941851187e+00 1.8186310616797514e+00 -1.8739573107807724e-02 2.1579074479799796e+00 5.1401856805522961e+00 -2.5454539576297286e-01 -2.0933004712757262e+00 -5.3048778076158456e+00 -3.2692983722141211e-01 -1.8510025862707171e+00 -3.2731139510399214e+00 -4.0668460761842794e-02 1.8437093840462111e+00 3.6045811900215212e+00 2.2685148750192810e-01 1.9139019211382722e+00 3.3648591489325437e+00 4.5117738207650873e-02 -1.7809483809678182e+00 -3.7168143069100728e+00 5.3415328539217183e-02 -1.7776480564630059e+00 -2.5396854609739794e+00 3.1549871260523571e-01 1.5873807418128045e+00 2.7248655070334573e+00 -2.7494158252264302e+00 -2.3937247290061436e-01 -2.5454539576297286e-01 2.9255002527916929e+00 4.1506971379218854e-01 5.9558690726189378e-01 1.4805839449801845e+00 3.9852993911559920e-01 4.8816717959207107e-01 -1.3648290716097091e+00 -2.5352312706202978e-01 -3.7473543190832148e-01 -1.5020763513681874e+00 -4.5554213707983499e-01 -5.1874739418172688e-01 1.3550269642056176e+00 1.8481866115007306e-01 2.6689146524195717e-01 6.5410984648961135e-01 3.0534671743220271e-01 3.1126569747441907e-01 -7.9889976026277942e-01 -3.5532729444758443e-01 -5.1388302771731986e-01 -2.4713470942775234e-01 -4.4252655651904913e+00 -2.0933004712757262e+00 4.1506971379218843e-01 4.1800558548859099e+00 1.9730909839507091e+00 4.0572186607688199e-01 2.8055035369101611e+00 1.7962885386049576e+00 -7.9641535202561953e-02 -2.5381439012031715e+00 -1.7243153598701000e+00 -4.1494797233248870e-01 -2.8775063299115149e+00 -1.7241623794251402e+00 1.8235534079994756e-01 2.6128010204131189e+00 1.7934244970919453e+00 9.2897410903915650e-02 2.0377006618231861e+00 1.5868764549264254e+00 -3.5432011461012791e-01 -1.7951452777271992e+00 -1.6079022640030718e+00 -2.6237695217242835e-01 -2.0798444529776003e+00 -5.3048778076158456e+00 5.9558690726189367e-01 1.9730909839507091e+00 5.6175339828497943e+00 4.9075138801480428e-01 1.7702973267493471e+00 3.5113175242779091e+00 -1.2122738568451229e-01 -1.7128690959941710e+00 -3.8992808499040907e+00 -5.4094901170253418e-01 -1.9779336423164424e+00 -3.6126737075437325e+00 2.6612865389660084e-01 1.8007446011184656e+00 3.9584341578519386e+00 8.3576593583117351e-02 1.8314085100714084e+00 2.7435373808957859e+00 -5.1149019319693745e-01 -1.6048942306017162e+00 -3.0139906808117582e+00 -1.3615732685018362e+00 -3.1099691748279101e-01 -3.2692983722141211e-01 1.4805839449801845e+00 4.0572186607688199e-01 4.9075138801480422e-01 2.8392741067763354e+00 4.7322594060817252e-01 4.9113041421082726e-01 -2.6660446725181637e+00 -1.6616539901930402e-01 -2.4710203663364871e-01 -7.9534663123434846e-01 -4.3400041476430323e-01 -4.4941271241376274e-01 6.5694743386659926e-01 2.4510349038032847e-01 3.6527887758913397e-01 1.3041766856982844e+00 1.8495756302160729e-01 1.9460521139300621e-01 -1.4580175990670539e+00 -3.9784612882059212e-01 -5.1832130493894812e-01 -1.1017723975917247e-01 -3.1413529380725556e+00 -1.8510025862707171e+00 3.9852993911559920e-01 2.8055035369101611e+00 1.7702973267493471e+00 4.7322594060817252e-01 4.6082094050767770e+00 1.9695400154081115e+00 -1.9605496434760222e-01 -4.2459333963765307e+00 -1.9407355859092983e+00 -4.2481083965816863e-01 -2.3521950745641655e+00 -1.7211780028735384e+00 7.7809611876659329e-02 2.0375915800058721e+00 1.8397879447157126e+00 2.1038093662446974e-01 3.0318463794246271e+00 1.7878732212144133e+00 -4.2890338445995435e-01 -2.7436694924041864e+00 -1.8545823330340307e+00 -1.1538057170459451e-01 -1.8326294657517408e+00 -3.2731139510399214e+00 4.8816717959207101e-01 1.7962885386049576e+00 3.5113175242779091e+00 4.9113041421082732e-01 1.9695400154081115e+00 4.7745449463963929e+00 -2.9020855369356791e-01 -1.9904729044843859e+00 -5.0647186861187325e+00 -4.3724391301759802e-01 -1.7107208490063115e+00 -2.4508814648158483e+00 1.2724718186061726e-01 1.5820207812826628e+00 2.7318070945320296e+00 2.2421430607570875e-01 1.7957323423137983e+00 3.1983175224922178e+00 -4.8792604332346046e-01 -1.6097584583670925e+00 -3.4272729857240463e+00 1.3593999011914948e+00 -3.3413773467366931e-02 -4.0668460761842787e-02 -1.3648290716097091e+00 -7.9641535202561967e-02 -1.2122738568451227e-01 -2.6660446725181637e+00 -1.9605496434760231e-01 -2.9020855369356791e-01 2.7724438254820192e+00 -2.5468594649331627e-02 -3.9909699050926548e-02 6.3181394287581227e-01 6.2038944761210912e-02 1.0957314789428825e-01 -6.8782891365712151e-01 3.9805292933849337e-02 5.6592199665172489e-02 -1.3408216058310334e+00 5.4200293272717942e-02 6.5123010630449188e-02 1.2958665940667011e+00 1.7853433669908453e-01 2.6072574100093948e-01 -1.9685410928019748e-02 2.7973632347538202e+00 1.8437093840462111e+00 -2.5352312706202978e-01 -2.5381439012031710e+00 -1.7128690959941710e+00 -1.6616539901930411e-01 -4.2459333963765307e+00 -1.9904729044843856e+00 -2.5468594649331627e-02 4.0776929269608271e+00 1.9053134114066002e+00 2.3653195457732543e-01 2.0043406275700808e+00 1.5722449548565764e+00 2.5936326822026221e-02 -1.8085096831297194e+00 -1.6410250858241215e+00 5.2869793835400185e-02 -2.7590407654024043e+00 -1.6536450263390472e+00 1.4950445642393062e-01 2.4722309568270977e+00 1.6767443623323373e+00 -2.3068498777224875e-02 1.8098683357943324e+00 3.6045811900215212e+00 -3.7473543190832148e-01 -1.7243153598700998e+00 -3.8992808499040907e+00 -2.4710203663364871e-01 -1.9407355859092981e+00 -5.0647186861187334e+00 -3.9909699050926548e-02 1.9053134114066006e+00 5.5478894807107455e+00 3.5953140973197911e-01 1.8422135564328153e+00 2.7172810440877990e+00 3.6717543388516544e-02 -1.6593390431198634e+00 -3.1164709066060277e+00 6.7649851488757962e-02 -1.9146574456477137e+00 -3.5327933844582069e+00 2.2091686176086403e-01 1.6816521309132260e+00 3.7435121122669948e+00 1.3406124052350208e+00 2.1113611122884171e-01 2.2685148750192816e-01 -1.5020763513681874e+00 -4.1494797233248870e-01 -5.4094901170253418e-01 -7.9534663123434846e-01 -4.2481083965816852e-01 -4.3724391301759802e-01 6.3181394287581227e-01 2.3653195457732543e-01 3.5953140973197906e-01 2.9062691962708729e+00 5.0220822583468938e-01 5.2254517501681264e-01 -2.6946917955729184e+00 -2.0456334015269362e-01 -2.9652203402598415e-01 -1.3296797102869493e+00 -3.1051761568435998e-01 -3.2459008076931734e-01 1.4430989440806954e+00 4.0496347618685447e-01 4.9037696726471391e-01 2.1784631002211097e-01 3.1698756883218251e+00 1.9139019211382722e+00 -4.5554213707983504e-01 -2.8775063299115149e+00 -1.9779336423164424e+00 -4.3400041476430323e-01 -2.3521950745641655e+00 -1.7107208490063115e+00 6.2038944761210912e-02 2.0043406275700808e+00 1.8422135564328157e+00 5.0220822583468927e-01 4.8147700537165132e+00 2.1256630730062249e+00 -2.0171362775269916e-01 -4.3977407614549318e+00 -2.1178982517432750e+00 -9.7557480865416851e-02 -3.1459736616315563e+00 -1.8757981664814594e+00 4.0672017984423947e-01 2.7844294579537507e+00 1.8005723589701761e+00 2.3108351634175298e-01 1.9087730982442568e+00 3.3648591489325437e+00 -5.1874739418172688e-01 -1.7241623794251402e+00 -3.6126737075437330e+00 -4.4941271241376268e-01 -1.7211780028735379e+00 -2.4508814648158483e+00 1.0957314789428828e-01 1.5722449548565764e+00 2.7172810440877990e+00 5.2254517501681275e-01 2.1256630730062249e+00 5.0051518361480598e+00 -2.9199324393136866e-01 -2.1101687157818754e+00 -5.2610051902782331e+00 -1.0026242102923276e-01 -1.8643448488287020e+00 -3.2687436339924694e+00 4.9721393230323352e-01 1.8131728208021980e+00 3.5060119674618808e+00 -1.3765582160191050e+00 3.9063987833328068e-02 4.5117738207650873e-02 1.3550269642056176e+00 1.8235534079994756e-01 2.6612865389660090e-01 6.5694743386659937e-01 7.7809611876659329e-02 1.2724718186061726e-01 -6.8782891365712151e-01 2.5936326822026227e-02 3.6717543388516530e-02 -2.6946917955729184e+00 -2.0171362775269913e-01 -2.9199324393136866e-01 2.7440730280461931e+00 -1.0427094652536007e-02 -1.8357838513957874e-02 1.3416335456246165e+00 -1.8451330235497099e-02 -2.5340247916466749e-02 -1.3386020464938813e+00 -9.4573214691228952e-02 -1.3951978699159220e-01 3.7914591527406769e-02 -2.8931952140986033e+00 -1.7809483809678182e+00 1.8481866115007306e-01 2.6128010204131193e+00 1.8007446011184653e+00 2.4510349038032847e-01 2.0375915800058721e+00 1.5820207812826628e+00 3.9805292933849337e-02 -1.8085096831297194e+00 -1.6593390431198631e+00 -2.0456334015269362e-01 -4.3977407614549318e+00 -2.1101687157818754e+00 -1.0427094652536001e-02 4.1618078819348723e+00 2.0463140530859043e+00 -3.2407956637412250e-02 2.8203409946207261e+00 1.8610835521849634e+00 -2.6024364454901289e-01 -2.5330958182913350e+00 -1.7397068478024384e+00 5.0603552504755164e-02 -2.0256085204124332e+00 -3.7168143069100728e+00 2.6689146524195717e-01 1.7934244970919453e+00 3.9584341578519386e+00 3.6527887758913402e-01 1.8397879447157126e+00 2.7318070945320296e+00 5.6592199665172503e-02 -1.6410250858241218e+00 -3.1164709066060277e+00 -2.9652203402598415e-01 -2.1178982517432750e+00 -5.2610051902782331e+00 -1.8357838513957881e-02 2.0463140530859043e+00 5.6951032973873943e+00 -4.2071892071470364e-02 1.8559291957204214e+00 3.6031990115290791e+00 -3.8241433038960237e-01 -1.7509238326341534e+00 -3.8942531575061095e+00 -6.8440299937069671e-01 4.9509714649088675e-02 5.3415328539217183e-02 6.5410984648961135e-01 9.2897410903915623e-02 8.3576593583117351e-02 1.3041766856982844e+00 2.1038093662446974e-01 2.2421430607570877e-01 -1.3408216058310334e+00 5.2869793835400178e-02 6.7649851488757962e-02 -1.3296797102869493e+00 -9.7557480865416824e-02 -1.0026242102923277e-01 1.3416335456246165e+00 -3.2407956637412257e-02 -4.2071892071470364e-02 2.6620723209278010e+00 -3.8144236192033804e-02 -3.8631353215944332e-02 -2.6070880832516332e+00 -2.3754818231801131e-01 -2.4789041337015383e-01 3.6182915698777601e-02 -2.3672502375474220e+00 -1.7776480564630059e+00 3.0534671743220271e-01 2.0377006618231861e+00 1.8314085100714084e+00 1.8495756302160724e-01 3.0318463794246275e+00 1.7957323423137981e+00 5.4200293272717963e-02 -2.7590407654024043e+00 -1.9146574456477139e+00 -3.1051761568435998e-01 -3.1459736616315568e+00 -1.8643448488287016e+00 -1.8451330235497099e-02 2.8203409946207261e+00 1.8559291957204214e+00 -3.8144236192033790e-02 4.5945274525166671e+00 2.0469263531149950e+00 -2.1357430731341129e-01 -4.2121508238038254e+00 -1.9733460502812001e+00 3.8914057699302285e-02 -1.7570975045565462e+00 -2.5396854609739790e+00 3.1126569747441907e-01 1.5868764549264254e+00 2.7435373808957859e+00 1.9460521139300616e-01 1.7878732212144133e+00 3.1983175224922178e+00 6.5123010630449230e-02 -1.6536450263390474e+00 -3.5327933844582069e+00 -3.2459008076931734e-01 -1.8757981664814594e+00 -3.2687436339924694e+00 -2.5340247916466756e-02 1.8610835521849631e+00 3.6031990115290791e+00 -3.8631353215944325e-02 2.0469263531149946e+00 4.8256935128993366e+00 -2.2134629529544478e-01 -1.9962188840637434e+00 -5.0295249483917637e+00 6.3651894261344677e-01 3.0393634367554784e-01 3.1549871260523571e-01 -7.9889976026277942e-01 -3.5432011461012791e-01 -5.1149019319693745e-01 -1.4580175990670539e+00 -4.2890338445995441e-01 -4.8792604332346046e-01 1.2958665940667011e+00 1.4950445642393062e-01 2.2091686176086403e-01 1.4430989440806956e+00 4.0672017984423947e-01 4.9721393230323346e-01 -1.3386020464938813e+00 -2.6024364454901289e-01 -3.8241433038960226e-01 -2.6070880832516332e+00 -2.1357430731341132e-01 -2.2134629529544486e-01 2.8271230083145040e+00 3.9688047098878865e-01 5.6954735553611180e-01 1.0491653640268657e-01 2.0066593941851187e+00 1.5873807418128045e+00 -3.5532729444758437e-01 -1.7951452777271992e+00 -1.6048942306017164e+00 -3.9784612882059212e-01 -2.7436694924041864e+00 -1.6097584583670925e+00 1.7853433669908453e-01 2.4722309568270981e+00 1.6816521309132260e+00 4.0496347618685441e-01 2.7844294579537512e+00 1.8131728208021982e+00 -9.4573214691228952e-02 -2.5330958182913350e+00 -1.7509238326341534e+00 -2.3754818231801131e-01 -4.2121508238038254e+00 -1.9962188840637438e+00 3.9688047098878854e-01 4.0207416032605776e+00 1.8795897121384773e+00 9.8964469216244910e-02 1.8186310616797516e+00 2.7248655070334573e+00 -5.1388302771731986e-01 -1.6079022640030718e+00 -3.0139906808117582e+00 -5.1832130493894812e-01 -1.8545823330340307e+00 -3.4272729857240463e+00 2.6072574100093948e-01 1.6767443623323377e+00 3.7435121122669948e+00 4.9037696726471391e-01 1.8005723589701759e+00 3.5060119674618808e+00 -1.3951978699159220e-01 -1.7397068478024384e+00 -3.8942531575061095e+00 -2.4789041337015374e-01 -1.9733460502811999e+00 -5.0295249483917628e+00 5.6954735553611180e-01 1.8795897121384766e+00 5.3906521856713443e+00 852 853 854 897 898 899 510 511 512 495 496 497 855 856 857 900 901 902 513 514 515 498 499 500 2.6654335671884390e+00 -3.1544605955844518e-02 -3.1137086118929451e-02 -2.5700551742958093e+00 -2.3653887581559957e-01 -2.4731741419345829e-01 -1.3119038009401263e+00 -1.0299089533220410e-01 -1.0667265105305652e-01 1.3102219705935991e+00 -2.8194506662745242e-02 -3.3990392324956369e-02 1.2762376881594073e+00 2.0929789014326813e-01 2.2068952506364384e-01 -1.3159894667504248e+00 4.5484293421905443e-02 6.0459713481842210e-02 -6.7502626245559316e-01 4.4523180667041265e-02 4.7439186653420277e-02 6.2108147850050754e-01 9.9963519534178702e-02 9.0529118491494420e-02 -3.1544605955844553e-02 4.6464210485960828e+00 2.1051672617907040e+00 -2.4157444616887833e-01 -4.2017541532503877e+00 -2.0296899273436262e+00 -3.0854432037790686e-01 -3.0744784483040242e+00 -1.7967479575675889e+00 -3.7728016339221869e-02 2.7190954823082167e+00 1.7800228626354444e+00 2.1252664547219269e-01 3.0839330699417804e+00 1.8737264812320278e+00 4.9712442072075431e-02 -2.8022822630830482e+00 -1.9926469479905300e+00 5.5122015189274828e-02 -2.3413584767741797e+00 -1.7313569259863570e+00 3.0203028610830807e-01 1.9704237405655618e+00 1.7915251532299257e+00 -3.1137086118929427e-02 2.1051672617907040e+00 4.8988352673802522e+00 -2.5359261317232362e-01 -2.0307063566667303e+00 -5.0578339473287377e+00 -3.2296919733455204e-01 -1.8214076875129810e+00 -3.1789971210104011e+00 -4.6675104324999078e-02 1.8062331817810915e+00 3.5117688964963367e+00 2.2696909566149653e-01 1.8761009654663365e+00 3.2540811829423570e+00 5.7845620053783839e-02 -1.7405619891672814e+00 -3.6079949940792346e+00 5.9081987276841337e-02 -1.7513931532112030e+00 -2.4931745522302489e+00 3.1047729795868184e-01 1.5565677775200639e+00 2.6733152678296772e+00 -2.5700551742958093e+00 -2.4157444616887833e-01 -2.5359261317232368e-01 2.7522517671990276e+00 4.1170512546697863e-01 5.9483876421751214e-01 1.4334658996817624e+00 4.0064702174270228e-01 4.8911164849111555e-01 -1.3126476455893006e+00 -2.5232226186233320e-01 -3.7581658496804510e-01 -1.4432952689724527e+00 -4.5587980639760151e-01 -5.1792713235378662e-01 1.2885012978394146e+00 1.8530152990419518e-01 2.6862167380292057e-01 6.4072780356711356e-01 3.0714741817830726e-01 3.1107002930009237e-01 -7.8894867942975555e-01 -3.5502458086337041e-01 -5.1630578531748528e-01 -2.3653887581559957e-01 -4.2017541532503868e+00 -2.0307063566667303e+00 4.1170512546697857e-01 3.9508426385046360e+00 1.9108049962759841e+00 4.0318373940430852e-01 2.7254788131039032e+00 1.7562623144020939e+00 -7.6220435132648381e-02 -2.4520737725712460e+00 -1.6873201035570309e+00 -4.1606319723940322e-01 -2.7807576166173948e+00 -1.6809062866413580e+00 1.7392274844135436e-01 2.5123541502386244e+00 1.7497435024231660e+00 9.1859084626967985e-02 1.9989491020331531e+00 1.5555220071641820e+00 -3.5184818975195792e-01 -1.7530391614412884e+00 -1.5734000734003066e+00 -2.4731741419345829e-01 -2.0296899273436262e+00 -5.0578339473287386e+00 5.9483876421751214e-01 1.9108049962759839e+00 5.3717896810259704e+00 4.8802683129596786e-01 1.7384239874588709e+00 3.4162309841050109e+00 -1.1701209251023698e-01 -1.6703194757618340e+00 -3.8079703333161570e+00 -5.4390827940973074e-01 -1.9411019168114367e+00 -3.5020452160018101e+00 2.5561203546935141e-01 1.7593135235793729e+00 3.8487376980445873e+00 8.0602642917960043e-02 1.8032847508240462e+00 2.6964527808796497e+00 -5.1084248778736474e-01 -1.5707159382213771e+00 -2.9653616474085123e+00 -1.3119038009401263e+00 -3.0854432037790686e-01 -3.2296919733455198e-01 1.4334658996817622e+00 4.0318373940430857e-01 4.8802683129596774e-01 2.8222320822577092e+00 4.7433324258675663e-01 4.8904183986742999e-01 -2.6424561953645540e+00 -1.5826175318945859e-01 -2.3959092189455181e-01 -7.8729028094733644e-01 -4.3294344315807992e-01 -4.4649073241488940e-01 6.4248006771059762e-01 2.4069302895358474e-01 3.6219616270742788e-01 1.3191130267270994e+00 1.7766147865407853e-01 1.8643971309441792e-01 -1.4756407991251517e+00 -3.9612197287328321e-01 -5.1665369532125038e-01 -1.0299089533220408e-01 -3.0744784483040242e+00 -1.8214076875129810e+00 4.0064702174270234e-01 2.7254788131039032e+00 1.7384239874588709e+00 4.7433324258675669e-01 4.5739999133476186e+00 1.9406758742969104e+00 -1.9648140797605565e-01 -4.1988021957590593e+00 -1.9125432277199810e+00 -4.2976624798927066e-01 -2.3242747417230429e+00 -1.6958178484123967e+00 7.0695163434343802e-02 2.0022836845836354e+00 1.8136799884647274e+00 2.1468601788928721e-01 3.0359772328272130e+00 1.7675947639201675e+00 -4.3112289435555895e-01 -2.7401842580762446e+00 -1.8306058504953175e+00 -1.0667265105305651e-01 -1.7967479575675889e+00 -3.1789971210104011e+00 4.8911164849111555e-01 1.7562623144020941e+00 3.4162309841050105e+00 4.8904183986743011e-01 1.9406758742969106e+00 4.7134053592764378e+00 -2.9266760482403792e-01 -1.9600795893501375e+00 -5.0044929212292502e+00 -4.3886053088686183e-01 -1.6789271864389430e+00 -2.4005561852188482e+00 1.2085426491267917e-01 1.5509819776431475e+00 2.6813185720212180e+00 2.2811996282177241e-01 1.7721695306299539e+00 3.1825793529886326e+00 -4.8892692932904047e-01 -1.5843349636154371e+00 -3.4094880409327999e+00 1.3102219705935991e+00 -3.7728016339221883e-02 -4.6675104324999078e-02 -1.3126476455893006e+00 -7.6220435132648368e-02 -1.1701209251023698e-01 -2.6424561953645540e+00 -1.9648140797605565e-01 -2.9266760482403792e-01 2.7540635633487467e+00 -2.9640133237240802e-02 -4.6469146400403546e-02 6.1724188002409675e-01 5.8743937054018071e-02 1.0753881426485340e-01 -6.7666605238200106e-01 4.2899877608700399e-02 6.1350328140795309e-02 -1.3583003866088250e+00 5.7736433880388259e-02 6.8707826640280301e-02 1.3085428659782377e+00 1.8068974414206002e-01 2.6522697901374853e-01 -2.8194506662745249e-02 2.7190954823082158e+00 1.8062331817810917e+00 -2.5232226186233325e-01 -2.4520737725712460e+00 -1.6703194757618338e+00 -1.5826175318945859e-01 -4.1988021957590593e+00 -1.9600795893501373e+00 -2.9640133237240813e-02 4.0286723035864345e+00 1.8722048165345242e+00 2.3479871512575598e-01 1.9648963278250653e+00 1.5406163373027519e+00 3.3867730196866404e-02 -1.7681719407775465e+00 -1.6060545079788913e+00 5.8464142476249051e-02 -2.7550861205464772e+00 -1.6300983238408804e+00 1.4128806715290607e-01 2.4614699159346127e+00 1.6474975613133749e+00 -3.3990392324956355e-02 1.7800228626354444e+00 3.5117688964963367e+00 -3.7581658496804515e-01 -1.6873201035570309e+00 -3.8079703333161570e+00 -2.3959092189455178e-01 -1.9125432277199812e+00 -5.0044929212292510e+00 -4.6469146400403560e-02 1.8722048165345242e+00 5.4983476125004129e+00 3.6066819270945338e-01 1.8146648177450586e+00 2.6680200813319708e+00 4.8733331255072752e-02 -1.6298761998547926e+00 -3.0726027934471110e+00 7.5448151108259587e-02 -1.8923039994716473e+00 -3.5231806212619885e+00 2.1101737051517069e-01 1.6551510336884254e+00 3.7301100789257871e+00 1.2762376881594073e+00 2.1252664547219274e-01 2.2696909566149653e-01 -1.4432952689724527e+00 -4.1606319723940327e-01 -5.4390827940973074e-01 -7.8729028094733644e-01 -4.2976624798927071e-01 -4.3886053088686183e-01 6.1724188002409675e-01 2.3479871512575598e-01 3.6066819270945338e-01 2.8424039646662917e+00 5.0497262846704760e-01 5.2272502447032676e-01 -2.6191558433347608e+00 -2.0259075881588456e-01 -2.9641406489869815e-01 -1.3339080409350874e+00 -3.1156121918735113e-01 -3.2378529140257045e-01 1.4477659013398430e+00 4.0768343416691327e-01 4.9260585375658444e-01 2.0929789014326808e-01 3.0839330699417804e+00 1.8761009654663365e+00 -4.5587980639760151e-01 -2.7807576166173953e+00 -1.9411019168114367e+00 -4.3294344315807992e-01 -2.3242747417230429e+00 -1.6789271864389430e+00 5.8743937054018057e-02 1.9648963278250655e+00 1.8146648177450586e+00 5.0497262846704771e-01 4.7194776950539250e+00 2.0859976999891185e+00 -1.9279119823429219e-01 -4.2908784413844208e+00 -2.0761791929360465e+00 -9.6196344952825460e-02 -3.1354892881470651e+00 -1.8481644166154136e+00 4.0479633707846474e-01 2.7630929950511529e+00 1.7676092296013262e+00 2.2068952506364384e-01 1.8737264812320278e+00 3.2540811829423575e+00 -5.1792713235378662e-01 -1.6809062866413580e+00 -3.5020452160018110e+00 -4.4649073241488940e-01 -1.6958178484123967e+00 -2.4005561852188477e+00 1.0753881426485340e-01 1.5406163373027519e+00 2.6680200813319708e+00 5.2272502447032676e-01 2.0859976999891185e+00 4.8856105727489156e+00 -2.8373732553512843e-01 -2.0712922243722001e+00 -5.1375694593181001e+00 -9.9073047484931329e-02 -1.8416655464520590e+00 -3.2391719897926037e+00 4.9627487398991121e-01 1.7893413873541153e+00 3.4716310133081185e+00 -1.3159894667504246e+00 4.9712442072075431e-02 5.7845620053783839e-02 1.2885012978394146e+00 1.7392274844135436e-01 2.5561203546935141e-01 6.4248006771059762e-01 7.0695163434343802e-02 1.2085426491267916e-01 -6.7666605238200106e-01 3.3867730196866411e-02 4.8733331255072738e-02 -2.6191558433347608e+00 -1.9279119823429219e-01 -2.8373732553512843e-01 2.6724947789048392e+00 -1.9123872403586786e-02 -3.1164248829926605e-02 1.3463549864231319e+00 -2.6873069558191139e-02 -3.5274224266946187e-02 -1.3380197684107960e+00 -8.9409943948569812e-02 -1.3286945305888587e-01 4.5484293421905422e-02 -2.8022822630830482e+00 -1.7405619891672812e+00 1.8530152990419518e-01 2.5123541502386244e+00 1.7593135235793729e+00 2.4069302895358474e-01 2.0022836845836358e+00 1.5509819776431473e+00 4.2899877608700412e-02 -1.7681719407775462e+00 -1.6298761998547924e+00 -2.0259075881588456e-01 -4.2908784413844208e+00 -2.0712922243722001e+00 -1.9123872403586813e-02 4.0524780735694526e+00 2.0031119870277330e+00 -3.6882720456947571e-02 2.8016327332639253e+00 1.8394448531029122e+00 -2.5578137821196628e-01 -2.5074159964106228e+00 -1.7111219279588916e+00 6.0459713481842203e-02 -1.9926469479905298e+00 -3.6079949940792346e+00 2.6862167380292057e-01 1.7497435024231662e+00 3.8487376980445873e+00 3.6219616270742788e-01 1.8136799884647274e+00 2.6813185720212180e+00 6.1350328140795295e-02 -1.6060545079788913e+00 -3.0726027934471110e+00 -2.9641406489869820e-01 -2.0761791929360460e+00 -5.1375694593180992e+00 -3.1164248829926605e-02 2.0031119870277330e+00 5.5759021466464294e+00 -4.7130992842379399e-02 1.8257847241786975e+00 3.5757613807668056e+00 -3.7791857156198116e-01 -1.7174395531888571e+00 -3.8635525506345942e+00 -6.7502626245559316e-01 5.5122015189274828e-02 5.9081987276841344e-02 6.4072780356711356e-01 9.1859084626967985e-02 8.0602642917960030e-02 1.3191130267270992e+00 2.1468601788928721e-01 2.2811996282177244e-01 -1.3583003866088250e+00 5.8464142476249023e-02 7.5448151108259545e-02 -1.3339080409350874e+00 -9.6196344952825460e-02 -9.9073047484931315e-02 1.3463549864231315e+00 -3.6882720456947564e-02 -4.7130992842379378e-02 2.7519848872926795e+00 -4.2478778157665445e-02 -4.2759547377334124e-02 -2.6909460140105188e+00 -2.4457341661434057e-01 -2.5428915642018857e-01 4.4523180667041279e-02 -2.3413584767741797e+00 -1.7513931532112030e+00 3.0714741817830732e-01 1.9989491020331531e+00 1.8032847508240462e+00 1.7766147865407847e-01 3.0359772328272130e+00 1.7721695306299539e+00 5.7736433880388301e-02 -2.7550861205464772e+00 -1.8923039994716473e+00 -3.1156121918735113e-01 -3.1354892881470651e+00 -1.8416655464520593e+00 -2.6873069558191132e-02 2.8016327332639248e+00 1.8257847241786980e+00 -4.2478778157665445e-02 4.6808813649692320e+00 2.0372915002119703e+00 -2.0615544447660719e-01 -4.2855065476258014e+00 -1.9531678067097595e+00 4.7439186653420271e-02 -1.7313569259863570e+00 -2.4931745522302489e+00 3.1107002930009237e-01 1.5555220071641820e+00 2.6964527808796497e+00 1.8643971309441792e-01 1.7675947639201677e+00 3.1825793529886326e+00 6.8707826640280301e-02 -1.6300983238408802e+00 -3.5231806212619885e+00 -3.2378529140257045e-01 -1.8481644166154136e+00 -3.2391719897926037e+00 -3.5274224266946180e-02 1.8394448531029122e+00 3.5757613807668056e+00 -4.2759547377334110e-02 2.0372915002119703e+00 4.8986578595974795e+00 -2.1183769264135949e-01 -1.9902334579565812e+00 -5.0979242109477250e+00 6.2108147850050754e-01 3.0203028610830807e-01 3.1047729795868184e-01 -7.8894867942975566e-01 -3.5184818975195797e-01 -5.1084248778736474e-01 -1.4756407991251519e+00 -4.3112289435555901e-01 -4.8892692932904042e-01 1.3085428659782377e+00 1.4128806715290609e-01 2.1101737051517075e-01 1.4477659013398427e+00 4.0479633707846469e-01 4.9627487398991121e-01 -1.3380197684107960e+00 -2.5578137821196628e-01 -3.7791857156198116e-01 -2.6909460140105184e+00 -2.0615544447660722e-01 -2.1183769264135943e-01 2.9161650151576337e+00 3.9679321645641158e-01 5.7175613885598220e-01 9.9963519534178674e-02 1.9704237405655620e+00 1.5565677775200639e+00 -3.5502458086337041e-01 -1.7530391614412884e+00 -1.5707159382213771e+00 -3.9612197287328321e-01 -2.7401842580762450e+00 -1.5843349636154369e+00 1.8068974414205996e-01 2.4614699159346127e+00 1.6551510336884254e+00 4.0768343416691322e-01 2.7630929950511529e+00 1.7893413873541155e+00 -8.9409943948569798e-02 -2.5074159964106224e+00 -1.7174395531888571e+00 -2.4457341661434057e-01 -4.2855065476258005e+00 -1.9902334579565812e+00 3.9679321645641158e-01 4.0911593120026293e+00 1.8616637144196484e+00 9.0529118491494420e-02 1.7915251532299259e+00 2.6733152678296772e+00 -5.1630578531748528e-01 -1.5734000734003066e+00 -2.9653616474085123e+00 -5.1665369532125038e-01 -1.8306058504953173e+00 -3.4094880409327999e+00 2.6522697901374848e-01 1.6474975613133749e+00 3.7301100789257871e+00 4.9260585375658444e-01 1.7676092296013262e+00 3.4716310133081185e+00 -1.3286945305888587e-01 -1.7111219279588916e+00 -3.8635525506345942e+00 -2.5428915642018851e-01 -1.9531678067097591e+00 -5.0979242109477241e+00 5.7175613885598220e-01 1.8616637144196477e+00 5.4612700898600490e+00 132 133 134 204 205 206 219 220 221 147 148 149 858 859 860 903 904 905 915 916 917 870 871 872 2.4650569151779902e-02 2.4609639037698142e-03 3.6645551470098747e-03 -1.0522535871727570e-02 -6.6872719584945596e-03 -1.2172916530183441e-02 -1.1385350268437155e-02 -6.5061387543926029e-03 -5.9517432701213227e-03 2.0478175595846216e-03 4.1900639239050006e-04 3.5552914558745724e-03 7.2223511337571591e-03 8.6816902804028005e-03 1.1443021412980096e-02 -6.5677616372151037e-03 5.9049826449198903e-04 -3.7064053186953772e-03 -5.6505158261866452e-03 -2.3615087795240651e-03 -3.0548910085277819e-03 2.0542575844478697e-04 3.4027606513561248e-03 6.2230881116633833e-03 2.4609639037698142e-03 3.6335216504216651e-02 1.6761654946010739e-02 -7.3114447749563702e-03 2.7434599063455873e-03 2.4782770894051236e-03 -1.2236516750246342e-02 -1.9872414888255221e-02 -8.0751634621056070e-03 4.3584439128121008e-04 -8.8526857136093044e-03 2.2861753255273053e-03 8.7602033825420304e-03 1.5849846212716758e-02 1.0293963847853145e-02 -1.4223450947778102e-03 1.7673461576605575e-03 -9.9925258962794521e-03 -2.0654452344833884e-03 -1.6644002028631935e-02 -1.5359710877461919e-02 1.1378740176870855e-02 -1.1326766150443085e-02 1.6073290270506688e-03 3.6645551470098742e-03 1.6761654946010739e-02 4.7290338627663762e-02 -1.3047865582950654e-02 3.1355809684047798e-03 -1.6785906230649454e-02 -1.5669407810440995e-02 -1.3638290727855764e-02 -1.4548076704214829e-02 3.4622679614818783e-03 3.2329462883951385e-03 2.4648681093767336e-02 1.1878110324685359e-02 9.6927946150532646e-03 1.1542646116987769e-02 -3.3095947800508211e-03 4.1650307682681255e-03 -3.2031681139919929e-02 -2.7469949511450720e-03 -1.5861948213298539e-02 -2.6575182881328069e-02 1.5768929691410426e-02 -7.4877686449777332e-03 6.4591811176934093e-03 -1.0522535871727570e-02 -7.3114447749563711e-03 -1.3047865582950655e-02 4.4486777342037258e-02 -1.3564954130865458e-02 9.8914391522162692e-03 2.3145625129348674e-02 3.0938464169692845e-03 7.5449090280597280e-03 -1.1780837280342172e-02 9.8435977310470223e-03 -1.8123396776102727e-02 -2.8808491922868572e-02 -8.1615895410619144e-03 -8.0442223655733305e-03 8.3839928969578498e-03 -7.6329715082375776e-03 1.5015546116419864e-02 1.5719028879367842e-03 1.1877337633913305e-02 1.6325876502113732e-02 -2.6476433181342237e-02 1.1856178173191701e-02 -9.5622860741828818e-03 -6.6872719584945587e-03 2.7434599063455890e-03 3.1355809684047798e-03 -1.3564954130865458e-02 2.9026797941218725e-02 -5.6278189659834475e-03 4.6570290999704486e-04 -8.5115131312353161e-03 1.4255692681040509e-03 5.4604476245060972e-03 -1.5083301606005614e-02 1.2403029569311479e-02 5.1313088910476283e-03 2.2220056060796166e-03 1.4767878049673690e-03 -6.5136119187747810e-03 1.2285875679169020e-02 -1.0470136061373736e-02 3.1036332613503673e-03 -1.0709413614533573e-02 -8.0480417962267188e-03 1.2604745321233657e-02 -1.1973910781038434e-02 5.7050292127962237e-03 -1.2172916530183445e-02 2.4782770894051236e-03 -1.6785906230649454e-02 9.8914391522162692e-03 -5.6278189659834466e-03 2.5206588483392443e-02 7.7648455206256739e-03 1.6936791051444379e-03 4.8933532138698329e-03 -7.2871560892204274e-03 8.0058049730481456e-03 -1.8318571641992652e-02 -8.5139213864421116e-03 -3.5591395147221948e-03 -8.7599192357911120e-03 1.2353217315153072e-02 -8.8264718939764057e-03 1.5069192690114960e-02 6.4010779842720881e-03 1.0903105196939144e-03 7.5094332126408418e-03 -8.4365859664211201e-03 4.7453586873904205e-03 -8.8141704915848662e-03 -1.1385350268437155e-02 -1.2236516750246342e-02 -1.5669407810440992e-02 2.3145625129348670e-02 4.6570290999704313e-04 7.7648455206256730e-03 4.4246737122873012e-02 1.6526793266409680e-02 6.8796263988612997e-03 -1.0656948338072344e-02 4.4826640174465025e-03 -1.3413222193549254e-02 -2.5922832076058222e-02 -1.4596749894213942e-02 -6.9889023509744188e-03 1.5359647861709028e-03 -8.5694176241368370e-03 1.7789316481598347e-02 7.7288367646788439e-03 9.4990645562744083e-03 1.2594785400021215e-02 -2.8692033120503710e-02 4.4284595184694809e-03 -8.9570414461418706e-03 -6.5061387543926055e-03 -1.9872414888255221e-02 -1.3638290727855766e-02 3.0938464169692854e-03 -8.5115131312353161e-03 1.6936791051444387e-03 1.6526793266409677e-02 3.4490015312746619e-02 4.9828289802447724e-03 4.3093760341713959e-03 2.4848969727709952e-03 -7.1566176647575933e-03 -1.5511503698070984e-02 -1.6409141152151380e-02 -5.3772081866687825e-03 -1.5196855377891236e-03 -1.0725273504476832e-02 1.2586836178346116e-02 8.2112097122121232e-03 1.6753961462219712e-02 1.1064544273980285e-02 -8.6038974395097716e-03 1.7894689283814191e-03 -4.1557719584334723e-03 -5.9517432701213227e-03 -8.0751634621056088e-03 -1.4548076704214831e-02 7.5449090280597288e-03 1.4255692681040513e-03 4.8933532138698338e-03 6.8796263988612980e-03 4.9828289802447724e-03 2.4249714685051563e-02 -1.3241052002880033e-02 -6.8952370355539055e-03 -1.4801718197582046e-02 -5.7373578939833979e-03 -4.1710546137233399e-03 -7.3071747158317771e-03 6.8240747605261120e-03 2.4054026529799098e-03 4.9915949521293747e-03 1.0915580108314950e-02 9.4475655727600128e-03 1.1313238286464473e-02 -7.2340371287773382e-03 8.8008863729410324e-04 -8.7909315198865957e-03 2.0478175595846212e-03 4.3584439128120970e-04 3.4622679614818783e-03 -1.1780837280342170e-02 5.4604476245060964e-03 -7.2871560892204265e-03 -1.0656948338072344e-02 4.3093760341713959e-03 -1.3241052002880033e-02 2.5773604908386712e-02 -2.0368510852001344e-03 4.4605985481988453e-03 -7.6298017190756665e-06 -1.8943996044122279e-03 6.6787056549323202e-03 -5.9855155541554024e-03 2.0341975528578317e-03 -3.8505161419144177e-03 -6.8012664146366092e-03 -1.4203960850937905e-03 -3.6272763915868034e-03 7.4107749209542748e-03 -6.8882188281103804e-03 1.3404428460988632e-02 4.1900639239049995e-04 -8.8526857136093026e-03 3.2329462883951394e-03 9.8435977310470206e-03 -1.5083301606005614e-02 8.0058049730481456e-03 4.4826640174465025e-03 2.4848969727709969e-03 -6.8952370355539055e-03 -2.0368510852001344e-03 3.2401231203116984e-02 -1.4321803881803234e-02 -8.5582372848574100e-03 -1.1699417906038621e-02 1.7953837145483671e-03 1.9341770458164954e-03 -1.2127769873125815e-02 1.3339798346138413e-02 6.8930064038330921e-04 1.5534413639796468e-03 4.3315103312052562e-03 -6.7736574570262829e-03 1.1323605558911716e-02 -9.4884027359781846e-03 3.5552914558745715e-03 2.2861753255273027e-03 2.4648681093767336e-02 -1.8123396776102731e-02 1.2403029569311479e-02 -1.8318571641992652e-02 -1.3413222193549254e-02 -7.1566176647575924e-03 -1.4801718197582041e-02 4.4605985481988462e-03 -1.4321803881803232e-02 5.3745080692715649e-02 1.7287348915597755e-02 1.1797288731717996e-02 4.1510420884724591e-03 -3.6602864041746530e-03 1.3374152755148271e-02 -3.2037914763275603e-02 -3.1437305209292654e-03 -9.7542280305511885e-03 -3.2093578579682591e-02 1.3037396975084723e-02 -8.6279968045930265e-03 1.4706979307577443e-02 7.2223511337571582e-03 8.7602033825420304e-03 1.1878110324685359e-02 -2.8808491922868572e-02 5.1313088910476274e-03 -8.5139213864421134e-03 -2.5922832076058222e-02 -1.5511503698070984e-02 -5.7373578939833979e-03 -7.6298017190767507e-06 -8.5582372848574100e-03 1.7287348915597755e-02 4.6769725208104809e-02 1.6411074745941813e-02 8.0415511825069896e-03 -1.1661710844940667e-02 5.1445632150195555e-03 -1.5101900814635806e-02 -1.1288698144611670e-02 -1.3039543256302893e-02 -1.6169141128449839e-02 2.3697286448336238e-02 1.6621340046802696e-03 8.3153108007210548e-03 8.6816902804028005e-03 1.5849846212716755e-02 9.6927946150532646e-03 -8.1615895410619144e-03 2.2220056060796162e-03 -3.5591395147221948e-03 -1.4596749894213943e-02 -1.6409141152151380e-02 -4.1710546137233399e-03 -1.8943996044122275e-03 -1.1699417906038619e-02 1.1797288731717998e-02 1.6411074745941813e-02 3.5475385812683023e-02 5.4751186526254296e-03 3.8527355971121491e-03 1.6012160773332411e-03 -7.7990500349286607e-03 -6.1611446126798083e-03 -1.9531864963478866e-02 -1.3415157853031920e-02 1.8683830289111269e-03 -7.5080296871437701e-03 1.9792000170094181e-03 1.1443021412980096e-02 1.0293963847853143e-02 1.1542646116987770e-02 -8.0442223655733305e-03 1.4767878049673690e-03 -8.7599192357911120e-03 -6.9889023509744196e-03 -5.3772081866687834e-03 -7.3071747158317771e-03 6.6787056549323211e-03 1.7953837145483682e-03 4.1510420884724574e-03 8.0415511825069931e-03 5.4751186526254296e-03 2.6758301462276753e-02 -1.2944463470187658e-02 -5.8589167488818971e-03 -1.6746296582962509e-02 -6.5217099776218156e-03 -8.8981756177812146e-03 -1.5353345498206970e-02 8.3360199139378127e-03 1.0930465333375827e-03 5.7147463650553754e-03 -6.5677616372151028e-03 -1.4223450947778102e-03 -3.3095947800508190e-03 8.3839928969578481e-03 -6.5136119187747810e-03 1.2353217315153070e-02 1.5359647861709030e-03 -1.5196855377891229e-03 6.8240747605261111e-03 -5.9855155541554024e-03 1.9341770458164949e-03 -3.6602864041746521e-03 -1.1661710844940665e-02 3.8527355971121487e-03 -1.2944463470187656e-02 2.2129262175989758e-02 -2.1484093425522348e-03 4.7810068621493128e-03 3.9018719592873565e-03 7.3546364635096700e-04 3.8148358781423591e-03 -1.1736103782094687e-02 5.0816756046143359e-03 -7.8587901615577247e-03 5.9049826449198903e-04 1.7673461576605582e-03 4.1650307682681255e-03 -7.6329715082375793e-03 1.2285875679169020e-02 -8.8264718939764057e-03 -8.5694176241368405e-03 -1.0725273504476832e-02 2.4054026529799094e-03 2.0341975528578322e-03 -1.2127769873125815e-02 1.3374152755148271e-02 5.1445632150195547e-03 1.6012160773332411e-03 -5.8589167488818971e-03 -2.1484093425522353e-03 2.8586768862840138e-02 -1.4731805101819371e-02 3.1163041871262091e-04 -6.9382561935502117e-03 1.1055873894582112e-03 1.0269909023844651e-02 -1.4449907205850083e-02 8.3670201788231605e-03 -3.7064053186953772e-03 -9.9925258962794521e-03 -3.2031681139919943e-02 1.5015546116419864e-02 -1.0470136061373736e-02 1.5069192690114962e-02 1.7789316481598347e-02 1.2586836178346113e-02 4.9915949521293756e-03 -3.8505161419144177e-03 1.3339798346138411e-02 -3.2037914763275603e-02 -1.5101900814635805e-02 -7.7990500349286599e-03 -1.6746296582962502e-02 4.7810068621493128e-03 -1.4731805101819371e-02 5.1518841894729300e-02 3.7205708412314503e-03 4.9852657497721671e-03 2.8298803140842915e-02 -1.8647618026153372e-02 1.2081616820144516e-02 -1.9062540191658515e-02 -5.6505158261866452e-03 -2.0654452344833888e-03 -2.7469949511450724e-03 1.5719028879367840e-03 3.1036332613503660e-03 6.4010779842720881e-03 7.7288367646788439e-03 8.2112097122121232e-03 1.0915580108314948e-02 -6.8012664146366100e-03 6.8930064038330932e-04 -3.1437305209292667e-03 -1.1288698144611673e-02 -6.1611446126798083e-03 -6.5217099776218156e-03 3.9018719592873556e-03 3.1163041871262108e-04 3.7205708412314511e-03 2.2129187435986335e-02 2.5059363694014398e-03 3.7057164851573448e-03 -1.1591318662454390e-02 -6.5951205548966645e-03 -1.2330509969279677e-02 -2.3615087795240651e-03 -1.6644002028631935e-02 -1.5861948213298543e-02 1.1877337633913304e-02 -1.0709413614533574e-02 1.0903105196939141e-03 9.4990645562744065e-03 1.6753961462219712e-02 9.4475655727600128e-03 -1.4203960850937907e-03 1.5534413639796468e-03 -9.7542280305511903e-03 -1.3039543256302893e-02 -1.9531864963478866e-02 -8.8981756177812146e-03 7.3546364635096776e-04 -6.9382561935502135e-03 4.9852657497721654e-03 2.5059363694014403e-03 3.4102026377601326e-02 1.7352484979636148e-02 -7.7963540850193658e-03 1.4141075963939008e-03 1.6387250397686993e-03 -3.0548910085277819e-03 -1.5359710877461921e-02 -2.6575182881328065e-02 1.6325876502113732e-02 -8.0480417962267188e-03 7.5094332126408418e-03 1.2594785400021217e-02 1.1064544273980285e-02 1.1313238286464472e-02 -3.6272763915868038e-03 4.3315103312052562e-03 -3.2093578579682591e-02 -1.6169141128449839e-02 -1.3415157853031918e-02 -1.5353345498206970e-02 3.8148358781423591e-03 1.1055873894582104e-03 2.8298803140842918e-02 3.7057164851573452e-03 1.7352484979636148e-02 4.5628493484791338e-02 -1.3589905736870220e-02 2.9687835524406427e-03 -1.8727861165521928e-02 2.0542575844478697e-04 1.1378740176870855e-02 1.5768929691410426e-02 -2.6476433181342237e-02 1.2604745321233657e-02 -8.4365859664211219e-03 -2.8692033120503713e-02 -8.6038974395097716e-03 -7.2340371287773365e-03 7.4107749209542731e-03 -6.7736574570262812e-03 1.3037396975084723e-02 2.3697286448336238e-02 1.8683830289111269e-03 8.3360199139378109e-03 -1.1736103782094687e-02 1.0269909023844653e-02 -1.8647618026153376e-02 -1.1591318662454395e-02 -7.7963540850193658e-03 -1.3589905736870217e-02 4.7182401618659726e-02 -1.2947868569304861e-02 1.0765800277789086e-02 3.4027606513561256e-03 -1.1326766150443080e-02 -7.4877686449777324e-03 1.1856178173191701e-02 -1.1973910781038434e-02 4.7453586873904205e-03 4.4284595184694818e-03 1.7894689283814193e-03 8.8008863729410335e-04 -6.8882188281103813e-03 1.1323605558911714e-02 -8.6279968045930265e-03 1.6621340046802683e-03 -7.5080296871437640e-03 1.0930465333375832e-03 5.0816756046143377e-03 -1.4449907205850085e-02 1.2081616820144518e-02 -6.5951205548966645e-03 1.4141075963938978e-03 2.9687835524406414e-03 -1.2947868569304860e-02 3.0731431740788330e-02 -5.6531287810365066e-03 6.2230881116633833e-03 1.6073290270506690e-03 6.4591811176934093e-03 -9.5622860741828835e-03 5.7050292127962237e-03 -8.8141704915848679e-03 -8.9570414461418724e-03 -4.1557719584334723e-03 -8.7909315198865974e-03 1.3404428460988632e-02 -9.4884027359781846e-03 1.4706979307577445e-02 8.3153108007210548e-03 1.9792000170094190e-03 5.7147463650553763e-03 -7.8587901615577264e-03 8.3670201788231587e-03 -1.9062540191658515e-02 -1.2330509969279681e-02 1.6387250397686991e-03 -1.8727861165521928e-02 1.0765800277789084e-02 -5.6531287810365066e-03 2.8514596578325665e-02 204 205 206 276 277 278 291 292 293 219 220 221 903 904 905 948 949 950 960 961 962 915 916 917 2.8731118098502033e-02 3.2698943303783950e-03 5.1084981082777205e-03 -1.4784490836172788e-02 -7.3313520613050064e-03 -1.4460773447503865e-02 -1.4046149567714274e-02 -7.4461502021896239e-03 -7.1421108736944572e-03 3.5517020031137422e-03 6.0637726842092488e-04 4.8838038498635709e-03 9.6045931685073884e-03 9.8400537720394789e-03 1.3315357012444590e-02 -8.1368400230364905e-03 7.6964193608590600e-04 -4.9710455797790194e-03 -6.5508814790641353e-03 -3.1005424332814129e-03 -4.1550192319324752e-03 1.6309486358645326e-03 3.3920773898513381e-03 7.4212901623239404e-03 3.2698943303783950e-03 4.0527815435553588e-02 1.8345589513429839e-02 -7.5112612879473153e-03 1.5354710715350306e-04 2.5437686751708642e-03 -1.3584628167810423e-02 -2.1851540438993986e-02 -9.3083523336521604e-03 3.9933294857918495e-04 -8.0188778565470110e-03 2.2847299686893250e-03 9.6766821571615015e-03 1.7743946642576596e-02 1.1618726223755468e-02 -1.8140488565020056e-03 8.5019341211166311e-04 -1.0812771935808450e-02 -2.7354687079718335e-03 -1.7961087981083899e-02 -1.6785927865261011e-02 1.2299497584112497e-02 -1.1443996320770467e-02 2.1142377536761321e-03 5.1084981082777196e-03 1.8345589513429836e-02 5.4355436910353147e-02 -1.4938287845131655e-02 2.6978732413731584e-03 -2.2058181930371901e-02 -1.7915151758846008e-02 -1.5008420379240876e-02 -1.7718325711837783e-02 4.6508874710199767e-03 3.9258362191278845e-03 2.9093269953034177e-02 1.3533612878448145e-02 1.1044983073449461e-02 1.4602399756485706e-02 -4.7116183042630946e-03 4.5305031427249160e-03 -3.6781727492691860e-02 -3.8092267935831182e-03 -1.7500199588942406e-02 -3.0173710576286913e-02 1.8081286244078034e-02 -8.0361652219219752e-03 8.6808390913154319e-03 -1.4784490836172790e-02 -7.5112612879473153e-03 -1.4938287845131655e-02 5.1305824680813177e-02 -1.4546117886439352e-02 1.2264960662340002e-02 2.7278133077044055e-02 3.1264072334120357e-03 9.3765774695095377e-03 -1.4484420845054821e-02 1.0664052549167845e-02 -2.0698078808362278e-02 -3.3183293948122479e-02 -9.1310619585180646e-03 -1.0101103217184396e-02 1.0996734903922703e-02 -8.5045174899497609e-03 1.7045485340726124e-02 2.9932749822082542e-03 1.2986876463073536e-02 1.8645173784134206e-02 -3.0121762014638120e-02 1.2915622377201078e-02 -1.1594727386031536e-02 -7.3313520613050064e-03 1.5354710715350262e-04 2.6978732413731566e-03 -1.4546117886439352e-02 3.2670977679068937e-02 -6.5315997391825788e-03 9.3275158159380079e-04 -7.5984305346208786e-03 1.7773106103995747e-03 6.1802935561731881e-03 -1.6655850947710896e-02 1.3558402521238397e-02 5.3421403104522642e-03 1.2062456489963533e-03 1.6645417623927655e-03 -7.3347770326814997e-03 1.3824539471973036e-02 -1.1301997743359021e-02 3.1821729866675550e-03 -1.0705620161877490e-02 -8.4203144528839213e-03 1.3574888545539052e-02 -1.2895408262982567e-02 6.5557838000216253e-03 -1.4460773447503867e-02 2.5437686751708642e-03 -2.2058181930371901e-02 1.2264960662340002e-02 -6.5315997391825796e-03 3.0246346898606880e-02 9.7140999105097322e-03 1.8541745218111476e-03 7.1581774935001886e-03 -8.6890901864424257e-03 8.8786251937546783e-03 -2.2207839602395387e-02 -1.0447500424477394e-02 -4.2306018973590018e-03 -1.1157996035332327e-02 1.4439547465931681e-02 -9.8805336272468729e-03 1.8760197467362648e-02 7.5664584464344483e-03 1.7655620112016978e-03 9.9557160863804894e-03 -1.0387702426792175e-02 5.6006048618500674e-03 -1.0696420377750596e-02 -1.4046149567714276e-02 -1.3584628167810423e-02 -1.7915151758846011e-02 2.7278133077044055e-02 9.3275158159380144e-04 9.7140999105097322e-03 5.0327935818450437e-02 1.8047020698889867e-02 8.7285621094778700e-03 -1.4181681406169362e-02 4.4046104737569675e-03 -1.5571839535379731e-02 -2.9388966660276211e-02 -1.6248922908140905e-02 -8.7922323602932211e-03 3.1330657245953564e-03 -9.2124269451834672e-03 2.0281634042237272e-02 9.7357380553708701e-03 1.0812745352165450e-02 1.4581813703506271e-02 -3.2858075041300866e-02 4.8488499147287126e-03 -1.1026886111212195e-02 -7.4461502021896239e-03 -2.1851540438993990e-02 -1.5008420379240876e-02 3.1264072334120357e-03 -7.5984305346208803e-03 1.8541745218111480e-03 1.8047020698889867e-02 3.7949216087197014e-02 6.0590439268232224e-03 4.4969508074663199e-03 5.3919056963394564e-04 -7.4504425524764203e-03 -1.6781862067634639e-02 -1.7779658285261502e-02 -6.4490222345180937e-03 -1.2390864475310831e-03 -1.0766119309588066e-02 1.3522937357969738e-02 9.1986336411558223e-03 1.8397884204596787e-02 1.2296389491272732e-02 -9.4019136635686978e-03 1.1094577070366876e-03 -4.8246601316414492e-03 -7.1421108736944563e-03 -9.3083523336521621e-03 -1.7718325711837783e-02 9.3765774695095377e-03 1.7773106103995734e-03 7.1581774935001868e-03 8.7285621094778700e-03 6.0590439268232224e-03 2.8105951578525388e-02 -1.5273712888761457e-02 -7.5462460001675400e-03 -1.9178242935258098e-02 -7.2382509075588596e-03 -5.1615652638079485e-03 -8.7787470781423588e-03 8.0130171225349517e-03 2.2840400822566769e-03 7.1768754766796290e-03 1.2457869668664506e-02 1.0708668766436870e-02 1.4021613642325528e-02 -8.9219517001720879e-03 1.1871002117113060e-03 -1.0787302465792490e-02 3.5517020031137414e-03 3.9933294857918505e-04 4.6508874710199759e-03 -1.4484420845054823e-02 6.1802935561731855e-03 -8.6890901864424257e-03 -1.4181681406169362e-02 4.4969508074663182e-03 -1.5273712888761460e-02 2.9344095598733497e-02 -2.5632907937819431e-03 5.9293390880245178e-03 1.3101718654337550e-03 -1.6286197954918805e-03 7.8346383211826097e-03 -6.9780090624548619e-03 2.5600812177886895e-03 -5.0177395564442078e-03 -8.0310136851172529e-03 -1.8701396556674193e-03 -4.6942595093661553e-03 9.4691555315153039e-03 -7.5746082850661391e-03 1.5259937260787140e-02 6.0637726842092488e-04 -8.0188778565470128e-03 3.9258362191278871e-03 1.0664052549167845e-02 -1.6655850947710899e-02 8.8786251937546783e-03 4.4046104737569692e-03 5.3919056963394585e-04 -7.5462460001675400e-03 -2.5632907937819436e-03 3.5608152587586005e-02 -1.5390435959367219e-02 -9.0164721831028933e-03 -1.1821971335940184e-02 1.7348747683764280e-03 2.5104382210234767e-03 -1.3019357637647701e-02 1.4222139914336174e-02 8.7576295815387653e-04 9.1151573047589755e-04 4.5276792349264443e-03 -7.4814784936382541e-03 1.2457198890149944e-02 -1.0352473370986850e-02 4.8838038498635701e-03 2.2847299686893276e-03 2.9093269953034177e-02 -2.0698078808362278e-02 1.3558402521238399e-02 -2.2207839602395387e-02 -1.5571839535379731e-02 -7.4504425524764203e-03 -1.9178242935258098e-02 5.9293390880245187e-03 -1.5390435959367222e-02 6.0980462170849195e-02 1.9709940544532668e-02 1.2942154347419528e-02 6.3328333051360756e-03 -5.0851218216771289e-03 1.4691459502318784e-02 -3.6298932203395126e-02 -4.4088143078327216e-03 -1.0896073894712281e-02 -3.6587115485095821e-02 1.5240770990831100e-02 -9.7397939331101135e-03 1.7865564797124988e-02 9.6045931685073884e-03 9.6766821571615015e-03 1.3533612878448145e-02 -3.3183293948122479e-02 5.3421403104522642e-03 -1.0447500424477393e-02 -2.9388966660276211e-02 -1.6781862067634639e-02 -7.2382509075588596e-03 1.3101718654337567e-03 -9.0164721831028950e-03 1.9709940544532671e-02 5.2659781603691960e-02 1.8112684925723769e-02 1.0079138337732402e-02 -1.5049726506319552e-02 5.4741813260312765e-03 -1.7314994454900888e-02 -1.3366187709078822e-02 -1.4422077707697066e-02 -1.8541081243185289e-02 2.7413628186163972e-02 1.6147232390657891e-03 1.0219135269409221e-02 9.8400537720394789e-03 1.7743946642576600e-02 1.1044983073449463e-02 -9.1310619585180629e-03 1.2062456489963537e-03 -4.2306018973590010e-03 -1.6248922908140905e-02 -1.7779658285261502e-02 -5.1615652638079476e-03 -1.6286197954918796e-03 -1.1821971335940184e-02 1.2942154347419528e-02 1.8112684925723762e-02 3.9220332162652770e-02 6.6931956751974152e-03 3.7288921027267517e-03 1.8872582239285764e-04 -8.5850458871678716e-03 -7.2020216596136565e-03 -2.1423073852017565e-02 -1.5065846556214702e-02 2.5289955212745058e-03 -7.3345468033993366e-03 2.3627265084831244e-03 1.3315357012444589e-02 1.1618726223755467e-02 1.4602399756485704e-02 -1.0101103217184396e-02 1.6645417623927655e-03 -1.1157996035332325e-02 -8.7922323602932211e-03 -6.4490222345180946e-03 -8.7787470781423571e-03 7.8346383211826097e-03 1.7348747683764286e-03 6.3328333051360765e-03 1.0079138337732401e-02 6.6931956751974152e-03 3.0666457396886896e-02 -1.5007728278488118e-02 -6.1221090026752304e-03 -2.1022280428842674e-02 -7.6255886427373035e-03 -1.0244067570943979e-02 -1.8237074917714587e-02 1.0297518827343437e-02 1.1038603784152229e-03 7.5944080015232689e-03 -8.1368400230364905e-03 -1.8140488565020060e-03 -4.7116183042630946e-03 1.0996734903922705e-02 -7.3347770326815005e-03 1.4439547465931677e-02 3.1330657245953551e-03 -1.2390864475310826e-03 8.0130171225349517e-03 -6.9780090624548628e-03 2.5104382210234762e-03 -5.0851218216771280e-03 -1.5049726506319548e-02 3.7288921027267530e-03 -1.5007728278488118e-02 2.5132797450513993e-02 -2.7981061602586651e-03 6.4323132209255429e-03 5.0098245274789455e-03 1.0890635018247954e-03 5.1725849462731597e-03 -1.4107847014700097e-02 5.8576246713982301e-03 -9.2529943512369983e-03 7.6964193608590589e-04 8.5019341211166246e-04 4.5305031427249169e-03 -8.5045174899497609e-03 1.3824539471973036e-02 -9.8805336272468729e-03 -9.2124269451834672e-03 -1.0766119309588066e-02 2.2840400822566761e-03 2.5600812177886895e-03 -1.3019357637647701e-02 1.4691459502318784e-02 5.4741813260312756e-03 1.8872582239285829e-04 -6.1221090026752304e-03 -2.7981061602586656e-03 3.1524188830705756e-02 -1.6038922420201190e-02 3.3305377240826667e-04 -6.7794356749558389e-03 1.0339012985409704e-03 1.1378092343077758e-02 -1.5822734914991705e-02 9.5016610242819478e-03 -4.9710455797790203e-03 -1.0812771935808449e-02 -3.6781727492691860e-02 1.7045485340726120e-02 -1.1301997743359018e-02 1.8760197467362651e-02 2.0281634042237276e-02 1.3522937357969736e-02 7.1768754766796290e-03 -5.0177395564442086e-03 1.4222139914336174e-02 -3.6298932203395126e-02 -1.7314994454900885e-02 -8.5850458871678699e-03 -2.1022280428842677e-02 6.4323132209255429e-03 -1.6038922420201190e-02 5.8107182410867222e-02 4.9496637684412993e-03 5.7782489127731658e-03 3.2478558076897604e-02 -2.1405316781206121e-02 1.3215411801457458e-02 -2.2419873306877454e-02 -6.5508814790641344e-03 -2.7354687079718339e-03 -3.8092267935831191e-03 2.9932749822082546e-03 3.1821729866675550e-03 7.5664584464344483e-03 9.7357380553708718e-03 9.1986336411558223e-03 1.2457869668664506e-02 -8.0310136851172529e-03 8.7576295815387632e-04 -4.4088143078327216e-03 -1.3366187709078822e-02 -7.2020216596136574e-03 -7.6255886427373035e-03 5.0098245274789446e-03 3.3305377240826667e-04 4.9496637684413002e-03 2.4340299179269380e-02 3.2629172382714279e-03 4.9069285528000745e-03 -1.4131053871067240e-02 -6.9150502290714570e-03 -1.4037290692187183e-02 -3.1005424332814129e-03 -1.7961087981083899e-02 -1.7500199588942406e-02 1.2986876463073536e-02 -1.0705620161877490e-02 1.7655620112016980e-03 1.0812745352165448e-02 1.8397884204596787e-02 1.0708668766436870e-02 -1.8701396556674191e-03 9.1151573047589766e-04 -1.0896073894712281e-02 -1.4422077707697066e-02 -2.1423073852017565e-02 -1.0244067570943977e-02 1.0890635018247956e-03 -6.7794356749558398e-03 5.7782489127731658e-03 3.2629172382714279e-03 3.6919702769039740e-02 1.9162547101578522e-02 -8.7588427586893086e-03 6.4011496582236241e-04 1.2253142626084059e-03 -4.1550192319324752e-03 -1.6785927865261008e-02 -3.0173710576286913e-02 1.8645173784134203e-02 -8.4203144528839230e-03 9.9557160863804912e-03 1.4581813703506273e-02 1.2296389491272732e-02 1.4021613642325528e-02 -4.6942595093661561e-03 4.5276792349264443e-03 -3.6587115485095821e-02 -1.8541081243185292e-02 -1.5065846556214702e-02 -1.8237074917714584e-02 5.1725849462731588e-03 1.0339012985409722e-03 3.2478558076897604e-02 4.9069285528000745e-03 1.9162547101578522e-02 5.0877231156407639e-02 -1.5916141002229788e-02 3.2515717480409686e-03 -2.2335217982913949e-02 1.6309486358645335e-03 1.2299497584112497e-02 1.8081286244078034e-02 -3.0121762014638120e-02 1.3574888545539052e-02 -1.0387702426792173e-02 -3.2858075041300866e-02 -9.4019136635686961e-03 -8.9219517001720879e-03 9.4691555315153039e-03 -7.4814784936382541e-03 1.5240770990831100e-02 2.7413628186163976e-02 2.5289955212745067e-03 1.0297518827343439e-02 -1.4107847014700097e-02 1.1378092343077758e-02 -2.1405316781206125e-02 -1.4131053871067240e-02 -8.7588427586893121e-03 -1.5916141002229788e-02 5.2705005588162511e-02 -1.4139239078107551e-02 1.3011535848147612e-02 3.3920773898513394e-03 -1.1443996320770471e-02 -8.0361652219219770e-03 1.2915622377201076e-02 -1.2895408262982567e-02 5.6006048618500674e-03 4.8488499147287135e-03 1.1094577070366873e-03 1.1871002117113060e-03 -7.5746082850661383e-03 1.2457198890149943e-02 -9.7397939331101135e-03 1.6147232390657891e-03 -7.3345468033993331e-03 1.1038603784152233e-03 5.8576246713982318e-03 -1.5822734914991705e-02 1.3215411801457454e-02 -6.9150502290714570e-03 6.4011496582235981e-04 3.2515717480409686e-03 -1.4139239078107553e-02 3.3289914739135083e-02 -6.5825898464429364e-03 7.4212901623239404e-03 2.1142377536761316e-03 8.6808390913154336e-03 -1.1594727386031534e-02 6.5557838000216261e-03 -1.0696420377750596e-02 -1.1026886111212195e-02 -4.8246601316414492e-03 -1.0787302465792490e-02 1.5259937260787141e-02 -1.0352473370986850e-02 1.7865564797124985e-02 1.0219135269409221e-02 2.3627265084831240e-03 7.5944080015232706e-03 -9.2529943512369983e-03 9.5016610242819478e-03 -2.2419873306877454e-02 -1.4037290692187183e-02 1.2253142626084052e-03 -2.2335217982913949e-02 1.3011535848147614e-02 -6.5825898464429355e-03 3.2098002243370796e-02 147 148 149 219 220 221 234 235 236 162 163 164 870 871 872 915 916 917 927 928 929 882 883 884 2.3009267553736681e-02 2.0707695777670660e-03 2.3414583733020427e-03 -9.7543881017839104e-03 -8.4495885438771179e-03 -1.0590343319189774e-02 -9.9179607774133177e-03 -6.4824839351320497e-03 -4.4127135827945344e-03 1.9763909669981410e-03 9.4604542603945378e-04 2.8254954232301765e-03 5.9210852873298496e-03 9.3524957743084704e-03 9.3796783471489995e-03 -6.3377141011046970e-03 -1.6096498913648332e-04 -2.9084321466720446e-03 -4.9080272407265573e-03 -1.8803151956651438e-03 -1.8296380008745331e-03 1.1346412963812638e-05 4.6040418856958081e-03 5.1944949058496670e-03 2.0707695777670656e-03 3.8621707911745608e-02 1.6493840880052020e-02 -9.1854595239938309e-03 6.5835349830798860e-04 -1.4330828480654105e-03 -1.3242215208490260e-02 -2.2892941966612172e-02 -6.2402476766226572e-03 8.6124454981228668e-04 -6.7225933573533073e-03 6.9063007470594228e-03 9.5023238189039846e-03 1.8928381626911173e-02 9.2652377686371704e-03 -1.6489555952330418e-03 -2.4409105697375773e-04 -1.4513064031993279e-02 -1.4335208811932952e-03 -1.9642086907044724e-02 -1.5068634005868380e-02 1.3075813262427096e-02 -8.7067297489807887e-03 4.5896491668011167e-03 2.3414583733020427e-03 1.6493840880052024e-02 3.9978710171660770e-02 -1.1421387055032591e-02 -8.4884503893317969e-04 -1.7179784737049120e-02 -1.2806341237706496e-02 -1.2586405065899904e-02 -1.0055010283799692e-02 2.4739481886080681e-03 7.9458840082215505e-03 2.3084855420298568e-02 9.9883790047167048e-03 8.7742758711714108e-03 7.5931303758622823e-03 -2.6229889240001730e-03 -7.9465982718761048e-04 -3.0348195548653333e-02 -1.4358659530780856e-03 -1.5663348480274873e-02 -2.0538069828605718e-02 1.3482797603190532e-02 -3.3207423471494067e-03 7.4643644302862418e-03 -9.7543881017839104e-03 -9.1854595239938309e-03 -1.1421387055032589e-02 4.3803663926746957e-02 -9.5632680061699359e-03 1.1910504816168930e-02 2.2590817932011259e-02 5.9769025306274006e-03 6.2919466728115995e-03 -1.1183371442679653e-02 6.7821423174113729e-03 -1.9771601965605706e-02 -2.8347265944726797e-02 -1.1079501522929466e-02 -6.1178375785665533e-03 7.9394990326343735e-03 -4.9909787203552304e-03 1.6408473518811688e-02 1.0882525342514079e-03 1.3917215935355432e-02 1.3991064032062388e-02 -2.6137207936453646e-02 8.1429469900542398e-03 -1.1291162440649758e-02 -8.4495885438771179e-03 6.5835349830798730e-04 -8.4884503893318055e-04 -9.5632680061699359e-03 2.4154133535539954e-02 -4.7965399045571981e-03 3.6383441957757172e-03 -6.3788633995056736e-03 4.1395474169733798e-03 3.8575501194035478e-03 -1.1049991526412154e-02 9.6405407421580828e-03 1.5464054084352861e-03 5.8028303366391130e-04 -9.5676547961379426e-04 -4.3446929083128197e-03 8.3202081245083610e-03 -8.2205119824541647e-03 4.3493622562947188e-03 -8.3241632361996977e-03 -3.7028480857905239e-03 8.9658874784506095e-03 -7.9599600299026848e-03 4.7454223322174012e-03 -1.0590343319189772e-02 -1.4330828480654107e-03 -1.7179784737049120e-02 1.1910504816168935e-02 -4.7965399045571981e-03 2.6129077385827700e-02 7.0108208218727227e-03 4.3228164462372053e-03 3.7372707678472571e-03 -7.9930232855998963e-03 6.4302466323847693e-03 -2.1443624965322212e-02 -8.8357803962251895e-03 -5.8917113473024143e-03 -7.8194687409801674e-03 1.3367259579061964e-02 -6.7662700839753879e-03 1.7944374962523178e-02 5.3879104051137864e-03 4.2140431751363158e-03 8.6482049996976715e-03 -1.0257348621202547e-02 3.9204979301421085e-03 -1.0016049672544311e-02 -9.9179607774133177e-03 -1.3242215208490258e-02 -1.2806341237706496e-02 2.2590817932011259e-02 3.6383441957757168e-03 7.0108208218727227e-03 4.2884004499786799e-02 1.8017911067427384e-02 3.1695771176737391e-03 -9.1282043301038132e-03 2.2626183023993348e-03 -1.3363232285442089e-02 -2.4910901083256203e-02 -1.6211789824471148e-02 -3.8772629800518754e-03 5.3177228786473673e-04 -5.4132352949180420e-03 1.8547029043214421e-02 5.8089991266447750e-03 1.0126176208589632e-02 1.0272321993971444e-02 -2.7858527655534253e-02 8.2219055368736688e-04 -8.9529124735318721e-03 -6.4824839351320489e-03 -2.2892941966612172e-02 -1.2586405065899904e-02 5.9769025306274023e-03 -6.3788633995056710e-03 4.3228164462372053e-03 1.8017911067427381e-02 3.7912594861076378e-02 2.6160404766601458e-03 2.2867435274054608e-03 1.2455409662403799e-03 -1.0363757755108817e-02 -1.6928926642215725e-02 -1.9837734983984535e-02 -3.4900169477708213e-03 -3.5538838728539645e-04 -9.2350381936193507e-03 1.6075457490086688e-02 8.6775167872342549e-03 1.9353479299265491e-02 9.7757970129638879e-03 -1.1192274948061329e-02 -1.6703658286053400e-04 -6.3499316571683905e-03 -4.4127135827945344e-03 -6.2402476766226572e-03 -1.0055010283799692e-02 6.2919466728115995e-03 4.1395474169733789e-03 3.7372707678472558e-03 3.1695771176737391e-03 2.6160404766601463e-03 2.2822174557751113e-02 -1.3510996421461084e-02 -1.0443877079094718e-02 -1.0375628324758576e-02 -2.3373728532331607e-03 -2.0484812202337609e-03 -5.9683539320398646e-03 6.7863184470881837e-03 5.1998116596098393e-03 5.9416428914303818e-04 9.0481796416377828e-03 8.1005578715515267e-03 6.7406595197260256e-03 -5.0349390217225270e-03 -1.3233514488437609e-03 -7.4952765938693013e-03 1.9763909669981410e-03 8.6124454981228657e-04 2.4739481886080681e-03 -1.1183371442679654e-02 3.8575501194035478e-03 -7.9930232855998963e-03 -9.1282043301038132e-03 2.2867435274054608e-03 -1.3510996421461084e-02 2.6255938925315338e-02 -1.1259127275176552e-03 4.1069339641097054e-03 -1.2866410591076513e-03 -9.1922975225889160e-04 6.6808893580466207e-03 -6.1912344831391393e-03 1.2245611368359398e-03 -3.6072850235390184e-03 -6.6509638206876326e-03 -1.6531963075891211e-03 -2.6180701749618025e-03 6.2080852434044072e-03 -4.5317605460915645e-03 1.4467603394797409e-02 9.4604542603945422e-04 -6.7225933573533117e-03 7.9458840082215505e-03 6.7821423174113729e-03 -1.1049991526412154e-02 6.4302466323847693e-03 2.2626183023993348e-03 1.2455409662403799e-03 -1.0443877079094718e-02 -1.1259127275176552e-03 2.9256378369523953e-02 -1.0682847566875601e-02 -5.7643937021461204e-03 -1.0713807455717468e-02 4.5814196601936261e-03 1.3038934510583727e-03 -8.8250067450378403e-03 9.9456849022306320e-03 1.6027687658992879e-04 -3.6809664315576676e-04 -4.8646125700282450e-04 -4.5646699438346896e-03 7.1775763919121952e-03 -7.2900493000574423e-03 2.8254954232301765e-03 6.9063007470594236e-03 2.3084855420298568e-02 -1.9771601965605706e-02 9.6405407421580828e-03 -2.1443624965322212e-02 -1.3363232285442091e-02 -1.0363757755108817e-02 -1.0375628324758582e-02 4.1069339641097062e-03 -1.0682847566875599e-02 5.9345061895660287e-02 1.8216818524401841e-02 1.5389564708090017e-02 1.4282409318685705e-04 -3.7639432819504006e-03 9.6964456912513233e-03 -3.6996560488214175e-02 -2.1403347145802147e-03 -1.4223150943785996e-02 -3.0541893629252106e-02 1.3889864335836702e-02 -6.3630956227884103e-03 1.6784965998401381e-02 5.9210852873298487e-03 9.5023238189039828e-03 9.9883790047167048e-03 -2.8347265944726797e-02 1.5464054084352861e-03 -8.8357803962251878e-03 -2.4910901083256200e-02 -1.6928926642215729e-02 -2.3373728532331611e-03 -1.2866410591076509e-03 -5.7643937021461212e-03 1.8216818524401837e-02 4.5755371678484945e-02 1.8483746145826992e-02 4.5405349102385023e-03 -1.0882918197573635e-02 2.5723568790581028e-03 -1.5657156900087638e-02 -9.6683890675184382e-03 -1.4183770473599469e-02 -1.3287841095502840e-02 2.3419658386367934e-02 4.7722585657369717e-03 7.3724188056917758e-03 9.3524957743084686e-03 1.8928381626911173e-02 8.7742758711714143e-03 -1.1079501522929466e-02 5.8028303366391130e-04 -5.8917113473024143e-03 -1.6211789824471148e-02 -1.9837734983984535e-02 -2.0484812202337609e-03 -9.1922975225889074e-04 -1.0713807455717468e-02 1.5389564708090020e-02 1.8483746145826988e-02 3.9379188889903334e-02 3.5908663928611723e-03 1.5041078292803321e-03 -1.4633170272836614e-04 -1.1757435782822359e-02 -6.2212541804779128e-03 -2.2963333354950936e-02 -1.2712946053262068e-02 5.0914255307216378e-03 -5.2266460530970994e-03 4.6558674314979938e-03 9.3796783471489995e-03 9.2652377686371704e-03 7.5931303758622840e-03 -6.1178375785665541e-03 -9.5676547961379426e-04 -7.8194687409801674e-03 -3.8772629800518745e-03 -3.4900169477708213e-03 -5.9683539320398646e-03 6.6808893580466207e-03 4.5814196601936261e-03 1.4282409318685813e-04 4.5405349102385041e-03 3.5908663928611718e-03 2.5153701343611383e-02 -1.3025440679265711e-02 -9.3471660247564665e-03 -1.3013873937949777e-02 -5.0086228171730834e-03 -7.3408296540537184e-03 -1.0903785051153796e-02 7.4280614396231024e-03 3.6972542845028350e-03 4.8158258494630721e-03 -6.3377141011046962e-03 -1.6489555952330425e-03 -2.6229889240001743e-03 7.9394990326343735e-03 -4.3446929083128197e-03 1.3367259579061963e-02 5.3177228786473662e-04 -3.5538838728539667e-04 6.7863184470881837e-03 -6.1912344831391393e-03 1.3038934510583723e-03 -3.7639432819503997e-03 -1.0882918197573633e-02 1.5041078292803321e-03 -1.3025440679265709e-02 2.2218402558740889e-02 -1.2303910395012193e-03 4.8637417681812473e-03 3.9214063698138199e-03 1.4350381186595202e-03 3.0152856809762671e-03 -1.1199213467236353e-02 3.3363885313342488e-03 -8.6202325900913736e-03 -1.6096498913648340e-04 -2.4409105697375752e-04 -7.9465982718761145e-04 -4.9909787203552304e-03 8.3202081245083610e-03 -6.7662700839753879e-03 -5.4132352949180420e-03 -9.2350381936193507e-03 5.1998116596098393e-03 1.2245611368359400e-03 -8.8250067450378403e-03 9.6964456912513233e-03 2.5723568790581033e-03 -1.4633170272836614e-04 -9.3471660247564665e-03 -1.2303910395012191e-03 2.4691675012068749e-02 -1.0555131939946741e-02 9.9389663467811711e-04 -4.4061876094598487e-03 6.1728537574901581e-03 7.0047553933388186e-03 -1.0155227828757940e-02 6.3941167675148850e-03 -2.9084321466720455e-03 -1.4513064031993279e-02 -3.0348195548653333e-02 1.6408473518811688e-02 -8.2205119824541647e-03 1.7944374962523178e-02 1.8547029043214421e-02 1.6075457490086684e-02 5.9416428914303785e-04 -3.6072850235390180e-03 9.9456849022306320e-03 -3.6996560488214175e-02 -1.5657156900087638e-02 -1.1757435782822359e-02 -1.3013873937949772e-02 4.8637417681812473e-03 -1.0555131939946741e-02 5.6921191502836734e-02 2.6654699750697252e-03 1.0034767634260387e-02 2.6823283742595939e-02 -2.0311840234978389e-02 8.9902337106388119e-03 -2.1924384522281605e-02 -4.9080272407265564e-03 -1.4335208811932954e-03 -1.4358659530780856e-03 1.0882525342514075e-03 4.3493622562947179e-03 5.3879104051137864e-03 5.8089991266447767e-03 8.6775167872342549e-03 9.0481796416377845e-03 -6.6509638206876335e-03 1.6027687658992879e-04 -2.1403347145802147e-03 -9.6683890675184399e-03 -6.2212541804779137e-03 -5.0086228171730834e-03 3.9214063698138199e-03 9.9389663467811711e-04 2.6654699750697248e-03 2.0686291896679854e-02 1.9323671512649267e-03 2.1240544209650053e-03 -1.0277569798457231e-02 -8.4586446443907400e-03 -1.0640790957954919e-02 -1.8803151956651438e-03 -1.9642086907044724e-02 -1.5663348480274869e-02 1.3917215935355430e-02 -8.3241632361996977e-03 4.2140431751363158e-03 1.0126176208589632e-02 1.9353479299265491e-02 8.1005578715515267e-03 -1.6531963075891208e-03 -3.6809664315576600e-04 -1.4223150943785996e-02 -1.4183770473599469e-02 -2.2963333354950936e-02 -7.3408296540537184e-03 1.4350381186595208e-03 -4.4061876094598487e-03 1.0034767634260389e-02 1.9323671512649272e-03 3.6934733996463257e-02 1.7182579171107833e-02 -9.6935154370157879e-03 -5.8434554491779232e-04 -2.3046187739414730e-03 -1.8296380008745333e-03 -1.5068634005868380e-02 -2.0538069828605718e-02 1.3991064032062392e-02 -3.7028480857905248e-03 8.6482049996976732e-03 1.0272321993971444e-02 9.7757970129638879e-03 6.7406595197260248e-03 -2.6180701749618025e-03 -4.8646125700282385e-04 -3.0541893629252106e-02 -1.3287841095502840e-02 -1.2712946053262064e-02 -1.0903785051153797e-02 3.0152856809762666e-03 6.1728537574901599e-03 2.6823283742595943e-02 2.1240544209650044e-03 1.7182579171107829e-02 3.8344010932358771e-02 -1.1667176856635939e-02 -1.1603405396380956e-03 -1.8572410685366789e-02 1.1346412963812963e-05 1.3075813262427096e-02 1.3482797603190533e-02 -2.6137207936453643e-02 8.9658874784506095e-03 -1.0257348621202547e-02 -2.7858527655534253e-02 -1.1192274948061326e-02 -5.0349390217225287e-03 6.2080852434044072e-03 -4.5646699438346896e-03 1.3889864335836702e-02 2.3419658386367934e-02 5.0914255307216369e-03 7.4280614396231015e-03 -1.1199213467236355e-02 7.0047553933388186e-03 -2.0311840234978389e-02 -1.0277569798457233e-02 -9.6935154370157844e-03 -1.1667176856635941e-02 4.5833428814945343e-02 -8.6874213360263360e-03 1.2470581355889070e-02 4.6040418856958081e-03 -8.7067297489807870e-03 -3.3207423471494067e-03 8.1429469900542381e-03 -7.9599600299026865e-03 3.9204979301421085e-03 8.2219055368736656e-04 -1.6703658286053378e-04 -1.3233514488437607e-03 -4.5317605460915653e-03 7.1775763919121934e-03 -6.3630956227884094e-03 4.7722585657369717e-03 -5.2266460530970985e-03 3.6972542845028350e-03 3.3363885313342492e-03 -1.0155227828757940e-02 8.9902337106388119e-03 -8.4586446443907400e-03 -5.8434554491779232e-04 -1.1603405396380956e-03 -8.6874213360263377e-03 2.5622369396604644e-02 -4.4404559668640813e-03 5.1944949058496670e-03 4.5896491668011158e-03 7.4643644302862409e-03 -1.1291162440649758e-02 4.7454223322174003e-03 -1.0016049672544311e-02 -8.9529124735318721e-03 -6.3499316571683905e-03 -7.4952765938692996e-03 1.4467603394797409e-02 -7.2900493000574423e-03 1.6784965998401385e-02 7.3724188056917758e-03 4.6558674314979946e-03 4.8158258494630703e-03 -8.6202325900913736e-03 6.3941167675148859e-03 -2.1924384522281602e-02 -1.0640790957954917e-02 -2.3046187739414713e-03 -1.8572410685366789e-02 1.2470581355889073e-02 -4.4404559668640813e-03 2.8942965195911313e-02 219 220 221 291 292 293 306 307 308 234 235 236 915 916 917 960 961 962 972 973 974 927 928 929 2.6439488196652088e-02 2.7227382146409454e-03 3.1565000022398797e-03 -1.2795646991348558e-02 -9.4956806081258425e-03 -1.2343327231949575e-02 -1.1953729831568014e-02 -7.4317315190535645e-03 -5.2053119926000584e-03 3.0533943698181605e-03 1.2432132684537241e-03 3.6675597836292716e-03 7.4721185195101118e-03 1.0597717686589197e-02 1.0721546531302016e-02 -7.4574464500669450e-03 -1.5549962021265277e-04 -3.7082609444072452e-03 -5.5938434347120661e-03 -2.4345109231495759e-03 -2.4004702963491961e-03 8.3566562171522355e-04 4.9537535008577736e-03 6.1117641481348989e-03 2.7227382146409449e-03 4.3128926307670727e-02 1.8380695615631035e-02 -9.8787912531109068e-03 -1.1697520691684696e-03 -1.7146174257556023e-03 -1.4799769502692746e-02 -2.5445540458505805e-02 -7.3536149958377851e-03 9.5658822730991370e-04 -6.2084075291428328e-03 7.3985660071060810e-03 1.0632151530075316e-02 2.1175455069310463e-02 1.0550686532122275e-02 -2.0629712390803920e-03 -8.4304788213472104e-04 -1.5943949408410773e-02 -1.9683638609630984e-03 -2.1615718666804673e-02 -1.6650513169998573e-02 1.4398417883820971e-02 -9.0219147712246768e-03 5.3327468451433305e-03 3.1565000022398784e-03 1.8380695615631035e-02 4.5718085050537628e-02 -1.3059891767593186e-02 -1.5345670395693243e-03 -2.1157574274829900e-02 -1.4535516669456537e-02 -1.4128061673887036e-02 -1.2234465203981353e-02 3.2618337191609947e-03 9.1593625636381387e-03 2.6825986183476331e-02 1.1379934209784837e-02 1.0170737287098535e-02 9.3831241236626440e-03 -3.5323995100030609e-03 -9.4858478537124041e-04 -3.4443873201265233e-02 -2.0400176373034833e-03 -1.7591347736691614e-02 -2.3258094545512566e-02 1.5369557653170551e-02 -3.5082342308484834e-03 9.1668118679124402e-03 -1.2795646991348560e-02 -9.8787912531109068e-03 -1.3059891767593182e-02 5.0077284522673467e-02 -1.0151149657226698e-02 1.3980084442239160e-02 2.6172263468450981e-02 6.4705369033034440e-03 7.7164095821065292e-03 -1.3400858039217381e-02 7.2968163693245330e-03 -2.2281385111394054e-02 -3.2273298502808863e-02 -1.2552997680652702e-02 -7.5417424974962496e-03 9.8012032287332490e-03 -5.5402884476470947e-03 1.8506035093970346e-02 1.9610524879909962e-03 1.5489289901532864e-02 1.5870942982058992e-02 -2.9542000174473899e-02 8.8665838644765502e-03 -1.3190452723891523e-02 -9.4956806081258425e-03 -1.1697520691684694e-03 -1.5345670395693232e-03 -1.0151149657226698e-02 2.7298730822515858e-02 -5.2485387825807351e-03 4.5238777166492642e-03 -5.8466019094298750e-03 4.7729889130565684e-03 4.2340746265511807e-03 -1.2360579943153711e-02 1.0325339022578791e-02 1.3859860753884013e-03 -1.3934499803386542e-04 -1.1100648132604291e-03 -4.7822989287085596e-03 9.3903917364690677e-03 -8.7138599534136874e-03 4.7490728958484874e-03 -8.5031983941722174e-03 -3.7197015010681901e-03 9.5361178796237647e-03 -8.6696452450267820e-03 5.2284041542569977e-03 -1.2343327231949572e-02 -1.7146174257556030e-03 -2.1157574274829900e-02 1.3980084442239159e-02 -5.2485387825807351e-03 3.0598075300594867e-02 8.3833619986781547e-03 4.7286600302591936e-03 5.2754674622719454e-03 -9.2607375679276370e-03 6.9262317896357315e-03 -2.5021010997936147e-02 -1.0348870391678373e-02 -6.7895836297668290e-03 -9.4721844465822172e-03 1.5255951946524996e-02 -7.3843552222677706e-03 2.1099671256118967e-02 6.2711839222301001e-03 5.0746187476478997e-03 1.0426227446347282e-02 -1.1937647118116833e-02 4.4075844928281047e-03 -1.1748671745984790e-02 -1.1953729831568014e-02 -1.4799769502692748e-02 -1.4535516669456537e-02 2.6172263468450981e-02 4.5238777166492659e-03 8.3833619986781564e-03 4.8738523334538222e-02 1.9986610654311125e-02 4.2783801270331982e-03 -1.1900134362439484e-02 1.9784776539788131e-03 -1.5086147019895788e-02 -2.8110445929823293e-02 -1.8227181938388848e-02 -4.9254013303191560e-03 1.4415730206318188e-03 -5.7932272569725498e-03 2.0898208332279070e-02 7.2649550148326855e-03 1.1549061902404692e-02 1.1658580032466753e-02 -3.1653004714622915e-02 7.8215077071024249e-04 -1.0671465470785681e-02 -7.4317315190535645e-03 -2.5445540458505805e-02 -1.4128061673887037e-02 6.4705369033034432e-03 -5.8466019094298811e-03 4.7286600302591927e-03 1.9986610654311128e-02 4.2305034181870663e-02 3.4809161217513812e-03 2.3197339559588200e-03 -3.4107491727381357e-04 -1.1110350658739004e-02 -1.8671109007311341e-02 -2.1906597089002659e-02 -4.3216024114286532e-03 -8.7474337857995415e-05 -9.6054914162932731e-03 1.7600553172732271e-02 9.8242099976486863e-03 2.1605602643075428e-02 1.0979063617928589e-02 -1.2410776646999173e-02 -7.6533103444067856e-04 -7.2291781986167291e-03 -5.2053119926000584e-03 -7.3536149958377851e-03 -1.2234465203981351e-02 7.7164095821065292e-03 4.7729889130565684e-03 5.2754674622719436e-03 4.2783801270331965e-03 3.4809161217513812e-03 2.6254214378330139e-02 -1.5444189450388404e-02 -1.1682465755740907e-02 -1.3706115591923329e-02 -3.2033680012618355e-03 -2.7795510854109768e-03 -6.8926805074567095e-03 7.7468490414865756e-03 5.5749024409158304e-03 1.8476209257083246e-03 1.0278749904370950e-02 9.3710731242748983e-03 8.4952043347870741e-03 -6.1675192107469527e-03 -1.3842487630090089e-03 -9.0392457977360799e-03 3.0533943698181597e-03 9.5658822730991392e-04 3.2618337191609938e-03 -1.3400858039217377e-02 4.2340746265511807e-03 -9.2607375679276353e-03 -1.1900134362439484e-02 2.3197339559588204e-03 -1.5444189450388404e-02 2.9859033505033373e-02 -1.3370175635234228e-03 5.2033566162965235e-03 -5.9506496450466892e-04 -6.5749837579101274e-04 7.6221481330614373e-03 -7.0449613031213143e-03 1.4687230691169920e-03 -4.4600203096738554e-03 -7.6952951859252470e-03 -2.0544668677282352e-03 -3.2487155752812529e-03 7.7238859803565596e-03 -4.9301370718942321e-03 1.6326324434752189e-02 1.2432132684537236e-03 -6.2084075291428380e-03 9.1593625636381352e-03 7.2968163693245321e-03 -1.2360579943153711e-02 6.9262317896357324e-03 1.9784776539788131e-03 -3.4107491727381270e-04 -1.1682465755740907e-02 -1.3370175635234233e-03 3.2587601240708620e-02 -1.1302717754835219e-02 -6.0244829873309334e-03 -1.1122309996712014e-02 4.9992257760917659e-03 1.5748684847113983e-03 -9.5810741965588024e-03 1.0511012052114778e-02 1.5723245226618944e-04 -1.0011712218291314e-03 -7.9047971566914045e-04 -4.8891076778803024e-03 8.0270165639616895e-03 -7.8201689552351416e-03 3.6675597836292716e-03 7.3985660071060819e-03 2.6825986183476331e-02 -2.2281385111394054e-02 1.0325339022578792e-02 -2.5021010997936143e-02 -1.5086147019895791e-02 -1.1110350658739004e-02 -1.3706115591923335e-02 5.2033566162965235e-03 -1.1302717754835217e-02 6.6833862278396841e-02 2.0514002758098178e-02 1.7097211266631846e-02 1.2798195537995455e-03 -4.8381854574062483e-03 1.0558231260717792e-02 -4.1397662991262726e-02 -2.9957684625985023e-03 -1.5931428010531972e-02 -3.4473031458913644e-02 1.5816566893270614e-02 -7.0348511329283029e-03 1.9658153024363134e-02 7.4721185195101153e-03 1.0632151530075316e-02 1.1379934209784837e-02 -3.2273298502808856e-02 1.3859860753884000e-03 -1.0348870391678375e-02 -2.8110445929823296e-02 -1.8671109007311344e-02 -3.2033680012618360e-03 -5.9506496450466924e-04 -6.0244829873309334e-03 2.0514002758098181e-02 5.1087628548539953e-02 2.0686858630700945e-02 5.7203125585011932e-03 -1.3054993868336296e-02 2.7432297686980438e-03 -1.7803946078282337e-02 -1.1199763908364850e-02 -1.5916222934985472e-02 -1.5142015527518083e-02 2.6673820105787914e-02 5.1635889247650469e-03 8.8839504723564021e-03 1.0597717686589197e-02 2.1175455069310463e-02 1.0170737287098533e-02 -1.2552997680652701e-02 -1.3934499803386466e-04 -6.7895836297668290e-03 -1.8227181938388848e-02 -2.1906597089002659e-02 -2.7795510854109768e-03 -6.5749837579101252e-04 -1.1122309996712012e-02 1.7097211266631846e-02 2.0686858630700945e-02 4.3604750736787372e-02 4.5080685389521430e-03 1.2403968267301478e-03 -8.0515492034167069e-04 -1.3243780444395210e-02 -7.2311842008801787e-03 -2.5503064025539965e-02 -1.4376416971323943e-02 6.1438890516924503e-03 -5.3037347764676515e-03 5.4133150382144283e-03 1.0721546531302018e-02 1.0550686532122277e-02 9.3831241236626457e-03 -7.5417424974962496e-03 -1.1100648132604295e-03 -9.4721844465822172e-03 -4.9254013303191551e-03 -4.3216024114286523e-03 -6.8926805074567086e-03 7.6221481330614373e-03 4.9992257760917650e-03 1.2798195537995446e-03 5.7203125585011932e-03 4.5080685389521430e-03 2.8049685714814036e-02 -1.4691051849295225e-02 -1.0165877469026934e-02 -1.5675099079176393e-02 -5.7123462996600000e-03 -8.5417499961130145e-03 -1.2684689750677238e-02 8.8065347539059858e-03 4.0813138426628462e-03 6.0120243916163222e-03 -7.4574464500669442e-03 -2.0629712390803925e-03 -3.5323995100030601e-03 9.8012032287332473e-03 -4.7822989287085596e-03 1.5255951946524998e-02 1.4415730206318196e-03 -8.7474337857994982e-05 7.7468490414865756e-03 -7.0449613031213143e-03 1.5748684847113985e-03 -4.8381854574062483e-03 -1.3054993868336298e-02 1.2403968267301474e-03 -1.4691051849295225e-02 2.4697266826210134e-02 -1.5152558078423547e-03 6.0803050258294820e-03 4.6094739317193963e-03 1.8390377599277015e-03 3.8657638334867739e-03 -1.2992115385770041e-02 3.7936972421200527e-03 -9.8872330306232926e-03 -1.5549962021265253e-04 -8.4304788213472245e-04 -9.4858478537123998e-04 -5.5402884476470956e-03 9.3903917364690677e-03 -7.3843552222677697e-03 -5.7932272569725506e-03 -9.6054914162932731e-03 5.5749024409158304e-03 1.4687230691169922e-03 -9.5810741965588007e-03 1.0558231260717792e-02 2.7432297686980447e-03 -8.0515492034167113e-04 -1.0165877469026932e-02 -1.5152558078423549e-03 2.7102552858308548e-02 -1.1442355066275606e-02 1.1270411618338032e-03 -4.5132593678207638e-03 6.7030451136533943e-03 7.6652771330258142e-03 -1.1144916811628384e-02 7.1049937276545273e-03 -3.7082609444072439e-03 -1.5943949408410773e-02 -3.4443873201265233e-02 1.8506035093970346e-02 -8.7138599534136892e-03 2.1099671256118963e-02 2.0898208332279074e-02 1.7600553172732271e-02 1.8476209257083252e-03 -4.4600203096738563e-03 1.0511012052114778e-02 -4.1397662991262733e-02 -1.7803946078282337e-02 -1.3243780444395212e-02 -1.5675099079176389e-02 6.0803050258294803e-03 -1.1442355066275608e-02 6.3365951260364636e-02 3.4747115138187494e-03 1.1462952525848922e-02 3.0267509924533881e-02 -2.2987032633534223e-02 9.7694271217993039e-03 -2.5064118095021445e-02 -5.5938434347120661e-03 -1.9683638609630984e-03 -2.0400176373034833e-03 1.9610524879909966e-03 4.7490728958484883e-03 6.2711839222301001e-03 7.2649550148326872e-03 9.8242099976486863e-03 1.0278749904370950e-02 -7.6952951859252479e-03 1.5723245226618976e-04 -2.9957684625985023e-03 -1.1199763908364847e-02 -7.2311842008801796e-03 -5.7123462996600000e-03 4.6094739317193963e-03 1.1270411618338027e-03 3.4747115138187494e-03 2.2801348346444313e-02 2.5378852953743297e-03 2.7981825220218994e-03 -1.2147927251985227e-02 -9.1958937411282179e-03 -1.2074695462879712e-02 -2.4345109231495763e-03 -2.1615718666804673e-02 -1.7591347736691611e-02 1.5489289901532864e-02 -8.5031983941722174e-03 5.0746187476478997e-03 1.1549061902404692e-02 2.1605602643075428e-02 9.3710731242748965e-03 -2.0544668677282348e-03 -1.0011712218291316e-03 -1.5931428010531972e-02 -1.5916222934985475e-02 -2.5503064025539961e-02 -8.5417499961130162e-03 1.8390377599277015e-03 -4.5132593678207638e-03 1.1462952525848920e-02 2.5378852953743297e-03 4.0677851521858106e-02 1.9199626589539515e-02 -1.1010074133376303e-02 -1.1470424887667871e-03 -3.0437452439746222e-03 -2.4004702963491970e-03 -1.6650513169998573e-02 -2.3258094545512566e-02 1.5870942982058992e-02 -3.7197015010681910e-03 1.0426227446347282e-02 1.1658580032466753e-02 1.0979063617928591e-02 8.4952043347870723e-03 -3.2487155752812533e-03 -7.9047971566914056e-04 -3.4473031458913644e-02 -1.5142015527518083e-02 -1.4376416971323948e-02 -1.2684689750677238e-02 3.8657638334867739e-03 6.7030451136533926e-03 3.0267509924533885e-02 2.7981825220218994e-03 1.9199626589539515e-02 4.2684630769329407e-02 -1.3402267970885886e-02 -1.3446239630616657e-03 -2.1457756719894180e-02 8.3566562171522442e-04 1.4398417883820968e-02 1.5369557653170551e-02 -2.9542000174473899e-02 9.5361178796237647e-03 -1.1937647118116835e-02 -3.1653004714622922e-02 -1.2410776646999173e-02 -6.1675192107469518e-03 7.7238859803565579e-03 -4.8891076778803024e-03 1.5816566893270618e-02 2.6673820105787914e-02 6.1438890516924503e-03 8.8065347539059858e-03 -1.2992115385770041e-02 7.6652771330258142e-03 -2.2987032633534223e-02 -1.2147927251985227e-02 -1.1010074133376305e-02 -1.3402267970885879e-02 5.1101675818992387e-02 -9.4337434899072151e-03 1.4501807632936715e-02 4.9537535008577736e-03 -9.0219147712246768e-03 -3.5082342308484834e-03 8.8665838644765502e-03 -8.6696452450267820e-03 4.4075844928281047e-03 7.8215077071024314e-04 -7.6533103444067748e-04 -1.3842487630090091e-03 -4.9301370718942321e-03 8.0270165639616895e-03 -7.0348511329283011e-03 5.1635889247650451e-03 -5.3037347764676515e-03 4.0813138426628471e-03 3.7936972421200527e-03 -1.1144916811628384e-02 9.7694271217993039e-03 -9.1958937411282179e-03 -1.1470424887667871e-03 -1.3446239630616665e-03 -9.4337434899072134e-03 2.8025568563593267e-02 -4.9863673674427900e-03 6.1117641481348989e-03 5.3327468451433296e-03 9.1668118679124420e-03 -1.3190452723891523e-02 5.2284041542569985e-03 -1.1748671745984790e-02 -1.0671465470785681e-02 -7.2291781986167291e-03 -9.0392457977360799e-03 1.6326324434752189e-02 -7.8201689552351433e-03 1.9658153024363138e-02 8.8839504723564038e-03 5.4133150382144266e-03 6.0120243916163222e-03 -9.8872330306232926e-03 7.1049937276545291e-03 -2.5064118095021445e-02 -1.2074695462879710e-02 -3.0437452439746196e-03 -2.1457756719894180e-02 1.4501807632936715e-02 -4.9863673674427891e-03 3.2472803074744580e-02 162 163 164 234 235 236 249 250 251 177 178 179 882 883 884 927 928 929 663 664 665 501 502 503 2.0826509824607150e-02 9.3479432904038193e-04 8.3121837060526782e-04 -7.7132642042829847e-03 -9.3708359819855251e-03 -8.1979236369115870e-03 -7.7718439172015054e-03 -5.6806599825178147e-03 -3.0404945523997448e-03 1.5738483300683174e-03 7.6658966753000005e-04 1.3403518407637211e-03 3.6847123080314534e-03 9.1848373996760921e-03 7.2238424840646792e-03 -5.7704649630268643e-03 -4.1809915225919322e-04 -1.2215109022053936e-03 -4.0585517698162824e-03 -6.9567071356457322e-04 -5.0723372890579027e-04 -7.7094560837928194e-04 5.2790444340806335e-03 3.5717501249888494e-03 9.3479432904038215e-04 3.9277000382867092e-02 1.4487243439185643e-02 -1.0209828660353920e-02 -1.8613159169257540e-03 -4.3487224186054916e-03 -1.3352496291522855e-02 -2.4421978035706771e-02 -2.8994878382404632e-03 5.7908990759383784e-04 -3.8680117749754911e-03 1.0452946471704069e-02 9.4326541474948292e-03 2.0599326957400320e-02 6.6752330648874227e-03 -9.8022394473501928e-04 -3.0017692634389838e-03 -1.7822346871373396e-02 -9.9961545267335380e-05 -2.1429252287960603e-02 -1.3125844502873707e-02 1.3695972057750068e-02 -5.2940000612598090e-03 6.5809786553159121e-03 8.3121837060526782e-04 1.4487243439185643e-02 3.2271057104445389e-02 -8.9815537736458312e-03 -3.8415927561072567e-03 -1.5345404413265965e-02 -9.8239842621937624e-03 -9.9308259906247948e-03 -5.7212584887897395e-03 7.4882829387148617e-04 1.1533277438591139e-02 1.9608635907059545e-02 8.0092168647385217e-03 6.3594032263104144e-03 3.3674225323245626e-03 -1.1491604777000416e-03 -4.6764791064310175e-03 -2.6685007795450886e-02 -6.2410846161339612e-05 -1.3816770390945338e-02 -1.4451023104198784e-02 1.0427845830485692e-02 -1.1425585997878828e-04 6.9555782578758678e-03 -7.7132642042829829e-03 -1.0209828660353920e-02 -8.9815537736458294e-03 4.1209225342284980e-02 -5.2950729316085486e-03 1.2481459540576046e-02 2.1065822069887798e-02 7.9815880379904888e-03 4.1533656766615887e-03 -9.1410018373659207e-03 3.5504062296246677e-03 -2.0099035575719394e-02 -2.6862644397977090e-02 -1.2978305462815747e-02 -3.2036285971462223e-03 5.8260048377258003e-03 -2.1668280702550695e-03 1.6589216486887076e-02 -5.7466109604971903e-05 1.4832258599281032e-02 1.0752307616539225e-02 -2.4326675700667599e-02 4.2857822581370969e-03 -1.1692131374152476e-02 -9.3708359819855251e-03 -1.8613159169257540e-03 -3.8415927561072549e-03 -5.2950729316085477e-03 2.0115050624823300e-02 -3.0073275147922325e-03 6.0178672585703688e-03 -3.5361682791540364e-03 5.7889703568270627e-03 2.0924462043974989e-03 -8.0757711387903948e-03 5.9024606697507809e-03 -1.6102030365878544e-03 -1.8394630779366792e-03 -2.5224919720307510e-03 -1.9816159295879075e-03 5.2768783880729605e-03 -5.0234367955491561e-03 5.0473387139580309e-03 -5.0206786718400157e-03 -2.2938497930451629e-04 5.1000757028439340e-03 -5.0585319282493765e-03 2.9328029912060617e-03 -8.1979236369115888e-03 -4.3487224186054899e-03 -1.5345404413265965e-02 1.2481459540576044e-02 -3.0073275147922316e-03 2.5736380858190130e-02 5.3085686095080756e-03 5.9137462229009331e-03 1.2023107729623062e-03 -7.7219475563208972e-03 3.9176511705462354e-03 -2.3005354932554282e-02 -8.1085683555883227e-03 -7.3293601768455539e-03 -5.6106715350998596e-03 1.3257805129595323e-02 -3.8249300504260677e-03 1.9064911265988367e-02 3.7594128750014985e-03 6.4081710452341956e-03 8.1781515547080814e-03 -1.0778806605860130e-02 2.2707717219879785e-03 -1.0220323570928766e-02 -7.7718439172015027e-03 -1.3352496291522851e-02 -9.8239842621937624e-03 2.1065822069887795e-02 6.0178672585703688e-03 5.3085686095080756e-03 4.1325420505039165e-02 1.8454721358121408e-02 -1.0856170134442575e-03 -5.7455677517410661e-03 8.6279761940032704e-04 -1.2869809167727463e-02 -2.3768267698024939e-02 -1.6938999450055135e-02 -2.0199827681910350e-04 -1.9442299442684256e-03 -2.7124936767760482e-03 1.8683598772961985e-02 2.9302415384059575e-03 9.8693092684119348e-03 7.9346442878685843e-03 -2.6091574802096954e-02 -2.2007060861500001e-03 -7.9454029501540464e-03 -5.6806599825178156e-03 -2.4421978035706771e-02 -9.9308259906247948e-03 7.9815880379904870e-03 -3.5361682791540364e-03 5.9137462229009331e-03 1.8454721358121408e-02 3.9979448997633900e-02 -1.1378314130294420e-03 9.6498087650671123e-04 -8.3680769613051495e-05 -1.2308717149122348e-02 -1.7343262648595696e-02 -2.2224516555129317e-02 -2.4950255453625239e-04 -7.0265307625243400e-05 -7.3049714158117647e-03 1.8257115110692338e-02 8.3193891338263527e-03 2.0329737191978694e-02 6.9262119646152668e-03 -1.2626491467706193e-02 -2.7378711341976558e-03 -7.4701961908956883e-03 -3.0404945523997452e-03 -2.8994878382404624e-03 -5.7212584887897386e-03 4.1533656766615879e-03 5.7889703568270627e-03 1.2023107729623064e-03 -1.0856170134442569e-03 -1.1378314130294418e-03 2.2503908123131168e-02 -1.3414556073292200e-02 -1.2804589859712043e-02 -3.4141809255947030e-03 1.5736544168747733e-03 1.4342391985528509e-03 -5.6328768285907240e-03 6.5776864407448817e-03 6.8136656365700658e-03 -5.8934222535259725e-03 7.2376285916993608e-03 5.2784108805521007e-03 2.0565171758386231e-03 -2.0016674868443998e-03 -2.4733769615201320e-03 -5.1009975754309584e-03 1.5738483300683178e-03 5.7908990759383827e-04 7.4882829387148638e-04 -9.1410018373659207e-03 2.0924462043974985e-03 -7.7219475563208980e-03 -5.7455677517410687e-03 9.6498087650670949e-04 -1.3414556073292200e-02 2.6523764060072799e-02 -1.7533679451329787e-04 2.0788744876337893e-03 -4.0342418245700026e-03 -7.9764469281148431e-04 6.5402478006705003e-03 -6.2023721399483804e-03 3.8580721891749259e-04 -1.8464407715963738e-03 -6.3134251696912230e-03 -9.2842591311021253e-04 -8.2431035183573760e-04 3.3389963331754745e-03 -2.1209168069805458e-03 1.4439304170869430e-02 7.6658966752999984e-04 -3.8680117749754920e-03 1.1533277438591139e-02 3.5504062296246690e-03 -8.0757711387903948e-03 3.9176511705462363e-03 8.6279761940032595e-04 -8.3680769613053555e-05 -1.2804589859712043e-02 -1.7533679451329769e-04 2.7483907463772016e-02 -6.1910013324636120e-03 -3.3610667592322793e-03 -9.2932330162110322e-03 6.4219894202783593e-03 5.0667870205949625e-04 -6.9165621896844203e-03 5.7026155678314375e-03 1.3077424710944017e-04 -3.0726186156391734e-03 -4.2742327695239630e-03 -2.2808429119783521e-03 3.8259700411415478e-03 -4.3057096355475482e-03 1.3403518407637204e-03 1.0452946471704068e-02 1.9608635907059545e-02 -2.0099035575719390e-02 5.9024606697507817e-03 -2.3005354932554282e-02 -1.2869809167727460e-02 -1.2308717149122350e-02 -3.4141809255947065e-03 2.0788744876337898e-03 -6.1910013324636120e-03 6.3685187990029632e-02 1.8610913264237920e-02 1.7932947235808145e-02 -6.0389767455610614e-03 -2.3917007671053802e-03 5.1335178816541913e-03 -4.0659216560234045e-02 -3.1838170870985899e-04 -1.7538655359681622e-02 -2.7141939573925689e-02 1.3648787626626647e-02 -3.3834984176496037e-03 1.6965844840780585e-02 3.6847123080314529e-03 9.4326541474948292e-03 8.0092168647385217e-03 -2.6862644397977090e-02 -1.6102030365878542e-03 -8.1085683555883227e-03 -2.3768267698024946e-02 -1.7343262648595696e-02 1.5736544168747728e-03 -4.0342418245700026e-03 -3.3610667592322801e-03 1.8610913264237920e-02 4.4247921080983070e-02 1.9495731888121336e-02 2.4573936807544179e-04 -8.0890157864958508e-03 6.2721631002300867e-04 -1.5575281568711543e-02 -7.2705652728579659e-03 -1.4320767816399864e-02 -1.0192279510911912e-02 2.2092101590911326e-02 7.0796979151765260e-03 5.4366055212851155e-03 9.1848373996760938e-03 2.0599326957400320e-02 6.3594032263104144e-03 -1.2978305462815747e-02 -1.8394630779366790e-03 -7.3293601768455539e-03 -1.6938999450055135e-02 -2.2224516555129321e-02 1.4342391985528516e-03 -7.9764469281148344e-04 -9.2932330162110340e-03 1.7932947235808142e-02 1.9495731888121332e-02 4.2082350293086768e-02 8.8817532717031390e-05 -1.2752175199416460e-05 -2.1336384316595620e-03 -1.4495051073847250e-02 -5.4210194907435387e-03 -2.4957914582785439e-02 -1.0267747165231258e-02 7.4681519838278813e-03 -2.2329115867650495e-03 6.2767512225356068e-03 7.2238424840646792e-03 6.6752330648874245e-03 3.3674225323245626e-03 -3.2036285971462223e-03 -2.5224919720307510e-03 -5.6106715350998596e-03 -2.0199827681910366e-04 -2.4950255453625245e-04 -5.6328768285907240e-03 6.5402478006705003e-03 6.4219894202783585e-03 -6.0389767455610614e-03 2.4573936807544125e-04 8.8817532717031065e-05 2.4240132719570429e-02 -1.2498069319662887e-02 -1.1583908912260344e-02 -6.4746808301923801e-03 -3.6004800085463031e-03 -4.1142940356861087e-03 -6.3990381744707331e-03 5.4943465493638936e-03 5.2841574566306450e-03 2.5486888620197688e-03 -5.7704649630268652e-03 -9.8022394473501885e-04 -1.1491604777000412e-03 5.8260048377257994e-03 -1.9816159295879070e-03 1.3257805129595323e-02 -1.9442299442684260e-03 -7.0265307625243820e-05 6.5776864407448817e-03 -6.2023721399483804e-03 5.0667870205949625e-04 -2.3917007671053802e-03 -8.0890157864958474e-03 -1.2752175199416135e-05 -1.2498069319662887e-02 2.1738194945521760e-02 -1.9178525741036509e-04 3.1851265358685049e-03 3.5507642095376473e-03 1.2958385743034723e-03 1.3062027967884579e-03 -9.1088811590456856e-03 1.4341253381949816e-03 -8.2878903385288638e-03 -4.1809915225919322e-04 -3.0017692634389834e-03 -4.6764791064310184e-03 -2.1668280702550695e-03 5.2768783880729605e-03 -3.8249300504260672e-03 -2.7124936767760482e-03 -7.3049714158117656e-03 6.8136656365700649e-03 3.8580721891749253e-04 -6.9165621896844194e-03 5.1335178816541913e-03 6.2721631002300791e-04 -2.1336384316595646e-03 -1.1583908912260346e-02 -1.9178525741036511e-04 2.2209243314944262e-02 -5.3943460476720611e-03 9.1632520128112204e-04 -1.0593756809134879e-03 1.0024678634875977e-02 3.5598574264790509e-03 -7.0698047215090060e-03 3.5078019636892582e-03 -1.2215109022053934e-03 -1.7822346871373396e-02 -2.6685007795450889e-02 1.6589216486887076e-02 -5.0234367955491561e-03 1.9064911265988367e-02 1.8683598772961985e-02 1.8257115110692338e-02 -5.8934222535259725e-03 -1.8464407715963736e-03 5.7026155678314358e-03 -4.0659216560234045e-02 -1.5575281568711543e-02 -1.4495051073847244e-02 -6.4746808301923810e-03 3.1851265358685049e-03 -5.3943460476720611e-03 6.0427025459351948e-02 7.1113198502443750e-04 1.3788289011375538e-02 2.3152522404528308e-02 -2.0525840538228677e-02 4.9871610985425434e-03 -2.2932131690465311e-02 -4.0585517698162833e-03 -9.9961545267335163e-05 -6.2410846161339829e-05 -5.7466109604972174e-05 5.0473387139580309e-03 3.7594128750014981e-03 2.9302415384059575e-03 8.3193891338263510e-03 7.2376285916993608e-03 -6.3134251696912230e-03 1.3077424710944039e-04 -3.1838170870985855e-04 -7.2705652728579659e-03 -5.4210194907435370e-03 -3.6004800085463031e-03 3.5507642095376473e-03 9.1632520128112182e-04 7.1113198502443706e-04 1.8838943207373587e-02 5.0638781595914429e-04 3.9444554827620189e-04 -7.6199406333467470e-03 -9.3992340761232182e-03 -8.1213464365839962e-03 -6.9567071356457322e-04 -2.1429252287960599e-02 -1.3816770390945338e-02 1.4832258599281030e-02 -5.0206786718400148e-03 6.4081710452341956e-03 9.8693092684119365e-03 2.0329737191978694e-02 5.2784108805520999e-03 -9.2842591311021242e-04 -3.0726186156391734e-03 -1.7538655359681622e-02 -1.4320767816399863e-02 -2.4957914582785429e-02 -4.1142940356861087e-03 1.2958385743034723e-03 -1.0593756809134860e-03 1.3788289011375542e-02 5.0638781595914440e-04 3.8135431511855507e-02 1.5089077725252954e-02 -1.0558929814880920e-02 -2.9253288646954902e-03 -5.0942288761017130e-03 -5.0723372890579006e-04 -1.3125844502873709e-02 -1.4451023104198785e-02 1.0752307616539225e-02 -2.2938497930451591e-04 8.1781515547080814e-03 7.9346442878685825e-03 6.9262119646152668e-03 2.0565171758386231e-03 -8.2431035183573717e-04 -4.2742327695239630e-03 -2.7141939573925689e-02 -1.0192279510911912e-02 -1.0267747165231258e-02 -6.3990381744707331e-03 1.3062027967884579e-03 1.0024678634875975e-02 2.3152522404528308e-02 3.9444554827620227e-04 1.5089077725252953e-02 3.0659476854617191e-02 -8.8637766578190235e-03 -4.1427589078107500e-03 -1.6054667137096988e-02 -7.7094560837928183e-04 1.3695972057750066e-02 1.0427845830485694e-02 -2.4326675700667603e-02 5.1000757028439349e-03 -1.0778806605860130e-02 -2.6091574802096958e-02 -1.2626491467706193e-02 -2.0016674868443998e-03 3.3389963331754745e-03 -2.2808429119783521e-03 1.3648787626626651e-02 2.2092101590911333e-02 7.4681519838278839e-03 5.4943465493638936e-03 -9.1088811590456856e-03 3.5598574264790505e-03 -2.0525840538228673e-02 -7.6199406333467487e-03 -1.0558929814880920e-02 -8.8637766578190218e-03 4.2486919979449464e-02 -4.3577929763354718e-03 1.2599111282275978e-02 5.2790444340806344e-03 -5.2940000612598081e-03 -1.1425585997878779e-04 4.2857822581370978e-03 -5.0585319282493773e-03 2.2707717219879785e-03 -2.2007060861500010e-03 -2.7378711341976558e-03 -2.4733769615201320e-03 -2.1209168069805458e-03 3.8259700411415474e-03 -3.3834984176496045e-03 7.0796979151765251e-03 -2.2329115867650495e-03 5.2841574566306442e-03 1.4341253381949816e-03 -7.0698047215090060e-03 4.9871610985425434e-03 -9.3992340761232182e-03 -2.9253288646954915e-03 -4.1427589078107500e-03 -4.3577929763354700e-03 2.1492478255534846e-02 -2.4282001302018885e-03 3.5717501249888494e-03 6.5809786553159104e-03 6.9555782578758687e-03 -1.1692131374152476e-02 2.9328029912060617e-03 -1.0220323570928769e-02 -7.9454029501540464e-03 -7.4701961908956883e-03 -5.1009975754309576e-03 1.4439304170869431e-02 -4.3057096355475491e-03 1.6965844840780585e-02 5.4366055212851146e-03 6.2767512225356094e-03 2.5486888620197684e-03 -8.2878903385288621e-03 3.5078019636892582e-03 -2.2932131690465318e-02 -8.1213464365839962e-03 -5.0942288761017139e-03 -1.6054667137096988e-02 1.2599111282275980e-02 -2.4282001302018885e-03 2.7838008013245801e-02 234 235 236 306 307 308 321 322 323 249 250 251 927 928 929 972 973 974 984 985 986 663 664 665 2.3720176411127353e-02 1.5363427890389837e-03 1.3593313306118789e-03 -1.0198450601933246e-02 -1.0523715045146764e-02 -9.5333101612283516e-03 -9.5604041158261540e-03 -6.6503914557067409e-03 -3.5853586518454043e-03 2.5045369838975692e-03 1.0751110321871838e-03 1.9375698218941772e-03 4.9001265351514278e-03 1.0431335964214512e-02 8.2144778998001905e-03 -6.6530280530400759e-03 -4.6701851587399097e-04 -1.8357109417126833e-03 -4.6296845014876832e-03 -1.1694575681456391e-03 -8.6232876987074201e-04 -8.3272657889193547e-05 5.7677927994324541e-03 4.3053294723509336e-03 1.5363427890389848e-03 4.3875970256537215e-02 1.6427047571276981e-02 -1.1210402898298470e-02 -3.6893006583025496e-03 -4.9718278559375021e-03 -1.4987461675189865e-02 -2.7399825334656638e-02 -3.8373256060841923e-03 7.5339638604700104e-04 -3.0840669850322544e-03 1.1357842529145845e-02 1.0766293707744734e-02 2.3164996759353306e-02 7.7826652766716650e-03 -1.3890122333344627e-03 -3.8074851346635691e-03 -1.9709412719770020e-02 -6.1845771827905092e-04 -2.3827642308483318e-02 -1.4636646673072606e-02 1.5149301642271138e-02 -5.2326465947521838e-03 7.5876574777698387e-03 1.3593313306118795e-03 1.6427047571276977e-02 3.6965846246006066e-02 -1.0455378918543985e-02 -4.7750697415784400e-03 -1.8661753795066766e-02 -1.1213143020004444e-02 -1.1461956274063795e-02 -7.3671493575862409e-03 1.3726836872706611e-03 1.3095600388459978e-02 2.2949627606850383e-02 9.2429826026450002e-03 7.7032680767586169e-03 4.4914041789059994e-03 -1.7887942283049826e-03 -5.3227397204492462e-03 -3.0327023055146049e-02 -4.8333888222634150e-04 -1.5769208601832320e-02 -1.6564350245795754e-02 1.1965657428552216e-02 1.0305830142822738e-04 8.5133984218323678e-03 -1.0198450601933246e-02 -1.1210402898298470e-02 -1.0455378918543985e-02 4.6716875954235473e-02 -5.3068709289845134e-03 1.4364086644908921e-02 2.4337724207812723e-02 8.8705281474443579e-03 5.3884927051937237e-03 -1.1018464176140634e-02 3.6641433336771392e-03 -2.2482737680195469e-02 -3.0462766316720014e-02 -1.4757344185571640e-02 -4.2293815436296855e-03 7.2313935228874330e-03 -2.2955986916584547e-03 1.8707818439616483e-02 7.3842932890638528e-04 1.6565407578922400e-02 1.2257959679577969e-02 -2.7344741919048121e-02 4.4701376444691897e-03 -1.3550859326927969e-02 -1.0523715045146764e-02 -3.6893006583025496e-03 -4.7750697415784409e-03 -5.3068709289845143e-03 2.2641193048119332e-02 -3.0555451731538595e-03 7.1983307748916476e-03 -2.7369912466535676e-03 6.5585852975765160e-03 2.1952300551858223e-03 -9.1155237714508341e-03 5.9617630359811418e-03 -2.1733857155413704e-03 -2.7557866077050890e-03 -2.8183386130728638e-03 -2.0671498587588547e-03 5.9817489729471667e-03 -5.0266962087952092e-03 5.5492740135655149e-03 -4.8043740406950239e-03 1.0325126497644590e-04 5.1282867047885228e-03 -5.5209656962594356e-03 3.0520501380662678e-03 -9.5333101612283516e-03 -4.9718278559375021e-03 -1.8661753795066766e-02 1.4364086644908921e-02 -3.0555451731538595e-03 2.9630698909635208e-02 6.3345326418902358e-03 6.4533356502037564e-03 2.4455775411898954e-03 -8.8588032242519835e-03 4.0017891404696294e-03 -2.6374493100792054e-02 -9.4229257806513582e-03 -8.3729536115829412e-03 -6.8284180169871341e-03 1.4916117442833738e-02 -3.9188132770147811e-03 2.1954069327142611e-02 4.4767810082447703e-03 7.4511727318228053e-03 9.6961672834289716e-03 -1.2276478571745976e-02 2.4128423951928954e-03 -1.1861848148550728e-02 -9.5604041158261505e-03 -1.4987461675189865e-02 -1.1213143020004441e-02 2.4337724207812723e-02 7.1983307748916476e-03 6.3345326418902358e-03 4.7000586333371806e-02 2.0621329498179668e-02 -3.7529099379828967e-04 -8.3005262377346452e-03 3.8706283595952922e-04 -1.4231617280499084e-02 -2.6803776407992030e-02 -1.9078301559423874e-02 -8.1438091884433240e-04 -1.3468337734846582e-03 -2.7045364351044390e-03 2.0905783172101858e-02 4.2836903035129697e-03 1.1271331540888755e-02 8.8844603957827176e-03 -2.9610460309660021e-02 -2.7077549802014206e-03 -9.4903439966286668e-03 -6.6503914557067400e-03 -2.7399825334656638e-02 -1.1461956274063795e-02 8.8705281474443579e-03 -2.7369912466535689e-03 6.4533356502037564e-03 2.0621329498179665e-02 4.4984120741553418e-02 -4.6250316624868595e-04 7.0781329697915899e-04 -2.0109230164148122e-03 -1.3254946589813469e-02 -1.9344385013936104e-02 -2.4755752605889289e-02 -8.4150603649671245e-04 2.6294295803212515e-04 -7.4025939662019256e-03 2.0113527599591976e-02 9.6178784635714380e-03 2.3057826563182466e-02 7.9539765370940461e-03 -1.4085715894563915e-02 -3.7358611349196501e-03 -8.4999277202671211e-03 -3.5853586518454035e-03 -3.8373256060841906e-03 -7.3671493575862409e-03 5.3884927051937237e-03 6.5585852975765160e-03 2.4455775411898945e-03 -3.7529099379828956e-04 -4.6250316624868703e-04 2.5705097314785000e-02 -1.5298913614595807e-02 -1.4377021707767890e-02 -6.3663802432474314e-03 1.0646644289721749e-03 9.3973952020649039e-04 -6.2799514800275557e-03 7.4044835404522714e-03 7.4308312207787353e-03 -5.0921487041262134e-03 8.2634663592705340e-03 6.4780563708354858e-03 3.4096992276662027e-03 -2.8615437736492061e-03 -2.7303619292964590e-03 -6.4547442986536609e-03 2.5045369838975692e-03 7.5339638604700083e-04 1.3726836872706611e-03 -1.1018464176140634e-02 2.1952300551858232e-03 -8.8588032242519817e-03 -8.3005262377346470e-03 7.0781329697915910e-04 -1.5298913614595807e-02 3.0065779368421003e-02 -2.1850270998906979e-04 2.9824688424082259e-03 -3.5954059420934791e-03 -4.6884260947971292e-04 7.3484800033008059e-03 -6.9406139968938955e-03 4.7937983436715614e-04 -2.5439487419902139e-03 -7.3512933183957309e-03 -1.2712010735155448e-03 -1.2771469729433702e-03 4.6359873189398115e-03 -2.1772731795948108e-03 1.6275180020801680e-02 1.0751110321871834e-03 -3.0840669850322549e-03 1.3095600388459978e-02 3.6641433336771392e-03 -9.1155237714508341e-03 4.0017891404696294e-03 3.8706283595952890e-04 -2.0109230164148122e-03 -1.4377021707767888e-02 -2.1850270998906941e-04 3.0785392423419201e-02 -6.1396416851260353e-03 -3.3046306982714114e-03 -9.4413161651569696e-03 7.0489983402959901e-03 6.1388036331410669e-04 -7.5063531662625535e-03 5.7250451713385369e-03 5.9033769070091250e-05 -4.1506077288419284e-03 -4.9913171322799677e-03 -2.2760979259475707e-03 4.5233984097401538e-03 -4.3634525153902421e-03 1.9375698218941776e-03 1.1357842529145842e-02 2.2949627606850386e-02 -2.2482737680195465e-02 5.9617630359811435e-03 -2.6374493100792054e-02 -1.4231617280499084e-02 -1.3254946589813469e-02 -6.3663802432474357e-03 2.9824688424082250e-03 -6.1396416851260353e-03 7.1193387016415283e-02 2.0823407192462551e-02 1.9913129988953192e-02 -5.4542506803820284e-03 -3.2464219503987066e-03 5.2740765242892274e-03 -4.5087584204432769e-02 -1.0287227541700954e-03 -1.9588669017820703e-02 -3.0705235877173189e-02 1.5246053808498403e-02 -3.5235547856092122e-03 1.9844929482761807e-02 4.9001265351514296e-03 1.0766293707744734e-02 9.2429826026450002e-03 -3.0462766316720014e-02 -2.1733857155413713e-03 -9.4229257806513582e-03 -2.6803776407992027e-02 -1.9344385013936104e-02 1.0646644289721754e-03 -3.5954059420934799e-03 -3.3046306982714106e-03 2.0823407192462548e-02 4.9244807748180686e-02 2.1956197043358768e-02 9.1797296245409404e-04 -9.7200550208346014e-03 4.7560845051359467e-04 -1.7736632951279377e-02 -8.6794386349357249e-03 -1.6245894244919647e-02 -1.1668119997048849e-02 2.5116508039243743e-02 7.8701964710514369e-03 6.7786515424457672e-03 1.0431335964214510e-02 2.3164996759353310e-02 7.7032680767586169e-03 -1.4757344185571638e-02 -2.7557866077050899e-03 -8.3729536115829430e-03 -1.9078301559423871e-02 -2.4755752605889289e-02 9.3973952020649028e-04 -4.6884260947971249e-04 -9.4413161651569696e-03 1.9913129988953192e-02 2.1956197043358761e-02 4.6600690062073395e-02 7.0378585778101436e-04 -4.3295791679048780e-04 -2.9381388909200824e-03 -1.6399829229124554e-02 -6.4295678327120406e-03 -2.7986234344947479e-02 -1.1739245771176092e-02 8.7794810964044890e-03 -1.8884582068077866e-03 7.2521051681842703e-03 8.2144778998001905e-03 7.7826652766716650e-03 4.4914041789059977e-03 -4.2293815436296872e-03 -2.8183386130728638e-03 -6.8284180169871332e-03 -8.1438091884433218e-04 -8.4150603649671212e-04 -6.2799514800275548e-03 7.3484800033008059e-03 7.0489983402959901e-03 -5.4542506803820258e-03 9.1797296245409383e-04 7.0378585778101436e-04 2.6579773091860610e-02 -1.3901038023843272e-02 -1.2682288935022589e-02 -8.2963795761305595e-03 -4.0814474071918880e-03 -5.0935752695725938e-03 -7.6554482897093967e-03 6.5453170279540906e-03 5.9002593794160851e-03 3.4432707724700680e-03 -6.6530280530400759e-03 -1.3890122333344624e-03 -1.7887942283049819e-03 7.2313935228874304e-03 -2.0671498587588552e-03 1.4916117442833738e-02 -1.3468337734846574e-03 2.6294295803212548e-04 7.4044835404522705e-03 -6.9406139968938955e-03 6.1388036331410669e-04 -3.2464219503987070e-03 -9.7200550208346014e-03 -4.3295791679048818e-04 -1.3901038023843276e-02 2.3811551552061286e-02 -2.6401345445254873e-04 4.1426928915608017e-03 4.1708875355357198e-03 1.6661783015527530e-03 1.9243287991391332e-03 -1.0553301766231206e-02 1.6101318404373687e-03 -9.4513684714389815e-03 -4.6701851587399075e-04 -3.8074851346635700e-03 -5.3227397204492462e-03 -2.2955986916584552e-03 5.9817489729471667e-03 -3.9188132770147811e-03 -2.7045364351044390e-03 -7.4025939662019256e-03 7.4308312207787353e-03 4.7937983436715609e-04 -7.5063531662625535e-03 5.2740765242892274e-03 4.7560845051359478e-04 -2.9381388909200815e-03 -1.2682288935022585e-02 -2.6401345445254884e-04 2.4127709632151141e-02 -5.5365124304832501e-03 1.0931216567455285e-03 -7.0407950122191687e-04 1.1064883177405303e-02 3.6830571554631554e-03 -7.7508079458282614e-03 3.6905634404965949e-03 -1.8357109417126839e-03 -1.9709412719770020e-02 -3.0327023055146059e-02 1.8707818439616483e-02 -5.0266962087952109e-03 2.1954069327142611e-02 2.0905783172101858e-02 2.0113527599591979e-02 -5.0921487041262125e-03 -2.5439487419902131e-03 5.7250451713385360e-03 -4.5087584204432769e-02 -1.7736632951279377e-02 -1.6399829229124550e-02 -8.2963795761305664e-03 4.1426928915608017e-03 -5.5365124304832501e-03 6.6720846929783223e-02 1.3746153791328194e-03 1.5647183159222852e-02 2.6194959972989408e-02 -2.3014617247429706e-02 5.1866946580196669e-03 -2.6066740690079641e-02 -4.6296845014876832e-03 -6.1845771827905070e-04 -4.8333888222634150e-04 7.3842932890638517e-04 5.5492740135655140e-03 4.4767810082447703e-03 4.2836903035129697e-03 9.6178784635714380e-03 8.2634663592705358e-03 -7.3512933183957309e-03 5.9033769070091467e-05 -1.0287227541700946e-03 -8.6794386349357249e-03 -6.4295678327120406e-03 -4.0814474071918880e-03 4.1708875355357198e-03 1.0931216567455287e-03 1.3746153791328194e-03 2.1017050230456046e-02 1.0967500016433847e-03 8.8208187165998318e-04 -9.5496409435919787e-03 -1.0368032353604863e-02 -9.4034355747197873e-03 -1.1694575681456393e-03 -2.3827642308483318e-02 -1.5769208601832320e-02 1.6565407578922397e-02 -4.8043740406950239e-03 7.4511727318228053e-03 1.1271331540888756e-02 2.3057826563182466e-02 6.4780563708354867e-03 -1.2712010735155444e-03 -4.1506077288419301e-03 -1.9588669017820699e-02 -1.6245894244919647e-02 -2.7986234344947479e-02 -5.0935752695725938e-03 1.6661783015527530e-03 -7.0407950122191665e-04 1.5647183159222852e-02 1.0967500016433843e-03 4.2543784947310703e-02 1.7028189535738571e-02 -1.1913114536426465e-02 -4.1286735863034973e-03 -6.1531489083941071e-03 -8.6232876987074212e-04 -1.4636646673072606e-02 -1.6564350245795754e-02 1.2257959679577971e-02 1.0325126497644598e-04 9.6961672834289681e-03 8.8844603957827176e-03 7.9539765370940461e-03 3.4096992276662023e-03 -1.2771469729433692e-03 -4.9913171322799677e-03 -3.0705235877173189e-02 -1.1668119997048847e-02 -1.1739245771176094e-02 -7.6554482897093984e-03 1.9243287991391341e-03 1.1064883177405303e-02 2.6194959972989408e-02 8.8208187165998329e-04 1.7028189535738574e-02 3.4488952653838667e-02 -1.0141235006296852e-02 -4.7830909386857023e-03 -1.8864744725244922e-02 -8.3272657889193330e-05 1.5149301642271138e-02 1.1965657428552217e-02 -2.7344741919048121e-02 5.1282867047885228e-03 -1.2276478571745976e-02 -2.9610460309660018e-02 -1.4085715894563915e-02 -2.8615437736492070e-03 4.6359873189398132e-03 -2.2760979259475707e-03 1.5246053808498404e-02 2.5116508039243739e-02 8.7794810964044907e-03 6.5453170279540906e-03 -1.0553301766231205e-02 3.6830571554631554e-03 -2.3014617247429706e-02 -9.5496409435919805e-03 -1.1913114536426466e-02 -1.0141235006296852e-02 4.7388922238236979e-02 -4.4651982419893575e-03 1.4536846334117028e-02 5.7677927994324550e-03 -5.2326465947521821e-03 1.0305830142822776e-04 4.4701376444691897e-03 -5.5209656962594356e-03 2.4128423951928959e-03 -2.7077549802014206e-03 -3.7358611349196514e-03 -2.7303619292964590e-03 -2.1772731795948108e-03 4.5233984097401529e-03 -3.5235547856092122e-03 7.8701964710514386e-03 -1.8884582068077853e-03 5.9002593794160851e-03 1.6101318404373691e-03 -7.7508079458282614e-03 5.1866946580196686e-03 -1.0368032353604863e-02 -4.1286735863034964e-03 -4.7830909386857023e-03 -4.4651982419893575e-03 2.3734014755130664e-02 -2.5658470804655036e-03 4.3053294723509336e-03 7.5876574777698387e-03 8.5133984218323678e-03 -1.3550859326927969e-02 3.0520501380662686e-03 -1.1861848148550730e-02 -9.4903439966286685e-03 -8.4999277202671211e-03 -6.4547442986536627e-03 1.6275180020801680e-02 -4.3634525153902421e-03 1.9844929482761807e-02 6.7786515424457655e-03 7.2521051681842729e-03 3.4432707724700662e-03 -9.4513684714389833e-03 3.6905634404965932e-03 -2.6066740690079641e-02 -9.4034355747197838e-03 -6.1531489083941062e-03 -1.8864744725244919e-02 1.4536846334117027e-02 -2.5658470804655028e-03 3.1446479185464712e-02 858 859 860 903 904 905 915 916 917 870 871 872 861 862 863 906 907 908 918 919 920 873 874 875 2.5536638095236739e-02 -6.7415186672284888e-04 -7.1530233504986222e-04 -7.9269056923244128e-03 -7.3547617354241222e-03 -1.1328739374078488e-02 -7.9509657449898102e-03 -3.9109033466059508e-03 -5.1370001682828261e-03 3.2692658855404352e-03 -7.0673079866561165e-05 -6.7162842336782080e-04 3.1166834103380004e-03 6.8532557754901529e-03 1.0809498760981317e-02 -7.1145550841641442e-03 -1.7833211081349706e-04 1.2032923508894617e-03 -5.6378289343133672e-03 5.9722343336982703e-04 1.0056910609945319e-03 -3.2923319353234367e-03 4.7383429305730019e-03 4.8341881279136897e-03 -6.7415186672284866e-04 3.7083989222324004e-02 1.7515755790304278e-02 -7.8724151393528442e-03 4.4687795396898588e-05 6.1383545900531061e-04 -1.0708199414646138e-02 -1.9662910462383831e-02 -1.0796273447086033e-02 1.8610276984731562e-04 -5.9890849017039749e-03 2.8646340294628931e-03 6.7185288234928742e-03 1.5321737971849178e-02 1.2110988282335073e-02 3.1951356130619732e-04 -1.3007105686342721e-04 -1.0442138835197682e-02 8.2928977440283242e-04 -1.6542981440981520e-02 -1.5933036361748920e-02 1.1201331491672611e-02 -1.0125367127637314e-02 4.0662350829250831e-03 -7.1530233504986190e-04 1.7515755790304278e-02 5.2104439120964935e-02 -1.2326107416794687e-02 1.3912515533758124e-03 -2.5020622864036095e-02 -1.5723098555536344e-02 -1.5080263197123536e-02 -2.0678157728411140e-02 -7.0162349803235642e-04 3.6675824214776396e-03 2.9566039264106423e-02 1.1173480168274807e-02 1.1658228560527124e-02 1.7361704651491408e-02 1.4782882687334668e-03 3.8310392989923882e-03 -3.6012405630803178e-02 1.3926263344932442e-03 -1.6569891371204713e-02 -2.9661629977095993e-02 1.5421737033911729e-02 -6.4137030563490008e-03 1.2340633163783662e-02 -7.9269056923244128e-03 -7.8724151393528424e-03 -1.2326107416794685e-02 4.3677643564901725e-02 -1.1947316862924504e-02 1.4502254202485024e-02 2.3114994176388740e-02 3.1386480066656233e-03 1.1916846342936126e-02 -8.1044277649999583e-03 7.9278046137302976e-03 -1.7849851610339581e-02 -2.7874341874098797e-02 -7.7532025727777443e-03 -1.2666873395028165e-02 3.9661483848273020e-03 -5.7613935305540287e-03 1.4101233556194222e-02 -2.0051328396365866e-03 1.1763430265637968e-02 1.6047094366483730e-02 -2.4847977955058005e-02 1.0504445219575241e-02 -1.3724596045936677e-02 -7.3547617354241231e-03 4.4687795396898371e-05 1.3912515533758116e-03 -1.1947316862924504e-02 2.9078330865573682e-02 -7.9939776575729191e-03 5.6753274355481205e-04 -5.7092716131719777e-03 1.5117295701057307e-03 3.0981575505366621e-03 -1.4257033620374393e-02 1.2862448050131370e-02 4.2842821333280226e-03 2.1563555695190294e-04 2.3197389869512521e-03 -4.3508814034459104e-03 1.1375855282518076e-02 -1.1046636265084273e-02 4.6767649337521875e-03 -9.3617551996258517e-03 -6.9328062645473741e-03 1.1026222640622854e-02 -1.1386449067268344e-02 7.8882520266404018e-03 -1.1328739374078488e-02 6.1383545900531105e-04 -2.5020622864036095e-02 1.4502254202485023e-02 -7.9939776575729191e-03 3.2240017777073769e-02 1.2082306039231426e-02 2.4346814088942125e-03 1.1281698621305881e-02 -6.0456721108016320e-03 9.4514170495634264e-03 -2.5070958465194276e-02 -1.2998158937039641e-02 -5.3380044078672915e-03 -1.4688666621433200e-02 1.1309311768393865e-02 -9.8598379088505311e-03 2.1901371099403284e-02 5.0364234905302127e-03 3.8062638555412458e-03 1.3636939698272692e-02 -1.2557725078720767e-02 6.8856222012865483e-03 -1.4279779245392058e-02 -7.9509657449898102e-03 -1.0708199414646138e-02 -1.5723098555536347e-02 2.3114994176388737e-02 5.6753274355481292e-04 1.2082306039231426e-02 4.3629182610988942e-02 1.5393349047207532e-02 1.1691576527611935e-02 -8.3796572048885770e-03 5.2327406670522342e-03 -1.3108942663124646e-02 -2.4496808438330898e-02 -1.3700946555511007e-02 -1.1204322843587147e-02 -1.9321854572854347e-03 -8.4094759382240362e-03 1.7656960198061261e-02 3.8644334319923495e-03 7.8017527390951179e-03 1.2192025340705863e-02 -2.7848993373875308e-02 3.8232467114715008e-03 -1.3586504043362349e-02 -3.9109033466059508e-03 -1.9662910462383835e-02 -1.5080263197123536e-02 3.1386480066656233e-03 -5.7092716131719795e-03 2.4346814088942108e-03 1.5393349047207532e-02 3.4666196500728552e-02 8.6287055598747164e-03 5.0191813664497804e-03 -6.5581569076838164e-04 -6.5143146490419471e-03 -1.4227874677749851e-02 -1.6037614583399099e-02 -8.5525859543831729e-03 -3.5532337448876878e-03 -8.9917146058350710e-03 1.2132314094085255e-02 6.1195216660649690e-03 1.6537830906325393e-02 1.2832743648383726e-02 -7.9786883171444143e-03 -1.4670045149557144e-04 -5.8812809106892584e-03 -5.1370001682828278e-03 -1.0796273447086033e-02 -2.0678157728411143e-02 1.1916846342936126e-02 1.5117295701057307e-03 1.1281698621305881e-02 1.1691576527611932e-02 8.6287055598747164e-03 2.9882802728054891e-02 -1.2623304458009894e-02 -5.9772918860037877e-03 -2.3800064848867316e-02 -1.0070953013880736e-02 -7.4106004128220836e-03 -1.1579769061729264e-02 5.8422432452756553e-03 6.7627848417825672e-04 1.1909646809122026e-02 1.0259714284884891e-02 1.1644998935134350e-02 1.7734537277872307e-02 -1.1879122760535153e-02 1.7224531966188608e-03 -1.4750693797347385e-02 3.2692658855404347e-03 1.8610276984731573e-04 -7.0162349803235663e-04 -8.1044277649999566e-03 3.0981575505366625e-03 -6.0456721108016311e-03 -8.3796572048885788e-03 5.0191813664497821e-03 -1.2623304458009894e-02 2.6089416303586660e-02 3.9276211706265255e-04 -4.2936658783534890e-04 -3.2523683861513135e-03 -3.6371356481326978e-03 5.6718781408082748e-03 -5.6621582204576569e-03 -2.3026689278147681e-04 7.3828792494719069e-04 -7.3400514007477772e-03 2.3397603420177368e-04 9.9217153875156509e-04 3.3799807881181834e-03 -5.0627772971840092e-03 1.2397629050172198e-02 -7.0673079866561111e-05 -5.9890849017039758e-03 3.6675824214776396e-03 7.9278046137302959e-03 -1.4257033620374391e-02 9.4514170495634264e-03 5.2327406670522360e-03 -6.5581569076838186e-04 -5.9772918860037877e-03 3.9276211706265249e-04 3.1975637403099402e-02 -1.3729505461194563e-02 -8.1736992164199041e-03 -1.0005087826614429e-02 3.0352550931892538e-04 -4.0489424501781218e-04 -1.1223913649047186e-02 1.2705444846478637e-02 -1.7677256210699719e-04 -3.4962016948204410e-04 3.8017779979978381e-03 -4.7272682944339102e-03 1.0504918454891009e-02 -1.0222950477638122e-02 -6.7162842336782069e-04 2.8646340294628900e-03 2.9566039264106423e-02 -1.7849851610339581e-02 1.2862448050131372e-02 -2.5070958465194276e-02 -1.3108942663124649e-02 -6.5143146490419480e-03 -2.3800064848867319e-02 -4.2936658783534879e-04 -1.3729505461194563e-02 5.8510946373918744e-02 1.7082122525594757e-02 1.1477880017454934e-02 1.0695660651836273e-02 1.1649583760612679e-03 1.3056627476868046e-02 -3.5216943293889094e-02 1.6878060999373948e-03 -1.0412778824100801e-02 -3.6121000925671429e-02 1.2124902283073981e-02 -9.6049906395799505e-03 2.1436321243760680e-02 3.1166834103380013e-03 6.7185288234928742e-03 1.1173480168274810e-02 -2.7874341874098804e-02 4.2842821333280226e-03 -1.2998158937039641e-02 -2.4496808438330898e-02 -1.4227874677749852e-02 -1.0070953013880734e-02 -3.2523683861513126e-03 -8.1736992164199041e-03 1.7082122525594757e-02 4.5784261748416086e-02 1.5166772697967649e-02 1.2511061362147975e-02 -8.4719077774046969e-03 5.6805533834034206e-03 -1.4159787385388686e-02 -7.6950708935623145e-03 -1.1290303413278649e-02 -1.5949498192367694e-02 2.2889552210793938e-02 1.8417402692564296e-03 1.2411733472659219e-02 6.8532557754901529e-03 1.5321737971849178e-02 1.1658228560527124e-02 -7.7532025727777443e-03 2.1563555695190402e-04 -5.3380044078672915e-03 -1.3700946555511007e-02 -1.6037614583399099e-02 -7.4106004128220836e-03 -3.6371356481326982e-03 -1.0005087826614427e-02 1.1477880017454934e-02 1.5166772697967649e-02 3.6062785074101794e-02 8.9311259144861758e-03 4.8850234099375401e-03 -8.6513162746090799e-04 -6.9940764672147878e-03 -3.6424523526977564e-03 -1.9452478277056432e-02 -1.4725798375085907e-02 1.8286852457238653e-03 -5.2398462883720201e-03 2.4012451705218360e-03 1.0809498760981315e-02 1.2110988282335073e-02 1.7361704651491408e-02 -1.2666873395028165e-02 2.3197389869512516e-03 -1.4688666621433200e-02 -1.1204322843587147e-02 -8.5525859543831729e-03 -1.1579769061729261e-02 5.6718781408082756e-03 3.0352550931892581e-04 1.0695660651836270e-02 1.2511061362147972e-02 8.9311259144861776e-03 3.2846888171983113e-02 -1.2118534933711851e-02 -5.0571899888099568e-03 -2.5074359541247336e-02 -5.3834564952611325e-03 -1.1681796705992859e-02 -2.1430977313596614e-02 1.2380749403650727e-02 1.6261939560945550e-03 1.1869519062695618e-02 -7.1145550841641451e-03 3.1951356130619705e-04 1.4782882687334668e-03 3.9661483848273020e-03 -4.3508814034459104e-03 1.1309311768393865e-02 -1.9321854572854347e-03 -3.5532337448876874e-03 5.8422432452756553e-03 -5.6621582204576569e-03 -4.0489424501781196e-04 1.1649583760612683e-03 -8.4719077774046969e-03 4.8850234099375401e-03 -1.2118534933711851e-02 2.2408839169904732e-02 4.3382755464663436e-04 -6.2307743053401728e-04 4.5999920863356494e-03 -1.3131848784592935e-04 -8.0897985134276390e-04 -7.7941731017557546e-03 2.8019633553069655e-03 -6.2442094428756239e-03 -1.7833211081349712e-04 -1.3007105686342764e-04 3.8310392989923865e-03 -5.7613935305540279e-03 1.1375855282518076e-02 -9.8598379088505311e-03 -8.4094759382240380e-03 -8.9917146058350692e-03 6.7627848417825694e-04 -2.3026689278147664e-04 -1.1223913649047190e-02 1.3056627476868046e-02 5.6805533834034206e-03 -8.6513162746090734e-04 -5.0571899888099559e-03 4.3382755464663425e-04 2.8402802683584635e-02 -1.4177725959936344e-02 2.0347202856512976e-04 -4.7263011732148232e-03 1.6057356629137665e-03 8.2616155057578539e-03 -1.3841525853681300e-02 9.9250729346443776e-03 1.2032923508894613e-03 -1.0442138835197682e-02 -3.6012405630803178e-02 1.4101233556194222e-02 -1.1046636265084273e-02 2.1901371099403284e-02 1.7656960198061261e-02 1.2132314094085255e-02 1.1909646809122022e-02 7.3828792494719014e-04 1.2705444846478635e-02 -3.5216943293889094e-02 -1.4159787385388685e-02 -6.9940764672147878e-03 -2.5074359541247336e-02 -6.2307743053401782e-04 -1.4177725959936344e-02 5.5881181505078530e-02 -8.7512943355078673e-04 5.3889091602281102e-03 3.2494847616890747e-02 -1.8041779780618647e-02 1.2433909426641097e-02 -2.5883338564554978e-02 -5.6378289343133672e-03 8.2928977440283231e-04 1.3926263344932442e-03 -2.0051328396365866e-03 4.6767649337521866e-03 5.0364234905302127e-03 3.8644334319923512e-03 6.1195216660649690e-03 1.0259714284884891e-02 -7.3400514007477772e-03 -1.7677256210699702e-04 1.6878060999373950e-03 -7.6950708935623153e-03 -3.6424523526977564e-03 -5.3834564952611325e-03 4.5999920863356476e-03 2.0347202856512971e-04 -8.7512943355078630e-04 2.2841904189771667e-02 -7.5223966194701004e-04 -8.7262263132707523e-04 -8.6282456398396132e-03 -7.2575838260333560e-03 -1.1245361649706749e-02 5.9722343336982724e-04 -1.6542981440981520e-02 -1.6569891371204713e-02 1.1763430265637970e-02 -9.3617551996258517e-03 3.8062638555412458e-03 7.8017527390951153e-03 1.6537830906325393e-02 1.1644998935134350e-02 2.3397603420177363e-04 -3.4962016948204366e-04 -1.0412778824100799e-02 -1.1290303413278651e-02 -1.9452478277056432e-02 -1.1681796705992863e-02 -1.3131848784592935e-04 -4.7263011732148214e-03 5.3889091602281110e-03 -7.5223966194701004e-04 3.4820844413187800e-02 1.8101076897235110e-02 -8.2225209092331008e-03 -9.2553905915250968e-04 -2.7678194684043747e-04 1.0056910609945312e-03 -1.5933036361748920e-02 -2.9661629977095993e-02 1.6047094366483730e-02 -6.9328062645473733e-03 1.3636939698272692e-02 1.2192025340705865e-02 1.2832743648383726e-02 1.7734537277872307e-02 9.9217153875156422e-04 3.8017779979978390e-03 -3.6121000925671429e-02 -1.5949498192367694e-02 -1.4725798375085905e-02 -2.1430977313596614e-02 -8.0897985134276379e-04 1.6057356629137669e-03 3.2494847616890747e-02 -8.7262263132707523e-04 1.8101076897235110e-02 5.0088928294140120e-02 -1.2605881631898163e-02 1.2503067948517741e-03 -2.6741644670811839e-02 -3.2923319353234358e-03 1.1201331491672611e-02 1.5421737033911729e-02 -2.4847977955058009e-02 1.1026222640622854e-02 -1.2557725078720767e-02 -2.7848993373875308e-02 -7.9786883171444143e-03 -1.1879122760535155e-02 3.3799807881181808e-03 -4.7272682944339093e-03 1.2124902283073983e-02 2.2889552210793942e-02 1.8286852457238658e-03 1.2380749403650727e-02 -7.7941731017557563e-03 8.2616155057578557e-03 -1.8041779780618650e-02 -8.6282456398396150e-03 -8.2225209092331008e-03 -1.2605881631898167e-02 4.6142189006939997e-02 -1.1389377362965773e-02 1.5157120531136294e-02 4.7383429305730019e-03 -1.0125367127637314e-02 -6.4137030563489999e-03 1.0504445219575241e-02 -1.1386449067268342e-02 6.8856222012865492e-03 3.8232467114715013e-03 -1.4670045149557187e-04 1.7224531966188613e-03 -5.0627772971840101e-03 1.0504918454891009e-02 -9.6049906395799505e-03 1.8417402692564276e-03 -5.2398462883720236e-03 1.6261939560945537e-03 2.8019633553069655e-03 -1.3841525853681300e-02 1.2433909426641101e-02 -7.2575838260333560e-03 -9.2553905915251011e-04 1.2503067948517739e-03 -1.1389377362965775e-02 3.1160509392716057e-02 -7.8997918795638885e-03 4.8341881279136897e-03 4.0662350829250831e-03 1.2340633163783660e-02 -1.3724596045936677e-02 7.8882520266404018e-03 -1.4279779245392058e-02 -1.3586504043362351e-02 -5.8812809106892593e-03 -1.4750693797347388e-02 1.2397629050172198e-02 -1.0222950477638120e-02 2.1436321243760676e-02 1.2411733472659220e-02 2.4012451705218351e-03 1.1869519062695618e-02 -6.2442094428756239e-03 9.9250729346443758e-03 -2.5883338564554974e-02 -1.1245361649706753e-02 -2.7678194684043877e-04 -2.6741644670811839e-02 1.5157120531136287e-02 -7.8997918795638868e-03 3.6008982807866304e-02 903 904 905 948 949 950 960 961 962 915 916 917 906 907 908 951 952 953 963 964 965 918 919 920 2.9067148431471297e-02 -5.0691235802623386e-04 -3.8468441963099471e-04 -1.0282427210815933e-02 -8.1317548649207632e-03 -1.3098337935213358e-02 -9.3928994084548530e-03 -4.4572291782790530e-03 -5.9371562850666975e-03 3.9778688074290974e-03 -7.6010098970820687e-05 -3.7963868561040142e-04 4.2642167850609298e-03 7.7618699725336684e-03 1.2361503932989367e-02 -8.2157032355320431e-03 -1.7646234304754554e-04 1.0157841837535565e-03 -6.2684476282145827e-03 4.5774548758223404e-04 8.3422779461694353e-04 -3.1497565409439108e-03 5.1287533831285148e-03 5.5883014141615882e-03 -5.0691235802623408e-04 4.1673584986632303e-02 1.9430368773235982e-02 -8.4824217818313015e-03 -1.3353293037030912e-03 6.3415330943774944e-04 -1.1977286607816438e-02 -2.1874274765386219e-02 -1.2190054796003673e-02 1.5406941057733743e-04 -6.0764678888255924e-03 3.1271449596944551e-03 7.3991666574818472e-03 1.7361004030446471e-02 1.3597605032212053e-02 2.5531569784480179e-04 -6.4951565040668622e-04 -1.1531228145237700e-02 7.8693502838766993e-04 -1.8224161680516927e-02 -1.7713985788971424e-02 1.2371133953382315e-02 -1.0874839728240264e-02 4.6459966556325616e-03 -3.8468441963099417e-04 1.9430368773235982e-02 5.9091527503449280e-02 -1.3745012266374734e-02 1.1597899736672259e-03 -2.9708911622263318e-02 -1.7723691715681066e-02 -1.6681168240225096e-02 -2.3728423001058124e-02 -5.7999310403876502e-04 4.1997265857528603e-03 3.3655820106773413e-02 1.2415386539084762e-02 1.3092080725256545e-02 2.0360013837362998e-02 1.2256782043293267e-03 4.2096395618287557e-03 -4.0781188068603848e-02 1.3650288335359498e-03 -1.8353424604079540e-02 -3.3327793704639501e-02 1.7427287928775514e-02 -7.0570127754367371e-03 1.4438954948979087e-02 -1.0282427210815934e-02 -8.4824217818313015e-03 -1.3745012266374730e-02 4.9629309609660388e-02 -1.3097623927859854e-02 1.6731842732795661e-02 2.6324971464615255e-02 3.3341462642319888e-03 1.3639401259242248e-02 -9.4994599991249460e-03 8.7200328490546729e-03 -2.0070891479746868e-02 -3.1529853901580668e-02 -8.6521333665453472e-03 -1.4586622120432036e-02 5.1852725760919965e-03 -6.3865253240925398e-03 1.5689600635504709e-02 -1.8883851748720275e-03 1.2985348737010126e-02 1.8004109594554570e-02 -2.7939427363974059e-02 1.1579176550032263e-02 -1.5662428355543549e-02 -8.1317548649207632e-03 -1.3353293037030930e-03 1.1597899736672252e-03 -1.3097623927859854e-02 3.3004008078733042e-02 -9.0106833385805753e-03 7.6817984249497712e-04 -5.6379504760079571e-03 1.8386765632095855e-03 3.5130378610170048e-03 -1.5946218641252594e-02 1.4329018432686585e-02 4.6245841182786084e-03 -4.0324428377317345e-04 2.5260683783304644e-03 -4.9667563898633969e-03 1.2919906760377424e-02 -1.2176044519992144e-02 5.1078964345037357e-03 -9.9934404589813973e-03 -7.5302605794660728e-03 1.2182436926349686e-02 -1.2607731675392253e-02 8.8634350901449308e-03 -1.3098337935213360e-02 6.3415330943774684e-04 -2.9708911622263325e-02 1.6731842732795661e-02 -9.0106833385805753e-03 3.7544939714868171e-02 1.3983372637075331e-02 2.7201743784457041e-03 1.3486834214136432e-02 -6.9062166620812429e-03 1.0493859346936979e-02 -2.8914020938474717e-02 -1.4923614283415425e-02 -6.0696370339963172e-03 -1.7360456394464860e-02 1.3002751785455367e-02 -1.1061421400783625e-02 2.5518986022975650e-02 5.7133849959126503e-03 4.4825640784412740e-03 1.5968871870902197e-02 -1.4503183270528982e-02 7.8109906600988170e-03 -1.6536242867679529e-02 -9.3928994084548530e-03 -1.1977286607816438e-02 -1.7723691715681066e-02 2.6324971464615262e-02 7.6817984249497712e-04 1.3983372637075331e-02 4.8942664140425855e-02 1.7043914232664374e-02 1.3443195761922022e-02 -9.8832363110695331e-03 5.6980128187511837e-03 -1.4996184492723899e-02 -2.7472276149806428e-02 -1.5341286655780492e-02 -1.2941324778009527e-02 -1.6433591845218677e-03 -9.2734043129640183e-03 1.9919087511669091e-02 4.4708131238451430e-03 8.8246913319917995e-03 1.3911178554761910e-02 -3.1346677675033581e-02 4.2571793506586157e-03 -1.5595633479013861e-02 -4.4572291782790522e-03 -2.1874274765386219e-02 -1.6681168240225096e-02 3.3341462642319892e-03 -5.6379504760079571e-03 2.7201743784457050e-03 1.7043914232664374e-02 3.8379593255246675e-02 9.7687982289066215e-03 5.4904907406588127e-03 -1.3064252639759077e-03 -7.1498547277108263e-03 -1.5599747531946061e-02 -1.7750925047537714e-02 -9.6734938272468821e-03 -3.7467192700162723e-03 -9.6295450425373727e-03 1.3373793939594019e-02 6.7785027453561107e-03 1.8201602806741136e-02 1.4307230833306820e-02 -8.8433580026698998e-03 -3.8207546654264366e-04 -6.6654805850703590e-03 -5.9371562850667001e-03 -1.2190054796003673e-02 -2.3728423001058124e-02 1.3639401259242248e-02 1.8386765632095855e-03 1.3486834214136432e-02 1.3443195761922022e-02 9.7687982289066215e-03 3.3782958587329361e-02 -1.4130422891188033e-02 -6.6153829097118418e-03 -2.7424448989438740e-02 -1.1520873205378646e-02 -8.4794683552776983e-03 -1.3365391471906593e-02 6.6972082933206400e-03 6.3268504135491333e-04 1.3942873531949462e-02 1.1410129790280192e-02 1.3023913502688274e-02 2.0226805612135215e-02 -1.3601482723131719e-02 2.0208327248338234e-03 -1.6921208483147016e-02 3.9778688074290983e-03 1.5406941057733743e-04 -5.7999310403876502e-04 -9.4994599991249477e-03 3.5130378610170048e-03 -6.9062166620812429e-03 -9.8832363110695348e-03 5.4904907406588127e-03 -1.4130422891188035e-02 2.8994940002719290e-02 3.2826623370748101e-04 -2.4250429156031056e-04 -3.2106771162894480e-03 -3.9040209785908037e-03 6.4160926766958799e-03 -6.3219945901773315e-03 -1.7410735210529431e-04 6.5280243089834778e-04 -8.1038062896009282e-03 1.5118642717414470e-04 9.8527325965618983e-04 4.0463654961138042e-03 -5.5589223424386859e-03 1.3804968581617935e-02 -7.6010098970820416e-05 -6.0764678888255890e-03 4.1997265857528637e-03 8.7200328490546729e-03 -1.5946218641252594e-02 1.0493859346936977e-02 5.6980128187511837e-03 -1.3064252639759077e-03 -6.6153829097118453e-03 3.2826623370748096e-04 3.5315754146764113e-02 -1.5163082792556532e-02 -8.9330471614397170e-03 -1.0739495813571268e-02 2.6565968843143785e-04 -2.6281518179507163e-04 -1.2384006157815819e-02 1.3956386118928282e-02 -1.3275034185267751e-04 -5.0081083604380078e-04 4.1779125793865637e-03 -5.3416891174550511e-03 1.1637670454720871e-02 -1.1315078617167745e-02 -3.7963868561040098e-04 3.1271449596944564e-03 3.3655820106773413e-02 -2.0070891479746868e-02 1.4329018432686585e-02 -2.8914020938474717e-02 -1.4996184492723897e-02 -7.1498547277108263e-03 -2.7424448989438743e-02 -2.4250429156030958e-04 -1.5163082792556536e-02 6.5597629371583865e-02 1.9190530918348887e-02 1.2771667398253006e-02 1.2737982543109412e-02 8.8702837787154134e-04 1.4565480949385038e-02 -3.9658450669756574e-02 1.6413061943359990e-03 -1.1658304293108592e-02 -4.0536584383498206e-02 1.3970353459085049e-02 -1.0822069926643144e-02 2.4542072959701546e-02 4.2642167850609281e-03 7.3991666574818472e-03 1.2415386539084762e-02 -3.1529853901580675e-02 4.6245841182786084e-03 -1.4923614283415425e-02 -2.7472276149806428e-02 -1.5599747531946061e-02 -1.1520873205378646e-02 -3.2106771162894480e-03 -8.9330471614397170e-03 1.9190530918348887e-02 5.1409619620914289e-02 1.6823473323718762e-02 1.4411313069090520e-02 -1.0519104544841413e-02 6.1761463916520142e-03 -1.5838238775094039e-02 -8.7740727804043288e-03 -1.2464218144951234e-02 -1.7920356651444102e-02 2.5832148086947077e-02 1.9736423472057792e-03 1.4185852388808040e-02 7.7618699725336667e-03 1.7361004030446471e-02 1.3092080725256545e-02 -8.6521333665453472e-03 -4.0324428377317366e-04 -6.0696370339963180e-03 -1.5341286655780492e-02 -1.7750925047537714e-02 -8.4794683552777000e-03 -3.9040209785908028e-03 -1.0739495813571269e-02 1.2771667398253006e-02 1.6823473323718759e-02 4.0468339278675158e-02 1.0213478879786585e-02 5.2237746379069031e-03 -1.8419346891326860e-03 -7.7487811223136104e-03 -4.1659160039515183e-03 -2.1585606013577469e-02 -1.6552213546621505e-02 2.2542390707088302e-03 -5.5081374615293102e-03 2.7728730549129981e-03 1.2361503932989367e-02 1.3597605032212055e-02 2.0360013837362995e-02 -1.4586622120432035e-02 2.5260683783304644e-03 -1.7360456394464860e-02 -1.2941324778009527e-02 -9.6734938272468821e-03 -1.3365391471906591e-02 6.4160926766958790e-03 2.6565968843143741e-04 1.2737982543109410e-02 1.4411313069090520e-02 1.0213478879786585e-02 3.7541519446038847e-02 -1.3865567430673204e-02 -5.5581068867754423e-03 -2.9356305168091068e-02 -6.0652215130884675e-03 -1.3105060583360072e-02 -2.4459700735472073e-02 1.4269826163427467e-02 1.7338493186218554e-03 1.3902337943423335e-02 -8.2157032355320431e-03 2.5531569784480185e-04 1.2256782043293256e-03 5.1852725760919965e-03 -4.9667563898633969e-03 1.3002751785455369e-02 -1.6433591845218685e-03 -3.7467192700162718e-03 6.6972082933206391e-03 -6.3219945901773324e-03 -2.6281518179507174e-04 8.8702837787154058e-04 -1.0519104544841413e-02 5.2237746379069040e-03 -1.3865567430673206e-02 2.5355374833614865e-02 3.0088877159432063e-04 -2.2820050535354692e-04 5.2563337231870981e-03 -1.0300116570147991e-05 -5.4076705850487818e-04 -9.0968195778213020e-03 3.2066118508988616e-03 -7.1781316664452479e-03 -1.7646234304754556e-04 -6.4951565040668774e-04 4.2096395618287548e-03 -6.3865253240925407e-03 1.2919906760377424e-02 -1.1061421400783623e-02 -9.2734043129640183e-03 -9.6295450425373727e-03 6.3268504135491354e-04 -1.7410735210529404e-04 -1.2384006157815819e-02 1.4565480949385040e-02 6.1761463916520142e-03 -1.8419346891326857e-03 -5.5581068867754432e-03 3.0088877159432063e-04 3.1932294389165422e-02 -1.5720819314247427e-02 2.7613251723654402e-04 -4.9389435165378718e-03 1.7266237446489654e-03 9.2573316517265136e-03 -1.5408256093112409e-02 1.1205918304588820e-02 1.0157841837535545e-03 -1.1531228145237701e-02 -4.0781188068603848e-02 1.5689600635504702e-02 -1.2176044519992147e-02 2.5518986022975653e-02 1.9919087511669091e-02 1.3373793939594019e-02 1.3942873531949462e-02 6.5280243089834702e-04 1.3956386118928282e-02 -3.9658450669756574e-02 -1.5838238775094039e-02 -7.7487811223136104e-03 -2.9356305168091075e-02 -2.2820050535354668e-04 -1.5720819314247427e-02 6.3123839746981436e-02 -7.7980617134469881e-04 6.0830896008968573e-03 3.6692567994894169e-02 -2.0431029310033412e-02 1.3763603442371727e-02 -2.9482323390349226e-02 -6.2684476282145827e-03 7.8693502838766960e-04 1.3650288335359494e-03 -1.8883851748720277e-03 5.1078964345037366e-03 5.7133849959126503e-03 4.4708131238451430e-03 6.7785027453561107e-03 1.1410129790280192e-02 -8.1038062896009282e-03 -1.3275034185267719e-04 1.6413061943359997e-03 -8.7740727804043305e-03 -4.1659160039515183e-03 -6.0652215130884684e-03 5.2563337231870981e-03 2.7613251723654397e-04 -7.7980617134469827e-04 2.4977904070510495e-02 -7.0561659571194109e-04 -8.1122702214456990e-04 -9.6703390444508701e-03 -7.9451837839679233e-03 -1.2473595107487054e-02 4.5774548758223410e-04 -1.8224161680516927e-02 -1.8353424604079540e-02 1.2985348737010126e-02 -9.9934404589813973e-03 4.4825640784412731e-03 8.8246913319917995e-03 1.8201602806741140e-02 1.3023913502688274e-02 1.5118642717414500e-04 -5.0081083604380100e-04 -1.1658304293108591e-02 -1.2464218144951236e-02 -2.1585606013577469e-02 -1.3105060583360072e-02 -1.0300116570147774e-05 -4.9389435165378727e-03 6.0830896008968582e-03 -7.0561659571194099e-04 3.8124268883739938e-02 2.0110795417278726e-02 -9.2388371265249725e-03 -1.0829091848236060e-03 -5.8357311875692963e-04 8.3422779461694331e-04 -1.7713985788971428e-02 -3.3327793704639501e-02 1.8004109594554570e-02 -7.5302605794660745e-03 1.5968871870902197e-02 1.3911178554761910e-02 1.4307230833306817e-02 2.0226805612135211e-02 9.8527325965618940e-04 4.1779125793865645e-03 -4.0536584383498206e-02 -1.7920356651444102e-02 -1.6552213546621505e-02 -2.4459700735472080e-02 -5.4076705850487894e-04 1.7266237446489645e-03 3.6692567994894176e-02 -8.1122702214457055e-04 2.0110795417278719e-02 5.5624986197107436e-02 -1.4462438471496057e-02 1.4738973404379383e-03 -3.0189152851429243e-02 -3.1497565409439121e-03 1.2371133953382315e-02 1.7427287928775525e-02 -2.7939427363974062e-02 1.2182436926349684e-02 -1.4503183270528982e-02 -3.1346677675033581e-02 -8.8433580026698998e-03 -1.3601482723131719e-02 4.0463654961138042e-03 -5.3416891174550511e-03 1.3970353459085049e-02 2.5832148086947077e-02 2.2542390707088280e-03 1.4269826163427467e-02 -9.0968195778213020e-03 9.2573316517265136e-03 -2.0431029310033415e-02 -9.6703390444508701e-03 -9.2388371265249725e-03 -1.4462438471496059e-02 5.1324506619162859e-02 -1.2641257355517424e-02 1.7330666223902138e-02 5.1287533831285148e-03 -1.0874839728240264e-02 -7.0570127754367379e-03 1.1579176550032259e-02 -1.2607731675392255e-02 7.8109906600988170e-03 4.2571793506586139e-03 -3.8207546654264388e-04 2.0208327248338242e-03 -5.5589223424386850e-03 1.1637670454720868e-02 -1.0822069926643144e-02 1.9736423472057787e-03 -5.5081374615293093e-03 1.7338493186218546e-03 3.2066118508988612e-03 -1.5408256093112412e-02 1.3763603442371725e-02 -7.9451837839679233e-03 -1.0829091848236060e-03 1.4738973404379370e-03 -1.2641257355517421e-02 3.4226279154919617e-02 -8.9240907842842807e-03 5.5883014141615900e-03 4.6459966556325633e-03 1.4438954948979087e-02 -1.5662428355543549e-02 8.8634350901449308e-03 -1.6536242867679529e-02 -1.5595633479013861e-02 -6.6654805850703581e-03 -1.6921208483147016e-02 1.3804968581617935e-02 -1.1315078617167745e-02 2.4542072959701546e-02 1.4185852388808040e-02 2.7728730549129981e-03 1.3902337943423338e-02 -7.1781316664452470e-03 1.1205918304588818e-02 -2.9482323390349226e-02 -1.2473595107487056e-02 -5.8357311875692659e-04 -3.0189152851429247e-02 1.7330666223902141e-02 -8.9240907842842807e-03 4.0245561740501042e-02 870 871 872 915 916 917 927 928 929 882 883 884 873 874 875 918 919 920 930 931 932 885 886 887 2.4725263855849899e-02 -1.2568467142645889e-03 -1.1666830285078796e-03 -7.7227519126044407e-03 -8.9129736583115522e-03 -9.7003045604623032e-03 -7.0780203283166351e-03 -4.0255398186476148e-03 -4.1263666067663258e-03 3.5754711708630847e-03 -1.4975119486522362e-04 -1.0280232726916020e-03 2.4643423790749754e-03 7.7674869390981201e-03 9.1393787435407985e-03 -7.2226068197668450e-03 -1.0499680651074577e-04 1.8010447213732486e-03 -5.4043584240658360e-03 1.2501243742580217e-03 1.4145872433983515e-03 -3.3373399210342050e-03 5.4324968792435844e-03 3.6663667601157142e-03 -1.2568467142645889e-03 4.1027767469354680e-02 1.8234473945340397e-02 -9.6771727274577082e-03 -2.4867827582276229e-03 -4.2356664621936999e-03 -1.2278630561488596e-02 -2.3751688235060381e-02 -9.8379472287662660e-03 2.1472211104095441e-05 -3.3572190709392370e-03 8.2507413106281194e-03 7.7411383635900485e-03 1.9449463954515474e-02 1.1915203619181632e-02 6.4355922375784063e-04 -2.6067685165967868e-03 -1.5756122468625136e-02 1.6871176533979149e-03 -2.0709118419528307e-02 -1.6367281645020604e-02 1.3119362551360991e-02 -7.5656544235178057e-03 7.7965989294555499e-03 -1.1666830285078813e-03 1.8234473945340401e-02 4.4936826097767717e-02 -1.0738249552112795e-02 -3.4057563512702861e-03 -2.5090406588103249e-02 -1.3285990733557951e-02 -1.4784284589435917e-02 -1.5484087425487510e-02 -1.3789094611390616e-03 9.0301829725141294e-03 2.7937028245374498e-02 9.7285518992887930e-03 1.1559209805047845e-02 1.2927910847659223e-02 1.6376780146713820e-03 -1.8633308206987469e-03 -3.4353911455266672e-02 1.9599675124471199e-03 -1.7110242726976158e-02 -2.3411419223348287e-02 1.3243635348910389e-02 -1.6602522345212493e-03 1.2538059501404278e-02 -7.7227519126044373e-03 -9.6771727274577082e-03 -1.0738249552112798e-02 4.3607510185200073e-02 -7.6455360346925115e-03 1.6541659638253766e-02 2.3097936189838204e-02 6.3775349175824517e-03 1.0796922894381774e-02 -7.7786020209828950e-03 4.7882601922522262e-03 -1.9255327962429326e-02 -2.7838788178213517e-02 -1.1061602288902376e-02 -1.0973097695596816e-02 3.8472267206351280e-03 -3.2944294822933344e-03 1.5296057920185077e-02 -2.3438571441583124e-03 1.3958321438166310e-02 1.3707877652588478e-02 -2.4868673839714247e-02 6.5546239853449357e-03 -1.5375842895270157e-02 -8.9129736583115522e-03 -2.4867827582276238e-03 -3.4057563512702857e-03 -7.6455360346925124e-03 2.4661339223169824e-02 -5.7335323480522133e-03 4.0110795588921520e-03 -3.2256504174324745e-03 5.0148786367463860e-03 1.9881716295310700e-03 -1.0290547426823903e-02 8.9578765387178134e-03 4.4956295366248397e-04 -1.7983427308648412e-03 -9.7438395504598858e-04 -2.4653231058250390e-03 7.6214640086025636e-03 -7.5855572350090536e-03 5.3958519502975135e-03 -6.9166303731485529e-03 -1.9587621474218340e-03 7.1791667064458791e-03 -7.5648495252749913e-03 5.6852368613351766e-03 -9.7003045604623032e-03 -4.2356664621936999e-03 -2.5090406588103249e-02 1.6541659638253766e-02 -5.7335323480522133e-03 3.4514185378992070e-02 1.1519977089687486e-02 5.8968011123706355e-03 1.0012193689197485e-02 -6.4365049823488611e-03 6.5097536378106663e-03 -2.8762270190545253e-02 -1.3384345161011793e-02 -8.5066965705399185e-03 -1.3674415279306122e-02 1.2072753265037570e-02 -6.5533178451964557e-03 2.5461624679397041e-02 3.7537007089516439e-03 7.7634446737996649e-03 1.3961813552097944e-02 -1.4366935998107509e-02 4.8592138020013180e-03 -1.6422725241729910e-02 -7.0780203283166351e-03 -1.2278630561488596e-02 -1.3285990733557951e-02 2.3097936189838204e-02 4.0110795588921529e-03 1.1519977089687486e-02 4.2843176335679391e-02 1.7588249709488787e-02 8.1758834370255842e-03 -7.5917992427005695e-03 3.0102982166852980e-03 -1.3432070018306642e-02 -2.3919535731417481e-02 -1.5898240887652106e-02 -8.2730124491017850e-03 -2.3529024532606474e-03 -5.1279711735452184e-03 1.8687839576685111e-02 2.5459131605239040e-03 8.7473137062490693e-03 1.0206485588675136e-02 -2.7544767930346162e-02 -5.2098568629394644e-05 -1.3599112491106940e-02 -4.0255398186476157e-03 -2.3751688235060377e-02 -1.4784284589435920e-02 6.3775349175824543e-03 -3.2256504174324727e-03 5.8968011123706346e-03 1.7588249709488791e-02 3.8842751643158958e-02 7.2103832690574906e-03 2.9435655170893644e-03 -2.7042069978151406e-03 -1.0606581482806098e-02 -1.6212413694245371e-02 -2.0068810167619112e-02 -7.4624780210894798e-03 -2.5461456193294888e-03 -6.8754629166526771e-03 1.6300506413629040e-02 6.8486516229724990e-03 2.0159463482395213e-02 1.2321816169540062e-02 -1.0973902634910626e-02 -2.3763963909744050e-03 -8.8761628712657331e-03 -4.1263666067663258e-03 -9.8379472287662660e-03 -1.5484087425487512e-02 1.0796922894381774e-02 5.0148786367463860e-03 1.0012193689197483e-02 8.1758834370255860e-03 7.2103832690574906e-03 2.6769588115265898e-02 -1.3170364539227422e-02 -1.0316162021953042e-02 -2.0017807871030142e-02 -6.9140427509127439e-03 -6.1234164892238633e-03 -8.8179025969697747e-03 6.3473084190153488e-03 4.2962885974402697e-03 8.2629753891043517e-03 8.7917385573067584e-03 1.1083152832320049e-02 1.2507532500210273e-02 -9.9010794108229730e-03 -1.3271775956210311e-03 -1.3232491800290579e-02 3.5754711708630856e-03 2.1472211104095278e-05 -1.3789094611390616e-03 -7.7786020209828933e-03 1.9881716295310700e-03 -6.4365049823488611e-03 -7.5917992427005703e-03 2.9435655170893635e-03 -1.3170364539227424e-02 2.6620121653317952e-02 4.2513603316510955e-04 -9.7357345912440054e-04 -3.9140593369284384e-03 -2.7873220180238789e-03 6.0723350118599634e-03 -5.9192664523511594e-03 -1.8181211412560030e-04 1.1691986501980831e-03 -7.5554894062371310e-03 5.1149783043877403e-04 1.4771955642709630e-03 2.5636236350191589e-03 -2.9207090891789334e-03 1.3240623215510738e-02 -1.4975119486522362e-04 -3.3572190709392357e-03 9.0301829725141260e-03 4.7882601922522245e-03 -1.0290547426823903e-02 6.5097536378106672e-03 3.0102982166852984e-03 -2.7042069978151402e-03 -1.0316162021953042e-02 4.2513603316510944e-04 2.8682174676315984e-02 -8.6937705041484886e-03 -5.2352711994232198e-03 -8.2662027813665447e-03 3.8368116509651458e-03 -2.1088394646404376e-04 -7.8480369856389395e-03 8.1721787792912344e-03 9.9942630690093249e-05 -2.7806156829169948e-03 -1.7096840017530842e-03 -2.7277307320402364e-03 6.5646542691847722e-03 -6.8293105127265573e-03 -1.0280232726916018e-03 8.2507413106281194e-03 2.7937028245374491e-02 -1.9255327962429330e-02 8.9578765387178134e-03 -2.8762270190545253e-02 -1.3432070018306640e-02 -1.0606581482806098e-02 -2.0017807871030146e-02 -9.7357345912440216e-04 -8.6937705041484886e-03 6.3580189558528816e-02 1.8126194170826053e-02 1.5628487937393354e-02 7.4267570760845293e-03 1.3024391426019646e-03 8.2536494315178597e-03 -3.9910433941344761e-02 2.5395394207949245e-03 -1.5622127076531333e-02 -3.4256222925691124e-02 1.2720821978329026e-02 -6.1682761547712196e-03 2.4002760048623437e-02 2.4643423790749754e-03 7.7411383635900468e-03 9.7285518992887947e-03 -2.7838788178213517e-02 4.4956295366248430e-04 -1.3384345161011793e-02 -2.3919535731417481e-02 -1.6212413694245368e-02 -6.9140427509127456e-03 -3.9140593369284393e-03 -5.2352711994232207e-03 1.8126194170826049e-02 4.5309326791695720e-02 1.7771624004311426e-02 9.3030703569351812e-03 -8.4161019490238374e-03 3.1357900132050454e-03 -1.4998345225816221e-02 -6.6755304715568195e-03 -1.2869033359457372e-02 -1.3409750912839984e-02 2.2990346496369399e-02 5.2186029183569627e-03 1.1548667623530719e-02 7.7674869390981201e-03 1.9449463954515474e-02 1.1559209805047842e-02 -1.1061602288902374e-02 -1.7983427308648414e-03 -8.5066965705399185e-03 -1.5898240887652106e-02 -2.0068810167619112e-02 -6.1234164892238624e-03 -2.7873220180238798e-03 -8.2662027813665447e-03 1.5628487937393354e-02 1.7771624004311429e-02 4.0731069686697610e-02 8.0572466679428578e-03 2.6660990605750071e-03 -3.4551022715645931e-03 -1.1766476883637333e-02 -3.7231660585919702e-03 -2.3882795968437297e-02 -1.4705461336033855e-02 5.2651212491857668e-03 -2.7092797213606936e-03 5.8571068690509128e-03 9.1393787435407967e-03 1.1915203619181632e-02 1.2927910847659223e-02 -1.0973097695596816e-02 -9.7438395504598901e-04 -1.3674415279306124e-02 -8.2730124491017850e-03 -7.4624780210894807e-03 -8.8179025969697747e-03 6.0723350118599634e-03 3.8368116509651471e-03 7.4267570760845293e-03 9.3030703569351829e-03 8.0572466679428596e-03 2.9889901343064341e-02 -1.2623387731541104e-02 -9.4770271678716340e-03 -2.2185340748581150e-02 -4.2977701770307514e-03 -1.0956360164892952e-02 -1.6332407445251503e-02 1.1652483940934509e-02 5.0609873708104217e-03 1.0765496803300453e-02 -7.2226068197668450e-03 6.4355922375784031e-04 1.6376780146713820e-03 3.8472267206351280e-03 -2.4653231058250386e-03 1.2072753265037574e-02 -2.3529024532606487e-03 -2.5461456193294888e-03 6.3473084190153505e-03 -5.9192664523511594e-03 -2.1088394646404373e-04 1.3024391426019652e-03 -8.4161019490238357e-03 2.6660990605750076e-03 -1.2623387731541104e-02 2.2725906580490209e-02 3.7855366744702983e-04 -7.9100227081306507e-04 4.9496811684755053e-03 -9.7332777503769967e-05 -1.1942027700812376e-03 -7.6119367951983565e-03 1.6314734973424648e-03 -6.7515860688908648e-03 -1.0499680651074574e-04 -2.6067685165967885e-03 -1.8633308206987486e-03 -3.2944294822933357e-03 7.6214640086025610e-03 -6.5533178451964548e-03 -5.1279711735452184e-03 -6.8754629166526780e-03 4.2962885974402697e-03 -1.8181211412560019e-04 -7.8480369856389395e-03 8.2536494315178597e-03 3.1357900132050463e-03 -3.4551022715645931e-03 -9.4770271678716340e-03 3.7855366744702978e-04 2.4689363122060930e-02 -8.7439980355778855e-03 1.7859837221643668e-04 -1.7692224547744134e-03 7.4422277828133758e-03 5.0162675236063844e-03 -9.7562339854360830e-03 6.6455080575732184e-03 1.8010447213732484e-03 -1.5756122468625136e-02 -3.4353911455266672e-02 1.5296057920185079e-02 -7.5855572350090545e-03 2.5461624679397044e-02 1.8687839576685111e-02 1.6300506413629044e-02 8.2629753891043534e-03 1.1691986501980826e-03 8.1721787792912344e-03 -3.9910433941344761e-02 -1.4998345225816225e-02 -1.1766476883637331e-02 -2.2185340748581146e-02 -7.9100227081306594e-04 -8.7439980355778855e-03 6.1286914220919142e-02 -1.6460224614655826e-03 1.1129304451729018e-02 3.0800632494486849e-02 -1.9518770910346640e-02 8.2501649782001068e-03 -2.9362460638714796e-02 -5.4043584240658351e-03 1.6871176533979149e-03 1.9599675124471199e-03 -2.3438571441583124e-03 5.3958519502975135e-03 3.7537007089516439e-03 2.5459131605239035e-03 6.8486516229724998e-03 8.7917385573067566e-03 -7.5554894062371310e-03 9.9942630690093249e-05 2.5395394207949240e-03 -6.6755304715568186e-03 -3.7231660585919694e-03 -4.2977701770307523e-03 4.9496811684755053e-03 1.7859837221643647e-04 -1.6460224614655830e-03 2.2316161861432995e-02 -1.5781094134485838e-03 -1.5860416793417906e-03 -7.8325207444143070e-03 -8.9088867575339049e-03 -9.5151118816623227e-03 1.2501243742580213e-03 -2.0709118419528310e-02 -1.7110242726976158e-02 1.3958321438166310e-02 -6.9166303731485537e-03 7.7634446737996632e-03 8.7473137062490693e-03 2.0159463482395213e-02 1.1083152832320049e-02 5.1149783043877425e-04 -2.7806156829169948e-03 -1.5622127076531329e-02 -1.2869033359457372e-02 -2.3882795968437297e-02 -1.0956360164892952e-02 -9.7332777503770129e-05 -1.7692224547744130e-03 1.1129304451729017e-02 -1.5781094134485836e-03 3.9195784044890894e-02 1.8722518821389811e-02 -9.9227817987024413e-03 -3.2968646284805359e-03 -5.0096908108380953e-03 1.4145872433983507e-03 -1.6367281645020604e-02 -2.3411419223348287e-02 1.3707877652588478e-02 -1.9587621474218345e-03 1.3961813552097942e-02 1.0206485588675139e-02 1.2321816169540060e-02 1.2507532500210271e-02 1.4771955642709630e-03 -1.7096840017530846e-03 -3.4256222925691124e-02 -1.3409750912839984e-02 -1.4705461336033851e-02 -1.6332407445251503e-02 -1.1942027700812376e-03 7.4422277828133758e-03 3.0800632494486849e-02 -1.5860416793417910e-03 1.8722518821389807e-02 4.2709787758997780e-02 -1.0616150686669906e-02 -3.7453736435138722e-03 -2.5979716711501920e-02 -3.3373399210342054e-03 1.3119362551360989e-02 1.3243635348910389e-02 -2.4868673839714240e-02 7.1791667064458791e-03 -1.4366935998107509e-02 -2.7544767930346166e-02 -1.0973902634910628e-02 -9.9010794108229713e-03 2.5636236350191624e-03 -2.7277307320402360e-03 1.2720821978329029e-02 2.2990346496369399e-02 5.2651212491857668e-03 1.1652483940934509e-02 -7.6119367951983565e-03 5.0162675236063844e-03 -1.9518770910346643e-02 -7.8325207444143070e-03 -9.9227817987024413e-03 -1.0616150686669906e-02 4.5641269099318697e-02 -6.9555028649457111e-03 1.6785995737773101e-02 5.4324968792435844e-03 -7.5656544235178057e-03 -1.6602522345212497e-03 6.5546239853449357e-03 -7.5648495252749913e-03 4.8592138020013180e-03 -5.2098568629394644e-05 -2.3763963909744054e-03 -1.3271775956210314e-03 -2.9207090891789334e-03 6.5646542691847731e-03 -6.1682761547712196e-03 5.2186029183569627e-03 -2.7092797213606932e-03 5.0609873708104209e-03 1.6314734973424648e-03 -9.7562339854360830e-03 8.2501649782001051e-03 -8.9088867575339049e-03 -3.2968646284805359e-03 -3.7453736435138713e-03 -6.9555028649457111e-03 2.6704624405859738e-02 -5.2692865225844729e-03 3.6663667601157138e-03 7.7965989294555525e-03 1.2538059501404278e-02 -1.5375842895270157e-02 5.6852368613351766e-03 -1.6422725241729910e-02 -1.3599112491106936e-02 -8.8761628712657314e-03 -1.3232491800290579e-02 1.3240623215510738e-02 -6.8293105127265590e-03 2.4002760048623437e-02 1.1548667623530717e-02 5.8571068690509128e-03 1.0765496803300452e-02 -6.7515860688908648e-03 6.6455080575732184e-03 -2.9362460638714800e-02 -9.5151118816623227e-03 -5.0096908108380935e-03 -2.5979716711501920e-02 1.6785995737773101e-02 -5.2692865225844720e-03 3.7691078038909032e-02 915 916 917 960 961 962 972 973 974 927 928 929 918 919 920 963 964 965 975 976 977 930 931 932 2.7873706681055675e-02 -1.4187355673585015e-03 -1.3066237794595410e-03 -8.8959175981801232e-03 -1.0036378792611905e-02 -1.0916834262011817e-02 -7.9971337750059050e-03 -4.4762447565076420e-03 -4.6383162351635405e-03 4.0806780922593216e-03 -1.7776456582642869e-04 -1.1643076754702837e-03 2.7612580109347071e-03 8.6949894891091232e-03 1.0225582473617262e-02 -8.0413866360458802e-03 -1.1572777796162729e-04 2.0933312927085977e-03 -6.0174823634829904e-03 1.4456735594463638e-03 1.6239293076068058e-03 -3.7637224115348073e-03 6.0841884117106126e-03 4.0832388781725185e-03 -1.4187355673585002e-03 4.5979568129254342e-02 2.0290451189165816e-02 -1.0712414682853329e-02 -3.1165114859483581e-03 -4.6491823610086275e-03 -1.3738804788839938e-02 -2.6576589732229289e-02 -1.1013688480288188e-02 -1.2290656843844865e-05 -3.6588850001123998e-03 9.0299987470807593e-03 8.5803479036422135e-03 2.1784425473295607e-02 1.3287173719223134e-02 7.2886832437619987e-04 -2.8240270450422974e-03 -1.7468430826280700e-02 1.9099703852728991e-03 -2.3092415619048547e-02 -1.8165743709554021e-02 1.4663059082604306e-02 -8.4955647201690760e-03 8.6894217216618337e-03 -1.3066237794595393e-03 2.0290451189165809e-02 5.0361885279620718e-02 -1.1922139266221500e-02 -3.9766945664796299e-03 -2.8348615740526970e-02 -1.4820310438003350e-02 -1.6458408635034484e-02 -1.7434073939774510e-02 -1.5965830218395538e-03 1.0179566641668263e-02 3.1168096022042881e-02 1.0832170944995735e-02 1.2958665054036447e-02 1.4468353864403682e-02 1.8042916859828436e-03 -2.0135288978229142e-03 -3.8208501119396374e-02 2.2168657446658556e-03 -1.9093952307076605e-02 -2.5993569481101028e-02 1.4792328129879522e-02 -1.8860984784569170e-03 1.3986425114731599e-02 -8.8959175981801249e-03 -1.0712414682853329e-02 -1.1922139266221501e-02 4.9230731327907055e-02 -8.5161975227075054e-03 1.8586559009333915e-02 2.6033065939724678e-02 7.0163744944961824e-03 1.2149980408189633e-02 -8.7397575893037264e-03 5.3624539993592599e-03 -2.1474416240963200e-02 -3.1279386162359694e-02 -1.2457073968385749e-02 -1.2352398621181539e-02 4.2797347639010530e-03 -3.7504244865079607e-03 1.7014319777185268e-02 -2.7159902727167005e-03 1.5656356146288831e-02 1.5261058194577034e-02 -2.7912480408972543e-02 7.4009260203102912e-03 -1.7262963260919618e-02 -1.0036378792611904e-02 -3.1165114859483581e-03 -3.9766945664796282e-03 -8.5161975227075037e-03 2.7921741997016549e-02 -6.3830704399331587e-03 4.6112597295700332e-03 -3.4430833319294930e-03 5.7049269808150203e-03 2.2007050180932581e-03 -1.1580985811697921e-02 9.9831915169651311e-03 4.6701393515327292e-04 -2.1157499853463185e-03 -1.1404146781626352e-03 -2.7916489388419611e-03 8.5594933867951754e-03 -8.4118430927863606e-03 6.0608402239888289e-03 -7.7338679255924032e-03 -2.1171905839645327e-03 8.0044063473559777e-03 -8.4910368432972380e-03 6.3410948635461706e-03 -1.0916834262011815e-02 -4.6491823610086249e-03 -2.8348615740526963e-02 1.8586559009333911e-02 -6.3830704399331587e-03 3.9068600721198395e-02 1.2935469097477125e-02 6.5119052282560218e-03 1.1359741573465497e-02 -7.1788377461838053e-03 7.2397769396529248e-03 -3.2259001969160303e-02 -1.4977327917481352e-02 -9.5562955032817264e-03 -1.5408561779138246e-02 1.3518449044182231e-02 -7.3799954766907809e-03 2.8476893520847493e-02 4.1427883938480467e-03 8.7351983678222722e-03 1.5540878886089668e-02 -1.6110265619164343e-02 5.4816632451830851e-03 -1.8429935212775549e-02 -7.9971337750059050e-03 -1.3738804788839935e-02 -1.4820310438003352e-02 2.6033065939724678e-02 4.6112597295700332e-03 1.2935469097477125e-02 4.8257964791003430e-02 1.9696845614484062e-02 9.2113583792811701e-03 -8.5394800912401564e-03 3.3449026183996955e-03 -1.4997877127931774e-02 -2.6858914220531181e-02 -1.7921006579415207e-02 -9.3027700238770255e-03 -2.6924259501225692e-03 -5.8233304081143503e-03 2.0894309028903105e-02 2.7116453021333847e-03 9.8444300839037983e-03 1.1396272786132729e-02 -3.0914721995961687e-02 -1.4296269988077427e-05 -1.5316451701981995e-02 -4.4762447565076420e-03 -2.6576589732229292e-02 -1.6458408635034481e-02 7.0163744944961833e-03 -3.4430833319294943e-03 6.5119052282560227e-03 1.9696845614484062e-02 4.3588580688406785e-02 8.0950419221788895e-03 3.3639973054433083e-03 -3.1410791132310987e-03 -1.1695669671763014e-02 -1.8087050059144901e-02 -2.2496992611041076e-02 -8.3397183890455678e-03 -2.8900683478535016e-03 -7.7845522445302313e-03 1.8119245452626678e-02 7.6253783006751423e-03 2.2473952835274077e-02 1.3691596611443108e-02 -1.2249232551592656e-02 -2.6202364907196582e-03 -9.9239925186616479e-03 -4.6383162351635414e-03 -1.1013688480288188e-02 -1.7434073939774510e-02 1.2149980408189634e-02 5.7049269808150211e-03 1.1359741573465493e-02 9.2113583792811701e-03 8.0950419221788895e-03 3.0197154809192092e-02 -1.4735017996223058e-02 -1.1588940474951018e-02 -2.2529655041714888e-02 -7.7615154678463937e-03 -6.9033456200610528e-03 -9.9113541366439521e-03 7.0859171090382035e-03 4.7481564306647251e-03 9.2283370229014634e-03 9.7680923495518136e-03 1.2401835547005096e-02 1.3929351060896211e-02 -1.1080498546827834e-02 -1.4439863053634619e-03 -1.4839501348321911e-02 4.0806780922593216e-03 -1.2290656843844756e-05 -1.5965830218395535e-03 -8.7397575893037264e-03 2.2007050180932589e-03 -7.1788377461838061e-03 -8.5394800912401512e-03 3.3639973054433083e-03 -1.4735017996223053e-02 2.9840874308154814e-02 4.9953183928723530e-04 -1.1673521598806959e-03 -4.4464267713555045e-03 -3.1638681356530758e-03 6.7630408206692883e-03 -6.5869717027583503e-03 -2.3623827694139459e-04 1.4235740570727189e-03 -8.3437056774301587e-03 6.1502139406928111e-04 1.7729718030987250e-03 2.7347894316737554e-03 -3.2668584874547667e-03 1.4718204243286379e-02 -1.7776456582642875e-04 -3.6588850001123985e-03 1.0179566641668265e-02 5.3624539993592599e-03 -1.1580985811697923e-02 7.2397769396529230e-03 3.3449026183996955e-03 -3.1410791132310979e-03 -1.1588940474951015e-02 4.9953183928723530e-04 3.2112071409464614e-02 -9.6906539030371594e-03 -5.8723857424732235e-03 -9.2699914493284130e-03 4.2962329110247423e-03 -2.3541092605849483e-04 -8.7655545444865115e-03 9.0920173683261326e-03 1.0886014534702707e-04 -2.9870950056346372e-03 -1.9164972254541160e-03 -3.0301873680350722e-03 7.2915195150263755e-03 -7.6115022572297731e-03 -1.1643076754702835e-03 9.0299987470807593e-03 3.1168096022042874e-02 -2.1474416240963200e-02 9.9831915169651328e-03 -3.2259001969160310e-02 -1.4997877127931776e-02 -1.1695669671763010e-02 -2.2529655041714884e-02 -1.1673521598806950e-03 -9.6906539030371611e-03 7.0963968708679465e-02 2.0238936191546490e-02 1.7485272364796588e-02 8.2835994222857489e-03 1.4533386422290980e-03 9.3331582174538390e-03 -4.4389852153411236e-02 2.8589095065164275e-03 -1.7456451446784614e-02 -3.7978929915431690e-02 1.4252768863953953e-02 -6.9888458247115513e-03 2.6741774926710038e-02 2.7612580109347062e-03 8.5803479036422117e-03 1.0832170944995735e-02 -3.1279386162359687e-02 4.6701393515327292e-04 -1.4977327917481352e-02 -2.6858914220531174e-02 -1.8087050059144901e-02 -7.7615154678463937e-03 -4.4464267713555036e-03 -5.8723857424732243e-03 2.0238936191546483e-02 5.0594469270469358e-02 1.9953423754873328e-02 1.0418409056299999e-02 -9.1812589067567594e-03 3.6293434194531208e-03 -1.6749520197574128e-02 -7.2767423861309632e-03 -1.4395446037284688e-02 -1.4968359792504422e-02 2.5687001165730042e-02 5.7247528257808669e-03 1.2967207182564080e-02 8.6949894891091214e-03 2.1784425473295607e-02 1.2958665054036447e-02 -1.2457073968385751e-02 -2.1157499853463185e-03 -9.5562955032817264e-03 -1.7921006579415207e-02 -2.2496992611041076e-02 -6.9033456200610520e-03 -3.1638681356530745e-03 -9.2699914493284130e-03 1.7485272364796585e-02 1.9953423754873332e-02 4.5551826690688968e-02 9.0347901928189752e-03 2.9986357856307765e-03 -3.5796469244888051e-03 -1.3229696607782816e-02 -4.1415995239944105e-03 -2.6668278376115268e-02 -1.6441394350520899e-02 6.0364991778352212e-03 -3.2055928176647009e-03 6.6520044699944865e-03 1.0225582473617262e-02 1.3287173719223134e-02 1.4468353864403682e-02 -1.2352398621181539e-02 -1.1404146781626358e-03 -1.5408561779138246e-02 -9.3027700238770255e-03 -8.3397183890455678e-03 -9.9113541366439521e-03 6.7630408206692883e-03 4.2962329110247423e-03 8.2835994222857489e-03 1.0418409056299999e-02 9.0347901928189735e-03 3.3292069303111904e-02 -1.4062959655801760e-02 -1.0486261970444902e-02 -2.4569806498751241e-02 -4.7341146133343687e-03 -1.2234705148488109e-02 -1.8102289289000206e-02 1.3045210563608146e-02 5.5829033630743555e-03 1.1947989113732306e-02 -8.0413866360458785e-03 7.2886832437619987e-04 1.8042916859828436e-03 4.2797347639010512e-03 -2.7916489388419615e-03 1.3518449044182229e-02 -2.6924259501225692e-03 -2.8900683478535003e-03 7.0859171090382035e-03 -6.5869717027583503e-03 -2.3541092605849472e-04 1.4533386422290982e-03 -9.1812589067567594e-03 2.9986357856307765e-03 -1.4062959655801758e-02 2.5204916738150895e-02 4.3429097694365731e-04 -9.2958476464785329e-04 5.3572731065492582e-03 -9.6622255598508271e-05 -1.3712382127762663e-03 -8.3398814129176466e-03 1.8519553814018298e-03 -7.4982138482064913e-03 -1.1572777796162764e-04 -2.8240270450422969e-03 -2.0135288978229142e-03 -3.7504244865079616e-03 8.5594933867951754e-03 -7.3799954766907792e-03 -5.8233304081143503e-03 -7.7845522445302304e-03 4.7481564306647251e-03 -2.3623827694139456e-04 -8.7655545444865115e-03 9.3331582174538390e-03 3.6293434194531204e-03 -3.5796469244888042e-03 -1.0486261970444902e-02 4.3429097694365753e-04 2.7477108019386815e-02 -9.8802379688536536e-03 1.8922800052406023e-04 -2.2506238027652364e-03 8.1561209252996123e-03 5.6728585526044980e-03 -1.0832196844868917e-02 7.5225887403940752e-03 2.0933312927085973e-03 -1.7468430826280697e-02 -3.8208501119396367e-02 1.7014319777185268e-02 -8.4118430927863606e-03 2.8476893520847493e-02 2.0894309028903105e-02 1.8119245452626682e-02 9.2283370229014634e-03 1.4235740570727193e-03 9.0920173683261361e-03 -4.4389852153411243e-02 -1.6749520197574128e-02 -1.3229696607782816e-02 -2.4569806498751234e-02 -9.2958476464785318e-04 -9.8802379688536536e-03 6.8070341649843935e-02 -1.9154023123493279e-03 1.2510877299929416e-02 3.4038458766991492e-02 -2.1831026881298392e-02 9.2680683748213154e-03 -3.2645871189025580e-02 -6.0174823634829904e-03 1.9099703852728982e-03 2.2168657446658560e-03 -2.7159902727167005e-03 6.0608402239888289e-03 4.1427883938480459e-03 2.7116453021333864e-03 7.6253783006751423e-03 9.7680923495518136e-03 -8.3437056774301587e-03 1.0886014534702729e-04 2.8589095065164271e-03 -7.2767423861309632e-03 -4.1415995239944096e-03 -4.7341146133343687e-03 5.3572731065492573e-03 1.8922800052406012e-04 -1.9154023123493279e-03 2.4600051478180451e-02 -1.8315257382639360e-03 -1.8454319623760879e-03 -8.3150491871022744e-03 -9.9211517935496128e-03 -1.0491707106522356e-02 1.4456735594463640e-03 -2.3092415619048547e-02 -1.9093952307076605e-02 1.5656356146288828e-02 -7.7338679255924024e-03 8.7351983678222722e-03 9.8444300839037983e-03 2.2473952835274077e-02 1.2401835547005096e-02 6.1502139406928132e-04 -2.9870950056346372e-03 -1.7456451446784614e-02 -1.4395446037284688e-02 -2.6668278376115268e-02 -1.2234705148488109e-02 -9.6622255598508217e-05 -2.2506238027652351e-03 1.2510877299929418e-02 -1.8315257382639360e-03 4.3516192434200740e-02 2.0845312240956832e-02 -1.1237887152561146e-02 -3.2578645403187056e-03 -5.7081145533642982e-03 1.6239293076068060e-03 -1.8165743709554021e-02 -2.5993569481101028e-02 1.5261058194577038e-02 -2.1171905839645318e-03 1.5540878886089668e-02 1.1396272786132731e-02 1.3691596611443108e-02 1.3929351060896211e-02 1.7729718030987242e-03 -1.9164972254541168e-03 -3.7978929915431690e-02 -1.4968359792504420e-02 -1.6441394350520899e-02 -1.8102289289000206e-02 -1.3712382127762668e-03 8.1561209252996106e-03 3.4038458766991492e-02 -1.8454319623760868e-03 2.0845312240956832e-02 4.7156791352343991e-02 -1.1869202123758534e-02 -4.0522039082059660e-03 -2.8590691380788451e-02 -3.7637224115348077e-03 1.4663059082604306e-02 1.4792328129879522e-02 -2.7912480408972543e-02 8.0044063473559777e-03 -1.6110265619164343e-02 -3.0914721995961691e-02 -1.2249232551592656e-02 -1.1080498546827834e-02 2.7347894316737580e-03 -3.0301873680350722e-03 1.4252768863953953e-02 2.5687001165730045e-02 6.0364991778352178e-03 1.3045210563608146e-02 -8.3398814129176484e-03 5.6728585526044980e-03 -2.1831026881298392e-02 -8.3150491871022726e-03 -1.1237887152561146e-02 -1.1869202123758534e-02 5.0824064819085184e-02 -7.8595160882111471e-03 1.8800685613607496e-02 6.0841884117106143e-03 -8.4955647201690760e-03 -1.8860984784569161e-03 7.4009260203102912e-03 -8.4910368432972380e-03 5.4816632451830851e-03 -1.4296269988077264e-05 -2.6202364907196587e-03 -1.4439863053634619e-03 -3.2668584874547676e-03 7.2915195150263764e-03 -6.9888458247115521e-03 5.7247528257808695e-03 -3.2055928176647017e-03 5.5829033630743555e-03 1.8519553814018298e-03 -1.0832196844868917e-02 9.2680683748213154e-03 -9.9211517935496128e-03 -3.2578645403187056e-03 -4.0522039082059669e-03 -7.8595160882111489e-03 2.9610972742011916e-02 -5.9615004663408589e-03 4.0832388781725194e-03 8.6894217216618372e-03 1.3986425114731599e-02 -1.7262963260919625e-02 6.3410948635461706e-03 -1.8429935212775552e-02 -1.5316451701981997e-02 -9.9239925186616496e-03 -1.4839501348321909e-02 1.4718204243286381e-02 -7.6115022572297731e-03 2.6741774926710038e-02 1.2967207182564080e-02 6.6520044699944865e-03 1.1947989113732306e-02 -7.4982138482064930e-03 7.5225887403940752e-03 -3.2645871189025580e-02 -1.0491707106522356e-02 -5.7081145533643008e-03 -2.8590691380788451e-02 1.8800685613607489e-02 -5.9615004663408598e-03 4.1829809975737549e-02 882 883 884 927 928 929 663 664 665 501 502 503 885 886 887 930 931 932 939 940 941 894 895 896 2.3286241270876157e-02 -2.5569046811796349e-03 -1.9174439270625528e-03 -5.9277193097586047e-03 -9.7227216202054045e-03 -7.1347545492406088e-03 -5.2462303891589500e-03 -3.3877921742106781e-03 -3.0701184107215728e-03 3.6626791843844472e-03 -7.7703626099282028e-04 -2.0852116742722587e-03 6.0848683706494090e-04 7.8302242787578157e-03 7.1174336896032211e-03 -7.1089288255640586e-03 3.5627859200863181e-04 3.1978853423348685e-03 -5.1546800975438628e-03 2.5595358151721671e-03 2.0013851611289908e-03 -4.1198486703000695e-03 5.6984160506499248e-03 1.8908243682299109e-03 -2.5569046811796357e-03 4.3246680991779432e-02 1.6473892614413031e-02 -1.0702406621958458e-02 -5.4031273001124824e-03 -7.6554731089179054e-03 -1.2903388312812496e-02 -2.6260445308503324e-02 -6.7000639083012493e-03 -7.5655723860281908e-04 1.1478047701067966e-04 1.2092426865627958e-02 7.9701385810196559e-03 2.2105030253926058e-02 9.5739108484758761e-03 1.6774820674318736e-03 -5.9766667348674840e-03 -1.9386136463632426e-02 3.2094447923972807e-03 -2.3706403708932802e-02 -1.4507644715959347e-02 1.4062191413704602e-02 -4.1198486703000661e-03 1.0109087868294077e-02 -1.9174439270625537e-03 1.6473892614413028e-02 3.6327374803189282e-02 -8.1493188152597235e-03 -6.8410350077422058e-03 -2.1703734181218279e-02 -1.0341138703281729e-02 -1.2222213864930106e-02 -9.8302256657768934e-03 -2.7443787758118635e-03 1.2871612598948923e-02 2.3344466573842523e-02 7.9217823279696415e-03 9.3542595952825665e-03 7.5542438508191352e-03 2.4801744825498663e-03 -6.1797190419260713e-03 -2.9592051727533188e-02 2.6412355426022804e-03 -1.5347621262276042e-02 -1.6478980587970579e-02 1.0109087868294075e-02 1.8908243682299107e-03 1.0378906934648009e-02 -5.9277193097586039e-03 -1.0702406621958462e-02 -8.1493188152597217e-03 4.1737592209088979e-02 -3.1995197684646448e-03 1.6690792566370797e-02 2.2055088842782407e-02 8.7760123281671008e-03 8.3965246968806286e-03 -6.0594910809365684e-03 1.5873336611510966e-03 -1.9100377410976529e-02 -2.6763319768893543e-02 -1.3422275897713387e-02 -7.9348879564690236e-03 2.1449263071737735e-03 -7.1082587003146950e-04 1.5144559168281613e-02 -3.4806734905236314e-03 1.5112146353677594e-02 1.0300329013448264e-02 -2.3706403708932806e-02 2.5595358151721658e-03 -1.5347621262276042e-02 -9.7227216202054063e-03 -5.4031273001124841e-03 -6.8410350077422058e-03 -3.1995197684646448e-03 2.1271311469932021e-02 -2.4983380934988650e-03 6.7612924922119053e-03 8.1964662365621623e-06 7.1161035891342071e-03 8.0906062178157936e-04 -7.6665539914079024e-03 4.0949076775043704e-03 -2.9771368225760785e-03 -4.6226856499357299e-03 -3.1567536588132947e-03 -4.9058666476456815e-04 5.0482125933550281e-03 -3.2077855357691603e-03 5.6101669696199327e-03 -3.4806734905236305e-03 1.8516654865826706e-03 3.2094447923972811e-03 -5.1546800975438671e-03 2.6412355426022800e-03 -7.1347545492406106e-03 -7.6554731089179045e-03 -2.1703734181218272e-02 1.6690792566370800e-02 -2.4983380934988650e-03 3.3996137233971810e-02 9.6270843998448423e-03 7.9184941192118469e-03 6.5671306727447401e-03 -5.7972567026484774e-03 2.6408925054822942e-03 -2.9446447461184473e-02 -1.2335028112605033e-02 -1.0334161153705779e-02 -1.0575052670119446e-02 1.1605141627655148e-02 -2.3731284431488461e-03 2.5866887537862718e-02 1.8516654865826723e-03 1.0300329013448259e-02 1.1774059455913503e-02 -1.4507644715959341e-02 2.0013851611289891e-03 -1.6478980587970583e-02 -5.2462303891589492e-03 -1.2903388312812496e-02 -1.0341138703281729e-02 2.2055088842782410e-02 6.7612924922119035e-03 9.6270843998448423e-03 4.1338094541447074e-02 1.8624738104300268e-02 3.7341040689645886e-03 -4.7930902226855452e-03 1.4760629426674790e-03 -1.2934876811249519e-02 -2.2982424312669017e-02 -1.7139273434580889e-02 -4.4770064833932286e-03 -4.1191896174491809e-03 -2.2076519457427017e-03 1.8695553274833285e-02 8.1964662365554674e-06 8.7760123281671060e-03 7.9184941192118590e-03 -2.6260445308503334e-02 -3.3877921742106760e-03 -1.2222213864930108e-02 -3.3877921742106777e-03 -2.6260445308503324e-02 -1.2222213864930104e-02 8.7760123281671008e-03 8.1964662365604818e-06 7.9184941192118469e-03 1.8624738104300272e-02 4.1338094541447053e-02 3.7341040689645873e-03 1.4760629426674864e-03 -4.7930902226855469e-03 -1.2934876811249506e-02 -1.7139273434580885e-02 -2.2982424312669010e-02 -4.4770064833932286e-03 -2.2076519457427069e-03 -4.1191896174491774e-03 1.8695553274833278e-02 6.7612924922119053e-03 2.2055088842782393e-02 9.6270843998448423e-03 -1.2903388312812489e-02 -5.2462303891589526e-03 -1.0341138703281724e-02 -3.0701184107215724e-03 -6.7000639083012476e-03 -9.8302256657768951e-03 8.3965246968806303e-03 7.1161035891342071e-03 6.5671306727447401e-03 3.7341040689645891e-03 3.7341040689645873e-03 2.3756630718970426e-02 -1.3005280121376412e-02 -1.3005280121376413e-02 -1.2820441310758683e-02 -2.9289102925884694e-03 -2.9289102925884681e-03 -6.4040838224935486e-03 6.4576403780082789e-03 6.4576403780082789e-03 1.9940844003461218e-03 7.1161035891342079e-03 8.3965246968806286e-03 6.5671306727447393e-03 -6.7000639083012519e-03 -3.0701184107215732e-03 -9.8302256657768986e-03 3.6626791843844468e-03 -7.5655723860281929e-04 -2.7443787758118631e-03 -6.0594910809365675e-03 8.0906062178157958e-04 -5.7972567026484765e-03 -4.7930902226855435e-03 1.4760629426674864e-03 -1.3005280121376412e-02 2.6844398540181287e-02 4.0523815991023890e-04 -2.9239864753795143e-03 -5.8976051781940734e-03 -2.6420619521431189e-03 6.1116639925788818e-03 -6.2051177283523424e-03 -1.0203993377164399e-04 2.8467329782061639e-03 -7.6665539914078972e-03 1.5873336611511037e-03 2.6408925054822990e-03 1.1478047701068712e-04 -7.7703626099282766e-04 1.2871612598948919e-02 -7.7703626099282028e-04 1.1478047701067730e-04 1.2871612598948923e-02 1.5873336611510961e-03 -7.6665539914079015e-03 2.6408925054822933e-03 1.4760629426674777e-03 -4.7930902226855469e-03 -1.3005280121376413e-02 4.0523815991023884e-04 2.6844398540181291e-02 -2.9239864753795135e-03 -2.6420619521431085e-03 -5.8976051781940734e-03 6.1116639925788844e-03 -1.0203993377164767e-04 -6.2051177283523416e-03 2.8467329782061596e-03 8.0906062178157535e-04 -6.0594910809365649e-03 -5.7972567026484782e-03 -7.5655723860281116e-04 3.6626791843844585e-03 -2.7443787758118570e-03 -2.0852116742722583e-03 1.2092426865627956e-02 2.3344466573842523e-02 -1.9100377410976529e-02 4.0949076775043712e-03 -2.9446447461184477e-02 -1.2934876811249522e-02 -1.2934876811249506e-02 -1.2820441310758685e-02 -2.9239864753795161e-03 -2.9239864753795143e-03 6.5109949168967854e-02 1.8232617175201870e-02 1.8232617175201877e-02 1.5599060744104392e-03 2.6245006535436178e-03 2.6245006535436139e-03 -4.1645452157935699e-02 4.0949076775043678e-03 -1.9100377410976529e-02 -2.9446447461184473e-02 1.2092426865627958e-02 -2.0852116742722600e-03 2.3344466573842537e-02 6.0848683706494068e-04 7.9701385810196559e-03 7.9217823279696398e-03 -2.6763319768893543e-02 -2.9771368225760789e-03 -1.2335028112605033e-02 -2.2982424312669017e-02 -1.7139273434580885e-02 -2.9289102925884689e-03 -5.8976051781940726e-03 -2.6420619521431085e-03 1.8232617175201873e-02 4.3829865793162483e-02 1.9271027936135509e-02 4.9905399060784627e-03 -6.2773479744611185e-03 1.1093573111004744e-03 -1.4901099445633247e-02 -4.6226856499357273e-03 -1.3422275897713391e-02 -1.0334161153705786e-02 2.2105030253926055e-02 7.8302242787578243e-03 9.3542595952825700e-03 7.8302242787578157e-03 2.2105030253926055e-02 9.3542595952825665e-03 -1.3422275897713385e-02 -4.6226856499357299e-03 -1.0334161153705779e-02 -1.7139273434580889e-02 -2.2982424312669010e-02 -2.9289102925884672e-03 -2.6420619521431181e-03 -5.8976051781940726e-03 1.8232617175201873e-02 1.9271027936135512e-02 4.3829865793162483e-02 4.9905399060784592e-03 1.1093573111004861e-03 -6.2773479744611211e-03 -1.4901099445633247e-02 -2.9771368225760737e-03 -2.6763319768893540e-02 -1.2335028112605036e-02 7.9701385810196507e-03 6.0848683706493873e-04 7.9217823279696398e-03 7.1174336896032203e-03 9.5739108484758761e-03 7.5542438508191334e-03 -7.9348879564690236e-03 -3.1567536588132956e-03 -1.0575052670119446e-02 -4.4770064833932286e-03 -4.4770064833932303e-03 -6.4040838224935486e-03 6.1116639925788809e-03 6.1116639925788852e-03 1.5599060744104394e-03 4.9905399060784627e-03 4.9905399060784592e-03 2.6466948061492326e-02 -1.2224900338060892e-02 -1.2224900338060896e-02 -1.5581152674808588e-02 -3.1567536588132930e-03 -7.9348879564690236e-03 -1.0575052670119444e-02 9.5739108484758743e-03 7.1174336896032255e-03 7.5542438508191300e-03 -7.1089288255640586e-03 1.6774820674318736e-03 2.4801744825498663e-03 2.1449263071737761e-03 -4.9058666476456793e-04 1.1605141627655148e-02 -4.1191896174491817e-03 -2.2076519457427074e-03 6.4576403780082798e-03 -6.2051177283523433e-03 -1.0203993377164744e-04 2.6245006535436182e-03 -6.2773479744611185e-03 1.1093573111004861e-03 -1.2224900338060892e-02 2.2494111980165390e-02 3.6798644376940620e-04 -2.3897093186210977e-03 5.0482125933550281e-03 -7.1082587003147438e-04 -2.3731284431488509e-03 -5.9766667348674909e-03 3.5627859200863159e-04 -6.1797190419260704e-03 3.5627859200863186e-04 -5.9766667348674840e-03 -6.1797190419260713e-03 -7.1082587003146939e-04 5.0482125933550290e-03 -2.3731284431488457e-03 -2.2076519457427017e-03 -4.1191896174491774e-03 6.4576403780082789e-03 -1.0203993377164397e-04 -6.2051177283523416e-03 2.6245006535436143e-03 1.1093573111004742e-03 -6.2773479744611211e-03 -1.2224900338060896e-02 3.6798644376940609e-04 2.2494111980165387e-02 -2.3897093186210920e-03 -4.9058666476456750e-04 2.1449263071737757e-03 1.1605141627655153e-02 1.6774820674318716e-03 -7.1089288255640672e-03 2.4801744825498628e-03 3.1978853423348694e-03 -1.9386136463632426e-02 -2.9592051727533188e-02 1.5144559168281613e-02 -3.2077855357691603e-03 2.5866887537862718e-02 1.8695553274833285e-02 1.8695553274833278e-02 1.9940844003461205e-03 2.8467329782061648e-03 2.8467329782061604e-03 -4.1645452157935699e-02 -1.4901099445633247e-02 -1.4901099445633245e-02 -1.5581152674808587e-02 -2.3897093186210972e-03 -2.3897093186210925e-03 6.2682848811739106e-02 -3.2077855357691590e-03 1.5144559168281614e-02 2.5866887537862725e-02 -1.9386136463632426e-02 3.1978853423348694e-03 -2.9592051727533195e-02 -5.1546800975438636e-03 3.2094447923972803e-03 2.6412355426022804e-03 -3.4806734905236318e-03 5.6101669696199327e-03 1.8516654865826723e-03 8.1964662365556842e-06 6.7612924922119053e-03 7.1161035891342079e-03 -7.6665539914078980e-03 8.0906062178157480e-04 4.0949076775043669e-03 -4.6226856499357273e-03 -2.9771368225760737e-03 -3.1567536588132934e-03 5.0482125933550290e-03 -4.9058666476456728e-04 -3.2077855357691590e-03 2.1271311469932018e-02 -3.1995197684646453e-03 -2.4983380934988663e-03 -5.4031273001124858e-03 -9.7227216202054063e-03 -6.8410350077422084e-03 2.5595358151721671e-03 -2.3706403708932802e-02 -1.5347621262276043e-02 1.5112146353677594e-02 -3.4806734905236305e-03 1.0300329013448259e-02 8.7760123281671078e-03 2.2055088842782396e-02 8.3965246968806286e-03 1.5873336611511037e-03 -6.0594910809365667e-03 -1.9100377410976529e-02 -1.3422275897713392e-02 -2.6763319768893540e-02 -7.9348879564690236e-03 -7.1082587003147460e-04 2.1449263071737779e-03 1.5144559168281613e-02 -3.1995197684646453e-03 4.1737592209088979e-02 1.6690792566370800e-02 -1.0702406621958463e-02 -5.9277193097586117e-03 -8.1493188152597200e-03 2.0013851611289900e-03 -1.4507644715959346e-02 -1.6478980587970579e-02 1.0300329013448265e-02 1.8516654865826706e-03 1.1774059455913501e-02 7.9184941192118607e-03 9.6270843998448440e-03 6.5671306727447384e-03 2.6408925054822990e-03 -5.7972567026484782e-03 -2.9446447461184473e-02 -1.0334161153705786e-02 -1.2335028112605039e-02 -1.0575052670119444e-02 -2.3731284431488509e-03 1.1605141627655153e-02 2.5866887537862725e-02 -2.4983380934988659e-03 1.6690792566370800e-02 3.3996137233971817e-02 -7.6554731089179097e-03 -7.1347545492406080e-03 -2.1703734181218293e-02 -4.1198486703000695e-03 1.4062191413704598e-02 1.0109087868294075e-02 -2.3706403708932806e-02 3.2094447923972807e-03 -1.4507644715959341e-02 -2.6260445308503334e-02 -1.2903388312812493e-02 -6.7000639083012511e-03 1.1478047701068907e-04 -7.5655723860281084e-04 1.2092426865627962e-02 2.2105030253926055e-02 7.9701385810196507e-03 9.5739108484758743e-03 -5.9766667348674900e-03 1.6774820674318714e-03 -1.9386136463632426e-02 -5.4031273001124893e-03 -1.0702406621958462e-02 -7.6554731089179080e-03 4.3246680991779446e-02 -2.5569046811796349e-03 1.6473892614413031e-02 5.6984160506499248e-03 -4.1198486703000669e-03 1.8908243682299109e-03 2.5595358151721649e-03 -5.1546800975438680e-03 2.0013851611289887e-03 -3.3877921742106764e-03 -5.2462303891589526e-03 -3.0701184107215737e-03 -7.7703626099282755e-04 3.6626791843844585e-03 -2.0852116742722604e-03 7.8302242787578226e-03 6.0848683706493699e-04 7.1174336896032246e-03 3.5627859200863132e-04 -7.1089288255640672e-03 3.1978853423348694e-03 -9.7227216202054063e-03 -5.9277193097586126e-03 -7.1347545492406080e-03 -2.5569046811796357e-03 2.3286241270876171e-02 -1.9174439270625537e-03 1.8908243682299109e-03 1.0109087868294077e-02 1.0378906934648009e-02 -1.5347621262276043e-02 2.6412355426022808e-03 -1.6478980587970579e-02 -1.2222213864930109e-02 -1.0341138703281724e-02 -9.8302256657768969e-03 1.2871612598948923e-02 -2.7443787758118579e-03 2.3344466573842537e-02 9.3542595952825682e-03 7.9217823279696380e-03 7.5542438508191317e-03 -6.1797190419260704e-03 2.4801744825498628e-03 -2.9592051727533195e-02 -6.8410350077422084e-03 -8.1493188152597200e-03 -2.1703734181218286e-02 1.6473892614413031e-02 -1.9174439270625526e-03 3.6327374803189302e-02 927 928 929 972 973 974 984 985 986 663 664 665 930 931 932 975 976 977 987 988 989 939 940 941 2.6054103325006774e-02 -2.8235157760532602e-03 -2.1349506011829108e-03 -6.7646339440972734e-03 -1.0864298827663311e-02 -7.9733987834871532e-03 -6.0711846434797039e-03 -3.8205353332576154e-03 -3.4639974521319568e-03 4.2266956892836440e-03 -8.5508077193669570e-04 -2.3319865253676160e-03 6.7082155310931436e-04 8.6971019990063989e-03 7.9347634901029522e-03 -7.8353550836488452e-03 4.4551101996470204e-04 3.5958024564192491e-03 -5.7547085893108283e-03 2.8735304491456686e-03 2.2387953084248443e-03 -4.5257383068630797e-03 6.3472872407941148e-03 2.1349721072225956e-03 -2.8235157760532607e-03 4.8283771747031586e-02 1.8472250944829523e-02 -1.1964881255184266e-02 -6.2572654415980781e-03 -8.5070988029072175e-03 -1.4413770701743541e-02 -2.9529399902501773e-02 -7.6386309828744081e-03 -7.9947479700234411e-04 3.3199838843405653e-04 1.3326196200938951e-02 9.0201834521476329e-03 2.4742625020943394e-02 1.0737385533860895e-02 1.8540462619076269e-03 -6.5298139368188662e-03 -2.1572816842663232e-02 3.4570456659088035e-03 -2.6516177568627227e-02 -1.6149220448064178e-02 1.5670367150019328e-02 -4.5257383068630806e-03 1.1331934396879635e-02 -2.1349506011829095e-03 1.8472250944829526e-02 4.0738016513987202e-02 -9.2372573871780609e-03 -7.7575963956967656e-03 -2.4440593371805906e-02 -1.1595394012985684e-02 -1.3824586878632772e-02 -1.1357502317148644e-02 -2.9828849352497105e-03 1.4456542925341107e-02 2.6250306615214138e-02 8.9980839896822082e-03 1.0661210942114679e-02 8.5166405155559441e-03 2.7519496124521858e-03 -6.8494933714762559e-03 -3.2979989985555680e-02 2.8685189375823265e-03 -1.7293300273702124e-02 -1.8480932571957220e-02 1.1331934396879637e-02 2.1349721072225990e-03 1.1754054601710164e-02 -6.7646339440972734e-03 -1.1964881255184266e-02 -9.2372573871780626e-03 4.6816933482930791e-02 -3.4728102419393542e-03 1.8690114999973521e-02 2.4894920058482532e-02 9.8112917291051024e-03 9.6044448230657997e-03 -6.9067052945383425e-03 1.7780552790055233e-03 -2.1304041611237522e-02 -3.0036644645926071e-02 -1.5140916341944109e-02 -9.0131237429465112e-03 2.2766241489694462e-03 -8.3409477439170263e-04 1.7003174919886652e-02 -3.7643162371938559e-03 1.6949825156203139e-02 1.1549988272138255e-02 -2.6516177568627227e-02 2.8735304491456677e-03 -1.7293300273702121e-02 -1.0864298827663311e-02 -6.2572654415980781e-03 -7.7575963956967673e-03 -3.4728102419393538e-03 2.3796930447831533e-02 -2.6969742973952694e-03 7.7143230890652772e-03 2.8404599483571600e-04 8.0358764219411547e-03 8.6980973173422500e-04 -8.6227559793311728e-03 4.4168771858375420e-03 -3.3996396982494798e-03 -5.2355779946092655e-03 -3.5396980389925002e-03 -5.6394959242825956e-04 5.5536477993759518e-03 -3.4689833905104379e-03 6.2595198735720886e-03 -3.7643162371938585e-03 2.1419795772339456e-03 3.4570456659088074e-03 -5.7547085893108318e-03 2.8685189375823286e-03 -7.9733987834871532e-03 -8.5070988029072158e-03 -2.4440593371805906e-02 1.8690114999973521e-02 -2.6969742973952686e-03 3.8071973236587807e-02 1.0783666214525261e-02 8.7588386808386629e-03 7.7088218099344071e-03 -6.5118392952728567e-03 2.9087162578632863e-03 -3.2908720591482088e-02 -1.3823928322555289e-02 -1.1621291271731525e-02 -1.1895093122513042e-02 1.2842626057646767e-02 -2.6309741472310437e-03 2.8765538269557793e-02 2.1419795772339460e-03 1.1549988272138260e-02 1.3179006341678266e-02 -1.6149220448064178e-02 2.2387953084248456e-03 -1.8480932571957230e-02 -6.0711846434797056e-03 -1.4413770701743541e-02 -1.1595394012985684e-02 2.4894920058482536e-02 7.7143230890652790e-03 1.0783666214525263e-02 4.6796988344333830e-02 2.0891799366346078e-02 4.4210795996373065e-03 -5.9383358819745467e-03 1.5732921039849736e-03 -1.4256333706279375e-02 -2.5846599751615261e-02 -1.9258862143679435e-02 -5.1335719203449964e-03 -4.5904342180807895e-03 -2.4975381098208353e-03 2.0846302023241611e-02 2.8404599483571784e-04 9.8112917291051042e-03 8.7588386808386612e-03 -2.9529399902501769e-02 -3.8205353332576176e-03 -1.3824586878632771e-02 -3.8205353332576167e-03 -2.9529399902501773e-02 -1.3824586878632769e-02 9.8112917291051024e-03 2.8404599483571659e-04 8.7588386808386629e-03 2.0891799366346078e-02 4.6796988344333830e-02 4.4210795996373056e-03 1.5732921039849699e-03 -5.9383358819745484e-03 -1.4256333706279371e-02 -1.9258862143679435e-02 -2.5846599751615254e-02 -5.1335719203449938e-03 -2.4975381098208418e-03 -4.5904342180807869e-03 2.0846302023241607e-02 7.7143230890652833e-03 2.4894920058482529e-02 1.0783666214525256e-02 -1.4413770701743527e-02 -6.0711846434797039e-03 -1.1595394012985677e-02 -3.4639974521319563e-03 -7.6386309828744081e-03 -1.1357502317148644e-02 9.6044448230658032e-03 8.0358764219411547e-03 7.7088218099344071e-03 4.4210795996373073e-03 4.4210795996373056e-03 2.7201394949617735e-02 -1.4685021872486170e-02 -1.4685021872486170e-02 -1.5180108368183742e-02 -3.4660871870853946e-03 -3.4660871870853954e-03 -7.2824664662501440e-03 7.1923366499336691e-03 7.1923366499336708e-03 2.5585408992446351e-03 8.0358764219411495e-03 9.6044448230658015e-03 7.7088218099344063e-03 -7.6386309828744073e-03 -3.4639974521319594e-03 -1.1357502317148646e-02 4.2266956892836448e-03 -7.9947479700234443e-04 -2.9828849352497105e-03 -6.9067052945383442e-03 8.6980973173422511e-04 -6.5118392952728558e-03 -5.9383358819745458e-03 1.5732921039849693e-03 -1.4685021872486170e-02 3.0287425598485684e-02 4.5773002481198655e-04 -3.1577191921363904e-03 -6.4935083442998545e-03 -2.9132818713808197e-03 6.8377979098083307e-03 -6.8848141760594712e-03 -1.1104969921684367e-04 3.1344082021324054e-03 -8.6227559793311641e-03 1.7780552790055239e-03 2.9087162578632832e-03 3.3199838843405447e-04 -8.5508077193669841e-04 1.4456542925341109e-02 -8.5508077193669537e-04 3.3199838843405523e-04 1.4456542925341105e-02 1.7780552790055229e-03 -8.6227559793311728e-03 2.9087162578632854e-03 1.5732921039849725e-03 -5.9383358819745493e-03 -1.4685021872486166e-02 4.5773002481198650e-04 3.0287425598485681e-02 -3.1577191921363899e-03 -2.9132818713808214e-03 -6.4935083442998545e-03 6.8377979098083307e-03 -1.1104969921684846e-04 -6.8848141760594712e-03 3.1344082021324063e-03 8.6980973173422533e-04 -6.9067052945383355e-03 -6.5118392952728593e-03 -7.9947479700233988e-04 4.2266956892836457e-03 -2.9828849352497144e-03 -2.3319865253676160e-03 1.3326196200938955e-02 2.6250306615214138e-02 -2.1304041611237522e-02 4.4168771858375429e-03 -3.2908720591482095e-02 -1.4256333706279378e-02 -1.4256333706279371e-02 -1.5180108368183742e-02 -3.1577191921363912e-03 -3.1577191921363882e-03 7.2809708527707989e-02 2.0375932023166225e-02 2.0375932023166225e-02 1.9296892337684745e-03 2.9310756250781724e-03 2.9310756250781706e-03 -4.6242461440756819e-02 4.4168771858375403e-03 -2.1304041611237515e-02 -3.2908720591482081e-02 1.3326196200938941e-02 -2.3319865253676160e-03 2.6250306615214141e-02 6.7082155310931675e-04 9.0201834521476346e-03 8.9980839896822082e-03 -3.0036644645926071e-02 -3.3996396982494794e-03 -1.3823928322555291e-02 -2.5846599751615257e-02 -1.9258862143679435e-02 -3.4660871870853946e-03 -6.4935083442998545e-03 -2.9132818713808214e-03 2.0375932023166225e-02 4.8861250048653292e-02 2.1693779295549432e-02 5.6924334351977964e-03 -6.6623658862555541e-03 1.3016353085503656e-03 -1.6816353608788717e-02 -5.2355779946092690e-03 -1.5140916341944109e-02 -1.1621291271731516e-02 2.4742625020943380e-02 8.6971019990064076e-03 1.0661210942114672e-02 8.6971019990064007e-03 2.4742625020943394e-02 1.0661210942114679e-02 -1.5140916341944109e-02 -5.2355779946092664e-03 -1.1621291271731525e-02 -1.9258862143679435e-02 -2.5846599751615254e-02 -3.4660871870853954e-03 -2.9132818713808188e-03 -6.4935083442998545e-03 2.0375932023166225e-02 2.1693779295549432e-02 4.8861250048653299e-02 5.6924334351977982e-03 1.3016353085503753e-03 -6.6623658862555533e-03 -1.6816353608788717e-02 -3.3996396982494802e-03 -3.0036644645926071e-02 -1.3823928322555286e-02 9.0201834521476242e-03 6.7082155310930504e-04 8.9980839896822064e-03 7.9347634901029505e-03 1.0737385533860895e-02 8.5166405155559458e-03 -9.0131237429465112e-03 -3.5396980389925002e-03 -1.1895093122513044e-02 -5.1335719203449955e-03 -5.1335719203449938e-03 -7.2824664662501440e-03 6.8377979098083299e-03 6.8377979098083307e-03 1.9296892337684743e-03 5.6924334351977982e-03 5.6924334351977982e-03 2.9309209958904819e-02 -1.3515986666685974e-02 -1.3515986666685974e-02 -1.7199527512508958e-02 -3.5396980389925010e-03 -9.0131237429465130e-03 -1.1895093122513037e-02 1.0737385533860900e-02 7.9347634901029557e-03 8.5166405155559389e-03 -7.8353550836488452e-03 1.8540462619076276e-03 2.7519496124521845e-03 2.2766241489694458e-03 -5.6394959242825934e-04 1.2842626057646765e-02 -4.5904342180807895e-03 -2.4975381098208418e-03 7.1923366499336699e-03 -6.8848141760594712e-03 -1.1104969921684828e-04 2.9310756250781724e-03 -6.6623658862555533e-03 1.3016353085503758e-03 -1.3515986666685974e-02 2.4672511352518137e-02 4.0543958543494781e-04 -2.7215337597175249e-03 5.5536477993759431e-03 -8.3409477439170415e-04 -2.6309741472310437e-03 -6.5298139368188679e-03 4.4551101996470258e-04 -6.8494933714762550e-03 4.4551101996470204e-04 -6.5298139368188662e-03 -6.8494933714762550e-03 -8.3409477439170252e-04 5.5536477993759518e-03 -2.6309741472310432e-03 -2.4975381098208353e-03 -4.5904342180807869e-03 7.1923366499336708e-03 -1.1104969921684360e-04 -6.8848141760594721e-03 2.9310756250781698e-03 1.3016353085503649e-03 -6.6623658862555515e-03 -1.3515986666685974e-02 4.0543958543494792e-04 2.4672511352518134e-02 -2.7215337597175219e-03 -5.6394959242826053e-04 2.2766241489694389e-03 1.2842626057646769e-02 1.8540462619076256e-03 -7.8353550836488487e-03 2.7519496124521867e-03 3.5958024564192491e-03 -2.1572816842663229e-02 -3.2979989985555687e-02 1.7003174919886656e-02 -3.4689833905104375e-03 2.8765538269557793e-02 2.0846302023241611e-02 2.0846302023241607e-02 2.5585408992446351e-03 3.1344082021324067e-03 3.1344082021324063e-03 -4.6242461440756819e-02 -1.6816353608788720e-02 -1.6816353608788717e-02 -1.7199527512508958e-02 -2.7215337597175241e-03 -2.7215337597175215e-03 6.9312351486016971e-02 -3.4689833905104340e-03 1.7003174919886656e-02 2.8765538269557779e-02 -2.1572816842663219e-02 3.5958024564192483e-03 -3.2979989985555687e-02 -5.7547085893108274e-03 3.4570456659088044e-03 2.8685189375823265e-03 -3.7643162371938568e-03 6.2595198735720904e-03 2.1419795772339460e-03 2.8404599483571632e-04 7.7143230890652842e-03 8.0358764219411495e-03 -8.6227559793311641e-03 8.6980973173422533e-04 4.4168771858375403e-03 -5.2355779946092699e-03 -3.3996396982494815e-03 -3.5396980389925010e-03 5.5536477993759431e-03 -5.6394959242826053e-04 -3.4689833905104345e-03 2.3796930447831530e-02 -3.4728102419393512e-03 -2.6969742973952651e-03 -6.2572654415980738e-03 -1.0864298827663311e-02 -7.7575963956967647e-03 2.8735304491456686e-03 -2.6516177568627227e-02 -1.7293300273702124e-02 1.6949825156203135e-02 -3.7643162371938585e-03 1.1549988272138260e-02 9.8112917291051059e-03 2.4894920058482532e-02 9.6044448230658015e-03 1.7780552790055237e-03 -6.9067052945383355e-03 -2.1304041611237515e-02 -1.5140916341944106e-02 -3.0036644645926074e-02 -9.0131237429465112e-03 -8.3409477439170382e-04 2.2766241489694371e-03 1.7003174919886652e-02 -3.4728102419393516e-03 4.6816933482930784e-02 1.8690114999973514e-02 -1.1964881255184259e-02 -6.7646339440972630e-03 -9.2372573871780540e-03 2.2387953084248443e-03 -1.6149220448064175e-02 -1.8480932571957220e-02 1.1549988272138255e-02 2.1419795772339469e-03 1.3179006341678266e-02 8.7588386808386612e-03 1.0783666214525254e-02 7.7088218099344063e-03 2.9087162578632832e-03 -6.5118392952728584e-03 -3.2908720591482081e-02 -1.1621291271731516e-02 -1.3823928322555287e-02 -1.1895093122513037e-02 -2.6309741472310437e-03 1.2842626057646769e-02 2.8765538269557772e-02 -2.6969742973952660e-03 1.8690114999973508e-02 3.8071973236587779e-02 -8.5070988029072054e-03 -7.9733987834871567e-03 -2.4440593371805885e-02 -4.5257383068630797e-03 1.5670367150019331e-02 1.1331934396879637e-02 -2.6516177568627227e-02 3.4570456659088070e-03 -1.6149220448064178e-02 -2.9529399902501773e-02 -1.4413770701743531e-02 -7.6386309828744073e-03 3.3199838843405447e-04 -7.9947479700234021e-04 1.3326196200938941e-02 2.4742625020943380e-02 9.0201834521476242e-03 1.0737385533860900e-02 -6.5298139368188688e-03 1.8540462619076263e-03 -2.1572816842663219e-02 -6.2572654415980738e-03 -1.1964881255184259e-02 -8.5070988029072054e-03 4.8283771747031565e-02 -2.8235157760532637e-03 1.8472250944829523e-02 6.3472872407941148e-03 -4.5257383068630815e-03 2.1349721072225990e-03 2.8735304491456673e-03 -5.7547085893108300e-03 2.2387953084248451e-03 -3.8205353332576167e-03 -6.0711846434797056e-03 -3.4639974521319594e-03 -8.5508077193669862e-04 4.2266956892836440e-03 -2.3319865253676156e-03 8.6971019990064076e-03 6.7082155310930753e-04 7.9347634901029557e-03 4.4551101996470220e-04 -7.8353550836488470e-03 3.5958024564192483e-03 -1.0864298827663311e-02 -6.7646339440972604e-03 -7.9733987834871567e-03 -2.8235157760532629e-03 2.6054103325006774e-02 -2.1349506011829151e-03 2.1349721072225956e-03 1.1331934396879635e-02 1.1754054601710164e-02 -1.7293300273702121e-02 2.8685189375823295e-03 -1.8480932571957230e-02 -1.3824586878632771e-02 -1.1595394012985677e-02 -1.1357502317148646e-02 1.4456542925341109e-02 -2.9828849352497144e-03 2.6250306615214141e-02 1.0661210942114672e-02 8.9980839896822047e-03 8.5166405155559354e-03 -6.8494933714762550e-03 2.7519496124521867e-03 -3.2979989985555687e-02 -7.7575963956967656e-03 -9.2372573871780522e-03 -2.4440593371805881e-02 1.8472250944829519e-02 -2.1349506011829138e-03 4.0738016513987188e-02 501 502 503 663 664 665 666 667 668 504 505 506 894 895 896 939 940 941 669 670 671 507 508 509 2.1492478255534828e-02 -4.3577929763355151e-03 -2.4282001302019110e-03 -2.9253288646954416e-03 -9.3992340761232945e-03 -4.1427589078107830e-03 -2.7378711341976133e-03 -2.2007060861500179e-03 -2.4733769615201541e-03 3.8259700411415456e-03 -2.1209168069805636e-03 -3.3834984176496440e-03 -2.2329115867651076e-03 7.0796979151765745e-03 5.2841574566306893e-03 -7.0698047215089930e-03 1.4341253381949975e-03 4.9871610985425946e-03 -5.0585319282493747e-03 4.2857822581371385e-03 2.2707717219880019e-03 -5.2940000612598515e-03 5.2790444340806795e-03 -1.1425585997879665e-04 -4.3577929763355160e-03 4.2486919979449679e-02 1.2599111282276115e-02 -1.0558929814881051e-02 -7.6199406333467478e-03 -8.8637766578191259e-03 -1.2626491467706334e-02 -2.6091574802097169e-02 -2.0016674868444102e-03 -2.2808429119783717e-03 3.3389963331754580e-03 1.3648787626626833e-02 7.4681519838279984e-03 2.2092101590911534e-02 5.4943465493639387e-03 3.5598574264790886e-03 -9.1088811590456960e-03 -2.0525840538228892e-02 5.1000757028439835e-03 -2.4326675700667797e-02 -1.0778806605860239e-02 1.3695972057750215e-02 -7.7094560837927522e-04 1.0427845830485805e-02 -2.4282001302019115e-03 1.2599111282276114e-02 2.7838008013245860e-02 -5.0942288761017833e-03 -8.1213464365840655e-03 -1.6054667137097068e-02 -7.4701961908957663e-03 -7.9454029501541401e-03 -5.1009975754309350e-03 -4.3057096355475829e-03 1.4439304170869553e-02 1.6965844840780717e-02 6.2767512225356892e-03 5.4366055212851806e-03 2.5486888620197684e-03 3.5078019636892938e-03 -8.2878903385289332e-03 -2.2932131690465461e-02 2.9328029912060885e-03 -1.1692131374152591e-02 -1.0220323570928818e-02 6.5809786553159780e-03 3.5717501249888793e-03 6.9555782578759520e-03 -2.9253288646954433e-03 -1.0558929814881051e-02 -5.0942288761017841e-03 3.8135431511855673e-02 5.0638781595915220e-04 1.5089077725253103e-02 2.0329737191978878e-02 9.8693092684120597e-03 5.2784108805521372e-03 -3.0726186156391291e-03 -9.2842591311021871e-04 -1.7538655359681819e-02 -2.4957914582785633e-02 -1.4320767816400017e-02 -4.1142940356861451e-03 -1.0593756809135462e-03 1.2958385743034855e-03 1.3788289011375701e-02 -5.0206786718400573e-03 1.4832258599281186e-02 6.4081710452342650e-03 -2.1429252287960762e-02 -6.9567071356458352e-04 -1.3816770390945475e-02 -9.3992340761232945e-03 -7.6199406333467478e-03 -8.1213464365840655e-03 5.0638781595915220e-04 1.8838943207373556e-02 3.9444554827620807e-04 8.3193891338264152e-03 2.9302415384059653e-03 7.2376285916994224e-03 1.3077424710944644e-04 -6.3134251696912004e-03 -3.1838170870985991e-04 -5.4210194907435925e-03 -7.2705652728579694e-03 -3.6004800085463334e-03 9.1632520128113039e-04 3.5507642095376395e-03 7.1113198502444476e-04 5.0473387139580760e-03 -5.7466109604967621e-05 3.7594128750015276e-03 -9.9961545267337196e-05 -4.0585517698162729e-03 -6.2410846161342444e-05 -4.1427589078107830e-03 -8.8637766578191259e-03 -1.6054667137097064e-02 1.5089077725253103e-02 3.9444554827620861e-04 3.0659476854617281e-02 6.9262119646153492e-03 7.9346442878686762e-03 2.0565171758386200e-03 -4.2742327695240020e-03 -8.2431035183574508e-04 -2.7141939573925886e-02 -1.0267747165231374e-02 -1.0192279510912009e-02 -6.3990381744707227e-03 1.0024678634876051e-02 1.3062027967884714e-03 2.3152522404528485e-02 -2.2938497930452212e-04 1.0752307616539333e-02 8.1781515547081629e-03 -1.3125844502873829e-02 -5.0723372890579569e-04 -1.4451023104198872e-02 -2.7378711341976133e-03 -1.2626491467706334e-02 -7.4701961908957663e-03 2.0329737191978878e-02 8.3193891338264152e-03 6.9262119646153492e-03 3.9979448997634066e-02 1.8454721358121609e-02 -1.1378314130294541e-03 -8.3680769613023523e-05 9.6498087650671665e-04 -1.2308717149122511e-02 -2.2224516555129491e-02 -1.7343262648595870e-02 -2.4950255453625380e-04 -7.3049714158117994e-03 -7.0265307625246503e-05 1.8257115110692525e-02 -3.5361682791540910e-03 7.9815880379905946e-03 5.9137462229010025e-03 -2.4421978035706941e-02 -5.6806599825178711e-03 -9.9308259906249075e-03 -2.2007060861500170e-03 -2.6091574802097169e-02 -7.9454029501541384e-03 9.8693092684120597e-03 2.9302415384059649e-03 7.9346442878686745e-03 1.8454721358121609e-02 4.1325420505039345e-02 -1.0856170134442681e-03 8.6279761940033354e-04 -5.7455677517410861e-03 -1.2869809167727640e-02 -1.6938999450055323e-02 -2.3768267698025123e-02 -2.0199827681910583e-04 -2.7124936767760790e-03 -1.9442299442684044e-03 1.8683598772962186e-02 6.0178672585704095e-03 2.1065822069887996e-02 5.3085686095081450e-03 -1.3352496291522995e-02 -7.7718439172015097e-03 -9.8239842621938682e-03 -2.4733769615201536e-03 -2.0016674868444093e-03 -5.1009975754309350e-03 5.2784108805521363e-03 7.2376285916994233e-03 2.0565171758386192e-03 -1.1378314130294554e-03 -1.0856170134442694e-03 2.2503908123131151e-02 -1.2804589859712150e-02 -1.3414556073292316e-02 -3.4141809255947074e-03 1.4342391985528676e-03 1.5736544168747919e-03 -5.6328768285907101e-03 6.8136656365701273e-03 6.5776864407449355e-03 -5.8934222535259951e-03 5.7889703568271165e-03 4.1533656766616130e-03 1.2023107729623008e-03 -2.8994878382404849e-03 -3.0404945523997691e-03 -5.7212584887897187e-03 3.8259700411415465e-03 -2.2808429119783708e-03 -4.3057096355475829e-03 -3.0726186156391300e-03 1.3077424710944616e-04 -4.2742327695240038e-03 -8.3680769613025041e-05 8.6279761940033300e-04 -1.2804589859712147e-02 2.7483907463772016e-02 -1.7533679451329741e-04 -6.1910013324636718e-03 -9.2932330162110686e-03 -3.3610667592323157e-03 6.4219894202784166e-03 -6.9165621896844116e-03 5.0667870205950069e-04 5.7026155678314844e-03 -8.0757711387903879e-03 3.5504062296246998e-03 3.9176511705462710e-03 -3.8680117749755392e-03 7.6658966753000623e-04 1.1533277438591234e-02 -2.1209168069805627e-03 3.3389963331754576e-03 1.4439304170869551e-02 -9.2842591311021838e-04 -6.3134251696912004e-03 -8.2431035183574541e-04 9.6498087650671643e-04 -5.7455677517410826e-03 -1.3414556073292316e-02 -1.7533679451329722e-04 2.6523764060072792e-02 2.0788744876338080e-03 -7.9764469281149298e-04 -4.0342418245699931e-03 6.5402478006705584e-03 3.8580721891749617e-04 -6.2023721399483665e-03 -1.8464407715963859e-03 2.0924462043975180e-03 -9.1410018373659259e-03 -7.7219475563209648e-03 5.7908990759384120e-04 1.5738483300683269e-03 7.4882829387149603e-04 -3.3834984176496436e-03 1.3648787626626831e-02 1.6965844840780720e-02 -1.7538655359681819e-02 -3.1838170870986034e-04 -2.7141939573925886e-02 -1.2308717149122508e-02 -1.2869809167727637e-02 -3.4141809255947082e-03 -6.1910013324636710e-03 2.0788744876338089e-03 6.3685187990030062e-02 1.7932947235808360e-02 1.8610913264238124e-02 -6.0389767455610666e-03 5.1335178816542433e-03 -2.3917007671054010e-03 -4.0659216560234385e-02 5.9024606697508433e-03 -2.0099035575719612e-02 -2.3005354932554442e-02 1.0452946471704205e-02 1.3403518407637349e-03 1.9608635907059743e-02 -2.2329115867651076e-03 7.4681519838279984e-03 6.2767512225356892e-03 -2.4957914582785633e-02 -5.4210194907435925e-03 -1.0267747165231374e-02 -2.2224516555129491e-02 -1.6938999450055323e-02 1.4342391985528679e-03 -9.2932330162110686e-03 -7.9764469281149331e-04 1.7932947235808360e-02 4.2082350293086962e-02 1.9495731888121547e-02 8.8817532717033396e-05 -2.1336384316595239e-03 -1.2752175199421041e-05 -1.4495051073847427e-02 -1.8394630779366298e-03 -1.2978305462815899e-02 -7.3293601768456371e-03 2.0599326957400497e-02 9.1848373996761684e-03 6.3594032263105029e-03 7.0796979151765737e-03 2.2092101590911534e-02 5.4366055212851806e-03 -1.4320767816400017e-02 -7.2705652728579694e-03 -1.0192279510912009e-02 -1.7343262648595870e-02 -2.3768267698025123e-02 1.5736544168747915e-03 -3.3610667592323166e-03 -4.0342418245699931e-03 1.8610913264238124e-02 1.9495731888121544e-02 4.4247921080983250e-02 2.4573936807544705e-04 6.2721631002301572e-04 -8.0890157864958751e-03 -1.5575281568711723e-02 -1.6102030365878657e-03 -2.6862644397977288e-02 -8.1085683555884094e-03 9.4326541474949368e-03 3.6847123080314547e-03 8.0092168647386188e-03 5.2841574566306893e-03 5.4943465493639387e-03 2.5486888620197675e-03 -4.1142940356861451e-03 -3.6004800085463334e-03 -6.3990381744707236e-03 -2.4950255453625434e-04 -2.0199827681910632e-04 -5.6328768285907101e-03 6.4219894202784140e-03 6.5402478006705575e-03 -6.0389767455610666e-03 8.8817532717033856e-05 2.4573936807544754e-04 2.4240132719570408e-02 -1.1583908912260441e-02 -1.2498069319662993e-02 -6.4746808301923888e-03 -2.5224919720307701e-03 -3.2036285971462500e-03 -5.6106715350998431e-03 6.6752330648874748e-03 7.2238424840647400e-03 3.3674225323245587e-03 -7.0698047215089913e-03 3.5598574264790882e-03 3.5078019636892938e-03 -1.0593756809135469e-03 9.1632520128113028e-04 1.0024678634876053e-02 -7.3049714158117994e-03 -2.7124936767760782e-03 6.8136656365701273e-03 -6.9165621896844116e-03 3.8580721891749606e-04 5.1335178816542450e-03 -2.1336384316595226e-03 6.2721631002301572e-04 -1.1583908912260443e-02 2.2209243314944248e-02 -1.9178525741036579e-04 -5.3943460476721175e-03 5.2768783880729649e-03 -2.1668280702550943e-03 -3.8249300504260993e-03 -3.0017692634389439e-03 -4.1809915225919550e-04 -4.6764791064310548e-03 1.4341253381949979e-03 -9.1088811590456960e-03 -8.2878903385289332e-03 1.2958385743034857e-03 3.5507642095376395e-03 1.3062027967884714e-03 -7.0265307625246747e-05 -1.9442299442684044e-03 6.5776864407449363e-03 5.0667870205950048e-04 -6.2023721399483665e-03 -2.3917007671054010e-03 -1.2752175199420553e-05 -8.0890157864958751e-03 -1.2498069319662995e-02 -1.9178525741036536e-04 2.1738194945521736e-02 3.1851265358685361e-03 -1.9816159295879244e-03 5.8260048377258081e-03 1.3257805129595434e-02 -9.8022394473502666e-04 -5.7704649630268470e-03 -1.1491604777000544e-03 4.9871610985425946e-03 -2.0525840538228896e-02 -2.2932131690465461e-02 1.3788289011375705e-02 7.1113198502444454e-04 2.3152522404528489e-02 1.8257115110692529e-02 1.8683598772962183e-02 -5.8934222535259951e-03 5.7026155678314844e-03 -1.8464407715963855e-03 -4.0659216560234385e-02 -1.4495051073847427e-02 -1.5575281568711727e-02 -6.4746808301923897e-03 -5.3943460476721175e-03 3.1851265358685370e-03 6.0427025459352308e-02 -5.0234367955492038e-03 1.6589216486887260e-02 1.9064911265988506e-02 -1.7822346871373570e-02 -1.2215109022054057e-03 -2.6685007795451091e-02 -5.0585319282493739e-03 5.1000757028439835e-03 2.9328029912060885e-03 -5.0206786718400582e-03 5.0473387139580751e-03 -2.2938497930452182e-04 -3.5361682791540902e-03 6.0178672585704104e-03 5.7889703568271165e-03 -8.0757711387903879e-03 2.0924462043975180e-03 5.9024606697508433e-03 -1.8394630779366298e-03 -1.6102030365878651e-03 -2.5224919720307709e-03 5.2768783880729666e-03 -1.9816159295879244e-03 -5.0234367955492030e-03 2.0115050624823286e-02 -5.2950729316085981e-03 -3.0073275147922602e-03 -1.8613159169257117e-03 -9.3708359819856014e-03 -3.8415927561072875e-03 4.2857822581371394e-03 -2.4326675700667797e-02 -1.1692131374152592e-02 1.4832258599281186e-02 -5.7466109604967892e-05 1.0752307616539333e-02 7.9815880379905946e-03 2.1065822069887996e-02 4.1533656766616130e-03 3.5504062296246993e-03 -9.1410018373659259e-03 -2.0099035575719612e-02 -1.2978305462815901e-02 -2.6862644397977288e-02 -3.2036285971462513e-03 -2.1668280702550943e-03 5.8260048377258089e-03 1.6589216486887260e-02 -5.2950729316085972e-03 4.1209225342285175e-02 1.2481459540576173e-02 -1.0209828660354036e-02 -7.7132642042830020e-03 -8.9815537736459387e-03 2.2707717219880019e-03 -1.0778806605860239e-02 -1.0220323570928818e-02 6.4081710452342650e-03 3.7594128750015271e-03 8.1781515547081629e-03 5.9137462229010051e-03 5.3085686095081467e-03 1.2023107729623008e-03 3.9176511705462710e-03 -7.7219475563209666e-03 -2.3005354932554439e-02 -7.3293601768456371e-03 -8.1085683555884112e-03 -5.6106715350998431e-03 -3.8249300504260993e-03 1.3257805129595434e-02 1.9064911265988502e-02 -3.0073275147922602e-03 1.2481459540576173e-02 2.5736380858190182e-02 -4.3487224186055488e-03 -8.1979236369116634e-03 -1.5345404413266059e-02 -5.2940000612598506e-03 1.3695972057750213e-02 6.5809786553159780e-03 -2.1429252287960766e-02 -9.9961545267337196e-05 -1.3125844502873830e-02 -2.4421978035706941e-02 -1.3352496291522997e-02 -2.8994878382404862e-03 -3.8680117749755384e-03 5.7908990759384120e-04 1.0452946471704210e-02 2.0599326957400500e-02 9.4326541474949351e-03 6.6752330648874756e-03 -3.0017692634389435e-03 -9.8022394473502644e-04 -1.7822346871373570e-02 -1.8613159169257121e-03 -1.0209828660354039e-02 -4.3487224186055514e-03 3.9277000382867251e-02 9.3479432904039581e-04 1.4487243439185791e-02 5.2790444340806795e-03 -7.7094560837927500e-04 3.5717501249888785e-03 -6.9567071356458363e-04 -4.0585517698162729e-03 -5.0723372890579569e-04 -5.6806599825178720e-03 -7.7718439172015080e-03 -3.0404945523997695e-03 7.6658966753000623e-04 1.5738483300683265e-03 1.3403518407637347e-03 9.1848373996761684e-03 3.6847123080314538e-03 7.2238424840647400e-03 -4.1809915225919560e-04 -5.7704649630268478e-03 -1.2215109022054066e-03 -9.3708359819856014e-03 -7.7132642042830029e-03 -8.1979236369116634e-03 9.3479432904039592e-04 2.0826509824607122e-02 8.3121837060528008e-04 -1.1425585997879665e-04 1.0427845830485805e-02 6.9555782578759520e-03 -1.3816770390945475e-02 -6.2410846161341970e-05 -1.4451023104198874e-02 -9.9308259906249075e-03 -9.8239842621938682e-03 -5.7212584887897169e-03 1.1533277438591236e-02 7.4882829387149582e-04 1.9608635907059743e-02 6.3594032263105029e-03 8.0092168647386171e-03 3.3674225323245613e-03 -4.6764791064310557e-03 -1.1491604777000544e-03 -2.6685007795451091e-02 -3.8415927561072870e-03 -8.9815537736459387e-03 -1.5345404413266060e-02 1.4487243439185792e-02 8.3121837060528051e-04 3.2271057104445493e-02 861 862 863 906 907 908 918 919 920 873 874 875 864 865 866 909 910 911 921 922 923 876 877 878 2.7741640078416095e-02 -4.1279432744430918e-03 -6.1166554741805728e-03 -4.7683511576631227e-03 -7.5835838698578789e-03 -7.7273870997050190e-03 -4.4213058453654100e-03 -8.3525285712779732e-04 -2.0285024060425409e-03 5.6044051819925892e-03 -7.0448706455356546e-04 -5.8501272333758595e-03 -8.9486597278966306e-04 4.4211454341758346e-03 7.6807175516937793e-03 -9.2361259159806711e-03 -9.2620344412717591e-04 6.9654082043565674e-03 -7.2669185794166889e-03 3.8703736706897250e-03 5.8393653166851156e-03 -6.7584777891931246e-03 5.8859514052439473e-03 1.2371811405685325e-03 -4.1279432744430918e-03 3.7326122421518580e-02 1.7266024198642062e-02 -8.0043673975117059e-03 -1.7213742500525363e-03 -1.2756826781973010e-03 -8.4556351772271665e-03 -1.9586225593175143e-02 -1.2933561900686385e-02 -2.5073207423526766e-04 -4.3133024921290846e-03 3.0613061970893576e-03 4.1680965778427420e-03 1.5010060976926209e-02 1.3370158519244925e-02 2.2445397410832358e-03 -1.1012534106035156e-03 -1.0215107687230779e-02 4.0040820904338349e-03 -1.6309225383030888e-02 -1.5535222031188274e-02 1.0421959514057416e-02 -9.3048022694536148e-03 6.2620853823263864e-03 -6.1166554741805710e-03 1.7266024198642062e-02 5.3376294123148246e-02 -8.9477701191012886e-03 -3.3572986291384183e-04 -3.1369124459287190e-02 -1.3218001256240976e-02 -1.5914895115849943e-02 -2.5680538089719061e-02 -5.8658629465373827e-03 3.6926509359182921e-03 3.0995339502415644e-02 8.0809115431154134e-03 1.3138760413350697e-02 2.2031239309367574e-02 7.0851037457021994e-03 3.6612844752189908e-03 -3.6396087418626148e-02 6.3549893277171478e-03 -1.6368935326503596e-02 -2.9816163963445802e-02 1.2627285179525462e-02 -5.1391597178626503e-03 1.6859040996146733e-02 -4.7683511576631218e-03 -8.0043673975117059e-03 -8.9477701191012886e-03 4.0180492509762404e-02 -9.9720145144950728e-03 1.6902645979994933e-02 2.0350387848628977e-02 3.0606988892313402e-03 1.4328211739694615e-02 -4.3506577373809367e-03 6.0175238912795392e-03 -1.4863338214930117e-02 -2.4364569535259974e-02 -7.0749049349849366e-03 -1.5285588188532222e-02 -3.7912748718906371e-04 -3.9118423059006013e-03 1.0502284487367789e-02 -5.6415678198507525e-03 1.1032095396281470e-02 1.3194881863052149e-02 -2.1026606621047526e-02 8.8528109760999656e-03 -1.5831327547545855e-02 -7.5835838698578789e-03 -1.7213742500525398e-03 -3.3572986291384378e-04 -9.9720145144950745e-03 2.9116272461742726e-02 -9.8158670106957766e-03 6.9117923727508228e-04 -3.9153482607001168e-03 1.7869796489338803e-03 7.0433507457314524e-04 -1.3790232187806107e-02 1.2809847206178615e-02 3.3272282751079093e-03 -1.0690881352270719e-03 2.7841197750141920e-03 -2.2665005120450317e-03 1.0783693017717332e-02 -1.1229084098848015e-02 6.0081092009768335e-03 -8.4292895928275938e-03 -5.4950394484693348e-03 9.0912471084650115e-03 -1.0974633052846624e-02 9.4947737908002809e-03 -7.7273870997050190e-03 -1.2756826781972993e-03 -3.1369124459287190e-02 1.6902645979994933e-02 -9.8158670106957783e-03 4.0270616569071292e-02 1.4463013627336652e-02 3.2967537322532671e-03 1.8437814928269881e-02 -2.3668118517986450e-03 1.0556786275648961e-02 -3.0522333052821191e-02 -1.5461720995872643e-02 -7.0909405494393981e-03 -2.1671451302592678e-02 7.5319582654880994e-03 -1.0552600534684389e-02 2.7268991048822057e-02 1.3445228165805739e-03 6.2968043877553751e-03 1.8389354660998641e-02 -1.4686220742023947e-02 8.5847463773592592e-03 -2.0803868392460810e-02 -4.4213058453654109e-03 -8.4556351772271682e-03 -1.3218001256240976e-02 2.0350387848628977e-02 6.9117923727508228e-04 1.4463013627336650e-02 4.0494118670243204e-02 1.3677008423643736e-02 1.4422959236760227e-02 -5.2800895396035519e-03 6.1087676788455191e-03 -9.9064038508245283e-03 -2.0959605910260797e-02 -1.2271483128974220e-02 -1.3605778893127692e-02 -5.6377484446535238e-03 -8.2413041076801873e-03 1.4841623513441966e-02 -1.6814256662390017e-04 5.4139852269645839e-03 9.0958288551458745e-03 -2.4377614212365010e-02 3.0774818471526549e-03 -1.6093241232491517e-02 -8.3525285712779764e-04 -1.9586225593175143e-02 -1.5914895115849943e-02 3.0606988892313402e-03 -3.9153482607001168e-03 3.2967537322532671e-03 1.3677008423643734e-02 3.5363249151347004e-02 1.1871072569818820e-02 5.9815566890154227e-03 -2.3061003699390331e-03 -5.7071590227892538e-03 -1.2503771457695968e-02 -1.6171422720798623e-02 -1.1385207759638100e-02 -5.7639079053441889e-03 -8.3062774429027621e-03 1.1366777128866457e-02 3.4744764501854642e-03 1.6342634555296373e-02 1.3984870771325771e-02 -7.0908082319080020e-03 -1.4205093191276945e-03 -7.5122123039870099e-03 -2.0285024060425418e-03 -1.2933561900686385e-02 -2.5680538089719065e-02 1.4328211739694615e-02 1.7869796489338812e-03 1.8437814928269881e-02 1.4422959236760223e-02 1.1871072569818820e-02 3.6913466111147597e-02 -9.2549200045328149e-03 -5.0269406879155628e-03 -3.0779605330295418e-02 -1.2571456821537017e-02 -1.0327831400129401e-02 -1.7163878828093452e-02 2.4858092454457673e-03 -9.4372823094521598e-04 1.7294757513906342e-02 7.0620311600048027e-03 1.3301726876266249e-02 2.2742874635736182e-02 -1.4444132149793034e-02 2.2722831246576084e-03 -2.1764890940952058e-02 5.6044051819925866e-03 -2.5073207423526733e-04 -5.8658629465373835e-03 -4.3506577373809367e-03 7.0433507457314524e-04 -2.3668118517986459e-03 -5.2800895396035528e-03 5.9815566890154227e-03 -9.2549200045328149e-03 2.8170382545262905e-02 2.8271515616520538e-03 -6.5209541795669089e-03 -6.7793593945113945e-03 -5.6198074777517584e-03 2.4178247745384714e-03 -7.1816426065492061e-03 -2.5645899028540332e-03 6.2355876632419118e-03 -9.4686983180130840e-03 2.1417327421158084e-03 6.5320261557666078e-03 -7.1434013119731565e-04 -3.2196466125153731e-03 8.8231103888887653e-03 -7.0448706455356535e-04 -4.3133024921290838e-03 3.6926509359182947e-03 6.0175238912795392e-03 -1.3790232187806107e-02 1.0556786275648959e-02 6.1087676788455191e-03 -2.3061003699390323e-03 -5.0269406879155628e-03 2.8271515616520534e-03 3.2095915408051852e-02 -1.3068245554675707e-02 -7.9111507865065323e-03 -9.3459426068368320e-03 -1.0718640974992314e-03 -2.6884414263584075e-03 -1.0871891370357871e-02 1.2028509639178959e-02 -9.3418542082154637e-04 -1.3919038114134849e-03 3.4323191490276969e-03 -2.7151784335370582e-03 9.9234574304305628e-03 -1.0543215659683408e-02 -5.8501272333758595e-03 3.0613061970893567e-03 3.0995339502415644e-02 -1.4863338214930117e-02 1.2809847206178617e-02 -3.0522333052821194e-02 -9.9064038508245283e-03 -5.7071590227892547e-03 -3.0779605330295425e-02 -6.5209541795669089e-03 -1.3068245554675706e-02 5.9750934487325276e-02 1.4354476894624603e-02 1.0869421907239399e-02 1.5790895713384288e-02 6.8402910740955284e-03 1.2609640027791524e-02 -3.5261033930588943e-02 7.4274118848068277e-03 -1.0379886243937294e-02 -3.6545378412566949e-02 8.5186436251704495e-03 -1.0194924516896634e-02 2.6571181023147289e-02 -8.9486597278966480e-04 4.1680965778427429e-03 8.0809115431154134e-03 -2.4364569535259974e-02 3.3272282751079093e-03 -1.5461720995872643e-02 -2.0959605910260793e-02 -1.2503771457695968e-02 -1.2571456821537017e-02 -6.7793593945113945e-03 -7.9111507865065323e-03 1.4354476894624603e-02 4.2285525146652757e-02 1.3418456761367520e-02 1.4834499004315899e-02 -4.7320740249423860e-03 6.4301545923345430e-03 -1.0481377630097616e-02 -4.0591431123646318e-03 -8.8263440318067567e-03 -1.3177410104795763e-02 1.9504092803476081e-02 1.8973300693565479e-03 1.4422078110247117e-02 4.4211454341758346e-03 1.5010060976926209e-02 1.3138760413350695e-02 -7.0749049349849366e-03 -1.0690881352270719e-03 -7.0909405494393981e-03 -1.2271483128974220e-02 -1.6171422720798623e-02 -1.0327831400129399e-02 -5.6198074777517567e-03 -9.3459426068368320e-03 1.0869421907239397e-02 1.3418456761367516e-02 3.6886208620086305e-02 1.2030179873241197e-02 6.0458280751549782e-03 -1.8993126734616213e-03 -6.0857769074362262e-03 -6.4801006997004286e-04 -1.9449362747446533e-02 -1.5431721122920527e-02 1.7287753409826279e-03 -3.9611407132418321e-03 2.8979077860942590e-03 7.6807175516937793e-03 1.3370158519244925e-02 2.2031239309367574e-02 -1.5285588188532220e-02 2.7841197750141933e-03 -2.1671451302592678e-02 -1.3605778893127691e-02 -1.1385207759638104e-02 -1.7163878828093448e-02 2.4178247745384705e-03 -1.0718640974992316e-03 1.5790895713384288e-02 1.4834499004315896e-02 1.2030179873241200e-02 3.9828823839810852e-02 -8.4882114865346935e-03 -4.1210242078037170e-03 -3.1210032487703258e-02 -1.9351563710110957e-03 -1.3857330363414189e-02 -2.6132221754299426e-02 1.4381693608657552e-02 2.2509682608549252e-03 1.8526625510126092e-02 -9.2361259159806711e-03 2.2445397410832358e-03 7.0851037457021985e-03 -3.7912748718906637e-04 -2.2665005120450317e-03 7.5319582654880994e-03 -5.6377484446535238e-03 -5.7639079053441872e-03 2.4858092454457682e-03 -7.1816426065492061e-03 -2.6884414263584075e-03 6.8402910740955284e-03 -4.7320740249423860e-03 6.0458280751549773e-03 -8.4882114865346935e-03 2.4444105265546776e-02 3.0054125091865912e-03 -6.9944134306666548e-03 6.6513364207116173e-03 -1.1025216144106107e-03 -6.2770303983640226e-03 -3.9287232069435416e-03 5.2559113273343400e-04 -2.1835070151662236e-03 -9.2620344412717580e-04 -1.1012534106035151e-03 3.6612844752189908e-03 -3.9118423059006004e-03 1.0783693017717330e-02 -1.0552600534684389e-02 -8.2413041076801891e-03 -8.3062774429027621e-03 -9.4372823094521631e-04 -2.5645899028540332e-03 -1.0871891370357871e-02 1.2609640027791524e-02 6.4301545923345430e-03 -1.8993126734616222e-03 -4.1210242078037179e-03 3.0054125091865912e-03 2.8469874908403220e-02 -1.3540867993089453e-02 -1.5928474865591091e-05 -3.5988503073436928e-03 1.7835696625619272e-03 6.2243011339064534e-03 -1.3475982721451087e-02 1.1103726800950328e-02 6.9654082043565666e-03 -1.0215107687230779e-02 -3.6396087418626155e-02 1.0502284487367789e-02 -1.1229084098848015e-02 2.7268991048822057e-02 1.4841623513441968e-02 1.1366777128866457e-02 1.7294757513906342e-02 6.2355876632419101e-03 1.2028509639178958e-02 -3.5261033930588943e-02 -1.0481377630097616e-02 -6.0857769074362253e-03 -3.1210032487703269e-02 -6.9944134306666539e-03 -1.3540867993089453e-02 5.6310879233163205e-02 -6.3621558482812417e-03 5.3287032111094708e-03 3.3002675032354330e-02 -1.4706956959362721e-02 1.2346846707449580e-02 -3.1010148991327556e-02 -7.2669185794166881e-03 4.0040820904338349e-03 6.3549893277171487e-03 -5.6415678198507525e-03 6.0081092009768335e-03 1.3445228165805739e-03 -1.6814256662390104e-04 3.4744764501854651e-03 7.0620311600048018e-03 -9.4686983180130840e-03 -9.3418542082154637e-04 7.4274118848068277e-03 -4.0591431123646318e-03 -6.4801006997004329e-04 -1.9351563710110951e-03 6.6513364207116173e-03 -1.5928474865591037e-05 -6.3621558482812417e-03 2.5052468345881092e-02 -4.3619128640105228e-03 -6.4308255933507039e-03 -5.0993343703236525e-03 -7.5266309119284280e-03 -7.4608173764663119e-03 3.8703736706897245e-03 -1.6309225383030888e-02 -1.6368935326503596e-02 1.1032095396281472e-02 -8.4292895928275938e-03 6.2968043877553743e-03 5.4139852269645848e-03 1.6342634555296373e-02 1.3301726876266247e-02 2.1417327421158084e-03 -1.3919038114134849e-03 -1.0379886243937294e-02 -8.8263440318067585e-03 -1.9449362747446530e-02 -1.3857330363414190e-02 -1.1025216144106107e-03 -3.5988503073436954e-03 5.3287032111094717e-03 -4.3619128640105228e-03 3.5086397181803793e-02 1.7762822266262322e-02 -8.1674085258236963e-03 -2.2503998950379632e-03 -2.0839048075383336e-03 5.8393653166851156e-03 -1.5535222031188272e-02 -2.9816163963445799e-02 1.3194881863052151e-02 -5.4950394484693348e-03 1.8389354660998641e-02 9.0958288551458762e-03 1.3984870771325771e-02 2.2742874635736182e-02 6.5320261557666078e-03 3.4323191490276969e-03 -3.6545378412566949e-02 -1.3177410104795763e-02 -1.5431721122920529e-02 -2.6132221754299426e-02 -6.2770303983640226e-03 1.7835696625619279e-03 3.3002675032354337e-02 -6.4308255933507048e-03 1.7762822266262322e-02 5.0791871055327051e-02 -8.7768360941392603e-03 -5.0159924659958551e-04 -3.2433011254104020e-02 -6.7584777891931246e-03 1.0421959514057418e-02 1.2627285179525462e-02 -2.1026606621047526e-02 9.0912471084650115e-03 -1.4686220742023947e-02 -2.4377614212365006e-02 -7.0908082319080020e-03 -1.4444132149793036e-02 -7.1434013119731435e-04 -2.7151784335370573e-03 8.5186436251704530e-03 1.9504092803476081e-02 1.7287753409826281e-03 1.4381693608657552e-02 -3.9287232069435407e-03 6.2243011339064534e-03 -1.4706956959362721e-02 -5.0993343703236533e-03 -8.1674085258236963e-03 -8.7768360941392586e-03 4.2401003527594079e-02 -9.4928879061427478e-03 1.7086523531965488e-02 5.8859514052439473e-03 -9.3048022694536148e-03 -5.1391597178626503e-03 8.8528109760999639e-03 -1.0974633052846622e-02 8.5847463773592592e-03 3.0774818471526549e-03 -1.4205093191276942e-03 2.2722831246576084e-03 -3.2196466125153731e-03 9.9234574304305611e-03 -1.0194924516896634e-02 1.8973300693565483e-03 -3.9611407132418338e-03 2.2509682608549257e-03 5.2559113273343357e-04 -1.3475982721451087e-02 1.2346846707449581e-02 -7.5266309119284289e-03 -2.2503998950379614e-03 -5.0159924659958508e-04 -9.4928879061427478e-03 3.1464010540728254e-02 -9.6191609889625020e-03 1.2371811405685327e-03 6.2620853823263864e-03 1.6859040996146733e-02 -1.5831327547545855e-02 9.4947737908002827e-03 -2.0803868392460810e-02 -1.6093241232491517e-02 -7.5122123039870108e-03 -2.1764890940952061e-02 8.8231103888887687e-03 -1.0543215659683408e-02 2.6571181023147289e-02 1.4422078110247117e-02 2.8979077860942556e-03 1.8526625510126096e-02 -2.1835070151662236e-03 1.1103726800950332e-02 -3.1010148991327556e-02 -7.4608173764663110e-03 -2.0839048075383328e-03 -3.2433011254104027e-02 1.7086523531965488e-02 -9.6191609889625003e-03 4.4055072049424333e-02 906 907 908 951 952 953 963 964 965 918 919 920 909 910 911 954 955 956 966 967 968 921 922 923 3.1218995755629371e-02 -4.3779938725154845e-03 -6.5390267796912802e-03 -6.3815953479617387e-03 -8.3144911607344833e-03 -8.9669614406419906e-03 -5.2063781337527990e-03 -1.0558400215979311e-03 -2.4160323138442590e-03 6.3189264661054458e-03 -7.8587007309766804e-04 -6.2644423551999279e-03 -2.0949595635516674e-04 5.0714916837257314e-03 8.8777599701554584e-03 -1.0576183172016043e-02 -1.0028190591609399e-03 7.4804184237686729e-03 -8.0539494723705900e-03 4.0525098630510474e-03 6.2725110452282132e-03 -7.1103201392784757e-03 6.4130126403297268e-03 1.5557734502251194e-03 -4.3779938725154845e-03 4.1982078755915274e-02 1.9346965065626515e-02 -8.7268339380783110e-03 -2.8428971415313609e-03 -1.5228871768366199e-03 -9.4676588945391289e-03 -2.1762234949233059e-02 -1.4587850862920158e-02 -3.6623384553346561e-04 -4.5140481746376287e-03 3.5959398019959005e-03 4.5785023970775019e-03 1.7073013661261988e-02 1.5040996202830052e-02 2.4225717597801308e-03 -1.8389234215774937e-03 -1.1465829896661910e-02 4.4000715886005175e-03 -1.8063255458643297e-02 -1.7487375428585611e-02 1.1537574805208246e-02 -1.0033733271554400e-02 7.0800422945518290e-03 -6.5390267796912819e-03 1.9346965065626515e-02 6.0607934785125821e-02 -9.9119677685590261e-03 -4.8505246989114046e-04 -3.6433965023683998e-02 -1.4950472760732331e-02 -1.7690095273454484e-02 -2.9061082103995384e-02 -6.4812588125838641e-03 4.0314144382518260e-03 3.5330120977491525e-02 8.8803440819769427e-03 1.4659577526556998e-02 2.5568659720836513e-02 7.6484733489402251e-03 3.9456281828682124e-03 -4.1694762433515609e-02 7.0523344740136351e-03 -1.8147195626861047e-02 -3.3792655287243942e-02 1.4301574216635698e-02 -5.6612418430968666e-03 1.9475749364985084e-02 -6.3815953479617405e-03 -8.7268339380783110e-03 -9.9119677685590261e-03 4.5045202625325964e-02 -1.0937134279525999e-02 1.9068094750107064e-02 2.2748394248224241e-02 3.3607512837251418e-03 1.6046797231847470e-02 -5.0843833825706536e-03 6.5925539609839080e-03 -1.6673793275390199e-02 -2.7271643358408575e-02 -7.7724335127720978e-03 -1.7154659678665810e-02 3.5055587235408557e-04 -4.2149608995262168e-03 1.1607365936416977e-02 -5.9898334266730658e-03 1.2070475555655592e-02 1.4749091950234881e-02 -2.3416697230290245e-02 9.6275818295379727e-03 -1.7730929145991354e-02 -8.3144911607344815e-03 -2.8428971415313600e-03 -4.8505246989114046e-04 -1.0937134279526002e-02 3.2836815130056062e-02 -1.1007460060757944e-02 7.1228246138317609e-04 -4.0401345268061993e-03 2.0126230420180061e-03 8.4322485789344525e-04 -1.5381875128199310e-02 1.4406064992102511e-02 3.6337391645923363e-03 -1.7048305769021385e-03 3.0557579661055277e-03 -2.6285620586329467e-03 1.2327125442416133e-02 -1.2529585579257657e-02 6.5765672962533007e-03 -9.0412190262259464e-03 -6.1115425768683354e-03 1.0114373718771170e-02 -1.2152984172807229e-02 1.0659194686549033e-02 -8.9669614406419941e-03 -1.5228871768366192e-03 -3.6433965023683998e-02 1.9068094750107071e-02 -1.1007460060757944e-02 4.6079458728173102e-02 1.6415940238156394e-02 3.8089512536959771e-03 2.1129833907713846e-02 -2.6619423536607761e-03 1.1736282810104600e-02 -3.4796969174930012e-02 -1.7460654108393484e-02 -7.9135492882233469e-03 -2.5024977494681005e-02 8.8048711399946258e-03 -1.1768519353133096e-02 3.1551884611468253e-02 1.5161149561963825e-03 7.0941362673314582e-03 2.1235136321414733e-02 -1.6715463181758219e-02 9.5730455478189574e-03 -2.3740401875474930e-02 -5.2063781337527990e-03 -9.4676588945391323e-03 -1.4950472760732331e-02 2.2748394248224241e-02 7.1228246138317565e-04 1.6415940238156394e-02 4.4713533514200779e-02 1.5143531958872835e-02 1.6233019078763532e-02 -5.8369712692616874e-03 6.7813801717520640e-03 -1.1479567542722292e-02 -2.3269275334174153e-02 -1.3605011735262065e-02 -1.5378642441018230e-02 -5.8584213040725214e-03 -9.0180132287173854e-03 1.6799272550222222e-02 -1.5035834890883798e-04 6.0897414377528297e-03 1.0481242583405697e-02 -2.7140523372255029e-02 3.3637478287576604e-03 -1.8120791706074987e-02 -1.0558400215979309e-03 -2.1762234949233059e-02 -1.7690095273454484e-02 3.3607512837251423e-03 -4.0401345268061967e-03 3.8089512536959762e-03 1.5143531958872839e-02 3.8790872944126510e-02 1.3279803699744800e-02 6.5676636263472393e-03 -2.5414638353118031e-03 -6.5776760963122318e-03 -1.3707946649822609e-02 -1.7865217918338880e-02 -1.2741595295405099e-02 -6.1913968771656301e-03 -8.9064677403013180e-03 1.2745642970077091e-02 3.7722891907924641e-03 1.7955148733654662e-02 1.5681498769406832e-02 -7.8890525111515106e-03 -1.6305027077899363e-03 -8.5065300277528833e-03 -2.4160323138442590e-03 -1.4587850862920160e-02 -2.9061082103995384e-02 1.6046797231847466e-02 2.0126230420180061e-03 2.1129833907713849e-02 1.6233019078763532e-02 1.3279803699744800e-02 4.0953798771233743e-02 -1.0179657461324447e-02 -5.4568795445740113e-03 -3.4586739075658811e-02 -1.4092029509465573e-02 -1.1592781848831172e-02 -1.9477469595065432e-02 2.9684697514508239e-03 -1.0083106974090898e-03 1.9894227312544172e-02 7.7752089724290770e-03 1.4797181471930345e-02 2.5673263944789790e-02 -1.6335775749856615e-02 2.5562147400412642e-03 -2.4525833161561924e-02 6.3189264661054458e-03 -3.6623384553346658e-04 -6.4812588125838641e-03 -5.0843833825706562e-03 8.4322485789344514e-04 -2.6619423536607761e-03 -5.8369712692616857e-03 6.5676636263472393e-03 -1.0179657461324449e-02 3.0910966399242241e-02 3.0543594218099403e-03 -7.2128573686162266e-03 -7.2044104236469756e-03 -6.1285519287290280e-03 2.7154238165568280e-03 -7.9837956354496548e-03 -2.7672439607666784e-03 6.8909719571358906e-03 -1.0471699625477345e-02 2.2791727666362166e-03 7.2168406274051976e-03 -6.4863252894137150e-04 -3.4823909376576730e-03 9.7124795950874060e-03 -7.8587007309766847e-04 -4.5140481746376261e-03 4.0314144382518260e-03 6.5925539609839089e-03 -1.5381875128199310e-02 1.1736282810104600e-02 6.7813801717520640e-03 -2.5414638353118031e-03 -5.4568795445740113e-03 3.0543594218099398e-03 3.5228646424056868e-02 -1.4590422836674603e-02 -8.6659512292010816e-03 -1.0060900608682906e-02 -1.2339965140789346e-03 -2.8195278019689683e-03 -1.2071378841409679e-02 1.3392996917420658e-02 -9.8134986118028861e-04 -1.6446280111847740e-03 3.8871023793413499e-03 -3.1755945890979071e-03 1.0985648175369223e-02 -1.1766497649790887e-02 -6.2644423551999279e-03 3.5959398019959001e-03 3.5330120977491525e-02 -1.6673793275390199e-02 1.4406064992102511e-02 -3.4796969174930012e-02 -1.1479567542722294e-02 -6.5776760963122292e-03 -3.4586739075658818e-02 -7.2128573686162274e-03 -1.4590422836674600e-02 6.6854024161805276e-02 1.6073281759533108e-02 1.2121888424484034e-02 1.8365819495526514e-02 7.3603026010577522e-03 1.4057304467592645e-02 -4.0110162547467257e-02 8.2518381572746075e-03 -1.1626165571096216e-02 -4.1312513509393793e-02 9.9452380240631806e-03 -1.1386933182092022e-02 3.0256419672626565e-02 -2.0949595635516845e-04 4.5785023970775019e-03 8.8803440819769409e-03 -2.7271643358408579e-02 3.6337391645923367e-03 -1.7460654108393481e-02 -2.3269275334174153e-02 -1.3707946649822611e-02 -1.4092029509465573e-02 -7.2044104236469748e-03 -8.6659512292010799e-03 1.6073281759533108e-02 4.7568562524702686e-02 1.4739259467690117e-02 1.6732313069363784e-02 -6.7000363967524559e-03 6.8831256422789691e-03 -1.1594069846040814e-02 -4.8485574016403458e-03 -9.6535587769278914e-03 -1.4718288979435149e-02 2.1934856346275001e-02 2.1928299843126660e-03 1.6179103532461183e-02 5.0714916837257306e-03 1.7073013661261988e-02 1.4659577526556998e-02 -7.7724335127720961e-03 -1.7048305769021385e-03 -7.9135492882233469e-03 -1.3605011735262065e-02 -1.7865217918338876e-02 -1.1592781848831168e-02 -6.1285519287290289e-03 -1.0060900608682907e-02 1.2121888424484034e-02 1.4739259467690117e-02 4.1596636198533897e-02 1.3519202931205078e-02 6.5009839264764755e-03 -3.4388213771477010e-03 -6.6434641663701277e-03 -7.7186205012018264e-04 -2.1652776276009207e-02 -1.7339170239575284e-02 1.9661241489910457e-03 -3.9471031027150435e-03 3.1882966607538182e-03 8.8777599701554584e-03 1.5040996202830052e-02 2.5568659720836513e-02 -1.7154659678665814e-02 3.0557579661055277e-03 -2.5024977494680998e-02 -1.5378642441018230e-02 -1.2741595295405099e-02 -1.9477469595065439e-02 2.7154238165568280e-03 -1.2339965140789350e-03 1.8365819495526518e-02 1.6732313069363788e-02 1.3519202931205078e-02 4.5677127707613473e-02 -9.9112997555779857e-03 -4.8026517060453904e-03 -3.6663999846562094e-02 -2.1950709926913427e-03 -1.5402079936611229e-02 -2.9842726755227776e-02 1.6314176011877297e-02 2.5643663520000023e-03 2.1397566767559800e-02 -1.0576183172016041e-02 2.4225717597801304e-03 7.6484733489402242e-03 3.5055587235408362e-04 -2.6285620586329467e-03 8.8048711399946241e-03 -5.8584213040725232e-03 -6.1913968771656292e-03 2.9684697514508244e-03 -7.9837956354496548e-03 -2.8195278019689683e-03 7.3603026010577522e-03 -6.7000363967524559e-03 6.5009839264764746e-03 -9.9112997555779875e-03 2.8003500788096734e-02 3.1505058329087334e-03 -7.4587161088665388e-03 7.6623846410785188e-03 -1.0797690611276710e-03 -6.7346682775719100e-03 -4.8980047932386701e-03 6.4519427972988094e-04 -2.6774326994269924e-03 -1.0028190591609394e-03 -1.8389234215774927e-03 3.9456281828682115e-03 -4.2149608995262185e-03 1.2327125442416131e-02 -1.1768519353133096e-02 -9.0180132287173854e-03 -8.9064677403013198e-03 -1.0083106974090894e-03 -2.7672439607666784e-03 -1.2071378841409677e-02 1.4057304467592645e-02 6.8831256422789691e-03 -3.4388213771477014e-03 -4.8026517060453912e-03 3.1505058329087334e-03 3.2479610863709749e-02 -1.5035367061923975e-02 2.8423692165450141e-05 -3.4220729818455848e-03 2.1528674277813175e-03 6.9409819808180680e-03 -1.5129071943844099e-02 1.2459048740269374e-02 7.4804184237686729e-03 -1.1465829896661908e-02 -4.1694762433515609e-02 1.1607365936416975e-02 -1.2529585579257659e-02 3.1551884611468253e-02 1.6799272550222222e-02 1.2745642970077090e-02 1.9894227312544172e-02 6.8909719571358906e-03 1.3392996917420658e-02 -4.0110162547467250e-02 -1.1594069846040816e-02 -6.6434641663701294e-03 -3.6663999846562094e-02 -7.4587161088665380e-03 -1.5035367061923977e-02 6.4683113666753361e-02 -7.0394740043774814e-03 5.8793616191841983e-03 3.7815491186503306e-02 -1.6685768908258923e-02 1.3656245197531712e-02 -3.5475791949724125e-02 -8.0539494723705918e-03 4.4000715886005175e-03 7.0523344740136360e-03 -5.9898334266730658e-03 6.5765672962533007e-03 1.5161149561963823e-03 -1.5035834890883711e-04 3.7722891907924646e-03 7.7752089724290770e-03 -1.0471699625477345e-02 -9.8134986118028861e-04 8.2518381572746057e-03 -4.8485574016403458e-03 -7.7186205012018221e-04 -2.1950709926913422e-03 7.6623846410785179e-03 2.8423692165450141e-05 -7.0394740043774832e-03 2.7756338845906191e-02 -4.7314113950018433e-03 -7.1249732178873468e-03 -5.9043252119145313e-03 -8.2927284615094132e-03 -8.2359783449575327e-03 4.0525098630510483e-03 -1.8063255458643297e-02 -1.8147195626861047e-02 1.2070475555655592e-02 -9.0412190262259447e-03 7.0941362673314582e-03 6.0897414377528289e-03 1.7955148733654662e-02 1.4797181471930345e-02 2.2791727666362166e-03 -1.6446280111847734e-03 -1.1626165571096216e-02 -9.6535587769278897e-03 -2.1652776276009204e-02 -1.5402079936611229e-02 -1.0797690611276710e-03 -3.4220729818455853e-03 5.8793616191841966e-03 -4.7314113950018433e-03 3.8694637992086292e-02 1.9788320953518623e-02 -9.0271603900382805e-03 -2.8258349718321583e-03 -2.3835591773961324e-03 6.2725110452282132e-03 -1.7487375428585614e-02 -3.3792655287243942e-02 1.4749091950234881e-02 -6.1115425768683345e-03 2.1235136321414733e-02 1.0481242583405697e-02 1.5681498769406832e-02 2.5673263944789790e-02 7.2168406274051976e-03 3.8871023793413495e-03 -4.1312513509393793e-02 -1.4718288979435149e-02 -1.7339170239575284e-02 -2.9842726755227776e-02 -6.7346682775719100e-03 2.1528674277813175e-03 3.7815491186503292e-02 -7.1249732178873468e-03 1.9788320953518627e-02 5.7054475562223150e-02 -1.0141755731379584e-02 -5.7170128501890473e-04 -3.6830471463065478e-02 -7.1103201392784757e-03 1.1537574805208246e-02 1.4301574216635698e-02 -2.3416697230290245e-02 1.0114373718771170e-02 -1.6715463181758223e-02 -2.7140523372255025e-02 -7.8890525111515106e-03 -1.6335775749856615e-02 -6.4863252894136933e-04 -3.1755945890979079e-03 9.9452380240631789e-03 2.1934856346274997e-02 1.9661241489910457e-03 1.6314176011877297e-02 -4.8980047932386701e-03 6.9409819808180671e-03 -1.6685768908258920e-02 -5.9043252119145295e-03 -9.0271603900382805e-03 -1.0141755731379584e-02 4.7183646929643309e-02 -1.0467247163500821e-02 1.9317775318677160e-02 6.4130126403297277e-03 -1.0033733271554400e-02 -5.6612418430968684e-03 9.6275818295379727e-03 -1.2152984172807229e-02 9.5730455478189574e-03 3.3637478287576613e-03 -1.6305027077899369e-03 2.5562147400412637e-03 -3.4823909376576734e-03 1.0985648175369223e-02 -1.1386933182092022e-02 2.1928299843126655e-03 -3.9471031027150435e-03 2.5643663520000018e-03 6.4519427972988051e-04 -1.5129071943844099e-02 1.3656245197531712e-02 -8.2927284615094132e-03 -2.8258349718321574e-03 -5.7170128501890646e-04 -1.0467247163500821e-02 3.4733581995173637e-02 -1.0729995527184143e-02 1.5557734502251194e-03 7.0800422945518290e-03 1.9475749364985081e-02 -1.7730929145991354e-02 1.0659194686549035e-02 -2.3740401875474930e-02 -1.8120791706074987e-02 -8.5065300277528833e-03 -2.4525833161561927e-02 9.7124795950874060e-03 -1.1766497649790889e-02 3.0256419672626562e-02 1.6179103532461180e-02 3.1882966607538190e-03 2.1397566767559800e-02 -2.6774326994269924e-03 1.2459048740269377e-02 -3.5475791949724125e-02 -8.2359783449575327e-03 -2.3835591773961316e-03 -3.6830471463065478e-02 1.9317775318677160e-02 -1.0729995527184143e-02 4.9442762644654997e-02 873 874 875 918 919 920 930 931 932 885 886 887 876 877 878 921 922 923 933 934 935 888 889 890 2.7434016469985473e-02 -5.3272544929741190e-03 -5.6771721354678213e-03 -4.8085696541133533e-03 -8.5159384091425157e-03 -6.0688904656089624e-03 -3.8675584141213367e-03 -6.8604758954739415e-04 -1.6964635704038386e-03 6.1024439626304276e-03 -1.6743352386620470e-03 -5.8798746812386334e-03 -1.2171358837421195e-03 5.1325217849712600e-03 6.5356031828099365e-03 -9.5030911008784670e-03 2.4199821216677576e-04 7.4567871135235182e-03 -7.3381398992023224e-03 5.0283594393312160e-03 5.3669602567269466e-03 -6.8019654805582981e-03 5.8006962938568236e-03 -3.6949700341150837e-05 -5.3272544929741190e-03 4.2271537622457472e-02 1.8482171289791870e-02 -9.2467072370521711e-03 -4.5519304601177625e-03 -6.8323564223206268e-03 -1.0074163835092631e-02 -2.4336303366490251e-02 -1.2725952248616425e-02 -1.3087607595933790e-03 -1.3699032950559682e-03 8.8167899815013041e-03 4.9934312775002541e-03 1.9726105297143217e-02 1.3757801064198796e-02 3.4509679171689971e-03 -3.8136336943086183e-03 -1.5834721112043308e-02 5.4014981398810037e-03 -2.1123906623069781e-02 -1.6264554206001102e-02 1.2110988990162042e-02 -6.8019654805582938e-03 1.0600821653489504e-02 -5.6771721354678230e-03 1.8482171289791870e-02 4.6471939469004797e-02 -7.3642921386723884e-03 -5.7612171976417128e-03 -3.0771857121892027e-02 -1.1325534181106567e-02 -1.6099774119102680e-02 -1.9883241944499572e-02 -6.2291804044726602e-03 9.3610471193892823e-03 2.9246494723946140e-02 7.1406994200204285e-03 1.3596424628076526e-02 1.7047803918301338e-02 6.7668455106236107e-03 -2.3320333469275568e-03 -3.4670764719564054e-02 6.0878122755858941e-03 -1.7209668673244576e-02 -2.3574607304955832e-02 1.0600821653489500e-02 -3.6949700341148885e-05 1.6134232979659227e-02 -4.8085696541133515e-03 -9.2467072370521711e-03 -7.3642921386723901e-03 4.0236821862901326e-02 -5.7833072221720131e-03 1.8666156174053500e-02 2.0575376108704850e-02 6.2354102181169831e-03 1.3323360131895558e-02 -4.1022928788932234e-03 3.2540590777278100e-03 -1.5864500268356528e-02 -2.4428687834846859e-02 -1.0337025306971883e-02 -1.3750502079738477e-02 -4.4510976923814281e-04 -2.0330779691411466e-03 1.1302347812861895e-02 -5.9036312114448125e-03 1.2882289000161203e-02 1.0897099041201008e-02 -2.1123906623069778e-02 5.0283594393312108e-03 -1.7209668673244572e-02 -8.5159384091425157e-03 -4.5519304601177625e-03 -5.7612171976417093e-03 -5.7833072221720131e-03 2.5028187415029081e-02 -6.1270419259526528e-03 4.0222394086093837e-03 -1.1085343619220782e-03 6.1342211010048681e-03 3.9785679076438386e-04 -9.8553992600386164e-03 8.0936975682771965e-03 -3.7204916474706565e-04 -3.4165383671775663e-03 -1.4462489227424148e-03 -1.0489975816488520e-03 7.1459861448740962e-03 -6.8318961876333746e-03 5.8986980384556657e-03 -5.9036312114448194e-03 -1.4932671089780845e-04 5.4014981398810081e-03 -7.3381398992023259e-03 6.0878122755858985e-03 -6.0688904656089650e-03 -6.8323564223206268e-03 -3.0771857121892020e-02 1.8666156174053500e-02 -6.1270419259526528e-03 4.3431658656139578e-02 1.4028674147829203e-02 7.6428145662164803e-03 1.6903809502184512e-02 -2.3558308884160189e-03 6.4247906896975271e-03 -3.4354499111198790e-02 -1.5760860595776201e-02 -1.1104668805318232e-02 -2.0367667812815571e-02 7.9046325448173804e-03 -6.2675974002504575e-03 3.1034624120212774e-02 -1.4932671089780078e-04 1.0897099041201012e-02 1.7698539072325353e-02 -1.6264554206001102e-02 5.3669602567269431e-03 -2.3574607304955836e-02 -3.8675584141213380e-03 -1.0074163835092628e-02 -1.1325534181106567e-02 2.0575376108704850e-02 4.0222394086093828e-03 1.4028674147829203e-02 3.9974513453113945e-02 1.6112340994218294e-02 1.1303711547267692e-02 -4.8650174619018450e-03 4.3175484219615656e-03 -1.0622292955161122e-02 -2.0615899397628149e-02 -1.4637930324834288e-02 -1.0968506563283242e-02 -5.7565765597551036e-03 -5.2893972934319440e-03 1.6040907557340223e-02 -1.1085343619220765e-03 6.2354102181170065e-03 7.6428145662164951e-03 -2.4336303366490272e-02 -6.8604758954739459e-04 -1.6099774119102690e-02 -6.8604758954739448e-04 -2.4336303366490255e-02 -1.6099774119102680e-02 6.2354102181169831e-03 -1.1085343619220765e-03 7.6428145662164803e-03 1.6112340994218294e-02 3.9974513453113918e-02 1.1303711547267685e-02 4.3175484219615682e-03 -4.8650174619018442e-03 -1.0622292955161110e-02 -1.4637930324834262e-02 -2.0615899397628153e-02 -1.0968506563283235e-02 -5.2893972934319484e-03 -5.7565765597550993e-03 1.6040907557340209e-02 4.0222394086093897e-03 2.0575376108704850e-02 1.4028674147829200e-02 -1.0074163835092621e-02 -3.8675584141213489e-03 -1.1325534181106562e-02 -1.6964635704038381e-03 -1.2725952248616423e-02 -1.9883241944499572e-02 1.3323360131895556e-02 6.1342211010048690e-03 1.6903809502184515e-02 1.1303711547267692e-02 1.1303711547267685e-02 3.2149019202954043e-02 -1.0092234705252705e-02 -1.0092234705252699e-02 -2.7392302001262556e-02 -9.7726761497125871e-03 -9.7726761497125975e-03 -1.3074844656545900e-02 3.5260338938174398e-03 3.5260338938174372e-03 1.4276992339484523e-02 6.1342211010048777e-03 1.3323360131895565e-02 1.6903809502184515e-02 -1.2725952248616437e-02 -1.6964635704038397e-03 -1.9883241944499582e-02 6.1024439626304267e-03 -1.3087607595933790e-03 -6.2291804044726593e-03 -4.1022928788932234e-03 3.9785679076438348e-04 -2.3558308884160189e-03 -4.8650174619018450e-03 4.3175484219615673e-03 -1.0092234705252705e-02 2.8536177494063990e-02 1.6590033262721749e-03 -7.3052148537647698e-03 -7.0453527636011497e-03 -5.2325591054782255e-03 3.2564273612472315e-03 -7.4006557972036199e-03 -1.4128125129922874e-03 6.9401956815721075e-03 -9.8553992600386164e-03 3.2540590777278135e-03 6.4247906896975227e-03 -1.3699032950559614e-03 -1.6743352386620477e-03 9.3610471193892857e-03 -1.6743352386620477e-03 -1.3699032950559677e-03 9.3610471193892823e-03 3.2540590777278104e-03 -9.8553992600386182e-03 6.4247906896975245e-03 4.3175484219615664e-03 -4.8650174619018433e-03 -1.0092234705252700e-02 1.6590033262721742e-03 2.8536177494063994e-02 -7.3052148537647707e-03 -5.2325591054782176e-03 -7.0453527636011566e-03 3.2564273612472306e-03 -1.4128125129922859e-03 -7.4006557972036199e-03 6.9401956815721092e-03 3.9785679076438283e-04 -4.1022928788932191e-03 -2.3558308884160184e-03 -1.3087607595933803e-03 6.1024439626304345e-03 -6.2291804044726628e-03 -5.8798746812386317e-03 8.8167899815013058e-03 2.9246494723946144e-02 -1.5864500268356528e-02 8.0936975682771965e-03 -3.4354499111198797e-02 -1.0622292955161121e-02 -1.0622292955161108e-02 -2.7392302001262560e-02 -7.3052148537647689e-03 -7.3052148537647724e-03 6.4030971068240933e-02 1.5441045294015522e-02 1.5441045294015545e-02 1.3048890830419331e-02 7.3203499147270236e-03 7.3203499147270201e-03 -3.9471551122892398e-02 8.0936975682771931e-03 -1.5864500268356545e-02 -3.4354499111198811e-02 8.8167899815013093e-03 -5.8798746812386282e-03 2.9246494723946154e-02 -1.2171358837421205e-03 4.9934312775002541e-03 7.1406994200204285e-03 -2.4428687834846863e-02 -3.7204916474706620e-04 -1.5760860595776201e-02 -2.0615899397628149e-02 -1.4637930324834264e-02 -9.7726761497125871e-03 -7.0453527636011514e-03 -5.2325591054782185e-03 1.5441045294015522e-02 4.1944493416423569e-02 1.6052137614183112e-02 1.1961606988277324e-02 -4.9469844665709344e-03 4.4014732253768053e-03 -1.1501570779582772e-02 -3.4165383671775715e-03 -1.0337025306971882e-02 -1.1104668805318220e-02 1.9726105297143217e-02 5.1325217849712643e-03 1.3596424628076512e-02 5.1325217849712600e-03 1.9726105297143217e-02 1.3596424628076526e-02 -1.0337025306971883e-02 -3.4165383671775663e-03 -1.1104668805318230e-02 -1.4637930324834288e-02 -2.0615899397628153e-02 -9.7726761497125975e-03 -5.2325591054782272e-03 -7.0453527636011575e-03 1.5441045294015542e-02 1.6052137614183115e-02 4.1944493416423589e-02 1.1961606988277333e-02 4.4014732253768174e-03 -4.9469844665709310e-03 -1.1501570779582788e-02 -3.7204916474706332e-04 -2.4428687834846887e-02 -1.5760860595776218e-02 4.9934312775002689e-03 -1.2171358837421158e-03 7.1406994200204476e-03 6.5356031828099383e-03 1.3757801064198796e-02 1.7047803918301338e-02 -1.3750502079738483e-02 -1.4462489227424148e-03 -2.0367667812815567e-02 -1.0968506563283241e-02 -1.0968506563283237e-02 -1.3074844656545900e-02 3.2564273612472328e-03 3.2564273612472302e-03 1.3048890830419331e-02 1.1961606988277324e-02 1.1961606988277331e-02 3.5430852585227449e-02 -9.3461810307691479e-03 -9.3461810307691445e-03 -2.8765170970072428e-02 -1.4462489227424205e-03 -1.3750502079738491e-02 -2.0367667812815571e-02 1.3757801064198801e-02 6.5356031828099348e-03 1.7047803918301352e-02 -9.5030911008784687e-03 3.4509679171689971e-03 6.7668455106236107e-03 -4.4510976923814189e-04 -1.0489975816488524e-03 7.9046325448173839e-03 -5.7565765597551036e-03 -5.2893972934319484e-03 3.5260338938174398e-03 -7.4006557972036190e-03 -1.4128125129922856e-03 7.3203499147270236e-03 -4.9469844665709318e-03 4.4014732253768165e-03 -9.3461810307691479e-03 2.4720065243080777e-02 1.6898460025016513e-03 -7.5720500860382905e-03 7.1459861448741023e-03 -2.0330779691411565e-03 -6.2675974002504593e-03 -3.8136336943086230e-03 2.4199821216677880e-04 -2.3320333469275568e-03 2.4199821216677560e-04 -3.8136336943086191e-03 -2.3320333469275564e-03 -2.0330779691411466e-03 7.1459861448740962e-03 -6.2675974002504567e-03 -5.2893972934319440e-03 -5.7565765597550993e-03 3.5260338938174376e-03 -1.4128125129922874e-03 -7.4006557972036199e-03 7.3203499147270201e-03 4.4014732253768053e-03 -4.9469844665709310e-03 -9.3461810307691462e-03 1.6898460025016517e-03 2.4720065243080777e-02 -7.5720500860382879e-03 -1.0489975816488494e-03 -4.4510976923813625e-04 7.9046325448173839e-03 3.4509679171689932e-03 -9.5030911008784739e-03 6.7668455106236081e-03 7.4567871135235182e-03 -1.5834721112043308e-02 -3.4670764719564061e-02 1.1302347812861895e-02 -6.8318961876333746e-03 3.1034624120212774e-02 1.6040907557340223e-02 1.6040907557340209e-02 1.4276992339484523e-02 6.9401956815721075e-03 6.9401956815721109e-03 -3.9471551122892398e-02 -1.1501570779582766e-02 -1.1501570779582788e-02 -2.8765170970072425e-02 -7.5720500860382905e-03 -7.5720500860382862e-03 6.1232010952182857e-02 -6.8318961876333694e-03 1.1302347812861911e-02 3.1034624120212788e-02 -1.5834721112043312e-02 7.4567871135235182e-03 -3.4670764719564075e-02 -7.3381398992023224e-03 5.4014981398810046e-03 6.0878122755858941e-03 -5.9036312114448125e-03 5.8986980384556666e-03 -1.4932671089780080e-04 -1.1085343619220761e-03 4.0222394086093880e-03 6.1342211010048785e-03 -9.8553992600386164e-03 3.9785679076438294e-04 8.0936975682771931e-03 -3.4165383671775711e-03 -3.7204916474706349e-04 -1.4462489227424209e-03 7.1459861448741023e-03 -1.0489975816488494e-03 -6.8318961876333703e-03 2.5028187415029081e-02 -5.7833072221720088e-03 -6.1270419259526494e-03 -4.5519304601177868e-03 -8.5159384091425174e-03 -5.7612171976417189e-03 5.0283594393312160e-03 -2.1123906623069781e-02 -1.7209668673244576e-02 1.2882289000161203e-02 -5.9036312114448186e-03 1.0897099041201013e-02 6.2354102181170065e-03 2.0575376108704850e-02 1.3323360131895565e-02 3.2540590777278135e-03 -4.1022928788932191e-03 -1.5864500268356545e-02 -1.0337025306971883e-02 -2.4428687834846887e-02 -1.3750502079738491e-02 -2.0330779691411565e-03 -4.4510976923813777e-04 1.1302347812861909e-02 -5.7833072221720088e-03 4.0236821862901354e-02 1.8666156174053521e-02 -9.2467072370521850e-03 -4.8085696541133689e-03 -7.3642921386724057e-03 5.3669602567269466e-03 -1.6264554206001102e-02 -2.3574607304955832e-02 1.0897099041201007e-02 -1.4932671089780866e-04 1.7698539072325353e-02 7.6428145662164942e-03 1.4028674147829202e-02 1.6903809502184522e-02 6.4247906896975236e-03 -2.3558308884160180e-03 -3.4354499111198811e-02 -1.1104668805318220e-02 -1.5760860595776222e-02 -2.0367667812815571e-02 -6.2675974002504593e-03 7.9046325448173839e-03 3.1034624120212791e-02 -6.1270419259526476e-03 1.8666156174053525e-02 4.3431658656139606e-02 -6.8323564223206372e-03 -6.0688904656089632e-03 -3.0771857121892073e-02 -6.8019654805582990e-03 1.2110988990162042e-02 1.0600821653489500e-02 -2.1123906623069774e-02 5.4014981398810089e-03 -1.6264554206001099e-02 -2.4336303366490272e-02 -1.0074163835092622e-02 -1.2725952248616437e-02 -1.3699032950559619e-03 -1.3087607595933803e-03 8.8167899815013093e-03 1.9726105297143217e-02 4.9934312775002697e-03 1.3757801064198799e-02 -3.8136336943086230e-03 3.4509679171689932e-03 -1.5834721112043308e-02 -4.5519304601177851e-03 -9.2467072370521833e-03 -6.8323564223206372e-03 4.2271537622457500e-02 -5.3272544929741181e-03 1.8482171289791887e-02 5.8006962938568236e-03 -6.8019654805582946e-03 -3.6949700341148452e-05 5.0283594393312108e-03 -7.3381398992023259e-03 5.3669602567269440e-03 -6.8604758954739480e-04 -3.8675584141213484e-03 -1.6964635704038397e-03 -1.6743352386620477e-03 6.1024439626304354e-03 -5.8798746812386291e-03 5.1325217849712652e-03 -1.2171358837421136e-03 6.5356031828099357e-03 2.4199821216677948e-04 -9.5030911008784722e-03 7.4567871135235208e-03 -8.5159384091425157e-03 -4.8085696541133672e-03 -6.0688904656089650e-03 -5.3272544929741181e-03 2.7434016469985487e-02 -5.6771721354678204e-03 -3.6949700341151271e-05 1.0600821653489502e-02 1.6134232979659227e-02 -1.7209668673244569e-02 6.0878122755858985e-03 -2.3574607304955836e-02 -1.6099774119102694e-02 -1.1325534181106562e-02 -1.9883241944499579e-02 9.3610471193892840e-03 -6.2291804044726628e-03 2.9246494723946158e-02 1.3596424628076514e-02 7.1406994200204467e-03 1.7047803918301348e-02 -2.3320333469275577e-03 6.7668455106236081e-03 -3.4670764719564068e-02 -5.7612171976417180e-03 -7.3642921386724066e-03 -3.0771857121892066e-02 1.8482171289791887e-02 -5.6771721354678204e-03 4.6471939469004839e-02 918 919 920 963 964 965 975 976 977 930 931 932 921 922 923 966 967 968 978 979 980 933 934 935 3.0638168791694849e-02 -6.0550745787161554e-03 -6.4075290537061961e-03 -5.0765061191760082e-03 -9.5730439866951404e-03 -6.7341879274427328e-03 -4.1237001136910974e-03 -7.1780869723426372e-04 -1.8645354225151093e-03 6.7244213410210677e-03 -1.8850309356461979e-03 -6.6485590540742026e-03 -1.4832980102593208e-03 5.7516123702002712e-03 7.2961912132505184e-03 -1.0660173764888153e-02 2.4270762823918387e-04 8.4032438253142765e-03 -8.2463101264015157e-03 5.6843943200965445e-03 6.0449490048944928e-03 -7.7726019982998227e-03 6.5522438797557580e-03 -8.9572585721045777e-05 -6.0550745787161563e-03 4.7285794653806980e-02 2.0606200237225696e-02 -1.0385882217812059e-02 -4.7516970137536953e-03 -7.6132332292318198e-03 -1.1306280553481181e-02 -2.7177988520230727e-02 -1.4152253547580176e-02 -1.5195386270687801e-03 -1.8175396829842893e-03 9.9080367903454560e-03 5.5488689452666334e-03 2.2063416578164564e-02 1.5320429901890770e-02 3.9225921803953687e-03 -4.1827534751868786e-03 -1.7704418939075553e-02 6.1680850903282694e-03 -2.3646630541516125e-02 -1.8175639222138572e-02 1.3627229761087909e-02 -7.7726019982998270e-03 1.1810878008564197e-02 -6.4075290537061944e-03 2.0606200237225699e-02 5.1637635175506000e-02 -8.1187287913929498e-03 -6.3351646748198093e-03 -3.3962715879070723e-02 -1.2633311071156294e-02 -1.7902533649716740e-02 -2.1890281659709580e-02 -7.0733171688418198e-03 1.0349452965349358e-02 3.2348530730330199e-02 7.8928457877434927e-03 1.5084964751001819e-02 1.8823694932829489e-02 7.6403335116362178e-03 -2.5873557393836493e-03 -3.8570363916705055e-02 6.8888287771533586e-03 -1.9125991303935632e-02 -2.6155281486093432e-02 1.1810878008564188e-02 -8.9572585721046970e-05 1.7768782102913099e-02 -5.0765061191760099e-03 -1.0385882217812059e-02 -8.1187287913929481e-03 4.4926162160021210e-02 -6.5786780200966866e-03 2.0774638239748761e-02 2.2872772603709766e-02 6.9593298425026555e-03 1.4765023590792395e-02 -4.3549811382857647e-03 3.6867738176930157e-03 -1.7685363605211852e-02 -2.7290068662142876e-02 -1.1522772158683582e-02 -1.5232600623942398e-02 -6.2709075202831751e-04 -2.2647571891333844e-03 1.2524461116655559e-02 -6.8036575505818755e-03 1.4421591605433491e-02 1.2098561377286116e-02 -2.3646630541516125e-02 5.6843943200965471e-03 -1.9125991303935636e-02 -9.5730439866951404e-03 -4.7516970137536953e-03 -6.3351646748198093e-03 -6.5786780200966857e-03 2.8011654657441609e-02 -6.9439909564110273e-03 4.4250603634629678e-03 -1.5332543246256076e-03 6.7885098666965269e-03 4.3527110424268820e-04 -1.0967352594175485e-02 9.1896106605742888e-03 -3.5046785171918919e-04 -3.7018459684216749e-03 -1.5826319364338540e-03 -1.1853548255846282e-03 7.9924629205182420e-03 -7.7537310641017966e-03 6.6591281260617325e-03 -6.8036575505818686e-03 -2.5143067265767785e-04 6.1680850903282607e-03 -8.2463101264015140e-03 6.8888287771533508e-03 -6.7341879274427346e-03 -7.6132332292318163e-03 -3.3962715879070723e-02 2.0774638239748764e-02 -6.9439909564110273e-03 4.8290920345691726e-02 1.5622273497049088e-02 8.5558551797768820e-03 1.8507505023239262e-02 -2.5412806805722656e-03 7.2710367726512692e-03 -3.8096479198874711e-02 -1.7559953478663088e-02 -1.2334848726301842e-02 -2.2558405709875252e-02 8.8655802446764853e-03 -7.0783294226640717e-03 3.4462478746066338e-02 -2.5143067265768576e-04 1.2098561377286113e-02 1.9511978158916792e-02 -1.8175639222138568e-02 6.0449490048944971e-03 -2.6155281486093446e-02 -4.1237001136910974e-03 -1.1306280553481181e-02 -1.2633311071156294e-02 2.2872772603709766e-02 4.4250603634629661e-03 1.5622273497049090e-02 4.4548107845652170e-02 1.8084560649226551e-02 1.2500968824423253e-02 -4.8900571867173843e-03 4.9541872283017001e-03 -1.1936121866219208e-02 -2.3070916338292939e-02 -1.6403333798968127e-02 -1.2155317115164242e-02 -6.6249639658041686e-03 -5.9957150338103048e-03 1.7948186201007268e-02 -1.5332543246256135e-03 6.9593298425026529e-03 8.5558551797768820e-03 -2.7177988520230730e-02 -7.1780869723425938e-04 -1.7902533649716744e-02 -7.1780869723426393e-04 -2.7177988520230727e-02 -1.7902533649716737e-02 6.9593298425026555e-03 -1.5332543246256093e-03 8.5558551797768820e-03 1.8084560649226551e-02 4.4548107845652163e-02 1.2500968824423253e-02 4.9541872283016932e-03 -4.8900571867173774e-03 -1.1936121866219212e-02 -1.6403333798968120e-02 -2.3070916338292943e-02 -1.2155317115164245e-02 -5.9957150338103065e-03 -6.6249639658041669e-03 1.7948186201007268e-02 4.4250603634629609e-03 2.2872772603709762e-02 1.5622273497049092e-02 -1.1306280553481176e-02 -4.1237001136911026e-03 -1.2633311071156299e-02 -1.8645354225151098e-03 -1.4152253547580176e-02 -2.1890281659709580e-02 1.4765023590792391e-02 6.7885098666965269e-03 1.8507505023239265e-02 1.2500968824423251e-02 1.2500968824423253e-02 3.5481543099066044e-02 -1.1172680229393592e-02 -1.1172680229393587e-02 -2.9896476723507096e-02 -1.0811298592944708e-02 -1.0811298592944709e-02 -1.4429483890614749e-02 3.9462655105214142e-03 3.9462655105214116e-03 1.5609970787996441e-02 6.7885098666965269e-03 1.4765023590792391e-02 1.8507505023239265e-02 -1.4152253547580179e-02 -1.8645354225151076e-03 -2.1890281659709583e-02 6.7244213410210685e-03 -1.5195386270687792e-03 -7.0733171688418198e-03 -4.3549811382857647e-03 4.3527110424268782e-04 -2.5412806805722651e-03 -4.8900571867173869e-03 4.9541872283016932e-03 -1.1172680229393593e-02 3.1674417617112580e-02 1.9176718226367470e-03 -8.3283848555739930e-03 -8.0545797985821788e-03 -5.9566713170300153e-03 3.6054359463323252e-03 -8.3143285573885478e-03 -1.6326630931291386e-03 7.8897372500487221e-03 -1.0967352594175491e-02 3.6867738176930061e-03 7.2710367726512562e-03 -1.8175396829842761e-03 -1.8850309356461988e-03 1.0349452965349372e-02 -1.8850309356461979e-03 -1.8175396829842891e-03 1.0349452965349360e-02 3.6867738176930157e-03 -1.0967352594175486e-02 7.2710367726512683e-03 4.9541872283017010e-03 -4.8900571867173791e-03 -1.1172680229393587e-02 1.9176718226367468e-03 3.1674417617112580e-02 -8.3283848555740052e-03 -5.9566713170300222e-03 -8.0545797985821874e-03 3.6054359463323173e-03 -1.6326630931291408e-03 -8.3143285573885495e-03 7.8897372500487343e-03 4.3527110424268446e-04 -4.3549811382857639e-03 -2.5412806805722591e-03 -1.5195386270687875e-03 6.7244213410210738e-03 -7.0733171688418294e-03 -6.6485590540742026e-03 9.9080367903454543e-03 3.2348530730330199e-02 -1.7685363605211852e-02 9.1896106605742871e-03 -3.8096479198874711e-02 -1.1936121866219205e-02 -1.1936121866219212e-02 -2.9896476723507100e-02 -8.3283848555739913e-03 -8.3283848555740034e-03 7.1067229332218609e-02 1.7228540473807327e-02 1.7228540473807341e-02 1.4312818481252860e-02 8.2722414563521883e-03 8.2722414563521831e-03 -4.3987674152875335e-02 9.1896106605743044e-03 -1.7685363605211848e-02 -3.8096479198874711e-02 9.9080367903454369e-03 -6.6485590540742052e-03 3.2348530730330206e-02 -1.4832980102593221e-03 5.5488689452666334e-03 7.8928457877434927e-03 -2.7290068662142872e-02 -3.5046785171918935e-04 -1.7559953478663088e-02 -2.3070916338292939e-02 -1.6403333798968120e-02 -1.0811298592944708e-02 -8.0545797985821805e-03 -5.9566713170300222e-03 1.7228540473807331e-02 4.7021175979423915e-02 1.7956933767445317e-02 1.3252643169864627e-02 -5.4838837798894830e-03 4.9758300434886828e-03 -1.2752893384507634e-02 -3.7018459684216732e-03 -1.1522772158683572e-02 -1.2334848726301834e-02 2.2063416578164560e-02 5.7516123702002720e-03 1.5084964751001816e-02 5.7516123702002712e-03 2.2063416578164564e-02 1.5084964751001823e-02 -1.1522772158683581e-02 -3.7018459684216741e-03 -1.2334848726301842e-02 -1.6403333798968123e-02 -2.3070916338292943e-02 -1.0811298592944709e-02 -5.9566713170300153e-03 -8.0545797985821857e-03 1.7228540473807341e-02 1.7956933767445317e-02 4.7021175979423915e-02 1.3252643169864631e-02 4.9758300434886854e-03 -5.4838837798894847e-03 -1.2752893384507647e-02 -3.5046785171918122e-04 -2.7290068662142879e-02 -1.7559953478663098e-02 5.5488689452666351e-03 -1.4832980102593160e-03 7.8928457877435049e-03 7.2961912132505167e-03 1.5320429901890770e-02 1.8823694932829489e-02 -1.5232600623942398e-02 -1.5826319364338540e-03 -2.2558405709875252e-02 -1.2155317115164243e-02 -1.2155317115164245e-02 -1.4429483890614749e-02 3.6054359463323252e-03 3.6054359463323173e-03 1.4312818481252860e-02 1.3252643169864626e-02 1.3252643169864631e-02 3.9557112231917768e-02 -1.0504150555797743e-02 -1.0504150555797743e-02 -3.1971025268464362e-02 -1.5826319364338523e-03 -1.5232600623942398e-02 -2.2558405709875256e-02 1.5320429901890772e-02 7.2961912132505193e-03 1.8823694932829500e-02 -1.0660173764888153e-02 3.9225921803953687e-03 7.6403335116362178e-03 -6.2709075202831849e-04 -1.1853548255846284e-03 8.8655802446764836e-03 -6.6249639658041686e-03 -5.9957150338103065e-03 3.9462655105214142e-03 -8.3143285573885478e-03 -1.6326630931291406e-03 8.2722414563521866e-03 -5.4838837798894830e-03 4.9758300434886854e-03 -1.0504150555797745e-02 2.7900731374667306e-02 1.9373602895342225e-03 -8.5545850053408406e-03 7.9924629205182507e-03 -2.2647571891333857e-03 -7.0783294226640699e-03 -4.1827534751868820e-03 2.4270762823918349e-04 -2.5873557393836484e-03 2.4270762823918376e-04 -4.1827534751868786e-03 -2.5873557393836484e-03 -2.2647571891333835e-03 7.9924629205182403e-03 -7.0783294226640717e-03 -5.9957150338103039e-03 -6.6249639658041669e-03 3.9462655105214125e-03 -1.6326630931291386e-03 -8.3143285573885495e-03 8.2722414563521814e-03 4.9758300434886828e-03 -5.4838837798894847e-03 -1.0504150555797743e-02 1.9373602895342225e-03 2.7900731374667302e-02 -8.5545850053408354e-03 -1.1853548255846261e-03 -6.2709075202831035e-04 8.8655802446764853e-03 3.9225921803953661e-03 -1.0660173764888158e-02 7.6403335116362161e-03 8.4032438253142747e-03 -1.7704418939075553e-02 -3.8570363916705055e-02 1.2524461116655559e-02 -7.7537310641017983e-03 3.4462478746066345e-02 1.7948186201007268e-02 1.7948186201007268e-02 1.5609970787996440e-02 7.8897372500487221e-03 7.8897372500487343e-03 -4.3987674152875335e-02 -1.2752893384507637e-02 -1.2752893384507647e-02 -3.1971025268464362e-02 -8.5545850053408388e-03 -8.5545850053408354e-03 6.8564498974620691e-02 -7.7537310641018105e-03 1.2524461116655554e-02 3.4462478746066352e-02 -1.7704418939075546e-02 8.4032438253142799e-03 -3.8570363916705076e-02 -8.2463101264015157e-03 6.1680850903282694e-03 6.8888287771533604e-03 -6.8036575505818738e-03 6.6591281260617316e-03 -2.5143067265768636e-04 -1.5332543246256111e-03 4.4250603634629626e-03 6.7885098666965278e-03 -1.0967352594175491e-02 4.3527110424268468e-04 9.1896106605743044e-03 -3.7018459684216732e-03 -3.5046785171918165e-04 -1.5826319364338518e-03 7.9924629205182490e-03 -1.1853548255846265e-03 -7.7537310641018105e-03 2.8011654657441633e-02 -6.5786780200966935e-03 -6.9439909564110369e-03 -4.7516970137537109e-03 -9.5730439866951490e-03 -6.3351646748198093e-03 5.6843943200965454e-03 -2.3646630541516125e-02 -1.9125991303935629e-02 1.4421591605433491e-02 -6.8036575505818668e-03 1.2098561377286113e-02 6.9593298425026521e-03 2.2872772603709762e-02 1.4765023590792391e-02 3.6867738176930066e-03 -4.3549811382857647e-03 -1.7685363605211848e-02 -1.1522772158683572e-02 -2.7290068662142879e-02 -1.5232600623942398e-02 -2.2647571891333861e-03 -6.2709075202830905e-04 1.2524461116655556e-02 -6.5786780200966918e-03 4.4926162160021210e-02 2.0774638239748764e-02 -1.0385882217812050e-02 -5.0765061191760290e-03 -8.1187287913929498e-03 6.0449490048944928e-03 -1.8175639222138572e-02 -2.6155281486093432e-02 1.2098561377286116e-02 -2.5143067265767850e-04 1.9511978158916796e-02 8.5558551797768802e-03 1.5622273497049092e-02 1.8507505023239265e-02 7.2710367726512570e-03 -2.5412806805722595e-03 -3.8096479198874711e-02 -1.2334848726301834e-02 -1.7559953478663091e-02 -2.2558405709875256e-02 -7.0783294226640699e-03 8.8655802446764888e-03 3.4462478746066352e-02 -6.9439909564110369e-03 2.0774638239748764e-02 4.8290920345691740e-02 -7.6132332292318094e-03 -6.7341879274427415e-03 -3.3962715879070751e-02 -7.7726019982998218e-03 1.3627229761087909e-02 1.1810878008564188e-02 -2.3646630541516125e-02 6.1680850903282607e-03 -1.8175639222138568e-02 -2.7177988520230730e-02 -1.1306280553481176e-02 -1.4152253547580179e-02 -1.8175396829842741e-03 -1.5195386270687875e-03 9.9080367903454387e-03 2.2063416578164560e-02 5.5488689452666325e-03 1.5320429901890772e-02 -4.1827534751868855e-03 3.9225921803953661e-03 -1.7704418939075546e-02 -4.7516970137537126e-03 -1.0385882217812050e-02 -7.6132332292318094e-03 4.7285794653807001e-02 -6.0550745787161572e-03 2.0606200237225699e-02 6.5522438797557588e-03 -7.7726019982998253e-03 -8.9572585721046428e-05 5.6843943200965471e-03 -8.2463101264015140e-03 6.0449490048944971e-03 -7.1780869723425960e-04 -4.1237001136911026e-03 -1.8645354225151078e-03 -1.8850309356461983e-03 6.7244213410210738e-03 -6.6485590540742052e-03 5.7516123702002729e-03 -1.4832980102593150e-03 7.2961912132505202e-03 2.4270762823918300e-04 -1.0660173764888158e-02 8.4032438253142799e-03 -9.5730439866951490e-03 -5.0765061191760307e-03 -6.7341879274427406e-03 -6.0550745787161554e-03 3.0638168791694877e-02 -6.4075290537061978e-03 -8.9572585721045777e-05 1.1810878008564195e-02 1.7768782102913099e-02 -1.9125991303935636e-02 6.8888287771533517e-03 -2.6155281486093446e-02 -1.7902533649716744e-02 -1.2633311071156297e-02 -2.1890281659709590e-02 1.0349452965349372e-02 -7.0733171688418302e-03 3.2348530730330206e-02 1.5084964751001816e-02 7.8928457877435031e-03 1.8823694932829496e-02 -2.5873557393836484e-03 7.6403335116362169e-03 -3.8570363916705076e-02 -6.3351646748198084e-03 -8.1187287913929464e-03 -3.3962715879070751e-02 2.0606200237225702e-02 -6.4075290537061970e-03 5.1637635175506048e-02 885 886 887 930 931 932 939 940 941 894 895 896 888 889 890 933 934 935 942 943 944 897 898 899 2.6704624405859745e-02 -6.9555028649456920e-03 -5.2692865225844581e-03 -3.2968646284805576e-03 -8.9088867575338997e-03 -3.7453736435138756e-03 -2.3763963909744223e-03 -5.2098568629400282e-05 -1.3271775956210337e-03 6.5646542691847679e-03 -2.9207090891789278e-03 -6.1682761547712031e-03 -2.7092797213606823e-03 5.2186029183569644e-03 5.0609873708104226e-03 -9.7562339854360761e-03 1.6314734973424622e-03 8.2501649782000842e-03 -7.5648495252749861e-03 6.5546239853449149e-03 4.8592138020013042e-03 -7.5656544235177909e-03 5.4324968792435766e-03 -1.6602522345212393e-03 -6.9555028649456920e-03 4.5641269099318642e-02 1.6785995737773042e-02 -9.9227817987023875e-03 -7.8325207444143174e-03 -1.0616150686669847e-02 -1.0973902634910569e-02 -2.7544767930346100e-02 -9.9010794108229400e-03 -2.7277307320402251e-03 2.5636236350191728e-03 1.2720821978328956e-02 5.2651212491857261e-03 2.2990346496369326e-02 1.1652483940934476e-02 5.0162675236063584e-03 -7.6119367951983565e-03 -1.9518770910346560e-02 7.1791667064458548e-03 -2.4868673839714160e-02 -1.4366935998107457e-02 1.3119362551360937e-02 -3.3373399210342020e-03 1.3243635348910330e-02 -5.2692865225844581e-03 1.6785995737773046e-02 3.7691078038909004e-02 -5.0096908108380562e-03 -9.5151118816623106e-03 -2.5979716711501878e-02 -8.8761628712656811e-03 -1.3599112491106884e-02 -1.3232491800290555e-02 -6.8293105127265382e-03 1.3240623215510726e-02 2.4002760048623371e-02 5.8571068690508720e-03 1.1548667623530660e-02 1.0765496803300422e-02 6.6455080575731924e-03 -6.7515860688908552e-03 -2.9362460638714716e-02 5.6852368613351583e-03 -1.5375842895270088e-02 -1.6422725241729868e-02 7.7965989294555109e-03 3.6663667601157068e-03 1.2538059501404226e-02 -3.2968646284805550e-03 -9.9227817987023858e-03 -5.0096908108380562e-03 3.9195784044890838e-02 -1.5781094134485764e-03 1.8722518821389738e-02 2.0159463482395151e-02 8.7473137062490190e-03 1.1083152832320023e-02 -2.7806156829170109e-03 5.1149783043876514e-04 -1.5622127076531264e-02 -2.3882795968437252e-02 -1.2869033359457308e-02 -1.0956360164892921e-02 -1.7692224547743839e-03 -9.7332777503769994e-05 1.1129304451728946e-02 -6.9166303731485312e-03 1.3958321438166233e-02 7.7634446737996268e-03 -2.0709118419528261e-02 1.2501243742580222e-03 -1.7110242726976095e-02 -8.9088867575338997e-03 -7.8325207444143157e-03 -9.5151118816623106e-03 -1.5781094134485762e-03 2.2316161861433002e-02 -1.5860416793417825e-03 6.8486516229724972e-03 2.5459131605239131e-03 8.7917385573067462e-03 9.9942630690095892e-05 -7.5554894062371328e-03 2.5395394207949175e-03 -3.7231660585919676e-03 -6.6755304715568299e-03 -4.2977701770307479e-03 1.7859837221643660e-04 4.9496811684755036e-03 -1.6460224614655726e-03 5.3958519502975057e-03 -2.3438571441583020e-03 3.7537007089516418e-03 1.6871176533979088e-03 -5.4043584240658395e-03 1.9599675124471116e-03 -3.7453736435138765e-03 -1.0616150686669849e-02 -2.5979716711501878e-02 1.8722518821389738e-02 -1.5860416793417819e-03 4.2709787758997711e-02 1.2321816169539989e-02 1.0206485588675077e-02 1.2507532500210236e-02 -1.7096840017530933e-03 1.4771955642709494e-03 -3.4256222925691034e-02 -1.4705461336033789e-02 -1.3409750912839913e-02 -1.6332407445251475e-02 7.4422277828133819e-03 -1.1942027700812317e-03 3.0800632494486745e-02 -1.9587621474218176e-03 1.3707877652588397e-02 1.3961813552097888e-02 -1.6367281645020541e-02 1.4145872433983517e-03 -2.3411419223348214e-02 -2.3763963909744223e-03 -1.0973902634910569e-02 -8.8761628712656811e-03 2.0159463482395151e-02 6.8486516229724981e-03 1.2321816169539989e-02 3.8842751643158903e-02 1.7588249709488715e-02 7.2103832690574611e-03 -2.7042069978151550e-03 2.9435655170893522e-03 -1.0606581482806025e-02 -2.0068810167619057e-02 -1.6212413694245295e-02 -7.4624780210894486e-03 -6.8754629166526519e-03 -2.5461456193294802e-03 1.6300506413628957e-02 -3.2256504174324459e-03 6.3775349175823814e-03 5.8968011123705913e-03 -2.3751688235060322e-02 -4.0255398186476036e-03 -1.4784284589435846e-02 -5.2098568629401311e-05 -2.7544767930346100e-02 -1.3599112491106884e-02 8.7473137062490190e-03 2.5459131605239135e-03 1.0206485588675077e-02 1.7588249709488715e-02 4.2843176335679335e-02 8.1758834370255547e-03 3.0102982166852876e-03 -7.5917992427005712e-03 -1.3432070018306574e-02 -1.5898240887652050e-02 -2.3919535731417418e-02 -8.2730124491017555e-03 -5.1279711735451924e-03 -2.3529024532606430e-03 1.8687839576685024e-02 4.0110795588921624e-03 2.3097936189838120e-02 1.1519977089687439e-02 -1.2278630561488544e-02 -7.0780203283166343e-03 -1.3285990733557891e-02 -1.3271775956210333e-03 -9.9010794108229400e-03 -1.3232491800290557e-02 1.1083152832320023e-02 8.7917385573067462e-03 1.2507532500210236e-02 7.2103832690574594e-03 8.1758834370255547e-03 2.6769588115265891e-02 -1.0316162021953032e-02 -1.3170364539227403e-02 -2.0017807871030094e-02 -6.1234164892238398e-03 -6.9140427509127127e-03 -8.8179025969697643e-03 4.2962885974402714e-03 6.3473084190153401e-03 8.2629753891043118e-03 5.0148786367463826e-03 1.0796922894381734e-02 1.0012193689197459e-02 -9.8379472287662348e-03 -4.1263666067663171e-03 -1.5484087425487484e-02 6.5646542691847670e-03 -2.7277307320402251e-03 -6.8293105127265365e-03 -2.7806156829170109e-03 9.9942630690096055e-05 -1.7096840017530933e-03 -2.7042069978151554e-03 3.0102982166852876e-03 -1.0316162021953030e-02 2.8682174676315956e-02 4.2513603316510689e-04 -8.6937705041484556e-03 -8.2662027813665290e-03 -5.2352711994232025e-03 3.8368116509651467e-03 -7.8480369856389308e-03 -2.1088394646404077e-04 8.1721787792912049e-03 -1.0290547426823889e-02 4.7882601922522028e-03 6.5097536378106412e-03 -3.3572190709392070e-03 -1.4975119486522682e-04 9.0301829725141225e-03 -2.9207090891789278e-03 2.5636236350191728e-03 1.3240623215510726e-02 5.1149783043876503e-04 -7.5554894062371319e-03 1.4771955642709507e-03 2.9435655170893514e-03 -7.5917992427005677e-03 -1.3170364539227403e-02 4.2513603316510700e-04 2.6620121653317924e-02 -9.7357345912439468e-04 -2.7873220180238628e-03 -3.9140593369284332e-03 6.0723350118599582e-03 -1.8181211412559949e-04 -5.9192664523511577e-03 1.1691986501980711e-03 1.9881716295310635e-03 -7.7786020209828959e-03 -6.4365049823488559e-03 2.1472211104103437e-05 3.5754711708630921e-03 -1.3789094611390527e-03 -6.1682761547712031e-03 1.2720821978328955e-02 2.4002760048623371e-02 -1.5622127076531264e-02 2.5395394207949171e-03 -3.4256222925691034e-02 -1.0606581482806019e-02 -1.3432070018306571e-02 -2.0017807871030094e-02 -8.6937705041484556e-03 -9.7357345912439479e-04 6.3580189558528677e-02 1.5628487937393281e-02 1.8126194170825959e-02 7.4267570760844885e-03 8.2536494315178233e-03 1.3024391426019605e-03 -3.9910433941344636e-02 8.9578765387177840e-03 -1.9255327962429222e-02 -2.8762270190545176e-02 8.2507413106280604e-03 -1.0280232726916055e-03 2.7937028245374407e-02 -2.7092797213606823e-03 5.2651212491857261e-03 5.8571068690508729e-03 -2.3882795968437256e-02 -3.7231660585919672e-03 -1.4705461336033789e-02 -2.0068810167619057e-02 -1.5898240887652050e-02 -6.1234164892238398e-03 -8.2662027813665290e-03 -2.7873220180238628e-03 1.5628487937393281e-02 4.0731069686697562e-02 1.7771624004311360e-02 8.0572466679428283e-03 -3.4551022715646031e-03 2.6660990605750002e-03 -1.1766476883637262e-02 -1.7983427308648607e-03 -1.1061602288902314e-02 -8.5066965705398803e-03 1.9449463954515422e-02 7.7674869390981106e-03 1.1559209805047786e-02 5.2186029183569627e-03 2.2990346496369322e-02 1.1548667623530660e-02 -1.2869033359457308e-02 -6.6755304715568299e-03 -1.3409750912839913e-02 -1.6212413694245292e-02 -2.3919535731417418e-02 -6.9140427509127101e-03 -5.2352711994232016e-03 -3.9140593369284323e-03 1.8126194170825959e-02 1.7771624004311357e-02 4.5309326791695637e-02 9.3030703569351413e-03 3.1357900132050246e-03 -8.4161019490238270e-03 -1.4998345225816124e-02 4.4956295366246776e-04 -2.7838788178213423e-02 -1.3384345161011729e-02 7.7411383635899887e-03 2.4643423790749758e-03 9.7285518992887288e-03 5.0609873708104217e-03 1.1652483940934476e-02 1.0765496803300422e-02 -1.0956360164892921e-02 -4.2977701770307479e-03 -1.6332407445251475e-02 -7.4624780210894486e-03 -8.2730124491017555e-03 -8.8179025969697643e-03 3.8368116509651467e-03 6.0723350118599582e-03 7.4267570760844876e-03 8.0572466679428301e-03 9.3030703569351413e-03 2.9889901343064330e-02 -9.4770271678716322e-03 -1.2623387731541081e-02 -2.2185340748581087e-02 -9.7438395504599335e-04 -1.0973097695596772e-02 -1.3674415279306098e-02 1.1915203619181598e-02 9.1393787435407811e-03 1.2927910847659187e-02 -9.7562339854360761e-03 5.0162675236063584e-03 6.6455080575731915e-03 -1.7692224547743852e-03 1.7859837221643671e-04 7.4422277828133819e-03 -6.8754629166526528e-03 -5.1279711735451932e-03 4.2962885974402714e-03 -7.8480369856389308e-03 -1.8181211412559954e-04 8.2536494315178250e-03 -3.4551022715646031e-03 3.1357900132050255e-03 -9.4770271678716305e-03 2.4689363122060909e-02 3.7855366744702718e-04 -8.7439980355778438e-03 7.6214640086025532e-03 -3.2944294822933088e-03 -6.5533178451964279e-03 -2.6067685165968120e-03 -1.0499680651074696e-04 -1.8633308206987638e-03 1.6314734973424626e-03 -7.6119367951983548e-03 -6.7515860688908552e-03 -9.7332777503769885e-05 4.9496811684755044e-03 -1.1942027700812322e-03 -2.5461456193294802e-03 -2.3529024532606426e-03 6.3473084190153401e-03 -2.1088394646404064e-04 -5.9192664523511577e-03 1.3024391426019605e-03 2.6660990605749998e-03 -8.4161019490238270e-03 -1.2623387731541078e-02 3.7855366744702707e-04 2.2725906580490198e-02 -7.9100227081306301e-04 -2.4653231058250360e-03 3.8472267206351354e-03 1.2072753265037558e-02 6.4355922375783717e-04 -7.2226068197668511e-03 1.6376780146713735e-03 8.2501649782000842e-03 -1.9518770910346556e-02 -2.9362460638714713e-02 1.1129304451728946e-02 -1.6460224614655722e-03 3.0800632494486752e-02 1.6300506413628953e-02 1.8687839576685027e-02 8.2629753891043101e-03 8.1721787792912014e-03 1.1691986501980716e-03 -3.9910433941344636e-02 -1.1766476883637260e-02 -1.4998345225816124e-02 -2.2185340748581091e-02 -8.7439980355778456e-03 -7.9100227081306258e-04 6.1286914220918989e-02 -7.5855572350090241e-03 1.5296057920184972e-02 2.5461624679396968e-02 -1.5756122468625063e-02 1.8010447213732512e-03 -3.4353911455266582e-02 -7.5648495252749861e-03 7.1791667064458557e-03 5.6852368613351575e-03 -6.9166303731485312e-03 5.3958519502975057e-03 -1.9587621474218176e-03 -3.2256504174324450e-03 4.0110795588921633e-03 5.0148786367463826e-03 -1.0290547426823889e-02 1.9881716295310644e-03 8.9578765387177857e-03 -1.7983427308648609e-03 4.4956295366246722e-04 -9.7438395504599313e-04 7.6214640086025532e-03 -2.4653231058250364e-03 -7.5855572350090241e-03 2.4661339223169817e-02 -7.6455360346924768e-03 -5.7335323480521916e-03 -2.4867827582276563e-03 -8.9129736583115418e-03 -3.4057563512702961e-03 6.5546239853449158e-03 -2.4868673839714160e-02 -1.5375842895270086e-02 1.3958321438166233e-02 -2.3438571441583020e-03 1.3707877652588397e-02 6.3775349175823823e-03 2.3097936189838120e-02 1.0796922894381734e-02 4.7882601922522028e-03 -7.7786020209828968e-03 -1.9255327962429222e-02 -1.1061602288902314e-02 -2.7838788178213423e-02 -1.0973097695596776e-02 -3.2944294822933088e-03 3.8472267206351341e-03 1.5296057920184972e-02 -7.6455360346924768e-03 4.3607510185199969e-02 1.6541659638253693e-02 -9.6771727274576388e-03 -7.7227519126044468e-03 -1.0738249552112718e-02 4.8592138020013033e-03 -1.4366935998107460e-02 -1.6422725241729864e-02 7.7634446737996268e-03 3.7537007089516422e-03 1.3961813552097890e-02 5.8968011123705904e-03 1.1519977089687437e-02 1.0012193689197457e-02 6.5097536378106429e-03 -6.4365049823488559e-03 -2.8762270190545173e-02 -8.5066965705398786e-03 -1.3384345161011727e-02 -1.3674415279306100e-02 -6.5533178451964279e-03 1.2072753265037558e-02 2.5461624679396968e-02 -5.7335323480521916e-03 1.6541659638253693e-02 3.4514185378992028e-02 -4.2356664621936635e-03 -9.7003045604622893e-03 -2.5090406588103201e-02 -7.5656544235177909e-03 1.3119362551360935e-02 7.7965989294555109e-03 -2.0709118419528261e-02 1.6871176533979086e-03 -1.6367281645020541e-02 -2.3751688235060322e-02 -1.2278630561488544e-02 -9.8379472287662348e-03 -3.3572190709392057e-03 2.1472211104103247e-05 8.2507413106280587e-03 1.9449463954515422e-02 7.7411383635899887e-03 1.1915203619181599e-02 -2.6067685165968124e-03 6.4355922375783695e-04 -1.5756122468625063e-02 -2.4867827582276559e-03 -9.6771727274576370e-03 -4.2356664621936643e-03 4.1027767469354631e-02 -1.2568467142645900e-03 1.8234473945340331e-02 5.4324968792435757e-03 -3.3373399210342028e-03 3.6663667601157068e-03 1.2501243742580222e-03 -5.4043584240658386e-03 1.4145872433983517e-03 -4.0255398186476018e-03 -7.0780203283166351e-03 -4.1263666067663171e-03 -1.4975119486522676e-04 3.5754711708630917e-03 -1.0280232726916048e-03 7.7674869390981106e-03 2.4643423790749754e-03 9.1393787435407811e-03 -1.0499680651074718e-04 -7.2226068197668511e-03 1.8010447213732505e-03 -8.9129736583115418e-03 -7.7227519126044468e-03 -9.7003045604622876e-03 -1.2568467142645902e-03 2.4725263855849909e-02 -1.1666830285078835e-03 -1.6602522345212395e-03 1.3243635348910333e-02 1.2538059501404226e-02 -1.7110242726976099e-02 1.9599675124471112e-03 -2.3411419223348218e-02 -1.4784284589435847e-02 -1.3285990733557891e-02 -1.5484087425487484e-02 9.0301829725141225e-03 -1.3789094611390525e-03 2.7937028245374407e-02 1.1559209805047790e-02 9.7285518992887305e-03 1.2927910847659187e-02 -1.8633308206987627e-03 1.6376780146713740e-03 -3.4353911455266575e-02 -3.4057563512702952e-03 -1.0738249552112718e-02 -2.5090406588103197e-02 1.8234473945340331e-02 -1.1666830285078824e-03 4.4936826097767661e-02 930 931 932 975 976 977 987 988 989 939 940 941 933 934 935 978 979 980 990 991 992 942 943 944 2.9610972742011920e-02 -7.8595160882110951e-03 -5.9615004663408242e-03 -3.2578645403187516e-03 -9.9211517935495538e-03 -4.0522039082059444e-03 -2.6202364907196986e-03 -1.4296269988072765e-05 -1.4439863053634532e-03 7.2915195150263564e-03 -3.2668584874547537e-03 -6.9888458247115079e-03 -3.2055928176646449e-03 5.7247528257808374e-03 5.5829033630743225e-03 -1.0832196844868920e-02 1.8519553814018192e-03 9.2680683748212530e-03 -8.4910368432972293e-03 7.4009260203102504e-03 5.4816632451830547e-03 -8.4955647201690326e-03 6.0841884117105692e-03 -1.8860984784569040e-03 -7.8595160882110951e-03 5.0824064819085017e-02 1.8800685613607360e-02 -1.1237887152561051e-02 -8.3150491871022900e-03 -1.1869202123758429e-02 -1.2249232551592569e-02 -3.0914721995961549e-02 -1.1080498546827758e-02 -3.0301873680350401e-03 2.7347894316737714e-03 1.4252768863953828e-02 6.0364991778351727e-03 2.5687001165729906e-02 1.3045210563608066e-02 5.6728585526044538e-03 -8.3398814129176605e-03 -2.1831026881298243e-02 8.0044063473559204e-03 -2.7912480408972418e-02 -1.6110265619164250e-02 1.4663059082604214e-02 -3.7637224115347929e-03 1.4792328129879431e-02 -5.9615004663408242e-03 1.8800685613607364e-02 4.1829809975737459e-02 -5.7081145533642366e-03 -1.0491707106522297e-02 -2.8590691380788319e-02 -9.9239925186615924e-03 -1.5316451701981891e-02 -1.4839501348321881e-02 -7.6115022572297219e-03 1.4718204243286294e-02 2.6741774926709896e-02 6.6520044699944353e-03 1.2967207182563998e-02 1.1947989113732261e-02 7.5225887403940258e-03 -7.4982138482064444e-03 -3.2645871189025434e-02 6.3410948635461272e-03 -1.7262963260919525e-02 -1.8429935212775490e-02 8.6894217216617903e-03 4.0832388781724968e-03 1.3986425114731516e-02 -3.2578645403187534e-03 -1.1237887152561053e-02 -5.7081145533642349e-03 4.3516192434200601e-02 -1.8315257382639203e-03 2.0845312240956679e-02 2.2473952835273953e-02 9.8444300839037168e-03 1.2401835547005016e-02 -2.9870950056346832e-03 6.1502139406927341e-04 -1.7456451446784479e-02 -2.6668278376115146e-02 -1.4395446037284584e-02 -1.2234705148488016e-02 -2.2506238027651818e-03 -9.6622255598507526e-05 1.2510877299929297e-02 -7.7338679255923443e-03 1.5656356146288720e-02 8.7351983678222167e-03 -2.3092415619048436e-02 1.4456735594463549e-03 -1.9093952307076473e-02 -9.9211517935495520e-03 -8.3150491871022917e-03 -1.0491707106522296e-02 -1.8315257382639201e-03 2.4600051478180455e-02 -1.8454319623760727e-03 7.6253783006750998e-03 2.7116453021334094e-03 9.7680923495517546e-03 1.0886014534702859e-04 -8.3437056774301709e-03 2.8589095065164045e-03 -4.1415995239943828e-03 -7.2767423861309797e-03 -4.7341146133343445e-03 1.8922800052405823e-04 5.3572731065492530e-03 -1.9154023123493114e-03 6.0608402239887837e-03 -2.7159902727166810e-03 4.1427883938480268e-03 1.9099703852728848e-03 -6.0174823634829965e-03 2.2168657446658383e-03 -4.0522039082059444e-03 -1.1869202123758429e-02 -2.8590691380788319e-02 2.0845312240956676e-02 -1.8454319623760743e-03 4.7156791352343845e-02 1.3691596611443020e-02 1.1396272786132644e-02 1.3929351060896156e-02 -1.9164972254541090e-03 1.7729718030987062e-03 -3.7978929915431489e-02 -1.6441394350520791e-02 -1.4968359792504327e-02 -1.8102289289000158e-02 8.1561209252995724e-03 -1.3712382127762605e-03 3.4038458766991311e-02 -2.1171905839645093e-03 1.5261058194576949e-02 1.5540878886089579e-02 -1.8165743709553917e-02 1.6239293076067965e-03 -2.5993569481100917e-02 -2.6202364907196994e-03 -1.2249232551592569e-02 -9.9239925186615924e-03 2.2473952835273953e-02 7.6253783006750989e-03 1.3691596611443020e-02 4.3588580688406660e-02 1.9696845614483916e-02 8.0950419221788306e-03 -3.1410791132311430e-03 3.3639973054432988e-03 -1.1695669671762911e-02 -2.2496992611040986e-02 -1.8087050059144794e-02 -8.3397183890455140e-03 -7.7845522445301896e-03 -2.8900683478534821e-03 1.8119245452626564e-02 -3.4430833319294223e-03 7.0163744944961304e-03 6.5119052282559707e-03 -2.6576589732229178e-02 -4.4762447565076038e-03 -1.6458408635034373e-02 -1.4296269988073632e-05 -3.0914721995961549e-02 -1.5316451701981889e-02 9.8444300839037185e-03 2.7116453021334115e-03 1.1396272786132644e-02 1.9696845614483920e-02 4.8257964791003277e-02 9.2113583792811059e-03 3.3449026183996664e-03 -8.5394800912401512e-03 -1.4997877127931646e-02 -1.7921006579415096e-02 -2.6858914220531060e-02 -9.3027700238769648e-03 -5.8233304081143043e-03 -2.6924259501225596e-03 2.0894309028902967e-02 4.6112597295700193e-03 2.6033065939724549e-02 1.2935469097477045e-02 -1.3738804788839851e-02 -7.9971337750059136e-03 -1.4820310438003262e-02 -1.4439863053634537e-03 -1.1080498546827758e-02 -1.4839501348321881e-02 1.2401835547005014e-02 9.7680923495517546e-03 1.3929351060896156e-02 8.0950419221788306e-03 9.2113583792811024e-03 3.0197154809192051e-02 -1.1588940474950949e-02 -1.4735017996222965e-02 -2.2529655041714780e-02 -6.9033456200610112e-03 -7.7615154678463468e-03 -9.9113541366439416e-03 4.7481564306646956e-03 7.0859171090381610e-03 9.2283370229014026e-03 5.7049269808149890e-03 1.2149980408189561e-02 1.1359741573465457e-02 -1.1013688480288115e-02 -4.6383162351635128e-03 -1.7434073939774464e-02 7.2915195150263555e-03 -3.0301873680350401e-03 -7.6115022572297219e-03 -2.9870950056346832e-03 1.0886014534702845e-04 -1.9164972254541095e-03 -3.1410791132311438e-03 3.3449026183996664e-03 -1.1588940474950949e-02 3.2112071409464593e-02 4.9953183928723064e-04 -9.6906539030370813e-03 -9.2699914493283731e-03 -5.8723857424731775e-03 4.2962329110247180e-03 -8.7655545444865080e-03 -2.3541092605849288e-04 9.0920173683260649e-03 -1.1580985811697921e-02 5.3624539993592174e-03 7.2397769396528632e-03 -3.6588850001123279e-03 -1.7776456582643113e-04 1.0179566641668220e-02 -3.2668584874547529e-03 2.7347894316737753e-03 1.4718204243286294e-02 6.1502139406927373e-04 -8.3437056774301709e-03 1.7729718030987066e-03 3.3639973054432988e-03 -8.5394800912401512e-03 -1.4735017996222963e-02 4.9953183928723042e-04 2.9840874308154818e-02 -1.1673521598806905e-03 -3.1638681356530507e-03 -4.4464267713554984e-03 6.7630408206692475e-03 -2.3623827694139494e-04 -6.5869717027583633e-03 1.4235740570727085e-03 2.2007050180932416e-03 -8.7397575893037385e-03 -7.1788377461837619e-03 -1.2290656843844729e-05 4.0806780922593303e-03 -1.5965830218395466e-03 -6.9888458247115096e-03 1.4252768863953828e-02 2.6741774926709896e-02 -1.7456451446784479e-02 2.8589095065164028e-03 -3.7978929915431489e-02 -1.1695669671762911e-02 -1.4997877127931646e-02 -2.2529655041714777e-02 -9.6906539030370831e-03 -1.1673521598806900e-03 7.0963968708679159e-02 1.7485272364796470e-02 2.0238936191546351e-02 8.2835994222856778e-03 9.3331582174537783e-03 1.4533386422290878e-03 -4.4389852153411014e-02 9.9831915169650547e-03 -2.1474416240963062e-02 -3.2259001969160171e-02 9.0299987470806829e-03 -1.1643076754702811e-03 3.1168096022042721e-02 -3.2055928176646445e-03 6.0364991778351718e-03 6.6520044699944336e-03 -2.6668278376115146e-02 -4.1415995239943836e-03 -1.6441394350520791e-02 -2.2496992611040986e-02 -1.7921006579415096e-02 -6.9033456200610121e-03 -9.2699914493283714e-03 -3.1638681356530498e-03 1.7485272364796474e-02 4.5551826690688857e-02 1.9953423754873193e-02 9.0347901928189093e-03 -3.5796469244888463e-03 2.9986357856307670e-03 -1.3229696607782707e-02 -2.1157499853463684e-03 -1.2457073968385678e-02 -9.5562955032816692e-03 2.1784425473295507e-02 8.6949894891090729e-03 1.2958665054036367e-02 5.7247528257808392e-03 2.5687001165729910e-02 1.2967207182563997e-02 -1.4395446037284583e-02 -7.2767423861309789e-03 -1.4968359792504325e-02 -1.8087050059144790e-02 -2.6858914220531060e-02 -7.7615154678463468e-03 -5.8723857424731775e-03 -4.4464267713554984e-03 2.0238936191546351e-02 1.9953423754873193e-02 5.0594469270469219e-02 1.0418409056299923e-02 3.6293434194530974e-03 -9.1812589067567611e-03 -1.6749520197573989e-02 4.6701393515326934e-04 -3.1279386162359556e-02 -1.4977327917481256e-02 8.5803479036421562e-03 2.7612580109347279e-03 1.0832170944995650e-02 5.5829033630743216e-03 1.3045210563608068e-02 1.1947989113732261e-02 -1.2234705148488017e-02 -4.7341146133343436e-03 -1.8102289289000158e-02 -8.3397183890455157e-03 -9.3027700238769648e-03 -9.9113541366439399e-03 4.2962329110247180e-03 6.7630408206692475e-03 8.2835994222856795e-03 9.0347901928189110e-03 1.0418409056299923e-02 3.3292069303111876e-02 -1.0486261970444844e-02 -1.4062959655801680e-02 -2.4569806498751116e-02 -1.1404146781626352e-03 -1.2352398621181459e-02 -1.5408561779138215e-02 1.3287173719223055e-02 1.0225582473617205e-02 1.4468353864403625e-02 -1.0832196844868920e-02 5.6728585526044546e-03 7.5225887403940241e-03 -2.2506238027651848e-03 1.8922800052405844e-04 8.1561209252995724e-03 -7.7845522445301905e-03 -5.8233304081143043e-03 4.7481564306646948e-03 -8.7655545444865080e-03 -2.3623827694139489e-04 9.3331582174537783e-03 -3.5796469244888454e-03 3.6293434194530974e-03 -1.0486261970444844e-02 2.7477108019386826e-02 4.3429097694365292e-04 -9.8802379688535877e-03 8.5594933867951667e-03 -3.7504244865079355e-03 -7.3799954766907393e-03 -2.8240270450423429e-03 -1.1572777796162955e-04 -2.0135288978228990e-03 1.8519553814018196e-03 -8.3398814129176605e-03 -7.4982138482064444e-03 -9.6622255598507472e-05 5.3572731065492521e-03 -1.3712382127762607e-03 -2.8900683478534812e-03 -2.6924259501225592e-03 7.0859171090381593e-03 -2.3541092605849277e-04 -6.5869717027583624e-03 1.4533386422290876e-03 2.9986357856307665e-03 -9.1812589067567611e-03 -1.4062959655801678e-02 4.3429097694365286e-04 2.5204916738150916e-02 -9.2958476464785091e-04 -2.7916489388419528e-03 4.2797347639010816e-03 1.3518449044182155e-02 7.2886832437619499e-04 -8.0413866360459028e-03 1.8042916859828282e-03 9.2680683748212547e-03 -2.1831026881298243e-02 -3.2645871189025434e-02 1.2510877299929299e-02 -1.9154023123493123e-03 3.4038458766991311e-02 1.8119245452626564e-02 2.0894309028902970e-02 9.2283370229014026e-03 9.0920173683260649e-03 1.4235740570727080e-03 -4.4389852153411000e-02 -1.3229696607782705e-02 -1.6749520197573989e-02 -2.4569806498751127e-02 -9.8802379688535877e-03 -9.2958476464785069e-04 6.8070341649843671e-02 -8.4118430927862982e-03 1.7014319777185143e-02 2.8476893520847375e-02 -1.7468430826280593e-02 2.0933312927085834e-03 -3.8208501119396200e-02 -8.4910368432972293e-03 8.0044063473559222e-03 6.3410948635461272e-03 -7.7338679255923443e-03 6.0608402239887837e-03 -2.1171905839645097e-03 -3.4430833319294219e-03 4.6112597295700193e-03 5.7049269808149890e-03 -1.1580985811697921e-02 2.2007050180932416e-03 9.9831915169650547e-03 -2.1157499853463684e-03 4.6701393515326918e-04 -1.1404146781626352e-03 8.5594933867951667e-03 -2.7916489388419520e-03 -8.4118430927862982e-03 2.7921741997016553e-02 -8.5161975227074430e-03 -6.3830704399331145e-03 -3.1165114859484288e-03 -1.0036378792611839e-02 -3.9766945664796143e-03 7.4009260203102504e-03 -2.7912480408972422e-02 -1.7262963260919525e-02 1.5656356146288720e-02 -2.7159902727166819e-03 1.5261058194576949e-02 7.0163744944961312e-03 2.6033065939724553e-02 1.2149980408189561e-02 5.3624539993592166e-03 -8.7397575893037403e-03 -2.1474416240963062e-02 -1.2457073968385678e-02 -3.1279386162359549e-02 -1.2352398621181459e-02 -3.7504244865079351e-03 4.2797347639010816e-03 1.7014319777185143e-02 -8.5161975227074430e-03 4.9230731327906924e-02 1.8586559009333797e-02 -1.0712414682853262e-02 -8.8959175981801527e-03 -1.1922139266221404e-02 5.4816632451830547e-03 -1.6110265619164250e-02 -1.8429935212775490e-02 8.7351983678222167e-03 4.1427883938480259e-03 1.5540878886089579e-02 6.5119052282559707e-03 1.2935469097477045e-02 1.1359741573465457e-02 7.2397769396528623e-03 -7.1788377461837628e-03 -3.2259001969160171e-02 -9.5562955032816709e-03 -1.4977327917481253e-02 -1.5408561779138213e-02 -7.3799954766907393e-03 1.3518449044182153e-02 2.8476893520847375e-02 -6.3830704399331153e-03 1.8586559009333797e-02 3.9068600721198332e-02 -4.6491823610085824e-03 -1.0916834262011756e-02 -2.8348615740526870e-02 -8.4955647201690344e-03 1.4663059082604214e-02 8.6894217216617921e-03 -2.3092415619048436e-02 1.9099703852728852e-03 -1.8165743709553917e-02 -2.6576589732229185e-02 -1.3738804788839851e-02 -1.1013688480288115e-02 -3.6588850001123283e-03 -1.2290656843844756e-05 9.0299987470806829e-03 2.1784425473295514e-02 8.5803479036421562e-03 1.3287173719223055e-02 -2.8240270450423438e-03 7.2886832437619455e-04 -1.7468430826280593e-02 -3.1165114859484288e-03 -1.0712414682853263e-02 -4.6491823610085824e-03 4.5979568129254245e-02 -1.4187355673584937e-03 2.0290451189165677e-02 6.0841884117105692e-03 -3.7637224115347912e-03 4.0832388781724968e-03 1.4456735594463549e-03 -6.0174823634829974e-03 1.6239293076067962e-03 -4.4762447565076047e-03 -7.9971337750059136e-03 -4.6383162351635128e-03 -1.7776456582643100e-04 4.0806780922593294e-03 -1.1643076754702811e-03 8.6949894891090729e-03 2.7612580109347296e-03 1.0225582473617203e-02 -1.1572777796162922e-04 -8.0413866360459045e-03 2.0933312927085839e-03 -1.0036378792611839e-02 -8.8959175981801544e-03 -1.0916834262011755e-02 -1.4187355673584937e-03 2.7873706681055703e-02 -1.3066237794595356e-03 -1.8860984784569031e-03 1.4792328129879432e-02 1.3986425114731516e-02 -1.9093952307076473e-02 2.2168657446658391e-03 -2.5993569481100914e-02 -1.6458408635034370e-02 -1.4820310438003260e-02 -1.7434073939774468e-02 1.0179566641668220e-02 -1.5965830218395460e-03 3.1168096022042718e-02 1.2958665054036367e-02 1.0832170944995650e-02 1.4468353864403627e-02 -2.0135288978228990e-03 1.8042916859828287e-03 -3.8208501119396193e-02 -3.9766945664796143e-03 -1.1922139266221404e-02 -2.8348615740526870e-02 2.0290451189165677e-02 -1.3066237794595354e-03 5.0361885279620593e-02 894 895 896 939 940 941 669 670 671 507 508 509 897 898 899 942 943 944 672 673 674 510 511 512 2.5622369396604533e-02 -8.6874213360260081e-03 -4.4404559668639139e-03 -5.8434554491807551e-04 -8.4586446443906636e-03 -1.1603405396382657e-03 -1.6703658286078738e-04 8.2219055368716739e-04 -1.3233514488437759e-03 7.1775763919120703e-03 -4.5317605460914821e-03 -6.3630956227880772e-03 -5.2266460530968114e-03 4.7722585657371365e-03 3.6972542845028302e-03 -1.0155227828757833e-02 3.3363885313341625e-03 8.9902337106384268e-03 -7.9599600299025651e-03 8.1429469900539276e-03 3.9204979301419567e-03 -8.7067297489805233e-03 4.6040418856957612e-03 -3.3207423471491786e-03 -8.6874213360260081e-03 4.5833428814944469e-02 1.2470581355888601e-02 -9.6935154370151651e-03 -1.0277569798457146e-02 -1.1667176856635261e-02 -1.1192274948060729e-02 -2.7858527655533444e-02 -5.0349390217223839e-03 -4.5646699438344181e-03 6.2080852434043057e-03 1.3889864335835814e-02 5.0914255307210879e-03 2.3419658386367125e-02 7.4280614396229089e-03 7.0047553933385073e-03 -1.1199213467236213e-02 -2.0311840234977431e-02 8.9658874784502574e-03 -2.6137207936452828e-02 -1.0257348621202148e-02 1.3075813262426463e-02 1.1346412963741405e-05 1.3482797603189886e-02 -4.4404559668639130e-03 1.2470581355888601e-02 2.8942965195911077e-02 -2.3046187739411742e-03 -1.0640790957954753e-02 -1.8572410685366397e-02 -6.3499316571680731e-03 -8.9529124735314748e-03 -7.4952765938692640e-03 -7.2900493000572488e-03 1.4467603394797194e-02 1.6784965998400875e-02 4.6558674314976824e-03 7.3724188056913924e-03 4.8158258494629871e-03 6.3941167675146795e-03 -8.6202325900912140e-03 -2.1924384522281050e-02 4.7454223322172190e-03 -1.1291162440649325e-02 -1.0016049672544112e-02 4.5896491668008252e-03 5.1944949058495803e-03 7.4643644302858784e-03 -5.8434554491807540e-04 -9.6935154370151669e-03 -2.3046187739411742e-03 3.6934733996462625e-02 1.9323671512648534e-03 1.7182579171107170e-02 1.9353479299264911e-02 1.0126176208589046e-02 8.1005578715513688e-03 -3.6809664315603022e-04 -1.6531963075890354e-03 -1.4223150943785245e-02 -2.2963333354950342e-02 -1.4183770473598815e-02 -7.3408296540535285e-03 -4.4061876094595356e-03 1.4350381186594215e-03 1.0034767634259645e-02 -8.3241632361993889e-03 1.3917215935354769e-02 4.2140431751360348e-03 -1.9642086907044155e-02 -1.8803151956650762e-03 -1.5663348480274262e-02 -8.4586446443906619e-03 -1.0277569798457146e-02 -1.0640790957954753e-02 1.9323671512648528e-03 2.0686291896679854e-02 2.1240544209649250e-03 8.6775167872341092e-03 5.8089991266447160e-03 9.0481796416376631e-03 1.6027687658990678e-04 -6.6509638206876474e-03 -2.1403347145801197e-03 -6.2212541804777732e-03 -9.6683890675183601e-03 -5.0086228171730141e-03 9.9389663467812513e-04 3.9214063698138112e-03 2.6654699750696233e-03 4.3493622562946737e-03 1.0882525342513424e-03 5.3879104051136970e-03 -1.4335208811932319e-03 -4.9080272407265617e-03 -1.4358659530780225e-03 -1.1603405396382665e-03 -1.1667176856635261e-02 -1.8572410685366393e-02 1.7182579171107170e-02 2.1240544209649250e-03 3.8344010932358098e-02 9.7757970129633484e-03 1.0272321993970820e-02 6.7406595197259328e-03 -4.8646125700299781e-04 -2.6180701749617028e-03 -3.0541893629251207e-02 -1.2712946053261485e-02 -1.3287841095502189e-02 -1.0903785051153667e-02 6.1728537574902822e-03 3.0152856809761478e-03 2.6823283742595041e-02 -3.7028480857902624e-03 1.3991064032061722e-02 8.6482049996973176e-03 -1.5068634005867779e-02 -1.8296380008744652e-03 -2.0538069828605111e-02 -1.6703658286078683e-04 -1.1192274948060729e-02 -6.3499316571680731e-03 1.9353479299264911e-02 8.6775167872341109e-03 9.7757970129633484e-03 3.7912594861075767e-02 1.8017911067426687e-02 2.6160404766600465e-03 1.2455409662401220e-03 2.2867435274055133e-03 -1.0363757755108102e-02 -1.9837734983983991e-02 -1.6928926642215070e-02 -3.4900169477706921e-03 -9.2350381936190853e-03 -3.5538838728545348e-04 1.6075457490085904e-02 -6.3788633995053570e-03 5.9769025306268429e-03 4.3228164462369070e-03 -2.2892941966611586e-02 -6.4824839351319084e-03 -1.2586405065899335e-02 8.2219055368716761e-04 -2.7858527655533448e-02 -8.9529124735314748e-03 1.0126176208589044e-02 5.8089991266447169e-03 1.0272321993970820e-02 1.8017911067426687e-02 4.2884004499786001e-02 3.1695771176736185e-03 2.2626183023991085e-03 -9.1282043301036744e-03 -1.3363232285441243e-02 -1.6211789824470510e-02 -2.4910901083255454e-02 -3.8772629800517310e-03 -5.4132352949177610e-03 5.3177228786462007e-04 1.8547029043213530e-02 3.6383441957759063e-03 2.2590817932010454e-02 7.0108208218723662e-03 -1.3242215208489642e-02 -9.9179607774132345e-03 -1.2806341237705880e-02 -1.3233514488437761e-03 -5.0349390217223847e-03 -7.4952765938692640e-03 8.1005578715513671e-03 9.0481796416376631e-03 6.7406595197259328e-03 2.6160404766600457e-03 3.1695771176736185e-03 2.2822174557751079e-02 -1.0443877079094620e-02 -1.3510996421460897e-02 -1.0375628324758402e-02 -2.0484812202336729e-03 -2.3373728532330583e-03 -5.9683539320398559e-03 5.1998116596097977e-03 6.7863184470880857e-03 5.9416428914291209e-04 4.1395474169733616e-03 6.2919466728114434e-03 3.7372707678471886e-03 -6.2402476766225037e-03 -4.4127135827944719e-03 -1.0055010283799598e-02 7.1775763919120711e-03 -4.5646699438344181e-03 -7.2900493000572471e-03 -3.6809664315603033e-04 1.6027687658990664e-04 -4.8646125700299738e-04 1.2455409662401236e-03 2.2626183023991098e-03 -1.0443877079094620e-02 2.9256378369523803e-02 -1.1259127275176099e-03 -1.0682847566875195e-02 -1.0713807455717204e-02 -5.7643937021458359e-03 4.5814196601936001e-03 -8.8250067450377327e-03 1.3038934510583222e-03 9.9456849022302434e-03 -1.1049991526412029e-02 6.7821423174110650e-03 6.4302466323845724e-03 -6.7225933573530020e-03 9.4604542603946029e-04 7.9458840082216476e-03 -4.5317605460914821e-03 6.2080852434043057e-03 1.4467603394797192e-02 -1.6531963075890354e-03 -6.6509638206876448e-03 -2.6180701749617037e-03 2.2867435274055124e-03 -9.1282043301036744e-03 -1.3510996421460897e-02 -1.1259127275176101e-03 2.6255938925315303e-02 4.1069339641095423e-03 -9.1922975225893194e-04 -1.2866410591077576e-03 6.6808893580465227e-03 1.2245611368358910e-03 -6.1912344831391323e-03 -3.6072850235388757e-03 3.8575501194034528e-03 -1.1183371442679519e-02 -7.9930232855997471e-03 8.6124454981220504e-04 1.9763909669981250e-03 2.4739481886079636e-03 -6.3630956227880772e-03 1.3889864335835814e-02 1.6784965998400875e-02 -1.4223150943785245e-02 -2.1403347145801197e-03 -3.0541893629251200e-02 -1.0363757755108106e-02 -1.3363232285441239e-02 -1.0375628324758404e-02 -1.0682847566875195e-02 4.1069339641095458e-03 5.9345061895658968e-02 1.5389564708089267e-02 1.8216818524400956e-02 1.4282409318669214e-04 9.6964456912509399e-03 -3.7639432819502458e-03 -3.6996560488212961e-02 9.6405407421576647e-03 -1.9771601965604770e-02 -2.1443624965321696e-02 6.9063007470587454e-03 2.8254954232300720e-03 2.3084855420297718e-02 -5.2266460530968123e-03 5.0914255307210879e-03 4.6558674314976824e-03 -2.2963333354950342e-02 -6.2212541804777732e-03 -1.2712946053261485e-02 -1.9837734983983991e-02 -1.6211789824470510e-02 -2.0484812202336729e-03 -1.0713807455717204e-02 -9.1922975225893302e-04 1.5389564708089267e-02 3.9379188889902737e-02 1.8483746145826277e-02 3.5908663928610361e-03 -1.4633170272863242e-04 1.5041078292803965e-03 -1.1757435782821611e-02 5.8028303366363656e-04 -1.1079501522928864e-02 -5.8917113473021159e-03 1.8928381626910604e-02 9.3524957743083212e-03 8.7742758711708974e-03 4.7722585657371331e-03 2.3419658386367125e-02 7.3724188056913933e-03 -1.4183770473598818e-02 -9.6683890675183619e-03 -1.3287841095502189e-02 -1.6928926642215070e-02 -2.4910901083255454e-02 -2.3373728532330583e-03 -5.7643937021458359e-03 -1.2866410591077563e-03 1.8216818524400956e-02 1.8483746145826280e-02 4.5755371678484098e-02 4.5405349102383315e-03 2.5723568790578634e-03 -1.0882918197573484e-02 -1.5657156900086719e-02 1.5464054084350432e-03 -2.8347265944725947e-02 -8.8357803962248009e-03 9.5023238189033965e-03 5.9210852873297810e-03 9.9883790047160803e-03 3.6972542845028302e-03 7.4280614396229089e-03 4.8158258494629862e-03 -7.3408296540535285e-03 -5.0086228171730141e-03 -1.0903785051153667e-02 -3.4900169477706921e-03 -3.8772629800517306e-03 -5.9683539320398559e-03 4.5814196601936009e-03 6.6808893580465227e-03 1.4282409318669355e-04 3.5908663928610361e-03 4.5405349102383341e-03 2.5153701343611341e-02 -9.3471660247563971e-03 -1.3025440679265525e-02 -1.3013873937949550e-02 -9.5676547961382732e-04 -6.1178375785663677e-03 -7.8194687409801050e-03 9.2652377686369795e-03 9.3796783471488746e-03 7.5931303758621531e-03 -1.0155227828757833e-02 7.0047553933385081e-03 6.3941167675146812e-03 -4.4061876094595347e-03 9.9389663467812491e-04 6.1728537574902822e-03 -9.2350381936190835e-03 -5.4132352949177627e-03 5.1998116596097977e-03 -8.8250067450377327e-03 1.2245611368358908e-03 9.6964456912509399e-03 -1.4633170272863134e-04 2.5723568790578634e-03 -9.3471660247563971e-03 2.4691675012068613e-02 -1.2303910395011692e-03 -1.0555131939946321e-02 8.3202081245082240e-03 -4.9909787203549476e-03 -6.7662700839751962e-03 -2.4409105697402065e-04 -1.6096498913650568e-04 -7.9465982718778438e-04 3.3363885313341633e-03 -1.1199213467236213e-02 -8.6202325900912157e-03 1.4350381186594215e-03 3.9214063698138112e-03 3.0152856809761487e-03 -3.5538838728545403e-04 5.3177228786461996e-04 6.7863184470880857e-03 1.3038934510583224e-03 -6.1912344831391332e-03 -3.7639432819502453e-03 1.5041078292803967e-03 -1.0882918197573485e-02 -1.3025440679265525e-02 -1.2303910395011694e-03 2.2218402558740857e-02 4.8637417681810617e-03 -4.3446929083127304e-03 7.9394990326342538e-03 1.3367259579061751e-02 -1.6489555952329481e-03 -6.3377141011047083e-03 -2.6229889240000602e-03 8.9902337106384268e-03 -2.0311840234977428e-02 -2.1924384522281050e-02 1.0034767634259645e-02 2.6654699750696229e-03 2.6823283742595041e-02 1.6075457490085904e-02 1.8547029043213530e-02 5.9416428914291274e-04 9.9456849022302469e-03 -3.6072850235388757e-03 -3.6996560488212954e-02 -1.1757435782821613e-02 -1.5657156900086722e-02 -1.3013873937949543e-02 -1.0555131939946323e-02 4.8637417681810600e-03 5.6921191502835353e-02 -8.2205119824537657e-03 1.6408473518810744e-02 1.7944374962522672e-02 -1.4513064031992512e-02 -2.9084321466719427e-03 -3.0348195548652417e-02 -7.9599600299025668e-03 8.9658874784502574e-03 4.7454223322172182e-03 -8.3241632361993889e-03 4.3493622562946737e-03 -3.7028480857902624e-03 -6.3788633995053553e-03 3.6383441957759054e-03 4.1395474169733616e-03 -1.1049991526412029e-02 3.8575501194034524e-03 9.6405407421576647e-03 5.8028303366363624e-04 1.5464054084350439e-03 -9.5676547961382722e-04 8.3202081245082240e-03 -4.3446929083127304e-03 -8.2205119824537657e-03 2.4154133535539787e-02 -9.5632680061695629e-03 -4.7965399045570151e-03 6.5835349830769023e-04 -8.4495885438770398e-03 -8.4884503893337452e-04 8.1429469900539276e-03 -2.6137207936452828e-02 -1.1291162440649325e-02 1.3917215935354769e-02 1.0882525342513420e-03 1.3991064032061722e-02 5.9769025306268429e-03 2.2590817932010451e-02 6.2919466728114442e-03 6.7821423174110667e-03 -1.1183371442679519e-02 -1.9771601965604770e-02 -1.1079501522928864e-02 -2.8347265944725947e-02 -6.1178375785663668e-03 -4.9909787203549476e-03 7.9394990326342538e-03 1.6408473518810744e-02 -9.5632680061695646e-03 4.3803663926746048e-02 1.1910504816168482e-02 -9.1854595239932290e-03 -9.7543881017838063e-03 -1.1421387055031922e-02 3.9204979301419559e-03 -1.0257348621202148e-02 -1.0016049672544110e-02 4.2140431751360348e-03 5.3879104051136979e-03 8.6482049996973176e-03 4.3228164462369078e-03 7.0108208218723662e-03 3.7372707678471890e-03 6.4302466323845724e-03 -7.9930232855997471e-03 -2.1443624965321696e-02 -5.8917113473021150e-03 -8.8357803962248009e-03 -7.8194687409801067e-03 -6.7662700839751962e-03 1.3367259579061751e-02 1.7944374962522675e-02 -4.7965399045570159e-03 1.1910504816168482e-02 2.6129077385827468e-02 -1.4330828480651414e-03 -1.0590343319189602e-02 -1.7179784737048731e-02 -8.7067297489805233e-03 1.3075813262426461e-02 4.5896491668008252e-03 -1.9642086907044155e-02 -1.4335208811932321e-03 -1.5068634005867781e-02 -2.2892941966611586e-02 -1.3242215208489640e-02 -6.2402476766225045e-03 -6.7225933573530012e-03 8.6124454981220547e-04 6.9063007470587445e-03 1.8928381626910601e-02 9.5023238189033948e-03 9.2652377686369795e-03 -2.4409105697402033e-04 -1.6489555952329483e-03 -1.4513064031992512e-02 6.5835349830768936e-04 -9.1854595239932273e-03 -1.4330828480651433e-03 3.8621707911744990e-02 2.0707695777669871e-03 1.6493840880051385e-02 4.6040418856957603e-03 1.1346412963741839e-05 5.1944949058495803e-03 -1.8803151956650760e-03 -4.9080272407265625e-03 -1.8296380008744654e-03 -6.4824839351319075e-03 -9.9179607774132327e-03 -4.4127135827944711e-03 9.4604542603946018e-04 1.9763909669981258e-03 2.8254954232300724e-03 9.3524957743083195e-03 5.9210852873297810e-03 9.3796783471488746e-03 -1.6096498913650571e-04 -6.3377141011047074e-03 -2.9084321466719427e-03 -8.4495885438770398e-03 -9.7543881017838063e-03 -1.0590343319189604e-02 2.0707695777669871e-03 2.3009267553736661e-02 2.3414583733019560e-03 -3.3207423471491777e-03 1.3482797603189886e-02 7.4643644302858784e-03 -1.5663348480274265e-02 -1.4358659530780220e-03 -2.0538069828605111e-02 -1.2586405065899333e-02 -1.2806341237705880e-02 -1.0055010283799600e-02 7.9458840082216476e-03 2.4739481886079636e-03 2.3084855420297718e-02 8.7742758711708974e-03 9.9883790047160820e-03 7.5931303758621513e-03 -7.9465982718778438e-04 -2.6229889240000602e-03 -3.0348195548652417e-02 -8.4884503893337452e-04 -1.1421387055031918e-02 -1.7179784737048731e-02 1.6493840880051385e-02 2.3414583733019564e-03 3.9978710171660103e-02 864 865 866 909 910 911 921 922 923 876 877 878 867 868 869 912 913 914 924 925 926 879 880 881 3.1715677093397801e-02 -7.6173329619600699e-03 -1.1028043161228792e-02 -2.2463027637347234e-03 -7.5345563084973158e-03 -2.0811755014760276e-03 -1.9074642903535736e-03 2.4525541151363597e-03 2.7376387196475817e-03 9.4442493841868577e-03 -1.3370298902225485e-03 -1.0540513602326019e-02 -3.7049629783418021e-03 1.6660345023093918e-03 2.7252240200507155e-03 -1.3251544993099742e-02 -1.7301912804768313e-03 1.2023885938051680e-02 -1.0852613982319076e-02 7.1876101585090432e-03 1.0021488940556307e-02 -9.1970374697357485e-03 6.9129116652019732e-03 -3.8585053532754409e-03 -7.6173329619600690e-03 3.7355160446349393e-02 1.6134787948475726e-02 -7.8326037723038498e-03 -2.2469495556347958e-03 -2.9944390515830302e-03 -5.8194705372655369e-03 -1.9473239229681305e-02 -1.4324940412468803e-02 -7.2933149820868476e-04 -3.6629495060074777e-03 3.0023141283708737e-03 1.3957003628951195e-03 1.4731027268979102e-02 1.3880663468967816e-02 4.1373820305692661e-03 -1.3105983323527764e-03 -9.4703660902227017e-03 7.1565974621684379e-03 -1.6195413621916410e-02 -1.4289965700530854e-02 9.3090589141053229e-03 -9.1970374697357381e-03 8.0619457089909745e-03 -1.1028043161228792e-02 1.6134787948475726e-02 5.0813099278597458e-02 -3.5877598857765010e-03 -1.8532335325142303e-03 -3.4172223033335662e-02 -8.7704098870077102e-03 -1.5877935646457685e-02 -2.8090362152245654e-02 -1.0587715294239616e-02 3.4383680898390093e-03 2.8613649818103687e-02 3.2406506225661482e-03 1.3880543228176884e-02 2.4112728540266064e-02 1.1964195416688674e-02 3.4769673709687549e-03 -3.3046708310774733e-02 1.0707136480006811e-02 -1.5340992105213037e-02 -2.6857155226906758e-02 8.0619457089909866e-03 -3.8585053532754353e-03 1.8626971086295591e-02 -2.2463027637347234e-03 -7.8326037723038498e-03 -3.5877598857764997e-03 3.5143691379577693e-02 -7.9831129868948268e-03 1.6435733228293583e-02 1.6001971249879718e-02 2.6657283688730159e-03 1.4159547783279781e-02 -1.6938745384303265e-03 4.0717273166791350e-03 -9.7875892954913234e-03 -1.9353408889405288e-02 -5.9687941311528337e-03 -1.5240006000574530e-02 -3.4322715836225788e-03 -2.0365700280578999e-03 4.9520592094916332e-03 -8.2243912323480689e-03 9.8960150743482266e-03 8.4090070659903864e-03 -1.6195413621916420e-02 7.1876101585090354e-03 -1.5340992105213037e-02 -7.5345563084973158e-03 -2.2469495556347936e-03 -1.8532335325142292e-03 -7.9831129868948268e-03 2.9134060403091359e-02 -1.1274789696480568e-02 6.0434172325765244e-04 -3.1343804360788909e-03 2.0368802312596898e-03 -1.6646204775917865e-03 -1.3489734750293981e-02 1.2441955903219819e-02 2.5376488809701397e-03 -1.5349969226662020e-03 3.0902758049074319e-03 -2.3563297426865614e-04 1.0349006476249653e-02 -1.1178952510905119e-02 7.1193346808563424e-03 -8.2243912323480741e-03 -3.9692726794938338e-03 7.1565974621684509e-03 -1.0852613982319072e-02 1.0707136480006816e-02 -2.0811755014760293e-03 -2.9944390515830319e-03 -3.4172223033335655e-02 1.6435733228293583e-02 -1.1274789696480570e-02 4.7485573546142738e-02 1.4301524014450244e-02 4.0377693882154694e-03 2.4789230730779658e-02 3.0736001720858396e-03 1.1367249193279578e-02 -3.3104054507315510e-02 -1.5253998243542313e-02 -8.5312102138891000e-03 -2.8039447364912526e-02 1.7835547102133730e-03 -1.1035075626089033e-02 2.9623932951632563e-02 -3.9692726794938304e-03 8.4090070659903933e-03 2.0274142903915493e-02 -1.4289965700530871e-02 1.0021488940556302e-02 -2.6857155226906754e-02 -1.9074642903535736e-03 -5.8194705372655378e-03 -8.7704098870077119e-03 1.6001971249879718e-02 6.0434172325765287e-04 1.4301524014450246e-02 3.5809173830550670e-02 1.1351955384957941e-02 1.4410639297197500e-02 -2.7001706367229539e-03 6.9916940993554081e-03 -4.5467716340514995e-03 -1.6324674476758002e-02 -1.0275388899410770e-02 -1.3605969409851707e-02 -8.2712160108356549e-03 -7.9714142549040592e-03 1.0051153877505390e-02 -3.1343804360788887e-03 2.6657283688730125e-03 4.0377693882154633e-03 -1.9473239229681312e-02 2.4525541151363575e-03 -1.5877935646457682e-02 2.4525541151363597e-03 -1.9473239229681309e-02 -1.5877935646457682e-02 2.6657283688730151e-03 -3.1343804360788891e-03 4.0377693882154694e-03 1.1351955384957939e-02 3.5809173830550677e-02 1.4410639297197504e-02 6.9916940993554099e-03 -2.7001706367229586e-03 -4.5467716340515029e-03 -1.0275388899410773e-02 -1.6324674476758002e-02 -1.3605969409851709e-02 -7.9714142549040540e-03 -8.2712160108356601e-03 1.0051153877505395e-02 6.0434172325765526e-04 1.6001971249879721e-02 1.4301524014450250e-02 -5.8194705372655534e-03 -1.9074642903535702e-03 -8.7704098870077206e-03 2.7376387196475808e-03 -1.4324940412468802e-02 -2.8090362152245654e-02 1.4159547783279779e-02 2.0368802312596894e-03 2.4789230730779668e-02 1.4410639297197497e-02 1.4410639297197504e-02 4.3273049624250798e-02 -3.8488090481591597e-03 -3.8488090481591671e-03 -3.4056941365295114e-02 -1.2639991904501843e-02 -1.2639991904501841e-02 -2.2488197369961230e-02 -2.5309646662547321e-03 -2.5309646662547373e-03 1.9874351953937532e-02 2.0368802312596928e-03 1.4159547783279783e-02 2.4789230730779665e-02 -1.4324940412468819e-02 2.7376387196475799e-03 -2.8090362152245658e-02 9.4442493841868595e-03 -7.2933149820868454e-04 -1.0587715294239613e-02 -1.6938745384303265e-03 -1.6646204775917861e-03 3.0736001720858409e-03 -2.7001706367229530e-03 6.9916940993554099e-03 -3.8488090481591597e-03 3.2149640397573911e-02 5.2479867318978354e-03 -1.2135063631623521e-02 -9.2852231175373397e-03 -7.6400252623784757e-03 -2.4339292026651169e-03 -1.0761937232768661e-02 -4.9404010195308948e-03 1.1126299721482982e-02 -1.3489734750293988e-02 4.0717273166791445e-03 1.1367249193279586e-02 -3.6629495060074950e-03 -1.3370298902225463e-03 3.4383680898390015e-03 -1.3370298902225489e-03 -3.6629495060074777e-03 3.4383680898390110e-03 4.0717273166791341e-03 -1.3489734750293981e-02 1.1367249193279578e-02 6.9916940993554081e-03 -2.7001706367229573e-03 -3.8488090481591688e-03 5.2479867318978362e-03 3.2149640397573898e-02 -1.2135063631623512e-02 -7.6400252623784713e-03 -9.2852231175373327e-03 -2.4339292026651091e-03 -4.9404010195308896e-03 -1.0761937232768659e-02 1.1126299721482972e-02 -1.6646204775917807e-03 -1.6938745384303350e-03 3.0736001720858331e-03 -7.2933149820868866e-04 9.4442493841868508e-03 -1.0587715294239608e-02 -1.0540513602326019e-02 3.0023141283708737e-03 2.8613649818103687e-02 -9.7875892954913217e-03 1.2441955903219816e-02 -3.3104054507315510e-02 -4.5467716340514960e-03 -4.5467716340515038e-03 -3.4056941365295100e-02 -1.2135063631623519e-02 -1.2135063631623514e-02 5.6679362002894793e-02 9.7143728821528028e-03 9.7143728821528011e-03 1.8225998594283088e-02 1.1851295249748853e-02 1.1851295249748858e-02 -3.1867609853459107e-02 1.2441955903219813e-02 -9.7875892954913304e-03 -3.3104054507315524e-02 3.0023141283708949e-03 -1.0540513602326015e-02 2.8613649818103690e-02 -3.7049629783418008e-03 1.3957003628951195e-03 3.2406506225661474e-03 -1.9353408889405291e-02 2.5376488809701397e-03 -1.5253998243542313e-02 -1.6324674476758002e-02 -1.0275388899410773e-02 -1.2639991904501843e-02 -9.2852231175373397e-03 -7.6400252623784731e-03 9.7143728821528028e-03 3.7226336816462570e-02 1.1083677005985922e-02 1.4461740406926393e-02 -1.7540977007330567e-03 7.2011475407815070e-03 -4.8721067778889765e-03 -1.5349969226662000e-03 -5.9687941311528381e-03 -8.5312102138891035e-03 1.4731027268979116e-02 1.6660345023093927e-03 1.3880543228176893e-02 1.6660345023093927e-03 1.4731027268979102e-02 1.3880543228176886e-02 -5.9687941311528346e-03 -1.5349969226662015e-03 -8.5312102138891018e-03 -1.0275388899410770e-02 -1.6324674476757998e-02 -1.2639991904501843e-02 -7.6400252623784757e-03 -9.2852231175373327e-03 9.7143728821528011e-03 1.1083677005985924e-02 3.7226336816462570e-02 1.4461740406926391e-02 7.2011475407815009e-03 -1.7540977007330558e-03 -4.8721067778889739e-03 2.5376488809701349e-03 -1.9353408889405285e-02 -1.5253998243542309e-02 1.3957003628951310e-03 -3.7049629783417973e-03 3.2406506225661487e-03 2.7252240200507146e-03 1.3880663468967814e-02 2.4112728540266068e-02 -1.5240006000574527e-02 3.0902758049074315e-03 -2.8039447364912526e-02 -1.3605969409851707e-02 -1.3605969409851709e-02 -2.2488197369961230e-02 -2.4339292026651165e-03 -2.4339292026651091e-03 1.8225998594283085e-02 1.4461740406926396e-02 1.4461740406926391e-02 4.5762876361999535e-02 -2.8779990877610124e-03 -2.8779990877610068e-03 -3.3647239937028471e-02 3.0902758049074293e-03 -1.5240006000574530e-02 -2.8039447364912526e-02 1.3880663468967831e-02 2.7252240200507176e-03 2.4112728540266071e-02 -1.3251544993099742e-02 4.1373820305692661e-03 1.1964195416688675e-02 -3.4322715836225788e-03 -2.3563297426865582e-04 1.7835547102133711e-03 -8.2712160108356549e-03 -7.9714142549040523e-03 -2.5309646662547312e-03 -1.0761937232768661e-02 -4.9404010195308896e-03 1.1851295249748853e-02 -1.7540977007330560e-03 7.2011475407815009e-03 -2.8779990877610142e-03 2.8432659377162821e-02 5.5756799858875539e-03 -1.2631973367514876e-02 1.0349006476249653e-02 -2.0365700280578938e-03 -1.1035075626089030e-02 -1.3105983323527717e-03 -1.7301912804768300e-03 3.4769673709687510e-03 -1.7301912804768313e-03 -1.3105983323527764e-03 3.4769673709687549e-03 -2.0365700280578999e-03 1.0349006476249652e-02 -1.1035075626089037e-02 -7.9714142549040592e-03 -8.2712160108356601e-03 -2.5309646662547377e-03 -4.9404010195308939e-03 -1.0761937232768659e-02 1.1851295249748858e-02 7.2011475407815070e-03 -1.7540977007330545e-03 -2.8779990877610068e-03 5.5756799858875539e-03 2.8432659377162817e-02 -1.2631973367514879e-02 -2.3563297426865679e-04 -3.4322715836225810e-03 1.7835547102133637e-03 4.1373820305692817e-03 -1.3251544993099740e-02 1.1964195416688682e-02 1.2023885938051678e-02 -9.4703660902227035e-03 -3.3046708310774733e-02 4.9520592094916350e-03 -1.1178952510905119e-02 2.9623932951632563e-02 1.0051153877505391e-02 1.0051153877505395e-02 1.9874351953937532e-02 1.1126299721482982e-02 1.1126299721482973e-02 -3.1867609853459107e-02 -4.8721067778889739e-03 -4.8721067778889713e-03 -3.3647239937028478e-02 -1.2631973367514876e-02 -1.2631973367514879e-02 5.2486048554834387e-02 -1.1178952510905118e-02 4.9520592094916393e-03 2.9623932951632570e-02 -9.4703660902227243e-03 1.2023885938051671e-02 -3.3046708310774733e-02 -1.0852613982319076e-02 7.1565974621684379e-03 1.0707136480006811e-02 -8.2243912323480672e-03 7.1193346808563424e-03 -3.9692726794938295e-03 -3.1343804360788887e-03 6.0434172325765439e-04 2.0368802312596915e-03 -1.3489734750293988e-02 -1.6646204775917807e-03 1.2441955903219814e-02 -1.5349969226662007e-03 2.5376488809701345e-03 3.0902758049074284e-03 1.0349006476249652e-02 -2.3563297426865701e-04 -1.1178952510905118e-02 2.9134060403091359e-02 -7.9831129868948286e-03 -1.1274789696480566e-02 -2.2469495556347889e-03 -7.5345563084973080e-03 -1.8532335325142299e-03 7.1876101585090432e-03 -1.6195413621916413e-02 -1.5340992105213037e-02 9.8960150743482283e-03 -8.2243912323480741e-03 8.4090070659903933e-03 2.6657283688730133e-03 1.6001971249879721e-02 1.4159547783279785e-02 4.0717273166791437e-03 -1.6938745384303352e-03 -9.7875892954913304e-03 -5.9687941311528381e-03 -1.9353408889405288e-02 -1.5240006000574530e-02 -2.0365700280578942e-03 -3.4322715836225827e-03 4.9520592094916393e-03 -7.9831129868948268e-03 3.5143691379577693e-02 1.6435733228293590e-02 -7.8326037723038706e-03 -2.2463027637347217e-03 -3.5877598857765106e-03 1.0021488940556308e-02 -1.4289965700530854e-02 -2.6857155226906758e-02 8.4090070659903864e-03 -3.9692726794938347e-03 2.0274142903915493e-02 4.0377693882154651e-03 1.4301524014450248e-02 2.4789230730779665e-02 1.1367249193279588e-02 3.0736001720858327e-03 -3.3104054507315517e-02 -8.5312102138891018e-03 -1.5253998243542309e-02 -2.8039447364912526e-02 -1.1035075626089030e-02 1.7835547102133637e-03 2.9623932951632563e-02 -1.1274789696480568e-02 1.6435733228293586e-02 4.7485573546142731e-02 -2.9944390515830501e-03 -2.0811755014760298e-03 -3.4172223033335662e-02 -9.1970374697357485e-03 9.3090589141053212e-03 8.0619457089909866e-03 -1.6195413621916420e-02 7.1565974621684517e-03 -1.4289965700530873e-02 -1.9473239229681312e-02 -5.8194705372655552e-03 -1.4324940412468819e-02 -3.6629495060074950e-03 -7.2933149820868974e-04 3.0023141283708954e-03 1.4731027268979114e-02 1.3957003628951303e-03 1.3880663468967831e-02 -1.3105983323527721e-03 4.1373820305692817e-03 -9.4703660902227243e-03 -2.2469495556347884e-03 -7.8326037723038706e-03 -2.9944390515830505e-03 3.7355160446349414e-02 -7.6173329619600751e-03 1.6134787948475750e-02 6.9129116652019715e-03 -9.1970374697357363e-03 -3.8585053532754331e-03 7.1876101585090372e-03 -1.0852613982319072e-02 1.0021488940556302e-02 2.4525541151363571e-03 -1.9074642903535697e-03 2.7376387196475799e-03 -1.3370298902225458e-03 9.4442493841868508e-03 -1.0540513602326015e-02 1.6660345023093929e-03 -3.7049629783417982e-03 2.7252240200507181e-03 -1.7301912804768298e-03 -1.3251544993099745e-02 1.2023885938051673e-02 -7.5345563084973080e-03 -2.2463027637347199e-03 -2.0811755014760293e-03 -7.6173329619600751e-03 3.1715677093397794e-02 -1.1028043161228792e-02 -3.8585053532754405e-03 8.0619457089909745e-03 1.8626971086295588e-02 -1.5340992105213037e-02 1.0707136480006816e-02 -2.6857155226906758e-02 -1.5877935646457682e-02 -8.7704098870077189e-03 -2.8090362152245654e-02 3.4383680898390015e-03 -1.0587715294239606e-02 2.8613649818103694e-02 1.3880543228176893e-02 3.2406506225661482e-03 2.4112728540266071e-02 3.4769673709687510e-03 1.1964195416688682e-02 -3.3046708310774733e-02 -1.8532335325142303e-03 -3.5877598857765097e-03 -3.4172223033335662e-02 1.6134787948475747e-02 -1.1028043161228792e-02 5.0813099278597458e-02 909 910 911 954 955 956 966 967 968 921 922 923 912 913 914 957 958 959 969 970 971 924 925 926 3.5164952080841881e-02 -8.0057393542158576e-03 -1.2081704896171512e-02 -4.3287137141528043e-03 -7.9994885765206254e-03 -2.6188214532478892e-03 -2.6759545155295660e-03 2.4611744891094491e-03 2.9147965310787529e-03 1.0537048770452476e-02 -1.3872307717489056e-03 -1.1543780475130687e-02 -2.6383649353160028e-03 2.0470784931436357e-03 3.3793098526266330e-03 -1.4988577224833280e-02 -1.7315257004258447e-03 1.3100916746651901e-02 -1.1811705529961790e-02 7.3802024381341702e-03 1.0947600667615022e-02 -9.2586849315009177e-03 7.2355289825239873e-03 -4.0983169734222146e-03 -8.0057393542158593e-03 4.1723748535569878e-02 1.8283439692293145e-02 -8.2951445893145303e-03 -4.1217440751986356e-03 -3.6805684171979554e-03 -6.3707996541936028e-03 -2.1503898882718024e-02 -1.6306191733338259e-02 -1.0164439427570982e-03 -3.2956375581538011e-03 3.8059981795635755e-03 1.5070942510536499e-03 1.6861604730021247e-02 1.5770829334946036e-02 4.4454081097531958e-03 -2.6760618007649296e-03 -1.0815056716570050e-02 7.7275783468681658e-03 -1.7729326017254826e-02 -1.6293395993137439e-02 1.0008046832806075e-02 -9.2586849315009160e-03 9.2349456534409537e-03 -1.2081704896171514e-02 1.8283439692293145e-02 5.8707347543329964e-02 -3.9739037678182994e-03 -2.0456483378369561e-03 -4.1036224699635526e-02 -1.0068014071294944e-02 -1.7808111564205999e-02 -3.2663965146209277e-02 -1.1798690409017338e-02 3.6260472537216794e-03 3.3895131313318345e-02 3.4461141099119698e-03 1.5535253743705565e-02 2.9188816376943583e-02 1.3241445597926872e-02 3.5731015294989052e-03 -3.9326365844355324e-02 1.1999807783022301e-02 -1.7065765343754136e-02 -3.1465367685342346e-02 9.2349456534409589e-03 -4.0983169734222164e-03 2.2700628141950570e-02 -4.3287137141528060e-03 -8.2951445893145320e-03 -3.9739037678183011e-03 3.8867974993380822e-02 -8.4179687951974058e-03 1.8414201259151254e-02 1.7680625141373502e-02 2.9545823560325813e-03 1.5795510297785847e-02 -2.4927324734736857e-03 4.2695422530471382e-03 -1.1002086249494654e-02 -2.1581936623679580e-02 -6.3273106663260855e-03 -1.6968888658810636e-02 -2.2320266329508231e-03 -1.9968648892182842e-03 5.3846845388675936e-03 -8.1838646732426117e-03 1.0432961892842428e-02 9.4162479240730394e-03 -1.7729326017254833e-02 7.3802024381341659e-03 -1.7065765343754133e-02 -7.9994885765206254e-03 -4.1217440751986356e-03 -2.0456483378369561e-03 -8.4179687951974041e-03 3.2533674022841338e-02 -1.2570706307970714e-02 5.4050248598195520e-04 -2.7550406302406863e-03 2.1653877963777523e-03 -1.7037977581960745e-03 -1.4939296146928906e-02 1.3966091615201452e-02 2.6606608339116628e-03 -2.7636073820480299e-03 3.3866466780660613e-03 -3.3752874643253419e-04 1.2041584414779325e-02 -1.2475068546298878e-02 7.5300422095848467e-03 -8.1838646732426152e-03 -4.4265106805610206e-03 7.7275783468681754e-03 -1.1811705529961797e-02 1.1999807783022304e-02 -2.6188214532478910e-03 -3.6805684171979580e-03 -4.1036224699635512e-02 1.8414201259151247e-02 -1.2570706307970714e-02 5.5018943603626663e-02 1.6218203359436256e-02 4.8962304245857048e-03 2.9237874679458705e-02 3.4904171744525193e-03 1.2576214273306904e-02 -3.8714520502570710e-02 -1.7224553453849979e-02 -9.4952319492416955e-03 -3.3329068341307694e-02 2.4404597877563045e-03 -1.2089786615170291e-02 3.5707351587327060e-02 -4.4265106805610153e-03 9.4162479240730412e-03 2.4581011358443823e-02 -1.6293395993137443e-02 1.0947600667615022e-02 -3.1465367685342353e-02 -2.6759545155295643e-03 -6.3707996541936037e-03 -1.0068014071294946e-02 1.7680625141373505e-02 5.4050248598195530e-04 1.6218203359436259e-02 3.8800088840779345e-02 1.2264010512768517e-02 1.6245157346877700e-02 -3.5666273433950838e-03 7.4991480479653311e-03 -5.6053376996920085e-03 -1.7794685073268219e-02 -1.0994826672477835e-02 -1.5353623183474982e-02 -8.1845075370012791e-03 -8.3537915651863814e-03 1.1475495387768282e-02 -2.7550406302406776e-03 2.9545823560325870e-03 4.8962304245857031e-03 -2.1503898882718024e-02 2.4611744891094413e-03 -1.7808111564205996e-02 2.4611744891094491e-03 -2.1503898882718024e-02 -1.7808111564205999e-02 2.9545823560325809e-03 -2.7550406302406854e-03 4.8962304245857048e-03 1.2264010512768517e-02 3.8800088840779352e-02 1.6245157346877696e-02 7.4991480479653337e-03 -3.5666273433950799e-03 -5.6053376996920146e-03 -1.0994826672477837e-02 -1.7794685073268222e-02 -1.5353623183474989e-02 -8.3537915651863900e-03 -8.1845075370012808e-03 1.1475495387768288e-02 5.4050248598195108e-04 1.7680625141373509e-02 1.6218203359436262e-02 -6.3707996541936054e-03 -2.6759545155295595e-03 -1.0068014071294951e-02 2.9147965310787529e-03 -1.6306191733338263e-02 -3.2663965146209284e-02 1.5795510297785843e-02 2.1653877963777523e-03 2.9237874679458705e-02 1.6245157346877700e-02 1.6245157346877700e-02 4.8578776497550998e-02 -4.0279505025467913e-03 -4.0279505025467930e-03 -3.9544355024314221e-02 -1.4184815611864554e-02 -1.4184815611864555e-02 -2.6243191998164505e-02 -2.6018941243704363e-03 -2.6018941243704332e-03 2.4060951458428868e-02 2.1653877963777562e-03 1.5795510297785850e-02 2.9237874679458705e-02 -1.6306191733338263e-02 2.9147965310787529e-03 -3.2663965146209277e-02 1.0537048770452478e-02 -1.0164439427570982e-03 -1.1798690409017338e-02 -2.4927324734736853e-03 -1.7037977581960745e-03 3.4904171744525184e-03 -3.5666273433950834e-03 7.4991480479653354e-03 -4.0279505025467939e-03 3.4881045723795197e-02 5.5019973942696948e-03 -1.3498457658654360e-02 -9.3666024972318893e-03 -8.0626681842317985e-03 -2.7420907550289799e-03 -1.1757198475064319e-02 -5.1005470383482824e-03 1.2374510623766363e-02 -1.4939296146928897e-02 4.2695422530471391e-03 1.2576214273306904e-02 -3.2956375581538037e-03 -1.3872307717489093e-03 3.6260472537216820e-03 -1.3872307717489056e-03 -3.2956375581538002e-03 3.6260472537216794e-03 4.2695422530471391e-03 -1.4939296146928904e-02 1.2576214273306907e-02 7.4991480479653302e-03 -3.5666273433950799e-03 -4.0279505025467939e-03 5.5019973942696948e-03 3.4881045723795204e-02 -1.3498457658654359e-02 -8.0626681842317968e-03 -9.3666024972318893e-03 -2.7420907550289816e-03 -5.1005470383482859e-03 -1.1757198475064321e-02 1.2374510623766367e-02 -1.7037977581960753e-03 -2.4927324734736796e-03 3.4904171744525210e-03 -1.0164439427570980e-03 1.0537048770452476e-02 -1.1798690409017340e-02 -1.1543780475130688e-02 3.8059981795635742e-03 3.3895131313318352e-02 -1.1002086249494654e-02 1.3966091615201452e-02 -3.8714520502570710e-02 -5.6053376996920076e-03 -5.6053376996920128e-03 -3.9544355024314221e-02 -1.3498457658654357e-02 -1.3498457658654359e-02 6.4301312213522158e-02 1.0849054833056161e-02 1.0849054833056161e-02 2.2309308591781825e-02 1.3028517455150521e-02 1.3028517455150518e-02 -3.7427487402485041e-02 1.3966091615201444e-02 -1.1002086249494657e-02 -3.8714520502570696e-02 3.8059981795635837e-03 -1.1543780475130688e-02 3.3895131313318345e-02 -2.6383649353160020e-03 1.5070942510536510e-03 3.4461141099119703e-03 -2.1581936623679580e-02 2.6606608339116633e-03 -1.7224553453849982e-02 -1.7794685073268219e-02 -1.0994826672477837e-02 -1.4184815611864554e-02 -9.3666024972318875e-03 -8.0626681842317985e-03 1.0849054833056159e-02 4.2205075477027953e-02 1.1761095584863972e-02 1.6284411392800621e-02 -4.9214836955054925e-03 7.4088763600627869e-03 -5.2102330645180843e-03 -2.7636073820480229e-03 -6.3273106663260864e-03 -9.4952319492416972e-03 1.6861604730021254e-02 2.0470784931436365e-03 1.5535253743705568e-02 2.0470784931436365e-03 1.6861604730021247e-02 1.5535253743705565e-02 -6.3273106663260855e-03 -2.7636073820480295e-03 -9.4952319492416972e-03 -1.0994826672477835e-02 -1.7794685073268222e-02 -1.4184815611864555e-02 -8.0626681842317985e-03 -9.3666024972318875e-03 1.0849054833056159e-02 1.1761095584863976e-02 4.2205075477027953e-02 1.6284411392800610e-02 7.4088763600628016e-03 -4.9214836955054943e-03 -5.2102330645180800e-03 2.6606608339116585e-03 -2.1581936623679569e-02 -1.7224553453849975e-02 1.5070942510536514e-03 -2.6383649353160024e-03 3.4461141099119729e-03 3.3793098526266343e-03 1.5770829334946036e-02 2.9188816376943583e-02 -1.6968888658810639e-02 3.3866466780660604e-03 -3.3329068341307694e-02 -1.5353623183474982e-02 -1.5353623183474989e-02 -2.6243191998164505e-02 -2.7420907550289799e-03 -2.7420907550289812e-03 2.2309308591781818e-02 1.6284411392800617e-02 1.6284411392800610e-02 5.4064061771380033e-02 -3.7565946611247420e-03 -3.7565946611247437e-03 -4.1849674436269128e-02 3.3866466780660539e-03 -1.6968888658810639e-02 -3.3329068341307687e-02 1.5770829334946040e-02 3.3793098526266295e-03 2.9188816376943580e-02 -1.4988577224833280e-02 4.4454081097531958e-03 1.3241445597926870e-02 -2.2320266329508209e-03 -3.3752874643253365e-04 2.4404597877563028e-03 -8.1845075370012791e-03 -8.3537915651863918e-03 -2.6018941243704363e-03 -1.1757198475064319e-02 -5.1005470383482859e-03 1.3028517455150521e-02 -4.9214836955054925e-03 7.4088763600628016e-03 -3.7565946611247429e-03 3.2718270951340812e-02 5.6659734697953436e-03 -1.3835248969667126e-02 1.2041584414779316e-02 -1.9968648892182929e-03 -1.2089786615170293e-02 -2.6760618007649300e-03 -1.7315257004258413e-03 3.5731015294989056e-03 -1.7315257004258443e-03 -2.6760618007649287e-03 3.5731015294989052e-03 -1.9968648892182846e-03 1.2041584414779325e-02 -1.2089786615170293e-02 -8.3537915651863831e-03 -8.1845075370012826e-03 -2.6018941243704332e-03 -5.1005470383482824e-03 -1.1757198475064321e-02 1.3028517455150520e-02 7.4088763600627869e-03 -4.9214836955054925e-03 -3.7565946611247429e-03 5.6659734697953445e-03 3.2718270951340812e-02 -1.3835248969667127e-02 -3.3752874643253115e-04 -2.2320266329508304e-03 2.4404597877563049e-03 4.4454081097531958e-03 -1.4988577224833287e-02 1.3241445597926865e-02 1.3100916746651902e-02 -1.0815056716570052e-02 -3.9326365844355324e-02 5.3846845388675919e-03 -1.2475068546298878e-02 3.5707351587327053e-02 1.1475495387768283e-02 1.1475495387768288e-02 2.4060951458428872e-02 1.2374510623766365e-02 1.2374510623766368e-02 -3.7427487402485041e-02 -5.2102330645180843e-03 -5.2102330645180791e-03 -4.1849674436269128e-02 -1.3835248969667126e-02 -1.3835248969667127e-02 6.2454238894381862e-02 -1.2475068546298875e-02 5.3846845388675936e-03 3.5707351587327053e-02 -1.0815056716570058e-02 1.3100916746651901e-02 -3.9326365844355324e-02 -1.1811705529961790e-02 7.7275783468681667e-03 1.1999807783022301e-02 -8.1838646732426117e-03 7.5300422095848458e-03 -4.4265106805610153e-03 -2.7550406302406794e-03 5.4050248598195021e-04 2.1653877963777554e-03 -1.4939296146928897e-02 -1.7037977581960753e-03 1.3966091615201445e-02 -2.7636073820480238e-03 2.6606608339116589e-03 3.3866466780660557e-03 1.2041584414779313e-02 -3.3752874643253094e-04 -1.2475068546298873e-02 3.2533674022841311e-02 -8.4179687951974023e-03 -1.2570706307970711e-02 -4.1217440751986261e-03 -7.9994885765206202e-03 -2.0456483378369591e-03 7.3802024381341685e-03 -1.7729326017254826e-02 -1.7065765343754136e-02 1.0432961892842428e-02 -8.1838646732426152e-03 9.4162479240730412e-03 2.9545823560325878e-03 1.7680625141373509e-02 1.5795510297785847e-02 4.2695422530471391e-03 -2.4927324734736788e-03 -1.1002086249494657e-02 -6.3273106663260872e-03 -2.1581936623679569e-02 -1.6968888658810639e-02 -1.9968648892182929e-03 -2.2320266329508317e-03 5.3846845388675971e-03 -8.4179687951974023e-03 3.8867974993380829e-02 1.8414201259151251e-02 -8.2951445893145424e-03 -4.3287137141527939e-03 -3.9739037678183028e-03 1.0947600667615022e-02 -1.6293395993137439e-02 -3.1465367685342346e-02 9.4162479240730394e-03 -4.4265106805610206e-03 2.4581011358443823e-02 4.8962304245857048e-03 1.6218203359436262e-02 2.9237874679458705e-02 1.2576214273306902e-02 3.4904171744525214e-03 -3.8714520502570703e-02 -9.4952319492416989e-03 -1.7224553453849975e-02 -3.3329068341307694e-02 -1.2089786615170293e-02 2.4404597877563032e-03 3.5707351587327060e-02 -1.2570706307970709e-02 1.8414201259151254e-02 5.5018943603626670e-02 -3.6805684171979658e-03 -2.6188214532478866e-03 -4.1036224699635512e-02 -9.2586849315009177e-03 1.0008046832806075e-02 9.2349456534409589e-03 -1.7729326017254837e-02 7.7275783468681762e-03 -1.6293395993137443e-02 -2.1503898882718024e-02 -6.3707996541936054e-03 -1.6306191733338266e-02 -3.2956375581538050e-03 -1.0164439427570978e-03 3.8059981795635816e-03 1.6861604730021258e-02 1.5070942510536508e-03 1.5770829334946036e-02 -2.6760618007649305e-03 4.4454081097531949e-03 -1.0815056716570057e-02 -4.1217440751986243e-03 -8.2951445893145424e-03 -3.6805684171979658e-03 4.1723748535569878e-02 -8.0057393542158611e-03 1.8283439692293148e-02 7.2355289825239873e-03 -9.2586849315009143e-03 -4.0983169734222146e-03 7.3802024381341659e-03 -1.1811705529961797e-02 1.0947600667615022e-02 2.4611744891094413e-03 -2.6759545155295586e-03 2.9147965310787529e-03 -1.3872307717489084e-03 1.0537048770452476e-02 -1.1543780475130687e-02 2.0470784931436352e-03 -2.6383649353160015e-03 3.3793098526266299e-03 -1.7315257004258417e-03 -1.4988577224833287e-02 1.3100916746651901e-02 -7.9994885765206202e-03 -4.3287137141527939e-03 -2.6188214532478875e-03 -8.0057393542158611e-03 3.5164952080841881e-02 -1.2081704896171514e-02 -4.0983169734222146e-03 9.2349456534409520e-03 2.2700628141950570e-02 -1.7065765343754133e-02 1.1999807783022306e-02 -3.1465367685342353e-02 -1.7808111564205996e-02 -1.0068014071294951e-02 -3.2663965146209270e-02 3.6260472537216802e-03 -1.1798690409017340e-02 3.3895131313318345e-02 1.5535253743705568e-02 3.4461141099119729e-03 2.9188816376943583e-02 3.5731015294989065e-03 1.3241445597926865e-02 -3.9326365844355338e-02 -2.0456483378369591e-03 -3.9739037678183002e-03 -4.1036224699635512e-02 1.8283439692293148e-02 -1.2081704896171514e-02 5.8707347543329971e-02 876 877 878 921 922 923 933 934 935 888 889 890 879 880 881 924 925 926 936 937 938 891 892 893 3.1464010540728213e-02 -9.4928879061426871e-03 -9.6191609889624448e-03 -2.2503998950380013e-03 -7.5266309119283942e-03 -5.0159924659958226e-04 -1.4205093191277276e-03 3.0774818471526392e-03 2.2722831246576028e-03 9.9234574304305281e-03 -3.2196466125153571e-03 -1.0194924516896579e-02 -3.9611407132417783e-03 1.8973300693565425e-03 2.2509682608549153e-03 -1.3475982721451061e-02 5.2559113273342761e-04 1.2346846707449510e-02 -1.0974633052846596e-02 8.8528109760999136e-03 8.5847463773592141e-03 -9.3048022694535749e-03 5.8859514052439117e-03 -5.1391597178626295e-03 -9.4928879061426871e-03 4.2401003527593961e-02 1.7086523531965381e-02 -8.1674085258236460e-03 -5.0993343703236741e-03 -8.7768360941391961e-03 -7.0908082319079664e-03 -2.4377614212364906e-02 -1.4444132149792947e-02 -2.7151784335370448e-03 -7.1434013119728898e-04 8.5186436251703905e-03 1.7287753409826138e-03 1.9504092803475998e-02 1.4381693608657473e-02 6.2243011339064144e-03 -3.9287232069435633e-03 -1.4706956959362642e-02 9.0912471084649612e-03 -2.1026606621047435e-02 -1.4686220742023864e-02 1.0421959514057357e-02 -6.7584777891930951e-03 1.2627285179525400e-02 -9.6191609889624448e-03 1.7086523531965381e-02 4.4055072049424215e-02 -2.0839048075383163e-03 -7.4608173764662659e-03 -3.2433011254103881e-02 -7.5122123039869813e-03 -1.6093241232491416e-02 -2.1764890940951988e-02 -1.0543215659683360e-02 8.8231103888887150e-03 2.6571181023147161e-02 2.8979077860942434e-03 1.4422078110247042e-02 1.8526625510126016e-02 1.1103726800950266e-02 -2.1835070151662076e-03 -3.1010148991327428e-02 9.4947737908002323e-03 -1.5831327547545765e-02 -2.0803868392460737e-02 6.2620853823263638e-03 1.2371811405685251e-03 1.6859040996146647e-02 -2.2503998950380013e-03 -8.1674085258236443e-03 -2.0839048075383176e-03 3.5086397181803702e-02 -4.3619128640104993e-03 1.7762822266262218e-02 1.6342634555296318e-02 5.4139852269645510e-03 1.3301726876266179e-02 -1.3919038114135072e-03 2.1417327421157993e-03 -1.0379886243937245e-02 -1.9449362747446478e-02 -8.8263440318067134e-03 -1.3857330363414109e-02 -3.5988503073436351e-03 -1.1025216144106092e-03 5.3287032111094456e-03 -8.4292895928275557e-03 1.1032095396281404e-02 6.2968043877553500e-03 -1.6309225383030836e-02 3.8703736706897050e-03 -1.6368935326503520e-02 -7.5266309119283942e-03 -5.0993343703236750e-03 -7.4608173764662677e-03 -4.3619128640104993e-03 2.5052468345881065e-02 -6.4308255933506692e-03 3.4744764501854447e-03 -1.6814256662386605e-04 7.0620311600047576e-03 -9.3418542082154702e-04 -9.4686983180130788e-03 7.4274118848067869e-03 -6.4801006997003213e-04 -4.0591431123646535e-03 -1.9351563710110810e-03 -1.5928474865589519e-05 6.6513364207116095e-03 -6.3621558482812139e-03 6.0081092009767979e-03 -5.6415678198507256e-03 1.3445228165805622e-03 4.0040820904338166e-03 -7.2669185794166846e-03 6.3549893277171201e-03 -5.0159924659958399e-04 -8.7768360941391944e-03 -3.2433011254103881e-02 1.7762822266262215e-02 -6.4308255933506701e-03 5.0791871055326863e-02 1.3984870771325703e-02 9.0958288551458190e-03 2.2742874635736082e-02 3.4323191490276930e-03 6.5320261557665661e-03 -3.6545378412566776e-02 -1.5431721122920447e-02 -1.3177410104795693e-02 -2.6132221754299332e-02 1.7835696625619238e-03 -6.2770303983639940e-03 3.3002675032354191e-02 -5.4950394484693070e-03 1.3194881863052076e-02 1.8389354660998544e-02 -1.5535222031188197e-02 5.8393653166850818e-03 -2.9816163963445688e-02 -1.4205093191277281e-03 -7.0908082319079656e-03 -7.5122123039869813e-03 1.6342634555296318e-02 3.4744764501854456e-03 1.3984870771325703e-02 3.5363249151346920e-02 1.3677008423643652e-02 1.1871072569818751e-02 -2.3061003699390513e-03 5.9815566890153958e-03 -5.7071590227892278e-03 -1.6171422720798585e-02 -1.2503771457695906e-02 -1.1385207759638047e-02 -8.3062774429027222e-03 -5.7639079053441551e-03 1.1366777128866410e-02 -3.9153482607000682e-03 3.0606988892313176e-03 3.2967537322532580e-03 -1.9586225593175091e-02 -8.3525285712778767e-04 -1.5914895115849859e-02 3.0774818471526388e-03 -2.4377614212364909e-02 -1.6093241232491416e-02 5.4139852269645510e-03 -1.6814256662386597e-04 9.0958288551458190e-03 1.3677008423643652e-02 4.0494118670243086e-02 1.4422959236760131e-02 6.1087676788454913e-03 -5.2800895396035632e-03 -9.9064038508244606e-03 -1.2271483128974157e-02 -2.0959605910260713e-02 -1.3605778893127616e-02 -8.2413041076801370e-03 -5.6377484446534978e-03 1.4841623513441890e-02 6.9117923727508249e-04 2.0350387848628877e-02 1.4463013627336568e-02 -8.4556351772271214e-03 -4.4213058453654273e-03 -1.3218001256240912e-02 2.2722831246576023e-03 -1.4444132149792947e-02 -2.1764890940951988e-02 1.3301726876266179e-02 7.0620311600047576e-03 2.2742874635736082e-02 1.1871072569818753e-02 1.4422959236760133e-02 3.6913466111147500e-02 -5.0269406879155229e-03 -9.2549200045327559e-03 -3.0779605330295265e-02 -1.0327831400129351e-02 -1.2571456821536951e-02 -1.7163878828093400e-02 -9.4372823094521652e-04 2.4858092454457495e-03 1.7294757513906252e-02 1.7869796489338658e-03 1.4328211739694535e-02 1.8437814928269795e-02 -1.2933561900686312e-02 -2.0285024060425257e-03 -2.5680538089718971e-02 9.9234574304305281e-03 -2.7151784335370443e-03 -1.0543215659683360e-02 -1.3919038114135075e-03 -9.3418542082154723e-04 3.4323191490276922e-03 -2.3061003699390509e-03 6.1087676788454913e-03 -5.0269406879155229e-03 3.2095915408051796e-02 2.8271515616520391e-03 -1.3068245554675633e-02 -9.3459426068368025e-03 -7.9111507865064924e-03 -1.0718640974992366e-03 -1.0871891370357848e-02 -2.6884414263583967e-03 1.2028509639178906e-02 -1.3790232187806076e-02 6.0175238912795097e-03 1.0556786275648898e-02 -4.3133024921290395e-03 -7.0448706455356318e-04 3.6926509359182604e-03 -3.2196466125153562e-03 -7.1434013119728464e-04 8.8231103888887132e-03 2.1417327421157989e-03 -9.4686983180130770e-03 6.5320261557665635e-03 5.9815566890153949e-03 -5.2800895396035597e-03 -9.2549200045327559e-03 2.8271515616520386e-03 2.8170382545262870e-02 -6.5209541795668759e-03 -5.6198074777517263e-03 -6.7793593945113702e-03 2.4178247745384549e-03 -2.5645899028540206e-03 -7.1816426065492017e-03 6.2355876632418797e-03 7.0433507457313678e-04 -4.3506577373809505e-03 -2.3668118517986259e-03 -2.5073207423526587e-04 5.6044051819925710e-03 -5.8658629465373575e-03 -1.0194924516896579e-02 8.5186436251703905e-03 2.6571181023147161e-02 -1.0379886243937243e-02 7.4274118848067869e-03 -3.6545378412566776e-02 -5.7071590227892278e-03 -9.9064038508244572e-03 -3.0779605330295265e-02 -1.3068245554675633e-02 -6.5209541795668759e-03 5.9750934487325033e-02 1.0869421907239349e-02 1.4354476894624530e-02 1.5790895713384198e-02 1.2609640027791458e-02 6.8402910740954954e-03 -3.5261033930588798e-02 1.2809847206178537e-02 -1.4863338214930031e-02 -3.0522333052821055e-02 3.0613061970893398e-03 -5.8501272333758301e-03 3.0995339502415502e-02 -3.9611407132417783e-03 1.7287753409826105e-03 2.8979077860942434e-03 -1.9449362747446478e-02 -6.4801006997003180e-04 -1.5431721122920444e-02 -1.6171422720798585e-02 -1.2271483128974157e-02 -1.0327831400129351e-02 -9.3459426068368025e-03 -5.6198074777517254e-03 1.0869421907239349e-02 3.6886208620086257e-02 1.3418456761367447e-02 1.2030179873241132e-02 -1.8993126734616710e-03 6.0458280751549513e-03 -6.0857769074361984e-03 -1.0690881352271066e-03 -7.0749049349849002e-03 -7.0909405494393677e-03 1.5010060976926160e-02 4.4211454341758147e-03 1.3138760413350636e-02 1.8973300693565425e-03 1.9504092803475998e-02 1.4422078110247042e-02 -8.8263440318067116e-03 -4.0591431123646543e-03 -1.3177410104795693e-02 -1.2503771457695908e-02 -2.0959605910260713e-02 -1.2571456821536951e-02 -7.9111507865064924e-03 -6.7793593945113710e-03 1.4354476894624530e-02 1.3418456761367445e-02 4.2285525146652667e-02 1.4834499004315814e-02 6.4301545923345083e-03 -4.7320740249424190e-03 -1.0481377630097552e-02 3.3272282751078950e-03 -2.4364569535259881e-02 -1.5461720995872556e-02 4.1680965778427203e-03 -8.9486597278962490e-04 8.0809115431153683e-03 2.2509682608549153e-03 1.4381693608657471e-02 1.8526625510126019e-02 -1.3857330363414109e-02 -1.9351563710110814e-03 -2.6132221754299332e-02 -1.1385207759638048e-02 -1.3605778893127616e-02 -1.7163878828093400e-02 -1.0718640974992368e-03 2.4178247745384553e-03 1.5790895713384198e-02 1.2030179873241131e-02 1.4834499004315813e-02 3.9828823839810783e-02 -4.1210242078036979e-03 -8.4882114865346484e-03 -3.1210032487703151e-02 2.7841197750141803e-03 -1.5285588188532130e-02 -2.1671451302592612e-02 1.3370158519244861e-02 7.6807175516937411e-03 2.2031239309367488e-02 -1.3475982721451061e-02 6.2243011339064135e-03 1.1103726800950266e-02 -3.5988503073436364e-03 -1.5928474865589681e-05 1.7835696625619244e-03 -8.3062774429027205e-03 -8.2413041076801370e-03 -9.4372823094521587e-04 -1.0871891370357848e-02 -2.5645899028540211e-03 1.2609640027791457e-02 -1.8993126734616714e-03 6.4301545923345083e-03 -4.1210242078036996e-03 2.8469874908403189e-02 3.0054125091865747e-03 -1.3540867993089371e-02 1.0783693017717295e-02 -3.9118423059005744e-03 -1.0552600534684336e-02 -1.1012534106035509e-03 -9.2620344412717103e-04 3.6612844752189778e-03 5.2559113273342761e-04 -3.9287232069435633e-03 -2.1835070151662072e-03 -1.1025216144106092e-03 6.6513364207116104e-03 -6.2770303983639923e-03 -5.7639079053441542e-03 -5.6377484446534978e-03 2.4858092454457495e-03 -2.6884414263583967e-03 -7.1816426065492017e-03 6.8402910740954954e-03 6.0458280751549513e-03 -4.7320740249424190e-03 -8.4882114865346484e-03 3.0054125091865738e-03 2.4444105265546776e-02 -6.9944134306666192e-03 -2.2665005120450200e-03 -3.7912748718903016e-04 7.5319582654880587e-03 2.2445397410832280e-03 -9.2361259159806728e-03 7.0851037457021629e-03 1.2346846707449507e-02 -1.4706956959362638e-02 -3.1010148991327435e-02 5.3287032111094456e-03 -6.3621558482812139e-03 3.3002675032354184e-02 1.1366777128866409e-02 1.4841623513441890e-02 1.7294757513906252e-02 1.2028509639178906e-02 6.2355876632418797e-03 -3.5261033930588791e-02 -6.0857769074361984e-03 -1.0481377630097552e-02 -3.1210032487703144e-02 -1.3540867993089369e-02 -6.9944134306666201e-03 5.6310879233163004e-02 -1.1229084098847958e-02 1.0502284487367723e-02 2.7268991048821939e-02 -1.0215107687230735e-02 6.9654082043565223e-03 -3.6396087418626009e-02 -1.0974633052846598e-02 9.0912471084649629e-03 9.4947737908002323e-03 -8.4292895928275539e-03 6.0081092009767970e-03 -5.4950394484693070e-03 -3.9153482607000682e-03 6.9117923727508314e-04 1.7869796489338658e-03 -1.3790232187806076e-02 7.0433507457313624e-04 1.2809847206178539e-02 -1.0690881352271070e-03 3.3272282751078941e-03 2.7841197750141790e-03 1.0783693017717295e-02 -2.2665005120450200e-03 -1.1229084098847958e-02 2.9116272461742670e-02 -9.9720145144950138e-03 -9.8158670106957193e-03 -1.7213742500525701e-03 -7.5835838698578399e-03 -3.3572986291383576e-04 8.8528109760999136e-03 -2.1026606621047435e-02 -1.5831327547545765e-02 1.1032095396281404e-02 -5.6415678198507239e-03 1.3194881863052078e-02 3.0606988892313176e-03 2.0350387848628877e-02 1.4328211739694535e-02 6.0175238912795088e-03 -4.3506577373809505e-03 -1.4863338214930029e-02 -7.0749049349849002e-03 -2.4364569535259881e-02 -1.5285588188532130e-02 -3.9118423059005753e-03 -3.7912748718903081e-04 1.0502284487367721e-02 -9.9720145144950138e-03 4.0180492509762272e-02 1.6902645979994826e-02 -8.0043673975116591e-03 -4.7683511576631366e-03 -8.9477701191012296e-03 8.5847463773592141e-03 -1.4686220742023864e-02 -2.0803868392460737e-02 6.2968043877553500e-03 1.3445228165805622e-03 1.8389354660998544e-02 3.2967537322532575e-03 1.4463013627336568e-02 1.8437814928269798e-02 1.0556786275648898e-02 -2.3668118517986250e-03 -3.0522333052821052e-02 -7.0909405494393677e-03 -1.5461720995872556e-02 -2.1671451302592612e-02 -1.0552600534684336e-02 7.5319582654880587e-03 2.7268991048821942e-02 -9.8158670106957193e-03 1.6902645979994826e-02 4.0270616569071181e-02 -1.2756826781972965e-03 -7.7273870997049722e-03 -3.1369124459287051e-02 -9.3048022694535749e-03 1.0421959514057357e-02 6.2620853823263630e-03 -1.6309225383030836e-02 4.0040820904338166e-03 -1.5535222031188197e-02 -1.9586225593175088e-02 -8.4556351772271214e-03 -1.2933561900686310e-02 -4.3133024921290395e-03 -2.5073207423526543e-04 3.0613061970893420e-03 1.5010060976926158e-02 4.1680965778427195e-03 1.3370158519244861e-02 -1.1012534106035518e-03 2.2445397410832276e-03 -1.0215107687230735e-02 -1.7213742500525697e-03 -8.0043673975116608e-03 -1.2756826781972982e-03 3.7326122421518497e-02 -4.1279432744430675e-03 1.7266024198641969e-02 5.8859514052439109e-03 -6.7584777891930943e-03 1.2371811405685242e-03 3.8703736706897055e-03 -7.2669185794166855e-03 5.8393653166850827e-03 -8.3525285712778789e-04 -4.4213058453654273e-03 -2.0285024060425253e-03 -7.0448706455356362e-04 5.6044051819925701e-03 -5.8501272333758301e-03 4.4211454341758147e-03 -8.9486597278962468e-04 7.6807175516937394e-03 -9.2620344412717125e-04 -9.2361259159806711e-03 6.9654082043565223e-03 -7.5835838698578399e-03 -4.7683511576631366e-03 -7.7273870997049713e-03 -4.1279432744430683e-03 2.7741640078416067e-02 -6.1166554741805433e-03 -5.1391597178626295e-03 1.2627285179525400e-02 1.6859040996146647e-02 -1.6368935326503520e-02 6.3549893277171209e-03 -2.9816163963445684e-02 -1.5914895115849859e-02 -1.3218001256240912e-02 -2.5680538089718971e-02 3.6926509359182591e-03 -5.8658629465373566e-03 3.0995339502415498e-02 1.3138760413350638e-02 8.0809115431153666e-03 2.2031239309367488e-02 3.6612844752189782e-03 7.0851037457021629e-03 -3.6396087418626009e-02 -3.3572986291383576e-04 -8.9477701191012279e-03 -3.1369124459287044e-02 1.7266024198641969e-02 -6.1166554741805424e-03 5.3376294123148073e-02 921 922 923 966 967 968 978 979 980 933 934 935 924 925 926 969 970 971 981 982 983 936 937 938 3.4733581995173651e-02 -1.0467247163500832e-02 -1.0729995527184148e-02 -2.8258349718321644e-03 -8.2927284615094202e-03 -5.7170128501890017e-04 -1.6305027077899333e-03 3.3637478287576669e-03 2.5562147400412711e-03 1.0985648175369234e-02 -3.4823909376576817e-03 -1.1386933182092038e-02 -3.9471031027150496e-03 2.1928299843126612e-03 2.5643663520000001e-03 -1.5129071943844099e-02 6.4519427972987921e-04 1.3656245197531721e-02 -1.2152984172807227e-02 9.6275818295379848e-03 9.5730455478189695e-03 -1.0033733271554419e-02 6.4130126403297329e-03 -5.6612418430968753e-03 -1.0467247163500828e-02 4.7183646929643337e-02 1.9317775318677181e-02 -9.0271603900382753e-03 -5.9043252119145408e-03 -1.0141755731379598e-02 -7.8890525111515227e-03 -2.7140523372255039e-02 -1.6335775749856635e-02 -3.1755945890979192e-03 -6.4863252894136662e-04 9.9452380240631962e-03 1.9661241489910509e-03 2.1934856346275025e-02 1.6314176011877308e-02 6.9409819808180593e-03 -4.8980047932386615e-03 -1.6685768908258930e-02 1.0114373718771167e-02 -2.3416697230290263e-02 -1.6715463181758237e-02 1.1537574805208268e-02 -7.1103201392784861e-03 1.4301574216635712e-02 -1.0729995527184150e-02 1.9317775318677181e-02 4.9442762644655025e-02 -2.3835591773961329e-03 -8.2359783449575466e-03 -3.6830471463065499e-02 -8.5065300277528972e-03 -1.8120791706075001e-02 -2.4525833161561941e-02 -1.1766497649790904e-02 9.7124795950874164e-03 3.0256419672626586e-02 3.1882966607538247e-03 1.6179103532461200e-02 2.1397566767559818e-02 1.2459048740269379e-02 -2.6774326994269885e-03 -3.5475791949724146e-02 1.0659194686549031e-02 -1.7730929145991371e-02 -2.3740401875474947e-02 7.0800422945518525e-03 1.5557734502251140e-03 1.9475749364985102e-02 -2.8258349718321626e-03 -9.0271603900382753e-03 -2.3835591773961329e-03 3.8694637992086306e-02 -4.7314113950018407e-03 1.9788320953518637e-02 1.7955148733654662e-02 6.0897414377528280e-03 1.4797181471930352e-02 -1.6446280111847625e-03 2.2791727666362110e-03 -1.1626165571096223e-02 -2.1652776276009211e-02 -9.6535587769279018e-03 -1.5402079936611234e-02 -3.4220729818455788e-03 -1.0797690611276771e-03 5.8793616191841949e-03 -9.0412190262259395e-03 1.2070475555655599e-02 7.0941362673314608e-03 -1.8063255458643311e-02 4.0525098630510518e-03 -1.8147195626861054e-02 -8.2927284615094202e-03 -5.9043252119145425e-03 -8.2359783449575466e-03 -4.7314113950018416e-03 2.7756338845906201e-02 -7.1249732178873442e-03 3.7722891907924715e-03 -1.5035834890884199e-04 7.7752089724290874e-03 -9.8134986118029056e-04 -1.0471699625477339e-02 8.2518381572746092e-03 -7.7186205012018589e-04 -4.8485574016403476e-03 -2.1950709926913461e-03 2.8423692165447051e-05 7.6623846410785231e-03 -7.0394740043774780e-03 6.5765672962532990e-03 -5.9898334266730666e-03 1.5161149561963867e-03 4.4000715886005227e-03 -8.0539494723705900e-03 7.0523344740136377e-03 -5.7170128501890061e-04 -1.0141755731379600e-02 -3.6830471463065506e-02 1.9788320953518637e-02 -7.1249732178873459e-03 5.7054475562223213e-02 1.5681498769406853e-02 1.0481242583405714e-02 2.5673263944789811e-02 3.8871023793413703e-03 7.2168406274051933e-03 -4.1312513509393835e-02 -1.7339170239575305e-02 -1.4718288979435175e-02 -2.9842726755227793e-02 2.1528674277813270e-03 -6.7346682775719247e-03 3.7815491186503333e-02 -6.1115425768683328e-03 1.4749091950234907e-02 2.1235136321414758e-02 -1.7487375428585649e-02 6.2725110452282271e-03 -3.3792655287243969e-02 -1.6305027077899341e-03 -7.8890525111515227e-03 -8.5065300277528955e-03 1.7955148733654662e-02 3.7722891907924698e-03 1.5681498769406853e-02 3.8790872944126531e-02 1.5143531958872854e-02 1.3279803699744814e-02 -2.5414638353117797e-03 6.5676636263472428e-03 -6.5776760963122518e-03 -1.7865217918338883e-02 -1.3707946649822628e-02 -1.2741595295405111e-02 -8.9064677403013163e-03 -6.1913968771656423e-03 1.2745642970077102e-02 -4.0401345268061993e-03 3.3607512837251501e-03 3.8089512536959910e-03 -2.1762234949233069e-02 -1.0558400215979254e-03 -1.7690095273454495e-02 3.3637478287576665e-03 -2.7140523372255046e-02 -1.8120791706074998e-02 6.0897414377528280e-03 -1.5035834890884156e-04 1.0481242583405714e-02 1.5143531958872854e-02 4.4713533514200786e-02 1.6233019078763549e-02 6.7813801717520753e-03 -5.8369712692616796e-03 -1.1479567542722313e-02 -1.3605011735262072e-02 -2.3269275334174170e-02 -1.5378642441018239e-02 -9.0180132287173819e-03 -5.8584213040725327e-03 1.6799272550222226e-02 7.1228246138318422e-04 2.2748394248224255e-02 1.6415940238156408e-02 -9.4676588945391514e-03 -5.2063781337527799e-03 -1.4950472760732343e-02 2.5562147400412715e-03 -1.6335775749856635e-02 -2.4525833161561941e-02 1.4797181471930352e-02 7.7752089724290856e-03 2.5673263944789811e-02 1.3279803699744814e-02 1.6233019078763549e-02 4.0953798771233757e-02 -5.4568795445739940e-03 -1.0179657461324459e-02 -3.4586739075658832e-02 -1.1592781848831182e-02 -1.4092029509465594e-02 -1.9477469595065446e-02 -1.0083106974090863e-03 2.9684697514508192e-03 1.9894227312544185e-02 2.0126230420180065e-03 1.6046797231847484e-02 2.1129833907713863e-02 -1.4587850862920179e-02 -2.4160323138442525e-03 -2.9061082103995391e-02 1.0985648175369234e-02 -3.1755945890979210e-03 -1.1766497649790904e-02 -1.6446280111847616e-03 -9.8134986118029099e-04 3.8871023793413699e-03 -2.5414638353117780e-03 6.7813801717520744e-03 -5.4568795445739922e-03 3.5228646424056882e-02 3.0543594218099407e-03 -1.4590422836674631e-02 -1.0060900608682919e-02 -8.6659512292010937e-03 -1.2339965140789461e-03 -1.2071378841409679e-02 -2.8195278019689748e-03 1.3392996917420677e-02 -1.5381875128199312e-02 6.5925539609839254e-03 1.1736282810104625e-02 -4.5140481746376538e-03 -7.8587007309766348e-04 4.0314144382518086e-03 -3.4823909376576812e-03 -6.4863252894136673e-04 9.7124795950874164e-03 2.2791727666362110e-03 -1.0471699625477339e-02 7.2168406274051933e-03 6.5676636263472428e-03 -5.8369712692616779e-03 -1.0179657461324458e-02 3.0543594218099407e-03 3.0910966399242231e-02 -7.2128573686162231e-03 -6.1285519287290289e-03 -7.2044104236469756e-03 2.7154238165568350e-03 -2.7672439607666745e-03 -7.9837956354496548e-03 6.8909719571358836e-03 8.4322485789345165e-04 -5.0843833825706571e-03 -2.6619423536607830e-03 -3.6623384553346181e-04 6.3189264661054432e-03 -6.4812588125838597e-03 -1.1386933182092038e-02 9.9452380240631997e-03 3.0256419672626586e-02 -1.1626165571096223e-02 8.2518381572746075e-03 -4.1312513509393828e-02 -6.5776760963122500e-03 -1.1479567542722315e-02 -3.4586739075658839e-02 -1.4590422836674631e-02 -7.2128573686162222e-03 6.6854024161805317e-02 1.2121888424484053e-02 1.6073281759533136e-02 1.8365819495526538e-02 1.4057304467592643e-02 7.3603026010577687e-03 -4.0110162547467278e-02 1.4406064992102507e-02 -1.6673793275390224e-02 -3.4796969174930040e-02 3.5959398019959326e-03 -6.2644423551999435e-03 3.5330120977491546e-02 -3.9471031027150461e-03 1.9661241489910509e-03 3.1882966607538251e-03 -2.1652776276009211e-02 -7.7186205012018546e-04 -1.7339170239575302e-02 -1.7865217918338883e-02 -1.3605011735262072e-02 -1.1592781848831181e-02 -1.0060900608682921e-02 -6.1285519287290306e-03 1.2121888424484051e-02 4.1596636198533904e-02 1.4739259467690134e-02 1.3519202931205090e-02 -3.4388213771477027e-03 6.5009839264764824e-03 -6.6434641663701338e-03 -1.7048305769021366e-03 -7.7724335127721022e-03 -7.9135492882233590e-03 1.7073013661261998e-02 5.0714916837257280e-03 1.4659577526557008e-02 2.1928299843126612e-03 2.1934856346275025e-02 1.6179103532461200e-02 -9.6535587769279018e-03 -4.8485574016403458e-03 -1.4718288979435178e-02 -1.3707946649822628e-02 -2.3269275334174170e-02 -1.4092029509465594e-02 -8.6659512292010937e-03 -7.2044104236469739e-03 1.6073281759533136e-02 1.4739259467690134e-02 4.7568562524702707e-02 1.6732313069363812e-02 6.8831256422789708e-03 -6.7000363967524429e-03 -1.1594069846040833e-02 3.6337391645923324e-03 -2.7271643358408596e-02 -1.7460654108393502e-02 4.5785023970775218e-03 -2.0949595635519108e-04 8.8803440819769600e-03 2.5643663520000027e-03 1.6314176011877308e-02 2.1397566767559818e-02 -1.5402079936611234e-02 -2.1950709926913461e-03 -2.9842726755227797e-02 -1.2741595295405111e-02 -1.5378642441018237e-02 -1.9477469595065442e-02 -1.2339965140789459e-03 2.7154238165568350e-03 1.8365819495526535e-02 1.3519202931205090e-02 1.6732313069363805e-02 4.5677127707613494e-02 -4.8026517060453999e-03 -9.9112997555779875e-03 -3.6663999846562108e-02 3.0557579661055234e-03 -1.7154659678665828e-02 -2.5024977494681012e-02 1.5040996202830075e-02 8.8777599701554567e-03 2.5568659720836523e-02 -1.5129071943844099e-02 6.9409819808180602e-03 1.2459048740269377e-02 -3.4220729818455779e-03 2.8423692165446888e-05 2.1528674277813261e-03 -8.9064677403013163e-03 -9.0180132287173819e-03 -1.0083106974090859e-03 -1.2071378841409679e-02 -2.7672439607666745e-03 1.4057304467592643e-02 -3.4388213771477027e-03 6.8831256422789717e-03 -4.8026517060453999e-03 3.2479610863709742e-02 3.1505058329087368e-03 -1.5035367061923972e-02 1.2327125442416122e-02 -4.2149608995262142e-03 -1.1768519353133097e-02 -1.8389234215774883e-03 -1.0028190591609407e-03 3.9456281828682063e-03 6.4519427972987888e-04 -4.8980047932386606e-03 -2.6774326994269890e-03 -1.0797690611276773e-03 7.6623846410785231e-03 -6.7346682775719239e-03 -6.1913968771656414e-03 -5.8584213040725327e-03 2.9684697514508192e-03 -2.8195278019689748e-03 -7.9837956354496548e-03 7.3603026010577687e-03 6.5009839264764824e-03 -6.7000363967524429e-03 -9.9112997555779857e-03 3.1505058329087364e-03 2.8003500788096745e-02 -7.4587161088665518e-03 -2.6285620586329449e-03 3.5055587235406985e-04 8.8048711399946189e-03 2.4225717597801417e-03 -1.0576183172016047e-02 7.6484733489402424e-03 1.3656245197531721e-02 -1.6685768908258930e-02 -3.5475791949724146e-02 5.8793616191841949e-03 -7.0394740043774788e-03 3.7815491186503333e-02 1.2745642970077103e-02 1.6799272550222226e-02 1.9894227312544185e-02 1.3392996917420677e-02 6.8909719571358828e-03 -4.0110162547467285e-02 -6.6434641663701381e-03 -1.1594069846040840e-02 -3.6663999846562108e-02 -1.5035367061923970e-02 -7.4587161088665492e-03 6.4683113666753389e-02 -1.2529585579257652e-02 1.1607365936416989e-02 3.1551884611468274e-02 -1.1465829896661938e-02 7.4804184237686868e-03 -4.1694762433515629e-02 -1.2152984172807227e-02 1.0114373718771167e-02 1.0659194686549031e-02 -9.0412190262259395e-03 6.5765672962532998e-03 -6.1115425768683328e-03 -4.0401345268061993e-03 7.1228246138318378e-04 2.0126230420180065e-03 -1.5381875128199312e-02 8.4322485789345154e-04 1.4406064992102511e-02 -1.7048305769021377e-03 3.6337391645923315e-03 3.0557579661055238e-03 1.2327125442416122e-02 -2.6285620586329458e-03 -1.2529585579257652e-02 3.2836815130056041e-02 -1.0937134279526002e-02 -1.1007460060757944e-02 -2.8428971415313453e-03 -8.3144911607344833e-03 -4.8505246989114393e-04 9.6275818295379866e-03 -2.3416697230290263e-02 -1.7730929145991371e-02 1.2070475555655597e-02 -5.9898334266730666e-03 1.4749091950234907e-02 3.3607512837251505e-03 2.2748394248224255e-02 1.6046797231847484e-02 6.5925539609839254e-03 -5.0843833825706571e-03 -1.6673793275390224e-02 -7.7724335127721022e-03 -2.7271643358408596e-02 -1.7154659678665828e-02 -4.2149608995262142e-03 3.5055587235407137e-04 1.1607365936416991e-02 -1.0937134279526002e-02 4.5045202625325971e-02 1.9068094750107088e-02 -8.7268339380783405e-03 -6.3815953479617197e-03 -9.9119677685590418e-03 9.5730455478189695e-03 -1.6715463181758237e-02 -2.3740401875474947e-02 7.0941362673314617e-03 1.5161149561963864e-03 2.1235136321414758e-02 3.8089512536959905e-03 1.6415940238156408e-02 2.1129833907713863e-02 1.1736282810104623e-02 -2.6619423536607821e-03 -3.4796969174930040e-02 -7.9135492882233573e-03 -1.7460654108393502e-02 -2.5024977494681008e-02 -1.1768519353133097e-02 8.8048711399946189e-03 3.1551884611468274e-02 -1.1007460060757944e-02 1.9068094750107085e-02 4.6079458728173116e-02 -1.5228871768366448e-03 -8.9669614406419854e-03 -3.6433965023684012e-02 -1.0033733271554417e-02 1.1537574805208268e-02 7.0800422945518507e-03 -1.8063255458643311e-02 4.4000715886005227e-03 -1.7487375428585649e-02 -2.1762234949233069e-02 -9.4676588945391514e-03 -1.4587850862920179e-02 -4.5140481746376547e-03 -3.6623384553346170e-04 3.5959398019959313e-03 1.7073013661261998e-02 4.5785023970775218e-03 1.5040996202830075e-02 -1.8389234215774888e-03 2.4225717597801412e-03 -1.1465829896661938e-02 -2.8428971415313418e-03 -8.7268339380783405e-03 -1.5228871768366444e-03 4.1982078755915288e-02 -4.3779938725154975e-03 1.9346965065626547e-02 6.4130126403297329e-03 -7.1103201392784879e-03 1.5557734502251140e-03 4.0525098630510518e-03 -8.0539494723705900e-03 6.2725110452282254e-03 -1.0558400215979257e-03 -5.2063781337527790e-03 -2.4160323138442525e-03 -7.8587007309766370e-04 6.3189264661054423e-03 -6.2644423551999444e-03 5.0714916837257271e-03 -2.0949595635518924e-04 8.8777599701554584e-03 -1.0028190591609407e-03 -1.0576183172016047e-02 7.4804184237686850e-03 -8.3144911607344833e-03 -6.3815953479617188e-03 -8.9669614406419872e-03 -4.3779938725154992e-03 3.1218995755629371e-02 -6.5390267796912940e-03 -5.6612418430968753e-03 1.4301574216635710e-02 1.9475749364985098e-02 -1.8147195626861054e-02 7.0523344740136360e-03 -3.3792655287243969e-02 -1.7690095273454498e-02 -1.4950472760732345e-02 -2.9061082103995394e-02 4.0314144382518104e-03 -6.4812588125838597e-03 3.5330120977491553e-02 1.4659577526557008e-02 8.8803440819769583e-03 2.5568659720836519e-02 3.9456281828682055e-03 7.6484733489402415e-03 -4.1694762433515629e-02 -4.8505246989114263e-04 -9.9119677685590400e-03 -3.6433965023684012e-02 1.9346965065626547e-02 -6.5390267796912949e-03 6.0607934785125835e-02 888 889 890 933 934 935 942 943 944 897 898 899 891 892 893 936 937 938 945 946 947 900 901 902 3.1160509392716109e-02 -1.1389377362965887e-02 -7.8997918795639683e-03 -9.2553905915242034e-04 -7.2575838260333873e-03 1.2503067948518650e-03 -1.4670045149548449e-04 3.8232467114715941e-03 1.7224531966189092e-03 1.0504918454891071e-02 -5.0627772971840283e-03 -9.6049906395800789e-03 -5.2398462883721138e-03 1.8417402692563578e-03 1.6261939560945180e-03 -1.3841525853681357e-02 2.8019633553069694e-03 1.2433909426641234e-02 -1.1386449067268408e-02 1.0504445219575361e-02 6.8856222012866272e-03 -1.0125367127637404e-02 4.7383429305730236e-03 -6.4137030563491092e-03 -1.1389377362965886e-02 4.6142189006940199e-02 1.5157120531136435e-02 -8.2225209092332205e-03 -8.6282456398395976e-03 -1.2605881631898356e-02 -7.9786883171445409e-03 -2.7848993373875516e-02 -1.1879122760535273e-02 -4.7272682944339969e-03 3.3799807881181752e-03 1.2124902283074184e-02 1.8286852457239781e-03 2.2889552210794136e-02 1.2380749403650844e-02 8.2616155057579545e-03 -7.7941731017557398e-03 -1.8041779780618872e-02 1.1026222640622968e-02 -2.4847977955058213e-02 -1.2557725078720904e-02 1.1201331491672751e-02 -3.2923319353234453e-03 1.5421737033911934e-02 -7.8997918795639683e-03 1.5157120531136437e-02 3.6008982807866401e-02 -2.7678194684050404e-04 -1.1245361649706785e-02 -2.6741644670812009e-02 -5.8812809106893451e-03 -1.3586504043362493e-02 -1.4750693797347459e-02 -1.0222950477638201e-02 1.2397629050172243e-02 2.1436321243760850e-02 2.4012451705219175e-03 1.2411733472659352e-02 1.1869519062695705e-02 9.9250729346444626e-03 -6.2442094428756412e-03 -2.5883338564555162e-02 7.8882520266404851e-03 -1.3724596045936819e-02 -1.4279779245392150e-02 4.0662350829251655e-03 4.8341881279137071e-03 1.2340633163783820e-02 -9.2553905915242120e-04 -8.2225209092332188e-03 -2.7678194684050425e-04 3.4820844413187918e-02 -7.5223966194701915e-04 1.8101076897235280e-02 1.6537830906325504e-02 7.8017527390952402e-03 1.1644998935134442e-02 -3.4962016948196246e-04 2.3397603420176924e-04 -1.0412778824100948e-02 -1.9452478277056550e-02 -1.1290303413278776e-02 -1.1681796705992958e-02 -4.7263011732148969e-03 -1.3131848784593653e-04 5.3889091602282464e-03 -9.3617551996259367e-03 1.1763430265638114e-02 3.8062638555413256e-03 -1.6542981440981645e-02 5.9722343336983180e-04 -1.6569891371204883e-02 -7.2575838260333873e-03 -8.6282456398395976e-03 -1.1245361649706785e-02 -7.5223966194701926e-04 2.2841904189771660e-02 -8.7262263132708911e-04 6.1195216660649872e-03 3.8644334319923299e-03 1.0259714284884926e-02 -1.7677256210699952e-04 -7.3400514007477729e-03 1.6878060999374102e-03 -3.6424523526977664e-03 -7.6950708935623101e-03 -5.3834564952611489e-03 2.0347202856513412e-04 4.5999920863356572e-03 -8.7512943355080083e-04 4.6767649337522092e-03 -2.0051328396366004e-03 5.0364234905302266e-03 8.2928977440284283e-04 -5.6378289343133707e-03 1.3926263344932602e-03 1.2503067948518634e-03 -1.2605881631898354e-02 -2.6741644670812009e-02 1.8101076897235276e-02 -8.7262263132708955e-04 5.0088928294140404e-02 1.2832743648383885e-02 1.2192025340706063e-02 1.7734537277872432e-02 3.8017779979979292e-03 9.9217153875156921e-04 -3.6121000925671720e-02 -1.4725798375086082e-02 -1.5949498192367892e-02 -2.1430977313596753e-02 1.6057356629136984e-03 -8.0897985134277984e-04 3.2494847616891052e-02 -6.9328062645474852e-03 1.6047094366483942e-02 1.3636939698272853e-02 -1.5933036361749101e-02 1.0056910609945403e-03 -2.9661629977096253e-02 -1.4670045149548601e-04 -7.9786883171445409e-03 -5.8812809106893451e-03 1.6537830906325497e-02 6.1195216660649863e-03 1.2832743648383885e-02 3.4666196500728670e-02 1.5393349047207690e-02 8.6287055598748049e-03 -6.5581569076829382e-04 5.0191813664497986e-03 -6.5143146490420894e-03 -1.6037614583399213e-02 -1.4227874677749996e-02 -8.5525859543832562e-03 -8.9917146058351525e-03 -3.5532337448877104e-03 1.2132314094085422e-02 -5.7092716131720714e-03 3.1386480066657356e-03 2.4346814088942893e-03 -1.9662910462383960e-02 -3.9109033466059638e-03 -1.5080263197123708e-02 3.8232467114715941e-03 -2.7848993373875516e-02 -1.3586504043362492e-02 7.8017527390952393e-03 3.8644334319923299e-03 1.2192025340706064e-02 1.5393349047207690e-02 4.3629182610989158e-02 1.1691576527612055e-02 5.2327406670523297e-03 -8.3796572048885718e-03 -1.3108942663124861e-02 -1.3700946555511167e-02 -2.4496808438331102e-02 -1.1204322843587265e-02 -8.4094759382241386e-03 -1.9321854572854485e-03 1.7656960198061501e-02 5.6753274355473117e-04 2.3114994176388955e-02 1.2082306039231572e-02 -1.0708199414646288e-02 -7.9509657449898050e-03 -1.5723098555536563e-02 1.7224531966189087e-03 -1.1879122760535271e-02 -1.4750693797347459e-02 1.1644998935134444e-02 1.0259714284884926e-02 1.7734537277872432e-02 8.6287055598748049e-03 1.1691576527612057e-02 2.9882802728054970e-02 -5.9772918860037678e-03 -1.2623304458009943e-02 -2.3800064848867465e-02 -7.4106004128221704e-03 -1.0070953013880841e-02 -1.1579769061729327e-02 6.7627848417822322e-04 5.8422432452756726e-03 1.1909646809122166e-02 1.5117295701056938e-03 1.1916846342936247e-02 1.1281698621305972e-02 -1.0796273447086138e-02 -5.1370001682828461e-03 -2.0678157728411282e-02 1.0504918454891071e-02 -4.7272682944339986e-03 -1.0222950477638203e-02 -3.4962016948196332e-04 -1.7677256210699954e-04 3.8017779979979292e-03 -6.5581569076829513e-04 5.2327406670523314e-03 -5.9772918860037678e-03 3.1975637403099479e-02 3.9276211706265287e-04 -1.3729505461194698e-02 -1.0005087826614514e-02 -8.1736992164200047e-03 3.0352550931888781e-04 -1.1223913649047249e-02 -4.0489424501781820e-04 1.2705444846478771e-02 -1.4257033620374466e-02 7.9278046137303999e-03 9.4514170495635132e-03 -5.9890849017040660e-03 -7.0673079866560840e-05 3.6675824214775724e-03 -5.0627772971840283e-03 3.3799807881181761e-03 1.2397629050172243e-02 2.3397603420176907e-04 -7.3400514007477737e-03 9.9217153875156877e-04 5.0191813664497986e-03 -8.3796572048885735e-03 -1.2623304458009943e-02 3.9276211706265282e-04 2.6089416303586667e-02 -4.2936658783534787e-04 -3.6371356481327121e-03 -3.2523683861513143e-03 5.6718781408082990e-03 -2.3026689278147767e-04 -5.6621582204576595e-03 7.3828792494719112e-04 3.0981575505366777e-03 -8.1044277649999653e-03 -6.0456721108016597e-03 1.8610276984731835e-04 3.2692658855404430e-03 -7.0162349803235653e-04 -9.6049906395800771e-03 1.2124902283074182e-02 2.1436321243760850e-02 -1.0412778824100946e-02 1.6878060999374104e-03 -3.6121000925671720e-02 -6.5143146490420859e-03 -1.3108942663124859e-02 -2.3800064848867465e-02 -1.3729505461194700e-02 -4.2936658783534738e-04 5.8510946373919070e-02 1.1477880017455103e-02 1.7082122525594969e-02 1.0695660651836414e-02 1.3056627476868187e-02 1.1649583760612869e-03 -3.5216943293889406e-02 1.2862448050131516e-02 -1.7849851610339813e-02 -2.5070958465194467e-02 2.8646340294630201e-03 -6.7162842336782860e-04 2.9566039264106721e-02 -5.2398462883721146e-03 1.8286852457239783e-03 2.4012451705219180e-03 -1.9452478277056550e-02 -3.6424523526977664e-03 -1.4725798375086085e-02 -1.6037614583399210e-02 -1.3700946555511167e-02 -7.4106004128221712e-03 -1.0005087826614512e-02 -3.6371356481327121e-03 1.1477880017455103e-02 3.6062785074101947e-02 1.5166772697967807e-02 8.9311259144862713e-03 -8.6513162746084077e-04 4.8850234099375618e-03 -6.9940764672149379e-03 2.1563555695199217e-04 -7.7532025727778814e-03 -5.3380044078673843e-03 1.5321737971849304e-02 6.8532557754901772e-03 1.1658228560527284e-02 1.8417402692563589e-03 2.2889552210794140e-02 1.2411733472659350e-02 -1.1290303413278776e-02 -7.6950708935623084e-03 -1.5949498192367892e-02 -1.4227874677749996e-02 -2.4496808438331102e-02 -1.0070953013880843e-02 -8.1736992164200047e-03 -3.2523683861513156e-03 1.7082122525594969e-02 1.5166772697967805e-02 4.5784261748416315e-02 1.2511061362148097e-02 5.6805533834035134e-03 -8.4719077774047039e-03 -1.4159787385388891e-02 4.2842821333281119e-03 -2.7874341874099016e-02 -1.2998158937039778e-02 6.7185288234929957e-03 3.1166834103379952e-03 1.1173480168274987e-02 1.6261939560945184e-03 1.2380749403650844e-02 1.1869519062695703e-02 -1.1681796705992956e-02 -5.3834564952611481e-03 -2.1430977313596753e-02 -8.5525859543832579e-03 -1.1204322843587265e-02 -1.1579769061729325e-02 3.0352550931888808e-04 5.6718781408083008e-03 1.0695660651836414e-02 8.9311259144862713e-03 1.2511061362148097e-02 3.2846888171983203e-02 -5.0571899888099429e-03 -1.2118534933711901e-02 -2.5074359541247520e-02 2.3197389869513037e-03 -1.2666873395028295e-02 -1.4688666621433279e-02 1.2110988282335184e-02 1.0809498760981365e-02 1.7361704651491547e-02 -1.3841525853681355e-02 8.2616155057579528e-03 9.9250729346444626e-03 -4.7263011732149003e-03 2.0347202856513418e-04 1.6057356629137003e-03 -8.9917146058351560e-03 -8.4094759382241386e-03 6.7627848417822268e-04 -1.1223913649047252e-02 -2.3026689278147778e-04 1.3056627476868185e-02 -8.6513162746084033e-04 5.6805533834035134e-03 -5.0571899888099429e-03 2.8402802683584721e-02 4.3382755464664287e-04 -1.4177725959936485e-02 1.1375855282518148e-02 -5.7613935305541241e-03 -9.8598379088506195e-03 -1.3007105686336650e-04 -1.7833211081350181e-04 3.8310392989924806e-03 2.8019633553069681e-03 -7.7941731017557398e-03 -6.2442094428756412e-03 -1.3131848784593664e-04 4.5999920863356589e-03 -8.0897985134278005e-04 -3.5532337448877095e-03 -1.9321854572854479e-03 5.8422432452756726e-03 -4.0489424501781825e-04 -5.6621582204576595e-03 1.1649583760612874e-03 4.8850234099375618e-03 -8.4719077774047039e-03 -1.2118534933711901e-02 4.3382755464664309e-04 2.2408839169904767e-02 -6.2307743053403354e-04 -4.3508814034459173e-03 3.9661483848272908e-03 1.1309311768393907e-02 3.1951356130621006e-04 -7.1145550841641633e-03 1.4782882687334883e-03 1.2433909426641234e-02 -1.8041779780618872e-02 -2.5883338564555162e-02 5.3889091602282438e-03 -8.7512943355080115e-04 3.2494847616891052e-02 1.2132314094085422e-02 1.7656960198061501e-02 1.1909646809122166e-02 1.2705444846478769e-02 7.3828792494719112e-04 -3.5216943293889413e-02 -6.9940764672149405e-03 -1.4159787385388889e-02 -2.5074359541247513e-02 -1.4177725959936483e-02 -6.2307743053403376e-04 5.5881181505078911e-02 -1.1046636265084406e-02 1.4101233556194444e-02 2.1901371099403481e-02 -1.0442138835197850e-02 1.2032923508894693e-03 -3.6012405630803518e-02 -1.1386449067268408e-02 1.1026222640622968e-02 7.8882520266404851e-03 -9.3617551996259384e-03 4.6767649337522100e-03 -6.9328062645474869e-03 -5.7092716131720723e-03 5.6753274355473150e-04 1.5117295701056938e-03 -1.4257033620374462e-02 3.0981575505366786e-03 1.2862448050131519e-02 2.1563555695199238e-04 4.2842821333281119e-03 2.3197389869513037e-03 1.1375855282518147e-02 -4.3508814034459165e-03 -1.1046636265084406e-02 2.9078330865573779e-02 -1.1947316862924632e-02 -7.9939776575730058e-03 4.4687795396973831e-05 -7.3547617354241517e-03 1.3912515533759007e-03 1.0504445219575363e-02 -2.4847977955058210e-02 -1.3724596045936819e-02 1.1763430265638114e-02 -2.0051328396366004e-03 1.6047094366483945e-02 3.1386480066657365e-03 2.3114994176388959e-02 1.1916846342936245e-02 7.9278046137303999e-03 -8.1044277649999653e-03 -1.7849851610339813e-02 -7.7532025727778814e-03 -2.7874341874099016e-02 -1.2666873395028295e-02 -5.7613935305541241e-03 3.9661483848272925e-03 1.4101233556194442e-02 -1.1947316862924632e-02 4.3677643564901968e-02 1.4502254202485181e-02 -7.8724151393529812e-03 -7.9269056923244249e-03 -1.2326107416794886e-02 6.8856222012866272e-03 -1.2557725078720904e-02 -1.4279779245392152e-02 3.8062638555413260e-03 5.0364234905302266e-03 1.3636939698272855e-02 2.4346814088942893e-03 1.2082306039231569e-02 1.1281698621305968e-02 9.4514170495635166e-03 -6.0456721108016597e-03 -2.5070958465194464e-02 -5.3380044078673835e-03 -1.2998158937039780e-02 -1.4688666621433279e-02 -9.8598379088506195e-03 1.1309311768393907e-02 2.1901371099403474e-02 -7.9939776575730058e-03 1.4502254202485182e-02 3.2240017777073915e-02 6.1383545900524925e-04 -1.1328739374078540e-02 -2.5020622864036307e-02 -1.0125367127637404e-02 1.1201331491672753e-02 4.0662350829251638e-03 -1.6542981440981645e-02 8.2928977440284305e-04 -1.5933036361749101e-02 -1.9662910462383960e-02 -1.0708199414646288e-02 -1.0796273447086138e-02 -5.9890849017040660e-03 1.8610276984731822e-04 2.8646340294630210e-03 1.5321737971849306e-02 6.7185288234929957e-03 1.2110988282335184e-02 -1.3007105686336650e-04 3.1951356130621017e-04 -1.0442138835197850e-02 4.4687795396973398e-05 -7.8724151393529795e-03 6.1383545900524882e-04 3.7083989222324157e-02 -6.7415186672285451e-04 1.7515755790304469e-02 4.7383429305730236e-03 -3.2923319353234445e-03 4.8341881279137071e-03 5.9722343336983147e-04 -5.6378289343133716e-03 1.0056910609945403e-03 -3.9109033466059630e-03 -7.9509657449898050e-03 -5.1370001682828461e-03 -7.0673079866560894e-05 3.2692658855404430e-03 -6.7162842336782806e-04 6.8532557754901781e-03 3.1166834103379948e-03 1.0809498760981367e-02 -1.7833211081350151e-04 -7.1145550841641651e-03 1.2032923508894691e-03 -7.3547617354241509e-03 -7.9269056923244267e-03 -1.1328739374078540e-02 -6.7415186672285473e-04 2.5536638095236770e-02 -7.1530233504986753e-04 -6.4137030563491083e-03 1.5421737033911934e-02 1.2340633163783822e-02 -1.6569891371204883e-02 1.3926263344932602e-03 -2.9661629977096263e-02 -1.5080263197123706e-02 -1.5723098555536563e-02 -2.0678157728411282e-02 3.6675824214775733e-03 -7.0162349803235663e-04 2.9566039264106725e-02 1.1658228560527284e-02 1.1173480168274987e-02 1.7361704651491550e-02 3.8310392989924806e-03 1.4782882687334885e-03 -3.6012405630803518e-02 1.3912515533759020e-03 -1.2326107416794884e-02 -2.5020622864036304e-02 1.7515755790304465e-02 -7.1530233504986894e-04 5.2104439120965254e-02 933 934 935 978 979 980 990 991 992 942 943 944 936 937 938 981 982 983 993 994 995 945 946 947 3.4226279154919555e-02 -1.2641257355517342e-02 -8.9240907842842269e-03 -1.0829091848236631e-03 -7.9451837839678695e-03 1.4738973404379346e-03 -3.8207546654268811e-04 4.2571793506585940e-03 2.0208327248338112e-03 1.1637670454720844e-02 -5.5589223424386495e-03 -1.0822069926643082e-02 -5.5081374615292417e-03 1.9736423472057601e-03 1.7338493186218413e-03 -1.5408256093112383e-02 3.2066118508988334e-03 1.3763603442371647e-02 -1.2607731675392220e-02 1.1579176550032199e-02 7.8109906600987754e-03 -1.0874839728240210e-02 5.1287533831284749e-03 -7.0570127754367024e-03 -1.2641257355517346e-02 5.1324506619162664e-02 1.7330666223902020e-02 -9.2388371265249014e-03 -9.6703390444508597e-03 -1.4462438471495958e-02 -8.8433580026698426e-03 -3.1346677675033428e-02 -1.3601482723131620e-02 -5.3416891174550268e-03 4.0463654961138311e-03 1.3970353459084952e-02 2.2542390707088033e-03 2.5832148086946928e-02 1.4269826163427375e-02 9.2573316517264512e-03 -9.0968195778212985e-03 -2.0431029310033294e-02 1.2182436926349609e-02 -2.7939427363973934e-02 -1.4503183270528894e-02 1.2371133953382237e-02 -3.1497565409438952e-03 1.7427287928775417e-02 -8.9240907842842269e-03 1.7330666223902020e-02 4.0245561740500924e-02 -5.8357311875690838e-04 -1.2473595107486957e-02 -3.0189152851429087e-02 -6.6654805850703165e-03 -1.5595633479013750e-02 -1.6921208483146963e-02 -1.1315078617167679e-02 1.3804968581617838e-02 2.4542072959701431e-02 2.7728730549129695e-03 1.4185852388807950e-02 1.3902337943423267e-02 1.1205918304588737e-02 -7.1781316664451924e-03 -2.9482323390349102e-02 8.8634350901448736e-03 -1.5662428355543455e-02 -1.6536242867679470e-02 4.6459966556325416e-03 5.5883014141615527e-03 1.4438954948978996e-02 -1.0829091848236631e-03 -9.2388371265249031e-03 -5.8357311875690946e-04 3.8124268883739793e-02 -7.0561659571193828e-04 2.0110795417278563e-02 1.8201602806741050e-02 8.8246913319917197e-03 1.3023913502688184e-02 -5.0081083604385694e-04 1.5118642717414462e-04 -1.1658304293108494e-02 -2.1585606013577362e-02 -1.2464218144951134e-02 -1.3105060583359966e-02 -4.9389435165377929e-03 -1.0300116570150369e-05 6.0830896008967896e-03 -9.9934404589813227e-03 1.2985348737010025e-02 4.4825640784412393e-03 -1.8224161680516843e-02 4.5774548758223041e-04 -1.8353424604079408e-02 -7.9451837839678695e-03 -9.6703390444508597e-03 -1.2473595107486957e-02 -7.0561659571193838e-04 2.4977904070510478e-02 -8.1122702214457185e-04 6.7785027453560664e-03 4.4708131238451604e-03 1.1410129790280114e-02 -1.3275034185268123e-04 -8.1038062896009368e-03 1.6413061943359871e-03 -4.1659160039514828e-03 -8.7740727804043236e-03 -6.0652215130884224e-03 2.7613251723654429e-04 5.2563337231870920e-03 -7.7980617134469849e-04 5.1078964345036993e-03 -1.8883851748720190e-03 5.7133849959126095e-03 7.8693502838766472e-04 -6.2684476282145862e-03 1.3650288335359420e-03 1.4738973404379366e-03 -1.4462438471495958e-02 -3.0189152851429094e-02 2.0110795417278560e-02 -8.1122702214457359e-04 5.5624986197107200e-02 1.4307230833306723e-02 1.3911178554761806e-02 2.0226805612135121e-02 4.1779125793865463e-03 9.8527325965618246e-04 -4.0536584383497984e-02 -1.6552213546621376e-02 -1.7920356651443987e-02 -2.4459700735471972e-02 1.7266237446489617e-03 -5.4076705850488068e-04 3.6692567994893968e-02 -7.5302605794660251e-03 1.8004109594554469e-02 1.5968871870902096e-02 -1.7713985788971320e-02 8.3422779461693355e-04 -3.3327793704639341e-02 -3.8207546654268811e-04 -8.8433580026698443e-03 -6.6654805850703148e-03 1.8201602806741050e-02 6.7785027453560655e-03 1.4307230833306723e-02 3.8379593255246591e-02 1.7043914232664256e-02 9.7687982289065521e-03 -1.3064252639759745e-03 5.4904907406587797e-03 -7.1498547277107655e-03 -1.7750925047537634e-02 -1.5599747531945957e-02 -9.6734938272468214e-03 -9.6295450425373120e-03 -3.7467192700162458e-03 1.3373793939593932e-02 -5.6379504760078808e-03 3.3341462642319675e-03 2.7201743784456777e-03 -2.1874274765386149e-02 -4.4572291782790201e-03 -1.6681168240224982e-02 4.2571793506585940e-03 -3.1346677675033428e-02 -1.5595633479013753e-02 8.8246913319917197e-03 4.4708131238451604e-03 1.3911178554761806e-02 1.7043914232664256e-02 4.8942664140425703e-02 1.3443195761921925e-02 5.6980128187511525e-03 -9.8832363110695418e-03 -1.4996184492723785e-02 -1.5341286655780384e-02 -2.7472276149806289e-02 -1.2941324778009444e-02 -9.2734043129639454e-03 -1.6433591845218651e-03 1.9919087511668966e-02 7.6817984249497821e-04 2.6324971464615120e-02 1.3983372637075242e-02 -1.1977286607816363e-02 -9.3928994084548668e-03 -1.7723691715680962e-02 2.0208327248338103e-03 -1.3601482723131622e-02 -1.6921208483146960e-02 1.3023913502688184e-02 1.1410129790280114e-02 2.0226805612135121e-02 9.7687982289065521e-03 1.3443195761921926e-02 3.3782958587329319e-02 -6.6153829097118106e-03 -1.4130422891187940e-02 -2.7424448989438615e-02 -8.4794683552776376e-03 -1.1520873205378569e-02 -1.3365391471906553e-02 6.3268504135491192e-04 6.6972082933205923e-03 1.3942873531949371e-02 1.8386765632095821e-03 1.3639401259242161e-02 1.3486834214136371e-02 -1.2190054796003588e-02 -5.9371562850666602e-03 -2.3728423001058041e-02 1.1637670454720844e-02 -5.3416891174550242e-03 -1.1315078617167679e-02 -5.0081083604385651e-04 -1.3275034185268136e-04 4.1779125793865463e-03 -1.3064252639759747e-03 5.6980128187511516e-03 -6.6153829097118097e-03 3.5315754146764078e-02 3.2826623370747743e-04 -1.5163082792556432e-02 -1.0739495813571209e-02 -8.9330471614396598e-03 2.6565968843142755e-04 -1.2384006157815789e-02 -2.6281518179507347e-04 1.3956386118928207e-02 -1.5946218641252563e-02 8.7200328490546278e-03 1.0493859346936911e-02 -6.0764678888255257e-03 -7.6010098970818085e-05 4.1997265857528299e-03 -5.5589223424386486e-03 4.0463654961138311e-03 1.3804968581617840e-02 1.5118642717414465e-04 -8.1038062896009386e-03 9.8527325965618311e-04 5.4904907406587789e-03 -9.8832363110695400e-03 -1.4130422891187936e-02 3.2826623370747765e-04 2.8994940002719283e-02 -2.4250429156030898e-04 -3.9040209785907698e-03 -3.2106771162894350e-03 6.4160926766958356e-03 -1.7410735210529049e-04 -6.3219945901773385e-03 6.5280243089833987e-04 3.5130378610169766e-03 -9.4994599991249529e-03 -6.9062166620811952e-03 1.5406941057733434e-04 3.9778688074290948e-03 -5.7999310403876057e-04 -1.0822069926643080e-02 1.3970353459084952e-02 2.4542072959701431e-02 -1.1658304293108494e-02 1.6413061943359878e-03 -4.0536584383497984e-02 -7.1498547277107638e-03 -1.4996184492723785e-02 -2.7424448989438615e-02 -1.5163082792556433e-02 -2.4250429156030660e-04 6.5597629371583588e-02 1.2771667398252907e-02 1.9190530918348762e-02 1.2737982543109320e-02 1.4565480949384941e-02 8.8702837787153722e-04 -3.9658450669756373e-02 1.4329018432686486e-02 -2.0070891479746750e-02 -2.8914020938474602e-02 3.1271449596944317e-03 -3.7963868561039486e-04 3.3655820106773225e-02 -5.5081374615292417e-03 2.2542390707088029e-03 2.7728730549129695e-03 -2.1585606013577362e-02 -4.1659160039514828e-03 -1.6552213546621376e-02 -1.7750925047537634e-02 -1.5341286655780384e-02 -8.4794683552776376e-03 -1.0739495813571209e-02 -3.9040209785907703e-03 1.2771667398252907e-02 4.0468339278675033e-02 1.6823473323718630e-02 1.0213478879786506e-02 -1.8419346891327573e-03 5.2237746379068806e-03 -7.7487811223135410e-03 -4.0324428377322983e-04 -8.6521333665452935e-03 -6.0696370339962755e-03 1.7361004030446395e-02 7.7618699725336216e-03 1.3092080725256451e-02 1.9736423472057583e-03 2.5832148086946928e-02 1.4185852388807950e-02 -1.2464218144951134e-02 -8.7740727804043218e-03 -1.7920356651443984e-02 -1.5599747531945957e-02 -2.7472276149806289e-02 -1.1520873205378569e-02 -8.9330471614396615e-03 -3.2106771162894359e-03 1.9190530918348759e-02 1.6823473323718627e-02 5.1409619620914095e-02 1.4411313069090414e-02 6.1761463916519665e-03 -1.0519104544841408e-02 -1.5838238775093924e-02 4.6245841182785859e-03 -3.1529853901580522e-02 -1.4923614283415324e-02 7.3991666574818073e-03 4.2642167850609524e-03 1.2415386539084678e-02 1.7338493186218411e-03 1.4269826163427377e-02 1.3902337943423269e-02 -1.3105060583359963e-02 -6.0652215130884224e-03 -2.4459700735471972e-02 -9.6734938272468214e-03 -1.2941324778009446e-02 -1.3365391471906553e-02 2.6565968843142755e-04 6.4160926766958365e-03 1.2737982543109318e-02 1.0213478879786506e-02 1.4411313069090412e-02 3.7541519446038778e-02 -5.5581068867754119e-03 -1.3865567430673104e-02 -2.9356305168090940e-02 2.5260683783304497e-03 -1.4586622120431939e-02 -1.7360456394464811e-02 1.3597605032211971e-02 1.2361503932989289e-02 2.0360013837362911e-02 -1.5408256093112381e-02 9.2573316517264529e-03 1.1205918304588738e-02 -4.9389435165377946e-03 2.7613251723654456e-04 1.7266237446489625e-03 -9.6295450425373120e-03 -9.2734043129639454e-03 6.3268504135491279e-04 -1.2384006157815789e-02 -1.7410735210529038e-04 1.4565480949384939e-02 -1.8419346891327569e-03 6.1761463916519665e-03 -5.5581068867754119e-03 3.1932294389165387e-02 3.0088877159431928e-04 -1.5720819314247316e-02 1.2919906760377384e-02 -6.3865253240924999e-03 -1.1061421400783552e-02 -6.4951565040674173e-04 -1.7646234304754304e-04 4.2096395618287305e-03 3.2066118508988347e-03 -9.0968195778213003e-03 -7.1781316664451932e-03 -1.0300116570150254e-05 5.2563337231870903e-03 -5.4076705850488057e-04 -3.7467192700162471e-03 -1.6433591845218653e-03 6.6972082933205931e-03 -2.6281518179507347e-04 -6.3219945901773385e-03 8.8702837787153690e-04 5.2237746379068814e-03 -1.0519104544841411e-02 -1.3865567430673104e-02 3.0088877159431928e-04 2.5355374833614872e-02 -2.2820050535354776e-04 -4.9667563898633665e-03 5.1852725760920130e-03 1.3002751785455282e-02 2.5531569784480266e-04 -8.2157032355320552e-03 1.2256782043293171e-03 1.3763603442371647e-02 -2.0431029310033291e-02 -2.9482323390349102e-02 6.0830896008967905e-03 -7.7980617134469784e-04 3.6692567994893968e-02 1.3373793939593932e-02 1.9919087511668966e-02 1.3942873531949371e-02 1.3956386118928207e-02 6.5280243089833976e-04 -3.9658450669756373e-02 -7.7487811223135375e-03 -1.5838238775093921e-02 -2.9356305168090936e-02 -1.5720819314247320e-02 -2.2820050535354939e-04 6.3123839746981200e-02 -1.2176044519992071e-02 1.5689600635504612e-02 2.5518986022975535e-02 -1.1531228145237639e-02 1.0157841837535409e-03 -4.0781188068603653e-02 -1.2607731675392220e-02 1.2182436926349609e-02 8.8634350901448753e-03 -9.9934404589813244e-03 5.1078964345036993e-03 -7.5302605794660242e-03 -5.6379504760078816e-03 7.6817984249497647e-04 1.8386765632095814e-03 -1.5946218641252563e-02 3.5130378610169766e-03 1.4329018432686488e-02 -4.0324428377322928e-04 4.6245841182785850e-03 2.5260683783304488e-03 1.2919906760377383e-02 -4.9667563898633657e-03 -1.2176044519992071e-02 3.3004008078732980e-02 -1.3097623927859766e-02 -9.0106833385805111e-03 -1.3353293037031517e-03 -8.1317548649207164e-03 1.1597899736672172e-03 1.1579176550032195e-02 -2.7939427363973934e-02 -1.5662428355543455e-02 1.2985348737010027e-02 -1.8883851748720188e-03 1.8004109594554465e-02 3.3341462642319675e-03 2.6324971464615123e-02 1.3639401259242161e-02 8.7200328490546295e-03 -9.4994599991249512e-03 -2.0070891479746750e-02 -8.6521333665452935e-03 -3.1529853901580522e-02 -1.4586622120431941e-02 -6.3865253240924999e-03 5.1852725760920121e-03 1.5689600635504612e-02 -1.3097623927859769e-02 4.9629309609660235e-02 1.6731842732795550e-02 -8.4824217818312529e-03 -1.0282427210815941e-02 -1.3745012266374651e-02 7.8109906600987754e-03 -1.4503183270528890e-02 -1.6536242867679470e-02 4.4825640784412393e-03 5.7133849959126095e-03 1.5968871870902093e-02 2.7201743784456777e-03 1.3983372637075241e-02 1.3486834214136371e-02 1.0493859346936911e-02 -6.9062166620811952e-03 -2.8914020938474606e-02 -6.0696370339962755e-03 -1.4923614283415324e-02 -1.7360456394464811e-02 -1.1061421400783552e-02 1.3002751785455282e-02 2.5518986022975532e-02 -9.0106833385805111e-03 1.6731842732795550e-02 3.7544939714868067e-02 6.3415330943774250e-04 -1.3098337935213271e-02 -2.9708911622263197e-02 -1.0874839728240210e-02 1.2371133953382237e-02 4.6459966556325425e-03 -1.8224161680516847e-02 7.8693502838766472e-04 -1.7713985788971320e-02 -2.1874274765386149e-02 -1.1977286607816363e-02 -1.2190054796003585e-02 -6.0764678888255274e-03 1.5406941057733440e-04 3.1271449596944343e-03 1.7361004030446395e-02 7.3991666574818081e-03 1.3597605032211971e-02 -6.4951565040674065e-04 2.5531569784480233e-04 -1.1531228145237639e-02 -1.3353293037031517e-03 -8.4824217818312547e-03 6.3415330943774164e-04 4.1673584986632220e-02 -5.0691235802622703e-04 1.9430368773235857e-02 5.1287533831284740e-03 -3.1497565409438957e-03 5.5883014141615527e-03 4.5774548758223047e-04 -6.2684476282145862e-03 8.3422779461693355e-04 -4.4572291782790201e-03 -9.3928994084548668e-03 -5.9371562850666602e-03 -7.6010098970818180e-05 3.9778688074290948e-03 -3.7963868561039491e-04 7.7618699725336216e-03 4.2642167850609550e-03 1.2361503932989288e-02 -1.7646234304754304e-04 -8.2157032355320552e-03 1.0157841837535417e-03 -8.1317548649207164e-03 -1.0282427210815941e-02 -1.3098337935213268e-02 -5.0691235802622714e-04 2.9067148431471297e-02 -3.8468441963098907e-04 -7.0570127754367024e-03 1.7427287928775417e-02 1.4438954948978996e-02 -1.8353424604079408e-02 1.3650288335359424e-03 -3.3327793704639341e-02 -1.6681168240224985e-02 -1.7723691715680962e-02 -2.3728423001058041e-02 4.1997265857528290e-03 -5.7999310403876036e-04 3.3655820106773232e-02 1.3092080725256451e-02 1.2415386539084680e-02 2.0360013837362908e-02 4.2096395618287305e-03 1.2256782043293171e-03 -4.0781188068603653e-02 1.1597899736672185e-03 -1.3745012266374654e-02 -2.9708911622263197e-02 1.9430368773235861e-02 -3.8468441963098864e-04 5.9091527503449086e-02 897 898 899 942 943 944 672 673 674 510 511 512 900 901 902 945 946 947 675 676 677 513 514 515 3.0731431740788382e-02 -1.2947868569304953e-02 -5.6531287810365439e-03 1.4141075963939693e-03 -6.5951205548966862e-03 2.9687835524406900e-03 1.7894689283814780e-03 4.4284595184695269e-03 8.8008863729411636e-04 1.1323605558911759e-02 -6.8882188281104229e-03 -8.6279968045930942e-03 -7.5080296871438334e-03 1.6621340046802462e-03 1.0930465333375745e-03 -1.4449907205850125e-02 5.0816756046143637e-03 1.2081616820144605e-02 -1.1973910781038478e-02 1.1856178173191775e-02 4.7453586873904482e-03 -1.1326766150443148e-02 3.4027606513561404e-03 -7.4877686449777922e-03 -1.2947868569304953e-02 4.7182401618659872e-02 1.0765800277789150e-02 -7.7963540850194309e-03 -1.1591318662454402e-02 -1.3589905736870323e-02 -8.6038974395098375e-03 -2.8692033120503845e-02 -7.2340371287773807e-03 -6.7736574570263263e-03 7.4107749209542965e-03 1.3037396975084829e-02 1.8683830289111573e-03 2.3697286448336359e-02 8.3360199139378578e-03 1.0269909023844712e-02 -1.1736103782094704e-02 -1.8647618026153490e-02 1.2604745321233729e-02 -2.6476433181342351e-02 -8.4365859664211652e-03 1.1378740176870929e-02 2.0542575844479218e-04 1.5768929691410524e-02 -5.6531287810365439e-03 1.0765800277789150e-02 2.8514596578325693e-02 1.6387250397686933e-03 -1.2330509969279736e-02 -1.8727861165521976e-02 -4.1557719584334992e-03 -8.9570414461419227e-03 -8.7909315198866095e-03 -9.4884027359782384e-03 1.3404428460988698e-02 1.4706979307577497e-02 1.9792000170094390e-03 8.3153108007210982e-03 5.7147463650553945e-03 8.3670201788232021e-03 -7.8587901615577577e-03 -1.9062540191658574e-02 5.7050292127962532e-03 -9.5622860741829303e-03 -8.8141704915848836e-03 1.6073290270506814e-03 6.2230881116634076e-03 6.4591811176934509e-03 1.4141075963939693e-03 -7.7963540850194309e-03 1.6387250397686928e-03 3.4102026377601388e-02 2.5059363694014550e-03 1.7352484979636255e-02 1.6753961462219774e-02 9.4990645562744724e-03 9.4475655727600579e-03 1.5534413639797006e-03 -1.4203960850938076e-03 -9.7542280305512631e-03 -1.9531864963478918e-02 -1.3039543256302976e-02 -8.8981756177812579e-03 -6.9382561935502716e-03 7.3546364635096863e-04 4.9852657497722209e-03 -1.0709413614533623e-02 1.1877337633913380e-02 1.0903105196939245e-03 -1.6644002028631991e-02 -2.3615087795240746e-03 -1.5861948213298629e-02 -6.5951205548966862e-03 -1.1591318662454404e-02 -1.2330509969279731e-02 2.5059363694014541e-03 2.2129187435986322e-02 3.7057164851573661e-03 8.2112097122121596e-03 7.7288367646788517e-03 1.0915580108314997e-02 6.8930064038331441e-04 -6.8012664146366048e-03 -3.1437305209292840e-03 -6.1611446126798395e-03 -1.1288698144611680e-02 -6.5217099776218451e-03 3.1163041871262211e-04 3.9018719592873534e-03 3.7205708412314711e-03 3.1036332613503794e-03 1.5719028879367975e-03 6.4010779842721141e-03 -2.0654452344834005e-03 -5.6505158261866365e-03 -2.7469949511450854e-03 2.9687835524406904e-03 -1.3589905736870323e-02 -1.8727861165521983e-02 1.7352484979636252e-02 3.7057164851573669e-03 4.5628493484791449e-02 1.1064544273980369e-02 1.2594785400021308e-02 1.1313238286464506e-02 4.3315103312052978e-03 -3.6272763915868355e-03 -3.2093578579682744e-02 -1.3415157853032001e-02 -1.6169141128449943e-02 -1.5353345498207003e-02 1.1055873894581991e-03 3.8148358781423743e-03 2.8298803140843046e-02 -8.0480417962267726e-03 1.6325876502113833e-02 7.5094332126408852e-03 -1.5359710877462010e-02 -3.0548910085277949e-03 -2.6575182881328176e-02 1.7894689283814774e-03 -8.6038974395098375e-03 -4.1557719584334992e-03 1.6753961462219778e-02 8.2112097122121596e-03 1.1064544273980369e-02 3.4490015312746689e-02 1.6526793266409785e-02 4.9828289802448054e-03 2.4848969727710524e-03 4.3093760341714055e-03 -7.1566176647576705e-03 -1.6409141152151439e-02 -1.5511503698071078e-02 -5.3772081866688120e-03 -1.0725273504476886e-02 -1.5196855377891361e-03 1.2586836178346201e-02 -8.5115131312353837e-03 3.0938464169693305e-03 1.6936791051444587e-03 -1.9872414888255273e-02 -6.5061387543926368e-03 -1.3638290727855856e-02 4.4284595184695260e-03 -2.8692033120503845e-02 -8.9570414461419227e-03 9.4990645562744724e-03 7.7288367646788534e-03 1.2594785400021310e-02 1.6526793266409785e-02 4.4246737122873130e-02 6.8796263988613457e-03 4.4826640174465363e-03 -1.0656948338072375e-02 -1.3413222193549360e-02 -1.4596749894214023e-02 -2.5922832076058323e-02 -6.9889023509744561e-03 -8.5694176241368856e-03 1.5359647861709104e-03 1.7789316481598455e-02 4.6570290999702768e-04 2.3145625129348781e-02 7.7648455206257181e-03 -1.2236516750246418e-02 -1.1385350268437155e-02 -1.5669407810441086e-02 8.8008863729411647e-04 -7.2340371287773816e-03 -8.7909315198866078e-03 9.4475655727600579e-03 1.0915580108314997e-02 1.1313238286464506e-02 4.9828289802448054e-03 6.8796263988613439e-03 2.4249714685051570e-02 -6.8952370355539186e-03 -1.3241052002880097e-02 -1.4801718197582095e-02 -4.1710546137233668e-03 -5.7373578939834309e-03 -7.3071747158317806e-03 2.4054026529799154e-03 6.8240747605261397e-03 4.9915949521294103e-03 1.4255692681040466e-03 7.5449090280597696e-03 4.8933532138698459e-03 -8.0751634621056521e-03 -5.9517432701213470e-03 -1.4548076704214850e-02 1.1323605558911759e-02 -6.7736574570263271e-03 -9.4884027359782366e-03 1.5534413639796988e-03 6.8930064038331463e-04 4.3315103312052969e-03 2.4848969727710524e-03 4.4826640174465372e-03 -6.8952370355539194e-03 3.2401231203117033e-02 -2.0368510852001526e-03 -1.4321803881803328e-02 -1.1699417906038664e-02 -8.5582372848574621e-03 1.7953837145483719e-03 -1.2127769873125846e-02 1.9341770458165023e-03 1.3339798346138491e-02 -1.5083301606005652e-02 9.8435977310470813e-03 8.0058049730481907e-03 -8.8526857136093651e-03 4.1900639239050191e-04 3.2329462883951329e-03 -6.8882188281104238e-03 7.4107749209542965e-03 1.3404428460988698e-02 -1.4203960850938076e-03 -6.8012664146366057e-03 -3.6272763915868363e-03 4.3093760341714055e-03 -1.0656948338072377e-02 -1.3241052002880097e-02 -2.0368510852001522e-03 2.5773604908386722e-02 4.4605985481988835e-03 -1.8943996044122316e-03 -7.6298017190506214e-06 6.6787056549323549e-03 2.0341975528578478e-03 -5.9855155541554024e-03 -3.8505161419144498e-03 5.4604476245061345e-03 -1.1780837280342203e-02 -7.2871560892204656e-03 4.3584439128122282e-04 2.0478175595846203e-03 3.4622679614819069e-03 -8.6279968045930942e-03 1.3037396975084829e-02 1.4706979307577493e-02 -9.7542280305512614e-03 -3.1437305209292840e-03 -3.2093578579682744e-02 -7.1566176647576687e-03 -1.3413222193549358e-02 -1.4801718197582095e-02 -1.4321803881803326e-02 4.4605985481988844e-03 5.3745080692715844e-02 1.1797288731718078e-02 1.7287348915597866e-02 4.1510420884724964e-03 1.3374152755148338e-02 -3.6602864041746651e-03 -3.2037914763275756e-02 1.2403029569311552e-02 -1.8123396776102845e-02 -1.8318571641992708e-02 2.2861753255273517e-03 3.5552914558745884e-03 2.4648681093767458e-02 -7.5080296871438317e-03 1.8683830289111564e-03 1.9792000170094390e-03 -1.9531864963478918e-02 -6.1611446126798404e-03 -1.3415157853032000e-02 -1.6409141152151436e-02 -1.4596749894214023e-02 -4.1710546137233668e-03 -1.1699417906038666e-02 -1.8943996044122305e-03 1.1797288731718081e-02 3.5475385812683079e-02 1.6411074745941907e-02 5.4751186526254599e-03 1.6012160773332886e-03 3.8527355971121704e-03 -7.7990500349287223e-03 2.2220056060796643e-03 -8.1615895410619647e-03 -3.5591395147222169e-03 1.5849846212716810e-02 8.6816902804028317e-03 9.6927946150533271e-03 1.6621340046802488e-03 2.3697286448336359e-02 8.3153108007210982e-03 -1.3039543256302974e-02 -1.1288698144611678e-02 -1.6169141128449943e-02 -1.5511503698071076e-02 -2.5922832076058323e-02 -5.7373578939834326e-03 -8.5582372848574621e-03 -7.6298017190507298e-06 1.7287348915597866e-02 1.6411074745941907e-02 4.6769725208104934e-02 8.0415511825070382e-03 5.1445632150195850e-03 -1.1661710844940686e-02 -1.5101900814635912e-02 5.1313088910476621e-03 -2.8808491922868690e-02 -8.5139213864421567e-03 8.7602033825420946e-03 7.2223511337571600e-03 1.1878110324685442e-02 1.0930465333375745e-03 8.3360199139378560e-03 5.7147463650553936e-03 -8.8981756177812597e-03 -6.5217099776218451e-03 -1.5353345498207003e-02 -5.3772081866688120e-03 -6.9889023509744561e-03 -7.3071747158317815e-03 1.7953837145483703e-03 6.6787056549323549e-03 4.1510420884724982e-03 5.4751186526254599e-03 8.0415511825070365e-03 2.6758301462276767e-02 -5.8589167488819127e-03 -1.2944463470187711e-02 -1.6746296582962551e-02 1.4767878049673834e-03 -8.0442223655733721e-03 -8.7599192357911172e-03 1.0293963847853190e-02 1.1443021412980137e-02 1.1542646116987798e-02 -1.4449907205850125e-02 1.0269909023844712e-02 8.3670201788232021e-03 -6.9382561935502698e-03 3.1163041871262189e-04 1.1055873894582004e-03 -1.0725273504476884e-02 -8.5694176241368856e-03 2.4054026529799150e-03 -1.2127769873125846e-02 2.0341975528578482e-03 1.3374152755148340e-02 1.6012160773332881e-03 5.1445632150195842e-03 -5.8589167488819135e-03 2.8586768862840169e-02 -2.1484093425522431e-03 -1.4731805101819451e-02 1.2285875679169053e-02 -7.6329715082376192e-03 -8.8264718939764456e-03 1.7673461576606100e-03 5.9049826449199011e-04 4.1650307682681515e-03 5.0816756046143637e-03 -1.1736103782094701e-02 -7.8587901615577577e-03 7.3546364635096884e-04 3.9018719592873534e-03 3.8148358781423734e-03 -1.5196855377891357e-03 1.5359647861709108e-03 6.8240747605261397e-03 1.9341770458165023e-03 -5.9855155541554024e-03 -3.6602864041746664e-03 3.8527355971121695e-03 -1.1661710844940682e-02 -1.2944463470187711e-02 -2.1484093425522431e-03 2.2129262175989758e-02 4.7810068621493328e-03 -6.5136119187748087e-03 8.3839928969578568e-03 1.2353217315153119e-02 -1.4223450947778143e-03 -6.5677616372150907e-03 -3.3095947800508311e-03 1.2081616820144600e-02 -1.8647618026153490e-02 -1.9062540191658574e-02 4.9852657497722191e-03 3.7205708412314711e-03 2.8298803140843046e-02 1.2586836178346203e-02 1.7789316481598455e-02 4.9915949521294111e-03 1.3339798346138489e-02 -3.8505161419144498e-03 -3.2037914763275756e-02 -7.7990500349287223e-03 -1.5101900814635907e-02 -1.6746296582962551e-02 -1.4731805101819453e-02 4.7810068621493328e-03 5.1518841894729467e-02 -1.0470136061373800e-02 1.5015546116419963e-02 1.5069192690115009e-02 -9.9925258962795180e-03 -3.7064053186953915e-03 -3.2031681139920061e-02 -1.1973910781038478e-02 1.2604745321233729e-02 5.7050292127962532e-03 -1.0709413614533623e-02 3.1036332613503799e-03 -8.0480417962267726e-03 -8.5115131312353803e-03 4.6570290999702849e-04 1.4255692681040466e-03 -1.5083301606005652e-02 5.4604476245061345e-03 1.2403029569311554e-02 2.2220056060796643e-03 5.1313088910476621e-03 1.4767878049673836e-03 1.2285875679169053e-02 -6.5136119187748087e-03 -1.0470136061373800e-02 2.9026797941218759e-02 -1.3564954130865536e-02 -5.6278189659834778e-03 2.7434599063456550e-03 -6.6872719584945822e-03 3.1355809684048110e-03 1.1856178173191775e-02 -2.6476433181342351e-02 -9.5622860741829321e-03 1.1877337633913380e-02 1.5719028879367975e-03 1.6325876502113833e-02 3.0938464169693296e-03 2.3145625129348778e-02 7.5449090280597713e-03 9.8435977310470796e-03 -1.1780837280342201e-02 -1.8123396776102845e-02 -8.1615895410619629e-03 -2.8808491922868693e-02 -8.0442223655733721e-03 -7.6329715082376183e-03 8.3839928969578550e-03 1.5015546116419965e-02 -1.3564954130865534e-02 4.4486777342037376e-02 9.8914391522163213e-03 -7.3114447749564266e-03 -1.0522535871727568e-02 -1.3047865582950745e-02 4.7453586873904482e-03 -8.4365859664211652e-03 -8.8141704915848818e-03 1.0903105196939235e-03 6.4010779842721150e-03 7.5094332126408852e-03 1.6936791051444593e-03 7.7648455206257164e-03 4.8933532138698468e-03 8.0058049730481907e-03 -7.2871560892204656e-03 -1.8318571641992708e-02 -3.5591395147222173e-03 -8.5139213864421585e-03 -8.7599192357911190e-03 -8.8264718939764456e-03 1.2353217315153120e-02 1.5069192690115009e-02 -5.6278189659834769e-03 9.8914391522163213e-03 2.5206588483392457e-02 2.4782770894051257e-03 -1.2172916530183490e-02 -1.6785906230649489e-02 -1.1326766150443146e-02 1.1378740176870929e-02 1.6073290270506805e-03 -1.6644002028631991e-02 -2.0654452344834001e-03 -1.5359710877462010e-02 -1.9872414888255273e-02 -1.2236516750246418e-02 -8.0751634621056521e-03 -8.8526857136093633e-03 4.3584439128122282e-04 2.2861753255273539e-03 1.5849846212716810e-02 8.7602033825420929e-03 1.0293963847853190e-02 1.7673461576606102e-03 -1.4223450947778134e-03 -9.9925258962795180e-03 2.7434599063456558e-03 -7.3114447749564266e-03 2.4782770894051257e-03 3.6335216504216693e-02 2.4609639037698251e-03 1.6761654946010830e-02 3.4027606513561408e-03 2.0542575844479196e-04 6.2230881116634076e-03 -2.3615087795240746e-03 -5.6505158261866365e-03 -3.0548910085277945e-03 -6.5061387543926359e-03 -1.1385350268437155e-02 -5.9517432701213470e-03 4.1900639239050191e-04 2.0478175595846221e-03 3.5552914558745880e-03 8.6816902804028317e-03 7.2223511337571582e-03 1.1443021412980141e-02 5.9049826449199011e-04 -6.5677616372150889e-03 -3.7064053186953920e-03 -6.6872719584945822e-03 -1.0522535871727568e-02 -1.2172916530183490e-02 2.4609639037698251e-03 2.4650569151779881e-02 3.6645551470098929e-03 -7.4877686449777922e-03 1.5768929691410524e-02 6.4591811176934501e-03 -1.5861948213298629e-02 -2.7469949511450846e-03 -2.6575182881328176e-02 -1.3638290727855856e-02 -1.5669407810441086e-02 -1.4548076704214850e-02 3.2329462883951329e-03 3.4622679614819073e-03 2.4648681093767465e-02 9.6927946150533271e-03 1.1878110324685442e-02 1.1542646116987796e-02 4.1650307682681506e-03 -3.3095947800508303e-03 -3.2031681139920061e-02 3.1355809684048110e-03 -1.3047865582950744e-02 -1.6785906230649489e-02 1.6761654946010830e-02 3.6645551470098929e-03 4.7290338627663867e-02 948 949 950 996 997 998 1008 1009 1010 960 961 962 951 952 953 999 1000 1001 1011 1012 1013 963 964 965 6.3687932890806573e+00 4.8516482276359507e-01 2.8614349457558501e+00 -6.5990825108066851e+00 -3.5319727282317481e-01 -3.1627428907778476e+00 -3.9767496450555311e+00 -4.8363416119627251e-01 -2.5994319535369508e+00 3.6611792481706691e+00 2.6499747355103193e-01 2.5576490660466371e+00 3.9791974069422178e+00 4.9904843034632890e-01 2.8553687637517422e+00 -3.6828086522272696e+00 -1.8246103855796794e-01 -2.6079326480682639e+00 -2.3802688986790317e+00 -4.2710946375502784e-01 -2.4206315466191830e+00 2.6297397625749763e+00 1.9719120967148648e-01 2.5162862634480176e+00 4.8516482276359518e-01 5.2243301360087644e+00 1.0520767432926186e+00 -3.2911302211399041e-01 -4.9754056584123996e+00 -5.6432575686317898e-01 -5.3123088315907452e-01 -2.6861901471722209e+00 -9.3473440308134303e-01 2.4075996332431909e-01 2.5083774632240221e+00 5.2935505457850796e-01 4.9762806308717644e-01 2.6521047829890345e+00 9.3326960565624395e-01 -3.4094696289855070e-01 -2.5368953696728207e+00 -7.5390276506201537e-01 -4.2675823639921828e-01 -1.4375692037933456e+00 -9.3163909801077183e-01 4.0449625539574324e-01 1.2512479968289634e+00 6.6990061948993951e-01 2.8614349457558497e+00 1.0520767432926184e+00 1.1228650613271249e+01 -3.1299720417999994e+00 -6.0333843274379351e-01 -1.0830351771528191e+01 -2.9455409404145469e+00 -9.6072516466294955e-01 -7.6729155847574733e+00 2.5539114014490489e+00 5.8002857789858198e-01 8.0656174697699061e+00 2.8333956004498262e+00 9.2770144441151681e-01 7.7775207477159771e+00 -2.5975515866775685e+00 -4.0410918727018619e-01 -8.2501035055112517e+00 -2.4250651678881150e+00 -9.3408171559582232e-01 -6.5791910381727439e+00 2.8493877891255059e+00 3.4244773467003348e-01 6.2607730692125312e+00 -6.5990825108066860e+00 -3.2911302211399029e-01 -3.1299720417999986e+00 7.0398686413915659e+00 9.4437389273119079e-02 3.3947532508758802e+00 4.3364365852479017e+00 2.9972935915287757e-01 3.0067105873528757e+00 -3.9874779059885355e+00 -6.0977059131331286e-02 -3.0075378637200982e+00 -4.4154402820404872e+00 -4.2349590249820562e-01 -3.0917567771816445e+00 4.0134555596103967e+00 8.7868885433396979e-02 2.8935908088959841e+00 2.6697369418276118e+00 4.0668353333574381e-01 2.8670647003796201e+00 -3.0574970292417674e+00 -7.5133183451609409e-02 -2.9328526648026187e+00 -3.5319727282317470e-01 -4.9754056584123996e+00 -6.0333843274379362e-01 9.4437389273119107e-02 4.9845638867322419e+00 1.5812184981942809e-01 3.2195566180625168e-01 2.5190085154892161e+00 5.3076904036945294e-01 -5.0747502700232344e-02 -2.5142989685520551e+00 -1.0511820003975279e-01 -2.1604776201213677e-01 -2.5270874650085249e+00 -3.4788623227670729e-01 7.9022433931124056e-02 2.5077827478202508e+00 1.4578053127359830e-01 1.8895327278001772e-01 1.2785619147735510e+00 3.2579132094412866e-01 -6.4376220254968558e-02 -1.2731249728422793e+00 -1.0411987734635424e-01 -3.1627428907778476e+00 -5.6432575686317887e-01 -1.0830351771528191e+01 3.3947532508758798e+00 1.5812184981942803e-01 1.0572166987367959e+01 2.9967545503071502e+00 4.9077557592609966e-01 7.4157261381219550e+00 -2.6439659271825708e+00 -1.0485632485409782e-01 -7.8311618672832868e+00 -3.1021446824432068e+00 -6.8885169784204059e-01 -7.5065445242713986e+00 2.9072731338477089e+00 1.6303550155025803e-01 7.9344176166858364e+00 2.5194696753151362e+00 6.6687550525759343e-01 6.2926455785050432e+00 -2.9093971099422498e+00 -1.2077465299406052e-01 -6.0468981575979184e+00 -3.9767496450555311e+00 -5.3123088315907452e-01 -2.9455409404145469e+00 4.3364365852479017e+00 3.2195566180625174e-01 2.9967545503071502e+00 7.1163514893218718e+00 5.9747061660405187e-01 3.3280808850464489e+00 -6.6905132230333706e+00 -3.0408744037472052e-01 -3.1134549549869024e+00 -3.0476555726606591e+00 -5.2995648711051324e-01 -2.8727901928680533e+00 2.6690971741436287e+00 1.7684819152056602e-01 2.8757696206646237e+00 4.0449931118879512e+00 4.9442784926925376e-01 2.8212173668941731e+00 -4.4519599198517943e+00 -2.2542750855581412e-01 -3.0900363346428947e+00 -4.8363416119627251e-01 -2.6861901471722209e+00 -9.6072516466294955e-01 2.9972935915287757e-01 2.5190085154892161e+00 4.9077557592609955e-01 5.9747061660405187e-01 5.2559701430354018e+00 9.7367140651332740e-01 -2.8227934997710136e-01 -5.0774241889455753e+00 -5.8453964136444814e-01 -5.3476612636187593e-01 -1.4316262969422857e+00 -8.6681900992234417e-01 3.2583033803708727e-01 1.2824853798804594e+00 7.0855714782966872e-01 5.0087950922409097e-01 2.7204014675979047e+00 9.3031018439242319e-01 -4.2323018548285807e-01 -2.5826248729429002e+00 -6.9123049871177755e-01 -2.5994319535369503e+00 -9.3473440308134292e-01 -7.6729155847574742e+00 3.0067105873528757e+00 5.3076904036945294e-01 7.4157261381219559e+00 3.3280808850464485e+00 9.7367140651332751e-01 1.0522267222397726e+01 -3.1693959200646940e+00 -6.3619407965701069e-01 -1.0926898956022910e+01 -2.8646221671913206e+00 -8.5658667542024658e-01 -5.9058214302340302e+00 2.5159174381152773e+00 3.6060357813916344e-01 6.2852210856535633e+00 2.8535517615166888e+00 9.2813828870658110e-01 7.8285694506894554e+00 -3.0708106312383254e+00 -3.6566715556992291e-01 -7.5461479258482900e+00 3.6611792481706682e+00 2.4075996332431909e-01 2.5539114014490489e+00 -3.9874779059885355e+00 -5.0747502700232323e-02 -2.6439659271825713e+00 -6.6905132230333706e+00 -2.8227934997710136e-01 -3.1693959200646953e+00 6.4741256118298907e+00 8.4967218810879319e-02 2.9012962286343003e+00 2.6301500299403697e+00 3.2036318243049638e-01 2.5025155769460374e+00 -2.3886859088997356e+00 -6.2976713653852656e-02 -2.4583092321073412e+00 -3.7273288302877789e+00 -3.3733471497701889e-01 -2.5838729569377819e+00 4.0285509782684938e+00 8.7247916742509660e-02 2.8978208292630043e+00 2.6499747355103193e-01 2.5083774632240221e+00 5.8002857789858198e-01 -6.0977059131331279e-02 -2.5142989685520551e+00 -1.0485632485409779e-01 -3.0408744037472041e-01 -5.0774241889455762e+00 -6.3619407965701080e-01 8.4967218810879291e-02 5.1540243952749387e+00 1.8214316560788174e-01 1.6678922076008579e-01 1.2488294463285443e+00 3.4296283158346341e-01 -5.5138953995519269e-02 -1.2767601082697753e+00 -1.2376246835075594e-01 -1.7341738278882965e-01 -2.5877688481919345e+00 -3.8755606592093206e-01 7.6866923168403559e-02 2.5450208091318358e+00 1.4723436369286974e-01 2.5576490660466371e+00 5.2935505457850796e-01 8.0656174697699061e+00 -3.0075378637200978e+00 -1.0511820003975281e-01 -7.8311618672832886e+00 -3.1134549549869024e+00 -5.8453964136444814e-01 -1.0926898956022910e+01 2.9012962286342994e+00 1.8214316560788174e-01 1.1495956260118708e+01 2.8750965219324933e+00 7.0370826081758298e-01 6.2548336066299823e+00 -2.4745768707700124e+00 -1.4196280921192136e-01 -6.7302338697112329e+00 -2.5952233536542968e+00 -7.4844967031464105e-01 -8.2914305769304733e+00 2.8567512265178805e+00 1.6486383992678896e-01 7.9633179334293089e+00 3.9791974069422178e+00 4.9762806308717655e-01 2.8333956004498262e+00 -4.4154402820404863e+00 -2.1604776201213680e-01 -3.1021446824432064e+00 -3.0476555726606596e+00 -5.3476612636187593e-01 -2.8646221671913210e+00 2.6301500299403697e+00 1.6678922076008579e-01 2.8750965219324933e+00 7.2404603220093779e+00 6.2190718989846605e-01 3.4841205217114219e+00 -6.7419434413511183e+00 -3.1304032352639349e-01 -3.2836155000188101e+00 -4.0827106358752410e+00 -5.5524208360651239e-01 -3.0808011226580816e+00 4.4379421730355411e+00 3.3277182176118936e-01 3.1385708282176790e+00 4.9904843034632890e-01 2.6521047829890345e+00 9.2770144441151681e-01 -4.2349590249820562e-01 -2.5270874650085253e+00 -6.8885169784204059e-01 -5.2995648711051335e-01 -1.4316262969422857e+00 -8.5658667542024669e-01 3.2036318243049638e-01 1.2488294463285443e+00 7.0370826081758298e-01 6.2190718989846616e-01 5.2913495161454760e+00 1.0140051824416081e+00 -3.1135467371713105e-01 -5.0531786361499798e+00 -6.4268457588218586e-01 -5.0011876024174839e-01 -2.7295390594614619e+00 -9.9333426025067939e-01 3.2360702089230720e-01 2.5491477120991970e+00 5.3604232172444510e-01 2.8553687637517426e+00 9.3326960565624395e-01 7.7775207477159762e+00 -3.0917567771816445e+00 -3.4788623227670734e-01 -7.5065445242713986e+00 -2.8727901928680533e+00 -8.6681900992234417e-01 -5.9058214302340302e+00 2.5025155769460374e+00 3.4296283158346341e-01 6.2548336066299823e+00 3.4841205217114215e+00 1.0140051824416079e+00 1.0809270725870897e+01 -3.2846501592186228e+00 -6.4603132383750805e-01 -1.1149468774043402e+01 -2.7240031733054106e+00 -9.7719915797348922e-01 -7.9524220033818045e+00 3.1311954401645297e+00 5.4769810432873189e-01 7.6726316517137843e+00 -3.6828086522272701e+00 -3.4094696289855070e-01 -2.5975515866775689e+00 4.0134555596103967e+00 7.9022433931124056e-02 2.9072731338477089e+00 2.6690971741436282e+00 3.2583033803708739e-01 2.5159174381152773e+00 -2.3886859088997356e+00 -5.5138953995519269e-02 -2.4745768707700124e+00 -6.7419434413511183e+00 -3.1135467371713110e-01 -3.2846501592186228e+00 6.4457762784442370e+00 9.8912896351057100e-02 3.0309848073488839e+00 3.7761105220259426e+00 2.6957938269024129e-01 2.6831744580684038e+00 -4.0910015317460804e+00 -6.5904460398308065e-02 -2.7805712207140698e+00 -1.8246103855796791e-01 -2.5368953696728203e+00 -4.0410918727018624e-01 8.7868885433396979e-02 2.5077827478202508e+00 1.6303550155025798e-01 1.7684819152056602e-01 1.2824853798804594e+00 3.6060357813916344e-01 -6.2976713653852656e-02 -1.2767601082697757e+00 -1.4196280921192136e-01 -3.1304032352639355e-01 -5.0531786361499798e+00 -6.4603132383750805e-01 9.8912896351057100e-02 5.0593953222790073e+00 2.1099922864621626e-01 2.7044548829373077e-01 2.5684659969352830e+00 5.9191347531780136e-01 -7.5597385860536770e-02 -2.5512953328224235e+00 -1.3444846333382343e-01 -2.6079326480682639e+00 -7.5390276506201537e-01 -8.2501035055112517e+00 2.8935908088959841e+00 1.4578053127359830e-01 7.9344176166858364e+00 2.8757696206646237e+00 7.0855714782966872e-01 6.2852210856535633e+00 -2.4583092321073412e+00 -1.2376246835075599e-01 -6.7302338697112329e+00 -3.2836155000188096e+00 -6.4268457588218575e-01 -1.1149468774043401e+01 3.0309848073488830e+00 2.1099922864621623e-01 1.1645081586179183e+01 2.6772588803538868e+00 5.8709302012081155e-01 8.3782996524536575e+00 -3.1277467370689633e+00 -1.3208011857533614e-01 -8.1132137917063574e+00 -2.3802688986790317e+00 -4.2675823639921828e-01 -2.4250651678881150e+00 2.6697369418276122e+00 1.8895327278001772e-01 2.5194696753151358e+00 4.0449931118879512e+00 5.0087950922409086e-01 2.8535517615166888e+00 -3.7273288302877789e+00 -1.7341738278882962e-01 -2.5952233536542968e+00 -4.0827106358752410e+00 -5.0011876024174839e-01 -2.7240031733054102e+00 3.7761105220259426e+00 2.7044548829373077e-01 2.6772588803538868e+00 6.5424651249897501e+00 5.0364757519769854e-01 2.9757420489409272e+00 -6.8429973358892031e+00 -3.6363146606574104e-01 -3.2817306712788179e+00 -4.2710946375502784e-01 -1.4375692037933456e+00 -9.3408171559582232e-01 4.0668353333574381e-01 1.2785619147735510e+00 6.6687550525759343e-01 4.9442784926925376e-01 2.7204014675979047e+00 9.2813828870658110e-01 -3.3733471497701889e-01 -2.5877688481919345e+00 -7.4844967031464105e-01 -5.5524208360651239e-01 -2.7295390594614619e+00 -9.7719915797348911e-01 2.6957938269024129e-01 2.5684659969352825e+00 5.8709302012081155e-01 5.0364757519769843e-01 5.3506244543384387e+00 1.0915654629877496e+00 -3.5465207815437849e-01 -5.1631767221984362e+00 -6.1394173318878376e-01 -2.4206315466191826e+00 -9.3163909801077183e-01 -6.5791910381727439e+00 2.8670647003796201e+00 3.2579132094412866e-01 6.2926455785050432e+00 2.8212173668941731e+00 9.3031018439242319e-01 7.8285694506894554e+00 -2.5838729569377819e+00 -3.8755606592093217e-01 -8.2914305769304733e+00 -3.0808011226580816e+00 -9.9333426025067939e-01 -7.9524220033818054e+00 2.6831744580684038e+00 5.9191347531780125e-01 8.3782996524536575e+00 2.9757420489409272e+00 1.0915654629877496e+00 1.1592319171812898e+01 -3.2618929480680778e+00 -6.2705101945971764e-01 -1.1268790234976032e+01 2.6297397625749763e+00 4.0449625539574324e-01 2.8493877891255059e+00 -3.0574970292417674e+00 -6.4376220254968572e-02 -2.9093971099422498e+00 -4.4519599198517943e+00 -4.2323018548285807e-01 -3.0708106312383254e+00 4.0285509782684938e+00 7.6866923168403573e-02 2.8567512265178805e+00 4.4379421730355411e+00 3.2360702089230714e-01 3.1311954401645297e+00 -4.0910015317460813e+00 -7.5597385860536798e-02 -3.1277467370689629e+00 -6.8429973358892049e+00 -3.5465207815437849e-01 -3.2618929480680778e+00 7.3472229028498361e+00 1.1288567029628700e-01 3.5325129705097007e+00 1.9719120967148651e-01 1.2512479968289634e+00 3.4244773467003348e-01 -7.5133183451609395e-02 -1.2731249728422793e+00 -1.2077465299406047e-01 -2.2542750855581412e-01 -2.5826248729429002e+00 -3.6566715556992291e-01 8.7247916742509660e-02 2.5450208091318358e+00 1.6486383992678896e-01 3.3277182176118941e-01 2.5491477120991970e+00 5.4769810432873189e-01 -6.5904460398308051e-02 -2.5512953328224235e+00 -1.3208011857533616e-01 -3.6363146606574093e-01 -5.1631767221984362e+00 -6.2705101945971786e-01 1.1288567029628702e-01 5.2248053827460419e+00 1.9056326767348311e-01 2.5162862634480176e+00 6.6990061948993951e-01 6.2607730692125303e+00 -2.9328526648026187e+00 -1.0411987734635428e-01 -6.0468981575979175e+00 -3.0900363346428952e+00 -6.9123049871177755e-01 -7.5461479258482900e+00 2.8978208292630043e+00 1.4723436369286971e-01 7.9633179334293089e+00 3.1385708282176794e+00 5.3604232172444510e-01 7.6726316517137843e+00 -2.7805712207140703e+00 -1.3444846333382346e-01 -8.1132137917063574e+00 -3.2817306712788179e+00 -6.1394173318878364e-01 -1.1268790234976032e+01 3.5325129705097003e+00 1.9056326767348308e-01 1.1078327455772980e+01 996 997 998 1044 1045 1046 1056 1057 1058 1008 1009 1010 999 1000 1001 1047 1048 1049 1059 1060 1061 1011 1012 1013 6.1414516556242837e+00 4.6834232734999204e-01 2.6919808857840613e+00 -6.3696823802141003e+00 -3.4305281041090474e-01 -3.0076247787231978e+00 -3.7758358341363381e+00 -4.6765822105657717e-01 -2.4392702760797240e+00 3.4547719153760292e+00 2.5040245287940011e-01 2.3948282438011024e+00 3.7896211750011335e+00 4.8678569365756452e-01 2.6996513353215894e+00 -3.4921462830873504e+00 -1.6529492423492267e-01 -2.4400281622838409e+00 -2.2180749917012639e+00 -4.1115921302836789e-01 -2.2581426646767855e+00 2.4698947431376070e+00 1.8163469484381739e-01 2.3586054168567951e+00 4.6834232734999193e-01 5.0879292775133020e+00 1.0262967046113334e+00 -3.1031696330699704e-01 -4.8295023629859806e+00 -5.2638702092162348e-01 -5.1980834054112124e-01 -2.5709865928194171e+00 -9.0985348546921241e-01 2.2145743997469705e-01 2.3844342145564648e+00 4.9441489774415848e-01 4.8199525721785552e-01 2.5517232383311814e+00 9.0613620630286540e-01 -3.2308517412206850e-01 -2.4292370382208617e+00 -7.2327409335827741e-01 -4.1012468102301997e-01 -1.3636369092475908e+00 -9.0678168280722637e-01 3.9154013445066210e-01 1.1692761728729038e+00 6.3944847389798243e-01 2.6919808857840608e+00 1.0262967046113332e+00 1.0782866883069978e+01 -2.9590621453889385e+00 -5.7864679445801714e-01 -1.0383516656809205e+01 -2.7880011833263136e+00 -9.3225084274845860e-01 -7.2527971995304359e+00 2.3866137398097647e+00 5.5473343589217949e-01 7.6496125787697995e+00 2.6649269091191945e+00 9.0250825782123145e-01 7.3699037516724166e+00 -2.4326012220280733e+00 -3.7079710832668528e-01 -7.8458170911418899e+00 -2.2597273138655529e+00 -9.0968853543109041e-01 -6.2075647795872584e+00 2.6958703298958580e+00 3.0784488263950993e-01 5.8873125135565942e+00 -6.3696823802140994e+00 -3.1031696330699704e-01 -2.9590621453889385e+00 6.8268190767333179e+00 7.3866270037207679e-02 3.2359147513524245e+00 4.1433061108783100e+00 2.8157980151687184e-01 2.8481567714639047e+00 -3.7854356542739955e+00 -4.3257247490345867e-02 -2.8498681902261196e+00 -4.2365553236330449e+00 -4.0995528709514428e-01 -2.9343349200216791e+00 3.8246404070173003e+00 6.7692375819033992e-02 2.7276927932604780e+00 2.5058336066860907e+00 3.9517401383060757e-01 2.7103286929209371e+00 -2.9089258431938791e+00 -5.4782963311235659e-02 -2.7788277533610057e+00 -3.4305281041090480e-01 -4.8295023629859797e+00 -5.7864679445801714e-01 7.3866270037207707e-02 4.8508151230967762e+00 1.2368034826451868e-01 3.0941216527120280e-01 2.3983260627875018e+00 5.0575132318822413e-01 -3.2056132020670300e-02 -2.3991190761015733e+00 -6.7978730493409731e-02 -1.9968156400339723e-01 -2.4236604536662321e+00 -3.1894290322558594e-01 6.1008474506541947e-02 2.4055523916657133e+00 1.1172656146198325e-01 1.7509523115184467e-01 1.1974462578712730e+00 2.9519227141225163e-01 -4.4591634531824915e-02 -1.1998579426674807e+00 -7.0782076149964859e-02 -3.0076247787231973e+00 -5.2638702092162337e-01 -1.0383516656809205e+01 3.2359147513524236e+00 1.2368034826451869e-01 1.0135950735873475e+01 2.8432181806128187e+00 4.5748141942246096e-01 7.0002428739529652e+00 -2.4837395553769941e+00 -7.3450146134180161e-02 -7.4223543729220403e+00 -2.9419584104948644e+00 -6.6025611537485052e-01 -7.1052669304976011e+00 2.7533930053993472e+00 1.2561837430235437e-01 7.5332724288578152e+00 2.3590867374218023e+00 6.3998880865019092e-01 5.9229475553768243e+00 -2.7582899301913368e+00 -8.6675668208873874e-02 -5.6812756338322288e+00 -3.7758358341363381e+00 -5.1980834054112124e-01 -2.7880011833263136e+00 4.1433061108783100e+00 3.0941216527120280e-01 2.8432181806128187e+00 6.7073761258879498e+00 5.8350279437317198e-01 3.1437641910686187e+00 -6.2644118501912684e+00 -2.8465584640226743e-01 -2.9311176911187551e+00 -2.8970813190496627e+00 -5.2106753398241601e-01 -2.7207453183148140e+00 2.5093698265038347e+00 1.5709337483377095e-01 2.7232411599835551e+00 3.7518301843013946e+00 4.8074006007521375e-01 2.6530297169576822e+00 -4.1745532441942172e+00 -2.0521667362755652e-01 -2.9233890558627920e+00 -4.6765822105657706e-01 -2.5709865928194175e+00 -9.3225084274845837e-01 2.8157980151687190e-01 2.3983260627875018e+00 4.5748141942246090e-01 5.8350279437317210e-01 4.9380306797640463e+00 9.4022902340323777e-01 -2.5983259053933816e-01 -4.7471413080041991e+00 -5.4846461602537588e-01 -5.2186598686188712e-01 -1.3594473627476047e+00 -8.3802197326914074e-01 3.0816459556716186e-01 1.2007829562056420e+00 6.8090977881262260e-01 4.8414642025824933e-01 2.5231910846910743e+00 9.0017800186175734e-01 -4.0803681325765262e-01 -2.3827555198770418e+00 -6.6006079145710350e-01 -2.4392702760797245e+00 -9.0985348546921241e-01 -7.2527971995304359e+00 2.8481567714639047e+00 5.0575132318822413e-01 7.0002428739529652e+00 3.1437641910686187e+00 9.4022902340323811e-01 9.8473470422419087e+00 -2.9790889505901754e+00 -6.0429880097341171e-01 -1.0249671291026122e+01 -2.7056046579446744e+00 -8.3213107040313539e-01 -5.5341161708322106e+00 2.3581262024906331e+00 3.2859673179532178e-01 5.9114764200789507e+00 2.6734296664963875e+00 9.0022613377591076e-01 7.3016414984520672e+00 -2.8995129469049696e+00 -3.2851985531693784e-01 -7.0241231733371228e+00 3.4547719153760283e+00 2.2145743997469705e-01 2.3866137398097651e+00 -3.7854356542739964e+00 -3.2056132020670279e-02 -2.4837395553769945e+00 -6.2644118501912684e+00 -2.5983259053933816e-01 -2.9790889505901763e+00 6.0507170776759249e+00 6.5914362064151799e-02 2.7077478470107259e+00 2.4664173577277930e+00 3.0326639293735658e-01 2.3423538402884208e+00 -2.2281832464661249e+00 -4.4720590337803595e-02 -2.2934450549123500e+00 -3.4328009518760685e+00 -3.2033962986339082e-01 -2.4013670578109725e+00 3.7389253520277137e+00 6.6310747784998750e-02 2.7209251915815789e+00 2.5040245287940011e-01 2.3844342145564648e+00 5.5473343589217960e-01 -4.3257247490345874e-02 -2.3991190761015733e+00 -7.3450146134180147e-02 -2.8465584640226738e-01 -4.7471413080041991e+00 -6.0429880097341171e-01 6.5914362064151771e-02 4.8330501615431878e+00 1.4201693695014167e-01 1.4849065333455136e-01 1.1674753895017900e+00 3.1395958366218185e-01 -3.9793228588926623e-02 -1.2016302580988711e+00 -9.1136585024058900e-02 -1.5543908753594721e-01 -2.3849485630344902e+00 -3.5306028829620506e-01 5.8337941739383899e-02 2.3478794396376887e+00 1.1123586392335265e-01 2.3948282438011019e+00 4.9441489774415859e-01 7.6496125787697995e+00 -2.8498681902261196e+00 -6.7978730493409703e-02 -7.4223543729220420e+00 -2.9311176911187542e+00 -5.4846461602537588e-01 -1.0249671291026120e+01 2.7077478470107268e+00 1.4201693695014173e-01 1.0831136391742749e+01 2.7194314039332061e+00 6.7860005503573650e-01 5.8841223056248344e+00 -2.3156552388716802e+00 -1.0316897971774679e-01 -6.3658646710407423e+00 -2.4164989292744101e+00 -7.2103706127616229e-01 -7.7708150607077915e+00 2.6911325547459297e+00 1.2561749778266088e-01 7.4438341195593090e+00 3.7896211750011335e+00 4.8199525721785558e-01 2.6649269091191945e+00 -4.2365553236330440e+00 -1.9968156400339726e-01 -2.9419584104948644e+00 -2.8970813190496627e+00 -5.2186598686188712e-01 -2.7056046579446744e+00 2.4664173577277930e+00 1.4849065333455133e-01 2.7194314039332057e+00 6.8872260783516568e+00 6.0903068397099314e-01 3.2974477228150567e+00 -6.3756472245328535e+00 -2.9076513535830351e-01 -3.0923449512115293e+00 -3.8032441482080146e+00 -5.4025290104512003e-01 -2.9056630166017663e+00 4.1692634043429937e+00 3.1304899274530973e-01 2.9637650003853770e+00 4.8678569365756447e-01 2.5517232383311814e+00 9.0250825782123145e-01 -4.0995528709514439e-01 -2.4236604536662321e+00 -6.6025611537485041e-01 -5.2106753398241601e-01 -1.3594473627476047e+00 -8.3213107040313539e-01 3.0326639293735658e-01 1.1674753895017900e+00 6.7860005503573650e-01 6.0903068397099314e-01 5.0345890764868777e+00 9.8354795416513596e-01 -2.9139764891996545e-01 -4.7824045754727749e+00 -6.0959018614779181e-01 -4.8516037786563876e-01 -2.5492430951309686e+00 -9.6865315196741308e-01 3.0849807729725037e-01 2.3609677826977338e+00 5.0597425687108633e-01 2.6996513353215894e+00 9.0613620630286540e-01 7.3699037516724166e+00 -2.9343349200216782e+00 -3.1894290322558594e-01 -7.1052669304976011e+00 -2.7207453183148145e+00 -8.3802197326914074e-01 -5.5341161708322106e+00 2.3423538402884208e+00 3.1395958366218185e-01 5.8841223056248335e+00 3.2974477228150567e+00 9.8354795416513607e-01 1.0197249304781026e+01 -3.1020842399911452e+00 -6.1024870793174335e-01 -1.0532742547269175e+01 -2.5431236948410172e+00 -9.4679114034680700e-01 -7.4395964419866853e+00 2.9608352747435873e+00 5.1036098064309665e-01 7.1604467285073952e+00 -3.4921462830873513e+00 -3.2308517412206850e-01 -2.4326012220280733e+00 3.8246404070173003e+00 6.1008474506541947e-02 2.7533930053993476e+00 2.5093698265038347e+00 3.0816459556716186e-01 2.3581262024906331e+00 -2.2281832464661253e+00 -3.9793228588926616e-02 -2.3156552388716802e+00 -6.3756472245328553e+00 -2.9139764891996545e-01 -3.1020842399911448e+00 6.0836693760668821e+00 7.8060000936856083e-02 2.8397112605391195e+00 3.4967060928721594e+00 2.5378228783340406e-01 2.5038116427422672e+00 -3.8184089483738477e+00 -4.6739307213004691e-02 -2.6047014102804682e+00 -1.6529492423492267e-01 -2.4292370382208617e+00 -3.7079710832668528e-01 6.7692375819033992e-02 2.4055523916657138e+00 1.2561837430235440e-01 1.5709337483377095e-01 1.2007829562056420e+00 3.2859673179532184e-01 -4.4720590337803595e-02 -1.2016302580988711e+00 -1.0316897971774679e-01 -2.9076513535830351e-01 -4.7824045754727749e+00 -6.1024870793174335e-01 7.8060000936856111e-02 4.7973633214671336e+00 1.6704419739126070e-01 2.5037970577723428e-01 2.3795004037973850e+00 5.5511684360380464e-01 -5.2444807435865541e-02 -2.3699272013433661e+00 -9.2161351116566065e-02 -2.4400281622838409e+00 -7.2327409335827741e-01 -7.8458170911418899e+00 2.7276927932604775e+00 1.1172656146198323e-01 7.5332724288578135e+00 2.7232411599835551e+00 6.8090977881262260e-01 5.9114764200789507e+00 -2.2934450549123495e+00 -9.1136585024058886e-02 -6.3658646710407423e+00 -3.0923449512115293e+00 -6.0959018614779181e-01 -1.0532742547269175e+01 2.8397112605391195e+00 1.6704419739126078e-01 1.1036993399891914e+01 2.4939688839724186e+00 5.5847177776599022e-01 7.8673831065174760e+00 -2.9587959293478501e+00 -9.4151450901731729e-02 -7.6047010458943465e+00 -2.2180749917012634e+00 -4.1012468102301997e-01 -2.2597273138655529e+00 2.5058336066860907e+00 1.7509523115184467e-01 2.3590867374218023e+00 3.7518301843013946e+00 4.8414642025824933e-01 2.6734296664963875e+00 -3.4328009518760680e+00 -1.5543908753594721e-01 -2.4164989292744106e+00 -3.8032441482080146e+00 -4.8516037786563887e-01 -2.5431236948410172e+00 3.4967060928721594e+00 2.5037970577723428e-01 2.4939688839724186e+00 5.9639330084231190e+00 4.8154857677911722e-01 2.7541331159248394e+00 -6.2641828004974176e+00 -3.4044578754184096e-01 -3.0612684658344667e+00 -4.1115921302836794e-01 -1.3636369092475908e+00 -9.0968853543109041e-01 3.9517401383060757e-01 1.1974462578712730e+00 6.3998880865019103e-01 4.8074006007521375e-01 2.5231910846910743e+00 9.0022613377591076e-01 -3.2033962986339082e-01 -2.3849485630344902e+00 -7.2103706127616229e-01 -5.4025290104512003e-01 -2.5492430951309686e+00 -9.4679114034680678e-01 2.5378228783340406e-01 2.3795004037973846e+00 5.5847177776599000e-01 4.8154857677911722e-01 4.8910458416709330e+00 1.0573331083272755e+00 -3.3949319458146360e-01 -4.6933550206176147e+00 -5.7850309146530765e-01 -2.2581426646767855e+00 -9.0678168280722637e-01 -6.2075647795872575e+00 2.7103286929209371e+00 2.9519227141225163e-01 5.9229475553768243e+00 2.6530297169576822e+00 9.0017800186175734e-01 7.3016414984520672e+00 -2.4013670578109725e+00 -3.5306028829620506e-01 -7.7708150607077915e+00 -2.9056630166017663e+00 -9.6865315196741297e-01 -7.4395964419866853e+00 2.5038116427422672e+00 5.5511684360380464e-01 7.8673831065174742e+00 2.7541331159248390e+00 1.0573331083272755e+00 1.0730582555824906e+01 -3.0561304294561995e+00 -5.7932510213424782e-01 -1.0404578433889540e+01 2.4698947431376070e+00 3.9154013445066205e-01 2.6958703298958580e+00 -2.9089258431938787e+00 -4.4591634531824915e-02 -2.7582899301913364e+00 -4.1745532441942172e+00 -4.0803681325765262e-01 -2.8995129469049696e+00 3.7389253520277137e+00 5.8337941739383899e-02 2.6911325547459297e+00 4.1692634043429937e+00 3.0849807729725037e-01 2.9608352747435873e+00 -3.8184089483738486e+00 -5.2444807435865541e-02 -2.9587959293478501e+00 -6.2641828004974176e+00 -3.3949319458146349e-01 -3.0561304294562004e+00 6.7879873367510459e+00 8.6190296319511917e-02 3.3248910765149811e+00 1.8163469484381739e-01 1.1692761728729038e+00 3.0784488263950993e-01 -5.4782963311235659e-02 -1.1998579426674807e+00 -8.6675668208873902e-02 -2.0521667362755647e-01 -2.3827555198770418e+00 -3.2851985531693784e-01 6.6310747784998750e-02 2.3478794396376887e+00 1.2561749778266090e-01 3.1304899274530973e-01 2.3609677826977338e+00 5.1036098064309665e-01 -4.6739307213004691e-02 -2.3699272013433661e+00 -9.4151450901731687e-02 -3.4044578754184091e-01 -4.6933550206176147e+00 -5.7932510213424782e-01 8.6190296319511917e-02 4.7677722892971772e+00 1.4484871549652384e-01 2.3586054168567947e+00 6.3944847389798243e-01 5.8873125135565942e+00 -2.7788277533610057e+00 -7.0782076149964859e-02 -5.6812756338322297e+00 -2.9233890558627911e+00 -6.6006079145710350e-01 -7.0241231733371228e+00 2.7209251915815789e+00 1.1123586392335269e-01 7.4438341195593090e+00 2.9637650003853775e+00 5.0597425687108633e-01 7.1604467285073961e+00 -2.6047014102804682e+00 -9.2161351116566079e-02 -7.6047010458943465e+00 -3.0612684658344667e+00 -5.7850309146530776e-01 -1.0404578433889544e+01 3.3248910765149806e+00 1.4484871549652387e-01 1.0223084925329937e+01 960 961 962 1008 1009 1010 1020 1021 1022 972 973 974 963 964 965 1011 1012 1013 1023 1024 1025 975 976 977 6.3145786066997234e+00 1.0010243676003296e+00 2.6758237593641012e+00 -6.5568546212607517e+00 -9.5506129213101487e-01 -3.0063800512802290e+00 -3.8866397324789199e+00 -9.5962591798913710e-01 -2.4009256270154582e+00 3.5867651255992388e+00 7.3001808172864657e-01 2.4063242723205343e+00 3.9291903570719842e+00 1.0416297694008834e+00 2.6756011372668032e+00 -3.6442595393854900e+00 -6.8354379022636269e-01 -2.4916381802641752e+00 -2.3008369325335178e+00 -8.6476249029593955e-01 -2.2387162861049199e+00 2.5580567362877327e+00 6.9032127191259296e-01 2.3799109757133436e+00 1.0010243676003294e+00 5.8510972520286098e+00 2.1275368352595501e+00 -9.3135986710628083e-01 -5.4596481233842340e+00 -1.6831530298697435e+00 -1.0564347580286615e+00 -3.2362072720550823e+00 -1.8190814669794118e+00 6.9851113489257777e-01 2.9231208665978636e+00 1.5432089772801643e+00 1.0281791538358738e+00 3.2332227911546072e+00 1.8814701731321961e+00 -8.1963374736704020e-01 -2.9914871520916151e+00 -1.8107659530384819e+00 -8.4505252159416488e-01 -1.9777965273245341e+00 -1.8338626868809198e+00 9.2476623776736611e-01 1.6576981650743849e+00 1.5946471510966460e+00 2.6758237593641012e+00 2.1275368352595505e+00 1.0730737038399939e+01 -2.9833613716097909e+00 -1.7141589674958773e+00 -1.0505272457336622e+01 -2.7148789905574775e+00 -1.8688976618535258e+00 -7.1678344061401589e+00 2.3785701269897772e+00 1.5922948947515714e+00 7.7038618481481551e+00 2.6644771184309106e+00 1.8962754672320348e+00 7.3419075305146890e+00 -2.4622515711619015e+00 -1.4905679557465625e+00 -7.9369644837918187e+00 -2.2197999836455318e+00 -1.8607745850138817e+00 -6.0920579039075600e+00 2.6614209121899104e+00 1.3182919728666862e+00 5.9256228341133745e+00 -6.5568546212607517e+00 -9.3135986710628083e-01 -2.9833613716097900e+00 7.0065939452220460e+00 7.8415699095927127e-01 3.2951773976337337e+00 4.2528020748434825e+00 8.8801021650225387e-01 2.8417394323501708e+00 -3.9139250746514627e+00 -6.3836812943333365e-01 -2.8952661370421842e+00 -4.3741168226565303e+00 -1.0483765817156825e+00 -2.9397513401757562e+00 3.9806427315484600e+00 6.7140986209654430e-01 2.8104572620713855e+00 2.5910888212569079e+00 9.5067704147675414e-01 2.6950262119261690e+00 -2.9862310543021535e+00 -6.7614953277952439e-01 -2.8240214551537273e+00 -9.5506129213101487e-01 -5.4596481233842340e+00 -1.7141589674958775e+00 7.8415699095927127e-01 5.3044140928557439e+00 1.2876065417506328e+00 9.0493031094920640e-01 2.9283219009142942e+00 1.4764518554473636e+00 -5.6414161445518696e-01 -2.7692560134943651e+00 -1.1583802959978071e+00 -8.4287790844386989e-01 -2.9660266218942226e+00 -1.3315557801640063e+00 6.5202679933332952e-01 2.8049532580755723e+00 1.2184103987121366e+00 6.7071634259621726e-01 1.6810610518497016e+00 1.2887616548857310e+00 -6.4974962880795251e-01 -1.5238195449224889e+00 -1.0671354071381736e+00 -3.0063800512802286e+00 -1.6831530298697435e+00 -1.0505272457336623e+01 3.2951773976337337e+00 1.2876065417506330e+00 1.0400173126292762e+01 2.8124152011433732e+00 1.4319225946825069e+00 7.0697114630867048e+00 -2.5130830328756635e+00 -1.1274257365714939e+00 -7.6333254762062204e+00 -2.9829074466894818e+00 -1.6862515412059789e+00 -7.2172151288605448e+00 2.8193863247418234e+00 1.2577103100895537e+00 7.7742613656196262e+00 2.3619116233462316e+00 1.6153546732792348e+00 5.9628226696040691e+00 -2.7865200160197872e+00 -1.0957638121547086e+00 -5.8511555621997733e+00 -3.8866397324789190e+00 -1.0564347580286615e+00 -2.7148789905574775e+00 4.2528020748434834e+00 9.0493031094920640e-01 2.8124152011433736e+00 6.9582191526119876e+00 1.2089441204022877e+00 3.0432311006388093e+00 -6.5506989848893271e+00 -8.7538374805956842e-01 -2.8817449741756480e+00 -2.9583531824226834e+00 -1.0810012498502013e+00 -2.6522212398206575e+00 2.5950607481396641e+00 7.2953719427359864e-01 2.7169861307279111e+00 3.9100637661933582e+00 1.0029405862458329e+00 2.5653730054671064e+00 -4.3204538419975620e+00 -8.3353245593249237e-01 -2.8891602334234161e+00 -9.5962591798913710e-01 -3.2362072720550823e+00 -1.8688976618535258e+00 8.8801021650225409e-01 2.9283219009142938e+00 1.4319225946825069e+00 1.2089441204022877e+00 5.8239093349610371e+00 1.9316410182858237e+00 -8.6143505590889125e-01 -5.5124133393073720e+00 -1.6569111497437490e+00 -1.0805127253108411e+00 -1.9622986593843066e+00 -1.6987343161131858e+00 8.0417461824084635e-01 1.6890892092416521e+00 1.6565779192976242e+00 1.0065538687104525e+00 3.2565907548726534e+00 1.8357271771674213e+00 -1.0061091246469709e+00 -2.9869919292428766e+00 -1.6313255817229155e+00 -2.4009256270154582e+00 -1.8190814669794115e+00 -7.1678344061401589e+00 2.8417394323501708e+00 1.4764518554473636e+00 7.0697114630867048e+00 3.0432311006388089e+00 1.9316410182858237e+00 9.9298984445385816e+00 -2.9528171778695333e+00 -1.7240409273027870e+00 -1.0458922971794093e+01 -2.6597354767721963e+00 -1.7043072280297613e+00 -5.4460760302300759e+00 2.3634052344260725e+00 1.3130760721057337e+00 5.9322392210993184e+00 2.6076134326096083e+00 1.8576329428962999e+00 7.2696018323564546e+00 -2.8425109183674708e+00 -1.3313722664232572e+00 -7.1286175529167322e+00 3.5867651255992388e+00 6.9851113489257777e-01 2.3785701269897772e+00 -3.9139250746514622e+00 -5.6414161445518696e-01 -2.5130830328756635e+00 -6.5506989848893262e+00 -8.6143505590889125e-01 -2.9528171778695338e+00 6.3575209678380071e+00 6.1595102764871668e-01 2.7199835521018327e+00 2.5491824377016039e+00 7.9517513089480651e-01 2.3260251582580644e+00 -2.3258877096743276e+00 -5.3190369251327851e-01 -2.3261840914119825e+00 -3.6137547275803934e+00 -7.9831872138242832e-01 -2.3679234599173631e+00 3.9107979656566618e+00 6.4616179082368219e-01 2.7354289247248684e+00 7.3001808172864668e-01 2.9231208665978636e+00 1.5922948947515714e+00 -6.3836812943333365e-01 -2.7692560134943656e+00 -1.1274257365714939e+00 -8.7538374805956842e-01 -5.5124133393073729e+00 -1.7240409273027875e+00 6.1595102764871656e-01 5.4443180225672707e+00 1.3668638704004361e+00 7.0775279916328704e-01 1.6456003948049929e+00 1.2719813313025392e+00 -5.2054573902683943e-01 -1.5379273013032120e+00 -1.1534016504897551e+00 -6.3618099482703383e-01 -2.9990864003965916e+00 -1.4172574893868790e+00 6.1675670280612493e-01 2.8056437705314110e+00 1.1909857072963681e+00 2.4063242723205338e+00 1.5432089772801643e+00 7.7038618481481569e+00 -2.8952661370421842e+00 -1.1583802959978071e+00 -7.6333254762062186e+00 -2.8817449741756480e+00 -1.6569111497437490e+00 -1.0458922971794093e+01 2.7199835521018327e+00 1.3668638704004357e+00 1.1187667258969269e+01 2.7418172908874068e+00 1.6761741665869807e+00 5.9123470231109572e+00 -2.3759941978608321e+00 -1.2037343050003004e+00 -6.5272786637488220e+00 -2.4052584600599967e+00 -1.7934841628139928e+00 -7.8606114066237680e+00 2.6901386538288876e+00 1.2262628992882645e+00 7.6762623881445169e+00 3.9291903570719851e+00 1.0281791538358738e+00 2.6644771184309106e+00 -4.3741168226565303e+00 -8.4287790844386989e-01 -2.9829074466894809e+00 -2.9583531824226843e+00 -1.0805127253108411e+00 -2.6597354767721963e+00 2.5491824377016039e+00 7.0775279916328704e-01 2.7418172908874068e+00 7.1979689473985893e+00 1.3148030848296763e+00 3.2767832278872726e+00 -6.7103939565575468e+00 -9.6003348671992228e-01 -3.1449681017666484e+00 -3.9845491172841792e+00 -1.1265650562073097e+00 -2.8662607995562630e+00 4.3510713367487597e+00 9.5925413885310384e-01 2.9707941875789987e+00 1.0416297694008831e+00 3.2332227911546072e+00 1.8962754672320343e+00 -1.0483765817156825e+00 -2.9660266218942226e+00 -1.6862515412059789e+00 -1.0810012498502013e+00 -1.9622986593843064e+00 -1.7043072280297613e+00 7.9517513089480651e-01 1.6456003948049929e+00 1.6761741665869809e+00 1.3148030848296761e+00 5.9718341478210171e+00 2.0858953963415643e+00 -9.6110186439356282e-01 -5.5880744445974777e+00 -1.8403724024300212e+00 -1.0076155316180020e+00 -3.3225232782311656e+00 -1.9757592815031226e+00 9.4648724245208238e-01 2.9882656703265540e+00 1.5483454230083047e+00 2.6756011372668027e+00 1.8814701731321961e+00 7.3419075305146890e+00 -2.9397513401757562e+00 -1.3315557801640063e+00 -7.2172151288605448e+00 -2.6522212398206579e+00 -1.6987343161131860e+00 -5.4460760302300759e+00 2.3260251582580644e+00 1.2719813313025390e+00 5.9123470231109589e+00 3.2767832278872726e+00 2.0858953963415638e+00 1.0342702280784403e+01 -3.1353352205872715e+00 -1.8327676276115952e+00 -1.0809639820636091e+01 -2.4992896453227407e+00 -1.9312649392007344e+00 -7.4349767258262469e+00 2.9481879224942857e+00 1.5549757623132183e+00 7.3109508711429072e+00 -3.6442595393854900e+00 -8.1963374736704020e-01 -2.4622515711619011e+00 3.9806427315484600e+00 6.5202679933332952e-01 2.8193863247418234e+00 2.5950607481396641e+00 8.0417461824084635e-01 2.3634052344260725e+00 -2.3258877096743276e+00 -5.2054573902683943e-01 -2.3759941978608321e+00 -6.7103939565575468e+00 -9.6110186439356293e-01 -3.1353352205872720e+00 6.4247278840858604e+00 6.9449696566447716e-01 2.9331126472651134e+00 3.6978832681521250e+00 7.7695968296295437e-01 2.5299273364986092e+00 -4.0177734263087466e+00 -6.2637671541416318e-01 -2.6722505533216134e+00 -6.8354379022636258e-01 -2.9914871520916151e+00 -1.4905679557465625e+00 6.7140986209654430e-01 2.8049532580755723e+00 1.2577103100895535e+00 7.2953719427359853e-01 1.6890892092416523e+00 1.3130760721057335e+00 -5.3190369251327851e-01 -1.5379273013032120e+00 -1.2037343050003004e+00 -9.6003348671992228e-01 -5.5880744445974777e+00 -1.8327676276115950e+00 6.9449696566447716e-01 5.4330061307916946e+00 1.5065430107303257e+00 7.6814800792360627e-01 3.0218235363308348e+00 1.6837870433993150e+00 -6.8811106049866311e-01 -2.8313832364474485e+00 -1.2340465479664706e+00 -2.4916381802641752e+00 -1.8107659530384819e+00 -7.9369644837918178e+00 2.8104572620713855e+00 1.2184103987121362e+00 7.7742613656196262e+00 2.7169861307279111e+00 1.6565779192976240e+00 5.9322392210993167e+00 -2.3261840914119825e+00 -1.1534016504897551e+00 -6.5272786637488220e+00 -3.1449681017666480e+00 -1.8403724024300212e+00 -1.0809639820636091e+01 2.9331126472651139e+00 1.5065430107303257e+00 1.1462079528300455e+01 2.4962201405428464e+00 1.6785172552489964e+00 7.9970652825102864e+00 -2.9939858071644490e+00 -1.2555085780308197e+00 -7.8917624293529531e+00 -2.3008369325335178e+00 -8.4505252159416500e-01 -2.2197999836455318e+00 2.5910888212569074e+00 6.7071634259621726e-01 2.3619116233462316e+00 3.9100637661933577e+00 1.0065538687104525e+00 2.6076134326096083e+00 -3.6137547275803934e+00 -6.3618099482703394e-01 -2.4052584600599967e+00 -3.9845491172841792e+00 -1.0076155316180020e+00 -2.4992896453227411e+00 3.6978832681521250e+00 7.6814800792360627e-01 2.4962201405428464e+00 6.3740273171959174e+00 1.0253033994727150e+00 2.7025044147809094e+00 -6.6739223954002185e+00 -9.8187257066378852e-01 -3.0439015222513239e+00 -8.6476249029593943e-01 -1.9777965273245344e+00 -1.8607745850138815e+00 9.5067704147675414e-01 1.6810610518497013e+00 1.6153546732792348e+00 1.0029405862458329e+00 3.2565907548726534e+00 1.8576329428962997e+00 -7.9831872138242832e-01 -2.9990864003965911e+00 -1.7934841628139926e+00 -1.1265650562073097e+00 -3.3225232782311656e+00 -1.9312649392007342e+00 7.7695968296295426e-01 3.0218235363308348e+00 1.6785172552489966e+00 1.0253033994727150e+00 5.9530294504559365e+00 2.2044311918093422e+00 -9.6623444227257826e-01 -5.6130985875568333e+00 -1.7704123762052646e+00 -2.2387162861049199e+00 -1.8338626868809198e+00 -6.0920579039075591e+00 2.6950262119261694e+00 1.2887616548857310e+00 5.9628226696040691e+00 2.5653730054671064e+00 1.8357271771674213e+00 7.2696018323564546e+00 -2.3679234599173631e+00 -1.4172574893868790e+00 -7.8606114066237680e+00 -2.8662607995562630e+00 -1.9757592815031226e+00 -7.4349767258262469e+00 2.5299273364986101e+00 1.6837870433993150e+00 7.9970652825102864e+00 2.7025044147809085e+00 2.2044311918093422e+00 1.0918869431842053e+01 -3.0199304230942463e+00 -1.7858276094908843e+00 -1.0760713179955287e+01 2.5580567362877327e+00 9.2476623776736600e-01 2.6614209121899104e+00 -2.9862310543021540e+00 -6.4974962880795262e-01 -2.7865200160197867e+00 -4.3204538419975611e+00 -1.0061091246469711e+00 -2.8425109183674708e+00 3.9107979656566618e+00 6.1675670280612493e-01 2.6901386538288872e+00 4.3510713367487597e+00 9.4648724245208238e-01 2.9481879224942862e+00 -4.0177734263087466e+00 -6.8811106049866300e-01 -2.9939858071644494e+00 -6.6739223954002203e+00 -9.6623444227257815e-01 -3.0199304230942459e+00 7.1784546793155259e+00 8.2219407320058924e-01 3.3431996761328682e+00 6.9032127191259296e-01 1.6576981650743849e+00 1.3182919728666862e+00 -6.7614953277952439e-01 -1.5238195449224894e+00 -1.0957638121547086e+00 -8.3353245593249237e-01 -2.9869919292428766e+00 -1.3313722664232572e+00 6.4616179082368219e-01 2.8056437705314110e+00 1.2262628992882643e+00 9.5925413885310384e-01 2.9882656703265540e+00 1.5549757623132181e+00 -6.2637671541416318e-01 -2.8313832364474485e+00 -1.2555085780308199e+00 -9.8187257066378852e-01 -5.6130985875568342e+00 -1.7858276094908845e+00 8.2219407320058935e-01 5.5036856922372959e+00 1.3689416316315015e+00 2.3799109757133436e+00 1.5946471510966458e+00 5.9256228341133745e+00 -2.8240214551537268e+00 -1.0671354071381736e+00 -5.8511555621997733e+00 -2.8891602334234161e+00 -1.6313255817229155e+00 -7.1286175529167313e+00 2.7354289247248684e+00 1.1909857072963681e+00 7.6762623881445178e+00 2.9707941875789987e+00 1.5483454230083047e+00 7.3109508711429072e+00 -2.6722505533216134e+00 -1.2340465479664706e+00 -7.8917624293529531e+00 -3.0439015222513239e+00 -1.7704123762052646e+00 -1.0760713179955289e+01 3.3431996761328691e+00 1.3689416316315013e+00 1.0719412631023946e+01 1008 1009 1010 1056 1057 1058 1068 1069 1070 1020 1021 1022 1011 1012 1013 1059 1060 1061 1071 1072 1073 1023 1024 1025 5.8622385653798910e+00 9.2386687288353919e-01 2.4272720908126946e+00 -6.0990540756501401e+00 -8.8706957739223613e-01 -2.7681525860115466e+00 -3.5808729873017606e+00 -8.9158091063148326e-01 -2.1786919144621155e+00 3.2766752720859533e+00 6.6222671701777314e-01 2.1792546908887620e+00 3.6071309661429898e+00 9.7291236517733481e-01 2.4478656272779182e+00 -3.3220581545203594e+00 -6.0894119500604760e-01 -2.2533990171466698e+00 -2.0744650212790976e+00 -7.9489478403192548e-01 -2.0161374075022502e+00 2.3304054351425236e+00 6.2348051198304622e-01 2.1619885161432095e+00 9.2386687288353919e-01 5.4955822654911790e+00 1.9933325423591928e+00 -8.5567550194695097e-01 -5.0900337107846489e+00 -1.5399377441167534e+00 -9.9350710946647691e-01 -3.0170473828637445e+00 -1.6953372690844435e+00 6.2717481743562409e-01 2.6913375210299462e+00 1.4129477309605660e+00 9.5743685874891715e-01 3.0034018826544404e+00 1.7517845475411187e+00 -7.4604674399402815e-01 -2.7511785271162643e+00 -1.6802045996467390e+00 -7.7611686687380210e-01 -1.8367018589047599e+00 -1.7131763083756202e+00 8.6286767321317803e-01 1.5046398104938521e+00 1.4705911003626784e+00 2.4272720908126946e+00 1.9933325423591932e+00 9.9606311733872328e+00 -2.7367166702129992e+00 -1.5804148864767138e+00 -9.7313858722575102e+00 -2.4972123807371300e+00 -1.7443905454868329e+00 -6.5660722455778728e+00 2.1524882141099191e+00 1.4709989964092676e+00 7.1038581058067081e+00 2.4306535526297339e+00 1.7655808278673359e+00 6.7158631668191324e+00 -2.2271798093812585e+00 -1.3536987907320532e+00 -7.3156443364850015e+00 -1.9989330073515701e+00 -1.7396441172717310e+00 -5.5797237168902711e+00 2.4496280101306116e+00 1.1882359733315364e+00 5.4124737251975805e+00 -6.0990540756501401e+00 -8.5567550194695119e-01 -2.7367166702129988e+00 6.5683779176015307e+00 7.0596017194016580e-01 3.0570813119495082e+00 3.9542858354333061e+00 8.1911536593960532e-01 2.6216576099737607e+00 -3.6058524624045178e+00 -5.6785907354582443e-01 -2.6757198242069080e+00 -4.0650575576560612e+00 -9.8043723741836686e-01 -2.7124218840542498e+00 3.6583274246175801e+00 5.9502229588538746e-01 2.5786535430794357e+00 2.3607819360100666e+00 8.8781737722286058e-01 2.4788017908755204e+00 -2.7718090179517656e+00 -6.0394339807687847e-01 -2.6113358774040689e+00 -8.8706957739223613e-01 -5.0900337107846489e+00 -1.5804148864767138e+00 7.0596017194016558e-01 4.9480168323350542e+00 1.1463598525981518e+00 8.4172337201388547e-01 2.6987440715229836e+00 1.3547765505876292e+00 -4.9447158240194933e-01 -2.5447675155071066e+00 -1.0255453698332175e+00 -7.7161054236814586e-01 -2.7313860762053812e+00 -1.2013054441891300e+00 5.7934417878067901e-01 2.5695817094003677e+00 1.0827123431869357e+00 6.0660301926252613e-01 1.5293391387059723e+00 1.1639321480128919e+00 -5.8047903983492544e-01 -1.3794944494672414e+00 -9.4051519388654747e-01 -2.7681525860115466e+00 -1.5399377441167534e+00 -9.7313858722575102e+00 3.0570813119495064e+00 1.1463598525981518e+00 9.6368234301343758e+00 2.5964384312023041e+00 1.3033991928596766e+00 6.4682696813932257e+00 -2.2928761093436214e+00 -9.9863375166336421e-01 -7.0373720755260090e+00 -2.7530037116683053e+00 -1.5545850431305808e+00 -6.5965284795130446e+00 2.5925752565654245e+00 1.1171103660071078e+00 7.1541873036349237e+00 2.1443478379328611e+00 1.4917459128158246e+00 5.4495531683189160e+00 -2.5764104306266229e+00 -9.6545878537006435e-01 -5.3435471561848855e+00 -3.5808729873017606e+00 -9.9350710946647691e-01 -2.4972123807371300e+00 3.9542858354333061e+00 8.4172337201388547e-01 2.5964384312023032e+00 6.4179048000052807e+00 1.1399313915662215e+00 2.7978570282362765e+00 -5.9881331742314048e+00 -7.9870707000313024e-01 -2.6369381351498848e+00 -2.7438957263181134e+00 -1.0217979617840789e+00 -2.4410654540756722e+00 2.3667360599049783e+00 6.5844484242689372e-01 2.5078449863625552e+00 3.5451404772649431e+00 9.3506697338009603e-01 2.3398605424020502e+00 -3.9711652847572299e+00 -7.6115443813341155e-01 -2.6667850182404997e+00 -8.9158091063148315e-01 -3.0170473828637445e+00 -1.7443905454868327e+00 8.1911536593960532e-01 2.6987440715229836e+00 1.3033991928596766e+00 1.1399313915662208e+00 5.3685191373343102e+00 1.7899885407670904e+00 -7.8129598794399724e-01 -5.0375065628925917e+00 -1.5139050027948942e+00 -1.0186293389264918e+00 -1.8236482648084111e+00 -1.5755641293369198e+00 7.3462587063450702e-01 1.5354729579433384e+00 1.5363602148757001e+00 9.3697325225605887e-01 2.9814208932249429e+00 1.7055705672502079e+00 -9.3913964289442053e-01 -2.7059548494608276e+00 -1.5014588381340292e+00 -2.1786919144621155e+00 -1.6953372690844433e+00 -6.5660722455778728e+00 2.6216576099737607e+00 1.3547765505876297e+00 6.4682696813932274e+00 2.7978570282362765e+00 1.7899885407670904e+00 9.0443067145767078e+00 -2.7062748642606111e+00 -1.5864865414029254e+00 -9.5631544021043382e+00 -2.4418653965940216e+00 -1.5810029030337933e+00 -4.9353359460245860e+00 2.1461420968397475e+00 1.1856457987370921e+00 5.4165060068300441e+00 2.3764975225531093e+00 1.7270408193150180e+00 6.5974220676134010e+00 -2.6153220822861467e+00 -1.1946249958856698e+00 -6.4619418767065859e+00 3.2766752720859533e+00 6.2717481743562409e-01 2.1524882141099191e+00 -3.6058524624045178e+00 -4.9447158240194933e-01 -2.2928761093436210e+00 -5.9881331742314048e+00 -7.8129598794399735e-01 -2.7062748642606111e+00 5.7996355801805288e+00 5.3914800767641269e-01 2.4653345988258373e+00 2.3193296593082269e+00 7.2547302894869881e-01 2.1102156110969750e+00 -2.0995732246122176e+00 -4.6202729091180084e-01 -2.1044506986863971e+00 -3.2482072494020384e+00 -7.2510268597685845e-01 -2.1312375578340288e+00 3.5461255990754679e+00 5.7110169317387127e-01 2.5068008060919289e+00 6.6222671701777314e-01 2.6913375210299466e+00 1.4709989964092676e+00 -5.6785907354582443e-01 -2.5447675155071061e+00 -9.9863375166336432e-01 -7.9870707000313035e-01 -5.0375065628925908e+00 -1.5864865414029254e+00 5.3914800767641280e-01 4.9787333540961178e+00 1.2186605963671582e+00 6.3815865057967558e-01 1.4937592510548328e+00 1.1497433201456300e+00 -4.5379528788202167e-01 -1.3914040726301038e+00 -1.0255305676898752e+00 -5.6487729249644070e-01 -2.7150751067972623e+00 -1.2841881825194523e+00 5.4570534865355569e-01 2.5249231316461684e+00 1.0554361303535624e+00 2.1792546908887620e+00 1.4129477309605663e+00 7.1038581058067072e+00 -2.6757198242069080e+00 -1.0255453698332175e+00 -7.0373720755260090e+00 -2.6369381351498848e+00 -1.5139050027948942e+00 -9.5631544021043382e+00 2.4653345988258364e+00 1.2186605963671582e+00 1.0305091367264207e+01 2.5278214009351587e+00 1.5553310619169549e+00 5.3972729244958693e+00 -2.1546543323404990e+00 -1.0690219211236187e+00 -6.0220875320443001e+00 -2.1707867691645597e+00 -1.6642523037075767e+00 -7.1921117369686449e+00 2.4656883702120962e+00 1.0857852082146302e+00 7.0085033490765118e+00 3.6071309661429898e+00 9.5743685874891704e-01 2.4306535526297344e+00 -4.0650575576560612e+00 -7.7161054236814586e-01 -2.7530037116683053e+00 -2.7438957263181134e+00 -1.0186293389264918e+00 -2.4418653965940216e+00 2.3193296593082264e+00 6.3815865057967558e-01 2.5278214009351587e+00 6.6128330832705879e+00 1.2371648816700000e+00 3.0071842836308291e+00 -6.1071767695510575e+00 -8.7068053395212486e-01 -2.8756532349827482e+00 -3.6077810356327911e+00 -1.0552168721910651e+00 -2.6276673193462732e+00 3.9846173804362204e+00 8.8337689643923589e-01 2.7325304253956273e+00 9.7291236517733481e-01 3.0034018826544404e+00 1.7655808278673355e+00 -9.8043723741836675e-01 -2.7313860762053812e+00 -1.5545850431305808e+00 -1.0217979617840789e+00 -1.8236482648084114e+00 -1.5810029030337933e+00 7.2547302894869881e-01 1.4937592510548328e+00 1.5553310619169545e+00 1.2371648816700000e+00 5.4842146696724283e+00 1.9315881893589468e+00 -8.7485339677480944e-01 -5.0806180212489158e+00 -1.6877216344544441e+00 -9.3376402686780069e-01 -3.0408657945124973e+00 -1.8416158022678148e+00 8.7530234704902254e-01 2.6951423533935057e+00 1.4124253037433969e+00 2.4478656272779178e+00 1.7517845475411189e+00 6.7158631668191315e+00 -2.7124218840542493e+00 -1.2013054441891298e+00 -6.5965284795130454e+00 -2.4410654540756718e+00 -1.5755641293369198e+00 -4.9353359460245860e+00 2.1102156110969750e+00 1.1497433201456295e+00 5.3972729244958693e+00 3.0071842836308287e+00 1.9315881893589468e+00 9.3947655393465652e+00 -2.8676909403004904e+00 -1.6752918367555512e+00 -9.8534945940278433e+00 -2.2581225375218255e+00 -1.7940099238933060e+00 -6.7418385293104439e+00 2.7140352939465164e+00 1.4130552771292142e+00 6.6192959182143563e+00 -3.3220581545203594e+00 -7.4604674399402815e-01 -2.2271798093812585e+00 3.6583274246175801e+00 5.7934417878067901e-01 2.5925752565654245e+00 2.3667360599049783e+00 7.3462587063450702e-01 2.1461420968397475e+00 -2.0995732246122172e+00 -4.5379528788202173e-01 -2.1546543323404990e+00 -6.1071767695510575e+00 -8.7485339677480944e-01 -2.8676909403004904e+00 5.8278470353059406e+00 6.0764817952579586e-01 2.6576596566553867e+00 3.3190661109627397e+00 7.0202091515734943e-01 2.2842812840070943e+00 -3.6431684821076056e+00 -5.4894371544747333e-01 -2.4311332120454052e+00 -6.0894119500604760e-01 -2.7511785271162643e+00 -1.3536987907320530e+00 5.9502229588538758e-01 2.5695817094003677e+00 1.1171103660071078e+00 6.5844484242689383e-01 1.5354729579433386e+00 1.1856457987370921e+00 -4.6202729091180084e-01 -1.3914040726301038e+00 -1.0690219211236187e+00 -8.7068053395212519e-01 -5.0806180212489158e+00 -1.6752918367555516e+00 6.0764817952579586e-01 4.9344708736775136e+00 1.3410029578818579e+00 6.9002991930836755e-01 2.7260376621689519e+00 1.5411411153658410e+00 -6.0949621727647163e-01 -2.5423625821948899e+00 -1.0868876893806760e+00 -2.2533990171466698e+00 -1.6802045996467387e+00 -7.3156443364850006e+00 2.5786535430794357e+00 1.0827123431869359e+00 7.1541873036349237e+00 2.5078449863625552e+00 1.5363602148757001e+00 5.4165060068300432e+00 -2.1044506986863971e+00 -1.0255305676898752e+00 -6.0220875320442993e+00 -2.8756532349827482e+00 -1.6877216344544441e+00 -9.8534945940278433e+00 2.6576596566553863e+00 1.3410029578818574e+00 1.0519435323037321e+01 2.2518853182836098e+00 1.5434011479634986e+00 7.3046683191671189e+00 -2.7625405535651733e+00 -1.1100198621169359e+00 -7.2035704901122646e+00 -2.0744650212790976e+00 -7.7611686687380210e-01 -1.9989330073515705e+00 2.3607819360100670e+00 6.0660301926252613e-01 2.1443478379328611e+00 3.5451404772649431e+00 9.3697325225605887e-01 2.3764975225531089e+00 -3.2482072494020384e+00 -5.6487729249644070e-01 -2.1707867691645593e+00 -3.6077810356327911e+00 -9.3376402686780058e-01 -2.2581225375218255e+00 3.3190661109627402e+00 6.9002991930836743e-01 2.2518853182836098e+00 5.7000591656754569e+00 9.3770577412759037e-01 2.4244523920935674e+00 -5.9945943835992832e+00 -8.9655377871650055e-01 -2.7693407568251938e+00 -7.9489478403192548e-01 -1.8367018589047599e+00 -1.7396441172717307e+00 8.8781737722286069e-01 1.5293391387059725e+00 1.4917459128158248e+00 9.3506697338009603e-01 2.9814208932249429e+00 1.7270408193150180e+00 -7.2510268597685845e-01 -2.7150751067972623e+00 -1.6642523037075767e+00 -1.0552168721910651e+00 -3.0408657945124973e+00 -1.7940099238933060e+00 7.0202091515734932e-01 2.7260376621689519e+00 1.5434011479634986e+00 9.3770577412759049e-01 5.3835301412447816e+00 2.0498681110694643e+00 -8.8739669768804774e-01 -5.0276850751301279e+00 -1.6141496462911926e+00 -2.0161374075022502e+00 -1.7131763083756202e+00 -5.5797237168902711e+00 2.4788017908755204e+00 1.1639321480128919e+00 5.4495531683189160e+00 2.3398605424020502e+00 1.7055705672502082e+00 6.5974220676134001e+00 -2.1312375578340288e+00 -1.2841881825194521e+00 -7.1921117369686467e+00 -2.6276673193462732e+00 -1.8416158022678151e+00 -6.7418385293104439e+00 2.2842812840070943e+00 1.5411411153658410e+00 7.3046683191671189e+00 2.4244523920935679e+00 2.0498681110694639e+00 9.8816371478817491e+00 -2.7523537246956811e+00 -1.6215316485355200e+00 -9.7196067198118286e+00 2.3304054351425236e+00 8.6286767321317814e-01 2.4496280101306116e+00 -2.7718090179517656e+00 -5.8047903983492544e-01 -2.5764104306266233e+00 -3.9711652847572299e+00 -9.3913964289442076e-01 -2.6153220822861463e+00 3.5461255990754683e+00 5.4570534865355580e-01 2.4656883702120953e+00 3.9846173804362204e+00 8.7530234704902254e-01 2.7140352939465160e+00 -3.6431684821076056e+00 -6.0949621727647152e-01 -2.7625405535651733e+00 -5.9945943835992814e+00 -8.8739669768804785e-01 -2.7523537246956820e+00 6.5195887537616706e+00 7.3263622877811074e-01 3.0772751168844019e+00 6.2348051198304622e-01 1.5046398104938521e+00 1.1882359733315366e+00 -6.0394339807687858e-01 -1.3794944494672414e+00 -9.6545878537006447e-01 -7.6115443813341155e-01 -2.7059548494608276e+00 -1.1946249958856698e+00 5.7110169317387127e-01 2.5249231316461684e+00 1.0857852082146302e+00 8.8337689643923589e-01 2.6951423533935062e+00 1.4130552771292142e+00 -5.4894371544747333e-01 -2.5423625821948899e+00 -1.1100198621169359e+00 -8.9655377871650055e-01 -5.0276850751301279e+00 -1.6215316485355202e+00 7.3263622877811085e-01 4.9307916607195619e+00 1.2045588332328101e+00 2.1619885161432091e+00 1.4705911003626784e+00 5.4124737251975814e+00 -2.6113358774040689e+00 -9.4051519388654770e-01 -5.3435471561848855e+00 -2.6667850182405002e+00 -1.5014588381340292e+00 -6.4619418767065859e+00 2.5068008060919289e+00 1.0554361303535624e+00 7.0085033490765110e+00 2.7325304253956277e+00 1.4124253037433969e+00 6.6192959182143554e+00 -2.4311332120454048e+00 -1.0868876893806758e+00 -7.2035704901122646e+00 -2.7693407568251942e+00 -1.6141496462911928e+00 -9.7196067198118303e+00 3.0772751168844019e+00 1.2045588332328099e+00 9.6883932503271204e+00 972 973 974 1020 1021 1022 1032 1033 1034 984 985 986 975 976 977 1023 1024 1025 1035 1036 1037 987 988 989 5.7852582369545882e+00 1.3210460490746569e+00 2.1678903490823425e+00 -6.0175846979182310e+00 -1.3738767012734525e+00 -2.5012049260532807e+00 -3.4643901948962093e+00 -1.2467047271444851e+00 -1.9203269734208737e+00 3.1896551826559323e+00 1.0236989212891832e+00 1.9576116302962363e+00 3.5509478204850575e+00 1.3987794933787261e+00 2.1872755762447662e+00 -3.2890109815808297e+00 -1.0252461768814725e+00 -2.0586354757705174e+00 -1.9987029351066139e+00 -1.1216157348496627e+00 -1.7838574256599973e+00 2.2438275694063035e+00 1.0239188764065059e+00 1.9512472452813250e+00 1.3210460490746569e+00 6.4381098123900751e+00 2.7676831973802400e+00 -1.3519103338894458e+00 -5.9570521599296775e+00 -2.4255238985491587e+00 -1.3836563193158027e+00 -3.8237974833935913e+00 -2.2985491503503672e+00 9.7804887128095919e-01 3.4335885143724010e+00 2.2036474916519260e+00 1.3780632471380423e+00 3.9060821401813399e+00 2.4300969414054152e+00 -1.1283095391644515e+00 -3.5907876623168336e+00 -2.5094241629546445e+00 -1.0777501341420714e+00 -2.6499707307100171e+00 -2.3419281199737112e+00 1.2644681590181130e+00 2.2438275694063039e+00 2.1739977013903014e+00 2.1678903490823429e+00 2.7676831973802400e+00 9.2844012285803537e+00 -2.4846123027688711e+00 -2.4496855019066390e+00 -9.2039455502778562e+00 -2.1888322653844008e+00 -2.3654642994322206e+00 -5.9486589195036039e+00 1.9074668008703461e+00 2.2451157534266972e+00 6.5671696267360993e+00 2.1877903124689677e+00 2.4643642135710619e+00 6.1664549386761696e+00 -2.0169320708029823e+00 -2.2266746074693899e+00 -6.8238319989705083e+00 -1.7467685248557048e+00 -2.3865860008510764e+00 -4.9766571231722221e+00 2.1739977013903022e+00 1.9512472452813254e+00 4.9350677979315742e+00 -6.0175846979182328e+00 -1.3519103338894458e+00 -2.4846123027688711e+00 6.4570448065527390e+00 1.3086028017605138e+00 2.8160182589647356e+00 3.8155843272429490e+00 1.2977890191230401e+00 2.3556375959389100e+00 -3.4919847021923758e+00 -1.0574285240597576e+00 -2.4480680061419791e+00 -3.9848025092321322e+00 -1.4943194953223271e+00 -2.4504869377983001e+00 3.6056786170449779e+00 1.1043799300970105e+00 2.3834002016286306e+00 2.2660348892120910e+00 1.3145023371406288e+00 2.2146971910279469e+00 -2.6499707307100171e+00 -1.1216157348496625e+00 -2.3865860008510742e+00 -1.3738767012734527e+00 -5.9570521599296775e+00 -2.4496855019066395e+00 1.3086028017605138e+00 5.6851550785852476e+00 2.1054751690144329e+00 1.3032904782252852e+00 3.4292080163685292e+00 2.0708034992237079e+00 -9.1458891126329689e-01 -3.1670655551971882e+00 -1.9179870517413853e+00 -1.3086421336552907e+00 -3.5461247580238497e+00 -1.9769087827716851e+00 1.0761663845265437e+00 3.2885474240914618e+00 1.9999416161183827e+00 9.8679821582176841e-01 2.2660348892120914e+00 1.9151295769188894e+00 -1.0777501341420712e+00 -1.9987029351066141e+00 -1.7467685248557043e+00 -2.5012049260532807e+00 -2.4255238985491583e+00 -9.2039455502778580e+00 2.8160182589647356e+00 2.1054751690144329e+00 9.2341847399266044e+00 2.3109882561349915e+00 2.0207090286124427e+00 5.9752856438333009e+00 -2.0664888633329705e+00 -1.8558584455970244e+00 -6.6321842873184282e+00 -2.5257308587112521e+00 -2.3345214783057493e+00 -6.1646072814075215e+00 2.3932166760525981e+00 2.0588798594571069e+00 6.7943656130939631e+00 1.9151295769188901e+00 2.2146971910279487e+00 4.9735582453221614e+00 -2.3419281199737116e+00 -1.7838574256599982e+00 -4.9766571231722221e+00 -3.4643901948962093e+00 -1.3836563193158025e+00 -2.1888322653844008e+00 3.8155843272429490e+00 1.3032904782252852e+00 2.3109882561349910e+00 6.2212458094310730e+00 1.5844595236195698e+00 2.4260365926307905e+00 -5.8324118698795600e+00 -1.2277537876709910e+00 -2.3139090085648299e+00 -2.6193493171418569e+00 -1.4389856952991575e+00 -2.1404077106578820e+00 2.2739107122686679e+00 1.1115615084625412e+00 2.2508794066611078e+00 3.4292080163685323e+00 1.2977890191230415e+00 2.0207090286124432e+00 -3.8237974833935962e+00 -1.2467047271444858e+00 -2.3654642994322201e+00 -1.2467047271444851e+00 -3.8237974833935917e+00 -2.3654642994322197e+00 1.2977890191230403e+00 3.4292080163685283e+00 2.0207090286124432e+00 1.5844595236195698e+00 6.2212458094310721e+00 2.4260365926307905e+00 -1.2277537876709912e+00 -5.8324118698795582e+00 -2.3139090085648291e+00 -1.4389856952991575e+00 -2.6193493171418560e+00 -2.1404077106578816e+00 1.1115615084625408e+00 2.2739107122686675e+00 2.2508794066611069e+00 1.3032904782252850e+00 3.8155843272429522e+00 2.3109882561349901e+00 -1.3836563193158022e+00 -3.4643901948962132e+00 -2.1888322653843995e+00 -1.9203269734208739e+00 -2.2985491503503677e+00 -5.9486589195036039e+00 2.3556375959389100e+00 2.0708034992237079e+00 5.9752856438333009e+00 2.4260365926307905e+00 2.4260365926307896e+00 8.3617628837298348e+00 -2.3942909851277268e+00 -2.3942909851277268e+00 -8.9430409510301043e+00 -2.1623164138255855e+00 -2.1623164138255841e+00 -4.3918409683930104e+00 1.9230058349311443e+00 1.9230058349311441e+00 4.9198655870338888e+00 2.0708034992237088e+00 2.3556375959389118e+00 5.9752856438333035e+00 -2.2985491503503677e+00 -1.9203269734208746e+00 -5.9486589195036093e+00 3.1896551826559327e+00 9.7804887128095919e-01 1.9074668008703461e+00 -3.4919847021923758e+00 -9.1458891126329700e-01 -2.0664888633329705e+00 -5.8324118698795600e+00 -1.2277537876709912e+00 -2.3942909851277263e+00 5.6745611192270102e+00 9.5162160884892288e-01 2.1897858709732327e+00 2.2220862919829867e+00 1.0875963107488968e+00 1.8636583754504117e+00 -2.0284289809692071e+00 -8.4119448917391615e-01 -1.8893885066629668e+00 -3.1670655551971900e+00 -1.0574285240597587e+00 -1.8558584455970251e+00 3.4335885143724041e+00 1.0236989212891840e+00 2.2451157534266972e+00 1.0236989212891832e+00 3.4335885143724010e+00 2.2451157534266972e+00 -1.0574285240597576e+00 -3.1670655551971878e+00 -1.8558584455970246e+00 -1.2277537876709910e+00 -5.8324118698795582e+00 -2.3942909851277268e+00 9.5162160884892266e-01 5.6745611192270102e+00 2.1897858709732327e+00 1.0875963107488966e+00 2.2220862919829858e+00 1.8636583754504108e+00 -8.4119448917391582e-01 -2.0284289809692071e+00 -1.8893885066629665e+00 -9.1458891126329678e-01 -3.4919847021923776e+00 -2.0664888633329692e+00 9.7804887128095852e-01 3.1896551826559358e+00 1.9074668008703450e+00 1.9576116302962365e+00 2.2036474916519260e+00 6.5671696267360993e+00 -2.4480680061419786e+00 -1.9179870517413851e+00 -6.6321842873184282e+00 -2.3139090085648295e+00 -2.3139090085648291e+00 -8.9430409510301043e+00 2.1897858709732323e+00 2.1897858709732327e+00 9.7724867435920881e+00 2.3031012899179393e+00 2.3031012899179384e+00 4.9139933244738216e+00 -1.9741822163911407e+00 -1.9741822163911411e+00 -5.6134097958711493e+00 -1.9179870517413848e+00 -2.4480680061419804e+00 -6.6321842873184282e+00 2.2036474916519260e+00 1.9576116302962367e+00 6.5671696267361019e+00 3.5509478204850575e+00 1.3780632471380423e+00 2.1877903124689677e+00 -3.9848025092321322e+00 -1.3086421336552907e+00 -2.5257308587112521e+00 -2.6193493171418569e+00 -1.4389856952991575e+00 -2.1623164138255855e+00 2.2220862919829867e+00 1.0875963107488968e+00 2.3031012899179393e+00 6.6115985317606816e+00 1.7942873956021992e+00 2.6993055604347198e+00 -6.1404382000122268e+00 -1.4167791225910891e+00 -2.6319926255501009e+00 -3.5461247580238542e+00 -1.4943194953223284e+00 -2.3345214783057502e+00 3.9060821401813435e+00 1.3987794933787268e+00 2.4643642135710624e+00 1.3987794933787261e+00 3.9060821401813399e+00 2.4643642135710619e+00 -1.4943194953223271e+00 -3.5461247580238497e+00 -2.3345214783057493e+00 -1.4389856952991575e+00 -2.6193493171418560e+00 -2.1623164138255846e+00 1.0875963107488968e+00 2.2220862919829858e+00 2.3031012899179384e+00 1.7942873956021990e+00 6.6115985317606798e+00 2.6993055604347189e+00 -1.4167791225910884e+00 -6.1404382000122251e+00 -2.6319926255500987e+00 -1.3086421336552905e+00 -3.9848025092321357e+00 -2.5257308587112508e+00 1.3780632471380421e+00 3.5509478204850597e+00 2.1877903124689659e+00 2.1872755762447662e+00 2.4300969414054152e+00 6.1664549386761696e+00 -2.4504869377983001e+00 -1.9769087827716851e+00 -6.1646072814075215e+00 -2.1404077106578820e+00 -2.1404077106578812e+00 -4.3918409683930113e+00 1.8636583754504117e+00 1.8636583754504108e+00 4.9139933244738216e+00 2.6993055604347198e+00 2.6993055604347194e+00 8.8858402982253075e+00 -2.6125330223074430e+00 -2.6125330223074439e+00 -9.4116879688434114e+00 -1.9769087827716858e+00 -2.4504869377983010e+00 -6.1646072814075250e+00 2.4300969414054148e+00 2.1872755762447662e+00 6.1664549386761713e+00 -3.2890109815808297e+00 -1.1283095391644515e+00 -2.0169320708029823e+00 3.6056786170449779e+00 1.0761663845265437e+00 2.3932166760525981e+00 2.2739107122686675e+00 1.1115615084625408e+00 1.9230058349311441e+00 -2.0284289809692071e+00 -8.4119448917391582e-01 -1.9741822163911407e+00 -6.1404382000122268e+00 -1.4167791225910882e+00 -2.6125330223074439e+00 5.8805290714739886e+00 1.1194215047248328e+00 2.4552195465301070e+00 3.2885474240914649e+00 1.1043799300970112e+00 2.0588798594571065e+00 -3.5907876623168362e+00 -1.0252461768814725e+00 -2.2266746074693899e+00 -1.0252461768814725e+00 -3.5907876623168336e+00 -2.2266746074693904e+00 1.1043799300970105e+00 3.2885474240914618e+00 2.0588798594571069e+00 1.1115615084625412e+00 2.2739107122686670e+00 1.9230058349311443e+00 -8.4119448917391615e-01 -2.0284289809692071e+00 -1.9741822163911411e+00 -1.4167791225910888e+00 -6.1404382000122251e+00 -2.6125330223074439e+00 1.1194215047248328e+00 5.8805290714739877e+00 2.4552195465301079e+00 1.0761663845265441e+00 3.6056786170449815e+00 2.3932166760525986e+00 -1.1283095391644515e+00 -3.2890109815808319e+00 -2.0169320708029819e+00 -2.0586354757705174e+00 -2.5094241629546445e+00 -6.8238319989705092e+00 2.3834002016286306e+00 1.9999416161183829e+00 6.7943656130939631e+00 2.2508794066611078e+00 2.2508794066611064e+00 4.9198655870338888e+00 -1.8893885066629668e+00 -1.8893885066629663e+00 -5.6134097958711493e+00 -2.6319926255501009e+00 -2.6319926255500992e+00 -9.4116879688434114e+00 2.4552195465301079e+00 2.4552195465301088e+00 1.0164164949433760e+01 1.9999416161183827e+00 2.3834002016286324e+00 6.7943656130939658e+00 -2.5094241629546445e+00 -2.0586354757705179e+00 -6.8238319989705101e+00 -1.9987029351066141e+00 -1.0777501341420714e+00 -1.7467685248557048e+00 2.2660348892120910e+00 9.8679821582176852e-01 1.9151295769188901e+00 3.4292080163685323e+00 1.3032904782252852e+00 2.0708034992237088e+00 -3.1670655551971900e+00 -9.1458891126329678e-01 -1.9179870517413851e+00 -3.5461247580238542e+00 -1.3086421336552905e+00 -1.9769087827716865e+00 3.2885474240914649e+00 1.0761663845265441e+00 1.9999416161183827e+00 5.6851550785852591e+00 1.3086028017605149e+00 2.1054751690144342e+00 -5.9570521599296908e+00 -1.3738767012734532e+00 -2.4496855019066408e+00 -1.1216157348496627e+00 -2.6499707307100171e+00 -2.3865860008510764e+00 1.3145023371406286e+00 2.2660348892120918e+00 2.2146971910279492e+00 1.2977890191230412e+00 3.8155843272429522e+00 2.3556375959389118e+00 -1.0574285240597587e+00 -3.4919847021923776e+00 -2.4480680061419804e+00 -1.4943194953223284e+00 -3.9848025092321357e+00 -2.4504869377983014e+00 1.1043799300970114e+00 3.6056786170449819e+00 2.3834002016286320e+00 1.3086028017605149e+00 6.4570448065527497e+00 2.8160182589647365e+00 -1.3519103338894467e+00 -6.0175846979182435e+00 -2.4846123027688716e+00 -1.7838574256599973e+00 -2.3419281199737112e+00 -4.9766571231722230e+00 2.2146971910279474e+00 1.9151295769188892e+00 4.9735582453221614e+00 2.0207090286124432e+00 2.3109882561349901e+00 5.9752856438333026e+00 -1.8558584455970251e+00 -2.0664888633329697e+00 -6.6321842873184291e+00 -2.3345214783057502e+00 -2.5257308587112508e+00 -6.1646072814075250e+00 2.0588798594571065e+00 2.3932166760525986e+00 6.7943656130939658e+00 2.1054751690144342e+00 2.8160182589647365e+00 9.2341847399266168e+00 -2.4255238985491592e+00 -2.5012049260532816e+00 -9.2039455502778686e+00 2.2438275694063035e+00 1.2644681590181130e+00 2.1739977013903022e+00 -2.6499707307100171e+00 -1.0777501341420712e+00 -2.3419281199737116e+00 -3.8237974833935957e+00 -1.3836563193158022e+00 -2.2985491503503677e+00 3.4335885143724036e+00 9.7804887128095852e-01 2.2036474916519255e+00 3.9060821401813444e+00 1.3780632471380421e+00 2.4300969414054152e+00 -3.5907876623168362e+00 -1.1283095391644515e+00 -2.5094241629546445e+00 -5.9570521599296908e+00 -1.3519103338894463e+00 -2.4255238985491592e+00 6.4381098123900902e+00 1.3210460490746572e+00 2.7676831973802405e+00 1.0239188764065059e+00 2.2438275694063043e+00 1.9512472452813256e+00 -1.1216157348496623e+00 -1.9987029351066141e+00 -1.7838574256599979e+00 -1.2467047271444858e+00 -3.4643901948962132e+00 -1.9203269734208743e+00 1.0236989212891840e+00 3.1896551826559358e+00 1.9576116302962367e+00 1.3987794933787268e+00 3.5509478204850602e+00 2.1872755762447662e+00 -1.0252461768814725e+00 -3.2890109815808319e+00 -2.0586354757705174e+00 -1.3738767012734532e+00 -6.0175846979182435e+00 -2.5012049260532816e+00 1.3210460490746576e+00 5.7852582369546033e+00 2.1678903490823433e+00 1.9512472452813248e+00 2.1739977013903018e+00 4.9350677979315742e+00 -2.3865860008510746e+00 -1.7467685248557043e+00 -4.9766571231722221e+00 -2.3654642994322201e+00 -2.1888322653843995e+00 -5.9486589195036093e+00 2.2451157534266977e+00 1.9074668008703450e+00 6.5671696267361011e+00 2.4643642135710619e+00 2.1877903124689659e+00 6.1664549386761731e+00 -2.2266746074693899e+00 -2.0169320708029819e+00 -6.8238319989705101e+00 -2.4496855019066404e+00 -2.4846123027688720e+00 -9.2039455502778686e+00 2.7676831973802405e+00 2.1678903490823433e+00 9.2844012285803643e+00 1020 1021 1022 1068 1069 1070 1080 1081 1082 1032 1033 1034 1023 1024 1025 1071 1072 1073 1083 1084 1085 1035 1036 1037 5.2820685898737247e+00 1.2057069162045742e+00 1.9560957094255180e+00 -5.5069815272654727e+00 -1.2651705390116212e+00 -2.2917073013987266e+00 -3.2029027751927712e+00 -1.1528781364656424e+00 -1.7434896019447879e+00 2.9235086888665269e+00 9.2731330371795351e-01 1.7731346416388694e+00 3.2229063815299637e+00 1.2950526885561660e+00 1.9946295105537397e+00 -2.9586004250312823e+00 -9.1555580025276428e-01 -1.8599644499523962e+00 -1.8082306685085865e+00 -1.0238107400312866e+00 -1.6048738258471860e+00 2.0482317357278972e+00 9.2934230728262157e-01 1.7761753175249699e+00 1.2057069162045739e+00 5.9480821293744270e+00 2.5684906804286793e+00 -1.2429657916551735e+00 -5.4513063699247502e+00 -2.2198947285711998e+00 -1.2933177371011662e+00 -3.5738359748695467e+00 -2.1255224486310875e+00 8.8149485262688843e-01 3.1681151926518076e+00 2.0263823553350075e+00 1.2777956025367800e+00 3.5896256029760822e+00 2.2429526824359782e+00 -1.0214861941700026e+00 -3.2613494123506626e+00 -2.3246990067598041e+00 -9.8357297920196851e-01 -2.4675658947953161e+00 -2.1729157277494435e+00 1.1763453307600673e+00 2.0482347269379586e+00 2.0052061935118712e+00 1.9560957094255180e+00 2.5684906804286798e+00 8.5221301032909604e+00 -2.2797951117290922e+00 -2.2492318522056571e+00 -8.4327926133443896e+00 -2.0175860535253616e+00 -2.1979006678157482e+00 -5.4627479059995734e+00 1.7307310923997159e+00 2.0779435464636395e+00 6.0757049506232086e+00 2.0007895606742716e+00 2.2769663645158156e+00 5.5968162148803602e+00 -1.8202042302581425e+00 -2.0324575567974748e+00 -6.2568494556752743e+00 -1.5752312437719564e+00 -2.2199863350451641e+00 -4.5652913645702551e+00 2.0052002767850454e+00 1.7761758204559104e+00 4.5230300707949649e+00 -5.5069815272654727e+00 -1.2429657916551733e+00 -2.2797951117290922e+00 5.9641214247095231e+00 1.1949781361203695e+00 2.6128938517533213e+00 3.5613831743576738e+00 1.2043421855456971e+00 2.1836849813399155e+00 -3.2268896838351635e+00 -9.5934237343655615e-01 -2.2742968340963614e+00 -3.6704053815767010e+00 -1.3956743599486607e+00 -2.2626028279925348e+00 3.2739432113542426e+00 9.9708437152158180e-01 2.1968135861914684e+00 2.0724634938738506e+00 1.2254118324931762e+00 2.0433395675851376e+00 -2.4676347116179547e+00 -1.0238340006404354e+00 -2.2200372130518549e+00 -1.2651705390116212e+00 -5.4513063699247502e+00 -2.2492318522056567e+00 1.1949781361203693e+00 5.1876980549208014e+00 1.8987375105728619e+00 1.2139487398014503e+00 3.1670088551771078e+00 1.9023871287341960e+00 -8.2049547174126147e-01 -2.9043037419183149e+00 -1.7398666300200269e+00 -1.2058242159263155e+00 -3.2241171513438918e+00 -1.7891042420806444e+00 9.6894004267079437e-01 2.9608438215355424e+00 1.8085003869316796e+00 8.9722150203091267e-01 2.0724686641256880e+00 1.7438538087122264e+00 -9.8359819394432768e-01 -1.8082921325721832e+00 -1.5752761106446365e+00 -2.2917073013987270e+00 -2.2198947285712003e+00 -8.4327926133443896e+00 2.6128938517533205e+00 1.8987375105728619e+00 8.4671501724062708e+00 2.1382937307092069e+00 1.8453374745569011e+00 5.4849936453388395e+00 -1.8926286288809346e+00 -1.6763842090632395e+00 -6.1403912566761241e+00 -2.3362872881750887e+00 -2.1462932842833649e+00 -5.5957259856095263e+00 2.1985591081600599e+00 1.8600701954084826e+00 6.2245097131041529e+00 1.7438494608378869e+00 2.0433474007943295e+00 4.5576900606749815e+00 -2.1729729330057230e+00 -1.6049203594147714e+00 -4.5654337358942074e+00 -3.2029027751927712e+00 -1.2933177371011659e+00 -2.0175860535253616e+00 3.5613831743576738e+00 1.2139487398014501e+00 2.1382937307092069e+00 5.8671150167009127e+00 1.4951075988212876e+00 2.2464699469825766e+00 -5.4557879019408730e+00 -1.1283751930257349e+00 -2.1278621395248662e+00 -2.4406824010610073e+00 -1.3535188281267647e+00 -1.9727848310360538e+00 2.0777554483436464e+00 1.0147175945149414e+00 2.0860861803074369e+00 3.1669849009506330e+00 1.2043255035698976e+00 1.8453043333921848e+00 -3.5738654621582118e+00 -1.1528876784539126e+00 -2.1979211673051253e+00 -1.1528781364656424e+00 -3.5738359748695467e+00 -2.1979006678157482e+00 1.2043421855456973e+00 3.1670088551771078e+00 1.8453374745569009e+00 1.4951075988212874e+00 5.8671148628677336e+00 2.2464697980749571e+00 -1.1283754793643159e+00 -5.4557879350454481e+00 -2.1278624282895913e+00 -1.3535191321677487e+00 -2.4406824179007103e+00 -1.9727850830098230e+00 1.0147175218909488e+00 2.0777553372346267e+00 2.0860861286365546e+00 1.2139333212747991e+00 3.5613593335199267e+00 2.1382617147541163e+00 -1.2933278795350258e+00 -3.2029320609836884e+00 -2.0176069369073675e+00 -1.7434896019447879e+00 -2.1255224486310875e+00 -5.4627479059995743e+00 2.1836849813399155e+00 1.9023871287341960e+00 5.4849936453388395e+00 2.2464699469825766e+00 2.2464697980749566e+00 7.7590387160161320e+00 -2.2220178120197076e+00 -2.2220175950733112e+00 -8.3247248380139052e+00 -1.9910388232458072e+00 -1.9910386310868566e+00 -3.9838561394165160e+00 1.7495712710075251e+00 1.7495710444612340e+00 4.5051660228258861e+00 1.9023588360005117e+00 2.1836558858240771e+00 5.4849308034543389e+00 -2.1255387981202269e+00 -1.7435051823032091e+00 -5.4628003042052047e+00 2.9235086888665274e+00 8.8149485262688843e-01 1.7307310923997159e+00 -3.2268896838351635e+00 -8.2049547174126147e-01 -1.8926286288809346e+00 -5.4557879019408730e+00 -1.1283754793643159e+00 -2.2220178120197076e+00 5.3029178434511977e+00 8.5204211956629350e-01 2.0012805097095314e+00 2.0276108455813118e+00 9.9270465220963100e-01 1.6953968683230709e+00 -1.8352178546420095e+00 -7.4536085778458239e-01 -1.7143652593072740e+00 -2.9042680347182959e+00 -9.5932989143653424e-01 -1.6763553432427845e+00 3.1681260972373031e+00 9.2732007592388166e-01 2.0779585730183832e+00 9.2731330371795351e-01 3.1681151926518076e+00 2.0779435464636395e+00 -9.5934237343655604e-01 -2.9043037419183149e+00 -1.6763842090632390e+00 -1.1283751930257349e+00 -5.4557879350454472e+00 -2.2220175950733108e+00 8.5204211956629317e-01 5.3029177652021851e+00 2.0012804280093430e+00 9.9270460275745231e-01 2.0276107897959021e+00 1.6953968044782903e+00 -7.4536065004121521e-01 -1.8352178755424235e+00 -1.7143650477591152e+00 -8.2048295661685544e-01 -3.2268540088879045e+00 -1.8925997952179510e+00 8.8150114707866178e-01 2.9235198137441953e+00 1.7307458681623449e+00 1.7731346416388691e+00 2.0263823553350080e+00 6.0757049506232104e+00 -2.2742968340963614e+00 -1.7398666300200269e+00 -6.1403912566761232e+00 -2.1278621395248658e+00 -2.1278624282895908e+00 -8.3247248380139052e+00 2.0012805097095310e+00 2.0012804280093430e+00 9.1648434687400275e+00 2.1342711574435822e+00 2.1342710815183752e+00 4.4939598574858248e+00 -1.7930884545457140e+00 -1.7930887396987862e+00 -5.2048385793883076e+00 -1.7398364668214021e+00 -2.2742666320423952e+00 -6.1402984426837346e+00 2.0263975861963592e+00 1.7731505651880737e+00 6.0757448399130087e+00 3.2229063815299637e+00 1.2777956025367800e+00 2.0007895606742716e+00 -3.6704053815767010e+00 -1.2058242159263157e+00 -2.3362872881750887e+00 -2.4406824010610073e+00 -1.3535191321677487e+00 -1.9910388232458072e+00 2.0276108455813118e+00 9.9270460275745231e-01 2.1342711574435822e+00 6.0158515045493193e+00 1.6781840091643909e+00 2.4743542630644058e+00 -5.5209303187604952e+00 -1.2887524003544977e+00 -2.4128236424421372e+00 -3.2240350502338213e+00 -1.3956540440262315e+00 -2.1462522892990710e+00 3.5896844199714293e+00 1.2950655780161702e+00 2.2769870619798454e+00 1.2950526885561660e+00 3.5896256029760822e+00 2.2769663645158156e+00 -1.3956743599486607e+00 -3.2241171513438913e+00 -2.1462932842833649e+00 -1.3535188281267647e+00 -2.4406824179007098e+00 -1.9910386310868566e+00 9.9270465220963089e-01 2.0276107897959021e+00 2.1342710815183752e+00 1.6781840091643909e+00 6.0158514663233946e+00 2.4743542033210741e+00 -1.2887521749087274e+00 -5.5209303272315431e+00 -2.4128234557586490e+00 -1.2058040144436801e+00 -3.6703233374811917e+00 -2.3362463313813415e+00 1.2778080274976442e+00 3.2229653748619569e+00 2.0008100531549489e+00 1.9946295105537397e+00 2.2429526824359787e+00 5.5968162148803602e+00 -2.2626028279925348e+00 -1.7891042420806444e+00 -5.5957259856095263e+00 -1.9727848310360536e+00 -1.9727850830098230e+00 -3.9838561394165151e+00 1.6953968683230705e+00 1.6953968044782903e+00 4.4939598574858248e+00 2.4743542630644049e+00 2.4743542033210737e+00 7.9941773106181024e+00 -2.3829019742937421e+00 -2.3829022227330836e+00 -8.5066786757758184e+00 -1.7890680970074770e+00 -2.2625666433078413e+00 -5.5955941103969016e+00 2.2429770883885904e+00 1.9946545008960510e+00 5.5969015282144765e+00 -2.9586004250312832e+00 -1.0214861941700029e+00 -1.8202042302581425e+00 3.2739432113542426e+00 9.6894004267079448e-01 2.1985591081600599e+00 2.0777554483436464e+00 1.0147175218909488e+00 1.7495712710075251e+00 -1.8352178546420093e+00 -7.4536065004121521e-01 -1.7930884545457140e+00 -5.5209303187604952e+00 -1.2887521749087272e+00 -2.3829019742937421e+00 5.2636903652194693e+00 9.9043834832640831e-01 2.2205087982227507e+00 2.9607784541220830e+00 9.9706898194469229e-01 1.8600357286898703e+00 -3.2614188806056528e+00 -9.1556587571289905e-01 -2.0324802469826082e+00 -9.1555580025276428e-01 -3.2613494123506621e+00 -2.0324575567974748e+00 9.9708437152158180e-01 2.9608438215355424e+00 1.8600701954084826e+00 1.0147175945149414e+00 2.0777553372346267e+00 1.7495710444612340e+00 -7.4536085778458239e-01 -1.8352178755424235e+00 -1.7930887396987862e+00 -1.2887524003544975e+00 -5.5209303272315431e+00 -2.3829022227330845e+00 9.9043834832640820e-01 5.2636902863967006e+00 2.2205086702778289e+00 9.6892551809757188e-01 3.2738779027509270e+00 2.1985258058543842e+00 -1.0214967740686594e+00 -2.9586697327931706e+00 -1.8202271967725863e+00 -1.8599644499523964e+00 -2.3246990067598041e+00 -6.2568494556752743e+00 2.1968135861914679e+00 1.8085003869316796e+00 6.2245097131041538e+00 2.0860861803074373e+00 2.0860861286365546e+00 4.5051660228258861e+00 -1.7143652593072740e+00 -1.7143650477591152e+00 -5.2048385793883076e+00 -2.4128236424421368e+00 -2.4128234557586485e+00 -8.5066786757758184e+00 2.2205087982227503e+00 2.2205086702778294e+00 9.2712677507298995e+00 1.8084661118831120e+00 2.1967784913969246e+00 6.2243805418111808e+00 -2.3247213249029595e+00 -1.8599861669654214e+00 -6.2569573176317208e+00 -1.8082306685085867e+00 -9.8357297920196829e-01 -1.5752312437719562e+00 2.0724634938738506e+00 8.9722150203091267e-01 1.7438494608378865e+00 3.1669849009506330e+00 1.2139333212747991e+00 1.9023588360005115e+00 -2.9042680347182959e+00 -8.2048295661685544e-01 -1.7398364668214026e+00 -3.2240350502338213e+00 -1.2058040144436801e+00 -1.7890680970074770e+00 2.9607784541220825e+00 9.6892551809757199e-01 1.8084661118831118e+00 5.1875961178962804e+00 1.1949460533871319e+00 1.8986766148960519e+00 -5.4512892133821431e+00 -1.2651664445279118e+00 -2.2492152160167276e+00 -1.0238107400312866e+00 -2.4675658947953165e+00 -2.2199863350451641e+00 1.2254118324931762e+00 2.0724686641256880e+00 2.0433474007943291e+00 1.2043255035698979e+00 3.5613593335199267e+00 2.1836558858240771e+00 -9.5932989143653424e-01 -3.2268540088879041e+00 -2.2742666320423952e+00 -1.3956540440262313e+00 -3.6703233374811917e+00 -2.2625666433078413e+00 9.9706898194469218e-01 3.2738779027509270e+00 2.1967784913969250e+00 1.1949460533871319e+00 5.9640094638665957e+00 2.6128208401564565e+00 -1.2429576959008455e+00 -5.5069721230987252e+00 -2.2797830077763885e+00 -1.6048738258471862e+00 -2.1729157277494435e+00 -4.5652913645702551e+00 2.0433395675851376e+00 1.7438538087122264e+00 4.5576900606749815e+00 1.8453043333921846e+00 2.1382617147541163e+00 5.4849308034543380e+00 -1.6763553432427845e+00 -1.8925997952179510e+00 -6.1402984426837328e+00 -2.1462522892990705e+00 -2.3362463313813415e+00 -5.5955941103969025e+00 1.8600357286898703e+00 2.1985258058543842e+00 6.2243805418111808e+00 1.8986766148960523e+00 2.6128208401564570e+00 8.4669373804303660e+00 -2.2198747861742021e+00 -2.2917003151284487e+00 -8.4327548687199769e+00 2.0482317357278972e+00 1.1763453307600673e+00 2.0052002767850459e+00 -2.4676347116179542e+00 -9.8359819394432779e-01 -2.1729729330057230e+00 -3.5738654621582118e+00 -1.2933278795350256e+00 -2.1255387981202269e+00 3.1681260972373031e+00 8.8150114707866167e-01 2.0263975861963592e+00 3.5896844199714288e+00 1.2778080274976444e+00 2.2429770883885909e+00 -3.2614188806056528e+00 -1.0214967740686594e+00 -2.3247213249029595e+00 -5.4512892133821431e+00 -1.2429576959008455e+00 -2.2198747861742012e+00 5.9481660148273310e+00 1.2057260381124850e+00 2.5685328908331160e+00 9.2934230728262157e-01 2.0482347269379586e+00 1.7761758204559104e+00 -1.0238340006404354e+00 -1.8082921325721832e+00 -1.6049203594147714e+00 -1.1528876784539124e+00 -3.2029320609836884e+00 -1.7435051823032088e+00 9.2732007592388166e-01 2.9235198137441953e+00 1.7731505651880735e+00 1.2950655780161702e+00 3.2229653748619569e+00 1.9946545008960510e+00 -9.1556587571289882e-01 -2.9586697327931701e+00 -1.8599861669654214e+00 -1.2651664445279120e+00 -5.5069721230987261e+00 -2.2917003151284483e+00 1.2057260381124852e+00 5.2821461339036571e+00 1.9561311372718160e+00 1.7761753175249699e+00 2.0052061935118712e+00 4.5230300707949649e+00 -2.2200372130518549e+00 -1.5752761106446365e+00 -4.5654337358942074e+00 -2.1979211673051258e+00 -2.0176069369073675e+00 -5.4628003042052047e+00 2.0779585730183827e+00 1.7307458681623447e+00 6.0757448399130087e+00 2.2769870619798454e+00 2.0008100531549489e+00 5.5969015282144765e+00 -2.0324802469826082e+00 -1.8202271967725865e+00 -6.2569573176317199e+00 -2.2492152160167276e+00 -2.2797830077763885e+00 -8.4327548687199769e+00 2.5685328908331155e+00 1.9561311372718158e+00 8.5222697875286642e+00 951 952 953 999 1000 1001 1011 1012 1013 963 964 965 954 955 956 1002 1003 1004 1014 1015 1016 966 967 968 5.8760176911810325e+00 2.9316247148734004e-01 1.8446405385026121e+00 -5.9903933853617097e+00 -2.5737291362102821e-01 -2.2750684309935569e+00 -3.2952490036429998e+00 -3.1063430293942978e-01 -1.8109977962060857e+00 3.0824309561832401e+00 1.6741149151475590e-01 1.6429954350802800e+00 3.2329941137323326e+00 3.3265364871156555e-01 2.0360606225964246e+00 -3.0485496733592421e+00 -1.1717331059266513e-01 -1.6364093651611571e+00 -1.7186308395758720e+00 -2.5448195091719228e-01 -1.5276247520465267e+00 1.8613801408432216e+00 1.4643486635665487e-01 1.7264037482280099e+00 2.9316247148734004e-01 5.6247183433969488e+00 1.2187035291052184e+00 -2.4198668070700147e-01 -5.3772184782477499e+00 -7.1312795354717617e-01 -3.6535844292800640e-01 -2.9001292844952089e+00 -1.1030879545612180e+00 1.5428393250822145e-01 2.7223330470000535e+00 6.4965121658338620e-01 3.2834331898822239e-01 2.8285179422949760e+00 1.0878637776639095e+00 -2.0571266408951205e-01 -2.7112902190251114e+00 -8.7936256534602553e-01 -2.5301881004213189e-01 -1.5342219493824301e+00 -1.0661241413520934e+00 2.9028687478286791e-01 1.3472905984585211e+00 8.0548409145399869e-01 1.8446405385026119e+00 1.2187035291052186e+00 1.3056252717259966e+01 -2.2443922875293438e+00 -7.5395557381771772e-01 -1.2780086169109570e+01 -2.1774387371002426e+00 -1.1233284537061830e+00 -9.2589170007330122e+00 1.6399698355286112e+00 7.0200369498457760e-01 9.5569622897813371e+00 2.0129358744174635e+00 1.0880557417761005e+00 9.2873118534841410e+00 -1.6319172074139754e+00 -5.0378231077187907e-01 -9.6539325109364071e+00 -1.5300306444198466e+00 -1.0739117398982558e+00 -7.8262171163895502e+00 2.0862326280147219e+00 4.4621511232814259e-01 7.6186259366430926e+00 -5.9903933853617097e+00 -2.4198668070700147e-01 -2.2443922875293438e+00 6.3331950117258016e+00 9.7036714450732489e-02 2.6530328995706158e+00 3.5708026227030474e+00 2.3060363067636702e-01 2.3576977650031528e+00 -3.2986404138833292e+00 -6.6224752719877267e-02 -2.2199572262454303e+00 -3.5719569102159805e+00 -3.1304976753400099e-01 -2.4176673736538077e+00 3.2558011425463262e+00 7.6587808320410400e-02 2.0539651065552489e+00 1.8978330310229374e+00 2.9414466309630422e-01 2.1021684345546783e+00 -2.1966410985370928e+00 -7.7111615582935916e-02 -2.2848473182551130e+00 -2.5737291362102821e-01 -5.3772184782477490e+00 -7.5395557381771772e-01 9.7036714450732503e-02 5.3748280681606362e+00 2.6986881242936633e-01 2.4417020226468375e-01 2.7370458349667266e+00 6.6826511405668543e-01 -5.3379080434626781e-02 -2.7162507530432416e+00 -1.9966957628299531e-01 -1.7561092796259206e-01 -2.7086598931320078e+00 -4.6749242516334999e-01 7.3817709251131097e-02 2.6749439849783068e+00 2.4155512397518361e-01 1.4386123322486802e-01 1.3779754830877518e+00 4.3624438116180025e-01 -7.2522937173168239e-02 -1.3626642467704224e+00 -1.9481585635897242e-01 -2.2750684309935574e+00 -7.1312795354717617e-01 -1.2780086169109570e+01 2.6530328995706154e+00 2.6986881242936633e-01 1.2631009183461421e+01 2.3484456504528528e+00 6.2669444334607016e-01 9.1074824059670298e+00 -1.8373001079749933e+00 -1.9714973957319928e-01 -9.4342778303477104e+00 -2.4219731871078425e+00 -8.4168003074532183e-01 -9.1356080654861085e+00 2.0681359649544953e+00 2.5231665671882386e-01 9.4668681278174258e+00 1.7291135653045424e+00 8.0845549555250618e-01 7.6579663828581648e+00 -2.2643863542061129e+00 -2.0537768418107311e-01 -7.5133540351606491e+00 -3.2952490036430002e+00 -3.6535844292800634e-01 -2.1774387371002426e+00 3.5708026227030469e+00 2.4417020226468378e-01 2.3484456504528528e+00 6.4495892387576585e+00 4.3113937672145142e-01 2.6081633483711926e+00 -6.1136161334168913e+00 -2.0363554081628105e-01 -2.2324745214192694e+00 -2.1939375997100030e+00 -3.8129742128453548e-01 -2.2422607878379051e+00 1.8971190823697719e+00 1.2594406761002155e-01 2.1074310557672571e+00 3.3117940381359352e+00 3.2818235272182966e-01 2.0040468237940039e+00 -3.6265022451965172e+00 -1.7914459428916482e-01 -2.4159128320278889e+00 -3.1063430293942978e-01 -2.9001292844952089e+00 -1.1233284537061827e+00 2.3060363067636702e-01 2.7370458349667266e+00 6.2669444334607027e-01 4.3113937672145131e-01 5.6851207901521672e+00 1.1696382411623638e+00 -1.9294867315710473e-01 -5.5047731298760736e+00 -7.2468499472722914e-01 -3.8241403146908881e-01 -1.5324481577001112e+00 -1.0276096819789864e+00 2.0201287677099980e-01 1.3796660697024876e+00 8.3171717141764989e-01 3.3272689359899094e-01 2.9086343339656429e+00 1.0867469478433240e+00 -3.1048577020218582e-01 -2.7731164567156319e+00 -8.3917367335700921e-01 -1.8109977962060857e+00 -1.1030879545612178e+00 -9.2589170007330139e+00 2.3576977650031528e+00 6.6826511405668543e-01 9.1074824059670298e+00 2.6081633483711926e+00 1.1696382411623636e+00 1.2597604960680210e+01 -2.2863398207045718e+00 -7.7783648475967726e-01 -1.2915119361383006e+01 -2.2375984303952436e+00 -1.0224836949888010e+00 -7.3551815767032700e+00 1.7298375973459272e+00 4.5598924643833061e-01 7.6534862619749049e+00 2.0386181947961592e+00 1.0892879815432848e+00 9.3603342996427763e+00 -2.3993808582105309e+00 -4.7977244889097137e-01 -9.1896899894456254e+00 3.0824309561832401e+00 1.5428393250822145e-01 1.6399698355286112e+00 -3.2986404138833287e+00 -5.3379080434626795e-02 -1.8373001079749933e+00 -6.1136161334168921e+00 -1.9294867315710473e-01 -2.2863398207045722e+00 6.0055331421069065e+00 7.0745322630069260e-02 1.8690912012390626e+00 1.8616378743941202e+00 2.0003527387179987e-01 1.7194175969520815e+00 -1.7208514188252442e+00 -5.0380010528723249e-02 -1.5483857775140366e+00 -3.1099219293790172e+00 -2.0494258977756705e-01 -1.6228525582743356e+00 3.2934279228202152e+00 7.6585824887932169e-02 2.0663996307481822e+00 1.6741149151475590e-01 2.7223330470000535e+00 7.0200369498457760e-01 -6.6224752719877281e-02 -2.7162507530432416e+00 -1.9714973957319928e-01 -2.0363554081628105e-01 -5.5047731298760736e+00 -7.7783648475967726e-01 7.0745322630069274e-02 5.5695789473291786e+00 2.8892559605410251e-01 1.2225863193366085e-01 1.3455212378815011e+00 4.4465331371072325e-01 -4.8144650513481380e-02 -1.3637812664633395e+00 -2.0873596059691127e-01 -1.1426654995456915e-01 -2.7741331538476510e+00 -4.9478820137447732e-01 7.1856047925722782e-02 2.7215050710195712e+00 2.4292778155486172e-01 1.6429954350802800e+00 6.4965121658338609e-01 9.5569622897813389e+00 -2.2199572262454308e+00 -1.9966957628299531e-01 -9.4342778303477104e+00 -2.2324745214192698e+00 -7.2468499472722891e-01 -1.2915119361383008e+01 1.8690912012390624e+00 2.8892559605410251e-01 1.3375566200093923e+01 2.1078210805308522e+00 8.3137449502614058e-01 7.6144575938800889e+00 -1.5590045284397511e+00 -2.1973961634771605e-01 -7.9907405294904770e+00 -1.6306929219813260e+00 -8.7953825593746915e-01 -9.7096893956484784e+00 2.0222214812355825e+00 2.5368113563178440e-01 9.5028410331143292e+00 3.2329941137323326e+00 3.2834331898822239e-01 2.0129358744174630e+00 -3.5719569102159796e+00 -1.7561092796259203e-01 -2.4219731871078429e+00 -2.1939375997100030e+00 -3.8241403146908881e-01 -2.2375984303952436e+00 1.8616378743941207e+00 1.2225863193366085e-01 2.1078210805308522e+00 6.3681910994086710e+00 4.4243586595536294e-01 2.6734257208876300e+00 -5.9608123357109859e+00 -2.0621745006390715e-01 -2.3098980140974295e+00 -3.2882758209136052e+00 -3.7709812371159279e-01 -2.2359520582253087e+00 3.5521595790154485e+00 2.4830271632993600e-01 2.4112390139898801e+00 3.3265364871156555e-01 2.8285179422949760e+00 1.0880557417761003e+00 -3.1304976753400093e-01 -2.7086598931320083e+00 -8.4168003074532183e-01 -3.8129742128453548e-01 -1.5324481577001114e+00 -1.0224836949888010e+00 2.0003527387179987e-01 1.3455212378815011e+00 8.3137449502614058e-01 4.4243586595536299e-01 5.5832483517739062e+00 1.1988914796075234e+00 -2.0490072039564008e-01 -5.3368330383507177e+00 -7.7066103585222001e-01 -3.1691247816539403e-01 -2.8829588981475842e+00 -1.1463927343753941e+00 2.4103559884084197e-01 2.7036124553800391e+00 6.6289577955197199e-01 2.0360606225964246e+00 1.0878637776639095e+00 9.2873118534841410e+00 -2.4176673736538072e+00 -4.6749242516334999e-01 -9.1356080654861085e+00 -2.2422607878379051e+00 -1.0276096819789864e+00 -7.3551815767032700e+00 1.7194175969520815e+00 4.4465331371072331e-01 7.6144575938800889e+00 2.6734257208876295e+00 1.1988914796075236e+00 1.2657852651303774e+01 -2.3157440373725646e+00 -7.7694210370802341e-01 -1.2896334690964133e+01 -1.8570357589663482e+00 -1.1376293949170531e+00 -9.4054180690569122e+00 2.4038040173944903e+00 6.7826503478526057e-01 9.2329203035424197e+00 -3.0485496733592421e+00 -2.0571266408951205e-01 -1.6319172074139752e+00 3.2558011425463262e+00 7.3817709251131097e-02 2.0681359649544953e+00 1.8971190823697719e+00 2.0201287677099980e-01 1.7298375973459270e+00 -1.7208514188252440e+00 -4.8144650513481380e-02 -1.5590045284397511e+00 -5.9608123357109859e+00 -2.0490072039564008e-01 -2.3157440373725646e+00 5.7777583259810363e+00 7.5109181526437377e-02 1.9111608475371316e+00 3.0884201913853291e+00 1.6712803615647201e-01 1.6891468784804973e+00 -3.2888853143869916e+00 -5.9309768706407709e-02 -1.8916155150917604e+00 -1.1717331059266513e-01 -2.7112902190251114e+00 -5.0378231077187896e-01 7.6587808320410414e-02 2.6749439849783068e+00 2.5231665671882386e-01 1.2594406761002158e-01 1.3796660697024874e+00 4.5598924643833061e-01 -5.0380010528723249e-02 -1.3637812664633393e+00 -2.1973961634771605e-01 -2.0621745006390715e-01 -5.3368330383507177e+00 -7.7694210370802363e-01 7.5109181526437363e-02 5.3303809680245289e+00 3.0556729170087849e-01 1.6796582649055927e-01 2.7202077362831760e+00 7.0486180236603890e-01 -7.1836112762133059e-02 -2.6932942351493310e+00 -2.1827096639645310e-01 -1.6364093651611571e+00 -8.7936256534602542e-01 -9.6539325109364054e+00 2.0539651065552489e+00 2.4155512397518364e-01 9.4668681278174240e+00 2.1074310557672571e+00 8.3171717141764989e-01 7.6534862619749049e+00 -1.5483857775140366e+00 -2.0873596059691130e-01 -7.9907405294904770e+00 -2.3098980140974295e+00 -7.7066103585222001e-01 -1.2896334690964135e+01 1.9111608475371316e+00 3.0556729170087843e-01 1.3272173446573790e+01 1.6849080685111302e+00 6.9783689477000732e-01 9.7305324992502822e+00 -2.2627719215981439e+00 -2.1791692006856656e-01 -9.5820526042253853e+00 -1.7186308395758720e+00 -2.5301881004213189e-01 -1.5300306444198466e+00 1.8978330310229374e+00 1.4386123322486802e-01 1.7291135653045424e+00 3.3117940381359352e+00 3.3272689359899094e-01 2.0386181947961592e+00 -3.1099219293790172e+00 -1.1426654995456915e-01 -1.6306929219813258e+00 -3.2882758209136047e+00 -3.1691247816539403e-01 -1.8570357589663480e+00 3.0884201913853291e+00 1.6796582649055927e-01 1.6849080685111302e+00 5.9018719351807185e+00 3.0009954137105654e-01 1.8807945276513667e+00 -6.0830906058564249e+00 -2.6045565652338076e-01 -2.3156750308956777e+00 -2.5448195091719228e-01 -1.5342219493824301e+00 -1.0739117398982558e+00 2.9414466309630427e-01 1.3779754830877518e+00 8.0845549555250629e-01 3.2818235272182961e-01 2.9086343339656429e+00 1.0892879815432845e+00 -2.0494258977756705e-01 -2.7741331538476506e+00 -8.7953825593746915e-01 -3.7709812371159279e-01 -2.8829588981475842e+00 -1.1376293949170533e+00 1.6712803615647198e-01 2.7202077362831765e+00 6.9783689477000732e-01 3.0009954137105654e-01 5.6477457233994031e+00 1.2482271245434948e+00 -2.5303192893931037e-01 -5.4632492753583080e+00 -7.5272810565651493e-01 -1.5276247520465267e+00 -1.0661241413520937e+00 -7.8262171163895493e+00 2.1021684345546787e+00 4.3624438116180025e-01 7.6579663828581648e+00 2.0040468237940039e+00 1.0867469478433243e+00 9.3603342996427745e+00 -1.6228525582743358e+00 -4.9478820137447732e-01 -9.7096893956484802e+00 -2.2359520582253087e+00 -1.1463927343753939e+00 -9.4054180690569140e+00 1.6891468784804975e+00 7.0486180236603890e-01 9.7305324992502804e+00 1.8807945276513667e+00 1.2482271245434948e+00 1.3229512526360633e+01 -2.2897272959343753e+00 -7.6877517881269741e-01 -1.3037021127016914e+01 1.8613801408432216e+00 2.9028687478286791e-01 2.0862326280147214e+00 -2.1966410985370923e+00 -7.2522937173168239e-02 -2.2643863542061133e+00 -3.6265022451965172e+00 -3.1048577020218582e-01 -2.3993808582105314e+00 3.2934279228202148e+00 7.1856047925722782e-02 2.0222214812355825e+00 3.5521595790154481e+00 2.4103559884084197e-01 2.4038040173944903e+00 -3.2888853143869916e+00 -7.1836112762133073e-02 -2.2627719215981439e+00 -6.0830906058564240e+00 -2.5303192893931031e-01 -2.2897272959343753e+00 6.4881516212981403e+00 1.0469822752736610e-01 2.7040083033043691e+00 1.4643486635665487e-01 1.3472905984585211e+00 4.4621511232814259e-01 -7.7111615582935916e-02 -1.3626642467704224e+00 -2.0537768418107305e-01 -1.7914459428916485e-01 -2.7731164567156319e+00 -4.7977244889097137e-01 7.6585824887932169e-02 2.7215050710195712e+00 2.5368113563178440e-01 2.4830271632993603e-01 2.7036124553800391e+00 6.7826503478526057e-01 -5.9309768706407709e-02 -2.6932942351493310e+00 -2.1791692006856653e-01 -2.6045565652338071e-01 -5.4632492753583071e+00 -7.6877517881269730e-01 1.0469822752736613e-01 5.5199160891355605e+00 2.9368094920812088e-01 1.7264037482280097e+00 8.0548409145399869e-01 7.6186259366430917e+00 -2.2848473182551139e+00 -1.9481585635897242e-01 -7.5133540351606491e+00 -2.4159128320278893e+00 -8.3917367335700921e-01 -9.1896899894456254e+00 2.0663996307481822e+00 2.4292778155486172e-01 9.5028410331143292e+00 2.4112390139898801e+00 6.6289577955197221e-01 9.2329203035424179e+00 -1.8916155150917604e+00 -2.1827096639645305e-01 -9.5820526042253853e+00 -2.3156750308956777e+00 -7.5272810565651493e-01 -1.3037021127016915e+01 2.7040083033043691e+00 2.9368094920812082e-01 1.2967730482548735e+01 999 1000 1001 1047 1048 1049 1059 1060 1061 1011 1012 1013 1002 1003 1004 1050 1051 1052 1062 1063 1064 1014 1015 1016 5.5655446601855525e+00 2.7881278331895537e-01 1.7036513144321010e+00 -5.6710533833740664e+00 -2.4689159005317302e-01 -2.1445553302713591e+00 -3.0618191578418954e+00 -2.9797616370056196e-01 -1.6808030036973023e+00 2.8488569893159434e+00 1.5347202930612763e-01 1.5121188896683575e+00 3.0774404477826480e+00 3.2269900575619281e-01 1.9188339752172421e+00 -2.8986460644068011e+00 -1.0563336669873763e-01 -1.5101765031358798e+00 -1.5962433111899066e+00 -2.4090808248546647e-01 -1.4045078242082343e+00 1.7359198195285244e+00 1.3642538455666284e-01 1.6054384819950756e+00 2.7881278331895532e-01 5.3558998176997781e+00 1.1815825228283665e+00 -2.3003367302455949e-01 -5.0943071111548210e+00 -6.6769541527284737e-01 -3.5705200172829160e-01 -2.7065119212334552e+00 -1.0688445292717714e+00 1.4122567520016241e-01 2.5208005807149645e+00 6.1010870993592436e-01 3.1679653927913809e-01 2.7130142659520100e+00 1.0535082205096822e+00 -1.9251586853615277e-01 -2.5927075538498654e+00 -8.4196589451637083e-01 -2.3975753611452394e-01 -1.4489177947278555e+00 -1.0349904215442838e+00 2.8252408160527198e-01 1.2527297165992439e+00 7.6829680733130079e-01 1.7036513144321006e+00 1.1815825228283665e+00 1.2334437249729755e+01 -2.1009825816638603e+00 -7.0911018765836531e-01 -1.2050752439460039e+01 -2.0532252756040088e+00 -1.0843150419044190e+00 -8.6313123392108064e+00 1.5036147689535699e+00 6.5774062338646100e-01 8.9401569236457004e+00 1.8803341209328615e+00 1.0503525557760656e+00 8.7572459296671976e+00 -1.5032130498486358e+00 -4.6319949794846726e-01 -9.1361431648310560e+00 -1.4003914594099935e+00 -1.0369486127020671e+00 -7.3414449491948890e+00 1.9702121622079654e+00 4.0389763822242375e-01 7.1278127896541372e+00 -5.6710533833740664e+00 -2.3003367302455952e-01 -2.1009825816638599e+00 6.0251664311953137e+00 7.9098641952060456e-02 2.5183948291321165e+00 3.3422810757900892e+00 2.1882313435580208e-01 2.2278700979665076e+00 -3.0645646036664300e+00 -5.1617197147617339e-02 -2.0926966157503526e+00 -3.4226319017626938e+00 -3.0166146019443985e-01 -2.2934396562837160e+00 3.1013268637243740e+00 6.2623565300236467e-02 1.9242065635641055e+00 1.7694746268845061e+00 2.8499868511865611e-01 1.9808960407717113e+00 -2.0799991087910921e+00 -6.2231696360137874e-02 -2.1642486777365124e+00 -2.4689159005317302e-01 -5.0943071111548210e+00 -7.0911018765836520e-01 7.9098641952060442e-02 5.1016007229381897e+00 2.1850974111418345e-01 2.3126106340569452e-01 2.5353802384686288e+00 6.2396124871170022e-01 -3.8525967462227390e-02 -2.5220512987541768e+00 -1.4767200052289534e-01 -1.6201595357074217e-01 -2.5865065067157733e+00 -4.2521322627827912e-01 5.9945622210641952e-02 2.5575655239113670e+00 1.9417484880648372e-01 1.3328356581258682e-01 1.2833092566585325e+00 3.9298229931207951e-01 -5.6155382294841245e-02 -1.2749908253519475e+00 -1.4763272348490752e-01 -2.1445553302713583e+00 -6.6769541527284748e-01 -1.2050752439460039e+01 2.5183948291321161e+00 2.1850974111418336e-01 1.1906104413934722e+01 2.2253453911866568e+00 5.8781063568999337e-01 8.4795701499980272e+00 -1.7046637457815395e+00 -1.5180783952679994e-01 -8.8198345517985448e+00 -2.3004475668169051e+00 -7.9989064191652626e-01 -8.6045024343732646e+00 1.9529281881234268e+00 2.0656670277085717e-01 8.9446927355558490e+00 1.6039869871092980e+00 7.6940113041306979e-01 7.1700313593589797e+00 -2.1509887526816933e+00 -1.6289431327192824e-01 -7.0253092332157347e+00 -3.0618191578418954e+00 -3.5705200172829160e-01 -2.0532252756040088e+00 3.3422810757900892e+00 2.3126106340569455e-01 2.2253453911866568e+00 5.9120043179603678e+00 4.2077331556708653e-01 2.4547984263219904e+00 -5.5631946434076056e+00 -1.8475336111473090e-01 -2.0855682805951350e+00 -2.0755152973875730e+00 -3.7392744729484562e-01 -2.1254302819906687e+00 1.7720860102816143e+00 1.1139034153328252e-01 1.9927482157536567e+00 3.0364701767804090e+00 3.1683910596539655e-01 1.8777922243529801e+00 -3.3623124821754042e+00 -1.6453101633359141e-01 -2.2864604194254712e+00 -2.9797616370056196e-01 -2.7065119212334552e+00 -1.0843150419044190e+00 2.1882313435580211e-01 2.5353802384686288e+00 5.8781063568999325e-01 4.2077331556708653e-01 5.1872963035349891e+00 1.1220722721968208e+00 -1.7577160764466940e-01 -4.9961320533623415e+00 -6.8033555225432241e-01 -3.7415665834933809e-01 -1.4456403909792099e+00 -9.9115940623039667e-01 1.8869909571161622e-01 1.2854439475354968e+00 7.9712194852743645e-01 3.2018804773913107e-01 2.6759048376601173e+00 1.0485425009781411e+00 -3.0057916367906640e-01 -2.5357409616242244e+00 -7.9973735700325399e-01 -1.6808030036973021e+00 -1.0688445292717714e+00 -8.6313123392108064e+00 2.2278700979665076e+00 6.2396124871170022e-01 8.4795701499980272e+00 2.4547984263219904e+00 1.1220722721968206e+00 1.1570594221860350e+01 -2.1226371284591172e+00 -7.2232496957441161e-01 -1.1893856151728441e+01 -2.1151232089617897e+00 -9.8578305683049605e-01 -6.8584281688130107e+00 1.6093759331321333e+00 4.1583808368530395e-01 7.1620612381456361e+00 1.8975157794318063e+00 1.0478187073457095e+00 8.6797014876492771e+00 -2.2709968957342275e+00 -4.3273775626285321e-01 -8.5083304379010318e+00 2.8488569893159434e+00 1.4122567520016238e-01 1.5036147689535702e+00 -3.0645646036664300e+00 -3.8525967462227410e-02 -1.7046637457815395e+00 -5.5631946434076056e+00 -1.7577160764466940e-01 -2.1226371284591172e+00 5.4648138154671804e+00 5.5742404846833710e-02 1.7067481288838493e+00 1.7330595951886403e+00 1.8509425381007366e-01 1.5944929784468045e+00 -1.6000042868689524e+00 -3.8473681084605284e-02 -1.4214738337300705e+00 -2.8398820405196950e+00 -1.9088863950066026e-01 -1.4834818784850534e+00 3.0209151744909186e+00 6.1597561835092185e-02 1.9274007101715576e+00 1.5347202930612763e-01 2.5208005807149645e+00 6.5774062338646100e-01 -5.1617197147617332e-02 -2.5220512987541772e+00 -1.5180783952679994e-01 -1.8475336111473084e-01 -4.9961320533623423e+00 -7.2232496957441172e-01 5.5742404846833696e-02 5.0737533065823044e+00 2.3136992899345943e-01 1.0664890218086369e-01 1.2505989571976097e+00 4.0258847806762493e-01 -3.6733065393122301e-02 -1.2774717305278505e+00 -1.6398815009131004e-01 -9.9975801811651194e-02 -2.5387977251833593e+00 -4.4657098847703869e-01 5.7216089133296649e-02 2.4892999633328499e+00 1.9299291722201517e-01 1.5121188896683575e+00 6.1010870993592436e-01 8.9401569236457004e+00 -2.0926966157503526e+00 -1.4767200052289528e-01 -8.8198345517985448e+00 -2.0855682805951354e+00 -6.8033555225432252e-01 -1.1893856151728441e+01 1.7067481288838493e+00 2.3136992899345948e-01 1.2374373143177799e+01 1.9872936255153042e+00 7.9352003788737524e-01 7.1260538933289457e+00 -1.4359771317631043e+00 -1.7335299268167179e-01 -7.5156531034838698e+00 -1.4892510199904236e+00 -8.3911655293065768e-01 -9.0445952230418598e+00 1.8973324040315045e+00 2.0547842157278623e-01 8.8333550699002767e+00 3.0774404477826480e+00 3.1679653927913803e-01 1.8803341209328615e+00 -3.4226319017626938e+00 -1.6201595357074214e-01 -2.3004475668169055e+00 -2.0755152973875730e+00 -3.7415665834933809e-01 -2.1151232089617897e+00 1.7330595951886405e+00 1.0664890218086369e-01 1.9872936255153044e+00 6.1499551990904147e+00 4.3334092180305134e-01 2.5410615742418456e+00 -5.7336567687615183e+00 -1.9179815859546107e-01 -2.1696653803725283e+00 -3.0934554450328915e+00 -3.6545411800158123e-01 -2.1054875152802186e+00 3.3648041708829752e+00 2.3663852525406875e-01 2.2820343507414322e+00 3.2269900575619281e-01 2.7130142659520100e+00 1.0503525557760656e+00 -3.0166146019443985e-01 -2.5865065067157733e+00 -7.9989064191652637e-01 -3.7392744729484562e-01 -1.4456403909792104e+00 -9.8578305683049605e-01 1.8509425381007366e-01 1.2505989571976097e+00 7.9352003788737524e-01 4.3334092180305134e-01 5.4009388761374586e+00 1.1586082233485648e+00 -1.8864721672429707e-01 -5.1449203003512460e+00 -7.2196996970011107e-01 -3.0463516429481946e-01 -2.7303933782651697e+00 -1.1113437320131310e+00 2.2773710713908404e-01 2.5429084770243207e+00 6.1650658344825959e-01 1.9188339752172421e+00 1.0535082205096822e+00 8.7572459296671976e+00 -2.2934396562837160e+00 -4.2521322627827907e-01 -8.6045024343732646e+00 -2.1254302819906687e+00 -9.9115940623039667e-01 -6.8584281688130107e+00 1.5944929784468047e+00 4.0258847806762488e-01 7.1260538933289448e+00 2.5410615742418461e+00 1.1586082233485648e+00 1.2029483954662572e+01 -2.1926420239370015e+00 -7.3997895780152378e-01 -1.2273377234742624e+01 -1.7237559808029408e+00 -1.0959667461949512e+00 -8.8237715010665951e+00 2.2808794151084348e+00 6.3761341457927712e-01 8.6472955613367812e+00 -2.8986460644068006e+00 -1.9251586853615277e-01 -1.5032130498486358e+00 3.1013268637243749e+00 5.9945622210641945e-02 1.9529281881234271e+00 1.7720860102816143e+00 1.8869909571161625e-01 1.6093759331321333e+00 -1.6000042868689524e+00 -3.6733065393122301e-02 -1.4359771317631043e+00 -5.7336567687615183e+00 -1.8864721672429705e-01 -2.1926420239370015e+00 5.5610445142832443e+00 6.2262138700520886e-02 1.7760853008605983e+00 2.8983908558860794e+00 1.5381173256085065e-01 1.5580989406560799e+00 -3.1005411241380409e+00 -4.6822438530057200e-02 -1.7646561572234971e+00 -1.0563336669873762e-01 -2.5927075538498654e+00 -4.6319949794846726e-01 6.2623565300236481e-02 2.5575655239113670e+00 2.0656670277085715e-01 1.1139034153328252e-01 1.2854439475354971e+00 4.1583808368530395e-01 -3.8473681084605284e-02 -1.2774717305278505e+00 -1.7335299268167179e-01 -1.9179815859546107e-01 -5.1449203003512460e+00 -7.3997895780152378e-01 6.2262138700520886e-02 5.1507966486096803e+00 2.5558707994095403e-01 1.5538082127078318e-01 2.5626871990200604e+00 6.6608875118963662e-01 -5.5751660426019110e-02 -2.5413937343476429e+00 -1.6754916915508905e-01 -1.5101765031358796e+00 -8.4196589451637083e-01 -9.1361431648310543e+00 1.9242065635641055e+00 1.9417484880648367e-01 8.9446927355558490e+00 1.9927482157536567e+00 7.9712194852743656e-01 7.1620612381456343e+00 -1.4214738337300705e+00 -1.6398815009131004e-01 -7.5156531034838707e+00 -2.1696653803725283e+00 -7.2196996970011140e-01 -1.2273377234742624e+01 1.7760853008605979e+00 2.5558707994095398e-01 1.2668078128741849e+01 1.5487977585090489e+00 6.5387805904889440e-01 9.1593040415570321e+00 -2.1405221214489298e+00 -1.7283792201597450e-01 -9.0089626409428156e+00 -1.5962433111899066e+00 -2.3975753611452394e-01 -1.4003914594099935e+00 1.7694746268845061e+00 1.3328356581258685e-01 1.6039869871092982e+00 3.0364701767804090e+00 3.2018804773913107e-01 1.8975157794318063e+00 -2.8398820405196954e+00 -9.9975801811651194e-02 -1.4892510199904236e+00 -3.0934554450328915e+00 -3.0463516429481946e-01 -1.7237559808029408e+00 2.8983908558860794e+00 1.5538082127078318e-01 1.5487977585090489e+00 5.4370429547976613e+00 2.8257320480791570e-01 1.7201666316754038e+00 -5.6117978176061634e+00 -2.4705713740942181e-01 -2.1570686965221997e+00 -2.4090808248546647e-01 -1.4489177947278555e+00 -1.0369486127020671e+00 2.8499868511865611e-01 1.2833092566585325e+00 7.6940113041306979e-01 3.1683910596539655e-01 2.6759048376601173e+00 1.0478187073457095e+00 -1.9088863950066026e-01 -2.5387977251833598e+00 -8.3911655293065768e-01 -3.6545411800158123e-01 -2.7303933782651697e+00 -1.0959667461949512e+00 1.5381173256085065e-01 2.5626871990200604e+00 6.5387805904889418e-01 2.8257320480791576e-01 5.2291723572937432e+00 1.2025032129080457e+00 -2.4097188846511103e-01 -5.0329647524560679e+00 -7.0156919788804362e-01 -1.4045078242082343e+00 -1.0349904215442838e+00 -7.3414449491948890e+00 1.9808960407717113e+00 3.9298229931207951e-01 7.1700313593589797e+00 1.8777922243529799e+00 1.0485425009781411e+00 8.6797014876492771e+00 -1.4834818784850534e+00 -4.4657098847703863e-01 -9.0445952230418616e+00 -2.1054875152802186e+00 -1.1113437320131307e+00 -8.8237715010665951e+00 1.5580989406560799e+00 6.6608875118963662e-01 9.1593040415570339e+00 1.7201666316754034e+00 1.2025032129080457e+00 1.2307732789161191e+01 -2.1434766194826675e+00 -7.1721162235344793e-01 -1.2106958004423140e+01 1.7359198195285244e+00 2.8252408160527198e-01 1.9702121622079654e+00 -2.0799991087910921e+00 -5.6155382294841252e-02 -2.1509887526816933e+00 -3.3623124821754042e+00 -3.0057916367906645e-01 -2.2709968957342275e+00 3.0209151744909186e+00 5.7216089133296656e-02 1.8973324040315045e+00 3.3648041708829752e+00 2.2773710713908404e-01 2.2808794151084348e+00 -3.1005411241380409e+00 -5.5751660426019110e-02 -2.1405221214489294e+00 -5.6117978176061634e+00 -2.4097188846511106e-01 -2.1434766194826671e+00 6.0330113678082817e+00 8.5980816987384467e-02 2.5575604079996141e+00 1.3642538455666284e-01 1.2527297165992439e+00 4.0389763822242375e-01 -6.2231696360137867e-02 -1.2749908253519477e+00 -1.6289431327192827e-01 -1.6453101633359141e-01 -2.5357409616242252e+00 -4.3273775626285327e-01 6.1597561835092185e-02 2.4892999633328503e+00 2.0547842157278623e-01 2.3663852525406875e-01 2.5429084770243207e+00 6.3761341457927712e-01 -4.6822438530057214e-02 -2.5413937343476429e+00 -1.7283792201597453e-01 -2.4705713740942178e-01 -5.0329647524560679e+00 -7.1721162235344782e-01 8.5980816987384454e-02 5.1001521168234687e+00 2.3869213952971677e-01 1.6054384819950756e+00 7.6829680733130090e-01 7.1278127896541372e+00 -2.1642486777365124e+00 -1.4763272348490752e-01 -7.0253092332157356e+00 -2.2864604194254716e+00 -7.9973735700325399e-01 -8.5083304379010318e+00 1.9274007101715580e+00 1.9299291722201517e-01 8.8333550699002750e+00 2.2820343507414322e+00 6.1650658344825959e-01 8.6472955613367812e+00 -1.7646561572234969e+00 -1.6754916915508905e-01 -9.0089626409428156e+00 -2.1570686965221992e+00 -7.0156919788804362e-01 -1.2106958004423138e+01 2.5575604079996137e+00 2.3869213952971680e-01 1.2041096895591533e+01 963 964 965 1011 1012 1013 1023 1024 1025 975 976 977 966 967 968 1014 1015 1016 1026 1027 1028 978 979 980 5.8999052913283823e+00 6.2634281221807864e-01 1.7239451017307796e+00 -6.0189905419266525e+00 -6.8540683143628978e-01 -2.1618729247180677e+00 -3.2634747502237542e+00 -6.3785448302726455e-01 -1.6759307398417282e+00 3.0606481327938533e+00 4.6564835914158609e-01 1.5407744906951142e+00 3.2352484647508604e+00 7.1094215733944011e-01 1.9088061430228729e+00 -3.0581519868609512e+00 -4.2654431985766028e-01 -1.5554380532091057e+00 -1.6921672185830321e+00 -5.2654825301922259e-01 -1.4067633297527826e+00 1.8369826087212955e+00 4.7342055864133181e-01 1.6264793120729180e+00 6.2634281221807875e-01 6.4076847197610522e+00 2.5564865954095057e+00 -6.6927711708825766e-01 -6.0036982368717782e+00 -2.1102718486428902e+00 -7.5591296371077876e-01 -3.5620753208838787e+00 -2.2290875399111618e+00 4.4780335158621626e-01 3.2364430706755076e+00 1.8979621762122916e+00 7.0063830179699471e-01 3.5240111570112909e+00 2.2654580576095289e+00 -5.0506307177924359e-01 -3.2692407172067912e+00 -2.1608990525345622e+00 -5.1501515671549702e-01 -2.1701072812066986e+00 -2.1705539079989480e+00 6.7048384369248737e-01 1.8369826087212953e+00 1.9509055198562357e+00 1.7239451017307799e+00 2.5564865954095053e+00 1.2493537927040977e+01 -2.1398224895021913e+00 -2.1412166505510148e+00 -1.2396460071857510e+01 -2.0173882239436924e+00 -2.2636548479340992e+00 -8.6443453016901124e+00 1.5206974672098150e+00 1.9464625729394502e+00 9.1016133071254650e+00 1.8933518253240760e+00 2.2773272213333535e+00 8.7651437532196113e+00 -1.5403311534129991e+00 -1.8070306460881540e+00 -9.2711619285377456e+00 -1.3913580472620219e+00 -2.1948535571819594e+00 -7.2323399719807897e+00 1.9509055198562359e+00 1.6264793120729173e+00 7.1840122866801011e+00 -6.0189905419266525e+00 -6.6927711708825766e-01 -2.1398224895021913e+00 6.3645685435132737e+00 6.2209650486073154e-01 2.5760433276601700e+00 3.5415375323009748e+00 6.8182429267904032e-01 2.2320499582960860e+00 -3.2735041386465151e+00 -4.8961178967476426e-01 -2.1321119441907381e+00 -3.5765661828136235e+00 -7.8325716958802416e-01 -2.3018137577390916e+00 3.2651145416554277e+00 4.7934648672428698e-01 1.9892556566522257e+00 1.8679475271238137e+00 6.8542704510620978e-01 1.9712528060054988e+00 -2.1701072812066977e+00 -5.2654825301922203e-01 -2.1948535571819585e+00 -6.8540683143628955e-01 -6.0036982368717764e+00 -2.1412166505510144e+00 6.2209650486073143e-01 5.8266655699137200e+00 1.6940818192170566e+00 6.9105616639812872e-01 3.2461829979105432e+00 1.8634213452833808e+00 -4.0227933883334710e-01 -3.0591929496794297e+00 -1.4964225035280867e+00 -6.5018745227743668e-01 -3.2548704041482881e+00 -1.6981210152249164e+00 4.7418855235996410e-01 3.0691327143344496e+00 1.5574470094852910e+00 4.6554755564374545e-01 1.8679475271238133e+00 1.6121680425803093e+00 -5.1501515671549647e-01 -1.6921672185830317e+00 -1.3913580472620202e+00 -2.1618729247180677e+00 -2.1102718486428902e+00 -1.2396460071857506e+01 2.5760433276601695e+00 1.6940818192170561e+00 1.2416424975159204e+01 2.2155266152909818e+00 1.8229982848412123e+00 8.6622390462382253e+00 -1.7423227988270686e+00 -1.4766515555239297e+00 -9.1528068808733032e+00 -2.3274921176740895e+00 -2.0750308124959131e+00 -8.7692784538615580e+00 1.9985037636867102e+00 1.5803846363517471e+00 9.2465861152825219e+00 1.6121680425803111e+00 1.9712528060054997e+00 7.2256352418932028e+00 -2.1705539079989480e+00 -1.4067633297527817e+00 -7.2323399719807906e+00 -3.2634747502237542e+00 -7.5591296371077887e-01 -2.0173882239436924e+00 3.5415375323009743e+00 6.9105616639812872e-01 2.2155266152909818e+00 6.3545184711004463e+00 9.0375969855146765e-01 2.3978721301855814e+00 -6.0296640696663211e+00 -6.0857434889676854e-01 -2.0689645766419220e+00 -2.1588472447948837e+00 -7.9860895188867598e-01 -2.0812306790202690e+00 1.8718223842568711e+00 5.2431058989485091e-01 1.9948412972222080e+00 3.2461829979105454e+00 6.8182429267904077e-01 1.8229982848412130e+00 -3.5620753208838809e+00 -6.3785448302726444e-01 -2.2636548479340997e+00 -6.3785448302726455e-01 -3.5620753208838787e+00 -2.2636548479340992e+00 6.8182429267904021e-01 3.2461829979105428e+00 1.8229982848412123e+00 9.0375969855146765e-01 6.3545184711004463e+00 2.3978721301855805e+00 -6.0857434889676887e-01 -6.0296640696663211e+00 -2.0689645766419216e+00 -7.9860895188867653e-01 -2.1588472447948823e+00 -2.0812306790202686e+00 5.2431058989485102e-01 1.8718223842568709e+00 1.9948412972222069e+00 6.9105616639812939e-01 3.5415375323009766e+00 2.2155266152909809e+00 -7.5591296371077854e-01 -3.2634747502237551e+00 -2.0173882239436924e+00 -1.6759307398417282e+00 -2.2290875399111618e+00 -8.6443453016901124e+00 2.2320499582960860e+00 1.8634213452833808e+00 8.6622390462382270e+00 2.3978721301855814e+00 2.3978721301855805e+00 1.1829095589314804e+01 -2.1294978946626091e+00 -2.1294978946626086e+00 -1.2291550817994219e+01 -2.0829780423966660e+00 -2.0829780423966637e+00 -6.7804791912711666e+00 1.6241507830471147e+00 1.6241507830471140e+00 7.2071469308543490e+00 1.8634213452833830e+00 2.2320499582960864e+00 8.6622390462382270e+00 -2.2290875399111623e+00 -1.6759307398417278e+00 -8.6443453016901124e+00 3.0606481327938533e+00 4.4780335158621620e-01 1.5206974672098152e+00 -3.2735041386465151e+00 -4.0227933883334710e-01 -1.7423227988270686e+00 -6.0296640696663211e+00 -6.0857434889676887e-01 -2.1294978946626091e+00 5.9353713347102746e+00 4.1060656215707508e-01 1.7389989707833589e+00 1.8317174027087924e+00 5.1628352381430009e-01 1.5975095729540667e+00 -1.7018187828961624e+00 -3.3987631929429701e-01 -1.4551963348730832e+00 -3.0591929496794319e+00 -4.8961178967476482e-01 -1.4766515555239306e+00 3.2364430706755090e+00 4.6564835914158625e-01 1.9464625729394509e+00 4.6564835914158603e-01 3.2364430706755072e+00 1.9464625729394496e+00 -4.8961178967476426e-01 -3.0591929496794297e+00 -1.4766515555239295e+00 -6.0857434889676865e-01 -6.0296640696663211e+00 -2.1294978946626082e+00 4.1060656215707508e-01 5.9353713347102746e+00 1.7389989707833582e+00 5.1628352381430020e-01 1.8317174027087912e+00 1.5975095729540654e+00 -3.3987631929429685e-01 -1.7018187828961617e+00 -1.4551963348730823e+00 -4.0227933883334716e-01 -3.2735041386465165e+00 -1.7423227988270682e+00 4.4780335158621587e-01 3.0606481327938546e+00 1.5206974672098141e+00 1.5407744906951142e+00 1.8979621762122916e+00 9.1016133071254668e+00 -2.1321119441907381e+00 -1.4964225035280867e+00 -9.1528068808733032e+00 -2.0689645766419225e+00 -2.0689645766419220e+00 -1.2291550817994219e+01 1.7389989707833586e+00 1.7389989707833582e+00 1.2920372800126447e+01 2.0050829004127233e+00 2.0050829004127211e+00 7.1759304549369256e+00 -1.4853195137427386e+00 -1.4853195137427377e+00 -7.7023652895734847e+00 -1.4964225035280880e+00 -2.1321119441907390e+00 -9.1528068808733032e+00 1.8979621762122916e+00 1.5407744906951135e+00 9.1016133071254686e+00 3.2352484647508604e+00 7.0063830179699482e-01 1.8933518253240760e+00 -3.5765661828136235e+00 -6.5018745227743691e-01 -2.3274921176740895e+00 -2.1588472447948837e+00 -7.9860895188867653e-01 -2.0829780423966660e+00 1.8317174027087921e+00 5.1628352381430009e-01 2.0050829004127233e+00 6.3950723142655734e+00 9.5331906281298440e-01 2.5162596186556265e+00 -5.9957655069797218e+00 -6.4912947200958104e-01 -2.2065205931591110e+00 -3.2548704041482903e+00 -7.8325716958802527e-01 -2.0750308124959154e+00 3.5240111570112926e+00 7.1094215733944033e-01 2.2773272213333553e+00 7.1094215733944011e-01 3.5240111570112909e+00 2.2773272213333535e+00 -7.8325716958802416e-01 -3.2548704041482877e+00 -2.0750308124959131e+00 -7.9860895188867598e-01 -2.1588472447948823e+00 -2.0829780423966637e+00 5.1628352381430009e-01 1.8317174027087912e+00 2.0050829004127206e+00 9.5331906281298440e-01 6.3950723142655734e+00 2.5162596186556243e+00 -6.4912947200958115e-01 -5.9957655069797209e+00 -2.2065205931591088e+00 -6.5018745227743702e-01 -3.5765661828136244e+00 -2.3274921176740868e+00 7.0063830179699416e-01 3.2352484647508608e+00 1.8933518253240738e+00 1.9088061430228729e+00 2.2654580576095289e+00 8.7651437532196130e+00 -2.3018137577390916e+00 -1.6981210152249164e+00 -8.7692784538615580e+00 -2.0812306790202690e+00 -2.0812306790202686e+00 -6.7804791912711675e+00 1.5975095729540667e+00 1.5975095729540656e+00 7.1759304549369256e+00 2.5162596186556256e+00 2.5162596186556248e+00 1.2097829634812372e+01 -2.2068679402578151e+00 -2.2068679402578142e+00 -1.2485011497194243e+01 -1.6981210152249182e+00 -2.3018137577390925e+00 -8.7692784538615580e+00 2.2654580576095289e+00 1.9088061430228722e+00 8.7651437532196148e+00 -3.0581519868609512e+00 -5.0506307177924348e-01 -1.5403311534129993e+00 3.2651145416554277e+00 4.7418855235996410e-01 1.9985037636867105e+00 1.8718223842568711e+00 5.2431058989485102e-01 1.6241507830471147e+00 -1.7018187828961620e+00 -3.3987631929429685e-01 -1.4853195137427384e+00 -5.9957655069797209e+00 -6.4912947200958115e-01 -2.2068679402578151e+00 5.8189073536968765e+00 4.4276755396167938e-01 1.8365100704161343e+00 3.0691327143344518e+00 4.7934648672428753e-01 1.5803846363517478e+00 -3.2692407172067934e+00 -4.2654431985766034e-01 -1.8070306460881553e+00 -4.2654431985766028e-01 -3.2692407172067912e+00 -1.8070306460881540e+00 4.7934648672428692e-01 3.0691327143344496e+00 1.5803846363517469e+00 5.2431058989485091e-01 1.8718223842568709e+00 1.6241507830471140e+00 -3.3987631929429701e-01 -1.7018187828961617e+00 -1.4853195137427377e+00 -6.4912947200958104e-01 -5.9957655069797209e+00 -2.2068679402578142e+00 4.4276755396167933e-01 5.8189073536968765e+00 1.8365100704161343e+00 4.7418855235996427e-01 3.2651145416554286e+00 1.9985037636867098e+00 -5.0506307177924326e-01 -3.0581519868609526e+00 -1.5403311534129986e+00 -1.5554380532091057e+00 -2.1608990525345630e+00 -9.2711619285377456e+00 1.9892556566522261e+00 1.5574470094852912e+00 9.2465861152825237e+00 1.9948412972222080e+00 1.9948412972222069e+00 7.2071469308543490e+00 -1.4551963348730832e+00 -1.4551963348730823e+00 -7.7023652895734838e+00 -2.2065205931591110e+00 -2.2065205931591092e+00 -1.2485011497194243e+01 1.8365100704161346e+00 1.8365100704161341e+00 1.3029381482423823e+01 1.5574470094852930e+00 1.9892556566522266e+00 9.2465861152825255e+00 -2.1608990525345622e+00 -1.5554380532091050e+00 -9.2711619285377473e+00 -1.6921672185830321e+00 -5.1501515671549702e-01 -1.3913580472620217e+00 1.8679475271238137e+00 4.6554755564374556e-01 1.6121680425803111e+00 3.2461829979105450e+00 6.9105616639812928e-01 1.8634213452833825e+00 -3.0591929496794315e+00 -4.0227933883334716e-01 -1.4964225035280880e+00 -3.2548704041482903e+00 -6.5018745227743702e-01 -1.6981210152249178e+00 3.0691327143344513e+00 4.7418855235996427e-01 1.5574470094852928e+00 5.8266655699137271e+00 6.2209650486073254e-01 1.6940818192170577e+00 -6.0036982368717844e+00 -6.8540683143629022e-01 -2.1412166505510166e+00 -5.2654825301922270e-01 -2.1701072812066986e+00 -2.1948535571819594e+00 6.8542704510620978e-01 1.8679475271238131e+00 1.9712528060054995e+00 6.8182429267904066e-01 3.5415375323009757e+00 2.2320499582960864e+00 -4.8961178967476482e-01 -3.2735041386465160e+00 -2.1321119441907390e+00 -7.8325716958802527e-01 -3.5765661828136239e+00 -2.3018137577390925e+00 4.7934648672428748e-01 3.2651145416554286e+00 1.9892556566522266e+00 6.2209650486073254e-01 6.3645685435132808e+00 2.5760433276601713e+00 -6.6927711708825799e-01 -6.0189905419266587e+00 -2.1398224895021922e+00 -1.4067633297527826e+00 -2.1705539079989480e+00 -7.2323399719807906e+00 1.9712528060054990e+00 1.6121680425803093e+00 7.2256352418932028e+00 1.8229982848412130e+00 2.2155266152909814e+00 8.6622390462382270e+00 -1.4766515555239306e+00 -1.7423227988270680e+00 -9.1528068808733032e+00 -2.0750308124959154e+00 -2.3274921176740868e+00 -8.7692784538615580e+00 1.5803846363517480e+00 1.9985037636867098e+00 9.2465861152825237e+00 1.6940818192170579e+00 2.5760433276601717e+00 1.2416424975159208e+01 -2.1102718486428902e+00 -2.1618729247180677e+00 -1.2396460071857513e+01 1.8369826087212955e+00 6.7048384369248759e-01 1.9509055198562359e+00 -2.1701072812066977e+00 -5.1501515671549647e-01 -2.1705539079989480e+00 -3.5620753208838809e+00 -7.5591296371077865e-01 -2.2290875399111618e+00 3.2364430706755090e+00 4.4780335158621581e-01 1.8979621762122918e+00 3.5240111570112926e+00 7.0063830179699416e-01 2.2654580576095289e+00 -3.2692407172067934e+00 -5.0506307177924326e-01 -2.1608990525345622e+00 -6.0036982368717844e+00 -6.6927711708825788e-01 -2.1102718486428897e+00 6.4076847197610585e+00 6.2634281221807853e-01 2.5564865954095062e+00 4.7342055864133181e-01 1.8369826087212953e+00 1.6264793120729171e+00 -5.2654825301922203e-01 -1.6921672185830314e+00 -1.4067633297527820e+00 -6.3785448302726433e-01 -3.2634747502237551e+00 -1.6759307398417276e+00 4.6564835914158631e-01 3.0606481327938537e+00 1.5407744906951133e+00 7.1094215733944033e-01 3.2352484647508608e+00 1.9088061430228720e+00 -4.2654431985766034e-01 -3.0581519868609526e+00 -1.5554380532091048e+00 -6.8540683143629022e-01 -6.0189905419266587e+00 -2.1618729247180677e+00 6.2634281221807864e-01 5.8999052913283894e+00 1.7239451017307794e+00 1.6264793120729180e+00 1.9509055198562357e+00 7.1840122866801011e+00 -2.1948535571819590e+00 -1.3913580472620202e+00 -7.2323399719807915e+00 -2.2636548479340997e+00 -2.0173882239436920e+00 -8.6443453016901106e+00 1.9464625729394509e+00 1.5206974672098144e+00 9.1016133071254686e+00 2.2773272213333553e+00 1.8933518253240738e+00 8.7651437532196148e+00 -1.8070306460881553e+00 -1.5403311534129986e+00 -9.2711619285377491e+00 -2.1412166505510166e+00 -2.1398224895021922e+00 -1.2396460071857513e+01 2.5564865954095066e+00 1.7239451017307794e+00 1.2493537927040983e+01 1011 1012 1013 1059 1060 1061 1071 1072 1073 1023 1024 1025 1014 1015 1016 1062 1063 1064 1074 1075 1076 1026 1027 1028 5.3548509016029922e+00 5.6409772492839017e-01 1.5242553251960371e+00 -5.4625226635800042e+00 -6.2950133591714763e-01 -1.9683831709358564e+00 -2.9455482464503100e+00 -5.8494273261801288e-01 -1.5013417089447314e+00 2.7442927375836996e+00 4.1138900346833746e-01 1.3638040691731541e+00 2.9484108910331024e+00 6.5954651127914699e-01 1.7368577224962025e+00 -2.7779906032665602e+00 -3.7312093552795061e-01 -1.3768428609019194e+00 -1.5210245791990740e+00 -4.7354793685292024e-01 -1.2401485342935683e+00 1.6595315622761535e+00 4.2607970124015609e-01 1.4617991582106822e+00 5.6409772492839017e-01 5.8705027859346650e+00 2.3692216219885562e+00 -6.1319885256402551e-01 -5.4481227450309069e+00 -1.9183097636872108e+00 -7.0804070283910114e-01 -3.2538692155652802e+00 -2.0614011891027340e+00 3.9454465947593842e-01 2.9164702121215123e+00 1.7297996141419625e+00 6.4827481530180109e-01 3.2473767853687896e+00 2.0966624150455644e+00 -4.4984377344514681e-01 -2.9870116614718909e+00 -1.9929933813457510e+00 -4.6236851557627412e-01 -2.0048804049953066e+00 -2.0147808193508783e+00 6.2653464471841758e-01 1.6595342436384168e+00 1.7918015023104910e+00 1.5242553251960371e+00 2.3692216219885558e+00 1.1370831196143062e+01 -1.9433206168626158e+00 -1.9467903038849292e+00 -1.1266629793417508e+01 -1.8488157065027697e+00 -2.0957711041350136e+00 -7.8113985325448274e+00 1.3429979249859261e+00 1.7747746037414307e+00 8.2755518731333275e+00 1.7164850686912840e+00 2.1049227117129674e+00 7.9625261409206045e+00 -1.3602811094793088e+00 -1.6329413794459862e+00 -8.4790644223775136e+00 -1.2231221021772232e+00 -2.0352221290228876e+00 -6.5776586046519165e+00 1.7918012161486705e+00 1.4618059790458595e+00 6.5258421427947715e+00 -5.4625226635800042e+00 -6.1319885256402551e-01 -1.9433206168626165e+00 5.8250075041767513e+00 5.5882962540578696e-01 2.3855871685941015e+00 3.2299588297445121e+00 6.3099403296989942e-01 2.0607384831011104e+00 -2.9552655396321916e+00 -4.3492895894847750e-01 -1.9630531091586685e+00 -3.3004631786259386e+00 -7.3239453850229097e-01 -2.1289206364687421e+00 2.9791785706620399e+00 4.2445495914295656e-01 1.8148601769151107e+00 1.6890522601624856e+00 6.3980589641002650e-01 1.8093808594130723e+00 -2.0049457829076545e+00 -4.7356216391387451e-01 -2.0352723255333691e+00 -6.2950133591714752e-01 -5.4481227450309069e+00 -1.9467903038849290e+00 5.5882962540578696e-01 5.2820485706989739e+00 1.4947656418445801e+00 6.3982673549083457e-01 2.9254200222895328e+00 1.6899420597980257e+00 -3.4855721560029546e-01 -2.7447059098406625e+00 -1.3174237523221126e+00 -5.9642252725727884e-01 -2.9697461349174850e+00 -1.5228736081716825e+00 4.2006627610144848e-01 2.7871314224879038e+00 1.3782437684494369e+00 4.1814387593640623e-01 1.6890574904531164e+00 1.4473027961448537e+00 -4.6238543415975386e-01 -1.5210827161404721e+00 -1.2231666018581708e+00 -1.9683831709358566e+00 -1.9183097636872108e+00 -1.1266629793417506e+01 2.3855871685941019e+00 1.4947656418445798e+00 1.1294351190398789e+01 2.0477762140810332e+00 1.6541484047655952e+00 7.8275638917682819e+00 -1.5684534675114179e+00 -1.3001937508363899e+00 -8.3292807300273370e+00 -2.1571688669613605e+00 -1.9012867581475559e+00 -7.9678465632273090e+00 1.8281783612993110e+00 1.4016759977332880e+00 8.4520598361177708e+00 1.4472946916412026e+00 1.8093859591331662e+00 6.5676179232544571e+00 -2.0148309302070135e+00 -1.2401857308054702e+00 -6.5778357548671487e+00 -2.9455482464503104e+00 -7.0804070283910114e-01 -1.8488157065027695e+00 3.2299588297445121e+00 6.3982673549083446e-01 2.0477762140810332e+00 5.7457788477047522e+00 8.5106910291873294e-01 2.2046821859049563e+00 -5.4028526992774397e+00 -5.4636789373933581e-01 -1.8789249502726815e+00 -1.9927906186696189e+00 -7.5464253606906073e-01 -1.9215206621344054e+00 1.6940482793932314e+00 4.7212572236226247e-01 1.8384816368123404e+00 2.9253518129991258e+00 6.3097980509598051e-01 1.6541117554306735e+00 -3.2539462054442536e+00 -5.8495023322031192e-01 -2.0957904733191475e+00 -5.8494273261801288e-01 -3.2538692155652802e+00 -2.0957711041350136e+00 6.3099403296989942e-01 2.9254200222895328e+00 1.6541484047655952e+00 8.5106910291873283e-01 5.7457786514218618e+00 2.2046819923496197e+00 -5.4636814500153785e-01 -5.4028527428176076e+00 -1.8789253810604873e+00 -7.5464283191928960e-01 -1.9927906460247682e+00 -1.9215210631123161e+00 4.7212557846420122e-01 1.6940481286452578e+00 1.8384815168760582e+00 6.3981366506543824e-01 3.2298908010522016e+00 2.0477412238091075e+00 -7.0804866987943105e-01 -2.9456249990011956e+00 -1.8488355894925639e+00 -1.5013417089447314e+00 -2.0614011891027340e+00 -7.8113985325448283e+00 2.0607384831011104e+00 1.6899420597980255e+00 7.8275638917682828e+00 2.2046821859049568e+00 2.2046819923496197e+00 1.0622904876089512e+01 -1.9333504188763839e+00 -1.9333500390628746e+00 -1.1082441499572978e+01 -1.9203716431105531e+00 -1.9203712872436587e+00 -6.1191170526132694e+00 1.4611575600208033e+00 1.4611572974026801e+00 6.5465906238552538e+00 1.6899087189001829e+00 2.0607036737508500e+00 7.8274198768753225e+00 -2.0614231769953846e+00 -1.5013625078919048e+00 -7.8115221838572930e+00 2.7442927375837001e+00 3.9454465947593836e-01 1.3429979249859261e+00 -2.9552655396321916e+00 -3.4855721560029557e-01 -1.5684534675114179e+00 -5.4028526992774397e+00 -5.4636814500153807e-01 -1.9333504188763839e+00 5.3201388000997865e+00 3.5158328911193765e-01 1.5377257091836589e+00 1.6531408667931251e+00 4.6287891545492704e-01 1.4344111595531113e+00 -1.5313542831495541e+00 -2.9055548109060275e-01 -1.2879607260624364e+00 -2.7446270760081326e+00 -4.3491976008337307e-01 -1.3001639366614131e+00 2.9165271935907060e+00 4.1139373773300580e-01 1.7747937553889557e+00 4.1138900346833746e-01 2.9164702121215123e+00 1.7747746037414307e+00 -4.3492895894847750e-01 -2.7447059098406621e+00 -1.3001937508363897e+00 -5.4636789373933581e-01 -5.4028527428176076e+00 -1.9333500390628746e+00 3.5158328911193754e-01 5.3201387359340773e+00 1.5377256510356565e+00 4.6287885446745636e-01 1.6531408200439832e+00 1.4344111108096707e+00 -2.9055530192210682e-01 -1.5313543127296780e+00 -1.2879603545440346e+00 -3.4854795314313841e-01 -2.9551867244849355e+00 -1.5684237672162085e+00 3.9454896070532702e-01 2.7443499217733107e+00 1.3430165460727497e+00 1.3638040691731539e+00 1.7297996141419625e+00 8.2755518731333275e+00 -1.9630531091586685e+00 -1.3174237523221126e+00 -8.3292807300273370e+00 -1.8789249502726815e+00 -1.8789253810604876e+00 -1.1082441499572978e+01 1.5377257091836585e+00 1.5377256510356565e+00 1.1729901221810611e+01 1.8453793996733667e+00 1.8453793394595221e+00 6.5171758005408682e+00 -1.3173537044075065e+00 -1.3173541342531452e+00 -7.0574565604347965e+00 -1.3173901051144847e+00 -1.9630195572760827e+00 -8.3291092403999780e+00 1.7298126909231608e+00 1.3638182202746845e+00 8.2756591349502866e+00 2.9484108910331024e+00 6.4827481530180109e-01 1.7164850686912840e+00 -3.3004631786259386e+00 -5.9642252725727873e-01 -2.1571688669613605e+00 -1.9927906186696189e+00 -7.5464283191928949e-01 -1.9203716431105529e+00 1.6531408667931253e+00 4.6287885446745636e-01 1.8453793996733665e+00 5.9229567380545554e+00 8.9975442409044304e-01 2.3238532434715422e+00 -5.5089352716926410e+00 -5.8701397958988344e-01 -2.0118617195525381e+00 -2.9697095596885719e+00 -7.3238161085893538e-01 -1.9012533663646165e+00 3.2473901327959895e+00 6.5955285576568545e-01 2.1049378841528745e+00 6.5954651127914699e-01 3.2473767853687896e+00 2.1049227117129674e+00 -7.3239453850229097e-01 -2.9697461349174850e+00 -1.9012867581475559e+00 -7.5464253606906073e-01 -1.9927906460247682e+00 -1.9203712872436591e+00 4.6287891545492693e-01 1.6531408200439832e+00 1.8453793394595221e+00 8.9975442409044304e-01 5.9229567063627053e+00 2.3238531924532775e+00 -5.8701375583336179e-01 -5.5089352872604680e+00 -2.0118613717783820e+00 -5.9640967923703114e-01 -3.3004266482660460e+00 -2.1571355909139465e+00 6.4828065881722707e-01 2.9484244046932906e+00 1.7164997644577755e+00 1.7368577224962025e+00 2.0966624150455644e+00 7.9625261409206054e+00 -2.1289206364687421e+00 -1.5228736081716825e+00 -7.9678465632273090e+00 -1.9215206621344054e+00 -1.9215210631123163e+00 -6.1191170526132694e+00 1.4344111595531113e+00 1.4344111108096709e+00 6.5171758005408682e+00 2.3238532434715422e+00 2.3238531924532779e+00 1.1041489268613530e+01 -2.0185174915616533e+00 -2.0185178913950286e+00 -1.1429060887257672e+01 -1.5228410724920847e+00 -2.1288881816153800e+00 -7.9677388892733205e+00 2.0966777371360288e+00 1.7368740259858921e+00 7.9625721822965705e+00 -2.7779906032665602e+00 -4.4984377344514676e-01 -1.3602811094793088e+00 2.9791785706620399e+00 4.2006627610144848e-01 1.8281783612993108e+00 1.6940482793932317e+00 4.7212557846420122e-01 1.4611575600208035e+00 -1.5313542831495541e+00 -2.9055530192210688e-01 -1.3173537044075065e+00 -5.5089352716926410e+00 -5.8701375583336179e-01 -2.0185174915616528e+00 5.3449765973877321e+00 3.8389893568239708e-01 1.6381191423747117e+00 2.7871150467632533e+00 4.2444695793502812e-01 1.4016506028428997e+00 -2.9870383360975006e+00 -3.7312491698245909e-01 -1.6329533610892568e+00 -3.7312093552795056e-01 -2.9870116614718900e+00 -1.6329413794459862e+00 4.2445495914295661e-01 2.7871314224879038e+00 1.4016759977332880e+00 4.7212572236226247e-01 1.6940481286452578e+00 1.4611572974026801e+00 -2.9055548109060281e-01 -1.5313543127296780e+00 -1.3173541342531452e+00 -5.8701397958988344e-01 -5.5089352872604680e+00 -2.0185178913950286e+00 3.8389893568239708e-01 5.3449764858430582e+00 1.6381189543941010e+00 4.2005903355094876e-01 2.9791623001335474e+00 1.8281546627929637e+00 -4.4984825453012778e-01 -2.7780170756477300e+00 -1.3602935072288720e+00 -1.3768428609019194e+00 -1.9929933813457508e+00 -8.4790644223775136e+00 1.8148601769151107e+00 1.3782437684494366e+00 8.4520598361177708e+00 1.8384816368123404e+00 1.8384815168760582e+00 6.5465906238552538e+00 -1.2879607260624364e+00 -1.2879603545440350e+00 -7.0574565604347965e+00 -2.0118617195525372e+00 -2.0118613717783820e+00 -1.1429060887257672e+01 1.6381191423747117e+00 1.6381189543941013e+00 1.1994100896862802e+01 1.3782151008693366e+00 1.8148300469350729e+00 8.4519637167074197e+00 -1.9930107504546051e+00 -1.3768591789864988e+00 -8.4791332034732658e+00 -1.5210245791990740e+00 -4.6236851557627423e-01 -1.2231221021772232e+00 1.6890522601624856e+00 4.1814387593640623e-01 1.4472946916412026e+00 2.9253518129991258e+00 6.3981366506543824e-01 1.6899087189001829e+00 -2.7446270760081326e+00 -3.4854795314313841e-01 -1.3173901051144847e+00 -2.9697095596885714e+00 -5.9640967923703114e-01 -1.5228410724920847e+00 2.7871150467632537e+00 4.2005903355094876e-01 1.3782151008693364e+00 5.2819528523024246e+00 5.5880781641056654e-01 1.4947085539034501e+00 -5.4481107573315128e+00 -6.2949824300691526e-01 -1.9467737855303791e+00 -4.7354793685292018e-01 -2.0048804049953066e+00 -2.0352221290228871e+00 6.3980589641002650e-01 1.6890574904531159e+00 1.8093859591331660e+00 6.3097980509598051e-01 3.2298908010522016e+00 2.0607036737508495e+00 -4.3491976008337307e-01 -2.9551867244849355e+00 -1.9630195572760831e+00 -7.3238161085893516e-01 -3.3004266482660460e+00 -2.1288881816153800e+00 4.2444695793502812e-01 2.9791623001335474e+00 1.8148300469350729e+00 5.5880781641056654e-01 5.8249014328982778e+00 2.3855173328089170e+00 -6.1319116805637297e-01 -5.4625182467908546e+00 -1.9433071447136565e+00 -1.2401485342935683e+00 -2.0147808193508783e+00 -6.5776586046519139e+00 1.8093808594130725e+00 1.4473027961448535e+00 6.5676179232544563e+00 1.6541117554306735e+00 2.0477412238091075e+00 7.8274198768753225e+00 -1.3001639366614131e+00 -1.5684237672162085e+00 -8.3291092403999798e+00 -1.9012533663646165e+00 -2.1571355909139465e+00 -7.9677388892733214e+00 1.4016506028428997e+00 1.8281546627929635e+00 8.4519637167074197e+00 1.4947085539034501e+00 2.3855173328089179e+00 1.1294089982077613e+01 -1.9182859342704968e+00 -1.9683758380748060e+00 -1.1266584764589597e+01 1.6595315622761535e+00 6.2653464471841758e-01 1.7918012161486705e+00 -2.0049457829076545e+00 -4.6238543415975381e-01 -2.0148309302070135e+00 -3.2539462054442545e+00 -7.0804866987943105e-01 -2.0614231769953841e+00 2.9165271935907060e+00 3.9454896070532702e-01 1.7298126909231610e+00 3.2473901327959891e+00 6.4828065881722707e-01 2.0966777371360288e+00 -2.9870383360975006e+00 -4.4984825453012778e-01 -1.9930107504546051e+00 -5.4481107573315128e+00 -6.1319116805637286e-01 -1.9182859342704968e+00 5.8705921931180729e+00 5.6410926238471304e-01 2.3692591477196401e+00 4.2607970124015615e-01 1.6595342436384168e+00 1.4618059790458595e+00 -4.7356216391387451e-01 -1.5210827161404721e+00 -1.2401857308054702e+00 -5.8495023322031192e-01 -2.9456249990011956e+00 -1.5013625078919051e+00 4.1139373773300580e-01 2.7443499217733107e+00 1.3638182202746845e+00 6.5955285576568556e-01 2.9484244046932901e+00 1.7368740259858921e+00 -3.7312491698245903e-01 -2.7780170756477300e+00 -1.3768591789864986e+00 -6.2949824300691526e-01 -5.4625182467908537e+00 -1.9683758380748060e+00 5.6410926238471282e-01 5.3549344674752346e+00 1.5242850304522439e+00 1.4617991582106822e+00 1.7918015023104910e+00 6.5258421427947715e+00 -2.0352723255333691e+00 -1.2231666018581708e+00 -6.5778357548671487e+00 -2.0957904733191475e+00 -1.8488355894925639e+00 -7.8115221838572930e+00 1.7747937553889555e+00 1.3430165460727497e+00 8.2756591349502866e+00 2.1049378841528741e+00 1.7164997644577753e+00 7.9625721822965687e+00 -1.6329533610892568e+00 -1.3602935072288720e+00 -8.4791332034732658e+00 -1.9467737855303793e+00 -1.9433071447136565e+00 -1.1266584764589597e+01 2.3692591477196392e+00 1.5242850304522442e+00 1.1371002446745678e+01 975 976 977 1023 1024 1025 1035 1036 1037 987 988 989 978 979 980 1026 1027 1028 1038 1039 1040 990 991 992 5.5036856922372772e+00 8.2219407320057514e-01 1.3689416316314780e+00 -5.6130985875568076e+00 -9.8187257066377653e-01 -1.7858276094908596e+00 -2.9869919292428655e+00 -8.3353245593247949e-01 -1.3313722664232366e+00 2.8056437705314026e+00 6.4616179082367209e-01 1.2262628992882421e+00 2.9882656703265331e+00 9.5925413885308952e-01 1.5549757623131950e+00 -2.8313832364474307e+00 -6.2637671541415241e-01 -1.2555085780307957e+00 -1.5238195449224836e+00 -6.7614953277951184e-01 -1.0957638121546878e+00 1.6576981650743763e+00 6.9032127191258286e-01 1.3182919728666647e+00 8.2219407320057514e-01 7.1784546793154718e+00 3.3431996761328069e+00 -9.6623444227255417e-01 -6.6739223954001732e+00 -3.0199304230941832e+00 -1.0061091246469496e+00 -4.3204538419975238e+00 -2.8425109183674158e+00 6.1675670280611095e-01 3.9107979656566316e+00 2.6901386538288268e+00 9.4648724245205929e-01 4.3510713367487099e+00 2.9481879224942267e+00 -6.8811106049864690e-01 -4.0177734263087048e+00 -2.9939858071643850e+00 -6.4974962880793929e-01 -2.9862310543021193e+00 -2.7865200160197299e+00 9.2476623776734501e-01 2.5580567362877051e+00 2.6614209121898518e+00 1.3689416316314782e+00 3.3431996761328069e+00 1.0719412631023827e+01 -1.7704123762052251e+00 -3.0439015222512751e+00 -1.0760713179955168e+01 -1.6313255817228804e+00 -2.8891602334233593e+00 -7.1286175529166380e+00 1.1909857072963452e+00 2.7354289247248227e+00 7.6762623881444156e+00 1.5483454230082669e+00 2.9707941875789388e+00 7.3109508711427971e+00 -1.2340465479664442e+00 -2.6722505533215672e+00 -7.8917624293528350e+00 -1.0671354071381518e+00 -2.8240214551536713e+00 -5.8511555621996800e+00 1.5946471510966114e+00 2.3799109757132997e+00 5.9256228341132786e+00 -5.6130985875568076e+00 -9.6623444227255395e-01 -1.7704123762052246e+00 5.9530294504559063e+00 1.0253033994726952e+00 2.2044311918093000e+00 3.2565907548726356e+00 1.0029405862458098e+00 1.8576329428962632e+00 -2.9990864003965796e+00 -7.9831872138240989e-01 -1.7934841628139524e+00 -3.3225232782311376e+00 -1.1265650562072851e+00 -1.9312649392006946e+00 3.0218235363308121e+00 7.7695968296293605e-01 1.6785172552489547e+00 1.6810610518496927e+00 9.5067704147673138e-01 1.6153546732791966e+00 -1.9777965273245197e+00 -8.6476249029592112e-01 -1.8607745850138422e+00 -9.8187257066377653e-01 -6.6739223954001732e+00 -3.0439015222512751e+00 1.0253033994726952e+00 6.3740273171958792e+00 2.7025044147808579e+00 1.0065538687104354e+00 3.9100637661933271e+00 2.6076134326095648e+00 -6.3618099482702273e-01 -3.6137547275803690e+00 -2.4052584600599491e+00 -1.0076155316179825e+00 -3.9845491172841370e+00 -2.4992896453226940e+00 7.6814800792359272e-01 3.6978832681520912e+00 2.4962201405427948e+00 6.7071634259620672e-01 2.5910888212568808e+00 2.3619116233461859e+00 -8.4505252159414812e-01 -2.3008369325334961e+00 -2.2197999836454856e+00 -1.7858276094908596e+00 -3.0199304230941828e+00 -1.0760713179955170e+01 2.2044311918092996e+00 2.7025044147808588e+00 1.0918869431841930e+01 1.8357271771673855e+00 2.5653730054670483e+00 7.2696018323563587e+00 -1.4172574893868550e+00 -2.3679234599173169e+00 -7.8606114066236632e+00 -1.9757592815030822e+00 -2.8662607995562017e+00 -7.4349767258261350e+00 1.6837870433992863e+00 2.5299273364985617e+00 7.9970652825101656e+00 1.2887616548857088e+00 2.6950262119261117e+00 5.9628226696039714e+00 -1.8338626868808841e+00 -2.2387162861048737e+00 -6.0920579039074614e+00 -2.9869919292428655e+00 -1.0061091246469496e+00 -1.6313255817228804e+00 3.2565907548726356e+00 1.0065538687104352e+00 1.8357271771673853e+00 5.8239093349610291e+00 1.2089441204022677e+00 1.9316410182857913e+00 -5.5124133393073667e+00 -8.6143505590887504e-01 -1.6569111497437130e+00 -1.9622986593842922e+00 -1.0805127253108195e+00 -1.6987343161131518e+00 1.6890892092416430e+00 8.0417461824083047e-01 1.6565779192975867e+00 2.9283219009142973e+00 8.8801021650223411e-01 1.4319225946824732e+00 -3.2362072720550801e+00 -9.5962591798912145e-01 -1.8688976618534912e+00 -8.3353245593247949e-01 -4.3204538419975238e+00 -2.8891602334233593e+00 1.0029405862458098e+00 3.9100637661933271e+00 2.5653730054670483e+00 1.2089441204022677e+00 6.9582191526119557e+00 3.0432311006387569e+00 -8.7538374805955499e-01 -6.5506989848893049e+00 -2.8817449741755898e+00 -1.0810012498501793e+00 -2.9583531824226483e+00 -2.6522212398206033e+00 7.2953719427358343e-01 2.5950607481396384e+00 2.7169861307278511e+00 9.0493031094919452e-01 4.2528020748434621e+00 2.8124152011433194e+00 -1.0564347580286417e+00 -3.8866397324789039e+00 -2.7148789905574229e+00 -1.3313722664232366e+00 -2.8425109183674158e+00 -7.1286175529166380e+00 1.8576329428962632e+00 2.6076134326095644e+00 7.2696018323563587e+00 1.9316410182857917e+00 3.0432311006387569e+00 9.9298984445385017e+00 -1.7240409273027659e+00 -2.9528171778694916e+00 -1.0458922971794005e+01 -1.7043072280297258e+00 -2.6597354767721417e+00 -5.4460760302299889e+00 1.3130760721057095e+00 2.3634052344260312e+00 5.9322392210992225e+00 1.4764518554473447e+00 2.8417394323501202e+00 7.0697114630866320e+00 -1.8190814669793809e+00 -2.4009256270154187e+00 -7.1678344061400816e+00 2.8056437705314026e+00 6.1675670280611095e-01 1.1909857072963452e+00 -2.9990864003965796e+00 -6.3618099482702273e-01 -1.4172574893868550e+00 -5.5124133393073667e+00 -8.7538374805955510e-01 -1.7240409273027659e+00 5.4443180225672707e+00 6.1595102764870624e-01 1.3668638704004130e+00 1.6456003948049831e+00 7.0775279916327294e-01 1.2719813313025168e+00 -1.5379273013032055e+00 -5.2054573902682910e-01 -1.1534016504897309e+00 -2.7692560134943713e+00 -6.3836812943332100e-01 -1.1274257365714728e+00 2.9231208665978663e+00 7.3001808172863680e-01 1.5922948947515503e+00 6.4616179082367209e-01 3.9107979656566316e+00 2.7354289247248227e+00 -7.9831872138241011e-01 -3.6137547275803685e+00 -2.3679234599173169e+00 -8.6143505590887504e-01 -6.5506989848893049e+00 -2.9528171778694920e+00 6.1595102764870635e-01 6.3575209678379929e+00 2.7199835521017866e+00 7.9517513089478919e-01 2.5491824377015755e+00 2.3260251582580214e+00 -5.3190369251326652e-01 -2.3258877096743067e+00 -2.3261840914119345e+00 -5.6414161445517730e-01 -3.9139250746514489e+00 -2.5130830328756213e+00 6.9851113489256178e-01 3.5867651255992294e+00 2.3785701269897341e+00 1.2262628992882421e+00 2.6901386538288268e+00 7.6762623881444139e+00 -1.7934841628139524e+00 -2.4052584600599491e+00 -7.8606114066236632e+00 -1.6569111497437135e+00 -2.8817449741755898e+00 -1.0458922971794003e+01 1.3668638704004126e+00 2.7199835521017866e+00 1.1187667258969174e+01 1.6761741665869421e+00 2.7418172908873464e+00 5.9123470231108604e+00 -1.2037343050002742e+00 -2.3759941978607868e+00 -6.5272786637487163e+00 -1.1583802959977849e+00 -2.8952661370421282e+00 -7.6333254762061360e+00 1.5432089772801287e+00 2.4063242723204894e+00 7.7038618481480707e+00 2.9882656703265331e+00 9.4648724245205929e-01 1.5483454230082672e+00 -3.3225232782311376e+00 -1.0076155316179827e+00 -1.9757592815030822e+00 -1.9622986593842922e+00 -1.0810012498501793e+00 -1.7043072280297258e+00 1.6456003948049831e+00 7.9517513089478919e-01 1.6761741665869421e+00 5.9718341478209673e+00 1.3148030848296506e+00 2.0858953963415234e+00 -5.5880744445974333e+00 -9.6110186439354384e-01 -1.8403724024299795e+00 -2.9660266218942146e+00 -1.0483765817156605e+00 -1.6862515412059416e+00 3.2332227911545943e+00 1.0416297694008656e+00 1.8962754672319968e+00 9.5925413885308930e-01 4.3510713367487099e+00 2.9707941875789388e+00 -1.1265650562072851e+00 -3.9845491172841370e+00 -2.8662607995562013e+00 -1.0805127253108195e+00 -2.9583531824226483e+00 -2.6597354767721422e+00 7.0775279916327294e-01 2.5491824377015759e+00 2.7418172908873464e+00 1.3148030848296506e+00 7.1979689473985182e+00 3.2767832278872104e+00 -9.6003348671990452e-01 -6.7103939565574837e+00 -3.1449681017665818e+00 -8.4287790844385602e-01 -4.3741168226564966e+00 -2.9829074466894228e+00 1.0281791538358525e+00 3.9291903570719580e+00 2.6644771184308516e+00 1.5549757623131948e+00 2.9481879224942271e+00 7.3109508711427988e+00 -1.9312649392006946e+00 -2.4992896453226936e+00 -7.4349767258261350e+00 -1.6987343161131514e+00 -2.6522212398206033e+00 -5.4460760302299889e+00 1.2719813313025168e+00 2.3260251582580209e+00 5.9123470231108604e+00 2.0858953963415234e+00 3.2767832278872104e+00 1.0342702280784270e+01 -1.8327676276115650e+00 -3.1353352205872218e+00 -1.0809639820635947e+01 -1.3315557801639848e+00 -2.9397513401757029e+00 -7.2172151288604542e+00 1.8814701731321617e+00 2.6756011372667592e+00 7.3419075305145967e+00 -2.8313832364474307e+00 -6.8811106049864690e-01 -1.2340465479664442e+00 3.0218235363308121e+00 7.6814800792359272e-01 1.6837870433992861e+00 1.6890892092416430e+00 7.2953719427358343e-01 1.3130760721057095e+00 -1.5379273013032058e+00 -5.3190369251326652e-01 -1.2037343050002742e+00 -5.5880744445974324e+00 -9.6003348671990452e-01 -1.8327676276115650e+00 5.4330061307916537e+00 6.9449696566446384e-01 1.5065430107302951e+00 2.8049532580755692e+00 6.7140986209652898e-01 1.2577103100895288e+00 -2.9914871520916075e+00 -6.8354379022635037e-01 -1.4905679557465370e+00 -6.2637671541415252e-01 -4.0177734263087057e+00 -2.6722505533215672e+00 7.7695968296293605e-01 3.6978832681520908e+00 2.5299273364985617e+00 8.0417461824083047e-01 2.5950607481396384e+00 2.3634052344260312e+00 -5.2054573902682910e-01 -2.3258877096743071e+00 -2.3759941978607868e+00 -9.6110186439354428e-01 -6.7103939565574846e+00 -3.1353352205872218e+00 6.9449696566446395e-01 6.4247278840858026e+00 2.9331126472650602e+00 6.5202679933331953e-01 3.9806427315484370e+00 2.8193863247417799e+00 -8.1963374736702443e-01 -3.6442595393854722e+00 -2.4622515711618580e+00 -1.2555085780307957e+00 -2.9939858071643841e+00 -7.8917624293528332e+00 1.6785172552489545e+00 2.4962201405427948e+00 7.9970652825101647e+00 1.6565779192975867e+00 2.7169861307278511e+00 5.9322392210992234e+00 -1.1534016504897311e+00 -2.3261840914119349e+00 -6.5272786637487163e+00 -1.8403724024299795e+00 -3.1449681017665814e+00 -1.0809639820635947e+01 1.5065430107302951e+00 2.9331126472650597e+00 1.1462079528300302e+01 1.2184103987121133e+00 2.8104572620713251e+00 7.7742613656195294e+00 -1.8107659530384446e+00 -2.4916381802641272e+00 -7.9369644837917193e+00 -1.5238195449224836e+00 -6.4974962880793918e-01 -1.0671354071381518e+00 1.6810610518496927e+00 6.7071634259620661e-01 1.2887616548857086e+00 2.9283219009142973e+00 9.0493031094919441e-01 1.4764518554473445e+00 -2.7692560134943718e+00 -5.6414161445517730e-01 -1.1583802959977849e+00 -2.9660266218942146e+00 -8.4287790844385602e-01 -1.3315557801639848e+00 2.8049532580755692e+00 6.5202679933331953e-01 1.2184103987121131e+00 5.3044140928557795e+00 7.8415699095925984e-01 1.2876065417506142e+00 -5.4596481233842677e+00 -9.5506129213100710e-01 -1.7141589674958593e+00 -6.7614953277951195e-01 -2.9862310543021193e+00 -2.8240214551536713e+00 9.5067704147673138e-01 2.5910888212568808e+00 2.6950262119261117e+00 8.8801021650223411e-01 4.2528020748434621e+00 2.8417394323501202e+00 -6.3836812943332100e-01 -3.9139250746514489e+00 -2.8952661370421282e+00 -1.0483765817156605e+00 -4.3741168226564966e+00 -2.9397513401757029e+00 6.7140986209652909e-01 3.9806427315484370e+00 2.8104572620713260e+00 7.8415699095925984e-01 7.0065939452220567e+00 3.2951773976336831e+00 -9.3135986710626151e-01 -6.5568546212607668e+00 -2.9833613716097389e+00 -1.0957638121546875e+00 -2.7865200160197299e+00 -5.8511555621996791e+00 1.6153546732791966e+00 2.3619116233461854e+00 5.9628226696039714e+00 1.4319225946824732e+00 2.8124152011433199e+00 7.0697114630866320e+00 -1.1274257365714728e+00 -2.5130830328756213e+00 -7.6333254762061351e+00 -1.6862515412059418e+00 -2.9829074466894228e+00 -7.2172151288604542e+00 1.2577103100895288e+00 2.8193863247417799e+00 7.7742613656195285e+00 1.2876065417506137e+00 3.2951773976336831e+00 1.0400173126292716e+01 -1.6831530298697113e+00 -3.0063800512801899e+00 -1.0505272457336575e+01 1.6576981650743763e+00 9.2476623776734490e-01 1.5946471510966114e+00 -1.9777965273245197e+00 -8.4505252159414812e-01 -1.8338626868808843e+00 -3.2362072720550801e+00 -1.0564347580286420e+00 -1.8190814669793813e+00 2.9231208665978663e+00 6.9851113489256178e-01 1.5432089772801287e+00 3.2332227911545943e+00 1.0281791538358525e+00 1.8814701731321617e+00 -2.9914871520916075e+00 -8.1963374736702455e-01 -1.8107659530384443e+00 -5.4596481233842677e+00 -9.3135986710626151e-01 -1.6831530298697113e+00 5.8510972520286373e+00 1.0010243676003152e+00 2.1275368352595190e+00 6.9032127191258297e-01 2.5580567362877051e+00 2.3799109757132997e+00 -8.6476249029592112e-01 -2.3008369325334961e+00 -2.2387162861048742e+00 -9.5962591798912145e-01 -3.8866397324789039e+00 -2.4009256270154187e+00 7.3001808172863680e-01 3.5867651255992294e+00 2.4063242723204890e+00 1.0416297694008656e+00 3.9291903570719580e+00 2.6756011372667592e+00 -6.8354379022635026e-01 -3.6442595393854722e+00 -2.4916381802641272e+00 -9.5506129213100721e-01 -6.5568546212607677e+00 -3.0063800512801899e+00 1.0010243676003150e+00 6.3145786066997465e+00 2.6758237593640617e+00 1.3182919728666644e+00 2.6614209121898518e+00 5.9256228341132777e+00 -1.8607745850138424e+00 -2.2197999836454856e+00 -6.0920579039074614e+00 -1.8688976618534907e+00 -2.7148789905574229e+00 -7.1678344061400816e+00 1.5922948947515503e+00 2.3785701269897341e+00 7.7038618481480716e+00 1.8962754672319964e+00 2.6644771184308516e+00 7.3419075305145967e+00 -1.4905679557465370e+00 -2.4622515711618576e+00 -7.9369644837917193e+00 -1.7141589674958591e+00 -2.9833613716097394e+00 -1.0505272457336577e+01 2.1275368352595190e+00 2.6758237593640612e+00 1.0730737038399893e+01 1023 1024 1025 1071 1072 1073 1083 1084 1085 1035 1036 1037 1026 1027 1028 1074 1075 1076 1086 1087 1088 1038 1039 1040 4.9302441850753667e+00 7.3256320512415496e-01 1.2044254617006482e+00 -5.0273146258642294e+00 -8.9650709967569542e-01 -1.6214348278123407e+00 -2.7057491533031151e+00 -7.6110324857865930e-01 -1.1945313473394827e+00 2.5247847580222995e+00 5.7106439514394725e-01 1.0857072577103872e+00 2.6949949417381602e+00 8.8332623468365834e-01 1.4129659768275604e+00 -2.5421597963426743e+00 -5.4889855904240670e-01 -1.1099266954369891e+00 -1.3793938648598716e+00 -6.0389448872543983e-01 -9.6537437456550612e-01 1.5045935555340648e+00 6.2344956107044003e-01 1.1881685489157228e+00 7.3256320512415496e-01 6.5189670644692921e+00 3.0770539864033486e+00 -8.8735750662321489e-01 -5.9942058579015685e+00 -2.7522444037828935e+00 -9.3908982760182735e-01 -3.9709253646716252e+00 -2.6151880994530967e+00 5.4567674556870438e-01 3.5459605119586071e+00 2.4655895520538338e+00 8.7526139737689146e-01 3.9844430853624737e+00 2.7139252721510934e+00 -6.0945163764028443e-01 -3.6429267197559310e+00 -2.7624034545251939e+00 -5.8044186901795614e-01 -2.7716645657439725e+00 -2.5762880295739290e+00 8.6283949281353334e-01 2.3303518462827233e+00 2.4495551767268382e+00 1.2044254617006485e+00 3.0770539864033477e+00 9.6874670501491718e+00 -1.6140615749521035e+00 -2.7692224335260640e+00 -9.7190275605134619e+00 -1.5013654313060483e+00 -2.6666497915230152e+00 -6.4615180232184528e+00 1.0553699633063629e+00 2.5066901015858609e+00 7.0081542526163751e+00 1.4123456058176678e+00 2.7324099972751466e+00 6.6189679072283889e+00 -1.0867966573831900e+00 -2.4309951065398234e+00 -7.2031065806393100e+00 -9.4044440041650246e-01 -2.6111992621818514e+00 -5.3432246739470850e+00 1.4705270332331672e+00 2.1619125085063962e+00 5.4122876283243757e+00 -5.0273146258642294e+00 -8.8735750662321489e-01 -1.6140615749521039e+00 5.3833616598155070e+00 9.3769514476906424e-01 2.0498461070898562e+00 2.9813040316517911e+00 9.3504784573874200e-01 1.7269979041434322e+00 -2.7150183843160973e+00 -7.2509014817260886e-01 -1.6642268335927106e+00 -3.0408133776742829e+00 -1.0552021374596723e+00 -1.7939790880026270e+00 2.7259149880277076e+00 7.0199912575386514e-01 1.5433540161911479e+00 1.5292732394674926e+00 8.8779783714102523e-01 1.4917044126598284e+00 -1.8367075311078902e+00 -7.9489016114719957e-01 -1.7396349435368235e+00 -8.9650709967569542e-01 -5.9942058579015685e+00 -2.7692224335260645e+00 9.3769514476906446e-01 5.6998842664859080e+00 2.4244228113821800e+00 9.3695373390667569e-01 3.5450168555867099e+00 2.3764459261396169e+00 -5.6486710313696120e-01 -3.2481464278197367e+00 -2.1707602616632249e+00 -9.3375348176756845e-01 -3.6077245986186122e+00 -2.2580908412546452e+00 6.9000759598857708e-01 3.3189362944625880e+00 2.2518292844987999e+00 6.0658573416904549e-01 2.3607094748384299e+00 2.1443012297851993e+00 -7.7611452425313820e-01 -2.0744700070337183e+00 -1.9989257153618611e+00 -1.6214348278123403e+00 -2.7522444037828930e+00 -9.7190275605134637e+00 2.0498461070898562e+00 2.4244228113821800e+00 9.8814156304498155e+00 1.7055279975958555e+00 2.3398109050130094e+00 6.5972097305844706e+00 -1.2841621640896255e+00 -2.1312025133075463e+00 -7.1919949445134987e+00 -1.8415931991668715e+00 -2.6276364060664559e+00 -6.7417309112232546e+00 1.5410926621489851e+00 2.2842245425530416e+00 7.3044426043948265e+00 1.1638932710779635e+00 2.4787525000192518e+00 5.4493985095534594e+00 -1.7131698468438250e+00 -2.0161274358105858e+00 -5.5797130587323531e+00 -2.7057491533031151e+00 -9.3908982760182735e-01 -1.5013654313060483e+00 2.9813040316517911e+00 9.3695373390667558e-01 1.7055279975958555e+00 5.3683829655856039e+00 1.1398976148382971e+00 1.7899232289884026e+00 -5.0373881297339498e+00 -7.8127052155640597e-01 -1.5138526258085641e+00 -1.8235958274212325e+00 -1.0186011773479826e+00 -1.5755143285874007e+00 1.5354014875185569e+00 7.3459497490503523e-01 1.5362975495210167e+00 2.6986720192534599e+00 8.1908002829377935e-01 1.3033382709311301e+00 -3.0170273935511145e+00 -8.9156482543757010e-01 -1.7443546613343925e+00 -7.6110324857865930e-01 -3.9709253646716252e+00 -2.6666497915230152e+00 9.3504784573874211e-01 3.5450168555867103e+00 2.3398109050130094e+00 1.1398976148382967e+00 6.4177511799822700e+00 2.7977698621386073e+00 -7.9868652833346832e-01 -5.9880003085205598e+00 -2.6368726145448909e+00 -1.0217739161679642e+00 -2.7438297882909457e+00 -2.4410042965097793e+00 6.5841398568495013e-01 2.3666454297607675e+00 2.5077600677667218e+00 8.4169715904584241e-01 3.9541911310720814e+00 2.5963593372968834e+00 -9.9349291222774083e-01 -3.5808491349186986e+00 -2.4971734696375369e+00 -1.1945313473394827e+00 -2.6151880994530972e+00 -6.4615180232184528e+00 1.7269979041434322e+00 2.3764459261396169e+00 6.5972097305844706e+00 1.7899232289884026e+00 2.7977698621386073e+00 9.0440291872566672e+00 -1.5864405206035623e+00 -2.7062051879917606e+00 -9.5629046890498053e+00 -1.5809542330450692e+00 -2.4417961145097395e+00 -4.9351812862392972e+00 1.1855861661363536e+00 2.1460592569666330e+00 5.4162855032949153e+00 1.3547234810938587e+00 2.6215670956168160e+00 6.4680568898319883e+00 -1.6953046793739344e+00 -2.1786527389070738e+00 -6.5659773124604861e+00 2.5247847580222995e+00 5.4567674556870449e-01 1.0553699633063631e+00 -2.7150183843160973e+00 -5.6486710313696120e-01 -1.2841621640896255e+00 -5.0373881297339489e+00 -7.9868652833346832e-01 -1.5864405206035623e+00 4.9786299958289071e+00 5.3913217027013305e-01 1.2186240630492702e+00 1.4937270620601122e+00 6.3814214491454235e-01 1.1497130912228408e+00 -1.3913540060583245e+00 -4.5377699489069079e-01 -1.0254892588002362e+00 -2.5447009695652163e+00 -5.6783762154096817e-01 -9.9859305045614155e-01 2.6913196737622687e+00 6.6221718714870792e-01 1.4709778763710917e+00 5.7106439514394725e-01 3.5459605119586071e+00 2.5066901015858614e+00 -7.2509014817260886e-01 -3.2481464278197367e+00 -2.1312025133075463e+00 -7.8127052155640586e-01 -5.9880003085205598e+00 -2.7062051879917597e+00 5.3913217027013305e-01 5.7995202248464715e+00 2.4652827985657875e+00 7.2545564998483392e-01 2.3192864522346461e+00 2.1101721733681340e+00 -4.6200446238297310e-01 -2.0995073220725979e+00 -2.1043851013997199e+00 -4.9445102900464799e-01 -3.6057673398545345e+00 -2.2928143951339561e+00 6.2716394571772227e-01 3.2766542092277020e+00 2.1524621243132005e+00 1.0857072577103872e+00 2.4655895520538333e+00 7.0081542526163751e+00 -1.6642268335927106e+00 -2.1707602616632249e+00 -7.1919949445134979e+00 -1.5138526258085638e+00 -2.6368726145448909e+00 -9.5629046890498053e+00 1.2186240630492700e+00 2.4652827985657870e+00 1.0304878881247548e+01 1.5552932706467510e+00 2.5277708014383671e+00 5.3971569344240251e+00 -1.0689705234706512e+00 -2.1545897318518294e+00 -6.0219049140002223e+00 -1.0254982477334926e+00 -2.6756483970505807e+00 -7.0371756414409425e+00 1.4129236391990116e+00 2.1792278530525344e+00 7.1037901207165204e+00 2.6949949417381602e+00 8.7526139737689146e-01 1.4123456058176678e+00 -3.0408133776742829e+00 -9.3375348176756856e-01 -1.8415931991668715e+00 -1.8235958274212325e+00 -1.0217739161679642e+00 -1.5809542330450690e+00 1.4937270620601122e+00 7.2545564998483392e-01 1.5552932706467510e+00 5.4841128970170780e+00 1.2371409536369837e+00 1.9315440604629792e+00 -5.0804940245445263e+00 -8.7482417788055855e-01 -1.6876630532585790e+00 -2.7313164903732314e+00 -9.8040839374256339e-01 -1.5545297040076591e+00 3.0033848191979229e+00 9.7290196855994482e-01 1.7655572525507808e+00 8.8332623468365834e-01 3.9844430853624746e+00 2.7324099972751470e+00 -1.0552021374596725e+00 -3.6077245986186126e+00 -2.6276364060664563e+00 -1.0186011773479828e+00 -2.7438297882909457e+00 -2.4417961145097395e+00 6.3814214491454235e-01 2.3192864522346461e+00 2.5277708014383671e+00 1.2371409536369837e+00 6.6127191236152587e+00 3.0071266512918005e+00 -8.7064781872670016e-01 -6.1070357028711646e+00 -2.8755708884683306e+00 -7.7158412821213818e-01 -4.0649692238946082e+00 -2.7529291108082390e+00 9.5742592851131048e-01 3.6071106524629521e+00 2.4306250698474496e+00 1.4129659768275602e+00 2.7139252721510929e+00 6.6189679072283889e+00 -1.7939790880026270e+00 -2.2580908412546452e+00 -6.7417309112232546e+00 -1.5755143285874003e+00 -2.4410042965097793e+00 -4.9351812862392981e+00 1.1497130912228408e+00 2.1101721733681340e+00 5.3971569344240251e+00 1.9315440604629788e+00 3.0071266512918005e+00 9.3945758155135852e+00 -1.6752315397763793e+00 -2.8676166222827675e+00 -9.8532406564210291e+00 -1.2012601471451125e+00 -2.7123527332875441e+00 -6.5963447473872741e+00 1.7517619749981412e+00 2.4478403965237066e+00 6.7157969441048575e+00 -2.5421597963426743e+00 -6.0945163764028443e-01 -1.0867966573831900e+00 2.7259149880277076e+00 6.9000759598857708e-01 1.5410926621489853e+00 1.5354014875185564e+00 6.5841398568495002e-01 1.1855861661363536e+00 -1.3913540060583245e+00 -4.6200446238297310e-01 -1.0689705234706512e+00 -5.0804940245445263e+00 -8.7064781872670016e-01 -1.6752315397763797e+00 4.9343323957485961e+00 6.0761641987847048e-01 1.3409332112267160e+00 2.5695121467593238e+00 5.9498862025061539e-01 1.1170459862324917e+00 -2.7511531911086600e+00 -6.0892270305265495e-01 -1.3536593051143264e+00 -5.4889855904240670e-01 -3.6429267197559310e+00 -2.4309951065398234e+00 7.0199912575386503e-01 3.3189362944625880e+00 2.2842245425530421e+00 7.3459497490503523e-01 2.3666454297607675e+00 2.1460592569666330e+00 -4.5377699489069079e-01 -2.0995073220725979e+00 -2.1545897318518290e+00 -8.7482417788055855e-01 -6.1070357028711646e+00 -2.8676166222827679e+00 6.0761641987847059e-01 5.8276850346774856e+00 2.6575634601008158e+00 5.7931843092648017e-01 3.6582310416655668e+00 2.5924907235104375e+00 -7.4602921965019564e-01 -3.3220280558667117e+00 -2.2271365224565081e+00 -1.1099266954369891e+00 -2.7624034545251939e+00 -7.2031065806393109e+00 1.5433540161911479e+00 2.2518292844988004e+00 7.3044426043948256e+00 1.5362975495210167e+00 2.5077600677667218e+00 5.4162855032949153e+00 -1.0254892588002362e+00 -2.1043851013997199e+00 -6.0219049140002223e+00 -1.6876630532585788e+00 -2.8755708884683298e+00 -9.8532406564210309e+00 1.3409332112267158e+00 2.6575634601008158e+00 1.0519107339886098e+01 1.0826595433575876e+00 2.5785593923570231e+00 7.1539534696884948e+00 -1.6801653128006662e+00 -2.2533527603301144e+00 -7.3155367662037687e+00 -1.3793938648598716e+00 -5.8044186901795625e-01 -9.4044440041650246e-01 1.5292732394674926e+00 6.0658573416904549e-01 1.1638932710779635e+00 2.6986720192534599e+00 8.4169715904584241e-01 1.3547234810938589e+00 -2.5447009695652163e+00 -4.9445102900464799e-01 -1.0254982477334926e+00 -2.7313164903732319e+00 -7.7158412821213829e-01 -1.2012601471451125e+00 2.5695121467593238e+00 5.7931843092648005e-01 1.0826595433575876e+00 4.9479530417135074e+00 7.0593017226498178e-01 1.1463061896268456e+00 -5.0899991223954650e+00 -8.8705447017160677e-01 -1.5803796898611475e+00 -6.0389448872543983e-01 -2.7716645657439729e+00 -2.6111992621818514e+00 8.8779783714102523e-01 2.3607094748384299e+00 2.4787525000192518e+00 8.1908002829377946e-01 3.9541911310720819e+00 2.6215670956168160e+00 -5.6783762154096806e-01 -3.6057673398545345e+00 -2.6756483970505807e+00 -9.8040839374256339e-01 -4.0649692238946082e+00 -2.7123527332875441e+00 5.9498862025061539e-01 3.6582310416655668e+00 2.5785593923570231e+00 7.0593017226498156e-01 6.5682837782403611e+00 3.0569917010875534e+00 -8.5565615394143180e-01 -6.0990142963233218e+00 -2.7366702965606677e+00 -9.6537437456550612e-01 -2.5762880295739290e+00 -5.3432246739470850e+00 1.4917044126598284e+00 2.1443012297851984e+00 5.4493985095534594e+00 1.3033382709311303e+00 2.5963593372968825e+00 6.4680568898319883e+00 -9.9859305045614155e-01 -2.2928143951339561e+00 -7.0371756414409425e+00 -1.5545297040076589e+00 -2.7529291108082390e+00 -6.5963447473872741e+00 1.1170459862324917e+00 2.5924907235104375e+00 7.1539534696884948e+00 1.1463061896268456e+00 3.0569917010875525e+00 9.6366058044682372e+00 -1.5398977304209907e+00 -2.7681114561639446e+00 -9.7312696107668764e+00 1.5045935555340648e+00 8.6283949281353323e-01 1.4705270332331672e+00 -1.8367075311078900e+00 -7.7611452425313820e-01 -1.7131698468438250e+00 -3.0170273935511145e+00 -9.9349291222774083e-01 -1.6953046793739344e+00 2.6913196737622687e+00 6.2716394571772227e-01 1.4129236391990116e+00 3.0033848191979229e+00 9.5742592851131059e-01 1.7517619749981412e+00 -2.7511531911086600e+00 -7.4602921965019564e-01 -1.6801653128006659e+00 -5.0899991223954650e+00 -8.5565615394143191e-01 -1.5398977304209907e+00 5.4955891896688716e+00 9.2386344302993939e-01 1.9933249220090967e+00 6.2344956107044014e-01 2.3303518462827233e+00 2.1619125085063962e+00 -7.9489016114719957e-01 -2.0744700070337183e+00 -2.0161274358105854e+00 -8.9156482543757021e-01 -3.5808491349186982e+00 -2.1786527389070738e+00 6.6221718714870792e-01 3.2766542092277016e+00 2.1792278530525344e+00 9.7290196855994493e-01 3.6071106524629521e+00 2.4478403965237066e+00 -6.0892270305265483e-01 -3.3220280558667117e+00 -2.2533527603301149e+00 -8.8705447017160666e-01 -6.0990142963233218e+00 -2.7681114561639450e+00 9.2386344302993939e-01 5.8622447861690716e+00 2.4272636331290824e+00 1.1881685489157225e+00 2.4495551767268382e+00 5.4122876283243757e+00 -1.7396349435368235e+00 -1.9989257153618614e+00 -5.5797130587323531e+00 -1.7443546613343921e+00 -2.4971734696375365e+00 -6.5659773124604852e+00 1.4709778763710915e+00 2.1524621243132009e+00 7.1037901207165204e+00 1.7655572525507808e+00 2.4306250698474501e+00 6.7157969441048566e+00 -1.3536593051143264e+00 -2.2271365224565081e+00 -7.3155367662037705e+00 -1.5803796898611475e+00 -2.7366702965606677e+00 -9.7312696107668764e+00 1.9933249220090967e+00 2.4272636331290820e+00 9.9606220550177333e+00 954 955 956 1002 1003 1004 1014 1015 1016 966 967 968 957 958 959 1005 1006 1007 1017 1018 1019 969 970 971 5.5316829009681205e+00 5.0151138118107556e-02 3.3082171589065906e-01 -5.4733713969791626e+00 -1.0991806202044870e-01 -8.2383542593797399e-01 -2.8069230587731338e+00 -8.7634083626834905e-02 -5.2693538191435185e-01 2.7493890653756434e+00 2.8726963716714116e-02 2.8427277783408150e-01 2.7050387375269596e+00 1.1665197372288853e-01 7.3295005947651082e-01 -2.6910850213580217e+00 -1.6923786927017827e-02 -2.4477933480314459e-01 -1.3764171585805693e+00 -3.9847113685625775e-02 -2.3834042431312785e-01 1.3616859318201660e+00 5.8792970702216923e-02 4.8584601376734687e-01 5.0151138118107584e-02 5.7196227729162876e+00 1.2862918039156934e+00 -1.0403272433187991e-01 -5.4725074584734816e+00 -7.8789511905132981e-01 -1.4775214252437968e-01 -2.9544905989312364e+00 -1.1815900757686124e+00 2.6576256806250143e-02 2.7759394857683830e+00 6.9808853332996335e-01 1.1255452146197537e-01 2.8509250237110439e+00 1.1538499454331537e+00 -3.1149228780962039e-02 -2.7315361563111629e+00 -9.2348582505607557e-01 -3.9392531430915263e-02 -1.5496390005000029e+00 -1.1101949849207622e+00 1.3304471068180382e-01 1.3616859318201664e+00 8.6493572211796921e-01 3.3082171589065906e-01 1.2862918039156934e+00 1.3732183251959698e+01 -8.0068812393865851e-01 -8.2453927803020144e-01 -1.3627462200231468e+01 -9.0602198442019732e-01 -1.1941454077498226e+00 -9.9620515156886196e+00 2.8246536801312844e-01 7.4850281677793673e-01 1.0109171929937180e+01 7.1342042398499661e-01 1.1580076735324518e+00 9.9194617692726244e+00 -2.4638720198279965e-01 -5.3647727566505354e-01 -1.0119494841312967e+01 -2.3854591966509747e-01 -1.1234863465483542e+00 -8.2414424560230994e+00 8.6493572211796887e-01 4.8584601376734760e-01 8.1896340620866539e+00 -5.4733713969791626e+00 -1.0403272433187991e-01 -8.0068812393865851e-01 5.6581172146511687e+00 4.9914677838659258e-02 1.2926891984033670e+00 2.9398414113902920e+00 1.1142696222569254e-01 1.1534601863274567e+00 -2.8056053989099303e+00 -3.0627796003241781e-02 -9.2270604289022062e-01 -2.8841670725029780e+00 -1.5058375811157079e-01 -1.2016119255560904e+00 2.7204169228832371e+00 2.8129232947033195e-02 7.2942549644363952e-01 1.3944073199673763e+00 1.3562051912093362e-01 8.7291755775885749e-01 -1.5496390005000025e+00 -3.9847113685625830e-02 -1.1234863465483511e+00 -1.0991806202044870e-01 -5.4725074584734807e+00 -8.2453927803020144e-01 4.9914677838659244e-02 5.4670318888641924e+00 3.2619562042973504e-01 1.1683331789670973e-01 2.7937325158940975e+00 7.3667624635404561e-01 -1.6635548179856886e-02 -2.7651422730614850e+00 -2.4242564726262872e-01 -8.7737173832900001e-02 -2.7336376897160393e+00 -5.2690199420086814e-01 2.8169602441181975e-02 2.6925328551059060e+00 2.8366913988787529e-01 5.8765717287569533e-02 1.3944073199673759e+00 4.8587183248713778e-01 -3.9392531430914896e-02 -1.3764171585805696e+00 -2.3854591966509545e-01 -8.2383542593797399e-01 -7.8789511905132981e-01 -1.3627462200231470e+01 1.2926891984033670e+00 3.2619562042973510e-01 1.3646358188752847e+01 1.1482612535435508e+00 6.9657811084822130e-01 9.9646325630428798e+00 -5.3263917465113619e-01 -2.3912609724345912e-01 -1.0143889324139895e+01 -1.1997234510172869e+00 -9.1599999571839352e-01 -9.9377379305883373e+00 7.3957075209310108e-01 2.8567034728949608e-01 1.0107411116559206e+01 4.8587183248713972e-01 8.7291755775886060e-01 8.2321300426278707e+00 -1.1101949849207620e+00 -2.3834042431312860e-01 -8.2414424560231012e+00 -2.8069230587731338e+00 -1.4775214252437968e-01 -9.0602198442019743e-01 2.9398414113902920e+00 1.1683331789670970e-01 1.1482612535435508e+00 5.7978582387057287e+00 2.0244657225435941e-01 1.2658328036351769e+00 -5.6136454099372362e+00 -5.2352607536830742e-02 -7.8305388951735921e-01 -1.5505627680605352e+00 -1.8036939916854217e-01 -1.1046442029835188e+00 1.3941896697120240e+00 3.7401380479826017e-02 8.7719331664394928e-01 2.7937325158940958e+00 1.1142696222569268e-01 6.9657811084821930e-01 -2.9544905989312351e+00 -8.7634083626834933e-02 -1.1941454077498206e+00 -8.7634083626834891e-02 -2.9544905989312364e+00 -1.1941454077498228e+00 1.1142696222569254e-01 2.7937325158940975e+00 6.9657811084822119e-01 2.0244657225435944e-01 5.7978582387057296e+00 1.2658328036351791e+00 -5.2352607536830929e-02 -5.6136454099372362e+00 -7.8305388951736155e-01 -1.8036939916854244e-01 -1.5505627680605352e+00 -1.1046442029835204e+00 3.7401380479826177e-02 1.3941896697120237e+00 8.7719331664395139e-01 1.1683331789671010e-01 2.9398414113902915e+00 1.1482612535435528e+00 -1.4775214252437996e-01 -2.8069230587731333e+00 -9.0602198442019921e-01 -5.2693538191435185e-01 -1.1815900757686124e+00 -9.9620515156886196e+00 1.1534601863274565e+00 7.3667624635404561e-01 9.9646325630428834e+00 1.2658328036351767e+00 1.2658328036351791e+00 1.3580557759939611e+01 -8.3708956337163842e-01 -8.3708956337163853e-01 -1.3740462402735560e+01 -1.1005650971542713e+00 -1.1005650971542713e+00 -8.0756664862206922e+00 4.9021088189219253e-01 4.9021088189219236e-01 8.2304090343081224e+00 7.3667624635404727e-01 1.1534601863274596e+00 9.9646325630428780e+00 -1.1815900757686117e+00 -5.2693538191435241e-01 -9.9620515156886178e+00 2.7493890653756434e+00 2.6576256806250136e-02 2.8246536801312838e-01 -2.8056053989099308e+00 -1.6635548179856883e-02 -5.3263917465113608e-01 -5.6136454099372362e+00 -5.2352607536830915e-02 -8.3708956337163853e-01 5.6736617573775510e+00 1.4841077507197041e-02 3.3173796703059372e-01 1.3611715075544899e+00 3.6916711984736124e-02 4.8633948548740957e-01 -1.3757687341674159e+00 -7.4450582949678505e-03 -2.4019080204283497e-01 -2.7651422730614827e+00 -3.0627796003241836e-02 -2.3912609724345896e-01 2.7759394857683812e+00 2.8726963716714127e-02 7.4850281677793684e-01 2.8726963716714120e-02 2.7759394857683830e+00 7.4850281677793684e-01 -3.0627796003241781e-02 -2.7651422730614850e+00 -2.3912609724345912e-01 -5.2352607536830728e-02 -5.6136454099372370e+00 -8.3708956337163898e-01 1.4841077507197041e-02 5.6736617573775519e+00 3.3173796703059399e-01 3.6916711984736152e-02 1.3611715075544897e+00 4.8633948548740946e-01 -7.4450582949679425e-03 -1.3757687341674159e+00 -2.4019080204283499e-01 -1.6635548179857004e-02 -2.8056053989099294e+00 -5.3263917465113586e-01 2.6576256806250160e-02 2.7493890653756421e+00 2.8246536801312838e-01 2.8427277783408156e-01 6.9808853332996346e-01 1.0109171929937178e+01 -9.2270604289022062e-01 -2.4242564726262866e-01 -1.0143889324139895e+01 -7.8305388951735933e-01 -7.8305388951736166e-01 -1.3740462402735556e+01 3.3173796703059372e-01 3.3173796703059399e-01 1.4031312769227547e+01 8.7842090723331201e-01 8.7842090723331190e-01 8.1878285853260930e+00 -2.4433460575773958e-01 -2.4433460575773930e-01 -8.4092441634126427e+00 -2.4242564726263058e-01 -9.2270604289022373e-01 -1.0143889324139895e+01 6.9808853332996279e-01 2.8427277783408217e-01 1.0109171929937176e+01 2.7050387375269600e+00 1.1255452146197534e-01 7.1342042398499650e-01 -2.8841670725029780e+00 -8.7737173832900001e-02 -1.1997234510172869e+00 -1.5505627680605352e+00 -1.8036939916854247e-01 -1.1005650971542713e+00 1.3611715075544897e+00 3.6916711984736152e-02 8.7842090723331190e-01 5.5717938377718639e+00 2.0554654110474058e-01 1.2816336813373597e+00 -5.3205615762848062e+00 -5.2979417161327272e-02 -8.1519414219816810e-01 -2.7336376897160370e+00 -1.5058375811157129e-01 -9.1599999571839341e-01 2.8509250237110422e+00 1.1665197372288862e-01 1.1580076735324518e+00 1.1665197372288852e-01 2.8509250237110439e+00 1.1580076735324518e+00 -1.5058375811157079e-01 -2.7336376897160388e+00 -9.1599999571839352e-01 -1.8036939916854214e-01 -1.5505627680605349e+00 -1.1005650971542713e+00 3.6916711984736131e-02 1.3611715075544897e+00 8.7842090723331179e-01 2.0554654110474060e-01 5.5717938377718657e+00 1.2816336813373592e+00 -5.2979417161327279e-02 -5.3205615762848062e+00 -8.1519414219816833e-01 -8.7737173832900250e-02 -2.8841670725029762e+00 -1.1997234510172869e+00 1.1255452146197524e-01 2.7050387375269582e+00 7.1342042398499661e-01 7.3295005947651082e-01 1.1538499454331537e+00 9.9194617692726261e+00 -1.2016119255560904e+00 -5.2690199420086814e-01 -9.9377379305883373e+00 -1.1046442029835188e+00 -1.1046442029835206e+00 -8.0756664862206922e+00 4.8633948548740957e-01 4.8633948548740941e-01 8.1878285853260913e+00 1.2816336813373597e+00 1.2816336813373592e+00 1.3421811817207074e+01 -8.2161504899395421e-01 -8.2161504899395388e-01 -1.3497421593681052e+01 -5.2690199420086992e-01 -1.2016119255560935e+00 -9.9377379305883338e+00 1.1538499454331534e+00 7.3295005947651126e-01 9.9194617692726190e+00 -2.6910850213580222e+00 -3.1149228780962043e-02 -2.4638720198279965e-01 2.7204169228832371e+00 2.8169602441181975e-02 7.3957075209310130e-01 1.3941896697120240e+00 3.7401380479826177e-02 4.9021088189219247e-01 -1.3757687341674159e+00 -7.4450582949679451e-03 -2.4433460575773958e-01 -5.3205615762848071e+00 -5.2979417161327300e-02 -8.2161504899395421e-01 5.3118120404202402e+00 1.4797275296233720e-02 3.3336215112475709e-01 2.6925328551059042e+00 2.8129232947033397e-02 2.8567034728949620e-01 -2.7315361563111611e+00 -1.6923786927017907e-02 -5.3647727566505365e-01 -1.6923786927017830e-02 -2.7315361563111629e+00 -5.3647727566505354e-01 2.8129232947033202e-02 2.6925328551059060e+00 2.8567034728949614e-01 3.7401380479826017e-02 1.3941896697120237e+00 4.9021088189219231e-01 -7.4450582949678514e-03 -1.3757687341674156e+00 -2.4433460575773930e-01 -5.2979417161327272e-02 -5.3205615762848062e+00 -8.2161504899395388e-01 1.4797275296233720e-02 5.3118120404202402e+00 3.3336215112475676e-01 2.8169602441181954e-02 2.7204169228832358e+00 7.3957075209310086e-01 -3.1149228780961900e-02 -2.6910850213580209e+00 -2.4638720198279918e-01 -2.4477933480314459e-01 -9.2348582505607546e-01 -1.0119494841312967e+01 7.2942549644363952e-01 2.8366913988787534e-01 1.0107411116559208e+01 8.7719331664394939e-01 8.7719331664395117e-01 8.2304090343081224e+00 -2.4019080204283497e-01 -2.4019080204283499e-01 -8.4092441634126427e+00 -8.1519414219816833e-01 -8.1519414219816844e-01 -1.3497421593681052e+01 3.3336215112475709e-01 3.3336215112475670e-01 1.3700424172293097e+01 2.8366913988787740e-01 7.2942549644364263e-01 1.0107411116559206e+01 -9.2348582505607535e-01 -2.4477933480314529e-01 -1.0119494841312966e+01 -1.3764171585805693e+00 -3.9392531430915263e-02 -2.3854591966509747e-01 1.3944073199673763e+00 5.8765717287569533e-02 4.8587183248713972e-01 2.7937325158940958e+00 1.1683331789671009e-01 7.3667624635404727e-01 -2.7651422730614827e+00 -1.6635548179857001e-02 -2.4242564726263055e-01 -2.7336376897160370e+00 -8.7737173832900264e-02 -5.2690199420086992e-01 2.6925328551059042e+00 2.8169602441181957e-02 2.8366913988787734e-01 5.4670318888641862e+00 4.9914677838659591e-02 3.2619562042973654e-01 -5.4725074584734728e+00 -1.0991806202044858e-01 -8.2453927803020277e-01 -3.9847113685625782e-02 -1.5496390005000029e+00 -1.1234863465483542e+00 1.3562051912093362e-01 1.3944073199673761e+00 8.7291755775886060e-01 1.1142696222569271e-01 2.9398414113902911e+00 1.1534601863274598e+00 -3.0627796003241843e-02 -2.8056053989099294e+00 -9.2270604289022395e-01 -1.5058375811157129e-01 -2.8841670725029762e+00 -1.2016119255560933e+00 2.8129232947033397e-02 2.7204169228832358e+00 7.2942549644364252e-01 4.9914677838659598e-02 5.6581172146511616e+00 1.2926891984033697e+00 -1.0403272433188039e-01 -5.4733713969791564e+00 -8.0068812393866173e-01 -2.3834042431312780e-01 -1.1101949849207622e+00 -8.2414424560230994e+00 8.7291755775885738e-01 4.8587183248713778e-01 8.2321300426278725e+00 6.9657811084821930e-01 1.1482612535435526e+00 9.9646325630428780e+00 -2.3912609724345890e-01 -5.3263917465113586e-01 -1.0143889324139893e+01 -9.1599999571839341e-01 -1.1997234510172867e+00 -9.9377379305883338e+00 2.8567034728949625e-01 7.3957075209310075e-01 1.0107411116559204e+01 3.2619562042973643e-01 1.2926891984033695e+00 1.3646358188752837e+01 -7.8789511905132925e-01 -8.2383542593797410e-01 -1.3627462200231458e+01 1.3616859318201660e+00 1.3304471068180385e-01 8.6493572211796876e-01 -1.5496390005000025e+00 -3.9392531430914896e-02 -1.1101949849207617e+00 -2.9544905989312342e+00 -1.4775214252437996e-01 -1.1815900757686115e+00 2.7759394857683812e+00 2.6576256806250156e-02 6.9808853332996268e-01 2.8509250237110422e+00 1.1255452146197527e-01 1.1538499454331534e+00 -2.7315361563111611e+00 -3.1149228780961900e-02 -9.2348582505607535e-01 -5.4725074584734728e+00 -1.0403272433188039e-01 -7.8789511905132936e-01 5.7196227729162814e+00 5.0151138118107591e-02 1.2862918039156928e+00 5.8792970702216923e-02 1.3616859318201664e+00 4.8584601376734760e-01 -3.9847113685625830e-02 -1.3764171585805696e+00 -2.3834042431312863e-01 -8.7634083626834919e-02 -2.8069230587731333e+00 -5.2693538191435241e-01 2.8726963716714120e-02 2.7493890653756408e+00 2.8427277783408217e-01 1.1665197372288862e-01 2.7050387375269578e+00 7.3295005947651126e-01 -1.6923786927017907e-02 -2.6910850213580209e+00 -2.4477933480314534e-01 -1.0991806202044860e-01 -5.4733713969791564e+00 -8.2383542593797410e-01 5.0151138118107598e-02 5.5316829009681125e+00 3.3082171589065951e-01 4.8584601376734687e-01 8.6493572211796910e-01 8.1896340620866539e+00 -1.1234863465483509e+00 -2.3854591966509542e-01 -8.2414424560231012e+00 -1.1941454077498208e+00 -9.0602198442019921e-01 -9.9620515156886178e+00 7.4850281677793684e-01 2.8246536801312838e-01 1.0109171929937176e+01 1.1580076735324518e+00 7.1342042398499661e-01 9.9194617692726226e+00 -5.3647727566505365e-01 -2.4638720198279918e-01 -1.0119494841312966e+01 -8.2453927803020299e-01 -8.0068812393866151e-01 -1.3627462200231461e+01 1.2862918039156928e+00 3.3082171589065951e-01 1.3732183251959693e+01 1002 1003 1004 1050 1051 1052 1062 1063 1064 1014 1015 1016 1005 1006 1007 1053 1054 1055 1065 1066 1067 1017 1018 1019 5.3628546945845050e+00 4.6720167388094647e-02 3.0377339433328054e-01 -5.2974421463714751e+00 -1.0905372038092877e-01 -8.0485923486875288e-01 -2.6499267329681957e+00 -8.5249774901391503e-02 -5.0243191918020735e-01 2.5953938490718635e+00 2.5492620618017485e-02 2.5945333810712584e-01 2.6879457935544924e+00 1.1655126857118660e-01 7.2190310126835033e-01 -2.6803117009034150e+00 -1.5858073959785411e-02 -2.2600855808735956e-01 -1.3343999726276774e+00 -3.7019626986788387e-02 -2.1819683412348673e-01 1.3158862156598987e+00 5.8417139651595430e-02 4.6636671255104956e-01 4.6720167388094647e-02 5.5541867141888730e+00 1.2708907192064378e+00 -1.0317773842712910e-01 -5.2958371591519056e+00 -7.6892597848879296e-01 -1.4813768440847236e-01 -2.8019192458537843e+00 -1.1685128653850310e+00 2.3601978024654972e-02 2.6191076355573641e+00 6.8335338562568826e-01 1.1024561980007656e-01 2.8380057900453264e+00 1.1430051577934690e+00 -2.8082804589146654e-02 -2.7196464851003186e+00 -9.0922761681748454e-01 -3.5164980307842320e-02 -1.5097834653454545e+00 -1.1007431347072278e+00 1.3399544251976422e-01 1.3158862156598992e+00 8.5016033277294145e-01 3.0377339433328060e-01 1.2708907192064378e+00 1.3317196233465944e+01 -7.7104869135397347e-01 -7.9463445428933699e-01 -1.3207473471738718e+01 -8.8977285005622786e-01 -1.1747503227155520e+00 -9.5610839296565473e+00 2.5034556220305532e-01 7.1616218772690332e-01 9.7222291439184580e+00 6.8382786698352505e-01 1.1400068534737369e+00 9.7033238609204808e+00 -2.1989018281668113e-01 -5.2059922690268090e-01 -9.9189715811998003e+00 -2.0739543206591773e-01 -1.1034424690505564e+00 -7.9958839760999822e+00 8.5016033277293901e-01 4.6636671255105100e-01 7.9406637203901598e+00 -5.2974421463714751e+00 -1.0317773842712910e-01 -7.7104869135397325e-01 5.4870209088773052e+00 4.5184945548347524e-02 1.2711341520756947e+00 2.7861152112329695e+00 1.1035620569763734e-01 1.1304726415589350e+00 -2.6506699240323903e+00 -2.7480096712767660e-02 -9.0082315059649598e-01 -2.8707194155703215e+00 -1.4878766423809556e-01 -1.1811265940803897e+00 2.7067668499340485e+00 2.5943563367954049e-02 7.0275843280022388e-01 1.3487119812753159e+00 1.3498041175084186e-01 8.5207567864656586e-01 -1.5097834653454547e+00 -3.7019626986788824e-02 -1.1034424690505595e+00 -1.0905372038092877e-01 -5.2958371591519056e+00 -7.9463445428933699e-01 4.5184945548347503e-02 5.2946501648054971e+00 2.9261275272932075e-01 1.1383089454279870e-01 2.6354007137056623e+00 7.0451361137819712e-01 -1.3263394099665855e-02 -2.6127667318398689e+00 -2.0694086966130903e-01 -8.5224098312148971e-02 -2.7162318103602834e+00 -5.0321925065826056e-01 2.6107440462786922e-02 2.6804728141932599e+00 2.5498781534499448e-01 5.7582912546652931e-02 1.3487119812753159e+00 4.6007582722231372e-01 -3.5164980307842458e-02 -1.3343999726276774e+00 -2.0739543206591946e-01 -8.0485923486875288e-01 -7.6892597848879296e-01 -1.3207473471738718e+01 1.2711341520756947e+00 2.9261275272932080e-01 1.3228410942009839e+01 1.1326825628665420e+00 6.8259550934125346e-01 9.5645717881713335e+00 -5.0190087269079264e-01 -2.1088636112140299e-01 -9.7597364222906382e+00 -1.1870612891669636e+00 -8.9340389854414726e-01 -9.7223440913786874e+00 7.3067198926918620e-01 2.6412913156069245e-01 9.9059319556251975e+00 4.6007582722231183e-01 8.5207567864656253e-01 7.9865232757016527e+00 -1.1007431347072254e+00 -2.1819683412348839e-01 -7.9958839760999822e+00 -2.6499267329681961e+00 -1.4813768440847236e-01 -8.8977285005622786e-01 2.7861152112329695e+00 1.1383089454279868e-01 1.1326825628665420e+00 5.3576728768278548e+00 2.0262417384871287e-01 1.2389885700397980e+00 -5.1685533254668474e+00 -4.7127562000394592e-02 -7.6359977692460490e-01 -1.5087336968992411e+00 -1.8086016042326233e-01 -1.0902203939227857e+00 1.3499441994215824e+00 3.4563907644372581e-02 8.6407670137157710e-01 2.6354007137056561e+00 1.1035620569763657e-01 6.8259550934125246e-01 -2.8019192458537781e+00 -8.5249774901391726e-02 -1.1747503227155507e+00 -8.5249774901391503e-02 -2.8019192458537843e+00 -1.1747503227155522e+00 1.1035620569763732e-01 2.6354007137056623e+00 6.8259550934125346e-01 2.0262417384871287e-01 5.3576728768278548e+00 1.2389885700397998e+00 -4.7127562000394786e-02 -5.1685533254668474e+00 -7.6359977692460645e-01 -1.8086016042326289e-01 -1.5087336968992409e+00 -1.0902203939227868e+00 3.4563907644372741e-02 1.3499441994215824e+00 8.6407670137157844e-01 1.1383089454279834e-01 2.7861152112329628e+00 1.1326825628665433e+00 -1.4813768440847205e-01 -2.6499267329681899e+00 -8.8977285005622930e-01 -5.0243191918020724e-01 -1.1685128653850310e+00 -9.5610839296565473e+00 1.1304726415589350e+00 7.0451361137819712e-01 9.5645717881713335e+00 1.2389885700397980e+00 1.2389885700398000e+00 1.2795048503431332e+01 -7.9252862173690142e-01 -7.9252862173690242e-01 -1.2967636097432536e+01 -1.0824098842518513e+00 -1.0824098842518488e+00 -7.8171004230266945e+00 4.7190846757706045e-01 4.7190846757705956e-01 7.9827122999983278e+00 7.0451361137819435e-01 1.1304726415589317e+00 9.5645717881713264e+00 -1.1685128653850276e+00 -5.0243191918020857e-01 -9.5610839296565402e+00 2.5953938490718635e+00 2.3601978024654968e-02 2.5034556220305532e-01 -2.6506699240323903e+00 -1.3263394099665851e-02 -5.0190087269079264e-01 -5.1685533254668474e+00 -4.7127562000394786e-02 -7.9252862173690142e-01 5.2391206105241297e+00 1.2178429032018824e-02 2.9172829658084348e-01 1.3140017813871783e+00 3.2530261458049929e-02 4.6034424736012569e-01 -1.3356338952014288e+00 -5.9322363199130748e-03 -2.1326443832183073e-01 -2.6127667318398622e+00 -2.7480096712767507e-02 -2.1088636112140213e-01 2.6191076355573579e+00 2.5492620618017558e-02 7.1616218772690232e-01 2.5492620618017478e-02 2.6191076355573641e+00 7.1616218772690332e-01 -2.7480096712767663e-02 -2.6127667318398689e+00 -2.1088636112140302e-01 -4.7127562000394585e-02 -5.1685533254668474e+00 -7.9252862173690253e-01 1.2178429032018826e-02 5.2391206105241315e+00 2.9172829658084426e-01 3.2530261458049964e-02 1.3140017813871783e+00 4.6034424736012597e-01 -5.9322363199131554e-03 -1.3356338952014288e+00 -2.1326443832183109e-01 -1.3263394099665740e-02 -2.6506699240323832e+00 -5.0190087269079264e-01 2.3601978024654871e-02 2.5953938490718573e+00 2.5034556220305543e-01 2.5945333810712579e-01 6.8335338562568815e-01 9.7222291439184580e+00 -9.0082315059649587e-01 -2.0694086966130909e-01 -9.7597364222906382e+00 -7.6359977692460490e-01 -7.6359977692460645e-01 -1.2967636097432537e+01 2.9172829658084348e-01 2.9172829658084415e-01 1.3279192317649269e+01 8.5751784941238518e-01 8.5751784941238229e-01 7.9405362328902758e+00 -2.2068907254363246e-01 -2.2068907254363151e-01 -8.1770778963626487e+00 -2.0694086966130712e-01 -9.0082315059649276e-01 -9.7597364222906329e+00 6.8335338562568571e-01 2.5945333810712728e-01 9.7222291439184509e+00 2.6879457935544924e+00 1.1024561980007655e-01 6.8382786698352493e-01 -2.8707194155703215e+00 -8.5224098312148985e-02 -1.1870612891669636e+00 -1.5087336968992409e+00 -1.8086016042326289e-01 -1.0824098842518513e+00 1.3140017813871783e+00 3.2530261458049957e-02 8.5751784941238518e-01 5.6974237881044694e+00 2.0610152284928671e-01 1.2692587333838437e+00 -5.4416922302616220e+00 -5.0556749705092427e-02 -7.8773623129052872e-01 -2.7162318103602767e+00 -1.4878766423809531e-01 -8.9340389854414992e-01 2.8380057900453197e+00 1.1655126857118675e-01 1.1400068534737395e+00 1.1655126857118660e-01 2.8380057900453264e+00 1.1400068534737369e+00 -1.4878766423809556e-01 -2.7162318103602834e+00 -8.9340389854414726e-01 -1.8086016042326233e-01 -1.5087336968992409e+00 -1.0824098842518488e+00 3.2530261458049929e-02 1.3140017813871783e+00 8.5751784941238252e-01 2.0610152284928668e-01 5.6974237881044694e+00 1.2692587333838401e+00 -5.0556749705092489e-02 -5.4416922302616229e+00 -7.8773623129052583e-01 -8.5224098312148652e-02 -2.8707194155703140e+00 -1.1870612891669605e+00 1.1024561980007577e-01 2.6879457935544862e+00 6.8382786698352227e-01 7.2190310126835033e-01 1.1430051577934688e+00 9.7033238609204808e+00 -1.1811265940803897e+00 -5.0321925065826056e-01 -9.7223440913786874e+00 -1.0902203939227857e+00 -1.0902203939227868e+00 -7.8171004230266945e+00 4.6034424736012569e-01 4.6034424736012597e-01 7.9405362328902758e+00 1.2692587333838434e+00 1.2692587333838401e+00 1.3382151954685114e+01 -8.1994500114435154e-01 -8.1994500114435054e-01 -1.3467547303632287e+01 -5.0321925065825834e-01 -1.1811265940803861e+00 -9.7223440913786803e+00 1.1430051577934659e+00 7.2190310126835100e-01 9.7033238609204719e+00 -2.6803117009034150e+00 -2.8082804589146648e-02 -2.1989018281668113e-01 2.7067668499340489e+00 2.6107440462786922e-02 7.3067198926918597e-01 1.3499441994215824e+00 3.4563907644372741e-02 4.7190846757706040e-01 -1.3356338952014288e+00 -5.9322363199131528e-03 -2.2068907254363249e-01 -5.4416922302616220e+00 -5.0556749705092482e-02 -8.1994500114435154e-01 5.4401004479178932e+00 1.3814953098823905e-02 3.1441389500040734e-01 2.6804728141932523e+00 2.5943563367954114e-02 2.6412913156069312e-01 -2.7196464851003124e+00 -1.5858073959785501e-02 -5.2059922690268146e-01 -1.5858073959785411e-02 -2.7196464851003186e+00 -5.2059922690268090e-01 2.5943563367954049e-02 2.6804728141932599e+00 2.6412913156069251e-01 3.4563907644372581e-02 1.3499441994215822e+00 4.7190846757705951e-01 -5.9322363199130748e-03 -1.3356338952014288e+00 -2.2068907254363146e-01 -5.0556749705092448e-02 -5.4416922302616229e+00 -8.1994500114435043e-01 1.3814953098823910e-02 5.4401004479178949e+00 3.1441389500040623e-01 2.6107440462786791e-02 2.7067668499340423e+00 7.3067198926918453e-01 -2.8082804589146398e-02 -2.6803117009034083e+00 -2.1989018281667974e-01 -2.2600855808735956e-01 -9.0922761681748443e-01 -9.9189715811998003e+00 7.0275843280022388e-01 2.5498781534499454e-01 9.9059319556251975e+00 8.6407670137157710e-01 8.6407670137157844e-01 7.9827122999983278e+00 -2.1326443832183073e-01 -2.1326443832183109e-01 -8.1770778963626487e+00 -7.8773623129052861e-01 -7.8773623129052583e-01 -1.3467547303632283e+01 3.1441389500040728e-01 3.1441389500040612e-01 1.3687992151145808e+01 2.5498781534499243e-01 7.0275843280022077e-01 9.9059319556251886e+00 -9.0922761681748188e-01 -2.2600855808736112e-01 -9.9189715811997896e+00 -1.3343999726276770e+00 -3.5164980307842313e-02 -2.0739543206591773e-01 1.3487119812753159e+00 5.7582912546652931e-02 4.6007582722231183e-01 2.6354007137056561e+00 1.1383089454279831e-01 7.0451361137819435e-01 -2.6127667318398626e+00 -1.3263394099665740e-02 -2.0694086966130718e-01 -2.7162318103602767e+00 -8.5224098312148638e-02 -5.0321925065825834e-01 2.6804728141932523e+00 2.6107440462786791e-02 2.5498781534499237e-01 5.2946501648054731e+00 4.5184945548346955e-02 2.9261275272931780e-01 -5.2958371591518816e+00 -1.0905372038092838e-01 -7.9463445428933310e-01 -3.7019626986788380e-02 -1.5097834653454547e+00 -1.1034424690505564e+00 1.3498041175084186e-01 1.3487119812753159e+00 8.5207567864656264e-01 1.1035620569763657e-01 2.7861152112329628e+00 1.1304726415589317e+00 -2.7480096712767507e-02 -2.6506699240323832e+00 -9.0082315059649276e-01 -1.4878766423809534e-01 -2.8707194155703140e+00 -1.1811265940803857e+00 2.5943563367954121e-02 2.7067668499340423e+00 7.0275843280022066e-01 4.5184945548346969e-02 5.4870209088772803e+00 1.2711341520756902e+00 -1.0317773842712831e-01 -5.2974421463714494e+00 -7.7104869135396992e-01 -2.1819683412348675e-01 -1.1007431347072281e+00 -7.9958839760999831e+00 8.5207567864656575e-01 4.6007582722231372e-01 7.9865232757016544e+00 6.8259550934125213e-01 1.1326825628665431e+00 9.5645717881713264e+00 -2.1088636112140213e-01 -5.0190087269079264e-01 -9.7597364222906311e+00 -8.9340389854414992e-01 -1.1870612891669605e+00 -9.7223440913786803e+00 2.6412913156069318e-01 7.3067198926918453e-01 9.9059319556251904e+00 2.9261275272931780e-01 1.2711341520756902e+00 1.3228410942009804e+01 -7.6892597848879007e-01 -8.0485923486875255e-01 -1.3207473471738682e+01 1.3158862156598989e+00 1.3399544251976422e-01 8.5016033277293912e-01 -1.5097834653454547e+00 -3.5164980307842458e-02 -1.1007431347072254e+00 -2.8019192458537781e+00 -1.4813768440847205e-01 -1.1685128653850276e+00 2.6191076355573584e+00 2.3601978024654875e-02 6.8335338562568593e-01 2.8380057900453197e+00 1.1024561980007579e-01 1.1430051577934661e+00 -2.7196464851003119e+00 -2.8082804589146405e-02 -9.0922761681748177e-01 -5.2958371591518816e+00 -1.0317773842712828e-01 -7.6892597848878996e-01 5.5541867141888499e+00 4.6720167388094674e-02 1.2708907192064338e+00 5.8417139651595430e-02 1.3158862156598992e+00 4.6636671255105100e-01 -3.7019626986788824e-02 -1.3343999726276776e+00 -2.1819683412348836e-01 -8.5249774901391726e-02 -2.6499267329681899e+00 -5.0243191918020846e-01 2.5492620618017554e-02 2.5953938490718578e+00 2.5945333810712728e-01 1.1655126857118675e-01 2.6879457935544870e+00 7.2190310126835100e-01 -1.5858073959785501e-02 -2.6803117009034083e+00 -2.2600855808736103e-01 -1.0905372038092838e-01 -5.2974421463714494e+00 -8.0485923486875266e-01 4.6720167388094688e-02 5.3628546945844811e+00 3.0377339433328121e-01 4.6636671255104956e-01 8.5016033277294156e-01 7.9406637203901598e+00 -1.1034424690505595e+00 -2.0739543206591946e-01 -7.9958839760999822e+00 -1.1747503227155507e+00 -8.8977285005622919e-01 -9.5610839296565402e+00 7.1616218772690221e-01 2.5034556220305543e-01 9.7222291439184492e+00 1.1400068534737395e+00 6.8382786698352227e-01 9.7033238609204737e+00 -5.2059922690268146e-01 -2.1989018281667977e-01 -9.9189715811997914e+00 -7.9463445428933333e-01 -7.7104869135397003e-01 -1.3207473471738682e+01 1.2708907192064336e+00 3.0377339433328115e-01 1.3317196233465912e+01 966 967 968 1014 1015 1016 1026 1027 1028 978 979 980 969 970 971 1017 1018 1019 1029 1030 1031 981 982 983 5.5199160891355428e+00 1.0469822752736066e-01 2.9368094920810595e-01 -5.4632492753582866e+00 -2.6045565652337704e-01 -7.6877517881268165e-01 -2.7731164567156186e+00 -1.7914459428915971e-01 -4.7977244889095694e-01 2.7215050710195592e+00 7.6585824887928658e-02 2.5368113563176947e-01 2.7036124553800436e+00 2.4830271632993103e-01 6.7826503478524669e-01 -2.6932942351493381e+00 -5.9309768706404496e-02 -2.1791692006855229e-01 -1.3626642467704240e+00 -7.7111615582930768e-02 -2.0537768418105914e-01 1.3472905984585211e+00 1.4643486635665162e-01 4.4621511232812805e-01 1.0469822752736066e-01 6.4881516212980763e+00 2.7040083033042448e+00 -2.5303192893928955e-01 -6.0830906058563778e+00 -2.2897272959342483e+00 -3.1048577020216483e-01 -3.6265022451964630e+00 -2.3993808582104097e+00 7.1856047925717551e-02 3.2934279228201744e+00 2.0222214812354560e+00 2.4103559884082176e-01 3.5521595790154104e+00 2.4038040173943678e+00 -7.1836112762128382e-02 -3.2888853143869685e+00 -2.2627719215980160e+00 -7.2522937173164090e-02 -2.1966410985370493e+00 -2.2643863542059903e+00 2.9028687478284715e-01 1.8613801408431945e+00 2.0862326280145962e+00 2.9368094920810583e-01 2.7040083033042448e+00 1.2967730482548379e+01 -7.5272810565645898e-01 -2.3156750308955942e+00 -1.3037021127016549e+01 -8.3917367335695314e-01 -2.4159128320277707e+00 -9.1896899894452879e+00 2.4292778155484746e-01 2.0663996307480996e+00 9.5028410331139739e+00 6.6289577955191792e-01 2.4112390139897588e+00 9.2329203035420964e+00 -2.1827096639644042e-01 -1.8916155150916807e+00 -9.5820526042250478e+00 -1.9481585635896120e-01 -2.2848473182549909e+00 -7.5133540351603214e+00 8.0548409145394295e-01 1.7264037482279306e+00 7.6186259366427578e+00 -5.4632492753582866e+00 -2.5303192893928961e-01 -7.5272810565645920e-01 5.6477457233993738e+00 3.0009954137104267e-01 1.2482271245434369e+00 2.9086343339656233e+00 3.2818235272180996e-01 1.0892879815432297e+00 -2.7741331538476381e+00 -2.0494258977755345e-01 -8.7953825593741231e-01 -2.8829588981475829e+00 -3.7709812371157242e-01 -1.1376293949169971e+00 2.7202077362831809e+00 1.6712803615645841e-01 6.9783689476994926e-01 1.3779754830877518e+00 2.9414466309628368e-01 8.0845549555245078e-01 -1.5342219493824236e+00 -2.5448195091717890e-01 -1.0739117398981990e+00 -2.6045565652337704e-01 -6.0830906058563778e+00 -2.3156750308955942e+00 3.0009954137104272e-01 5.9018719351806812e+00 1.8807945276512814e+00 3.3272689359897700e-01 3.3117940381358952e+00 2.0386181947960771e+00 -1.1426654995456570e-01 -3.1099219293789870e+00 -1.6306929219812409e+00 -3.1691247816538104e-01 -3.2882758209135821e+00 -1.8570357589662674e+00 1.6796582649055666e-01 3.0884201913853166e+00 1.6849080685110454e+00 1.4386123322486552e-01 1.8978330310229095e+00 1.7291135653044609e+00 -2.5301881004211824e-01 -1.7186308395758549e+00 -1.5300306444197633e+00 -7.6877517881268154e-01 -2.2897272959342478e+00 -1.3037021127016549e+01 1.2482271245434371e+00 1.8807945276512814e+00 1.3229512526360260e+01 1.0867469478432663e+00 2.0040468237938822e+00 9.3603342996424264e+00 -4.9478820137446250e-01 -1.6228525582742517e+00 -9.7096893956481161e+00 -1.1463927343753397e+00 -2.2359520582251839e+00 -9.4054180690565818e+00 7.0486180236602758e-01 1.6891468784804153e+00 9.7305324992499340e+00 4.3624438116178943e-01 2.1021684345545517e+00 7.6579663828578273e+00 -1.0661241413520366e+00 -1.5276247520464448e+00 -7.8262171163892029e+00 -2.7731164567156186e+00 -3.1048577020216489e-01 -8.3917367335695314e-01 2.9086343339656233e+00 3.3272689359897700e-01 1.0867469478432663e+00 5.6851207901521343e+00 4.3113937672143154e-01 1.1696382411623083e+00 -5.5047731298760478e+00 -1.9294867315709127e-01 -7.2468499472717218e-01 -1.5324481577001041e+00 -3.8241403146906816e-01 -1.0276096819789302e+00 1.3796660697024881e+00 2.0201287677098617e-01 8.3171717141759138e-01 2.7370458349667266e+00 2.3060363067634643e-01 6.2669444334601476e-01 -2.9001292844952018e+00 -3.1063430293941646e-01 -1.1233284537061254e+00 -1.7914459428915971e-01 -3.6265022451964630e+00 -2.4159128320277707e+00 3.2818235272180990e-01 3.3117940381358957e+00 2.0040468237938822e+00 4.3113937672143154e-01 6.4495892387575928e+00 2.6081633483710762e+00 -2.0363554081627597e-01 -6.1136161334168380e+00 -2.2324745214191490e+00 -3.8129742128451671e-01 -2.1939375997099622e+00 -2.2422607878377883e+00 1.2594406761001745e-01 1.8971190823697457e+00 2.1074310557671350e+00 2.4417020226468017e-01 3.5708026227030056e+00 2.3484456504527360e+00 -3.6535844292798692e-01 -3.2952490036429749e+00 -2.1774387371001236e+00 -4.7977244889095683e-01 -2.3993808582104097e+00 -9.1896899894452879e+00 1.0892879815432297e+00 2.0386181947960771e+00 9.3603342996424264e+00 1.1696382411623079e+00 2.6081633483710762e+00 1.2597604960679861e+01 -7.7783648475966305e-01 -2.2863398207044909e+00 -1.2915119361382642e+01 -1.0224836949887488e+00 -2.2375984303951242e+00 -7.3551815767029485e+00 4.5598924643831934e-01 1.7298375973458482e+00 7.6534862619745674e+00 6.6826511405667521e-01 2.3576977650030329e+00 9.1074824059667066e+00 -1.1030879545611643e+00 -1.8109977962060082e+00 -9.2589170007326871e+00 2.7215050710195592e+00 7.1856047925717537e-02 2.4292778155484746e-01 -2.7741331538476381e+00 -1.1426654995456567e-01 -4.9478820137446256e-01 -5.5047731298760469e+00 -2.0363554081627602e-01 -7.7783648475966294e-01 5.5695789473291537e+00 7.0745322630065915e-02 2.8892559605408824e-01 1.3455212378815009e+00 1.2225863193365576e-01 4.4465331371070943e-01 -1.3637812664633411e+00 -4.8144650513478111e-02 -2.0873596059689706e-01 -2.7162507530432420e+00 -6.6224752719872326e-02 -1.9714973957318621e-01 2.7223330470000540e+00 1.6741149151475282e-01 7.0200369498456361e-01 7.6585824887928644e-02 3.2934279228201744e+00 2.0663996307480996e+00 -2.0494258977755345e-01 -3.1099219293789870e+00 -1.6228525582742519e+00 -1.9294867315709130e-01 -6.1136161334168371e+00 -2.2863398207044909e+00 7.0745322630065915e-02 6.0055331421068594e+00 1.8690912012389780e+00 2.0003527387178677e-01 1.8616378743940929e+00 1.7194175969520011e+00 -5.0380010528720223e-02 -1.7208514188252266e+00 -1.5483857775139525e+00 -5.3379080434624068e-02 -3.2986404138832999e+00 -1.8373001079749136e+00 1.5428393250820782e-01 3.0824309561832228e+00 1.6399698355285295e+00 2.5368113563176947e-01 2.0222214812354560e+00 9.5028410331139739e+00 -8.7953825593741219e-01 -1.6306929219812409e+00 -9.7096893956481161e+00 -7.2468499472717207e-01 -2.2324745214191482e+00 -1.2915119361382644e+01 2.8892559605408819e-01 1.8690912012389784e+00 1.3375566200093541e+01 8.3137449502608529e-01 2.1078210805307274e+00 7.6144575938797514e+00 -2.1973961634770359e-01 -1.5590045284396685e+00 -7.9907405294901253e+00 -1.9966957628298382e-01 -2.2199572262453047e+00 -9.4342778303473747e+00 6.4965121658332903e-01 1.6429954350801990e+00 9.5569622897809943e+00 2.7036124553800431e+00 2.4103559884082182e-01 6.6289577955191803e-01 -2.8829588981475829e+00 -3.1691247816538098e-01 -1.1463927343753395e+00 -1.5324481577001041e+00 -3.8129742128451671e-01 -1.0224836949887488e+00 1.3455212378815009e+00 2.0003527387178674e-01 8.3137449502608529e-01 5.5832483517739435e+00 4.4243586595534407e-01 1.1988914796074717e+00 -5.3368330383507629e+00 -2.0490072039562729e-01 -7.7066103585216406e-01 -2.7086598931320256e+00 -3.1304976753398128e-01 -8.4168003074526865e-01 2.8285179422949871e+00 3.3265364871155312e-01 1.0880557417760466e+00 2.4830271632993103e-01 3.5521595790154104e+00 2.4112390139897588e+00 -3.7709812371157242e-01 -3.2882758209135821e+00 -2.2359520582251839e+00 -3.8241403146906827e-01 -2.1939375997099622e+00 -2.2375984303951242e+00 1.2225863193365576e-01 1.8616378743940929e+00 2.1078210805307274e+00 4.4243586595534407e-01 6.3681910994086746e+00 2.6734257208875123e+00 -2.0621745006390363e-01 -5.9608123357110037e+00 -2.3098980140973056e+00 -1.7561092796258848e-01 -3.5719569102159543e+00 -2.4219731871077235e+00 3.2834331898820202e-01 3.2329941137323233e+00 2.0129358744173405e+00 6.7826503478524669e-01 2.4038040173943687e+00 9.2329203035420964e+00 -1.1376293949169973e+00 -1.8570357589662672e+00 -9.4054180690565801e+00 -1.0276096819789300e+00 -2.2422607878377883e+00 -7.3551815767029485e+00 4.4465331371070943e-01 1.7194175969520011e+00 7.6144575938797514e+00 1.1988914796074717e+00 2.6734257208875123e+00 1.2657852651303504e+01 -7.7694210370801453e-01 -2.3157440373724905e+00 -1.2896334690963851e+01 -4.6749242516334039e-01 -2.4176673736536873e+00 -9.1356080654858030e+00 1.0878637776638549e+00 2.0360606225963482e+00 9.2873118534838319e+00 -2.6932942351493376e+00 -7.1836112762128382e-02 -2.1827096639644042e-01 2.7202077362831809e+00 1.6796582649055664e-01 7.0486180236602758e-01 1.3796660697024878e+00 1.2594406761001745e-01 4.5598924643831928e-01 -1.3637812664633411e+00 -5.0380010528720216e-02 -2.1973961634770359e-01 -5.3368330383507629e+00 -2.0621745006390363e-01 -7.7694210370801453e-01 5.3303809680245751e+00 7.5109181526434851e-02 3.0556729170086716e-01 2.6749439849783267e+00 7.6587808320406028e-02 2.5231665671881265e-01 -2.7112902190251300e+00 -1.1717331059266267e-01 -5.0378231077186830e-01 -5.9309768706404503e-02 -3.2888853143869685e+00 -1.8916155150916807e+00 1.6712803615645844e-01 3.0884201913853166e+00 1.6891468784804149e+00 2.0201287677098617e-01 1.8971190823697455e+00 1.7298375973458482e+00 -4.8144650513478111e-02 -1.7208514188252269e+00 -1.5590045284396685e+00 -2.0490072039562723e-01 -5.9608123357110046e+00 -2.3157440373724905e+00 7.5109181526434865e-02 5.7777583259810639e+00 1.9111608475370518e+00 7.3817709251128877e-02 3.2558011425463169e+00 2.0681359649544189e+00 -2.0571266408949856e-01 -3.0485496733592439e+00 -1.6319172074138948e+00 -2.1791692006855229e-01 -2.2627719215980164e+00 -9.5820526042250478e+00 6.9783689476994926e-01 1.6849080685110449e+00 9.7305324992499340e+00 8.3171717141759138e-01 2.1074310557671350e+00 7.6534862619745674e+00 -2.0873596059689706e-01 -1.5483857775139527e+00 -7.9907405294901261e+00 -7.7066103585216406e-01 -2.3098980140973056e+00 -1.2896334690963851e+01 3.0556729170086727e-01 1.9111608475370518e+00 1.3272173446573493e+01 2.4155512397517295e-01 2.0539651065551219e+00 9.4668681278171061e+00 -8.7936256534596768e-01 -1.6364093651610756e+00 -9.6539325109360803e+00 -1.3626642467704240e+00 -7.2522937173164090e-02 -1.9481585635896123e-01 1.3779754830877518e+00 1.4386123322486552e-01 4.3624438116178943e-01 2.7370458349667270e+00 2.4417020226468017e-01 6.6826511405667532e-01 -2.7162507530432416e+00 -5.3379080434624082e-02 -1.9966957628298382e-01 -2.7086598931320256e+00 -1.7561092796258851e-01 -4.6749242516334039e-01 2.6749439849783267e+00 7.3817709251128863e-02 2.4155512397517298e-01 5.3748280681606655e+00 9.7036714450729006e-02 2.6986881242935690e-01 -5.3772184782477801e+00 -2.5737291362102677e-01 -7.5395557381770906e-01 -7.7111615582930768e-02 -2.1966410985370493e+00 -2.2848473182549904e+00 2.9414466309628368e-01 1.8978330310229095e+00 2.1021684345545517e+00 2.3060363067634643e-01 3.5708026227030056e+00 2.3576977650030329e+00 -6.6224752719872326e-02 -3.2986404138832999e+00 -2.2199572262453047e+00 -3.1304976753398128e-01 -3.5719569102159543e+00 -2.4176673736536869e+00 7.6587808320406042e-02 3.2558011425463169e+00 2.0539651065551210e+00 9.7036714450729006e-02 6.3331950117257865e+00 2.6530328995704968e+00 -2.4198668070698090e-01 -5.9903933853617151e+00 -2.2443922875292213e+00 -2.0537768418105914e-01 -2.2643863542059908e+00 -7.5133540351603214e+00 8.0845549555245078e-01 1.7291135653044607e+00 7.6579663828578273e+00 6.2669444334601476e-01 2.3484456504527365e+00 9.1074824059667066e+00 -1.9714973957318621e-01 -1.8373001079749136e+00 -9.4342778303473729e+00 -8.4168003074526865e-01 -2.4219731871077235e+00 -9.1356080654858030e+00 2.5231665671881265e-01 2.0681359649544189e+00 9.4668681278171043e+00 2.6986881242935690e-01 2.6530328995704977e+00 1.2631009183461140e+01 -7.1312795354712155e-01 -2.2750684309934832e+00 -1.2780086169109278e+01 1.3472905984585208e+00 2.9028687478284715e-01 8.0548409145394295e-01 -1.5342219493824236e+00 -2.5301881004211829e-01 -1.0661241413520366e+00 -2.9001292844952022e+00 -3.6535844292798697e-01 -1.1030879545611643e+00 2.7223330470000540e+00 1.5428393250820782e-01 6.4965121658332903e-01 2.8285179422949871e+00 3.2834331898820207e-01 1.0878637776638547e+00 -2.7112902190251300e+00 -2.0571266408949856e-01 -8.7936256534596768e-01 -5.3772184782477801e+00 -2.4198668070698082e-01 -7.1312795354712155e-01 5.6247183433969745e+00 2.9316247148732733e-01 1.2187035291051638e+00 1.4643486635665159e-01 1.8613801408431945e+00 1.7264037482279306e+00 -2.5448195091717896e-01 -1.7186308395758549e+00 -1.5276247520464448e+00 -3.1063430293941646e-01 -3.2952490036429749e+00 -1.8109977962060082e+00 1.6741149151475282e-01 3.0824309561832228e+00 1.6429954350801987e+00 3.3265364871155312e-01 3.2329941137323237e+00 2.0360606225963482e+00 -1.1717331059266264e-01 -3.0485496733592443e+00 -1.6364093651610758e+00 -2.5737291362102677e-01 -5.9903933853617151e+00 -2.2750684309934832e+00 2.9316247148732733e-01 5.8760176911810476e+00 1.8446405385025351e+00 4.4621511232812805e-01 2.0862326280145962e+00 7.6186259366427578e+00 -1.0739117398981988e+00 -1.5300306444197633e+00 -7.8262171163892038e+00 -1.1233284537061254e+00 -2.1774387371001236e+00 -9.2589170007326853e+00 7.0200369498456361e-01 1.6399698355285297e+00 9.5569622897809943e+00 1.0880557417760466e+00 2.0129358744173405e+00 9.2873118534838319e+00 -5.0378231077186830e-01 -1.6319172074138946e+00 -9.6539325109360803e+00 -7.5395557381770906e-01 -2.2443922875292217e+00 -1.2780086169109278e+01 1.2187035291051640e+00 1.8446405385025351e+00 1.3056252717259664e+01 1014 1015 1016 1062 1063 1064 1074 1075 1076 1026 1027 1028 1017 1018 1019 1065 1066 1067 1077 1078 1079 1029 1030 1031 5.1001521168234696e+00 8.5980816987383607e-02 2.3869213952971474e-01 -5.0329647524560697e+00 -2.4705713740942151e-01 -7.1721162235344582e-01 -2.5357409616242292e+00 -1.6453101633359082e-01 -4.3273775626285121e-01 2.4892999633328539e+00 6.1597561835091762e-02 2.0547842157278387e-01 2.5429084770243251e+00 2.3663852525406812e-01 6.3761341457927512e-01 -2.5413937343476474e+00 -4.6822438530056701e-02 -1.7283792201597228e-01 -1.2749908253519480e+00 -6.2231696360137007e-02 -1.6289431327192588e-01 1.2527297165992441e+00 1.3642538455666239e-01 4.0389763822242142e-01 8.5980816987383607e-02 6.0330113678082666e+00 2.5575604079995684e+00 -2.4097188846510317e-01 -5.6117978176061527e+00 -2.1434766194826205e+00 -3.0057916367905924e-01 -3.3623124821753918e+00 -2.2709968957341831e+00 5.7216089133295268e-02 3.0209151744909111e+00 1.8973324040314574e+00 2.2773710713907663e-01 3.3648041708829628e+00 2.2808794151083900e+00 -5.5751660426017063e-02 -3.1005411241380338e+00 -2.1405221214488819e+00 -5.6155382294839531e-02 -2.0799991087910756e+00 -2.1509887526816485e+00 2.8252408160526388e-01 1.7359198195285142e+00 1.9702121622079183e+00 2.3869213952971480e-01 2.5575604079995697e+00 1.2041096895591414e+01 -7.0156919788802352e-01 -2.1570686965221717e+00 -1.2106958004423017e+01 -7.9973735700323567e-01 -2.2864604194254285e+00 -8.5083304379009199e+00 1.9299291722201176e-01 1.9274007101715298e+00 8.8333550699001542e+00 6.1650658344824039e-01 2.2820343507413887e+00 8.6472955613366693e+00 -1.6754916915508375e-01 -1.7646561572234698e+00 -9.0089626409426966e+00 -1.4763272348490300e-01 -2.1642486777364698e+00 -7.0253092332156184e+00 7.6829680733128003e-01 1.6054384819950485e+00 7.1278127896540155e+00 -5.0329647524560697e+00 -2.4097188846510315e-01 -7.0156919788802352e-01 5.2291723572937414e+00 2.8257320480791109e-01 1.2025032129080251e+00 2.6759048376601187e+00 3.1683910596538922e-01 1.0478187073456897e+00 -2.5387977251833624e+00 -1.9088863950065532e-01 -8.3911655293063669e-01 -2.7303933782651724e+00 -3.6545411800157374e-01 -1.0959667461949314e+00 2.5626871990200639e+00 1.5381173256084579e-01 6.5387805904887297e-01 1.2833092566585320e+00 2.8499868511864868e-01 7.6940113041305003e-01 -1.4489177947278524e+00 -2.4090808248546192e-01 -1.0369486127020464e+00 -2.4705713740942156e-01 -5.6117978176061527e+00 -2.1570686965221717e+00 2.8257320480791109e-01 5.4370429547976578e+00 1.7201666316753743e+00 3.2018804773912668e-01 3.0364701767804028e+00 1.8975157794317790e+00 -9.9975801811650458e-02 -2.8398820405196914e+00 -1.4892510199903941e+00 -3.0463516429481502e-01 -3.0934554450328862e+00 -1.7237559808029130e+00 1.5538082127078207e-01 2.8983908558860771e+00 1.5487977585090189e+00 1.3328356581258574e-01 1.7694746268844961e+00 1.6039869871092700e+00 -2.3975753611451889e-01 -1.5962433111899006e+00 -1.4003914594099640e+00 -7.1721162235344571e-01 -2.1434766194826205e+00 -1.2106958004423021e+01 1.2025032129080251e+00 1.7201666316753743e+00 1.2307732789161063e+01 1.0485425009781220e+00 1.8777922243529350e+00 8.6797014876491616e+00 -4.4657098847703525e-01 -1.4834818784850239e+00 -9.0445952230417355e+00 -1.1113437320131114e+00 -2.1054875152801733e+00 -8.8237715010664761e+00 6.6608875118963173e-01 1.5580989406560513e+00 9.1593040415569078e+00 3.9298229931207473e-01 1.9808960407716665e+00 7.1700313593588589e+00 -1.0349904215442620e+00 -1.4045078242082061e+00 -7.3414449491947620e+00 -2.5357409616242297e+00 -3.0057916367905924e-01 -7.9973735700323556e-01 2.6759048376601187e+00 3.2018804773912674e-01 1.0485425009781220e+00 5.1872963035349979e+00 4.2077331556708014e-01 1.1220722721968035e+00 -4.9961320533623548e+00 -1.7577160764466515e-01 -6.8033555225430364e-01 -1.4456403909792084e+00 -3.7415665834933126e-01 -9.9115940623037846e-01 1.2854439475354964e+00 1.8869909571161189e-01 7.9712194852741691e-01 2.5353802384686248e+00 2.1882313435579553e-01 5.8781063568997560e-01 -2.7065119212334481e+00 -2.9797616370055791e-01 -1.0843150419044005e+00 -1.6453101633359082e-01 -3.3623124821753918e+00 -2.2864604194254290e+00 3.1683910596538922e-01 3.0364701767804028e+00 1.8777922243529352e+00 4.2077331556708014e-01 5.9120043179603625e+00 2.4547984263219496e+00 -1.8475336111472990e-01 -5.5631946434076083e+00 -2.0855682805950915e+00 -3.7392744729483862e-01 -2.0755152973875579e+00 -2.1254302819906252e+00 1.1139034153328059e-01 1.7720860102816047e+00 1.9927482157536107e+00 2.3126106340569275e-01 3.3422810757900705e+00 2.2253453911866146e+00 -3.5705200172828377e-01 -3.0618191578418825e+00 -2.0532252756039644e+00 -4.3273775626285116e-01 -2.2709968957341831e+00 -8.5083304379009199e+00 1.0478187073456902e+00 1.8975157794317790e+00 8.6797014876491616e+00 1.1220722721968035e+00 2.4547984263219500e+00 1.1570594221860256e+01 -7.2232496957440928e-01 -2.1226371284590924e+00 -1.1893856151728338e+01 -9.8578305683047751e-01 -2.1151232089617471e+00 -6.8584281688128961e+00 4.1583808368529868e-01 1.6093759331321063e+00 7.1620612381455135e+00 6.2396124871169534e-01 2.2278700979664658e+00 8.4795701499979099e+00 -1.0688445292717508e+00 -1.6808030036972754e+00 -8.6313123392106856e+00 2.4892999633328539e+00 5.7216089133295261e-02 1.9299291722201173e-01 -2.5387977251833620e+00 -9.9975801811650444e-02 -4.4657098847703525e-01 -4.9961320533623548e+00 -1.8475336111472987e-01 -7.2232496957440917e-01 5.0737533065823177e+00 5.5742404846833023e-02 2.3136992899345638e-01 1.2505989571976102e+00 1.0664890218086237e-01 4.0258847806762144e-01 -1.2774717305278505e+00 -3.6733065393121364e-02 -1.6398815009130616e-01 -2.5220512987541732e+00 -5.1617197147615770e-02 -1.5180783952679600e-01 2.5208005807149609e+00 1.5347202930612672e-01 6.5774062338645700e-01 6.1597561835091762e-02 3.0209151744909111e+00 1.9274007101715300e+00 -1.9088863950065535e-01 -2.8398820405196914e+00 -1.4834818784850241e+00 -1.7577160764466515e-01 -5.5631946434076083e+00 -2.1226371284590924e+00 5.5742404846833023e-02 5.4648138154671875e+00 1.7067481288838211e+00 1.8509425381006905e-01 1.7330595951886301e+00 1.5944929784467761e+00 -3.8473681084604097e-02 -1.6000042868689457e+00 -1.4214738337300403e+00 -3.8525967462226515e-02 -3.0645646036664158e+00 -1.7046637457815108e+00 1.4122567520015750e-01 2.8488569893159337e+00 1.5036147689535404e+00 2.0547842157278390e-01 1.8973324040314570e+00 8.8333550699001542e+00 -8.3911655293063669e-01 -1.4892510199903941e+00 -9.0445952230417372e+00 -6.8033555225430364e-01 -2.0855682805950919e+00 -1.1893856151728340e+01 2.3136992899345626e-01 1.7067481288838209e+00 1.2374373143177689e+01 7.9352003788735537e-01 1.9872936255152587e+00 7.1260538933288231e+00 -1.7335299268166643e-01 -1.4359771317630754e+00 -7.5156531034837410e+00 -1.4767200052289103e-01 -2.0926966157503082e+00 -8.8198345517984187e+00 6.1010870993590349e-01 1.5121188896683289e+00 8.9401569236455689e+00 2.5429084770243251e+00 2.2773710713907661e-01 6.1650658344824039e-01 -2.7303933782651724e+00 -3.0463516429481502e-01 -1.1113437320131117e+00 -1.4456403909792082e+00 -3.7392744729483862e-01 -9.8578305683047751e-01 1.2505989571976102e+00 1.8509425381006905e-01 7.9352003788735537e-01 5.4009388761374710e+00 4.3334092180304445e-01 1.1586082233485471e+00 -5.1449203003512620e+00 -1.8864721672429272e-01 -7.2196996970009142e-01 -2.5865065067157715e+00 -3.0166146019443296e-01 -7.9989064191650772e-01 2.7130142659520056e+00 3.2269900575618859e-01 1.0503525557760460e+00 2.3663852525406812e-01 3.3648041708829628e+00 2.2820343507413887e+00 -3.6545411800157385e-01 -3.0934554450328862e+00 -2.1054875152801737e+00 -3.7415665834933126e-01 -2.0755152973875579e+00 -2.1151232089617475e+00 1.0664890218086237e-01 1.7330595951886301e+00 1.9872936255152587e+00 4.3334092180304451e-01 6.1499551990904155e+00 2.5410615742418043e+00 -1.9179815859545937e-01 -5.7336567687615263e+00 -2.1696653803724835e+00 -1.6201595357074045e-01 -3.4226319017626774e+00 -2.3004475668168634e+00 3.1679653927913026e-01 3.0774404477826369e+00 1.8803341209328166e+00 6.3761341457927512e-01 2.2808794151083900e+00 8.6472955613366711e+00 -1.0959667461949316e+00 -1.7237559808029133e+00 -8.8237715010664761e+00 -9.9115940623037846e-01 -2.1254302819906252e+00 -6.8584281688128961e+00 4.0258847806762138e-01 1.5944929784467761e+00 7.1260538933288231e+00 1.1586082233485469e+00 2.5410615742418043e+00 1.2029483954662480e+01 -7.3997895780151979e-01 -2.1926420239369766e+00 -1.2273377234742522e+01 -4.2521322627827451e-01 -2.2934396562836725e+00 -8.6045024343731473e+00 1.0535082205096615e+00 1.9188339752172148e+00 8.7572459296670750e+00 -2.5413937343476474e+00 -5.5751660426017063e-02 -1.6754916915508369e-01 2.5626871990200635e+00 1.5538082127078209e-01 6.6608875118963162e-01 1.2854439475354964e+00 1.1139034153328059e-01 4.1583808368529868e-01 -1.2774717305278505e+00 -3.8473681084604097e-02 -1.7335299268166637e-01 -5.1449203003512620e+00 -1.9179815859545937e-01 -7.3997895780151979e-01 5.1507966486096954e+00 6.2262138700519783e-02 2.5558707994094909e-01 2.5575655239113644e+00 6.2623565300234593e-02 2.0656670277085204e-01 -2.5927075538498618e+00 -1.0563336669873642e-01 -4.6319949794846166e-01 -4.6822438530056701e-02 -3.1005411241380338e+00 -1.7646561572234698e+00 1.5381173256084579e-01 2.8983908558860771e+00 1.5580989406560513e+00 1.8869909571161186e-01 1.7720860102816047e+00 1.6093759331321063e+00 -3.6733065393121371e-02 -1.6000042868689457e+00 -1.4359771317630752e+00 -1.8864721672429269e-01 -5.7336567687615263e+00 -2.1926420239369766e+00 6.2262138700519797e-02 5.5610445142832541e+00 1.7760853008605708e+00 5.9945622210640856e-02 3.1013268637243625e+00 1.9529281881233995e+00 -1.9251586853614783e-01 -2.8986460644067922e+00 -1.5032130498486069e+00 -1.7283792201597226e-01 -2.1405221214488823e+00 -9.0089626409426984e+00 6.5387805904887297e-01 1.5487977585090189e+00 9.1593040415569078e+00 7.9712194852741691e-01 1.9927482157536107e+00 7.1620612381455127e+00 -1.6398815009130616e-01 -1.4214738337300403e+00 -7.5156531034837410e+00 -7.2196996970009142e-01 -2.1696653803724835e+00 -1.2273377234742522e+01 2.5558707994094915e-01 1.7760853008605708e+00 1.2668078128741744e+01 1.9417484880647884e-01 1.9242065635640604e+00 8.9446927355557229e+00 -8.4196589451634918e-01 -1.5101765031358516e+00 -9.1361431648309228e+00 -1.2749908253519480e+00 -5.6155382294839525e-02 -1.4763272348490300e-01 1.2833092566585322e+00 1.3328356581258574e-01 3.9298229931207468e-01 2.5353802384686253e+00 2.3126106340569275e-01 6.2396124871169545e-01 -2.5220512987541737e+00 -3.8525967462226522e-02 -1.4767200052289103e-01 -2.5865065067157715e+00 -1.6201595357074042e-01 -4.2521322627827440e-01 2.5575655239113648e+00 5.9945622210640856e-02 1.9417484880647887e-01 5.1016007229381675e+00 7.9098641952058638e-02 2.1850974111417848e-01 -5.0943071111547962e+00 -2.4689159005317146e-01 -7.0911018765835920e-01 -6.2231696360137007e-02 -2.0799991087910756e+00 -2.1642486777364693e+00 2.8499868511864873e-01 1.7694746268844961e+00 1.9808960407716665e+00 2.1882313435579553e-01 3.3422810757900705e+00 2.2278700979664663e+00 -5.1617197147615791e-02 -3.0645646036664158e+00 -2.0926966157503082e+00 -3.0166146019443296e-01 -3.4226319017626774e+00 -2.2934396562836725e+00 6.2623565300234607e-02 3.1013268637243625e+00 1.9242065635640602e+00 7.9098641952058651e-02 6.0251664311952737e+00 2.5183948291320721e+00 -2.3003367302455216e-01 -5.6710533833740335e+00 -2.1009825816638150e+00 -1.6289431327192591e-01 -2.1509887526816485e+00 -7.0253092332156193e+00 7.6940113041304992e-01 1.6039869871092702e+00 7.1700313593588589e+00 5.8781063568997560e-01 2.2253453911866146e+00 8.4795701499979099e+00 -1.5180783952679600e-01 -1.7046637457815110e+00 -8.8198345517984187e+00 -7.9989064191650783e-01 -2.3004475668168634e+00 -8.6045024343731473e+00 2.0656670277085201e-01 1.9529281881233995e+00 8.9446927355557229e+00 2.1850974111417851e-01 2.5183948291320721e+00 1.1906104413934578e+01 -6.6769541527282739e-01 -2.1445553302713303e+00 -1.2050752439459885e+01 1.2527297165992441e+00 2.8252408160526388e-01 7.6829680733128003e-01 -1.4489177947278526e+00 -2.3975753611451889e-01 -1.0349904215442620e+00 -2.7065119212334481e+00 -3.5705200172828377e-01 -1.0688445292717510e+00 2.5208005807149609e+00 1.4122567520015750e-01 6.1010870993590338e-01 2.7130142659520056e+00 3.1679653927913026e-01 1.0535082205096615e+00 -2.5927075538498618e+00 -1.9251586853614783e-01 -8.4196589451634896e-01 -5.0943071111547962e+00 -2.3003367302455210e-01 -6.6769541527282728e-01 5.3558998176997488e+00 2.7881278331895043e-01 1.1815825228283443e+00 1.3642538455666239e-01 1.7359198195285142e+00 1.6054384819950487e+00 -2.4090808248546197e-01 -1.5962433111899006e+00 -1.4045078242082061e+00 -2.9797616370055796e-01 -3.0618191578418825e+00 -1.6808030036972754e+00 1.5347202930612672e-01 2.8488569893159337e+00 1.5121188896683293e+00 3.2269900575618854e-01 3.0774404477826374e+00 1.9188339752172148e+00 -1.0563336669873642e-01 -2.8986460644067922e+00 -1.5101765031358512e+00 -2.4689159005317146e-01 -5.6710533833740335e+00 -2.1445553302713298e+00 2.7881278331895043e-01 5.5655446601855232e+00 1.7036513144320709e+00 4.0389763822242142e-01 1.9702121622079183e+00 7.1278127896540155e+00 -1.0369486127020464e+00 -1.4003914594099642e+00 -7.3414449491947620e+00 -1.0843150419044005e+00 -2.0532252756039644e+00 -8.6313123392106856e+00 6.5774062338645711e-01 1.5036147689535406e+00 8.9401569236455707e+00 1.0503525557760460e+00 1.8803341209328166e+00 8.7572459296670750e+00 -4.6319949794846171e-01 -1.5032130498486067e+00 -9.1361431648309246e+00 -7.0911018765835920e-01 -2.1009825816638146e+00 -1.2050752439459886e+01 1.1815825228283445e+00 1.7036513144320706e+00 1.2334437249729598e+01 978 979 980 1026 1027 1028 1038 1039 1040 990 991 992 981 982 983 1029 1030 1031 1041 1042 1043 993 994 995 5.2248053827460552e+00 1.1288567029628425e-01 1.9056326767347850e-01 -5.1631767221984477e+00 -3.6363146606573910e-01 -6.2705101945971375e-01 -2.5826248729428878e+00 -2.2542750855581103e-01 -3.6566715556991791e-01 2.5450208091318252e+00 8.7247916742507189e-02 1.6486383992678386e-01 2.5491477120991983e+00 3.3277182176118686e-01 5.4769810432872779e-01 -2.5512953328224253e+00 -6.5904460398305775e-02 -1.3208011857533100e-01 -1.2731249728422749e+00 -7.5133183451606633e-02 -1.2077465299405604e-01 1.2512479968289583e+00 1.9719120967148412e-01 3.4244773467002843e-01 1.1288567029628427e-01 7.3472229028497935e+00 3.5325129705096074e+00 -3.5465207815436012e-01 -6.8429973358891703e+00 -3.2618929480679801e+00 -4.2323018548284136e-01 -4.4519599198517259e+00 -3.0708106312382339e+00 7.6866923168400630e-02 4.0285509782684352e+00 2.8567512265177797e+00 3.2360702089229054e-01 4.4379421730354869e+00 3.1311954401644373e+00 -7.5597385860534022e-02 -4.0910015317460395e+00 -3.1277467370688630e+00 -6.4376220254966449e-02 -3.0574970292417052e+00 -2.9093971099421565e+00 4.0449625539572609e-01 2.6297397625749266e+00 2.8493877891254078e+00 1.9056326767347848e-01 3.5325129705096066e+00 1.1078327455772838e+01 -6.1394173318875278e-01 -3.2817306712787411e+00 -1.1268790234975883e+01 -6.9123049871174946e-01 -3.0900363346427979e+00 -7.5461479258481230e+00 1.4723436369286458e-01 2.8978208292629244e+00 7.9633179334291277e+00 5.3604232172441724e-01 3.1385708282175844e+00 7.6726316517136315e+00 -1.3444846333381888e-01 -2.7805712207139965e+00 -8.1132137917061939e+00 -1.0411987734635077e-01 -2.9328526648025219e+00 -6.0468981575977585e+00 6.6990061948991075e-01 2.5162862634479413e+00 6.2607730692123624e+00 -5.1631767221984477e+00 -3.5465207815436012e-01 -6.1394173318875267e-01 5.3506244543384476e+00 5.0364757519768377e-01 1.0915654629877176e+00 2.7204014675978874e+00 4.9442784926923572e-01 9.2813828870655157e-01 -2.5877688481919221e+00 -3.3733471497700424e-01 -7.4844967031460896e-01 -2.7295390594614588e+00 -5.5524208360649419e-01 -9.7719915797345924e-01 2.5684659969352848e+00 2.6957938269022680e-01 5.8709302012077857e-01 1.2785619147735459e+00 4.0668353333572543e-01 6.6687550525756378e-01 -1.4375692037933359e+00 -4.2710946375501324e-01 -9.3408171559579067e-01 -3.6363146606573910e-01 -6.8429973358891703e+00 -3.2817306712787420e+00 5.0364757519768377e-01 6.5424651249897252e+00 2.9757420489408464e+00 5.0087950922407698e-01 4.0449931118878935e+00 2.8535517615166119e+00 -1.7341738278882682e-01 -3.7273288302877301e+00 -2.5952233536542124e+00 -5.0011876024173496e-01 -4.0827106358751966e+00 -2.7240031733053343e+00 2.7044548829372866e-01 3.7761105220259092e+00 2.6772588803538042e+00 1.8895327278001584e-01 2.6697369418275598e+00 2.5194696753150594e+00 -4.2675823639920413e-01 -2.3802688986789899e+00 -2.4250651678880342e+00 -6.2705101945971375e-01 -3.2618929480679797e+00 -1.1268790234975880e+01 1.0915654629877176e+00 2.9757420489408464e+00 1.1592319171812738e+01 9.3031018439239355e-01 2.8212173668940737e+00 7.8285694506892796e+00 -3.8755606592092656e-01 -2.5838729569377006e+00 -8.2914305769302832e+00 -9.9333426025065030e-01 -3.0808011226579812e+00 -7.9524220033816446e+00 5.9191347531779681e-01 2.6831744580683266e+00 8.3782996524534834e+00 3.2579132094412483e-01 2.8670647003795176e+00 6.2926455785048745e+00 -9.3163909801074163e-01 -2.4206315466191026e+00 -6.5791910381725671e+00 -2.5826248729428878e+00 -4.2323018548284141e-01 -6.9123049871174957e-01 2.7204014675978874e+00 5.0087950922407698e-01 9.3031018439239355e-01 5.2559701430353396e+00 5.9747061660403411e-01 9.7367140651329875e-01 -5.0774241889455176e+00 -2.8227934997708742e-01 -5.8453964136441861e-01 -1.4316262969422764e+00 -5.3476612636185894e-01 -8.6681900992231642e-01 1.2824853798804539e+00 3.2583033803707434e-01 7.0855714782963919e-01 2.5190085154891957e+00 2.9972935915286092e-01 4.9077557592607296e-01 -2.6861901471721956e+00 -4.8363416119625846e-01 -9.6072516466291957e-01 -2.2542750855581098e-01 -4.4519599198517268e+00 -3.0900363346427979e+00 4.9442784926923572e-01 4.0449931118878926e+00 2.8212173668940732e+00 5.9747061660403433e-01 7.1163514893217563e+00 3.3280808850463504e+00 -3.0408744037471597e-01 -6.6905132230332613e+00 -3.1134549549867963e+00 -5.2995648711049714e-01 -3.0476555726605983e+00 -2.8727901928679600e+00 1.7684819152056314e-01 2.6690971741435798e+00 2.8757696206645238e+00 3.2195566180624879e-01 4.3364365852478235e+00 2.9967545503070552e+00 -5.3123088315905742e-01 -3.9767496450554654e+00 -2.9455409404144479e+00 -3.6566715556991791e-01 -3.0708106312382335e+00 -7.5461479258481230e+00 9.2813828870655146e-01 2.8535517615166119e+00 7.8285694506892787e+00 9.7367140651329875e-01 3.3280808850463504e+00 1.0522267222397508e+01 -6.3619407965700281e-01 -3.1693959200646091e+00 -1.0926898956022676e+01 -8.5658667542022027e-01 -2.8646221671912291e+00 -5.9058214302338747e+00 3.6060357813915850e-01 2.5159174381152054e+00 6.2852210856533945e+00 5.3076904036944805e-01 3.0067105873527793e+00 7.4157261381217809e+00 -9.3473440308131472e-01 -2.5994319535368740e+00 -7.6729155847572912e+00 2.5450208091318252e+00 7.6866923168400658e-02 1.4723436369286461e-01 -2.5877688481919221e+00 -1.7341738278882682e-01 -3.8755606592092651e-01 -5.0774241889455185e+00 -3.0408744037471602e-01 -6.3619407965700281e-01 5.1540243952748792e+00 8.4967218810876266e-02 1.8214316560787547e-01 1.2488294463285392e+00 1.6678922076008279e-01 3.4296283158345842e-01 -1.2767601082697708e+00 -5.5138953995517027e-02 -1.2376246835075089e-01 -2.5142989685520352e+00 -6.0977059131328587e-02 -1.0485632485409332e-01 2.5083774632240017e+00 2.6499747355102860e-01 5.8002857789857509e-01 8.7247916742507189e-02 4.0285509782684352e+00 2.8978208292629244e+00 -3.3733471497700424e-01 -3.7273288302877297e+00 -2.5838729569377006e+00 -2.8227934997708753e-01 -6.6905132230332613e+00 -3.1693959200646091e+00 8.4967218810876322e-02 6.4741256118297876e+00 2.9012962286342092e+00 3.2036318243048295e-01 2.6301500299403187e+00 2.5025155769459602e+00 -6.2976713653850325e-02 -2.3886859088996952e+00 -2.4583092321072590e+00 -5.0747502700230138e-02 -3.9874779059884671e+00 -2.6439659271824918e+00 2.4075996332430533e-01 3.6611792481706100e+00 2.5539114014489659e+00 1.6486383992678386e-01 2.8567512265177792e+00 7.9633179334291286e+00 -7.4844967031460885e-01 -2.5952233536542120e+00 -8.2914305769302832e+00 -5.8453964136441861e-01 -3.1134549549867963e+00 -1.0926898956022677e+01 1.8214316560787550e-01 2.9012962286342092e+00 1.1495956260118458e+01 7.0370826081755400e-01 2.8750965219323916e+00 6.2548336066298109e+00 -1.4196280921191623e-01 -2.4745768707699334e+00 -6.7302338697110482e+00 -1.0511820003974856e-01 -3.0075378637199934e+00 -7.8311618672830976e+00 5.2935505457847798e-01 2.5576490660465541e+00 8.0656174697697072e+00 2.5491477120991983e+00 3.2360702089229049e-01 5.3604232172441724e-01 -2.7295390594614592e+00 -5.0011876024173496e-01 -9.9333426025065041e-01 -1.4316262969422764e+00 -5.2995648711049714e-01 -8.5658667542022005e-01 1.2488294463285392e+00 3.2036318243048295e-01 7.0370826081755389e-01 5.2913495161454689e+00 6.2190718989844951e-01 1.0140051824415803e+00 -5.0531786361499762e+00 -3.1135467371711778e-01 -6.4268457588215600e-01 -2.5270874650085182e+00 -4.2349590249818875e-01 -6.8885169784201361e-01 2.6521047829890243e+00 4.9904843034631563e-01 9.2770144441148805e-01 3.3277182176118686e-01 4.4379421730354869e+00 3.1385708282175844e+00 -5.5524208360649419e-01 -4.0827106358751966e+00 -3.0808011226579817e+00 -5.3476612636185894e-01 -3.0476555726605983e+00 -2.8646221671912291e+00 1.6678922076008279e-01 2.6301500299403187e+00 2.8750965219323916e+00 6.2190718989844940e-01 7.2404603220093158e+00 3.4841205217113265e+00 -3.1304032352639077e-01 -6.7419434413510704e+00 -3.2836155000187075e+00 -2.1604776201213458e-01 -4.4154402820404224e+00 -3.1021446824431127e+00 4.9762806308715896e-01 3.9791974069421658e+00 2.8333956004497267e+00 5.4769810432872779e-01 3.1311954401644373e+00 7.6726316517136315e+00 -9.7719915797345935e-01 -2.7240031733053338e+00 -7.9524220033816446e+00 -8.6681900992231631e-01 -2.8727901928679600e+00 -5.9058214302338747e+00 3.4296283158345842e-01 2.5025155769459602e+00 6.2548336066298109e+00 1.0140051824415806e+00 3.4841205217113265e+00 1.0809270725870741e+01 -6.4603132383750317e-01 -3.2846501592185495e+00 -1.1149468774043232e+01 -3.4788623227670362e-01 -3.0917567771815473e+00 -7.5065445242712387e+00 9.3326960565621508e-01 2.8553687637516658e+00 7.7775207477158075e+00 -2.5512953328224253e+00 -7.5597385860534022e-02 -1.3444846333381885e-01 2.5684659969352848e+00 2.7044548829372872e-01 5.9191347531779681e-01 1.2824853798804541e+00 1.7684819152056314e-01 3.6060357813915855e-01 -1.2767601082697708e+00 -6.2976713653850311e-02 -1.4196280921191620e-01 -5.0531786361499771e+00 -3.1304032352639077e-01 -6.4603132383750317e-01 5.0593953222790038e+00 9.8912896351054769e-02 2.1099922864621082e-01 2.5077827478202446e+00 8.7868885433394162e-02 1.6303550155025309e-01 -2.5368953696728127e+00 -1.8246103855796553e-01 -4.0410918727018091e-01 -6.5904460398305748e-02 -4.0910015317460395e+00 -2.7805712207139970e+00 2.6957938269022680e-01 3.7761105220259092e+00 2.6831744580683266e+00 3.2583033803707434e-01 2.6690971741435798e+00 2.5159174381152054e+00 -5.5138953995517020e-02 -2.3886859088996948e+00 -2.4745768707699334e+00 -3.1135467371711778e-01 -6.7419434413510704e+00 -3.2846501592185500e+00 9.8912896351054755e-02 6.4457762784441996e+00 3.0309848073488030e+00 7.9022433931122224e-02 4.0134555596103443e+00 2.9072731338476352e+00 -3.4094696289853710e-01 -3.6828086522272274e+00 -2.5975515866774916e+00 -1.3208011857533097e-01 -3.1277467370688625e+00 -8.1132137917061922e+00 5.8709302012077857e-01 2.6772588803538042e+00 8.3782996524534834e+00 7.0855714782963919e-01 2.8757696206645238e+00 6.2852210856533945e+00 -1.2376246835075090e-01 -2.4583092321072590e+00 -6.7302338697110482e+00 -6.4268457588215588e-01 -3.2836155000187075e+00 -1.1149468774043232e+01 2.1099922864621085e-01 3.0309848073488039e+00 1.1645081586178998e+01 1.4578053127359447e-01 2.8935908088958802e+00 7.9344176166856633e+00 -7.5390276506198461e-01 -2.6079326480681830e+00 -8.2501035055110687e+00 -1.2731249728422749e+00 -6.4376220254966449e-02 -1.0411987734635075e-01 1.2785619147735459e+00 1.8895327278001584e-01 3.2579132094412483e-01 2.5190085154891957e+00 3.2195566180624874e-01 5.3076904036944805e-01 -2.5142989685520352e+00 -5.0747502700230145e-02 -1.0511820003974859e-01 -2.5270874650085182e+00 -2.1604776201213455e-01 -3.4788623227670357e-01 2.5077827478202446e+00 7.9022433931122210e-02 1.4578053127359447e-01 4.9845638867322197e+00 9.4437389273116679e-02 1.5812184981942415e-01 -4.9754056584123774e+00 -3.5319727282317237e-01 -6.0333843274378851e-01 -7.5133183451606619e-02 -3.0574970292417052e+00 -2.9328526648025219e+00 4.0668353333572549e-01 2.6697369418275598e+00 2.8670647003795180e+00 2.9972935915286092e-01 4.3364365852478226e+00 3.0067105873527789e+00 -6.0977059131328608e-02 -3.9874779059884662e+00 -3.0075378637199934e+00 -4.2349590249818875e-01 -4.4154402820404224e+00 -3.0917567771815468e+00 8.7868885433394162e-02 4.0134555596103443e+00 2.8935908088958806e+00 9.4437389273116623e-02 7.0398686413914842e+00 3.3947532508757803e+00 -3.2911302211397275e-01 -6.5990825108066158e+00 -3.1299720417998960e+00 -1.2077465299405601e-01 -2.9093971099421565e+00 -6.0468981575977594e+00 6.6687550525756378e-01 2.5194696753150594e+00 6.2926455785048745e+00 4.9077557592607296e-01 2.9967545503070552e+00 7.4157261381217809e+00 -1.0485632485409328e-01 -2.6439659271824918e+00 -7.8311618672830976e+00 -6.8885169784201361e-01 -3.1021446824431118e+00 -7.5065445242712387e+00 1.6303550155025306e-01 2.9072731338476352e+00 7.9344176166856633e+00 1.5812184981942418e-01 3.3947532508757798e+00 1.0572166987367778e+01 -5.6432575686315034e-01 -3.1627428907777704e+00 -1.0830351771528003e+01 1.2512479968289583e+00 4.0449625539572609e-01 6.6990061948991075e-01 -1.4375692037933359e+00 -4.2675823639920407e-01 -9.3163909801074174e-01 -2.6861901471721956e+00 -5.3123088315905742e-01 -9.3473440308131484e-01 2.5083774632240017e+00 2.4075996332430533e-01 5.2935505457847798e-01 2.6521047829890243e+00 4.9762806308715896e-01 9.3326960565621497e-01 -2.5368953696728127e+00 -3.4094696289853710e-01 -7.5390276506198450e-01 -4.9754056584123774e+00 -3.2911302211397281e-01 -5.6432575686315034e-01 5.2243301360087369e+00 4.8516482276358069e-01 1.0520767432925873e+00 1.9719120967148412e-01 2.6297397625749266e+00 2.5162862634479413e+00 -4.2710946375501324e-01 -2.3802688986789899e+00 -2.4206315466191026e+00 -4.8363416119625835e-01 -3.9767496450554649e+00 -2.5994319535368740e+00 2.6499747355102860e-01 3.6611792481706100e+00 2.5576490660465536e+00 4.9904843034631563e-01 3.9791974069421658e+00 2.8553687637516663e+00 -1.8246103855796553e-01 -3.6828086522272270e+00 -2.6079326480681826e+00 -3.5319727282317226e-01 -6.5990825108066158e+00 -3.1627428907777695e+00 4.8516482276358081e-01 6.3687932890805952e+00 2.8614349457557675e+00 3.4244773467002843e-01 2.8493877891254078e+00 6.2607730692123624e+00 -9.3408171559579056e-01 -2.4250651678880342e+00 -6.5791910381725662e+00 -9.6072516466291979e-01 -2.9455409404144479e+00 -7.6729155847572921e+00 5.8002857789857509e-01 2.5539114014489659e+00 8.0656174697697072e+00 9.2770144441148827e-01 2.8333956004497263e+00 7.7775207477158075e+00 -4.0410918727018091e-01 -2.5975515866774916e+00 -8.2501035055110687e+00 -6.0333843274378851e-01 -3.1299720417998955e+00 -1.0830351771528003e+01 1.0520767432925873e+00 2.8614349457557680e+00 1.1228650613271050e+01 1026 1027 1028 1074 1075 1076 1086 1087 1088 1038 1039 1040 1029 1030 1031 1077 1078 1079 1089 1090 1091 1041 1042 1043 4.7677722892971950e+00 8.6190296319514526e-02 1.4484871549652811e-01 -4.6933550206176360e+00 -3.4044578754184368e-01 -5.7932510213425326e-01 -2.3827555198770480e+00 -2.0521667362755869e-01 -3.2851985531694172e-01 2.3478794396376954e+00 6.6310747785000457e-02 1.2561749778266462e-01 2.3609677826977427e+00 3.1304899274531245e-01 5.1036098064310131e-01 -2.3699272013433745e+00 -4.6739307213006613e-02 -9.4151450901735628e-02 -1.1998579426674845e+00 -5.4782963311237776e-02 -8.6675668208877385e-02 1.1692761728729084e+00 1.8163469484381925e-01 3.0784488263951398e-01 8.6190296319514526e-02 6.7879873367511143e+00 3.3248910765150628e+00 -3.3949319458147875e-01 -6.2641828004974762e+00 -3.0561304294562861e+00 -4.0803681325766739e-01 -4.1745532441942697e+00 -2.8995129469050456e+00 5.8337941739385536e-02 3.7389253520277572e+00 2.6911325547460128e+00 3.0849807729726519e-01 4.1692634043430514e+00 2.9608352747436668e+00 -5.2444807435868317e-02 -3.8184089483738939e+00 -2.9587959293479358e+00 -4.4591634531827261e-02 -2.9089258431939298e+00 -2.7582899301914150e+00 3.9154013445067615e-01 2.4698947431376479e+00 2.6958703298959401e+00 1.4484871549652809e-01 3.3248910765150628e+00 1.0223084925330090e+01 -5.7850309146533285e-01 -3.0612684658345328e+00 -1.0404578433889704e+01 -6.6006079145712759e-01 -2.9233890558628692e+00 -7.0241231733372533e+00 1.1123586392335544e-01 2.7209251915816424e+00 7.4438341195594555e+00 5.0597425687111075e-01 2.9637650003854583e+00 7.1604467285075346e+00 -9.2161351116571089e-02 -2.6047014102805317e+00 -7.6047010458944957e+00 -7.0782076149968676e-02 -2.7788277533610839e+00 -5.6812756338323611e+00 6.3944847389800563e-01 2.3586054168568564e+00 5.8873125135567346e+00 -4.6933550206176360e+00 -3.3949319458147881e-01 -5.7850309146533296e-01 4.8910458416709588e+00 4.8154857677912971e-01 1.0573331083273030e+00 2.5231910846910850e+00 4.8074006007522840e-01 9.0022613377593463e-01 -2.3849485630344960e+00 -3.2033962986340253e-01 -7.2103706127618827e-01 -2.5492430951309824e+00 -5.4025290104513568e-01 -9.4679114034683221e-01 2.3795004037973935e+00 2.5378228783341594e-01 5.5847177776601675e-01 1.1974462578712777e+00 3.9517401383062212e-01 6.3998880865021512e-01 -1.3636369092475995e+00 -4.1115921302837949e-01 -9.0968853543111616e-01 -3.4044578754184368e-01 -6.2641828004974771e+00 -3.0612684658345328e+00 4.8154857677912977e-01 5.9639330084231705e+00 2.7541331159249087e+00 4.8414642025826116e-01 3.7518301843014377e+00 2.6734296664964470e+00 -1.5543908753594862e-01 -3.4328009518761040e+00 -2.4164989292744758e+00 -4.8516037786565103e-01 -3.8032441482080621e+00 -2.5431236948410794e+00 2.5037970577723689e-01 3.4967060928721985e+00 2.4939688839724865e+00 1.7509523115184675e-01 2.5058336066861315e+00 2.3590867374218649e+00 -4.1012468102303118e-01 -2.2180749917012967e+00 -2.2597273138656178e+00 -5.7932510213425326e-01 -3.0561304294562861e+00 -1.0404578433889704e+01 1.0573331083273030e+00 2.7541331159249083e+00 1.0730582555825082e+01 9.0017800186178321e-01 2.6530297169577644e+00 7.3016414984522049e+00 -3.5306028829620845e-01 -2.4013670578110395e+00 -7.7708150607079451e+00 -9.6865315196743973e-01 -2.9056630166018524e+00 -7.4395964419868319e+00 5.5511684360381075e-01 2.5038116427423338e+00 7.8673831065176341e+00 2.9519227141225618e-01 2.7103286929210189e+00 5.9229475553769646e+00 -9.0678168280725158e-01 -2.2581426646768499e+00 -6.2075647795874067e+00 -2.3827555198770480e+00 -4.0803681325766733e-01 -6.6006079145712759e-01 2.5231910846910850e+00 4.8414642025826116e-01 9.0017800186178321e-01 4.9380306797640516e+00 5.8350279437318642e-01 9.4022902340326076e-01 -4.7471413080042018e+00 -2.5983259053934943e-01 -5.4846461602540098e-01 -1.3594473627476131e+00 -5.2186598686190211e-01 -8.3802197326916472e-01 1.2007829562056465e+00 3.0816459556717335e-01 6.8090977881264825e-01 2.3983260627875089e+00 2.8157980151688605e-01 4.5748141942248405e-01 -2.5709865928194287e+00 -4.6765822105658839e-01 -9.3225084274848324e-01 -2.0521667362755869e-01 -4.1745532441942697e+00 -2.9233890558628692e+00 4.8074006007522840e-01 3.7518301843014381e+00 2.6530297169577639e+00 5.8350279437318642e-01 6.7073761258879969e+00 3.1437641910686924e+00 -2.8465584640226899e-01 -6.2644118501913093e+00 -2.9311176911188364e+00 -5.2106753398243066e-01 -2.8970813190497142e+00 -2.7207453183148909e+00 1.5709337483377375e-01 2.5093698265038751e+00 2.7232411599836386e+00 3.0941216527120530e-01 4.1433061108783624e+00 2.8432181806128960e+00 -5.1980834054113545e-01 -3.7758358341363807e+00 -2.7880011833263945e+00 -3.2851985531694167e-01 -2.8995129469050456e+00 -7.0241231733372533e+00 9.0022613377593463e-01 2.6734296664964470e+00 7.3016414984522049e+00 9.4022902340326076e-01 3.1437641910686924e+00 9.8473470422420259e+00 -6.0429880097341437e-01 -2.9790889505902349e+00 -1.0249671291026251e+01 -8.3213107040315881e-01 -2.7056046579447504e+00 -5.5341161708323359e+00 3.2859673179532661e-01 2.3581262024906922e+00 5.9114764200790884e+00 5.0575132318822846e-01 2.8481567714639788e+00 7.0002428739530940e+00 -9.0985348546923506e-01 -2.4392702760797822e+00 -7.2527971995305691e+00 2.3478794396376954e+00 5.8337941739385536e-02 1.1123586392335542e-01 -2.3849485630344960e+00 -1.5543908753594859e-01 -3.5306028829620845e-01 -4.7471413080042018e+00 -2.8465584640226904e-01 -6.0429880097341448e-01 4.8330501615431922e+00 6.5914362064152923e-02 1.4201693695014431e-01 1.1674753895017944e+00 1.4849065333455311e-01 3.1395958366218479e-01 -1.2016302580988749e+00 -3.9793228588927927e-02 -9.1136585024061745e-02 -2.3991190761015799e+00 -4.3257247490347588e-02 -7.3450146134182825e-02 2.3844342145564723e+00 2.5040245287940160e-01 5.5473343589218271e-01 6.6310747785000457e-02 3.7389253520277572e+00 2.7209251915816424e+00 -3.2033962986340253e-01 -3.4328009518761040e+00 -2.4013670578110395e+00 -2.5983259053934937e-01 -6.2644118501913102e+00 -2.9790889505902340e+00 6.5914362064152923e-02 6.0507170776759560e+00 2.7077478470107921e+00 3.0326639293736807e-01 2.4664173577278343e+00 2.3423538402884825e+00 -4.4720590337805663e-02 -2.2281832464661582e+00 -2.2934450549124170e+00 -3.2056132020671778e-02 -3.7854356542740395e+00 -2.4837395553770563e+00 2.2145743997470788e-01 3.4547719153760643e+00 2.3866137398098295e+00 1.2561749778266465e-01 2.6911325547460128e+00 7.4438341195594555e+00 -7.2103706127618827e-01 -2.4164989292744763e+00 -7.7708150607079451e+00 -5.4846461602540086e-01 -2.9311176911188364e+00 -1.0249671291026251e+01 1.4201693695014425e-01 2.7077478470107925e+00 1.0831136391742898e+01 6.7860005503576215e-01 2.7194314039332896e+00 5.8841223056249738e+00 -1.0316897971775155e-01 -2.3156552388717460e+00 -6.3658646710408942e+00 -6.7978730493413367e-02 -2.8498681902262013e+00 -7.4223543729221859e+00 4.9441489774418274e-01 2.3948282438011663e+00 7.6496125787699496e+00 2.3609677826977422e+00 3.0849807729726531e-01 5.0597425687111064e-01 -2.5492430951309824e+00 -4.8516037786565092e-01 -9.6865315196743962e-01 -1.3594473627476131e+00 -5.2106753398243066e-01 -8.3213107040315892e-01 1.1674753895017944e+00 3.0326639293736807e-01 6.7860005503576215e-01 5.0345890764868946e+00 6.0903068397100890e-01 9.8354795416516150e-01 -4.7824045754727882e+00 -2.9139764891997766e-01 -6.0959018614781857e-01 -2.4236604536662418e+00 -4.0995528709515872e-01 -6.6025611537487450e-01 2.5517232383311947e+00 4.8678569365757612e-01 9.0250825782125721e-01 3.1304899274531245e-01 4.1692634043430514e+00 2.9637650003854579e+00 -5.4025290104513557e-01 -3.8032441482080617e+00 -2.9056630166018520e+00 -5.2186598686190211e-01 -2.8970813190497142e+00 -2.7056046579447504e+00 1.4849065333455314e-01 2.4664173577278348e+00 2.7194314039332892e+00 6.0903068397100890e-01 6.8872260783517181e+00 3.2974477228151384e+00 -2.9076513535830695e-01 -6.3756472245329059e+00 -3.0923449512116181e+00 -1.9968156400340017e-01 -4.2365553236331017e+00 -2.9419584104949443e+00 4.8199525721787018e-01 3.7896211750011797e+00 2.6649269091192784e+00 5.1036098064310131e-01 2.9608352747436668e+00 7.1604467285075346e+00 -9.4679114034683232e-01 -2.5431236948410803e+00 -7.4395964419868319e+00 -8.3802197326916472e-01 -2.7207453183148904e+00 -5.5341161708323359e+00 3.1395958366218479e-01 2.3423538402884829e+00 5.8841223056249738e+00 9.8354795416516128e-01 3.2974477228151375e+00 1.0197249304781167e+01 -6.1024870793174946e-01 -3.1020842399912083e+00 -1.0532742547269329e+01 -3.1894290322559044e-01 -2.9343349200217563e+00 -7.1052669304977378e+00 9.0613620630288905e-01 2.6996513353216507e+00 7.3699037516725596e+00 -2.3699272013433741e+00 -5.2444807435868317e-02 -9.2161351116571075e-02 2.3795004037973935e+00 2.5037970577723689e-01 5.5511684360381075e-01 1.2007829562056465e+00 1.5709337483377375e-01 3.2859673179532656e-01 -1.2016302580988749e+00 -4.4720590337805670e-02 -1.0316897971775160e-01 -4.7824045754727882e+00 -2.9076513535830689e-01 -6.1024870793174946e-01 4.7973633214671469e+00 7.8060000936858637e-02 1.6704419739126639e-01 2.4055523916657227e+00 6.7692375819036713e-02 1.2561837430235911e-01 -2.4292370382208714e+00 -1.6529492423492509e-01 -3.7079710832669061e-01 -4.6739307213006606e-02 -3.8184089483738939e+00 -2.6047014102805317e+00 2.5378228783341589e-01 3.4967060928721985e+00 2.5038116427423343e+00 3.0816459556717335e-01 2.5093698265038746e+00 2.3581262024906922e+00 -3.9793228588927927e-02 -2.2281832464661582e+00 -2.3156552388717460e+00 -2.9139764891997766e-01 -6.3756472245329059e+00 -3.1020842399912083e+00 7.8060000936858651e-02 6.0836693760669274e+00 2.8397112605391879e+00 6.1008474506544078e-02 3.8246404070173465e+00 2.7533930053994102e+00 -3.2308517412207965e-01 -3.4921462830873882e+00 -2.4326012220281390e+00 -9.4151450901735656e-02 -2.9587959293479358e+00 -7.6047010458944957e+00 5.5847177776601675e-01 2.4939688839724865e+00 7.8673831065176341e+00 6.8090977881264825e-01 2.7232411599836386e+00 5.9114764200790875e+00 -9.1136585024061759e-02 -2.2934450549124170e+00 -6.3658646710408950e+00 -6.0959018614781857e-01 -3.0923449512116172e+00 -1.0532742547269329e+01 1.6704419739126644e-01 2.8397112605391888e+00 1.1036993399892076e+01 1.1172656146198752e-01 2.7276927932605619e+00 7.5332724288579636e+00 -7.2327409335830284e-01 -2.4400281622839071e+00 -7.8458170911420462e+00 -1.1998579426674845e+00 -4.4591634531827247e-02 -7.0782076149968676e-02 1.1974462578712775e+00 1.7509523115184672e-01 2.9519227141225618e-01 2.3983260627875089e+00 3.0941216527120530e-01 5.0575132318822846e-01 -2.3991190761015799e+00 -3.2056132020671757e-02 -6.7978730493413395e-02 -2.4236604536662418e+00 -1.9968156400340012e-01 -3.1894290322559044e-01 2.4055523916657222e+00 6.1008474506544064e-02 1.1172656146198751e-01 4.8508151230968011e+00 7.3866270037210191e-02 1.2368034826452262e-01 -4.8295023629860037e+00 -3.4305281041090713e-01 -5.7864679445802214e-01 -5.4782963311237769e-02 -2.9089258431939298e+00 -2.7788277533610839e+00 3.9517401383062206e-01 2.5058336066861311e+00 2.7103286929210189e+00 2.8157980151688605e-01 4.1433061108783633e+00 2.8481567714639788e+00 -4.3257247490347608e-02 -3.7854356542740395e+00 -2.8498681902262017e+00 -4.0995528709515883e-01 -4.2365553236331017e+00 -2.9343349200217563e+00 6.7692375819036713e-02 3.8246404070173465e+00 2.7276927932605619e+00 7.3866270037210191e-02 6.8268190767333898e+00 3.2359147513525039e+00 -3.1031696330701075e-01 -6.3696823802141598e+00 -2.9590621453890216e+00 -8.6675668208877371e-02 -2.7582899301914150e+00 -5.6812756338323611e+00 6.3998880865021512e-01 2.3590867374218649e+00 5.9229475553769646e+00 4.5748141942248410e-01 2.8432181806128960e+00 7.0002428739530940e+00 -7.3450146134182784e-02 -2.4837395553770563e+00 -7.4223543729221841e+00 -6.6025611537487461e-01 -2.9419584104949434e+00 -7.1052669304977378e+00 1.2561837430235911e-01 2.7533930053994102e+00 7.5332724288579653e+00 1.2368034826452262e-01 3.2359147513525039e+00 1.0135950735873632e+01 -5.2638702092164613e-01 -3.0076247787232613e+00 -1.0383516656809368e+01 1.1692761728729082e+00 3.9154013445067620e-01 6.3944847389800563e-01 -1.3636369092475995e+00 -4.1012468102303123e-01 -9.0678168280725169e-01 -2.5709865928194278e+00 -5.1980834054113556e-01 -9.0985348546923517e-01 2.3844342145564723e+00 2.2145743997470785e-01 4.9441489774418268e-01 2.5517232383311947e+00 4.8199525721787018e-01 9.0613620630288894e-01 -2.4292370382208714e+00 -3.2308517412207971e-01 -7.2327409335830273e-01 -4.8295023629860037e+00 -3.1031696330701075e-01 -5.2638702092164613e-01 5.0879292775133269e+00 4.6834232735000314e-01 1.0262967046113582e+00 1.8163469484381925e-01 2.4698947431376479e+00 2.3586054168568564e+00 -4.1115921302837949e-01 -2.2180749917012963e+00 -2.2581426646768499e+00 -4.6765822105658839e-01 -3.7758358341363811e+00 -2.4392702760797822e+00 2.5040245287940155e-01 3.4547719153760643e+00 2.3948282438011663e+00 4.8678569365757607e-01 3.7896211750011797e+00 2.6996513353216507e+00 -1.6529492423492509e-01 -3.4921462830873882e+00 -2.4400281622839066e+00 -3.4305281041090718e-01 -6.3696823802141598e+00 -3.0076247787232617e+00 4.6834232735000308e-01 6.1414516556243353e+00 2.6919808857841270e+00 3.0784488263951398e-01 2.6958703298959401e+00 5.8873125135567346e+00 -9.0968853543111616e-01 -2.2597273138656182e+00 -6.2075647795874067e+00 -9.3225084274848313e-01 -2.7880011833263945e+00 -7.2527971995305691e+00 5.5473343589218282e-01 2.3866137398098299e+00 7.6496125787699496e+00 9.0250825782125721e-01 2.6649269091192780e+00 7.3699037516725596e+00 -3.7079710832669061e-01 -2.4326012220281390e+00 -7.8458170911420462e+00 -5.7864679445802214e-01 -2.9590621453890216e+00 -1.0383516656809368e+01 1.0262967046113585e+00 2.6919808857841265e+00 1.0782866883070145e+01 hypre-2.33.0/src/test/TEST_fei/SFEI.3000066400000000000000000037141351477326011500167340ustar00rootroot0000000000000069 24 1092 1280 246 247 248 318 319 320 333 334 335 261 262 263 249 250 251 321 322 323 1092 1093 1094 660 661 662 2.6942848025714273e-02 -3.9789767737325862e-03 -3.9789767737325845e-03 4.1487195487357022e-04 -1.3144099991697253e-02 -1.3144099991697251e-02 -3.7737021505250892e-03 -6.6391873582025336e-04 -3.0444839106824910e-03 4.8902804234518559e-04 6.1313779274678928e-03 3.9387982222748065e-03 4.8902804234518668e-04 3.9387982222748048e-03 6.1313779274678893e-03 -3.7737021505250905e-03 -3.0444839106824892e-03 -6.6391873582025119e-04 -7.4445733899489667e-03 3.2662355568597577e-03 3.2662355568597590e-03 -1.3343798374279073e-02 7.4950677053301287e-03 7.4950677053301261e-03 -3.9789767737325853e-03 4.7421475228665806e-02 2.1922072888407376e-02 -1.7479536130707411e-02 -5.1796186328196200e-03 -1.0534746629976652e-03 -7.8594003024716440e-03 -2.8004755224230553e-02 -5.0009802850548186e-03 7.4287760483206103e-03 1.9521498370666419e-03 1.0184220348249380e-02 4.2460469027965622e-03 2.2982098728515501e-02 9.4515766237074517e-03 -8.5268440766533629e-03 -5.8645111355526908e-03 -1.5503799860421923e-02 5.2762862489080615e-03 -2.5678249916543536e-02 -1.8884944216990596e-02 2.0893648083539766e-02 -7.6285888851015601e-03 -1.1146708348991987e-03 -3.9789767737325836e-03 2.1922072888407376e-02 4.7421475228665813e-02 -1.7479536130707407e-02 -1.0534746629976652e-03 -5.1796186328196235e-03 -8.5268440766533612e-03 -1.5503799860421925e-02 -5.8645111355526873e-03 4.2460469027965613e-03 9.4515766237074465e-03 2.2982098728515504e-02 7.4287760483206112e-03 1.0184220348249375e-02 1.9521498370666428e-03 -7.8594003024716474e-03 -5.0009802850548195e-03 -2.8004755224230550e-02 5.2762862489080607e-03 -1.8884944216990593e-02 -2.5678249916543546e-02 2.0893648083539763e-02 -1.1146708348992035e-03 -7.6285888851015515e-03 4.1487195487357065e-04 -1.7479536130707411e-02 -1.7479536130707411e-02 6.7926132607728229e-02 6.4418194915563025e-04 6.4418194915563339e-04 2.0972191263416477e-02 1.7671203540576733e-02 -9.6535826954060938e-04 -2.5094528567967664e-02 3.8147303205690391e-04 -2.1546785664746073e-02 -2.5094528567967650e-02 -2.1546785664746073e-02 3.8147303205689854e-04 2.0972191263416477e-02 -9.6535826954060114e-04 1.7671203540576733e-02 -1.3021717664601810e-02 2.0612525366590584e-02 2.0612525366590584e-02 -4.7074612288897616e-02 6.8229617661424579e-04 6.8229617661423527e-04 -1.3144099991697253e-02 -5.1796186328196192e-03 -1.0534746629976639e-03 6.4418194915562938e-04 2.3024371780559993e-02 2.9795488093043441e-04 1.3472943616127001e-02 3.5645106065052340e-03 1.3706642211960268e-04 9.2455100556506598e-05 -5.9687084462852133e-03 2.3845890475905222e-04 -8.0242684330255696e-03 -7.1438923159200954e-03 -2.9308719332210033e-05 -2.2513865274653247e-04 3.9256784793168728e-03 5.0670220354031930e-04 7.4836541594492005e-03 -5.1468908038155908e-03 -2.3948654399655846e-04 -2.9972774781898172e-04 -7.0754506675415781e-03 1.4208751497702435e-04 -1.3144099991697251e-02 -1.0534746629976648e-03 -5.1796186328196226e-03 6.4418194915563339e-04 2.9795488093043424e-04 2.3024371780559993e-02 -2.2513865274652667e-04 5.0670220354032103e-04 3.9256784793168737e-03 -8.0242684330255748e-03 -2.9308719332209329e-05 -7.1438923159201015e-03 9.2455100556505473e-05 2.3845890475905060e-04 -5.9687084462852098e-03 1.3472943616126996e-02 1.3706642211960108e-04 3.5645106065052331e-03 7.4836541594492040e-03 -2.3948654399655659e-04 -5.1468908038155899e-03 -2.9972774781898584e-04 1.4208751497702519e-04 -7.0754506675415763e-03 -3.7737021505250901e-03 -7.8594003024716457e-03 -8.5268440766533612e-03 2.0972191263416477e-02 1.3472943616127001e-02 -2.2513865274652634e-04 2.7200618441048627e-02 1.3350655252428208e-02 -5.7673194823964114e-04 -1.5035095271776228e-02 -6.5054594851551798e-03 -6.7090459146267843e-03 -1.0819557482608809e-02 -1.1373181616237502e-02 2.4221236916603331e-04 8.1664863471752943e-03 2.5095094846237752e-03 8.3955470461810344e-03 -7.7014720144992087e-04 3.9545067570132611e-03 6.6231391366033182e-03 -2.5940793945280354e-02 -7.5495737063279124e-03 7.7686204031592314e-04 -6.6391873582025411e-04 -2.8004755224230553e-02 -1.5503799860421925e-02 1.7671203540576733e-02 3.5645106065052340e-03 5.0670220354032038e-04 1.3350655252428208e-02 4.1683307986180931e-02 -8.0672024070629748e-04 -7.5641692479420314e-03 -7.1926806892071626e-03 -1.1321881887840213e-02 -1.2634759665663112e-02 -2.3882824371653351e-02 4.7940620191363846e-04 8.3955470461810344e-03 -5.0179938143051590e-04 1.6048915177941110e-02 2.7591357581657036e-03 2.2012653720070437e-02 1.0126644224205750e-02 -2.1313693947926277e-02 -7.6784126462350133e-03 4.7073418136761022e-04 -3.0444839106824914e-03 -5.0009802850548178e-03 -5.8645111355526873e-03 -9.6535826954060905e-04 1.3706642211960246e-04 3.9256784793168737e-03 -5.7673194823964027e-04 -8.0672024070629737e-04 1.9177180317116186e-02 -6.5079074281280316e-03 -1.0257913058704465e-02 -6.5203210791197948e-03 6.4621914230354239e-04 1.0839203034003677e-03 -3.7586052509203860e-03 2.5095094846237717e-03 5.4305863607887490e-03 -5.0179938143051980e-04 6.7167870713669446e-03 8.7479387702265547e-03 8.1125720774288465e-04 1.2219658582965131e-03 6.6610172793030555e-04 -7.2688791571525555e-03 4.8902804234518624e-04 7.4287760483206103e-03 4.2460469027965630e-03 -2.5094528567967664e-02 9.2455100556506110e-05 -8.0242684330255765e-03 -1.5035095271776228e-02 -7.5641692479420314e-03 -6.5079074281280307e-03 2.8934339074296024e-02 -5.6917725343471312e-05 1.3124644278524972e-02 7.1202322706214590e-03 8.4321723729121195e-03 2.3126904205420739e-03 -1.0819557482608811e-02 6.4621914230353979e-04 -1.2634759665663116e-02 -3.6499264472244627e-03 -8.2967088837638311e-03 -7.7185141516953031e-03 1.8055508382314490e-02 -6.8182680704344560e-04 1.5202068076648419e-02 6.1313779274678928e-03 1.9521498370666411e-03 9.4515766237074465e-03 3.8147303205690402e-04 -5.9687084462852133e-03 -2.9308719332208746e-05 -6.5054594851551789e-03 -7.1926806892071591e-03 -1.0257913058704467e-02 -5.6917725343472105e-05 2.0778369551401148e-02 -9.9374469414234237e-05 2.3126904205420726e-03 -9.8472121800823541e-04 5.7024510496751675e-03 2.4221236916603648e-04 -3.7586052509203873e-03 4.7940620191364426e-04 -2.5538734006438895e-03 -6.9204449549797147e-03 -5.3131399896678214e-03 4.8496861909635682e-05 2.0946411709329292e-03 6.6302361822471822e-05 3.9387982222748056e-03 1.0184220348249378e-02 2.2982098728515504e-02 -2.1546785664746073e-02 2.3845890475905233e-04 -7.1438923159201015e-03 -6.7090459146267826e-03 -1.1321881887840213e-02 -6.5203210791197957e-03 1.3124644278524967e-02 -9.9374469414234020e-05 4.2135454201245995e-02 8.4321723729121195e-03 1.4480223452236528e-02 -9.8472121800823216e-04 -1.1373181616237503e-02 1.0839203034003627e-03 -2.3882824371653351e-02 4.8711385758850711e-04 -1.4308435649055967e-02 -2.7045593197892629e-02 1.3646284464309953e-02 -2.5713100233491364e-04 4.5979925283261324e-04 4.8902804234518668e-04 4.2460469027965622e-03 7.4287760483206112e-03 -2.5094528567967660e-02 -8.0242684330255696e-03 9.2455100556506300e-05 -1.0819557482608809e-02 -1.2634759665663114e-02 6.4621914230354228e-04 7.1202322706214590e-03 2.3126904205420721e-03 8.4321723729121195e-03 2.8934339074296003e-02 1.3124644278524961e-02 -5.6917725343469320e-05 -1.5035095271776218e-02 -6.5079074281280307e-03 -7.5641692479420323e-03 -3.6499264472244584e-03 -7.7185141516953031e-03 -8.2967088837638311e-03 1.8055508382314487e-02 1.5202068076648416e-02 -6.8182680704344202e-04 3.9387982222748056e-03 2.2982098728515504e-02 1.0184220348249375e-02 -2.1546785664746073e-02 -7.1438923159200972e-03 2.3845890475905138e-04 -1.1373181616237500e-02 -2.3882824371653351e-02 1.0839203034003675e-03 8.4321723729121178e-03 -9.8472121800823628e-04 1.4480223452236530e-02 1.3124644278524961e-02 4.2135454201245974e-02 -9.9374469414231499e-05 -6.7090459146267774e-03 -6.5203210791197879e-03 -1.1321881887840215e-02 4.8711385758851275e-04 -2.7045593197892619e-02 -1.4308435649055967e-02 1.3646284464309950e-02 4.5979925283259719e-04 -2.5713100233490507e-04 6.1313779274678893e-03 9.4515766237074517e-03 1.9521498370666445e-03 3.8147303205689773e-04 -2.9308719332210060e-05 -5.9687084462852098e-03 2.4221236916603368e-04 4.7940620191363879e-04 -3.7586052509203864e-03 2.3126904205420747e-03 5.7024510496751684e-03 -9.8472121800823281e-04 -5.6917725343469042e-05 -9.9374469414231228e-05 2.0778369551401134e-02 -6.5054594851551781e-03 -1.0257913058704458e-02 -7.1926806892071539e-03 -2.5538734006438878e-03 -5.3131399896678266e-03 -6.9204449549797138e-03 4.8496861909641699e-05 6.6302361822470819e-05 2.0946411709329227e-03 -3.7737021505250905e-03 -8.5268440766533629e-03 -7.8594003024716474e-03 2.0972191263416477e-02 -2.2513865274653244e-04 1.3472943616126996e-02 8.1664863471752926e-03 8.3955470461810344e-03 2.5095094846237717e-03 -1.0819557482608813e-02 2.4221236916603626e-04 -1.1373181616237503e-02 -1.5035095271776214e-02 -6.7090459146267774e-03 -6.5054594851551772e-03 2.7200618441048617e-02 -5.7673194823964059e-04 1.3350655252428208e-02 -7.7014720144992195e-04 6.6231391366033199e-03 3.9545067570132620e-03 -2.5940793945280347e-02 7.7686204031592791e-04 -7.5495737063279132e-03 -3.0444839106824897e-03 -5.8645111355526908e-03 -5.0009802850548195e-03 -9.6535826954060114e-04 3.9256784793168728e-03 1.3706642211960119e-04 2.5095094846237756e-03 -5.0179938143051590e-04 5.4305863607887516e-03 6.4621914230353990e-04 -3.7586052509203877e-03 1.0839203034003629e-03 -6.5079074281280298e-03 -6.5203210791197870e-03 -1.0257913058704458e-02 -5.7673194823964038e-04 1.9177180317116176e-02 -8.0672024070629444e-04 6.7167870713669385e-03 8.1125720774288790e-04 8.7479387702265547e-03 1.2219658582965079e-03 -7.2688791571525555e-03 6.6610172793030674e-04 -6.6391873582025043e-04 -1.5503799860421925e-02 -2.8004755224230550e-02 1.7671203540576733e-02 5.0670220354031941e-04 3.5645106065052340e-03 8.3955470461810344e-03 1.6048915177941110e-02 -5.0179938143051948e-04 -1.2634759665663114e-02 4.7940620191364405e-04 -2.3882824371653354e-02 -7.5641692479420323e-03 -1.1321881887840212e-02 -7.1926806892071539e-03 1.3350655252428208e-02 -8.0672024070629488e-04 4.1683307986180931e-02 2.7591357581657058e-03 1.0126644224205750e-02 2.2012653720070437e-02 -2.1313693947926274e-02 4.7073418136761819e-04 -7.6784126462350194e-03 -7.4445733899489667e-03 5.2762862489080624e-03 5.2762862489080615e-03 -1.3021717664601808e-02 7.4836541594491997e-03 7.4836541594492040e-03 -7.7014720144992022e-04 2.7591357581657032e-03 6.7167870713669446e-03 -3.6499264472244627e-03 -2.5538734006438895e-03 4.8711385758850798e-04 -3.6499264472244592e-03 4.8711385758851253e-04 -2.5538734006438886e-03 -7.7014720144992282e-04 6.7167870713669385e-03 2.7591357581657049e-03 2.7033846822737941e-02 -4.9509718706622057e-03 -4.9509718706622083e-03 2.2725915291615974e-03 -1.5218131824172323e-02 -1.5218131824172323e-02 3.2662355568597572e-03 -2.5678249916543536e-02 -1.8884944216990593e-02 2.0612525366590580e-02 -5.1468908038155917e-03 -2.3948654399655702e-04 3.9545067570132611e-03 2.2012653720070437e-02 8.7479387702265547e-03 -8.2967088837638311e-03 -6.9204449549797138e-03 -1.4308435649055970e-02 -7.7185141516953031e-03 -2.7045593197892619e-02 -5.3131399896678257e-03 6.6231391366033199e-03 8.1125720774288595e-04 1.0126644224205750e-02 -4.9509718706622057e-03 4.5456810292457031e-02 2.0082351021905288e-02 -1.3490211910945574e-02 -3.4895423470388712e-03 -2.1092761662664912e-04 3.2662355568597581e-03 -1.8884944216990596e-02 -2.5678249916543543e-02 2.0612525366590584e-02 -2.3948654399655832e-04 -5.1468908038155899e-03 6.6231391366033182e-03 1.0126644224205754e-02 8.1125720774288639e-04 -7.7185141516953031e-03 -5.3131399896678231e-03 -2.7045593197892629e-02 -8.2967088837638311e-03 -1.4308435649055968e-02 -6.9204449549797138e-03 3.9545067570132628e-03 8.7479387702265547e-03 2.2012653720070434e-02 -4.9509718706622083e-03 2.0082351021905288e-02 4.5456810292457031e-02 -1.3490211910945580e-02 -2.1092761662664186e-04 -3.4895423470388794e-03 -1.3343798374279072e-02 2.0893648083539766e-02 2.0893648083539763e-02 -4.7074612288897616e-02 -2.9972774781898150e-04 -2.9972774781898627e-04 -2.5940793945280354e-02 -2.1313693947926277e-02 1.2219658582965139e-03 1.8055508382314494e-02 4.8496861909636414e-05 1.3646284464309955e-02 1.8055508382314487e-02 1.3646284464309948e-02 4.8496861909641740e-05 -2.5940793945280351e-02 1.2219658582965087e-03 -2.1313693947926277e-02 2.2725915291616026e-03 -1.3490211910945581e-02 -1.3490211910945576e-02 7.3916390259946813e-02 -7.0676166136503216e-04 -7.0676166136502305e-04 7.4950677053301270e-03 -7.6285888851015601e-03 -1.1146708348992035e-03 6.8229617661424557e-04 -7.0754506675415763e-03 1.4208751497702524e-04 -7.5495737063279124e-03 -7.6784126462350159e-03 6.6610172793030555e-04 -6.8182680704344592e-04 2.0946411709329288e-03 -2.5713100233491369e-04 1.5202068076648412e-02 4.5979925283259979e-04 6.6302361822471008e-05 7.7686204031592791e-04 -7.2688791571525555e-03 4.7073418136761840e-04 -1.5218131824172325e-02 -3.4895423470388716e-03 -2.1092761662664221e-04 -7.0676166136503476e-04 3.0586433279304048e-02 2.3750366776334022e-04 7.4950677053301261e-03 -1.1146708348991985e-03 -7.6285888851015532e-03 6.8229617661423516e-04 1.4208751497702445e-04 -7.0754506675415763e-03 7.7686204031592347e-04 4.7073418136761000e-04 -7.2688791571525555e-03 1.5202068076648421e-02 6.6302361822471713e-05 4.5979925283261324e-04 -6.8182680704344213e-04 -2.5713100233490513e-04 2.0946411709329227e-03 -7.5495737063279141e-03 6.6610172793030718e-04 -7.6784126462350194e-03 -1.5218131824172325e-02 -2.1092761662665037e-04 -3.4895423470388785e-03 -7.0676166136502316e-04 2.3750366776334014e-04 3.0586433279304048e-02 249 250 251 321 322 323 1092 1093 1094 660 661 662 663 664 665 984 985 986 1095 1096 1097 666 667 668 2.0778369551401107e-02 -9.9374469414229520e-05 -5.6917725343468418e-05 -7.1926806892071409e-03 -1.0257913058704195e-02 -6.5054594851550046e-03 -6.9204449549797164e-03 -5.3131399896676800e-03 -2.5538734006438310e-03 2.0946411709329114e-03 6.6302361822461928e-05 4.8496861909649207e-05 1.9521498370666847e-03 9.4515766237072245e-03 6.1313779274677245e-03 -5.9687084462852376e-03 -2.9308719332214479e-05 3.8147303205688239e-04 -3.7586052509204007e-03 4.7940620191362052e-04 2.4221236916602376e-04 -9.8472121800820614e-04 5.7024510496750148e-03 2.3126904205420266e-03 -9.9374469414229791e-05 4.2135454201244718e-02 1.3124644278524200e-02 -1.1321881887839209e-02 -6.5203210791198157e-03 -6.7090459146261728e-03 -1.4308435649054948e-02 -2.7045593197891446e-02 4.8711385758834198e-04 -2.5713100233488957e-04 4.5979925283266463e-04 1.3646284464308633e-02 1.0184220348248431e-02 2.2982098728514321e-02 3.9387982222748395e-03 2.3845890475905328e-04 -7.1438923159200694e-03 -2.1546785664744550e-02 1.0839203034003046e-03 -2.3882824371652157e-02 -1.1373181616236809e-02 1.4480223452235491e-02 -9.8472121800819768e-04 8.4321723729115089e-03 -5.6917725343468107e-05 1.3124644278524200e-02 2.8934339074295504e-02 -7.5641692479413835e-03 -6.5079074281278754e-03 -1.5035095271775744e-02 -8.2967088837632291e-03 -7.7185141516947151e-03 -3.6499264472246527e-03 -6.8182680704342445e-04 1.5202068076648052e-02 1.8055508382313516e-02 7.4287760483199867e-03 4.2460469027960357e-03 4.8902804234532990e-04 9.2455100556508712e-05 -8.0242684330253510e-03 -2.5094528567966578e-02 6.4621914230350564e-04 -1.2634759665662364e-02 -1.0819557482608398e-02 8.4321723729115054e-03 2.3126904205420314e-03 7.1202322706210158e-03 -7.1926806892071392e-03 -1.1321881887839209e-02 -7.5641692479413826e-03 4.1683307986179564e-02 -8.0672024070624891e-04 1.3350655252427420e-02 2.2012653720069254e-02 1.0126644224204813e-02 2.7591357581658116e-03 -7.6784126462350315e-03 4.7073418136757894e-04 -2.1313693947924761e-02 -2.8004755224229277e-02 -1.5503799860420825e-02 -6.6391873582035798e-04 3.5645106065052335e-03 5.0670220354029241e-04 1.7671203540575248e-02 -5.0179938143044662e-04 1.6048915177939976e-02 8.3955470461804099e-03 -2.3882824371652157e-02 4.7940620191361049e-04 -1.2634759665662373e-02 -1.0257913058704195e-02 -6.5203210791198157e-03 -6.5079074281278772e-03 -8.0672024070624782e-04 1.9177180317116141e-02 -5.7673194823960785e-04 8.7479387702263673e-03 8.1125720774296293e-04 6.7167870713667572e-03 6.6610172793028701e-04 -7.2688791571525841e-03 1.2219658582964320e-03 -5.0009802850547094e-03 -5.8645111355527255e-03 -3.0444839106824116e-03 1.3706642211959615e-04 3.9256784793168624e-03 -9.6535826954053565e-04 5.4305863607885989e-03 -5.0179938143044608e-04 2.5095094846237366e-03 1.0839203034003044e-03 -3.7586052509203964e-03 6.4621914230350520e-04 -6.5054594851550029e-03 -6.7090459146261728e-03 -1.5035095271775744e-02 1.3350655252427422e-02 -5.7673194823960763e-04 2.7200618441048121e-02 3.9545067570127598e-03 6.6231391366027284e-03 -7.7014720144973677e-04 -7.5495737063277155e-03 7.7686204031589799e-04 -2.5940793945279299e-02 -7.8594003024710386e-03 -8.5268440766527488e-03 -3.7737021505252388e-03 1.3472943616126647e-02 -2.2513865274653111e-04 2.0972191263415457e-02 2.5095094846237353e-03 8.3955470461804030e-03 8.1664863471748554e-03 -1.1373181616236809e-02 2.4221236916601878e-04 -1.0819557482608398e-02 -6.9204449549797147e-03 -1.4308435649054948e-02 -8.2967088837632274e-03 2.2012653720069254e-02 8.7479387702263673e-03 3.9545067570127598e-03 4.5456810292455824e-02 2.0082351021904109e-02 -4.9509718706619099e-03 -3.4895423470388807e-03 -2.1092761662663091e-04 -1.3490211910944289e-02 -2.5678249916542415e-02 -1.8884944216989465e-02 3.2662355568595499e-03 -5.1468908038155960e-03 -2.3948654399655428e-04 2.0612525366589116e-02 8.1125720774296347e-04 1.0126644224204798e-02 6.6231391366027336e-03 -2.7045593197891429e-02 -5.3131399896676869e-03 -7.7185141516947151e-03 -5.3131399896676800e-03 -2.7045593197891453e-02 -7.7185141516947151e-03 1.0126644224204815e-02 8.1125720774296315e-04 6.6231391366027301e-03 2.0082351021904116e-02 4.5456810292455838e-02 -4.9509718706619125e-03 -2.1092761662664300e-04 -3.4895423470388837e-03 -1.3490211910944287e-02 -1.8884944216989469e-02 -2.5678249916542422e-02 3.2662355568595486e-03 -2.3948654399654875e-04 -5.1468908038155943e-03 2.0612525366589123e-02 8.7479387702263690e-03 2.2012653720069254e-02 3.9545067570127632e-03 -1.4308435649054957e-02 -6.9204449549797147e-03 -8.2967088837632361e-03 -2.5538734006438310e-03 4.8711385758834139e-04 -3.6499264472246531e-03 2.7591357581658107e-03 6.7167870713667572e-03 -7.7014720144973786e-04 -4.9509718706619099e-03 -4.9509718706619125e-03 2.7033846822737823e-02 -1.5218131824171935e-02 -1.5218131824171944e-02 2.2725915291612313e-03 5.2762862489077605e-03 5.2762862489077631e-03 -7.4445733899489242e-03 7.4836541594490045e-03 7.4836541594490071e-03 -1.3021717664601352e-02 6.7167870713667529e-03 2.7591357581658147e-03 -7.7014720144973786e-04 4.8711385758834334e-04 -2.5538734006438279e-03 -3.6499264472246440e-03 2.0946411709329106e-03 -2.5713100233488930e-04 -6.8182680704342445e-04 -7.6784126462350298e-03 6.6610172793028712e-04 -7.5495737063277155e-03 -3.4895423470388807e-03 -2.1092761662664300e-04 -1.5218131824171933e-02 3.0586433279304034e-02 2.3750366776332862e-04 -7.0676166136499476e-04 -7.6285888851015159e-03 -1.1146708348991460e-03 7.4950677053299197e-03 -7.0754506675415937e-03 1.4208751497701792e-04 6.8229617661420415e-04 -7.2688791571525911e-03 4.7073418136757699e-04 7.7686204031589875e-04 4.5979925283266550e-04 6.6302361822466238e-05 1.5202068076648045e-02 6.6302361822461928e-05 4.5979925283266528e-04 1.5202068076648048e-02 4.7073418136757883e-04 -7.2688791571525824e-03 7.7686204031589756e-04 -2.1092761662663080e-04 -3.4895423470388837e-03 -1.5218131824171942e-02 2.3750366776332857e-04 3.0586433279304031e-02 -7.0676166136499530e-04 -1.1146708348991501e-03 -7.6285888851015168e-03 7.4950677053299240e-03 1.4208751497701806e-04 -7.0754506675415928e-03 6.8229617661420610e-04 6.6610172793028798e-04 -7.6784126462350367e-03 -7.5495737063277155e-03 -2.5713100233489537e-04 2.0946411709329106e-03 -6.8182680704342315e-04 4.8496861909649641e-05 1.3646284464308633e-02 1.8055508382313519e-02 -2.1313693947924761e-02 1.2219658582964326e-03 -2.5940793945279299e-02 -1.3490211910944291e-02 -1.3490211910944287e-02 2.2725915291612266e-03 -7.0676166136499552e-04 -7.0676166136499552e-04 7.3916390259944301e-02 2.0893648083538295e-02 2.0893648083538295e-02 -1.3343798374278707e-02 -2.9972774781895938e-04 -2.9972774781896329e-04 -4.7074612288895271e-02 1.2219658582964324e-03 -2.1313693947924754e-02 -2.5940793945279310e-02 1.3646284464308633e-02 4.8496861909659222e-05 1.8055508382313519e-02 1.9521498370666866e-03 1.0184220348248431e-02 7.4287760483199867e-03 -2.8004755224229277e-02 -5.0009802850547102e-03 -7.8594003024710386e-03 -2.5678249916542415e-02 -1.8884944216989469e-02 5.2762862489077614e-03 -7.6285888851015159e-03 -1.1146708348991493e-03 2.0893648083538295e-02 4.7421475228664502e-02 2.1922072888406103e-02 -3.9789767737323511e-03 -5.1796186328195775e-03 -1.0534746629976078e-03 -1.7479536130705960e-02 -5.8645111355527246e-03 -1.5503799860420815e-02 -8.5268440766527488e-03 2.2982098728514311e-02 9.4515766237072297e-03 4.2460469027960400e-03 9.4515766237072245e-03 2.2982098728514325e-02 4.2460469027960374e-03 -1.5503799860420825e-02 -5.8645111355527272e-03 -8.5268440766527471e-03 -1.8884944216989465e-02 -2.5678249916542422e-02 5.2762862489077631e-03 -1.1146708348991473e-03 -7.6285888851015168e-03 2.0893648083538295e-02 2.1922072888406106e-02 4.7421475228664522e-02 -3.9789767737323529e-03 -1.0534746629976158e-03 -5.1796186328195827e-03 -1.7479536130705960e-02 -5.0009802850547102e-03 -2.8004755224229273e-02 -7.8594003024710420e-03 1.0184220348248436e-02 1.9521498370666894e-03 7.4287760483199919e-03 6.1313779274677262e-03 3.9387982222748403e-03 4.8902804234533012e-04 -6.6391873582035896e-04 -3.0444839106824116e-03 -3.7737021505252410e-03 3.2662355568595495e-03 3.2662355568595482e-03 -7.4445733899489242e-03 7.4950677053299197e-03 7.4950677053299223e-03 -1.3343798374278706e-02 -3.9789767737323511e-03 -3.9789767737323537e-03 2.6942848025714179e-02 -1.3144099991696915e-02 -1.3144099991696918e-02 4.1487195487327944e-04 -3.0444839106824086e-03 -6.6391873582035939e-04 -3.7737021505252388e-03 3.9387982222748386e-03 6.1313779274677245e-03 4.8902804234532394e-04 -5.9687084462852385e-03 2.3845890475905293e-04 9.2455100556509119e-05 3.5645106065052335e-03 1.3706642211959634e-04 1.3472943616126649e-02 -5.1468908038155951e-03 -2.3948654399654840e-04 7.4836541594490054e-03 -7.0754506675415928e-03 1.4208751497701827e-04 -2.9972774781895938e-04 -5.1796186328195775e-03 -1.0534746629976136e-03 -1.3144099991696913e-02 2.3024371780559966e-02 2.9795488093042075e-04 6.4418194915559371e-04 3.9256784793168667e-03 5.0670220354029317e-04 -2.2513865274653434e-04 -7.1438923159200651e-03 -2.9308719332218280e-05 -8.0242684330253475e-03 -2.9308719332214723e-05 -7.1438923159200703e-03 -8.0242684330253510e-03 5.0670220354029241e-04 3.9256784793168624e-03 -2.2513865274653090e-04 -2.3948654399655442e-04 -5.1468908038155943e-03 7.4836541594490071e-03 1.4208751497701792e-04 -7.0754506675415928e-03 -2.9972774781896350e-04 -1.0534746629976078e-03 -5.1796186328195793e-03 -1.3144099991696915e-02 2.9795488093042086e-04 2.3024371780559966e-02 6.4418194915559642e-04 1.3706642211959230e-04 3.5645106065052413e-03 1.3472943616126647e-02 2.3845890475905382e-04 -5.9687084462852376e-03 9.2455100556506733e-05 3.8147303205688195e-04 -2.1546785664744550e-02 -2.5094528567966578e-02 1.7671203540575251e-02 -9.6535826954053565e-04 2.0972191263415457e-02 2.0612525366589116e-02 2.0612525366589120e-02 -1.3021717664601352e-02 6.8229617661420415e-04 6.8229617661420632e-04 -4.7074612288895278e-02 -1.7479536130705957e-02 -1.7479536130705960e-02 4.1487195487327944e-04 6.4418194915559284e-04 6.4418194915559772e-04 6.7926132607725578e-02 -9.6535826954053392e-04 1.7671203540575237e-02 2.0972191263415464e-02 -2.1546785664744557e-02 3.8147303205686802e-04 -2.5094528567966574e-02 -3.7586052509203994e-03 1.0839203034003048e-03 6.4621914230350564e-04 -5.0179938143044694e-04 5.4305863607885989e-03 2.5095094846237362e-03 8.1125720774296423e-04 8.7479387702263690e-03 6.7167870713667546e-03 -7.2688791571525911e-03 6.6610172793028777e-04 1.2219658582964315e-03 -5.8645111355527264e-03 -5.0009802850547102e-03 -3.0444839106824086e-03 3.9256784793168685e-03 1.3706642211959219e-04 -9.6535826954053392e-04 1.9177180317116141e-02 -8.0672024070624826e-04 -5.7673194823960828e-04 -6.5203210791198122e-03 -1.0257913058704195e-02 -6.5079074281278754e-03 4.7940620191362019e-04 -2.3882824371652157e-02 -1.2634759665662366e-02 1.6048915177939976e-02 -5.0179938143044629e-04 8.3955470461804030e-03 1.0126644224204798e-02 2.2012653720069254e-02 2.7591357581658138e-03 4.7073418136757807e-04 -7.6784126462350385e-03 -2.1313693947924754e-02 -1.5503799860420813e-02 -2.8004755224229273e-02 -6.6391873582035939e-04 5.0670220354029339e-04 3.5645106065052413e-03 1.7671203540575241e-02 -8.0672024070624836e-04 4.1683307986179551e-02 1.3350655252427419e-02 -1.1321881887839206e-02 -7.1926806892071496e-03 -7.5641692479413826e-03 2.4221236916602355e-04 -1.1373181616236809e-02 -1.0819557482608400e-02 8.3955470461804099e-03 2.5095094846237362e-03 8.1664863471748554e-03 6.6231391366027336e-03 3.9545067570127624e-03 -7.7014720144973764e-04 7.7686204031589962e-04 -7.5495737063277172e-03 -2.5940793945279313e-02 -8.5268440766527488e-03 -7.8594003024710420e-03 -3.7737021505252393e-03 -2.2513865274653418e-04 1.3472943616126647e-02 2.0972191263415464e-02 -5.7673194823960839e-04 1.3350655252427419e-02 2.7200618441048131e-02 -6.7090459146261728e-03 -6.5054594851550133e-03 -1.5035095271775746e-02 -9.8472121800820614e-04 1.4480223452235494e-02 8.4321723729115037e-03 -2.3882824371652157e-02 1.0839203034003042e-03 -1.1373181616236809e-02 -2.7045593197891429e-02 -1.4308435649054957e-02 4.8711385758834323e-04 4.5979925283266658e-04 -2.5713100233489466e-04 1.3646284464308631e-02 2.2982098728514311e-02 1.0184220348248438e-02 3.9387982222748386e-03 -7.1438923159200659e-03 2.3845890475905371e-04 -2.1546785664744557e-02 -6.5203210791198122e-03 -1.1321881887839206e-02 -6.7090459146261737e-03 4.2135454201244697e-02 -9.9374469414221416e-05 1.3124644278524198e-02 5.7024510496750131e-03 -9.8472121800819747e-04 2.3126904205420314e-03 4.7940620191361038e-04 -3.7586052509203959e-03 2.4221236916601872e-04 -5.3131399896676861e-03 -6.9204449549797147e-03 -2.5538734006438279e-03 6.6302361822466482e-05 2.0946411709329110e-03 4.8496861909658775e-05 9.4515766237072314e-03 1.9521498370666899e-03 6.1313779274677254e-03 -2.9308719332218267e-05 -5.9687084462852376e-03 3.8147303205686824e-04 -1.0257913058704195e-02 -7.1926806892071496e-03 -6.5054594851550115e-03 -9.9374469414220576e-05 2.0778369551401096e-02 -5.6917725343462177e-05 2.3126904205420266e-03 8.4321723729115072e-03 7.1202322706210158e-03 -1.2634759665662373e-02 6.4621914230350542e-04 -1.0819557482608396e-02 -7.7185141516947151e-03 -8.2967088837632361e-03 -3.6499264472246457e-03 1.5202068076648045e-02 -6.8182680704342250e-04 1.8055508382313519e-02 4.2460469027960400e-03 7.4287760483199893e-03 4.8902804234532329e-04 -8.0242684330253493e-03 9.2455100556506300e-05 -2.5094528567966578e-02 -6.5079074281278754e-03 -7.5641692479413835e-03 -1.5035095271775746e-02 1.3124644278524200e-02 -5.6917725343462720e-05 2.8934339074295500e-02 663 664 665 984 985 986 1095 1096 1097 666 667 668 939 940 941 987 988 989 1098 1099 1100 669 670 671 2.3734014755130709e-02 -4.4651982419893965e-03 -2.5658470804655244e-03 -4.1286735863034739e-03 -1.0368032353604966e-02 -4.7830909386857613e-03 -3.7358611349196350e-03 -2.7077549802014631e-03 -2.7303619292964832e-03 4.5233984097401616e-03 -2.1772731795948325e-03 -3.5235547856092243e-03 -1.8884582068078369e-03 7.8701964710515167e-03 5.9002593794161414e-03 -7.7508079458282562e-03 1.6101318404373930e-03 5.1866946580197111e-03 -5.5209656962594417e-03 4.4701376444692244e-03 2.4128423951929124e-03 -5.2326465947522237e-03 5.7677927994325157e-03 1.0305830142823148e-04 -4.4651982419893948e-03 4.7388922238237229e-02 1.4536846334117157e-02 -1.1913114536426548e-02 -9.5496409435920065e-03 -1.0141235006296930e-02 -1.4085715894564015e-02 -2.9610460309660216e-02 -2.8615437736492408e-03 -2.2760979259475803e-03 4.6359873189398080e-03 1.5246053808498493e-02 8.7794810964045410e-03 2.5116508039243906e-02 6.5453170279541496e-03 3.6830571554631805e-03 -1.0553301766231229e-02 -2.3014617247429866e-02 5.1282867047885575e-03 -2.7344741919048281e-02 -1.2276478571746059e-02 1.5149301642271249e-02 -8.3272657889196854e-05 1.1965657428552290e-02 -2.5658470804655236e-03 1.4536846334117157e-02 3.1446479185464830e-02 -6.1531489083941574e-03 -9.4034355747198862e-03 -1.8864744725245016e-02 -8.4999277202671801e-03 -9.4903439966287344e-03 -6.4547442986536531e-03 -4.3634525153902820e-03 1.6275180020801840e-02 1.9844929482761911e-02 7.2521051681843337e-03 6.7786515424458019e-03 3.4432707724700740e-03 3.6905634404966305e-03 -9.4513684714390752e-03 -2.6066740690079804e-02 3.0520501380662916e-03 -1.3550859326928068e-02 -1.1861848148550779e-02 7.5876574777698812e-03 4.3053294723509718e-03 8.5133984218324354e-03 -4.1286735863034730e-03 -1.1913114536426548e-02 -6.1531489083941565e-03 4.2543784947310898e-02 1.0967500016433960e-03 1.7028189535738713e-02 2.3057826563182615e-02 1.1271331540888822e-02 6.4780563708355396e-03 -4.1506077288419084e-03 -1.2712010735155535e-03 -1.9588669017820810e-02 -2.7986234344947642e-02 -1.6245894244919755e-02 -5.0935752695726484e-03 -7.0407950122196392e-04 1.6661783015527636e-03 1.5647183159222963e-02 -4.8043740406950638e-03 1.6565407578922504e-02 7.4511727318228383e-03 -2.3827642308483461e-02 -1.1694575681456480e-03 -1.5769208601832434e-02 -1.0368032353604964e-02 -9.5496409435920065e-03 -9.4034355747198862e-03 1.0967500016433956e-03 2.1017050230456066e-02 8.8208187165999380e-04 9.6178784635715282e-03 4.2836903035129653e-03 8.2634663592706190e-03 5.9033769070096346e-05 -7.3512933183957170e-03 -1.0287227541700993e-03 -6.4295678327121100e-03 -8.6794386349357371e-03 -4.0814474071919262e-03 1.0931216567455384e-03 4.1708875355357215e-03 1.3746153791328315e-03 5.5492740135655730e-03 7.3842932890638474e-04 4.4767810082448102e-03 -6.1845771827905569e-04 -4.6296845014876763e-03 -4.8333888222634356e-04 -4.7830909386857605e-03 -1.0141235006296928e-02 -1.8864744725245016e-02 1.7028189535738716e-02 8.8208187165999380e-04 3.4488952653838806e-02 7.9539765370941033e-03 8.8844603957827784e-03 3.4096992276661945e-03 -4.9913171322800284e-03 -1.2771469729433791e-03 -3.0705235877173363e-02 -1.1739245771176176e-02 -1.1668119997048910e-02 -7.6554482897093958e-03 1.1064883177405414e-02 1.9243287991391460e-03 2.6194959972989578e-02 1.0325126497645609e-04 1.2257959679578040e-02 9.6961672834290358e-03 -1.4636646673072714e-02 -8.6232876987074787e-04 -1.6564350245795830e-02 -3.7358611349196350e-03 -1.4085715894564017e-02 -8.4999277202671801e-03 2.3057826563182615e-02 9.6178784635715282e-03 7.9539765370941033e-03 4.4984120741553613e-02 2.0621329498179852e-02 -4.6250316624869261e-04 -2.0109230164147779e-03 7.0781329697916094e-04 -1.3254946589813556e-02 -2.4755752605889421e-02 -1.9344385013936233e-02 -8.4150603649671993e-04 -7.4025939662019638e-03 2.6294295803210884e-04 2.0113527599592129e-02 -2.7369912466536192e-03 8.8705281474444047e-03 6.4533356502038076e-03 -2.7399825334656795e-02 -6.6503914557068076e-03 -1.1461956274063880e-02 -2.7077549802014631e-03 -2.9610460309660212e-02 -9.4903439966287344e-03 1.1271331540888822e-02 4.2836903035129662e-03 8.8844603957827801e-03 2.0621329498179849e-02 4.7000586333372014e-02 -3.7529099379829205e-04 3.8706283595951692e-04 -8.3005262377346678e-03 -1.4231617280499161e-02 -1.9078301559424006e-02 -2.6803776407992159e-02 -8.1438091884433999e-04 -2.7045364351044594e-03 -1.3468337734846539e-03 2.0905783172102000e-02 7.1983307748917265e-03 2.4337724207812876e-02 6.3345326418902687e-03 -1.4987461675189976e-02 -9.5604041158261644e-03 -1.1213143020004509e-02 -2.7303619292964832e-03 -2.8615437736492400e-03 -6.4547442986536505e-03 6.4780563708355396e-03 8.2634663592706190e-03 3.4096992276661945e-03 -4.6250316624869364e-04 -3.7529099379829276e-04 2.5705097314785021e-02 -1.4377021707768018e-02 -1.5298913614595960e-02 -6.3663802432474461e-03 9.3973952020649895e-04 1.0646644289721880e-03 -6.2799514800275479e-03 7.4308312207788099e-03 7.4044835404523486e-03 -5.0921487041262394e-03 6.5585852975765819e-03 5.3884927051937766e-03 2.4455775411898924e-03 -3.8373256060842366e-03 -3.5853586518454377e-03 -7.3671493575862253e-03 4.5233984097401599e-03 -2.2760979259475803e-03 -4.3634525153902820e-03 -4.1506077288419076e-03 5.9033769070095607e-05 -4.9913171322800275e-03 -2.0109230164147775e-03 3.8706283595951768e-04 -1.4377021707768018e-02 3.0785392423419235e-02 -2.1850270998907028e-04 -6.1396416851260890e-03 -9.4413161651570078e-03 -3.3046306982714379e-03 7.0489983402960629e-03 -7.5063531662625587e-03 6.1388036331411124e-04 5.7250451713385803e-03 -9.1155237714508428e-03 3.6641433336771678e-03 4.0017891404696710e-03 -3.0840669850323086e-03 1.0751110321871938e-03 1.3095600388460107e-02 -2.1772731795948316e-03 4.6359873189398063e-03 1.6275180020801840e-02 -1.2712010735155535e-03 -7.3512933183957170e-03 -1.2771469729433791e-03 7.0781329697916138e-04 -8.3005262377346678e-03 -1.5298913614595960e-02 -2.1850270998906965e-04 3.0065779368421044e-02 2.9824688424082524e-03 -4.6884260947972875e-04 -3.5954059420934764e-03 7.3484800033008814e-03 4.7937983436716113e-04 -6.9406139968938938e-03 -2.5439487419902321e-03 2.1952300551858505e-03 -1.1018464176140672e-02 -8.8588032242520737e-03 7.5339638604700874e-04 2.5045369838975818e-03 1.3726836872706720e-03 -3.5235547856092247e-03 1.5246053808498493e-02 1.9844929482761904e-02 -1.9588669017820810e-02 -1.0287227541701006e-03 -3.0705235877173363e-02 -1.3254946589813552e-02 -1.4231617280499159e-02 -6.3663802432474461e-03 -6.1396416851260899e-03 2.9824688424082537e-03 7.1193387016415630e-02 1.9913129988953317e-02 2.0823407192462645e-02 -5.4542506803820431e-03 5.2740765242892639e-03 -3.2464219503987209e-03 -4.5087584204433033e-02 5.9617630359811852e-03 -2.2482737680195587e-02 -2.6374493100792203e-02 1.1357842529145904e-02 1.9375698218941960e-03 2.2949627606850521e-02 -1.8884582068078369e-03 8.7794810964045410e-03 7.2521051681843354e-03 -2.7986234344947639e-02 -6.4295678327121100e-03 -1.1739245771176179e-02 -2.4755752605889421e-02 -1.9078301559424006e-02 9.3973952020649917e-04 -9.4413161651570078e-03 -4.6884260947972875e-04 1.9913129988953313e-02 4.6600690062073562e-02 2.1956197043358942e-02 7.0378585778102390e-04 -2.9381388909200468e-03 -4.3295791679048975e-04 -1.6399829229124679e-02 -2.7557866077050617e-03 -1.4757344185571732e-02 -8.3729536115829881e-03 2.3164996759353448e-02 1.0431335964214600e-02 7.7032680767586646e-03 7.8701964710515167e-03 2.5116508039243906e-02 6.7786515424458028e-03 -1.6245894244919755e-02 -8.6794386349357371e-03 -1.1668119997048910e-02 -1.9344385013936233e-02 -2.6803776407992159e-02 1.0646644289721875e-03 -3.3046306982714374e-03 -3.5954059420934751e-03 2.0823407192462652e-02 2.1956197043358942e-02 4.9244807748180873e-02 9.1797296245410749e-04 4.7560845051358301e-04 -9.7200550208346136e-03 -1.7736632951279495e-02 -2.1733857155414142e-03 -3.0462766316720187e-02 -9.4229257806514085e-03 1.0766293707744796e-02 4.9001265351514244e-03 9.2429826026450574e-03 5.9002593794161397e-03 6.5453170279541487e-03 3.4432707724700736e-03 -5.0935752695726484e-03 -4.0814474071919262e-03 -7.6554482897093958e-03 -8.4150603649671982e-04 -8.1438091884433999e-04 -6.2799514800275479e-03 7.0489983402960612e-03 7.3484800033008814e-03 -5.4542506803820449e-03 7.0378585778102466e-04 9.1797296245410868e-04 2.6579773091860617e-02 -1.2682288935022700e-02 -1.3901038023843406e-02 -8.2963795761305803e-03 -2.8183386130728894e-03 -4.2293815436297375e-03 -6.8284180169871263e-03 7.7826652766717318e-03 8.2144778998002720e-03 4.4914041789059986e-03 -7.7508079458282562e-03 3.6830571554631810e-03 3.6905634404966305e-03 -7.0407950122196761e-04 1.0931216567455384e-03 1.1064883177405416e-02 -7.4025939662019620e-03 -2.7045364351044585e-03 7.4308312207788099e-03 -7.5063531662625579e-03 4.7937983436716124e-04 5.2740765242892639e-03 -2.9381388909200503e-03 4.7560845051358204e-04 -1.2682288935022700e-02 2.4127709632151155e-02 -2.6401345445254798e-04 -5.5365124304832961e-03 5.9817489729471840e-03 -2.2955986916584617e-03 -3.9188132770148158e-03 -3.8074851346635496e-03 -4.6701851587399275e-04 -5.3227397204493078e-03 1.6101318404373938e-03 -1.0553301766231229e-02 -9.4513684714390752e-03 1.6661783015527638e-03 4.1708875355357207e-03 1.9243287991391465e-03 2.6294295803210878e-04 -1.3468337734846535e-03 7.4044835404523494e-03 6.1388036331411135e-04 -6.9406139968938938e-03 -3.2464219503987217e-03 -4.3295791679048943e-04 -9.7200550208346153e-03 -1.3901038023843406e-02 -2.6401345445254754e-04 2.3811551552061293e-02 4.1426928915608337e-03 -2.0671498587588742e-03 7.2313935228874443e-03 1.4916117442833873e-02 -1.3890122333344659e-03 -6.6530280530400629e-03 -1.7887942283049930e-03 5.1866946580197120e-03 -2.3014617247429866e-02 -2.6066740690079804e-02 1.5647183159222963e-02 1.3746153791328319e-03 2.6194959972989578e-02 2.0113527599592129e-02 2.0905783172102000e-02 -5.0921487041262403e-03 5.7250451713385811e-03 -2.5439487419902321e-03 -4.5087584204433040e-02 -1.6399829229124679e-02 -1.7736632951279498e-02 -8.2963795761305786e-03 -5.5365124304832970e-03 4.1426928915608337e-03 6.6720846929783584e-02 -5.0266962087952395e-03 1.8707818439616615e-02 2.1954069327142740e-02 -1.9709412719770156e-02 -1.8357109417126963e-03 -3.0327023055146243e-02 -5.5209656962594417e-03 5.1282867047885575e-03 3.0520501380662912e-03 -4.8043740406950638e-03 5.5492740135655722e-03 1.0325126497645623e-04 -2.7369912466536205e-03 7.1983307748917265e-03 6.5585852975765836e-03 -9.1155237714508428e-03 2.1952300551858501e-03 5.9617630359811852e-03 -2.7557866077050634e-03 -2.1733857155414138e-03 -2.8183386130728886e-03 5.9817489729471849e-03 -2.0671498587588738e-03 -5.0266962087952395e-03 2.2641193048119377e-02 -5.3068709289845533e-03 -3.0555451731538834e-03 -3.6893006583025318e-03 -1.0523715045146861e-02 -4.7750697415785068e-03 4.4701376444692244e-03 -2.7344741919048284e-02 -1.3550859326928068e-02 1.6565407578922504e-02 7.3842932890638507e-04 1.2257959679578042e-02 8.8705281474444064e-03 2.4337724207812873e-02 5.3884927051937766e-03 3.6641433336771657e-03 -1.1018464176140672e-02 -2.2482737680195587e-02 -1.4757344185571732e-02 -3.0462766316720187e-02 -4.2293815436297367e-03 -2.2955986916584617e-03 7.2313935228874452e-03 1.8707818439616615e-02 -5.3068709289845542e-03 4.6716875954235716e-02 1.4364086644909036e-02 -1.1210402898298539e-02 -1.0198450601933286e-02 -1.0455378918544060e-02 2.4128423951929124e-03 -1.2276478571746059e-02 -1.1861848148550779e-02 7.4511727318228374e-03 4.4767810082448102e-03 9.6961672834290375e-03 6.4533356502038067e-03 6.3345326418902696e-03 2.4455775411898924e-03 4.0017891404696701e-03 -8.8588032242520737e-03 -2.6374493100792207e-02 -8.3729536115829881e-03 -9.4229257806514068e-03 -6.8284180169871263e-03 -3.9188132770148158e-03 1.4916117442833873e-02 2.1954069327142740e-02 -3.0555451731538834e-03 1.4364086644909036e-02 2.9630698909635315e-02 -4.9718278559375325e-03 -9.5333101612284504e-03 -1.8661753795066866e-02 -5.2326465947522228e-03 1.5149301642271249e-02 7.5876574777698812e-03 -2.3827642308483461e-02 -6.1845771827905591e-04 -1.4636646673072714e-02 -2.7399825334656791e-02 -1.4987461675189977e-02 -3.8373256060842361e-03 -3.0840669850323065e-03 7.5339638604700917e-04 1.1357842529145901e-02 2.3164996759353448e-02 1.0766293707744796e-02 7.7826652766717283e-03 -3.8074851346635492e-03 -1.3890122333344659e-03 -1.9709412719770156e-02 -3.6893006583025283e-03 -1.1210402898298539e-02 -4.9718278559375325e-03 4.3875970256537410e-02 1.5363427890390010e-03 1.6427047571277113e-02 5.7677927994325157e-03 -8.3272657889196203e-05 4.3053294723509718e-03 -1.1694575681456475e-03 -4.6296845014876763e-03 -8.6232876987074754e-04 -6.6503914557068076e-03 -9.5604041158261661e-03 -3.5853586518454382e-03 1.0751110321871940e-03 2.5045369838975818e-03 1.9375698218941952e-03 1.0431335964214604e-02 4.9001265351514252e-03 8.2144778998002703e-03 -4.6701851587399319e-04 -6.6530280530400629e-03 -1.8357109417126969e-03 -1.0523715045146861e-02 -1.0198450601933286e-02 -9.5333101612284522e-03 1.5363427890390008e-03 2.3720176411127378e-02 1.3593313306118951e-03 1.0305830142823173e-04 1.1965657428552290e-02 8.5133984218324354e-03 -1.5769208601832434e-02 -4.8333888222634345e-04 -1.6564350245795830e-02 -1.1461956274063880e-02 -1.1213143020004509e-02 -7.3671493575862262e-03 1.3095600388460107e-02 1.3726836872706726e-03 2.2949627606850525e-02 7.7032680767586646e-03 9.2429826026450591e-03 4.4914041789059968e-03 -5.3227397204493078e-03 -1.7887942283049928e-03 -3.0327023055146243e-02 -4.7750697415785059e-03 -1.0455378918544062e-02 -1.8661753795066866e-02 1.6427047571277116e-02 1.3593313306118960e-03 3.6965846246006205e-02 939 940 941 987 988 989 1098 1099 1100 669 670 671 942 943 944 990 991 992 1101 1102 1103 672 673 674 2.8025568563593468e-02 -9.4337434899076974e-03 -4.9863673674430415e-03 -1.1470424887664009e-03 -9.1958937411283481e-03 -1.3446239630614213e-03 -7.6533103444031481e-04 7.8215077071053761e-04 -1.3842487630089813e-03 8.0270165639618560e-03 -4.9301370718943596e-03 -7.0348511329287903e-03 -5.3037347764680635e-03 5.1635889247648318e-03 4.0813138426628514e-03 -1.1144916811628540e-02 3.7936972421201824e-03 9.7694271217998591e-03 -8.6696452450269485e-03 8.8665838644770151e-03 4.4075844928283406e-03 -9.0219147712250602e-03 4.9537535008578309e-03 -3.5082342308488147e-03 -9.4337434899076957e-03 5.1101675818993740e-02 1.4501807632937434e-02 -1.1010074133377210e-02 -1.2147927251985394e-02 -1.3402267970886889e-02 -1.2410776647000065e-02 -3.1653004714624136e-02 -6.1675192107471981e-03 -4.8891076778806927e-03 7.7238859803567279e-03 1.5816566893271926e-02 6.1438890516932560e-03 2.6673820105789135e-02 8.8065347539063154e-03 7.6652771330262557e-03 -1.2992115385770279e-02 -2.2987032633535662e-02 9.5361178796242556e-03 -2.9542000174475162e-02 -1.1937647118117477e-02 1.4398417883821908e-02 8.3566562171535430e-04 1.5369557653171537e-02 -4.9863673674430432e-03 1.4501807632937432e-02 3.2472803074744989e-02 -3.0437452439750620e-03 -1.2074695462879986e-02 -2.1457756719894819e-02 -7.2291781986172140e-03 -1.0671465470786288e-02 -9.0392457977361649e-03 -7.8201689552354348e-03 1.6326324434752543e-02 1.9658153024363918e-02 5.4133150382148975e-03 8.8839504723569936e-03 6.0120243916164696e-03 7.1049937276548266e-03 -9.8872330306235528e-03 -2.5064118095022295e-02 5.2284041542572613e-03 -1.3190452723892201e-02 -1.1748671745985121e-02 5.3327468451437755e-03 6.1117641481350541e-03 9.1668118679130040e-03 -1.1470424887664011e-03 -1.1010074133377210e-02 -3.0437452439750620e-03 4.0677851521859029e-02 2.5378852953744533e-03 1.9199626589540494e-02 2.1605602643076274e-02 1.1549061902405561e-02 9.3710731242751619e-03 -1.0011712218287588e-03 -2.0544668677283779e-03 -1.5931428010533086e-02 -2.5503064025540836e-02 -1.5916222934986436e-02 -8.5417499961133250e-03 -4.5132593678211758e-03 1.8390377599278606e-03 1.1462952525850001e-02 -8.5031983941726320e-03 1.5489289901533847e-02 5.0746187476483394e-03 -2.1615718666805516e-02 -2.4345109231496990e-03 -1.7591347736692520e-02 -9.1958937411283481e-03 -1.2147927251985392e-02 -1.2074695462879984e-02 2.5378852953744533e-03 2.2801348346444344e-02 2.7981825220220347e-03 9.8242099976489222e-03 7.2649550148327991e-03 1.0278749904371142e-02 1.5723245226622657e-04 -7.6952951859252426e-03 -2.9957684625986588e-03 -7.2311842008803895e-03 -1.1199763908364985e-02 -5.7123462996601180e-03 1.1270411618337919e-03 4.6094739317194267e-03 3.4747115138189237e-03 4.7490728958485438e-03 1.9610524879911211e-03 6.2711839222302519e-03 -1.9683638609632030e-03 -5.5938434347120721e-03 -2.0400176373035917e-03 -1.3446239630614208e-03 -1.3402267970886887e-02 -2.1457756719894815e-02 1.9199626589540494e-02 2.7981825220220347e-03 4.2684630769330448e-02 1.0979063617929391e-02 1.1658580032467676e-02 8.4952043347872406e-03 -7.9047971566889347e-04 -3.2487155752814268e-03 -3.4473031458915011e-02 -1.4376416971324807e-02 -1.5142015527519065e-02 -1.2684689750677471e-02 6.7030451136532374e-03 3.8657638334869751e-03 3.0267509924535259e-02 -3.7197015010685449e-03 1.5870942982060019e-02 1.0426227446347844e-02 -1.6650513169999465e-02 -2.4004702963493214e-03 -2.3258094545513502e-02 -7.6533103444031470e-04 -1.2410776647000066e-02 -7.2291781986172140e-03 2.1605602643076274e-02 9.8242099976489240e-03 1.0979063617929391e-02 4.2305034181871530e-02 1.9986610654312134e-02 3.4809161217515521e-03 -3.4107491727342803e-04 2.3197339559587406e-03 -1.1110350658740036e-02 -2.1906597089003464e-02 -1.8671109007312319e-02 -4.3216024114288700e-03 -9.6054914162936461e-03 -8.7474337857886290e-05 1.7600553172733419e-02 -5.8466019094303165e-03 6.4705369033042559e-03 4.7286600302596420e-03 -2.5445540458506642e-02 -7.4317315190537839e-03 -1.4128061673887877e-02 7.8215077071053728e-04 -3.1653004714624143e-02 -1.0671465470786288e-02 1.1549061902405561e-02 7.2649550148327991e-03 1.1658580032467676e-02 1.9986610654312134e-02 4.8738523334539416e-02 4.2783801270334029e-03 1.9784776539791345e-03 -1.1900134362439686e-02 -1.5086147019897035e-02 -1.8227181938389809e-02 -2.8110445929824427e-02 -4.9254013303194049e-03 -5.7932272569729444e-03 1.4415730206320211e-03 2.0898208332280413e-02 4.5238777166490274e-03 2.6172263468452181e-02 8.3833619986787150e-03 -1.4799769502693651e-02 -1.1953729831568156e-02 -1.4535516669457472e-02 -1.3842487630089813e-03 -6.1675192107471981e-03 -9.0392457977361632e-03 9.3710731242751637e-03 1.0278749904371142e-02 8.4952043347872423e-03 3.4809161217515521e-03 4.2783801270334029e-03 2.6254214378330178e-02 -1.1682465755741054e-02 -1.5444189450388699e-02 -1.3706115591923600e-02 -2.7795510854111316e-03 -3.2033680012620159e-03 -6.8926805074567363e-03 5.5749024409158842e-03 7.7468490414867352e-03 1.8476209257085501e-03 4.7729889130565979e-03 7.7164095821067964e-03 5.2754674622720477e-03 -7.3536149958380341e-03 -5.2053119926001642e-03 -1.2234465203981519e-02 8.0270165639618560e-03 -4.8891076778806927e-03 -7.8201689552354365e-03 -1.0011712218287597e-03 1.5723245226622674e-04 -7.9047971566889325e-04 -3.4107491727342737e-04 1.9784776539791345e-03 -1.1682465755741054e-02 3.2587601240708794e-02 -1.3370175635234935e-03 -1.1302717754835791e-02 -1.1122309996712394e-02 -6.0244829873313385e-03 4.9992257760917954e-03 -9.5810741965589551e-03 1.5748684847114822e-03 1.0511012052115335e-02 -1.2360579943153874e-02 7.2968163693249806e-03 6.9262317896360203e-03 -6.2084075291432457e-03 1.2432132684537058e-03 9.1593625636380259e-03 -4.9301370718943588e-03 7.7238859803567261e-03 1.6326324434752543e-02 -2.0544668677283779e-03 -7.6952951859252444e-03 -3.2487155752814263e-03 2.3197339559587415e-03 -1.1900134362439682e-02 -1.5444189450388699e-02 -1.3370175635234933e-03 2.9859033505033411e-02 5.2033566162967828e-03 -6.5749837579092861e-04 -5.9506496450449425e-04 7.6221481330615969e-03 1.4687230691170635e-03 -7.0449613031213368e-03 -4.4600203096740940e-03 4.2340746265513134e-03 -1.3400858039217577e-02 -9.2607375679278729e-03 9.5658822731004478e-04 3.0533943698181931e-03 3.2618337191611651e-03 -7.0348511329287903e-03 1.5816566893271926e-02 1.9658153024363918e-02 -1.5931428010533082e-02 -2.9957684625986588e-03 -3.4473031458915011e-02 -1.1110350658740036e-02 -1.5086147019897037e-02 -1.3706115591923600e-02 -1.1302717754835790e-02 5.2033566162967828e-03 6.6833862278398729e-02 1.7097211266632960e-02 2.0514002758099503e-02 1.2798195537998336e-03 1.0558231260718341e-02 -4.8381854574065042e-03 -4.1397662991264558e-02 1.0325339022579370e-02 -2.2281385111395463e-02 -2.5021010997936938e-02 7.3985660071070446e-03 3.6675597836294520e-03 2.6825986183477625e-02 -5.3037347764680600e-03 6.1438890516932534e-03 5.4133150382148958e-03 -2.5503064025540836e-02 -7.2311842008803895e-03 -1.4376416971324807e-02 -2.1906597089003464e-02 -1.8227181938389809e-02 -2.7795510854111316e-03 -1.1122309996712394e-02 -6.5749837579092839e-04 1.7097211266632960e-02 4.3604750736788253e-02 2.0686858630701993e-02 4.5080685389523719e-03 -8.0515492034130120e-04 1.2403968267300368e-03 -1.3243780444396305e-02 -1.3934499803347565e-04 -1.2552997680653613e-02 -6.7895836297672957e-03 2.1175455069311292e-02 1.0597717686589455e-02 1.0170737287099305e-02 5.1635889247648309e-03 2.6673820105789139e-02 8.8839504723569936e-03 -1.5916222934986436e-02 -1.1199763908364984e-02 -1.5142015527519067e-02 -1.8671109007312316e-02 -2.8110445929824424e-02 -3.2033680012620164e-03 -6.0244829873313402e-03 -5.9506496450449555e-04 2.0514002758099503e-02 2.0686858630701993e-02 5.1087628548541208e-02 5.7203125585014768e-03 2.7432297686983847e-03 -1.3054993868336532e-02 -1.7803946078283679e-02 1.3859860753887331e-03 -3.2273298502810133e-02 -1.0348870391678975e-02 1.0632151530076161e-02 7.4721185195102367e-03 1.1379934209785758e-02 4.0813138426628532e-03 8.8065347539063154e-03 6.0120243916164714e-03 -8.5417499961133250e-03 -5.7123462996601180e-03 -1.2684689750677469e-02 -4.3216024114288692e-03 -4.9254013303194049e-03 -6.8926805074567355e-03 4.9992257760917954e-03 7.6221481330615969e-03 1.2798195537998345e-03 4.5080685389523719e-03 5.7203125585014777e-03 2.8049685714814122e-02 -1.0165877469027043e-02 -1.4691051849295523e-02 -1.5675099079176760e-02 -1.1100648132603801e-03 -7.5417424974965697e-03 -9.4721844465823317e-03 1.0550686532122600e-02 1.0721546531302226e-02 9.3831241236628626e-03 -1.1144916811628540e-02 7.6652771330262565e-03 7.1049937276548283e-03 -4.5132593678211775e-03 1.1270411618337919e-03 6.7030451136532382e-03 -9.6054914162936478e-03 -5.7932272569729444e-03 5.5749024409158842e-03 -9.5810741965589551e-03 1.4687230691170638e-03 1.0558231260718341e-02 -8.0515492034130337e-04 2.7432297686983843e-03 -1.0165877469027043e-02 2.7102552858308735e-02 -1.5152558078424347e-03 -1.1442355066276191e-02 9.3903917364692516e-03 -5.5402884476475006e-03 -7.3843552222680560e-03 -8.4304788213436185e-04 -1.5549962021261829e-04 -9.4858478537100037e-04 3.7936972421201845e-03 -1.2992115385770279e-02 -9.8872330306235528e-03 1.8390377599278602e-03 4.6094739317194275e-03 3.8657638334869751e-03 -8.7474337857886128e-05 1.4415730206320209e-03 7.7468490414867343e-03 1.5748684847114822e-03 -7.0449613031213368e-03 -4.8381854574065051e-03 1.2403968267300372e-03 -1.3054993868336535e-02 -1.4691051849295523e-02 -1.5152558078424352e-03 2.4697266826210196e-02 6.0803050258297856e-03 -4.7822989287086975e-03 9.8012032287334641e-03 1.5255951946525339e-02 -2.0629712390805473e-03 -7.4574464500669520e-03 -3.5323995100032474e-03 9.7694271217998591e-03 -2.2987032633535662e-02 -2.5064118095022295e-02 1.1462952525850004e-02 3.4747115138189237e-03 3.0267509924535266e-02 1.7600553172733416e-02 2.0898208332280413e-02 1.8476209257085514e-03 1.0511012052115333e-02 -4.4600203096740922e-03 -4.1397662991264558e-02 -1.3243780444396305e-02 -1.7803946078283679e-02 -1.5675099079176760e-02 -1.1442355066276191e-02 6.0803050258297847e-03 6.3365951260366662e-02 -8.7138599534142373e-03 1.8506035093971737e-02 2.1099671256119761e-02 -1.5943949408411887e-02 -3.7082609444074265e-03 -3.4443873201266607e-02 -8.6696452450269485e-03 9.5361178796242556e-03 5.2284041542572605e-03 -8.5031983941726320e-03 4.7490728958485438e-03 -3.7197015010685445e-03 -5.8466019094303139e-03 4.5238777166490309e-03 4.7729889130565988e-03 -1.2360579943153874e-02 4.2340746265513126e-03 1.0325339022579368e-02 -1.3934499803347500e-04 1.3859860753887331e-03 -1.1100648132603801e-03 9.3903917364692516e-03 -4.7822989287086975e-03 -8.7138599534142373e-03 2.7298730822516062e-02 -1.0151149657227210e-02 -5.2485387825809988e-03 -1.1697520691680680e-03 -9.4956806081259656e-03 -1.5345670395690704e-03 8.8665838644770151e-03 -2.9542000174475159e-02 -1.3190452723892201e-02 1.5489289901533847e-02 1.9610524879911202e-03 1.5870942982060019e-02 6.4705369033042567e-03 2.6172263468452178e-02 7.7164095821067964e-03 7.2968163693249788e-03 -1.3400858039217579e-02 -2.2281385111395463e-02 -1.2552997680653613e-02 -3.2273298502810133e-02 -7.5417424974965688e-03 -5.5402884476475006e-03 9.8012032287334606e-03 1.8506035093971744e-02 -1.0151149657227212e-02 5.0077284522674841e-02 1.3980084442239861e-02 -9.8787912531117864e-03 -1.2795646991348730e-02 -1.3059891767594178e-02 4.4075844928283406e-03 -1.1937647118117475e-02 -1.1748671745985121e-02 5.0746187476483403e-03 6.2711839222302519e-03 1.0426227446347844e-02 4.7286600302596411e-03 8.3833619986787150e-03 5.2754674622720486e-03 6.9262317896360195e-03 -9.2607375679278729e-03 -2.5021010997936938e-02 -6.7895836297672957e-03 -1.0348870391678975e-02 -9.4721844465823317e-03 -7.3843552222680568e-03 1.5255951946525336e-02 2.1099671256119761e-02 -5.2485387825809988e-03 1.3980084442239861e-02 3.0598075300595239e-02 -1.7146174257559978e-03 -1.2343327231949842e-02 -2.1157574274830497e-02 -9.0219147712250602e-03 1.4398417883821906e-02 5.3327468451437755e-03 -2.1615718666805513e-02 -1.9683638609632030e-03 -1.6650513169999465e-02 -2.5445540458506642e-02 -1.4799769502693651e-02 -7.3536149958380358e-03 -6.2084075291432431e-03 9.5658822731004424e-04 7.3985660071070420e-03 2.1175455069311292e-02 1.0632151530076159e-02 1.0550686532122600e-02 -8.4304788213436098e-04 -2.0629712390805468e-03 -1.5943949408411887e-02 -1.1697520691680680e-03 -9.8787912531117864e-03 -1.7146174257559987e-03 4.3128926307671608e-02 2.7227382146410750e-03 1.8380695615631961e-02 4.9537535008578309e-03 8.3566562171535300e-04 6.1117641481350541e-03 -2.4345109231496990e-03 -5.5938434347120704e-03 -2.4004702963493210e-03 -7.4317315190537839e-03 -1.1953729831568156e-02 -5.2053119926001642e-03 1.2432132684537054e-03 3.0533943698181935e-03 3.6675597836294520e-03 1.0597717686589457e-02 7.4721185195102350e-03 1.0721546531302226e-02 -1.5549962021261837e-04 -7.4574464500669502e-03 -3.7082609444074265e-03 -9.4956806081259656e-03 -1.2795646991348730e-02 -1.2343327231949842e-02 2.7227382146410755e-03 2.6439488196652122e-02 3.1565000022400263e-03 -3.5082342308488147e-03 1.5369557653171537e-02 9.1668118679130040e-03 -1.7591347736692520e-02 -2.0400176373035921e-03 -2.3258094545513502e-02 -1.4128061673887877e-02 -1.4535516669457474e-02 -1.2234465203981519e-02 9.1593625636380224e-03 3.2618337191611642e-03 2.6825986183477622e-02 1.0170737287099305e-02 1.1379934209785758e-02 9.3831241236628643e-03 -9.4858478537100037e-04 -3.5323995100032474e-03 -3.4443873201266607e-02 -1.5345670395690699e-03 -1.3059891767594180e-02 -2.1157574274830501e-02 1.8380695615631965e-02 3.1565000022400250e-03 4.5718085050538634e-02 942 943 944 990 991 992 1101 1102 1103 672 673 674 945 946 947 993 994 995 1104 1105 1106 675 676 677 3.3289914739135021e-02 -1.4139239078107445e-02 -6.5825898464428913e-03 6.4011496582228782e-04 -6.9150502290714465e-03 3.2515717480408966e-03 1.1094577070366247e-03 4.8488499147286424e-03 1.1871002117112854e-03 1.2457198890149892e-02 -7.5746082850661114e-03 -9.7397939331100199e-03 -7.3345468033992603e-03 1.6147232390658480e-03 1.1038603784152402e-03 -1.5822734914991657e-02 5.8576246713982014e-03 1.3215411801457350e-02 -1.2895408262982517e-02 1.2915622377200979e-02 5.6006048618500275e-03 -1.1443996320770400e-02 3.3920773898513420e-03 -8.0361652219218902e-03 -1.4139239078107449e-02 5.2705005588162275e-02 1.3011535848147508e-02 -8.7588427586891733e-03 -1.4131053871067188e-02 -1.5916141002229600e-02 -9.4019136635685729e-03 -3.2858075041300651e-02 -8.9219517001720219e-03 -7.4814784936381648e-03 9.4691555315152710e-03 1.5240770990830906e-02 2.5289955212743917e-03 2.7413628186163760e-02 1.0297518827343363e-02 1.1378092343077654e-02 -1.4107847014700055e-02 -2.1405316781205906e-02 1.3574888545538951e-02 -3.0121762014637916e-02 -1.0387702426792090e-02 1.2299497584112369e-02 1.6309486358644957e-03 1.8081286244077847e-02 -6.5825898464428930e-03 1.3011535848147510e-02 3.2098002243370741e-02 1.2253142626084579e-03 -1.4037290692187133e-02 -2.2335217982913831e-02 -4.8246601316413937e-03 -1.1026886111212110e-02 -1.0787302465792466e-02 -1.0352473370986798e-02 1.5259937260787095e-02 1.7865564797124887e-02 2.3627265084830724e-03 1.0219135269409129e-02 7.5944080015232281e-03 9.5016610242818905e-03 -9.2529943512369602e-03 -2.2419873306877346e-02 6.5557838000215793e-03 -1.1594727386031446e-02 -1.0696420377750560e-02 2.1142377536760878e-03 7.4212901623239074e-03 8.6808390913153434e-03 6.4011496582228804e-04 -8.7588427586891716e-03 1.2253142626084579e-03 3.6919702769039602e-02 3.2629172382713954e-03 1.9162547101578355e-02 1.8397884204596673e-02 1.0812745352165309e-02 1.0708668766436814e-02 9.1151573047581233e-04 -1.8701396556673935e-03 -1.0896073894712133e-02 -2.1423073852017433e-02 -1.4422077707696912e-02 -1.0244067570943906e-02 -6.7794356749557496e-03 1.0890635018247713e-03 5.7782489127730149e-03 -1.0705620161877408e-02 1.2986876463073388e-02 1.7655620112016466e-03 -1.7961087981083791e-02 -3.1005424332813821e-03 -1.7500199588942254e-02 -6.9150502290714465e-03 -1.4131053871067185e-02 -1.4037290692187133e-02 3.2629172382713954e-03 2.4340299179269369e-02 4.9069285528000293e-03 9.1986336411557824e-03 9.7357380553708354e-03 1.2457869668664467e-02 8.7576295815385875e-04 -8.0310136851172581e-03 -4.4088143078326852e-03 -7.2020216596136166e-03 -1.3366187709078775e-02 -7.6255886427372714e-03 3.3305377240827757e-04 5.0098245274789325e-03 4.9496637684412551e-03 3.1821729866675576e-03 2.9932749822082173e-03 7.5664584464344171e-03 -2.7354687079718097e-03 -6.5508814790641301e-03 -3.8092267935830831e-03 3.2515717480408974e-03 -1.5916141002229600e-02 -2.2335217982913838e-02 1.9162547101578355e-02 4.9069285528000311e-03 5.0877231156407417e-02 1.2296389491272600e-02 1.4581813703506096e-02 1.4021613642325466e-02 4.5276792349263680e-03 -4.6942595093661171e-03 -3.6587115485095599e-02 -1.5065846556214560e-02 -1.8541081243185105e-02 -1.8237074917714504e-02 1.0339012985410407e-03 5.1725849462731163e-03 3.2478558076897361e-02 -8.4203144528838328e-03 1.8645173784134023e-02 9.9557160863804062e-03 -1.6785927865260876e-02 -4.1550192319324370e-03 -3.0173710576286716e-02 1.1094577070366238e-03 -9.4019136635685729e-03 -4.8246601316413928e-03 1.8397884204596676e-02 9.1986336411557824e-03 1.2296389491272600e-02 3.7949216087196931e-02 1.8047020698889724e-02 6.0590439268231764e-03 5.3919056963386107e-04 4.4969508074663260e-03 -7.4504425524762850e-03 -1.7779658285261402e-02 -1.6781862067634497e-02 -6.4490222345180443e-03 -1.0766119309587992e-02 -1.2390864475310983e-03 1.3522937357969588e-02 -7.5984305346208023e-03 3.1264072334119307e-03 1.8541745218110996e-03 -2.1851540438993892e-02 -7.4461502021895857e-03 -1.5008420379240743e-02 4.8488499147286424e-03 -3.2858075041300651e-02 -1.1026886111212110e-02 1.0812745352165308e-02 9.7357380553708354e-03 1.4581813703506096e-02 1.8047020698889724e-02 5.0327935818450242e-02 8.7285621094778058e-03 4.4046104737568920e-03 -1.4181681406169336e-02 -1.5571839535379535e-02 -1.6248922908140766e-02 -2.9388966660276020e-02 -8.7922323602931535e-03 -9.2124269451833770e-03 3.1330657245953160e-03 2.0281634042237068e-02 9.3275158159386562e-04 2.7278133077043850e-02 9.7140999105096524e-03 -1.3584628167810297e-02 -1.4046149567714241e-02 -1.7915151758845831e-02 1.1871002117112854e-03 -8.9219517001720219e-03 -1.0787302465792466e-02 1.0708668766436816e-02 1.2457869668664467e-02 1.4021613642325468e-02 6.0590439268231764e-03 8.7285621094778040e-03 2.8105951578525377e-02 -7.5462460001675512e-03 -1.5273712888761419e-02 -1.9178242935258036e-02 -5.1615652638079042e-03 -7.2382509075588006e-03 -8.7787470781423398e-03 2.2840400822566912e-03 8.0130171225349239e-03 7.1768754766795605e-03 1.7773106103995914e-03 9.3765774695094718e-03 7.1581774935001539e-03 -9.3083523336521031e-03 -7.1421108736944294e-03 -1.7718325711837721e-02 1.2457198890149890e-02 -7.4814784936381657e-03 -1.0352473370986796e-02 9.1151573047581211e-04 8.7576295815385886e-04 4.5276792349263689e-03 5.3919056963385999e-04 4.4046104737568929e-03 -7.5462460001675521e-03 3.5608152587585970e-02 -2.5632907937819249e-03 -1.5390435959367109e-02 -1.1821971335940111e-02 -9.0164721831028031e-03 1.7348747683764445e-03 -1.3019357637647652e-02 2.5104382210234554e-03 1.4222139914336067e-02 -1.6655850947710844e-02 1.0664052549167751e-02 8.8786251937546280e-03 -8.0188778565469312e-03 6.0637726842093843e-04 3.9258362191279504e-03 -7.5746082850661114e-03 9.4691555315152710e-03 1.5259937260787093e-02 -1.8701396556673933e-03 -8.0310136851172581e-03 -4.6942595093661171e-03 4.4969508074663260e-03 -1.4181681406169336e-02 -1.5273712888761419e-02 -2.5632907937819254e-03 2.9344095598733504e-02 5.9293390880244745e-03 -1.6286197954918928e-03 1.3101718654337205e-03 7.8346383211825819e-03 2.5600812177886726e-03 -6.9780090624548576e-03 -5.0177395564441696e-03 6.1802935561731560e-03 -1.4484420845054783e-02 -8.6890901864423928e-03 3.9933294857916689e-04 3.5517020031137305e-03 4.6508874710199412e-03 -9.7397939331100181e-03 1.5240770990830904e-02 1.7865564797124887e-02 -1.0896073894712133e-02 -4.4088143078326852e-03 -3.6587115485095599e-02 -7.4504425524762868e-03 -1.5571839535379531e-02 -1.9178242935258036e-02 -1.5390435959367106e-02 5.9293390880244745e-03 6.0980462170848945e-02 1.2942154347419384e-02 1.9709940544532470e-02 6.3328333051360037e-03 1.4691459502318668e-02 -5.0851218216770872e-03 -3.6298932203394876e-02 1.3558402521238289e-02 -2.0698078808362080e-02 -2.2207839602395290e-02 2.2847299686892097e-03 4.8838038498635284e-03 2.9093269953033948e-02 -7.3345468033992577e-03 2.5289955212743926e-03 2.3627265084830732e-03 -2.1423073852017433e-02 -7.2020216596136175e-03 -1.5065846556214560e-02 -1.7779658285261402e-02 -1.6248922908140766e-02 -5.1615652638079042e-03 -1.1821971335940113e-02 -1.6286197954918939e-03 1.2942154347419384e-02 3.9220332162652645e-02 1.8112684925723616e-02 6.6931956751973588e-03 1.8872582239278434e-04 3.7288921027267669e-03 -8.5850458871677311e-03 1.2062456489962833e-03 -9.1310619585179380e-03 -4.2306018973589489e-03 1.7743946642576489e-02 9.8400537720394355e-03 1.1044983073449328e-02 1.6147232390658498e-03 2.7413628186163760e-02 1.0219135269409129e-02 -1.4422077707696913e-02 -1.3366187709078776e-02 -1.8541081243185105e-02 -1.6781862067634497e-02 -2.9388966660276020e-02 -7.2382509075588006e-03 -9.0164721831028014e-03 1.3101718654337214e-03 1.9709940544532473e-02 1.8112684925723616e-02 5.2659781603691724e-02 1.0079138337732319e-02 5.4741813260311897e-03 -1.5049726506319496e-02 -1.7314994454900676e-02 5.3421403104521852e-03 -3.3183293948122264e-02 -1.0447500424477308e-02 9.6766821571613836e-03 9.6045931685073485e-03 1.3533612878447968e-02 1.1038603784152415e-03 1.0297518827343361e-02 7.5944080015232281e-03 -1.0244067570943906e-02 -7.6255886427372705e-03 -1.8237074917714504e-02 -6.4490222345180443e-03 -8.7922323602931535e-03 -8.7787470781423398e-03 1.7348747683764436e-03 7.8346383211825819e-03 6.3328333051360019e-03 6.6931956751973588e-03 1.0079138337732321e-02 3.0666457396886851e-02 -6.1221090026752365e-03 -1.5007728278488060e-02 -2.1022280428842563e-02 1.6645417623927371e-03 -1.0101103217184323e-02 -1.1157996035332298e-02 1.1618726223755406e-02 1.3315357012444542e-02 1.4602399756485630e-02 -1.5822734914991657e-02 1.1378092343077652e-02 9.5016610242818905e-03 -6.7794356749557496e-03 3.3305377240827768e-04 1.0339012985410428e-03 -1.0766119309587992e-02 -9.2124269451833770e-03 2.2840400822566908e-03 -1.3019357637647650e-02 2.5600812177886726e-03 1.4691459502318668e-02 1.8872582239278261e-04 5.4741813260311906e-03 -6.1221090026752373e-03 3.1524188830705693e-02 -2.7981061602586435e-03 -1.6038922420201066e-02 1.3824539471972978e-02 -8.5045174899496707e-03 -9.8805336272468208e-03 8.5019341211160023e-04 7.6964193608589191e-04 4.5305031427248336e-03 5.8576246713982006e-03 -1.4107847014700053e-02 -9.2529943512369619e-03 1.0890635018247720e-03 5.0098245274789316e-03 5.1725849462731146e-03 -1.2390864475310985e-03 3.1330657245953160e-03 8.0130171225349239e-03 2.5104382210234550e-03 -6.9780090624548576e-03 -5.0851218216770855e-03 3.7288921027267669e-03 -1.5049726506319493e-02 -1.5007728278488062e-02 -2.7981061602586439e-03 2.5132797450513972e-02 6.4323132209254900e-03 -7.3347770326814693e-03 1.0996734903922665e-02 1.4439547465931629e-02 -1.8140488565019850e-03 -8.1368400230364818e-03 -4.7116183042630513e-03 1.3215411801457350e-02 -2.1405316781205903e-02 -2.2419873306877346e-02 5.7782489127730149e-03 4.9496637684412551e-03 3.2478558076897361e-02 1.3522937357969590e-02 2.0281634042237068e-02 7.1768754766795614e-03 1.4222139914336065e-02 -5.0177395564441687e-03 -3.6298932203394876e-02 -8.5850458871677329e-03 -1.7314994454900680e-02 -2.1022280428842566e-02 -1.6038922420201066e-02 6.4323132209254900e-03 5.8107182410866924e-02 -1.1301997743358914e-02 1.7045485340725922e-02 1.8760197467362554e-02 -1.0812771935808315e-02 -4.9710455797789769e-03 -3.6781727492691610e-02 -1.2895408262982518e-02 1.3574888545538951e-02 6.5557838000215793e-03 -1.0705620161877408e-02 3.1821729866675576e-03 -8.4203144528838328e-03 -7.5984305346208023e-03 9.3275158159386367e-04 1.7773106103995918e-03 -1.6655850947710844e-02 6.1802935561731578e-03 1.3558402521238289e-02 1.2062456489962835e-03 5.3421403104521852e-03 1.6645417623927371e-03 1.3824539471972978e-02 -7.3347770326814684e-03 -1.1301997743358915e-02 3.2670977679068874e-02 -1.4546117886439246e-02 -6.5315997391825363e-03 1.5354710715344364e-04 -7.3313520613050055e-03 2.6978732413730847e-03 1.2915622377200977e-02 -3.0121762014637916e-02 -1.1594727386031446e-02 1.2986876463073388e-02 2.9932749822082164e-03 1.8645173784134023e-02 3.1264072334119294e-03 2.7278133077043857e-02 9.3765774695094718e-03 1.0664052549167748e-02 -1.4484420845054784e-02 -2.0698078808362080e-02 -9.1310619585179397e-03 -3.3183293948122264e-02 -1.0101103217184323e-02 -8.5045174899496707e-03 1.0996734903922667e-02 1.7045485340725922e-02 -1.4546117886439242e-02 5.1305824680812968e-02 1.2264960662339910e-02 -7.5112612879471991e-03 -1.4784490836172734e-02 -1.4938287845131475e-02 5.6006048618500275e-03 -1.0387702426792092e-02 -1.0696420377750558e-02 1.7655620112016464e-03 7.5664584464344171e-03 9.9557160863804062e-03 1.8541745218111003e-03 9.7140999105096524e-03 7.1581774935001556e-03 8.8786251937546263e-03 -8.6890901864423910e-03 -2.2207839602395286e-02 -4.2306018973589489e-03 -1.0447500424477309e-02 -1.1157996035332298e-02 -9.8805336272468174e-03 1.4439547465931627e-02 1.8760197467362551e-02 -6.5315997391825354e-03 1.2264960662339910e-02 3.0246346898606821e-02 2.5437686751708958e-03 -1.4460773447503811e-02 -2.2058181930371790e-02 -1.1443996320770403e-02 1.2299497584112371e-02 2.1142377536760874e-03 -1.7961087981083791e-02 -2.7354687079718097e-03 -1.6785927865260872e-02 -2.1851540438993896e-02 -1.3584628167810297e-02 -9.3083523336521031e-03 -8.0188778565469347e-03 3.9933294857916711e-04 2.2847299686892123e-03 1.7743946642576492e-02 9.6766821571613853e-03 1.1618726223755406e-02 8.5019341211160066e-04 -1.8140488565019843e-03 -1.0812771935808315e-02 1.5354710715344538e-04 -7.5112612879471973e-03 2.5437686751708958e-03 4.0527815435553491e-02 3.2698943303783676e-03 1.8345589513429690e-02 3.3920773898513407e-03 1.6309486358644955e-03 7.4212901623239074e-03 -3.1005424332813821e-03 -6.5508814790641301e-03 -4.1550192319324370e-03 -7.4461502021895866e-03 -1.4046149567714239e-02 -7.1421108736944286e-03 6.0637726842093843e-04 3.5517020031137310e-03 4.8838038498635276e-03 9.8400537720394355e-03 9.6045931685073485e-03 1.3315357012444542e-02 7.6964193608589223e-04 -8.1368400230364783e-03 -4.9710455797789769e-03 -7.3313520613050073e-03 -1.4784490836172729e-02 -1.4460773447503811e-02 3.2698943303783672e-03 2.8731118098502005e-02 5.1084981082776771e-03 -8.0361652219218902e-03 1.8081286244077843e-02 8.6808390913153434e-03 -1.7500199588942254e-02 -3.8092267935830836e-03 -3.0173710576286719e-02 -1.5008420379240743e-02 -1.7915151758845831e-02 -1.7718325711837724e-02 3.9258362191279513e-03 4.6508874710199429e-03 2.9093269953033948e-02 1.1044983073449329e-02 1.3533612878447968e-02 1.4602399756485628e-02 4.5305031427248319e-03 -4.7116183042630530e-03 -3.6781727492691610e-02 2.6978732413730829e-03 -1.4938287845131477e-02 -2.2058181930371790e-02 1.8345589513429690e-02 5.1084981082776780e-03 5.4355436910352904e-02 261 262 263 333 334 335 735 736 737 687 688 689 660 661 662 1092 1093 1094 1095 1096 1097 666 667 668 2.0778369551401141e-02 -5.6917725343477092e-05 -9.9374469414245160e-05 -7.1926806892071444e-03 -6.5054594851553446e-03 -1.0257913058704710e-02 -5.9687084462851682e-03 3.8147303205693286e-04 -2.9308719332203257e-05 1.9521498370665784e-03 6.1313779274680532e-03 9.4515766237076460e-03 2.0946411709329370e-03 4.8496861909620801e-05 6.6302361822477703e-05 -6.9204449549796904e-03 -2.5538734006439506e-03 -5.3131399896679541e-03 -3.7586052509203664e-03 2.4221236916605217e-04 4.7940620191367364e-04 -9.8472121800828507e-04 2.3126904205421129e-03 5.7024510496753202e-03 -5.6917725343477566e-05 2.8934339074296642e-02 1.3124644278525981e-02 -7.5641692479429317e-03 -1.5035095271776823e-02 -6.5079074281281755e-03 9.2455100556500851e-05 -2.5094528567969107e-02 -8.0242684330257916e-03 7.4287760483214942e-03 4.8902804234498979e-04 4.2460469027973532e-03 -6.8182680704347964e-04 1.8055508382315802e-02 1.5202068076648766e-02 -8.2967088837646551e-03 -3.6499264472241912e-03 -7.7185141516961401e-03 6.4621914230359161e-04 -1.0819557482609359e-02 -1.2634759665664103e-02 8.4321723729129661e-03 7.1202322706220393e-03 2.3126904205421073e-03 -9.9374469414244889e-05 1.3124644278525981e-02 4.2135454201247639e-02 -1.1321881887841639e-02 -6.7090459146276343e-03 -6.5203210791197203e-03 2.3845890475904664e-04 -2.1546785664748203e-02 -7.1438923159201240e-03 1.0184220348250750e-02 3.9387982222746773e-03 2.2982098728517090e-02 -2.5713100233494345e-04 1.3646284464311853e-02 4.5979925283251132e-04 -1.4308435649057372e-02 4.8711385758878060e-04 -2.7045593197894170e-02 1.0839203034004497e-03 -1.1373181616238433e-02 -2.3882824371654936e-02 1.4480223452237968e-02 8.4321723729129626e-03 -9.8472121800829331e-04 -7.1926806892071461e-03 -7.5641692479429317e-03 -1.1321881887841639e-02 4.1683307986182666e-02 1.3350655252429237e-02 -8.0672024070636806e-04 3.5645106065052379e-03 1.7671203540578849e-02 5.0670220354035638e-04 -2.8004755224232222e-02 -6.6391873582006536e-04 -1.5503799860423436e-02 -7.6784126462349882e-03 -2.1313693947928362e-02 4.7073418136766275e-04 2.2012653720071981e-02 2.7591357581654842e-03 1.0126644224207089e-02 -5.0179938143060838e-04 8.3955470461818983e-03 1.6048915177942654e-02 -2.3882824371654933e-02 -1.2634759665664097e-02 4.7940620191368237e-04 -6.5054594851553446e-03 -1.5035095271776829e-02 -6.7090459146276343e-03 1.3350655252429238e-02 2.7200618441049242e-02 -5.7673194823968819e-04 1.3472943616127334e-02 2.0972191263417869e-02 -2.2513865274652607e-04 -7.8594003024725079e-03 -3.7737021505248746e-03 -8.5268440766542285e-03 -7.5495737063280936e-03 -2.5940793945281756e-02 7.7686204031597388e-04 3.9545067570140114e-03 -7.7014720145016774e-04 6.6231391366041448e-03 2.5095094846237921e-03 8.1664863471758806e-03 8.3955470461819035e-03 -1.1373181616238437e-02 -1.0819557482609363e-02 2.4221236916605691e-04 -1.0257913058704712e-02 -6.5079074281281747e-03 -6.5203210791197220e-03 -8.0672024070636795e-04 -5.7673194823968841e-04 1.9177180317116186e-02 1.3706642211960544e-04 -9.6535826954070717e-04 3.9256784793168849e-03 -5.0009802850549080e-03 -3.0444839106825669e-03 -5.8645111355526205e-03 6.6610172793033547e-04 1.2219658582966210e-03 -7.2688791571525243e-03 8.7479387702267004e-03 6.7167870713671319e-03 8.1125720774277330e-04 5.4305863607888956e-03 2.5095094846237947e-03 -5.0179938143060838e-04 1.0839203034004484e-03 6.4621914230359129e-04 -3.7586052509203695e-03 -5.9687084462851682e-03 9.2455100556500851e-05 2.3845890475904675e-04 3.5645106065052379e-03 1.3472943616127334e-02 1.3706642211960571e-04 2.3024371780559990e-02 6.4418194915568034e-04 2.9795488093045045e-04 -5.1796186328196782e-03 -1.3144099991697572e-02 -1.0534746629977246e-03 -7.0754506675415538e-03 -2.9972774781901316e-04 1.4208751497703240e-04 -5.1468908038155691e-03 7.4836541594493914e-03 -2.3948654399656236e-04 3.9256784793168806e-03 -2.2513865274652605e-04 5.0670220354035399e-04 -7.1438923159201397e-03 -8.0242684330257951e-03 -2.9308719332201699e-05 3.8147303205693383e-04 -2.5094528567969107e-02 -2.1546785664748200e-02 1.7671203540578845e-02 2.0972191263417869e-02 -9.6535826954070685e-04 6.4418194915568110e-04 6.7926132607731754e-02 6.4418194915567709e-04 -1.7479536130709510e-02 4.1487195487396834e-04 -1.7479536130709503e-02 6.8229617661430281e-04 -4.7074612288900808e-02 6.8229617661430303e-04 2.0612525366592624e-02 -1.3021717664602408e-02 2.0612525366592627e-02 -9.6535826954070706e-04 2.0972191263417862e-02 1.7671203540578856e-02 -2.1546785664748200e-02 -2.5094528567969121e-02 3.8147303205694728e-04 -2.9308719332203487e-05 -8.0242684330257916e-03 -7.1438923159201240e-03 5.0670220354035659e-04 -2.2513865274652615e-04 3.9256784793168858e-03 2.9795488093045018e-04 6.4418194915567665e-04 2.3024371780559990e-02 -1.0534746629977357e-03 -1.3144099991697574e-02 -5.1796186328196755e-03 1.4208751497703242e-04 -2.9972774781900893e-04 -7.0754506675415546e-03 -2.3948654399656125e-04 7.4836541594493922e-03 -5.1468908038155717e-03 1.3706642211961225e-04 1.3472943616127333e-02 3.5645106065052314e-03 2.3845890475904800e-04 9.2455100556502044e-05 -5.9687084462851786e-03 1.9521498370665782e-03 7.4287760483214950e-03 1.0184220348250750e-02 -2.8004755224232222e-02 -7.8594003024725113e-03 -5.0009802850549080e-03 -5.1796186328196773e-03 -1.7479536130709510e-02 -1.0534746629977357e-03 4.7421475228667506e-02 -3.9789767737328993e-03 2.1922072888409083e-02 -7.6285888851016052e-03 2.0893648083541827e-02 -1.1146708348992733e-03 -2.5678249916545038e-02 5.2762862489084596e-03 -1.8884944216992109e-02 -5.8645111355526145e-03 -8.5268440766542303e-03 -1.5503799860423452e-02 2.2982098728517086e-02 4.2460469027973541e-03 9.4515766237076426e-03 6.1313779274680532e-03 4.8902804234498979e-04 3.9387982222746773e-03 -6.6391873582006536e-04 -3.7737021505248746e-03 -3.0444839106825669e-03 -1.3144099991697572e-02 4.1487195487396530e-04 -1.3144099991697576e-02 -3.9789767737328993e-03 2.6942848025714356e-02 -3.9789767737328958e-03 7.4950677053303282e-03 -1.3343798374279545e-02 7.4950677053303282e-03 3.2662355568600383e-03 -7.4445733899490031e-03 3.2662355568600383e-03 -3.0444839106825647e-03 -3.7737021505248733e-03 -6.6391873582006405e-04 3.9387982222746764e-03 4.8902804234498252e-04 6.1313779274680584e-03 9.4515766237076460e-03 4.2460469027973532e-03 2.2982098728517090e-02 -1.5503799860423436e-02 -8.5268440766542285e-03 -5.8645111355526214e-03 -1.0534746629977253e-03 -1.7479536130709503e-02 -5.1796186328196755e-03 2.1922072888409083e-02 -3.9789767737328985e-03 4.7421475228667513e-02 -1.1146708348992846e-03 2.0893648083541820e-02 -7.6285888851016052e-03 -1.8884944216992106e-02 5.2762862489084588e-03 -2.5678249916545031e-02 -5.0009802850549028e-03 -7.8594003024725044e-03 -2.8004755224232219e-02 1.0184220348250743e-02 7.4287760483214907e-03 1.9521498370665628e-03 2.0946411709329375e-03 -6.8182680704347921e-04 -2.5713100233494372e-04 -7.6784126462349864e-03 -7.5495737063280936e-03 6.6610172793033591e-04 -7.0754506675415538e-03 6.8229617661430325e-04 1.4208751497703259e-04 -7.6285888851016052e-03 7.4950677053303265e-03 -1.1146708348992837e-03 3.0586433279304069e-02 -7.0676166136509071e-04 2.3750366776335291e-04 -3.4895423470388612e-03 -1.5218131824172698e-02 -2.1092761662663026e-04 -7.2688791571525217e-03 7.7686204031597161e-04 4.7073418136766719e-04 4.5979925283252715e-04 1.5202068076648763e-02 6.6302361822470249e-05 4.8496861909620693e-05 1.8055508382315805e-02 1.3646284464311854e-02 -2.1313693947928362e-02 -2.5940793945281749e-02 1.2219658582966195e-03 -2.9972774781901338e-04 -4.7074612288900808e-02 -2.9972774781900872e-04 2.0893648083541824e-02 -1.3343798374279545e-02 2.0893648083541820e-02 -7.0676166136509244e-04 7.3916390259950157e-02 -7.0676166136509505e-04 -1.3490211910947436e-02 2.2725915291620749e-03 -1.3490211910947431e-02 1.2219658582966206e-03 -2.5940793945281752e-02 -2.1313693947928373e-02 1.3646284464311863e-02 1.8055508382315816e-02 4.8496861909608428e-05 6.6302361822477703e-05 1.5202068076648766e-02 4.5979925283251159e-04 4.7073418136766253e-04 7.7686204031597432e-04 -7.2688791571525243e-03 1.4208751497703261e-04 6.8229617661430249e-04 -7.0754506675415546e-03 -1.1146708348992731e-03 7.4950677053303300e-03 -7.6285888851016044e-03 2.3750366776335209e-04 -7.0676166136509440e-04 3.0586433279304066e-02 -2.1092761662664565e-04 -1.5218131824172703e-02 -3.4895423470388612e-03 6.6610172793033027e-04 -7.5495737063280971e-03 -7.6784126462349864e-03 -2.5713100233493668e-04 -6.8182680704347823e-04 2.0946411709329531e-03 -6.9204449549796912e-03 -8.2967088837646568e-03 -1.4308435649057372e-02 2.2012653720071978e-02 3.9545067570140122e-03 8.7479387702267021e-03 -5.1468908038155691e-03 2.0612525366592624e-02 -2.3948654399656114e-04 -2.5678249916545038e-02 3.2662355568600387e-03 -1.8884944216992102e-02 -3.4895423470388594e-03 -1.3490211910947436e-02 -2.1092761662664750e-04 4.5456810292458544e-02 -4.9509718706625900e-03 2.0082351021906829e-02 8.1125720774277992e-04 6.6231391366041448e-03 1.0126644224207105e-02 -2.7045593197894166e-02 -7.7185141516961367e-03 -5.3131399896679489e-03 -2.5538734006439506e-03 -3.6499264472241921e-03 4.8711385758878136e-04 2.7591357581654842e-03 -7.7014720145016753e-04 6.7167870713671328e-03 7.4836541594493914e-03 -1.3021717664602406e-02 7.4836541594493948e-03 5.2762862489084596e-03 -7.4445733899490040e-03 5.2762862489084596e-03 -1.5218131824172698e-02 2.2725915291620762e-03 -1.5218131824172705e-02 -4.9509718706625908e-03 2.7033846822738041e-02 -4.9509718706625908e-03 6.7167870713671276e-03 -7.7014720145016037e-04 2.7591357581654825e-03 4.8711385758877989e-04 -3.6499264472241882e-03 -2.5538734006439537e-03 -5.3131399896679532e-03 -7.7185141516961401e-03 -2.7045593197894173e-02 1.0126644224207089e-02 6.6231391366041439e-03 8.1125720774277211e-04 -2.3948654399656231e-04 2.0612525366592627e-02 -5.1468908038155717e-03 -1.8884944216992109e-02 3.2662355568600383e-03 -2.5678249916545035e-02 -2.1092761662663053e-04 -1.3490211910947432e-02 -3.4895423470388603e-03 2.0082351021906829e-02 -4.9509718706625917e-03 4.5456810292458551e-02 8.7479387702266934e-03 3.9545067570140114e-03 2.2012653720071999e-02 -1.4308435649057370e-02 -8.2967088837646533e-03 -6.9204449549796774e-03 -3.7586052509203673e-03 6.4621914230359172e-04 1.0839203034004492e-03 -5.0179938143060860e-04 2.5095094846237917e-03 5.4305863607888964e-03 3.9256784793168815e-03 -9.6535826954070706e-04 1.3706642211961214e-04 -5.8645111355526136e-03 -3.0444839106825651e-03 -5.0009802850549036e-03 -7.2688791571525217e-03 1.2219658582966204e-03 6.6610172793032984e-04 8.1125720774277948e-04 6.7167870713671293e-03 8.7479387702266917e-03 1.9177180317116183e-02 -5.7673194823968884e-04 -8.0672024070636752e-04 -6.5203210791197246e-03 -6.5079074281281738e-03 -1.0257913058704708e-02 2.4221236916605168e-04 -1.0819557482609359e-02 -1.1373181616238433e-02 8.3955470461819000e-03 8.1664863471758806e-03 2.5095094846237938e-03 -2.2513865274652605e-04 2.0972191263417862e-02 1.3472943616127333e-02 -8.5268440766542303e-03 -3.7737021505248707e-03 -7.8594003024725044e-03 7.7686204031597161e-04 -2.5940793945281752e-02 -7.5495737063280971e-03 6.6231391366041448e-03 -7.7014720145016015e-04 3.9545067570140105e-03 -5.7673194823968873e-04 2.7200618441049235e-02 1.3350655252429238e-02 -6.7090459146276352e-03 -1.5035095271776830e-02 -6.5054594851553411e-03 4.7940620191367386e-04 -1.2634759665664104e-02 -2.3882824371654936e-02 1.6048915177942658e-02 8.3955470461819035e-03 -5.0179938143060849e-04 5.0670220354035388e-04 1.7671203540578859e-02 3.5645106065052314e-03 -1.5503799860423452e-02 -6.6391873582006405e-04 -2.8004755224232226e-02 4.7073418136766828e-04 -2.1313693947928373e-02 -7.6784126462349873e-03 1.0126644224207105e-02 2.7591357581654825e-03 2.2012653720071995e-02 -8.0672024070636839e-04 1.3350655252429235e-02 4.1683307986182680e-02 -1.1321881887841653e-02 -7.5641692479429378e-03 -7.1926806892071409e-03 -9.8472121800828507e-04 8.4321723729129661e-03 1.4480223452237971e-02 -2.3882824371654933e-02 -1.1373181616238437e-02 1.0839203034004484e-03 -7.1438923159201397e-03 -2.1546785664748203e-02 2.3845890475904821e-04 2.2982098728517086e-02 3.9387982222746764e-03 1.0184220348250743e-02 4.5979925283252715e-04 1.3646284464311858e-02 -2.5713100233493678e-04 -2.7045593197894170e-02 4.8711385758878044e-04 -1.4308435649057372e-02 -6.5203210791197263e-03 -6.7090459146276352e-03 -1.1321881887841650e-02 4.2135454201247653e-02 1.3124644278525983e-02 -9.9374469414252722e-05 2.3126904205421129e-03 7.1202322706220410e-03 8.4321723729129626e-03 -1.2634759665664097e-02 -1.0819557482609363e-02 6.4621914230359107e-04 -8.0242684330257951e-03 -2.5094528567969118e-02 9.2455100556501610e-05 4.2460469027973532e-03 4.8902804234498371e-04 7.4287760483214924e-03 1.5202068076648761e-02 1.8055508382315816e-02 -6.8182680704347823e-04 -7.7185141516961367e-03 -3.6499264472241869e-03 -8.2967088837646533e-03 -6.5079074281281721e-03 -1.5035095271776829e-02 -7.5641692479429361e-03 1.3124644278525983e-02 2.8934339074296656e-02 -5.6917725343481320e-05 5.7024510496753193e-03 2.3126904205421064e-03 -9.8472121800829353e-04 4.7940620191368248e-04 2.4221236916605686e-04 -3.7586052509203695e-03 -2.9308719332201909e-05 3.8147303205694858e-04 -5.9687084462851795e-03 9.4515766237076408e-03 6.1313779274680576e-03 1.9521498370665624e-03 6.6302361822470195e-05 4.8496861909608550e-05 2.0946411709329535e-03 -5.3131399896679480e-03 -2.5538734006439533e-03 -6.9204449549796774e-03 -1.0257913058704708e-02 -6.5054594851553411e-03 -7.1926806892071427e-03 -9.9374469414253915e-05 -5.6917725343481165e-05 2.0778369551401148e-02 687 688 689 735 736 737 747 748 749 699 700 701 666 667 668 1095 1096 1097 1098 1099 1100 669 670 671 2.3734014755130727e-02 -2.5658470804656029e-03 -4.4651982419895327e-03 -4.1286735863033464e-03 -4.7830909386857665e-03 -1.0368032353605092e-02 -7.7508079458282588e-03 5.1866946580198863e-03 1.6101318404374287e-03 -1.8884582068079835e-03 5.9002593794162186e-03 7.8701964710515288e-03 4.5233984097401893e-03 -3.5235547856093804e-03 -2.1772731795948654e-03 -3.7358611349195148e-03 -2.7303619292965179e-03 -2.7077549802014267e-03 -5.5209656962594599e-03 2.4128423951929909e-03 4.4701376444693667e-03 -5.2326465947523555e-03 1.0305830142816807e-04 5.7677927994325921e-03 -2.5658470804656038e-03 3.1446479185465087e-02 1.4536846334117601e-02 -6.1531489083944809e-03 -1.8864744725245349e-02 -9.4034355747200198e-03 3.6905634404967242e-03 -2.6066740690080369e-02 -9.4513684714392331e-03 7.2521051681846572e-03 3.4432707724700849e-03 6.7786515424461350e-03 -4.3634525153903782e-03 1.9844929482762431e-02 1.6275180020802058e-02 -8.4999277202674958e-03 -6.4547442986536262e-03 -9.4903439966290831e-03 3.0520501380663862e-03 -1.1861848148550999e-02 -1.3550859326928490e-02 7.5876574777701891e-03 8.5133984218327338e-03 4.3053294723510343e-03 -4.4651982419895335e-03 1.4536846334117602e-02 4.7388922238237971e-02 -1.1913114536427113e-02 -1.0141235006297395e-02 -9.5496409435920446e-03 3.6830571554633098e-03 -2.3014617247430719e-02 -1.0553301766231317e-02 8.7794810964050493e-03 6.5453170279542354e-03 2.5116508039244607e-02 -2.2760979259476887e-03 1.5246053808499263e-02 4.6359873189398462e-03 -1.4085715894564567e-02 -2.8615437736492716e-03 -2.9610460309660906e-02 5.1282867047887214e-03 -1.2276478571746456e-02 -2.7344741919048995e-02 1.5149301642271821e-02 1.1965657428552741e-02 -8.3272657889166767e-05 -4.1286735863033455e-03 -6.1531489083944827e-03 -1.1913114536427113e-02 4.2543784947311564e-02 1.7028189535739244e-02 1.0967500016434285e-03 -7.0407950122210725e-04 1.5647183159223709e-02 1.6661783015528423e-03 -2.7986234344948284e-02 -5.0935752695727299e-03 -1.6245894244920362e-02 -4.1506077288417749e-03 -1.9588669017821587e-02 -1.2712010735156003e-03 2.3057826563183201e-02 6.4780563708356099e-03 1.1271331540889350e-02 -4.8043740406952225e-03 7.4511727318231601e-03 1.6565407578923129e-02 -2.3827642308484050e-02 -1.5769208601832924e-02 -1.1694575681456822e-03 -4.7830909386857648e-03 -1.8864744725245349e-02 -1.0141235006297395e-02 1.7028189535739244e-02 3.4488952653839222e-02 8.8208187166001917e-04 1.1064883177405499e-02 2.6194959972990272e-02 1.9243287991392113e-03 -1.1739245771176616e-02 -7.6554482897093993e-03 -1.1668119997049366e-02 -4.9913171322800353e-03 -3.0705235877174074e-02 -1.2771469729434197e-03 7.9539765370944798e-03 3.4096992276661754e-03 8.8844603957832051e-03 1.0325126497637944e-04 9.6961672834293376e-03 1.2257959679578514e-02 -1.4636646673073180e-02 -1.6564350245796201e-02 -8.6232876987077302e-04 -1.0368032353605092e-02 -9.4034355747200180e-03 -9.5496409435920464e-03 1.0967500016434287e-03 8.8208187166001755e-04 2.1017050230456066e-02 1.0931216567455482e-03 1.3746153791328697e-03 4.1708875355357293e-03 -6.4295678327122201e-03 -4.0814474071919783e-03 -8.6794386349357700e-03 5.9033769070103976e-05 -1.0287227541701299e-03 -7.3512933183956936e-03 9.6178784635716583e-03 8.2634663592707248e-03 4.2836903035129740e-03 5.5492740135656485e-03 4.4767810082448735e-03 7.3842932890640371e-04 -6.1845771827907597e-04 -4.8333888222636118e-04 -4.6296845014876676e-03 -7.7508079458282579e-03 3.6905634404967250e-03 3.6830571554633098e-03 -7.0407950122210617e-04 1.1064883177405499e-02 1.0931216567455480e-03 2.4127709632151183e-02 -5.5365124304834704e-03 -2.6401345445255752e-04 -2.9381388909199366e-03 -1.2682288935022866e-02 4.7560845051366118e-04 -7.5063531662625691e-03 5.2740765242894330e-03 4.7937983436717533e-04 -7.4025939662020817e-03 7.4308312207789148e-03 -2.7045364351045743e-03 5.9817489729472109e-03 -3.9188132770149068e-03 -2.2955986916585692e-03 -3.8074851346634386e-03 -5.3227397204493295e-03 -4.6701851587399059e-04 5.1866946580198881e-03 -2.6066740690080362e-02 -2.3014617247430719e-02 1.5647183159223709e-02 2.6194959972990272e-02 1.3746153791328697e-03 -5.5365124304834704e-03 6.6720846929784916e-02 4.1426928915609638e-03 -1.6399829229125411e-02 -8.2963795761306254e-03 -1.7736632951280303e-02 5.7250451713387624e-03 -4.5087584204434247e-02 -2.5439487419903093e-03 2.0113527599592871e-02 -5.0921487041262785e-03 2.0905783172102791e-02 -5.0266962087954356e-03 2.1954069327143277e-02 1.8707818439617444e-02 -1.9709412719770912e-02 -3.0327023055146961e-02 -1.8357109417127481e-03 1.6101318404374287e-03 -9.4513684714392331e-03 -1.0553301766231316e-02 1.6661783015528421e-03 1.9243287991392113e-03 4.1708875355357293e-03 -2.6401345445255784e-04 4.1426928915609630e-03 2.3811551552061300e-02 -4.3295791679055789e-04 -1.3901038023843591e-02 -9.7200550208347229e-03 6.1388036331413097e-04 -3.2464219503988336e-03 -6.9406139968938877e-03 2.6294295803215605e-04 7.4044835404524440e-03 -1.3468337734845776e-03 -2.0671498587589094e-03 1.4916117442834097e-02 7.2313935228875189e-03 -1.3890122333345323e-03 -1.7887942283050580e-03 -6.6530280530400498e-03 -1.8884582068079867e-03 7.2521051681846572e-03 8.7794810964050458e-03 -2.7986234344948284e-02 -1.1739245771176618e-02 -6.4295678327122210e-03 -2.9381388909199349e-03 -1.6399829229125414e-02 -4.3295791679055768e-04 4.6600690062074214e-02 7.0378585778104277e-04 2.1956197043359632e-02 -9.4413161651571396e-03 1.9913129988954080e-02 -4.6884260947971162e-04 -2.4755752605889990e-02 9.3973952020651955e-04 -1.9078301559424620e-02 -2.7557866077049221e-03 -8.3729536115833177e-03 -1.4757344185572322e-02 2.3164996759354049e-02 7.7032680767590497e-03 1.0431335964214753e-02 5.9002593794162186e-03 3.4432707724700840e-03 6.5453170279542363e-03 -5.0935752695727299e-03 -7.6554482897094002e-03 -4.0814474071919783e-03 -1.2682288935022865e-02 -8.2963795761306254e-03 -1.3901038023843591e-02 7.0378585778104201e-04 2.6579773091860638e-02 9.1797296245412982e-04 7.0489983402961592e-03 -5.4542506803820483e-03 7.3484800033009811e-03 -8.4150603649673652e-04 -6.2799514800275374e-03 -8.1438091884435593e-04 -2.8183386130729211e-03 -6.8284180169871202e-03 -4.2293815436298034e-03 7.7826652766718333e-03 4.4914041789060064e-03 8.2144778998003813e-03 7.8701964710515288e-03 6.7786515424461350e-03 2.5116508039244607e-02 -1.6245894244920362e-02 -1.1668119997049366e-02 -8.6794386349357700e-03 4.7560845051366108e-04 -1.7736632951280300e-02 -9.7200550208347229e-03 2.1956197043359629e-02 9.1797296245413177e-04 4.9244807748181615e-02 -3.3046306982715688e-03 2.0823407192463471e-02 -3.5954059420934253e-03 -1.9344385013936854e-02 1.0646644289722103e-03 -2.6803776407992811e-02 -2.1733857155413552e-03 -9.4229257806517780e-03 -3.0462766316720940e-02 1.0766293707745320e-02 9.2429826026455015e-03 4.9001265351514521e-03 4.5233984097401911e-03 -4.3634525153903782e-03 -2.2760979259476895e-03 -4.1506077288417749e-03 -4.9913171322800353e-03 5.9033769070103753e-05 -7.5063531662625691e-03 5.7250451713387624e-03 6.1388036331413097e-04 -9.4413161651571396e-03 7.0489983402961601e-03 -3.3046306982715701e-03 3.0785392423419256e-02 -6.1396416851262833e-03 -2.1850270998907825e-04 -2.0109230164146426e-03 -1.4377021707768205e-02 3.8706283595959644e-04 -9.1155237714508515e-03 4.0017891404697734e-03 3.6641433336773014e-03 -3.0840669850324678e-03 1.3095600388460209e-02 1.0751110321872027e-03 -3.5235547856093813e-03 1.9844929482762425e-02 1.5246053808499267e-02 -1.9588669017821587e-02 -3.0705235877174070e-02 -1.0287227541701317e-03 5.2740765242894330e-03 -4.5087584204434247e-02 -3.2464219503988341e-03 1.9913129988954087e-02 -5.4542506803820483e-03 2.0823407192463474e-02 -6.1396416851262833e-03 7.1193387016416962e-02 2.9824688424083430e-03 -1.3254946589814239e-02 -6.3663802432474331e-03 -1.4231617280499901e-02 5.9617630359813985e-03 -2.6374493100792755e-02 -2.2482737680196457e-02 1.1357842529146575e-02 2.2949627606851198e-02 1.9375698218942511e-03 -2.1772731795948654e-03 1.6275180020802062e-02 4.6359873189398470e-03 -1.2712010735156003e-03 -1.2771469729434197e-03 -7.3512933183956936e-03 4.7937983436717544e-04 -2.5439487419903093e-03 -6.9406139968938869e-03 -4.6884260947971184e-04 7.3484800033009811e-03 -3.5954059420934244e-03 -2.1850270998907746e-04 2.9824688424083426e-03 3.0065779368421031e-02 7.0781329697912993e-04 -1.5298913614596153e-02 -8.3005262377347250e-03 2.1952300551858956e-03 -8.8588032242522159e-03 -1.1018464176140733e-02 7.5339638604705449e-04 1.3726836872707182e-03 2.5045369838975875e-03 -3.7358611349195157e-03 -8.4999277202674958e-03 -1.4085715894564565e-02 2.3057826563183205e-02 7.9539765370944815e-03 9.6178784635716583e-03 -7.4025939662020826e-03 2.0113527599592874e-02 2.6294295803215540e-04 -2.4755752605889986e-02 -8.4150603649673652e-04 -1.9344385013936854e-02 -2.0109230164146439e-03 -1.3254946589814236e-02 7.0781329697912993e-04 4.4984120741554202e-02 -4.6250316624870806e-04 2.0621329498180484e-02 -2.7369912466537892e-03 6.4533356502041173e-03 8.8705281474449112e-03 -2.7399825334657391e-02 -1.1461956274064301e-02 -6.6503914557069265e-03 -2.7303619292965175e-03 -6.4547442986536262e-03 -2.8615437736492716e-03 6.4780563708356107e-03 3.4096992276661750e-03 8.2634663592707248e-03 7.4308312207789166e-03 -5.0921487041262776e-03 7.4044835404524440e-03 9.3973952020651912e-04 -6.2799514800275374e-03 1.0646644289722103e-03 -1.4377021707768204e-02 -6.3663802432474366e-03 -1.5298913614596153e-02 -4.6250316624870828e-04 2.5705097314785031e-02 -3.7529099379830420e-04 6.5585852975766730e-03 2.4455775411898828e-03 5.3884927051938330e-03 -3.8373256060842908e-03 -7.3671493575862045e-03 -3.5853586518454807e-03 -2.7077549802014276e-03 -9.4903439966290849e-03 -2.9610460309660903e-02 1.1271331540889350e-02 8.8844603957832051e-03 4.2836903035129723e-03 -2.7045364351045752e-03 2.0905783172102788e-02 -1.3468337734845784e-03 -1.9078301559424617e-02 -8.1438091884435549e-04 -2.6803776407992808e-02 3.8706283595959617e-04 -1.4231617280499900e-02 -8.3005262377347285e-03 2.0621329498180484e-02 -3.7529099379830425e-04 4.7000586333372688e-02 7.1983307748917230e-03 6.3345326418905844e-03 2.4337724207813563e-02 -1.4987461675190532e-02 -1.1213143020004940e-02 -9.5604041158262078e-03 -5.5209656962594608e-03 3.0520501380663862e-03 5.1282867047887206e-03 -4.8043740406952216e-03 1.0325126497637936e-04 5.5492740135656476e-03 5.9817489729472109e-03 -5.0266962087954356e-03 -2.0671498587589089e-03 -2.7557866077049221e-03 -2.8183386130729215e-03 -2.1733857155413552e-03 -9.1155237714508532e-03 5.9617630359813985e-03 2.1952300551858956e-03 -2.7369912466537879e-03 6.5585852975766730e-03 7.1983307748917239e-03 2.2641193048119415e-02 -3.0555451731539805e-03 -5.3068709289847233e-03 -3.6893006583023870e-03 -4.7750697415784990e-03 -1.0523715045146997e-02 2.4128423951929913e-03 -1.1861848148550999e-02 -1.2276478571746458e-02 7.4511727318231592e-03 9.6961672834293376e-03 4.4767810082448735e-03 -3.9188132770149068e-03 2.1954069327143281e-02 1.4916117442834097e-02 -8.3729536115833177e-03 -6.8284180169871202e-03 -9.4229257806517763e-03 4.0017891404697734e-03 -2.6374493100792762e-02 -8.8588032242522177e-03 6.4533356502041164e-03 2.4455775411898828e-03 6.3345326418905862e-03 -3.0555451731539805e-03 2.9630698909635565e-02 1.4364086644909487e-02 -4.9718278559378387e-03 -1.8661753795067199e-02 -9.5333101612285996e-03 4.4701376444693684e-03 -1.3550859326928490e-02 -2.7344741919048995e-02 1.6565407578923129e-02 1.2257959679578514e-02 7.3842932890640371e-04 -2.2955986916585692e-03 1.8707818439617441e-02 7.2313935228875172e-03 -1.4757344185572322e-02 -4.2293815436298034e-03 -3.0462766316720940e-02 3.6641433336773018e-03 -2.2482737680196454e-02 -1.1018464176140734e-02 8.8705281474449078e-03 5.3884927051938330e-03 2.4337724207813567e-02 -5.3068709289847242e-03 1.4364086644909489e-02 4.6716875954236521e-02 -1.1210402898299094e-02 -1.0455378918544532e-02 -1.0198450601933341e-02 -5.2326465947523555e-03 7.5876574777701874e-03 1.5149301642271821e-02 -2.3827642308484050e-02 -1.4636646673073182e-02 -6.1845771827907586e-04 -3.8074851346634390e-03 -1.9709412719770916e-02 -1.3890122333345318e-03 2.3164996759354042e-02 7.7826652766718324e-03 1.0766293707745317e-02 -3.0840669850324687e-03 1.1357842529146579e-02 7.5339638604705449e-04 -2.7399825334657391e-02 -3.8373256060842903e-03 -1.4987461675190532e-02 -3.6893006583023861e-03 -4.9718278559378378e-03 -1.1210402898299096e-02 4.3875970256538048e-02 1.6427047571277630e-02 1.5363427890390472e-03 1.0305830142816742e-04 8.5133984218327338e-03 1.1965657428552743e-02 -1.5769208601832924e-02 -1.6564350245796201e-02 -4.8333888222636096e-04 -5.3227397204493303e-03 -3.0327023055146958e-02 -1.7887942283050576e-03 7.7032680767590497e-03 4.4914041789060073e-03 9.2429826026455015e-03 1.3095600388460209e-02 2.2949627606851191e-02 1.3726836872707177e-03 -1.1461956274064301e-02 -7.3671493575862045e-03 -1.1213143020004940e-02 -4.7750697415784990e-03 -1.8661753795067196e-02 -1.0455378918544530e-02 1.6427047571277630e-02 3.6965846246006628e-02 1.3593313306119363e-03 5.7677927994325921e-03 4.3053294723510343e-03 -8.3272657889166659e-05 -1.1694575681456827e-03 -8.6232876987077335e-04 -4.6296845014876676e-03 -4.6701851587399048e-04 -1.8357109417127485e-03 -6.6530280530400507e-03 1.0431335964214753e-02 8.2144778998003813e-03 4.9001265351514512e-03 1.0751110321872025e-03 1.9375698218942513e-03 2.5045369838975866e-03 -6.6503914557069247e-03 -3.5853586518454807e-03 -9.5604041158262078e-03 -1.0523715045146997e-02 -9.5333101612286014e-03 -1.0198450601933341e-02 1.5363427890390476e-03 1.3593313306119363e-03 2.3720176411127399e-02 699 700 701 747 748 749 759 760 761 711 712 713 669 670 671 1098 1099 1100 1101 1102 1103 672 673 674 2.8025568563593235e-02 -4.9863673674427561e-03 -9.4337434899071544e-03 -1.1470424887668261e-03 -1.3446239630616472e-03 -9.1958937411281486e-03 -1.1144916811628370e-02 9.7694271217992415e-03 3.7936972421200254e-03 -5.3037347764675943e-03 4.0813138426628107e-03 5.1635889247650000e-03 8.0270165639616583e-03 -7.0348511329282638e-03 -4.9301370718942018e-03 -7.6533103444071542e-04 -1.3842487630089952e-03 7.8215077071025236e-04 -8.6696452450267629e-03 4.4075844928280787e-03 8.8665838644764964e-03 -9.0219147712246300e-03 -3.5082342308484665e-03 4.9537535008577268e-03 -4.9863673674427570e-03 3.2472803074744531e-02 1.4501807632936613e-02 -3.0437452439746049e-03 -2.1457756719894090e-02 -1.2074695462879615e-02 7.1049937276544822e-03 -2.5064118095021338e-02 -9.8872330306232180e-03 5.4133150382143962e-03 6.0120243916162996e-03 8.8839504723563518e-03 -7.8201689552350913e-03 1.9658153024363037e-02 1.6326324434752074e-02 -7.2291781986166918e-03 -9.0392457977360730e-03 -1.0671465470785615e-02 5.2284041542569647e-03 -1.1748671745984754e-02 -1.3190452723891443e-02 5.3327468451433106e-03 9.1668118679123726e-03 6.1117641481348572e-03 -9.4337434899071544e-03 1.4501807632936618e-02 5.1101675818992220e-02 -1.1010074133376244e-02 -1.3402267970885805e-02 -1.2147927251985196e-02 7.6652771330257656e-03 -2.2987032633534091e-02 -1.2992115385770012e-02 6.1438890516924295e-03 8.8065347539059303e-03 2.6673820105787768e-02 -4.8891076778802755e-03 1.5816566893270535e-02 7.7238859803565370e-03 -1.2410776646999105e-02 -6.1675192107469102e-03 -3.1653004714622762e-02 9.5361178796237074e-03 -1.1937647118116766e-02 -2.9542000174473757e-02 1.4398417883820888e-02 1.5369557653170468e-02 8.3566562171521206e-04 -1.1470424887668280e-03 -3.0437452439746049e-03 -1.1010074133376244e-02 4.0677851521857961e-02 1.9199626589539390e-02 2.5378852953743111e-03 -4.5132593678207100e-03 1.1462952525848861e-02 1.8390377599276917e-03 -2.5503064025539843e-02 -8.5417499961129486e-03 -1.5916222934985381e-02 -1.0011712218291635e-03 -1.5931428010531885e-02 -2.0544668677282252e-03 2.1605602643075317e-02 9.3710731242748306e-03 1.1549061902404626e-02 -8.5031983941721671e-03 5.0746187476478789e-03 1.5489289901532777e-02 -2.1615718666804576e-02 -1.7591347736691503e-02 -2.4345109231495624e-03 -1.3446239630616464e-03 -2.1457756719894083e-02 -1.3402267970885801e-02 1.9199626589539387e-02 4.2684630769329247e-02 2.7981825220218803e-03 6.7030451136533336e-03 3.0267509924533718e-02 3.8657638334867479e-03 -1.4376416971323859e-02 -1.2684689750677205e-02 -1.5142015527518008e-02 -7.9047971566911953e-04 -3.4473031458913457e-02 -3.2487155752812360e-03 1.0979063617928534e-02 8.4952043347870463e-03 1.1658580032466686e-02 -3.7197015010681711e-03 1.0426227446347212e-02 1.5870942982058905e-02 -1.6650513169998469e-02 -2.3258094545512451e-02 -2.4004702963491831e-03 -9.1958937411281486e-03 -1.2074695462879616e-02 -1.2147927251985196e-02 2.5378852953743115e-03 2.7981825220218782e-03 2.2801348346444292e-02 1.1270411618337906e-03 3.4747115138187286e-03 4.6094739317193842e-03 -7.2311842008801223e-03 -5.7123462996599558e-03 -1.1199763908364822e-02 1.5723245226618892e-04 -2.9957684625984845e-03 -7.6952951859252435e-03 9.8242099976486169e-03 1.0278749904370870e-02 7.2649550148326672e-03 4.7490728958484475e-03 6.2711839222300558e-03 1.9610524879909805e-03 -1.9683638609630867e-03 -2.0400176373034712e-03 -5.5938434347120652e-03 -1.1144916811628372e-02 7.1049937276544822e-03 7.6652771330257656e-03 -4.5132593678207092e-03 6.7030451136533336e-03 1.1270411618337906e-03 2.7102552858308517e-02 -1.1442355066275537e-02 -1.5152558078423463e-03 -8.0515492034170669e-04 -1.0165877469026852e-02 2.7432297686980408e-03 -9.5810741965587833e-03 1.0558231260717730e-02 1.4687230691169816e-03 -9.6054914162932263e-03 5.5749024409157818e-03 -5.7932272569725177e-03 9.3903917364690417e-03 -7.3843552222677272e-03 -5.5402884476470644e-03 -8.4304788213475498e-04 -9.4858478537121873e-04 -1.5549962021264748e-04 9.7694271217992432e-03 -2.5064118095021338e-02 -2.2987032633534091e-02 1.1462952525848861e-02 3.0267509924533718e-02 3.4747115138187290e-03 -1.1442355066275535e-02 6.3365951260364373e-02 6.0803050258294387e-03 -1.3243780444395141e-02 -1.5675099079176323e-02 -1.7803946078282236e-02 1.0511012052114714e-02 -4.1397662991262518e-02 -4.4600203096738303e-03 1.7600553172732174e-02 1.8476209257083033e-03 2.0898208332278959e-02 -8.7138599534136371e-03 2.1099671256118870e-02 1.8506035093970245e-02 -1.5943949408410690e-02 -3.4443873201265060e-02 -3.7082609444072205e-03 3.7936972421200262e-03 -9.8872330306232180e-03 -1.2992115385770010e-02 1.8390377599276924e-03 3.8657638334867479e-03 4.6094739317193842e-03 -1.5152558078423458e-03 6.0803050258294378e-03 2.4697266826210110e-02 1.2403968267301402e-03 -1.4691051849295110e-02 -1.3054993868336246e-02 1.5748684847113883e-03 -4.8381854574062171e-03 -7.0449613031213108e-03 -8.7474337857986037e-05 7.7468490414865166e-03 1.4415730206317977e-03 -4.7822989287085301e-03 1.5255951946524883e-02 9.8012032287332213e-03 -2.0629712390803855e-03 -3.5323995100030366e-03 -7.4574464500669468e-03 -5.3037347764675943e-03 5.4133150382143962e-03 6.1438890516924268e-03 -2.5503064025539843e-02 -1.4376416971323861e-02 -7.2311842008801223e-03 -8.0515492034170691e-04 -1.3243780444395144e-02 1.2403968267301400e-03 4.3604750736787212e-02 4.5080685389521126e-03 2.0686858630700810e-02 -1.1122309996711965e-02 1.7097211266631752e-02 -6.5749837579099886e-04 -2.1906597089002562e-02 -2.7795510854109612e-03 -1.8227181938388737e-02 -1.3934499803390054e-04 -6.7895836297667917e-03 -1.2552997680652633e-02 2.1175455069310355e-02 1.0170737287098480e-02 1.0597717686589118e-02 4.0813138426628107e-03 6.0120243916162996e-03 8.8065347539059285e-03 -8.5417499961129486e-03 -1.2684689750677205e-02 -5.7123462996599558e-03 -1.0165877469026851e-02 -1.5675099079176320e-02 -1.4691051849295110e-02 4.5080685389521126e-03 2.8049685714813991e-02 5.7203125585011533e-03 4.9992257760917182e-03 1.2798195537995244e-03 7.6221481330613775e-03 -4.3216024114286263e-03 -6.8926805074567069e-03 -4.9254013303191265e-03 -1.1100648132604180e-03 -9.4721844465822016e-03 -7.5417424974961959e-03 1.0550686532122202e-02 9.3831241236626128e-03 1.0721546531301931e-02 5.1635889247649992e-03 8.8839504723563535e-03 2.6673820105787768e-02 -1.5916222934985381e-02 -1.5142015527518007e-02 -1.1199763908364822e-02 2.7432297686980404e-03 -1.7803946078282236e-02 -1.3054993868336244e-02 2.0686858630700806e-02 5.7203125585011515e-03 5.1087628548539758e-02 -6.0244829873308970e-03 2.0514002758098077e-02 -5.9506496450468399e-04 -1.8671109007311230e-02 -3.2033680012618195e-03 -2.8110445929823164e-02 1.3859860753884093e-03 -1.0348870391678316e-02 -3.2273298502808696e-02 1.0632151530075263e-02 1.1379934209784779e-02 7.4721185195100980e-03 8.0270165639616600e-03 -7.8201689552350913e-03 -4.8891076778802747e-03 -1.0011712218291643e-03 -7.9047971566911963e-04 1.5723245226618922e-04 -9.5810741965587833e-03 1.0511012052114714e-02 1.5748684847113883e-03 -1.1122309996711965e-02 4.9992257760917164e-03 -6.0244829873308979e-03 3.2587601240708558e-02 -1.1302717754835141e-02 -1.3370175635234150e-03 -3.4107491727384783e-04 -1.1682465755740811e-02 1.9784776539788127e-03 -1.2360579943153687e-02 6.9262317896356812e-03 7.2968163693244888e-03 -6.2084075291427704e-03 9.1593625636380554e-03 1.2432132684537093e-03 -7.0348511329282638e-03 1.9658153024363037e-02 1.5816566893270538e-02 -1.5931428010531885e-02 -3.4473031458913457e-02 -2.9957684625984849e-03 1.0558231260717730e-02 -4.1397662991262518e-02 -4.8381854574062180e-03 1.7097211266631752e-02 1.2798195537995251e-03 2.0514002758098077e-02 -1.1302717754835139e-02 6.6833862278396522e-02 5.2033566162964879e-03 -1.1110350658738957e-02 -1.3706115591923263e-02 -1.5086147019895708e-02 1.0325339022578723e-02 -2.5021010997936025e-02 -2.2281385111393937e-02 7.3985660071060524e-03 2.6825986183476175e-02 3.6675597836292491e-03 -4.9301370718942000e-03 1.6326324434752074e-02 7.7238859803565379e-03 -2.0544668677282252e-03 -3.2487155752812329e-03 -7.6952951859252444e-03 1.4687230691169818e-03 -4.4600203096738303e-03 -7.0449613031213108e-03 -6.5749837579099821e-04 7.6221481330613775e-03 -5.9506496450468388e-04 -1.3370175635234150e-03 5.2033566162964862e-03 2.9859033505033331e-02 2.3197339559588009e-03 -1.5444189450388279e-02 -1.1900134362439439e-02 4.2340746265511434e-03 -9.2607375679275641e-03 -1.3400858039217336e-02 9.5658822730991370e-04 3.2618337191609725e-03 3.0533943698181519e-03 -7.6533103444071553e-04 -7.2291781986166918e-03 -1.2410776646999105e-02 2.1605602643075320e-02 1.0979063617928535e-02 9.8242099976486169e-03 -9.6054914162932263e-03 1.7600553172732174e-02 -8.7474337857985712e-05 -2.1906597089002562e-02 -4.3216024114286263e-03 -1.8671109007311233e-02 -3.4107491727384674e-04 -1.1110350658738954e-02 2.3197339559588009e-03 4.2305034181870524e-02 3.4809161217513574e-03 1.9986610654310989e-02 -5.8466019094298204e-03 4.7286600302591667e-03 6.4705369033034197e-03 -2.5445540458505680e-02 -1.4128061673886944e-02 -7.4317315190535055e-03 -1.3842487630089950e-03 -9.0392457977360730e-03 -6.1675192107469093e-03 9.3710731242748289e-03 8.4952043347870463e-03 1.0278749904370870e-02 5.5749024409157818e-03 1.8476209257083033e-03 7.7468490414865174e-03 -2.7795510854109625e-03 -6.8926805074567069e-03 -3.2033680012618199e-03 -1.1682465755740811e-02 -1.3706115591923263e-02 -1.5444189450388279e-02 3.4809161217513578e-03 2.6254214378330105e-02 4.2783801270331653e-03 4.7729889130565277e-03 5.2754674622719211e-03 7.7164095821064763e-03 -7.3536149958377296e-03 -1.2234465203981325e-02 -5.2053119926000193e-03 7.8215077071025171e-04 -1.0671465470785615e-02 -3.1653004714622762e-02 1.1549061902404630e-02 1.1658580032466687e-02 7.2649550148326690e-03 -5.7932272569725177e-03 2.0898208332278963e-02 1.4415730206317977e-03 -1.8227181938388737e-02 -4.9254013303191265e-03 -2.8110445929823164e-02 1.9784776539788114e-03 -1.5086147019895703e-02 -1.1900134362439439e-02 1.9986610654310989e-02 4.2783801270331653e-03 4.8738523334538049e-02 4.5238777166492191e-03 8.3833619986781079e-03 2.6172263468450828e-02 -1.4799769502692656e-02 -1.4535516669456457e-02 -1.1953729831567986e-02 -8.6696452450267629e-03 5.2284041542569656e-03 9.5361178796237074e-03 -8.5031983941721689e-03 -3.7197015010681715e-03 4.7490728958484467e-03 9.3903917364690417e-03 -8.7138599534136371e-03 -4.7822989287085301e-03 -1.3934499803389989e-04 -1.1100648132604182e-03 1.3859860753884096e-03 -1.2360579943153687e-02 1.0325339022578726e-02 4.2340746265511452e-03 -5.8466019094298230e-03 4.7729889130565285e-03 4.5238777166492191e-03 2.7298730822515813e-02 -5.2485387825807013e-03 -1.0151149657226632e-02 -1.1697520691685060e-03 -1.5345670395692985e-03 -9.4956806081257644e-03 4.4075844928280795e-03 -1.1748671745984754e-02 -1.1937647118116766e-02 5.0746187476478797e-03 1.0426227446347212e-02 6.2711839222300550e-03 -7.3843552222677264e-03 2.1099671256118870e-02 1.5255951946524883e-02 -6.7895836297667917e-03 -9.4721844465822016e-03 -1.0348870391678316e-02 6.9262317896356812e-03 -2.5021010997936025e-02 -9.2607375679275624e-03 4.7286600302591675e-03 5.2754674622719194e-03 8.3833619986781079e-03 -5.2485387825807013e-03 3.0598075300594794e-02 1.3980084442239065e-02 -1.7146174257555930e-03 -2.1157574274829796e-02 -1.2343327231949471e-02 8.8665838644764964e-03 -1.3190452723891443e-02 -2.9542000174473754e-02 1.5489289901532777e-02 1.5870942982058909e-02 1.9610524879909823e-03 -5.5402884476470644e-03 1.8506035093970245e-02 9.8012032287332195e-03 -1.2552997680652633e-02 -7.5417424974961976e-03 -3.2273298502808696e-02 7.2968163693244888e-03 -2.2281385111393937e-02 -1.3400858039217336e-02 6.4705369033034171e-03 7.7164095821064763e-03 2.6172263468450828e-02 -1.0151149657226632e-02 1.3980084442239067e-02 5.0077284522673272e-02 -9.8787912531108617e-03 -1.3059891767593104e-02 -1.2795646991348511e-02 -9.0219147712246282e-03 5.3327468451433080e-03 1.4398417883820888e-02 -2.1615718666804576e-02 -1.6650513169998472e-02 -1.9683638609630867e-03 -8.4304788213475411e-04 -1.5943949408410690e-02 -2.0629712390803846e-03 2.1175455069310359e-02 1.0550686532122202e-02 1.0632151530075263e-02 -6.2084075291427704e-03 7.3985660071060541e-03 9.5658822730991359e-04 -2.5445540458505680e-02 -7.3536149958377296e-03 -1.4799769502692656e-02 -1.1697520691685060e-03 -1.7146174257555936e-03 -9.8787912531108600e-03 4.3128926307670575e-02 1.8380695615630906e-02 2.7227382146409245e-03 -3.5082342308484656e-03 9.1668118679123726e-03 1.5369557653170468e-02 -1.7591347736691503e-02 -2.3258094545512455e-02 -2.0400176373034720e-03 -9.4858478537121862e-04 -3.4443873201265060e-02 -3.5323995100030371e-03 1.0170737287098481e-02 9.3831241236626128e-03 1.1379934209784778e-02 9.1593625636380537e-03 2.6825986183476175e-02 3.2618337191609725e-03 -1.4128061673886945e-02 -1.2234465203981323e-02 -1.4535516669456457e-02 -1.5345670395692981e-03 -2.1157574274829796e-02 -1.3059891767593108e-02 1.8380695615630906e-02 4.5718085050537448e-02 3.1565000022398546e-03 4.9537535008577268e-03 6.1117641481348572e-03 8.3566562171521173e-04 -2.4345109231495620e-03 -2.4004702963491826e-03 -5.5938434347120652e-03 -1.5549962021264681e-04 -3.7082609444072205e-03 -7.4574464500669450e-03 1.0597717686589118e-02 1.0721546531301931e-02 7.4721185195100980e-03 1.2432132684537091e-03 3.6675597836292491e-03 3.0533943698181519e-03 -7.4317315190535064e-03 -5.2053119926000202e-03 -1.1953729831567988e-02 -9.4956806081257644e-03 -1.2343327231949471e-02 -1.2795646991348513e-02 2.7227382146409245e-03 3.1565000022398533e-03 2.6439488196652049e-02 711 712 713 759 760 761 771 772 773 723 724 725 672 673 674 1101 1102 1103 1104 1105 1106 675 676 677 3.3289914739134813e-02 -6.5825898464427057e-03 -1.4139239078107057e-02 6.4011496582203151e-04 3.2515717480406060e-03 -6.9150502290714318e-03 -1.5822734914991456e-02 1.3215411801456930e-02 5.8576246713980852e-03 -7.3345468033989836e-03 1.1038603784153263e-03 1.6147232390660959e-03 1.2457198890149686e-02 -9.7397939331096486e-03 -7.5746082850659969e-03 1.1094577070363660e-03 1.1871002117111902e-03 4.8488499147283492e-03 -1.2895408262982314e-02 5.6006048618498609e-03 1.2915622377200606e-02 -1.1443996320770141e-02 -8.0361652219215658e-03 3.3920773898513485e-03 -6.5825898464427048e-03 3.2098002243370567e-02 1.3011535848147158e-02 1.2253142626086025e-03 -2.2335217982913477e-02 -1.4037290692186960e-02 9.5016610242816772e-03 -2.2419873306876972e-02 -9.2529943512368266e-03 2.3627265084828989e-03 7.5944080015231076e-03 1.0219135269408819e-02 -1.0352473370986590e-02 1.7865564797124533e-02 1.5259937260786921e-02 -4.8246601316411994e-03 -1.0787302465792372e-02 -1.1026886111211793e-02 6.5557838000213937e-03 -1.0696420377750419e-02 -1.1594727386031125e-02 2.1142377536759217e-03 8.6808390913150329e-03 7.4212901623238077e-03 -1.4139239078107053e-02 1.3011535848147154e-02 5.2705005588161546e-02 -8.7588427586887709e-03 -1.5916141002228969e-02 -1.4131053871067051e-02 1.1378092343077295e-02 -2.1405316781205191e-02 -1.4107847014699911e-02 2.5289955212740509e-03 1.0297518827343099e-02 2.7413628186163094e-02 -7.4814784936378508e-03 1.5240770990830245e-02 9.4691555315151513e-03 -9.4019136635681705e-03 -8.9219517001717860e-03 -3.2858075041299971e-02 1.3574888545538566e-02 -1.0387702426791788e-02 -3.0121762014637243e-02 1.2299497584111937e-02 1.8081286244077240e-02 1.6309486358643899e-03 6.4011496582203043e-04 1.2253142626086025e-03 -8.7588427586887743e-03 3.6919702769039241e-02 1.9162547101577849e-02 3.2629172382713126e-03 -6.7794356749554694e-03 5.7782489127726003e-03 1.0890635018246948e-03 -2.1423073852017110e-02 -1.0244067570943689e-02 -1.4422077707696468e-02 9.1151573047557229e-04 -1.0896073894711691e-02 -1.8701396556673204e-03 1.8397884204596343e-02 1.0708668766436615e-02 1.0812745352164900e-02 -1.0705620161877134e-02 1.7655620112014925e-03 1.2986876463072955e-02 -1.7961087981083472e-02 -1.7500199588941782e-02 -3.1005424332813014e-03 3.2515717480406043e-03 -2.2335217982913477e-02 -1.5916141002228969e-02 1.9162547101577849e-02 5.0877231156406653e-02 4.9069285527999062e-03 1.0339012985412924e-03 3.2478558076896570e-02 5.1725849462729732e-03 -1.5065846556214103e-02 -1.8237074917714251e-02 -1.8541081243184477e-02 4.5276792349260801e-03 -3.6587115485094815e-02 -4.6942595093659879e-03 1.2296389491272163e-02 1.4021613642325240e-02 1.4581813703505492e-02 -8.4203144528834876e-03 9.9557160863800974e-03 1.8645173784133384e-02 -1.6785927865260401e-02 -3.0173710576286039e-02 -4.1550192319323226e-03 -6.9150502290714335e-03 -1.4037290692186963e-02 -1.4131053871067049e-02 3.2629172382713130e-03 4.9069285527999036e-03 2.4340299179269328e-02 3.3305377240831877e-04 4.9496637684411223e-03 5.0098245274789047e-03 -7.2020216596134935e-03 -7.6255886427371725e-03 -1.3366187709078662e-02 8.7576295815381365e-04 -4.4088143078325611e-03 -8.0310136851172460e-03 9.1986336411556489e-03 1.2457869668664327e-02 9.7357380553707313e-03 3.1821729866675637e-03 7.5664584464343139e-03 2.9932749822081132e-03 -2.7354687079717333e-03 -3.8092267935829769e-03 -6.5508814790641188e-03 -1.5822734914991459e-02 9.5016610242816772e-03 1.1378092343077295e-02 -6.7794356749554677e-03 1.0339012985412959e-03 3.3305377240831893e-04 3.1524188830705492e-02 -1.6038922420200628e-02 -2.7981061602585663e-03 1.8872582239252045e-04 -6.1221090026752807e-03 5.4741813260308905e-03 -1.3019357637647458e-02 1.4691459502318257e-02 2.5600812177886006e-03 -1.0766119309587732e-02 2.2840400822567498e-03 -9.2124269451830439e-03 1.3824539471972767e-02 -9.8805336272466144e-03 -8.5045174899493377e-03 8.5019341211134457e-04 4.5305031427245474e-03 7.6964193608584030e-04 1.3215411801456932e-02 -2.2419873306876968e-02 -2.1405316781205191e-02 5.7782489127726020e-03 3.2478558076896570e-02 4.9496637684411223e-03 -1.6038922420200628e-02 5.8107182410866008e-02 6.4323132209253200e-03 -8.5850458871672974e-03 -2.1022280428842272e-02 -1.7314994454899986e-02 1.4222139914335661e-02 -3.6298932203394044e-02 -5.0177395564440282e-03 1.3522937357969101e-02 7.1768754766793150e-03 2.0281634042236384e-02 -1.1301997743358511e-02 1.8760197467362204e-02 1.7045485340725232e-02 -1.0812771935807862e-02 -3.6781727492690833e-02 -4.9710455797788459e-03 5.8576246713980852e-03 -9.2529943512368266e-03 -1.4107847014699913e-02 1.0890635018246948e-03 5.1725849462729741e-03 5.0098245274789056e-03 -2.7981061602585663e-03 6.4323132209253234e-03 2.5132797450513944e-02 3.7288921027268012e-03 -1.5007728278487887e-02 -1.5049726506319350e-02 2.5104382210233839e-03 -5.0851218216769406e-03 -6.9780090624548376e-03 -1.2390864475311444e-03 8.0130171225348216e-03 3.1330657245951890e-03 -7.3347770326813522e-03 1.4439547465931454e-02 1.0996734903922535e-02 -1.8140488565019026e-03 -4.7116183042629186e-03 -8.1368400230364749e-03 -7.3345468033989792e-03 2.3627265084828998e-03 2.5289955212740517e-03 -2.1423073852017110e-02 -1.5065846556214102e-02 -7.2020216596134943e-03 1.8872582239252067e-04 -8.5850458871672974e-03 3.7288921027268020e-03 3.9220332162652319e-02 6.6931956751971802e-03 1.8112684925723137e-02 -1.1821971335939860e-02 1.2942154347418928e-02 -1.6286197954919258e-03 -1.7779658285261089e-02 -5.1615652638077559e-03 -1.6248922908140319e-02 1.2062456489960261e-03 -4.2306018973587711e-03 -9.1310619585175494e-03 1.7743946642576169e-02 1.1044983073448924e-02 9.8400537720393037e-03 1.1038603784153263e-03 7.5944080015231050e-03 1.0297518827343099e-02 -1.0244067570943689e-02 -1.8237074917714251e-02 -7.6255886427371734e-03 -6.1221090026752807e-03 -2.1022280428842265e-02 -1.5007728278487887e-02 6.6931956751971802e-03 3.0666457396886750e-02 1.0079138337732050e-02 1.7348747683765134e-03 6.3328333051357417e-03 7.8346383211824813e-03 -6.4490222345178682e-03 -8.7787470781422686e-03 -8.7922323602929106e-03 1.6645417623926272e-03 -1.1157996035332195e-02 -1.0101103217184056e-02 1.1618726223755187e-02 1.4602399756485380e-02 1.3315357012444393e-02 1.6147232390660976e-03 1.0219135269408821e-02 2.7413628186163094e-02 -1.4422077707696468e-02 -1.8541081243184480e-02 -1.3366187709078662e-02 5.4741813260308896e-03 -1.7314994454899989e-02 -1.5049726506319354e-02 1.8112684925723137e-02 1.0079138337732052e-02 5.2659781603691030e-02 -9.0164721831024822e-03 1.9709940544531804e-02 1.3101718654336049e-03 -1.6781862067634035e-02 -7.2382509075585872e-03 -2.9388966660275382e-02 5.3421403104518869e-03 -1.0447500424477004e-02 -3.3183293948121577e-02 9.6766821571609776e-03 1.3533612878447390e-02 9.6045931685072444e-03 1.2457198890149688e-02 -1.0352473370986590e-02 -7.4814784936378526e-03 9.1151573047557337e-04 4.5276792349260809e-03 8.7576295815381387e-04 -1.3019357637647460e-02 1.4222139914335661e-02 2.5104382210233839e-03 -1.1821971335939860e-02 1.7348747683765139e-03 -9.0164721831024822e-03 3.5608152587585741e-02 -1.5390435959366681e-02 -2.5632907937818525e-03 5.3919056963360823e-04 -7.5462460001675686e-03 4.4046104737566110e-03 -1.6655850947710639e-02 8.8786251937544233e-03 1.0664052549167405e-02 -8.0188778565466520e-03 3.9258362191281560e-03 6.0637726842097182e-04 -9.7397939331096486e-03 1.7865564797124530e-02 1.5240770990830243e-02 -1.0896073894711693e-02 -3.6587115485094815e-02 -4.4088143078325603e-03 1.4691459502318257e-02 -3.6298932203394044e-02 -5.0851218216769398e-03 1.2942154347418926e-02 6.3328333051357408e-03 1.9709940544531807e-02 -1.5390435959366681e-02 6.0980462170848057e-02 5.9293390880243158e-03 -7.4504425524758618e-03 -1.9178242935257762e-02 -1.5571839535378874e-02 1.3558402521237866e-02 -2.2207839602394936e-02 -2.0698078808361383e-02 2.2847299686888376e-03 2.9093269953033216e-02 4.8838038498633975e-03 -7.5746082850659969e-03 1.5259937260786921e-02 9.4691555315151478e-03 -1.8701396556673208e-03 -4.6942595093659879e-03 -8.0310136851172460e-03 2.5600812177886010e-03 -5.0177395564440282e-03 -6.9780090624548376e-03 -1.6286197954919262e-03 7.8346383211824813e-03 1.3101718654336052e-03 -2.5632907937818529e-03 5.9293390880243158e-03 2.9344095598733463e-02 4.4969508074663520e-03 -1.5273712888761242e-02 -1.4181681406169185e-02 6.1802935561730433e-03 -8.6890901864422679e-03 -1.4484420845054647e-02 3.9933294857910271e-04 4.6508874710198111e-03 3.5517020031137028e-03 1.1094577070363668e-03 -4.8246601316411994e-03 -9.4019136635681705e-03 1.8397884204596343e-02 1.2296389491272160e-02 9.1986336411556489e-03 -1.0766119309587733e-02 1.3522937357969105e-02 -1.2390864475311451e-03 -1.7779658285261089e-02 -6.4490222345178682e-03 -1.6781862067634035e-02 5.3919056963361062e-04 -7.4504425524758609e-03 4.4969508074663529e-03 3.7949216087196570e-02 6.0590439268230116e-03 1.8047020698889235e-02 -7.5984305346205056e-03 1.8541745218109327e-03 3.1264072334115690e-03 -2.1851540438993559e-02 -1.5008420379240283e-02 -7.4461502021894548e-03 1.1871002117111902e-03 -1.0787302465792372e-02 -8.9219517001717860e-03 1.0708668766436615e-02 1.4021613642325237e-02 1.2457869668664327e-02 2.2840400822567485e-03 7.1768754766793150e-03 8.0130171225348216e-03 -5.1615652638077551e-03 -8.7787470781422686e-03 -7.2382509075585872e-03 -7.5462460001675686e-03 -1.9178242935257755e-02 -1.5273712888761238e-02 6.0590439268230134e-03 2.8105951578525291e-02 8.7285621094775681e-03 1.7773106103996642e-03 7.1581774935000498e-03 9.3765774695092341e-03 -9.3083523336519088e-03 -1.7718325711837499e-02 -7.1421108736943366e-03 4.8488499147283483e-03 -1.1026886111211793e-02 -3.2858075041299971e-02 1.0812745352164900e-02 1.4581813703505494e-02 9.7357380553707330e-03 -9.2124269451830422e-03 2.0281634042236381e-02 3.1330657245951885e-03 -1.6248922908140319e-02 -8.7922323602929106e-03 -2.9388966660275382e-02 4.4046104737566110e-03 -1.5571839535378877e-02 -1.4181681406169181e-02 1.8047020698889235e-02 8.7285621094775698e-03 5.0327935818449548e-02 9.3275158159412106e-04 9.7140999105093575e-03 2.7278133077043187e-02 -1.3584628167809859e-02 -1.7915151758845230e-02 -1.4046149567714123e-02 -1.2895408262982314e-02 6.5557838000213937e-03 1.3574888545538566e-02 -1.0705620161877134e-02 -8.4203144528834876e-03 3.1821729866675641e-03 1.3824539471972768e-02 -1.1301997743358511e-02 -7.3347770326813522e-03 1.2062456489960252e-03 1.6645417623926276e-03 5.3421403104518860e-03 -1.6655850947710639e-02 1.3558402521237866e-02 6.1802935561730415e-03 -7.5984305346205091e-03 1.7773106103996642e-03 9.3275158159412280e-04 3.2670977679068632e-02 -6.5315997391823515e-03 -1.4546117886438840e-02 1.5354710715316956e-04 2.6978732413727980e-03 -7.3313520613049899e-03 5.6006048618498609e-03 -1.0696420377750423e-02 -1.0387702426791788e-02 1.7655620112014929e-03 9.9557160863800957e-03 7.5664584464343147e-03 -9.8805336272466144e-03 1.8760197467362204e-02 1.4439547465931454e-02 -4.2306018973587703e-03 -1.1157996035332195e-02 -1.0447500424477004e-02 8.8786251937544251e-03 -2.2207839602394933e-02 -8.6890901864422679e-03 1.8541745218109327e-03 7.1581774935000481e-03 9.7140999105093540e-03 -6.5315997391823515e-03 3.0246346898606658e-02 1.2264960662339570e-02 2.5437686751710259e-03 -2.2058181930371457e-02 -1.4460773447503638e-02 1.2915622377200606e-02 -1.1594727386031123e-02 -3.0121762014637250e-02 1.2986876463072956e-02 1.8645173784133384e-02 2.9932749822081132e-03 -8.5045174899493359e-03 1.7045485340725232e-02 1.0996734903922537e-02 -9.1310619585175511e-03 -1.0101103217184056e-02 -3.3183293948121577e-02 1.0664052549167403e-02 -2.0698078808361383e-02 -1.4484420845054646e-02 3.1264072334115686e-03 9.3765774695092341e-03 2.7278133077043187e-02 -1.4546117886438840e-02 1.2264960662339569e-02 5.1305824680812226e-02 -7.5112612879468061e-03 -1.4938287845130868e-02 -1.4784490836172594e-02 -1.1443996320770138e-02 2.1142377536759209e-03 1.2299497584111939e-02 -1.7961087981083472e-02 -1.6785927865260401e-02 -2.7354687079717333e-03 8.5019341211134370e-04 -1.0812771935807859e-02 -1.8140488565019024e-03 1.7743946642576173e-02 1.1618726223755186e-02 9.6766821571609776e-03 -8.0188778565466537e-03 2.2847299686888393e-03 3.9933294857910325e-04 -2.1851540438993559e-02 -9.3083523336519088e-03 -1.3584628167809859e-02 1.5354710715316956e-04 2.5437686751710233e-03 -7.5112612879468053e-03 4.0527815435553144e-02 1.8345589513429201e-02 3.2698943303782818e-03 -8.0361652219215641e-03 8.6808390913150329e-03 1.8081286244077236e-02 -1.7500199588941782e-02 -3.0173710576286043e-02 -3.8092267935829773e-03 4.5305031427245483e-03 -3.6781727492690833e-02 -4.7116183042629194e-03 1.1044983073448924e-02 1.4602399756485385e-02 1.3533612878447390e-02 3.9258362191281568e-03 2.9093269953033216e-02 4.6508874710198111e-03 -1.5008420379240283e-02 -1.7718325711837499e-02 -1.7915151758845230e-02 2.6978732413727997e-03 -2.2058181930371457e-02 -1.4938287845130866e-02 1.8345589513429204e-02 5.4355436910352210e-02 5.1084981082775479e-03 3.3920773898513494e-03 7.4212901623238077e-03 1.6309486358643914e-03 -3.1005424332813014e-03 -4.1550192319323252e-03 -6.5508814790641197e-03 7.6964193608584008e-04 -4.9710455797788459e-03 -8.1368400230364749e-03 9.8400537720393037e-03 1.3315357012444393e-02 9.6045931685072462e-03 6.0637726842097269e-04 4.8838038498633975e-03 3.5517020031137028e-03 -7.4461502021894539e-03 -7.1421108736943375e-03 -1.4046149567714125e-02 -7.3313520613049890e-03 -1.4460773447503636e-02 -1.4784490836172594e-02 3.2698943303782818e-03 5.1084981082775496e-03 2.8731118098501970e-02 309 310 311 372 373 374 1119 1120 1121 324 325 326 312 313 314 375 376 377 1122 1123 1124 327 328 329 8.3675412164250602e+00 3.5111599553785728e+00 7.7809577820793696e-01 -8.7214061471860127e+00 -3.4831459925267199e+00 -4.6885777075784141e-01 -5.5156039773727104e+00 -3.0709629208517426e+00 -2.0954113978554820e-01 5.8279184304144964e+00 2.9975914485155872e+00 7.2435652007333373e-01 5.6731528725987204e+00 3.1436306213536001e+00 3.8370035547607589e-01 -5.9911473814547032e+00 -2.8988349528619657e+00 -7.5842897594131164e-01 -4.1585307525684314e+00 -2.8397228237592089e+00 -6.6158935491422854e-01 4.5180757391435842e+00 2.6402846647518770e+00 2.1226458764158637e-01 3.5111599553785733e+00 7.8100381625253714e+00 7.2124958164364228e-01 -3.4925052551952311e+00 -7.2979063285526777e+00 -3.4612026760171721e-01 -3.0855642805503773e+00 -5.0852997946984884e+00 -1.9623902832525217e-01 2.9816437974162682e+00 4.6294791108258613e+00 5.9230144806613416e-01 3.1522356428922178e+00 5.1412025401867618e+00 3.5101807635421783e-01 -3.2285776387850031e+00 -4.7655746117592663e+00 -6.5544391150617975e-01 -2.8289293934325319e+00 -3.7768603625321191e+00 -6.1603299087270236e-01 2.9905371722760887e+00 3.3449212840045615e+00 1.4926709224186019e-01 7.7809577820793707e-01 7.2124958164364228e-01 4.7270796088321054e+00 -4.7474681979155559e-01 -3.4991349451786630e-01 -4.4915875469837498e+00 -5.0463596792156540e-01 -4.6680979826231211e-01 -2.2230685408334669e+00 7.1809037401476705e-01 5.9123996605485785e-01 2.3518144902650109e+00 3.7918970552567466e-01 3.4391976845733496e-01 2.2513559144774624e+00 -7.8337657333696653e-01 -6.0903432383027989e-01 -2.4327061527986382e+00 -6.4892658307896522e-01 -6.0653532764595897e-01 -1.2677977093770096e+00 5.3631008638067468e-01 3.7588362810058240e-01 1.0849099364182881e+00 -8.7214061471860127e+00 -3.4925052551952303e+00 -4.7474681979155564e-01 9.2539611130359560e+00 3.4082697220124367e+00 8.1004602123739944e-02 5.9531650540120120e+00 3.0515097489349436e+00 3.0009856690546014e-02 -6.3193347268364155e+00 -2.9242016790373344e+00 -5.7235664846306022e-01 -6.1244126611167413e+00 -3.2869486112405100e+00 -2.5091507063157187e-02 6.4361293749532633e+00 2.9944444564988180e+00 4.2968781641201476e-01 4.5362662076510460e+00 2.9849341701879579e+00 5.4137479383406806e-01 -5.0143682145131132e+00 -2.7355025521610812e+00 -9.8820937425994418e-03 -3.4831459925267194e+00 -7.2979063285526786e+00 -3.4991349451786630e-01 3.4082697220124367e+00 6.9675600625166956e+00 6.0657276661491469e-02 3.0602703136146521e+00 4.6757799763424899e+00 2.6287675927855827e-02 -2.9100904373665997e+00 -4.2945392921937486e+00 -4.0580215714998924e-01 -2.9744601127465202e+00 -4.7857321435355082e+00 -1.9736999469541838e-02 3.0064214008996619e+00 4.4221758111343501e+00 3.0913874800190660e-01 2.6552944407763777e+00 3.3879114740366001e+00 3.8522454451618998e-01 -2.7625593346632922e+00 -3.0752495597481988e+00 -5.8555939700492138e-03 -4.6885777075784152e-01 -3.4612026760171716e-01 -4.4915875469837498e+00 8.1004602123739972e-02 6.0657276661491455e-02 4.5180462818285463e+00 5.3539457580297621e-02 4.5684000383515180e-02 2.2217776444813375e+00 -2.6607019376518942e-01 -1.8873389503722057e-01 -2.2336546520158795e+00 -2.8222593735189816e-02 -2.3641922281251823e-02 -2.2716082088005796e+00 4.2945814104059737e-01 3.0645245294042539e-01 2.2692618955341581e+00 2.3705866955344737e-01 1.7123966999677973e-01 1.1171765129310676e+00 -3.7910312039861713e-02 -2.5537315062022274e-02 -1.1294119269749012e+00 -5.5156039773727095e+00 -3.0855642805503773e+00 -5.0463596792156529e-01 5.9531650540120120e+00 3.0602703136146521e+00 5.3539457580297614e-02 8.0644377008478720e+00 3.3638634209493814e+00 3.5885877003755409e-02 -8.3485795953385864e+00 -3.2928954296780475e+00 -3.7909683221169749e-01 -4.2748831294534329e+00 -2.8858680558258749e+00 -2.4787697404979922e-02 4.5493936411406430e+00 2.6606354847529947e+00 4.8504288196160628e-01 5.3948406451032414e+00 2.9446300263988214e+00 3.2858090636184112e-01 -5.8227703389390442e+00 -2.7650714796615512e+00 5.4713746307391538e-03 -3.0709629208517426e+00 -5.0852997946984884e+00 -4.6680979826231211e-01 3.0515097489349436e+00 4.6757799763424899e+00 4.5684000383515166e-02 3.3638634209493823e+00 7.4696078499687610e+00 3.1230591948370329e-02 -3.2622518556546867e+00 -7.0036560719057253e+00 -3.4208084970647457e-01 -2.9133180944924493e+00 -3.7960812824889834e+00 -2.4026080594139486e-02 2.9774789108240229e+00 3.3878385332190080e+00 4.5113440620169576e-01 2.9564977663780883e+00 4.9162935814838260e+00 3.0257724948084841e-01 -3.1028169760875617e+00 -4.5644827919208879e+00 2.2904805484936243e-03 -2.0954113978554822e-01 -1.9623902832525222e-01 -2.2230685408334669e+00 3.0009856690546028e-02 2.6287675927855823e-02 2.2217776444813375e+00 3.5885877003755458e-02 3.1230591948370329e-02 4.3918304260264653e+00 -4.1403481188239716e-01 -3.7369874201984982e-01 -4.3594643313787733e+00 -4.9140624572155808e-03 -5.5715232782487384e-03 -1.1253773332565364e+00 1.8980899429538922e-01 1.7612993590578854e-01 1.1133622234471117e+00 3.6838881767909920e-01 3.3612220411439303e-01 2.1926327341180381e+00 4.3964684563710327e-03 5.7388857269430171e-03 -2.2116928226041770e+00 5.8279184304144973e+00 2.9816437974162682e+00 7.1809037401476716e-01 -6.3193347268364146e+00 -2.9100904373666001e+00 -2.6607019376518942e-01 -8.3485795953385846e+00 -3.2622518556546853e+00 -4.1403481188239716e-01 8.7904802043598327e+00 3.1481450946336493e+00 8.1905018816463382e-01 4.5250063120998982e+00 2.9591705490745106e+00 2.1133182624262714e-01 -4.8850511179992910e+00 -2.6933284305854666e+00 -7.3649640902169666e-01 -5.6868999056759373e+00 -3.0241074791937530e+00 -7.4537213222787191e-01 6.0964603989760056e+00 2.8008187616760774e+00 4.1350115847513058e-01 2.9975914485155872e+00 4.6294791108258622e+00 5.9123996605485785e-01 -2.9242016790373344e+00 -4.2945392921937486e+00 -1.8873389503722060e-01 -3.2928954296780475e+00 -7.0036560719057261e+00 -3.7369874201984971e-01 3.1481450946336493e+00 6.7293179993510872e+00 5.9187829202011288e-01 2.6632107941938035e+00 3.3481832635220101e+00 1.9296237590637194e-01 -2.6909896648620704e+00 -3.0584015306903125e+00 -5.2864912323927493e-01 -2.7104198659199907e+00 -4.5452841510399900e+00 -5.7988303779754424e-01 2.8095593021544061e+00 4.1949006721308191e+00 2.9488416411254947e-01 7.2435652007333373e-01 5.9230144806613416e-01 2.3518144902650109e+00 -5.7235664846306022e-01 -4.0580215714998924e-01 -2.2336546520158795e+00 -3.7909683221169749e-01 -3.4208084970647468e-01 -4.3594643313787733e+00 8.1905018816463393e-01 5.9187829202011288e-01 4.6030114914392346e+00 4.8831972470336726e-01 4.4798132387922451e-01 1.0906411587591636e+00 -7.3239419672963590e-01 -5.2614829496945559e-01 -1.2719534973373112e+00 -7.1165918894000857e-01 -6.1535641852354561e-01 -2.3622100471651906e+00 3.6378043340306815e-01 2.5722665638399339e-01 2.1818153874337463e+00 5.6731528725987195e+00 3.1522356428922178e+00 3.7918970552567477e-01 -6.1244126611167404e+00 -2.9744601127465202e+00 -2.8222593735189851e-02 -4.2748831294534329e+00 -2.9133180944924493e+00 -4.9140624572155669e-03 4.5250063120998991e+00 2.6632107941938035e+00 4.8831972470336726e-01 8.5461305253673405e+00 3.5414140301870884e+00 6.8819050359518574e-02 -8.7791001042718140e+00 -3.4517661929716494e+00 -4.2947018371689583e-01 -5.5138877593566313e+00 -3.0420532364542527e+00 -5.0428652313062161e-01 5.9479939441326639e+00 3.0247371693917633e+00 3.0564882451365592e-02 3.1436306213536001e+00 5.1412025401867618e+00 3.4391976845733502e-01 -3.2869486112405100e+00 -4.7857321435355074e+00 -2.3641922281251820e-02 -2.8858680558258758e+00 -3.7960812824889834e+00 -5.5715232782487349e-03 2.9591705490745106e+00 3.3481832635220101e+00 4.4798132387922462e-01 3.5414140301870884e+00 7.8602766506458659e+00 6.0143206434815667e-02 -3.4353255986746465e+00 -7.3345537236473550e+00 -3.8162434683032082e-01 -3.0196187547892670e+00 -5.0717366264855919e+00 -4.6443067045920111e-01 2.9835458199151037e+00 4.6384413218027998e+00 2.3224164077650322e-02 3.8370035547607589e-01 3.5101807635421789e-01 2.2513559144774624e+00 -2.5091507063157201e-02 -1.9736999469541834e-02 -2.2716082088005796e+00 -2.4787697404979957e-02 -2.4026080594139489e-02 -1.1253773332565364e+00 2.1133182624262720e-01 1.9296237590637197e-01 1.0906411587591636e+00 6.8819050359518574e-02 6.0143206434815653e-02 4.6476486166725248e+00 -4.3906458475791715e-01 -3.9112237260595845e-01 -4.5736063928304809e+00 -2.2936601379541025e-01 -2.1231097517597192e-01 -2.2670216196283794e+00 5.4458570943243051e-02 4.3072769150206115e-02 2.2479678646068280e+00 -5.9911473814547032e+00 -3.2285776387850040e+00 -7.8337657333696653e-01 6.4361293749532633e+00 3.0064214008996619e+00 4.2945814104059737e-01 4.5493936411406439e+00 2.9774789108240221e+00 1.8980899429538919e-01 -4.8850511179992910e+00 -2.6909896648620704e+00 -7.3239419672963602e-01 -8.7791001042718140e+00 -3.4353255986746465e+00 -4.3906458475791732e-01 9.1605401191217606e+00 3.3033587911132929e+00 8.5986409012472276e-01 5.8284687172705718e+00 2.9314219997923598e+00 7.1478202675780167e-01 -6.3192332487604359e+00 -2.8637882003076158e+00 -2.3907789739399476e-01 -2.8988349528619652e+00 -4.7655746117592663e+00 -6.0903432383027989e-01 2.9944444564988171e+00 4.4221758111343501e+00 3.0645245294042539e-01 2.6606354847529947e+00 3.3878385332190080e+00 1.7612993590578851e-01 -2.6933284305854666e+00 -3.0584015306903125e+00 -5.2614829496945559e-01 -3.4517661929716494e+00 -7.3345537236473550e+00 -3.9112237260595839e-01 3.3033587911132929e+00 6.9922073001938863e+00 6.2092268166089148e-01 2.9653227932589719e+00 4.6494550133975308e+00 5.8919476696287010e-01 -2.8798319492049989e+00 -4.2931467918478425e+00 -1.6639484606428412e-01 -7.5842897594131164e-01 -6.5544391150617975e-01 -2.4327061527986382e+00 4.2968781641201476e-01 3.0913874800190666e-01 2.2692618955341581e+00 4.8504288196160622e-01 4.5113440620169587e-01 1.1133622234471117e+00 -7.3649640902169666e-01 -5.2864912323927493e-01 -1.2719534973373112e+00 -4.2947018371689588e-01 -3.8162434683032082e-01 -4.5736063928304809e+00 8.5986409012472276e-01 6.2092268166089148e-01 4.7625871155073876e+00 7.1324036481572539e-01 5.8191440819896489e-01 2.4036115173063504e+00 -5.6343958463416577e-01 -3.9739286248768341e-01 -2.2705567088285790e+00 -4.1585307525684314e+00 -2.8289293934325324e+00 -6.4892658307896522e-01 4.5362662076510460e+00 2.6552944407763781e+00 2.3705866955344737e-01 5.3948406451032405e+00 2.9564977663780883e+00 3.6838881767909920e-01 -5.6868999056759382e+00 -2.7104198659199907e+00 -7.1165918894000857e-01 -5.5138877593566313e+00 -3.0196187547892666e+00 -2.2936601379541022e-01 5.8284687172705727e+00 2.9653227932589719e+00 7.1324036481572539e-01 7.9878334829838860e+00 3.2543258875936876e+00 7.2782697473123170e-01 -8.3880906354077496e+00 -3.2724728738653366e+00 -4.5656304096512279e-01 -2.8397228237592085e+00 -3.7768603625321191e+00 -6.0653532764595897e-01 2.9849341701879579e+00 3.3879114740366001e+00 1.7123966999677975e-01 2.9446300263988214e+00 4.9162935814838260e+00 3.3612220411439309e-01 -3.0241074791937530e+00 -4.5452841510399900e+00 -6.1535641852354561e-01 -3.0420532364542527e+00 -5.0717366264855919e+00 -2.1231097517597189e-01 2.9314219997923594e+00 4.6494550133975308e+00 5.8191440819896489e-01 3.2543258875936871e+00 7.4777247912227329e+00 6.7541673998962071e-01 -3.2094285445656139e+00 -7.0375037200829915e+00 -3.3049030095428489e-01 -6.6158935491422854e-01 -6.1603299087270236e-01 -1.2677977093770096e+00 5.4137479383406806e-01 3.8522454451618998e-01 1.1171765129310676e+00 3.2858090636184123e-01 3.0257724948084841e-01 2.1926327341180381e+00 -7.4537213222787180e-01 -5.7988303779754435e-01 -2.3622100471651910e+00 -5.0428652313062172e-01 -4.6443067045920111e-01 -2.2670216196283794e+00 7.1478202675780167e-01 5.8919476696287010e-01 2.4036115173063504e+00 7.2782697473123181e-01 6.7541673998962060e-01 4.6207102316190740e+00 -4.0131669141222104e-01 -2.9206660182008126e-01 -4.4371016198039515e+00 4.5180757391435842e+00 2.9905371722760887e+00 5.3631008638067468e-01 -5.0143682145131132e+00 -2.7625593346632931e+00 -3.7910312039861734e-02 -5.8227703389390442e+00 -3.1028169760875617e+00 4.3964684563710327e-03 6.0964603989760056e+00 2.8095593021544065e+00 3.6378043340306809e-01 5.9479939441326657e+00 2.9835458199151041e+00 5.4458570943243065e-02 -6.3192332487604368e+00 -2.8798319492049989e+00 -5.6343958463416577e-01 -8.3880906354077496e+00 -3.2094285445656134e+00 -4.0131669141222109e-01 8.9819323553680910e+00 3.1709945101758685e+00 4.3721028902895274e-02 2.6402846647518770e+00 3.3449212840045610e+00 3.7588362810058240e-01 -2.7355025521610816e+00 -3.0752495597481988e+00 -2.5537315062022271e-02 -2.7650714796615508e+00 -4.5644827919208870e+00 5.7388857269430032e-03 2.8008187616760774e+00 4.1949006721308191e+00 2.5722665638399339e-01 3.0247371693917633e+00 4.6384413218027998e+00 4.3072769150206122e-02 -2.8637882003076154e+00 -4.2931467918478425e+00 -3.9739286248768341e-01 -3.2724728738653366e+00 -7.0375037200829906e+00 -2.9206660182008132e-01 3.1709945101758685e+00 6.7921195856617400e+00 3.3074840008064550e-02 2.1226458764158637e-01 1.4926709224186022e-01 1.0849099364182881e+00 -9.8820937425994348e-03 -5.8555939700492138e-03 -1.1294119269749012e+00 5.4713746307391538e-03 2.2904805484935823e-03 -2.2116928226041770e+00 4.1350115847513058e-01 2.9488416411254958e-01 2.1818153874337467e+00 3.0564882451365596e-02 2.3224164077650315e-02 2.2479678646068280e+00 -2.3907789739399476e-01 -1.6639484606428412e-01 -2.2705567088285790e+00 -4.5656304096512268e-01 -3.3049030095428489e-01 -4.4371016198039506e+00 4.3721028902895247e-02 3.3074840008064509e-02 4.5340698897527458e+00 372 373 374 420 421 422 1146 1147 1148 1119 1120 1121 375 376 377 423 424 425 1149 1150 1151 1122 1123 1124 8.1569839935454276e+00 3.4417617982900137e+00 7.7508975226597543e-01 -8.5085233417875745e+00 -3.4147975582821717e+00 -4.5575645908076728e-01 -5.4543383228459650e+00 -3.0280004554860289e+00 -2.0658909392739358e-01 5.7614026058982732e+00 2.9528911743635784e+00 7.2029059002120777e-01 5.4903572695427458e+00 3.0821273759172398e+00 3.6854405939125379e-01 -5.8073996965216370e+00 -2.8279983108435562e+00 -7.5437522580541039e-01 -4.0736952652006275e+00 -2.7936713505360289e+00 -6.5551355117805754e-01 4.4352127573693600e+00 2.5876873265769533e+00 2.0830992831319370e-01 3.4417617982900137e+00 7.6355661736612070e+00 7.2116138098643257e-01 -3.4217554357841693e+00 -7.1137572603837720e+00 -3.3350993231326170e-01 -3.0366710691888992e+00 -5.0515414198373367e+00 -1.9350750040806755e-01 2.9271947037920354e+00 4.5850994106151486e+00 5.8791295681159306e-01 3.0878289460560184e+00 4.9941371089984461e+00 3.3856452672270893e-01 -3.1647262722139131e+00 -4.6069825338439596e+00 -6.5309275285827839e-01 -2.7755318910787574e+00 -3.7232467458796075e+00 -6.1218762735604981e-01 2.9418992201276746e+00 3.2807252666698741e+00 1.4465894841492455e-01 7.7508975226597543e-01 7.2116138098643257e-01 4.6080192727322986e+00 -4.7208734706900546e-01 -3.4606574818677588e-01 -4.3622983725934823e+00 -5.0173336259872325e-01 -4.6609404227910822e-01 -2.2211948479228467e+00 7.1829587281044649e-01 5.9225856759753248e-01 2.3499416515549618e+00 3.7736467953521702e-01 3.4371422393126899e-01 2.1475730025753554e+00 -7.8352024520386088e-01 -6.0794447503297844e-01 -2.3336674342852577e+00 -6.4863304001454125e-01 -6.0967102341025514e-01 -1.2509352069009243e+00 5.3522369027449279e-01 3.7264111639388375e-01 1.0625619348398967e+00 -8.5085233417875745e+00 -3.4217554357841693e+00 -4.7208734706900557e-01 9.0460230487574105e+00 3.3365568226449467e+00 6.4309690182276238e-02 5.8950511377718859e+00 3.0006735242342866e+00 2.3123538018748752e-02 -6.2573918789125322e+00 -2.8696431885695537e+00 -5.6466949697395363e-01 -5.9446347135599158e+00 -3.2283101335835811e+00 -1.1867054152848652e-02 6.2545343362906252e+00 2.9242299738182211e+00 4.2950633353991374e-01 4.4525203960232602e+00 2.9380858693310676e+00 5.3509175203385895e-01 -4.9375789845831646e+00 -2.6798374320912175e+00 -3.4074155789919494e-03 -3.4147975582821717e+00 -7.1137572603837720e+00 -3.4606574818677593e-01 3.3365568226449471e+00 6.7814738508375632e+00 4.8530057041894129e-02 3.0186043077330496e+00 4.6347203794730785e+00 2.0402488651845872e-02 -2.8614574368323611e+00 -4.2461545459321517e+00 -3.9889820166053314e-01 -2.9076141139698661e+00 -4.6350512645667603e+00 -9.3002298063156359e-03 2.9384093160559606e+00 4.2610121034263040e+00 3.0808005990999604e-01 2.6034283578218602e+00 3.3282024458750961e+00 3.7846576120079611e-01 -2.7131296951714212e+00 -3.0104457087293577e+00 -1.2141871509087966e-03 -4.5575645908076734e-01 -3.3350993231326170e-01 -4.3622983725934814e+00 6.4309690182276308e-02 4.8530057041894122e-02 4.3922603383440029e+00 4.0649765516867047e-02 3.4742534073278313e-02 2.2201508697391557e+00 -2.5650660097852879e-01 -1.8103883663599263e-01 -2.2270710001748282e+00 -1.1580146889644712e-02 -9.9870816425226064e-03 -2.1715120644548840e+00 4.1433852476070915e-01 2.9422918626937272e-01 2.1636932638141904e+00 2.2750340821480589e-01 1.6187702638272283e-01 1.0948187184296370e+00 -2.2958181725717657e-02 -1.4842953175491086e-02 -1.1100417531037905e+00 -5.4543383228459650e+00 -3.0366710691888987e+00 -5.0173336259872325e-01 5.8950511377718859e+00 3.0186043077330491e+00 4.0649765516867047e-02 8.1500579408471481e+00 3.3404713306052503e+00 3.0546073044398565e-02 -8.4293916850604518e+00 -3.2734643663675520e+00 -3.6653187656846536e-01 -4.1954826963261116e+00 -2.8396645482403859e+00 -1.3184582327076085e-02 4.4689270677352475e+00 2.6083447226261587e+00 4.8287439662325782e-01 5.3650796670401419e+00 2.9069549133442005e+00 3.1673596953715011e-01 -5.7999031091618987e+00 -2.7245752905118206e+00 1.0643616772589497e-02 -3.0280004554860285e+00 -5.0515414198373367e+00 -4.6609404227910811e-01 3.0006735242342870e+00 4.6347203794730785e+00 3.4742534073278313e-02 3.3404713306052503e+00 7.5744024102167371e+00 2.6134035046095370e-02 -3.2270441166110553e+00 -7.0954896200908406e+00 -3.3193206505188760e-01 -2.8669634626183464e+00 -3.7457452598339240e+00 -1.3388692071740068e-02 2.9282456589432413e+00 3.3242794422262247e+00 4.5107354587796611e-01 2.9153749840525420e+00 4.9138338390014695e+00 2.9236372650607290e-01 -3.0627574631198926e+00 -4.5544597711554067e+00 7.1009578993215293e-03 -2.0658909392739358e-01 -1.9350750040806750e-01 -2.2211948479228467e+00 2.3123538018748752e-02 2.0402488651845858e-02 2.2201508697391557e+00 3.0546073044398544e-02 2.6134035046095315e-02 4.5111387607571016e+00 -4.2037815834217013e-01 -3.8059913182286764e-01 -4.4732726487916601e+00 2.6875354106436818e-03 1.3676569649439954e-03 -1.1077228030107429e+00 1.8508995994929345e-01 1.7340847542475393e-01 1.0923040786293328e+00 3.7177579633179525e-01 3.4007139028738786e-01 2.2153348895565004e+00 1.3744349514684083e-02 1.2722585855908297e-02 -2.2367382989568414e+00 5.7614026058982741e+00 2.9271947037920358e+00 7.1829587281044649e-01 -6.2573918789125331e+00 -2.8614574368323611e+00 -2.5650660097852879e-01 -8.4293916850604500e+00 -3.2270441166110553e+00 -4.2037815834217013e-01 8.8723826067978280e+00 3.1156679047937601e+00 8.1914105035921092e-01 4.4399219434104067e+00 2.9113546854523866e+00 1.9988545725755386e-01 -4.8018931270579053e+00 -2.6378366194144074e+00 -7.3670185438403635e-01 -5.6535749582719967e+00 -2.9817921010524038e+00 -7.4115092379188541e-01 6.0685444931963808e+00 2.7539129798720441e+00 4.1741515706941118e-01 2.9528911743635784e+00 4.5850994106151486e+00 5.9225856759753248e-01 -2.8696431885695546e+00 -4.2461545459321517e+00 -1.8103883663599263e-01 -3.2734643663675520e+00 -7.0954896200908415e+00 -3.8059913182286764e-01 3.1156679047937597e+00 6.8169495937819855e+00 5.9027585863178300e-01 2.6116071966103260e+00 3.2875133255706812e+00 1.8532834645770774e-01 -2.6352755414725006e+00 -2.9906188536120055e+00 -5.2670830601003793e-01 -2.6671766002706745e+00 -4.5341737024606736e+00 -5.7617907958735448e-01 2.7653934209126212e+00 4.1768743921278553e+00 2.9666258136923118e-01 7.2029059002120777e-01 5.8791295681159306e-01 2.3499416515549618e+00 -5.6466949697395363e-01 -3.9889820166053319e-01 -2.2270710001748286e+00 -3.6653187656846548e-01 -3.3193206505188771e-01 -4.4732726487916592e+00 8.1914105035921103e-01 5.9027585863178300e-01 4.7208103369455623e+00 4.8026563173873060e-01 4.4338297937598881e-01 1.0671718545903635e+00 -7.2857562417103061e-01 -5.2138419238653166e-01 -1.2532917245116573e+00 -7.1021695065846535e-01 -6.1544303654597110e-01 -2.3861231971056518e+00 3.5029667625276600e-01 2.4608570082555883e-01 2.2018347274929102e+00 5.4903572695427458e+00 3.0878289460560180e+00 3.7736467953521702e-01 -5.9446347135599158e+00 -2.9076141139698661e+00 -1.1580146889644666e-02 -4.1954826963261116e+00 -2.8669634626183464e+00 2.6875354106436645e-03 4.4399219434104076e+00 2.6116071966103256e+00 4.8026563173873049e-01 8.1572269873192287e+00 3.4526220189532522e+00 5.1412825987799927e-02 -8.3836097948335482e+00 -3.3513699310389615e+00 -4.2556513957670139e-01 -5.3649436122179832e+00 -2.9899877884714274e+00 -4.9696819878177900e-01 5.8011646166651820e+00 2.9638771344790049e+00 2.2382812575735725e-02 3.0821273759172398e+00 4.9941371089984461e+00 3.4371422393126899e-01 -3.2283101335835802e+00 -4.6350512645667612e+00 -9.9870816425226064e-03 -2.8396645482403859e+00 -3.7457452598339236e+00 1.3676569649439920e-03 2.9113546854523866e+00 3.2875133255706812e+00 4.4338297937598881e-01 3.4526220189532517e+00 7.5209868041565704e+00 4.4673751738648335e-02 -3.3492610146605450e+00 -6.9782345437127535e+00 -3.8126144642113896e-01 -2.9597033218034938e+00 -4.9599715015372139e+00 -4.5910604569212199e-01 2.9308349379651304e+00 4.5163653309249554e+00 1.7215961744935102e-02 3.6854405939125390e-01 3.3856452672270887e-01 2.1475730025753559e+00 -1.1867054152848666e-02 -9.3002298063156377e-03 -2.1715120644548840e+00 -1.3184582327076082e-02 -1.3388692071740082e-02 -1.1077228030107427e+00 1.9988545725755388e-01 1.8532834645770774e-01 1.0671718545903635e+00 5.1412825987799962e-02 4.4673751738648342e-02 4.3738307748104148e+00 -4.1785233582837361e-01 -3.7516167438690662e-01 -4.2908860996423464e+00 -2.1709740774634048e-01 -2.0245096638850907e-01 -2.1912924883274947e+00 4.0159037418031292e-02 3.1734937734406388e-02 2.1728378234593335e+00 -5.8073996965216370e+00 -3.1647262722139140e+00 -7.8352024520386088e-01 6.2545343362906252e+00 2.9384093160559606e+00 4.1433852476070915e-01 4.4689270677352475e+00 2.9282456589432413e+00 1.8508995994929348e-01 -4.8018931270579053e+00 -2.6352755414725006e+00 -7.2857562417103072e-01 -8.3836097948335482e+00 -3.3492610146605450e+00 -4.1785233582837367e-01 8.7644519146656226e+00 3.2037562110253068e+00 8.5460046750757379e-01 5.6777890063007170e+00 2.8756917941408688e+00 7.0851160204230035e-01 -6.1727997065791271e+00 -2.7968401518184187e+00 -2.3259234905661363e-01 -2.8279983108435562e+00 -4.6069825338439596e+00 -6.0794447503297855e-01 2.9242299738182211e+00 4.2610121034263040e+00 2.9422918626937272e-01 2.6083447226261587e+00 3.3242794422262238e+00 1.7340847542475391e-01 -2.6378366194144069e+00 -2.9906188536120055e+00 -5.2138419238653166e-01 -3.3513699310389620e+00 -6.9782345437127535e+00 -3.7516167438690673e-01 3.2037562110253068e+00 6.6285070847034131e+00 6.1419327091541154e-01 2.9009188998000091e+00 4.5238271158429821e+00 5.8379182090016257e-01 -2.8200449459727741e+00 -4.1617898150302040e+00 -1.6113241170328521e-01 -7.5437522580541028e-01 -6.5309275285827828e-01 -2.3336674342852577e+00 4.2950633353991363e-01 3.0808005990999598e-01 2.1636932638141904e+00 4.8287439662325782e-01 4.5107354587796611e-01 1.0923040786293328e+00 -7.3670185438403635e-01 -5.2670830601003804e-01 -1.2532917245116573e+00 -4.2556513957670139e-01 -3.8126144642113891e-01 -4.2908860996423464e+00 8.5460046750757357e-01 6.1419327091541132e-01 4.4846073324594702e+00 7.1177671824857447e-01 5.8199598439043942e-01 2.3297736749329712e+00 -5.6211569615317236e-01 -3.9428035580435766e-01 -2.1925330913967036e+00 -4.0736952652006275e+00 -2.7755318910787574e+00 -6.4863304001454125e-01 4.4525203960232602e+00 2.6034283578218593e+00 2.2750340821480591e-01 5.3650796670401419e+00 2.9153749840525420e+00 3.7177579633179525e-01 -5.6535749582719967e+00 -2.6671766002706749e+00 -7.1021695065846524e-01 -5.3649436122179832e+00 -2.9597033218034943e+00 -2.1709740774634051e-01 5.6777890063007170e+00 2.9009188998000095e+00 7.1177671824857447e-01 7.9016112941387107e+00 3.2065753748648835e+00 7.2319501441762224e-01 -8.3047865278122259e+00 -3.2238858033863687e+00 -4.5830353879345254e-01 -2.7936713505360284e+00 -3.7232467458796075e+00 -6.0967102341025525e-01 2.9380858693310676e+00 3.3282024458750961e+00 1.6187702638272286e-01 2.9069549133442010e+00 4.9138338390014695e+00 3.4007139028738781e-01 -2.9817921010524033e+00 -4.5341737024606728e+00 -6.1544303654597110e-01 -2.9899877884714279e+00 -4.9599715015372139e+00 -2.0245096638850901e-01 2.8756917941408684e+00 4.5238271158429821e+00 5.8199598439043954e-01 3.2065753748648835e+00 7.4269255956929783e+00 6.7419803731870465e-01 -3.1618567116211636e+00 -6.9753970465350292e+00 -3.3057741203452107e-01 -6.5551355117805754e-01 -6.1218762735604981e-01 -1.2509352069009243e+00 5.3509175203385895e-01 3.7846576120079611e-01 1.0948187184296367e+00 3.1673596953715011e-01 2.9236372650607295e-01 2.2153348895565004e+00 -7.4115092379188519e-01 -5.7617907958735448e-01 -2.3861231971056518e+00 -4.9696819878177900e-01 -4.5910604569212199e-01 -2.1912924883274947e+00 7.0851160204230035e-01 5.8379182090016257e-01 2.3297736749329712e+00 7.2319501441762224e-01 6.7419803731870465e-01 4.6019199819140537e+00 -3.8990166427921003e-01 -2.8134659329020983e-01 -4.4134963724990923e+00 4.4352127573693600e+00 2.9418992201276746e+00 5.3522369027449279e-01 -4.9375789845831655e+00 -2.7131296951714212e+00 -2.2958181725717654e-02 -5.7999031091618987e+00 -3.0627574631198926e+00 1.3744349514684097e-02 6.0685444931963808e+00 2.7653934209126212e+00 3.5029667625276600e-01 5.8011646166651820e+00 2.9308349379651299e+00 4.0159037418031306e-02 -6.1727997065791271e+00 -2.8200449459727746e+00 -5.6211569615317247e-01 -8.3047865278122259e+00 -3.1618567116211631e+00 -3.8990166427921014e-01 8.9101464609054979e+00 3.1196612368798253e+00 3.5551788698128056e-02 2.5876873265769533e+00 3.2807252666698741e+00 3.7264111639388375e-01 -2.6798374320912179e+00 -3.0104457087293577e+00 -1.4842953175491076e-02 -2.7245752905118206e+00 -4.5544597711554067e+00 1.2722585855908339e-02 2.7539129798720441e+00 4.1768743921278553e+00 2.4608570082555878e-01 2.9638771344790049e+00 4.5163653309249563e+00 3.1734937734406395e-02 -2.7968401518184187e+00 -4.1617898150302040e+00 -3.9428035580435772e-01 -3.2238858033863682e+00 -6.9753970465350292e+00 -2.8134659329020978e-01 3.1196612368798258e+00 6.7281273517273155e+00 2.7285561460302726e-02 2.0830992831319373e-01 1.4465894841492455e-01 1.0625619348398967e+00 -3.4074155789919390e-03 -1.2141871509087931e-03 -1.1100417531037903e+00 1.0643616772589525e-02 7.1009578993215154e-03 -2.2367382989568418e+00 4.1741515706941118e-01 2.9666258136923118e-01 2.2018347274929102e+00 2.2382812575735725e-02 1.7215961744935095e-02 2.1728378234593335e+00 -2.3259234905661361e-01 -1.6113241170328521e-01 -2.1925330913967032e+00 -4.5830353879345254e-01 -3.3057741203452107e-01 -4.4134963724990923e+00 3.5551788698128008e-02 2.7285561460302723e-02 4.5155750301642872e+00 312 313 314 375 376 377 1122 1123 1124 327 328 329 315 316 317 378 379 380 1125 1126 1127 330 331 332 7.8650834837771164e+00 3.2278188445553826e+00 1.5064133051176012e+00 -8.3163184362684266e+00 -3.2647485711887563e+00 -1.3081160499563502e+00 -5.2129232922056259e+00 -2.8544807471719373e+00 -8.7643999627878266e-01 5.3982219159839451e+00 2.7435493723407931e+00 1.3640255747656147e+00 5.3437158278442380e+00 2.9104105680392758e+00 1.0839636231895717e+00 -5.5283672780285666e+00 -2.6108779050348194e+00 -1.4112384458827398e+00 -3.7655012289690410e+00 -2.5576409336720922e+00 -1.2061141159307873e+00 4.2160890078663646e+00 2.4059693721321542e+00 8.4750610497587120e-01 3.2278188445553826e+00 7.5484367463974404e+00 1.4370719386791417e+00 -3.2880965112064673e+00 -7.0529202978934098e+00 -1.0423465880351148e+00 -2.9120989309241807e+00 -4.8940001626698324e+00 -8.3531212454228032e-01 2.7392549215980311e+00 4.4254633146339319e+00 1.1415257071258400e+00 2.9407912547102155e+00 4.9113165013193560e+00 1.0033022680428325e+00 -2.9551846739370151e+00 -4.5208215644109018e+00 -1.2517820305515861e+00 -2.5674576278738783e+00 -3.5610050513421463e+00 -1.1595034044782739e+00 2.8149727230779140e+00 3.1435305139655623e+00 7.0704423375944003e-01 1.5064133051176012e+00 1.4370719386791422e+00 5.1455657699244304e+00 -1.3269865553576836e+00 -1.0502283755508759e+00 -4.7749651353643729e+00 -1.1879245613928688e+00 -1.1049920571345395e+00 -2.4821871880732291e+00 1.3801092328576710e+00 1.1582371664125419e+00 2.7359497385996518e+00 1.0873648350075502e+00 9.9383685839147751e-01 2.5280664492605975e+00 -1.4716049518874963e+00 -1.1567059890006046e+00 -2.8446345611344688e+00 -1.2125748276022583e+00 -1.1612739193115782e+00 -1.6463222247958234e+00 1.2252035232574858e+00 8.8405437751443716e-01 1.3385271515832124e+00 -8.3163184362684266e+00 -3.2880965112064677e+00 -1.3269865553576836e+00 8.9877011622137388e+00 3.2540396377797371e+00 1.0253736586454392e+00 5.7565816228095397e+00 2.9156556030265115e+00 7.7947658122322816e-01 -5.9900341874735235e+00 -2.7444076655625240e+00 -1.3158753434598831e+00 -5.9129308052248186e+00 -3.1116567939135589e+00 -8.3747252452344823e-01 6.0888653295839852e+00 2.7579748499022281e+00 1.2173223149597854e+00 4.2233053761586437e+00 2.7722368890464231e+00 1.1977807886323759e+00 -4.8371700617991396e+00 -2.5557460090723487e+00 -7.3961892011981201e-01 -3.2647485711887567e+00 -7.0529202978934098e+00 -1.0502283755508759e+00 3.2540396377797376e+00 6.7414088661548321e+00 7.3397920941730455e-01 2.9230814938048209e+00 4.5002349748719803e+00 6.3410939590948578e-01 -2.7048854141757341e+00 -4.1101040025592219e+00 -9.2686029432470973e-01 -2.8296094062612998e+00 -4.5751087100071812e+00 -6.4017505048925705e-01 2.8000617197214099e+00 4.2040816451498353e+00 8.7682719266970022e-01 2.4466588976792361e+00 3.1930440467097667e+00 8.9095109170175579e-01 -2.6245983573594152e+00 -2.9006365224266015e+00 -5.1860316933340256e-01 -1.3081160499563507e+00 -1.0423465880351148e+00 -4.7749651353643712e+00 1.0253736586454389e+00 7.3397920941730455e-01 4.6531226959236545e+00 8.2878775766043777e-01 6.7324087158741353e-01 2.3515820872967654e+00 -1.0424799759697287e+00 -7.4667154160314120e-01 -2.5055749958789582e+00 -8.1350953580257135e-01 -6.8015324103847641e-01 -2.4001305641561728e+00 1.2186177738513488e+00 8.6298186544734801e-01 2.5550169218163838e+00 8.9754338213074669e-01 7.4954362044354572e-01 1.3841215151965411e+00 -8.0621701055932227e-01 -5.5057419621887960e-01 -1.2631725248338421e+00 -5.2129232922056268e+00 -2.9120989309241803e+00 -1.1879245613928688e+00 5.7565816228095388e+00 2.9230814938048209e+00 8.2878775766043766e-01 7.7936413232386377e+00 3.2040859001979296e+00 8.0076777370319940e-01 -7.9505399579333682e+00 -3.0632059050534770e+00 -1.1414603225211957e+00 -4.0997320060911191e+00 -2.7232036748434059e+00 -7.0138298754355566e-01 4.2655728733501279e+00 2.4575671017928928e+00 1.1392043296506320e+00 5.0603908421053205e+00 2.7000752165700090e+00 9.5359190851537223e-01 -5.6129914052735135e+00 -2.5863012015445888e+00 -6.9158389807201937e-01 -2.8544807471719378e+00 -4.8940001626698324e+00 -1.1049920571345397e+00 2.9156556030265115e+00 4.5002349748719803e+00 6.7324087158741364e-01 3.2040859001979305e+00 7.2138196417425764e+00 7.3079661202138735e-01 -3.0414329007210390e+00 -6.7362509082612432e+00 -9.6416058814647509e-01 -2.7688399853232273e+00 -3.6081894509617851e+00 -6.4759291550291476e-01 2.7533940177087368e+00 3.1921069777563202e+00 1.0145271428240199e+00 2.7389165430602529e+00 4.6684268649465599e+00 8.8885524429249152e-01 -2.9472984307772281e+00 -4.3361479374245739e+00 -5.9067430994138148e-01 -8.7643999627878277e-01 -8.3531212454228032e-01 -2.4821871880732291e+00 7.7947658122322805e-01 6.3410939590948578e-01 2.3515820872967654e+00 8.0076777370319940e-01 7.3079661202138735e-01 4.4705480289136768e+00 -1.1704746345855273e+00 -9.9463206262018056e-01 -4.5837623735769508e+00 -6.6691342938091469e-01 -6.0563953491324463e-01 -1.2522910016227347e+00 8.6372534510580046e-01 6.9285000273867503e-01 1.3756332752255316e+00 1.0009594945465656e+00 9.1774542182796837e-01 2.4232377356941250e+00 -7.3110113433356905e-01 -5.3991771042181103e-01 -2.3027605638571842e+00 5.3982219159839451e+00 2.7392549215980311e+00 1.3801092328576714e+00 -5.9900341874735235e+00 -2.7048854141757341e+00 -1.0424799759697287e+00 -7.9505399579333673e+00 -3.0414329007210390e+00 -1.1704746345855277e+00 8.2371681027370425e+00 2.8718952922615291e+00 1.5457609920144819e+00 4.2356651727198678e+00 2.7135277216692004e+00 9.0215162673516958e-01 -4.4600335273495499e+00 -2.4214004853296691e+00 -1.3802095973342730e+00 -5.2156683705109410e+00 -2.7196038337334256e+00 -1.3493787052430852e+00 5.7452208518265309e+00 2.5626446984311064e+00 1.1145210615252910e+00 2.7435493723407922e+00 4.4254633146339319e+00 1.1582371664125417e+00 -2.7444076655625236e+00 -4.1101040025592219e+00 -7.4667154160314120e-01 -3.0632059050534779e+00 -6.7362509082612441e+00 -9.9463206262018056e-01 2.8718952922615291e+00 6.4457728646597694e+00 1.1353478028490507e+00 2.4792992924035797e+00 3.1578598624386292e+00 7.2777433072331332e-01 -2.4419241474328732e+00 -2.8573768948723841e+00 -1.0034225599935538e+00 -2.4408773633086516e+00 -4.2883359365430378e+00 -1.0678538124782901e+00 2.5956711243516262e+00 3.9629717005035570e+00 7.9122067671025820e-01 1.3640255747656147e+00 1.1415257071258400e+00 2.7359497385996518e+00 -1.3158753434598829e+00 -9.2686029432470973e-01 -2.5055749958789582e+00 -1.1414603225211959e+00 -9.6416058814647521e-01 -4.5837623735769508e+00 1.5457609920144817e+00 1.1353478028490509e+00 4.9461611349964896e+00 1.1212665784884335e+00 9.7961068148257713e-01 1.3603803136351638e+00 -1.3525011757946133e+00 -9.7501111683809860e-01 -1.6533941550995592e+00 -1.2884780330406200e+00 -1.1368308082307068e+00 -2.7125451358540333e+00 1.0672617295477838e+00 7.4637861608252198e-01 2.4127854731781961e+00 5.3437158278442372e+00 2.9407912547102155e+00 1.0873648350075502e+00 -5.9129308052248186e+00 -2.8296094062612998e+00 -8.1350953580257146e-01 -4.0997320060911200e+00 -2.7688399853232273e+00 -6.6691342938091469e-01 4.2356651727198678e+00 2.4792992924035793e+00 1.1212665784884335e+00 8.2114610696142840e+00 3.3213827374240399e+00 8.9946853805077909e-01 -8.3237811539230417e+00 -3.1673049845957477e+00 -1.2512834503998740e+00 -5.1526951723978645e+00 -2.8001146112718516e+00 -1.1367064976210135e+00 5.6982970674584532e+00 2.8243957029142921e+00 7.6031296165760931e-01 2.9104105680392767e+00 4.9113165013193560e+00 9.9383685839147751e-01 -3.1116567939135589e+00 -4.5751087100071803e+00 -6.8015324103847641e-01 -2.7232036748434059e+00 -3.6081894509617851e+00 -6.0563953491324474e-01 2.7135277216692013e+00 3.1578598624386292e+00 9.7961068148257713e-01 3.3213827374240399e+00 7.5022992130275057e+00 8.0639860346283365e-01 -3.1482745962044079e+00 -6.9758875606187019e+00 -1.0396108881068815e+00 -2.7449652484558174e+00 -4.7825469854364151e+00 -1.0482604037134102e+00 2.7827792862846747e+00 4.3702571302385884e+00 5.9381792443512282e-01 1.0839636231895717e+00 1.0033022680428325e+00 2.5280664492605975e+00 -8.3747252452344823e-01 -6.4017505048925705e-01 -2.4001305641561732e+00 -7.0138298754355566e-01 -6.4759291550291476e-01 -1.2522910016227347e+00 9.0215162673516947e-01 7.2777433072331332e-01 1.3603803136351638e+00 8.9946853805077931e-01 8.0639860346283387e-01 4.7363760629425347e+00 -1.2610308786484656e+00 -1.0534870461968540e+00 -4.8195580253971073e+00 -8.9054112417748676e-01 -8.3506282309587387e-01 -2.5095783744308036e+00 8.0484372691743622e-01 6.3884263305592037e-01 2.3567351397685234e+00 -5.5283672780285675e+00 -2.9551846739370151e+00 -1.4716049518874963e+00 6.0888653295839852e+00 2.8000617197214099e+00 1.2186177738513491e+00 4.2655728733501279e+00 2.7533940177087368e+00 8.6372534510580035e-01 -4.4600335273495482e+00 -2.4419241474328728e+00 -1.3525011757946133e+00 -8.3237811539230417e+00 -3.1482745962044070e+00 -1.2610308786484656e+00 8.5590090648467267e+00 2.9658709523182454e+00 1.6467756547374610e+00 5.3469889332896976e+00 2.6170713212019789e+00 1.3206157192525549e+00 -5.9482542417693844e+00 -2.5910145933760753e+00 -9.6459748661658784e-01 -2.6108779050348190e+00 -4.5208215644109009e+00 -1.1567059890006048e+00 2.7579748499022276e+00 4.2040816451498344e+00 8.6298186544734801e-01 2.4575671017928928e+00 3.1921069777563202e+00 6.9285000273867525e-01 -2.4214004853296691e+00 -2.8573768948723841e+00 -9.7501111683809860e-01 -3.1673049845957468e+00 -6.9758875606187001e+00 -1.0534870461968540e+00 2.9658709523182463e+00 6.6305939523420871e+00 1.1951114246956964e+00 2.6622841798688697e+00 4.3558599892421013e+00 1.1068695214953974e+00 -2.6441137089220010e+00 -4.0285565445883584e+00 -6.7260866234155869e-01 -1.4112384458827396e+00 -1.2517820305515861e+00 -2.8446345611344688e+00 1.2173223149597854e+00 8.7682719266970000e-01 2.5550169218163834e+00 1.1392043296506320e+00 1.0145271428240195e+00 1.3756332752255311e+00 -1.3802095973342727e+00 -1.0034225599935538e+00 -1.6533941550995592e+00 -1.2512834503998742e+00 -1.0396108881068815e+00 -4.8195580253971073e+00 1.6467756547374610e+00 1.1951114246956964e+00 5.1408564972542061e+00 1.3459522534763959e+00 1.1102334550725002e+00 2.7578814932729947e+00 -1.3065230592073882e+00 -9.0188373660989540e-01 -2.5118014459379800e+00 -3.7655012289690410e+00 -2.5674576278738783e+00 -1.2125748276022583e+00 4.2233053761586437e+00 2.4466588976792361e+00 8.9754338213074658e-01 5.0603908421053214e+00 2.7389165430602533e+00 1.0009594945465656e+00 -5.2156683705109410e+00 -2.4408773633086516e+00 -1.2884780330406203e+00 -5.1526951723978627e+00 -2.7449652484558178e+00 -8.9054112417748676e-01 5.3469889332896976e+00 2.6622841798688697e+00 1.3459522534763959e+00 7.4188847399312250e+00 2.9053262713103019e+00 1.3459025484343872e+00 -7.9157051196070416e+00 -2.9998856522803128e+00 -1.1987636937677286e+00 -2.5576409336720918e+00 -3.5610050513421463e+00 -1.1612739193115782e+00 2.7722368890464235e+00 3.1930440467097667e+00 7.4954362044354572e-01 2.7000752165700090e+00 4.6684268649465599e+00 9.1774542182796837e-01 -2.7196038337334256e+00 -4.2883359365430378e+00 -1.1368308082307066e+00 -2.8001146112718520e+00 -4.7825469854364151e+00 -8.3506282309587387e-01 2.6170713212019789e+00 4.3558599892421013e+00 1.1102334550724999e+00 2.9053262713103019e+00 7.0769767741182914e+00 1.2723689764864039e+00 -2.9173503194513457e+00 -6.6624197016951179e+00 -9.1672392319225815e-01 -1.2061141159307873e+00 -1.1595034044782739e+00 -1.6463222247958234e+00 1.1977807886323759e+00 8.9095109170175579e-01 1.3841215151965411e+00 9.5359190851537223e-01 8.8885524429249174e-01 2.4232377356941250e+00 -1.3493787052430852e+00 -1.0678538124782901e+00 -2.7125451358540333e+00 -1.1367064976210135e+00 -1.0482604037134102e+00 -2.5095783744308036e+00 1.3206157192525549e+00 1.1068695214953974e+00 2.7578814932729947e+00 1.3459025484343872e+00 1.2723689764864041e+00 4.9271586005413237e+00 -1.1256916460398045e+00 -8.8342721330607399e-01 -4.6239536096243219e+00 4.2160890078663646e+00 2.8149727230779149e+00 1.2252035232574860e+00 -4.8371700617991396e+00 -2.6245983573594156e+00 -8.0621701055932227e-01 -5.6129914052735135e+00 -2.9472984307772281e+00 -7.3110113433356905e-01 5.7452208518265300e+00 2.5956711243516257e+00 1.0672617295477838e+00 5.6982970674584541e+00 2.7827792862846747e+00 8.0484372691743622e-01 -5.9482542417693844e+00 -2.6441137089220010e+00 -1.3065230592073882e+00 -7.9157051196070416e+00 -2.9173503194513457e+00 -1.1256916460398045e+00 8.6545139012977330e+00 2.9399376827957742e+00 8.7222387041737681e-01 2.4059693721321542e+00 3.1435305139655627e+00 8.8405437751443705e-01 -2.5557460090723496e+00 -2.9006365224266015e+00 -5.5057419621887960e-01 -2.5863012015445892e+00 -4.3361479374245748e+00 -5.3991771042181114e-01 2.5626446984311064e+00 3.9629717005035574e+00 7.4637861608252198e-01 2.8243957029142917e+00 4.3702571302385884e+00 6.3884263305592037e-01 -2.5910145933760753e+00 -4.0285565445883584e+00 -9.0188373660989540e-01 -2.9998856522803123e+00 -6.6624197016951197e+00 -8.8342721330607399e-01 2.9399376827957737e+00 6.4510013614269432e+00 6.0652722990377983e-01 8.4750610497587120e-01 7.0704423375944014e-01 1.3385271515832124e+00 -7.3961892011981212e-01 -5.1860316933340245e-01 -1.2631725248338421e+00 -6.9158389807201948e-01 -5.9067430994138148e-01 -2.3027605638571842e+00 1.1145210615252910e+00 7.9122067671025831e-01 2.4127854731781961e+00 7.6031296165760931e-01 5.9381792443512282e-01 2.3567351397685239e+00 -9.6459748661658784e-01 -6.7260866234155869e-01 -2.5118014459379800e+00 -1.1987636937677288e+00 -9.1672392319225826e-01 -4.6239536096243219e+00 8.7222387041737681e-01 6.0652722990377983e-01 4.5936403797233929e+00 375 376 377 423 424 425 1149 1150 1151 1122 1123 1124 378 379 380 426 427 428 1152 1153 1154 1125 1126 1127 7.3991277004458746e+00 3.0670013534489726e+00 1.4464402990988297e+00 -7.8454130438031964e+00 -3.1044846235930441e+00 -1.2403653691802803e+00 -4.9872855282426638e+00 -2.7339314296776642e+00 -8.3141934680333907e-01 5.1678108579513848e+00 2.6211716332371213e+00 1.3162350354995180e+00 5.0090961704553258e+00 2.7724187762380126e+00 1.0218078649648483e+00 -5.1917762376060921e+00 -2.4659905185474678e+00 -1.3582239662863094e+00 -3.5691323485242989e+00 -2.4424950838056230e+00 -1.1589532549615944e+00 4.0175724293236650e+00 2.2863098926996921e+00 8.0447873766832367e-01 3.0670013534489717e+00 7.1545136173149046e+00 1.3928306348251511e+00 -3.1301622875180635e+00 -6.6456069911314248e+00 -9.8378824231184603e-01 -2.7854457535678812e+00 -4.7273047650265561e+00 -7.9756566304252552e-01 2.6105919271854661e+00 4.2473604960747604e+00 1.1014502948147649e+00 2.8017529661844449e+00 4.6424358683475333e+00 9.5273505534481251e-01 -2.8162454338397986e+00 -4.2414700848719304e+00 -1.2111175419386093e+00 -2.4456476686296487e+00 -3.4233658256668895e+00 -1.1238555801439891e+00 2.6981548967365070e+00 2.9934376849596021e+00 6.6931104245223860e-01 1.4464402990988297e+00 1.3928306348251509e+00 4.8643482235185722e+00 -1.2714504598567888e+00 -1.0008872255294428e+00 -4.4771346488325090e+00 -1.1412245742932217e+00 -1.0701483247107682e+00 -2.3954154137200354e+00 1.3351996626351594e+00 1.1232396420092878e+00 2.6505538536445981e+00 1.0386832975977118e+00 9.5574243424396454e-01 2.3456817645910779e+00 -1.4224760725222012e+00 -1.1147768950609651e+00 -2.6717219177653830e+00 -1.1691687674454914e+00 -1.1322764997995134e+00 -1.5883902596937078e+00 1.1839966147860022e+00 8.4627623402228624e-01 1.2720783982573849e+00 -7.8454130438031964e+00 -3.1301622875180635e+00 -1.2714504598567888e+00 8.5275641318281110e+00 3.0916058578642391e+00 9.5375542371668731e-01 5.5351563702638078e+00 2.7903107329652816e+00 7.3006407988140687e-01 -5.7668091325041697e+00 -2.6131196531045946e+00 -1.2661580084549986e+00 -5.5812353685880431e+00 -2.9789803514469728e+00 -7.7637932951644795e-01 5.7539172259814553e+00 2.6140700748400802e+00 1.1701119500276032e+00 4.0257787180039486e+00 2.6588214107062962e+00 1.1526414461734380e+00 -4.6489589011819135e+00 -2.4325457843062668e+00 -6.9258510197089651e-01 -3.1044846235930432e+00 -6.6456069911314248e+00 -1.0008872255294430e+00 3.0916058578642396e+00 6.3344374015699847e+00 6.7696431135617730e-01 2.8033446234690986e+00 4.3242349241596436e+00 5.9373398860037252e-01 -2.5799260904362540e+00 -3.9286836472281994e+00 -8.8430080933349298e-01 -2.6871639520593606e+00 -4.2994735898009573e+00 -5.9025456546924049e-01 2.6547494736973247e+00 3.9199795233577333e+00 8.3560851890956656e-01 2.3268512236956442e+00 3.0456224698633880e+00 8.5042892517668900e-01 -2.5049765126376471e+00 -2.7505100907901672e+00 -4.8129314371062676e-01 -1.2403653691802801e+00 -9.8378824231184603e-01 -4.4771346488325081e+00 9.5375542371668720e-01 6.7696431135617730e-01 4.3594814064807741e+00 7.7303557731136974e-01 6.2658859009182866e-01 2.2635553068179313e+00 -9.8994949892844653e-01 -7.0213987349201556e-01 -2.4116960976340422e+00 -7.4985961753155639e-01 -6.2910131081602938e-01 -2.2190797831815954e+00 1.1559194607727779e+00 8.1092524246091291e-01 2.3693463695523524e+00 8.4804306338424418e-01 7.0711449106899615e-01 1.3146966205853090e+00 -7.5057903954479577e-01 -5.0656320835802426e-01 -1.1991691737882193e+00 -4.9872855282426638e+00 -2.7854457535678812e+00 -1.1412245742932217e+00 5.5351563702638069e+00 2.8033446234690986e+00 7.7303557731136952e-01 7.6432192472206788e+00 3.0955151705973654e+00 7.5582910989123819e-01 -7.7938265352283880e+00 -2.9569156001821275e+00 -1.0891218520904768e+00 -3.9072176778373722e+00 -2.6077740891794345e+00 -6.4923635265352053e-01 4.0698176439333356e+00 2.3372437299871267e+00 1.0956157526414749e+00 4.8854571655643007e+00 2.5902639336345823e+00 9.0316897759765724e-01 -5.4453206856736971e+00 -2.4762320147587298e+00 -6.4806663840451750e-01 -2.7339314296776642e+00 -4.7273047650265552e+00 -1.0701483247107679e+00 2.7903107329652812e+00 4.3242349241596427e+00 6.2658859009182866e-01 3.0955151705973654e+00 7.1167287603418661e+00 6.9323986545440797e-01 -2.9240368672611741e+00 -6.6233917404214999e+00 -9.2117591748524341e-01 -2.6543477063957632e+00 -3.4716978447654050e+00 -6.0392778163010208e-01 2.6349738325891487e+00 3.0419555765029735e+00 9.8155240733147908e-01 2.6280630192272176e+00 4.5495246283640896e+00 8.4779627602487739e-01 -2.8365467520444110e+00 -4.2100495391551105e+00 -5.5392511507647713e-01 -8.3141934680333918e-01 -7.9756566304252541e-01 -2.3954154137200359e+00 7.3006407988140676e-01 5.9373398860037252e-01 2.2635553068179313e+00 7.5582910989123830e-01 6.9323986545440797e-01 4.4439796153626254e+00 -1.1353852260270219e+00 -9.6926561888729679e-01 -4.5487824991127823e+00 -6.2030736334963332e-01 -5.6689126020145897e-01 -1.1898318651628657e+00 8.1878802660971728e-01 6.5773446053504625e-01 1.3101976951408447e+00 9.6606847620929470e-01 8.9134982857198719e-01 2.3728971183590093e+00 -6.8363775641166269e-01 -5.0233560103053243e-01 -2.2565999576847240e+00 5.1678108579513840e+00 2.6105919271854661e+00 1.3351996626351594e+00 -5.7668091325041697e+00 -2.5799260904362540e+00 -9.8994949892844664e-01 -7.7938265352283880e+00 -2.9240368672611745e+00 -1.1353852260270221e+00 8.0834169467292778e+00 2.7550355767217392e+00 1.5048648714332458e+00 4.0393534212533959e+00 2.5981128573941867e+00 8.5011962473508174e-01 -4.2645018219285831e+00 -2.2993688624602449e+00 -1.3394892856330463e+00 -5.0402162409171893e+00 -2.6079244829063146e+00 -1.3062546949444021e+00 5.5747725046442715e+00 2.4475159417625960e+00 1.0808945467294264e+00 2.6211716332371213e+00 4.2473604960747604e+00 1.1232396420092878e+00 -2.6131196531045950e+00 -3.9286836472281994e+00 -7.0213987349201556e-01 -2.9569156001821275e+00 -6.6233917404214999e+00 -9.6926561888729690e-01 2.7550355767217396e+00 6.3313026162498005e+00 1.0985456664861433e+00 2.3596574436309106e+00 3.0107829411982445e+00 6.8737740123083568e-01 -2.3170824269027066e+00 -2.7059229015694561e+00 -9.6612937182932712e-01 -2.3280658227589441e+00 -4.1625284918397725e+00 -1.0323433054357407e+00 2.4793188493586014e+00 3.8310807275361252e+00 7.6071545991811096e-01 1.3162350354995180e+00 1.1014502948147649e+00 2.6505538536445985e+00 -1.2661580084549988e+00 -8.8430080933349298e-01 -2.4116960976340422e+00 -1.0891218520904771e+00 -9.2117591748524341e-01 -4.5487824991127823e+00 1.5048648714332453e+00 1.0985456664861433e+00 4.9185084069938263e+00 1.0730437048119770e+00 9.4338968119807931e-01 1.2910914353256477e+00 -1.3074190375429080e+00 -9.3576845793416297e-01 -1.5932789754331296e+00 -1.2467899127180035e+00 -1.1052776860679991e+00 -2.6676341409540085e+00 1.0153451990616462e+00 7.0313722832191106e-01 2.3612380171698875e+00 5.0090961704553258e+00 2.8017529661844454e+00 1.0386832975977116e+00 -5.5812353685880431e+00 -2.6871639520593606e+00 -7.4985961753155639e-01 -3.9072176778373722e+00 -2.6543477063957632e+00 -6.2030736334963332e-01 4.0393534212533959e+00 2.3596574436309106e+00 1.0730437048119770e+00 7.6314288087536282e+00 3.1552467949201315e+00 8.2633668898086943e-01 -7.7368521557051491e+00 -2.9922931239801471e+00 -1.1902272358711397e+00 -4.8721853021075043e+00 -2.6797925963785891e+00 -1.0871128189704504e+00 5.4176121037757197e+00 2.6969401740783727e+00 7.0944334433221867e-01 2.7724187762380126e+00 4.6424358683475333e+00 9.5574243424396443e-01 -2.9789803514469724e+00 -4.2994735898009573e+00 -6.2910131081602938e-01 -2.6077740891794345e+00 -3.4716978447654054e+00 -5.6689126020145897e-01 2.5981128573941872e+00 3.0107829411982445e+00 9.4338968119807920e-01 3.1552467949201319e+00 7.0021769717006972e+00 7.4594051765764213e-01 -2.9829820698500664e+00 -6.4596575978859159e+00 -9.9423435091533308e-01 -2.6157390349638283e+00 -4.5663897111067513e+00 -1.0087932909764923e+00 2.6596971168879699e+00 4.1418229623125553e+00 5.5394757980962506e-01 1.0218078649648485e+00 9.5273505534481240e-01 2.3456817645910779e+00 -7.7637932951644784e-01 -5.9025456546924038e-01 -2.2190797831815954e+00 -6.4923635265352064e-01 -6.0392778163010197e-01 -1.1898318651628654e+00 8.5011962473508162e-01 6.8737740123083579e-01 1.2910914353256475e+00 8.2633668898086965e-01 7.4594051765764213e-01 4.3427365120065025e+00 -1.1843845042464312e+00 -9.9224455653883026e-01 -4.4183229803339916e+00 -8.3547675649557129e-01 -7.9178726805788813e-01 -2.3684576415398300e+00 7.4721276423117144e-01 5.9216119746277107e-01 2.2161825582950536e+00 -5.1917762376060921e+00 -2.8162454338397986e+00 -1.4224760725222014e+00 5.7539172259814553e+00 2.6547494736973247e+00 1.1559194607727781e+00 4.0698176439333356e+00 2.6349738325891487e+00 8.1878802660971739e-01 -4.2645018219285831e+00 -2.3170824269027066e+00 -1.3074190375429080e+00 -7.7368521557051482e+00 -2.9829820698500664e+00 -1.1843845042464314e+00 7.9739591838156008e+00 2.7898351423024947e+00 1.5843541905194061e+00 5.0638857623633786e+00 2.4917637278982583e+00 1.2707056417653972e+00 -5.6684496008539451e+00 -2.4550122458946562e+00 -9.1548770535575474e-01 -2.4659905185474678e+00 -4.2414700848719313e+00 -1.1147768950609651e+00 2.6140700748400802e+00 3.9199795233577333e+00 8.1092524246091291e-01 2.3372437299871258e+00 3.0419555765029740e+00 6.5773446053504614e-01 -2.2993688624602453e+00 -2.7059229015694561e+00 -9.3576845793416297e-01 -2.9922931239801476e+00 -6.4596575978859159e+00 -9.9224455653883026e-01 2.7898351423024952e+00 6.1129278203056456e+00 1.1406388260234941e+00 2.5317638664460977e+00 4.1267423946124708e+00 1.0662142839498379e+00 -2.5152603085879388e+00 -3.7945547304515186e+00 -6.3272290343533044e-01 -1.3582239662863091e+00 -1.2111175419386093e+00 -2.6717219177653830e+00 1.1701119500276032e+00 8.3560851890956633e-01 2.3693463695523524e+00 1.0956157526414749e+00 9.8155240733147897e-01 1.3101976951408447e+00 -1.3394892856330463e+00 -9.6612937182932690e-01 -1.5932789754331296e+00 -1.1902272358711397e+00 -9.9423435091533319e-01 -4.4183229803339916e+00 1.5843541905194063e+00 1.1406388260234941e+00 4.7515678042447655e+00 1.2999650860579959e+00 1.0748943422783570e+00 2.6228868665046794e+00 -1.2621064914559847e+00 -8.6121282985962777e-01 -2.3706748619101363e+00 -3.5691323485242989e+00 -2.4456476686296478e+00 -1.1691687674454916e+00 4.0257787180039486e+00 2.3268512236956442e+00 8.4804306338424418e-01 4.8854571655643015e+00 2.6280630192272176e+00 9.6606847620929448e-01 -5.0402162409171893e+00 -2.3280658227589441e+00 -1.2467899127180035e+00 -4.8721853021075043e+00 -2.6157390349638279e+00 -8.3547675649557129e-01 5.0638857623633804e+00 2.5317638664460977e+00 1.2999650860579959e+00 7.1490965515277898e+00 2.7833419149940584e+00 1.2977792056626276e+00 -7.6426843059104277e+00 -2.8805674980105960e+00 -1.1604203946550937e+00 -2.4424950838056230e+00 -3.4233658256668895e+00 -1.1322764997995134e+00 2.6588214107062962e+00 3.0456224698633880e+00 7.0711449106899615e-01 2.5902639336345827e+00 4.5495246283640887e+00 8.9134982857198719e-01 -2.6079244829063155e+00 -4.1625284918397725e+00 -1.1052776860679989e+00 -2.6797925963785891e+00 -4.5663897111067522e+00 -7.9178726805788813e-01 2.4917637278982583e+00 4.1267423946124708e+00 1.0748943422783570e+00 2.7833419149940579e+00 6.8723905033474297e+00 1.2385100889013629e+00 -2.7939788241426684e+00 -6.4419959675739662e+00 -8.8252729689530007e-01 -1.1589532549615946e+00 -1.1238555801439891e+00 -1.5883902596937076e+00 1.1526414461734382e+00 8.5042892517668889e-01 1.3146966205853090e+00 9.0316897759765713e-01 8.4779627602487750e-01 2.3728971183590089e+00 -1.3062546949444021e+00 -1.0323433054357407e+00 -2.6676341409540081e+00 -1.0871128189704504e+00 -1.0087932909764923e+00 -2.3684576415398295e+00 1.2707056417653972e+00 1.0662142839498379e+00 2.6228868665046794e+00 1.2977792056626274e+00 1.2385100889013629e+00 4.8012960080735345e+00 -1.0719745023226732e+00 -8.3795739749654530e-01 -4.4872945713349841e+00 4.0175724293236641e+00 2.6981548967365070e+00 1.1839966147860022e+00 -4.6489589011819126e+00 -2.5049765126376471e+00 -7.5057903954479577e-01 -5.4453206856736971e+00 -2.8365467520444101e+00 -6.8363775641166269e-01 5.5747725046442715e+00 2.4793188493586014e+00 1.0153451990616464e+00 5.4176121037757197e+00 2.6596971168879699e+00 7.4721276423117144e-01 -5.6684496008539451e+00 -2.5152603085879388e+00 -1.2621064914559847e+00 -7.6426843059104268e+00 -2.7939788241426684e+00 -1.0719745023226732e+00 8.3954564558763263e+00 2.8135915344295874e+00 8.2174321165629327e-01 2.2863098926996921e+00 2.9934376849596021e+00 8.4627623402228602e-01 -2.4325457843062668e+00 -2.7505100907901672e+00 -5.0656320835802426e-01 -2.4762320147587298e+00 -4.2100495391551105e+00 -5.0233560103053243e-01 2.4475159417625960e+00 3.8310807275361252e+00 7.0313722832191106e-01 2.6969401740783723e+00 4.1418229623125562e+00 5.9216119746277107e-01 -2.4550122458946557e+00 -3.7945547304515190e+00 -8.6121282985962755e-01 -2.8805674980105964e+00 -6.4419959675739662e+00 -8.3795739749654530e-01 2.8135915344295865e+00 6.2307689531624790e+00 5.6649437693775939e-01 8.0447873766832367e-01 6.6931104245223882e-01 1.2720783982573849e+00 -6.9258510197089651e-01 -4.8129314371062670e-01 -1.1991691737882193e+00 -6.4806663840451739e-01 -5.5392511507647701e-01 -2.2565999576847244e+00 1.0808945467294264e+00 7.6071545991811096e-01 2.3612380171698879e+00 7.0944334433221867e-01 5.5394757980962506e-01 2.2161825582950541e+00 -9.1548770535575485e-01 -6.3272290343533033e-01 -2.3706748619101354e+00 -1.1604203946550935e+00 -8.8252729689529996e-01 -4.4872945713349832e+00 8.2174321165629338e-01 5.6649437693775939e-01 4.4642395909957369e+00 315 316 317 378 379 380 1125 1126 1127 330 331 332 318 319 320 381 382 383 1128 1129 1130 333 334 335 6.7990695891661712e+00 2.6395846501978708e+00 1.9150198608329994e+00 -7.2934651614146491e+00 -2.7291941672729711e+00 -1.8706582614545044e+00 -4.4882640802185705e+00 -2.3639915976049539e+00 -1.3170633002761283e+00 4.5613604464252449e+00 2.2395418222626700e+00 1.7291119743535401e+00 4.5454759818862112e+00 2.3938768744016268e+00 1.5294029875959512e+00 -4.6171363365941902e+00 -2.0687400559260145e+00 -1.7606313419928226e+00 -3.0524922873489091e+00 -2.0450138916602163e+00 -1.4841007418188825e+00 3.5454518480986934e+00 1.9339363656019892e+00 1.2589188227598480e+00 2.6395846501978717e+00 6.8197309997225926e+00 1.9257134754448795e+00 -2.7629474243566419e+00 -6.3355621282141161e+00 -1.5343861435112891e+00 -2.4675837927932180e+00 -4.3707823494106490e+00 -1.3071166598602113e+00 2.2485798761494715e+00 3.9128296212436973e+00 1.4981972567500996e+00 2.4433420286345702e+00 4.3174388231162562e+00 1.4574860844890538e+00 -2.4153061230737016e+00 -3.9340371170774540e+00 -1.6307812480344668e+00 -2.0773413815941066e+00 -3.0900342947321646e+00 -1.5073508726407630e+00 2.3916721668357535e+00 2.6804164453518404e+00 1.0982381073626988e+00 1.9150198608329994e+00 1.9257134754448797e+00 5.5654768450856329e+00 -1.9021363409130987e+00 -1.5414037655747943e+00 -5.1082776562260923e+00 -1.6412528489226881e+00 -1.5533733395659710e+00 -2.8577465306110361e+00 1.7687264344534974e+00 1.5283759088190210e+00 3.1900413930734830e+00 1.5448507964795155e+00 1.4399473162390155e+00 2.8978204503527714e+00 -1.8624553446334975e+00 -1.4836845786897384e+00 -3.3000710094036436e+00 -1.5142411909909748e+00 -1.5140479398975470e+00 -2.1097602156268840e+00 1.6914886336942463e+00 1.1984729232251354e+00 1.7225167233557701e+00 -7.2934651614146491e+00 -2.7629474243566419e+00 -1.9021363409130989e+00 8.0661837279710333e+00 2.7622006038665265e+00 1.7425290296264062e+00 5.1000438831136536e+00 2.4878904662212200e+00 1.3432834827786362e+00 -5.2112732627418517e+00 -2.2948633430482124e+00 -1.8198717620156317e+00 -5.1873995076531205e+00 -2.6297418524486673e+00 -1.4411963417374776e+00 5.2420355273815700e+00 2.2416370976066813e+00 1.7418397165333297e+00 3.5421020171501798e+00 2.3063033129141730e+00 1.6182678960104555e+00 -4.2582272238068128e+00 -2.1104788607550824e+00 -1.2827156802826218e+00 -2.7291941672729711e+00 -6.3355621282141170e+00 -1.5414037655747941e+00 2.7622006038665270e+00 6.0491115143049718e+00 1.2230391938181575e+00 2.5040197253439476e+00 3.9901677462819749e+00 1.0866518784279169e+00 -2.2383097292941598e+00 -3.6191420500912832e+00 -1.2648703594486257e+00 -2.3858472277137937e+00 -3.9968818861305118e+00 -1.0874415741112198e+00 2.3120063192941869e+00 3.6438238583525955e+00 1.2492600059184913e+00 2.0013826445977534e+00 2.7368314291515450e+00 1.2145199483920366e+00 -2.2262581688214880e+00 -2.4683484836551779e+00 -8.7975532742196405e-01 -1.8706582614545044e+00 -1.5343861435112893e+00 -5.1082776562260923e+00 1.7425290296264062e+00 1.2230391938181575e+00 4.8865253003858031e+00 1.4158853152597748e+00 1.1393113361807723e+00 2.6351808963558483e+00 -1.5823334773707407e+00 -1.1328190119375889e+00 -2.8924233410801707e+00 -1.3943944912567037e+00 -1.1529521598124444e+00 -2.6675391749178465e+00 1.7510593491813191e+00 1.2158212885215016e+00 2.9364915855590961e+00 1.3304614277551796e+00 1.1474601887132676e+00 1.7792781665827131e+00 -1.3925488917407305e+00 -9.0547469197237673e-01 -1.5692357766593519e+00 -4.4882640802185705e+00 -2.4675837927932180e+00 -1.6412528489226881e+00 5.1000438831136536e+00 2.5040197253439476e+00 1.4158853152597748e+00 6.9760064555775090e+00 2.7449039541419755e+00 1.3712172965455027e+00 -7.0150987207671154e+00 -2.5580905000998708e+00 -1.6579683101323976e+00 -3.5454230795381818e+00 -2.2980274403900487e+00 -1.1955117472558237e+00 3.6144782822624553e+00 2.0148780378349689e+00 1.5652951750844206e+00 4.3252528953441889e+00 2.2120214809315817e+00 1.3499904918981385e+00 -4.9669956357739409e+00 -2.1521214649693370e+00 -1.2076553724769294e+00 -2.3639915976049539e+00 -4.3707823494106490e+00 -1.5533733395659710e+00 2.4878904662212200e+00 3.9901677462819753e+00 1.1393113361807723e+00 2.7449039541419755e+00 6.5094007192715972e+00 1.2596513680292580e+00 -2.5420113200646650e+00 -6.0440017584583581e+00 -1.3956114487922686e+00 -2.3521807864993671e+00 -3.1374027640882458e+00 -1.1086229422188603e+00 2.2742998748597651e+00 2.7354423978915334e+00 1.3883516138302767e+00 2.2746448096681466e+00 4.0992504558042731e+00 1.2922170713678816e+00 -2.5235554007221195e+00 -3.7820744472921257e+00 -1.0219236588310903e+00 -1.3170633002761283e+00 -1.3071166598602111e+00 -2.8577465306110361e+00 1.3432834827786362e+00 1.0866518784279169e+00 2.6351808963558478e+00 1.3712172965455025e+00 1.2596513680292580e+00 4.6180723965594677e+00 -1.6822362796667114e+00 -1.4240333284546827e+00 -4.8345510302575523e+00 -1.1519799618221394e+00 -1.0436635152801055e+00 -1.5497958856350813e+00 1.3166731185439353e+00 1.0374546886943232e+00 1.7719041595013882e+00 1.4087688542612553e+00 1.3089823109079928e+00 2.7272737669656983e+00 -1.2886632103643503e+00 -9.1792674246449235e-01 -2.5103377728787333e+00 4.5613604464252449e+00 2.2485798761494715e+00 1.7687264344534972e+00 -5.2112732627418517e+00 -2.2383097292941598e+00 -1.5823334773707409e+00 -7.0150987207671154e+00 -2.5420113200646650e+00 -1.6822362796667114e+00 7.1662976644882423e+00 2.3410635619734865e+00 1.9807741651582755e+00 3.5800035793084022e+00 2.2239675255470517e+00 1.3621260971193931e+00 -3.6883496769448727e+00 -1.9285622934051294e+00 -1.7513806999625663e+00 -4.3671062834455974e+00 -2.1906380329421129e+00 -1.6785412252783063e+00 4.9741662536775433e+00 2.0859104120360596e+00 1.5828649855471604e+00 2.2395418222626704e+00 3.9128296212436968e+00 1.5283759088190210e+00 -2.2948633430482124e+00 -3.6191420500912832e+00 -1.1328190119375889e+00 -2.5580905000998713e+00 -6.0440017584583581e+00 -1.4240333284546822e+00 2.3410635619734856e+00 5.7615822410509807e+00 1.4719958623889380e+00 2.0514500343034707e+00 2.7117012263193585e+00 1.0922869991715076e+00 -1.9661469876700228e+00 -2.4214401582371190e+00 -1.2849527404208139e+00 -1.9556178578951482e+00 -3.7344743522411967e+00 -1.3585099421224640e+00 2.1426632701736255e+00 3.4329452304139241e+00 1.1076562525560840e+00 1.7291119743535401e+00 1.4981972567500996e+00 3.1900413930734830e+00 -1.8198717620156317e+00 -1.2648703594486259e+00 -2.8924233410801703e+00 -1.6579683101323974e+00 -1.3956114487922684e+00 -4.8345510302575523e+00 1.9807741651582758e+00 1.4719958623889380e+00 5.2675365013458659e+00 1.5280483088215711e+00 1.3216610388693848e+00 1.7602689135570604e+00 -1.7066020715677013e+00 -1.2281629731217454e+00 -2.1218319252411160e+00 -1.5985777350827131e+00 -1.4539097077846175e+00 -3.0871173358637174e+00 1.5450854304650552e+00 1.0507003311388357e+00 2.7180768244661477e+00 4.5454759818862112e+00 2.4433420286345702e+00 1.5448507964795155e+00 -5.1873995076531205e+00 -2.3858472277137937e+00 -1.3943944912567037e+00 -3.5454230795381809e+00 -2.3521807864993671e+00 -1.1519799618221394e+00 3.5800035793084022e+00 2.0514500343034712e+00 1.5280483088215708e+00 7.1647538871744079e+00 2.7647025439742001e+00 1.4835014128318014e+00 -7.1719587129279834e+00 -2.5693026339931264e+00 -1.7758561966442505e+00 -4.3488187406715086e+00 -2.2981858818058107e+00 -1.5197843426507804e+00 4.9633665924217718e+00 2.3460219230998591e+00 1.2856144742409885e+00 2.3938768744016268e+00 4.3174388231162562e+00 1.4399473162390155e+00 -2.6297418524486673e+00 -3.9968818861305118e+00 -1.1529521598124444e+00 -2.2980274403900487e+00 -3.1374027640882458e+00 -1.0436635152801055e+00 2.2239675255470517e+00 2.7117012263193585e+00 1.3216610388693846e+00 2.7647025439742001e+00 6.5679969927243347e+00 1.3300127831462465e+00 -2.5524148267561633e+00 -6.0685645709958429e+00 -1.4572342334812447e+00 -2.2177234883121622e+00 -4.1397601767430672e+00 -1.4190483533080802e+00 2.3153606639841615e+00 3.7454723557977205e+00 9.8127712362723041e-01 1.5294029875959509e+00 1.4574860844890538e+00 2.8978204503527718e+00 -1.4411963417374776e+00 -1.0874415741112200e+00 -2.6675391749178461e+00 -1.1955117472558237e+00 -1.1086229422188603e+00 -1.5497958856350813e+00 1.3621260971193934e+00 1.0922869991715076e+00 1.7602689135570604e+00 1.4835014128318011e+00 1.3300127831462463e+00 4.8006364913203345e+00 -1.7837360500522110e+00 -1.4726721901326214e+00 -4.9970385336610885e+00 -1.3026966776146425e+00 -1.2550179155360683e+00 -2.8008217198680061e+00 1.3481103191130075e+00 1.0439687551919630e+00 2.5564694588518559e+00 -4.6171363365941902e+00 -2.4153061230737016e+00 -1.8624553446334975e+00 5.2420355273815709e+00 2.3120063192941873e+00 1.7510593491813193e+00 3.6144782822624548e+00 2.2742998748597656e+00 1.3166731185439353e+00 -3.6883496769448723e+00 -1.9661469876700228e+00 -1.7066020715677013e+00 -7.1719587129279851e+00 -2.5524148267561628e+00 -1.7837360500522113e+00 7.2873759021443449e+00 2.3423217934916223e+00 2.0884823009181894e+00 4.4418325944278223e+00 2.0695806716251788e+00 1.6377958299949642e+00 -5.1082775797491422e+00 -2.0643407217708676e+00 -1.4412171323850012e+00 -2.0687400559260145e+00 -3.9340371170774540e+00 -1.4836845786897386e+00 2.2416370976066817e+00 3.6438238583525955e+00 1.2158212885215016e+00 2.0148780378349684e+00 2.7354423978915334e+00 1.0374546886943232e+00 -1.9285622934051294e+00 -2.4214401582371190e+00 -1.2281629731217452e+00 -2.5693026339931269e+00 -6.0685645709958429e+00 -1.4726721901326214e+00 2.3423217934916223e+00 5.7498871602284929e+00 1.5123501868454952e+00 2.1256972565355259e+00 3.7300238425726513e+00 1.4061620511819433e+00 -2.1579292021445271e+00 -3.4351354127348590e+00 -9.8726847329916001e-01 -1.7606313419928223e+00 -1.6307812480344668e+00 -3.3000710094036436e+00 1.7418397165333297e+00 1.2492600059184915e+00 2.9364915855590961e+00 1.5652951750844204e+00 1.3883516138302767e+00 1.7719041595013882e+00 -1.7513806999625663e+00 -1.2849527404208136e+00 -2.1218319252411160e+00 -1.7758561966442505e+00 -1.4572342334812447e+00 -4.9970385336610885e+00 2.0884823009181899e+00 1.5123501868454956e+00 5.4022370595011848e+00 1.6910065334679267e+00 1.4154445035287049e+00 3.1158851575897133e+00 -1.7987554874042262e+00 -1.1924380881864445e+00 -2.8075764938455361e+00 -3.0524922873489100e+00 -2.0773413815941062e+00 -1.5142411909909748e+00 3.5421020171501798e+00 2.0013826445977534e+00 1.3304614277551796e+00 4.3252528953441889e+00 2.2746448096681462e+00 1.4087688542612553e+00 -4.3671062834455974e+00 -1.9556178578951482e+00 -1.5985777350827135e+00 -4.3488187406715086e+00 -2.2177234883121622e+00 -1.3026966776146425e+00 4.4418325944278223e+00 2.1256972565355254e+00 1.6910065334679270e+00 6.3178571778545036e+00 2.3097144450716565e+00 1.6627760567416414e+00 -6.8586273733106768e+00 -2.4607564280716661e+00 -1.6774972685376741e+00 -2.0450138916602163e+00 -3.0900342947321646e+00 -1.5140479398975466e+00 2.3063033129141730e+00 2.7368314291515450e+00 1.1474601887132676e+00 2.2120214809315812e+00 4.0992504558042731e+00 1.3089823109079926e+00 -2.1906380329421129e+00 -3.7344743522411967e+00 -1.4539097077846170e+00 -2.2981858818058116e+00 -4.1397601767430672e+00 -1.2550179155360683e+00 2.0695806716251788e+00 3.7300238425726508e+00 1.4154445035287049e+00 2.3097144450716560e+00 6.2125103782269164e+00 1.6298040250305006e+00 -2.3637821041344469e+00 -5.8143472820389590e+00 -1.2787154649622350e+00 -1.4841007418188825e+00 -1.5073508726407630e+00 -2.1097602156268840e+00 1.6182678960104555e+00 1.2145199483920364e+00 1.7792781665827127e+00 1.3499904918981385e+00 1.2922170713678816e+00 2.7272737669656983e+00 -1.6785412252783063e+00 -1.3585099421224640e+00 -3.0871173358637174e+00 -1.5197843426507804e+00 -1.4190483533080802e+00 -2.8008217198680057e+00 1.6377958299949640e+00 1.4061620511819430e+00 3.1158851575897133e+00 1.6627760567416414e+00 1.6298040250305004e+00 5.1262530483292412e+00 -1.5864039648972286e+00 -1.2577939279010557e+00 -4.7509908681087598e+00 3.5454518480986934e+00 2.3916721668357530e+00 1.6914886336942461e+00 -4.2582272238068128e+00 -2.2262581688214880e+00 -1.3925488917407305e+00 -4.9669956357739400e+00 -2.5235554007221195e+00 -1.2886632103643503e+00 4.9741662536775433e+00 2.1426632701736259e+00 1.5450854304650556e+00 4.9633665924217727e+00 2.3153606639841620e+00 1.3481103191130077e+00 -5.1082775797491422e+00 -2.1579292021445267e+00 -1.7987554874042262e+00 -6.8586273733106768e+00 -2.3637821041344464e+00 -1.5864039648972288e+00 7.7091431184425616e+00 2.4218287748290437e+00 1.4816871711342285e+00 1.9339363656019888e+00 2.6804164453518404e+00 1.1984729232251354e+00 -2.1104788607550824e+00 -2.4683484836551779e+00 -9.0547469197237684e-01 -2.1521214649693370e+00 -3.7820744472921262e+00 -9.1792674246449235e-01 2.0859104120360596e+00 3.4329452304139245e+00 1.0507003311388357e+00 2.3460219230998596e+00 3.7454723557977205e+00 1.0439687551919627e+00 -2.0643407217708676e+00 -3.4351354127348590e+00 -1.1924380881864445e+00 -2.4607564280716661e+00 -5.8143472820389590e+00 -1.2577939279010555e+00 2.4218287748290437e+00 5.6410715941576388e+00 9.8049144096843721e-01 1.2589188227598480e+00 1.0982381073626988e+00 1.7225167233557701e+00 -1.2827156802826218e+00 -8.7975532742196405e-01 -1.5692357766593519e+00 -1.2076553724769292e+00 -1.0219236588310903e+00 -2.5103377728787333e+00 1.5828649855471604e+00 1.1076562525560840e+00 2.7180768244661477e+00 1.2856144742409885e+00 9.8127712362723041e-01 2.5564694588518559e+00 -1.4412171323850014e+00 -9.8726847329916012e-01 -2.8075764938455361e+00 -1.6774972685376741e+00 -1.2787154649622348e+00 -4.7509908681087598e+00 1.4816871711342285e+00 9.8049144096843710e-01 4.6410779048186086e+00 378 379 380 426 427 428 1152 1153 1154 1125 1126 1127 381 382 383 429 430 431 1155 1156 1157 1128 1129 1130 6.2937940824509848e+00 2.4915431233404486e+00 1.8153399412786229e+00 -6.7794255860786299e+00 -2.5753853291663154e+00 -1.7631708988144303e+00 -4.2368782410528105e+00 -2.2533564801507269e+00 -1.2427952941659317e+00 4.3110728900506547e+00 2.1246212048894240e+00 1.6533329556649712e+00 4.2573006821840620e+00 2.2753844877307272e+00 1.4431885417948389e+00 -4.3296409670004437e+00 -1.9500474561862353e+00 -1.6828126241725887e+00 -2.8845672299281606e+00 -1.9465499390445840e+00 -1.4167367742663510e+00 3.3683443693743409e+00 1.8337903885872591e+00 1.1936541526808673e+00 2.4915431233404486e+00 6.3776730726286921e+00 1.8494504270945331e+00 -2.6236154935223168e+00 -5.8741564169905374e+00 -1.4443501636411975e+00 -2.3515632928133949e+00 -4.1729655055334618e+00 -1.2450553151438455e+00 2.1384811302546183e+00 3.7053978991753218e+00 1.4374702699056536e+00 2.3273455804960892e+00 4.0828864140822247e+00 1.3874518139880447e+00 -2.2983820158384796e+00 -3.6961919185056558e+00 -1.5706448549928784e+00 -1.9751888058882947e+00 -2.9705696256099960e+00 -1.4564700114149658e+00 2.2913797739713275e+00 2.5479260807534110e+00 1.0421478342046540e+00 1.8153399412786226e+00 1.8494504270945331e+00 5.1900051924735822e+00 -1.8114576163498997e+00 -1.4570994147144352e+00 -4.7124917374841813e+00 -1.5653758079300837e+00 -1.4955563019082119e+00 -2.7049118607182998e+00 1.6959357758378091e+00 1.4670448776675489e+00 3.0406982887277594e+00 1.4696819511180514e+00 1.3786778873412964e+00 2.7063448785241579e+00 -1.7835229777190875e+00 -1.4189071244629450e+00 -3.1213902364997090e+00 -1.4464291008388961e+00 -1.4654371631653234e+00 -2.0338674137722532e+00 1.6258278346034820e+00 1.1418268121475361e+00 1.6356128887489416e+00 -6.7794255860786299e+00 -2.6236154935223159e+00 -1.8114576163498999e+00 7.5639298713826211e+00 2.6094219269202599e+00 1.6341936423047592e+00 4.8518819872948677e+00 2.3783635372598209e+00 1.2668835259433096e+00 -4.9678341145220672e+00 -2.1755276655932039e+00 -1.7459034100336421e+00 -4.9030835519481393e+00 -2.5166002868983712e+00 -1.3531486154013834e+00 4.9564646969589123e+00 2.1237450984806543e+00 1.6684139758371828e+00 3.3720638666186971e+00 2.2111093295984765e+00 1.5538037200427937e+00 -4.0939971697062623e+00 -2.0068964462453165e+00 -1.2127852223431175e+00 -2.5753853291663158e+00 -5.8741564169905374e+00 -1.4570994147144356e+00 2.6094219269202599e+00 5.5847767858062634e+00 1.1322563419817813e+00 2.3874304870000338e+00 3.7787371993514998e+00 1.0205708131735682e+00 -2.1237865395130013e+00 -3.4056333274051798e+00 -1.1992560862821271e+00 -2.2638858276068814e+00 -3.7508886900317195e+00 -1.0127326103725169e+00 2.1862474428486505e+00 3.3973252527513624e+00 1.1824540407710107e+00 1.8988619172556667e+00 2.6031135282732007e+00 1.1550753297125167e+00 -2.1189040777384109e+00 -2.3332743317548865e+00 -8.2126841426979569e-01 -1.7631708988144303e+00 -1.4443501636411975e+00 -4.7124917374841813e+00 1.6341936423047592e+00 1.1322563419817810e+00 4.4906836958965508e+00 1.3310918187279295e+00 1.0699612215929719e+00 2.4772417379967773e+00 -1.5025848897660052e+00 -1.0621969469401604e+00 -2.7318958238953117e+00 -1.3077164442836073e+00 -1.0819941516509215e+00 -2.4726145069452103e+00 1.6636690984070053e+00 1.1431008813628831e+00 2.7421732019257554e+00 1.2596730566799623e+00 1.0867767062189628e+00 1.6888167414899120e+00 -1.3151553832556127e+00 -8.4355388892431815e-01 -1.4819133089842911e+00 -4.2368782410528114e+00 -2.3515632928133949e+00 -1.5653758079300837e+00 4.8518819872948677e+00 2.3874304870000338e+00 1.3310918187279295e+00 6.7267748241271494e+00 2.6357155080623555e+00 1.2953243254945426e+00 -6.7667064604524807e+00 -2.4468188685328585e+00 -1.5785925564259187e+00 -3.3750115580583704e+00 -2.1959094382724356e+00 -1.1190741732583385e+00 3.4419656031527230e+00 1.9128684317595768e+00 1.4973568060271139e+00 4.1623522102959383e+00 2.1144412562852053e+00 1.2789365706484337e+00 -4.8043783653070191e+00 -2.0561640834884796e+00 -1.1396669832836759e+00 -2.2533564801507269e+00 -4.1729655055334618e+00 -1.4955563019082123e+00 2.3783635372598209e+00 3.7787371993514993e+00 1.0699612215929717e+00 2.6357155080623555e+00 6.3120524235868682e+00 1.1972946391785508e+00 -2.4328363561044832e+00 -5.8347085237146938e+00 -1.3318486313055389e+00 -2.2552754590172102e+00 -3.0132514334803155e+00 -1.0463140824429189e+00 2.1727084700447916e+00 2.6042302303111602e+00 1.3357763452012690e+00 2.1810684906751292e+00 3.9837557964363701e+00 1.2360719432438363e+00 -2.4263877107696743e+00 -3.6578501869574236e+00 -9.6538513355995592e-01 -1.2427952941659322e+00 -1.2450553151438457e+00 -2.7049118607183003e+00 1.2668835259433096e+00 1.0205708131735685e+00 2.4772417379967773e+00 1.2953243254945426e+00 1.1972946391785511e+00 4.4647754801480080e+00 -1.6149725427316706e+00 -1.3689727837401433e+00 -4.6771011827770943e+00 -1.0841457846298637e+00 -9.8692796321673226e-01 -1.4635998510598913e+00 1.2487638878926399e+00 9.8390032864652699e-01 1.6866284580336219e+00 1.3512961458688062e+00 1.2632264181093680e+00 2.6476530925567769e+00 -1.2203542636718314e+00 -8.6403613700729220e-01 -2.4306858741798947e+00 4.3110728900506547e+00 2.1384811302546183e+00 1.6959357758378091e+00 -4.9678341145220664e+00 -2.1237865395130013e+00 -1.5025848897660050e+00 -6.7667064604524807e+00 -2.4328363561044832e+00 -1.6149725427316703e+00 6.9274104638250442e+00 2.2281289197278653e+00 1.9114990268827188e+00 3.4119321173431243e+00 2.1256874321846038e+00 1.2896118371259662e+00 -3.5212327183820267e+00 -1.8289814513447424e+00 -1.6897009474994620e+00 -4.2098767396883607e+00 -2.0967095394044160e+00 -1.6178996834837671e+00 4.8152345618261085e+00 1.9900164041995527e+00 1.5281114236344080e+00 2.1246212048894240e+00 3.7053978991753218e+00 1.4670448776675493e+00 -2.1755276655932039e+00 -3.4056333274051798e+00 -1.0621969469401604e+00 -2.4468188685328576e+00 -5.8347085237146938e+00 -1.3689727837401433e+00 2.2281289197278649e+00 5.5546105383869273e+00 1.4093480775624461e+00 1.9484436527978202e+00 2.5785444347199578e+00 1.0325951656730532e+00 -1.8582613046927678e+00 -2.2896141099272151e+00 -1.2274819951709155e+00 -1.8584664411209211e+00 -3.6143836566781928e+00 -1.3068085736705606e+00 2.0378805025246405e+00 3.3057867454430756e+00 1.0564721786187301e+00 1.6533329556649714e+00 1.4374702699056536e+00 3.0406982887277594e+00 -1.7459034100336424e+00 -1.1992560862821271e+00 -2.7318958238953117e+00 -1.5785925564259189e+00 -1.3318486313055391e+00 -4.6771011827770943e+00 1.9114990268827186e+00 1.4093480775624458e+00 5.1208675743754828e+00 1.4598920525015249e+00 1.2677004011452113e+00 1.6703077348404964e+00 -1.6387197122661852e+00 -1.1716436561662831e+00 -2.0434530702532068e+00 -1.5346080907776889e+00 -1.4039069992962097e+00 -3.0165698324142372e+00 1.4730997344542192e+00 9.9213662443684680e-01 2.6371463113961102e+00 4.2573006821840611e+00 2.3273455804960892e+00 1.4696819511180514e+00 -4.9030835519481393e+00 -2.2638858276068818e+00 -1.3077164442836073e+00 -3.3750115580583704e+00 -2.2552754590172106e+00 -1.0841457846298637e+00 3.4119321173431243e+00 1.9484436527978202e+00 1.4598920525015247e+00 6.7730626281334896e+00 2.6393646505269106e+00 1.3895242463870237e+00 -6.7753020128684742e+00 -2.4434524470987293e+00 -1.6914886218887342e+00 -4.1521815762322838e+00 -2.2026050732875819e+00 -1.4519659919425429e+00 4.7632832714465883e+00 2.2500649231895804e+00 1.2162185927381459e+00 2.2753844877307272e+00 4.0828864140822239e+00 1.3786778873412964e+00 -2.5166002868983712e+00 -3.7508886900317204e+00 -1.0819941516509215e+00 -2.1959094382724356e+00 -3.0132514334803155e+00 -9.8692796321673237e-01 2.1256874321846038e+00 2.5785444347199578e+00 1.2677004011452118e+00 2.6393646505269097e+00 6.2327821115749353e+00 1.2525702232846170e+00 -2.4227704004803599e+00 -5.7236524150098047e+00 -1.3894244693357063e+00 -2.1149798352689229e+00 -3.9922179329588325e+00 -1.3641919349749674e+00 2.2098233904778462e+00 3.5857975111035509e+00 9.2359000740720054e-01 1.4431885417948389e+00 1.3874518139880447e+00 2.7063448785241579e+00 -1.3531486154013832e+00 -1.0127326103725169e+00 -2.4726145069452103e+00 -1.1190741732583385e+00 -1.0463140824429191e+00 -1.4635998510598913e+00 1.2896118371259662e+00 1.0325951656730532e+00 1.6703077348404964e+00 1.3895242463870237e+00 1.2525702232846168e+00 4.5108103034672773e+00 -1.6893525030268559e+00 -1.3986802565594947e+00 -4.7046363921267726e+00 -1.2301366756124903e+00 -1.1977776366582289e+00 -2.6872185768840069e+00 1.2693873419912380e+00 9.8288738308744328e-01 2.4406064101839493e+00 -4.3296409670004437e+00 -2.2983820158384800e+00 -1.7835229777190873e+00 4.9564646969589123e+00 2.1862474428486505e+00 1.6636690984070053e+00 3.4419656031527230e+00 2.1727084700447916e+00 1.2487638878926399e+00 -3.5212327183820267e+00 -1.8582613046927681e+00 -1.6387197122661850e+00 -6.7753020128684760e+00 -2.4227704004803599e+00 -1.6893525030268559e+00 6.8938356177698807e+00 2.2115256763755213e+00 2.0042547929688155e+00 4.2438313175429627e+00 1.9658456903234285e+00 1.5685296820893351e+00 -4.9099215371735330e+00 -1.9569135585807811e+00 -1.3736222683456649e+00 -1.9500474561862353e+00 -3.6961919185056558e+00 -1.4189071244629452e+00 2.1237450984806543e+00 3.3973252527513624e+00 1.1431008813628829e+00 1.9128684317595768e+00 2.6042302303111602e+00 9.8390032864652699e-01 -1.8289814513447424e+00 -2.2896141099272151e+00 -1.1716436561662833e+00 -2.4434524470987284e+00 -5.7236524150098056e+00 -1.3986802565594945e+00 2.2115256763755209e+00 5.4085563956598213e+00 1.4409141885894541e+00 2.0287827484871261e+00 3.5748454323735444e+00 1.3534322408383896e+00 -2.0544406004731703e+00 -3.2754988676532095e+00 -9.3211660224852855e-01 -1.6828126241725887e+00 -1.5706448549928784e+00 -3.1213902364997095e+00 1.6684139758371828e+00 1.1824540407710107e+00 2.7421732019257554e+00 1.4973568060271139e+00 1.3357763452012692e+00 1.6866284580336222e+00 -1.6897009474994622e+00 -1.2274819951709155e+00 -2.0434530702532068e+00 -1.6914886218887342e+00 -1.3894244693357058e+00 -4.7046363921267726e+00 2.0042547929688155e+00 1.4409141885894541e+00 5.1248795479807701e+00 1.6263214998206545e+00 1.3620985065182198e+00 3.0110504608962296e+00 -1.7323448810929791e+00 -1.1336917615804518e+00 -2.6952519699566855e+00 -2.8845672299281606e+00 -1.9751888058882945e+00 -1.4464291008388961e+00 3.3720638666186971e+00 1.8988619172556667e+00 1.2596730566799623e+00 4.1623522102959383e+00 2.1810684906751292e+00 1.3512961458688062e+00 -4.2098767396883607e+00 -1.8584664411209211e+00 -1.5346080907776889e+00 -4.1521815762322838e+00 -2.1149798352689229e+00 -1.2301366756124903e+00 4.2438313175429627e+00 2.0287827484871261e+00 1.6263214998206545e+00 6.1519269723852119e+00 2.2157758588773535e+00 1.5991970176838404e+00 -6.6835488209940053e+00 -2.3758539330171362e+00 -1.6253138528241862e+00 -1.9465499390445840e+00 -2.9705696256099960e+00 -1.4654371631653234e+00 2.2111093295984765e+00 2.6031135282732003e+00 1.0867767062189628e+00 2.1144412562852049e+00 3.9837557964363701e+00 1.2632264181093682e+00 -2.0967095394044160e+00 -3.6143836566781928e+00 -1.4039069992962097e+00 -2.2026050732875815e+00 -3.9922179329588330e+00 -1.1977776366582289e+00 1.9658456903234283e+00 3.5748454323735439e+00 1.3620985065182201e+00 2.2157758588773540e+00 6.0961524925133714e+00 1.5842271378486801e+00 -2.2613075833478806e+00 -5.6806960343494612e+00 -1.2292069695754666e+00 -1.4167367742663510e+00 -1.4564700114149658e+00 -2.0338674137722532e+00 1.5538037200427937e+00 1.1550753297125167e+00 1.6888167414899120e+00 1.2789365706484337e+00 1.2360719432438363e+00 2.6476530925567765e+00 -1.6178996834837669e+00 -1.3068085736705608e+00 -3.0165698324142367e+00 -1.4519659919425429e+00 -1.3641919349749674e+00 -2.6872185768840069e+00 1.5685296820893349e+00 1.3534322408383899e+00 3.0110504608962296e+00 1.5991970176838401e+00 1.5842271378486799e+00 5.0491946871732765e+00 -1.5138645407717404e+00 -1.2013361315829274e+00 -4.6590591590456967e+00 3.3683443693743409e+00 2.2913797739713275e+00 1.6258278346034820e+00 -4.0939971697062623e+00 -2.1189040777384109e+00 -1.3151553832556127e+00 -4.8043783653070191e+00 -2.4263877107696743e+00 -1.2203542636718316e+00 4.8152345618261077e+00 2.0378805025246405e+00 1.4730997344542192e+00 4.7632832714465883e+00 2.2098233904778462e+00 1.2693873419912378e+00 -4.9099215371735339e+00 -2.0544406004731703e+00 -1.7323448810929791e+00 -6.6835488209940035e+00 -2.2613075833478806e+00 -1.5138645407717404e+00 7.5449836905337762e+00 2.3219563053553203e+00 1.4134041577432224e+00 1.8337903885872591e+00 2.5479260807534110e+00 1.1418268121475361e+00 -2.0068964462453165e+00 -2.3332743317548865e+00 -8.4355388892431815e-01 -2.0561640834884796e+00 -3.6578501869574236e+00 -8.6403613700729220e-01 1.9900164041995527e+00 3.3057867454430760e+00 9.9213662443684680e-01 2.2500649231895804e+00 3.5857975111035509e+00 9.8288738308744328e-01 -1.9569135585807813e+00 -3.2754988676532095e+00 -1.1336917615804518e+00 -2.3758539330171362e+00 -5.6806960343494612e+00 -1.2013361315829276e+00 2.3219563053553198e+00 5.5078090834149425e+00 9.2576709942316160e-01 1.1936541526808675e+00 1.0421478342046537e+00 1.6356128887489414e+00 -1.2127852223431175e+00 -8.2126841426979569e-01 -1.4819133089842911e+00 -1.1396669832836761e+00 -9.6538513355995592e-01 -2.4306858741798947e+00 1.5281114236344080e+00 1.0564721786187301e+00 2.6371463113961102e+00 1.2162185927381459e+00 9.2359000740720054e-01 2.4406064101839497e+00 -1.3736222683456649e+00 -9.3211660224852855e-01 -2.6952519699566855e+00 -1.6253138528241864e+00 -1.2292069695754668e+00 -4.6590591590456967e+00 1.4134041577432224e+00 9.2576709942316193e-01 4.5535447018375663e+00 273 274 275 345 346 347 357 358 359 288 289 290 276 277 278 1107 1108 1109 1110 1111 1112 291 292 293 8.3675412164250762e+00 7.7809577820792908e-01 3.5111599553785444e+00 -8.7214061471860269e+00 -4.6885777075784463e-01 -3.4831459925267012e+00 -5.9911473814546943e+00 -7.5842897594130754e-01 -2.8988349528619404e+00 5.6731528725987159e+00 3.8370035547607839e-01 3.1436306213535685e+00 5.8279184304144946e+00 7.2435652007332607e-01 2.9975914485155668e+00 -5.5156039773727112e+00 -2.0954113978554964e-01 -3.0709629208517160e+00 -4.1585307525684145e+00 -6.6158935491422177e-01 -2.8397228237591774e+00 4.5180757391435602e+00 2.1226458764159012e-01 2.6402846647518530e+00 7.7809577820792908e-01 4.7270796088321498e+00 7.2124958164363473e-01 -4.7474681979154243e-01 -4.4915875469837960e+00 -3.4991349451785692e-01 -7.8337657333695698e-01 -2.4327061527986653e+00 -6.0903432383027334e-01 3.7918970552566250e-01 2.2513559144774904e+00 3.4391976845732347e-01 7.1809037401475806e-01 2.3518144902650415e+00 5.9123996605485207e-01 -5.0463596792155518e-01 -2.2230685408334998e+00 -4.6680979826230329e-01 -6.4892658307895745e-01 -1.2677977093770239e+00 -6.0653532764595153e-01 5.3631008638066269e-01 1.0849099364183035e+00 3.7588362810057424e-01 3.5111599553785435e+00 7.2124958164363462e-01 7.8100381625253910e+00 -3.4925052551951925e+00 -3.4612026760171949e-01 -7.2979063285527035e+00 -3.2285776387849654e+00 -6.5544391150617531e-01 -4.7655746117592672e+00 3.1522356428921849e+00 3.5101807635422028e-01 5.1412025401867600e+00 2.9816437974162300e+00 5.9230144806612584e-01 4.6294791108258693e+00 -3.0855642805503467e+00 -1.9623902832525339e-01 -5.0852997946984955e+00 -2.8289293934324999e+00 -6.1603299087269581e-01 -3.7768603625321040e+00 2.9905371722760474e+00 1.4926709224186313e-01 3.3449212840045504e+00 -8.7214061471860251e+00 -4.7474681979154254e-01 -3.4925052551951925e+00 9.2539611130359649e+00 8.1004602123738792e-02 3.4082697220124114e+00 6.4361293749532509e+00 4.2968781641200510e-01 2.9944444564987869e+00 -6.1244126611167333e+00 -2.5091507063155091e-02 -3.2869486112404722e+00 -6.3193347268364075e+00 -5.7235664846304868e-01 -2.9242016790373051e+00 5.9531650540120085e+00 3.0009856690544848e-02 3.0515097489349086e+00 4.5362662076510256e+00 5.4137479383405818e-01 2.9849341701879193e+00 -5.0143682145130839e+00 -9.8820937426008122e-03 -2.7355025521610510e+00 -4.6885777075784463e-01 -4.4915875469837969e+00 -3.4612026760171943e-01 8.1004602123738778e-02 4.5180462818285960e+00 6.0657276661490678e-02 4.2945814104060065e-01 2.2692618955341861e+00 3.0645245294042767e-01 -2.8222593735188893e-02 -2.2716082088006093e+00 -2.3641922281250848e-02 -2.6607019376519125e-01 -2.2336546520159111e+00 -1.8873389503722179e-01 5.3539457580297059e-02 2.2217776444813691e+00 4.5684000383514597e-02 2.3705866955344895e-01 1.1171765129310827e+00 1.7123966999678061e-01 -3.7910312039860665e-02 -1.1294119269749168e+00 -2.5537315062021441e-02 -3.4831459925267008e+00 -3.4991349451785692e-01 -7.2979063285527035e+00 3.4082697220124110e+00 6.0657276661490678e-02 6.9675600625167258e+00 3.0064214008996335e+00 3.0913874800189989e-01 4.4221758111343581e+00 -2.9744601127464971e+00 -1.9736999469540353e-02 -4.7857321435355127e+00 -2.9100904373665735e+00 -4.0580215714998102e-01 -4.2945392921937593e+00 3.0602703136146330e+00 2.6287675927855032e-02 4.6757799763425005e+00 2.6552944407763546e+00 3.8522454451618299e-01 3.3879114740365903e+00 -2.7625593346632611e+00 -5.8555939700502468e-03 -3.0752495597481930e+00 -5.9911473814546943e+00 -7.8337657333695709e-01 -3.2285776387849654e+00 6.4361293749532518e+00 4.2945814104060059e-01 3.0064214008996335e+00 9.1605401191217979e+00 8.5986409012471832e-01 3.3033587911132680e+00 -8.7791001042718548e+00 -4.3906458475792065e-01 -3.4353255986746145e+00 -4.8850511179992644e+00 -7.3239419672962669e-01 -2.6909896648620388e+00 4.5493936411406208e+00 1.8980899429539005e-01 2.9774789108239861e+00 5.8284687172705691e+00 7.1478202675779412e-01 2.9314219997923225e+00 -6.3192332487604261e+00 -2.3907789739399887e-01 -2.8637882003075887e+00 -7.5842897594130754e-01 -2.4327061527986653e+00 -6.5544391150617520e-01 4.2968781641200510e-01 2.2692618955341861e+00 3.0913874800189983e-01 8.5986409012471843e-01 4.7625871155074559e+00 6.2092268166088815e-01 -4.2947018371688755e-01 -4.5736063928305493e+00 -3.8162434683031321e-01 -7.3649640902169167e-01 -1.2719534973373252e+00 -5.2864912323927093e-01 4.8504288196159956e-01 1.1133622234471270e+00 4.5113440620168982e-01 7.1324036481572184e-01 2.4036115173063797e+00 5.8191440819896045e-01 -5.6343958463415833e-01 -2.2705567088286092e+00 -3.9739286248767836e-01 -2.8988349528619404e+00 -6.0903432383027334e-01 -4.7655746117592681e+00 2.9944444564987869e+00 3.0645245294042767e-01 4.4221758111343572e+00 3.3033587911132685e+00 6.2092268166088815e-01 6.9922073001939333e+00 -3.4517661929716326e+00 -3.9112237260596172e-01 -7.3345537236474021e+00 -2.6933284305854350e+00 -5.2614829496944882e-01 -3.0584015306903041e+00 2.6606354847529694e+00 1.7612993590578963e-01 3.3878385332189977e+00 2.9653227932589514e+00 5.8919476696286532e-01 4.6494550133975370e+00 -2.8798319492049678e+00 -1.6639484606428709e-01 -4.2931467918478514e+00 5.6731528725987159e+00 3.7918970552566250e-01 3.1522356428921849e+00 -6.1244126611167351e+00 -2.8222593735188907e-02 -2.9744601127464971e+00 -8.7791001042718531e+00 -4.2947018371688750e-01 -3.4517661929716330e+00 8.5461305253673849e+00 6.8819050359517589e-02 3.5414140301870636e+00 4.5250063120998760e+00 4.8831972470335661e-01 2.6632107941937768e+00 -4.2748831294534160e+00 -4.9140624572143032e-03 -2.9133180944924191e+00 -5.5138877593566313e+00 -5.0428652313061306e-01 -3.0420532364542234e+00 5.9479939441326586e+00 3.0564882451367230e-02 3.0247371693917433e+00 3.8370035547607850e-01 2.2513559144774908e+00 3.5101807635422028e-01 -2.5091507063155095e-02 -2.2716082088006093e+00 -1.9736999469540339e-02 -4.3906458475792065e-01 -4.5736063928305493e+00 -3.9112237260596172e-01 6.8819050359517589e-02 4.6476486166725923e+00 6.0143206434814696e-02 2.1133182624262795e-01 1.0906411587591787e+00 1.9296237590637305e-01 -2.4787697404978583e-02 -1.1253773332565524e+00 -2.4026080594138393e-02 -2.2936601379541144e-01 -2.2670216196284096e+00 -2.1231097517597308e-01 5.4458570943241823e-02 2.2479678646068582e+00 4.3072769150205421e-02 3.1436306213535685e+00 3.4391976845732347e-01 5.1412025401867600e+00 -3.2869486112404722e+00 -2.3641922281250852e-02 -4.7857321435355127e+00 -3.4353255986746145e+00 -3.8162434683031315e-01 -7.3345537236474012e+00 3.5414140301870631e+00 6.0143206434814703e-02 7.8602766506459121e+00 2.9591705490744733e+00 4.4798132387921458e-01 3.3481832635219977e+00 -2.8858680558258438e+00 -5.5715232782474425e-03 -3.7960812824889714e+00 -3.0196187547892386e+00 -4.6443067045919306e-01 -5.0717366264855936e+00 2.9835458199150642e+00 2.3224164077651661e-02 4.6384413218028060e+00 5.8279184304144946e+00 7.1809037401475806e-01 2.9816437974162300e+00 -6.3193347268364075e+00 -2.6607019376519125e-01 -2.9100904373665735e+00 -4.8850511179992644e+00 -7.3649640902169156e-01 -2.6933284305854346e+00 4.5250063120998760e+00 2.1133182624262795e-01 2.9591705490744733e+00 8.7904802043598842e+00 8.1905018816462727e-01 3.1481450946336289e+00 -8.3485795953386432e+00 -4.1403481188240199e-01 -3.2622518556546591e+00 -5.6868999056759399e+00 -7.4537213222786536e-01 -3.0241074791937206e+00 6.0964603989759993e+00 4.1350115847513713e-01 2.8008187616760516e+00 7.2435652007332607e-01 2.3518144902650415e+00 5.9230144806612584e-01 -5.7235664846304857e-01 -2.2336546520159111e+00 -4.0580215714998102e-01 -7.3239419672962669e-01 -1.2719534973373252e+00 -5.2614829496944870e-01 4.8831972470335655e-01 1.0906411587591787e+00 4.4798132387921458e-01 8.1905018816462727e-01 4.6030114914393145e+00 5.9187829202010811e-01 -3.7909683221168672e-01 -4.3594643313788541e+00 -3.4208084970646446e-01 -7.1165918894000235e-01 -2.3622100471652221e+00 -6.1535641852353906e-01 3.6378043340305466e-01 2.1818153874337791e+00 2.5722665638398395e-01 2.9975914485155668e+00 5.9123996605485196e-01 4.6294791108258693e+00 -2.9242016790373051e+00 -1.8873389503722185e-01 -4.2945392921937593e+00 -2.6909896648620388e+00 -5.2864912323927116e-01 -3.0584015306903041e+00 2.6632107941937768e+00 1.9296237590637305e-01 3.3481832635219977e+00 3.1481450946336289e+00 5.9187829202010800e-01 6.7293179993511529e+00 -3.2928954296780373e+00 -3.7369874201985465e-01 -7.0036560719057910e+00 -2.7104198659199694e+00 -5.7988303779753991e-01 -4.5452841510399997e+00 2.8095593021543772e+00 2.9488416411255436e-01 4.1949006721308324e+00 -5.5156039773727121e+00 -5.0463596792155518e-01 -3.0855642805503471e+00 5.9531650540120076e+00 5.3539457580297066e-02 3.0602703136146339e+00 4.5493936411406217e+00 4.8504288196159956e-01 2.6606354847529698e+00 -4.2748831294534160e+00 -2.4787697404978604e-02 -2.8858680558258438e+00 -8.3485795953386415e+00 -3.7909683221168672e-01 -3.2928954296780373e+00 8.0644377008479360e+00 3.5885877003755298e-02 3.3638634209493645e+00 5.3948406451032476e+00 3.2858090636183118e-01 2.9446300263987952e+00 -5.8227703389390433e+00 5.4713746307374312e-03 -2.7650714796615317e+00 -2.0954113978554964e-01 -2.2230685408335003e+00 -1.9623902832525339e-01 3.0009856690544838e-02 2.2217776444813691e+00 2.6287675927855015e-02 1.8980899429539005e-01 1.1133622234471270e+00 1.7612993590578963e-01 -4.9140624572143032e-03 -1.1253773332565524e+00 -5.5715232782474252e-03 -4.1403481188240199e-01 -4.3594643313788533e+00 -3.7369874201985470e-01 3.5885877003755305e-02 4.3918304260265479e+00 3.1230591948370145e-02 3.6838881767910309e-01 2.1926327341180709e+00 3.3612220411439642e-01 4.3964684563727301e-03 -2.2116928226042099e+00 5.7388857269442357e-03 -3.0709629208517160e+00 -4.6680979826230329e-01 -5.0852997946984955e+00 3.0515097489349081e+00 4.5684000383514591e-02 4.6757799763424996e+00 2.9774789108239865e+00 4.5113440620168982e-01 3.3878385332189982e+00 -2.9133180944924195e+00 -2.4026080594138410e-02 -3.7960812824889714e+00 -3.2622518556546591e+00 -3.4208084970646441e-01 -7.0036560719057910e+00 3.3638634209493641e+00 3.1230591948370141e-02 7.4696078499688268e+00 2.9564977663780634e+00 3.0257724948083942e-01 4.9162935814838358e+00 -3.1028169760875284e+00 2.2904805484920765e-03 -4.5644827919209003e+00 -4.1585307525684136e+00 -6.4892658307895745e-01 -2.8289293934324999e+00 4.5362662076510247e+00 2.3705866955344895e-01 2.6552944407763546e+00 5.8284687172705683e+00 7.1324036481572173e-01 2.9653227932589514e+00 -5.5138877593566313e+00 -2.2936601379541141e-01 -3.0196187547892386e+00 -5.6868999056759391e+00 -7.1165918894000246e-01 -2.7104198659199694e+00 5.3948406451032476e+00 3.6838881767910309e-01 2.9564977663780634e+00 7.9878334829839144e+00 7.2782697473122704e-01 3.2543258875936649e+00 -8.3880906354077727e+00 -4.5656304096512967e-01 -3.2724728738653233e+00 -6.6158935491422188e-01 -1.2677977093770239e+00 -6.1603299087269592e-01 5.4137479383405829e-01 1.1171765129310827e+00 3.8522454451618293e-01 7.1478202675779412e-01 2.4036115173063797e+00 5.8919476696286521e-01 -5.0428652313061295e-01 -2.2670216196284101e+00 -4.6443067045919301e-01 -7.4537213222786547e-01 -2.3622100471652221e+00 -5.7988303779753991e-01 3.2858090636183113e-01 2.1926327341180709e+00 3.0257724948083942e-01 7.2782697473122704e-01 4.6207102316191246e+00 6.7541673998961604e-01 -4.0131669141221032e-01 -4.4371016198040030e+00 -2.9206660182007410e-01 -2.8397228237591765e+00 -6.0653532764595153e-01 -3.7768603625321044e+00 2.9849341701879193e+00 1.7123966999678061e-01 3.3879114740365903e+00 2.9314219997923225e+00 5.8191440819896045e-01 4.6494550133975370e+00 -3.0420532364542234e+00 -2.1231097517597314e-01 -5.0717366264855936e+00 -3.0241074791937201e+00 -6.1535641852353895e-01 -4.5452841510399997e+00 2.9446300263987948e+00 3.3612220411439636e-01 4.9162935814838358e+00 3.2543258875936640e+00 6.7541673998961604e-01 7.4777247912227613e+00 -3.2094285445655810e+00 -3.3049030095429005e-01 -7.0375037200830244e+00 4.5180757391435602e+00 5.3631008638066269e-01 2.9905371722760474e+00 -5.0143682145130839e+00 -3.7910312039860651e-02 -2.7625593346632611e+00 -6.3192332487604261e+00 -5.6343958463415833e-01 -2.8798319492049673e+00 5.9479939441326586e+00 5.4458570943241809e-02 2.9835458199150637e+00 6.0964603989759993e+00 3.6378043340305455e-01 2.8095593021543772e+00 -5.8227703389390433e+00 4.3964684563727310e-03 -3.1028169760875288e+00 -8.3880906354077727e+00 -4.0131669141221027e-01 -3.2094285445655810e+00 8.9819323553681087e+00 4.3721028902897349e-02 3.1709945101758459e+00 2.1226458764159015e-01 1.0849099364183035e+00 1.4926709224186316e-01 -9.8820937426008088e-03 -1.1294119269749168e+00 -5.8555939700502468e-03 -2.3907789739399887e-01 -2.2705567088286092e+00 -1.6639484606428709e-01 3.0564882451367233e-02 2.2479678646068582e+00 2.3224164077651661e-02 4.1350115847513713e-01 2.1818153874337791e+00 2.9488416411255436e-01 5.4713746307374729e-03 -2.2116928226042099e+00 2.2904805484920904e-03 -4.5656304096512967e-01 -4.4371016198040030e+00 -3.3049030095429005e-01 4.3721028902897349e-02 4.5340698897527982e+00 3.3074840008066070e-02 2.6402846647518530e+00 3.7588362810057424e-01 3.3449212840045508e+00 -2.7355025521610510e+00 -2.5537315062021441e-02 -3.0752495597481935e+00 -2.8637882003075883e+00 -3.9739286248767836e-01 -4.2931467918478514e+00 3.0247371693917433e+00 4.3072769150205428e-02 4.6384413218028060e+00 2.8008187616760520e+00 2.5722665638398395e-01 4.1949006721308324e+00 -2.7650714796615308e+00 5.7388857269442773e-03 -4.5644827919209003e+00 -3.2724728738653228e+00 -2.9206660182007410e-01 -7.0375037200830235e+00 3.1709945101758468e+00 3.3074840008066070e-02 6.7921195856617773e+00 345 346 347 393 394 395 405 406 407 357 358 359 1107 1108 1109 1134 1135 1136 1137 1138 1139 1110 1111 1112 8.1569839935452073e+00 7.7508975226591359e-01 3.4417617982897535e+00 -8.5085233417873205e+00 -4.5575645908077228e-01 -3.4147975582819523e+00 -5.8073996965213572e+00 -7.5437522580535032e-01 -2.8279983108433377e+00 5.4903572695424891e+00 3.6854405939125734e-01 3.0821273759169774e+00 5.7614026058979952e+00 7.2029059002114970e-01 2.9528911743633639e+00 -5.4543383228457110e+00 -2.0658909392739608e-01 -3.0280004554857705e+00 -4.0736952652003673e+00 -6.5551355117799970e-01 -2.7936713505357718e+00 4.4352127573690607e+00 2.0830992831319578e-01 2.5876873265767388e+00 7.7508975226591359e-01 4.6080192727323457e+00 7.2116138098637506e-01 -4.7208734706893007e-01 -4.3622983725935427e+00 -3.4606574818672181e-01 -7.8352024520379226e-01 -2.3336674342852755e+00 -6.0794447503293025e-01 3.7736467953514857e-01 2.1475730025753852e+00 3.4371422393120632e-01 7.1829587281037843e-01 2.3499416515549756e+00 5.9225856759748463e-01 -5.0173336259865897e-01 -2.2211948479228734e+00 -4.6609404227904860e-01 -6.4863304001448130e-01 -1.2509352069009241e+00 -6.0967102341019863e-01 5.3522369027442196e-01 1.0625619348399085e+00 3.7264111639383402e-01 3.4417617982897544e+00 7.2116138098637506e-01 7.6355661736610267e+00 -3.4217554357838695e+00 -3.3350993231326487e-01 -7.1137572603836183e+00 -3.1647262722136205e+00 -6.5309275285822155e-01 -4.6069825338437838e+00 3.0878289460557502e+00 3.3856452672271192e-01 4.9941371089982303e+00 2.9271947037917458e+00 5.8791295681153755e-01 4.5850994106149701e+00 -3.0366710691886385e+00 -1.9350750040806994e-01 -5.0515414198371236e+00 -2.7755318910785030e+00 -6.1218762735599608e-01 -3.7232467458793801e+00 2.9418992201273824e+00 1.4465894841492580e-01 3.2807252666696836e+00 -8.5085233417873187e+00 -4.7208734706893007e-01 -3.4217554357838700e+00 9.0460230487571192e+00 6.4309690182275295e-02 3.3365568226446918e+00 6.2545343362903054e+00 4.2950633353983975e-01 2.9242299738179716e+00 -5.9446347135596236e+00 -1.1867054152846548e-02 -3.2283101335832813e+00 -6.2573918789122187e+00 -5.6466949697388469e-01 -2.8696431885693068e+00 5.8950511377715991e+00 2.3123538018748661e-02 3.0006735242339904e+00 4.4525203960229662e+00 5.3509175203379111e-01 2.9380858693307759e+00 -4.9375789845828288e+00 -3.4074155789912478e-03 -2.6798374320909737e+00 -4.5575645908077228e-01 -4.3622983725935427e+00 -3.3350993231326492e-01 6.4309690182275267e-02 4.3922603383440633e+00 4.8530057041893365e-02 4.1433852476071353e-01 2.1636932638142206e+00 2.9422918626937561e-01 -1.1580146889643136e-02 -2.1715120644549146e+00 -9.9870816425212082e-03 -2.5650660097853067e-01 -2.2270710001748562e+00 -1.8103883663599377e-01 4.0649765516865943e-02 2.2201508697391845e+00 3.4742534073277237e-02 2.2750340821480744e-01 1.0948187184296490e+00 1.6187702638272353e-01 -2.2958181725716093e-02 -1.1100417531038029e+00 -1.4842953175489969e-02 -3.4147975582819532e+00 -3.4606574818672181e-01 -7.1137572603836201e+00 3.3365568226446927e+00 4.8530057041893351e-02 6.7814738508374406e+00 2.9384093160557088e+00 3.0808005990994280e-01 4.2610121034261557e+00 -2.9076141139696361e+00 -9.3002298063140209e-03 -4.6350512645665782e+00 -2.8614574368321133e+00 -3.9889820166048356e-01 -4.2461545459320007e+00 3.0186043077328284e+00 2.0402488651845872e-02 4.6347203794728982e+00 2.6034283578216413e+00 3.7846576120074721e-01 3.3282024458748993e+00 -2.7131296951711690e+00 -1.2141871509082831e-03 -3.0104457087291938e+00 -5.8073996965213590e+00 -7.8352024520379226e-01 -3.1647262722136209e+00 6.2545343362903072e+00 4.1433852476071342e-01 2.9384093160557083e+00 8.7644519146653561e+00 8.5460046750750862e-01 3.2037562110250706e+00 -8.3836097948333030e+00 -4.1785233582837777e-01 -3.3492610146602591e+00 -4.8018931270575811e+00 -7.2857562417096622e-01 -2.6352755414722573e+00 4.4689270677349509e+00 1.8508995994929545e-01 2.9282456589429540e+00 5.6777890063004417e+00 7.0851160204223695e-01 2.8756917941405851e+00 -6.1727997065788109e+00 -2.3259234905661580e-01 -2.7968401518181834e+00 -7.5437522580535032e-01 -2.3336674342852755e+00 -6.5309275285822155e-01 4.2950633353983975e-01 2.1636932638142210e+00 3.0808005990994292e-01 8.5460046750750862e-01 4.4846073324595208e+00 6.1419327091536491e-01 -4.2556513957663561e-01 -4.2908860996424067e+00 -3.8126144642107868e-01 -7.3670185438397051e-01 -1.2532917245116573e+00 -5.2670830600999063e-01 4.8287439662319531e-01 1.0923040786293448e+00 4.5107354587790832e-01 7.1177671824851718e-01 2.3297736749329800e+00 5.8199598439038414e-01 -5.6211569615310419e-01 -2.1925330913967236e+00 -3.9428035580430981e-01 -2.8279983108433377e+00 -6.0794447503293025e-01 -4.6069825338437838e+00 2.9242299738179716e+00 2.9422918626937561e-01 4.2610121034261548e+00 3.2037562110250706e+00 6.1419327091536480e-01 6.6285070847033083e+00 -3.3513699310387475e+00 -3.7516167438691062e-01 -6.9782345437126150e+00 -2.6378366194141658e+00 -5.2138419238648581e-01 -2.9906188536118443e+00 2.6083447226259411e+00 1.7340847542475593e-01 3.3242794422260324e+00 2.9009188997998030e+00 5.8379182090011827e-01 4.5238271158428045e+00 -2.8200449459725334e+00 -1.6113241170328665e-01 -4.1617898150300565e+00 5.4903572695424891e+00 3.7736467953514857e-01 3.0878289460557502e+00 -5.9446347135596236e+00 -1.1580146889643126e-02 -2.9076141139696361e+00 -8.3836097948333048e+00 -4.2556513957663561e-01 -3.3513699310387479e+00 8.1572269873190084e+00 5.1412825987798692e-02 3.4526220189529919e+00 4.4399219434101065e+00 4.8026563173866826e-01 2.6116071966101031e+00 -4.1954826963258380e+00 2.6875354106441793e-03 -2.8669634626180818e+00 -5.3649436122177319e+00 -4.9696819878171833e-01 -2.9899877884711690e+00 5.8011646166648916e+00 2.2382812575735218e-02 2.9638771344787918e+00 3.6854405939125728e-01 2.1475730025753852e+00 3.3856452672271192e-01 -1.1867054152846560e-02 -2.1715120644549146e+00 -9.3002298063140070e-03 -4.1785233582837772e-01 -4.2908860996424067e+00 -3.7516167438691056e-01 5.1412825987798762e-02 4.3738307748104788e+00 4.4673751738647204e-02 1.9988545725755449e-01 1.0671718545903750e+00 1.8532834645770865e-01 -1.3184582327074413e-02 -1.1077228030107551e+00 -1.3388692071738467e-02 -2.1709740774634145e-01 -2.1912924883275169e+00 -2.0245096638850987e-01 4.0159037418029696e-02 2.1728378234593557e+00 3.1734937734405194e-02 3.0821273759169774e+00 3.4371422393120632e-01 4.9941371089982303e+00 -3.2283101335832809e+00 -9.9870816425212360e-03 -4.6350512645665791e+00 -3.3492610146602586e+00 -3.8126144642107868e-01 -6.9782345437126150e+00 3.4526220189529919e+00 4.4673751738647204e-02 7.5209868041563954e+00 2.9113546854520993e+00 4.4338297937593202e-01 3.2875133255704876e+00 -2.8396645482401248e+00 1.3676569649443519e-03 -3.7457452598336944e+00 -2.9597033218032434e+00 -4.5910604569206659e-01 -4.9599715015370016e+00 2.9308349379648408e+00 1.7215961744934758e-02 4.5163653309247778e+00 5.7614026058979952e+00 7.1829587281037843e-01 2.9271947037917458e+00 -6.2573918789122178e+00 -2.5650660097853067e-01 -2.8614574368321128e+00 -4.8018931270575802e+00 -7.3670185438397062e-01 -2.6378366194141663e+00 4.4399219434101074e+00 1.9988545725755452e-01 2.9113546854520993e+00 8.8723826067975562e+00 8.1914105035914930e-01 3.1156679047935283e+00 -8.4293916850602049e+00 -4.2037815834217523e-01 -3.2270441166107764e+00 -5.6535749582717241e+00 -7.4115092379182346e-01 -2.9817921010521267e+00 6.0685444931960681e+00 4.1741515706941540e-01 2.7539129798718127e+00 7.2029059002114970e-01 2.3499416515549756e+00 5.8791295681153755e-01 -5.6466949697388469e-01 -2.2270710001748562e+00 -3.9889820166048356e-01 -7.2857562417096622e-01 -1.2532917245116573e+00 -5.2138419238648581e-01 4.8026563173866832e-01 1.0671718545903750e+00 4.4338297937593196e-01 8.1914105035914941e-01 4.7208103369456031e+00 5.9027585863173848e-01 -3.6653187656840391e-01 -4.4732726487917089e+00 -3.3193206505183059e-01 -7.1021695065841040e-01 -2.3861231971056593e+00 -6.1544303654591881e-01 3.5029667625269800e-01 2.2018347274929280e+00 2.4608570082551126e-01 2.9528911743633639e+00 5.9225856759748463e-01 4.5850994106149701e+00 -2.8696431885693068e+00 -1.8103883663599379e-01 -4.2461545459320016e+00 -2.6352755414722573e+00 -5.2670830600999063e-01 -2.9906188536118443e+00 2.6116071966101031e+00 1.8532834645770868e-01 3.2875133255704876e+00 3.1156679047935283e+00 5.9027585863173848e-01 6.8169495937818709e+00 -3.2734643663673459e+00 -3.8059913182287247e-01 -7.0954896200906941e+00 -2.6671766002704667e+00 -5.7617907958731041e-01 -4.5341737024604942e+00 2.7653934209123827e+00 2.9666258136923396e-01 4.1768743921277061e+00 -5.4543383228457110e+00 -5.0173336259865897e-01 -3.0366710691886385e+00 5.8950511377715991e+00 4.0649765516865978e-02 3.0186043077328280e+00 4.4689270677349517e+00 4.8287439662319531e-01 2.6083447226259411e+00 -4.1954826963258380e+00 -1.3184582327074409e-02 -2.8396645482401244e+00 -8.4293916850602049e+00 -3.6653187656840391e-01 -3.2734643663673464e+00 8.1500579408469243e+00 3.0546073044398676e-02 3.3404713306049989e+00 5.3650796670398933e+00 3.1673596953708949e-01 2.9069549133439487e+00 -5.7999031091616144e+00 1.0643616772589985e-02 -2.7245752905116110e+00 -2.0658909392739611e-01 -2.2211948479228734e+00 -1.9350750040806988e-01 2.3123538018748668e-02 2.2201508697391845e+00 2.0402488651845876e-02 1.8508995994929545e-01 1.0923040786293448e+00 1.7340847542475596e-01 2.6875354106441550e-03 -1.1077228030107551e+00 1.3676569649443450e-03 -4.2037815834217529e-01 -4.4732726487917089e+00 -3.8059913182287247e-01 3.0546073044398606e-02 4.5111387607571505e+00 2.6134035046095461e-02 3.7177579633179936e-01 2.2153348895565190e+00 3.4007139028739164e-01 1.3744349514684990e-02 -2.2367382989568600e+00 1.2722585855909007e-02 -3.0280004554857705e+00 -4.6609404227904860e-01 -5.0515414198371227e+00 3.0006735242339899e+00 3.4742534073277251e-02 4.6347203794728973e+00 2.9282456589429540e+00 4.5107354587790832e-01 3.3242794422260320e+00 -2.8669634626180818e+00 -1.3388692071738468e-02 -3.7457452598336944e+00 -3.2270441166107764e+00 -3.3193206505183059e-01 -7.0954896200906923e+00 3.3404713306049989e+00 2.6134035046095440e-02 7.5744024102165532e+00 2.9153749840522951e+00 2.9236372650601666e-01 4.9138338390012546e+00 -3.0627574631196097e+00 7.1009578993220471e-03 -4.5544597711552282e+00 -4.0736952652003673e+00 -6.4863304001448130e-01 -2.7755318910785030e+00 4.4525203960229662e+00 2.2750340821480744e-01 2.6034283578216413e+00 5.6777890063004417e+00 7.1177671824851718e-01 2.9009188997998030e+00 -5.3649436122177319e+00 -2.1709740774634145e-01 -2.9597033218032438e+00 -5.6535749582717241e+00 -7.1021695065841051e-01 -2.6671766002704675e+00 5.3650796670398933e+00 3.7177579633179936e-01 2.9153749840522951e+00 7.9016112941384815e+00 7.2319501441756806e-01 3.2065753748646419e+00 -8.3047865278119595e+00 -4.5830353879345676e-01 -3.2238858033861697e+00 -6.5551355117799970e-01 -1.2509352069009241e+00 -6.1218762735599586e-01 5.3509175203379111e-01 1.0948187184296490e+00 3.7846576120074721e-01 7.0851160204223684e-01 2.3297736749329800e+00 5.8379182090011839e-01 -4.9696819878171827e-01 -2.1912924883275169e+00 -4.5910604569206659e-01 -7.4115092379182324e-01 -2.3861231971056589e+00 -5.7617907958731052e-01 3.1673596953708938e-01 2.2153348895565186e+00 2.9236372650601666e-01 7.2319501441756795e-01 4.6019199819140697e+00 6.7419803731865380e-01 -3.8990166427914397e-01 -4.4134963724991163e+00 -2.8134659329016337e-01 -2.7936713505357718e+00 -6.0967102341019863e-01 -3.7232467458793801e+00 2.9380858693307759e+00 1.6187702638272353e-01 3.3282024458748989e+00 2.8756917941405851e+00 5.8199598439038414e-01 4.5238271158428036e+00 -2.9899877884711685e+00 -2.0245096638850990e-01 -4.9599715015370016e+00 -2.9817921010521267e+00 -6.1544303654591881e-01 -4.5341737024604942e+00 2.9069549133439487e+00 3.4007139028739164e-01 4.9138338390012546e+00 3.2065753748646424e+00 6.7419803731865402e-01 7.4269255956927793e+00 -3.1618567116208842e+00 -3.3057741203452395e-01 -6.9753970465348623e+00 4.4352127573690607e+00 5.3522369027442196e-01 2.9418992201273819e+00 -4.9375789845828280e+00 -2.2958181725716093e-02 -2.7131296951711690e+00 -6.1727997065788109e+00 -5.6211569615310419e-01 -2.8200449459725334e+00 5.8011646166648925e+00 4.0159037418029717e-02 2.9308349379648404e+00 6.0685444931960681e+00 3.5029667625269800e-01 2.7653934209123827e+00 -5.7999031091616144e+00 1.3744349514685046e-02 -3.0627574631196097e+00 -8.3047865278119577e+00 -3.8990166427914397e-01 -3.1618567116208842e+00 8.9101464609051906e+00 3.5551788698127397e-02 3.1196612368795944e+00 2.0830992831319578e-01 1.0625619348399085e+00 1.4465894841492580e-01 -3.4074155789912547e-03 -1.1100417531038029e+00 -1.2141871509082796e-03 -2.3259234905661574e-01 -2.1925330913967236e+00 -1.6113241170328665e-01 2.2382812575735211e-02 2.1728378234593557e+00 1.7215961744934751e-02 4.1741515706941534e-01 2.2018347274929280e+00 2.9666258136923396e-01 1.0643616772589957e-02 -2.2367382989568600e+00 7.1009578993220194e-03 -4.5830353879345664e-01 -4.4134963724991163e+00 -3.3057741203452395e-01 3.5551788698127362e-02 4.5155750301643121e+00 2.7285561460302268e-02 2.5876873265767388e+00 3.7264111639383402e-01 3.2807252666696836e+00 -2.6798374320909737e+00 -1.4842953175489990e-02 -3.0104457087291938e+00 -2.7968401518181838e+00 -3.9428035580430981e-01 -4.1617898150300565e+00 2.9638771344787918e+00 3.1734937734405194e-02 4.5163653309247778e+00 2.7539129798718127e+00 2.4608570082551121e-01 4.1768743921277052e+00 -2.7245752905116110e+00 1.2722585855908965e-02 -4.5544597711552282e+00 -3.2238858033861688e+00 -2.8134659329016354e-01 -6.9753970465348614e+00 3.1196612368795940e+00 2.7285561460302254e-02 6.7281273517271760e+00 288 289 290 357 358 359 369 370 371 303 304 305 291 292 293 1110 1111 1112 1113 1114 1115 306 307 308 7.8650834837773820e+00 1.5064133051177098e+00 3.2278188445556109e+00 -8.3163184362687304e+00 -1.3081160499564137e+00 -3.2647485711889552e+00 -5.5283672780288322e+00 -1.4112384458828449e+00 -2.6108779050350068e+00 5.3437158278444903e+00 1.0839636231896308e+00 2.9104105680394969e+00 5.3982219159842089e+00 1.3640255747657155e+00 2.7435493723409765e+00 -5.2129232922058772e+00 -8.7643999627883618e-01 -2.8544807471721558e+00 -3.7655012289692644e+00 -1.2061141159308852e+00 -2.5576409336722996e+00 4.2160890078666267e+00 8.4750610497592538e-01 2.4059693721323336e+00 1.5064133051177095e+00 5.1455657699245050e+00 1.4370719386792457e+00 -1.3269865553578084e+00 -4.7749651353644245e+00 -1.0502283755509643e+00 -1.4716049518876142e+00 -2.8446345611345238e+00 -1.1567059890006903e+00 1.0873648350076606e+00 2.5280664492606317e+00 9.9383685839157698e-01 1.3801092328577855e+00 2.7359497385997091e+00 1.1582371664126252e+00 -1.1879245613929768e+00 -2.4821871880732655e+00 -1.1049920571346381e+00 -1.2125748276023585e+00 -1.6463222247958726e+00 -1.1612739193116728e+00 1.2252035232576026e+00 1.3385271515832409e+00 8.8405437751451799e-01 3.2278188445556100e+00 1.4370719386792457e+00 7.5484367463976856e+00 -3.2880965112067324e+00 -1.0423465880351743e+00 -7.0529202978936247e+00 -2.9551846739372611e+00 -1.2517820305516869e+00 -4.5208215644110874e+00 2.9407912547104500e+00 1.0033022680428889e+00 4.9113165013195754e+00 2.7392549215982709e+00 1.1415257071259357e+00 4.4254633146341176e+00 -2.9120989309244090e+00 -8.3531212454233161e-01 -4.8940001626700553e+00 -2.5674576278740884e+00 -1.1595034044783683e+00 -3.5610050513423497e+00 2.8149727230781605e+00 7.0704423375949144e-01 3.1435305139657381e+00 -8.3163184362687304e+00 -1.3269865553578089e+00 -3.2880965112067324e+00 8.9877011622140905e+00 1.0253736586455111e+00 3.2540396377799667e+00 6.0888653295842952e+00 1.2173223149599073e+00 2.7579748499024470e+00 -5.9129308052251117e+00 -8.3747252452351639e-01 -3.1116567939138164e+00 -5.9900341874738334e+00 -1.3158753434599999e+00 -2.7444076655627381e+00 5.7565816228098310e+00 7.7947658122328956e-01 2.9156556030267651e+00 4.2233053761589048e+00 1.1977807886324905e+00 2.7722368890466660e+00 -4.8371700617994460e+00 -7.3961892011987473e-01 -2.5557460090725588e+00 -1.3081160499564137e+00 -4.7749651353644245e+00 -1.0423465880351745e+00 1.0253736586455111e+00 4.6531226959236953e+00 7.3397920941735539e-01 1.2186177738514166e+00 2.5550169218164180e+00 8.6298186544739708e-01 -8.1350953580263441e-01 -2.4001305641561950e+00 -6.8015324103853281e-01 -1.0424799759697949e+00 -2.5055749958789972e+00 -7.4667154160318905e-01 8.2878775766049961e-01 2.3515820872967921e+00 6.7324087158746970e-01 8.9754338213080409e-01 1.3841215151965707e+00 7.4954362044359979e-01 -8.0621701055938877e-01 -1.2631725248338599e+00 -5.5057419621892567e-01 -3.2647485711889552e+00 -1.0502283755509645e+00 -7.0529202978936247e+00 3.2540396377799663e+00 7.3397920941735539e-01 6.7414088661550196e+00 2.8000617197216222e+00 8.7682719266978659e-01 4.2040816451499960e+00 -2.8296094062615023e+00 -6.4017505048930545e-01 -4.5751087100073695e+00 -2.7048854141759424e+00 -9.2686029432479211e-01 -4.1101040025593862e+00 2.9230814938050198e+00 6.3410939590952942e-01 4.5002349748721739e+00 2.4466588976794181e+00 8.9095109170183662e-01 3.1930440467099426e+00 -2.6245983573596283e+00 -5.1860316933344663e-01 -2.9006365224267538e+00 -5.5283672780288322e+00 -1.4716049518876142e+00 -2.9551846739372611e+00 6.0888653295842952e+00 1.2186177738514166e+00 2.8000617197216222e+00 8.5590090648470110e+00 1.6467756547375754e+00 2.9658709523184492e+00 -8.3237811539233082e+00 -1.2610308786485298e+00 -3.1482745962046463e+00 -4.4600335273498271e+00 -1.3525011757947232e+00 -2.4419241474330717e+00 4.2655728733503917e+00 8.6372534510585841e-01 2.7533940177089740e+00 5.3469889332899427e+00 1.3206157192526624e+00 2.6170713212022054e+00 -5.9482542417696713e+00 -9.6459748661664690e-01 -2.5910145933762712e+00 -1.4112384458828449e+00 -2.8446345611345230e+00 -1.2517820305516869e+00 1.2173223149599075e+00 2.5550169218164180e+00 8.7682719266978637e-01 1.6467756547375758e+00 5.1408564972542541e+00 1.1951114246957799e+00 -1.2512834503999821e+00 -4.8195580253971357e+00 -1.0396108881069788e+00 -1.3802095973343849e+00 -1.6533941550996083e+00 -1.0034225599936346e+00 1.1392043296507375e+00 1.3756332752255593e+00 1.0145271428241163e+00 1.3459522534764943e+00 2.7578814932730440e+00 1.1102334550725927e+00 -1.3065230592075032e+00 -2.5118014459380076e+00 -9.0188373660997501e-01 -2.6108779050350068e+00 -1.1567059890006905e+00 -4.5208215644110874e+00 2.7579748499024470e+00 8.6298186544739697e-01 4.2040816451499960e+00 2.9658709523184492e+00 1.1951114246957799e+00 6.6305939523422390e+00 -3.1673049845959422e+00 -1.0534870461969008e+00 -6.9758875606188777e+00 -2.4214004853298681e+00 -9.7501111683817820e-01 -2.8573768948725333e+00 2.4575671017930816e+00 6.9285000273871744e-01 3.1921069777564974e+00 2.6622841798690451e+00 1.1068695214954760e+00 4.3558599892422709e+00 -2.6441137089222058e+00 -6.7260866234160144e-01 -4.0285565445885032e+00 5.3437158278444903e+00 1.0873648350076606e+00 2.9407912547104491e+00 -5.9129308052251117e+00 -8.1350953580263419e-01 -2.8296094062615023e+00 -8.3237811539233100e+00 -1.2512834503999823e+00 -3.1673049845959413e+00 8.2114610696145416e+00 8.9946853805083948e-01 3.3213827374242664e+00 4.2356651727201315e+00 1.1212665784885367e+00 2.4792992924037689e+00 -4.0997320060913705e+00 -6.6691342938096887e-01 -2.7688399853234533e+00 -5.1526951723980963e+00 -1.1367064976211152e+00 -2.8001146112720678e+00 5.6982970674587268e+00 7.6031296165766482e-01 2.8243957029144795e+00 1.0839636231896308e+00 2.5280664492606317e+00 1.0033022680428889e+00 -8.3747252452351639e-01 -2.4001305641561950e+00 -6.4017505048930545e-01 -1.2610308786485298e+00 -4.8195580253971357e+00 -1.0534870461969008e+00 8.9946853805083948e-01 4.7363760629425515e+00 8.0639860346288827e-01 9.0215162673523208e-01 1.3603803136351926e+00 7.2777433072335895e-01 -7.0138298754361417e-01 -1.2522910016227524e+00 -6.4759291550296838e-01 -8.9054112417754150e-01 -2.5095783744308329e+00 -8.3506282309592561e-01 8.0484372691749972e-01 2.3567351397685408e+00 6.3884263305596478e-01 2.9104105680394969e+00 9.9383685839157698e-01 4.9113165013195754e+00 -3.1116567939138156e+00 -6.8015324103853292e-01 -4.5751087100073686e+00 -3.1482745962046463e+00 -1.0396108881069788e+00 -6.9758875606188777e+00 3.3213827374242668e+00 8.0639860346288805e-01 7.5022992130277171e+00 2.7135277216694349e+00 9.7961068148267016e-01 3.1578598624388037e+00 -2.7232036748436275e+00 -6.0563953491329359e-01 -3.6081894509619925e+00 -2.7449652484560225e+00 -1.0482604037135017e+00 -4.7825469854366149e+00 2.7827792862849154e+00 5.9381792443517267e-01 4.3702571302387598e+00 5.3982219159842098e+00 1.3801092328577855e+00 2.7392549215982709e+00 -5.9900341874738334e+00 -1.0424799759697947e+00 -2.7048854141759424e+00 -4.4600335273498271e+00 -1.3802095973343851e+00 -2.4214004853298681e+00 4.2356651727201315e+00 9.0215162673523208e-01 2.7135277216694349e+00 8.2371681027373391e+00 1.5457609920145901e+00 2.8718952922617271e+00 -7.9505399579336515e+00 -1.1704746345855856e+00 -3.0414329007212735e+00 -5.2156683705111870e+00 -1.3493787052431907e+00 -2.7196038337336472e+00 5.7452208518268169e+00 1.1145210615253498e+00 2.5626446984312987e+00 1.3640255747657155e+00 2.7359497385997096e+00 1.1415257071259357e+00 -1.3158753434599999e+00 -2.5055749958789972e+00 -9.2686029432479211e-01 -1.3525011757947232e+00 -1.6533941550996083e+00 -9.7501111683817820e-01 1.1212665784885367e+00 1.3603803136351926e+00 9.7961068148267005e-01 1.5457609920145903e+00 4.9461611349965589e+00 1.1353478028491293e+00 -1.1414603225212967e+00 -4.5837623735769979e+00 -9.6416058814656702e-01 -1.2884780330407146e+00 -2.7125451358540862e+00 -1.1368308082307954e+00 1.0672617295478928e+00 2.4127854731782290e+00 7.4637861608259748e-01 2.7435493723409770e+00 1.1582371664126254e+00 4.4254633146341176e+00 -2.7444076655627381e+00 -7.4667154160318905e-01 -4.1101040025593853e+00 -2.4419241474330717e+00 -1.0034225599936348e+00 -2.8573768948725329e+00 2.4792992924037689e+00 7.2777433072335884e-01 3.1578598624388032e+00 2.8718952922617267e+00 1.1353478028491293e+00 6.4457728646599382e+00 -3.0632059050536653e+00 -9.9463206262022319e-01 -6.7362509082614395e+00 -2.4408773633088225e+00 -1.0678538124783667e+00 -4.2883359365432092e+00 2.5956711243518265e+00 7.9122067671030083e-01 3.9629717005037071e+00 -5.2129232922058772e+00 -1.1879245613929768e+00 -2.9120989309244090e+00 5.7565816228098310e+00 8.2878775766049939e-01 2.9230814938050194e+00 4.2655728733503917e+00 1.1392043296507375e+00 2.4575671017930816e+00 -4.0997320060913705e+00 -7.0138298754361428e-01 -2.7232036748436275e+00 -7.9505399579336515e+00 -1.1414603225212965e+00 -3.0632059050536653e+00 7.7936413232389068e+00 8.0076777370325281e-01 3.2040859001981525e+00 5.0603908421055541e+00 9.5359190851547049e-01 2.7000752165702187e+00 -5.6129914052737870e+00 -6.9158389807207366e-01 -2.5863012015447717e+00 -8.7643999627883606e-01 -2.4821871880732651e+00 -8.3531212454233161e-01 7.7947658122328956e-01 2.3515820872967921e+00 6.3410939590952942e-01 8.6372534510585841e-01 1.3756332752255593e+00 6.9285000273871744e-01 -6.6691342938096887e-01 -1.2522910016227524e+00 -6.0563953491329359e-01 -1.1704746345855856e+00 -4.5837623735769979e+00 -9.9463206262022319e-01 8.0076777370325292e-01 4.4705480289137132e+00 7.3079661202143642e-01 1.0009594945466160e+00 2.4232377356941561e+00 9.1774542182801611e-01 -7.3110113433362645e-01 -2.3027605638572064e+00 -5.3991771042185110e-01 -2.8544807471721558e+00 -1.1049920571346381e+00 -4.8940001626700553e+00 2.9156556030267651e+00 6.7324087158746970e-01 4.5002349748721739e+00 2.7533940177089740e+00 1.0145271428241160e+00 3.1921069777564974e+00 -2.7688399853234533e+00 -6.4759291550296838e-01 -3.6081894509619925e+00 -3.0414329007212735e+00 -9.6416058814656713e-01 -6.7362509082614404e+00 3.2040859001981521e+00 7.3079661202143642e-01 7.2138196417428047e+00 2.7389165430604567e+00 8.8885524429258167e-01 4.6684268649467624e+00 -2.9472984307774674e+00 -5.9067430994143100e-01 -4.3361479374247507e+00 -3.7655012289692644e+00 -1.2125748276023582e+00 -2.5674576278740884e+00 4.2233053761589048e+00 8.9754338213080420e-01 2.4466588976794181e+00 5.3469889332899427e+00 1.3459522534764943e+00 2.6622841798690446e+00 -5.1526951723980972e+00 -8.9054112417754150e-01 -2.7449652484560225e+00 -5.2156683705111870e+00 -1.2884780330407146e+00 -2.4408773633088225e+00 5.0603908421055541e+00 1.0009594945466160e+00 2.7389165430604567e+00 7.4188847399314479e+00 1.3459025484344793e+00 2.9053262713104977e+00 -7.9157051196073018e+00 -1.1987636937677806e+00 -2.9998856522804833e+00 -1.2061141159308855e+00 -1.6463222247958726e+00 -1.1595034044783683e+00 1.1977807886324905e+00 1.3841215151965707e+00 8.9095109170183673e-01 1.3206157192526624e+00 2.7578814932730440e+00 1.1068695214954758e+00 -1.1367064976211152e+00 -2.5095783744308333e+00 -1.0482604037135017e+00 -1.3493787052431905e+00 -2.7125451358540862e+00 -1.0678538124783667e+00 9.5359190851547049e-01 2.4232377356941561e+00 8.8885524429258178e-01 1.3459025484344791e+00 4.9271586005413797e+00 1.2723689764864914e+00 -1.1256916460399118e+00 -4.6239536096243592e+00 -8.8342721330614882e-01 -2.5576409336722996e+00 -1.1612739193116728e+00 -3.5610050513423497e+00 2.7722368890466660e+00 7.4954362044359979e-01 3.1930440467099421e+00 2.6170713212022054e+00 1.1102334550725925e+00 4.3558599892422709e+00 -2.8001146112720678e+00 -8.3506282309592572e-01 -4.7825469854366149e+00 -2.7196038337336472e+00 -1.1368308082307954e+00 -4.2883359365432092e+00 2.7000752165702187e+00 9.1774542182801611e-01 4.6684268649467624e+00 2.9053262713104973e+00 1.2723689764864914e+00 7.0769767741184912e+00 -2.9173503194515735e+00 -9.1672392319230633e-01 -6.6624197016952937e+00 4.2160890078666267e+00 1.2252035232576026e+00 2.8149727230781605e+00 -4.8371700617994460e+00 -8.0621701055938877e-01 -2.6245983573596288e+00 -5.9482542417696713e+00 -1.3065230592075032e+00 -2.6441137089222062e+00 5.6982970674587268e+00 8.0484372691749972e-01 2.7827792862849154e+00 5.7452208518268169e+00 1.0672617295478928e+00 2.5956711243518265e+00 -5.6129914052737870e+00 -7.3110113433362633e-01 -2.9472984307774670e+00 -7.9157051196073009e+00 -1.1256916460399120e+00 -2.9173503194515740e+00 8.6545139012980332e+00 8.7222387041743588e-01 2.9399376827959736e+00 8.4750610497592538e-01 1.3385271515832409e+00 7.0704423375949144e-01 -7.3961892011987462e-01 -1.2631725248338601e+00 -5.1860316933344663e-01 -9.6459748661664702e-01 -2.5118014459380076e+00 -6.7260866234160144e-01 7.6031296165766482e-01 2.3567351397685408e+00 5.9381792443517256e-01 1.1145210615253498e+00 2.4127854731782290e+00 7.9122067671030083e-01 -6.9158389807207354e-01 -2.3027605638572064e+00 -5.9067430994143100e-01 -1.1987636937677806e+00 -4.6239536096243592e+00 -9.1672392319230622e-01 8.7222387041743599e-01 4.5936403797234231e+00 6.0652722990382069e-01 2.4059693721323341e+00 8.8405437751451799e-01 3.1435305139657381e+00 -2.5557460090725588e+00 -5.5057419621892567e-01 -2.9006365224267538e+00 -2.5910145933762712e+00 -9.0188373660997501e-01 -4.0285565445885041e+00 2.8243957029144795e+00 6.3884263305596478e-01 4.3702571302387607e+00 2.5626446984312987e+00 7.4637861608259759e-01 3.9629717005037066e+00 -2.5863012015447713e+00 -5.3991771042185099e-01 -4.3361479374247516e+00 -2.9998856522804829e+00 -8.8342721330614871e-01 -6.6624197016952937e+00 2.9399376827959740e+00 6.0652722990382069e-01 6.4510013614270978e+00 357 358 359 405 406 407 417 418 419 369 370 371 1110 1111 1112 1137 1138 1139 1140 1141 1142 1113 1114 1115 7.3991277004462868e+00 1.4464402990990219e+00 3.0670013534493745e+00 -7.8454130438036831e+00 -1.2403653691803826e+00 -3.1044846235933861e+00 -5.1917762376065513e+00 -1.3582239662864981e+00 -2.4659905185477964e+00 5.0090961704557619e+00 1.0218078649649485e+00 2.7724187762384100e+00 5.1678108579518307e+00 1.3162350354997001e+00 2.6211716332374473e+00 -4.9872855282430857e+00 -8.3141934680343077e-01 -2.7339314296780564e+00 -3.5691323485246911e+00 -1.1589532549617729e+00 -2.4424950838060027e+00 4.0175724293241331e+00 8.0447873766841460e-01 2.2863098927000092e+00 1.4464402990990222e+00 4.8643482235186575e+00 1.3928306348253368e+00 -1.2714504598570171e+00 -4.4771346488325499e+00 -1.0008872255296017e+00 -1.4224760725224139e+00 -2.6717219177654683e+00 -1.1147768950611168e+00 1.0386832975979137e+00 2.3456817645911232e+00 9.5574243424414829e-01 1.3351996626353677e+00 2.6505538536446784e+00 1.1232396420094384e+00 -1.1412245742934184e+00 -2.3954154137200749e+00 -1.0701483247109491e+00 -1.1691687674456730e+00 -1.5883902596937891e+00 -1.1322764997996886e+00 1.1839966147862193e+00 1.2720783982574255e+00 8.4627623402243279e-01 3.0670013534493750e+00 1.3928306348253368e+00 7.1545136173152883e+00 -3.1301622875185395e+00 -9.8378824231194517e-01 -6.6456069911317499e+00 -2.8162454338402441e+00 -1.2111175419387916e+00 -4.2414700848722475e+00 2.8017529661848672e+00 9.5273505534490921e-01 4.6424358683479161e+00 2.6105919271859013e+00 1.1014502948149405e+00 4.2473604960750722e+00 -2.7854457535682915e+00 -7.9756566304261389e-01 -4.7273047650269309e+00 -2.4456476686300279e+00 -1.1238555801441614e+00 -3.4233658256672541e+00 2.6981548967369609e+00 6.6931104245232664e-01 2.9934376849599071e+00 -7.8454130438036831e+00 -1.2714504598570171e+00 -3.1301622875185391e+00 8.5275641318286866e+00 9.5375542371680855e-01 3.0916058578646441e+00 5.7539172259819980e+00 1.1701119500278272e+00 2.6140700748404684e+00 -5.5812353685885592e+00 -7.7637932951656663e-01 -2.9789803514474436e+00 -5.7668091325046973e+00 -1.2661580084552142e+00 -2.6131196531049814e+00 5.5351563702643078e+00 7.3006407988151556e-01 2.7903107329657453e+00 4.0257787180044131e+00 1.1526414461736496e+00 2.6588214107067460e+00 -4.6489589011824659e+00 -6.9258510197100431e-01 -2.4325457843066425e+00 -1.2403653691803824e+00 -4.4771346488325507e+00 -9.8378824231194484e-01 9.5375542371680877e-01 4.3594814064807927e+00 6.7696431135626223e-01 1.1559194607728913e+00 2.3693463695523977e+00 8.1092524246099384e-01 -7.4985961753166452e-01 -2.2190797831816185e+00 -6.2910131081612786e-01 -9.8994949892855733e-01 -2.4116960976340827e+00 -7.0213987349209583e-01 7.7303557731147454e-01 2.2635553068179508e+00 6.2658859009192558e-01 8.4804306338434099e-01 1.3146966205853516e+00 7.0711449106908975e-01 -7.5057903954491167e-01 -1.1991691737882404e+00 -5.0656320835810276e-01 -3.1044846235933861e+00 -1.0008872255296017e+00 -6.6456069911317499e+00 3.0916058578646446e+00 6.7696431135626223e-01 6.3344374015702600e+00 2.6547494736977040e+00 8.3560851890972265e-01 3.9199795233580024e+00 -2.6871639520597199e+00 -5.9025456546932309e-01 -4.2994735898012841e+00 -2.5799260904366257e+00 -8.8430080933364297e-01 -3.9286836472284645e+00 2.8033446234694481e+00 5.9373398860044813e-01 4.3242349241599625e+00 2.3268512236959680e+00 8.5042892517683621e-01 3.0456224698636998e+00 -2.5049765126380339e+00 -4.8129314371070187e-01 -2.7505100907904270e+00 -5.1917762376065513e+00 -1.4224760725224139e+00 -2.8162454338402445e+00 5.7539172259819971e+00 1.1559194607728913e+00 2.6547494736977040e+00 7.9739591838161088e+00 1.5843541905196146e+00 2.7898351423028593e+00 -7.7368521557056331e+00 -1.1843845042465422e+00 -2.9829820698505065e+00 -4.2645018219290787e+00 -1.3074190375431087e+00 -2.3170824269030676e+00 4.0698176439338045e+00 8.1878802660981864e-01 2.6349738325895822e+00 5.0638857623638120e+00 1.2707056417655946e+00 2.4917637278986788e+00 -5.6684496008544620e+00 -9.1548770535585500e-01 -2.4550122458950066e+00 -1.3582239662864981e+00 -2.6717219177654683e+00 -1.2111175419387916e+00 1.1701119500278272e+00 2.3693463695523977e+00 8.3560851890972265e-01 1.5843541905196148e+00 4.7515678042448499e+00 1.1406388260236426e+00 -1.1902272358713377e+00 -4.4183229803340396e+00 -9.9423435091551304e-01 -1.3394892856332503e+00 -1.5932789754332102e+00 -9.6612937182947511e-01 1.0956157526416677e+00 1.3101976951408851e+00 9.8155240733165683e-01 1.2999650860581740e+00 2.6228868665047580e+00 1.0748943422785289e+00 -1.2621064914561972e+00 -2.3706748619101745e+00 -8.6121282985977154e-01 -2.4659905185477964e+00 -1.1147768950611165e+00 -4.2414700848722475e+00 2.6140700748404688e+00 8.1092524246099384e-01 3.9199795233580024e+00 2.7898351423028593e+00 1.1406388260236426e+00 6.1129278203059059e+00 -2.9922931239804917e+00 -9.9224455653890953e-01 -6.4596575978862294e+00 -2.2993688624606006e+00 -9.3576845793430619e-01 -2.7059229015697115e+00 2.3372437299874611e+00 6.5773446053511819e-01 3.0419555765032809e+00 2.5317638664464068e+00 1.0662142839499782e+00 4.1267423946127675e+00 -2.5152603085883083e+00 -6.3272290343540183e-01 -3.7945547304517664e+00 5.0090961704557611e+00 1.0386832975979137e+00 2.8017529661848672e+00 -5.5812353685885592e+00 -7.4985961753166452e-01 -2.6871639520597199e+00 -7.7368521557056331e+00 -1.1902272358713377e+00 -2.9922931239804917e+00 7.6314288087540865e+00 8.2633668898097468e-01 3.1552467949205480e+00 4.0393534212538658e+00 1.0730437048121675e+00 2.3596574436312521e+00 -3.9072176778378154e+00 -6.2030736334972969e-01 -2.6543477063961736e+00 -4.8721853021079138e+00 -1.0871128189706376e+00 -2.6797925963789857e+00 5.4176121037762082e+00 7.0944334433231393e-01 2.6969401740787045e+00 1.0218078649649485e+00 2.3456817645911232e+00 9.5273505534490932e-01 -7.7637932951656663e-01 -2.2190797831816185e+00 -5.9025456546932309e-01 -1.1843845042465420e+00 -4.4183229803340396e+00 -9.9224455653890931e-01 8.2633668898097512e-01 4.3427365120065291e+00 7.4594051765773772e-01 8.5011962473518998e-01 1.2910914353256899e+00 6.8737740123091406e-01 -6.4923635265362312e-01 -1.1898318651628865e+00 -6.0392778163019645e-01 -8.3547675649566577e-01 -2.3684576415398708e+00 -7.9178726805797917e-01 7.4721276423128435e-01 2.2161825582950740e+00 5.9216119746284734e-01 2.7724187762384100e+00 9.5574243424414829e-01 4.6424358683479161e+00 -2.9789803514474436e+00 -6.2910131081612786e-01 -4.2994735898012832e+00 -2.9829820698505065e+00 -9.9423435091551315e-01 -6.4596575978862294e+00 3.1552467949205476e+00 7.4594051765773783e-01 7.0021769717010764e+00 2.5981128573946166e+00 9.4338968119825295e-01 3.0107829411985549e+00 -2.6077740891798400e+00 -5.6689126020154668e-01 -3.4716978447657776e+00 -2.6157390349642031e+00 -1.0087932909766624e+00 -4.5663897111071119e+00 2.6596971168884180e+00 5.5394757980971199e-01 4.1418229623128555e+00 5.1678108579518316e+00 1.3351996626353673e+00 2.6105919271859013e+00 -5.7668091325046973e+00 -9.8994949892855733e-01 -2.5799260904366252e+00 -4.2645018219290787e+00 -1.3394892856332501e+00 -2.2993688624606001e+00 4.0393534212538649e+00 8.5011962473518998e-01 2.5981128573946171e+00 8.0834169467297539e+00 1.5048648714334414e+00 2.7550355767220926e+00 -7.7938265352288401e+00 -1.1353852260271202e+00 -2.9240368672615977e+00 -5.0402162409176086e+00 -1.3062546949445946e+00 -2.6079244829067250e+00 5.5747725046447734e+00 1.0808945467295241e+00 2.4475159417629389e+00 1.3162350354997001e+00 2.6505538536446784e+00 1.1014502948149405e+00 -1.2661580084552142e+00 -2.4116960976340827e+00 -8.8430080933364297e-01 -1.3074190375431087e+00 -1.5932789754332102e+00 -9.3576845793430607e-01 1.0730437048121675e+00 1.2910914353256904e+00 9.4338968119825295e-01 1.5048648714334414e+00 4.9185084069938956e+00 1.0985456664862852e+00 -1.0891218520906625e+00 -4.5487824991128134e+00 -9.2117591748541461e-01 -1.2467899127181745e+00 -2.6676341409540814e+00 -1.1052776860681641e+00 1.0153451990618514e+00 2.3612380171699234e+00 7.0313722832204961e-01 2.6211716332374473e+00 1.1232396420094384e+00 4.2473604960750713e+00 -2.6131196531049814e+00 -7.0213987349209606e-01 -3.9286836472284650e+00 -2.3170824269030681e+00 -9.6612937182947511e-01 -2.7059229015697115e+00 2.3596574436312530e+00 6.8737740123091418e-01 3.0107829411985545e+00 2.7550355767220918e+00 1.0985456664862854e+00 6.3313026162500439e+00 -2.9569156001824588e+00 -9.6926561888736751e-01 -6.6233917404217966e+00 -2.3280658227592519e+00 -1.0323433054358804e+00 -4.1625284918400647e+00 2.4793188493589691e+00 7.6071545991818190e-01 3.8310807275363681e+00 -4.9872855282430857e+00 -1.1412245742934184e+00 -2.7854457535682915e+00 5.5351563702643070e+00 7.7303557731147465e-01 2.8033446234694481e+00 4.0698176439338036e+00 1.0956157526416677e+00 2.3372437299874611e+00 -3.9072176778378158e+00 -6.4923635265362301e-01 -2.6077740891798400e+00 -7.7938265352288383e+00 -1.0891218520906627e+00 -2.9569156001824584e+00 7.6432192472211016e+00 7.5582910989133167e-01 3.0955151705977633e+00 4.8854571655646959e+00 9.0316897759783965e-01 2.5902639336349700e+00 -5.4453206856741714e+00 -6.4806663840461010e-01 -2.4762320147590522e+00 -8.3141934680343077e-01 -2.3954154137200749e+00 -7.9756566304261389e-01 7.3006407988151567e-01 2.2635553068179504e+00 5.9373398860044801e-01 8.1878802660981864e-01 1.3101976951408851e+00 6.5773446053511819e-01 -6.2030736334972958e-01 -1.1898318651628865e+00 -5.6689126020154668e-01 -1.1353852260271200e+00 -4.5487824991128134e+00 -9.6926561888736751e-01 7.5582910989133167e-01 4.4439796153626352e+00 6.9323986545449379e-01 9.6606847620938052e-01 2.3728971183590439e+00 8.9134982857206990e-01 -6.8363775641176605e-01 -2.2565999576847400e+00 -5.0233560103060226e-01 -2.7339314296780559e+00 -1.0701483247109491e+00 -4.7273047650269309e+00 2.7903107329657457e+00 6.2658859009192558e-01 4.3242349241599616e+00 2.6349738325895822e+00 9.8155240733165683e-01 3.0419555765032809e+00 -2.6543477063961731e+00 -6.0392778163019645e-01 -3.4716978447657776e+00 -2.9240368672615977e+00 -9.2117591748541461e-01 -6.6233917404217966e+00 3.0955151705977628e+00 6.9323986545449401e-01 7.1167287603422222e+00 2.6280630192275867e+00 8.4779627602504570e-01 4.5495246283644413e+00 -2.8365467520448520e+00 -5.5392511507656272e-01 -4.2100495391554036e+00 -3.5691323485246911e+00 -1.1691687674456730e+00 -2.4456476686300279e+00 4.0257787180044131e+00 8.4804306338434099e-01 2.3268512236959680e+00 5.0638857623638120e+00 1.2999650860581737e+00 2.5317638664464068e+00 -4.8721853021079138e+00 -8.3547675649566566e-01 -2.6157390349642031e+00 -5.0402162409176086e+00 -1.2467899127181743e+00 -2.3280658227592523e+00 4.8854571655646968e+00 9.6606847620938030e-01 2.6280630192275867e+00 7.1490965515281522e+00 1.2977792056627955e+00 2.7833419149944141e+00 -7.6426843059108585e+00 -1.1604203946551781e+00 -2.8805674980108944e+00 -1.1589532549617727e+00 -1.5883902596937887e+00 -1.1238555801441614e+00 1.1526414461736496e+00 1.3146966205853516e+00 8.5042892517683633e-01 1.2707056417655946e+00 2.6228868665047580e+00 1.0662142839499782e+00 -1.0871128189706374e+00 -2.3684576415398708e+00 -1.0087932909766624e+00 -1.3062546949445948e+00 -2.6676341409540814e+00 -1.0323433054358804e+00 9.0316897759783965e-01 2.3728971183590439e+00 8.4779627602504570e-01 1.2977792056627955e+00 4.8012960080736029e+00 1.2385100889015250e+00 -1.0719745023228746e+00 -4.4872945713350152e+00 -8.3795739749668108e-01 -2.4424950838060027e+00 -1.1322764997996886e+00 -3.4233658256672541e+00 2.6588214107067460e+00 7.0711449106908975e-01 3.0456224698636998e+00 2.4917637278986784e+00 1.0748943422785289e+00 4.1267423946127693e+00 -2.6797925963789861e+00 -7.9178726805797928e-01 -4.5663897111071128e+00 -2.6079244829067250e+00 -1.1052776860681641e+00 -4.1625284918400647e+00 2.5902639336349695e+00 8.9134982857206979e-01 4.5495246283644413e+00 2.7833419149944141e+00 1.2385100889015248e+00 6.8723905033477646e+00 -2.7939788241430947e+00 -8.8252729689538212e-01 -6.4419959675742451e+00 4.0175724293241331e+00 1.1839966147862193e+00 2.6981548967369604e+00 -4.6489589011824659e+00 -7.5057903954491156e-01 -2.5049765126380334e+00 -5.6684496008544620e+00 -1.2621064914561972e+00 -2.5152603085883083e+00 5.4176121037762082e+00 7.4721276423128435e-01 2.6596971168884180e+00 5.5747725046447734e+00 1.0153451990618514e+00 2.4793188493589691e+00 -5.4453206856741723e+00 -6.8363775641176605e-01 -2.8365467520448515e+00 -7.6426843059108602e+00 -1.0719745023228746e+00 -2.7939788241430952e+00 8.3954564558768450e+00 8.2174321165639541e-01 2.8135915344299427e+00 8.0447873766841460e-01 1.2720783982574253e+00 6.6931104245232664e-01 -6.9258510197100442e-01 -1.1991691737882404e+00 -4.8129314371070181e-01 -9.1548770535585500e-01 -2.3706748619101745e+00 -6.3272290343540194e-01 7.0944334433231393e-01 2.2161825582950736e+00 5.5394757980971199e-01 1.0808945467295241e+00 2.3612380171699234e+00 7.6071545991818190e-01 -6.4806663840461010e-01 -2.2565999576847404e+00 -5.5392511507656261e-01 -1.1604203946551783e+00 -4.4872945713350152e+00 -8.8252729689538212e-01 8.2174321165639541e-01 4.4642395909957493e+00 5.6649437693782834e-01 2.2863098927000096e+00 8.4627623402243268e-01 2.9934376849599071e+00 -2.4325457843066429e+00 -5.0656320835810276e-01 -2.7505100907904270e+00 -2.4550122458950066e+00 -8.6121282985977143e-01 -3.7945547304517668e+00 2.6969401740787045e+00 5.9216119746284734e-01 4.1418229623128555e+00 2.4475159417629389e+00 7.0313722832204961e-01 3.8310807275363690e+00 -2.4762320147590526e+00 -5.0233560103060226e-01 -4.2100495391554036e+00 -2.8805674980108940e+00 -8.3795739749668097e-01 -6.4419959675742451e+00 2.8135915344299431e+00 5.6649437693782834e-01 6.2307689531627108e+00 303 304 305 369 370 371 381 382 383 318 319 320 306 307 308 1113 1114 1115 1116 1117 1118 321 322 323 6.7990695891655228e+00 1.9150198608325548e+00 2.6395846501972606e+00 -7.2934651614138630e+00 -1.8706582614541749e+00 -2.7291941672724525e+00 -4.6171363365935134e+00 -1.7606313419923905e+00 -2.0687400559255344e+00 4.5454759818855539e+00 1.5294029875956410e+00 2.3938768744010424e+00 4.5613604464245725e+00 1.7291119743531236e+00 2.2395418222621832e+00 -4.4882640802179150e+00 -1.3170633002758356e+00 -2.3639915976043655e+00 -3.0524922873483438e+00 -1.4841007418184828e+00 -2.0450138916596639e+00 3.5454518480979837e+00 1.2589188227595645e+00 1.9339363656015252e+00 1.9150198608325546e+00 5.5654768450852572e+00 1.9257134754444283e+00 -1.9021363409125518e+00 -5.1082776562258090e+00 -1.5414037655744146e+00 -1.8624553446330059e+00 -3.3000710094033110e+00 -1.4836845786893829e+00 1.5448507964790403e+00 2.8978204503525320e+00 1.4399473162385863e+00 1.7687264344530154e+00 3.1900413930731575e+00 1.5283759088186613e+00 -1.6412528489222180e+00 -2.8577465306108021e+00 -1.5533733395655378e+00 -1.5142411909905624e+00 -2.1097602156265807e+00 -1.5140479398971380e+00 1.6914886336937280e+00 1.7225167233555549e+00 1.1984729232247944e+00 2.6395846501972611e+00 1.9257134754444283e+00 6.8197309997219309e+00 -2.7629474243558900e+00 -1.5343861435109587e+00 -6.3355621282135530e+00 -2.4153061230730284e+00 -1.6307812480340294e+00 -3.9340371170769552e+00 2.4433420286339156e+00 1.4574860844887394e+00 4.3174388231156513e+00 2.2485798761488121e+00 1.4981972567496793e+00 3.9128296212431875e+00 -2.4675837927925719e+00 -1.3071166598599149e+00 -4.3707823494100335e+00 -2.0773413815935404e+00 -1.5073508726403575e+00 -3.0900342947315962e+00 2.3916721668350420e+00 1.0982381073624126e+00 2.6804164453513653e+00 -7.2934651614138630e+00 -1.9021363409125518e+00 -2.7629474243558896e+00 8.0661837279700670e+00 1.7425290296260036e+00 2.7622006038658884e+00 5.2420355273807324e+00 1.7418397165327963e+00 2.2416370976060880e+00 -5.1873995076523061e+00 -1.4411963417370952e+00 -2.6297418524479443e+00 -5.2112732627410221e+00 -1.8198717620151175e+00 -2.2948633430476120e+00 5.1000438831128436e+00 1.3432834827782762e+00 2.4878904662204939e+00 3.5421020171494813e+00 1.6182678960099612e+00 2.3063033129134891e+00 -4.2582272238059327e+00 -1.2827156802822719e+00 -2.1104788607545091e+00 -1.8706582614541751e+00 -5.1082776562258090e+00 -1.5343861435109587e+00 1.7425290296260032e+00 4.8865253003855855e+00 1.2230391938178795e+00 1.7510593491809578e+00 2.9364915855588514e+00 1.2158212885212416e+00 -1.3943944912563553e+00 -2.6675391749176693e+00 -1.1529521598121306e+00 -1.5823334773703863e+00 -2.8924233410799278e+00 -1.1328190119373260e+00 1.4158853152594297e+00 2.6351808963556715e+00 1.1393113361804559e+00 1.3304614277548763e+00 1.7792781665824899e+00 1.1474601887129687e+00 -1.3925488917403506e+00 -1.5692357766591927e+00 -9.0547469197212760e-01 -2.7291941672724525e+00 -1.5414037655744146e+00 -6.3355621282135530e+00 2.7622006038658884e+00 1.2230391938178795e+00 6.0491115143044887e+00 2.3120063192936184e+00 1.2492600059181238e+00 3.6438238583521745e+00 -2.3858472277132399e+00 -1.0874415741109558e+00 -3.9968818861300011e+00 -2.2383097292936003e+00 -1.2648703594482715e+00 -3.6191420500908511e+00 2.5040197253433987e+00 1.0866518784276669e+00 3.9901677462814535e+00 2.0013826445972742e+00 1.2145199483916951e+00 2.7368314291510654e+00 -2.2262581688208867e+00 -8.7975532742172302e-01 -2.4683484836547760e+00 -4.6171363365935134e+00 -1.8624553446330059e+00 -2.4153061230730284e+00 5.2420355273807333e+00 1.7510593491809578e+00 2.3120063192936180e+00 7.2873759021436024e+00 2.0884823009177107e+00 2.3423217934910925e+00 -7.1719587129272648e+00 -1.7837360500518682e+00 -2.5524148267555180e+00 -3.6883496769441400e+00 -1.7066020715672401e+00 -1.9661469876694864e+00 3.6144782822617407e+00 1.3166731185436120e+00 2.2742998748591141e+00 4.4418325944271908e+00 1.6377958299945203e+00 2.0695806716245668e+00 -5.1082775797483508e+00 -1.4412171323846861e+00 -2.0643407217703538e+00 -1.7606313419923902e+00 -3.3000710094033114e+00 -1.6307812480340291e+00 1.7418397165327963e+00 2.9364915855588505e+00 1.2492600059181238e+00 2.0884823009177103e+00 5.4022370595008677e+00 1.5123501868451499e+00 -1.7758561966437871e+00 -4.9970385336608629e+00 -1.4572342334808268e+00 -1.7513806999620953e+00 -2.1218319252408087e+00 -1.2849527404204650e+00 1.5652951750839621e+00 1.7719041595011713e+00 1.3883516138298546e+00 1.6910065334675226e+00 3.1158851575894144e+00 1.4154445035283068e+00 -1.7987554874037193e+00 -2.8075764938453220e+00 -1.1924380881861119e+00 -2.0687400559255344e+00 -1.4836845786893833e+00 -3.9340371170769557e+00 2.2416370976060880e+00 1.2158212885212416e+00 3.6438238583521745e+00 2.3423217934910920e+00 1.5123501868451497e+00 5.7498871602281065e+00 -2.5693026339926091e+00 -1.4726721901323725e+00 -6.0685645709953739e+00 -1.9285622934046076e+00 -1.2281629731214134e+00 -2.4214401582367251e+00 2.0148780378344582e+00 1.0374546886940894e+00 2.7354423978910569e+00 2.1256972565350765e+00 1.4061620511816217e+00 3.7300238425721988e+00 -2.1579292021439636e+00 -9.8726847329893319e-01 -3.4351354127344789e+00 4.5454759818855539e+00 1.5448507964790403e+00 2.4433420286339156e+00 -5.1873995076523061e+00 -1.3943944912563553e+00 -2.3858472277132399e+00 -7.1719587129272648e+00 -1.7758561966437867e+00 -2.5693026339926091e+00 7.1647538871737080e+00 1.4835014128314696e+00 2.7647025439735717e+00 3.5800035793076916e+00 1.5280483088211236e+00 2.0514500343029480e+00 -3.5454230795374864e+00 -1.1519799618218256e+00 -2.3521807864987334e+00 -4.3488187406708958e+00 -1.5197843426503497e+00 -2.2981858818052134e+00 4.9633665924210035e+00 1.2856144742406834e+00 2.3460219230993564e+00 1.5294029875956410e+00 2.8978204503525320e+00 1.4574860844887394e+00 -1.4411963417370954e+00 -2.6675391749176693e+00 -1.0874415741109558e+00 -1.7837360500518684e+00 -4.9970385336608629e+00 -1.4726721901323725e+00 1.4835014128314699e+00 4.8006364913201738e+00 1.3300127831459467e+00 1.3621260971190567e+00 1.7602689135568403e+00 1.0922869991712574e+00 -1.1955117472554961e+00 -1.5497958856349248e+00 -1.1086229422185583e+00 -1.3026966776143536e+00 -2.8008217198677894e+00 -1.2550179155357821e+00 1.3481103191126462e+00 2.5564694588517010e+00 1.0439687551917238e+00 2.3938768744010424e+00 1.4399473162385861e+00 4.3174388231156513e+00 -2.6297418524479448e+00 -1.1529521598121304e+00 -3.9968818861300019e+00 -2.5524148267555189e+00 -1.4572342334808266e+00 -6.0685645709953739e+00 2.7647025439735708e+00 1.3300127831459465e+00 6.5679969927237636e+00 2.2239675255464171e+00 1.3216610388689818e+00 2.7117012263188802e+00 -2.2980274403894287e+00 -1.0436635152798224e+00 -3.1374027640876663e+00 -2.2177234883116177e+00 -1.4190483533076912e+00 -4.1397601767425183e+00 2.3153606639834781e+00 9.8127712362695596e-01 3.7454723557972600e+00 4.5613604464245734e+00 1.7687264344530154e+00 2.2485798761488116e+00 -5.2112732627410230e+00 -1.5823334773703863e+00 -2.2383097292936007e+00 -3.6883496769441400e+00 -1.7513806999620953e+00 -1.9285622934046076e+00 3.5800035793076908e+00 1.3621260971190567e+00 2.2239675255464171e+00 7.1662976644874954e+00 1.9807741651578199e+00 2.3410635619729558e+00 -7.0150987207663835e+00 -1.6822362796663903e+00 -2.5420113200640251e+00 -4.3671062834449694e+00 -1.6785412252778693e+00 -2.1906380329415103e+00 4.9741662536767581e+00 1.5828649855468486e+00 2.0859104120355538e+00 1.7291119743531236e+00 3.1900413930731575e+00 1.4981972567496793e+00 -1.8198717620151175e+00 -2.8924233410799278e+00 -1.2648703594482715e+00 -1.7066020715672403e+00 -2.1218319252408087e+00 -1.2281629731214134e+00 1.5280483088211236e+00 1.7602689135568403e+00 1.3216610388689818e+00 1.9807741651578197e+00 5.2675365013455426e+00 1.4719958623886005e+00 -1.6579683101319549e+00 -4.8345510302573178e+00 -1.3956114487918623e+00 -1.5985777350823243e+00 -3.0871173358634216e+00 -1.4539097077842333e+00 1.5450854304645696e+00 2.7180768244659350e+00 1.0507003311385161e+00 2.2395418222621832e+00 1.5283759088186613e+00 3.9128296212431875e+00 -2.2948633430476120e+00 -1.1328190119373260e+00 -3.6191420500908511e+00 -1.9661469876694864e+00 -1.2849527404204653e+00 -2.4214401582367251e+00 2.0514500343029480e+00 1.0922869991712574e+00 2.7117012263188802e+00 2.3410635619729563e+00 1.4719958623886003e+00 5.7615822410505544e+00 -2.5580905000993508e+00 -1.4240333284544424e+00 -6.0440017584578500e+00 -1.9556178578946946e+00 -1.3585099421221387e+00 -3.7344743522407313e+00 2.1426632701730566e+00 1.1076562525558533e+00 3.4329452304135319e+00 -4.4882640802179141e+00 -1.6412528489222180e+00 -2.4675837927925719e+00 5.1000438831128427e+00 1.4158853152594293e+00 2.5040197253433987e+00 3.6144782822617403e+00 1.5652951750839617e+00 2.0148780378344582e+00 -3.5454230795374864e+00 -1.1955117472554961e+00 -2.2980274403894279e+00 -7.0150987207663835e+00 -1.6579683101319549e+00 -2.5580905000993508e+00 6.9760064555767975e+00 1.3712172965451916e+00 2.7449039541413471e+00 4.3252528953435760e+00 1.3499904918977146e+00 2.2120214809309924e+00 -4.9669956357731717e+00 -1.2076553724766279e+00 -2.1521214649688423e+00 -1.3170633002758356e+00 -2.8577465306108021e+00 -1.3071166598599147e+00 1.3432834827782765e+00 2.6351808963556715e+00 1.0866518784276669e+00 1.3166731185436118e+00 1.7719041595011713e+00 1.0374546886940894e+00 -1.1519799618218258e+00 -1.5497958856349250e+00 -1.0436635152798224e+00 -1.6822362796663903e+00 -4.8345510302573178e+00 -1.4240333284544424e+00 1.3712172965451916e+00 4.6180723965592936e+00 1.2596513680289714e+00 1.4087688542609804e+00 2.7272737669654870e+00 1.3089823109077212e+00 -1.2886632103640085e+00 -2.5103377728785796e+00 -9.1792674246426698e-01 -2.3639915976043655e+00 -1.5533733395655376e+00 -4.3707823494100335e+00 2.4878904662204944e+00 1.1393113361804559e+00 3.9901677462814531e+00 2.2742998748591141e+00 1.3883516138298548e+00 2.7354423978910569e+00 -2.3521807864987334e+00 -1.1086229422185583e+00 -3.1374027640876663e+00 -2.5420113200640251e+00 -1.3956114487918625e+00 -6.0440017584578500e+00 2.7449039541413480e+00 1.2596513680289718e+00 6.5094007192709853e+00 2.2746448096675964e+00 1.2922170713674903e+00 4.0992504558037126e+00 -2.5235554007214298e+00 -1.0219236588308134e+00 -3.7820744472916541e+00 -3.0524922873483442e+00 -1.5142411909905622e+00 -2.0773413815935404e+00 3.5421020171494804e+00 1.3304614277548763e+00 2.0013826445972742e+00 4.4418325944271908e+00 1.6910065334675226e+00 2.1256972565350760e+00 -4.3488187406708958e+00 -1.3026966776143536e+00 -2.2177234883116177e+00 -4.3671062834449694e+00 -1.5985777350823240e+00 -1.9556178578946946e+00 4.3252528953435760e+00 1.4087688542609804e+00 2.2746448096675964e+00 6.3178571778539423e+00 1.6627760567412655e+00 2.3097144450711355e+00 -6.8586273733099805e+00 -1.6774972685374039e+00 -2.4607564280712273e+00 -1.4841007418184828e+00 -2.1097602156265811e+00 -1.5073508726403575e+00 1.6182678960099610e+00 1.7792781665824899e+00 1.2145199483916953e+00 1.6377958299945203e+00 3.1158851575894144e+00 1.4061620511816217e+00 -1.5197843426503495e+00 -2.8008217198677894e+00 -1.4190483533076912e+00 -1.6785412252778693e+00 -3.0871173358634216e+00 -1.3585099421221389e+00 1.3499904918977146e+00 2.7272737669654870e+00 1.2922170713674903e+00 1.6627760567412651e+00 5.1262530483289357e+00 1.6298040250301278e+00 -1.5864039648967594e+00 -4.7509908681085342e+00 -1.2577939279007453e+00 -2.0450138916596639e+00 -1.5140479398971380e+00 -3.0900342947315962e+00 2.3063033129134891e+00 1.1474601887129690e+00 2.7368314291510658e+00 2.0695806716245668e+00 1.4154445035283068e+00 3.7300238425721983e+00 -2.2981858818052134e+00 -1.2550179155357823e+00 -4.1397601767425174e+00 -2.1906380329415107e+00 -1.4539097077842331e+00 -3.7344743522407318e+00 2.2120214809309924e+00 1.3089823109077212e+00 4.0992504558037117e+00 2.3097144450711360e+00 1.6298040250301282e+00 6.2125103782263640e+00 -2.3637821041337967e+00 -1.2787154649619710e+00 -5.8143472820384927e+00 3.5454518480979829e+00 1.6914886336937278e+00 2.3916721668350420e+00 -4.2582272238059327e+00 -1.3925488917403506e+00 -2.2262581688208867e+00 -5.1082775797483508e+00 -1.7987554874037193e+00 -2.1579292021439640e+00 4.9633665924210026e+00 1.3481103191126460e+00 2.3153606639834781e+00 4.9741662536767581e+00 1.5450854304645696e+00 2.1426632701730566e+00 -4.9669956357731717e+00 -1.2886632103640085e+00 -2.5235554007214303e+00 -6.8586273733099805e+00 -1.5864039648967594e+00 -2.3637821041337967e+00 7.7091431184416921e+00 1.4816871711338937e+00 2.4218287748284961e+00 1.2589188227595645e+00 1.7225167233555549e+00 1.0982381073624126e+00 -1.2827156802822719e+00 -1.5692357766591927e+00 -8.7975532742172302e-01 -1.4412171323846861e+00 -2.8075764938453225e+00 -9.8726847329893319e-01 1.2856144742406834e+00 2.5564694588517010e+00 9.8127712362695596e-01 1.5828649855468486e+00 2.7180768244659350e+00 1.1076562525558533e+00 -1.2076553724766279e+00 -2.5103377728785796e+00 -1.0219236588308134e+00 -1.6774972685374039e+00 -4.7509908681085342e+00 -1.2787154649619710e+00 1.4816871711338937e+00 4.6410779048184381e+00 9.8049144096821694e-01 1.9339363656015252e+00 1.1984729232247944e+00 2.6804164453513653e+00 -2.1104788607545086e+00 -9.0547469197212749e-01 -2.4683484836547760e+00 -2.0643407217703538e+00 -1.1924380881861119e+00 -3.4351354127344793e+00 2.3460219230993564e+00 1.0439687551917238e+00 3.7454723557972600e+00 2.0859104120355538e+00 1.0507003311385161e+00 3.4329452304135319e+00 -2.1521214649688423e+00 -9.1792674246426698e-01 -3.7820744472916541e+00 -2.4607564280712273e+00 -1.2577939279007453e+00 -5.8143472820384936e+00 2.4218287748284957e+00 9.8049144096821661e-01 5.6410715941572427e+00 369 370 371 417 418 419 429 430 431 381 382 383 1113 1114 1115 1140 1141 1142 1143 1144 1145 1116 1117 1118 6.2937940824508223e+00 1.8153399412785343e+00 2.4915431233403260e+00 -6.7794255860784354e+00 -1.7631708988143626e+00 -2.5753853291662088e+00 -4.3296409670002873e+00 -1.6828126241725023e+00 -1.9500474561861396e+00 4.2573006821839083e+00 1.4431885417947754e+00 2.2753844877306104e+00 4.3110728900505091e+00 1.6533329556648892e+00 2.1246212048893272e+00 -4.2368782410526666e+00 -1.2427952941658733e+00 -2.2533564801506110e+00 -2.8845672299280429e+00 -1.4167367742662733e+00 -1.9465499390444758e+00 3.3683443693741957e+00 1.1936541526808135e+00 1.8337903885871689e+00 1.8153399412785343e+00 5.1900051924734738e+00 1.8494504270944421e+00 -1.8114576163497937e+00 -4.7124917374840916e+00 -1.4570994147143610e+00 -1.7835229777189907e+00 -3.1213902364996202e+00 -1.4189071244628750e+00 1.4696819511179611e+00 2.7063448785240887e+00 1.3786778873412127e+00 1.6959357758377165e+00 3.0406982887276799e+00 1.4670448776674783e+00 -1.5653758079299938e+00 -2.7049118607182385e+00 -1.4955563019081279e+00 -1.4464291008388173e+00 -2.0338674137721835e+00 -1.4654371631652432e+00 1.6258278346033843e+00 1.6356128887488930e+00 1.1418268121474717e+00 2.4915431233403260e+00 1.8494504270944421e+00 6.3776730726285242e+00 -2.6236154935221672e+00 -1.4443501636411318e+00 -5.8741564169903926e+00 -2.2983820158383468e+00 -1.5706448549927907e+00 -3.6961919185055341e+00 2.3273455804959595e+00 1.3874518139879803e+00 4.0828864140820782e+00 2.1384811302544904e+00 1.4374702699055717e+00 3.7053978991752059e+00 -2.3515632928132675e+00 -1.2450553151437851e+00 -4.1729655055333232e+00 -1.9751888058881841e+00 -1.4564700114148847e+00 -2.9705696256098726e+00 2.2913797739711903e+00 1.0421478342046000e+00 2.5479260807533097e+00 -6.7794255860784363e+00 -1.8114576163497937e+00 -2.6236154935221672e+00 7.5639298713823937e+00 1.6341936423046806e+00 2.6094219269201320e+00 4.9564646969587232e+00 1.6684139758370795e+00 2.1237450984805379e+00 -4.9030835519479536e+00 -1.3531486154013095e+00 -2.5166002868982273e+00 -4.9678341145218896e+00 -1.7459034100335427e+00 -2.1755276655930871e+00 4.8518819872946937e+00 1.2668835259432389e+00 2.3783635372596796e+00 3.3720638666185523e+00 1.5538037200426982e+00 2.2111093295983433e+00 -4.0939971697060820e+00 -1.2127852223430531e+00 -2.0068964462452064e+00 -1.7631708988143624e+00 -4.7124917374840924e+00 -1.4443501636411318e+00 1.6341936423046810e+00 4.4906836958964762e+00 1.1322563419817275e+00 1.6636690984069327e+00 2.7421732019256861e+00 1.1431008813628314e+00 -1.3077164442835401e+00 -2.4726145069451539e+00 -1.0819941516508613e+00 -1.5025848897659368e+00 -2.7318958238952504e+00 -1.0621969469401102e+00 1.3310918187278638e+00 2.4772417379967284e+00 1.0699612215929124e+00 1.2596730566799044e+00 1.6888167414898607e+00 1.0867767062189058e+00 -1.3151553832555425e+00 -1.4819133089842538e+00 -8.4355388892427219e-01 -2.5753853291662088e+00 -1.4570994147143610e+00 -5.8741564169903935e+00 2.6094219269201320e+00 1.1322563419817275e+00 5.5847767858061355e+00 2.1862474428485377e+00 1.1824540407709401e+00 3.3973252527512567e+00 -2.2638858276067704e+00 -1.0127326103724659e+00 -3.7508886900315948e+00 -2.1237865395128930e+00 -1.1992560862820596e+00 -3.4056333274050825e+00 2.3874304869999250e+00 1.0205708131735189e+00 3.7787371993513834e+00 1.8988619172555734e+00 1.1550753297124510e+00 2.6031135282730977e+00 -2.1189040777382964e+00 -8.2126841426975195e-01 -2.3332743317548013e+00 -4.3296409670002873e+00 -1.7835229777189907e+00 -2.2983820158383463e+00 4.9564646969587232e+00 1.6636690984069329e+00 2.1862474428485377e+00 6.8938356177696702e+00 2.0042547929687160e+00 2.2115256763754116e+00 -6.7753020128682664e+00 -1.6893525030267829e+00 -2.4227704004802288e+00 -3.5212327183818748e+00 -1.6387197122660953e+00 -1.8582613046926639e+00 3.4419656031525747e+00 1.2487638878925755e+00 2.1727084700446646e+00 4.2438313175428153e+00 1.5685296820892471e+00 1.9658456903233088e+00 -4.9099215371733536e+00 -1.3736222683456036e+00 -1.9569135585806805e+00 -1.6828126241725023e+00 -3.1213902364996202e+00 -1.5706448549927907e+00 1.6684139758370793e+00 2.7421732019256861e+00 1.1824540407709401e+00 2.0042547929687160e+00 5.1248795479806457e+00 1.4409141885893828e+00 -1.6914886218886407e+00 -4.7046363921266678e+00 -1.3894244693356226e+00 -1.6897009474993703e+00 -2.0434530702531379e+00 -1.2274819951708480e+00 1.4973568060270257e+00 1.6866284580335698e+00 1.3357763452011877e+00 1.6263214998205739e+00 3.0110504608961470e+00 1.3620985065181412e+00 -1.7323448810928812e+00 -2.6952519699566229e+00 -1.1336917615803879e+00 -1.9500474561861394e+00 -1.4189071244628748e+00 -3.6961919185055345e+00 2.1237450984805379e+00 1.1431008813628314e+00 3.3973252527512567e+00 2.2115256763754116e+00 1.4409141885893826e+00 5.4085563956596827e+00 -2.4434524470986183e+00 -1.3986802565594396e+00 -5.7236524150096484e+00 -1.8289814513446427e+00 -1.1716436561662193e+00 -2.2896141099271299e+00 1.9128684317594775e+00 9.8390032864648003e-01 2.6042302303110580e+00 2.0287827484870347e+00 1.3534322408383244e+00 3.5748454323734311e+00 -2.0544406004730615e+00 -9.3211660224848536e-01 -3.2754988676531145e+00 4.2573006821839083e+00 1.4696819511179611e+00 2.3273455804959595e+00 -4.9030835519479536e+00 -1.3077164442835398e+00 -2.2638858276067704e+00 -6.7753020128682664e+00 -1.6914886218886409e+00 -2.4434524470986183e+00 6.7730626281332835e+00 1.3895242463869557e+00 2.6393646505267787e+00 3.4119321173429786e+00 1.4598920525014392e+00 1.9484436527977185e+00 -3.3750115580582261e+00 -1.0841457846298026e+00 -2.2552754590170867e+00 -4.1521815762321417e+00 -1.4519659919424590e+00 -2.2026050732874634e+00 4.7632832714464151e+00 1.2162185927380875e+00 2.2500649231894791e+00 1.4431885417947756e+00 2.7063448785240887e+00 1.3874518139879803e+00 -1.3531486154013093e+00 -2.4726145069451535e+00 -1.0127326103724659e+00 -1.6893525030267829e+00 -4.7046363921266678e+00 -1.3986802565594396e+00 1.3895242463869557e+00 4.5108103034671831e+00 1.2525702232845546e+00 1.2896118371259011e+00 1.6703077348404451e+00 1.0325951656730044e+00 -1.1190741732582765e+00 -1.4635998510598518e+00 -1.0463140824428609e+00 -1.2301366756124330e+00 -2.6872185768839412e+00 -1.1977776366581712e+00 1.2693873419911690e+00 2.4406064101838978e+00 9.8288738308739665e-01 2.2753844877306100e+00 1.3786778873412129e+00 4.0828864140820782e+00 -2.5166002868982273e+00 -1.0819941516508611e+00 -3.7508886900315952e+00 -2.4227704004802288e+00 -1.3894244693356224e+00 -5.7236524150096484e+00 2.6393646505267792e+00 1.2525702232845546e+00 6.2327821115747559e+00 2.1256874321844803e+00 1.2677004011451336e+00 2.5785444347198552e+00 -2.1959094382723139e+00 -9.8692796321667597e-01 -3.0132514334801903e+00 -2.1149798352688136e+00 -1.3641919349748892e+00 -3.9922179329586980e+00 2.2098233904777138e+00 9.2359000740714925e-01 3.5857975111034377e+00 4.3110728900505091e+00 1.6959357758377165e+00 2.1384811302544904e+00 -4.9678341145218887e+00 -1.5025848897659368e+00 -2.1237865395128930e+00 -3.5212327183818752e+00 -1.6897009474993703e+00 -1.8289814513446427e+00 3.4119321173429786e+00 1.2896118371259011e+00 2.1256874321844803e+00 6.9274104638248692e+00 1.9114990268826286e+00 2.2281289197277618e+00 -6.7667064604523084e+00 -1.6149725427316037e+00 -2.4328363561043571e+00 -4.2098767396882248e+00 -1.6178996834836812e+00 -2.0967095394042987e+00 4.8152345618259433e+00 1.5281114236343476e+00 1.9900164041994555e+00 1.6533329556648892e+00 3.0406982887276799e+00 1.4374702699055715e+00 -1.7459034100335427e+00 -2.7318958238952504e+00 -1.1992560862820598e+00 -1.6387197122660950e+00 -2.0434530702531379e+00 -1.1716436561662193e+00 1.4598920525014394e+00 1.6703077348404451e+00 1.2677004011451336e+00 1.9114990268826288e+00 5.1208675743753922e+00 1.4093480775623797e+00 -1.5785925564258332e+00 -4.6771011827770215e+00 -1.3318486313054607e+00 -1.5346080907776132e+00 -3.0165698324141634e+00 -1.4039069992961344e+00 1.4730997344541277e+00 2.6371463113960560e+00 9.9213662443678730e-01 2.1246212048893267e+00 1.4670448776674785e+00 3.7053978991752059e+00 -2.1755276655930866e+00 -1.0621969469401105e+00 -3.4056333274050825e+00 -1.8582613046926642e+00 -1.2274819951708480e+00 -2.2896141099271299e+00 1.9484436527977185e+00 1.0325951656730044e+00 2.5785444347198552e+00 2.2281289197277618e+00 1.4093480775623801e+00 5.5546105383868154e+00 -2.4468188685327541e+00 -1.3689727837400931e+00 -5.8347085237145677e+00 -1.8584664411208327e+00 -1.3068085736704964e+00 -3.6143836566780867e+00 2.0378805025245321e+00 1.0564721786186861e+00 3.3057867454429868e+00 -4.2368782410526675e+00 -1.5653758079299935e+00 -2.3515632928132675e+00 4.8518819872946928e+00 1.3310918187278638e+00 2.3874304869999250e+00 3.4419656031525747e+00 1.4973568060270259e+00 1.9128684317594775e+00 -3.3750115580582261e+00 -1.1190741732582765e+00 -2.1959094382723134e+00 -6.7667064604523084e+00 -1.5785925564258330e+00 -2.4468188685327550e+00 6.7267748241269825e+00 1.2953243254944804e+00 2.6357155080622312e+00 4.1623522102958059e+00 1.2789365706483529e+00 2.1144412562850898e+00 -4.8043783653068566e+00 -1.1396669832836201e+00 -2.0561640834883836e+00 -1.2427952941658733e+00 -2.7049118607182385e+00 -1.2450553151437853e+00 1.2668835259432389e+00 2.4772417379967284e+00 1.0205708131735187e+00 1.2487638878925755e+00 1.6866284580335698e+00 9.8390032864647980e-01 -1.0841457846298024e+00 -1.4635998510598514e+00 -9.8692796321667597e-01 -1.6149725427316040e+00 -4.6771011827770215e+00 -1.3689727837400929e+00 1.2953243254944806e+00 4.4647754801479440e+00 1.1972946391784933e+00 1.3512961458687502e+00 2.6476530925567192e+00 1.2632264181093118e+00 -1.2203542636717652e+00 -2.4306858741798516e+00 -8.6403613700724835e-01 -2.2533564801506114e+00 -1.4955563019081279e+00 -4.1729655055333224e+00 2.3783635372596796e+00 1.0699612215929124e+00 3.7787371993513830e+00 2.1727084700446646e+00 1.3357763452011877e+00 2.6042302303110580e+00 -2.2552754590170867e+00 -1.0463140824428609e+00 -3.0132514334801903e+00 -2.4328363561043576e+00 -1.3318486313054609e+00 -5.8347085237145677e+00 2.6357155080622312e+00 1.1972946391784931e+00 6.3120524235867208e+00 2.1810684906750213e+00 1.2360719432437604e+00 3.9837557964362431e+00 -2.4263877107695415e+00 -9.6538513355990474e-01 -3.6578501869573183e+00 -2.8845672299280425e+00 -1.4464291008388173e+00 -1.9751888058881841e+00 3.3720638666185523e+00 1.2596730566799044e+00 1.8988619172555734e+00 4.2438313175428162e+00 1.6263214998205739e+00 2.0287827484870351e+00 -4.1521815762321417e+00 -1.2301366756124328e+00 -2.1149798352688136e+00 -4.2098767396882248e+00 -1.5346080907776132e+00 -1.8584664411208327e+00 4.1623522102958050e+00 1.3512961458687502e+00 2.1810684906750213e+00 6.1519269723850698e+00 1.5991970176837653e+00 2.2157758588772500e+00 -6.6835488209938347e+00 -1.6253138528241311e+00 -2.3758539330170461e+00 -1.4167367742662731e+00 -2.0338674137721835e+00 -1.4564700114148847e+00 1.5538037200426982e+00 1.6888167414898607e+00 1.1550753297124512e+00 1.5685296820892469e+00 3.0110504608961470e+00 1.3534322408383244e+00 -1.4519659919424588e+00 -2.6872185768839407e+00 -1.3641919349748890e+00 -1.6178996834836812e+00 -3.0165698324141634e+00 -1.3068085736704964e+00 1.2789365706483529e+00 2.6476530925567197e+00 1.2360719432437604e+00 1.5991970176837653e+00 5.0491946871731814e+00 1.5842271378486041e+00 -1.5138645407716500e+00 -4.6590591590456221e+00 -1.2013361315828670e+00 -1.9465499390444756e+00 -1.4654371631652430e+00 -2.9705696256098726e+00 2.2111093295983428e+00 1.0867767062189058e+00 2.6031135282730977e+00 1.9658456903233088e+00 1.3620985065181415e+00 3.5748454323734311e+00 -2.2026050732874634e+00 -1.1977776366581712e+00 -3.9922179329586980e+00 -2.0967095394042987e+00 -1.4039069992961344e+00 -3.6143836566780863e+00 2.1144412562850894e+00 1.2632264181093118e+00 3.9837557964362427e+00 2.2157758588772500e+00 1.5842271378486041e+00 6.0961524925132275e+00 -2.2613075833477549e+00 -1.2292069695754149e+00 -5.6806960343493387e+00 3.3683443693741961e+00 1.6258278346033843e+00 2.2913797739711907e+00 -4.0939971697060829e+00 -1.3151553832555425e+00 -2.1189040777382964e+00 -4.9099215371733544e+00 -1.7323448810928812e+00 -2.0544406004730615e+00 4.7632832714464159e+00 1.2693873419911692e+00 2.2098233904777138e+00 4.8152345618259424e+00 1.4730997344541277e+00 2.0378805025245317e+00 -4.8043783653068557e+00 -1.2203542636717655e+00 -2.4263877107695415e+00 -6.6835488209938330e+00 -1.5138645407716498e+00 -2.2613075833477545e+00 7.5449836905335745e+00 1.4134041577431589e+00 2.3219563053552132e+00 1.1936541526808135e+00 1.6356128887488930e+00 1.0421478342046000e+00 -1.2127852223430526e+00 -1.4819133089842538e+00 -8.2126841426975206e-01 -1.3736222683456032e+00 -2.6952519699566229e+00 -9.3211660224848536e-01 1.2162185927380875e+00 2.4406064101838978e+00 9.2359000740714925e-01 1.5281114236343478e+00 2.6371463113960560e+00 1.0564721786186859e+00 -1.1396669832836204e+00 -2.4306858741798516e+00 -9.6538513355990474e-01 -1.6253138528241307e+00 -4.6590591590456221e+00 -1.2292069695754149e+00 1.4134041577431589e+00 4.5535447018375033e+00 9.2576709942312041e-01 1.8337903885871689e+00 1.1418268121474717e+00 2.5479260807533097e+00 -2.0068964462452059e+00 -8.4355388892427241e-01 -2.3332743317548013e+00 -1.9569135585806805e+00 -1.1336917615803879e+00 -3.2754988676531145e+00 2.2500649231894796e+00 9.8288738308739665e-01 3.5857975111034373e+00 1.9900164041994557e+00 9.9213662443678730e-01 3.3057867454429877e+00 -2.0561640834883841e+00 -8.6403613700724846e-01 -3.6578501869573183e+00 -2.3758539330170469e+00 -1.2013361315828668e+00 -5.6806960343493369e+00 2.3219563053552132e+00 9.2576709942312052e-01 5.5078090834148359e+00 318 319 320 381 382 383 1128 1129 1130 333 334 335 321 322 323 1116 1117 1118 1131 1132 1133 1092 1093 1094 5.3120208180499775e+00 1.8792101044290954e+00 1.8792101044290961e+00 -5.7730045980148708e+00 -1.9989625897457306e+00 -1.9989625897457310e+00 -3.4630911210566109e+00 -1.7141816508008139e+00 -1.4130959263472918e+00 3.4616798888396310e+00 1.5998142213293227e+00 1.7245251590967909e+00 3.4616798888396403e+00 1.7245251590967916e+00 1.5998142213293234e+00 -3.4630911210566198e+00 -1.4130959263472922e+00 -1.7141816508008150e+00 -2.1890251613693015e+00 -1.4246407177364100e+00 -1.4246407177364111e+00 2.6528314057681559e+00 1.3473313997750389e+00 1.3473313997750382e+00 1.8792101044290954e+00 5.6684265573384804e+00 2.0695643152103647e+00 -2.0472782906785412e+00 -5.1840398746240197e+00 -1.6926698409125087e+00 -1.8550031965931246e+00 -3.5781466399356385e+00 -1.5066308118674407e+00 1.6283592639280589e+00 3.1532169738788927e+00 1.5790363546636588e+00 1.7849195790555443e+00 3.4764136375508503e+00 1.6084608965367280e+00 -1.7407851072325191e+00 -3.1257699492676996e+00 -1.7054599176973897e+00 -1.4737824310634782e+00 -2.4623535631933824e+00 -1.5894337852487572e+00 1.8243600781549667e+00 2.0522528582525208e+00 1.2371327893153441e+00 1.8792101044290963e+00 2.0695643152103647e+00 5.6684265573384813e+00 -2.0472782906785421e+00 -1.6926698409125089e+00 -5.1840398746240224e+00 -1.7407851072325196e+00 -1.7054599176973897e+00 -3.1257699492676920e+00 1.7849195790555443e+00 1.6084608965367284e+00 3.4764136375508428e+00 1.6283592639280606e+00 1.5790363546636601e+00 3.1532169738789011e+00 -1.8550031965931262e+00 -1.5066308118674416e+00 -3.5781466399356487e+00 -1.4737824310634788e+00 -1.5894337852487570e+00 -2.4623535631933846e+00 1.8243600781549680e+00 1.2371327893153456e+00 2.0522528582525208e+00 -5.7730045980148716e+00 -2.0472782906785412e+00 -2.0472782906785425e+00 6.5884611600113203e+00 2.0483908479289910e+00 2.0483908479289914e+00 4.0858385384974492e+00 1.8760593307757540e+00 1.5807942087427342e+00 -4.1123027377869921e+00 -1.6832635080818283e+00 -1.9650742689851046e+00 -4.1123027377870027e+00 -1.9650742689851048e+00 -1.6832635080818279e+00 4.0858385384974589e+00 1.5807942087427347e+00 1.8760593307757538e+00 2.6477244547487406e+00 1.7042370279565480e+00 1.7042370279565491e+00 -3.4102526181661070e+00 -1.5138653476585551e+00 -1.5138653476585537e+00 -1.9989625897457304e+00 -5.1840398746240197e+00 -1.6926698409125089e+00 2.0483908479289905e+00 4.9274635134432572e+00 1.3853658822617823e+00 1.8975731212960814e+00 3.2043898482797832e+00 1.2688115207928019e+00 -1.6212993508910096e+00 -2.8816526900732375e+00 -1.3261955653152757e+00 -1.7594539966225242e+00 -3.1658572028540135e+00 -1.2417648865547173e+00 1.6664354972914210e+00 2.8611497815604792e+00 1.3245969641675821e+00 1.4312585731537075e+00 2.1142107199725602e+00 1.2755154414753587e+00 -1.6639421024109380e+00 -1.8756640957048099e+00 -9.9365951591502277e-01 -1.9989625897457315e+00 -1.6926698409125087e+00 -5.1840398746240224e+00 2.0483908479289905e+00 1.3853658822617827e+00 4.9274635134432563e+00 1.6664354972914202e+00 1.3245969641675819e+00 2.8611497815604698e+00 -1.7594539966225229e+00 -1.2417648865547173e+00 -3.1658572028540051e+00 -1.6212993508910118e+00 -1.3261955653152764e+00 -2.8816526900732455e+00 1.8975731212960831e+00 1.2688115207928026e+00 3.2043898482797926e+00 1.4312585731537075e+00 1.2755154414753578e+00 2.1142107199725610e+00 -1.6639421024109375e+00 -9.9365951591502377e-01 -1.8756640957048092e+00 -3.4630911210566109e+00 -1.8550031965931246e+00 -1.7407851072325196e+00 4.0858385384974492e+00 1.8975731212960811e+00 1.6664354972914202e+00 5.6982134644078428e+00 2.0882604570413794e+00 1.6035557047083020e+00 -5.6563538361972210e+00 -1.8855852409464338e+00 -1.8074364435662422e+00 -2.7413583094517713e+00 -1.7146614980330959e+00 -1.3792426510945959e+00 2.7458619364745700e+00 1.4440708348465534e+00 1.6557552623291671e+00 3.3423907827630703e+00 1.5957553502692003e+00 1.4234944166374111e+00 -4.0115014554373314e+00 -1.5704098278805620e+00 -1.4217766790729418e+00 -1.7141816508008139e+00 -3.5781466399356385e+00 -1.7054599176973899e+00 1.8760593307757540e+00 3.2043898482797832e+00 1.3245969641675819e+00 2.0882604570413794e+00 5.4081633236238504e+00 1.4968686943663407e+00 -1.8787598778826713e+00 -4.9802859000729871e+00 -1.5352634157798715e+00 -1.7685532253223042e+00 -2.4798381327212500e+00 -1.2999069779032366e+00 1.6557552623291674e+00 2.1173688574980107e+00 1.4822393588116232e+00 1.6739477800418496e+00 3.3133106967186015e+00 1.4295222143891084e+00 -1.9325280761823636e+00 -3.0049620533903711e+00 -1.1925969203541567e+00 -1.4130959263472918e+00 -1.5066308118674405e+00 -3.1257699492676916e+00 1.5807942087427345e+00 1.2688115207928019e+00 2.8611497815604703e+00 1.6035557047083018e+00 1.4968686943663414e+00 4.6091315711350527e+00 -1.8266707977314156e+00 -1.5560350857067631e+00 -4.8719014005049814e+00 -1.3377599149068007e+00 -1.2223675969956520e+00 -1.8470661985625012e+00 1.4440708348465541e+00 1.1281807753090698e+00 2.1173688574980107e+00 1.4948340394047226e+00 1.4282014698300498e+00 2.9305026533205001e+00 -1.5457281487168069e+00 -1.0370289657284080e+00 -2.6734153151788602e+00 3.4616798888396310e+00 1.6283592639280586e+00 1.7849195790555443e+00 -4.1123027377869921e+00 -1.6212993508910101e+00 -1.7594539966225229e+00 -5.6563538361972210e+00 -1.8787598778826713e+00 -1.8266707977314156e+00 5.7175704258161577e+00 1.6739974837957927e+00 2.0273018973742651e+00 2.7113298586968706e+00 1.6084928999166213e+00 1.4864756613872316e+00 -2.7413583094517717e+00 -1.3377599149067996e+00 -1.7685532253223037e+00 -3.3160842103196542e+00 -1.5604829003704919e+00 -1.6651080020653564e+00 3.9355189204029806e+00 1.4874523964105011e+00 1.7210888839245566e+00 1.5998142213293227e+00 3.1532169738788927e+00 1.6084608965367284e+00 -1.6832635080818283e+00 -2.8816526900732375e+00 -1.2417648865547171e+00 -1.8855852409464331e+00 -4.9802859000729871e+00 -1.5560350857067629e+00 1.6739974837957927e+00 4.7322589123902583e+00 1.5149222690035533e+00 1.4864756613872327e+00 2.1034092806231071e+00 1.1970254051687572e+00 -1.3792426510945965e+00 -1.8470661985625021e+00 -1.2999069779032375e+00 -1.3694638314523955e+00 -2.9863567499653971e+00 -1.3876020274774856e+00 1.5572678650629070e+00 2.7064763717818670e+00 1.1649004069331639e+00 1.7245251590967909e+00 1.5790363546636588e+00 3.4764136375508432e+00 -1.9650742689851044e+00 -1.3261955653152759e+00 -3.1658572028540055e+00 -1.8074364435662422e+00 -1.5352634157798715e+00 -4.8719014005049814e+00 2.0273018973742647e+00 1.5149222690035535e+00 5.3171042659101921e+00 1.6084928999166219e+00 1.3953844505108095e+00 2.1034092806231062e+00 -1.7146614980330959e+00 -1.2223675969956516e+00 -2.4798381327212504e+00 -1.5707799307896049e+00 -1.5009535421552924e+00 -3.3023346761921593e+00 1.6976321849863718e+00 1.0954370460680702e+00 2.9230042281882551e+00 3.4616798888396403e+00 1.7849195790555443e+00 1.6283592639280606e+00 -4.1123027377870027e+00 -1.7594539966225244e+00 -1.6212993508910118e+00 -2.7413583094517717e+00 -1.7685532253223042e+00 -1.3377599149068007e+00 2.7113298586968702e+00 1.4864756613872327e+00 1.6084928999166217e+00 5.7175704258161950e+00 2.0273018973742682e+00 1.6739974837957960e+00 -5.6563538361972574e+00 -1.8266707977314192e+00 -1.8787598778826748e+00 -3.3160842103196631e+00 -1.6651080020653568e+00 -1.5604829003704939e+00 3.9355189204029917e+00 1.7210888839245599e+00 1.4874523964105015e+00 1.7245251590967914e+00 3.4764136375508508e+00 1.5790363546636601e+00 -1.9650742689851046e+00 -3.1658572028540131e+00 -1.3261955653152762e+00 -1.7146614980330959e+00 -2.4798381327212500e+00 -1.2223675969956520e+00 1.6084928999166213e+00 2.1034092806231071e+00 1.3953844505108091e+00 2.0273018973742678e+00 5.3171042659102250e+00 1.5149222690035558e+00 -1.8074364435662447e+00 -4.8719014005050152e+00 -1.5352634157798724e+00 -1.5707799307896058e+00 -3.3023346761921664e+00 -1.5009535421552940e+00 1.6976321849863718e+00 2.9230042281882649e+00 1.0954370460680698e+00 1.5998142213293234e+00 1.6084608965367280e+00 3.1532169738789011e+00 -1.6832635080818279e+00 -1.2417648865547173e+00 -2.8816526900732460e+00 -1.3792426510945961e+00 -1.2999069779032366e+00 -1.8470661985625012e+00 1.4864756613872314e+00 1.1970254051687572e+00 2.1034092806231062e+00 1.6739974837957963e+00 1.5149222690035560e+00 4.7322589123902912e+00 -1.8855852409464366e+00 -1.5560350857067664e+00 -4.9802859000730217e+00 -1.3694638314523959e+00 -1.3876020274774850e+00 -2.9863567499654060e+00 1.5572678650629070e+00 1.1649004069331650e+00 2.7064763717818749e+00 -3.4630911210566202e+00 -1.7407851072325191e+00 -1.8550031965931264e+00 4.0858385384974589e+00 1.6664354972914215e+00 1.8975731212960829e+00 2.7458619364745696e+00 1.6557552623291671e+00 1.4440708348465543e+00 -2.7413583094517713e+00 -1.3792426510945965e+00 -1.7146614980330959e+00 -5.6563538361972565e+00 -1.8074364435662442e+00 -1.8855852409464366e+00 5.6982134644078819e+00 1.6035557047083047e+00 2.0882604570413834e+00 3.3423907827630792e+00 1.4234944166374106e+00 1.5957553502692019e+00 -4.0115014554373412e+00 -1.4217766790729442e+00 -1.5704098278805627e+00 -1.4130959263472922e+00 -3.1257699492677000e+00 -1.5066308118674416e+00 1.5807942087427347e+00 2.8611497815604792e+00 1.2688115207928026e+00 1.4440708348465536e+00 2.1173688574980107e+00 1.1281807753090700e+00 -1.3377599149067996e+00 -1.8470661985625021e+00 -1.2223675969956516e+00 -1.8266707977314194e+00 -4.8719014005050143e+00 -1.5560350857067664e+00 1.6035557047083042e+00 4.6091315711350873e+00 1.4968686943663438e+00 1.4948340394047237e+00 2.9305026533205076e+00 1.4282014698300511e+00 -1.5457281487168064e+00 -2.6734153151788700e+00 -1.0370289657284075e+00 -1.7141816508008150e+00 -1.7054599176973897e+00 -3.5781466399356487e+00 1.8760593307757543e+00 1.3245969641675823e+00 3.2043898482797926e+00 1.6557552623291671e+00 1.4822393588116232e+00 2.1173688574980112e+00 -1.7685532253223037e+00 -1.2999069779032375e+00 -2.4798381327212504e+00 -1.8787598778826746e+00 -1.5352634157798730e+00 -4.9802859000730217e+00 2.0882604570413834e+00 1.4968686943663438e+00 5.4081633236238877e+00 1.6739477800418503e+00 1.4295222143891078e+00 3.3133106967186103e+00 -1.9325280761823638e+00 -1.1925969203541582e+00 -3.0049620533903791e+00 -2.1890251613693015e+00 -1.4737824310634782e+00 -1.4737824310634788e+00 2.6477244547487406e+00 1.4312585731537075e+00 1.4312585731537075e+00 3.3423907827630708e+00 1.6739477800418496e+00 1.4948340394047224e+00 -3.3160842103196537e+00 -1.3694638314523953e+00 -1.5707799307896047e+00 -3.3160842103196622e+00 -1.5707799307896060e+00 -1.3694638314523959e+00 3.3423907827630788e+00 1.4948340394047237e+00 1.6739477800418505e+00 4.9523966529190773e+00 1.6116922879765814e+00 1.6116922879765818e+00 -5.4637090911853514e+00 -1.7977064872713837e+00 -1.7977064872713826e+00 -1.4246407177364100e+00 -2.4623535631933824e+00 -1.5894337852487570e+00 1.7042370279565480e+00 2.1142107199725602e+00 1.2755154414753580e+00 1.5957553502692003e+00 3.3133106967186015e+00 1.4282014698300498e+00 -1.5604829003704919e+00 -2.9863567499653976e+00 -1.5009535421552922e+00 -1.6651080020653564e+00 -3.3023346761921664e+00 -1.3876020274774850e+00 1.4234944166374106e+00 2.9305026533205076e+00 1.4295222143891075e+00 1.6116922879765812e+00 5.0833141208517283e+00 1.6844245458227201e+00 -1.6849474626674834e+00 -4.6902932015124517e+00 -1.3396743166357012e+00 -1.4246407177364111e+00 -1.5894337852487572e+00 -2.4623535631933846e+00 1.7042370279565491e+00 1.2755154414753589e+00 2.1142107199725610e+00 1.4234944166374111e+00 1.4295222143891084e+00 2.9305026533205005e+00 -1.6651080020653566e+00 -1.3876020274774856e+00 -3.3023346761921593e+00 -1.5604829003704939e+00 -1.5009535421552940e+00 -2.9863567499654060e+00 1.5957553502692019e+00 1.4282014698300511e+00 3.3133106967186103e+00 1.6116922879765818e+00 1.6844245458227198e+00 5.0833141208517301e+00 -1.6849474626674845e+00 -1.3396743166357026e+00 -4.6902932015124517e+00 2.6528314057681559e+00 1.8243600781549669e+00 1.8243600781549683e+00 -3.4102526181661066e+00 -1.6639421024109378e+00 -1.6639421024109378e+00 -4.0115014554373314e+00 -1.9325280761823631e+00 -1.5457281487168069e+00 3.9355189204029806e+00 1.5572678650629068e+00 1.6976321849863718e+00 3.9355189204029917e+00 1.6976321849863718e+00 1.5572678650629070e+00 -4.0115014554373412e+00 -1.5457281487168066e+00 -1.9325280761823638e+00 -5.4637090911853505e+00 -1.6849474626674832e+00 -1.6849474626674843e+00 6.3730953736520037e+00 1.7478856617733465e+00 1.7478856617733458e+00 1.3473313997750389e+00 2.0522528582525208e+00 1.2371327893153456e+00 -1.5138653476585551e+00 -1.8756640957048099e+00 -9.9365951591502366e-01 -1.5704098278805620e+00 -3.0049620533903711e+00 -1.0370289657284080e+00 1.4874523964105011e+00 2.7064763717818670e+00 1.0954370460680705e+00 1.7210888839245597e+00 2.9230042281882649e+00 1.1649004069331652e+00 -1.4217766790729440e+00 -2.6734153151788700e+00 -1.1925969203541580e+00 -1.7977064872713833e+00 -4.6902932015124508e+00 -1.3396743166357026e+00 1.7478856617733463e+00 4.5626012075638496e+00 1.0654894763167106e+00 1.3473313997750382e+00 1.2371327893153441e+00 2.0522528582525208e+00 -1.5138653476585537e+00 -9.9365951591502277e-01 -1.8756640957048090e+00 -1.4217766790729420e+00 -1.1925969203541569e+00 -2.6734153151788611e+00 1.7210888839245571e+00 1.1649004069331639e+00 2.9230042281882547e+00 1.4874523964105020e+00 1.0954370460680698e+00 2.7064763717818749e+00 -1.5704098278805629e+00 -1.0370289657284077e+00 -3.0049620533903791e+00 -1.7977064872713826e+00 -1.3396743166357010e+00 -4.6902932015124508e+00 1.7478856617733456e+00 1.0654894763167106e+00 4.5626012075638496e+00 381 382 383 429 430 431 1155 1156 1157 1128 1129 1130 1116 1117 1118 1143 1144 1145 1158 1159 1160 1131 1132 1133 5.0586673527132211e+00 1.8266327532427820e+00 1.8266327532427811e+00 -5.5159777760009971e+00 -1.9403299809275798e+00 -1.9403299809275800e+00 -3.3552244561332234e+00 -1.6802899939391607e+00 -1.3770416450698006e+00 3.3552553988491414e+00 1.5602525650016581e+00 1.6879716578819082e+00 3.3552553988491423e+00 1.6879716578819079e+00 1.5602525650016585e+00 -3.3552244561332230e+00 -1.3770416450698004e+00 -1.6802899939391600e+00 -2.1388141261413316e+00 -1.3961820786388854e+00 -1.3961820786388865e+00 2.5960626639972730e+00 1.3189867224490794e+00 1.3189867224490786e+00 1.8266327532427815e+00 5.4427666220328685e+00 2.0324281312687460e+00 -2.0052306404714297e+00 -4.9427050018762975e+00 -1.6462809345791314e+00 -1.8183646269435889e+00 -3.4941619951911465e+00 -1.4783557324747587e+00 1.5972321341760034e+00 3.0602408304307911e+00 1.5531538811328511e+00 1.7533273993857368e+00 3.3899178883067713e+00 1.5787259992874871e+00 -1.7054849357239530e+00 -3.0366358671971194e+00 -1.6819328554984996e+00 -1.4448969681024020e+00 -2.4316094306617440e+00 -1.5714349739421849e+00 1.7967848844368535e+00 2.0121869541558750e+00 1.2136964848054883e+00 1.8266327532427813e+00 2.0324281312687460e+00 5.4427666220328668e+00 -2.0052306404714288e+00 -1.6462809345791303e+00 -4.9427050018762975e+00 -1.7054849357239521e+00 -1.6819328554984991e+00 -3.0366358671971176e+00 1.7533273993857359e+00 1.5787259992874858e+00 3.3899178883067709e+00 1.5972321341760027e+00 1.5531538811328498e+00 3.0602408304307920e+00 -1.8183646269435880e+00 -1.4783557324747578e+00 -3.4941619951911451e+00 -1.4448969681024013e+00 -1.5714349739421831e+00 -2.4316094306617435e+00 1.7967848844368519e+00 1.2136964848054883e+00 2.0121869541558732e+00 -5.5159777760009980e+00 -2.0052306404714293e+00 -2.0052306404714288e+00 6.3439407134586228e+00 1.9936244105333532e+00 1.9936244105333536e+00 3.9835262168832992e+00 1.8470031116874071e+00 1.5470588897831798e+00 -4.0138359804381931e+00 -1.6440064382185198e+00 -1.9336661673544715e+00 -4.0138359804381940e+00 -1.9336661673544717e+00 -1.6440064382185207e+00 3.9835262168832983e+00 1.5470588897831803e+00 1.8470031116874062e+00 2.5998774467914929e+00 1.6798632211126572e+00 1.6798632211126581e+00 -3.3672208571393312e+00 -1.4846463870721762e+00 -1.4846463870721749e+00 -1.9403299809275800e+00 -4.9427050018762975e+00 -1.6462809345791303e+00 1.9936244105333532e+00 4.6822270763194087e+00 1.3343703112128948e+00 1.8578360131943317e+00 3.1087287961456007e+00 1.2349197936566612e+00 -1.5844083429984723e+00 -2.7828072250315357e+00 -1.2939783839847911e+00 -1.7231688562535461e+00 -3.0699743332986813e+00 -1.2048776840292454e+00 1.6250951372585893e+00 2.7650273044925000e+00 1.2923992969643856e+00 1.4018351686961792e+00 2.0721651637470009e+00 1.2489641282695572e+00 -1.6304835495028567e+00 -1.8326617804979968e+00 -9.6551652751033057e-01 -1.9403299809275800e+00 -1.6462809345791314e+00 -4.9427050018762975e+00 1.9936244105333536e+00 1.3343703112128948e+00 4.6822270763194105e+00 1.6250951372585900e+00 1.2923992969643867e+00 2.7650273044924996e+00 -1.7231688562535461e+00 -1.2048776840292454e+00 -3.0699743332986809e+00 -1.5844083429984734e+00 -1.2939783839847911e+00 -2.7828072250315374e+00 1.8578360131943321e+00 1.2349197936566614e+00 3.1087287961456012e+00 1.4018351686961792e+00 1.2489641282695569e+00 2.0721651637470018e+00 -1.6304835495028573e+00 -9.6551652751033157e-01 -1.8326617804979961e+00 -3.3552244561332234e+00 -1.8183646269435889e+00 -1.7054849357239521e+00 3.9835262168832983e+00 1.8578360131943317e+00 1.6250951372585900e+00 5.6013477187521836e+00 2.0561203626370288e+00 1.5677363051464070e+00 -5.5616475855923220e+00 -1.8482199207715011e+00 -1.7702816773173722e+00 -2.6925266587238879e+00 -1.6845455641378626e+00 -1.3440009379269751e+00 2.6938909199939682e+00 1.4145384912946195e+00 1.6268898558876161e+00 3.3137791523026645e+00 1.5679589008730785e+00 1.3925338870696007e+00 -3.9831453074826815e+00 -1.5453236561461070e+00 -1.3924876343939128e+00 -1.6802899939391607e+00 -3.4941619951911469e+00 -1.6819328554984989e+00 1.8470031116874071e+00 3.1087287961456012e+00 1.2923992969643865e+00 2.0561203626370297e+00 5.3326879621632868e+00 1.4693772852390863e+00 -1.8484622453158970e+00 -4.8956084196345158e+00 -1.5076723430246024e+00 -1.7459678486461090e+00 -2.4461450897555252e+00 -1.2739543527582737e+00 1.6268898558876173e+00 2.0794834982642745e+00 1.4617343577975273e+00 1.6531213077300868e+00 3.3017444462933190e+00 1.4089449955131395e+00 -1.9084145500409750e+00 -2.9867291982852948e+00 -1.1688963842327627e+00 -1.3770416450698006e+00 -1.4783557324747589e+00 -3.0366358671971176e+00 1.5470588897831796e+00 1.2349197936566612e+00 2.7650273044924996e+00 1.5677363051464070e+00 1.4693772852390863e+00 4.5264263449929016e+00 -1.7979768625368673e+00 -1.5294918789069816e+00 -4.7895208250312367e+00 -1.3105161631826214e+00 -1.1984330260249170e+00 -1.8055624306519285e+00 1.4145384912946193e+00 1.1056137964123265e+00 2.0794834982642740e+00 1.4751020727775170e+00 1.4122194021234975e+00 2.9136944667858047e+00 -1.5189010882124354e+00 -1.0158496400249142e+00 -2.6529124916551972e+00 3.3552553988491414e+00 1.5972321341760030e+00 1.7533273993857359e+00 -4.0138359804381922e+00 -1.5844083429984726e+00 -1.7231688562535459e+00 -5.5616475855923220e+00 -1.8484622453158974e+00 -1.7979768625368673e+00 5.6296219559378438e+00 1.6376339772066841e+00 1.9978735298990897e+00 2.6644604820263655e+00 1.5814286977583765e+00 1.4564996686808453e+00 -2.6925266587238874e+00 -1.3105161631826214e+00 -1.7459678486461074e+00 -3.2902831012805822e+00 -1.5365180138263028e+00 -1.6445553872429111e+00 3.9089554892216349e+00 1.4636099561822309e+00 1.7039683567137593e+00 1.5602525650016581e+00 3.0602408304307915e+00 1.5787259992874862e+00 -1.6440064382185202e+00 -2.7828072250315357e+00 -1.2048776840292454e+00 -1.8482199207715011e+00 -4.8956084196345167e+00 -1.5294918789069811e+00 1.6376339772066839e+00 4.6472797587582138e+00 1.4847500572383543e+00 1.4564996686808451e+00 2.0613707937685533e+00 1.1699824370604546e+00 -1.3440009379269748e+00 -1.8055624306519280e+00 -1.2739543527582731e+00 -1.3423951696538849e+00 -2.9685306224531907e+00 -1.3679848603047513e+00 1.5242362556816946e+00 2.6836173148136129e+00 1.1428502824129547e+00 1.6879716578819079e+00 1.5531538811328509e+00 3.3899178883067709e+00 -1.9336661673544717e+00 -1.2939783839847911e+00 -3.0699743332986804e+00 -1.7702816773173722e+00 -1.5076723430246026e+00 -4.7895208250312340e+00 1.9978735298990893e+00 1.4847500572383543e+00 5.2423988695524457e+00 1.5814286977583771e+00 1.3728156118791097e+00 2.0613707937685541e+00 -1.6845455641378628e+00 -1.1984330260249172e+00 -2.4461450897555248e+00 -1.5452893068368894e+00 -1.4816273124917718e+00 -3.2915102468548985e+00 1.6665088301072226e+00 1.0709915152757674e+00 2.9034629433125678e+00 3.3552553988491414e+00 1.7533273993857368e+00 1.5972321341760030e+00 -4.0138359804381940e+00 -1.7231688562535459e+00 -1.5844083429984734e+00 -2.6925266587238883e+00 -1.7459678486461085e+00 -1.3105161631826214e+00 2.6644604820263655e+00 1.4564996686808451e+00 1.5814286977583771e+00 5.6296219559378455e+00 1.9978735298990902e+00 1.6376339772066855e+00 -5.5616475855923229e+00 -1.7979768625368675e+00 -1.8484622453158979e+00 -3.2902831012805831e+00 -1.6445553872429108e+00 -1.5365180138263039e+00 3.9089554892216354e+00 1.7039683567137605e+00 1.4636099561822300e+00 1.6879716578819079e+00 3.3899178883067713e+00 1.5531538811328498e+00 -1.9336661673544717e+00 -3.0699743332986813e+00 -1.2939783839847911e+00 -1.6845455641378626e+00 -2.4461450897555257e+00 -1.1984330260249170e+00 1.5814286977583765e+00 2.0613707937685533e+00 1.3728156118791097e+00 1.9978735298990906e+00 5.2423988695524466e+00 1.4847500572383547e+00 -1.7702816773173717e+00 -4.7895208250312349e+00 -1.5076723430246017e+00 -1.5452893068368891e+00 -3.2915102468548976e+00 -1.4816273124917723e+00 1.6665088301072224e+00 2.9034629433125687e+00 1.0709915152757665e+00 1.5602525650016583e+00 1.5787259992874871e+00 3.0602408304307920e+00 -1.6440064382185207e+00 -1.2048776840292454e+00 -2.7828072250315374e+00 -1.3440009379269751e+00 -1.2739543527582735e+00 -1.8055624306519285e+00 1.4564996686808453e+00 1.1699824370604546e+00 2.0613707937685537e+00 1.6376339772066855e+00 1.4847500572383550e+00 4.6472797587582164e+00 -1.8482199207715020e+00 -1.5294918789069822e+00 -4.8956084196345175e+00 -1.3423951696538854e+00 -1.3679848603047513e+00 -2.9685306224531920e+00 1.5242362556816953e+00 1.1428502824129561e+00 2.6836173148136124e+00 -3.3552244561332230e+00 -1.7054849357239532e+00 -1.8183646269435880e+00 3.9835262168832983e+00 1.6250951372585896e+00 1.8578360131943321e+00 2.6938909199939687e+00 1.6268898558876173e+00 1.4145384912946195e+00 -2.6925266587238874e+00 -1.3440009379269748e+00 -1.6845455641378628e+00 -5.5616475855923220e+00 -1.7702816773173717e+00 -1.8482199207715020e+00 5.6013477187521818e+00 1.5677363051464070e+00 2.0561203626370297e+00 3.3137791523026641e+00 1.3925338870695998e+00 1.5679589008730792e+00 -3.9831453074826819e+00 -1.3924876343939139e+00 -1.5453236561461063e+00 -1.3770416450698004e+00 -3.0366358671971185e+00 -1.4783557324747578e+00 1.5470588897831801e+00 2.7650273044925000e+00 1.2349197936566614e+00 1.4145384912946195e+00 2.0794834982642745e+00 1.1056137964123265e+00 -1.3105161631826214e+00 -1.8055624306519280e+00 -1.1984330260249172e+00 -1.7979768625368675e+00 -4.7895208250312358e+00 -1.5294918789069822e+00 1.5677363051464070e+00 4.5264263449929008e+00 1.4693772852390861e+00 1.4751020727775173e+00 2.9136944667858042e+00 1.4122194021234979e+00 -1.5189010882124356e+00 -2.6529124916551976e+00 -1.0158496400249135e+00 -1.6802899939391602e+00 -1.6819328554984994e+00 -3.4941619951911451e+00 1.8470031116874062e+00 1.2923992969643856e+00 3.1087287961456012e+00 1.6268898558876161e+00 1.4617343577975273e+00 2.0794834982642740e+00 -1.7459678486461079e+00 -1.2739543527582726e+00 -2.4461450897555244e+00 -1.8484622453158979e+00 -1.5076723430246020e+00 -4.8956084196345175e+00 2.0561203626370297e+00 1.4693772852390858e+00 5.3326879621632859e+00 1.6531213077300864e+00 1.4089449955131383e+00 3.3017444462933194e+00 -1.9084145500409744e+00 -1.1688963842327635e+00 -2.9867291982852935e+00 -2.1388141261413316e+00 -1.4448969681024020e+00 -1.4448969681024013e+00 2.5998774467914929e+00 1.4018351686961792e+00 1.4018351686961792e+00 3.3137791523026645e+00 1.6531213077300868e+00 1.4751020727775170e+00 -3.2902831012805822e+00 -1.3423951696538849e+00 -1.5452893068368894e+00 -3.2902831012805831e+00 -1.5452893068368891e+00 -1.3423951696538854e+00 3.3137791523026650e+00 1.4751020727775173e+00 1.6531213077300864e+00 5.0020417624546170e+00 1.5953268763585948e+00 1.5953268763585959e+00 -5.5100971851489398e+00 -1.7928039809692018e+00 -1.7928039809692016e+00 -1.3961820786388857e+00 -2.4316094306617440e+00 -1.5714349739421831e+00 1.6798632211126572e+00 2.0721651637470009e+00 1.2489641282695569e+00 1.5679589008730785e+00 3.3017444462933199e+00 1.4122194021234975e+00 -1.5365180138263030e+00 -2.9685306224531907e+00 -1.4816273124917718e+00 -1.6445553872429111e+00 -3.2915102468548980e+00 -1.3679848603047513e+00 1.3925338870695998e+00 2.9136944667858042e+00 1.4089449955131386e+00 1.5953268763585953e+00 5.1478092803426438e+00 1.6763845167390410e+00 -1.6584274057058326e+00 -4.7437630571989367e+00 -1.3254658959065257e+00 -1.3961820786388865e+00 -1.5714349739421849e+00 -2.4316094306617440e+00 1.6798632211126583e+00 1.2489641282695572e+00 2.0721651637470018e+00 1.3925338870696007e+00 1.4089449955131395e+00 2.9136944667858047e+00 -1.6445553872429108e+00 -1.3679848603047513e+00 -3.2915102468548980e+00 -1.5365180138263042e+00 -1.4816273124917723e+00 -2.9685306224531920e+00 1.5679589008730792e+00 1.4122194021234979e+00 3.3017444462933199e+00 1.5953268763585959e+00 1.6763845167390405e+00 5.1478092803426456e+00 -1.6584274057058332e+00 -1.3254658959065262e+00 -4.7437630571989358e+00 2.5960626639972730e+00 1.7967848844368535e+00 1.7967848844368519e+00 -3.3672208571393312e+00 -1.6304835495028567e+00 -1.6304835495028573e+00 -3.9831453074826819e+00 -1.9084145500409750e+00 -1.5189010882124352e+00 3.9089554892216349e+00 1.5242362556816946e+00 1.6665088301072226e+00 3.9089554892216354e+00 1.6665088301072224e+00 1.5242362556816953e+00 -3.9831453074826815e+00 -1.5189010882124359e+00 -1.9084145500409742e+00 -5.5100971851489406e+00 -1.6584274057058321e+00 -1.6584274057058330e+00 6.4296350148130932e+00 1.7286966232363292e+00 1.7286966232363283e+00 1.3189867224490792e+00 2.0121869541558750e+00 1.2136964848054883e+00 -1.4846463870721762e+00 -1.8326617804979968e+00 -9.6551652751033157e-01 -1.5453236561461068e+00 -2.9867291982852944e+00 -1.0158496400249142e+00 1.4636099561822307e+00 2.6836173148136129e+00 1.0709915152757674e+00 1.7039683567137605e+00 2.9034629433125687e+00 1.1428502824129561e+00 -1.3924876343939139e+00 -2.6529124916551976e+00 -1.1688963842327633e+00 -1.7928039809692020e+00 -4.7437630571989358e+00 -1.3254658959065266e+00 1.7286966232363292e+00 4.6167993153553679e+00 1.0481901651803225e+00 1.3189867224490786e+00 1.2136964848054883e+00 2.0121869541558737e+00 -1.4846463870721749e+00 -9.6551652751033057e-01 -1.8326617804979961e+00 -1.3924876343939128e+00 -1.1688963842327627e+00 -2.6529124916551972e+00 1.7039683567137591e+00 1.1428502824129547e+00 2.9034629433125678e+00 1.4636099561822302e+00 1.0709915152757665e+00 2.6836173148136133e+00 -1.5453236561461061e+00 -1.0158496400249135e+00 -2.9867291982852935e+00 -1.7928039809692022e+00 -1.3254658959065257e+00 -4.7437630571989358e+00 1.7286966232363281e+00 1.0481901651803220e+00 4.6167993153553661e+00 276 277 278 1107 1108 1109 1110 1111 1112 291 292 293 948 949 950 996 997 998 1008 1009 1010 960 961 962 6.7293179993510970e+00 5.9187829202009856e-01 3.1481450946335805e+00 -7.0036560719057261e+00 -3.7369874201985365e-01 -3.2928954296779920e+00 -4.5452841510399526e+00 -5.7988303779753092e-01 -2.7104198659199277e+00 4.1949006721307907e+00 2.9488416411255336e-01 2.8095593021543315e+00 4.6294791108258124e+00 5.9123996605484286e-01 2.9975914485155220e+00 -4.2945392921937078e+00 -1.8873389503721985e-01 -2.9242016790372567e+00 -3.0584015306902659e+00 -5.2864912323926172e-01 -2.6909896648619931e+00 3.3481832635219528e+00 1.9296237590637128e-01 2.6632107941937342e+00 5.9187829202009867e-01 4.6030114914392888e+00 8.1905018816461395e-01 -3.4208084970645414e-01 -4.3594643313788302e+00 -3.7909683221167556e-01 -6.1535641852352829e-01 -2.3622100471652101e+00 -7.1165918893999069e-01 2.5722665638397546e-01 2.1818153874337698e+00 3.6378043340304267e-01 5.9230144806611507e-01 2.3518144902650224e+00 7.2435652007331397e-01 -4.0580215714997192e-01 -2.2336546520158946e+00 -5.7235664846303580e-01 -5.2614829496943971e-01 -1.2719534973373157e+00 -7.3239419672961392e-01 4.4798132387920453e-01 1.0906411587591713e+00 4.8831972470334523e-01 3.1481450946335814e+00 8.1905018816461372e-01 8.7904802043597936e+00 -3.2622518556546014e+00 -4.1403481188240127e-01 -8.3485795953385562e+00 -3.0241074791936664e+00 -7.4537213222785259e-01 -5.6868999056758707e+00 2.8008187616760045e+00 4.1350115847513613e-01 6.0964603989759247e+00 2.9816437974161745e+00 7.1809037401474518e-01 5.8279184304144165e+00 -2.9100904373665228e+00 -2.6607019376518870e-01 -6.3193347268363205e+00 -2.6933284305853888e+00 -7.3649640902167834e-01 -4.8850511179991924e+00 2.9591705490744182e+00 2.1133182624262581e-01 4.5250063120998076e+00 -7.0036560719057261e+00 -3.4208084970645414e-01 -3.2622518556546014e+00 7.4696078499687539e+00 3.1230591948370329e-02 3.3638634209493126e+00 4.9162935814837789e+00 3.0257724948082926e-01 2.9564977663780132e+00 -4.5644827919208506e+00 2.2904805484923281e-03 -3.1028169760874733e+00 -5.0852997946984289e+00 -4.6680979826229274e-01 -3.0709629208516636e+00 4.6757799763424401e+00 4.5684000383513182e-02 3.0515097489348495e+00 3.3878385332189516e+00 4.5113440620167899e-01 2.9774789108239310e+00 -3.7960812824889172e+00 -2.4026080594136984e-02 -2.9133180944923667e+00 -3.7369874201985365e-01 -4.3594643313788302e+00 -4.1403481188240132e-01 3.1230591948370336e-02 4.3918304260265240e+00 3.5885877003755479e-02 3.3612220411439597e-01 2.1926327341180611e+00 3.6838881767910248e-01 5.7388857269437396e-03 -2.2116928226042001e+00 4.3964684563720068e-03 -1.9623902832525311e-01 -2.2230685408334838e+00 -2.0954113978554939e-01 2.6287675927855234e-02 2.2217776444813540e+00 3.0009856690545518e-02 1.7612993590578960e-01 1.1133622234471203e+00 1.8980899429539022e-01 -5.5715232782481451e-03 -1.1253773332565455e+00 -4.9140624572150144e-03 -3.2928954296779920e+00 -3.7909683221167556e-01 -8.3485795953385562e+00 3.3638634209493121e+00 3.5885877003755548e-02 8.0644377008478560e+00 2.9446300263987455e+00 3.2858090636182047e-01 5.3948406451031836e+00 -2.7650714796614886e+00 5.4713746307377131e-03 -5.8227703389389740e+00 -3.0855642805502956e+00 -5.0463596792154441e-01 -5.5156039773726402e+00 3.0602703136145868e+00 5.3539457580295303e-02 5.9531650540119312e+00 2.6606354847529277e+00 4.8504288196158812e-01 4.5493936411405560e+00 -2.8858680558257950e+00 -2.4787697404977140e-02 -4.2748831294533529e+00 -4.5452841510399526e+00 -6.1535641852352829e-01 -3.0241074791936668e+00 4.9162935814837789e+00 3.3612220411439597e-01 2.9446300263987455e+00 7.4777247912227036e+00 6.7541673998960539e-01 3.2543258875936147e+00 -7.0375037200829702e+00 -3.3049030095428905e-01 -3.2094285445655268e+00 -3.7768603625320520e+00 -6.0653532764594109e-01 -2.8397228237591281e+00 3.3879114740365432e+00 1.7123966999677892e-01 2.9849341701878638e+00 4.6494550133974872e+00 5.8191440819894935e-01 2.9314219997922684e+00 -5.0717366264855368e+00 -2.1231097517597117e-01 -3.0420532364541719e+00 -5.7988303779753092e-01 -2.3622100471652097e+00 -7.4537213222785248e-01 3.0257724948082920e-01 2.1926327341180611e+00 3.2858090636182047e-01 6.7541673998960539e-01 4.6207102316191087e+00 7.2782697473121527e-01 -2.9206660182006539e-01 -4.4371016198039870e+00 -4.0131669141219822e-01 -6.1603299087268515e-01 -1.2677977093770145e+00 -6.6158935491421023e-01 3.8522454451617388e-01 1.1171765129310758e+00 5.4137479383404552e-01 5.8919476696285611e-01 2.4036115173063659e+00 7.1478202675778124e-01 -4.6443067045918274e-01 -2.2670216196283981e+00 -5.0428652313060163e-01 -2.7104198659199277e+00 -7.1165918893999069e-01 -5.6868999056758698e+00 2.9564977663780128e+00 3.6838881767910242e-01 5.3948406451031845e+00 3.2543258875936147e+00 7.2782697473121516e-01 7.9878334829838451e+00 -3.2724728738652780e+00 -4.5656304096512801e-01 -8.3880906354076963e+00 -2.8289293934324511e+00 -6.4892658307894591e-01 -4.1585307525683541e+00 2.6552944407763102e+00 2.3705866955344682e-01 4.5362662076509572e+00 2.9653227932589088e+00 7.1324036481570940e-01 5.8284687172704981e+00 -3.0196187547891880e+00 -2.2936601379540925e-01 -5.5138877593565647e+00 4.1949006721307907e+00 2.5722665638397552e-01 2.8008187616760045e+00 -4.5644827919208506e+00 5.7388857269437387e-03 -2.7650714796614881e+00 -7.0375037200829702e+00 -2.9206660182006539e-01 -3.2724728738652789e+00 6.7921195856617276e+00 3.3074840008065737e-02 3.1709945101757988e+00 3.3449212840045037e+00 3.7588362810056575e-01 2.6402846647518095e+00 -3.0752495597481513e+00 -2.5537315062020383e-02 -2.7355025521610021e+00 -4.2931467918478070e+00 -3.9739286248766914e-01 -2.8637882003075408e+00 4.6384413218027545e+00 4.3072769150203999e-02 3.0247371693916980e+00 2.9488416411255342e-01 2.1818153874337698e+00 4.1350115847513602e-01 2.2904805484923133e-03 -2.2116928226042001e+00 5.4713746307376993e-03 -3.3049030095428911e-01 -4.4371016198039870e+00 -4.5656304096512812e-01 3.3074840008065751e-02 4.5340698897527822e+00 4.3721028902896863e-02 1.4926709224186255e-01 1.0849099364182966e+00 2.1226458764158923e-01 -5.8555939700501176e-03 -1.1294119269749097e+00 -9.8820937426006596e-03 -1.6639484606428642e-01 -2.2705567088285972e+00 -2.3907789739399787e-01 2.3224164077651557e-02 2.2479678646068457e+00 3.0564882451366796e-02 2.8095593021543315e+00 3.6378043340304267e-01 6.0964603989759238e+00 -3.1028169760874733e+00 4.3964684563720397e-03 -5.8227703389389740e+00 -3.2094285445655273e+00 -4.0131669141219822e-01 -8.3880906354076963e+00 3.1709945101757984e+00 4.3721028902896863e-02 8.9819323553680270e+00 2.9905371722759932e+00 5.3631008638065081e-01 4.5180757391434945e+00 -2.7625593346632127e+00 -3.7910312039859083e-02 -5.0143682145130093e+00 -2.8798319492049216e+00 -5.6343958463414534e-01 -6.3192332487603498e+00 2.9835458199150100e+00 5.4458570943240150e-02 5.9479939441325849e+00 4.6294791108258115e+00 5.9230144806611496e-01 2.9816437974161736e+00 -5.0852997946984289e+00 -1.9623902832525311e-01 -3.0855642805502965e+00 -3.7768603625320520e+00 -6.1603299087268515e-01 -2.8289293934324511e+00 3.3449212840045037e+00 1.4926709224186252e-01 2.9905371722759928e+00 7.8100381625252968e+00 7.2124958164362285e-01 3.5111599553784876e+00 -7.2979063285526173e+00 -3.4612026760171610e-01 -3.4925052551951312e+00 -4.7655746117592095e+00 -6.5544391150616377e-01 -3.2285776387849094e+00 5.1412025401866943e+00 3.5101807635421750e-01 3.1522356428921312e+00 5.9123996605484275e-01 2.3518144902650220e+00 7.1809037401474518e-01 -4.6680979826229274e-01 -2.2230685408334838e+00 -5.0463596792154441e-01 -6.0653532764594109e-01 -1.2677977093770147e+00 -6.4892658307894591e-01 3.7588362810056575e-01 1.0849099364182966e+00 5.3631008638065092e-01 7.2124958164362285e-01 4.7270796088321081e+00 7.7809577820791653e-01 -3.4991349451784792e-01 -4.4915875469837561e+00 -4.7474681979153005e-01 -6.0903432383026390e-01 -2.4327061527986453e+00 -7.8337657333694388e-01 3.4391976845731398e-01 2.2513559144774731e+00 3.7918970552565179e-01 2.9975914485155220e+00 7.2435652007331408e-01 5.8279184304144165e+00 -3.0709629208516636e+00 -2.0954113978554939e-01 -5.5156039773726411e+00 -2.8397228237591281e+00 -6.6158935491421023e-01 -4.1585307525683533e+00 2.6402846647518095e+00 2.1226458764158923e-01 4.5180757391434927e+00 3.5111599553784876e+00 7.7809577820791676e-01 8.3675412164249767e+00 -3.4831459925266492e+00 -4.6885777075784063e-01 -8.7214061471859168e+00 -2.8988349528618960e+00 -7.5842897594129488e-01 -5.9911473814546161e+00 3.1436306213535175e+00 3.8370035547607528e-01 5.6731528725986395e+00 -4.2945392921937078e+00 -4.0580215714997192e-01 -2.9100904373665233e+00 4.6757799763424410e+00 2.6287675927855240e-02 3.0602703136145868e+00 3.3879114740365432e+00 3.8522454451617388e-01 2.6552944407763102e+00 -3.0752495597481513e+00 -5.8555939700501002e-03 -2.7625593346632127e+00 -7.2979063285526173e+00 -3.4991349451784787e-01 -3.4831459925266492e+00 6.9675600625166441e+00 6.0657276661488853e-02 3.4082697220123546e+00 4.4221758111343030e+00 3.0913874800189078e-01 3.0064214008995824e+00 -4.7857321435354523e+00 -1.9736999469538781e-02 -2.9744601127464487e+00 -1.8873389503721988e-01 -2.2336546520158946e+00 -2.6607019376518876e-01 4.5684000383513161e-02 2.2217776444813540e+00 5.3539457580295310e-02 1.7123966999677889e-01 1.1171765129310758e+00 2.3705866955344687e-01 -2.5537315062020380e-02 -1.1294119269749097e+00 -3.7910312039859097e-02 -3.4612026760171610e-01 -4.4915875469837570e+00 -4.6885777075784063e-01 6.0657276661488867e-02 4.5180462818285552e+00 8.1004602123736405e-02 3.0645245294042511e-01 2.2692618955341679e+00 4.2945814104059726e-01 -2.3641922281249710e-02 -2.2716082088005911e+00 -2.8222593735187273e-02 -2.9242016790372563e+00 -5.7235664846303569e-01 -6.3193347268363205e+00 3.0515097489348495e+00 3.0009856690545494e-02 5.9531650540119312e+00 2.9849341701878638e+00 5.4137479383404563e-01 4.5362662076509572e+00 -2.7355025521610021e+00 -9.8820937426006526e-03 -5.0143682145130084e+00 -3.4925052551951312e+00 -4.7474681979153011e-01 -8.7214061471859186e+00 3.4082697220123541e+00 8.1004602123736391e-02 9.2539611130358459e+00 2.9944444564987371e+00 4.2968781641199222e-01 6.4361293749531630e+00 -3.2869486112404140e+00 -2.5091507063153305e-02 -6.1244126611166489e+00 -3.0584015306902659e+00 -5.2614829496943982e-01 -2.6933284305853888e+00 3.3878385332189520e+00 1.7612993590578960e-01 2.6606354847529277e+00 4.6494550133974872e+00 5.8919476696285622e-01 2.9653227932589088e+00 -4.2931467918478070e+00 -1.6639484606428642e-01 -2.8798319492049216e+00 -4.7655746117592095e+00 -6.0903432383026390e-01 -2.8988349528618969e+00 4.4221758111343030e+00 3.0645245294042522e-01 2.9944444564987371e+00 6.9922073001938703e+00 6.2092268166087816e-01 3.3033587911132183e+00 -7.3345537236473302e+00 -3.9112237260595883e-01 -3.4517661929715850e+00 -5.2864912323926172e-01 -1.2719534973373157e+00 -7.3649640902167834e-01 4.5113440620167894e-01 1.1133622234471201e+00 4.8504288196158818e-01 5.8191440819894935e-01 2.4036115173063659e+00 7.1324036481570952e-01 -3.9739286248766914e-01 -2.2705567088285972e+00 -5.6343958463414534e-01 -6.5544391150616377e-01 -2.4327061527986453e+00 -7.5842897594129488e-01 3.0913874800189084e-01 2.2692618955341679e+00 4.2968781641199227e-01 6.2092268166087816e-01 4.7625871155074222e+00 8.5986409012470422e-01 -3.8162434683030261e-01 -4.5736063928305182e+00 -4.2947018371687556e-01 -2.6909896648619935e+00 -7.3239419672961392e-01 -4.8850511179991924e+00 2.9774789108239310e+00 1.8980899429539025e-01 4.5493936411405560e+00 2.9314219997922684e+00 7.1478202675778135e-01 5.8284687172704981e+00 -2.8637882003075408e+00 -2.3907789739399790e-01 -6.3192332487603489e+00 -3.2285776387849090e+00 -7.8337657333694399e-01 -5.9911473814546161e+00 3.0064214008995820e+00 4.2945814104059726e-01 6.4361293749531630e+00 3.3033587911132183e+00 8.5986409012470433e-01 9.1605401191216966e+00 -3.4353255986745568e+00 -4.3906458475791715e-01 -8.7791001042717554e+00 3.3481832635219533e+00 4.4798132387920453e-01 2.9591705490744182e+00 -3.7960812824889172e+00 -5.5715232782481416e-03 -2.8858680558257941e+00 -5.0717366264855377e+00 -4.6443067045918274e-01 -3.0196187547891888e+00 4.6384413218027554e+00 2.3224164077651550e-02 2.9835458199150096e+00 5.1412025401866952e+00 3.4391976845731403e-01 3.1436306213535179e+00 -4.7857321435354514e+00 -2.3641922281249728e-02 -3.2869486112404140e+00 -7.3345537236473302e+00 -3.8162434683030255e-01 -3.4353255986745554e+00 7.8602766506458348e+00 6.0143206434812829e-02 3.5414140301870081e+00 1.9296237590637128e-01 1.0906411587591713e+00 2.1133182624262575e-01 -2.4026080594136991e-02 -1.1253773332565453e+00 -2.4787697404977143e-02 -2.1231097517597117e-01 -2.2670216196283981e+00 -2.2936601379540925e-01 4.3072769150204006e-02 2.2479678646068457e+00 5.4458570943240137e-02 3.5101807635421756e-01 2.2513559144774726e+00 3.8370035547607528e-01 -1.9736999469538767e-02 -2.2716082088005911e+00 -2.5091507063153280e-02 -3.9112237260595883e-01 -4.5736063928305182e+00 -4.3906458475791704e-01 6.0143206434812850e-02 4.6476486166725630e+00 6.8819050359515493e-02 2.6632107941937337e+00 4.8831972470334528e-01 4.5250063120998076e+00 -2.9133180944923667e+00 -4.9140624572149971e-03 -4.2748831294533538e+00 -3.0420532364541728e+00 -5.0428652313060152e-01 -5.5138877593565638e+00 3.0247371693916980e+00 3.0564882451366807e-02 5.9479939441325840e+00 3.1522356428921317e+00 3.7918970552565184e-01 5.6731528725986395e+00 -2.9744601127464483e+00 -2.8222593735187294e-02 -6.1244126611166489e+00 -3.4517661929715846e+00 -4.2947018371687562e-01 -8.7791001042717571e+00 3.5414140301870085e+00 6.8819050359515549e-02 8.5461305253672926e+00 1107 1108 1109 1134 1135 1136 1137 1138 1139 1110 1111 1112 996 997 998 1044 1045 1046 1056 1057 1058 1008 1009 1010 6.8169495937818425e+00 5.9027585863174270e-01 3.1156679047935478e+00 -7.0954896200906683e+00 -3.8059913182286953e-01 -3.2734643663673633e+00 -4.5341737024605013e+00 -5.7617907958731429e-01 -2.6671766002704875e+00 4.1768743921277069e+00 2.9666258136923279e-01 2.7653934209124054e+00 4.5850994106149798e+00 5.9225856759748940e-01 2.9528911743633857e+00 -4.2461545459320096e+00 -1.8103883663599332e-01 -2.8696431885693343e+00 -2.9906188536118559e+00 -5.2670830600999607e-01 -2.6352755414722835e+00 3.2875133255705045e+00 1.8532834645770790e-01 2.6116071966101280e+00 5.9027585863174270e-01 4.7208103369455596e+00 8.1914105035915497e-01 -3.3193206505183737e-01 -4.4732726487916645e+00 -3.6653187656841130e-01 -6.1544303654592392e-01 -2.3861231971056447e+00 -7.1021695065841528e-01 2.4608570082551642e-01 2.2018347274929133e+00 3.5029667625270544e-01 5.8791295681154343e-01 2.3499416515549645e+00 7.2029059002115570e-01 -3.9889820166048967e-01 -2.2270710001748424e+00 -5.6466949697389235e-01 -5.2138419238649014e-01 -1.2532917245116530e+00 -7.2857562417097277e-01 4.4338297937593835e-01 1.0671718545903697e+00 4.8026563173867559e-01 3.1156679047935483e+00 8.1914105035915508e-01 8.8723826067975420e+00 -3.2270441166108021e+00 -4.2037815834217168e-01 -8.4293916850601871e+00 -2.9817921010521560e+00 -7.4115092379182879e-01 -5.6535749582717374e+00 2.7539129798718336e+00 4.1741515706941379e-01 6.0685444931960832e+00 2.9271947037917765e+00 7.1829587281038532e-01 5.7614026058980148e+00 -2.8614574368321413e+00 -2.5650660097852990e-01 -6.2573918789122400e+00 -2.6378366194141889e+00 -7.3670185438397784e-01 -4.8018931270576095e+00 2.9113546854521308e+00 1.9988545725755349e-01 4.4399219434101358e+00 -7.0954896200906665e+00 -3.3193206505183737e-01 -3.2270441166108021e+00 7.5744024102165319e+00 2.6134035046094239e-02 3.3404713306050224e+00 4.9138338390012635e+00 2.9236372650602244e-01 2.9153749840523187e+00 -4.5544597711552317e+00 7.1009578993221790e-03 -3.0627574631196364e+00 -5.0515414198371378e+00 -4.6609404227905482e-01 -3.0280004554857962e+00 4.6347203794729079e+00 3.4742534073277376e-02 3.0006735242340219e+00 3.3242794422260471e+00 4.5107354587791504e-01 2.9282456589429842e+00 -3.7457452598337149e+00 -1.3388692071738179e-02 -2.8669634626181111e+00 -3.8059913182286959e-01 -4.4732726487916645e+00 -4.2037815834217168e-01 2.6134035046094184e-02 4.5111387607571078e+00 3.0546073044397309e-02 3.4007139028738947e-01 2.2153348895565035e+00 3.7177579633179675e-01 1.2722585855909511e-02 -2.2367382989568450e+00 1.3744349514685511e-02 -1.9350750040806869e-01 -2.2211948479228627e+00 -2.0658909392739447e-01 2.0402488651845168e-02 2.2201508697391712e+00 2.3123538018747676e-02 1.7340847542475482e-01 1.0923040786293390e+00 1.8508995994929409e-01 1.3676569649449819e-03 -1.1077228030107498e+00 2.6875354106448545e-03 -3.2734643663673633e+00 -3.6653187656841124e-01 -8.4293916850601889e+00 3.3404713306050224e+00 3.0546073044397305e-02 8.1500579408469083e+00 2.9069549133439763e+00 3.1673596953709593e-01 5.3650796670399057e+00 -2.7245752905116305e+00 1.0643616772590365e-02 -5.7999031091616260e+00 -3.0366710691886669e+00 -5.0173336259866619e-01 -5.4543383228457305e+00 3.0186043077328542e+00 4.0649765516866061e-02 5.8950511377716204e+00 2.6083447226259624e+00 4.8287439662320275e-01 4.4689270677349784e+00 -2.8396645482401537e+00 -1.3184582327074142e-02 -4.1954826963258647e+00 -4.5341737024605004e+00 -6.1544303654592392e-01 -2.9817921010521560e+00 4.9138338390012635e+00 3.4007139028738947e-01 2.9069549133439763e+00 7.4269255956927820e+00 6.7419803731865791e-01 3.2065753748646642e+00 -6.9753970465348605e+00 -3.3057741203452268e-01 -3.1618567116209095e+00 -3.7232467458794005e+00 -6.0967102341020429e-01 -2.7936713505357997e+00 3.3282024458749189e+00 1.6187702638272317e-01 2.9380858693308074e+00 4.5238271158428134e+00 5.8199598439039013e-01 2.8756917941406144e+00 -4.9599715015370158e+00 -2.0245096638850893e-01 -2.9899877884711961e+00 -5.7617907958731440e-01 -2.3861231971056447e+00 -7.4115092379182868e-01 2.9236372650602233e-01 2.2153348895565035e+00 3.1673596953709582e-01 6.7419803731865779e-01 4.6019199819140519e+00 7.2319501441757184e-01 -2.8134659329016731e-01 -4.4134963724990985e+00 -3.8990166427914941e-01 -6.1218762735600052e-01 -1.2509352069009196e+00 -6.5551355117800481e-01 3.7846576120075237e-01 1.0948187184296434e+00 5.3509175203379755e-01 5.8379182090012172e-01 2.3297736749329720e+00 7.0851160204224206e-01 -4.5910604569207158e-01 -2.1912924883275071e+00 -4.9696819878172388e-01 -2.6671766002704866e+00 -7.1021695065841539e-01 -5.6535749582717374e+00 2.9153749840523191e+00 3.7177579633179675e-01 5.3650796670399039e+00 3.2065753748646642e+00 7.2319501441757184e-01 7.9016112941384851e+00 -3.2238858033861857e+00 -4.5830353879345492e-01 -8.3047865278119648e+00 -2.7755318910785283e+00 -6.4863304001448685e-01 -4.0736952652003895e+00 2.6034283578216657e+00 2.2750340821480683e-01 4.4525203960229911e+00 2.9009188997998203e+00 7.1177671824852295e-01 5.6777890063004604e+00 -2.9597033218032678e+00 -2.1709740774634045e-01 -5.3649436122177496e+00 4.1768743921277069e+00 2.4608570082551645e-01 2.7539129798718336e+00 -4.5544597711552317e+00 1.2722585855909510e-02 -2.7245752905116301e+00 -6.9753970465348605e+00 -2.8134659329016737e-01 -3.2238858033861848e+00 6.7281273517271698e+00 2.7285561460302102e-02 3.1196612368796122e+00 3.2807252666696973e+00 3.7264111639383873e-01 2.5876873265767588e+00 -3.0104457087292067e+00 -1.4842953175490106e-02 -2.6798374320909972e+00 -4.1617898150300610e+00 -3.9428035580431470e-01 -2.7968401518182042e+00 4.5163653309247858e+00 3.1734937734404750e-02 2.9638771344788108e+00 2.9666258136923279e-01 2.2018347274929129e+00 4.1741515706941368e-01 7.1009578993222067e-03 -2.2367382989568450e+00 1.0643616772590379e-02 -3.3057741203452268e-01 -4.4134963724990985e+00 -4.5830353879345492e-01 2.7285561460302102e-02 4.5155750301642943e+00 3.5551788698127085e-02 1.4465894841492541e-01 1.0625619348399029e+00 2.0830992831319511e-01 -1.2141871509083156e-03 -1.1100417531037969e+00 -3.4074155789912712e-03 -1.6113241170328613e-01 -2.1925330913967143e+00 -2.3259234905661499e-01 1.7215961744934755e-02 2.1728378234593460e+00 2.2382812575735055e-02 2.7653934209124054e+00 3.5029667625270544e-01 6.0685444931960841e+00 -3.0627574631196364e+00 1.3744349514685485e-02 -5.7999031091616260e+00 -3.1618567116209091e+00 -3.8990166427914952e-01 -8.3047865278119648e+00 3.1196612368796122e+00 3.5551788698127085e-02 8.9101464609051959e+00 2.9418992201274108e+00 5.3522369027442873e-01 4.4352127573690847e+00 -2.7131296951711961e+00 -2.2958181725716353e-02 -4.9375789845828564e+00 -2.8200449459725525e+00 -5.6211569615311108e-01 -6.1727997065788314e+00 2.9308349379648675e+00 4.0159037418029259e-02 5.8011646166649120e+00 4.5850994106149798e+00 5.8791295681154343e-01 2.9271947037917765e+00 -5.0515414198371378e+00 -1.9350750040806863e-01 -3.0366710691886665e+00 -3.7232467458794005e+00 -6.1218762735600063e-01 -2.7755318910785283e+00 3.2807252666696973e+00 1.4465894841492541e-01 2.9418992201274103e+00 7.6355661736610445e+00 7.2116138098638061e-01 3.4417617982897810e+00 -7.1137572603836379e+00 -3.3350993231326459e-01 -3.4217554357839020e+00 -4.6069825338437962e+00 -6.5309275285822765e-01 -3.1647262722136507e+00 4.9941371089982489e+00 3.3856452672271098e-01 3.0878289460557786e+00 5.9225856759748940e-01 2.3499416515549645e+00 7.1829587281038532e-01 -4.6609404227905482e-01 -2.2211948479228627e+00 -5.0173336259866619e-01 -6.0967102341020429e-01 -1.2509352069009201e+00 -6.4863304001448685e-01 3.7264111639383868e-01 1.0625619348399029e+00 5.3522369027442873e-01 7.2116138098638072e-01 4.6080192727323412e+00 7.7508975226591981e-01 -3.4606574818672797e-01 -4.3622983725935356e+00 -4.7208734706893796e-01 -6.0794447503293458e-01 -2.3336674342852706e+00 -7.8352024520379926e-01 3.4371422393121270e-01 2.1475730025753785e+00 3.7736467953515573e-01 2.9528911743633857e+00 7.2029059002115570e-01 5.7614026058980139e+00 -3.0280004554857962e+00 -2.0658909392739447e-01 -5.4543383228457296e+00 -2.7936713505357993e+00 -6.5551355117800481e-01 -4.0736952652003895e+00 2.5876873265767588e+00 2.0830992831319509e-01 4.4352127573690847e+00 3.4417617982897810e+00 7.7508975226591981e-01 8.1569839935452322e+00 -3.4147975582819781e+00 -4.5575645908077173e-01 -8.5085233417873454e+00 -2.8279983108433582e+00 -7.5437522580535665e-01 -5.8073996965213812e+00 3.0821273759170045e+00 3.6854405939125612e-01 5.4903572695425122e+00 -4.2461545459320087e+00 -3.9889820166048967e-01 -2.8614574368321413e+00 4.6347203794729079e+00 2.0402488651845158e-02 3.0186043077328542e+00 3.3282024458749189e+00 3.7846576120075243e-01 2.6034283578216653e+00 -3.0104457087292067e+00 -1.2141871509083260e-03 -2.7131296951711961e+00 -7.1137572603836379e+00 -3.4606574818672803e-01 -3.4147975582819781e+00 6.7814738508374566e+00 4.8530057041893643e-02 3.3365568226447229e+00 4.2610121034261672e+00 3.0808005990994963e-01 2.9384093160557372e+00 -4.6350512645665960e+00 -9.3002298063140747e-03 -2.9076141139696627e+00 -1.8103883663599332e-01 -2.2270710001748424e+00 -2.5650660097852990e-01 3.4742534073277362e-02 2.2201508697391712e+00 4.0649765516866061e-02 1.6187702638272317e-01 1.0948187184296434e+00 2.2750340821480683e-01 -1.4842953175490102e-02 -1.1100417531037969e+00 -2.2958181725716325e-02 -3.3350993231326459e-01 -4.3622983725935356e+00 -4.5575645908077173e-01 4.8530057041893636e-02 4.3922603383440553e+00 6.4309690182275614e-02 2.9422918626937511e-01 2.1636932638142135e+00 4.1433852476071265e-01 -9.9870816425212689e-03 -2.1715120644549075e+00 -1.1580146889643306e-02 -2.8696431885693334e+00 -5.6466949697389235e-01 -6.2573918789122391e+00 3.0006735242340219e+00 2.3123538018747669e-02 5.8950511377716204e+00 2.9380858693308074e+00 5.3509175203379755e-01 4.4525203960229911e+00 -2.6798374320909968e+00 -3.4074155789912573e-03 -4.9375789845828564e+00 -3.4217554357839028e+00 -4.7208734706893790e-01 -8.5085233417873436e+00 3.3365568226447229e+00 6.4309690182275600e-02 9.0460230487571458e+00 2.9242299738179947e+00 4.2950633353984835e-01 6.2545343362903330e+00 -3.2283101335833129e+00 -1.1867054152846439e-02 -5.9446347135596493e+00 -2.9906188536118559e+00 -5.2138419238649014e-01 -2.6378366194141889e+00 3.3242794422260467e+00 1.7340847542475479e-01 2.6083447226259624e+00 4.5238271158428134e+00 5.8379182090012172e-01 2.9009188997998203e+00 -4.1617898150300618e+00 -1.6113241170328613e-01 -2.8200449459725525e+00 -4.6069825338437962e+00 -6.0794447503293469e-01 -2.8279983108433582e+00 4.2610121034261663e+00 2.9422918626937505e-01 2.9242299738179955e+00 6.6285070847032994e+00 6.1419327091536935e-01 3.2037562110250901e+00 -6.9782345437126123e+00 -3.7516167438690928e-01 -3.3513699310387657e+00 -5.2670830600999607e-01 -1.2532917245116528e+00 -7.3670185438397784e-01 4.5107354587791504e-01 1.0923040786293390e+00 4.8287439662320275e-01 5.8199598439039013e-01 2.3297736749329720e+00 7.1177671824852295e-01 -3.9428035580431470e-01 -2.1925330913967143e+00 -5.6211569615311119e-01 -6.5309275285822777e-01 -2.3336674342852706e+00 -7.5437522580535665e-01 3.0808005990994958e-01 2.1636932638142130e+00 4.2950633353984835e-01 6.1419327091536946e-01 4.4846073324595004e+00 8.5460046750751517e-01 -3.8126144642108545e-01 -4.2908860996423872e+00 -4.2556513957664305e-01 -2.6352755414722835e+00 -7.2857562417097288e-01 -4.8018931270576095e+00 2.9282456589429842e+00 1.8508995994929406e-01 4.4689270677349784e+00 2.8756917941406139e+00 7.0851160204224206e-01 5.6777890063004604e+00 -2.7968401518182042e+00 -2.3259234905661502e-01 -6.1727997065788323e+00 -3.1647262722136507e+00 -7.8352024520379915e-01 -5.8073996965213812e+00 2.9384093160557376e+00 4.1433852476071270e-01 6.2545343362903338e+00 3.2037562110250897e+00 8.5460046750751528e-01 8.7644519146653632e+00 -3.3492610146602875e+00 -4.1785233582837611e-01 -8.3836097948333101e+00 3.2875133255705045e+00 4.4338297937593835e-01 2.9113546854521308e+00 -3.7457452598337149e+00 1.3676569649449925e-03 -2.8396645482401537e+00 -4.9599715015370158e+00 -4.5910604569207158e-01 -2.9597033218032678e+00 4.5163653309247866e+00 1.7215961744934751e-02 2.9308349379648675e+00 4.9941371089982498e+00 3.4371422393121270e-01 3.0821273759170040e+00 -4.6350512645665960e+00 -9.9870816425212568e-03 -3.2283101335833133e+00 -6.9782345437126123e+00 -3.8126144642108550e-01 -3.3492610146602870e+00 7.5209868041563972e+00 4.4673751738646725e-02 3.4526220189530168e+00 1.8532834645770790e-01 1.0671718545903697e+00 1.9988545725755349e-01 -1.3388692071738182e-02 -1.1077228030107498e+00 -1.3184582327074128e-02 -2.0245096638850893e-01 -2.1912924883275071e+00 -2.1709740774634045e-01 3.1734937734404764e-02 2.1728378234593460e+00 4.0159037418029266e-02 3.3856452672271098e-01 2.1475730025753785e+00 3.6854405939125612e-01 -9.3002298063140868e-03 -2.1715120644549075e+00 -1.1867054152846480e-02 -3.7516167438690928e-01 -4.2908860996423872e+00 -4.1785233582837605e-01 4.4673751738646787e-02 4.3738307748104583e+00 5.1412825987798207e-02 2.6116071966101280e+00 4.8026563173867548e-01 4.4399219434101349e+00 -2.8669634626181111e+00 2.6875354106448614e-03 -4.1954826963258647e+00 -2.9899877884711961e+00 -4.9696819878172394e-01 -5.3649436122177496e+00 2.9638771344788113e+00 2.2382812575735080e-02 5.8011646166649111e+00 3.0878289460557786e+00 3.7736467953515579e-01 5.4903572695425122e+00 -2.9076141139696627e+00 -1.1580146889643293e-02 -5.9446347135596502e+00 -3.3513699310387657e+00 -4.2556513957664310e-01 -8.3836097948333119e+00 3.4526220189530168e+00 5.1412825987798269e-02 8.1572269873190120e+00 291 292 293 1110 1111 1112 1113 1114 1115 306 307 308 960 961 962 1008 1009 1010 1020 1021 1022 972 973 974 6.4457728646601069e+00 1.1353478028491970e+00 2.8718952922618972e+00 -6.7362509082616295e+00 -9.9463206262026271e-01 -3.0632059050538314e+00 -4.2883359365433709e+00 -1.0678538124784323e+00 -2.4408773633089722e+00 3.9629717005038456e+00 7.9122067671033769e-01 2.5956711243519979e+00 4.4254633146342988e+00 1.1582371664126963e+00 2.7435493723411364e+00 -4.1101040025595461e+00 -7.4667154160323135e-01 -2.7444076655629202e+00 -2.8573768948726652e+00 -1.0034225599937041e+00 -2.4419241474332405e+00 3.1578598624389604e+00 7.2777433072339837e-01 2.4792992924039305e+00 1.1353478028491970e+00 4.9461611349966370e+00 1.5457609920146824e+00 -9.6416058814664352e-01 -4.5837623735770601e+00 -1.1414603225213813e+00 -1.1368308082308720e+00 -2.7125451358541413e+00 -1.2884780330407954e+00 7.4637861608266010e-01 2.4127854731782667e+00 1.0672617295479834e+00 1.1415257071260154e+00 2.7359497385997784e+00 1.3640255747658010e+00 -9.2686029432486083e-01 -2.5055749958790501e+00 -1.3158753434600972e+00 -9.7501111683824437e-01 -1.6533941550996585e+00 -1.3525011757948155e+00 9.7961068148274755e-01 1.3603803136352246e+00 1.1212665784886222e+00 2.8718952922618972e+00 1.5457609920146820e+00 8.2371681027376145e+00 -3.0414329007214720e+00 -1.1704746345856376e+00 -7.9505399579339118e+00 -2.7196038337338382e+00 -1.3493787052432789e+00 -5.2156683705114082e+00 2.5626446984314626e+00 1.1145210615254004e+00 5.7452208518270735e+00 2.7392549215984685e+00 1.3801092328578799e+00 5.3982219159844513e+00 -2.7048854141761187e+00 -1.0424799759698522e+00 -5.9900341874741141e+00 -2.4214004853300337e+00 -1.3802095973344797e+00 -4.4600335273500695e+00 2.7135277216696316e+00 9.0215162673528471e-01 4.2356651727203616e+00 -6.7362509082616295e+00 -9.6416058814664374e-01 -3.0414329007214720e+00 7.2138196417430223e+00 7.3079661202147905e-01 3.2040859001983435e+00 4.6684268649469498e+00 8.8885524429265594e-01 2.7389165430606330e+00 -4.3361479374249132e+00 -5.9067430994147163e-01 -2.9472984307776704e+00 -4.8940001626702623e+00 -1.1049920571347192e+00 -2.8544807471723406e+00 4.5002349748723578e+00 6.7324087158751722e-01 2.9156556030269769e+00 3.1921069777566533e+00 1.0145271428241969e+00 2.7533940177091729e+00 -3.6081894509621772e+00 -6.4759291550301301e-01 -2.7688399853236429e+00 -9.9463206262026271e-01 -4.5837623735770601e+00 -1.1704746345856378e+00 7.3079661202147883e-01 4.4705480289137665e+00 8.0076777370329910e-01 9.1774542182805952e-01 2.4232377356941948e+00 1.0009594945466616e+00 -5.3991771042188541e-01 -2.3027605638572348e+00 -7.3110113433367541e-01 -8.3531212454237613e-01 -2.4821871880733148e+00 -8.7643999627888292e-01 6.3410939590956750e-01 2.3515820872968334e+00 7.7947658122334162e-01 6.9285000273875397e-01 1.3756332752255904e+00 8.6372534510590826e-01 -6.0563953491333500e-01 -1.2522910016227746e+00 -6.6691342938101439e-01 -3.0632059050538314e+00 -1.1414603225213813e+00 -7.9505399579339127e+00 3.2040859001983435e+00 8.0076777370329921e-01 7.7936413232391555e+00 2.7000752165704003e+00 9.5359190851555131e-01 5.0603908421057646e+00 -2.5863012015449285e+00 -6.9158389807211829e-01 -5.6129914052740295e+00 -2.9120989309246008e+00 -1.1879245613930649e+00 -5.2129232922061082e+00 2.9230814938051921e+00 8.2878775766055235e-01 5.7565816228100974e+00 2.4575671017932406e+00 1.1392043296508259e+00 4.2655728733506217e+00 -2.7232036748438153e+00 -7.0138298754366279e-01 -4.0997320060915889e+00 -4.2883359365433709e+00 -1.1368308082308722e+00 -2.7196038337338382e+00 4.6684268649469498e+00 9.1774542182805952e-01 2.7000752165704007e+00 7.0769767741186946e+00 1.2723689764865673e+00 2.9053262713106696e+00 -6.6624197016954696e+00 -9.1672392319234897e-01 -2.9173503194517716e+00 -3.5610050513425309e+00 -1.1612739193117527e+00 -2.5576409336724764e+00 3.1930440467101011e+00 7.4954362044364664e-01 2.7722368890468703e+00 4.3558599892424290e+00 1.1102334550726722e+00 2.6170713212023973e+00 -4.7825469854368015e+00 -8.3506282309597080e-01 -2.8001146112722530e+00 -1.0678538124784325e+00 -2.7125451358541413e+00 -1.3493787052432789e+00 8.8885524429265583e-01 2.4232377356941943e+00 9.5359190851555131e-01 1.2723689764865673e+00 4.9271586005414498e+00 1.3459025484345593e+00 -8.8342721330621099e-01 -4.6239536096244134e+00 -1.1256916460400010e+00 -1.1595034044784460e+00 -1.6463222247959208e+00 -1.2061141159309667e+00 8.9095109170190345e-01 1.3841215151966031e+00 1.1977807886325835e+00 1.1068695214955413e+00 2.7578814932730973e+00 1.3206157192527519e+00 -1.0482604037135776e+00 -2.5095783744308697e+00 -1.1367064976211987e+00 -2.4408773633089726e+00 -1.2884780330407957e+00 -5.2156683705114082e+00 2.7389165430606330e+00 1.0009594945466616e+00 5.0603908421057646e+00 2.9053262713106704e+00 1.3459025484345590e+00 7.4188847399316655e+00 -2.9998856522806339e+00 -1.1987636937678272e+00 -7.9157051196075479e+00 -2.5674576278742647e+00 -1.2125748276024417e+00 -3.7655012289694607e+00 2.4466588976795745e+00 8.9754338213085427e-01 4.2233053761591330e+00 2.6622841798691956e+00 1.3459522534765789e+00 5.3469889332901648e+00 -2.7449652484561993e+00 -8.9054112417758846e-01 -5.1526951723983077e+00 3.9629717005038456e+00 7.4637861608265998e-01 2.5626446984314626e+00 -4.3361479374249132e+00 -5.3991771042188519e-01 -2.5863012015449285e+00 -6.6624197016954696e+00 -8.8342721330621121e-01 -2.9998856522806348e+00 6.4510013614272506e+00 6.0652722990385510e-01 2.9399376827961445e+00 3.1435305139658927e+00 8.8405437751458438e-01 2.4059693721324855e+00 -2.9006365224268902e+00 -5.5057419621896431e-01 -2.5557460090727342e+00 -4.0285565445886391e+00 -9.0188373661004162e-01 -2.5910145933764368e+00 4.3702571302389197e+00 6.3884263305600197e-01 2.8243957029146389e+00 7.9122067671033791e-01 2.4127854731782667e+00 1.1145210615254004e+00 -5.9067430994147163e-01 -2.3027605638572348e+00 -6.9158389807211829e-01 -9.1672392319234908e-01 -4.6239536096244134e+00 -1.1987636937678272e+00 6.0652722990385510e-01 4.5936403797234675e+00 8.7222387041748561e-01 7.0704423375953385e-01 1.3385271515832717e+00 8.4750610497597079e-01 -5.1860316933348261e-01 -1.2631725248338834e+00 -7.3961892011992536e-01 -6.7260866234163708e-01 -2.5118014459380440e+00 -9.6459748661669664e-01 5.9381792443521331e-01 2.3567351397685674e+00 7.6031296165771045e-01 2.5956711243519983e+00 1.0672617295479834e+00 5.7452208518270735e+00 -2.9472984307776704e+00 -7.3110113433367541e-01 -5.6129914052740295e+00 -2.9173503194517707e+00 -1.1256916460400010e+00 -7.9157051196075496e+00 2.9399376827961445e+00 8.7222387041748561e-01 8.6545139012983210e+00 2.8149727230783657e+00 1.2252035232576979e+00 4.2160890078668540e+00 -2.6245983573598082e+00 -8.0621701055944472e-01 -4.8371700617997124e+00 -2.6441137089223785e+00 -1.3065230592076000e+00 -5.9482542417699280e+00 2.7827792862851184e+00 8.0484372691755268e-01 5.6982970674589701e+00 4.4254633146342979e+00 1.1415257071260154e+00 2.7392549215984694e+00 -4.8940001626702614e+00 -8.3531212454237636e-01 -2.9120989309246013e+00 -3.5610050513425309e+00 -1.1595034044784460e+00 -2.5674576278742647e+00 3.1435305139658927e+00 7.0704423375953385e-01 2.8149727230783657e+00 7.5484367463979511e+00 1.4370719386793329e+00 3.2278188445558045e+00 -7.0529202978938654e+00 -1.0423465880352281e+00 -3.2880965112069540e+00 -4.5208215644112624e+00 -1.2517820305517706e+00 -2.9551846739374645e+00 4.9113165013197779e+00 1.0033022680429380e+00 2.9407912547106432e+00 1.1582371664126963e+00 2.7359497385997784e+00 1.3801092328578799e+00 -1.1049920571347194e+00 -2.4821871880733148e+00 -1.1879245613930649e+00 -1.1612739193117525e+00 -1.6463222247959208e+00 -1.2125748276024417e+00 8.8405437751458449e-01 1.3385271515832717e+00 1.2252035232576979e+00 1.4370719386793325e+00 5.1455657699246231e+00 1.5064133051178001e+00 -1.0502283755510380e+00 -4.7749651353645275e+00 -1.3269865553579099e+00 -1.1567059890007612e+00 -2.8446345611345909e+00 -1.4716049518877110e+00 9.9383685839165692e-01 2.5280664492606806e+00 1.0873648350077483e+00 2.7435493723411364e+00 1.3640255747658010e+00 5.3982219159844513e+00 -2.8544807471723406e+00 -8.7643999627888280e-01 -5.2129232922061082e+00 -2.5576409336724764e+00 -1.2061141159309667e+00 -3.7655012289694607e+00 2.4059693721324855e+00 8.4750610497597079e-01 4.2160890078668549e+00 3.2278188445558049e+00 1.5064133051177999e+00 7.8650834837776609e+00 -3.2647485711891311e+00 -1.3081160499564723e+00 -8.3163184362690465e+00 -2.6108779050351636e+00 -1.4112384458829332e+00 -5.5283672780290738e+00 2.9104105680396826e+00 1.0839636231896825e+00 5.3437158278447221e+00 -4.1101040025595461e+00 -9.2686029432486083e-01 -2.7048854141761192e+00 4.5002349748723578e+00 6.3410939590956750e-01 2.9230814938051921e+00 3.1930440467101011e+00 8.9095109170190345e-01 2.4466588976795745e+00 -2.9006365224268897e+00 -5.1860316933348261e-01 -2.6245983573598082e+00 -7.0529202978938654e+00 -1.0502283755510380e+00 -3.2647485711891315e+00 6.7414088661552434e+00 7.3397920941740014e-01 3.2540396377801661e+00 4.2040816451501533e+00 8.7682719266985731e-01 2.8000617197218025e+00 -4.5751087100075516e+00 -6.4017505048934609e-01 -2.8296094062616746e+00 -7.4667154160323135e-01 -2.5055749958790501e+00 -1.0424799759698524e+00 6.7324087158751722e-01 2.3515820872968334e+00 8.2878775766055224e-01 7.4954362044364664e-01 1.3841215151966031e+00 8.9754338213085427e-01 -5.5057419621896453e-01 -1.2631725248338830e+00 -8.0621701055944472e-01 -1.0423465880352278e+00 -4.7749651353645275e+00 -1.3081160499564728e+00 7.3397920941740002e-01 4.6531226959237912e+00 1.0253736586455737e+00 8.6298186544744038e-01 2.5550169218164682e+00 1.2186177738514765e+00 -6.8015324103858010e-01 -2.4001305641562349e+00 -8.1350953580268681e-01 -2.7444076655629197e+00 -1.3158753434600969e+00 -5.9900341874741132e+00 2.9156556030269769e+00 7.7947658122334162e-01 5.7565816228100983e+00 2.7722368890468703e+00 1.1977807886325835e+00 4.2233053761591330e+00 -2.5557460090727342e+00 -7.3961892011992536e-01 -4.8371700617997124e+00 -3.2880965112069536e+00 -1.3269865553579097e+00 -8.3163184362690483e+00 3.2540396377801661e+00 1.0253736586455737e+00 8.9877011622144494e+00 2.7579748499026273e+00 1.2173223149600072e+00 6.0888653295845740e+00 -3.1116567939140309e+00 -8.3747252452357268e-01 -5.9129308052253782e+00 -2.8573768948726652e+00 -9.7501111683824437e-01 -2.4214004853300337e+00 3.1921069777566524e+00 6.9285000273875397e-01 2.4575671017932406e+00 4.3558599892424290e+00 1.1068695214955413e+00 2.6622841798691952e+00 -4.0285565445886391e+00 -6.7260866234163696e-01 -2.6441137089223785e+00 -4.5208215644112624e+00 -1.1567059890007612e+00 -2.6108779050351631e+00 4.2040816451501533e+00 8.6298186544744049e-01 2.7579748499026269e+00 6.6305939523423927e+00 1.1951114246958505e+00 2.9658709523186202e+00 -6.9758875606190571e+00 -1.0534870461969423e+00 -3.1673049845961057e+00 -1.0034225599937041e+00 -1.6533941550996585e+00 -1.3802095973344797e+00 1.0145271428241969e+00 1.3756332752255904e+00 1.1392043296508259e+00 1.1102334550726722e+00 2.7578814932730973e+00 1.3459522534765789e+00 -9.0188373661004173e-01 -2.5118014459380440e+00 -1.3065230592076000e+00 -1.2517820305517706e+00 -2.8446345611345909e+00 -1.4112384458829332e+00 8.7682719266985731e-01 2.5550169218164687e+00 1.2173223149600074e+00 1.1951114246958503e+00 5.1408564972543269e+00 1.6467756547376731e+00 -1.0396108881070598e+00 -4.8195580253971890e+00 -1.2512834504000723e+00 -2.4419241474332405e+00 -1.3525011757948155e+00 -4.4600335273500695e+00 2.7533940177091729e+00 8.6372534510590837e-01 4.2655728733506217e+00 2.6170713212023973e+00 1.3206157192527517e+00 5.3469889332901648e+00 -2.5910145933764368e+00 -9.6459748661669664e-01 -5.9482542417699271e+00 -2.9551846739374645e+00 -1.4716049518877110e+00 -5.5283672780290729e+00 2.8000617197218025e+00 1.2186177738514767e+00 6.0888653295845740e+00 2.9658709523186202e+00 1.6467756547376733e+00 8.5590090648472810e+00 -3.1482745962048493e+00 -1.2610308786485853e+00 -8.3237811539235658e+00 3.1578598624389600e+00 9.7961068148274744e-01 2.7135277216696316e+00 -3.6081894509621772e+00 -6.0563953491333500e-01 -2.7232036748438158e+00 -4.7825469854368006e+00 -1.0482604037135779e+00 -2.7449652484561997e+00 4.3702571302389188e+00 5.9381792443521331e-01 2.7827792862851184e+00 4.9113165013197788e+00 9.9383685839165703e-01 2.9104105680396826e+00 -4.5751087100075516e+00 -6.8015324103858010e-01 -3.1116567939140309e+00 -6.9758875606190562e+00 -1.0396108881070596e+00 -3.1482745962048484e+00 7.5022992130279249e+00 8.0639860346293379e-01 3.3213827374244609e+00 7.2777433072339837e-01 1.3603803136352246e+00 9.0215162673528471e-01 -6.4759291550301301e-01 -1.2522910016227748e+00 -7.0138298754366279e-01 -8.3506282309597080e-01 -2.5095783744308697e+00 -8.9054112417758835e-01 6.3884263305600208e-01 2.3567351397685679e+00 8.0484372691755268e-01 1.0033022680429380e+00 2.5280664492606806e+00 1.0839636231896823e+00 -6.4017505048934609e-01 -2.4001305641562349e+00 -8.3747252452357268e-01 -1.0534870461969423e+00 -4.8195580253971890e+00 -1.2610308786485855e+00 8.0639860346293357e-01 4.7363760629425942e+00 8.9946853805088944e-01 2.4792992924039305e+00 1.1212665784886224e+00 4.2356651727203616e+00 -2.7688399853236434e+00 -6.6691342938101439e-01 -4.0997320060915889e+00 -2.8001146112722521e+00 -1.1367064976211987e+00 -5.1526951723983077e+00 2.8243957029146394e+00 7.6031296165771045e-01 5.6982970674589701e+00 2.9407912547106432e+00 1.0873648350077483e+00 5.3437158278447221e+00 -2.8296094062616746e+00 -8.1350953580268670e-01 -5.9129308052253791e+00 -3.1673049845961061e+00 -1.2512834504000723e+00 -8.3237811539235658e+00 3.3213827374244609e+00 8.9946853805088933e-01 8.2114610696147867e+00 1110 1111 1112 1137 1138 1139 1140 1141 1142 1113 1114 1115 1008 1009 1010 1056 1057 1058 1068 1069 1070 1020 1021 1022 6.3313026162498858e+00 1.0985456664861910e+00 2.7550355767218595e+00 -6.6233917404216047e+00 -9.6926561888732066e-01 -2.9569156001822416e+00 -4.1625284918398640e+00 -1.0323433054357876e+00 -2.3280658227590463e+00 3.8310807275361998e+00 7.6071545991813316e-01 2.4793188493587257e+00 4.2473604960748661e+00 1.1232396420093387e+00 2.6211716332372323e+00 -3.9286836472282913e+00 -7.0213987349204199e-01 -2.6131196531047260e+00 -2.7059229015695427e+00 -9.6612937182937586e-01 -2.3170824269028287e+00 3.0107829411983480e+00 6.8737740123086222e-01 2.3596574436310265e+00 1.0985456664861912e+00 4.9185084069938547e+00 1.5048648714333115e+00 -9.2117591748530092e-01 -4.5487824991127956e+00 -1.0891218520905399e+00 -1.1052776860680542e+00 -2.6676341409540263e+00 -1.2467899127180599e+00 7.0313722832195713e-01 2.3612380171698919e+00 1.0153451990617153e+00 1.1014502948148237e+00 2.6505538536446260e+00 1.3162350354995795e+00 -8.8430080933354349e-01 -2.4116960976340565e+00 -1.2661580084550710e+00 -9.3576845793421126e-01 -1.5932789754331549e+00 -1.3074190375429748e+00 9.4338968119813682e-01 1.2910914353256611e+00 1.0730437048120407e+00 2.7550355767218595e+00 1.5048648714333115e+00 8.0834169467294430e+00 -2.9240368672613184e+00 -1.1353852260270545e+00 -7.7938265352285461e+00 -2.6079244829064527e+00 -1.3062546949444664e+00 -5.0402162409173226e+00 2.4475159417627115e+00 1.0808945467294568e+00 5.5747725046444341e+00 2.6105919271856135e+00 1.3351996626352298e+00 5.1678108579515376e+00 -2.5799260904363810e+00 -9.8994949892848294e-01 -5.7668091325043500e+00 -2.2993688624603656e+00 -1.3394892856331135e+00 -4.2645018219287492e+00 2.5981128573943311e+00 8.5011962473511804e-01 4.0393534212535540e+00 -6.6233917404216047e+00 -9.2117591748530092e-01 -2.9240368672613180e+00 7.1167287603419913e+00 6.9323986545443672e-01 3.0955151705975026e+00 4.5495246283641997e+00 8.4779627602493457e-01 2.6280630192273402e+00 -4.2100495391552011e+00 -5.5392511507650466e-01 -2.8365467520445593e+00 -4.7273047650266840e+00 -1.0701483247108292e+00 -2.7339314296777975e+00 4.3242349241597537e+00 6.2658859009186041e-01 2.7903107329654393e+00 3.0419555765030775e+00 9.8155240733153770e-01 2.6349738325892957e+00 -3.4716978447655293e+00 -6.0392778163013383e-01 -2.6543477063959018e+00 -9.6926561888732055e-01 -4.5487824991127965e+00 -1.1353852260270545e+00 6.9323986545443672e-01 4.4439796153626316e+00 7.5582910989126961e-01 8.9134982857201406e-01 2.3728971183590137e+00 9.6606847620932179e-01 -5.0233560103055486e-01 -2.2565999576847222e+00 -6.8363775641169611e-01 -7.9756566304255516e-01 -2.3954154137200501e+00 -8.3141934680336960e-01 5.9373398860039772e-01 2.2635553068179384e+00 7.3006407988144284e-01 6.5773446053507045e-01 1.3101976951408567e+00 8.1878802660975081e-01 -5.6689126020148772e-01 -1.1898318651628716e+00 -6.2030736334966496e-01 -2.9569156001822416e+00 -1.0891218520905399e+00 -7.7938265352285434e+00 3.0955151705975021e+00 7.5582910989126950e-01 7.6432192472208280e+00 2.5902639336347137e+00 9.0316897759771975e-01 4.8854571655644268e+00 -2.4762320147588390e+00 -6.4806663840454748e-01 -5.4453206856738507e+00 -2.7854457535680215e+00 -1.1412245742932885e+00 -4.9872855282428095e+00 2.8033446234692190e+00 7.7303557731140427e-01 5.5351563702639792e+00 2.3372437299872413e+00 1.0956157526415389e+00 4.0698176439334937e+00 -2.6077740891795722e+00 -6.4923635265355539e-01 -3.9072176778375223e+00 -4.1625284918398640e+00 -1.1052776860680542e+00 -2.6079244829064527e+00 4.5495246283642006e+00 8.9134982857201406e-01 2.5902639336347137e+00 6.8723905033475097e+00 1.2385100889014167e+00 2.7833419149941729e+00 -6.4419959675740239e+00 -8.8252729689532439e-01 -2.7939788241428105e+00 -3.4233658256670116e+00 -1.1322764997995725e+00 -2.4424950838057509e+00 3.0456224698634933e+00 7.0711449106902668e-01 2.6588214107064481e+00 4.1267423946125676e+00 1.0748943422784136e+00 2.4917637278983995e+00 -4.5663897111068685e+00 -7.9178726805791877e-01 -2.6797925963787224e+00 -1.0323433054357876e+00 -2.6676341409540263e+00 -1.3062546949444664e+00 8.4779627602493457e-01 2.3728971183590137e+00 9.0316897759771975e-01 1.2385100889014167e+00 4.8012960080735274e+00 1.2977792056626822e+00 -8.3795739749659048e-01 -4.4872945713349619e+00 -1.0719745023227416e+00 -1.1238555801440475e+00 -1.5883902596937347e+00 -1.1589532549616548e+00 8.5042892517673907e-01 1.3146966205853219e+00 1.1526414461735099e+00 1.0662142839498860e+00 2.6228868665047012e+00 1.2707056417654641e+00 -1.0087932909765494e+00 -2.3684576415398393e+00 -1.0871128189705139e+00 -2.3280658227590467e+00 -1.2467899127180599e+00 -5.0402162409173226e+00 2.6280630192273398e+00 9.6606847620932190e-01 4.8854571655644268e+00 2.7833419149941729e+00 1.2977792056626822e+00 7.1490965515278750e+00 -2.8805674980106915e+00 -1.1604203946551173e+00 -7.6426843059105360e+00 -2.4456476686297752e+00 -1.1691687674455522e+00 -3.5691323485244300e+00 2.3268512236957535e+00 8.4804306338427549e-01 4.0257787180041031e+00 2.5317638664462021e+00 1.2999650860580538e+00 5.0638857623635189e+00 -2.6157390349639527e+00 -8.3547675649560249e-01 -4.8721853021076367e+00 3.8310807275361998e+00 7.0313722832195724e-01 2.4475159417627115e+00 -4.2100495391552011e+00 -5.0233560103055486e-01 -2.4762320147588390e+00 -6.4419959675740266e+00 -8.3795739749659059e-01 -2.8805674980106915e+00 6.2307689531625208e+00 5.6649437693778038e-01 2.8135915344297047e+00 2.9934376849597046e+00 8.4627623402233554e-01 2.2863098926997996e+00 -2.7505100907902551e+00 -5.0656320835804980e-01 -2.4325457843063947e+00 -3.7945547304515999e+00 -8.6121282985967518e-01 -2.4550122458947747e+00 4.1418229623126521e+00 5.9216119746279661e-01 2.6969401740784855e+00 7.6071545991813305e-01 2.3612380171698919e+00 1.0808945467294568e+00 -5.5392511507650466e-01 -2.2565999576847218e+00 -6.4806663840454726e-01 -8.8252729689532483e-01 -4.4872945713349619e+00 -1.1604203946551173e+00 5.6649437693778026e-01 4.4642395909957067e+00 8.2174321165632469e-01 6.6931104245226691e-01 1.2720783982573971e+00 8.0447873766835276e-01 -4.8129314371065091e-01 -1.1991691737882249e+00 -6.9258510197093115e-01 -6.3272290343535320e-01 -2.3706748619101434e+00 -9.1548770535578661e-01 5.5394757980965248e-01 2.2161825582950563e+00 7.0944334433224887e-01 2.4793188493587257e+00 1.0153451990617153e+00 5.5747725046444341e+00 -2.8365467520445602e+00 -6.8363775641169611e-01 -5.4453206856738507e+00 -2.7939788241428105e+00 -1.0719745023227416e+00 -7.6426843059105352e+00 2.8135915344297042e+00 8.2174321165632447e-01 8.3954564558764666e+00 2.6981548967366615e+00 1.1839966147860757e+00 4.0175724293238240e+00 -2.5049765126377790e+00 -7.5057903954483352e-01 -4.6489589011821000e+00 -2.5152603085880645e+00 -1.2621064914560551e+00 -5.6684496008541148e+00 2.6596971168881209e+00 7.4721276423120953e-01 5.4176121037758822e+00 4.2473604960748661e+00 1.1014502948148237e+00 2.6105919271856135e+00 -4.7273047650266840e+00 -7.9756566304255516e-01 -2.7854457535680219e+00 -3.4233658256670116e+00 -1.1238555801440475e+00 -2.4456476686297752e+00 2.9934376849597051e+00 6.6931104245226691e-01 2.6981548967366615e+00 7.1545136173150379e+00 1.3928306348252144e+00 3.0670013534491103e+00 -6.6456069911315385e+00 -9.8378824231187889e-01 -3.1301622875182256e+00 -4.2414700848720432e+00 -1.2111175419386702e+00 -2.8162454338399501e+00 4.6424358683476674e+00 9.5273505534484593e-01 2.8017529661845892e+00 1.1232396420093387e+00 2.6505538536446260e+00 1.3351996626352298e+00 -1.0701483247108290e+00 -2.3954154137200496e+00 -1.1412245742932885e+00 -1.1322764997995722e+00 -1.5883902596937345e+00 -1.1691687674455522e+00 8.4627623402233554e-01 1.2720783982573971e+00 1.1839966147860757e+00 1.3928306348252142e+00 4.8643482235186033e+00 1.4464402990988945e+00 -1.0008872255294967e+00 -4.4771346488325241e+00 -1.2714504598568661e+00 -1.1147768950610168e+00 -2.6717219177654146e+00 -1.4224760725222734e+00 9.5574243424402572e-01 2.3456817645910961e+00 1.0386832975977800e+00 2.6211716332372323e+00 1.3162350354995791e+00 5.1678108579515376e+00 -2.7339314296777975e+00 -8.3141934680336960e-01 -4.9872855282428095e+00 -2.4424950838057509e+00 -1.1589532549616548e+00 -3.5691323485244295e+00 2.2863098926997996e+00 8.0447873766835287e-01 4.0175724293238231e+00 3.0670013534491098e+00 1.4464402990988949e+00 7.3991277004460150e+00 -3.1044846235931609e+00 -1.2403653691803145e+00 -7.8454130438033634e+00 -2.4659905185475806e+00 -1.3582239662863724e+00 -5.1917762376062511e+00 2.7724187762381467e+00 1.0218078649648827e+00 5.0090961704554768e+00 -3.9286836472282913e+00 -8.8430080933354349e-01 -2.5799260904363810e+00 4.3242349241597537e+00 5.9373398860039772e-01 2.8033446234692194e+00 3.0456224698634928e+00 8.5042892517673896e-01 2.3268512236957539e+00 -2.7505100907902555e+00 -4.8129314371065091e-01 -2.5049765126377790e+00 -6.6456069911315385e+00 -1.0008872255294967e+00 -3.1044846235931618e+00 6.3344374015700815e+00 6.7696431135620561e-01 3.0916058578643790e+00 3.9199795233578305e+00 8.3560851890961818e-01 2.6547494736974548e+00 -4.2994735898010727e+00 -5.9025456546926847e-01 -2.6871639520594850e+00 -7.0213987349204188e-01 -2.4116960976340565e+00 -9.8994949892848294e-01 6.2658859009186041e-01 2.2635553068179384e+00 7.7303557731140427e-01 7.0711449106902668e-01 1.3146966205853219e+00 8.4804306338427549e-01 -5.0656320835804991e-01 -1.1991691737882249e+00 -7.5057903954483352e-01 -9.8378824231187911e-01 -4.4771346488325241e+00 -1.2403653691803145e+00 6.7696431135620549e-01 4.3594814064807812e+00 9.5375542371672750e-01 8.1092524246094022e-01 2.3693463695523711e+00 1.1559194607728156e+00 -6.2910131081606158e-01 -2.2190797831816065e+00 -7.4985961753159203e-01 -2.6131196531047260e+00 -1.2661580084550712e+00 -5.7668091325043500e+00 2.7903107329654393e+00 7.3006407988144295e-01 5.5351563702639792e+00 2.6588214107064481e+00 1.1526414461735099e+00 4.0257787180041031e+00 -2.4325457843063947e+00 -6.9258510197093115e-01 -4.6489589011821000e+00 -3.1301622875182256e+00 -1.2714504598568663e+00 -7.8454130438033634e+00 3.0916058578643795e+00 9.5375542371672728e-01 8.5275641318283082e+00 2.6140700748402139e+00 1.1701119500276773e+00 5.7539172259816445e+00 -2.9789803514471318e+00 -7.7637932951648803e-01 -5.5812353685882234e+00 -2.7059229015695427e+00 -9.3576845793421126e-01 -2.2993688624603656e+00 3.0419555765030784e+00 6.5773446053507034e-01 2.3372437299872413e+00 4.1267423946125676e+00 1.0662142839498860e+00 2.5317638664462021e+00 -3.7945547304515994e+00 -6.3272290343535331e-01 -2.5152603085880645e+00 -4.2414700848720432e+00 -1.1147768950610168e+00 -2.4659905185475806e+00 3.9199795233578301e+00 8.1092524246094022e-01 2.6140700748402144e+00 6.1129278203057513e+00 1.1406388260235447e+00 2.7898351423026213e+00 -6.4596575978860393e+00 -9.9224455653885890e-01 -2.9922931239802693e+00 -9.6612937182937586e-01 -1.5932789754331549e+00 -1.3394892856331135e+00 9.8155240733153781e-01 1.3101976951408567e+00 1.0956157526415389e+00 1.0748943422784134e+00 2.6228868665047012e+00 1.2999650860580538e+00 -8.6121282985967507e-01 -2.3706748619101434e+00 -1.2621064914560551e+00 -1.2111175419386699e+00 -2.6717219177654150e+00 -1.3582239662863722e+00 8.3560851890961796e-01 2.3693463695523711e+00 1.1701119500276773e+00 1.1406388260235447e+00 4.7515678042448073e+00 1.5843541905194762e+00 -9.9423435091539225e-01 -4.4183229803340227e+00 -1.1902272358712058e+00 -2.3170824269028287e+00 -1.3074190375429751e+00 -4.2645018219287492e+00 2.6349738325892953e+00 8.1878802660975081e-01 4.0698176439334937e+00 2.4917637278983999e+00 1.2707056417654641e+00 5.0638857623635189e+00 -2.4550122458947752e+00 -9.1548770535578661e-01 -5.6684496008541156e+00 -2.8162454338399496e+00 -1.4224760725222729e+00 -5.1917762376062511e+00 2.6547494736974548e+00 1.1559194607728156e+00 5.7539172259816436e+00 2.7898351423026222e+00 1.5843541905194762e+00 7.9739591838157882e+00 -2.9829820698502161e+00 -1.1843845042464700e+00 -7.7368521557053311e+00 3.0107829411983480e+00 9.4338968119813682e-01 2.5981128573943311e+00 -3.4716978447655298e+00 -5.6689126020148772e-01 -2.6077740891795722e+00 -4.5663897111068685e+00 -1.0087932909765496e+00 -2.6157390349639531e+00 4.1418229623126521e+00 5.5394757980965248e-01 2.6596971168881209e+00 4.6424358683476674e+00 9.5574243424402594e-01 2.7724187762381471e+00 -4.2994735898010727e+00 -6.2910131081606158e-01 -2.9789803514471318e+00 -6.4596575978860393e+00 -9.9423435091539225e-01 -2.9829820698502165e+00 7.0021769717008411e+00 7.4594051765767477e-01 3.1552467949202749e+00 6.8737740123086222e-01 1.2910914353256611e+00 8.5011962473511804e-01 -6.0392778163013383e-01 -1.1898318651628716e+00 -6.4923635265355539e-01 -7.9178726805791877e-01 -2.3684576415398393e+00 -8.3547675649560260e-01 5.9216119746279661e-01 2.2161825582950563e+00 7.4721276423120953e-01 9.5273505534484593e-01 2.3456817645910961e+00 1.0218078649648827e+00 -5.9025456546926847e-01 -2.2190797831816074e+00 -7.7637932951648814e-01 -9.9224455653885879e-01 -4.4183229803340218e+00 -1.1843845042464700e+00 7.4594051765767477e-01 4.3427365120065264e+00 8.2633668898090584e-01 2.3596574436310269e+00 1.0730437048120407e+00 4.0393534212535531e+00 -2.6543477063959018e+00 -6.2030736334966496e-01 -3.9072176778375223e+00 -2.6797925963787219e+00 -1.0871128189705139e+00 -4.8721853021076367e+00 2.6969401740784855e+00 7.0944334433224898e-01 5.4176121037758813e+00 2.8017529661845892e+00 1.0386832975977800e+00 5.0090961704554768e+00 -2.6871639520594850e+00 -7.4985961753159203e-01 -5.5812353685882234e+00 -2.9922931239802684e+00 -1.1902272358712058e+00 -7.7368521557053302e+00 3.1552467949202745e+00 8.2633668898090584e-01 7.6314288087538005e+00 306 307 308 1113 1114 1115 1116 1117 1118 321 322 323 972 973 974 1020 1021 1022 1032 1033 1034 984 985 986 5.7615822410506539e+00 1.4719958623887379e+00 2.3410635619731712e+00 -6.0440017584579833e+00 -1.4240333284545346e+00 -2.5580905000995591e+00 -3.7344743522408965e+00 -1.3585099421222744e+00 -1.9556178578948806e+00 3.4329452304136661e+00 1.1076562525559461e+00 2.1426632701732959e+00 3.9128296212433766e+00 1.5283759088188096e+00 2.2395418222623835e+00 -3.6191420500910061e+00 -1.1328190119374351e+00 -2.2948633430478642e+00 -2.4214401582368814e+00 -1.2849527404206120e+00 -1.9661469876697129e+00 2.7117012263190716e+00 1.0922869991713611e+00 2.0514500343031679e+00 1.4719958623887377e+00 5.2675365013455995e+00 1.9807741651580046e+00 -1.3956114487920319e+00 -4.8345510302573365e+00 -1.6579683101321385e+00 -1.4539097077843932e+00 -3.0871173358635158e+00 -1.5985777350824841e+00 1.0507003311386520e+00 2.7180768244659927e+00 1.5450854304647770e+00 1.4981972567498565e+00 3.1900413930732676e+00 1.7291119743532961e+00 -1.2648703594484196e+00 -2.8924233410800038e+00 -1.8198717620153342e+00 -1.2281629731215533e+00 -2.1218319252409268e+00 -1.7066020715674342e+00 1.3216610388691532e+00 1.7602689135569225e+00 1.5280483088213135e+00 2.3410635619731712e+00 1.9807741651580053e+00 7.1662976644877245e+00 -2.5420113200642867e+00 -1.6822362796665147e+00 -7.0150987207666056e+00 -2.1906380329417630e+00 -1.6785412252780529e+00 -4.3671062834452012e+00 2.0859104120357639e+00 1.5828649855469732e+00 4.9741662536770566e+00 2.2485798761490909e+00 1.7687264344532165e+00 4.5613604464248274e+00 -2.2383097292938317e+00 -1.5823334773705311e+00 -5.2112732627413436e+00 -1.9285622934048277e+00 -1.7513806999622930e+00 -3.6883496769444370e+00 2.2239675255466853e+00 1.3621260971191973e+00 3.5800035793079803e+00 -6.0440017584579824e+00 -1.3956114487920317e+00 -2.5420113200642867e+00 6.5094007192711576e+00 1.2596513680290862e+00 2.7449039541416020e+00 4.0992504558039151e+00 1.2922170713676564e+00 2.2746448096678229e+00 -3.7820744472918197e+00 -1.0219236588309282e+00 -2.5235554007217198e+00 -4.3707823494102653e+00 -1.5533733395657183e+00 -2.3639915976046084e+00 3.9901677462816441e+00 1.1393113361805882e+00 2.4878904662207999e+00 2.7354423978912470e+00 1.3883516138300331e+00 2.2742998748593886e+00 -3.1374027640878985e+00 -1.1086229422186848e+00 -2.3521807864989999e+00 -1.4240333284545346e+00 -4.8345510302573356e+00 -1.6822362796665151e+00 1.2596513680290862e+00 4.6180723965592865e+00 1.3712172965453160e+00 1.3089823109078305e+00 2.7272737669655442e+00 1.4087688542610888e+00 -9.1792674246436001e-01 -2.5103377728786120e+00 -1.2886632103641511e+00 -1.3071166598600368e+00 -2.8577465306108727e+00 -1.3170633002759544e+00 1.0866518784277688e+00 2.6351808963557186e+00 1.3432834827784264e+00 1.0374546886941860e+00 1.7719041595012508e+00 1.3166731185437457e+00 -1.0436635152799414e+00 -1.5497958856349794e+00 -1.1519799618219573e+00 -2.5580905000995591e+00 -1.6579683101321385e+00 -7.0150987207666047e+00 2.7449039541416025e+00 1.3712172965453164e+00 6.9760064555770125e+00 2.2120214809312388e+00 1.3499904918978956e+00 4.3252528953438008e+00 -2.1521214649690465e+00 -1.2076553724767514e+00 -4.9669956357734630e+00 -2.4675837927928432e+00 -1.6412528489224156e+00 -4.4882640802181628e+00 2.5040197253436229e+00 1.4158853152595723e+00 5.1000438831131563e+00 2.0148780378346727e+00 1.5652951750841559e+00 3.6144782822620298e+00 -2.2980274403896903e+00 -1.1955117472556338e+00 -3.5454230795377688e+00 -3.7344743522408961e+00 -1.4539097077843932e+00 -2.1906380329417634e+00 4.0992504558039151e+00 1.3089823109078305e+00 2.2120214809312388e+00 6.2125103782265514e+00 1.6298040250302823e+00 2.3097144450713492e+00 -5.8143472820386419e+00 -1.2787154649620773e+00 -2.3637821041340707e+00 -3.0900342947318244e+00 -1.5140479398973088e+00 -2.0450138916598952e+00 2.7368314291512554e+00 1.1474601887130935e+00 2.3063033129137791e+00 3.7300238425723706e+00 1.4154445035284744e+00 2.0695806716248257e+00 -4.1397601767427297e+00 -1.2550179155359003e+00 -2.2981858818054648e+00 -1.3585099421222742e+00 -3.0871173358635162e+00 -1.6785412252780527e+00 1.2922170713676564e+00 2.7272737669655442e+00 1.3499904918978956e+00 1.6298040250302823e+00 5.1262530483290210e+00 1.6627760567414207e+00 -1.2577939279008752e+00 -4.7509908681085831e+00 -1.5864039648969599e+00 -1.5073508726405289e+00 -2.1097602156266975e+00 -1.4841007418186514e+00 1.2145199483918392e+00 1.7792781665825725e+00 1.6182678960101724e+00 1.4061620511817561e+00 3.1158851575895214e+00 1.6377958299947082e+00 -1.4190483533078562e+00 -2.8008217198678631e+00 -1.5197843426505331e+00 -1.9556178578948806e+00 -1.5985777350824841e+00 -4.3671062834452012e+00 2.2746448096678225e+00 1.4087688542610890e+00 4.3252528953438008e+00 2.3097144450713487e+00 1.6627760567414205e+00 6.3178571778541288e+00 -2.4607564280714027e+00 -1.6774972685375080e+00 -6.8586273733102248e+00 -2.0773413815937780e+00 -1.5142411909907343e+00 -3.0524922873485698e+00 2.0013826445974718e+00 1.3304614277550006e+00 3.5421020171497632e+00 2.1256972565352612e+00 1.6910065334676903e+00 4.4418325944274351e+00 -2.2177234883118446e+00 -1.3026966776144726e+00 -4.3488187406711356e+00 3.4329452304136652e+00 1.0507003311386518e+00 2.0859104120357639e+00 -3.7820744472918197e+00 -9.1792674246436001e-01 -2.1521214649690461e+00 -5.8143472820386419e+00 -1.2577939279008754e+00 -2.4607564280714027e+00 5.6410715941573590e+00 9.8049144096830687e-01 2.4218287748287226e+00 2.6804164453515553e+00 1.1984729232249383e+00 1.9339363656017188e+00 -2.4683484836549332e+00 -9.0547469197223263e-01 -2.1104788607547511e+00 -3.4351354127346205e+00 -1.1924380881862526e+00 -2.0643407217705700e+00 3.7454723557974354e+00 1.0439687551918231e+00 2.3460219230995651e+00 1.1076562525559464e+00 2.7180768244659927e+00 1.5828649855469727e+00 -1.0219236588309282e+00 -2.5103377728786125e+00 -1.2076553724767511e+00 -1.2787154649620776e+00 -4.7509908681085831e+00 -1.6774972685375082e+00 9.8049144096830709e-01 4.6410779048184594e+00 1.4816871711340305e+00 1.0982381073625318e+00 1.7225167233556344e+00 1.2589188227596804e+00 -8.7975532742182316e-01 -1.5692357766592475e+00 -1.2827156802824184e+00 -9.8726847329902701e-01 -2.8075764938453918e+00 -1.4412171323848153e+00 9.8127712362707120e-01 2.5564694588517467e+00 1.2856144742408098e+00 2.1426632701732959e+00 1.5450854304647765e+00 4.9741662536770566e+00 -2.5235554007217198e+00 -1.2886632103641509e+00 -4.9669956357734621e+00 -2.3637821041340707e+00 -1.5864039648969599e+00 -6.8586273733102248e+00 2.4218287748287226e+00 1.4816871711340303e+00 7.7091431184420065e+00 2.3916721668353449e+00 1.6914886336939481e+00 3.5454518480982715e+00 -2.2262581688211389e+00 -1.3925488917405102e+00 -4.2582272238062933e+00 -2.1579292021442016e+00 -1.7987554874039338e+00 -5.1082775797486617e+00 2.3153606639837694e+00 1.3481103191127988e+00 4.9633665924213091e+00 3.9128296212433762e+00 1.4981972567498565e+00 2.2485798761490909e+00 -4.3707823494102653e+00 -1.3071166598600368e+00 -2.4675837927928432e+00 -3.0900342947318244e+00 -1.5073508726405291e+00 -2.0773413815937780e+00 2.6804164453515553e+00 1.0982381073625318e+00 2.3916721668353449e+00 6.8197309997221813e+00 1.9257134754446168e+00 2.6395846501975155e+00 -6.3355621282137626e+00 -1.5343861435110961e+00 -2.7629474243562080e+00 -3.9340371170771533e+00 -1.6307812480342139e+00 -2.4153061230733126e+00 4.3174388231158920e+00 1.4574860844888700e+00 2.4433420286341927e+00 1.5283759088188096e+00 3.1900413930732676e+00 1.7687264344532165e+00 -1.5533733395657185e+00 -2.8577465306108727e+00 -1.6412528489224156e+00 -1.5140479398973086e+00 -2.1097602156266975e+00 -1.5142411909907345e+00 1.1984729232249385e+00 1.7225167233556344e+00 1.6914886336939481e+00 1.9257134754446164e+00 5.5654768450853886e+00 1.9150198608327389e+00 -1.5414037655745727e+00 -5.1082776562259014e+00 -1.9021363409127827e+00 -1.4836845786895316e+00 -3.3000710094034358e+00 -1.8624553446332117e+00 1.4399473162387677e+00 2.8978204503526186e+00 1.5448507964792422e+00 2.2395418222623835e+00 1.7291119743532959e+00 4.5613604464248283e+00 -2.3639915976046089e+00 -1.3170633002759544e+00 -4.4882640802181619e+00 -2.0450138916598952e+00 -1.4841007418186511e+00 -3.0524922873485703e+00 1.9339363656017188e+00 1.2589188227596808e+00 3.5454518480982715e+00 2.6395846501975160e+00 1.9150198608327391e+00 6.7990695891657671e+00 -2.7291941672726647e+00 -1.8706582614543086e+00 -7.2934651614141659e+00 -2.0687400559257356e+00 -1.7606313419925710e+00 -4.6171363365937843e+00 2.3938768744012875e+00 1.5294029875957684e+00 4.5454759818858168e+00 -3.6191420500910061e+00 -1.2648703594484196e+00 -2.2383097292938317e+00 3.9901677462816441e+00 1.0866518784277690e+00 2.5040197253436229e+00 2.7368314291512554e+00 1.2145199483918390e+00 2.0013826445974718e+00 -2.4683484836549332e+00 -8.7975532742182316e-01 -2.2262581688211389e+00 -6.3355621282137617e+00 -1.5414037655745723e+00 -2.7291941672726647e+00 6.0491115143046645e+00 1.2230391938179948e+00 2.7622006038661535e+00 3.6438238583523379e+00 1.2492600059182788e+00 2.3120063192938551e+00 -3.9968818861302005e+00 -1.0874415741110659e+00 -2.3858472277134704e+00 -1.1328190119374351e+00 -2.8924233410800038e+00 -1.5823334773705311e+00 1.1393113361805882e+00 2.6351808963557186e+00 1.4158853152595723e+00 1.1474601887130933e+00 1.7792781665825725e+00 1.3304614277550009e+00 -9.0547469197223251e-01 -1.5692357766592475e+00 -1.3925488917405102e+00 -1.5343861435110959e+00 -5.1082776562259014e+00 -1.8706582614543086e+00 1.2230391938179945e+00 4.8865253003856512e+00 1.7425290296261708e+00 1.2158212885213493e+00 2.9364915855589397e+00 1.7510593491811062e+00 -1.1529521598122625e+00 -2.6675391749177289e+00 -1.3943944912565014e+00 -2.2948633430478642e+00 -1.8198717620153346e+00 -5.2112732627413436e+00 2.4878904662207999e+00 1.3432834827784261e+00 5.1000438831131554e+00 2.3063033129137787e+00 1.6182678960101722e+00 3.5421020171497632e+00 -2.1104788607547511e+00 -1.2827156802824184e+00 -4.2582272238062933e+00 -2.7629474243562071e+00 -1.9021363409127827e+00 -7.2934651614141650e+00 2.7622006038661535e+00 1.7425290296261708e+00 8.0661837279704471e+00 2.2416370976063389e+00 1.7418397165330231e+00 5.2420355273810708e+00 -2.6297418524482508e+00 -1.4411963417372564e+00 -5.1873995076526347e+00 -2.4214401582368810e+00 -1.2281629731215533e+00 -1.9285622934048279e+00 2.7354423978912470e+00 1.0374546886941860e+00 2.0148780378346727e+00 3.7300238425723706e+00 1.4061620511817561e+00 2.1256972565352612e+00 -3.4351354127346205e+00 -9.8726847329902689e-01 -2.1579292021442016e+00 -3.9340371170771533e+00 -1.4836845786895319e+00 -2.0687400559257356e+00 3.6438238583523379e+00 1.2158212885213493e+00 2.2416370976063393e+00 5.7498871602282389e+00 1.5123501868452944e+00 2.3423217934913136e+00 -6.0685645709955409e+00 -1.4726721901324731e+00 -2.5693026339928231e+00 -1.2849527404206120e+00 -2.1218319252409272e+00 -1.7513806999622930e+00 1.3883516138300331e+00 1.7719041595012508e+00 1.5652951750841559e+00 1.4154445035284746e+00 3.1158851575895214e+00 1.6910065334676905e+00 -1.1924380881862529e+00 -2.8075764938453918e+00 -1.7987554874039335e+00 -1.6307812480342139e+00 -3.3000710094034358e+00 -1.7606313419925708e+00 1.2492600059182790e+00 2.9364915855589397e+00 1.7418397165330233e+00 1.5123501868452947e+00 5.4022370595009690e+00 2.0884823009179097e+00 -1.4572342334810036e+00 -4.9970385336609251e+00 -1.7758561966439821e+00 -1.9661469876697129e+00 -1.7066020715674339e+00 -3.6883496769444370e+00 2.2742998748593886e+00 1.3166731185437457e+00 3.6144782822620298e+00 2.0695806716248262e+00 1.6377958299947082e+00 4.4418325944274359e+00 -2.0643407217705696e+00 -1.4412171323848153e+00 -5.1082775797486617e+00 -2.4153061230733126e+00 -1.8624553446332115e+00 -4.6171363365937843e+00 2.3120063192938551e+00 1.7510593491811062e+00 5.2420355273810708e+00 2.3423217934913136e+00 2.0884823009179092e+00 7.2873759021438813e+00 -2.5524148267557885e+00 -1.7837360500520081e+00 -7.1719587129275340e+00 2.7117012263190716e+00 1.3216610388691532e+00 2.2239675255466858e+00 -3.1374027640878985e+00 -1.0436635152799414e+00 -2.2980274403896903e+00 -4.1397601767427297e+00 -1.4190483533078564e+00 -2.2177234883118446e+00 3.7454723557974350e+00 9.8127712362707131e-01 2.3153606639837694e+00 4.3174388231158920e+00 1.4399473162387675e+00 2.3938768744012870e+00 -3.9968818861302009e+00 -1.1529521598122627e+00 -2.6297418524482508e+00 -6.0685645709955409e+00 -1.4572342334810036e+00 -2.5524148267557889e+00 6.5679969927239714e+00 1.3300127831460715e+00 2.7647025439738337e+00 1.0922869991713611e+00 1.7602689135569225e+00 1.3621260971191973e+00 -1.1086229422186848e+00 -1.5497958856349796e+00 -1.1955117472556338e+00 -1.2550179155359005e+00 -2.8008217198678635e+00 -1.3026966776144726e+00 1.0439687551918233e+00 2.5564694588517471e+00 1.3481103191127988e+00 1.4574860844888700e+00 2.8978204503526186e+00 1.5294029875957684e+00 -1.0874415741110659e+00 -2.6675391749177289e+00 -1.4411963417372562e+00 -1.4726721901324735e+00 -4.9970385336609251e+00 -1.7837360500520085e+00 1.3300127831460715e+00 4.8006364913202102e+00 1.4835014128316077e+00 2.0514500343031679e+00 1.5280483088213135e+00 3.5800035793079803e+00 -2.3521807864989999e+00 -1.1519799618219573e+00 -3.5454230795377688e+00 -2.2981858818054648e+00 -1.5197843426505329e+00 -4.3488187406711347e+00 2.3460219230995651e+00 1.2856144742408100e+00 4.9633665924213091e+00 2.4433420286341927e+00 1.5448507964792422e+00 4.5454759818858168e+00 -2.3858472277134704e+00 -1.3943944912565014e+00 -5.1873995076526347e+00 -2.5693026339928231e+00 -1.7758561966439821e+00 -7.1719587129275340e+00 2.7647025439738342e+00 1.4835014128316077e+00 7.1647538871739709e+00 1113 1114 1115 1140 1141 1142 1143 1144 1145 1116 1117 1118 1020 1021 1022 1068 1069 1070 1080 1081 1082 1032 1033 1034 5.5546105383868971e+00 1.4093480775624661e+00 2.2281289197278964e+00 -5.8347085237146716e+00 -1.3689727837401531e+00 -2.4468188685328847e+00 -3.6143836566782102e+00 -1.3068085736705828e+00 -1.8584664411209488e+00 3.3057867454430867e+00 1.0564721786187454e+00 2.0378805025246796e+00 3.7053978991753378e+00 1.4670448776675726e+00 2.1246212048894528e+00 -3.4056333274051913e+00 -1.0621969469401773e+00 -2.1755276655932438e+00 -2.2896141099272329e+00 -1.2274819951709408e+00 -1.8582613046928036e+00 2.5785444347199831e+00 1.0325951656730690e+00 1.9484436527978555e+00 1.4093480775624663e+00 5.1208675743754508e+00 1.9114990268827472e+00 -1.3318486313055666e+00 -4.6771011827770543e+00 -1.5785925564259475e+00 -1.4039069992962359e+00 -3.0165698324142438e+00 -1.5346080907777138e+00 9.9213662443686990e-01 2.6371463113961120e+00 1.4730997344542556e+00 1.4374702699056834e+00 3.0406982887277652e+00 1.6533329556649985e+00 -1.1992560862821517e+00 -2.7318958238953104e+00 -1.7459034100336792e+00 -1.1716436561663062e+00 -2.0434530702532223e+00 -1.6387197122662163e+00 1.2677004011452409e+00 1.6703077348405044e+00 1.4598920525015571e+00 2.2281289197278964e+00 1.9114990268827472e+00 6.9274104638250380e+00 -2.4328363561045245e+00 -1.6149725427316866e+00 -6.7667064604524692e+00 -2.0967095394044581e+00 -1.6178996834837993e+00 -4.2098767396883900e+00 1.9900164041995874e+00 1.5281114236344293e+00 4.8152345618261485e+00 2.1384811302546658e+00 1.6959357758378446e+00 4.3110728900506823e+00 -2.1237865395130386e+00 -1.5025848897660283e+00 -4.9678341145221054e+00 -1.8289814513447789e+00 -1.6897009474994973e+00 -3.5212327183820693e+00 2.1256874321846499e+00 1.2896118371259890e+00 3.4119321173431683e+00 -5.8347085237146690e+00 -1.3318486313055666e+00 -2.4328363561045245e+00 6.3120524235868496e+00 1.1972946391785668e+00 2.6357155080623915e+00 3.9837557964363954e+00 1.2360719432438647e+00 2.1810684906751647e+00 -3.6578501869574414e+00 -9.6538513355997613e-01 -2.4263877107697231e+00 -4.1729655055334849e+00 -1.4955563019082425e+00 -2.2533564801507637e+00 3.7787371993515153e+00 1.0699612215929937e+00 2.3783635372598715e+00 2.6042302303111846e+00 1.3357763452013010e+00 2.1727084700448351e+00 -3.0132514334803475e+00 -1.0463140824429393e+00 -2.2552754590172541e+00 -1.3689727837401531e+00 -4.6771011827770543e+00 -1.6149725427316861e+00 1.1972946391785670e+00 4.4647754801479627e+00 1.2953243254945594e+00 1.2632264181093842e+00 2.6476530925567778e+00 1.3512961458688215e+00 -8.6403613700730697e-01 -2.4306858741798925e+00 -1.2203542636718554e+00 -1.2450553151438641e+00 -2.7049118607182980e+00 -1.2427952941659490e+00 1.0205708131735840e+00 2.4772417379967697e+00 1.2668835259433338e+00 9.8390032864654109e-01 1.6866284580336295e+00 1.2487638878926606e+00 -9.8692796321675136e-01 -1.4635998510598947e+00 -1.0841457846298850e+00 -2.4468188685328847e+00 -1.5785925564259475e+00 -6.7667064604524683e+00 2.6357155080623915e+00 1.2953243254945590e+00 6.7267748241271361e+00 2.1144412562852448e+00 1.2789365706484650e+00 4.1623522102959667e+00 -2.0561640834885115e+00 -1.1396669832836972e+00 -4.8043783653070573e+00 -2.3515632928134385e+00 -1.5653758079301174e+00 -4.2368782410528354e+00 2.3874304870000675e+00 1.3310918187279517e+00 4.8518819872949042e+00 1.9128684317596099e+00 1.4973568060271476e+00 3.4419656031527630e+00 -2.1959094382724778e+00 -1.1190741732583609e+00 -3.3750115580584108e+00 -3.6143836566782102e+00 -1.4039069992962359e+00 -2.0967095394044581e+00 3.9837557964363954e+00 1.2632264181093842e+00 2.1144412562852448e+00 6.0961524925134079e+00 1.5842271378487067e+00 2.2157758588773895e+00 -5.6806960343494941e+00 -1.2292069695754864e+00 -2.2613075833479295e+00 -2.9705696256100271e+00 -1.4654371631653518e+00 -1.9465499390446206e+00 2.6031135282732256e+00 1.0867767062189830e+00 2.2111093295985245e+00 3.5748454323735603e+00 1.3620985065182489e+00 1.9658456903234700e+00 -3.9922179329588583e+00 -1.1977776366582469e+00 -2.2026050732876232e+00 -1.3068085736705830e+00 -3.0165698324142443e+00 -1.6178996834837993e+00 1.2360719432438647e+00 2.6476530925567778e+00 1.2789365706484650e+00 1.5842271378487067e+00 5.0491946871732987e+00 1.5991970176838668e+00 -1.2013361315829501e+00 -4.6590591590457127e+00 -1.5138645407717766e+00 -1.4564700114149944e+00 -2.0338674137722679e+00 -1.4167367742663792e+00 1.1550753297125411e+00 1.6888167414899207e+00 1.5538037200428301e+00 1.3534322408384107e+00 3.0110504608962390e+00 1.5685296820893659e+00 -1.3641919349749949e+00 -2.6872185768840104e+00 -1.4519659919425747e+00 -1.8584664411209488e+00 -1.5346080907777138e+00 -4.2098767396883892e+00 2.1810684906751652e+00 1.3512961458688215e+00 4.1623522102959667e+00 2.2157758588773899e+00 1.5991970176838670e+00 6.1519269723852501e+00 -2.3758539330171646e+00 -1.6253138528242050e+00 -6.6835488209940506e+00 -1.9751888058883322e+00 -1.4464291008389245e+00 -2.8845672299281904e+00 1.8988619172556966e+00 1.2596730566799814e+00 3.3720638666187361e+00 2.0287827484871528e+00 1.6263214998206819e+00 4.2438313175429911e+00 -2.1149798352689575e+00 -1.2301366756125076e+00 -4.1521815762323131e+00 3.3057867454430867e+00 9.9213662443686990e-01 1.9900164041995874e+00 -3.6578501869574418e+00 -8.6403613700730697e-01 -2.0561640834885115e+00 -5.6806960343494923e+00 -1.2013361315829501e+00 -2.3758539330171646e+00 5.5078090834149673e+00 9.2576709942317825e-01 2.3219563053553585e+00 2.5479260807534363e+00 1.1418268121475603e+00 1.8337903885872884e+00 -2.3332743317549061e+00 -8.4355388892433547e-01 -2.0068964462453556e+00 -3.2754988676532215e+00 -1.1336917615804758e+00 -1.9569135585808139e+00 3.5857975111035705e+00 9.8288738308745860e-01 2.2500649231896124e+00 1.0564721786187456e+00 2.6371463113961120e+00 1.5281114236344293e+00 -9.6538513355997613e-01 -2.4306858741798920e+00 -1.1396669832836972e+00 -1.2292069695754864e+00 -4.6590591590457127e+00 -1.6253138528242044e+00 9.2576709942317847e-01 4.5535447018375779e+00 1.4134041577432483e+00 1.0421478342046753e+00 1.6356128887489509e+00 1.1936541526808870e+00 -8.2126841426981390e-01 -1.4819133089842955e+00 -1.2127852223431439e+00 -9.3211660224854465e-01 -2.6952519699566890e+00 -1.3736222683456862e+00 9.2359000740722152e-01 2.4406064101839493e+00 1.2162185927381679e+00 2.0378805025246796e+00 1.4730997344542556e+00 4.8152345618261476e+00 -2.4263877107697231e+00 -1.2203542636718554e+00 -4.8043783653070573e+00 -2.2613075833479290e+00 -1.5138645407717766e+00 -6.6835488209940515e+00 2.3219563053553585e+00 1.4134041577432488e+00 7.5449836905338392e+00 2.2913797739713786e+00 1.6258278346035209e+00 3.3683443693743822e+00 -2.1189040777384527e+00 -1.3151553832556400e+00 -4.0939971697063156e+00 -2.0544406004732090e+00 -1.7323448810930173e+00 -4.9099215371735729e+00 2.2098233904778954e+00 1.2693873419912629e+00 4.7632832714466300e+00 3.7053978991753382e+00 1.4374702699056836e+00 2.1384811302546658e+00 -4.1729655055334849e+00 -1.2450553151438641e+00 -2.3515632928134385e+00 -2.9705696256100267e+00 -1.4564700114149944e+00 -1.9751888058883318e+00 2.5479260807534359e+00 1.0421478342046753e+00 2.2913797739713786e+00 6.3776730726287161e+00 1.8494504270945638e+00 2.4915431233404886e+00 -5.8741564169905587e+00 -1.4443501636412195e+00 -2.6236154935223688e+00 -3.6961919185056722e+00 -1.5706448549929093e+00 -2.2983820158385244e+00 4.0828864140822487e+00 1.3874518139880638e+00 2.3273455804961336e+00 1.4670448776675726e+00 3.0406982887277647e+00 1.6959357758378446e+00 -1.4955563019082427e+00 -2.7049118607182980e+00 -1.5653758079301172e+00 -1.4654371631653518e+00 -2.0338674137722679e+00 -1.4464291008389245e+00 1.1418268121475605e+00 1.6356128887489514e+00 1.6258278346035206e+00 1.8494504270945638e+00 5.1900051924735902e+00 1.8153399412786531e+00 -1.4570994147144616e+00 -4.7124917374841830e+00 -1.8114576163499398e+00 -1.4189071244629687e+00 -3.1213902364997170e+00 -1.7835229777191213e+00 1.3786778873413275e+00 2.7063448785241584e+00 1.4696819511180867e+00 2.1246212048894528e+00 1.6533329556649985e+00 4.3110728900506832e+00 -2.2533564801507637e+00 -1.2427952941659490e+00 -4.2368782410528354e+00 -1.9465499390446208e+00 -1.4167367742663792e+00 -2.8845672299281908e+00 1.8337903885872886e+00 1.1936541526808870e+00 3.3683443693743826e+00 2.4915431233404881e+00 1.8153399412786531e+00 6.2937940824510088e+00 -2.5753853291663460e+00 -1.7631708988144497e+00 -6.7794255860786636e+00 -1.9500474561862644e+00 -1.6828126241726180e+00 -4.3296409670004703e+00 2.2753844877307650e+00 1.4431885417948564e+00 4.2573006821840895e+00 -3.4056333274051913e+00 -1.1992560862821517e+00 -2.1237865395130382e+00 3.7787371993515158e+00 1.0205708131735838e+00 2.3874304870000675e+00 2.6031135282732256e+00 1.1550753297125411e+00 1.8988619172556971e+00 -2.3332743317549061e+00 -8.2126841426981367e-01 -2.1189040777384527e+00 -5.8741564169905587e+00 -1.4570994147144618e+00 -2.5753853291663469e+00 5.5847767858062793e+00 1.1322563419817995e+00 2.6094219269203021e+00 3.3973252527513731e+00 1.1824540407710378e+00 2.1862474428486864e+00 -3.7508886900317373e+00 -1.0127326103725340e+00 -2.2638858276069165e+00 -1.0621969469401773e+00 -2.7318958238953104e+00 -1.5025848897660283e+00 1.0699612215929937e+00 2.4772417379967697e+00 1.3310918187279517e+00 1.0867767062189830e+00 1.6888167414899207e+00 1.2596730566799814e+00 -8.4355388892433536e-01 -1.4819133089842955e+00 -1.3151553832556400e+00 -1.4443501636412197e+00 -4.7124917374841830e+00 -1.7631708988144497e+00 1.1322563419817997e+00 4.4906836958965481e+00 1.6341936423047865e+00 1.1431008813628987e+00 2.7421732019257563e+00 1.6636690984070270e+00 -1.0819941516509430e+00 -2.4726145069452059e+00 -1.3077164442836304e+00 -2.1755276655932438e+00 -1.7459034100336792e+00 -4.9678341145221054e+00 2.3783635372598715e+00 1.2668835259433335e+00 4.8518819872949024e+00 2.2111093295985245e+00 1.5538037200428303e+00 3.3720638666187361e+00 -2.0068964462453556e+00 -1.2127852223431439e+00 -4.0939971697063156e+00 -2.6236154935223688e+00 -1.8114576163499398e+00 -6.7794255860786636e+00 2.6094219269203021e+00 1.6341936423047867e+00 7.5639298713826690e+00 2.1237450984806934e+00 1.6684139758372232e+00 4.9564646969589505e+00 -2.5166002868984214e+00 -1.3531486154014094e+00 -4.9030835519481775e+00 -2.2896141099272334e+00 -1.1716436561663062e+00 -1.8289814513447786e+00 2.6042302303111846e+00 9.8390032864654109e-01 1.9128684317596101e+00 3.5748454323735603e+00 1.3534322408384105e+00 2.0287827484871523e+00 -3.2754988676532215e+00 -9.3211660224854453e-01 -2.0544406004732090e+00 -3.6961919185056722e+00 -1.4189071244629687e+00 -1.9500474561862646e+00 3.3973252527513731e+00 1.1431008813628987e+00 2.1237450984806938e+00 5.4085563956597946e+00 1.4409141885894752e+00 2.2115256763755506e+00 -5.7236524150097852e+00 -1.3986802565595053e+00 -2.4434524470987560e+00 -1.2274819951709408e+00 -2.0434530702532223e+00 -1.6897009474994973e+00 1.3357763452013007e+00 1.6866284580336299e+00 1.4973568060271480e+00 1.3620985065182489e+00 3.0110504608962390e+00 1.6263214998206816e+00 -1.1336917615804758e+00 -2.6952519699566890e+00 -1.7323448810930171e+00 -1.5706448549929093e+00 -3.1213902364997170e+00 -1.6828126241726180e+00 1.1824540407710378e+00 2.7421732019257572e+00 1.6684139758372232e+00 1.4409141885894750e+00 5.1248795479807434e+00 2.0042547929688448e+00 -1.3894244693357360e+00 -4.7046363921267398e+00 -1.6914886218887664e+00 -1.8582613046928036e+00 -1.6387197122662163e+00 -3.5212327183820693e+00 2.1727084700448356e+00 1.2487638878926606e+00 3.4419656031527630e+00 1.9658456903234702e+00 1.5685296820893659e+00 4.2438313175429903e+00 -1.9569135585808142e+00 -1.3736222683456862e+00 -4.9099215371735729e+00 -2.2983820158385244e+00 -1.7835229777191208e+00 -4.3296409670004703e+00 2.1862474428486864e+00 1.6636690984070270e+00 4.9564646969589496e+00 2.2115256763755506e+00 2.0042547929688443e+00 6.8938356177698754e+00 -2.4227704004804007e+00 -1.6893525030268728e+00 -6.7753020128684689e+00 2.5785444347199826e+00 1.2677004011452409e+00 2.1256874321846495e+00 -3.0132514334803475e+00 -9.8692796321675125e-01 -2.1959094382724778e+00 -3.9922179329588583e+00 -1.3641919349749947e+00 -2.1149798352689575e+00 3.5857975111035705e+00 9.2359000740722164e-01 2.2098233904778954e+00 4.0828864140822487e+00 1.3786778873413272e+00 2.2753844877307650e+00 -3.7508886900317373e+00 -1.0819941516509433e+00 -2.5166002868984210e+00 -5.7236524150097852e+00 -1.3894244693357356e+00 -2.4227704004803998e+00 6.2327821115749238e+00 1.2525702232846339e+00 2.6393646505269484e+00 1.0325951656730690e+00 1.6703077348405044e+00 1.2896118371259890e+00 -1.0463140824429393e+00 -1.4635998510598947e+00 -1.1190741732583604e+00 -1.1977776366582469e+00 -2.6872185768840100e+00 -1.2301366756125076e+00 9.8288738308745849e-01 2.4406064101839489e+00 1.2693873419912631e+00 1.3874518139880636e+00 2.7063448785241584e+00 1.4431885417948564e+00 -1.0127326103725340e+00 -2.4726145069452059e+00 -1.3531486154014094e+00 -1.3986802565595053e+00 -4.7046363921267389e+00 -1.6893525030268726e+00 1.2525702232846343e+00 4.5108103034672382e+00 1.3895242463870430e+00 1.9484436527978550e+00 1.4598920525015573e+00 3.4119321173431683e+00 -2.2552754590172541e+00 -1.0841457846298852e+00 -3.3750115580584108e+00 -2.2026050732876232e+00 -1.4519659919425745e+00 -4.1521815762323131e+00 2.2500649231896124e+00 1.2162185927381679e+00 4.7632832714466300e+00 2.3273455804961340e+00 1.4696819511180867e+00 4.2573006821840886e+00 -2.2638858276069165e+00 -1.3077164442836302e+00 -4.9030835519481775e+00 -2.4434524470987560e+00 -1.6914886218887664e+00 -6.7753020128684689e+00 2.6393646505269484e+00 1.3895242463870430e+00 6.7730626281334851e+00 321 322 323 1116 1117 1118 1131 1132 1133 1092 1093 1094 984 985 986 1032 1033 1034 1161 1162 1163 1095 1096 1097 4.7322589123900576e+00 1.5149222690032518e+00 1.6739974837954628e+00 -4.9802859000727215e+00 -1.5560350857065304e+00 -1.8855852409461060e+00 -2.9863567499651302e+00 -1.3876020274771981e+00 -1.3694638314521281e+00 2.7064763717816631e+00 1.1649004069329405e+00 1.5572678650625316e+00 3.1532169738785920e+00 1.6084608965364060e+00 1.5998142213290354e+00 -2.8816526900729991e+00 -1.2417648865544568e+00 -1.6832635080814342e+00 -1.8470661985622736e+00 -1.2999069779029258e+00 -1.3792426510942630e+00 2.1034092806228131e+00 1.1970254051685127e+00 1.4864756613869008e+00 1.5149222690032522e+00 5.3171042659098626e+00 2.0273018973738575e+00 -1.5352634157794867e+00 -4.8719014005047345e+00 -1.8074364435658337e+00 -1.5009535421549374e+00 -3.3023346761918257e+00 -1.5707799307892745e+00 1.0954370460677909e+00 2.9230042281879998e+00 1.6976321849859071e+00 1.5790363546632584e+00 3.4764136375504671e+00 1.7245251590964346e+00 -1.3261955653149524e+00 -3.1658572028537071e+00 -1.9650742689846179e+00 -1.2223675969953578e+00 -2.4798381327208778e+00 -1.7146614980326853e+00 1.3953844505104329e+00 2.1034092806228135e+00 1.6084928999162109e+00 1.6739974837954623e+00 2.0273018973738579e+00 5.7175704258157545e+00 -1.8787598778822510e+00 -1.8266707977310990e+00 -5.6563538361968186e+00 -1.5604829003701017e+00 -1.6651080020649667e+00 -3.3160842103193122e+00 1.4874523964101976e+00 1.7210888839242577e+00 3.9355189204024978e+00 1.6283592639276183e+00 1.7849195790551045e+00 3.4616798888392619e+00 -1.6212993508906570e+00 -1.7594539966221718e+00 -4.1123027377864858e+00 -1.3377599149064772e+00 -1.7685532253218830e+00 -2.7413583094513312e+00 1.6084928999162091e+00 1.4864756613869001e+00 2.7113298586964318e+00 -4.9802859000727207e+00 -1.5352634157794867e+00 -1.8787598778822510e+00 5.4081633236235058e+00 1.4968686943660428e+00 2.0882604570409624e+00 3.3133106967182582e+00 1.4295222143887425e+00 1.6739477800415112e+00 -3.0049620533901082e+00 -1.1925969203538718e+00 -1.9325280761818886e+00 -3.5781466399352544e+00 -1.7054599176969789e+00 -1.7141816508004479e+00 3.2043898482794773e+00 1.3245969641672501e+00 1.8760593307752536e+00 2.1173688574977199e+00 1.4822393588112284e+00 1.6557552623287448e+00 -2.4798381327208761e+00 -1.2999069779029258e+00 -1.7685532253218836e+00 -1.5560350857065304e+00 -4.8719014005047345e+00 -1.8266707977310990e+00 1.4968686943660428e+00 4.6091315711348697e+00 1.6035557047079838e+00 1.4282014698297743e+00 2.9305026533202430e+00 1.4948340394044670e+00 -1.0370289657281908e+00 -2.6734153151786657e+00 -1.5457281487164454e+00 -1.5066308118671303e+00 -3.1257699492674029e+00 -1.4130959263470133e+00 1.2688115207925517e+00 2.8611497815602425e+00 1.5807942087423539e+00 1.1281807753088418e+00 2.1173688574977207e+00 1.4440708348462337e+00 -1.2223675969953587e+00 -1.8470661985622745e+00 -1.3377599149064794e+00 -1.8855852409461060e+00 -1.8074364435658334e+00 -5.6563538361968186e+00 2.0882604570409629e+00 1.6035557047079840e+00 5.6982134644074440e+00 1.5957553502688115e+00 1.4234944166370189e+00 3.3423907827627284e+00 -1.5704098278802603e+00 -1.4217766790726398e+00 -4.0115014554368500e+00 -1.8550031965926879e+00 -1.7407851072320806e+00 -3.4630911210562432e+00 1.8975731212957327e+00 1.6664354972910691e+00 4.0858385384969438e+00 1.4440708348462330e+00 1.6557552623287457e+00 2.7458619364741308e+00 -1.7146614980326862e+00 -1.3792426510942639e+00 -2.7413583094513339e+00 -2.9863567499651302e+00 -1.5009535421549374e+00 -1.5604829003701017e+00 3.3133106967182582e+00 1.4282014698297743e+00 1.5957553502688115e+00 5.0833141208514361e+00 1.6844245458223852e+00 1.6116922879762696e+00 -4.6902932015122305e+00 -1.3396743166354401e+00 -1.6849474626670435e+00 -2.4623535631930142e+00 -1.5894337852483773e+00 -1.4246407177360700e+00 2.1142107199722644e+00 1.2755154414750518e+00 1.7042370279560850e+00 2.9305026533202483e+00 1.4295222143887427e+00 1.4234944166370189e+00 -3.3023346761918311e+00 -1.3876020274771992e+00 -1.6651080020649685e+00 -1.3876020274771983e+00 -3.3023346761918257e+00 -1.6651080020649667e+00 1.4295222143887421e+00 2.9305026533202430e+00 1.4234944166370189e+00 1.6844245458223852e+00 5.0833141208514370e+00 1.6116922879762698e+00 -1.3396743166354401e+00 -4.6902932015122323e+00 -1.6849474626670440e+00 -1.5894337852483775e+00 -2.4623535631930142e+00 -1.4246407177360700e+00 1.2755154414750516e+00 2.1142107199722644e+00 1.7042370279560846e+00 1.4282014698297747e+00 3.3133106967182644e+00 1.5957553502688115e+00 -1.5009535421549378e+00 -2.9863567499651364e+00 -1.5604829003701035e+00 -1.3694638314521284e+00 -1.5707799307892745e+00 -3.3160842103193122e+00 1.6739477800415110e+00 1.4948340394044670e+00 3.3423907827627288e+00 1.6116922879762696e+00 1.6116922879762696e+00 4.9523966529188295e+00 -1.7977064872711450e+00 -1.7977064872711459e+00 -5.4637090911849882e+00 -1.4737824310631238e+00 -1.4737824310631236e+00 -2.1890251613689933e+00 1.4312585731534235e+00 1.4312585731534238e+00 2.6477244547483196e+00 1.4948340394044670e+00 1.6739477800415128e+00 3.3423907827627350e+00 -1.5707799307892754e+00 -1.3694638314521299e+00 -3.3160842103193189e+00 2.7064763717816631e+00 1.0954370460677909e+00 1.4874523964101980e+00 -3.0049620533901082e+00 -1.0370289657281908e+00 -1.5704098278802603e+00 -4.6902932015122305e+00 -1.3396743166354399e+00 -1.7977064872711450e+00 4.5626012075636870e+00 1.0654894763165061e+00 1.7478856617730063e+00 2.0522528582522339e+00 1.2371327893150477e+00 1.3473313997747745e+00 -1.8756640957045803e+00 -9.9365951591478319e-01 -1.5138653476581938e+00 -2.6734153151786701e+00 -1.1925969203538724e+00 -1.4217766790726398e+00 2.9230042281880051e+00 1.1649004069329414e+00 1.7210888839242591e+00 1.1649004069329407e+00 2.9230042281879998e+00 1.7210888839242577e+00 -1.1925969203538718e+00 -2.6734153151786657e+00 -1.4217766790726398e+00 -1.3396743166354403e+00 -4.6902932015122314e+00 -1.7977064872711459e+00 1.0654894763165064e+00 4.5626012075636906e+00 1.7478856617730072e+00 1.2371327893150486e+00 2.0522528582522339e+00 1.3473313997747749e+00 -9.9365951591478352e-01 -1.8756640957045807e+00 -1.5138653476581940e+00 -1.0370289657281910e+00 -3.0049620533901149e+00 -1.5704098278802616e+00 1.0954370460677914e+00 2.7064763717816689e+00 1.4874523964102002e+00 1.5572678650625318e+00 1.6976321849859071e+00 3.9355189204024970e+00 -1.9325280761818886e+00 -1.5457281487164454e+00 -4.0115014554368500e+00 -1.6849474626670440e+00 -1.6849474626670442e+00 -5.4637090911849882e+00 1.7478856617730063e+00 1.7478856617730074e+00 6.3730953736514859e+00 1.8243600781544713e+00 1.8243600781544711e+00 2.6528314057677238e+00 -1.6639421024105392e+00 -1.6639421024105392e+00 -3.4102526181655186e+00 -1.5457281487164445e+00 -1.9325280761818902e+00 -4.0115014554368553e+00 1.6976321849859071e+00 1.5572678650625329e+00 3.9355189204025049e+00 3.1532169738785925e+00 1.5790363546632586e+00 1.6283592639276183e+00 -3.5781466399352544e+00 -1.5066308118671303e+00 -1.8550031965926879e+00 -2.4623535631930142e+00 -1.5894337852483778e+00 -1.4737824310631238e+00 2.0522528582522339e+00 1.2371327893150486e+00 1.8243600781544713e+00 5.6684265573381101e+00 2.0695643152099414e+00 1.8792101044287173e+00 -5.1840398746237319e+00 -1.6926698409121681e+00 -2.0472782906780229e+00 -3.1257699492674078e+00 -1.7054599176969807e+00 -1.7407851072320806e+00 3.4764136375504728e+00 1.6084608965364078e+00 1.7849195790551069e+00 1.6084608965364062e+00 3.4764136375504671e+00 1.7849195790551047e+00 -1.7054599176969791e+00 -3.1257699492674029e+00 -1.7407851072320806e+00 -1.5894337852483771e+00 -2.4623535631930142e+00 -1.4737824310631236e+00 1.2371327893150477e+00 2.0522528582522339e+00 1.8243600781544711e+00 2.0695643152099414e+00 5.6684265573381092e+00 1.8792101044287168e+00 -1.6926698409121681e+00 -5.1840398746237319e+00 -2.0472782906780225e+00 -1.5066308118671299e+00 -3.5781466399352606e+00 -1.8550031965926879e+00 1.5790363546632589e+00 3.1532169738785987e+00 1.6283592639276201e+00 1.5998142213290358e+00 1.7245251590964346e+00 3.4616798888392619e+00 -1.7141816508004479e+00 -1.4130959263470133e+00 -3.4630911210562432e+00 -1.4246407177360700e+00 -1.4246407177360700e+00 -2.1890251613689933e+00 1.3473313997747742e+00 1.3473313997747749e+00 2.6528314057677238e+00 1.8792101044287168e+00 1.8792101044287171e+00 5.3120208180496897e+00 -1.9989625897454311e+00 -1.9989625897454313e+00 -5.7730045980144631e+00 -1.4130959263470135e+00 -1.7141816508004495e+00 -3.4630911210562481e+00 1.7245251590964352e+00 1.5998142213290376e+00 3.4616798888392699e+00 -2.8816526900729991e+00 -1.3261955653149524e+00 -1.6212993508906570e+00 3.2043898482794773e+00 1.2688115207925517e+00 1.8975731212957327e+00 2.1142107199722644e+00 1.2755154414750518e+00 1.4312585731534238e+00 -1.8756640957045803e+00 -9.9365951591478352e-01 -1.6639421024105390e+00 -5.1840398746237311e+00 -1.6926698409121677e+00 -1.9989625897454308e+00 4.9274635134430342e+00 1.3853658822615076e+00 2.0483908479285766e+00 2.8611497815602474e+00 1.3245969641672510e+00 1.6664354972910693e+00 -3.1658572028537129e+00 -1.2417648865544579e+00 -1.7594539966221738e+00 -1.2417648865544568e+00 -3.1658572028537071e+00 -1.7594539966221718e+00 1.3245969641672501e+00 2.8611497815602429e+00 1.6664354972910691e+00 1.2755154414750520e+00 2.1142107199722644e+00 1.4312585731534240e+00 -9.9365951591478319e-01 -1.8756640957045807e+00 -1.6639421024105392e+00 -1.6926698409121681e+00 -5.1840398746237328e+00 -1.9989625897454313e+00 1.3853658822615076e+00 4.9274635134430342e+00 2.0483908479285766e+00 1.2688115207925517e+00 3.2043898482794839e+00 1.8975731212957339e+00 -1.3261955653149531e+00 -2.8816526900730057e+00 -1.6212993508906597e+00 -1.6832635080814342e+00 -1.9650742689846181e+00 -4.1123027377864858e+00 1.8760593307752533e+00 1.5807942087423539e+00 4.0858385384969438e+00 1.7042370279560850e+00 1.7042370279560850e+00 2.6477244547483201e+00 -1.5138653476581938e+00 -1.5138653476581940e+00 -3.4102526181655186e+00 -2.0472782906780229e+00 -2.0472782906780225e+00 -5.7730045980144622e+00 2.0483908479285771e+00 2.0483908479285766e+00 6.5884611600107492e+00 1.5807942087423539e+00 1.8760593307752547e+00 4.0858385384969491e+00 -1.9650742689846190e+00 -1.6832635080814358e+00 -4.1123027377864938e+00 -1.8470661985622736e+00 -1.2223675969953576e+00 -1.3377599149064772e+00 2.1173688574977199e+00 1.1281807753088418e+00 1.4440708348462330e+00 2.9305026533202483e+00 1.4282014698297745e+00 1.4948340394044670e+00 -2.6734153151786701e+00 -1.0370289657281910e+00 -1.5457281487164443e+00 -3.1257699492674078e+00 -1.5066308118671301e+00 -1.4130959263470135e+00 2.8611497815602474e+00 1.2688115207925517e+00 1.5807942087423541e+00 4.6091315711348901e+00 1.4968686943660445e+00 1.6035557047079845e+00 -4.8719014005047541e+00 -1.5560350857065333e+00 -1.8266707977311021e+00 -1.2999069779029258e+00 -2.4798381327208778e+00 -1.7685532253218830e+00 1.4822393588112284e+00 2.1173688574977207e+00 1.6557552623287457e+00 1.4295222143887427e+00 3.3133106967182644e+00 1.6739477800415130e+00 -1.1925969203538724e+00 -3.0049620533901149e+00 -1.9325280761818897e+00 -1.7054599176969807e+00 -3.5781466399352606e+00 -1.7141816508004495e+00 1.3245969641672510e+00 3.2043898482794839e+00 1.8760593307752547e+00 1.4968686943660445e+00 5.4081633236235280e+00 2.0882604570409660e+00 -1.5352634157794882e+00 -4.9802859000727437e+00 -1.8787598778822558e+00 -1.3792426510942630e+00 -1.7146614980326851e+00 -2.7413583094513312e+00 1.6557552623287448e+00 1.4440708348462337e+00 2.7458619364741308e+00 1.4234944166370189e+00 1.5957553502688115e+00 3.3423907827627342e+00 -1.4217766790726398e+00 -1.5704098278802616e+00 -4.0115014554368562e+00 -1.7407851072320806e+00 -1.8550031965926879e+00 -3.4630911210562481e+00 1.6664354972910695e+00 1.8975731212957336e+00 4.0858385384969491e+00 1.6035557047079845e+00 2.0882604570409660e+00 5.6982134644074653e+00 -1.8074364435658345e+00 -1.8855852409461096e+00 -5.6563538361968435e+00 2.1034092806228131e+00 1.3953844505104329e+00 1.6084928999162091e+00 -2.4798381327208761e+00 -1.2223675969953587e+00 -1.7146614980326860e+00 -3.3023346761918306e+00 -1.5009535421549378e+00 -1.5707799307892754e+00 2.9230042281880051e+00 1.0954370460677916e+00 1.6976321849859075e+00 3.4764136375504733e+00 1.5790363546632589e+00 1.7245251590964352e+00 -3.1658572028537129e+00 -1.3261955653149533e+00 -1.9650742689846190e+00 -4.8719014005047541e+00 -1.5352634157794887e+00 -1.8074364435658345e+00 5.3171042659098848e+00 1.5149222690032544e+00 2.0273018973738615e+00 1.1970254051685127e+00 2.1034092806228135e+00 1.4864756613869001e+00 -1.2999069779029253e+00 -1.8470661985622745e+00 -1.3792426510942639e+00 -1.3876020274771992e+00 -2.9863567499651360e+00 -1.3694638314521295e+00 1.1649004069329414e+00 2.7064763717816693e+00 1.5572678650625329e+00 1.6084608965364076e+00 3.1532169738785987e+00 1.5998142213290376e+00 -1.2417648865544579e+00 -2.8816526900730057e+00 -1.6832635080814355e+00 -1.5560350857065330e+00 -4.9802859000727446e+00 -1.8855852409461100e+00 1.5149222690032544e+00 4.7322589123900789e+00 1.6739974837954663e+00 1.4864756613869006e+00 1.6084928999162107e+00 2.7113298586964310e+00 -1.7685532253218836e+00 -1.3377599149064792e+00 -2.7413583094513339e+00 -1.6651080020649685e+00 -1.5604829003701037e+00 -3.3160842103193184e+00 1.7210888839242591e+00 1.4874523964102002e+00 3.9355189204025045e+00 1.7849195790551069e+00 1.6283592639276201e+00 3.4616798888392699e+00 -1.7594539966221741e+00 -1.6212993508906597e+00 -4.1123027377864938e+00 -1.8266707977311023e+00 -1.8787598778822558e+00 -5.6563538361968426e+00 2.0273018973738610e+00 1.6739974837954672e+00 5.7175704258157811e+00 1116 1117 1118 1143 1144 1145 1158 1159 1160 1131 1132 1133 1032 1033 1034 1080 1081 1082 1173 1174 1175 1161 1162 1163 4.6472797587582253e+00 1.4847500572383070e+00 1.6376339772066344e+00 -4.8956084196345167e+00 -1.5294918789069492e+00 -1.8482199207714511e+00 -2.9685306224531622e+00 -1.3679848603047045e+00 -1.3423951696538428e+00 2.6836173148135947e+00 1.1428502824129201e+00 1.5242362556816311e+00 3.0602408304307600e+00 1.5787259992874361e+00 1.5602525650016144e+00 -2.7828072250315157e+00 -1.2048776840292035e+00 -1.6440064382184552e+00 -1.8055624306518976e+00 -1.2739543527582202e+00 -1.3440009379269191e+00 2.0613707937685111e+00 1.1699824370604148e+00 1.4564996686807896e+00 1.4847500572383072e+00 5.2423988695524359e+00 1.9978735298990264e+00 -1.5076723430245369e+00 -4.7895208250312393e+00 -1.7702816773173036e+00 -1.4816273124917121e+00 -3.2915102468548567e+00 -1.5452893068368354e+00 1.0709915152757195e+00 2.9034629433125403e+00 1.6665088301071409e+00 1.5531538811327825e+00 3.3899178883067256e+00 1.6879716578818507e+00 -1.2939783839847370e+00 -3.0699743332986489e+00 -1.9336661673543891e+00 -1.1984330260248675e+00 -2.4461450897554680e+00 -1.6845455641377929e+00 1.3728156118790447e+00 2.0613707937685106e+00 1.5814286977583050e+00 1.6376339772066346e+00 1.9978735298990267e+00 5.6296219559378278e+00 -1.8484622453158299e+00 -1.7979768625368209e+00 -5.5616475855923024e+00 -1.5365180138262384e+00 -1.6445553872428460e+00 -3.2902831012805422e+00 1.4636099561821823e+00 1.7039683567137145e+00 3.9089554892215692e+00 1.5972321341759295e+00 1.7533273993856644e+00 3.3552553988490996e+00 -1.5844083429984170e+00 -1.7231688562534915e+00 -4.0138359804381283e+00 -1.3105161631825686e+00 -1.7459678486460375e+00 -2.6925266587238221e+00 1.5814286977583079e+00 1.4564996686807909e+00 2.6644604820262989e+00 -4.8956084196345167e+00 -1.5076723430245369e+00 -1.8484622453158301e+00 5.3326879621632735e+00 1.4693772852390388e+00 2.0561203626369617e+00 3.3017444462932763e+00 1.4089449955130755e+00 1.6531213077300311e+00 -2.9867291982852651e+00 -1.1688963842327149e+00 -1.9084145500408922e+00 -3.4941619951910985e+00 -1.6819328554984303e+00 -1.6802899939391012e+00 3.1087287961455674e+00 1.2923992969643299e+00 1.8470031116873207e+00 2.0794834982642323e+00 1.4617343577974578e+00 1.6268898558875435e+00 -2.4461450897554684e+00 -1.2739543527582204e+00 -1.7459678486460355e+00 -1.5294918789069492e+00 -4.7895208250312393e+00 -1.7979768625368209e+00 1.4693772852390392e+00 4.5264263449929167e+00 1.5677363051463569e+00 1.4122194021234535e+00 2.9136944667857767e+00 1.4751020727774780e+00 -1.0158496400248787e+00 -2.6529124916551807e+00 -1.5189010882123737e+00 -1.4783557324747083e+00 -3.0366358671970879e+00 -1.3770416450697571e+00 1.2349197936566214e+00 2.7650273044924800e+00 1.5470588897831166e+00 1.1056137964122896e+00 2.0794834982642323e+00 1.4145384912945658e+00 -1.1984330260248677e+00 -1.8055624306518969e+00 -1.3105161631825666e+00 -1.8482199207714518e+00 -1.7702816773173038e+00 -5.5616475855923015e+00 2.0561203626369622e+00 1.5677363051463566e+00 5.6013477187521614e+00 1.5679589008730124e+00 1.3925338870695312e+00 3.3137791523026205e+00 -1.5453236561460573e+00 -1.3924876343938632e+00 -3.9831453074826140e+00 -1.8183646269435141e+00 -1.7054849357238773e+00 -3.3552244561331790e+00 1.8578360131942764e+00 1.6250951372585321e+00 3.9835262168832299e+00 1.4145384912945655e+00 1.6268898558875420e+00 2.6938909199939003e+00 -1.6845455641377924e+00 -1.3440009379269182e+00 -2.6925266587238177e+00 -2.9685306224531622e+00 -1.4816273124917121e+00 -1.5365180138262382e+00 3.3017444462932763e+00 1.4122194021234538e+00 1.5679589008730122e+00 5.1478092803426110e+00 1.6763845167389850e+00 1.5953268763585440e+00 -4.7437630571989136e+00 -1.3254658959064833e+00 -1.6584274057057560e+00 -2.4316094306616884e+00 -1.5714349739421205e+00 -1.3961820786388295e+00 2.0721651637469582e+00 1.2489641282695056e+00 1.6798632211125781e+00 2.9136944667857709e+00 1.4089449955130755e+00 1.3925338870695327e+00 -3.2915102468548509e+00 -1.3679848603047040e+00 -1.6445553872428447e+00 -1.3679848603047045e+00 -3.2915102468548567e+00 -1.6445553872428464e+00 1.4089449955130755e+00 2.9136944667857767e+00 1.3925338870695312e+00 1.6763845167389846e+00 5.1478092803426101e+00 1.5953268763585442e+00 -1.3254658959064824e+00 -4.7437630571989162e+00 -1.6584274057057558e+00 -1.5714349739421201e+00 -2.4316094306616880e+00 -1.3961820786388290e+00 1.2489641282695054e+00 2.0721651637469582e+00 1.6798632211125775e+00 1.4122194021234524e+00 3.3017444462932710e+00 1.5679589008730119e+00 -1.4816273124917114e+00 -2.9685306224531551e+00 -1.5365180138262358e+00 -1.3423951696538428e+00 -1.5452893068368354e+00 -3.2902831012805422e+00 1.6531213077300311e+00 1.4751020727774777e+00 3.3137791523026205e+00 1.5953268763585440e+00 1.5953268763585442e+00 5.0020417624545912e+00 -1.7928039809691649e+00 -1.7928039809691660e+00 -5.5100971851488962e+00 -1.4448969681023422e+00 -1.4448969681023422e+00 -2.1388141261412872e+00 1.4018351686961332e+00 1.4018351686961334e+00 2.5998774467914290e+00 1.4751020727774766e+00 1.6531213077300304e+00 3.3137791523026161e+00 -1.5452893068368345e+00 -1.3423951696538416e+00 -3.2902831012805338e+00 2.6836173148135951e+00 1.0709915152757195e+00 1.4636099561821820e+00 -2.9867291982852651e+00 -1.0158496400248787e+00 -1.5453236561460577e+00 -4.7437630571989144e+00 -1.3254658959064827e+00 -1.7928039809691654e+00 4.6167993153553599e+00 1.0481901651802890e+00 1.7286966232362722e+00 2.0121869541558333e+00 1.2136964848054388e+00 1.3189867224490370e+00 -1.8326617804979657e+00 -9.6551652751029104e-01 -1.4846463870721154e+00 -2.6529124916551763e+00 -1.1688963842327145e+00 -1.3924876343938630e+00 2.9034629433125358e+00 1.1428502824129194e+00 1.7039683567137114e+00 1.1428502824129201e+00 2.9034629433125403e+00 1.7039683567137145e+00 -1.1688963842327151e+00 -2.6529124916551807e+00 -1.3924876343938637e+00 -1.3254658959064833e+00 -4.7437630571989162e+00 -1.7928039809691660e+00 1.0481901651802890e+00 4.6167993153553608e+00 1.7286966232362728e+00 1.2136964848054390e+00 2.0121869541558333e+00 1.3189867224490373e+00 -9.6551652751029116e-01 -1.8326617804979659e+00 -1.4846463870721156e+00 -1.0158496400248784e+00 -2.9867291982852611e+00 -1.5453236561460579e+00 1.0709915152757197e+00 2.6836173148135893e+00 1.4636099561821803e+00 1.5242362556816313e+00 1.6665088301071405e+00 3.9089554892215697e+00 -1.9084145500408918e+00 -1.5189010882123739e+00 -3.9831453074826140e+00 -1.6584274057057560e+00 -1.6584274057057558e+00 -5.5100971851488962e+00 1.7286966232362719e+00 1.7286966232362724e+00 6.4296350148130230e+00 1.7967848844367666e+00 1.7967848844367664e+00 2.5960626639972064e+00 -1.6304835495027887e+00 -1.6304835495027890e+00 -3.3672208571392384e+00 -1.5189010882123739e+00 -1.9084145500408916e+00 -3.9831453074826109e+00 1.6665088301071411e+00 1.5242362556816305e+00 3.9089554892215617e+00 3.0602408304307600e+00 1.5531538811327823e+00 1.5972321341759295e+00 -3.4941619951910985e+00 -1.4783557324747081e+00 -1.8183646269435143e+00 -2.4316094306616884e+00 -1.5714349739421201e+00 -1.4448969681023422e+00 2.0121869541558333e+00 1.2136964848054390e+00 1.7967848844367666e+00 5.4427666220328321e+00 2.0324281312686776e+00 1.8266327532427209e+00 -4.9427050018762753e+00 -1.6462809345790756e+00 -2.0052306404713423e+00 -3.0366358671970826e+00 -1.6819328554984296e+00 -1.7054849357238779e+00 3.3899178883067207e+00 1.5787259992874345e+00 1.7533273993856615e+00 1.5787259992874358e+00 3.3899178883067256e+00 1.7533273993856644e+00 -1.6819328554984303e+00 -3.0366358671970879e+00 -1.7054849357238773e+00 -1.5714349739421205e+00 -2.4316094306616889e+00 -1.4448969681023422e+00 1.2136964848054390e+00 2.0121869541558333e+00 1.7967848844367664e+00 2.0324281312686776e+00 5.4427666220328339e+00 1.8266327532427211e+00 -1.6462809345790763e+00 -4.9427050018762770e+00 -2.0052306404713423e+00 -1.4783557324747079e+00 -3.4941619951910932e+00 -1.8183646269435152e+00 1.5531538811327827e+00 3.0602408304307538e+00 1.5972321341759268e+00 1.5602525650016146e+00 1.6879716578818507e+00 3.3552553988490996e+00 -1.6802899939391012e+00 -1.3770416450697571e+00 -3.3552244561331790e+00 -1.3961820786388295e+00 -1.3961820786388293e+00 -2.1388141261412872e+00 1.3189867224490370e+00 1.3189867224490375e+00 2.5960626639972064e+00 1.8266327532427207e+00 1.8266327532427202e+00 5.0586673527132007e+00 -1.9403299809275363e+00 -1.9403299809275358e+00 -5.5159777760009590e+00 -1.3770416450697562e+00 -1.6802899939391001e+00 -3.3552244561331737e+00 1.6879716578818502e+00 1.5602525650016137e+00 3.3552553988490921e+00 -2.7828072250315157e+00 -1.2939783839847374e+00 -1.5844083429984170e+00 3.1087287961455674e+00 1.2349197936566216e+00 1.8578360131942764e+00 2.0721651637469587e+00 1.2489641282695054e+00 1.4018351686961332e+00 -1.8326617804979657e+00 -9.6551652751029116e-01 -1.6304835495027890e+00 -4.9427050018762761e+00 -1.6462809345790763e+00 -1.9403299809275361e+00 4.6822270763194007e+00 1.3343703112128511e+00 1.9936244105332872e+00 2.7650273044924756e+00 1.2923992969643296e+00 1.6250951372585318e+00 -3.0699743332986444e+00 -1.2048776840292030e+00 -1.7231688562534886e+00 -1.2048776840292037e+00 -3.0699743332986489e+00 -1.7231688562534915e+00 1.2923992969643299e+00 2.7650273044924800e+00 1.6250951372585321e+00 1.2489641282695056e+00 2.0721651637469582e+00 1.4018351686961334e+00 -9.6551652751029082e-01 -1.8326617804979661e+00 -1.6304835495027890e+00 -1.6462809345790756e+00 -4.9427050018762770e+00 -1.9403299809275363e+00 1.3343703112128511e+00 4.6822270763194007e+00 1.9936244105332876e+00 1.2349197936566210e+00 3.1087287961455630e+00 1.8578360131942766e+00 -1.2939783839847372e+00 -2.7828072250315112e+00 -1.5844083429984144e+00 -1.6440064382184554e+00 -1.9336661673543891e+00 -4.0138359804381283e+00 1.8470031116873207e+00 1.5470588897831166e+00 3.9835262168832299e+00 1.6798632211125781e+00 1.6798632211125775e+00 2.5998774467914290e+00 -1.4846463870721154e+00 -1.4846463870721156e+00 -3.3672208571392384e+00 -2.0052306404713423e+00 -2.0052306404713418e+00 -5.5159777760009590e+00 1.9936244105332870e+00 1.9936244105332872e+00 6.3439407134585579e+00 1.5470588897831163e+00 1.8470031116873205e+00 3.9835262168832264e+00 -1.9336661673543896e+00 -1.6440064382184552e+00 -4.0138359804381203e+00 -1.8055624306518978e+00 -1.1984330260248675e+00 -1.3105161631825684e+00 2.0794834982642323e+00 1.1056137964122896e+00 1.4145384912945655e+00 2.9136944667857709e+00 1.4122194021234524e+00 1.4751020727774766e+00 -2.6529124916551758e+00 -1.0158496400248784e+00 -1.5189010882123739e+00 -3.0366358671970826e+00 -1.4783557324747083e+00 -1.3770416450697562e+00 2.7650273044924756e+00 1.2349197936566212e+00 1.5470588897831163e+00 4.5264263449928954e+00 1.4693772852390370e+00 1.5677363051463555e+00 -4.7895208250312189e+00 -1.5294918789069465e+00 -1.7979768625368171e+00 -1.2739543527582204e+00 -2.4461450897554680e+00 -1.7459678486460375e+00 1.4617343577974578e+00 2.0794834982642323e+00 1.6268898558875420e+00 1.4089449955130755e+00 3.3017444462932710e+00 1.6531213077300302e+00 -1.1688963842327145e+00 -2.9867291982852606e+00 -1.9084145500408911e+00 -1.6819328554984296e+00 -3.4941619951910932e+00 -1.6802899939391001e+00 1.2923992969643294e+00 3.1087287961455625e+00 1.8470031116873205e+00 1.4693772852390370e+00 5.3326879621632530e+00 2.0561203626369609e+00 -1.5076723430245360e+00 -4.8956084196344953e+00 -1.8484622453158261e+00 -1.3440009379269191e+00 -1.6845455641377929e+00 -2.6925266587238221e+00 1.6268898558875433e+00 1.4145384912945662e+00 2.6938909199939003e+00 1.3925338870695327e+00 1.5679589008730122e+00 3.3137791523026170e+00 -1.3924876343938630e+00 -1.5453236561460579e+00 -3.9831453074826109e+00 -1.7054849357238777e+00 -1.8183646269435150e+00 -3.3552244561331745e+00 1.6250951372585318e+00 1.8578360131942764e+00 3.9835262168832273e+00 1.5677363051463553e+00 2.0561203626369613e+00 5.6013477187521419e+00 -1.7702816773173038e+00 -1.8482199207714503e+00 -5.5616475855922793e+00 2.0613707937685111e+00 1.3728156118790447e+00 1.5814286977583079e+00 -2.4461450897554684e+00 -1.1984330260248677e+00 -1.6845455641377924e+00 -3.2915102468548509e+00 -1.4816273124917114e+00 -1.5452893068368345e+00 2.9034629433125358e+00 1.0709915152757197e+00 1.6665088301071411e+00 3.3899178883067203e+00 1.5531538811327832e+00 1.6879716578818502e+00 -3.0699743332986444e+00 -1.2939783839847370e+00 -1.9336661673543898e+00 -4.7895208250312189e+00 -1.5076723430245360e+00 -1.7702816773173038e+00 5.2423988695524155e+00 1.4847500572383057e+00 1.9978735298990227e+00 1.1699824370604150e+00 2.0613707937685106e+00 1.4564996686807909e+00 -1.2739543527582202e+00 -1.8055624306518969e+00 -1.3440009379269182e+00 -1.3679848603047040e+00 -2.9685306224531556e+00 -1.3423951696538416e+00 1.1428502824129194e+00 2.6836173148135898e+00 1.5242362556816305e+00 1.5787259992874345e+00 3.0602408304307542e+00 1.5602525650016137e+00 -1.2048776840292030e+00 -2.7828072250315103e+00 -1.6440064382184552e+00 -1.5294918789069465e+00 -4.8956084196344953e+00 -1.8482199207714500e+00 1.4847500572383057e+00 4.6472797587582058e+00 1.6376339772066308e+00 1.4564996686807896e+00 1.5814286977583050e+00 2.6644604820262989e+00 -1.7459678486460355e+00 -1.3105161631825666e+00 -2.6925266587238181e+00 -1.6445553872428447e+00 -1.5365180138262358e+00 -3.2902831012805338e+00 1.7039683567137114e+00 1.4636099561821803e+00 3.9089554892215617e+00 1.7533273993856617e+00 1.5972321341759268e+00 3.3552553988490921e+00 -1.7231688562534886e+00 -1.5844083429984144e+00 -4.0138359804381212e+00 -1.7979768625368171e+00 -1.8484622453158261e+00 -5.5616475855922793e+00 1.9978735298990227e+00 1.6376339772066306e+00 5.6296219559378020e+00 984 985 986 1032 1033 1034 1161 1162 1163 1095 1096 1097 987 988 989 1035 1036 1037 1164 1165 1166 1098 1099 1100 4.8006364913202688e+00 1.3300127831461515e+00 1.4835014128316972e+00 -4.9970385336610033e+00 -1.4726721901325412e+00 -1.7837360500521022e+00 -2.8008217198679239e+00 -1.2550179155359773e+00 -1.3026966776145505e+00 2.5564694588517916e+00 1.0439687551918864e+00 1.3481103191128943e+00 2.8978204503526834e+00 1.4574860844889532e+00 1.5294029875958515e+00 -2.6675391749177773e+00 -1.0874415741111356e+00 -1.4411963417373568e+00 -1.5497958856350253e+00 -1.1086229422187655e+00 -1.1955117472557213e+00 1.7602689135569847e+00 1.0922869991714281e+00 1.3621260971192872e+00 1.3300127831461523e+00 6.5679969927241437e+00 2.7647025439740052e+00 -1.4572342334811168e+00 -6.0685645709956848e+00 -2.5524148267559652e+00 -1.4190483533079601e+00 -4.1397601767428824e+00 -2.2177234883119930e+00 9.8127712362714536e-01 3.7454723557975629e+00 2.3153606639839519e+00 1.4399473162388827e+00 4.3174388231160554e+00 2.3938768744014451e+00 -1.1529521598123471e+00 -3.9968818861303395e+00 -2.6297418524484426e+00 -1.0436635152800178e+00 -3.1374027640880584e+00 -2.2980274403898568e+00 1.3216610388692622e+00 2.7117012263192040e+00 2.2239675255468558e+00 1.4835014128316975e+00 2.7647025439740052e+00 7.1647538871741778e+00 -1.7758561966441084e+00 -2.5693026339929657e+00 -7.1719587129277489e+00 -1.5197843426506481e+00 -2.2981858818056256e+00 -4.3488187406713052e+00 1.2856144742408930e+00 2.3460219230997001e+00 4.9633665924215213e+00 1.5448507964793694e+00 2.4433420286343677e+00 4.5454759818859953e+00 -1.3943944912565951e+00 -2.3858472277136200e+00 -5.1873995076528532e+00 -1.1519799618220423e+00 -2.3521807864991713e+00 -3.5454230795379607e+00 1.5280483088214349e+00 2.0514500343033091e+00 3.5800035793081761e+00 -4.9970385336610033e+00 -1.4572342334811168e+00 -1.7758561966441084e+00 5.4022370595010711e+00 1.5123501868453886e+00 2.0884823009180411e+00 3.1158851575896054e+00 1.4154445035285819e+00 1.6910065334678002e+00 -2.8075764938454544e+00 -1.1924380881863414e+00 -1.7987554874040694e+00 -3.3000710094035273e+00 -1.6307812480343316e+00 -1.7606313419926876e+00 2.9364915855590068e+00 1.2492600059183778e+00 1.7418397165331656e+00 1.7719041595013139e+00 1.3883516138301466e+00 1.5652951750842792e+00 -2.1218319252410138e+00 -1.2849527404207057e+00 -1.7513806999624202e+00 -1.4726721901325415e+00 -6.0685645709956848e+00 -2.5693026339929657e+00 1.5123501868453886e+00 5.7498871602283605e+00 2.3423217934914597e+00 1.4061620511818427e+00 3.7300238425724963e+00 2.1256972565353842e+00 -9.8726847329908862e-01 -3.4351354127347262e+00 -2.1579292021443530e+00 -1.4836845786896271e+00 -3.9340371170772888e+00 -2.0687400559258657e+00 1.2158212885214192e+00 3.6438238583524525e+00 2.2416370976064979e+00 1.0374546886942502e+00 2.7354423978913793e+00 2.0148780378348112e+00 -1.2281629731216439e+00 -2.4214401582369907e+00 -1.9285622934049689e+00 -1.7837360500521022e+00 -2.5524148267559652e+00 -7.1719587129277489e+00 2.0884823009180411e+00 2.3423217934914597e+00 7.2873759021441034e+00 1.6377958299948279e+00 2.0695806716249914e+00 4.4418325944276118e+00 -1.4412171323849017e+00 -2.0643407217707082e+00 -5.1082775797488811e+00 -1.8624553446333443e+00 -2.4153061230734947e+00 -4.6171363365939690e+00 1.7510593491812048e+00 2.3120063192940092e+00 5.2420355273812973e+00 1.3166731185438347e+00 2.2742998748595649e+00 3.6144782822622274e+00 -1.7066020715675603e+00 -1.9661469876698583e+00 -3.6883496769446396e+00 -2.8008217198679244e+00 -1.4190483533079603e+00 -1.5197843426506481e+00 3.1158851575896054e+00 1.4061620511818427e+00 1.6377958299948279e+00 5.1262530483291044e+00 1.6298040250303825e+00 1.6627760567415224e+00 -4.7509908681086426e+00 -1.2577939279009576e+00 -1.5864039648970838e+00 -2.1097602156267832e+00 -1.5073508726406377e+00 -1.4841007418187591e+00 1.7792781665826367e+00 1.2145199483919309e+00 1.6182678960103039e+00 2.7272737669656162e+00 1.2922170713677616e+00 1.3499904918980090e+00 -3.0871173358636099e+00 -1.3585099421223623e+00 -1.6785412252781711e+00 -1.2550179155359773e+00 -4.1397601767428824e+00 -2.2981858818056260e+00 1.4154445035285821e+00 3.7300238425724963e+00 2.0695806716249914e+00 1.6298040250303827e+00 6.2125103782266988e+00 2.3097144450714917e+00 -1.2787154649621495e+00 -5.8143472820387663e+00 -2.3637821041342448e+00 -1.5140479398974194e+00 -3.0900342947319821e+00 -2.0450138916600462e+00 1.1474601887131743e+00 2.7368314291513891e+00 2.3063033129139621e+00 1.3089823109079066e+00 4.0992504558040821e+00 2.2120214809313987e+00 -1.4539097077844991e+00 -3.7344743522410369e+00 -2.1906380329419273e+00 -1.3026966776145505e+00 -2.2177234883119930e+00 -4.3488187406713052e+00 1.6910065334678004e+00 2.1256972565353842e+00 4.4418325944276118e+00 1.6627760567415224e+00 2.3097144450714913e+00 6.3178571778542825e+00 -1.6774972685375835e+00 -2.4607564280715222e+00 -6.8586273733104131e+00 -1.5142411909908464e+00 -2.0773413815939312e+00 -3.0524922873487288e+00 1.3304614277550837e+00 2.0013826445976024e+00 3.5421020171499555e+00 1.4087688542611669e+00 2.2746448096679743e+00 4.3252528953439819e+00 -1.5985777350825925e+00 -1.9556178578950063e+00 -4.3671062834453869e+00 2.5564694588517916e+00 9.8127712362714536e-01 1.2856144742408930e+00 -2.8075764938454539e+00 -9.8726847329908840e-01 -1.4412171323849017e+00 -4.7509908681086435e+00 -1.2787154649621497e+00 -1.6774972685375835e+00 4.6410779048185065e+00 9.8049144096836582e-01 1.4816871711341204e+00 1.7225167233556955e+00 1.0982381073626093e+00 1.2589188227597583e+00 -1.5692357766592941e+00 -8.7975532742188856e-01 -1.2827156802825126e+00 -2.5103377728786684e+00 -1.0219236588310039e+00 -1.2076553724768346e+00 2.7180768244660651e+00 1.1076562525560103e+00 1.5828649855470602e+00 1.0439687551918864e+00 3.7454723557975629e+00 2.3460219230997001e+00 -1.1924380881863414e+00 -3.4351354127347258e+00 -2.0643407217707082e+00 -1.2577939279009576e+00 -5.8143472820387663e+00 -2.4607564280715226e+00 9.8049144096836560e-01 5.6410715941574638e+00 2.4218287748288683e+00 1.1984729232250293e+00 2.6804164453516863e+00 1.9339363656018440e+00 -9.0547469197229924e-01 -2.4683484836550442e+00 -2.1104788607549039e+00 -9.1792674246442130e-01 -3.7820744472919605e+00 -2.1521214649691811e+00 1.0507003311387382e+00 3.4329452304137855e+00 2.0859104120359016e+00 1.3481103191128943e+00 2.3153606639839515e+00 4.9633665924215205e+00 -1.7987554874040694e+00 -2.1579292021443530e+00 -5.1082775797488811e+00 -1.5864039648970840e+00 -2.3637821041342448e+00 -6.8586273733104131e+00 1.4816871711341206e+00 2.4218287748288687e+00 7.7091431184422383e+00 1.6914886336940864e+00 2.3916721668355350e+00 3.5454518480984674e+00 -1.3925488917406121e+00 -2.2262581688213015e+00 -4.2582272238065322e+00 -1.2886632103642441e+00 -2.5235554007219063e+00 -4.9669956357736842e+00 1.5450854304649082e+00 2.1426632701734496e+00 4.9741662536772830e+00 2.8978204503526834e+00 1.4399473162388825e+00 1.5448507964793692e+00 -3.3000710094035277e+00 -1.4836845786896271e+00 -1.8624553446333445e+00 -2.1097602156267832e+00 -1.5140479398974194e+00 -1.5142411909908464e+00 1.7225167233556957e+00 1.1984729232250293e+00 1.6914886336940864e+00 5.5654768450854784e+00 1.9257134754447369e+00 1.9150198608328584e+00 -5.1082776562259671e+00 -1.5414037655746737e+00 -1.9021363409129282e+00 -2.8577465306109495e+00 -1.5533733395658360e+00 -1.6412528489225424e+00 3.1900413930733675e+00 1.5283759088189077e+00 1.7687264344533471e+00 1.4574860844889534e+00 4.3174388231160554e+00 2.4433420286343681e+00 -1.6307812480343309e+00 -3.9340371170772888e+00 -2.4153061230734942e+00 -1.5073508726406377e+00 -3.0900342947319817e+00 -2.0773413815939312e+00 1.0982381073626095e+00 2.6804164453516859e+00 2.3916721668355350e+00 1.9257134754447371e+00 6.8197309997223501e+00 2.6395846501976794e+00 -1.5343861435111839e+00 -6.3355621282139030e+00 -2.7629474243564074e+00 -1.3071166598601180e+00 -4.3707823494104447e+00 -2.4675837927930178e+00 1.4981972567499711e+00 3.9128296212435245e+00 2.2485798761492690e+00 1.5294029875958515e+00 2.3938768744014447e+00 4.5454759818859944e+00 -1.7606313419926878e+00 -2.0687400559258657e+00 -4.6171363365939690e+00 -1.4841007418187593e+00 -2.0450138916600458e+00 -3.0524922873487279e+00 1.2589188227597583e+00 1.9339363656018440e+00 3.5454518480984674e+00 1.9150198608328584e+00 2.6395846501976790e+00 6.7990695891659332e+00 -1.8706582614543963e+00 -2.7291941672728037e+00 -7.2934651614143657e+00 -1.3170633002760361e+00 -2.3639915976047710e+00 -4.4882640802183538e+00 1.7291119743534111e+00 2.2395418222625176e+00 4.5613604464250228e+00 -2.6675391749177773e+00 -1.1529521598123471e+00 -1.3943944912565955e+00 2.9364915855590068e+00 1.2158212885214195e+00 1.7510593491812048e+00 1.7792781665826367e+00 1.1474601887131743e+00 1.3304614277550837e+00 -1.5692357766592941e+00 -9.0547469197229913e-01 -1.3925488917406121e+00 -5.1082776562259671e+00 -1.5343861435111836e+00 -1.8706582614543963e+00 4.8865253003856965e+00 1.2230391938180682e+00 1.7425290296262776e+00 2.6351808963557790e+00 1.1393113361806742e+00 1.4158853152596667e+00 -2.8924233410800797e+00 -1.1328190119375061e+00 -1.5823334773706286e+00 -1.0874415741111358e+00 -3.9968818861303390e+00 -2.3858472277136200e+00 1.2492600059183778e+00 3.6438238583524525e+00 2.3120063192940097e+00 1.2145199483919309e+00 2.7368314291513891e+00 2.0013826445976028e+00 -8.7975532742188856e-01 -2.4683484836550442e+00 -2.2262581688213006e+00 -1.5414037655746737e+00 -6.3355621282139030e+00 -2.7291941672728037e+00 1.2230391938180685e+00 6.0491115143047809e+00 2.7622006038663236e+00 1.0866518784278381e+00 3.9901677462817973e+00 2.5040197253437744e+00 -1.2648703594485169e+00 -3.6191420500911335e+00 -2.2383097292939849e+00 -1.4411963417373568e+00 -2.6297418524484426e+00 -5.1873995076528532e+00 1.7418397165331652e+00 2.2416370976064979e+00 5.2420355273812973e+00 1.6182678960103039e+00 2.3063033129139625e+00 3.5421020171499555e+00 -1.2827156802825126e+00 -2.1104788607549039e+00 -4.2582272238065313e+00 -1.9021363409129282e+00 -2.7629474243564065e+00 -7.2934651614143657e+00 1.7425290296262776e+00 2.7622006038663240e+00 8.0661837279706887e+00 1.3432834827785245e+00 2.4878904662209957e+00 5.1000438831133863e+00 -1.8198717620154736e+00 -2.2948633430480254e+00 -5.2112732627415781e+00 -1.5497958856350253e+00 -1.0436635152800180e+00 -1.1519799618220425e+00 1.7719041595013141e+00 1.0374546886942502e+00 1.3166731185438347e+00 2.7272737669656166e+00 1.3089823109079066e+00 1.4087688542611669e+00 -2.5103377728786684e+00 -9.1792674246442130e-01 -1.2886632103642437e+00 -2.8577465306109495e+00 -1.3071166598601183e+00 -1.3170633002760361e+00 2.6351808963557781e+00 1.0866518784278378e+00 1.3432834827785245e+00 4.6180723965593939e+00 1.2596513680291683e+00 1.3712172965454057e+00 -4.8345510302574581e+00 -1.4240333284546056e+00 -1.6822362796666095e+00 -1.1086229422187652e+00 -3.1374027640880584e+00 -2.3521807864991713e+00 1.3883516138301466e+00 2.7354423978913798e+00 2.2742998748595649e+00 1.2922170713677614e+00 4.0992504558040821e+00 2.2746448096679743e+00 -1.0219236588310041e+00 -3.7820744472919605e+00 -2.5235554007219063e+00 -1.5533733395658358e+00 -4.3707823494104447e+00 -2.3639915976047710e+00 1.1393113361806739e+00 3.9901677462817977e+00 2.4878904662209953e+00 1.2596513680291681e+00 6.5094007192713867e+00 2.7449039541417797e+00 -1.3956114487921449e+00 -6.0440017584581796e+00 -2.5420113200644665e+00 -1.1955117472557213e+00 -2.2980274403898564e+00 -3.5454230795379607e+00 1.5652951750842792e+00 2.0148780378348112e+00 3.6144782822622274e+00 1.3499904918980090e+00 2.2120214809313992e+00 4.3252528953439828e+00 -1.2076553724768346e+00 -2.1521214649691811e+00 -4.9669956357736842e+00 -1.6412528489225424e+00 -2.4675837927930178e+00 -4.4882640802183538e+00 1.4158853152596667e+00 2.5040197253437739e+00 5.1000438831133863e+00 1.3712172965454057e+00 2.7449039541417797e+00 6.9760064555772674e+00 -1.6579683101322618e+00 -2.5580905000997083e+00 -7.0150987207668667e+00 1.7602689135569851e+00 1.3216610388692622e+00 1.5280483088214352e+00 -2.1218319252410143e+00 -1.2281629731216439e+00 -1.7066020715675603e+00 -3.0871173358636099e+00 -1.4539097077844991e+00 -1.5985777350825927e+00 2.7180768244660651e+00 1.0507003311387382e+00 1.5450854304649082e+00 3.1900413930733675e+00 1.4981972567499708e+00 1.7291119743534114e+00 -2.8924233410800797e+00 -1.2648703594485167e+00 -1.8198717620154736e+00 -4.8345510302574581e+00 -1.3956114487921449e+00 -1.6579683101322622e+00 5.2675365013457442e+00 1.4719958623888334e+00 1.9807741651581350e+00 1.0922869991714281e+00 2.7117012263192040e+00 2.0514500343033091e+00 -1.2849527404207057e+00 -2.4214401582369911e+00 -1.9661469876698583e+00 -1.3585099421223623e+00 -3.7344743522410369e+00 -1.9556178578950068e+00 1.1076562525560103e+00 3.4329452304137855e+00 2.1426632701734500e+00 1.5283759088189079e+00 3.9128296212435254e+00 2.2395418222625176e+00 -1.1328190119375063e+00 -3.6191420500911335e+00 -2.2948633430480254e+00 -1.4240333284546056e+00 -6.0440017584581796e+00 -2.5580905000997074e+00 1.4719958623888336e+00 5.7615822410508271e+00 2.3410635619733213e+00 1.3621260971192872e+00 2.2239675255468558e+00 3.5800035793081757e+00 -1.7513806999624204e+00 -1.9285622934049689e+00 -3.6883496769446400e+00 -1.6785412252781711e+00 -2.1906380329419268e+00 -4.3671062834453860e+00 1.5828649855470602e+00 2.0859104120359016e+00 4.9741662536772822e+00 1.7687264344533471e+00 2.2485798761492690e+00 4.5613604464250219e+00 -1.5823334773706286e+00 -2.2383097292939849e+00 -5.2112732627415772e+00 -1.6822362796666097e+00 -2.5420113200644670e+00 -7.0150987207668667e+00 1.9807741651581345e+00 2.3410635619733213e+00 7.1662976644879883e+00 1032 1033 1034 1080 1081 1082 1173 1174 1175 1161 1162 1163 1035 1036 1037 1083 1084 1085 1176 1177 1178 1164 1165 1166 4.5108103034671592e+00 1.2525702232845422e+00 1.3895242463869417e+00 -4.7046363921266412e+00 -1.3986802565594276e+00 -1.6893525030267680e+00 -2.6872185768839261e+00 -1.1977776366581594e+00 -1.2301366756124215e+00 2.4406064101838836e+00 9.8288738308738721e-01 1.2693873419911545e+00 2.7063448785240718e+00 1.3874518139879681e+00 1.4431885417947623e+00 -2.4726145069451384e+00 -1.0127326103724543e+00 -1.3531486154012944e+00 -1.4635998510598414e+00 -1.0463140824428487e+00 -1.1190741732582632e+00 1.6703077348404325e+00 1.0325951656729941e+00 1.2896118371258876e+00 1.2525702232845426e+00 6.2327821115747133e+00 2.6393646505267521e+00 -1.3894244693356059e+00 -5.7236524150096084e+00 -2.4227704004802018e+00 -1.3641919349748743e+00 -3.9922179329586678e+00 -2.1149798352687923e+00 9.2359000740713837e-01 3.5857975111034119e+00 2.2098233904776867e+00 1.3786778873411956e+00 4.0828864140820489e+00 2.2753844877305860e+00 -1.0819941516508487e+00 -3.7508886900315637e+00 -2.5166002868981989e+00 -9.8692796321666498e-01 -3.0132514334801614e+00 -2.1959094382722881e+00 1.2677004011451178e+00 2.5785444347198307e+00 2.1256874321844554e+00 1.3895242463869415e+00 2.6393646505267521e+00 6.7730626281332356e+00 -1.6914886218886205e+00 -2.4434524470985948e+00 -6.7753020128682167e+00 -1.4519659919424415e+00 -2.2026050732874372e+00 -4.1521815762321088e+00 1.2162185927380740e+00 2.2500649231894574e+00 4.7632832714463724e+00 1.4696819511179411e+00 2.3273455804959324e+00 4.2573006821838737e+00 -1.3077164442835247e+00 -2.2638858276067446e+00 -4.9030835519479092e+00 -1.0841457846297893e+00 -2.2552754590170587e+00 -3.3750115580581910e+00 1.4598920525014203e+00 1.9484436527976952e+00 3.4119321173429431e+00 -4.7046363921266412e+00 -1.3894244693356059e+00 -1.6914886218886207e+00 5.1248795479806120e+00 1.4409141885893666e+00 2.0042547929686947e+00 3.0110504608961270e+00 1.3620985065181239e+00 1.6263214998205573e+00 -2.6952519699566038e+00 -1.1336917615803745e+00 -1.7323448810928601e+00 -3.1213902364995989e+00 -1.5706448549927732e+00 -1.6828126241724837e+00 2.7421732019256675e+00 1.1824540407709241e+00 1.6684139758370577e+00 1.6866284580335567e+00 1.3357763452011697e+00 1.4973568060270066e+00 -2.0434530702531206e+00 -1.2274819951708333e+00 -1.6897009474993505e+00 -1.3986802565594276e+00 -5.7236524150096084e+00 -2.4434524470985943e+00 1.4409141885893666e+00 5.4085563956596436e+00 2.2115256763753877e+00 1.3534322408383104e+00 3.5748454323734018e+00 2.0287827484870151e+00 -9.3211660224847481e-01 -3.2754988676530878e+00 -2.0544406004730358e+00 -1.4189071244628588e+00 -3.6961919185055052e+00 -1.9500474561861174e+00 1.1431008813628194e+00 3.3973252527512297e+00 2.1237450984805117e+00 9.8390032864646937e-01 2.6042302303110318e+00 1.9128684317594542e+00 -1.1716436561662047e+00 -2.2896141099271081e+00 -1.8289814513446192e+00 -1.6893525030267678e+00 -2.4227704004802018e+00 -6.7753020128682167e+00 2.0042547929686947e+00 2.2115256763753877e+00 6.8938356177696187e+00 1.5685296820892298e+00 1.9658456903232833e+00 4.2438313175427824e+00 -1.3736222683455894e+00 -1.9569135585806592e+00 -4.9099215371733109e+00 -1.7835229777189705e+00 -2.2983820158383201e+00 -4.3296409670002518e+00 1.6636690984069171e+00 2.1862474428485119e+00 4.9564646969586788e+00 1.2487638878925622e+00 2.1727084700446371e+00 3.4419656031525396e+00 -1.6387197122660764e+00 -1.8582613046926417e+00 -3.5212327183818397e+00 -2.6872185768839256e+00 -1.3641919349748743e+00 -1.4519659919424412e+00 3.0110504608961270e+00 1.3534322408383104e+00 1.5685296820892296e+00 5.0491946871731574e+00 1.5842271378485879e+00 1.5991970176837502e+00 -4.6590591590455972e+00 -1.2013361315828543e+00 -1.5138645407716311e+00 -2.0338674137721680e+00 -1.4564700114148692e+00 -1.4167367742662571e+00 1.6888167414898474e+00 1.1550753297124361e+00 1.5538037200426786e+00 2.6476530925567010e+00 1.2360719432437439e+00 1.2789365706483353e+00 -3.0165698324141421e+00 -1.3068085736704824e+00 -1.6178996834836632e+00 -1.1977776366581594e+00 -3.9922179329586682e+00 -2.2026050732874367e+00 1.3620985065181239e+00 3.5748454323734022e+00 1.9658456903232833e+00 1.5842271378485879e+00 6.0961524925131894e+00 2.2157758588772274e+00 -1.2292069695754022e+00 -5.6806960343493023e+00 -2.2613075833477252e+00 -1.4654371631652254e+00 -2.9705696256098455e+00 -1.9465499390444516e+00 1.0867767062188929e+00 2.6031135282730711e+00 2.2111093295983140e+00 1.2632264181092996e+00 3.9837557964362080e+00 2.1144412562850632e+00 -1.4039069992961173e+00 -3.6143836566780561e+00 -2.0967095394042716e+00 -1.2301366756124215e+00 -2.1149798352687927e+00 -4.1521815762321088e+00 1.6263214998205571e+00 2.0287827484870151e+00 4.2438313175427833e+00 1.5991970176837498e+00 2.2157758588772274e+00 6.1519269723850352e+00 -1.6253138528241182e+00 -2.3758539330170270e+00 -6.6835488209937886e+00 -1.4464291008388006e+00 -1.9751888058881624e+00 -2.8845672299280167e+00 1.2596730566798917e+00 1.8988619172555519e+00 3.3720638666185190e+00 1.3512961458687378e+00 2.1810684906749973e+00 4.1623522102957695e+00 -1.5346080907775965e+00 -1.8584664411208125e+00 -4.2098767396881893e+00 2.4406064101838831e+00 9.2359000740713837e-01 1.2162185927380740e+00 -2.6952519699566042e+00 -9.3211660224847481e-01 -1.3736222683455894e+00 -4.6590591590455972e+00 -1.2292069695754027e+00 -1.6253138528241182e+00 4.5535447018374784e+00 9.2576709942311075e-01 1.4134041577431438e+00 1.6356128887488797e+00 1.0421478342045882e+00 1.1936541526808009e+00 -1.4819133089842418e+00 -8.2126841426974106e-01 -1.2127852223430382e+00 -2.4306858741798338e+00 -9.6538513355989253e-01 -1.1396669832836062e+00 2.6371463113960361e+00 1.0564721786186753e+00 1.5281114236343329e+00 9.8288738308738721e-01 3.5857975111034119e+00 2.2500649231894574e+00 -1.1336917615803743e+00 -3.2754988676530878e+00 -1.9569135585806594e+00 -1.2013361315828541e+00 -5.6806960343493023e+00 -2.3758539330170265e+00 9.2576709942311064e-01 5.5078090834148004e+00 2.3219563053551897e+00 1.1418268121474582e+00 2.5479260807532871e+00 1.8337903885871494e+00 -8.4355388892426242e-01 -2.3332743317547786e+00 -2.0068964462451833e+00 -8.6403613700723902e-01 -3.6578501869572868e+00 -2.0561640834883614e+00 9.9213662443677442e-01 3.3057867454429593e+00 1.9900164041994337e+00 1.2693873419911548e+00 2.2098233904776867e+00 4.7632832714463724e+00 -1.7323448810928601e+00 -2.0544406004730358e+00 -4.9099215371733100e+00 -1.5138645407716311e+00 -2.2613075833477252e+00 -6.6835488209937877e+00 1.4134041577431438e+00 2.3219563053551893e+00 7.5449836905335168e+00 1.6258278346033630e+00 2.2913797739711628e+00 3.3683443693741606e+00 -1.3151553832555263e+00 -2.1189040777382688e+00 -4.0939971697060384e+00 -1.2203542636717508e+00 -2.4263877107695104e+00 -4.8043783653068104e+00 1.4730997344541077e+00 2.0378805025245064e+00 4.8152345618258972e+00 2.7063448785240718e+00 1.3786778873411953e+00 1.4696819511179409e+00 -3.1213902364995989e+00 -1.4189071244628590e+00 -1.7835229777189707e+00 -2.0338674137721680e+00 -1.4654371631652254e+00 -1.4464291008388006e+00 1.6356128887488797e+00 1.1418268121474582e+00 1.6258278346033630e+00 5.1900051924734472e+00 1.8494504270944228e+00 1.8153399412785149e+00 -4.7124917374840685e+00 -1.4570994147143435e+00 -1.8114576163497706e+00 -2.7049118607182190e+00 -1.4955563019081088e+00 -1.5653758079299738e+00 3.0406982887276572e+00 1.4670448776674625e+00 1.6959357758376961e+00 1.3874518139879681e+00 4.0828864140820489e+00 2.3273455804959324e+00 -1.5706448549927732e+00 -3.6961919185055052e+00 -2.2983820158383201e+00 -1.4564700114148692e+00 -2.9705696256098451e+00 -1.9751888058881624e+00 1.0421478342045882e+00 2.5479260807532871e+00 2.2913797739711628e+00 1.8494504270944223e+00 6.3776730726284834e+00 2.4915431233402998e+00 -1.4443501636411178e+00 -5.8741564169903544e+00 -2.6236154935221365e+00 -1.2450553151437727e+00 -4.1729655055332868e+00 -2.3515632928132399e+00 1.4374702699055544e+00 3.7053978991751757e+00 2.1384811302544637e+00 1.4431885417947623e+00 2.2753844877305860e+00 4.2573006821838737e+00 -1.6828126241724837e+00 -1.9500474561861174e+00 -4.3296409670002518e+00 -1.4167367742662571e+00 -1.9465499390444518e+00 -2.8845672299280167e+00 1.1936541526808009e+00 1.8337903885871494e+00 3.3683443693741610e+00 1.8153399412785147e+00 2.4915431233402998e+00 6.2937940824507823e+00 -1.7631708988143473e+00 -2.5753853291661839e+00 -6.7794255860783910e+00 -1.2427952941658602e+00 -2.2533564801505839e+00 -4.2368782410526293e+00 1.6533329556648710e+00 2.1246212048893045e+00 4.3110728900504700e+00 -2.4726145069451384e+00 -1.0819941516508487e+00 -1.3077164442835245e+00 2.7421732019256675e+00 1.1431008813628196e+00 1.6636690984069171e+00 1.6888167414898474e+00 1.0867767062188929e+00 1.2596730566798917e+00 -1.4819133089842418e+00 -8.4355388892426242e-01 -1.3151553832555263e+00 -4.7124917374840685e+00 -1.4443501636411173e+00 -1.7631708988143473e+00 4.4906836958964540e+00 1.1322563419817144e+00 1.6341936423046628e+00 2.4772417379967111e+00 1.0699612215928986e+00 1.3310918187278484e+00 -2.7318958238952300e+00 -1.0621969469400985e+00 -1.5025848897659211e+00 -1.0127326103724543e+00 -3.7508886900315637e+00 -2.2638858276067446e+00 1.1824540407709241e+00 3.3973252527512292e+00 2.1862474428485119e+00 1.1550753297124361e+00 2.6031135282730711e+00 1.8988619172555523e+00 -8.2126841426974118e-01 -2.3332743317547786e+00 -2.1189040777382688e+00 -1.4570994147143435e+00 -5.8741564169903553e+00 -2.5753853291661839e+00 1.1322563419817147e+00 5.5847767858060982e+00 2.6094219269201022e+00 1.0205708131735072e+00 3.7787371993513483e+00 2.3874304869998983e+00 -1.1992560862820436e+00 -3.4056333274050523e+00 -2.1237865395128668e+00 -1.3531486154012944e+00 -2.5166002868981989e+00 -4.9030835519479092e+00 1.6684139758370577e+00 2.1237450984805117e+00 4.9564646969586796e+00 1.5538037200426786e+00 2.2111093295983140e+00 3.3720638666185190e+00 -1.2127852223430380e+00 -2.0068964462451833e+00 -4.0939971697060384e+00 -1.8114576163497706e+00 -2.6236154935221365e+00 -6.7794255860783910e+00 1.6341936423046635e+00 2.6094219269201031e+00 7.5639298713823351e+00 1.2668835259432238e+00 2.3783635372596477e+00 4.8518819872946484e+00 -1.7459034100335211e+00 -2.1755276655930604e+00 -4.9678341145218425e+00 -1.4635998510598414e+00 -9.8692796321666498e-01 -1.0841457846297893e+00 1.6866284580335564e+00 9.8390032864646937e-01 1.2487638878925620e+00 2.6476530925567010e+00 1.2632264181092994e+00 1.3512961458687378e+00 -2.4306858741798338e+00 -8.6403613700723891e-01 -1.2203542636717506e+00 -2.7049118607182190e+00 -1.2450553151437727e+00 -1.2427952941658602e+00 2.4772417379967111e+00 1.0205708131735072e+00 1.2668835259432238e+00 4.4647754801479103e+00 1.1972946391784793e+00 1.2953243254944651e+00 -4.6771011827769851e+00 -1.3689727837400798e+00 -1.6149725427315884e+00 -1.0463140824428487e+00 -3.0132514334801619e+00 -2.2552754590170578e+00 1.3357763452011697e+00 2.6042302303110318e+00 2.1727084700446371e+00 1.2360719432437439e+00 3.9837557964362080e+00 2.1810684906749973e+00 -9.6538513355989242e-01 -3.6578501869572868e+00 -2.4263877107695104e+00 -1.4955563019081088e+00 -4.1729655055332868e+00 -2.2533564801505839e+00 1.0699612215928986e+00 3.7787371993513474e+00 2.3783635372596472e+00 1.1972946391784793e+00 6.3120524235866604e+00 2.6357155080621983e+00 -1.3318486313054421e+00 -5.8347085237145162e+00 -2.4328363561043269e+00 -1.1190741732582632e+00 -2.1959094382722881e+00 -3.3750115580581905e+00 1.4973568060270064e+00 1.9128684317594542e+00 3.4419656031525396e+00 1.2789365706483355e+00 2.1144412562850627e+00 4.1623522102957686e+00 -1.1396669832836064e+00 -2.0561640834883614e+00 -4.8043783653068095e+00 -1.5653758079299736e+00 -2.3515632928132404e+00 -4.2368782410526293e+00 1.3310918187278484e+00 2.3874304869998983e+00 4.8518819872946475e+00 1.2953243254944651e+00 2.6357155080621983e+00 6.7267748241269212e+00 -1.5785925564258134e+00 -2.4468188685327279e+00 -6.7667064604522453e+00 1.6703077348404323e+00 1.2677004011451178e+00 1.4598920525014203e+00 -2.0434530702531206e+00 -1.1716436561662047e+00 -1.6387197122660764e+00 -3.0165698324141421e+00 -1.4039069992961175e+00 -1.5346080907775970e+00 2.6371463113960365e+00 9.9213662443677442e-01 1.4730997344541079e+00 3.0406982887276572e+00 1.4374702699055544e+00 1.6533329556648710e+00 -2.7318958238952309e+00 -1.1992560862820436e+00 -1.7459034100335211e+00 -4.6771011827769842e+00 -1.3318486313054427e+00 -1.5785925564258132e+00 5.1208675743753531e+00 1.4093480775623637e+00 1.9114990268826078e+00 1.0325951656729941e+00 2.5785444347198307e+00 1.9484436527976952e+00 -1.2274819951708333e+00 -2.2896141099271081e+00 -1.8582613046926417e+00 -1.3068085736704826e+00 -3.6143836566780561e+00 -1.8584664411208125e+00 1.0564721786186753e+00 3.3057867454429593e+00 2.0378805025245064e+00 1.4670448776674625e+00 3.7053978991751757e+00 2.1246212048893045e+00 -1.0621969469400987e+00 -3.4056333274050523e+00 -2.1755276655930600e+00 -1.3689727837400802e+00 -5.8347085237145162e+00 -2.4468188685327270e+00 1.4093480775623637e+00 5.5546105383867701e+00 2.2281289197277352e+00 1.2896118371258876e+00 2.1256874321844554e+00 3.4119321173429435e+00 -1.6897009474993505e+00 -1.8289814513446192e+00 -3.5212327183818397e+00 -1.6178996834836632e+00 -2.0967095394042716e+00 -4.2098767396881893e+00 1.5281114236343329e+00 1.9900164041994335e+00 4.8152345618258963e+00 1.6959357758376958e+00 2.1384811302544637e+00 4.3110728900504700e+00 -1.5025848897659209e+00 -2.1237865395128668e+00 -4.9678341145218425e+00 -1.6149725427315877e+00 -2.4328363561043265e+00 -6.7667064604522453e+00 1.9114990268826073e+00 2.2281289197277356e+00 6.9274104638248062e+00 987 988 989 1035 1036 1037 1164 1165 1166 1098 1099 1100 990 991 992 1038 1039 1040 1167 1168 1169 1101 1102 1103 4.7363760629425906e+00 8.0639860346294090e-01 8.9946853805089788e-01 -4.8195580253971864e+00 -1.0534870461969474e+00 -1.2610308786485929e+00 -2.5095783744308711e+00 -8.3506282309597646e-01 -8.9054112417759490e-01 2.3567351397685687e+00 6.3884263305600764e-01 8.0484372691756134e-01 2.5280664492606677e+00 1.0033022680429433e+00 1.0839636231896876e+00 -2.4001305641562221e+00 -6.4017505048935130e-01 -8.3747252452358090e-01 -1.2522910016227686e+00 -6.4759291550301945e-01 -7.0138298754367012e-01 1.3603803136352202e+00 7.2777433072340270e-01 9.0215162673529137e-01 8.0639860346294101e-01 7.5022992130279480e+00 3.3213827374244951e+00 -1.0396108881070756e+00 -6.9758875606190767e+00 -3.1482745962048879e+00 -1.0482604037135921e+00 -4.7825469854368245e+00 -2.7449652484562295e+00 5.9381792443522152e-01 4.3702571302389428e+00 2.7827792862851561e+00 9.9383685839167313e-01 4.9113165013197948e+00 2.9104105680397145e+00 -6.8015324103858765e-01 -4.5751087100075614e+00 -3.1116567939140691e+00 -6.0563953491334244e-01 -3.6081894509621981e+00 -2.7232036748438482e+00 9.7961068148276242e-01 3.1578598624389769e+00 2.7135277216696663e+00 8.9946853805089810e-01 3.3213827374244951e+00 8.2114610696148223e+00 -1.2512834504000896e+00 -3.1673049845961359e+00 -8.3237811539236048e+00 -1.1367064976212151e+00 -2.8001146112722841e+00 -5.1526951723983387e+00 7.6031296165771955e-01 2.8243957029146656e+00 5.6982970674590092e+00 1.0873648350077669e+00 2.9407912547106791e+00 5.3437158278447416e+00 -8.1350953580269514e-01 -2.8296094062617012e+00 -5.9129308052254057e+00 -6.6691342938102283e-01 -2.7688399853236754e+00 -4.0997320060916174e+00 1.1212665784886391e+00 2.4792992924039567e+00 4.2356651727203918e+00 -4.8195580253971864e+00 -1.0396108881070756e+00 -1.2512834504000896e+00 5.1408564972543278e+00 1.1951114246958627e+00 1.6467756547376906e+00 2.7578814932731022e+00 1.1102334550726856e+00 1.3459522534765929e+00 -2.5118014459380467e+00 -9.0188373661005383e-01 -1.3065230592076180e+00 -2.8446345611345811e+00 -1.2517820305517862e+00 -1.4112384458829488e+00 2.5550169218164571e+00 8.7682719266987064e-01 1.2173223149600270e+00 1.3756332752255860e+00 1.0145271428242117e+00 1.1392043296508421e+00 -1.6533941550996567e+00 -1.0034225599937159e+00 -1.3802095973344957e+00 -1.0534870461969474e+00 -6.9758875606190767e+00 -3.1673049845961359e+00 1.1951114246958627e+00 6.6305939523424104e+00 2.9658709523186539e+00 1.1068695214955526e+00 4.3558599892424512e+00 2.6622841798692205e+00 -6.7260866234164374e-01 -4.0285565445886595e+00 -2.6441137089224105e+00 -1.1567059890007727e+00 -4.5208215644112739e+00 -2.6108779050351907e+00 8.6298186544744471e-01 4.2040816451501604e+00 2.7579748499026606e+00 6.9285000273875896e-01 3.1921069777566706e+00 2.4575671017932672e+00 -9.7501111683825625e-01 -2.8573768948726790e+00 -2.4214004853300639e+00 -1.2610308786485929e+00 -3.1482745962048866e+00 -8.3237811539236013e+00 1.6467756547376906e+00 2.9658709523186531e+00 8.5590090648473183e+00 1.3206157192527683e+00 2.6170713212024324e+00 5.3469889332901985e+00 -9.6459748661670563e-01 -2.5910145933764657e+00 -5.9482542417699689e+00 -1.4716049518877274e+00 -2.9551846739375032e+00 -5.5283672780290960e+00 1.2186177738514825e+00 2.8000617197218318e+00 6.0888653295846034e+00 8.6372534510591559e-01 2.7533940177092084e+00 4.2655728733506519e+00 -1.3525011757948318e+00 -2.4419241474332698e+00 -4.4600335273501024e+00 -2.5095783744308711e+00 -1.0482604037135921e+00 -1.1367064976212149e+00 2.7578814932731022e+00 1.1068695214955526e+00 1.3206157192527683e+00 4.9271586005414543e+00 1.2723689764865793e+00 1.3459025484345724e+00 -4.6239536096244152e+00 -8.8342721330622265e-01 -1.1256916460400186e+00 -1.6463222247959188e+00 -1.1595034044784602e+00 -1.2061141159309814e+00 1.3841215151965987e+00 8.9095109170191522e-01 1.1977807886326015e+00 2.4232377356941806e+00 8.8885524429267027e-01 9.5359190851556730e-01 -2.7125451358541306e+00 -1.0678538124784425e+00 -1.3493787052432942e+00 -8.3506282309597668e-01 -4.7825469854368245e+00 -2.8001146112722837e+00 1.1102334550726858e+00 4.3558599892424503e+00 2.6170713212024324e+00 1.2723689764865791e+00 7.0769767741187124e+00 2.9053262713106971e+00 -9.1672392319235541e-01 -6.6624197016954882e+00 -2.9173503194518058e+00 -1.1612739193117652e+00 -3.5610050513425504e+00 -2.5576409336725052e+00 7.4954362044365208e-01 3.1930440467101162e+00 2.7722368890469058e+00 9.1774542182806296e-01 4.6684268649469578e+00 2.7000752165704283e+00 -1.1368308082308833e+00 -4.2883359365433744e+00 -2.7196038337338679e+00 -8.9054112417759490e-01 -2.7449652484562295e+00 -5.1526951723983387e+00 1.3459522534765929e+00 2.6622841798692205e+00 5.3469889332901985e+00 1.3459025484345721e+00 2.9053262713106971e+00 7.4188847399316904e+00 -1.1987636937678330e+00 -2.9998856522806565e+00 -7.9157051196075843e+00 -1.2125748276024553e+00 -2.5674576278742958e+00 -3.7655012289694842e+00 8.9754338213085949e-01 2.4466588976795971e+00 4.2233053761591615e+00 1.0009594945466653e+00 2.7389165430606592e+00 5.0603908421057771e+00 -1.2884780330408068e+00 -2.4408773633089931e+00 -5.2156683705114224e+00 2.3567351397685687e+00 5.9381792443522152e-01 7.6031296165771955e-01 -2.5118014459380467e+00 -6.7260866234164374e-01 -9.6459748661670563e-01 -4.6239536096244152e+00 -9.1672392319235541e-01 -1.1987636937678330e+00 4.5936403797234693e+00 6.0652722990386165e-01 8.7222387041749538e-01 1.3385271515832675e+00 7.0704423375954140e-01 8.4750610497597789e-01 -1.2631725248338774e+00 -5.1860316933348916e-01 -7.3961892011993491e-01 -2.3027605638572211e+00 -5.9067430994147874e-01 -6.9158389807212539e-01 2.4127854731782539e+00 7.9122067671034224e-01 1.1145210615254060e+00 6.3884263305600775e-01 4.3702571302389428e+00 2.8243957029146660e+00 -9.0188373661005383e-01 -4.0285565445886595e+00 -2.5910145933764657e+00 -8.8342721330622265e-01 -6.6624197016954900e+00 -2.9998856522806570e+00 6.0652722990386176e-01 6.4510013614272701e+00 2.9399376827961738e+00 8.8405437751459659e-01 3.1435305139659100e+00 2.4059693721325099e+00 -5.5057419621897008e-01 -2.9006365224269031e+00 -2.5557460090727635e+00 -5.3991771042189107e-01 -4.3361479374249177e+00 -2.5863012015449507e+00 7.4637861608267253e-01 3.9629717005038474e+00 2.5626446984314870e+00 8.0484372691756145e-01 2.7827792862851561e+00 5.6982970674590101e+00 -1.3065230592076178e+00 -2.6441137089224105e+00 -5.9482542417699689e+00 -1.1256916460400186e+00 -2.9173503194518058e+00 -7.9157051196075834e+00 8.7222387041749549e-01 2.9399376827961738e+00 8.6545139012983583e+00 1.2252035232577165e+00 2.8149727230784043e+00 4.2160890078668842e+00 -8.0621701055945327e-01 -2.6245983573598384e+00 -4.8371700617997488e+00 -7.3110113433368451e-01 -2.9472984307777050e+00 -5.6129914052740482e+00 1.0672617295480016e+00 2.5956711243520258e+00 5.7452208518270940e+00 2.5280664492606677e+00 9.9383685839167324e-01 1.0873648350077667e+00 -2.8446345611345811e+00 -1.1567059890007727e+00 -1.4716049518877277e+00 -1.6463222247959188e+00 -1.1612739193117654e+00 -1.2125748276024553e+00 1.3385271515832675e+00 8.8405437751459648e-01 1.2252035232577165e+00 5.1455657699245734e+00 1.4370719386793456e+00 1.5064133051178135e+00 -4.7749651353644751e+00 -1.0502283755510498e+00 -1.3269865553579285e+00 -2.4821871880732882e+00 -1.1049920571347338e+00 -1.1879245613930811e+00 2.7359497385997544e+00 1.1582371664127060e+00 1.3801092328578954e+00 1.0033022680429433e+00 4.9113165013197948e+00 2.9407912547106791e+00 -1.2517820305517862e+00 -4.5208215644112739e+00 -2.9551846739375036e+00 -1.1595034044784602e+00 -3.5610050513425504e+00 -2.5674576278742958e+00 7.0704423375954151e-01 3.1435305139659100e+00 2.8149727230784043e+00 1.4370719386793456e+00 7.5484367463979209e+00 3.2278188445558333e+00 -1.0423465880352321e+00 -7.0529202978938335e+00 -3.2880965112069918e+00 -8.3531212454238146e-01 -4.8940001626702596e+00 -2.9120989309246323e+00 1.1415257071260303e+00 4.4254633146342908e+00 2.7392549215985058e+00 1.0839636231896876e+00 2.9104105680397145e+00 5.3437158278447408e+00 -1.4112384458829488e+00 -2.6108779050351907e+00 -5.5283672780290960e+00 -1.2061141159309812e+00 -2.5576409336725052e+00 -3.7655012289694838e+00 8.4750610497597800e-01 2.4059693721325095e+00 4.2160890078668842e+00 1.5064133051178135e+00 3.2278188445558333e+00 7.8650834837776324e+00 -1.3081160499564746e+00 -3.2647485711891484e+00 -8.3163184362690252e+00 -8.7643999627888802e-01 -2.8544807471723690e+00 -5.2129232922061091e+00 1.3640255747658141e+00 2.7435493723411564e+00 5.3982219159844540e+00 -2.4001305641562221e+00 -6.8015324103858754e-01 -8.1350953580269514e-01 2.5550169218164571e+00 8.6298186544744460e-01 1.2186177738514825e+00 1.3841215151965987e+00 7.4954362044365219e-01 8.9754338213085949e-01 -1.2631725248338774e+00 -5.5057419621897008e-01 -8.0621701055945350e-01 -4.7749651353644751e+00 -1.0423465880352321e+00 -1.3081160499564743e+00 4.6531226959237362e+00 7.3397920941740424e-01 1.0253736586455802e+00 2.3515820872968054e+00 6.7324087158752366e-01 8.2878775766055834e-01 -2.5055749958790230e+00 -7.4667154160323479e-01 -1.0424799759698573e+00 -6.4017505048935130e-01 -4.5751087100075614e+00 -2.8296094062617012e+00 8.7682719266987053e-01 4.2040816451501604e+00 2.8000617197218318e+00 8.9095109170191522e-01 3.1930440467101162e+00 2.4466588976795971e+00 -5.1860316933348916e-01 -2.9006365224269031e+00 -2.6245983573598384e+00 -1.0502283755510495e+00 -7.0529202978938317e+00 -3.2647485711891484e+00 7.3397920941740413e-01 6.7414088661552052e+00 3.2540396377801910e+00 6.3410939590957216e-01 4.5002349748723498e+00 2.9230814938052121e+00 -9.2686029432487282e-01 -4.1101040025595346e+00 -2.7048854141761440e+00 -8.3747252452358079e-01 -3.1116567939140691e+00 -5.9129308052254057e+00 1.2173223149600270e+00 2.7579748499026606e+00 6.0888653295846034e+00 1.1977807886326013e+00 2.7722368890469054e+00 4.2233053761591615e+00 -7.3961892011993502e-01 -2.5557460090727639e+00 -4.8371700617997488e+00 -1.3269865553579283e+00 -3.2880965112069918e+00 -8.3163184362690270e+00 1.0253736586455802e+00 3.2540396377801919e+00 8.9877011622144334e+00 7.7947658122334984e-01 2.9156556030270142e+00 5.7565816228101037e+00 -1.3158753434601145e+00 -2.7444076655629486e+00 -5.9900341874741203e+00 -1.2522910016227686e+00 -6.0563953491334244e-01 -6.6691342938102283e-01 1.3756332752255862e+00 6.9285000273875907e-01 8.6372534510591581e-01 2.4232377356941810e+00 9.1774542182806307e-01 1.0009594945466653e+00 -2.3027605638572211e+00 -5.3991771042189107e-01 -7.3110113433368440e-01 -2.4821871880732882e+00 -8.3531212454238146e-01 -8.7643999627888802e-01 2.3515820872968050e+00 6.3410939590957216e-01 7.7947658122334984e-01 4.4705480289137025e+00 7.3079661202148360e-01 8.0076777370330410e-01 -4.5837623735769979e+00 -9.9463206262026294e-01 -1.1704746345856396e+00 -6.4759291550301945e-01 -3.6081894509621981e+00 -2.7688399853236758e+00 1.0145271428242117e+00 3.1921069777566706e+00 2.7533940177092084e+00 8.8885524429267027e-01 4.6684268649469569e+00 2.7389165430606592e+00 -5.9067430994147863e-01 -4.3361479374249177e+00 -2.9472984307777046e+00 -1.1049920571347338e+00 -4.8940001626702596e+00 -2.8544807471723690e+00 6.7324087158752377e-01 4.5002349748723498e+00 2.9156556030270142e+00 7.3079661202148360e-01 7.2138196417429787e+00 3.2040859001983670e+00 -9.6416058814665817e-01 -6.7362509082615825e+00 -3.0414329007214991e+00 -7.0138298754367012e-01 -2.7232036748438482e+00 -4.0997320060916174e+00 1.1392043296508421e+00 2.4575671017932672e+00 4.2655728733506519e+00 9.5359190851556708e-01 2.7000752165704283e+00 5.0603908421057771e+00 -6.9158389807212561e-01 -2.5863012015449502e+00 -5.6129914052740482e+00 -1.1879245613930811e+00 -2.9120989309246323e+00 -5.2129232922061091e+00 8.2878775766055834e-01 2.9230814938052121e+00 5.7565816228101037e+00 8.0076777370330410e-01 3.2040859001983670e+00 7.7936413232391155e+00 -1.1414603225213957e+00 -3.0632059050538452e+00 -7.9505399579338718e+00 1.3603803136352202e+00 9.7961068148276254e-01 1.1212665784886391e+00 -1.6533941550996565e+00 -9.7501111683825625e-01 -1.3525011757948318e+00 -2.7125451358541302e+00 -1.1368308082308833e+00 -1.2884780330408068e+00 2.4127854731782539e+00 7.4637861608267253e-01 1.0672617295480016e+00 2.7359497385997540e+00 1.1415257071260301e+00 1.3640255747658141e+00 -2.5055749958790230e+00 -9.2686029432487282e-01 -1.3158753434601147e+00 -4.5837623735769970e+00 -9.6416058814665795e-01 -1.1414603225213955e+00 4.9461611349965784e+00 1.1353478028492052e+00 1.5457609920146940e+00 7.2777433072340270e-01 3.1578598624389769e+00 2.4792992924039563e+00 -1.0034225599937159e+00 -2.8573768948726790e+00 -2.4419241474332689e+00 -1.0678538124784425e+00 -4.2883359365433744e+00 -2.4408773633089935e+00 7.9122067671034202e-01 3.9629717005038465e+00 2.5956711243520258e+00 1.1582371664127060e+00 4.4254633146342908e+00 2.7435493723411568e+00 -7.4667154160323479e-01 -4.1101040025595346e+00 -2.7444076655629486e+00 -9.9463206262026282e-01 -6.7362509082615825e+00 -3.0632059050538452e+00 1.1353478028492057e+00 6.4457728646600554e+00 2.8718952922619159e+00 9.0215162673529137e-01 2.7135277216696658e+00 4.2356651727203918e+00 -1.3802095973344957e+00 -2.4214004853300639e+00 -4.4600335273501015e+00 -1.3493787052432942e+00 -2.7196038337338679e+00 -5.2156683705114215e+00 1.1145210615254062e+00 2.5626446984314870e+00 5.7452208518270931e+00 1.3801092328578954e+00 2.7392549215985058e+00 5.3982219159844531e+00 -1.0424799759698573e+00 -2.7048854141761440e+00 -5.9900341874741203e+00 -1.1704746345856398e+00 -3.0414329007214977e+00 -7.9505399579338718e+00 1.5457609920146940e+00 2.8718952922619150e+00 8.2371681027375772e+00 1035 1036 1037 1083 1084 1085 1176 1177 1178 1164 1165 1166 1038 1039 1040 1086 1087 1088 1179 1180 1181 1167 1168 1169 4.3427365120065113e+00 7.4594051765768610e-01 8.2633668898091794e-01 -4.4183229803340112e+00 -9.9224455653886678e-01 -1.1843845042464816e+00 -2.3684576415398459e+00 -7.9178726805792965e-01 -8.3547675649561470e-01 2.2161825582950616e+00 5.9216119746280638e-01 7.4721276423122340e-01 2.3456817645910912e+00 9.5273505534485636e-01 1.0218078649648934e+00 -2.2190797831815994e+00 -5.9025456546927857e-01 -7.7637932951650213e-01 -1.1898318651628750e+00 -6.0392778163014593e-01 -6.4923635265356794e-01 1.2910914353256677e+00 6.8737740123087199e-01 8.5011962473513158e-01 7.4594051765768621e-01 7.0021769717008624e+00 3.1552467949203185e+00 -9.9423435091541312e-01 -6.4596575978860553e+00 -2.9829820698502645e+00 -1.0087932909765687e+00 -4.5663897111069103e+00 -2.6157390349639966e+00 5.5394757980966292e-01 4.1418229623126885e+00 2.6596971168881711e+00 9.5574243424404703e-01 4.6424358683476994e+00 2.7724187762381898e+00 -6.2910131081607279e-01 -4.2994735898010985e+00 -2.9789803514471838e+00 -5.6689126020149783e-01 -3.4716978447655733e+00 -2.6077740891796166e+00 9.4338968119815814e-01 3.0107829411983840e+00 2.5981128573943808e+00 8.2633668898091794e-01 3.1552467949203185e+00 7.6314288087538316e+00 -1.1902272358712280e+00 -2.9922931239803034e+00 -7.7368521557053631e+00 -1.0871128189705348e+00 -2.6797925963787677e+00 -4.8721853021076873e+00 7.0944334433226008e-01 2.6969401740785215e+00 5.4176121037759382e+00 1.0386832975978029e+00 2.8017529661846359e+00 5.0090961704555124e+00 -7.4985961753160424e-01 -2.6871639520595241e+00 -5.5812353685882687e+00 -6.2030736334967607e-01 -2.6543477063959489e+00 -3.9072176778375716e+00 1.0730437048120640e+00 2.3596574436310656e+00 4.0393534212536082e+00 -4.4183229803340112e+00 -9.9423435091541312e-01 -1.1902272358712280e+00 4.7515678042447975e+00 1.1406388260235605e+00 1.5843541905194982e+00 2.6228868665047131e+00 1.0748943422784327e+00 1.2999650860580745e+00 -2.3706748619101514e+00 -8.6121282985969139e-01 -1.2621064914560791e+00 -2.6717219177654123e+00 -1.2111175419386908e+00 -1.3582239662863924e+00 2.3693463695523662e+00 8.3560851890963661e-01 1.1701119500277033e+00 1.3101976951408625e+00 9.8155240733155835e-01 1.0956157526415604e+00 -1.5932789754331658e+00 -9.6612937182939262e-01 -1.3394892856331371e+00 -9.9224455653886678e-01 -6.4596575978860571e+00 -2.9922931239803043e+00 1.1406388260235605e+00 6.1129278203057575e+00 2.7898351423026608e+00 1.0662142839499016e+00 4.1267423946126032e+00 2.5317638664462376e+00 -6.3272290343536175e-01 -3.7945547304516305e+00 -2.5152603085881067e+00 -1.1147768950610331e+00 -4.2414700848720672e+00 -2.4659905185476161e+00 8.1092524246094833e-01 3.9199795233578500e+00 2.6140700748402566e+00 6.5773446053507834e-01 3.0419555765031148e+00 2.3372437299872786e+00 -9.3576845793422891e-01 -2.7059229015695729e+00 -2.2993688624604069e+00 -1.1843845042464820e+00 -2.9829820698502645e+00 -7.7368521557053631e+00 1.5843541905194982e+00 2.7898351423026599e+00 7.9739591838158255e+00 1.2707056417654861e+00 2.4917637278984475e+00 5.0638857623635722e+00 -9.1548770535579838e-01 -2.4550122458948143e+00 -5.6684496008541760e+00 -1.4224760725222958e+00 -2.8162454338400011e+00 -5.1917762376062910e+00 1.1559194607728269e+00 2.6547494736974970e+00 5.7539172259816933e+00 8.1878802660976224e-01 2.6349738325893459e+00 4.0698176439335469e+00 -1.3074190375429995e+00 -2.3170824269028700e+00 -4.2645018219288078e+00 -2.3684576415398468e+00 -1.0087932909765687e+00 -1.0871128189705346e+00 2.6228868665047131e+00 1.0662142839499016e+00 1.2707056417654863e+00 4.8012960080735620e+00 1.2385100889014353e+00 1.2977792056627035e+00 -4.4872945713349965e+00 -8.3795739749660669e-01 -1.0719745023227640e+00 -1.5883902596937438e+00 -1.1238555801440671e+00 -1.1589532549616746e+00 1.3146966205853279e+00 8.5042892517675583e-01 1.1526414461735333e+00 2.3728971183590315e+00 8.4779627602495378e-01 9.0316897759773951e-01 -2.6676341409540489e+00 -1.0323433054358038e+00 -1.3062546949444889e+00 -7.9178726805792976e-01 -4.5663897111069103e+00 -2.6797925963787672e+00 1.0748943422784327e+00 4.1267423946126041e+00 2.4917637278984475e+00 1.2385100889014353e+00 6.8723905033475736e+00 2.7833419149942169e+00 -8.8252729689533549e-01 -6.4419959675740870e+00 -2.7939788241428589e+00 -1.1322764997995913e+00 -3.4233658256670534e+00 -2.4424950838057926e+00 7.0711449106903723e-01 3.0456224698635292e+00 2.6588214107064978e+00 8.9134982857202405e-01 4.5495246283642548e+00 2.5902639336347568e+00 -1.1052776860680744e+00 -4.1625284918399110e+00 -2.6079244829064998e+00 -8.3547675649561459e-01 -2.6157390349639971e+00 -4.8721853021076873e+00 1.2999650860580747e+00 2.5317638664462376e+00 5.0638857623635731e+00 1.2977792056627031e+00 2.7833419149942160e+00 7.1490965515279514e+00 -1.1604203946551306e+00 -2.8805674980107292e+00 -7.6426843059106178e+00 -1.1691687674455726e+00 -2.4456476686298205e+00 -3.5691323485244753e+00 8.4804306338428670e-01 2.3268512236957912e+00 4.0257787180041573e+00 9.6606847620933345e-01 2.6280630192273855e+00 4.8854571655644872e+00 -1.2467899127180824e+00 -2.3280658227590840e+00 -5.0402162409173865e+00 2.2161825582950612e+00 5.5394757980966292e-01 7.0944334433226008e-01 -2.3706748619101514e+00 -6.3272290343536175e-01 -9.1548770535579838e-01 -4.4872945713349957e+00 -8.8252729689533560e-01 -1.1604203946551308e+00 4.4642395909957386e+00 5.6649437693778970e-01 8.2174321165633835e-01 1.2720783982574024e+00 6.6931104245227735e-01 8.0447873766836286e-01 -1.1991691737882288e+00 -4.8129314371065995e-01 -6.9258510197094347e-01 -2.2565999576847382e+00 -5.5392511507651532e-01 -6.4806663840455891e-01 2.3612380171699106e+00 7.6071545991814249e-01 1.0808945467294697e+00 5.9216119746280638e-01 4.1418229623126885e+00 2.6969401740785215e+00 -8.6121282985969139e-01 -3.7945547304516305e+00 -2.4550122458948143e+00 -8.3795739749660680e-01 -6.4419959675740870e+00 -2.8805674980107296e+00 5.6649437693778948e-01 6.2307689531625829e+00 2.8135915344297469e+00 8.4627623402235186e-01 2.9934376849597406e+00 2.2863098926998346e+00 -5.0656320835805879e-01 -2.7505100907902857e+00 -2.4325457843064360e+00 -5.0233560103056341e-01 -4.2100495391552499e+00 -2.4762320147588759e+00 7.0313722832197412e-01 3.8310807275362424e+00 2.4475159417627519e+00 7.4721276423122351e-01 2.6596971168881716e+00 5.4176121037759382e+00 -1.2621064914560791e+00 -2.5152603085881067e+00 -5.6684496008541752e+00 -1.0719745023227640e+00 -2.7939788241428589e+00 -7.6426843059106186e+00 8.2174321165633801e-01 2.8135915344297464e+00 8.3954564558765554e+00 1.1839966147860996e+00 2.6981548967367130e+00 4.0175724293238746e+00 -7.5057903954484695e-01 -2.5049765126378229e+00 -4.6489589011821622e+00 -6.8363775641170843e-01 -2.8365467520446108e+00 -5.4453206856739191e+00 1.0153451990617397e+00 2.4793188493587683e+00 5.5747725046445060e+00 2.3456817645910912e+00 9.5574243424404703e-01 1.0386832975978029e+00 -2.6717219177654128e+00 -1.1147768950610331e+00 -1.4224760725222962e+00 -1.5883902596937438e+00 -1.1322764997995913e+00 -1.1691687674455726e+00 1.2720783982574024e+00 8.4627623402235186e-01 1.1839966147860996e+00 4.8643482235185873e+00 1.3928306348252337e+00 1.4464402990989147e+00 -4.4771346488325054e+00 -1.0008872255295143e+00 -1.2714504598568908e+00 -2.3954154137200554e+00 -1.0701483247108499e+00 -1.1412245742933100e+00 2.6505538536446371e+00 1.1232396420093556e+00 1.3351996626352531e+00 9.5273505534485647e-01 4.6424358683476994e+00 2.8017529661846359e+00 -1.2111175419386908e+00 -4.2414700848720681e+00 -2.8162454338400011e+00 -1.1238555801440671e+00 -3.4233658256670534e+00 -2.4456476686298205e+00 6.6931104245227735e-01 2.9934376849597406e+00 2.6981548967367126e+00 1.3928306348252335e+00 7.1545136173150548e+00 3.0670013534491520e+00 -9.8378824231188855e-01 -6.6456069911315501e+00 -3.1301622875182780e+00 -7.9756566304256493e-01 -4.7273047650267284e+00 -2.7854457535680672e+00 1.1014502948148455e+00 4.2473604960749034e+00 2.6105919271856646e+00 1.0218078649648934e+00 2.7724187762381898e+00 5.0090961704555124e+00 -1.3582239662863924e+00 -2.4659905185476161e+00 -5.1917762376062910e+00 -1.1589532549616743e+00 -2.4424950838057926e+00 -3.5691323485244748e+00 8.0447873766836286e-01 2.2863098926998346e+00 4.0175724293238746e+00 1.4464402990989145e+00 3.0670013534491520e+00 7.3991277004460327e+00 -1.2403653691803231e+00 -3.1044846235931951e+00 -7.8454130438033873e+00 -8.3141934680337970e-01 -2.7339314296778419e+00 -4.9872855282428548e+00 1.3162350354996006e+00 2.6211716332372692e+00 5.1678108579515891e+00 -2.2190797831815994e+00 -6.2910131081607290e-01 -7.4985961753160413e-01 2.3693463695523662e+00 8.1092524246094833e-01 1.1559194607728269e+00 1.3146966205853279e+00 7.0711449106903723e-01 8.4804306338428670e-01 -1.1991691737882288e+00 -5.0656320835805879e-01 -7.5057903954484695e-01 -4.4771346488325046e+00 -9.8378824231188855e-01 -1.2403653691803231e+00 4.3594814064807599e+00 6.7696431135621449e-01 9.5375542371673983e-01 2.2635553068179410e+00 6.2658859009187173e-01 7.7303557731141637e-01 -2.4116960976340631e+00 -7.0213987349205120e-01 -9.8994949892849582e-01 -5.9025456546927857e-01 -4.2994735898010985e+00 -2.6871639520595241e+00 8.3560851890963683e-01 3.9199795233578500e+00 2.6547494736974975e+00 8.5042892517675583e-01 3.0456224698635292e+00 2.3268512236957912e+00 -4.8129314371065995e-01 -2.7505100907902857e+00 -2.5049765126378234e+00 -1.0008872255295140e+00 -6.6456069911315501e+00 -3.1044846235931951e+00 6.7696431135621460e-01 6.3344374015700886e+00 3.0916058578644212e+00 5.9373398860040649e-01 4.3242349241597910e+00 2.8033446234692572e+00 -8.8430080933356237e-01 -3.9286836472283237e+00 -2.5799260904364245e+00 -7.7637932951650224e-01 -2.9789803514471838e+00 -5.5812353685882687e+00 1.1701119500277033e+00 2.6140700748402566e+00 5.7539172259816933e+00 1.1526414461735333e+00 2.6588214107064978e+00 4.0257787180041573e+00 -6.9258510197094358e-01 -2.4325457843064360e+00 -4.6489589011821622e+00 -1.2714504598568912e+00 -3.1301622875182775e+00 -7.8454130438033873e+00 9.5375542371673994e-01 3.0916058578644203e+00 8.5275641318283437e+00 7.3006407988145505e-01 2.7903107329654921e+00 5.5351563702640343e+00 -1.2661580084550970e+00 -2.6131196531047691e+00 -5.7668091325044104e+00 -1.1898318651628752e+00 -5.6689126020149783e-01 -6.2030736334967607e-01 1.3101976951408625e+00 6.5773446053507834e-01 8.1878802660976224e-01 2.3728971183590311e+00 8.9134982857202405e-01 9.6606847620933334e-01 -2.2565999576847382e+00 -5.0233560103056341e-01 -6.8363775641170843e-01 -2.3954154137200554e+00 -7.9756566304256493e-01 -8.3141934680337970e-01 2.2635553068179410e+00 5.9373398860040649e-01 7.3006407988145505e-01 4.4439796153626610e+00 6.9323986545444805e-01 7.5582910989128160e-01 -4.5487824991128276e+00 -9.6926561888733076e-01 -1.1353852260270680e+00 -6.0392778163014593e-01 -3.4716978447655733e+00 -2.6543477063959489e+00 9.8155240733155835e-01 3.0419555765031139e+00 2.6349738325893455e+00 8.4779627602495378e-01 4.5495246283642548e+00 2.6280630192273851e+00 -5.5392511507651532e-01 -4.2100495391552499e+00 -2.8365467520446108e+00 -1.0701483247108499e+00 -4.7273047650267284e+00 -2.7339314296778419e+00 6.2658859009187184e-01 4.3242349241597910e+00 2.7903107329654917e+00 6.9323986545444793e-01 7.1167287603420606e+00 3.0955151705975497e+00 -9.2117591748532290e-01 -6.6233917404216696e+00 -2.9240368672613704e+00 -6.4923635265356794e-01 -2.6077740891796166e+00 -3.9072176778375720e+00 1.0956157526415604e+00 2.3372437299872786e+00 4.0698176439335469e+00 9.0316897759773962e-01 2.5902639336347564e+00 4.8854571655644872e+00 -6.4806663840455891e-01 -2.4762320147588759e+00 -5.4453206856739191e+00 -1.1412245742933100e+00 -2.7854457535680672e+00 -4.9872855282428556e+00 7.7303557731141637e-01 2.8033446234692572e+00 5.5351563702640343e+00 7.5582910989128149e-01 3.0955151705975501e+00 7.6432192472209044e+00 -1.0891218520905632e+00 -2.9569156001822825e+00 -7.7938265352286269e+00 1.2910914353256675e+00 9.4338968119815836e-01 1.0730437048120638e+00 -1.5932789754331658e+00 -9.3576845793422891e-01 -1.3074190375429997e+00 -2.6676341409540480e+00 -1.1052776860680744e+00 -1.2467899127180821e+00 2.3612380171699106e+00 7.0313722832197412e-01 1.0153451990617397e+00 2.6505538536446371e+00 1.1014502948148457e+00 1.3162350354996009e+00 -2.4116960976340631e+00 -8.8430080933356237e-01 -1.2661580084550970e+00 -4.5487824991128285e+00 -9.2117591748532268e-01 -1.0891218520905634e+00 4.9185084069938902e+00 1.0985456664862099e+00 1.5048648714333370e+00 6.8737740123087199e-01 3.0107829411983840e+00 2.3596574436310656e+00 -9.6612937182939274e-01 -2.7059229015695729e+00 -2.3170824269028700e+00 -1.0323433054358035e+00 -4.1625284918399110e+00 -2.3280658227590840e+00 7.6071545991814249e-01 3.8310807275362424e+00 2.4793188493587683e+00 1.1232396420093556e+00 4.2473604960749034e+00 2.6211716332372692e+00 -7.0213987349205109e-01 -3.9286836472283237e+00 -2.6131196531047687e+00 -9.6926561888733065e-01 -6.6233917404216687e+00 -2.9569156001822829e+00 1.0985456664862103e+00 6.3313026162499444e+00 2.7550355767219035e+00 8.5011962473513158e-01 2.5981128573943812e+00 4.0393534212536091e+00 -1.3394892856331371e+00 -2.2993688624604074e+00 -4.2645018219288078e+00 -1.3062546949444889e+00 -2.6079244829064998e+00 -5.0402162409173865e+00 1.0808945467294697e+00 2.4475159417627519e+00 5.5747725046445060e+00 1.3351996626352531e+00 2.6105919271856646e+00 5.1678108579515882e+00 -9.8994949892849582e-01 -2.5799260904364245e+00 -5.7668091325044104e+00 -1.1353852260270680e+00 -2.9240368672613704e+00 -7.7938265352286269e+00 1.5048648714333375e+00 2.7550355767219035e+00 8.0834169467295283e+00 990 991 992 1038 1039 1040 1167 1168 1169 1101 1102 1103 993 994 995 1041 1042 1043 1170 1171 1172 1104 1105 1106 4.6476486166725302e+00 6.0143206434814384e-02 6.8819050359517117e-02 -4.5736063928304862e+00 -3.9112237260595928e-01 -4.3906458475791793e-01 -2.2670216196283888e+00 -2.1231097517597242e-01 -2.2936601379541055e-01 2.2479678646068360e+00 4.3072769150205310e-02 5.4458570943241830e-02 2.2513559144774744e+00 3.5101807635421922e-01 3.8370035547607728e-01 -2.2716082088005924e+00 -1.9736999469541119e-02 -2.5091507063156271e-02 -1.1253773332565449e+00 -2.4026080594138667e-02 -2.4787697404979006e-02 1.0906411587591713e+00 1.9296237590637261e-01 2.1133182624262753e-01 6.0143206434814370e-02 7.8602766506458455e+00 3.5414140301870587e+00 -3.8162434683031521e-01 -7.3345537236473355e+00 -3.4353255986746127e+00 -4.6443067045919534e-01 -5.0717366264855777e+00 -3.0196187547892417e+00 2.3224164077651328e-02 4.6384413218027873e+00 2.9835458199150704e+00 3.4391976845732530e-01 5.1412025401867494e+00 3.1436306213535739e+00 -2.3641922281250619e-02 -4.7857321435355002e+00 -3.2869486112404789e+00 -5.5715232782469933e-03 -3.7960812824889683e+00 -2.8858680558258496e+00 4.4798132387921630e-01 3.3481832635219977e+00 2.9591705490744808e+00 6.8819050359517089e-02 3.5414140301870591e+00 8.5461305253673157e+00 -4.2947018371688983e-01 -3.4517661929716277e+00 -8.7791001042717873e+00 -5.0428652313061573e-01 -3.0420532364542288e+00 -5.5138877593566153e+00 3.0564882451366675e-02 3.0247371693917438e+00 5.9479939441326408e+00 3.7918970552566433e-01 3.1522356428921912e+00 5.6731528725987053e+00 -2.8222593735188293e-02 -2.9744601127464998e+00 -6.1244126611167236e+00 -4.9140624572137151e-03 -2.9133180944924244e+00 -4.2748831294534151e+00 4.8831972470335844e-01 2.6632107941937835e+00 4.5250063120998769e+00 -4.5736063928304853e+00 -3.8162434683031526e-01 -4.2947018371688994e-01 4.7625871155073938e+00 6.2092268166088838e-01 8.5986409012471843e-01 2.4036115173063588e+00 5.8191440819896179e-01 7.1324036481572251e-01 -2.2705567088285865e+00 -3.9739286248767969e-01 -5.6343958463416022e-01 -2.4327061527986498e+00 -6.5544391150617598e-01 -7.5842897594130798e-01 2.2692618955341697e+00 3.0913874800190211e-01 4.2968781641200804e-01 1.1133622234471194e+00 4.5113440620169148e-01 4.8504288196160156e-01 -1.2719534973373183e+00 -5.2864912323927227e-01 -7.3649640902169289e-01 -3.9112237260595922e-01 -7.3345537236473364e+00 -3.4517661929716272e+00 6.2092268166088849e-01 6.9922073001938712e+00 3.3033587911132654e+00 5.8919476696286677e-01 4.6494550133975210e+00 2.9653227932589536e+00 -1.6639484606428601e-01 -4.2931467918478319e+00 -2.8798319492049731e+00 -6.0903432383027445e-01 -4.7655746117592575e+00 -2.8988349528619448e+00 3.0645245294042667e-01 4.4221758111343448e+00 2.9944444564987927e+00 1.7612993590578860e-01 3.3878385332189955e+00 2.6606354847529747e+00 -5.2614829496944993e-01 -3.0584015306903036e+00 -2.6933284305854426e+00 -4.3906458475791804e-01 -3.4353255986746136e+00 -8.7791001042717856e+00 8.5986409012471865e-01 3.3033587911132658e+00 9.1605401191217304e+00 7.1478202675779623e-01 2.9314219997923296e+00 5.8284687172705532e+00 -2.3907789739399748e-01 -2.8637882003075901e+00 -6.3192332487604101e+00 -7.8337657333695865e-01 -3.2285776387849729e+00 -5.9911473814546854e+00 4.2945814104059943e-01 3.0064214008996375e+00 6.4361293749532420e+00 1.8980899429538900e-01 2.9774789108239927e+00 4.5493936411406217e+00 -7.3239419672962836e-01 -2.6909896648620464e+00 -4.8850511179992671e+00 -2.2670216196283892e+00 -4.6443067045919534e-01 -5.0428652313061573e-01 2.4036115173063588e+00 5.8919476696286677e-01 7.1478202675779623e-01 4.6207102316191042e+00 6.7541673998961738e-01 7.2782697473122815e-01 -4.4371016198039799e+00 -2.9206660182007577e-01 -4.0131669141221316e-01 -1.2677977093770170e+00 -6.1603299087269792e-01 -6.6158935491422377e-01 1.1171765129310751e+00 3.8522454451618510e-01 5.4137479383406129e-01 2.1926327341180580e+00 3.0257724948084175e-01 3.2858090636183390e-01 -2.3622100471652097e+00 -5.7988303779754147e-01 -7.4537213222786713e-01 -2.1231097517597239e-01 -5.0717366264855777e+00 -3.0420532364542288e+00 5.8191440819896179e-01 4.6494550133975210e+00 2.9314219997923296e+00 6.7541673998961738e-01 7.4777247912227454e+00 3.2543258875936680e+00 -3.3049030095428861e-01 -7.0375037200830048e+00 -3.2094285445655868e+00 -6.0653532764595264e-01 -3.7768603625321058e+00 -2.8397228237591854e+00 1.7123966999678020e-01 3.3879114740365885e+00 2.9849341701879295e+00 3.3612220411439470e-01 4.9162935814838269e+00 2.9446300263988006e+00 -6.1535641852353973e-01 -4.5452841510399935e+00 -3.0241074791937281e+00 -2.2936601379541049e-01 -3.0196187547892417e+00 -5.5138877593566145e+00 7.1324036481572251e-01 2.9653227932589536e+00 5.8284687172705532e+00 7.2782697473122826e-01 3.2543258875936680e+00 7.9878334829838957e+00 -4.5656304096512762e-01 -3.2724728738653224e+00 -8.3880906354077531e+00 -6.4892658307895834e-01 -2.8289293934325075e+00 -4.1585307525684136e+00 2.3705866955344834e-01 2.6552944407763590e+00 4.5362662076510247e+00 3.6838881767910125e-01 2.9564977663780674e+00 5.3948406451032396e+00 -7.1165918894000313e-01 -2.7104198659199743e+00 -5.6868999056759337e+00 2.2479678646068360e+00 2.3224164077651321e-02 3.0564882451366706e-02 -2.2705567088285865e+00 -1.6639484606428598e-01 -2.3907789739399748e-01 -4.4371016198039799e+00 -3.3049030095428861e-01 -4.5656304096512756e-01 4.5340698897527743e+00 3.3074840008065529e-02 4.3721028902896648e-02 1.0849099364182961e+00 1.4926709224186230e-01 2.1226458764158918e-01 -1.1294119269749092e+00 -5.8555939700501367e-03 -9.8820937426008001e-03 -2.2116928226041965e+00 2.2904805484925128e-03 5.4713746307378797e-03 2.1818153874337662e+00 2.9488416411255297e-01 4.1350115847513547e-01 4.3072769150205331e-02 4.6384413218027873e+00 3.0247371693917438e+00 -3.9739286248767969e-01 -4.2931467918478319e+00 -2.8637882003075905e+00 -2.9206660182007571e-01 -7.0375037200830031e+00 -3.2724728738653215e+00 3.3074840008065542e-02 6.7921195856617533e+00 3.1709945101758472e+00 3.7588362810057541e-01 3.3449212840045490e+00 2.6402846647518570e+00 -2.5537315062021490e-02 -3.0752495597481890e+00 -2.7355025521610568e+00 5.7388857269445176e-03 -4.5644827919208888e+00 -2.7650714796615334e+00 2.5722665638398562e-01 4.1949006721308235e+00 2.8008187616760565e+00 5.4458570943241844e-02 2.9835458199150704e+00 5.9479939441326408e+00 -5.6343958463416033e-01 -2.8798319492049727e+00 -6.3192332487604101e+00 -4.0131669141221310e-01 -3.2094285445655868e+00 -8.3880906354077513e+00 4.3721028902896648e-02 3.1709945101758472e+00 8.9819323553680892e+00 5.3631008638066435e-01 2.9905371722760563e+00 4.5180757391435611e+00 -3.7910312039860568e-02 -2.7625593346632673e+00 -5.0143682145130848e+00 4.3964684563731760e-03 -3.1028169760875337e+00 -5.8227703389390362e+00 3.6378043340305699e-01 2.8095593021543843e+00 6.0964603989759949e+00 2.2513559144774744e+00 3.4391976845732530e-01 3.7918970552566439e-01 -2.4327061527986498e+00 -6.0903432383027445e-01 -7.8337657333695865e-01 -1.2677977093770170e+00 -6.0653532764595264e-01 -6.4892658307895834e-01 1.0849099364182964e+00 3.7588362810057541e-01 5.3631008638066435e-01 4.7270796088321489e+00 7.2124958164363573e-01 7.7809577820793030e-01 -4.4915875469837951e+00 -3.4991349451785853e-01 -4.7474681979154448e-01 -2.2230685408334914e+00 -4.6680979826230418e-01 -5.0463596792155652e-01 2.3518144902650335e+00 5.9123996605485285e-01 7.1809037401475917e-01 3.5101807635421922e-01 5.1412025401867494e+00 3.1522356428921912e+00 -6.5544391150617598e-01 -4.7655746117592575e+00 -3.2285776387849725e+00 -6.1603299087269803e-01 -3.7768603625321058e+00 -2.8289293934325075e+00 1.4926709224186230e-01 3.3449212840045481e+00 2.9905371722760568e+00 7.2124958164363584e-01 7.8100381625253945e+00 3.5111599553785511e+00 -3.4612026760171899e-01 -7.2979063285527079e+00 -3.4925052551952005e+00 -1.9623902832525239e-01 -5.0852997946984910e+00 -3.0855642805503543e+00 5.9230144806612717e-01 4.6294791108258675e+00 2.9816437974162389e+00 3.8370035547607734e-01 3.1436306213535739e+00 5.6731528725987044e+00 -7.5842897594130776e-01 -2.8988349528619453e+00 -5.9911473814546854e+00 -6.6158935491422377e-01 -2.8397228237591854e+00 -4.1585307525684136e+00 2.1226458764158918e-01 2.6402846647518570e+00 4.5180757391435611e+00 7.7809577820793030e-01 3.5111599553785520e+00 8.3675412164250851e+00 -4.6885777075784457e-01 -3.4831459925267065e+00 -8.7214061471860322e+00 -2.0954113978554867e-01 -3.0709629208517200e+00 -5.5156039773727112e+00 7.2435652007332740e-01 2.9975914485155721e+00 5.8279184304144946e+00 -2.2716082088005924e+00 -2.3641922281250595e-02 -2.8222593735188303e-02 2.2692618955341697e+00 3.0645245294042667e-01 4.2945814104059948e-01 1.1171765129310751e+00 1.7123966999678020e-01 2.3705866955344834e-01 -1.1294119269749092e+00 -2.5537315062021497e-02 -3.7910312039860568e-02 -4.4915875469837951e+00 -3.4612026760171899e-01 -4.6885777075784457e-01 4.5180462818285925e+00 6.0657276661490997e-02 8.1004602123739333e-02 2.2217776444813611e+00 4.5684000383514660e-02 5.3539457580297024e-02 -2.2336546520159031e+00 -1.8873389503722146e-01 -2.6607019376519070e-01 -1.9736999469541119e-02 -4.7857321435355002e+00 -2.9744601127464998e+00 3.0913874800190211e-01 4.4221758111343448e+00 3.0064214008996375e+00 3.8522454451618510e-01 3.3879114740365890e+00 2.6552944407763590e+00 -5.8555939700501453e-03 -3.0752495597481890e+00 -2.7625593346632673e+00 -3.4991349451785847e-01 -7.2979063285527079e+00 -3.4831459925267056e+00 6.0657276661491011e-02 6.9675600625167275e+00 3.4082697220124158e+00 2.6287675927854602e-02 4.6757799763424943e+00 3.0602703136146374e+00 -4.0580215714998230e-01 -4.2945392921937566e+00 -2.9100904373665788e+00 -2.5091507063156271e-02 -3.2869486112404789e+00 -6.1244126611167236e+00 4.2968781641200809e-01 2.9944444564987927e+00 6.4361293749532411e+00 5.4137479383406129e-01 2.9849341701879291e+00 4.5362662076510247e+00 -9.8820937426008001e-03 -2.7355025521610568e+00 -5.0143682145130848e+00 -4.7474681979154443e-01 -3.4925052551952005e+00 -8.7214061471860340e+00 8.1004602123739347e-02 3.4082697220124167e+00 9.2539611130359738e+00 3.0009856690544408e-02 3.0515097489349134e+00 5.9531650540120093e+00 -5.7235664846305057e-01 -2.9242016790373131e+00 -6.3193347268364084e+00 -1.1253773332565449e+00 -5.5715232782470002e-03 -4.9140624572136943e-03 1.1133622234471194e+00 1.7612993590578863e-01 1.8980899429538900e-01 2.1926327341180576e+00 3.3612220411439470e-01 3.6838881767910125e-01 -2.2116928226041965e+00 5.7388857269445176e-03 4.3964684563731898e-03 -2.2230685408334914e+00 -1.9623902832525239e-01 -2.0954113978554867e-01 2.2217776444813611e+00 2.6287675927854616e-02 3.0009856690544387e-02 4.3918304260265177e+00 3.1230591948369191e-02 3.5885877003754299e-02 -4.3594643313788239e+00 -3.7369874201985226e-01 -4.1403481188239977e-01 -2.4026080594138677e-02 -3.7960812824889687e+00 -2.9133180944924244e+00 4.5113440620169148e-01 3.3878385332189955e+00 2.9774789108239927e+00 3.0257724948084175e-01 4.9162935814838269e+00 2.9564977663780669e+00 2.2904805484925128e-03 -4.5644827919208897e+00 -3.1028169760875342e+00 -4.6680979826230418e-01 -5.0852997946984919e+00 -3.0709629208517200e+00 4.5684000383514653e-02 4.6757799763424943e+00 3.0515097489349143e+00 3.1230591948369198e-02 7.4696078499687975e+00 3.3638634209493654e+00 -3.4208084970646591e-01 -7.0036560719057626e+00 -3.2622518556546618e+00 -2.4787697404979020e-02 -2.8858680558258500e+00 -4.2748831294534151e+00 4.8504288196160161e-01 2.6606354847529747e+00 4.5493936411406217e+00 3.2858090636183390e-01 2.9446300263988006e+00 5.3948406451032387e+00 5.4713746307378797e-03 -2.7650714796615334e+00 -5.8227703389390362e+00 -5.0463596792155652e-01 -3.0855642805503547e+00 -5.5156039773727112e+00 5.3539457580297031e-02 3.0602703136146374e+00 5.9531650540120085e+00 3.5885877003754313e-02 3.3638634209493645e+00 8.0644377008479076e+00 -3.7909683221168805e-01 -3.2928954296780377e+00 -8.3485795953386166e+00 1.0906411587591713e+00 4.4798132387921630e-01 4.8831972470335855e-01 -1.2719534973373183e+00 -5.2614829496944993e-01 -7.3239419672962836e-01 -2.3622100471652097e+00 -6.1535641852353973e-01 -7.1165918894000302e-01 2.1818153874337662e+00 2.5722665638398556e-01 3.6378043340305682e-01 2.3518144902650335e+00 5.9230144806612717e-01 7.2435652007332729e-01 -2.2336546520159031e+00 -4.0580215714998230e-01 -5.7235664846305068e-01 -4.3594643313788239e+00 -3.4208084970646585e-01 -3.7909683221168805e-01 4.6030114914392843e+00 5.9187829202010844e-01 8.1905018816462749e-01 1.9296237590637261e-01 3.3481832635219977e+00 2.6632107941937835e+00 -5.2864912323927227e-01 -3.0584015306903036e+00 -2.6909896648620464e+00 -5.7988303779754147e-01 -4.5452841510399935e+00 -2.7104198659199743e+00 2.9488416411255303e-01 4.1949006721308235e+00 2.8095593021543839e+00 5.9123996605485296e-01 4.6294791108258675e+00 2.9975914485155726e+00 -1.8873389503722143e-01 -4.2945392921937566e+00 -2.9242016790373127e+00 -3.7369874201985220e-01 -7.0036560719057626e+00 -3.2928954296780382e+00 5.9187829202010844e-01 6.7293179993511263e+00 3.1481450946336333e+00 2.1133182624262747e-01 2.9591705490744808e+00 4.5250063120998769e+00 -7.3649640902169289e-01 -2.6933284305854426e+00 -4.8850511179992662e+00 -7.4537213222786725e-01 -3.0241074791937281e+00 -5.6868999056759337e+00 4.1350115847513547e-01 2.8008187616760560e+00 6.0964603989759949e+00 7.1809037401475917e-01 2.9816437974162389e+00 5.8279184304144955e+00 -2.6607019376519075e-01 -2.9100904373665792e+00 -6.3193347268364084e+00 -4.1403481188239988e-01 -3.2622518556546627e+00 -8.3485795953386166e+00 8.1905018816462771e-01 3.1481450946336329e+00 8.7904802043598558e+00 1038 1039 1040 1086 1087 1088 1179 1180 1181 1167 1168 1169 1041 1042 1043 1089 1090 1091 1182 1183 1184 1170 1171 1172 4.3738307748104841e+00 4.4673751738646593e-02 5.1412825987798089e-02 -4.2908860996424130e+00 -3.7516167438690978e-01 -4.1785233582837678e-01 -2.1912924883275142e+00 -2.0245096638850890e-01 -2.1709740774634051e-01 2.1728378234593531e+00 3.1734937734404639e-02 4.0159037418028960e-02 2.1475730025753861e+00 3.3856452672271098e-01 3.6854405939125623e-01 -2.1715120644549151e+00 -9.3002298063134432e-03 -1.1867054152845677e-02 -1.1077228030107547e+00 -1.3388692071737957e-02 -1.3184582327073844e-02 1.0671718545903743e+00 1.8532834645770796e-01 1.9988545725755347e-01 4.4673751738646572e-02 7.5209868041564327e+00 3.4526220189530248e+00 -3.8126144642108500e-01 -6.9782345437126478e+00 -3.3492610146602972e+00 -4.5910604569207331e-01 -4.9599715015370283e+00 -2.9597033218032758e+00 1.7215961744934852e-02 4.5163653309248000e+00 2.9308349379648764e+00 3.4371422393121376e-01 4.9941371089982631e+00 3.0821273759170107e+00 -9.9870816425213609e-03 -4.6350512645666067e+00 -3.2283101335833186e+00 1.3676569649440258e-03 -3.7457452598337255e+00 -2.8396645482401581e+00 4.4338297937593890e-01 3.2875133255705138e+00 2.9113546854521353e+00 5.1412825987798089e-02 3.4526220189530257e+00 8.1572269873190493e+00 -4.2556513957664222e-01 -3.3513699310387755e+00 -8.3836097948333475e+00 -4.9696819878172527e-01 -2.9899877884712001e+00 -5.3649436122177629e+00 2.2382812575735274e-02 2.9638771344788166e+00 5.8011646166649280e+00 3.7736467953515640e-01 3.0878289460557835e+00 5.4903572695425256e+00 -1.1580146889643388e-02 -2.9076141139696658e+00 -5.9446347135596636e+00 2.6875354106438119e-03 -2.8669634626181160e+00 -4.1954826963258736e+00 4.8026563173867576e-01 2.6116071966101311e+00 4.4399219434101438e+00 -4.2908860996424130e+00 -3.8126144642108506e-01 -4.2556513957664238e-01 4.4846073324595261e+00 6.1419327091536990e-01 8.5460046750751539e-01 2.3297736749329796e+00 5.8199598439039002e-01 7.1177671824852329e-01 -2.1925330913967223e+00 -3.9428035580431459e-01 -5.6211569615311119e-01 -2.3336674342852777e+00 -6.5309275285822765e-01 -7.5437522580535643e-01 2.1636932638142206e+00 3.0808005990994852e-01 4.2950633353984702e-01 1.0923040786293441e+00 4.5107354587791459e-01 4.8287439662320192e-01 -1.2532917245116577e+00 -5.2670830600999574e-01 -7.3670185438397728e-01 -3.7516167438690984e-01 -6.9782345437126487e+00 -3.3513699310387755e+00 6.1419327091536990e-01 6.6285070847033349e+00 3.2037562110251017e+00 5.8379182090012360e-01 4.5238271158428258e+00 2.9009188997998274e+00 -1.6113241170328652e-01 -4.1617898150300743e+00 -2.8200449459725618e+00 -6.0794447503293580e-01 -4.6069825338438095e+00 -2.8279983108433648e+00 2.9422918626937528e-01 4.2610121034261779e+00 2.9242299738180013e+00 1.7340847542475604e-01 3.3242794422260578e+00 2.6083447226259677e+00 -5.2138419238649114e-01 -2.9906188536118647e+00 -2.6378366194141947e+00 -4.1785233582837672e-01 -3.3492610146602968e+00 -8.3836097948333475e+00 8.5460046750751550e-01 3.2037562110251008e+00 8.7644519146654005e+00 7.0851160204224417e-01 2.8756917941406210e+00 5.6777890063004763e+00 -2.3259234905661547e-01 -2.7968401518182122e+00 -6.1727997065788509e+00 -7.8352024520380048e-01 -3.1647262722136578e+00 -5.8073996965213963e+00 4.1433852476071298e-01 2.9384093160557425e+00 6.2545343362903481e+00 1.8508995994929561e-01 2.9282456589429913e+00 4.4689270677349890e+00 -7.2857562417097399e-01 -2.6352755414722888e+00 -4.8018931270576211e+00 -2.1912924883275142e+00 -4.5910604569207319e-01 -4.9696819878172527e-01 2.3297736749329796e+00 5.8379182090012349e-01 7.0851160204224428e-01 4.6019199819140564e+00 6.7419803731865968e-01 7.2319501441757406e-01 -4.4134963724991030e+00 -2.8134659329016898e-01 -3.8990166427915174e-01 -1.2509352069009252e+00 -6.1218762735600218e-01 -6.5551355117800658e-01 1.0948187184296483e+00 3.7846576120075315e-01 5.3509175203379877e-01 2.2153348895565159e+00 2.9236372650602366e-01 3.1673596953709682e-01 -2.3861231971056576e+00 -5.7617907958731562e-01 -7.4115092379183012e-01 -2.0245096638850890e-01 -4.9599715015370283e+00 -2.9899877884712005e+00 5.8199598439039002e-01 4.5238271158428267e+00 2.8756917941406210e+00 6.7419803731865968e-01 7.4269255956927926e+00 3.2065753748646686e+00 -3.3057741203452318e-01 -6.9753970465348694e+00 -3.1618567116209175e+00 -6.0967102341020540e-01 -3.7232467458794098e+00 -2.7936713505358046e+00 1.6187702638272330e-01 3.3282024458749264e+00 2.9380858693308114e+00 3.4007139028739147e-01 4.9138338390012821e+00 2.9069549133439812e+00 -6.1544303654592536e-01 -4.5341737024605173e+00 -2.9817921010521609e+00 -2.1709740774634054e-01 -2.9597033218032753e+00 -5.3649436122177629e+00 7.1177671824852307e-01 2.9009188997998274e+00 5.6777890063004772e+00 7.2319501441757383e-01 3.2065753748646695e+00 7.9016112941384966e+00 -4.5830353879345581e-01 -3.2238858033861906e+00 -8.3047865278119772e+00 -6.4863304001448829e-01 -2.7755318910785345e+00 -4.0736952652004010e+00 2.2750340821480713e-01 2.6034283578216688e+00 4.4525203960230018e+00 3.7177579633179908e-01 2.9153749840523258e+00 5.3650796670399235e+00 -7.1021695065841717e-01 -2.6671766002704929e+00 -5.6535749582717560e+00 2.1728378234593531e+00 1.7215961744934852e-02 2.2382812575735274e-02 -2.1925330913967223e+00 -1.6113241170328652e-01 -2.3259234905661538e-01 -4.4134963724991021e+00 -3.3057741203452318e-01 -4.5830353879345581e-01 4.5155750301642987e+00 2.7285561460302369e-02 3.5551788698127480e-02 1.0625619348399078e+00 1.4465894841492571e-01 2.0830992831319550e-01 -1.1100417531038020e+00 -1.2141871509084162e-03 -3.4074155789913275e-03 -2.2367382989568569e+00 7.1009578993216638e-03 1.0643616772589570e-02 2.2018347274929249e+00 2.9666258136923362e-01 4.1741515706941468e-01 3.1734937734404639e-02 4.5163653309248009e+00 2.9638771344788166e+00 -3.9428035580431459e-01 -4.1617898150300743e+00 -2.7968401518182122e+00 -2.8134659329016892e-01 -6.9753970465348694e+00 -3.2238858033861906e+00 2.7285561460302307e-02 6.7281273517271778e+00 3.1196612368796193e+00 3.7264111639383962e-01 3.2807252666697071e+00 2.5876873265767646e+00 -1.4842953175489958e-02 -3.0104457087292142e+00 -2.6798374320910021e+00 1.2722585855908825e-02 -4.5544597711552495e+00 -2.7245752905116363e+00 2.4608570082551678e-01 4.1768743921277238e+00 2.7539129798718394e+00 4.0159037418028974e-02 2.9308349379648759e+00 5.8011646166649289e+00 -5.6211569615311119e-01 -2.8200449459725618e+00 -6.1727997065788509e+00 -3.8990166427915174e-01 -3.1618567116209175e+00 -8.3047865278119772e+00 3.5551788698127480e-02 3.1196612368796193e+00 8.9101464609052119e+00 5.3522369027443006e-01 2.9418992201274179e+00 4.4352127573690989e+00 -2.2958181725716197e-02 -2.7131296951712010e+00 -4.9375789845828688e+00 1.3744349514684742e-02 -3.0627574631196448e+00 -5.7999031091616473e+00 3.5029667625270605e-01 2.7653934209124120e+00 6.0685444931961037e+00 2.1475730025753861e+00 3.4371422393121376e-01 3.7736467953515640e-01 -2.3336674342852777e+00 -6.0794447503293580e-01 -7.8352024520380037e-01 -1.2509352069009252e+00 -6.0967102341020540e-01 -6.4863304001448840e-01 1.0625619348399078e+00 3.7264111639383962e-01 5.3522369027443029e-01 4.6080192727323457e+00 7.2116138098638172e-01 7.7508975226592070e-01 -4.3622983725935383e+00 -3.4606574818672831e-01 -4.7208734706893857e-01 -2.2211948479228742e+00 -4.6609404227905576e-01 -5.0173336259866663e-01 2.3499416515549765e+00 5.9225856759749040e-01 7.1829587281038643e-01 3.3856452672271098e-01 4.9941371089982622e+00 3.0878289460557835e+00 -6.5309275285822754e-01 -4.6069825338438095e+00 -3.1647262722136578e+00 -6.1218762735600218e-01 -3.7232467458794098e+00 -2.7755318910785345e+00 1.4465894841492571e-01 3.2807252666697075e+00 2.9418992201274179e+00 7.2116138098638172e-01 7.6355661736610534e+00 3.4417617982897855e+00 -3.3350993231326437e-01 -7.1137572603836441e+00 -3.4217554357839055e+00 -1.9350750040807008e-01 -5.0515414198371547e+00 -3.0366710691886709e+00 5.8791295681154421e-01 4.5850994106149958e+00 2.9271947037917805e+00 3.6854405939125623e-01 3.0821273759170107e+00 5.4903572695425256e+00 -7.5437522580535654e-01 -2.8279983108433653e+00 -5.8073996965213963e+00 -6.5551355117800636e-01 -2.7936713505358046e+00 -4.0736952652004010e+00 2.0830992831319550e-01 2.5876873265767650e+00 4.4352127573690989e+00 7.7508975226592070e-01 3.4417617982897863e+00 8.1569839935452411e+00 -4.5575645908077145e-01 -3.4147975582819798e+00 -8.5085233417873543e+00 -2.0658909392739622e-01 -3.0280004554858038e+00 -5.4543383228457474e+00 7.2029059002115658e-01 2.9528911743633914e+00 5.7614026058980325e+00 -2.1715120644549151e+00 -9.9870816425213435e-03 -1.1580146889643341e-02 2.1636932638142206e+00 2.9422918626937533e-01 4.1433852476071298e-01 1.0948187184296483e+00 1.6187702638272330e-01 2.2750340821480719e-01 -1.1100417531038020e+00 -1.4842953175489958e-02 -2.2958181725716179e-02 -4.3622983725935383e+00 -3.3350993231326437e-01 -4.5575645908077150e-01 4.3922603383440588e+00 4.8530057041893275e-02 6.4309690182275142e-02 2.2201508697391836e+00 3.4742534073277265e-02 4.0649765516866165e-02 -2.2270710001748548e+00 -1.8103883663599354e-01 -2.5650660097853040e-01 -9.3002298063134710e-03 -4.6350512645666067e+00 -2.9076141139696658e+00 3.0808005990994852e-01 4.2610121034261779e+00 2.9384093160557425e+00 3.7846576120075315e-01 3.3282024458749264e+00 2.6034283578216693e+00 -1.2141871509084232e-03 -3.0104457087292142e+00 -2.7131296951712010e+00 -3.4606574818672831e-01 -7.1137572603836432e+00 -3.4147975582819798e+00 4.8530057041893289e-02 6.7814738508374601e+00 3.3365568226447238e+00 2.0402488651846195e-02 4.6347203794729239e+00 3.0186043077328573e+00 -3.9889820166048967e-01 -4.2461545459320229e+00 -2.8614574368321448e+00 -1.1867054152845663e-02 -3.2283101335833191e+00 -5.9446347135596636e+00 4.2950633353984713e-01 2.9242299738180013e+00 6.2545343362903481e+00 5.3509175203379877e-01 2.9380858693308114e+00 4.4525203960230018e+00 -3.4074155789913206e-03 -2.6798374320910021e+00 -4.9375789845828688e+00 -4.7208734706893862e-01 -3.4217554357839064e+00 -8.5085233417873525e+00 6.4309690182275142e-02 3.3365568226447242e+00 9.0460230487571529e+00 2.3123538018748967e-02 3.0006735242340268e+00 5.8950511377716373e+00 -5.6466949697389257e-01 -2.8696431885693374e+00 -6.2573918789122569e+00 -1.1077228030107547e+00 1.3676569649440362e-03 2.6875354106438293e-03 1.0923040786293441e+00 1.7340847542475604e-01 1.8508995994929561e-01 2.2153348895565159e+00 3.4007139028739147e-01 3.7177579633179908e-01 -2.2367382989568565e+00 1.2722585855908866e-02 1.3744349514684742e-02 -2.2211948479228742e+00 -1.9350750040807008e-01 -2.0658909392739624e-01 2.2201508697391836e+00 2.0402488651846178e-02 2.3123538018748960e-02 4.5111387607571523e+00 2.6134035046096005e-02 3.0546073044399290e-02 -4.4732726487917107e+00 -3.8059913182287253e-01 -4.2037815834217529e-01 -1.3388692071737953e-02 -3.7457452598337251e+00 -2.8669634626181160e+00 4.5107354587791454e-01 3.3242794422260578e+00 2.9282456589429908e+00 2.9236372650602366e-01 4.9138338390012821e+00 2.9153749840523266e+00 7.1009578993216221e-03 -4.5544597711552495e+00 -3.0627574631196448e+00 -4.6609404227905576e-01 -5.0515414198371555e+00 -3.0280004554858033e+00 3.4742534073277258e-02 4.6347203794729239e+00 3.0006735242340268e+00 2.6134035046096002e-02 7.5744024102165861e+00 3.3404713306050327e+00 -3.3193206505183798e-01 -7.0954896200907207e+00 -3.2270441166108119e+00 -1.3184582327073835e-02 -2.8396645482401581e+00 -4.1954826963258736e+00 4.8287439662320192e-01 2.6083447226259677e+00 4.4689270677349899e+00 3.1673596953709676e-01 2.9069549133439812e+00 5.3650796670399243e+00 1.0643616772589584e-02 -2.7245752905116363e+00 -5.7999031091616473e+00 -5.0173336259866663e-01 -3.0366710691886705e+00 -5.4543383228457474e+00 4.0649765516866179e-02 3.0186043077328573e+00 5.8950511377716364e+00 3.0546073044399279e-02 3.3404713306050327e+00 8.1500579408469633e+00 -3.6653187656841180e-01 -3.2734643663673744e+00 -8.4293916850602457e+00 1.0671718545903743e+00 4.4338297937593885e-01 4.8026563173867565e-01 -1.2532917245116575e+00 -5.2138419238649125e-01 -7.2857562417097399e-01 -2.3861231971056576e+00 -6.1544303654592525e-01 -7.1021695065841717e-01 2.2018347274929249e+00 2.4608570082551678e-01 3.5029667625270605e-01 2.3499416515549765e+00 5.8791295681154432e-01 7.2029059002115658e-01 -2.2270710001748548e+00 -3.9889820166048967e-01 -5.6466949697389246e-01 -4.4732726487917107e+00 -3.3193206505183787e-01 -3.6653187656841169e-01 4.7208103369456040e+00 5.9027585863174425e-01 8.1914105035915674e-01 1.8532834645770790e-01 3.2875133255705138e+00 2.6116071966101311e+00 -5.2670830600999574e-01 -2.9906188536118652e+00 -2.6352755414722888e+00 -5.7617907958731551e-01 -4.5341737024605164e+00 -2.6671766002704929e+00 2.9666258136923362e-01 4.1768743921277238e+00 2.7653934209124120e+00 5.9225856759749040e-01 4.5850994106149958e+00 2.9528911743633914e+00 -1.8103883663599354e-01 -4.2461545459320229e+00 -2.8696431885693374e+00 -3.8059913182287253e-01 -7.0954896200907207e+00 -3.2734643663673739e+00 5.9027585863174425e-01 6.8169495937818931e+00 3.1156679047935567e+00 1.9988545725755347e-01 2.9113546854521353e+00 4.4399219434101438e+00 -7.3670185438397728e-01 -2.6378366194141947e+00 -4.8018931270576211e+00 -7.4115092379183012e-01 -2.9817921010521613e+00 -5.6535749582717560e+00 4.1741515706941473e-01 2.7539129798718402e+00 6.0685444931961037e+00 7.1829587281038643e-01 2.9271947037917809e+00 5.7614026058980325e+00 -2.5650660097853034e-01 -2.8614574368321444e+00 -6.2573918789122569e+00 -4.2037815834217529e-01 -3.2270441166108115e+00 -8.4293916850602439e+00 8.1914105035915696e-01 3.1156679047935576e+00 8.8723826067975988e+00 324 325 326 1119 1120 1121 1185 1186 1187 726 727 728 327 328 329 1122 1123 1124 1188 1189 1190 729 730 731 6.7293179993511538e+00 3.1481450946336400e+00 5.9187829202010966e-01 -7.0036560719057910e+00 -3.2928954296780448e+00 -3.7369874201985459e-01 -4.2945392921937717e+00 -2.9242016790373180e+00 -1.8873389503722243e-01 4.6294791108258826e+00 2.9975914485155797e+00 5.9123996605485418e-01 4.1949006721308351e+00 2.8095593021543879e+00 2.9488416411255464e-01 -4.5452841510400068e+00 -2.7104198659199801e+00 -5.7988303779754269e-01 -3.0584015306903147e+00 -2.6909896648620522e+00 -5.2864912323927338e-01 3.3481832635220083e+00 2.6632107941937897e+00 1.9296237590637383e-01 3.1481450946336396e+00 8.7904802043598913e+00 8.1905018816462960e-01 -3.2622518556546667e+00 -8.3485795953386450e+00 -4.1403481188240215e-01 -2.9100904373665846e+00 -6.3193347268364279e+00 -2.6607019376519214e-01 2.9816437974162424e+00 5.8279184304145133e+00 7.1809037401476028e-01 2.8008187616760614e+00 6.0964603989760091e+00 4.1350115847513780e-01 -3.0241074791937326e+00 -5.6868999056759479e+00 -7.4537213222786858e-01 -2.6933284305854466e+00 -4.8850511179992822e+00 -7.3649640902169444e-01 2.9591705490744848e+00 4.5250063120998911e+00 2.1133182624262881e-01 5.9187829202010966e-01 8.1905018816462938e-01 4.6030114914393074e+00 -3.4208084970646524e-01 -3.7909683221168744e-01 -4.3594643313788453e+00 -4.0580215714998225e-01 -5.7235664846305034e-01 -2.2336546520159146e+00 5.9230144806612794e-01 7.2435652007332874e-01 2.3518144902650446e+00 2.5722665638398484e-01 3.6378043340305566e-01 2.1818153874337742e+00 -6.1535641852354095e-01 -7.1165918894000457e-01 -2.3622100471652190e+00 -5.2614829496945081e-01 -7.3239419672962958e-01 -1.2719534973373265e+00 4.4798132387921619e-01 4.8831972470335838e-01 1.0906411587591791e+00 -7.0036560719057901e+00 -3.2622518556546667e+00 -3.4208084970646507e-01 7.4696078499688268e+00 3.3638634209493712e+00 3.1230591948369330e-02 4.6757799763425112e+00 3.0515097489349179e+00 4.5684000383514771e-02 -5.0852997946985079e+00 -3.0709629208517253e+00 -4.6680979826230429e-01 -4.5644827919209030e+00 -3.1028169760875377e+00 2.2904805484923732e-03 4.9162935814838402e+00 2.9564977663780718e+00 3.0257724948084103e-01 3.3878385332190080e+00 2.9774789108239976e+00 4.5113440620169132e-01 -3.7960812824889816e+00 -2.9133180944924293e+00 -2.4026080594138605e-02 -3.2928954296780457e+00 -8.3485795953386450e+00 -3.7909683221168755e-01 3.3638634209493716e+00 8.0644377008479342e+00 3.5885877003754361e-02 3.0602703136146450e+00 5.9531650540120271e+00 5.3539457580297045e-02 -3.0855642805503591e+00 -5.5156039773727290e+00 -5.0463596792155663e-01 -2.7650714796615397e+00 -5.8227703389390513e+00 5.4713746307377981e-03 2.9446300263988054e+00 5.3948406451032529e+00 3.2858090636183318e-01 2.6606354847529810e+00 4.5493936411406359e+00 4.8504288196160145e-01 -2.8858680558258554e+00 -4.2748831294534284e+00 -2.4787697404978860e-02 -3.7369874201985465e-01 -4.1403481188240215e-01 -4.3594643313788453e+00 3.1230591948369312e-02 3.5885877003754368e-02 4.3918304260265399e+00 2.6287675927854436e-02 3.0009856690544335e-02 2.2217776444813739e+00 -1.9623902832525350e-01 -2.0954113978554989e-01 -2.2230685408335034e+00 5.7388857269448186e-03 4.3964684563734500e-03 -2.2116928226042054e+00 3.3612220411439664e-01 3.6838881767910331e-01 2.1926327341180660e+00 1.7612993590578979e-01 1.8980899429539025e-01 1.1133622234471272e+00 -5.5715232782469586e-03 -4.9140624572137550e-03 -1.1253773332565533e+00 -4.2945392921937726e+00 -2.9100904373665841e+00 -4.0580215714998225e-01 4.6757799763425121e+00 3.0602703136146450e+00 2.6287675927854411e-02 6.9675600625167560e+00 3.4082697220124238e+00 6.0657276661490719e-02 -7.2979063285527381e+00 -3.4831459925267154e+00 -3.4991349451785730e-01 -3.0752495597482010e+00 -2.7625593346632717e+00 -5.8555939700500343e-03 3.3879114740366010e+00 2.6552944407763652e+00 3.8522454451618493e-01 4.4221758111343732e+00 3.0064214008996446e+00 3.0913874800190078e-01 -4.7857321435355296e+00 -2.9744601127465091e+00 -1.9736999469540488e-02 -2.9242016790373180e+00 -6.3193347268364279e+00 -5.7235664846305045e-01 3.0515097489349179e+00 5.9531650540120271e+00 3.0009856690544328e-02 3.4082697220124247e+00 9.2539611130360058e+00 8.1004602123738917e-02 -3.4925052551952058e+00 -8.7214061471860678e+00 -4.7474681979154293e-01 -2.7355025521610616e+00 -5.0143682145130990e+00 -9.8820937426006179e-03 2.9849341701879331e+00 4.5362662076510389e+00 5.4137479383406117e-01 2.9944444564987993e+00 6.4361293749532758e+00 4.2968781641200604e-01 -3.2869486112404851e+00 -6.1244126611167555e+00 -2.5091507063155487e-02 -1.8873389503722246e-01 -2.6607019376519220e-01 -2.2336546520159146e+00 4.5684000383514785e-02 5.3539457580297045e-02 2.2217776444813739e+00 6.0657276661490726e-02 8.1004602123738945e-02 4.5180462818286173e+00 -3.4612026760172099e-01 -4.6885777075784718e-01 -4.4915875469838191e+00 -2.5537315062021528e-02 -3.7910312039860616e-02 -1.1294119269749170e+00 1.7123966999678134e-01 2.3705866955344990e-01 1.1171765129310833e+00 3.0645245294042905e-01 4.2945814104060281e-01 2.2692618955341928e+00 -2.3641922281250907e-02 -2.8222593735188647e-02 -2.2716082088006155e+00 4.6294791108258817e+00 2.9816437974162420e+00 5.9230144806612794e-01 -5.0852997946985079e+00 -3.0855642805503591e+00 -1.9623902832525350e-01 -7.2979063285527390e+00 -3.4925052551952058e+00 -3.4612026760172099e-01 7.8100381625254256e+00 3.5111599553785582e+00 7.2124958164363728e-01 3.3449212840045597e+00 2.9905371722760603e+00 1.4926709224186335e-01 -3.7768603625321182e+00 -2.8289293934325128e+00 -6.1603299087269914e-01 -4.7655746117592868e+00 -3.2285776387849792e+00 -6.5544391150617765e-01 5.1412025401867787e+00 3.1522356428921983e+00 3.5101807635422200e-01 2.9975914485155797e+00 5.8279184304145133e+00 7.2435652007332862e-01 -3.0709629208517253e+00 -5.5156039773727281e+00 -2.0954113978554989e-01 -3.4831459925267154e+00 -8.7214061471860660e+00 -4.6885777075784718e-01 3.5111599553785577e+00 8.3675412164251171e+00 7.7809577820793163e-01 2.6402846647518627e+00 4.5180757391435735e+00 2.1226458764159059e-01 -2.8397228237591903e+00 -4.1585307525684270e+00 -6.6158935491422510e-01 -2.8988349528619533e+00 -5.9911473814547174e+00 -7.5842897594131009e-01 3.1436306213535810e+00 5.6731528725987364e+00 3.8370035547608039e-01 5.9123996605485418e-01 7.1809037401476028e-01 2.3518144902650446e+00 -4.6680979826230429e-01 -5.0463596792155641e-01 -2.2230685408335034e+00 -3.4991349451785725e-01 -4.7474681979154293e-01 -4.4915875469838182e+00 7.2124958164363706e-01 7.7809577820793174e-01 4.7270796088321738e+00 3.7588362810057530e-01 5.3631008638066424e-01 1.0849099364183037e+00 -6.0653532764595375e-01 -6.4892658307895934e-01 -1.2677977093770254e+00 -6.0903432383027578e-01 -7.8337657333695987e-01 -2.4327061527986733e+00 3.4391976845732397e-01 3.7918970552566306e-01 2.2513559144774979e+00 4.1949006721308351e+00 2.8008187616760609e+00 2.5722665638398484e-01 -4.5644827919209021e+00 -2.7650714796615397e+00 5.7388857269447761e-03 -3.0752495597482010e+00 -2.7355025521610612e+00 -2.5537315062021521e-02 3.3449212840045597e+00 2.6402846647518627e+00 3.7588362810057530e-01 6.7921195856617693e+00 3.1709945101758521e+00 3.3074840008065473e-02 -7.0375037200830217e+00 -3.2724728738653299e+00 -2.9206660182007527e-01 -4.2931467918478567e+00 -2.8637882003075981e+00 -3.9739286248767963e-01 4.6384413218028131e+00 3.0247371693917535e+00 4.3072769150205373e-02 2.8095593021543879e+00 6.0964603989760091e+00 3.6378043340305566e-01 -3.1028169760875368e+00 -5.8227703389390513e+00 4.3964684563734362e-03 -2.7625593346632722e+00 -5.0143682145130999e+00 -3.7910312039860637e-02 2.9905371722760603e+00 4.5180757391435744e+00 5.3631008638066424e-01 3.1709945101758521e+00 8.9819323553681087e+00 4.3721028902896621e-02 -3.2094285445655899e+00 -8.3880906354077709e+00 -4.0131669141221205e-01 -2.8798319492049784e+00 -6.3192332487604377e+00 -5.6343958463416000e-01 2.9835458199150739e+00 5.9479939441326710e+00 5.4458570943241906e-02 2.9488416411255464e-01 4.1350115847513780e-01 2.1818153874337738e+00 2.2904805484923870e-03 5.4713746307377860e-03 -2.2116928226042054e+00 -5.8555939700500274e-03 -9.8820937426006214e-03 -1.1294119269749170e+00 1.4926709224186333e-01 2.1226458764159059e-01 1.0849099364183039e+00 3.3074840008065480e-02 4.3721028902896607e-02 4.5340698897527876e+00 -3.3049030095429016e-01 -4.5656304096512990e-01 -4.4371016198039941e+00 -1.6639484606428709e-01 -2.3907789739399921e-01 -2.2705567088286069e+00 2.3224164077651425e-02 3.0564882451366876e-02 2.2479678646068564e+00 -4.5452841510400068e+00 -3.0241074791937330e+00 -6.1535641852354095e-01 4.9162935814838411e+00 2.9446300263988054e+00 3.3612220411439664e-01 3.3879114740366010e+00 2.9849341701879331e+00 1.7123966999678134e-01 -3.7768603625321182e+00 -2.8397228237591903e+00 -6.0653532764595375e-01 -7.0375037200830217e+00 -3.2094285445655899e+00 -3.3049030095429016e-01 7.4777247912227658e+00 3.2543258875936738e+00 6.7541673998961882e-01 4.6494550133975467e+00 2.9314219997923350e+00 5.8191440819896267e-01 -5.0717366264856061e+00 -3.0420532364542354e+00 -2.1231097517597386e-01 -2.7104198659199796e+00 -5.6868999056759471e+00 -7.1165918894000479e-01 2.9564977663780723e+00 5.3948406451032529e+00 3.6838881767910342e-01 2.6552944407763652e+00 4.5362662076510389e+00 2.3705866955344987e-01 -2.8289293934325124e+00 -4.1585307525684270e+00 -6.4892658307895934e-01 -3.2724728738653299e+00 -8.3880906354077709e+00 -4.5656304096512990e-01 3.2543258875936738e+00 7.9878334829839162e+00 7.2782697473122948e-01 2.9653227932589634e+00 5.8284687172705807e+00 7.1324036481572417e-01 -3.0196187547892497e+00 -5.5138877593566438e+00 -2.2936601379541210e-01 -5.7988303779754280e-01 -7.4537213222786880e-01 -2.3622100471652194e+00 3.0257724948084103e-01 3.2858090636183324e-01 2.1926327341180665e+00 3.8522454451618493e-01 5.4137479383406117e-01 1.1171765129310833e+00 -6.1603299087269903e-01 -6.6158935491422510e-01 -1.2677977093770254e+00 -2.9206660182007527e-01 -4.0131669141221227e-01 -4.4371016198039941e+00 6.7541673998961882e-01 7.2782697473122948e-01 4.6207102316191184e+00 5.8919476696286821e-01 7.1478202675779745e-01 2.4036115173063792e+00 -4.6443067045919528e-01 -5.0428652313061573e-01 -2.2670216196284096e+00 -3.0584015306903147e+00 -2.6933284305854475e+00 -5.2614829496945081e-01 3.3878385332190080e+00 2.6606354847529810e+00 1.7612993590578979e-01 4.4221758111343732e+00 2.9944444564987998e+00 3.0645245294042905e-01 -4.7655746117592868e+00 -2.8988349528619533e+00 -6.0903432383027578e-01 -4.2931467918478576e+00 -2.8798319492049784e+00 -1.6639484606428706e-01 4.6494550133975467e+00 2.9653227932589634e+00 5.8919476696286821e-01 6.9922073001939484e+00 3.3033587911132800e+00 6.2092268166089037e-01 -7.3345537236474172e+00 -3.4517661929716446e+00 -3.9112237260596305e-01 -2.6909896648620522e+00 -4.8850511179992822e+00 -7.3239419672962947e-01 2.9774789108239976e+00 4.5493936411406359e+00 1.8980899429539022e-01 3.0064214008996450e+00 6.4361293749532749e+00 4.2945814104060287e-01 -3.2285776387849792e+00 -5.9911473814547174e+00 -7.8337657333695987e-01 -2.8637882003075981e+00 -6.3192332487604386e+00 -2.3907789739399921e-01 2.9314219997923350e+00 5.8284687172705807e+00 7.1478202675779734e-01 3.3033587911132791e+00 9.1605401191218174e+00 8.5986409012472098e-01 -3.4353255986746243e+00 -8.7791001042718726e+00 -4.3906458475792220e-01 -5.2864912323927338e-01 -7.3649640902169433e-01 -1.2719534973373265e+00 4.5113440620169132e-01 4.8504288196160145e-01 1.1133622234471272e+00 3.0913874800190072e-01 4.2968781641200610e-01 2.2692618955341928e+00 -6.5544391150617765e-01 -7.5842897594131009e-01 -2.4327061527986733e+00 -3.9739286248767963e-01 -5.6343958463416000e-01 -2.2705567088286069e+00 5.8191440819896267e-01 7.1324036481572417e-01 2.4036115173063792e+00 6.2092268166089037e-01 8.5986409012472098e-01 4.7625871155074613e+00 -3.8162434683031388e-01 -4.2947018371688850e-01 -4.5736063928305537e+00 3.3481832635220083e+00 2.9591705490744853e+00 4.4798132387921619e-01 -3.7960812824889816e+00 -2.8858680558258554e+00 -5.5715232782469828e-03 -4.7857321435355296e+00 -3.2869486112404847e+00 -2.3641922281250921e-02 5.1412025401867787e+00 3.1436306213535810e+00 3.4391976845732403e-01 4.6384413218028131e+00 2.9835458199150739e+00 2.3224164077651415e-02 -5.0717366264856061e+00 -3.0196187547892492e+00 -4.6443067045919528e-01 -7.3345537236474172e+00 -3.4353255986746243e+00 -3.8162434683031393e-01 7.8602766506459290e+00 3.5414140301870747e+00 6.0143206434814675e-02 2.6632107941937897e+00 4.5250063120998920e+00 4.8831972470335838e-01 -2.9133180944924297e+00 -4.2748831294534293e+00 -4.9140624572137585e-03 -2.9744601127465091e+00 -6.1244126611167555e+00 -2.8222593735188706e-02 3.1522356428921983e+00 5.6731528725987364e+00 3.7918970552566311e-01 3.0247371693917535e+00 5.9479939441326710e+00 3.0564882451366869e-02 -3.0420532364542359e+00 -5.5138877593566438e+00 -5.0428652313061584e-01 -3.4517661929716446e+00 -8.7791001042718744e+00 -4.2947018371688844e-01 3.5414140301870747e+00 8.5461305253674045e+00 6.8819050359517547e-02 1.9296237590637383e-01 2.1133182624262881e-01 1.0906411587591789e+00 -2.4026080594138594e-02 -2.4787697404978864e-02 -1.1253773332565533e+00 -1.9736999469540488e-02 -2.5091507063155501e-02 -2.2716082088006155e+00 3.5101807635422200e-01 3.8370035547608039e-01 2.2513559144774979e+00 4.3072769150205380e-02 5.4458570943241913e-02 2.2479678646068564e+00 -2.1231097517597386e-01 -2.2936601379541210e-01 -2.2670216196284096e+00 -3.9112237260596300e-01 -4.3906458475792220e-01 -4.5736063928305537e+00 6.0143206434814689e-02 6.8819050359517547e-02 4.6476486166725994e+00 1119 1120 1121 1146 1147 1148 1233 1234 1235 1185 1186 1187 1122 1123 1124 1149 1150 1151 1236 1237 1238 1188 1189 1190 6.8169495937819526e+00 3.1156679047936953e+00 5.9027585863177157e-01 -7.0954896200907980e+00 -3.2734643663674978e+00 -3.8059913182287120e-01 -4.2461545459321224e+00 -2.8696431885694889e+00 -1.8103883663599485e-01 4.5850994106151131e+00 2.9528911743635242e+00 5.9225856759751927e-01 4.1768743921278242e+00 2.7653934209125577e+00 2.9666258136923401e-01 -4.5341737024606346e+00 -2.6671766002706212e+00 -5.7617907958734393e-01 -2.9906188536119700e+00 -2.6352755414724367e+00 -5.2670830601002483e-01 3.2875133255706368e+00 2.6116071966102670e+00 1.8532834645770901e-01 3.1156679047936953e+00 8.8723826067977498e+00 8.1914105035919471e-01 -3.2270441166109776e+00 -8.4293916850603825e+00 -4.2037815834217374e-01 -2.8614574368322936e+00 -6.2573918789124585e+00 -2.5650660097853201e-01 2.9271947037919555e+00 5.7614026058982111e+00 7.1829587281042673e-01 2.7539129798719824e+00 6.0685444931963044e+00 4.1741515706941523e-01 -2.9817921010523283e+00 -5.6535749582719337e+00 -7.4115092379186975e-01 -2.6378366194143430e+00 -4.8018931270578271e+00 -7.3670185438401825e-01 2.9113546854523089e+00 4.4399219434103330e+00 1.9988545725755497e-01 5.9027585863177146e-01 8.1914105035919482e-01 4.7208103369455729e+00 -3.3193206505187139e-01 -3.6653187656844760e-01 -4.4732726487916707e+00 -3.9889820166051920e-01 -5.6466949697393409e-01 -2.2270710001748477e+00 5.8791295681157840e-01 7.2029059002119311e-01 2.3499416515549765e+00 2.4608570082554490e-01 3.5029667625274602e-01 2.2018347274929235e+00 -6.1544303654595722e-01 -7.1021695065845103e-01 -2.3861231971056633e+00 -5.2138419238651978e-01 -7.2857562417101407e-01 -1.2532917245116648e+00 4.4338297937597299e-01 4.8026563173871273e-01 1.0671718545903737e+00 -7.0954896200907989e+00 -3.2270441166109776e+00 -3.3193206505187128e-01 7.5744024102166874e+00 3.3404713306051832e+00 2.6134035046095818e-02 4.6347203794730421e+00 3.0006735242342053e+00 3.4742534073278819e-02 -5.0515414198372932e+00 -3.0280004554859605e+00 -4.6609404227908996e-01 -4.5544597711553694e+00 -3.0627574631198171e+00 7.1009578993219101e-03 4.9138338390014216e+00 2.9153749840524776e+00 2.9236372650605641e-01 3.3242794422261817e+00 2.9282456589431662e+00 4.5107354587794890e-01 -3.7457452598338721e+00 -2.8669634626182763e+00 -1.3388692071739049e-02 -3.2734643663674974e+00 -8.4293916850603825e+00 -3.6653187656844766e-01 3.3404713306051823e+00 8.1500579408470877e+00 3.0546073044398957e-02 3.0186043077329932e+00 5.8950511377718211e+00 4.0649765516867858e-02 -3.0366710691888303e+00 -5.4543383228459081e+00 -5.0173336259870382e-01 -2.7245752905117664e+00 -5.7999031091618329e+00 1.0643616772589987e-02 2.9069549133441344e+00 5.3650796670400842e+00 3.1673596953713218e-01 2.6083447226261032e+00 4.4689270677351773e+00 4.8287439662323905e-01 -2.8396645482403176e+00 -4.1954826963260459e+00 -1.3184582327075096e-02 -3.8059913182287108e-01 -4.2037815834217379e-01 -4.4732726487916707e+00 2.6134035046095815e-02 3.0546073044398964e-02 4.5111387607571132e+00 2.0402488651846698e-02 2.3123538018749491e-02 2.2201508697391747e+00 -1.9350750040807033e-01 -2.0658909392739627e-01 -2.2211948479228654e+00 1.2722585855907752e-02 1.3744349514683285e-02 -2.2367382989568561e+00 3.4007139028739142e-01 3.7177579633179908e-01 2.2153348895565141e+00 1.7340847542475635e-01 1.8508995994929600e-01 1.0923040786293439e+00 1.3676569649433582e-03 2.6875354106431410e-03 -1.1077228030107540e+00 -4.2461545459321224e+00 -2.8614574368322936e+00 -3.9889820166051909e-01 4.6347203794730421e+00 3.0186043077329932e+00 2.0402488651846691e-02 6.7814738508375800e+00 3.3365568226448823e+00 4.8530057041895405e-02 -7.1137572603837818e+00 -3.4147975582821202e+00 -3.4606574818675928e-01 -3.0104457087293213e+00 -2.7131296951713524e+00 -1.2141871509087996e-03 3.3282024458750512e+00 2.6034283578218029e+00 3.7846576120078218e-01 4.2610121034262880e+00 2.9384093160558962e+00 3.0808005990997922e-01 -4.6350512645667346e+00 -2.9076141139698075e+00 -9.3002298063151155e-03 -2.8696431885694884e+00 -6.2573918789124576e+00 -5.6466949697393398e-01 3.0006735242342053e+00 5.8950511377718193e+00 2.3123538018749487e-02 3.3365568226448827e+00 9.0460230487573821e+00 6.4309690182278015e-02 -3.4217554357840902e+00 -8.5085233417875568e+00 -4.7208734706898159e-01 -2.6798374320911522e+00 -4.9375789845830811e+00 -3.4074155789919512e-03 2.9380858693309881e+00 4.4525203960231892e+00 5.3509175203383952e-01 2.9242299738181563e+00 6.2545343362905648e+00 4.2950633353989021e-01 -3.2283101335835007e+00 -5.9446347135598590e+00 -1.1867054152847769e-02 -1.8103883663599482e-01 -2.5650660097853201e-01 -2.2270710001748473e+00 3.4742534073278826e-02 4.0649765516867886e-02 2.2201508697391747e+00 4.8530057041895391e-02 6.4309690182278043e-02 4.3922603383440650e+00 -3.3350993231326659e-01 -4.5575645908077411e-01 -4.3622983725935436e+00 -1.4842953175491554e-02 -2.2958181725718403e-02 -1.1100417531038014e+00 1.6187702638272483e-01 2.2750340821480886e-01 1.0948187184296481e+00 2.9422918626937689e-01 4.1433852476071503e-01 2.1636932638142201e+00 -9.9870816425229603e-03 -1.1580146889645282e-02 -2.1715120644549133e+00 4.5850994106151131e+00 2.9271947037919555e+00 5.8791295681157829e-01 -5.0515414198372923e+00 -3.0366710691888308e+00 -1.9350750040807033e-01 -7.1137572603837818e+00 -3.4217554357840911e+00 -3.3350993231326659e-01 7.6355661736612106e+00 3.4417617982899498e+00 7.2116138098641758e-01 3.2807252666698310e+00 2.9418992201275942e+00 1.4465894841492627e-01 -3.7232467458795542e+00 -2.7755318910786899e+00 -6.1218762735603616e-01 -4.6069825338439365e+00 -3.1647262722138376e+00 -6.5309275285826296e-01 4.9941371089984123e+00 3.0878289460559483e+00 3.3856452672271242e-01 2.9528911743635242e+00 5.7614026058982102e+00 7.2029059002119300e-01 -3.0280004554859605e+00 -5.4543383228459081e+00 -2.0658909392739627e-01 -3.4147975582821211e+00 -8.5085233417875585e+00 -4.5575645908077411e-01 3.4417617982899498e+00 8.1569839935454205e+00 7.7508975226595922e-01 2.5876873265768978e+00 4.4352127573692863e+00 2.0830992831319614e-01 -2.7936713505359605e+00 -4.0736952652005671e+00 -6.5551355117804277e-01 -2.8279983108435025e+00 -5.8073996965215882e+00 -7.5437522580539462e-01 3.0821273759171732e+00 5.4903572695427005e+00 3.6854405939125778e-01 5.9225856759751927e-01 7.1829587281042673e-01 2.3499416515549765e+00 -4.6609404227909007e-01 -5.0173336259870394e-01 -2.2211948479228654e+00 -3.4606574818675923e-01 -4.7208734706898159e-01 -4.3622983725935445e+00 7.2116138098641758e-01 7.7508975226595922e-01 4.6080192727323581e+00 3.7264111639386865e-01 5.3522369027447103e-01 1.0625619348399074e+00 -6.0967102341023893e-01 -6.4863304001452404e-01 -1.2509352069009323e+00 -6.0794447503296600e-01 -7.8352024520384234e-01 -2.3336674342852848e+00 3.4371422393124895e-01 3.7736467953519481e-01 2.1475730025753847e+00 4.1768743921278242e+00 2.7539129798719824e+00 2.4608570082554490e-01 -4.5544597711553703e+00 -2.7245752905117664e+00 1.2722585855907739e-02 -3.0104457087293213e+00 -2.6798374320911522e+00 -1.4842953175491561e-02 3.2807252666698310e+00 2.5876873265768974e+00 3.7264111639386854e-01 6.7281273517273190e+00 3.1196612368797689e+00 2.7285561460303160e-02 -6.9753970465350275e+00 -3.2238858033863238e+00 -2.8134659329019651e-01 -4.1617898150301862e+00 -2.7968401518183592e+00 -3.9428035580434356e-01 4.5163653309249305e+00 2.9638771344789530e+00 3.1734937734405978e-02 2.7653934209125572e+00 6.0685444931963062e+00 3.5029667625274596e-01 -3.0627574631198171e+00 -5.7999031091618329e+00 1.3744349514683212e-02 -2.7131296951713524e+00 -4.9375789845830811e+00 -2.2958181725718400e-02 2.9418992201275942e+00 4.4352127573692863e+00 5.3522369027447103e-01 3.1196612368797689e+00 8.9101464609054588e+00 3.5551788698128535e-02 -3.1618567116210912e+00 -8.3047865278121975e+00 -3.8990166427919060e-01 -2.8200449459727124e+00 -6.1727997065790658e+00 -5.6211569615315227e-01 2.9308349379650522e+00 5.8011646166651252e+00 4.0159037418030695e-02 2.9666258136923396e-01 4.1741515706941518e-01 2.2018347274929235e+00 7.1009578993219101e-03 1.0643616772589999e-02 -2.2367382989568565e+00 -1.2141871509087996e-03 -3.4074155789919477e-03 -1.1100417531038014e+00 1.4465894841492627e-01 2.0830992831319614e-01 1.0625619348399074e+00 2.7285561460303143e-02 3.5551788698128535e-02 4.5155750301643316e+00 -3.3057741203452479e-01 -4.5830353879345770e-01 -4.4134963724991358e+00 -1.6113241170328726e-01 -2.3259234905661649e-01 -2.1925330913967280e+00 1.7215961744935501e-02 2.2382812575736172e-02 2.1728378234593588e+00 -4.5341737024606354e+00 -2.9817921010523283e+00 -6.1544303654595733e-01 4.9138338390014225e+00 2.9069549133441344e+00 3.4007139028739142e-01 3.3282024458750512e+00 2.9380858693309881e+00 1.6187702638272480e-01 -3.7232467458795546e+00 -2.7936713505359605e+00 -6.0967102341023893e-01 -6.9753970465350275e+00 -3.1618567116210912e+00 -3.3057741203452479e-01 7.4269255956929667e+00 3.2065753748648240e+00 6.7419803731869232e-01 4.5238271158429564e+00 2.8756917941407938e+00 5.8199598439042388e-01 -4.9599715015371810e+00 -2.9899877884713604e+00 -2.0245096638851040e-01 -2.6671766002706212e+00 -5.6535749582719328e+00 -7.1021695065845103e-01 2.9153749840524776e+00 5.3650796670400842e+00 3.7177579633179908e-01 2.6034283578218029e+00 4.4525203960231892e+00 2.2750340821480880e-01 -2.7755318910786899e+00 -4.0736952652005671e+00 -6.4863304001452415e-01 -3.2238858033863242e+00 -8.3047865278121975e+00 -4.5830353879345775e-01 3.2065753748648249e+00 7.9016112941386965e+00 7.2319501441760925e-01 2.9009188997999606e+00 5.6777890063006682e+00 7.1177671824855948e-01 -2.9597033218034308e+00 -5.3649436122179388e+00 -2.1709740774634220e-01 -5.7617907958734382e-01 -7.4115092379186975e-01 -2.3861231971056633e+00 2.9236372650605646e-01 3.1673596953713218e-01 2.2153348895565141e+00 3.7846576120078224e-01 5.3509175203383952e-01 1.0948187184296483e+00 -6.1218762735603605e-01 -6.5551355117804266e-01 -1.2509352069009323e+00 -2.8134659329019651e-01 -3.8990166427919071e-01 -4.4134963724991358e+00 6.7419803731869232e-01 7.2319501441760914e-01 4.6019199819140955e+00 5.8379182090015236e-01 7.0851160204228425e-01 2.3297736749329938e+00 -4.5910604569210695e-01 -4.9696819878176185e-01 -2.1912924883275204e+00 -2.9906188536119700e+00 -2.6378366194143430e+00 -5.2138419238651978e-01 3.3242794422261817e+00 2.6083447226261027e+00 1.7340847542475640e-01 4.2610121034262880e+00 2.9242299738181572e+00 2.9422918626937689e-01 -4.6069825338439365e+00 -2.8279983108435025e+00 -6.0794447503296611e-01 -4.1617898150301862e+00 -2.8200449459727124e+00 -1.6113241170328724e-01 4.5238271158429573e+00 2.9009188997999606e+00 5.8379182090015236e-01 6.6285070847034300e+00 3.2037562110252509e+00 6.1419327091539999e-01 -6.9782345437127642e+00 -3.3513699310389140e+00 -3.7516167438691117e-01 -2.6352755414724367e+00 -4.8018931270578271e+00 -7.2857562417101407e-01 2.9282456589431654e+00 4.4689270677351773e+00 1.8508995994929603e-01 2.9384093160558962e+00 6.2545343362905648e+00 4.1433852476071509e-01 -3.1647262722138367e+00 -5.8073996965215882e+00 -7.8352024520384222e-01 -2.7968401518183592e+00 -6.1727997065790658e+00 -2.3259234905661649e-01 2.8756917941407942e+00 5.6777890063006682e+00 7.0851160204228425e-01 3.2037562110252513e+00 8.7644519146656013e+00 8.5460046750755758e-01 -3.3492610146604740e+00 -8.3836097948335304e+00 -4.1785233582837839e-01 -5.2670830601002505e-01 -7.3670185438401825e-01 -1.2532917245116648e+00 4.5107354587794890e-01 4.8287439662323917e-01 1.0923040786293439e+00 3.0808005990997922e-01 4.2950633353989032e-01 2.1636932638142201e+00 -6.5309275285826296e-01 -7.5437522580539462e-01 -2.3336674342852848e+00 -3.9428035580434356e-01 -5.6211569615315227e-01 -2.1925330913967280e+00 5.8199598439042388e-01 7.1177671824855959e-01 2.3297736749329938e+00 6.1419327091539988e-01 8.5460046750755736e-01 4.4846073324595244e+00 -3.8126144642112059e-01 -4.2556513957668124e-01 -4.2908860996424032e+00 3.2875133255706368e+00 2.9113546854523089e+00 4.4338297937597293e-01 -3.7457452598338712e+00 -2.8396645482403176e+00 1.3676569649433614e-03 -4.6350512645667346e+00 -3.2283101335835012e+00 -9.9870816425229464e-03 4.9941371089984123e+00 3.0821273759171732e+00 3.4371422393124895e-01 4.5163653309249296e+00 2.9308349379650522e+00 1.7215961744935494e-02 -4.9599715015371810e+00 -2.9597033218034308e+00 -4.5910604569210700e-01 -6.9782345437127642e+00 -3.3492610146604744e+00 -3.8126144642112053e-01 7.5209868041565713e+00 3.4526220189531887e+00 4.4673751738648272e-02 2.6116071966102670e+00 4.4399219434103330e+00 4.8026563173871278e-01 -2.8669634626182758e+00 -4.1954826963260459e+00 2.6875354106431276e-03 -2.9076141139698075e+00 -5.9446347135598607e+00 -1.1580146889645268e-02 3.0878289460559483e+00 5.4903572695427005e+00 3.7736467953519487e-01 2.9638771344789530e+00 5.8011646166651252e+00 2.2382812575736172e-02 -2.9899877884713599e+00 -5.3649436122179388e+00 -4.9696819878176185e-01 -3.3513699310389131e+00 -8.3836097948335304e+00 -4.2556513957668141e-01 3.4526220189531891e+00 8.1572269873192145e+00 5.1412825987799976e-02 1.8532834645770896e-01 1.9988545725755494e-01 1.0671718545903737e+00 -1.3388692071739042e-02 -1.3184582327075077e-02 -1.1077228030107538e+00 -9.3002298063151155e-03 -1.1867054152847757e-02 -2.1715120644549133e+00 3.3856452672271242e-01 3.6854405939125778e-01 2.1475730025753847e+00 3.1734937734405971e-02 4.0159037418030702e-02 2.1728378234593588e+00 -2.0245096638851040e-01 -2.1709740774634220e-01 -2.1912924883275204e+00 -3.7516167438691117e-01 -4.1785233582837844e-01 -4.2908860996424032e+00 4.4673751738648293e-02 5.1412825987799990e-02 4.3738307748104743e+00 726 727 728 1185 1186 1187 1197 1198 1199 738 739 740 729 730 731 1188 1189 1190 1200 1201 1202 741 742 743 6.3687932890808057e+00 2.8614349457561516e+00 4.8516482276364703e-01 -6.5990825108068698e+00 -3.1627428907781354e+00 -3.5319727282318225e-01 -3.6828086522274295e+00 -2.6079326480685792e+00 -1.8246103855797735e-01 3.9791974069424123e+00 2.8553687637520353e+00 4.9904843034638235e-01 3.6611792481708081e+00 2.5576490660469404e+00 2.6499747355103936e-01 -3.9767496450557074e+00 -2.5994319535372323e+00 -4.8363416119632396e-01 -2.3802688986791773e+00 -2.4206315466194912e+00 -4.2710946375508052e-01 2.6297397625751593e+00 2.5162862634483116e+00 1.9719120967149492e-01 2.8614349457561516e+00 1.1228650613271920e+01 1.0520767432927316e+00 -3.1299720418003774e+00 -1.0830351771528830e+01 -6.0333843274380949e-01 -2.5975515866778851e+00 -8.2501035055119551e+00 -4.0410918727020667e-01 2.8333956004502161e+00 7.7775207477166290e+00 9.2770144441163327e-01 2.5539114014493474e+00 8.0656174697705723e+00 5.8002857789859841e-01 -2.9455409404149253e+00 -7.6729155847580914e+00 -9.6072516466306257e-01 -2.4250651678884227e+00 -6.5791910381734224e+00 -9.3408171559593756e-01 2.8493877891258959e+00 6.2607730692131751e+00 3.4244773467005180e-01 4.8516482276364703e-01 1.0520767432927316e+00 5.2243301360087955e+00 -3.2911302211405519e-01 -5.6432575686328512e-01 -4.9754056584124129e+00 -3.4094696289860482e-01 -7.5390276506213305e-01 -2.5368953696728385e+00 4.9762806308724411e-01 9.3326960565635364e-01 2.6521047829890705e+00 2.4075996332437022e-01 5.2935505457862142e-01 2.5083774632240279e+00 -5.3123088315914013e-01 -9.3473440308144939e-01 -2.6861901471722427e+00 -4.2675823639927163e-01 -9.3163909801088873e-01 -1.4375692037933696e+00 4.0449625539581052e-01 6.6990061949004953e-01 1.2512479968289703e+00 -6.5990825108068698e+00 -3.1299720418003778e+00 -3.2911302211405519e-01 7.0398686413917968e+00 3.3947532508762399e+00 9.4437389273127670e-02 4.0134555596105939e+00 2.8935908088963789e+00 8.7868885433408261e-02 -4.4154402820407279e+00 -3.0917567771820105e+00 -4.2349590249827229e-01 -3.9874779059887104e+00 -3.0075378637204802e+00 -6.0977059131340480e-02 4.3364365852481228e+00 3.0067105873532300e+00 2.9972935915294213e-01 2.6697369418277939e+00 2.8670647003800087e+00 4.0668353333581009e-01 -3.0574970292419965e+00 -2.9328526648029882e+00 -7.5133183451619720e-02 -3.1627428907781354e+00 -1.0830351771528830e+01 -5.6432575686328523e-01 3.3947532508762399e+00 1.0572166987368563e+01 1.5812184981944222e-01 2.9072731338480113e+00 7.9344176166865035e+00 1.6303550155027627e-01 -3.1021446824435799e+00 -7.5065445242720168e+00 -6.8885169784215039e-01 -2.6439659271828551e+00 -7.8311618672839201e+00 -1.0485632485411270e-01 2.9967545503075095e+00 7.4157261381225403e+00 4.9077557592620574e-01 2.5194696753154293e+00 6.2926455785056872e+00 6.6687550525770234e-01 -2.9093971099426206e+00 -6.0468981575985312e+00 -1.2077465299407746e-01 -3.5319727282318220e-01 -6.0333843274380972e-01 -4.9754056584124129e+00 9.4437389273127711e-02 1.5812184981944222e-01 4.9845638867322535e+00 7.9022433931131342e-02 1.4578053127361434e-01 2.5077827478202659e+00 -2.1604776201214654e-01 -3.4788623227672305e-01 -2.5270874650085422e+00 -5.0747502700239006e-02 -1.0511820003976803e-01 -2.5142989685520583e+00 3.2195566180626106e-01 5.3076904036946804e-01 2.5190085154892206e+00 1.8895327278002522e-01 3.2579132094414520e-01 1.2785619147735572e+00 -6.4376220254977592e-02 -1.0411987734636907e-01 -1.2731249728422835e+00 -3.6828086522274299e+00 -2.5975515866778851e+00 -3.4094696289860488e-01 4.0134555596105947e+00 2.9072731338480113e+00 7.9022433931131328e-02 6.4457762784444412e+00 3.0309848073492165e+00 9.8912896351066426e-02 -6.7419434413513573e+00 -3.2846501592189337e+00 -3.1135467371718578e-01 -2.3886859088998831e+00 -2.4745768707703300e+00 -5.5138953995526901e-02 2.6690971741438139e+00 2.5159174381155727e+00 3.2583033803714112e-01 3.7761105220261033e+00 2.6831744580687271e+00 2.6957938269029569e-01 -4.0910015317462820e+00 -2.7805712207143785e+00 -6.5904460398316711e-02 -2.6079326480685792e+00 -8.2501035055119551e+00 -7.5390276506213305e-01 2.8935908088963784e+00 7.9344176166865044e+00 1.4578053127361434e-01 3.0309848073492165e+00 1.1645081586179957e+01 2.1099922864623663e-01 -3.2836155000192191e+00 -1.1149468774044122e+01 -6.4268457588230488e-01 -2.4583092321076521e+00 -6.7302338697119284e+00 -1.2376246835077251e-01 2.8757696206650172e+00 6.2852210856542063e+00 7.0855714782978574e-01 2.6772588803542083e+00 8.3782996524543734e+00 5.8709302012092979e-01 -3.1277467370693692e+00 -8.1132137917070377e+00 -1.3208011857535501e-01 -1.8246103855797735e-01 -4.0410918727020656e-01 -2.5368953696728385e+00 8.7868885433408261e-02 1.6303550155027630e-01 2.5077827478202663e+00 9.8912896351066426e-02 2.1099922864623663e-01 5.0593953222790580e+00 -3.1304032352640654e-01 -6.4603132383752926e-01 -5.0531786361500339e+00 -6.2976713653861316e-02 -1.4196280921194065e-01 -1.2767601082697799e+00 1.7684819152057757e-01 3.6060357813918215e-01 1.2824853798804665e+00 2.7044548829374071e-01 5.9191347531782290e-01 2.5684659969352994e+00 -7.5597385860547900e-02 -1.3444846333384144e-01 -2.5512953328224368e+00 3.9791974069424123e+00 2.8333956004502161e+00 4.9762806308724411e-01 -4.4154402820407288e+00 -3.1021446824435799e+00 -2.1604776201214654e-01 -6.7419434413513573e+00 -3.2836155000192195e+00 -3.1304032352640648e-01 7.2404603220096604e+00 3.4841205217118030e+00 6.2190718989853566e-01 2.6301500299405509e+00 2.8750965219328863e+00 1.6678922076009553e-01 -3.0476555726608883e+00 -2.8646221671916865e+00 -5.3476612636194287e-01 -4.0827106358754381e+00 -3.0808011226584813e+00 -5.5524208360658045e-01 4.4379421730357862e+00 3.1385708282180600e+00 3.3277182176120079e-01 2.8553687637520353e+00 7.7775207477166290e+00 9.3326960565635364e-01 -3.0917567771820105e+00 -7.5065445242720177e+00 -3.4788623227672305e-01 -3.2846501592189346e+00 -1.1149468774044118e+01 -6.4603132383752915e-01 3.4841205217118030e+00 1.0809270725871562e+01 1.0140051824417207e+00 2.5025155769463256e+00 6.2548336066306236e+00 3.4296283158347929e-01 -2.8727901928684183e+00 -5.9058214302346244e+00 -8.6681900992245287e-01 -2.7240031733057086e+00 -7.9524220033824689e+00 -9.7719915797359957e-01 3.1311954401649067e+00 7.6726316517144131e+00 5.4769810432875055e-01 4.9904843034638241e-01 9.2770144441163327e-01 2.6521047829890705e+00 -4.2349590249827229e-01 -6.8885169784215039e-01 -2.5270874650085422e+00 -3.1135467371718584e-01 -6.4268457588230488e-01 -5.0531786361500339e+00 6.2190718989853566e-01 1.0140051824417209e+00 5.2913495161455453e+00 3.2036318243054879e-01 7.0370826081769955e-01 1.2488294463285512e+00 -5.2995648711058052e-01 -8.5658667542035549e-01 -1.4316262969423090e+00 -5.0011876024180324e-01 -9.9333426025079907e-01 -2.7295390594614961e+00 3.2360702089237514e-01 5.3604232172455635e-01 2.5491477120992130e+00 3.6611792481708076e+00 2.5539114014493474e+00 2.4075996332437019e-01 -3.9874779059887104e+00 -2.6439659271828555e+00 -5.0747502700238992e-02 -2.3886859088998831e+00 -2.4583092321076521e+00 -6.2976713653861330e-02 2.6301500299405509e+00 2.5025155769463256e+00 3.2036318243054873e-01 6.4741256118300239e+00 2.9012962286345996e+00 8.4967218810886050e-02 -6.6905132230335385e+00 -3.1693959200649728e+00 -2.8227934997715165e-01 -3.7273288302879206e+00 -2.5838729569380874e+00 -3.3733471497707079e-01 4.0285509782686706e+00 2.8978208292632952e+00 8.7247916742517348e-02 2.5576490660469400e+00 8.0656174697705705e+00 5.2935505457862131e-01 -3.0075378637204806e+00 -7.8311618672839209e+00 -1.0511820003976802e-01 -2.4745768707703300e+00 -6.7302338697119284e+00 -1.4196280921194065e-01 2.8750965219328868e+00 6.2548336066306236e+00 7.0370826081769955e-01 2.9012962286345996e+00 1.1495956260119376e+01 1.8214316560789695e-01 -3.1134549549872816e+00 -1.0926898956023525e+01 -5.8453964136456027e-01 -2.5952233536546063e+00 -8.2914305769311518e+00 -7.4844967031475640e-01 2.8567512265182722e+00 7.9633179334299529e+00 1.6486383992680650e-01 2.6499747355103936e-01 5.8002857789859841e-01 2.5083774632240279e+00 -6.0977059131340480e-02 -1.0485632485411264e-01 -2.5142989685520583e+00 -5.5138953995526901e-02 -1.2376246835077248e-01 -1.2767601082697799e+00 1.6678922076009550e-01 3.4296283158347929e-01 1.2488294463285512e+00 8.4967218810886050e-02 1.8214316560789695e-01 5.1540243952749396e+00 -3.0408744037472962e-01 -6.3619407965702568e-01 -5.0774241889455789e+00 -1.7341738278883706e-01 -3.8755606592094849e-01 -2.5877688481919385e+00 7.6866923168412940e-02 1.4723436369288470e-01 2.5450208091318376e+00 -3.9767496450557074e+00 -2.9455409404149258e+00 -5.3123088315914024e-01 4.3364365852481228e+00 2.9967545503075095e+00 3.2195566180626106e-01 2.6690971741438139e+00 2.8757696206650172e+00 1.7684819152057757e-01 -3.0476555726608883e+00 -2.8727901928684183e+00 -5.2995648711058052e-01 -6.6905132230335385e+00 -3.1134549549872821e+00 -3.0408744037472962e-01 7.1163514893220903e+00 3.3280808850468020e+00 5.9747061660411660e-01 4.0449931118881288e+00 2.8212173668945590e+00 4.9442784926932004e-01 -4.4519599198520190e+00 -3.0900363346432620e+00 -2.2542750855582439e-01 -2.5994319535372323e+00 -7.6729155847580897e+00 -9.3473440308144928e-01 3.0067105873532292e+00 7.4157261381225403e+00 5.3076904036946804e-01 2.5159174381155727e+00 6.2852210856542063e+00 3.6060357813918209e-01 -2.8646221671916865e+00 -5.9058214302346244e+00 -8.5658667542035549e-01 -3.1693959200649728e+00 -1.0926898956023525e+01 -6.3619407965702568e-01 3.3280808850468020e+00 1.0522267222398298e+01 9.7367140651343231e-01 2.8535517615169765e+00 7.8285694506900843e+00 9.2813828870668835e-01 -3.0708106312386891e+00 -7.5461479258488851e+00 -3.6566715556993956e-01 -4.8363416119632402e-01 -9.6072516466306257e-01 -2.6861901471722427e+00 2.9972935915294213e-01 4.9077557592620569e-01 2.5190085154892206e+00 3.2583033803714112e-01 7.0855714782978574e-01 1.2824853798804665e+00 -5.3476612636194298e-01 -8.6681900992245298e-01 -1.4316262969423090e+00 -2.8227934997715165e-01 -5.8453964136456027e-01 -5.0774241889455789e+00 5.9747061660411649e-01 9.7367140651343242e-01 5.2559701430354195e+00 5.0087950922414359e-01 9.3031018439253854e-01 2.7204014675979242e+00 -4.2323018548292463e-01 -6.9123049871188669e-01 -2.5826248729429029e+00 -2.3802688986791769e+00 -2.4250651678884232e+00 -4.2675823639927168e-01 2.6697369418277939e+00 2.5194696753154293e+00 1.8895327278002522e-01 3.7761105220261038e+00 2.6772588803542083e+00 2.7044548829374065e-01 -4.0827106358754381e+00 -2.7240031733057086e+00 -5.0011876024180324e-01 -3.7273288302879211e+00 -2.5952233536546063e+00 -1.7341738278883703e-01 4.0449931118881279e+00 2.8535517615169770e+00 5.0087950922414359e-01 6.5424651249898993e+00 2.9757420489412416e+00 5.0364757519775216e-01 -6.8429973358893896e+00 -3.2817306712791172e+00 -3.6363146606574931e-01 -2.4206315466194912e+00 -6.5791910381734224e+00 -9.3163909801088873e-01 2.8670647003800087e+00 6.2926455785056872e+00 3.2579132094414520e-01 2.6831744580687271e+00 8.3782996524543734e+00 5.9191347531782301e-01 -3.0808011226584813e+00 -7.9524220033824689e+00 -9.9333426025079907e-01 -2.5838729569380874e+00 -8.2914305769311536e+00 -3.8755606592094849e-01 2.8212173668945590e+00 7.8285694506900843e+00 9.3031018439253854e-01 2.9757420489412412e+00 1.1592319171813593e+01 1.0915654629878666e+00 -3.2618929480684757e+00 -1.1268790234976690e+01 -6.2705101945973618e-01 -4.2710946375508052e-01 -9.3408171559593733e-01 -1.4375692037933696e+00 4.0668353333581009e-01 6.6687550525770212e-01 1.2785619147735572e+00 2.6957938269029569e-01 5.8709302012092979e-01 2.5684659969352994e+00 -5.5524208360658045e-01 -9.7719915797359969e-01 -2.7295390594614952e+00 -3.3733471497707085e-01 -7.4844967031475640e-01 -2.5877688481919385e+00 4.9442784926932004e-01 9.2813828870668824e-01 2.7204014675979242e+00 5.0364757519775205e-01 1.0915654629878666e+00 5.3506244543384636e+00 -3.5465207815444594e-01 -6.1394173318889378e-01 -5.1631767221984433e+00 2.6297397625751588e+00 2.8493877891258954e+00 4.0449625539581047e-01 -3.0574970292419970e+00 -2.9093971099426206e+00 -6.4376220254977606e-02 -4.0910015317462820e+00 -3.1277467370693692e+00 -7.5597385860547928e-02 4.4379421730357862e+00 3.1311954401649071e+00 3.2360702089237520e-01 4.0285509782686715e+00 2.8567512265182722e+00 7.6866923168412940e-02 -4.4519599198520181e+00 -3.0708106312386896e+00 -4.2323018548292468e-01 -6.8429973358893896e+00 -3.2618929480684757e+00 -3.5465207815444588e-01 7.3472229028500671e+00 3.5325129705100795e+00 1.1288567029629701e-01 2.5162862634483116e+00 6.2607730692131751e+00 6.6990061949004953e-01 -2.9328526648029882e+00 -6.0468981575985312e+00 -1.0411987734636907e-01 -2.7805712207143785e+00 -8.1132137917070395e+00 -1.3444846333384147e-01 3.1385708282180600e+00 7.6726316517144140e+00 5.3604232172455635e-01 2.8978208292632952e+00 7.9633179334299529e+00 1.4723436369288470e-01 -3.0900363346432620e+00 -7.5461479258488851e+00 -6.9123049871188669e-01 -3.2817306712791172e+00 -1.1268790234976690e+01 -6.1394173318889367e-01 3.5325129705100795e+00 1.1078327455773604e+01 1.9056326767349938e-01 1.9719120967149492e-01 3.4244773467005180e-01 1.2512479968289703e+00 -7.5133183451619720e-02 -1.2077465299407746e-01 -1.2731249728422835e+00 -6.5904460398316711e-02 -1.3208011857535507e-01 -2.5512953328224368e+00 3.3277182176120079e-01 5.4769810432875055e-01 2.5491477120992130e+00 8.7247916742517362e-02 1.6486383992680650e-01 2.5450208091318376e+00 -2.2542750855582436e-01 -3.6566715556993956e-01 -2.5826248729429024e+00 -3.6363146606574936e-01 -6.2705101945973618e-01 -5.1631767221984433e+00 1.1288567029629704e-01 1.9056326767349926e-01 5.2248053827460454e+00 1185 1186 1187 1233 1234 1235 1245 1246 1247 1197 1198 1199 1188 1189 1190 1236 1237 1238 1248 1249 1250 1200 1201 1202 6.1414516556242722e+00 2.6919808857840710e+00 4.6834232734999343e-01 -6.3696823802140914e+00 -3.0076247787232071e+00 -3.4305281041090463e-01 -3.4921462830873415e+00 -2.4400281622838520e+00 -1.6529492423492312e-01 3.7896211750011264e+00 2.6996513353215974e+00 4.8678569365756630e-01 3.4547719153760279e+00 2.3948282438011139e+00 2.5040245287939972e-01 -3.7758358341363381e+00 -2.4392702760797329e+00 -4.6765822105657906e-01 -2.2180749917012648e+00 -2.2581426646767970e+00 -4.1115921302837011e-01 2.4698947431376097e+00 2.3586054168568054e+00 1.8163469484381747e-01 2.6919808857840715e+00 1.0782866883069987e+01 1.0262967046113367e+00 -2.9590621453889545e+00 -1.0383516656809215e+01 -5.7864679445801737e-01 -2.4326012220280848e+00 -7.8458170911419041e+00 -3.7079710832668622e-01 2.6649269091192118e+00 7.3699037516724264e+00 9.0250825782123656e-01 2.3866137398097780e+00 7.6496125787698199e+00 5.5473343589217861e-01 -2.7880011833263296e+00 -7.2527971995304510e+00 -9.3225084274846326e-01 -2.2597273138655654e+00 -6.2075647795872815e+00 -9.0968853543109574e-01 2.6958703298958739e+00 5.8873125135566164e+00 3.0784488263951054e-01 4.6834232734999337e-01 1.0262967046113367e+00 5.0879292775132878e+00 -3.1031696330699976e-01 -5.2638702092162781e-01 -4.8295023629859655e+00 -3.2308517412207061e-01 -7.2327409335828241e-01 -2.4292370382208497e+00 4.8199525721785824e-01 9.0613620630286884e-01 2.5517232383311694e+00 2.2145743997469935e-01 4.9441489774416358e-01 2.3844342145564594e+00 -5.1980834054112357e-01 -9.0985348546921563e-01 -2.5709865928194122e+00 -4.1012468102302180e-01 -9.0678168280723048e-01 -1.3636369092475877e+00 3.9154013445066482e-01 6.3944847389798698e-01 1.1692761728729002e+00 -6.3696823802140932e+00 -2.9590621453889545e+00 -3.1031696330699976e-01 6.8268190767333126e+00 3.2359147513524378e+00 7.3866270037208609e-02 3.8246404070172924e+00 2.7276927932604944e+00 6.7692375819035117e-02 -4.2365553236330404e+00 -2.9343349200216915e+00 -4.0995528709514734e-01 -3.7854356542739973e+00 -2.8498681902261347e+00 -4.3257247490346096e-02 4.1433061108783118e+00 2.8481567714639162e+00 2.8157980151687512e-01 2.5058336066860942e+00 2.7103286929209522e+00 3.9517401383061057e-01 -2.9089258431938831e+00 -2.7788277533610199e+00 -5.4782963311236221e-02 -3.0076247787232067e+00 -1.0383516656809215e+01 -5.2638702092162803e-01 3.2359147513524378e+00 1.0135950735873488e+01 1.2368034826451998e-01 2.7533930053993569e+00 7.5332724288578303e+00 1.2561837430235598e-01 -2.9419584104948786e+00 -7.1052669304976117e+00 -6.6025611537485585e-01 -2.4837395553770070e+00 -7.4223543729220625e+00 -7.3450146134180175e-02 2.8432181806128334e+00 7.0002428739529812e+00 4.5748141942246651e-01 2.3590867374218147e+00 5.9229475553768482e+00 6.3998880865019636e-01 -2.7582899301913510e+00 -5.6812756338322510e+00 -8.6675668208874790e-02 -3.4305281041090463e-01 -5.7864679445801737e-01 -4.8295023629859655e+00 7.3866270037208609e-02 1.2368034826452004e-01 4.8508151230967664e+00 6.1008474506542648e-02 1.1172656146198512e-01 2.4055523916657009e+00 -1.9968156400339793e-01 -3.1894290322558688e-01 -2.4236604536662201e+00 -3.2056132020670910e-02 -6.7978730493411632e-02 -2.3991190761015675e+00 3.0941216527120308e-01 5.0575132318822469e-01 2.3983260627874960e+00 1.7509523115184511e-01 2.9519227141225313e-01 1.1974462578712695e+00 -4.4591634531826095e-02 -7.0782076149966927e-02 -1.1998579426674767e+00 -3.4921462830873415e+00 -2.4326012220280848e+00 -3.2308517412207055e-01 3.8246404070172924e+00 2.7533930053993569e+00 6.1008474506542648e-02 6.0836693760668501e+00 2.8397112605391284e+00 7.8060000936856777e-02 -6.3756472245328224e+00 -3.1020842399911501e+00 -2.9139764891996833e-01 -2.2281832464661271e+00 -2.3156552388716927e+00 -3.9793228588926741e-02 2.5093698265038369e+00 2.3581262024906429e+00 3.0816459556716436e-01 3.4967060928721554e+00 2.5038116427422787e+00 2.5378228783340701e-01 -3.8184089483738446e+00 -2.6047014102804784e+00 -4.6739307213005017e-02 -2.4400281622838520e+00 -7.8458170911419041e+00 -7.2327409335828241e-01 2.7276927932604944e+00 7.5332724288578303e+00 1.1172656146198512e-01 2.8397112605391284e+00 1.1036993399891895e+01 1.6704419739126244e-01 -3.0923449512115448e+00 -1.0532742547269157e+01 -6.0959018614779859e-01 -2.2934450549123642e+00 -6.3658646710407671e+00 -9.1136585024059122e-02 2.7232411599835720e+00 5.9114764200789720e+00 6.8090977881262849e-01 2.4939688839724314e+00 7.8673831065174946e+00 5.5847177776599688e-01 -2.9587959293478665e+00 -7.6047010458943625e+00 -9.4151450901732381e-02 -1.6529492423492309e-01 -3.7079710832668611e-01 -2.4292370382208497e+00 6.7692375819035130e-02 1.2561837430235598e-01 2.4055523916657009e+00 7.8060000936856791e-02 1.6704419739126242e-01 4.7973633214670954e+00 -2.9076513535830356e-01 -6.1024870793174257e-01 -4.7824045754727393e+00 -4.4720590337804560e-02 -1.0316897971774898e-01 -1.2016302580988671e+00 1.5709337483377181e-01 3.2859673179532300e-01 1.2007829562056387e+00 2.5037970577723445e-01 5.5511684360380542e-01 2.3795004037973753e+00 -5.2444807435866950e-02 -9.2161351116568715e-02 -2.3699272013433568e+00 3.7896211750011268e+00 2.6649269091192118e+00 4.8199525721785824e-01 -4.2365553236330404e+00 -2.9419584104948786e+00 -1.9968156400339793e-01 -6.3756472245328224e+00 -3.0923449512115448e+00 -2.9076513535830356e-01 6.8872260783516248e+00 3.2974477228150669e+00 6.0903068397099591e-01 2.4664173577277970e+00 2.7194314039332230e+00 1.4849065333455133e-01 -2.8970813190496685e+00 -2.7056046579446882e+00 -5.2186598686189034e-01 -3.8032441482080124e+00 -2.9056630166017832e+00 -5.4025290104512336e-01 4.1692634043429937e+00 2.9637650003853926e+00 3.1304899274530973e-01 2.6996513353215974e+00 7.3699037516724264e+00 9.0613620630286906e-01 -2.9343349200216915e+00 -7.1052669304976117e+00 -3.1894290322558688e-01 -3.1020842399911492e+00 -1.0532742547269157e+01 -6.1024870793174268e-01 3.2974477228150669e+00 1.0197249304781003e+01 9.8354795416514007e-01 2.3423538402884332e+00 5.8841223056248566e+00 3.1395958366218152e-01 -2.7207453183148287e+00 -5.5341161708322284e+00 -8.3802197326914585e-01 -2.5431236948410278e+00 -7.4395964419866996e+00 -9.4679114034681189e-01 2.9608352747436011e+00 7.1604467285074094e+00 5.1036098064309654e-01 4.8678569365756624e-01 9.0250825782123645e-01 2.5517232383311694e+00 -4.0995528709514734e-01 -6.6025611537485585e-01 -2.4236604536662201e+00 -2.9139764891996833e-01 -6.0959018614779870e-01 -4.7824045754727393e+00 6.0903068397099591e-01 9.8354795416513996e-01 5.0345890764868395e+00 3.0326639293735930e-01 6.7860005503574250e-01 1.1674753895017862e+00 -5.2106753398241878e-01 -8.3213107040313961e-01 -1.3594473627476020e+00 -4.8516037786564076e-01 -9.6865315196741764e-01 -2.5492430951309597e+00 3.0849807729725409e-01 5.0597425687109243e-01 2.3609677826977240e+00 3.4547719153760283e+00 2.3866137398097780e+00 2.2145743997469938e-01 -3.7854356542739973e+00 -2.4837395553770065e+00 -3.2056132020670890e-02 -2.2281832464661271e+00 -2.2934450549123642e+00 -4.4720590337804553e-02 2.4664173577277970e+00 2.3423538402884332e+00 3.0326639293735930e-01 6.0507170776759205e+00 2.7077478470107392e+00 6.5914362064151660e-02 -6.2644118501912658e+00 -2.9790889505901847e+00 -2.5983259053934060e-01 -3.4328009518760716e+00 -2.4013670578109867e+00 -3.2033962986339354e-01 3.7389253520277186e+00 2.7209251915815917e+00 6.6310747784999194e-02 2.3948282438011135e+00 7.6496125787698190e+00 4.9441489774416353e-01 -2.8498681902261347e+00 -7.4223543729220625e+00 -6.7978730493411618e-02 -2.3156552388716927e+00 -6.3658646710407680e+00 -1.0316897971774895e-01 2.7194314039332230e+00 5.8841223056248566e+00 6.7860005503574250e-01 2.7077478470107397e+00 1.0831136391742765e+01 1.4201693695014161e-01 -2.9311176911187693e+00 -1.0249671291026132e+01 -5.4846461602538144e-01 -2.4164989292744230e+00 -7.7708150607078172e+00 -7.2103706127616773e-01 2.6911325547459466e+00 7.4438341195593338e+00 1.2561749778266201e-01 2.5040245287939977e-01 5.5473343589217861e-01 2.3844342145564594e+00 -4.3257247490346089e-02 -7.3450146134180161e-02 -2.3991190761015675e+00 -3.9793228588926727e-02 -9.1136585024059136e-02 -1.2016302580988671e+00 1.4849065333455133e-01 3.1395958366218152e-01 1.1674753895017862e+00 6.5914362064151688e-02 1.4201693695014156e-01 4.8330501615431780e+00 -2.8465584640226693e-01 -6.0429880097341038e-01 -4.7471413080041875e+00 -1.5543908753594704e-01 -3.5306028829620500e-01 -2.3849485630344871e+00 5.8337941739384148e-02 1.1123586392335301e-01 2.3478794396376861e+00 -3.7758358341363381e+00 -2.7880011833263296e+00 -5.1980834054112346e-01 4.1433061108783118e+00 2.8432181806128334e+00 3.0941216527120313e-01 2.5093698265038369e+00 2.7232411599835720e+00 1.5709337483377178e-01 -2.8970813190496685e+00 -2.7207453183148287e+00 -5.2106753398241878e-01 -6.2644118501912658e+00 -2.9311176911187697e+00 -2.8465584640226693e-01 6.7073761258879463e+00 3.1437641910686316e+00 5.8350279437317454e-01 3.7518301843013995e+00 2.6530297169576982e+00 4.8074006007521664e-01 -4.1745532441942235e+00 -2.9233890558628057e+00 -2.0521667362755674e-01 -2.4392702760797329e+00 -7.2527971995304510e+00 -9.0985348546921563e-01 2.8481567714639167e+00 7.0002428739529803e+00 5.0575132318822469e-01 2.3581262024906429e+00 5.9114764200789720e+00 3.2859673179532300e-01 -2.7056046579446886e+00 -5.5341161708322284e+00 -8.3213107040313961e-01 -2.9790889505901843e+00 -1.0249671291026131e+01 -6.0429880097341038e-01 3.1437641910686316e+00 9.8473470422419123e+00 9.4022902340324166e-01 2.6734296664963972e+00 7.3016414984520903e+00 9.0022613377591498e-01 -2.8995129469049825e+00 -7.0241231733371423e+00 -3.2851985531693845e-01 -4.6765822105657906e-01 -9.3225084274846326e-01 -2.5709865928194122e+00 2.8157980151687501e-01 4.5748141942246645e-01 2.3983260627874960e+00 3.0816459556716436e-01 6.8090977881262849e-01 1.2007829562056387e+00 -5.2186598686189034e-01 -8.3802197326914574e-01 -1.3594473627476018e+00 -2.5983259053934055e-01 -5.4846461602538121e-01 -4.7471413080041875e+00 5.8350279437317443e-01 9.4022902340324177e-01 4.9380306797640348e+00 4.8414642025825155e-01 9.0017800186176289e-01 2.5231910846910730e+00 -4.0803681325765567e-01 -6.6006079145710872e-01 -2.3827555198770400e+00 -2.2180749917012648e+00 -2.2597273138655658e+00 -4.1012468102302180e-01 2.5058336066860933e+00 2.3590867374218147e+00 1.7509523115184514e-01 3.4967060928721554e+00 2.4939688839724314e+00 2.5037970577723445e-01 -3.8032441482080124e+00 -2.5431236948410278e+00 -4.8516037786564081e-01 -3.4328009518760711e+00 -2.4164989292744226e+00 -1.5543908753594704e-01 3.7518301843013995e+00 2.6734296664963977e+00 4.8414642025825155e-01 5.9639330084231226e+00 2.7541331159248523e+00 4.8154857677911972e-01 -6.2641828004974247e+00 -3.0612684658344786e+00 -3.4044578754184118e-01 -2.2581426646767970e+00 -6.2075647795872815e+00 -9.0678168280723048e-01 2.7103286929209522e+00 5.9229475553768482e+00 2.9519227141225307e-01 2.5038116427422787e+00 7.8673831065174955e+00 5.5511684360380531e-01 -2.9056630166017832e+00 -7.4395964419866996e+00 -9.6865315196741775e-01 -2.4013670578109867e+00 -7.7708150607078172e+00 -3.5306028829620500e-01 2.6530297169576982e+00 7.3016414984520903e+00 9.0017800186176289e-01 2.7541331159248528e+00 1.0730582555824935e+01 1.0573331083272812e+00 -3.0561304294562168e+00 -1.0404578433889567e+01 -5.7932510213424870e-01 -4.1115921302837016e-01 -9.0968853543109574e-01 -1.3636369092475877e+00 3.9517401383061057e-01 6.3998880865019647e-01 1.1974462578712697e+00 2.5378228783340701e-01 5.5847177776599688e-01 2.3795004037973753e+00 -5.4025290104512336e-01 -9.4679114034681200e-01 -2.5492430951309597e+00 -3.2033962986339354e-01 -7.2103706127616785e-01 -2.3849485630344871e+00 4.8074006007521664e-01 9.0022613377591498e-01 2.5231910846910734e+00 4.8154857677911966e-01 1.0573331083272812e+00 4.8910458416709321e+00 -3.3949319458146715e-01 -5.7850309146531365e-01 -4.6933550206176147e+00 2.4698947431376097e+00 2.6958703298958739e+00 3.9154013445066482e-01 -2.9089258431938831e+00 -2.7582899301913510e+00 -4.4591634531826095e-02 -3.8184089483738446e+00 -2.9587959293478665e+00 -5.2444807435866957e-02 4.1692634043429937e+00 2.9608352747436011e+00 3.0849807729725415e-01 3.7389253520277177e+00 2.6911325547459461e+00 5.8337941739384142e-02 -4.1745532441942235e+00 -2.8995129469049830e+00 -4.0803681325765573e-01 -6.2641828004974247e+00 -3.0561304294562164e+00 -3.3949319458146715e-01 6.7879873367510548e+00 3.3248910765149966e+00 8.6190296319512805e-02 2.3586054168568054e+00 5.8873125135566173e+00 6.3944847389798698e-01 -2.7788277533610204e+00 -5.6812756338322501e+00 -7.0782076149966899e-02 -2.6047014102804789e+00 -7.6047010458943625e+00 -9.2161351116568688e-02 2.9637650003853926e+00 7.1604467285074094e+00 5.0597425687109254e-01 2.7209251915815917e+00 7.4438341195593338e+00 1.1123586392335301e-01 -2.9233890558628057e+00 -7.0241231733371432e+00 -6.6006079145710872e-01 -3.0612684658344795e+00 -1.0404578433889565e+01 -5.7850309146531376e-01 3.3248910765149953e+00 1.0223084925329960e+01 1.4484871549652534e-01 1.8163469484381747e-01 3.0784488263951054e-01 1.1692761728729002e+00 -5.4782963311236228e-02 -8.6675668208874818e-02 -1.1998579426674767e+00 -4.6739307213005024e-02 -9.4151450901732395e-02 -2.3699272013433563e+00 3.1304899274530967e-01 5.1036098064309654e-01 2.3609677826977240e+00 6.6310747784999194e-02 1.2561749778266201e-01 2.3478794396376865e+00 -2.0521667362755674e-01 -3.2851985531693845e-01 -2.3827555198770400e+00 -3.4044578754184118e-01 -5.7932510213424870e-01 -4.6933550206176147e+00 8.6190296319512832e-02 1.4484871549652534e-01 4.7677722892971772e+00 738 739 740 1197 1198 1199 1209 1210 1211 750 751 752 741 742 743 1200 1201 1202 1212 1213 1214 753 754 755 5.8760176911809765e+00 1.8446405385023823e+00 2.9316247148730257e-01 -5.9903933853616280e+00 -2.2750684309933336e+00 -2.5737291362102138e-01 -3.0485496733591981e+00 -1.6364093651609219e+00 -1.1717331059265727e-01 3.2329941137322606e+00 2.0360606225962012e+00 3.3265364871152836e-01 3.0824309561831922e+00 1.6429954350800482e+00 1.6741149151474807e-01 -3.2952490036429265e+00 -1.8109977962058650e+00 -3.1063430293939259e-01 -1.7186308395758223e+00 -1.5276247520462936e+00 -2.5448195091715420e-01 1.8613801408431441e+00 1.7264037482277832e+00 1.4643486635664660e-01 1.8446405385023827e+00 1.3056252717258996e+01 1.2187035291050607e+00 -2.2443922875289939e+00 -1.2780086169108623e+01 -7.5395557381768696e-01 -1.6319172074137411e+00 -9.6539325109354248e+00 -5.0378231077184543e-01 2.0129358744171117e+00 9.2873118534832066e+00 1.0880557417759429e+00 1.6399698355283807e+00 9.5569622897803690e+00 7.0200369498454351e-01 -2.1774387370999002e+00 -9.2589170007320902e+00 -1.1233284537060249e+00 -1.5300306444196121e+00 -7.8262171163885732e+00 -1.0739117398980955e+00 2.0862326280143693e+00 7.6186259366421405e+00 4.4621511232810662e-01 2.9316247148730262e-01 1.2187035291050603e+00 5.6247183433969239e+00 -2.4198668070694376e-01 -7.1312795354702063e-01 -5.3772184782477446e+00 -2.0571266408947345e-01 -8.7936256534586188e-01 -2.7112902190251176e+00 3.2834331898816466e-01 1.0878637776637541e+00 2.8285179422949622e+00 1.5428393250818323e-01 6.4965121658322511e-01 2.7223330470000553e+00 -3.6535844292795017e-01 -1.1030879545610650e+00 -2.9001292844951903e+00 -2.5301881004209342e-01 -1.0661241413519331e+00 -1.5342219493824096e+00 2.9028687478280990e-01 8.0548409145384103e-01 1.3472905984585206e+00 -5.9903933853616280e+00 -2.2443922875289934e+00 -2.4198668070694371e-01 6.3331950117256781e+00 2.6530328995702739e+00 9.7036714450721179e-02 3.2558011425462534e+00 2.0539651065548887e+00 7.6587808320397868e-02 -3.5719569102158655e+00 -2.4176673736534648e+00 -3.1304976753394370e-01 -3.2986404138832519e+00 -2.2199572262450773e+00 -6.6224752719864388e-02 3.5708026227029310e+00 2.3576977650028166e+00 2.3060363067630935e-01 1.8978330310228586e+00 2.1021684345543235e+00 2.9414466309624604e-01 -2.1966410985369715e+00 -2.2848473182547675e+00 -7.7111615582922663e-02 -2.2750684309933336e+00 -1.2780086169108623e+01 -7.1312795354702052e-01 2.6530328995702739e+00 1.2631009183460497e+01 2.6986881242933558e-01 2.0681359649542688e+00 9.4668681278164630e+00 2.5231665671879017e-01 -2.4219731871075005e+00 -9.1356080654851919e+00 -8.4168003074516684e-01 -1.8373001079747686e+00 -9.4342778303467618e+00 -1.9714973957316431e-01 2.3484456504525184e+00 9.1074824059661239e+00 6.2669444334591407e-01 1.7291135653043139e+00 7.6579663828572109e+00 8.0845549555234864e-01 -2.2643863542057696e+00 -7.5133540351597183e+00 -2.0537768418103711e-01 -2.5737291362102138e-01 -7.5395557381768719e-01 -5.3772184782477446e+00 9.7036714450721151e-02 2.6986881242933558e-01 5.3748280681606371e+00 7.3817709251123673e-02 2.4155512397515141e-01 2.6749439849783179e+00 -1.7561092796258110e-01 -4.6749242516332018e-01 -2.7086598931320154e+00 -5.3379080434619371e-02 -1.9966957628296386e-01 -2.7162507530432474e+00 2.4417020226467315e-01 6.6826511405665623e-01 2.7370458349667293e+00 1.4386123322486077e-01 4.3624438116176906e-01 1.3779754830877522e+00 -7.2522937173156735e-02 -1.9481585635894116e-01 -1.3626642467704269e+00 -3.0485496733591986e+00 -1.6319172074137411e+00 -2.0571266408947347e-01 3.2558011425462534e+00 2.0681359649542688e+00 7.3817709251123673e-02 5.7777583259810266e+00 1.9111608475368944e+00 7.5109181526429286e-02 -5.9608123357109486e+00 -2.3157440373723412e+00 -2.0490072039560178e-01 -1.7208514188251938e+00 -1.5590045284395144e+00 -4.8144650513472817e-02 1.8971190823696946e+00 1.7298375973457021e+00 2.0201287677096130e-01 3.0884201913852887e+00 1.6891468784802606e+00 1.6712803615643285e-01 -3.2888853143869223e+00 -1.8916155150915308e+00 -5.9309768706399056e-02 -1.6364093651609219e+00 -9.6539325109354213e+00 -8.7936256534586188e-01 2.0539651065548887e+00 9.4668681278164648e+00 2.4155512397515139e-01 1.9111608475368949e+00 1.3272173446572827e+01 3.0556729170084385e-01 -2.3098980140970715e+00 -1.2896334690963213e+01 -7.7066103585205714e-01 -1.5483857775137992e+00 -7.9907405294894778e+00 -2.0873596059687485e-01 2.1074310557669045e+00 7.6534862619739528e+00 8.3171717141748625e-01 1.6849080685108901e+00 9.7305324992492928e+00 6.9783689476984134e-01 -2.2627719215977828e+00 -9.5820526042244190e+00 -2.1791692006852917e-01 -1.1717331059265727e-01 -5.0378231077184543e-01 -2.7112902190251176e+00 7.6587808320397868e-02 2.5231665671879017e-01 2.6749439849783179e+00 7.5109181526429286e-02 3.0556729170084385e-01 5.3303809680245742e+00 -2.0621745006389558e-01 -7.7694210370799288e-01 -5.3368330383507594e+00 -5.0380010528714936e-02 -2.1973961634768113e-01 -1.3637812664633437e+00 1.2594406761000948e-01 4.5598924643829808e-01 1.3796660697024876e+00 1.6796582649055153e-01 7.0486180236600604e-01 2.7202077362831858e+00 -7.1836112762120291e-02 -2.1827096639641849e-01 -2.6932942351493452e+00 3.2329941137322615e+00 2.0129358744171117e+00 3.2834331898816466e-01 -3.5719569102158655e+00 -2.4219731871075005e+00 -1.7561092796258110e-01 -5.9608123357109486e+00 -2.3098980140970715e+00 -2.0621745006389558e-01 6.3681910994085928e+00 2.6734257208872898e+00 4.4243586595530648e-01 1.8616378743940423e+00 2.1078210805304969e+00 1.2225863193364822e-01 -2.1939375997098844e+00 -2.2375984303949048e+00 -3.8241403146903141e-01 -3.2882758209135359e+00 -2.2359520582249530e+00 -3.7709812371153473e-01 3.5521595790153375e+00 2.4112390139895341e+00 2.4830271632992357e-01 2.0360606225962012e+00 9.2873118534832066e+00 1.0878637776637541e+00 -2.4176673736534644e+00 -9.1356080654851919e+00 -4.6749242516332007e-01 -2.3157440373723412e+00 -1.2896334690963215e+01 -7.7694210370799288e-01 2.6734257208872894e+00 1.2657852651302903e+01 1.1988914796073704e+00 1.7194175969518555e+00 7.6144575938791350e+00 4.4465331371068928e-01 -2.2422607878375693e+00 -7.3551815767023614e+00 -1.0276096819788310e+00 -1.8570357589661202e+00 -9.4054180690559690e+00 -1.1376293949168961e+00 2.4038040173941466e+00 9.2329203035414977e+00 6.7826503478522648e-01 3.3265364871152836e-01 1.0880557417759431e+00 2.8285179422949627e+00 -3.1304976753394365e-01 -8.4168003074516684e-01 -2.7086598931320154e+00 -2.0490072039560178e-01 -7.7066103585205703e-01 -5.3368330383507594e+00 4.4243586595530660e-01 1.1988914796073704e+00 5.5832483517739266e+00 2.0003527387176195e-01 8.3137449502598026e-01 1.3455212378815011e+00 -3.8129742128447969e-01 -1.0224836949886489e+00 -1.5324481577000912e+00 -3.1691247816535612e-01 -1.1463927343752347e+00 -2.8829588981475744e+00 2.4103559884078396e-01 6.6289577955181456e-01 2.7036124553800485e+00 3.0824309561831922e+00 1.6399698355283809e+00 1.5428393250818323e-01 -3.2986404138832515e+00 -1.8373001079747686e+00 -5.3379080434619371e-02 -1.7208514188251938e+00 -1.5483857775137992e+00 -5.0380010528714936e-02 1.8616378743940423e+00 1.7194175969518557e+00 2.0003527387176195e-01 6.0055331421068807e+00 1.8690912012388321e+00 7.0745322630061128e-02 -6.1136161334168388e+00 -2.2863398207043542e+00 -1.9294867315706701e-01 -3.1099219293789733e+00 -1.6228525582741020e+00 -2.0494258977752855e-01 3.2934279228201433e+00 2.0663996307479562e+00 7.6585824887923634e-02 1.6429954350800484e+00 9.5569622897803690e+00 6.4965121658322511e-01 -2.2199572262450773e+00 -9.4342778303467636e+00 -1.9966957628296389e-01 -1.5590045284395144e+00 -7.9907405294894778e+00 -2.1973961634768110e-01 2.1078210805304964e+00 7.6144575938791350e+00 8.3137449502598015e-01 1.8690912012388323e+00 1.3375566200092971e+01 2.8892559605406781e-01 -2.2324745214189243e+00 -1.2915119361382102e+01 -7.2468499472706871e-01 -1.6306929219810897e+00 -9.7096893956475014e+00 -8.7953825593730695e-01 2.0222214812352264e+00 9.5028410331133735e+00 2.5368113563174766e-01 1.6741149151474805e-01 7.0200369498454351e-01 2.7223330470000553e+00 -6.6224752719864374e-02 -1.9714973957316431e-01 -2.7162507530432469e+00 -4.8144650513472831e-02 -2.0873596059687485e-01 -1.3637812664633437e+00 1.2225863193364823e-01 4.4465331371068928e-01 1.3455212378815011e+00 7.0745322630061128e-02 2.8892559605406792e-01 5.5695789473292070e+00 -2.0363554081626922e-01 -7.7783648475964584e-01 -5.5047731298760949e+00 -1.1426654995456094e-01 -4.9478820137444252e-01 -2.7741331538476564e+00 7.1856047925709890e-02 2.4292778155482697e-01 2.7215050710195814e+00 -3.2952490036429261e+00 -2.1774387370999002e+00 -3.6535844292795011e-01 3.5708026227029310e+00 2.3484456504525184e+00 2.4417020226467309e-01 1.8971190823696946e+00 2.1074310557669040e+00 1.2594406761000951e-01 -2.1939375997098849e+00 -2.2422607878375693e+00 -3.8129742128447963e-01 -6.1136161334168388e+00 -2.2324745214189248e+00 -2.0363554081626925e-01 6.4495892387575653e+00 2.6081633483708666e+00 4.3113937672139585e-01 3.3117940381358633e+00 2.0040468237936557e+00 3.2818235272177276e-01 -3.6265022451964040e+00 -2.4159128320275514e+00 -1.7914459428915233e-01 -1.8109977962058650e+00 -9.2589170007320902e+00 -1.1030879545610650e+00 2.3576977650028166e+00 9.1074824059661239e+00 6.6826511405665623e-01 1.7298375973457021e+00 7.6534862619739528e+00 4.5598924643829797e-01 -2.2375984303949052e+00 -7.3551815767023614e+00 -1.0224836949886491e+00 -2.2863398207043546e+00 -1.2915119361382105e+01 -7.7783648475964595e-01 2.6081633483708666e+00 1.2597604960679350e+01 1.1696382411622119e+00 2.0386181947959354e+00 9.3603342996418419e+00 1.0892879815431304e+00 -2.3993808582101934e+00 -9.1896899894447159e+00 -4.7977244889093695e-01 -3.1063430293939259e-01 -1.1233284537060251e+00 -2.9001292844951903e+00 2.3060363067630935e-01 6.2669444334591407e-01 2.7370458349667288e+00 2.0201287677096127e-01 8.3171717141748625e-01 1.3796660697024876e+00 -3.8241403146903136e-01 -1.0276096819788310e+00 -1.5324481577000912e+00 -1.9294867315706701e-01 -7.2468499472706893e-01 -5.5047731298760958e+00 4.3113937672139580e-01 1.1696382411622122e+00 5.6851207901521699e+00 3.3272689359895291e-01 1.0867469478431639e+00 2.9086343339656282e+00 -3.1048577020212792e-01 -8.3917367335685200e-01 -2.7731164567156363e+00 -1.7186308395758223e+00 -1.5300306444196121e+00 -2.5301881004209342e-01 1.8978330310228586e+00 1.7291135653043141e+00 1.4386123322486077e-01 3.0884201913852887e+00 1.6849080685108901e+00 1.6796582649055153e-01 -3.2882758209135359e+00 -1.8570357589661202e+00 -3.1691247816535612e-01 -3.1099219293789733e+00 -1.6306929219810897e+00 -1.1426654995456094e-01 3.3117940381358633e+00 2.0386181947959354e+00 3.3272689359895291e-01 5.9018719351806785e+00 1.8807945276511309e+00 3.0009954137101791e-01 -6.0830906058563583e+00 -2.3156750308954486e+00 -2.6045565652337266e-01 -1.5276247520462936e+00 -7.8262171163885732e+00 -1.0661241413519329e+00 2.1021684345543235e+00 7.6579663828572109e+00 4.3624438116176906e-01 1.6891468784802610e+00 9.7305324992492928e+00 7.0486180236600604e-01 -2.2359520582249530e+00 -9.4054180690559690e+00 -1.1463927343752349e+00 -1.6228525582741020e+00 -9.7096893956475014e+00 -4.9478820137444257e-01 2.0040468237936557e+00 9.3603342996418419e+00 1.0867469478431637e+00 1.8807945276511311e+00 1.3229512526359665e+01 1.2482271245433330e+00 -2.2897272959340191e+00 -1.3037021127015965e+01 -7.6877517881266200e-01 -2.5448195091715425e-01 -1.0739117398980955e+00 -1.5342219493824096e+00 2.9414466309624604e-01 8.0845549555234886e-01 1.3779754830877522e+00 1.6712803615643290e-01 6.9783689476984134e-01 2.7202077362831858e+00 -3.7709812371153478e-01 -1.1376293949168961e+00 -2.8829588981475744e+00 -2.0494258977752858e-01 -8.7953825593730683e-01 -2.7741331538476564e+00 3.2818235272177282e-01 1.0892879815431304e+00 2.9086343339656282e+00 3.0009954137101796e-01 1.2482271245433334e+00 5.6477457233993924e+00 -2.5303192893925164e-01 -7.5272810565635573e-01 -5.4632492753583186e+00 1.8613801408431441e+00 2.0862326280143693e+00 2.9028687478280990e-01 -2.1966410985369711e+00 -2.2643863542057692e+00 -7.2522937173156721e-02 -3.2888853143869219e+00 -2.2627719215977828e+00 -7.1836112762120277e-02 3.5521595790153375e+00 2.4038040173941462e+00 2.4103559884078393e-01 3.2934279228201424e+00 2.0222214812352268e+00 7.1856047925709890e-02 -3.6265022451964040e+00 -2.3993808582101930e+00 -3.1048577020212792e-01 -6.0830906058563592e+00 -2.2897272959340191e+00 -2.5303192893925158e-01 6.4881516212980301e+00 2.7040083033040228e+00 1.0469822752735287e-01 1.7264037482277832e+00 7.6186259366421405e+00 8.0548409145384103e-01 -2.2848473182547675e+00 -7.5133540351597183e+00 -1.9481585635894116e-01 -1.8916155150915310e+00 -9.5820526042244190e+00 -2.1827096639641849e-01 2.4112390139895341e+00 9.2329203035414977e+00 6.6289577955181456e-01 2.0663996307479562e+00 9.5028410331133735e+00 2.4292778155482694e-01 -2.4159128320275509e+00 -9.1896899894447159e+00 -8.3917367335685200e-01 -2.3156750308954495e+00 -1.3037021127015967e+01 -7.5272810565635573e-01 2.7040083033040236e+00 1.2967730482547809e+01 2.9368094920808485e-01 1.4643486635664660e-01 4.4621511232810657e-01 1.3472905984585206e+00 -7.7111615582922691e-02 -2.0537768418103711e-01 -1.3626642467704266e+00 -5.9309768706399063e-02 -2.1791692006852917e-01 -2.6932942351493447e+00 2.4830271632992357e-01 6.7826503478522659e-01 2.7036124553800485e+00 7.6585824887923634e-02 2.5368113563174766e-01 2.7215050710195809e+00 -1.7914459428915233e-01 -4.7977244889093690e-01 -2.7731164567156368e+00 -2.6045565652337266e-01 -7.6877517881266200e-01 -5.4632492753583186e+00 1.0469822752735289e-01 2.9368094920808485e-01 5.5199160891355774e+00 1197 1198 1199 1245 1246 1247 1257 1258 1259 1209 1210 1211 1200 1201 1202 1248 1249 1250 1260 1261 1262 1212 1213 1214 5.5655446601855996e+00 1.7036513144322376e+00 2.7881278331897824e-01 -5.6710533833741295e+00 -2.1445553302714941e+00 -2.4689159005317698e-01 -2.8986460644068401e+00 -1.5101765031360197e+00 -1.0563336669874170e-01 3.0774404477827058e+00 1.9188339752173760e+00 3.2269900575621663e-01 2.8488569893159790e+00 1.5121188896684947e+00 1.5347202930613166e-01 -3.0618191578419487e+00 -1.6808030036974329e+00 -2.9797616370058544e-01 -1.5962433111899417e+00 -1.4045078242083711e+00 -2.4090808248548981e-01 1.7359198195285763e+00 1.6054384819952101e+00 1.3642538455666756e-01 1.7036513144322376e+00 1.2334437249730350e+01 1.1815825228284640e+00 -2.1009825816640708e+00 -1.2050752439460616e+01 -7.0911018765838119e-01 -1.5032130498487744e+00 -9.1361431648316564e+00 -4.6319949794848442e-01 1.8803341209330728e+00 8.7572459296677678e+00 1.0503525557761650e+00 1.5036147689537036e+00 8.9401569236462866e+00 6.5774062338647810e-01 -2.0532252756042166e+00 -8.6313123392113642e+00 -1.0843150419045178e+00 -1.4003914594101290e+00 -7.3414449491954716e+00 -1.0369486127021657e+00 1.9702121622081743e+00 7.1278127896547074e+00 4.0389763822244296e-01 2.7881278331897830e-01 1.1815825228284640e+00 5.3558998176998092e+00 -2.3003367302459471e-01 -6.6769541527294141e-01 -5.0943071111548370e+00 -1.9251586853617580e-01 -8.4196589451646975e-01 -2.5927075538498761e+00 3.1679653927917334e-01 1.0535082205097765e+00 2.7130142659520340e+00 1.4122567520018461e-01 6.1010870993602129e-01 2.5208005807149707e+00 -3.5705200172832657e-01 -1.0688445292718647e+00 -2.7065119212334747e+00 -2.3975753611454667e-01 -1.0349904215443813e+00 -1.4489177947278751e+00 2.8252408160530684e-01 7.6829680733139571e-01 1.2527297165992497e+00 -5.6710533833741295e+00 -2.1009825816640708e+00 -2.3003367302459465e-01 6.0251664311954025e+00 2.5183948291323235e+00 7.9098641952065923e-02 3.1013268637244327e+00 1.9242065635643213e+00 6.2623565300242490e-02 -3.4226319017627787e+00 -2.2934396562839217e+00 -3.0166146019447609e-01 -3.0645646036664820e+00 -2.0926966157505649e+00 -5.1617197147623167e-02 3.3422810757901691e+00 2.2278700979667097e+00 2.1882313435583781e-01 1.7694746268845580e+00 1.9808960407719234e+00 2.8499868511869203e-01 -2.0799991087911711e+00 -2.1642486777367207e+00 -6.2231696360144674e-02 -2.1445553302714946e+00 -1.2050752439460616e+01 -6.6769541527294163e-01 2.5183948291323235e+00 1.1906104413935289e+01 2.1850974111419805e-01 1.9529281881235643e+00 8.9446927355564352e+00 2.0656670277087333e-01 -2.3004475668171134e+00 -8.6045024343738206e+00 -7.9989064191662307e-01 -1.7046637457816705e+00 -8.8198345517991168e+00 -1.5180783952681598e-01 2.2253453911868610e+00 8.4795701499985707e+00 5.8781063569008896e-01 1.6039869871094314e+00 7.1700313593595499e+00 7.6940113041316593e-01 -2.1509887526818985e+00 -7.0253092332162934e+00 -1.6289431327194645e-01 -2.4689159005317698e-01 -7.0911018765838119e-01 -5.0943071111548370e+00 7.9098641952065937e-02 2.1850974111419794e-01 5.1016007229382030e+00 5.9945622210645540e-02 1.9417484880649888e-01 2.5575655239113746e+00 -1.6201595357074774e-01 -4.2521322627829400e-01 -2.5865065067157831e+00 -3.8525967462230776e-02 -1.4767200052290977e-01 -2.5220512987541808e+00 2.3126106340570010e-01 6.2396124871171510e-01 2.5353802384686346e+00 1.3328356581259043e-01 3.9298229931209461e-01 1.2833092566585376e+00 -5.6155382294846491e-02 -1.4763272348492174e-01 -1.2749908253519506e+00 -2.8986460644068401e+00 -1.5032130498487744e+00 -1.9251586853617580e-01 3.1013268637244327e+00 1.9529281881235643e+00 5.9945622210645533e-02 5.5610445142832940e+00 1.7760853008607422e+00 6.2262138700525015e-02 -5.7336567687615867e+00 -2.1926420239371400e+00 -1.8864721672432111e-01 -1.6000042868689870e+00 -1.4359771317632437e+00 -3.6733065393126124e-02 1.7720860102816669e+00 1.6093759331322670e+00 1.8869909571163979e-01 2.8983908558861189e+00 1.5580989406562202e+00 1.5381173256087427e-01 -3.1005411241380982e+00 -1.7646561572236350e+00 -4.6822438530061711e-02 -1.5101765031360195e+00 -9.1361431648316564e+00 -8.4196589451646964e-01 1.9242065635643208e+00 8.9446927355564352e+00 1.9417484880649882e-01 1.7760853008607422e+00 1.2668078128742481e+01 2.5558707994097141e-01 -2.1696653803727459e+00 -1.2273377234743226e+01 -7.2196996970021299e-01 -1.4214738337302071e+00 -7.5156531034844694e+00 -1.6398815009132681e-01 1.9927482157538701e+00 7.1620612381462045e+00 7.9712194852753693e-01 1.5487977585091888e+00 9.1593040415576379e+00 6.5387805904899521e-01 -2.1405221214491452e+00 -9.0089626409434089e+00 -1.7283792201599374e-01 -1.0563336669874168e-01 -4.6319949794848442e-01 -2.5927075538498752e+00 6.2623565300242504e-02 2.0656670277087327e-01 2.5575655239113750e+00 6.2262138700524994e-02 2.5558707994097141e-01 5.1507966486096963e+00 -1.9179815859546742e-01 -7.3997895780154188e-01 -5.1449203003512656e+00 -3.8473681084609093e-02 -1.7335299268168813e-01 -1.2774717305278533e+00 1.1139034153328847e-01 4.1583808368532010e-01 1.2854439475355024e+00 1.5538082127078728e-01 6.6608875118965438e-01 2.5626871990200701e+00 -5.5751660426025008e-02 -1.6754916915510518e-01 -2.5413937343476496e+00 3.0774404477827053e+00 1.8803341209330724e+00 3.1679653927917334e-01 -3.4226319017627787e+00 -2.3004475668171138e+00 -1.6201595357074774e-01 -5.7336567687615867e+00 -2.1696653803727459e+00 -1.9179815859546742e-01 6.1499551990905088e+00 2.5410615742420539e+00 4.3334092180308809e-01 1.7330595951886920e+00 1.9872936255155174e+00 1.0664890218086970e-01 -2.0755152973876525e+00 -2.1151232089619931e+00 -3.7415665834937428e-01 -3.0934554450329497e+00 -2.1054875152804327e+00 -3.6545411800161764e-01 3.3648041708830592e+00 2.2820343507416423e+00 2.3663852525407619e-01 1.9188339752173760e+00 8.7572459296677660e+00 1.0535082205097768e+00 -2.2934396562839217e+00 -8.6045024343738206e+00 -4.2521322627829400e-01 -2.1926420239371400e+00 -1.2273377234743222e+01 -7.3997895780154188e-01 2.5410615742420548e+00 1.2029483954663144e+01 1.1586082233486630e+00 1.5944929784469355e+00 7.1260538933295132e+00 4.0258847806764131e-01 -2.1254302819908721e+00 -6.8584281688135524e+00 -9.9115940623049270e-01 -1.7237559808030745e+00 -8.8237715010671707e+00 -1.0959667461950484e+00 2.2808794151086405e+00 8.6472955613373461e+00 6.3761341457929654e-01 3.2269900575621663e-01 1.0503525557761648e+00 2.7130142659520340e+00 -3.0166146019447609e-01 -7.9989064191662307e-01 -2.5865065067157831e+00 -1.8864721672432105e-01 -7.2196996970021310e-01 -5.1449203003512656e+00 4.3334092180308820e-01 1.1586082233486625e+00 5.4009388761374924e+00 1.8509425381009656e-01 7.9352003788747483e-01 1.2505989571976155e+00 -3.7392744729488159e-01 -9.8578305683059142e-01 -1.4456403909792304e+00 -3.0463516429484305e-01 -1.1113437320132320e+00 -2.7303933782651950e+00 2.2773710713911988e-01 6.1650658344835696e-01 2.5429084770243318e+00 2.8488569893159785e+00 1.5036147689537036e+00 1.4122567520018459e-01 -3.0645646036664824e+00 -1.7046637457816702e+00 -3.8525967462230776e-02 -1.6000042868689872e+00 -1.4214738337302071e+00 -3.8473681084609100e-02 1.7330595951886920e+00 1.5944929784469353e+00 1.8509425381009656e-01 5.4648138154672123e+00 1.7067481288839845e+00 5.5742404846837568e-02 -5.5631946434076571e+00 -2.1226371284592473e+00 -1.7577160764469221e-01 -2.8398820405197305e+00 -1.4834818784851886e+00 -1.9088863950068313e-01 3.0209151744909715e+00 1.9274007101716910e+00 6.1597561835096688e-02 1.5121188896684945e+00 8.9401569236462848e+00 6.1010870993602140e-01 -2.0926966157505649e+00 -8.8198345517991168e+00 -1.4767200052290977e-01 -1.4359771317632439e+00 -7.5156531034844694e+00 -1.7335299268168816e-01 1.9872936255155178e+00 7.1260538933295132e+00 7.9352003788747472e-01 1.7067481288839841e+00 1.2374373143178389e+01 2.3136992899347605e-01 -2.0855682805953459e+00 -1.1893856151729004e+01 -6.8033555225442133e-01 -1.4892510199905606e+00 -9.0445952230424496e+00 -8.3911655293075693e-01 1.8973324040317159e+00 8.8333550699008523e+00 2.0547842157280519e-01 1.5347202930613163e-01 6.5774062338647810e-01 2.5208005807149707e+00 -5.1617197147623181e-02 -1.5180783952681601e-01 -2.5220512987541808e+00 -3.6733065393126124e-02 -1.6398815009132675e-01 -1.2774717305278533e+00 1.0664890218086971e-01 4.0258847806764131e-01 1.2505989571976155e+00 5.5742404846837554e-02 2.3136992899347611e-01 5.0737533065823062e+00 -1.8475336111473706e-01 -7.2232496957442838e-01 -4.9961320533623486e+00 -9.9975801811655093e-02 -4.4657098847705567e-01 -2.5387977251833660e+00 5.7216089133302499e-02 1.9299291722203138e-01 2.4892999633328547e+00 -3.0618191578419487e+00 -2.0532252756042166e+00 -3.5705200172832652e-01 3.3422810757901691e+00 2.2253453911868610e+00 2.3126106340570010e-01 1.7720860102816673e+00 1.9927482157538701e+00 1.1139034153328847e-01 -2.0755152973876529e+00 -2.1254302819908721e+00 -3.7392744729488159e-01 -5.5631946434076580e+00 -2.0855682805953459e+00 -1.8475336111473706e-01 5.9120043179604460e+00 2.4547984263221916e+00 4.2077331556712244e-01 3.0364701767804623e+00 1.8777922243531902e+00 3.1683910596543230e-01 -3.3623124821754851e+00 -2.2864604194256781e+00 -1.6453101633359857e-01 -1.6808030036974331e+00 -8.6313123392113624e+00 -1.0688445292718649e+00 2.2278700979667101e+00 8.4795701499985707e+00 6.2396124871171499e-01 1.6093759331322670e+00 7.1620612381462037e+00 4.1583808368532010e-01 -2.1151232089619931e+00 -6.8584281688135524e+00 -9.8578305683059142e-01 -2.1226371284592473e+00 -1.1893856151729004e+01 -7.2232496957442827e-01 2.4547984263221920e+00 1.1570594221860887e+01 1.1220722721969159e+00 1.8975157794319379e+00 8.6797014876498384e+00 1.0478187073458045e+00 -2.2709968957344291e+00 -8.5083304379015825e+00 -4.3273775626287170e-01 -2.9797616370058544e-01 -1.0843150419045178e+00 -2.7065119212334747e+00 2.1882313435583783e-01 5.8781063569008896e-01 2.5353802384686346e+00 1.8869909571163979e-01 7.9712194852753693e-01 1.2854439475355024e+00 -3.7415665834937428e-01 -9.9115940623049270e-01 -1.4456403909792304e+00 -1.7577160764469213e-01 -6.8033555225442144e-01 -4.9961320533623486e+00 4.2077331556712244e-01 1.1220722721969159e+00 5.1872963035350095e+00 3.2018804773915444e-01 1.0485425009782405e+00 2.6759048376601386e+00 -3.0057916367910209e-01 -7.9973735700335069e-01 -2.5357409616242328e+00 -1.5962433111899417e+00 -1.4003914594101290e+00 -2.3975753611454664e-01 1.7694746268845583e+00 1.6039869871094314e+00 1.3328356581259043e-01 2.8983908558861189e+00 1.5487977585091888e+00 1.5538082127078728e-01 -3.0934554450329497e+00 -1.7237559808030745e+00 -3.0463516429484305e-01 -2.8398820405197300e+00 -1.4892510199905606e+00 -9.9975801811655093e-02 3.0364701767804623e+00 1.8975157794319379e+00 3.2018804773915438e-01 5.4370429547977075e+00 1.7201666316755424e+00 2.8257320480793929e-01 -5.6117978176062255e+00 -2.1570686965223360e+00 -2.4705713740942703e-01 -1.4045078242083711e+00 -7.3414449491954716e+00 -1.0349904215443813e+00 1.9808960407719234e+00 7.1700313593595499e+00 3.9298229931209466e-01 1.5580989406562202e+00 9.1593040415576379e+00 6.6608875118965438e-01 -2.1054875152804327e+00 -8.8237715010671707e+00 -1.1113437320132318e+00 -1.4834818784851884e+00 -9.0445952230424513e+00 -4.4657098847705579e-01 1.8777922243531902e+00 8.6797014876498366e+00 1.0485425009782405e+00 1.7201666316755424e+00 1.2307732789161797e+01 1.2025032129081465e+00 -2.1434766194828803e+00 -1.2106958004423729e+01 -7.1721162235346836e-01 -2.4090808248548981e-01 -1.0369486127021657e+00 -1.4489177947278751e+00 2.8499868511869209e-01 7.6940113041316593e-01 1.2833092566585376e+00 1.5381173256087430e-01 6.5387805904899510e-01 2.5626871990200701e+00 -3.6545411800161764e-01 -1.0959667461950484e+00 -2.7303933782651950e+00 -1.9088863950068313e-01 -8.3911655293075693e-01 -2.5387977251833660e+00 3.1683910596543230e-01 1.0478187073458045e+00 2.6759048376601391e+00 2.8257320480793935e-01 1.2025032129081468e+00 5.2291723572937734e+00 -2.4097188846514678e-01 -7.0156919788814087e-01 -5.0329647524560830e+00 1.7359198195285763e+00 1.9702121622081743e+00 2.8252408160530684e-01 -2.0799991087911716e+00 -2.1509887526818985e+00 -5.6155382294846484e-02 -3.1005411241380982e+00 -2.1405221214491452e+00 -5.5751660426025015e-02 3.3648041708830592e+00 2.2808794151086400e+00 2.2773710713911988e-01 3.0209151744909710e+00 1.8973324040317161e+00 5.7216089133302492e-02 -3.3623124821754851e+00 -2.2709968957344291e+00 -3.0057916367910209e-01 -5.6117978176062255e+00 -2.1434766194828803e+00 -2.4097188846514675e-01 6.0330113678083706e+00 2.5575604079998224e+00 8.5980816987391462e-02 1.6054384819952101e+00 7.1278127896547065e+00 7.6829680733139571e-01 -2.1642486777367207e+00 -7.0253092332162934e+00 -1.4763272348492171e-01 -1.7646561572236350e+00 -9.0089626409434089e+00 -1.6754916915510515e-01 2.2820343507416423e+00 8.6472955613373461e+00 6.1650658344835674e-01 1.9274007101716906e+00 8.8333550699008523e+00 1.9299291722203138e-01 -2.2864604194256786e+00 -8.5083304379015825e+00 -7.9973735700335080e-01 -2.1570686965223360e+00 -1.2106958004423731e+01 -7.0156919788814087e-01 2.5575604079998224e+00 1.2041096895592110e+01 2.3869213952973575e-01 1.3642538455666753e-01 4.0389763822244290e-01 1.2527297165992497e+00 -6.2231696360144681e-02 -1.6289431327194645e-01 -1.2749908253519506e+00 -4.6822438530061711e-02 -1.7283792201599377e-01 -2.5413937343476496e+00 2.3663852525407614e-01 6.3761341457929643e-01 2.5429084770243318e+00 6.1597561835096695e-02 2.0547842157280516e-01 2.4892999633328547e+00 -1.6453101633359854e-01 -4.3273775626287175e-01 -2.5357409616242328e+00 -2.4705713740942703e-01 -7.1721162235346825e-01 -5.0329647524560830e+00 8.5980816987391448e-02 2.3869213952973573e-01 5.1001521168234802e+00 750 751 752 1209 1210 1211 1221 1222 1223 762 763 764 753 754 755 1212 1213 1214 1224 1225 1226 765 766 767 5.5316829009681312e+00 3.3082171589065923e-01 5.0151138118107619e-02 -5.4733713969791760e+00 -8.2383542593797510e-01 -1.0991806202044917e-01 -2.6910850213580284e+00 -2.4477933480314498e-01 -1.6923786927017785e-02 2.7050387375269667e+00 7.3295005947651237e-01 1.1665197372288895e-01 2.7493890653756448e+00 2.8427277783408195e-01 2.8726963716714196e-02 -2.8069230587731364e+00 -5.2693538191435274e-01 -8.7634083626835196e-02 -1.3764171585805718e+00 -2.3834042431312852e-01 -3.9847113685625775e-02 1.3616859318201684e+00 4.8584601376734798e-01 5.8792970702217118e-02 3.3082171589065934e-01 1.3732183251959707e+01 1.2862918039156930e+00 -8.0068812393865929e-01 -1.3627462200231477e+01 -8.2453927803020510e-01 -2.4638720198279909e-01 -1.0119494841312971e+01 -5.3647727566505443e-01 7.1342042398499461e-01 9.9194617692726279e+00 1.1580076735324514e+00 2.8246536801312805e-01 1.0109171929937176e+01 7.4850281677793817e-01 -9.0602198442019799e-01 -9.9620515156886178e+00 -1.1941454077498201e+00 -2.3854591966509531e-01 -8.2414424560230994e+00 -1.1234863465483502e+00 8.6493572211796810e-01 8.1896340620866503e+00 4.8584601376734743e-01 5.0151138118107633e-02 1.2862918039156928e+00 5.7196227729162992e+00 -1.0403272433187993e-01 -7.8789511905132847e-01 -5.4725074584734923e+00 -3.1149228780961991e-02 -9.2348582505607402e-01 -2.7315361563111695e+00 1.1255452146197484e-01 1.1538499454331532e+00 2.8509250237110506e+00 2.6576256806250108e-02 6.9808853332996157e-01 2.7759394857683843e+00 -1.4775214252437960e-01 -1.1815900757686117e+00 -2.9544905989312391e+00 -3.9392531430914896e-02 -1.1101949849207615e+00 -1.5496390005000047e+00 1.3304471068180351e-01 8.6493572211796788e-01 1.3616859318201684e+00 -5.4733713969791760e+00 -8.0068812393865940e-01 -1.0403272433187993e-01 5.6581172146511811e+00 1.2926891984033690e+00 4.9914677838659736e-02 2.7204169228832433e+00 7.2942549644364052e-01 2.8129232947033143e-02 -2.8841670725029847e+00 -1.2016119255560926e+00 -1.5058375811157115e-01 -2.8056053989099334e+00 -9.2270604289022251e-01 -3.0627796003241791e-02 2.9398414113902960e+00 1.1534601863274592e+00 1.1142696222569251e-01 1.3944073199673783e+00 8.7291755775885937e-01 1.3562051912093334e-01 -1.5496390005000049e+00 -1.1234863465483536e+00 -3.9847113685625796e-02 -8.2383542593797532e-01 -1.3627462200231477e+01 -7.8789511905132847e-01 1.2926891984033690e+00 1.3646358188752854e+01 3.2619562042973760e-01 7.3957075209310197e-01 1.0107411116559208e+01 2.8567034728949642e-01 -1.1997234510172858e+00 -9.9377379305883373e+00 -9.1599999571839241e-01 -5.3263917465113608e-01 -1.0143889324139893e+01 -2.3912609724345954e-01 1.1482612535435519e+00 9.9646325630428763e+00 6.9657811084821786e-01 4.8587183248713817e-01 8.2321300426278707e+00 8.7291755775885649e-01 -1.1101949849207615e+00 -8.2414424560230994e+00 -2.3834042431312791e-01 -1.0991806202044913e-01 -8.2453927803020510e-01 -5.4725074584734932e+00 4.9914677838659743e-02 3.2619562042973760e-01 5.4670318888642067e+00 2.8169602441182228e-02 2.8366913988787745e-01 2.6925328551059127e+00 -8.7737173832900334e-02 -5.2690199420087092e-01 -2.7336376897160455e+00 -1.6635548179857122e-02 -2.4242564726263066e-01 -2.7651422730614863e+00 1.1683331789671027e-01 7.3667624635404882e-01 2.7937325158940998e+00 5.8765717287569706e-02 4.8587183248714033e-01 1.3944073199673785e+00 -3.9392531430915242e-02 -2.3854591966509736e-01 -1.3764171585805718e+00 -2.6910850213580289e+00 -2.4638720198279906e-01 -3.1149228780961991e-02 2.7204169228832429e+00 7.3957075209310197e-01 2.8169602441182221e-02 5.3118120404202553e+00 3.3336215112475626e-01 1.4797275296233696e-02 -5.3205615762848204e+00 -8.2161504899395466e-01 -5.2979417161327425e-02 -1.3757687341674179e+00 -2.4433460575773921e-01 -7.4450582949679173e-03 1.3941896697120257e+00 4.9021088189219270e-01 3.7401380479826121e-02 2.6925328551059113e+00 2.8567034728949597e-01 2.8129232947033206e-02 -2.7315361563111678e+00 -5.3647727566505388e-01 -1.6923786927017920e-02 -2.4477933480314501e-01 -1.0119494841312971e+01 -9.2348582505607402e-01 7.2942549644364052e-01 1.0107411116559209e+01 2.8366913988787745e-01 3.3336215112475631e-01 1.3700424172293109e+01 3.3336215112475720e-01 -8.1519414219816577e-01 -1.3497421593681057e+01 -8.1519414219816666e-01 -2.4019080204283472e-01 -8.4092441634126391e+00 -2.4019080204283505e-01 8.7719331664394984e-01 8.2304090343081189e+00 8.7719331664394817e-01 2.8366913988787518e-01 1.0107411116559209e+01 7.2942549644363786e-01 -9.2348582505607413e-01 -1.0119494841312967e+01 -2.4477933480314468e-01 -1.6923786927017785e-02 -5.3647727566505454e-01 -2.7315361563111695e+00 2.8129232947033143e-02 2.8567034728949642e-01 2.6925328551059127e+00 1.4797275296233696e-02 3.3336215112475714e-01 5.3118120404202553e+00 -5.2979417161327112e-02 -8.2161504899395532e-01 -5.3205615762848204e+00 -7.4450582949678653e-03 -2.4433460575773949e-01 -1.3757687341674179e+00 3.7401380479826003e-02 4.9021088189219308e-01 1.3941896697120260e+00 2.8169602441181916e-02 7.3957075209310219e-01 2.7204169228832424e+00 -3.1149228780961914e-02 -2.4638720198279948e-01 -2.6910850213580275e+00 2.7050387375269667e+00 7.1342042398499461e-01 1.1255452146197484e-01 -2.8841670725029847e+00 -1.1997234510172863e+00 -8.7737173832900334e-02 -5.3205615762848195e+00 -8.1519414219816588e-01 -5.2979417161327119e-02 5.5717938377718799e+00 1.2816336813373583e+00 2.0554654110474052e-01 1.3611715075544919e+00 8.7842090723331090e-01 3.6916711984736075e-02 -1.5505627680605376e+00 -1.1005650971542709e+00 -1.8036939916854206e-01 -2.7336376897160442e+00 -9.1599999571839241e-01 -1.5058375811157063e-01 2.8509250237110497e+00 1.1580076735324514e+00 1.1665197372288874e-01 7.3295005947651237e-01 9.9194617692726261e+00 1.1538499454331532e+00 -1.2016119255560924e+00 -9.9377379305883373e+00 -5.2690199420087080e-01 -8.2161504899395454e-01 -1.3497421593681057e+01 -8.2161504899395554e-01 1.2816336813373583e+00 1.3421811817207081e+01 1.2816336813373592e+00 4.8633948548740974e-01 8.1878285853260913e+00 4.8633948548741002e-01 -1.1046442029835197e+00 -8.0756664862206904e+00 -1.1046442029835182e+00 -5.2690199420086836e-01 -9.9377379305883373e+00 -1.2016119255560898e+00 1.1538499454331530e+00 9.9194617692726261e+00 7.3295005947651182e-01 1.1665197372288894e-01 1.1580076735324516e+00 2.8509250237110506e+00 -1.5058375811157118e-01 -9.1599999571839252e-01 -2.7336376897160455e+00 -5.2979417161327438e-02 -8.1519414219816666e-01 -5.3205615762848195e+00 2.0554654110474052e-01 1.2816336813373592e+00 5.5717938377718772e+00 3.6916711984736172e-02 8.7842090723331079e-01 1.3611715075544919e+00 -1.8036939916854233e-01 -1.1005650971542711e+00 -1.5505627680605374e+00 -8.7737173832900042e-02 -1.1997234510172863e+00 -2.8841670725029829e+00 1.1255452146197502e-01 7.1342042398499494e-01 2.7050387375269649e+00 2.7493890653756448e+00 2.8246536801312810e-01 2.6576256806250108e-02 -2.8056053989099330e+00 -5.3263917465113619e-01 -1.6635548179857115e-02 -1.3757687341674179e+00 -2.4019080204283469e-01 -7.4450582949678618e-03 1.3611715075544919e+00 4.8633948548740985e-01 3.6916711984736179e-02 5.6736617573775483e+00 3.3173796703059344e-01 1.4841077507197091e-02 -5.6136454099372335e+00 -8.3708956337163898e-01 -5.2352607536831006e-02 -2.7651422730614850e+00 -2.3912609724345904e-01 -3.0627796003241649e-02 2.7759394857683843e+00 7.4850281677793762e-01 2.8726963716714269e-02 2.8427277783408195e-01 1.0109171929937176e+01 6.9808853332996157e-01 -9.2270604289022251e-01 -1.0143889324139893e+01 -2.4242564726263069e-01 -2.4433460575773921e-01 -8.4092441634126391e+00 -2.4433460575773946e-01 8.7842090723331068e-01 8.1878285853260930e+00 8.7842090723331079e-01 3.3173796703059344e-01 1.4031312769227529e+01 3.3173796703059422e-01 -7.8305388951735977e-01 -1.3740462402735549e+01 -7.8305388951735821e-01 -2.4242564726262852e-01 -1.0143889324139890e+01 -9.2270604289021985e-01 6.9808853332996168e-01 1.0109171929937173e+01 2.8427277783408150e-01 2.8726963716714196e-02 7.4850281677793806e-01 2.7759394857683843e+00 -3.0627796003241784e-02 -2.3912609724345954e-01 -2.7651422730614863e+00 -7.4450582949679191e-03 -2.4019080204283505e-01 -1.3757687341674179e+00 3.6916711984736068e-02 4.8633948548740991e-01 1.3611715075544919e+00 1.4841077507197094e-02 3.3173796703059433e-01 5.6736617573775474e+00 -5.2352607536830756e-02 -8.3708956337163998e-01 -5.6136454099372344e+00 -1.6635548179856977e-02 -5.3263917465113653e-01 -2.8056053989099317e+00 2.6576256806250018e-02 2.8246536801312855e-01 2.7493890653756439e+00 -2.8069230587731364e+00 -9.0602198442019810e-01 -1.4775214252437963e-01 2.9398414113902960e+00 1.1482612535435519e+00 1.1683331789671027e-01 1.3941896697120257e+00 8.7719331664394984e-01 3.7401380479826003e-02 -1.5505627680605376e+00 -1.1046442029835197e+00 -1.8036939916854233e-01 -5.6136454099372335e+00 -7.8305388951735966e-01 -5.2352607536830777e-02 5.7978582387057251e+00 1.2658328036351780e+00 2.0244657225435941e-01 2.7937325158940984e+00 6.9657811084821974e-01 1.1142696222569208e-01 -2.9544905989312382e+00 -1.1941454077498221e+00 -8.7634083626835030e-02 -5.2693538191435274e-01 -9.9620515156886214e+00 -1.1815900757686120e+00 1.1534601863274592e+00 9.9646325630428763e+00 7.3667624635404894e-01 4.9021088189219275e-01 8.2304090343081189e+00 4.9021088189219308e-01 -1.1005650971542709e+00 -8.0756664862206904e+00 -1.1005650971542711e+00 -8.3708956337163887e-01 -1.3740462402735549e+01 -8.3708956337163998e-01 1.2658328036351776e+00 1.3580557759939603e+01 1.2658328036351767e+00 7.3667624635404638e-01 9.9646325630428798e+00 1.1534601863274563e+00 -1.1815900757686115e+00 -9.9620515156886160e+00 -5.2693538191435230e-01 -8.7634083626835182e-02 -1.1941454077498201e+00 -2.9544905989312391e+00 1.1142696222569251e-01 6.9657811084821797e-01 2.7937325158940998e+00 3.7401380479826135e-02 8.7719331664394806e-01 1.3941896697120260e+00 -1.8036939916854206e-01 -1.1046442029835182e+00 -1.5505627680605374e+00 -5.2352607536831013e-02 -7.8305388951735821e-01 -5.6136454099372344e+00 2.0244657225435941e-01 1.2658328036351767e+00 5.7978582387057251e+00 1.1683331789671006e-01 1.1482612535435504e+00 2.9398414113902938e+00 -1.4775214252437949e-01 -9.0602198442019666e-01 -2.8069230587731360e+00 -1.3764171585805718e+00 -2.3854591966509534e-01 -3.9392531430914896e-02 1.3944073199673783e+00 4.8587183248713811e-01 5.8765717287569706e-02 2.6925328551059113e+00 2.8366913988787518e-01 2.8169602441181919e-02 -2.7336376897160442e+00 -5.2690199420086847e-01 -8.7737173832900028e-02 -2.7651422730614850e+00 -2.4242564726262855e-01 -1.6635548179856977e-02 2.7937325158940984e+00 7.3667624635404627e-01 1.1683331789671006e-01 5.4670318888642004e+00 3.2619562042973482e-01 4.9914677838659223e-02 -5.4725074584734861e+00 -8.2453927803020211e-01 -1.0991806202044899e-01 -2.3834042431312852e-01 -8.2414424560230994e+00 -1.1101949849207615e+00 8.7291755775885949e-01 8.2321300426278707e+00 4.8587183248714033e-01 2.8567034728949597e-01 1.0107411116559208e+01 7.3957075209310230e-01 -9.1599999571839252e-01 -9.9377379305883373e+00 -1.1997234510172865e+00 -2.3912609724345901e-01 -1.0143889324139892e+01 -5.3263917465113653e-01 6.9657811084821974e-01 9.9646325630428780e+00 1.1482612535435504e+00 3.2619562042973482e-01 1.3646358188752846e+01 1.2926891984033662e+00 -7.8789511905132836e-01 -1.3627462200231470e+01 -8.2383542593797476e-01 -3.9847113685625775e-02 -1.1234863465483504e+00 -1.5496390005000047e+00 1.3562051912093334e-01 8.7291755775885638e-01 1.3944073199673785e+00 2.8129232947033209e-02 7.2942549644363786e-01 2.7204169228832420e+00 -1.5058375811157063e-01 -1.2016119255560898e+00 -2.8841670725029833e+00 -3.0627796003241642e-02 -9.2270604289021985e-01 -2.8056053989099317e+00 1.1142696222569207e-01 1.1534601863274563e+00 2.9398414113902938e+00 4.9914677838659216e-02 1.2926891984033662e+00 5.6581172146511758e+00 -1.0403272433187950e-01 -8.0068812393865663e-01 -5.4733713969791697e+00 1.3616859318201686e+00 8.6493572211796810e-01 1.3304471068180354e-01 -1.5496390005000049e+00 -1.1101949849207615e+00 -3.9392531430915242e-02 -2.7315361563111678e+00 -9.2348582505607413e-01 -3.1149228780961914e-02 2.8509250237110493e+00 1.1538499454331532e+00 1.1255452146197503e-01 2.7759394857683839e+00 6.9808853332996179e-01 2.6576256806250021e-02 -2.9544905989312382e+00 -1.1815900757686115e+00 -1.4775214252437949e-01 -5.4725074584734861e+00 -7.8789511905132825e-01 -1.0403272433187950e-01 5.7196227729162956e+00 1.2862918039156928e+00 5.0151138118107563e-02 4.8584601376734804e-01 8.1896340620866503e+00 8.6493572211796788e-01 -1.1234863465483533e+00 -8.2414424560230977e+00 -2.3854591966509739e-01 -5.3647727566505388e-01 -1.0119494841312969e+01 -2.4638720198279951e-01 1.1580076735324512e+00 9.9194617692726261e+00 7.1342042398499494e-01 7.4850281677793751e-01 1.0109171929937174e+01 2.8246536801312849e-01 -1.1941454077498219e+00 -9.9620515156886160e+00 -9.0602198442019644e-01 -8.2453927803020211e-01 -1.3627462200231470e+01 -8.0068812393865663e-01 1.2862918039156928e+00 1.3732183251959704e+01 3.3082171589065895e-01 5.8792970702217125e-02 4.8584601376734748e-01 1.3616859318201684e+00 -3.9847113685625803e-02 -2.3834042431312794e-01 -1.3764171585805720e+00 -1.6923786927017920e-02 -2.4477933480314459e-01 -2.6910850213580271e+00 1.1665197372288874e-01 7.3295005947651182e-01 2.7050387375269649e+00 2.8726963716714272e-02 2.8427277783408150e-01 2.7493890653756434e+00 -8.7634083626835016e-02 -5.2693538191435230e-01 -2.8069230587731360e+00 -1.0991806202044899e-01 -8.2383542593797487e-01 -5.4733713969791697e+00 5.0151138118107570e-02 3.3082171589065895e-01 5.5316829009681268e+00 1209 1210 1211 1257 1258 1259 1269 1270 1271 1221 1222 1223 1212 1213 1214 1260 1261 1262 1272 1273 1274 1224 1225 1226 5.3628546945844837e+00 3.0377339433328376e-01 4.6720167388095091e-02 -5.2974421463714521e+00 -8.0485923486875444e-01 -1.0905372038092848e-01 -2.6803117009033977e+00 -2.2600855808736275e-01 -1.5858073959785474e-02 2.6879457935544759e+00 7.2190310126835178e-01 1.1655126857118710e-01 2.5953938490718524e+00 2.5945333810712939e-01 2.5492620618017495e-02 -2.6499267329681850e+00 -5.0243191918020991e-01 -8.5249774901391989e-02 -1.3343999726276707e+00 -2.1819683412349042e-01 -3.7019626986789150e-02 1.3158862156598929e+00 4.6636671255105239e-01 5.8417139651595368e-02 3.0377339433328365e-01 1.3317196233465978e+01 1.2708907192064451e+00 -7.7104869135398169e-01 -1.3207473471738753e+01 -7.9463445428933521e-01 -2.1989018281668260e-01 -9.9189715811998447e+00 -5.2059922690268290e-01 6.8382786698353448e-01 9.7033238609205235e+00 1.1400068534737504e+00 2.5034556220305748e-01 9.7222291439185113e+00 7.1616218772690365e-01 -8.8977285005624052e-01 -9.5610839296566006e+00 -1.1747503227155616e+00 -2.0739543206592179e-01 -7.9958839761000418e+00 -1.1034424690505706e+00 8.5016033277295333e-01 7.9406637203902184e+00 4.6636671255105105e-01 4.6720167388095070e-02 1.2708907192064451e+00 5.5541867141888552e+00 -1.0317773842713018e-01 -7.6892597848880240e-01 -5.2958371591518842e+00 -2.8082804589146887e-02 -9.0922761681749387e-01 -2.7196464851003017e+00 1.1024561980007763e-01 1.1430051577934770e+00 2.8380057900453108e+00 2.3601978024655329e-02 6.8335338562569803e-01 2.6191076355573522e+00 -1.4813768440847394e-01 -1.1685128653850387e+00 -2.8019192458537754e+00 -3.5164980307842833e-02 -1.1007431347072365e+00 -1.5097834653454498e+00 1.3399544251976614e-01 8.5016033277295100e-01 1.3158862156598925e+00 -5.2974421463714521e+00 -7.7104869135398169e-01 -1.0317773842713021e-01 5.4870209088772830e+00 1.2711341520757011e+00 4.5184945548347434e-02 2.7067668499340320e+00 7.0275843280023298e-01 2.5943563367954465e-02 -2.8707194155703046e+00 -1.1811265940803970e+00 -1.4878766423809736e-01 -2.6506699240323779e+00 -9.0082315059650420e-01 -2.7480096712767941e-02 2.7861152112329592e+00 1.1304726415589421e+00 1.1035620569763864e-01 1.3487119812753094e+00 8.5207567864657441e-01 1.3498041175084383e-01 -1.5097834653454492e+00 -1.1034424690505673e+00 -3.7019626986788845e-02 -8.0485923486875433e-01 -1.3207473471738753e+01 -7.6892597848880240e-01 1.2711341520757009e+00 1.3228410942009875e+01 2.9261275272932069e-01 7.3067198926918508e-01 9.9059319556252454e+00 2.6412913156069573e-01 -1.1870612891669705e+00 -9.7223440913787300e+00 -8.9340389854416180e-01 -5.0190087269079398e-01 -9.7597364222906915e+00 -2.1088636112140507e-01 1.1326825628665542e+00 9.5645717881713850e+00 6.8259550934126456e-01 4.6007582722231494e-01 7.9865232757017139e+00 8.5207567864657785e-01 -1.1007431347072387e+00 -7.9958839761000426e+00 -2.1819683412348928e-01 -1.0905372038092848e-01 -7.9463445428933521e-01 -5.2958371591518842e+00 4.5184945548347427e-02 2.9261275272932075e-01 5.2946501648054758e+00 2.6107440462786926e-02 2.5498781534499482e-01 2.6804728141932430e+00 -8.5224098312148847e-02 -5.0321925065825979e-01 -2.7162318103602665e+00 -1.3263394099665813e-02 -2.0694086966130945e-01 -2.6127667318398560e+00 1.1383089454279847e-01 7.0451361137819590e-01 2.6354007137056503e+00 5.7582912546652862e-02 4.6007582722231338e-01 1.3487119812753092e+00 -3.5164980307842660e-02 -2.0739543206592009e-01 -1.3343999726276703e+00 -2.6803117009033977e+00 -2.1989018281668266e-01 -2.8082804589146883e-02 2.7067668499340316e+00 7.3067198926918508e-01 2.6107440462786919e-02 5.4401004479178487e+00 3.1441389500040745e-01 1.3814953098823961e-02 -5.4416922302615767e+00 -8.1994500114434954e-01 -5.0556749705092940e-02 -1.3356338952014220e+00 -2.2068907254363396e-01 -5.9322363199131988e-03 1.3499441994215760e+00 4.7190846757706084e-01 3.4563907644373060e-02 2.6804728141932381e+00 2.6412913156069423e-01 2.5943563367954628e-02 -2.7196464851002973e+00 -5.2059922690268146e-01 -1.5858073959785519e-02 -2.2600855808736270e-01 -9.9189715811998447e+00 -9.0922761681749398e-01 7.0275843280023298e-01 9.9059319556252454e+00 2.5498781534499482e-01 3.1441389500040745e-01 1.3687992151145819e+01 3.1441389500040934e-01 -7.8773623129053716e-01 -1.3467547303632291e+01 -7.8773623129054149e-01 -2.1326443832183309e-01 -8.1770778963627109e+00 -2.1326443832183314e-01 8.6407670137159054e-01 7.9827122999983864e+00 8.6407670137158932e-01 2.5498781534499615e-01 9.9059319556252383e+00 7.0275843280023687e-01 -9.0922761681749598e-01 -9.9189715811998376e+00 -2.2600855808736173e-01 -1.5858073959785470e-02 -5.2059922690268301e-01 -2.7196464851003017e+00 2.5943563367954458e-02 2.6412913156069567e-01 2.6804728141932430e+00 1.3814953098823956e-02 3.1441389500040934e-01 5.4401004479178496e+00 -5.0556749705092587e-02 -8.1994500114435120e-01 -5.4416922302615776e+00 -5.9322363199132023e-03 -2.2068907254363496e-01 -1.3356338952014222e+00 3.4563907644373060e-02 4.7190846757706195e-01 1.3499441994215762e+00 2.6107440462786728e-02 7.3067198926918597e-01 2.7067668499340276e+00 -2.8082804589147019e-02 -2.1989018281668371e-01 -2.6803117009033937e+00 2.6879457935544759e+00 6.8382786698353459e-01 1.1024561980007766e-01 -2.8707194155703046e+00 -1.1870612891669705e+00 -8.5224098312148819e-02 -5.4416922302615767e+00 -7.8773623129053738e-01 -5.0556749705092573e-02 5.6974237881044250e+00 1.2692587333838494e+00 2.0610152284928840e-01 1.3140017813871721e+00 8.5751784941239440e-01 3.2530261458050186e-02 -1.5087336968992360e+00 -1.0824098842518592e+00 -1.8086016042326411e-01 -2.7162318103602630e+00 -8.9340389854415869e-01 -1.4878766423809731e-01 2.8380057900453068e+00 1.1400068534737473e+00 1.1655126857118658e-01 7.2190310126835189e-01 9.7033238609205235e+00 1.1430051577934770e+00 -1.1811265940803970e+00 -9.7223440913787300e+00 -5.0321925065825990e-01 -8.1994500114434954e-01 -1.3467547303632292e+01 -8.1994500114435109e-01 1.2692587333838496e+00 1.3382151954685119e+01 1.2692587333838532e+00 4.6034424736012713e-01 7.9405362328903362e+00 4.6034424736012719e-01 -1.0902203939227979e+00 -7.8171004230267522e+00 -1.0902203939227966e+00 -5.0321925065826101e-01 -9.7223440913787265e+00 -1.1811265940804003e+00 1.1430051577934788e+00 9.7033238609205199e+00 7.2190310126835022e-01 1.1655126857118708e-01 1.1400068534737504e+00 2.8380057900453113e+00 -1.4878766423809736e-01 -8.9340389854416191e-01 -2.7162318103602665e+00 -5.0556749705092947e-02 -7.8773623129054138e-01 -5.4416922302615776e+00 2.0610152284928840e-01 1.2692587333838530e+00 5.6974237881044258e+00 3.2530261458050463e-02 8.5751784941239739e-01 1.3140017813871721e+00 -1.8086016042326475e-01 -1.0824098842518621e+00 -1.5087336968992364e+00 -8.5224098312149207e-02 -1.1870612891669743e+00 -2.8707194155703024e+00 1.1024561980007866e-01 6.8382786698353792e-01 2.6879457935544719e+00 2.5953938490718524e+00 2.5034556220305748e-01 2.3601978024655329e-02 -2.6506699240323779e+00 -5.0190087269079386e-01 -1.3263394099665810e-02 -1.3356338952014220e+00 -2.1326443832183306e-01 -5.9322363199132023e-03 1.3140017813871721e+00 4.6034424736012713e-01 3.2530261458050463e-02 5.2391206105241039e+00 2.9172829658084531e-01 1.2178429032018847e-02 -5.1685533254668243e+00 -7.9252862173690142e-01 -4.7127562000395112e-02 -2.6127667318398529e+00 -2.1088636112140466e-01 -2.7480096712768107e-02 2.6191076355573477e+00 7.1616218772690310e-01 2.5492620618017579e-02 2.5945333810712939e-01 9.7222291439185113e+00 6.8335338562569803e-01 -9.0082315059650431e-01 -9.7597364222906915e+00 -2.0694086966130942e-01 -2.2068907254363396e-01 -8.1770778963627109e+00 -2.2068907254363496e-01 8.5751784941239440e-01 7.9405362328903362e+00 8.5751784941239739e-01 2.9172829658084548e-01 1.3279192317649301e+01 2.9172829658084587e-01 -7.6359977692461800e-01 -1.2967636097432566e+01 -7.6359977692461722e-01 -2.0694086966131109e-01 -9.7597364222906844e+00 -9.0082315059650786e-01 6.8335338562570047e-01 9.7222291439185042e+00 2.5945333810712812e-01 2.5492620618017499e-02 7.1616218772690365e-01 2.6191076355573522e+00 -2.7480096712767948e-02 -2.1088636112140516e-01 -2.6127667318398560e+00 -5.9322363199132014e-03 -2.1326443832183320e-01 -1.3356338952014222e+00 3.2530261458050200e-02 4.6034424736012725e-01 1.3140017813871721e+00 1.2178429032018850e-02 2.9172829658084587e-01 5.2391206105241030e+00 -4.7127562000394856e-02 -7.9252862173690231e-01 -5.1685533254668234e+00 -1.3263394099665775e-02 -5.0190087269079386e-01 -2.6506699240323739e+00 2.3601978024655298e-02 2.5034556220305754e-01 2.5953938490718471e+00 -2.6499267329681850e+00 -8.8977285005624052e-01 -1.4813768440847391e-01 2.7861152112329592e+00 1.1326825628665540e+00 1.1383089454279847e-01 1.3499441994215760e+00 8.6407670137159032e-01 3.4563907644373060e-02 -1.5087336968992360e+00 -1.0902203939227979e+00 -1.8086016042326475e-01 -5.1685533254668243e+00 -7.6359977692461789e-01 -4.7127562000394849e-02 5.3576728768278334e+00 1.2389885700398093e+00 2.0262417384871451e-01 2.6354007137056468e+00 6.8259550934126556e-01 1.1035620569763918e-01 -2.8019192458537705e+00 -1.1747503227155627e+00 -8.5249774901391712e-02 -5.0243191918020991e-01 -9.5610839296566006e+00 -1.1685128653850387e+00 1.1304726415589421e+00 9.5645717881713850e+00 7.0451361137819579e-01 4.7190846757706084e-01 7.9827122999983873e+00 4.7190846757706195e-01 -1.0824098842518590e+00 -7.8171004230267513e+00 -1.0824098842518624e+00 -7.9252862173690142e-01 -1.2967636097432566e+01 -7.9252862173690231e-01 1.2389885700398096e+00 1.2795048503431364e+01 1.2389885700398089e+00 7.0451361137819690e-01 9.5645717881713814e+00 1.1304726415589454e+00 -1.1685128653850403e+00 -9.5610839296565935e+00 -5.0243191918020857e-01 -8.5249774901392003e-02 -1.1747503227155616e+00 -2.8019192458537754e+00 1.1035620569763864e-01 6.8259550934126467e-01 2.6354007137056499e+00 3.4563907644373067e-02 8.6407670137158932e-01 1.3499441994215762e+00 -1.8086016042326411e-01 -1.0902203939227966e+00 -1.5087336968992364e+00 -4.7127562000395119e-02 -7.6359977692461734e-01 -5.1685533254668234e+00 2.0262417384871451e-01 1.2389885700398087e+00 5.3576728768278326e+00 1.1383089454279888e-01 1.1326825628665531e+00 2.7861152112329561e+00 -1.4813768440847425e-01 -8.8977285005623974e-01 -2.6499267329681802e+00 -1.3343999726276710e+00 -2.0739543206592176e-01 -3.5164980307842833e-02 1.3487119812753094e+00 4.6007582722231494e-01 5.7582912546652862e-02 2.6804728141932381e+00 2.5498781534499615e-01 2.6107440462786728e-02 -2.7162318103602630e+00 -5.0321925065826101e-01 -8.5224098312149207e-02 -2.6127667318398529e+00 -2.0694086966131103e-01 -1.3263394099665772e-02 2.6354007137056468e+00 7.0451361137819679e-01 1.1383089454279888e-01 5.2946501648054589e+00 2.9261275272932141e-01 4.5184945548347698e-02 -5.2958371591518674e+00 -7.9463445428933543e-01 -1.0905372038092834e-01 -2.1819683412349045e-01 -7.9958839761000418e+00 -1.1007431347072365e+00 8.5207567864657430e-01 7.9865232757017148e+00 4.6007582722231349e-01 2.6412913156069423e-01 9.9059319556252383e+00 7.3067198926918597e-01 -8.9340389854415869e-01 -9.7223440913787282e+00 -1.1870612891669738e+00 -2.1088636112140466e-01 -9.7597364222906862e+00 -5.0190087269079386e-01 6.8259550934126545e-01 9.5645717881713814e+00 1.1326825628665529e+00 2.9261275272932141e-01 1.3228410942009855e+01 1.2711341520757045e+00 -7.6892597848880440e-01 -1.3207473471738728e+01 -8.0485923486875222e-01 -3.7019626986789150e-02 -1.1034424690505706e+00 -1.5097834653454498e+00 1.3498041175084383e-01 8.5207567864657785e-01 1.3487119812753092e+00 2.5943563367954621e-02 7.0275843280023687e-01 2.7067668499340276e+00 -1.4878766423809733e-01 -1.1811265940804001e+00 -2.8707194155703024e+00 -2.7480096712768107e-02 -9.0082315059650786e-01 -2.6506699240323739e+00 1.1035620569763921e-01 1.1304726415589454e+00 2.7861152112329561e+00 4.5184945548347698e-02 1.2711341520757047e+00 5.4870209088772697e+00 -1.0317773842713117e-01 -7.7104869135398579e-01 -5.2974421463714352e+00 1.3158862156598929e+00 8.5016033277295333e-01 1.3399544251976614e-01 -1.5097834653454492e+00 -1.1007431347072387e+00 -3.5164980307842653e-02 -2.7196464851002973e+00 -9.0922761681749598e-01 -2.8082804589147019e-02 2.8380057900453068e+00 1.1430051577934788e+00 1.1024561980007867e-01 2.6191076355573477e+00 6.8335338562570058e-01 2.3601978024655294e-02 -2.8019192458537705e+00 -1.1685128653850403e+00 -1.4813768440847427e-01 -5.2958371591518683e+00 -7.6892597848880428e-01 -1.0317773842713114e-01 5.5541867141888375e+00 1.2708907192064467e+00 4.6720167388094938e-02 4.6636671255105233e-01 7.9406637203902184e+00 8.5016033277295100e-01 -1.1034424690505673e+00 -7.9958839761000426e+00 -2.0739543206592007e-01 -5.2059922690268157e-01 -9.9189715811998376e+00 -2.1989018281668368e-01 1.1400068534737473e+00 9.7033238609205199e+00 6.8382786698353781e-01 7.1616218772690299e-01 9.7222291439185042e+00 2.5034556220305754e-01 -1.1747503227155627e+00 -9.5610839296565953e+00 -8.8977285005623963e-01 -7.9463445428933555e-01 -1.3207473471738727e+01 -7.7104869135398546e-01 1.2708907192064467e+00 1.3317196233465957e+01 3.0377339433328254e-01 5.8417139651595389e-02 4.6636671255105105e-01 1.3158862156598925e+00 -3.7019626986788831e-02 -2.1819683412348925e-01 -1.3343999726276703e+00 -1.5858073959785519e-02 -2.2600855808736173e-01 -2.6803117009033937e+00 1.1655126857118657e-01 7.2190310126835022e-01 2.6879457935544715e+00 2.5492620618017582e-02 2.5945333810712812e-01 2.5953938490718471e+00 -8.5249774901391698e-02 -5.0243191918020846e-01 -2.6499267329681802e+00 -1.0905372038092834e-01 -8.0485923486875233e-01 -5.2974421463714352e+00 4.6720167388094959e-02 3.0377339433328249e-01 5.3628546945844668e+00 327 328 329 1122 1123 1124 1188 1189 1190 729 730 731 330 331 332 1125 1126 1127 1191 1192 1193 732 733 734 6.4457728646596735e+00 2.8718952922613461e+00 1.1353478028489770e+00 -6.7362509082611215e+00 -3.0632059050533078e+00 -9.9463206262014303e-01 -4.1101040025591065e+00 -2.7444076655623229e+00 -7.4667154160309790e-01 4.4254633146337925e+00 2.7435493723406243e+00 1.1582371664124653e+00 3.9629717005034459e+00 2.5956711243514303e+00 7.9122067671022267e-01 -4.2883359365429019e+00 -2.4408773633084899e+00 -1.0678538124782173e+00 -2.8573768948722589e+00 -2.4419241474326823e+00 -1.0034225599934763e+00 3.1578598624384768e+00 2.4792992924033994e+00 7.2777433072327047e-01 2.8718952922613465e+00 8.2371681027368311e+00 1.5457609920143807e+00 -3.0414329007208201e+00 -7.9505399579331701e+00 -1.1704746345854751e+00 -2.7048854141755387e+00 -5.9900341874732765e+00 -1.0424799759696697e+00 2.7392549215978033e+00 5.3982219159837372e+00 1.3801092328575653e+00 2.5626446984309270e+00 5.7452208518262866e+00 1.1145210615252423e+00 -2.7196038337332107e+00 -5.2156683705107412e+00 -1.3493787052429858e+00 -2.4214004853294826e+00 -4.4600335273493004e+00 -1.3802095973341677e+00 2.7135277216689757e+00 4.2356651727196324e+00 9.0215162673511040e-01 1.1353478028489770e+00 1.5457609920143809e+00 4.9461611349964878e+00 -9.6416058814638472e-01 -1.1414603225210989e+00 -4.5837623735769668e+00 -9.2686029432463002e-01 -1.3158753434597710e+00 -2.5055749958789604e+00 1.1415257071257487e+00 1.3640255747655212e+00 2.7359497385996359e+00 7.4637861608244771e-01 1.0672617295476745e+00 2.4127854731781966e+00 -1.1368308082306207e+00 -1.2884780330405312e+00 -2.7125451358540147e+00 -9.7501111683802377e-01 -1.3525011757945091e+00 -1.6533941550995290e+00 9.7961068148248598e-01 1.1212665784883331e+00 1.3603803136351511e+00 -6.7362509082611215e+00 -3.0414329007208196e+00 -9.6416058814638428e-01 7.2138196417424245e+00 3.2040859001977249e+00 7.3079661202134005e-01 4.5002349748718373e+00 2.9156556030262690e+00 6.7324087158736046e-01 -4.8940001626696636e+00 -2.8544807471717344e+00 -1.1049920571344463e+00 -4.3361479374244380e+00 -2.9472984307769958e+00 -5.9067430994133652e-01 4.6684268649463947e+00 2.7389165430600597e+00 8.8885524429240248e-01 3.1921069777561693e+00 2.7533940177085090e+00 1.0145271428239266e+00 -3.6081894509616022e+00 -2.7688399853230123e+00 -6.4759291550286213e-01 -3.0632059050533069e+00 -7.9505399579331693e+00 -1.1414603225210986e+00 3.2040859001977249e+00 7.7936413232384538e+00 8.0076777370314800e-01 2.9230814938046397e+00 5.7565816228093070e+00 8.2878775766038071e-01 -2.9120989309239680e+00 -5.2129232922054305e+00 -1.1879245613927680e+00 -2.5863012015444204e+00 -5.6129914052732852e+00 -6.9158389807197096e-01 2.7000752165698065e+00 5.0603908421051322e+00 9.5359190851527564e-01 2.4575671017927170e+00 4.2655728733498943e+00 1.1392043296505312e+00 -2.7232036748431945e+00 -4.0997320060908988e+00 -7.0138298754349859e-01 -9.9463206262014314e-01 -1.1704746345854751e+00 -4.5837623735769668e+00 7.3079661202133994e-01 8.0076777370314800e-01 4.4705480289137034e+00 6.3410939590944382e-01 7.7947658122316832e-01 2.3515820872967788e+00 -8.3531212454223280e-01 -8.7643999627873337e-01 -2.4821871880732314e+00 -5.3991771042177183e-01 -7.3110113433351098e-01 -2.3027605638571940e+00 9.1774542182792396e-01 1.0009594945465197e+00 2.4232377356941242e+00 6.9285000273863584e-01 8.6372534510574495e-01 1.3756332752255203e+00 -6.0563953491319589e-01 -6.6691342938086096e-01 -1.2522910016227338e+00 -4.1101040025591056e+00 -2.7048854141755387e+00 -9.2686029432463002e-01 4.5002349748718373e+00 2.9230814938046397e+00 6.3410939590944393e-01 6.7414088661547549e+00 3.2540396377795315e+00 7.3397920941725969e-01 -7.0529202978933103e+00 -3.2647485711885857e+00 -1.0502283755507948e+00 -2.9006365224264732e+00 -2.6245983573592082e+00 -5.1860316933336259e-01 3.1930440467096122e+00 2.4466588976790646e+00 8.9095109170167752e-01 4.2040816451497189e+00 2.8000617197212119e+00 8.7682719266961762e-01 -4.5751087100070364e+00 -2.8296094062611132e+00 -6.4017505048921164e-01 -2.7444076655623224e+00 -5.9900341874732765e+00 -1.3158753434597710e+00 2.9156556030262690e+00 5.7565816228093070e+00 7.7947658122316821e-01 3.2540396377795320e+00 8.9877011622135132e+00 1.0253736586453752e+00 -3.2880965112062261e+00 -8.3163184362682472e+00 -1.3269865553575682e+00 -2.5557460090721515e+00 -4.8371700617988616e+00 -7.3961892011975605e-01 2.7722368890461877e+00 4.2233053761584118e+00 1.1977807886322653e+00 2.7579748499020260e+00 6.0888653295837321e+00 1.2173223149596692e+00 -3.1116567939133160e+00 -5.9129308052245806e+00 -8.3747252452338350e-01 -7.4667154160309812e-01 -1.0424799759696697e+00 -2.5055749958789604e+00 6.7324087158736023e-01 8.2878775766038071e-01 2.3515820872967788e+00 7.3397920941725969e-01 1.0253736586453752e+00 4.6531226959237095e+00 -1.0423465880350642e+00 -1.3081160499562996e+00 -4.7749651353644129e+00 -5.5057419621883574e-01 -8.0621701055925787e-01 -1.2631725248338417e+00 7.4954362044349487e-01 8.9754338213069440e-01 1.3841215151965285e+00 8.6298186544730593e-01 1.2186177738512898e+00 2.5550169218163856e+00 -6.8015324103842234e-01 -8.1350953580251251e-01 -2.4001305641561852e+00 4.4254633146337925e+00 2.7392549215978033e+00 1.1415257071257487e+00 -4.8940001626696636e+00 -2.9120989309239680e+00 -8.3531212454223280e-01 -7.0529202978933103e+00 -3.2880965112062261e+00 -1.0423465880350644e+00 7.5484367463973108e+00 3.2278188445551810e+00 1.4370719386790505e+00 3.1435305139654122e+00 2.8149727230776742e+00 7.0704423375939485e-01 -3.5610050513419664e+00 -2.5674576278736785e+00 -1.1595034044781847e+00 -4.5208215644107614e+00 -2.9551846739367842e+00 -1.2517820305514928e+00 4.9113165013191855e+00 2.9407912547099979e+00 1.0033022680427814e+00 2.7435493723406239e+00 5.3982219159837364e+00 1.3640255747655212e+00 -2.8544807471717344e+00 -5.2129232922054314e+00 -8.7643999627873337e-01 -3.2647485711885857e+00 -8.3163184362682472e+00 -1.3081160499562996e+00 3.2278188445551814e+00 7.8650834837769725e+00 1.5064133051175066e+00 2.4059693721319872e+00 4.2160890078661293e+00 8.4750610497582524e-01 -2.5576409336718933e+00 -3.7655012289688452e+00 -1.2061141159306943e+00 -2.6108779050346502e+00 -5.5283672780283544e+00 -1.4112384458826435e+00 2.9104105680390719e+00 5.3437158278440391e+00 1.0839636231895193e+00 1.1582371664124653e+00 1.3801092328575650e+00 2.7359497385996359e+00 -1.1049920571344463e+00 -1.1879245613927678e+00 -2.4821871880732314e+00 -1.0502283755507946e+00 -1.3269865553575682e+00 -4.7749651353644138e+00 1.4370719386790505e+00 1.5064133051175066e+00 5.1455657699244544e+00 8.8405437751436033e-01 1.2252035232573728e+00 1.3385271515832027e+00 -1.1612739193114889e+00 -1.2125748276021651e+00 -1.6463222247957932e+00 -1.1567059890005285e+00 -1.4716049518873893e+00 -2.8446345611344510e+00 9.9383685839138269e-01 1.0873648350074456e+00 2.5280664492605989e+00 3.9629717005034459e+00 2.5626446984309270e+00 7.4637861608244760e-01 -4.3361479374244380e+00 -2.5863012015444196e+00 -5.3991771042177183e-01 -2.9006365224264732e+00 -2.5557460090721515e+00 -5.5057419621883574e-01 3.1435305139654122e+00 2.4059693721319872e+00 8.8405437751436011e-01 6.4510013614268651e+00 2.9399376827955894e+00 6.0652722990374419e-01 -6.6624197016950166e+00 -2.9998856522801627e+00 -8.8342721330600282e-01 -4.0285565445882465e+00 -2.5910145933758915e+00 -9.0188373660981980e-01 4.3702571302384516e+00 2.8243957029141211e+00 6.3884263305587830e-01 2.5956711243514308e+00 5.7452208518262866e+00 1.0672617295476745e+00 -2.9472984307769958e+00 -5.6129914052732861e+00 -7.3110113433351098e-01 -2.6245983573592087e+00 -4.8371700617988616e+00 -8.0621701055925787e-01 2.8149727230776742e+00 4.2160890078661284e+00 1.2252035232573726e+00 2.9399376827955894e+00 8.6545139012975074e+00 8.7222387041732441e-01 -2.9173503194511223e+00 -7.9157051196068631e+00 -1.1256916460396984e+00 -2.6441137089218065e+00 -5.9482542417691358e+00 -1.3065230592072776e+00 2.7827792862844385e+00 5.6982970674582205e+00 8.0484372691737338e-01 7.9122067671022267e-01 1.1145210615252423e+00 2.4127854731781966e+00 -5.9067430994133652e-01 -6.9158389807197096e-01 -2.3027605638571940e+00 -5.1860316933336259e-01 -7.3961892011975605e-01 -1.2631725248338417e+00 7.0704423375939496e-01 8.4750610497582524e-01 1.3385271515832027e+00 6.0652722990374430e-01 8.7222387041732441e-01 4.5936403797234320e+00 -9.1672392319221763e-01 -1.1987636937676882e+00 -4.6239536096243485e+00 -6.7260866234152228e-01 -9.6459748661653721e-01 -2.5118014459379800e+00 5.9381792443507753e-01 7.6031296165756035e-01 2.3567351397685328e+00 -4.2883359365429019e+00 -2.7196038337332107e+00 -1.1368308082306207e+00 4.6684268649463947e+00 2.7000752165698061e+00 9.1774542182792385e-01 3.1930440467096122e+00 2.7722368890461877e+00 7.4954362044349487e-01 -3.5610050513419664e+00 -2.5576409336718933e+00 -1.1612739193114889e+00 -6.6624197016950166e+00 -2.9173503194511232e+00 -9.1672392319221740e-01 7.0769767741181608e+00 2.9053262713101189e+00 1.2723689764863213e+00 4.3558599892419654e+00 2.6170713212017591e+00 1.1102334550724113e+00 -4.7825469854362490e+00 -2.8001146112716455e+00 -8.3506282309582469e-01 -2.4408773633084899e+00 -5.2156683705107403e+00 -1.2884780330405308e+00 2.7389165430600597e+00 5.0603908421051322e+00 1.0009594945465194e+00 2.4466588976790646e+00 4.2233053761584118e+00 8.9754338213069440e-01 -2.5674576278736785e+00 -3.7655012289688443e+00 -1.2125748276021648e+00 -2.9998856522801627e+00 -7.9157051196068613e+00 -1.1987636937676882e+00 2.9053262713101184e+00 7.4188847399310793e+00 1.3459025484343012e+00 2.6622841798687094e+00 5.3469889332894924e+00 1.3459522534763046e+00 -2.7449652484556228e+00 -5.1526951723976699e+00 -8.9054112417743569e-01 -1.0678538124782175e+00 -1.3493787052429860e+00 -2.7125451358540147e+00 8.8885524429240270e-01 9.5359190851527575e-01 2.4232377356941242e+00 8.9095109170167752e-01 1.1977807886322653e+00 1.3841215151965287e+00 -1.1595034044781847e+00 -1.2061141159306943e+00 -1.6463222247957932e+00 -8.8342721330600260e-01 -1.1256916460396988e+00 -4.6239536096243476e+00 1.2723689764863213e+00 1.3459025484343012e+00 4.9271586005413290e+00 1.1068695214953248e+00 1.3206157192524530e+00 2.7578814932729743e+00 -1.0482604037133214e+00 -1.1367064976209160e+00 -2.5095783744308013e+00 -2.8573768948722589e+00 -2.4214004853294822e+00 -9.7501111683802366e-01 3.1921069777561693e+00 2.4575671017927170e+00 6.9285000273863584e-01 4.2040816451497189e+00 2.7579748499020260e+00 8.6298186544730593e-01 -4.5208215644107623e+00 -2.6108779050346498e+00 -1.1567059890005282e+00 -4.0285565445882465e+00 -2.6441137089218065e+00 -6.7260866234152228e-01 4.3558599892419654e+00 2.6622841798687094e+00 1.1068695214953248e+00 6.6305939523419903e+00 2.9658709523180589e+00 1.1951114246956209e+00 -6.9758875606185775e+00 -3.1673049845955727e+00 -1.0534870461968135e+00 -2.4419241474326823e+00 -4.4600335273493013e+00 -1.3525011757945091e+00 2.7533940177085090e+00 4.2655728733498943e+00 8.6372534510574495e-01 2.8000617197212114e+00 6.0888653295837321e+00 1.2186177738512898e+00 -2.9551846739367846e+00 -5.5283672780283553e+00 -1.4716049518873897e+00 -2.5910145933758919e+00 -5.9482542417691358e+00 -9.6459748661653744e-01 2.6170713212017591e+00 5.3469889332894924e+00 1.3206157192524532e+00 2.9658709523180598e+00 8.5590090648465065e+00 1.6467756547373555e+00 -3.1482745962041809e+00 -8.3237811539228357e+00 -1.2610308786484083e+00 -1.0034225599934761e+00 -1.3802095973341677e+00 -1.6533941550995290e+00 1.0145271428239266e+00 1.1392043296505312e+00 1.3756332752255203e+00 8.7682719266961762e-01 1.2173223149596692e+00 2.5550169218163856e+00 -1.2517820305514928e+00 -1.4112384458826437e+00 -2.8446345611344510e+00 -9.0188373660981980e-01 -1.3065230592072776e+00 -2.5118014459379805e+00 1.1102334550724113e+00 1.3459522534763046e+00 2.7578814932729743e+00 1.1951114246956207e+00 1.6467756547373558e+00 5.1408564972541999e+00 -1.0396108881067880e+00 -1.2512834503997718e+00 -4.8195580253971206e+00 3.1578598624384768e+00 2.7135277216689757e+00 9.7961068148248598e-01 -3.6081894509616022e+00 -2.7232036748431940e+00 -6.0563953491319578e-01 -4.5751087100070364e+00 -3.1116567939133160e+00 -6.8015324103842245e-01 4.9113165013191855e+00 2.9104105680390719e+00 9.9383685839138269e-01 4.3702571302384516e+00 2.7827792862844394e+00 5.9381792443507753e-01 -4.7825469854362481e+00 -2.7449652484556233e+00 -1.0482604037133216e+00 -6.9758875606185775e+00 -3.1482745962041818e+00 -1.0396108881067880e+00 7.5022992130273511e+00 3.3213827374238276e+00 8.0639860346278192e-01 2.4792992924033999e+00 4.2356651727196324e+00 1.1212665784883336e+00 -2.7688399853230132e+00 -4.0997320060908988e+00 -6.6691342938086084e-01 -2.8296094062611132e+00 -5.9129308052245806e+00 -8.1350953580251251e-01 2.9407912547099979e+00 5.3437158278440391e+00 1.0873648350074456e+00 2.8243957029141207e+00 5.6982970674582205e+00 7.6031296165756024e-01 -2.8001146112716455e+00 -5.1526951723976708e+00 -1.1367064976209160e+00 -3.1673049845955727e+00 -8.3237811539228375e+00 -1.2512834503997718e+00 3.3213827374238272e+00 8.2114610696140886e+00 8.9946853805072247e-01 7.2777433072327058e-01 9.0215162673511051e-01 1.3603803136351513e+00 -6.4759291550286213e-01 -7.0138298754349859e-01 -1.2522910016227338e+00 -6.4017505048921164e-01 -8.3747252452338350e-01 -2.4001305641561852e+00 1.0033022680427814e+00 1.0839636231895193e+00 2.5280664492605989e+00 6.3884263305587830e-01 8.0484372691737338e-01 2.3567351397685328e+00 -8.3506282309582469e-01 -8.9054112417743558e-01 -2.5095783744308013e+00 -1.0534870461968133e+00 -1.2610308786484081e+00 -4.8195580253971197e+00 8.0639860346278214e-01 8.9946853805072258e-01 4.7363760629425578e+00 1122 1123 1124 1149 1150 1151 1236 1237 1238 1188 1189 1190 1125 1126 1127 1152 1153 1154 1239 1240 1241 1191 1192 1193 6.3313026162497783e+00 2.7550355767217134e+00 1.0985456664861335e+00 -6.6233917404214759e+00 -2.9569156001821026e+00 -9.6926561888729079e-01 -3.9286836472281799e+00 -2.6131196531045671e+00 -7.0213987349200824e-01 4.2473604960747373e+00 2.6211716332370978e+00 1.1232396420092767e+00 3.8310807275361078e+00 2.4793188493585747e+00 7.6071545991810519e-01 -4.1625284918397529e+00 -2.3280658227589224e+00 -1.0323433054357309e+00 -2.7059229015694397e+00 -2.3170824269026817e+00 -9.6612937182931480e-01 3.0107829411982237e+00 2.3596574436308875e+00 6.8737740123083124e-01 2.7550355767217130e+00 8.0834169467292405e+00 1.5048648714332318e+00 -2.9240368672611434e+00 -7.7938265352283542e+00 -1.1353852260270130e+00 -2.5799260904362282e+00 -5.7668091325041289e+00 -9.8994949892843676e-01 2.6105919271854350e+00 5.1678108579513520e+00 1.3351996626351446e+00 2.4475159417625716e+00 5.5747725046442378e+00 1.0808945467294182e+00 -2.6079244829062853e+00 -5.0402162409171618e+00 -1.3062546949443883e+00 -2.2993688624602213e+00 -4.2645018219285511e+00 -1.3394892856330296e+00 2.5981128573941565e+00 4.0393534212533648e+00 8.5011962473507530e-01 1.0985456664861335e+00 1.5048648714332318e+00 4.9185084069938201e+00 -9.2117591748523120e-01 -1.0891218520904640e+00 -4.5487824991127770e+00 -8.8430080933348265e-01 -1.2661580084549833e+00 -2.4116960976340378e+00 1.1014502948147529e+00 1.3162350354995052e+00 2.6505538536445923e+00 7.0313722832190040e-01 1.0153451990616313e+00 2.3612380171698866e+00 -1.1052776860679874e+00 -1.2467899127179913e+00 -2.6676341409540050e+00 -9.3576845793415342e-01 -1.3074190375428940e+00 -1.5932789754331247e+00 9.4338968119806721e-01 1.0730437048119637e+00 1.2910914353256469e+00 -6.6233917404214768e+00 -2.9240368672611434e+00 -9.2117591748523120e-01 7.1167287603418359e+00 3.0955151705973361e+00 6.9323986545440008e-01 4.3242349241596196e+00 2.7903107329652475e+00 6.2658859009181977e-01 -4.7273047650265285e+00 -2.7339314296776349e+00 -1.0701483247107544e+00 -4.2100495391550901e+00 -2.8365467520443786e+00 -5.5392511507646935e-01 4.5495246283640656e+00 2.6280630192271905e+00 8.4779627602486485e-01 3.0419555765029545e+00 2.6349738325891181e+00 9.8155240733146409e-01 -3.4716978447653806e+00 -2.6543477063957348e+00 -6.0392778163009608e-01 -2.9569156001821026e+00 -7.7938265352283542e+00 -1.0891218520904637e+00 3.0955151705973352e+00 7.6432192472206442e+00 7.5582910989122942e-01 2.8033446234690738e+00 5.5351563702637696e+00 7.7303557731136008e-01 -2.7854457535678514e+00 -4.9872855282426318e+00 -1.1412245742932070e+00 -2.4762320147587058e+00 -5.4453206856736660e+00 -6.4806663840450884e-01 2.5902639336345548e+00 4.8854571655642740e+00 9.0316897759764347e-01 2.3372437299871036e+00 4.0698176439333045e+00 1.0956157526414585e+00 -2.6077740891794061e+00 -3.9072176778373424e+00 -6.4923635265351409e-01 -9.6926561888729068e-01 -1.1353852260270132e+00 -4.5487824991127770e+00 6.9323986545440008e-01 7.5582910989122953e-01 4.4439796153626201e+00 5.9373398860036575e-01 7.3006407988139677e-01 2.2635553068179282e+00 -7.9756566304251786e-01 -8.3141934680333063e-01 -2.3954154137200314e+00 -5.0233560103052610e-01 -6.8363775641165359e-01 -2.2565999576847240e+00 8.9134982857197986e-01 9.6606847620928737e-01 2.3728971183590071e+00 6.5773446053504037e-01 8.1878802660970873e-01 1.3101976951408423e+00 -5.6689126020145142e-01 -6.2030736334962500e-01 -1.1898318651628654e+00 -3.9286836472281803e+00 -2.5799260904362282e+00 -8.8430080933348254e-01 4.3242349241596196e+00 2.8033446234690738e+00 5.9373398860036575e-01 6.3344374015699660e+00 3.0916058578642098e+00 6.7696431135616941e-01 -6.6456069911314017e+00 -3.1044846235930188e+00 -1.0008872255294305e+00 -2.7505100907901503e+00 -2.5049765126376200e+00 -4.8129314371061999e-01 3.0456224698633676e+00 2.3268512236956229e+00 8.5042892517667845e-01 3.9199795233577204e+00 2.6547494736972990e+00 8.3560851890955312e-01 -4.2994735898009404e+00 -2.6871639520593376e+00 -5.9025456546923516e-01 -2.6131196531045662e+00 -5.7668091325041289e+00 -1.2661580084549833e+00 2.7903107329652475e+00 5.5351563702637696e+00 7.3006407988139677e-01 3.0916058578642098e+00 8.5275641318280648e+00 9.5375542371667543e-01 -3.1301622875180275e+00 -7.8454130438031582e+00 -1.2714504598567711e+00 -2.4325457843062392e+00 -4.6489589011818744e+00 -6.9258510197088641e-01 2.6588214107062629e+00 4.0257787180039175e+00 1.1526414461734222e+00 2.6140700748400536e+00 5.7539172259814215e+00 1.1701119500275838e+00 -2.9789803514469386e+00 -5.5812353685880129e+00 -7.7637932951643995e-01 -7.0213987349200824e-01 -9.8994949892843676e-01 -2.4116960976340374e+00 6.2658859009181989e-01 7.7303557731136008e-01 2.2635553068179282e+00 6.7696431135616952e-01 9.5375542371667565e-01 4.3594814064807705e+00 -9.8378824231183748e-01 -1.2403653691802707e+00 -4.4771346488325046e+00 -5.0656320835801716e-01 -7.5057903954478544e-01 -1.1991691737882189e+00 7.0711449106898794e-01 8.4804306338423607e-01 1.3146966205853070e+00 8.1092524246090658e-01 1.1559194607727687e+00 2.3693463695523529e+00 -6.2910131081602083e-01 -7.4985961753154728e-01 -2.2190797831815980e+00 4.2473604960747364e+00 2.6105919271854345e+00 1.1014502948147529e+00 -4.7273047650265276e+00 -2.7854457535678514e+00 -7.9756566304251786e-01 -6.6456069911314017e+00 -3.1301622875180284e+00 -9.8378824231183726e-01 7.1545136173148789e+00 3.0670013534489433e+00 1.3928306348251374e+00 2.9934376849595816e+00 2.6981548967364746e+00 6.6931104245223128e-01 -3.4233658256668646e+00 -2.4456476686296220e+00 -1.1238555801439771e+00 -4.2414700848719145e+00 -2.8162454338397676e+00 -1.2111175419385947e+00 4.6424358683475129e+00 2.8017529661844165e+00 9.5273505534480729e-01 2.6211716332370973e+00 5.1678108579513520e+00 1.3162350354995052e+00 -2.7339314296776354e+00 -4.9872855282426318e+00 -8.3141934680333085e-01 -3.1044846235930179e+00 -7.8454130438031591e+00 -1.2403653691802705e+00 3.0670013534489424e+00 7.3991277004458409e+00 1.4464402990988148e+00 2.2863098926996690e+00 4.0175724293236312e+00 8.0447873766831568e-01 -2.4424950838055950e+00 -3.5691323485242723e+00 -1.1589532549615813e+00 -2.4659905185474456e+00 -5.1917762376060637e+00 -1.3582239662862934e+00 2.7724187762379842e+00 5.0090961704552992e+00 1.0218078649648425e+00 1.1232396420092770e+00 1.3351996626351446e+00 2.6505538536445923e+00 -1.0701483247107544e+00 -1.1412245742932072e+00 -2.3954154137200314e+00 -1.0008872255294305e+00 -1.2714504598567711e+00 -4.4771346488325046e+00 1.3928306348251374e+00 1.4464402990988146e+00 4.8643482235185669e+00 8.4627623402227492e-01 1.1839966147859859e+00 1.2720783982573824e+00 -1.1322764997995003e+00 -1.1691687674454785e+00 -1.5883902596937032e+00 -1.1147768950609542e+00 -1.4224760725221854e+00 -2.6717219177653799e+00 9.5574243424395056e-01 1.0386832975976967e+00 2.3456817645910792e+00 3.8310807275361083e+00 2.4475159417625716e+00 7.0313722832190040e-01 -4.2100495391550901e+00 -2.4762320147587058e+00 -5.0233560103052621e-01 -2.7505100907901503e+00 -2.4325457843062388e+00 -5.0656320835801716e-01 2.9934376849595816e+00 2.2863098926996690e+00 8.4627623402227481e-01 6.2307689531624728e+00 2.8135915344295603e+00 5.6649437693775306e-01 -6.4419959675739547e+00 -2.8805674980105747e+00 -8.3795739749653475e-01 -3.7945547304515106e+00 -2.4550122458946317e+00 -8.6121282985961500e-01 4.1418229623125420e+00 2.6969401740783510e+00 5.9216119746276641e-01 2.4793188493585747e+00 5.5747725046442378e+00 1.0153451990616313e+00 -2.8365467520443786e+00 -5.4453206856736660e+00 -6.8363775641165359e-01 -2.5049765126376200e+00 -4.6489589011818744e+00 -7.5057903954478555e-01 2.6981548967364746e+00 4.0175724293236321e+00 1.1839966147859859e+00 2.8135915344295599e+00 8.3954564558763014e+00 8.2174321165628417e-01 -2.7939788241426360e+00 -7.6426843059104046e+00 -1.0719745023226577e+00 -2.5152603085879135e+00 -5.6684496008539185e+00 -1.2621064914559668e+00 2.6596971168879380e+00 5.4176121037756939e+00 7.4721276423116423e-01 7.6071545991810519e-01 1.0808945467294184e+00 2.3612380171698861e+00 -5.5392511507646924e-01 -6.4806663840450884e-01 -2.2565999576847235e+00 -4.8129314371062004e-01 -6.9258510197088641e-01 -1.1991691737882189e+00 6.6931104245223128e-01 8.0447873766831579e-01 1.2720783982573827e+00 5.6649437693775295e-01 8.2174321165628417e-01 4.4642395909957457e+00 -8.8252729689529308e-01 -1.1604203946550871e+00 -4.4872945713349921e+00 -6.3272290343532478e-01 -9.1548770535574664e-01 -2.3706748619101399e+00 5.5394757980961729e-01 7.0944334433221035e-01 2.2161825582950594e+00 -4.1625284918397529e+00 -2.6079244829062853e+00 -1.1052776860679874e+00 4.5495246283640656e+00 2.5902639336345548e+00 8.9134982857197997e-01 3.0456224698633676e+00 2.6588214107062629e+00 7.0711449106898805e-01 -3.4233658256668646e+00 -2.4424950838055950e+00 -1.1322764997995003e+00 -6.4419959675739555e+00 -2.7939788241426360e+00 -8.8252729689529352e-01 6.8723905033474129e+00 2.7833419149940317e+00 1.2385100889013514e+00 4.1267423946124584e+00 2.4917637278982285e+00 1.0748943422783424e+00 -4.5663897111067335e+00 -2.6797925963785612e+00 -7.9178726805788280e-01 -2.3280658227589224e+00 -5.0402162409171618e+00 -1.2467899127179913e+00 2.6280630192271905e+00 4.8854571655642740e+00 9.6606847620928737e-01 2.3268512236956229e+00 4.0257787180039175e+00 8.4804306338423596e-01 -2.4456476686296211e+00 -3.5691323485242732e+00 -1.1691687674454783e+00 -2.8805674980105755e+00 -7.6426843059104046e+00 -1.1604203946550868e+00 2.7833419149940317e+00 7.1490965515277747e+00 1.2977792056626156e+00 2.5317638664460782e+00 5.0638857623633582e+00 1.2999650860579817e+00 -2.6157390349638026e+00 -4.8721853021074830e+00 -8.3547675649556596e-01 -1.0323433054357309e+00 -1.3062546949443883e+00 -2.6676341409540050e+00 8.4779627602486485e-01 9.0316897759764347e-01 2.3728971183590071e+00 8.5042892517667845e-01 1.1526414461734222e+00 1.3146966205853068e+00 -1.1238555801439771e+00 -1.1589532549615813e+00 -1.5883902596937032e+00 -8.3795739749653464e-01 -1.0719745023226577e+00 -4.4872945713349912e+00 1.2385100889013512e+00 1.2977792056626156e+00 4.8012960080735381e+00 1.0662142839498288e+00 1.2707056417653835e+00 2.6228868665046803e+00 -1.0087932909764799e+00 -1.0871128189704369e+00 -2.3684576415398340e+00 -2.7059229015694406e+00 -2.2993688624602209e+00 -9.3576845793415331e-01 3.0419555765029545e+00 2.3372437299871032e+00 6.5773446053504037e-01 3.9199795233577195e+00 2.6140700748400532e+00 8.1092524246090658e-01 -4.2414700848719153e+00 -2.4659905185474456e+00 -1.1147768950609542e+00 -3.7945547304515101e+00 -2.5152603085879135e+00 -6.3272290343532478e-01 4.1267423946124584e+00 2.5317638664460778e+00 1.0662142839498288e+00 6.1129278203056501e+00 2.7898351423024725e+00 1.1406388260234825e+00 -6.4596575978859168e+00 -2.9922931239801271e+00 -9.9224455653882693e-01 -2.3170824269026817e+00 -4.2645018219285511e+00 -1.3074190375428940e+00 2.6349738325891181e+00 4.0698176439333054e+00 8.1878802660970873e-01 2.6547494736972999e+00 5.7539172259814215e+00 1.1559194607727687e+00 -2.8162454338397680e+00 -5.1917762376060637e+00 -1.4224760725221857e+00 -2.4550122458946313e+00 -5.6684496008539167e+00 -9.1548770535574642e-01 2.4917637278982285e+00 5.0638857623633573e+00 1.2707056417653830e+00 2.7898351423024716e+00 7.9739591838155857e+00 1.5843541905193892e+00 -2.9829820698500367e+00 -7.7368521557051384e+00 -1.1843845042464256e+00 -9.6612937182931480e-01 -1.3394892856330296e+00 -1.5932789754331249e+00 9.8155240733146409e-01 1.0956157526414585e+00 1.3101976951408423e+00 8.3560851890955323e-01 1.1701119500275838e+00 2.3693463695523529e+00 -1.2111175419385947e+00 -1.3582239662862938e+00 -2.6717219177653799e+00 -8.6121282985961500e-01 -1.2621064914559668e+00 -2.3706748619101399e+00 1.0748943422783424e+00 1.2999650860579817e+00 2.6228868665046803e+00 1.1406388260234823e+00 1.5843541905193890e+00 4.7515678042447753e+00 -9.9423435091531753e-01 -1.1902272358711230e+00 -4.4183229803340094e+00 3.0107829411982241e+00 2.5981128573941565e+00 9.4338968119806710e-01 -3.4716978447653806e+00 -2.6077740891794061e+00 -5.6689126020145153e-01 -4.2994735898009404e+00 -2.9789803514469386e+00 -6.2910131081602083e-01 4.6424358683475129e+00 2.7724187762379842e+00 9.5574243424395044e-01 4.1418229623125420e+00 2.6596971168879371e+00 5.5394757980961740e-01 -4.5663897111067335e+00 -2.6157390349638030e+00 -1.0087932909764799e+00 -6.4596575978859168e+00 -2.9829820698500367e+00 -9.9423435091531764e-01 7.0021769717006919e+00 3.1552467949201048e+00 7.4594051765763625e-01 2.3596574436308879e+00 4.0393534212533648e+00 1.0730437048119637e+00 -2.6543477063957344e+00 -3.9072176778373429e+00 -6.2030736334962500e-01 -2.6871639520593376e+00 -5.5812353685880129e+00 -7.4985961753154728e-01 2.8017529661844165e+00 5.0090961704553001e+00 1.0386832975976967e+00 2.6969401740783505e+00 5.4176121037756939e+00 7.0944334433221035e-01 -2.6797925963785612e+00 -4.8721853021074830e+00 -1.0871128189704369e+00 -2.9922931239801271e+00 -7.7368521557051384e+00 -1.1902272358711228e+00 3.1552467949201053e+00 7.6314288087536193e+00 8.2633668898086343e-01 6.8737740123083124e-01 8.5011962473507530e-01 1.2910914353256466e+00 -6.0392778163009608e-01 -6.4923635265351409e-01 -1.1898318651628654e+00 -5.9025456546923527e-01 -7.7637932951643995e-01 -2.2190797831815976e+00 9.5273505534480729e-01 1.0218078649648428e+00 2.3456817645910792e+00 5.9216119746276630e-01 7.4721276423116423e-01 2.2161825582950598e+00 -7.9178726805788280e-01 -8.3547675649556596e-01 -2.3684576415398340e+00 -9.9224455653882704e-01 -1.1843845042464256e+00 -4.4183229803340094e+00 7.4594051765763636e-01 8.2633668898086321e-01 4.3427365120065211e+00 729 730 731 1188 1189 1190 1200 1201 1202 741 742 743 732 733 734 1191 1192 1193 1203 1204 1205 744 745 746 6.3145786066997474e+00 2.6758237593640759e+00 1.0010243676003199e+00 -6.5568546212607730e+00 -3.0063800512802050e+00 -9.5506129213101099e-01 -3.6442595393854931e+00 -2.4916381802641436e+00 -6.8354379022635525e-01 3.9291903570719811e+00 2.6756011372667774e+00 1.0416297694008720e+00 3.5867651255992468e+00 2.4063242723205054e+00 7.3001808172864147e-01 -3.8866397324789239e+00 -2.4009256270154342e+00 -9.5962591798912755e-01 -2.3008369325335121e+00 -2.2387162861048897e+00 -8.6476249029592700e-01 2.5580567362877229e+00 2.3799109757133157e+00 6.9032127191258763e-01 2.6758237593640759e+00 1.0730737038399919e+01 2.1275368352595296e+00 -2.9833613716097567e+00 -1.0505272457336602e+01 -1.7141589674958673e+00 -2.4622515711618727e+00 -7.9369644837917663e+00 -1.4905679557465465e+00 2.6644771184308698e+00 7.3419075305146428e+00 1.8962754672320088e+00 2.3785701269897492e+00 7.7038618481481151e+00 1.5922948947515601e+00 -2.7148789905574398e+00 -7.1678344061401216e+00 -1.8688976618535034e+00 -2.2197999836455002e+00 -6.0920579039075022e+00 -1.8607745850138551e+00 2.6614209121898700e+00 5.9256228341133186e+00 1.3182919728666731e+00 1.0010243676003201e+00 2.1275368352595296e+00 5.8510972520286364e+00 -9.3135986710626650e-01 -1.6831530298697199e+00 -5.4596481233842651e+00 -8.1963374736702943e-01 -1.8107659530384559e+00 -2.9914871520916235e+00 1.0281791538358589e+00 1.8814701731321741e+00 3.2332227911546130e+00 6.9851113489256622e-01 1.5432089772801385e+00 2.9231208665978787e+00 -1.0564347580286482e+00 -1.8190814669793918e+00 -3.2362072720550947e+00 -8.4505252159415367e-01 -1.8338626868808960e+00 -1.9777965273245335e+00 9.2476623776735090e-01 1.5946471510966220e+00 1.6576981650743883e+00 -6.5568546212607730e+00 -2.9833613716097567e+00 -9.3135986710626650e-01 7.0065939452220665e+00 3.2951773976337004e+00 7.8415699095926350e-01 3.9806427315484605e+00 2.8104572620713433e+00 6.7140986209653375e-01 -4.3741168226565232e+00 -2.9397513401757207e+00 -1.0483765817156669e+00 -3.9139250746514684e+00 -2.8952661370421464e+00 -6.3836812943332477e-01 4.2528020748434825e+00 2.8417394323501388e+00 8.8801021650223966e-01 2.5910888212568981e+00 2.6950262119261295e+00 9.5067704147673737e-01 -2.9862310543021402e+00 -2.8240214551536900e+00 -6.7614953277951617e-01 -3.0063800512802055e+00 -1.0505272457336604e+01 -1.6831530298697199e+00 3.2951773976337009e+00 1.0400173126292744e+01 1.2876065417506197e+00 2.8193863247417985e+00 7.7742613656195747e+00 1.2577103100895366e+00 -2.9829074466894432e+00 -7.2172151288604987e+00 -1.6862515412059524e+00 -2.5130830328756373e+00 -7.6333254762061786e+00 -1.1274257365714790e+00 2.8124152011433381e+00 7.0697114630866702e+00 1.4319225946824823e+00 2.3619116233462014e+00 5.9628226696040123e+00 1.6153546732792070e+00 -2.7865200160197476e+00 -5.8511555621997200e+00 -1.0957638121546946e+00 -9.5506129213101121e-01 -1.7141589674958668e+00 -5.4596481233842651e+00 7.8415699095926350e-01 1.2876065417506199e+00 5.3044140928557777e+00 6.5202679933332341e-01 1.2184103987121209e+00 2.8049532580755843e+00 -8.4287790844386179e-01 -1.3315557801639935e+00 -2.9660266218942319e+00 -5.6414161445518074e-01 -1.1583802959977922e+00 -2.7692560134943829e+00 9.0493031094919985e-01 1.4764518554473536e+00 2.9283219009143093e+00 6.7071634259621105e-01 1.2887616548857170e+00 1.6810610518497040e+00 -6.4974962880794351e-01 -1.0671354071381587e+00 -1.5238195449224947e+00 -3.6442595393854931e+00 -2.4622515711618727e+00 -8.1963374736702921e-01 3.9806427315484605e+00 2.8193863247417981e+00 6.5202679933332341e-01 6.4247278840858728e+00 2.9331126472650841e+00 6.9449696566446961e-01 -6.7103939565575548e+00 -3.1353352205872480e+00 -9.6110186439355105e-01 -2.3258877096743236e+00 -2.3759941978608023e+00 -5.2054573902683243e-01 2.5950607481396561e+00 2.3634052344260468e+00 8.0417461824083558e-01 3.6978832681521254e+00 2.5299273364985799e+00 7.7695968296294116e-01 -4.0177734263087430e+00 -2.6722505533215868e+00 -6.2637671541415718e-01 -2.4916381802641445e+00 -7.9369644837917663e+00 -1.8107659530384561e+00 2.8104572620713433e+00 7.7742613656195765e+00 1.2184103987121209e+00 2.9331126472650841e+00 1.1462079528300412e+01 1.5065430107303075e+00 -3.1449681017666049e+00 -1.0809639820636052e+01 -1.8403724024299923e+00 -2.3261840914119500e+00 -6.5272786637487608e+00 -1.1534016504897384e+00 2.7169861307278684e+00 5.9322392210992616e+00 1.6565779192975976e+00 2.4962201405428126e+00 7.9970652825102295e+00 1.6785172552489656e+00 -2.9939858071644059e+00 -7.8917624293528990e+00 -1.2555085780308044e+00 -6.8354379022635525e-01 -1.4905679557465465e+00 -2.9914871520916240e+00 6.7140986209653375e-01 1.2577103100895366e+00 2.8049532580755843e+00 6.9449696566446961e-01 1.5065430107303073e+00 5.4330061307917168e+00 -9.6003348671991251e-01 -1.8327676276115805e+00 -5.5880744445974955e+00 -5.3190369251327019e-01 -1.2037343050002822e+00 -1.5379273013032164e+00 7.2953719427358843e-01 1.3130760721057186e+00 1.6890892092416547e+00 7.6814800792359894e-01 1.6837870433992990e+00 3.0218235363308414e+00 -6.8811106049865178e-01 -1.2340465479664531e+00 -2.8313832364474592e+00 3.9291903570719815e+00 2.6644771184308698e+00 1.0281791538358591e+00 -4.3741168226565232e+00 -2.9829074466894436e+00 -8.4287790844386190e-01 -6.7103939565575548e+00 -3.1449681017666049e+00 -9.6003348671991251e-01 7.1979689473985919e+00 3.2767832278872362e+00 1.3148030848296612e+00 2.5491824377015937e+00 2.7418172908873655e+00 7.0775279916327793e-01 -2.9583531824226688e+00 -2.6597354767721599e+00 -1.0805127253108269e+00 -3.9845491172841729e+00 -2.8662607995562213e+00 -1.1265650562072933e+00 4.3510713367487490e+00 2.9707941875789601e+00 9.5925413885309663e-01 2.6756011372667770e+00 7.3419075305146428e+00 1.8814701731321739e+00 -2.9397513401757207e+00 -7.2172151288604987e+00 -1.3315557801639932e+00 -3.1353352205872476e+00 -1.0809639820636052e+01 -1.8327676276115803e+00 3.2767832278872362e+00 1.0342702280784367e+01 2.0858953963415394e+00 2.3260251582580369e+00 5.9123470231109021e+00 1.2719813313025254e+00 -2.6522212398206211e+00 -5.4460760302300253e+00 -1.6987343161131632e+00 -2.4992896453227122e+00 -7.4349767258261963e+00 -1.9312649392007089e+00 2.9481879224942484e+00 7.3109508711428592e+00 1.5549757623132068e+00 1.0416297694008720e+00 1.8962754672320088e+00 3.2332227911546130e+00 -1.0483765817156669e+00 -1.6862515412059524e+00 -2.9660266218942319e+00 -9.6110186439355094e-01 -1.8403724024299928e+00 -5.5880744445974955e+00 1.3148030848296612e+00 2.0858953963415394e+00 5.9718341478210313e+00 7.9517513089479419e-01 1.6761741665869527e+00 1.6456003948049949e+00 -1.0810012498501862e+00 -1.7043072280297373e+00 -1.9622986593843055e+00 -1.0076155316179900e+00 -1.9757592815030964e+00 -3.3225232782311691e+00 9.4648724245206539e-01 1.5483454230082776e+00 2.9882656703265624e+00 3.5867651255992468e+00 2.3785701269897492e+00 6.9851113489256622e-01 -3.9139250746514680e+00 -2.5130830328756373e+00 -5.6414161445518085e-01 -2.3258877096743236e+00 -2.3261840914119500e+00 -5.3190369251327019e-01 2.5491824377015937e+00 2.3260251582580369e+00 7.9517513089479408e-01 6.3575209678380444e+00 2.7199835521018070e+00 6.1595102764871068e-01 -6.5506989848893600e+00 -2.9528171778695147e+00 -8.6143505590888092e-01 -3.6137547275803996e+00 -2.3679234599173338e+00 -7.9831872138241566e-01 3.9107979656566632e+00 2.7354289247248431e+00 6.4616179082367675e-01 2.4063242723205054e+00 7.7038618481481160e+00 1.5432089772801385e+00 -2.8952661370421464e+00 -7.6333254762061795e+00 -1.1583802959977925e+00 -2.3759941978608023e+00 -6.5272786637487608e+00 -1.2037343050002820e+00 2.7418172908873650e+00 5.9123470231109021e+00 1.6761741665869527e+00 2.7199835521018070e+00 1.1187667258969261e+01 1.3668638704004223e+00 -2.8817449741756112e+00 -1.0458922971794086e+01 -1.6569111497437246e+00 -2.4052584600599656e+00 -7.8606114066237236e+00 -1.7934841628139642e+00 2.6901386538288454e+00 7.6762623881444734e+00 1.2262628992882503e+00 7.3001808172864135e-01 1.5922948947515601e+00 2.9231208665978787e+00 -6.3836812943332477e-01 -1.1274257365714793e+00 -2.7692560134943829e+00 -5.2054573902683243e-01 -1.1534016504897384e+00 -1.5379273013032166e+00 7.0775279916327793e-01 1.2719813313025252e+00 1.6456003948049949e+00 6.1595102764871068e-01 1.3668638704004223e+00 5.4443180225673178e+00 -8.7538374805956165e-01 -1.7240409273027777e+00 -5.5124133393074128e+00 -6.3618099482702739e-01 -1.4172574893868655e+00 -2.9990864003966062e+00 6.1675670280611528e-01 1.1909857072963537e+00 2.8056437705314261e+00 -3.8866397324789239e+00 -2.7148789905574398e+00 -1.0564347580286482e+00 4.2528020748434825e+00 2.8124152011433377e+00 9.0493031094919996e-01 2.5950607481396561e+00 2.7169861307278689e+00 7.2953719427358843e-01 -2.9583531824226683e+00 -2.6522212398206211e+00 -1.0810012498501862e+00 -6.5506989848893600e+00 -2.8817449741756107e+00 -8.7538374805956165e-01 6.9582191526120134e+00 3.0432311006387782e+00 1.2089441204022759e+00 3.9100637661933599e+00 2.5653730054670660e+00 1.0029405862458167e+00 -4.3204538419975567e+00 -2.8891602334233797e+00 -8.3353245593248537e-01 -2.4009256270154347e+00 -7.1678344061401216e+00 -1.8190814669793918e+00 2.8417394323501388e+00 7.0697114630866693e+00 1.4764518554473534e+00 2.3634052344260468e+00 5.9322392210992607e+00 1.3130760721057186e+00 -2.6597354767721604e+00 -5.4460760302300253e+00 -1.7043072280297373e+00 -2.9528171778695138e+00 -1.0458922971794086e+01 -1.7240409273027779e+00 3.0432311006387791e+00 9.9298984445385781e+00 1.9316410182858048e+00 2.6076134326095830e+00 7.2696018323564155e+00 1.8576329428962763e+00 -2.8425109183674357e+00 -7.1286175529166922e+00 -1.3313722664232461e+00 -9.5962591798912744e-01 -1.8688976618535031e+00 -3.2362072720550947e+00 8.8801021650223955e-01 1.4319225946824823e+00 2.9283219009143093e+00 8.0417461824083569e-01 1.6565779192975976e+00 1.6890892092416547e+00 -1.0805127253108269e+00 -1.6987343161131632e+00 -1.9622986593843055e+00 -8.6143505590888092e-01 -1.6569111497437248e+00 -5.5124133393074137e+00 1.2089441204022759e+00 1.9316410182858044e+00 5.8239093349610753e+00 1.0065538687104423e+00 1.8357271771673980e+00 3.2565907548726631e+00 -1.0061091246469562e+00 -1.6313255817228915e+00 -2.9869919292428904e+00 -2.3008369325335121e+00 -2.2197999836454998e+00 -8.4505252159415356e-01 2.5910888212568981e+00 2.3619116233462019e+00 6.7071634259621116e-01 3.6978832681521254e+00 2.4962201405428126e+00 7.6814800792359883e-01 -3.9845491172841729e+00 -2.4992896453227122e+00 -1.0076155316179900e+00 -3.6137547275803996e+00 -2.4052584600599656e+00 -6.3618099482702739e-01 3.9100637661933599e+00 2.6076134326095826e+00 1.0065538687104423e+00 6.3740273171959352e+00 2.7025044147808792e+00 1.0253033994727028e+00 -6.6739223954002318e+00 -3.0439015222512973e+00 -9.8187257066378442e-01 -2.2387162861048893e+00 -6.0920579039075022e+00 -1.8338626868808960e+00 2.6950262119261295e+00 5.9628226696040123e+00 1.2887616548857170e+00 2.5299273364985799e+00 7.9970652825102295e+00 1.6837870433992992e+00 -2.8662607995562213e+00 -7.4349767258261945e+00 -1.9757592815030962e+00 -2.3679234599173338e+00 -7.8606114066237236e+00 -1.4172574893868655e+00 2.5653730054670651e+00 7.2696018323564147e+00 1.8357271771673980e+00 2.7025044147808792e+00 1.0918869431842021e+01 2.2044311918093165e+00 -3.0199304230942063e+00 -1.0760713179955257e+01 -1.7858276094908729e+00 -8.6476249029592700e-01 -1.8607745850138551e+00 -1.9777965273245330e+00 9.5067704147673748e-01 1.6153546732792075e+00 1.6810610518497042e+00 7.7695968296294116e-01 1.6785172552489656e+00 3.0218235363308414e+00 -1.1265650562072933e+00 -1.9312649392007084e+00 -3.3225232782311691e+00 -7.9831872138241566e-01 -1.7934841628139642e+00 -2.9990864003966062e+00 1.0029405862458167e+00 1.8576329428962763e+00 3.2565907548726631e+00 1.0253033994727028e+00 2.2044311918093169e+00 5.9530294504559587e+00 -9.6623444227256094e-01 -1.7704123762052375e+00 -5.6130985875568582e+00 2.5580567362877229e+00 2.6614209121898700e+00 9.2476623776735090e-01 -2.9862310543021402e+00 -2.7865200160197476e+00 -6.4974962880794362e-01 -4.0177734263087430e+00 -2.9939858071644059e+00 -6.8811106049865178e-01 4.3510713367487490e+00 2.9481879224942480e+00 9.4648724245206539e-01 3.9107979656566632e+00 2.6901386538288459e+00 6.1675670280611516e-01 -4.3204538419975567e+00 -2.8425109183674357e+00 -1.0061091246469562e+00 -6.6739223954002318e+00 -3.0199304230942059e+00 -9.6623444227256094e-01 7.1784546793155348e+00 3.3431996761328318e+00 8.2219407320058135e-01 2.3799109757133157e+00 5.9256228341133186e+00 1.5946471510966220e+00 -2.8240214551536900e+00 -5.8511555621997200e+00 -1.0671354071381589e+00 -2.6722505533215868e+00 -7.8917624293528990e+00 -1.2340465479664531e+00 2.9707941875789601e+00 7.3109508711428592e+00 1.5483454230082774e+00 2.7354289247248431e+00 7.6762623881444734e+00 1.1909857072963537e+00 -2.8891602334233788e+00 -7.1286175529166913e+00 -1.6313255817228918e+00 -3.0439015222512973e+00 -1.0760713179955255e+01 -1.7704123762052373e+00 3.3431996761328318e+00 1.0719412631023914e+01 1.3689416316314882e+00 6.9032127191258763e-01 1.3182919728666733e+00 1.6576981650743883e+00 -6.7614953277951617e-01 -1.0957638121546949e+00 -1.5238195449224947e+00 -6.2637671541415718e-01 -1.2555085780308044e+00 -2.8313832364474592e+00 9.5925413885309685e-01 1.5549757623132066e+00 2.9882656703265624e+00 6.4616179082367653e-01 1.2262628992882505e+00 2.8056437705314261e+00 -8.3353245593248548e-01 -1.3313722664232461e+00 -2.9869919292428904e+00 -9.8187257066378453e-01 -1.7858276094908732e+00 -5.6130985875568582e+00 8.2219407320058135e-01 1.3689416316314882e+00 5.5036856922373243e+00 1188 1189 1190 1236 1237 1238 1248 1249 1250 1200 1201 1202 1191 1192 1193 1239 1240 1241 1251 1252 1253 1203 1204 1205 5.8622385653797568e+00 2.4272720908123500e+00 9.2386687288340674e-01 -6.0990540756499572e+00 -2.7681525860112148e+00 -8.8706957739216130e-01 -3.3220581545202048e+00 -2.2533990171462976e+00 -6.0894119500596544e-01 3.6071309661427877e+00 2.4478656272775909e+00 9.7291236517719859e-01 3.2766752720858143e+00 2.1792546908884050e+00 6.6222671701769786e-01 -3.5808729873015737e+00 -2.1786919144618038e+00 -8.9158091063135358e-01 -2.0744650212789462e+00 -2.0161374075018998e+00 -7.9489478403178837e-01 2.3304054351423202e+00 2.1619885161428694e+00 6.2348051198296672e-01 2.4272720908123500e+00 9.9606311733865169e+00 1.9933325423589063e+00 -2.7367166702125467e+00 -9.7313858722568138e+00 -1.5804148864765519e+00 -2.2271798093809005e+00 -7.3156443364842101e+00 -1.3536987907318754e+00 2.4306535526292725e+00 6.7158631668184308e+00 1.7655808278670397e+00 2.1524882141095842e+00 7.1038581058059540e+00 1.4709989964091050e+00 -2.4972123807366917e+00 -6.5660722455772103e+00 -1.7443905454865516e+00 -1.9989330073512288e+00 -5.5797237168895206e+00 -1.7396441172714343e+00 2.4496280101301555e+00 5.4124737251968504e+00 1.1882359733313639e+00 9.2386687288340652e-01 1.9933325423589063e+00 5.4955822654910955e+00 -8.5567550194677577e-01 -1.5399377441164719e+00 -5.0900337107846108e+00 -7.4604674399388970e-01 -1.6802045996464288e+00 -2.7511785271162061e+00 9.5743685874873996e-01 1.7517845475408451e+00 3.0034018826543378e+00 6.2717481743549408e-01 1.4129477309602669e+00 2.6913375210298986e+00 -9.9350710946630827e-01 -1.6953372690841828e+00 -3.0170473828636517e+00 -7.7611686687367065e-01 -1.7131763083753295e+00 -1.8367018589046533e+00 8.6286767321300240e-01 1.4705911003623939e+00 1.5046398104937921e+00 -6.0990540756499572e+00 -2.7367166702125472e+00 -8.5567550194677544e-01 6.5683779176012855e+00 3.0570813119490703e+00 7.0596017194006599e-01 3.6583274246173758e+00 2.5786535430789477e+00 5.9502229588527900e-01 -4.0650575576557957e+00 -2.7124218840538203e+00 -9.8043723741818734e-01 -3.6058524624043322e+00 -2.6757198242064408e+00 -5.6785907354572396e-01 3.9542858354330583e+00 2.6216576099733526e+00 8.1911536593943368e-01 2.3607819360098676e+00 2.4788017908750626e+00 8.8781737722268061e-01 -2.7718090179514983e+00 -2.6113358774036235e+00 -6.0394339807677355e-01 -2.7681525860112148e+00 -9.7313858722568121e+00 -1.5399377441164717e+00 3.0570813119490703e+00 9.6368234301337008e+00 1.1463598525979912e+00 2.5925752565650786e+00 7.1541873036341554e+00 1.1171103660069344e+00 -2.7530037116678594e+00 -6.5965284795123651e+00 -1.5545850431302921e+00 -2.2928761093432981e+00 -7.0373720755252771e+00 -9.9863375166320345e-01 2.5964384312018773e+00 6.4682696813925853e+00 1.3033991928594004e+00 2.1443478379325307e+00 5.4495531683181895e+00 1.4917459128155353e+00 -2.5764104306261810e+00 -5.3435471561841767e+00 -9.6545878536989538e-01 -8.8706957739216130e-01 -1.5804148864765517e+00 -5.0900337107846099e+00 7.0596017194006622e-01 1.1463598525979917e+00 4.9480168323350453e+00 5.7934417878060041e-01 1.0827123431867582e+00 2.5695817094003406e+00 -7.7161054236804538e-01 -1.2013054441889739e+00 -2.7313860762053275e+00 -4.9447158240187544e-01 -1.0255453698330470e+00 -2.5447675155070861e+00 8.4172337201379022e-01 1.3547765505874823e+00 2.6987440715229369e+00 6.0660301926245186e-01 1.1639321480127260e+00 1.5293391387059139e+00 -5.8047903983482529e-01 -9.4051519388638483e-01 -1.3794944494672099e+00 -3.3220581545202044e+00 -2.2271798093809005e+00 -7.4604674399388982e-01 3.6583274246173754e+00 2.5925752565650786e+00 5.7934417878060041e-01 5.8278470353057896e+00 2.6576596566550044e+00 6.0764817952571093e-01 -6.1071767695508594e+00 -2.8676909403001538e+00 -8.7485339677466856e-01 -2.0995732246120644e+00 -2.1546543323401295e+00 -4.5379528788194240e-01 2.3667360599047753e+00 2.1461420968394243e+00 7.3462587063437201e-01 3.3190661109625887e+00 2.2842812840067337e+00 7.0202091515720733e-01 -3.6431684821074009e+00 -2.4311332120450548e+00 -5.4894371544739085e-01 -2.2533990171462976e+00 -7.3156443364842110e+00 -1.6802045996464292e+00 2.5786535430789477e+00 7.1541873036341554e+00 1.0827123431867582e+00 2.6576596566550030e+00 1.0519435323036483e+01 1.3410029578816665e+00 -2.8756532349822539e+00 -9.8534945940271061e+00 -1.6877216344541257e+00 -2.1044506986860370e+00 -6.0220875320434777e+00 -1.0255305676896973e+00 2.5078449863620835e+00 5.4165060068293220e+00 1.5363602148753963e+00 2.2518853182832439e+00 7.3046683191663222e+00 1.5434011479631791e+00 -2.7625405535646848e+00 -7.2035704901114883e+00 -1.1100198621167499e+00 -6.0894119500596544e-01 -1.3536987907318754e+00 -2.7511785271162061e+00 5.9502229588527911e-01 1.1171103660069344e+00 2.5695817094003401e+00 6.0764817952571093e-01 1.3410029578816673e+00 4.9344708736774905e+00 -8.7068053395201628e-01 -1.6752918367553855e+00 -5.0806180212488652e+00 -4.6202729091172057e-01 -1.0690219211234337e+00 -1.3914040726300712e+00 6.5844484242678913e-01 1.1856457987369311e+00 1.5354729579432782e+00 6.9002991930828694e-01 1.5411411153656633e+00 2.7260376621688938e+00 -6.0949621727636294e-01 -1.0868876893805006e+00 -2.5423625821948601e+00 3.6071309661427877e+00 2.4306535526292725e+00 9.5743685874873996e-01 -4.0650575576557957e+00 -2.7530037116678594e+00 -7.7161054236804538e-01 -6.1071767695508594e+00 -2.8756532349822539e+00 -8.7068053395201606e-01 6.6128330832703259e+00 3.0071842836303939e+00 1.2371648816698197e+00 2.3193296593080270e+00 2.5278214009346827e+00 6.3815865057957455e-01 -2.7438957263178509e+00 -2.4418653965936050e+00 -1.0186293389263190e+00 -3.6077810356325939e+00 -2.6276673193458091e+00 -1.0552168721908837e+00 3.9846173804359535e+00 2.7325304253951765e+00 8.8337689643913109e-01 2.4478656272775909e+00 6.7158631668184299e+00 1.7517845475408453e+00 -2.7124218840538199e+00 -6.5965284795123651e+00 -1.2013054441889739e+00 -2.8676909403001538e+00 -9.8534945940271044e+00 -1.6752918367553853e+00 3.0071842836303939e+00 9.3947655393459097e+00 1.9315881893586662e+00 2.1102156110966566e+00 5.3972729244951418e+00 1.1497433201454736e+00 -2.4410654540752548e+00 -4.9353359460239457e+00 -1.5755641293366516e+00 -2.2581225375215026e+00 -6.7418385293097369e+00 -1.7940099238930256e+00 2.7140352939460852e+00 6.6192959182136679e+00 1.4130552771290519e+00 9.7291236517719859e-01 1.7655808278670397e+00 3.0034018826543378e+00 -9.8043723741818722e-01 -1.5545850431302921e+00 -2.7313860762053275e+00 -8.7485339677466856e-01 -1.6877216344541257e+00 -5.0806180212488652e+00 1.2371648816698202e+00 1.9315881893586666e+00 5.4842146696723306e+00 7.2547302894856569e-01 1.5553310619166478e+00 1.4937592510547739e+00 -1.0217979617839057e+00 -1.5810029030335249e+00 -1.8236482648083068e+00 -9.3376402686766691e-01 -1.8416158022675173e+00 -3.0408657945123925e+00 8.7530234704884213e-01 1.4124253037431049e+00 2.6951423533934484e+00 3.2766752720858143e+00 2.1524882141095851e+00 6.2717481743549408e-01 -3.6058524624043322e+00 -2.2928761093432977e+00 -4.9447158240187544e-01 -2.0995732246120644e+00 -2.1044506986860370e+00 -4.6202729091172068e-01 2.3193296593080270e+00 2.1102156110966570e+00 7.2547302894856569e-01 5.7996355801804231e+00 2.4653345988254949e+00 5.3914800767633952e-01 -5.9881331742312494e+00 -2.7062748642603154e+00 -7.8129598794387134e-01 -3.2482072494019025e+00 -2.1312375578336913e+00 -7.2510268597672556e-01 3.5461255990752818e+00 2.5068008060916034e+00 5.7110169317379422e-01 2.1792546908884050e+00 7.1038581058059540e+00 1.4129477309602667e+00 -2.6757198242064408e+00 -7.0373720755252780e+00 -1.0255453698330470e+00 -2.1546543323401295e+00 -6.0220875320434777e+00 -1.0690219211234340e+00 2.5278214009346827e+00 5.3972729244951418e+00 1.5553310619166480e+00 2.4653345988254949e+00 1.0305091367263461e+01 1.2186605963669890e+00 -2.6369381351494332e+00 -9.5631544021036863e+00 -1.5139050027946024e+00 -2.1707867691642089e+00 -7.1921117369678864e+00 -1.6642523037072707e+00 2.4656883702116263e+00 7.0085033490757702e+00 1.0857852082144517e+00 6.6222671701769797e-01 1.4709989964091053e+00 2.6913375210298986e+00 -5.6785907354572407e-01 -9.9863375166320345e-01 -2.5447675155070866e+00 -4.5379528788194240e-01 -1.0255305676896973e+00 -1.3914040726300712e+00 6.3815865057957444e-01 1.1497433201454736e+00 1.4937592510547739e+00 5.3914800767633964e-01 1.2186605963669894e+00 4.9787333540961223e+00 -7.9870707000303542e-01 -1.5864865414027804e+00 -5.0375065628925668e+00 -5.6487729249636620e-01 -1.2841881825192876e+00 -2.7150751067972143e+00 5.4570534865345521e-01 1.0554361303534003e+00 2.5249231316461467e+00 -3.5808729873015737e+00 -2.4972123807366913e+00 -9.9350710946630827e-01 3.9542858354330583e+00 2.5964384312018778e+00 8.4172337201379022e-01 2.3667360599047758e+00 2.5078449863620835e+00 6.5844484242678913e-01 -2.7438957263178509e+00 -2.4410654540752543e+00 -1.0217979617839057e+00 -5.9881331742312494e+00 -2.6369381351494332e+00 -7.9870707000303542e-01 6.4179048000050622e+00 2.7978570282358830e+00 1.1399313915660574e+00 3.5451404772647610e+00 2.3398605424016061e+00 9.3506697337992228e-01 -3.9711652847569816e+00 -2.6667850182400703e+00 -7.6115443813331096e-01 -2.1786919144618038e+00 -6.5660722455772103e+00 -1.6953372690841824e+00 2.6216576099733526e+00 6.4682696813925862e+00 1.3547765505874823e+00 2.1461420968394243e+00 5.4165060068293220e+00 1.1856457987369311e+00 -2.4418653965936046e+00 -4.9353359460239448e+00 -1.5810029030335251e+00 -2.7062748642603154e+00 -9.5631544021036845e+00 -1.5864865414027802e+00 2.7978570282358830e+00 9.0443067145761340e+00 1.7899885407668366e+00 2.3764975225528038e+00 6.5974220676127349e+00 1.7270408193147506e+00 -2.6153220822857364e+00 -6.4619418767059358e+00 -1.1946249958855144e+00 -8.9158091063135358e-01 -1.7443905454865516e+00 -3.0170473828636521e+00 8.1911536593943368e-01 1.3033991928594004e+00 2.6987440715229369e+00 7.3462587063437201e-01 1.5363602148753961e+00 1.5354729579432782e+00 -1.0186293389263190e+00 -1.5755641293366516e+00 -1.8236482648083068e+00 -7.8129598794387145e-01 -1.5139050027946026e+00 -5.0375065628925668e+00 1.1399313915660574e+00 1.7899885407668366e+00 5.3685191373342427e+00 9.3697325225593175e-01 1.7055705672499242e+00 2.9814208932248474e+00 -9.3913964289424967e-01 -1.5014588381337517e+00 -2.7059548494607784e+00 -2.0744650212789462e+00 -1.9989330073512290e+00 -7.7611686687367065e-01 2.3607819360098676e+00 2.1443478379325307e+00 6.0660301926245186e-01 3.3190661109625887e+00 2.2518853182832439e+00 6.9002991930828694e-01 -3.6077810356325939e+00 -2.2581225375215026e+00 -9.3376402686766680e-01 -3.2482072494019025e+00 -2.1707867691642089e+00 -5.6487729249636620e-01 3.5451404772647610e+00 2.3764975225528038e+00 9.3697325225593175e-01 5.7000591656753317e+00 2.4244523920932259e+00 9.3770577412745681e-01 -5.9945943835991038e+00 -2.7693407568248634e+00 -8.9655377871642439e-01 -2.0161374075018998e+00 -5.5797237168895206e+00 -1.7131763083753295e+00 2.4788017908750621e+00 5.4495531683181895e+00 1.1639321480127258e+00 2.2842812840067341e+00 7.3046683191663231e+00 1.5411411153656633e+00 -2.6276673193458091e+00 -6.7418385293097387e+00 -1.8416158022675171e+00 -2.1312375578336913e+00 -7.1921117369678864e+00 -1.2841881825192873e+00 2.3398605424016066e+00 6.5974220676127349e+00 1.7055705672499242e+00 2.4244523920932259e+00 9.8816371478810225e+00 2.0498681110691681e+00 -2.7523537246952245e+00 -9.7196067198111216e+00 -1.6215316485353490e+00 -7.9489478403178837e-01 -1.7396441172714345e+00 -1.8367018589046531e+00 8.8781737722268061e-01 1.4917459128155353e+00 1.5293391387059139e+00 7.0202091515720733e-01 1.5434011479631791e+00 2.7260376621688938e+00 -1.0552168721908837e+00 -1.7940099238930254e+00 -3.0408657945123925e+00 -7.2510268597672556e-01 -1.6642523037072707e+00 -2.7150751067972143e+00 9.3506697337992228e-01 1.7270408193147508e+00 2.9814208932248474e+00 9.3770577412745670e-01 2.0498681110691677e+00 5.3835301412446928e+00 -8.8739669768786777e-01 -1.6141496462909020e+00 -5.0276850751300879e+00 2.3304054351423202e+00 2.4496280101301555e+00 8.6286767321300240e-01 -2.7718090179514978e+00 -2.5764104306261810e+00 -5.8047903983482518e-01 -3.6431684821074009e+00 -2.7625405535646856e+00 -6.0949621727636294e-01 3.9846173804359535e+00 2.7140352939460857e+00 8.7530234704884213e-01 3.5461255990752827e+00 2.4656883702116263e+00 5.4570534865345521e-01 -3.9711652847569816e+00 -2.6153220822857364e+00 -9.3913964289424956e-01 -5.9945943835991038e+00 -2.7523537246952241e+00 -8.8739669768786789e-01 6.5195887537614263e+00 3.0772751168839592e+00 7.3263622877800672e-01 2.1619885161428689e+00 5.4124737251968504e+00 1.4705911003623939e+00 -2.6113358774036235e+00 -5.3435471561841759e+00 -9.4051519388638483e-01 -2.4311332120450548e+00 -7.2035704901114883e+00 -1.0868876893805006e+00 2.7325304253951765e+00 6.6192959182136679e+00 1.4124253037431047e+00 2.5068008060916034e+00 7.0085033490757702e+00 1.0554361303534003e+00 -2.6667850182400703e+00 -6.4619418767059367e+00 -1.5014588381337517e+00 -2.7693407568248642e+00 -9.7196067198111233e+00 -1.6141496462909020e+00 3.0772751168839592e+00 9.6883932503264312e+00 1.2045588332326416e+00 6.2348051198296672e-01 1.1882359733313639e+00 1.5046398104937921e+00 -6.0394339807677355e-01 -9.6545878536989538e-01 -1.3794944494672099e+00 -5.4894371544739085e-01 -1.1100198621167499e+00 -2.5423625821948601e+00 8.8337689643913098e-01 1.4130552771290519e+00 2.6951423533934484e+00 5.7110169317379433e-01 1.0857852082144517e+00 2.5249231316461467e+00 -7.6115443813331096e-01 -1.1946249958855144e+00 -2.7059548494607784e+00 -8.9655377871642450e-01 -1.6215316485353493e+00 -5.0276850751300879e+00 7.3263622877800672e-01 1.2045588332326416e+00 4.9307916607195494e+00 741 742 743 1200 1201 1202 1212 1213 1214 753 754 755 744 745 746 1203 1204 1205 1215 1216 1217 756 757 758 5.8999052913284711e+00 1.7239451017310545e+00 6.2634281221817967e-01 -6.0189905419267768e+00 -2.1618729247183444e+00 -6.8540683143635639e-01 -3.0581519868610436e+00 -1.5554380532093948e+00 -4.2654431985772928e-01 3.2352484647509852e+00 1.9088061430231431e+00 7.1094215733954347e-01 3.0606481327939266e+00 1.5407744906953944e+00 4.6564835914165148e-01 -3.2634747502238608e+00 -1.6759307398419885e+00 -6.3785448302736336e-01 -1.6921672185831049e+00 -1.4067633297530564e+00 -5.2654825301932395e-01 1.8369826087214032e+00 1.6264793120731922e+00 4.7342055864139848e-01 1.7239451017310543e+00 1.2493537927042134e+01 2.5564865954099241e+00 -2.1398224895026128e+00 -1.2396460071858666e+01 -2.1412166505512884e+00 -1.5403311534132809e+00 -9.2711619285389677e+00 -1.8070306460884393e+00 1.8933518253244956e+00 8.7651437532207463e+00 2.2773272213337794e+00 1.5206974672100833e+00 9.1016133071266374e+00 1.9464625729397207e+00 -2.0173882239441010e+00 -8.6443453016911942e+00 -2.2636548479345087e+00 -1.3913580472622906e+00 -7.2323399719819337e+00 -2.1948535571823800e+00 1.9509055198566521e+00 7.1840122866812424e+00 1.6264793120731933e+00 6.2634281221817967e-01 2.5564865954099250e+00 6.4076847197612281e+00 -6.6927711708841264e-01 -2.1102718486433063e+00 -6.0036982368718990e+00 -5.0506307177934684e-01 -2.1608990525350014e+00 -3.2692407172069191e+00 7.0063830179714948e-01 2.2654580576099375e+00 3.5240111570114703e+00 4.4780335158631462e-01 1.8979621762127179e+00 3.2364430706756151e+00 -7.5591296371092909e-01 -2.2290875399115579e+00 -3.5620753208840377e+00 -5.1501515671559606e-01 -2.1705539079993659e+00 -2.1701072812068607e+00 6.7048384369264036e-01 1.9509055198566525e+00 1.8369826087214038e+00 -6.0189905419267777e+00 -2.1398224895026132e+00 -6.6927711708841253e-01 6.3645685435134540e+00 2.5760433276605932e+00 6.2209650486083312e-01 3.2651145416555565e+00 1.9892556566526691e+00 4.7934648672439217e-01 -3.5765661828138029e+00 -2.3018137577395050e+00 -7.8325716958818214e-01 -3.2735041386466253e+00 -2.1321119441911698e+00 -4.8961178967486457e-01 3.5415375323011351e+00 2.2320499582964861e+00 6.8182429267919231e-01 1.8679475271239214e+00 1.9712528060059205e+00 6.8542704510636587e-01 -2.1701072812068607e+00 -2.1948535571823804e+00 -5.2654825301932451e-01 -2.1618729247183439e+00 -1.2396460071858664e+01 -2.1102718486433067e+00 2.5760433276605927e+00 1.2416424975160364e+01 1.6940818192173290e+00 1.9985037636869947e+00 9.2465861152837441e+00 1.5803846363520309e+00 -2.3274921176745114e+00 -8.7692784538626896e+00 -2.0750308124963381e+00 -1.7423227988273380e+00 -9.1528068808744738e+00 -1.4766515555241997e+00 2.2155266152913908e+00 8.6622390462393106e+00 1.8229982848416217e+00 1.6121680425805809e+00 7.2256352418943450e+00 1.9712528060059191e+00 -2.1705539079993650e+00 -7.2323399719819310e+00 -1.4067633297530573e+00 -6.8540683143635639e-01 -2.1412166505512884e+00 -6.0036982368718990e+00 6.2209650486083323e-01 1.6940818192173290e+00 5.8266655699138097e+00 4.7418855236003254e-01 1.5574470094855788e+00 3.0691327143345415e+00 -6.5018745227753894e-01 -1.6981210152251840e+00 -3.2548704041484129e+00 -4.0227933883341149e-01 -1.4964225035283651e+00 -3.0591929496795047e+00 6.9105616639822720e-01 1.8634213452836406e+00 3.2461829979106507e+00 4.6554755564381062e-01 1.6121680425805827e+00 1.8679475271239221e+00 -5.1501515671559672e-01 -1.3913580472622926e+00 -1.6921672185831054e+00 -3.0581519868610436e+00 -1.5403311534132811e+00 -5.0506307177934684e-01 3.2651145416555565e+00 1.9985037636869949e+00 4.7418855236003260e-01 5.8189073536970204e+00 1.8365100704164359e+00 4.4276755396175127e-01 -5.9957655069798985e+00 -2.2068679402580980e+00 -6.4912947200968807e-01 -1.7018187828962370e+00 -1.4853195137430260e+00 -3.3987631929436385e-01 1.8718223842569799e+00 1.6241507830473825e+00 5.2431058989495272e-01 3.0691327143345402e+00 1.5803846363520304e+00 4.7934648672439173e-01 -3.2692407172069191e+00 -1.8070306460884384e+00 -4.2654431985772934e-01 -1.5554380532093948e+00 -9.2711619285389659e+00 -2.1608990525350014e+00 1.9892556566526687e+00 9.2465861152837441e+00 1.5574470094855786e+00 1.8365100704164357e+00 1.3029381482425164e+01 1.8365100704164368e+00 -2.2065205931595564e+00 -1.2485011497195490e+01 -2.2065205931595582e+00 -1.4551963348733659e+00 -7.7023652895747130e+00 -1.4551963348733665e+00 1.9948412972226370e+00 7.2071469308554885e+00 1.9948412972226377e+00 1.5574470094855775e+00 9.2465861152837441e+00 1.9892556566526687e+00 -2.1608990525350014e+00 -9.2711619285389677e+00 -1.5554380532093959e+00 -4.2654431985772928e-01 -1.8070306460884393e+00 -3.2692407172069191e+00 4.7934648672439217e-01 1.5803846363520309e+00 3.0691327143345415e+00 4.4276755396175121e-01 1.8365100704164370e+00 5.8189073536970204e+00 -6.4912947200968796e-01 -2.2068679402580984e+00 -5.9957655069798959e+00 -3.3987631929436385e-01 -1.4853195137430271e+00 -1.7018187828962372e+00 5.2431058989495283e-01 1.6241507830473831e+00 1.8718223842569803e+00 4.7418855236003243e-01 1.9985037636869964e+00 3.2651145416555560e+00 -5.0506307177934717e-01 -1.5403311534132824e+00 -3.0581519868610432e+00 3.2352484647509856e+00 1.8933518253244956e+00 7.0063830179714948e-01 -3.5765661828138033e+00 -2.3274921176745118e+00 -6.5018745227753894e-01 -5.9957655069798976e+00 -2.2065205931595564e+00 -6.4912947200968796e-01 6.3950723142658017e+00 2.5162596186560426e+00 9.5331906281314360e-01 1.8317174027088987e+00 2.0050829004131527e+00 5.1628352381440035e-01 -2.1588472447950418e+00 -2.0829780423970647e+00 -7.9860895188882852e-01 -3.2548704041484111e+00 -2.0750308124963359e+00 -7.8325716958818115e-01 3.5240111570114681e+00 2.2773272213337772e+00 7.1094215733954336e-01 1.9088061430231431e+00 8.7651437532207463e+00 2.2654580576099375e+00 -2.3018137577395050e+00 -8.7692784538626896e+00 -1.6981210152251842e+00 -2.2068679402580980e+00 -1.2485011497195492e+01 -2.2068679402580984e+00 2.5162596186560426e+00 1.2097829634813534e+01 2.5162596186560444e+00 1.5975095729543292e+00 7.1759304549380660e+00 1.5975095729543303e+00 -2.0812306790206678e+00 -6.7804791912722244e+00 -2.0812306790206687e+00 -1.6981210152251824e+00 -8.7692784538626896e+00 -2.3018137577395041e+00 2.2654580576099379e+00 8.7651437532207463e+00 1.9088061430231438e+00 7.1094215733954347e-01 2.2773272213337794e+00 3.5240111570114694e+00 -7.8325716958818214e-01 -2.0750308124963381e+00 -3.2548704041484129e+00 -6.4912947200968807e-01 -2.2065205931595582e+00 -5.9957655069798959e+00 9.5331906281314360e-01 2.5162596186560444e+00 6.3950723142658017e+00 5.1628352381440057e-01 2.0050829004131554e+00 1.8317174027089000e+00 -7.9860895188882930e-01 -2.0829780423970665e+00 -2.1588472447950431e+00 -6.5018745227753882e-01 -2.3274921176745140e+00 -3.5765661828138029e+00 7.0063830179715025e-01 1.8933518253244981e+00 3.2352484647509856e+00 3.0606481327939266e+00 1.5206974672100833e+00 4.4780335158631462e-01 -3.2735041386466253e+00 -1.7423227988273375e+00 -4.0227933883341149e-01 -1.7018187828962368e+00 -1.4551963348733659e+00 -3.3987631929436385e-01 1.8317174027088987e+00 1.5975095729543292e+00 5.1628352381440046e-01 5.9353713347103536e+00 1.7389989707836337e+00 4.1060656215713892e-01 -6.0296640696664294e+00 -2.1294978946628644e+00 -6.0857434889686568e-01 -3.0591929496795034e+00 -1.4766515555241988e+00 -4.8961178967486418e-01 3.2364430706756151e+00 1.9464625729397202e+00 4.6564835914165142e-01 1.5407744906953944e+00 9.1016133071266374e+00 1.8979621762127179e+00 -2.1321119441911698e+00 -9.1528068808744756e+00 -1.4964225035283651e+00 -1.4853195137430262e+00 -7.7023652895747130e+00 -1.4853195137430271e+00 2.0050829004131527e+00 7.1759304549380660e+00 2.0050829004131554e+00 1.7389989707836340e+00 1.2920372800127652e+01 1.7389989707836351e+00 -2.0689645766423399e+00 -1.2291550817995335e+01 -2.0689645766423412e+00 -1.4964225035283636e+00 -9.1528068808744756e+00 -2.1321119441911689e+00 1.8979621762127177e+00 9.1016133071266374e+00 1.5407744906953953e+00 4.6564835914165142e-01 1.9464625729397209e+00 3.2364430706756151e+00 -4.8961178967486457e-01 -1.4766515555241997e+00 -3.0591929496795047e+00 -3.3987631929436385e-01 -1.4551963348733665e+00 -1.7018187828962372e+00 5.1628352381440035e-01 1.5975095729543303e+00 1.8317174027088996e+00 4.1060656215713898e-01 1.7389989707836353e+00 5.9353713347103554e+00 -6.0857434889686601e-01 -2.1294978946628653e+00 -6.0296640696664303e+00 -4.0227933883341133e-01 -1.7423227988273391e+00 -3.2735041386466248e+00 4.4780335158631496e-01 1.5206974672100846e+00 3.0606481327939261e+00 -3.2634747502238612e+00 -2.0173882239441010e+00 -7.5591296371092909e-01 3.5415375323011347e+00 2.2155266152913908e+00 6.9105616639822720e-01 1.8718223842569799e+00 1.9948412972226370e+00 5.2431058989495283e-01 -2.1588472447950418e+00 -2.0812306790206678e+00 -7.9860895188882908e-01 -6.0296640696664294e+00 -2.0689645766423403e+00 -6.0857434889686601e-01 6.3545184711006044e+00 2.3978721301859687e+00 9.0375969855161542e-01 3.2461829979106493e+00 1.8229982848416211e+00 6.8182429267919198e-01 -3.5620753208840372e+00 -2.2636548479345082e+00 -6.3785448302736369e-01 -1.6759307398419885e+00 -8.6443453016911942e+00 -2.2290875399115579e+00 2.2320499582964861e+00 8.6622390462393106e+00 1.8634213452836406e+00 1.6241507830473825e+00 7.2071469308554876e+00 1.6241507830473831e+00 -2.0829780423970643e+00 -6.7804791912722244e+00 -2.0829780423970670e+00 -2.1294978946628649e+00 -1.2291550817995335e+01 -2.1294978946628653e+00 2.3978721301859696e+00 1.1829095589315841e+01 2.3978721301859705e+00 1.8634213452836388e+00 8.6622390462393106e+00 2.2320499582964857e+00 -2.2290875399115584e+00 -8.6443453016911942e+00 -1.6759307398419894e+00 -6.3785448302736336e-01 -2.2636548479345087e+00 -3.5620753208840377e+00 6.8182429267919231e-01 1.8229982848416217e+00 3.2461829979106498e+00 5.2431058989495272e-01 1.9948412972226377e+00 1.8718223842569803e+00 -7.9860895188882852e-01 -2.0812306790206687e+00 -2.1588472447950431e+00 -6.0857434889686579e-01 -2.0689645766423412e+00 -6.0296640696664303e+00 9.0375969855161542e-01 2.3978721301859700e+00 6.3545184711006053e+00 6.9105616639822676e-01 2.2155266152913913e+00 3.5415375323011351e+00 -7.5591296371092931e-01 -2.0173882239441019e+00 -3.2634747502238608e+00 -1.6921672185831049e+00 -1.3913580472622906e+00 -5.1501515671559606e-01 1.8679475271239214e+00 1.6121680425805809e+00 4.6554755564381062e-01 3.0691327143345402e+00 1.5574470094855775e+00 4.7418855236003243e-01 -3.2548704041484111e+00 -1.6981210152251824e+00 -6.5018745227753882e-01 -3.0591929496795034e+00 -1.4964225035283636e+00 -4.0227933883341127e-01 3.2461829979106498e+00 1.8634213452836388e+00 6.9105616639822676e-01 5.8266655699138052e+00 1.6940818192173277e+00 6.2209650486083246e-01 -6.0036982368718981e+00 -2.1412166505512871e+00 -6.8540683143635617e-01 -1.4067633297530564e+00 -7.2323399719819328e+00 -2.1705539079993659e+00 1.9712528060059205e+00 7.2256352418943450e+00 1.6121680425805829e+00 1.5803846363520304e+00 9.2465861152837441e+00 1.9985037636869964e+00 -2.0750308124963364e+00 -8.7692784538626896e+00 -2.3274921176745140e+00 -1.4766515555241990e+00 -9.1528068808744756e+00 -1.7423227988273386e+00 1.8229982848416215e+00 8.6622390462393124e+00 2.2155266152913917e+00 1.6940818192173279e+00 1.2416424975160361e+01 2.5760433276605932e+00 -2.1102718486433072e+00 -1.2396460071858666e+01 -2.1618729247183457e+00 -5.2654825301932395e-01 -2.1948535571823804e+00 -2.1701072812068607e+00 6.8542704510636587e-01 1.9712528060059193e+00 1.8679475271239221e+00 4.7934648672439173e-01 1.9892556566526687e+00 3.2651145416555560e+00 -7.8325716958818126e-01 -2.3018137577395041e+00 -3.5765661828138029e+00 -4.8961178967486418e-01 -2.1321119441911689e+00 -3.2735041386466248e+00 6.8182429267919209e-01 2.2320499582964857e+00 3.5415375323011351e+00 6.2209650486083257e-01 2.5760433276605927e+00 6.3645685435134522e+00 -6.6927711708841242e-01 -2.1398224895026128e+00 -6.0189905419267760e+00 1.8369826087214036e+00 1.9509055198566516e+00 6.7048384369264047e-01 -2.1701072812068611e+00 -2.1705539079993650e+00 -5.1501515671559661e-01 -3.2692407172069191e+00 -2.1608990525350014e+00 -5.0506307177934717e-01 3.5240111570114681e+00 2.2654580576099379e+00 7.0063830179715025e-01 3.2364430706756151e+00 1.8979621762127177e+00 4.4780335158631501e-01 -3.5620753208840372e+00 -2.2290875399115579e+00 -7.5591296371092931e-01 -6.0036982368718981e+00 -2.1102718486433067e+00 -6.6927711708841231e-01 6.4076847197612263e+00 2.5564865954099245e+00 6.2634281221818011e-01 1.6264793120731924e+00 7.1840122866812424e+00 1.9509055198566523e+00 -2.1948535571823804e+00 -7.2323399719819310e+00 -1.3913580472622926e+00 -1.8070306460884387e+00 -9.2711619285389677e+00 -1.5403311534132824e+00 2.2773272213337772e+00 8.7651437532207463e+00 1.8933518253244979e+00 1.9464625729397205e+00 9.1016133071266374e+00 1.5206974672100846e+00 -2.2636548479345082e+00 -8.6443453016911942e+00 -2.0173882239441019e+00 -2.1412166505512871e+00 -1.2396460071858664e+01 -2.1398224895026128e+00 2.5564865954099245e+00 1.2493537927042134e+01 1.7239451017310552e+00 4.7342055864139859e-01 1.6264793120731933e+00 1.8369826087214041e+00 -5.2654825301932440e-01 -1.4067633297530573e+00 -1.6921672185831054e+00 -4.2654431985772939e-01 -1.5554380532093963e+00 -3.0581519868610432e+00 7.1094215733954336e-01 1.9088061430231438e+00 3.2352484647509860e+00 4.6564835914165142e-01 1.5407744906953953e+00 3.0606481327939261e+00 -6.3785448302736369e-01 -1.6759307398419894e+00 -3.2634747502238608e+00 -6.8540683143635617e-01 -2.1618729247183448e+00 -6.0189905419267768e+00 6.2634281221818000e-01 1.7239451017310556e+00 5.8999052913284711e+00 1200 1201 1202 1248 1249 1250 1260 1261 1262 1212 1213 1214 1203 1204 1205 1251 1252 1253 1263 1264 1265 1215 1216 1217 5.3548509016029922e+00 1.5242553251960884e+00 5.6409772492840904e-01 -5.4625226635800130e+00 -1.9683831709359068e+00 -6.2950133591715896e-01 -2.7779906032665647e+00 -1.3768428609019738e+00 -3.7312093552796344e-01 2.9484108910331144e+00 1.7368577224962518e+00 6.5954651127916697e-01 2.7442927375837081e+00 1.3638040691732076e+00 4.1138900346834917e-01 -2.9455482464503260e+00 -1.5013417089447803e+00 -5.8494273261803120e-01 -1.5210245791990835e+00 -1.2401485342936200e+00 -4.7354793685294005e-01 1.6595315622761715e+00 1.4617991582107341e+00 4.2607970124016836e-01 1.5242553251960884e+00 1.1370831196143268e+01 2.3692216219886375e+00 -1.9433206168626991e+00 -1.1266629793417717e+01 -1.9467903038849785e+00 -1.3602811094793610e+00 -8.4790644223777427e+00 -1.6329413794460415e+00 1.7164850686913662e+00 7.9625261409208150e+00 2.1049227117130540e+00 1.3429979249859780e+00 8.2755518731335531e+00 1.7747746037414811e+00 -1.8488157065028539e+00 -7.8113985325450335e+00 -2.0957711041350930e+00 -1.2231221021772751e+00 -6.5776586046521368e+00 -2.0352221290229719e+00 1.7918012161487571e+00 6.5258421427949944e+00 1.4618059790459126e+00 5.6409772492840904e-01 2.3692216219886375e+00 5.8705027859346837e+00 -6.1319885256405604e-01 -1.9183097636872926e+00 -5.4481227450309149e+00 -4.4984377344516602e-01 -1.9929933813458383e+00 -2.9870116614719033e+00 6.4827481530183151e-01 2.0966624150456439e+00 3.2473767853688158e+00 3.9454465947595746e-01 1.7297996141420477e+00 2.9164702121215269e+00 -7.0804070283913212e-01 -2.0614011891028112e+00 -3.2538692155653064e+00 -4.6236851557629322e-01 -2.0147808193509613e+00 -2.0048804049953355e+00 6.2653464471844966e-01 1.7918015023105744e+00 1.6595342436384342e+00 -5.4625226635800130e+00 -1.9433206168626986e+00 -6.1319885256405615e-01 5.8250075041767726e+00 2.3855871685941841e+00 5.5882962540580539e-01 2.9791785706620524e+00 1.8148601769151984e+00 4.2445495914297737e-01 -3.3004631786259626e+00 -2.1289206364688220e+00 -7.3239453850232328e-01 -2.9552655396322072e+00 -1.9630531091587540e+00 -4.3492895894849637e-01 3.2299588297445401e+00 2.0607384831011886e+00 6.3099403296992918e-01 1.6890522601625022e+00 1.8093808594131555e+00 6.3980589641005803e-01 -2.0049457829076842e+00 -2.0352723255334522e+00 -4.7356216391389427e-01 -1.9683831709359072e+00 -1.1266629793417717e+01 -1.9183097636872928e+00 2.3855871685941841e+00 1.1294351190399002e+01 1.4947656418446302e+00 1.8281783612993621e+00 8.4520598361179982e+00 1.4016759977333431e+00 -2.1571688669614422e+00 -7.9678465632275177e+00 -1.9012867581476429e+00 -1.5684534675114690e+00 -8.3292807300275626e+00 -1.3001937508364403e+00 2.0477762140811171e+00 7.8275638917684880e+00 1.6541484047656749e+00 1.4472946916412541e+00 6.5676179232546765e+00 1.8093859591332513e+00 -2.0148309302070997e+00 -6.5778357548673707e+00 -1.2401857308055233e+00 -6.2950133591715884e-01 -1.9467903038849788e+00 -5.4481227450309149e+00 5.5882962540580550e-01 1.4947656418446302e+00 5.2820485706989775e+00 4.2006627610146008e-01 1.3782437684494906e+00 2.7871314224879087e+00 -5.9642252725729750e-01 -1.5228736081717320e+00 -2.9697461349174987e+00 -3.4855721560030722e-01 -1.3174237523221655e+00 -2.7447059098406705e+00 6.3982673549085356e-01 1.6899420597980728e+00 2.9254200222895475e+00 4.1814387593641800e-01 1.4473027961449048e+00 1.6890574904531335e+00 -4.6238543415977379e-01 -1.2231666018582226e+00 -1.5210827161404821e+00 -2.7779906032665656e+00 -1.3602811094793610e+00 -4.4984377344516591e-01 2.9791785706620524e+00 1.8281783612993621e+00 4.2006627610146008e-01 5.3449765973877259e+00 1.6381191423747656e+00 3.8389893568240985e-01 -5.5089352716926427e+00 -2.0185174915617026e+00 -5.8701375583338167e-01 -1.5313542831495639e+00 -1.3173537044075603e+00 -2.9055530192211865e-01 1.6940482793932492e+00 1.4611575600208522e+00 4.7212557846421976e-01 2.7871150467632599e+00 1.4016506028429516e+00 4.2444695793504805e-01 -2.9870383360975152e+00 -1.6329533610893090e+00 -3.7312491698247141e-01 -1.3768428609019743e+00 -8.4790644223777427e+00 -1.9929933813458383e+00 1.8148601769151984e+00 8.4520598361179999e+00 1.3782437684494906e+00 1.6381191423747656e+00 1.1994100896863030e+01 1.6381189543941590e+00 -2.0118617195526243e+00 -1.1429060887257878e+01 -2.0118613717784739e+00 -1.2879607260624912e+00 -7.0574565604350372e+00 -1.2879603545440883e+00 1.8384816368124302e+00 6.5465906238554732e+00 1.8384815168761433e+00 1.3782151008693913e+00 8.4519637167076507e+00 1.8148300469351635e+00 -1.9930107504546968e+00 -8.4791332034734967e+00 -1.3768591789865552e+00 -3.7312093552796349e-01 -1.6329413794460415e+00 -2.9870116614719033e+00 4.2445495914297737e-01 1.4016759977333431e+00 2.7871314224879087e+00 3.8389893568240985e-01 1.6381189543941590e+00 5.3449764858430546e+00 -5.8701397958990365e-01 -2.0185178913950814e+00 -5.5089352872604715e+00 -2.9055548109061580e-01 -1.3173541342532027e+00 -1.5313543127296887e+00 4.7212572236228356e-01 1.4611572974027320e+00 1.6940481286452755e+00 4.2005903355096152e-01 1.8281546627930185e+00 2.9791623001335639e+00 -4.4984825453014943e-01 -1.3602935072289282e+00 -2.7780170756477385e+00 2.9484108910331144e+00 1.7164850686913662e+00 6.4827481530183151e-01 -3.3004631786259622e+00 -2.1571688669614417e+00 -5.9642252725729739e-01 -5.5089352716926427e+00 -2.0118617195526238e+00 -5.8701397958990387e-01 5.9229567380545678e+00 2.3238532434716204e+00 8.9975442409047479e-01 1.6531408667931418e+00 1.8453793996734518e+00 4.6287885446747518e-01 -1.9927906186696476e+00 -1.9203716431106304e+00 -7.5464283191931891e-01 -2.9697095596885856e+00 -1.9012533663646987e+00 -7.3238161085896691e-01 3.2473901327960148e+00 2.1049378841529571e+00 6.5955285576570521e-01 1.7368577224962523e+00 7.9625261409208150e+00 2.0966624150456443e+00 -2.1289206364688220e+00 -7.9678465632275177e+00 -1.5228736081717318e+00 -2.0185174915617030e+00 -1.1429060887257878e+01 -2.0185178913950814e+00 2.3238532434716208e+00 1.1041489268613720e+01 2.3238531924533614e+00 1.4344111595531612e+00 6.5171758005410885e+00 1.4344111108097197e+00 -1.9215206621344871e+00 -6.1191170526134719e+00 -1.9215210631123938e+00 -1.5228410724921344e+00 -7.9677388892735337e+00 -2.1288881816154630e+00 2.0966777371361123e+00 7.9625721822967828e+00 1.7368740259859432e+00 6.5954651127916697e-01 2.1049227117130540e+00 3.2473767853688158e+00 -7.3239453850232328e-01 -1.9012867581476429e+00 -2.9697461349174987e+00 -5.8701375583338167e-01 -2.0118613717784739e+00 -5.5089352872604715e+00 8.9975442409047479e-01 2.3238531924533610e+00 5.9229567063627204e+00 4.6287891545494719e-01 1.8453793394596123e+00 1.6531408200440010e+00 -7.5464253606909359e-01 -1.9203712872437411e+00 -1.9927906460247968e+00 -5.9640967923705124e-01 -2.1571355909140335e+00 -3.3004266482660740e+00 6.4828065881726082e-01 1.7164997644578639e+00 2.9484244046933057e+00 2.7442927375837076e+00 1.3429979249859780e+00 3.9454465947595746e-01 -2.9552655396322072e+00 -1.5684534675114692e+00 -3.4855721560030722e-01 -1.5313542831495639e+00 -1.2879607260624912e+00 -2.9055548109061580e-01 1.6531408667931418e+00 1.4344111595531612e+00 4.6287891545494719e-01 5.3201388000997945e+00 1.5377257091837120e+00 3.5158328911194930e-01 -5.4028526992774548e+00 -1.9333504188764321e+00 -5.4636814500155617e-01 -2.7446270760081415e+00 -1.3001639366614652e+00 -4.3491976008339295e-01 2.9165271935907242e+00 1.7747937553890072e+00 4.1139373773301813e-01 1.3638040691732076e+00 8.2755518731335531e+00 1.7297996141420477e+00 -1.9630531091587540e+00 -8.3292807300275626e+00 -1.3174237523221655e+00 -1.3173537044075605e+00 -7.0574565604350372e+00 -1.3173541342532027e+00 1.8453793996734518e+00 6.5171758005410885e+00 1.8453793394596127e+00 1.5377257091837120e+00 1.1729901221810842e+01 1.5377256510357080e+00 -1.8789249502727690e+00 -1.1082441499573187e+01 -1.8789253810605693e+00 -1.3173901051145380e+00 -8.3291092404002072e+00 -1.9630195572761706e+00 1.7298126909232503e+00 8.2756591349505157e+00 1.3638182202747395e+00 4.1138900346834917e-01 1.7747746037414807e+00 2.9164702121215269e+00 -4.3492895894849637e-01 -1.3001937508364403e+00 -2.7447059098406705e+00 -2.9055530192211865e-01 -1.2879603545440883e+00 -1.5313543127296887e+00 4.6287885446747518e-01 1.4344111108097199e+00 1.6531408200440008e+00 3.5158328911194942e-01 1.5377256510357078e+00 5.3201387359340835e+00 -5.4636789373935524e-01 -1.9333500390629215e+00 -5.4028527428176218e+00 -3.4854795314315001e-01 -1.5684237672162591e+00 -2.9551867244849519e+00 3.9454896070534673e-01 1.3430165460728005e+00 2.7443499217733214e+00 -2.9455482464503260e+00 -1.8488157065028541e+00 -7.0804070283913212e-01 3.2299588297445405e+00 2.0477762140811171e+00 6.3982673549085367e-01 1.6940482793932494e+00 1.8384816368124302e+00 4.7212572236228356e-01 -1.9927906186696476e+00 -1.9215206621344871e+00 -7.5464253606909359e-01 -5.4028526992774548e+00 -1.8789249502727690e+00 -5.4636789373935513e-01 5.7457788477047798e+00 2.2046821859050363e+00 8.5106910291876292e-01 2.9253518129991436e+00 1.6541117554307583e+00 6.3097980509601281e-01 -3.2539462054442847e+00 -2.0957904733192327e+00 -5.8495023322033202e-01 -1.5013417089447800e+00 -7.8113985325450352e+00 -2.0614011891028112e+00 2.0607384831011886e+00 7.8275638917684880e+00 1.6899420597980728e+00 1.4611575600208524e+00 6.5465906238554732e+00 1.4611572974027320e+00 -1.9203716431106304e+00 -6.1191170526134711e+00 -1.9203712872437411e+00 -1.9333504188764321e+00 -1.1082441499573189e+01 -1.9333500390629215e+00 2.2046821859050367e+00 1.0622904876089706e+01 2.2046819923496948e+00 1.6899087189002311e+00 7.8274198768755303e+00 2.0607036737509290e+00 -2.0614231769954658e+00 -7.8115221838575035e+00 -1.5013625078919548e+00 -5.8494273261803120e-01 -2.0957711041350930e+00 -3.2538692155653055e+00 6.3099403296992906e-01 1.6541484047656747e+00 2.9254200222895475e+00 4.7212557846421976e-01 1.8384815168761433e+00 1.6940481286452755e+00 -7.5464283191931902e-01 -1.9215210631123933e+00 -1.9927906460247968e+00 -5.4636814500155617e-01 -1.8789253810605697e+00 -5.4028527428176218e+00 8.5106910291876314e-01 2.2046819923496948e+00 5.7457786514218849e+00 6.3981366506545634e-01 2.0477412238091874e+00 3.2298908010522300e+00 -7.0804866987946191e-01 -1.8488355894926443e+00 -2.9456249990012133e+00 -1.5210245791990835e+00 -1.2231221021772751e+00 -4.6236851557629327e-01 1.6890522601625022e+00 1.4472946916412541e+00 4.1814387593641789e-01 2.7871150467632599e+00 1.3782151008693910e+00 4.2005903355096158e-01 -2.9697095596885861e+00 -1.5228410724921344e+00 -5.9640967923705124e-01 -2.7446270760081415e+00 -1.3173901051145380e+00 -3.4854795314315007e-01 2.9253518129991436e+00 1.6899087189002311e+00 6.3981366506545645e-01 5.2819528523024353e+00 1.4947085539035019e+00 5.5880781641058652e-01 -5.4481107573315297e+00 -1.9467737855304317e+00 -6.2949824300692758e-01 -1.2401485342936200e+00 -6.5776586046521368e+00 -2.0147808193509613e+00 1.8093808594131555e+00 6.5676179232546774e+00 1.4473027961449048e+00 1.4016506028429516e+00 8.4519637167076507e+00 1.8281546627930185e+00 -1.9012533663646987e+00 -7.9677388892735319e+00 -2.1571355909140331e+00 -1.3001639366614652e+00 -8.3291092404002072e+00 -1.5684237672162589e+00 1.6541117554307583e+00 7.8274198768755303e+00 2.0477412238091879e+00 1.4947085539035023e+00 1.1294089982077836e+01 2.3855173328090027e+00 -1.9182859342705838e+00 -1.1266584764589819e+01 -1.9683758380748597e+00 -4.7354793685294005e-01 -2.0352221290229724e+00 -2.0048804049953355e+00 6.3980589641005814e-01 1.8093859591332515e+00 1.6890574904531335e+00 4.2444695793504805e-01 1.8148300469351635e+00 2.9791623001335639e+00 -7.3238161085896680e-01 -2.1288881816154626e+00 -3.3004266482660740e+00 -4.3491976008339295e-01 -1.9630195572761704e+00 -2.9551867244849519e+00 6.3097980509601292e-01 2.0607036737509294e+00 3.2298908010522300e+00 5.5880781641058652e-01 2.3855173328090027e+00 5.8249014328983062e+00 -6.1319116805640594e-01 -1.9433071447137427e+00 -5.4625182467908706e+00 1.6595315622761713e+00 1.7918012161487571e+00 6.2653464471844966e-01 -2.0049457829076847e+00 -2.0148309302070997e+00 -4.6238543415977373e-01 -2.9870383360975152e+00 -1.9930107504546968e+00 -4.4984825453014948e-01 3.2473901327960148e+00 2.0966777371361127e+00 6.4828065881726082e-01 2.9165271935907242e+00 1.7298126909232505e+00 3.9454896070534673e-01 -3.2539462054442847e+00 -2.0614231769954658e+00 -7.0804866987946191e-01 -5.4481107573315288e+00 -1.9182859342705840e+00 -6.1319116805640606e-01 5.8705921931181031e+00 2.3692591477197271e+00 5.6410926238473380e-01 1.4617991582107341e+00 6.5258421427949944e+00 1.7918015023105742e+00 -2.0352723255334522e+00 -6.5778357548673707e+00 -1.2231666018582226e+00 -1.6329533610893088e+00 -8.4791332034734985e+00 -1.3602935072289282e+00 2.1049378841529571e+00 7.9625721822967819e+00 1.7164997644578639e+00 1.7747937553890072e+00 8.2756591349505157e+00 1.3430165460728005e+00 -2.0957904733192319e+00 -7.8115221838575026e+00 -1.8488355894926443e+00 -1.9467737855304312e+00 -1.1266584764589819e+01 -1.9433071447137429e+00 2.3692591477197276e+00 1.1371002446745900e+01 1.5242850304522979e+00 4.2607970124016842e-01 1.4618059790459126e+00 1.6595342436384342e+00 -4.7356216391389427e-01 -1.2401857308055233e+00 -1.5210827161404821e+00 -3.7312491698247141e-01 -1.3768591789865554e+00 -2.7780170756477389e+00 6.5955285576570521e-01 1.7368740259859432e+00 2.9484244046933057e+00 4.1139373773301813e-01 1.3638182202747395e+00 2.7443499217733214e+00 -5.8495023322033202e-01 -1.5013625078919548e+00 -2.9456249990012129e+00 -6.2949824300692758e-01 -1.9683758380748599e+00 -5.4625182467908706e+00 5.6410926238473380e-01 1.5242850304522984e+00 5.3549344674752426e+00 753 754 755 1212 1213 1214 1224 1225 1226 765 766 767 756 757 758 1215 1216 1217 1227 1228 1229 768 769 770 5.5199160891355348e+00 2.9368094920808929e-01 1.0469822752735457e-01 -5.4632492753582760e+00 -7.6877517881266355e-01 -2.6045565652337238e-01 -2.6932942351493239e+00 -2.1791692006853464e-01 -5.9309768706400187e-02 2.7036124553800276e+00 6.7826503478522870e-01 2.4830271632992409e-01 2.7215050710195605e+00 2.5368113563175276e-01 7.6585824887924758e-02 -2.7731164567156164e+00 -4.7977244889094051e-01 -1.7914459428915341e-01 -1.3626642467704200e+00 -2.0537768418104271e-01 -7.7111615582924758e-02 1.3472905984585146e+00 4.4621511232811079e-01 1.4643486635664726e-01 2.9368094920808935e-01 1.2967730482547829e+01 2.7040083033040454e+00 -7.5272810565636905e-01 -1.3037021127015988e+01 -2.3156750308954610e+00 -2.1827096639642099e-01 -9.5820526042244722e+00 -1.8916155150915446e+00 6.6289577955182744e-01 9.2329203035415492e+00 2.4112390139895585e+00 2.4292778155483183e-01 9.5028410331134268e+00 2.0663996307479700e+00 -8.3917367335686643e-01 -9.1896899894447657e+00 -2.4159128320275727e+00 -1.9481585635894336e-01 -7.5133540351597867e+00 -2.2848473182547959e+00 8.0548409145385513e-01 7.6186259366422080e+00 1.7264037482277990e+00 1.0469822752735458e-01 2.7040083033040454e+00 6.4881516212979964e+00 -2.5303192893925697e-01 -2.2897272959340462e+00 -6.0830906058563201e+00 -7.1836112762121318e-02 -2.2627719215978117e+00 -3.2888853143869063e+00 2.4103559884078896e-01 2.4038040173941733e+00 3.5521595790153242e+00 7.1856047925711777e-02 2.0222214812352561e+00 3.2934279228201278e+00 -3.1048577020213336e-01 -2.3993808582102192e+00 -3.6265022451963911e+00 -7.2522937173157540e-02 -2.2643863542057971e+00 -2.1966410985369746e+00 2.9028687478281529e-01 2.0862326280143981e+00 1.8613801408431434e+00 -5.4632492753582769e+00 -7.5272810565636905e-01 -2.5303192893925691e-01 5.6477457233993515e+00 1.2482271245433441e+00 3.0009954137102041e-01 2.7202077362831654e+00 6.9783689476985611e-01 1.6712803615643618e-01 -2.8829588981475540e+00 -1.1376293949169076e+00 -3.7709812371153895e-01 -2.7741331538476355e+00 -8.7953825593732016e-01 -2.0494258977753188e-01 2.9086343339656091e+00 1.0892879815431420e+00 3.2818235272177682e-01 1.3779754830877458e+00 8.0845549555236218e-01 2.9414466309625120e-01 -1.5342219493824054e+00 -1.0739117398981075e+00 -2.5448195091715686e-01 -7.6877517881266344e-01 -1.3037021127015988e+01 -2.2897272959340462e+00 1.2482271245433441e+00 1.3229512526359688e+01 1.8807945276511466e+00 7.0486180236600526e-01 9.7305324992493478e+00 1.6891468784802768e+00 -1.1463927343752449e+00 -9.4054180690560241e+00 -2.2359520582249806e+00 -4.9478820137444618e-01 -9.7096893956475565e+00 -1.6228525582741196e+00 1.0867469478431773e+00 9.3603342996418935e+00 2.0040468237936810e+00 4.3624438116177033e-01 7.6579663828572802e+00 2.1021684345543532e+00 -1.0661241413519464e+00 -7.8262171163886434e+00 -1.5276247520463111e+00 -2.6045565652337233e-01 -2.3156750308954606e+00 -6.0830906058563210e+00 3.0009954137102046e-01 1.8807945276511462e+00 5.9018719351806395e+00 1.6796582649055122e-01 1.6849080685109081e+00 3.0884201913852700e+00 -3.1691247816535834e-01 -1.8570357589661364e+00 -3.2882758209135208e+00 -1.1426654995456167e-01 -1.6306929219811073e+00 -3.1099219293789560e+00 3.3272689359895574e-01 2.0386181947959501e+00 3.3117940381358482e+00 1.4386123322486077e-01 1.7291135653043315e+00 1.8978330310228588e+00 -2.5301881004209675e-01 -1.5300306444196310e+00 -1.7186308395758194e+00 -2.6932942351493234e+00 -2.1827096639642099e-01 -7.1836112762121318e-02 2.7202077362831654e+00 7.0486180236600526e-01 1.6796582649055120e-01 5.3303809680245289e+00 3.0556729170084540e-01 7.5109181526429550e-02 -5.3368330383507159e+00 -7.7694210370799155e-01 -2.0621745006389527e-01 -1.3637812664633371e+00 -2.1973961634768355e-01 -5.0380010528715533e-02 1.3796660697024812e+00 4.5598924643829936e-01 1.2594406761001001e-01 2.6749439849783117e+00 2.5231665671879272e-01 7.6587808320398798e-02 -2.7112902190251118e+00 -5.0378231077184688e-01 -1.1717331059265744e-01 -2.1791692006853461e-01 -9.5820526042244722e+00 -2.2627719215978117e+00 6.9783689476985611e-01 9.7305324992493478e+00 1.6849080685109081e+00 3.0556729170084540e-01 1.3272173446572852e+01 1.9111608475369080e+00 -7.7066103585206946e-01 -1.2896334690963240e+01 -2.3098980140970968e+00 -2.0873596059688060e-01 -7.9907405294895506e+00 -1.5483857775138181e+00 8.3171717141750168e-01 7.6534862619740229e+00 2.1074310557669302e+00 2.4155512397515380e-01 9.4668681278165359e+00 2.0539651065549194e+00 -8.7936256534587631e-01 -9.6539325109354941e+00 -1.6364093651609386e+00 -5.9309768706400180e-02 -1.8916155150915448e+00 -3.2888853143869063e+00 1.6712803615643618e-01 1.6891468784802770e+00 3.0884201913852700e+00 7.5109181526429550e-02 1.9111608475369082e+00 5.7777583259809848e+00 -2.0490072039560442e-01 -2.3157440373723506e+00 -5.9608123357109095e+00 -4.8144650513474142e-02 -1.5590045284395315e+00 -1.7208514188251911e+00 2.0201287677096469e-01 1.7298375973457176e+00 1.8971190823696931e+00 7.3817709251124131e-02 2.0681359649542830e+00 3.2558011425462530e+00 -2.0571266408947675e-01 -1.6319172074137582e+00 -3.0485496733591955e+00 2.7036124553800280e+00 6.6289577955182744e-01 2.4103559884078898e-01 -2.8829588981475536e+00 -1.1463927343752449e+00 -3.1691247816535828e-01 -5.3368330383507168e+00 -7.7066103585206935e-01 -2.0490072039560442e-01 5.5832483517738840e+00 1.1988914796073795e+00 4.4243586595530959e-01 1.3455212378814951e+00 8.3137449502599237e-01 2.0003527387176501e-01 -1.5324481577000864e+00 -1.0224836949886598e+00 -3.8129742128448307e-01 -2.7086598931320078e+00 -8.4168003074517850e-01 -3.1304976753394825e-01 2.8285179422949573e+00 1.0880557417759533e+00 3.3265364871153047e-01 6.7826503478522870e-01 9.2329203035415492e+00 2.4038040173941728e+00 -1.1376293949169074e+00 -9.4054180690560223e+00 -1.8570357589661359e+00 -7.7694210370799155e-01 -1.2896334690963240e+01 -2.3157440373723506e+00 1.1988914796073793e+00 1.2657852651302926e+01 2.6734257208873116e+00 4.4465331371069344e-01 7.6144575938792070e+00 1.7194175969518732e+00 -1.0276096819788445e+00 -7.3551815767024298e+00 -2.2422607878375937e+00 -4.6749242516332129e-01 -9.1356080654852612e+00 -2.4176673736534937e+00 1.0878637776637672e+00 9.2873118534832741e+00 2.0360606225962163e+00 2.4830271632992415e-01 2.4112390139895585e+00 3.5521595790153242e+00 -3.7709812371153884e-01 -2.2359520582249806e+00 -3.2882758209135208e+00 -2.0621745006389527e-01 -2.3098980140970968e+00 -5.9608123357109104e+00 4.4243586595530959e-01 2.6734257208873111e+00 6.3681910994085564e+00 1.2225863193364973e-01 2.1078210805305249e+00 1.8616378743940420e+00 -3.8241403146903602e-01 -2.2375984303949314e+00 -2.1939375997098862e+00 -1.7561092796258126e-01 -2.4219731871075258e+00 -3.5719569102158677e+00 3.2834331898816949e-01 2.0129358744171393e+00 3.2329941137322598e+00 2.7215050710195601e+00 2.4292778155483180e-01 7.1856047925711791e-02 -2.7741331538476355e+00 -4.9478820137444618e-01 -1.1426654995456167e-01 -1.3637812664633371e+00 -2.0873596059688057e-01 -4.8144650513474142e-02 1.3455212378814949e+00 4.4465331371069339e-01 1.2225863193364973e-01 5.5695789473291608e+00 2.8892559605407236e-01 7.0745322630062168e-02 -5.5047731298760532e+00 -7.7783648475964751e-01 -2.0363554081626992e-01 -2.7162507530432412e+00 -1.9714973957317061e-01 -6.6224752719866595e-02 2.7223330470000504e+00 7.0200369498454729e-01 1.6741149151474866e-01 2.5368113563175271e-01 9.5028410331134268e+00 2.0222214812352561e+00 -8.7953825593732016e-01 -9.7096893956475547e+00 -1.6306929219811075e+00 -2.1973961634768355e-01 -7.9907405294895515e+00 -1.5590045284395320e+00 8.3137449502599237e-01 7.6144575938792070e+00 2.1078210805305253e+00 2.8892559605407242e-01 1.3375566200092988e+01 1.8690912012388461e+00 -7.2468499472708381e-01 -1.2915119361382123e+01 -2.2324745214189470e+00 -1.9966957628296578e-01 -9.4342778303468329e+00 -2.2199572262451066e+00 6.4965121658323965e-01 9.5569622897804383e+00 1.6429954350800646e+00 7.6585824887924744e-02 2.0663996307479700e+00 3.2934279228201278e+00 -2.0494258977753188e-01 -1.6228525582741198e+00 -3.1099219293789560e+00 -5.0380010528715539e-02 -1.5483857775138181e+00 -1.7208514188251911e+00 2.0003527387176498e-01 1.7194175969518730e+00 1.8616378743940418e+00 7.0745322630062168e-02 1.8690912012388459e+00 6.0055331421068390e+00 -1.9294867315707065e-01 -2.2863398207043648e+00 -6.1136161334167998e+00 -5.3379080434619891e-02 -1.8373001079747853e+00 -3.2986404138832519e+00 1.5428393250818692e-01 1.6399698355283987e+00 3.0824309561831900e+00 -2.7731164567156164e+00 -8.3917367335686643e-01 -3.1048577020213336e-01 2.9086343339656091e+00 1.0867469478431775e+00 3.3272689359895574e-01 1.3796660697024812e+00 8.3171717141750168e-01 2.0201287677096469e-01 -1.5324481577000861e+00 -1.0276096819788445e+00 -3.8241403146903602e-01 -5.5047731298760540e+00 -7.2468499472708381e-01 -1.9294867315707068e-01 5.6851207901521290e+00 1.1696382411622241e+00 4.3113937672139957e-01 2.7370458349667230e+00 6.2669444334592939e-01 2.3060363067631529e-01 -2.9001292844951867e+00 -1.1233284537060375e+00 -3.1063430293939520e-01 -4.7977244889094051e-01 -9.1896899894447657e+00 -2.3993808582102192e+00 1.0892879815431420e+00 9.3603342996418917e+00 2.0386181947959501e+00 4.5598924643829936e-01 7.6534862619740220e+00 1.7298375973457178e+00 -1.0224836949886598e+00 -7.3551815767024289e+00 -2.2375984303949314e+00 -7.7783648475964773e-01 -1.2915119361382123e+01 -2.2863398207043644e+00 1.1696382411622241e+00 1.2597604960679366e+01 2.6081633483708844e+00 6.6826511405665712e-01 9.1074824059661896e+00 2.3576977650028441e+00 -1.1030879545610783e+00 -9.2589170007321577e+00 -1.8109977962058807e+00 -1.7914459428915341e-01 -2.4159128320275727e+00 -3.6265022451963911e+00 3.2818235272177682e-01 2.0040468237936810e+00 3.3117940381358482e+00 1.2594406761001001e-01 2.1074310557669298e+00 1.8971190823696931e+00 -3.8129742128448307e-01 -2.2422607878375937e+00 -2.1939375997098862e+00 -2.0363554081626986e-01 -2.2324745214189474e+00 -6.1136161334167998e+00 4.3113937672139957e-01 2.6081633483708844e+00 6.4495892387575298e+00 2.4417020226467315e-01 2.3484456504525415e+00 3.5708026227029324e+00 -3.6535844292795455e-01 -2.1774387370999242e+00 -3.2952490036429252e+00 -1.3626642467704198e+00 -1.9481585635894338e-01 -7.2522937173157540e-02 1.3779754830877455e+00 4.3624438116177039e-01 1.4386123322486077e-01 2.6749439849783117e+00 2.4155512397515380e-01 7.3817709251124131e-02 -2.7086598931320078e+00 -4.6749242516332135e-01 -1.7561092796258126e-01 -2.7162507530432412e+00 -1.9966957628296575e-01 -5.3379080434619891e-02 2.7370458349667230e+00 6.6826511405665712e-01 2.4417020226467315e-01 5.3748280681606513e+00 2.6986881242933869e-01 9.7036714450722275e-02 -5.3772184782477632e+00 -7.5395557381768930e-01 -2.5737291362102166e-01 -2.0537768418104274e-01 -7.5133540351597876e+00 -2.2643863542057971e+00 8.0845549555236207e-01 7.6579663828572802e+00 1.7291135653043315e+00 2.5231665671879266e-01 9.4668681278165359e+00 2.0681359649542830e+00 -8.4168003074517850e-01 -9.1356080654852594e+00 -2.4219731871075258e+00 -1.9714973957317058e-01 -9.4342778303468329e+00 -1.8373001079747855e+00 6.2669444334592950e-01 9.1074824059661914e+00 2.3484456504525415e+00 2.6986881242933869e-01 1.2631009183460593e+01 2.6530328995703027e+00 -7.1312795354703484e-01 -1.2780086169108721e+01 -2.2750684309933509e+00 -7.7111615582924758e-02 -2.2848473182547959e+00 -2.1966410985369746e+00 2.9414466309625109e-01 2.1021684345543536e+00 1.8978330310228588e+00 7.6587808320398826e-02 2.0539651065549194e+00 3.2558011425462530e+00 -3.1304976753394825e-01 -2.4176673736534937e+00 -3.5719569102158677e+00 -6.6224752719866595e-02 -2.2199572262451066e+00 -3.2986404138832524e+00 2.3060363067631531e-01 2.3576977650028441e+00 3.5708026227029332e+00 9.7036714450722303e-02 2.6530328995703036e+00 6.3331950117257030e+00 -2.4198668070694931e-01 -2.2443922875290236e+00 -5.9903933853616529e+00 1.3472905984585146e+00 8.0548409145385513e-01 2.9028687478281523e-01 -1.5342219493824054e+00 -1.0661241413519464e+00 -2.5301881004209675e-01 -2.7112902190251118e+00 -8.7936256534587631e-01 -2.0571266408947672e-01 2.8285179422949573e+00 1.0878637776637672e+00 3.2834331898816949e-01 2.7223330470000504e+00 6.4965121658323965e-01 1.5428393250818692e-01 -2.9001292844951867e+00 -1.1030879545610783e+00 -3.6535844292795455e-01 -5.3772184782477632e+00 -7.1312795354703473e-01 -2.4198668070694918e-01 5.6247183433969443e+00 1.2187035291050741e+00 2.9316247148730562e-01 4.4621511232811079e-01 7.6186259366422080e+00 2.0862326280143981e+00 -1.0739117398981075e+00 -7.8262171163886434e+00 -1.5300306444196310e+00 -5.0378231077184688e-01 -9.6539325109354959e+00 -1.6319172074137578e+00 1.0880557417759533e+00 9.2873118534832741e+00 2.0129358744171388e+00 7.0200369498454718e-01 9.5569622897804383e+00 1.6399698355283987e+00 -1.1233284537060375e+00 -9.2589170007321577e+00 -2.1774387370999242e+00 -7.5395557381768930e-01 -1.2780086169108721e+01 -2.2443922875290241e+00 1.2187035291050741e+00 1.3056252717259094e+01 1.8446405385024005e+00 1.4643486635664724e-01 1.7264037482277990e+00 1.8613801408431434e+00 -2.5448195091715686e-01 -1.5276247520463111e+00 -1.7186308395758194e+00 -1.1717331059265743e-01 -1.6364093651609384e+00 -3.0485496733591955e+00 3.3265364871153047e-01 2.0360606225962168e+00 3.2329941137322598e+00 1.6741149151474866e-01 1.6429954350800646e+00 3.0824309561831900e+00 -3.1063430293939515e-01 -1.8109977962058807e+00 -3.2952490036429252e+00 -2.5737291362102166e-01 -2.2750684309933509e+00 -5.9903933853616529e+00 2.9316247148730562e-01 1.8446405385024005e+00 5.8760176911810014e+00 1212 1213 1214 1260 1261 1262 1272 1273 1274 1224 1225 1226 1215 1216 1217 1263 1264 1265 1275 1276 1277 1227 1228 1229 5.1001521168234660e+00 2.3869213952973631e-01 8.5980816987391739e-02 -5.0329647524560688e+00 -7.1721162235346769e-01 -2.4705713740942642e-01 -2.5413937343476496e+00 -1.7283792201599535e-01 -4.6822438530062051e-02 2.5429084770243309e+00 6.3761341457929688e-01 2.3663852525407614e-01 2.4892999633328499e+00 2.0547842157280635e-01 6.1597561835096820e-02 -2.5357409616242284e+00 -4.3273775626287225e-01 -1.6453101633359862e-01 -1.2749908253519477e+00 -1.6289431327194756e-01 -6.2231696360145056e-02 1.2527297165992468e+00 4.0389763822244351e-01 1.3642538455666739e-01 2.3869213952973628e-01 1.2041096895592174e+01 2.5575604079998526e+00 -7.0156919788815464e-01 -1.2106958004423792e+01 -2.1570686965223520e+00 -1.6754916915510890e-01 -9.0089626409434924e+00 -1.7646561572236528e+00 6.1650658344836951e-01 8.6472955613374243e+00 2.2820343507416716e+00 1.9299291722203368e-01 8.8333550699009322e+00 1.9274007101717086e+00 -7.9973735700336279e-01 -8.5083304379016536e+00 -2.2864604194257070e+00 -1.4763272348492529e-01 -7.0253092332163671e+00 -2.1642486777367482e+00 7.6829680733141048e-01 7.1278127896547847e+00 1.6054384819952274e+00 8.5980816987391726e-02 2.5575604079998526e+00 6.0330113678083670e+00 -2.4097188846515236e-01 -2.1434766194829118e+00 -5.6117978176062175e+00 -5.5751660426026507e-02 -2.1405221214491785e+00 -3.1005411241381049e+00 2.2773710713912509e-01 2.2808794151086711e+00 3.3648041708830698e+00 5.7216089133303540e-02 1.8973324040317487e+00 3.0209151744909741e+00 -3.0057916367910681e-01 -2.2709968957344584e+00 -3.3623124821754922e+00 -5.6155382294847893e-02 -2.1509887526819287e+00 -2.0799991087911796e+00 2.8252408160531278e-01 1.9702121622082067e+00 1.7359198195285801e+00 -5.0329647524560688e+00 -7.0156919788815453e-01 -2.4097188846515241e-01 5.2291723572937592e+00 1.2025032129081596e+00 2.8257320480794224e-01 2.5626871990200701e+00 6.5387805904900975e-01 1.5381173256087738e-01 -2.7303933782651972e+00 -1.0959667461950608e+00 -3.6545411800162242e-01 -2.5387977251833620e+00 -8.3911655293077148e-01 -1.9088863950068641e-01 2.6759048376601369e+00 1.0478187073458172e+00 3.1683910596543724e-01 1.2833092566585351e+00 7.6940113041317926e-01 2.8499868511869703e-01 -1.4489177947278737e+00 -1.0369486127021792e+00 -2.4090808248549270e-01 -7.1721162235346791e-01 -1.2106958004423795e+01 -2.1434766194829118e+00 1.2025032129081596e+00 1.2307732789161863e+01 1.7201666316755602e+00 6.6608875118965793e-01 9.1593040415577267e+00 1.5580989406562393e+00 -1.1113437320132447e+00 -8.8237715010672524e+00 -2.1054875152804637e+00 -4.4657098847705751e-01 -9.0445952230425330e+00 -1.4834818784852082e+00 1.0485425009782527e+00 8.6797014876499130e+00 1.8777922243532210e+00 3.9298229931209760e-01 7.1700313593596272e+00 1.9808960407719534e+00 -1.0349904215443959e+00 -7.3414449491955533e+00 -1.4045078242083899e+00 -2.4705713740942631e-01 -2.1570686965223524e+00 -5.6117978176062175e+00 2.8257320480794224e-01 1.7201666316755599e+00 5.4370429547976977e+00 1.5538082127078817e-01 1.5487977585092090e+00 2.8983908558861229e+00 -3.0463516429484605e-01 -1.7237559808030929e+00 -3.0934554450329563e+00 -9.9975801811655551e-02 -1.4892510199905806e+00 -2.8398820405197300e+00 3.2018804773915699e-01 1.8975157794319548e+00 3.0364701767804649e+00 1.3328356581259099e-01 1.6039869871094490e+00 1.7694746268845618e+00 -2.3975753611455008e-01 -1.4003914594101485e+00 -1.5962433111899426e+00 -2.5413937343476496e+00 -1.6754916915510892e-01 -5.5751660426026500e-02 2.5626871990200701e+00 6.6608875118965793e-01 1.5538082127078817e-01 5.1507966486097105e+00 2.5558707994097579e-01 6.2262138700525993e-02 -5.1449203003512789e+00 -7.3997895780154532e-01 -1.9179815859546895e-01 -1.2774717305278502e+00 -1.7335299268169244e-01 -3.8473681084610072e-02 1.2854439475355000e+00 4.1583808368532338e-01 1.1139034153328983e-01 2.5575655239113662e+00 2.0656670277087710e-01 6.2623565300243933e-02 -2.5927075538498672e+00 -4.6319949794848753e-01 -1.0563336669874239e-01 -1.7283792201599535e-01 -9.0089626409434906e+00 -2.1405221214491785e+00 6.5387805904900975e-01 9.1593040415577267e+00 1.5487977585092090e+00 2.5558707994097590e-01 1.2668078128742589e+01 1.7760853008607627e+00 -7.2196996970022642e-01 -1.2273377234743325e+01 -2.1696653803727792e+00 -1.6398815009132925e-01 -7.5156531034845546e+00 -1.4214738337302280e+00 7.9712194852754992e-01 7.1620612381462818e+00 1.9927482157539016e+00 1.9417484880650226e-01 8.9446927355565045e+00 1.9242065635643519e+00 -8.4196589451648507e-01 -9.1361431648317311e+00 -1.5101765031360390e+00 -4.6822438530062051e-02 -1.7646561572236528e+00 -3.1005411241381049e+00 1.5381173256087741e-01 1.5580989406562393e+00 2.8983908558861229e+00 6.2262138700525993e-02 1.7760853008607624e+00 5.5610445142833118e+00 -1.8864721672432383e-01 -2.1926420239371582e+00 -5.7336567687616071e+00 -3.6733065393126721e-02 -1.4359771317632630e+00 -1.6000042868689883e+00 1.8869909571164259e-01 1.6093759331322839e+00 1.7720860102816709e+00 5.9945622210646254e-02 1.9529281881235798e+00 3.1013268637244309e+00 -1.9251586853617925e-01 -1.5032130498487921e+00 -2.8986460644068357e+00 2.5429084770243309e+00 6.1650658344836951e-01 2.2773710713912507e-01 -2.7303933782651968e+00 -1.1113437320132447e+00 -3.0463516429484594e-01 -5.1449203003512789e+00 -7.2196996970022620e-01 -1.8864721672432386e-01 5.4009388761375057e+00 1.1586082233486747e+00 4.3334092180309269e-01 1.2505989571976128e+00 7.9352003788748837e-01 1.8509425381009967e-01 -1.4456403909792288e+00 -9.8578305683060297e-01 -3.7392744729488597e-01 -2.5865065067157751e+00 -7.9989064191663528e-01 -3.0166146019448037e-01 2.7130142659520278e+00 1.0503525557761770e+00 3.2269900575621890e-01 6.3761341457929688e-01 8.6472955613374243e+00 2.2808794151086706e+00 -1.0959667461950606e+00 -8.8237715010672524e+00 -1.7237559808030927e+00 -7.3997895780154543e-01 -1.2273377234743325e+01 -2.1926420239371582e+00 1.1586082233486747e+00 1.2029483954663238e+01 2.5410615742420841e+00 4.0258847806764297e-01 7.1260538933295932e+00 1.5944929784469533e+00 -9.9115940623050403e-01 -6.8584281688136253e+00 -2.1254302819909001e+00 -4.2521322627829650e-01 -8.6045024343738863e+00 -2.2934396562839479e+00 1.0535082205097903e+00 8.7572459296678371e+00 1.9188339752173913e+00 2.3663852525407614e-01 2.2820343507416716e+00 3.3648041708830707e+00 -3.6545411800162242e-01 -2.1054875152804637e+00 -3.0934554450329563e+00 -1.9179815859546895e-01 -2.1696653803727792e+00 -5.7336567687616071e+00 4.3334092180309269e-01 2.5410615742420846e+00 6.1499551990905337e+00 1.0664890218087048e-01 1.9872936255155489e+00 1.7330595951886958e+00 -3.7415665834937850e-01 -2.1151232089620216e+00 -2.0755152973876601e+00 -1.6201595357074872e-01 -2.3004475668171418e+00 -3.4226319017627804e+00 3.1679653927917878e-01 1.8803341209331035e+00 3.0774404477827040e+00 2.4892999633328499e+00 1.9299291722203368e-01 5.7216089133303547e-02 -2.5387977251833620e+00 -4.4657098847705751e-01 -9.9975801811655551e-02 -1.2774717305278502e+00 -1.6398815009132928e-01 -3.6733065393126728e-02 1.2505989571976128e+00 4.0258847806764303e-01 1.0664890218087048e-01 5.0737533065823035e+00 2.3136992899347858e-01 5.5742404846838164e-02 -4.9961320533623450e+00 -7.2232496957442938e-01 -1.8475336111473753e-01 -2.5220512987541688e+00 -1.5180783952681778e-01 -5.1617197147623937e-02 2.5208005807149583e+00 6.5774062338647865e-01 1.5347202930613160e-01 2.0547842157280635e-01 8.8333550699009304e+00 1.8973324040317485e+00 -8.3911655293077148e-01 -9.0445952230425313e+00 -1.4892510199905802e+00 -1.7335299268169241e-01 -7.5156531034845546e+00 -1.4359771317632632e+00 7.9352003788748826e-01 7.1260538933295923e+00 1.9872936255155484e+00 2.3136992899347855e-01 1.2374373143178470e+01 1.7067481288840041e+00 -6.8033555225443443e-01 -1.1893856151729080e+01 -2.0855682805953766e+00 -1.4767200052291404e-01 -8.8198345517991825e+00 -2.0926966157505946e+00 6.1010870993603750e-01 8.9401569236463541e+00 1.5121188896685125e+00 6.1597561835096813e-02 1.9274007101717086e+00 3.0209151744909741e+00 -1.9088863950068644e-01 -1.4834818784852084e+00 -2.8398820405197300e+00 -3.8473681084610072e-02 -1.4214738337302280e+00 -1.6000042868689885e+00 1.8509425381009970e-01 1.5944929784469533e+00 1.7330595951886958e+00 5.5742404846838151e-02 1.7067481288840038e+00 5.4648138154672150e+00 -1.7577160764469529e-01 -2.1226371284592642e+00 -5.5631946434076598e+00 -3.8525967462231754e-02 -1.7046637457816873e+00 -3.0645646036664766e+00 1.4122567520018850e-01 1.5036147689537220e+00 2.8488569893159701e+00 -2.5357409616242279e+00 -7.9973735700336268e-01 -3.0057916367910686e-01 2.6759048376601364e+00 1.0485425009782527e+00 3.2018804773915704e-01 1.2854439475355000e+00 7.9712194852754992e-01 1.8869909571164259e-01 -1.4456403909792288e+00 -9.9115940623050403e-01 -3.7415665834937850e-01 -4.9961320533623450e+00 -6.8033555225443454e-01 -1.7577160764469529e-01 5.1872963035350077e+00 1.1220722721969265e+00 4.2077331556712649e-01 2.5353802384686226e+00 5.8781063569010139e-01 2.1882313435584244e-01 -2.7065119212334645e+00 -1.0843150419045293e+00 -2.9797616370058766e-01 -4.3273775626287220e-01 -8.5083304379016536e+00 -2.2709968957344584e+00 1.0478187073458172e+00 8.6797014876499130e+00 1.8975157794319544e+00 4.1583808368532338e-01 7.1620612381462818e+00 1.6093759331322841e+00 -9.8578305683060297e-01 -6.8584281688136253e+00 -2.1151232089620216e+00 -7.2232496957442960e-01 -1.1893856151729077e+01 -2.1226371284592638e+00 1.1220722721969263e+00 1.1570594221860953e+01 2.4547984263222178e+00 6.2396124871171654e-01 8.4795701499986293e+00 2.2278700979667363e+00 -1.0688445292718771e+00 -8.6313123392114246e+00 -1.6808030036974484e+00 -1.6453101633359860e-01 -2.2864604194257070e+00 -3.3623124821754917e+00 3.1683910596543730e-01 1.8777922243532210e+00 3.0364701767804649e+00 1.1139034153328983e-01 1.9927482157539016e+00 1.7720860102816709e+00 -3.7392744729488603e-01 -2.1254302819909001e+00 -2.0755152973876601e+00 -1.8475336111473759e-01 -2.0855682805953770e+00 -5.5631946434076607e+00 4.2077331556712649e-01 2.4547984263222178e+00 5.9120043179604522e+00 2.3126106340570071e-01 2.2253453911868881e+00 3.3422810757901669e+00 -3.5705200172833151e-01 -2.0532252756042464e+00 -3.0618191578419420e+00 -1.2749908253519477e+00 -1.4763272348492532e-01 -5.6155382294847893e-02 1.2833092566585353e+00 3.9298229931209766e-01 1.3328356581259099e-01 2.5575655239113662e+00 1.9417484880650229e-01 5.9945622210646247e-02 -2.5865065067157751e+00 -4.2521322627829644e-01 -1.6201595357074874e-01 -2.5220512987541688e+00 -1.4767200052291402e-01 -3.8525967462231775e-02 2.5353802384686226e+00 6.2396124871171654e-01 2.3126106340570068e-01 5.1016007229381559e+00 2.1850974111420035e-01 7.9098641952066839e-02 -5.0943071111547891e+00 -7.0911018765838096e-01 -2.4689159005317635e-01 -1.6289431327194756e-01 -7.0253092332163671e+00 -2.1509887526819287e+00 7.6940113041317926e-01 7.1700313593596272e+00 1.6039869871094492e+00 2.0656670277087708e-01 8.9446927355565062e+00 1.9529281881235798e+00 -7.9989064191663528e-01 -8.6045024343738863e+00 -2.3004475668171418e+00 -1.5180783952681776e-01 -8.8198345517991807e+00 -1.7046637457816873e+00 5.8781063569010139e-01 8.4795701499986293e+00 2.2253453911868881e+00 2.1850974111420024e-01 1.1906104413935303e+01 2.5183948291323466e+00 -6.6769541527295584e-01 -1.2050752439460632e+01 -2.1445553302715044e+00 -6.2231696360145056e-02 -2.1642486777367487e+00 -2.0799991087911796e+00 2.8499868511869703e-01 1.9808960407719536e+00 1.7694746268845618e+00 6.2623565300243933e-02 1.9242065635643519e+00 3.1013268637244309e+00 -3.0166146019448042e-01 -2.2934396562839483e+00 -3.4226319017627809e+00 -5.1617197147623937e-02 -2.0926966157505946e+00 -3.0645646036664766e+00 2.1882313435584244e-01 2.2278700979667367e+00 3.3422810757901669e+00 7.9098641952066839e-02 2.5183948291323457e+00 6.0251664311953643e+00 -2.3003367302460015e-01 -2.1009825816640975e+00 -5.6710533833740886e+00 1.2527297165992468e+00 7.6829680733141048e-01 2.8252408160531278e-01 -1.4489177947278737e+00 -1.0349904215443959e+00 -2.3975753611455008e-01 -2.5927075538498672e+00 -8.4196589451648518e-01 -1.9251586853617922e-01 2.7130142659520278e+00 1.0535082205097901e+00 3.1679653927917878e-01 2.5208005807149583e+00 6.1010870993603761e-01 1.4122567520018850e-01 -2.7065119212334645e+00 -1.0688445292718771e+00 -3.5705200172833151e-01 -5.0943071111547891e+00 -6.6769541527295573e-01 -2.3003367302460015e-01 5.3558998176997612e+00 1.1815825228284762e+00 2.7881278331898096e-01 4.0389763822244351e-01 7.1278127896547856e+00 1.9702121622082067e+00 -1.0369486127021792e+00 -7.3414449491955533e+00 -1.4003914594101485e+00 -4.6319949794848753e-01 -9.1361431648317293e+00 -1.5032130498487923e+00 1.0503525557761770e+00 8.7572459296678371e+00 1.8803341209331033e+00 6.5774062338647865e-01 8.9401569236463541e+00 1.5036147689537220e+00 -1.0843150419045293e+00 -8.6313123392114246e+00 -2.0532252756042464e+00 -7.0911018765838096e-01 -1.2050752439460632e+01 -2.1009825816640970e+00 1.1815825228284760e+00 1.2334437249730367e+01 1.7036513144322512e+00 1.3642538455666742e-01 1.6054384819952274e+00 1.7359198195285801e+00 -2.4090808248549270e-01 -1.4045078242083902e+00 -1.5962433111899426e+00 -1.0563336669874239e-01 -1.5101765031360390e+00 -2.8986460644068357e+00 3.2269900575621885e-01 1.9188339752173913e+00 3.0774404477827040e+00 1.5347202930613160e-01 1.5121188896685125e+00 2.8488569893159701e+00 -2.9797616370058766e-01 -1.6808030036974484e+00 -3.0618191578419429e+00 -2.4689159005317635e-01 -2.1445553302715044e+00 -5.6710533833740868e+00 2.7881278331898096e-01 1.7036513144322516e+00 5.5655446601855534e+00 330 331 332 1125 1126 1127 1191 1192 1193 732 733 734 333 334 335 1128 1129 1130 1194 1195 1196 735 736 737 5.7615822410508049e+00 2.3410635619733586e+00 1.4719958623888574e+00 -6.0440017584581653e+00 -2.5580905000997429e+00 -1.4240333284546192e+00 -3.6191420500911597e+00 -2.2948633430480747e+00 -1.1328190119375274e+00 3.9128296212435565e+00 2.2395418222625554e+00 1.5283759088189361e+00 3.4329452304138077e+00 2.1426632701734953e+00 1.1076562525560278e+00 -3.7344743522410662e+00 -1.9556178578950423e+00 -1.3585099421223890e+00 -2.4214401582370213e+00 -1.9661469876699023e+00 -1.2849527404207346e+00 2.7117012263192417e+00 2.0514500343033517e+00 1.0922869991714483e+00 2.3410635619733586e+00 7.1662976644879910e+00 1.9807741651581670e+00 -2.5420113200645140e+00 -7.0150987207668676e+00 -1.6822362796666295e+00 -2.2383097292940293e+00 -5.2112732627416349e+00 -1.5823334773706561e+00 2.2485798761493232e+00 4.5613604464250672e+00 1.7687264344533866e+00 2.0859104120359420e+00 4.9741662536773381e+00 1.5828649855470840e+00 -2.1906380329419770e+00 -4.3671062834454295e+00 -1.6785412252782075e+00 -1.9285622934050115e+00 -3.6883496769446991e+00 -1.7513806999624590e+00 2.2239675255469082e+00 3.5800035793082334e+00 1.3621260971193145e+00 1.4719958623888572e+00 1.9807741651581670e+00 5.2675365013457167e+00 -1.3956114487921756e+00 -1.6579683101322946e+00 -4.8345510302574244e+00 -1.2648703594485455e+00 -1.8198717620155156e+00 -2.8924233410800904e+00 1.4981972567500050e+00 1.7291119743534440e+00 3.1900413930733844e+00 1.0507003311387644e+00 1.5450854304649482e+00 2.7180768244660740e+00 -1.4539097077845298e+00 -1.5985777350826225e+00 -3.0871173358636264e+00 -1.2281629731216710e+00 -1.7066020715675982e+00 -2.1218319252410374e+00 1.3216610388692955e+00 1.5280483088214718e+00 1.7602689135570018e+00 -6.0440017584581645e+00 -2.5420113200645140e+00 -1.3956114487921758e+00 6.5094007192713779e+00 2.7449039541418245e+00 1.2596513680291876e+00 3.9901677462818301e+00 2.4878904662210548e+00 1.1393113361806997e+00 -4.3707823494104829e+00 -2.3639915976048167e+00 -1.5533733395658713e+00 -3.7820744472919916e+00 -2.5235554007219623e+00 -1.0219236588310259e+00 4.0992504558041194e+00 2.2746448096680187e+00 1.2922170713677938e+00 2.7354423978914171e+00 2.2742998748596190e+00 1.3883516138301815e+00 -3.1374027640881050e+00 -2.3521807864992232e+00 -1.1086229422187901e+00 -2.5580905000997429e+00 -7.0150987207668676e+00 -1.6579683101322942e+00 2.7449039541418245e+00 6.9760064555772674e+00 1.3712172965454266e+00 2.5040197253438174e+00 5.1000438831134423e+00 1.4158853152596935e+00 -2.4675837927930702e+00 -4.4882640802183964e+00 -1.6412528489225808e+00 -2.1521214649692206e+00 -4.9669956357737384e+00 -1.2076553724768579e+00 2.2120214809314471e+00 4.3252528953440246e+00 1.3499904918980443e+00 2.0148780378348525e+00 3.6144782822622852e+00 1.5652951750843171e+00 -2.2980274403899079e+00 -3.5454230795380162e+00 -1.1955117472557477e+00 -1.4240333284546189e+00 -1.6822362796666297e+00 -4.8345510302574235e+00 1.2596513680291879e+00 1.3712172965454266e+00 4.6180723965593522e+00 1.0866518784278578e+00 1.3432834827785536e+00 2.6351808963557835e+00 -1.3071166598601414e+00 -1.3170633002760586e+00 -2.8577465306109584e+00 -9.1792674246443995e-01 -1.2886632103642723e+00 -2.5103377728786733e+00 1.3089823109079275e+00 1.4087688542611880e+00 2.7272737669656260e+00 1.0374546886942690e+00 1.3166731185438612e+00 1.7719041595013303e+00 -1.0436635152800413e+00 -1.1519799618220687e+00 -1.5497958856350371e+00 -3.6191420500911593e+00 -2.2383097292940293e+00 -1.2648703594485453e+00 3.9901677462818301e+00 2.5040197253438174e+00 1.0866518784278578e+00 6.0491115143048360e+00 2.7622006038663787e+00 1.2230391938180925e+00 -6.3355621282139625e+00 -2.7291941672728481e+00 -1.5414037655747062e+00 -2.4683484836550771e+00 -2.2262581688213507e+00 -8.7975532742190810e-01 2.7368314291514269e+00 2.0013826445976424e+00 1.2145199483919593e+00 3.6438238583524907e+00 2.3120063192940572e+00 1.2492600059184085e+00 -3.9968818861303870e+00 -2.3858472277136666e+00 -1.0874415741111578e+00 -2.2948633430480743e+00 -5.2112732627416349e+00 -1.8198717620155156e+00 2.4878904662210548e+00 5.1000438831134414e+00 1.3432834827785536e+00 2.7622006038663787e+00 8.0661837279707864e+00 1.7425290296263118e+00 -2.7629474243564713e+00 -7.2934651614144430e+00 -1.9021363409129739e+00 -2.1104788607549505e+00 -4.2582272238066032e+00 -1.2827156802825408e+00 2.3063033129140189e+00 3.5421020171500128e+00 1.6182678960103449e+00 2.2416370976065467e+00 5.2420355273813684e+00 1.7418397165332096e+00 -2.6297418524485030e+00 -5.1873995076529251e+00 -1.4411963417373883e+00 -1.1328190119375274e+00 -1.5823334773706563e+00 -2.8924233410800908e+00 1.1393113361806997e+00 1.4158853152596935e+00 2.6351808963557835e+00 1.2230391938180925e+00 1.7425290296263118e+00 4.8865253003857285e+00 -1.5343861435112121e+00 -1.8706582614544243e+00 -5.1082776562260017e+00 -9.0547469197231978e-01 -1.3925488917406432e+00 -1.5692357766593064e+00 1.1474601887131988e+00 1.3304614277551081e+00 1.7792781665826534e+00 1.2158212885214408e+00 1.7510593491812345e+00 2.9364915855590294e+00 -1.1529521598123729e+00 -1.3943944912566242e+00 -2.6675391749177968e+00 3.9128296212435560e+00 2.2485798761493232e+00 1.4981972567500050e+00 -4.3707823494104838e+00 -2.4675837927930702e+00 -1.3071166598601414e+00 -6.3355621282139625e+00 -2.7629474243564713e+00 -1.5343861435112121e+00 6.8197309997224140e+00 2.6395846501977300e+00 1.9257134754447747e+00 2.6804164453517241e+00 2.3916721668355931e+00 1.0982381073626326e+00 -3.0900342947320270e+00 -2.0773413815939783e+00 -1.5073508726406710e+00 -3.9340371170773309e+00 -2.4153061230735502e+00 -1.6307812480343671e+00 4.3174388231161087e+00 2.4433420286344223e+00 1.4574860844889790e+00 2.2395418222625554e+00 4.5613604464250672e+00 1.7291119743534438e+00 -2.3639915976048167e+00 -4.4882640802183955e+00 -1.3170633002760586e+00 -2.7291941672728490e+00 -7.2934651614144430e+00 -1.8706582614544243e+00 2.6395846501977305e+00 6.7990695891659962e+00 1.9150198608328954e+00 1.9339363656018818e+00 3.5454518480985242e+00 1.2589188227597812e+00 -2.0450138916600911e+00 -3.0524922873487732e+00 -1.4841007418187919e+00 -2.0687400559259048e+00 -4.6171363365940277e+00 -1.7606313419927233e+00 2.3938768744014931e+00 4.5454759818860531e+00 1.5294029875958770e+00 1.5283759088189359e+00 1.7687264344533866e+00 3.1900413930733844e+00 -1.5533733395658709e+00 -1.6412528489225808e+00 -2.8577465306109584e+00 -1.5414037655747057e+00 -1.9021363409129743e+00 -5.1082776562260017e+00 1.9257134754447742e+00 1.9150198608328957e+00 5.5654768450855183e+00 1.1984729232250571e+00 1.6914886336941291e+00 1.7225167233557124e+00 -1.5140479398974529e+00 -1.5142411909908804e+00 -2.1097602156268063e+00 -1.4836845786896564e+00 -1.8624553446333849e+00 -3.3000710094035561e+00 1.4399473162389183e+00 1.5448507964794087e+00 2.8978204503527065e+00 3.4329452304138082e+00 2.0859104120359415e+00 1.0507003311387644e+00 -3.7820744472919920e+00 -2.1521214649692206e+00 -9.1792674246443984e-01 -2.4683484836550771e+00 -2.1104788607549509e+00 -9.0547469197231967e-01 2.6804164453517236e+00 1.9339363656018818e+00 1.1984729232250575e+00 5.6410715941575180e+00 2.4218287748289171e+00 9.8049144096838492e-01 -5.8143472820388276e+00 -2.4607564280715608e+00 -1.2577939279009849e+00 -3.4351354127347622e+00 -2.0643407217707508e+00 -1.1924380881863688e+00 3.7454723557976060e+00 2.3460219230997423e+00 1.0439687551919064e+00 2.1426632701734958e+00 4.9741662536773381e+00 1.5450854304649482e+00 -2.5235554007219623e+00 -4.9669956357737384e+00 -1.2886632103642723e+00 -2.2262581688213503e+00 -4.2582272238066032e+00 -1.3925488917406430e+00 2.3916721668355931e+00 3.5454518480985242e+00 1.6914886336941291e+00 2.4218287748289171e+00 7.7091431184423325e+00 1.4816871711341497e+00 -2.3637821041343003e+00 -6.8586273733104912e+00 -1.5864039648971247e+00 -2.1579292021444001e+00 -5.1082775797489512e+00 -1.7987554874041112e+00 2.3153606639840087e+00 4.9633665924215897e+00 1.3481103191129242e+00 1.1076562525560278e+00 1.5828649855470840e+00 2.7180768244660736e+00 -1.0219236588310259e+00 -1.2076553724768577e+00 -2.5103377728786733e+00 -8.7975532742190810e-01 -1.2827156802825408e+00 -1.5692357766593064e+00 1.0982381073626326e+00 1.2589188227597812e+00 1.7225167233557124e+00 9.8049144096838492e-01 1.4816871711341497e+00 4.6410779048185411e+00 -1.2787154649621721e+00 -1.6774972685376066e+00 -4.7509908681086817e+00 -9.8726847329910727e-01 -1.4412171323849274e+00 -2.8075764938454761e+00 9.8127712362716812e-01 1.2856144742409183e+00 2.5564694588518106e+00 -3.7344743522410662e+00 -2.1906380329419770e+00 -1.4539097077845300e+00 4.0992504558041194e+00 2.2120214809314476e+00 1.3089823109079275e+00 2.7368314291514277e+00 2.3063033129140189e+00 1.1474601887131988e+00 -3.0900342947320265e+00 -2.0450138916600911e+00 -1.5140479398974527e+00 -5.8143472820388258e+00 -2.3637821041343008e+00 -1.2787154649621719e+00 6.2125103782267654e+00 2.3097144450715366e+00 1.6298040250304144e+00 3.7300238425725381e+00 2.0695806716250429e+00 1.4154445035286152e+00 -4.1397601767429322e+00 -2.2981858818056757e+00 -1.2550179155360011e+00 -1.9556178578950423e+00 -4.3671062834454295e+00 -1.5985777350826229e+00 2.2746448096680187e+00 4.3252528953440246e+00 1.4087688542611880e+00 2.0013826445976424e+00 3.5421020171500128e+00 1.3304614277551081e+00 -2.0773413815939783e+00 -3.0524922873487732e+00 -1.5142411909908802e+00 -2.4607564280715613e+00 -6.8586273733104930e+00 -1.6774972685376073e+00 2.3097144450715361e+00 6.3178571778543517e+00 1.6627760567415548e+00 2.1256972565354224e+00 4.4418325944276695e+00 1.6910065334678335e+00 -2.2177234883120382e+00 -4.3488187406713621e+00 -1.3026966776145745e+00 -1.3585099421223890e+00 -1.6785412252782075e+00 -3.0871173358636255e+00 1.2922170713677936e+00 1.3499904918980445e+00 2.7272737669656260e+00 1.2145199483919593e+00 1.6182678960103449e+00 1.7792781665826534e+00 -1.5073508726406710e+00 -1.4841007418187919e+00 -2.1097602156268063e+00 -1.2577939279009847e+00 -1.5864039648971242e+00 -4.7509908681086808e+00 1.6298040250304144e+00 1.6627760567415546e+00 5.1262530483291471e+00 1.4061620511818695e+00 1.6377958299948652e+00 3.1158851575896347e+00 -1.4190483533079929e+00 -1.5197843426506847e+00 -2.8008217198679475e+00 -2.4214401582370213e+00 -1.9285622934050115e+00 -1.2281629731216710e+00 2.7354423978914175e+00 2.0148780378348525e+00 1.0374546886942690e+00 3.6438238583524907e+00 2.2416370976065472e+00 1.2158212885214408e+00 -3.9340371170773309e+00 -2.0687400559259048e+00 -1.4836845786896562e+00 -3.4351354127347622e+00 -2.1579292021444001e+00 -9.8726847329910727e-01 3.7300238425725381e+00 2.1256972565354220e+00 1.4061620511818695e+00 5.7498871602283907e+00 2.3423217934915028e+00 1.5123501868454170e+00 -6.0685645709957239e+00 -2.5693026339930078e+00 -1.4726721901325610e+00 -1.9661469876699023e+00 -3.6883496769446982e+00 -1.7066020715675982e+00 2.2742998748596195e+00 3.6144782822622856e+00 1.3166731185438616e+00 2.3120063192940572e+00 5.2420355273813684e+00 1.7510593491812347e+00 -2.4153061230735506e+00 -4.6171363365940277e+00 -1.8624553446333851e+00 -2.0643407217707508e+00 -5.1082775797489512e+00 -1.4412171323849277e+00 2.0695806716250429e+00 4.4418325944276695e+00 1.6377958299948652e+00 2.3423217934915028e+00 7.2873759021441629e+00 2.0884823009180806e+00 -2.5524148267560189e+00 -7.1719587129278093e+00 -1.7837360500521302e+00 -1.2849527404207346e+00 -1.7513806999624590e+00 -2.1218319252410374e+00 1.3883516138301815e+00 1.5652951750843171e+00 1.7719041595013303e+00 1.2492600059184085e+00 1.7418397165332096e+00 2.9364915855590299e+00 -1.6307812480343671e+00 -1.7606313419927233e+00 -3.3000710094035557e+00 -1.1924380881863688e+00 -1.7987554874041112e+00 -2.8075764938454757e+00 1.4154445035286152e+00 1.6910065334678335e+00 3.1158851575896347e+00 1.5123501868454166e+00 2.0884823009180802e+00 5.4022370595010960e+00 -1.4572342334811508e+00 -1.7758561966441466e+00 -4.9970385336610219e+00 2.7117012263192417e+00 2.2239675255469082e+00 1.3216610388692955e+00 -3.1374027640881050e+00 -2.2980274403899079e+00 -1.0436635152800413e+00 -3.9968818861303861e+00 -2.6297418524485030e+00 -1.1529521598123729e+00 4.3174388231161087e+00 2.3938768744014931e+00 1.4399473162389183e+00 3.7454723557976060e+00 2.3153606639840083e+00 9.8127712362716824e-01 -4.1397601767429322e+00 -2.2177234883120382e+00 -1.4190483533079929e+00 -6.0685645709957239e+00 -2.5524148267560189e+00 -1.4572342334811510e+00 6.5679969927241908e+00 2.7647025439740571e+00 1.3300127831461759e+00 2.0514500343033517e+00 3.5800035793082330e+00 1.5280483088214716e+00 -2.3521807864992237e+00 -3.5454230795380162e+00 -1.1519799618220685e+00 -2.3858472277136666e+00 -5.1873995076529260e+00 -1.3943944912566240e+00 2.4433420286344223e+00 4.5454759818860540e+00 1.5448507964794087e+00 2.3460219230997423e+00 4.9633665924215897e+00 1.2856144742409181e+00 -2.2981858818056757e+00 -4.3488187406713621e+00 -1.5197843426506845e+00 -2.5693026339930070e+00 -7.1719587129278093e+00 -1.7758561966441460e+00 2.7647025439740567e+00 7.1647538871742364e+00 1.4835014128317243e+00 1.0922869991714483e+00 1.3621260971193148e+00 1.7602689135570018e+00 -1.1086229422187901e+00 -1.1955117472557479e+00 -1.5497958856350371e+00 -1.0874415741111578e+00 -1.4411963417373883e+00 -2.6675391749177968e+00 1.4574860844889794e+00 1.5294029875958772e+00 2.8978204503527065e+00 1.0439687551919064e+00 1.3481103191129242e+00 2.5564694588518106e+00 -1.2550179155360011e+00 -1.3026966776145745e+00 -2.8008217198679475e+00 -1.4726721901325612e+00 -1.7837360500521300e+00 -4.9970385336610210e+00 1.3300127831461761e+00 1.4835014128317243e+00 4.8006364913202830e+00 1125 1126 1127 1152 1153 1154 1239 1240 1241 1191 1192 1193 1128 1129 1130 1155 1156 1157 1242 1243 1244 1194 1195 1196 5.5546105383872177e+00 2.2281289197284271e+00 1.4093480775628051e+00 -5.8347085237150855e+00 -2.4468188685333963e+00 -1.3689727837403776e+00 -3.4056333274055763e+00 -2.1755276655938562e+00 -1.0621969469404353e+00 3.7053978991758050e+00 2.1246212048899329e+00 1.4670448776679346e+00 3.3057867454434242e+00 2.0378805025252591e+00 1.0564721786189673e+00 -3.6143836566786272e+00 -1.8584664411214000e+00 -1.3068085736709110e+00 -2.2896141099276064e+00 -1.8582613046933498e+00 -1.2274819951712979e+00 2.5785444347204489e+00 1.9484436527983828e+00 1.0325951656733148e+00 2.2281289197284271e+00 6.9274104638256935e+00 1.9114990268832115e+00 -2.4328363561051844e+00 -6.7667064604531086e+00 -1.6149725427319974e+00 -2.1237865395136062e+00 -4.9678341145229075e+00 -1.5025848897663803e+00 2.1384811302553528e+00 4.3110728900513156e+00 1.6959357758383442e+00 1.9900164042000970e+00 4.8152345618269035e+00 1.5281114236347308e+00 -2.0967095394050834e+00 -4.2098767396889736e+00 -1.6178996834842510e+00 -1.8289814513453113e+00 -3.5212327183827989e+00 -1.6897009474999851e+00 2.1256874321853116e+00 3.4119321173438757e+00 1.2896118371263277e+00 1.4093480775628051e+00 1.9114990268832115e+00 5.1208675743756817e+00 -1.3318486313059925e+00 -1.5785925564264036e+00 -4.6771011827771920e+00 -1.1992560862825179e+00 -1.7459034100342166e+00 -2.7318958238955062e+00 1.4374702699061221e+00 1.6533329556654213e+00 3.0406982887280525e+00 9.9213662443720119e-01 1.4730997344547681e+00 2.6371463113962723e+00 -1.4039069992966344e+00 -1.5346080907781103e+00 -3.0165698324144952e+00 -1.1716436561666468e+00 -1.6387197122666941e+00 -2.0434530702535172e+00 1.2677004011456661e+00 1.4598920525020229e+00 1.6703077348407054e+00 -5.8347085237150855e+00 -2.4328363561051836e+00 -1.3318486313059927e+00 6.3120524235873754e+00 2.6357155080630283e+00 1.1972946391788519e+00 3.7787371993519971e+00 2.3783635372606309e+00 1.0699612215933161e+00 -4.1729655055340675e+00 -2.2533564801513624e+00 -1.4955563019086944e+00 -3.6578501869578646e+00 -2.4263877107704399e+00 -9.6538513356025601e-01 3.9837557964369168e+00 2.1810684906757234e+00 1.2360719432442764e+00 2.6042302303116478e+00 2.1727084700455119e+00 1.3357763452017444e+00 -3.0132514334809248e+00 -2.2552754590179078e+00 -1.0463140824432469e+00 -2.4468188685333963e+00 -6.7667064604531078e+00 -1.5785925564264034e+00 2.6357155080630283e+00 6.7267748241277570e+00 1.2953243254948661e+00 2.3874304870006138e+00 4.8518819872956822e+00 1.3310918187282956e+00 -2.3515632928141019e+00 -4.2368782410534491e+00 -1.5653758079306046e+00 -2.0561640834890045e+00 -4.8043783653077856e+00 -1.1396669832839963e+00 2.1144412562858501e+00 4.1623522102965307e+00 1.2789365706489093e+00 1.9128684317601250e+00 3.4419656031534704e+00 1.4973568060276241e+00 -2.1959094382731190e+00 -3.3750115580590960e+00 -1.1190741732586917e+00 -1.3689727837403773e+00 -1.6149725427319976e+00 -4.6771011827771920e+00 1.1972946391788524e+00 1.2953243254948663e+00 4.4647754801480337e+00 1.0205708131738300e+00 1.2668835259436990e+00 2.4772417379968932e+00 -1.2450553151441586e+00 -1.2427952941662357e+00 -2.7049118607184841e+00 -8.6403613700752913e-01 -1.2203542636722005e+00 -2.4306858741799879e+00 1.2632264181096502e+00 1.3512961458690858e+00 2.6476530925569359e+00 9.8390032864677035e-01 1.2487638878929839e+00 1.6866284580338253e+00 -9.8692796321703913e-01 -1.0841457846302009e+00 -1.4635998510600254e+00 -3.4056333274055763e+00 -2.1237865395136066e+00 -1.1992560862825179e+00 3.7787371993519976e+00 2.3874304870006142e+00 1.0205708131738300e+00 5.5847767858066568e+00 2.6094219269209464e+00 1.1322563419820739e+00 -5.8741564169910241e+00 -2.5753853291668509e+00 -1.4570994147148482e+00 -2.3332743317552884e+00 -2.1189040777390700e+00 -8.2126841427005526e-01 2.6031135282736932e+00 1.8988619172561783e+00 1.1550753297128944e+00 3.3973252527517546e+00 2.1862474428492633e+00 1.1824540407714192e+00 -3.7508886900322165e+00 -2.2638858276074743e+00 -1.0127326103727974e+00 -2.1755276655938562e+00 -4.9678341145229075e+00 -1.7459034100342166e+00 2.3783635372606309e+00 4.8518819872956822e+00 1.2668835259436988e+00 2.6094219269209469e+00 7.5639298713835572e+00 1.6341936423051893e+00 -2.6236154935231504e+00 -6.7794255860793537e+00 -1.8114576163505125e+00 -2.0068964462459427e+00 -4.0939971697072028e+00 -1.2127852223434981e+00 2.2111093295992403e+00 3.3720638666194311e+00 1.5538037200433512e+00 2.1237450984813013e+00 4.9564646969597677e+00 1.6684139758377843e+00 -2.5166002868991746e+00 -4.9030835519489697e+00 -1.3531486154017978e+00 -1.0621969469404353e+00 -1.5025848897663803e+00 -2.7318958238955062e+00 1.0699612215933161e+00 1.3310918187282956e+00 2.4772417379968932e+00 1.1322563419820739e+00 1.6341936423051895e+00 4.4906836958966583e+00 -1.4443501636415466e+00 -1.7631708988147616e+00 -4.7124917374843642e+00 -8.4355388892458549e-01 -1.3151553832560252e+00 -1.4819133089844287e+00 1.0867767062192855e+00 1.2596730566802807e+00 1.6888167414901241e+00 1.1431008813631531e+00 1.6636690984073823e+00 2.7421732019259615e+00 -1.0819941516512634e+00 -1.3077164442839804e+00 -2.4726145069453400e+00 3.7053978991758054e+00 2.1384811302553528e+00 1.4374702699061221e+00 -4.1729655055340675e+00 -2.3515632928141019e+00 -1.2450553151441586e+00 -5.8741564169910241e+00 -2.6236154935231504e+00 -1.4443501636415466e+00 6.3776730726292872e+00 2.4915431233411027e+00 1.8494504270950249e+00 2.5479260807538986e+00 2.2913797739721224e+00 1.0421478342049630e+00 -2.9705696256105907e+00 -1.9751888058889140e+00 -1.4564700114154163e+00 -3.6961919185061349e+00 -2.2983820158392212e+00 -1.5706448549933638e+00 4.0828864140828305e+00 2.3273455804968082e+00 1.3874518139883760e+00 2.1246212048899329e+00 4.3110728900513156e+00 1.6533329556654213e+00 -2.2533564801513619e+00 -4.2368782410534491e+00 -1.2427952941662357e+00 -2.5753853291668500e+00 -6.7794255860793529e+00 -1.7631708988147619e+00 2.4915431233411027e+00 6.2937940824515426e+00 1.8153399412791011e+00 1.8337903885877511e+00 3.3683443693750861e+00 1.1936541526811644e+00 -1.9465499390451866e+00 -2.8845672299287397e+00 -1.4167367742667900e+00 -1.9500474561867427e+00 -4.3296409670011125e+00 -1.6828126241730579e+00 2.2753844877313596e+00 4.2573006821847121e+00 1.4431885417951591e+00 1.4670448776679346e+00 1.6959357758383442e+00 3.0406982887280525e+00 -1.4955563019086942e+00 -1.5653758079306046e+00 -2.7049118607184841e+00 -1.4570994147148482e+00 -1.8114576163505125e+00 -4.7124917374843633e+00 1.8494504270950245e+00 1.8153399412791016e+00 5.1900051924738655e+00 1.1418268121479114e+00 1.6258278346040651e+00 1.6356128887491457e+00 -1.4654371631657765e+00 -1.4464291008393497e+00 -2.0338674137725583e+00 -1.4189071244633282e+00 -1.7835229777196280e+00 -3.1213902365000159e+00 1.3786778873417787e+00 1.4696819511185832e+00 2.7063448785243587e+00 3.3057867454434242e+00 1.9900164042000972e+00 9.9213662443720130e-01 -3.6578501869578646e+00 -2.0561640834890040e+00 -8.6403613700752913e-01 -2.3332743317552884e+00 -2.0068964462459427e+00 -8.4355388892458549e-01 2.5479260807538986e+00 1.8337903885877511e+00 1.1418268121479114e+00 5.5078090834152329e+00 2.3219563053559056e+00 9.2576709942339097e-01 -5.6806960343498378e+00 -2.3758539330175834e+00 -1.2013361315832636e+00 -3.2754988676535550e+00 -1.9569135585813338e+00 -1.1336917615808184e+00 3.5857975111039919e+00 2.2500649231901102e+00 9.8288738308769374e-01 2.0378805025252591e+00 4.8152345618269026e+00 1.4730997344547681e+00 -2.4263877107704399e+00 -4.8043783653077847e+00 -1.2203542636722005e+00 -2.1189040777390700e+00 -4.0939971697072028e+00 -1.3151553832560252e+00 2.2913797739721224e+00 3.3683443693750861e+00 1.6258278346040649e+00 2.3219563053559056e+00 7.5449836905345951e+00 1.4134041577435772e+00 -2.2613075833486027e+00 -6.6835488209946288e+00 -1.5138645407722682e+00 -2.0544406004737832e+00 -4.9099215371743385e+00 -1.7323448810935460e+00 2.2098233904786126e+00 4.7632832714473716e+00 1.2693873419916311e+00 1.0564721786189673e+00 1.5281114236347306e+00 2.6371463113962719e+00 -9.6538513356025613e-01 -1.1396669832839965e+00 -2.4306858741799879e+00 -8.2126841427005504e-01 -1.2127852223434978e+00 -1.4819133089844287e+00 1.0421478342049630e+00 1.1936541526811644e+00 1.6356128887491457e+00 9.2576709942339097e-01 1.4134041577435772e+00 4.5535447018376169e+00 -1.2292069695757428e+00 -1.6253138528244526e+00 -4.6590591590458157e+00 -9.3211660224876647e-01 -1.3736222683459960e+00 -2.6952519699568565e+00 9.2359000740750063e-01 1.2162185927384708e+00 2.4406064101840537e+00 -3.6143836566786272e+00 -2.0967095394050830e+00 -1.4039069992966344e+00 3.9837557964369168e+00 2.1144412562858501e+00 1.2632264181096502e+00 2.6031135282736937e+00 2.2111093295992403e+00 1.0867767062192855e+00 -2.9705696256105907e+00 -1.9465499390451866e+00 -1.4654371631657763e+00 -5.6806960343498369e+00 -2.2613075833486023e+00 -1.2292069695757424e+00 6.0961524925138431e+00 2.2157758588779117e+00 1.5842271378490853e+00 3.5748454323739738e+00 1.9658456903241079e+00 1.3620985065186646e+00 -3.9922179329593774e+00 -2.2026050732882365e+00 -1.1977776366585324e+00 -1.8584664411214002e+00 -4.2098767396889736e+00 -1.5346080907781103e+00 2.1810684906757229e+00 4.1623522102965307e+00 1.3512961458690860e+00 1.8988619172561783e+00 3.3720638666194307e+00 1.2596730566802807e+00 -1.9751888058889140e+00 -2.8845672299287397e+00 -1.4464291008393495e+00 -2.3758539330175830e+00 -6.6835488209946288e+00 -1.6253138528244528e+00 2.2157758588779117e+00 6.1519269723856835e+00 1.5991970176842449e+00 2.0287827484875969e+00 4.2438313175435844e+00 1.6263214998210929e+00 -2.1149798352695144e+00 -4.1521815762328877e+00 -1.2301366756127927e+00 -1.3068085736709110e+00 -1.6178996834842510e+00 -3.0165698324144952e+00 1.2360719432442764e+00 1.2789365706489091e+00 2.6476530925569364e+00 1.1550753297128944e+00 1.5538037200433512e+00 1.6888167414901241e+00 -1.4564700114154161e+00 -1.4167367742667900e+00 -2.0338674137725583e+00 -1.2013361315832636e+00 -1.5138645407722680e+00 -4.6590591590458148e+00 1.5842271378490853e+00 1.5991970176842454e+00 5.0491946871734870e+00 1.3534322408387351e+00 1.5685296820898267e+00 3.0110504608965019e+00 -1.3641919349754019e+00 -1.4519659919430226e+00 -2.6872185768841810e+00 -2.2896141099276059e+00 -1.8289814513453115e+00 -1.1716436561666468e+00 2.6042302303116478e+00 1.9128684317601254e+00 9.8390032864677035e-01 3.3973252527517546e+00 2.1237450984813009e+00 1.1431008813631531e+00 -3.6961919185061349e+00 -1.9500474561867427e+00 -1.4189071244633285e+00 -3.2754988676535555e+00 -2.0544406004737832e+00 -9.3211660224876647e-01 3.5748454323739738e+00 2.0287827484875964e+00 1.3534322408387349e+00 5.4085563956601099e+00 2.2115256763760862e+00 1.4409141885898251e+00 -5.7236524150101928e+00 -2.4434524470992716e+00 -1.3986802565597429e+00 -1.8582613046933498e+00 -3.5212327183827989e+00 -1.6387197122666941e+00 2.1727084700455119e+00 3.4419656031534704e+00 1.2487638878929839e+00 2.1862474428492638e+00 4.9564646969597685e+00 1.6636690984073823e+00 -2.2983820158392212e+00 -4.3296409670011142e+00 -1.7835229777196280e+00 -1.9569135585813335e+00 -4.9099215371743385e+00 -1.3736222683459962e+00 1.9658456903241079e+00 4.2438313175435844e+00 1.5685296820898267e+00 2.2115256763760862e+00 6.8938356177705602e+00 2.0042547929693355e+00 -2.4227704004810682e+00 -6.7753020128691315e+00 -1.6893525030272107e+00 -1.2274819951712981e+00 -1.6897009474999851e+00 -2.0434530702535172e+00 1.3357763452017444e+00 1.4973568060276241e+00 1.6866284580338253e+00 1.1824540407714192e+00 1.6684139758377838e+00 2.7421732019259615e+00 -1.5706448549933636e+00 -1.6828126241730579e+00 -3.1213902365000159e+00 -1.1336917615808184e+00 -1.7323448810935460e+00 -2.6952519699568569e+00 1.3620985065186646e+00 1.6263214998210929e+00 3.0110504608965019e+00 1.4409141885898253e+00 2.0042547929693351e+00 5.1248795479809983e+00 -1.3894244693361759e+00 -1.6914886218892471e+00 -4.7046363921268988e+00 2.5785444347204489e+00 2.1256874321853116e+00 1.2677004011456663e+00 -3.0132514334809253e+00 -2.1959094382731190e+00 -9.8692796321703913e-01 -3.7508886900322165e+00 -2.5166002868991741e+00 -1.0819941516512634e+00 4.0828864140828305e+00 2.2753844877313596e+00 1.3786778873417787e+00 3.5857975111039924e+00 2.2098233904786126e+00 9.2359000740750063e-01 -3.9922179329593774e+00 -2.1149798352695139e+00 -1.3641919349754021e+00 -5.7236524150101928e+00 -2.4227704004810677e+00 -1.3894244693361759e+00 6.2327821115754425e+00 2.6393646505275914e+00 1.2525702232849363e+00 1.9484436527983828e+00 3.4119321173438757e+00 1.4598920525020229e+00 -2.2552754590179078e+00 -3.3750115580590960e+00 -1.0841457846302009e+00 -2.2638858276074743e+00 -4.9030835519489697e+00 -1.3077164442839804e+00 2.3273455804968077e+00 4.2573006821847121e+00 1.4696819511185830e+00 2.2500649231901102e+00 4.7632832714473725e+00 1.2162185927384705e+00 -2.2026050732882365e+00 -4.1521815762328877e+00 -1.4519659919430226e+00 -2.4434524470992716e+00 -6.7753020128691315e+00 -1.6914886218892473e+00 2.6393646505275914e+00 6.7730626281341246e+00 1.3895242463873747e+00 1.0325951656733148e+00 1.2896118371263277e+00 1.6703077348407054e+00 -1.0463140824432469e+00 -1.1190741732586917e+00 -1.4635998510600257e+00 -1.0127326103727972e+00 -1.3531486154017975e+00 -2.4726145069453400e+00 1.3874518139883760e+00 1.4431885417951593e+00 2.7063448785243587e+00 9.8288738308769374e-01 1.2693873419916308e+00 2.4406064101840537e+00 -1.1977776366585327e+00 -1.2301366756127927e+00 -2.6872185768841814e+00 -1.3986802565597429e+00 -1.6893525030272105e+00 -4.7046363921268988e+00 1.2525702232849363e+00 1.3895242463873752e+00 4.5108103034673270e+00 732 733 734 1191 1192 1193 1203 1204 1205 744 745 746 735 736 737 1194 1195 1196 1206 1207 1208 747 748 749 5.7852582369546823e+00 2.1678903490824957e+00 1.3210460490747507e+00 -6.0175846979183465e+00 -2.5012049260534353e+00 -1.3738767012735245e+00 -3.2890109815809176e+00 -2.0586354757706857e+00 -1.0252461768815482e+00 3.5509478204851663e+00 2.1872755762449123e+00 1.3987794933788238e+00 3.1896551826560051e+00 1.9576116302963966e+00 1.0236989212892524e+00 -3.4643901948963021e+00 -1.9203269734210109e+00 -1.2467047271445755e+00 -1.9987029351066876e+00 -1.7838574256601503e+00 -1.1216157348497573e+00 2.2438275694064007e+00 1.9512472452814777e+00 1.0239188764065781e+00 2.1678903490824957e+00 9.2844012285806929e+00 2.7676831973804381e+00 -2.4846123027690723e+00 -9.2039455502781991e+00 -2.4496855019067896e+00 -2.0169320708031422e+00 -6.8238319989708769e+00 -2.2266746074695503e+00 2.1877903124691693e+00 6.1664549386764893e+00 2.4643642135712662e+00 1.9074668008704905e+00 6.5671696267364386e+00 2.2451157534268433e+00 -2.1888322653845886e+00 -5.9486589195038961e+00 -2.3654642994324093e+00 -1.7467685248558522e+00 -4.9766571231725472e+00 -2.3865860008512754e+00 2.1739977013904985e+00 4.9350677979318984e+00 1.9512472452814769e+00 1.3210460490747509e+00 2.7676831973804394e+00 6.4381098123902163e+00 -1.3519103338895697e+00 -2.4255238985493572e+00 -5.9570521599297894e+00 -1.1283095391645492e+00 -2.5094241629548630e+00 -3.5907876623169450e+00 1.3780632471381669e+00 2.4300969414056031e+00 3.9060821401814794e+00 9.7804887128104756e-01 2.2036474916521329e+00 3.4335885143724942e+00 -1.3836563193159186e+00 -2.2985491503505453e+00 -3.8237974833937125e+00 -1.0777501341421625e+00 -2.3419281199739097e+00 -2.6499707307101441e+00 1.2644681590182338e+00 2.1739977013904990e+00 2.2438275694064012e+00 -6.0175846979183465e+00 -2.4846123027690723e+00 -1.3519103338895697e+00 6.4570448065528838e+00 2.8160182589649390e+00 1.3086028017606075e+00 3.6056786170450916e+00 2.3834002016288531e+00 1.1043799300971107e+00 -3.9848025092322725e+00 -2.4504869377984924e+00 -1.4943194953224557e+00 -3.4919847021924695e+00 -2.4480680061421909e+00 -1.0574285240598493e+00 3.8155843272430716e+00 2.3556375959390916e+00 1.2977890191231598e+00 2.2660348892121882e+00 2.2146971910281499e+00 1.3145023371407540e+00 -2.6499707307101450e+00 -2.3865860008512771e+00 -1.1216157348497577e+00 -2.5012049260534348e+00 -9.2039455502781973e+00 -2.4255238985493572e+00 2.8160182589649390e+00 9.2341847399269472e+00 2.1054751690145830e+00 2.3932166760527598e+00 6.7943656130943326e+00 2.0588798594572664e+00 -2.5257308587114555e+00 -6.1646072814078412e+00 -2.3345214783059540e+00 -2.0664888633331149e+00 -6.6321842873187693e+00 -1.8558584455971703e+00 2.3109882561351798e+00 5.9752856438335913e+00 2.0207090286126328e+00 1.9151295769190384e+00 4.9735582453224874e+00 2.2146971910281477e+00 -2.3419281199739093e+00 -4.9766571231725480e+00 -1.7838574256601496e+00 -1.3738767012735245e+00 -2.4496855019067896e+00 -5.9570521599297894e+00 1.3086028017606077e+00 2.1054751690145830e+00 5.6851550785853355e+00 1.0761663845266185e+00 1.9999416161185473e+00 3.2885474240915493e+00 -1.3086421336553851e+00 -1.9769087827718279e+00 -3.5461247580239581e+00 -9.1458891126336372e-01 -1.9179870517415407e+00 -3.1670655551972593e+00 1.3032904782253729e+00 2.0708034992238424e+00 3.4292080163686212e+00 9.8679821582183758e-01 1.9151295769190393e+00 2.2660348892121882e+00 -1.0777501341421625e+00 -1.7467685248558533e+00 -1.9987029351066881e+00 -3.2890109815809176e+00 -2.0169320708031417e+00 -1.1283095391645497e+00 3.6056786170450916e+00 2.3932166760527598e+00 1.0761663845266185e+00 5.8805290714741005e+00 2.4552195465302873e+00 1.1194215047249132e+00 -6.1404382000123627e+00 -2.6125330223076002e+00 -1.4167791225911919e+00 -2.0284289809692821e+00 -1.9741822163913083e+00 -8.4119448917398798e-01 2.2739107122687652e+00 1.9230058349312880e+00 1.1115615084626354e+00 3.2885474240915502e+00 2.0588798594572677e+00 1.1043799300971102e+00 -3.5907876623169468e+00 -2.2266746074695516e+00 -1.0252461768815482e+00 -2.0586354757706857e+00 -6.8238319989708778e+00 -2.5094241629548630e+00 2.3834002016288531e+00 6.7943656130943326e+00 1.9999416161185475e+00 2.4552195465302873e+00 1.0164164949434193e+01 2.4552195465302864e+00 -2.6319926255503261e+00 -9.4116879688437880e+00 -2.6319926255503270e+00 -1.8893885066631262e+00 -5.6134097958715259e+00 -1.8893885066631271e+00 2.2508794066613156e+00 4.9198655870342103e+00 2.2508794066613165e+00 1.9999416161185470e+00 6.7943656130943353e+00 2.3834002016288527e+00 -2.5094241629548626e+00 -6.8238319989708787e+00 -2.0586354757706853e+00 -1.0252461768815482e+00 -2.2266746074695503e+00 -3.5907876623169450e+00 1.1043799300971107e+00 2.0588798594572664e+00 3.2885474240915493e+00 1.1194215047249132e+00 2.4552195465302868e+00 5.8805290714741005e+00 -1.4167791225911910e+00 -2.6125330223076002e+00 -6.1404382000123627e+00 -8.4119448917398776e-01 -1.9741822163913079e+00 -2.0284289809692826e+00 1.1115615084626349e+00 1.9230058349312875e+00 2.2739107122687656e+00 1.0761663845266185e+00 2.3932166760527602e+00 3.6056786170450916e+00 -1.1283095391645495e+00 -2.0169320708031422e+00 -3.2890109815809185e+00 3.5509478204851663e+00 2.1877903124691698e+00 1.3780632471381669e+00 -3.9848025092322725e+00 -2.5257308587114551e+00 -1.3086421336553853e+00 -6.1404382000123627e+00 -2.6319926255503252e+00 -1.4167791225911910e+00 6.6115985317608450e+00 2.6993055604349157e+00 1.7942873956023300e+00 2.2220862919830813e+00 2.3031012899181520e+00 1.0875963107489888e+00 -2.6193493171419804e+00 -2.1623164138257671e+00 -1.4389856952992781e+00 -3.5461247580239590e+00 -2.3345214783059540e+00 -1.4943194953224546e+00 3.9060821401814803e+00 2.4643642135712662e+00 1.3987794933788236e+00 2.1872755762449123e+00 6.1664549386764893e+00 2.4300969414056035e+00 -2.4504869377984919e+00 -6.1646072814078421e+00 -1.9769087827718279e+00 -2.6125330223076006e+00 -9.4116879688437880e+00 -2.6125330223076002e+00 2.6993055604349161e+00 8.8858402982256361e+00 2.6993055604349165e+00 1.8636583754505489e+00 4.9139933244741467e+00 1.8636583754505496e+00 -2.1404077106580610e+00 -4.3918409683932875e+00 -2.1404077106580619e+00 -1.9769087827718279e+00 -6.1646072814078448e+00 -2.4504869377984919e+00 2.4300969414056035e+00 6.1664549386764911e+00 2.1872755762449123e+00 1.3987794933788238e+00 2.4643642135712662e+00 3.9060821401814794e+00 -1.4943194953224559e+00 -2.3345214783059540e+00 -3.5461247580239581e+00 -1.4167791225911919e+00 -2.6319926255503274e+00 -6.1404382000123618e+00 1.7942873956023300e+00 2.6993055604349165e+00 6.6115985317608459e+00 1.0875963107489885e+00 2.3031012899181529e+00 2.2220862919830822e+00 -1.4389856952992779e+00 -2.1623164138257680e+00 -2.6193493171419813e+00 -1.3086421336553853e+00 -2.5257308587114577e+00 -3.9848025092322752e+00 1.3780632471381673e+00 2.1877903124691711e+00 3.5509478204851685e+00 3.1896551826560047e+00 1.9074668008704903e+00 9.7804887128104756e-01 -3.4919847021924695e+00 -2.0664888633331149e+00 -9.1458891126336372e-01 -2.0284289809692821e+00 -1.8893885066631262e+00 -8.4119448917398765e-01 2.2220862919830808e+00 1.8636583754505489e+00 1.0875963107489885e+00 5.6745611192270706e+00 2.1897858709733855e+00 9.5162160884898839e-01 -5.8324118698796426e+00 -2.3942909851278564e+00 -1.2277537876710767e+00 -3.1670655551972580e+00 -1.8558584455971705e+00 -1.0574285240598482e+00 3.4335885143724956e+00 2.2451157534268438e+00 1.0236989212892522e+00 1.9576116302963968e+00 6.5671696267364394e+00 2.2036474916521334e+00 -2.4480680061421909e+00 -6.6321842873187693e+00 -1.9179870517415414e+00 -1.9741822163913085e+00 -5.6134097958715259e+00 -1.9741822163913079e+00 2.3031012899181516e+00 4.9139933244741458e+00 2.3031012899181529e+00 2.1897858709733855e+00 9.7724867435924399e+00 2.1897858709733855e+00 -2.3139090085650285e+00 -8.9430409510304010e+00 -2.3139090085650289e+00 -1.9179870517415409e+00 -6.6321842873187702e+00 -2.4480680061421904e+00 2.2036474916521334e+00 6.5671696267364439e+00 1.9576116302963964e+00 1.0236989212892527e+00 2.2451157534268429e+00 3.4335885143724938e+00 -1.0574285240598496e+00 -1.8558584455971703e+00 -3.1670655551972584e+00 -8.4119448917398820e-01 -1.8893885066631269e+00 -2.0284289809692826e+00 1.0875963107489888e+00 1.8636583754505496e+00 2.2220862919830822e+00 9.5162160884898839e-01 2.1897858709733860e+00 5.6745611192270706e+00 -1.2277537876710767e+00 -2.3942909851278573e+00 -5.8324118698796426e+00 -9.1458891126336406e-01 -2.0664888633331158e+00 -3.4919847021924690e+00 9.7804887128104823e-01 1.9074668008704916e+00 3.1896551826560069e+00 -3.4643901948963021e+00 -2.1888322653845891e+00 -1.3836563193159186e+00 3.8155843272430721e+00 2.3109882561351798e+00 1.3032904782253729e+00 2.2739107122687652e+00 2.2508794066613156e+00 1.1115615084626349e+00 -2.6193493171419804e+00 -2.1404077106580610e+00 -1.4389856952992779e+00 -5.8324118698796426e+00 -2.3139090085650280e+00 -1.2277537876710769e+00 6.2212458094311813e+00 2.4260365926309597e+00 1.5844595236196819e+00 3.4292080163686220e+00 2.0207090286126328e+00 1.2977890191231589e+00 -3.8237974833937143e+00 -2.3654642994324102e+00 -1.2467047271445753e+00 -1.9203269734210109e+00 -5.9486589195038961e+00 -2.2985491503505449e+00 2.3556375959390916e+00 5.9752856438335913e+00 2.0708034992238424e+00 1.9230058349312880e+00 4.9198655870342103e+00 1.9230058349312875e+00 -2.1623164138257680e+00 -4.3918409683932884e+00 -2.1623164138257680e+00 -2.3942909851278569e+00 -8.9430409510304028e+00 -2.3942909851278569e+00 2.4260365926309597e+00 8.3617628837300888e+00 2.4260365926309602e+00 2.0708034992238424e+00 5.9752856438335940e+00 2.3556375959390907e+00 -2.2985491503505453e+00 -5.9486589195038997e+00 -1.9203269734210111e+00 -1.2467047271445753e+00 -2.3654642994324098e+00 -3.8237974833937125e+00 1.2977890191231598e+00 2.0207090286126328e+00 3.4292080163686212e+00 1.1115615084626356e+00 2.2508794066613165e+00 2.2739107122687656e+00 -1.4389856952992783e+00 -2.1404077106580619e+00 -2.6193493171419808e+00 -1.2277537876710767e+00 -2.3139090085650289e+00 -5.8324118698796426e+00 1.5844595236196819e+00 2.4260365926309597e+00 6.2212458094311813e+00 1.3032904782253731e+00 2.3109882561351816e+00 3.8155843272430725e+00 -1.3836563193159195e+00 -2.1888322653845904e+00 -3.4643901948963056e+00 -1.9987029351066876e+00 -1.7467685248558524e+00 -1.0777501341421625e+00 2.2660348892121882e+00 1.9151295769190382e+00 9.8679821582183735e-01 3.2885474240915507e+00 1.9999416161185470e+00 1.0761663845266185e+00 -3.5461247580239585e+00 -1.9769087827718279e+00 -1.3086421336553855e+00 -3.1670655551972580e+00 -1.9179870517415405e+00 -9.1458891126336406e-01 3.4292080163686220e+00 2.0708034992238424e+00 1.3032904782253731e+00 5.6851550785853400e+00 2.1054751690145839e+00 1.3086028017606077e+00 -5.9570521599297939e+00 -2.4496855019067905e+00 -1.3738767012735242e+00 -1.7838574256601500e+00 -4.9766571231725472e+00 -2.3419281199739097e+00 2.2146971910281494e+00 4.9735582453224874e+00 1.9151295769190391e+00 2.0588798594572681e+00 6.7943656130943353e+00 2.3932166760527598e+00 -2.3345214783059545e+00 -6.1646072814078448e+00 -2.5257308587114577e+00 -1.8558584455971705e+00 -6.6321842873187702e+00 -2.0664888633331158e+00 2.0207090286126328e+00 5.9752856438335940e+00 2.3109882561351816e+00 2.1054751690145839e+00 9.2341847399269543e+00 2.8160182589649385e+00 -2.4255238985493577e+00 -9.2039455502782097e+00 -2.5012049260534353e+00 -1.1216157348497573e+00 -2.3865860008512754e+00 -2.6499707307101441e+00 1.3145023371407540e+00 2.2146971910281477e+00 2.2660348892121878e+00 1.1043799300971104e+00 2.3834002016288522e+00 3.6056786170450916e+00 -1.4943194953224550e+00 -2.4504869377984915e+00 -3.9848025092322743e+00 -1.0574285240598484e+00 -2.4480680061421904e+00 -3.4919847021924690e+00 1.2977890191231589e+00 2.3556375959390907e+00 3.8155843272430725e+00 1.3086028017606082e+00 2.8160182589649385e+00 6.4570448065528865e+00 -1.3519103338895697e+00 -2.4846123027690723e+00 -6.0175846979183500e+00 2.2438275694064007e+00 2.1739977013904985e+00 1.2644681590182341e+00 -2.6499707307101450e+00 -2.3419281199739093e+00 -1.0777501341421627e+00 -3.5907876623169463e+00 -2.5094241629548630e+00 -1.1283095391645492e+00 3.9060821401814803e+00 2.4300969414056039e+00 1.3780632471381677e+00 3.4335885143724956e+00 2.2036474916521334e+00 9.7804887128104823e-01 -3.8237974833937143e+00 -2.2985491503505457e+00 -1.3836563193159195e+00 -5.9570521599297939e+00 -2.4255238985493586e+00 -1.3519103338895697e+00 6.4381098123902243e+00 2.7676831973804412e+00 1.3210460490747513e+00 1.9512472452814777e+00 4.9350677979318984e+00 2.1739977013904990e+00 -2.3865860008512767e+00 -4.9766571231725480e+00 -1.7467685248558533e+00 -2.2266746074695520e+00 -6.8238319989708796e+00 -2.0169320708031422e+00 2.4643642135712662e+00 6.1664549386764911e+00 2.1877903124691711e+00 2.2451157534268438e+00 6.5671696267364439e+00 1.9074668008704918e+00 -2.3654642994324102e+00 -5.9486589195038997e+00 -2.1888322653845904e+00 -2.4496855019067909e+00 -9.2039455502782079e+00 -2.4846123027690727e+00 2.7676831973804412e+00 9.2844012285807018e+00 2.1678903490824966e+00 1.0239188764065781e+00 1.9512472452814769e+00 2.2438275694064007e+00 -1.1216157348497575e+00 -1.7838574256601492e+00 -1.9987029351066885e+00 -1.0252461768815484e+00 -2.0586354757706857e+00 -3.2890109815809185e+00 1.3987794933788233e+00 2.1872755762449123e+00 3.5509478204851694e+00 1.0236989212892522e+00 1.9576116302963964e+00 3.1896551826560069e+00 -1.2467047271445753e+00 -1.9203269734210111e+00 -3.4643901948963052e+00 -1.3738767012735251e+00 -2.5012049260534357e+00 -6.0175846979183509e+00 1.3210460490747509e+00 2.1678903490824966e+00 5.7852582369546868e+00 1191 1192 1193 1239 1240 1241 1251 1252 1253 1203 1204 1205 1194 1195 1196 1242 1243 1244 1254 1255 1256 1206 1207 1208 5.2820685898737176e+00 1.9560957094254889e+00 1.2057069162045562e+00 -5.5069815272654612e+00 -2.2917073013986982e+00 -1.2651705390116079e+00 -2.9586004250312707e+00 -1.8599644499523631e+00 -9.1555580025274996e-01 3.2229063815299468e+00 1.9946295105537115e+00 1.2950526885561464e+00 2.9235086888665167e+00 1.7731346416388374e+00 9.2731330371793974e-01 -3.2029027751927557e+00 -1.7434896019447605e+00 -1.1528781364656240e+00 -1.8082306685085734e+00 -1.6048738258471555e+00 -1.0238107400312679e+00 2.0482317357278785e+00 1.7761753175249386e+00 9.2934230728260747e-01 1.9560957094254889e+00 8.5221301032909089e+00 2.5684906804286416e+00 -2.2797951117290518e+00 -8.4327926133443381e+00 -2.2492318522056296e+00 -1.8202042302581114e+00 -6.2568494556752086e+00 -2.0324575567974446e+00 2.0007895606742307e+00 5.5968162148803033e+00 2.2769663645157752e+00 1.7307310923996886e+00 6.0757049506231464e+00 2.0779435464636111e+00 -2.0175860535253247e+00 -5.4627479059995201e+00 -2.1979006678157100e+00 -1.5752312437719274e+00 -4.5652913645701938e+00 -2.2199863350451250e+00 2.0052002767850059e+00 4.5230300707949009e+00 1.7761758204558811e+00 1.2057069162045564e+00 2.5684906804286420e+00 5.9480821293744119e+00 -1.2429657916551493e+00 -2.2198947285711630e+00 -5.4513063699247395e+00 -1.0214861941699840e+00 -2.3246990067597628e+00 -3.2613494123506479e+00 1.2777956025367558e+00 2.2429526824359431e+00 3.5896256029760600e+00 8.8149485262687188e-01 2.0263823553349676e+00 3.1681151926517930e+00 -1.2933177371011437e+00 -2.1255224486310538e+00 -3.5738359748695263e+00 -9.8357297920195097e-01 -2.1729157277494053e+00 -2.4675658947952939e+00 1.1763453307600438e+00 2.0052061935118317e+00 2.0482347269379417e+00 -5.5069815272654612e+00 -2.2797951117290518e+00 -1.2429657916551493e+00 5.9641214247095053e+00 2.6128938517532805e+00 1.1949781361203509e+00 3.2739432113542244e+00 2.1968135861914231e+00 9.9708437152156204e-01 -3.6704053815766762e+00 -2.2626028279924961e+00 -1.3956743599486345e+00 -3.2268896838351475e+00 -2.2742968340963183e+00 -9.5934237343653728e-01 3.5613831743576516e+00 2.1836849813398800e+00 1.2043421855456726e+00 2.0724634938738324e+00 2.0433395675850958e+00 1.2254118324931511e+00 -2.4676347116179289e+00 -2.2200372130518122e+00 -1.0238340006404163e+00 -2.2917073013986977e+00 -8.4327926133443363e+00 -2.2198947285711634e+00 2.6128938517532805e+00 8.4671501724062175e+00 1.8987375105728335e+00 2.1985591081600284e+00 6.2245097131040863e+00 1.8600701954084526e+00 -2.3362872881750478e+00 -5.5957259856094685e+00 -2.1462932842833244e+00 -1.8926286288809078e+00 -6.1403912566760619e+00 -1.6763842090632111e+00 2.1382937307091696e+00 5.4849936453387862e+00 1.8453374745568629e+00 1.7438494608378576e+00 4.5576900606749184e+00 2.0433474007942909e+00 -2.1729729330056835e+00 -4.5654337358941426e+00 -1.6049203594147419e+00 -1.2651705390116079e+00 -2.2492318522056292e+00 -5.4513063699247395e+00 1.1949781361203513e+00 1.8987375105728335e+00 5.1876980549207952e+00 9.6894004267078004e-01 1.8085003869316481e+00 2.9608438215355308e+00 -1.2058242159262971e+00 -1.7891042420806176e+00 -3.2241171513438740e+00 -8.2049547174124893e-01 -1.7398666300199970e+00 -2.9043037419183042e+00 1.2139487398014333e+00 1.9023871287341707e+00 3.1670088551770923e+00 8.9722150203089945e-01 1.7438538087121975e+00 2.0724686641256715e+00 -9.8359819394430970e-01 -1.5752761106446067e+00 -1.8082921325721708e+00 -2.9586004250312703e+00 -1.8202042302581114e+00 -1.0214861941699840e+00 3.2739432113542244e+00 2.1985591081600284e+00 9.6894004267078004e-01 5.2636903652194560e+00 2.2205087982227152e+00 9.9043834832639321e-01 -5.5209303187604775e+00 -2.3829019742937128e+00 -1.2887521749087072e+00 -1.8352178546419966e+00 -1.7930884545456804e+00 -7.4536065004120078e-01 2.0777554483436282e+00 1.7495712710074967e+00 1.0147175218909297e+00 2.9607784541220683e+00 1.8600357286898381e+00 9.9706898194467297e-01 -3.2614188806056328e+00 -2.0324802469825749e+00 -9.1556587571288439e-01 -1.8599644499523633e+00 -6.2568494556752086e+00 -2.3246990067597628e+00 2.1968135861914231e+00 6.2245097131040863e+00 1.8085003869316478e+00 2.2205087982227161e+00 9.2712677507298267e+00 2.2205086702777965e+00 -2.4128236424420919e+00 -8.5066786757757580e+00 -2.4128234557586041e+00 -1.7143652593072434e+00 -5.2048385793882348e+00 -1.7143650477590833e+00 2.0860861803073951e+00 4.5051660228258239e+00 2.0860861286365124e+00 1.8084661118830798e+00 6.2243805418111116e+00 2.1967784913968815e+00 -2.3247213249029155e+00 -6.2569573176316480e+00 -1.8599861669653888e+00 -9.1555580025274996e-01 -2.0324575567974446e+00 -3.2613494123506479e+00 9.9708437152156226e-01 1.8600701954084526e+00 2.9608438215355313e+00 9.9043834832639344e-01 2.2205086702777961e+00 5.2636902863966899e+00 -1.2887524003544777e+00 -2.3829022227330556e+00 -5.5209303272315262e+00 -7.4536085778456918e-01 -1.7930887396987536e+00 -1.8352178755424107e+00 1.0147175945149234e+00 1.7495710444612069e+00 2.0777553372346089e+00 9.6892551809755800e-01 2.1985258058543535e+00 3.2738779027509093e+00 -1.0214967740686403e+00 -1.8202271967725543e+00 -2.9586697327931555e+00 3.2229063815299468e+00 2.0007895606742307e+00 1.2777956025367558e+00 -3.6704053815766762e+00 -2.3362872881750478e+00 -1.2058242159262968e+00 -5.5209303187604775e+00 -2.4128236424420919e+00 -1.2887524003544777e+00 6.0158515045492926e+00 2.4743542630643667e+00 1.6781840091643652e+00 2.0276108455812953e+00 2.1342711574435387e+00 9.9270460275743366e-01 -2.4406824010609838e+00 -1.9910388232457701e+00 -1.3535191321677238e+00 -3.2240350502338027e+00 -2.1462522892990297e+00 -1.3956540440262060e+00 3.5896844199714040e+00 2.2769870619798027e+00 1.2950655780161509e+00 1.9946295105537115e+00 5.5968162148803033e+00 2.2429526824359427e+00 -2.2626028279924966e+00 -5.5957259856094694e+00 -1.7891042420806176e+00 -2.3829019742937132e+00 -8.5066786757757562e+00 -2.3829022227330556e+00 2.4743542630643685e+00 7.9941773106180491e+00 2.4743542033210355e+00 1.6953968683230447e+00 4.4939598574857618e+00 1.6953968044782628e+00 -1.9727848310360179e+00 -3.9838561394164622e+00 -1.9727850830097866e+00 -1.7890680970074500e+00 -5.5955941103968421e+00 -2.2625666433078040e+00 2.2429770883885536e+00 5.5969015282144152e+00 1.9946545008960233e+00 1.2950526885561464e+00 2.2769663645157752e+00 3.5896256029760600e+00 -1.3956743599486345e+00 -2.1462932842833244e+00 -3.2241171513438740e+00 -1.2887521749087074e+00 -2.4128234557586041e+00 -5.5209303272315262e+00 1.6781840091643647e+00 2.4743542033210351e+00 6.0158514663233706e+00 9.9270465220961324e-01 2.1342710815183321e+00 2.0276107897958844e+00 -1.3535188281267403e+00 -1.9910386310868200e+00 -2.4406824179006863e+00 -1.2058040144436617e+00 -2.3362463313813007e+00 -3.6703233374811672e+00 1.2778080274976191e+00 2.0008100531549067e+00 3.2229653748619387e+00 2.9235086888665176e+00 1.7307310923996890e+00 8.8149485262687188e-01 -3.2268896838351475e+00 -1.8926286288809078e+00 -8.2049547174124893e-01 -1.8352178546419968e+00 -1.7143652593072434e+00 -7.4536085778456906e-01 2.0276108455812953e+00 1.6953968683230447e+00 9.9270465220961324e-01 5.3029178434511897e+00 2.0012805097095034e+00 8.5204211956628095e-01 -5.4557879019408606e+00 -2.2220178120196836e+00 -1.1283754793642993e+00 -2.9042680347182839e+00 -1.6763553432427569e+00 -9.5932989143651726e-01 3.1681260972372867e+00 2.0779585730183547e+00 9.2732007592386889e-01 1.7731346416388376e+00 6.0757049506231464e+00 2.0263823553349676e+00 -2.2742968340963183e+00 -6.1403912566760619e+00 -1.7398666300199970e+00 -1.7930884545456804e+00 -5.2048385793882348e+00 -1.7930887396987538e+00 2.1342711574435387e+00 4.4939598574857627e+00 2.1342710815183321e+00 2.0012805097095030e+00 9.1648434687399636e+00 2.0012804280093128e+00 -2.1278621395248267e+00 -8.3247248380138483e+00 -2.1278624282895513e+00 -1.7398364668213715e+00 -6.1402984426836680e+00 -2.2742666320423539e+00 2.0263975861963175e+00 6.0757448399129395e+00 1.7731505651880428e+00 9.2731330371793974e-01 2.0779435464636111e+00 3.1681151926517930e+00 -9.5934237343653739e-01 -1.6763842090632111e+00 -2.9043037419183038e+00 -7.4536065004120078e-01 -1.7143650477590833e+00 -1.8352178755424107e+00 9.9270460275743366e-01 1.6953968044782628e+00 2.0276107897958844e+00 8.5204211956628095e-01 2.0012804280093124e+00 5.3029177652021753e+00 -1.1283751930257180e+00 -2.2220175950732859e+00 -5.4557879350454339e+00 -8.2048295661684201e-01 -1.8925997952179217e+00 -3.2268540088878872e+00 8.8150114707864369e-01 1.7307458681623147e+00 2.9235198137441829e+00 -3.2029027751927557e+00 -2.0175860535253247e+00 -1.2933177371011437e+00 3.5613831743576516e+00 2.1382937307091696e+00 1.2139487398014333e+00 2.0777554483436282e+00 2.0860861803073956e+00 1.0147175945149234e+00 -2.4406824010609838e+00 -1.9727848310360179e+00 -1.3535188281267403e+00 -5.4557879019408606e+00 -2.1278621395248267e+00 -1.1283751930257180e+00 5.8671150167008941e+00 2.2464699469825442e+00 1.4951075988212656e+00 3.1669849009506157e+00 1.8453043333921471e+00 1.2043255035698748e+00 -3.5738654621581891e+00 -2.1979211673050862e+00 -1.1528876784538951e+00 -1.7434896019447603e+00 -5.4627479059995201e+00 -2.1255224486310542e+00 2.1836849813398791e+00 5.4849936453387862e+00 1.9023871287341707e+00 1.7495712710074964e+00 4.5051660228258239e+00 1.7495710444612069e+00 -1.9910388232457701e+00 -3.9838561394164618e+00 -1.9910386310868200e+00 -2.2220178120196836e+00 -8.3247248380138501e+00 -2.2220175950732859e+00 2.2464699469825438e+00 7.7590387160160850e+00 2.2464697980749229e+00 1.9023588360004857e+00 5.4849308034542821e+00 2.1836558858240425e+00 -2.1255387981201914e+00 -5.4628003042051461e+00 -1.7435051823031829e+00 -1.1528781364656242e+00 -2.1979006678157100e+00 -3.5738359748695259e+00 1.2043421855456728e+00 1.8453374745568631e+00 3.1670088551770923e+00 1.0147175218909297e+00 2.0860861286365124e+00 2.0777553372346089e+00 -1.3535191321677238e+00 -1.9727850830097866e+00 -2.4406824179006863e+00 -1.1283754793642993e+00 -2.1278624282895513e+00 -5.4557879350454339e+00 1.4951075988212656e+00 2.2464697980749229e+00 5.8671148628677141e+00 1.2139333212747816e+00 2.1382617147540777e+00 3.5613593335199041e+00 -1.2933278795350018e+00 -2.0176069369073284e+00 -3.2029320609836716e+00 -1.8082306685085734e+00 -1.5752312437719274e+00 -9.8357297920195097e-01 2.0724634938738324e+00 1.7438494608378579e+00 8.9722150203089934e-01 2.9607784541220683e+00 1.8084661118830796e+00 9.6892551809755822e-01 -3.2240350502338027e+00 -1.7890680970074495e+00 -1.2058040144436617e+00 -2.9042680347182839e+00 -1.7398364668213719e+00 -8.2048295661684212e-01 3.1669849009506157e+00 1.9023588360004857e+00 1.2139333212747816e+00 5.1875961178962653e+00 1.8986766148960224e+00 1.1949460533871139e+00 -5.4512892133821218e+00 -2.2492152160166969e+00 -1.2651664445278983e+00 -1.6048738258471553e+00 -4.5652913645701929e+00 -2.1729157277494053e+00 2.0433395675850958e+00 4.5576900606749184e+00 1.7438538087121975e+00 1.8600357286898386e+00 6.2243805418111116e+00 2.1985258058543540e+00 -2.1462522892990297e+00 -5.5955941103968430e+00 -2.3362463313813011e+00 -1.6763553432427565e+00 -6.1402984426836680e+00 -1.8925997952179217e+00 1.8453043333921468e+00 5.4849308034542821e+00 2.1382617147540777e+00 1.8986766148960221e+00 8.4669373804303003e+00 2.6128208401564170e+00 -2.2198747861741612e+00 -8.4327548687199094e+00 -2.2917003151284181e+00 -1.0238107400312679e+00 -2.2199863350451250e+00 -2.4675658947952934e+00 1.2254118324931511e+00 2.0433474007942909e+00 2.0724686641256711e+00 9.9706898194467297e-01 2.1967784913968815e+00 3.2738779027509093e+00 -1.3956540440262062e+00 -2.2625666433078044e+00 -3.6703233374811672e+00 -9.5932989143651726e-01 -2.2742666320423535e+00 -3.2268540088878872e+00 1.2043255035698748e+00 2.1836558858240425e+00 3.5613593335199036e+00 1.1949460533871137e+00 2.6128208401564161e+00 5.9640094638665690e+00 -1.2429576959008215e+00 -2.2797830077763486e+00 -5.5069721230987065e+00 2.0482317357278790e+00 2.0052002767850063e+00 1.1763453307600438e+00 -2.4676347116179289e+00 -2.1729729330056835e+00 -9.8359819394430970e-01 -3.2614188806056328e+00 -2.3247213249029155e+00 -1.0214967740686400e+00 3.5896844199714035e+00 2.2429770883885536e+00 1.2778080274976191e+00 3.1681260972372867e+00 2.0263975861963175e+00 8.8150114707864369e-01 -3.5738654621581891e+00 -2.1255387981201914e+00 -1.2933278795350018e+00 -5.4512892133821236e+00 -2.2198747861741612e+00 -1.2429576959008213e+00 5.9481660148273061e+00 2.5685328908330747e+00 1.2057260381124666e+00 1.7761753175249382e+00 4.5230300707949009e+00 2.0052061935118317e+00 -2.2200372130518122e+00 -4.5654337358941426e+00 -1.5752761106446067e+00 -2.0324802469825749e+00 -6.2569573176316480e+00 -1.8202271967725543e+00 2.2769870619798023e+00 5.5969015282144152e+00 2.0008100531549067e+00 2.0779585730183547e+00 6.0757448399129403e+00 1.7307458681623147e+00 -2.1979211673050867e+00 -5.4628003042051470e+00 -2.0176069369073284e+00 -2.2492152160166969e+00 -8.4327548687199094e+00 -2.2797830077763486e+00 2.5685328908330751e+00 8.5222697875285913e+00 1.9561311372717856e+00 9.2934230728260758e-01 1.7761758204558811e+00 2.0482347269379417e+00 -1.0238340006404163e+00 -1.6049203594147419e+00 -1.8082921325721708e+00 -9.1556587571288439e-01 -1.8599861669653888e+00 -2.9586697327931564e+00 1.2950655780161509e+00 1.9946545008960233e+00 3.2229653748619382e+00 9.2732007592386878e-01 1.7731505651880428e+00 2.9235198137441829e+00 -1.1528876784538951e+00 -1.7435051823031826e+00 -3.2029320609836716e+00 -1.2651664445278983e+00 -2.2917003151284181e+00 -5.5069721230987074e+00 1.2057260381124666e+00 1.9561311372717856e+00 5.2821461339036420e+00 744 745 746 1203 1204 1205 1215 1216 1217 756 757 758 747 748 749 1206 1207 1208 1218 1219 1220 759 760 761 5.5036856922373163e+00 1.3689416316315481e+00 8.2219407320061766e-01 -5.6130985875568600e+00 -1.7858276094909333e+00 -9.8187257066381117e-01 -2.8313832364474547e+00 -1.2555085780308683e+00 -6.2637671541418538e-01 2.9882656703265660e+00 1.5549757623132623e+00 9.5925413885313182e-01 2.8056437705314234e+00 1.2262628992883124e+00 6.4616179082370384e-01 -2.9869919292428957e+00 -1.3313722664233008e+00 -8.3353245593251957e-01 -1.5238195449225016e+00 -1.0957638121547542e+00 -6.7614953277955236e-01 1.6576981650744040e+00 1.3182919728667331e+00 6.9032127191261505e-01 1.3689416316315481e+00 1.0719412631024145e+01 3.3431996761329841e+00 -1.7704123762053396e+00 -1.0760713179955490e+01 -3.0439015222514154e+00 -1.2340465479665181e+00 -7.8917624293531503e+00 -2.6722505533217067e+00 1.5483454230083791e+00 7.3109508711430822e+00 2.9707941875791146e+00 1.1909857072964125e+00 7.6762623881447176e+00 2.7354289247249572e+00 -1.6313255817229861e+00 -7.1286175529169089e+00 -2.8891602334235276e+00 -1.0671354071382175e+00 -5.8511555621999642e+00 -2.8240214551538427e+00 1.5946471510967188e+00 5.9256228341135682e+00 2.3799109757134338e+00 8.2219407320061777e-01 3.3431996761329845e+00 7.1784546793156050e+00 -9.6623444227262378e-01 -3.0199304230943653e+00 -6.6739223954002806e+00 -6.8811106049869186e-01 -2.9939858071645724e+00 -4.0177734263087954e+00 9.4648724245212768e-01 2.9481879224943963e+00 4.3510713367488236e+00 6.1675670280615158e-01 2.6901386538290071e+00 3.9107979656567173e+00 -1.0061091246470140e+00 -2.8425109183675783e+00 -4.3204538419976313e+00 -6.4974962880797915e-01 -2.7865200160199013e+00 -2.9862310543022255e+00 9.2476623776741018e-01 2.6614209121900267e+00 2.5580567362877886e+00 -5.6130985875568600e+00 -1.7704123762053392e+00 -9.6623444227262356e-01 5.9530294504559746e+00 2.2044311918094199e+00 1.0253033994727507e+00 3.0218235363308472e+00 1.6785172552490764e+00 7.7695968296299067e-01 -3.3225232782311886e+00 -1.9312649392008063e+00 -1.1265650562073555e+00 -2.9990864003966102e+00 -1.7934841628140703e+00 -7.9831872138246296e-01 3.2565907548726822e+00 1.8576329428963698e+00 1.0029405862458765e+00 1.6810610518497209e+00 1.6153546732793083e+00 9.5067704147679921e-01 -1.9777965273245648e+00 -1.8607745850139572e+00 -8.6476249029597463e-01 -1.7858276094909329e+00 -1.0760713179955491e+01 -3.0199304230943653e+00 2.2044311918094199e+00 1.0918869431842262e+01 2.7025044147810018e+00 1.6837870433993636e+00 7.9970652825104871e+00 2.5299273364987043e+00 -1.9757592815031984e+00 -7.4349767258264281e+00 -2.8662607995563820e+00 -1.4172574893869250e+00 -7.8606114066239723e+00 -2.3679234599174537e+00 1.8357271771674943e+00 7.2696018323566358e+00 2.5653730054672197e+00 1.2887616548857768e+00 5.9628226696042619e+00 2.6950262119262867e+00 -1.8338626868809949e+00 -6.0920579039077580e+00 -2.2387162861050118e+00 -9.8187257066381117e-01 -3.0439015222514154e+00 -6.6739223954002806e+00 1.0253033994727505e+00 2.7025044147810018e+00 6.3740273171959680e+00 7.6814800792362847e-01 2.4962201405429427e+00 3.6978832681521627e+00 -1.0076155316180369e+00 -2.4992896453228273e+00 -3.9845491172842271e+00 -6.3618099482705492e-01 -2.4052584600600899e+00 -3.6137547275804360e+00 1.0065538687104865e+00 2.6076134326096918e+00 3.9100637661934119e+00 6.7071634259623858e-01 2.3619116233463204e+00 2.5910888212569638e+00 -8.4505252159419963e-01 -2.2197999836456228e+00 -2.3008369325335618e+00 -2.8313832364474547e+00 -1.2340465479665181e+00 -6.8811106049869186e-01 3.0218235363308472e+00 1.6837870433993636e+00 7.6814800792362847e-01 5.4330061307916733e+00 1.5065430107303748e+00 6.9449696566449948e-01 -5.5880744445974626e+00 -1.8327676276116376e+00 -9.6003348671994992e-01 -1.5379273013032249e+00 -1.2037343050003504e+00 -5.3190369251330050e-01 1.6890892092416721e+00 1.3130760721057786e+00 7.2953719427362662e-01 2.8049532580755905e+00 1.2577103100896012e+00 6.7140986209657305e-01 -2.9914871520916395e+00 -1.4905679557466118e+00 -6.8354379022638512e-01 -1.2555085780308686e+00 -7.8917624293531494e+00 -2.9939858071645724e+00 1.6785172552490761e+00 7.9970652825104871e+00 2.4962201405429427e+00 1.5065430107303750e+00 1.1462079528300636e+01 2.9331126472652089e+00 -1.8403724024301007e+00 -1.0809639820636249e+01 -3.1449681017667697e+00 -1.1534016504898028e+00 -6.5272786637490388e+00 -2.3261840914120775e+00 1.6565779192977002e+00 5.9322392210995103e+00 2.7169861307280310e+00 1.2184103987121844e+00 7.7742613656198367e+00 2.8104572620715094e+00 -1.8107659530385605e+00 -7.9369644837920346e+00 -2.4916381802642720e+00 -6.2637671541418549e-01 -2.6722505533217067e+00 -4.0177734263087954e+00 7.7695968296299056e-01 2.5299273364987043e+00 3.6978832681521627e+00 6.9449696566449937e-01 2.9331126472652098e+00 6.4247278840858719e+00 -9.6110186439359857e-01 -3.1353352205873577e+00 -6.7103939565575672e+00 -5.2054573902686119e-01 -2.3759941978609294e+00 -2.3258877096743729e+00 8.0417461824088132e-01 2.3634052344261600e+00 2.5950607481397205e+00 6.5202679933335150e-01 2.8193863247419171e+00 3.9806427315485235e+00 -8.1963374736707639e-01 -2.4622515711619966e+00 -3.6442595393855401e+00 2.9882656703265664e+00 1.5483454230083793e+00 9.4648724245212768e-01 -3.3225232782311886e+00 -1.9757592815031979e+00 -1.0076155316180369e+00 -5.5880744445974626e+00 -1.8403724024301007e+00 -9.6110186439359868e-01 5.9718341478210126e+00 2.0858953963416340e+00 1.3148030848297207e+00 1.6456003948050120e+00 1.6761741665870584e+00 7.9517513089484115e-01 -1.9622986593843361e+00 -1.7043072280298308e+00 -1.0810012498502455e+00 -2.9660266218942444e+00 -1.6862515412060526e+00 -1.0483765817157280e+00 3.2332227911546410e+00 1.8962754672321103e+00 1.0416297694009191e+00 1.5549757623132623e+00 7.3109508711430822e+00 2.9481879224943968e+00 -1.9312649392008063e+00 -7.4349767258264281e+00 -2.4992896453228277e+00 -1.8327676276116378e+00 -1.0809639820636246e+01 -3.1353352205873573e+00 2.0858953963416340e+00 1.0342702280784538e+01 3.2767832278873814e+00 1.2719813313025823e+00 5.9123470231111508e+00 2.3260251582581501e+00 -1.6987343161132544e+00 -5.4460760302302473e+00 -2.6522212398207659e+00 -1.3315557801640496e+00 -7.2172151288607305e+00 -2.9397513401758690e+00 1.8814701731322674e+00 7.3419075305148800e+00 2.6756011372668911e+00 9.5925413885313182e-01 2.9707941875791146e+00 4.3510713367488236e+00 -1.1265650562073555e+00 -2.8662607995563820e+00 -3.9845491172842271e+00 -9.6003348671994970e-01 -3.1449681017667701e+00 -6.7103939565575672e+00 1.3148030848297207e+00 3.2767832278873814e+00 7.1979689473986257e+00 7.0775279916331413e-01 2.7418172908875276e+00 2.5491824377016594e+00 -1.0805127253108846e+00 -2.6597354767723047e+00 -2.9583531824227536e+00 -8.4287790844389687e-01 -2.9829074466895964e+00 -4.3741168226566058e+00 1.0281791538359184e+00 2.6644771184310283e+00 3.9291903570720437e+00 2.8056437705314234e+00 1.1909857072964125e+00 6.1675670280615158e-01 -2.9990864003966102e+00 -1.4172574893869252e+00 -6.3618099482705492e-01 -1.5379273013032249e+00 -1.1534016504898030e+00 -5.2054573902686119e-01 1.6456003948050120e+00 1.2719813313025823e+00 7.0775279916331413e-01 5.4443180225672814e+00 1.3668638704004819e+00 6.1595102764873721e-01 -5.5124133393073862e+00 -1.7240409273028290e+00 -8.7538374805959451e-01 -2.7692560134943900e+00 -1.1274257365715390e+00 -6.3836812943336119e-01 2.9231208665978947e+00 1.5922948947516189e+00 7.3001808172866856e-01 1.2262628992883124e+00 7.6762623881447176e+00 2.6901386538290071e+00 -1.7934841628140703e+00 -7.8606114066239723e+00 -2.4052584600600904e+00 -1.2037343050003504e+00 -6.5272786637490370e+00 -2.3759941978609294e+00 1.6761741665870586e+00 5.9123470231111517e+00 2.7418172908875276e+00 1.3668638704004823e+00 1.1187667258969475e+01 2.7199835521019242e+00 -1.6569111497438225e+00 -1.0458922971794275e+01 -2.8817449741757635e+00 -1.1583802959978529e+00 -7.6333254762064309e+00 -2.8952661370423054e+00 1.5432089772802400e+00 7.7038618481483736e+00 2.4063242723206288e+00 6.4616179082370384e-01 2.7354289247249572e+00 3.9107979656567173e+00 -7.9831872138246296e-01 -2.3679234599174541e+00 -3.6137547275804365e+00 -5.3190369251330050e-01 -2.3261840914120775e+00 -2.3258877096743733e+00 7.9517513089484126e-01 2.3260251582581501e+00 2.5491824377016594e+00 6.1595102764873710e-01 2.7199835521019242e+00 6.3575209678380471e+00 -8.6143505590892389e-01 -2.9528171778696159e+00 -6.5506989848893777e+00 -5.6414161445520761e-01 -2.5130830328757527e+00 -3.9139250746515311e+00 6.9851113489261152e-01 2.3785701269898682e+00 3.5867651255992943e+00 -2.9869919292428957e+00 -1.6313255817229859e+00 -1.0061091246470140e+00 3.2565907548726818e+00 1.8357271771674943e+00 1.0065538687104865e+00 1.6890892092416721e+00 1.6565779192977002e+00 8.0417461824088121e-01 -1.9622986593843361e+00 -1.6987343161132546e+00 -1.0805127253108848e+00 -5.5124133393073862e+00 -1.6569111497438225e+00 -8.6143505590892411e-01 5.8239093349610638e+00 1.9316410182858894e+00 1.2089441204023299e+00 2.9283219009143235e+00 1.4319225946825769e+00 8.8801021650229695e-01 -3.2362072720551232e+00 -1.8688976618535977e+00 -9.5962591798917130e-01 -1.3313722664233008e+00 -7.1286175529169089e+00 -2.8425109183675779e+00 1.8576329428963696e+00 7.2696018323566367e+00 2.6076134326096918e+00 1.3130760721057781e+00 5.9322392210995103e+00 2.3634052344261596e+00 -1.7043072280298308e+00 -5.4460760302302482e+00 -2.6597354767723047e+00 -1.7240409273028288e+00 -1.0458922971794275e+01 -2.9528171778696155e+00 1.9316410182858899e+00 9.9298984445387415e+00 3.0432311006389123e+00 1.4764518554474071e+00 7.0697114630868949e+00 2.8417394323502796e+00 -1.8190814669794817e+00 -7.1678344061403516e+00 -2.4009256270155435e+00 -8.3353245593251979e-01 -2.8891602334235276e+00 -4.3204538419976313e+00 1.0029405862458765e+00 2.5653730054672197e+00 3.9100637661934119e+00 7.2953719427362662e-01 2.7169861307280314e+00 2.5950607481397210e+00 -1.0810012498502453e+00 -2.6522212398207659e+00 -2.9583531824227536e+00 -8.7538374805959451e-01 -2.8817449741757635e+00 -6.5506989848893777e+00 1.2089441204023299e+00 3.0432311006389123e+00 6.9582191526120525e+00 9.0493031094923371e-01 2.8124152011434846e+00 4.2528020748435642e+00 -1.0564347580287052e+00 -2.7148789905575912e+00 -3.8866397324789856e+00 -1.5238195449225016e+00 -1.0671354071382175e+00 -6.4974962880797915e-01 1.6810610518497209e+00 1.2887616548857768e+00 6.7071634259623847e-01 2.8049532580755905e+00 1.2184103987121844e+00 6.5202679933335150e-01 -2.9660266218942444e+00 -1.3315557801640496e+00 -8.4287790844389676e-01 -2.7692560134943895e+00 -1.1583802959978529e+00 -5.6414161445520761e-01 2.9283219009143235e+00 1.4764518554474071e+00 9.0493031094923382e-01 5.3044140928558097e+00 1.2876065417506803e+00 7.8415699095930003e-01 -5.4596481233843068e+00 -1.7141589674959279e+00 -9.5506129213103952e-01 -1.0957638121547544e+00 -5.8511555621999642e+00 -2.7865200160199013e+00 1.6153546732793083e+00 5.9628226696042610e+00 2.3619116233463204e+00 1.2577103100896014e+00 7.7742613656198367e+00 2.8193863247419171e+00 -1.6862515412060524e+00 -7.2172151288607296e+00 -2.9829074466895964e+00 -1.1274257365715390e+00 -7.6333254762064318e+00 -2.5130830328757527e+00 1.4319225946825767e+00 7.0697114630868940e+00 2.8124152011434846e+00 1.2876065417506801e+00 1.0400173126293012e+01 3.2951773976338545e+00 -1.6831530298698183e+00 -1.0505272457336879e+01 -3.0063800512803258e+00 -6.7614953277955248e-01 -2.8240214551538427e+00 -2.9862310543022255e+00 9.5067704147679921e-01 2.6950262119262867e+00 2.5910888212569643e+00 6.7140986209657305e-01 2.8104572620715094e+00 3.9806427315485235e+00 -1.0483765817157280e+00 -2.9397513401758690e+00 -4.3741168226566058e+00 -6.3836812943336119e-01 -2.8952661370423054e+00 -3.9139250746515311e+00 8.8801021650229695e-01 2.8417394323502800e+00 4.2528020748435642e+00 7.8415699095930003e-01 3.2951773976338545e+00 7.0065939452221748e+00 -9.3135986710632601e-01 -2.9833613716099125e+00 -6.5568546212608627e+00 1.6576981650744040e+00 1.5946471510967191e+00 9.2476623776741040e-01 -1.9777965273245648e+00 -1.8338626868809949e+00 -8.4505252159419963e-01 -2.9914871520916395e+00 -1.8107659530385605e+00 -8.1963374736707639e-01 3.2332227911546410e+00 1.8814701731322669e+00 1.0281791538359184e+00 2.9231208665978947e+00 1.5432089772802400e+00 6.9851113489261152e-01 -3.2362072720551227e+00 -1.8190814669794817e+00 -1.0564347580287050e+00 -5.4596481233843068e+00 -1.6831530298698179e+00 -9.3135986710632612e-01 5.8510972520286941e+00 2.1275368352596296e+00 1.0010243676003663e+00 1.3182919728667331e+00 5.9256228341135682e+00 2.6614209121900272e+00 -1.8607745850139572e+00 -6.0920579039077571e+00 -2.2197999836456228e+00 -1.4905679557466120e+00 -7.9369644837920346e+00 -2.4622515711619966e+00 1.8962754672321103e+00 7.3419075305148809e+00 2.6644771184310283e+00 1.5922948947516189e+00 7.7038618481483736e+00 2.3785701269898678e+00 -1.8688976618535971e+00 -7.1678344061403516e+00 -2.7148789905575907e+00 -1.7141589674959277e+00 -1.0505272457336881e+01 -2.9833613716099125e+00 2.1275368352596296e+00 1.0730737038400202e+01 2.6758237593641989e+00 6.9032127191261505e-01 2.3799109757134338e+00 2.5580567362877886e+00 -8.6476249029597463e-01 -2.2387162861050114e+00 -2.3008369325335623e+00 -6.8354379022638512e-01 -2.4916381802642715e+00 -3.6442595393855401e+00 1.0416297694009191e+00 2.6756011372668911e+00 3.9291903570720437e+00 7.3001808172866867e-01 2.4063242723206288e+00 3.5867651255992934e+00 -9.5962591798917118e-01 -2.4009256270155435e+00 -3.8866397324789856e+00 -9.5506129213103952e-01 -3.0063800512803258e+00 -6.5568546212608627e+00 1.0010243676003663e+00 2.6758237593641985e+00 6.3145786066998237e+00 1203 1204 1205 1251 1252 1253 1263 1264 1265 1215 1216 1217 1206 1207 1208 1254 1255 1256 1266 1267 1268 1218 1219 1220 4.9302441850753604e+00 1.2044254617006263e+00 7.3256320512414141e-01 -5.0273146258642223e+00 -1.6214348278123174e+00 -8.9650709967568376e-01 -2.5421597963426654e+00 -1.1099266954369649e+00 -5.4889855904239593e-01 2.6949949417381478e+00 1.4129659768275387e+00 8.8332623468364402e-01 2.5247847580222973e+00 1.0857072577103641e+00 5.7106439514393670e-01 -2.7057491533031097e+00 -1.1945313473394625e+00 -7.6110324857864609e-01 -1.3793938648598665e+00 -9.6537437456548492e-01 -6.0389448872542661e-01 1.5045935555340557e+00 1.1881685489157010e+00 6.2344956107043026e-01 1.2044254617006263e+00 9.6874670501490776e+00 3.0770539864032882e+00 -1.6140615749520641e+00 -9.7190275605133643e+00 -2.7692224335260160e+00 -1.0867966573831649e+00 -7.2031065806392007e+00 -2.4309951065397772e+00 1.4123456058176280e+00 6.6189679072282921e+00 2.7324099972750853e+00 1.0553699633063405e+00 7.0081542526162757e+00 2.5066901015858161e+00 -1.5013654313060114e+00 -6.4615180232183658e+00 -2.6666497915229570e+00 -9.4044440041648081e-01 -5.3432246739469909e+00 -2.6111992621817932e+00 1.4705270332331286e+00 5.4122876283242780e+00 2.1619125085063535e+00 7.3256320512414119e-01 3.0770539864032882e+00 6.5189670644692548e+00 -8.8735750662319068e-01 -2.7522444037828295e+00 -5.9942058579015400e+00 -6.0945163764026922e-01 -2.7624034545251290e+00 -3.6429267197558994e+00 8.7526139737686670e-01 2.7139252721510352e+00 3.9844430853624337e+00 5.4567674556869050e-01 2.4655895520537703e+00 3.5459605119585818e+00 -9.3908982760180471e-01 -2.6151880994530416e+00 -3.9709253646715901e+00 -5.8044186901794270e-01 -2.5762880295738708e+00 -2.7716645657439365e+00 8.6283949281350958e-01 2.4495551767267787e+00 2.3303518462826962e+00 -5.0273146258642223e+00 -1.6140615749520641e+00 -8.8735750662319068e-01 5.3833616598154928e+00 2.0498461070898157e+00 9.3769514476904459e-01 2.7259149880276947e+00 1.5433540161911050e+00 7.0199912575384638e-01 -3.0408133776742625e+00 -1.7939790880025890e+00 -1.0552021374596481e+00 -2.7150183843160907e+00 -1.6642268335926691e+00 -7.2509014817259043e-01 2.9813040316517796e+00 1.7269979041433956e+00 9.3504784573871857e-01 1.5292732394674837e+00 1.4917044126597903e+00 8.8779783714100191e-01 -1.8367075311078735e+00 -1.7396349435367846e+00 -7.9489016114718236e-01 -1.6214348278123174e+00 -9.7190275605133643e+00 -2.7522444037828304e+00 2.0498461070898157e+00 9.8814156304497107e+00 2.4244228113821302e+00 1.5410926621489587e+00 7.3044426043947119e+00 2.2842245425529937e+00 -1.8415931991668293e+00 -6.7417309112231543e+00 -2.6276364060663924e+00 -1.2841621640896022e+00 -7.1919949445133957e+00 -2.1312025133074992e+00 1.7055279975958171e+00 6.5972097305843800e+00 2.3398109050129485e+00 1.1638932710779404e+00 5.4493985095533590e+00 2.4787525000191906e+00 -1.7131698468437841e+00 -5.5797130587322528e+00 -2.0161274358105405e+00 -8.9650709967568376e-01 -2.7692224335260160e+00 -5.9942058579015400e+00 9.3769514476904436e-01 2.4244228113821302e+00 5.6998842664858858e+00 6.9000759598856420e-01 2.2518292844987471e+00 3.3189362944625609e+00 -9.3375348176754835e-01 -2.2580908412545981e+00 -3.6077245986185771e+00 -5.6486710313694988e-01 -2.1707602616631734e+00 -3.2481464278197163e+00 9.3695373390665693e-01 2.3764459261395716e+00 3.5450168555866837e+00 6.0658573416903427e-01 2.1443012297851518e+00 2.3607094748384005e+00 -7.7611452425311889e-01 -1.9989257153618132e+00 -2.0744700070336961e+00 -2.5421597963426654e+00 -1.0867966573831649e+00 -6.0945163764026933e-01 2.7259149880276943e+00 1.5410926621489587e+00 6.9000759598856432e-01 4.9343323957485756e+00 1.3409332112266874e+00 6.0761641987845816e-01 -5.0804940245445014e+00 -1.6752315397763535e+00 -8.7064781872668373e-01 -1.3913540060583185e+00 -1.0689705234706253e+00 -4.6200446238296150e-01 1.5354014875185467e+00 1.1855861661363305e+00 6.5841398568493514e-01 2.5695121467593136e+00 1.1170459862324673e+00 5.9498862025060051e-01 -2.7511531911086453e+00 -1.3536593051143009e+00 -6.0892270305264362e-01 -1.1099266954369646e+00 -7.2031065806392025e+00 -2.7624034545251290e+00 1.5433540161911052e+00 7.3044426043947128e+00 2.2518292844987471e+00 1.3409332112266876e+00 1.0519107339885966e+01 2.6575634601007652e+00 -1.6876630532585344e+00 -9.8532406564209136e+00 -2.8755708884682623e+00 -1.0254892588002114e+00 -6.0219049140001113e+00 -2.1043851013996706e+00 1.5362975495209765e+00 5.4162855032948176e+00 2.5077600677666578e+00 1.0826595433575632e+00 7.1539534696883882e+00 2.5785593923569596e+00 -1.6801653128006235e+00 -7.3155367662036603e+00 -2.2533527603300678e+00 -5.4889855904239604e-01 -2.4309951065397772e+00 -3.6429267197558994e+00 7.0199912575384649e-01 2.2842245425529937e+00 3.3189362944625613e+00 6.0761641987845805e-01 2.6575634601007652e+00 5.8276850346774491e+00 -8.7482417788053846e-01 -2.8676166222827204e+00 -6.1070357028711211e+00 -4.5377699489068002e-01 -2.1545897318517806e+00 -2.0995073220725757e+00 7.3459497490501746e-01 2.1460592569665895e+00 2.3666454297607395e+00 5.7931843092646906e-01 2.5924907235103918e+00 3.6582310416655348e+00 -7.4602921965017721e-01 -2.2271365224564619e+00 -3.3220280558666868e+00 2.6949949417381478e+00 1.4123456058176280e+00 8.7526139737686659e-01 -3.0408133776742625e+00 -1.8415931991668295e+00 -9.3375348176754835e-01 -5.0804940245445014e+00 -1.6876630532585344e+00 -8.7482417788053846e-01 5.4841128970170461e+00 1.9315440604629388e+00 1.2371409536369575e+00 1.4937270620601024e+00 1.5552932706467089e+00 7.2545564998481515e-01 -1.8235958274212165e+00 -1.5809542330450317e+00 -1.0217739161679400e+00 -2.7313164903732181e+00 -1.5545297040076200e+00 -9.8040839374253907e-01 3.0033848191979029e+00 1.7655572525507406e+00 9.7290196855992661e-01 1.4129659768275384e+00 6.6189679072282921e+00 2.7139252721510347e+00 -1.7939790880025892e+00 -6.7417309112231525e+00 -2.2580908412545981e+00 -1.6752315397763535e+00 -9.8532406564209118e+00 -2.8676166222827204e+00 1.9315440604629390e+00 9.3945758155134769e+00 3.0071266512917392e+00 1.1497130912228188e+00 5.3971569344239256e+00 2.1101721733680896e+00 -1.5755143285873645e+00 -4.9351812862392093e+00 -2.4410042965097221e+00 -1.2012601471450908e+00 -6.5963447473871781e+00 -2.7123527332874868e+00 1.7517619749981028e+00 6.7157969441047598e+00 2.4478403965236639e+00 8.8332623468364402e-01 2.7324099972750857e+00 3.9844430853624337e+00 -1.0552021374596479e+00 -2.6276364060663928e+00 -3.6077245986185771e+00 -8.7064781872668373e-01 -2.8755708884682618e+00 -6.1070357028711211e+00 1.2371409536369575e+00 3.0071266512917401e+00 6.6127191236152036e+00 6.3814214491452814e-01 2.5277708014383027e+00 2.3192864522346173e+00 -1.0186011773479595e+00 -2.4417961145096831e+00 -2.7438297882909084e+00 -7.7158412821212397e-01 -2.7529291108081781e+00 -4.0649692238945674e+00 9.5742592851128616e-01 2.4306250698473892e+00 3.6071106524629202e+00 2.5247847580222973e+00 1.0553699633063407e+00 5.4567674556869050e-01 -2.7150183843160907e+00 -1.2841621640896022e+00 -5.6486710313694988e-01 -1.3913540060583185e+00 -1.0254892588002116e+00 -4.5377699489068007e-01 1.4937270620601024e+00 1.1497130912228188e+00 6.3814214491452814e-01 4.9786299958289133e+00 1.2186240630492466e+00 5.3913217027012261e-01 -5.0373881297339507e+00 -1.5864405206035419e+00 -7.9868652833345466e-01 -2.5447009695652136e+00 -9.9859305045611957e-01 -5.6783762154095441e-01 2.6913196737622616e+00 1.4709778763710695e+00 6.6221718714869804e-01 1.0857072577103641e+00 7.0081542526162766e+00 2.4655895520537703e+00 -1.6642268335926691e+00 -7.1919949445133957e+00 -2.1707602616631738e+00 -1.0689705234706253e+00 -6.0219049140001113e+00 -2.1545897318517802e+00 1.5552932706467089e+00 5.3971569344239256e+00 2.5277708014383031e+00 1.2186240630492466e+00 1.0304878881247454e+01 2.4652827985657400e+00 -1.5138526258085243e+00 -9.5629046890497253e+00 -2.6368726145448287e+00 -1.0254982477334693e+00 -7.0371756414408448e+00 -2.6756483970505185e+00 1.4129236391989706e+00 7.1037901207164200e+00 2.1792278530524896e+00 5.7106439514393681e-01 2.5066901015858161e+00 3.5459605119585818e+00 -7.2509014817259054e-01 -2.1312025133074988e+00 -3.2481464278197163e+00 -4.6200446238296150e-01 -2.1043851013996706e+00 -2.0995073220725762e+00 7.2545564998481527e-01 2.1101721733680896e+00 2.3192864522346168e+00 5.3913217027012261e-01 2.4652827985657400e+00 5.7995202248464635e+00 -7.8127052155638832e-01 -2.7062051879917197e+00 -5.9880003085205438e+00 -4.9445102900463761e-01 -2.2928143951339122e+00 -3.6057673398545087e+00 6.2716394571770417e-01 2.1524621243131556e+00 3.2766542092276834e+00 -2.7057491533031097e+00 -1.5013654313060114e+00 -9.3908982760180459e-01 2.9813040316517792e+00 1.7055279975958166e+00 9.3695373390665704e-01 1.5354014875185467e+00 1.5362975495209765e+00 7.3459497490501746e-01 -1.8235958274212167e+00 -1.5755143285873645e+00 -1.0186011773479595e+00 -5.0373881297339507e+00 -1.5138526258085243e+00 -7.8127052155638843e-01 5.3683829655855977e+00 1.7899232289883680e+00 1.1398976148382745e+00 2.6986720192534528e+00 1.3033382709310939e+00 8.1908002829375703e-01 -3.0170273935511012e+00 -1.7443546613343555e+00 -8.9156482543755355e-01 -1.1945313473394625e+00 -6.4615180232183658e+00 -2.6151880994530421e+00 1.7269979041433956e+00 6.5972097305843800e+00 2.3764459261395721e+00 1.1855861661363305e+00 5.4162855032948176e+00 2.1460592569665895e+00 -1.5809542330450317e+00 -4.9351812862392093e+00 -2.4417961145096831e+00 -1.5864405206035421e+00 -9.5629046890497253e+00 -2.7062051879917188e+00 1.7899232289883682e+00 9.0440291872565961e+00 2.7977698621385545e+00 1.3547234810938384e+00 6.4680568898319031e+00 2.6215670956167618e+00 -1.6953046793738979e+00 -6.5659773124603973e+00 -2.1786527389070338e+00 -7.6110324857864609e-01 -2.6666497915229566e+00 -3.9709253646715901e+00 9.3504784573871857e-01 2.3398109050129485e+00 3.5450168555866837e+00 6.5841398568493514e-01 2.5077600677666578e+00 2.3666454297607391e+00 -1.0217739161679400e+00 -2.4410042965097221e+00 -2.7438297882909084e+00 -7.9868652833345455e-01 -2.6368726145448291e+00 -5.9880003085205438e+00 1.1398976148382745e+00 2.7977698621385541e+00 6.4177511799822433e+00 8.4169715904582887e-01 2.5963593372968252e+00 3.9541911310720481e+00 -9.9349291222771730e-01 -2.4971734696374779e+00 -3.5808491349186733e+00 -1.3793938648598665e+00 -9.4044440041648081e-01 -5.8044186901794270e-01 1.5292732394674837e+00 1.1638932710779404e+00 6.0658573416903439e-01 2.5695121467593136e+00 1.0826595433575632e+00 5.7931843092646917e-01 -2.7313164903732181e+00 -1.2012601471450906e+00 -7.7158412821212397e-01 -2.5447009695652141e+00 -1.0254982477334693e+00 -4.9445102900463767e-01 2.6986720192534528e+00 1.3547234810938382e+00 8.4169715904582909e-01 4.9479530417134994e+00 1.1463061896268232e+00 7.0593017226496801e-01 -5.0899991223954517e+00 -1.5803796898611249e+00 -8.8705447017159611e-01 -9.6537437456548492e-01 -5.3432246739469917e+00 -2.5762880295738708e+00 1.4917044126597905e+00 5.4493985095533599e+00 2.1443012297851514e+00 1.1170459862324673e+00 7.1539534696883891e+00 2.5924907235103918e+00 -1.5545297040076200e+00 -6.5963447473871781e+00 -2.7529291108081781e+00 -9.9859305045611957e-01 -7.0371756414408457e+00 -2.2928143951339122e+00 1.3033382709310937e+00 6.4680568898319022e+00 2.5963593372968252e+00 1.1463061896268234e+00 9.6366058044681431e+00 3.0569917010874947e+00 -1.5398977304209525e+00 -9.7312696107667769e+00 -2.7681114561639020e+00 -6.0389448872542661e-01 -2.6111992621817932e+00 -2.7716645657439365e+00 8.8779783714100180e-01 2.4787525000191906e+00 2.3607094748384005e+00 5.9498862025060051e-01 2.5785593923569596e+00 3.6582310416655348e+00 -9.8040839374253907e-01 -2.7123527332874873e+00 -4.0649692238945674e+00 -5.6783762154095452e-01 -2.6756483970505185e+00 -3.6057673398545087e+00 8.1908002829375692e-01 2.6215670956167618e+00 3.9541911310720481e+00 7.0593017226496790e-01 3.0569917010874952e+00 6.5682837782403229e+00 -8.5565615394140848e-01 -2.7366702965606096e+00 -6.0990142963232916e+00 1.5045935555340557e+00 1.4705270332331286e+00 8.6283949281350958e-01 -1.8367075311078733e+00 -1.7131698468437844e+00 -7.7611452425311900e-01 -2.7511531911086458e+00 -1.6801653128006235e+00 -7.4602921965017721e-01 3.0033848191979029e+00 1.7517619749981033e+00 9.5742592851128605e-01 2.6913196737622616e+00 1.4129236391989706e+00 6.2716394571770417e-01 -3.0170273935511012e+00 -1.6953046793738982e+00 -9.9349291222771730e-01 -5.0899991223954526e+00 -1.5398977304209525e+00 -8.5565615394140837e-01 5.4955891896688538e+00 1.9933249220090572e+00 9.2386344302992185e-01 1.1881685489157010e+00 5.4122876283242780e+00 2.4495551767267791e+00 -1.7396349435367848e+00 -5.5797130587322528e+00 -1.9989257153618132e+00 -1.3536593051143011e+00 -7.3155367662036603e+00 -2.2271365224564619e+00 1.7655572525507408e+00 6.7157969441047580e+00 2.4306250698473892e+00 1.4709778763710695e+00 7.1037901207164191e+00 2.1524621243131552e+00 -1.7443546613343555e+00 -6.5659773124603982e+00 -2.4971734696374779e+00 -1.5803796898611249e+00 -9.7312696107667769e+00 -2.7366702965606087e+00 1.9933249220090574e+00 9.9606220550176321e+00 2.4272636331290385e+00 6.2344956107043026e-01 2.1619125085063531e+00 2.3303518462826962e+00 -7.9489016114718236e-01 -2.0161274358105405e+00 -2.0744700070336961e+00 -6.0892270305264362e-01 -2.2533527603300678e+00 -3.3220280558666868e+00 9.7290196855992672e-01 2.4478403965236639e+00 3.6071106524629202e+00 6.6221718714869793e-01 2.1792278530524891e+00 3.2766542092276838e+00 -8.9156482543755355e-01 -2.1786527389070338e+00 -3.5808491349186737e+00 -8.8705447017159622e-01 -2.7681114561639024e+00 -6.0990142963232916e+00 9.2386344302992174e-01 2.4272636331290380e+00 5.8622447861690485e+00 756 757 758 1215 1216 1217 1227 1228 1229 768 769 770 759 760 761 1218 1219 1220 1230 1231 1232 771 772 773 5.2248053827460570e+00 1.9056326767349208e-01 1.1288567029629251e-01 -5.1631767221984530e+00 -6.2705101945972808e-01 -3.6363146606574592e-01 -2.5512953328224346e+00 -1.3208011857534588e-01 -6.5904460398312686e-02 2.5491477120992099e+00 5.4769810432874200e-01 3.3277182176119574e-01 2.5450208091318354e+00 1.6486383992679812e-01 8.7247916742513740e-02 -2.5826248729428993e+00 -3.6566715556993146e-01 -2.2542750855581933e-01 -1.2731249728422800e+00 -1.2077465299406923e-01 -7.5133183451614738e-02 1.2512479968289658e+00 3.4244773467004275e-01 1.9719120967149084e-01 1.9056326767349208e-01 1.1078327455773310e+01 3.5325129705098952e+00 -6.1394173318884093e-01 -1.1268790234976384e+01 -3.2817306712789733e+00 -1.3444846333383298e-01 -8.1132137917067091e+00 -2.7805712207142261e+00 5.3604232172450150e-01 7.6726316517141093e+00 3.1385708282178735e+00 1.4723436369287779e-01 7.9633179334296340e+00 2.8978208292631531e+00 -6.9123049871183317e-01 -7.5461479258485920e+00 -3.0900363346430813e+00 -1.0411987734636168e-01 -6.0468981575982292e+00 -2.9328526648028079e+00 6.6990061948999602e-01 6.2607730692128580e+00 2.5162862634481682e+00 1.1288567029629250e-01 3.5325129705098943e+00 7.3472229028499676e+00 -3.5465207815441319e-01 -3.2618929480682808e+00 -6.8429973358893132e+00 -7.5597385860542404e-02 -3.1277467370691698e+00 -4.0910015317461861e+00 3.2360702089234128e-01 3.1311954401647220e+00 4.4379421730356690e+00 7.6866923168408527e-02 2.8567512265180803e+00 4.0285509782685827e+00 -4.2323018548289187e-01 -3.0708106312385106e+00 -4.4519599198519062e+00 -6.4376220254973054e-02 -2.9093971099424385e+00 -3.0574970292418824e+00 4.0449625539577744e-01 2.8493877891257045e+00 2.6297397625750678e+00 -5.1631767221984530e+00 -6.1394173318884093e-01 -3.5465207815441324e-01 5.3506244543384671e+00 1.0915654629878107e+00 5.0364757519772674e-01 2.5684659969352954e+00 5.8709302012087250e-01 2.6957938269026910e-01 -2.7295390594614832e+00 -9.7719915797354640e-01 -5.5524208360654770e-01 -2.5877688481919345e+00 -7.4844967031470089e-01 -3.3733471497704604e-01 2.7204014675979131e+00 9.2813828870663651e-01 4.9442784926928801e-01 1.2785619147735523e+00 6.6687550525764971e-01 4.0668353333577822e-01 -1.4375692037933565e+00 -9.3408171559588171e-01 -4.2710946375505526e-01 -6.2705101945972830e-01 -1.1268790234976384e+01 -3.2618929480682812e+00 1.0915654629878107e+00 1.1592319171813267e+01 2.9757420489410902e+00 5.9191347531781280e-01 8.3782996524540270e+00 2.6831744580685672e+00 -9.9333426025074012e-01 -7.9524220033821482e+00 -3.0808011226582850e+00 -3.8755606592094077e-01 -8.2914305769308179e+00 -2.5838729569379404e+00 9.3031018439248181e-01 7.8285694506897734e+00 2.8212173668943699e+00 3.2579132094413665e-01 6.2926455785053701e+00 2.8670647003798186e+00 -9.3163909801083167e-01 -6.5791910381730894e+00 -2.4206315466193407e+00 -3.6363146606574592e-01 -3.2817306712789733e+00 -6.8429973358893132e+00 5.0364757519772663e-01 2.9757420489410902e+00 6.5424651249898389e+00 2.7044548829373605e-01 2.6772588803540520e+00 3.7761105220260287e+00 -5.0011876024177637e-01 -2.7240031733055634e+00 -4.0827106358753458e+00 -1.7341738278883359e-01 -2.5952233536544558e+00 -3.7273288302878504e+00 5.0087950922411795e-01 2.8535517615168362e+00 4.0449931118880400e+00 1.8895327278002144e-01 2.5194696753152863e+00 2.6697369418277033e+00 -4.2675823639924559e-01 -2.4250651678882726e+00 -2.3802688986791045e+00 -2.5512953328224346e+00 -1.3444846333383301e-01 -7.5597385860542404e-02 2.5684659969352954e+00 5.9191347531781269e-01 2.7044548829373605e-01 5.0593953222790358e+00 2.1099922864622717e-01 9.8912896351062110e-02 -5.0531786361500108e+00 -6.4603132383751938e-01 -3.1304032352640071e-01 -1.2767601082697759e+00 -1.4196280921193127e-01 -6.2976713653857111e-02 1.2824853798804612e+00 3.6060357813917282e-01 1.7684819152057174e-01 2.5077827478202539e+00 1.6303550155026733e-01 8.7868885433402724e-02 -2.5368953696728251e+00 -4.0410918727019635e-01 -1.8246103855797266e-01 -1.3208011857534591e-01 -8.1132137917067091e+00 -3.1277467370691703e+00 5.8709302012087261e-01 8.3782996524540270e+00 2.6772588803540520e+00 2.1099922864622717e-01 1.1645081586179586e+01 3.0309848073490522e+00 -6.4268457588224659e-01 -1.1149468774043775e+01 -3.2836155000190188e+00 -1.2376246835076472e-01 -6.7302338697115855e+00 -2.4583092321075015e+00 7.0855714782972834e-01 6.2852210856538893e+00 2.8757696206648249e+00 1.4578053127360630e-01 7.9344176166861704e+00 2.8935908088961857e+00 -7.5390276506207576e-01 -8.2501035055116034e+00 -2.6079326480684255e+00 -6.5904460398312686e-02 -2.7805712207142261e+00 -4.0910015317461861e+00 2.6957938269026910e-01 2.6831744580685672e+00 3.7761105220260287e+00 9.8912896351062110e-02 3.0309848073490517e+00 6.4457762784443418e+00 -3.1135467371715875e-01 -3.2846501592187809e+00 -6.7419434413512445e+00 -5.5138953995523307e-02 -2.4745768707701727e+00 -2.3886859088998089e+00 3.2583033803711453e-01 2.5159174381154261e+00 2.6690971741437202e+00 7.9022433931127761e-02 2.9072731338478603e+00 4.0134555596104917e+00 -3.4094696289857818e-01 -2.5975515866777270e+00 -3.6828086522273447e+00 2.5491477120992099e+00 5.3604232172450150e-01 3.2360702089234128e-01 -2.7295390594614832e+00 -9.9333426025074012e-01 -5.0011876024177637e-01 -5.0531786361500108e+00 -6.4268457588224659e-01 -3.1135467371715864e-01 5.2913495161455177e+00 1.0140051824416654e+00 6.2190718989850158e-01 1.2488294463285463e+00 7.0370826081764237e-01 3.2036318243052320e-01 -1.4316262969422962e+00 -8.5658667542030187e-01 -5.2995648711054733e-01 -2.5270874650085302e+00 -6.8885169784209643e-01 -4.2349590249823948e-01 2.6521047829890487e+00 9.2770144441157587e-01 4.9904843034635599e-01 5.4769810432874200e-01 7.6726316517141102e+00 3.1311954401647220e+00 -9.7719915797354662e-01 -7.9524220033821482e+00 -2.7240031733055634e+00 -6.4603132383751938e-01 -1.1149468774043775e+01 -3.2846501592187805e+00 1.0140051824416654e+00 1.0809270725871240e+01 3.4841205217116160e+00 3.4296283158347168e-01 6.2548336066303074e+00 2.5025155769461853e+00 -8.6681900992239935e-01 -5.9058214302343321e+00 -2.8727901928682393e+00 -3.4788623227671489e-01 -7.5065445242717086e+00 -3.0917567771818306e+00 9.3326960565630002e-01 7.7775207477163040e+00 2.8553687637518910e+00 3.3277182176119574e-01 3.1385708282178735e+00 4.4379421730356690e+00 -5.5524208360654759e-01 -3.0808011226582850e+00 -4.0827106358753458e+00 -3.1304032352640054e-01 -3.2836155000190179e+00 -6.7419434413512436e+00 6.2190718989850158e-01 3.4841205217116165e+00 7.2404603220095272e+00 1.6678922076009095e-01 2.8750965219326936e+00 2.6301500299404612e+00 -5.3476612636190990e-01 -2.8646221671915071e+00 -3.0476555726607741e+00 -2.1604776201214171e-01 -3.1021446824433960e+00 -4.4154402820406062e+00 4.9762806308721091e-01 2.8333956004500238e+00 3.9791974069423133e+00 2.5450208091318354e+00 1.4723436369287776e-01 7.6866923168408527e-02 -2.5877688481919345e+00 -3.8755606592094072e-01 -1.7341738278883362e-01 -1.2767601082697759e+00 -1.2376246835076474e-01 -5.5138953995523314e-02 1.2488294463285463e+00 3.4296283158347163e-01 1.6678922076009095e-01 5.1540243952749183e+00 1.8214316560788973e-01 8.4967218810882900e-02 -5.0774241889455576e+00 -6.3619407965701769e-01 -3.0408744037472479e-01 -2.5142989685520467e+00 -1.0485632485410556e-01 -6.0977059131336220e-02 2.5083774632240150e+00 5.8002857789858941e-01 2.6499747355103553e-01 1.6486383992679812e-01 7.9633179334296367e+00 2.8567512265180803e+00 -7.4844967031470089e-01 -8.2914305769308196e+00 -2.5952233536544558e+00 -1.4196280921193127e-01 -6.7302338697115855e+00 -2.4745768707701727e+00 7.0370826081764237e-01 6.2548336066303074e+00 2.8750965219326936e+00 1.8214316560788971e-01 1.1495956260119026e+01 2.9012962286344539e+00 -5.8453964136450598e-01 -1.0926898956023205e+01 -3.1134549549870965e+00 -1.0511820003976038e-01 -7.8311618672835985e+00 -3.0075378637202936e+00 5.2935505457856702e-01 8.0656174697702347e+00 2.5576490660467912e+00 8.7247916742513726e-02 2.8978208292631535e+00 4.0285509782685818e+00 -3.3733471497704604e-01 -2.5838729569379399e+00 -3.7273288302878504e+00 -6.2976713653857111e-02 -2.4583092321075015e+00 -2.3886859088998089e+00 3.2036318243052320e-01 2.5025155769461853e+00 2.6301500299404617e+00 8.4967218810882886e-02 2.9012962286344539e+00 6.4741256118299377e+00 -2.8227934997712750e-01 -3.1693959200648347e+00 -6.6905132230334381e+00 -5.0747502700235578e-02 -2.6439659271827161e+00 -3.9874779059886145e+00 2.4075996332434585e-01 2.5539114014492013e+00 3.6611792481707299e+00 -2.5826248729428993e+00 -6.9123049871183306e-01 -4.2323018548289187e-01 2.7204014675979131e+00 9.3031018439248181e-01 5.0087950922411795e-01 1.2824853798804612e+00 7.0855714782972834e-01 3.2583033803711453e-01 -1.4316262969422964e+00 -8.6681900992239935e-01 -5.3476612636190990e-01 -5.0774241889455576e+00 -5.8453964136450598e-01 -2.8227934997712745e-01 5.2559701430353938e+00 9.7367140651338024e-01 5.9747061660408463e-01 2.5190085154892086e+00 4.9077557592615423e-01 2.9972935915291099e-01 -2.6861901471722218e+00 -9.6072516466300695e-01 -4.8363416119629882e-01 -3.6566715556993146e-01 -7.5461479258485920e+00 -3.0708106312385106e+00 9.2813828870663662e-01 7.8285694506897743e+00 2.8535517615168358e+00 3.6060357813917276e-01 6.2852210856538884e+00 2.5159174381154257e+00 -8.5658667542030187e-01 -5.9058214302343321e+00 -2.8646221671915066e+00 -6.3619407965701769e-01 -1.0926898956023205e+01 -3.1693959200648347e+00 9.7367140651338047e-01 1.0522267222397996e+01 3.3280808850466275e+00 5.3076904036945938e-01 7.4157261381222419e+00 3.0067105873530555e+00 -9.3473440308139721e-01 -7.6729155847577779e+00 -2.5994319535370933e+00 -2.2542750855581933e-01 -3.0900363346430821e+00 -4.4519599198519053e+00 4.9442784926928801e-01 2.8212173668943699e+00 4.0449931118880400e+00 1.7684819152057174e-01 2.8757696206648249e+00 2.6690971741437202e+00 -5.2995648711054733e-01 -2.8727901928682389e+00 -3.0476555726607741e+00 -3.0408744037472485e-01 -3.1134549549870956e+00 -6.6905132230334372e+00 5.9747061660408463e-01 3.3280808850466275e+00 7.1163514893219650e+00 3.2195566180625573e-01 2.9967545503073327e+00 4.3364365852480038e+00 -5.3123088315910805e-01 -2.9455409404147401e+00 -3.9767496450556115e+00 -1.2731249728422802e+00 -1.0411987734636168e-01 -6.4376220254973041e-02 1.2785619147735525e+00 3.2579132094413671e-01 1.8895327278002144e-01 2.5077827478202539e+00 1.4578053127360630e-01 7.9022433931127761e-02 -2.5270874650085302e+00 -3.4788623227671495e-01 -2.1604776201214171e-01 -2.5142989685520467e+00 -1.0511820003976040e-01 -5.0747502700235564e-02 2.5190085154892086e+00 5.3076904036945938e-01 3.2195566180625573e-01 4.9845638867322268e+00 1.5812184981943481e-01 9.4437389273123284e-02 -4.9754056584123854e+00 -6.0333843274380028e-01 -3.5319727282317792e-01 -1.2077465299406923e-01 -6.0468981575982292e+00 -2.9093971099424381e+00 6.6687550525764983e-01 6.2926455785053701e+00 2.5194696753152859e+00 1.6303550155026736e-01 7.9344176166861713e+00 2.9072731338478608e+00 -6.8885169784209632e-01 -7.5065445242717086e+00 -3.1021446824433956e+00 -1.0485632485410559e-01 -7.8311618672835968e+00 -2.6439659271827161e+00 4.9077557592615423e-01 7.4157261381222419e+00 2.9967545503073327e+00 1.5812184981943489e-01 1.0572166987368242e+01 3.3947532508760609e+00 -5.6432575686323405e-01 -1.0830351771528489e+01 -3.1627428907779920e+00 -7.5133183451614710e-02 -2.9328526648028075e+00 -3.0574970292418824e+00 4.0668353333577822e-01 2.8670647003798186e+00 2.6697369418277033e+00 8.7868885433402710e-02 2.8935908088961861e+00 4.0134555596104926e+00 -4.2349590249823948e-01 -3.0917567771818302e+00 -4.4154402820406062e+00 -6.0977059131336241e-02 -3.0075378637202936e+00 -3.9874779059886145e+00 2.9972935915291093e-01 3.0067105873530555e+00 4.3364365852480038e+00 9.4437389273123284e-02 3.3947532508760614e+00 7.0398686413916618e+00 -3.2911302211402388e-01 -3.1299720418001904e+00 -6.5990825108067597e+00 1.2512479968289658e+00 6.6990061948999602e-01 4.0449625539577744e-01 -1.4375692037933565e+00 -9.3163909801083156e-01 -4.2675823639924559e-01 -2.5368953696728251e+00 -7.5390276506207576e-01 -3.4094696289857818e-01 2.6521047829890487e+00 9.3326960565629991e-01 4.9762806308721097e-01 2.5083774632240150e+00 5.2935505457856713e-01 2.4075996332434579e-01 -2.6861901471722223e+00 -9.3473440308139710e-01 -5.3123088315910805e-01 -4.9754056584123845e+00 -5.6432575686323394e-01 -3.2911302211402388e-01 5.2243301360087582e+00 1.0520767432926759e+00 4.8516482276362149e-01 3.4244773467004275e-01 6.2607730692128589e+00 2.8493877891257045e+00 -9.3408171559588171e-01 -6.5791910381730894e+00 -2.4250651678882731e+00 -4.0410918727019635e-01 -8.2501035055116052e+00 -2.5975515866777279e+00 9.2770144441157576e-01 7.7775207477163040e+00 2.8333956004500243e+00 5.8002857789858953e-01 8.0656174697702347e+00 2.5539114014492017e+00 -9.6072516466300684e-01 -7.6729155847577779e+00 -2.9455409404147401e+00 -6.0333843274380028e-01 -1.0830351771528489e+01 -3.1299720418001908e+00 1.0520767432926759e+00 1.1228650613271565e+01 2.8614349457560015e+00 1.9719120967149084e-01 2.5162862634481677e+00 2.6297397625750678e+00 -4.2710946375505526e-01 -2.4206315466193407e+00 -2.3802688986791045e+00 -1.8246103855797269e-01 -2.6079326480684251e+00 -3.6828086522273455e+00 4.9904843034635599e-01 2.8553687637518914e+00 3.9791974069423133e+00 2.6499747355103553e-01 2.5576490660467917e+00 3.6611792481707299e+00 -4.8363416119629876e-01 -2.5994319535370938e+00 -3.9767496450556106e+00 -3.5319727282317792e-01 -3.1627428907779920e+00 -6.5990825108067588e+00 4.8516482276362144e-01 2.8614349457560020e+00 6.3687932890807097e+00 1215 1216 1217 1263 1264 1265 1275 1276 1277 1227 1228 1229 1218 1219 1220 1266 1267 1268 1278 1279 1280 1230 1231 1232 4.7677722892971941e+00 1.4484871549652720e-01 8.6190296319513943e-02 -4.6933550206176324e+00 -5.7932510213425170e-01 -3.4044578754184279e-01 -2.3699272013433630e+00 -9.4151450901734157e-02 -4.6739307213005933e-02 2.3609677826977316e+00 5.1036098064309943e-01 3.1304899274531151e-01 2.3478794396376972e+00 1.2561749778266409e-01 6.6310747785000193e-02 -2.3827555198770503e+00 -3.2851985531694122e-01 -2.0521667362755838e-01 -1.1998579426674825e+00 -8.6675668208876594e-02 -5.4782963311237436e-02 1.1692761728729060e+00 3.0784488263951315e-01 1.8163469484381889e-01 1.4484871549652720e-01 1.0223084925330085e+01 3.3248910765150632e+00 -5.7850309146533252e-01 -1.0404578433889698e+01 -3.0612684658345319e+00 -9.2161351116569951e-02 -7.6047010458944815e+00 -2.6047014102805304e+00 5.0597425687111097e-01 7.1604467285075186e+00 2.9637650003854565e+00 1.1123586392335554e-01 7.4438341195594573e+00 2.7209251915816419e+00 -6.6006079145712693e-01 -7.0241231733372587e+00 -2.9233890558628706e+00 -7.0782076149967399e-02 -5.6812756338323585e+00 -2.7788277533610848e+00 6.3944847389800619e-01 5.8873125135567301e+00 2.3586054168568564e+00 8.6190296319513929e-02 3.3248910765150632e+00 6.7879873367511134e+00 -3.3949319458147886e-01 -3.0561304294562861e+00 -6.2641828004974736e+00 -5.2444807435867595e-02 -2.9587959293479353e+00 -3.8184089483738828e+00 3.0849807729726531e-01 2.9608352747436659e+00 4.1692634043430399e+00 5.8337941739385578e-02 2.6911325547460128e+00 3.7389253520277594e+00 -4.0803681325766694e-01 -2.8995129469050474e+00 -4.1745532441942732e+00 -4.4591634531826331e-02 -2.7582899301914141e+00 -2.9089258431939284e+00 3.9154013445067659e-01 2.6958703298959401e+00 2.4698947431376466e+00 -4.6933550206176324e+00 -5.7850309146533263e-01 -3.3949319458147875e-01 4.8910458416709535e+00 1.0573331083273023e+00 4.8154857677912921e-01 2.3795004037973824e+00 5.5847177776601664e-01 2.5378228783341622e-01 -2.5492430951309699e+00 -9.4679114034683165e-01 -5.4025290104513557e-01 -2.3849485630344986e+00 -7.2103706127618805e-01 -3.2033962986340225e-01 2.5231910846910868e+00 9.0022613377593486e-01 4.8074006007522840e-01 1.1974462578712752e+00 6.3998880865021490e-01 3.9517401383062234e-01 -1.3636369092475973e+00 -9.0968853543111616e-01 -4.1115921302837954e-01 -5.7932510213425181e-01 -1.0404578433889696e+01 -3.0561304294562852e+00 1.0573331083273021e+00 1.0730582555825073e+01 2.7541331159249074e+00 5.5511684360380764e-01 7.8673831065176181e+00 2.5038116427423329e+00 -9.6865315196743784e-01 -7.4395964419868159e+00 -2.9056630166018502e+00 -3.5306028829620850e-01 -7.7708150607079451e+00 -2.4013670578110373e+00 9.0017800186178254e-01 7.3016414984522093e+00 2.6530297169577644e+00 2.9519227141225435e-01 5.9229475553769593e+00 2.7103286929210193e+00 -9.0678168280725158e-01 -6.2075647795874032e+00 -2.2581426646768499e+00 -3.4044578754184279e-01 -3.0612684658345324e+00 -6.2641828004974736e+00 4.8154857677912932e-01 2.7541331159249083e+00 5.9639330084231679e+00 2.5037970577723545e-01 2.4939688839724847e+00 3.4967060928721874e+00 -4.8516037786565008e-01 -2.5431236948410785e+00 -3.8032441482080497e+00 -1.5543908753594871e-01 -2.4164989292744758e+00 -3.4328009518761062e+00 4.8414642025826082e-01 2.6734296664964488e+00 3.7518301843014403e+00 1.7509523115184586e-01 2.3590867374218640e+00 2.5058336066861293e+00 -4.1012468102303129e-01 -2.2597273138656178e+00 -2.2180749917012945e+00 -2.3699272013433630e+00 -9.2161351116569923e-02 -5.2444807435867574e-02 2.3795004037973824e+00 5.5511684360380775e-01 2.5037970577723540e-01 4.7973633214671061e+00 1.6704419739126372e-01 7.8060000936857457e-02 -4.7824045754727482e+00 -6.1024870793174535e-01 -2.9076513535830484e-01 -1.2016302580988729e+00 -1.0316897971775028e-01 -4.4720590337805004e-02 1.2007829562056442e+00 3.2859673179532511e-01 1.5709337483377278e-01 2.4055523916657120e+00 1.2561837430235751e-01 6.7692375819035894e-02 -2.4292370382208603e+00 -3.7079710832668855e-01 -1.6529492423492409e-01 -9.4151450901734171e-02 -7.6047010458944824e+00 -2.9587959293479353e+00 5.5847177776601675e-01 7.8673831065176181e+00 2.4939688839724847e+00 1.6704419739126369e-01 1.1036993399892026e+01 2.8397112605391839e+00 -6.0959018614781824e-01 -1.0532742547269279e+01 -3.0923449512116123e+00 -9.1136585024061592e-02 -6.3658646710408906e+00 -2.2934450549124148e+00 6.8090977881264758e-01 5.9114764200790875e+00 2.7232411599836386e+00 1.1172656146198576e-01 7.5332724288579511e+00 2.7276927932605619e+00 -7.2327409335830295e-01 -7.8458170911420302e+00 -2.4400281622839057e+00 -4.6739307213005933e-02 -2.6047014102805304e+00 -3.8184089483738828e+00 2.5378228783341622e-01 2.5038116427423329e+00 3.4967060928721874e+00 7.8060000936857457e-02 2.8397112605391839e+00 6.0836693760668830e+00 -2.9139764891997744e-01 -3.1020842399912030e+00 -6.3756472245328615e+00 -3.9793228588927948e-02 -2.3156552388717464e+00 -2.2281832464661560e+00 3.0816459556717329e-01 2.3581262024906935e+00 2.5093698265038733e+00 6.1008474506543162e-02 2.7533930053994089e+00 3.8246404070173363e+00 -3.2308517412208015e-01 -2.4326012220281386e+00 -3.4921462830873780e+00 2.3609677826977316e+00 5.0597425687111097e-01 3.0849807729726536e-01 -2.5492430951309704e+00 -9.6865315196743795e-01 -4.8516037786565008e-01 -4.7824045754727482e+00 -6.0959018614781824e-01 -2.9139764891997733e-01 5.0345890764868528e+00 9.8354795416515972e-01 6.0903068397100768e-01 1.1674753895017922e+00 6.7860005503576182e-01 3.0326639293736779e-01 -1.3594473627476109e+00 -8.3213107040315870e-01 -5.2106753398243044e-01 -2.4236604536662316e+00 -6.6025611537487405e-01 -4.0995528709515888e-01 2.5517232383311836e+00 9.0250825782125654e-01 4.8678569365757596e-01 5.1036098064309943e-01 7.1604467285075186e+00 2.9608352747436659e+00 -9.4679114034683165e-01 -7.4395964419868159e+00 -2.5431236948410785e+00 -6.1024870793174546e-01 -1.0532742547269278e+01 -3.1020842399912025e+00 9.8354795416515950e-01 1.0197249304781115e+01 3.2974477228151322e+00 3.1395958366218468e-01 5.8841223056249703e+00 2.3423538402884807e+00 -8.3802197326916428e-01 -5.5341161708323350e+00 -2.7207453183148909e+00 -3.1894290322558849e-01 -7.1052669304977254e+00 -2.9343349200217563e+00 9.0613620630288871e-01 7.3699037516725463e+00 2.6996513353216489e+00 3.1304899274531162e-01 2.9637650003854565e+00 4.1692634043430399e+00 -5.4025290104513557e-01 -2.9056630166018498e+00 -3.8032441482080497e+00 -2.9076513535830484e-01 -3.0923449512116115e+00 -6.3756472245328615e+00 6.0903068397100779e-01 3.2974477228151313e+00 6.8872260783516754e+00 1.4849065333455311e-01 2.7194314039332887e+00 2.4664173577278317e+00 -5.2186598686190178e-01 -2.7056046579447508e+00 -2.8970813190497124e+00 -1.9968156400339876e-01 -2.9419584104949408e+00 -4.2365553236330911e+00 4.8199525721787029e-01 2.6649269091192767e+00 3.7896211750011686e+00 2.3478794396376972e+00 1.1123586392335555e-01 5.8337941739385578e-02 -2.3849485630344986e+00 -3.5306028829620845e-01 -1.5543908753594871e-01 -1.2016302580988729e+00 -9.1136585024061578e-02 -3.9793228588927962e-02 1.1674753895017922e+00 3.1395958366218463e-01 1.4849065333455314e-01 4.8330501615432055e+00 1.4201693695014497e-01 6.5914362064153159e-02 -4.7471413080042151e+00 -6.0429880097341548e-01 -2.8465584640226949e-01 -2.3991190761015826e+00 -7.3450146134182798e-02 -4.3257247490347712e-02 2.3844342145564754e+00 5.5473343589218327e-01 2.5040245287940199e-01 1.2561749778266409e-01 7.4438341195594573e+00 2.6911325547460128e+00 -7.2103706127618794e-01 -7.7708150607079443e+00 -2.4164989292744758e+00 -1.0316897971775027e-01 -6.3658646710408906e+00 -2.3156552388717464e+00 6.7860005503576182e-01 5.8841223056249703e+00 2.7194314039332887e+00 1.4201693695014497e-01 1.0831136391742914e+01 2.7077478470107921e+00 -5.4846461602540009e-01 -1.0249671291026273e+01 -2.9311176911188381e+00 -6.7978730493412243e-02 -7.4223543729221859e+00 -2.8498681902262026e+00 4.9441489774418301e-01 7.6496125787699505e+00 2.3948282438011677e+00 6.6310747785000193e-02 2.7209251915816419e+00 3.7389253520277594e+00 -3.2033962986340225e-01 -2.4013670578110373e+00 -3.4328009518761062e+00 -4.4720590337805004e-02 -2.2934450549124148e+00 -2.2281832464661560e+00 3.0326639293736768e-01 2.3423538402884807e+00 2.4664173577278317e+00 6.5914362064153145e-02 2.7077478470107925e+00 6.0507170776759693e+00 -2.5983259053934910e-01 -2.9790889505902367e+00 -6.2644118501913226e+00 -3.2056132020671202e-02 -2.4837395553770549e+00 -3.7854356542740426e+00 2.2145743997470779e-01 2.3866137398098286e+00 3.4547719153760674e+00 -2.3827555198770503e+00 -6.6006079145712693e-01 -4.0803681325766694e-01 2.5231910846910868e+00 9.0017800186178254e-01 4.8414642025826082e-01 1.2007829562056442e+00 6.8090977881264758e-01 3.0816459556717329e-01 -1.3594473627476109e+00 -8.3802197326916428e-01 -5.2186598686190178e-01 -4.7471413080042160e+00 -5.4846461602540009e-01 -2.5983259053934915e-01 4.9380306797640650e+00 9.4022902340326153e-01 5.8350279437318642e-01 2.3983260627875111e+00 4.5748141942248333e-01 2.8157980151688600e-01 -2.5709865928194313e+00 -9.3225084274848313e-01 -4.6765822105658866e-01 -3.2851985531694117e-01 -7.0241231733372569e+00 -2.8995129469050474e+00 9.0022613377593486e-01 7.3016414984522093e+00 2.6734296664964488e+00 3.2859673179532511e-01 5.9114764200790875e+00 2.3581262024906935e+00 -8.3213107040315870e-01 -5.5341161708323359e+00 -2.7056046579447508e+00 -6.0429880097341548e-01 -1.0249671291026271e+01 -2.9790889505902367e+00 9.4022902340326131e-01 9.8473470422420437e+00 3.1437641910686973e+00 5.0575132318822758e-01 7.0002428739530984e+00 2.8481567714639815e+00 -9.0985348546923606e-01 -7.2527971995305762e+00 -2.4392702760797844e+00 -2.0521667362755841e-01 -2.9233890558628706e+00 -4.1745532441942732e+00 4.8074006007522840e-01 2.6530297169577644e+00 3.7518301843014403e+00 1.5709337483377278e-01 2.7232411599836381e+00 2.5093698265038733e+00 -5.2106753398243044e-01 -2.7207453183148913e+00 -2.8970813190497124e+00 -2.8465584640226943e-01 -2.9311176911188381e+00 -6.2644118501913226e+00 5.8350279437318642e-01 3.1437641910686978e+00 6.7073761258880129e+00 3.0941216527120463e-01 2.8432181806128964e+00 4.1433061108783669e+00 -5.1980834054113578e-01 -2.7880011833263949e+00 -3.7758358341363847e+00 -1.1998579426674822e+00 -7.0782076149967371e-02 -4.4591634531826331e-02 1.1974462578712752e+00 2.9519227141225435e-01 1.7509523115184586e-01 2.4055523916657124e+00 1.1172656146198573e-01 6.1008474506543148e-02 -2.4236604536662316e+00 -3.1894290322558844e-01 -1.9968156400339876e-01 -2.3991190761015826e+00 -6.7978730493412159e-02 -3.2056132020671195e-02 2.3983260627875111e+00 5.0575132318822758e-01 3.0941216527120463e-01 4.8508151230968002e+00 1.2368034826452137e-01 7.3866270037209469e-02 -4.8295023629860037e+00 -5.7864679445802103e-01 -3.4305281041090674e-01 -8.6675668208876566e-02 -5.6812756338323585e+00 -2.7582899301914141e+00 6.3998880865021490e-01 5.9229475553769593e+00 2.3590867374218640e+00 1.2561837430235748e-01 7.5332724288579502e+00 2.7533930053994089e+00 -6.6025611537487405e-01 -7.1052669304977254e+00 -2.9419584104949417e+00 -7.3450146134182798e-02 -7.4223543729221877e+00 -2.4837395553770554e+00 4.5748141942248333e-01 7.0002428739530984e+00 2.8432181806128960e+00 1.2368034826452143e-01 1.0135950735873626e+01 3.2359147513525053e+00 -5.2638702092164646e-01 -1.0383516656809366e+01 -3.0076247787232617e+00 -5.4782963311237422e-02 -2.7788277533610848e+00 -2.9089258431939284e+00 3.9517401383062228e-01 2.7103286929210193e+00 2.5058336066861298e+00 6.7692375819035908e-02 2.7276927932605619e+00 3.8246404070173368e+00 -4.0995528709515894e-01 -2.9343349200217563e+00 -4.2365553236330911e+00 -4.3257247490347671e-02 -2.8498681902262026e+00 -3.7854356542740430e+00 2.8157980151688600e-01 2.8481567714639811e+00 4.1433061108783669e+00 7.3866270037209525e-02 3.2359147513525053e+00 6.8268190767333898e+00 -3.1031696330701142e-01 -2.9590621453890229e+00 -6.3696823802141598e+00 1.1692761728729060e+00 6.3944847389800619e-01 3.9154013445067659e-01 -1.3636369092475973e+00 -9.0678168280725169e-01 -4.1012468102303129e-01 -2.4292370382208603e+00 -7.2327409335830295e-01 -3.2308517412208010e-01 2.5517232383311836e+00 9.0613620630288882e-01 4.8199525721787029e-01 2.3844342145564754e+00 4.9441489774418301e-01 2.2145743997470779e-01 -2.5709865928194313e+00 -9.0985348546923606e-01 -5.1980834054113578e-01 -4.8295023629860028e+00 -5.2638702092164646e-01 -3.1031696330701142e-01 5.0879292775133260e+00 1.0262967046113585e+00 4.6834232735000364e-01 3.0784488263951315e-01 5.8873125135567310e+00 2.6958703298959401e+00 -9.0968853543111616e-01 -6.2075647795874032e+00 -2.2597273138656178e+00 -3.7079710832668861e-01 -7.8458170911420302e+00 -2.4326012220281386e+00 9.0250825782125654e-01 7.3699037516725454e+00 2.6649269091192771e+00 5.5473343589218327e-01 7.6496125787699505e+00 2.3866137398098286e+00 -9.3225084274848313e-01 -7.2527971995305753e+00 -2.7880011833263949e+00 -5.7864679445802114e-01 -1.0383516656809363e+01 -2.9590621453890229e+00 1.0262967046113587e+00 1.0782866883070144e+01 2.6919808857841270e+00 1.8163469484381889e-01 2.3586054168568564e+00 2.4698947431376466e+00 -4.1115921302837960e-01 -2.2581426646768499e+00 -2.2180749917012945e+00 -1.6529492423492406e-01 -2.4400281622839057e+00 -3.4921462830873780e+00 4.8678569365757590e-01 2.6996513353216489e+00 3.7896211750011686e+00 2.5040245287940199e-01 2.3948282438011681e+00 3.4547719153760674e+00 -4.6765822105658866e-01 -2.4392702760797844e+00 -3.7758358341363847e+00 -3.4305281041090674e-01 -3.0076247787232622e+00 -6.3696823802141598e+00 4.6834232735000370e-01 2.6919808857841270e+00 6.1414516556243335e+00 333 334 335 1128 1129 1130 1194 1195 1196 735 736 737 1092 1093 1094 1131 1132 1133 1161 1162 1163 1095 1096 1097 4.7322589123907886e+00 1.6739974837964318e+00 1.5149222690041346e+00 -4.9802859000736435e+00 -1.8855852409470755e+00 -1.5560350857072220e+00 -2.8816526900737669e+00 -1.6832635080825811e+00 -1.2417648865552180e+00 3.1532169738795379e+00 1.5998142213298823e+00 1.6084608965373470e+00 2.7064763717823266e+00 1.5572678650636216e+00 1.1649004069335978e+00 -2.9863567499659749e+00 -1.3694638314529157e+00 -1.3876020274780365e+00 -1.8470661985629668e+00 -1.3792426510952305e+00 -1.2999069779038317e+00 2.1034092806236973e+00 1.4864756613878660e+00 1.1970254051692286e+00 1.6739974837964318e+00 5.7175704258170779e+00 2.0273018973750494e+00 -1.8787598778834775e+00 -5.6563538361981411e+00 -1.8266707977320320e+00 -1.6212993508916851e+00 -4.1123027377880401e+00 -1.7594539966231999e+00 1.6283592639288871e+00 3.4616798888404099e+00 1.7849195790563743e+00 1.4874523964110860e+00 3.9355189204039767e+00 1.7210888839251453e+00 -1.5604829003712326e+00 -3.3160842103203816e+00 -1.6651080020660975e+00 -1.3377599149074098e+00 -2.7413583094526413e+00 -1.7685532253231067e+00 1.6084928999173993e+00 2.7113298586977370e+00 1.4864756613878671e+00 1.5149222690041346e+00 2.0273018973750494e+00 5.3171042659109622e+00 -1.5352634157806031e+00 -1.8074364435670234e+00 -4.8719014005055961e+00 -1.3261955653158886e+00 -1.9650742689860285e+00 -3.1658572028546494e+00 1.5790363546644151e+00 1.7245251590974748e+00 3.4764136375516297e+00 1.0954370460685989e+00 1.6976321849872478e+00 2.9230042281888138e+00 -1.5009535421559677e+00 -1.5707799307902426e+00 -3.3023346761928618e+00 -1.2223675969962073e+00 -1.7146614980338764e+00 -2.4798381327219952e+00 1.3953844505115169e+00 1.6084928999173975e+00 2.1034092806236968e+00 -4.9802859000736435e+00 -1.8787598778834780e+00 -1.5352634157806033e+00 5.4081633236246685e+00 2.0882604570421890e+00 1.4968686943669169e+00 3.2043898482804467e+00 1.8760593307767044e+00 1.3245969641682129e+00 -3.5781466399364517e+00 -1.7141816508015182e+00 -1.7054599176981695e+00 -3.0049620533909476e+00 -1.9325280761832688e+00 -1.1925969203547029e+00 3.3133106967193262e+00 1.6739477800425080e+00 1.4295222143898016e+00 2.1173688574985969e+00 1.6557552623299698e+00 1.4822393588123748e+00 -2.4798381327219960e+00 -1.7685532253231055e+00 -1.2999069779038317e+00 -1.8855852409470759e+00 -5.6563538361981411e+00 -1.8074364435670238e+00 2.0882604570421890e+00 5.6982134644087648e+00 1.6035557047089148e+00 1.8975731212967604e+00 4.0858385384984981e+00 1.6664354972920961e+00 -1.8550031965939564e+00 -3.4630911210573903e+00 -1.7407851072333491e+00 -1.5704098278811482e+00 -4.0115014554383288e+00 -1.4217766790735256e+00 1.5957553502699418e+00 3.3423907827637986e+00 1.4234944166381485e+00 1.4440708348471651e+00 2.7458619364754395e+00 1.6557552623299681e+00 -1.7146614980338752e+00 -2.7413583094526390e+00 -1.3792426510952296e+00 -1.5560350857072220e+00 -1.8266707977320318e+00 -4.8719014005055961e+00 1.4968686943669169e+00 1.6035557047089146e+00 4.6091315711355465e+00 1.2688115207932837e+00 1.5807942087434570e+00 2.8611497815609805e+00 -1.5066308118680354e+00 -1.4130959263478273e+00 -3.1257699492683138e+00 -1.0370289657288232e+00 -1.5457281487174939e+00 -2.6734153151793039e+00 1.4282014698305807e+00 1.4948340394052249e+00 2.9305026533210556e+00 1.1281807753095066e+00 1.4440708348471647e+00 2.1173688574985956e+00 -1.2223675969962065e+00 -1.3377599149074078e+00 -1.8470661985629662e+00 -2.8816526900737660e+00 -1.6212993508916853e+00 -1.3261955653158883e+00 3.2043898482804467e+00 1.8975731212967606e+00 1.2688115207932837e+00 4.9274635134438549e+00 2.0483908479297943e+00 1.3853658822623152e+00 -5.1840398746247418e+00 -1.9989625897463308e+00 -1.6926698409131662e+00 -1.8756640957052806e+00 -1.6639421024116956e+00 -9.9365951591547985e-01 2.1142107199731557e+00 1.4312585731542591e+00 1.2755154414759402e+00 2.8611497815609859e+00 1.6664354972920969e+00 1.3245969641682125e+00 -3.1658572028546548e+00 -1.7594539966231992e+00 -1.2417648865552178e+00 -1.6832635080825806e+00 -4.1123027377880401e+00 -1.9650742689860285e+00 1.8760593307767044e+00 4.0858385384984981e+00 1.5807942087434570e+00 2.0483908479297943e+00 6.5884611600125940e+00 2.0483908479297943e+00 -2.0472782906795262e+00 -5.7730045980158256e+00 -2.0472782906795257e+00 -1.5138653476592443e+00 -3.4102526181672652e+00 -1.5138653476592434e+00 1.7042370279574230e+00 2.6477244547495804e+00 1.7042370279574235e+00 1.5807942087434577e+00 4.0858385384985016e+00 1.8760593307767031e+00 -1.9650742689860281e+00 -4.1123027377880428e+00 -1.6832635080825802e+00 -1.2417648865552178e+00 -1.7594539966231995e+00 -3.1658572028546494e+00 1.3245969641682129e+00 1.6664354972920961e+00 2.8611497815609805e+00 1.3853658822623154e+00 2.0483908479297943e+00 4.9274635134438549e+00 -1.6926698409131666e+00 -1.9989625897463299e+00 -5.1840398746247418e+00 -9.9365951591548041e-01 -1.6639421024116958e+00 -1.8756640957052799e+00 1.2755154414759402e+00 1.4312585731542589e+00 2.1142107199731557e+00 1.2688115207932851e+00 1.8975731212967619e+00 3.2043898482804511e+00 -1.3261955653158883e+00 -1.6212993508916840e+00 -2.8816526900737709e+00 3.1532169738795379e+00 1.6283592639288871e+00 1.5790363546644153e+00 -3.5781466399364517e+00 -1.8550031965939566e+00 -1.5066308118680352e+00 -5.1840398746247418e+00 -2.0472782906795262e+00 -1.6926698409131666e+00 5.6684265573393571e+00 1.8792101044298264e+00 2.0695643152111765e+00 2.0522528582530981e+00 1.8243600781559000e+00 1.2371327893159090e+00 -2.4623535631941160e+00 -1.4737824310641547e+00 -1.5894337852494755e+00 -3.1257699492683182e+00 -1.7407851072333496e+00 -1.7054599176981693e+00 3.4764136375516341e+00 1.7849195790563721e+00 1.6084608965373470e+00 1.5998142213298823e+00 3.4616798888404099e+00 1.7245251590974748e+00 -1.7141816508015182e+00 -3.4630911210573903e+00 -1.4130959263478271e+00 -1.9989625897463306e+00 -5.7730045980158256e+00 -1.9989625897463297e+00 1.8792101044298264e+00 5.3120208180506996e+00 1.8792101044298264e+00 1.3473313997755496e+00 2.6528314057690112e+00 1.3473313997755492e+00 -1.4246407177370570e+00 -2.1890251613699232e+00 -1.4246407177370570e+00 -1.4130959263478282e+00 -3.4630911210573947e+00 -1.7141816508015184e+00 1.7245251590974755e+00 3.4616798888404130e+00 1.5998142213298823e+00 1.6084608965373470e+00 1.7849195790563743e+00 3.4764136375516306e+00 -1.7054599176981693e+00 -1.7407851072333491e+00 -3.1257699492683138e+00 -1.6926698409131666e+00 -2.0472782906795257e+00 -5.1840398746247409e+00 2.0695643152111765e+00 1.8792101044298264e+00 5.6684265573393553e+00 1.2371327893159094e+00 1.8243600781559004e+00 2.0522528582530977e+00 -1.5894337852494755e+00 -1.4737824310641550e+00 -2.4623535631941156e+00 -1.5066308118680358e+00 -1.8550031965939573e+00 -3.5781466399364548e+00 1.5790363546644146e+00 1.6283592639288851e+00 3.1532169738795433e+00 2.7064763717823266e+00 1.4874523964110860e+00 1.0954370460685992e+00 -3.0049620533909476e+00 -1.5704098278811480e+00 -1.0370289657288232e+00 -1.8756640957052806e+00 -1.5138653476592443e+00 -9.9365951591548041e-01 2.0522528582530981e+00 1.3473313997755496e+00 1.2371327893159094e+00 4.5626012075643061e+00 1.7478856617740071e+00 1.0654894763171088e+00 -4.6902932015130130e+00 -1.7977064872718700e+00 -1.3396743166362086e+00 -2.6734153151793096e+00 -1.4217766790735276e+00 -1.1925969203547029e+00 2.9230042281888200e+00 1.7210888839251455e+00 1.1649004069335980e+00 1.5572678650636216e+00 3.9355189204039758e+00 1.6976321849872478e+00 -1.9325280761832691e+00 -4.0115014554383288e+00 -1.5457281487174939e+00 -1.6639421024116956e+00 -3.4102526181672652e+00 -1.6639421024116958e+00 1.8243600781558997e+00 2.6528314057690112e+00 1.8243600781559000e+00 1.7478856617740073e+00 6.3730953736531575e+00 1.7478856617740057e+00 -1.6849474626683176e+00 -5.4637090911861996e+00 -1.6849474626683176e+00 -1.5457281487174952e+00 -4.0115014554383333e+00 -1.9325280761832675e+00 1.6976321849872473e+00 3.9355189204039798e+00 1.5572678650636211e+00 1.1649004069335978e+00 1.7210888839251453e+00 2.9230042281888142e+00 -1.1925969203547027e+00 -1.4217766790735256e+00 -2.6734153151793039e+00 -9.9365951591547985e-01 -1.5138653476592434e+00 -1.8756640957052801e+00 1.2371327893159090e+00 1.3473313997755489e+00 2.0522528582530981e+00 1.0654894763171088e+00 1.7478856617740057e+00 4.5626012075643052e+00 -1.3396743166362084e+00 -1.7977064872718684e+00 -4.6902932015130121e+00 -1.0370289657288241e+00 -1.5704098278811482e+00 -3.0049620533909511e+00 1.0954370460685987e+00 1.4874523964110844e+00 2.7064763717823306e+00 -2.9863567499659749e+00 -1.5604829003712326e+00 -1.5009535421559677e+00 3.3133106967193262e+00 1.5957553502699415e+00 1.4282014698305805e+00 2.1142107199731557e+00 1.7042370279574230e+00 1.2755154414759402e+00 -2.4623535631941156e+00 -1.4246407177370570e+00 -1.5894337852494758e+00 -4.6902932015130130e+00 -1.6849474626683176e+00 -1.3396743166362082e+00 5.0833141208524300e+00 1.6116922879771907e+00 1.6844245458233649e+00 2.9305026533210610e+00 1.4234944166381489e+00 1.4295222143898014e+00 -3.3023346761928680e+00 -1.6651080020660962e+00 -1.3876020274780361e+00 -1.3694638314529155e+00 -3.3160842103203816e+00 -1.5707799307902428e+00 1.6739477800425082e+00 3.3423907827637986e+00 1.4948340394052244e+00 1.4312585731542591e+00 2.6477244547495804e+00 1.4312585731542589e+00 -1.4737824310641547e+00 -2.1890251613699236e+00 -1.4737824310641550e+00 -1.7977064872718700e+00 -5.4637090911861996e+00 -1.7977064872718682e+00 1.6116922879771911e+00 4.9523966529197088e+00 1.6116922879771898e+00 1.4948340394052266e+00 3.3423907827638022e+00 1.6739477800425080e+00 -1.5707799307902435e+00 -3.3160842103203847e+00 -1.3694638314529159e+00 -1.3876020274780363e+00 -1.6651080020660978e+00 -3.3023346761928618e+00 1.4295222143898019e+00 1.4234944166381485e+00 2.9305026533210556e+00 1.2755154414759402e+00 1.7042370279574235e+00 2.1142107199731557e+00 -1.5894337852494755e+00 -1.4246407177370570e+00 -2.4623535631941156e+00 -1.3396743166362086e+00 -1.6849474626683174e+00 -4.6902932015130121e+00 1.6844245458233649e+00 1.6116922879771902e+00 5.0833141208524291e+00 1.4282014698305818e+00 1.5957553502699422e+00 3.3133106967193293e+00 -1.5009535421559679e+00 -1.5604829003712308e+00 -2.9863567499659793e+00 -1.8470661985629666e+00 -1.3377599149074098e+00 -1.2223675969962071e+00 2.1173688574985969e+00 1.4440708348471654e+00 1.1281807753095063e+00 2.8611497815609859e+00 1.5807942087434579e+00 1.2688115207932851e+00 -3.1257699492683182e+00 -1.4130959263478282e+00 -1.5066308118680358e+00 -2.6734153151793096e+00 -1.5457281487174948e+00 -1.0370289657288239e+00 2.9305026533210610e+00 1.4948340394052264e+00 1.4282014698305818e+00 4.6091315711355678e+00 1.6035557047089180e+00 1.4968686943669185e+00 -4.8719014005056156e+00 -1.8266707977320333e+00 -1.5560350857072245e+00 -1.3792426510952305e+00 -2.7413583094526408e+00 -1.7146614980338764e+00 1.6557552623299698e+00 2.7458619364754391e+00 1.4440708348471649e+00 1.6664354972920969e+00 4.0858385384985025e+00 1.8975731212967617e+00 -1.7407851072333496e+00 -3.4630911210573938e+00 -1.8550031965939571e+00 -1.4217766790735276e+00 -4.0115014554383333e+00 -1.5704098278811482e+00 1.4234944166381489e+00 3.3423907827638022e+00 1.5957553502699422e+00 1.6035557047089182e+00 5.6982134644087843e+00 2.0882604570421899e+00 -1.8074364435670254e+00 -5.6563538361981580e+00 -1.8855852409470768e+00 -1.2999069779038317e+00 -1.7685532253231064e+00 -2.4798381327219952e+00 1.4822393588123748e+00 1.6557552623299681e+00 2.1173688574985956e+00 1.3245969641682125e+00 1.8760593307767033e+00 3.2043898482804511e+00 -1.7054599176981693e+00 -1.7141816508015182e+00 -3.5781466399364552e+00 -1.1925969203547031e+00 -1.9325280761832677e+00 -3.0049620533909507e+00 1.4295222143898014e+00 1.6739477800425075e+00 3.3133106967193293e+00 1.4968686943669185e+00 2.0882604570421899e+00 5.4081633236246853e+00 -1.5352634157806033e+00 -1.8787598778834762e+00 -4.9802859000736603e+00 2.1034092806236977e+00 1.6084928999173993e+00 1.3953844505115167e+00 -2.4798381327219960e+00 -1.7146614980338752e+00 -1.2223675969962065e+00 -3.1658572028546548e+00 -1.9650742689860281e+00 -1.3261955653158883e+00 3.4764136375516346e+00 1.7245251590974751e+00 1.5790363546644146e+00 2.9230042281888196e+00 1.6976321849872473e+00 1.0954370460685987e+00 -3.3023346761928685e+00 -1.5707799307902435e+00 -1.5009535421559679e+00 -4.8719014005056174e+00 -1.8074364435670263e+00 -1.5352634157806033e+00 5.3171042659109826e+00 2.0273018973750503e+00 1.5149222690041355e+00 1.4864756613878660e+00 2.7113298586977370e+00 1.6084928999173975e+00 -1.7685532253231053e+00 -2.7413583094526390e+00 -1.3377599149074075e+00 -1.7594539966231992e+00 -4.1123027377880428e+00 -1.6212993508916840e+00 1.7849195790563721e+00 3.4616798888404130e+00 1.6283592639288851e+00 1.7210888839251455e+00 3.9355189204039793e+00 1.4874523964110846e+00 -1.6651080020660962e+00 -3.3160842103203851e+00 -1.5604829003712306e+00 -1.8266707977320336e+00 -5.6563538361981580e+00 -1.8787598778834762e+00 2.0273018973750503e+00 5.7175704258170938e+00 1.6739974837964311e+00 1.1970254051692286e+00 1.4864756613878671e+00 2.1034092806236968e+00 -1.2999069779038313e+00 -1.3792426510952294e+00 -1.8470661985629659e+00 -1.2417648865552176e+00 -1.6832635080825802e+00 -2.8816526900737709e+00 1.6084608965373468e+00 1.5998142213298823e+00 3.1532169738795428e+00 1.1649004069335982e+00 1.5572678650636211e+00 2.7064763717823306e+00 -1.3876020274780361e+00 -1.3694638314529159e+00 -2.9863567499659793e+00 -1.5560350857072245e+00 -1.8855852409470768e+00 -4.9802859000736612e+00 1.5149222690041355e+00 1.6739974837964313e+00 4.7322589123908063e+00 1128 1129 1130 1155 1156 1157 1242 1243 1244 1194 1195 1196 1131 1132 1133 1158 1159 1160 1173 1174 1175 1161 1162 1163 4.6472797587584065e+00 1.6376339772069033e+00 1.4847500572385548e+00 -4.8956084196347529e+00 -1.8482199207717218e+00 -1.5294918789071399e+00 -2.7828072250317204e+00 -1.6440064382187787e+00 -1.2048776840294158e+00 3.0602408304310167e+00 1.5602525650018491e+00 1.5787259992876996e+00 2.6836173148137679e+00 1.5242362556819380e+00 1.1428502824131028e+00 -2.9685306224533861e+00 -1.3423951696540617e+00 -1.3679848603049398e+00 -1.8055624306520865e+00 -1.3440009379271898e+00 -1.2739543527584762e+00 2.0613707937687553e+00 1.4564996686810621e+00 1.1699824370606144e+00 1.6376339772069028e+00 5.6296219559381715e+00 1.9978735298993602e+00 -1.8484622453161745e+00 -5.5616475855926488e+00 -1.7979768625370793e+00 -1.5844083429987033e+00 -4.0138359804385573e+00 -1.7231688562537777e+00 1.5972321341762881e+00 3.3552553988494100e+00 1.7533273993860221e+00 1.4636099561824294e+00 3.9089554892219729e+00 1.7039683567139599e+00 -1.5365180138265560e+00 -3.2902831012808273e+00 -1.6445553872431646e+00 -1.3105161631828286e+00 -2.6925266587241827e+00 -1.7459678486463830e+00 1.5814286977586427e+00 2.6644604820266635e+00 1.4564996686810610e+00 1.4847500572385548e+00 1.9978735298993602e+00 5.2423988695527246e+00 -1.5076723430248544e+00 -1.7702816773176415e+00 -4.7895208250314578e+00 -1.2939783839850016e+00 -1.9336661673547919e+00 -3.0699743332989056e+00 1.5531538811331125e+00 1.6879716578821435e+00 3.3899178883070475e+00 1.0709915152759482e+00 1.6665088301075233e+00 2.9034629433127579e+00 -1.4816273124920047e+00 -1.5452893068371076e+00 -3.2915102468551405e+00 -1.1984330260251075e+00 -1.6845455641381297e+00 -2.4461450897557824e+00 1.3728156118793535e+00 1.5814286977586454e+00 2.0613707937687562e+00 -4.8956084196347529e+00 -1.8484622453161741e+00 -1.5076723430248546e+00 5.3326879621635808e+00 2.0561203626373081e+00 1.4693772852392843e+00 3.1087287961458303e+00 1.8470031116877348e+00 1.2923992969646019e+00 -3.4941619951914289e+00 -1.6802899939394016e+00 -1.6819328554987687e+00 -2.9867291982854902e+00 -1.9084145500412844e+00 -1.1688963842329496e+00 3.3017444462935677e+00 1.6531213077303111e+00 1.4089449955133779e+00 2.0794834982644748e+00 1.6268898558878901e+00 1.4617343577977853e+00 -2.4461450897557819e+00 -1.7459678486463850e+00 -1.2739543527584762e+00 -1.8482199207717218e+00 -5.5616475855926497e+00 -1.7702816773176415e+00 2.0561203626373086e+00 5.6013477187525105e+00 1.5677363051466187e+00 1.8578360131945644e+00 3.9835262168836625e+00 1.6250951372588205e+00 -1.8183646269438751e+00 -3.3552244561334912e+00 -1.7054849357242383e+00 -1.5453236561463066e+00 -3.9831453074830212e+00 -1.3924876343941124e+00 1.5679589008733323e+00 3.3137791523029096e+00 1.3925338870698538e+00 1.4145384912948273e+00 2.6938909199942644e+00 1.6268898558878913e+00 -1.6845455641381299e+00 -2.6925266587241854e+00 -1.3440009379271907e+00 -1.5294918789071399e+00 -1.7979768625370793e+00 -4.7895208250314578e+00 1.4693772852392850e+00 1.5677363051466184e+00 4.5264263449930819e+00 1.2349197936568264e+00 1.5470588897834294e+00 2.7650273044926772e+00 -1.4783557324749637e+00 -1.3770416450699838e+00 -3.0366358671973357e+00 -1.0158496400250554e+00 -1.5189010882126699e+00 -2.6529124916553473e+00 1.4122194021236796e+00 1.4751020727776885e+00 2.9136944667859943e+00 1.1056137964124755e+00 1.4145384912948273e+00 2.0794834982644752e+00 -1.1984330260251075e+00 -1.3105161631828306e+00 -1.8055624306520868e+00 -2.7828072250317204e+00 -1.5844083429987033e+00 -1.2939783839850016e+00 3.1087287961458312e+00 1.8578360131945644e+00 1.2349197936568264e+00 4.6822270763196174e+00 1.9936244105336307e+00 1.3343703112130769e+00 -4.9427050018765462e+00 -1.9403299809277843e+00 -1.6462809345793576e+00 -1.8326617804981578e+00 -1.6304835495031154e+00 -9.6551652751048644e-01 2.0721651637472052e+00 1.4018351686963666e+00 1.2489641282697568e+00 2.7650273044926759e+00 1.6250951372588194e+00 1.2923992969646019e+00 -3.0699743332989033e+00 -1.7231688562537786e+00 -1.2048776840294160e+00 -1.6440064382187785e+00 -4.0138359804385573e+00 -1.9336661673547921e+00 1.8470031116877348e+00 3.9835262168836629e+00 1.5470588897834294e+00 1.9936244105336307e+00 6.3439407134590713e+00 1.9936244105336309e+00 -2.0052306404717721e+00 -5.5159777760013275e+00 -2.0052306404717717e+00 -1.4846463870724131e+00 -3.3672208571397313e+00 -1.4846463870724127e+00 1.6798632211129596e+00 2.5998774467917811e+00 1.6798632211129607e+00 1.5470588897834290e+00 3.9835262168836603e+00 1.8470031116877355e+00 -1.9336661673547919e+00 -4.0138359804385573e+00 -1.6440064382187791e+00 -1.2048776840294160e+00 -1.7231688562537772e+00 -3.0699743332989056e+00 1.2923992969646019e+00 1.6250951372588203e+00 2.7650273044926772e+00 1.3343703112130769e+00 1.9936244105336305e+00 4.6822270763196165e+00 -1.6462809345793572e+00 -1.9403299809277845e+00 -4.9427050018765462e+00 -9.6551652751048656e-01 -1.6304835495031154e+00 -1.8326617804981580e+00 1.2489641282697561e+00 1.4018351686963666e+00 2.0721651637472056e+00 1.2349197936568259e+00 1.8578360131945633e+00 3.1087287961458299e+00 -1.2939783839850012e+00 -1.5844083429987046e+00 -2.7828072250317191e+00 3.0602408304310171e+00 1.5972321341762878e+00 1.5531538811331125e+00 -3.4941619951914289e+00 -1.8183646269438749e+00 -1.4783557324749637e+00 -4.9427050018765470e+00 -2.0052306404717721e+00 -1.6462809345793572e+00 5.4427666220331714e+00 1.8266327532430331e+00 2.0324281312690284e+00 2.0121869541560726e+00 1.7967848844371741e+00 1.2136964848056824e+00 -2.4316094306619966e+00 -1.4448969681026340e+00 -1.5714349739424331e+00 -3.0366358671973330e+00 -1.7054849357242370e+00 -1.6819328554987689e+00 3.3899178883070444e+00 1.7533273993860243e+00 1.5787259992876996e+00 1.5602525650018486e+00 3.3552553988494100e+00 1.6879716578821431e+00 -1.6802899939394016e+00 -3.3552244561334912e+00 -1.3770416450699838e+00 -1.9403299809277847e+00 -5.5159777760013275e+00 -1.9403299809277845e+00 1.8266327532430329e+00 5.0586673527134671e+00 1.8266327532430329e+00 1.3189867224492529e+00 2.5960626639975652e+00 1.3189867224492531e+00 -1.3961820786391073e+00 -2.1388141261415430e+00 -1.3961820786391077e+00 -1.3770416450699832e+00 -3.3552244561334881e+00 -1.6802899939394016e+00 1.6879716578821422e+00 3.3552553988494087e+00 1.5602525650018486e+00 1.5787259992876996e+00 1.7533273993860226e+00 3.3899178883070475e+00 -1.6819328554987687e+00 -1.7054849357242383e+00 -3.0366358671973352e+00 -1.6462809345793574e+00 -2.0052306404717712e+00 -4.9427050018765470e+00 2.0324281312690280e+00 1.8266327532430329e+00 5.4427666220331705e+00 1.2136964848056826e+00 1.7967848844371743e+00 2.0121869541560726e+00 -1.5714349739424327e+00 -1.4448969681026340e+00 -2.4316094306619975e+00 -1.4783557324749634e+00 -1.8183646269438738e+00 -3.4941619951914271e+00 1.5531538811331120e+00 1.5972321341762898e+00 3.0602408304310140e+00 2.6836173148137674e+00 1.4636099561824294e+00 1.0709915152759482e+00 -2.9867291982854902e+00 -1.5453236561463066e+00 -1.0158496400250554e+00 -1.8326617804981578e+00 -1.4846463870724131e+00 -9.6551652751048667e-01 2.0121869541560731e+00 1.3189867224492529e+00 1.2136964848056826e+00 4.6167993153555074e+00 1.7286966232365528e+00 1.0481901651804570e+00 -4.7437630571991107e+00 -1.7928039809693648e+00 -1.3254658959066992e+00 -2.6529124916553459e+00 -1.3924876343941119e+00 -1.1688963842329498e+00 2.9034629433127561e+00 1.7039683567139612e+00 1.1428502824131028e+00 1.5242362556819380e+00 3.9089554892219733e+00 1.6665088301075233e+00 -1.9084145500412844e+00 -3.9831453074830212e+00 -1.5189010882126699e+00 -1.6304835495031154e+00 -3.3672208571397313e+00 -1.6304835495031154e+00 1.7967848844371743e+00 2.5960626639975652e+00 1.7967848844371743e+00 1.7286966232365533e+00 6.4296350148134742e+00 1.7286966232365528e+00 -1.6584274057061175e+00 -5.5100971851492124e+00 -1.6584274057061188e+00 -1.5189010882126697e+00 -3.9831453074830185e+00 -1.9084145500412846e+00 1.6665088301075230e+00 3.9089554892219733e+00 1.5242362556819382e+00 1.1428502824131030e+00 1.7039683567139599e+00 2.9034629433127579e+00 -1.1688963842329496e+00 -1.3924876343941124e+00 -2.6529124916553477e+00 -9.6551652751048644e-01 -1.4846463870724127e+00 -1.8326617804981578e+00 1.2136964848056824e+00 1.3189867224492531e+00 2.0121869541560731e+00 1.0481901651804573e+00 1.7286966232365530e+00 4.6167993153555065e+00 -1.3254658959066981e+00 -1.7928039809693641e+00 -4.7437630571991107e+00 -1.0158496400250552e+00 -1.5453236561463055e+00 -2.9867291982854880e+00 1.0709915152759479e+00 1.4636099561824307e+00 2.6836173148137656e+00 -2.9685306224533861e+00 -1.5365180138265560e+00 -1.4816273124920045e+00 3.3017444462935677e+00 1.5679589008733323e+00 1.4122194021236796e+00 2.0721651637472052e+00 1.6798632211129596e+00 1.2489641282697561e+00 -2.4316094306619966e+00 -1.3961820786391073e+00 -1.5714349739424325e+00 -4.7437630571991090e+00 -1.6584274057061177e+00 -1.3254658959066978e+00 5.1478092803428659e+00 1.5953268763588020e+00 1.6763845167392617e+00 2.9136944667859912e+00 1.3925338870698523e+00 1.4089449955133773e+00 -3.2915102468551360e+00 -1.6445553872431657e+00 -1.3679848603049392e+00 -1.3423951696540617e+00 -3.2902831012808273e+00 -1.5452893068371076e+00 1.6531213077303111e+00 3.3137791523029096e+00 1.4751020727776885e+00 1.4018351686963666e+00 2.5998774467917816e+00 1.4018351686963666e+00 -1.4448969681026338e+00 -2.1388141261415425e+00 -1.4448969681026340e+00 -1.7928039809693650e+00 -5.5100971851492115e+00 -1.7928039809693641e+00 1.5953268763588020e+00 5.0020417624548106e+00 1.5953268763588020e+00 1.4751020727776876e+00 3.3137791523029061e+00 1.6531213077303109e+00 -1.5452893068371070e+00 -3.2902831012808273e+00 -1.3423951696540612e+00 -1.3679848603049400e+00 -1.6445553872431646e+00 -3.2915102468551405e+00 1.4089449955133779e+00 1.3925338870698538e+00 2.9136944667859943e+00 1.2489641282697566e+00 1.6798632211129607e+00 2.0721651637472056e+00 -1.5714349739424334e+00 -1.3961820786391077e+00 -2.4316094306619975e+00 -1.3254658959066989e+00 -1.6584274057061186e+00 -4.7437630571991098e+00 1.6763845167392619e+00 1.5953268763588020e+00 5.1478092803428677e+00 1.4122194021236798e+00 1.5679589008733321e+00 3.3017444462935650e+00 -1.4816273124920047e+00 -1.5365180138265591e+00 -2.9685306224533847e+00 -1.8055624306520865e+00 -1.3105161631828286e+00 -1.1984330260251077e+00 2.0794834982644748e+00 1.4145384912948276e+00 1.1056137964124755e+00 2.7650273044926759e+00 1.5470588897834290e+00 1.2349197936568261e+00 -3.0366358671973335e+00 -1.3770416450699832e+00 -1.4783557324749634e+00 -2.6529124916553459e+00 -1.5189010882126697e+00 -1.0158496400250552e+00 2.9136944667859912e+00 1.4751020727776876e+00 1.4122194021236798e+00 4.5264263449930731e+00 1.5677363051466169e+00 1.4693772852392843e+00 -4.7895208250314489e+00 -1.7979768625370800e+00 -1.5294918789071392e+00 -1.3440009379271898e+00 -2.6925266587241827e+00 -1.6845455641381295e+00 1.6268898558878899e+00 2.6938909199942644e+00 1.4145384912948273e+00 1.6250951372588194e+00 3.9835262168836603e+00 1.8578360131945630e+00 -1.7054849357242370e+00 -3.3552244561334881e+00 -1.8183646269438740e+00 -1.3924876343941119e+00 -3.9831453074830176e+00 -1.5453236561463055e+00 1.3925338870698518e+00 3.3137791523029061e+00 1.5679589008733321e+00 1.5677363051466164e+00 5.6013477187524980e+00 2.0561203626373059e+00 -1.7702816773176400e+00 -5.5616475855926399e+00 -1.8482199207717196e+00 -1.2739543527584762e+00 -1.7459678486463828e+00 -2.4461450897557824e+00 1.4617343577977853e+00 1.6268898558878913e+00 2.0794834982644752e+00 1.2923992969646019e+00 1.8470031116877355e+00 3.1087287961458299e+00 -1.6819328554987689e+00 -1.6802899939394016e+00 -3.4941619951914271e+00 -1.1688963842329501e+00 -1.9084145500412846e+00 -2.9867291982854880e+00 1.4089449955133773e+00 1.6531213077303111e+00 3.3017444462935650e+00 1.4693772852392843e+00 2.0561203626373059e+00 5.3326879621635701e+00 -1.5076723430248538e+00 -1.8484622453161763e+00 -4.8956084196347440e+00 2.0613707937687553e+00 1.5814286977586427e+00 1.3728156118793535e+00 -2.4461450897557819e+00 -1.6845455641381297e+00 -1.1984330260251075e+00 -3.0699743332989033e+00 -1.9336661673547915e+00 -1.2939783839850012e+00 3.3899178883070435e+00 1.6879716578821420e+00 1.5531538811331120e+00 2.9034629433127570e+00 1.6665088301075230e+00 1.0709915152759479e+00 -3.2915102468551360e+00 -1.5452893068371070e+00 -1.4816273124920047e+00 -4.7895208250314489e+00 -1.7702816773176400e+00 -1.5076723430248538e+00 5.2423988695527157e+00 1.9978735298993615e+00 1.4847500572385535e+00 1.4564996686810623e+00 2.6644604820266635e+00 1.5814286977586454e+00 -1.7459678486463850e+00 -2.6925266587241863e+00 -1.3105161631828304e+00 -1.7231688562537784e+00 -4.0138359804385582e+00 -1.5844083429987048e+00 1.7533273993860241e+00 3.3552553988494092e+00 1.5972321341762898e+00 1.7039683567139612e+00 3.9089554892219729e+00 1.4636099561824307e+00 -1.6445553872431657e+00 -3.2902831012808269e+00 -1.5365180138265591e+00 -1.7979768625370796e+00 -5.5616475855926399e+00 -1.8484622453161761e+00 1.9978735298993611e+00 5.6296219559381662e+00 1.6376339772069040e+00 1.1699824370606144e+00 1.4564996686810607e+00 2.0613707937687562e+00 -1.2739543527584762e+00 -1.3440009379271907e+00 -1.8055624306520868e+00 -1.2048776840294160e+00 -1.6440064382187791e+00 -2.7828072250317186e+00 1.5787259992876996e+00 1.5602525650018486e+00 3.0602408304310145e+00 1.1428502824131030e+00 1.5242362556819382e+00 2.6836173148137661e+00 -1.3679848603049389e+00 -1.3423951696540612e+00 -2.9685306224533847e+00 -1.5294918789071390e+00 -1.8482199207717196e+00 -4.8956084196347440e+00 1.4847500572385532e+00 1.6376339772069035e+00 4.6472797587583967e+00 735 736 737 1194 1195 1196 1206 1207 1208 747 748 749 1095 1096 1097 1161 1162 1163 1164 1165 1166 1098 1099 1100 4.8006364913202129e+00 1.4835014128315793e+00 1.3300127831460453e+00 -4.9970385336609242e+00 -1.7837360500519805e+00 -1.4726721901324542e+00 -2.6675391749177160e+00 -1.4411963417372211e+00 -1.0874415741110417e+00 2.8978204503525999e+00 1.5294029875957411e+00 1.4574860844888422e+00 2.5564694588517471e+00 1.3481103191127666e+00 1.0439687551918031e+00 -2.8008217198678578e+00 -1.3026966776144484e+00 -1.2550179155358763e+00 -1.5497958856349727e+00 -1.1955117472556043e+00 -1.1086229422186580e+00 1.7602689135569094e+00 1.3621260971191675e+00 1.0922869991713398e+00 1.4835014128315793e+00 7.1647538871739265e+00 2.7647025439737787e+00 -1.7758561966439408e+00 -7.1719587129274895e+00 -2.5693026339927796e+00 -1.3943944912564696e+00 -5.1873995076525636e+00 -2.3858472277134206e+00 1.5448507964791982e+00 4.5454759818857591e+00 2.4433420286341323e+00 1.2856144742407840e+00 4.9633665924212549e+00 2.3460219230995234e+00 -1.5197843426504938e+00 -4.3488187406710956e+00 -2.2981858818054119e+00 -1.1519799618219291e+00 -3.5454230795377137e+00 -2.3521807864989430e+00 1.5280483088212726e+00 3.5800035793079226e+00 2.0514500343031217e+00 1.3300127831460451e+00 2.7647025439737787e+00 6.5679969927239386e+00 -1.4572342334809654e+00 -2.5524148267557312e+00 -6.0685645709955169e+00 -1.1529521598122336e+00 -2.6297418524481833e+00 -3.9968818861301560e+00 1.4399473162387282e+00 2.3938768744012342e+00 4.3174388231158396e+00 9.8127712362704678e-01 2.3153606639837068e+00 3.7454723557974088e+00 -1.4190483533078209e+00 -2.2177234883117976e+00 -4.1397601767426950e+00 -1.0436635152799156e+00 -2.2980274403896335e+00 -3.1374027640878537e+00 1.3216610388691157e+00 2.2239675255466271e+00 2.7117012263190357e+00 -4.9970385336609233e+00 -1.7758561966439406e+00 -1.4572342334809654e+00 5.4022370595009592e+00 2.0884823009178679e+00 1.5123501868452642e+00 2.9364915855589206e+00 1.7418397165329733e+00 1.2492600059182446e+00 -3.3000710094034105e+00 -1.7606313419925319e+00 -1.6307812480341741e+00 -2.8075764938453873e+00 -1.7987554874038878e+00 -1.1924380881862229e+00 3.1158851575895090e+00 1.6910065334676556e+00 1.4154445035284382e+00 1.7719041595012388e+00 1.5652951750841138e+00 1.3883516138299941e+00 -2.1218319252409064e+00 -1.7513806999622508e+00 -1.2849527404205805e+00 -1.7837360500519805e+00 -7.1719587129274895e+00 -2.5524148267557312e+00 2.0884823009178684e+00 7.2873759021438351e+00 2.3423217934912675e+00 1.7510593491810744e+00 5.2420355273809980e+00 2.3120063192938032e+00 -1.8624553446331671e+00 -4.6171363365937266e+00 -2.4153061230732513e+00 -1.4412171323847889e+00 -5.1082775797486066e+00 -2.0643407217705243e+00 1.6377958299946680e+00 4.4418325944273942e+00 2.0695806716247693e+00 1.3166731185437175e+00 3.6144782822619730e+00 2.2742998748593291e+00 -1.7066020715673924e+00 -3.6883496769443775e+00 -1.9661469876696642e+00 -1.4726721901324540e+00 -2.5693026339927796e+00 -6.0685645709955169e+00 1.5123501868452647e+00 2.3423217934912670e+00 5.7498871602282229e+00 1.2158212885213260e+00 2.2416370976062847e+00 3.6438238583523024e+00 -1.4836845786894999e+00 -2.0687400559256925e+00 -3.9340371170771116e+00 -9.8726847329900791e-01 -2.1579292021441523e+00 -3.4351354127346014e+00 1.4061620511817285e+00 2.1256972565352243e+00 3.7300238425723444e+00 1.0374546886941660e+00 2.0148780378346278e+00 2.7354423978912115e+00 -1.2281629731215238e+00 -1.9285622934047808e+00 -2.4214401582368534e+00 -2.6675391749177160e+00 -1.3943944912564699e+00 -1.1529521598122336e+00 2.9364915855589206e+00 1.7510593491810746e+00 1.2158212885213262e+00 4.8865253003856228e+00 1.7425290296261333e+00 1.2230391938179686e+00 -5.1082776562258694e+00 -1.8706582614542788e+00 -1.5343861435110653e+00 -1.5692357766592404e+00 -1.3925488917404762e+00 -9.0547469197221009e-01 1.7792781665825599e+00 1.3304614277549749e+00 1.1474601887130664e+00 2.6351808963557186e+00 1.4158853152595425e+00 1.1393113361805596e+00 -2.8924233410799962e+00 -1.5823334773705011e+00 -1.1328190119374120e+00 -1.4411963417372209e+00 -5.1873995076525627e+00 -2.6297418524481837e+00 1.7418397165329738e+00 5.2420355273809971e+00 2.2416370976062847e+00 1.7425290296261338e+00 8.0661837279703477e+00 2.7622006038660945e+00 -1.9021363409127319e+00 -7.2934651614140869e+00 -2.7629474243561374e+00 -1.2827156802823869e+00 -4.2582272238062204e+00 -2.1104788607546991e+00 1.6182678960101260e+00 3.5421020171497077e+00 2.3063033129137147e+00 1.3432834827783942e+00 5.1000438831130994e+00 2.4878904662207333e+00 -1.8198717620152876e+00 -5.2112732627412850e+00 -2.2948633430478100e+00 -1.0874415741110415e+00 -2.3858472277134206e+00 -3.9968818861301560e+00 1.2492600059182446e+00 2.3120063192938032e+00 3.6438238583523024e+00 1.2230391938179686e+00 2.7622006038660940e+00 6.0491115143046095e+00 -1.5414037655745372e+00 -2.7291941672726172e+00 -6.3355621282137058e+00 -8.7975532742180129e-01 -2.2262581688210847e+00 -2.4683484836549039e+00 1.2145199483918074e+00 2.0013826445974296e+00 2.7368314291512186e+00 1.0866518784277472e+00 2.5040197253435763e+00 3.9901677462816125e+00 -1.2648703594483877e+00 -2.2383097292937828e+00 -3.6191420500909808e+00 2.8978204503525995e+00 1.5448507964791978e+00 1.4399473162387277e+00 -3.3000710094034100e+00 -1.8624553446331669e+00 -1.4836845786894999e+00 -5.1082776562258694e+00 -1.9021363409127319e+00 -1.5414037655745372e+00 5.5654768450853513e+00 1.9150198608326987e+00 1.9257134754445757e+00 1.7225167233556218e+00 1.6914886336939001e+00 1.1984729232249076e+00 -2.1097602156266779e+00 -1.5142411909906976e+00 -1.5140479398972719e+00 -2.8577465306108687e+00 -1.6412528489223730e+00 -1.5533733395656801e+00 3.1900413930732543e+00 1.7687264344531735e+00 1.5283759088187792e+00 1.5294029875957411e+00 4.5454759818857600e+00 2.3938768744012342e+00 -1.7606313419925319e+00 -4.6171363365937266e+00 -2.0687400559256925e+00 -1.8706582614542786e+00 -7.2934651614140860e+00 -2.7291941672726172e+00 1.9150198608326987e+00 6.7990695891657049e+00 2.6395846501974591e+00 1.2589188227596566e+00 3.5454518480982156e+00 1.9339363656016786e+00 -1.4841007418186150e+00 -3.0524922873485267e+00 -2.0450138916598455e+00 -1.3170633002759304e+00 -4.4882640802181202e+00 -2.3639915976045582e+00 1.7291119743532599e+00 4.5613604464247821e+00 2.2395418222623422e+00 1.4574860844888422e+00 2.4433420286341323e+00 4.3174388231158396e+00 -1.6307812480341741e+00 -2.4153061230732513e+00 -3.9340371170771116e+00 -1.5343861435110653e+00 -2.7629474243561378e+00 -6.3355621282137058e+00 1.9257134754445755e+00 2.6395846501974596e+00 6.8197309997221192e+00 1.0982381073625065e+00 2.3916721668352792e+00 2.6804164453515198e+00 -1.5073508726404925e+00 -2.0773413815937269e+00 -3.0900342947317805e+00 -1.3071166598600112e+00 -2.4675837927927851e+00 -4.3707823494102263e+00 1.4981972567498183e+00 2.2485798761490301e+00 3.9128296212433460e+00 2.5564694588517467e+00 1.2856144742407838e+00 9.8127712362704678e-01 -2.8075764938453878e+00 -1.4412171323847889e+00 -9.8726847329900791e-01 -1.5692357766592404e+00 -1.2827156802823867e+00 -8.7975532742180129e-01 1.7225167233556220e+00 1.2589188227596566e+00 1.0982381073625065e+00 4.6410779048184878e+00 1.4816871711340043e+00 9.8049144096828988e-01 -4.7509908681086053e+00 -1.6774972685374918e+00 -1.2787154649620576e+00 -2.5103377728786258e+00 -1.2076553724767272e+00 -1.0219236588309042e+00 2.7180768244660016e+00 1.5828649855469503e+00 1.1076562525559290e+00 1.3481103191127668e+00 4.9633665924212549e+00 2.3153606639837068e+00 -1.7987554874038878e+00 -5.1082775797486075e+00 -2.1579292021441523e+00 -1.3925488917404762e+00 -4.2582272238062204e+00 -2.2262581688210847e+00 1.6914886336939001e+00 3.5454518480982156e+00 2.3916721668352796e+00 1.4816871711340041e+00 7.7091431184419772e+00 2.4218287748286791e+00 -1.5864039648969175e+00 -6.8586273733102070e+00 -2.3637821041340135e+00 -1.2886632103641216e+00 -4.9669956357734240e+00 -2.5235554007216590e+00 1.5450854304647319e+00 4.9741662536770148e+00 2.1426632701732466e+00 1.0439687551918031e+00 2.3460219230995234e+00 3.7454723557974088e+00 -1.1924380881862229e+00 -2.0643407217705243e+00 -3.4351354127346014e+00 -9.0547469197221009e-01 -2.1104788607546996e+00 -2.4683484836549039e+00 1.1984729232249076e+00 1.9339363656016786e+00 2.6804164453515198e+00 9.8049144096828966e-01 2.4218287748286800e+00 5.6410715941573670e+00 -1.2577939279008494e+00 -2.4607564280713721e+00 -5.8143472820386437e+00 -9.1792674246434125e-01 -2.1521214649690061e+00 -3.7820744472918060e+00 1.0507003311386232e+00 2.0859104120357217e+00 3.4329452304136594e+00 -2.8008217198678578e+00 -1.5197843426504938e+00 -1.4190483533078206e+00 3.1158851575895077e+00 1.6377958299946680e+00 1.4061620511817285e+00 1.7792781665825597e+00 1.6182678960101260e+00 1.2145199483918074e+00 -2.1097602156266775e+00 -1.4841007418186150e+00 -1.5073508726404925e+00 -4.7509908681086053e+00 -1.5864039648969173e+00 -1.2577939279008494e+00 5.1262530483290352e+00 1.6627760567413905e+00 1.6298040250302515e+00 2.7272737669655531e+00 1.3499904918978562e+00 1.2922170713676207e+00 -3.0871173358635171e+00 -1.6785412252780147e+00 -1.3585099421222468e+00 -1.3026966776144486e+00 -4.3488187406710956e+00 -2.2177234883117976e+00 1.6910065334676556e+00 4.4418325944273942e+00 2.1256972565352243e+00 1.3304614277549749e+00 3.5421020171497077e+00 2.0013826445974296e+00 -1.5142411909906976e+00 -3.0524922873485272e+00 -2.0773413815937269e+00 -1.6774972685374918e+00 -6.8586273733102088e+00 -2.4607564280713721e+00 1.6627760567413903e+00 6.3178571778541261e+00 2.3097144450713074e+00 1.4087688542610695e+00 4.3252528953437759e+00 2.2746448096677772e+00 -1.5985777350824519e+00 -4.3671062834451746e+00 -1.9556178578948442e+00 -1.2550179155358763e+00 -2.2981858818054111e+00 -4.1397601767426950e+00 1.4154445035284382e+00 2.0695806716247693e+00 3.7300238425723444e+00 1.1474601887130662e+00 2.3063033129137147e+00 2.7368314291512186e+00 -1.5140479398972719e+00 -2.0450138916598455e+00 -3.0900342947317809e+00 -1.2787154649620573e+00 -2.3637821041340135e+00 -5.8143472820386437e+00 1.6298040250302515e+00 2.3097144450713074e+00 6.2125103782265443e+00 1.3089823109078096e+00 2.2120214809311873e+00 4.0992504558038929e+00 -1.4539097077843599e+00 -2.1906380329417092e+00 -3.7344743522408823e+00 -1.5497958856349727e+00 -1.1519799618219291e+00 -1.0436635152799156e+00 1.7719041595012388e+00 1.3166731185437175e+00 1.0374546886941660e+00 2.6351808963557186e+00 1.3432834827783942e+00 1.0866518784277472e+00 -2.8577465306108696e+00 -1.3170633002759302e+00 -1.3071166598600112e+00 -2.5103377728786258e+00 -1.2886632103641216e+00 -9.1792674246434136e-01 2.7272737669655531e+00 1.4087688542610697e+00 1.3089823109078098e+00 4.6180723965593398e+00 1.3712172965452938e+00 1.2596513680290649e+00 -4.8345510302573844e+00 -1.6822362796664945e+00 -1.4240333284545206e+00 -1.1955117472556043e+00 -3.5454230795377137e+00 -2.2980274403896335e+00 1.5652951750841138e+00 3.6144782822619730e+00 2.0148780378346274e+00 1.4158853152595423e+00 5.1000438831130994e+00 2.5040197253435768e+00 -1.6412528489223730e+00 -4.4882640802181211e+00 -2.4675837927927855e+00 -1.2076553724767269e+00 -4.9669956357734231e+00 -2.1521214649690066e+00 1.3499904918978562e+00 4.3252528953437759e+00 2.2120214809311873e+00 1.3712172965452938e+00 6.9760064555770240e+00 2.7449039541415541e+00 -1.6579683101321014e+00 -7.0150987207666162e+00 -2.5580905000995218e+00 -1.1086229422186578e+00 -2.3521807864989430e+00 -3.1374027640878537e+00 1.3883516138299941e+00 2.2742998748593291e+00 2.7354423978912115e+00 1.1393113361805596e+00 2.4878904662207337e+00 3.9901677462816121e+00 -1.5533733395656801e+00 -2.3639915976045582e+00 -4.3707823494102263e+00 -1.0219236588309042e+00 -2.5235554007216590e+00 -3.7820744472918060e+00 1.2922170713676207e+00 2.2746448096677772e+00 4.0992504558038929e+00 1.2596513680290649e+00 2.7449039541415536e+00 6.5094007192711771e+00 -1.3956114487919966e+00 -2.5420113200642360e+00 -6.0440017584580072e+00 1.7602689135569096e+00 1.5280483088212726e+00 1.3216610388691157e+00 -2.1218319252409068e+00 -1.7066020715673924e+00 -1.2281629731215238e+00 -2.8924233410799962e+00 -1.8198717620152873e+00 -1.2648703594483877e+00 3.1900413930732539e+00 1.7291119743532599e+00 1.4981972567498183e+00 2.7180768244660016e+00 1.5450854304647319e+00 1.0507003311386232e+00 -3.0871173358635171e+00 -1.5985777350824519e+00 -1.4539097077843599e+00 -4.8345510302573844e+00 -1.6579683101321012e+00 -1.3956114487919971e+00 5.2675365013456386e+00 1.9807741651579700e+00 1.4719958623887119e+00 1.3621260971191675e+00 3.5800035793079230e+00 2.2239675255466271e+00 -1.7513806999622508e+00 -3.6883496769443784e+00 -1.9285622934047808e+00 -1.5823334773705011e+00 -5.2112732627412841e+00 -2.2383097292937828e+00 1.7687264344531735e+00 4.5613604464247830e+00 2.2485798761490301e+00 1.5828649855469503e+00 4.9741662536770148e+00 2.0859104120357221e+00 -1.6785412252780147e+00 -4.3671062834451737e+00 -2.1906380329417092e+00 -1.6822362796664945e+00 -7.0150987207666162e+00 -2.5420113200642351e+00 1.9807741651579702e+00 7.1662976644877325e+00 2.3410635619731308e+00 1.0922869991713398e+00 2.0514500343031212e+00 2.7117012263190352e+00 -1.2849527404205805e+00 -1.9661469876696638e+00 -2.4214401582368530e+00 -1.1328190119374120e+00 -2.2948633430478096e+00 -3.6191420500909812e+00 1.5283759088187792e+00 2.2395418222623422e+00 3.9128296212433460e+00 1.1076562525559290e+00 2.1426632701732462e+00 3.4329452304136594e+00 -1.3585099421222466e+00 -1.9556178578948444e+00 -3.7344743522408823e+00 -1.4240333284545204e+00 -2.5580905000995218e+00 -6.0440017584580072e+00 1.4719958623887117e+00 2.3410635619731304e+00 5.7615822410506858e+00 1194 1195 1196 1242 1243 1244 1254 1255 1256 1206 1207 1208 1161 1162 1163 1173 1174 1175 1176 1177 1178 1164 1165 1166 4.5108103034673901e+00 1.3895242463873914e+00 1.2525702232849505e+00 -4.7046363921269654e+00 -1.6893525030272314e+00 -1.3986802565597607e+00 -2.4726145069453791e+00 -1.3531486154018131e+00 -1.0127326103728098e+00 2.7063448785244013e+00 1.4431885417951777e+00 1.3874518139883929e+00 2.4406064101840870e+00 1.2693873419916446e+00 9.8288738308770474e-01 -2.6872185768842174e+00 -1.2301366756128065e+00 -1.1977776366585464e+00 -1.4635998510600483e+00 -1.1190741732587046e+00 -1.0463140824432591e+00 1.6703077348407298e+00 1.2896118371263430e+00 1.0325951656733277e+00 1.3895242463873914e+00 6.7730626281342188e+00 2.6393646505276234e+00 -1.6914886218892682e+00 -6.7753020128692247e+00 -2.4434524470993026e+00 -1.3077164442839964e+00 -4.9030835519490399e+00 -2.2638858276075049e+00 1.4696819511186003e+00 4.2573006821847752e+00 2.3273455804968366e+00 1.2162185927384870e+00 4.7632832714474329e+00 2.2500649231901373e+00 -1.4519659919430394e+00 -4.1521815762329402e+00 -2.2026050732882632e+00 -1.0841457846302156e+00 -3.3750115580591427e+00 -2.2552754590179358e+00 1.4598920525020398e+00 3.4119321173439228e+00 1.9484436527984075e+00 1.2525702232849505e+00 2.6393646505276234e+00 6.2327821115755278e+00 -1.3894244693361921e+00 -2.4227704004810957e+00 -5.7236524150102728e+00 -1.0819941516512757e+00 -2.5166002868992035e+00 -3.7508886900322724e+00 1.3786778873417940e+00 2.2753844877313867e+00 4.0828864140828891e+00 9.2359000740751163e-01 2.2098233904786353e+00 3.5857975111040363e+00 -1.3641919349754172e+00 -2.1149798352695370e+00 -3.9922179329594281e+00 -9.8692796321705156e-01 -2.1959094382731443e+00 -3.0132514334809657e+00 1.2677004011456794e+00 2.1256874321853356e+00 2.5785444347204836e+00 -4.7046363921269654e+00 -1.6914886218892686e+00 -1.3894244693361921e+00 5.1248795479810738e+00 2.0042547929693604e+00 1.4409141885898440e+00 2.7421732019260054e+00 1.6684139758378036e+00 1.1824540407714343e+00 -3.1213902365000656e+00 -1.6828126241730794e+00 -1.5706448549933829e+00 -2.6952519699568942e+00 -1.7323448810935664e+00 -1.1336917615808315e+00 3.0110504608965423e+00 1.6263214998211124e+00 1.3620985065186813e+00 1.6866284580338518e+00 1.4973568060276425e+00 1.3357763452017610e+00 -2.0434530702535474e+00 -1.6897009475000064e+00 -1.2274819951713132e+00 -1.6893525030272318e+00 -6.7753020128692238e+00 -2.4227704004810953e+00 2.0042547929693613e+00 6.8938356177706543e+00 2.2115256763761142e+00 1.6636690984074036e+00 4.9564646969598369e+00 2.1862474428492913e+00 -1.7835229777196497e+00 -4.3296409670011773e+00 -2.2983820158392478e+00 -1.3736222683460140e+00 -4.9099215371743989e+00 -1.9569135585813551e+00 1.5685296820898444e+00 4.2438313175436368e+00 1.9658456903241297e+00 1.2487638878930003e+00 3.4419656031535162e+00 2.1727084700455368e+00 -1.6387197122667132e+00 -3.5212327183828460e+00 -1.8582613046933716e+00 -1.3986802565597607e+00 -2.4434524470993031e+00 -5.7236524150102719e+00 1.4409141885898442e+00 2.2115256763761137e+00 5.4085563956601872e+00 1.1431008813631685e+00 2.1237450984813271e+00 3.3973252527518074e+00 -1.4189071244633469e+00 -1.9500474561867684e+00 -3.6961919185061918e+00 -9.3211660224877901e-01 -2.0544406004738072e+00 -3.2754988676535985e+00 1.3534322408387522e+00 2.0287827484876209e+00 3.5748454323740209e+00 9.8390032864678434e-01 1.9128684317601499e+00 2.6042302303116851e+00 -1.1716436561666614e+00 -1.8289814513453344e+00 -2.2896141099276397e+00 -2.4726145069453795e+00 -1.3077164442839964e+00 -1.0819941516512754e+00 2.7421732019260054e+00 1.6636690984074036e+00 1.1431008813631687e+00 4.4906836958967453e+00 1.6341936423052112e+00 1.1322563419820895e+00 -4.7124917374844522e+00 -1.7631708988147878e+00 -1.4443501636415654e+00 -1.4819133089844523e+00 -1.3151553832560403e+00 -8.4355388892459482e-01 1.6888167414901489e+00 1.2596730566802958e+00 1.0867767062192986e+00 2.4772417379969403e+00 1.3310918187283136e+00 1.0699612215933294e+00 -2.7318958238955564e+00 -1.5025848897664007e+00 -1.0621969469404495e+00 -1.3531486154018131e+00 -4.9030835519490399e+00 -2.5166002868992035e+00 1.6684139758378036e+00 4.9564646969598378e+00 2.1237450984813266e+00 1.6341936423052110e+00 7.5639298713836816e+00 2.6094219269209820e+00 -1.8114576163505340e+00 -6.7794255860794710e+00 -2.6236154935231824e+00 -1.2127852223435138e+00 -4.0939971697072570e+00 -2.0068964462459653e+00 1.5538037200433683e+00 3.3720638666194733e+00 2.2111093295992661e+00 1.2668835259437161e+00 4.8518819872957586e+00 2.3783635372606602e+00 -1.7459034100342370e+00 -4.9678341145229865e+00 -2.1755276655938829e+00 -1.0127326103728098e+00 -2.2638858276075045e+00 -3.7508886900322724e+00 1.1824540407714343e+00 2.1862474428492908e+00 3.3973252527518074e+00 1.1322563419820895e+00 2.6094219269209820e+00 5.5847767858067598e+00 -1.4570994147148679e+00 -2.5753853291668882e+00 -5.8741564169911280e+00 -8.2126841427006625e-01 -2.1189040777390957e+00 -2.3332743317553217e+00 1.1550753297129088e+00 1.8988619172562016e+00 2.6031135282737310e+00 1.0205708131738451e+00 2.3874304870006475e+00 3.7787371993520615e+00 -1.1992560862825330e+00 -2.1237865395136355e+00 -3.4056333274056345e+00 2.7063448785244009e+00 1.4696819511186003e+00 1.3786778873417942e+00 -3.1213902365000656e+00 -1.7835229777196497e+00 -1.4189071244633469e+00 -4.7124917374844530e+00 -1.8114576163505336e+00 -1.4570994147148679e+00 5.1900051924739596e+00 1.8153399412791251e+00 1.8494504270950487e+00 1.6356128887491708e+00 1.6258278346040829e+00 1.1418268121479245e+00 -2.0338674137725876e+00 -1.4464291008393657e+00 -1.4654371631657945e+00 -2.7049118607185325e+00 -1.5653758079306230e+00 -1.4955563019087132e+00 3.0406982887281044e+00 1.6959357758383655e+00 1.4670448776679543e+00 1.4431885417951775e+00 4.2573006821847761e+00 2.2753844877313871e+00 -1.6828126241730794e+00 -4.3296409670011764e+00 -1.9500474561867682e+00 -1.7631708988147881e+00 -6.7794255860794701e+00 -2.5753853291668887e+00 1.8153399412791258e+00 6.2937940824516545e+00 2.4915431233411360e+00 1.1936541526811808e+00 3.3683443693751300e+00 1.8337903885877735e+00 -1.4167367742668067e+00 -2.8845672299287770e+00 -1.9465499390452097e+00 -1.2427952941662537e+00 -4.2368782410535157e+00 -2.2533564801513912e+00 1.6533329556654426e+00 4.3110728900513848e+00 2.1246212048899613e+00 1.3874518139883929e+00 2.3273455804968370e+00 4.0828864140828891e+00 -1.5706448549933829e+00 -2.2983820158392478e+00 -3.6961919185061918e+00 -1.4443501636415654e+00 -2.6236154935231819e+00 -5.8741564169911280e+00 1.8494504270950491e+00 2.4915431233411360e+00 6.3776730726293973e+00 1.0421478342049766e+00 2.2913797739721478e+00 2.5479260807539323e+00 -1.4564700114154332e+00 -1.9751888058889353e+00 -2.9705696256106311e+00 -1.2450553151441763e+00 -2.3515632928141308e+00 -4.1729655055341333e+00 1.4374702699061386e+00 2.1384811302553786e+00 3.7053978991758658e+00 2.4406064101840870e+00 1.2162185927384870e+00 9.2359000740751163e-01 -2.6952519699568942e+00 -1.3736222683460142e+00 -9.3211660224877879e-01 -1.4819133089844523e+00 -1.2127852223435138e+00 -8.2126841427006658e-01 1.6356128887491708e+00 1.1936541526811806e+00 1.0421478342049766e+00 4.5535447018376782e+00 1.4134041577435954e+00 9.2576709942340263e-01 -4.6590591590458770e+00 -1.6253138528244753e+00 -1.2292069695757590e+00 -2.4306858741800288e+00 -1.1396669832840123e+00 -9.6538513356026923e-01 2.6371463113963136e+00 1.5281114236347528e+00 1.0564721786189817e+00 1.2693873419916442e+00 4.7632832714474329e+00 2.2098233904786353e+00 -1.7323448810935664e+00 -4.9099215371743989e+00 -2.0544406004738067e+00 -1.3151553832560403e+00 -4.0939971697072570e+00 -2.1189040777390962e+00 1.6258278346040829e+00 3.3683443693751305e+00 2.2913797739721478e+00 1.4134041577435954e+00 7.5449836905346848e+00 2.3219563053559309e+00 -1.5138645407722837e+00 -6.6835488209947087e+00 -2.2613075833486267e+00 -1.2203542636722162e+00 -4.8043783653078531e+00 -2.4263877107704683e+00 1.4730997344547834e+00 4.8152345618269701e+00 2.0378805025252831e+00 9.8288738308770496e-01 2.2500649231901377e+00 3.5857975111040368e+00 -1.1336917615808315e+00 -1.9569135585813553e+00 -3.2754988676535981e+00 -8.4355388892459482e-01 -2.0068964462459657e+00 -2.3332743317553217e+00 1.1418268121479245e+00 1.8337903885877735e+00 2.5479260807539323e+00 9.2576709942340274e-01 2.3219563053559304e+00 5.5078090834153031e+00 -1.2013361315832780e+00 -2.3758539330176105e+00 -5.6806960343499080e+00 -8.6403613700754045e-01 -2.0561640834890298e+00 -3.6578501869579187e+00 9.9213662443721184e-01 1.9900164042001212e+00 3.3057867454434735e+00 -2.6872185768842169e+00 -1.4519659919430397e+00 -1.3641919349754172e+00 3.0110504608965423e+00 1.5685296820898444e+00 1.3534322408387522e+00 1.6888167414901489e+00 1.5538037200433683e+00 1.1550753297129086e+00 -2.0338674137725876e+00 -1.4167367742668067e+00 -1.4564700114154336e+00 -4.6590591590458770e+00 -1.5138645407722842e+00 -1.2013361315832780e+00 5.0491946871735536e+00 1.5991970176842638e+00 1.5842271378491048e+00 2.6476530925569781e+00 1.2789365706489235e+00 1.2360719432442910e+00 -3.0165698324145405e+00 -1.6178996834842703e+00 -1.3068085736709272e+00 -1.2301366756128067e+00 -4.1521815762329402e+00 -2.1149798352695370e+00 1.6263214998211124e+00 4.2438313175436360e+00 2.0287827484876209e+00 1.2596730566802958e+00 3.3720638666194738e+00 1.8988619172562016e+00 -1.4464291008393657e+00 -2.8845672299287770e+00 -1.9751888058889353e+00 -1.6253138528244750e+00 -6.6835488209947087e+00 -2.3758539330176109e+00 1.5991970176842638e+00 6.1519269723857581e+00 2.2157758588779362e+00 1.3512961458691046e+00 4.1623522102965884e+00 2.1810684906757487e+00 -1.5346080907781283e+00 -4.2098767396890313e+00 -1.8584664411214225e+00 -1.1977776366585466e+00 -2.2026050732882632e+00 -3.9922179329594281e+00 1.3620985065186813e+00 1.9658456903241297e+00 3.5748454323740209e+00 1.0867767062192986e+00 2.2111093295992656e+00 2.6031135282737310e+00 -1.4654371631657943e+00 -1.9465499390452097e+00 -2.9705696256106311e+00 -1.2292069695757588e+00 -2.2613075833486267e+00 -5.6806960343499080e+00 1.5842271378491051e+00 2.2157758588779357e+00 6.0961524925139221e+00 1.2632264181096682e+00 2.1144412562858754e+00 3.9837557964369750e+00 -1.4039069992966515e+00 -2.0967095394051083e+00 -3.6143836566786796e+00 -1.4635998510600481e+00 -1.0841457846302154e+00 -9.8692796321705156e-01 1.6866284580338515e+00 1.2487638878930005e+00 9.8390032864678412e-01 2.4772417379969403e+00 1.2668835259437159e+00 1.0205708131738451e+00 -2.7049118607185325e+00 -1.2427952941662539e+00 -1.2450553151441763e+00 -2.4306858741800288e+00 -1.2203542636722162e+00 -8.6403613700754056e-01 2.6476530925569781e+00 1.3512961458691046e+00 1.2632264181096682e+00 4.4647754801481216e+00 1.2953243254948859e+00 1.1972946391788706e+00 -4.6771011827772835e+00 -1.6149725427320227e+00 -1.3689727837403993e+00 -1.1190741732587046e+00 -3.3750115580591431e+00 -2.1959094382731443e+00 1.4973568060276425e+00 3.4419656031535166e+00 1.9128684317601494e+00 1.3310918187283136e+00 4.8518819872957586e+00 2.3874304870006471e+00 -1.5653758079306235e+00 -4.2368782410535157e+00 -2.3515632928141308e+00 -1.1396669832840123e+00 -4.8043783653078531e+00 -2.0561640834890298e+00 1.2789365706489235e+00 4.1623522102965884e+00 2.1144412562858754e+00 1.2953243254948861e+00 6.7267748241278742e+00 2.6357155080630643e+00 -1.5785925564264240e+00 -6.7667064604532285e+00 -2.4468188685334309e+00 -1.0463140824432591e+00 -2.2552754590179362e+00 -3.0132514334809652e+00 1.3357763452017608e+00 2.1727084700455368e+00 2.6042302303116855e+00 1.0699612215933294e+00 2.3783635372606593e+00 3.7787371993520620e+00 -1.4955563019087132e+00 -2.2533564801513912e+00 -4.1729655055341341e+00 -9.6538513356026923e-01 -2.4263877107704683e+00 -3.6578501869579187e+00 1.2360719432442910e+00 2.1810684906757487e+00 3.9837557964369750e+00 1.1972946391788706e+00 2.6357155080630648e+00 6.3120524235874882e+00 -1.3318486313060092e+00 -2.4328363561052164e+00 -5.8347085237151912e+00 1.6703077348407298e+00 1.4598920525020400e+00 1.2677004011456794e+00 -2.0434530702535474e+00 -1.6387197122667132e+00 -1.1716436561666614e+00 -2.7318958238955564e+00 -1.7459034100342370e+00 -1.1992560862825330e+00 3.0406982887281049e+00 1.6533329556654426e+00 1.4374702699061386e+00 2.6371463113963145e+00 1.4730997344547834e+00 9.9213662443721184e-01 -3.0165698324145405e+00 -1.5346080907781285e+00 -1.4039069992966515e+00 -4.6771011827772826e+00 -1.5785925564264240e+00 -1.3318486313060094e+00 5.1208675743757777e+00 1.9114990268832377e+00 1.4093480775628247e+00 1.2896118371263428e+00 3.4119321173439232e+00 2.1256874321853361e+00 -1.6897009475000064e+00 -3.5212327183828460e+00 -1.8289814513453344e+00 -1.5025848897664005e+00 -4.9678341145229865e+00 -2.1237865395136351e+00 1.6959357758383651e+00 4.3110728900513848e+00 2.1384811302553781e+00 1.5281114236347528e+00 4.8152345618269701e+00 1.9900164042001212e+00 -1.6178996834842703e+00 -4.2098767396890313e+00 -2.0967095394051078e+00 -1.6149725427320223e+00 -6.7667064604532268e+00 -2.4328363561052160e+00 1.9114990268832377e+00 6.9274104638258169e+00 2.2281289197284568e+00 1.0325951656733277e+00 1.9484436527984075e+00 2.5785444347204836e+00 -1.2274819951713132e+00 -1.8582613046933716e+00 -2.2896141099276393e+00 -1.0621969469404495e+00 -2.1755276655938833e+00 -3.4056333274056345e+00 1.4670448776679541e+00 2.1246212048899618e+00 3.7053978991758663e+00 1.0564721786189819e+00 2.0378805025252831e+00 3.3057867454434735e+00 -1.3068085736709274e+00 -1.8584664411214225e+00 -3.6143836566786796e+00 -1.3689727837403993e+00 -2.4468188685334309e+00 -5.8347085237151912e+00 1.4093480775628247e+00 2.2281289197284568e+00 5.5546105383873217e+00 747 748 749 1206 1207 1208 1218 1219 1220 759 760 761 1098 1099 1100 1164 1165 1166 1167 1168 1169 1101 1102 1103 4.7363760629425462e+00 8.9946853805068150e-01 8.0639860346274528e-01 -4.8195580253970993e+00 -1.2610308786483646e+00 -1.0534870461967825e+00 -2.4001305641561710e+00 -8.3747252452333709e-01 -6.4017505048917922e-01 2.5280664492605771e+00 1.0839636231894798e+00 1.0033022680427437e+00 2.3567351397685155e+00 8.0484372691732942e-01 6.3884263305584810e-01 -2.5095783744307765e+00 -8.9054112417739884e-01 -8.3506282309578972e-01 -1.2522910016227200e+00 -7.0138298754345885e-01 -6.4759291550282572e-01 1.3603803136351293e+00 9.0215162673506843e-01 7.2777433072323983e-01 8.9946853805068128e-01 8.2114610696139110e+00 3.3213827374236673e+00 -1.2512834503996957e+00 -8.3237811539226421e+00 -3.1673049845954364e+00 -8.1350953580247043e-01 -5.9129308052243772e+00 -2.8296094062609738e+00 1.0873648350073688e+00 5.3437158278438623e+00 2.9407912547098327e+00 7.6031296165752138e-01 5.6982970674580224e+00 2.8243957029139901e+00 -1.1367064976208445e+00 -5.1526951723975021e+00 -2.8001146112714941e+00 -6.6691342938082265e-01 -4.0997320060907221e+00 -2.7688399853228556e+00 1.1212665784882607e+00 4.2356651727194468e+00 2.4792992924032675e+00 8.0639860346274539e-01 3.3213827374236673e+00 7.5022992130272064e+00 -1.0396108881067192e+00 -3.1482745962040113e+00 -6.9758875606184514e+00 -6.8015324103838459e-01 -3.1116567939131361e+00 -4.5751087100069068e+00 9.9383685839131353e-01 2.9104105680389170e+00 4.9113165013190319e+00 5.9381792443504267e-01 2.7827792862842693e+00 4.3702571302383255e+00 -1.0482604037132579e+00 -2.7449652484554798e+00 -4.7825469854361051e+00 -6.0563953491316147e-01 -2.7232036748430395e+00 -3.6081894509614556e+00 9.7961068148242059e-01 2.7135277216688136e+00 3.1578598624383529e+00 -4.8195580253971002e+00 -1.2512834503996957e+00 -1.0396108881067192e+00 5.1408564972541644e+00 1.6467756547372754e+00 1.1951114246955628e+00 2.5550169218163630e+00 1.2173223149595831e+00 8.7682719266955766e-01 -2.8446345611344137e+00 -1.4112384458825700e+00 -1.2517820305514222e+00 -2.5118014459379547e+00 -1.3065230592071961e+00 -9.0188373660976440e-01 2.7578814932729356e+00 1.3459522534762367e+00 1.1102334550723465e+00 1.3756332752254992e+00 1.1392043296504579e+00 1.0145271428238591e+00 -1.6533941550994928e+00 -1.3802095973340900e+00 -1.0034225599934197e+00 -1.2610308786483648e+00 -8.3237811539226385e+00 -3.1482745962040113e+00 1.6467756547372749e+00 8.5590090648463022e+00 2.9658709523179132e+00 1.2186177738512456e+00 6.0888653295835189e+00 2.8000617197210635e+00 -1.4716049518873082e+00 -5.5283672780281696e+00 -2.9551846739366097e+00 -9.6459748661649636e-01 -5.9482542417689261e+00 -2.5910145933757529e+00 1.3206157192523775e+00 5.3469889332893157e+00 2.6170713212015988e+00 8.6372534510570442e-01 4.2655728733497078e+00 2.7533940177083425e+00 -1.3525011757944323e+00 -4.4600335273491041e+00 -2.4419241474325424e+00 -1.0534870461967825e+00 -3.1673049845954355e+00 -6.9758875606184514e+00 1.1951114246955625e+00 2.9658709523179141e+00 6.6305939523418811e+00 8.6298186544727340e-01 2.7579748499018728e+00 4.2040816451496079e+00 -1.1567059890004694e+00 -2.6108779050345183e+00 -4.5208215644106318e+00 -6.7260866234149230e-01 -2.6441137089216604e+00 -4.0285565445881382e+00 1.1068695214952704e+00 2.6622841798685868e+00 4.3558599892418410e+00 6.9285000273860620e-01 2.4575671017925855e+00 3.1921069777560436e+00 -9.7501111683796737e-01 -2.4214004853293427e+00 -2.8573768948721523e+00 -2.4001305641561719e+00 -8.1350953580247054e-01 -6.8015324103838459e-01 2.5550169218163639e+00 1.2186177738512456e+00 8.6298186544727373e-01 4.6531226959236873e+00 1.0253736586453273e+00 7.3397920941722572e-01 -4.7749651353643836e+00 -1.3081160499562587e+00 -1.0423465880350244e+00 -1.2631725248338279e+00 -8.0621701055921291e-01 -5.5057419621880488e-01 1.3841215151965072e+00 8.9754338213065665e-01 7.4954362044345890e-01 2.3515820872967588e+00 8.2878775766033941e-01 6.7324087158732249e-01 -2.5055749958789320e+00 -1.0424799759696262e+00 -7.4667154160306570e-01 -8.3747252452333720e-01 -5.9129308052243772e+00 -3.1116567939131361e+00 1.2173223149595833e+00 6.0888653295835189e+00 2.7579748499018732e+00 1.0253736586453273e+00 8.9877011622132770e+00 3.2540396377793712e+00 -1.3269865553574809e+00 -8.3163184362680393e+00 -3.2880965112060379e+00 -7.3961892011971242e-01 -4.8371700617986439e+00 -2.5557460090720054e+00 1.1977807886321852e+00 4.2233053761582280e+00 2.7722368890460185e+00 7.7947658122312447e-01 5.7565816228091000e+00 2.9156556030260896e+00 -1.3158753434596886e+00 -5.9900341874730607e+00 -2.7444076655621719e+00 -6.4017505048917933e-01 -2.8296094062609738e+00 -4.5751087100069068e+00 8.7682719266955778e-01 2.8000617197210631e+00 4.2040816451496079e+00 7.3397920941722572e-01 3.2540396377793721e+00 6.7414088661546323e+00 -1.0502283755507338e+00 -3.2647485711884476e+00 -7.0529202978931647e+00 -5.1860316933333217e-01 -2.6245983573590599e+00 -2.9006365224263657e+00 8.9095109170162146e-01 2.4466588976789394e+00 3.1930440467094892e+00 6.3410939590941329e-01 2.9230814938045029e+00 4.5002349748717005e+00 -9.2686029432457218e-01 -2.7048854141753944e+00 -4.1101040025589892e+00 2.5280664492605767e+00 1.0873648350073688e+00 9.9383685839131375e-01 -2.8446345611344137e+00 -1.4716049518873082e+00 -1.1567059890004696e+00 -4.7749651353643836e+00 -1.3269865553574809e+00 -1.0502283755507338e+00 5.1455657699244082e+00 1.5064133051174313e+00 1.4370719386789788e+00 1.3385271515831807e+00 1.2252035232572913e+00 8.8405437751430438e-01 -1.6463222247957576e+00 -1.2125748276020962e+00 -1.1612739193114239e+00 -2.4821871880732038e+00 -1.1879245613926932e+00 -1.1049920571343779e+00 2.7359497385995923e+00 1.3801092328574864e+00 1.1582371664124076e+00 1.0839636231894800e+00 5.3437158278438623e+00 2.9104105680389170e+00 -1.4112384458825702e+00 -5.5283672780281687e+00 -2.6108779050345183e+00 -1.3081160499562590e+00 -8.3163184362680393e+00 -3.2647485711884481e+00 1.5064133051174313e+00 7.8650834837767905e+00 3.2278188445550189e+00 8.4750610497578793e-01 4.2160890078659401e+00 2.4059693721318616e+00 -1.2061141159306255e+00 -3.7655012289686867e+00 -2.5576409336717476e+00 -8.7643999627869573e-01 -5.2129232922052520e+00 -2.8544807471715798e+00 1.3640255747654499e+00 5.3982219159835489e+00 2.7435493723404942e+00 1.0033022680427437e+00 2.9407912547098327e+00 4.9113165013190319e+00 -1.2517820305514222e+00 -2.9551846739366097e+00 -4.5208215644106318e+00 -1.0423465880350247e+00 -3.2880965112060379e+00 -7.0529202978931647e+00 1.4370719386789783e+00 3.2278188445550180e+00 7.5484367463971465e+00 7.0704423375935888e-01 2.8149727230774997e+00 3.1435305139652865e+00 -1.1595034044781189e+00 -2.5674576278735310e+00 -3.5610050513418221e+00 -8.3531212454219683e-01 -2.9120989309238072e+00 -4.8940001626695047e+00 1.1415257071256804e+00 2.7392549215976336e+00 4.4254633146336566e+00 2.3567351397685155e+00 7.6031296165752138e-01 5.9381792443504244e-01 -2.5118014459379547e+00 -9.6459748661649636e-01 -6.7260866234149230e-01 -1.2631725248338277e+00 -7.3961892011971242e-01 -5.1860316933333217e-01 1.3385271515831805e+00 8.4750610497578771e-01 7.0704423375935888e-01 4.5936403797233938e+00 8.7222387041728189e-01 6.0652722990371444e-01 -4.6239536096243024e+00 -1.1987636937676514e+00 -9.1672392319218299e-01 -2.3027605638571700e+00 -6.9158389807193277e-01 -5.9067430994130166e-01 2.4127854731781655e+00 1.1145210615252019e+00 7.9122067671019269e-01 8.0484372691732942e-01 5.6982970674580224e+00 2.7827792862842693e+00 -1.3065230592071964e+00 -5.9482542417689270e+00 -2.6441137089216604e+00 -8.0621701055921291e-01 -4.8371700617986439e+00 -2.6245983573590599e+00 1.2252035232572915e+00 4.2160890078659410e+00 2.8149727230774992e+00 8.7222387041728189e-01 8.6545139012972729e+00 2.9399376827954473e+00 -1.1256916460396220e+00 -7.9157051196066588e+00 -2.9173503194509589e+00 -7.3110113433346968e-01 -5.6129914052730845e+00 -2.9472984307768262e+00 1.0672617295475968e+00 5.7452208518260761e+00 2.5956711243512882e+00 6.3884263305584799e-01 2.8243957029139906e+00 4.3702571302383264e+00 -9.0188373660976406e-01 -2.5910145933757529e+00 -4.0285565445881382e+00 -5.5057419621880488e-01 -2.5557460090720054e+00 -2.9006365224263657e+00 8.8405437751430438e-01 2.4059693721318611e+00 3.1435305139652865e+00 6.0652722990371444e-01 2.9399376827954473e+00 6.4510013614267363e+00 -8.8342721330594953e-01 -2.9998856522800401e+00 -6.6624197016948719e+00 -5.3991771042174330e-01 -2.5863012015442917e+00 -4.3361479374243057e+00 7.4637861608239409e-01 2.5626446984307916e+00 3.9629717005033323e+00 -2.5095783744307765e+00 -1.1367064976208445e+00 -1.0482604037132577e+00 2.7578814932729356e+00 1.3206157192523775e+00 1.1068695214952704e+00 1.3841215151965072e+00 1.1977807886321852e+00 8.9095109170162146e-01 -1.6463222247957578e+00 -1.2061141159306255e+00 -1.1595034044781189e+00 -4.6239536096243024e+00 -1.1256916460396222e+00 -8.8342721330594964e-01 4.9271586005412722e+00 1.3459025484342362e+00 1.2723689764862594e+00 2.4232377356940926e+00 9.5359190851520648e-01 8.8885524429233898e-01 -2.7125451358539703e+00 -1.3493787052429125e+00 -1.0678538124781636e+00 -8.9054112417739884e-01 -5.1526951723975021e+00 -2.7449652484554798e+00 1.3459522534762367e+00 5.3469889332893157e+00 2.6622841798685872e+00 8.9754338213065665e-01 4.2233053761582280e+00 2.4466588976789394e+00 -1.2125748276020962e+00 -3.7655012289686867e+00 -2.5674576278735310e+00 -1.1987636937676516e+00 -7.9157051196066570e+00 -2.9998856522800410e+00 1.3459025484342362e+00 7.4188847399309052e+00 2.9053262713099799e+00 1.0009594945464841e+00 5.0603908421049608e+00 2.7389165430599172e+00 -1.2884780330404653e+00 -5.2156683705105618e+00 -2.4408773633083696e+00 -8.3506282309578972e-01 -2.8001146112714950e+00 -4.7825469854361042e+00 1.1102334550723469e+00 2.6170713212015988e+00 4.3558599892418410e+00 7.4954362044345890e-01 2.7722368890460189e+00 3.1930440467094892e+00 -1.1612739193114239e+00 -2.5576409336717472e+00 -3.5610050513418221e+00 -9.1672392319218310e-01 -2.9173503194509580e+00 -6.6624197016948719e+00 1.2723689764862591e+00 2.9053262713099799e+00 7.0769767741180019e+00 9.1774542182789043e-01 2.7000752165696587e+00 4.6684268649462446e+00 -1.1368308082305580e+00 -2.7196038337330553e+00 -4.2883359365427731e+00 -1.2522910016227200e+00 -6.6691342938082265e-01 -6.0563953491316147e-01 1.3756332752254992e+00 8.6372534510570442e-01 6.9285000273860642e-01 2.3515820872967583e+00 7.7947658122312447e-01 6.3410939590941329e-01 -2.4821871880732038e+00 -8.7643999627869573e-01 -8.3531212454219683e-01 -2.3027605638571704e+00 -7.3110113433346957e-01 -5.3991771042174330e-01 2.4232377356940931e+00 1.0009594945464841e+00 9.1774542182789043e-01 4.4705480289136617e+00 8.0076777370310914e-01 7.3079661202130408e-01 -4.5837623735769188e+00 -1.1704746345854335e+00 -9.9463206262011217e-01 -7.0138298754345885e-01 -4.0997320060907221e+00 -2.7232036748430399e+00 1.1392043296504579e+00 4.2655728733497078e+00 2.4575671017925855e+00 8.2878775766033941e-01 5.7565816228091000e+00 2.9230814938045029e+00 -1.1879245613926934e+00 -5.2129232922052520e+00 -2.9120989309238072e+00 -6.9158389807193277e-01 -5.6129914052730836e+00 -2.5863012015442917e+00 9.5359190851520637e-01 5.0603908421049608e+00 2.7000752165696587e+00 8.0076777370310892e-01 7.7936413232382487e+00 3.2040859001975663e+00 -1.1414603225210265e+00 -7.9505399579329588e+00 -3.0632059050531719e+00 -6.4759291550282572e-01 -2.7688399853228556e+00 -3.6081894509614556e+00 1.0145271428238591e+00 2.7533940177083425e+00 3.1921069777560436e+00 6.7324087158732249e-01 2.9156556030260896e+00 4.5002349748717005e+00 -1.1049920571343779e+00 -2.8544807471715798e+00 -4.8940001626695047e+00 -5.9067430994130166e-01 -2.9472984307768262e+00 -4.3361479374243057e+00 8.8885524429233920e-01 2.7389165430599167e+00 4.6684268649462437e+00 7.3079661202130408e-01 3.2040859001975663e+00 7.2138196417422487e+00 -9.6416058814631878e-01 -3.0414329007206535e+00 -6.7362509082609670e+00 1.3603803136351293e+00 1.1212665784882607e+00 9.7961068148242059e-01 -1.6533941550994933e+00 -1.3525011757944323e+00 -9.7501111683796760e-01 -2.5055749958789315e+00 -1.3158753434596886e+00 -9.2686029432457218e-01 2.7359497385995923e+00 1.3640255747654499e+00 1.1415257071256806e+00 2.4127854731781655e+00 1.0672617295475966e+00 7.4637861608239420e-01 -2.7125451358539703e+00 -1.2884780330404653e+00 -1.1368308082305580e+00 -4.5837623735769188e+00 -1.1414603225210262e+00 -9.6416058814631900e-01 4.9461611349964256e+00 1.5457609920143043e+00 1.1353478028489206e+00 9.0215162673506866e-01 4.2356651727194468e+00 2.7135277216688132e+00 -1.3802095973340902e+00 -4.4600335273491041e+00 -2.4214004853293432e+00 -1.0424799759696262e+00 -5.9900341874730607e+00 -2.7048854141753944e+00 1.3801092328574864e+00 5.3982219159835481e+00 2.7392549215976336e+00 1.1145210615252019e+00 5.7452208518260770e+00 2.5626446984307920e+00 -1.3493787052429127e+00 -5.2156683705105618e+00 -2.7196038337330553e+00 -1.1704746345854340e+00 -7.9505399579329588e+00 -3.0414329007206544e+00 1.5457609920143045e+00 8.2371681027366108e+00 2.8718952922612058e+00 7.2777433072323983e-01 2.4792992924032675e+00 3.1578598624383529e+00 -1.0034225599934197e+00 -2.4419241474325424e+00 -2.8573768948721523e+00 -7.4667154160306581e-01 -2.7444076655621719e+00 -4.1101040025589892e+00 1.1582371664124076e+00 2.7435493723404942e+00 4.4254633146336566e+00 7.9122067671019269e-01 2.5956711243512878e+00 3.9629717005033323e+00 -1.0678538124781638e+00 -2.4408773633083691e+00 -4.2883359365427731e+00 -9.9463206262011217e-01 -3.0632059050531719e+00 -6.7362509082609670e+00 1.1353478028489206e+00 2.8718952922612058e+00 6.4457728646595402e+00 1206 1207 1208 1254 1255 1256 1266 1267 1268 1218 1219 1220 1164 1165 1166 1176 1177 1178 1179 1180 1181 1167 1168 1169 4.3427365120065158e+00 8.2633668898085122e-01 7.4594051765762492e-01 -4.4183229803340005e+00 -1.1843845042464123e+00 -9.9224455653881749e-01 -2.2190797831815936e+00 -7.7637932951642552e-01 -5.9025456546922472e-01 2.3456817645910712e+00 1.0218078649648303e+00 9.5273505534479475e-01 2.2161825582950585e+00 7.4721276423115068e-01 5.9216119746275708e-01 -2.3684576415398304e+00 -8.3547675649555420e-01 -7.9178726805787192e-01 -1.1898318651628663e+00 -6.4923635265350177e-01 -6.0392778163008431e-01 1.2910914353256440e+00 8.5011962473506175e-01 6.8737740123082158e-01 8.2633668898085122e-01 7.6314288087535660e+00 3.1552467949200591e+00 -1.1902272358711015e+00 -7.7368521557050816e+00 -2.9922931239800881e+00 -7.4985961753153485e-01 -5.5812353685879534e+00 -2.6871639520592963e+00 1.0386832975976745e+00 5.0090961704552504e+00 2.8017529661843681e+00 7.0944334433219980e-01 5.4176121037756424e+00 2.6969401740783137e+00 -1.0871128189704167e+00 -4.8721853021074386e+00 -2.6797925963785176e+00 -6.2030736334961423e-01 -3.9072176778372976e+00 -2.6543477063956882e+00 1.0730437048119408e+00 4.0393534212533151e+00 2.3596574436308488e+00 7.4594051765762481e-01 3.1552467949200587e+00 7.0021769717006457e+00 -9.9423435091529733e-01 -2.9829820698499856e+00 -6.4596575978858759e+00 -6.2910131081600928e-01 -2.9789803514468853e+00 -4.2994735898009004e+00 9.5574243424393002e-01 2.7724187762379393e+00 4.6424358683474658e+00 5.5394757980960707e-01 2.6596971168878882e+00 4.1418229623125082e+00 -1.0087932909764608e+00 -2.6157390349637586e+00 -4.5663897111066953e+00 -5.6689126020144132e-01 -2.6077740891793608e+00 -3.4716978447653406e+00 9.4338968119804578e-01 2.5981128573941072e+00 3.0107829411981908e+00 -4.4183229803340005e+00 -1.1902272358711017e+00 -9.9423435091529733e-01 4.7515678042447655e+00 1.5843541905193659e+00 1.1406388260234657e+00 2.3693463695523462e+00 1.1701119500275592e+00 8.3560851890953547e-01 -2.6717219177653684e+00 -1.3582239662862727e+00 -1.2111175419385733e+00 -2.3706748619101359e+00 -1.2621064914559434e+00 -8.6121282985959891e-01 2.6228868665046718e+00 1.2999650860579615e+00 1.0748943422783235e+00 1.3101976951408409e+00 1.0956157526414372e+00 9.8155240733144355e-01 -1.5932789754331171e+00 -1.3394892856330063e+00 -9.6612937182929803e-01 -1.1843845042464123e+00 -7.7368521557050833e+00 -2.9829820698499860e+00 1.5843541905193661e+00 7.9739591838155244e+00 2.7898351423024299e+00 1.1559194607727552e+00 5.7539172259813585e+00 2.6547494736972546e+00 -1.4224760725221617e+00 -5.1917762376060095e+00 -2.8162454338397156e+00 -9.1548770535573520e-01 -5.6684496008538616e+00 -2.4550122458945918e+00 1.2707056417653617e+00 5.0638857623633076e+00 2.4917637278981815e+00 8.1878802660969763e-01 4.0698176439332556e+00 2.6349738325890679e+00 -1.3074190375428700e+00 -4.2645018219284960e+00 -2.3170824269026400e+00 -9.9224455653881749e-01 -2.9922931239800881e+00 -6.4596575978858759e+00 1.1406388260234657e+00 2.7898351423024299e+00 6.1129278203056172e+00 8.1092524246089659e-01 2.6140700748400088e+00 3.9199795233576862e+00 -1.1147768950609369e+00 -2.4659905185474078e+00 -4.2414700848718745e+00 -6.3272290343531612e-01 -2.5152603085878726e+00 -3.7945547304514817e+00 1.0662142839498128e+00 2.5317638664460413e+00 4.1267423946124255e+00 6.5773446053503237e-01 2.3372437299870663e+00 3.0419555765029216e+00 -9.3576845793413610e-01 -2.2993688624601796e+00 -2.7059229015694131e+00 -2.2190797831815936e+00 -7.4985961753153485e-01 -6.2910131081600940e-01 2.3693463695523462e+00 1.1559194607727552e+00 8.1092524246089659e-01 4.3594814064807643e+00 9.5375542371666200e-01 6.7696431135615964e-01 -4.4771346488324975e+00 -1.2403653691802592e+00 -9.8378824231182538e-01 -1.1991691737882195e+00 -7.5057903954477223e-01 -5.0656320835800805e-01 1.3146966205853050e+00 8.4804306338422486e-01 7.0711449106897739e-01 2.2635553068179375e+00 7.7303557731134909e-01 6.2658859009180889e-01 -2.4116960976340431e+00 -9.8994949892842499e-01 -7.0213987349199947e-01 -7.7637932951642541e-01 -5.5812353685879543e+00 -2.9789803514468853e+00 1.1701119500275592e+00 5.7539172259813585e+00 2.6140700748400088e+00 9.5375542371666211e-01 8.5275641318279991e+00 3.0916058578641632e+00 -1.2714504598567467e+00 -7.8454130438031022e+00 -3.1301622875179738e+00 -6.9258510197087453e-01 -4.6489589011818184e+00 -2.4325457843061971e+00 1.1526414461733994e+00 4.0257787180038678e+00 2.6588214107062136e+00 7.3006407988138544e-01 5.5351563702637296e+00 2.7903107329651955e+00 -1.2661580084549582e+00 -5.7668091325040844e+00 -2.6131196531045240e+00 -5.9025456546922483e-01 -2.6871639520592958e+00 -4.2994735898009004e+00 8.3560851890953558e-01 2.6547494736972546e+00 3.9199795233576857e+00 6.7696431135615975e-01 3.0916058578641632e+00 6.3344374015699270e+00 -1.0008872255294134e+00 -3.1044846235929802e+00 -6.6456069911313591e+00 -4.8129314371061133e-01 -2.5049765126375774e+00 -2.7505100907901237e+00 8.5042892517666169e-01 2.3268512236955847e+00 3.0456224698633356e+00 5.9373398860035786e-01 2.8033446234690373e+00 4.3242349241595956e+00 -8.8430080933346455e-01 -2.5799260904361874e+00 -3.9286836472281612e+00 2.3456817645910712e+00 1.0386832975976745e+00 9.5574243424393002e-01 -2.6717219177653684e+00 -1.4224760725221617e+00 -1.1147768950609374e+00 -4.4771346488324975e+00 -1.2714504598567467e+00 -1.0008872255294134e+00 4.8643482235185562e+00 1.4464402990987941e+00 1.3928306348251169e+00 1.2720783982573809e+00 1.1839966147859624e+00 8.4627623402225849e-01 -1.5883902596936974e+00 -1.1691687674454576e+00 -1.1322764997994816e+00 -2.3954154137200390e+00 -1.1412245742931859e+00 -1.0701483247107344e+00 2.6505538536445932e+00 1.3351996626351217e+00 1.1232396420092607e+00 1.0218078649648303e+00 5.0090961704552504e+00 2.7724187762379393e+00 -1.3582239662862725e+00 -5.1917762376060104e+00 -2.4659905185474078e+00 -1.2403653691802592e+00 -7.8454130438031022e+00 -3.1044846235929806e+00 1.4464402990987943e+00 7.3991277004457965e+00 3.0670013534488971e+00 8.0447873766830580e-01 4.0175724293235850e+00 2.2863098926996344e+00 -1.1589532549615620e+00 -3.5691323485242306e+00 -2.4424950838055541e+00 -8.3141934680332197e-01 -4.9872855282425999e+00 -2.7339314296775932e+00 1.3162350354994845e+00 5.1678108579513138e+00 2.6211716332370636e+00 9.5273505534479486e-01 2.8017529661843681e+00 4.6424358683474658e+00 -1.2111175419385733e+00 -2.8162454338397156e+00 -4.2414700848718754e+00 -9.8378824231182560e-01 -3.1301622875179738e+00 -6.6456069911313591e+00 1.3928306348251169e+00 3.0670013534488971e+00 7.1545136173148300e+00 6.6931104245222084e-01 2.6981548967364235e+00 2.9934376849595496e+00 -1.1238555801439576e+00 -2.4456476686295772e+00 -3.4233658256668265e+00 -7.9756566304250831e-01 -2.7854457535678065e+00 -4.7273047650264983e+00 1.1014502948147313e+00 2.6105919271853852e+00 4.2473604960747124e+00 2.2161825582950585e+00 7.0944334433219969e-01 5.5394757980960718e-01 -2.3706748619101359e+00 -9.1548770535573520e-01 -6.3272290343531612e-01 -1.1991691737882195e+00 -6.9258510197087453e-01 -4.8129314371061133e-01 1.2720783982573804e+00 8.0447873766830580e-01 6.6931104245222084e-01 4.4642395909957511e+00 8.2174321165627340e-01 5.6649437693774551e-01 -4.4872945713349948e+00 -1.1604203946550780e+00 -8.8252729689528453e-01 -2.2565999576847364e+00 -6.4806663840449963e-01 -5.5392511507645992e-01 2.3612380171698955e+00 1.0808945467294084e+00 7.6071545991809808e-01 7.4721276423115068e-01 5.4176121037756424e+00 2.6596971168878882e+00 -1.2621064914559434e+00 -5.6684496008538616e+00 -2.5152603085878726e+00 -7.5057903954477223e-01 -4.6489589011818184e+00 -2.5049765126375774e+00 1.1839966147859624e+00 4.0175724293235842e+00 2.6981548967364235e+00 8.2174321165627329e-01 8.3954564558762552e+00 2.8135915344295230e+00 -1.0719745023226370e+00 -7.6426843059103673e+00 -2.7939788241425925e+00 -6.8363775641164215e-01 -5.4453206856736323e+00 -2.8365467520443310e+00 1.0153451990616074e+00 5.5747725046441978e+00 2.4793188493585365e+00 5.9216119746275708e-01 2.6969401740783137e+00 4.1418229623125082e+00 -8.6121282985959891e-01 -2.4550122458945918e+00 -3.7945547304514817e+00 -5.0656320835800805e-01 -2.4325457843061971e+00 -2.7505100907901228e+00 8.4627623402225860e-01 2.2863098926996339e+00 2.9934376849595492e+00 5.6649437693774563e-01 2.8135915344295239e+00 6.2307689531624550e+00 -8.3795739749652021e-01 -2.8805674980105440e+00 -6.4419959675739316e+00 -5.0233560103051844e-01 -2.4762320147586729e+00 -4.2100495391550714e+00 7.0313722832188397e-01 2.4475159417625347e+00 3.8310807275360959e+00 -2.3684576415398300e+00 -1.0871128189704167e+00 -1.0087932909764608e+00 2.6228868665046723e+00 1.2707056417653617e+00 1.0662142839498128e+00 1.3146966205853050e+00 1.1526414461733991e+00 8.5042892517666169e-01 -1.5883902596936974e+00 -1.1589532549615620e+00 -1.1238555801439576e+00 -4.4872945713349948e+00 -1.0719745023226370e+00 -8.3795739749652043e-01 4.8012960080735390e+00 1.2977792056625979e+00 1.2385100889013347e+00 2.3728971183590177e+00 9.0316897759762393e-01 8.4779627602484631e-01 -2.6676341409540099e+00 -1.3062546949443672e+00 -1.0323433054357161e+00 -8.3547675649555420e-01 -4.8721853021074386e+00 -2.6157390349637586e+00 1.2999650860579615e+00 5.0638857623633076e+00 2.5317638664460422e+00 8.4804306338422486e-01 4.0257787180038678e+00 2.3268512236955847e+00 -1.1691687674454578e+00 -3.5691323485242310e+00 -2.4456476686295772e+00 -1.1604203946550782e+00 -7.6426843059103673e+00 -2.8805674980105445e+00 1.2977792056625979e+00 7.1490965515277409e+00 2.7833419149939935e+00 9.6606847620927938e-01 4.8854571655642456e+00 2.6280630192271501e+00 -1.2467899127179720e+00 -5.0402162409171281e+00 -2.3280658227588895e+00 -7.9178726805787192e-01 -2.6797925963785176e+00 -4.5663897111066944e+00 1.0748943422783235e+00 2.4917637278981815e+00 4.1267423946124246e+00 7.0711449106897739e-01 2.6588214107062140e+00 3.0456224698633356e+00 -1.1322764997994816e+00 -2.4424950838055546e+00 -3.4233658256668265e+00 -8.8252729689528453e-01 -2.7939788241425916e+00 -6.4419959675739316e+00 1.2385100889013347e+00 2.7833419149939935e+00 6.8723905033473853e+00 8.9134982857197231e-01 2.5902639336345148e+00 4.5495246283640416e+00 -1.1052776860679687e+00 -2.6079244829062409e+00 -4.1625284918397343e+00 -1.1898318651628663e+00 -6.2030736334961423e-01 -5.6689126020144132e-01 1.3101976951408409e+00 8.1878802660969763e-01 6.5773446053503226e-01 2.2635553068179375e+00 7.3006407988138533e-01 5.9373398860035775e-01 -2.3954154137200394e+00 -8.3141934680332197e-01 -7.9756566304250842e-01 -2.2565999576847364e+00 -6.8363775641164237e-01 -5.0233560103051844e-01 2.3728971183590173e+00 9.6606847620927938e-01 8.9134982857197220e-01 4.4439796153626672e+00 7.5582910989122210e-01 6.9323986545439242e-01 -4.5487824991128214e+00 -1.1353852260270063e+00 -9.6926561888728624e-01 -6.4923635265350177e-01 -3.9072176778372976e+00 -2.6077740891793604e+00 1.0956157526414370e+00 4.0698176439332556e+00 2.3372437299870659e+00 7.7303557731134909e-01 5.5351563702637305e+00 2.8033446234690369e+00 -1.1412245742931859e+00 -4.9872855282425999e+00 -2.7854457535678065e+00 -6.4806663840449974e-01 -5.4453206856736331e+00 -2.4762320147586729e+00 9.0316897759762393e-01 4.8854571655642456e+00 2.5902639336345148e+00 7.5582910989122232e-01 7.6432192472206575e+00 3.0955151705972996e+00 -1.0891218520904435e+00 -7.7938265352283596e+00 -2.9569156001820760e+00 -6.0392778163008431e-01 -2.6543477063956877e+00 -3.4716978447653406e+00 9.8155240733144344e-01 2.6349738325890679e+00 3.0419555765029216e+00 6.2658859009180889e-01 2.7903107329651955e+00 4.3242349241595948e+00 -1.0701483247107346e+00 -2.7339314296775941e+00 -4.7273047650264983e+00 -5.5392511507645992e-01 -2.8365467520443310e+00 -4.2100495391550714e+00 8.4779627602484620e-01 2.6280630192271501e+00 4.5495246283640416e+00 6.9323986545439242e-01 3.0955151705973001e+00 7.1167287603418501e+00 -9.2117591748521155e-01 -2.9240368672611012e+00 -6.6233917404214946e+00 1.2910914353256440e+00 1.0730437048119410e+00 9.4338968119804589e-01 -1.5932789754331176e+00 -1.3074190375428700e+00 -9.3576845793413588e-01 -2.4116960976340436e+00 -1.2661580084549577e+00 -8.8430080933346455e-01 2.6505538536445936e+00 1.3162350354994845e+00 1.1014502948147313e+00 2.3612380171698955e+00 1.0153451990616074e+00 7.0313722832188374e-01 -2.6676341409540099e+00 -1.2467899127179720e+00 -1.1052776860679687e+00 -4.5487824991128214e+00 -1.0891218520904435e+00 -9.2117591748521133e-01 4.9185084069938583e+00 1.5048648714332113e+00 1.0985456664861186e+00 8.5011962473506175e-01 4.0393534212533151e+00 2.5981128573941064e+00 -1.3394892856330063e+00 -4.2645018219284960e+00 -2.2993688624601800e+00 -9.8994949892842499e-01 -5.7668091325040827e+00 -2.5799260904361874e+00 1.3351996626351217e+00 5.1678108579513138e+00 2.6105919271853852e+00 1.0808945467294084e+00 5.5747725046441978e+00 2.4475159417625343e+00 -1.3062546949443674e+00 -5.0402162409171281e+00 -2.6079244829062409e+00 -1.1353852260270063e+00 -7.7938265352283587e+00 -2.9240368672611012e+00 1.5048648714332113e+00 8.0834169467292423e+00 2.7550355767216814e+00 6.8737740123082158e-01 2.3596574436308488e+00 3.0107829411981908e+00 -9.6612937182929792e-01 -2.3170824269026404e+00 -2.7059229015694131e+00 -7.0213987349199947e-01 -2.6131196531045235e+00 -3.9286836472281612e+00 1.1232396420092605e+00 2.6211716332370636e+00 4.2473604960747124e+00 7.6071545991809797e-01 2.4793188493585365e+00 3.8310807275360954e+00 -1.0323433054357161e+00 -2.3280658227588895e+00 -4.1625284918397343e+00 -9.6926561888728624e-01 -2.9569156001820764e+00 -6.6233917404214946e+00 1.0985456664861184e+00 2.7550355767216814e+00 6.3313026162498032e+00 759 760 761 1218 1219 1220 1230 1231 1232 771 772 773 1101 1102 1103 1167 1168 1169 1170 1171 1172 1104 1105 1106 4.6476486166725328e+00 6.8819050359517367e-02 6.0143206434814613e-02 -4.5736063928304880e+00 -4.3906458475791810e-01 -3.9112237260595933e-01 -2.2716082088005898e+00 -2.5091507063156285e-02 -1.9736999469541140e-02 2.2513559144774722e+00 3.8370035547607717e-01 3.5101807635421928e-01 2.2479678646068360e+00 5.4458570943242239e-02 4.3072769150205560e-02 -2.2670216196283892e+00 -2.2936601379541072e-01 -2.1231097517597264e-01 -1.1253773332565440e+00 -2.4787697404979322e-02 -2.4026080594138997e-02 1.0906411587591702e+00 2.1133182624262767e-01 1.9296237590637277e-01 6.8819050359517311e-02 8.5461305253674276e+00 3.5414140301871604e+00 -4.2947018371691237e-01 -8.7791001042719046e+00 -3.4517661929717134e+00 -2.8222593735189275e-02 -6.1244126611168399e+00 -2.9744601127465851e+00 3.7918970552568798e-01 5.6731528725988092e+00 3.1522356428922897e+00 3.0564882451367799e-02 5.9479939441327545e+00 3.0247371693918255e+00 -5.0428652313063660e-01 -5.5138877593567157e+00 -3.0420532364543234e+00 -4.9140624572157031e-03 -4.2748831294535190e+00 -2.9133180944925203e+00 4.8831972470338081e-01 4.5250063120999879e+00 2.6632107941938652e+00 6.0143206434814619e-02 3.5414140301871613e+00 7.8602766506459432e+00 -3.8162434683033608e-01 -3.4353255986747233e+00 -7.3345537236474181e+00 -2.3641922281251466e-02 -3.2869486112405890e+00 -4.7857321435355757e+00 3.4391976845734690e-01 3.1436306213536729e+00 5.1412025401868382e+00 2.3224164077652376e-02 2.9835458199151765e+00 4.6384413218028628e+00 -4.6443067045921460e-01 -3.0196187547893358e+00 -5.0717366264856647e+00 -5.5715232782487453e-03 -2.8858680558259473e+00 -3.7960812824890553e+00 4.4798132387923684e-01 2.9591705490745839e+00 3.3481832635220714e+00 -4.5736063928304880e+00 -4.2947018371691231e-01 -3.8162434683033597e-01 4.7625871155073982e+00 8.5986409012474296e-01 6.2092268166090603e-01 2.2692618955341666e+00 4.2968781641203307e-01 3.0913874800191993e-01 -2.4327061527986515e+00 -7.5842897594133007e-01 -6.5544391150619663e-01 -2.2705567088285870e+00 -5.6343958463418420e-01 -3.9739286248769667e-01 2.4036115173063632e+00 7.1324036481574349e-01 5.8191440819898121e-01 1.1133622234471188e+00 4.8504288196162354e-01 4.5113440620171141e-01 -1.2719534973373214e+00 -7.3649640902171620e-01 -5.2864912323928914e-01 -4.3906458475791815e-01 -8.7791001042719046e+00 -3.4353255986747233e+00 8.5986409012474296e-01 9.1605401191218601e+00 3.3033587911133599e+00 4.2945814104059982e-01 6.4361293749533672e+00 3.0064214008997312e+00 -7.8337657333698363e-01 -5.9911473814547991e+00 -3.2285776387850809e+00 -2.3907789739399857e-01 -6.3192332487605345e+00 -2.8637882003076802e+00 7.1478202675781888e-01 5.8284687172706624e+00 2.9314219997924322e+00 1.8980899429539094e-01 4.5493936411407363e+00 2.9774789108240980e+00 -7.3239419672965234e-01 -4.8850511179993870e+00 -2.6909896648621352e+00 -3.9112237260595939e-01 -3.4517661929717134e+00 -7.3345537236474181e+00 6.2092268166090603e-01 3.3033587911133599e+00 6.9922073001939413e+00 3.0645245294042706e-01 2.9944444564988868e+00 4.4221758111344087e+00 -6.0903432383029277e-01 -2.8988349528620296e+00 -4.7655746117593321e+00 -1.6639484606428689e-01 -2.8798319492050637e+00 -4.2931467918478985e+00 5.8919476696288309e-01 2.9653227932590340e+00 4.6494550133975956e+00 1.7612993590579010e-01 2.6606354847530582e+00 3.3878385332190706e+00 -5.2614829496946736e-01 -2.6933284305855305e+00 -3.0584015306903667e+00 -2.2716082088005898e+00 -2.8222593735189271e-02 -2.3641922281251476e-02 2.2692618955341666e+00 4.2945814104059982e-01 3.0645245294042711e-01 4.5180462818285791e+00 8.1004602123739985e-02 6.0657276661491497e-02 -4.4915875469837818e+00 -4.6885777075784452e-01 -3.4612026760171938e-01 -1.1294119269749077e+00 -3.7910312039861602e-02 -2.5537315062022149e-02 1.1171765129310747e+00 2.3705866955344904e-01 1.7123966999678092e-01 2.2217776444813575e+00 5.3539457580297919e-02 4.5684000383515486e-02 -2.2336546520158986e+00 -2.6607019376519142e-01 -1.8873389503722193e-01 -2.5091507063156313e-02 -6.1244126611168399e+00 -3.2869486112405890e+00 4.2968781641203307e-01 6.4361293749533672e+00 2.9944444564988868e+00 8.1004602123739972e-02 9.2539611130360893e+00 3.4082697220125104e+00 -4.7474681979157052e-01 -8.7214061471861370e+00 -3.4925052551953115e+00 -9.8820937426019294e-03 -5.0143682145132100e+00 -2.7355025521611473e+00 5.4137479383408449e-01 4.5362662076511358e+00 2.9849341701880321e+00 3.0009856690546531e-02 5.9531650540121213e+00 3.0515097489350209e+00 -5.7235664846307521e-01 -6.3193347268365274e+00 -2.9242016790374032e+00 -1.9736999469541137e-02 -2.9744601127465851e+00 -4.7857321435355757e+00 3.0913874800191993e-01 3.0064214008997312e+00 4.4221758111344096e+00 6.0657276661491476e-02 3.4082697220125104e+00 6.9675600625167808e+00 -3.4991349451787696e-01 -3.4831459925267900e+00 -7.2979063285527728e+00 -5.8555939700510491e-03 -2.7625593346633575e+00 -3.0752495597482525e+00 3.8522454451620169e-01 2.6552944407764394e+00 3.3879114740366618e+00 2.6287675927856125e-02 3.0602703136147209e+00 4.6757799763425671e+00 -4.0580215715000012e-01 -2.9100904373666676e+00 -4.2945392921938170e+00 2.2513559144774722e+00 3.7918970552568804e-01 3.4391976845734690e-01 -2.4327061527986515e+00 -7.8337657333698363e-01 -6.0903432383029277e-01 -4.4915875469837818e+00 -4.7474681979157052e-01 -3.4991349451787696e-01 4.7270796088321427e+00 7.7809577820795317e-01 7.2124958164365693e-01 1.0849099364182953e+00 5.3631008638068933e-01 3.7588362810059306e-01 -1.2677977093770210e+00 -6.4892658307898021e-01 -6.0653532764597284e-01 -2.2230685408334887e+00 -5.0463596792157950e-01 -4.6680979826232499e-01 2.3518144902650340e+00 7.1809037401478326e-01 5.9123996605487050e-01 3.8370035547607717e-01 5.6731528725988083e+00 3.1436306213536724e+00 -7.5842897594133030e-01 -5.9911473814547991e+00 -2.8988349528620296e+00 -4.6885777075784452e-01 -8.7214061471861370e+00 -3.4831459925267900e+00 7.7809577820795295e-01 8.3675412164251775e+00 3.5111599553786497e+00 2.1226458764159006e-01 4.5180757391436739e+00 2.6402846647519382e+00 -6.6158935491424453e-01 -4.1585307525685140e+00 -2.8397228237592782e+00 -2.0954113978555036e-01 -5.5156039773728125e+00 -3.0709629208518159e+00 7.2435652007334927e-01 5.8279184304146012e+00 2.9975914485156534e+00 3.5101807635421928e-01 3.1522356428922889e+00 5.1412025401868382e+00 -6.5544391150619663e-01 -3.2285776387850813e+00 -4.7655746117593321e+00 -3.4612026760171938e-01 -3.4925052551953115e+00 -7.2979063285527728e+00 7.2124958164365693e-01 3.5111599553786497e+00 7.8100381625254736e+00 1.4926709224186327e-01 2.9905371722761616e+00 3.3449212840046219e+00 -6.1603299087271690e-01 -2.8289293934326012e+00 -3.7768603625321902e+00 -1.9623902832525406e-01 -3.0855642805504506e+00 -5.0852997946985763e+00 5.9230144806614748e-01 2.9816437974163419e+00 4.6294791108259385e+00 2.2479678646068360e+00 3.0564882451367809e-02 2.3224164077652376e-02 -2.2705567088285870e+00 -2.3907789739399857e-01 -1.6639484606428692e-01 -1.1294119269749077e+00 -9.8820937426019606e-03 -5.8555939700510422e-03 1.0849099364182955e+00 2.1226458764159006e-01 1.4926709224186330e-01 4.5340698897527734e+00 4.3721028902898092e-02 3.3074840008066528e-02 -4.4371016198039790e+00 -4.5656304096512845e-01 -3.3049030095428950e-01 -2.2116928226041956e+00 5.4713746307366723e-03 2.2904805484914026e-03 2.1818153874337645e+00 4.1350115847513641e-01 2.9488416411255380e-01 5.4458570943242239e-02 5.9479939441327563e+00 2.9835458199151765e+00 -5.6343958463418420e-01 -6.3192332487605345e+00 -2.8798319492050641e+00 -3.7910312039861602e-02 -5.0143682145132100e+00 -2.7625593346633575e+00 5.3631008638068933e-01 4.5180757391436730e+00 2.9905371722761616e+00 4.3721028902898119e-02 8.9819323553682082e+00 3.1709945101759351e+00 -4.0131669141223575e-01 -8.3880906354078579e+00 -3.2094285445656876e+00 4.3964684563710388e-03 -5.8227703389391463e+00 -3.1028169760876363e+00 3.6378043340308081e-01 6.0964603989761113e+00 2.8095593021544705e+00 4.3072769150205567e-02 3.0247371693918255e+00 4.6384413218028628e+00 -3.9739286248769673e-01 -2.8637882003076802e+00 -4.2931467918478985e+00 -2.5537315062022160e-02 -2.7355025521611473e+00 -3.0752495597482525e+00 3.7588362810059306e-01 2.6402846647519382e+00 3.3449212840046227e+00 3.3074840008066528e-02 3.1709945101759356e+00 6.7921195856618173e+00 -2.9206660182009220e-01 -3.2724728738653996e+00 -7.0375037200830750e+00 5.7388857269430604e-03 -2.7650714796616143e+00 -4.5644827919209607e+00 2.5722665638400261e-01 2.8008187616761413e+00 4.1949006721308839e+00 -2.2670216196283892e+00 -5.0428652313063671e-01 -4.6443067045921460e-01 2.4036115173063632e+00 7.1478202675781888e-01 5.8919476696288309e-01 1.1171765129310747e+00 5.4137479383408438e-01 3.8522454451620164e-01 -1.2677977093770210e+00 -6.6158935491424453e-01 -6.1603299087271701e-01 -4.4371016198039790e+00 -4.0131669141223580e-01 -2.9206660182009214e-01 4.6207102316191069e+00 7.2782697473124791e-01 6.7541673998963581e-01 2.1926327341180571e+00 3.2858090636185472e-01 3.0257724948086062e-01 -2.3622100471652128e+00 -7.4537213222788923e-01 -5.7988303779755745e-01 -2.2936601379541072e-01 -5.5138877593567166e+00 -3.0196187547893358e+00 7.1324036481574349e-01 5.8284687172706642e+00 2.9653227932590340e+00 2.3705866955344906e-01 4.5362662076511366e+00 2.6552944407764394e+00 -6.4892658307898010e-01 -4.1585307525685140e+00 -2.8289293934326012e+00 -4.5656304096512851e-01 -8.3880906354078579e+00 -3.2724728738654005e+00 7.2782697473124791e-01 7.9878334829839881e+00 3.2543258875937568e+00 3.6838881767910281e-01 5.3948406451033373e+00 2.9564977663781575e+00 -7.1165918894002389e-01 -5.6868999056760376e+00 -2.7104198659200507e+00 -2.1231097517597264e-01 -3.0420532364543229e+00 -5.0717366264856647e+00 5.8191440819898121e-01 2.9314219997924322e+00 4.6494550133975956e+00 1.7123966999678092e-01 2.9849341701880321e+00 3.3879114740366618e+00 -6.0653532764597284e-01 -2.8397228237592782e+00 -3.7768603625321902e+00 -3.3049030095428950e-01 -3.2094285445656876e+00 -7.0375037200830750e+00 6.7541673998963581e-01 3.2543258875937568e+00 7.4777247912228244e+00 3.3612220411439636e-01 2.9446300263988929e+00 4.9162935814839095e+00 -6.1535641852355893e-01 -3.0241074791938258e+00 -4.5452841510400628e+00 -1.1253773332565440e+00 -4.9140624572157066e-03 -5.5715232782487453e-03 1.1133622234471188e+00 1.8980899429539094e-01 1.7612993590579010e-01 2.2217776444813575e+00 3.0009856690546538e-02 2.6287675927856122e-02 -2.2230685408334887e+00 -2.0954113978555039e-01 -1.9623902832525406e-01 -2.2116928226041956e+00 4.3964684563710388e-03 5.7388857269430327e-03 2.1926327341180571e+00 3.6838881767910286e-01 3.3612220411439631e-01 4.3918304260265151e+00 3.5885877003756395e-02 3.1230591948371130e-02 -4.3594643313788213e+00 -4.1403481188240165e-01 -3.7369874201985398e-01 -2.4787697404979318e-02 -4.2748831294535190e+00 -2.8858680558259477e+00 4.8504288196162348e-01 4.5493936411407363e+00 2.6606354847530578e+00 5.3539457580297933e-02 5.9531650540121213e+00 3.0602703136147200e+00 -5.0463596792157950e-01 -5.5156039773728134e+00 -3.0855642805504506e+00 5.4713746307367278e-03 -5.8227703389391472e+00 -2.7650714796616143e+00 3.2858090636185472e-01 5.3948406451033364e+00 2.9446300263988929e+00 3.5885877003756401e-02 8.0644377008480070e+00 3.3638634209494596e+00 -3.7909683221171026e-01 -8.3485795953387196e+00 -3.2928954296781185e+00 -2.4026080594139000e-02 -2.9133180944925208e+00 -3.7960812824890562e+00 4.5113440620171136e-01 2.9774789108240980e+00 3.3878385332190706e+00 4.5684000383515486e-02 3.0515097489350209e+00 4.6757799763425671e+00 -4.6680979826232499e-01 -3.0709629208518163e+00 -5.0852997946985763e+00 2.2904805484914026e-03 -3.1028169760876363e+00 -4.5644827919209607e+00 3.0257724948086068e-01 2.9564977663781575e+00 4.9162935814839095e+00 3.1230591948371144e-02 3.3638634209494591e+00 7.4696078499688809e+00 -3.4208084970648589e-01 -3.2622518556547622e+00 -7.0036560719058318e+00 1.0906411587591702e+00 4.8831972470338075e-01 4.4798132387923684e-01 -1.2719534973373214e+00 -7.3239419672965234e-01 -5.2614829496946736e-01 -2.2336546520158986e+00 -5.7235664846307521e-01 -4.0580215715000006e-01 2.3518144902650340e+00 7.2435652007334927e-01 5.9230144806614748e-01 2.1818153874337645e+00 3.6378043340308075e-01 2.5722665638400261e-01 -2.3622100471652128e+00 -7.1165918894002389e-01 -6.1535641852355905e-01 -4.3594643313788213e+00 -3.7909683221171037e-01 -3.4208084970648583e-01 4.6030114914392843e+00 8.1905018816465092e-01 5.9187829202012543e-01 2.1133182624262770e-01 4.5250063120999879e+00 2.9591705490745843e+00 -7.3649640902171620e-01 -4.8850511179993870e+00 -2.6933284305855305e+00 -2.6607019376519142e-01 -6.3193347268365274e+00 -2.9100904373666676e+00 7.1809037401478326e-01 5.8279184304146012e+00 2.9816437974163419e+00 4.1350115847513641e-01 6.0964603989761130e+00 2.8008187616761413e+00 -7.4537213222788923e-01 -5.6868999056760359e+00 -3.0241074791938258e+00 -4.1403481188240165e-01 -8.3485795953387214e+00 -3.2622518556547622e+00 8.1905018816465092e-01 8.7904802043599712e+00 3.1481450946337177e+00 1.9296237590637277e-01 2.6632107941938652e+00 3.3481832635220714e+00 -5.2864912323928936e-01 -2.6909896648621352e+00 -3.0584015306903667e+00 -1.8873389503722193e-01 -2.9242016790374032e+00 -4.2945392921938170e+00 5.9123996605487050e-01 2.9975914485156538e+00 4.6294791108259385e+00 2.9488416411255380e-01 2.8095593021544705e+00 4.1949006721308848e+00 -5.7988303779755745e-01 -2.7104198659200516e+00 -4.5452841510400637e+00 -3.7369874201985387e-01 -3.2928954296781177e+00 -7.0036560719058345e+00 5.9187829202012543e-01 3.1481450946337177e+00 6.7293179993511849e+00 1218 1219 1220 1266 1267 1268 1278 1279 1280 1230 1231 1232 1167 1168 1169 1179 1180 1181 1182 1183 1184 1170 1171 1172 4.3738307748104939e+00 5.1412825987798977e-02 4.4673751738647412e-02 -4.2908860996424210e+00 -4.1785233582837822e-01 -3.7516167438691089e-01 -2.1715120644549213e+00 -1.1867054152846661e-02 -9.3002298063142169e-03 2.1475730025753914e+00 3.6854405939125745e-01 3.3856452672271220e-01 2.1728378234593655e+00 4.0159037418029842e-02 3.1734937734405347e-02 -2.1912924883275267e+00 -2.1709740774634170e-01 -2.0245096638851012e-01 -1.1077228030107589e+00 -1.3184582327074418e-02 -1.3388692071738494e-02 1.0671718545903788e+00 1.9988545725755463e-01 1.8532834645770888e-01 5.1412825987798970e-02 8.1572269873190990e+00 3.4526220189530630e+00 -4.2556513957665187e-01 -8.3836097948334007e+00 -3.3513699310388065e+00 -1.1580146889643917e-02 -5.9446347135597151e+00 -2.9076141139696996e+00 3.7736467953516439e-01 5.4903572695425709e+00 3.0878289460558208e+00 2.2382812575735489e-02 5.8011646166649822e+00 2.9638771344788482e+00 -4.9696819878173237e-01 -5.3649436122178136e+00 -2.9899877884712374e+00 2.6875354106446585e-03 -4.1954826963259180e+00 -2.8669634626181515e+00 4.8026563173868397e-01 4.4399219434101918e+00 2.6116071966101626e+00 4.4673751738647412e-02 3.4526220189530639e+00 7.5209868041564745e+00 -3.8126144642109350e-01 -3.3492610146603341e+00 -6.9782345437126843e+00 -9.9870816425217408e-03 -3.2283101335833591e+00 -4.6350512645666413e+00 3.4371422393122075e-01 3.0821273759170462e+00 4.9941371089983013e+00 1.7215961744934935e-02 2.9308349379649115e+00 4.5163653309248399e+00 -4.5910604569207947e-01 -2.9597033218033086e+00 -4.9599715015370744e+00 1.3676569649448550e-03 -2.8396645482401937e+00 -3.7457452598337611e+00 4.4338297937594612e-01 2.9113546854521730e+00 3.2875133255705453e+00 -4.2908860996424210e+00 -4.2556513957665187e-01 -3.8126144642109350e-01 4.4846073324595377e+00 8.5460046750752594e-01 6.1419327091537712e-01 2.1636932638142272e+00 4.2950633353985784e-01 3.0808005990995607e-01 -2.3336674342852843e+00 -7.5437522580536642e-01 -6.5309275285823654e-01 -2.1925330913967351e+00 -5.6211569615312063e-01 -3.9428035580432136e-01 2.3297736749329943e+00 7.1177671824853206e-01 5.8199598439039868e-01 1.0923040786293483e+00 4.8287439662321108e-01 4.5107354587792275e-01 -1.2532917245116642e+00 -7.3670185438398794e-01 -5.2670830601000329e-01 -4.1785233582837822e-01 -8.3836097948334007e+00 -3.3492610146603341e+00 8.5460046750752594e-01 8.7644519146654556e+00 3.2037562110251327e+00 4.1433852476071420e-01 6.2545343362904031e+00 2.9384093160557767e+00 -7.8352024520380936e-01 -5.8073996965214434e+00 -3.1647262722136955e+00 -2.3259234905661624e-01 -6.1727997065789069e+00 -2.7968401518182429e+00 7.0851160204225194e-01 5.6777890063005287e+00 2.8756917941406575e+00 1.8508995994929495e-01 4.4689270677350352e+00 2.9282456589430268e+00 -7.2857562417098276e-01 -4.8018931270576708e+00 -2.6352755414723208e+00 -3.7516167438691100e-01 -3.3513699310388065e+00 -6.9782345437126843e+00 6.1419327091537701e-01 3.2037562110251319e+00 6.6285070847033660e+00 2.9422918626937633e-01 2.9242299738180351e+00 4.2610121034262090e+00 -6.0794447503294213e-01 -2.8279983108433941e+00 -4.6069825338438433e+00 -1.6113241170328707e-01 -2.8200449459725925e+00 -4.1617898150301098e+00 5.8379182090012893e-01 2.9009188997998563e+00 4.5238271158428667e+00 1.7340847542475565e-01 2.6083447226259970e+00 3.3242794422260875e+00 -5.2138419238649725e-01 -2.6378366194142262e+00 -2.9906188536118923e+00 -2.1715120644549213e+00 -1.1580146889643914e-02 -9.9870816425217668e-03 2.1636932638142272e+00 4.1433852476071420e-01 2.9422918626937633e-01 4.3922603383440730e+00 6.4309690182276141e-02 4.8530057041894059e-02 -4.3622983725935525e+00 -4.5575645908077278e-01 -3.3350993231326581e-01 -1.1100417531038065e+00 -2.2958181725716873e-02 -1.4842953175490475e-02 1.0948187184296527e+00 2.2750340821480808e-01 1.6187702638272419e-01 2.2201508697391881e+00 4.0649765516866589e-02 3.4742534073277813e-02 -2.2270710001748601e+00 -2.5650660097853129e-01 -1.8103883663599446e-01 -1.1867054152846643e-02 -5.9446347135597151e+00 -3.2283101335833591e+00 4.2950633353985779e-01 6.2545343362904031e+00 2.9242299738180346e+00 6.4309690182276141e-02 9.0460230487572222e+00 3.3365568226447637e+00 -4.7208734706894800e-01 -8.5085233417874129e+00 -3.4217554357839490e+00 -3.4074155789914073e-03 -4.9375789845829186e+00 -2.6798374320910345e+00 5.3509175203380688e-01 4.4525203960230471e+00 2.9380858693308509e+00 2.3123538018747978e-02 5.8950511377716861e+00 3.0006735242340663e+00 -5.6466949697390201e-01 -6.2573918789123111e+00 -2.8696431885693734e+00 -9.3002298063142169e-03 -2.9076141139696996e+00 -4.6350512645666431e+00 3.0808005990995613e-01 2.9384093160557763e+00 4.2610121034262090e+00 4.8530057041894101e-02 3.3365568226447633e+00 6.7814738508375045e+00 -3.4606574818673486e-01 -3.4147975582820154e+00 -7.1137572603836894e+00 -1.2141871509084197e-03 -2.7131296951712338e+00 -3.0104457087292431e+00 3.7846576120075892e-01 2.6034283578216995e+00 3.3282024458749593e+00 2.0402488651845421e-02 3.0186043077328901e+00 4.6347203794729577e+00 -3.9889820166049633e-01 -2.8614574368321808e+00 -4.2461545459320540e+00 2.1475730025753914e+00 3.7736467953516456e-01 3.4371422393122081e-01 -2.3336674342852843e+00 -7.8352024520380914e-01 -6.0794447503294202e-01 -4.3622983725935525e+00 -4.7208734706894795e-01 -3.4606574818673491e-01 4.6080192727323590e+00 7.7508975226592947e-01 7.2116138098638982e-01 1.0625619348399122e+00 5.3522369027443828e-01 3.7264111639384534e-01 -1.2509352069009305e+00 -6.4863304001449573e-01 -6.0967102341021273e-01 -2.2211948479228787e+00 -5.0173336259867463e-01 -4.6609404227906287e-01 2.3499416515549836e+00 7.1829587281039542e-01 5.9225856759749684e-01 3.6854405939125745e-01 5.4903572695425717e+00 3.0821273759170462e+00 -7.5437522580536653e-01 -5.8073996965214434e+00 -2.8279983108433946e+00 -4.5575645908077289e-01 -8.5085233417874147e+00 -3.4147975582820154e+00 7.7508975226592935e-01 8.1569839935452926e+00 3.4417617982898241e+00 2.0830992831319603e-01 4.4352127573691424e+00 2.5876873265767930e+00 -6.5551355117801391e-01 -4.0736952652004401e+00 -2.7936713505358384e+00 -2.0658909392739550e-01 -5.4543383228457918e+00 -3.0280004554858380e+00 7.2029059002116491e-01 5.7614026058980796e+00 2.9528911743634225e+00 3.3856452672271220e-01 3.0878289460558208e+00 4.9941371089983004e+00 -6.5309275285823665e-01 -3.1647262722136960e+00 -4.6069825338438433e+00 -3.3350993231326581e-01 -3.4217554357839490e+00 -7.1137572603836894e+00 7.2116138098638982e-01 3.4417617982898241e+00 7.6355661736611005e+00 1.4465894841492619e-01 2.9418992201274539e+00 3.2807252666697377e+00 -6.1218762735600907e-01 -2.7755318910785682e+00 -3.7232467458794463e+00 -1.9350750040806947e-01 -3.0366710691887073e+00 -5.0515414198371928e+00 5.8791295681155198e-01 2.9271947037918205e+00 4.5850994106150296e+00 2.1728378234593655e+00 2.2382812575735503e-02 1.7215961744934949e-02 -2.1925330913967351e+00 -2.3259234905661619e-01 -1.6113241170328713e-01 -1.1100417531038065e+00 -3.4074155789914004e-03 -1.2141871509084301e-03 1.0625619348399122e+00 2.0830992831319603e-01 1.4465894841492619e-01 4.5155750301643405e+00 3.5551788698127772e-02 2.7285561460302619e-02 -4.4134963724991438e+00 -4.5830353879345764e-01 -3.3057741203452484e-01 -2.2367382989568685e+00 1.0643616772590070e-02 7.1009578993219830e-03 2.2018347274929364e+00 4.1741515706941579e-01 2.9666258136923462e-01 4.0159037418029842e-02 5.8011646166649831e+00 2.9308349379649119e+00 -5.6211569615312063e-01 -6.1727997065789069e+00 -2.8200449459725925e+00 -2.2958181725716887e-02 -4.9375789845829186e+00 -2.7131296951712343e+00 5.3522369027443806e-01 4.4352127573691424e+00 2.9418992201274543e+00 3.5551788698127848e-02 8.9101464609053025e+00 3.1196612368796535e+00 -3.8990166427915812e-01 -8.3047865278120625e+00 -3.1618567116209566e+00 1.3744349514685339e-02 -5.7999031091617006e+00 -3.0627574631196817e+00 3.5029667625271382e-01 6.0685444931961596e+00 2.7653934209124440e+00 3.1734937734405347e-02 2.9638771344788477e+00 4.5163653309248399e+00 -3.9428035580432130e-01 -2.7968401518182429e+00 -4.1617898150301098e+00 -1.4842953175490482e-02 -2.6798374320910345e+00 -3.0104457087292431e+00 3.7264111639384534e-01 2.5876873265767930e+00 3.2807252666697377e+00 2.7285561460302626e-02 3.1196612368796535e+00 6.7281273517272471e+00 -2.8134659329017342e-01 -3.2238858033862239e+00 -6.9753970465349404e+00 1.2722585855909338e-02 -2.7245752905116665e+00 -4.5544597711552885e+00 2.4608570082552206e-01 2.7539129798718727e+00 4.1768743921277576e+00 -2.1912924883275267e+00 -4.9696819878173248e-01 -4.5910604569207941e-01 2.3297736749329943e+00 7.0851160204225205e-01 5.8379182090012893e-01 1.0948187184296527e+00 5.3509175203380688e-01 3.7846576120075892e-01 -1.2509352069009305e+00 -6.5551355117801391e-01 -6.1218762735600907e-01 -4.4134963724991438e+00 -3.8990166427915823e-01 -2.8134659329017336e-01 4.6019199819140972e+00 7.2319501441758105e-01 6.7419803731866645e-01 2.2153348895565270e+00 3.1673596953710315e-01 2.9236372650602915e-01 -2.3861231971056700e+00 -7.4115092379183878e-01 -5.7617907958732162e-01 -2.1709740774634170e-01 -5.3649436122178127e+00 -2.9597033218033086e+00 7.1177671824853206e-01 5.6777890063005287e+00 2.9009188997998563e+00 2.2750340821480808e-01 4.4525203960230471e+00 2.6034283578216999e+00 -6.4863304001449573e-01 -4.0736952652004401e+00 -2.7755318910785673e+00 -4.5830353879345759e-01 -8.3047865278120607e+00 -3.2238858033862248e+00 7.2319501441758138e-01 7.9016112941385757e+00 3.2065753748647072e+00 3.7177579633179908e-01 5.3650796670399714e+00 2.9153749840523595e+00 -7.1021695065842461e-01 -5.6535749582718084e+00 -2.6671766002705226e+00 -2.0245096638851012e-01 -2.9899877884712378e+00 -4.9599715015370744e+00 5.8199598439039868e-01 2.8756917941406575e+00 4.5238271158428667e+00 1.6187702638272419e-01 2.9380858693308509e+00 3.3282024458749597e+00 -6.0967102341021273e-01 -2.7936713505358388e+00 -3.7232467458794458e+00 -3.3057741203452484e-01 -3.1618567116209562e+00 -6.9753970465349413e+00 6.7419803731866634e-01 3.2065753748647072e+00 7.4269255956928664e+00 3.4007139028739147e-01 2.9069549133440167e+00 4.9138338390013265e+00 -6.1544303654593246e-01 -2.9817921010521995e+00 -4.5341737024605555e+00 -1.1077228030107589e+00 2.6875354106446654e-03 1.3676569649448515e-03 1.0923040786293483e+00 1.8508995994929495e-01 1.7340847542475565e-01 2.2201508697391881e+00 2.3123538018747978e-02 2.0402488651845421e-02 -2.2211948479228787e+00 -2.0658909392739550e-01 -1.9350750040806947e-01 -2.2367382989568689e+00 1.3744349514685339e-02 1.2722585855909338e-02 2.2153348895565270e+00 3.7177579633179902e-01 3.4007139028739153e-01 4.5111387607571594e+00 3.0546073044397968e-02 2.6134035046094808e-02 -4.4732726487917160e+00 -4.2037815834217451e-01 -3.8059913182287208e-01 -1.3184582327074422e-02 -4.1954826963259180e+00 -2.8396645482401937e+00 4.8287439662321108e-01 4.4689270677350352e+00 2.6083447226259970e+00 4.0649765516866589e-02 5.8950511377716870e+00 3.0186043077328906e+00 -5.0173336259867463e-01 -5.4543383228457918e+00 -3.0366710691887078e+00 1.0643616772590056e-02 -5.7999031091617024e+00 -2.7245752905116665e+00 3.1673596953710320e-01 5.3650796670399723e+00 2.9069549133440167e+00 3.0546073044397947e-02 8.1500579408470113e+00 3.3404713306050677e+00 -3.6653187656841907e-01 -8.4293916850602937e+00 -3.2734643663674050e+00 -1.3388692071738494e-02 -2.8669634626181515e+00 -3.7457452598337611e+00 4.5107354587792275e-01 2.9282456589430277e+00 3.3242794422260875e+00 3.4742534073277792e-02 3.0006735242340663e+00 4.6347203794729577e+00 -4.6609404227906281e-01 -3.0280004554858375e+00 -5.0515414198371920e+00 7.1009578993219830e-03 -3.0627574631196812e+00 -4.5544597711552885e+00 2.9236372650602921e-01 2.9153749840523600e+00 4.9138338390013248e+00 2.6134035046094815e-02 3.3404713306050682e+00 7.5744024102166252e+00 -3.3193206505184442e-01 -3.2270441166108501e+00 -7.0954896200907545e+00 1.0671718545903788e+00 4.8026563173868392e-01 4.4338297937594606e-01 -1.2532917245116642e+00 -7.2857562417098276e-01 -5.2138419238649725e-01 -2.2270710001748601e+00 -5.6466949697390190e-01 -3.9889820166049633e-01 2.3499416515549836e+00 7.2029059002116502e-01 5.8791295681155198e-01 2.2018347274929368e+00 3.5029667625271377e-01 2.4608570082552211e-01 -2.3861231971056700e+00 -7.1021695065842450e-01 -6.1544303654593246e-01 -4.4732726487917160e+00 -3.6653187656841907e-01 -3.3193206505184447e-01 4.7208103369456111e+00 8.1914105035916573e-01 5.9027585863175047e-01 1.9988545725755463e-01 4.4399219434101909e+00 2.9113546854521730e+00 -7.3670185438398794e-01 -4.8018931270576708e+00 -2.6378366194142262e+00 -2.5650660097853123e-01 -6.2573918789123111e+00 -2.8614574368321803e+00 7.1829587281039553e-01 5.7614026058980796e+00 2.9271947037918205e+00 4.1741515706941579e-01 6.0685444931961596e+00 2.7539129798718722e+00 -7.4115092379183867e-01 -5.6535749582718093e+00 -2.9817921010521991e+00 -4.2037815834217451e-01 -8.4293916850602937e+00 -3.2270441166108501e+00 8.1914105035916573e-01 8.8723826067976521e+00 3.1156679047935913e+00 1.8532834645770888e-01 2.6116071966101626e+00 3.2875133255705453e+00 -5.2670830601000329e-01 -2.6352755414723208e+00 -2.9906188536118918e+00 -1.8103883663599446e-01 -2.8696431885693729e+00 -4.2461545459320540e+00 5.9225856759749684e-01 2.9528911743634225e+00 4.5850994106150296e+00 2.9666258136923462e-01 2.7653934209124440e+00 4.1768743921277576e+00 -5.7617907958732162e-01 -2.6671766002705222e+00 -4.5341737024605555e+00 -3.8059913182287214e-01 -3.2734643663674055e+00 -7.0954896200907545e+00 5.9027585863175058e-01 3.1156679047935918e+00 6.8169495937819224e+00 hypre-2.33.0/src/test/TEST_fei/solvers.jobs000077500000000000000000000013641477326011500204670ustar00rootroot00000000000000#!/bin/bash # Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) #============================================================================= # fei: Run through solvers #============================================================================= mpirun -np 4 ./fei -solver 0 > solvers.out.0 mpirun -np 4 ./fei -solver 1 > solvers.out.1 mpirun -np 4 ./fei -solver 2 > solvers.out.2 mpirun -np 4 ./fei -solver 3 > solvers.out.3 mpirun -np 4 ./fei -solver 4 > solvers.out.4 mpirun -np 4 ./fei -solver 5 > solvers.out.5 mpirun -np 4 ./fei -solver 6 > solvers.out.6 mpirun -np 4 ./fei -solver 7 > solvers.out.7 hypre-2.33.0/src/test/TEST_fei/solvers.saved000066400000000000000000000064501477326011500206320ustar00rootroot00000000000000Running with these driver parameters: solver ID = 0 Laplacian_27pt: (nx, ny, nz) = (20, 20, 20) (Px, Py, Pz) = (1, 4, 1) 0 : sumIntoRHSVector ERROR - index 2000 out of range. 1 : sumIntoRHSVector ERROR - index 4000 out of range. bm_list_26170: (1.286554) wakeup_slave: unable to interrupt slave 0 pid 26169 Broken pipe p3_26304: p4_error: net_recv read: probable EOF on socket: 1 Running with these driver parameters: solver ID = 1 Laplacian_27pt: (nx, ny, nz) = (20, 20, 20) (Px, Py, Pz) = (1, 4, 1) 0 : sumIntoRHSVector ERROR - index 2000 out of range. 3 : sumIntoRHSVector ERROR - index 8000 out of range. 2 : sumIntoRHSVector ERROR - index 6000 out of range. 1 : sumIntoRHSVector ERROR - index 4000 out of range. Running with these driver parameters: solver ID = 2 Laplacian_27pt: (nx, ny, nz) = (20, 20, 20) (Px, Py, Pz) = (1, 4, 1) 0 : sumIntoRHSVector ERROR - index 2000 out of range. bm_list_26758: (1.140099) wakeup_slave: unable to interrupt slave 0 pid 26757 p1_26804: p4_error: net_recv read: probable EOF on socket: 1 2 : sumIntoRHSVector ERROR - index 6000 out of range. 3 : sumIntoRHSVector ERROR - index 8000 out of range. Running with these driver parameters: solver ID = 3 Laplacian_27pt: (nx, ny, nz) = (20, 20, 20) (Px, Py, Pz) = (1, 4, 1) 0 : sumIntoRHSVector ERROR - index 2000 out of range. bm_list_27061: (1.188056) wakeup_slave: unable to interrupt slave 0 pid 27060 1 : sumIntoRHSVector ERROR - index 4000 out of range. p3_27205: p4_error: net_recv read: probable EOF on socket: 1 2 : sumIntoRHSVector ERROR - index 6000 out of range. Running with these driver parameters: solver ID = 4 Laplacian_27pt: (nx, ny, nz) = (20, 20, 20) (Px, Py, Pz) = (1, 4, 1) 0 : sumIntoRHSVector ERROR - index 2000 out of range. 1 : sumIntoRHSVector ERROR - index 4000 out of range. bm_list_27365: (1.214990) wakeup_slave: unable to interrupt slave 0 pid 27364 p3_27508: p4_error: net_recv read: probable EOF on socket: 1 Broken pipe rm_l_1_27412: (0.827994) net_send: could not write to fd=6, errno = 9 rm_l_1_27412: p4_error: net_send write: -1 Running with these driver parameters: solver ID = 5 Laplacian_27pt: (nx, ny, nz) = (20, 20, 20) (Px, Py, Pz) = (1, 4, 1) 0 : sumIntoRHSVector ERROR - index 2000 out of range. bm_list_27668: (1.212417) wakeup_slave: unable to interrupt slave 0 pid 27667 1 : sumIntoRHSVector ERROR - index 4000 out of range. p3_27811: p4_error: net_recv read: probable EOF on socket: 1 2 : sumIntoRHSVector ERROR - index 6000 out of range. Running with these driver parameters: solver ID = 6 Laplacian_27pt: (nx, ny, nz) = (20, 20, 20) (Px, Py, Pz) = (1, 4, 1) 0 : sumIntoRHSVector ERROR - index 2000 out of range. 1 : sumIntoRHSVector ERROR - index 4000 out of range. 3 : sumIntoRHSVector ERROR - index 8000 out of range. 2 : sumIntoRHSVector ERROR - index 6000 out of range. Running with these driver parameters: solver ID = 7 Laplacian_27pt: (nx, ny, nz) = (20, 20, 20) (Px, Py, Pz) = (1, 4, 1) 0 : sumIntoRHSVector ERROR - index 2000 out of range. bm_list_28274: (1.184531) wakeup_slave: unable to interrupt slave 0 pid 28273 1 : sumIntoRHSVector ERROR - index 4000 out of range. 2 : sumIntoRHSVector ERROR - index 6000 out of range. p3_28427: p4_error: net_recv read: probable EOF on socket: 1 hypre-2.33.0/src/test/TEST_fei/solvers.sh000077500000000000000000000005731477326011500201450ustar00rootroot00000000000000#!/bin/bash # Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) #============================================================================= # no tests #============================================================================= hypre-2.33.0/src/test/TEST_gpumemcheck/000077500000000000000000000000001477326011500176315ustar00rootroot00000000000000hypre-2.33.0/src/test/TEST_gpumemcheck/gpu.jobs000066400000000000000000000006701477326011500213060ustar00rootroot00000000000000#!/bin/bash # Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) mpirun -np 4 ./ij -n 20 20 10 -P 2 2 1 -solver 1 > gpu.out.1 mpirun -np 4 ./ij -n 20 20 10 -P 2 2 1 -solver 3 > gpu.out.2 mpirun -np 4 ./struct -P 2 2 1 -solver 0 > gpu.out.3 mpirun -np 4 ./struct -P 2 2 1 -solver 1 > gpu.out.4 hypre-2.33.0/src/test/TEST_gpumemcheck/gpu.saved.lassen000066400000000000000000000030101477326011500227260ustar00rootroot00000000000000# Output file: gpu.out.1 ========= LEAK SUMMARY: 0 bytes leaked in 0 allocations ========= LEAK SUMMARY: 0 bytes leaked in 0 allocations ========= LEAK SUMMARY: 0 bytes leaked in 0 allocations ========= LEAK SUMMARY: 0 bytes leaked in 0 allocations ========= ERROR SUMMARY: 0 errors ========= ERROR SUMMARY: 0 errors ========= ERROR SUMMARY: 0 errors ========= ERROR SUMMARY: 0 errors # Output file: gpu.out.2 ========= LEAK SUMMARY: 0 bytes leaked in 0 allocations ========= LEAK SUMMARY: 0 bytes leaked in 0 allocations ========= LEAK SUMMARY: 0 bytes leaked in 0 allocations ========= LEAK SUMMARY: 0 bytes leaked in 0 allocations ========= ERROR SUMMARY: 0 errors ========= ERROR SUMMARY: 0 errors ========= ERROR SUMMARY: 0 errors ========= ERROR SUMMARY: 0 errors # Output file: gpu.out.3 ========= LEAK SUMMARY: 0 bytes leaked in 0 allocations ========= LEAK SUMMARY: 0 bytes leaked in 0 allocations ========= LEAK SUMMARY: 0 bytes leaked in 0 allocations ========= LEAK SUMMARY: 0 bytes leaked in 0 allocations ========= ERROR SUMMARY: 0 errors ========= ERROR SUMMARY: 0 errors ========= ERROR SUMMARY: 0 errors ========= ERROR SUMMARY: 0 errors # Output file: gpu.out.4 ========= LEAK SUMMARY: 0 bytes leaked in 0 allocations ========= LEAK SUMMARY: 0 bytes leaked in 0 allocations ========= LEAK SUMMARY: 0 bytes leaked in 0 allocations ========= LEAK SUMMARY: 0 bytes leaked in 0 allocations ========= ERROR SUMMARY: 0 errors ========= ERROR SUMMARY: 0 errors ========= ERROR SUMMARY: 0 errors ========= ERROR SUMMARY: 0 errors hypre-2.33.0/src/test/TEST_gpumemcheck/gpu.sh000077500000000000000000000015241477326011500207650ustar00rootroot00000000000000#!/bin/bash # Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) TNAME=`basename $0 .sh` RTOL=$1 ATOL=$2 #============================================================================= # compare with baseline case #============================================================================= FILES="\ ${TNAME}.out.1\ ${TNAME}.out.2\ ${TNAME}.out.3\ ${TNAME}.out.4\ " for i in $FILES do echo "# Output file: $i" grep "LEAK SUMMARY" $i grep "ERROR SUMMARY" $i echo done > ${TNAME}.out #============================================================================= # remove temporary files #============================================================================= rm -f ${TNAME}.testdata* hypre-2.33.0/src/test/TEST_ij/000077500000000000000000000000001477326011500157435ustar00rootroot00000000000000hypre-2.33.0/src/test/TEST_ij/.psrc000066400000000000000000000002131477326011500167070ustar00rootroot00000000000000insure++.report_file insure.log insure++.report_overwrite false insure++.summarize leaks outstanding insure++.suppress EXPR_NULL,PARM_NULL hypre-2.33.0/src/test/TEST_ij/A.00000000066400000000000000000007466331477326011500165270ustar00rootroot000000000000000 503 0 503 0 0 1.15384615384653e+00 0 1 5.55111512312578e-17 0 2 -3.84615384615572e-01 0 3 4.80769230769231e-02 0 42 1.92307692307318e-01 0 43 -1.38777878078145e-17 0 44 -2.88461538461352e-01 0 45 -2.40384615384615e-01 1 1 1.15384615384653e+00 1 0 5.55111512312578e-17 1 2 -4.80769230769231e-02 1 3 9.61538461536592e-02 1 42 1.38777878078145e-17 1 43 -7.69230769231143e-01 1 44 -2.40384615384615e-01 1 45 -2.88461538461352e-01 2 2 1.15384615384653e+00 2 1 -4.80769230769231e-02 2 0 -3.84615384615572e-01 2 3 5.55111512312578e-17 2 4 -3.84615384615572e-01 2 5 4.80769230769231e-02 2 42 -2.88461538461352e-01 2 43 2.40384615384615e-01 2 44 1.92307692307318e-01 2 45 -1.38777878078145e-17 2 46 -2.88461538461352e-01 2 47 -2.40384615384615e-01 3 3 1.15384615384653e+00 3 1 9.61538461536592e-02 3 2 5.55111512312578e-17 3 0 4.80769230769231e-02 3 4 -4.80769230769231e-02 3 5 9.61538461536592e-02 3 42 2.40384615384615e-01 3 43 -2.88461538461351e-01 3 44 1.38777878078145e-17 3 45 -7.69230769231143e-01 3 46 -2.40384615384615e-01 3 47 -2.88461538461352e-01 4 4 1.15384615384653e+00 4 3 -4.80769230769231e-02 4 2 -3.84615384615572e-01 4 5 -2.77555756156289e-17 4 6 -3.84615384615571e-01 4 7 4.80769230769231e-02 4 44 -2.88461538461352e-01 4 45 2.40384615384615e-01 4 46 1.92307692307318e-01 4 47 1.38777878078145e-17 4 48 -2.88461538461351e-01 4 49 -2.40384615384615e-01 5 5 1.15384615384653e+00 5 3 9.61538461536592e-02 5 4 -2.77555756156289e-17 5 2 4.80769230769231e-02 5 6 -4.80769230769231e-02 5 7 9.61538461536593e-02 5 44 2.40384615384615e-01 5 45 -2.88461538461351e-01 5 46 -6.93889390390723e-18 5 47 -7.69230769231143e-01 5 48 -2.40384615384615e-01 5 49 -2.88461538461352e-01 6 6 1.15384615384653e+00 6 5 -4.80769230769231e-02 6 4 -3.84615384615571e-01 6 7 5.55111512312578e-17 6 8 -3.84615384615571e-01 6 9 4.80769230769231e-02 6 46 -2.88461538461351e-01 6 47 2.40384615384615e-01 6 48 1.92307692307318e-01 6 49 2.08166817117217e-17 6 50 -2.88461538461351e-01 6 51 -2.40384615384615e-01 7 7 1.15384615384653e+00 7 5 9.61538461536593e-02 7 6 5.55111512312578e-17 7 4 4.80769230769231e-02 7 8 -4.80769230769231e-02 7 9 9.61538461536593e-02 7 46 2.40384615384615e-01 7 47 -2.88461538461352e-01 7 48 3.46944695195361e-17 7 49 -7.69230769231144e-01 7 50 -2.40384615384615e-01 7 51 -2.88461538461352e-01 8 8 1.15384615384653e+00 8 7 -4.80769230769231e-02 8 6 -3.84615384615571e-01 8 9 1.11022302462516e-16 8 10 -3.84615384615572e-01 8 11 4.80769230769231e-02 8 48 -2.88461538461351e-01 8 49 2.40384615384615e-01 8 50 1.92307692307318e-01 8 51 6.93889390390723e-18 8 52 -2.88461538461352e-01 8 53 -2.40384615384615e-01 9 9 1.15384615384653e+00 9 7 9.61538461536593e-02 9 8 1.11022302462516e-16 9 6 4.80769230769231e-02 9 10 -4.80769230769231e-02 9 11 9.61538461536590e-02 9 48 2.40384615384615e-01 9 49 -2.88461538461352e-01 9 50 0.00000000000000e+00 9 51 -7.69230769231143e-01 9 52 -2.40384615384615e-01 9 53 -2.88461538461351e-01 10 10 1.15384615384653e+00 10 9 -4.80769230769230e-02 10 8 -3.84615384615572e-01 10 11 8.32667268468867e-17 10 12 -3.84615384615571e-01 10 13 4.80769230769231e-02 10 50 -2.88461538461352e-01 10 51 2.40384615384615e-01 10 52 1.92307692307318e-01 10 53 -6.93889390390723e-17 10 54 -2.88461538461351e-01 10 55 -2.40384615384615e-01 11 11 1.15384615384653e+00 11 9 9.61538461536590e-02 11 10 8.32667268468867e-17 11 8 4.80769230769231e-02 11 12 -4.80769230769231e-02 11 13 9.61538461536594e-02 11 50 2.40384615384615e-01 11 51 -2.88461538461351e-01 11 52 2.08166817117217e-17 11 53 -7.69230769231143e-01 11 54 -2.40384615384615e-01 11 55 -2.88461538461352e-01 12 12 1.15384615384653e+00 12 11 -4.80769230769231e-02 12 10 -3.84615384615571e-01 12 13 0.00000000000000e+00 12 14 -3.84615384615572e-01 12 15 4.80769230769231e-02 12 52 -2.88461538461351e-01 12 53 2.40384615384615e-01 12 54 1.92307692307318e-01 12 55 1.38777878078145e-17 12 56 -2.88461538461352e-01 12 57 -2.40384615384615e-01 13 13 1.15384615384653e+00 13 11 9.61538461536594e-02 13 12 5.55111512312578e-17 13 10 4.80769230769231e-02 13 14 -4.80769230769231e-02 13 15 9.61538461536589e-02 13 52 2.40384615384615e-01 13 53 -2.88461538461352e-01 13 54 -4.16333634234434e-17 13 55 -7.69230769231143e-01 13 56 -2.40384615384615e-01 13 57 -2.88461538461351e-01 14 14 5.76923586182523e-01 14 13 -4.80769230769231e-02 14 12 -3.84615384615572e-01 14 15 -2.40384441773504e-01 14 16 -3.00925925926091e-07 14 17 -3.47222222222222e-08 14 54 -2.88461538461352e-01 14 55 2.40384615384615e-01 14 56 9.61538924499558e-02 14 57 4.80769577991453e-02 14 58 -2.54629629629465e-07 14 59 -1.73611111111111e-07 15 15 5.76923586182523e-01 15 13 9.61538461536589e-02 15 14 -2.40384441773504e-01 15 12 4.80769230769231e-02 15 16 3.47222222222222e-08 15 17 4.62962962961317e-08 15 54 2.40384615384615e-01 15 55 -2.88461538461351e-01 15 56 -4.80769577991453e-02 15 57 -3.84615685541497e-01 15 58 -1.73611111111111e-07 15 59 -2.54629629629465e-07 16 16 1.01851851851885e-06 16 15 3.47222222222222e-08 16 14 -3.00925925926091e-07 16 17 -2.64697796016969e-23 16 18 -3.00925925926091e-07 16 19 -3.47222222222222e-08 16 56 -2.54629629629465e-07 16 57 1.73611111111111e-07 16 58 9.25925925922624e-08 16 59 1.98523347012727e-23 16 60 -2.54629629629465e-07 16 61 -1.73611111111111e-07 17 17 1.01851851851885e-06 17 15 4.62962962961317e-08 17 16 2.64697796016969e-23 17 14 -3.47222222222222e-08 17 18 3.47222222222222e-08 17 19 4.62962962961310e-08 17 56 1.73611111111111e-07 17 57 -2.54629629629465e-07 17 58 1.32348898008484e-23 17 59 -6.01851851852182e-07 17 60 -1.73611111111111e-07 17 61 -2.54629629629465e-07 18 18 1.01851851851885e-06 18 17 3.47222222222222e-08 18 16 -3.00925925926091e-07 18 19 0.00000000000000e+00 18 20 -3.00925925926091e-07 18 21 -3.47222222222222e-08 18 58 -2.54629629629465e-07 18 59 1.73611111111111e-07 18 60 9.25925925922629e-08 18 61 -2.64697796016969e-23 18 62 -2.54629629629465e-07 18 63 -1.73611111111111e-07 19 19 1.01851851851885e-06 19 17 4.62962962961310e-08 19 18 0.00000000000000e+00 19 16 -3.47222222222222e-08 19 20 3.47222222222222e-08 19 21 4.62962962961311e-08 19 58 1.73611111111111e-07 19 59 -2.54629629629465e-07 19 60 0.00000000000000e+00 19 61 -6.01851851852182e-07 19 62 -1.73611111111111e-07 19 63 -2.54629629629465e-07 20 20 1.01851851851885e-06 20 19 3.47222222222222e-08 20 18 -3.00925925926091e-07 20 21 -5.29395592033938e-23 20 22 -3.00925925926091e-07 20 23 -3.47222222222222e-08 20 60 -2.54629629629465e-07 20 61 1.73611111111111e-07 20 62 9.25925925922627e-08 20 63 1.32348898008484e-23 20 64 -2.54629629629465e-07 20 65 -1.73611111111111e-07 21 21 1.01851851851885e-06 21 19 4.62962962961311e-08 21 20 -2.64697796016969e-23 21 18 -3.47222222222222e-08 21 22 3.47222222222222e-08 21 23 4.62962962961314e-08 21 60 1.73611111111111e-07 21 61 -2.54629629629465e-07 21 62 3.30872245021211e-23 21 63 -6.01851851852182e-07 21 64 -1.73611111111111e-07 21 65 -2.54629629629465e-07 22 22 1.01851851851885e-06 22 21 3.47222222222222e-08 22 20 -3.00925925926091e-07 22 23 5.29395592033938e-23 22 24 -3.00925925926090e-07 22 25 -3.47222222222222e-08 22 62 -2.54629629629465e-07 22 63 1.73611111111111e-07 22 64 9.25925925922616e-08 22 65 -6.61744490042422e-24 22 66 -2.54629629629464e-07 22 67 -1.73611111111111e-07 23 23 1.01851851851885e-06 23 21 4.62962962961314e-08 23 22 5.29395592033938e-23 23 20 -3.47222222222222e-08 23 24 3.47222222222222e-08 23 25 4.62962962961321e-08 23 62 1.73611111111111e-07 23 63 -2.54629629629465e-07 23 64 -3.30872245021211e-23 23 65 -6.01851851852183e-07 23 66 -1.73611111111111e-07 23 67 -2.54629629629465e-07 24 24 1.01851851851885e-06 24 23 3.47222222222222e-08 24 22 -3.00925925926090e-07 24 25 -2.64697796016969e-23 24 26 -3.00925925926091e-07 24 27 -3.47222222222222e-08 24 64 -2.54629629629464e-07 24 65 1.73611111111111e-07 24 66 9.25925925922616e-08 24 67 -3.30872245021211e-23 24 68 -2.54629629629465e-07 24 69 -1.73611111111111e-07 25 25 1.01851851851885e-06 25 23 4.62962962961321e-08 25 24 -2.64697796016969e-23 25 22 -3.47222222222222e-08 25 26 3.47222222222222e-08 25 27 4.62962962961314e-08 25 64 1.73611111111111e-07 25 65 -2.54629629629465e-07 25 66 1.32348898008484e-23 25 67 -6.01851851852183e-07 25 68 -1.73611111111111e-07 25 69 -2.54629629629465e-07 26 26 1.01851851851885e-06 26 25 3.47222222222222e-08 26 24 -3.00925925926091e-07 26 27 7.94093388050907e-23 26 28 -3.00925925926091e-07 26 29 -3.47222222222222e-08 26 66 -2.54629629629465e-07 26 67 1.73611111111111e-07 26 68 9.25925925922626e-08 26 69 1.32348898008484e-23 26 70 -2.54629629629465e-07 26 71 -1.73611111111111e-07 27 27 1.01851851851885e-06 27 25 4.62962962961314e-08 27 26 7.94093388050907e-23 27 24 -3.47222222222222e-08 27 28 3.47222222222222e-08 27 29 4.62962962961311e-08 27 66 1.73611111111111e-07 27 67 -2.54629629629465e-07 27 68 -6.61744490042422e-24 27 69 -6.01851851852182e-07 27 70 -1.73611111111111e-07 27 71 -2.54629629629465e-07 28 28 1.01851851851885e-06 28 27 3.47222222222222e-08 28 26 -3.00925925926091e-07 28 29 0.00000000000000e+00 28 30 -3.00925925926091e-07 28 31 -3.47222222222222e-08 28 68 -2.54629629629465e-07 28 69 1.73611111111111e-07 28 70 9.25925925922629e-08 28 71 2.64697796016969e-23 28 72 -2.54629629629465e-07 28 73 -1.73611111111111e-07 29 29 1.01851851851885e-06 29 27 4.62962962961311e-08 29 28 2.64697796016969e-23 29 26 -3.47222222222222e-08 29 30 3.47222222222222e-08 29 31 4.62962962961310e-08 29 68 1.73611111111111e-07 29 69 -2.54629629629465e-07 29 70 0.00000000000000e+00 29 71 -6.01851851852182e-07 29 72 -1.73611111111111e-07 29 73 -2.54629629629465e-07 30 30 8.33384259259529e-03 30 29 3.47222222222222e-08 30 28 -3.00925925926091e-07 30 31 4.46411210317461e-03 30 32 -6.54761904762174e-03 30 33 2.67857142857143e-03 30 70 -2.54629629629465e-07 30 71 1.73611111111111e-07 30 72 2.38099867724597e-03 30 73 -2.67860615079365e-03 30 74 -4.16666666666396e-03 30 75 -4.46428571428572e-03 31 31 8.33384259259531e-03 31 29 4.62962962961310e-08 31 30 4.46411210317460e-03 31 28 -3.47222222222222e-08 31 32 -2.67857142857143e-03 31 33 2.38095238094969e-03 31 70 1.73611111111111e-07 31 71 -2.54629629629465e-07 31 72 2.67860615079365e-03 31 73 -6.54791997354769e-03 31 74 -4.46428571428572e-03 31 75 -4.16666666666397e-03 32 32 1.66666666666721e-02 32 31 -2.67857142857143e-03 32 30 -6.54761904762174e-03 32 33 -8.67361737988404e-19 32 34 -6.54761904762176e-03 32 35 2.67857142857143e-03 32 72 -4.16666666666396e-03 32 73 4.46428571428572e-03 32 74 4.76190476189936e-03 32 75 8.67361737988404e-19 32 76 -4.16666666666397e-03 32 77 -4.46428571428572e-03 33 33 1.66666666666721e-02 33 31 2.38095238094969e-03 33 32 -8.67361737988404e-19 33 30 2.67857142857143e-03 33 34 -2.67857142857143e-03 33 35 2.38095238094968e-03 33 72 4.46428571428572e-03 33 73 -4.16666666666397e-03 33 74 -1.30104260698261e-18 33 75 -1.30952380952435e-02 33 76 -4.46428571428571e-03 33 77 -4.16666666666397e-03 34 34 1.66666666666721e-02 34 33 -2.67857142857143e-03 34 32 -6.54761904762176e-03 34 35 0.00000000000000e+00 34 36 -6.54761904762178e-03 34 37 2.67857142857143e-03 34 74 -4.16666666666397e-03 34 75 4.46428571428572e-03 34 76 4.76190476189938e-03 34 77 0.00000000000000e+00 34 78 -4.16666666666398e-03 34 79 -4.46428571428572e-03 35 35 1.66666666666721e-02 35 33 2.38095238094968e-03 35 34 0.00000000000000e+00 35 32 2.67857142857143e-03 35 36 -2.67857142857143e-03 35 37 2.38095238094967e-03 35 74 4.46428571428571e-03 35 75 -4.16666666666397e-03 35 76 1.30104260698261e-18 35 77 -1.30952380952435e-02 35 78 -4.46428571428572e-03 35 79 -4.16666666666396e-03 36 36 1.66666666666721e-02 36 35 -2.67857142857143e-03 36 34 -6.54761904762178e-03 36 37 8.67361737988404e-19 36 38 -6.54761904762174e-03 36 39 2.67857142857143e-03 36 76 -4.16666666666398e-03 36 77 4.46428571428572e-03 36 78 4.76190476189937e-03 36 79 -4.33680868994202e-19 36 80 -4.16666666666396e-03 36 81 -4.46428571428572e-03 37 37 1.66666666666721e-02 37 35 2.38095238094967e-03 37 36 -8.67361737988404e-19 37 34 2.67857142857143e-03 37 38 -2.67857142857143e-03 37 39 2.38095238094969e-03 37 76 4.46428571428572e-03 37 77 -4.16666666666396e-03 37 78 -1.30104260698261e-18 37 79 -1.30952380952435e-02 37 80 -4.46428571428572e-03 37 81 -4.16666666666397e-03 38 38 1.66666666666721e-02 38 37 -2.67857142857143e-03 38 36 -6.54761904762174e-03 38 39 0.00000000000000e+00 38 40 -6.54761904762174e-03 38 41 2.67857142857143e-03 38 78 -4.16666666666396e-03 38 79 4.46428571428572e-03 38 80 4.76190476189935e-03 38 81 4.33680868994202e-19 38 82 -4.16666666666396e-03 38 83 -4.46428571428572e-03 39 39 1.66666666666721e-02 39 37 2.38095238094969e-03 39 38 -8.67361737988404e-19 39 36 2.67857142857143e-03 39 40 -2.67857142857143e-03 39 41 2.38095238094969e-03 39 78 4.46428571428572e-03 39 79 -4.16666666666397e-03 39 80 4.33680868994202e-19 39 81 -1.30952380952435e-02 39 82 -4.46428571428572e-03 39 83 -4.16666666666397e-03 40 40 1.66666666666721e-02 40 39 -2.67857142857143e-03 40 38 -6.54761904762174e-03 40 41 -8.67361737988404e-19 40 80 -4.16666666666396e-03 40 81 4.46428571428572e-03 40 82 4.76190476189936e-03 40 83 4.33680868994202e-19 41 41 1.66666666666721e-02 41 39 2.38095238094969e-03 41 40 -8.67361737988404e-19 41 38 2.67857142857143e-03 41 80 4.46428571428572e-03 41 81 -4.16666666666397e-03 41 82 0.00000000000000e+00 41 83 -1.30952380952435e-02 42 42 2.30769230769306e+00 42 1 0.00000000000000e+00 42 2 -2.88461538461351e-01 42 3 2.40384615384615e-01 42 0 1.92307692307318e-01 42 43 2.77555756156289e-17 42 44 -7.69230769231143e-01 42 45 6.93889390390723e-18 42 84 1.92307692307318e-01 42 85 -1.38777878078145e-17 42 86 -2.88461538461352e-01 42 87 -2.40384615384615e-01 43 43 2.30769230769306e+00 43 1 -7.69230769231143e-01 43 2 2.40384615384615e-01 43 3 -2.88461538461352e-01 43 42 2.77555756156289e-17 43 0 0.00000000000000e+00 43 44 0.00000000000000e+00 43 45 1.92307692307318e-01 43 84 1.38777878078145e-17 43 85 -7.69230769231143e-01 43 86 -2.40384615384615e-01 43 87 -2.88461538461352e-01 44 44 2.30769230769306e+00 44 1 -2.40384615384615e-01 44 2 1.92307692307318e-01 44 3 0.00000000000000e+00 44 4 -2.88461538461351e-01 44 5 2.40384615384615e-01 44 42 -7.69230769231143e-01 44 43 0.00000000000000e+00 44 0 -2.88461538461351e-01 44 45 2.77555756156289e-17 44 46 -7.69230769231143e-01 44 47 6.93889390390723e-18 44 84 -2.88461538461352e-01 44 85 2.40384615384615e-01 44 86 1.92307692307318e-01 44 87 -1.38777878078145e-17 44 88 -2.88461538461352e-01 44 89 -2.40384615384615e-01 45 45 2.30769230769306e+00 45 1 -2.88461538461351e-01 45 2 0.00000000000000e+00 45 3 -7.69230769231143e-01 45 4 2.40384615384615e-01 45 5 -2.88461538461352e-01 45 42 0.00000000000000e+00 45 43 1.92307692307318e-01 45 44 2.77555756156289e-17 45 0 -2.40384615384615e-01 45 46 0.00000000000000e+00 45 47 1.92307692307318e-01 45 84 2.40384615384615e-01 45 85 -2.88461538461351e-01 45 86 1.38777878078145e-17 45 87 -7.69230769231143e-01 45 88 -2.40384615384615e-01 45 89 -2.88461538461352e-01 46 46 2.30769230769306e+00 46 3 -2.40384615384615e-01 46 4 1.92307692307318e-01 46 5 -2.08166817117217e-17 46 6 -2.88461538461351e-01 46 7 2.40384615384615e-01 46 44 -7.69230769231143e-01 46 45 0.00000000000000e+00 46 2 -2.88461538461351e-01 46 47 2.77555756156289e-17 46 48 -7.69230769231143e-01 46 49 6.93889390390723e-18 46 86 -2.88461538461352e-01 46 87 2.40384615384615e-01 46 88 1.92307692307318e-01 46 89 1.38777878078145e-17 46 90 -2.88461538461351e-01 46 91 -2.40384615384615e-01 47 47 2.30769230769306e+00 47 3 -2.88461538461351e-01 47 4 0.00000000000000e+00 47 5 -7.69230769231143e-01 47 6 2.40384615384615e-01 47 7 -2.88461538461351e-01 47 44 0.00000000000000e+00 47 45 1.92307692307318e-01 47 46 2.77555756156289e-17 47 2 -2.40384615384615e-01 47 48 -6.93889390390723e-18 47 49 1.92307692307319e-01 47 86 2.40384615384615e-01 47 87 -2.88461538461351e-01 47 88 -6.93889390390723e-18 47 89 -7.69230769231143e-01 47 90 -2.40384615384615e-01 47 91 -2.88461538461352e-01 48 48 2.30769230769305e+00 48 5 -2.40384615384615e-01 48 6 1.92307692307318e-01 48 7 3.46944695195361e-17 48 8 -2.88461538461351e-01 48 9 2.40384615384615e-01 48 46 -7.69230769231143e-01 48 47 -6.93889390390723e-18 48 4 -2.88461538461351e-01 48 49 0.00000000000000e+00 48 50 -7.69230769231143e-01 48 51 -6.93889390390723e-18 48 88 -2.88461538461351e-01 48 89 2.40384615384615e-01 48 90 1.92307692307318e-01 48 91 2.08166817117217e-17 48 92 -2.88461538461351e-01 48 93 -2.40384615384615e-01 49 49 2.30769230769306e+00 49 5 -2.88461538461351e-01 49 6 -6.93889390390723e-18 49 7 -7.69230769231144e-01 49 8 2.40384615384615e-01 49 9 -2.88461538461351e-01 49 46 6.93889390390723e-18 49 47 1.92307692307319e-01 49 48 0.00000000000000e+00 49 4 -2.40384615384615e-01 49 50 6.93889390390723e-18 49 51 1.92307692307319e-01 49 88 2.40384615384615e-01 49 89 -2.88461538461352e-01 49 90 3.46944695195361e-17 49 91 -7.69230769231144e-01 49 92 -2.40384615384615e-01 49 93 -2.88461538461352e-01 50 50 2.30769230769306e+00 50 7 -2.40384615384615e-01 50 8 1.92307692307318e-01 50 9 6.93889390390723e-18 50 10 -2.88461538461352e-01 50 11 2.40384615384615e-01 50 48 -7.69230769231143e-01 50 49 6.93889390390723e-18 50 6 -2.88461538461351e-01 50 51 0.00000000000000e+00 50 52 -7.69230769231144e-01 50 53 -3.46944695195361e-17 50 90 -2.88461538461351e-01 50 91 2.40384615384615e-01 50 92 1.92307692307318e-01 50 93 6.93889390390723e-18 50 94 -2.88461538461352e-01 50 95 -2.40384615384615e-01 51 51 2.30769230769306e+00 51 7 -2.88461538461351e-01 51 8 -3.46944695195361e-17 51 9 -7.69230769231143e-01 51 10 2.40384615384615e-01 51 11 -2.88461538461351e-01 51 48 -6.93889390390723e-18 51 49 1.92307692307319e-01 51 50 5.55111512312578e-17 51 6 -2.40384615384615e-01 51 52 2.77555756156289e-17 51 53 1.92307692307318e-01 51 90 2.40384615384615e-01 51 91 -2.88461538461352e-01 51 92 0.00000000000000e+00 51 93 -7.69230769231143e-01 51 94 -2.40384615384615e-01 51 95 -2.88461538461351e-01 52 52 2.30769230769306e+00 52 9 -2.40384615384615e-01 52 10 1.92307692307318e-01 52 11 2.08166817117217e-17 52 12 -2.88461538461351e-01 52 13 2.40384615384615e-01 52 50 -7.69230769231144e-01 52 51 6.24500451351651e-17 52 8 -2.88461538461352e-01 52 53 5.55111512312578e-17 52 54 -7.69230769231142e-01 52 55 0.00000000000000e+00 52 92 -2.88461538461352e-01 52 93 2.40384615384615e-01 52 94 1.92307692307318e-01 52 95 -6.93889390390723e-17 52 96 -2.88461538461351e-01 52 97 -2.40384615384615e-01 53 53 2.30769230769306e+00 53 9 -2.88461538461351e-01 53 10 -3.46944695195361e-17 53 11 -7.69230769231143e-01 53 12 2.40384615384615e-01 53 13 -2.88461538461352e-01 53 50 -6.93889390390723e-18 53 51 1.92307692307318e-01 53 52 5.55111512312578e-17 53 8 -2.40384615384615e-01 53 54 0.00000000000000e+00 53 55 1.92307692307319e-01 53 92 2.40384615384615e-01 53 93 -2.88461538461351e-01 53 94 2.08166817117217e-17 53 95 -7.69230769231143e-01 53 96 -2.40384615384615e-01 53 97 -2.88461538461352e-01 54 54 2.30769230769306e+00 54 11 -2.40384615384615e-01 54 12 1.92307692307318e-01 54 13 -4.16333634234434e-17 54 14 -2.88461538461352e-01 54 15 2.40384615384615e-01 54 52 -7.69230769231142e-01 54 53 0.00000000000000e+00 54 10 -2.88461538461351e-01 54 55 -2.77555756156289e-17 54 56 -7.69230769231144e-01 54 57 0.00000000000000e+00 54 94 -2.88461538461351e-01 54 95 2.40384615384615e-01 54 96 1.92307692307318e-01 54 97 1.38777878078145e-17 54 98 -2.88461538461352e-01 54 99 -2.40384615384615e-01 55 55 2.30769230769306e+00 55 11 -2.88461538461352e-01 55 12 1.38777878078145e-17 55 13 -7.69230769231143e-01 55 14 2.40384615384615e-01 55 15 -2.88461538461351e-01 55 52 0.00000000000000e+00 55 53 1.92307692307319e-01 55 54 2.77555756156289e-17 55 10 -2.40384615384615e-01 55 56 6.93889390390723e-18 55 57 1.92307692307318e-01 55 94 2.40384615384615e-01 55 95 -2.88461538461352e-01 55 96 -4.16333634234434e-17 55 97 -7.69230769231143e-01 55 98 -2.40384615384615e-01 55 99 -2.88461538461351e-01 56 56 1.15384717236505e+00 56 13 -2.40384615384615e-01 56 14 9.61538924499558e-02 56 15 -4.80769577991453e-02 56 16 -2.54629629629465e-07 56 17 1.73611111111111e-07 56 54 -7.69230769231144e-01 56 55 6.93889390390723e-18 56 12 -2.88461538461352e-01 56 57 4.04960364032973e-17 56 58 -6.01851851852181e-07 56 59 -1.98523347012727e-23 56 96 -2.88461538461352e-01 56 97 2.40384615384615e-01 56 98 9.61538924499558e-02 56 99 4.80769577991453e-02 56 100 -2.54629629629465e-07 56 101 -1.73611111111111e-07 57 57 1.15384717236505e+00 57 13 -2.88461538461351e-01 57 14 4.80769577991453e-02 57 15 -3.84615685541497e-01 57 16 1.73611111111111e-07 57 17 -2.54629629629465e-07 57 54 0.00000000000000e+00 57 55 1.92307692307318e-01 57 56 4.04960364032973e-17 57 12 -2.40384615384615e-01 57 58 -3.97046694025453e-23 57 59 9.25925925922633e-08 57 96 2.40384615384615e-01 57 97 -2.88461538461351e-01 57 98 -4.80769577991453e-02 57 99 -3.84615685541497e-01 57 100 -1.73611111111111e-07 57 101 -2.54629629629465e-07 58 58 2.03703703703770e-06 58 15 -1.73611111111111e-07 58 16 9.25925925922624e-08 58 17 -6.61744490042422e-24 58 18 -2.54629629629465e-07 58 19 1.73611111111111e-07 58 56 -6.01851851852181e-07 58 57 6.61744490042422e-24 58 14 -2.54629629629465e-07 58 59 -5.29395592033938e-23 58 60 -6.01851851852183e-07 58 61 0.00000000000000e+00 58 98 -2.54629629629465e-07 58 99 1.73611111111111e-07 58 100 9.25925925922624e-08 58 101 1.98523347012727e-23 58 102 -2.54629629629465e-07 58 103 -1.73611111111111e-07 59 59 2.03703703703770e-06 59 15 -2.54629629629465e-07 59 16 -1.32348898008484e-23 59 17 -6.01851851852182e-07 59 18 1.73611111111111e-07 59 19 -2.54629629629465e-07 59 56 6.61744490042422e-24 59 57 9.25925925922633e-08 59 58 5.29395592033938e-23 59 14 -1.73611111111111e-07 59 60 -6.61744490042422e-24 59 61 9.25925925922621e-08 59 98 1.73611111111111e-07 59 99 -2.54629629629465e-07 59 100 1.32348898008484e-23 59 101 -6.01851851852182e-07 59 102 -1.73611111111111e-07 59 103 -2.54629629629465e-07 60 60 2.03703703703770e-06 60 17 -1.73611111111111e-07 60 18 9.25925925922629e-08 60 19 0.00000000000000e+00 60 20 -2.54629629629465e-07 60 21 1.73611111111111e-07 60 58 -6.01851851852183e-07 60 59 6.61744490042422e-24 60 16 -2.54629629629465e-07 60 61 2.64697796016969e-23 60 62 -6.01851851852183e-07 60 63 -2.64697796016969e-23 60 100 -2.54629629629465e-07 60 101 1.73611111111111e-07 60 102 9.25925925922629e-08 60 103 -2.64697796016969e-23 60 104 -2.54629629629465e-07 60 105 -1.73611111111111e-07 61 61 2.03703703703770e-06 61 17 -2.54629629629465e-07 61 18 -1.32348898008484e-23 61 19 -6.01851851852182e-07 61 20 1.73611111111111e-07 61 21 -2.54629629629465e-07 61 58 -1.98523347012727e-23 61 59 9.25925925922621e-08 61 60 2.64697796016969e-23 61 16 -1.73611111111111e-07 61 62 -6.61744490042422e-24 61 63 9.25925925922622e-08 61 100 1.73611111111111e-07 61 101 -2.54629629629465e-07 61 102 0.00000000000000e+00 61 103 -6.01851851852182e-07 61 104 -1.73611111111111e-07 61 105 -2.54629629629465e-07 62 62 2.03703703703770e-06 62 19 -1.73611111111111e-07 62 20 9.25925925922627e-08 62 21 4.63221143029695e-23 62 22 -2.54629629629465e-07 62 23 1.73611111111111e-07 62 60 -6.01851851852183e-07 62 61 1.32348898008484e-23 62 18 -2.54629629629465e-07 62 63 -7.94093388050907e-23 62 64 -6.01851851852182e-07 62 65 6.61744490042422e-24 62 102 -2.54629629629465e-07 62 103 1.73611111111111e-07 62 104 9.25925925922627e-08 62 105 1.32348898008484e-23 62 106 -2.54629629629465e-07 62 107 -1.73611111111111e-07 63 63 2.03703703703770e-06 63 19 -2.54629629629465e-07 63 20 2.64697796016969e-23 63 21 -6.01851851852182e-07 63 22 1.73611111111111e-07 63 23 -2.54629629629465e-07 63 60 -6.61744490042422e-24 63 61 9.25925925922622e-08 63 62 -5.29395592033938e-23 63 18 -1.73611111111111e-07 63 64 0.00000000000000e+00 63 65 9.25925925922627e-08 63 102 1.73611111111111e-07 63 103 -2.54629629629465e-07 63 104 3.30872245021211e-23 63 105 -6.01851851852182e-07 63 106 -1.73611111111111e-07 63 107 -2.54629629629465e-07 64 64 2.03703703703770e-06 64 21 -1.73611111111111e-07 64 22 9.25925925922616e-08 64 23 -3.97046694025453e-23 64 24 -2.54629629629464e-07 64 25 1.73611111111111e-07 64 62 -6.01851851852182e-07 64 63 0.00000000000000e+00 64 20 -2.54629629629465e-07 64 65 2.64697796016969e-23 64 66 -6.01851851852180e-07 64 67 -1.32348898008484e-23 64 104 -2.54629629629465e-07 64 105 1.73611111111111e-07 64 106 9.25925925922616e-08 64 107 -6.61744490042422e-24 64 108 -2.54629629629464e-07 64 109 -1.73611111111111e-07 65 65 2.03703703703770e-06 65 21 -2.54629629629465e-07 65 22 -1.98523347012727e-23 65 23 -6.01851851852183e-07 65 24 1.73611111111111e-07 65 25 -2.54629629629465e-07 65 62 6.61744490042422e-24 65 63 9.25925925922627e-08 65 64 5.29395592033938e-23 65 20 -1.73611111111111e-07 65 66 1.32348898008484e-23 65 67 9.25925925922642e-08 65 104 1.73611111111111e-07 65 105 -2.54629629629465e-07 65 106 -3.30872245021211e-23 65 107 -6.01851851852183e-07 65 108 -1.73611111111111e-07 65 109 -2.54629629629465e-07 66 66 2.03703703703770e-06 66 23 -1.73611111111111e-07 66 24 9.25925925922616e-08 66 25 1.98523347012727e-23 66 26 -2.54629629629465e-07 66 27 1.73611111111111e-07 66 64 -6.01851851852180e-07 66 65 -1.32348898008484e-23 66 22 -2.54629629629464e-07 66 67 0.00000000000000e+00 66 68 -6.01851851852181e-07 66 69 -6.61744490042422e-24 66 106 -2.54629629629464e-07 66 107 1.73611111111111e-07 66 108 9.25925925922616e-08 66 109 -3.30872245021211e-23 66 110 -2.54629629629465e-07 66 111 -1.73611111111111e-07 67 67 2.03703703703770e-06 67 23 -2.54629629629465e-07 67 24 -1.98523347012727e-23 67 25 -6.01851851852183e-07 67 26 1.73611111111111e-07 67 27 -2.54629629629465e-07 67 64 -1.32348898008484e-23 67 65 9.25925925922642e-08 67 66 0.00000000000000e+00 67 22 -1.73611111111111e-07 67 68 0.00000000000000e+00 67 69 9.25925925922628e-08 67 106 1.73611111111111e-07 67 107 -2.54629629629465e-07 67 108 1.32348898008484e-23 67 109 -6.01851851852183e-07 67 110 -1.73611111111111e-07 67 111 -2.54629629629465e-07 68 68 2.03703703703770e-06 68 25 -1.73611111111111e-07 68 26 9.25925925922626e-08 68 27 -2.64697796016969e-23 68 28 -2.54629629629465e-07 68 29 1.73611111111111e-07 68 66 -6.01851851852181e-07 68 67 0.00000000000000e+00 68 24 -2.54629629629465e-07 68 69 2.64697796016969e-23 68 70 -6.01851851852183e-07 68 71 -2.64697796016969e-23 68 108 -2.54629629629465e-07 68 109 1.73611111111111e-07 68 110 9.25925925922626e-08 68 111 1.32348898008484e-23 68 112 -2.54629629629465e-07 68 113 -1.73611111111111e-07 69 69 2.03703703703770e-06 69 25 -2.54629629629465e-07 69 26 0.00000000000000e+00 69 27 -6.01851851852182e-07 69 28 1.73611111111111e-07 69 29 -2.54629629629465e-07 69 66 -6.61744490042422e-24 69 67 9.25925925922628e-08 69 68 2.64697796016969e-23 69 24 -1.73611111111111e-07 69 70 -6.61744490042422e-24 69 71 9.25925925922622e-08 69 108 1.73611111111111e-07 69 109 -2.54629629629465e-07 69 110 -6.61744490042422e-24 69 111 -6.01851851852182e-07 69 112 -1.73611111111111e-07 69 113 -2.54629629629465e-07 70 70 2.03703703703770e-06 70 27 -1.73611111111111e-07 70 28 9.25925925922629e-08 70 29 -1.32348898008484e-23 70 30 -2.54629629629465e-07 70 31 1.73611111111111e-07 70 68 -6.01851851852183e-07 70 69 1.32348898008484e-23 70 26 -2.54629629629465e-07 70 71 -2.64697796016969e-23 70 72 -6.01851851852183e-07 70 73 -1.32348898008484e-23 70 110 -2.54629629629465e-07 70 111 1.73611111111111e-07 70 112 9.25925925922629e-08 70 113 2.64697796016969e-23 70 114 -2.54629629629465e-07 70 115 -1.73611111111111e-07 71 71 2.03703703703770e-06 71 27 -2.54629629629465e-07 71 28 1.32348898008484e-23 71 29 -6.01851851852182e-07 71 30 1.73611111111111e-07 71 31 -2.54629629629465e-07 71 68 -6.61744490042422e-24 71 69 9.25925925922622e-08 71 70 0.00000000000000e+00 71 26 -1.73611111111111e-07 71 72 -6.61744490042422e-24 71 73 9.25925925922620e-08 71 110 1.73611111111111e-07 71 111 -2.54629629629465e-07 71 112 0.00000000000000e+00 71 113 -6.01851851852182e-07 71 114 -1.73611111111111e-07 71 115 -2.54629629629465e-07 72 72 1.66676851851906e-02 72 29 -1.73611111111111e-07 72 30 2.38099867724597e-03 72 31 2.67860615079365e-03 72 32 -4.16666666666396e-03 72 33 4.46428571428572e-03 72 70 -6.01851851852183e-07 72 71 -6.61744490042422e-24 72 28 -2.54629629629465e-07 72 73 8.67361737988404e-19 72 74 -1.30952380952435e-02 72 75 4.33680868994202e-19 72 112 -2.54629629629465e-07 72 113 1.73611111111111e-07 72 114 2.38099867724597e-03 72 115 -2.67860615079365e-03 72 116 -4.16666666666396e-03 72 117 -4.46428571428572e-03 73 73 1.66676851851906e-02 73 29 -2.54629629629465e-07 73 30 -2.67860615079365e-03 73 31 -6.54791997354769e-03 73 32 4.46428571428572e-03 73 33 -4.16666666666397e-03 73 70 0.00000000000000e+00 73 71 9.25925925922620e-08 73 72 0.00000000000000e+00 73 28 -1.73611111111111e-07 73 74 -4.33680868994202e-19 73 75 4.76190476189937e-03 73 112 1.73611111111111e-07 73 113 -2.54629629629465e-07 73 114 2.67860615079365e-03 73 115 -6.54791997354769e-03 73 116 -4.46428571428572e-03 73 117 -4.16666666666397e-03 74 74 3.33333333333441e-02 74 31 -4.46428571428572e-03 74 32 4.76190476189936e-03 74 33 -1.30104260698261e-18 74 34 -4.16666666666397e-03 74 35 4.46428571428571e-03 74 72 -1.30952380952435e-02 74 73 -4.33680868994202e-19 74 30 -4.16666666666396e-03 74 75 0.00000000000000e+00 74 76 -1.30952380952435e-02 74 77 8.67361737988404e-19 74 114 -4.16666666666396e-03 74 115 4.46428571428572e-03 74 116 4.76190476189936e-03 74 117 8.67361737988404e-19 74 118 -4.16666666666397e-03 74 119 -4.46428571428572e-03 75 75 3.33333333333442e-02 75 31 -4.16666666666397e-03 75 32 8.67361737988404e-19 75 33 -1.30952380952435e-02 75 34 4.46428571428572e-03 75 35 -4.16666666666397e-03 75 72 4.33680868994202e-19 75 73 4.76190476189937e-03 75 74 0.00000000000000e+00 75 30 -4.46428571428572e-03 75 76 -8.67361737988404e-19 75 77 4.76190476189936e-03 75 114 4.46428571428572e-03 75 115 -4.16666666666397e-03 75 116 -1.30104260698261e-18 75 117 -1.30952380952435e-02 75 118 -4.46428571428571e-03 75 119 -4.16666666666397e-03 76 76 3.33333333333442e-02 76 33 -4.46428571428571e-03 76 34 4.76190476189938e-03 76 35 8.67361737988404e-19 76 36 -4.16666666666398e-03 76 37 4.46428571428572e-03 76 74 -1.30952380952435e-02 76 75 -8.67361737988404e-19 76 32 -4.16666666666397e-03 76 77 -8.67361737988404e-19 76 78 -1.30952380952435e-02 76 79 0.00000000000000e+00 76 116 -4.16666666666397e-03 76 117 4.46428571428572e-03 76 118 4.76190476189938e-03 76 119 0.00000000000000e+00 76 120 -4.16666666666398e-03 76 121 -4.46428571428572e-03 77 77 3.33333333333441e-02 77 33 -4.16666666666397e-03 77 34 -4.33680868994202e-19 77 35 -1.30952380952435e-02 77 36 4.46428571428572e-03 77 37 -4.16666666666396e-03 77 74 8.67361737988404e-19 77 75 4.76190476189936e-03 77 76 -1.73472347597681e-18 77 32 -4.46428571428572e-03 77 78 0.00000000000000e+00 77 79 4.76190476189933e-03 77 116 4.46428571428571e-03 77 117 -4.16666666666397e-03 77 118 1.30104260698261e-18 77 119 -1.30952380952435e-02 77 120 -4.46428571428572e-03 77 121 -4.16666666666396e-03 78 78 3.33333333333442e-02 78 35 -4.46428571428572e-03 78 36 4.76190476189937e-03 78 37 0.00000000000000e+00 78 38 -4.16666666666396e-03 78 39 4.46428571428572e-03 78 76 -1.30952380952435e-02 78 77 0.00000000000000e+00 78 34 -4.16666666666398e-03 78 79 8.67361737988404e-19 78 80 -1.30952380952435e-02 78 81 4.33680868994202e-19 78 118 -4.16666666666398e-03 78 119 4.46428571428572e-03 78 120 4.76190476189937e-03 78 121 -4.33680868994202e-19 78 122 -4.16666666666396e-03 78 123 -4.46428571428572e-03 79 79 3.33333333333441e-02 79 35 -4.16666666666396e-03 79 36 0.00000000000000e+00 79 37 -1.30952380952435e-02 79 38 4.46428571428572e-03 79 39 -4.16666666666397e-03 79 76 0.00000000000000e+00 79 77 4.76190476189933e-03 79 78 0.00000000000000e+00 79 34 -4.46428571428572e-03 79 80 -8.67361737988404e-19 79 81 4.76190476189938e-03 79 118 4.46428571428572e-03 79 119 -4.16666666666396e-03 79 120 -1.30104260698261e-18 79 121 -1.30952380952435e-02 79 122 -4.46428571428572e-03 79 123 -4.16666666666397e-03 80 80 3.33333333333441e-02 80 37 -4.46428571428572e-03 80 38 4.76190476189935e-03 80 39 0.00000000000000e+00 80 40 -4.16666666666396e-03 80 41 4.46428571428572e-03 80 78 -1.30952380952435e-02 80 79 -4.33680868994202e-19 80 36 -4.16666666666396e-03 80 81 0.00000000000000e+00 80 82 -1.30952380952435e-02 80 83 4.33680868994202e-19 80 120 -4.16666666666396e-03 80 121 4.46428571428572e-03 80 122 4.76190476189935e-03 80 123 4.33680868994202e-19 80 124 -4.16666666666396e-03 80 125 -4.46428571428572e-03 81 81 3.33333333333442e-02 81 37 -4.16666666666397e-03 81 38 0.00000000000000e+00 81 39 -1.30952380952435e-02 81 40 4.46428571428572e-03 81 41 -4.16666666666397e-03 81 78 8.67361737988404e-19 81 79 4.76190476189938e-03 81 80 -1.73472347597681e-18 81 36 -4.46428571428572e-03 81 82 -4.33680868994202e-19 81 83 4.76190476189937e-03 81 120 4.46428571428572e-03 81 121 -4.16666666666397e-03 81 122 4.33680868994202e-19 81 123 -1.30952380952435e-02 81 124 -4.46428571428572e-03 81 125 -4.16666666666397e-03 82 82 3.33333333333442e-02 82 39 -4.46428571428572e-03 82 40 4.76190476189937e-03 82 41 0.00000000000000e+00 82 80 -1.30952380952435e-02 82 81 -4.33680868994202e-19 82 38 -4.16666666666396e-03 82 83 -8.67361737988404e-19 82 122 -4.16666666666396e-03 82 123 4.46428571428572e-03 82 124 4.76190476189936e-03 82 125 4.33680868994202e-19 83 83 3.33333333333442e-02 83 39 -4.16666666666397e-03 83 40 4.33680868994202e-19 83 41 -1.30952380952435e-02 83 80 4.33680868994202e-19 83 81 4.76190476189937e-03 83 82 -1.73472347597681e-18 83 38 -4.46428571428572e-03 83 122 4.46428571428572e-03 83 123 -4.16666666666397e-03 83 124 0.00000000000000e+00 83 125 -1.30952380952435e-02 84 84 2.30769230769306e+00 84 43 0.00000000000000e+00 84 44 -2.88461538461351e-01 84 45 2.40384615384615e-01 84 42 1.92307692307318e-01 84 85 1.11022302462516e-16 84 86 -7.69230769231143e-01 84 87 2.08166817117217e-17 84 126 1.92307692307318e-01 84 127 -6.93889390390723e-17 84 128 -2.88461538461352e-01 84 129 -2.40384615384615e-01 85 85 2.30769230769306e+00 85 43 -7.69230769231143e-01 85 44 2.40384615384615e-01 85 45 -2.88461538461352e-01 85 84 1.11022302462516e-16 85 42 0.00000000000000e+00 85 86 2.77555756156289e-17 85 87 1.92307692307318e-01 85 126 -8.32667268468867e-17 85 127 -7.69230769231143e-01 85 128 -2.40384615384615e-01 85 129 -2.88461538461352e-01 86 86 2.30769230769306e+00 86 43 -2.40384615384615e-01 86 44 1.92307692307318e-01 86 45 0.00000000000000e+00 86 46 -2.88461538461351e-01 86 47 2.40384615384615e-01 86 84 -7.69230769231143e-01 86 85 2.77555756156289e-17 86 42 -2.88461538461351e-01 86 87 1.11022302462516e-16 86 88 -7.69230769231143e-01 86 89 2.08166817117217e-17 86 126 -2.88461538461351e-01 86 127 2.40384615384615e-01 86 128 1.92307692307318e-01 86 129 -6.93889390390723e-17 86 130 -2.88461538461352e-01 86 131 -2.40384615384615e-01 87 87 2.30769230769306e+00 87 43 -2.88461538461351e-01 87 44 0.00000000000000e+00 87 45 -7.69230769231143e-01 87 46 2.40384615384615e-01 87 47 -2.88461538461352e-01 87 84 2.77555756156289e-17 87 85 1.92307692307318e-01 87 86 1.11022302462516e-16 87 42 -2.40384615384615e-01 87 88 2.77555756156289e-17 87 89 1.92307692307318e-01 87 126 2.40384615384615e-01 87 127 -2.88461538461351e-01 87 128 -8.32667268468867e-17 87 129 -7.69230769231143e-01 87 130 -2.40384615384615e-01 87 131 -2.88461538461352e-01 88 88 2.30769230769306e+00 88 45 -2.40384615384615e-01 88 46 1.92307692307318e-01 88 47 -2.08166817117217e-17 88 48 -2.88461538461351e-01 88 49 2.40384615384615e-01 88 86 -7.69230769231143e-01 88 87 2.77555756156289e-17 88 44 -2.88461538461351e-01 88 89 1.38777878078145e-16 88 90 -7.69230769231143e-01 88 91 3.46944695195361e-17 88 128 -2.88461538461351e-01 88 129 2.40384615384615e-01 88 130 1.92307692307318e-01 88 131 -6.93889390390723e-17 88 132 -2.88461538461351e-01 88 133 -2.40384615384615e-01 89 89 2.30769230769306e+00 89 45 -2.88461538461351e-01 89 46 0.00000000000000e+00 89 47 -7.69230769231143e-01 89 48 2.40384615384615e-01 89 49 -2.88461538461351e-01 89 86 2.77555756156289e-17 89 87 1.92307692307318e-01 89 88 1.38777878078145e-16 89 44 -2.40384615384615e-01 89 90 3.46944695195361e-17 89 91 1.92307692307319e-01 89 128 2.40384615384615e-01 89 129 -2.88461538461351e-01 89 130 -9.02056207507940e-17 89 131 -7.69230769231144e-01 89 132 -2.40384615384615e-01 89 133 -2.88461538461352e-01 90 90 2.30769230769305e+00 90 47 -2.40384615384615e-01 90 48 1.92307692307318e-01 90 49 3.46944695195361e-17 90 50 -2.88461538461351e-01 90 51 2.40384615384615e-01 90 88 -7.69230769231143e-01 90 89 3.46944695195361e-17 90 46 -2.88461538461351e-01 90 91 1.11022302462516e-16 90 92 -7.69230769231143e-01 90 93 2.08166817117217e-17 90 130 -2.88461538461351e-01 90 131 2.40384615384615e-01 90 132 1.92307692307318e-01 90 133 -9.02056207507940e-17 90 134 -2.88461538461351e-01 90 135 -2.40384615384615e-01 91 91 2.30769230769306e+00 91 47 -2.88461538461351e-01 91 48 -6.93889390390723e-18 91 49 -7.69230769231144e-01 91 50 2.40384615384615e-01 91 51 -2.88461538461351e-01 91 88 2.08166817117217e-17 91 89 1.92307692307319e-01 91 90 1.11022302462516e-16 91 46 -2.40384615384615e-01 91 92 3.46944695195361e-17 91 93 1.92307692307319e-01 91 130 2.40384615384615e-01 91 131 -2.88461538461351e-01 91 132 -4.85722573273506e-17 91 133 -7.69230769231144e-01 91 134 -2.40384615384615e-01 91 135 -2.88461538461352e-01 92 92 2.30769230769306e+00 92 49 -2.40384615384615e-01 92 50 1.92307692307318e-01 92 51 6.93889390390723e-18 92 52 -2.88461538461352e-01 92 53 2.40384615384615e-01 92 90 -7.69230769231143e-01 92 91 3.46944695195361e-17 92 48 -2.88461538461351e-01 92 93 1.11022302462516e-16 92 94 -7.69230769231144e-01 92 95 -2.08166817117217e-17 92 132 -2.88461538461351e-01 92 133 2.40384615384615e-01 92 134 1.92307692307318e-01 92 135 -6.24500451351651e-17 92 136 -2.88461538461352e-01 92 137 -2.40384615384615e-01 93 93 2.30769230769306e+00 93 49 -2.88461538461351e-01 93 50 -3.46944695195361e-17 93 51 -7.69230769231143e-01 93 52 2.40384615384615e-01 93 53 -2.88461538461351e-01 93 90 2.08166817117217e-17 93 91 1.92307692307319e-01 93 92 1.66533453693773e-16 93 48 -2.40384615384615e-01 93 94 4.16333634234434e-17 93 95 1.92307692307318e-01 93 132 2.40384615384615e-01 93 133 -2.88461538461351e-01 93 134 -8.32667268468867e-17 93 135 -7.69230769231143e-01 93 136 -2.40384615384615e-01 93 137 -2.88461538461351e-01 94 94 2.30769230769306e+00 94 51 -2.40384615384615e-01 94 52 1.92307692307318e-01 94 53 2.08166817117217e-17 94 54 -2.88461538461351e-01 94 55 2.40384615384615e-01 94 92 -7.69230769231144e-01 94 93 7.63278329429795e-17 94 50 -2.88461538461352e-01 94 95 1.66533453693773e-16 94 96 -7.69230769231142e-01 94 97 2.77555756156289e-17 94 134 -2.88461538461351e-01 94 135 2.40384615384615e-01 94 136 1.92307692307318e-01 94 137 -1.38777878078145e-16 94 138 -2.88461538461351e-01 94 139 -2.40384615384615e-01 95 95 2.30769230769306e+00 95 51 -2.88461538461351e-01 95 52 -3.46944695195361e-17 95 53 -7.69230769231143e-01 95 54 2.40384615384615e-01 95 55 -2.88461538461352e-01 95 92 2.08166817117217e-17 95 93 1.92307692307318e-01 95 94 1.66533453693773e-16 95 50 -2.40384615384615e-01 95 96 2.77555756156289e-17 95 97 1.92307692307319e-01 95 134 2.40384615384615e-01 95 135 -2.88461538461351e-01 95 136 -7.63278329429795e-17 95 137 -7.69230769231143e-01 95 138 -2.40384615384615e-01 95 139 -2.88461538461352e-01 96 96 2.30769230769306e+00 96 53 -2.40384615384615e-01 96 54 1.92307692307318e-01 96 55 -4.16333634234434e-17 96 56 -2.88461538461352e-01 96 57 2.40384615384615e-01 96 94 -7.69230769231142e-01 96 95 2.77555756156289e-17 96 52 -2.88461538461351e-01 96 97 8.32667268468867e-17 96 98 -7.69230769231144e-01 96 99 2.77555756156289e-17 96 136 -2.88461538461351e-01 96 137 2.40384615384615e-01 96 138 1.92307692307318e-01 96 139 -8.32667268468867e-17 96 140 -2.88461538461352e-01 96 141 -2.40384615384615e-01 97 97 2.30769230769306e+00 97 53 -2.88461538461352e-01 97 54 1.38777878078145e-17 97 55 -7.69230769231143e-01 97 56 2.40384615384615e-01 97 57 -2.88461538461351e-01 97 94 2.77555756156289e-17 97 95 1.92307692307319e-01 97 96 8.32667268468867e-17 97 52 -2.40384615384615e-01 97 98 2.08166817117217e-17 97 99 1.92307692307318e-01 97 136 2.40384615384615e-01 97 137 -2.88461538461352e-01 97 138 -1.11022302462516e-16 97 139 -7.69230769231143e-01 97 140 -2.40384615384615e-01 97 141 -2.88461538461351e-01 98 98 1.15384717236505e+00 98 55 -2.40384615384615e-01 98 56 9.61538924499558e-02 98 57 -4.80769577991453e-02 98 58 -2.54629629629465e-07 98 59 1.73611111111111e-07 98 96 -7.69230769231144e-01 98 97 2.08166817117217e-17 98 54 -2.88461538461352e-01 98 99 9.60072405741143e-17 98 100 -6.01851851852181e-07 98 101 -6.61744490042422e-24 98 138 -2.88461538461352e-01 98 139 2.40384615384615e-01 98 140 9.61538924499557e-02 98 141 4.80769577991453e-02 98 142 -2.54629629629465e-07 98 143 -1.73611111111111e-07 99 99 1.15384717236505e+00 99 55 -2.88461538461351e-01 99 56 4.80769577991453e-02 99 57 -3.84615685541497e-01 99 58 1.73611111111111e-07 99 59 -2.54629629629465e-07 99 96 2.77555756156289e-17 99 97 1.92307692307318e-01 99 98 6.82516649584854e-17 99 54 -2.40384615384615e-01 99 100 -1.32348898008484e-23 99 101 9.25925925922633e-08 99 138 2.40384615384615e-01 99 139 -2.88461538461351e-01 99 140 -4.80769577991453e-02 99 141 -3.84615685541497e-01 99 142 -1.73611111111111e-07 99 143 -2.54629629629465e-07 100 100 2.03703703703770e-06 100 57 -1.73611111111111e-07 100 58 9.25925925922624e-08 100 59 -6.61744490042422e-24 100 60 -2.54629629629465e-07 100 61 1.73611111111111e-07 100 98 -6.01851851852181e-07 100 99 3.30872245021211e-23 100 56 -2.54629629629465e-07 100 101 5.29395592033938e-23 100 102 -6.01851851852183e-07 100 103 2.64697796016969e-23 100 140 -2.54629629629464e-07 100 141 1.73611111111111e-07 100 142 9.25925925922624e-08 100 143 -3.30872245021211e-23 100 144 -2.54629629629465e-07 100 145 -1.73611111111111e-07 101 101 2.03703703703770e-06 101 57 -2.54629629629465e-07 101 58 -1.32348898008484e-23 101 59 -6.01851851852182e-07 101 60 1.73611111111111e-07 101 61 -2.54629629629465e-07 101 98 3.30872245021211e-23 101 99 9.25925925922633e-08 101 100 7.94093388050907e-23 101 56 -1.73611111111111e-07 101 102 2.64697796016969e-23 101 103 9.25925925922621e-08 101 140 1.73611111111111e-07 101 141 -2.54629629629465e-07 101 142 -5.29395592033938e-23 101 143 -6.01851851852182e-07 101 144 -1.73611111111111e-07 101 145 -2.54629629629465e-07 102 102 2.03703703703770e-06 102 59 -1.73611111111111e-07 102 60 9.25925925922629e-08 102 61 0.00000000000000e+00 102 62 -2.54629629629465e-07 102 63 1.73611111111111e-07 102 100 -6.01851851852183e-07 102 101 3.30872245021211e-23 102 58 -2.54629629629465e-07 102 103 7.94093388050907e-23 102 104 -6.01851851852183e-07 102 105 -1.32348898008484e-23 102 142 -2.54629629629465e-07 102 143 1.73611111111111e-07 102 144 9.25925925922629e-08 102 145 -7.94093388050907e-23 102 146 -2.54629629629465e-07 102 147 -1.73611111111111e-07 103 103 2.03703703703770e-06 103 59 -2.54629629629465e-07 103 60 -1.32348898008484e-23 103 61 -6.01851851852182e-07 103 62 1.73611111111111e-07 103 63 -2.54629629629465e-07 103 100 6.61744490042422e-24 103 101 9.25925925922621e-08 103 102 7.94093388050907e-23 103 58 -1.73611111111111e-07 103 104 1.32348898008484e-23 103 105 9.25925925922622e-08 103 142 1.73611111111111e-07 103 143 -2.54629629629465e-07 103 144 -5.95570041038180e-23 103 145 -6.01851851852182e-07 103 146 -1.73611111111111e-07 103 147 -2.54629629629465e-07 104 104 2.03703703703770e-06 104 61 -1.73611111111111e-07 104 62 9.25925925922627e-08 104 63 4.63221143029695e-23 104 64 -2.54629629629465e-07 104 65 1.73611111111111e-07 104 102 -6.01851851852183e-07 104 103 3.97046694025453e-23 104 60 -2.54629629629465e-07 104 105 2.64697796016969e-23 104 106 -6.01851851852182e-07 104 107 1.98523347012727e-23 104 144 -2.54629629629465e-07 104 145 1.73611111111111e-07 104 146 9.25925925922626e-08 104 147 -3.97046694025453e-23 104 148 -2.54629629629465e-07 104 149 -1.73611111111111e-07 105 105 2.03703703703770e-06 105 61 -2.54629629629465e-07 105 62 2.64697796016969e-23 105 63 -6.01851851852182e-07 105 64 1.73611111111111e-07 105 65 -2.54629629629465e-07 105 102 6.61744490042422e-24 105 103 9.25925925922622e-08 105 104 0.00000000000000e+00 105 60 -1.73611111111111e-07 105 106 2.64697796016969e-23 105 107 9.25925925922627e-08 105 144 1.73611111111111e-07 105 145 -2.54629629629465e-07 105 146 -3.97046694025453e-23 105 147 -6.01851851852182e-07 105 148 -1.73611111111111e-07 105 149 -2.54629629629465e-07 106 106 2.03703703703770e-06 106 63 -1.73611111111111e-07 106 64 9.25925925922616e-08 106 65 -3.97046694025453e-23 106 66 -2.54629629629464e-07 106 67 1.73611111111111e-07 106 104 -6.01851851852182e-07 106 105 2.64697796016969e-23 106 62 -2.54629629629465e-07 106 107 7.94093388050907e-23 106 108 -6.01851851852180e-07 106 109 1.32348898008484e-23 106 146 -2.54629629629465e-07 106 147 1.73611111111111e-07 106 148 9.25925925922617e-08 106 149 -5.95570041038180e-23 106 150 -2.54629629629464e-07 106 151 -1.73611111111111e-07 107 107 2.03703703703770e-06 107 63 -2.54629629629465e-07 107 64 -1.98523347012727e-23 107 65 -6.01851851852183e-07 107 66 1.73611111111111e-07 107 67 -2.54629629629465e-07 107 104 1.98523347012727e-23 107 105 9.25925925922627e-08 107 106 1.05879118406788e-22 107 62 -1.73611111111111e-07 107 108 3.97046694025453e-23 107 109 9.25925925922642e-08 107 146 1.73611111111111e-07 107 147 -2.54629629629465e-07 107 148 -1.05879118406788e-22 107 149 -6.01851851852183e-07 107 150 -1.73611111111111e-07 107 151 -2.54629629629465e-07 108 108 2.03703703703770e-06 108 65 -1.73611111111111e-07 108 66 9.25925925922616e-08 108 67 1.98523347012727e-23 108 68 -2.54629629629465e-07 108 69 1.73611111111111e-07 108 106 -6.01851851852180e-07 108 107 1.32348898008484e-23 108 64 -2.54629629629464e-07 108 109 2.64697796016969e-23 108 110 -6.01851851852181e-07 108 111 6.61744490042422e-24 108 148 -2.54629629629464e-07 108 149 1.73611111111111e-07 108 150 9.25925925922616e-08 108 151 -8.60267837055149e-23 108 152 -2.54629629629465e-07 108 153 -1.73611111111111e-07 109 109 2.03703703703770e-06 109 65 -2.54629629629465e-07 109 66 -1.98523347012727e-23 109 67 -6.01851851852183e-07 109 68 1.73611111111111e-07 109 69 -2.54629629629465e-07 109 106 0.00000000000000e+00 109 107 9.25925925922642e-08 109 108 2.64697796016969e-23 109 64 -1.73611111111111e-07 109 110 2.64697796016969e-23 109 111 9.25925925922628e-08 109 148 1.73611111111111e-07 109 149 -2.54629629629465e-07 109 150 -5.29395592033938e-23 109 151 -6.01851851852183e-07 109 152 -1.73611111111111e-07 109 153 -2.54629629629465e-07 110 110 2.03703703703770e-06 110 67 -1.73611111111111e-07 110 68 9.25925925922626e-08 110 69 -2.64697796016969e-23 110 70 -2.54629629629465e-07 110 71 1.73611111111111e-07 110 108 -6.01851851852181e-07 110 109 2.64697796016969e-23 110 66 -2.54629629629465e-07 110 111 5.29395592033938e-23 110 112 -6.01851851852183e-07 110 113 -1.32348898008484e-23 110 150 -2.54629629629464e-07 110 151 1.73611111111111e-07 110 152 9.25925925922626e-08 110 153 -3.97046694025453e-23 110 154 -2.54629629629465e-07 110 155 -1.73611111111111e-07 111 111 2.03703703703770e-06 111 67 -2.54629629629465e-07 111 68 0.00000000000000e+00 111 69 -6.01851851852182e-07 111 70 1.73611111111111e-07 111 71 -2.54629629629465e-07 111 108 6.61744490042422e-24 111 109 9.25925925922628e-08 111 110 5.29395592033938e-23 111 66 -1.73611111111111e-07 111 112 1.32348898008484e-23 111 113 9.25925925922622e-08 111 150 1.73611111111111e-07 111 151 -2.54629629629465e-07 111 152 -7.27918939046664e-23 111 153 -6.01851851852182e-07 111 154 -1.73611111111111e-07 111 155 -2.54629629629465e-07 112 112 2.03703703703770e-06 112 69 -1.73611111111111e-07 112 70 9.25925925922629e-08 112 71 -1.32348898008484e-23 112 72 -2.54629629629465e-07 112 73 1.73611111111111e-07 112 110 -6.01851851852183e-07 112 111 3.97046694025453e-23 112 68 -2.54629629629465e-07 112 113 7.94093388050907e-23 112 114 -6.01851851852183e-07 112 115 0.00000000000000e+00 112 152 -2.54629629629465e-07 112 153 1.73611111111111e-07 112 154 9.25925925922629e-08 112 155 -2.64697796016969e-23 112 156 -2.54629629629465e-07 112 157 -1.73611111111111e-07 113 113 2.03703703703770e-06 113 69 -2.54629629629465e-07 113 70 1.32348898008484e-23 113 71 -6.01851851852182e-07 113 72 1.73611111111111e-07 113 73 -2.54629629629465e-07 113 110 6.61744490042422e-24 113 111 9.25925925922622e-08 113 112 2.64697796016969e-23 113 68 -1.73611111111111e-07 113 114 2.64697796016969e-23 113 115 9.25925925922620e-08 113 152 1.73611111111111e-07 113 153 -2.54629629629465e-07 113 154 -6.61744490042422e-23 113 155 -6.01851851852182e-07 113 156 -1.73611111111111e-07 113 157 -2.54629629629465e-07 114 114 1.66676851851906e-02 114 71 -1.73611111111111e-07 114 72 2.38099867724597e-03 114 73 2.67860615079365e-03 114 74 -4.16666666666396e-03 114 75 4.46428571428572e-03 114 112 -6.01851851852183e-07 114 113 1.98523347012727e-23 114 70 -2.54629629629465e-07 114 115 8.67361737988404e-19 114 116 -1.30952380952435e-02 114 117 8.67361737988404e-19 114 154 -2.54629629629465e-07 114 155 1.73611111111111e-07 114 156 2.38099867724597e-03 114 157 -2.67860615079365e-03 114 158 -4.16666666666397e-03 114 159 -4.46428571428572e-03 115 115 1.66676851851906e-02 115 71 -2.54629629629465e-07 115 72 -2.67860615079365e-03 115 73 -6.54791997354769e-03 115 74 4.46428571428572e-03 115 75 -4.16666666666397e-03 115 112 1.32348898008484e-23 115 113 9.25925925922620e-08 115 114 8.67361737988404e-19 115 70 -1.73611111111111e-07 115 116 0.00000000000000e+00 115 117 4.76190476189937e-03 115 154 1.73611111111111e-07 115 155 -2.54629629629465e-07 115 156 2.67860615079365e-03 115 157 -6.54791997354769e-03 115 158 -4.46428571428572e-03 115 159 -4.16666666666397e-03 116 116 3.33333333333441e-02 116 73 -4.46428571428572e-03 116 74 4.76190476189936e-03 116 75 -1.30104260698261e-18 116 76 -4.16666666666397e-03 116 77 4.46428571428571e-03 116 114 -1.30952380952435e-02 116 115 0.00000000000000e+00 116 72 -4.16666666666396e-03 116 117 1.73472347597681e-18 116 118 -1.30952380952435e-02 116 119 1.30104260698261e-18 116 156 -4.16666666666396e-03 116 157 4.46428571428572e-03 116 158 4.76190476189936e-03 116 159 -8.67361737988404e-19 116 160 -4.16666666666397e-03 116 161 -4.46428571428572e-03 117 117 3.33333333333442e-02 117 73 -4.16666666666397e-03 117 74 8.67361737988404e-19 117 75 -1.30952380952435e-02 117 76 4.46428571428572e-03 117 77 -4.16666666666397e-03 117 114 8.67361737988404e-19 117 115 4.76190476189937e-03 117 116 1.73472347597681e-18 117 72 -4.46428571428572e-03 117 118 -8.67361737988404e-19 117 119 4.76190476189936e-03 117 156 4.46428571428572e-03 117 157 -4.16666666666397e-03 117 158 -3.46944695195361e-18 117 159 -1.30952380952435e-02 117 160 -4.46428571428571e-03 117 161 -4.16666666666397e-03 118 118 3.33333333333442e-02 118 75 -4.46428571428571e-03 118 76 4.76190476189938e-03 118 77 8.67361737988404e-19 118 78 -4.16666666666398e-03 118 79 4.46428571428572e-03 118 116 -1.30952380952435e-02 118 117 -8.67361737988404e-19 118 74 -4.16666666666397e-03 118 119 8.67361737988404e-19 118 120 -1.30952380952435e-02 118 121 8.67361737988404e-19 118 158 -4.16666666666397e-03 118 159 4.46428571428571e-03 118 160 4.76190476189938e-03 118 161 -1.73472347597681e-18 118 162 -4.16666666666398e-03 118 163 -4.46428571428572e-03 119 119 3.33333333333441e-02 119 75 -4.16666666666397e-03 119 76 -4.33680868994202e-19 119 77 -1.30952380952435e-02 119 78 4.46428571428572e-03 119 79 -4.16666666666396e-03 119 116 1.30104260698261e-18 119 117 4.76190476189936e-03 119 118 8.67361737988404e-19 119 74 -4.46428571428572e-03 119 120 0.00000000000000e+00 119 121 4.76190476189933e-03 119 158 4.46428571428571e-03 119 159 -4.16666666666397e-03 119 160 0.00000000000000e+00 119 161 -1.30952380952435e-02 119 162 -4.46428571428572e-03 119 163 -4.16666666666396e-03 120 120 3.33333333333442e-02 120 77 -4.46428571428572e-03 120 78 4.76190476189937e-03 120 79 0.00000000000000e+00 120 80 -4.16666666666396e-03 120 81 4.46428571428572e-03 120 118 -1.30952380952435e-02 120 119 4.33680868994202e-19 120 76 -4.16666666666398e-03 120 121 1.73472347597681e-18 120 122 -1.30952380952435e-02 120 123 8.67361737988404e-19 120 160 -4.16666666666398e-03 120 161 4.46428571428572e-03 120 162 4.76190476189937e-03 120 163 -2.60208521396521e-18 120 164 -4.16666666666396e-03 120 165 -4.46428571428572e-03 121 121 3.33333333333441e-02 121 77 -4.16666666666396e-03 121 78 0.00000000000000e+00 121 79 -1.30952380952435e-02 121 80 4.46428571428572e-03 121 81 -4.16666666666397e-03 121 118 4.33680868994202e-19 121 119 4.76190476189933e-03 121 120 1.73472347597681e-18 121 76 -4.46428571428572e-03 121 122 -4.33680868994202e-19 121 123 4.76190476189938e-03 121 160 4.46428571428572e-03 121 161 -4.16666666666396e-03 121 162 -2.60208521396521e-18 121 163 -1.30952380952435e-02 121 164 -4.46428571428572e-03 121 165 -4.16666666666397e-03 122 122 3.33333333333441e-02 122 79 -4.46428571428572e-03 122 80 4.76190476189935e-03 122 81 0.00000000000000e+00 122 82 -4.16666666666396e-03 122 83 4.46428571428572e-03 122 120 -1.30952380952435e-02 122 121 0.00000000000000e+00 122 78 -4.16666666666396e-03 122 123 8.67361737988404e-19 122 124 -1.30952380952435e-02 122 125 8.67361737988404e-19 122 162 -4.16666666666396e-03 122 163 4.46428571428572e-03 122 164 4.76190476189935e-03 122 165 -1.73472347597681e-18 122 166 -4.16666666666397e-03 122 167 -4.46428571428572e-03 123 123 3.33333333333442e-02 123 79 -4.16666666666397e-03 123 80 0.00000000000000e+00 123 81 -1.30952380952435e-02 123 82 4.46428571428572e-03 123 83 -4.16666666666397e-03 123 120 1.30104260698261e-18 123 121 4.76190476189938e-03 123 122 8.67361737988404e-19 123 78 -4.46428571428572e-03 123 124 0.00000000000000e+00 123 125 4.76190476189937e-03 123 162 4.46428571428572e-03 123 163 -4.16666666666397e-03 123 164 -8.67361737988404e-19 123 165 -1.30952380952435e-02 123 166 -4.46428571428572e-03 123 167 -4.16666666666397e-03 124 124 3.33333333333442e-02 124 81 -4.46428571428572e-03 124 82 4.76190476189937e-03 124 83 0.00000000000000e+00 124 122 -1.30952380952435e-02 124 123 0.00000000000000e+00 124 80 -4.16666666666396e-03 124 125 8.67361737988404e-19 124 164 -4.16666666666396e-03 124 165 4.46428571428572e-03 124 166 4.76190476189936e-03 124 167 -8.67361737988404e-19 125 125 3.33333333333442e-02 125 81 -4.16666666666397e-03 125 82 4.33680868994202e-19 125 83 -1.30952380952435e-02 125 122 8.67361737988404e-19 125 123 4.76190476189937e-03 125 124 0.00000000000000e+00 125 80 -4.46428571428572e-03 125 164 4.46428571428572e-03 125 165 -4.16666666666397e-03 125 166 -1.30104260698261e-18 125 167 -1.30952380952435e-02 126 126 2.30769230769306e+00 126 85 -9.71445146547012e-17 126 86 -2.88461538461351e-01 126 87 2.40384615384615e-01 126 84 1.92307692307318e-01 126 127 1.66533453693773e-16 126 128 -7.69230769231143e-01 126 129 2.08166817117217e-17 126 168 1.92307692307318e-01 126 169 -1.17961196366423e-16 126 170 -2.88461538461352e-01 126 171 -2.40384615384615e-01 127 127 2.30769230769306e+00 127 85 -7.69230769231143e-01 127 86 2.40384615384615e-01 127 87 -2.88461538461351e-01 127 126 1.66533453693773e-16 127 84 -6.93889390390723e-17 127 128 2.77555756156289e-17 127 129 1.92307692307318e-01 127 168 -9.71445146547012e-17 127 169 -7.69230769231143e-01 127 170 -2.40384615384615e-01 127 171 -2.88461538461352e-01 128 128 2.30769230769306e+00 128 85 -2.40384615384615e-01 128 86 1.92307692307318e-01 128 87 -9.71445146547012e-17 128 88 -2.88461538461351e-01 128 89 2.40384615384615e-01 128 126 -7.69230769231143e-01 128 127 2.77555756156289e-17 128 84 -2.88461538461352e-01 128 129 1.66533453693773e-16 128 130 -7.69230769231143e-01 128 131 2.08166817117217e-17 128 168 -2.88461538461351e-01 128 169 2.40384615384615e-01 128 170 1.92307692307318e-01 128 171 -1.17961196366423e-16 128 172 -2.88461538461352e-01 128 173 -2.40384615384615e-01 129 129 2.30769230769306e+00 129 85 -2.88461538461351e-01 129 86 -6.93889390390723e-17 129 87 -7.69230769231143e-01 129 88 2.40384615384615e-01 129 89 -2.88461538461351e-01 129 126 2.08166817117217e-17 129 127 1.92307692307318e-01 129 128 1.66533453693773e-16 129 84 -2.40384615384615e-01 129 130 2.77555756156289e-17 129 131 1.92307692307318e-01 129 168 2.40384615384615e-01 129 169 -2.88461538461351e-01 129 170 -9.71445146547012e-17 129 171 -7.69230769231143e-01 129 172 -2.40384615384615e-01 129 173 -2.88461538461352e-01 130 130 2.30769230769306e+00 130 87 -2.40384615384615e-01 130 88 1.92307692307318e-01 130 89 -1.04083408558608e-16 130 90 -2.88461538461351e-01 130 91 2.40384615384615e-01 130 128 -7.69230769231143e-01 130 129 2.77555756156289e-17 130 86 -2.88461538461352e-01 130 131 1.94289029309402e-16 130 132 -7.69230769231143e-01 130 133 2.77555756156289e-17 130 170 -2.88461538461351e-01 130 171 2.40384615384615e-01 130 172 1.92307692307318e-01 130 173 -7.63278329429795e-17 130 174 -2.88461538461351e-01 130 175 -2.40384615384615e-01 131 131 2.30769230769306e+00 131 87 -2.88461538461351e-01 131 88 -5.55111512312578e-17 131 89 -7.69230769231144e-01 131 90 2.40384615384615e-01 131 91 -2.88461538461351e-01 131 128 2.08166817117217e-17 131 129 1.92307692307318e-01 131 130 1.94289029309402e-16 131 86 -2.40384615384615e-01 131 132 6.93889390390723e-18 131 133 1.92307692307319e-01 131 170 2.40384615384615e-01 131 171 -2.88461538461351e-01 131 172 -1.17961196366423e-16 131 173 -7.69230769231143e-01 131 174 -2.40384615384615e-01 131 175 -2.88461538461352e-01 132 132 2.30769230769305e+00 132 89 -2.40384615384615e-01 132 90 1.92307692307318e-01 132 91 -4.85722573273506e-17 132 92 -2.88461538461351e-01 132 93 2.40384615384615e-01 132 130 -7.69230769231143e-01 132 131 -6.93889390390723e-18 132 88 -2.88461538461351e-01 132 133 1.38777878078145e-16 132 134 -7.69230769231143e-01 132 135 1.38777878078145e-17 132 172 -2.88461538461351e-01 132 173 2.40384615384615e-01 132 174 1.92307692307318e-01 132 175 -6.24500451351651e-17 132 176 -2.88461538461351e-01 132 177 -2.40384615384615e-01 133 133 2.30769230769306e+00 133 89 -2.88461538461352e-01 133 90 -9.02056207507940e-17 133 91 -7.69230769231144e-01 133 92 2.40384615384615e-01 133 93 -2.88461538461351e-01 133 130 2.77555756156289e-17 133 131 1.92307692307319e-01 133 132 1.66533453693773e-16 133 88 -2.40384615384615e-01 133 134 6.93889390390723e-18 133 135 1.92307692307319e-01 133 172 2.40384615384615e-01 133 173 -2.88461538461351e-01 133 174 -6.93889390390723e-17 133 175 -7.69230769231144e-01 133 176 -2.40384615384615e-01 133 177 -2.88461538461352e-01 134 134 2.30769230769306e+00 134 91 -2.40384615384615e-01 134 92 1.92307692307318e-01 134 93 -9.02056207507940e-17 134 94 -2.88461538461351e-01 134 95 2.40384615384615e-01 134 132 -7.69230769231143e-01 134 133 6.93889390390723e-18 134 90 -2.88461538461351e-01 134 135 1.11022302462516e-16 134 136 -7.69230769231144e-01 134 137 -6.93889390390723e-18 134 174 -2.88461538461351e-01 134 175 2.40384615384615e-01 134 176 1.92307692307318e-01 134 177 -1.04083408558608e-16 134 178 -2.88461538461352e-01 134 179 -2.40384615384615e-01 135 135 2.30769230769306e+00 135 91 -2.88461538461352e-01 135 92 -1.04083408558608e-16 135 93 -7.69230769231143e-01 135 94 2.40384615384615e-01 135 95 -2.88461538461351e-01 135 132 1.38777878078145e-17 135 133 1.92307692307319e-01 135 134 1.66533453693773e-16 135 90 -2.40384615384615e-01 135 136 5.55111512312578e-17 135 137 1.92307692307318e-01 135 174 2.40384615384615e-01 135 175 -2.88461538461351e-01 135 176 -1.04083408558608e-16 135 177 -7.69230769231143e-01 135 178 -2.40384615384615e-01 135 179 -2.88461538461351e-01 136 136 2.30769230769306e+00 136 93 -2.40384615384615e-01 136 94 1.92307692307318e-01 136 95 -7.63278329429795e-17 136 96 -2.88461538461351e-01 136 97 2.40384615384615e-01 136 134 -7.69230769231144e-01 136 135 6.24500451351651e-17 136 92 -2.88461538461352e-01 136 137 1.66533453693773e-16 136 138 -7.69230769231142e-01 136 139 2.77555756156289e-17 136 176 -2.88461538461351e-01 136 177 2.40384615384615e-01 136 178 1.92307692307318e-01 136 179 -1.31838984174237e-16 136 180 -2.88461538461351e-01 136 181 -2.40384615384615e-01 137 137 2.30769230769306e+00 137 93 -2.88461538461351e-01 137 94 -1.17961196366423e-16 137 95 -7.69230769231143e-01 137 96 2.40384615384615e-01 137 97 -2.88461538461352e-01 137 134 1.38777878078145e-17 137 135 1.92307692307318e-01 137 136 1.38777878078145e-16 137 92 -2.40384615384615e-01 137 138 4.16333634234434e-17 137 139 1.92307692307319e-01 137 176 2.40384615384615e-01 137 177 -2.88461538461351e-01 137 178 -6.24500451351651e-17 137 179 -7.69230769231143e-01 137 180 -2.40384615384615e-01 137 181 -2.88461538461352e-01 138 138 2.30769230769306e+00 138 95 -2.40384615384615e-01 138 96 1.92307692307318e-01 138 97 -9.71445146547012e-17 138 98 -2.88461538461352e-01 138 99 2.40384615384615e-01 138 136 -7.69230769231142e-01 138 137 4.16333634234434e-17 138 94 -2.88461538461351e-01 138 139 1.38777878078145e-16 138 140 -7.69230769231144e-01 138 141 6.93889390390723e-18 138 178 -2.88461538461351e-01 138 179 2.40384615384615e-01 138 180 1.92307692307318e-01 138 181 -7.63278329429795e-17 138 182 -2.88461538461352e-01 138 183 -2.40384615384615e-01 139 139 2.30769230769306e+00 139 95 -2.88461538461352e-01 139 96 -6.93889390390723e-17 139 97 -7.69230769231143e-01 139 98 2.40384615384615e-01 139 99 -2.88461538461351e-01 139 136 1.38777878078145e-17 139 137 1.92307692307319e-01 139 138 1.66533453693773e-16 139 94 -2.40384615384615e-01 139 140 3.46944695195361e-17 139 141 1.92307692307318e-01 139 178 2.40384615384615e-01 139 179 -2.88461538461352e-01 139 180 -1.11022302462516e-16 139 181 -7.69230769231143e-01 139 182 -2.40384615384615e-01 139 183 -2.88461538461351e-01 140 140 1.15384717236505e+00 140 97 -2.40384615384615e-01 140 98 9.61538924499557e-02 140 99 -4.80769577991453e-02 140 100 -2.54629629629464e-07 140 101 1.73611111111111e-07 140 138 -7.69230769231144e-01 140 139 2.08166817117217e-17 140 96 -2.88461538461352e-01 140 141 6.82516384887058e-17 140 142 -6.01851851852181e-07 140 143 6.61744490042422e-24 140 180 -2.88461538461352e-01 140 181 2.40384615384615e-01 140 182 9.61538924499559e-02 140 183 4.80769577991453e-02 140 184 -2.54629629629465e-07 140 185 -1.73611111111111e-07 141 141 1.15384717236505e+00 141 97 -2.88461538461351e-01 141 98 4.80769577991453e-02 141 99 -3.84615685541497e-01 141 100 1.73611111111111e-07 141 101 -2.54629629629465e-07 141 138 2.08166817117217e-17 141 139 1.92307692307318e-01 141 140 6.82516384887058e-17 141 96 -2.40384615384615e-01 141 142 -1.98523347012727e-23 141 143 9.25925925922633e-08 141 180 2.40384615384615e-01 141 181 -2.88461538461351e-01 141 182 -4.80769577991454e-02 141 183 -3.84615685541497e-01 141 184 -1.73611111111111e-07 141 185 -2.54629629629465e-07 142 142 2.03703703703770e-06 142 99 -1.73611111111111e-07 142 100 9.25925925922624e-08 142 101 -6.61744490042422e-23 142 102 -2.54629629629465e-07 142 103 1.73611111111111e-07 142 140 -6.01851851852181e-07 142 141 2.64697796016969e-23 142 98 -2.54629629629465e-07 142 143 7.94093388050907e-23 142 144 -6.01851851852183e-07 142 145 6.61744490042422e-24 142 182 -2.54629629629464e-07 142 183 1.73611111111111e-07 142 184 9.25925925922624e-08 142 185 -3.97046694025453e-23 142 186 -2.54629629629465e-07 142 187 -1.73611111111111e-07 143 143 2.03703703703770e-06 143 99 -2.54629629629465e-07 143 100 -3.97046694025453e-23 143 101 -6.01851851852182e-07 143 102 1.73611111111111e-07 143 103 -2.54629629629465e-07 143 140 1.98523347012727e-23 143 141 9.25925925922633e-08 143 142 5.29395592033938e-23 143 98 -1.73611111111111e-07 143 144 2.64697796016969e-23 143 145 9.25925925922621e-08 143 182 1.73611111111111e-07 143 183 -2.54629629629465e-07 143 184 -3.97046694025453e-23 143 185 -6.01851851852182e-07 143 186 -1.73611111111111e-07 143 187 -2.54629629629465e-07 144 144 2.03703703703770e-06 144 101 -1.73611111111111e-07 144 102 9.25925925922629e-08 144 103 -5.29395592033938e-23 144 104 -2.54629629629465e-07 144 105 1.73611111111111e-07 144 142 -6.01851851852183e-07 144 143 1.98523347012727e-23 144 100 -2.54629629629465e-07 144 145 1.32348898008484e-22 144 146 -6.01851851852183e-07 144 147 6.61744490042422e-24 144 184 -2.54629629629465e-07 144 185 1.73611111111111e-07 144 186 9.25925925922630e-08 144 187 -9.26442286059391e-23 144 188 -2.54629629629465e-07 144 189 -1.73611111111111e-07 145 145 2.03703703703770e-06 145 101 -2.54629629629465e-07 145 102 -6.61744490042422e-23 145 103 -6.01851851852182e-07 145 104 1.73611111111111e-07 145 105 -2.54629629629465e-07 145 142 1.32348898008484e-23 145 143 9.25925925922621e-08 145 144 1.05879118406788e-22 145 100 -1.73611111111111e-07 145 146 1.32348898008484e-23 145 147 9.25925925922622e-08 145 184 1.73611111111111e-07 145 185 -2.54629629629465e-07 145 186 -6.61744490042422e-23 145 187 -6.01851851852182e-07 145 188 -1.73611111111111e-07 145 189 -2.54629629629465e-07 146 146 2.03703703703770e-06 146 103 -1.73611111111111e-07 146 104 9.25925925922627e-08 146 105 -1.98523347012727e-23 146 106 -2.54629629629465e-07 146 107 1.73611111111111e-07 146 144 -6.01851851852183e-07 146 145 1.98523347012727e-23 146 102 -2.54629629629465e-07 146 147 2.64697796016969e-23 146 148 -6.01851851852182e-07 146 149 6.61744490042422e-24 146 186 -2.54629629629465e-07 146 187 1.73611111111111e-07 146 188 9.25925925922626e-08 146 189 -4.63221143029695e-23 146 190 -2.54629629629465e-07 146 191 -1.73611111111111e-07 147 147 2.03703703703770e-06 147 103 -2.54629629629465e-07 147 104 -1.32348898008484e-23 147 105 -6.01851851852182e-07 147 106 1.73611111111111e-07 147 107 -2.54629629629465e-07 147 144 0.00000000000000e+00 147 145 9.25925925922622e-08 147 146 2.64697796016969e-23 147 102 -1.73611111111111e-07 147 148 0.00000000000000e+00 147 149 9.25925925922627e-08 147 186 1.73611111111111e-07 147 187 -2.54629629629465e-07 147 188 -3.30872245021211e-23 147 189 -6.01851851852182e-07 147 190 -1.73611111111111e-07 147 191 -2.54629629629465e-07 148 148 2.03703703703770e-06 148 105 -1.73611111111111e-07 148 106 9.25925925922617e-08 148 107 -9.92616735063633e-23 148 108 -2.54629629629464e-07 148 109 1.73611111111111e-07 148 146 -6.01851851852182e-07 148 147 0.00000000000000e+00 148 104 -2.54629629629465e-07 148 149 1.05879118406788e-22 148 150 -6.01851851852180e-07 148 151 6.61744490042422e-24 148 188 -2.54629629629464e-07 148 189 1.73611111111111e-07 148 190 9.25925925922616e-08 148 191 -5.95570041038180e-23 148 192 -2.54629629629464e-07 148 193 -1.73611111111111e-07 149 149 2.03703703703770e-06 149 105 -2.54629629629465e-07 149 106 -5.95570041038180e-23 149 107 -6.01851851852183e-07 149 108 1.73611111111111e-07 149 109 -2.54629629629465e-07 149 146 6.61744490042422e-24 149 147 9.25925925922627e-08 149 148 1.32348898008484e-22 149 104 -1.73611111111111e-07 149 150 3.30872245021211e-23 149 151 9.25925925922642e-08 149 188 1.73611111111111e-07 149 189 -2.54629629629465e-07 149 190 -9.26442286059391e-23 149 191 -6.01851851852183e-07 149 192 -1.73611111111111e-07 149 193 -2.54629629629465e-07 150 150 2.03703703703770e-06 150 107 -1.73611111111111e-07 150 108 9.25925925922616e-08 150 109 -3.97046694025453e-23 150 110 -2.54629629629464e-07 150 111 1.73611111111111e-07 150 148 -6.01851851852180e-07 150 149 1.32348898008484e-23 150 106 -2.54629629629464e-07 150 151 7.94093388050907e-23 150 152 -6.01851851852181e-07 150 153 1.32348898008484e-23 150 190 -2.54629629629464e-07 150 191 1.73611111111111e-07 150 192 9.25925925922616e-08 150 193 -8.60267837055149e-23 150 194 -2.54629629629465e-07 150 195 -1.73611111111111e-07 151 151 2.03703703703770e-06 151 107 -2.54629629629465e-07 151 108 -7.27918939046664e-23 151 109 -6.01851851852183e-07 151 110 1.73611111111111e-07 151 111 -2.54629629629465e-07 151 148 -6.61744490042422e-24 151 149 9.25925925922641e-08 151 150 5.29395592033938e-23 151 106 -1.73611111111111e-07 151 152 1.98523347012727e-23 151 153 9.25925925922628e-08 151 190 1.73611111111111e-07 151 191 -2.54629629629465e-07 151 192 -5.29395592033938e-23 151 193 -6.01851851852183e-07 151 194 -1.73611111111111e-07 151 195 -2.54629629629465e-07 152 152 2.03703703703770e-06 152 109 -1.73611111111111e-07 152 110 9.25925925922626e-08 152 111 -7.94093388050907e-23 152 112 -2.54629629629465e-07 152 113 1.73611111111111e-07 152 150 -6.01851851852182e-07 152 151 1.98523347012727e-23 152 108 -2.54629629629465e-07 152 153 1.32348898008484e-22 152 154 -6.01851851852183e-07 152 155 6.61744490042422e-24 152 192 -2.54629629629464e-07 152 193 1.73611111111111e-07 152 194 9.25925925922626e-08 152 195 -5.29395592033938e-23 152 196 -2.54629629629465e-07 152 197 -1.73611111111111e-07 153 153 2.03703703703770e-06 153 109 -2.54629629629465e-07 153 110 -5.29395592033938e-23 153 111 -6.01851851852182e-07 153 112 1.73611111111111e-07 153 113 -2.54629629629465e-07 153 150 0.00000000000000e+00 153 151 9.25925925922628e-08 153 152 1.05879118406788e-22 153 108 -1.73611111111111e-07 153 154 1.32348898008484e-23 153 155 9.25925925922622e-08 153 192 1.73611111111111e-07 153 193 -2.54629629629465e-07 153 194 -6.61744490042422e-23 153 195 -6.01851851852182e-07 153 196 -1.73611111111111e-07 153 197 -2.54629629629465e-07 154 154 2.03703703703770e-06 154 111 -1.73611111111111e-07 154 112 9.25925925922630e-08 154 113 -7.27918939046664e-23 154 114 -2.54629629629465e-07 154 115 1.73611111111111e-07 154 152 -6.01851851852183e-07 154 153 1.98523347012727e-23 154 110 -2.54629629629465e-07 154 155 2.64697796016969e-23 154 156 -6.01851851852183e-07 154 157 6.61744490042422e-24 154 194 -2.54629629629465e-07 154 195 1.73611111111111e-07 154 196 9.25925925922629e-08 154 197 -3.97046694025453e-23 154 198 -2.54629629629465e-07 154 199 -1.73611111111111e-07 155 155 2.03703703703770e-06 155 111 -2.54629629629465e-07 155 112 -3.97046694025453e-23 155 113 -6.01851851852182e-07 155 114 1.73611111111111e-07 155 115 -2.54629629629465e-07 155 152 0.00000000000000e+00 155 153 9.25925925922622e-08 155 154 5.29395592033938e-23 155 110 -1.73611111111111e-07 155 156 2.64697796016969e-23 155 157 9.25925925922620e-08 155 194 1.73611111111111e-07 155 195 -2.54629629629465e-07 155 196 -6.61744490042422e-23 155 197 -6.01851851852182e-07 155 198 -1.73611111111111e-07 155 199 -2.54629629629465e-07 156 156 1.66676851851906e-02 156 113 -1.73611111111111e-07 156 114 2.38099867724597e-03 156 115 2.67860615079365e-03 156 116 -4.16666666666396e-03 156 117 4.46428571428572e-03 156 154 -6.01851851852183e-07 156 155 6.61744490042422e-24 156 112 -2.54629629629465e-07 156 157 8.67361737988404e-19 156 158 -1.30952380952435e-02 156 159 8.67361737988404e-19 156 196 -2.54629629629465e-07 156 197 1.73611111111111e-07 156 198 2.38099867724597e-03 156 199 -2.67860615079365e-03 156 200 -4.16666666666397e-03 156 201 -4.46428571428572e-03 157 157 1.66676851851906e-02 157 113 -2.54629629629465e-07 157 114 -2.67860615079365e-03 157 115 -6.54791997354769e-03 157 116 4.46428571428572e-03 157 117 -4.16666666666397e-03 157 154 1.32348898008484e-23 157 155 9.25925925922620e-08 157 156 8.67361737988404e-19 157 112 -1.73611111111111e-07 157 158 -4.33680868994202e-19 157 159 4.76190476189937e-03 157 196 1.73611111111111e-07 157 197 -2.54629629629465e-07 157 198 2.67860615079365e-03 157 199 -6.54791997354769e-03 157 200 -4.46428571428572e-03 157 201 -4.16666666666397e-03 158 158 3.33333333333441e-02 158 115 -4.46428571428572e-03 158 116 4.76190476189936e-03 158 117 -3.46944695195361e-18 158 118 -4.16666666666397e-03 158 119 4.46428571428571e-03 158 156 -1.30952380952435e-02 158 157 -4.33680868994202e-19 158 114 -4.16666666666397e-03 158 159 1.73472347597681e-18 158 160 -1.30952380952435e-02 158 161 8.67361737988404e-19 158 198 -4.16666666666396e-03 158 199 4.46428571428572e-03 158 200 4.76190476189936e-03 158 201 -4.33680868994202e-19 158 202 -4.16666666666397e-03 158 203 -4.46428571428572e-03 159 159 3.33333333333442e-02 159 115 -4.16666666666397e-03 159 116 -8.67361737988404e-19 159 117 -1.30952380952435e-02 159 118 4.46428571428571e-03 159 119 -4.16666666666397e-03 159 156 4.33680868994202e-19 159 157 4.76190476189937e-03 159 158 2.60208521396521e-18 159 114 -4.46428571428572e-03 159 160 0.00000000000000e+00 159 161 4.76190476189936e-03 159 198 4.46428571428572e-03 159 199 -4.16666666666397e-03 159 200 -3.46944695195361e-18 159 201 -1.30952380952435e-02 159 202 -4.46428571428571e-03 159 203 -4.16666666666397e-03 160 160 3.33333333333442e-02 160 117 -4.46428571428571e-03 160 118 4.76190476189938e-03 160 119 -4.33680868994202e-19 160 120 -4.16666666666398e-03 160 121 4.46428571428572e-03 160 158 -1.30952380952435e-02 160 159 -4.33680868994202e-19 160 116 -4.16666666666397e-03 160 161 0.00000000000000e+00 160 162 -1.30952380952435e-02 160 163 0.00000000000000e+00 160 200 -4.16666666666397e-03 160 201 4.46428571428572e-03 160 202 4.76190476189938e-03 160 203 -8.67361737988404e-19 160 204 -4.16666666666398e-03 160 205 -4.46428571428572e-03 161 161 3.33333333333441e-02 161 117 -4.16666666666397e-03 161 118 -2.60208521396521e-18 161 119 -1.30952380952435e-02 161 120 4.46428571428572e-03 161 121 -4.16666666666396e-03 161 158 8.67361737988404e-19 161 159 4.76190476189936e-03 161 160 8.67361737988404e-19 161 116 -4.46428571428572e-03 161 162 0.00000000000000e+00 161 163 4.76190476189933e-03 161 200 4.46428571428571e-03 161 201 -4.16666666666397e-03 161 202 0.00000000000000e+00 161 203 -1.30952380952435e-02 161 204 -4.46428571428572e-03 161 205 -4.16666666666396e-03 162 162 3.33333333333442e-02 162 119 -4.46428571428572e-03 162 120 4.76190476189937e-03 162 121 -1.73472347597681e-18 162 122 -4.16666666666396e-03 162 123 4.46428571428572e-03 162 160 -1.30952380952435e-02 162 161 4.33680868994202e-19 162 118 -4.16666666666398e-03 162 163 2.60208521396521e-18 162 164 -1.30952380952435e-02 162 165 8.67361737988404e-19 162 202 -4.16666666666398e-03 162 203 4.46428571428572e-03 162 204 4.76190476189937e-03 162 205 -1.73472347597681e-18 162 206 -4.16666666666396e-03 162 207 -4.46428571428572e-03 163 163 3.33333333333441e-02 163 119 -4.16666666666396e-03 163 120 -8.67361737988404e-19 163 121 -1.30952380952435e-02 163 122 4.46428571428572e-03 163 123 -4.16666666666397e-03 163 160 4.33680868994202e-19 163 161 4.76190476189933e-03 163 162 2.60208521396521e-18 163 118 -4.46428571428572e-03 163 164 -4.33680868994202e-19 163 165 4.76190476189938e-03 163 202 4.46428571428572e-03 163 203 -4.16666666666396e-03 163 204 -2.60208521396521e-18 163 205 -1.30952380952435e-02 163 206 -4.46428571428572e-03 163 207 -4.16666666666397e-03 164 164 3.33333333333441e-02 164 121 -4.46428571428572e-03 164 122 4.76190476189935e-03 164 123 -1.30104260698261e-18 164 124 -4.16666666666396e-03 164 125 4.46428571428572e-03 164 162 -1.30952380952435e-02 164 163 -4.33680868994202e-19 164 120 -4.16666666666396e-03 164 165 8.67361737988404e-19 164 166 -1.30952380952435e-02 164 167 8.67361737988404e-19 164 204 -4.16666666666396e-03 164 205 4.46428571428572e-03 164 206 4.76190476189935e-03 164 207 -1.30104260698261e-18 164 208 -4.16666666666397e-03 164 209 -4.46428571428572e-03 165 165 3.33333333333442e-02 165 121 -4.16666666666397e-03 165 122 -1.30104260698261e-18 165 123 -1.30952380952435e-02 165 124 4.46428571428572e-03 165 125 -4.16666666666397e-03 165 162 1.30104260698261e-18 165 163 4.76190476189938e-03 165 164 8.67361737988404e-19 165 120 -4.46428571428572e-03 165 166 -4.33680868994202e-19 165 167 4.76190476189937e-03 165 204 4.46428571428571e-03 165 205 -4.16666666666397e-03 165 206 -1.30104260698261e-18 165 207 -1.30952380952435e-02 165 208 -4.46428571428572e-03 165 209 -4.16666666666397e-03 166 166 3.33333333333442e-02 166 123 -4.46428571428572e-03 166 124 4.76190476189937e-03 166 125 -1.30104260698261e-18 166 164 -1.30952380952435e-02 166 165 -4.33680868994202e-19 166 122 -4.16666666666397e-03 166 167 8.67361737988404e-19 166 206 -4.16666666666396e-03 166 207 4.46428571428572e-03 166 208 4.76190476189937e-03 166 209 -4.33680868994202e-19 167 167 3.33333333333442e-02 167 123 -4.16666666666397e-03 167 124 -8.67361737988404e-19 167 125 -1.30952380952435e-02 167 164 4.33680868994202e-19 167 165 4.76190476189937e-03 167 166 1.73472347597681e-18 167 122 -4.46428571428572e-03 167 206 4.46428571428572e-03 167 207 -4.16666666666397e-03 167 208 -1.73472347597681e-18 167 209 -1.30952380952435e-02 168 168 2.30769230769306e+00 168 127 -9.02056207507940e-17 168 128 -2.88461538461351e-01 168 129 2.40384615384615e-01 168 126 1.92307692307318e-01 168 169 1.38777878078145e-16 168 170 -7.69230769231143e-01 168 171 1.38777878078145e-17 168 210 1.92307692307319e-01 168 211 -6.93889390390723e-18 168 212 -2.88461538461352e-01 168 213 -2.40384615384615e-01 169 169 2.30769230769306e+00 169 127 -7.69230769231143e-01 169 128 2.40384615384615e-01 169 129 -2.88461538461352e-01 169 168 1.11022302462516e-16 169 126 -1.04083408558608e-16 169 170 4.85722573273506e-17 169 171 1.92307692307318e-01 169 210 6.93889390390723e-18 169 211 -7.69230769231143e-01 169 212 -2.40384615384615e-01 169 213 -2.88461538461351e-01 170 170 2.30769230769306e+00 170 127 -2.40384615384615e-01 170 128 1.92307692307318e-01 170 129 -9.02056207507940e-17 170 130 -2.88461538461351e-01 170 131 2.40384615384615e-01 170 168 -7.69230769231143e-01 170 169 3.46944695195361e-17 170 126 -2.88461538461352e-01 170 171 1.38777878078145e-16 170 172 -7.69230769231143e-01 170 173 1.38777878078145e-17 170 210 -2.88461538461351e-01 170 211 2.40384615384615e-01 170 212 1.92307692307319e-01 170 213 -6.93889390390723e-18 170 214 -2.88461538461352e-01 170 215 -2.40384615384615e-01 171 171 2.30769230769306e+00 171 127 -2.88461538461352e-01 171 128 -1.04083408558608e-16 171 129 -7.69230769231143e-01 171 130 2.40384615384615e-01 171 131 -2.88461538461352e-01 171 168 1.38777878078145e-17 171 169 1.92307692307318e-01 171 170 1.11022302462516e-16 171 126 -2.40384615384615e-01 171 172 4.85722573273506e-17 171 173 1.92307692307318e-01 171 210 2.40384615384615e-01 171 211 -2.88461538461351e-01 171 212 6.93889390390723e-18 171 213 -7.69230769231143e-01 171 214 -2.40384615384615e-01 171 215 -2.88461538461351e-01 172 172 2.30769230769306e+00 172 129 -2.40384615384615e-01 172 130 1.92307692307318e-01 172 131 -9.71445146547012e-17 172 132 -2.88461538461351e-01 172 133 2.40384615384615e-01 172 170 -7.69230769231143e-01 172 171 3.46944695195361e-17 172 128 -2.88461538461352e-01 172 173 2.77555756156289e-16 172 174 -7.69230769231143e-01 172 175 0.00000000000000e+00 172 212 -2.88461538461351e-01 172 213 2.40384615384615e-01 172 214 1.92307692307318e-01 172 215 6.93889390390723e-18 172 216 -2.88461538461352e-01 172 217 -2.40384615384615e-01 173 173 2.30769230769306e+00 173 129 -2.88461538461352e-01 173 130 -7.63278329429795e-17 173 131 -7.69230769231143e-01 173 132 2.40384615384615e-01 173 133 -2.88461538461351e-01 173 170 1.38777878078145e-17 173 171 1.92307692307318e-01 173 172 2.49800180540660e-16 173 128 -2.40384615384615e-01 173 174 5.55111512312578e-17 173 175 1.92307692307318e-01 173 212 2.40384615384615e-01 173 213 -2.88461538461351e-01 173 214 -2.08166817117217e-17 173 215 -7.69230769231143e-01 173 216 -2.40384615384615e-01 173 217 -2.88461538461352e-01 174 174 2.30769230769306e+00 174 131 -2.40384615384615e-01 174 132 1.92307692307318e-01 174 133 -6.24500451351651e-17 174 134 -2.88461538461351e-01 174 135 2.40384615384615e-01 174 172 -7.69230769231143e-01 174 173 5.55111512312578e-17 174 130 -2.88461538461351e-01 174 175 2.77555756156289e-17 174 176 -7.69230769231143e-01 174 177 0.00000000000000e+00 174 214 -2.88461538461352e-01 174 215 2.40384615384615e-01 174 216 1.92307692307318e-01 174 217 -2.08166817117217e-17 174 218 -2.88461538461351e-01 174 219 -2.40384615384615e-01 175 175 2.30769230769306e+00 175 131 -2.88461538461351e-01 175 132 -1.04083408558608e-16 175 133 -7.69230769231144e-01 175 134 2.40384615384615e-01 175 135 -2.88461538461351e-01 175 172 2.08166817117217e-17 175 173 1.92307692307318e-01 175 174 2.77555756156289e-17 175 130 -2.40384615384615e-01 175 176 4.16333634234434e-17 175 177 1.92307692307319e-01 175 214 2.40384615384615e-01 175 215 -2.88461538461352e-01 175 216 1.38777878078145e-17 175 217 -7.69230769231143e-01 175 218 -2.40384615384615e-01 175 219 -2.88461538461352e-01 176 176 2.30769230769306e+00 176 133 -2.40384615384615e-01 176 134 1.92307692307318e-01 176 135 -1.04083408558608e-16 176 136 -2.88461538461351e-01 176 137 2.40384615384615e-01 176 174 -7.69230769231143e-01 176 175 5.55111512312578e-17 176 132 -2.88461538461351e-01 176 177 2.77555756156289e-17 176 178 -7.69230769231144e-01 176 179 1.38777878078145e-17 176 216 -2.88461538461351e-01 176 217 2.40384615384615e-01 176 218 1.92307692307319e-01 176 219 -3.46944695195361e-17 176 220 -2.88461538461352e-01 176 221 -2.40384615384615e-01 177 177 2.30769230769306e+00 177 133 -2.88461538461352e-01 177 134 -1.17961196366423e-16 177 135 -7.69230769231143e-01 177 136 2.40384615384615e-01 177 137 -2.88461538461351e-01 177 174 2.08166817117217e-17 177 175 1.92307692307319e-01 177 176 8.32667268468867e-17 177 132 -2.40384615384615e-01 177 178 6.93889390390723e-18 177 179 1.92307692307318e-01 177 216 2.40384615384615e-01 177 217 -2.88461538461352e-01 177 218 3.46944695195361e-17 177 219 -7.69230769231143e-01 177 220 -2.40384615384615e-01 177 221 -2.88461538461351e-01 178 178 2.30769230769306e+00 178 135 -2.40384615384615e-01 178 136 1.92307692307318e-01 178 137 -1.04083408558608e-16 178 138 -2.88461538461351e-01 178 139 2.40384615384615e-01 178 176 -7.69230769231144e-01 178 177 2.77555756156289e-17 178 134 -2.88461538461352e-01 178 179 1.11022302462516e-16 178 180 -7.69230769231143e-01 178 181 6.93889390390723e-18 178 218 -2.88461538461352e-01 178 219 2.40384615384615e-01 178 220 1.92307692307318e-01 178 221 -2.77555756156289e-17 178 222 -2.88461538461351e-01 178 223 -2.40384615384615e-01 179 179 2.30769230769306e+00 179 135 -2.88461538461351e-01 179 136 -1.17961196366423e-16 179 137 -7.69230769231143e-01 179 138 2.40384615384615e-01 179 139 -2.88461538461352e-01 179 176 3.46944695195361e-17 179 177 1.92307692307318e-01 179 178 5.55111512312578e-17 179 134 -2.40384615384615e-01 179 180 2.08166817117217e-17 179 181 1.92307692307319e-01 179 218 2.40384615384615e-01 179 219 -2.88461538461351e-01 179 220 -1.38777878078145e-17 179 221 -7.69230769231143e-01 179 222 -2.40384615384615e-01 179 223 -2.88461538461352e-01 180 180 2.30769230769306e+00 180 137 -2.40384615384615e-01 180 138 1.92307692307318e-01 180 139 -1.24900090270330e-16 180 140 -2.88461538461352e-01 180 141 2.40384615384615e-01 180 178 -7.69230769231143e-01 180 179 4.85722573273506e-17 180 136 -2.88461538461351e-01 180 181 1.11022302462516e-16 180 182 -7.69230769231144e-01 180 183 6.93889390390723e-18 180 220 -2.88461538461351e-01 180 221 2.40384615384615e-01 180 222 1.92307692307319e-01 180 223 3.46944695195361e-17 180 224 -2.88461538461352e-01 180 225 -2.40384615384615e-01 181 181 2.30769230769306e+00 181 137 -2.88461538461352e-01 181 138 -6.24500451351651e-17 181 139 -7.69230769231143e-01 181 140 2.40384615384615e-01 181 141 -2.88461538461351e-01 181 178 1.38777878078145e-17 181 179 1.92307692307319e-01 181 180 1.11022302462516e-16 181 136 -2.40384615384615e-01 181 182 5.55111512312578e-17 181 183 1.92307692307318e-01 181 220 2.40384615384615e-01 181 221 -2.88461538461352e-01 181 222 -3.46944695195361e-17 181 223 -7.69230769231143e-01 181 224 -2.40384615384615e-01 181 225 -2.88461538461351e-01 182 182 1.15384717236505e+00 182 139 -2.40384615384615e-01 182 140 9.61538924499559e-02 182 141 -4.80769577991454e-02 182 142 -2.54629629629464e-07 182 143 1.73611111111111e-07 182 180 -7.69230769231144e-01 182 181 5.55111512312578e-17 182 138 -2.88461538461352e-01 182 183 1.23762763250184e-16 182 184 -6.01851851852181e-07 182 185 1.32348898008484e-23 182 222 -2.88461538461352e-01 182 223 2.40384615384615e-01 182 224 9.61538924499559e-02 182 225 4.80769577991453e-02 182 226 -2.54629629629465e-07 182 227 -1.73611111111111e-07 183 183 1.15384717236505e+00 183 139 -2.88461538461351e-01 183 140 4.80769577991453e-02 183 141 -3.84615685541497e-01 183 142 1.73611111111111e-07 183 143 -2.54629629629465e-07 183 180 1.38777878078145e-17 183 181 1.92307692307318e-01 183 182 1.23762736780404e-16 183 138 -2.40384615384615e-01 183 184 6.61744490042422e-24 183 185 9.25925925922632e-08 183 222 2.40384615384615e-01 183 223 -2.88461538461351e-01 183 224 -4.80769577991453e-02 183 225 -3.84615685541497e-01 183 226 -1.73611111111111e-07 183 227 -2.54629629629465e-07 184 184 2.03703703703770e-06 184 141 -1.73611111111111e-07 184 142 9.25925925922624e-08 184 143 -5.95570041038180e-23 184 144 -2.54629629629465e-07 184 145 1.73611111111111e-07 184 182 -6.01851851852181e-07 184 183 1.98523347012727e-23 184 140 -2.54629629629465e-07 184 185 5.29395592033938e-23 184 186 -6.01851851852183e-07 184 187 2.64697796016969e-23 184 224 -2.54629629629465e-07 184 225 1.73611111111111e-07 184 226 9.25925925922626e-08 184 227 -6.61744490042422e-24 184 228 -2.54629629629465e-07 184 229 -1.73611111111111e-07 185 185 2.03703703703770e-06 185 141 -2.54629629629465e-07 185 142 -7.27918939046664e-23 185 143 -6.01851851852182e-07 185 144 1.73611111111111e-07 185 145 -2.54629629629465e-07 185 182 1.32348898008484e-23 185 183 9.25925925922632e-08 185 184 1.32348898008484e-22 185 140 -1.73611111111111e-07 185 186 1.32348898008484e-23 185 187 9.25925925922620e-08 185 224 1.73611111111111e-07 185 225 -2.54629629629465e-07 185 226 1.98523347012727e-23 185 227 -6.01851851852182e-07 185 228 -1.73611111111111e-07 185 229 -2.54629629629465e-07 186 186 2.03703703703770e-06 186 143 -1.73611111111111e-07 186 144 9.25925925922629e-08 186 145 -5.29395592033938e-23 186 146 -2.54629629629465e-07 186 147 1.73611111111111e-07 186 184 -6.01851851852183e-07 186 185 -6.61744490042422e-24 186 142 -2.54629629629465e-07 186 187 1.05879118406788e-22 186 188 -6.01851851852183e-07 186 189 6.61744490042422e-24 186 226 -2.54629629629465e-07 186 227 1.73611111111111e-07 186 228 9.25925925922632e-08 186 229 6.61744490042422e-24 186 230 -2.54629629629465e-07 186 231 -1.73611111111111e-07 187 187 2.03703703703770e-06 187 143 -2.54629629629465e-07 187 144 -6.61744490042422e-23 187 145 -6.01851851852182e-07 187 146 1.73611111111111e-07 187 147 -2.54629629629465e-07 187 184 2.64697796016969e-23 187 185 9.25925925922620e-08 187 186 1.05879118406788e-22 187 142 -1.73611111111111e-07 187 188 1.32348898008484e-23 187 189 9.25925925922621e-08 187 226 1.73611111111111e-07 187 227 -2.54629629629465e-07 187 228 -1.32348898008484e-23 187 229 -6.01851851852181e-07 187 230 -1.73611111111111e-07 187 231 -2.54629629629464e-07 188 188 2.03703703703770e-06 188 145 -1.73611111111111e-07 188 146 9.25925925922626e-08 188 147 -1.32348898008484e-23 188 148 -2.54629629629464e-07 188 149 1.73611111111111e-07 188 186 -6.01851851852183e-07 188 187 2.64697796016969e-23 188 144 -2.54629629629465e-07 188 189 5.29395592033938e-23 188 190 -6.01851851852182e-07 188 191 2.64697796016969e-23 188 228 -2.54629629629465e-07 188 229 1.73611111111111e-07 188 230 9.25925925922629e-08 188 231 -3.97046694025453e-23 188 232 -2.54629629629465e-07 188 233 -1.73611111111111e-07 189 189 2.03703703703770e-06 189 145 -2.54629629629465e-07 189 146 -3.30872245021211e-23 189 147 -6.01851851852182e-07 189 148 1.73611111111111e-07 189 149 -2.54629629629465e-07 189 186 1.32348898008484e-23 189 187 9.25925925922621e-08 189 188 7.94093388050907e-23 189 144 -1.73611111111111e-07 189 190 0.00000000000000e+00 189 191 9.25925925922625e-08 189 228 1.73611111111111e-07 189 229 -2.54629629629464e-07 189 230 0.00000000000000e+00 189 231 -6.01851851852182e-07 189 232 -1.73611111111111e-07 189 233 -2.54629629629465e-07 190 190 2.03703703703770e-06 190 147 -1.73611111111111e-07 190 148 9.25925925922617e-08 190 149 -1.05879118406788e-22 190 150 -2.54629629629464e-07 190 151 1.73611111111111e-07 190 188 -6.01851851852182e-07 190 189 0.00000000000000e+00 190 146 -2.54629629629465e-07 190 191 5.29395592033938e-23 190 192 -6.01851851852180e-07 190 193 0.00000000000000e+00 190 230 -2.54629629629465e-07 190 231 1.73611111111111e-07 190 232 9.25925925922619e-08 190 233 3.30872245021211e-23 190 234 -2.54629629629464e-07 190 235 -1.73611111111111e-07 191 191 2.03703703703770e-06 191 147 -2.54629629629465e-07 191 148 -9.26442286059391e-23 191 149 -6.01851851852183e-07 191 150 1.73611111111111e-07 191 151 -2.54629629629465e-07 191 188 2.64697796016969e-23 191 189 9.25925925922625e-08 191 190 5.29395592033938e-23 191 146 -1.73611111111111e-07 191 192 3.97046694025453e-23 191 193 9.25925925922641e-08 191 230 1.73611111111111e-07 191 231 -2.54629629629465e-07 191 232 0.00000000000000e+00 191 233 -6.01851851852183e-07 191 234 -1.73611111111111e-07 191 235 -2.54629629629465e-07 192 192 2.03703703703770e-06 192 149 -1.73611111111111e-07 192 150 9.25925925922616e-08 192 151 -4.63221143029695e-23 192 152 -2.54629629629464e-07 192 153 1.73611111111111e-07 192 190 -6.01851851852180e-07 192 191 2.64697796016969e-23 192 148 -2.54629629629464e-07 192 193 1.32348898008484e-22 192 194 -6.01851851852182e-07 192 195 2.64697796016969e-23 192 232 -2.54629629629464e-07 192 233 1.73611111111111e-07 192 234 9.25925925922619e-08 192 235 -3.30872245021211e-23 192 236 -2.54629629629465e-07 192 237 -1.73611111111111e-07 193 193 2.03703703703770e-06 193 149 -2.54629629629465e-07 193 150 -7.27918939046664e-23 193 151 -6.01851851852183e-07 193 152 1.73611111111111e-07 193 153 -2.54629629629465e-07 193 190 -1.32348898008484e-23 193 191 9.25925925922641e-08 193 192 1.32348898008484e-22 193 148 -1.73611111111111e-07 193 194 6.61744490042422e-24 193 195 9.25925925922627e-08 193 232 1.73611111111111e-07 193 233 -2.54629629629465e-07 193 234 3.30872245021211e-23 193 235 -6.01851851852183e-07 193 236 -1.73611111111111e-07 193 237 -2.54629629629465e-07 194 194 2.03703703703770e-06 194 151 -1.73611111111111e-07 194 152 9.25925925922626e-08 194 153 -7.94093388050907e-23 194 154 -2.54629629629465e-07 194 155 1.73611111111111e-07 194 192 -6.01851851852182e-07 194 193 6.61744490042422e-24 194 150 -2.54629629629465e-07 194 195 2.64697796016969e-23 194 196 -6.01851851852183e-07 194 197 6.61744490042422e-24 194 234 -2.54629629629465e-07 194 235 1.73611111111111e-07 194 236 9.25925925922629e-08 194 237 1.98523347012727e-23 194 238 -2.54629629629465e-07 194 239 -1.73611111111111e-07 195 195 2.03703703703770e-06 195 151 -2.54629629629465e-07 195 152 -5.95570041038180e-23 195 153 -6.01851851852182e-07 195 154 1.73611111111111e-07 195 155 -2.54629629629465e-07 195 192 2.64697796016969e-23 195 193 9.25925925922627e-08 195 194 0.00000000000000e+00 195 150 -1.73611111111111e-07 195 196 1.32348898008484e-23 195 197 9.25925925922621e-08 195 234 1.73611111111111e-07 195 235 -2.54629629629465e-07 195 236 -1.98523347012727e-23 195 237 -6.01851851852182e-07 195 238 -1.73611111111111e-07 195 239 -2.54629629629464e-07 196 196 2.03703703703770e-06 196 153 -1.73611111111111e-07 196 154 9.25925925922629e-08 196 155 -5.95570041038180e-23 196 156 -2.54629629629465e-07 196 157 1.73611111111111e-07 196 194 -6.01851851852183e-07 196 195 2.64697796016969e-23 196 152 -2.54629629629465e-07 196 197 5.29395592033938e-23 196 198 -6.01851851852183e-07 196 199 4.63221143029695e-23 196 236 -2.54629629629465e-07 196 237 1.73611111111111e-07 196 238 9.25925925922632e-08 196 239 0.00000000000000e+00 196 240 -2.54629629629465e-07 196 241 -1.73611111111111e-07 197 197 2.03703703703770e-06 197 153 -2.54629629629465e-07 197 154 -3.97046694025453e-23 197 155 -6.01851851852182e-07 197 156 1.73611111111111e-07 197 157 -2.54629629629465e-07 197 194 1.32348898008484e-23 197 195 9.25925925922621e-08 197 196 7.94093388050907e-23 197 152 -1.73611111111111e-07 197 198 0.00000000000000e+00 197 199 9.25925925922619e-08 197 236 1.73611111111111e-07 197 237 -2.54629629629464e-07 197 238 1.32348898008484e-23 197 239 -6.01851851852181e-07 197 240 -1.73611111111111e-07 197 241 -2.54629629629464e-07 198 198 1.66676851851906e-02 198 155 -1.73611111111111e-07 198 156 2.38099867724597e-03 198 157 2.67860615079365e-03 198 158 -4.16666666666396e-03 198 159 4.46428571428572e-03 198 196 -6.01851851852183e-07 198 197 0.00000000000000e+00 198 154 -2.54629629629465e-07 198 199 8.67361737988404e-19 198 200 -1.30952380952435e-02 198 201 4.33680868994202e-19 198 238 -2.54629629629465e-07 198 239 1.73611111111111e-07 198 240 2.38099867724597e-03 198 241 -2.67860615079365e-03 198 242 -4.16666666666396e-03 198 243 -4.46428571428572e-03 199 199 1.66676851851906e-02 199 155 -2.54629629629465e-07 199 156 -2.67860615079365e-03 199 157 -6.54791997354769e-03 199 158 4.46428571428572e-03 199 159 -4.16666666666397e-03 199 196 3.30872245021211e-23 199 197 9.25925925922619e-08 199 198 0.00000000000000e+00 199 154 -1.73611111111111e-07 199 200 1.30104260698261e-18 199 201 4.76190476189937e-03 199 238 1.73611111111111e-07 199 239 -2.54629629629464e-07 199 240 2.67860615079365e-03 199 241 -6.54791997354769e-03 199 242 -4.46428571428572e-03 199 243 -4.16666666666397e-03 200 200 3.33333333333441e-02 200 157 -4.46428571428572e-03 200 158 4.76190476189936e-03 200 159 -3.46944695195361e-18 200 160 -4.16666666666397e-03 200 161 4.46428571428571e-03 200 198 -1.30952380952435e-02 200 199 1.30104260698261e-18 200 156 -4.16666666666397e-03 200 201 1.73472347597681e-18 200 202 -1.30952380952435e-02 200 203 8.67361737988404e-19 200 240 -4.16666666666396e-03 200 241 4.46428571428572e-03 200 242 4.76190476189936e-03 200 243 4.33680868994202e-19 200 244 -4.16666666666397e-03 200 245 -4.46428571428572e-03 201 201 3.33333333333442e-02 201 157 -4.16666666666397e-03 201 158 -4.33680868994202e-19 201 159 -1.30952380952435e-02 201 160 4.46428571428572e-03 201 161 -4.16666666666397e-03 201 198 0.00000000000000e+00 201 199 4.76190476189937e-03 201 200 2.60208521396521e-18 201 156 -4.46428571428572e-03 201 202 -4.33680868994202e-19 201 203 4.76190476189936e-03 201 240 4.46428571428572e-03 201 241 -4.16666666666397e-03 201 242 -4.33680868994202e-19 201 243 -1.30952380952435e-02 201 244 -4.46428571428572e-03 201 245 -4.16666666666397e-03 202 202 3.33333333333442e-02 202 159 -4.46428571428572e-03 202 160 4.76190476189938e-03 202 161 -4.33680868994202e-19 202 162 -4.16666666666398e-03 202 163 4.46428571428572e-03 202 200 -1.30952380952435e-02 202 201 4.33680868994202e-19 202 158 -4.16666666666397e-03 202 203 1.73472347597681e-18 202 204 -1.30952380952436e-02 202 205 4.33680868994202e-19 202 242 -4.16666666666397e-03 202 243 4.46428571428571e-03 202 244 4.76190476189938e-03 202 245 -4.33680868994202e-19 202 246 -4.16666666666398e-03 202 247 -4.46428571428572e-03 203 203 3.33333333333441e-02 203 159 -4.16666666666397e-03 203 160 -1.73472347597681e-18 203 161 -1.30952380952435e-02 203 162 4.46428571428572e-03 203 163 -4.16666666666396e-03 203 200 8.67361737988404e-19 203 201 4.76190476189936e-03 203 202 8.67361737988404e-19 203 158 -4.46428571428572e-03 203 204 1.30104260698261e-18 203 205 4.76190476189933e-03 203 242 4.46428571428571e-03 203 243 -4.16666666666397e-03 203 244 4.33680868994202e-19 203 245 -1.30952380952435e-02 203 246 -4.46428571428572e-03 203 247 -4.16666666666396e-03 204 204 3.33333333333442e-02 204 161 -4.46428571428572e-03 204 162 4.76190476189937e-03 204 163 -2.16840434497101e-18 204 164 -4.16666666666396e-03 204 165 4.46428571428572e-03 204 202 -1.30952380952436e-02 204 203 8.67361737988404e-19 204 160 -4.16666666666398e-03 204 205 2.60208521396521e-18 204 206 -1.30952380952435e-02 204 207 4.33680868994202e-19 204 244 -4.16666666666398e-03 204 245 4.46428571428572e-03 204 246 4.76190476189937e-03 204 247 0.00000000000000e+00 204 248 -4.16666666666396e-03 204 249 -4.46428571428572e-03 205 205 3.33333333333441e-02 205 161 -4.16666666666396e-03 205 162 -1.30104260698261e-18 205 163 -1.30952380952435e-02 205 164 4.46428571428572e-03 205 165 -4.16666666666397e-03 205 202 8.67361737988404e-19 205 203 4.76190476189933e-03 205 204 8.67361737988404e-19 205 160 -4.46428571428572e-03 205 206 4.33680868994202e-19 205 207 4.76190476189938e-03 205 244 4.46428571428572e-03 205 245 -4.16666666666396e-03 205 246 -4.33680868994202e-19 205 247 -1.30952380952435e-02 205 248 -4.46428571428572e-03 205 249 -4.16666666666397e-03 206 206 3.33333333333441e-02 206 163 -4.46428571428572e-03 206 164 4.76190476189935e-03 206 165 -2.16840434497101e-18 206 166 -4.16666666666396e-03 206 167 4.46428571428572e-03 206 204 -1.30952380952435e-02 206 205 8.67361737988404e-19 206 162 -4.16666666666396e-03 206 207 1.73472347597681e-18 206 208 -1.30952380952435e-02 206 209 4.33680868994202e-19 206 246 -4.16666666666396e-03 206 247 4.46428571428572e-03 206 248 4.76190476189935e-03 206 249 4.33680868994202e-19 206 250 -4.16666666666396e-03 206 251 -4.46428571428572e-03 207 207 3.33333333333442e-02 207 163 -4.16666666666397e-03 207 164 -1.30104260698261e-18 207 165 -1.30952380952435e-02 207 166 4.46428571428572e-03 207 167 -4.16666666666397e-03 207 204 8.67361737988404e-19 207 205 4.76190476189938e-03 207 206 8.67361737988404e-19 207 162 -4.46428571428572e-03 207 208 1.30104260698261e-18 207 209 4.76190476189937e-03 207 246 4.46428571428572e-03 207 247 -4.16666666666397e-03 207 248 -4.33680868994202e-19 207 249 -1.30952380952435e-02 207 250 -4.46428571428572e-03 207 251 -4.16666666666397e-03 208 208 3.33333333333442e-02 208 165 -4.46428571428572e-03 208 166 4.76190476189936e-03 208 167 -2.16840434497101e-18 208 206 -1.30952380952435e-02 208 207 1.30104260698261e-18 208 164 -4.16666666666397e-03 208 209 8.67361737988404e-19 208 248 -4.16666666666396e-03 208 249 4.46428571428572e-03 208 250 4.76190476189937e-03 208 251 4.33680868994202e-19 209 209 3.33333333333441e-02 209 165 -4.16666666666397e-03 209 166 -4.33680868994202e-19 209 167 -1.30952380952435e-02 209 206 0.00000000000000e+00 209 207 4.76190476189937e-03 209 208 8.67361737988404e-19 209 164 -4.46428571428572e-03 209 248 4.46428571428572e-03 209 249 -4.16666666666397e-03 209 250 4.33680868994202e-19 209 251 -1.30952380952435e-02 210 210 2.30769230769306e+00 210 169 6.93889390390723e-18 210 170 -2.88461538461352e-01 210 171 2.40384615384615e-01 210 168 1.92307692307319e-01 210 211 -5.55111512312578e-17 210 212 -7.69230769231143e-01 210 213 -6.93889390390723e-18 210 252 1.92307692307318e-01 210 253 5.55111512312578e-17 210 254 -2.88461538461351e-01 210 255 -2.40384615384615e-01 211 211 2.30769230769306e+00 211 169 -7.69230769231143e-01 211 170 2.40384615384615e-01 211 171 -2.88461538461351e-01 211 210 -2.77555756156289e-17 211 168 6.93889390390723e-18 211 212 -4.16333634234434e-17 211 213 1.92307692307318e-01 211 252 7.63278329429795e-17 211 253 -7.69230769231144e-01 211 254 -2.40384615384615e-01 211 255 -2.88461538461352e-01 212 212 2.30769230769306e+00 212 169 -2.40384615384615e-01 212 170 1.92307692307319e-01 212 171 6.93889390390723e-18 212 172 -2.88461538461352e-01 212 173 2.40384615384615e-01 212 210 -7.69230769231143e-01 212 211 -1.38777878078145e-17 212 168 -2.88461538461351e-01 212 213 -5.55111512312578e-17 212 214 -7.69230769231143e-01 212 215 -6.93889390390723e-18 212 252 -2.88461538461351e-01 212 253 2.40384615384615e-01 212 254 1.92307692307318e-01 212 255 5.55111512312578e-17 212 256 -2.88461538461351e-01 212 257 -2.40384615384615e-01 213 213 2.30769230769306e+00 213 169 -2.88461538461351e-01 213 170 6.93889390390723e-18 213 171 -7.69230769231143e-01 213 172 2.40384615384615e-01 213 173 -2.88461538461351e-01 213 210 -1.38777878078145e-17 213 211 1.92307692307318e-01 213 212 -2.77555756156289e-17 213 168 -2.40384615384615e-01 213 214 -4.16333634234434e-17 213 215 1.92307692307318e-01 213 252 2.40384615384615e-01 213 253 -2.88461538461352e-01 213 254 7.63278329429795e-17 213 255 -7.69230769231144e-01 213 256 -2.40384615384615e-01 213 257 -2.88461538461352e-01 214 214 2.30769230769306e+00 214 171 -2.40384615384615e-01 214 172 1.92307692307318e-01 214 173 -6.93889390390723e-18 214 174 -2.88461538461352e-01 214 175 2.40384615384615e-01 214 212 -7.69230769231143e-01 214 213 -1.38777878078145e-17 214 170 -2.88461538461351e-01 214 215 -1.38777878078145e-16 214 216 -7.69230769231143e-01 214 217 0.00000000000000e+00 214 254 -2.88461538461351e-01 214 255 2.40384615384615e-01 214 256 1.92307692307318e-01 214 257 5.55111512312578e-17 214 258 -2.88461538461351e-01 214 259 -2.40384615384615e-01 215 215 2.30769230769306e+00 215 171 -2.88461538461351e-01 215 172 2.08166817117217e-17 215 173 -7.69230769231143e-01 215 174 2.40384615384615e-01 215 175 -2.88461538461352e-01 215 212 -1.38777878078145e-17 215 213 1.92307692307318e-01 215 214 -1.11022302462516e-16 215 170 -2.40384615384615e-01 215 216 -6.93889390390723e-17 215 217 1.92307692307319e-01 215 254 2.40384615384615e-01 215 255 -2.88461538461352e-01 215 256 7.63278329429795e-17 215 257 -7.69230769231144e-01 215 258 -2.40384615384615e-01 215 259 -2.88461538461352e-01 216 216 2.30769230769305e+00 216 173 -2.40384615384615e-01 216 174 1.92307692307318e-01 216 175 2.77555756156289e-17 216 176 -2.88461538461351e-01 216 177 2.40384615384615e-01 216 214 -7.69230769231143e-01 216 215 -9.02056207507940e-17 216 172 -2.88461538461352e-01 216 217 -5.55111512312578e-17 216 218 -7.69230769231143e-01 216 219 -2.08166817117217e-17 216 256 -2.88461538461351e-01 216 257 2.40384615384615e-01 216 258 1.92307692307318e-01 216 259 7.63278329429795e-17 216 260 -2.88461538461351e-01 216 261 -2.40384615384615e-01 217 217 2.30769230769306e+00 217 173 -2.88461538461352e-01 217 174 -2.08166817117217e-17 217 175 -7.69230769231143e-01 217 176 2.40384615384615e-01 217 177 -2.88461538461352e-01 217 214 2.08166817117217e-17 217 215 1.92307692307319e-01 217 216 -5.55111512312578e-17 217 172 -2.40384615384615e-01 217 218 -2.77555756156289e-17 217 219 1.92307692307319e-01 217 256 2.40384615384615e-01 217 257 -2.88461538461352e-01 217 258 3.46944695195361e-17 217 259 -7.69230769231144e-01 217 260 -2.40384615384615e-01 217 261 -2.88461538461352e-01 218 218 2.30769230769306e+00 218 175 -2.40384615384615e-01 218 176 1.92307692307319e-01 218 177 6.93889390390723e-18 218 178 -2.88461538461352e-01 218 179 2.40384615384615e-01 218 216 -7.69230769231143e-01 218 217 -3.46944695195361e-17 218 174 -2.88461538461351e-01 218 219 -5.55111512312578e-17 218 220 -7.69230769231144e-01 218 221 -4.16333634234434e-17 218 258 -2.88461538461351e-01 218 259 2.40384615384615e-01 218 260 1.92307692307318e-01 218 261 6.93889390390723e-17 218 262 -2.88461538461351e-01 218 263 -2.40384615384615e-01 219 219 2.30769230769306e+00 219 175 -2.88461538461352e-01 219 176 -2.08166817117217e-17 219 177 -7.69230769231143e-01 219 178 2.40384615384615e-01 219 179 -2.88461538461351e-01 219 216 0.00000000000000e+00 219 217 1.92307692307319e-01 219 218 -5.55111512312578e-17 219 174 -2.40384615384615e-01 219 220 -6.93889390390723e-18 219 221 1.92307692307318e-01 219 258 2.40384615384615e-01 219 259 -2.88461538461352e-01 219 260 6.93889390390723e-18 219 261 -7.69230769231144e-01 219 262 -2.40384615384615e-01 219 263 -2.88461538461351e-01 220 220 2.30769230769306e+00 220 177 -2.40384615384615e-01 220 178 1.92307692307318e-01 220 179 -1.38777878078145e-17 220 180 -2.88461538461351e-01 220 181 2.40384615384615e-01 220 218 -7.69230769231144e-01 220 219 6.93889390390723e-18 220 176 -2.88461538461352e-01 220 221 0.00000000000000e+00 220 222 -7.69230769231142e-01 220 223 -6.24500451351651e-17 220 260 -2.88461538461352e-01 220 261 2.40384615384615e-01 220 262 1.92307692307318e-01 220 263 5.55111512312578e-17 220 264 -2.88461538461351e-01 220 265 -2.40384615384615e-01 221 221 2.30769230769306e+00 221 177 -2.88461538461351e-01 221 178 -1.38777878078145e-17 221 179 -7.69230769231143e-01 221 180 2.40384615384615e-01 221 181 -2.88461538461352e-01 221 218 -2.77555756156289e-17 221 219 1.92307692307318e-01 221 220 0.00000000000000e+00 221 176 -2.40384615384615e-01 221 222 6.93889390390723e-18 221 223 1.92307692307319e-01 221 260 2.40384615384615e-01 221 261 -2.88461538461351e-01 221 262 7.63278329429795e-17 221 263 -7.69230769231144e-01 221 264 -2.40384615384615e-01 221 265 -2.88461538461352e-01 222 222 2.30769230769306e+00 222 179 -2.40384615384615e-01 222 180 1.92307692307319e-01 222 181 -1.38777878078145e-17 222 182 -2.88461538461352e-01 222 183 2.40384615384615e-01 222 220 -7.69230769231142e-01 222 221 -1.38777878078145e-17 222 178 -2.88461538461351e-01 222 223 -2.77555756156289e-17 222 224 -7.69230769231144e-01 222 225 6.93889390390723e-18 222 262 -2.88461538461351e-01 222 263 2.40384615384615e-01 222 264 1.92307692307318e-01 222 265 3.46944695195361e-17 222 266 -2.88461538461352e-01 222 267 -2.40384615384615e-01 223 223 2.30769230769306e+00 223 179 -2.88461538461352e-01 223 180 3.46944695195361e-17 223 181 -7.69230769231143e-01 223 182 2.40384615384615e-01 223 183 -2.88461538461351e-01 223 220 -4.16333634234434e-17 223 221 1.92307692307319e-01 223 222 -2.77555756156289e-17 223 178 -2.40384615384615e-01 223 224 -2.08166817117217e-17 223 225 1.92307692307318e-01 223 262 2.40384615384615e-01 223 263 -2.88461538461352e-01 223 264 4.85722573273506e-17 223 265 -7.69230769231143e-01 223 266 -2.40384615384615e-01 223 267 -2.88461538461351e-01 224 224 1.15384717236505e+00 224 181 -2.40384615384615e-01 224 182 9.61538924499559e-02 224 183 -4.80769577991453e-02 224 184 -2.54629629629464e-07 224 185 1.73611111111111e-07 224 222 -7.69230769231144e-01 224 223 -4.85722573273506e-17 224 180 -2.88461538461352e-01 224 225 -1.50151148279606e-17 224 226 -6.01851851852181e-07 224 227 -5.29395592033938e-23 224 264 -2.88461538461352e-01 224 265 2.40384615384615e-01 224 266 9.61538924499557e-02 224 267 4.80769577991453e-02 224 268 -2.54629629629464e-07 224 269 -1.73611111111111e-07 225 225 1.15384717236505e+00 225 181 -2.88461538461351e-01 225 182 4.80769577991453e-02 225 183 -3.84615685541497e-01 225 184 1.73611111111111e-07 225 185 -2.54629629629465e-07 225 222 -2.08166817117217e-17 225 223 1.92307692307318e-01 225 224 1.27404607876683e-17 225 180 -2.40384615384615e-01 225 226 -1.32348898008484e-23 225 227 9.25925925922634e-08 225 264 2.40384615384615e-01 225 265 -2.88461538461351e-01 225 266 -4.80769577991453e-02 225 267 -3.84615685541497e-01 225 268 -1.73611111111111e-07 225 269 -2.54629629629465e-07 226 226 2.03703703703770e-06 226 183 -1.73611111111111e-07 226 184 9.25925925922626e-08 226 185 -1.32348898008484e-23 226 186 -2.54629629629465e-07 226 187 1.73611111111111e-07 226 224 -6.01851851852181e-07 226 225 -6.61744490042422e-24 226 182 -2.54629629629464e-07 226 227 -7.94093388050907e-23 226 228 -6.01851851852183e-07 226 229 -1.98523347012727e-23 226 266 -2.54629629629465e-07 226 267 1.73611111111111e-07 226 268 9.25925925922622e-08 226 269 5.95570041038180e-23 226 270 -2.54629629629465e-07 226 271 -1.73611111111111e-07 227 227 2.03703703703770e-06 227 183 -2.54629629629465e-07 227 184 -6.61744490042422e-24 227 185 -6.01851851852182e-07 227 186 1.73611111111111e-07 227 187 -2.54629629629464e-07 227 224 -3.97046694025453e-23 227 225 9.25925925922634e-08 227 226 -2.64697796016969e-23 227 182 -1.73611111111111e-07 227 228 -1.32348898008484e-23 227 229 9.25925925922621e-08 227 266 1.73611111111111e-07 227 267 -2.54629629629465e-07 227 268 2.64697796016969e-23 227 269 -6.01851851852183e-07 227 270 -1.73611111111111e-07 227 271 -2.54629629629465e-07 228 228 2.03703703703770e-06 228 185 -1.73611111111111e-07 228 186 9.25925925922632e-08 228 187 -1.32348898008484e-23 228 188 -2.54629629629465e-07 228 189 1.73611111111111e-07 228 226 -6.01851851852183e-07 228 227 -6.61744490042422e-24 228 184 -2.54629629629465e-07 228 229 -5.29395592033938e-23 228 230 -6.01851851852183e-07 228 231 -1.98523347012727e-23 228 268 -2.54629629629465e-07 228 269 1.73611111111111e-07 228 270 9.25925925922627e-08 228 271 1.32348898008484e-23 228 272 -2.54629629629465e-07 228 273 -1.73611111111111e-07 229 229 2.03703703703770e-06 229 185 -2.54629629629464e-07 229 186 -6.61744490042422e-24 229 187 -6.01851851852181e-07 229 188 1.73611111111111e-07 229 189 -2.54629629629464e-07 229 226 -2.64697796016969e-23 229 227 9.25925925922621e-08 229 228 0.00000000000000e+00 229 184 -1.73611111111111e-07 229 230 -1.32348898008484e-23 229 231 9.25925925922622e-08 229 268 1.73611111111111e-07 229 269 -2.54629629629465e-07 229 270 3.97046694025453e-23 229 271 -6.01851851852182e-07 229 272 -1.73611111111111e-07 229 273 -2.54629629629465e-07 230 230 2.03703703703770e-06 230 187 -1.73611111111111e-07 230 188 9.25925925922629e-08 230 189 6.61744490042422e-24 230 190 -2.54629629629465e-07 230 191 1.73611111111111e-07 230 228 -6.01851851852183e-07 230 229 -1.98523347012727e-23 230 186 -2.54629629629465e-07 230 231 2.64697796016969e-23 230 232 -6.01851851852182e-07 230 233 -3.97046694025453e-23 230 270 -2.54629629629465e-07 230 271 1.73611111111111e-07 230 272 9.25925925922624e-08 230 273 3.30872245021211e-23 230 274 -2.54629629629465e-07 230 275 -1.73611111111111e-07 231 231 2.03703703703770e-06 231 187 -2.54629629629464e-07 231 188 -3.30872245021211e-23 231 189 -6.01851851852182e-07 231 190 1.73611111111111e-07 231 191 -2.54629629629465e-07 231 228 -1.32348898008484e-23 231 229 9.25925925922622e-08 231 230 0.00000000000000e+00 231 186 -1.73611111111111e-07 231 232 0.00000000000000e+00 231 233 9.25925925922627e-08 231 270 1.73611111111111e-07 231 271 -2.54629629629465e-07 231 272 5.29395592033938e-23 231 273 -6.01851851852182e-07 231 274 -1.73611111111111e-07 231 275 -2.54629629629465e-07 232 232 2.03703703703770e-06 232 189 -1.73611111111111e-07 232 190 9.25925925922619e-08 232 191 -1.32348898008484e-23 232 192 -2.54629629629464e-07 232 193 1.73611111111111e-07 232 230 -6.01851851852182e-07 232 231 -1.32348898008484e-23 232 188 -2.54629629629465e-07 232 233 -7.94093388050907e-23 232 234 -6.01851851852180e-07 232 235 -1.98523347012727e-23 232 272 -2.54629629629465e-07 232 273 1.73611111111111e-07 232 274 9.25925925922615e-08 232 275 3.97046694025453e-23 232 276 -2.54629629629464e-07 232 277 -1.73611111111111e-07 233 233 2.03703703703770e-06 233 189 -2.54629629629465e-07 233 190 3.30872245021211e-23 233 191 -6.01851851852183e-07 233 192 1.73611111111111e-07 233 193 -2.54629629629465e-07 233 230 -3.97046694025453e-23 233 231 9.25925925922627e-08 233 232 -1.32348898008484e-22 233 188 -1.73611111111111e-07 233 234 0.00000000000000e+00 233 235 9.25925925922642e-08 233 272 1.73611111111111e-07 233 273 -2.54629629629465e-07 233 274 4.63221143029695e-23 233 275 -6.01851851852184e-07 233 276 -1.73611111111111e-07 233 277 -2.54629629629465e-07 234 234 2.03703703703770e-06 234 191 -1.73611111111111e-07 234 192 9.25925925922619e-08 234 193 3.97046694025453e-23 234 194 -2.54629629629465e-07 234 195 1.73611111111111e-07 234 232 -6.01851851852180e-07 234 233 -6.61744490042422e-24 234 190 -2.54629629629464e-07 234 235 -2.64697796016969e-23 234 236 -6.01851851852182e-07 234 237 -3.97046694025453e-23 234 274 -2.54629629629464e-07 234 275 1.73611111111111e-07 234 276 9.25925925922614e-08 234 277 1.98523347012727e-23 234 278 -2.54629629629465e-07 234 279 -1.73611111111111e-07 235 235 2.03703703703770e-06 235 191 -2.54629629629465e-07 235 192 -3.30872245021211e-23 235 193 -6.01851851852183e-07 235 194 1.73611111111111e-07 235 195 -2.54629629629465e-07 235 232 -1.98523347012727e-23 235 233 9.25925925922642e-08 235 234 -2.64697796016969e-23 235 190 -1.73611111111111e-07 235 236 1.98523347012727e-23 235 237 9.25925925922628e-08 235 274 1.73611111111111e-07 235 275 -2.54629629629465e-07 235 276 3.97046694025453e-23 235 277 -6.01851851852184e-07 235 278 -1.73611111111111e-07 235 279 -2.54629629629465e-07 236 236 2.03703703703770e-06 236 193 -1.73611111111111e-07 236 194 9.25925925922629e-08 236 195 -3.30872245021211e-23 236 196 -2.54629629629465e-07 236 197 1.73611111111111e-07 236 234 -6.01851851852182e-07 236 235 0.00000000000000e+00 236 192 -2.54629629629465e-07 236 237 -5.29395592033938e-23 236 238 -6.01851851852183e-07 236 239 -1.98523347012727e-23 236 276 -2.54629629629465e-07 236 277 1.73611111111111e-07 236 278 9.25925925922624e-08 236 279 3.97046694025453e-23 236 280 -2.54629629629465e-07 236 281 -1.73611111111111e-07 237 237 2.03703703703770e-06 237 193 -2.54629629629465e-07 237 194 1.32348898008484e-23 237 195 -6.01851851852182e-07 237 196 1.73611111111111e-07 237 197 -2.54629629629464e-07 237 234 -3.97046694025453e-23 237 235 9.25925925922628e-08 237 236 -2.64697796016969e-23 237 192 -1.73611111111111e-07 237 238 -1.32348898008484e-23 237 239 9.25925925922622e-08 237 276 1.73611111111111e-07 237 277 -2.54629629629465e-07 237 278 5.29395592033938e-23 237 279 -6.01851851852182e-07 237 280 -1.73611111111111e-07 237 281 -2.54629629629465e-07 238 238 2.03703703703770e-06 238 195 -1.73611111111111e-07 238 196 9.25925925922632e-08 238 197 0.00000000000000e+00 238 198 -2.54629629629465e-07 238 199 1.73611111111111e-07 238 236 -6.01851851852183e-07 238 237 -1.98523347012727e-23 238 194 -2.54629629629465e-07 238 239 -5.29395592033938e-23 238 240 -6.01851851852183e-07 238 241 -1.98523347012727e-23 238 278 -2.54629629629465e-07 238 279 1.73611111111111e-07 238 280 9.25925925922628e-08 238 281 2.64697796016969e-23 238 282 -2.54629629629465e-07 238 283 -1.73611111111111e-07 239 239 2.03703703703770e-06 239 195 -2.54629629629464e-07 239 196 -1.32348898008484e-23 239 197 -6.01851851852181e-07 239 198 1.73611111111111e-07 239 199 -2.54629629629465e-07 239 236 -1.32348898008484e-23 239 237 9.25925925922622e-08 239 238 -2.64697796016969e-23 239 194 -1.73611111111111e-07 239 240 -6.61744490042422e-24 239 241 9.25925925922620e-08 239 278 1.73611111111111e-07 239 279 -2.54629629629465e-07 239 280 3.97046694025453e-23 239 281 -6.01851851852182e-07 239 282 -1.73611111111111e-07 239 283 -2.54629629629465e-07 240 240 1.66676851851906e-02 240 197 -1.73611111111111e-07 240 198 2.38099867724597e-03 240 199 2.67860615079365e-03 240 200 -4.16666666666396e-03 240 201 4.46428571428572e-03 240 238 -6.01851851852183e-07 240 239 -1.32348898008484e-23 240 196 -2.54629629629465e-07 240 241 0.00000000000000e+00 240 242 -1.30952380952435e-02 240 243 4.33680868994202e-19 240 280 -2.54629629629465e-07 240 281 1.73611111111111e-07 240 282 2.38099867724597e-03 240 283 -2.67860615079365e-03 240 284 -4.16666666666396e-03 240 285 -4.46428571428572e-03 241 241 1.66676851851906e-02 241 197 -2.54629629629465e-07 241 198 -2.67860615079365e-03 241 199 -6.54791997354769e-03 241 200 4.46428571428571e-03 241 201 -4.16666666666397e-03 241 238 -2.64697796016969e-23 241 239 9.25925925922620e-08 241 240 -8.67361737988404e-19 241 196 -1.73611111111111e-07 241 242 -4.33680868994202e-19 241 243 4.76190476189937e-03 241 280 1.73611111111111e-07 241 281 -2.54629629629465e-07 241 282 2.67860615079365e-03 241 283 -6.54791997354769e-03 241 284 -4.46428571428572e-03 241 285 -4.16666666666397e-03 242 242 3.33333333333441e-02 242 199 -4.46428571428572e-03 242 200 4.76190476189936e-03 242 201 -1.30104260698261e-18 242 202 -4.16666666666397e-03 242 203 4.46428571428571e-03 242 240 -1.30952380952435e-02 242 241 -8.67361737988404e-19 242 198 -4.16666666666396e-03 242 243 -8.67361737988404e-19 242 244 -1.30952380952435e-02 242 245 -4.33680868994202e-19 242 282 -4.16666666666396e-03 242 283 4.46428571428572e-03 242 284 4.76190476189936e-03 242 285 2.16840434497101e-18 242 286 -4.16666666666397e-03 242 287 -4.46428571428572e-03 243 243 3.33333333333442e-02 243 199 -4.16666666666397e-03 243 200 0.00000000000000e+00 243 201 -1.30952380952435e-02 243 202 4.46428571428571e-03 243 203 -4.16666666666397e-03 243 240 0.00000000000000e+00 243 241 4.76190476189937e-03 243 242 -8.67361737988404e-19 243 198 -4.46428571428572e-03 243 244 -8.67361737988404e-19 243 245 4.76190476189936e-03 243 282 4.46428571428572e-03 243 283 -4.16666666666397e-03 243 284 4.33680868994202e-19 243 285 -1.30952380952435e-02 243 286 -4.46428571428572e-03 243 287 -4.16666666666397e-03 244 244 3.33333333333442e-02 244 201 -4.46428571428572e-03 244 202 4.76190476189938e-03 244 203 4.33680868994202e-19 244 204 -4.16666666666398e-03 244 205 4.46428571428572e-03 244 242 -1.30952380952435e-02 244 243 0.00000000000000e+00 244 200 -4.16666666666397e-03 244 245 -1.73472347597681e-18 244 246 -1.30952380952435e-02 244 247 0.00000000000000e+00 244 284 -4.16666666666397e-03 244 285 4.46428571428572e-03 244 286 4.76190476189938e-03 244 287 4.33680868994202e-19 244 288 -4.16666666666397e-03 244 289 -4.46428571428572e-03 245 245 3.33333333333441e-02 245 201 -4.16666666666397e-03 245 202 -4.33680868994202e-19 245 203 -1.30952380952435e-02 245 204 4.46428571428572e-03 245 205 -4.16666666666396e-03 245 242 4.33680868994202e-19 245 243 4.76190476189936e-03 245 244 -2.60208521396521e-18 245 200 -4.46428571428572e-03 245 246 -4.33680868994202e-19 245 247 4.76190476189933e-03 245 284 4.46428571428572e-03 245 285 -4.16666666666397e-03 245 286 -4.33680868994202e-19 245 287 -1.30952380952435e-02 245 288 -4.46428571428572e-03 245 289 -4.16666666666396e-03 246 246 3.33333333333442e-02 246 203 -4.46428571428572e-03 246 204 4.76190476189937e-03 246 205 0.00000000000000e+00 246 206 -4.16666666666396e-03 246 207 4.46428571428572e-03 246 244 -1.30952380952435e-02 246 245 0.00000000000000e+00 246 202 -4.16666666666398e-03 246 247 -8.67361737988404e-19 246 248 -1.30952380952435e-02 246 249 4.33680868994202e-19 246 286 -4.16666666666398e-03 246 287 4.46428571428572e-03 246 288 4.76190476189937e-03 246 289 8.67361737988404e-19 246 290 -4.16666666666396e-03 246 291 -4.46428571428572e-03 247 247 3.33333333333441e-02 247 203 -4.16666666666396e-03 247 204 4.33680868994202e-19 247 205 -1.30952380952435e-02 247 206 4.46428571428571e-03 247 207 -4.16666666666397e-03 247 244 -4.33680868994202e-19 247 245 4.76190476189933e-03 247 246 -1.73472347597681e-18 247 202 -4.46428571428572e-03 247 248 -4.33680868994202e-19 247 249 4.76190476189938e-03 247 286 4.46428571428572e-03 247 287 -4.16666666666396e-03 247 288 0.00000000000000e+00 247 289 -1.30952380952435e-02 247 290 -4.46428571428572e-03 247 291 -4.16666666666397e-03 248 248 3.33333333333441e-02 248 205 -4.46428571428572e-03 248 206 4.76190476189935e-03 248 207 -4.33680868994202e-19 248 208 -4.16666666666396e-03 248 209 4.46428571428572e-03 248 246 -1.30952380952435e-02 248 247 -8.67361737988404e-19 248 204 -4.16666666666396e-03 248 249 -8.67361737988404e-19 248 250 -1.30952380952435e-02 248 251 4.33680868994202e-19 248 288 -4.16666666666396e-03 248 289 4.46428571428572e-03 248 290 4.76190476189934e-03 248 291 1.30104260698261e-18 248 292 -4.16666666666396e-03 248 293 -4.46428571428572e-03 249 249 3.33333333333442e-02 249 205 -4.16666666666397e-03 249 206 0.00000000000000e+00 249 207 -1.30952380952435e-02 249 208 4.46428571428571e-03 249 209 -4.16666666666397e-03 249 246 4.33680868994202e-19 249 247 4.76190476189938e-03 249 248 -1.73472347597681e-18 249 204 -4.46428571428572e-03 249 250 -4.33680868994202e-19 249 251 4.76190476189937e-03 249 288 4.46428571428572e-03 249 289 -4.16666666666397e-03 249 290 8.67361737988404e-19 249 291 -1.30952380952435e-02 249 292 -4.46428571428572e-03 249 293 -4.16666666666397e-03 250 250 3.33333333333442e-02 250 207 -4.46428571428572e-03 250 208 4.76190476189937e-03 250 209 -4.33680868994202e-19 250 248 -1.30952380952435e-02 250 249 -8.67361737988404e-19 250 206 -4.16666666666396e-03 250 251 -1.73472347597681e-18 250 290 -4.16666666666396e-03 250 291 4.46428571428572e-03 250 292 4.76190476189936e-03 250 293 2.16840434497101e-18 251 251 3.33333333333442e-02 251 207 -4.16666666666397e-03 251 208 0.00000000000000e+00 251 209 -1.30952380952435e-02 251 248 0.00000000000000e+00 251 249 4.76190476189937e-03 251 250 -1.73472347597681e-18 251 206 -4.46428571428572e-03 251 290 4.46428571428572e-03 251 291 -4.16666666666397e-03 251 292 8.67361737988404e-19 251 293 -1.30952380952435e-02 252 252 2.30769230769306e+00 252 211 5.55111512312578e-17 252 212 -2.88461538461351e-01 252 213 2.40384615384615e-01 252 210 1.92307692307318e-01 252 253 -8.32667268468867e-17 252 254 -7.69230769231143e-01 252 255 5.55111512312578e-17 252 294 1.92307692307319e-01 252 295 -4.16333634234434e-17 252 296 -2.88461538461352e-01 252 297 -2.40384615384615e-01 253 253 2.30769230769306e+00 253 211 -7.69230769231144e-01 253 212 2.40384615384615e-01 253 213 -2.88461538461352e-01 253 252 -8.32667268468867e-17 253 210 6.93889390390723e-18 253 254 2.08166817117217e-17 253 255 1.92307692307318e-01 253 294 -6.93889390390723e-17 253 295 -7.69230769231143e-01 253 296 -2.40384615384615e-01 253 297 -2.88461538461351e-01 254 254 2.30769230769306e+00 254 211 -2.40384615384615e-01 254 212 1.92307692307318e-01 254 213 5.55111512312578e-17 254 214 -2.88461538461351e-01 254 215 2.40384615384615e-01 254 252 -7.69230769231143e-01 254 253 1.38777878078145e-17 254 210 -2.88461538461351e-01 254 255 -8.32667268468867e-17 254 256 -7.69230769231143e-01 254 257 5.55111512312578e-17 254 294 -2.88461538461352e-01 254 295 2.40384615384615e-01 254 296 1.92307692307319e-01 254 297 -4.16333634234434e-17 254 298 -2.88461538461352e-01 254 299 -2.40384615384615e-01 255 255 2.30769230769306e+00 255 211 -2.88461538461352e-01 255 212 6.93889390390723e-18 255 213 -7.69230769231144e-01 255 214 2.40384615384615e-01 255 215 -2.88461538461352e-01 255 252 6.93889390390723e-17 255 253 1.92307692307318e-01 255 254 -8.32667268468867e-17 255 210 -2.40384615384615e-01 255 256 2.08166817117217e-17 255 257 1.92307692307318e-01 255 294 2.40384615384615e-01 255 295 -2.88461538461351e-01 255 296 -6.93889390390723e-17 255 297 -7.69230769231143e-01 255 298 -2.40384615384615e-01 255 299 -2.88461538461351e-01 256 256 2.30769230769306e+00 256 213 -2.40384615384615e-01 256 214 1.92307692307318e-01 256 215 4.85722573273506e-17 256 216 -2.88461538461351e-01 256 217 2.40384615384615e-01 256 254 -7.69230769231143e-01 256 255 1.38777878078145e-17 256 212 -2.88461538461351e-01 256 257 -8.32667268468867e-17 256 258 -7.69230769231143e-01 256 259 2.77555756156289e-17 256 296 -2.88461538461352e-01 256 297 2.40384615384615e-01 256 298 1.92307692307319e-01 256 299 -5.55111512312578e-17 256 300 -2.88461538461352e-01 256 301 -2.40384615384615e-01 257 257 2.30769230769306e+00 257 213 -2.88461538461352e-01 257 214 3.46944695195361e-17 257 215 -7.69230769231144e-01 257 216 2.40384615384615e-01 257 217 -2.88461538461352e-01 257 254 6.93889390390723e-17 257 255 1.92307692307318e-01 257 256 -8.32667268468867e-17 257 212 -2.40384615384615e-01 257 258 -1.38777878078145e-17 257 259 1.92307692307318e-01 257 296 2.40384615384615e-01 257 297 -2.88461538461351e-01 257 298 -4.85722573273506e-17 257 299 -7.69230769231143e-01 257 300 -2.40384615384615e-01 257 301 -2.88461538461351e-01 258 258 2.30769230769306e+00 258 215 -2.40384615384615e-01 258 216 1.92307692307318e-01 258 217 4.16333634234434e-17 258 218 -2.88461538461351e-01 258 219 2.40384615384615e-01 258 256 -7.69230769231143e-01 258 257 1.38777878078145e-17 258 214 -2.88461538461351e-01 258 259 -2.77555756156289e-17 258 260 -7.69230769231143e-01 258 261 1.38777878078145e-17 258 298 -2.88461538461351e-01 258 299 2.40384615384615e-01 258 300 1.92307692307319e-01 258 301 -6.93889390390723e-17 258 302 -2.88461538461352e-01 258 303 -2.40384615384615e-01 259 259 2.30769230769306e+00 259 215 -2.88461538461352e-01 259 216 5.55111512312578e-17 259 217 -7.69230769231144e-01 259 218 2.40384615384615e-01 259 219 -2.88461538461352e-01 259 256 2.08166817117217e-17 259 257 1.92307692307318e-01 259 258 -5.55111512312578e-17 259 214 -2.40384615384615e-01 259 260 -1.38777878078145e-17 259 261 1.92307692307319e-01 259 298 2.40384615384615e-01 259 299 -2.88461538461351e-01 259 300 -4.85722573273506e-17 259 301 -7.69230769231143e-01 259 302 -2.40384615384615e-01 259 303 -2.88461538461351e-01 260 260 2.30769230769306e+00 260 217 -2.40384615384615e-01 260 218 1.92307692307318e-01 260 219 0.00000000000000e+00 260 220 -2.88461538461352e-01 260 221 2.40384615384615e-01 260 258 -7.69230769231143e-01 260 259 -1.38777878078145e-17 260 216 -2.88461538461351e-01 260 261 8.32667268468867e-17 260 262 -7.69230769231144e-01 260 263 2.77555756156289e-17 260 300 -2.88461538461351e-01 260 301 2.40384615384615e-01 260 302 1.92307692307319e-01 260 303 -5.55111512312578e-17 260 304 -2.88461538461352e-01 260 305 -2.40384615384615e-01 261 261 2.30769230769306e+00 261 217 -2.88461538461352e-01 261 218 7.63278329429795e-17 261 219 -7.69230769231144e-01 261 220 2.40384615384615e-01 261 221 -2.88461538461351e-01 261 258 2.08166817117217e-17 261 259 1.92307692307319e-01 261 260 2.77555756156289e-17 261 216 -2.40384615384615e-01 261 262 -2.08166817117217e-17 261 263 1.92307692307318e-01 261 300 2.40384615384615e-01 261 301 -2.88461538461351e-01 261 302 -4.16333634234434e-17 261 303 -7.69230769231142e-01 261 304 -2.40384615384615e-01 261 305 -2.88461538461351e-01 262 262 2.30769230769306e+00 262 219 -2.40384615384615e-01 262 220 1.92307692307318e-01 262 221 6.93889390390723e-17 262 222 -2.88461538461351e-01 262 223 2.40384615384615e-01 262 260 -7.69230769231144e-01 262 261 2.08166817117217e-17 262 218 -2.88461538461351e-01 262 263 -5.55111512312578e-17 262 264 -7.69230769231142e-01 262 265 3.46944695195361e-17 262 302 -2.88461538461352e-01 262 303 2.40384615384615e-01 262 304 1.92307692307319e-01 262 305 -5.55111512312578e-17 262 306 -2.88461538461351e-01 262 307 -2.40384615384615e-01 263 263 2.30769230769306e+00 263 219 -2.88461538461351e-01 263 220 4.85722573273506e-17 263 221 -7.69230769231144e-01 263 222 2.40384615384615e-01 263 223 -2.88461538461352e-01 263 260 0.00000000000000e+00 263 261 1.92307692307318e-01 263 262 -2.77555756156289e-17 263 218 -2.40384615384615e-01 263 264 3.46944695195361e-17 263 265 1.92307692307319e-01 263 302 2.40384615384615e-01 263 303 -2.88461538461351e-01 263 304 -9.02056207507940e-17 263 305 -7.69230769231143e-01 263 306 -2.40384615384615e-01 263 307 -2.88461538461352e-01 264 264 2.30769230769306e+00 264 221 -2.40384615384615e-01 264 222 1.92307692307318e-01 264 223 4.85722573273506e-17 264 224 -2.88461538461352e-01 264 225 2.40384615384615e-01 264 262 -7.69230769231142e-01 264 263 3.46944695195361e-17 264 220 -2.88461538461351e-01 264 265 -2.77555756156289e-17 264 266 -7.69230769231144e-01 264 267 2.08166817117217e-17 264 304 -2.88461538461351e-01 264 305 2.40384615384615e-01 264 306 1.92307692307319e-01 264 307 -5.55111512312578e-17 264 308 -2.88461538461352e-01 264 309 -2.40384615384615e-01 265 265 2.30769230769306e+00 265 221 -2.88461538461352e-01 265 222 8.32667268468867e-17 265 223 -7.69230769231143e-01 265 224 2.40384615384615e-01 265 225 -2.88461538461351e-01 265 262 2.08166817117217e-17 265 263 1.92307692307319e-01 265 264 -2.77555756156289e-17 265 220 -2.40384615384615e-01 265 266 -1.38777878078145e-17 265 267 1.92307692307318e-01 265 304 2.40384615384615e-01 265 305 -2.88461538461351e-01 265 306 -2.77555756156289e-17 265 307 -7.69230769231143e-01 265 308 -2.40384615384615e-01 265 309 -2.88461538461351e-01 266 266 1.15384717236505e+00 266 223 -2.40384615384615e-01 266 224 9.61538924499557e-02 266 225 -4.80769577991453e-02 266 226 -2.54629629629465e-07 266 227 1.73611111111111e-07 266 264 -7.69230769231144e-01 266 265 6.93889390390723e-18 266 222 -2.88461538461352e-01 266 267 1.27404343178887e-17 266 268 -6.01851851852181e-07 266 269 0.00000000000000e+00 266 306 -2.88461538461352e-01 266 307 2.40384615384615e-01 266 308 9.61538924499560e-02 266 309 4.80769577991453e-02 266 310 -2.54629629629465e-07 266 311 -1.73611111111111e-07 267 267 1.15384717236505e+00 267 223 -2.88461538461351e-01 267 224 4.80769577991453e-02 267 225 -3.84615685541497e-01 267 226 1.73611111111111e-07 267 227 -2.54629629629465e-07 267 264 1.38777878078145e-17 267 265 1.92307692307318e-01 267 266 4.04960364032973e-17 267 222 -2.40384615384615e-01 267 268 -6.61744490042422e-24 267 269 9.25925925922632e-08 267 306 2.40384615384615e-01 267 307 -2.88461538461351e-01 267 308 -4.80769577991453e-02 267 309 -3.84615685541497e-01 267 310 -1.73611111111111e-07 267 311 -2.54629629629465e-07 268 268 2.03703703703770e-06 268 225 -1.73611111111111e-07 268 226 9.25925925922622e-08 268 227 4.63221143029695e-23 268 228 -2.54629629629465e-07 268 229 1.73611111111111e-07 268 266 -6.01851851852181e-07 268 267 1.32348898008484e-23 268 224 -2.54629629629464e-07 268 269 0.00000000000000e+00 268 270 -6.01851851852183e-07 268 271 1.32348898008484e-23 268 308 -2.54629629629465e-07 268 309 1.73611111111111e-07 268 310 9.25925925922629e-08 268 311 -2.64697796016969e-23 268 312 -2.54629629629465e-07 268 313 -1.73611111111111e-07 269 269 2.03703703703770e-06 269 225 -2.54629629629465e-07 269 226 3.97046694025453e-23 269 227 -6.01851851852183e-07 269 228 1.73611111111111e-07 269 229 -2.54629629629465e-07 269 266 1.32348898008484e-23 269 267 9.25925925922633e-08 269 268 2.64697796016969e-23 269 224 -1.73611111111111e-07 269 270 6.61744490042422e-24 269 271 9.25925925922620e-08 269 308 1.73611111111111e-07 269 309 -2.54629629629465e-07 269 310 -4.63221143029695e-23 269 311 -6.01851851852182e-07 269 312 -1.73611111111111e-07 269 313 -2.54629629629464e-07 270 270 2.03703703703770e-06 270 227 -1.73611111111111e-07 270 228 9.25925925922628e-08 270 229 3.97046694025453e-23 270 230 -2.54629629629465e-07 270 231 1.73611111111111e-07 270 268 -6.01851851852183e-07 270 269 6.61744490042422e-24 270 226 -2.54629629629465e-07 270 271 0.00000000000000e+00 270 272 -6.01851851852183e-07 270 273 0.00000000000000e+00 270 310 -2.54629629629465e-07 270 311 1.73611111111111e-07 270 312 9.25925925922635e-08 270 313 -3.30872245021211e-23 270 314 -2.54629629629465e-07 270 315 -1.73611111111111e-07 271 271 2.03703703703770e-06 271 227 -2.54629629629465e-07 271 228 2.64697796016969e-23 271 229 -6.01851851852182e-07 271 230 1.73611111111111e-07 271 231 -2.54629629629465e-07 271 268 1.32348898008484e-23 271 269 9.25925925922620e-08 271 270 2.64697796016969e-23 271 226 -1.73611111111111e-07 271 272 -6.61744490042422e-24 271 273 9.25925925922621e-08 271 310 1.73611111111111e-07 271 311 -2.54629629629464e-07 271 312 -4.63221143029695e-23 271 313 -6.01851851852181e-07 271 314 -1.73611111111111e-07 271 315 -2.54629629629464e-07 272 272 2.03703703703770e-06 272 229 -1.73611111111111e-07 272 230 9.25925925922624e-08 272 231 5.29395592033938e-23 272 232 -2.54629629629465e-07 272 233 1.73611111111111e-07 272 270 -6.01851851852183e-07 272 271 1.98523347012727e-23 272 228 -2.54629629629465e-07 272 273 -2.64697796016969e-23 272 274 -6.01851851852182e-07 272 275 2.64697796016969e-23 272 312 -2.54629629629465e-07 272 313 1.73611111111111e-07 272 314 9.25925925922632e-08 272 315 -4.63221143029695e-23 272 316 -2.54629629629465e-07 272 317 -1.73611111111111e-07 273 273 2.03703703703770e-06 273 229 -2.54629629629465e-07 273 230 3.97046694025453e-23 273 231 -6.01851851852182e-07 273 232 1.73611111111111e-07 273 233 -2.54629629629465e-07 273 270 1.32348898008484e-23 273 271 9.25925925922620e-08 273 272 0.00000000000000e+00 273 228 -1.73611111111111e-07 273 274 6.61744490042422e-24 273 275 9.25925925922626e-08 273 312 1.73611111111111e-07 273 313 -2.54629629629464e-07 273 314 -4.63221143029695e-23 273 315 -6.01851851852181e-07 273 316 -1.73611111111111e-07 273 317 -2.54629629629465e-07 274 274 2.03703703703770e-06 274 231 -1.73611111111111e-07 274 232 9.25925925922614e-08 274 233 1.32348898008484e-23 274 234 -2.54629629629464e-07 274 235 1.73611111111111e-07 274 272 -6.01851851852182e-07 274 273 2.64697796016969e-23 274 230 -2.54629629629465e-07 274 275 0.00000000000000e+00 274 276 -6.01851851852180e-07 274 277 0.00000000000000e+00 274 314 -2.54629629629465e-07 274 315 1.73611111111111e-07 274 316 9.25925925922621e-08 274 317 -4.63221143029695e-23 274 318 -2.54629629629464e-07 274 319 -1.73611111111111e-07 275 275 2.03703703703770e-06 275 231 -2.54629629629465e-07 275 232 5.29395592033938e-23 275 233 -6.01851851852184e-07 275 234 1.73611111111111e-07 275 235 -2.54629629629465e-07 275 272 2.64697796016969e-23 275 273 9.25925925922626e-08 275 274 0.00000000000000e+00 275 230 -1.73611111111111e-07 275 276 -6.61744490042422e-24 275 277 9.25925925922641e-08 275 314 1.73611111111111e-07 275 315 -2.54629629629465e-07 275 316 -6.61744490042422e-23 275 317 -6.01851851852183e-07 275 318 -1.73611111111111e-07 275 319 -2.54629629629465e-07 276 276 2.03703703703770e-06 276 233 -1.73611111111111e-07 276 234 9.25925925922614e-08 276 235 5.29395592033938e-23 276 236 -2.54629629629465e-07 276 237 1.73611111111111e-07 276 274 -6.01851851852180e-07 276 275 1.32348898008484e-23 276 232 -2.54629629629464e-07 276 277 -2.64697796016969e-23 276 278 -6.01851851852182e-07 276 279 1.32348898008484e-23 276 316 -2.54629629629464e-07 276 317 1.73611111111111e-07 276 318 9.25925925922621e-08 276 319 -6.61744490042422e-23 276 320 -2.54629629629465e-07 276 321 -1.73611111111111e-07 277 277 2.03703703703770e-06 277 233 -2.54629629629465e-07 277 234 3.30872245021211e-23 277 235 -6.01851851852184e-07 277 236 1.73611111111111e-07 277 237 -2.54629629629465e-07 277 274 6.61744490042422e-24 277 275 9.25925925922641e-08 277 276 0.00000000000000e+00 277 232 -1.73611111111111e-07 277 278 -1.32348898008484e-23 277 279 9.25925925922627e-08 277 316 1.73611111111111e-07 277 317 -2.54629629629465e-07 277 318 -1.98523347012727e-23 277 319 -6.01851851852183e-07 277 320 -1.73611111111111e-07 277 321 -2.54629629629465e-07 278 278 2.03703703703770e-06 278 235 -1.73611111111111e-07 278 236 9.25925925922624e-08 278 237 3.97046694025453e-23 278 238 -2.54629629629465e-07 278 239 1.73611111111111e-07 278 276 -6.01851851852182e-07 278 277 6.61744490042422e-24 278 234 -2.54629629629464e-07 278 279 -2.64697796016969e-23 278 280 -6.01851851852183e-07 278 281 0.00000000000000e+00 278 318 -2.54629629629465e-07 278 319 1.73611111111111e-07 278 320 9.25925925922631e-08 278 321 -2.64697796016969e-23 278 322 -2.54629629629465e-07 278 323 -1.73611111111111e-07 279 279 2.03703703703770e-06 279 235 -2.54629629629465e-07 279 236 3.97046694025453e-23 279 237 -6.01851851852182e-07 279 238 1.73611111111111e-07 279 239 -2.54629629629465e-07 279 276 0.00000000000000e+00 279 277 9.25925925922627e-08 279 278 0.00000000000000e+00 279 234 -1.73611111111111e-07 279 280 -6.61744490042422e-24 279 281 9.25925925922621e-08 279 318 1.73611111111111e-07 279 319 -2.54629629629465e-07 279 320 -4.63221143029695e-23 279 321 -6.01851851852181e-07 279 322 -1.73611111111111e-07 279 323 -2.54629629629464e-07 280 280 2.03703703703770e-06 280 237 -1.73611111111111e-07 280 238 9.25925925922628e-08 280 239 3.97046694025453e-23 280 240 -2.54629629629465e-07 280 241 1.73611111111111e-07 280 278 -6.01851851852183e-07 280 279 1.98523347012727e-23 280 236 -2.54629629629465e-07 280 281 -2.64697796016969e-23 280 282 -6.01851851852183e-07 280 283 2.64697796016969e-23 280 320 -2.54629629629465e-07 280 321 1.73611111111111e-07 280 322 9.25925925922635e-08 280 323 -5.95570041038180e-23 280 324 -2.54629629629465e-07 280 325 -1.73611111111111e-07 281 281 2.03703703703770e-06 281 237 -2.54629629629465e-07 281 238 3.30872245021211e-23 281 239 -6.01851851852182e-07 281 240 1.73611111111111e-07 281 241 -2.54629629629465e-07 281 278 1.32348898008484e-23 281 279 9.25925925922620e-08 281 280 0.00000000000000e+00 281 236 -1.73611111111111e-07 281 282 1.98523347012727e-23 281 283 9.25925925922618e-08 281 320 1.73611111111111e-07 281 321 -2.54629629629464e-07 281 322 -4.63221143029695e-23 281 323 -6.01851851852181e-07 281 324 -1.73611111111111e-07 281 325 -2.54629629629464e-07 282 282 1.66676851851906e-02 282 239 -1.73611111111111e-07 282 240 2.38099867724597e-03 282 241 2.67860615079365e-03 282 242 -4.16666666666396e-03 282 243 4.46428571428572e-03 282 280 -6.01851851852183e-07 282 281 1.98523347012727e-23 282 238 -2.54629629629465e-07 282 283 -8.67361737988404e-19 282 284 -1.30952380952435e-02 282 285 4.33680868994202e-19 282 322 -2.54629629629465e-07 282 323 1.73611111111111e-07 282 324 2.38099867724598e-03 282 325 -2.67860615079365e-03 282 326 -4.16666666666397e-03 282 327 -4.46428571428572e-03 283 283 1.66676851851906e-02 283 239 -2.54629629629465e-07 283 240 -2.67860615079365e-03 283 241 -6.54791997354769e-03 283 242 4.46428571428572e-03 283 243 -4.16666666666397e-03 283 280 0.00000000000000e+00 283 281 9.25925925922619e-08 283 282 -8.67361737988404e-19 283 238 -1.73611111111111e-07 283 284 0.00000000000000e+00 283 285 4.76190476189937e-03 283 322 1.73611111111111e-07 283 323 -2.54629629629464e-07 283 324 2.67860615079365e-03 283 325 -6.54791997354768e-03 283 326 -4.46428571428572e-03 283 327 -4.16666666666397e-03 284 284 3.33333333333441e-02 284 241 -4.46428571428572e-03 284 242 4.76190476189936e-03 284 243 4.33680868994202e-19 284 244 -4.16666666666397e-03 284 245 4.46428571428572e-03 284 282 -1.30952380952435e-02 284 283 0.00000000000000e+00 284 240 -4.16666666666396e-03 284 285 -8.67361737988404e-19 284 286 -1.30952380952435e-02 284 287 -4.33680868994202e-19 284 324 -4.16666666666397e-03 284 325 4.46428571428572e-03 284 326 4.76190476189936e-03 284 327 0.00000000000000e+00 284 328 -4.16666666666397e-03 284 329 -4.46428571428572e-03 285 285 3.33333333333442e-02 285 241 -4.16666666666397e-03 285 242 8.67361737988404e-19 285 243 -1.30952380952435e-02 285 244 4.46428571428572e-03 285 245 -4.16666666666397e-03 285 282 0.00000000000000e+00 285 283 4.76190476189937e-03 285 284 0.00000000000000e+00 285 240 -4.46428571428572e-03 285 286 0.00000000000000e+00 285 287 4.76190476189936e-03 285 324 4.46428571428571e-03 285 325 -4.16666666666397e-03 285 326 -1.73472347597681e-18 285 327 -1.30952380952435e-02 285 328 -4.46428571428572e-03 285 329 -4.16666666666396e-03 286 286 3.33333333333442e-02 286 243 -4.46428571428572e-03 286 244 4.76190476189938e-03 286 245 0.00000000000000e+00 286 246 -4.16666666666398e-03 286 247 4.46428571428572e-03 286 284 -1.30952380952435e-02 286 285 0.00000000000000e+00 286 242 -4.16666666666397e-03 286 287 0.00000000000000e+00 286 288 -1.30952380952436e-02 286 289 8.67361737988404e-19 286 326 -4.16666666666397e-03 286 327 4.46428571428571e-03 286 328 4.76190476189939e-03 286 329 -8.67361737988404e-19 286 330 -4.16666666666398e-03 286 331 -4.46428571428572e-03 287 287 3.33333333333441e-02 287 243 -4.16666666666397e-03 287 244 8.67361737988404e-19 287 245 -1.30952380952435e-02 287 246 4.46428571428572e-03 287 247 -4.16666666666396e-03 287 284 0.00000000000000e+00 287 285 4.76190476189936e-03 287 286 -8.67361737988404e-19 287 242 -4.46428571428572e-03 287 288 -4.33680868994202e-19 287 289 4.76190476189933e-03 287 326 4.46428571428572e-03 287 327 -4.16666666666396e-03 287 328 -1.30104260698261e-18 287 329 -1.30952380952435e-02 287 330 -4.46428571428572e-03 287 331 -4.16666666666396e-03 288 288 3.33333333333442e-02 288 245 -4.46428571428572e-03 288 246 4.76190476189936e-03 288 247 1.30104260698261e-18 288 248 -4.16666666666396e-03 288 249 4.46428571428572e-03 288 286 -1.30952380952436e-02 288 287 -4.33680868994202e-19 288 244 -4.16666666666397e-03 288 289 -1.73472347597681e-18 288 290 -1.30952380952435e-02 288 291 4.33680868994202e-19 288 328 -4.16666666666398e-03 288 329 4.46428571428571e-03 288 330 4.76190476189937e-03 288 331 -4.33680868994202e-19 288 332 -4.16666666666397e-03 288 333 -4.46428571428572e-03 289 289 3.33333333333441e-02 289 245 -4.16666666666396e-03 289 246 1.30104260698261e-18 289 247 -1.30952380952435e-02 289 248 4.46428571428572e-03 289 249 -4.16666666666397e-03 289 286 8.67361737988404e-19 289 287 4.76190476189933e-03 289 288 -8.67361737988404e-19 289 244 -4.46428571428572e-03 289 290 0.00000000000000e+00 289 291 4.76190476189938e-03 289 328 4.46428571428572e-03 289 329 -4.16666666666396e-03 289 330 -1.73472347597681e-18 289 331 -1.30952380952435e-02 289 332 -4.46428571428572e-03 289 333 -4.16666666666397e-03 290 290 3.33333333333441e-02 290 247 -4.46428571428572e-03 290 248 4.76190476189934e-03 290 249 4.33680868994202e-19 290 250 -4.16666666666396e-03 290 251 4.46428571428572e-03 290 288 -1.30952380952435e-02 290 289 0.00000000000000e+00 290 246 -4.16666666666396e-03 290 291 -1.73472347597681e-18 290 292 -1.30952380952435e-02 290 293 4.33680868994202e-19 290 330 -4.16666666666396e-03 290 331 4.46428571428572e-03 290 332 4.76190476189936e-03 290 333 -8.67361737988404e-19 290 334 -4.16666666666397e-03 290 335 -4.46428571428572e-03 291 291 3.33333333333442e-02 291 247 -4.16666666666397e-03 291 248 1.30104260698261e-18 291 249 -1.30952380952435e-02 291 250 4.46428571428572e-03 291 251 -4.16666666666397e-03 291 288 0.00000000000000e+00 291 289 4.76190476189938e-03 291 290 -1.73472347597681e-18 291 246 -4.46428571428572e-03 291 292 0.00000000000000e+00 291 293 4.76190476189937e-03 291 330 4.46428571428571e-03 291 331 -4.16666666666397e-03 291 332 -1.73472347597681e-18 291 333 -1.30952380952435e-02 291 334 -4.46428571428572e-03 291 335 -4.16666666666397e-03 292 292 3.33333333333442e-02 292 249 -4.46428571428572e-03 292 250 4.76190476189936e-03 292 251 4.33680868994202e-19 292 290 -1.30952380952435e-02 292 291 0.00000000000000e+00 292 248 -4.16666666666396e-03 292 293 0.00000000000000e+00 292 332 -4.16666666666397e-03 292 333 4.46428571428572e-03 292 334 4.76190476189937e-03 292 335 0.00000000000000e+00 293 293 3.33333333333441e-02 293 249 -4.16666666666397e-03 293 250 8.67361737988404e-19 293 251 -1.30952380952435e-02 293 290 0.00000000000000e+00 293 291 4.76190476189937e-03 293 292 -8.67361737988404e-19 293 248 -4.46428571428572e-03 293 332 4.46428571428571e-03 293 333 -4.16666666666397e-03 293 334 -8.67361737988404e-19 293 335 -1.30952380952435e-02 294 294 2.30769230769306e+00 294 253 -6.93889390390723e-17 294 254 -2.88461538461352e-01 294 255 2.40384615384615e-01 294 252 1.92307692307319e-01 294 295 -5.55111512312578e-17 294 296 -7.69230769231144e-01 294 297 -1.04083408558608e-16 294 336 1.92307692307318e-01 294 337 1.73472347597681e-16 294 338 -2.88461538461351e-01 294 339 -2.40384615384615e-01 295 295 2.30769230769305e+00 295 253 -7.69230769231143e-01 295 254 2.40384615384615e-01 295 255 -2.88461538461351e-01 295 294 -5.55111512312578e-17 295 252 -4.16333634234434e-17 295 296 -2.77555756156289e-17 295 297 1.92307692307318e-01 295 336 1.87350135405495e-16 295 337 -7.69230769231143e-01 295 338 -2.40384615384615e-01 295 339 -2.88461538461351e-01 296 296 2.30769230769306e+00 296 253 -2.40384615384615e-01 296 254 1.92307692307319e-01 296 255 -6.93889390390723e-17 296 256 -2.88461538461352e-01 296 257 2.40384615384615e-01 296 294 -7.69230769231144e-01 296 295 -5.55111512312578e-17 296 252 -2.88461538461352e-01 296 297 -5.55111512312578e-17 296 298 -7.69230769231144e-01 296 299 -1.04083408558608e-16 296 336 -2.88461538461352e-01 296 337 2.40384615384615e-01 296 338 1.92307692307318e-01 296 339 1.73472347597681e-16 296 340 -2.88461538461351e-01 296 341 -2.40384615384615e-01 297 297 2.30769230769305e+00 297 253 -2.88461538461351e-01 297 254 -4.16333634234434e-17 297 255 -7.69230769231143e-01 297 256 2.40384615384615e-01 297 257 -2.88461538461351e-01 297 294 -1.04083408558608e-16 297 295 1.92307692307318e-01 297 296 -5.55111512312578e-17 297 252 -2.40384615384615e-01 297 298 -2.77555756156289e-17 297 299 1.92307692307318e-01 297 336 2.40384615384615e-01 297 337 -2.88461538461351e-01 297 338 1.87350135405495e-16 297 339 -7.69230769231143e-01 297 340 -2.40384615384615e-01 297 341 -2.88461538461351e-01 298 298 2.30769230769306e+00 298 255 -2.40384615384615e-01 298 256 1.92307692307319e-01 298 257 -5.55111512312578e-17 298 258 -2.88461538461352e-01 298 259 2.40384615384615e-01 298 296 -7.69230769231144e-01 298 297 -5.55111512312578e-17 298 254 -2.88461538461352e-01 298 299 0.00000000000000e+00 298 300 -7.69230769231143e-01 298 301 -6.24500451351651e-17 298 338 -2.88461538461352e-01 298 339 2.40384615384615e-01 298 340 1.92307692307318e-01 298 341 1.73472347597681e-16 298 342 -2.88461538461351e-01 298 343 -2.40384615384615e-01 299 299 2.30769230769305e+00 299 255 -2.88461538461351e-01 299 256 -4.16333634234434e-17 299 257 -7.69230769231143e-01 299 258 2.40384615384615e-01 299 259 -2.88461538461351e-01 299 296 -1.04083408558608e-16 299 297 1.92307692307318e-01 299 298 0.00000000000000e+00 299 254 -2.40384615384615e-01 299 300 -2.77555756156289e-17 299 301 1.92307692307318e-01 299 338 2.40384615384615e-01 299 339 -2.88461538461351e-01 299 340 2.01227923213310e-16 299 341 -7.69230769231143e-01 299 342 -2.40384615384615e-01 299 343 -2.88461538461351e-01 300 300 2.30769230769306e+00 300 257 -2.40384615384615e-01 300 258 1.92307692307319e-01 300 259 -5.55111512312578e-17 300 260 -2.88461538461351e-01 300 261 2.40384615384615e-01 300 298 -7.69230769231143e-01 300 299 -6.93889390390723e-18 300 256 -2.88461538461352e-01 300 301 -1.11022302462516e-16 300 302 -7.69230769231143e-01 300 303 -6.24500451351651e-17 300 340 -2.88461538461352e-01 300 341 2.40384615384615e-01 300 342 1.92307692307318e-01 300 343 1.66533453693773e-16 300 344 -2.88461538461351e-01 300 345 -2.40384615384615e-01 301 301 2.30769230769306e+00 301 257 -2.88461538461351e-01 301 258 -6.24500451351651e-17 301 259 -7.69230769231143e-01 301 260 2.40384615384615e-01 301 261 -2.88461538461351e-01 301 298 -6.24500451351651e-17 301 299 1.92307692307318e-01 301 300 -1.11022302462516e-16 301 256 -2.40384615384615e-01 301 302 -4.16333634234434e-17 301 303 1.92307692307318e-01 301 340 2.40384615384615e-01 301 341 -2.88461538461352e-01 301 342 2.08166817117217e-16 301 343 -7.69230769231144e-01 301 344 -2.40384615384615e-01 301 345 -2.88461538461352e-01 302 302 2.30769230769306e+00 302 259 -2.40384615384615e-01 302 260 1.92307692307319e-01 302 261 -8.32667268468867e-17 302 262 -2.88461538461352e-01 302 263 2.40384615384615e-01 302 300 -7.69230769231143e-01 302 301 -3.46944695195361e-17 302 258 -2.88461538461352e-01 302 303 -5.55111512312578e-17 302 304 -7.69230769231144e-01 302 305 -6.93889390390723e-17 302 342 -2.88461538461352e-01 302 343 2.40384615384615e-01 302 344 1.92307692307318e-01 302 345 2.15105711021124e-16 302 346 -2.88461538461351e-01 302 347 -2.40384615384615e-01 303 303 2.30769230769306e+00 303 259 -2.88461538461351e-01 303 260 -6.93889390390723e-17 303 261 -7.69230769231142e-01 303 262 2.40384615384615e-01 303 263 -2.88461538461351e-01 303 300 -7.63278329429795e-17 303 301 1.92307692307318e-01 303 302 -8.32667268468867e-17 303 258 -2.40384615384615e-01 303 304 -6.93889390390723e-18 303 305 1.92307692307318e-01 303 342 2.40384615384615e-01 303 343 -2.88461538461352e-01 303 344 1.87350135405495e-16 303 345 -7.69230769231143e-01 303 346 -2.40384615384615e-01 303 347 -2.88461538461351e-01 304 304 2.30769230769306e+00 304 261 -2.40384615384615e-01 304 262 1.92307692307319e-01 304 263 -4.85722573273506e-17 304 264 -2.88461538461351e-01 304 265 2.40384615384615e-01 304 302 -7.69230769231144e-01 304 303 -2.08166817117217e-17 304 260 -2.88461538461352e-01 304 305 -5.55111512312578e-17 304 306 -7.69230769231143e-01 304 307 -5.55111512312578e-17 304 344 -2.88461538461352e-01 304 345 2.40384615384615e-01 304 346 1.92307692307318e-01 304 347 2.22044604925031e-16 304 348 -2.88461538461351e-01 304 349 -2.40384615384615e-01 305 305 2.30769230769306e+00 305 261 -2.88461538461351e-01 305 262 -9.02056207507940e-17 305 263 -7.69230769231143e-01 305 264 2.40384615384615e-01 305 265 -2.88461538461351e-01 305 302 -5.55111512312578e-17 305 303 1.92307692307318e-01 305 304 -5.55111512312578e-17 305 260 -2.40384615384615e-01 305 306 -4.16333634234434e-17 305 307 1.92307692307319e-01 305 344 2.40384615384615e-01 305 345 -2.88461538461351e-01 305 346 1.66533453693773e-16 305 347 -7.69230769231144e-01 305 348 -2.40384615384615e-01 305 349 -2.88461538461352e-01 306 306 2.30769230769306e+00 306 263 -2.40384615384615e-01 306 264 1.92307692307319e-01 306 265 -4.85722573273506e-17 306 266 -2.88461538461352e-01 306 267 2.40384615384615e-01 306 304 -7.69230769231143e-01 306 305 -1.38777878078145e-17 306 262 -2.88461538461351e-01 306 307 -1.38777878078145e-16 306 308 -7.69230769231144e-01 306 309 -6.93889390390723e-17 306 346 -2.88461538461351e-01 306 347 2.40384615384615e-01 306 348 1.92307692307318e-01 306 349 2.01227923213310e-16 306 350 -2.88461538461351e-01 306 351 -2.40384615384615e-01 307 307 2.30769230769306e+00 307 263 -2.88461538461352e-01 307 264 -6.93889390390723e-17 307 265 -7.69230769231143e-01 307 266 2.40384615384615e-01 307 267 -2.88461538461351e-01 307 304 -3.46944695195361e-17 307 305 1.92307692307319e-01 307 306 -1.11022302462516e-16 307 262 -2.40384615384615e-01 307 308 2.08166817117217e-17 307 309 1.92307692307317e-01 307 346 2.40384615384615e-01 307 347 -2.88461538461352e-01 307 348 1.73472347597681e-16 307 349 -7.69230769231143e-01 307 350 -2.40384615384615e-01 307 351 -2.88461538461351e-01 308 308 1.15384717236505e+00 308 265 -2.40384615384615e-01 308 266 9.61538924499560e-02 308 267 -4.80769577991453e-02 308 268 -2.54629629629465e-07 308 269 1.73611111111111e-07 308 306 -7.69230769231144e-01 308 307 -2.08166817117217e-17 308 264 -2.88461538461352e-01 308 309 -1.50152207070790e-17 308 310 -6.01851851852181e-07 308 311 -4.63221143029695e-23 308 348 -2.88461538461352e-01 308 349 2.40384615384615e-01 308 350 9.61538924499560e-02 308 351 4.80769577991454e-02 308 352 -2.54629629629464e-07 308 353 -1.73611111111111e-07 309 309 1.15384717236505e+00 309 265 -2.88461538461351e-01 309 266 4.80769577991453e-02 309 267 -3.84615685541497e-01 309 268 1.73611111111111e-07 309 269 -2.54629629629465e-07 309 306 -6.24500451351651e-17 309 307 1.92307692307317e-01 309 308 -1.50152207070790e-17 309 264 -2.40384615384615e-01 309 310 -1.32348898008484e-23 309 311 9.25925925922632e-08 309 348 2.40384615384615e-01 309 349 -2.88461538461351e-01 309 350 -4.80769577991452e-02 309 351 -3.84615685541497e-01 309 352 -1.73611111111111e-07 309 353 -2.54629629629465e-07 310 310 2.03703703703770e-06 310 267 -1.73611111111111e-07 310 268 9.25925925922628e-08 310 269 -3.97046694025453e-23 310 270 -2.54629629629465e-07 310 271 1.73611111111111e-07 310 308 -6.01851851852181e-07 310 309 -1.98523347012727e-23 310 266 -2.54629629629465e-07 310 311 -1.32348898008484e-22 310 312 -6.01851851852183e-07 310 313 -1.98523347012727e-23 310 350 -2.54629629629465e-07 310 351 1.73611111111111e-07 310 352 9.25925925922624e-08 310 353 1.65436122510606e-22 310 354 -2.54629629629465e-07 310 355 -1.73611111111111e-07 311 311 2.03703703703770e-06 311 267 -2.54629629629465e-07 311 268 -2.64697796016969e-23 311 269 -6.01851851852182e-07 311 270 1.73611111111111e-07 311 271 -2.54629629629464e-07 311 308 -3.30872245021211e-23 311 309 9.25925925922631e-08 311 310 -1.32348898008484e-22 311 266 -1.73611111111111e-07 311 312 -1.98523347012727e-23 311 313 9.25925925922619e-08 311 350 1.73611111111111e-07 311 351 -2.54629629629465e-07 311 352 1.45583787809333e-22 311 353 -6.01851851852182e-07 311 354 -1.73611111111111e-07 311 355 -2.54629629629464e-07 312 312 2.03703703703770e-06 312 269 -1.73611111111111e-07 312 270 9.25925925922635e-08 312 271 -3.97046694025453e-23 312 272 -2.54629629629465e-07 312 273 1.73611111111111e-07 312 310 -6.01851851852183e-07 312 311 -1.32348898008484e-23 312 268 -2.54629629629465e-07 312 313 -7.94093388050907e-23 312 314 -6.01851851852183e-07 312 315 -3.30872245021211e-23 312 352 -2.54629629629465e-07 312 353 1.73611111111111e-07 312 354 9.25925925922630e-08 312 355 1.65436122510606e-22 312 356 -2.54629629629465e-07 312 357 -1.73611111111111e-07 313 313 2.03703703703770e-06 313 269 -2.54629629629464e-07 313 270 -3.30872245021211e-23 313 271 -6.01851851852181e-07 313 272 1.73611111111111e-07 313 273 -2.54629629629464e-07 313 310 -2.64697796016969e-23 313 311 9.25925925922619e-08 313 312 -1.05879118406788e-22 313 268 -1.73611111111111e-07 313 314 -3.97046694025453e-23 313 315 9.25925925922619e-08 313 352 1.73611111111111e-07 313 353 -2.54629629629465e-07 313 354 1.45583787809333e-22 313 355 -6.01851851852181e-07 313 356 -1.73611111111111e-07 313 357 -2.54629629629464e-07 314 314 2.03703703703770e-06 314 271 -1.73611111111111e-07 314 272 9.25925925922632e-08 314 273 -2.64697796016969e-23 314 274 -2.54629629629465e-07 314 275 1.73611111111111e-07 314 312 -6.01851851852183e-07 314 313 -3.97046694025453e-23 314 270 -2.54629629629465e-07 314 315 -1.05879118406788e-22 314 316 -6.01851851852182e-07 314 317 -3.30872245021211e-23 314 354 -2.54629629629465e-07 314 355 1.73611111111111e-07 314 356 9.25925925922627e-08 314 357 1.45583787809333e-22 314 358 -2.54629629629464e-07 314 359 -1.73611111111111e-07 315 315 2.03703703703770e-06 315 271 -2.54629629629464e-07 315 272 -2.64697796016969e-23 315 273 -6.01851851852181e-07 315 274 1.73611111111111e-07 315 275 -2.54629629629465e-07 315 312 -2.64697796016969e-23 315 313 9.25925925922620e-08 315 314 -7.94093388050907e-23 315 270 -1.73611111111111e-07 315 316 -4.63221143029695e-23 315 317 9.25925925922624e-08 315 354 1.73611111111111e-07 315 355 -2.54629629629465e-07 315 356 1.25731453108060e-22 315 357 -6.01851851852182e-07 315 358 -1.73611111111111e-07 315 359 -2.54629629629465e-07 316 316 2.03703703703770e-06 316 273 -1.73611111111111e-07 316 274 9.25925925922621e-08 316 275 -6.61744490042422e-23 316 276 -2.54629629629464e-07 316 277 1.73611111111111e-07 316 314 -6.01851851852182e-07 316 315 -5.95570041038180e-23 316 272 -2.54629629629465e-07 316 317 -5.29395592033938e-23 316 318 -6.01851851852180e-07 316 319 -1.98523347012727e-23 316 356 -2.54629629629465e-07 316 357 1.73611111111111e-07 316 358 9.25925925922617e-08 316 359 1.91905902112302e-22 316 360 -2.54629629629464e-07 316 361 -1.73611111111111e-07 317 317 2.03703703703770e-06 317 273 -2.54629629629465e-07 317 274 -5.29395592033938e-23 317 275 -6.01851851852183e-07 317 276 1.73611111111111e-07 317 277 -2.54629629629465e-07 317 314 -4.63221143029695e-23 317 315 9.25925925922624e-08 317 316 -1.05879118406788e-22 317 272 -1.73611111111111e-07 317 318 -6.61744490042422e-24 317 319 9.25925925922639e-08 317 356 1.73611111111111e-07 317 357 -2.54629629629465e-07 317 358 1.38966342908909e-22 317 359 -6.01851851852183e-07 317 360 -1.73611111111111e-07 317 361 -2.54629629629465e-07 318 318 2.03703703703770e-06 318 275 -1.73611111111111e-07 318 276 9.25925925922621e-08 318 277 -2.64697796016969e-23 318 278 -2.54629629629465e-07 318 279 1.73611111111111e-07 318 316 -6.01851851852180e-07 318 317 -1.98523347012727e-23 318 274 -2.54629629629464e-07 318 319 -1.05879118406788e-22 318 320 -6.01851851852182e-07 318 321 -3.97046694025453e-23 318 358 -2.54629629629465e-07 318 359 1.73611111111111e-07 318 360 9.25925925922617e-08 318 361 1.25731453108060e-22 318 362 -2.54629629629464e-07 318 363 -1.73611111111111e-07 319 319 2.03703703703770e-06 319 275 -2.54629629629465e-07 319 276 -4.63221143029695e-23 319 277 -6.01851851852183e-07 319 278 1.73611111111111e-07 319 279 -2.54629629629465e-07 319 316 -3.30872245021211e-23 319 317 9.25925925922639e-08 319 318 -1.32348898008484e-22 319 274 -1.73611111111111e-07 319 320 -1.32348898008484e-23 319 321 9.25925925922626e-08 319 358 1.73611111111111e-07 319 359 -2.54629629629465e-07 319 360 1.32348898008484e-22 319 361 -6.01851851852183e-07 319 362 -1.73611111111111e-07 319 363 -2.54629629629465e-07 320 320 2.03703703703770e-06 320 277 -1.73611111111111e-07 320 278 9.25925925922631e-08 320 279 -4.63221143029695e-23 320 280 -2.54629629629465e-07 320 281 1.73611111111111e-07 320 318 -6.01851851852182e-07 320 319 -3.30872245021211e-23 320 276 -2.54629629629465e-07 320 321 -7.94093388050907e-23 320 322 -6.01851851852183e-07 320 323 -3.30872245021211e-23 320 360 -2.54629629629465e-07 320 361 1.73611111111111e-07 320 362 9.25925925922627e-08 320 363 1.65436122510606e-22 320 364 -2.54629629629465e-07 320 365 -1.73611111111111e-07 321 321 2.03703703703770e-06 321 277 -2.54629629629465e-07 321 278 -1.98523347012727e-23 321 279 -6.01851851852181e-07 321 280 1.73611111111111e-07 321 281 -2.54629629629464e-07 321 318 -1.98523347012727e-23 321 319 9.25925925922625e-08 321 320 -1.05879118406788e-22 321 276 -1.73611111111111e-07 321 322 -3.97046694025453e-23 321 323 9.25925925922619e-08 321 360 1.73611111111111e-07 321 361 -2.54629629629465e-07 321 362 1.32348898008484e-22 321 363 -6.01851851852182e-07 321 364 -1.73611111111111e-07 321 365 -2.54629629629464e-07 322 322 2.03703703703770e-06 322 279 -1.73611111111111e-07 322 280 9.25925925922635e-08 322 281 -2.64697796016969e-23 322 282 -2.54629629629465e-07 322 283 1.73611111111111e-07 322 320 -6.01851851852183e-07 322 321 -3.97046694025453e-23 322 278 -2.54629629629465e-07 322 323 -1.05879118406788e-22 322 324 -6.01851851852183e-07 322 325 -6.61744490042422e-24 322 362 -2.54629629629465e-07 322 363 1.73611111111111e-07 322 364 9.25925925922630e-08 322 365 1.38966342908909e-22 322 366 -2.54629629629465e-07 322 367 -1.73611111111111e-07 323 323 2.03703703703770e-06 323 279 -2.54629629629464e-07 323 280 -3.30872245021211e-23 323 281 -6.01851851852181e-07 323 282 1.73611111111111e-07 323 283 -2.54629629629464e-07 323 320 -2.64697796016969e-23 323 321 9.25925925922620e-08 323 322 -7.94093388050907e-23 323 278 -1.73611111111111e-07 323 324 -3.30872245021211e-23 323 325 9.25925925922618e-08 323 362 1.73611111111111e-07 323 363 -2.54629629629465e-07 323 364 1.45583787809333e-22 323 365 -6.01851851852181e-07 323 366 -1.73611111111111e-07 323 367 -2.54629629629464e-07 324 324 1.66676851851906e-02 324 281 -1.73611111111111e-07 324 282 2.38099867724598e-03 324 283 2.67860615079365e-03 324 284 -4.16666666666397e-03 324 285 4.46428571428571e-03 324 322 -6.01851851852183e-07 324 323 -3.30872245021211e-23 324 280 -2.54629629629465e-07 324 325 -2.60208521396521e-18 324 326 -1.30952380952435e-02 324 327 -4.33680868994202e-19 324 364 -2.54629629629465e-07 324 365 1.73611111111111e-07 324 366 2.38099867724597e-03 324 367 -2.67860615079365e-03 324 368 -4.16666666666396e-03 324 369 -4.46428571428572e-03 325 325 1.66676851851906e-02 325 281 -2.54629629629464e-07 325 282 -2.67860615079365e-03 325 283 -6.54791997354768e-03 325 284 4.46428571428571e-03 325 285 -4.16666666666397e-03 325 322 -1.32348898008484e-23 325 323 9.25925925922618e-08 325 324 -1.73472347597681e-18 325 280 -1.73611111111111e-07 325 326 -4.33680868994202e-19 325 327 4.76190476189937e-03 325 364 1.73611111111111e-07 325 365 -2.54629629629465e-07 325 366 2.67860615079365e-03 325 367 -6.54791997354769e-03 325 368 -4.46428571428571e-03 325 369 -4.16666666666397e-03 326 326 3.33333333333442e-02 326 283 -4.46428571428572e-03 326 284 4.76190476189937e-03 326 285 -1.30104260698261e-18 326 286 -4.16666666666397e-03 326 287 4.46428571428572e-03 326 324 -1.30952380952435e-02 326 325 -8.67361737988404e-19 326 282 -4.16666666666397e-03 326 327 -3.46944695195361e-18 326 328 -1.30952380952435e-02 326 329 -1.30104260698261e-18 326 366 -4.16666666666397e-03 326 367 4.46428571428572e-03 326 368 4.76190476189936e-03 326 369 4.33680868994202e-18 326 370 -4.16666666666396e-03 326 371 -4.46428571428571e-03 327 327 3.33333333333442e-02 327 283 -4.16666666666397e-03 327 284 -8.67361737988404e-19 327 285 -1.30952380952435e-02 327 286 4.46428571428572e-03 327 287 -4.16666666666396e-03 327 324 -8.67361737988404e-19 327 325 4.76190476189937e-03 327 326 -2.60208521396521e-18 327 282 -4.46428571428572e-03 327 328 -1.30104260698261e-18 327 329 4.76190476189936e-03 327 366 4.46428571428572e-03 327 367 -4.16666666666397e-03 327 368 3.90312782094782e-18 327 369 -1.30952380952435e-02 327 370 -4.46428571428572e-03 327 371 -4.16666666666397e-03 328 328 3.33333333333442e-02 328 285 -4.46428571428572e-03 328 286 4.76190476189939e-03 328 287 -1.73472347597681e-18 328 288 -4.16666666666398e-03 328 289 4.46428571428572e-03 328 326 -1.30952380952435e-02 328 327 -8.67361737988404e-19 328 284 -4.16666666666397e-03 328 329 -2.60208521396521e-18 328 330 -1.30952380952436e-02 328 331 -1.30104260698261e-18 328 368 -4.16666666666397e-03 328 369 4.46428571428572e-03 328 370 4.76190476189938e-03 328 371 3.03576608295941e-18 328 372 -4.16666666666397e-03 328 373 -4.46428571428571e-03 329 329 3.33333333333441e-02 329 285 -4.16666666666396e-03 329 286 -8.67361737988404e-19 329 287 -1.30952380952435e-02 329 288 4.46428571428572e-03 329 289 -4.16666666666396e-03 329 326 -1.30104260698261e-18 329 327 4.76190476189936e-03 329 328 -3.46944695195361e-18 329 284 -4.46428571428572e-03 329 330 -8.67361737988404e-19 329 331 4.76190476189933e-03 329 368 4.46428571428572e-03 329 369 -4.16666666666397e-03 329 370 3.46944695195361e-18 329 371 -1.30952380952435e-02 329 372 -4.46428571428571e-03 329 373 -4.16666666666396e-03 330 330 3.33333333333442e-02 330 287 -4.46428571428572e-03 330 288 4.76190476189938e-03 330 289 -8.67361737988404e-19 330 290 -4.16666666666396e-03 330 291 4.46428571428572e-03 330 328 -1.30952380952436e-02 330 329 -1.30104260698261e-18 330 286 -4.16666666666398e-03 330 331 -3.46944695195361e-18 330 332 -1.30952380952435e-02 330 333 -8.67361737988404e-19 330 370 -4.16666666666398e-03 330 371 4.46428571428572e-03 330 372 4.76190476189937e-03 330 373 3.46944695195361e-18 330 374 -4.16666666666396e-03 330 375 -4.46428571428572e-03 331 331 3.33333333333441e-02 331 287 -4.16666666666396e-03 331 288 0.00000000000000e+00 331 289 -1.30952380952435e-02 331 290 4.46428571428571e-03 331 291 -4.16666666666397e-03 331 328 -8.67361737988404e-19 331 329 4.76190476189933e-03 331 330 -2.60208521396521e-18 331 286 -4.46428571428572e-03 331 332 -8.67361737988404e-19 331 333 4.76190476189938e-03 331 370 4.46428571428572e-03 331 371 -4.16666666666396e-03 331 372 3.03576608295941e-18 331 373 -1.30952380952435e-02 331 374 -4.46428571428571e-03 331 375 -4.16666666666397e-03 332 332 3.33333333333441e-02 332 289 -4.46428571428572e-03 332 290 4.76190476189936e-03 332 291 -1.30104260698261e-18 332 292 -4.16666666666397e-03 332 293 4.46428571428571e-03 332 330 -1.30952380952435e-02 332 331 -8.67361737988404e-19 332 288 -4.16666666666397e-03 332 333 -5.20417042793042e-18 332 334 -1.30952380952435e-02 332 335 -4.33680868994202e-19 332 372 -4.16666666666396e-03 332 373 4.46428571428572e-03 332 374 4.76190476189935e-03 332 375 4.33680868994202e-18 332 376 -4.16666666666396e-03 332 377 -4.46428571428572e-03 333 333 3.33333333333442e-02 333 289 -4.16666666666397e-03 333 290 0.00000000000000e+00 333 291 -1.30952380952435e-02 333 292 4.46428571428571e-03 333 293 -4.16666666666397e-03 333 330 -8.67361737988404e-19 333 331 4.76190476189938e-03 333 332 -3.46944695195361e-18 333 288 -4.46428571428572e-03 333 334 -4.33680868994202e-19 333 335 4.76190476189937e-03 333 372 4.46428571428572e-03 333 373 -4.16666666666397e-03 333 374 3.46944695195361e-18 333 375 -1.30952380952435e-02 333 376 -4.46428571428571e-03 333 377 -4.16666666666397e-03 334 334 3.33333333333442e-02 334 291 -4.46428571428572e-03 334 292 4.76190476189937e-03 334 293 -1.30104260698261e-18 334 332 -1.30952380952435e-02 334 333 -8.67361737988404e-19 334 290 -4.16666666666397e-03 334 335 -3.46944695195361e-18 334 374 -4.16666666666397e-03 334 375 4.46428571428572e-03 334 376 4.76190476189936e-03 334 377 4.33680868994202e-18 335 335 3.33333333333441e-02 335 291 -4.16666666666397e-03 335 292 -1.30104260698261e-18 335 293 -1.30952380952435e-02 335 332 -8.67361737988404e-19 335 333 4.76190476189937e-03 335 334 -3.46944695195361e-18 335 290 -4.46428571428572e-03 335 374 4.46428571428572e-03 335 375 -4.16666666666397e-03 335 376 4.33680868994202e-18 335 377 -1.30952380952435e-02 336 336 1.15384717236505e+00 336 295 1.87350135405495e-16 336 296 -2.88461538461352e-01 336 297 2.40384615384615e-01 336 294 1.92307692307318e-01 336 337 -2.49800207010440e-16 336 338 -3.84615685541497e-01 336 339 -4.80769577991453e-02 336 378 9.25925925922633e-08 336 379 1.98523347012727e-23 336 380 -2.54629629629465e-07 336 381 -1.73611111111111e-07 337 337 1.15384717236505e+00 337 295 -7.69230769231143e-01 337 296 2.40384615384615e-01 337 297 -2.88461538461351e-01 337 336 -2.22044631394811e-16 337 294 2.15105711021124e-16 337 338 4.80769577991453e-02 337 339 9.61538924499555e-02 337 378 1.32348898008484e-23 337 379 -6.01851851852181e-07 337 380 -1.73611111111111e-07 337 381 -2.54629629629465e-07 338 338 1.15384717236505e+00 338 295 -2.40384615384615e-01 338 296 1.92307692307318e-01 338 297 1.87350135405495e-16 338 298 -2.88461538461352e-01 338 299 2.40384615384615e-01 338 336 -3.84615685541497e-01 338 337 4.80769577991453e-02 338 294 -2.88461538461351e-01 338 339 -2.49800207010440e-16 338 340 -3.84615685541497e-01 338 341 -4.80769577991453e-02 338 378 -2.54629629629465e-07 338 379 1.73611111111111e-07 338 380 9.25925925922633e-08 338 381 1.98523347012727e-23 338 382 -2.54629629629465e-07 338 383 -1.73611111111111e-07 339 339 1.15384717236505e+00 339 295 -2.88461538461351e-01 339 296 2.15105711021124e-16 339 297 -7.69230769231143e-01 339 298 2.40384615384615e-01 339 299 -2.88461538461351e-01 339 336 -4.80769577991453e-02 339 337 9.61538924499555e-02 339 338 -2.22044631394811e-16 339 294 -2.40384615384615e-01 339 340 4.80769577991453e-02 339 341 9.61538924499555e-02 339 378 1.73611111111111e-07 339 379 -2.54629629629465e-07 339 380 1.32348898008484e-23 339 381 -6.01851851852181e-07 339 382 -1.73611111111111e-07 339 383 -2.54629629629465e-07 340 340 1.15384717236505e+00 340 297 -2.40384615384615e-01 340 298 1.92307692307318e-01 340 299 1.87350135405495e-16 340 300 -2.88461538461352e-01 340 301 2.40384615384615e-01 340 338 -3.84615685541497e-01 340 339 4.80769577991453e-02 340 296 -2.88461538461351e-01 340 341 -2.49800233480219e-16 340 342 -3.84615685541497e-01 340 343 -4.80769577991454e-02 340 380 -2.54629629629465e-07 340 381 1.73611111111111e-07 340 382 9.25925925922633e-08 340 383 -1.32348898008484e-23 340 384 -2.54629629629465e-07 340 385 -1.73611111111111e-07 341 341 1.15384717236505e+00 341 297 -2.88461538461351e-01 341 298 1.66533453693773e-16 341 299 -7.69230769231143e-01 341 300 2.40384615384615e-01 341 301 -2.88461538461352e-01 341 338 -4.80769577991453e-02 341 339 9.61538924499555e-02 341 340 -2.49800233480219e-16 341 296 -2.40384615384615e-01 341 342 4.80769577991452e-02 341 343 9.61538924499556e-02 341 380 1.73611111111111e-07 341 381 -2.54629629629465e-07 341 382 2.64697796016969e-23 341 383 -6.01851851852181e-07 341 384 -1.73611111111111e-07 341 385 -2.54629629629465e-07 342 342 1.15384717236505e+00 342 299 -2.40384615384615e-01 342 300 1.92307692307318e-01 342 301 2.08166817117217e-16 342 302 -2.88461538461352e-01 342 303 2.40384615384615e-01 342 340 -3.84615685541497e-01 342 341 4.80769577991452e-02 342 298 -2.88461538461351e-01 342 343 -1.66533453693773e-16 342 344 -3.84615685541497e-01 342 345 -4.80769577991453e-02 342 382 -2.54629629629465e-07 342 383 1.73611111111111e-07 342 384 9.25925925922631e-08 342 385 -3.30872245021211e-23 342 386 -2.54629629629465e-07 342 387 -1.73611111111111e-07 343 343 1.15384717236505e+00 343 299 -2.88461538461351e-01 343 300 1.59594559789866e-16 343 301 -7.69230769231144e-01 343 302 2.40384615384615e-01 343 303 -2.88461538461352e-01 343 340 -4.80769577991453e-02 343 341 9.61538924499556e-02 343 342 -1.94289055779182e-16 343 298 -2.40384615384615e-01 343 344 4.80769577991453e-02 343 345 9.61538924499556e-02 343 382 1.73611111111111e-07 343 383 -2.54629629629465e-07 343 384 0.00000000000000e+00 343 385 -6.01851851852181e-07 343 386 -1.73611111111111e-07 343 387 -2.54629629629465e-07 344 344 1.15384717236505e+00 344 301 -2.40384615384615e-01 344 302 1.92307692307318e-01 344 303 1.73472347597681e-16 344 304 -2.88461538461352e-01 344 305 2.40384615384615e-01 344 342 -3.84615685541497e-01 344 343 4.80769577991453e-02 344 300 -2.88461538461351e-01 344 345 -1.66533427223994e-16 344 346 -3.84615685541498e-01 344 347 -4.80769577991454e-02 344 384 -2.54629629629465e-07 344 385 1.73611111111111e-07 344 386 9.25925925922633e-08 344 387 6.61744490042422e-24 344 388 -2.54629629629465e-07 344 389 -1.73611111111111e-07 345 345 1.15384717236505e+00 345 301 -2.88461538461351e-01 345 302 2.01227923213310e-16 345 303 -7.69230769231143e-01 345 304 2.40384615384615e-01 345 305 -2.88461538461351e-01 345 342 -4.80769577991453e-02 345 343 9.61538924499556e-02 345 344 -1.66533453693773e-16 345 300 -2.40384615384615e-01 345 346 4.80769577991452e-02 345 347 9.61538924499553e-02 345 384 1.73611111111111e-07 345 385 -2.54629629629465e-07 345 386 1.32348898008484e-23 345 387 -6.01851851852181e-07 345 388 -1.73611111111111e-07 345 389 -2.54629629629464e-07 346 346 1.15384717236505e+00 346 303 -2.40384615384615e-01 346 304 1.92307692307318e-01 346 305 1.66533453693773e-16 346 306 -2.88461538461351e-01 346 307 2.40384615384615e-01 346 344 -3.84615685541498e-01 346 345 4.80769577991452e-02 346 302 -2.88461538461351e-01 346 347 -1.66533480163553e-16 346 348 -3.84615685541497e-01 346 349 -4.80769577991454e-02 346 386 -2.54629629629465e-07 346 387 1.73611111111111e-07 346 388 9.25925925922632e-08 346 389 -2.64697796016969e-23 346 390 -2.54629629629465e-07 346 391 -1.73611111111111e-07 347 347 1.15384717236505e+00 347 303 -2.88461538461351e-01 347 304 1.80411241501588e-16 347 305 -7.69230769231144e-01 347 306 2.40384615384615e-01 347 307 -2.88461538461352e-01 347 344 -4.80769577991454e-02 347 345 9.61538924499553e-02 347 346 -1.66533453693773e-16 347 302 -2.40384615384615e-01 347 348 4.80769577991452e-02 347 349 9.61538924499558e-02 347 386 1.73611111111111e-07 347 387 -2.54629629629464e-07 347 388 6.61744490042422e-24 347 389 -6.01851851852181e-07 347 390 -1.73611111111111e-07 347 391 -2.54629629629465e-07 348 348 1.15384717236505e+00 348 305 -2.40384615384615e-01 348 306 1.92307692307318e-01 348 307 1.52655665885959e-16 348 308 -2.88461538461352e-01 348 309 2.40384615384615e-01 348 346 -3.84615685541497e-01 348 347 4.80769577991452e-02 348 304 -2.88461538461351e-01 348 349 -1.66533453693773e-16 348 350 -3.84615685541498e-01 348 351 -4.80769577991453e-02 348 388 -2.54629629629465e-07 348 389 1.73611111111111e-07 348 390 9.25925925922633e-08 348 391 1.32348898008484e-23 348 392 -2.54629629629465e-07 348 393 -1.73611111111111e-07 349 349 1.15384717236505e+00 349 305 -2.88461538461352e-01 349 306 2.35922392732846e-16 349 307 -7.69230769231143e-01 349 308 2.40384615384615e-01 349 309 -2.88461538461351e-01 349 346 -4.80769577991454e-02 349 347 9.61538924499558e-02 349 348 -1.94289029309402e-16 349 304 -2.40384615384615e-01 349 350 4.80769577991452e-02 349 351 9.61538924499551e-02 349 388 1.73611111111111e-07 349 389 -2.54629629629465e-07 349 390 1.32348898008484e-23 349 391 -6.01851851852181e-07 349 392 -1.73611111111111e-07 349 393 -2.54629629629464e-07 350 350 5.85257428775118e-01 350 307 -2.40384615384615e-01 350 308 9.61538924499560e-02 350 309 -4.80769577991452e-02 350 310 -2.54629629629465e-07 350 311 1.73611111111111e-07 350 348 -3.84615685541498e-01 350 349 4.80769577991452e-02 350 306 -2.88461538461351e-01 350 351 2.44848553876679e-01 350 352 -6.54791997354768e-03 350 353 2.67860615079365e-03 350 390 -2.54629629629465e-07 350 391 1.73611111111111e-07 350 392 2.38099867724598e-03 350 393 -2.67860615079365e-03 350 394 -4.16666666666397e-03 350 395 -4.46428571428572e-03 351 351 5.85257428775118e-01 351 307 -2.88461538461351e-01 351 308 4.80769577991454e-02 351 309 -3.84615685541497e-01 351 310 1.73611111111111e-07 351 311 -2.54629629629465e-07 351 348 -4.80769577991453e-02 351 349 9.61538924499551e-02 351 350 2.44848553876679e-01 351 306 -2.40384615384615e-01 351 352 -2.67860615079365e-03 351 353 2.38099867724598e-03 351 390 1.73611111111111e-07 351 391 -2.54629629629464e-07 351 392 2.67860615079365e-03 351 393 -6.54791997354768e-03 351 394 -4.46428571428572e-03 351 395 -4.16666666666397e-03 352 352 1.66676851851906e-02 352 309 -1.73611111111111e-07 352 310 9.25925925922624e-08 352 311 1.38966342908909e-22 352 312 -2.54629629629465e-07 352 313 1.73611111111111e-07 352 350 -6.54791997354768e-03 352 351 -2.67860615079365e-03 352 308 -2.54629629629464e-07 352 353 0.00000000000000e+00 352 354 -6.54791997354769e-03 352 355 2.67860615079365e-03 352 392 -4.16666666666397e-03 352 393 4.46428571428572e-03 352 394 4.76190476189937e-03 352 395 0.00000000000000e+00 352 396 -4.16666666666397e-03 352 397 -4.46428571428572e-03 353 353 1.66676851851906e-02 353 309 -2.54629629629465e-07 353 310 1.38966342908909e-22 353 311 -6.01851851852182e-07 353 312 1.73611111111111e-07 353 313 -2.54629629629465e-07 353 350 2.67860615079365e-03 353 351 2.38099867724598e-03 353 352 8.67361737988404e-19 353 308 -1.73611111111111e-07 353 354 -2.67860615079365e-03 353 355 2.38099867724597e-03 353 392 4.46428571428572e-03 353 393 -4.16666666666397e-03 353 394 0.00000000000000e+00 353 395 -1.30952380952435e-02 353 396 -4.46428571428572e-03 353 397 -4.16666666666396e-03 354 354 1.66676851851906e-02 354 311 -1.73611111111111e-07 354 312 9.25925925922630e-08 354 313 1.58818677610181e-22 354 314 -2.54629629629465e-07 354 315 1.73611111111111e-07 354 352 -6.54791997354769e-03 354 353 -2.67860615079365e-03 354 310 -2.54629629629465e-07 354 355 0.00000000000000e+00 354 356 -6.54791997354769e-03 354 357 2.67860615079365e-03 354 394 -4.16666666666397e-03 354 395 4.46428571428572e-03 354 396 4.76190476189938e-03 354 397 -4.33680868994202e-19 354 398 -4.16666666666397e-03 354 399 -4.46428571428572e-03 355 355 1.66676851851906e-02 355 311 -2.54629629629464e-07 355 312 1.25731453108060e-22 355 313 -6.01851851852181e-07 355 314 1.73611111111111e-07 355 315 -2.54629629629465e-07 355 352 2.67860615079365e-03 355 353 2.38099867724597e-03 355 354 -8.67361737988404e-19 355 310 -1.73611111111111e-07 355 356 -2.67860615079365e-03 355 357 2.38099867724597e-03 355 394 4.46428571428572e-03 355 395 -4.16666666666396e-03 355 396 -8.67361737988404e-19 355 397 -1.30952380952435e-02 355 398 -4.46428571428572e-03 355 399 -4.16666666666396e-03 356 356 1.66676851851906e-02 356 313 -1.73611111111111e-07 356 314 9.25925925922627e-08 356 315 1.58818677610181e-22 356 316 -2.54629629629465e-07 356 317 1.73611111111111e-07 356 354 -6.54791997354769e-03 356 355 -2.67860615079365e-03 356 312 -2.54629629629465e-07 356 357 8.67361737988404e-19 356 358 -6.54791997354769e-03 356 359 2.67860615079365e-03 356 396 -4.16666666666397e-03 356 397 4.46428571428571e-03 356 398 4.76190476189938e-03 356 399 0.00000000000000e+00 356 400 -4.16666666666397e-03 356 401 -4.46428571428572e-03 357 357 1.66676851851906e-02 357 313 -2.54629629629465e-07 357 314 1.12496563307212e-22 357 315 -6.01851851852182e-07 357 316 1.73611111111111e-07 357 317 -2.54629629629465e-07 357 354 2.67860615079365e-03 357 355 2.38099867724597e-03 357 356 -8.67361737988404e-19 357 312 -1.73611111111111e-07 357 358 -2.67860615079365e-03 357 359 2.38099867724597e-03 357 396 4.46428571428572e-03 357 397 -4.16666666666396e-03 357 398 0.00000000000000e+00 357 399 -1.30952380952435e-02 357 400 -4.46428571428572e-03 357 401 -4.16666666666396e-03 358 358 1.66676851851906e-02 358 315 -1.73611111111111e-07 358 316 9.25925925922617e-08 358 317 1.38966342908909e-22 358 318 -2.54629629629465e-07 358 319 1.73611111111111e-07 358 356 -6.54791997354769e-03 358 357 -2.67860615079365e-03 358 314 -2.54629629629464e-07 358 359 0.00000000000000e+00 358 360 -6.54791997354767e-03 358 361 2.67860615079365e-03 358 398 -4.16666666666397e-03 358 399 4.46428571428572e-03 358 400 4.76190476189936e-03 358 401 -4.33680868994202e-19 358 402 -4.16666666666396e-03 358 403 -4.46428571428572e-03 359 359 1.66676851851906e-02 359 315 -2.54629629629465e-07 359 316 1.91905902112302e-22 359 317 -6.01851851852183e-07 359 318 1.73611111111111e-07 359 319 -2.54629629629465e-07 359 356 2.67860615079365e-03 359 357 2.38099867724597e-03 359 358 -8.67361737988404e-19 359 314 -1.73611111111111e-07 359 360 -2.67860615079365e-03 359 361 2.38099867724598e-03 359 398 4.46428571428572e-03 359 399 -4.16666666666396e-03 359 400 -1.73472347597681e-18 359 401 -1.30952380952435e-02 359 402 -4.46428571428572e-03 359 403 -4.16666666666397e-03 360 360 1.66676851851906e-02 360 317 -1.73611111111111e-07 360 318 9.25925925922617e-08 360 319 1.58818677610181e-22 360 320 -2.54629629629465e-07 360 321 1.73611111111111e-07 360 358 -6.54791997354767e-03 360 359 -2.67860615079365e-03 360 316 -2.54629629629464e-07 360 361 0.00000000000000e+00 360 362 -6.54791997354769e-03 360 363 2.67860615079365e-03 360 400 -4.16666666666396e-03 360 401 4.46428571428572e-03 360 402 4.76190476189936e-03 360 403 4.33680868994202e-19 360 404 -4.16666666666397e-03 360 405 -4.46428571428572e-03 361 361 1.66676851851906e-02 361 317 -2.54629629629465e-07 361 318 1.12496563307212e-22 361 319 -6.01851851852183e-07 361 320 1.73611111111111e-07 361 321 -2.54629629629465e-07 361 358 2.67860615079365e-03 361 359 2.38099867724598e-03 361 360 -8.67361737988404e-19 361 316 -1.73611111111111e-07 361 362 -2.67860615079365e-03 361 363 2.38099867724597e-03 361 400 4.46428571428572e-03 361 401 -4.16666666666397e-03 361 402 -4.33680868994202e-19 361 403 -1.30952380952435e-02 361 404 -4.46428571428572e-03 361 405 -4.16666666666396e-03 362 362 1.66676851851906e-02 362 319 -1.73611111111111e-07 362 320 9.25925925922627e-08 362 321 1.38966342908909e-22 362 322 -2.54629629629465e-07 362 323 1.73611111111111e-07 362 360 -6.54791997354769e-03 362 361 -2.67860615079365e-03 362 318 -2.54629629629464e-07 362 363 -8.67361737988404e-19 362 364 -6.54791997354769e-03 362 365 2.67860615079365e-03 362 402 -4.16666666666397e-03 362 403 4.46428571428572e-03 362 404 4.76190476189938e-03 362 405 4.33680868994202e-19 362 406 -4.16666666666397e-03 362 407 -4.46428571428572e-03 363 363 1.66676851851906e-02 363 319 -2.54629629629465e-07 363 320 1.32348898008484e-22 363 321 -6.01851851852182e-07 363 322 1.73611111111111e-07 363 323 -2.54629629629465e-07 363 360 2.67860615079365e-03 363 361 2.38099867724597e-03 363 362 -8.67361737988404e-19 363 318 -1.73611111111111e-07 363 364 -2.67860615079365e-03 363 365 2.38099867724597e-03 363 402 4.46428571428572e-03 363 403 -4.16666666666396e-03 363 404 -4.33680868994202e-19 363 405 -1.30952380952435e-02 363 406 -4.46428571428572e-03 363 407 -4.16666666666396e-03 364 364 1.66676851851906e-02 364 321 -1.73611111111111e-07 364 322 9.25925925922630e-08 364 323 1.58818677610181e-22 364 324 -2.54629629629465e-07 364 325 1.73611111111111e-07 364 362 -6.54791997354769e-03 364 363 -2.67860615079365e-03 364 320 -2.54629629629465e-07 364 365 0.00000000000000e+00 364 366 -6.54791997354769e-03 364 367 2.67860615079365e-03 364 404 -4.16666666666397e-03 364 405 4.46428571428571e-03 364 406 4.76190476189938e-03 364 407 0.00000000000000e+00 364 408 -4.16666666666397e-03 364 409 -4.46428571428572e-03 365 365 1.66676851851906e-02 365 321 -2.54629629629465e-07 365 322 1.12496563307212e-22 365 323 -6.01851851852181e-07 365 324 1.73611111111111e-07 365 325 -2.54629629629465e-07 365 362 2.67860615079365e-03 365 363 2.38099867724597e-03 365 364 -8.67361737988404e-19 365 320 -1.73611111111111e-07 365 366 -2.67860615079365e-03 365 367 2.38099867724597e-03 365 404 4.46428571428572e-03 365 405 -4.16666666666396e-03 365 406 0.00000000000000e+00 365 407 -1.30952380952435e-02 365 408 -4.46428571428572e-03 365 409 -4.16666666666396e-03 366 366 5.93590252849195e-01 366 323 -1.73611111111111e-07 366 324 2.38099867724597e-03 366 325 2.67860615079365e-03 366 326 -4.16666666666397e-03 366 327 4.46428571428572e-03 366 364 -6.54791997354769e-03 366 365 -2.67860615079365e-03 366 322 -2.54629629629465e-07 366 367 2.31456217567155e-01 366 368 -3.91163003663193e-01 366 369 4.53983516483516e-02 366 406 -4.16666666666397e-03 366 407 4.46428571428571e-03 366 408 9.85347985346088e-02 366 409 -4.53983516483516e-02 366 410 -2.88461538461351e-01 366 411 -2.40384615384615e-01 367 367 5.93590252849195e-01 367 323 -2.54629629629464e-07 367 324 -2.67860615079365e-03 367 325 -6.54791997354769e-03 367 326 4.46428571428572e-03 367 327 -4.16666666666397e-03 367 364 2.67860615079365e-03 367 365 2.38099867724597e-03 367 366 2.31456217567155e-01 367 322 -1.73611111111111e-07 367 368 -4.53983516483517e-02 367 369 9.85347985346089e-02 367 406 4.46428571428572e-03 367 407 -4.16666666666396e-03 367 408 4.53983516483516e-02 367 409 -3.91163003663193e-01 367 410 -2.40384615384615e-01 367 411 -2.88461538461351e-01 368 368 1.17051282051320e+00 368 325 -4.46428571428571e-03 368 326 4.76190476189936e-03 368 327 3.46944695195361e-18 368 328 -4.16666666666397e-03 368 329 4.46428571428572e-03 368 366 -3.91163003663193e-01 368 367 -4.53983516483517e-02 368 324 -4.16666666666396e-03 368 369 2.77555756156289e-17 368 370 -3.91163003663194e-01 368 371 4.53983516483516e-02 368 408 -2.88461538461351e-01 368 409 2.40384615384615e-01 368 410 1.92307692307319e-01 368 411 -2.08166817117217e-17 368 412 -2.88461538461352e-01 368 413 -2.40384615384615e-01 369 369 1.17051282051320e+00 369 325 -4.16666666666397e-03 369 326 3.46944695195361e-18 369 327 -1.30952380952435e-02 369 328 4.46428571428572e-03 369 329 -4.16666666666397e-03 369 366 4.53983516483516e-02 369 367 9.85347985346089e-02 369 368 2.77555756156289e-17 369 324 -4.46428571428571e-03 369 370 -4.53983516483516e-02 369 371 9.85347985346082e-02 369 408 2.40384615384615e-01 369 409 -2.88461538461351e-01 369 410 -6.93889390390723e-18 369 411 -7.69230769231142e-01 369 412 -2.40384615384615e-01 369 413 -2.88461538461351e-01 370 370 1.17051282051320e+00 370 327 -4.46428571428571e-03 370 328 4.76190476189938e-03 370 329 3.03576608295941e-18 370 330 -4.16666666666398e-03 370 331 4.46428571428572e-03 370 368 -3.91163003663194e-01 370 369 -4.53983516483516e-02 370 326 -4.16666666666396e-03 370 371 5.55111512312578e-17 370 372 -3.91163003663196e-01 370 373 4.53983516483517e-02 370 410 -2.88461538461352e-01 370 411 2.40384615384615e-01 370 412 1.92307692307320e-01 370 413 -3.46944695195361e-17 370 414 -2.88461538461352e-01 370 415 -2.40384615384615e-01 371 371 1.17051282051320e+00 371 327 -4.16666666666397e-03 371 328 3.03576608295941e-18 371 329 -1.30952380952435e-02 371 330 4.46428571428572e-03 371 331 -4.16666666666396e-03 371 368 4.53983516483516e-02 371 369 9.85347985346082e-02 371 370 8.32667268468867e-17 371 326 -4.46428571428571e-03 371 372 -4.53983516483516e-02 371 373 9.85347985346074e-02 371 410 2.40384615384615e-01 371 411 -2.88461538461351e-01 371 412 2.77555756156289e-17 371 413 -7.69230769231140e-01 371 414 -2.40384615384615e-01 371 415 -2.88461538461351e-01 372 372 1.17051282051320e+00 372 329 -4.46428571428571e-03 372 330 4.76190476189937e-03 372 331 4.33680868994202e-18 372 332 -4.16666666666397e-03 372 333 4.46428571428572e-03 372 370 -3.91163003663196e-01 372 371 -4.53983516483517e-02 372 328 -4.16666666666397e-03 372 373 2.77555756156289e-17 372 374 -3.91163003663193e-01 372 375 4.53983516483516e-02 372 412 -2.88461538461352e-01 372 413 2.40384615384615e-01 372 414 1.92307692307320e-01 372 415 -6.93889390390723e-18 372 416 -2.88461538461351e-01 372 417 -2.40384615384615e-01 373 373 1.17051282051320e+00 373 329 -4.16666666666396e-03 373 330 3.46944695195361e-18 373 331 -1.30952380952435e-02 373 332 4.46428571428572e-03 373 333 -4.16666666666397e-03 373 370 4.53983516483517e-02 373 371 9.85347985346074e-02 373 372 0.00000000000000e+00 373 328 -4.46428571428572e-03 373 374 -4.53983516483517e-02 373 375 9.85347985346090e-02 373 412 2.40384615384615e-01 373 413 -2.88461538461351e-01 373 414 -2.77555756156289e-17 373 415 -7.69230769231142e-01 373 416 -2.40384615384615e-01 373 417 -2.88461538461352e-01 374 374 1.17051282051320e+00 374 331 -4.46428571428572e-03 374 332 4.76190476189935e-03 374 333 3.46944695195361e-18 374 334 -4.16666666666397e-03 374 335 4.46428571428572e-03 374 372 -3.91163003663193e-01 374 373 -4.53983516483516e-02 374 330 -4.16666666666396e-03 374 375 5.55111512312578e-17 374 376 -3.91163003663193e-01 374 377 4.53983516483516e-02 374 414 -2.88461538461351e-01 374 415 2.40384615384615e-01 374 416 1.92307692307318e-01 374 417 6.93889390390723e-18 374 418 -2.88461538461351e-01 374 419 -2.40384615384615e-01 375 375 1.17051282051320e+00 375 331 -4.16666666666397e-03 375 332 3.46944695195361e-18 375 333 -1.30952380952435e-02 375 334 4.46428571428572e-03 375 335 -4.16666666666397e-03 375 372 4.53983516483516e-02 375 373 9.85347985346090e-02 375 374 2.77555756156289e-17 375 330 -4.46428571428571e-03 375 376 -4.53983516483517e-02 375 377 9.85347985346089e-02 375 414 2.40384615384615e-01 375 415 -2.88461538461352e-01 375 416 2.08166817117217e-17 375 417 -7.69230769231144e-01 375 418 -2.40384615384615e-01 375 419 -2.88461538461351e-01 376 376 1.17051282051320e+00 376 333 -4.46428571428571e-03 376 334 4.76190476189936e-03 376 335 3.46944695195361e-18 376 374 -3.91163003663193e-01 376 375 -4.53983516483517e-02 376 332 -4.16666666666396e-03 376 377 2.77555756156289e-17 376 416 -2.88461538461351e-01 376 417 2.40384615384615e-01 376 418 1.92307692307319e-01 376 419 0.00000000000000e+00 377 377 1.17051282051320e+00 377 333 -4.16666666666397e-03 377 334 3.46944695195361e-18 377 335 -1.30952380952435e-02 377 374 4.53983516483516e-02 377 375 9.85347985346089e-02 377 376 2.77555756156289e-17 377 332 -4.46428571428571e-03 377 416 2.40384615384615e-01 377 417 -2.88461538461351e-01 377 418 2.08166817117217e-17 377 419 -7.69230769231142e-01 378 378 2.03703703703770e-06 378 337 -3.30872245021211e-23 378 338 -2.54629629629465e-07 378 339 1.73611111111111e-07 378 336 9.25925925922633e-08 378 379 -1.05879118406788e-22 378 380 -6.01851851852183e-07 378 381 -1.98523347012727e-23 378 420 9.25925925922626e-08 378 421 1.52201232709757e-22 378 422 -2.54629629629464e-07 378 423 -1.73611111111111e-07 379 379 2.03703703703770e-06 379 337 -6.01851851852181e-07 379 338 1.73611111111111e-07 379 339 -2.54629629629465e-07 379 378 -1.05879118406788e-22 379 336 -6.61744490042422e-24 379 380 -8.60267837055149e-23 379 381 9.25925925922622e-08 379 420 1.32348898008484e-22 379 421 -6.01851851852182e-07 379 422 -1.73611111111111e-07 379 423 -2.54629629629464e-07 380 380 2.03703703703770e-06 380 337 -1.73611111111111e-07 380 338 9.25925925922633e-08 380 339 -3.30872245021211e-23 380 340 -2.54629629629465e-07 380 341 1.73611111111111e-07 380 378 -6.01851851852183e-07 380 379 -6.61744490042422e-23 380 336 -2.54629629629465e-07 380 381 -1.05879118406788e-22 380 382 -6.01851851852183e-07 380 383 -1.98523347012727e-23 380 420 -2.54629629629465e-07 380 421 1.73611111111111e-07 380 422 9.25925925922626e-08 380 423 1.52201232709757e-22 380 424 -2.54629629629464e-07 380 425 -1.73611111111111e-07 381 381 2.03703703703770e-06 381 337 -2.54629629629465e-07 381 338 -6.61744490042422e-24 381 339 -6.01851851852181e-07 381 340 1.73611111111111e-07 381 341 -2.54629629629465e-07 381 378 -4.63221143029695e-23 381 379 9.25925925922622e-08 381 380 -1.05879118406788e-22 381 336 -1.73611111111111e-07 381 382 -8.60267837055149e-23 381 383 9.25925925922622e-08 381 420 1.73611111111111e-07 381 421 -2.54629629629465e-07 381 422 1.32348898008484e-22 381 423 -6.01851851852182e-07 381 424 -1.73611111111111e-07 381 425 -2.54629629629464e-07 382 382 2.03703703703770e-06 382 339 -1.73611111111111e-07 382 340 9.25925925922633e-08 382 341 0.00000000000000e+00 382 342 -2.54629629629465e-07 382 343 1.73611111111111e-07 382 380 -6.01851851852183e-07 382 381 -6.61744490042422e-23 382 338 -2.54629629629465e-07 382 383 -7.94093388050907e-23 382 384 -6.01851851852182e-07 382 385 -4.63221143029695e-23 382 422 -2.54629629629465e-07 382 423 1.73611111111111e-07 382 424 9.25925925922625e-08 382 425 1.58818677610181e-22 382 426 -2.54629629629464e-07 382 427 -1.73611111111111e-07 383 383 2.03703703703770e-06 383 339 -2.54629629629465e-07 383 340 -3.30872245021211e-23 383 341 -6.01851851852181e-07 383 342 1.73611111111111e-07 383 343 -2.54629629629465e-07 383 380 -4.63221143029695e-23 383 381 9.25925925922622e-08 383 382 -7.94093388050907e-23 383 338 -1.73611111111111e-07 383 384 -3.97046694025453e-23 383 385 9.25925925922624e-08 383 422 1.73611111111111e-07 383 423 -2.54629629629465e-07 383 424 1.19114008207636e-22 383 425 -6.01851851852182e-07 383 426 -1.73611111111111e-07 383 427 -2.54629629629465e-07 384 384 2.03703703703770e-06 384 341 -1.73611111111111e-07 384 342 9.25925925922631e-08 384 343 1.98523347012727e-23 384 344 -2.54629629629465e-07 384 345 1.73611111111111e-07 384 382 -6.01851851852182e-07 384 383 -5.29395592033938e-23 384 340 -2.54629629629465e-07 384 385 -1.32348898008484e-22 384 386 -6.01851851852182e-07 384 387 -4.63221143029695e-23 384 424 -2.54629629629465e-07 384 425 1.73611111111111e-07 384 426 9.25925925922624e-08 384 427 1.58818677610181e-22 384 428 -2.54629629629464e-07 384 429 -1.73611111111111e-07 385 385 2.03703703703770e-06 385 341 -2.54629629629465e-07 385 342 -1.98523347012727e-23 385 343 -6.01851851852181e-07 385 344 1.73611111111111e-07 385 345 -2.54629629629465e-07 385 382 -5.29395592033938e-23 385 383 9.25925925922624e-08 385 384 -1.05879118406788e-22 385 340 -1.73611111111111e-07 385 386 -5.29395592033938e-23 385 387 9.25925925922624e-08 385 424 1.73611111111111e-07 385 425 -2.54629629629465e-07 385 426 1.05879118406788e-22 385 427 -6.01851851852182e-07 385 428 -1.73611111111111e-07 385 429 -2.54629629629465e-07 386 386 2.03703703703770e-06 386 343 -1.73611111111111e-07 386 344 9.25925925922633e-08 386 345 0.00000000000000e+00 386 346 -2.54629629629465e-07 386 347 1.73611111111111e-07 386 384 -6.01851851852182e-07 386 385 -3.97046694025453e-23 386 342 -2.54629629629465e-07 386 387 -1.58818677610181e-22 386 388 -6.01851851852183e-07 386 389 -5.29395592033938e-23 386 426 -2.54629629629465e-07 386 427 1.73611111111111e-07 386 428 9.25925925922626e-08 386 429 1.65436122510606e-22 386 430 -2.54629629629465e-07 386 431 -1.73611111111111e-07 387 387 2.03703703703770e-06 387 343 -2.54629629629465e-07 387 344 6.61744490042422e-24 387 345 -6.01851851852181e-07 387 346 1.73611111111111e-07 387 347 -2.54629629629464e-07 387 384 -5.95570041038180e-23 387 385 9.25925925922625e-08 387 386 -2.11758236813575e-22 387 342 -1.73611111111111e-07 387 388 -5.29395592033938e-23 387 389 9.25925925922619e-08 387 426 1.73611111111111e-07 387 427 -2.54629629629465e-07 387 428 1.32348898008484e-22 387 429 -6.01851851852182e-07 387 430 -1.73611111111111e-07 387 431 -2.54629629629465e-07 388 388 2.03703703703770e-06 388 345 -1.73611111111111e-07 388 346 9.25925925922632e-08 388 347 0.00000000000000e+00 388 348 -2.54629629629465e-07 388 349 1.73611111111111e-07 388 386 -6.01851851852183e-07 388 387 -2.64697796016969e-23 388 344 -2.54629629629465e-07 388 389 -1.32348898008484e-22 388 390 -6.01851851852182e-07 388 391 -5.29395592033938e-23 388 428 -2.54629629629465e-07 388 429 1.73611111111111e-07 388 430 9.25925925922624e-08 388 431 1.38966342908909e-22 388 432 -2.54629629629464e-07 388 433 -1.73611111111111e-07 389 389 2.03703703703770e-06 389 345 -2.54629629629464e-07 389 346 -3.97046694025453e-23 389 347 -6.01851851852181e-07 389 348 1.73611111111111e-07 389 349 -2.54629629629465e-07 389 386 -5.95570041038180e-23 389 387 9.25925925922619e-08 389 388 -2.64697796016969e-23 389 344 -1.73611111111111e-07 389 390 -3.97046694025453e-23 389 391 9.25925925922628e-08 389 428 1.73611111111111e-07 389 429 -2.54629629629465e-07 389 430 1.38966342908909e-22 389 431 -6.01851851852182e-07 389 432 -1.73611111111111e-07 389 433 -2.54629629629465e-07 390 390 2.03703703703770e-06 390 347 -1.73611111111111e-07 390 348 9.25925925922633e-08 390 349 -1.98523347012727e-23 390 350 -2.54629629629465e-07 390 351 1.73611111111111e-07 390 388 -6.01851851852182e-07 390 389 -1.98523347012727e-23 390 346 -2.54629629629465e-07 390 391 -1.85288457211878e-22 390 392 -6.01851851852183e-07 390 393 6.61744490042422e-24 390 430 -2.54629629629465e-07 390 431 1.73611111111111e-07 390 432 9.25925925922626e-08 390 433 1.45583787809333e-22 390 434 -2.54629629629465e-07 390 435 -1.73611111111111e-07 391 391 2.03703703703770e-06 391 347 -2.54629629629465e-07 391 348 -1.98523347012727e-23 391 349 -6.01851851852181e-07 391 350 1.73611111111111e-07 391 351 -2.54629629629464e-07 391 388 -4.63221143029695e-23 391 389 9.25925925922627e-08 391 390 -1.58818677610181e-22 391 346 -1.73611111111111e-07 391 392 -4.63221143029695e-23 391 393 9.25925925922616e-08 391 430 1.73611111111111e-07 391 431 -2.54629629629465e-07 391 432 1.45583787809333e-22 391 433 -6.01851851852182e-07 391 434 -1.73611111111111e-07 391 435 -2.54629629629464e-07 392 392 1.66676851851906e-02 392 349 -1.73611111111111e-07 392 350 2.38099867724598e-03 392 351 2.67860615079365e-03 392 352 -4.16666666666397e-03 392 353 4.46428571428572e-03 392 390 -6.01851851852183e-07 392 391 -3.30872245021211e-23 392 348 -2.54629629629465e-07 392 393 -2.60208521396521e-18 392 394 -1.30952380952435e-02 392 395 -8.67361737988404e-19 392 432 -2.54629629629465e-07 392 433 1.73611111111111e-07 392 434 2.38099867724597e-03 392 435 -2.67860615079365e-03 392 436 -4.16666666666396e-03 392 437 -4.46428571428572e-03 393 393 1.66676851851906e-02 393 349 -2.54629629629464e-07 393 350 -2.67860615079365e-03 393 351 -6.54791997354768e-03 393 352 4.46428571428572e-03 393 353 -4.16666666666397e-03 393 390 -1.32348898008484e-23 393 391 9.25925925922615e-08 393 392 -2.60208521396521e-18 393 348 -1.73611111111111e-07 393 394 -8.67361737988404e-19 393 395 4.76190476189937e-03 393 432 1.73611111111111e-07 393 433 -2.54629629629465e-07 393 434 2.67860615079365e-03 393 435 -6.54791997354769e-03 393 436 -4.46428571428571e-03 393 437 -4.16666666666397e-03 394 394 3.33333333333442e-02 394 351 -4.46428571428572e-03 394 352 4.76190476189937e-03 394 353 -8.67361737988404e-19 394 354 -4.16666666666397e-03 394 355 4.46428571428572e-03 394 392 -1.30952380952435e-02 394 393 -1.30104260698261e-18 394 350 -4.16666666666397e-03 394 395 -4.33680868994202e-18 394 396 -1.30952380952435e-02 394 397 -1.30104260698261e-18 394 434 -4.16666666666397e-03 394 435 4.46428571428572e-03 394 436 4.76190476189936e-03 394 437 4.33680868994202e-18 394 438 -4.16666666666397e-03 394 439 -4.46428571428571e-03 395 395 3.33333333333441e-02 395 351 -4.16666666666397e-03 395 352 0.00000000000000e+00 395 353 -1.30952380952435e-02 395 354 4.46428571428572e-03 395 355 -4.16666666666396e-03 395 392 -8.67361737988404e-19 395 393 4.76190476189937e-03 395 394 -4.33680868994202e-18 395 350 -4.46428571428572e-03 395 396 -1.30104260698261e-18 395 397 4.76190476189935e-03 395 434 4.46428571428572e-03 395 435 -4.16666666666397e-03 395 436 3.46944695195361e-18 395 437 -1.30952380952435e-02 395 438 -4.46428571428571e-03 395 439 -4.16666666666396e-03 396 396 3.33333333333442e-02 396 353 -4.46428571428572e-03 396 354 4.76190476189938e-03 396 355 -8.67361737988404e-19 396 356 -4.16666666666397e-03 396 357 4.46428571428572e-03 396 394 -1.30952380952435e-02 396 395 -4.33680868994202e-19 396 352 -4.16666666666397e-03 396 397 -3.46944695195361e-18 396 398 -1.30952380952435e-02 396 399 -1.30104260698261e-18 396 436 -4.16666666666397e-03 396 437 4.46428571428572e-03 396 438 4.76190476189937e-03 396 439 3.90312782094782e-18 396 440 -4.16666666666397e-03 396 441 -4.46428571428571e-03 397 397 3.33333333333441e-02 397 353 -4.16666666666396e-03 397 354 8.67361737988404e-19 397 355 -1.30952380952435e-02 397 356 4.46428571428572e-03 397 357 -4.16666666666396e-03 397 394 -1.73472347597681e-18 397 395 4.76190476189935e-03 397 396 -4.33680868994202e-18 397 352 -4.46428571428572e-03 397 398 -1.30104260698261e-18 397 399 4.76190476189935e-03 397 436 4.46428571428572e-03 397 437 -4.16666666666397e-03 397 438 3.46944695195361e-18 397 439 -1.30952380952435e-02 397 440 -4.46428571428571e-03 397 441 -4.16666666666397e-03 398 398 3.33333333333442e-02 398 355 -4.46428571428572e-03 398 356 4.76190476189938e-03 398 357 0.00000000000000e+00 398 358 -4.16666666666397e-03 398 359 4.46428571428572e-03 398 396 -1.30952380952435e-02 398 397 -4.33680868994202e-19 398 354 -4.16666666666397e-03 398 399 -4.33680868994202e-18 398 400 -1.30952380952435e-02 398 401 -1.73472347597681e-18 398 438 -4.16666666666397e-03 398 439 4.46428571428572e-03 398 440 4.76190476189936e-03 398 441 2.60208521396521e-18 398 442 -4.16666666666396e-03 398 443 -4.46428571428571e-03 399 399 3.33333333333441e-02 399 355 -4.16666666666396e-03 399 356 8.67361737988404e-19 399 357 -1.30952380952435e-02 399 358 4.46428571428572e-03 399 359 -4.16666666666396e-03 399 396 -1.30104260698261e-18 399 397 4.76190476189935e-03 399 398 -5.20417042793042e-18 399 354 -4.46428571428572e-03 399 400 -8.67361737988404e-19 399 401 4.76190476189936e-03 399 438 4.46428571428572e-03 399 439 -4.16666666666397e-03 399 440 3.46944695195361e-18 399 441 -1.30952380952435e-02 399 442 -4.46428571428571e-03 399 443 -4.16666666666397e-03 400 400 3.33333333333441e-02 400 357 -4.46428571428572e-03 400 358 4.76190476189936e-03 400 359 -1.30104260698261e-18 400 360 -4.16666666666396e-03 400 361 4.46428571428572e-03 400 398 -1.30952380952435e-02 400 399 -8.67361737988404e-19 400 356 -4.16666666666397e-03 400 401 -4.33680868994202e-18 400 402 -1.30952380952435e-02 400 403 -8.67361737988404e-19 400 440 -4.16666666666397e-03 400 441 4.46428571428572e-03 400 442 4.76190476189935e-03 400 443 3.46944695195361e-18 400 444 -4.16666666666396e-03 400 445 -4.46428571428572e-03 401 401 3.33333333333442e-02 401 357 -4.16666666666396e-03 401 358 -4.33680868994202e-19 401 359 -1.30952380952435e-02 401 360 4.46428571428572e-03 401 361 -4.16666666666397e-03 401 398 -2.16840434497101e-18 401 399 4.76190476189936e-03 401 400 -2.60208521396521e-18 401 356 -4.46428571428572e-03 401 402 -1.30104260698261e-18 401 403 4.76190476189938e-03 401 440 4.46428571428572e-03 401 441 -4.16666666666397e-03 401 442 3.90312782094782e-18 401 443 -1.30952380952435e-02 401 444 -4.46428571428571e-03 401 445 -4.16666666666397e-03 402 402 3.33333333333441e-02 402 359 -4.46428571428572e-03 402 360 4.76190476189936e-03 402 361 -4.33680868994202e-19 402 362 -4.16666666666397e-03 402 363 4.46428571428571e-03 402 400 -1.30952380952435e-02 402 401 -8.67361737988404e-19 402 358 -4.16666666666396e-03 402 403 -4.33680868994202e-18 402 404 -1.30952380952435e-02 402 405 -4.33680868994202e-19 402 442 -4.16666666666396e-03 402 443 4.46428571428572e-03 402 444 4.76190476189935e-03 402 445 3.90312782094782e-18 402 446 -4.16666666666396e-03 402 447 -4.46428571428571e-03 403 403 3.33333333333442e-02 403 359 -4.16666666666397e-03 403 360 8.67361737988404e-19 403 361 -1.30952380952435e-02 403 362 4.46428571428572e-03 403 363 -4.16666666666396e-03 403 400 -8.67361737988404e-19 403 401 4.76190476189938e-03 403 402 -3.46944695195361e-18 403 358 -4.46428571428572e-03 403 404 -1.30104260698261e-18 403 405 4.76190476189936e-03 403 442 4.46428571428572e-03 403 443 -4.16666666666398e-03 403 444 3.90312782094782e-18 403 445 -1.30952380952435e-02 403 446 -4.46428571428572e-03 403 447 -4.16666666666397e-03 404 404 3.33333333333442e-02 404 361 -4.46428571428572e-03 404 362 4.76190476189938e-03 404 363 -8.67361737988404e-19 404 364 -4.16666666666397e-03 404 365 4.46428571428572e-03 404 402 -1.30952380952435e-02 404 403 -1.30104260698261e-18 404 360 -4.16666666666397e-03 404 405 -5.20417042793042e-18 404 406 -1.30952380952435e-02 404 407 -1.30104260698261e-18 404 444 -4.16666666666397e-03 404 445 4.46428571428572e-03 404 446 4.76190476189936e-03 404 447 4.33680868994202e-18 404 448 -4.16666666666397e-03 404 449 -4.46428571428571e-03 405 405 3.33333333333441e-02 405 361 -4.16666666666396e-03 405 362 4.33680868994202e-19 405 363 -1.30952380952435e-02 405 364 4.46428571428572e-03 405 365 -4.16666666666396e-03 405 402 -1.30104260698261e-18 405 403 4.76190476189936e-03 405 404 -4.33680868994202e-18 405 360 -4.46428571428572e-03 405 406 -1.30104260698261e-18 405 407 4.76190476189935e-03 405 444 4.46428571428572e-03 405 445 -4.16666666666397e-03 405 446 3.46944695195361e-18 405 447 -1.30952380952435e-02 405 448 -4.46428571428571e-03 405 449 -4.16666666666397e-03 406 406 3.33333333333442e-02 406 363 -4.46428571428572e-03 406 364 4.76190476189938e-03 406 365 -1.30104260698261e-18 406 366 -4.16666666666397e-03 406 367 4.46428571428571e-03 406 404 -1.30952380952435e-02 406 405 -4.33680868994202e-19 406 362 -4.16666666666397e-03 406 407 -3.46944695195361e-18 406 408 -1.30952380952435e-02 406 409 -8.67361737988404e-19 406 446 -4.16666666666397e-03 406 447 4.46428571428572e-03 406 448 4.76190476189937e-03 406 449 3.46944695195361e-18 406 450 -4.16666666666397e-03 406 451 -4.46428571428571e-03 407 407 3.33333333333441e-02 407 363 -4.16666666666396e-03 407 364 4.33680868994202e-19 407 365 -1.30952380952435e-02 407 366 4.46428571428572e-03 407 367 -4.16666666666396e-03 407 404 -1.30104260698261e-18 407 405 4.76190476189935e-03 407 406 -3.46944695195361e-18 407 362 -4.46428571428572e-03 407 408 -8.67361737988404e-19 407 409 4.76190476189935e-03 407 446 4.46428571428572e-03 407 447 -4.16666666666397e-03 407 448 3.90312782094782e-18 407 449 -1.30952380952435e-02 407 450 -4.46428571428572e-03 407 451 -4.16666666666396e-03 408 408 1.17051282051320e+00 408 365 -4.46428571428572e-03 408 366 9.85347985346088e-02 408 367 4.53983516483517e-02 408 368 -2.88461538461351e-01 408 369 2.40384615384615e-01 408 406 -1.30952380952435e-02 408 407 -4.33680868994202e-19 408 364 -4.16666666666397e-03 408 409 -1.11022302462516e-16 408 410 -7.69230769231143e-01 408 411 -5.55111512312578e-17 408 448 -4.16666666666397e-03 408 449 4.46428571428572e-03 408 450 9.85347985346083e-02 408 451 -4.53983516483515e-02 408 452 -2.88461538461351e-01 408 453 -2.40384615384615e-01 409 409 1.17051282051320e+00 409 365 -4.16666666666396e-03 409 366 -4.53983516483516e-02 409 367 -3.91163003663193e-01 409 368 2.40384615384615e-01 409 369 -2.88461538461351e-01 409 406 -1.30104260698261e-18 409 407 4.76190476189935e-03 409 408 -1.11022302462516e-16 409 364 -4.46428571428572e-03 409 410 -3.46944695195361e-17 409 411 1.92307692307319e-01 409 448 4.46428571428572e-03 409 449 -4.16666666666396e-03 409 450 4.53983516483517e-02 409 451 -3.91163003663194e-01 409 452 -2.40384615384615e-01 409 453 -2.88461538461352e-01 410 410 2.30769230769306e+00 410 367 -2.40384615384615e-01 410 368 1.92307692307319e-01 410 369 6.93889390390723e-18 410 370 -2.88461538461352e-01 410 371 2.40384615384615e-01 410 408 -7.69230769231143e-01 410 409 -3.46944695195361e-17 410 366 -2.88461538461351e-01 410 411 -1.66533453693773e-16 410 412 -7.69230769231144e-01 410 413 -5.55111512312578e-17 410 450 -2.88461538461351e-01 410 451 2.40384615384615e-01 410 452 1.92307692307318e-01 410 453 1.66533453693773e-16 410 454 -2.88461538461351e-01 410 455 -2.40384615384615e-01 411 411 2.30769230769306e+00 411 367 -2.88461538461351e-01 411 368 6.93889390390723e-18 411 369 -7.69230769231142e-01 411 370 2.40384615384615e-01 411 371 -2.88461538461351e-01 411 408 -6.24500451351651e-17 411 409 1.92307692307319e-01 411 410 -1.66533453693773e-16 411 366 -2.40384615384615e-01 411 412 -6.93889390390723e-18 411 413 1.92307692307318e-01 411 450 2.40384615384615e-01 411 451 -2.88461538461352e-01 411 452 1.94289029309402e-16 411 453 -7.69230769231144e-01 411 454 -2.40384615384615e-01 411 455 -2.88461538461351e-01 412 412 2.30769230769306e+00 412 369 -2.40384615384615e-01 412 370 1.92307692307320e-01 412 371 3.46944695195361e-17 412 372 -2.88461538461352e-01 412 373 2.40384615384615e-01 412 410 -7.69230769231144e-01 412 411 -3.46944695195361e-17 412 368 -2.88461538461352e-01 412 413 -1.94289029309402e-16 412 414 -7.69230769231147e-01 412 415 -6.93889390390723e-17 412 452 -2.88461538461352e-01 412 453 2.40384615384615e-01 412 454 1.92307692307319e-01 412 455 1.80411241501588e-16 412 456 -2.88461538461352e-01 412 457 -2.40384615384615e-01 413 413 2.30769230769305e+00 413 369 -2.88461538461351e-01 413 370 -1.38777878078145e-17 413 371 -7.69230769231140e-01 413 372 2.40384615384615e-01 413 373 -2.88461538461351e-01 413 410 -7.63278329429795e-17 413 411 1.92307692307318e-01 413 412 -1.38777878078145e-16 413 368 -2.40384615384615e-01 413 414 -2.08166817117217e-17 413 415 1.92307692307316e-01 413 452 2.40384615384615e-01 413 453 -2.88461538461351e-01 413 454 2.01227923213310e-16 413 455 -7.69230769231142e-01 413 456 -2.40384615384615e-01 413 457 -2.88461538461351e-01 414 414 2.30769230769306e+00 414 371 -2.40384615384615e-01 414 372 1.92307692307320e-01 414 373 -2.08166817117217e-17 414 374 -2.88461538461351e-01 414 375 2.40384615384615e-01 414 412 -7.69230769231147e-01 414 413 -4.85722573273506e-17 414 370 -2.88461538461352e-01 414 415 -1.94289029309402e-16 414 416 -7.69230769231142e-01 414 417 -6.93889390390723e-17 414 454 -2.88461538461352e-01 414 455 2.40384615384615e-01 414 456 1.92307692307319e-01 414 457 2.01227923213310e-16 414 458 -2.88461538461351e-01 414 459 -2.40384615384615e-01 415 415 2.30769230769305e+00 415 371 -2.88461538461351e-01 415 372 0.00000000000000e+00 415 373 -7.69230769231141e-01 415 374 2.40384615384615e-01 415 375 -2.88461538461352e-01 415 412 -6.24500451351651e-17 415 413 1.92307692307316e-01 415 414 -1.66533453693773e-16 415 370 -2.40384615384615e-01 415 416 -3.46944695195361e-17 415 417 1.92307692307319e-01 415 454 2.40384615384615e-01 415 455 -2.88461538461351e-01 415 456 1.87350135405495e-16 415 457 -7.69230769231142e-01 415 458 -2.40384615384615e-01 415 459 -2.88461538461352e-01 416 416 2.30769230769305e+00 416 373 -2.40384615384615e-01 416 374 1.92307692307318e-01 416 375 -2.08166817117217e-17 416 376 -2.88461538461351e-01 416 377 2.40384615384615e-01 416 414 -7.69230769231142e-01 416 415 -2.08166817117217e-17 416 372 -2.88461538461351e-01 416 417 -1.66533453693773e-16 416 418 -7.69230769231143e-01 416 419 -5.55111512312578e-17 416 456 -2.88461538461351e-01 416 457 2.40384615384615e-01 416 458 1.92307692307317e-01 416 459 1.80411241501588e-16 416 460 -2.88461538461351e-01 416 461 -2.40384615384615e-01 417 417 2.30769230769306e+00 417 373 -2.88461538461352e-01 417 374 1.38777878078145e-17 417 375 -7.69230769231144e-01 417 376 2.40384615384615e-01 417 377 -2.88461538461351e-01 417 414 -4.85722573273506e-17 417 415 1.92307692307319e-01 417 416 -2.22044604925031e-16 417 372 -2.40384615384615e-01 417 418 -3.46944695195361e-17 417 419 1.92307692307319e-01 417 456 2.40384615384615e-01 417 457 -2.88461538461352e-01 417 458 1.94289029309402e-16 417 459 -7.69230769231145e-01 417 460 -2.40384615384615e-01 417 461 -2.88461538461352e-01 418 418 2.30769230769306e+00 418 375 -2.40384615384615e-01 418 376 1.92307692307319e-01 418 377 2.08166817117217e-17 418 416 -7.69230769231143e-01 418 417 -3.46944695195361e-17 418 374 -2.88461538461351e-01 418 419 -1.94289029309402e-16 418 458 -2.88461538461351e-01 418 459 2.40384615384615e-01 418 460 1.92307692307318e-01 418 461 1.94289029309402e-16 419 419 2.30769230769305e+00 419 375 -2.88461538461351e-01 419 376 2.77555756156289e-17 419 377 -7.69230769231142e-01 419 416 -6.24500451351651e-17 419 417 1.92307692307319e-01 419 418 -1.94289029309402e-16 419 374 -2.40384615384615e-01 419 458 2.40384615384615e-01 419 459 -2.88461538461352e-01 419 460 1.94289029309402e-16 419 461 -7.69230769231143e-01 420 420 2.03703703703770e-06 420 379 1.32348898008484e-22 420 380 -2.54629629629465e-07 420 381 1.73611111111111e-07 420 378 9.25925925922626e-08 420 421 7.94093388050907e-23 420 422 -6.01851851852182e-07 420 423 1.98523347012727e-23 420 462 9.25925925922621e-08 420 463 -2.44845461315696e-22 420 464 -2.54629629629465e-07 420 465 -1.73611111111111e-07 421 421 2.03703703703770e-06 421 379 -6.01851851852182e-07 421 380 1.73611111111111e-07 421 381 -2.54629629629465e-07 421 420 2.64697796016969e-23 421 378 1.52201232709757e-22 421 422 5.29395592033938e-23 421 423 9.25925925922628e-08 421 462 -2.18375681713999e-22 421 463 -6.01851851852183e-07 421 464 -1.73611111111111e-07 421 465 -2.54629629629465e-07 422 422 2.03703703703770e-06 422 379 -1.73611111111111e-07 422 380 9.25925925922626e-08 422 381 1.32348898008484e-22 422 382 -2.54629629629465e-07 422 383 1.73611111111111e-07 422 420 -6.01851851852182e-07 422 421 5.29395592033938e-23 422 378 -2.54629629629464e-07 422 423 7.94093388050907e-23 422 424 -6.01851851852182e-07 422 425 1.98523347012727e-23 422 462 -2.54629629629464e-07 422 463 1.73611111111111e-07 422 464 9.25925925922621e-08 422 465 -2.44845461315696e-22 422 466 -2.54629629629465e-07 422 467 -1.73611111111111e-07 423 423 2.03703703703770e-06 423 379 -2.54629629629465e-07 423 380 1.52201232709757e-22 423 381 -6.01851851852182e-07 423 382 1.73611111111111e-07 423 383 -2.54629629629465e-07 423 420 6.61744490042422e-24 423 421 9.25925925922628e-08 423 422 2.64697796016969e-23 423 378 -1.73611111111111e-07 423 424 5.29395592033938e-23 423 425 9.25925925922628e-08 423 462 1.73611111111111e-07 423 463 -2.54629629629465e-07 423 464 -2.18375681713999e-22 423 465 -6.01851851852183e-07 423 466 -1.73611111111111e-07 423 467 -2.54629629629465e-07 424 424 2.03703703703770e-06 424 381 -1.73611111111111e-07 424 382 9.25925925922625e-08 424 383 1.32348898008484e-22 424 384 -2.54629629629465e-07 424 385 1.73611111111111e-07 424 422 -6.01851851852182e-07 424 423 5.29395592033938e-23 424 380 -2.54629629629464e-07 424 425 2.64697796016969e-23 424 426 -6.01851851852181e-07 424 427 1.98523347012727e-23 424 464 -2.54629629629464e-07 424 465 1.73611111111111e-07 424 466 9.25925925922620e-08 424 467 -2.58080351116545e-22 424 468 -2.54629629629465e-07 424 469 -1.73611111111111e-07 425 425 2.03703703703770e-06 425 381 -2.54629629629465e-07 425 382 1.45583787809333e-22 425 383 -6.01851851852182e-07 425 384 1.73611111111111e-07 425 385 -2.54629629629465e-07 425 422 6.61744490042422e-24 425 423 9.25925925922628e-08 425 424 2.64697796016969e-23 425 380 -1.73611111111111e-07 425 426 2.64697796016969e-23 425 427 9.25925925922630e-08 425 464 1.73611111111111e-07 425 465 -2.54629629629465e-07 425 466 -2.18375681713999e-22 425 467 -6.01851851852183e-07 425 468 -1.73611111111111e-07 425 469 -2.54629629629465e-07 426 426 2.03703703703770e-06 426 383 -1.73611111111111e-07 426 384 9.25925925922624e-08 426 385 1.38966342908909e-22 426 386 -2.54629629629465e-07 426 387 1.73611111111111e-07 426 424 -6.01851851852181e-07 426 425 1.32348898008484e-23 426 382 -2.54629629629464e-07 426 427 1.05879118406788e-22 426 428 -6.01851851852181e-07 426 429 1.98523347012727e-23 426 466 -2.54629629629464e-07 426 467 1.73611111111111e-07 426 468 9.25925925922619e-08 426 469 -2.18375681713999e-22 426 470 -2.54629629629465e-07 426 471 -1.73611111111111e-07 427 427 2.03703703703770e-06 427 383 -2.54629629629465e-07 427 384 1.52201232709757e-22 427 385 -6.01851851852182e-07 427 386 1.73611111111111e-07 427 387 -2.54629629629465e-07 427 424 1.98523347012727e-23 427 425 9.25925925922630e-08 427 426 1.05879118406788e-22 427 382 -1.73611111111111e-07 427 428 3.97046694025453e-23 427 429 9.25925925922631e-08 427 466 1.73611111111111e-07 427 467 -2.54629629629465e-07 427 468 -2.24993126614424e-22 427 469 -6.01851851852183e-07 427 470 -1.73611111111111e-07 427 471 -2.54629629629465e-07 428 428 2.03703703703770e-06 428 385 -1.73611111111111e-07 428 386 9.25925925922626e-08 428 387 1.32348898008484e-22 428 388 -2.54629629629465e-07 428 389 1.73611111111111e-07 428 426 -6.01851851852181e-07 428 427 2.64697796016969e-23 428 384 -2.54629629629464e-07 428 429 5.29395592033938e-23 428 430 -6.01851851852182e-07 428 431 1.98523347012727e-23 428 468 -2.54629629629464e-07 428 469 1.73611111111111e-07 428 470 9.25925925922621e-08 428 471 -2.18375681713999e-22 428 472 -2.54629629629465e-07 428 473 -1.73611111111111e-07 429 429 2.03703703703770e-06 429 385 -2.54629629629465e-07 429 386 1.52201232709757e-22 429 387 -6.01851851852182e-07 429 388 1.73611111111111e-07 429 389 -2.54629629629465e-07 429 426 6.61744490042422e-24 429 427 9.25925925922631e-08 429 428 5.29395592033938e-23 429 384 -1.73611111111111e-07 429 430 1.32348898008484e-23 429 431 9.25925925922626e-08 429 468 1.73611111111111e-07 429 469 -2.54629629629465e-07 429 470 -2.24993126614424e-22 429 471 -6.01851851852183e-07 429 472 -1.73611111111111e-07 429 473 -2.54629629629465e-07 430 430 2.03703703703770e-06 430 387 -1.73611111111111e-07 430 388 9.25925925922624e-08 430 389 1.65436122510606e-22 430 390 -2.54629629629465e-07 430 391 1.73611111111111e-07 430 428 -6.01851851852182e-07 430 429 2.64697796016969e-23 430 386 -2.54629629629465e-07 430 431 5.29395592033938e-23 430 432 -6.01851851852181e-07 430 433 6.61744490042422e-24 430 470 -2.54629629629464e-07 430 471 1.73611111111111e-07 430 472 9.25925925922619e-08 430 473 -2.31610571514848e-22 430 474 -2.54629629629465e-07 430 475 -1.73611111111111e-07 431 431 2.03703703703770e-06 431 387 -2.54629629629465e-07 431 388 1.19114008207636e-22 431 389 -6.01851851852182e-07 431 390 1.73611111111111e-07 431 391 -2.54629629629465e-07 431 428 6.61744490042422e-24 431 429 9.25925925922625e-08 431 430 7.94093388050907e-23 431 386 -1.73611111111111e-07 431 432 4.63221143029695e-23 431 433 9.25925925922634e-08 431 470 1.73611111111111e-07 431 471 -2.54629629629465e-07 431 472 -2.18375681713999e-22 431 473 -6.01851851852183e-07 431 474 -1.73611111111111e-07 431 475 -2.54629629629465e-07 432 432 2.03703703703770e-06 432 389 -1.73611111111111e-07 432 390 9.25925925922626e-08 432 391 1.32348898008484e-22 432 392 -2.54629629629465e-07 432 393 1.73611111111111e-07 432 430 -6.01851851852181e-07 432 431 2.64697796016969e-23 432 388 -2.54629629629464e-07 432 433 7.94093388050907e-23 432 434 -6.01851851852183e-07 432 435 1.32348898008484e-23 432 472 -2.54629629629464e-07 432 473 1.73611111111111e-07 432 474 9.25925925922621e-08 432 475 -2.24993126614424e-22 432 476 -2.54629629629465e-07 432 477 -1.73611111111111e-07 433 433 2.03703703703770e-06 433 389 -2.54629629629465e-07 433 390 1.25731453108060e-22 433 391 -6.01851851852182e-07 433 392 1.73611111111111e-07 433 393 -2.54629629629465e-07 433 430 2.64697796016969e-23 433 431 9.25925925922634e-08 433 432 7.94093388050907e-23 433 388 -1.73611111111111e-07 433 434 3.30872245021211e-23 433 435 9.25925925922622e-08 433 472 1.73611111111111e-07 433 473 -2.54629629629465e-07 433 474 -2.24993126614424e-22 433 475 -6.01851851852183e-07 433 476 -1.73611111111111e-07 433 477 -2.54629629629465e-07 434 434 1.66676851851906e-02 434 391 -1.73611111111111e-07 434 392 2.38099867724597e-03 434 393 2.67860615079365e-03 434 394 -4.16666666666397e-03 434 395 4.46428571428572e-03 434 432 -6.01851851852183e-07 434 433 -1.32348898008484e-23 434 390 -2.54629629629465e-07 434 435 8.67361737988404e-19 434 436 -1.30952380952435e-02 434 437 8.67361737988404e-19 434 474 -2.54629629629464e-07 434 475 1.73611111111111e-07 434 476 2.38099867724596e-03 434 477 -2.67860615079365e-03 434 478 -4.16666666666397e-03 434 479 -4.46428571428572e-03 435 435 1.66676851851906e-02 435 391 -2.54629629629464e-07 435 392 -2.67860615079365e-03 435 393 -6.54791997354769e-03 435 394 4.46428571428572e-03 435 395 -4.16666666666397e-03 435 432 1.32348898008484e-23 435 433 9.25925925922622e-08 435 434 8.67361737988404e-19 435 390 -1.73611111111111e-07 435 436 0.00000000000000e+00 435 437 4.76190476189938e-03 435 474 1.73611111111111e-07 435 475 -2.54629629629465e-07 435 476 2.67860615079365e-03 435 477 -6.54791997354769e-03 435 478 -4.46428571428572e-03 435 479 -4.16666666666397e-03 436 436 3.33333333333441e-02 436 393 -4.46428571428571e-03 436 394 4.76190476189936e-03 436 395 3.46944695195361e-18 436 396 -4.16666666666397e-03 436 397 4.46428571428572e-03 436 434 -1.30952380952435e-02 436 435 0.00000000000000e+00 436 392 -4.16666666666396e-03 436 437 1.73472347597681e-18 436 438 -1.30952380952435e-02 436 439 8.67361737988404e-19 436 476 -4.16666666666396e-03 436 477 4.46428571428571e-03 436 478 4.76190476189935e-03 436 479 -4.77048955893622e-18 436 480 -4.16666666666397e-03 436 481 -4.46428571428572e-03 437 437 3.33333333333442e-02 437 393 -4.16666666666397e-03 437 394 3.46944695195361e-18 437 395 -1.30952380952435e-02 437 396 4.46428571428572e-03 437 397 -4.16666666666397e-03 437 434 8.67361737988404e-19 437 435 4.76190476189938e-03 437 436 1.73472347597681e-18 437 392 -4.46428571428571e-03 437 438 0.00000000000000e+00 437 439 4.76190476189936e-03 437 476 4.46428571428571e-03 437 477 -4.16666666666397e-03 437 478 -5.20417042793042e-18 437 479 -1.30952380952435e-02 437 480 -4.46428571428572e-03 437 481 -4.16666666666397e-03 438 438 3.33333333333442e-02 438 395 -4.46428571428571e-03 438 396 4.76190476189937e-03 438 397 3.46944695195361e-18 438 398 -4.16666666666397e-03 438 399 4.46428571428572e-03 438 436 -1.30952380952435e-02 438 437 8.67361737988404e-19 438 394 -4.16666666666397e-03 438 439 8.67361737988404e-19 438 440 -1.30952380952435e-02 438 441 8.67361737988404e-19 438 478 -4.16666666666396e-03 438 479 4.46428571428571e-03 438 480 4.76190476189936e-03 438 481 -5.63785129692462e-18 438 482 -4.16666666666397e-03 438 483 -4.46428571428572e-03 439 439 3.33333333333441e-02 439 395 -4.16666666666396e-03 439 396 3.46944695195361e-18 439 397 -1.30952380952435e-02 439 398 4.46428571428572e-03 439 399 -4.16666666666397e-03 439 436 8.67361737988404e-19 439 437 4.76190476189936e-03 439 438 8.67361737988404e-19 439 394 -4.46428571428571e-03 439 440 8.67361737988404e-19 439 441 4.76190476189936e-03 439 478 4.46428571428571e-03 439 479 -4.16666666666397e-03 439 480 -6.07153216591882e-18 439 481 -1.30952380952435e-02 439 482 -4.46428571428572e-03 439 483 -4.16666666666397e-03 440 440 3.33333333333441e-02 440 397 -4.46428571428571e-03 440 398 4.76190476189936e-03 440 399 3.46944695195361e-18 440 400 -4.16666666666397e-03 440 401 4.46428571428572e-03 440 438 -1.30952380952435e-02 440 439 8.67361737988404e-19 440 396 -4.16666666666397e-03 440 441 8.67361737988404e-19 440 442 -1.30952380952435e-02 440 443 1.30104260698261e-18 440 480 -4.16666666666396e-03 440 481 4.46428571428571e-03 440 482 4.76190476189936e-03 440 483 -5.63785129692462e-18 440 484 -4.16666666666397e-03 440 485 -4.46428571428572e-03 441 441 3.33333333333442e-02 441 397 -4.16666666666397e-03 441 398 3.46944695195361e-18 441 399 -1.30952380952435e-02 441 400 4.46428571428572e-03 441 401 -4.16666666666397e-03 441 438 8.67361737988404e-19 441 439 4.76190476189936e-03 441 440 1.73472347597681e-18 441 396 -4.46428571428571e-03 441 442 8.67361737988404e-19 441 443 4.76190476189937e-03 441 480 4.46428571428571e-03 441 481 -4.16666666666397e-03 441 482 -5.63785129692462e-18 441 483 -1.30952380952435e-02 441 484 -4.46428571428572e-03 441 485 -4.16666666666397e-03 442 442 3.33333333333441e-02 442 399 -4.46428571428571e-03 442 400 4.76190476189935e-03 442 401 4.33680868994202e-18 442 402 -4.16666666666396e-03 442 403 4.46428571428572e-03 442 440 -1.30952380952435e-02 442 441 0.00000000000000e+00 442 398 -4.16666666666396e-03 442 443 0.00000000000000e+00 442 444 -1.30952380952435e-02 442 445 1.30104260698261e-18 442 482 -4.16666666666396e-03 442 483 4.46428571428571e-03 442 484 4.76190476189934e-03 442 485 -6.07153216591882e-18 442 486 -4.16666666666396e-03 442 487 -4.46428571428572e-03 443 443 3.33333333333442e-02 443 399 -4.16666666666397e-03 443 400 3.03576608295941e-18 443 401 -1.30952380952435e-02 443 402 4.46428571428572e-03 443 403 -4.16666666666398e-03 443 440 1.30104260698261e-18 443 441 4.76190476189937e-03 443 442 0.00000000000000e+00 443 398 -4.46428571428571e-03 443 444 8.67361737988404e-19 443 445 4.76190476189939e-03 443 482 4.46428571428571e-03 443 483 -4.16666666666397e-03 443 484 -5.63785129692462e-18 443 485 -1.30952380952435e-02 443 486 -4.46428571428572e-03 443 487 -4.16666666666398e-03 444 444 3.33333333333441e-02 444 401 -4.46428571428572e-03 444 402 4.76190476189935e-03 444 403 3.90312782094782e-18 444 404 -4.16666666666397e-03 444 405 4.46428571428572e-03 444 442 -1.30952380952435e-02 444 443 4.33680868994202e-19 444 400 -4.16666666666396e-03 444 445 -8.67361737988404e-19 444 446 -1.30952380952435e-02 444 447 4.33680868994202e-19 444 484 -4.16666666666395e-03 444 485 4.46428571428571e-03 444 486 4.76190476189934e-03 444 487 -5.20417042793042e-18 444 488 -4.16666666666397e-03 444 489 -4.46428571428572e-03 445 445 3.33333333333442e-02 445 401 -4.16666666666397e-03 445 402 3.46944695195361e-18 445 403 -1.30952380952435e-02 445 404 4.46428571428572e-03 445 405 -4.16666666666397e-03 445 442 4.33680868994202e-19 445 443 4.76190476189939e-03 445 444 8.67361737988404e-19 445 400 -4.46428571428572e-03 445 446 1.30104260698261e-18 445 447 4.76190476189937e-03 445 484 4.46428571428571e-03 445 485 -4.16666666666398e-03 445 486 -6.07153216591882e-18 445 487 -1.30952380952435e-02 445 488 -4.46428571428572e-03 445 489 -4.16666666666397e-03 446 446 3.33333333333441e-02 446 403 -4.46428571428572e-03 446 404 4.76190476189936e-03 446 405 3.46944695195361e-18 446 406 -4.16666666666397e-03 446 407 4.46428571428572e-03 446 444 -1.30952380952435e-02 446 445 4.33680868994202e-19 446 402 -4.16666666666396e-03 446 447 8.67361737988404e-19 446 448 -1.30952380952435e-02 446 449 8.67361737988404e-19 446 486 -4.16666666666396e-03 446 487 4.46428571428571e-03 446 488 4.76190476189936e-03 446 489 -5.20417042793042e-18 446 490 -4.16666666666397e-03 446 491 -4.46428571428572e-03 447 447 3.33333333333442e-02 447 403 -4.16666666666397e-03 447 404 3.03576608295941e-18 447 405 -1.30952380952435e-02 447 406 4.46428571428572e-03 447 407 -4.16666666666397e-03 447 444 8.67361737988404e-19 447 445 4.76190476189937e-03 447 446 8.67361737988404e-19 447 402 -4.46428571428571e-03 447 448 8.67361737988404e-19 447 449 4.76190476189936e-03 447 486 4.46428571428571e-03 447 487 -4.16666666666397e-03 447 488 -6.07153216591882e-18 447 489 -1.30952380952435e-02 447 490 -4.46428571428572e-03 447 491 -4.16666666666397e-03 448 448 3.33333333333442e-02 448 405 -4.46428571428571e-03 448 406 4.76190476189937e-03 448 407 3.46944695195361e-18 448 408 -4.16666666666397e-03 448 409 4.46428571428572e-03 448 446 -1.30952380952435e-02 448 447 8.67361737988404e-19 448 404 -4.16666666666397e-03 448 449 2.60208521396521e-18 448 450 -1.30952380952435e-02 448 451 8.67361737988404e-19 448 488 -4.16666666666396e-03 448 489 4.46428571428571e-03 448 490 4.76190476189936e-03 448 491 -5.63785129692462e-18 448 492 -4.16666666666397e-03 448 493 -4.46428571428572e-03 449 449 3.33333333333441e-02 449 405 -4.16666666666397e-03 449 406 3.46944695195361e-18 449 407 -1.30952380952435e-02 449 408 4.46428571428572e-03 449 409 -4.16666666666397e-03 449 446 8.67361737988404e-19 449 447 4.76190476189936e-03 449 448 8.67361737988404e-19 449 404 -4.46428571428571e-03 449 450 1.30104260698261e-18 449 451 4.76190476189936e-03 449 488 4.46428571428571e-03 449 489 -4.16666666666397e-03 449 490 -6.07153216591882e-18 449 491 -1.30952380952435e-02 449 492 -4.46428571428572e-03 449 493 -4.16666666666397e-03 450 450 1.17051282051320e+00 450 407 -4.46428571428571e-03 450 408 9.85347985346083e-02 450 409 4.53983516483518e-02 450 410 -2.88461538461351e-01 450 411 2.40384615384615e-01 450 448 -1.30952380952435e-02 450 449 1.30104260698261e-18 450 406 -4.16666666666397e-03 450 451 8.32667268468867e-17 450 452 -7.69230769231142e-01 450 453 3.46944695195361e-17 450 490 -4.16666666666396e-03 450 491 4.46428571428571e-03 450 492 9.85347985346079e-02 450 493 -4.53983516483518e-02 450 494 -2.88461538461352e-01 450 495 -2.40384615384615e-01 451 451 1.17051282051320e+00 451 407 -4.16666666666396e-03 451 408 -4.53983516483515e-02 451 409 -3.91163003663194e-01 451 410 2.40384615384615e-01 451 411 -2.88461538461352e-01 451 448 8.67361737988404e-19 451 449 4.76190476189936e-03 451 450 1.11022302462516e-16 451 406 -4.46428571428571e-03 451 452 0.00000000000000e+00 451 453 1.92307692307319e-01 451 490 4.46428571428571e-03 451 491 -4.16666666666397e-03 451 492 4.53983516483515e-02 451 493 -3.91163003663194e-01 451 494 -2.40384615384616e-01 451 495 -2.88461538461352e-01 452 452 2.30769230769305e+00 452 409 -2.40384615384615e-01 452 410 1.92307692307318e-01 452 411 1.87350135405495e-16 452 412 -2.88461538461352e-01 452 413 2.40384615384615e-01 452 450 -7.69230769231142e-01 452 451 2.08166817117217e-17 452 408 -2.88461538461351e-01 452 453 1.11022302462516e-16 452 454 -7.69230769231143e-01 452 455 6.24500451351651e-17 452 492 -2.88461538461351e-01 452 493 2.40384615384615e-01 452 494 1.92307692307318e-01 452 495 -2.84494650060196e-16 452 496 -2.88461538461352e-01 452 497 -2.40384615384615e-01 453 453 2.30769230769306e+00 453 409 -2.88461538461352e-01 453 410 2.22044604925031e-16 453 411 -7.69230769231144e-01 453 412 2.40384615384615e-01 453 413 -2.88461538461351e-01 453 450 1.38777878078145e-17 453 451 1.92307692307319e-01 453 452 1.11022302462516e-16 453 408 -2.40384615384615e-01 453 454 2.08166817117217e-17 453 455 1.92307692307318e-01 453 492 2.40384615384615e-01 453 493 -2.88461538461352e-01 453 494 -2.98372437868011e-16 453 495 -7.69230769231144e-01 453 496 -2.40384615384615e-01 453 497 -2.88461538461352e-01 454 454 2.30769230769306e+00 454 411 -2.40384615384615e-01 454 412 1.92307692307319e-01 454 413 2.01227923213310e-16 454 414 -2.88461538461352e-01 454 415 2.40384615384615e-01 454 452 -7.69230769231143e-01 454 453 2.08166817117217e-17 454 410 -2.88461538461351e-01 454 455 1.66533453693773e-16 454 456 -7.69230769231146e-01 454 457 2.77555756156289e-17 454 494 -2.88461538461351e-01 454 495 2.40384615384615e-01 454 496 1.92307692307319e-01 454 497 -3.05311331771918e-16 454 498 -2.88461538461352e-01 454 499 -2.40384615384615e-01 455 455 2.30769230769305e+00 455 411 -2.88461538461351e-01 455 412 1.73472347597681e-16 455 413 -7.69230769231142e-01 455 414 2.40384615384615e-01 455 415 -2.88461538461351e-01 455 452 6.24500451351651e-17 455 453 1.92307692307318e-01 455 454 1.38777878078145e-16 455 410 -2.40384615384615e-01 455 456 6.93889390390723e-18 455 457 1.92307692307316e-01 455 494 2.40384615384615e-01 455 495 -2.88461538461351e-01 455 496 -3.33066907387547e-16 455 497 -7.69230769231142e-01 455 498 -2.40384615384615e-01 455 499 -2.88461538461351e-01 456 456 2.30769230769306e+00 456 413 -2.40384615384615e-01 456 414 1.92307692307319e-01 456 415 1.94289029309402e-16 456 416 -2.88461538461351e-01 456 417 2.40384615384615e-01 456 454 -7.69230769231146e-01 456 455 -1.38777878078145e-17 456 412 -2.88461538461352e-01 456 457 1.66533453693773e-16 456 458 -7.69230769231141e-01 456 459 4.16333634234434e-17 456 496 -2.88461538461352e-01 456 497 2.40384615384615e-01 456 498 1.92307692307318e-01 456 499 -3.05311331771918e-16 456 500 -2.88461538461351e-01 456 501 -2.40384615384615e-01 457 457 2.30769230769306e+00 457 413 -2.88461538461351e-01 457 414 1.87350135405495e-16 457 415 -7.69230769231142e-01 457 416 2.40384615384615e-01 457 417 -2.88461538461352e-01 457 454 2.77555756156289e-17 457 455 1.92307692307316e-01 457 456 1.66533453693773e-16 457 412 -2.40384615384615e-01 457 458 0.00000000000000e+00 457 459 1.92307692307320e-01 457 496 2.40384615384615e-01 457 497 -2.88461538461351e-01 457 498 -2.84494650060196e-16 457 499 -7.69230769231143e-01 457 500 -2.40384615384616e-01 457 501 -2.88461538461352e-01 458 458 2.30769230769305e+00 458 415 -2.40384615384615e-01 458 416 1.92307692307317e-01 458 417 2.01227923213310e-16 458 418 -2.88461538461351e-01 458 419 2.40384615384615e-01 458 456 -7.69230769231141e-01 458 457 6.93889390390723e-18 458 414 -2.88461538461351e-01 458 459 1.38777878078145e-16 458 460 -7.69230769231142e-01 458 461 3.46944695195361e-17 458 498 -2.88461538461351e-01 458 499 2.40384615384615e-01 458 500 1.92307692307317e-01 458 501 -3.19189119579733e-16 458 502 -2.88461538461352e-01 458 503 -2.40384615384615e-01 459 459 2.30769230769306e+00 459 415 -2.88461538461352e-01 459 416 1.94289029309402e-16 459 417 -7.69230769231145e-01 459 418 2.40384615384615e-01 459 419 -2.88461538461352e-01 459 456 6.93889390390723e-18 459 457 1.92307692307320e-01 459 458 2.22044604925031e-16 459 414 -2.40384615384615e-01 459 460 0.00000000000000e+00 459 461 1.92307692307319e-01 459 498 2.40384615384615e-01 459 499 -2.88461538461352e-01 459 500 -3.12250225675825e-16 459 501 -7.69230769231146e-01 459 502 -2.40384615384616e-01 459 503 -2.88461538461352e-01 460 460 2.30769230769306e+00 460 417 -2.40384615384615e-01 460 418 1.92307692307318e-01 460 419 2.01227923213310e-16 460 458 -7.69230769231142e-01 460 459 2.08166817117217e-17 460 416 -2.88461538461351e-01 460 461 8.32667268468867e-17 460 500 -2.88461538461351e-01 460 501 2.40384615384615e-01 460 502 1.92307692307318e-01 460 503 -2.77555756156289e-16 461 461 2.30769230769306e+00 461 417 -2.88461538461352e-01 461 418 2.49800180540660e-16 461 419 -7.69230769231143e-01 461 458 1.38777878078145e-17 461 459 1.92307692307319e-01 461 460 8.32667268468867e-17 461 416 -2.40384615384615e-01 461 500 2.40384615384615e-01 461 501 -2.88461538461352e-01 461 502 -2.84494650060196e-16 461 503 -7.69230769231144e-01 462 462 2.03703703703770e-06 462 421 -2.11758236813575e-22 462 422 -2.54629629629464e-07 462 423 1.73611111111111e-07 462 420 9.25925925922621e-08 462 463 3.44107134822060e-22 462 464 -6.01851851852182e-07 462 465 1.05879118406788e-22 462 504 9.25925925922622e-08 462 505 -1.52201232709757e-22 462 506 -2.54629629629465e-07 462 507 -1.73611111111111e-07 463 463 2.03703703703770e-06 463 421 -6.01851851852183e-07 463 422 1.73611111111111e-07 463 423 -2.54629629629465e-07 463 462 3.44107134822060e-22 463 420 -2.38228016415272e-22 463 464 9.26442286059391e-23 463 465 9.25925925922629e-08 463 504 -1.25731453108060e-22 463 505 -6.01851851852183e-07 463 506 -1.73611111111111e-07 463 507 -2.54629629629465e-07 464 464 2.03703703703770e-06 464 421 -1.73611111111111e-07 464 422 9.25925925922621e-08 464 423 -2.11758236813575e-22 464 424 -2.54629629629464e-07 464 425 1.73611111111111e-07 464 462 -6.01851851852182e-07 464 463 1.05879118406788e-22 464 420 -2.54629629629465e-07 464 465 3.44107134822060e-22 464 466 -6.01851851852182e-07 464 467 1.05879118406788e-22 464 504 -2.54629629629464e-07 464 505 1.73611111111111e-07 464 506 9.25925925922622e-08 464 507 -1.52201232709757e-22 464 508 -2.54629629629465e-07 464 509 -1.73611111111111e-07 465 465 2.03703703703770e-06 465 421 -2.54629629629465e-07 465 422 -2.38228016415272e-22 465 423 -6.01851851852183e-07 465 424 1.73611111111111e-07 465 425 -2.54629629629465e-07 465 462 1.38966342908909e-22 465 463 9.25925925922629e-08 465 464 3.44107134822060e-22 465 420 -1.73611111111111e-07 465 466 9.26442286059391e-23 465 467 9.25925925922629e-08 465 504 1.73611111111111e-07 465 505 -2.54629629629465e-07 465 506 -1.25731453108060e-22 465 507 -6.01851851852183e-07 465 508 -1.73611111111111e-07 465 509 -2.54629629629465e-07 466 466 2.03703703703770e-06 466 423 -1.73611111111111e-07 466 424 9.25925925922620e-08 466 425 -2.05140791913151e-22 466 426 -2.54629629629464e-07 466 427 1.73611111111111e-07 466 464 -6.01851851852182e-07 466 465 1.05879118406788e-22 466 422 -2.54629629629465e-07 466 467 3.70576914423756e-22 466 468 -6.01851851852181e-07 466 469 9.92616735063633e-23 466 506 -2.54629629629464e-07 466 507 1.73611111111111e-07 466 508 9.25925925922621e-08 466 509 -1.38966342908909e-22 466 510 -2.54629629629465e-07 466 511 -1.73611111111111e-07 467 467 2.03703703703770e-06 467 423 -2.54629629629465e-07 467 424 -2.64697796016969e-22 467 425 -6.01851851852183e-07 467 426 1.73611111111111e-07 467 427 -2.54629629629465e-07 467 464 1.38966342908909e-22 467 465 9.25925925922629e-08 467 466 3.97046694025453e-22 467 422 -1.73611111111111e-07 467 468 9.26442286059391e-23 467 469 9.25925925922632e-08 467 506 1.73611111111111e-07 467 507 -2.54629629629465e-07 467 508 -1.32348898008484e-22 467 509 -6.01851851852183e-07 467 510 -1.73611111111111e-07 467 511 -2.54629629629465e-07 468 468 2.03703703703770e-06 468 425 -1.73611111111111e-07 468 426 9.25925925922619e-08 468 427 -2.18375681713999e-22 468 428 -2.54629629629464e-07 468 429 1.73611111111111e-07 468 466 -6.01851851852181e-07 468 467 1.05879118406788e-22 468 424 -2.54629629629465e-07 468 469 3.70576914423756e-22 468 470 -6.01851851852181e-07 468 471 9.92616735063633e-23 468 508 -2.54629629629464e-07 468 509 1.73611111111111e-07 468 510 9.25925925922620e-08 468 511 -1.32348898008484e-22 468 512 -2.54629629629465e-07 468 513 -1.73611111111111e-07 469 469 2.03703703703770e-06 469 425 -2.54629629629465e-07 469 426 -2.24993126614424e-22 469 427 -6.01851851852183e-07 469 428 1.73611111111111e-07 469 429 -2.54629629629465e-07 469 466 7.94093388050907e-23 469 467 9.25925925922632e-08 469 468 3.44107134822060e-22 469 424 -1.73611111111111e-07 469 470 1.19114008207636e-22 469 471 9.25925925922632e-08 469 508 1.73611111111111e-07 469 509 -2.54629629629465e-07 469 510 -1.65436122510606e-22 469 511 -6.01851851852183e-07 469 512 -1.73611111111111e-07 469 513 -2.54629629629465e-07 470 470 2.03703703703770e-06 470 427 -1.73611111111111e-07 470 428 9.25925925922621e-08 470 429 -2.31610571514848e-22 470 430 -2.54629629629464e-07 470 431 1.73611111111111e-07 470 468 -6.01851851852181e-07 470 469 1.05879118406788e-22 470 426 -2.54629629629465e-07 470 471 3.97046694025453e-22 470 472 -6.01851851852182e-07 470 473 7.27918939046664e-23 470 510 -2.54629629629464e-07 470 511 1.73611111111111e-07 470 512 9.25925925922622e-08 470 513 -1.19114008207636e-22 470 514 -2.54629629629465e-07 470 515 -1.73611111111111e-07 471 471 2.03703703703770e-06 471 427 -2.54629629629465e-07 471 428 -2.18375681713999e-22 471 429 -6.01851851852183e-07 471 430 1.73611111111111e-07 471 431 -2.54629629629465e-07 471 468 9.26442286059391e-23 471 469 9.25925925922632e-08 471 470 3.70576914423756e-22 471 426 -1.73611111111111e-07 471 472 9.92616735063633e-23 471 473 9.25925925922628e-08 471 510 1.73611111111111e-07 471 511 -2.54629629629465e-07 471 512 -1.45583787809333e-22 471 513 -6.01851851852183e-07 471 514 -1.73611111111111e-07 471 515 -2.54629629629465e-07 472 472 2.03703703703770e-06 472 429 -1.73611111111111e-07 472 430 9.25925925922619e-08 472 431 -2.24993126614424e-22 472 432 -2.54629629629464e-07 472 433 1.73611111111111e-07 472 470 -6.01851851852182e-07 472 471 9.92616735063633e-23 472 428 -2.54629629629465e-07 472 473 4.23516473627150e-22 472 474 -6.01851851852181e-07 472 475 9.92616735063633e-23 472 512 -2.54629629629464e-07 472 513 1.73611111111111e-07 472 514 9.25925925922620e-08 472 515 -1.45583787809333e-22 472 516 -2.54629629629465e-07 472 517 -1.73611111111111e-07 473 473 2.03703703703770e-06 473 429 -2.54629629629465e-07 473 430 -2.44845461315696e-22 473 431 -6.01851851852183e-07 473 432 1.73611111111111e-07 473 433 -2.54629629629465e-07 473 470 1.05879118406788e-22 473 471 9.25925925922628e-08 473 472 3.97046694025453e-22 473 428 -1.73611111111111e-07 473 474 9.26442286059391e-23 473 475 9.25925925922636e-08 473 512 1.73611111111111e-07 473 513 -2.54629629629465e-07 473 514 -1.45583787809333e-22 473 515 -6.01851851852183e-07 473 516 -1.73611111111111e-07 473 517 -2.54629629629465e-07 474 474 2.03703703703770e-06 474 431 -1.73611111111111e-07 474 432 9.25925925922621e-08 474 433 -2.38228016415272e-22 474 434 -2.54629629629464e-07 474 435 1.73611111111111e-07 474 472 -6.01851851852181e-07 474 473 9.26442286059391e-23 474 430 -2.54629629629465e-07 474 475 3.70576914423756e-22 474 476 -6.01851851852182e-07 474 477 1.12496563307212e-22 474 514 -2.54629629629464e-07 474 515 1.73611111111111e-07 474 516 9.25925925922622e-08 474 517 -1.32348898008484e-22 474 518 -2.54629629629465e-07 474 519 -1.73611111111111e-07 475 475 2.03703703703770e-06 475 431 -2.54629629629465e-07 475 432 -2.38228016415272e-22 475 433 -6.01851851852183e-07 475 434 1.73611111111111e-07 475 435 -2.54629629629465e-07 475 472 7.94093388050907e-23 475 473 9.25925925922636e-08 475 474 3.70576914423756e-22 475 430 -1.73611111111111e-07 475 476 9.26442286059391e-23 475 477 9.25925925922624e-08 475 514 1.73611111111111e-07 475 515 -2.54629629629465e-07 475 516 -1.25731453108060e-22 475 517 -6.01851851852183e-07 475 518 -1.73611111111111e-07 475 519 -2.54629629629465e-07 476 476 1.66676851851906e-02 476 433 -1.73611111111111e-07 476 434 2.38099867724596e-03 476 435 2.67860615079365e-03 476 436 -4.16666666666396e-03 476 437 4.46428571428571e-03 476 474 -6.01851851852182e-07 476 475 9.26442286059391e-23 476 432 -2.54629629629465e-07 476 477 6.07153216591882e-18 476 478 -1.30952380952435e-02 476 479 2.60208521396521e-18 476 516 -2.54629629629464e-07 476 517 1.73611111111111e-07 476 518 2.38099867724597e-03 476 519 -2.67860615079365e-03 476 520 -4.16666666666396e-03 476 521 -4.46428571428572e-03 477 477 1.66676851851906e-02 477 433 -2.54629629629465e-07 477 434 -2.67860615079365e-03 477 435 -6.54791997354769e-03 477 436 4.46428571428571e-03 477 437 -4.16666666666397e-03 477 474 1.19114008207636e-22 477 475 9.25925925922624e-08 477 476 6.07153216591882e-18 477 432 -1.73611111111111e-07 477 478 2.16840434497101e-18 477 479 4.76190476189938e-03 477 516 1.73611111111111e-07 477 517 -2.54629629629465e-07 477 518 2.67860615079365e-03 477 519 -6.54791997354769e-03 477 520 -4.46428571428572e-03 477 521 -4.16666666666397e-03 478 478 3.33333333333441e-02 478 435 -4.46428571428572e-03 478 436 4.76190476189935e-03 478 437 -6.07153216591882e-18 478 438 -4.16666666666396e-03 478 439 4.46428571428571e-03 478 476 -1.30952380952435e-02 478 477 2.60208521396521e-18 478 434 -4.16666666666397e-03 478 479 9.54097911787244e-18 478 480 -1.30952380952435e-02 478 481 2.16840434497101e-18 478 518 -4.16666666666396e-03 478 519 4.46428571428571e-03 478 520 4.76190476189935e-03 478 521 -3.03576608295941e-18 478 522 -4.16666666666397e-03 478 523 -4.46428571428572e-03 479 479 3.33333333333442e-02 479 435 -4.16666666666397e-03 479 436 -5.20417042793042e-18 479 437 -1.30952380952435e-02 479 438 4.46428571428571e-03 479 439 -4.16666666666397e-03 479 476 2.16840434497101e-18 479 477 4.76190476189938e-03 479 478 1.04083408558608e-17 479 434 -4.46428571428572e-03 479 480 2.60208521396521e-18 479 481 4.76190476189936e-03 479 518 4.46428571428571e-03 479 519 -4.16666666666397e-03 479 520 -3.90312782094782e-18 479 521 -1.30952380952435e-02 479 522 -4.46428571428572e-03 479 523 -4.16666666666397e-03 480 480 3.33333333333442e-02 480 437 -4.46428571428572e-03 480 438 4.76190476189936e-03 480 439 -6.50521303491303e-18 480 440 -4.16666666666396e-03 480 441 4.46428571428571e-03 480 478 -1.30952380952435e-02 480 479 3.46944695195361e-18 480 436 -4.16666666666397e-03 480 481 1.12757025938492e-17 480 482 -1.30952380952435e-02 480 483 2.16840434497101e-18 480 520 -4.16666666666396e-03 480 521 4.46428571428571e-03 480 522 4.76190476189936e-03 480 523 -3.46944695195361e-18 480 524 -4.16666666666397e-03 480 525 -4.46428571428572e-03 481 481 3.33333333333442e-02 481 437 -4.16666666666397e-03 481 438 -5.20417042793042e-18 481 439 -1.30952380952435e-02 481 440 4.46428571428571e-03 481 441 -4.16666666666397e-03 481 478 2.16840434497101e-18 481 479 4.76190476189936e-03 481 480 1.12757025938492e-17 481 436 -4.46428571428572e-03 481 482 1.73472347597681e-18 481 483 4.76190476189936e-03 481 520 4.46428571428571e-03 481 521 -4.16666666666397e-03 481 522 -3.90312782094782e-18 481 523 -1.30952380952435e-02 481 524 -4.46428571428572e-03 481 525 -4.16666666666397e-03 482 482 3.33333333333441e-02 482 439 -4.46428571428572e-03 482 440 4.76190476189936e-03 482 441 -6.07153216591882e-18 482 442 -4.16666666666396e-03 482 443 4.46428571428571e-03 482 480 -1.30952380952435e-02 482 481 3.03576608295941e-18 482 438 -4.16666666666397e-03 482 483 1.04083408558608e-17 482 484 -1.30952380952435e-02 482 485 2.60208521396521e-18 482 522 -4.16666666666396e-03 482 523 4.46428571428571e-03 482 524 4.76190476189936e-03 482 525 -4.33680868994202e-18 482 526 -4.16666666666397e-03 482 527 -4.46428571428572e-03 483 483 3.33333333333442e-02 483 439 -4.16666666666397e-03 483 440 -5.20417042793042e-18 483 441 -1.30952380952435e-02 483 442 4.46428571428571e-03 483 443 -4.16666666666397e-03 483 480 2.16840434497101e-18 483 481 4.76190476189936e-03 483 482 1.04083408558608e-17 483 438 -4.46428571428572e-03 483 484 3.03576608295941e-18 483 485 4.76190476189937e-03 483 522 4.46428571428571e-03 483 523 -4.16666666666397e-03 483 524 -3.46944695195361e-18 483 525 -1.30952380952435e-02 483 526 -4.46428571428572e-03 483 527 -4.16666666666397e-03 484 484 3.33333333333441e-02 484 441 -4.46428571428572e-03 484 442 4.76190476189934e-03 484 443 -5.63785129692462e-18 484 444 -4.16666666666395e-03 484 445 4.46428571428571e-03 484 482 -1.30952380952435e-02 484 483 2.16840434497101e-18 484 440 -4.16666666666397e-03 484 485 1.04083408558608e-17 484 486 -1.30952380952435e-02 484 487 2.16840434497101e-18 484 524 -4.16666666666396e-03 484 525 4.46428571428571e-03 484 526 4.76190476189934e-03 484 527 -4.33680868994202e-18 484 528 -4.16666666666396e-03 484 529 -4.46428571428572e-03 485 485 3.33333333333442e-02 485 441 -4.16666666666397e-03 485 442 -6.07153216591882e-18 485 443 -1.30952380952435e-02 485 444 4.46428571428571e-03 485 445 -4.16666666666398e-03 485 482 2.16840434497101e-18 485 483 4.76190476189937e-03 485 484 1.12757025938492e-17 485 440 -4.46428571428572e-03 485 486 1.73472347597681e-18 485 487 4.76190476189939e-03 485 524 4.46428571428571e-03 485 525 -4.16666666666397e-03 485 526 -4.33680868994202e-18 485 527 -1.30952380952435e-02 485 528 -4.46428571428572e-03 485 529 -4.16666666666398e-03 486 486 3.33333333333441e-02 486 443 -4.46428571428572e-03 486 444 4.76190476189934e-03 486 445 -6.07153216591882e-18 486 446 -4.16666666666396e-03 486 447 4.46428571428571e-03 486 484 -1.30952380952435e-02 486 485 1.73472347597681e-18 486 442 -4.16666666666396e-03 486 487 1.04083408558608e-17 486 488 -1.30952380952435e-02 486 489 2.60208521396521e-18 486 526 -4.16666666666396e-03 486 527 4.46428571428571e-03 486 528 4.76190476189934e-03 486 529 -3.90312782094782e-18 486 530 -4.16666666666397e-03 486 531 -4.46428571428572e-03 487 487 3.33333333333442e-02 487 443 -4.16666666666398e-03 487 444 -5.20417042793042e-18 487 445 -1.30952380952435e-02 487 446 4.46428571428571e-03 487 447 -4.16666666666397e-03 487 484 2.60208521396521e-18 487 485 4.76190476189939e-03 487 486 1.04083408558608e-17 487 442 -4.46428571428572e-03 487 488 2.60208521396521e-18 487 489 4.76190476189937e-03 487 526 4.46428571428571e-03 487 527 -4.16666666666398e-03 487 528 -4.33680868994202e-18 487 529 -1.30952380952435e-02 487 530 -4.46428571428572e-03 487 531 -4.16666666666397e-03 488 488 3.33333333333441e-02 488 445 -4.46428571428572e-03 488 446 4.76190476189936e-03 488 447 -6.07153216591882e-18 488 448 -4.16666666666396e-03 488 449 4.46428571428571e-03 488 486 -1.30952380952435e-02 488 487 2.16840434497101e-18 488 444 -4.16666666666397e-03 488 489 1.04083408558608e-17 488 490 -1.30952380952435e-02 488 491 2.16840434497101e-18 488 528 -4.16666666666396e-03 488 529 4.46428571428571e-03 488 530 4.76190476189936e-03 488 531 -3.46944695195361e-18 488 532 -4.16666666666397e-03 488 533 -4.46428571428572e-03 489 489 3.33333333333442e-02 489 445 -4.16666666666397e-03 489 446 -5.20417042793042e-18 489 447 -1.30952380952435e-02 489 448 4.46428571428571e-03 489 449 -4.16666666666397e-03 489 486 2.16840434497101e-18 489 487 4.76190476189937e-03 489 488 1.12757025938492e-17 489 444 -4.46428571428572e-03 489 490 1.73472347597681e-18 489 491 4.76190476189936e-03 489 528 4.46428571428571e-03 489 529 -4.16666666666397e-03 489 530 -4.33680868994202e-18 489 531 -1.30952380952435e-02 489 532 -4.46428571428572e-03 489 533 -4.16666666666397e-03 490 490 3.33333333333442e-02 490 447 -4.46428571428572e-03 490 448 4.76190476189936e-03 490 449 -6.50521303491303e-18 490 450 -4.16666666666396e-03 490 451 4.46428571428571e-03 490 488 -1.30952380952435e-02 490 489 3.03576608295941e-18 490 446 -4.16666666666397e-03 490 491 1.12757025938492e-17 490 492 -1.30952380952435e-02 490 493 2.16840434497101e-18 490 530 -4.16666666666396e-03 490 531 4.46428571428571e-03 490 532 4.76190476189936e-03 490 533 -3.46944695195361e-18 490 534 -4.16666666666397e-03 490 535 -4.46428571428572e-03 491 491 3.33333333333442e-02 491 447 -4.16666666666397e-03 491 448 -5.20417042793042e-18 491 449 -1.30952380952435e-02 491 450 4.46428571428571e-03 491 451 -4.16666666666397e-03 491 488 2.16840434497101e-18 491 489 4.76190476189936e-03 491 490 1.12757025938492e-17 491 446 -4.46428571428572e-03 491 492 1.73472347597681e-18 491 493 4.76190476189936e-03 491 530 4.46428571428571e-03 491 531 -4.16666666666397e-03 491 532 -3.46944695195361e-18 491 533 -1.30952380952435e-02 491 534 -4.46428571428572e-03 491 535 -4.16666666666397e-03 492 492 1.17051282051320e+00 492 449 -4.46428571428572e-03 492 450 9.85347985346079e-02 492 451 4.53983516483515e-02 492 452 -2.88461538461351e-01 492 453 2.40384615384615e-01 492 490 -1.30952380952435e-02 492 491 2.60208521396521e-18 492 448 -4.16666666666397e-03 492 493 2.77555756156289e-16 492 494 -7.69230769231141e-01 492 495 1.38777878078145e-16 492 532 -4.16666666666396e-03 492 533 4.46428571428571e-03 492 534 9.85347985346083e-02 492 535 -4.53983516483518e-02 492 536 -2.88461538461351e-01 492 537 -2.40384615384615e-01 493 493 1.17051282051320e+00 493 449 -4.16666666666397e-03 493 450 -4.53983516483518e-02 493 451 -3.91163003663194e-01 493 452 2.40384615384615e-01 493 453 -2.88461538461352e-01 493 490 2.16840434497101e-18 493 491 4.76190476189936e-03 493 492 2.77555756156289e-16 493 448 -4.46428571428572e-03 493 494 1.24900090270330e-16 493 495 1.92307692307320e-01 493 532 4.46428571428571e-03 493 533 -4.16666666666397e-03 493 534 4.53983516483516e-02 493 535 -3.91163003663194e-01 493 536 -2.40384615384615e-01 493 537 -2.88461538461352e-01 494 494 2.30769230769305e+00 494 451 -2.40384615384616e-01 494 452 1.92307692307318e-01 494 453 -2.91433543964104e-16 494 454 -2.88461538461351e-01 494 455 2.40384615384615e-01 494 492 -7.69230769231141e-01 494 493 1.38777878078145e-16 494 450 -2.88461538461352e-01 494 495 5.27355936696949e-16 494 496 -7.69230769231143e-01 494 497 1.31838984174237e-16 494 534 -2.88461538461351e-01 494 535 2.40384615384615e-01 494 536 1.92307692307318e-01 494 537 -2.28983498828939e-16 494 538 -2.88461538461352e-01 494 539 -2.40384615384615e-01 495 495 2.30769230769306e+00 495 451 -2.88461538461352e-01 495 452 -3.26128013483640e-16 495 453 -7.69230769231144e-01 495 454 2.40384615384615e-01 495 455 -2.88461538461351e-01 495 492 1.17961196366423e-16 495 493 1.92307692307320e-01 495 494 5.27355936696949e-16 495 450 -2.40384615384615e-01 495 496 1.45716771982052e-16 495 497 1.92307692307319e-01 495 534 2.40384615384615e-01 495 535 -2.88461538461352e-01 495 536 -1.73472347597681e-16 495 537 -7.69230769231144e-01 495 538 -2.40384615384615e-01 495 539 -2.88461538461352e-01 496 496 2.30769230769306e+00 496 453 -2.40384615384615e-01 496 454 1.92307692307319e-01 496 455 -3.19189119579733e-16 496 456 -2.88461538461352e-01 496 457 2.40384615384615e-01 496 494 -7.69230769231143e-01 496 495 1.17961196366423e-16 496 452 -2.88461538461352e-01 496 497 5.27355936696949e-16 496 498 -7.69230769231146e-01 496 499 1.80411241501588e-16 496 536 -2.88461538461351e-01 496 537 2.40384615384615e-01 496 538 1.92307692307319e-01 496 539 -2.35922392732846e-16 496 540 -2.88461538461352e-01 496 541 -2.40384615384615e-01 497 497 2.30769230769305e+00 497 453 -2.88461538461352e-01 497 454 -3.05311331771918e-16 497 455 -7.69230769231142e-01 497 456 2.40384615384615e-01 497 457 -2.88461538461351e-01 497 494 1.31838984174237e-16 497 495 1.92307692307319e-01 497 496 5.82867087928207e-16 497 452 -2.40384615384615e-01 497 498 1.11022302462516e-16 497 499 1.92307692307317e-01 497 536 2.40384615384615e-01 497 537 -2.88461538461351e-01 497 538 -2.08166817117217e-16 497 539 -7.69230769231142e-01 497 540 -2.40384615384615e-01 497 541 -2.88461538461351e-01 498 498 2.30769230769306e+00 498 455 -2.40384615384616e-01 498 456 1.92307692307318e-01 498 457 -2.77555756156289e-16 498 458 -2.88461538461351e-01 498 459 2.40384615384615e-01 498 496 -7.69230769231146e-01 498 497 1.24900090270330e-16 498 454 -2.88461538461352e-01 498 499 5.27355936696949e-16 498 500 -7.69230769231141e-01 498 501 1.17961196366423e-16 498 538 -2.88461538461352e-01 498 539 2.40384615384615e-01 498 540 1.92307692307318e-01 498 541 -1.80411241501588e-16 498 542 -2.88461538461351e-01 498 543 -2.40384615384615e-01 499 499 2.30769230769306e+00 499 455 -2.88461538461351e-01 499 456 -3.26128013483640e-16 499 457 -7.69230769231143e-01 499 458 2.40384615384615e-01 499 459 -2.88461538461352e-01 499 496 1.31838984174237e-16 499 497 1.92307692307317e-01 499 498 4.99600361081320e-16 499 454 -2.40384615384615e-01 499 500 1.24900090270330e-16 499 501 1.92307692307320e-01 499 538 2.40384615384615e-01 499 539 -2.88461538461351e-01 499 540 -1.73472347597681e-16 499 541 -7.69230769231143e-01 499 542 -2.40384615384615e-01 499 543 -2.88461538461352e-01 500 500 2.30769230769305e+00 500 457 -2.40384615384616e-01 500 458 1.92307692307317e-01 500 459 -3.05311331771918e-16 500 460 -2.88461538461351e-01 500 461 2.40384615384615e-01 500 498 -7.69230769231141e-01 500 499 1.38777878078145e-16 500 456 -2.88461538461351e-01 500 501 5.27355936696949e-16 500 502 -7.69230769231141e-01 500 503 1.38777878078145e-16 500 540 -2.88461538461351e-01 500 541 2.40384615384615e-01 500 542 1.92307692307317e-01 500 543 -2.08166817117217e-16 500 544 -2.88461538461351e-01 500 545 -2.40384615384615e-01 501 501 2.30769230769306e+00 501 457 -2.88461538461352e-01 501 458 -3.19189119579733e-16 501 459 -7.69230769231146e-01 501 460 2.40384615384615e-01 501 461 -2.88461538461352e-01 501 498 1.31838984174237e-16 501 499 1.92307692307320e-01 501 500 5.27355936696949e-16 501 456 -2.40384615384615e-01 501 502 1.24900090270330e-16 501 503 1.92307692307320e-01 501 540 2.40384615384615e-01 501 541 -2.88461538461352e-01 501 542 -1.73472347597681e-16 501 543 -7.69230769231146e-01 501 544 -2.40384615384615e-01 501 545 -2.88461538461352e-01 502 502 2.30769230769305e+00 502 459 -2.40384615384616e-01 502 460 1.92307692307318e-01 502 461 -2.49800180540660e-16 502 500 -7.69230769231141e-01 502 501 1.38777878078145e-16 502 458 -2.88461538461352e-01 502 503 4.71844785465692e-16 502 542 -2.88461538461351e-01 502 543 2.40384615384615e-01 502 544 1.92307692307318e-01 502 545 -2.08166817117217e-16 503 503 2.30769230769306e+00 503 459 -2.88461538461352e-01 503 460 -3.19189119579733e-16 503 461 -7.69230769231144e-01 503 500 1.17961196366423e-16 503 501 1.92307692307320e-01 503 502 5.27355936696949e-16 503 458 -2.40384615384615e-01 503 542 2.40384615384615e-01 503 543 -2.88461538461352e-01 503 544 -1.73472347597681e-16 503 545 -7.69230769231144e-01 hypre-2.33.0/src/test/TEST_ij/A.00001000066400000000000000000007031031477326011500165110ustar00rootroot00000000000000504 965 504 965 504 504 2.03703703703770e-06 504 505 -3.17637355220363e-22 504 506 -6.01851851852183e-07 504 507 -7.94093388050907e-23 504 546 9.25925925922635e-08 504 547 4.63221143029695e-22 504 548 -2.54629629629464e-07 504 549 -1.73611111111111e-07 504 462 9.25925925922622e-08 504 463 -1.32348898008484e-22 504 464 -2.54629629629464e-07 504 465 1.73611111111111e-07 505 505 2.03703703703770e-06 505 504 -3.44107134822060e-22 505 506 -1.05879118406788e-22 505 507 9.25925925922623e-08 505 546 4.96308367531817e-22 505 547 -6.01851851852181e-07 505 548 -1.73611111111111e-07 505 549 -2.54629629629464e-07 505 462 -1.32348898008484e-22 505 463 -6.01851851852183e-07 505 464 1.73611111111111e-07 505 465 -2.54629629629465e-07 506 506 2.03703703703770e-06 506 505 -9.26442286059391e-23 506 504 -6.01851851852183e-07 506 507 -3.17637355220363e-22 506 508 -6.01851851852183e-07 506 509 -7.94093388050907e-23 506 546 -2.54629629629465e-07 506 547 1.73611111111111e-07 506 548 9.25925925922635e-08 506 549 4.63221143029695e-22 506 550 -2.54629629629464e-07 506 551 -1.73611111111111e-07 506 462 -2.54629629629465e-07 506 463 -1.73611111111111e-07 506 464 9.25925925922622e-08 506 465 -1.32348898008484e-22 506 466 -2.54629629629464e-07 506 467 1.73611111111111e-07 507 507 2.03703703703770e-06 507 505 9.25925925922623e-08 507 506 -3.44107134822060e-22 507 504 -9.92616735063633e-23 507 508 -1.05879118406788e-22 507 509 9.25925925922623e-08 507 546 1.73611111111111e-07 507 547 -2.54629629629465e-07 507 548 4.96308367531817e-22 507 549 -6.01851851852181e-07 507 550 -1.73611111111111e-07 507 551 -2.54629629629464e-07 507 462 -1.73611111111111e-07 507 463 -2.54629629629465e-07 507 464 -1.32348898008484e-22 507 465 -6.01851851852183e-07 507 466 1.73611111111111e-07 507 467 -2.54629629629465e-07 508 508 2.03703703703770e-06 508 507 -9.26442286059391e-23 508 506 -6.01851851852183e-07 508 509 -3.17637355220363e-22 508 510 -6.01851851852182e-07 508 511 -9.26442286059391e-23 508 548 -2.54629629629465e-07 508 549 1.73611111111111e-07 508 550 9.25925925922633e-08 508 551 4.63221143029695e-22 508 552 -2.54629629629464e-07 508 553 -1.73611111111111e-07 508 464 -2.54629629629465e-07 508 465 -1.73611111111111e-07 508 466 9.25925925922621e-08 508 467 -1.32348898008484e-22 508 468 -2.54629629629464e-07 508 469 1.73611111111111e-07 509 509 2.03703703703770e-06 509 507 9.25925925922623e-08 509 508 -3.44107134822060e-22 509 506 -9.92616735063633e-23 509 510 -1.12496563307212e-22 509 511 9.25925925922625e-08 509 548 1.73611111111111e-07 509 549 -2.54629629629465e-07 509 550 4.83073477730968e-22 509 551 -6.01851851852181e-07 509 552 -1.73611111111111e-07 509 553 -2.54629629629464e-07 509 464 -1.73611111111111e-07 509 465 -2.54629629629465e-07 509 466 -1.45583787809333e-22 509 467 -6.01851851852183e-07 509 468 1.73611111111111e-07 509 469 -2.54629629629465e-07 510 510 2.03703703703770e-06 510 509 -7.94093388050907e-23 510 508 -6.01851851852182e-07 510 511 -3.70576914423756e-22 510 512 -6.01851851852182e-07 510 513 -9.26442286059391e-23 510 550 -2.54629629629465e-07 510 551 1.73611111111111e-07 510 552 9.25925925922632e-08 510 553 4.76456032830544e-22 510 554 -2.54629629629464e-07 510 555 -1.73611111111111e-07 510 466 -2.54629629629465e-07 510 467 -1.73611111111111e-07 510 468 9.25925925922620e-08 510 469 -1.52201232709757e-22 510 470 -2.54629629629464e-07 510 471 1.73611111111111e-07 511 511 2.03703703703770e-06 511 509 9.25925925922625e-08 511 510 -3.17637355220363e-22 511 508 -9.26442286059391e-23 511 512 -1.12496563307212e-22 511 513 9.25925925922626e-08 511 550 1.73611111111111e-07 511 551 -2.54629629629465e-07 511 552 4.76456032830544e-22 511 553 -6.01851851852181e-07 511 554 -1.73611111111111e-07 511 555 -2.54629629629464e-07 511 466 -1.73611111111111e-07 511 467 -2.54629629629465e-07 511 468 -1.38966342908909e-22 511 469 -6.01851851852183e-07 511 470 1.73611111111111e-07 511 471 -2.54629629629465e-07 512 512 2.03703703703770e-06 512 511 -7.94093388050907e-23 512 510 -6.01851851852182e-07 512 513 -3.70576914423756e-22 512 514 -6.01851851852183e-07 512 515 -9.26442286059391e-23 512 552 -2.54629629629465e-07 512 553 1.73611111111111e-07 512 554 9.25925925922634e-08 512 555 4.83073477730968e-22 512 556 -2.54629629629464e-07 512 557 -1.73611111111111e-07 512 468 -2.54629629629465e-07 512 469 -1.73611111111111e-07 512 470 9.25925925922622e-08 512 471 -1.65436122510606e-22 512 472 -2.54629629629464e-07 512 473 1.73611111111111e-07 513 513 2.03703703703770e-06 513 511 9.25925925922626e-08 513 512 -3.70576914423756e-22 513 510 -9.26442286059391e-23 513 514 -9.26442286059391e-23 513 515 9.25925925922621e-08 513 552 1.73611111111111e-07 513 553 -2.54629629629465e-07 513 554 4.76456032830544e-22 513 555 -6.01851851852181e-07 513 556 -1.73611111111111e-07 513 557 -2.54629629629464e-07 513 468 -1.73611111111111e-07 513 469 -2.54629629629465e-07 513 470 -1.25731453108060e-22 513 471 -6.01851851852183e-07 513 472 1.73611111111111e-07 513 473 -2.54629629629465e-07 514 514 2.03703703703770e-06 514 513 -9.92616735063633e-23 514 512 -6.01851851852183e-07 514 515 -3.17637355220363e-22 514 516 -6.01851851852182e-07 514 517 -9.92616735063633e-23 514 554 -2.54629629629465e-07 514 555 1.73611111111111e-07 514 556 9.25925925922633e-08 514 557 4.63221143029695e-22 514 558 -2.54629629629464e-07 514 559 -1.73611111111111e-07 514 470 -2.54629629629465e-07 514 471 -1.73611111111111e-07 514 472 9.25925925922620e-08 514 473 -1.38966342908909e-22 514 474 -2.54629629629464e-07 514 475 1.73611111111111e-07 515 515 2.03703703703770e-06 515 513 9.25925925922621e-08 515 514 -3.44107134822060e-22 515 512 -9.92616735063633e-23 515 516 -1.32348898008484e-22 515 517 9.25925925922629e-08 515 554 1.73611111111111e-07 515 555 -2.54629629629465e-07 515 556 4.96308367531817e-22 515 557 -6.01851851852181e-07 515 558 -1.73611111111111e-07 515 559 -2.54629629629464e-07 515 470 -1.73611111111111e-07 515 471 -2.54629629629465e-07 515 472 -1.38966342908909e-22 515 473 -6.01851851852183e-07 515 474 1.73611111111111e-07 515 475 -2.54629629629465e-07 516 516 2.03703703703770e-06 516 515 -1.12496563307212e-22 516 514 -6.01851851852182e-07 516 517 -3.44107134822060e-22 516 518 -6.01851851852183e-07 516 519 -1.12496563307212e-22 516 556 -2.54629629629465e-07 516 557 1.73611111111111e-07 516 558 9.25925925922635e-08 516 559 5.02925812432241e-22 516 560 -2.54629629629464e-07 516 561 -1.73611111111111e-07 516 472 -2.54629629629465e-07 516 473 -1.73611111111111e-07 516 474 9.25925925922622e-08 516 475 -1.32348898008484e-22 516 476 -2.54629629629464e-07 516 477 1.73611111111111e-07 517 517 2.03703703703770e-06 517 515 9.25925925922629e-08 517 516 -3.17637355220363e-22 517 514 -1.38966342908909e-22 517 518 -1.05879118406788e-22 517 519 9.25925925922617e-08 517 556 1.73611111111111e-07 517 557 -2.54629629629465e-07 517 558 5.02925812432241e-22 517 559 -6.01851851852181e-07 517 560 -1.73611111111111e-07 517 561 -2.54629629629464e-07 517 472 -1.73611111111111e-07 517 473 -2.54629629629465e-07 517 474 -1.58818677610181e-22 517 475 -6.01851851852183e-07 517 476 1.73611111111111e-07 517 477 -2.54629629629464e-07 518 518 1.66676851851906e-02 518 517 -7.27918939046664e-23 518 516 -6.01851851852183e-07 518 519 -3.46944695195361e-18 518 520 -1.30952380952435e-02 518 521 -2.16840434497101e-18 518 558 -2.54629629629466e-07 518 559 1.73611111111111e-07 518 560 2.38099867724598e-03 518 561 -2.67860615079365e-03 518 562 -4.16666666666396e-03 518 563 -4.46428571428571e-03 518 474 -2.54629629629465e-07 518 475 -1.73611111111111e-07 518 476 2.38099867724597e-03 518 477 2.67860615079365e-03 518 478 -4.16666666666396e-03 518 479 4.46428571428571e-03 519 519 1.66676851851906e-02 519 517 9.25925925922617e-08 519 518 -3.46944695195361e-18 519 516 -1.05879118406788e-22 519 520 -4.33680868994202e-18 519 521 4.76190476189937e-03 519 558 1.73611111111111e-07 519 559 -2.54629629629465e-07 519 560 2.67860615079366e-03 519 561 -6.54791997354768e-03 519 562 -4.46428571428571e-03 519 563 -4.16666666666397e-03 519 474 -1.73611111111111e-07 519 475 -2.54629629629465e-07 519 476 -2.67860615079365e-03 519 477 -6.54791997354769e-03 519 478 4.46428571428571e-03 519 479 -4.16666666666397e-03 520 520 3.33333333333442e-02 520 519 -3.46944695195361e-18 520 518 -1.30952380952435e-02 520 521 -9.54097911787244e-18 520 522 -1.30952380952435e-02 520 523 -2.16840434497101e-18 520 560 -4.16666666666398e-03 520 561 4.46428571428572e-03 520 562 4.76190476189938e-03 520 563 1.30104260698261e-17 520 564 -4.16666666666396e-03 520 565 -4.46428571428571e-03 520 476 -4.16666666666396e-03 520 477 -4.46428571428572e-03 520 478 4.76190476189935e-03 520 479 -4.77048955893622e-18 520 480 -4.16666666666396e-03 520 481 4.46428571428571e-03 521 521 3.33333333333442e-02 521 519 4.76190476189937e-03 521 520 -9.54097911787244e-18 521 518 -2.16840434497101e-18 521 522 -2.60208521396521e-18 521 523 4.76190476189935e-03 521 560 4.46428571428572e-03 521 561 -4.16666666666397e-03 521 562 1.17093834628434e-17 521 563 -1.30952380952435e-02 521 564 -4.46428571428571e-03 521 565 -4.16666666666396e-03 521 476 -4.46428571428572e-03 521 477 -4.16666666666397e-03 521 478 -4.33680868994202e-18 521 479 -1.30952380952435e-02 521 480 4.46428571428571e-03 521 481 -4.16666666666397e-03 522 522 3.33333333333442e-02 522 521 -1.73472347597681e-18 522 520 -1.30952380952435e-02 522 523 -1.04083408558608e-17 522 524 -1.30952380952435e-02 522 525 -2.60208521396521e-18 522 562 -4.16666666666399e-03 522 563 4.46428571428572e-03 522 564 4.76190476189938e-03 522 565 1.30104260698261e-17 522 566 -4.16666666666396e-03 522 567 -4.46428571428571e-03 522 478 -4.16666666666397e-03 522 479 -4.46428571428572e-03 522 480 4.76190476189936e-03 522 481 -3.46944695195361e-18 522 482 -4.16666666666396e-03 522 483 4.46428571428571e-03 523 523 3.33333333333441e-02 523 521 4.76190476189935e-03 523 522 -9.54097911787244e-18 523 520 -1.73472347597681e-18 523 524 -2.60208521396521e-18 523 525 4.76190476189935e-03 523 562 4.46428571428572e-03 523 563 -4.16666666666396e-03 523 564 1.12757025938492e-17 523 565 -1.30952380952435e-02 523 566 -4.46428571428571e-03 523 567 -4.16666666666396e-03 523 478 -4.46428571428572e-03 523 479 -4.16666666666397e-03 523 480 -4.33680868994202e-18 523 481 -1.30952380952435e-02 523 482 4.46428571428571e-03 523 483 -4.16666666666397e-03 524 524 3.33333333333442e-02 524 523 -2.60208521396521e-18 524 522 -1.30952380952435e-02 524 525 -1.04083408558608e-17 524 526 -1.30952380952435e-02 524 527 -2.60208521396521e-18 524 564 -4.16666666666398e-03 524 565 4.46428571428572e-03 524 566 4.76190476189938e-03 524 567 1.25767452008319e-17 524 568 -4.16666666666396e-03 524 569 -4.46428571428571e-03 524 480 -4.16666666666397e-03 524 481 -4.46428571428572e-03 524 482 4.76190476189936e-03 524 483 -3.90312782094782e-18 524 484 -4.16666666666396e-03 524 485 4.46428571428571e-03 525 525 3.33333333333441e-02 525 523 4.76190476189935e-03 525 524 -1.04083408558608e-17 525 522 -1.73472347597681e-18 525 526 -2.60208521396521e-18 525 527 4.76190476189936e-03 525 564 4.46428571428572e-03 525 565 -4.16666666666396e-03 525 566 1.25767452008319e-17 525 567 -1.30952380952435e-02 525 568 -4.46428571428571e-03 525 569 -4.16666666666396e-03 525 480 -4.46428571428572e-03 525 481 -4.16666666666397e-03 525 482 -3.46944695195361e-18 525 483 -1.30952380952435e-02 525 484 4.46428571428571e-03 525 485 -4.16666666666397e-03 526 526 3.33333333333441e-02 526 525 -3.46944695195361e-18 526 524 -1.30952380952435e-02 526 527 -1.04083408558608e-17 526 528 -1.30952380952435e-02 526 529 -2.16840434497101e-18 526 566 -4.16666666666398e-03 526 567 4.46428571428572e-03 526 568 4.76190476189936e-03 526 569 1.30104260698261e-17 526 570 -4.16666666666395e-03 526 571 -4.46428571428571e-03 526 482 -4.16666666666397e-03 526 483 -4.46428571428572e-03 526 484 4.76190476189934e-03 526 485 -4.33680868994202e-18 526 486 -4.16666666666396e-03 526 487 4.46428571428571e-03 527 527 3.33333333333442e-02 527 525 4.76190476189936e-03 527 526 -9.54097911787244e-18 527 524 -2.16840434497101e-18 527 528 -2.60208521396521e-18 527 529 4.76190476189938e-03 527 566 4.46428571428572e-03 527 567 -4.16666666666397e-03 527 568 1.17093834628434e-17 527 569 -1.30952380952435e-02 527 570 -4.46428571428571e-03 527 571 -4.16666666666397e-03 527 482 -4.46428571428572e-03 527 483 -4.16666666666397e-03 527 484 -3.90312782094782e-18 527 485 -1.30952380952435e-02 527 486 4.46428571428571e-03 527 487 -4.16666666666398e-03 528 528 3.33333333333441e-02 528 527 -2.16840434497101e-18 528 526 -1.30952380952435e-02 528 529 -8.67361737988404e-18 528 530 -1.30952380952435e-02 528 531 -2.16840434497101e-18 528 568 -4.16666666666398e-03 528 569 4.46428571428572e-03 528 570 4.76190476189936e-03 528 571 1.25767452008319e-17 528 572 -4.16666666666396e-03 528 573 -4.46428571428571e-03 528 484 -4.16666666666396e-03 528 485 -4.46428571428572e-03 528 486 4.76190476189934e-03 528 487 -4.33680868994202e-18 528 488 -4.16666666666396e-03 528 489 4.46428571428571e-03 529 529 3.33333333333442e-02 529 527 4.76190476189938e-03 529 528 -1.04083408558608e-17 529 526 -2.16840434497101e-18 529 530 -3.46944695195361e-18 529 531 4.76190476189936e-03 529 568 4.46428571428572e-03 529 569 -4.16666666666397e-03 529 570 1.17093834628434e-17 529 571 -1.30952380952435e-02 529 572 -4.46428571428571e-03 529 573 -4.16666666666396e-03 529 484 -4.46428571428572e-03 529 485 -4.16666666666398e-03 529 486 -3.03576608295941e-18 529 487 -1.30952380952435e-02 529 488 4.46428571428571e-03 529 489 -4.16666666666397e-03 530 530 3.33333333333442e-02 530 529 -3.46944695195361e-18 530 528 -1.30952380952435e-02 530 531 -1.04083408558608e-17 530 532 -1.30952380952435e-02 530 533 -2.60208521396521e-18 530 570 -4.16666666666398e-03 530 571 4.46428571428572e-03 530 572 4.76190476189938e-03 530 573 1.34441069388203e-17 530 574 -4.16666666666396e-03 530 575 -4.46428571428571e-03 530 486 -4.16666666666397e-03 530 487 -4.46428571428572e-03 530 488 4.76190476189936e-03 530 489 -3.90312782094782e-18 530 490 -4.16666666666396e-03 530 491 4.46428571428571e-03 531 531 3.33333333333441e-02 531 529 4.76190476189936e-03 531 530 -9.54097911787244e-18 531 528 -1.73472347597681e-18 531 532 -2.60208521396521e-18 531 533 4.76190476189935e-03 531 570 4.46428571428572e-03 531 571 -4.16666666666397e-03 531 572 1.12757025938492e-17 531 573 -1.30952380952435e-02 531 574 -4.46428571428571e-03 531 575 -4.16666666666396e-03 531 486 -4.46428571428572e-03 531 487 -4.16666666666397e-03 531 488 -4.33680868994202e-18 531 489 -1.30952380952435e-02 531 490 4.46428571428571e-03 531 491 -4.16666666666397e-03 532 532 3.33333333333442e-02 532 531 -2.60208521396521e-18 532 530 -1.30952380952435e-02 532 533 -1.12757025938492e-17 532 534 -1.30952380952435e-02 532 535 -2.16840434497101e-18 532 572 -4.16666666666398e-03 532 573 4.46428571428572e-03 532 574 4.76190476189938e-03 532 575 1.30104260698261e-17 532 576 -4.16666666666396e-03 532 577 -4.46428571428571e-03 532 488 -4.16666666666397e-03 532 489 -4.46428571428572e-03 532 490 4.76190476189936e-03 532 491 -4.33680868994202e-18 532 492 -4.16666666666396e-03 532 493 4.46428571428571e-03 533 533 3.33333333333441e-02 533 531 4.76190476189935e-03 533 532 -1.04083408558608e-17 533 530 -1.73472347597681e-18 533 534 -2.60208521396521e-18 533 535 4.76190476189935e-03 533 572 4.46428571428572e-03 533 573 -4.16666666666396e-03 533 574 1.17093834628434e-17 533 575 -1.30952380952435e-02 533 576 -4.46428571428571e-03 533 577 -4.16666666666396e-03 533 488 -4.46428571428572e-03 533 489 -4.16666666666397e-03 533 490 -4.33680868994202e-18 533 491 -1.30952380952435e-02 533 492 4.46428571428571e-03 533 493 -4.16666666666397e-03 534 534 1.17051282051320e+00 534 533 -2.60208521396521e-18 534 532 -1.30952380952435e-02 534 535 -2.22044604925031e-16 534 536 -7.69230769231142e-01 534 537 -1.17961196366423e-16 534 574 -4.16666666666399e-03 534 575 4.46428571428572e-03 534 576 9.85347985346089e-02 534 577 -4.53983516483513e-02 534 578 -2.88461538461351e-01 534 579 -2.40384615384615e-01 534 490 -4.16666666666397e-03 534 491 -4.46428571428572e-03 534 492 9.85347985346084e-02 534 493 4.53983516483516e-02 534 494 -2.88461538461351e-01 534 495 2.40384615384615e-01 535 535 1.17051282051320e+00 535 533 4.76190476189935e-03 535 534 -2.22044604925031e-16 535 532 -1.73472347597681e-18 535 536 -1.59594559789866e-16 535 537 1.92307692307319e-01 535 574 4.46428571428572e-03 535 575 -4.16666666666396e-03 535 576 4.53983516483520e-02 535 577 -3.91163003663193e-01 535 578 -2.40384615384615e-01 535 579 -2.88461538461351e-01 535 490 -4.46428571428572e-03 535 491 -4.16666666666397e-03 535 492 -4.53983516483518e-02 535 493 -3.91163003663194e-01 535 494 2.40384615384615e-01 535 495 -2.88461538461352e-01 536 536 2.30769230769306e+00 536 535 -1.24900090270330e-16 536 534 -7.69230769231142e-01 536 537 -5.27355936696949e-16 536 538 -7.69230769231144e-01 536 539 -1.11022302462516e-16 536 576 -2.88461538461352e-01 536 577 2.40384615384616e-01 536 578 1.92307692307319e-01 536 579 6.93889390390723e-16 536 580 -2.88461538461351e-01 536 581 -2.40384615384615e-01 536 492 -2.88461538461351e-01 536 493 -2.40384615384615e-01 536 494 1.92307692307318e-01 536 495 -1.87350135405495e-16 536 496 -2.88461538461351e-01 536 497 2.40384615384615e-01 537 537 2.30769230769306e+00 537 535 1.92307692307319e-01 537 536 -5.27355936696949e-16 537 534 -1.31838984174237e-16 537 538 -1.17961196366423e-16 537 539 1.92307692307318e-01 537 576 2.40384615384616e-01 537 577 -2.88461538461352e-01 537 578 6.80011602582908e-16 537 579 -7.69230769231142e-01 537 580 -2.40384615384615e-01 537 581 -2.88461538461351e-01 537 492 -2.40384615384615e-01 537 493 -2.88461538461352e-01 537 494 -1.94289029309402e-16 537 495 -7.69230769231144e-01 537 496 2.40384615384615e-01 537 497 -2.88461538461351e-01 538 538 2.30769230769306e+00 538 537 -1.31838984174237e-16 538 536 -7.69230769231144e-01 538 539 -5.27355936696949e-16 538 540 -7.69230769231147e-01 538 541 -7.63278329429795e-17 538 578 -2.88461538461352e-01 538 579 2.40384615384616e-01 538 580 1.92307692307321e-01 538 581 6.73072708679001e-16 538 582 -2.88461538461352e-01 538 583 -2.40384615384615e-01 538 494 -2.88461538461352e-01 538 495 -2.40384615384615e-01 538 496 1.92307692307319e-01 538 497 -1.80411241501588e-16 538 498 -2.88461538461352e-01 538 499 2.40384615384615e-01 539 539 2.30769230769305e+00 539 537 1.92307692307318e-01 539 538 -4.99600361081320e-16 539 536 -1.24900090270330e-16 539 540 -1.17961196366423e-16 539 541 1.92307692307316e-01 539 578 2.40384615384616e-01 539 579 -2.88461538461351e-01 539 580 6.93889390390723e-16 539 581 -7.69230769231140e-01 539 582 -2.40384615384615e-01 539 583 -2.88461538461351e-01 539 494 -2.40384615384615e-01 539 495 -2.88461538461352e-01 539 496 -2.22044604925031e-16 539 497 -7.69230769231142e-01 539 498 2.40384615384615e-01 539 499 -2.88461538461351e-01 540 540 2.30769230769306e+00 540 539 -9.71445146547012e-17 540 538 -7.69230769231147e-01 540 541 -5.27355936696949e-16 540 542 -7.69230769231142e-01 540 543 -1.17961196366423e-16 540 580 -2.88461538461353e-01 540 581 2.40384615384616e-01 540 582 1.92307692307320e-01 540 583 6.59194920871187e-16 540 584 -2.88461538461351e-01 540 585 -2.40384615384615e-01 540 496 -2.88461538461352e-01 540 497 -2.40384615384615e-01 540 498 1.92307692307318e-01 540 499 -1.59594559789866e-16 540 500 -2.88461538461351e-01 540 501 2.40384615384615e-01 541 541 2.30769230769305e+00 541 539 1.92307692307316e-01 541 540 -5.27355936696949e-16 541 538 -9.02056207507940e-17 541 542 -1.87350135405495e-16 541 543 1.92307692307319e-01 541 580 2.40384615384616e-01 541 581 -2.88461538461351e-01 541 582 6.31439345255558e-16 541 583 -7.69230769231141e-01 541 584 -2.40384615384615e-01 541 585 -2.88461538461351e-01 541 496 -2.40384615384615e-01 541 497 -2.88461538461351e-01 541 498 -1.80411241501588e-16 541 499 -7.69230769231143e-01 541 500 2.40384615384615e-01 541 501 -2.88461538461352e-01 542 542 2.30769230769305e+00 542 541 -1.24900090270330e-16 542 540 -7.69230769231142e-01 542 543 -4.99600361081320e-16 542 544 -7.69230769231142e-01 542 545 -1.17961196366423e-16 542 582 -2.88461538461352e-01 542 583 2.40384615384616e-01 542 584 1.92307692307318e-01 542 585 6.66133814775094e-16 542 586 -2.88461538461351e-01 542 587 -2.40384615384615e-01 542 498 -2.88461538461351e-01 542 499 -2.40384615384615e-01 542 500 1.92307692307317e-01 542 501 -1.73472347597681e-16 542 502 -2.88461538461351e-01 542 503 2.40384615384615e-01 543 543 2.30769230769306e+00 543 541 1.92307692307319e-01 543 542 -4.99600361081320e-16 543 540 -1.45716771982052e-16 543 544 -1.59594559789866e-16 543 545 1.92307692307319e-01 543 582 2.40384615384616e-01 543 583 -2.88461538461352e-01 543 584 6.80011602582908e-16 543 585 -7.69230769231143e-01 543 586 -2.40384615384615e-01 543 587 -2.88461538461351e-01 543 498 -2.40384615384615e-01 543 499 -2.88461538461352e-01 543 500 -2.15105711021124e-16 543 501 -7.69230769231146e-01 543 502 2.40384615384615e-01 543 503 -2.88461538461352e-01 544 544 2.30769230769306e+00 544 543 -1.24900090270330e-16 544 542 -7.69230769231142e-01 544 545 -6.10622663543836e-16 544 584 -2.88461538461352e-01 544 585 2.40384615384616e-01 544 586 1.92307692307319e-01 544 587 6.86950496486816e-16 544 500 -2.88461538461351e-01 544 501 -2.40384615384615e-01 544 502 1.92307692307318e-01 544 503 -1.73472347597681e-16 545 545 2.30769230769305e+00 545 543 1.92307692307319e-01 545 544 -5.82867087928207e-16 545 542 -1.31838984174237e-16 545 584 2.40384615384616e-01 545 585 -2.88461538461352e-01 545 586 6.66133814775094e-16 545 587 -7.69230769231142e-01 545 500 -2.40384615384615e-01 545 501 -2.88461538461352e-01 545 502 -1.80411241501588e-16 545 503 -7.69230769231144e-01 546 546 2.03703703703770e-06 546 505 4.96308367531817e-22 546 506 -2.54629629629465e-07 546 507 1.73611111111111e-07 546 504 9.25925925922635e-08 546 547 -2.38228016415272e-22 546 548 -6.01851851852183e-07 546 549 -9.26442286059391e-23 546 588 9.25925925922626e-08 546 589 -1.38966342908909e-22 546 590 -2.54629629629465e-07 546 591 -1.73611111111111e-07 547 547 2.03703703703770e-06 547 505 -6.01851851852181e-07 547 506 1.73611111111111e-07 547 507 -2.54629629629465e-07 547 546 -2.64697796016969e-22 547 504 4.83073477730968e-22 547 548 -1.19114008207636e-22 547 549 9.25925925922621e-08 547 588 -1.45583787809333e-22 547 589 -6.01851851852182e-07 547 590 -1.73611111111111e-07 547 591 -2.54629629629465e-07 548 548 2.03703703703770e-06 548 505 -1.73611111111111e-07 548 506 9.25925925922635e-08 548 507 4.96308367531817e-22 548 508 -2.54629629629465e-07 548 509 1.73611111111111e-07 548 546 -6.01851851852183e-07 548 547 -1.25731453108060e-22 548 504 -2.54629629629464e-07 548 549 -2.38228016415272e-22 548 550 -6.01851851852183e-07 548 551 -9.26442286059391e-23 548 588 -2.54629629629464e-07 548 589 1.73611111111111e-07 548 590 9.25925925922626e-08 548 591 -1.38966342908909e-22 548 592 -2.54629629629465e-07 548 593 -1.73611111111111e-07 549 549 2.03703703703770e-06 549 505 -2.54629629629464e-07 549 506 4.83073477730968e-22 549 507 -6.01851851852181e-07 549 508 1.73611111111111e-07 549 509 -2.54629629629465e-07 549 546 -9.26442286059391e-23 549 547 9.25925925922621e-08 549 548 -2.64697796016969e-22 549 504 -1.73611111111111e-07 549 550 -1.19114008207636e-22 549 551 9.25925925922621e-08 549 588 1.73611111111111e-07 549 589 -2.54629629629465e-07 549 590 -1.45583787809333e-22 549 591 -6.01851851852182e-07 549 592 -1.73611111111111e-07 549 593 -2.54629629629465e-07 550 550 2.03703703703770e-06 550 507 -1.73611111111111e-07 550 508 9.25925925922633e-08 550 509 4.96308367531817e-22 550 510 -2.54629629629465e-07 550 511 1.73611111111111e-07 550 548 -6.01851851852183e-07 550 549 -1.25731453108060e-22 550 506 -2.54629629629464e-07 550 551 -2.38228016415272e-22 550 552 -6.01851851852182e-07 550 553 -7.94093388050907e-23 550 590 -2.54629629629464e-07 550 591 1.73611111111111e-07 550 592 9.25925925922625e-08 550 593 -1.32348898008484e-22 550 594 -2.54629629629465e-07 550 595 -1.73611111111111e-07 551 551 2.03703703703770e-06 551 507 -2.54629629629464e-07 551 508 4.89690922631392e-22 551 509 -6.01851851852181e-07 551 510 1.73611111111111e-07 551 511 -2.54629629629465e-07 551 548 -9.26442286059391e-23 551 549 9.25925925922621e-08 551 550 -2.64697796016969e-22 551 506 -1.73611111111111e-07 551 552 -1.05879118406788e-22 551 553 9.25925925922623e-08 551 590 1.73611111111111e-07 551 591 -2.54629629629465e-07 551 592 -1.58818677610181e-22 551 593 -6.01851851852182e-07 551 594 -1.73611111111111e-07 551 595 -2.54629629629465e-07 552 552 2.03703703703770e-06 552 509 -1.73611111111111e-07 552 510 9.25925925922632e-08 552 511 4.83073477730968e-22 552 512 -2.54629629629465e-07 552 513 1.73611111111111e-07 552 550 -6.01851851852182e-07 552 551 -9.26442286059391e-23 552 508 -2.54629629629464e-07 552 553 -3.17637355220363e-22 552 554 -6.01851851852182e-07 552 555 -7.94093388050907e-23 552 592 -2.54629629629464e-07 552 593 1.73611111111111e-07 552 594 9.25925925922624e-08 552 595 -1.32348898008484e-22 552 596 -2.54629629629465e-07 552 597 -1.73611111111111e-07 553 553 2.03703703703770e-06 553 509 -2.54629629629464e-07 553 510 4.83073477730968e-22 553 511 -6.01851851852181e-07 553 512 1.73611111111111e-07 553 513 -2.54629629629465e-07 553 550 -9.92616735063633e-23 553 551 9.25925925922624e-08 553 552 -3.17637355220363e-22 553 508 -1.73611111111111e-07 553 554 -1.05879118406788e-22 553 555 9.25925925922624e-08 553 592 1.73611111111111e-07 553 593 -2.54629629629465e-07 553 594 -1.72053567411030e-22 553 595 -6.01851851852183e-07 553 596 -1.73611111111111e-07 553 597 -2.54629629629465e-07 554 554 2.03703703703770e-06 554 511 -1.73611111111111e-07 554 512 9.25925925922634e-08 554 513 4.76456032830544e-22 554 514 -2.54629629629465e-07 554 515 1.73611111111111e-07 554 552 -6.01851851852182e-07 554 553 -9.26442286059391e-23 554 510 -2.54629629629464e-07 554 555 -3.17637355220363e-22 554 556 -6.01851851852183e-07 554 557 -1.12496563307212e-22 554 594 -2.54629629629464e-07 554 595 1.73611111111111e-07 554 596 9.25925925922626e-08 554 597 -1.12496563307212e-22 554 598 -2.54629629629465e-07 554 599 -1.73611111111111e-07 555 555 2.03703703703770e-06 555 511 -2.54629629629464e-07 555 512 4.83073477730968e-22 555 513 -6.01851851852181e-07 555 514 1.73611111111111e-07 555 515 -2.54629629629465e-07 555 552 -1.19114008207636e-22 555 553 9.25925925922624e-08 555 554 -3.17637355220363e-22 555 510 -1.73611111111111e-07 555 556 -1.19114008207636e-22 555 557 9.25925925922619e-08 555 594 1.73611111111111e-07 555 595 -2.54629629629465e-07 555 596 -1.52201232709757e-22 555 597 -6.01851851852182e-07 555 598 -1.73611111111111e-07 555 599 -2.54629629629465e-07 556 556 2.03703703703770e-06 556 513 -1.73611111111111e-07 556 514 9.25925925922633e-08 556 515 4.89690922631392e-22 556 516 -2.54629629629465e-07 556 517 1.73611111111111e-07 556 554 -6.01851851852183e-07 556 555 -9.92616735063633e-23 556 512 -2.54629629629464e-07 556 557 -3.17637355220363e-22 556 558 -6.01851851852182e-07 556 559 -5.95570041038180e-23 556 596 -2.54629629629465e-07 556 597 1.73611111111111e-07 556 598 9.25925925922624e-08 556 599 -1.52201232709757e-22 556 600 -2.54629629629465e-07 556 601 -1.73611111111111e-07 557 557 2.03703703703770e-06 557 513 -2.54629629629464e-07 557 514 4.89690922631392e-22 557 515 -6.01851851852181e-07 557 516 1.73611111111111e-07 557 517 -2.54629629629465e-07 557 554 -1.19114008207636e-22 557 555 9.25925925922619e-08 557 556 -3.70576914423756e-22 557 512 -1.73611111111111e-07 557 558 -8.60267837055149e-23 557 559 9.25925925922627e-08 557 596 1.73611111111111e-07 557 597 -2.54629629629465e-07 557 598 -1.38966342908909e-22 557 599 -6.01851851852182e-07 557 600 -1.73611111111111e-07 557 601 -2.54629629629465e-07 558 558 2.03703703703770e-06 558 515 -1.73611111111111e-07 558 516 9.25925925922635e-08 558 517 4.69838587930120e-22 558 518 -2.54629629629465e-07 558 519 1.73611111111111e-07 558 556 -6.01851851852182e-07 558 557 -6.61744490042422e-23 558 514 -2.54629629629464e-07 558 559 -3.44107134822060e-22 558 560 -6.01851851852183e-07 558 561 -5.29395592033938e-23 558 598 -2.54629629629464e-07 558 599 1.73611111111111e-07 558 600 9.25925925922626e-08 558 601 -1.38966342908909e-22 558 602 -2.54629629629465e-07 558 603 -1.73611111111111e-07 559 559 2.03703703703770e-06 559 515 -2.54629629629464e-07 559 516 4.63221143029695e-22 559 517 -6.01851851852181e-07 559 518 1.73611111111111e-07 559 519 -2.54629629629465e-07 559 556 -7.27918939046664e-23 559 557 9.25925925922627e-08 559 558 -2.91167575618666e-22 559 514 -1.73611111111111e-07 559 560 -8.60267837055149e-23 559 561 9.25925925922615e-08 559 598 1.73611111111111e-07 559 599 -2.54629629629465e-07 559 600 -1.52201232709757e-22 559 601 -6.01851851852182e-07 559 602 -1.73611111111111e-07 559 603 -2.54629629629465e-07 560 560 1.66676851851906e-02 560 517 -1.73611111111111e-07 560 518 2.38099867724598e-03 560 519 2.67860615079366e-03 560 520 -4.16666666666398e-03 560 521 4.46428571428572e-03 560 558 -6.01851851852183e-07 560 559 -8.60267837055149e-23 560 516 -2.54629629629464e-07 560 561 -4.33680868994202e-18 560 562 -1.30952380952435e-02 560 563 -1.73472347597681e-18 560 600 -2.54629629629465e-07 560 601 1.73611111111111e-07 560 602 2.38099867724597e-03 560 603 -2.67860615079365e-03 560 604 -4.16666666666397e-03 560 605 -4.46428571428572e-03 561 561 1.66676851851906e-02 561 517 -2.54629629629464e-07 561 518 -2.67860615079365e-03 561 519 -6.54791997354768e-03 561 520 4.46428571428572e-03 561 521 -4.16666666666397e-03 561 558 -7.27918939046664e-23 561 559 9.25925925922615e-08 561 560 -5.20417042793042e-18 561 516 -1.73611111111111e-07 561 562 -1.30104260698261e-18 561 563 4.76190476189937e-03 561 600 1.73611111111111e-07 561 601 -2.54629629629464e-07 561 602 2.67860615079365e-03 561 603 -6.54791997354769e-03 561 604 -4.46428571428572e-03 561 605 -4.16666666666397e-03 562 562 3.33333333333442e-02 562 519 -4.46428571428571e-03 562 520 4.76190476189938e-03 562 521 1.17093834628434e-17 562 522 -4.16666666666399e-03 562 523 4.46428571428572e-03 562 560 -1.30952380952435e-02 562 561 -2.16840434497101e-18 562 518 -4.16666666666396e-03 562 563 -8.67361737988404e-18 562 564 -1.30952380952435e-02 562 565 -2.60208521396521e-18 562 602 -4.16666666666396e-03 562 603 4.46428571428571e-03 562 604 4.76190476189936e-03 562 605 -3.46944695195361e-18 562 606 -4.16666666666397e-03 562 607 -4.46428571428572e-03 563 563 3.33333333333441e-02 563 519 -4.16666666666397e-03 563 520 1.30104260698261e-17 563 521 -1.30952380952435e-02 563 522 4.46428571428572e-03 563 523 -4.16666666666396e-03 563 560 -2.60208521396521e-18 563 561 4.76190476189937e-03 563 562 -6.93889390390723e-18 563 518 -4.46428571428571e-03 563 564 -2.16840434497101e-18 563 565 4.76190476189935e-03 563 602 4.46428571428571e-03 563 603 -4.16666666666397e-03 563 604 -4.33680868994202e-18 563 605 -1.30952380952435e-02 563 606 -4.46428571428572e-03 563 607 -4.16666666666397e-03 564 564 3.33333333333442e-02 564 521 -4.46428571428571e-03 564 522 4.76190476189938e-03 564 523 1.17093834628434e-17 564 524 -4.16666666666398e-03 564 525 4.46428571428572e-03 564 562 -1.30952380952435e-02 564 563 -2.16840434497101e-18 564 520 -4.16666666666396e-03 564 565 -6.93889390390723e-18 564 566 -1.30952380952435e-02 564 567 -1.73472347597681e-18 564 604 -4.16666666666397e-03 564 605 4.46428571428571e-03 564 606 4.76190476189937e-03 564 607 -3.90312782094782e-18 564 608 -4.16666666666397e-03 564 609 -4.46428571428572e-03 565 565 3.33333333333441e-02 565 521 -4.16666666666396e-03 565 522 1.30104260698261e-17 565 523 -1.30952380952435e-02 565 524 4.46428571428572e-03 565 525 -4.16666666666396e-03 565 562 -2.60208521396521e-18 565 563 4.76190476189935e-03 565 564 -6.93889390390723e-18 565 520 -4.46428571428571e-03 565 566 -1.73472347597681e-18 565 567 4.76190476189935e-03 565 604 4.46428571428571e-03 565 605 -4.16666666666396e-03 565 606 -3.46944695195361e-18 565 607 -1.30952380952435e-02 565 608 -4.46428571428572e-03 565 609 -4.16666666666397e-03 566 566 3.33333333333442e-02 566 523 -4.46428571428571e-03 566 524 4.76190476189938e-03 566 525 1.25767452008319e-17 566 526 -4.16666666666398e-03 566 527 4.46428571428572e-03 566 564 -1.30952380952435e-02 566 565 -1.73472347597681e-18 566 522 -4.16666666666396e-03 566 567 -7.80625564189563e-18 566 568 -1.30952380952435e-02 566 569 -3.46944695195361e-18 566 606 -4.16666666666397e-03 566 607 4.46428571428571e-03 566 608 4.76190476189936e-03 566 609 -4.77048955893622e-18 566 610 -4.16666666666397e-03 566 611 -4.46428571428572e-03 567 567 3.33333333333441e-02 567 523 -4.16666666666396e-03 567 524 1.25767452008319e-17 567 525 -1.30952380952435e-02 567 526 4.46428571428572e-03 567 527 -4.16666666666397e-03 567 564 -2.60208521396521e-18 567 565 4.76190476189935e-03 567 566 -6.93889390390723e-18 567 522 -4.46428571428571e-03 567 568 -1.73472347597681e-18 567 569 4.76190476189936e-03 567 606 4.46428571428571e-03 567 607 -4.16666666666396e-03 567 608 -4.77048955893622e-18 567 609 -1.30952380952435e-02 567 610 -4.46428571428572e-03 567 611 -4.16666666666397e-03 568 568 3.33333333333441e-02 568 525 -4.46428571428571e-03 568 526 4.76190476189936e-03 568 527 1.17093834628434e-17 568 528 -4.16666666666398e-03 568 529 4.46428571428572e-03 568 566 -1.30952380952435e-02 568 567 -1.73472347597681e-18 568 524 -4.16666666666396e-03 568 569 -6.07153216591882e-18 568 570 -1.30952380952435e-02 568 571 -2.60208521396521e-18 568 608 -4.16666666666396e-03 568 609 4.46428571428571e-03 568 610 4.76190476189935e-03 568 611 -3.90312782094782e-18 568 612 -4.16666666666396e-03 568 613 -4.46428571428572e-03 569 569 3.33333333333442e-02 569 525 -4.16666666666396e-03 569 526 1.30104260698261e-17 569 527 -1.30952380952435e-02 569 528 4.46428571428572e-03 569 529 -4.16666666666397e-03 569 566 -3.03576608295941e-18 569 567 4.76190476189936e-03 569 568 -6.93889390390723e-18 569 524 -4.46428571428571e-03 569 570 -2.16840434497101e-18 569 571 4.76190476189938e-03 569 608 4.46428571428571e-03 569 609 -4.16666666666397e-03 569 610 -3.46944695195361e-18 569 611 -1.30952380952435e-02 569 612 -4.46428571428572e-03 569 613 -4.16666666666398e-03 570 570 3.33333333333441e-02 570 527 -4.46428571428571e-03 570 528 4.76190476189936e-03 570 529 1.21430643318376e-17 570 530 -4.16666666666398e-03 570 531 4.46428571428572e-03 570 568 -1.30952380952435e-02 570 569 -2.16840434497101e-18 570 526 -4.16666666666395e-03 570 571 -7.80625564189563e-18 570 572 -1.30952380952435e-02 570 573 -1.73472347597681e-18 570 610 -4.16666666666396e-03 570 611 4.46428571428571e-03 570 612 4.76190476189935e-03 570 613 -3.90312782094782e-18 570 614 -4.16666666666397e-03 570 615 -4.46428571428572e-03 571 571 3.33333333333442e-02 571 527 -4.16666666666397e-03 571 528 1.25767452008319e-17 571 529 -1.30952380952435e-02 571 530 4.46428571428572e-03 571 531 -4.16666666666397e-03 571 568 -2.60208521396521e-18 571 569 4.76190476189938e-03 571 570 -7.80625564189563e-18 571 526 -4.46428571428571e-03 571 572 -2.16840434497101e-18 571 573 4.76190476189936e-03 571 610 4.46428571428571e-03 571 611 -4.16666666666397e-03 571 612 -4.33680868994202e-18 571 613 -1.30952380952435e-02 571 614 -4.46428571428572e-03 571 615 -4.16666666666397e-03 572 572 3.33333333333442e-02 572 529 -4.46428571428571e-03 572 530 4.76190476189938e-03 572 531 1.25767452008319e-17 572 532 -4.16666666666398e-03 572 533 4.46428571428572e-03 572 570 -1.30952380952435e-02 572 571 -2.16840434497101e-18 572 528 -4.16666666666396e-03 572 573 -8.67361737988404e-18 572 574 -1.30952380952435e-02 572 575 -1.73472347597681e-18 572 612 -4.16666666666396e-03 572 613 4.46428571428571e-03 572 614 4.76190476189936e-03 572 615 -3.90312782094782e-18 572 616 -4.16666666666397e-03 572 617 -4.46428571428572e-03 573 573 3.33333333333441e-02 573 529 -4.16666666666396e-03 573 530 1.34441069388203e-17 573 531 -1.30952380952435e-02 573 532 4.46428571428572e-03 573 533 -4.16666666666396e-03 573 570 -3.03576608295941e-18 573 571 4.76190476189936e-03 573 572 -6.93889390390723e-18 573 528 -4.46428571428571e-03 573 574 -1.73472347597681e-18 573 575 4.76190476189935e-03 573 612 4.46428571428571e-03 573 613 -4.16666666666397e-03 573 614 -3.90312782094782e-18 573 615 -1.30952380952435e-02 573 616 -4.46428571428572e-03 573 617 -4.16666666666397e-03 574 574 3.33333333333442e-02 574 531 -4.46428571428571e-03 574 532 4.76190476189938e-03 574 533 1.25767452008319e-17 574 534 -4.16666666666399e-03 574 535 4.46428571428572e-03 574 572 -1.30952380952435e-02 574 573 -1.73472347597681e-18 574 530 -4.16666666666396e-03 574 575 -6.93889390390723e-18 574 576 -1.30952380952435e-02 574 577 -2.16840434497101e-18 574 614 -4.16666666666397e-03 574 615 4.46428571428571e-03 574 616 4.76190476189937e-03 574 617 -4.33680868994202e-18 574 618 -4.16666666666397e-03 574 619 -4.46428571428572e-03 575 575 3.33333333333441e-02 575 531 -4.16666666666396e-03 575 532 1.30104260698261e-17 575 533 -1.30952380952435e-02 575 534 4.46428571428572e-03 575 535 -4.16666666666396e-03 575 572 -2.60208521396521e-18 575 573 4.76190476189935e-03 575 574 -6.07153216591882e-18 575 530 -4.46428571428571e-03 575 576 -1.73472347597681e-18 575 577 4.76190476189935e-03 575 614 4.46428571428571e-03 575 615 -4.16666666666396e-03 575 616 -4.33680868994202e-18 575 617 -1.30952380952435e-02 575 618 -4.46428571428572e-03 575 619 -4.16666666666397e-03 576 576 1.17051282051320e+00 576 533 -4.46428571428571e-03 576 534 9.85347985346090e-02 576 535 4.53983516483520e-02 576 536 -2.88461538461352e-01 576 537 2.40384615384616e-01 576 574 -1.30952380952435e-02 576 575 -1.73472347597681e-18 576 532 -4.16666666666396e-03 576 577 -2.77555756156289e-16 576 578 -7.69230769231143e-01 576 579 -1.11022302462516e-16 576 616 -4.16666666666397e-03 576 617 4.46428571428571e-03 576 618 9.85347985346085e-02 576 619 -4.53983516483518e-02 576 620 -2.88461538461351e-01 576 621 -2.40384615384615e-01 577 577 1.17051282051320e+00 577 533 -4.16666666666396e-03 577 534 -4.53983516483513e-02 577 535 -3.91163003663193e-01 577 536 2.40384615384616e-01 577 537 -2.88461538461352e-01 577 574 -3.03576608295941e-18 577 575 4.76190476189935e-03 577 576 -2.77555756156289e-16 577 532 -4.46428571428571e-03 577 578 -1.11022302462516e-16 577 579 1.92307692307319e-01 577 616 4.46428571428571e-03 577 617 -4.16666666666396e-03 577 618 4.53983516483516e-02 577 619 -3.91163003663194e-01 577 620 -2.40384615384615e-01 577 621 -2.88461538461352e-01 578 578 2.30769230769306e+00 578 535 -2.40384615384615e-01 578 536 1.92307692307319e-01 578 537 6.45317133063372e-16 578 538 -2.88461538461352e-01 578 539 2.40384615384616e-01 578 576 -7.69230769231143e-01 578 577 -1.11022302462516e-16 578 534 -2.88461538461351e-01 578 579 -4.16333634234434e-16 578 580 -7.69230769231144e-01 578 581 -1.24900090270330e-16 578 618 -2.88461538461351e-01 578 619 2.40384615384615e-01 578 620 1.92307692307318e-01 578 621 -2.22044604925031e-16 578 622 -2.88461538461352e-01 578 623 -2.40384615384615e-01 579 579 2.30769230769306e+00 579 535 -2.88461538461351e-01 579 536 6.80011602582908e-16 579 537 -7.69230769231142e-01 579 538 2.40384615384616e-01 579 539 -2.88461538461351e-01 579 576 -1.17961196366423e-16 579 577 1.92307692307319e-01 579 578 -4.44089209850063e-16 579 534 -2.40384615384615e-01 579 580 -6.93889390390723e-17 579 581 1.92307692307318e-01 579 618 2.40384615384615e-01 579 619 -2.88461538461352e-01 579 620 -1.94289029309402e-16 579 621 -7.69230769231144e-01 579 622 -2.40384615384615e-01 579 623 -2.88461538461351e-01 580 580 2.30769230769306e+00 580 537 -2.40384615384615e-01 580 538 1.92307692307321e-01 580 539 6.80011602582908e-16 580 540 -2.88461538461353e-01 580 541 2.40384615384616e-01 580 578 -7.69230769231144e-01 580 579 -1.38777878078145e-16 580 536 -2.88461538461351e-01 580 581 -4.44089209850063e-16 580 582 -7.69230769231147e-01 580 583 -1.59594559789866e-16 580 620 -2.88461538461351e-01 580 621 2.40384615384615e-01 580 622 1.92307692307319e-01 580 623 -2.28983498828939e-16 580 624 -2.88461538461352e-01 580 625 -2.40384615384615e-01 581 581 2.30769230769305e+00 581 537 -2.88461538461351e-01 581 538 6.80011602582908e-16 581 539 -7.69230769231140e-01 581 540 2.40384615384616e-01 581 541 -2.88461538461351e-01 581 578 -1.24900090270330e-16 581 579 1.92307692307318e-01 581 580 -4.16333634234434e-16 581 536 -2.40384615384615e-01 581 582 -1.59594559789866e-16 581 583 1.92307692307316e-01 581 620 2.40384615384615e-01 581 621 -2.88461538461351e-01 581 622 -2.01227923213310e-16 581 623 -7.69230769231142e-01 581 624 -2.40384615384615e-01 581 625 -2.88461538461351e-01 582 582 2.30769230769306e+00 582 539 -2.40384615384615e-01 582 540 1.92307692307320e-01 582 541 6.17561557447743e-16 582 542 -2.88461538461352e-01 582 543 2.40384615384616e-01 582 580 -7.69230769231147e-01 582 581 -1.59594559789866e-16 582 538 -2.88461538461352e-01 582 583 -3.60822483003176e-16 582 584 -7.69230769231142e-01 582 585 -1.45716771982052e-16 582 622 -2.88461538461352e-01 582 623 2.40384615384615e-01 582 624 1.92307692307319e-01 582 625 -2.01227923213310e-16 582 626 -2.88461538461351e-01 582 627 -2.40384615384615e-01 583 583 2.30769230769305e+00 583 539 -2.88461538461351e-01 583 540 6.66133814775094e-16 583 541 -7.69230769231141e-01 583 542 2.40384615384616e-01 583 543 -2.88461538461352e-01 583 580 -1.52655665885959e-16 583 581 1.92307692307316e-01 583 582 -3.88578058618805e-16 583 538 -2.40384615384615e-01 583 584 -1.52655665885959e-16 583 585 1.92307692307319e-01 583 622 2.40384615384615e-01 583 623 -2.88461538461351e-01 583 624 -2.28983498828939e-16 583 625 -7.69230769231142e-01 583 626 -2.40384615384615e-01 583 627 -2.88461538461352e-01 584 584 2.30769230769305e+00 584 541 -2.40384615384615e-01 584 542 1.92307692307318e-01 584 543 6.86950496486816e-16 584 544 -2.88461538461352e-01 584 545 2.40384615384616e-01 584 582 -7.69230769231142e-01 584 583 -1.38777878078145e-16 584 540 -2.88461538461351e-01 584 585 -4.44089209850063e-16 584 586 -7.69230769231143e-01 584 587 -1.11022302462516e-16 584 624 -2.88461538461351e-01 584 625 2.40384615384615e-01 584 626 1.92307692307317e-01 584 627 -2.08166817117217e-16 584 628 -2.88461538461351e-01 584 629 -2.40384615384615e-01 585 585 2.30769230769306e+00 585 541 -2.88461538461351e-01 585 542 6.86950496486816e-16 585 543 -7.69230769231143e-01 585 544 2.40384615384616e-01 585 545 -2.88461538461352e-01 585 582 -1.17961196366423e-16 585 583 1.92307692307319e-01 585 584 -4.71844785465692e-16 585 540 -2.40384615384615e-01 585 586 -1.11022302462516e-16 585 587 1.92307692307319e-01 585 624 2.40384615384615e-01 585 625 -2.88461538461352e-01 585 626 -1.80411241501588e-16 585 627 -7.69230769231145e-01 585 628 -2.40384615384615e-01 585 629 -2.88461538461352e-01 586 586 2.30769230769306e+00 586 543 -2.40384615384615e-01 586 544 1.92307692307319e-01 586 545 6.45317133063372e-16 586 584 -7.69230769231143e-01 586 585 -1.11022302462516e-16 586 542 -2.88461538461351e-01 586 587 -3.88578058618805e-16 586 626 -2.88461538461351e-01 586 627 2.40384615384615e-01 586 628 1.92307692307318e-01 586 629 -2.08166817117217e-16 587 587 2.30769230769305e+00 587 543 -2.88461538461351e-01 587 544 6.93889390390723e-16 587 545 -7.69230769231142e-01 587 584 -1.17961196366423e-16 587 585 1.92307692307319e-01 587 586 -4.16333634234434e-16 587 542 -2.40384615384615e-01 587 626 2.40384615384615e-01 587 627 -2.88461538461352e-01 587 628 -1.80411241501588e-16 587 629 -7.69230769231143e-01 588 588 2.03703703703770e-06 588 547 -1.52201232709757e-22 588 548 -2.54629629629464e-07 588 549 1.73611111111111e-07 588 546 9.25925925922626e-08 588 589 3.97046694025453e-22 588 590 -6.01851851852183e-07 588 591 9.26442286059391e-23 588 630 9.25925925922632e-08 588 631 -2.71315240917393e-22 588 632 -2.54629629629465e-07 588 633 -1.73611111111111e-07 589 589 2.03703703703770e-06 589 547 -6.01851851852182e-07 589 548 1.73611111111111e-07 589 549 -2.54629629629465e-07 589 588 3.44107134822060e-22 589 546 -1.25731453108060e-22 589 590 1.32348898008484e-22 589 591 9.25925925922622e-08 589 630 -2.77932685817817e-22 589 631 -6.01851851852181e-07 589 632 -1.73611111111111e-07 589 633 -2.54629629629465e-07 590 590 2.03703703703770e-06 590 547 -1.73611111111111e-07 590 548 9.25925925922626e-08 590 549 -1.52201232709757e-22 590 550 -2.54629629629464e-07 590 551 1.73611111111111e-07 590 588 -6.01851851852183e-07 590 589 1.25731453108060e-22 590 546 -2.54629629629465e-07 590 591 3.97046694025453e-22 590 592 -6.01851851852183e-07 590 593 9.26442286059391e-23 590 630 -2.54629629629464e-07 590 631 1.73611111111111e-07 590 632 9.25925925922632e-08 590 633 -2.71315240917393e-22 590 634 -2.54629629629465e-07 590 635 -1.73611111111111e-07 591 591 2.03703703703770e-06 591 547 -2.54629629629465e-07 591 548 -1.25731453108060e-22 591 549 -6.01851851852182e-07 591 550 1.73611111111111e-07 591 551 -2.54629629629465e-07 591 588 1.12496563307212e-22 591 589 9.25925925922622e-08 591 590 3.44107134822060e-22 591 546 -1.73611111111111e-07 591 592 1.32348898008484e-22 591 593 9.25925925922622e-08 591 630 1.73611111111111e-07 591 631 -2.54629629629464e-07 591 632 -2.77932685817817e-22 591 633 -6.01851851852181e-07 591 634 -1.73611111111111e-07 591 635 -2.54629629629465e-07 592 592 2.03703703703770e-06 592 549 -1.73611111111111e-07 592 550 9.25925925922625e-08 592 551 -1.52201232709757e-22 592 552 -2.54629629629464e-07 592 553 1.73611111111111e-07 592 590 -6.01851851852183e-07 592 591 1.25731453108060e-22 592 548 -2.54629629629465e-07 592 593 3.70576914423756e-22 592 594 -6.01851851852183e-07 592 595 9.26442286059391e-23 592 632 -2.54629629629464e-07 592 633 1.73611111111111e-07 592 634 9.25925925922632e-08 592 635 -2.91167575618666e-22 592 636 -2.54629629629465e-07 592 637 -1.73611111111111e-07 593 593 2.03703703703770e-06 593 549 -2.54629629629465e-07 593 550 -1.32348898008484e-22 593 551 -6.01851851852182e-07 593 552 1.73611111111111e-07 593 553 -2.54629629629465e-07 593 590 1.12496563307212e-22 593 591 9.25925925922622e-08 593 592 3.17637355220363e-22 593 548 -1.73611111111111e-07 593 594 1.12496563307212e-22 593 595 9.25925925922624e-08 593 632 1.73611111111111e-07 593 633 -2.54629629629464e-07 593 634 -2.64697796016969e-22 593 635 -6.01851851852181e-07 593 636 -1.73611111111111e-07 593 637 -2.54629629629465e-07 594 594 2.03703703703770e-06 594 551 -1.73611111111111e-07 594 552 9.25925925922624e-08 594 553 -1.58818677610181e-22 594 554 -2.54629629629464e-07 594 555 1.73611111111111e-07 594 592 -6.01851851852182e-07 594 593 1.12496563307212e-22 594 550 -2.54629629629465e-07 594 595 3.97046694025453e-22 594 596 -6.01851851852182e-07 594 597 9.92616735063633e-23 594 634 -2.54629629629464e-07 594 635 1.73611111111111e-07 594 636 9.25925925922631e-08 594 637 -2.97785020519090e-22 594 638 -2.54629629629465e-07 594 639 -1.73611111111111e-07 595 595 2.03703703703770e-06 595 551 -2.54629629629465e-07 595 552 -1.25731453108060e-22 595 553 -6.01851851852183e-07 595 554 1.73611111111111e-07 595 555 -2.54629629629465e-07 595 592 1.19114008207636e-22 595 593 9.25925925922624e-08 595 594 3.97046694025453e-22 595 550 -1.73611111111111e-07 595 596 9.92616735063633e-23 595 597 9.25925925922624e-08 595 634 1.73611111111111e-07 595 635 -2.54629629629464e-07 595 636 -2.91167575618666e-22 595 637 -6.01851851852181e-07 595 638 -1.73611111111111e-07 595 639 -2.54629629629465e-07 596 596 2.03703703703770e-06 596 553 -1.73611111111111e-07 596 554 9.25925925922626e-08 596 555 -1.58818677610181e-22 596 556 -2.54629629629465e-07 596 557 1.73611111111111e-07 596 594 -6.01851851852182e-07 596 595 1.12496563307212e-22 596 552 -2.54629629629465e-07 596 597 4.23516473627150e-22 596 598 -6.01851851852183e-07 596 599 1.05879118406788e-22 596 636 -2.54629629629464e-07 596 637 1.73611111111111e-07 596 638 9.25925925922633e-08 596 639 -2.84550130718242e-22 596 640 -2.54629629629465e-07 596 641 -1.73611111111111e-07 597 597 2.03703703703770e-06 597 553 -2.54629629629465e-07 597 554 -1.12496563307212e-22 597 555 -6.01851851852182e-07 597 556 1.73611111111111e-07 597 557 -2.54629629629465e-07 597 594 1.19114008207636e-22 597 595 9.25925925922624e-08 597 596 3.44107134822060e-22 597 552 -1.73611111111111e-07 597 598 1.12496563307212e-22 597 599 9.25925925922619e-08 597 636 1.73611111111111e-07 597 637 -2.54629629629464e-07 597 638 -2.71315240917393e-22 597 639 -6.01851851852181e-07 597 640 -1.73611111111111e-07 597 641 -2.54629629629465e-07 598 598 2.03703703703770e-06 598 555 -1.73611111111111e-07 598 556 9.25925925922624e-08 598 557 -1.32348898008484e-22 598 558 -2.54629629629464e-07 598 559 1.73611111111111e-07 598 596 -6.01851851852183e-07 598 597 9.26442286059391e-23 598 554 -2.54629629629465e-07 598 599 3.97046694025453e-22 598 600 -6.01851851852182e-07 598 601 1.05879118406788e-22 598 638 -2.54629629629465e-07 598 639 1.73611111111111e-07 598 640 9.25925925922632e-08 598 641 -3.04402465419514e-22 598 642 -2.54629629629465e-07 598 643 -1.73611111111111e-07 599 599 2.03703703703770e-06 599 555 -2.54629629629465e-07 599 556 -1.45583787809333e-22 599 557 -6.01851851852182e-07 599 558 1.73611111111111e-07 599 559 -2.54629629629465e-07 599 596 1.12496563307212e-22 599 597 9.25925925922619e-08 599 598 3.44107134822060e-22 599 554 -1.73611111111111e-07 599 600 1.19114008207636e-22 599 601 9.25925925922628e-08 599 638 1.73611111111111e-07 599 639 -2.54629629629464e-07 599 640 -2.71315240917393e-22 599 641 -6.01851851852181e-07 599 642 -1.73611111111111e-07 599 643 -2.54629629629465e-07 600 600 2.03703703703770e-06 600 557 -1.73611111111111e-07 600 558 9.25925925922626e-08 600 559 -1.45583787809333e-22 600 560 -2.54629629629465e-07 600 561 1.73611111111111e-07 600 598 -6.01851851852182e-07 600 599 9.92616735063633e-23 600 556 -2.54629629629465e-07 600 601 3.97046694025453e-22 600 602 -6.01851851852183e-07 600 603 7.94093388050907e-23 600 640 -2.54629629629464e-07 600 641 1.73611111111111e-07 600 642 9.25925925922634e-08 600 643 -2.77932685817817e-22 600 644 -2.54629629629465e-07 600 645 -1.73611111111111e-07 601 601 2.03703703703770e-06 601 557 -2.54629629629465e-07 601 558 -1.52201232709757e-22 601 559 -6.01851851852182e-07 601 560 1.73611111111111e-07 601 561 -2.54629629629464e-07 601 598 1.05879118406788e-22 601 599 9.25925925922628e-08 601 600 3.70576914423756e-22 601 556 -1.73611111111111e-07 601 602 1.19114008207636e-22 601 603 9.25925925922616e-08 601 640 1.73611111111111e-07 601 641 -2.54629629629464e-07 601 642 -2.64697796016969e-22 601 643 -6.01851851852181e-07 601 644 -1.73611111111111e-07 601 645 -2.54629629629464e-07 602 602 1.66676851851906e-02 602 559 -1.73611111111111e-07 602 560 2.38099867724597e-03 602 561 2.67860615079365e-03 602 562 -4.16666666666396e-03 602 563 4.46428571428571e-03 602 600 -6.01851851852183e-07 602 601 1.05879118406788e-22 602 558 -2.54629629629465e-07 602 603 5.20417042793042e-18 602 604 -1.30952380952435e-02 602 605 2.60208521396521e-18 602 642 -2.54629629629465e-07 602 643 1.73611111111111e-07 602 644 2.38099867724598e-03 602 645 -2.67860615079365e-03 602 646 -4.16666666666397e-03 602 647 -4.46428571428572e-03 603 603 1.66676851851906e-02 603 559 -2.54629629629465e-07 603 560 -2.67860615079365e-03 603 561 -6.54791997354769e-03 603 562 4.46428571428571e-03 603 563 -4.16666666666397e-03 603 600 1.05879118406788e-22 603 601 9.25925925922615e-08 603 602 5.20417042793042e-18 603 558 -1.73611111111111e-07 603 604 1.73472347597681e-18 603 605 4.76190476189937e-03 603 642 1.73611111111111e-07 603 643 -2.54629629629464e-07 603 644 2.67860615079365e-03 603 645 -6.54791997354768e-03 603 646 -4.46428571428572e-03 603 647 -4.16666666666397e-03 604 604 3.33333333333442e-02 604 561 -4.46428571428572e-03 604 562 4.76190476189936e-03 604 563 -4.33680868994202e-18 604 564 -4.16666666666397e-03 604 565 4.46428571428571e-03 604 602 -1.30952380952435e-02 604 603 1.73472347597681e-18 604 560 -4.16666666666397e-03 604 605 1.04083408558608e-17 604 606 -1.30952380952435e-02 604 607 2.60208521396521e-18 604 644 -4.16666666666396e-03 604 645 4.46428571428571e-03 604 646 4.76190476189937e-03 604 647 -6.93889390390723e-18 604 648 -4.16666666666398e-03 604 649 -4.46428571428572e-03 605 605 3.33333333333441e-02 605 561 -4.16666666666397e-03 605 562 -4.33680868994202e-18 605 563 -1.30952380952435e-02 605 564 4.46428571428571e-03 605 565 -4.16666666666396e-03 605 602 2.60208521396521e-18 605 603 4.76190476189937e-03 605 604 1.21430643318376e-17 605 560 -4.46428571428572e-03 605 606 1.73472347597681e-18 605 607 4.76190476189935e-03 605 644 4.46428571428571e-03 605 645 -4.16666666666397e-03 605 646 -7.80625564189563e-18 605 647 -1.30952380952435e-02 605 648 -4.46428571428572e-03 605 649 -4.16666666666396e-03 606 606 3.33333333333442e-02 606 563 -4.46428571428572e-03 606 564 4.76190476189937e-03 606 565 -3.46944695195361e-18 606 566 -4.16666666666397e-03 606 567 4.46428571428571e-03 606 604 -1.30952380952435e-02 606 605 2.60208521396521e-18 606 562 -4.16666666666397e-03 606 607 9.54097911787244e-18 606 608 -1.30952380952435e-02 606 609 2.60208521396521e-18 606 646 -4.16666666666397e-03 606 647 4.46428571428571e-03 606 648 4.76190476189938e-03 606 649 -7.37257477290143e-18 606 650 -4.16666666666398e-03 606 651 -4.46428571428572e-03 607 607 3.33333333333441e-02 607 563 -4.16666666666397e-03 607 564 -4.33680868994202e-18 607 565 -1.30952380952435e-02 607 566 4.46428571428571e-03 607 567 -4.16666666666397e-03 607 604 3.03576608295941e-18 607 605 4.76190476189935e-03 607 606 1.04083408558608e-17 607 562 -4.46428571428572e-03 607 608 1.73472347597681e-18 607 609 4.76190476189935e-03 607 646 4.46428571428571e-03 607 647 -4.16666666666396e-03 607 648 -8.23993651088983e-18 607 649 -1.30952380952435e-02 607 650 -4.46428571428572e-03 607 651 -4.16666666666396e-03 608 608 3.33333333333442e-02 608 565 -4.46428571428572e-03 608 566 4.76190476189936e-03 608 567 -3.46944695195361e-18 608 568 -4.16666666666396e-03 608 569 4.46428571428571e-03 608 606 -1.30952380952435e-02 608 607 2.60208521396521e-18 608 564 -4.16666666666397e-03 608 609 1.04083408558608e-17 608 610 -1.30952380952435e-02 608 611 3.03576608295941e-18 608 648 -4.16666666666397e-03 608 649 4.46428571428571e-03 608 650 4.76190476189938e-03 608 651 -7.37257477290143e-18 608 652 -4.16666666666398e-03 608 653 -4.46428571428572e-03 609 609 3.33333333333441e-02 609 565 -4.16666666666397e-03 609 566 -3.90312782094782e-18 609 567 -1.30952380952435e-02 609 568 4.46428571428571e-03 609 569 -4.16666666666397e-03 609 606 3.03576608295941e-18 609 607 4.76190476189935e-03 609 608 1.04083408558608e-17 609 564 -4.46428571428572e-03 609 610 1.73472347597681e-18 609 611 4.76190476189936e-03 609 648 4.46428571428571e-03 609 649 -4.16666666666396e-03 609 650 -6.93889390390723e-18 609 651 -1.30952380952435e-02 609 652 -4.46428571428572e-03 609 653 -4.16666666666397e-03 610 610 3.33333333333441e-02 610 567 -4.46428571428572e-03 610 568 4.76190476189935e-03 610 569 -3.03576608295941e-18 610 570 -4.16666666666396e-03 610 571 4.46428571428571e-03 610 608 -1.30952380952435e-02 610 609 1.73472347597681e-18 610 566 -4.16666666666397e-03 610 611 1.04083408558608e-17 610 612 -1.30952380952435e-02 610 613 3.03576608295941e-18 610 650 -4.16666666666396e-03 610 651 4.46428571428571e-03 610 652 4.76190476189936e-03 610 653 -7.37257477290143e-18 610 654 -4.16666666666397e-03 610 655 -4.46428571428572e-03 611 611 3.33333333333442e-02 611 567 -4.16666666666397e-03 611 568 -3.46944695195361e-18 611 569 -1.30952380952435e-02 611 570 4.46428571428571e-03 611 571 -4.16666666666397e-03 611 608 3.46944695195361e-18 611 609 4.76190476189936e-03 611 610 9.54097911787244e-18 611 566 -4.46428571428572e-03 611 612 1.30104260698261e-18 611 613 4.76190476189938e-03 611 650 4.46428571428571e-03 611 651 -4.16666666666396e-03 611 652 -8.67361737988404e-18 611 653 -1.30952380952435e-02 611 654 -4.46428571428572e-03 611 655 -4.16666666666397e-03 612 612 3.33333333333441e-02 612 569 -4.46428571428572e-03 612 570 4.76190476189935e-03 612 571 -4.33680868994202e-18 612 572 -4.16666666666396e-03 612 573 4.46428571428571e-03 612 610 -1.30952380952435e-02 612 611 2.16840434497101e-18 612 568 -4.16666666666396e-03 612 613 1.04083408558608e-17 612 614 -1.30952380952435e-02 612 615 2.60208521396521e-18 612 652 -4.16666666666396e-03 612 653 4.46428571428571e-03 612 654 4.76190476189936e-03 612 655 -6.50521303491303e-18 612 656 -4.16666666666398e-03 612 657 -4.46428571428572e-03 613 613 3.33333333333442e-02 613 569 -4.16666666666398e-03 613 570 -3.46944695195361e-18 613 571 -1.30952380952435e-02 613 572 4.46428571428571e-03 613 573 -4.16666666666397e-03 613 610 3.03576608295941e-18 613 611 4.76190476189938e-03 613 612 9.54097911787244e-18 613 568 -4.46428571428572e-03 613 614 2.16840434497101e-18 613 615 4.76190476189936e-03 613 652 4.46428571428571e-03 613 653 -4.16666666666397e-03 613 654 -7.80625564189563e-18 613 655 -1.30952380952435e-02 613 656 -4.46428571428572e-03 613 657 -4.16666666666397e-03 614 614 3.33333333333442e-02 614 571 -4.46428571428572e-03 614 572 4.76190476189936e-03 614 573 -3.90312782094782e-18 614 574 -4.16666666666397e-03 614 575 4.46428571428571e-03 614 612 -1.30952380952435e-02 614 613 1.73472347597681e-18 614 570 -4.16666666666397e-03 614 615 1.04083408558608e-17 614 616 -1.30952380952435e-02 614 617 2.60208521396521e-18 614 654 -4.16666666666396e-03 614 655 4.46428571428571e-03 614 656 4.76190476189938e-03 614 657 -6.93889390390723e-18 614 658 -4.16666666666398e-03 614 659 -4.46428571428572e-03 615 615 3.33333333333441e-02 615 571 -4.16666666666397e-03 615 572 -4.33680868994202e-18 615 573 -1.30952380952435e-02 615 574 4.46428571428571e-03 615 575 -4.16666666666397e-03 615 612 3.03576608295941e-18 615 613 4.76190476189936e-03 615 614 1.04083408558608e-17 615 570 -4.46428571428572e-03 615 616 1.73472347597681e-18 615 617 4.76190476189935e-03 615 654 4.46428571428571e-03 615 655 -4.16666666666396e-03 615 656 -7.80625564189563e-18 615 657 -1.30952380952435e-02 615 658 -4.46428571428572e-03 615 659 -4.16666666666396e-03 616 616 3.33333333333442e-02 616 573 -4.46428571428572e-03 616 574 4.76190476189937e-03 616 575 -3.46944695195361e-18 616 576 -4.16666666666397e-03 616 577 4.46428571428571e-03 616 614 -1.30952380952435e-02 616 615 2.60208521396521e-18 616 572 -4.16666666666397e-03 616 617 9.54097911787244e-18 616 618 -1.30952380952435e-02 616 619 2.16840434497101e-18 616 656 -4.16666666666397e-03 616 657 4.46428571428571e-03 616 658 4.76190476189938e-03 616 659 -7.37257477290143e-18 616 660 -4.16666666666398e-03 616 661 -4.46428571428572e-03 617 617 3.33333333333441e-02 617 573 -4.16666666666397e-03 617 574 -4.33680868994202e-18 617 575 -1.30952380952435e-02 617 576 4.46428571428571e-03 617 577 -4.16666666666396e-03 617 614 3.03576608295941e-18 617 615 4.76190476189935e-03 617 616 1.04083408558608e-17 617 572 -4.46428571428572e-03 617 618 1.73472347597681e-18 617 619 4.76190476189935e-03 617 656 4.46428571428571e-03 617 657 -4.16666666666396e-03 617 658 -7.37257477290143e-18 617 659 -1.30952380952435e-02 617 660 -4.46428571428572e-03 617 661 -4.16666666666396e-03 618 618 1.17051282051320e+00 618 575 -4.46428571428572e-03 618 576 9.85347985346085e-02 618 577 4.53983516483516e-02 618 578 -2.88461538461351e-01 618 579 2.40384615384615e-01 618 616 -1.30952380952435e-02 618 617 2.60208521396521e-18 618 574 -4.16666666666397e-03 618 619 2.77555756156289e-16 618 620 -7.69230769231142e-01 618 621 1.52655665885959e-16 618 658 -4.16666666666397e-03 618 659 4.46428571428571e-03 618 660 9.85347985346090e-02 618 661 -4.53983516483519e-02 618 662 -2.88461538461352e-01 618 663 -2.40384615384616e-01 619 619 1.17051282051320e+00 619 575 -4.16666666666397e-03 619 576 -4.53983516483518e-02 619 577 -3.91163003663194e-01 619 578 2.40384615384615e-01 619 579 -2.88461538461352e-01 619 616 3.03576608295941e-18 619 617 4.76190476189935e-03 619 618 2.77555756156289e-16 619 574 -4.46428571428572e-03 619 620 1.45716771982052e-16 619 621 1.92307692307319e-01 619 658 4.46428571428571e-03 619 659 -4.16666666666396e-03 619 660 4.53983516483514e-02 619 661 -3.91163003663193e-01 619 662 -2.40384615384615e-01 619 663 -2.88461538461352e-01 620 620 2.30769230769306e+00 620 577 -2.40384615384615e-01 620 578 1.92307692307318e-01 620 579 -1.87350135405495e-16 620 580 -2.88461538461351e-01 620 581 2.40384615384615e-01 620 618 -7.69230769231143e-01 620 619 1.73472347597681e-16 620 576 -2.88461538461351e-01 620 621 5.82867087928207e-16 620 622 -7.69230769231144e-01 620 623 1.38777878078145e-16 620 660 -2.88461538461351e-01 620 661 2.40384615384615e-01 620 662 1.92307692307319e-01 620 663 -4.16333634234434e-16 620 664 -2.88461538461352e-01 620 665 -2.40384615384616e-01 621 621 2.30769230769306e+00 621 577 -2.88461538461352e-01 621 578 -1.80411241501588e-16 621 579 -7.69230769231144e-01 621 580 2.40384615384615e-01 621 581 -2.88461538461351e-01 621 618 1.66533453693773e-16 621 619 1.92307692307319e-01 621 620 5.82867087928207e-16 621 576 -2.40384615384615e-01 621 622 1.73472347597681e-16 621 623 1.92307692307318e-01 621 660 2.40384615384615e-01 621 661 -2.88461538461351e-01 621 662 -3.95516952522712e-16 621 663 -7.69230769231142e-01 621 664 -2.40384615384616e-01 621 665 -2.88461538461351e-01 622 622 2.30769230769306e+00 622 579 -2.40384615384615e-01 622 580 1.92307692307319e-01 622 581 -1.87350135405495e-16 622 582 -2.88461538461352e-01 622 583 2.40384615384615e-01 622 620 -7.69230769231144e-01 622 621 1.45716771982052e-16 622 578 -2.88461538461352e-01 622 623 6.38378239159465e-16 622 624 -7.69230769231147e-01 622 625 1.73472347597681e-16 622 662 -2.88461538461351e-01 622 663 2.40384615384615e-01 622 664 1.92307692307320e-01 622 665 -4.37150315946155e-16 622 666 -2.88461538461353e-01 622 667 -2.40384615384616e-01 623 623 2.30769230769305e+00 623 579 -2.88461538461351e-01 623 580 -2.15105711021124e-16 623 581 -7.69230769231142e-01 623 582 2.40384615384615e-01 623 583 -2.88461538461351e-01 623 620 1.52655665885959e-16 623 621 1.92307692307318e-01 623 622 6.38378239159465e-16 623 578 -2.40384615384615e-01 623 624 1.45716771982052e-16 623 625 1.92307692307316e-01 623 662 2.40384615384615e-01 623 663 -2.88461538461351e-01 623 664 -3.74700270810990e-16 623 665 -7.69230769231140e-01 623 666 -2.40384615384616e-01 623 667 -2.88461538461351e-01 624 624 2.30769230769306e+00 624 581 -2.40384615384615e-01 624 582 1.92307692307319e-01 624 583 -2.08166817117217e-16 624 584 -2.88461538461351e-01 624 585 2.40384615384615e-01 624 622 -7.69230769231147e-01 624 623 1.38777878078145e-16 624 580 -2.88461538461352e-01 624 625 6.10622663543836e-16 624 626 -7.69230769231142e-01 624 627 1.73472347597681e-16 624 664 -2.88461538461352e-01 624 665 2.40384615384615e-01 624 666 1.92307692307320e-01 624 667 -3.95516952522712e-16 624 668 -2.88461538461352e-01 624 669 -2.40384615384616e-01 625 625 2.30769230769305e+00 625 581 -2.88461538461351e-01 625 582 -2.08166817117217e-16 625 583 -7.69230769231142e-01 625 584 2.40384615384615e-01 625 585 -2.88461538461352e-01 625 622 1.73472347597681e-16 625 623 1.92307692307316e-01 625 624 5.55111512312578e-16 625 580 -2.40384615384615e-01 625 626 1.31838984174237e-16 625 627 1.92307692307319e-01 625 664 2.40384615384615e-01 625 665 -2.88461538461351e-01 625 666 -4.16333634234434e-16 625 667 -7.69230769231142e-01 625 668 -2.40384615384616e-01 625 669 -2.88461538461352e-01 626 626 2.30769230769305e+00 626 583 -2.40384615384615e-01 626 584 1.92307692307317e-01 626 585 -1.87350135405495e-16 626 586 -2.88461538461351e-01 626 587 2.40384615384615e-01 626 624 -7.69230769231142e-01 626 625 1.45716771982052e-16 626 582 -2.88461538461351e-01 626 627 6.10622663543836e-16 626 628 -7.69230769231142e-01 626 629 1.52655665885959e-16 626 666 -2.88461538461351e-01 626 667 2.40384615384615e-01 626 668 1.92307692307318e-01 626 669 -3.95516952522712e-16 626 670 -2.88461538461352e-01 626 671 -2.40384615384616e-01 627 627 2.30769230769306e+00 627 583 -2.88461538461352e-01 627 584 -2.01227923213310e-16 627 585 -7.69230769231145e-01 627 586 2.40384615384615e-01 627 587 -2.88461538461352e-01 627 624 1.66533453693773e-16 627 625 1.92307692307319e-01 627 626 6.10622663543836e-16 627 582 -2.40384615384615e-01 627 628 1.45716771982052e-16 627 629 1.92307692307319e-01 627 666 2.40384615384615e-01 627 667 -2.88461538461351e-01 627 668 -4.09394740330526e-16 627 669 -7.69230769231144e-01 627 670 -2.40384615384615e-01 627 671 -2.88461538461352e-01 628 628 2.30769230769306e+00 628 585 -2.40384615384615e-01 628 586 1.92307692307318e-01 628 587 -1.59594559789866e-16 628 626 -7.69230769231143e-01 628 627 1.73472347597681e-16 628 584 -2.88461538461351e-01 628 629 5.27355936696949e-16 628 668 -2.88461538461351e-01 628 669 2.40384615384615e-01 628 670 1.92307692307319e-01 628 671 -3.88578058618805e-16 629 629 2.30769230769305e+00 629 585 -2.88461538461352e-01 629 586 -1.66533453693773e-16 629 587 -7.69230769231143e-01 629 626 1.66533453693773e-16 629 627 1.92307692307319e-01 629 628 5.55111512312578e-16 629 584 -2.40384615384615e-01 629 668 2.40384615384615e-01 629 669 -2.88461538461351e-01 629 670 -3.81639164714898e-16 629 671 -7.69230769231142e-01 630 630 2.03703703703770e-06 630 589 -2.97785020519090e-22 630 590 -2.54629629629464e-07 630 591 1.73611111111111e-07 630 588 9.25925925922632e-08 630 631 1.05879118406788e-22 630 632 -6.01851851852182e-07 630 633 4.63221143029695e-23 630 672 9.25925925922618e-08 630 673 1.32348898008484e-22 630 674 -2.54629629629464e-07 630 675 -1.73611111111111e-07 631 631 2.03703703703770e-06 631 589 -6.01851851852181e-07 631 590 1.73611111111111e-07 631 591 -2.54629629629464e-07 631 630 1.32348898008484e-22 631 588 -2.58080351116545e-22 631 632 6.61744490042422e-23 631 633 9.25925925922625e-08 631 672 1.45583787809333e-22 631 673 -6.01851851852183e-07 631 674 -1.73611111111111e-07 631 675 -2.54629629629465e-07 632 632 2.03703703703770e-06 632 589 -1.73611111111111e-07 632 590 9.25925925922632e-08 632 591 -2.97785020519090e-22 632 592 -2.54629629629464e-07 632 593 1.73611111111111e-07 632 630 -6.01851851852182e-07 632 631 5.95570041038180e-23 632 588 -2.54629629629465e-07 632 633 1.05879118406788e-22 632 634 -6.01851851852182e-07 632 635 4.63221143029695e-23 632 672 -2.54629629629465e-07 632 673 1.73611111111111e-07 632 674 9.25925925922618e-08 632 675 1.32348898008484e-22 632 676 -2.54629629629464e-07 632 677 -1.73611111111111e-07 633 633 2.03703703703770e-06 633 589 -2.54629629629465e-07 633 590 -2.58080351116545e-22 633 591 -6.01851851852181e-07 633 592 1.73611111111111e-07 633 593 -2.54629629629464e-07 633 630 1.98523347012727e-23 633 631 9.25925925922625e-08 633 632 1.32348898008484e-22 633 588 -1.73611111111111e-07 633 634 6.61744490042422e-23 633 635 9.25925925922625e-08 633 672 1.73611111111111e-07 633 673 -2.54629629629465e-07 633 674 1.45583787809333e-22 633 675 -6.01851851852183e-07 633 676 -1.73611111111111e-07 633 677 -2.54629629629465e-07 634 634 2.03703703703770e-06 634 591 -1.73611111111111e-07 634 592 9.25925925922632e-08 634 593 -2.71315240917393e-22 634 594 -2.54629629629464e-07 634 595 1.73611111111111e-07 634 632 -6.01851851852182e-07 634 633 5.95570041038180e-23 634 590 -2.54629629629465e-07 634 635 1.58818677610181e-22 634 636 -6.01851851852182e-07 634 637 1.98523347012727e-23 634 674 -2.54629629629465e-07 634 675 1.73611111111111e-07 634 676 9.25925925922617e-08 634 677 1.38966342908909e-22 634 678 -2.54629629629464e-07 634 679 -1.73611111111111e-07 635 635 2.03703703703770e-06 635 591 -2.54629629629465e-07 635 592 -2.91167575618666e-22 635 593 -6.01851851852181e-07 635 594 1.73611111111111e-07 635 595 -2.54629629629464e-07 635 632 1.98523347012727e-23 635 633 9.25925925922625e-08 635 634 1.58818677610181e-22 635 590 -1.73611111111111e-07 635 636 6.61744490042422e-23 635 637 9.25925925922628e-08 635 674 1.73611111111111e-07 635 675 -2.54629629629465e-07 635 676 1.58818677610181e-22 635 677 -6.01851851852183e-07 635 678 -1.73611111111111e-07 635 679 -2.54629629629465e-07 636 636 2.03703703703770e-06 636 593 -1.73611111111111e-07 636 594 9.25925925922632e-08 636 595 -2.77932685817817e-22 636 596 -2.54629629629464e-07 636 597 1.73611111111111e-07 636 634 -6.01851851852182e-07 636 635 1.98523347012727e-23 636 592 -2.54629629629465e-07 636 637 1.85288457211878e-22 636 638 -6.01851851852182e-07 636 639 1.98523347012727e-23 636 676 -2.54629629629465e-07 636 677 1.73611111111111e-07 636 678 9.25925925922615e-08 636 679 1.45583787809333e-22 636 680 -2.54629629629464e-07 636 681 -1.73611111111111e-07 637 637 2.03703703703770e-06 637 593 -2.54629629629465e-07 637 594 -2.77932685817817e-22 637 595 -6.01851851852181e-07 637 596 1.73611111111111e-07 637 597 -2.54629629629464e-07 637 634 3.97046694025453e-23 637 635 9.25925925922628e-08 637 636 1.58818677610181e-22 637 592 -1.73611111111111e-07 637 638 4.63221143029695e-23 637 639 9.25925925922628e-08 637 676 1.73611111111111e-07 637 677 -2.54629629629465e-07 637 678 1.38966342908909e-22 637 679 -6.01851851852184e-07 637 680 -1.73611111111111e-07 637 681 -2.54629629629465e-07 638 638 2.03703703703770e-06 638 595 -1.73611111111111e-07 638 596 9.25925925922633e-08 638 597 -2.84550130718242e-22 638 598 -2.54629629629464e-07 638 599 1.73611111111111e-07 638 636 -6.01851851852182e-07 638 637 2.64697796016969e-23 638 594 -2.54629629629465e-07 638 639 1.85288457211878e-22 638 640 -6.01851851852182e-07 638 641 3.97046694025453e-23 638 678 -2.54629629629465e-07 638 679 1.73611111111111e-07 638 680 9.25925925922618e-08 638 681 1.45583787809333e-22 638 682 -2.54629629629464e-07 638 683 -1.73611111111111e-07 639 639 2.03703703703770e-06 639 595 -2.54629629629465e-07 639 596 -2.71315240917393e-22 639 597 -6.01851851852181e-07 639 598 1.73611111111111e-07 639 599 -2.54629629629464e-07 639 636 3.97046694025453e-23 639 637 9.25925925922628e-08 639 638 1.32348898008484e-22 639 594 -1.73611111111111e-07 639 640 3.30872245021211e-23 639 641 9.25925925922624e-08 639 678 1.73611111111111e-07 639 679 -2.54629629629465e-07 639 680 1.52201232709757e-22 639 681 -6.01851851852183e-07 639 682 -1.73611111111111e-07 639 683 -2.54629629629465e-07 640 640 2.03703703703770e-06 640 597 -1.73611111111111e-07 640 598 9.25925925922632e-08 640 599 -2.91167575618666e-22 640 600 -2.54629629629464e-07 640 601 1.73611111111111e-07 640 638 -6.01851851852183e-07 640 639 1.98523347012727e-23 640 596 -2.54629629629465e-07 640 641 1.85288457211878e-22 640 642 -6.01851851852181e-07 640 643 1.32348898008484e-23 640 680 -2.54629629629465e-07 640 681 1.73611111111111e-07 640 682 9.25925925922615e-08 640 683 1.45583787809333e-22 640 684 -2.54629629629464e-07 640 685 -1.73611111111111e-07 641 641 2.03703703703770e-06 641 597 -2.54629629629465e-07 641 598 -3.04402465419514e-22 641 599 -6.01851851852181e-07 641 600 1.73611111111111e-07 641 601 -2.54629629629464e-07 641 638 3.30872245021211e-23 641 639 9.25925925922623e-08 641 640 2.38228016415272e-22 641 596 -1.73611111111111e-07 641 642 5.95570041038180e-23 641 643 9.25925925922632e-08 641 680 1.73611111111111e-07 641 681 -2.54629629629465e-07 641 682 1.52201232709757e-22 641 683 -6.01851851852184e-07 641 684 -1.73611111111111e-07 641 685 -2.54629629629465e-07 642 642 2.03703703703770e-06 642 599 -1.73611111111111e-07 642 600 9.25925925922634e-08 642 601 -3.17637355220363e-22 642 602 -2.54629629629465e-07 642 603 1.73611111111111e-07 642 640 -6.01851851852181e-07 642 641 3.30872245021211e-23 642 598 -2.54629629629465e-07 642 643 1.58818677610181e-22 642 644 -6.01851851852183e-07 642 645 3.97046694025453e-23 642 682 -2.54629629629465e-07 642 683 1.73611111111111e-07 642 684 9.25925925922617e-08 642 685 1.45583787809333e-22 642 686 -2.54629629629464e-07 642 687 -1.73611111111111e-07 643 643 2.03703703703770e-06 643 599 -2.54629629629465e-07 643 600 -2.91167575618666e-22 643 601 -6.01851851852181e-07 643 602 1.73611111111111e-07 643 603 -2.54629629629464e-07 643 640 3.30872245021211e-23 643 641 9.25925925922632e-08 643 642 1.58818677610181e-22 643 598 -1.73611111111111e-07 643 644 3.97046694025453e-23 643 645 9.25925925922620e-08 643 682 1.73611111111111e-07 643 683 -2.54629629629465e-07 643 684 1.58818677610181e-22 643 685 -6.01851851852183e-07 643 686 -1.73611111111111e-07 643 687 -2.54629629629465e-07 644 644 1.66676851851906e-02 644 601 -1.73611111111111e-07 644 602 2.38099867724598e-03 644 603 2.67860615079365e-03 644 604 -4.16666666666396e-03 644 605 4.46428571428571e-03 644 642 -6.01851851852183e-07 644 643 1.32348898008484e-23 644 600 -2.54629629629465e-07 644 645 1.73472347597681e-18 644 646 -1.30952380952435e-02 644 647 8.67361737988404e-19 644 684 -2.54629629629465e-07 644 685 1.73611111111111e-07 644 686 2.38099867724596e-03 644 687 -2.67860615079365e-03 644 688 -4.16666666666396e-03 644 689 -4.46428571428572e-03 645 645 1.66676851851906e-02 645 601 -2.54629629629464e-07 645 602 -2.67860615079366e-03 645 603 -6.54791997354768e-03 645 604 4.46428571428571e-03 645 605 -4.16666666666397e-03 645 642 5.95570041038180e-23 645 643 9.25925925922619e-08 645 644 1.73472347597681e-18 645 600 -1.73611111111111e-07 645 646 4.33680868994202e-19 645 647 4.76190476189937e-03 645 684 1.73611111111111e-07 645 685 -2.54629629629465e-07 645 686 2.67860615079365e-03 645 687 -6.54791997354770e-03 645 688 -4.46428571428572e-03 645 689 -4.16666666666397e-03 646 646 3.33333333333442e-02 646 603 -4.46428571428572e-03 646 604 4.76190476189937e-03 646 605 -8.23993651088983e-18 646 606 -4.16666666666397e-03 646 607 4.46428571428571e-03 646 644 -1.30952380952435e-02 646 645 4.33680868994202e-19 646 602 -4.16666666666397e-03 646 647 2.60208521396521e-18 646 648 -1.30952380952435e-02 646 649 4.33680868994202e-19 646 686 -4.16666666666396e-03 646 687 4.46428571428572e-03 646 688 4.76190476189935e-03 646 689 3.46944695195361e-18 646 690 -4.16666666666396e-03 646 691 -4.46428571428571e-03 647 647 3.33333333333442e-02 647 603 -4.16666666666397e-03 647 604 -7.37257477290143e-18 647 605 -1.30952380952435e-02 647 606 4.46428571428571e-03 647 607 -4.16666666666396e-03 647 644 8.67361737988404e-19 647 645 4.76190476189937e-03 647 646 3.46944695195361e-18 647 602 -4.46428571428572e-03 647 648 4.33680868994202e-19 647 649 4.76190476189936e-03 647 686 4.46428571428572e-03 647 687 -4.16666666666398e-03 647 688 4.33680868994202e-18 647 689 -1.30952380952435e-02 647 690 -4.46428571428572e-03 647 691 -4.16666666666397e-03 648 648 3.33333333333442e-02 648 605 -4.46428571428572e-03 648 606 4.76190476189938e-03 648 607 -8.67361737988404e-18 648 608 -4.16666666666397e-03 648 609 4.46428571428571e-03 648 646 -1.30952380952435e-02 648 647 0.00000000000000e+00 648 604 -4.16666666666398e-03 648 649 3.46944695195361e-18 648 650 -1.30952380952435e-02 648 651 4.33680868994202e-19 648 688 -4.16666666666397e-03 648 689 4.46428571428572e-03 648 690 4.76190476189936e-03 648 691 3.03576608295941e-18 648 692 -4.16666666666396e-03 648 693 -4.46428571428571e-03 649 649 3.33333333333441e-02 649 605 -4.16666666666396e-03 649 606 -6.93889390390723e-18 649 607 -1.30952380952435e-02 649 608 4.46428571428571e-03 649 609 -4.16666666666396e-03 649 646 0.00000000000000e+00 649 647 4.76190476189936e-03 649 648 4.33680868994202e-18 649 604 -4.46428571428572e-03 649 650 4.33680868994202e-19 649 651 4.76190476189936e-03 649 688 4.46428571428572e-03 649 689 -4.16666666666397e-03 649 690 3.46944695195361e-18 649 691 -1.30952380952435e-02 649 692 -4.46428571428572e-03 649 693 -4.16666666666397e-03 650 650 3.33333333333442e-02 650 607 -4.46428571428572e-03 650 608 4.76190476189938e-03 650 609 -6.93889390390723e-18 650 610 -4.16666666666396e-03 650 611 4.46428571428571e-03 650 648 -1.30952380952435e-02 650 649 0.00000000000000e+00 650 606 -4.16666666666398e-03 650 651 2.60208521396521e-18 650 652 -1.30952380952435e-02 650 653 0.00000000000000e+00 650 690 -4.16666666666397e-03 650 691 4.46428571428572e-03 650 692 4.76190476189935e-03 650 693 3.03576608295941e-18 650 694 -4.16666666666396e-03 650 695 -4.46428571428571e-03 651 651 3.33333333333442e-02 651 607 -4.16666666666396e-03 651 608 -6.50521303491303e-18 651 609 -1.30952380952435e-02 651 610 4.46428571428571e-03 651 611 -4.16666666666396e-03 651 648 4.33680868994202e-19 651 649 4.76190476189936e-03 651 650 1.73472347597681e-18 651 606 -4.46428571428572e-03 651 652 1.73472347597681e-18 651 653 4.76190476189937e-03 651 690 4.46428571428572e-03 651 691 -4.16666666666397e-03 651 692 3.46944695195361e-18 651 693 -1.30952380952435e-02 651 694 -4.46428571428572e-03 651 695 -4.16666666666397e-03 652 652 3.33333333333441e-02 652 609 -4.46428571428572e-03 652 610 4.76190476189936e-03 652 611 -8.23993651088983e-18 652 612 -4.16666666666396e-03 652 613 4.46428571428571e-03 652 650 -1.30952380952435e-02 652 651 1.73472347597681e-18 652 608 -4.16666666666398e-03 652 653 4.33680868994202e-18 652 654 -1.30952380952435e-02 652 655 8.67361737988404e-19 652 692 -4.16666666666397e-03 652 693 4.46428571428572e-03 652 694 4.76190476189934e-03 652 695 3.46944695195361e-18 652 696 -4.16666666666395e-03 652 697 -4.46428571428572e-03 653 653 3.33333333333442e-02 653 609 -4.16666666666397e-03 653 610 -7.37257477290143e-18 653 611 -1.30952380952435e-02 653 612 4.46428571428571e-03 653 613 -4.16666666666397e-03 653 650 0.00000000000000e+00 653 651 4.76190476189936e-03 653 652 3.46944695195361e-18 653 608 -4.46428571428572e-03 653 654 1.30104260698261e-18 653 655 4.76190476189939e-03 653 692 4.46428571428572e-03 653 693 -4.16666666666397e-03 653 694 3.03576608295941e-18 653 695 -1.30952380952435e-02 653 696 -4.46428571428571e-03 653 697 -4.16666666666398e-03 654 654 3.33333333333441e-02 654 611 -4.46428571428572e-03 654 612 4.76190476189936e-03 654 613 -7.80625564189563e-18 654 614 -4.16666666666396e-03 654 615 4.46428571428571e-03 654 652 -1.30952380952435e-02 654 653 1.30104260698261e-18 654 610 -4.16666666666397e-03 654 655 3.46944695195361e-18 654 656 -1.30952380952435e-02 654 657 8.67361737988404e-19 654 694 -4.16666666666396e-03 654 695 4.46428571428572e-03 654 696 4.76190476189934e-03 654 697 3.46944695195361e-18 654 698 -4.16666666666396e-03 654 699 -4.46428571428571e-03 655 655 3.33333333333442e-02 655 611 -4.16666666666397e-03 655 612 -6.50521303491303e-18 655 613 -1.30952380952435e-02 655 614 4.46428571428571e-03 655 615 -4.16666666666396e-03 655 652 8.67361737988404e-19 655 653 4.76190476189939e-03 655 654 3.46944695195361e-18 655 610 -4.46428571428572e-03 655 656 1.73472347597681e-18 655 657 4.76190476189937e-03 655 694 4.46428571428572e-03 655 695 -4.16666666666398e-03 655 696 3.46944695195361e-18 655 697 -1.30952380952435e-02 655 698 -4.46428571428572e-03 655 699 -4.16666666666397e-03 656 656 3.33333333333442e-02 656 613 -4.46428571428572e-03 656 614 4.76190476189938e-03 656 615 -8.23993651088983e-18 656 616 -4.16666666666397e-03 656 617 4.46428571428571e-03 656 654 -1.30952380952435e-02 656 655 8.67361737988404e-19 656 612 -4.16666666666398e-03 656 657 3.46944695195361e-18 656 658 -1.30952380952435e-02 656 659 4.33680868994202e-19 656 696 -4.16666666666397e-03 656 697 4.46428571428572e-03 656 698 4.76190476189935e-03 656 699 3.03576608295941e-18 656 700 -4.16666666666396e-03 656 701 -4.46428571428571e-03 657 657 3.33333333333441e-02 657 613 -4.16666666666397e-03 657 614 -6.93889390390723e-18 657 615 -1.30952380952435e-02 657 616 4.46428571428571e-03 657 617 -4.16666666666396e-03 657 654 4.33680868994202e-19 657 655 4.76190476189937e-03 657 656 3.46944695195361e-18 657 612 -4.46428571428572e-03 657 658 4.33680868994202e-19 657 659 4.76190476189936e-03 657 696 4.46428571428572e-03 657 697 -4.16666666666397e-03 657 698 3.46944695195361e-18 657 699 -1.30952380952435e-02 657 700 -4.46428571428572e-03 657 701 -4.16666666666397e-03 658 658 3.33333333333442e-02 658 615 -4.46428571428572e-03 658 616 4.76190476189938e-03 658 617 -7.37257477290143e-18 658 618 -4.16666666666397e-03 658 619 4.46428571428571e-03 658 656 -1.30952380952435e-02 658 657 0.00000000000000e+00 658 614 -4.16666666666398e-03 658 659 3.46944695195361e-18 658 660 -1.30952380952435e-02 658 661 8.67361737988404e-19 658 698 -4.16666666666397e-03 658 699 4.46428571428572e-03 658 700 4.76190476189936e-03 658 701 3.03576608295941e-18 658 702 -4.16666666666396e-03 658 703 -4.46428571428571e-03 659 659 3.33333333333441e-02 659 615 -4.16666666666396e-03 659 616 -6.93889390390723e-18 659 617 -1.30952380952435e-02 659 618 4.46428571428571e-03 659 619 -4.16666666666396e-03 659 656 4.33680868994202e-19 659 657 4.76190476189936e-03 659 658 3.46944695195361e-18 659 614 -4.46428571428572e-03 659 660 1.30104260698261e-18 659 661 4.76190476189935e-03 659 698 4.46428571428572e-03 659 699 -4.16666666666397e-03 659 700 3.46944695195361e-18 659 701 -1.30952380952435e-02 659 702 -4.46428571428572e-03 659 703 -4.16666666666397e-03 660 660 1.17051282051320e+00 660 617 -4.46428571428572e-03 660 618 9.85347985346090e-02 660 619 4.53983516483515e-02 660 620 -2.88461538461351e-01 660 621 2.40384615384615e-01 660 658 -1.30952380952435e-02 660 659 0.00000000000000e+00 660 616 -4.16666666666398e-03 660 661 1.66533453693773e-16 660 662 -7.69230769231142e-01 660 663 3.46944695195361e-17 660 700 -4.16666666666397e-03 660 701 4.46428571428572e-03 660 702 9.85347985346078e-02 660 703 -4.53983516483515e-02 660 704 -2.88461538461351e-01 660 705 -2.40384615384615e-01 661 661 1.17051282051320e+00 661 617 -4.16666666666396e-03 661 618 -4.53983516483518e-02 661 619 -3.91163003663193e-01 661 620 2.40384615384615e-01 661 621 -2.88461538461351e-01 661 658 4.33680868994202e-19 661 659 4.76190476189935e-03 661 660 1.66533453693773e-16 661 616 -4.46428571428572e-03 661 662 6.24500451351651e-17 661 663 1.92307692307319e-01 661 700 4.46428571428572e-03 661 701 -4.16666666666397e-03 661 702 4.53983516483518e-02 661 703 -3.91163003663195e-01 661 704 -2.40384615384615e-01 661 705 -2.88461538461352e-01 662 662 2.30769230769306e+00 662 619 -2.40384615384615e-01 662 620 1.92307692307319e-01 662 621 -4.09394740330526e-16 662 622 -2.88461538461351e-01 662 623 2.40384615384615e-01 662 660 -7.69230769231142e-01 662 661 9.02056207507940e-17 662 618 -2.88461538461352e-01 662 663 3.33066907387547e-16 662 664 -7.69230769231143e-01 662 665 4.16333634234434e-17 662 702 -2.88461538461351e-01 662 703 2.40384615384615e-01 662 704 1.92307692307317e-01 662 705 1.87350135405495e-16 662 706 -2.88461538461351e-01 662 707 -2.40384615384615e-01 663 663 2.30769230769306e+00 663 619 -2.88461538461352e-01 663 620 -3.88578058618805e-16 663 621 -7.69230769231142e-01 663 622 2.40384615384615e-01 663 623 -2.88461538461351e-01 663 660 4.16333634234434e-17 663 661 1.92307692307319e-01 663 662 3.33066907387547e-16 663 618 -2.40384615384616e-01 663 664 5.55111512312578e-17 663 665 1.92307692307318e-01 663 702 2.40384615384615e-01 663 703 -2.88461538461352e-01 663 704 2.01227923213310e-16 663 705 -7.69230769231145e-01 663 706 -2.40384615384615e-01 663 707 -2.88461538461352e-01 664 664 2.30769230769306e+00 664 621 -2.40384615384616e-01 664 622 1.92307692307320e-01 664 623 -3.67761376907083e-16 664 624 -2.88461538461352e-01 664 625 2.40384615384615e-01 664 662 -7.69230769231144e-01 664 663 5.55111512312578e-17 664 620 -2.88461538461352e-01 664 665 2.22044604925031e-16 664 666 -7.69230769231146e-01 664 667 5.55111512312578e-17 664 704 -2.88461538461352e-01 664 705 2.40384615384615e-01 664 706 1.92307692307319e-01 664 707 1.66533453693773e-16 664 708 -2.88461538461352e-01 664 709 -2.40384615384615e-01 665 665 2.30769230769305e+00 665 621 -2.88461538461351e-01 665 622 -4.16333634234434e-16 665 623 -7.69230769231140e-01 665 624 2.40384615384615e-01 665 625 -2.88461538461351e-01 665 662 5.55111512312578e-17 665 663 1.92307692307318e-01 665 664 2.49800180540660e-16 665 620 -2.40384615384616e-01 665 666 6.93889390390723e-17 665 667 1.92307692307316e-01 665 704 2.40384615384615e-01 665 705 -2.88461538461352e-01 665 706 2.08166817117217e-16 665 707 -7.69230769231143e-01 665 708 -2.40384615384615e-01 665 709 -2.88461538461351e-01 666 666 2.30769230769306e+00 666 623 -2.40384615384616e-01 666 624 1.92307692307320e-01 666 625 -4.23272528138341e-16 666 626 -2.88461538461351e-01 666 627 2.40384615384615e-01 666 664 -7.69230769231146e-01 666 665 6.93889390390723e-17 666 622 -2.88461538461353e-01 666 667 3.05311331771918e-16 666 668 -7.69230769231141e-01 666 669 3.46944695195361e-17 666 706 -2.88461538461352e-01 666 707 2.40384615384615e-01 666 708 1.92307692307318e-01 666 709 2.28983498828939e-16 666 710 -2.88461538461351e-01 666 711 -2.40384615384615e-01 667 667 2.30769230769305e+00 667 623 -2.88461538461351e-01 667 624 -3.95516952522712e-16 667 625 -7.69230769231142e-01 667 626 2.40384615384615e-01 667 627 -2.88461538461351e-01 667 664 4.16333634234434e-17 667 665 1.92307692307316e-01 667 666 3.33066907387547e-16 667 622 -2.40384615384616e-01 667 668 9.02056207507940e-17 667 669 1.92307692307320e-01 667 706 2.40384615384615e-01 667 707 -2.88461538461351e-01 667 708 2.01227923213310e-16 667 709 -7.69230769231144e-01 667 710 -2.40384615384615e-01 667 711 -2.88461538461352e-01 668 668 2.30769230769305e+00 668 625 -2.40384615384616e-01 668 626 1.92307692307318e-01 668 627 -4.09394740330526e-16 668 628 -2.88461538461351e-01 668 629 2.40384615384615e-01 668 666 -7.69230769231141e-01 668 667 9.02056207507940e-17 668 624 -2.88461538461352e-01 668 669 3.33066907387547e-16 668 670 -7.69230769231142e-01 668 671 3.46944695195361e-17 668 708 -2.88461538461351e-01 668 709 2.40384615384615e-01 668 710 1.92307692307316e-01 668 711 2.01227923213310e-16 668 712 -2.88461538461351e-01 668 713 -2.40384615384615e-01 669 669 2.30769230769306e+00 669 625 -2.88461538461352e-01 669 626 -3.74700270810990e-16 669 627 -7.69230769231144e-01 669 628 2.40384615384615e-01 669 629 -2.88461538461351e-01 669 666 4.16333634234434e-17 669 667 1.92307692307320e-01 669 668 3.05311331771918e-16 669 624 -2.40384615384616e-01 669 670 6.24500451351651e-17 669 671 1.92307692307319e-01 669 708 2.40384615384615e-01 669 709 -2.88461538461352e-01 669 710 2.15105711021124e-16 669 711 -7.69230769231146e-01 669 712 -2.40384615384615e-01 669 713 -2.88461538461352e-01 670 670 2.30769230769306e+00 670 627 -2.40384615384615e-01 670 628 1.92307692307319e-01 670 629 -3.95516952522712e-16 670 668 -7.69230769231142e-01 670 669 9.02056207507940e-17 670 626 -2.88461538461352e-01 670 671 3.05311331771918e-16 670 710 -2.88461538461351e-01 670 711 2.40384615384615e-01 670 712 1.92307692307318e-01 670 713 2.08166817117217e-16 671 671 2.30769230769306e+00 671 627 -2.88461538461352e-01 671 628 -3.60822483003176e-16 671 629 -7.69230769231142e-01 671 668 4.16333634234434e-17 671 669 1.92307692307319e-01 671 670 2.77555756156289e-16 671 626 -2.40384615384616e-01 671 710 2.40384615384615e-01 671 711 -2.88461538461352e-01 671 712 2.01227923213310e-16 671 713 -7.69230769231144e-01 672 672 1.66676851851906e-02 672 631 1.38966342908909e-22 672 632 -2.54629629629465e-07 672 633 1.73611111111111e-07 672 630 9.25925925922618e-08 672 673 -8.67361737988404e-19 672 674 -6.54791997354769e-03 672 675 2.67860615079365e-03 672 714 4.76190476189937e-03 672 715 4.33680868994202e-19 672 716 -4.16666666666397e-03 672 717 -4.46428571428572e-03 673 673 1.66676851851906e-02 673 631 -6.01851851852183e-07 673 632 1.73611111111111e-07 673 633 -2.54629629629465e-07 673 672 -8.67361737988404e-19 673 630 1.32348898008484e-22 673 674 -2.67860615079365e-03 673 675 2.38099867724597e-03 673 714 -8.67361737988404e-19 673 715 -1.30952380952435e-02 673 716 -4.46428571428572e-03 673 717 -4.16666666666396e-03 674 674 1.66676851851906e-02 674 631 -1.73611111111111e-07 674 632 9.25925925922618e-08 674 633 1.38966342908909e-22 674 634 -2.54629629629465e-07 674 635 1.73611111111111e-07 674 672 -6.54791997354769e-03 674 673 -2.67860615079365e-03 674 630 -2.54629629629464e-07 674 675 -8.67361737988404e-19 674 676 -6.54791997354769e-03 674 677 2.67860615079365e-03 674 714 -4.16666666666397e-03 674 715 4.46428571428572e-03 674 716 4.76190476189937e-03 674 717 4.33680868994202e-19 674 718 -4.16666666666397e-03 674 719 -4.46428571428572e-03 675 675 1.66676851851906e-02 675 631 -2.54629629629465e-07 675 632 1.32348898008484e-22 675 633 -6.01851851852183e-07 675 634 1.73611111111111e-07 675 635 -2.54629629629465e-07 675 672 2.67860615079365e-03 675 673 2.38099867724597e-03 675 674 -8.67361737988404e-19 675 630 -1.73611111111111e-07 675 676 -2.67860615079365e-03 675 677 2.38099867724597e-03 675 714 4.46428571428572e-03 675 715 -4.16666666666396e-03 675 716 -8.67361737988404e-19 675 717 -1.30952380952435e-02 675 718 -4.46428571428572e-03 675 719 -4.16666666666396e-03 676 676 1.66676851851906e-02 676 633 -1.73611111111111e-07 676 634 9.25925925922617e-08 676 635 1.45583787809333e-22 676 636 -2.54629629629465e-07 676 637 1.73611111111111e-07 676 674 -6.54791997354769e-03 676 675 -2.67860615079365e-03 676 632 -2.54629629629464e-07 676 677 -8.67361737988404e-19 676 678 -6.54791997354769e-03 676 679 2.67860615079365e-03 676 716 -4.16666666666397e-03 676 717 4.46428571428572e-03 676 718 4.76190476189937e-03 676 719 8.67361737988404e-19 676 720 -4.16666666666397e-03 676 721 -4.46428571428572e-03 677 677 1.66676851851906e-02 677 633 -2.54629629629465e-07 677 634 1.19114008207636e-22 677 635 -6.01851851852183e-07 677 636 1.73611111111111e-07 677 637 -2.54629629629465e-07 677 674 2.67860615079365e-03 677 675 2.38099867724597e-03 677 676 -8.67361737988404e-19 677 632 -1.73611111111111e-07 677 678 -2.67860615079365e-03 677 679 2.38099867724597e-03 677 716 4.46428571428572e-03 677 717 -4.16666666666396e-03 677 718 -1.30104260698261e-18 677 719 -1.30952380952435e-02 677 720 -4.46428571428572e-03 677 721 -4.16666666666396e-03 678 678 1.66676851851906e-02 678 635 -1.73611111111111e-07 678 636 9.25925925922615e-08 678 637 1.05879118406788e-22 678 638 -2.54629629629465e-07 678 639 1.73611111111111e-07 678 676 -6.54791997354769e-03 678 677 -2.67860615079365e-03 678 634 -2.54629629629464e-07 678 679 0.00000000000000e+00 678 680 -6.54791997354768e-03 678 681 2.67860615079365e-03 678 718 -4.16666666666397e-03 678 719 4.46428571428572e-03 678 720 4.76190476189937e-03 678 721 4.33680868994202e-19 678 722 -4.16666666666397e-03 678 723 -4.46428571428572e-03 679 679 1.66676851851906e-02 679 635 -2.54629629629465e-07 679 636 1.65436122510606e-22 679 637 -6.01851851852184e-07 679 638 1.73611111111111e-07 679 639 -2.54629629629465e-07 679 676 2.67860615079365e-03 679 677 2.38099867724597e-03 679 678 -8.67361737988404e-19 679 634 -1.73611111111111e-07 679 680 -2.67860615079365e-03 679 681 2.38099867724597e-03 679 718 4.46428571428572e-03 679 719 -4.16666666666396e-03 679 720 0.00000000000000e+00 679 721 -1.30952380952435e-02 679 722 -4.46428571428572e-03 679 723 -4.16666666666396e-03 680 680 1.66676851851906e-02 680 637 -1.73611111111111e-07 680 638 9.25925925922618e-08 680 639 1.38966342908909e-22 680 640 -2.54629629629465e-07 680 641 1.73611111111111e-07 680 678 -6.54791997354768e-03 680 679 -2.67860615079365e-03 680 636 -2.54629629629464e-07 680 681 0.00000000000000e+00 680 682 -6.54791997354769e-03 680 683 2.67860615079365e-03 680 720 -4.16666666666397e-03 680 721 4.46428571428572e-03 680 722 4.76190476189937e-03 680 723 0.00000000000000e+00 680 724 -4.16666666666397e-03 680 725 -4.46428571428572e-03 681 681 1.66676851851906e-02 681 637 -2.54629629629465e-07 681 638 1.52201232709757e-22 681 639 -6.01851851852183e-07 681 640 1.73611111111111e-07 681 641 -2.54629629629465e-07 681 678 2.67860615079365e-03 681 679 2.38099867724597e-03 681 680 -8.67361737988404e-19 681 636 -1.73611111111111e-07 681 682 -2.67860615079365e-03 681 683 2.38099867724597e-03 681 720 4.46428571428572e-03 681 721 -4.16666666666396e-03 681 722 0.00000000000000e+00 681 723 -1.30952380952435e-02 681 724 -4.46428571428572e-03 681 725 -4.16666666666396e-03 682 682 1.66676851851906e-02 682 639 -1.73611111111111e-07 682 640 9.25925925922615e-08 682 641 1.38966342908909e-22 682 642 -2.54629629629465e-07 682 643 1.73611111111111e-07 682 680 -6.54791997354769e-03 682 681 -2.67860615079365e-03 682 638 -2.54629629629464e-07 682 683 -8.67361737988404e-19 682 684 -6.54791997354768e-03 682 685 2.67860615079365e-03 682 722 -4.16666666666397e-03 682 723 4.46428571428572e-03 682 724 4.76190476189937e-03 682 725 4.33680868994202e-19 682 726 -4.16666666666397e-03 682 727 -4.46428571428572e-03 683 683 1.66676851851906e-02 683 639 -2.54629629629465e-07 683 640 1.65436122510606e-22 683 641 -6.01851851852184e-07 683 642 1.73611111111111e-07 683 643 -2.54629629629465e-07 683 680 2.67860615079365e-03 683 681 2.38099867724597e-03 683 682 -1.73472347597681e-18 683 638 -1.73611111111111e-07 683 684 -2.67860615079365e-03 683 685 2.38099867724598e-03 683 722 4.46428571428572e-03 683 723 -4.16666666666396e-03 683 724 -1.73472347597681e-18 683 725 -1.30952380952435e-02 683 726 -4.46428571428572e-03 683 727 -4.16666666666397e-03 684 684 1.66676851851906e-02 684 641 -1.73611111111111e-07 684 642 9.25925925922617e-08 684 643 1.32348898008484e-22 684 644 -2.54629629629465e-07 684 645 1.73611111111111e-07 684 682 -6.54791997354768e-03 684 683 -2.67860615079365e-03 684 640 -2.54629629629464e-07 684 685 -8.67361737988404e-19 684 686 -6.54791997354769e-03 684 687 2.67860615079365e-03 684 724 -4.16666666666397e-03 684 725 4.46428571428571e-03 684 726 4.76190476189937e-03 684 727 4.33680868994202e-19 684 728 -4.16666666666397e-03 684 729 -4.46428571428572e-03 685 685 1.66676851851906e-02 685 641 -2.54629629629465e-07 685 642 1.58818677610181e-22 685 643 -6.01851851852183e-07 685 644 1.73611111111111e-07 685 645 -2.54629629629465e-07 685 682 2.67860615079365e-03 685 683 2.38099867724598e-03 685 684 0.00000000000000e+00 685 640 -1.73611111111111e-07 685 686 -2.67860615079365e-03 685 687 2.38099867724597e-03 685 724 4.46428571428572e-03 685 725 -4.16666666666397e-03 685 726 0.00000000000000e+00 685 727 -1.30952380952435e-02 685 728 -4.46428571428572e-03 685 729 -4.16666666666396e-03 686 686 5.93590252849195e-01 686 643 -1.73611111111111e-07 686 644 2.38099867724596e-03 686 645 2.67860615079365e-03 686 646 -4.16666666666396e-03 686 647 4.46428571428572e-03 686 684 -6.54791997354769e-03 686 685 -2.67860615079365e-03 686 642 -2.54629629629464e-07 686 687 2.31456217567155e-01 686 688 -3.91163003663193e-01 686 689 4.53983516483516e-02 686 726 -4.16666666666397e-03 686 727 4.46428571428571e-03 686 728 9.85347985346088e-02 686 729 -4.53983516483516e-02 686 730 -2.88461538461351e-01 686 731 -2.40384615384615e-01 687 687 5.93590252849195e-01 687 643 -2.54629629629465e-07 687 644 -2.67860615079365e-03 687 645 -6.54791997354770e-03 687 646 4.46428571428572e-03 687 647 -4.16666666666398e-03 687 684 2.67860615079365e-03 687 685 2.38099867724597e-03 687 686 2.31456217567155e-01 687 642 -1.73611111111111e-07 687 688 -4.53983516483517e-02 687 689 9.85347985346089e-02 687 726 4.46428571428572e-03 687 727 -4.16666666666396e-03 687 728 4.53983516483516e-02 687 729 -3.91163003663193e-01 687 730 -2.40384615384615e-01 687 731 -2.88461538461351e-01 688 688 1.17051282051320e+00 688 645 -4.46428571428572e-03 688 646 4.76190476189935e-03 688 647 3.46944695195361e-18 688 648 -4.16666666666397e-03 688 649 4.46428571428572e-03 688 686 -3.91163003663193e-01 688 687 -4.53983516483517e-02 688 644 -4.16666666666396e-03 688 689 2.77555756156289e-17 688 690 -3.91163003663194e-01 688 691 4.53983516483516e-02 688 728 -2.88461538461351e-01 688 729 2.40384615384615e-01 688 730 1.92307692307319e-01 688 731 -1.38777878078145e-17 688 732 -2.88461538461352e-01 688 733 -2.40384615384615e-01 689 689 1.17051282051320e+00 689 645 -4.16666666666397e-03 689 646 3.46944695195361e-18 689 647 -1.30952380952435e-02 689 648 4.46428571428572e-03 689 649 -4.16666666666397e-03 689 686 4.53983516483516e-02 689 687 9.85347985346089e-02 689 688 2.77555756156289e-17 689 644 -4.46428571428571e-03 689 690 -4.53983516483516e-02 689 691 9.85347985346081e-02 689 728 2.40384615384615e-01 689 729 -2.88461538461351e-01 689 730 -6.93889390390723e-18 689 731 -7.69230769231142e-01 689 732 -2.40384615384615e-01 689 733 -2.88461538461351e-01 690 690 1.17051282051320e+00 690 647 -4.46428571428572e-03 690 648 4.76190476189936e-03 690 649 3.03576608295941e-18 690 650 -4.16666666666397e-03 690 651 4.46428571428572e-03 690 688 -3.91163003663194e-01 690 689 -4.53983516483516e-02 690 646 -4.16666666666396e-03 690 691 2.77555756156289e-17 690 692 -3.91163003663194e-01 690 693 4.53983516483516e-02 690 730 -2.88461538461352e-01 690 731 2.40384615384615e-01 690 732 1.92307692307320e-01 690 733 -3.46944695195361e-17 690 734 -2.88461538461352e-01 690 735 -2.40384615384615e-01 691 691 1.17051282051320e+00 691 647 -4.16666666666397e-03 691 648 3.46944695195361e-18 691 649 -1.30952380952435e-02 691 650 4.46428571428572e-03 691 651 -4.16666666666397e-03 691 688 4.53983516483516e-02 691 689 9.85347985346082e-02 691 690 5.55111512312578e-17 691 646 -4.46428571428571e-03 691 692 -4.53983516483516e-02 691 693 9.85347985346082e-02 691 730 2.40384615384615e-01 691 731 -2.88461538461351e-01 691 732 -2.08166817117217e-17 691 733 -7.69230769231141e-01 691 734 -2.40384615384615e-01 691 735 -2.88461538461351e-01 692 692 1.17051282051320e+00 692 649 -4.46428571428572e-03 692 650 4.76190476189935e-03 692 651 3.46944695195361e-18 692 652 -4.16666666666397e-03 692 653 4.46428571428572e-03 692 690 -3.91163003663194e-01 692 691 -4.53983516483517e-02 692 648 -4.16666666666396e-03 692 693 5.55111512312578e-17 692 694 -3.91163003663194e-01 692 695 4.53983516483517e-02 692 732 -2.88461538461352e-01 692 733 2.40384615384615e-01 692 734 1.92307692307319e-01 692 735 -6.93889390390723e-18 692 736 -2.88461538461352e-01 692 737 -2.40384615384615e-01 693 693 1.17051282051320e+00 693 649 -4.16666666666397e-03 693 650 3.90312782094782e-18 693 651 -1.30952380952435e-02 693 652 4.46428571428572e-03 693 653 -4.16666666666397e-03 693 690 4.53983516483516e-02 693 691 9.85347985346082e-02 693 692 5.55111512312578e-17 693 648 -4.46428571428571e-03 693 694 -4.53983516483516e-02 693 695 9.85347985346085e-02 693 732 2.40384615384615e-01 693 733 -2.88461538461351e-01 693 734 6.24500451351651e-17 693 735 -7.69230769231142e-01 693 736 -2.40384615384615e-01 693 737 -2.88461538461351e-01 694 694 1.17051282051320e+00 694 651 -4.46428571428572e-03 694 652 4.76190476189934e-03 694 653 3.03576608295941e-18 694 654 -4.16666666666396e-03 694 655 4.46428571428572e-03 694 692 -3.91163003663194e-01 694 693 -4.53983516483517e-02 694 650 -4.16666666666396e-03 694 695 5.55111512312578e-17 694 696 -3.91163003663193e-01 694 697 4.53983516483516e-02 694 734 -2.88461538461352e-01 694 735 2.40384615384615e-01 694 736 1.92307692307318e-01 694 737 -2.08166817117217e-17 694 738 -2.88461538461351e-01 694 739 -2.40384615384615e-01 695 695 1.17051282051320e+00 695 651 -4.16666666666397e-03 695 652 3.03576608295941e-18 695 653 -1.30952380952435e-02 695 654 4.46428571428572e-03 695 655 -4.16666666666398e-03 695 692 4.53983516483516e-02 695 693 9.85347985346085e-02 695 694 5.55111512312578e-17 695 650 -4.46428571428571e-03 695 696 -4.53983516483517e-02 695 697 9.85347985346093e-02 695 734 2.40384615384615e-01 695 735 -2.88461538461351e-01 695 736 -2.77555756156289e-17 695 737 -7.69230769231143e-01 695 738 -2.40384615384615e-01 695 739 -2.88461538461352e-01 696 696 1.17051282051320e+00 696 653 -4.46428571428572e-03 696 654 4.76190476189934e-03 696 655 3.90312782094782e-18 696 656 -4.16666666666397e-03 696 657 4.46428571428572e-03 696 694 -3.91163003663193e-01 696 695 -4.53983516483516e-02 696 652 -4.16666666666395e-03 696 697 2.77555756156289e-17 696 698 -3.91163003663194e-01 696 699 4.53983516483517e-02 696 736 -2.88461538461351e-01 696 737 2.40384615384615e-01 696 738 1.92307692307318e-01 696 739 -3.46944695195361e-17 696 740 -2.88461538461352e-01 696 741 -2.40384615384615e-01 697 697 1.17051282051320e+00 697 653 -4.16666666666398e-03 697 654 3.90312782094782e-18 697 655 -1.30952380952435e-02 697 656 4.46428571428572e-03 697 657 -4.16666666666397e-03 697 694 4.53983516483517e-02 697 695 9.85347985346093e-02 697 696 2.77555756156289e-17 697 652 -4.46428571428572e-03 697 698 -4.53983516483517e-02 697 699 9.85347985346085e-02 697 736 2.40384615384615e-01 697 737 -2.88461538461352e-01 697 738 1.38777878078145e-17 697 739 -7.69230769231143e-01 697 740 -2.40384615384615e-01 697 741 -2.88461538461351e-01 698 698 1.17051282051320e+00 698 655 -4.46428571428572e-03 698 656 4.76190476189935e-03 698 657 3.90312782094782e-18 698 658 -4.16666666666397e-03 698 659 4.46428571428572e-03 698 696 -3.91163003663194e-01 698 697 -4.53983516483516e-02 698 654 -4.16666666666396e-03 698 699 2.77555756156289e-17 698 700 -3.91163003663194e-01 698 701 4.53983516483516e-02 698 738 -2.88461538461352e-01 698 739 2.40384615384615e-01 698 740 1.92307692307319e-01 698 741 -1.38777878078145e-17 698 742 -2.88461538461352e-01 698 743 -2.40384615384615e-01 699 699 1.17051282051320e+00 699 655 -4.16666666666397e-03 699 656 3.03576608295941e-18 699 657 -1.30952380952435e-02 699 658 4.46428571428572e-03 699 659 -4.16666666666397e-03 699 696 4.53983516483516e-02 699 697 9.85347985346085e-02 699 698 5.55111512312578e-17 699 654 -4.46428571428572e-03 699 700 -4.53983516483516e-02 699 701 9.85347985346082e-02 699 738 2.40384615384615e-01 699 739 -2.88461538461351e-01 699 740 6.93889390390723e-18 699 741 -7.69230769231142e-01 699 742 -2.40384615384615e-01 699 743 -2.88461538461351e-01 700 700 1.17051282051320e+00 700 657 -4.46428571428572e-03 700 658 4.76190476189936e-03 700 659 3.46944695195361e-18 700 660 -4.16666666666397e-03 700 661 4.46428571428572e-03 700 698 -3.91163003663194e-01 700 699 -4.53983516483517e-02 700 656 -4.16666666666396e-03 700 701 5.55111512312578e-17 700 702 -3.91163003663194e-01 700 703 4.53983516483516e-02 700 740 -2.88461538461352e-01 700 741 2.40384615384615e-01 700 742 1.92307692307320e-01 700 743 -6.93889390390723e-18 700 744 -2.88461538461352e-01 700 745 -2.40384615384615e-01 701 701 1.17051282051320e+00 701 657 -4.16666666666397e-03 701 658 3.46944695195361e-18 701 659 -1.30952380952435e-02 701 660 4.46428571428572e-03 701 661 -4.16666666666397e-03 701 698 4.53983516483516e-02 701 699 9.85347985346082e-02 701 700 5.55111512312578e-17 701 656 -4.46428571428571e-03 701 702 -4.53983516483516e-02 701 703 9.85347985346081e-02 701 740 2.40384615384615e-01 701 741 -2.88461538461351e-01 701 742 6.93889390390723e-18 701 743 -7.69230769231141e-01 701 744 -2.40384615384615e-01 701 745 -2.88461538461351e-01 702 702 1.16217999643912e+00 702 659 -4.46428571428572e-03 702 660 9.85347985346078e-02 702 661 4.53983516483518e-02 702 662 -2.88461538461351e-01 702 663 2.40384615384615e-01 702 700 -3.91163003663194e-01 702 701 -4.53983516483517e-02 702 658 -4.16666666666396e-03 702 703 -4.76304771443834e-01 702 704 -3.84615685541496e-01 702 705 -4.80769577991453e-02 702 742 -2.88461538461352e-01 702 743 2.40384615384615e-01 702 744 9.61538924499562e-02 702 745 4.80769577991453e-02 702 746 -2.54629629629465e-07 702 747 -1.73611111111111e-07 703 703 1.16217999643912e+00 703 659 -4.16666666666397e-03 703 660 -4.53983516483515e-02 703 661 -3.91163003663195e-01 703 662 2.40384615384615e-01 703 663 -2.88461538461352e-01 703 700 4.53983516483516e-02 703 701 9.85347985346081e-02 703 702 -4.76304771443834e-01 703 658 -4.46428571428571e-03 703 704 4.80769577991453e-02 703 705 9.61538924499563e-02 703 742 2.40384615384615e-01 703 743 -2.88461538461351e-01 703 744 -4.80769577991453e-02 703 745 -3.84615685541496e-01 703 746 -1.73611111111111e-07 703 747 -2.54629629629465e-07 704 704 1.15384717236504e+00 704 661 -2.40384615384615e-01 704 662 1.92307692307317e-01 704 663 2.01227923213310e-16 704 664 -2.88461538461352e-01 704 665 2.40384615384615e-01 704 702 -3.84615685541496e-01 704 703 4.80769577991453e-02 704 660 -2.88461538461351e-01 704 705 -2.22044604925031e-16 704 706 -3.84615685541497e-01 704 707 -4.80769577991453e-02 704 744 -2.54629629629465e-07 704 745 1.73611111111111e-07 704 746 9.25925925922631e-08 704 747 0.00000000000000e+00 704 748 -2.54629629629465e-07 704 749 -1.73611111111111e-07 705 705 1.15384717236505e+00 705 661 -2.88461538461352e-01 705 662 1.80411241501588e-16 705 663 -7.69230769231145e-01 705 664 2.40384615384615e-01 705 665 -2.88461538461352e-01 705 702 -4.80769577991453e-02 705 703 9.61538924499563e-02 705 704 -2.49800180540660e-16 705 660 -2.40384615384615e-01 705 706 4.80769577991452e-02 705 707 9.61538924499559e-02 705 744 1.73611111111111e-07 705 745 -2.54629629629465e-07 705 746 1.32348898008484e-23 705 747 -6.01851851852181e-07 705 748 -1.73611111111111e-07 705 749 -2.54629629629464e-07 706 706 1.15384717236505e+00 706 663 -2.40384615384615e-01 706 664 1.92307692307319e-01 706 665 2.08166817117217e-16 706 666 -2.88461538461352e-01 706 667 2.40384615384615e-01 706 704 -3.84615685541497e-01 706 705 4.80769577991452e-02 706 662 -2.88461538461351e-01 706 707 -2.22044604925031e-16 706 708 -3.84615685541498e-01 706 709 -4.80769577991454e-02 706 746 -2.54629629629465e-07 706 747 1.73611111111111e-07 706 748 9.25925925922644e-08 706 749 -1.32348898008484e-23 706 750 -2.54629629629465e-07 706 751 -1.73611111111111e-07 707 707 1.15384717236505e+00 707 663 -2.88461538461352e-01 707 664 1.66533453693773e-16 707 665 -7.69230769231143e-01 707 666 2.40384615384615e-01 707 667 -2.88461538461351e-01 707 704 -4.80769577991453e-02 707 705 9.61538924499559e-02 707 706 -2.22044578455252e-16 707 662 -2.40384615384615e-01 707 708 4.80769577991453e-02 707 709 9.61538924499549e-02 707 746 1.73611111111111e-07 707 747 -2.54629629629464e-07 707 748 0.00000000000000e+00 707 749 -6.01851851852180e-07 707 750 -1.73611111111111e-07 707 751 -2.54629629629464e-07 708 708 1.15384717236505e+00 708 665 -2.40384615384615e-01 708 666 1.92307692307318e-01 708 667 2.01227923213310e-16 708 668 -2.88461538461351e-01 708 669 2.40384615384615e-01 708 706 -3.84615685541498e-01 708 707 4.80769577991453e-02 708 664 -2.88461538461352e-01 708 709 -1.94289082248962e-16 708 710 -3.84615685541496e-01 708 711 -4.80769577991453e-02 708 748 -2.54629629629465e-07 708 749 1.73611111111111e-07 708 750 9.25925925922637e-08 708 751 -6.61744490042422e-24 708 752 -2.54629629629465e-07 708 753 -1.73611111111111e-07 709 709 1.15384717236505e+00 709 665 -2.88461538461351e-01 709 666 2.15105711021124e-16 709 667 -7.69230769231144e-01 709 668 2.40384615384615e-01 709 669 -2.88461538461352e-01 709 706 -4.80769577991454e-02 709 707 9.61538924499549e-02 709 708 -2.22044657864591e-16 709 664 -2.40384615384615e-01 709 710 4.80769577991453e-02 709 711 9.61538924499566e-02 709 748 1.73611111111111e-07 709 749 -2.54629629629464e-07 709 750 1.98523347012727e-23 709 751 -6.01851851852181e-07 709 752 -1.73611111111111e-07 709 753 -2.54629629629465e-07 710 710 1.15384717236504e+00 710 667 -2.40384615384615e-01 710 668 1.92307692307316e-01 710 669 2.01227923213310e-16 710 670 -2.88461538461351e-01 710 671 2.40384615384615e-01 710 708 -3.84615685541496e-01 710 709 4.80769577991452e-02 710 666 -2.88461538461351e-01 710 711 -2.22044604925031e-16 710 712 -3.84615685541496e-01 710 713 -4.80769577991453e-02 710 750 -2.54629629629465e-07 710 751 1.73611111111111e-07 710 752 9.25925925922623e-08 710 753 -2.64697796016969e-23 710 754 -2.54629629629465e-07 710 755 -1.73611111111111e-07 711 711 1.15384717236505e+00 711 667 -2.88461538461352e-01 711 668 1.94289029309402e-16 711 669 -7.69230769231146e-01 711 670 2.40384615384615e-01 711 671 -2.88461538461352e-01 711 708 -4.80769577991454e-02 711 709 9.61538924499566e-02 711 710 -2.49800180540660e-16 711 666 -2.40384615384615e-01 711 712 4.80769577991453e-02 711 713 9.61538924499563e-02 711 750 1.73611111111111e-07 711 751 -2.54629629629465e-07 711 752 1.32348898008484e-23 711 753 -6.01851851852182e-07 711 754 -1.73611111111111e-07 711 755 -2.54629629629465e-07 712 712 1.15384717236505e+00 712 669 -2.40384615384615e-01 712 670 1.92307692307318e-01 712 671 2.15105711021124e-16 712 710 -3.84615685541496e-01 712 711 4.80769577991453e-02 712 668 -2.88461538461351e-01 712 713 -2.22044604925031e-16 712 752 -2.54629629629465e-07 712 753 1.73611111111111e-07 712 754 9.25925925922634e-08 712 755 1.32348898008484e-23 713 713 1.15384717236505e+00 713 669 -2.88461538461352e-01 713 670 1.94289029309402e-16 713 671 -7.69230769231144e-01 713 710 -4.80769577991453e-02 713 711 9.61538924499563e-02 713 712 -2.22044604925031e-16 713 668 -2.40384615384615e-01 713 752 1.73611111111111e-07 713 753 -2.54629629629465e-07 713 754 1.32348898008484e-23 713 755 -6.01851851852181e-07 714 714 3.33333333333442e-02 714 673 -8.67361737988404e-19 714 674 -4.16666666666397e-03 714 675 4.46428571428572e-03 714 672 4.76190476189937e-03 714 715 3.46944695195361e-18 714 716 -1.30952380952435e-02 714 717 8.67361737988404e-19 714 756 4.76190476189937e-03 714 757 -3.03576608295941e-18 714 758 -4.16666666666397e-03 714 759 -4.46428571428572e-03 715 715 3.33333333333441e-02 715 673 -1.30952380952435e-02 715 674 4.46428571428572e-03 715 675 -4.16666666666396e-03 715 714 4.33680868994202e-18 715 672 4.33680868994202e-19 715 716 4.33680868994202e-19 715 717 4.76190476189935e-03 715 756 -4.77048955893622e-18 715 757 -1.30952380952435e-02 715 758 -4.46428571428572e-03 715 759 -4.16666666666397e-03 716 716 3.33333333333442e-02 716 673 -4.46428571428572e-03 716 674 4.76190476189937e-03 716 675 -8.67361737988404e-19 716 676 -4.16666666666397e-03 716 677 4.46428571428572e-03 716 714 -1.30952380952435e-02 716 715 4.33680868994202e-19 716 672 -4.16666666666397e-03 716 717 3.46944695195361e-18 716 718 -1.30952380952435e-02 716 719 8.67361737988404e-19 716 756 -4.16666666666397e-03 716 757 4.46428571428572e-03 716 758 4.76190476189937e-03 716 759 -3.03576608295941e-18 716 760 -4.16666666666397e-03 716 761 -4.46428571428572e-03 717 717 3.33333333333441e-02 717 673 -4.16666666666396e-03 717 674 4.33680868994202e-19 717 675 -1.30952380952435e-02 717 676 4.46428571428572e-03 717 677 -4.16666666666396e-03 717 714 8.67361737988404e-19 717 715 4.76190476189935e-03 717 716 4.33680868994202e-18 717 672 -4.46428571428572e-03 717 718 4.33680868994202e-19 717 719 4.76190476189935e-03 717 756 4.46428571428571e-03 717 757 -4.16666666666396e-03 717 758 -4.77048955893622e-18 717 759 -1.30952380952435e-02 717 760 -4.46428571428572e-03 717 761 -4.16666666666397e-03 718 718 3.33333333333442e-02 718 675 -4.46428571428572e-03 718 676 4.76190476189937e-03 718 677 -1.30104260698261e-18 718 678 -4.16666666666397e-03 718 679 4.46428571428571e-03 718 716 -1.30952380952435e-02 718 717 4.33680868994202e-19 718 674 -4.16666666666397e-03 718 719 2.60208521396521e-18 718 720 -1.30952380952435e-02 718 721 8.67361737988404e-19 718 758 -4.16666666666397e-03 718 759 4.46428571428572e-03 718 760 4.76190476189937e-03 718 761 -2.60208521396521e-18 718 762 -4.16666666666397e-03 718 763 -4.46428571428572e-03 719 719 3.33333333333441e-02 719 675 -4.16666666666396e-03 719 676 8.67361737988404e-19 719 677 -1.30952380952435e-02 719 678 4.46428571428572e-03 719 679 -4.16666666666396e-03 719 716 8.67361737988404e-19 719 717 4.76190476189935e-03 719 718 3.46944695195361e-18 719 674 -4.46428571428572e-03 719 720 8.67361737988404e-19 719 721 4.76190476189935e-03 719 758 4.46428571428571e-03 719 759 -4.16666666666396e-03 719 760 -4.77048955893622e-18 719 761 -1.30952380952435e-02 719 762 -4.46428571428572e-03 719 763 -4.16666666666397e-03 720 720 3.33333333333442e-02 720 677 -4.46428571428572e-03 720 678 4.76190476189937e-03 720 679 -4.33680868994202e-19 720 680 -4.16666666666397e-03 720 681 4.46428571428571e-03 720 718 -1.30952380952435e-02 720 719 0.00000000000000e+00 720 676 -4.16666666666397e-03 720 721 3.46944695195361e-18 720 722 -1.30952380952435e-02 720 723 8.67361737988404e-19 720 760 -4.16666666666397e-03 720 761 4.46428571428571e-03 720 762 4.76190476189937e-03 720 763 -4.33680868994202e-18 720 764 -4.16666666666397e-03 720 765 -4.46428571428572e-03 721 721 3.33333333333441e-02 721 677 -4.16666666666396e-03 721 678 4.33680868994202e-19 721 679 -1.30952380952435e-02 721 680 4.46428571428572e-03 721 681 -4.16666666666396e-03 721 718 8.67361737988404e-19 721 719 4.76190476189935e-03 721 720 3.46944695195361e-18 721 676 -4.46428571428572e-03 721 722 4.33680868994202e-19 721 723 4.76190476189936e-03 721 760 4.46428571428571e-03 721 761 -4.16666666666396e-03 721 762 -4.33680868994202e-18 721 763 -1.30952380952435e-02 721 764 -4.46428571428572e-03 721 765 -4.16666666666397e-03 722 722 3.33333333333442e-02 722 679 -4.46428571428572e-03 722 680 4.76190476189937e-03 722 681 0.00000000000000e+00 722 682 -4.16666666666397e-03 722 683 4.46428571428572e-03 722 720 -1.30952380952435e-02 722 721 8.67361737988404e-19 722 678 -4.16666666666397e-03 722 723 3.46944695195361e-18 722 724 -1.30952380952435e-02 722 725 8.67361737988404e-19 722 762 -4.16666666666397e-03 722 763 4.46428571428571e-03 722 764 4.76190476189937e-03 722 765 -3.90312782094782e-18 722 766 -4.16666666666398e-03 722 767 -4.46428571428572e-03 723 723 3.33333333333441e-02 723 679 -4.16666666666396e-03 723 680 4.33680868994202e-19 723 681 -1.30952380952435e-02 723 682 4.46428571428571e-03 723 683 -4.16666666666396e-03 723 720 8.67361737988404e-19 723 721 4.76190476189936e-03 723 722 3.46944695195361e-18 723 678 -4.46428571428572e-03 723 724 8.67361737988404e-19 723 725 4.76190476189935e-03 723 762 4.46428571428571e-03 723 763 -4.16666666666396e-03 723 764 -4.33680868994202e-18 723 765 -1.30952380952435e-02 723 766 -4.46428571428572e-03 723 767 -4.16666666666396e-03 724 724 3.33333333333442e-02 724 681 -4.46428571428572e-03 724 682 4.76190476189937e-03 724 683 -8.67361737988404e-19 724 684 -4.16666666666397e-03 724 685 4.46428571428572e-03 724 722 -1.30952380952435e-02 724 723 4.33680868994202e-19 724 680 -4.16666666666397e-03 724 725 4.33680868994202e-18 724 726 -1.30952380952435e-02 724 727 8.67361737988404e-19 724 764 -4.16666666666397e-03 724 765 4.46428571428571e-03 724 766 4.76190476189937e-03 724 767 -3.46944695195361e-18 724 768 -4.16666666666397e-03 724 769 -4.46428571428572e-03 725 725 3.33333333333441e-02 725 681 -4.16666666666396e-03 725 682 8.67361737988404e-19 725 683 -1.30952380952435e-02 725 684 4.46428571428571e-03 725 685 -4.16666666666397e-03 725 722 4.33680868994202e-19 725 723 4.76190476189935e-03 725 724 5.20417042793042e-18 725 680 -4.46428571428572e-03 725 726 4.33680868994202e-19 725 727 4.76190476189936e-03 725 764 4.46428571428571e-03 725 765 -4.16666666666396e-03 725 766 -4.77048955893622e-18 725 767 -1.30952380952435e-02 725 768 -4.46428571428572e-03 725 769 -4.16666666666397e-03 726 726 3.33333333333442e-02 726 683 -4.46428571428572e-03 726 684 4.76190476189937e-03 726 685 -1.30104260698261e-18 726 686 -4.16666666666397e-03 726 687 4.46428571428571e-03 726 724 -1.30952380952435e-02 726 725 4.33680868994202e-19 726 682 -4.16666666666397e-03 726 727 2.60208521396521e-18 726 728 -1.30952380952435e-02 726 729 8.67361737988404e-19 726 766 -4.16666666666396e-03 726 767 4.46428571428571e-03 726 768 4.76190476189937e-03 726 769 -3.03576608295941e-18 726 770 -4.16666666666398e-03 726 771 -4.46428571428572e-03 727 727 3.33333333333441e-02 727 683 -4.16666666666397e-03 727 684 0.00000000000000e+00 727 685 -1.30952380952435e-02 727 686 4.46428571428572e-03 727 687 -4.16666666666396e-03 727 724 8.67361737988404e-19 727 725 4.76190476189936e-03 727 726 2.60208521396521e-18 727 682 -4.46428571428572e-03 727 728 8.67361737988404e-19 727 729 4.76190476189934e-03 727 766 4.46428571428571e-03 727 767 -4.16666666666397e-03 727 768 -4.33680868994202e-18 727 769 -1.30952380952435e-02 727 770 -4.46428571428572e-03 727 771 -4.16666666666396e-03 728 728 1.17051282051320e+00 728 685 -4.46428571428572e-03 728 686 9.85347985346088e-02 728 687 4.53983516483517e-02 728 688 -2.88461538461351e-01 728 689 2.40384615384615e-01 728 726 -1.30952380952435e-02 728 727 8.67361737988404e-19 728 684 -4.16666666666397e-03 728 729 1.11022302462516e-16 728 730 -7.69230769231143e-01 728 731 5.55111512312578e-17 728 768 -4.16666666666397e-03 728 769 4.46428571428571e-03 728 770 9.85347985346089e-02 728 771 -4.53983516483518e-02 728 772 -2.88461538461352e-01 728 773 -2.40384615384615e-01 729 729 1.17051282051320e+00 729 685 -4.16666666666396e-03 729 686 -4.53983516483516e-02 729 687 -3.91163003663193e-01 729 688 2.40384615384615e-01 729 689 -2.88461538461351e-01 729 726 8.67361737988404e-19 729 727 4.76190476189934e-03 729 728 8.32667268468867e-17 729 684 -4.46428571428572e-03 729 730 4.85722573273506e-17 729 731 1.92307692307318e-01 729 768 4.46428571428571e-03 729 769 -4.16666666666396e-03 729 770 4.53983516483515e-02 729 771 -3.91163003663193e-01 729 772 -2.40384615384615e-01 729 773 -2.88461538461352e-01 730 730 2.30769230769306e+00 730 687 -2.40384615384615e-01 730 688 1.92307692307319e-01 730 689 2.08166817117217e-17 730 690 -2.88461538461352e-01 730 691 2.40384615384615e-01 730 728 -7.69230769231143e-01 730 729 4.85722573273506e-17 730 686 -2.88461538461351e-01 730 731 1.66533453693773e-16 730 732 -7.69230769231145e-01 730 733 1.38777878078145e-17 730 770 -2.88461538461351e-01 730 771 2.40384615384615e-01 730 772 1.92307692307319e-01 730 773 -1.94289029309402e-16 730 774 -2.88461538461352e-01 730 775 -2.40384615384615e-01 731 731 2.30769230769305e+00 731 687 -2.88461538461351e-01 731 688 2.77555756156289e-17 731 689 -7.69230769231142e-01 731 690 2.40384615384615e-01 731 691 -2.88461538461351e-01 731 728 4.16333634234434e-17 731 729 1.92307692307318e-01 731 730 2.22044604925031e-16 731 686 -2.40384615384615e-01 731 732 7.63278329429795e-17 731 733 1.92307692307317e-01 731 770 2.40384615384615e-01 731 771 -2.88461538461351e-01 731 772 -2.01227923213310e-16 731 773 -7.69230769231142e-01 731 774 -2.40384615384615e-01 731 775 -2.88461538461351e-01 732 732 2.30769230769306e+00 732 689 -2.40384615384615e-01 732 690 1.92307692307320e-01 732 691 -6.93889390390723e-18 732 692 -2.88461538461352e-01 732 693 2.40384615384615e-01 732 730 -7.69230769231145e-01 732 731 6.24500451351651e-17 732 688 -2.88461538461352e-01 732 733 1.94289029309402e-16 732 734 -7.69230769231145e-01 732 735 2.77555756156289e-17 732 772 -2.88461538461352e-01 732 773 2.40384615384615e-01 732 774 1.92307692307320e-01 732 775 -2.08166817117217e-16 732 776 -2.88461538461352e-01 732 777 -2.40384615384615e-01 733 733 2.30769230769305e+00 733 689 -2.88461538461351e-01 733 690 0.00000000000000e+00 733 691 -7.69230769231141e-01 733 692 2.40384615384615e-01 733 693 -2.88461538461351e-01 733 730 2.77555756156289e-17 733 731 1.92307692307317e-01 733 732 1.94289029309402e-16 733 688 -2.40384615384615e-01 733 734 4.85722573273506e-17 733 735 1.92307692307317e-01 733 772 2.40384615384615e-01 733 773 -2.88461538461351e-01 733 774 -2.01227923213310e-16 733 775 -7.69230769231141e-01 733 776 -2.40384615384615e-01 733 777 -2.88461538461351e-01 734 734 2.30769230769306e+00 734 691 -2.40384615384615e-01 734 692 1.92307692307319e-01 734 693 6.24500451351651e-17 734 694 -2.88461538461352e-01 734 695 2.40384615384615e-01 734 732 -7.69230769231145e-01 734 733 6.24500451351651e-17 734 690 -2.88461538461352e-01 734 735 1.66533453693773e-16 734 736 -7.69230769231144e-01 734 737 4.16333634234434e-17 734 774 -2.88461538461352e-01 734 775 2.40384615384615e-01 734 776 1.92307692307319e-01 734 777 -2.08166817117217e-16 734 778 -2.88461538461352e-01 734 779 -2.40384615384615e-01 735 735 2.30769230769305e+00 735 691 -2.88461538461351e-01 735 692 2.77555756156289e-17 735 693 -7.69230769231142e-01 735 694 2.40384615384615e-01 735 695 -2.88461538461351e-01 735 732 4.16333634234434e-17 735 733 1.92307692307317e-01 735 734 1.38777878078145e-16 735 690 -2.40384615384615e-01 735 736 6.24500451351651e-17 735 737 1.92307692307318e-01 735 774 2.40384615384615e-01 735 775 -2.88461538461351e-01 735 776 -1.45716771982052e-16 735 777 -7.69230769231142e-01 735 778 -2.40384615384615e-01 735 779 -2.88461538461351e-01 736 736 2.30769230769306e+00 736 693 -2.40384615384615e-01 736 694 1.92307692307318e-01 736 695 -2.08166817117217e-17 736 696 -2.88461538461351e-01 736 697 2.40384615384615e-01 736 734 -7.69230769231144e-01 736 735 6.93889390390723e-17 736 692 -2.88461538461352e-01 736 737 2.49800180540660e-16 736 738 -7.69230769231142e-01 736 739 4.16333634234434e-17 736 776 -2.88461538461351e-01 736 777 2.40384615384615e-01 736 778 1.92307692307318e-01 736 779 -2.28983498828939e-16 736 780 -2.88461538461351e-01 736 781 -2.40384615384615e-01 737 737 2.30769230769306e+00 737 693 -2.88461538461351e-01 737 694 -4.85722573273506e-17 737 695 -7.69230769231143e-01 737 696 2.40384615384615e-01 737 697 -2.88461538461352e-01 737 734 3.46944695195361e-17 737 735 1.92307692307318e-01 737 736 2.49800180540660e-16 737 692 -2.40384615384615e-01 737 738 4.85722573273506e-17 737 739 1.92307692307319e-01 737 776 2.40384615384615e-01 737 777 -2.88461538461351e-01 737 778 -2.22044604925031e-16 737 779 -7.69230769231143e-01 737 780 -2.40384615384615e-01 737 781 -2.88461538461352e-01 738 738 2.30769230769306e+00 738 695 -2.40384615384615e-01 738 696 1.92307692307318e-01 738 697 -6.93889390390723e-18 738 698 -2.88461538461352e-01 738 699 2.40384615384615e-01 738 736 -7.69230769231142e-01 738 737 5.55111512312578e-17 738 694 -2.88461538461351e-01 738 739 2.22044604925031e-16 738 740 -7.69230769231144e-01 738 741 4.85722573273506e-17 738 778 -2.88461538461351e-01 738 779 2.40384615384615e-01 738 780 1.92307692307318e-01 738 781 -2.22044604925031e-16 738 782 -2.88461538461352e-01 738 783 -2.40384615384615e-01 739 739 2.30769230769306e+00 739 695 -2.88461538461352e-01 739 696 1.38777878078145e-17 739 697 -7.69230769231143e-01 739 698 2.40384615384615e-01 739 699 -2.88461538461351e-01 739 736 6.24500451351651e-17 739 737 1.92307692307319e-01 739 738 1.38777878078145e-16 739 694 -2.40384615384615e-01 739 740 4.85722573273506e-17 739 741 1.92307692307318e-01 739 778 2.40384615384615e-01 739 779 -2.88461538461352e-01 739 780 -1.80411241501588e-16 739 781 -7.69230769231143e-01 739 782 -2.40384615384615e-01 739 783 -2.88461538461351e-01 740 740 2.30769230769306e+00 740 697 -2.40384615384615e-01 740 698 1.92307692307319e-01 740 699 6.93889390390723e-18 740 700 -2.88461538461352e-01 740 701 2.40384615384615e-01 740 738 -7.69230769231144e-01 740 739 4.16333634234434e-17 740 696 -2.88461538461352e-01 740 741 1.66533453693773e-16 740 742 -7.69230769231145e-01 740 743 2.77555756156289e-17 740 780 -2.88461538461351e-01 740 781 2.40384615384615e-01 740 782 1.92307692307319e-01 740 783 -2.15105711021124e-16 740 784 -2.88461538461352e-01 740 785 -2.40384615384615e-01 741 741 2.30769230769305e+00 741 697 -2.88461538461351e-01 741 698 1.38777878078145e-17 741 699 -7.69230769231142e-01 741 700 2.40384615384615e-01 741 701 -2.88461538461351e-01 741 738 5.55111512312578e-17 741 739 1.92307692307318e-01 741 740 1.94289029309402e-16 741 696 -2.40384615384615e-01 741 742 4.85722573273506e-17 741 743 1.92307692307317e-01 741 780 2.40384615384615e-01 741 781 -2.88461538461351e-01 741 782 -1.73472347597681e-16 741 783 -7.69230769231142e-01 741 784 -2.40384615384615e-01 741 785 -2.88461538461351e-01 742 742 2.30769230769306e+00 742 699 -2.40384615384615e-01 742 700 1.92307692307320e-01 742 701 2.08166817117217e-17 742 702 -2.88461538461352e-01 742 703 2.40384615384615e-01 742 740 -7.69230769231145e-01 742 741 6.24500451351651e-17 742 698 -2.88461538461352e-01 742 743 1.66533453693773e-16 742 744 -7.69230769231145e-01 742 745 4.16333634234434e-17 742 782 -2.88461538461352e-01 742 783 2.40384615384615e-01 742 784 1.92307692307320e-01 742 785 -2.08166817117217e-16 742 786 -2.88461538461352e-01 742 787 -2.40384615384615e-01 743 743 2.30769230769305e+00 743 699 -2.88461538461351e-01 743 700 2.77555756156289e-17 743 701 -7.69230769231141e-01 743 702 2.40384615384615e-01 743 703 -2.88461538461351e-01 743 740 4.16333634234434e-17 743 741 1.92307692307317e-01 743 742 2.22044604925031e-16 743 698 -2.40384615384615e-01 743 744 4.85722573273506e-17 743 745 1.92307692307317e-01 743 782 2.40384615384615e-01 743 783 -2.88461538461351e-01 743 784 -1.73472347597681e-16 743 785 -7.69230769231141e-01 743 786 -2.40384615384615e-01 743 787 -2.88461538461351e-01 744 744 1.15384717236505e+00 744 701 -2.40384615384615e-01 744 702 9.61538924499562e-02 744 703 -4.80769577991453e-02 744 704 -2.54629629629465e-07 744 705 1.73611111111111e-07 744 742 -7.69230769231145e-01 744 743 4.85722573273506e-17 744 700 -2.88461538461352e-01 744 745 1.23762816189743e-16 744 746 -6.01851851852182e-07 744 747 1.32348898008484e-23 744 784 -2.88461538461352e-01 744 785 2.40384615384615e-01 744 786 9.61538924499561e-02 744 787 4.80769577991452e-02 744 788 -2.54629629629465e-07 744 789 -1.73611111111111e-07 745 745 1.15384717236504e+00 745 701 -2.88461538461351e-01 745 702 4.80769577991453e-02 745 703 -3.84615685541496e-01 745 704 1.73611111111111e-07 745 705 -2.54629629629465e-07 745 742 4.16333634234434e-17 745 743 1.92307692307317e-01 745 744 1.23762816189743e-16 745 700 -2.40384615384615e-01 745 746 4.63221143029695e-23 745 747 9.25925925922626e-08 745 784 2.40384615384615e-01 745 785 -2.88461538461351e-01 745 786 -4.80769577991454e-02 745 787 -3.84615685541496e-01 745 788 -1.73611111111111e-07 745 789 -2.54629629629465e-07 746 746 2.03703703703770e-06 746 703 -1.73611111111111e-07 746 704 9.25925925922631e-08 746 705 -6.61744490042422e-24 746 706 -2.54629629629465e-07 746 707 1.73611111111111e-07 746 744 -6.01851851852182e-07 746 745 5.95570041038180e-23 746 702 -2.54629629629465e-07 746 747 1.32348898008484e-22 746 748 -6.01851851852183e-07 746 749 2.64697796016969e-23 746 786 -2.54629629629464e-07 746 787 1.73611111111111e-07 746 788 9.25925925922631e-08 746 789 -1.32348898008484e-22 746 790 -2.54629629629465e-07 746 791 -1.73611111111111e-07 747 747 2.03703703703770e-06 747 703 -2.54629629629465e-07 747 704 -1.98523347012727e-23 747 705 -6.01851851852181e-07 747 706 1.73611111111111e-07 747 707 -2.54629629629464e-07 747 744 2.64697796016969e-23 747 745 9.25925925922626e-08 747 746 1.32348898008484e-22 747 702 -1.73611111111111e-07 747 748 4.63221143029695e-23 747 749 9.25925925922615e-08 747 786 1.73611111111111e-07 747 787 -2.54629629629465e-07 747 788 -1.32348898008484e-22 747 789 -6.01851851852181e-07 747 790 -1.73611111111111e-07 747 791 -2.54629629629465e-07 748 748 2.03703703703770e-06 748 705 -1.73611111111111e-07 748 706 9.25925925922644e-08 748 707 1.32348898008484e-23 748 708 -2.54629629629465e-07 748 709 1.73611111111111e-07 748 746 -6.01851851852183e-07 748 747 3.30872245021211e-23 748 704 -2.54629629629465e-07 748 749 1.05879118406788e-22 748 750 -6.01851851852186e-07 748 751 1.32348898008484e-23 748 788 -2.54629629629465e-07 748 789 1.73611111111111e-07 748 790 9.25925925922644e-08 748 791 -1.45583787809333e-22 748 792 -2.54629629629465e-07 748 793 -1.73611111111111e-07 749 749 2.03703703703770e-06 749 705 -2.54629629629464e-07 749 706 -1.32348898008484e-23 749 707 -6.01851851852180e-07 749 708 1.73611111111111e-07 749 709 -2.54629629629464e-07 749 746 2.64697796016969e-23 749 747 9.25925925922615e-08 749 748 1.32348898008484e-22 749 704 -1.73611111111111e-07 749 750 3.97046694025453e-23 749 751 9.25925925922599e-08 749 788 1.73611111111111e-07 749 789 -2.54629629629464e-07 749 790 -1.32348898008484e-22 749 791 -6.01851851852180e-07 749 792 -1.73611111111111e-07 749 793 -2.54629629629464e-07 750 750 2.03703703703770e-06 750 707 -1.73611111111111e-07 750 708 9.25925925922637e-08 750 709 -6.61744490042422e-24 750 710 -2.54629629629465e-07 750 711 1.73611111111111e-07 750 748 -6.01851851852186e-07 750 749 3.30872245021211e-23 750 706 -2.54629629629465e-07 750 751 1.05879118406788e-22 750 752 -6.01851851852181e-07 750 753 1.32348898008484e-23 750 790 -2.54629629629465e-07 750 791 1.73611111111111e-07 750 792 9.25925925922637e-08 750 793 -1.38966342908909e-22 750 794 -2.54629629629465e-07 750 795 -1.73611111111111e-07 751 751 2.03703703703770e-06 751 707 -2.54629629629464e-07 751 708 -6.61744490042422e-24 751 709 -6.01851851852181e-07 751 710 1.73611111111111e-07 751 711 -2.54629629629465e-07 751 748 1.32348898008484e-23 751 749 9.25925925922599e-08 751 750 1.32348898008484e-22 751 706 -1.73611111111111e-07 751 752 3.30872245021211e-23 751 753 9.25925925922629e-08 751 790 1.73611111111111e-07 751 791 -2.54629629629464e-07 751 792 -1.32348898008484e-22 751 793 -6.01851851852181e-07 751 794 -1.73611111111111e-07 751 795 -2.54629629629465e-07 752 752 2.03703703703770e-06 752 709 -1.73611111111111e-07 752 710 9.25925925922623e-08 752 711 6.61744490042422e-24 752 712 -2.54629629629465e-07 752 713 1.73611111111111e-07 752 750 -6.01851851852181e-07 752 751 3.30872245021211e-23 752 708 -2.54629629629465e-07 752 753 1.32348898008484e-22 752 754 -6.01851851852182e-07 752 755 1.32348898008484e-23 752 792 -2.54629629629464e-07 752 793 1.73611111111111e-07 752 794 9.25925925922624e-08 752 795 -1.72053567411030e-22 752 796 -2.54629629629465e-07 752 797 -1.73611111111111e-07 753 753 2.03703703703770e-06 753 709 -2.54629629629465e-07 753 710 -2.64697796016969e-23 753 711 -6.01851851852182e-07 753 712 1.73611111111111e-07 753 713 -2.54629629629465e-07 753 750 2.64697796016969e-23 753 751 9.25925925922629e-08 753 752 1.32348898008484e-22 753 708 -1.73611111111111e-07 753 754 4.63221143029695e-23 753 755 9.25925925922626e-08 753 792 1.73611111111111e-07 753 793 -2.54629629629465e-07 753 794 -1.38966342908909e-22 753 795 -6.01851851852182e-07 753 796 -1.73611111111111e-07 753 797 -2.54629629629465e-07 754 754 2.03703703703770e-06 754 711 -1.73611111111111e-07 754 712 9.25925925922634e-08 754 713 0.00000000000000e+00 754 752 -6.01851851852182e-07 754 753 5.95570041038180e-23 754 710 -2.54629629629465e-07 754 755 1.05879118406788e-22 754 794 -2.54629629629464e-07 754 795 1.73611111111111e-07 754 796 9.25925925922634e-08 754 797 -1.19114008207636e-22 755 755 2.03703703703770e-06 755 711 -2.54629629629465e-07 755 712 0.00000000000000e+00 755 713 -6.01851851852181e-07 755 752 2.64697796016969e-23 755 753 9.25925925922626e-08 755 754 1.05879118406788e-22 755 710 -1.73611111111111e-07 755 794 1.73611111111111e-07 755 795 -2.54629629629465e-07 755 796 -1.25731453108060e-22 755 797 -6.01851851852181e-07 756 756 3.33333333333442e-02 756 715 -5.20417042793042e-18 756 716 -4.16666666666397e-03 756 717 4.46428571428571e-03 756 714 4.76190476189937e-03 756 757 -4.33680868994202e-18 756 758 -1.30952380952435e-02 756 759 -1.30104260698261e-18 756 798 4.76190476189935e-03 756 799 6.50521303491303e-18 756 800 -4.16666666666396e-03 756 801 -4.46428571428571e-03 757 757 3.33333333333442e-02 757 715 -1.30952380952435e-02 757 716 4.46428571428572e-03 757 717 -4.16666666666396e-03 757 756 -3.46944695195361e-18 757 714 -3.03576608295941e-18 757 758 -1.30104260698261e-18 757 759 4.76190476189936e-03 757 798 6.93889390390723e-18 757 799 -1.30952380952435e-02 757 800 -4.46428571428571e-03 757 801 -4.16666666666397e-03 758 758 3.33333333333442e-02 758 715 -4.46428571428572e-03 758 716 4.76190476189937e-03 758 717 -5.20417042793042e-18 758 718 -4.16666666666397e-03 758 719 4.46428571428571e-03 758 756 -1.30952380952435e-02 758 757 -1.73472347597681e-18 758 714 -4.16666666666397e-03 758 759 -4.33680868994202e-18 758 760 -1.30952380952435e-02 758 761 -1.30104260698261e-18 758 798 -4.16666666666397e-03 758 799 4.46428571428572e-03 758 800 4.76190476189935e-03 758 801 6.50521303491303e-18 758 802 -4.16666666666396e-03 758 803 -4.46428571428571e-03 759 759 3.33333333333442e-02 759 715 -4.16666666666397e-03 759 716 -3.03576608295941e-18 759 717 -1.30952380952435e-02 759 718 4.46428571428572e-03 759 719 -4.16666666666396e-03 759 756 -1.30104260698261e-18 759 757 4.76190476189936e-03 759 758 -3.46944695195361e-18 759 714 -4.46428571428572e-03 759 760 -1.30104260698261e-18 759 761 4.76190476189936e-03 759 798 4.46428571428572e-03 759 799 -4.16666666666397e-03 759 800 6.93889390390723e-18 759 801 -1.30952380952435e-02 759 802 -4.46428571428571e-03 759 803 -4.16666666666397e-03 760 760 3.33333333333442e-02 760 717 -4.46428571428572e-03 760 718 4.76190476189937e-03 760 719 -5.63785129692462e-18 760 720 -4.16666666666397e-03 760 721 4.46428571428571e-03 760 758 -1.30952380952435e-02 760 759 -1.73472347597681e-18 760 716 -4.16666666666397e-03 760 761 -4.33680868994202e-18 760 762 -1.30952380952435e-02 760 763 -8.67361737988404e-19 760 800 -4.16666666666397e-03 760 801 4.46428571428572e-03 760 802 4.76190476189935e-03 760 803 6.50521303491303e-18 760 804 -4.16666666666396e-03 760 805 -4.46428571428571e-03 761 761 3.33333333333442e-02 761 717 -4.16666666666397e-03 761 718 -2.60208521396521e-18 761 719 -1.30952380952435e-02 761 720 4.46428571428571e-03 761 721 -4.16666666666396e-03 761 758 -1.30104260698261e-18 761 759 4.76190476189936e-03 761 760 -3.46944695195361e-18 761 716 -4.46428571428572e-03 761 762 -1.73472347597681e-18 761 763 4.76190476189937e-03 761 800 4.46428571428572e-03 761 801 -4.16666666666397e-03 761 802 6.50521303491303e-18 761 803 -1.30952380952435e-02 761 804 -4.46428571428571e-03 761 805 -4.16666666666397e-03 762 762 3.33333333333441e-02 762 719 -4.46428571428572e-03 762 720 4.76190476189937e-03 762 721 -4.77048955893622e-18 762 722 -4.16666666666397e-03 762 723 4.46428571428571e-03 762 760 -1.30952380952435e-02 762 761 -2.60208521396521e-18 762 718 -4.16666666666397e-03 762 763 -3.46944695195361e-18 762 764 -1.30952380952435e-02 762 765 -8.67361737988404e-19 762 802 -4.16666666666397e-03 762 803 4.46428571428572e-03 762 804 4.76190476189935e-03 762 805 6.50521303491303e-18 762 806 -4.16666666666396e-03 762 807 -4.46428571428571e-03 763 763 3.33333333333442e-02 763 719 -4.16666666666396e-03 763 720 -3.90312782094782e-18 763 721 -1.30952380952435e-02 763 722 4.46428571428571e-03 763 723 -4.16666666666396e-03 763 760 -1.30104260698261e-18 763 761 4.76190476189937e-03 763 762 -3.46944695195361e-18 763 718 -4.46428571428572e-03 763 764 -1.30104260698261e-18 763 765 4.76190476189937e-03 763 802 4.46428571428572e-03 763 803 -4.16666666666397e-03 763 804 6.07153216591882e-18 763 805 -1.30952380952435e-02 763 806 -4.46428571428571e-03 763 807 -4.16666666666397e-03 764 764 3.33333333333442e-02 764 721 -4.46428571428572e-03 764 722 4.76190476189937e-03 764 723 -4.33680868994202e-18 764 724 -4.16666666666397e-03 764 725 4.46428571428571e-03 764 762 -1.30952380952435e-02 764 763 -2.60208521396521e-18 764 720 -4.16666666666397e-03 764 765 -4.33680868994202e-18 764 766 -1.30952380952435e-02 764 767 -8.67361737988404e-19 764 804 -4.16666666666397e-03 764 805 4.46428571428572e-03 764 806 4.76190476189935e-03 764 807 7.37257477290143e-18 764 808 -4.16666666666396e-03 764 809 -4.46428571428571e-03 765 765 3.33333333333442e-02 765 721 -4.16666666666397e-03 765 722 -3.46944695195361e-18 765 723 -1.30952380952435e-02 765 724 4.46428571428571e-03 765 725 -4.16666666666396e-03 765 762 -1.30104260698261e-18 765 763 4.76190476189937e-03 765 764 -5.20417042793042e-18 765 720 -4.46428571428572e-03 765 766 -1.30104260698261e-18 765 767 4.76190476189936e-03 765 804 4.46428571428572e-03 765 805 -4.16666666666397e-03 765 806 6.93889390390723e-18 765 807 -1.30952380952435e-02 765 808 -4.46428571428571e-03 765 809 -4.16666666666397e-03 766 766 3.33333333333441e-02 766 723 -4.46428571428572e-03 766 724 4.76190476189937e-03 766 725 -4.77048955893622e-18 766 726 -4.16666666666396e-03 766 727 4.46428571428571e-03 766 764 -1.30952380952435e-02 766 765 -1.30104260698261e-18 766 722 -4.16666666666398e-03 766 767 -4.33680868994202e-18 766 768 -1.30952380952435e-02 766 769 -8.67361737988404e-19 766 806 -4.16666666666397e-03 766 807 4.46428571428572e-03 766 808 4.76190476189935e-03 766 809 7.37257477290143e-18 766 810 -4.16666666666395e-03 766 811 -4.46428571428571e-03 767 767 3.33333333333442e-02 767 723 -4.16666666666396e-03 767 724 -3.46944695195361e-18 767 725 -1.30952380952435e-02 767 726 4.46428571428571e-03 767 727 -4.16666666666397e-03 767 764 -1.73472347597681e-18 767 765 4.76190476189936e-03 767 766 -1.73472347597681e-18 767 722 -4.46428571428572e-03 767 768 -1.73472347597681e-18 767 769 4.76190476189937e-03 767 806 4.46428571428572e-03 767 807 -4.16666666666397e-03 767 808 7.80625564189563e-18 767 809 -1.30952380952435e-02 767 810 -4.46428571428571e-03 767 811 -4.16666666666397e-03 768 768 3.33333333333442e-02 768 725 -4.46428571428572e-03 768 726 4.76190476189937e-03 768 727 -4.77048955893622e-18 768 728 -4.16666666666397e-03 768 729 4.46428571428571e-03 768 766 -1.30952380952435e-02 768 767 -1.73472347597681e-18 768 724 -4.16666666666397e-03 768 769 -4.33680868994202e-18 768 770 -1.30952380952435e-02 768 771 -8.67361737988404e-19 768 808 -4.16666666666397e-03 768 809 4.46428571428572e-03 768 810 4.76190476189935e-03 768 811 6.50521303491303e-18 768 812 -4.16666666666396e-03 768 813 -4.46428571428571e-03 769 769 3.33333333333442e-02 769 725 -4.16666666666397e-03 769 726 -3.90312782094782e-18 769 727 -1.30952380952435e-02 769 728 4.46428571428571e-03 769 729 -4.16666666666396e-03 769 766 -1.30104260698261e-18 769 767 4.76190476189937e-03 769 768 -3.46944695195361e-18 769 724 -4.46428571428572e-03 769 770 -1.73472347597681e-18 769 771 4.76190476189935e-03 769 808 4.46428571428572e-03 769 809 -4.16666666666398e-03 769 810 7.37257477290143e-18 769 811 -1.30952380952435e-02 769 812 -4.46428571428571e-03 769 813 -4.16666666666397e-03 770 770 1.17051282051320e+00 770 727 -4.46428571428572e-03 770 728 9.85347985346089e-02 770 729 4.53983516483515e-02 770 730 -2.88461538461351e-01 770 731 2.40384615384615e-01 770 768 -1.30952380952435e-02 770 769 -2.60208521396521e-18 770 726 -4.16666666666398e-03 770 771 -8.32667268468867e-17 770 772 -7.69230769231142e-01 770 773 -5.55111512312578e-17 770 810 -4.16666666666397e-03 770 811 4.46428571428572e-03 770 812 9.85347985346077e-02 770 813 -4.53983516483515e-02 770 814 -2.88461538461351e-01 770 815 -2.40384615384615e-01 771 771 1.17051282051320e+00 771 727 -4.16666666666396e-03 771 728 -4.53983516483517e-02 771 729 -3.91163003663193e-01 771 730 2.40384615384615e-01 771 731 -2.88461538461351e-01 771 768 -1.30104260698261e-18 771 769 4.76190476189935e-03 771 770 -8.32667268468867e-17 771 726 -4.46428571428572e-03 771 772 -4.85722573273506e-17 771 773 1.92307692307319e-01 771 810 4.46428571428572e-03 771 811 -4.16666666666397e-03 771 812 4.53983516483519e-02 771 813 -3.91163003663195e-01 771 814 -2.40384615384615e-01 771 815 -2.88461538461352e-01 772 772 2.30769230769306e+00 772 729 -2.40384615384615e-01 772 730 1.92307692307319e-01 772 731 -2.15105711021124e-16 772 732 -2.88461538461352e-01 772 733 2.40384615384615e-01 772 770 -7.69230769231142e-01 772 771 -3.46944695195361e-17 772 728 -2.88461538461352e-01 772 773 -1.66533453693773e-16 772 774 -7.69230769231144e-01 772 775 -6.93889390390723e-17 772 812 -2.88461538461352e-01 772 813 2.40384615384616e-01 772 814 1.92307692307317e-01 772 815 4.16333634234434e-16 772 816 -2.88461538461351e-01 772 817 -2.40384615384615e-01 773 773 2.30769230769306e+00 773 729 -2.88461538461352e-01 773 730 -1.66533453693773e-16 773 731 -7.69230769231142e-01 773 732 2.40384615384615e-01 773 733 -2.88461538461351e-01 773 770 -5.55111512312578e-17 773 771 1.92307692307319e-01 773 772 -1.11022302462516e-16 773 728 -2.40384615384615e-01 773 774 -8.32667268468867e-17 773 775 1.92307692307318e-01 773 812 2.40384615384615e-01 773 813 -2.88461538461352e-01 773 814 4.09394740330526e-16 773 815 -7.69230769231145e-01 773 816 -2.40384615384615e-01 773 817 -2.88461538461351e-01 774 774 2.30769230769306e+00 774 731 -2.40384615384615e-01 774 732 1.92307692307320e-01 774 733 -2.28983498828939e-16 774 734 -2.88461538461352e-01 774 735 2.40384615384615e-01 774 772 -7.69230769231144e-01 774 773 -5.55111512312578e-17 774 730 -2.88461538461352e-01 774 775 -1.11022302462516e-16 774 776 -7.69230769231144e-01 774 777 -5.55111512312578e-17 774 814 -2.88461538461352e-01 774 815 2.40384615384615e-01 774 816 1.92307692307318e-01 774 817 4.02455846426619e-16 774 818 -2.88461538461351e-01 774 819 -2.40384615384615e-01 775 775 2.30769230769305e+00 775 731 -2.88461538461351e-01 775 732 -1.80411241501588e-16 775 733 -7.69230769231141e-01 775 734 2.40384615384615e-01 775 735 -2.88461538461351e-01 775 772 -6.93889390390723e-17 775 773 1.92307692307318e-01 775 774 -1.11022302462516e-16 775 730 -2.40384615384615e-01 775 776 -8.32667268468867e-17 775 777 1.92307692307318e-01 775 814 2.40384615384616e-01 775 815 -2.88461538461352e-01 775 816 4.16333634234434e-16 775 817 -7.69230769231144e-01 775 818 -2.40384615384615e-01 775 819 -2.88461538461351e-01 776 776 2.30769230769306e+00 776 733 -2.40384615384615e-01 776 734 1.92307692307319e-01 776 735 -1.45716771982052e-16 776 736 -2.88461538461351e-01 776 737 2.40384615384615e-01 776 774 -7.69230769231144e-01 776 775 -4.16333634234434e-17 776 732 -2.88461538461352e-01 776 777 -2.22044604925031e-16 776 778 -7.69230769231143e-01 776 779 -8.32667268468867e-17 776 816 -2.88461538461352e-01 776 817 2.40384615384616e-01 776 818 1.92307692307318e-01 776 819 4.16333634234434e-16 776 820 -2.88461538461351e-01 776 821 -2.40384615384615e-01 777 777 2.30769230769306e+00 777 733 -2.88461538461351e-01 777 734 -1.87350135405495e-16 777 735 -7.69230769231142e-01 777 736 2.40384615384615e-01 777 737 -2.88461538461351e-01 777 774 -5.55111512312578e-17 777 775 1.92307692307318e-01 777 776 -2.49800180540660e-16 777 732 -2.40384615384615e-01 777 778 -2.08166817117217e-17 777 779 1.92307692307318e-01 777 816 2.40384615384616e-01 777 817 -2.88461538461352e-01 777 818 4.02455846426619e-16 777 819 -7.69230769231144e-01 777 820 -2.40384615384615e-01 777 821 -2.88461538461352e-01 778 778 2.30769230769305e+00 778 735 -2.40384615384615e-01 778 736 1.92307692307318e-01 778 737 -2.28983498828939e-16 778 738 -2.88461538461351e-01 778 739 2.40384615384615e-01 778 776 -7.69230769231143e-01 778 777 -1.38777878078145e-17 778 734 -2.88461538461352e-01 778 779 -1.11022302462516e-16 778 780 -7.69230769231141e-01 778 781 -5.55111512312578e-17 778 818 -2.88461538461352e-01 778 819 2.40384615384616e-01 778 820 1.92307692307317e-01 778 821 3.67761376907083e-16 778 822 -2.88461538461350e-01 778 823 -2.40384615384615e-01 779 779 2.30769230769306e+00 779 735 -2.88461538461351e-01 779 736 -2.49800180540660e-16 779 737 -7.69230769231143e-01 779 738 2.40384615384615e-01 779 739 -2.88461538461352e-01 779 776 -6.93889390390723e-17 779 777 1.92307692307318e-01 779 778 -1.11022302462516e-16 779 734 -2.40384615384615e-01 779 780 -4.16333634234434e-17 779 781 1.92307692307320e-01 779 818 2.40384615384616e-01 779 819 -2.88461538461352e-01 779 820 3.81639164714898e-16 779 821 -7.69230769231146e-01 779 822 -2.40384615384615e-01 779 823 -2.88461538461352e-01 780 780 2.30769230769305e+00 780 737 -2.40384615384615e-01 780 738 1.92307692307318e-01 780 739 -1.87350135405495e-16 780 740 -2.88461538461351e-01 780 741 2.40384615384615e-01 780 778 -7.69230769231141e-01 780 779 -4.85722573273506e-17 780 736 -2.88461538461351e-01 780 781 -1.66533453693773e-16 780 782 -7.69230769231143e-01 780 783 -8.32667268468867e-17 780 820 -2.88461538461351e-01 780 821 2.40384615384616e-01 780 822 1.92307692307316e-01 780 823 4.02455846426619e-16 780 824 -2.88461538461351e-01 780 825 -2.40384615384615e-01 781 781 2.30769230769306e+00 781 737 -2.88461538461352e-01 781 738 -1.73472347597681e-16 781 739 -7.69230769231143e-01 781 740 2.40384615384615e-01 781 741 -2.88461538461351e-01 781 778 -6.24500451351651e-17 781 779 1.92307692307320e-01 781 780 -1.94289029309402e-16 781 736 -2.40384615384615e-01 781 782 -3.46944695195361e-17 781 783 1.92307692307319e-01 781 820 2.40384615384615e-01 781 821 -2.88461538461352e-01 781 822 4.09394740330526e-16 781 823 -7.69230769231146e-01 781 824 -2.40384615384615e-01 781 825 -2.88461538461352e-01 782 782 2.30769230769306e+00 782 739 -2.40384615384615e-01 782 740 1.92307692307319e-01 782 741 -1.87350135405495e-16 782 742 -2.88461538461352e-01 782 743 2.40384615384615e-01 782 780 -7.69230769231143e-01 782 781 -4.16333634234434e-17 782 738 -2.88461538461352e-01 782 783 -1.66533453693773e-16 782 784 -7.69230769231144e-01 782 785 -5.55111512312578e-17 782 822 -2.88461538461352e-01 782 823 2.40384615384616e-01 782 824 1.92307692307318e-01 782 825 3.95516952522712e-16 782 826 -2.88461538461351e-01 782 827 -2.40384615384615e-01 783 783 2.30769230769306e+00 783 739 -2.88461538461351e-01 783 740 -1.80411241501588e-16 783 741 -7.69230769231142e-01 783 742 2.40384615384615e-01 783 743 -2.88461538461351e-01 783 780 -5.55111512312578e-17 783 781 1.92307692307319e-01 783 782 -1.66533453693773e-16 783 738 -2.40384615384615e-01 783 784 -8.32667268468867e-17 783 785 1.92307692307318e-01 783 822 2.40384615384616e-01 783 823 -2.88461538461352e-01 783 824 4.37150315946155e-16 783 825 -7.69230769231144e-01 783 826 -2.40384615384615e-01 783 827 -2.88461538461351e-01 784 784 2.30769230769306e+00 784 741 -2.40384615384615e-01 784 742 1.92307692307320e-01 784 743 -1.87350135405495e-16 784 744 -2.88461538461352e-01 784 745 2.40384615384615e-01 784 782 -7.69230769231144e-01 784 783 -4.16333634234434e-17 784 740 -2.88461538461352e-01 784 785 -1.38777878078145e-16 784 786 -7.69230769231144e-01 784 787 -4.85722573273506e-17 784 824 -2.88461538461352e-01 784 825 2.40384615384616e-01 784 826 1.92307692307318e-01 784 827 4.16333634234434e-16 784 828 -2.88461538461351e-01 784 829 -2.40384615384615e-01 785 785 2.30769230769305e+00 785 741 -2.88461538461351e-01 785 742 -1.80411241501588e-16 785 743 -7.69230769231141e-01 785 744 2.40384615384615e-01 785 745 -2.88461538461351e-01 785 782 -5.55111512312578e-17 785 783 1.92307692307318e-01 785 784 -1.38777878078145e-16 785 740 -2.40384615384615e-01 785 786 -6.93889390390723e-17 785 787 1.92307692307318e-01 785 824 2.40384615384616e-01 785 825 -2.88461538461352e-01 785 826 4.02455846426619e-16 785 827 -7.69230769231144e-01 785 828 -2.40384615384615e-01 785 829 -2.88461538461351e-01 786 786 1.15384717236505e+00 786 743 -2.40384615384615e-01 786 744 9.61538924499561e-02 786 745 -4.80769577991454e-02 786 746 -2.54629629629464e-07 786 747 1.73611111111111e-07 786 784 -7.69230769231144e-01 786 785 -6.93889390390723e-17 786 742 -2.88461538461352e-01 786 787 -7.05263984081164e-17 786 788 -6.01851851852181e-07 786 789 -5.29395592033938e-23 786 826 -2.88461538461352e-01 786 827 2.40384615384615e-01 786 828 9.61538924499556e-02 786 829 4.80769577991455e-02 786 830 -2.54629629629464e-07 786 831 -1.73611111111111e-07 787 787 1.15384717236505e+00 787 743 -2.88461538461351e-01 787 744 4.80769577991452e-02 787 745 -3.84615685541496e-01 787 746 1.73611111111111e-07 787 747 -2.54629629629465e-07 787 784 -4.16333634234434e-17 787 785 1.92307692307318e-01 787 786 -7.05263984081164e-17 787 742 -2.40384615384615e-01 787 788 -4.63221143029695e-23 787 789 9.25925925922633e-08 787 826 2.40384615384616e-01 787 827 -2.88461538461352e-01 787 828 -4.80769577991451e-02 787 829 -3.84615685541497e-01 787 830 -1.73611111111111e-07 787 831 -2.54629629629465e-07 788 788 2.03703703703770e-06 788 745 -1.73611111111111e-07 788 746 9.25925925922631e-08 788 747 -1.58818677610181e-22 788 748 -2.54629629629465e-07 788 749 1.73611111111111e-07 788 786 -6.01851851852181e-07 788 787 -6.61744490042422e-24 788 744 -2.54629629629465e-07 788 789 -1.05879118406788e-22 788 790 -6.01851851852182e-07 788 791 -5.29395592033938e-23 788 828 -2.54629629629465e-07 788 829 1.73611111111111e-07 788 830 9.25925925922614e-08 788 831 2.91167575618666e-22 788 832 -2.54629629629464e-07 788 833 -1.73611111111111e-07 789 789 2.03703703703770e-06 789 745 -2.54629629629465e-07 789 746 -1.58818677610181e-22 789 747 -6.01851851852181e-07 789 748 1.73611111111111e-07 789 749 -2.54629629629464e-07 789 786 -5.95570041038180e-23 789 787 9.25925925922633e-08 789 788 -1.05879118406788e-22 789 744 -1.73611111111111e-07 789 790 -3.97046694025453e-23 789 791 9.25925925922624e-08 789 828 1.73611111111111e-07 789 829 -2.54629629629465e-07 789 830 2.91167575618666e-22 789 831 -6.01851851852184e-07 789 832 -1.73611111111111e-07 789 833 -2.54629629629465e-07 790 790 2.03703703703770e-06 790 747 -1.73611111111111e-07 790 748 9.25925925922644e-08 790 749 -1.32348898008484e-22 790 750 -2.54629629629465e-07 790 751 1.73611111111111e-07 790 788 -6.01851851852182e-07 790 789 -5.29395592033938e-23 790 746 -2.54629629629465e-07 790 791 -1.58818677610181e-22 790 792 -6.01851851852185e-07 790 793 -2.64697796016969e-23 790 830 -2.54629629629465e-07 790 831 1.73611111111111e-07 790 832 9.25925925922628e-08 790 833 2.91167575618666e-22 790 834 -2.54629629629464e-07 790 835 -1.73611111111111e-07 791 791 2.03703703703770e-06 791 747 -2.54629629629465e-07 791 748 -1.45583787809333e-22 791 749 -6.01851851852180e-07 791 750 1.73611111111111e-07 791 751 -2.54629629629464e-07 791 788 -4.63221143029695e-23 791 789 9.25925925922624e-08 791 790 -1.05879118406788e-22 791 746 -1.73611111111111e-07 791 792 -3.97046694025453e-23 791 793 9.25925925922606e-08 791 830 1.73611111111111e-07 791 831 -2.54629629629465e-07 791 832 2.51462906216120e-22 791 833 -6.01851851852182e-07 791 834 -1.73611111111111e-07 791 835 -2.54629629629464e-07 792 792 2.03703703703770e-06 792 749 -1.73611111111111e-07 792 750 9.25925925922637e-08 792 751 -1.52201232709757e-22 792 752 -2.54629629629464e-07 792 753 1.73611111111111e-07 792 790 -6.01851851852185e-07 792 791 -2.64697796016969e-23 792 748 -2.54629629629465e-07 792 793 -1.05879118406788e-22 792 794 -6.01851851852180e-07 792 795 -3.97046694025453e-23 792 832 -2.54629629629465e-07 792 833 1.73611111111111e-07 792 834 9.25925925922622e-08 792 835 2.97785020519090e-22 792 836 -2.54629629629464e-07 792 837 -1.73611111111111e-07 793 793 2.03703703703770e-06 793 749 -2.54629629629464e-07 793 750 -1.25731453108060e-22 793 751 -6.01851851852181e-07 793 752 1.73611111111111e-07 793 753 -2.54629629629465e-07 793 790 -4.63221143029695e-23 793 791 9.25925925922606e-08 793 792 -7.94093388050907e-23 793 748 -1.73611111111111e-07 793 794 -4.63221143029695e-23 793 795 9.25925925922637e-08 793 832 1.73611111111111e-07 793 833 -2.54629629629465e-07 793 834 2.91167575618666e-22 793 835 -6.01851851852183e-07 793 836 -1.73611111111111e-07 793 837 -2.54629629629465e-07 794 794 2.03703703703770e-06 794 751 -1.73611111111111e-07 794 752 9.25925925922624e-08 794 753 -1.38966342908909e-22 794 754 -2.54629629629464e-07 794 755 1.73611111111111e-07 794 792 -6.01851851852180e-07 794 793 -3.30872245021211e-23 794 750 -2.54629629629465e-07 794 795 -7.94093388050907e-23 794 796 -6.01851851852181e-07 794 797 -5.29395592033938e-23 794 834 -2.54629629629465e-07 794 835 1.73611111111111e-07 794 836 9.25925925922607e-08 794 837 2.77932685817817e-22 794 838 -2.54629629629464e-07 794 839 -1.73611111111111e-07 795 795 2.03703703703770e-06 795 751 -2.54629629629465e-07 795 752 -1.45583787809333e-22 795 753 -6.01851851852182e-07 795 754 1.73611111111111e-07 795 755 -2.54629629629465e-07 795 792 -5.95570041038180e-23 795 793 9.25925925922637e-08 795 794 -1.05879118406788e-22 795 750 -1.73611111111111e-07 795 796 -4.63221143029695e-23 795 797 9.25925925922633e-08 795 834 1.73611111111111e-07 795 835 -2.54629629629465e-07 795 836 2.91167575618666e-22 795 837 -6.01851851852185e-07 795 838 -1.73611111111111e-07 795 839 -2.54629629629465e-07 796 796 2.03703703703770e-06 796 753 -1.73611111111111e-07 796 754 9.25925925922634e-08 796 755 -1.52201232709757e-22 796 794 -6.01851851852181e-07 796 795 -6.61744490042422e-24 796 752 -2.54629629629465e-07 796 797 -1.32348898008484e-22 796 836 -2.54629629629465e-07 796 837 1.73611111111111e-07 796 838 9.25925925922618e-08 796 839 2.91167575618666e-22 797 797 2.03703703703770e-06 797 753 -2.54629629629465e-07 797 754 -1.45583787809333e-22 797 755 -6.01851851852181e-07 797 794 -5.95570041038180e-23 797 795 9.25925925922633e-08 797 796 -1.32348898008484e-22 797 752 -1.73611111111111e-07 797 836 1.73611111111111e-07 797 837 -2.54629629629465e-07 797 838 2.91167575618666e-22 797 839 -6.01851851852183e-07 798 798 3.33333333333442e-02 798 757 7.37257477290143e-18 798 758 -4.16666666666397e-03 798 759 4.46428571428572e-03 798 756 4.76190476189935e-03 798 799 -1.21430643318376e-17 798 800 -1.30952380952435e-02 798 801 -2.16840434497101e-18 798 840 4.76190476189938e-03 798 841 3.90312782094782e-18 798 842 -4.16666666666397e-03 798 843 -4.46428571428572e-03 799 799 3.33333333333442e-02 799 757 -1.30952380952435e-02 799 758 4.46428571428572e-03 799 759 -4.16666666666397e-03 799 798 -1.04083408558608e-17 799 756 7.37257477290143e-18 799 800 -3.46944695195361e-18 799 801 4.76190476189936e-03 799 840 3.46944695195361e-18 799 841 -1.30952380952435e-02 799 842 -4.46428571428572e-03 799 843 -4.16666666666396e-03 800 800 3.33333333333442e-02 800 757 -4.46428571428571e-03 800 758 4.76190476189935e-03 800 759 7.37257477290143e-18 800 760 -4.16666666666397e-03 800 761 4.46428571428572e-03 800 798 -1.30952380952435e-02 800 799 -2.60208521396521e-18 800 756 -4.16666666666396e-03 800 801 -1.21430643318376e-17 800 802 -1.30952380952435e-02 800 803 -2.16840434497101e-18 800 840 -4.16666666666397e-03 800 841 4.46428571428572e-03 800 842 4.76190476189938e-03 800 843 3.90312782094782e-18 800 844 -4.16666666666397e-03 800 845 -4.46428571428572e-03 801 801 3.33333333333442e-02 801 757 -4.16666666666397e-03 801 758 7.37257477290143e-18 801 759 -1.30952380952435e-02 801 760 4.46428571428572e-03 801 761 -4.16666666666397e-03 801 798 -2.16840434497101e-18 801 799 4.76190476189936e-03 801 800 -1.04083408558608e-17 801 756 -4.46428571428571e-03 801 802 -3.46944695195361e-18 801 803 4.76190476189936e-03 801 840 4.46428571428572e-03 801 841 -4.16666666666396e-03 801 842 3.46944695195361e-18 801 843 -1.30952380952435e-02 801 844 -4.46428571428572e-03 801 845 -4.16666666666396e-03 802 802 3.33333333333442e-02 802 759 -4.46428571428571e-03 802 760 4.76190476189935e-03 802 761 6.93889390390723e-18 802 762 -4.16666666666397e-03 802 763 4.46428571428572e-03 802 800 -1.30952380952435e-02 802 801 -2.60208521396521e-18 802 758 -4.16666666666396e-03 802 803 -1.38777878078145e-17 802 804 -1.30952380952435e-02 802 805 -3.03576608295941e-18 802 842 -4.16666666666397e-03 802 843 4.46428571428572e-03 802 844 4.76190476189938e-03 802 845 4.77048955893622e-18 802 846 -4.16666666666397e-03 802 847 -4.46428571428571e-03 803 803 3.33333333333442e-02 803 759 -4.16666666666397e-03 803 760 7.37257477290143e-18 803 761 -1.30952380952435e-02 803 762 4.46428571428572e-03 803 763 -4.16666666666397e-03 803 800 -2.16840434497101e-18 803 801 4.76190476189936e-03 803 802 -1.21430643318376e-17 803 758 -4.46428571428571e-03 803 804 -2.60208521396521e-18 803 805 4.76190476189936e-03 803 842 4.46428571428572e-03 803 843 -4.16666666666396e-03 803 844 3.03576608295941e-18 803 845 -1.30952380952435e-02 803 846 -4.46428571428572e-03 803 847 -4.16666666666396e-03 804 804 3.33333333333441e-02 804 761 -4.46428571428571e-03 804 762 4.76190476189935e-03 804 763 6.93889390390723e-18 804 764 -4.16666666666397e-03 804 765 4.46428571428572e-03 804 802 -1.30952380952435e-02 804 803 -8.67361737988404e-19 804 760 -4.16666666666396e-03 804 805 -1.12757025938492e-17 804 806 -1.30952380952435e-02 804 807 -3.46944695195361e-18 804 844 -4.16666666666397e-03 804 845 4.46428571428572e-03 804 846 4.76190476189937e-03 804 847 4.77048955893622e-18 804 848 -4.16666666666397e-03 804 849 -4.46428571428571e-03 805 805 3.33333333333442e-02 805 761 -4.16666666666397e-03 805 762 7.37257477290143e-18 805 763 -1.30952380952435e-02 805 764 4.46428571428572e-03 805 765 -4.16666666666397e-03 805 802 -2.60208521396521e-18 805 803 4.76190476189936e-03 805 804 -1.21430643318376e-17 805 760 -4.46428571428571e-03 805 806 -2.60208521396521e-18 805 807 4.76190476189937e-03 805 844 4.46428571428572e-03 805 845 -4.16666666666396e-03 805 846 3.46944695195361e-18 805 847 -1.30952380952435e-02 805 848 -4.46428571428572e-03 805 849 -4.16666666666396e-03 806 806 3.33333333333442e-02 806 763 -4.46428571428571e-03 806 764 4.76190476189935e-03 806 765 6.50521303491303e-18 806 766 -4.16666666666397e-03 806 767 4.46428571428572e-03 806 804 -1.30952380952435e-02 806 805 -1.73472347597681e-18 806 762 -4.16666666666396e-03 806 807 -1.04083408558608e-17 806 808 -1.30952380952435e-02 806 809 -3.03576608295941e-18 806 846 -4.16666666666397e-03 806 847 4.46428571428572e-03 806 848 4.76190476189938e-03 806 849 2.60208521396521e-18 806 850 -4.16666666666397e-03 806 851 -4.46428571428572e-03 807 807 3.33333333333442e-02 807 763 -4.16666666666397e-03 807 764 7.37257477290143e-18 807 765 -1.30952380952435e-02 807 766 4.46428571428572e-03 807 767 -4.16666666666397e-03 807 804 -2.60208521396521e-18 807 805 4.76190476189937e-03 807 806 -1.12757025938492e-17 807 762 -4.46428571428571e-03 807 808 -3.03576608295941e-18 807 809 4.76190476189936e-03 807 846 4.46428571428572e-03 807 847 -4.16666666666396e-03 807 848 3.90312782094782e-18 807 849 -1.30952380952435e-02 807 850 -4.46428571428572e-03 807 851 -4.16666666666396e-03 808 808 3.33333333333442e-02 808 765 -4.46428571428571e-03 808 766 4.76190476189935e-03 808 767 7.80625564189563e-18 808 768 -4.16666666666397e-03 808 769 4.46428571428572e-03 808 806 -1.30952380952435e-02 808 807 -3.03576608295941e-18 808 764 -4.16666666666396e-03 808 809 -1.47451495458029e-17 808 810 -1.30952380952435e-02 808 811 -3.03576608295941e-18 808 848 -4.16666666666398e-03 808 849 4.46428571428572e-03 808 850 4.76190476189937e-03 808 851 3.90312782094782e-18 808 852 -4.16666666666397e-03 808 853 -4.46428571428572e-03 809 809 3.33333333333442e-02 809 765 -4.16666666666397e-03 809 766 7.37257477290143e-18 809 767 -1.30952380952435e-02 809 768 4.46428571428572e-03 809 769 -4.16666666666398e-03 809 806 -1.73472347597681e-18 809 807 4.76190476189936e-03 809 808 -1.38777878078145e-17 809 764 -4.46428571428571e-03 809 810 -3.03576608295941e-18 809 811 4.76190476189937e-03 809 848 4.46428571428572e-03 809 849 -4.16666666666396e-03 809 850 2.60208521396521e-18 809 851 -1.30952380952435e-02 809 852 -4.46428571428572e-03 809 853 -4.16666666666397e-03 810 810 3.33333333333442e-02 810 767 -4.46428571428571e-03 810 768 4.76190476189935e-03 810 769 6.93889390390723e-18 810 770 -4.16666666666397e-03 810 771 4.46428571428572e-03 810 808 -1.30952380952435e-02 810 809 -2.16840434497101e-18 810 766 -4.16666666666395e-03 810 811 -1.38777878078145e-17 810 812 -1.30952380952435e-02 810 813 -3.03576608295941e-18 810 850 -4.16666666666397e-03 810 851 4.46428571428572e-03 810 852 4.76190476189938e-03 810 853 4.77048955893622e-18 810 854 -4.16666666666397e-03 810 855 -4.46428571428571e-03 811 811 3.33333333333441e-02 811 767 -4.16666666666397e-03 811 768 7.37257477290143e-18 811 769 -1.30952380952435e-02 811 770 4.46428571428572e-03 811 771 -4.16666666666397e-03 811 808 -2.16840434497101e-18 811 809 4.76190476189937e-03 811 810 -1.21430643318376e-17 811 766 -4.46428571428571e-03 811 812 -3.03576608295941e-18 811 813 4.76190476189935e-03 811 850 4.46428571428572e-03 811 851 -4.16666666666397e-03 811 852 3.46944695195361e-18 811 853 -1.30952380952435e-02 811 854 -4.46428571428572e-03 811 855 -4.16666666666396e-03 812 812 1.17051282051320e+00 812 769 -4.46428571428571e-03 812 770 9.85347985346077e-02 812 771 4.53983516483518e-02 812 772 -2.88461538461352e-01 812 773 2.40384615384616e-01 812 810 -1.30952380952435e-02 812 811 -8.67361737988404e-19 812 768 -4.16666666666396e-03 812 813 -3.33066907387547e-16 812 814 -7.69230769231142e-01 812 815 -1.52655665885959e-16 812 852 -4.16666666666398e-03 812 853 4.46428571428572e-03 812 854 9.85347985346088e-02 812 855 -4.53983516483515e-02 812 856 -2.88461538461351e-01 812 857 -2.40384615384615e-01 813 813 1.17051282051320e+00 813 769 -4.16666666666397e-03 813 770 -4.53983516483515e-02 813 771 -3.91163003663195e-01 813 772 2.40384615384616e-01 813 773 -2.88461538461352e-01 813 810 -2.16840434497101e-18 813 811 4.76190476189935e-03 813 812 -3.60822483003176e-16 813 768 -4.46428571428571e-03 813 814 -1.45716771982052e-16 813 815 1.92307692307319e-01 813 852 4.46428571428572e-03 813 853 -4.16666666666396e-03 813 854 4.53983516483518e-02 813 855 -3.91163003663193e-01 813 856 -2.40384615384615e-01 813 857 -2.88461538461351e-01 814 814 2.30769230769306e+00 814 771 -2.40384615384615e-01 814 772 1.92307692307317e-01 814 773 4.09394740330526e-16 814 774 -2.88461538461352e-01 814 775 2.40384615384616e-01 814 812 -7.69230769231142e-01 814 813 -1.45716771982052e-16 814 770 -2.88461538461351e-01 814 815 -5.82867087928207e-16 814 816 -7.69230769231144e-01 814 817 -1.52655665885959e-16 814 854 -2.88461538461352e-01 814 855 2.40384615384615e-01 814 856 1.92307692307319e-01 814 857 2.08166817117217e-16 814 858 -2.88461538461352e-01 814 859 -2.40384615384615e-01 815 815 2.30769230769306e+00 815 771 -2.88461538461352e-01 815 772 3.67761376907083e-16 815 773 -7.69230769231145e-01 815 774 2.40384615384616e-01 815 775 -2.88461538461352e-01 815 812 -1.24900090270330e-16 815 813 1.92307692307319e-01 815 814 -6.10622663543836e-16 815 770 -2.40384615384615e-01 815 816 -1.17961196366423e-16 815 817 1.92307692307318e-01 815 854 2.40384615384615e-01 815 855 -2.88461538461351e-01 815 856 2.01227923213310e-16 815 857 -7.69230769231142e-01 815 858 -2.40384615384615e-01 815 859 -2.88461538461351e-01 816 816 2.30769230769306e+00 816 773 -2.40384615384615e-01 816 774 1.92307692307318e-01 816 775 3.88578058618805e-16 816 776 -2.88461538461352e-01 816 777 2.40384615384616e-01 816 814 -7.69230769231144e-01 816 815 -1.17961196366423e-16 816 772 -2.88461538461351e-01 816 817 -6.10622663543836e-16 816 818 -7.69230769231144e-01 816 819 -1.66533453693773e-16 816 856 -2.88461538461352e-01 816 857 2.40384615384615e-01 816 858 1.92307692307320e-01 816 859 1.80411241501588e-16 816 860 -2.88461538461352e-01 816 861 -2.40384615384615e-01 817 817 2.30769230769305e+00 817 773 -2.88461538461351e-01 817 774 3.88578058618805e-16 817 775 -7.69230769231144e-01 817 776 2.40384615384616e-01 817 777 -2.88461538461352e-01 817 814 -1.66533453693773e-16 817 815 1.92307692307318e-01 817 816 -6.10622663543836e-16 817 772 -2.40384615384615e-01 817 818 -1.04083408558608e-16 817 819 1.92307692307318e-01 817 856 2.40384615384615e-01 817 857 -2.88461538461351e-01 817 858 1.73472347597681e-16 817 859 -7.69230769231141e-01 817 860 -2.40384615384615e-01 817 861 -2.88461538461351e-01 818 818 2.30769230769306e+00 818 775 -2.40384615384615e-01 818 776 1.92307692307318e-01 818 777 4.02455846426619e-16 818 778 -2.88461538461352e-01 818 779 2.40384615384616e-01 818 816 -7.69230769231144e-01 818 817 -1.04083408558608e-16 818 774 -2.88461538461351e-01 818 819 -5.82867087928207e-16 818 820 -7.69230769231143e-01 818 821 -1.66533453693773e-16 818 858 -2.88461538461352e-01 818 859 2.40384615384615e-01 818 860 1.92307692307320e-01 818 861 2.08166817117217e-16 818 862 -2.88461538461351e-01 818 863 -2.40384615384615e-01 819 819 2.30769230769306e+00 819 775 -2.88461538461351e-01 819 776 3.88578058618805e-16 819 777 -7.69230769231144e-01 819 778 2.40384615384616e-01 819 779 -2.88461538461352e-01 819 816 -1.80411241501588e-16 819 817 1.92307692307318e-01 819 818 -5.82867087928207e-16 819 774 -2.40384615384615e-01 819 820 -1.04083408558608e-16 819 821 1.92307692307318e-01 819 858 2.40384615384615e-01 819 859 -2.88461538461351e-01 819 860 2.15105711021124e-16 819 861 -7.69230769231141e-01 819 862 -2.40384615384615e-01 819 863 -2.88461538461351e-01 820 820 2.30769230769305e+00 820 777 -2.40384615384615e-01 820 778 1.92307692307317e-01 820 779 3.95516952522712e-16 820 780 -2.88461538461351e-01 820 781 2.40384615384615e-01 820 818 -7.69230769231143e-01 820 819 -1.38777878078145e-16 820 776 -2.88461538461351e-01 820 821 -5.55111512312578e-16 820 822 -7.69230769231141e-01 820 823 -1.52655665885959e-16 820 860 -2.88461538461352e-01 820 861 2.40384615384615e-01 820 862 1.92307692307318e-01 820 863 1.94289029309402e-16 820 864 -2.88461538461351e-01 820 865 -2.40384615384615e-01 821 821 2.30769230769306e+00 821 777 -2.88461538461352e-01 821 778 3.74700270810990e-16 821 779 -7.69230769231146e-01 821 780 2.40384615384616e-01 821 781 -2.88461538461352e-01 821 818 -1.80411241501588e-16 821 819 1.92307692307318e-01 821 820 -4.71844785465692e-16 821 776 -2.40384615384615e-01 821 822 -1.52655665885959e-16 821 823 1.92307692307320e-01 821 860 2.40384615384615e-01 821 861 -2.88461538461351e-01 821 862 1.80411241501588e-16 821 863 -7.69230769231143e-01 821 864 -2.40384615384615e-01 821 865 -2.88461538461352e-01 822 822 2.30769230769305e+00 822 779 -2.40384615384615e-01 822 780 1.92307692307316e-01 822 781 4.02455846426619e-16 822 782 -2.88461538461352e-01 822 783 2.40384615384616e-01 822 820 -7.69230769231141e-01 822 821 -1.45716771982052e-16 822 778 -2.88461538461350e-01 822 823 -6.38378239159465e-16 822 824 -7.69230769231143e-01 822 825 -1.52655665885959e-16 822 862 -2.88461538461352e-01 822 863 2.40384615384615e-01 822 864 1.92307692307318e-01 822 865 2.01227923213310e-16 822 866 -2.88461538461351e-01 822 867 -2.40384615384615e-01 823 823 2.30769230769306e+00 823 779 -2.88461538461352e-01 823 780 3.95516952522712e-16 823 781 -7.69230769231146e-01 823 782 2.40384615384616e-01 823 783 -2.88461538461352e-01 823 820 -1.59594559789866e-16 823 821 1.92307692307320e-01 823 822 -6.38378239159465e-16 823 778 -2.40384615384615e-01 823 824 -9.02056207507940e-17 823 825 1.92307692307318e-01 823 862 2.40384615384615e-01 823 863 -2.88461538461352e-01 823 864 1.66533453693773e-16 823 865 -7.69230769231143e-01 823 866 -2.40384615384615e-01 823 867 -2.88461538461351e-01 824 824 2.30769230769306e+00 824 781 -2.40384615384615e-01 824 782 1.92307692307318e-01 824 783 4.23272528138341e-16 824 784 -2.88461538461352e-01 824 785 2.40384615384616e-01 824 822 -7.69230769231143e-01 824 823 -1.38777878078145e-16 824 780 -2.88461538461351e-01 824 825 -6.38378239159465e-16 824 826 -7.69230769231144e-01 824 827 -1.66533453693773e-16 824 864 -2.88461538461352e-01 824 865 2.40384615384615e-01 824 866 1.92307692307320e-01 824 867 2.01227923213310e-16 824 868 -2.88461538461352e-01 824 869 -2.40384615384615e-01 825 825 2.30769230769306e+00 825 781 -2.88461538461352e-01 825 782 3.88578058618805e-16 825 783 -7.69230769231144e-01 825 784 2.40384615384616e-01 825 785 -2.88461538461352e-01 825 822 -1.66533453693773e-16 825 823 1.92307692307318e-01 825 824 -6.10622663543836e-16 825 780 -2.40384615384615e-01 825 826 -1.04083408558608e-16 825 827 1.92307692307318e-01 825 864 2.40384615384615e-01 825 865 -2.88461538461351e-01 825 866 2.15105711021124e-16 825 867 -7.69230769231141e-01 825 868 -2.40384615384615e-01 825 869 -2.88461538461351e-01 826 826 2.30769230769306e+00 826 783 -2.40384615384615e-01 826 784 1.92307692307318e-01 826 785 3.88578058618805e-16 826 786 -2.88461538461352e-01 826 787 2.40384615384616e-01 826 824 -7.69230769231144e-01 826 825 -1.04083408558608e-16 826 782 -2.88461538461351e-01 826 827 -5.55111512312578e-16 826 828 -7.69230769231144e-01 826 829 -1.80411241501588e-16 826 866 -2.88461538461352e-01 826 867 2.40384615384615e-01 826 868 1.92307692307320e-01 826 869 2.08166817117217e-16 826 870 -2.88461538461352e-01 826 871 -2.40384615384615e-01 827 827 2.30769230769305e+00 827 783 -2.88461538461351e-01 827 784 3.81639164714898e-16 827 785 -7.69230769231144e-01 827 786 2.40384615384616e-01 827 787 -2.88461538461352e-01 827 824 -1.80411241501588e-16 827 825 1.92307692307318e-01 827 826 -6.38378239159465e-16 827 782 -2.40384615384615e-01 827 828 -1.04083408558608e-16 827 829 1.92307692307318e-01 827 866 2.40384615384615e-01 827 867 -2.88461538461351e-01 827 868 1.73472347597681e-16 827 869 -7.69230769231141e-01 827 870 -2.40384615384615e-01 827 871 -2.88461538461351e-01 828 828 1.15384717236505e+00 828 785 -2.40384615384615e-01 828 786 9.61538924499556e-02 828 787 -4.80769577991451e-02 828 788 -2.54629629629465e-07 828 789 1.73611111111111e-07 828 826 -7.69230769231144e-01 828 827 -1.04083408558608e-16 828 784 -2.88461538461351e-01 828 829 -2.37059825632110e-16 828 830 -6.01851851852181e-07 828 831 -1.19114008207636e-22 828 868 -2.88461538461352e-01 828 869 2.40384615384615e-01 828 870 9.61538924499564e-02 828 871 4.80769577991454e-02 828 872 -2.54629629629464e-07 828 873 -1.73611111111111e-07 829 829 1.15384717236505e+00 829 785 -2.88461538461351e-01 829 786 4.80769577991455e-02 829 787 -3.84615685541497e-01 829 788 1.73611111111111e-07 829 789 -2.54629629629465e-07 829 826 -1.66533453693773e-16 829 827 1.92307692307318e-01 829 828 -2.37059825632110e-16 829 784 -2.40384615384615e-01 829 830 -1.05879118406788e-22 829 831 9.25925925922633e-08 829 868 2.40384615384615e-01 829 869 -2.88461538461351e-01 829 870 -4.80769577991452e-02 829 871 -3.84615685541496e-01 829 872 -1.73611111111111e-07 829 873 -2.54629629629465e-07 830 830 2.03703703703770e-06 830 787 -1.73611111111111e-07 830 788 9.25925925922614e-08 830 789 3.04402465419514e-22 830 790 -2.54629629629465e-07 830 791 1.73611111111111e-07 830 828 -6.01851851852181e-07 830 829 -9.26442286059391e-23 830 786 -2.54629629629464e-07 830 831 -4.49986253228847e-22 830 832 -6.01851851852183e-07 830 833 -9.92616735063633e-23 830 870 -2.54629629629465e-07 830 871 1.73611111111111e-07 830 872 9.25925925922633e-08 830 873 1.58818677610181e-22 830 874 -2.54629629629465e-07 830 875 -1.73611111111111e-07 831 831 2.03703703703770e-06 831 787 -2.54629629629465e-07 831 788 2.97785020519090e-22 831 789 -6.01851851852184e-07 831 790 1.73611111111111e-07 831 791 -2.54629629629465e-07 831 828 -1.32348898008484e-22 831 829 9.25925925922633e-08 831 830 -4.23516473627150e-22 831 786 -1.73611111111111e-07 831 832 -1.12496563307212e-22 831 833 9.25925925922623e-08 831 870 1.73611111111111e-07 831 871 -2.54629629629465e-07 831 872 1.45583787809333e-22 831 873 -6.01851851852181e-07 831 874 -1.73611111111111e-07 831 875 -2.54629629629464e-07 832 832 2.03703703703770e-06 832 789 -1.73611111111111e-07 832 790 9.25925925922628e-08 832 791 2.71315240917393e-22 832 792 -2.54629629629465e-07 832 793 1.73611111111111e-07 832 830 -6.01851851852183e-07 832 831 -9.26442286059391e-23 832 788 -2.54629629629464e-07 832 833 -4.23516473627150e-22 832 834 -6.01851851852185e-07 832 835 -9.92616735063633e-23 832 872 -2.54629629629465e-07 832 873 1.73611111111111e-07 832 874 9.25925925922646e-08 832 875 1.32348898008484e-22 832 876 -2.54629629629465e-07 832 877 -1.73611111111111e-07 833 833 2.03703703703770e-06 833 789 -2.54629629629465e-07 833 790 2.91167575618666e-22 833 791 -6.01851851852182e-07 833 792 1.73611111111111e-07 833 793 -2.54629629629465e-07 833 830 -1.19114008207636e-22 833 831 9.25925925922623e-08 833 832 -3.97046694025453e-22 833 788 -1.73611111111111e-07 833 834 -7.27918939046664e-23 833 835 9.25925925922605e-08 833 872 1.73611111111111e-07 833 873 -2.54629629629464e-07 833 874 1.25731453108060e-22 833 875 -6.01851851852179e-07 833 876 -1.73611111111111e-07 833 877 -2.54629629629464e-07 834 834 2.03703703703770e-06 834 791 -1.73611111111111e-07 834 792 9.25925925922622e-08 834 793 2.84550130718242e-22 834 794 -2.54629629629465e-07 834 795 1.73611111111111e-07 834 832 -6.01851851852185e-07 834 833 -9.92616735063633e-23 834 790 -2.54629629629464e-07 834 835 -4.49986253228847e-22 834 836 -6.01851851852181e-07 834 837 -9.26442286059391e-23 834 874 -2.54629629629465e-07 834 875 1.73611111111111e-07 834 876 9.25925925922639e-08 834 877 1.52201232709757e-22 834 878 -2.54629629629464e-07 834 879 -1.73611111111111e-07 835 835 2.03703703703770e-06 835 791 -2.54629629629464e-07 835 792 2.97785020519090e-22 835 793 -6.01851851852183e-07 835 794 1.73611111111111e-07 835 795 -2.54629629629465e-07 835 832 -1.19114008207636e-22 835 833 9.25925925922605e-08 835 834 -4.76456032830544e-22 835 790 -1.73611111111111e-07 835 836 -1.12496563307212e-22 835 837 9.25925925922636e-08 835 874 1.73611111111111e-07 835 875 -2.54629629629464e-07 835 876 1.58818677610181e-22 835 877 -6.01851851852180e-07 835 878 -1.73611111111111e-07 835 879 -2.54629629629465e-07 836 836 2.03703703703770e-06 836 793 -1.73611111111111e-07 836 794 9.25925925922607e-08 836 795 2.91167575618666e-22 836 796 -2.54629629629465e-07 836 797 1.73611111111111e-07 836 834 -6.01851851852181e-07 836 835 -1.12496563307212e-22 836 792 -2.54629629629464e-07 836 837 -4.76456032830544e-22 836 838 -6.01851851852181e-07 836 839 -1.19114008207636e-22 836 876 -2.54629629629465e-07 836 877 1.73611111111111e-07 836 878 9.25925925922626e-08 836 879 1.32348898008484e-22 836 880 -2.54629629629464e-07 836 881 -1.73611111111111e-07 837 837 2.03703703703770e-06 837 793 -2.54629629629465e-07 837 794 3.04402465419514e-22 837 795 -6.01851851852185e-07 837 796 1.73611111111111e-07 837 797 -2.54629629629465e-07 837 834 -1.19114008207636e-22 837 835 9.25925925922637e-08 837 836 -5.29395592033938e-22 837 792 -1.73611111111111e-07 837 838 -1.05879118406788e-22 837 839 9.25925925922633e-08 837 876 1.73611111111111e-07 837 877 -2.54629629629465e-07 837 878 1.32348898008484e-22 837 879 -6.01851851852182e-07 837 880 -1.73611111111111e-07 837 881 -2.54629629629465e-07 838 838 2.03703703703770e-06 838 795 -1.73611111111111e-07 838 796 9.25925925922618e-08 838 797 3.04402465419514e-22 838 836 -6.01851851852181e-07 838 837 -9.26442286059391e-23 838 794 -2.54629629629464e-07 838 839 -4.49986253228847e-22 838 878 -2.54629629629465e-07 838 879 1.73611111111111e-07 838 880 9.25925925922636e-08 838 881 1.72053567411030e-22 839 839 2.03703703703770e-06 839 795 -2.54629629629465e-07 839 796 3.04402465419514e-22 839 797 -6.01851851852183e-07 839 836 -1.32348898008484e-22 839 837 9.25925925922633e-08 839 838 -4.23516473627150e-22 839 794 -1.73611111111111e-07 839 878 1.73611111111111e-07 839 879 -2.54629629629465e-07 839 880 1.52201232709757e-22 839 881 -6.01851851852181e-07 840 840 3.33333333333442e-02 840 799 3.46944695195361e-18 840 800 -4.16666666666398e-03 840 801 4.46428571428572e-03 840 798 4.76190476189938e-03 840 841 -9.54097911787244e-18 840 842 -1.30952380952435e-02 840 843 -1.73472347597681e-18 840 882 4.76190476189937e-03 840 883 5.20417042793042e-18 840 884 -4.16666666666397e-03 840 885 -4.46428571428572e-03 841 841 3.33333333333441e-02 841 799 -1.30952380952435e-02 841 800 4.46428571428572e-03 841 801 -4.16666666666396e-03 841 840 -8.67361737988404e-18 841 798 3.90312782094782e-18 841 842 0.00000000000000e+00 841 843 4.76190476189935e-03 841 882 2.60208521396521e-18 841 883 -1.30952380952435e-02 841 884 -4.46428571428571e-03 841 885 -4.16666666666396e-03 842 842 3.33333333333442e-02 842 799 -4.46428571428572e-03 842 800 4.76190476189938e-03 842 801 3.46944695195361e-18 842 802 -4.16666666666398e-03 842 803 4.46428571428572e-03 842 840 -1.30952380952435e-02 842 841 -4.33680868994202e-19 842 798 -4.16666666666397e-03 842 843 -9.54097911787244e-18 842 844 -1.30952380952435e-02 842 845 -1.73472347597681e-18 842 882 -4.16666666666397e-03 842 883 4.46428571428572e-03 842 884 4.76190476189937e-03 842 885 5.20417042793042e-18 842 886 -4.16666666666397e-03 842 887 -4.46428571428572e-03 843 843 3.33333333333441e-02 843 799 -4.16666666666396e-03 843 800 3.90312782094782e-18 843 801 -1.30952380952435e-02 843 802 4.46428571428572e-03 843 803 -4.16666666666396e-03 843 840 -1.73472347597681e-18 843 841 4.76190476189935e-03 843 842 -8.67361737988404e-18 843 798 -4.46428571428572e-03 843 844 0.00000000000000e+00 843 845 4.76190476189935e-03 843 882 4.46428571428572e-03 843 883 -4.16666666666396e-03 843 884 2.60208521396521e-18 843 885 -1.30952380952435e-02 843 886 -4.46428571428571e-03 843 887 -4.16666666666396e-03 844 844 3.33333333333442e-02 844 801 -4.46428571428572e-03 844 802 4.76190476189938e-03 844 803 3.03576608295941e-18 844 804 -4.16666666666397e-03 844 805 4.46428571428572e-03 844 842 -1.30952380952435e-02 844 843 -4.33680868994202e-19 844 800 -4.16666666666397e-03 844 845 -8.67361737988404e-18 844 846 -1.30952380952435e-02 844 847 -1.73472347597681e-18 844 884 -4.16666666666397e-03 844 885 4.46428571428572e-03 844 886 4.76190476189937e-03 844 887 5.20417042793042e-18 844 888 -4.16666666666397e-03 844 889 -4.46428571428571e-03 845 845 3.33333333333441e-02 845 801 -4.16666666666396e-03 845 802 4.77048955893622e-18 845 803 -1.30952380952435e-02 845 804 4.46428571428572e-03 845 805 -4.16666666666396e-03 845 842 -1.73472347597681e-18 845 843 4.76190476189935e-03 845 844 -7.80625564189563e-18 845 800 -4.46428571428572e-03 845 846 -4.33680868994202e-19 845 847 4.76190476189935e-03 845 884 4.46428571428572e-03 845 885 -4.16666666666396e-03 845 886 2.60208521396521e-18 845 887 -1.30952380952435e-02 845 888 -4.46428571428571e-03 845 889 -4.16666666666396e-03 846 846 3.33333333333442e-02 846 803 -4.46428571428571e-03 846 804 4.76190476189937e-03 846 805 3.90312782094782e-18 846 806 -4.16666666666397e-03 846 807 4.46428571428572e-03 846 844 -1.30952380952435e-02 846 845 -1.73472347597681e-18 846 802 -4.16666666666397e-03 846 847 -9.54097911787244e-18 846 848 -1.30952380952435e-02 846 849 -1.73472347597681e-18 846 886 -4.16666666666397e-03 846 887 4.46428571428572e-03 846 888 4.76190476189937e-03 846 889 4.77048955893622e-18 846 890 -4.16666666666397e-03 846 891 -4.46428571428571e-03 847 847 3.33333333333441e-02 847 803 -4.16666666666396e-03 847 804 4.33680868994202e-18 847 805 -1.30952380952435e-02 847 806 4.46428571428572e-03 847 807 -4.16666666666396e-03 847 844 -1.73472347597681e-18 847 845 4.76190476189935e-03 847 846 -9.54097911787244e-18 847 802 -4.46428571428572e-03 847 848 -4.33680868994202e-19 847 849 4.76190476189936e-03 847 886 4.46428571428572e-03 847 887 -4.16666666666397e-03 847 888 3.03576608295941e-18 847 889 -1.30952380952435e-02 847 890 -4.46428571428571e-03 847 891 -4.16666666666397e-03 848 848 3.33333333333442e-02 848 805 -4.46428571428571e-03 848 806 4.76190476189938e-03 848 807 3.90312782094782e-18 848 808 -4.16666666666398e-03 848 809 4.46428571428572e-03 848 846 -1.30952380952435e-02 848 847 -1.73472347597681e-18 848 804 -4.16666666666397e-03 848 849 -9.54097911787244e-18 848 850 -1.30952380952435e-02 848 851 -1.73472347597681e-18 848 888 -4.16666666666397e-03 848 889 4.46428571428572e-03 848 890 4.76190476189937e-03 848 891 3.46944695195361e-18 848 892 -4.16666666666397e-03 848 893 -4.46428571428572e-03 849 849 3.33333333333441e-02 849 805 -4.16666666666396e-03 849 806 3.46944695195361e-18 849 807 -1.30952380952435e-02 849 808 4.46428571428572e-03 849 809 -4.16666666666396e-03 849 846 -1.73472347597681e-18 849 847 4.76190476189936e-03 849 848 -8.67361737988404e-18 849 804 -4.46428571428572e-03 849 850 -1.30104260698261e-18 849 851 4.76190476189935e-03 849 888 4.46428571428572e-03 849 889 -4.16666666666397e-03 849 890 3.46944695195361e-18 849 891 -1.30952380952435e-02 849 892 -4.46428571428572e-03 849 893 -4.16666666666396e-03 850 850 3.33333333333442e-02 850 807 -4.46428571428572e-03 850 808 4.76190476189937e-03 850 809 3.90312782094782e-18 850 810 -4.16666666666397e-03 850 811 4.46428571428572e-03 850 848 -1.30952380952435e-02 850 849 -2.16840434497101e-18 850 806 -4.16666666666397e-03 850 851 -9.54097911787244e-18 850 852 -1.30952380952435e-02 850 853 -1.73472347597681e-18 850 890 -4.16666666666397e-03 850 891 4.46428571428572e-03 850 892 4.76190476189937e-03 850 893 3.90312782094782e-18 850 894 -4.16666666666396e-03 850 895 -4.46428571428572e-03 851 851 3.33333333333441e-02 851 807 -4.16666666666396e-03 851 808 3.90312782094782e-18 851 809 -1.30952380952435e-02 851 810 4.46428571428572e-03 851 811 -4.16666666666397e-03 851 848 -1.73472347597681e-18 851 849 4.76190476189935e-03 851 850 -8.67361737988404e-18 851 806 -4.46428571428572e-03 851 852 -2.16840434497101e-18 851 853 4.76190476189936e-03 851 890 4.46428571428572e-03 851 891 -4.16666666666396e-03 851 892 2.60208521396521e-18 851 893 -1.30952380952435e-02 851 894 -4.46428571428572e-03 851 895 -4.16666666666397e-03 852 852 3.33333333333442e-02 852 809 -4.46428571428572e-03 852 810 4.76190476189938e-03 852 811 3.46944695195361e-18 852 812 -4.16666666666398e-03 852 813 4.46428571428572e-03 852 850 -1.30952380952435e-02 852 851 -2.16840434497101e-18 852 808 -4.16666666666397e-03 852 853 -8.67361737988404e-18 852 854 -1.30952380952435e-02 852 855 -1.73472347597681e-18 852 892 -4.16666666666397e-03 852 893 4.46428571428572e-03 852 894 4.76190476189937e-03 852 895 4.77048955893622e-18 852 896 -4.16666666666397e-03 852 897 -4.46428571428571e-03 853 853 3.33333333333441e-02 853 809 -4.16666666666397e-03 853 810 3.46944695195361e-18 853 811 -1.30952380952435e-02 853 812 4.46428571428572e-03 853 813 -4.16666666666396e-03 853 850 -1.73472347597681e-18 853 851 4.76190476189936e-03 853 852 -8.67361737988404e-18 853 808 -4.46428571428572e-03 853 854 -8.67361737988404e-19 853 855 4.76190476189934e-03 853 892 4.46428571428572e-03 853 893 -4.16666666666397e-03 853 894 3.03576608295941e-18 853 895 -1.30952380952435e-02 853 896 -4.46428571428571e-03 853 897 -4.16666666666396e-03 854 854 1.17051282051320e+00 854 811 -4.46428571428571e-03 854 812 9.85347985346089e-02 854 813 4.53983516483518e-02 854 814 -2.88461538461352e-01 854 815 2.40384615384615e-01 854 852 -1.30952380952435e-02 854 853 -8.67361737988404e-19 854 810 -4.16666666666397e-03 854 855 -1.94289029309402e-16 854 856 -7.69230769231143e-01 854 857 -1.17961196366423e-16 854 894 -4.16666666666398e-03 854 895 4.46428571428572e-03 854 896 9.85347985346085e-02 854 897 -4.53983516483515e-02 854 898 -2.88461538461351e-01 854 899 -2.40384615384615e-01 855 855 1.17051282051320e+00 855 811 -4.16666666666396e-03 855 812 -4.53983516483516e-02 855 813 -3.91163003663193e-01 855 814 2.40384615384615e-01 855 815 -2.88461538461352e-01 855 852 -1.73472347597681e-18 855 853 4.76190476189934e-03 855 854 -2.22044604925031e-16 855 810 -4.46428571428572e-03 855 856 -7.63278329429795e-17 855 857 1.92307692307318e-01 855 894 4.46428571428572e-03 855 895 -4.16666666666396e-03 855 896 4.53983516483517e-02 855 897 -3.91163003663194e-01 855 898 -2.40384615384615e-01 855 899 -2.88461538461352e-01 856 856 2.30769230769306e+00 856 813 -2.40384615384615e-01 856 814 1.92307692307319e-01 856 815 2.15105711021124e-16 856 816 -2.88461538461352e-01 856 817 2.40384615384615e-01 856 854 -7.69230769231143e-01 856 855 -6.24500451351651e-17 856 812 -2.88461538461351e-01 856 857 -3.60822483003176e-16 856 858 -7.69230769231145e-01 856 859 -1.24900090270330e-16 856 896 -2.88461538461352e-01 856 897 2.40384615384615e-01 856 898 1.92307692307319e-01 856 899 2.15105711021124e-16 856 900 -2.88461538461352e-01 856 901 -2.40384615384615e-01 857 857 2.30769230769305e+00 857 813 -2.88461538461351e-01 857 814 2.22044604925031e-16 857 815 -7.69230769231142e-01 857 816 2.40384615384615e-01 857 817 -2.88461538461351e-01 857 854 -1.04083408558608e-16 857 855 1.92307692307318e-01 857 856 -3.88578058618805e-16 857 812 -2.40384615384615e-01 857 858 -4.85722573273506e-17 857 859 1.92307692307317e-01 857 896 2.40384615384615e-01 857 897 -2.88461538461352e-01 857 898 1.87350135405495e-16 857 899 -7.69230769231143e-01 857 900 -2.40384615384615e-01 857 901 -2.88461538461351e-01 858 858 2.30769230769306e+00 858 815 -2.40384615384615e-01 858 816 1.92307692307320e-01 858 817 1.59594559789866e-16 858 818 -2.88461538461352e-01 858 819 2.40384615384615e-01 858 856 -7.69230769231145e-01 858 857 -3.46944695195361e-17 858 814 -2.88461538461352e-01 858 859 -3.33066907387547e-16 858 860 -7.69230769231145e-01 858 861 -1.31838984174237e-16 858 898 -2.88461538461352e-01 858 899 2.40384615384615e-01 858 900 1.92307692307319e-01 858 901 2.08166817117217e-16 858 902 -2.88461538461352e-01 858 903 -2.40384615384615e-01 859 859 2.30769230769305e+00 859 815 -2.88461538461351e-01 859 816 1.94289029309402e-16 859 817 -7.69230769231141e-01 859 818 2.40384615384615e-01 859 819 -2.88461538461351e-01 859 856 -1.24900090270330e-16 859 857 1.92307692307317e-01 859 858 -3.33066907387547e-16 859 814 -2.40384615384615e-01 859 860 -4.85722573273506e-17 859 861 1.92307692307317e-01 859 898 2.40384615384615e-01 859 899 -2.88461538461351e-01 859 900 2.01227923213310e-16 859 901 -7.69230769231142e-01 859 902 -2.40384615384615e-01 859 903 -2.88461538461351e-01 860 860 2.30769230769306e+00 860 817 -2.40384615384615e-01 860 818 1.92307692307320e-01 860 819 2.28983498828939e-16 860 820 -2.88461538461352e-01 860 821 2.40384615384615e-01 860 858 -7.69230769231145e-01 860 859 -4.85722573273506e-17 860 816 -2.88461538461352e-01 860 861 -4.44089209850063e-16 860 862 -7.69230769231144e-01 860 863 -1.04083408558608e-16 860 900 -2.88461538461352e-01 860 901 2.40384615384615e-01 860 902 1.92307692307319e-01 860 903 2.22044604925031e-16 860 904 -2.88461538461351e-01 860 905 -2.40384615384615e-01 861 861 2.30769230769305e+00 861 817 -2.88461538461351e-01 861 818 2.28983498828939e-16 861 819 -7.69230769231141e-01 861 820 2.40384615384615e-01 861 821 -2.88461538461351e-01 861 858 -1.17961196366423e-16 861 859 1.92307692307317e-01 861 860 -4.16333634234434e-16 861 816 -2.40384615384615e-01 861 862 -6.24500451351651e-17 861 863 1.92307692307318e-01 861 900 2.40384615384615e-01 861 901 -2.88461538461351e-01 861 902 1.73472347597681e-16 861 903 -7.69230769231142e-01 861 904 -2.40384615384615e-01 861 905 -2.88461538461351e-01 862 862 2.30769230769306e+00 862 819 -2.40384615384615e-01 862 820 1.92307692307318e-01 862 821 1.87350135405495e-16 862 822 -2.88461538461352e-01 862 823 2.40384615384615e-01 862 860 -7.69230769231144e-01 862 861 -6.93889390390723e-17 862 818 -2.88461538461352e-01 862 863 -3.88578058618805e-16 862 864 -7.69230769231142e-01 862 865 -9.71445146547012e-17 862 902 -2.88461538461352e-01 862 903 2.40384615384615e-01 862 904 1.92307692307318e-01 862 905 1.66533453693773e-16 862 906 -2.88461538461351e-01 862 907 -2.40384615384615e-01 863 863 2.30769230769306e+00 863 819 -2.88461538461351e-01 863 820 1.38777878078145e-16 863 821 -7.69230769231143e-01 863 822 2.40384615384615e-01 863 823 -2.88461538461352e-01 863 860 -9.71445146547012e-17 863 861 1.92307692307318e-01 863 862 -3.33066907387547e-16 863 818 -2.40384615384615e-01 863 864 -1.04083408558608e-16 863 865 1.92307692307319e-01 863 902 2.40384615384615e-01 863 903 -2.88461538461351e-01 863 904 1.94289029309402e-16 863 905 -7.69230769231144e-01 863 906 -2.40384615384615e-01 863 907 -2.88461538461352e-01 864 864 2.30769230769306e+00 864 821 -2.40384615384615e-01 864 822 1.92307692307318e-01 864 823 1.73472347597681e-16 864 824 -2.88461538461352e-01 864 825 2.40384615384615e-01 864 862 -7.69230769231142e-01 864 863 -9.71445146547012e-17 864 820 -2.88461538461351e-01 864 865 -3.60822483003176e-16 864 866 -7.69230769231144e-01 864 867 -1.11022302462516e-16 864 904 -2.88461538461351e-01 864 905 2.40384615384615e-01 864 906 1.92307692307318e-01 864 907 2.15105711021124e-16 864 908 -2.88461538461351e-01 864 909 -2.40384615384615e-01 865 865 2.30769230769306e+00 865 821 -2.88461538461352e-01 865 822 2.42861286636753e-16 865 823 -7.69230769231143e-01 865 824 2.40384615384615e-01 865 825 -2.88461538461351e-01 865 862 -9.71445146547012e-17 865 863 1.92307692307319e-01 865 864 -3.60822483003176e-16 865 820 -2.40384615384615e-01 865 866 -6.24500451351651e-17 865 867 1.92307692307318e-01 865 904 2.40384615384615e-01 865 905 -2.88461538461352e-01 865 906 1.66533453693773e-16 865 907 -7.69230769231144e-01 865 908 -2.40384615384615e-01 865 909 -2.88461538461351e-01 866 866 2.30769230769306e+00 866 823 -2.40384615384615e-01 866 824 1.92307692307320e-01 866 825 1.73472347597681e-16 866 826 -2.88461538461352e-01 866 827 2.40384615384615e-01 866 864 -7.69230769231144e-01 866 865 -6.93889390390723e-17 866 822 -2.88461538461351e-01 866 867 -3.88578058618805e-16 866 868 -7.69230769231145e-01 866 869 -1.31838984174237e-16 866 906 -2.88461538461352e-01 866 907 2.40384615384615e-01 866 908 1.92307692307319e-01 866 909 2.15105711021124e-16 866 910 -2.88461538461352e-01 866 911 -2.40384615384615e-01 867 867 2.30769230769305e+00 867 823 -2.88461538461351e-01 867 824 1.94289029309402e-16 867 825 -7.69230769231141e-01 867 826 2.40384615384615e-01 867 827 -2.88461538461351e-01 867 864 -9.02056207507940e-17 867 865 1.92307692307318e-01 867 866 -3.33066907387547e-16 867 822 -2.40384615384615e-01 867 868 -4.85722573273506e-17 867 869 1.92307692307317e-01 867 906 2.40384615384615e-01 867 907 -2.88461538461351e-01 867 908 2.15105711021124e-16 867 909 -7.69230769231142e-01 867 910 -2.40384615384615e-01 867 911 -2.88461538461351e-01 868 868 2.30769230769306e+00 868 825 -2.40384615384615e-01 868 826 1.92307692307320e-01 868 827 1.73472347597681e-16 868 828 -2.88461538461352e-01 868 829 2.40384615384615e-01 868 866 -7.69230769231145e-01 868 867 -4.85722573273506e-17 868 824 -2.88461538461352e-01 868 869 -3.60822483003176e-16 868 870 -7.69230769231145e-01 868 871 -1.11022302462516e-16 868 908 -2.88461538461352e-01 868 909 2.40384615384615e-01 868 910 1.92307692307319e-01 868 911 2.35922392732846e-16 868 912 -2.88461538461352e-01 868 913 -2.40384615384615e-01 869 869 2.30769230769305e+00 869 825 -2.88461538461351e-01 869 826 2.22044604925031e-16 869 827 -7.69230769231141e-01 869 828 2.40384615384615e-01 869 829 -2.88461538461351e-01 869 866 -1.17961196366423e-16 869 867 1.92307692307317e-01 869 868 -3.88578058618805e-16 869 824 -2.40384615384615e-01 869 870 -6.24500451351651e-17 869 871 1.92307692307317e-01 869 908 2.40384615384615e-01 869 909 -2.88461538461351e-01 869 910 1.73472347597681e-16 869 911 -7.69230769231141e-01 869 912 -2.40384615384615e-01 869 913 -2.88461538461351e-01 870 870 1.15384717236505e+00 870 827 -2.40384615384615e-01 870 828 9.61538924499564e-02 870 829 -4.80769577991452e-02 870 830 -2.54629629629465e-07 870 831 1.73611111111111e-07 870 868 -7.69230769231145e-01 870 869 -6.24500451351651e-17 870 826 -2.88461538461352e-01 870 871 -1.26037470230035e-16 870 872 -6.01851851852182e-07 870 873 -7.94093388050907e-23 870 910 -2.88461538461352e-01 870 911 2.40384615384615e-01 870 912 9.61538924499563e-02 870 913 4.80769577991454e-02 870 914 -2.54629629629464e-07 870 915 -1.73611111111111e-07 871 871 1.15384717236504e+00 871 827 -2.88461538461351e-01 871 828 4.80769577991454e-02 871 829 -3.84615685541496e-01 871 830 1.73611111111111e-07 871 831 -2.54629629629465e-07 871 868 -1.17961196366423e-16 871 869 1.92307692307317e-01 871 870 -1.26037523169595e-16 871 826 -2.40384615384615e-01 871 872 -6.61744490042422e-23 871 873 9.25925925922625e-08 871 910 2.40384615384615e-01 871 911 -2.88461538461351e-01 871 912 -4.80769577991452e-02 871 913 -3.84615685541496e-01 871 914 -1.73611111111111e-07 871 915 -2.54629629629465e-07 872 872 2.03703703703770e-06 872 829 -1.73611111111111e-07 872 830 9.25925925922633e-08 872 831 1.45583787809333e-22 872 832 -2.54629629629465e-07 872 833 1.73611111111111e-07 872 870 -6.01851851852182e-07 872 871 -6.61744490042422e-23 872 828 -2.54629629629464e-07 872 873 -2.64697796016969e-22 872 874 -6.01851851852183e-07 872 875 -6.61744490042422e-23 872 912 -2.54629629629465e-07 872 913 1.73611111111111e-07 872 914 9.25925925922629e-08 872 915 1.45583787809333e-22 872 916 -2.54629629629465e-07 872 917 -1.73611111111111e-07 873 873 2.03703703703770e-06 873 829 -2.54629629629465e-07 873 830 1.58818677610181e-22 873 831 -6.01851851852181e-07 873 832 1.73611111111111e-07 873 833 -2.54629629629464e-07 873 870 -6.61744490042422e-23 873 871 9.25925925922626e-08 873 872 -3.17637355220363e-22 873 828 -1.73611111111111e-07 873 874 -7.27918939046664e-23 873 875 9.25925925922615e-08 873 912 1.73611111111111e-07 873 913 -2.54629629629465e-07 873 914 1.65436122510606e-22 873 915 -6.01851851852182e-07 873 916 -1.73611111111111e-07 873 917 -2.54629629629464e-07 874 874 2.03703703703770e-06 874 831 -1.73611111111111e-07 874 832 9.25925925922646e-08 874 833 1.52201232709757e-22 874 834 -2.54629629629465e-07 874 835 1.73611111111111e-07 874 872 -6.01851851852183e-07 874 873 -7.94093388050907e-23 874 830 -2.54629629629465e-07 874 875 -2.91167575618666e-22 874 876 -6.01851851852186e-07 874 877 -7.27918939046664e-23 874 914 -2.54629629629465e-07 874 915 1.73611111111111e-07 874 916 9.25925925922642e-08 874 917 1.45583787809333e-22 874 918 -2.54629629629465e-07 874 919 -1.73611111111111e-07 875 875 2.03703703703770e-06 875 831 -2.54629629629464e-07 875 832 1.58818677610181e-22 875 833 -6.01851851852179e-07 875 834 1.73611111111111e-07 875 835 -2.54629629629464e-07 875 872 -3.97046694025453e-23 875 873 9.25925925922616e-08 875 874 -2.91167575618666e-22 875 830 -1.73611111111111e-07 875 876 -5.29395592033938e-23 875 877 9.25925925922599e-08 875 914 1.73611111111111e-07 875 915 -2.54629629629465e-07 875 916 1.45583787809333e-22 875 917 -6.01851851852180e-07 875 918 -1.73611111111111e-07 875 919 -2.54629629629464e-07 876 876 2.03703703703770e-06 876 833 -1.73611111111111e-07 876 834 9.25925925922639e-08 876 835 1.38966342908909e-22 876 836 -2.54629629629465e-07 876 837 1.73611111111111e-07 876 874 -6.01851851852186e-07 876 875 -7.27918939046664e-23 876 832 -2.54629629629465e-07 876 877 -2.64697796016969e-22 876 878 -6.01851851852182e-07 876 879 -6.61744490042422e-23 876 916 -2.54629629629465e-07 876 917 1.73611111111111e-07 876 918 9.25925925922635e-08 876 919 1.52201232709757e-22 876 920 -2.54629629629464e-07 876 921 -1.73611111111111e-07 877 877 2.03703703703770e-06 877 833 -2.54629629629464e-07 877 834 1.52201232709757e-22 877 835 -6.01851851852180e-07 877 836 1.73611111111111e-07 877 837 -2.54629629629465e-07 877 874 -5.95570041038180e-23 877 875 9.25925925922598e-08 877 876 -3.17637355220363e-22 877 832 -1.73611111111111e-07 877 878 -7.27918939046664e-23 877 879 9.25925925922629e-08 877 916 1.73611111111111e-07 877 917 -2.54629629629464e-07 877 918 1.58818677610181e-22 877 919 -6.01851851852181e-07 877 920 -1.73611111111111e-07 877 921 -2.54629629629465e-07 878 878 2.03703703703770e-06 878 835 -1.73611111111111e-07 878 836 9.25925925922626e-08 878 837 1.52201232709757e-22 878 838 -2.54629629629465e-07 878 839 1.73611111111111e-07 878 876 -6.01851851852182e-07 878 877 -7.27918939046664e-23 878 834 -2.54629629629464e-07 878 879 -2.64697796016969e-22 878 880 -6.01851851852182e-07 878 881 -7.94093388050907e-23 878 918 -2.54629629629465e-07 878 919 1.73611111111111e-07 878 920 9.25925925922622e-08 878 921 1.32348898008484e-22 878 922 -2.54629629629464e-07 878 923 -1.73611111111111e-07 879 879 2.03703703703770e-06 879 835 -2.54629629629465e-07 879 836 1.72053567411030e-22 879 837 -6.01851851852182e-07 879 838 1.73611111111111e-07 879 839 -2.54629629629465e-07 879 876 -6.61744490042422e-23 879 877 9.25925925922629e-08 879 878 -3.17637355220363e-22 879 834 -1.73611111111111e-07 879 880 -6.61744490042422e-23 879 881 9.25925925922625e-08 879 918 1.73611111111111e-07 879 919 -2.54629629629465e-07 879 920 1.45583787809333e-22 879 921 -6.01851851852183e-07 879 922 -1.73611111111111e-07 879 923 -2.54629629629465e-07 880 880 2.03703703703770e-06 880 837 -1.73611111111111e-07 880 838 9.25925925922636e-08 880 839 1.58818677610181e-22 880 878 -6.01851851852182e-07 880 879 -6.61744490042422e-23 880 836 -2.54629629629464e-07 880 881 -2.64697796016969e-22 880 920 -2.54629629629465e-07 880 921 1.73611111111111e-07 880 922 9.25925925922633e-08 880 923 1.58818677610181e-22 881 881 2.03703703703770e-06 881 837 -2.54629629629465e-07 881 838 1.72053567411030e-22 881 839 -6.01851851852181e-07 881 878 -6.61744490042422e-23 881 879 9.25925925922626e-08 881 880 -3.44107134822060e-22 881 836 -1.73611111111111e-07 881 920 1.73611111111111e-07 881 921 -2.54629629629465e-07 881 922 1.72053567411030e-22 881 923 -6.01851851852181e-07 882 882 3.33333333333442e-02 882 841 2.60208521396521e-18 882 842 -4.16666666666397e-03 882 843 4.46428571428572e-03 882 840 4.76190476189937e-03 882 883 1.56125112837913e-17 882 884 -1.30952380952435e-02 882 885 3.03576608295941e-18 882 924 4.76190476189935e-03 882 925 -1.77809156287623e-17 882 926 -4.16666666666398e-03 882 927 -4.46428571428572e-03 883 883 3.33333333333442e-02 883 841 -1.30952380952435e-02 883 842 4.46428571428572e-03 883 843 -4.16666666666397e-03 883 882 1.64798730217797e-17 883 840 5.20417042793042e-18 883 884 2.16840434497101e-18 883 885 4.76190476189936e-03 883 924 -1.86482773667507e-17 883 925 -1.30952380952435e-02 883 926 -4.46428571428572e-03 883 927 -4.16666666666397e-03 884 884 3.33333333333442e-02 884 841 -4.46428571428571e-03 884 842 4.76190476189937e-03 884 843 2.60208521396521e-18 884 844 -4.16666666666397e-03 884 845 4.46428571428572e-03 884 882 -1.30952380952435e-02 884 883 1.30104260698261e-18 884 840 -4.16666666666397e-03 884 885 1.56125112837913e-17 884 886 -1.30952380952435e-02 884 887 3.03576608295941e-18 884 924 -4.16666666666395e-03 884 925 4.46428571428571e-03 884 926 4.76190476189935e-03 884 927 -1.77809156287623e-17 884 928 -4.16666666666398e-03 884 929 -4.46428571428572e-03 885 885 3.33333333333442e-02 885 841 -4.16666666666396e-03 885 842 5.20417042793042e-18 885 843 -1.30952380952435e-02 885 844 4.46428571428572e-03 885 845 -4.16666666666397e-03 885 882 2.60208521396521e-18 885 883 4.76190476189936e-03 885 884 1.64798730217797e-17 885 840 -4.46428571428572e-03 885 886 2.16840434497101e-18 885 887 4.76190476189936e-03 885 924 4.46428571428571e-03 885 925 -4.16666666666397e-03 885 926 -1.86482773667507e-17 885 927 -1.30952380952435e-02 885 928 -4.46428571428572e-03 885 929 -4.16666666666397e-03 886 886 3.33333333333441e-02 886 843 -4.46428571428571e-03 886 844 4.76190476189937e-03 886 845 2.60208521396521e-18 886 846 -4.16666666666397e-03 886 847 4.46428571428572e-03 886 884 -1.30952380952435e-02 886 885 1.30104260698261e-18 886 842 -4.16666666666397e-03 886 887 1.64798730217797e-17 886 888 -1.30952380952435e-02 886 889 3.46944695195361e-18 886 926 -4.16666666666395e-03 886 927 4.46428571428571e-03 886 928 4.76190476189935e-03 886 929 -1.77809156287623e-17 886 930 -4.16666666666398e-03 886 931 -4.46428571428572e-03 887 887 3.33333333333442e-02 887 843 -4.16666666666396e-03 887 844 5.20417042793042e-18 887 845 -1.30952380952435e-02 887 846 4.46428571428572e-03 887 847 -4.16666666666397e-03 887 884 2.60208521396521e-18 887 885 4.76190476189936e-03 887 886 1.64798730217797e-17 887 842 -4.46428571428572e-03 887 888 3.46944695195361e-18 887 889 4.76190476189937e-03 887 926 4.46428571428571e-03 887 927 -4.16666666666397e-03 887 928 -1.86482773667507e-17 887 929 -1.30952380952435e-02 887 930 -4.46428571428572e-03 887 931 -4.16666666666398e-03 888 888 3.33333333333441e-02 888 845 -4.46428571428571e-03 888 846 4.76190476189937e-03 888 847 3.46944695195361e-18 888 848 -4.16666666666397e-03 888 849 4.46428571428572e-03 888 886 -1.30952380952435e-02 888 887 2.16840434497101e-18 888 844 -4.16666666666397e-03 888 889 1.64798730217797e-17 888 890 -1.30952380952435e-02 888 891 3.46944695195361e-18 888 928 -4.16666666666395e-03 888 929 4.46428571428571e-03 888 930 4.76190476189935e-03 888 931 -1.82145964977565e-17 888 932 -4.16666666666398e-03 888 933 -4.46428571428572e-03 889 889 3.33333333333442e-02 889 845 -4.16666666666396e-03 889 846 5.20417042793042e-18 889 847 -1.30952380952435e-02 889 848 4.46428571428572e-03 889 849 -4.16666666666397e-03 889 886 3.03576608295941e-18 889 887 4.76190476189937e-03 889 888 1.56125112837913e-17 889 844 -4.46428571428572e-03 889 890 3.46944695195361e-18 889 891 4.76190476189937e-03 889 928 4.46428571428571e-03 889 929 -4.16666666666397e-03 889 930 -1.86482773667507e-17 889 931 -1.30952380952435e-02 889 932 -4.46428571428572e-03 889 933 -4.16666666666398e-03 890 890 3.33333333333441e-02 890 847 -4.46428571428571e-03 890 848 4.76190476189937e-03 890 849 3.03576608295941e-18 890 850 -4.16666666666397e-03 890 851 4.46428571428572e-03 890 888 -1.30952380952435e-02 890 889 2.60208521396521e-18 890 846 -4.16666666666397e-03 890 891 1.64798730217797e-17 890 892 -1.30952380952435e-02 890 893 3.03576608295941e-18 890 930 -4.16666666666395e-03 890 931 4.46428571428571e-03 890 932 4.76190476189935e-03 890 933 -1.82145964977565e-17 890 934 -4.16666666666398e-03 890 935 -4.46428571428572e-03 891 891 3.33333333333442e-02 891 847 -4.16666666666397e-03 891 848 3.90312782094782e-18 891 849 -1.30952380952435e-02 891 850 4.46428571428572e-03 891 851 -4.16666666666396e-03 891 888 3.03576608295941e-18 891 889 4.76190476189937e-03 891 890 1.38777878078145e-17 891 846 -4.46428571428572e-03 891 892 3.46944695195361e-18 891 893 4.76190476189936e-03 891 930 4.46428571428571e-03 891 931 -4.16666666666397e-03 891 932 -1.86482773667507e-17 891 933 -1.30952380952435e-02 891 934 -4.46428571428572e-03 891 935 -4.16666666666397e-03 892 892 3.33333333333441e-02 892 849 -4.46428571428571e-03 892 850 4.76190476189937e-03 892 851 3.03576608295941e-18 892 852 -4.16666666666397e-03 892 853 4.46428571428572e-03 892 890 -1.30952380952435e-02 892 891 2.60208521396521e-18 892 848 -4.16666666666397e-03 892 893 1.56125112837913e-17 892 894 -1.30952380952435e-02 892 895 3.46944695195361e-18 892 932 -4.16666666666395e-03 892 933 4.46428571428571e-03 892 934 4.76190476189935e-03 892 935 -1.82145964977565e-17 892 936 -4.16666666666398e-03 892 937 -4.46428571428572e-03 893 893 3.33333333333442e-02 893 849 -4.16666666666396e-03 893 850 3.90312782094782e-18 893 851 -1.30952380952435e-02 893 852 4.46428571428572e-03 893 853 -4.16666666666397e-03 893 890 2.16840434497101e-18 893 891 4.76190476189936e-03 893 892 1.47451495458029e-17 893 848 -4.46428571428572e-03 893 894 3.03576608295941e-18 893 895 4.76190476189937e-03 893 932 4.46428571428571e-03 893 933 -4.16666666666397e-03 893 934 -1.82145964977565e-17 893 935 -1.30952380952435e-02 893 936 -4.46428571428572e-03 893 937 -4.16666666666398e-03 894 894 3.33333333333441e-02 894 851 -4.46428571428572e-03 894 852 4.76190476189937e-03 894 853 2.60208521396521e-18 894 854 -4.16666666666398e-03 894 855 4.46428571428572e-03 894 892 -1.30952380952435e-02 894 893 2.60208521396521e-18 894 850 -4.16666666666396e-03 894 895 1.64798730217797e-17 894 896 -1.30952380952435e-02 894 897 3.46944695195361e-18 894 934 -4.16666666666394e-03 894 935 4.46428571428571e-03 894 936 4.76190476189935e-03 894 937 -1.82145964977565e-17 894 938 -4.16666666666398e-03 894 939 -4.46428571428572e-03 895 895 3.33333333333442e-02 895 851 -4.16666666666397e-03 895 852 4.33680868994202e-18 895 853 -1.30952380952435e-02 895 854 4.46428571428572e-03 895 855 -4.16666666666396e-03 895 892 3.03576608295941e-18 895 893 4.76190476189937e-03 895 894 1.64798730217797e-17 895 850 -4.46428571428572e-03 895 896 3.46944695195361e-18 895 897 4.76190476189936e-03 895 934 4.46428571428571e-03 895 935 -4.16666666666397e-03 895 936 -1.82145964977565e-17 895 937 -1.30952380952435e-02 895 938 -4.46428571428572e-03 895 939 -4.16666666666397e-03 896 896 1.17051282051320e+00 896 853 -4.46428571428571e-03 896 854 9.85347985346086e-02 896 855 4.53983516483517e-02 896 856 -2.88461538461352e-01 896 857 2.40384615384615e-01 896 894 -1.30952380952435e-02 896 895 2.60208521396521e-18 896 852 -4.16666666666397e-03 896 897 4.44089209850063e-16 896 898 -7.69230769231142e-01 896 899 1.24900090270330e-16 896 936 -4.16666666666395e-03 896 937 4.46428571428571e-03 896 938 9.85347985346076e-02 896 939 -4.53983516483521e-02 896 940 -2.88461538461352e-01 896 941 -2.40384615384616e-01 897 897 1.17051282051320e+00 897 853 -4.16666666666396e-03 897 854 -4.53983516483516e-02 897 855 -3.91163003663194e-01 897 856 2.40384615384615e-01 897 857 -2.88461538461352e-01 897 894 3.03576608295941e-18 897 895 4.76190476189936e-03 897 896 4.44089209850063e-16 897 852 -4.46428571428572e-03 897 898 1.52655665885959e-16 897 899 1.92307692307319e-01 897 936 4.46428571428571e-03 897 937 -4.16666666666397e-03 897 938 4.53983516483512e-02 897 939 -3.91163003663195e-01 897 940 -2.40384615384616e-01 897 941 -2.88461538461352e-01 898 898 2.30769230769306e+00 898 855 -2.40384615384615e-01 898 856 1.92307692307319e-01 898 857 1.73472347597681e-16 898 858 -2.88461538461352e-01 898 859 2.40384615384615e-01 898 896 -7.69230769231142e-01 898 897 1.66533453693773e-16 898 854 -2.88461538461351e-01 898 899 8.60422844084496e-16 898 900 -7.69230769231144e-01 898 901 1.59594559789866e-16 898 938 -2.88461538461350e-01 898 939 2.40384615384615e-01 898 940 1.92307692307317e-01 898 941 -1.00613961606655e-15 898 942 -2.88461538461352e-01 898 943 -2.40384615384616e-01 899 899 2.30769230769306e+00 899 855 -2.88461538461351e-01 899 856 2.15105711021124e-16 899 857 -7.69230769231143e-01 899 858 2.40384615384615e-01 899 859 -2.88461538461351e-01 899 896 1.38777878078145e-16 899 897 1.92307692307319e-01 899 898 8.32667268468867e-16 899 854 -2.40384615384615e-01 899 900 1.73472347597681e-16 899 901 1.92307692307318e-01 899 938 2.40384615384615e-01 899 939 -2.88461538461352e-01 899 940 -9.50628464835290e-16 899 941 -7.69230769231145e-01 899 942 -2.40384615384616e-01 899 943 -2.88461538461352e-01 900 900 2.30769230769306e+00 900 857 -2.40384615384615e-01 900 858 1.92307692307319e-01 900 859 1.45716771982052e-16 900 860 -2.88461538461352e-01 900 861 2.40384615384615e-01 900 898 -7.69230769231144e-01 900 899 1.73472347597681e-16 900 856 -2.88461538461352e-01 900 901 8.60422844084496e-16 900 902 -7.69230769231144e-01 900 903 1.80411241501588e-16 900 940 -2.88461538461350e-01 900 941 2.40384615384615e-01 900 942 1.92307692307318e-01 900 943 -1.00613961606655e-15 900 944 -2.88461538461352e-01 900 945 -2.40384615384616e-01 901 901 2.30769230769306e+00 901 857 -2.88461538461351e-01 901 858 1.94289029309402e-16 901 859 -7.69230769231142e-01 901 860 2.40384615384615e-01 901 861 -2.88461538461351e-01 901 898 1.45716771982052e-16 901 899 1.92307692307318e-01 901 900 8.04911692853238e-16 901 856 -2.40384615384615e-01 901 902 1.59594559789866e-16 901 903 1.92307692307318e-01 901 940 2.40384615384615e-01 901 941 -2.88461538461351e-01 901 942 -9.57567358739198e-16 901 943 -7.69230769231144e-01 901 944 -2.40384615384616e-01 901 945 -2.88461538461352e-01 902 902 2.30769230769306e+00 902 859 -2.40384615384615e-01 902 860 1.92307692307319e-01 902 861 1.87350135405495e-16 902 862 -2.88461538461352e-01 902 863 2.40384615384615e-01 902 900 -7.69230769231144e-01 902 901 1.59594559789866e-16 902 858 -2.88461538461352e-01 902 903 8.04911692853238e-16 902 904 -7.69230769231143e-01 902 905 1.45716771982052e-16 902 942 -2.88461538461350e-01 902 943 2.40384615384615e-01 902 944 1.92307692307318e-01 902 945 -9.85322934354826e-16 902 946 -2.88461538461352e-01 902 947 -2.40384615384616e-01 903 903 2.30769230769306e+00 903 859 -2.88461538461351e-01 903 860 2.01227923213310e-16 903 861 -7.69230769231142e-01 903 862 2.40384615384615e-01 903 863 -2.88461538461351e-01 903 900 1.66533453693773e-16 903 901 1.92307692307318e-01 903 902 8.04911692853238e-16 903 858 -2.40384615384615e-01 903 904 1.38777878078145e-16 903 905 1.92307692307319e-01 903 942 2.40384615384615e-01 903 943 -2.88461538461351e-01 903 944 -9.57567358739198e-16 903 945 -7.69230769231144e-01 903 946 -2.40384615384616e-01 903 947 -2.88461538461352e-01 904 904 2.30769230769305e+00 904 861 -2.40384615384615e-01 904 862 1.92307692307318e-01 904 863 2.01227923213310e-16 904 864 -2.88461538461351e-01 904 865 2.40384615384615e-01 904 902 -7.69230769231143e-01 904 903 1.31838984174237e-16 904 860 -2.88461538461351e-01 904 905 7.21644966006352e-16 904 906 -7.69230769231141e-01 904 907 1.73472347597681e-16 904 944 -2.88461538461350e-01 904 945 2.40384615384615e-01 904 946 1.92307692307317e-01 904 947 -9.71445146547012e-16 904 948 -2.88461538461352e-01 904 949 -2.40384615384616e-01 905 905 2.30769230769306e+00 905 861 -2.88461538461351e-01 905 862 1.52655665885959e-16 905 863 -7.69230769231144e-01 905 864 2.40384615384615e-01 905 865 -2.88461538461352e-01 905 902 1.45716771982052e-16 905 903 1.92307692307319e-01 905 904 7.77156117237610e-16 905 860 -2.40384615384615e-01 905 906 1.73472347597681e-16 905 907 1.92307692307320e-01 905 944 2.40384615384615e-01 905 945 -2.88461538461351e-01 905 946 -9.92261828258734e-16 905 947 -7.69230769231146e-01 905 948 -2.40384615384616e-01 905 949 -2.88461538461352e-01 906 906 2.30769230769305e+00 906 863 -2.40384615384615e-01 906 864 1.92307692307318e-01 906 865 1.73472347597681e-16 906 866 -2.88461538461352e-01 906 867 2.40384615384615e-01 906 904 -7.69230769231141e-01 906 905 1.73472347597681e-16 906 862 -2.88461538461351e-01 906 907 8.88178419700125e-16 906 908 -7.69230769231143e-01 906 909 1.45716771982052e-16 906 946 -2.88461538461350e-01 906 947 2.40384615384615e-01 906 948 1.92307692307316e-01 906 949 -9.99200722162641e-16 906 950 -2.88461538461352e-01 906 951 -2.40384615384616e-01 907 907 2.30769230769306e+00 907 863 -2.88461538461352e-01 907 864 2.28983498828939e-16 907 865 -7.69230769231144e-01 907 866 2.40384615384615e-01 907 867 -2.88461538461351e-01 907 904 1.59594559789866e-16 907 905 1.92307692307320e-01 907 906 8.04911692853238e-16 907 862 -2.40384615384615e-01 907 908 1.38777878078145e-16 907 909 1.92307692307319e-01 907 946 2.40384615384615e-01 907 947 -2.88461538461352e-01 907 948 -9.64506252643105e-16 907 949 -7.69230769231146e-01 907 950 -2.40384615384616e-01 907 951 -2.88461538461352e-01 908 908 2.30769230769306e+00 908 865 -2.40384615384615e-01 908 866 1.92307692307319e-01 908 867 1.59594559789866e-16 908 868 -2.88461538461352e-01 908 869 2.40384615384615e-01 908 906 -7.69230769231143e-01 908 907 1.17961196366423e-16 908 864 -2.88461538461351e-01 908 909 8.32667268468867e-16 908 910 -7.69230769231144e-01 908 911 1.80411241501588e-16 908 948 -2.88461538461350e-01 908 949 2.40384615384615e-01 908 950 1.92307692307318e-01 908 951 -1.02001740387436e-15 908 952 -2.88461538461352e-01 908 953 -2.40384615384616e-01 909 909 2.30769230769306e+00 909 865 -2.88461538461351e-01 909 866 1.94289029309402e-16 909 867 -7.69230769231142e-01 909 868 2.40384615384615e-01 909 869 -2.88461538461351e-01 909 906 1.66533453693773e-16 909 907 1.92307692307319e-01 909 908 8.04911692853238e-16 909 864 -2.40384615384615e-01 909 910 1.59594559789866e-16 909 911 1.92307692307318e-01 909 948 2.40384615384615e-01 909 949 -2.88461538461351e-01 909 950 -9.36750677027476e-16 909 951 -7.69230769231144e-01 909 952 -2.40384615384616e-01 909 953 -2.88461538461352e-01 910 910 2.30769230769306e+00 910 867 -2.40384615384615e-01 910 868 1.92307692307320e-01 910 869 1.73472347597681e-16 910 870 -2.88461538461352e-01 910 871 2.40384615384615e-01 910 908 -7.69230769231144e-01 910 909 1.59594559789866e-16 910 866 -2.88461538461352e-01 910 911 8.04911692853238e-16 910 912 -7.69230769231144e-01 910 913 1.87350135405495e-16 910 950 -2.88461538461350e-01 910 951 2.40384615384615e-01 910 952 1.92307692307318e-01 910 953 -9.92261828258734e-16 910 954 -2.88461538461352e-01 910 955 -2.40384615384616e-01 911 911 2.30769230769305e+00 911 867 -2.88461538461351e-01 911 868 2.08166817117217e-16 911 869 -7.69230769231141e-01 911 870 2.40384615384615e-01 911 871 -2.88461538461351e-01 911 908 1.66533453693773e-16 911 909 1.92307692307318e-01 911 910 8.04911692853238e-16 911 866 -2.40384615384615e-01 911 912 1.45716771982052e-16 911 913 1.92307692307318e-01 911 950 2.40384615384615e-01 911 951 -2.88461538461351e-01 911 952 -9.57567358739198e-16 911 953 -7.69230769231144e-01 911 954 -2.40384615384616e-01 911 955 -2.88461538461352e-01 912 912 1.15384717236504e+00 912 869 -2.40384615384615e-01 912 870 9.61538924499563e-02 912 871 -4.80769577991452e-02 912 872 -2.54629629629465e-07 912 873 1.73611111111111e-07 912 910 -7.69230769231144e-01 912 911 1.73472347597681e-16 912 868 -2.88461538461352e-01 912 913 4.29074439129237e-16 912 914 -6.01851851852181e-07 912 915 1.05879118406788e-22 912 952 -2.88461538461350e-01 912 953 2.40384615384615e-01 912 954 9.61538924499557e-02 912 955 4.80769577991448e-02 912 956 -2.54629629629465e-07 912 957 -1.73611111111111e-07 913 913 1.15384717236504e+00 913 869 -2.88461538461351e-01 913 870 4.80769577991454e-02 913 871 -3.84615685541496e-01 913 872 1.73611111111111e-07 913 873 -2.54629629629465e-07 913 910 1.52655665885959e-16 913 911 1.92307692307318e-01 913 912 4.01318863513608e-16 913 868 -2.40384615384615e-01 913 914 1.19114008207636e-22 913 915 9.25925925922635e-08 913 952 2.40384615384615e-01 913 953 -2.88461538461351e-01 913 954 -4.80769577991458e-02 913 955 -3.84615685541497e-01 913 956 -1.73611111111111e-07 913 957 -2.54629629629465e-07 914 914 2.03703703703770e-06 914 871 -1.73611111111111e-07 914 872 9.25925925922629e-08 914 873 1.52201232709757e-22 914 874 -2.54629629629465e-07 914 875 1.73611111111111e-07 914 912 -6.01851851852181e-07 914 913 1.25731453108060e-22 914 870 -2.54629629629464e-07 914 915 5.55865371635635e-22 914 916 -6.01851851852182e-07 914 917 1.25731453108060e-22 914 954 -2.54629629629464e-07 914 955 1.73611111111111e-07 914 956 9.25925925922614e-08 914 957 -7.01449159444967e-22 914 958 -2.54629629629465e-07 914 959 -1.73611111111111e-07 915 915 2.03703703703770e-06 915 871 -2.54629629629465e-07 915 872 1.45583787809333e-22 915 873 -6.01851851852182e-07 915 874 1.73611111111111e-07 915 875 -2.54629629629465e-07 915 912 1.19114008207636e-22 915 913 9.25925925922635e-08 915 914 5.55865371635635e-22 915 870 -1.73611111111111e-07 915 916 1.12496563307212e-22 915 917 9.25925925922625e-08 915 954 1.73611111111111e-07 915 955 -2.54629629629465e-07 915 956 -6.88214269644119e-22 915 957 -6.01851851852184e-07 915 958 -1.73611111111111e-07 915 959 -2.54629629629465e-07 916 916 2.03703703703770e-06 916 873 -1.73611111111111e-07 916 874 9.25925925922642e-08 916 875 1.38966342908909e-22 916 876 -2.54629629629465e-07 916 877 1.73611111111111e-07 916 914 -6.01851851852182e-07 916 915 1.19114008207636e-22 916 872 -2.54629629629465e-07 916 917 5.82335151237331e-22 916 918 -6.01851851852185e-07 916 919 1.19114008207636e-22 916 956 -2.54629629629464e-07 916 957 1.73611111111111e-07 916 958 9.25925925922628e-08 916 959 -7.08066604345392e-22 916 960 -2.54629629629466e-07 916 961 -1.73611111111111e-07 917 917 2.03703703703770e-06 917 873 -2.54629629629464e-07 917 874 1.58818677610181e-22 917 875 -6.01851851852180e-07 917 876 1.73611111111111e-07 917 877 -2.54629629629464e-07 917 914 1.25731453108060e-22 917 915 9.25925925922625e-08 917 916 5.82335151237331e-22 917 872 -1.73611111111111e-07 917 918 1.38966342908909e-22 917 919 9.25925925922607e-08 917 956 1.73611111111111e-07 917 957 -2.54629629629464e-07 917 958 -7.41153828847513e-22 917 959 -6.01851851852182e-07 917 960 -1.73611111111111e-07 917 961 -2.54629629629465e-07 918 918 2.03703703703770e-06 918 875 -1.73611111111111e-07 918 876 9.25925925922635e-08 918 877 1.38966342908909e-22 918 878 -2.54629629629465e-07 918 879 1.73611111111111e-07 918 916 -6.01851851852185e-07 918 917 1.32348898008484e-22 918 874 -2.54629629629465e-07 918 919 5.55865371635635e-22 918 920 -6.01851851852180e-07 918 921 1.19114008207636e-22 918 958 -2.54629629629464e-07 918 959 1.73611111111111e-07 918 960 9.25925925922621e-08 918 961 -7.01449159444967e-22 918 962 -2.54629629629465e-07 918 963 -1.73611111111111e-07 919 919 2.03703703703770e-06 919 875 -2.54629629629464e-07 919 876 1.38966342908909e-22 919 877 -6.01851851852181e-07 919 878 1.73611111111111e-07 919 879 -2.54629629629465e-07 919 916 1.12496563307212e-22 919 917 9.25925925922607e-08 919 918 5.55865371635635e-22 919 874 -1.73611111111111e-07 919 920 1.19114008207636e-22 919 921 9.25925925922638e-08 919 958 1.73611111111111e-07 919 959 -2.54629629629464e-07 919 960 -7.08066604345392e-22 919 961 -6.01851851852183e-07 919 962 -1.73611111111111e-07 919 963 -2.54629629629465e-07 920 920 2.03703703703770e-06 920 877 -1.73611111111111e-07 920 878 9.25925925922621e-08 920 879 1.52201232709757e-22 920 880 -2.54629629629465e-07 920 881 1.73611111111111e-07 920 918 -6.01851851852180e-07 920 919 1.12496563307212e-22 920 876 -2.54629629629464e-07 920 921 5.55865371635635e-22 920 922 -6.01851851852181e-07 920 923 1.05879118406788e-22 920 960 -2.54629629629463e-07 920 961 1.73611111111111e-07 920 962 9.25925925922607e-08 920 963 -7.14684049245816e-22 920 964 -2.54629629629465e-07 920 965 -1.73611111111111e-07 921 921 2.03703703703770e-06 921 877 -2.54629629629465e-07 921 878 1.45583787809333e-22 921 879 -6.01851851852183e-07 921 880 1.73611111111111e-07 921 881 -2.54629629629465e-07 921 918 1.32348898008484e-22 921 919 9.25925925922638e-08 921 920 5.55865371635635e-22 921 876 -1.73611111111111e-07 921 922 1.19114008207636e-22 921 923 9.25925925922635e-08 921 960 1.73611111111111e-07 921 961 -2.54629629629465e-07 921 962 -7.01449159444967e-22 921 963 -6.01851851852185e-07 921 964 -1.73611111111111e-07 921 965 -2.54629629629465e-07 922 922 2.03703703703770e-06 922 879 -1.73611111111111e-07 922 880 9.25925925922632e-08 922 881 1.45583787809333e-22 922 920 -6.01851851852181e-07 922 921 1.25731453108060e-22 922 878 -2.54629629629464e-07 922 923 5.55865371635635e-22 922 962 -2.54629629629464e-07 922 963 1.73611111111111e-07 922 964 9.25925925922618e-08 922 965 -6.88214269644119e-22 923 923 2.03703703703770e-06 923 879 -2.54629629629465e-07 923 880 1.58818677610181e-22 923 881 -6.01851851852181e-07 923 920 1.19114008207636e-22 923 921 9.25925925922635e-08 923 922 5.29395592033938e-22 923 878 -1.73611111111111e-07 923 962 1.73611111111111e-07 923 963 -2.54629629629465e-07 923 964 -7.01449159444967e-22 923 965 -6.01851851852183e-07 924 924 1.66666666666721e-02 924 883 -1.82145964977565e-17 924 884 -4.16666666666395e-03 924 885 4.46428571428571e-03 924 882 4.76190476189935e-03 924 925 1.82145964977565e-17 924 926 -6.54761904762174e-03 924 927 -2.67857142857143e-03 925 925 1.66666666666721e-02 925 883 -1.30952380952435e-02 925 884 4.46428571428571e-03 925 885 -4.16666666666397e-03 925 924 1.82145964977565e-17 925 882 -1.77809156287623e-17 925 926 2.67857142857143e-03 925 927 2.38095238094969e-03 926 926 1.66666666666721e-02 926 883 -4.46428571428572e-03 926 884 4.76190476189935e-03 926 885 -1.82145964977565e-17 926 886 -4.16666666666395e-03 926 887 4.46428571428571e-03 926 924 -6.54761904762174e-03 926 925 2.67857142857143e-03 926 882 -4.16666666666398e-03 926 927 1.82145964977565e-17 926 928 -6.54761904762174e-03 926 929 -2.67857142857143e-03 927 927 1.66666666666721e-02 927 883 -4.16666666666397e-03 927 884 -1.77809156287623e-17 927 885 -1.30952380952435e-02 927 886 4.46428571428571e-03 927 887 -4.16666666666397e-03 927 924 -2.67857142857143e-03 927 925 2.38095238094969e-03 927 926 1.82145964977565e-17 927 882 -4.46428571428572e-03 927 928 2.67857142857143e-03 927 929 2.38095238094969e-03 928 928 1.66666666666721e-02 928 885 -4.46428571428572e-03 928 886 4.76190476189935e-03 928 887 -1.82145964977565e-17 928 888 -4.16666666666395e-03 928 889 4.46428571428571e-03 928 926 -6.54761904762174e-03 928 927 2.67857142857143e-03 928 884 -4.16666666666398e-03 928 929 1.82145964977565e-17 928 930 -6.54761904762174e-03 928 931 -2.67857142857142e-03 929 929 1.66666666666721e-02 929 885 -4.16666666666397e-03 929 886 -1.77809156287623e-17 929 887 -1.30952380952435e-02 929 888 4.46428571428571e-03 929 889 -4.16666666666397e-03 929 926 -2.67857142857143e-03 929 927 2.38095238094969e-03 929 928 1.82145964977565e-17 929 884 -4.46428571428572e-03 929 930 2.67857142857144e-03 929 931 2.38095238094969e-03 930 930 1.66666666666721e-02 930 887 -4.46428571428572e-03 930 888 4.76190476189935e-03 930 889 -1.82145964977565e-17 930 890 -4.16666666666395e-03 930 891 4.46428571428571e-03 930 928 -6.54761904762174e-03 930 929 2.67857142857144e-03 930 886 -4.16666666666398e-03 930 931 1.90819582357449e-17 930 932 -6.54761904762174e-03 930 933 -2.67857142857143e-03 931 931 1.66666666666721e-02 931 887 -4.16666666666398e-03 931 888 -1.82145964977565e-17 931 889 -1.30952380952435e-02 931 890 4.46428571428571e-03 931 891 -4.16666666666397e-03 931 928 -2.67857142857142e-03 931 929 2.38095238094969e-03 931 930 1.90819582357449e-17 931 886 -4.46428571428572e-03 931 932 2.67857142857143e-03 931 933 2.38095238094969e-03 932 932 1.66666666666721e-02 932 889 -4.46428571428572e-03 932 890 4.76190476189935e-03 932 891 -1.82145964977565e-17 932 892 -4.16666666666395e-03 932 893 4.46428571428571e-03 932 930 -6.54761904762174e-03 932 931 2.67857142857144e-03 932 888 -4.16666666666398e-03 932 933 1.90819582357449e-17 932 934 -6.54761904762174e-03 932 935 -2.67857142857143e-03 933 933 1.66666666666721e-02 933 889 -4.16666666666398e-03 933 890 -1.82145964977565e-17 933 891 -1.30952380952435e-02 933 892 4.46428571428571e-03 933 893 -4.16666666666397e-03 933 930 -2.67857142857142e-03 933 931 2.38095238094969e-03 933 932 1.82145964977565e-17 933 888 -4.46428571428572e-03 933 934 2.67857142857143e-03 933 935 2.38095238094969e-03 934 934 1.66666666666721e-02 934 891 -4.46428571428572e-03 934 892 4.76190476189935e-03 934 893 -1.73472347597681e-17 934 894 -4.16666666666394e-03 934 895 4.46428571428571e-03 934 932 -6.54761904762174e-03 934 933 2.67857142857143e-03 934 890 -4.16666666666398e-03 934 935 1.73472347597681e-17 934 936 -6.54761904762173e-03 934 937 -2.67857142857143e-03 935 935 1.66666666666721e-02 935 891 -4.16666666666397e-03 935 892 -1.90819582357449e-17 935 893 -1.30952380952435e-02 935 894 4.46428571428571e-03 935 895 -4.16666666666397e-03 935 932 -2.67857142857142e-03 935 933 2.38095238094969e-03 935 934 1.90819582357449e-17 935 890 -4.46428571428572e-03 935 936 2.67857142857143e-03 935 937 2.38095238094969e-03 936 936 1.66666666666721e-02 936 893 -4.46428571428572e-03 936 894 4.76190476189935e-03 936 895 -1.82145964977565e-17 936 896 -4.16666666666395e-03 936 897 4.46428571428571e-03 936 934 -6.54761904762173e-03 936 935 2.67857142857143e-03 936 892 -4.16666666666398e-03 936 937 1.82145964977565e-17 936 938 -6.54761904762175e-03 936 939 -2.67857142857142e-03 937 937 1.66666666666721e-02 937 893 -4.16666666666398e-03 937 894 -1.82145964977565e-17 937 895 -1.30952380952435e-02 937 896 4.46428571428571e-03 937 897 -4.16666666666397e-03 937 934 -2.67857142857142e-03 937 935 2.38095238094969e-03 937 936 1.82145964977565e-17 937 892 -4.46428571428572e-03 937 938 2.67857142857143e-03 937 939 2.38095238094968e-03 938 938 5.85256410256599e-01 938 895 -4.46428571428572e-03 938 896 9.85347985346076e-02 938 897 4.53983516483511e-02 938 898 -2.88461538461350e-01 938 899 2.40384615384615e-01 938 936 -6.54761904762175e-03 938 937 2.67857142857144e-03 938 894 -4.16666666666398e-03 938 939 -2.35920329670329e-01 938 940 -3.84615384615570e-01 938 941 -4.80769230769228e-02 939 939 5.85256410256601e-01 939 895 -4.16666666666397e-03 939 896 -4.53983516483522e-02 939 897 -3.91163003663195e-01 939 898 2.40384615384615e-01 939 899 -2.88461538461352e-01 939 936 -2.67857142857142e-03 939 937 2.38095238094968e-03 939 938 -2.35920329670329e-01 939 894 -4.46428571428572e-03 939 940 4.80769230769233e-02 939 941 9.61538461536600e-02 940 940 1.15384615384653e+00 940 897 -2.40384615384616e-01 940 898 1.92307692307317e-01 940 899 -9.78384040450919e-16 940 900 -2.88461538461350e-01 940 901 2.40384615384615e-01 940 938 -3.84615384615570e-01 940 939 4.80769230769234e-02 940 896 -2.88461538461352e-01 940 941 9.71445146547012e-16 940 942 -3.84615384615571e-01 940 943 -4.80769230769228e-02 941 941 1.15384615384653e+00 941 897 -2.88461538461352e-01 941 898 -1.01307850997046e-15 941 899 -7.69230769231145e-01 941 900 2.40384615384615e-01 941 901 -2.88461538461351e-01 941 938 -4.80769230769228e-02 941 939 9.61538461536600e-02 941 940 9.71445146547012e-16 941 896 -2.40384615384616e-01 941 942 4.80769230769233e-02 941 943 9.61538461536594e-02 942 942 1.15384615384653e+00 942 899 -2.40384615384616e-01 942 900 1.92307692307318e-01 942 901 -9.78384040450919e-16 942 902 -2.88461538461350e-01 942 903 2.40384615384615e-01 942 940 -3.84615384615571e-01 942 941 4.80769230769233e-02 942 898 -2.88461538461352e-01 942 943 9.71445146547012e-16 942 944 -3.84615384615571e-01 942 945 -4.80769230769228e-02 943 943 1.15384615384653e+00 943 899 -2.88461538461352e-01 943 900 -9.78384040450919e-16 943 901 -7.69230769231144e-01 943 902 2.40384615384615e-01 943 903 -2.88461538461351e-01 943 940 -4.80769230769228e-02 943 941 9.61538461536594e-02 943 942 9.71445146547012e-16 943 898 -2.40384615384616e-01 943 944 4.80769230769233e-02 943 945 9.61538461536595e-02 944 944 1.15384615384653e+00 944 901 -2.40384615384616e-01 944 902 1.92307692307318e-01 944 903 -9.64506252643105e-16 944 904 -2.88461538461350e-01 944 905 2.40384615384615e-01 944 942 -3.84615384615571e-01 944 943 4.80769230769234e-02 944 900 -2.88461538461352e-01 944 945 9.71445146547012e-16 944 946 -3.84615384615571e-01 944 947 -4.80769230769228e-02 945 945 1.15384615384653e+00 945 901 -2.88461538461352e-01 945 902 -9.71445146547012e-16 945 903 -7.69230769231144e-01 945 904 2.40384615384615e-01 945 905 -2.88461538461351e-01 945 942 -4.80769230769228e-02 945 943 9.61538461536595e-02 945 944 9.71445146547012e-16 945 900 -2.40384615384616e-01 945 946 4.80769230769233e-02 945 947 9.61538461536596e-02 946 946 1.15384615384653e+00 946 903 -2.40384615384616e-01 946 904 1.92307692307317e-01 946 905 -9.78384040450919e-16 946 906 -2.88461538461350e-01 946 907 2.40384615384615e-01 946 944 -3.84615384615571e-01 946 945 4.80769230769233e-02 946 902 -2.88461538461352e-01 946 947 9.71445146547012e-16 946 948 -3.84615384615570e-01 946 949 -4.80769230769228e-02 947 947 1.15384615384653e+00 947 903 -2.88461538461352e-01 947 904 -9.85322934354826e-16 947 905 -7.69230769231146e-01 947 906 2.40384615384615e-01 947 907 -2.88461538461352e-01 947 944 -4.80769230769228e-02 947 945 9.61538461536596e-02 947 946 1.02695629777827e-15 947 902 -2.40384615384616e-01 947 948 4.80769230769233e-02 947 949 9.61538461536605e-02 948 948 1.15384615384653e+00 948 905 -2.40384615384616e-01 948 906 1.92307692307316e-01 948 907 -9.57567358739198e-16 948 908 -2.88461538461350e-01 948 909 2.40384615384615e-01 948 946 -3.84615384615570e-01 948 947 4.80769230769233e-02 948 904 -2.88461538461352e-01 948 949 9.99200722162641e-16 948 950 -3.84615384615571e-01 948 951 -4.80769230769228e-02 949 949 1.15384615384653e+00 949 905 -2.88461538461352e-01 949 906 -9.71445146547012e-16 949 907 -7.69230769231146e-01 949 908 2.40384615384615e-01 949 909 -2.88461538461351e-01 949 946 -4.80769230769228e-02 949 947 9.61538461536604e-02 949 948 9.99200722162641e-16 949 904 -2.40384615384616e-01 949 950 4.80769230769234e-02 949 951 9.61538461536597e-02 950 950 1.15384615384653e+00 950 907 -2.40384615384616e-01 950 908 1.92307692307318e-01 950 909 -9.50628464835290e-16 950 910 -2.88461538461350e-01 950 911 2.40384615384615e-01 950 948 -3.84615384615571e-01 950 949 4.80769230769233e-02 950 906 -2.88461538461352e-01 950 951 9.71445146547012e-16 950 952 -3.84615384615571e-01 950 953 -4.80769230769228e-02 951 951 1.15384615384653e+00 951 907 -2.88461538461352e-01 951 908 -1.00613961606655e-15 951 909 -7.69230769231144e-01 951 910 2.40384615384615e-01 951 911 -2.88461538461351e-01 951 948 -4.80769230769228e-02 951 949 9.61538461536597e-02 951 950 9.43689570931383e-16 951 906 -2.40384615384616e-01 951 952 4.80769230769233e-02 951 953 9.61538461536595e-02 952 952 1.15384615384653e+00 952 909 -2.40384615384616e-01 952 910 1.92307692307318e-01 952 911 -9.78384040450919e-16 952 912 -2.88461538461350e-01 952 913 2.40384615384615e-01 952 950 -3.84615384615571e-01 952 951 4.80769230769234e-02 952 908 -2.88461538461352e-01 952 953 9.71445146547012e-16 952 954 -3.84615384615571e-01 952 955 -4.80769230769228e-02 953 953 1.15384615384653e+00 953 909 -2.88461538461352e-01 953 910 -9.78384040450919e-16 953 911 -7.69230769231144e-01 953 912 2.40384615384615e-01 953 913 -2.88461538461351e-01 953 950 -4.80769230769228e-02 953 951 9.61538461536595e-02 953 952 9.71445146547012e-16 953 908 -2.40384615384616e-01 953 954 4.80769230769234e-02 953 955 9.61538461536593e-02 954 954 5.76923586182524e-01 954 911 -2.40384615384616e-01 954 912 9.61538924499557e-02 954 913 -4.80769577991458e-02 954 914 -2.54629629629464e-07 954 915 1.73611111111111e-07 954 952 -3.84615384615571e-01 954 953 4.80769230769234e-02 954 910 -2.88461538461352e-01 954 955 2.40384441773505e-01 954 956 -3.00925925926090e-07 954 957 3.47222222222224e-08 955 955 5.76923586182523e-01 955 911 -2.88461538461352e-01 955 912 4.80769577991448e-02 955 913 -3.84615685541497e-01 955 914 1.73611111111111e-07 955 915 -2.54629629629465e-07 955 952 -4.80769230769228e-02 955 953 9.61538461536593e-02 955 954 2.40384441773505e-01 955 910 -2.40384615384616e-01 955 956 -3.47222222222220e-08 955 957 4.62962962961321e-08 956 956 1.01851851851885e-06 956 913 -1.73611111111111e-07 956 914 9.25925925922614e-08 956 915 -7.08066604345392e-22 956 916 -2.54629629629464e-07 956 917 1.73611111111111e-07 956 954 -3.00925925926090e-07 956 955 -3.47222222222220e-08 956 912 -2.54629629629465e-07 956 957 7.14684049245816e-22 956 958 -3.00925925926090e-07 956 959 3.47222222222224e-08 957 957 1.01851851851885e-06 957 913 -2.54629629629465e-07 957 914 -7.21301494146240e-22 957 915 -6.01851851852184e-07 957 916 1.73611111111111e-07 957 917 -2.54629629629464e-07 957 954 3.47222222222224e-08 957 955 4.62962962961320e-08 957 956 7.14684049245816e-22 957 912 -1.73611111111111e-07 957 958 -3.47222222222220e-08 957 959 4.62962962961317e-08 958 958 1.01851851851885e-06 958 915 -1.73611111111111e-07 958 916 9.25925925922628e-08 958 917 -7.27918939046664e-22 958 918 -2.54629629629464e-07 958 919 1.73611111111111e-07 958 956 -3.00925925926090e-07 958 957 -3.47222222222220e-08 958 914 -2.54629629629465e-07 958 959 7.14684049245816e-22 958 960 -3.00925925926092e-07 958 961 3.47222222222224e-08 959 959 1.01851851851885e-06 959 915 -2.54629629629465e-07 959 916 -7.21301494146240e-22 959 917 -6.01851851852182e-07 959 918 1.73611111111111e-07 959 919 -2.54629629629464e-07 959 956 3.47222222222224e-08 959 957 4.62962962961317e-08 959 958 7.14684049245816e-22 959 914 -1.73611111111111e-07 959 960 -3.47222222222220e-08 959 961 4.62962962961307e-08 960 960 1.01851851851885e-06 960 917 -1.73611111111111e-07 960 918 9.25925925922621e-08 960 919 -7.08066604345392e-22 960 920 -2.54629629629463e-07 960 921 1.73611111111111e-07 960 958 -3.00925925926092e-07 960 959 -3.47222222222220e-08 960 916 -2.54629629629466e-07 960 961 6.88214269644119e-22 960 962 -3.00925925926090e-07 960 963 3.47222222222224e-08 961 961 1.01851851851885e-06 961 917 -2.54629629629465e-07 961 918 -7.14684049245816e-22 961 919 -6.01851851852183e-07 961 920 1.73611111111111e-07 961 921 -2.54629629629465e-07 961 958 3.47222222222224e-08 961 959 4.62962962961307e-08 961 960 6.88214269644119e-22 961 916 -1.73611111111111e-07 961 962 -3.47222222222220e-08 961 963 4.62962962961323e-08 962 962 1.01851851851885e-06 962 919 -1.73611111111111e-07 962 920 9.25925925922608e-08 962 921 -7.01449159444967e-22 962 922 -2.54629629629464e-07 962 923 1.73611111111111e-07 962 960 -3.00925925926090e-07 962 961 -3.47222222222220e-08 962 918 -2.54629629629465e-07 962 963 6.88214269644119e-22 962 964 -3.00925925926090e-07 962 965 3.47222222222224e-08 963 963 1.01851851851885e-06 963 919 -2.54629629629465e-07 963 920 -7.08066604345392e-22 963 921 -6.01851851852185e-07 963 922 1.73611111111111e-07 963 923 -2.54629629629465e-07 963 960 3.47222222222224e-08 963 961 4.62962962961323e-08 963 962 6.88214269644119e-22 963 918 -1.73611111111111e-07 963 964 -3.47222222222220e-08 963 965 4.62962962961321e-08 964 964 1.01851851851885e-06 964 921 -1.73611111111111e-07 964 922 9.25925925922618e-08 964 923 -7.08066604345392e-22 964 962 -3.00925925926090e-07 964 963 -3.47222222222220e-08 964 920 -2.54629629629465e-07 964 965 7.14684049245816e-22 965 965 1.01851851851885e-06 965 921 -2.54629629629465e-07 965 922 -7.08066604345392e-22 965 923 -6.01851851852183e-07 965 962 3.47222222222224e-08 965 963 4.62962962961320e-08 965 964 7.14684049245816e-22 965 920 -1.73611111111111e-07 hypre-2.33.0/src/test/TEST_ij/A_tstoffd.00000000066400000000000000000000002401477326011500202310ustar00rootroot000000000000000 11 0 11 0 0 1.0 1 1 1.0 2 2 1.0 3 3 1.0 4 4 1.0 5 5 1.0 6 6 1.0 7 7 1.0 8 8 1.0 9 9 1.0 10 10 1.0 11 11 1.0 14 14 1.0 18 18 1.0 25 25 1.0 29 29 1.0 35 35 1.0 hypre-2.33.0/src/test/TEST_ij/A_tstoffd.00001000066400000000000000000000002061477326011500202340ustar00rootroot0000000000000012 16 12 16 12 12 1.0 13 13 1.0 14 14 1.0 15 15 1.0 16 16 1.0 5 5 1.0 6 6 1.0 7 7 1.0 8 8 1.0 11 11 1.0 19 19 1.0 25 25 1.0 36 36 1.0 hypre-2.33.0/src/test/TEST_ij/A_tstoffd.00002000066400000000000000000000003461477326011500202420ustar00rootroot0000000000000017 26 17 26 5 5 1.0 10 10 1.0 11 11 1.0 12 12 1.0 13 13 1.0 14 14 1.0 15 15 1.0 16 16 1.0 17 17 1.0 18 18 1.0 19 19 1.0 20 20 1.0 21 21 1.0 22 22 1.0 23 23 1.0 24 24 1.0 25 25 1.0 26 26 1.0 27 27 1.0 28 28 1.0 29 29 1.0 35 35 1.0 hypre-2.33.0/src/test/TEST_ij/A_tstoffd.00003000066400000000000000000000005001477326011500202330ustar00rootroot0000000000000027 39 27 39 10 10 1.0 5 5 1.0 11 11 1.0 12 12 1.0 13 13 1.0 14 14 1.0 15 15 1.0 16 16 1.0 17 17 1.0 18 18 1.0 19 19 1.0 20 20 1.0 21 21 1.0 22 22 1.0 23 23 1.0 24 24 1.0 25 25 1.0 26 26 1.0 27 27 1.0 28 28 1.0 29 29 1.0 30 30 1.0 31 31 1.0 32 32 1.0 33 33 1.0 34 34 1.0 35 35 1.0 36 36 1.0 37 37 1.0 38 38 1.0 39 39 1.0 hypre-2.33.0/src/test/TEST_ij/agg_interp.jobs000077500000000000000000000136651477326011500207570ustar00rootroot00000000000000#!/bin/bash # Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) #============================================================================= # ij: Test aggressive coarsening interpolation options # 1: 2s-ei interpolation 1 level (Pmx = 4) # 2: 2s-std interpolation 1 level (Pmx = 4) # 3: 2s-ext interpolation 1 level (tr = 0.3) # 4: multipass interpolation 1 level # 5: 2s-ei interpolation all levels (Pmx = 4) # 6: 2s-std interpolation all levels (Pmx = 4) # 7: 2s-ext interpolation all levels (tr = 0.3 P12_tr = 0.2) # 8: multipass interpolation all levels # 9: 2s-ei interpolation all levels (Pmx = 4, P12_mx = 3) # 10: multipass interpolation all levels for systems problem unknown approach # 11: 2s-ei interpolation all levels for systems problem unknown approach # 12: multipass interpolation all levels for systems problem hybrid approach # 13: 2s-ei interpolation all levels for systems problem hybrid approach # 14: 2s-mod-ext interpolation 1 level (agg_Pmx 4) # 15: 2s-mod-ext interpolation 1 level (agg_tr 0.3) # 16: 2s-mod-ei-ext interpolation 1 level (agg_P12 6 agg_Pmx 4) # 17: 2s-mod-ext interpolation all levels for systems problem unknown approach # 18: 2s-mod-ext interpolation all levels for systems problem hybrid approach # 19: 2s-mod-ee interpolation 1 levels (agg_tr 0.3) # 20: 2s-mod-ee interpolation all levels (agg_Pmx 4 agg_P12_mx 4) # 22: multipass interpolation all levels (agg_Pmx 4 agg_P12_mx 4) #============================================================================= mpirun -np 8 ./ij -rhsrand -n 30 29 31 -P 2 2 2 -agg_nl 1 -agg_interp 1 -agg_Pmx 4 -solver 1 -rlx 6 \ > agg_interp.out.1 mpirun -np 8 ./ij -rhsrand -n 30 29 31 -P 2 2 2 -agg_nl 1 -agg_interp 2 -agg_Pmx 4 -solver 1 -rlx 6 \ >> agg_interp.out.2 mpirun -np 8 ./ij -rhsrand -n 30 29 31 -P 2 2 2 -agg_nl 1 -agg_interp 3 -agg_tr 0.3 -solver 1 -rlx 6 \ >> agg_interp.out.3 mpirun -np 8 ./ij -rhsrand -n 30 29 31 -P 2 2 2 -agg_nl 1 -agg_interp 4 -solver 1 -rlx 6 \ >> agg_interp.out.4 mpirun -np 8 ./ij -rhsrand -n 30 29 31 -P 2 2 2 -agg_nl 1 -agg_interp 8 -solver 1 -rlx 6 \ >> agg_interp.out.4.1 mpirun -np 8 ./ij -rhsrand -n 30 29 31 -P 2 2 2 -agg_nl 1 -agg_interp 9 -solver 1 -rlx 6 \ >> agg_interp.out.4.2 mpirun -np 8 ./ij -rhsrand -n 30 29 31 -P 2 2 2 -agg_nl 10 -agg_interp 1 -agg_Pmx 4 -solver 1 -rlx 6 \ > agg_interp.out.5 mpirun -np 8 ./ij -rhsrand -n 30 29 31 -P 2 2 2 -agg_nl 10 -agg_interp 2 -agg_Pmx 4 -solver 1 -rlx 6 \ >> agg_interp.out.6 mpirun -np 8 ./ij -rhsrand -n 30 29 31 -P 2 2 2 -agg_nl 10 -agg_interp 3 -agg_tr 0.3 -agg_P12_tr 0.2 -solver 1 -rlx 6 \ >> agg_interp.out.7 mpirun -np 8 ./ij -rhsrand -n 30 29 31 -P 2 2 2 -agg_nl 10 -agg_interp 4 -solver 1 -rlx 6 \ >> agg_interp.out.8 mpirun -np 8 ./ij -rhsrand -n 30 29 31 -P 2 2 2 -agg_nl 10 -agg_interp 8 -solver 1 -rlx 6 \ >> agg_interp.out.8.1 mpirun -np 8 ./ij -rhsrand -n 30 29 31 -P 2 2 2 -agg_nl 10 -agg_interp 9 -solver 1 -rlx 6 \ >> agg_interp.out.8.2 mpirun -np 8 ./ij -rhsrand -n 30 29 31 -P 2 2 2 -agg_nl 1 -agg_interp 1 -agg_Pmx 4 -agg_P12_mx 3 -solver 1 -rlx 6 \ > agg_interp.out.9 mpirun -np 8 ./ij -rhsrand -n 20 19 22 -P 2 2 2 -sysL 3 -nf 3 -agg_nl 10 -agg_interp 4 -solver 1 -rlx 6 \ >> agg_interp.out.10 mpirun -np 8 ./ij -rhsrand -n 20 19 22 -P 2 2 2 -sysL 3 -nf 3 -agg_nl 10 -agg_interp 8 -solver 1 -rlx 6 \ >> agg_interp.out.10.1 mpirun -np 8 ./ij -rhsrand -n 20 19 22 -P 2 2 2 -sysL 3 -nf 3 -agg_nl 10 -agg_interp 9 -solver 1 -rlx 6 \ >> agg_interp.out.10.2 mpirun -np 8 ./ij -rhsrand -n 20 19 22 -P 2 2 2 -sysL 3 -nf 3 -agg_nl 10 -agg_interp 1 -agg_Pmx 4 -agg_P12_mx 4 -solver 1 -rlx 6 \ >> agg_interp.out.11 mpirun -np 8 ./ij -rhsrand -n 20 19 22 -P 2 2 2 -sysL 3 -nf 3 -agg_nl 10 -agg_interp 4 -nodal 1 -solver 1 -rlx 6 \ >> agg_interp.out.12 mpirun -np 8 ./ij -rhsrand -n 20 19 22 -P 2 2 2 -sysL 3 -nf 3 -agg_nl 10 -agg_interp 8 -nodal 1 -solver 1 -rlx 6 \ >> agg_interp.out.12.1 mpirun -np 8 ./ij -rhsrand -n 20 19 22 -P 2 2 2 -sysL 3 -nf 3 -agg_nl 10 -agg_interp 9 -nodal 1 -solver 1 -rlx 6 \ >> agg_interp.out.12.2 mpirun -np 8 ./ij -rhsrand -n 20 19 22 -P 2 2 2 -sysL 3 -nf 3 -agg_nl 10 -agg_interp 1 -agg_Pmx 4 -agg_P12_mx 4 -nodal 1 -solver 1 -rlx 6 \ >> agg_interp.out.13 mpirun -np 8 ./ij -rhsrand -n 30 29 31 -P 2 2 2 -agg_nl 1 -agg_interp 5 -agg_Pmx 4 -solver 1 -rlx 6 \ >> agg_interp.out.14 mpirun -np 8 ./ij -rhsrand -n 30 29 31 -P 2 2 2 -agg_nl 1 -agg_interp 5 -agg_tr 0.3 -solver 1 -rlx 6 \ >> agg_interp.out.15 mpirun -np 8 ./ij -rhsrand -n 30 29 31 -P 2 2 2 -agg_nl 1 -agg_interp 6 -agg_Pmx 4 -agg_P12_mx 4 -solver 1 -rlx 6 \ >> agg_interp.out.16 mpirun -np 8 ./ij -rhsrand -n 20 19 22 -P 2 2 2 -sysL 3 -nf 3 -agg_nl 10 -interptype 16 -agg_interp 5 -agg_Pmx 4 -agg_P12_mx 4 -solver 1 -rlx 6 \ >> agg_interp.out.17 mpirun -np 8 ./ij -rhsrand -n 20 19 22 -P 2 2 2 -sysL 3 -nf 3 -agg_nl 10 -interptype 17 -agg_interp 5 -agg_tr 0.2 -agg_P12_tr 0.2 -nodal 1 -solver 1 -rlx 6 \ >> agg_interp.out.18 mpirun -np 8 ./ij -rhsrand -n 30 29 31 -P 2 2 2 -agg_nl 1 -agg_interp 7 -interptype 18 -agg_tr 0.3 -solver 1 -rlx 8 \ >> agg_interp.out.19 mpirun -np 8 ./ij -rhsrand -n 30 29 31 -P 2 2 2 -agg_nl 1 -agg_interp 7 -interptype 18 -agg_tr 0.3 -solver 1 -rlx 88 \ >> agg_interp.out.19.1 mpirun -np 8 ./ij -rhsrand -n 30 29 31 -P 2 2 2 -agg_nl 1 -agg_interp 7 -interptype 18 -agg_tr 0.3 -solver 1 -rlx 89 \ >> agg_interp.out.19.2 mpirun -np 8 ./ij -rhsrand -n 30 29 31 -P 2 2 2 -agg_nl 10 -agg_interp 7 -agg_Pmx 4 -agg_P12_mx 4 -solver 1 -rlx 6 \ >> agg_interp.out.20 mpirun -np 2 ./ij -fromfile tst -agg_nl 1 -agg_interp 8 \ >> agg_interp.out.21 mpirun -np 8 ./ij -rhsrand -n 30 29 31 -P 2 2 2 -agg_nl 10 -agg_interp 8 -agg_Pmx 4 -agg_P12_mx 4 -solver 1 -rlx 6 \ >> agg_interp.out.22 hypre-2.33.0/src/test/TEST_ij/agg_interp.saved000066400000000000000000000060141477326011500211070ustar00rootroot00000000000000# Output file: agg_interp.out.1 Iterations = 9 Final Relative Residual Norm = 4.609095e-09 # Output file: agg_interp.out.2 Iterations = 9 Final Relative Residual Norm = 3.785900e-09 # Output file: agg_interp.out.3 Iterations = 10 Final Relative Residual Norm = 7.511453e-09 # Output file: agg_interp.out.4 Iterations = 12 Final Relative Residual Norm = 3.507939e-09 # Output file: agg_interp.out.4.1 Iterations = 12 Final Relative Residual Norm = 3.309428e-09 # Output file: agg_interp.out.4.2 Iterations = 12 Final Relative Residual Norm = 3.507939e-09 # Output file: agg_interp.out.5 Iterations = 10 Final Relative Residual Norm = 7.390297e-09 # Output file: agg_interp.out.6 Iterations = 10 Final Relative Residual Norm = 5.579282e-09 # Output file: agg_interp.out.7 Iterations = 12 Final Relative Residual Norm = 5.781132e-09 # Output file: agg_interp.out.8 Iterations = 15 Final Relative Residual Norm = 5.637036e-09 # Output file: agg_interp.out.8.1 Iterations = 15 Final Relative Residual Norm = 6.004315e-09 # Output file: agg_interp.out.8.2 Iterations = 15 Final Relative Residual Norm = 5.637036e-09 # Output file: agg_interp.out.9 Iterations = 10 Final Relative Residual Norm = 4.335635e-09 # Output file: agg_interp.out.10 Iterations = 22 Final Relative Residual Norm = 8.737365e-09 # Output file: agg_interp.out.10.1 Iterations = 22 Final Relative Residual Norm = 8.190338e-09 # Output file: agg_interp.out.10.2 Iterations = 22 Final Relative Residual Norm = 8.737365e-09 # Output file: agg_interp.out.11 Iterations = 17 Final Relative Residual Norm = 9.807905e-09 # Output file: agg_interp.out.12 Iterations = 20 Final Relative Residual Norm = 5.870410e-09 # Output file: agg_interp.out.12.1 Iterations = 20 Final Relative Residual Norm = 5.148867e-09 # Output file: agg_interp.out.12.2 Iterations = 20 Final Relative Residual Norm = 5.870410e-09 # Output file: agg_interp.out.13 Iterations = 16 Final Relative Residual Norm = 5.163837e-09 # Output file: agg_interp.out.14 Iterations = 10 Final Relative Residual Norm = 2.697794e-09 # Output file: agg_interp.out.15 Iterations = 10 Final Relative Residual Norm = 7.511453e-09 # Output file: agg_interp.out.16 Iterations = 9 Final Relative Residual Norm = 6.146679e-09 # Output file: agg_interp.out.17 Iterations = 17 Final Relative Residual Norm = 8.042925e-09 # Output file: agg_interp.out.18 Iterations = 16 Final Relative Residual Norm = 3.612041e-09 # Output file: agg_interp.out.19 Iterations = 10 Final Relative Residual Norm = 2.874370e-09 # Output file: agg_interp.out.19.1 Iterations = 10 Final Relative Residual Norm = 5.100843e-09 # Output file: agg_interp.out.19.2 Iterations = 9 Final Relative Residual Norm = 4.307036e-09 # Output file: agg_interp.out.20 Iterations = 11 Final Relative Residual Norm = 1.654514e-09 # Output file: agg_interp.out.21 BoomerAMG Iterations = 1 Final Relative Residual Norm = 0.000000e+00 # Output file: agg_interp.out.22 Iterations = 15 Final Relative Residual Norm = 6.535343e-09 hypre-2.33.0/src/test/TEST_ij/agg_interp.saved.aurora000066400000000000000000000060201477326011500223740ustar00rootroot00000000000000# Output file: agg_interp.out.1 Iterations = 10 Final Relative Residual Norm = 6.498298e-09 # Output file: agg_interp.out.2 Iterations = 10 Final Relative Residual Norm = 4.080317e-09 # Output file: agg_interp.out.3 Iterations = 12 Final Relative Residual Norm = 2.800234e-09 # Output file: agg_interp.out.4 Iterations = 14 Final Relative Residual Norm = 3.104296e-09 # Output file: agg_interp.out.4.1 Iterations = 14 Final Relative Residual Norm = 2.931926e-09 # Output file: agg_interp.out.4.2 Iterations = 14 Final Relative Residual Norm = 3.104296e-09 # Output file: agg_interp.out.5 Iterations = 11 Final Relative Residual Norm = 5.531986e-09 # Output file: agg_interp.out.6 Iterations = 11 Final Relative Residual Norm = 5.806018e-09 # Output file: agg_interp.out.7 Iterations = 14 Final Relative Residual Norm = 4.328016e-09 # Output file: agg_interp.out.8 Iterations = 16 Final Relative Residual Norm = 8.158525e-09 # Output file: agg_interp.out.8.1 Iterations = 17 Final Relative Residual Norm = 3.991337e-09 # Output file: agg_interp.out.8.2 Iterations = 16 Final Relative Residual Norm = 8.158525e-09 # Output file: agg_interp.out.9 Iterations = 12 Final Relative Residual Norm = 2.787662e-09 # Output file: agg_interp.out.10 Iterations = 25 Final Relative Residual Norm = 7.794962e-09 # Output file: agg_interp.out.10.1 Iterations = 25 Final Relative Residual Norm = 7.309743e-09 # Output file: agg_interp.out.10.2 Iterations = 25 Final Relative Residual Norm = 7.794962e-09 # Output file: agg_interp.out.11 Iterations = 18 Final Relative Residual Norm = 9.111019e-09 # Output file: agg_interp.out.12 Iterations = 22 Final Relative Residual Norm = 5.756606e-09 # Output file: agg_interp.out.12.1 Iterations = 22 Final Relative Residual Norm = 4.462172e-09 # Output file: agg_interp.out.12.2 Iterations = 22 Final Relative Residual Norm = 5.756606e-09 # Output file: agg_interp.out.13 Iterations = 16 Final Relative Residual Norm = 6.401116e-09 # Output file: agg_interp.out.14 Iterations = 11 Final Relative Residual Norm = 7.565865e-09 # Output file: agg_interp.out.15 Iterations = 12 Final Relative Residual Norm = 2.808498e-09 # Output file: agg_interp.out.16 Iterations = 11 Final Relative Residual Norm = 1.781423e-09 # Output file: agg_interp.out.17 Iterations = 20 Final Relative Residual Norm = 8.742609e-09 # Output file: agg_interp.out.18 Iterations = 19 Final Relative Residual Norm = 3.903948e-09 # Output file: agg_interp.out.19 Iterations = 11 Final Relative Residual Norm = 2.045275e-09 # Output file: agg_interp.out.19.1 Iterations = 11 Final Relative Residual Norm = 3.407818e-09 # Output file: agg_interp.out.19.2 Iterations = 10 Final Relative Residual Norm = 4.782432e-09 # Output file: agg_interp.out.20 Iterations = 12 Final Relative Residual Norm = 2.136187e-09 # Output file: agg_interp.out.21 BoomerAMG Iterations = 9 Final Relative Residual Norm = 2.176372e-09 # Output file: agg_interp.out.22 Iterations = 17 Final Relative Residual Norm = 4.919351e-09 hypre-2.33.0/src/test/TEST_ij/agg_interp.saved.lassen000066400000000000000000000060201477326011500223700ustar00rootroot00000000000000# Output file: agg_interp.out.1 Iterations = 10 Final Relative Residual Norm = 4.175693e-09 # Output file: agg_interp.out.2 Iterations = 10 Final Relative Residual Norm = 3.083921e-09 # Output file: agg_interp.out.3 Iterations = 11 Final Relative Residual Norm = 6.408748e-09 # Output file: agg_interp.out.4 Iterations = 13 Final Relative Residual Norm = 9.962426e-09 # Output file: agg_interp.out.4.1 Iterations = 13 Final Relative Residual Norm = 9.947240e-09 # Output file: agg_interp.out.4.2 Iterations = 13 Final Relative Residual Norm = 9.962426e-09 # Output file: agg_interp.out.5 Iterations = 11 Final Relative Residual Norm = 5.655711e-09 # Output file: agg_interp.out.6 Iterations = 11 Final Relative Residual Norm = 3.179034e-09 # Output file: agg_interp.out.7 Iterations = 13 Final Relative Residual Norm = 8.027473e-09 # Output file: agg_interp.out.8 Iterations = 16 Final Relative Residual Norm = 8.359411e-09 # Output file: agg_interp.out.8.1 Iterations = 16 Final Relative Residual Norm = 7.750810e-09 # Output file: agg_interp.out.8.2 Iterations = 16 Final Relative Residual Norm = 8.359411e-09 # Output file: agg_interp.out.9 Iterations = 11 Final Relative Residual Norm = 7.218488e-09 # Output file: agg_interp.out.10 Iterations = 25 Final Relative Residual Norm = 8.200302e-09 # Output file: agg_interp.out.10.1 Iterations = 25 Final Relative Residual Norm = 8.671776e-09 # Output file: agg_interp.out.10.2 Iterations = 25 Final Relative Residual Norm = 8.200302e-09 # Output file: agg_interp.out.11 Iterations = 19 Final Relative Residual Norm = 4.180972e-09 # Output file: agg_interp.out.12 Iterations = 22 Final Relative Residual Norm = 4.656670e-09 # Output file: agg_interp.out.12.1 Iterations = 22 Final Relative Residual Norm = 5.415649e-09 # Output file: agg_interp.out.12.2 Iterations = 22 Final Relative Residual Norm = 4.656670e-09 # Output file: agg_interp.out.13 Iterations = 16 Final Relative Residual Norm = 9.072689e-09 # Output file: agg_interp.out.14 Iterations = 11 Final Relative Residual Norm = 4.051025e-09 # Output file: agg_interp.out.15 Iterations = 11 Final Relative Residual Norm = 6.606006e-09 # Output file: agg_interp.out.16 Iterations = 10 Final Relative Residual Norm = 4.938299e-09 # Output file: agg_interp.out.17 Iterations = 20 Final Relative Residual Norm = 6.711024e-09 # Output file: agg_interp.out.18 Iterations = 18 Final Relative Residual Norm = 5.325382e-09 # Output file: agg_interp.out.19 Iterations = 10 Final Relative Residual Norm = 6.953719e-09 # Output file: agg_interp.out.19.1 Iterations = 11 Final Relative Residual Norm = 1.959614e-09 # Output file: agg_interp.out.19.2 Iterations = 10 Final Relative Residual Norm = 2.361979e-09 # Output file: agg_interp.out.20 Iterations = 12 Final Relative Residual Norm = 2.442371e-09 # Output file: agg_interp.out.21 BoomerAMG Iterations = 9 Final Relative Residual Norm = 2.176372e-09 # Output file: agg_interp.out.22 Iterations = 16 Final Relative Residual Norm = 7.077723e-09 hypre-2.33.0/src/test/TEST_ij/agg_interp.saved.lassen_cpu000066400000000000000000000060141477326011500232420ustar00rootroot00000000000000# Output file: agg_interp.out.1 Iterations = 9 Final Relative Residual Norm = 4.675538e-09 # Output file: agg_interp.out.2 Iterations = 9 Final Relative Residual Norm = 3.807119e-09 # Output file: agg_interp.out.3 Iterations = 10 Final Relative Residual Norm = 7.511453e-09 # Output file: agg_interp.out.4 Iterations = 12 Final Relative Residual Norm = 3.507939e-09 # Output file: agg_interp.out.4.1 Iterations = 12 Final Relative Residual Norm = 3.309428e-09 # Output file: agg_interp.out.4.2 Iterations = 12 Final Relative Residual Norm = 3.507939e-09 # Output file: agg_interp.out.5 Iterations = 10 Final Relative Residual Norm = 7.397596e-09 # Output file: agg_interp.out.6 Iterations = 10 Final Relative Residual Norm = 5.088038e-09 # Output file: agg_interp.out.7 Iterations = 12 Final Relative Residual Norm = 5.781132e-09 # Output file: agg_interp.out.8 Iterations = 15 Final Relative Residual Norm = 5.637036e-09 # Output file: agg_interp.out.8.1 Iterations = 15 Final Relative Residual Norm = 6.004315e-09 # Output file: agg_interp.out.8.2 Iterations = 15 Final Relative Residual Norm = 5.637036e-09 # Output file: agg_interp.out.9 Iterations = 10 Final Relative Residual Norm = 4.335635e-09 # Output file: agg_interp.out.10 Iterations = 22 Final Relative Residual Norm = 8.737365e-09 # Output file: agg_interp.out.10.1 Iterations = 22 Final Relative Residual Norm = 8.190338e-09 # Output file: agg_interp.out.10.2 Iterations = 22 Final Relative Residual Norm = 8.737365e-09 # Output file: agg_interp.out.11 Iterations = 17 Final Relative Residual Norm = 9.807905e-09 # Output file: agg_interp.out.12 Iterations = 20 Final Relative Residual Norm = 5.870410e-09 # Output file: agg_interp.out.12.1 Iterations = 20 Final Relative Residual Norm = 5.148867e-09 # Output file: agg_interp.out.12.2 Iterations = 20 Final Relative Residual Norm = 5.870410e-09 # Output file: agg_interp.out.13 Iterations = 16 Final Relative Residual Norm = 5.163837e-09 # Output file: agg_interp.out.14 Iterations = 10 Final Relative Residual Norm = 2.493000e-09 # Output file: agg_interp.out.15 Iterations = 10 Final Relative Residual Norm = 7.511453e-09 # Output file: agg_interp.out.16 Iterations = 9 Final Relative Residual Norm = 6.146679e-09 # Output file: agg_interp.out.17 Iterations = 17 Final Relative Residual Norm = 7.573922e-09 # Output file: agg_interp.out.18 Iterations = 16 Final Relative Residual Norm = 5.577693e-09 # Output file: agg_interp.out.19 Iterations = 10 Final Relative Residual Norm = 2.864587e-09 # Output file: agg_interp.out.19.1 Iterations = 10 Final Relative Residual Norm = 5.100364e-09 # Output file: agg_interp.out.19.2 Iterations = 9 Final Relative Residual Norm = 4.344114e-09 # Output file: agg_interp.out.20 Iterations = 10 Final Relative Residual Norm = 5.375178e-09 # Output file: agg_interp.out.21 BoomerAMG Iterations = 1 Final Relative Residual Norm = 0.000000e+00 # Output file: agg_interp.out.22 Iterations = 15 Final Relative Residual Norm = 6.853574e-09 hypre-2.33.0/src/test/TEST_ij/agg_interp.sh000077500000000000000000000030161477326011500204210ustar00rootroot00000000000000#!/bin/bash # Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) TNAME=`basename $0 .sh` RTOL=$1 ATOL=$2 #============================================================================= # compare with baseline case #============================================================================= FILES="\ ${TNAME}.out.1\ ${TNAME}.out.2\ ${TNAME}.out.3\ ${TNAME}.out.4\ ${TNAME}.out.4.1\ ${TNAME}.out.4.2\ ${TNAME}.out.5\ ${TNAME}.out.6\ ${TNAME}.out.7\ ${TNAME}.out.8\ ${TNAME}.out.8.1\ ${TNAME}.out.8.2\ ${TNAME}.out.9\ ${TNAME}.out.10\ ${TNAME}.out.10.1\ ${TNAME}.out.10.2\ ${TNAME}.out.11\ ${TNAME}.out.12\ ${TNAME}.out.12.1\ ${TNAME}.out.12.2\ ${TNAME}.out.13\ ${TNAME}.out.14\ ${TNAME}.out.15\ ${TNAME}.out.16\ ${TNAME}.out.17\ ${TNAME}.out.18\ ${TNAME}.out.19\ ${TNAME}.out.19.1\ ${TNAME}.out.19.2\ ${TNAME}.out.20\ ${TNAME}.out.21\ ${TNAME}.out.22\ " for i in $FILES do echo "# Output file: $i" tail -5 $i done > ${TNAME}.out # Make sure that the output file is reasonable RUNCOUNT=`echo $FILES | wc -w` OUTCOUNT=`grep "Iterations" ${TNAME}.out | wc -l` if [ "$OUTCOUNT" != "$RUNCOUNT" ]; then echo "Incorrect number of runs in ${TNAME}.out" >&2 fi #============================================================================= # remove temporary files #============================================================================= rm -f ${TNAME}.testdata* hypre-2.33.0/src/test/TEST_ij/air.jobs000077500000000000000000000024371477326011500174060ustar00rootroot00000000000000#!/bin/bash # Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) #============================================================================= # ij: Run difconv problem with AIR and AIR GMRES #AIR standalone and with GMRES # Laplacian mpirun -np 2 ./ij -pmis -rhsrand -AIR 3 > air.out.20 mpirun -np 2 ./ij -pmis -rhsrand -AIR 4 > air.out.21 mpirun -np 2 ./ij -pmis -rhsrand -AIR 5 > air.out.22 mpirun -np 2 ./ij -solver 3 -pmis -rhsrand -AIR 3 > air.out.23 mpirun -np 2 ./ij -solver 3 -pmis -rhsrand -AIR 4 > air.out.24 mpirun -np 2 ./ij -solver 3 -pmis -rhsrand -AIR 5 > air.out.25 # Convection (with no diffusion) mpirun -np 2 ./ij -difconv -c 0.0 0.0 0.0 -atype 3 -pmis -rhsrand -AIR 3 > air.out.26 mpirun -np 2 ./ij -difconv -c 0.0 0.0 0.0 -atype 3 -pmis -rhsrand -AIR 4 > air.out.27 mpirun -np 2 ./ij -difconv -c 0.0 0.0 0.0 -atype 3 -pmis -rhsrand -AIR 5 > air.out.28 mpirun -np 2 ./ij -solver 3 -difconv -c 0.0 0.0 0.0 -atype 3 -pmis -rhsrand -AIR 3 > air.out.29 mpirun -np 2 ./ij -solver 3 -difconv -c 0.0 0.0 0.0 -atype 3 -pmis -rhsrand -AIR 4 > air.out.30 mpirun -np 2 ./ij -solver 3 -difconv -c 0.0 0.0 0.0 -atype 3 -pmis -rhsrand -AIR 5 > air.out.31 hypre-2.33.0/src/test/TEST_ij/air.saved000066400000000000000000000022301477326011500175370ustar00rootroot00000000000000# Output file: air.out.20 BoomerAMG Iterations = 24 Final Relative Residual Norm = 7.174911e-09 # Output file: air.out.21 BoomerAMG Iterations = 17 Final Relative Residual Norm = 4.404700e-09 # Output file: air.out.22 BoomerAMG Iterations = 15 Final Relative Residual Norm = 3.128157e-09 # Output file: air.out.23 GMRES Iterations = 14 Final GMRES Relative Residual Norm = 4.260195e-09 # Output file: air.out.24 GMRES Iterations = 11 Final GMRES Relative Residual Norm = 2.525739e-09 # Output file: air.out.25 GMRES Iterations = 10 Final GMRES Relative Residual Norm = 2.980381e-09 # Output file: air.out.26 BoomerAMG Iterations = 11 Final Relative Residual Norm = 1.195660e-10 # Output file: air.out.27 BoomerAMG Iterations = 10 Final Relative Residual Norm = 2.607892e-10 # Output file: air.out.28 BoomerAMG Iterations = 10 Final Relative Residual Norm = 9.100800e-10 # Output file: air.out.29 GMRES Iterations = 11 Final GMRES Relative Residual Norm = 4.903026e-09 # Output file: air.out.30 GMRES Iterations = 10 Final GMRES Relative Residual Norm = 2.788666e-10 # Output file: air.out.31 GMRES Iterations = 10 Final GMRES Relative Residual Norm = 1.923492e-09 hypre-2.33.0/src/test/TEST_ij/air.saved.aurora000066400000000000000000000022271477326011500210350ustar00rootroot00000000000000# Output file: air.out.20 BoomerAMG Iterations = 25 Final Relative Residual Norm = 5.387301e-09 # Output file: air.out.21 BoomerAMG Iterations = 18 Final Relative Residual Norm = 7.663841e-09 # Output file: air.out.22 BoomerAMG Iterations = 15 Final Relative Residual Norm = 4.043648e-09 # Output file: air.out.23 GMRES Iterations = 13 Final GMRES Relative Residual Norm = 9.567861e-09 # Output file: air.out.24 GMRES Iterations = 11 Final GMRES Relative Residual Norm = 5.102120e-09 # Output file: air.out.25 GMRES Iterations = 9 Final GMRES Relative Residual Norm = 9.575076e-09 # Output file: air.out.26 BoomerAMG Iterations = 11 Final Relative Residual Norm = 2.902926e-10 # Output file: air.out.27 BoomerAMG Iterations = 10 Final Relative Residual Norm = 3.965599e-09 # Output file: air.out.28 BoomerAMG Iterations = 10 Final Relative Residual Norm = 6.850225e-09 # Output file: air.out.29 GMRES Iterations = 11 Final GMRES Relative Residual Norm = 2.978902e-09 # Output file: air.out.30 GMRES Iterations = 10 Final GMRES Relative Residual Norm = 2.603853e-09 # Output file: air.out.31 GMRES Iterations = 10 Final GMRES Relative Residual Norm = 5.553389e-09 hypre-2.33.0/src/test/TEST_ij/air.saved.lassen000066400000000000000000000022301477326011500210230ustar00rootroot00000000000000# Output file: air.out.20 BoomerAMG Iterations = 25 Final Relative Residual Norm = 9.312591e-09 # Output file: air.out.21 BoomerAMG Iterations = 18 Final Relative Residual Norm = 7.891369e-09 # Output file: air.out.22 BoomerAMG Iterations = 16 Final Relative Residual Norm = 6.452598e-09 # Output file: air.out.23 GMRES Iterations = 14 Final GMRES Relative Residual Norm = 3.144844e-09 # Output file: air.out.24 GMRES Iterations = 11 Final GMRES Relative Residual Norm = 9.678669e-09 # Output file: air.out.25 GMRES Iterations = 10 Final GMRES Relative Residual Norm = 1.934858e-09 # Output file: air.out.26 BoomerAMG Iterations = 11 Final Relative Residual Norm = 1.541616e-09 # Output file: air.out.27 BoomerAMG Iterations = 10 Final Relative Residual Norm = 4.818763e-09 # Output file: air.out.28 BoomerAMG Iterations = 10 Final Relative Residual Norm = 4.701521e-09 # Output file: air.out.29 GMRES Iterations = 12 Final GMRES Relative Residual Norm = 1.821590e-09 # Output file: air.out.30 GMRES Iterations = 10 Final GMRES Relative Residual Norm = 3.031124e-09 # Output file: air.out.31 GMRES Iterations = 10 Final GMRES Relative Residual Norm = 6.029147e-09 hypre-2.33.0/src/test/TEST_ij/air.saved.lassen_cpu000066400000000000000000000022301477326011500216720ustar00rootroot00000000000000# Output file: air.out.20 BoomerAMG Iterations = 24 Final Relative Residual Norm = 7.174911e-09 # Output file: air.out.21 BoomerAMG Iterations = 17 Final Relative Residual Norm = 3.655624e-09 # Output file: air.out.22 BoomerAMG Iterations = 15 Final Relative Residual Norm = 3.128157e-09 # Output file: air.out.23 GMRES Iterations = 14 Final GMRES Relative Residual Norm = 4.260195e-09 # Output file: air.out.24 GMRES Iterations = 11 Final GMRES Relative Residual Norm = 2.336948e-09 # Output file: air.out.25 GMRES Iterations = 10 Final GMRES Relative Residual Norm = 2.980381e-09 # Output file: air.out.26 BoomerAMG Iterations = 11 Final Relative Residual Norm = 1.195660e-10 # Output file: air.out.27 BoomerAMG Iterations = 10 Final Relative Residual Norm = 2.607892e-10 # Output file: air.out.28 BoomerAMG Iterations = 10 Final Relative Residual Norm = 9.100800e-10 # Output file: air.out.29 GMRES Iterations = 11 Final GMRES Relative Residual Norm = 4.903657e-09 # Output file: air.out.30 GMRES Iterations = 10 Final GMRES Relative Residual Norm = 2.748050e-10 # Output file: air.out.31 GMRES Iterations = 10 Final GMRES Relative Residual Norm = 1.904458e-09 hypre-2.33.0/src/test/TEST_ij/air.sh000077500000000000000000000023251477326011500170570ustar00rootroot00000000000000#!/bin/bash # Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) TNAME=`basename $0 .sh` RTOL=$1 ATOL=$2 #============================================================================= # compare with baseline case #============================================================================= FILES="\ ${TNAME}.out.20\ ${TNAME}.out.21\ ${TNAME}.out.22\ ${TNAME}.out.23\ ${TNAME}.out.24\ ${TNAME}.out.25\ ${TNAME}.out.26\ ${TNAME}.out.27\ ${TNAME}.out.28\ ${TNAME}.out.29\ ${TNAME}.out.30\ ${TNAME}.out.31\ " for i in $FILES do echo "# Output file: $i" tail -3 $i done > ${TNAME}.out for i in $FILES do echo "# Output file: $i" tail -3 $i done > ${TNAME}.out # Make sure that the output file is reasonable RUNCOUNT=`echo $FILES | wc -w` OUTCOUNT=`grep "Iterations" ${TNAME}.out | wc -l` if [ "$OUTCOUNT" != "$RUNCOUNT" ]; then echo "Incorrect number of runs in ${TNAME}.out" >&2 fi #============================================================================= # remove temporary files #============================================================================= hypre-2.33.0/src/test/TEST_ij/amgdd.jobs000077500000000000000000000027421477326011500177060ustar00rootroot00000000000000#!/bin/bash # Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) #============================================================================= # ij: Run default case with different solvers # 90: BoomerAMGDD # 91: BoomerAMGDD_GMRES #BoomerAMG-DD mpirun -np 1 ./ij -solver 90 -rhsrand > amgdd.out.900 mpirun -np 2 ./ij -solver 90 -rhsrand > amgdd.out.901 mpirun -np 4 ./ij -solver 90 -rhsrand > amgdd.out.902 mpirun -np 4 ./ij -solver 90 -rhsrand -amgdd_start_level 2 > amgdd.out.903 mpirun -np 4 ./ij -solver 90 -rhsrand -amgdd_start_level 3 > amgdd.out.904 mpirun -np 4 ./ij -solver 90 -rhsrand -amgdd_padding 4 > amgdd.out.905 mpirun -np 4 ./ij -solver 90 -rhsrand -amgdd_padding 4 -amgdd_num_ghost_layers 4 > amgdd.out.906 mpirun -np 1 ./ij -solver 91 -rhsrand > amgdd.out.910 mpirun -np 2 ./ij -solver 91 -rhsrand > amgdd.out.911 mpirun -np 4 ./ij -solver 91 -rhsrand > amgdd.out.912 mpirun -np 4 ./ij -solver 91 -rhsrand -amgdd_num_comp_cycles 3 > amgdd.out.913 mpirun -np 4 ./ij -solver 91 -rhsrand -amgdd_fac_relax_type 0 > amgdd.out.914 mpirun -np 4 ./ij -solver 91 -rhsrand -amgdd_fac_relax_type 1 > amgdd.out.915 mpirun -np 4 ./ij -solver 91 -rhsrand -amgdd_fac_relax_type 2 > amgdd.out.916 mpirun -np 4 ./ij -solver 91 -rhsrand -amgdd_fac_cycle_type 2 > amgdd.out.917 mpirun -np 4 ./ij -solver 91 -rhsrand -amgdd_fac_cycle_type 3 > amgdd.out.918 hypre-2.33.0/src/test/TEST_ij/amgdd.saved000066400000000000000000000031371477326011500200470ustar00rootroot00000000000000# Output file: amgdd.out.900 BoomerAMG-DD Iterations = 5 Final Relative Residual Norm = 4.020669e-09 # Output file: amgdd.out.901 BoomerAMG-DD Iterations = 10 Final Relative Residual Norm = 5.609031e-09 # Output file: amgdd.out.902 BoomerAMG-DD Iterations = 10 Final Relative Residual Norm = 9.214818e-09 # Output file: amgdd.out.903 BoomerAMG-DD Iterations = 12 Final Relative Residual Norm = 3.122094e-09 # Output file: amgdd.out.904 BoomerAMG-DD Iterations = 12 Final Relative Residual Norm = 3.342726e-09 # Output file: amgdd.out.905 BoomerAMG-DD Iterations = 10 Final Relative Residual Norm = 4.924406e-09 # Output file: amgdd.out.906 BoomerAMG-DD Iterations = 10 Final Relative Residual Norm = 4.724593e-09 # Output file: amgdd.out.910 GMRES Iterations = 4 Final GMRES Relative Residual Norm = 6.132330e-09 # Output file: amgdd.out.911 GMRES Iterations = 7 Final GMRES Relative Residual Norm = 1.828326e-09 # Output file: amgdd.out.912 GMRES Iterations = 7 Final GMRES Relative Residual Norm = 5.755980e-09 # Output file: amgdd.out.913 GMRES Iterations = 6 Final GMRES Relative Residual Norm = 2.248814e-09 # Output file: amgdd.out.914 GMRES Iterations = 15 Final GMRES Relative Residual Norm = 4.036024e-09 # Output file: amgdd.out.915 GMRES Iterations = 5 Final GMRES Relative Residual Norm = 5.121200e-09 # Output file: amgdd.out.916 GMRES Iterations = 14 Final GMRES Relative Residual Norm = 5.260812e-03 # Output file: amgdd.out.917 GMRES Iterations = 7 Final GMRES Relative Residual Norm = 3.281089e-09 # Output file: amgdd.out.918 GMRES Iterations = 7 Final GMRES Relative Residual Norm = 1.828708e-09 hypre-2.33.0/src/test/TEST_ij/amgdd.saved.aurora000066400000000000000000000031401477326011500213310ustar00rootroot00000000000000# Output file: amgdd.out.900 BoomerAMG-DD Iterations = 10 Final Relative Residual Norm = 1.974236e-09 # Output file: amgdd.out.901 BoomerAMG-DD Iterations = 10 Final Relative Residual Norm = 6.283398e-09 # Output file: amgdd.out.902 BoomerAMG-DD Iterations = 10 Final Relative Residual Norm = 5.065796e-09 # Output file: amgdd.out.903 BoomerAMG-DD Iterations = 23 Final Relative Residual Norm = 9.593628e-09 # Output file: amgdd.out.904 BoomerAMG-DD Iterations = 23 Final Relative Residual Norm = 9.593628e-09 # Output file: amgdd.out.905 BoomerAMG-DD Iterations = 10 Final Relative Residual Norm = 4.862475e-09 # Output file: amgdd.out.906 BoomerAMG-DD Iterations = 10 Final Relative Residual Norm = 4.878252e-09 # Output file: amgdd.out.910 GMRES Iterations = 7 Final GMRES Relative Residual Norm = 9.651980e-10 # Output file: amgdd.out.911 GMRES Iterations = 7 Final GMRES Relative Residual Norm = 3.485453e-09 # Output file: amgdd.out.912 GMRES Iterations = 7 Final GMRES Relative Residual Norm = 4.261629e-09 # Output file: amgdd.out.913 GMRES Iterations = 6 Final GMRES Relative Residual Norm = 1.693835e-09 # Output file: amgdd.out.914 GMRES Iterations = 15 Final GMRES Relative Residual Norm = 3.189651e-09 # Output file: amgdd.out.915 GMRES Iterations = 5 Final GMRES Relative Residual Norm = 7.922017e-09 # Output file: amgdd.out.916 GMRES Iterations = 15 Final GMRES Relative Residual Norm = 3.188967e-03 # Output file: amgdd.out.917 GMRES Iterations = 7 Final GMRES Relative Residual Norm = 1.815824e-09 # Output file: amgdd.out.918 GMRES Iterations = 7 Final GMRES Relative Residual Norm = 1.073711e-09 hypre-2.33.0/src/test/TEST_ij/amgdd.saved.lassen000066400000000000000000000031401477326011500213250ustar00rootroot00000000000000# Output file: amgdd.out.900 BoomerAMG-DD Iterations = 11 Final Relative Residual Norm = 2.637142e-09 # Output file: amgdd.out.901 BoomerAMG-DD Iterations = 10 Final Relative Residual Norm = 5.434597e-09 # Output file: amgdd.out.902 BoomerAMG-DD Iterations = 11 Final Relative Residual Norm = 3.272845e-09 # Output file: amgdd.out.903 BoomerAMG-DD Iterations = 25 Final Relative Residual Norm = 6.508851e-09 # Output file: amgdd.out.904 BoomerAMG-DD Iterations = 25 Final Relative Residual Norm = 6.758206e-09 # Output file: amgdd.out.905 BoomerAMG-DD Iterations = 11 Final Relative Residual Norm = 2.682944e-09 # Output file: amgdd.out.906 BoomerAMG-DD Iterations = 11 Final Relative Residual Norm = 2.688644e-09 # Output file: amgdd.out.910 GMRES Iterations = 7 Final GMRES Relative Residual Norm = 2.783446e-09 # Output file: amgdd.out.911 GMRES Iterations = 7 Final GMRES Relative Residual Norm = 3.807194e-09 # Output file: amgdd.out.912 GMRES Iterations = 7 Final GMRES Relative Residual Norm = 6.374572e-09 # Output file: amgdd.out.913 GMRES Iterations = 6 Final GMRES Relative Residual Norm = 2.680719e-09 # Output file: amgdd.out.914 GMRES Iterations = 15 Final GMRES Relative Residual Norm = 3.887000e-09 # Output file: amgdd.out.915 GMRES Iterations = 5 Final GMRES Relative Residual Norm = 5.001224e-09 # Output file: amgdd.out.916 GMRES Iterations = 13 Final GMRES Relative Residual Norm = 1.087777e-03 # Output file: amgdd.out.917 GMRES Iterations = 7 Final GMRES Relative Residual Norm = 4.055942e-09 # Output file: amgdd.out.918 GMRES Iterations = 7 Final GMRES Relative Residual Norm = 2.041613e-09 hypre-2.33.0/src/test/TEST_ij/amgdd.saved.lassen_cpu000066400000000000000000000031371477326011500222020ustar00rootroot00000000000000# Output file: amgdd.out.900 BoomerAMG-DD Iterations = 5 Final Relative Residual Norm = 3.991216e-09 # Output file: amgdd.out.901 BoomerAMG-DD Iterations = 10 Final Relative Residual Norm = 5.653340e-09 # Output file: amgdd.out.902 BoomerAMG-DD Iterations = 10 Final Relative Residual Norm = 9.214818e-09 # Output file: amgdd.out.903 BoomerAMG-DD Iterations = 12 Final Relative Residual Norm = 3.122094e-09 # Output file: amgdd.out.904 BoomerAMG-DD Iterations = 12 Final Relative Residual Norm = 3.342726e-09 # Output file: amgdd.out.905 BoomerAMG-DD Iterations = 10 Final Relative Residual Norm = 4.924406e-09 # Output file: amgdd.out.906 BoomerAMG-DD Iterations = 10 Final Relative Residual Norm = 4.724593e-09 # Output file: amgdd.out.910 GMRES Iterations = 4 Final GMRES Relative Residual Norm = 6.125599e-09 # Output file: amgdd.out.911 GMRES Iterations = 7 Final GMRES Relative Residual Norm = 1.821559e-09 # Output file: amgdd.out.912 GMRES Iterations = 7 Final GMRES Relative Residual Norm = 5.755980e-09 # Output file: amgdd.out.913 GMRES Iterations = 6 Final GMRES Relative Residual Norm = 2.248814e-09 # Output file: amgdd.out.914 GMRES Iterations = 15 Final GMRES Relative Residual Norm = 4.036024e-09 # Output file: amgdd.out.915 GMRES Iterations = 5 Final GMRES Relative Residual Norm = 5.121200e-09 # Output file: amgdd.out.916 GMRES Iterations = 14 Final GMRES Relative Residual Norm = 5.260812e-03 # Output file: amgdd.out.917 GMRES Iterations = 7 Final GMRES Relative Residual Norm = 3.281089e-09 # Output file: amgdd.out.918 GMRES Iterations = 7 Final GMRES Relative Residual Norm = 1.828708e-09 hypre-2.33.0/src/test/TEST_ij/amgdd.sh000077500000000000000000000023351477326011500173610ustar00rootroot00000000000000#!/bin/bash # Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) TNAME=`basename $0 .sh` RTOL=$1 ATOL=$2 #============================================================================= # compare with baseline case #============================================================================= FILES="\ ${TNAME}.out.900\ ${TNAME}.out.901\ ${TNAME}.out.902\ ${TNAME}.out.903\ ${TNAME}.out.904\ ${TNAME}.out.905\ ${TNAME}.out.906\ ${TNAME}.out.910\ ${TNAME}.out.911\ ${TNAME}.out.912\ ${TNAME}.out.913\ ${TNAME}.out.914\ ${TNAME}.out.915\ ${TNAME}.out.916\ ${TNAME}.out.917\ ${TNAME}.out.918\ " for i in $FILES do echo "# Output file: $i" tail -3 $i done > ${TNAME}.out # Make sure that the output file is reasonable RUNCOUNT=`echo $FILES | wc -w` OUTCOUNT=`grep "Iterations" ${TNAME}.out | wc -l` if [ "$OUTCOUNT" != "$RUNCOUNT" ]; then echo "Incorrect number of runs in ${TNAME}.out" >&2 fi #============================================================================= # remove temporary files #============================================================================= hypre-2.33.0/src/test/TEST_ij/assembly.jobs000077500000000000000000000011771477326011500204520ustar00rootroot00000000000000#!/bin/bash # Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) #============================================================================= # ij_assembly: Run default case #============================================================================= mpirun -np 1 ./ij_assembly > assembly.out.0 mpirun -np 2 ./ij_assembly > assembly.out.1 mpirun -np 3 ./ij_assembly > assembly.out.2 mpirun -np 7 ./ij_assembly > assembly.out.3 mpirun -np 7 ./ij_assembly -early 1 > assembly.out.4 hypre-2.33.0/src/test/TEST_ij/assembly.sh000077500000000000000000000023261477326011500201240ustar00rootroot00000000000000#!/bin/bash # Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) TNAME=`basename $0 .sh` RTOL=$1 ATOL=$2 #============================================================================= # compare with baseline case #============================================================================= FILES="\ ${TNAME}.out.0\ ${TNAME}.out.1\ ${TNAME}.out.2\ ${TNAME}.out.3\ ${TNAME}.out.4\ " for i in $FILES do echo "# Output file: $i" tail -1 $i done > ${TNAME}.out # Make sure that the output file is reasonable RUNCOUNT=`echo $FILES | wc -w` OUTCOUNT=`grep "error code" ${TNAME}.out | wc -l` if [ "$OUTCOUNT" != "$RUNCOUNT" ]; then echo "Incorrect number of runs in ${TNAME}.out" >&2 fi # Make sure that the output file has no errors for i in $FILES do echo "# Output file: $i" echo "Test error code = 0" done > ${TNAME}.testdata diff ${TNAME}.testdata ${TNAME}.out >&2 #============================================================================= # remove temporary files #============================================================================= rm -f ${TNAME}.testdata hypre-2.33.0/src/test/TEST_ij/b_tstoffd.00000000066400000000000000000000001621477326011500202750ustar00rootroot000000000000000 11 0 1.0 1 1.0 2 1.0 3 1.0 4 1.0 5 1.0 6 1.0 7 1.0 8 1.0 9 1.0 10 1.0 11 1.0 14 1.0 18 1.0 25 1.0 29 1.0 35 1.0 hypre-2.33.0/src/test/TEST_ij/b_tstoffd.00001000066400000000000000000000001351477326011500202760ustar00rootroot0000000000000012 16 12 1.0 13 1.0 14 1.0 15 1.0 16 1.0 5 1.0 6 1.0 7 1.0 8 1.0 11 1.0 19 1.0 25 1.0 36 1.0 hypre-2.33.0/src/test/TEST_ij/b_tstoffd.00002000066400000000000000000000002371477326011500203020ustar00rootroot0000000000000017 26 5 1.0 10 1.0 11 1.0 12 1.0 13 1.0 14 1.0 15 1.0 16 1.0 17 1.0 18 1.0 19 1.0 20 1.0 21 1.0 22 1.0 23 1.0 24 1.0 25 1.0 26 1.0 27 1.0 28 1.0 29 1.0 35 1.0 hypre-2.33.0/src/test/TEST_ij/b_tstoffd.00003000066400000000000000000000003361477326011500203030ustar00rootroot0000000000000027 39 10 1.0 5 1.0 11 1.0 12 1.0 13 1.0 14 1.0 15 1.0 16 1.0 17 1.0 18 1.0 19 1.0 20 1.0 21 1.0 22 1.0 23 1.0 24 1.0 25 1.0 26 1.0 27 1.0 28 1.0 29 1.0 30 1.0 31 1.0 32 1.0 33 1.0 34 1.0 35 1.0 36 1.0 37 1.0 38 1.0 39 1.0 hypre-2.33.0/src/test/TEST_ij/coarsening.jobs000077500000000000000000000042431477326011500207600ustar00rootroot00000000000000#!/bin/bash # Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) #============================================================================= # ij: Run default case with different coarsenings, hybrid GS, # 1: Cleary_LJP # 2: parallel Ruge # 3: Ruge 3rd pass, keep c points on boundary # 4: Falgout # ij: Run default case with low complexity coarsenings, hybrid GS, # 5: PMIS # 6: HMIS # 7: Falgout 2 levels aggressive coarsening # 8: HMIS 1 level aggressive coarsening # 9: Ruge 1 pass with global measures # 10: Ruge 1 pass coarsening # 11: CGC coarsening # 12: Ruge 3 coarsening # 13: CLJP1 fixed random coarsening # 14: PMIS1 fixed random coarsening #============================================================================= mpirun -np 4 ./ij -rhsrand -n 15 15 10 -P 2 2 1 -interptype 0 -Pmx 0 -cljp -27pt \ > coarsening.out.0 mpirun -np 4 ./ij -rhsrand -n 15 15 10 -P 2 2 1 -interptype 0 -Pmx 0 -ruge -27pt \ > coarsening.out.1 mpirun -np 4 ./ij -rhsrand -n 15 15 10 -P 2 2 1 -interptype 0 -Pmx 0 -ruge3c -gm -27pt \ > coarsening.out.2 mpirun -np 4 ./ij -rhsrand -n 15 15 10 -P 2 2 1 -interptype 0 -Pmx 0 -falgout -27pt \ > coarsening.out.3 mpirun -np 4 ./ij -rhsrand -n 15 15 10 -P 2 2 1 -pmis -27pt \ > coarsening.out.4 mpirun -np 4 ./ij -rhsrand -n 15 15 10 -P 2 2 1 -27pt \ > coarsening.out.5 mpirun -np 4 ./ij -rhsrand -n 60 60 30 -P 2 2 1 -falgout -interptype 0 -Pmx 0 -agg_nl 2 -27pt -rlx 6 -solver 1 \ > coarsening.out.6 mpirun -np 4 ./ij -rhsrand -n 60 60 30 -P 2 2 1 -agg_nl 1 -27pt -rlx 6 -solver 1 \ > coarsening.out.7 mpirun -np 2 ./ij -ruge1p -gm > coarsening.out.8 mpirun -np 8 ./ij -P 2 2 2 -ruge1p > coarsening.out.9 #mpirun -np 8 ./ij -P 2 2 2 -cgc -interptype 0 -Pmx 0 > coarsening.out.10 mpirun -np 8 ./ij -P 2 2 2 -ruge3 -interptype 0 -Pmx 0 > coarsening.out.11 mpirun -np 8 ./ij -P 2 2 2 -cljp1 -interptype 0 -Pmx 0 > coarsening.out.12 mpirun -np 8 ./ij -P 2 2 2 -pmis1 > coarsening.out.13 mpirun -np 1 ./ij -n 2 2 2 -agg_nl 1 -mxrs 0.1 > coarsening.out.14 hypre-2.33.0/src/test/TEST_ij/coarsening.saved000066400000000000000000000037171477326011500211270ustar00rootroot00000000000000# Output file: coarsening.out.0 Average Convergence Factor = 0.094028 Complexity: grid = 1.220000 operator = 1.408310 cycle = 2.816445 # Output file: coarsening.out.1 Average Convergence Factor = 0.124105 Complexity: grid = 1.190222 operator = 1.269219 cycle = 2.538129 # Output file: coarsening.out.2 Average Convergence Factor = 0.121893 Complexity: grid = 1.236444 operator = 1.378931 cycle = 2.756625 # Output file: coarsening.out.3 Average Convergence Factor = 0.114604 Complexity: grid = 1.204889 operator = 1.315634 cycle = 2.631094 # Output file: coarsening.out.4 Average Convergence Factor = 0.126924 Complexity: grid = 1.104889 operator = 1.161632 cycle = 2.322568 # Output file: coarsening.out.5 Average Convergence Factor = 0.115880 Complexity: grid = 1.130222 operator = 1.225044 cycle = 2.449915 # Output file: coarsening.out.6 Iterations = 12 Final Relative Residual Norm = 3.821883e-09 # Output file: coarsening.out.7 Iterations = 11 Final Relative Residual Norm = 7.350494e-09 # Output file: coarsening.out.8 BoomerAMG Iterations = 13 Final Relative Residual Norm = 3.043813e-09 # Output file: coarsening.out.9 BoomerAMG Iterations = 15 Final Relative Residual Norm = 3.616706e-09 # Output file: coarsening.out.10 #BoomerAMG Iterations = 16 #Final Relative Residual Norm = 3.804106e-09 # Output file: coarsening.out.11 BoomerAMG Iterations = 13 Final Relative Residual Norm = 5.238459e-09 # Output file: coarsening.out.12 BoomerAMG Iterations = 13 Final Relative Residual Norm = 2.784140e-09 # Output file: coarsening.out.13 BoomerAMG Iterations = 14 Final Relative Residual Norm = 3.301634e-09 # Output file: coarsening.out.14 BoomerAMG Iterations = 10 Final Relative Residual Norm = 7.834527e-09 hypre-2.33.0/src/test/TEST_ij/coarsening.saved.aurora000066400000000000000000000035461477326011500224170ustar00rootroot00000000000000# Output file: coarsening.out.0 Average Convergence Factor = 0.326124 Complexity: grid = 1.220000 operator = 1.408310 cycle = 2.816445 # Output file: coarsening.out.1 Average Convergence Factor = 0.357477 Complexity: grid = 1.190222 operator = 1.269219 cycle = 2.538129 # Output file: coarsening.out.2 Average Convergence Factor = 0.356426 Complexity: grid = 1.236444 operator = 1.378931 cycle = 2.756625 # Output file: coarsening.out.3 Average Convergence Factor = 0.347564 Complexity: grid = 1.202667 operator = 1.314765 cycle = 2.628293 # Output file: coarsening.out.4 Average Convergence Factor = 0.438291 Complexity: grid = 1.107556 operator = 1.162559 cycle = 2.323882 # Output file: coarsening.out.5 Average Convergence Factor = 0.438291 Complexity: grid = 1.107556 operator = 1.162559 cycle = 2.323882 # Output file: coarsening.out.6 Iterations = 12 Final Relative Residual Norm = 4.310193e-09 # Output file: coarsening.out.7 Iterations = 13 Final Relative Residual Norm = 3.231950e-09 # Output file: coarsening.out.8 BoomerAMG Iterations = 21 Final Relative Residual Norm = 5.651891e-09 # Output file: coarsening.out.9 BoomerAMG Iterations = 26 Final Relative Residual Norm = 9.810361e-09 # Output file: coarsening.out.11 BoomerAMG Iterations = 20 Final Relative Residual Norm = 9.665671e-09 # Output file: coarsening.out.12 BoomerAMG Iterations = 15 Final Relative Residual Norm = 3.865632e-09 # Output file: coarsening.out.13 BoomerAMG Iterations = 24 Final Relative Residual Norm = 8.745416e-09 # Output file: coarsening.out.14 BoomerAMG Iterations = 10 Final Relative Residual Norm = 7.834527e-09 hypre-2.33.0/src/test/TEST_ij/coarsening.saved.lassen000066400000000000000000000035461477326011500224130ustar00rootroot00000000000000# Output file: coarsening.out.0 Average Convergence Factor = 0.326124 Complexity: grid = 1.220000 operator = 1.408310 cycle = 2.816445 # Output file: coarsening.out.1 Average Convergence Factor = 0.357477 Complexity: grid = 1.190222 operator = 1.269219 cycle = 2.538129 # Output file: coarsening.out.2 Average Convergence Factor = 0.356426 Complexity: grid = 1.236444 operator = 1.378931 cycle = 2.756625 # Output file: coarsening.out.3 Average Convergence Factor = 0.347564 Complexity: grid = 1.202667 operator = 1.314765 cycle = 2.628293 # Output file: coarsening.out.4 Average Convergence Factor = 0.427073 Complexity: grid = 1.102222 operator = 1.158928 cycle = 2.317160 # Output file: coarsening.out.5 Average Convergence Factor = 0.427073 Complexity: grid = 1.102222 operator = 1.158928 cycle = 2.317160 # Output file: coarsening.out.6 Iterations = 12 Final Relative Residual Norm = 3.729996e-09 # Output file: coarsening.out.7 Iterations = 13 Final Relative Residual Norm = 2.767220e-09 # Output file: coarsening.out.8 BoomerAMG Iterations = 21 Final Relative Residual Norm = 5.651891e-09 # Output file: coarsening.out.9 BoomerAMG Iterations = 26 Final Relative Residual Norm = 9.673887e-09 # Output file: coarsening.out.11 BoomerAMG Iterations = 20 Final Relative Residual Norm = 9.665671e-09 # Output file: coarsening.out.12 BoomerAMG Iterations = 15 Final Relative Residual Norm = 3.865632e-09 # Output file: coarsening.out.13 BoomerAMG Iterations = 24 Final Relative Residual Norm = 9.339080e-09 # Output file: coarsening.out.14 BoomerAMG Iterations = 10 Final Relative Residual Norm = 7.834527e-09 hypre-2.33.0/src/test/TEST_ij/coarsening.saved.lassen_cpu000066400000000000000000000035461477326011500232620ustar00rootroot00000000000000# Output file: coarsening.out.0 Average Convergence Factor = 0.094028 Complexity: grid = 1.220000 operator = 1.408310 cycle = 2.816445 # Output file: coarsening.out.1 Average Convergence Factor = 0.124105 Complexity: grid = 1.190222 operator = 1.269219 cycle = 2.538129 # Output file: coarsening.out.2 Average Convergence Factor = 0.121893 Complexity: grid = 1.236444 operator = 1.378931 cycle = 2.756625 # Output file: coarsening.out.3 Average Convergence Factor = 0.114604 Complexity: grid = 1.204889 operator = 1.315634 cycle = 2.631094 # Output file: coarsening.out.4 Average Convergence Factor = 0.126924 Complexity: grid = 1.104889 operator = 1.161632 cycle = 2.322568 # Output file: coarsening.out.5 Average Convergence Factor = 0.115880 Complexity: grid = 1.130222 operator = 1.225044 cycle = 2.449915 # Output file: coarsening.out.6 Iterations = 12 Final Relative Residual Norm = 3.821883e-09 # Output file: coarsening.out.7 Iterations = 11 Final Relative Residual Norm = 7.519111e-09 # Output file: coarsening.out.8 BoomerAMG Iterations = 13 Final Relative Residual Norm = 3.043813e-09 # Output file: coarsening.out.9 BoomerAMG Iterations = 15 Final Relative Residual Norm = 3.616706e-09 # Output file: coarsening.out.11 BoomerAMG Iterations = 13 Final Relative Residual Norm = 5.238459e-09 # Output file: coarsening.out.12 BoomerAMG Iterations = 13 Final Relative Residual Norm = 2.784140e-09 # Output file: coarsening.out.13 BoomerAMG Iterations = 14 Final Relative Residual Norm = 3.301634e-09 # Output file: coarsening.out.14 BoomerAMG Iterations = 10 Final Relative Residual Norm = 7.834527e-09 hypre-2.33.0/src/test/TEST_ij/coarsening.sh000077500000000000000000000032011477326011500204260ustar00rootroot00000000000000#!/bin/bash # Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) TNAME=`basename $0 .sh` RTOL=$1 ATOL=$2 #============================================================================= # compare with baseline case #============================================================================= FILES="\ ${TNAME}.out.0\ ${TNAME}.out.1\ ${TNAME}.out.2\ ${TNAME}.out.3\ ${TNAME}.out.4\ ${TNAME}.out.5\ " for i in $FILES do echo "# Output file: $i" tail -21 $i | head -6 done > ${TNAME}.out.a # Make sure that the output file is reasonable RUNCOUNT=`echo $FILES | wc -w` OUTCOUNT=`grep "Complexity" ${TNAME}.out.a | wc -l` if [ "$OUTCOUNT" != "$RUNCOUNT" ]; then echo "Incorrect number of runs in ${TNAME}.out" >&2 fi FILES="\ ${TNAME}.out.6\ ${TNAME}.out.7\ ${TNAME}.out.8\ ${TNAME}.out.9\ ${TNAME}.out.11\ ${TNAME}.out.12\ ${TNAME}.out.13\ ${TNAME}.out.14\ " #${TNAME}.out.10\ for i in $FILES do echo "# Output file: $i" tail -3 $i done > ${TNAME}.out.b # Make sure that the output file is reasonable RUNCOUNT=`echo $FILES | wc -w` OUTCOUNT=`grep "Iterations" ${TNAME}.out.b | wc -l` if [ "$OUTCOUNT" != "$RUNCOUNT" ]; then echo "Incorrect number of runs in ${TNAME}.out" >&2 fi # put all of the output files together cat ${TNAME}.out.[a-z] > ${TNAME}.out #============================================================================= # remove temporary files #============================================================================= rm -f ${TNAME}.testdata* ${TNAME}.testdata.tmp0 hypre-2.33.0/src/test/TEST_ij/data/000077500000000000000000000000001477326011500166545ustar00rootroot00000000000000hypre-2.33.0/src/test/TEST_ij/data/beam_hex_dof459_np2/000077500000000000000000000000001477326011500222755ustar00rootroot00000000000000hypre-2.33.0/src/test/TEST_ij/data/beam_hex_dof459_np2/A.IJ.00000000066400000000000000000012050231477326011500233420ustar00rootroot000000000000000 242 0 242 0 0 1.00000000000000e+00 0 233 0.00000000000000e+00 0 173 0.00000000000000e+00 0 86 0.00000000000000e+00 0 71 0.00000000000000e+00 0 170 0.00000000000000e+00 0 62 0.00000000000000e+00 0 2 0.00000000000000e+00 0 181 0.00000000000000e+00 0 232 0.00000000000000e+00 0 172 0.00000000000000e+00 0 85 0.00000000000000e+00 0 70 0.00000000000000e+00 0 169 0.00000000000000e+00 0 61 0.00000000000000e+00 0 1 0.00000000000000e+00 0 180 0.00000000000000e+00 0 231 0.00000000000000e+00 0 171 0.00000000000000e+00 0 84 0.00000000000000e+00 0 69 0.00000000000000e+00 0 168 0.00000000000000e+00 0 60 0.00000000000000e+00 0 182 0.00000000000000e+00 1 1 1.00000000000000e+00 1 233 0.00000000000000e+00 1 173 0.00000000000000e+00 1 86 0.00000000000000e+00 1 71 0.00000000000000e+00 1 170 0.00000000000000e+00 1 62 0.00000000000000e+00 1 2 0.00000000000000e+00 1 181 0.00000000000000e+00 1 232 0.00000000000000e+00 1 172 0.00000000000000e+00 1 85 0.00000000000000e+00 1 70 0.00000000000000e+00 1 169 0.00000000000000e+00 1 61 0.00000000000000e+00 1 182 0.00000000000000e+00 1 180 0.00000000000000e+00 1 231 0.00000000000000e+00 1 171 0.00000000000000e+00 1 84 0.00000000000000e+00 1 69 0.00000000000000e+00 1 168 0.00000000000000e+00 1 60 0.00000000000000e+00 1 0 0.00000000000000e+00 2 2 1.00000000000000e+00 2 233 0.00000000000000e+00 2 173 0.00000000000000e+00 2 86 0.00000000000000e+00 2 71 0.00000000000000e+00 2 170 0.00000000000000e+00 2 62 0.00000000000000e+00 2 182 0.00000000000000e+00 2 181 0.00000000000000e+00 2 232 0.00000000000000e+00 2 172 0.00000000000000e+00 2 85 0.00000000000000e+00 2 70 0.00000000000000e+00 2 169 0.00000000000000e+00 2 61 0.00000000000000e+00 2 1 0.00000000000000e+00 2 180 0.00000000000000e+00 2 231 0.00000000000000e+00 2 171 0.00000000000000e+00 2 84 0.00000000000000e+00 2 69 0.00000000000000e+00 2 168 0.00000000000000e+00 2 60 0.00000000000000e+00 2 0 0.00000000000000e+00 3 3 2.77777777777778e+01 3 191 -4.16666666666667e+00 3 188 -2.54787510534094e-17 3 98 1.84178844050975e-16 3 235 -2.08333333333333e+00 3 190 3.30681662608079e-17 3 187 -4.16666666666667e+00 3 97 2.14699135206442e-16 3 234 -3.47222222222222e+00 3 189 -4.86111111111111e+00 3 186 -4.86111111111111e+00 3 96 -5.55555555555555e+00 3 233 2.08333333333333e+00 3 176 1.92554305833426e-16 3 89 -1.50812522192734e-16 3 173 4.16666666666667e+00 3 170 -9.45424294407360e-17 3 65 8.88178419700125e-16 3 5 8.88178419700125e-16 3 62 -9.36750677027476e-17 3 232 2.08333333333333e+00 3 175 6.15826833971767e-17 3 88 -4.44089209850063e-16 3 172 1.30104260698261e-17 3 169 4.16666666666666e+00 3 64 -9.25908655302621e-17 3 4 -8.88178419700125e-16 3 61 -1.96891114523368e-16 3 231 -3.47222222222222e+00 3 174 -1.38888888888889e+00 3 87 5.55555555555556e+00 3 171 -4.86111111111112e+00 3 168 -4.86111111111111e+00 3 63 5.55555555555556e+00 3 236 -2.08333333333333e+00 3 60 -5.55555555555555e+00 4 4 2.77777777777778e+01 4 191 3.13984949151802e-16 4 188 6.94973592563208e-17 4 98 2.08333333333333e+00 4 235 -3.47222222222222e+00 4 190 -6.94444444444444e-01 4 187 -4.86111111111111e+00 4 97 2.77777777777778e+00 4 234 -2.08333333333333e+00 4 189 5.55111512312578e-17 4 186 -4.16666666666667e+00 4 96 2.53161207275365e-16 4 233 -2.08333333333333e+00 4 176 -8.33333333333333e+00 4 89 2.18141477104083e-16 4 173 1.50920942409982e-16 4 170 1.95590071916385e-16 4 65 -2.29891518148395e-16 4 5 8.33333333333333e+00 4 62 2.08333333333333e+00 4 232 -3.47222222222222e+00 4 175 -9.72222222222223e+00 4 88 5.55555555555556e+00 4 172 -6.94444444444445e-01 4 169 -4.86111111111111e+00 4 64 -1.11111111111111e+01 4 236 -2.08333333333333e+00 4 61 2.77777777777778e+00 4 231 2.08333333333333e+00 4 174 6.88468379528295e-17 4 87 -4.44089209850063e-16 4 171 -3.39355279987963e-17 4 168 4.16666666666666e+00 4 63 1.95562966862073e-17 4 3 0.00000000000000e+00 4 60 -2.07299455379228e-16 5 5 2.77777777777778e+01 5 191 -4.86111111111111e+00 5 188 -6.94444444444443e-01 5 98 2.77777777777778e+00 5 235 -2.08333333333333e+00 5 190 2.53486467927111e-16 5 187 1.63931368479808e-16 5 97 2.08333333333333e+00 5 234 -2.08333333333333e+00 5 189 -4.16666666666667e+00 5 186 1.41379963292110e-16 5 96 1.55908272403416e-16 5 233 -3.47222222222222e+00 5 176 -9.72222222222222e+00 5 89 -1.11111111111111e+01 5 173 -4.86111111111111e+00 5 170 -6.94444444444443e-01 5 65 5.55555555555556e+00 5 236 -3.47222222222222e+00 5 62 2.77777777777778e+00 5 232 -2.08333333333333e+00 5 175 -8.33333333333333e+00 5 88 3.33798743853975e-17 5 172 7.44846892497542e-17 5 169 1.56992474575901e-16 5 64 -1.81061762805079e-17 5 4 8.33333333333333e+00 5 61 2.08333333333333e+00 5 231 2.08333333333333e+00 5 174 1.72713406076941e-16 5 87 -5.13884724703817e-16 5 171 4.16666666666666e+00 5 168 4.11996825544492e-18 5 63 8.88178419700125e-16 5 3 8.88178419700125e-16 5 60 -9.87979229677416e-18 6 6 2.77777777777778e+01 6 206 -4.16666666666667e+00 6 203 -2.24321429487251e-16 6 122 2.15281893874153e-16 6 238 -2.08333333333333e+00 6 205 -9.26992857475106e-17 6 202 -4.16666666666667e+00 6 121 -9.34311222139383e-17 6 237 -3.47222222222222e+00 6 204 -4.86111111111112e+00 6 201 -4.86111111111111e+00 6 120 -5.55555555555556e+00 6 236 2.08333333333333e+00 6 194 5.13478148889135e-16 6 116 3.82940207321880e-16 6 191 4.16666666666667e+00 6 188 -1.08420217248550e-16 6 101 8.88178419700125e-16 6 8 3.55271367880050e-15 6 98 -9.74914593498966e-16 6 235 2.08333333333333e+00 6 193 2.26381413614973e-16 6 115 0.00000000000000e+00 6 190 -2.16840434497101e-17 6 187 4.16666666666667e+00 6 100 2.93276687657329e-16 6 7 -8.88178419700125e-16 6 97 -1.98625837999344e-16 6 234 -3.47222222222222e+00 6 192 -1.38888888888889e+00 6 114 5.55555555555556e+00 6 189 -4.86111111111111e+00 6 186 -4.86111111111111e+00 6 99 5.55555555555556e+00 6 239 -2.08333333333333e+00 6 96 -5.55555555555555e+00 7 7 2.77777777777778e+01 7 206 -3.64291929955129e-16 7 203 -3.84891771232354e-17 7 122 2.08333333333333e+00 7 238 -3.47222222222222e+00 7 205 -6.94444444444445e-01 7 202 -4.86111111111111e+00 7 121 2.77777777777778e+00 7 237 -2.08333333333333e+00 7 204 -6.93889390390723e-18 7 201 -4.16666666666667e+00 7 120 1.94397449526651e-16 7 236 -2.08333333333333e+00 7 194 -8.33333333333333e+00 7 116 8.32016747165376e-16 7 191 2.64545330086463e-16 7 188 4.56882795485392e-16 7 101 6.76054264653336e-16 7 8 8.33333333333333e+00 7 98 2.08333333333333e+00 7 235 -3.47222222222222e+00 7 193 -9.72222222222223e+00 7 115 5.55555555555556e+00 7 190 -6.94444444444444e-01 7 187 -4.86111111111111e+00 7 100 -1.11111111111111e+01 7 239 -2.08333333333333e+00 7 97 2.77777777777778e+00 7 234 2.08333333333333e+00 7 192 1.42897846333589e-16 7 114 0.00000000000000e+00 7 189 -4.84638371101020e-17 7 186 4.16666666666666e+00 7 99 2.90755917606300e-16 7 6 -8.88178419700125e-16 7 96 -1.21511958481313e-16 8 8 2.77777777777778e+01 8 206 -4.86111111111111e+00 8 203 -6.94444444444444e-01 8 122 2.77777777777777e+00 8 238 -2.08333333333333e+00 8 205 -3.07262895682392e-16 8 202 -1.05818132034585e-16 8 121 2.08333333333333e+00 8 237 -2.08333333333333e+00 8 204 -4.16666666666667e+00 8 201 -1.30104260698261e-16 8 120 2.67147415300428e-16 8 236 -3.47222222222222e+00 8 194 -9.72222222222222e+00 8 116 -1.11111111111111e+01 8 191 -4.86111111111111e+00 8 188 -6.94444444444444e-01 8 101 5.55555555555556e+00 8 239 -3.47222222222222e+00 8 98 2.77777777777778e+00 8 235 -2.08333333333333e+00 8 193 -8.33333333333333e+00 8 115 4.13053922662665e-16 8 190 1.96782694306119e-16 8 187 4.90059381963448e-16 8 100 1.03259414907519e-15 8 7 8.33333333333333e+00 8 97 2.08333333333333e+00 8 234 2.08333333333333e+00 8 192 2.63786388565723e-16 8 114 2.64260727016186e-16 8 189 4.16666666666666e+00 8 186 -1.64690310000548e-16 8 99 8.88178419700125e-16 8 6 3.55271367880050e-15 8 96 -1.13957779844520e-15 9 9 2.77777777777778e+01 9 221 -4.16666666666667e+00 9 218 1.61220863048595e-16 9 146 -8.16729496533330e-16 9 241 -2.08333333333333e+00 9 220 -9.44340092234874e-17 9 217 -4.16666666666667e+00 9 145 -4.88297553433159e-16 9 240 -3.47222222222222e+00 9 219 -4.86111111111111e+00 9 216 -4.86111111111111e+00 9 144 -5.55555555555555e+00 9 239 2.08333333333333e+00 9 209 -7.80625564189563e-18 9 140 9.38810661155198e-16 9 206 4.16666666666667e+00 9 203 -1.11022302462516e-16 9 125 4.44089209850063e-16 9 11 2.66453525910038e-15 9 122 -1.14817010066215e-15 9 238 2.08333333333333e+00 9 208 -1.12757025938492e-17 9 139 -8.88178419700125e-16 9 205 2.25514051876985e-16 9 202 4.16666666666667e+00 9 124 -8.78203759713259e-18 9 10 0.00000000000000e+00 9 121 9.24824453130135e-16 9 237 -3.47222222222222e+00 9 207 -1.38888888888889e+00 9 138 5.55555555555555e+00 9 204 -4.86111111111111e+00 9 201 -4.86111111111111e+00 9 123 5.55555555555556e+00 9 242 -2.08333333333333e+00 9 120 -5.55555555555554e+00 10 10 2.77777777777778e+01 10 221 -2.60208521396521e-16 10 218 -5.33427468862868e-16 10 146 2.08333333333333e+00 10 241 -3.47222222222222e+00 10 220 -6.94444444444445e-01 10 217 -4.86111111111111e+00 10 145 2.77777777777778e+00 10 240 -2.08333333333333e+00 10 219 -2.86229373536173e-17 10 216 -4.16666666666667e+00 10 144 -4.28043017697277e-16 10 239 -2.08333333333333e+00 10 209 -8.33333333333334e+00 10 140 -5.41016884070267e-16 10 206 -4.11129463806503e-16 10 203 -5.38848479725296e-17 10 125 4.19355847790237e-16 10 11 8.33333333333333e+00 10 122 2.08333333333333e+00 10 238 -3.47222222222222e+00 10 208 -9.72222222222223e+00 10 139 5.55555555555556e+00 10 205 -6.94444444444444e-01 10 202 -4.86111111111111e+00 10 124 -1.11111111111111e+01 10 242 -2.08333333333333e+00 10 121 2.77777777777778e+00 10 237 2.08333333333333e+00 10 207 4.15249432061948e-17 10 138 -8.88178419700125e-16 10 204 2.67147415300428e-16 10 201 4.16666666666666e+00 10 123 -1.59513244626930e-17 10 9 -8.88178419700125e-16 10 120 9.10092856111488e-16 11 11 2.77777777777778e+01 11 221 -4.86111111111111e+00 11 218 -6.94444444444444e-01 11 146 2.77777777777778e+00 11 241 -2.08333333333333e+00 11 220 -3.72965547335014e-16 11 217 -5.52509427098613e-16 11 145 2.08333333333333e+00 11 240 -2.08333333333333e+00 11 219 -4.16666666666667e+00 11 216 1.00613961606655e-16 11 144 -9.26559176606112e-16 11 239 -3.47222222222222e+00 11 209 -9.72222222222222e+00 11 140 -1.11111111111111e+01 11 206 -4.86111111111111e+00 11 203 -6.94444444444443e-01 11 125 5.55555555555556e+00 11 242 -3.47222222222222e+00 11 122 2.77777777777778e+00 11 238 -2.08333333333333e+00 11 208 -8.33333333333334e+00 11 139 -6.01339182441929e-16 11 205 -2.68990558993654e-16 11 202 -6.41847686111419e-17 11 124 6.67001176513082e-16 11 10 8.33333333333333e+00 11 121 2.08333333333333e+00 11 237 2.08333333333333e+00 11 207 7.32920668600201e-17 11 138 7.98121876748048e-16 11 204 4.16666666666666e+00 11 201 -1.55257751099924e-16 11 123 4.44089209850063e-16 11 9 2.66453525910038e-15 11 120 -1.33897613049244e-15 12 12 1.41666666666667e+01 12 164 -8.04701628682319e-16 12 149 -2.04166666666667e+00 12 14 -4.08333333333333e+00 12 223 -2.15620707053055e-17 12 163 -2.04166666666667e+00 12 148 5.77337656848531e-17 12 13 -4.08333333333333e+00 12 222 -7.08333333333333e-01 12 162 2.83333333333334e+00 12 147 2.83333333333334e+00 12 224 8.09085871217308e-18 12 221 4.16666666666667e+00 12 218 1.27502175484295e-16 12 146 6.97358837342676e-16 12 241 2.08333333333333e+00 12 220 1.30104260698261e-17 12 217 4.16666666666667e+00 12 145 -8.67361737988404e-17 12 240 -3.47222222222222e+00 12 219 -4.86111111111112e+00 12 216 -4.86111111111111e+00 12 242 2.08333333333333e+00 12 144 -5.55555555555556e+00 12 449 -4.16666666666667e-02 12 392 -8.33333333333333e-02 12 389 -1.39082809939156e-18 12 293 2.28836538612590e-17 12 448 -4.16666666666667e-02 12 391 9.09713385351119e-19 12 388 -8.33333333333334e-02 12 292 1.43783842796417e-19 12 447 -6.94444444444445e-02 12 390 -9.72222222222222e-02 12 387 -9.72222222222222e-02 12 291 -1.11111111111111e-01 13 13 1.41666666666667e+01 13 164 2.26630441301466e-16 13 149 4.76153218551901e-17 13 14 4.25000000000000e+00 13 223 -4.95833333333333e+00 13 163 2.83333333333333e+00 13 148 -5.66666666666666e+00 13 224 -4.25000000000000e+00 13 222 -1.59089728153303e-17 13 162 -2.04166666666667e+00 13 147 1.73936098136302e-16 13 12 -4.08333333333333e+00 13 221 1.54390389361936e-16 13 218 -8.82540568403201e-17 13 146 2.08333333333333e+00 13 241 -3.47222222222222e+00 13 220 -6.94444444444446e-01 13 217 -4.86111111111111e+00 13 242 -2.08333333333333e+00 13 145 2.77777777777778e+00 13 240 2.08333333333333e+00 13 219 3.96817995129695e-17 13 216 4.16666666666666e+00 13 144 -1.59066011230780e-16 13 449 -4.16666666666667e-02 13 392 -7.99599102208060e-18 13 389 7.74357520379881e-18 13 293 4.16666666666666e-02 13 448 -6.94444444444444e-02 13 391 -1.38888888888889e-02 13 388 -9.72222222222222e-02 13 292 5.55555555555555e-02 13 447 -4.16666666666667e-02 13 390 7.45388993583784e-19 13 387 -8.33333333333334e-02 13 291 4.33680868994202e-19 14 14 1.41666666666667e+01 14 164 -5.66666666666666e+00 14 149 2.83333333333333e+00 14 224 -4.95833333333333e+00 14 223 -4.25000000000000e+00 14 163 -6.77708943515798e-17 14 148 -9.84404750640003e-17 14 13 4.25000000000000e+00 14 222 -1.57463424894574e-17 14 162 -3.83377276322663e-16 14 147 -2.04166666666667e+00 14 12 -4.08333333333333e+00 14 221 -4.86111111111111e+00 14 218 -6.94444444444444e-01 14 242 -3.47222222222222e+00 14 146 2.77777777777778e+00 14 241 -2.08333333333333e+00 14 220 3.31765864780564e-17 14 217 -2.25514051876985e-17 14 145 2.08333333333333e+00 14 240 2.08333333333333e+00 14 219 4.16666666666667e+00 14 216 1.71520783687207e-16 14 144 6.84876959831937e-16 14 449 -6.94444444444444e-02 14 392 -9.72222222222222e-02 14 389 -1.38888888888889e-02 14 293 5.55555555555555e-02 14 448 -4.16666666666667e-02 14 391 -7.70630575411962e-18 14 388 6.65429083362978e-18 14 292 4.16666666666666e-02 14 447 -4.16666666666667e-02 14 390 -8.33333333333333e-02 14 387 -2.84603070277445e-19 14 291 2.64477567450683e-17 15 15 1.00000000000000e+00 15 179 0.00000000000000e+00 15 233 0.00000000000000e+00 15 182 0.00000000000000e+00 15 17 0.00000000000000e+00 15 68 0.00000000000000e+00 15 170 0.00000000000000e+00 15 71 0.00000000000000e+00 15 94 0.00000000000000e+00 15 178 0.00000000000000e+00 15 232 0.00000000000000e+00 15 181 0.00000000000000e+00 15 16 0.00000000000000e+00 15 67 0.00000000000000e+00 15 169 0.00000000000000e+00 15 70 0.00000000000000e+00 15 93 0.00000000000000e+00 15 177 0.00000000000000e+00 15 231 0.00000000000000e+00 15 180 0.00000000000000e+00 15 95 0.00000000000000e+00 15 66 0.00000000000000e+00 15 168 0.00000000000000e+00 15 69 0.00000000000000e+00 16 16 1.00000000000000e+00 16 179 0.00000000000000e+00 16 233 0.00000000000000e+00 16 182 0.00000000000000e+00 16 17 0.00000000000000e+00 16 68 0.00000000000000e+00 16 170 0.00000000000000e+00 16 71 0.00000000000000e+00 16 94 0.00000000000000e+00 16 178 0.00000000000000e+00 16 232 0.00000000000000e+00 16 181 0.00000000000000e+00 16 95 0.00000000000000e+00 16 67 0.00000000000000e+00 16 169 0.00000000000000e+00 16 70 0.00000000000000e+00 16 93 0.00000000000000e+00 16 177 0.00000000000000e+00 16 231 0.00000000000000e+00 16 180 0.00000000000000e+00 16 15 0.00000000000000e+00 16 66 0.00000000000000e+00 16 168 0.00000000000000e+00 16 69 0.00000000000000e+00 17 17 1.00000000000000e+00 17 179 0.00000000000000e+00 17 233 0.00000000000000e+00 17 182 0.00000000000000e+00 17 95 0.00000000000000e+00 17 68 0.00000000000000e+00 17 170 0.00000000000000e+00 17 71 0.00000000000000e+00 17 94 0.00000000000000e+00 17 178 0.00000000000000e+00 17 232 0.00000000000000e+00 17 181 0.00000000000000e+00 17 16 0.00000000000000e+00 17 67 0.00000000000000e+00 17 169 0.00000000000000e+00 17 70 0.00000000000000e+00 17 93 0.00000000000000e+00 17 177 0.00000000000000e+00 17 231 0.00000000000000e+00 17 180 0.00000000000000e+00 17 15 0.00000000000000e+00 17 66 0.00000000000000e+00 17 168 0.00000000000000e+00 17 69 0.00000000000000e+00 18 18 2.77777777777778e+01 18 236 -2.08333333333333e+00 18 104 -9.62771529167128e-17 18 188 -7.92551788086904e-17 18 196 6.50521303491303e-17 18 235 2.08333333333333e+00 18 103 6.84131570838353e-17 18 187 4.16666666666666e+00 18 195 -4.86111111111111e+00 18 234 -3.47222222222222e+00 18 102 -5.55555555555555e+00 18 186 -4.86111111111111e+00 18 179 4.16666666666667e+00 18 92 1.24900090270330e-16 18 176 7.37257477290143e-17 18 233 2.08333333333333e+00 18 68 -2.15105711021124e-16 18 20 0.00000000000000e+00 18 65 8.88178419700125e-16 18 170 1.48318857196017e-16 18 178 -9.71445146547012e-17 18 91 8.88178419700125e-16 18 175 2.09251019289702e-17 18 232 -2.08333333333333e+00 18 67 -1.70870262383715e-16 18 19 0.00000000000000e+00 18 64 -3.43285512863223e-17 18 169 -4.16666666666667e+00 18 177 -4.86111111111111e+00 18 90 5.55555555555556e+00 18 174 -1.38888888888889e+00 18 231 -3.47222222222222e+00 18 66 -5.55555555555555e+00 18 197 -4.16666666666667e+00 18 63 5.55555555555556e+00 18 168 -4.86111111111111e+00 19 19 2.77777777777778e+01 19 236 2.08333333333333e+00 19 104 -2.08333333333333e+00 19 188 2.18575157973078e-16 19 196 -6.94444444444445e-01 19 235 -3.47222222222222e+00 19 103 2.77777777777778e+00 19 187 -4.86111111111111e+00 19 195 -4.85722573273506e-17 19 234 2.08333333333333e+00 19 102 -5.37764277552810e-17 19 186 4.16666666666667e+00 19 179 1.17961196366423e-16 19 92 -2.41993924898765e-16 19 176 8.33333333333333e+00 19 233 2.08333333333333e+00 19 68 -2.08333333333333e+00 19 20 -8.33333333333333e+00 19 65 2.59341159658533e-16 19 170 1.20563281580388e-16 19 178 -6.94444444444445e-01 19 91 5.55555555555556e+00 19 175 -9.72222222222223e+00 19 232 -3.47222222222222e+00 19 67 2.77777777777778e+00 19 197 1.11022302462516e-16 19 64 -1.11111111111111e+01 19 169 -4.86111111111111e+00 19 177 -8.32667268468867e-17 19 90 8.88178419700125e-16 19 174 6.85215773010839e-17 19 231 -2.08333333333333e+00 19 66 -2.15539391890118e-16 19 18 -8.88178419700125e-16 19 63 1.85398571495021e-17 19 168 -4.16666666666667e+00 20 20 2.77777777777778e+01 20 236 -3.47222222222222e+00 20 104 2.77777777777778e+00 20 188 -6.94444444444444e-01 20 196 -1.38777878078145e-17 20 235 2.08333333333333e+00 20 103 -2.08333333333333e+00 20 187 2.07407875596477e-16 20 195 -4.16666666666667e+00 20 234 -2.08333333333333e+00 20 102 -1.59594559789866e-16 20 186 -9.28077059647592e-17 20 179 -4.86111111111111e+00 20 92 -1.11111111111111e+01 20 176 -9.72222222222222e+00 20 233 -3.47222222222222e+00 20 68 2.77777777777778e+00 20 197 -4.86111111111111e+00 20 65 5.55555555555556e+00 20 170 -6.94444444444444e-01 20 178 2.14238349283136e-16 20 91 -3.71881345162528e-17 20 175 8.33333333333333e+00 20 232 2.08333333333333e+00 20 67 -2.08333333333333e+00 20 19 -8.33333333333333e+00 20 64 -7.84691322336384e-18 20 169 1.02782365951626e-16 20 177 4.16666666666667e+00 20 90 9.54097911787244e-18 20 174 2.70508442035133e-16 20 231 2.08333333333333e+00 20 66 -8.93382590128056e-17 20 18 0.00000000000000e+00 20 63 8.88178419700125e-16 20 168 8.99887803162969e-17 21 21 2.77777777777778e+01 21 239 -2.08333333333333e+00 21 128 -1.36089056690381e-15 21 203 -2.96312453740288e-16 21 211 -1.46584133720040e-16 21 238 2.08333333333333e+00 21 127 -1.56667213924155e-16 21 202 4.16666666666666e+00 21 210 -4.86111111111112e+00 21 237 -3.47222222222222e+00 21 126 -5.55555555555556e+00 21 201 -4.86111111111111e+00 21 197 4.16666666666667e+00 21 119 9.08995101411847e-16 21 194 4.57966997657877e-16 21 236 2.08333333333333e+00 21 104 -6.73072708679001e-16 21 23 1.77635683940025e-15 21 101 8.88178419700125e-16 21 188 2.60208521396521e-18 21 196 -2.77555756156289e-17 21 118 8.88178419700125e-16 21 193 1.30646361784503e-16 21 235 -2.08333333333333e+00 21 103 -3.39138439553466e-16 21 22 -8.88178419700125e-16 21 100 4.08825534189972e-16 21 187 -4.16666666666667e+00 21 195 -4.86111111111111e+00 21 117 5.55555555555556e+00 21 192 -1.38888888888889e+00 21 234 -3.47222222222222e+00 21 102 -5.55555555555555e+00 21 212 -4.16666666666667e+00 21 99 5.55555555555556e+00 21 186 -4.86111111111111e+00 22 22 2.77777777777778e+01 22 239 2.08333333333333e+00 22 128 -2.08333333333333e+00 22 203 8.30065183254902e-16 22 211 -6.94444444444446e-01 22 238 -3.47222222222222e+00 22 127 2.77777777777778e+00 22 202 -4.86111111111111e+00 22 210 -1.52655665885959e-16 22 237 2.08333333333333e+00 22 126 -2.78423117894278e-16 22 201 4.16666666666667e+00 22 197 2.98372437868011e-16 22 119 -7.77156117237610e-16 22 194 8.33333333333333e+00 22 236 2.08333333333333e+00 22 104 -2.08333333333333e+00 22 23 -8.33333333333333e+00 22 101 9.84021891747844e-16 22 188 -5.01335084557297e-16 22 196 -6.94444444444444e-01 22 118 5.55555555555556e+00 22 193 -9.72222222222223e+00 22 235 -3.47222222222222e+00 22 103 2.77777777777778e+00 22 212 8.32667268468867e-17 22 100 -1.11111111111111e+01 22 187 -4.86111111111111e+00 22 195 -5.81132364452230e-17 22 117 8.88178419700125e-16 22 192 1.16226472890446e-16 22 234 -2.08333333333333e+00 22 102 -3.02492406123456e-16 22 21 -8.88178419700125e-16 22 99 2.93276687657329e-16 22 186 -4.16666666666667e+00 23 23 2.77777777777778e+01 23 239 -3.47222222222222e+00 23 128 2.77777777777778e+00 23 203 -6.94444444444444e-01 23 211 8.50014503228635e-17 23 238 2.08333333333333e+00 23 127 -2.08333333333333e+00 23 202 8.49255561707896e-16 23 210 -4.16666666666667e+00 23 237 -2.08333333333333e+00 23 126 -1.40859546249317e-15 23 201 -2.47198095326695e-16 23 197 -4.86111111111111e+00 23 119 -1.11111111111111e+01 23 194 -9.72222222222222e+00 23 236 -3.47222222222222e+00 23 104 2.77777777777778e+00 23 212 -4.86111111111111e+00 23 101 5.55555555555556e+00 23 188 -6.94444444444444e-01 23 196 3.09648140461860e-16 23 118 -3.57461456268471e-16 23 193 8.33333333333333e+00 23 235 2.08333333333333e+00 23 103 -2.08333333333333e+00 23 22 -8.33333333333333e+00 23 100 8.91159975674460e-16 23 187 -4.36282954208167e-16 23 195 4.16666666666667e+00 23 117 7.39859562504108e-16 23 192 1.52764086103208e-16 23 234 2.08333333333333e+00 23 102 -5.03069808033274e-16 23 21 1.77635683940025e-15 23 99 8.88178419700125e-16 23 186 -4.42354486374086e-17 24 24 2.77777777777778e+01 24 242 -2.08333333333333e+00 24 152 6.75674793892966e-16 24 218 6.59194920871187e-17 24 226 -9.19403442267708e-17 24 241 2.08333333333333e+00 24 151 -4.39535560725623e-16 24 217 4.16666666666666e+00 24 225 -4.86111111111111e+00 24 240 -3.47222222222222e+00 24 150 -5.55555555555555e+00 24 216 -4.86111111111111e+00 24 212 4.16666666666667e+00 24 143 -9.78384040450919e-16 24 209 -4.94396190653390e-17 24 239 2.08333333333333e+00 24 128 4.64905891561784e-16 24 26 0.00000000000000e+00 24 125 4.44089209850063e-16 24 203 -1.23165366794353e-16 24 211 2.84494650060196e-16 24 142 8.88178419700125e-16 24 208 -5.42101086242752e-18 24 238 -2.08333333333333e+00 24 127 6.76542155630955e-16 24 25 -1.77635683940025e-15 24 124 -1.42166009867162e-17 24 202 -4.16666666666667e+00 24 210 -4.86111111111111e+00 24 141 5.55555555555555e+00 24 207 -1.38888888888889e+00 24 237 -3.47222222222222e+00 24 126 -5.55555555555555e+00 24 227 -4.16666666666667e+00 24 123 5.55555555555556e+00 24 201 -4.86111111111111e+00 25 25 2.77777777777778e+01 25 242 2.08333333333333e+00 25 152 -2.08333333333333e+00 25 218 -5.64652491430451e-16 25 226 -6.94444444444443e-01 25 241 -3.47222222222222e+00 25 151 2.77777777777778e+00 25 217 -4.86111111111111e+00 25 225 -9.02056207507940e-17 25 240 2.08333333333333e+00 25 150 -4.79651041107587e-16 25 216 4.16666666666667e+00 25 212 -5.96744875736022e-16 25 143 -1.10068204550728e-15 25 209 8.33333333333334e+00 25 239 2.08333333333333e+00 25 128 -2.08333333333333e+00 25 26 -8.33333333333334e+00 25 125 1.06251812903579e-15 25 203 -7.10369263412503e-16 25 211 -6.94444444444445e-01 25 142 5.55555555555556e+00 25 208 -9.72222222222223e+00 25 238 -3.47222222222222e+00 25 127 2.77777777777778e+00 25 227 8.32667268468867e-17 25 124 -1.11111111111111e+01 25 202 -4.86111111111111e+00 25 210 2.94035629178069e-16 25 141 8.88178419700125e-16 25 207 -2.51534904016637e-17 25 237 -2.08333333333333e+00 25 126 8.35160933465584e-16 25 24 -1.77635683940025e-15 25 123 9.87708179134295e-17 25 201 -4.16666666666667e+00 26 26 2.77777777777778e+01 26 242 -3.47222222222222e+00 26 152 2.77777777777778e+00 26 218 -6.94444444444443e-01 26 226 1.21430643318376e-17 26 241 2.08333333333333e+00 26 151 -2.08333333333333e+00 26 217 -5.58906219916278e-16 26 225 -4.16666666666667e+00 26 240 -2.08333333333333e+00 26 150 7.28583859910259e-16 26 216 -2.34187669256869e-17 26 212 -4.86111111111111e+00 26 143 -1.11111111111111e+01 26 209 -9.72222222222222e+00 26 239 -3.47222222222222e+00 26 128 2.77777777777778e+00 26 227 -4.86111111111111e+00 26 125 5.55555555555556e+00 26 203 -6.94444444444442e-01 26 211 -6.33174068731535e-16 26 142 -8.99670962728472e-16 26 208 8.33333333333334e+00 26 238 2.08333333333333e+00 26 127 -2.08333333333333e+00 26 25 -8.33333333333334e+00 26 124 5.58133725868382e-16 26 202 -6.57026516526216e-16 26 210 4.16666666666667e+00 26 141 -7.28583859910259e-16 26 207 8.08814820674186e-17 26 237 2.08333333333333e+00 26 126 5.16080234103100e-16 26 24 0.00000000000000e+00 26 123 4.44089209850063e-16 26 201 -1.04191828775857e-16 27 27 1.41666666666667e+01 27 224 -4.74202925190848e-17 27 29 -4.08333333333334e+00 27 149 -2.04166666666667e+00 27 166 2.04166666666667e+00 27 223 -1.50568576703924e-17 27 28 4.08333333333333e+00 27 148 6.63832426257404e-17 27 165 2.83333333333333e+00 27 222 -7.08333333333333e-01 27 167 2.92951427005583e-16 27 147 2.83333333333334e+00 27 242 2.08333333333333e+00 27 152 6.24500451351651e-17 27 218 2.59341159658533e-16 27 226 6.93889390390723e-17 27 241 -2.08333333333333e+00 27 151 -6.07153216591882e-18 27 217 -4.16666666666667e+00 27 225 -4.86111111111111e+00 27 240 -3.47222222222222e+00 27 150 -5.55555555555556e+00 27 227 4.16666666666667e+00 27 216 -4.86111111111111e+00 27 398 -8.33333333333334e-02 27 449 -4.16666666666667e-02 27 299 -3.46944695195361e-17 27 389 -3.22041926546085e-18 27 397 -6.77626357803440e-20 27 448 4.16666666666667e-02 27 298 -1.66696084019646e-18 27 388 8.33333333333334e-02 27 396 -9.72222222222223e-02 27 447 -6.94444444444445e-02 27 297 -1.11111111111111e-01 27 387 -9.72222222222222e-02 28 28 1.41666666666667e+01 28 224 4.25000000000000e+00 28 29 -4.25000000000000e+00 28 149 2.93661240615382e-16 28 166 2.83333333333333e+00 28 223 -4.95833333333333e+00 28 167 -5.69788899222601e-16 28 148 -5.66666666666666e+00 28 165 2.04166666666667e+00 28 222 -2.15485181781494e-17 28 27 4.08333333333333e+00 28 147 5.68664039468647e-17 28 242 2.08333333333333e+00 28 152 -2.08333333333333e+00 28 218 3.57353036051222e-16 28 226 -6.94444444444445e-01 28 241 -3.47222222222222e+00 28 151 2.77777777777778e+00 28 227 -2.22044604925031e-16 28 217 -4.86111111111111e+00 28 225 6.41847686111419e-17 28 240 -2.08333333333333e+00 28 150 -1.14925430283463e-17 28 216 -4.16666666666667e+00 28 398 -1.26851654180804e-17 28 449 4.16666666666667e-02 28 299 -4.16666666666667e-02 28 389 1.57073789738837e-17 28 397 -1.38888888888889e-02 28 448 -6.94444444444444e-02 28 298 5.55555555555555e-02 28 388 -9.72222222222222e-02 28 396 -5.42101086242752e-19 28 447 4.16666666666667e-02 28 297 -8.53809210832335e-19 28 387 8.33333333333334e-02 29 29 1.41666666666667e+01 29 224 -4.95833333333333e+00 29 167 -5.66666666666667e+00 29 149 2.83333333333333e+00 29 166 -2.25827454067469e-16 29 223 4.25000000000000e+00 29 28 -4.25000000000000e+00 29 148 1.88127711651075e-16 29 165 1.15860554657232e-16 29 222 4.23499532968205e-17 29 27 -4.08333333333334e+00 29 147 -2.04166666666667e+00 29 242 -3.47222222222222e+00 29 152 2.77777777777778e+00 29 227 -4.86111111111111e+00 29 218 -6.94444444444444e-01 29 226 -1.83880688453542e-16 29 241 2.08333333333333e+00 29 151 -2.08333333333333e+00 29 217 3.43041567374414e-16 29 225 4.16666666666667e+00 29 240 2.08333333333333e+00 29 150 -6.85215773010839e-17 29 216 2.54028569013354e-16 29 398 -9.72222222222223e-02 29 449 -6.94444444444444e-02 29 299 5.55555555555556e-02 29 389 -1.38888888888889e-02 29 397 -1.35389746289127e-17 29 448 4.16666666666667e-02 29 298 -4.16666666666667e-02 29 388 1.57785297414531e-17 29 396 -8.33333333333334e-02 29 447 -4.16666666666667e-02 29 297 -3.31765864780564e-17 29 387 -2.23616698075135e-18 30 30 1.00000000000000e+00 30 185 0.00000000000000e+00 30 74 0.00000000000000e+00 30 32 0.00000000000000e+00 30 182 0.00000000000000e+00 30 233 0.00000000000000e+00 30 173 0.00000000000000e+00 30 86 0.00000000000000e+00 30 82 0.00000000000000e+00 30 184 0.00000000000000e+00 30 73 0.00000000000000e+00 30 31 0.00000000000000e+00 30 181 0.00000000000000e+00 30 232 0.00000000000000e+00 30 172 0.00000000000000e+00 30 85 0.00000000000000e+00 30 81 0.00000000000000e+00 30 183 0.00000000000000e+00 30 72 0.00000000000000e+00 30 83 0.00000000000000e+00 30 180 0.00000000000000e+00 30 231 0.00000000000000e+00 30 171 0.00000000000000e+00 30 84 0.00000000000000e+00 31 31 1.00000000000000e+00 31 185 0.00000000000000e+00 31 74 0.00000000000000e+00 31 32 0.00000000000000e+00 31 182 0.00000000000000e+00 31 233 0.00000000000000e+00 31 173 0.00000000000000e+00 31 86 0.00000000000000e+00 31 82 0.00000000000000e+00 31 184 0.00000000000000e+00 31 73 0.00000000000000e+00 31 83 0.00000000000000e+00 31 181 0.00000000000000e+00 31 232 0.00000000000000e+00 31 172 0.00000000000000e+00 31 85 0.00000000000000e+00 31 81 0.00000000000000e+00 31 183 0.00000000000000e+00 31 72 0.00000000000000e+00 31 30 0.00000000000000e+00 31 180 0.00000000000000e+00 31 231 0.00000000000000e+00 31 171 0.00000000000000e+00 31 84 0.00000000000000e+00 32 32 1.00000000000000e+00 32 185 0.00000000000000e+00 32 74 0.00000000000000e+00 32 83 0.00000000000000e+00 32 182 0.00000000000000e+00 32 233 0.00000000000000e+00 32 173 0.00000000000000e+00 32 86 0.00000000000000e+00 32 82 0.00000000000000e+00 32 184 0.00000000000000e+00 32 73 0.00000000000000e+00 32 31 0.00000000000000e+00 32 181 0.00000000000000e+00 32 232 0.00000000000000e+00 32 172 0.00000000000000e+00 32 85 0.00000000000000e+00 32 81 0.00000000000000e+00 32 183 0.00000000000000e+00 32 72 0.00000000000000e+00 32 30 0.00000000000000e+00 32 180 0.00000000000000e+00 32 231 0.00000000000000e+00 32 171 0.00000000000000e+00 32 84 0.00000000000000e+00 33 33 2.77777777777778e+01 33 107 2.29850860566927e-16 33 236 2.08333333333333e+00 33 191 4.16666666666667e+00 33 199 -4.16666666666667e+00 33 106 2.11636264069170e-16 33 235 -2.08333333333333e+00 33 190 5.55111512312578e-17 33 198 -4.86111111111111e+00 33 105 -5.55555555555555e+00 33 234 -3.47222222222222e+00 33 189 -4.86111111111111e+00 33 185 -1.11022302462516e-16 33 77 8.88178419700125e-16 33 35 -8.88178419700125e-16 33 74 2.42861286636753e-17 33 233 -2.08333333333333e+00 33 176 1.65666091955785e-16 33 89 -6.99174875981590e-17 33 173 -4.16666666666667e+00 33 184 4.16666666666667e+00 33 76 7.63278329429795e-17 33 34 0.00000000000000e+00 33 73 -2.28983498828939e-16 33 232 2.08333333333333e+00 33 175 5.46437894932694e-17 33 88 -4.44089209850063e-16 33 172 1.30104260698261e-17 33 183 -4.86111111111111e+00 33 75 5.55555555555556e+00 33 200 1.82145964977565e-17 33 72 -5.55555555555556e+00 33 231 -3.47222222222222e+00 33 174 -1.38888888888889e+00 33 87 5.55555555555556e+00 33 171 -4.86111111111112e+00 34 34 2.77777777777778e+01 34 107 -2.08333333333333e+00 34 236 2.08333333333333e+00 34 191 -1.23599047663348e-17 34 199 -4.86111111111111e+00 34 106 2.77777777777778e+00 34 235 -3.47222222222222e+00 34 190 -6.94444444444445e-01 34 198 -4.16666666666667e+00 34 105 2.35922392732846e-16 34 234 -2.08333333333333e+00 34 189 5.03069808033274e-17 34 185 2.09901540593194e-16 34 77 1.78676518025611e-16 34 35 -8.33333333333333e+00 34 74 -2.08333333333333e+00 34 233 2.08333333333333e+00 34 176 8.33333333333333e+00 34 89 3.33798743853975e-17 34 173 -1.35742111995185e-16 34 184 -4.86111111111111e+00 34 76 -1.11111111111111e+01 34 200 7.54604712049911e-17 34 73 2.77777777777778e+00 34 232 -3.47222222222222e+00 34 175 -9.72222222222223e+00 34 88 5.55555555555556e+00 34 172 -6.94444444444445e-01 34 183 4.16666666666667e+00 34 75 6.76542155630955e-17 34 33 0.00000000000000e+00 34 72 -2.13370987545147e-16 34 231 2.08333333333333e+00 34 174 9.75781955236954e-19 34 87 -4.44089209850063e-16 34 171 -3.39355279987963e-17 35 35 2.77777777777778e+01 35 107 2.77777777777778e+00 35 236 -3.47222222222222e+00 35 191 -4.86111111111111e+00 35 199 3.46944695195361e-17 35 106 -2.08333333333333e+00 35 235 2.08333333333333e+00 35 190 -2.16840434497101e-17 35 198 6.93889390390723e-18 35 105 1.35308431126191e-16 35 234 2.08333333333333e+00 35 189 4.16666666666667e+00 35 185 -6.94444444444444e-01 35 77 5.55555555555556e+00 35 200 -6.94444444444445e-01 35 74 2.77777777777778e+00 35 233 -3.47222222222222e+00 35 176 -9.72222222222222e+00 35 89 -1.11111111111111e+01 35 173 -4.86111111111111e+00 35 184 2.49800180540660e-16 35 76 -5.37764277552810e-17 35 34 -8.33333333333333e+00 35 73 -2.08333333333333e+00 35 232 2.08333333333333e+00 35 175 8.33333333333333e+00 35 88 2.73652628335341e-16 35 172 -8.67361737988404e-17 35 183 -4.33680868994202e-17 35 75 8.88178419700125e-16 35 33 -1.77635683940025e-15 35 72 -7.53520509877426e-17 35 231 -2.08333333333333e+00 35 174 8.84708972748172e-17 35 87 -3.97902197302180e-17 35 171 -4.16666666666667e+00 36 36 2.77777777777778e+01 36 131 1.93313247354165e-16 36 239 2.08333333333333e+00 36 206 4.16666666666667e+00 36 214 -4.16666666666667e+00 36 130 -7.97972798949331e-17 36 238 -2.08333333333333e+00 36 205 -1.06577073555325e-16 36 213 -4.86111111111111e+00 36 129 -5.55555555555556e+00 36 237 -3.47222222222222e+00 36 204 -4.86111111111112e+00 36 200 -8.32667268468867e-17 36 110 8.88178419700125e-16 36 38 8.88178419700125e-16 36 107 -9.23740250957650e-16 36 236 -2.08333333333333e+00 36 194 3.89553840574042e-16 36 116 3.19880298464692e-16 36 191 -4.16666666666667e+00 36 199 4.16666666666667e+00 36 109 5.06539254985228e-16 36 37 8.88178419700125e-16 36 106 -2.28983498828939e-16 36 235 2.08333333333333e+00 36 193 1.16226472890446e-16 36 115 0.00000000000000e+00 36 190 3.38271077815477e-17 36 198 -4.86111111111111e+00 36 108 5.55555555555556e+00 36 215 -2.53269627492614e-16 36 105 -5.55555555555556e+00 36 234 -3.47222222222222e+00 36 192 -1.38888888888889e+00 36 114 5.55555555555556e+00 36 189 -4.86111111111112e+00 37 37 2.77777777777778e+01 37 131 -2.08333333333333e+00 37 239 2.08333333333333e+00 37 206 -1.25767452008319e-17 37 214 -4.86111111111111e+00 37 130 2.77777777777778e+00 37 238 -3.47222222222222e+00 37 205 -6.94444444444446e-01 37 213 -4.16666666666667e+00 37 129 2.08166817117217e-16 37 237 -2.08333333333333e+00 37 204 -1.99493199737333e-17 37 200 3.09648140461860e-16 37 110 -3.82723366887383e-17 37 38 -8.33333333333333e+00 37 107 -2.08333333333333e+00 37 236 2.08333333333333e+00 37 194 8.33333333333333e+00 37 116 4.82442861701737e-16 37 191 1.67400815431762e-16 37 199 -4.86111111111111e+00 37 109 -1.11111111111111e+01 37 215 -4.07660016854550e-17 37 106 2.77777777777778e+00 37 235 -3.47222222222222e+00 37 193 -9.72222222222223e+00 37 115 5.55555555555556e+00 37 190 -6.94444444444446e-01 37 198 4.16666666666667e+00 37 108 2.23779328401008e-16 37 36 8.88178419700125e-16 37 105 -1.70002900645727e-16 37 234 2.08333333333333e+00 37 192 1.44524149592318e-16 37 114 0.00000000000000e+00 37 189 -2.77555756156289e-17 38 38 2.77777777777778e+01 38 131 2.77777777777778e+00 38 239 -3.47222222222222e+00 38 206 -4.86111111111111e+00 38 109 9.71445146547012e-17 38 214 -9.71445146547012e-17 38 130 -2.08333333333333e+00 38 238 2.08333333333333e+00 38 205 -1.76941794549634e-16 38 213 -2.98372437868011e-16 38 129 1.21430643318376e-17 38 237 2.08333333333333e+00 38 204 4.16666666666667e+00 38 200 -6.94444444444444e-01 38 110 5.55555555555555e+00 38 215 -6.94444444444444e-01 38 107 2.77777777777778e+00 38 236 -3.47222222222222e+00 38 194 -9.72222222222222e+00 38 116 -1.11111111111111e+01 38 191 -4.86111111111111e+00 38 199 2.98372437868011e-16 38 37 -8.33333333333333e+00 38 106 -2.08333333333333e+00 38 235 2.08333333333333e+00 38 193 8.33333333333333e+00 38 115 8.38955641069283e-16 38 190 1.33573707650214e-16 38 198 -9.28077059647592e-17 38 108 8.88178419700125e-16 38 36 8.88178419700125e-16 38 105 -1.04419511232079e-15 38 234 -2.08333333333333e+00 38 192 4.85722573273506e-16 38 114 1.88542757795229e-16 38 189 -4.16666666666667e+00 39 39 2.77777777777778e+01 39 155 -7.15898694492179e-16 39 242 2.08333333333333e+00 39 221 4.16666666666667e+00 39 229 -4.16666666666667e+00 39 154 -4.89192020225460e-16 39 241 -2.08333333333333e+00 39 220 -1.01372903127395e-16 39 228 -4.86111111111111e+00 39 153 -5.55555555555555e+00 39 240 -3.47222222222222e+00 39 219 -4.86111111111111e+00 39 215 -1.73472347597681e-16 39 134 0.00000000000000e+00 39 41 8.88178419700125e-16 39 131 -1.43635103810880e-15 39 239 -2.08333333333333e+00 39 209 2.54787510534094e-17 39 140 7.98121876748048e-16 39 206 -4.16666666666667e+00 39 214 4.16666666666667e+00 39 133 2.15105711021124e-16 39 40 0.00000000000000e+00 39 130 8.95117313604032e-16 39 238 2.08333333333333e+00 39 208 -2.42861286636753e-17 39 139 -8.88178419700125e-16 39 205 2.20309881449055e-16 39 213 -4.86111111111111e+00 39 132 5.55555555555555e+00 39 230 1.80411241501588e-16 39 129 -5.55555555555555e+00 39 237 -3.47222222222222e+00 39 207 -1.38888888888889e+00 39 138 5.55555555555555e+00 39 204 -4.86111111111111e+00 40 40 2.77777777777778e+01 40 155 -2.08333333333333e+00 40 242 2.08333333333333e+00 40 221 2.44053909026487e-16 40 229 -4.86111111111111e+00 40 154 2.77777777777778e+00 40 241 -3.47222222222222e+00 40 220 -6.94444444444443e-01 40 228 -4.16666666666667e+00 40 153 -4.51028103753970e-16 40 240 -2.08333333333333e+00 40 219 -5.63785129692462e-17 40 215 3.10515502199848e-16 40 134 2.78206277459780e-16 40 41 -8.33333333333334e+00 40 131 -2.08333333333333e+00 40 239 2.08333333333333e+00 40 209 8.33333333333334e+00 40 140 -6.49911439769280e-16 40 206 6.82180006927879e-16 40 214 -4.86111111111111e+00 40 133 -1.11111111111111e+01 40 230 -2.22911966663020e-16 40 130 2.77777777777778e+00 40 238 -3.47222222222222e+00 40 208 -9.72222222222223e+00 40 139 5.55555555555556e+00 40 205 -6.94444444444446e-01 40 213 4.16666666666667e+00 40 132 -8.76035355368288e-17 40 39 0.00000000000000e+00 40 129 9.11597186625812e-16 40 237 2.08333333333333e+00 40 207 -5.52943107967607e-18 40 138 -8.88178419700125e-16 40 204 2.73977888987087e-16 41 41 2.77777777777778e+01 41 155 2.77777777777778e+00 41 242 -3.47222222222222e+00 41 221 -4.86111111111111e+00 41 229 -2.63677968348475e-16 41 154 -2.08333333333333e+00 41 241 2.08333333333333e+00 41 220 3.62557206479153e-16 41 228 2.63677968348475e-16 41 153 -6.60062282609175e-16 41 240 2.08333333333333e+00 41 219 4.16666666666667e+00 41 215 -6.94444444444445e-01 41 134 5.55555555555556e+00 41 230 -6.94444444444444e-01 41 131 2.77777777777778e+00 41 239 -3.47222222222222e+00 41 209 -9.72222222222222e+00 41 140 -1.11111111111111e+01 41 206 -4.86111111111111e+00 41 214 4.02455846426619e-16 41 133 7.71951946809679e-17 41 40 -8.33333333333334e+00 41 130 -2.08333333333333e+00 41 238 2.08333333333333e+00 41 208 8.33333333333334e+00 41 139 -4.23055687703844e-16 41 205 8.43942971062717e-16 41 213 -1.77809156287623e-16 41 132 0.00000000000000e+00 41 39 8.88178419700125e-16 41 129 -1.35406009321715e-15 41 237 -2.08333333333333e+00 41 207 -4.94396190653390e-17 41 138 1.04983296361771e-15 41 204 -4.16666666666667e+00 42 42 1.41666666666667e+01 42 44 4.08333333333333e+00 42 224 -6.95380168377890e-17 42 164 -6.01952434295741e-16 42 157 5.74627151417317e-17 42 43 -4.08333333333333e+00 42 223 -2.15620707053055e-17 42 163 -2.04166666666667e+00 42 156 2.83333333333333e+00 42 158 2.04166666666667e+00 42 222 -7.08333333333333e-01 42 162 2.83333333333334e+00 42 155 6.92154666914746e-16 42 242 -2.08333333333333e+00 42 221 -4.16666666666667e+00 42 229 4.16666666666667e+00 42 154 -2.28983498828939e-16 42 241 2.08333333333333e+00 42 220 6.07153216591882e-18 42 228 -4.86111111111111e+00 42 230 1.17961196366423e-16 42 153 -5.55555555555556e+00 42 240 -3.47222222222222e+00 42 219 -4.86111111111112e+00 42 401 -1.34170018845081e-18 42 302 2.31070588010973e-17 42 449 4.16666666666667e-02 42 392 8.33333333333334e-02 42 400 -8.33333333333333e-02 42 301 3.76760254938713e-18 42 448 -4.16666666666667e-02 42 391 7.11507675693612e-20 42 399 -9.72222222222222e-02 42 300 -1.11111111111111e-01 42 447 -6.94444444444445e-02 42 390 -9.72222222222223e-02 43 43 1.41666666666667e+01 43 44 -4.25000000000000e+00 43 224 4.25000000000000e+00 43 164 -6.77708943515798e-17 43 157 -5.66666666666667e+00 43 158 -7.16808407877530e-16 43 223 -4.95833333333333e+00 43 163 2.83333333333333e+00 43 156 1.04164723721545e-16 43 42 -4.08333333333333e+00 43 222 -1.41911899982985e-17 43 162 -2.04166666666667e+00 43 155 -2.08333333333333e+00 43 242 2.08333333333333e+00 43 221 -6.63531729561129e-17 43 229 -4.86111111111111e+00 43 230 -4.61436444609831e-16 43 154 2.77777777777778e+00 43 241 -3.47222222222222e+00 43 220 -6.94444444444445e-01 43 228 4.16666666666667e+00 43 153 -1.24032728532342e-16 43 240 2.08333333333333e+00 43 219 3.96817995129695e-17 43 401 8.18572640226556e-18 43 302 -4.16666666666667e-02 43 449 4.16666666666667e-02 43 392 -9.01243055878576e-18 43 400 -9.72222222222222e-02 43 301 5.55555555555555e-02 43 448 -6.94444444444444e-02 43 391 -1.38888888888889e-02 43 399 -8.33333333333334e-02 43 300 1.08420217248550e-18 43 447 -4.16666666666667e-02 43 390 2.16840434497101e-19 44 44 1.41666666666667e+01 44 158 2.83333333333333e+00 44 224 -4.95833333333333e+00 44 164 -5.66666666666666e+00 44 157 -6.14932367179466e-16 44 43 -4.25000000000000e+00 44 223 4.25000000000000e+00 44 163 1.71171806112938e-16 44 156 2.04166666666667e+00 44 42 4.08333333333333e+00 44 222 -4.74067399919287e-17 44 162 -8.05514780311684e-16 44 230 -6.94444444444445e-01 44 155 2.77777777777778e+00 44 242 -3.47222222222222e+00 44 221 -4.86111111111111e+00 44 229 -4.99600361081320e-16 44 154 -2.08333333333333e+00 44 241 2.08333333333333e+00 44 220 -1.00613961606655e-16 44 228 1.89084858881472e-16 44 153 7.68265659423228e-16 44 240 -2.08333333333333e+00 44 219 -4.16666666666667e+00 44 401 -1.38888888888889e-02 44 302 5.55555555555555e-02 44 449 -6.94444444444445e-02 44 392 -9.72222222222223e-02 44 400 6.39679281766448e-18 44 301 -4.16666666666667e-02 44 448 4.16666666666667e-02 44 391 -9.14795583034644e-18 44 399 -7.58941520739853e-19 44 300 2.26191678234788e-17 44 447 4.16666666666667e-02 44 390 8.33333333333334e-02 45 45 1.00000000000000e+00 45 80 0.00000000000000e+00 45 185 0.00000000000000e+00 45 83 0.00000000000000e+00 45 95 0.00000000000000e+00 45 179 0.00000000000000e+00 45 233 0.00000000000000e+00 45 182 0.00000000000000e+00 45 46 0.00000000000000e+00 45 79 0.00000000000000e+00 45 184 0.00000000000000e+00 45 82 0.00000000000000e+00 45 94 0.00000000000000e+00 45 178 0.00000000000000e+00 45 232 0.00000000000000e+00 45 181 0.00000000000000e+00 45 47 0.00000000000000e+00 45 78 0.00000000000000e+00 45 183 0.00000000000000e+00 45 81 0.00000000000000e+00 45 93 0.00000000000000e+00 45 177 0.00000000000000e+00 45 231 0.00000000000000e+00 45 180 0.00000000000000e+00 46 46 1.00000000000000e+00 46 80 0.00000000000000e+00 46 185 0.00000000000000e+00 46 83 0.00000000000000e+00 46 95 0.00000000000000e+00 46 179 0.00000000000000e+00 46 233 0.00000000000000e+00 46 182 0.00000000000000e+00 46 47 0.00000000000000e+00 46 79 0.00000000000000e+00 46 184 0.00000000000000e+00 46 82 0.00000000000000e+00 46 94 0.00000000000000e+00 46 178 0.00000000000000e+00 46 232 0.00000000000000e+00 46 181 0.00000000000000e+00 46 45 0.00000000000000e+00 46 78 0.00000000000000e+00 46 183 0.00000000000000e+00 46 81 0.00000000000000e+00 46 93 0.00000000000000e+00 46 177 0.00000000000000e+00 46 231 0.00000000000000e+00 46 180 0.00000000000000e+00 47 47 1.00000000000000e+00 47 80 0.00000000000000e+00 47 185 0.00000000000000e+00 47 83 0.00000000000000e+00 47 95 0.00000000000000e+00 47 179 0.00000000000000e+00 47 233 0.00000000000000e+00 47 182 0.00000000000000e+00 47 46 0.00000000000000e+00 47 79 0.00000000000000e+00 47 184 0.00000000000000e+00 47 82 0.00000000000000e+00 47 94 0.00000000000000e+00 47 178 0.00000000000000e+00 47 232 0.00000000000000e+00 47 181 0.00000000000000e+00 47 45 0.00000000000000e+00 47 78 0.00000000000000e+00 47 183 0.00000000000000e+00 47 81 0.00000000000000e+00 47 93 0.00000000000000e+00 47 177 0.00000000000000e+00 47 231 0.00000000000000e+00 47 180 0.00000000000000e+00 48 48 2.77777777777778e+01 48 200 -1.07552855510562e-16 48 197 4.16666666666667e+00 48 236 2.08333333333333e+00 48 112 6.93889390390723e-17 48 199 4.16666666666667e+00 48 196 8.67361737988404e-18 48 235 2.08333333333333e+00 48 111 -5.55555555555555e+00 48 198 -4.86111111111111e+00 48 195 -4.86111111111111e+00 48 234 -3.47222222222222e+00 48 80 -2.22044604925031e-16 48 50 0.00000000000000e+00 48 77 8.88178419700125e-16 48 185 1.17961196366423e-16 48 179 -4.16666666666667e+00 48 92 2.94902990916057e-16 48 176 1.71846044338952e-16 48 233 -2.08333333333333e+00 48 79 -1.66533453693773e-16 48 49 0.00000000000000e+00 48 76 2.41126563160776e-16 48 184 -4.16666666666667e+00 48 178 -9.02056207507940e-17 48 91 8.88178419700125e-16 48 175 6.88468379528295e-17 48 232 -2.08333333333333e+00 48 78 -5.55555555555556e+00 48 113 -2.42861286636753e-16 48 75 5.55555555555556e+00 48 183 -4.86111111111111e+00 48 177 -4.86111111111111e+00 48 90 5.55555555555556e+00 48 174 -1.38888888888889e+00 48 231 -3.47222222222222e+00 49 49 2.77777777777778e+01 49 200 1.87350135405495e-16 49 197 -2.90566182226115e-16 49 236 -2.08333333333333e+00 49 112 2.77777777777778e+00 49 199 -4.86111111111111e+00 49 196 -6.94444444444444e-01 49 235 -3.47222222222222e+00 49 111 0.00000000000000e+00 49 198 4.16666666666667e+00 49 195 -6.24500451351651e-17 49 234 2.08333333333333e+00 49 80 2.08333333333333e+00 49 50 8.33333333333333e+00 49 77 1.96023752785379e-16 49 185 9.02056207507940e-17 49 179 -2.47198095326695e-16 49 92 -4.06575814682064e-17 49 176 -8.33333333333333e+00 49 233 -2.08333333333333e+00 49 79 2.77777777777778e+00 49 113 2.08333333333333e+00 49 76 -1.11111111111111e+01 49 184 -4.86111111111111e+00 49 178 -6.94444444444445e-01 49 91 5.55555555555556e+00 49 175 -9.72222222222223e+00 49 232 -3.47222222222222e+00 49 78 -2.77555756156289e-16 49 48 0.00000000000000e+00 49 75 3.53883589099269e-16 49 183 -4.16666666666667e+00 49 177 -6.85215773010839e-17 49 90 8.88178419700125e-16 49 174 4.77048955893622e-17 49 231 -2.08333333333333e+00 50 50 2.77777777777778e+01 50 200 -6.94444444444445e-01 50 197 -4.86111111111111e+00 50 236 -3.47222222222222e+00 50 112 2.08333333333333e+00 50 199 1.74339709335669e-16 50 196 -1.38777878078145e-16 50 235 -2.08333333333333e+00 50 111 -2.77555756156289e-16 50 198 -1.31838984174237e-16 50 195 4.16666666666667e+00 50 234 2.08333333333333e+00 50 80 2.77777777777778e+00 50 113 2.77777777777778e+00 50 77 5.55555555555556e+00 50 185 -6.94444444444445e-01 50 179 -4.86111111111111e+00 50 92 -1.11111111111111e+01 50 176 -9.72222222222222e+00 50 233 -3.47222222222222e+00 50 79 2.08333333333333e+00 50 49 8.33333333333333e+00 50 76 1.75315491290906e-16 50 184 7.54604712049911e-17 50 178 -1.80411241501588e-16 50 91 -1.03216046820620e-16 50 175 -8.33333333333333e+00 50 232 -2.08333333333333e+00 50 78 -1.80411241501588e-16 50 48 0.00000000000000e+00 50 75 8.88178419700125e-16 50 183 7.45931094670027e-17 50 177 -4.16666666666667e+00 50 90 2.91433543964104e-16 50 174 -3.12250225675825e-17 50 231 -2.08333333333333e+00 51 51 2.77777777777778e+01 51 215 -3.01841884819964e-16 51 212 4.16666666666667e+00 51 239 2.08333333333333e+00 51 136 -1.24900090270330e-16 51 214 4.16666666666667e+00 51 211 -1.75207071073658e-16 51 238 2.08333333333333e+00 51 135 -5.55555555555556e+00 51 213 -4.86111111111111e+00 51 210 -4.86111111111111e+00 51 237 -3.47222222222222e+00 51 113 -4.44089209850063e-16 51 53 2.66453525910038e-15 51 110 8.88178419700125e-16 51 200 2.77555756156289e-17 51 197 -4.16666666666667e+00 51 119 7.38992200766120e-16 51 194 1.11239142897013e-16 51 236 -2.08333333333333e+00 51 112 -3.33066907387547e-16 51 52 8.88178419700125e-16 51 109 3.34801630863524e-16 51 199 -4.16666666666667e+00 51 196 -2.77555756156289e-17 51 118 8.88178419700125e-16 51 193 1.70761842166467e-16 51 235 -2.08333333333333e+00 51 111 -5.55555555555556e+00 51 137 -1.40859546249317e-15 51 108 5.55555555555556e+00 51 198 -4.86111111111111e+00 51 195 -4.86111111111111e+00 51 117 5.55555555555556e+00 51 192 -1.38888888888889e+00 51 234 -3.47222222222222e+00 52 52 2.77777777777778e+01 52 215 7.00828284294630e-16 52 212 1.83013326715553e-16 52 239 -2.08333333333333e+00 52 136 2.77777777777778e+00 52 214 -4.86111111111111e+00 52 211 -6.94444444444444e-01 52 238 -3.47222222222222e+00 52 135 -2.22044604925031e-16 52 213 4.16666666666667e+00 52 210 -2.08166817117217e-16 52 237 2.08333333333333e+00 52 113 2.08333333333333e+00 52 53 8.33333333333333e+00 52 110 3.74700270810990e-16 52 200 -6.03683769639929e-16 52 197 9.54097911787244e-17 52 119 -3.50414142147315e-16 52 194 -8.33333333333333e+00 52 236 -2.08333333333333e+00 52 112 2.77777777777778e+00 52 137 2.08333333333333e+00 52 109 -1.11111111111111e+01 52 199 -4.86111111111111e+00 52 196 -6.94444444444445e-01 52 118 5.55555555555556e+00 52 193 -9.72222222222223e+00 52 235 -3.47222222222222e+00 52 111 -3.53883589099269e-16 52 51 8.88178419700125e-16 52 108 5.06539254985228e-16 52 198 -4.16666666666667e+00 52 195 -8.41340885848751e-17 52 117 8.88178419700125e-16 52 192 2.41126563160776e-16 52 234 -2.08333333333333e+00 53 53 2.77777777777778e+01 53 215 -6.94444444444444e-01 53 212 -4.86111111111111e+00 53 239 -3.47222222222222e+00 53 136 2.08333333333333e+00 53 214 6.74807432154978e-16 53 211 2.91433543964104e-16 53 238 -2.08333333333333e+00 53 135 -1.44328993201270e-15 53 213 -4.37150315946155e-16 53 210 4.16666666666667e+00 53 237 2.08333333333333e+00 53 113 2.77777777777778e+00 53 137 2.77777777777778e+00 53 110 5.55555555555555e+00 53 200 -6.94444444444444e-01 53 197 -4.86111111111111e+00 53 119 -1.11111111111111e+01 53 194 -9.72222222222222e+00 53 236 -3.47222222222222e+00 53 112 2.08333333333333e+00 53 52 8.33333333333333e+00 53 109 1.83772268236293e-16 53 199 -5.36896915814822e-16 53 196 -4.85722573273506e-17 53 118 -7.77156117237610e-16 53 193 -8.33333333333333e+00 53 235 -2.08333333333333e+00 53 111 -5.75928194024300e-16 53 51 2.66453525910038e-15 53 108 8.88178419700125e-16 53 198 1.90819582357449e-17 53 195 -4.16666666666667e+00 53 117 9.08995101411847e-16 53 192 4.85722573273506e-16 53 234 -2.08333333333333e+00 54 54 2.77777777777778e+01 54 230 5.55111512312578e-17 54 227 4.16666666666667e+00 54 242 2.08333333333333e+00 54 160 -4.09394740330526e-16 54 229 4.16666666666667e+00 54 226 -1.13624387676481e-16 54 241 2.08333333333333e+00 54 159 -5.55555555555555e+00 54 228 -4.86111111111111e+00 54 225 -4.86111111111111e+00 54 240 -3.47222222222222e+00 54 137 5.55111512312578e-16 54 56 -8.88178419700125e-16 54 134 4.44089209850063e-16 54 215 -4.85722573273506e-17 54 212 -4.16666666666667e+00 54 143 -7.28583859910259e-16 54 209 -3.87060175577325e-17 54 239 -2.08333333333333e+00 54 136 7.77156117237610e-16 54 55 0.00000000000000e+00 54 133 -8.76035355368288e-17 54 214 -4.16666666666667e+00 54 211 3.12250225675825e-16 54 142 8.88178419700125e-16 54 208 6.84131570838353e-17 54 238 -2.08333333333333e+00 54 135 -5.55555555555555e+00 54 161 7.21644966006352e-16 54 132 5.55555555555555e+00 54 213 -4.86111111111111e+00 54 210 -4.86111111111111e+00 54 141 5.55555555555555e+00 54 207 -1.38888888888889e+00 54 237 -3.47222222222222e+00 55 55 2.77777777777778e+01 55 230 -2.49800180540660e-16 55 227 5.68989300120393e-16 55 242 -2.08333333333333e+00 55 160 2.77777777777778e+00 55 229 -4.86111111111111e+00 55 226 -6.94444444444445e-01 55 241 -3.47222222222222e+00 55 159 -4.99600361081320e-16 55 228 4.16666666666667e+00 55 225 -9.02056207507940e-17 55 240 2.08333333333333e+00 55 137 2.08333333333333e+00 55 56 8.33333333333333e+00 55 134 3.54750950837257e-16 55 215 -9.02056207507940e-17 55 212 4.77048955893622e-16 55 143 -7.81601346144800e-16 55 209 -8.33333333333334e+00 55 239 -2.08333333333333e+00 55 136 2.77777777777778e+00 55 161 2.08333333333333e+00 55 133 -1.11111111111111e+01 55 214 -4.86111111111111e+00 55 211 -6.94444444444444e-01 55 142 5.55555555555556e+00 55 208 -9.72222222222223e+00 55 238 -3.47222222222222e+00 55 135 7.97972798949331e-16 55 54 0.00000000000000e+00 55 132 2.63677968348475e-16 55 213 -4.16666666666667e+00 55 210 3.15719672627779e-16 55 141 4.44089209850063e-16 55 207 -1.12757025938492e-17 55 237 -2.08333333333333e+00 56 56 2.77777777777778e+01 56 230 -6.94444444444443e-01 56 227 -4.86111111111111e+00 56 242 -3.47222222222222e+00 56 160 2.08333333333333e+00 56 229 -3.20056481317721e-16 56 226 6.93889390390723e-16 56 241 -2.08333333333333e+00 56 159 6.66133814775094e-16 56 228 1.52655665885959e-16 56 225 4.16666666666667e+00 56 240 2.08333333333333e+00 56 137 2.77777777777778e+00 56 161 2.77777777777778e+00 56 134 5.55555555555556e+00 56 215 -6.94444444444444e-01 56 212 -4.86111111111111e+00 56 143 -1.11111111111111e+01 56 209 -9.72222222222222e+00 56 239 -3.47222222222222e+00 56 136 2.08333333333333e+00 56 55 8.33333333333333e+00 56 133 4.51678625057461e-16 56 214 -1.06685493772574e-16 56 211 5.20417042793042e-16 56 142 -1.15619319673854e-15 56 208 -8.33333333333334e+00 56 238 -2.08333333333333e+00 56 135 5.75928194024300e-16 56 54 -8.88178419700125e-16 56 132 4.44089209850063e-16 56 213 -8.06646416329215e-17 56 210 -4.16666666666667e+00 56 141 -1.02695629777827e-15 56 207 -7.80625564189563e-18 56 237 -2.08333333333333e+00 57 57 1.41666666666667e+01 57 158 2.04166666666667e+00 57 167 1.15847002130076e-16 57 224 -7.11609319647283e-17 57 58 4.08333333333333e+00 57 157 1.04164723721545e-16 57 166 2.04166666666667e+00 57 223 -1.93462325152882e-18 57 59 4.08333333333333e+00 57 156 2.83333333333333e+00 57 165 2.83333333333333e+00 57 222 -7.08333333333333e-01 57 230 3.46944695195361e-16 57 227 -4.16666666666667e+00 57 242 -2.08333333333333e+00 57 160 -2.22044604925031e-16 57 229 -4.16666666666667e+00 57 226 6.24500451351651e-17 57 241 -2.08333333333333e+00 57 159 -5.55555555555556e+00 57 161 -1.11022302462516e-16 57 228 -4.86111111111111e+00 57 225 -4.86111111111111e+00 57 240 -3.47222222222222e+00 57 308 -3.32850066953050e-17 57 401 -2.98155597433514e-18 57 398 8.33333333333333e-02 57 449 4.16666666666667e-02 57 307 1.95156391047391e-18 57 400 8.33333333333334e-02 57 397 -5.14996031930615e-19 57 448 4.16666666666667e-02 57 306 -1.11111111111111e-01 57 399 -9.72222222222222e-02 57 396 -9.72222222222223e-02 57 447 -6.94444444444445e-02 58 58 1.41666666666667e+01 58 158 -5.02188893768130e-16 58 167 -5.92397902650713e-17 58 224 -4.25000000000000e+00 58 59 4.25000000000000e+00 58 157 -5.66666666666667e+00 58 166 2.83333333333333e+00 58 223 -4.95833333333333e+00 58 57 4.08333333333333e+00 58 156 1.68593437821496e-16 58 165 2.04166666666667e+00 58 222 -2.32967941812823e-17 58 230 1.38777878078145e-17 58 227 -1.21430643318376e-16 58 242 -2.08333333333333e+00 58 160 2.77777777777778e+00 58 161 2.08333333333333e+00 58 229 -4.86111111111111e+00 58 226 -6.94444444444445e-01 58 241 -3.47222222222222e+00 58 159 -9.71445146547012e-17 58 228 -4.16666666666667e+00 58 225 7.19910242530375e-17 58 240 -2.08333333333333e+00 58 308 4.16666666666666e-02 58 401 1.44198888940572e-17 58 398 -1.35931847375370e-17 58 449 -4.16666666666666e-02 58 307 5.55555555555555e-02 58 400 -9.72222222222222e-02 58 397 -1.38888888888889e-02 58 448 -6.94444444444444e-02 58 306 0.00000000000000e+00 58 399 8.33333333333333e-02 58 396 -1.08420217248550e-18 58 447 4.16666666666667e-02 59 59 1.41666666666667e+01 59 158 2.83333333333333e+00 59 167 -5.66666666666667e+00 59 224 -4.95833333333333e+00 59 58 4.25000000000000e+00 59 157 -5.48486020599155e-16 59 166 -5.69788899222601e-16 59 223 -4.25000000000000e+00 59 57 4.08333333333333e+00 59 156 2.04166666666667e+00 59 165 4.04082149685348e-16 59 222 -1.58442594981600e-16 59 161 2.77777777777778e+00 59 230 -6.94444444444445e-01 59 227 -4.86111111111111e+00 59 242 -3.47222222222222e+00 59 160 2.08333333333333e+00 59 229 5.29090660172926e-17 59 226 -4.16333634234434e-17 59 241 -2.08333333333333e+00 59 159 -9.71445146547012e-17 59 228 2.80157841370254e-16 59 225 -4.16666666666667e+00 59 240 -2.08333333333333e+00 59 308 5.55555555555555e-02 59 401 -1.38888888888889e-02 59 398 -9.72222222222222e-02 59 449 -6.94444444444445e-02 59 307 4.16666666666666e-02 59 400 1.54092233764502e-17 59 397 -1.27935856353290e-17 59 448 -4.16666666666666e-02 59 306 -3.38271077815477e-17 59 399 -2.71050543121376e-18 59 396 8.33333333333333e-02 59 447 4.16666666666667e-02 60 60 2.77777777777778e+01 60 89 -4.16666666666667e+00 60 65 -1.66967134562768e-17 60 5 4.55229387172351e-17 60 175 -2.08333333333333e+00 60 88 -3.30681662608079e-17 60 64 -4.16666666666667e+00 60 4 -2.07407875596477e-16 60 174 -3.47222222222222e+00 60 87 -4.86111111111112e+00 60 63 -4.86111111111111e+00 60 3 -5.55555555555555e+00 60 182 0.00000000000000e+00 60 233 3.64291929955129e-17 60 173 -3.83807569059869e-17 60 86 0.00000000000000e+00 60 71 0.00000000000000e+00 60 170 4.44089209850063e-16 60 62 1.77635683940025e-15 60 2 0.00000000000000e+00 60 181 0.00000000000000e+00 60 232 3.38271077815477e-17 60 172 0.00000000000000e+00 60 85 0.00000000000000e+00 60 70 0.00000000000000e+00 60 169 3.48245737802344e-16 60 61 -8.88178419700125e-16 60 1 0.00000000000000e+00 60 180 0.00000000000000e+00 60 231 -1.38888888888889e+00 60 171 5.55555555555556e+00 60 84 0.00000000000000e+00 60 69 0.00000000000000e+00 60 168 5.55555555555556e+00 60 176 -2.08333333333333e+00 60 0 0.00000000000000e+00 61 61 2.77777777777778e+01 61 89 -1.42247325030098e-16 61 65 1.02782365951626e-16 61 5 2.08333333333333e+00 61 175 -3.47222222222222e+00 61 88 -6.94444444444445e-01 61 64 -4.86111111111111e+00 61 4 2.77777777777778e+00 61 174 -2.08333333333333e+00 61 87 1.30104260698261e-17 61 63 -4.16666666666667e+00 61 3 -8.68445940160889e-17 61 182 0.00000000000000e+00 61 233 -8.33333333333333e+00 61 173 4.36174533990918e-16 61 86 0.00000000000000e+00 61 71 0.00000000000000e+00 61 170 -7.18283939271647e-17 61 62 8.33333333333333e+00 61 2 0.00000000000000e+00 61 181 0.00000000000000e+00 61 232 -9.72222222222223e+00 61 172 5.55555555555556e+00 61 85 0.00000000000000e+00 61 70 0.00000000000000e+00 61 169 -1.11111111111111e+01 61 176 -2.08333333333333e+00 61 1 0.00000000000000e+00 61 180 0.00000000000000e+00 61 231 7.68699340292223e-17 61 171 0.00000000000000e+00 61 84 0.00000000000000e+00 61 69 0.00000000000000e+00 61 168 3.00717025066011e-16 61 60 -8.88178419700125e-16 61 0 0.00000000000000e+00 62 62 2.77777777777778e+01 62 89 -4.86111111111111e+00 62 65 -6.94444444444444e-01 62 5 2.77777777777778e+00 62 175 -2.08333333333333e+00 62 88 -1.35742111995185e-16 62 64 1.20563281580388e-16 62 4 2.08333333333333e+00 62 174 -2.08333333333333e+00 62 87 -4.16666666666667e+00 62 63 -8.06646416329215e-17 62 3 1.72388145425195e-17 62 182 0.00000000000000e+00 62 233 -9.72222222222222e+00 62 173 -1.11111111111111e+01 62 86 0.00000000000000e+00 62 71 0.00000000000000e+00 62 170 5.55555555555556e+00 62 176 -3.47222222222222e+00 62 2 0.00000000000000e+00 62 181 0.00000000000000e+00 62 232 -8.33333333333333e+00 62 172 3.62015105392910e-16 62 85 0.00000000000000e+00 62 70 0.00000000000000e+00 62 169 -1.81603863891322e-16 62 61 8.33333333333333e+00 62 1 0.00000000000000e+00 62 180 0.00000000000000e+00 62 231 1.75966012594397e-16 62 171 4.31092336307393e-16 62 84 0.00000000000000e+00 62 69 0.00000000000000e+00 62 168 4.44089209850063e-16 62 60 1.77635683940025e-15 62 0 0.00000000000000e+00 63 63 5.55555555555556e+01 63 104 8.55435514091063e-17 63 196 -2.08333333333333e+00 63 103 -4.16666666666667e+00 63 195 -3.47222222222222e+00 63 102 -4.86111111111111e+00 63 236 -8.33333333333333e+00 63 191 -2.08333333333333e+00 63 188 -2.31070588010973e-17 63 98 4.01154803819637e-18 63 235 9.81202966099382e-17 63 190 2.08333333333333e+00 63 187 2.83112292290277e-16 63 97 4.16666666666666e+00 63 234 -9.72222222222223e+00 63 189 -3.47222222222222e+00 63 186 -1.11111111111111e+01 63 96 -4.86111111111111e+00 63 179 2.08333333333333e+00 63 92 8.06646416329215e-17 63 68 -1.01481323344643e-16 63 20 8.88178419700125e-16 63 178 2.08333333333333e+00 63 91 6.15826833971767e-17 63 67 4.16666666666666e+00 63 19 -9.25908655302621e-17 63 177 -3.47222222222222e+00 63 90 -1.38888888888889e+00 63 66 -4.86111111111111e+00 63 18 5.55555555555556e+00 63 233 8.33333333333333e+00 63 176 -2.59124319224036e-17 63 89 7.37257477290143e-17 63 173 2.08333333333333e+00 63 170 -1.97758476261356e-16 63 65 8.88178419700125e-16 63 5 8.88178419700125e-16 63 62 -8.06646416329215e-17 63 232 -8.41340885848751e-17 63 175 4.44089209850063e-16 63 88 2.09251019289702e-17 63 172 -2.08333333333333e+00 63 169 -3.67761376907083e-16 63 64 -8.88178419700125e-16 63 4 -3.43285512863223e-17 63 61 -4.16666666666667e+00 63 231 -9.72222222222223e+00 63 174 1.11111111111111e+01 63 87 -1.38888888888889e+00 63 171 -3.47222222222222e+00 63 168 -1.11111111111111e+01 63 197 -2.08333333333333e+00 63 3 5.55555555555556e+00 63 60 -4.86111111111111e+00 64 64 5.55555555555556e+01 64 104 6.96057794735694e-17 64 196 -3.47222222222222e+00 64 103 -4.86111111111111e+00 64 195 -2.08333333333333e+00 64 102 -4.16666666666667e+00 64 236 4.24139889876329e-16 64 191 2.08333333333333e+00 64 188 1.77635683940025e-15 64 98 2.18575157973078e-16 64 235 -1.38888888888889e+00 64 190 -3.47222222222222e+00 64 187 5.55555555555556e+00 64 97 -4.86111111111111e+00 64 234 6.93889390390723e-18 64 189 2.08333333333333e+00 64 186 1.99384779520084e-16 64 96 4.16666666666667e+00 64 179 -2.08333333333333e+00 64 92 -8.33333333333333e+00 64 68 1.95590071916385e-16 64 20 -1.18869215685879e-16 64 178 -3.47222222222222e+00 64 91 -9.72222222222223e+00 64 67 -4.86111111111111e+00 64 19 -1.11111111111111e+01 64 177 2.08333333333333e+00 64 90 6.88468379528295e-17 64 66 4.16666666666666e+00 64 18 1.95562966862073e-17 64 233 2.68882138776405e-16 64 176 -2.39608680119296e-17 64 89 8.33333333333333e+00 64 173 2.08333333333333e+00 64 170 8.88178419700125e-16 64 65 -2.66453525910038e-15 64 5 3.72965547335014e-17 64 62 1.20563281580388e-16 64 232 -1.38888888888889e+00 64 175 1.11111111111111e+01 64 88 -9.72222222222223e+00 64 172 -3.47222222222222e+00 64 169 5.55555555555556e+00 64 197 -2.08333333333333e+00 64 4 -1.11111111111111e+01 64 61 -4.86111111111111e+00 64 231 -1.17202254845683e-16 64 174 4.44089209850063e-16 64 87 6.85215773010839e-17 64 171 -2.08333333333333e+00 64 168 -4.22838847269347e-16 64 63 -8.88178419700125e-16 64 3 1.85398571495021e-17 64 60 -4.16666666666667e+00 65 65 5.55555555555556e+01 65 104 -6.94444444444443e-01 65 196 -2.08333333333333e+00 65 103 1.63931368479808e-16 65 195 -2.08333333333333e+00 65 102 1.41379963292110e-16 65 236 -9.72222222222222e+00 65 191 -3.47222222222222e+00 65 188 5.55555555555556e+00 65 98 -6.94444444444444e-01 65 235 2.38741318381308e-16 65 190 2.08333333333333e+00 65 187 1.77635683940025e-15 65 97 1.48427277413266e-16 65 234 -8.33333333333333e+00 65 189 -2.08333333333333e+00 65 186 -1.14708589848966e-16 65 96 1.29236898960272e-16 65 179 -3.47222222222222e+00 65 92 -9.72222222222222e+00 65 68 -6.94444444444443e-01 65 20 5.55555555555556e+00 65 178 -2.08333333333333e+00 65 91 -8.33333333333333e+00 65 67 2.68014777038417e-16 65 19 2.03938428644523e-16 65 177 2.08333333333333e+00 65 90 1.71846044338952e-16 65 66 -7.91467585914418e-17 65 18 8.88178419700125e-16 65 233 -9.72222222222222e+00 65 176 -2.22222222222222e+01 65 89 -9.72222222222222e+00 65 173 -3.47222222222222e+00 65 170 5.55555555555556e+00 65 197 -3.47222222222222e+00 65 5 5.55555555555556e+00 65 62 -6.94444444444444e-01 65 232 2.88614618315641e-16 65 175 2.17260562838939e-16 65 88 8.33333333333333e+00 65 172 2.08333333333333e+00 65 169 8.88178419700125e-16 65 64 -2.66453525910038e-15 65 4 -1.18869215685879e-16 65 61 1.02782365951626e-16 65 231 8.33333333333333e+00 65 174 -2.82204272970821e-16 65 87 2.69749500514394e-16 65 171 2.08333333333333e+00 65 168 -1.54729202540838e-16 65 63 8.88178419700125e-16 65 3 8.88178419700125e-16 65 60 3.25260651745651e-18 66 66 2.77777777777778e+01 66 182 0.00000000000000e+00 66 17 0.00000000000000e+00 66 71 0.00000000000000e+00 66 94 0.00000000000000e+00 66 181 0.00000000000000e+00 66 16 0.00000000000000e+00 66 70 0.00000000000000e+00 66 93 0.00000000000000e+00 66 180 0.00000000000000e+00 66 15 0.00000000000000e+00 66 69 0.00000000000000e+00 66 179 5.96744875736022e-16 66 92 -4.16666666666667e+00 66 176 -2.08333333333333e+00 66 233 3.72965547335014e-17 66 68 0.00000000000000e+00 66 20 -8.93382590128056e-17 66 65 -8.60856524953491e-17 66 170 4.44089209850063e-16 66 178 8.88178419700125e-16 66 91 -3.38271077815477e-17 66 175 2.08333333333333e+00 66 232 7.84962372879505e-17 66 67 -8.88178419700125e-16 66 19 -2.15539391890118e-16 66 64 4.16666666666666e+00 66 169 4.10004604052550e-16 66 177 5.55555555555556e+00 66 90 -4.86111111111111e+00 66 174 -3.47222222222222e+00 66 231 -1.38888888888889e+00 66 95 0.00000000000000e+00 66 18 -5.55555555555555e+00 66 63 -4.86111111111111e+00 66 168 5.55555555555556e+00 67 67 2.77777777777778e+01 67 182 0.00000000000000e+00 67 17 0.00000000000000e+00 67 71 0.00000000000000e+00 67 94 0.00000000000000e+00 67 181 0.00000000000000e+00 67 16 0.00000000000000e+00 67 70 0.00000000000000e+00 67 93 0.00000000000000e+00 67 180 0.00000000000000e+00 67 15 0.00000000000000e+00 67 69 0.00000000000000e+00 67 179 -2.41126563160776e-16 67 92 -1.80411241501588e-16 67 176 2.08333333333333e+00 67 233 8.33333333333333e+00 67 68 -8.33333333333333e+00 67 20 -2.08333333333333e+00 67 65 2.68014777038417e-16 67 170 4.04407410337093e-17 67 178 5.55555555555556e+00 67 91 -6.94444444444445e-01 67 175 -3.47222222222222e+00 67 232 -9.72222222222223e+00 67 95 0.00000000000000e+00 67 19 2.77777777777778e+00 67 64 -4.86111111111111e+00 67 169 -1.11111111111111e+01 67 177 8.88178419700125e-16 67 90 -7.63278329429795e-17 67 174 2.08333333333333e+00 67 231 1.45716771982052e-16 67 66 -8.88178419700125e-16 67 18 -1.72604985859692e-16 67 63 4.16666666666666e+00 67 168 3.48245737802344e-16 68 68 2.77777777777778e+01 68 182 0.00000000000000e+00 68 17 0.00000000000000e+00 68 71 0.00000000000000e+00 68 94 0.00000000000000e+00 68 181 0.00000000000000e+00 68 16 0.00000000000000e+00 68 70 0.00000000000000e+00 68 93 0.00000000000000e+00 68 180 0.00000000000000e+00 68 15 0.00000000000000e+00 68 69 0.00000000000000e+00 68 179 -1.11111111111111e+01 68 92 -4.86111111111111e+00 68 176 -3.47222222222222e+00 68 233 -9.72222222222222e+00 68 95 0.00000000000000e+00 68 20 2.77777777777778e+00 68 65 -6.94444444444443e-01 68 170 5.55555555555556e+00 68 178 -5.06322414550731e-17 68 91 -2.48065457064683e-16 68 175 2.08333333333333e+00 68 232 8.33333333333333e+00 68 67 -8.33333333333333e+00 68 19 -2.08333333333333e+00 68 64 1.95590071916385e-16 68 169 5.30581438160094e-17 68 177 -6.76542155630955e-17 68 90 -4.16666666666667e+00 68 174 -2.08333333333333e+00 68 231 1.77592315853126e-16 68 66 0.00000000000000e+00 68 18 -2.70616862252382e-16 68 63 -1.00613961606655e-16 68 168 4.44089209850063e-16 69 69 1.00000000000000e+00 69 179 0.00000000000000e+00 69 17 0.00000000000000e+00 69 68 0.00000000000000e+00 69 94 0.00000000000000e+00 69 178 0.00000000000000e+00 69 16 0.00000000000000e+00 69 67 0.00000000000000e+00 69 93 0.00000000000000e+00 69 177 0.00000000000000e+00 69 15 0.00000000000000e+00 69 66 0.00000000000000e+00 69 182 0.00000000000000e+00 69 233 0.00000000000000e+00 69 173 0.00000000000000e+00 69 86 0.00000000000000e+00 69 71 0.00000000000000e+00 69 170 0.00000000000000e+00 69 62 0.00000000000000e+00 69 2 0.00000000000000e+00 69 181 0.00000000000000e+00 69 232 0.00000000000000e+00 69 172 0.00000000000000e+00 69 85 0.00000000000000e+00 69 70 0.00000000000000e+00 69 169 0.00000000000000e+00 69 61 0.00000000000000e+00 69 1 0.00000000000000e+00 69 180 0.00000000000000e+00 69 231 0.00000000000000e+00 69 171 0.00000000000000e+00 69 84 0.00000000000000e+00 69 95 0.00000000000000e+00 69 168 0.00000000000000e+00 69 60 0.00000000000000e+00 69 0 0.00000000000000e+00 70 70 1.00000000000000e+00 70 179 0.00000000000000e+00 70 17 0.00000000000000e+00 70 68 0.00000000000000e+00 70 94 0.00000000000000e+00 70 178 0.00000000000000e+00 70 16 0.00000000000000e+00 70 67 0.00000000000000e+00 70 93 0.00000000000000e+00 70 177 0.00000000000000e+00 70 15 0.00000000000000e+00 70 66 0.00000000000000e+00 70 182 0.00000000000000e+00 70 233 0.00000000000000e+00 70 173 0.00000000000000e+00 70 86 0.00000000000000e+00 70 71 0.00000000000000e+00 70 170 0.00000000000000e+00 70 62 0.00000000000000e+00 70 2 0.00000000000000e+00 70 181 0.00000000000000e+00 70 232 0.00000000000000e+00 70 172 0.00000000000000e+00 70 85 0.00000000000000e+00 70 95 0.00000000000000e+00 70 169 0.00000000000000e+00 70 61 0.00000000000000e+00 70 1 0.00000000000000e+00 70 180 0.00000000000000e+00 70 231 0.00000000000000e+00 70 171 0.00000000000000e+00 70 84 0.00000000000000e+00 70 69 0.00000000000000e+00 70 168 0.00000000000000e+00 70 60 0.00000000000000e+00 70 0 0.00000000000000e+00 71 71 1.00000000000000e+00 71 179 0.00000000000000e+00 71 17 0.00000000000000e+00 71 68 0.00000000000000e+00 71 94 0.00000000000000e+00 71 178 0.00000000000000e+00 71 16 0.00000000000000e+00 71 67 0.00000000000000e+00 71 93 0.00000000000000e+00 71 177 0.00000000000000e+00 71 15 0.00000000000000e+00 71 66 0.00000000000000e+00 71 182 0.00000000000000e+00 71 233 0.00000000000000e+00 71 173 0.00000000000000e+00 71 86 0.00000000000000e+00 71 95 0.00000000000000e+00 71 170 0.00000000000000e+00 71 62 0.00000000000000e+00 71 2 0.00000000000000e+00 71 181 0.00000000000000e+00 71 232 0.00000000000000e+00 71 172 0.00000000000000e+00 71 85 0.00000000000000e+00 71 70 0.00000000000000e+00 71 169 0.00000000000000e+00 71 61 0.00000000000000e+00 71 1 0.00000000000000e+00 71 180 0.00000000000000e+00 71 231 0.00000000000000e+00 71 171 0.00000000000000e+00 71 84 0.00000000000000e+00 71 69 0.00000000000000e+00 71 168 0.00000000000000e+00 71 60 0.00000000000000e+00 71 0 0.00000000000000e+00 72 72 2.77777777777778e+01 72 35 -2.07082614944731e-17 72 176 2.08333333333333e+00 72 89 4.16666666666667e+00 72 76 -4.16666666666667e+00 72 34 -2.13370987545147e-16 72 175 -2.08333333333333e+00 72 88 -4.08744219027035e-17 72 75 -4.86111111111111e+00 72 33 -5.55555555555556e+00 72 174 -3.47222222222222e+00 72 87 -4.86111111111112e+00 72 83 0.00000000000000e+00 72 185 8.88178419700125e-16 72 74 0.00000000000000e+00 72 32 0.00000000000000e+00 72 182 0.00000000000000e+00 72 233 1.77700736070374e-16 72 173 4.31078783780237e-16 72 86 0.00000000000000e+00 72 82 0.00000000000000e+00 72 184 2.77555756156289e-17 72 73 8.88178419700125e-16 72 31 0.00000000000000e+00 72 181 0.00000000000000e+00 72 232 1.45716771982052e-16 72 172 -4.44089209850063e-16 72 85 0.00000000000000e+00 72 81 0.00000000000000e+00 72 183 5.55555555555556e+00 72 77 -3.64291929955129e-17 72 30 0.00000000000000e+00 72 180 0.00000000000000e+00 72 231 -1.38888888888889e+00 72 171 5.55555555555556e+00 72 84 0.00000000000000e+00 73 73 2.77777777777778e+01 73 35 -2.08333333333333e+00 73 176 2.08333333333333e+00 73 89 1.29995840481012e-16 73 76 -4.86111111111111e+00 73 34 2.77777777777778e+00 73 175 -3.47222222222222e+00 73 88 -6.94444444444445e-01 73 75 -4.16666666666667e+00 73 33 -2.28983498828939e-16 73 174 -2.08333333333333e+00 73 87 -6.93889390390723e-18 73 83 0.00000000000000e+00 73 185 -9.67108337857070e-17 73 74 -8.33333333333333e+00 73 32 0.00000000000000e+00 73 182 0.00000000000000e+00 73 233 8.33333333333333e+00 73 173 2.50979250403238e-16 73 86 0.00000000000000e+00 73 82 0.00000000000000e+00 73 184 -1.11111111111111e+01 73 77 1.90819582357449e-17 73 31 0.00000000000000e+00 73 181 0.00000000000000e+00 73 232 -9.72222222222223e+00 73 172 5.55555555555556e+00 73 85 0.00000000000000e+00 73 81 0.00000000000000e+00 73 183 1.38777878078145e-16 73 72 8.88178419700125e-16 73 30 0.00000000000000e+00 73 180 0.00000000000000e+00 73 231 7.83878170707020e-17 73 171 0.00000000000000e+00 73 84 0.00000000000000e+00 74 74 2.77777777777778e+01 74 35 2.77777777777778e+00 74 176 -3.47222222222222e+00 74 89 -4.86111111111111e+00 74 76 -2.08166817117217e-17 74 34 -2.08333333333333e+00 74 175 2.08333333333333e+00 74 88 1.50920942409982e-16 74 75 -1.04083408558608e-16 74 33 2.34187669256869e-17 74 174 2.08333333333333e+00 74 87 4.16666666666667e+00 74 83 0.00000000000000e+00 74 185 5.55555555555556e+00 74 77 -6.94444444444445e-01 74 32 0.00000000000000e+00 74 182 0.00000000000000e+00 74 233 -9.72222222222222e+00 74 173 -1.11111111111111e+01 74 86 0.00000000000000e+00 74 82 0.00000000000000e+00 74 184 -2.31585584042904e-16 74 73 -8.33333333333333e+00 74 31 0.00000000000000e+00 74 181 0.00000000000000e+00 74 232 8.33333333333333e+00 74 172 4.91685685222176e-16 74 85 0.00000000000000e+00 74 81 0.00000000000000e+00 74 183 8.88178419700125e-16 74 72 0.00000000000000e+00 74 30 0.00000000000000e+00 74 180 0.00000000000000e+00 74 231 3.72965547335014e-17 74 171 -3.83807569059869e-17 74 84 0.00000000000000e+00 75 75 5.55555555555556e+01 75 197 2.08333333333333e+00 75 112 -4.16666666666667e+00 75 196 -2.08333333333333e+00 75 111 -4.86111111111111e+00 75 195 -3.47222222222222e+00 75 200 -1.24791670053082e-16 75 107 -2.42861286636753e-17 75 236 8.33333333333333e+00 75 191 2.08333333333333e+00 75 199 2.81025203108243e-16 75 106 4.16666666666667e+00 75 235 6.41847686111419e-17 75 190 2.08333333333333e+00 75 198 -1.11111111111111e+01 75 105 -4.86111111111111e+00 75 234 -9.72222222222223e+00 75 189 -3.47222222222222e+00 75 80 -1.11022302462516e-16 75 50 8.88178419700125e-16 75 179 -2.08333333333333e+00 75 92 5.45353692760209e-17 75 79 4.16666666666667e+00 75 49 7.63278329429795e-17 75 178 2.08333333333333e+00 75 91 5.46437894932694e-17 75 78 -4.86111111111111e+00 75 48 5.55555555555556e+00 75 177 -3.47222222222222e+00 75 90 -1.38888888888889e+00 75 185 -1.97758476261356e-16 75 77 -8.88178419700125e-16 75 35 8.88178419700125e-16 75 74 -1.04083408558608e-16 75 233 -8.33333333333333e+00 75 176 2.25093923535147e-16 75 89 2.83735708539457e-16 75 173 -2.08333333333333e+00 75 184 -3.95516952522712e-16 75 76 0.00000000000000e+00 75 34 2.41126563160776e-16 75 73 -4.16666666666667e+00 75 232 -7.71951946809679e-17 75 175 4.44089209850063e-16 75 88 6.88468379528295e-17 75 172 -2.08333333333333e+00 75 183 -1.11111111111111e+01 75 113 7.45931094670027e-17 75 33 5.55555555555556e+00 75 72 -4.86111111111111e+00 75 231 -9.72222222222223e+00 75 174 1.11111111111111e+01 75 87 -1.38888888888889e+00 75 171 -3.47222222222222e+00 76 76 5.55555555555556e+01 76 197 2.08333333333333e+00 76 112 -4.86111111111111e+00 76 196 -3.47222222222222e+00 76 111 -4.16666666666667e+00 76 195 -2.08333333333333e+00 76 200 8.88178419700125e-16 76 107 2.08166817117217e-17 76 236 -3.03034507209698e-16 76 191 -2.08333333333333e+00 76 199 5.55555555555556e+00 76 106 -4.86111111111111e+00 76 235 -1.38888888888889e+00 76 190 -3.47222222222222e+00 76 198 2.35922392732846e-16 76 105 4.16666666666667e+00 76 234 -1.21430643318376e-17 76 189 2.08333333333333e+00 76 80 2.10768902331182e-16 76 50 2.89807240705375e-16 76 179 2.08333333333333e+00 76 92 8.33333333333333e+00 76 79 -4.86111111111111e+00 76 49 -1.11111111111111e+01 76 178 -3.47222222222222e+00 76 91 -9.72222222222223e+00 76 78 4.16666666666667e+00 76 48 6.76542155630955e-17 76 177 2.08333333333333e+00 76 90 9.75781955236954e-19 76 185 4.44089209850063e-16 76 77 0.00000000000000e+00 76 35 -2.60208521396521e-17 76 74 -2.08166817117217e-17 76 233 -3.83048627539129e-16 76 176 2.14644925097818e-16 76 89 -8.33333333333333e+00 76 173 -2.08333333333333e+00 76 184 5.55555555555556e+00 76 113 7.63278329429795e-17 76 34 -1.11111111111111e+01 76 73 -4.86111111111111e+00 76 232 -1.38888888888889e+00 76 175 1.11111111111111e+01 76 88 -9.72222222222223e+00 76 172 -3.47222222222222e+00 76 183 -4.90926743701436e-16 76 75 0.00000000000000e+00 76 33 3.53883589099269e-16 76 72 -4.16666666666667e+00 76 231 -1.02457105299880e-16 76 174 4.44089209850063e-16 76 87 4.77048955893622e-17 76 171 -2.08333333333333e+00 77 77 5.55555555555556e+01 77 197 -3.47222222222222e+00 77 112 3.46944695195361e-17 77 196 2.08333333333333e+00 77 111 6.93889390390723e-18 77 195 2.08333333333333e+00 77 200 5.55555555555556e+00 77 107 -6.94444444444445e-01 77 236 -9.72222222222222e+00 77 191 -3.47222222222222e+00 77 199 0.00000000000000e+00 77 106 1.17961196366423e-16 77 235 -1.60461921527855e-16 77 190 -2.08333333333333e+00 77 198 -2.54136989230602e-16 77 105 -1.24900090270330e-16 77 234 8.33333333333333e+00 77 189 2.08333333333333e+00 77 80 -6.94444444444444e-01 77 50 5.55555555555556e+00 77 179 -3.47222222222222e+00 77 92 -9.72222222222222e+00 77 79 2.49800180540660e-16 77 49 1.68268177169750e-16 77 178 2.08333333333333e+00 77 91 8.33333333333333e+00 77 78 -9.88792381306780e-17 77 48 8.88178419700125e-16 77 177 -2.08333333333333e+00 77 90 8.84708972748172e-17 77 185 5.55555555555556e+00 77 113 -6.94444444444445e-01 77 35 5.55555555555556e+00 77 74 -6.94444444444445e-01 77 233 -9.72222222222222e+00 77 176 -2.22222222222222e+01 77 89 -9.72222222222222e+00 77 173 -3.47222222222222e+00 77 184 8.88178419700125e-16 77 76 0.00000000000000e+00 77 34 -5.37764277552810e-17 77 73 1.90819582357449e-17 77 232 -2.68014777038417e-16 77 175 1.70328161297473e-16 77 88 -8.33333333333333e+00 77 172 -2.08333333333333e+00 77 183 -2.00143721040824e-16 77 75 -8.88178419700125e-16 77 33 8.88178419700125e-16 77 72 -3.72965547335014e-17 77 231 -8.33333333333333e+00 77 174 2.52402265754625e-16 77 87 8.06646416329215e-17 77 171 -2.08333333333333e+00 78 78 2.77777777777778e+01 78 83 0.00000000000000e+00 78 95 0.00000000000000e+00 78 182 0.00000000000000e+00 78 46 0.00000000000000e+00 78 82 0.00000000000000e+00 78 94 0.00000000000000e+00 78 181 0.00000000000000e+00 78 45 0.00000000000000e+00 78 81 0.00000000000000e+00 78 93 0.00000000000000e+00 78 180 0.00000000000000e+00 78 80 -8.88178419700125e-16 78 50 -1.80411241501588e-16 78 77 -7.11236625150491e-17 78 185 8.88178419700125e-16 78 179 -6.76542155630955e-17 78 92 4.16666666666667e+00 78 176 2.08333333333333e+00 78 233 6.49437101318817e-17 78 79 -8.88178419700125e-16 78 49 -2.15105711021124e-16 78 76 4.16666666666667e+00 78 184 1.38777878078145e-16 78 178 8.88178419700125e-16 78 91 -9.02056207507940e-17 78 175 2.08333333333333e+00 78 232 7.67615138119737e-17 78 47 0.00000000000000e+00 78 48 -5.55555555555556e+00 78 75 -4.86111111111111e+00 78 183 5.55555555555556e+00 78 177 5.55555555555556e+00 78 90 -4.86111111111111e+00 78 174 -3.47222222222222e+00 78 231 -1.38888888888889e+00 79 79 2.77777777777778e+01 79 83 0.00000000000000e+00 79 95 0.00000000000000e+00 79 182 0.00000000000000e+00 79 46 0.00000000000000e+00 79 82 0.00000000000000e+00 79 94 0.00000000000000e+00 79 181 0.00000000000000e+00 79 45 0.00000000000000e+00 79 81 0.00000000000000e+00 79 93 0.00000000000000e+00 79 180 0.00000000000000e+00 79 80 8.33333333333333e+00 79 50 2.08333333333333e+00 79 77 1.94289029309402e-16 79 185 2.12503625807159e-16 79 179 -4.35849273339173e-17 79 92 1.04950770296597e-16 79 176 -2.08333333333333e+00 79 233 -8.33333333333333e+00 79 47 0.00000000000000e+00 79 49 2.77777777777778e+00 79 76 -4.86111111111111e+00 79 184 -1.11111111111111e+01 79 178 5.55555555555556e+00 79 91 -6.94444444444445e-01 79 175 -3.47222222222222e+00 79 232 -9.72222222222223e+00 79 78 0.00000000000000e+00 79 48 -1.66533453693773e-16 79 75 4.16666666666667e+00 79 183 2.77555756156289e-17 79 177 8.88178419700125e-16 79 90 -1.04083408558608e-16 79 174 2.08333333333333e+00 79 231 3.38271077815477e-17 80 80 2.77777777777778e+01 80 83 0.00000000000000e+00 80 95 0.00000000000000e+00 80 182 0.00000000000000e+00 80 46 0.00000000000000e+00 80 82 0.00000000000000e+00 80 94 0.00000000000000e+00 80 181 0.00000000000000e+00 80 45 0.00000000000000e+00 80 81 0.00000000000000e+00 80 93 0.00000000000000e+00 80 180 0.00000000000000e+00 80 47 0.00000000000000e+00 80 50 2.77777777777778e+00 80 77 -6.94444444444444e-01 80 185 5.55555555555556e+00 80 179 -1.11111111111111e+01 80 92 -4.86111111111111e+00 80 176 -3.47222222222222e+00 80 233 -9.72222222222222e+00 80 79 8.33333333333333e+00 80 49 2.08333333333333e+00 80 76 2.11636264069170e-16 80 184 2.13587827979644e-17 80 178 -2.41126563160776e-16 80 91 1.11022302462516e-16 80 175 -2.08333333333333e+00 80 232 -8.33333333333333e+00 80 78 -8.88178419700125e-16 80 48 -2.22044604925031e-16 80 75 -1.17961196366423e-16 80 183 8.88178419700125e-16 80 177 5.96744875736022e-16 80 90 4.16666666666667e+00 80 174 2.08333333333333e+00 80 231 -7.45931094670027e-17 81 81 1.00000000000000e+00 81 80 0.00000000000000e+00 81 95 0.00000000000000e+00 81 179 0.00000000000000e+00 81 46 0.00000000000000e+00 81 79 0.00000000000000e+00 81 94 0.00000000000000e+00 81 178 0.00000000000000e+00 81 45 0.00000000000000e+00 81 78 0.00000000000000e+00 81 93 0.00000000000000e+00 81 177 0.00000000000000e+00 81 83 0.00000000000000e+00 81 185 0.00000000000000e+00 81 74 0.00000000000000e+00 81 32 0.00000000000000e+00 81 182 0.00000000000000e+00 81 233 0.00000000000000e+00 81 173 0.00000000000000e+00 81 86 0.00000000000000e+00 81 82 0.00000000000000e+00 81 184 0.00000000000000e+00 81 73 0.00000000000000e+00 81 31 0.00000000000000e+00 81 181 0.00000000000000e+00 81 232 0.00000000000000e+00 81 172 0.00000000000000e+00 81 85 0.00000000000000e+00 81 47 0.00000000000000e+00 81 183 0.00000000000000e+00 81 72 0.00000000000000e+00 81 30 0.00000000000000e+00 81 180 0.00000000000000e+00 81 231 0.00000000000000e+00 81 171 0.00000000000000e+00 81 84 0.00000000000000e+00 82 82 1.00000000000000e+00 82 80 0.00000000000000e+00 82 95 0.00000000000000e+00 82 179 0.00000000000000e+00 82 46 0.00000000000000e+00 82 79 0.00000000000000e+00 82 94 0.00000000000000e+00 82 178 0.00000000000000e+00 82 45 0.00000000000000e+00 82 78 0.00000000000000e+00 82 93 0.00000000000000e+00 82 177 0.00000000000000e+00 82 83 0.00000000000000e+00 82 185 0.00000000000000e+00 82 74 0.00000000000000e+00 82 32 0.00000000000000e+00 82 182 0.00000000000000e+00 82 233 0.00000000000000e+00 82 173 0.00000000000000e+00 82 86 0.00000000000000e+00 82 47 0.00000000000000e+00 82 184 0.00000000000000e+00 82 73 0.00000000000000e+00 82 31 0.00000000000000e+00 82 181 0.00000000000000e+00 82 232 0.00000000000000e+00 82 172 0.00000000000000e+00 82 85 0.00000000000000e+00 82 81 0.00000000000000e+00 82 183 0.00000000000000e+00 82 72 0.00000000000000e+00 82 30 0.00000000000000e+00 82 180 0.00000000000000e+00 82 231 0.00000000000000e+00 82 171 0.00000000000000e+00 82 84 0.00000000000000e+00 83 83 1.00000000000000e+00 83 80 0.00000000000000e+00 83 95 0.00000000000000e+00 83 179 0.00000000000000e+00 83 46 0.00000000000000e+00 83 79 0.00000000000000e+00 83 94 0.00000000000000e+00 83 178 0.00000000000000e+00 83 45 0.00000000000000e+00 83 78 0.00000000000000e+00 83 93 0.00000000000000e+00 83 177 0.00000000000000e+00 83 47 0.00000000000000e+00 83 185 0.00000000000000e+00 83 74 0.00000000000000e+00 83 32 0.00000000000000e+00 83 182 0.00000000000000e+00 83 233 0.00000000000000e+00 83 173 0.00000000000000e+00 83 86 0.00000000000000e+00 83 82 0.00000000000000e+00 83 184 0.00000000000000e+00 83 73 0.00000000000000e+00 83 31 0.00000000000000e+00 83 181 0.00000000000000e+00 83 232 0.00000000000000e+00 83 172 0.00000000000000e+00 83 85 0.00000000000000e+00 83 81 0.00000000000000e+00 83 183 0.00000000000000e+00 83 72 0.00000000000000e+00 83 30 0.00000000000000e+00 83 180 0.00000000000000e+00 83 231 0.00000000000000e+00 83 171 0.00000000000000e+00 83 84 0.00000000000000e+00 84 84 1.00000000000000e+00 84 185 0.00000000000000e+00 84 74 0.00000000000000e+00 84 32 0.00000000000000e+00 84 82 0.00000000000000e+00 84 184 0.00000000000000e+00 84 73 0.00000000000000e+00 84 31 0.00000000000000e+00 84 81 0.00000000000000e+00 84 183 0.00000000000000e+00 84 72 0.00000000000000e+00 84 30 0.00000000000000e+00 84 182 0.00000000000000e+00 84 233 0.00000000000000e+00 84 173 0.00000000000000e+00 84 86 0.00000000000000e+00 84 71 0.00000000000000e+00 84 170 0.00000000000000e+00 84 62 0.00000000000000e+00 84 2 0.00000000000000e+00 84 181 0.00000000000000e+00 84 232 0.00000000000000e+00 84 172 0.00000000000000e+00 84 85 0.00000000000000e+00 84 70 0.00000000000000e+00 84 169 0.00000000000000e+00 84 61 0.00000000000000e+00 84 1 0.00000000000000e+00 84 180 0.00000000000000e+00 84 231 0.00000000000000e+00 84 171 0.00000000000000e+00 84 83 0.00000000000000e+00 84 69 0.00000000000000e+00 84 168 0.00000000000000e+00 84 60 0.00000000000000e+00 84 0 0.00000000000000e+00 85 85 1.00000000000000e+00 85 185 0.00000000000000e+00 85 74 0.00000000000000e+00 85 32 0.00000000000000e+00 85 82 0.00000000000000e+00 85 184 0.00000000000000e+00 85 73 0.00000000000000e+00 85 31 0.00000000000000e+00 85 81 0.00000000000000e+00 85 183 0.00000000000000e+00 85 72 0.00000000000000e+00 85 30 0.00000000000000e+00 85 182 0.00000000000000e+00 85 233 0.00000000000000e+00 85 173 0.00000000000000e+00 85 86 0.00000000000000e+00 85 71 0.00000000000000e+00 85 170 0.00000000000000e+00 85 62 0.00000000000000e+00 85 2 0.00000000000000e+00 85 181 0.00000000000000e+00 85 232 0.00000000000000e+00 85 172 0.00000000000000e+00 85 83 0.00000000000000e+00 85 70 0.00000000000000e+00 85 169 0.00000000000000e+00 85 61 0.00000000000000e+00 85 1 0.00000000000000e+00 85 180 0.00000000000000e+00 85 231 0.00000000000000e+00 85 171 0.00000000000000e+00 85 84 0.00000000000000e+00 85 69 0.00000000000000e+00 85 168 0.00000000000000e+00 85 60 0.00000000000000e+00 85 0 0.00000000000000e+00 86 86 1.00000000000000e+00 86 185 0.00000000000000e+00 86 74 0.00000000000000e+00 86 32 0.00000000000000e+00 86 82 0.00000000000000e+00 86 184 0.00000000000000e+00 86 73 0.00000000000000e+00 86 31 0.00000000000000e+00 86 81 0.00000000000000e+00 86 183 0.00000000000000e+00 86 72 0.00000000000000e+00 86 30 0.00000000000000e+00 86 182 0.00000000000000e+00 86 233 0.00000000000000e+00 86 173 0.00000000000000e+00 86 83 0.00000000000000e+00 86 71 0.00000000000000e+00 86 170 0.00000000000000e+00 86 62 0.00000000000000e+00 86 2 0.00000000000000e+00 86 181 0.00000000000000e+00 86 232 0.00000000000000e+00 86 172 0.00000000000000e+00 86 85 0.00000000000000e+00 86 70 0.00000000000000e+00 86 169 0.00000000000000e+00 86 61 0.00000000000000e+00 86 1 0.00000000000000e+00 86 180 0.00000000000000e+00 86 231 0.00000000000000e+00 86 171 0.00000000000000e+00 86 84 0.00000000000000e+00 86 69 0.00000000000000e+00 86 168 0.00000000000000e+00 86 60 0.00000000000000e+00 86 0 0.00000000000000e+00 87 87 5.55555555555556e+01 87 107 -4.16666666666667e+00 87 199 -2.08333333333333e+00 87 106 3.39355279987963e-17 87 198 -3.47222222222222e+00 87 105 -4.86111111111111e+00 87 236 -7.26415455565288e-18 87 191 4.14029704617902e-16 87 188 2.08333333333333e+00 87 98 4.16666666666667e+00 87 235 -8.33333333333333e+00 87 190 4.24709096016884e-16 87 187 -2.08333333333333e+00 87 97 6.93889390390723e-17 87 234 -9.72222222222222e+00 87 189 -1.11111111111111e+01 87 186 -3.47222222222222e+00 87 96 -4.86111111111111e+00 87 185 2.08333333333333e+00 87 77 1.92554305833426e-16 87 35 -1.50812522192734e-16 87 74 4.16666666666667e+00 87 184 2.08333333333333e+00 87 76 4.77048955893622e-17 87 34 -4.44089209850063e-16 87 73 -8.67361737988404e-19 87 183 -3.47222222222222e+00 87 75 -1.38888888888889e+00 87 33 5.55555555555556e+00 87 72 -4.86111111111112e+00 87 233 -2.05564731903252e-16 87 176 1.77635683940025e-15 87 89 0.00000000000000e+00 87 173 -6.93889390390723e-17 87 170 -2.08333333333333e+00 87 65 1.65666091955785e-16 87 5 -6.99174875981590e-17 87 62 -4.16666666666667e+00 87 232 8.33333333333333e+00 87 175 -1.62630325872826e-17 87 88 -1.77635683940025e-15 87 172 -4.26741975090295e-16 87 169 2.08333333333333e+00 87 64 5.46437894932694e-17 87 4 -4.44089209850063e-16 87 61 1.30104260698261e-17 87 231 -9.72222222222222e+00 87 174 1.11111111111111e+01 87 200 -2.08333333333333e+00 87 171 -1.11111111111111e+01 87 168 -3.47222222222222e+00 87 63 -1.38888888888889e+00 87 3 5.55555555555556e+00 87 60 -4.86111111111112e+00 88 88 5.55555555555556e+01 88 107 3.13984949151802e-16 88 199 -3.47222222222222e+00 88 106 -6.94444444444445e-01 88 198 -2.08333333333333e+00 88 105 5.55111512312578e-17 88 236 1.44849410244063e-16 88 191 8.88178419700125e-16 88 188 2.08333333333333e+00 88 98 -1.23599047663348e-17 88 235 -9.72222222222222e+00 88 190 5.55555555555556e+00 88 187 -3.47222222222222e+00 88 97 -6.94444444444445e-01 88 234 -8.33333333333333e+00 88 189 4.87348876532234e-16 88 186 -2.08333333333333e+00 88 96 5.03069808033274e-17 88 185 -2.08333333333333e+00 88 77 -8.33333333333333e+00 88 35 2.73652628335341e-16 88 74 1.50920942409982e-16 88 184 -3.47222222222222e+00 88 76 -9.72222222222223e+00 88 34 5.55555555555556e+00 88 73 -6.94444444444445e-01 88 183 2.08333333333333e+00 88 75 6.88468379528295e-17 88 33 -4.44089209850063e-16 88 72 -4.08744219027035e-17 88 233 4.01913745340376e-16 88 176 -6.59737021957429e-17 88 89 -2.66453525910038e-15 88 173 0.00000000000000e+00 88 170 2.08333333333333e+00 88 65 8.33333333333333e+00 88 5 3.33798743853975e-17 88 62 -1.35742111995185e-16 88 232 -9.72222222222222e+00 88 175 -2.22222222222222e+01 88 200 -2.08333333333333e+00 88 172 5.55555555555556e+00 88 169 -3.47222222222222e+00 88 64 -9.72222222222223e+00 88 4 5.55555555555556e+00 88 61 -6.94444444444445e-01 88 231 8.33333333333333e+00 88 174 9.07748268913489e-17 88 87 -8.88178419700125e-16 88 171 -4.22296746183104e-16 88 168 2.08333333333333e+00 88 63 2.16840434497101e-19 88 3 -4.44089209850063e-16 88 60 -3.39355279987963e-17 89 89 5.55555555555556e+01 89 107 -4.86111111111111e+00 89 199 -2.08333333333333e+00 89 106 2.53486467927111e-16 89 198 -2.08333333333333e+00 89 105 -4.16666666666667e+00 89 236 -1.38888888888889e+00 89 191 5.55555555555556e+00 89 188 -3.47222222222222e+00 89 98 -4.86111111111111e+00 89 235 1.98625837999344e-16 89 190 8.88178419700125e-16 89 187 2.08333333333333e+00 89 97 -2.16840434497101e-17 89 234 1.48318857196017e-16 89 189 2.91216703529606e-16 89 186 2.08333333333333e+00 89 96 4.16666666666667e+00 89 185 -3.47222222222222e+00 89 77 -9.72222222222222e+00 89 35 -1.11111111111111e+01 89 74 -4.86111111111111e+00 89 184 -2.08333333333333e+00 89 76 -8.33333333333333e+00 89 34 3.33798743853975e-17 89 73 7.44846892497542e-17 89 183 2.08333333333333e+00 89 75 1.72713406076941e-16 89 33 -5.13884724703817e-16 89 72 4.16666666666666e+00 89 233 -1.38888888888889e+00 89 176 1.11111111111111e+01 89 200 -3.47222222222222e+00 89 173 5.55555555555556e+00 89 170 -3.47222222222222e+00 89 65 -9.72222222222222e+00 89 5 -1.11111111111111e+01 89 62 -4.86111111111111e+00 89 232 4.06792655116561e-16 89 175 -7.19910242530375e-17 89 88 -2.66453525910038e-15 89 172 0.00000000000000e+00 89 169 2.08333333333333e+00 89 64 8.33333333333333e+00 89 4 2.18141477104083e-16 89 61 -8.67361737988404e-17 89 231 -3.92481186439753e-17 89 174 1.77635683940025e-15 89 87 -8.88178419700125e-16 89 171 -8.52318432845167e-17 89 168 -2.08333333333333e+00 89 63 8.84708972748172e-17 89 3 -3.97902197302180e-17 89 60 -4.16666666666667e+00 90 90 5.55555555555556e+01 90 200 -2.08333333333333e+00 90 112 6.59194920871187e-17 90 199 2.08333333333333e+00 90 111 -4.86111111111111e+00 90 198 -3.47222222222222e+00 90 197 -3.39138439553466e-16 90 236 -1.86808034319252e-16 90 104 4.16666666666667e+00 90 188 2.08333333333333e+00 90 196 1.36934734384919e-16 90 235 8.33333333333333e+00 90 103 2.25514051876985e-17 90 187 2.08333333333333e+00 90 195 -1.11111111111111e+01 90 234 -9.72222222222222e+00 90 102 -4.86111111111111e+00 90 186 -3.47222222222222e+00 90 80 4.16666666666667e+00 90 50 1.24900090270330e-16 90 77 7.37257477290143e-17 90 185 2.08333333333333e+00 90 79 -1.04083408558608e-16 90 49 8.88178419700125e-16 90 76 2.17924636669586e-17 90 184 -2.08333333333333e+00 90 78 -4.86111111111111e+00 90 48 5.55555555555556e+00 90 75 -1.38888888888889e+00 90 183 -3.47222222222222e+00 90 179 -4.37150315946155e-16 90 92 0.00000000000000e+00 90 176 1.77635683940025e-15 90 233 2.66280053562440e-16 90 68 -4.16666666666667e+00 90 20 2.94902990916057e-16 90 65 1.71846044338952e-16 90 170 -2.08333333333333e+00 90 178 -3.38271077815477e-16 90 91 0.00000000000000e+00 90 175 2.08627603040523e-16 90 232 -8.33333333333333e+00 90 67 -9.02056207507940e-17 90 19 8.88178419700125e-16 90 64 8.27246257606440e-17 90 169 -2.08333333333333e+00 90 177 -1.11111111111111e+01 90 113 -4.16666666666667e+00 90 174 1.11111111111111e+01 90 231 -9.72222222222222e+00 90 66 -4.86111111111111e+00 90 18 5.55555555555556e+00 90 63 -1.38888888888889e+00 90 168 -3.47222222222222e+00 91 91 5.55555555555556e+01 91 200 2.08333333333333e+00 91 112 -6.94444444444445e-01 91 199 -3.47222222222222e+00 91 111 -4.85722573273506e-17 91 198 2.08333333333333e+00 91 197 1.77635683940025e-15 91 236 4.05925293378573e-16 91 104 -2.91433543964104e-16 91 188 -2.08333333333333e+00 91 196 5.55555555555556e+00 91 235 -9.72222222222222e+00 91 103 -6.94444444444444e-01 91 187 -3.47222222222222e+00 91 195 -5.46437894932694e-17 91 234 8.33333333333333e+00 91 102 -4.16333634234434e-17 91 186 2.08333333333333e+00 91 80 1.17961196366423e-16 91 50 -2.41993924898765e-16 91 77 8.33333333333333e+00 91 185 2.08333333333333e+00 91 79 -6.94444444444445e-01 91 49 5.55555555555556e+00 91 76 -9.72222222222223e+00 91 184 -3.47222222222222e+00 91 78 -9.02056207507940e-17 91 48 8.88178419700125e-16 91 75 6.85215773010839e-17 91 183 -2.08333333333333e+00 91 179 1.77635683940025e-15 91 92 0.00000000000000e+00 91 176 4.55364912443912e-16 91 233 2.02962646689286e-16 91 68 -2.48065457064683e-16 91 20 -4.77048955893622e-17 91 65 -8.33333333333333e+00 91 170 -2.08333333333333e+00 91 178 5.55555555555556e+00 91 113 1.11022302462516e-16 91 175 -2.22222222222222e+01 91 232 -9.72222222222222e+00 91 67 -6.94444444444445e-01 91 19 5.55555555555556e+00 91 64 -9.72222222222223e+00 91 169 -3.47222222222222e+00 91 177 -4.93854089567147e-16 91 90 -8.88178419700125e-16 91 174 3.72423446248771e-16 91 231 -8.33333333333333e+00 91 66 -6.93889390390723e-17 91 18 8.88178419700125e-16 91 63 6.15826833971767e-17 91 168 -2.08333333333333e+00 92 92 5.55555555555556e+01 92 200 -3.47222222222222e+00 92 112 -1.30104260698261e-17 92 199 2.08333333333333e+00 92 111 -4.16666666666667e+00 92 198 -2.08333333333333e+00 92 197 5.55555555555556e+00 92 236 -1.38888888888889e+00 92 104 -4.86111111111111e+00 92 188 -3.47222222222222e+00 92 196 8.88178419700125e-16 92 235 3.78169717762944e-16 92 103 -1.38777878078145e-16 92 187 -2.08333333333333e+00 92 195 -4.37150315946155e-16 92 234 -2.24646690138997e-16 92 102 4.16666666666667e+00 92 186 2.08333333333333e+00 92 80 -4.86111111111111e+00 92 50 -1.11111111111111e+01 92 77 -9.72222222222222e+00 92 185 -3.47222222222222e+00 92 79 2.15105711021124e-16 92 49 -3.70797142990043e-17 92 76 8.33333333333333e+00 92 184 2.08333333333333e+00 92 78 4.16666666666667e+00 92 48 9.54097911787244e-18 92 75 2.70508442035133e-16 92 183 2.08333333333333e+00 92 179 5.55555555555556e+00 92 113 -4.86111111111111e+00 92 176 1.11111111111111e+01 92 233 -1.38888888888889e+00 92 68 -4.86111111111111e+00 92 20 -1.11111111111111e+01 92 65 -9.72222222222222e+00 92 170 -3.47222222222222e+00 92 178 1.77635683940025e-15 92 91 0.00000000000000e+00 92 175 1.66601216329554e-16 92 232 1.78134416939368e-16 92 67 -1.80411241501588e-16 92 19 -1.03216046820620e-16 92 64 -8.33333333333333e+00 92 169 -2.08333333333333e+00 92 177 -2.69749500514394e-16 92 90 0.00000000000000e+00 92 174 1.77635683940025e-15 92 231 1.64581889783300e-16 92 66 -4.16666666666667e+00 92 18 2.91433543964104e-16 92 63 -3.12250225675825e-17 92 168 -2.08333333333333e+00 93 93 1.00000000000000e+00 93 80 0.00000000000000e+00 93 185 0.00000000000000e+00 93 83 0.00000000000000e+00 93 46 0.00000000000000e+00 93 79 0.00000000000000e+00 93 184 0.00000000000000e+00 93 82 0.00000000000000e+00 93 45 0.00000000000000e+00 93 78 0.00000000000000e+00 93 183 0.00000000000000e+00 93 81 0.00000000000000e+00 93 95 0.00000000000000e+00 93 179 0.00000000000000e+00 93 233 0.00000000000000e+00 93 182 0.00000000000000e+00 93 17 0.00000000000000e+00 93 68 0.00000000000000e+00 93 170 0.00000000000000e+00 93 71 0.00000000000000e+00 93 94 0.00000000000000e+00 93 178 0.00000000000000e+00 93 232 0.00000000000000e+00 93 181 0.00000000000000e+00 93 16 0.00000000000000e+00 93 67 0.00000000000000e+00 93 169 0.00000000000000e+00 93 70 0.00000000000000e+00 93 47 0.00000000000000e+00 93 177 0.00000000000000e+00 93 231 0.00000000000000e+00 93 180 0.00000000000000e+00 93 15 0.00000000000000e+00 93 66 0.00000000000000e+00 93 168 0.00000000000000e+00 93 69 0.00000000000000e+00 94 94 1.00000000000000e+00 94 80 0.00000000000000e+00 94 185 0.00000000000000e+00 94 83 0.00000000000000e+00 94 46 0.00000000000000e+00 94 79 0.00000000000000e+00 94 184 0.00000000000000e+00 94 82 0.00000000000000e+00 94 45 0.00000000000000e+00 94 78 0.00000000000000e+00 94 183 0.00000000000000e+00 94 81 0.00000000000000e+00 94 95 0.00000000000000e+00 94 179 0.00000000000000e+00 94 233 0.00000000000000e+00 94 182 0.00000000000000e+00 94 17 0.00000000000000e+00 94 68 0.00000000000000e+00 94 170 0.00000000000000e+00 94 71 0.00000000000000e+00 94 47 0.00000000000000e+00 94 178 0.00000000000000e+00 94 232 0.00000000000000e+00 94 181 0.00000000000000e+00 94 16 0.00000000000000e+00 94 67 0.00000000000000e+00 94 169 0.00000000000000e+00 94 70 0.00000000000000e+00 94 93 0.00000000000000e+00 94 177 0.00000000000000e+00 94 231 0.00000000000000e+00 94 180 0.00000000000000e+00 94 15 0.00000000000000e+00 94 66 0.00000000000000e+00 94 168 0.00000000000000e+00 94 69 0.00000000000000e+00 95 95 1.00000000000000e+00 95 80 0.00000000000000e+00 95 185 0.00000000000000e+00 95 83 0.00000000000000e+00 95 46 0.00000000000000e+00 95 79 0.00000000000000e+00 95 184 0.00000000000000e+00 95 82 0.00000000000000e+00 95 45 0.00000000000000e+00 95 78 0.00000000000000e+00 95 183 0.00000000000000e+00 95 81 0.00000000000000e+00 95 47 0.00000000000000e+00 95 179 0.00000000000000e+00 95 233 0.00000000000000e+00 95 182 0.00000000000000e+00 95 17 0.00000000000000e+00 95 68 0.00000000000000e+00 95 170 0.00000000000000e+00 95 71 0.00000000000000e+00 95 94 0.00000000000000e+00 95 178 0.00000000000000e+00 95 232 0.00000000000000e+00 95 181 0.00000000000000e+00 95 16 0.00000000000000e+00 95 67 0.00000000000000e+00 95 169 0.00000000000000e+00 95 70 0.00000000000000e+00 95 93 0.00000000000000e+00 95 177 0.00000000000000e+00 95 231 0.00000000000000e+00 95 180 0.00000000000000e+00 95 15 0.00000000000000e+00 95 66 0.00000000000000e+00 95 168 0.00000000000000e+00 95 69 0.00000000000000e+00 96 96 2.77777777777778e+01 96 116 -4.16666666666667e+00 96 101 -1.02348685082632e-16 96 8 -1.02866391619993e-15 96 193 -2.08333333333333e+00 96 115 -2.68882138776405e-17 96 100 -4.16666666666667e+00 96 7 -1.79733615143784e-16 96 192 -3.47222222222222e+00 96 114 -4.86111111111112e+00 96 99 -4.86111111111111e+00 96 6 -5.55555555555555e+00 96 176 2.08333333333333e+00 96 236 1.98625837999344e-16 96 191 3.96492734477949e-16 96 89 4.16666666666667e+00 96 65 1.29236898960272e-16 96 188 4.44089209850063e-16 96 98 3.55271367880050e-15 96 5 1.42030484595601e-16 96 175 2.08333333333333e+00 96 235 -5.11743425413158e-17 96 190 -4.44089209850063e-16 96 88 4.94396190653390e-17 96 64 4.16666666666666e+00 96 187 1.86591193884755e-16 96 97 0.00000000000000e+00 96 4 2.53161207275365e-16 96 174 -3.47222222222222e+00 96 234 -1.38888888888889e+00 96 189 5.55555555555556e+00 96 87 -4.86111111111111e+00 96 63 -4.86111111111111e+00 96 186 5.55555555555556e+00 96 194 -2.08333333333333e+00 96 3 -5.55555555555555e+00 97 97 2.77777777777778e+01 97 116 1.61329283265843e-16 97 101 -4.63171168085807e-16 97 8 2.08333333333333e+00 97 193 -3.47222222222222e+00 97 115 -6.94444444444446e-01 97 100 -4.86111111111111e+00 97 7 2.77777777777778e+00 97 192 -2.08333333333333e+00 97 114 6.07153216591882e-18 97 99 -4.16666666666667e+00 97 6 -2.00468981692570e-16 97 176 -2.08333333333333e+00 97 236 -8.33333333333333e+00 97 191 1.18481613409216e-15 97 89 -2.16840434497101e-17 97 65 1.48427277413266e-16 97 188 1.29670579829266e-16 97 98 8.33333333333333e+00 97 5 2.08333333333333e+00 97 175 -3.47222222222222e+00 97 235 -9.72222222222223e+00 97 190 5.55555555555556e+00 97 88 -6.94444444444445e-01 97 64 -4.86111111111111e+00 97 187 -1.11111111111111e+01 97 194 -2.08333333333333e+00 97 4 2.77777777777778e+00 97 174 2.08333333333333e+00 97 234 4.07660016854550e-17 97 189 0.00000000000000e+00 97 87 2.77555756156289e-17 97 63 4.16666666666667e+00 97 186 1.69000013636178e-17 97 96 -8.88178419700125e-16 97 3 1.30673466838815e-16 98 98 2.77777777777778e+01 98 116 -4.86111111111111e+00 98 101 -6.94444444444444e-01 98 8 2.77777777777778e+00 98 193 -2.08333333333333e+00 98 115 1.68268177169750e-16 98 100 -5.08273978461204e-16 98 7 2.08333333333333e+00 98 192 -2.08333333333333e+00 98 114 -4.16666666666667e+00 98 99 -1.04950770296597e-16 98 6 -9.85431354572075e-16 98 176 -3.47222222222222e+00 98 236 -9.72222222222222e+00 98 191 -1.11111111111111e+01 98 89 -4.86111111111111e+00 98 65 -6.94444444444444e-01 98 188 5.55555555555556e+00 98 194 -3.47222222222222e+00 98 5 2.77777777777778e+00 98 175 -2.08333333333333e+00 98 235 -8.33333333333334e+00 98 190 5.71171256992520e-16 98 88 -1.23599047663348e-17 98 64 1.49186218934005e-16 98 187 5.67254576644416e-16 98 97 8.33333333333333e+00 98 4 2.08333333333333e+00 98 174 2.08333333333333e+00 98 234 1.67400815431762e-16 98 189 3.69387680165811e-16 98 87 4.16666666666667e+00 98 63 -2.37440275774325e-17 98 186 4.44089209850063e-16 98 96 3.55271367880050e-15 98 3 2.25812207474418e-16 99 99 5.55555555555556e+01 99 128 -1.13299127024735e-16 99 211 -2.08333333333333e+00 99 127 -4.16666666666667e+00 99 210 -3.47222222222222e+00 99 126 -4.86111111111111e+00 99 239 -8.33333333333333e+00 99 206 -2.08333333333333e+00 99 203 -1.20111982426091e-15 99 122 -2.37331855557077e-16 99 238 -2.39283419467551e-16 99 205 2.08333333333333e+00 99 202 -2.50098336138094e-16 99 121 4.16666666666666e+00 99 237 -9.72222222222223e+00 99 204 -3.47222222222222e+00 99 201 -1.11111111111111e+01 99 120 -4.86111111111111e+00 99 197 2.08333333333333e+00 99 119 4.02455846426619e-16 99 104 -2.19442519711066e-16 99 23 1.33226762955019e-15 99 196 2.08333333333333e+00 99 118 2.26381413614973e-16 99 103 4.16666666666667e+00 99 22 2.93276687657329e-16 99 195 -3.47222222222222e+00 99 117 -1.38888888888889e+00 99 102 -4.86111111111111e+00 99 21 5.55555555555556e+00 99 236 8.33333333333333e+00 99 194 1.29193530873373e-15 99 116 4.57966997657877e-16 99 191 2.08333333333333e+00 99 188 -1.64798730217797e-15 99 101 4.44089209850063e-15 99 8 8.88178419700125e-16 99 98 -1.08420217248550e-16 99 235 -4.94396190653390e-17 99 193 8.88178419700125e-16 99 115 1.30646361784503e-16 99 190 -2.08333333333333e+00 99 187 -5.37764277552810e-16 99 100 -1.77635683940025e-15 99 7 4.08825534189972e-16 99 97 -4.16666666666667e+00 99 234 -9.72222222222223e+00 99 192 1.11111111111111e+01 99 114 -1.38888888888889e+00 99 189 -3.47222222222222e+00 99 186 -1.11111111111111e+01 99 212 -2.08333333333333e+00 99 6 5.55555555555556e+00 99 96 -4.86111111111111e+00 100 100 5.55555555555556e+01 100 128 -3.84891771232354e-17 100 211 -3.47222222222222e+00 100 127 -4.86111111111111e+00 100 210 -2.08333333333333e+00 100 126 -4.16666666666667e+00 100 239 -2.81025203108243e-16 100 206 2.08333333333333e+00 100 203 1.33226762955019e-15 100 122 8.30065183254902e-16 100 238 -1.38888888888889e+00 100 205 -3.47222222222222e+00 100 202 5.55555555555555e+00 100 121 -4.86111111111111e+00 100 237 -1.59594559789866e-16 100 204 2.08333333333333e+00 100 201 -8.40256683676266e-17 100 120 4.16666666666667e+00 100 197 -2.08333333333333e+00 100 119 -8.33333333333333e+00 100 104 5.12393946716649e-16 100 23 7.87076567115852e-16 100 196 -3.47222222222222e+00 100 118 -9.72222222222223e+00 100 103 -4.86111111111111e+00 100 22 -1.11111111111111e+01 100 195 2.08333333333333e+00 100 117 1.42897846333589e-16 100 102 4.16666666666666e+00 100 21 2.90755917606300e-16 100 236 4.51895465491958e-16 100 194 4.98949839777829e-16 100 116 8.33333333333333e+00 100 191 2.08333333333333e+00 100 188 1.33226762955019e-15 100 101 -5.32907051820075e-15 100 8 9.84021891747844e-16 100 98 -5.01335084557297e-16 100 235 -1.38888888888889e+00 100 193 1.11111111111111e+01 100 115 -9.72222222222223e+00 100 190 -3.47222222222222e+00 100 187 5.55555555555556e+00 100 212 -2.08333333333333e+00 100 7 -1.11111111111111e+01 100 97 -4.86111111111111e+00 100 234 -1.06577073555325e-16 100 192 8.88178419700125e-16 100 114 1.16226472890446e-16 100 189 -2.08333333333333e+00 100 186 -4.24004364604769e-16 100 99 -1.77635683940025e-15 100 6 2.93276687657329e-16 100 96 -4.16666666666667e+00 101 101 5.55555555555556e+01 101 128 -6.94444444444444e-01 101 211 -2.08333333333333e+00 101 127 -1.05818132034585e-16 101 210 -2.08333333333333e+00 101 126 -1.90819582357449e-17 101 239 -9.72222222222222e+00 101 206 -3.47222222222222e+00 101 203 5.55555555555555e+00 101 122 -6.94444444444444e-01 101 238 -2.22369865576777e-16 101 205 2.08333333333333e+00 101 202 8.88178419700125e-16 101 121 7.38233259245380e-16 101 237 -8.33333333333333e+00 101 204 -2.08333333333333e+00 101 201 -1.14144804719274e-15 101 120 -1.36175792864179e-16 101 197 -3.47222222222222e+00 101 119 -9.72222222222222e+00 101 104 -6.94444444444444e-01 101 23 5.55555555555556e+00 101 196 -2.08333333333333e+00 101 118 -8.33333333333333e+00 101 103 5.03937169771262e-16 101 22 1.08810530030645e-15 101 195 2.08333333333333e+00 101 117 1.52764086103208e-16 101 102 -2.20201461231806e-16 101 21 1.33226762955019e-15 101 236 -9.72222222222222e+00 101 194 -2.22222222222222e+01 101 116 -9.72222222222222e+00 101 191 -3.47222222222222e+00 101 188 5.55555555555555e+00 101 212 -3.47222222222222e+00 101 8 5.55555555555556e+00 101 98 -6.94444444444444e-01 101 235 3.95300112088215e-16 101 193 2.77623518792069e-16 101 115 8.33333333333333e+00 101 190 2.08333333333333e+00 101 187 1.33226762955019e-15 101 100 -6.21724893790088e-15 101 7 6.69115370749429e-16 101 97 -4.91794105439425e-16 101 234 8.33333333333333e+00 101 192 1.00410673699314e-15 101 114 1.52764086103208e-16 101 189 2.08333333333333e+00 101 186 -1.64264760647848e-15 101 99 4.44089209850063e-15 101 6 8.88178419700125e-16 101 96 -1.27502175484295e-16 102 102 2.77777777777778e+01 102 176 2.08333333333333e+00 102 20 -1.66533453693773e-16 102 65 1.27502175484295e-16 102 91 -4.16333634234434e-17 102 175 -2.08333333333333e+00 102 19 5.81132364452230e-17 102 64 -4.16666666666667e+00 102 90 -4.86111111111111e+00 102 174 -3.47222222222222e+00 102 18 -5.55555555555555e+00 102 63 -4.86111111111111e+00 102 197 2.84494650060196e-16 102 119 -4.16666666666667e+00 102 194 -2.08333333333333e+00 102 236 1.43114686768087e-16 102 104 8.88178419700125e-16 102 23 -5.03069808033274e-16 102 101 -1.89084858881472e-16 102 188 4.44089209850063e-16 102 196 8.88178419700125e-16 102 118 -8.50014503228635e-17 102 193 2.08333333333333e+00 102 235 7.52436307704940e-17 102 103 -1.77635683940025e-15 102 22 -2.99890320909491e-16 102 100 4.16666666666666e+00 102 187 -3.86111498676400e-17 102 195 5.55555555555556e+00 102 117 -4.86111111111111e+00 102 192 -3.47222222222222e+00 102 234 -1.38888888888889e+00 102 92 4.16666666666667e+00 102 21 -5.55555555555555e+00 102 99 -4.86111111111111e+00 102 186 5.55555555555556e+00 103 103 2.77777777777778e+01 103 176 2.08333333333333e+00 103 20 -2.08333333333333e+00 103 65 1.09287578986539e-16 103 91 -6.94444444444444e-01 103 175 -3.47222222222222e+00 103 19 2.77777777777778e+00 103 64 -4.86111111111111e+00 103 90 3.64291929955129e-17 103 174 -2.08333333333333e+00 103 18 2.34838190560360e-16 103 63 -4.16666666666667e+00 103 197 -8.29197821516914e-16 103 119 -5.55111512312578e-17 103 194 2.08333333333333e+00 103 236 8.33333333333333e+00 103 104 -8.33333333333333e+00 103 23 -2.08333333333333e+00 103 101 5.03937169771262e-16 103 188 6.29704621779581e-16 103 196 5.55555555555556e+00 103 118 -6.94444444444445e-01 103 193 -3.47222222222222e+00 103 235 -9.72222222222223e+00 103 92 -1.66533453693773e-16 103 22 2.77777777777778e+00 103 100 -4.86111111111111e+00 103 187 -1.11111111111111e+01 103 195 8.88178419700125e-16 103 117 -2.77555756156289e-17 103 192 2.08333333333333e+00 103 234 -9.54097911787244e-18 103 102 -1.77635683940025e-15 103 21 -2.26381413614973e-16 103 99 4.16666666666667e+00 103 186 7.20994444702860e-17 104 104 2.77777777777778e+01 104 176 -3.47222222222222e+00 104 20 2.77777777777778e+00 104 65 -6.94444444444443e-01 104 91 -1.80411241501588e-16 104 175 2.08333333333333e+00 104 19 -2.08333333333333e+00 104 64 1.25116930704827e-16 104 90 4.16666666666667e+00 104 174 2.08333333333333e+00 104 18 -2.15105711021124e-16 104 63 8.39172481503780e-17 104 197 -1.11111111111111e+01 104 119 -4.86111111111111e+00 104 194 -3.47222222222222e+00 104 236 -9.72222222222222e+00 104 92 -4.86111111111111e+00 104 23 2.77777777777778e+00 104 101 -6.94444444444444e-01 104 188 5.55555555555556e+00 104 196 -3.46727854760864e-16 104 118 9.45424294407360e-17 104 193 2.08333333333333e+00 104 235 8.33333333333333e+00 104 103 -8.33333333333333e+00 104 22 -2.08333333333333e+00 104 100 5.71374544899861e-16 104 187 4.69676381120721e-16 104 195 2.59341159658533e-16 104 117 -4.16666666666667e+00 104 192 -2.08333333333333e+00 104 234 5.78963960107259e-17 104 102 8.88178419700125e-16 104 21 -6.73072708679001e-16 104 99 -2.35922392732846e-16 104 186 4.44089209850063e-16 105 105 2.77777777777778e+01 105 38 -9.88683961089531e-16 105 194 2.08333333333333e+00 105 116 4.16666666666666e+00 105 109 -4.16666666666667e+00 105 37 -2.81025203108243e-16 105 193 -2.08333333333333e+00 105 115 -6.24500451351651e-17 105 108 -4.86111111111111e+00 105 36 -5.55555555555556e+00 105 192 -3.47222222222222e+00 105 114 -4.86111111111111e+00 105 77 -1.38777878078145e-17 105 200 1.33226762955019e-15 105 107 -8.88178419700125e-16 105 35 1.37043154602168e-16 105 176 -2.08333333333333e+00 105 236 1.67292395214513e-16 105 191 4.24898831397069e-16 105 89 -4.16666666666667e+00 105 76 4.16666666666667e+00 105 199 1.73472347597681e-16 105 106 8.88178419700125e-16 105 34 2.28983498828939e-16 105 175 2.08333333333333e+00 105 235 4.33680868994202e-18 105 190 0.00000000000000e+00 105 88 4.16333634234434e-17 105 75 -4.86111111111111e+00 105 198 5.55555555555555e+00 105 110 -9.28077059647592e-17 105 33 -5.55555555555555e+00 105 174 -3.47222222222222e+00 105 234 -1.38888888888889e+00 105 189 5.55555555555556e+00 105 87 -4.86111111111111e+00 106 106 2.77777777777778e+01 106 38 -2.08333333333333e+00 106 194 2.08333333333333e+00 106 116 8.57603918436034e-17 106 109 -4.86111111111111e+00 106 37 2.77777777777778e+00 106 193 -3.47222222222222e+00 106 115 -6.94444444444444e-01 106 108 -4.16666666666667e+00 106 36 -3.40005801291454e-16 106 192 -2.08333333333333e+00 106 114 -2.77555756156289e-17 106 77 1.17961196366423e-16 106 200 -4.02347426209371e-16 106 107 -8.33333333333333e+00 106 35 -2.08333333333333e+00 106 176 2.08333333333333e+00 106 236 8.33333333333333e+00 106 191 5.50354575280798e-16 106 89 2.53594888144359e-16 106 76 -4.86111111111111e+00 106 199 -1.11111111111111e+01 106 110 -5.93275428784068e-16 106 34 2.77777777777778e+00 106 175 -3.47222222222222e+00 106 235 -9.72222222222223e+00 106 190 5.55555555555556e+00 106 88 -6.94444444444445e-01 106 75 4.16666666666667e+00 106 198 1.34441069388203e-16 106 105 8.88178419700125e-16 106 33 1.35308431126191e-16 106 174 2.08333333333333e+00 106 234 7.60025722912339e-17 106 189 0.00000000000000e+00 106 87 3.29597460435593e-17 107 107 2.77777777777778e+01 107 38 2.77777777777778e+00 107 194 -3.47222222222222e+00 107 116 -4.86111111111111e+00 107 109 -7.21644966006352e-16 107 37 -2.08333333333333e+00 107 193 2.08333333333333e+00 107 115 2.92300905702092e-16 107 108 -8.32667268468867e-17 107 36 -1.14578485588268e-15 107 192 2.08333333333333e+00 107 114 4.16666666666667e+00 107 77 -6.94444444444445e-01 107 200 5.55555555555556e+00 107 110 -6.94444444444444e-01 107 35 2.77777777777778e+00 107 176 -3.47222222222222e+00 107 236 -9.72222222222222e+00 107 191 -1.11111111111111e+01 107 89 -4.86111111111111e+00 107 76 4.85722573273506e-17 107 199 -5.51642065360625e-16 107 106 -8.33333333333333e+00 107 34 -2.08333333333333e+00 107 175 2.08333333333333e+00 107 235 8.33333333333333e+00 107 190 1.12236608895699e-15 107 88 3.69496100383060e-16 107 75 1.82145964977565e-17 107 198 1.33226762955019e-15 107 105 -8.88178419700125e-16 107 33 1.75207071073658e-16 107 174 -2.08333333333333e+00 107 234 1.36175792864179e-16 107 189 2.86337793753422e-16 107 87 -4.16666666666667e+00 108 108 5.55555555555556e+01 108 212 2.08333333333333e+00 108 136 -4.16666666666667e+00 108 211 -2.08333333333333e+00 108 135 -4.86111111111111e+00 108 210 -3.47222222222222e+00 108 215 -1.27155230789100e-15 108 131 -2.67147415300428e-16 108 239 8.33333333333333e+00 108 206 2.08333333333333e+00 108 214 -2.04697370165263e-16 108 130 4.16666666666667e+00 108 238 -2.81784144628983e-16 108 205 2.08333333333333e+00 108 213 -1.11111111111111e+01 108 129 -4.86111111111111e+00 108 237 -9.72222222222223e+00 108 204 -3.47222222222222e+00 108 113 -8.32667268468867e-17 108 53 8.88178419700125e-16 108 197 -2.08333333333333e+00 108 119 3.33934269125535e-16 108 112 4.16666666666667e+00 108 52 5.06539254985228e-16 108 196 2.08333333333333e+00 108 118 1.16226472890446e-16 108 111 -4.86111111111111e+00 108 51 5.55555555555556e+00 108 195 -3.47222222222222e+00 108 117 -1.38888888888889e+00 108 200 -1.47885176327023e-15 108 110 3.55271367880050e-15 108 38 8.88178419700125e-16 108 107 -8.32667268468867e-17 108 236 -8.33333333333333e+00 108 194 1.05885894670366e-15 108 116 3.33283747822044e-16 108 191 -2.08333333333333e+00 108 199 -5.62050406216485e-16 108 109 1.77635683940025e-15 108 37 3.34801630863524e-16 108 106 -4.16666666666667e+00 108 235 6.07153216591882e-18 108 193 8.88178419700125e-16 108 115 1.70761842166467e-16 108 190 -2.08333333333333e+00 108 198 -1.11111111111111e+01 108 137 -1.13624387676481e-16 108 36 5.55555555555556e+00 108 105 -4.86111111111111e+00 108 234 -9.72222222222223e+00 108 192 1.11111111111111e+01 108 114 -1.38888888888889e+00 108 189 -3.47222222222222e+00 109 109 5.55555555555556e+01 109 212 2.08333333333333e+00 109 136 -4.86111111111111e+00 109 211 -3.47222222222222e+00 109 135 -4.16666666666667e+00 109 210 -2.08333333333333e+00 109 215 4.44089209850063e-16 109 131 7.00828284294630e-16 109 38 4.16333634234434e-17 109 239 1.14817010066215e-16 109 206 -2.08333333333333e+00 109 214 5.55555555555555e+00 109 130 -4.86111111111111e+00 109 238 -1.38888888888889e+00 109 205 -3.47222222222222e+00 109 213 -1.38777878078145e-17 109 129 4.16666666666667e+00 109 237 -2.28116137090950e-16 109 204 2.08333333333333e+00 109 113 3.65159291693118e-16 109 53 4.05925293378573e-16 109 197 2.08333333333333e+00 109 119 8.33333333333333e+00 109 112 -4.86111111111111e+00 109 52 -1.11111111111111e+01 109 196 -3.47222222222222e+00 109 118 -9.72222222222223e+00 109 111 4.16666666666667e+00 109 51 2.23779328401008e-16 109 195 2.08333333333333e+00 109 117 1.44524149592318e-16 109 200 1.77635683940025e-15 109 110 0.00000000000000e+00 109 107 -7.14706072102445e-16 109 236 2.62810606610486e-16 109 194 2.98548620721040e-16 109 116 -8.33333333333333e+00 109 191 -2.08333333333333e+00 109 199 5.55555555555556e+00 109 137 -3.98986399474666e-17 109 37 -1.11111111111111e+01 109 106 -4.86111111111111e+00 109 235 -1.38888888888889e+00 109 193 1.11111111111111e+01 109 115 -9.72222222222223e+00 109 190 -3.47222222222222e+00 109 198 -5.23886489744996e-16 109 108 1.77635683940025e-15 109 36 5.06539254985228e-16 109 105 -4.16666666666667e+00 109 234 -1.11889664200504e-16 109 192 8.88178419700125e-16 109 114 2.41126563160776e-16 109 189 -2.08333333333333e+00 110 110 5.55555555555556e+01 110 212 -3.47222222222222e+00 110 136 -4.16333634234434e-17 110 211 2.08333333333333e+00 110 135 -1.80411241501588e-16 110 210 2.08333333333333e+00 110 215 5.55555555555555e+00 110 131 -6.94444444444444e-01 110 239 -9.72222222222222e+00 110 206 -3.47222222222222e+00 110 214 4.44089209850063e-16 110 130 6.74807432154978e-16 110 238 1.13624387676481e-16 110 205 -2.08333333333333e+00 110 213 -1.43114686768087e-15 110 129 -3.19189119579733e-16 110 237 8.33333333333333e+00 110 204 2.08333333333333e+00 110 113 -6.94444444444444e-01 110 53 5.55555555555555e+00 110 197 -3.47222222222222e+00 110 119 -9.72222222222222e+00 110 112 3.53883589099269e-16 110 52 4.30211422042248e-16 110 196 2.08333333333333e+00 110 118 8.33333333333333e+00 110 111 -1.76074432811646e-16 110 51 8.88178419700125e-16 110 195 -2.08333333333333e+00 110 117 4.30211422042248e-16 110 200 5.55555555555556e+00 110 137 -6.94444444444444e-01 110 38 5.55555555555555e+00 110 107 -6.94444444444444e-01 110 236 -9.72222222222222e+00 110 194 -2.22222222222222e+01 110 116 -9.72222222222222e+00 110 191 -3.47222222222222e+00 110 199 2.22044604925031e-15 110 109 8.88178419700125e-16 110 37 -3.82723366887383e-17 110 106 -5.93275428784068e-16 110 235 8.50014503228635e-17 110 193 5.05888733681736e-16 110 115 -8.33333333333333e+00 110 190 -2.08333333333333e+00 110 198 -1.50899258366533e-15 110 108 3.55271367880050e-15 110 36 8.88178419700125e-16 110 105 -9.28077059647592e-17 110 234 -8.33333333333333e+00 110 192 1.54162706905714e-15 110 114 5.96744875736022e-16 110 189 -2.08333333333333e+00 111 111 2.77777777777778e+01 111 77 1.24900090270330e-16 111 92 -4.16666666666667e+00 111 176 -2.08333333333333e+00 111 49 5.55111512312578e-17 111 76 -4.16666666666667e+00 111 91 -2.77555756156289e-17 111 175 -2.08333333333333e+00 111 48 -5.55555555555555e+00 111 75 -4.86111111111111e+00 111 90 -4.86111111111111e+00 111 174 -3.47222222222222e+00 111 113 8.88178419700125e-16 111 53 -5.75928194024300e-16 111 110 -1.76074432811646e-16 111 200 1.33226762955019e-15 111 197 3.72965547335014e-17 111 119 4.16666666666667e+00 111 194 2.08333333333333e+00 111 236 5.71374544899861e-17 111 112 0.00000000000000e+00 111 52 -2.98372437868011e-16 111 109 4.16666666666667e+00 111 199 1.64798730217797e-17 111 196 8.88178419700125e-16 111 118 -5.81132364452230e-17 111 193 2.08333333333333e+00 111 235 2.67797936603920e-17 111 50 -1.11022302462516e-16 111 51 -5.55555555555556e+00 111 108 -4.86111111111111e+00 111 198 5.55555555555555e+00 111 195 5.55555555555556e+00 111 117 -4.86111111111111e+00 111 192 -3.47222222222222e+00 111 234 -1.38888888888889e+00 112 112 2.77777777777778e+01 112 77 3.46944695195361e-17 112 92 9.80118763926896e-17 112 176 -2.08333333333333e+00 112 49 2.77777777777778e+00 112 76 -4.86111111111111e+00 112 91 -6.94444444444445e-01 112 175 -3.47222222222222e+00 112 48 2.91433543964104e-16 112 75 -4.16666666666667e+00 112 90 6.50521303491303e-17 112 174 -2.08333333333333e+00 112 113 8.33333333333333e+00 112 53 2.08333333333333e+00 112 110 3.53883589099269e-16 112 200 -1.07552855510562e-16 112 197 -4.47233396150271e-16 112 119 3.10515502199848e-16 112 194 -2.08333333333333e+00 112 236 -8.33333333333334e+00 112 50 2.08333333333333e+00 112 52 2.77777777777778e+00 112 109 -4.86111111111111e+00 112 199 -1.11111111111111e+01 112 196 5.55555555555556e+00 112 118 -6.94444444444444e-01 112 193 -3.47222222222222e+00 112 235 -9.72222222222223e+00 112 111 0.00000000000000e+00 112 51 -2.77555756156289e-16 112 108 4.16666666666667e+00 112 198 5.55111512312578e-17 112 195 8.88178419700125e-16 112 117 -3.46944695195361e-17 112 192 2.08333333333333e+00 112 234 -5.11743425413158e-17 113 113 2.77777777777778e+01 113 77 -6.94444444444445e-01 113 92 -4.86111111111111e+00 113 176 -3.47222222222222e+00 113 49 2.08333333333333e+00 113 76 2.08166817117217e-17 113 91 1.11022302462516e-16 113 175 -2.08333333333333e+00 113 48 -1.87350135405495e-16 113 75 7.37257477290143e-17 113 90 -4.16666666666667e+00 113 174 -2.08333333333333e+00 113 50 2.77777777777778e+00 113 53 2.77777777777778e+00 113 110 -6.94444444444444e-01 113 200 5.55555555555556e+00 113 197 -1.11111111111111e+01 113 119 -4.86111111111111e+00 113 194 -3.47222222222222e+00 113 236 -9.72222222222222e+00 113 112 8.33333333333333e+00 113 52 2.08333333333333e+00 113 109 4.20670442924376e-16 113 199 -1.76724954115137e-16 113 196 -7.73686670285656e-16 113 118 2.98372437868011e-16 113 193 -2.08333333333333e+00 113 235 -8.33333333333333e+00 113 111 8.88178419700125e-16 113 51 -3.88578058618805e-16 113 108 -8.32667268468867e-17 113 198 1.33226762955019e-15 113 195 2.22044604925031e-16 113 117 4.16666666666667e+00 113 192 2.08333333333333e+00 113 234 -2.34187669256869e-17 114 114 5.55555555555556e+01 114 131 -4.16666666666667e+00 114 214 -2.08333333333333e+00 114 130 -8.57603918436034e-17 114 213 -3.47222222222222e+00 114 129 -4.86111111111112e+00 114 239 -4.77591056979865e-16 114 206 4.08595141228318e-16 114 203 2.08333333333333e+00 114 122 4.16666666666667e+00 114 238 -8.33333333333333e+00 114 205 -1.73987343629611e-16 114 202 -2.08333333333333e+00 114 121 -9.26992857475106e-17 114 237 -9.72222222222222e+00 114 204 -1.11111111111111e+01 114 201 -3.47222222222222e+00 114 120 -4.86111111111112e+00 114 200 2.08333333333333e+00 114 110 5.13478148889135e-16 114 38 3.82940207321880e-16 114 107 4.16666666666667e+00 114 199 2.08333333333333e+00 114 109 2.40259201422788e-16 114 37 0.00000000000000e+00 114 106 -2.86229373536173e-17 114 198 -3.47222222222222e+00 114 108 -1.38888888888889e+00 114 36 5.55555555555556e+00 114 105 -4.86111111111111e+00 114 236 -1.91686944095437e-16 114 194 1.77635683940025e-15 114 116 4.44089209850063e-15 114 191 -1.89865484445662e-15 114 188 -2.08333333333333e+00 114 101 3.89553840574042e-16 114 8 3.19880298464692e-16 114 98 -4.16666666666667e+00 114 235 8.33333333333333e+00 114 193 7.99815942642557e-16 114 115 0.00000000000000e+00 114 190 -4.28476698566271e-16 114 187 2.08333333333333e+00 114 100 1.16226472890446e-16 114 7 0.00000000000000e+00 114 97 3.38271077815477e-17 114 234 -9.72222222222222e+00 114 192 1.11111111111111e+01 114 215 -2.08333333333333e+00 114 189 -1.11111111111111e+01 114 186 -3.47222222222222e+00 114 99 -1.38888888888889e+00 114 6 5.55555555555556e+00 114 96 -4.86111111111112e+00 115 115 5.55555555555556e+01 115 131 -3.64291929955129e-16 115 214 -3.47222222222222e+00 115 130 -6.94444444444445e-01 115 213 -2.08333333333333e+00 115 129 -6.93889390390723e-18 115 239 -8.28330459778925e-17 115 206 -4.44089209850063e-16 115 203 2.08333333333333e+00 115 122 -1.25767452008319e-17 115 238 -9.72222222222222e+00 115 205 5.55555555555555e+00 115 202 -3.47222222222222e+00 115 121 -6.94444444444446e-01 115 237 -8.33333333333333e+00 115 204 4.01696904905879e-16 115 201 -2.08333333333333e+00 115 120 8.67361737988404e-19 115 200 -2.08333333333333e+00 115 110 -8.33333333333333e+00 115 38 8.87527898396634e-16 115 107 2.64545330086463e-16 115 199 -3.47222222222222e+00 115 109 -9.72222222222223e+00 115 37 5.55555555555556e+00 115 106 -6.94444444444444e-01 115 198 2.08333333333333e+00 115 108 1.56775634141404e-16 115 36 0.00000000000000e+00 115 105 -5.54027310140093e-17 115 236 7.66422515730003e-16 115 194 6.23023225891639e-16 115 116 -4.44089209850063e-15 115 191 0.00000000000000e+00 115 188 2.08333333333333e+00 115 101 8.33333333333333e+00 115 8 4.13053922662665e-16 115 98 1.67400815431762e-16 115 235 -9.72222222222222e+00 115 193 -2.22222222222222e+01 115 215 -2.08333333333333e+00 115 190 5.55555555555556e+00 115 187 -3.47222222222222e+00 115 100 -9.72222222222223e+00 115 7 5.55555555555556e+00 115 97 -6.94444444444446e-01 115 234 8.33333333333333e+00 115 192 5.18099560649354e-16 115 114 0.00000000000000e+00 115 189 -2.93141162385768e-16 115 186 2.08333333333333e+00 115 99 1.43765208071578e-16 115 6 0.00000000000000e+00 115 96 -2.86229373536173e-17 116 116 5.55555555555556e+01 116 131 -4.86111111111111e+00 116 214 -2.08333333333333e+00 116 130 -3.07262895682392e-16 116 213 -2.08333333333333e+00 116 129 -4.16666666666667e+00 116 239 -1.38888888888889e+00 116 206 5.55555555555555e+00 116 203 -3.47222222222222e+00 116 122 -4.86111111111111e+00 116 238 -2.02962646689286e-16 116 205 0.00000000000000e+00 116 202 2.08333333333333e+00 116 121 -1.76941794549634e-16 116 237 -4.28476698566271e-16 116 204 2.79290479632266e-16 116 201 2.08333333333333e+00 116 120 4.16666666666667e+00 116 200 -3.47222222222222e+00 116 110 -9.72222222222222e+00 116 38 -1.11111111111111e+01 116 107 -4.86111111111111e+00 116 199 -2.08333333333333e+00 116 109 -8.33333333333333e+00 116 37 4.82442861701737e-16 116 106 1.96782694306119e-16 116 193 1.11575245570483e-15 116 198 2.08333333333333e+00 116 108 2.63786388565723e-16 116 36 2.64260727016186e-16 116 105 4.16666666666666e+00 116 236 -1.38888888888889e+00 116 194 1.11111111111111e+01 116 215 -3.47222222222222e+00 116 191 5.55555555555556e+00 116 188 -3.47222222222222e+00 116 101 -9.72222222222222e+00 116 8 -1.11111111111111e+01 116 98 -4.86111111111111e+00 116 235 7.88431819831459e-16 116 115 -4.44089209850063e-15 116 190 4.44089209850063e-16 116 187 2.08333333333333e+00 116 100 8.33333333333333e+00 116 7 7.83444489838026e-16 116 97 1.33573707650214e-16 116 234 -2.57498015965307e-16 116 192 1.77635683940025e-15 116 114 4.44089209850063e-15 116 189 -2.18377291076599e-15 116 186 -2.08333333333333e+00 116 99 4.85722573273506e-16 116 6 1.88542757795229e-16 116 96 -4.16666666666667e+00 117 117 5.55555555555556e+01 117 215 -2.08333333333333e+00 117 136 -1.45716771982052e-16 117 214 2.08333333333333e+00 117 135 -4.86111111111112e+00 117 213 -3.47222222222222e+00 117 212 -2.76948602939697e-15 117 239 -5.98154338560253e-16 117 128 4.16666666666667e+00 117 203 2.08333333333333e+00 117 211 -2.82326245715225e-16 117 238 8.33333333333333e+00 117 127 -1.68268177169750e-16 117 202 2.08333333333333e+00 117 210 -1.11111111111111e+01 117 237 -9.72222222222222e+00 117 126 -4.86111111111111e+00 117 201 -3.47222222222222e+00 117 113 4.16666666666667e+00 117 53 9.08995101411847e-16 117 110 4.57966997657877e-16 117 200 2.08333333333333e+00 117 112 -3.46944695195361e-17 117 52 8.88178419700125e-16 117 109 1.45283091113058e-16 117 199 -2.08333333333333e+00 117 111 -4.86111111111111e+00 117 51 5.55555555555556e+00 117 108 -1.38888888888889e+00 117 198 -3.47222222222222e+00 117 197 -1.11716191852906e-15 117 119 4.44089209850063e-15 117 194 1.77635683940025e-15 117 236 3.03576608295941e-17 117 104 -4.16666666666667e+00 117 23 7.38992200766120e-16 117 101 1.11239142897013e-16 117 188 -2.08333333333333e+00 117 196 -6.73072708679001e-16 117 118 -8.88178419700125e-16 117 193 7.43613612526339e-16 117 235 -8.33333333333333e+00 117 103 -2.77555756156289e-17 117 22 8.88178419700125e-16 117 100 1.70761842166467e-16 117 187 -2.08333333333333e+00 117 195 -1.11111111111111e+01 117 137 -4.16666666666667e+00 117 192 1.11111111111111e+01 117 234 -9.72222222222222e+00 117 102 -4.86111111111111e+00 117 21 5.55555555555556e+00 117 99 -1.38888888888889e+00 117 186 -3.47222222222222e+00 118 118 5.55555555555556e+01 118 215 2.08333333333333e+00 118 136 -6.94444444444446e-01 118 214 -3.47222222222222e+00 118 135 -1.52655665885959e-16 118 213 2.08333333333333e+00 118 212 2.22044604925031e-15 118 239 1.53089346754953e-15 118 128 1.82145964977565e-16 118 203 -2.08333333333333e+00 118 211 5.55555555555555e+00 118 238 -9.72222222222222e+00 118 127 -6.94444444444444e-01 118 202 -3.47222222222222e+00 118 210 -5.02202446295286e-16 118 237 8.33333333333333e+00 118 126 -1.87350135405495e-16 118 201 2.08333333333333e+00 118 113 2.98372437868011e-16 118 53 -7.77156117237610e-16 118 110 8.33333333333333e+00 118 200 2.08333333333333e+00 118 112 -6.94444444444444e-01 118 52 5.55555555555556e+00 118 109 -9.72222222222223e+00 118 199 -3.47222222222222e+00 118 111 -7.19910242530375e-17 118 51 8.88178419700125e-16 118 108 1.16226472890446e-16 118 198 -2.08333333333333e+00 118 197 3.10862446895044e-15 118 119 -1.77635683940025e-15 118 194 1.34473595453377e-15 118 236 -1.10501885419723e-15 118 104 9.45424294407360e-17 118 23 -3.57461456268471e-16 118 101 -8.33333333333333e+00 118 188 -2.08333333333333e+00 118 196 5.55555555555556e+00 118 137 8.32667268468867e-17 118 193 -2.22222222222222e+01 118 235 -9.72222222222222e+00 118 103 -6.94444444444445e-01 118 22 5.55555555555556e+00 118 100 -9.72222222222223e+00 118 187 -3.47222222222222e+00 118 195 -6.57134936743464e-16 118 117 -8.88178419700125e-16 118 192 7.99815942642557e-16 118 234 -8.33333333333333e+00 118 102 -8.50014503228635e-17 118 21 8.88178419700125e-16 118 99 2.27248775352962e-16 118 186 -2.08333333333333e+00 119 119 5.55555555555556e+01 119 215 -3.47222222222222e+00 119 136 8.58688120608520e-17 119 214 2.08333333333333e+00 119 135 -4.16666666666667e+00 119 213 -2.08333333333333e+00 119 212 5.55555555555555e+00 119 239 -1.38888888888889e+00 119 128 -4.86111111111111e+00 119 203 -3.47222222222222e+00 119 211 1.77635683940025e-15 119 238 1.52395457364563e-15 119 127 2.91433543964104e-16 119 202 -2.08333333333333e+00 119 210 -2.85188539450587e-15 119 237 -6.84348411272850e-16 119 126 4.16666666666667e+00 119 201 2.08333333333333e+00 119 113 -4.86111111111111e+00 119 53 -1.11111111111111e+01 119 110 -9.72222222222222e+00 119 200 -3.47222222222222e+00 119 112 3.10515502199848e-16 119 52 -3.50414142147315e-16 119 109 8.33333333333333e+00 119 199 2.08333333333333e+00 119 111 4.16666666666667e+00 119 51 7.39859562504108e-16 119 108 1.52764086103208e-16 119 198 2.08333333333333e+00 119 197 5.55555555555556e+00 119 137 -4.86111111111111e+00 119 194 1.11111111111111e+01 119 236 -1.38888888888889e+00 119 104 -4.86111111111111e+00 119 23 -1.11111111111111e+01 119 101 -9.72222222222222e+00 119 188 -3.47222222222222e+00 119 196 3.10862446895044e-15 119 118 -8.88178419700125e-16 119 193 1.06017354183779e-15 119 235 -9.73179870022989e-16 119 103 -4.85722573273506e-17 119 22 -7.77156117237610e-16 119 100 -8.33333333333333e+00 119 187 -2.08333333333333e+00 119 195 -1.07899800205757e-15 119 117 4.44089209850063e-15 119 192 1.77635683940025e-15 119 234 -2.51534904016637e-17 119 102 -4.16666666666667e+00 119 21 9.08995101411847e-16 119 99 4.85722573273506e-16 119 186 -2.08333333333333e+00 120 120 2.77777777777778e+01 120 140 -4.16666666666667e+00 120 125 -1.95156391047391e-16 120 11 -1.28693442621314e-15 120 208 -2.08333333333333e+00 120 139 2.65412691824451e-16 120 124 -4.16666666666667e+00 120 10 9.10092856111488e-16 120 207 -3.47222222222222e+00 120 138 -4.86111111111111e+00 120 123 -4.86111111111111e+00 120 9 -5.55555555555554e+00 120 194 2.08333333333333e+00 120 239 2.89698820488127e-16 120 206 1.16443313324943e-16 120 116 4.16666666666667e+00 120 101 -1.92554305833426e-16 120 203 8.88178419700125e-16 120 122 1.77635683940025e-15 120 8 2.67038995083180e-16 120 193 2.08333333333333e+00 120 238 3.29597460435593e-17 120 205 -4.44089209850063e-16 120 115 -6.24500451351651e-17 120 100 4.16666666666667e+00 120 202 -1.66316613259276e-16 120 121 -1.77635683940025e-15 120 7 2.60208521396521e-17 120 192 -3.47222222222222e+00 120 237 -1.38888888888889e+00 120 204 5.55555555555556e+00 120 114 -4.86111111111112e+00 120 99 -4.86111111111111e+00 120 201 5.55555555555556e+00 120 209 -2.08333333333333e+00 120 6 -5.55555555555556e+00 121 121 2.77777777777778e+01 121 140 8.54351311918577e-16 121 125 -6.60495963478169e-16 121 11 2.08333333333333e+00 121 208 -3.47222222222222e+00 121 139 -6.94444444444446e-01 121 124 -4.86111111111111e+00 121 10 2.77777777777778e+00 121 207 -2.08333333333333e+00 121 138 2.08166817117217e-16 121 123 -4.16666666666667e+00 121 9 8.14669512405608e-16 121 194 -2.08333333333333e+00 121 239 -8.33333333333334e+00 121 206 6.37185616769731e-16 121 116 -1.21430643318376e-16 121 101 7.86805516572731e-16 121 203 -1.53425449428424e-15 121 122 8.33333333333333e+00 121 8 2.08333333333333e+00 121 193 -3.47222222222222e+00 121 238 -9.72222222222223e+00 121 205 5.55555555555556e+00 121 115 -6.94444444444446e-01 121 100 -4.86111111111111e+00 121 202 -1.11111111111111e+01 121 209 -2.08333333333333e+00 121 7 2.77777777777778e+00 121 192 2.08333333333333e+00 121 237 4.35849273339173e-17 121 204 -8.88178419700125e-16 121 114 -1.28369537222284e-16 121 99 4.16666666666666e+00 121 201 -1.63999131115589e-16 121 120 -1.77635683940025e-15 121 6 -2.06296568369679e-16 122 122 2.77777777777778e+01 122 140 -4.86111111111111e+00 122 125 -6.94444444444442e-01 122 11 2.77777777777778e+00 122 208 -2.08333333333333e+00 122 139 6.82180006927879e-16 122 124 -6.86083134748827e-16 122 10 2.08333333333333e+00 122 207 -2.08333333333333e+00 122 138 -4.16666666666667e+00 122 123 -2.22044604925031e-16 122 9 -1.37368415253913e-15 122 194 -3.47222222222222e+00 122 239 -9.72222222222222e+00 122 206 -1.11111111111111e+01 122 116 -4.86111111111111e+00 122 101 -6.94444444444444e-01 122 203 5.55555555555556e+00 122 209 -3.47222222222222e+00 122 8 2.77777777777777e+00 122 193 -2.08333333333333e+00 122 238 -8.33333333333334e+00 122 205 2.16081492976361e-16 122 115 -1.23599047663348e-16 122 100 7.45931094670027e-16 122 202 -1.49305481172979e-15 122 121 8.33333333333333e+00 122 7 2.08333333333333e+00 122 192 2.08333333333333e+00 122 237 4.29560900738757e-16 122 204 5.86919293547872e-16 122 114 4.16666666666667e+00 122 99 -2.30392961653170e-16 122 201 8.88178419700125e-16 122 120 1.77635683940025e-15 122 6 1.59323509246745e-16 123 123 5.55555555555556e+01 123 152 2.44487589895481e-16 123 226 -2.08333333333333e+00 123 151 -4.16666666666667e+00 123 225 -3.47222222222222e+00 123 150 -4.86111111111111e+00 123 242 -8.33333333333333e+00 123 221 -2.08333333333333e+00 123 218 -1.41054702640364e-16 123 146 1.28369537222284e-16 123 241 -1.86374353450258e-16 123 220 2.08333333333333e+00 123 217 -9.27833114158783e-16 123 145 4.16666666666666e+00 123 240 -9.72222222222222e+00 123 219 -3.47222222222222e+00 123 216 -1.11111111111111e+01 123 144 -4.86111111111111e+00 123 212 2.08333333333333e+00 123 143 -7.80625564189563e-18 123 128 -3.33066907387547e-16 123 26 4.44089209850063e-16 123 211 2.08333333333333e+00 123 142 -1.12757025938492e-17 123 127 4.16666666666667e+00 123 25 -8.78203759713259e-18 123 210 -3.47222222222222e+00 123 141 -1.38888888888889e+00 123 126 -4.86111111111111e+00 123 24 5.55555555555556e+00 123 239 8.33333333333333e+00 123 209 1.82471225629310e-16 123 140 6.15826833971767e-17 123 206 2.08333333333333e+00 123 203 -9.05308814025396e-16 123 125 3.55271367880050e-15 123 11 4.44089209850063e-16 123 122 -1.23165366794353e-16 123 238 5.10008701937181e-16 123 208 0.00000000000000e+00 123 139 -5.42101086242752e-18 123 205 -2.08333333333333e+00 123 202 1.60136660876109e-15 123 124 -1.77635683940025e-15 123 10 -1.42166009867162e-17 123 121 -4.16666666666667e+00 123 237 -9.72222222222222e+00 123 207 1.11111111111111e+01 123 138 -1.38888888888889e+00 123 204 -3.47222222222222e+00 123 201 -1.11111111111111e+01 123 227 -2.08333333333333e+00 123 9 5.55555555555556e+00 123 120 -4.86111111111111e+00 124 124 5.55555555555556e+01 124 152 -5.33427468862868e-16 124 226 -3.47222222222222e+00 124 151 -4.86111111111111e+00 124 225 -2.08333333333333e+00 124 150 -4.16666666666667e+00 124 242 -1.76941794549634e-16 124 221 2.08333333333333e+00 124 218 1.77635683940025e-15 124 146 -6.75674793892966e-16 124 241 -1.38888888888889e+00 124 220 -3.47222222222222e+00 124 217 5.55555555555556e+00 124 145 -4.86111111111111e+00 124 240 -1.18828558104411e-16 124 219 2.08333333333333e+00 124 216 -9.07694058804864e-16 124 144 4.16666666666667e+00 124 212 -2.08333333333333e+00 124 143 -8.33333333333334e+00 124 128 1.62630325872826e-18 124 26 5.30378150252753e-16 124 211 -3.47222222222222e+00 124 142 -9.72222222222223e+00 124 127 -4.86111111111111e+00 124 25 -1.11111111111111e+01 124 210 2.08333333333333e+00 124 141 4.15249432061948e-17 124 126 4.16666666666666e+00 124 24 -1.59513244626930e-17 124 239 -1.00787433954252e-15 124 209 -1.41976274486977e-15 124 140 8.33333333333334e+00 124 206 2.08333333333333e+00 124 203 1.77635683940025e-15 124 125 -8.88178419700125e-16 124 11 8.40473524110763e-16 124 122 -7.10369263412503e-16 124 238 -1.38888888888889e+00 124 208 1.11111111111111e+01 124 139 -9.72222222222223e+00 124 205 -3.47222222222222e+00 124 202 5.55555555555557e+00 124 227 -2.08333333333333e+00 124 10 -1.11111111111111e+01 124 121 -4.86111111111111e+00 124 237 5.61183044478497e-16 124 207 0.00000000000000e+00 124 138 -2.51534904016637e-17 124 204 -2.08333333333333e+00 124 201 1.74525378957707e-15 124 123 -2.66453525910038e-15 124 9 9.87708179134295e-17 124 120 -4.16666666666667e+00 125 125 5.55555555555556e+01 125 152 -6.94444444444444e-01 125 226 -2.08333333333333e+00 125 151 -4.96998275867355e-16 125 225 -2.08333333333333e+00 125 150 2.11636264069170e-16 125 242 -9.72222222222222e+00 125 221 -3.47222222222222e+00 125 218 5.55555555555556e+00 125 146 -6.94444444444443e-01 125 241 -3.60930903220424e-16 125 220 2.08333333333333e+00 125 217 2.22044604925031e-15 125 145 -6.69928522378793e-16 125 240 -8.33333333333333e+00 125 219 -2.08333333333333e+00 125 216 -3.08997619158369e-16 125 144 2.12503625807159e-16 125 212 -3.47222222222222e+00 125 143 -9.72222222222222e+00 125 128 -6.94444444444443e-01 125 26 5.55555555555556e+00 125 211 -2.08333333333333e+00 125 142 -8.33333333333334e+00 125 127 -8.67361737988404e-18 125 25 8.89045781438114e-16 125 210 2.08333333333333e+00 125 141 -3.77302356024956e-17 125 126 -2.41993924898765e-16 125 24 0.00000000000000e+00 125 239 -9.72222222222222e+00 125 209 -2.22222222222222e+01 125 140 -9.72222222222222e+00 125 206 -3.47222222222222e+00 125 203 5.55555555555556e+00 125 227 -3.47222222222222e+00 125 11 5.55555555555556e+00 125 122 -6.94444444444442e-01 125 238 -9.02164627725188e-16 125 208 -1.27984645451051e-15 125 139 8.33333333333334e+00 125 205 2.08333333333333e+00 125 202 2.22044604925031e-15 125 124 -1.77635683940025e-15 125 10 4.47111423405866e-16 125 121 -7.12537667757474e-16 125 237 8.33333333333333e+00 125 207 6.96328845278815e-17 125 138 8.01225405466788e-17 125 204 2.08333333333333e+00 125 201 -9.33918198851857e-16 125 123 3.55271367880050e-15 125 9 4.44089209850063e-16 125 120 -1.90928002574697e-16 126 126 2.77777777777778e+01 126 194 2.08333333333333e+00 126 23 -1.40859546249317e-15 126 101 -1.99493199737333e-17 126 118 -1.87350135405495e-16 126 193 -2.08333333333333e+00 126 22 -1.67400815431762e-16 126 100 -4.16666666666667e+00 126 117 -4.86111111111111e+00 126 192 -3.47222222222222e+00 126 21 -5.55555555555556e+00 126 99 -4.86111111111111e+00 126 212 6.86950496486816e-16 126 143 -4.16666666666667e+00 126 209 -2.08333333333333e+00 126 239 1.24032728532342e-16 126 128 8.88178419700125e-16 126 26 4.67507976775750e-16 126 125 -2.43728648374741e-16 126 203 8.88178419700125e-16 126 211 8.88178419700125e-16 126 142 3.07913416985883e-16 126 208 2.08333333333333e+00 126 238 -5.19332840620557e-17 126 127 -1.77635683940025e-15 126 25 7.78782420496338e-16 126 124 4.16666666666667e+00 126 202 -2.75021433578104e-16 126 210 5.55555555555556e+00 126 141 -4.86111111111111e+00 126 207 -3.47222222222222e+00 126 237 -1.38888888888889e+00 126 119 4.16666666666667e+00 126 24 -5.55555555555555e+00 126 123 -4.86111111111111e+00 126 201 5.55555555555556e+00 127 127 2.77777777777778e+01 127 194 2.08333333333333e+00 127 23 -2.08333333333333e+00 127 101 -1.12757025938492e-16 127 118 -6.94444444444444e-01 127 193 -3.47222222222222e+00 127 22 2.77777777777778e+00 127 100 -4.86111111111111e+00 127 117 -1.61329283265843e-16 127 192 -2.08333333333333e+00 127 21 -4.48859699408999e-17 127 99 -4.16666666666667e+00 127 212 7.01695646032618e-16 127 143 4.92661467177413e-16 127 209 2.08333333333333e+00 127 239 8.33333333333333e+00 127 128 -8.33333333333333e+00 127 26 -2.08333333333333e+00 127 125 -8.67361737988404e-18 127 203 -1.48611591782588e-15 127 211 5.55555555555556e+00 127 142 -6.94444444444444e-01 127 208 -3.47222222222222e+00 127 238 -9.72222222222223e+00 127 119 2.91433543964104e-16 127 25 2.77777777777778e+00 127 124 -4.86111111111111e+00 127 202 -1.11111111111111e+01 127 210 8.88178419700125e-16 127 141 3.12250225675825e-16 127 207 2.08333333333333e+00 127 237 -7.71951946809679e-17 127 126 -1.77635683940025e-15 127 24 8.98586760555986e-16 127 123 4.16666666666667e+00 127 201 -3.86518074491082e-16 128 128 2.77777777777778e+01 128 194 -3.47222222222222e+00 128 23 2.77777777777778e+00 128 101 -6.94444444444444e-01 128 118 1.82145964977565e-16 128 193 2.08333333333333e+00 128 22 -2.08333333333333e+00 128 100 -3.83807569059869e-17 128 117 4.16666666666667e+00 128 192 2.08333333333333e+00 128 21 -1.41640171813506e-15 128 99 -1.55691431968918e-16 128 212 -1.11111111111111e+01 128 143 -4.86111111111111e+00 128 209 -3.47222222222222e+00 128 239 -9.72222222222222e+00 128 119 -4.86111111111111e+00 128 26 2.77777777777778e+00 128 125 -6.94444444444443e-01 128 203 5.55555555555556e+00 128 211 3.02600826340704e-16 128 142 4.83120488059541e-16 128 208 2.08333333333333e+00 128 238 8.33333333333333e+00 128 127 -8.33333333333333e+00 128 25 -2.08333333333333e+00 128 124 1.62630325872826e-18 128 202 -1.17343201128106e-15 128 210 9.06393016197882e-16 128 141 -4.16666666666667e+00 128 207 -2.08333333333333e+00 128 237 3.20164901534969e-16 128 126 8.88178419700125e-16 128 24 5.06539254985228e-16 128 123 -3.43475248243408e-16 128 201 8.88178419700125e-16 129 129 2.77777777777778e+01 129 41 -1.35406009321715e-15 129 209 2.08333333333333e+00 129 140 4.16666666666666e+00 129 133 -4.16666666666667e+00 129 40 8.56086035394554e-16 129 208 -2.08333333333333e+00 129 139 2.68014777038417e-16 129 132 -4.86111111111111e+00 129 39 -5.55555555555555e+00 129 207 -3.47222222222222e+00 129 138 -4.86111111111111e+00 129 110 -2.91433543964104e-16 129 215 1.77635683940025e-15 129 131 8.88178419700125e-16 129 38 4.07660016854550e-17 129 194 -2.08333333333333e+00 129 239 3.75676052766227e-16 129 206 5.31408142316614e-16 129 116 -4.16666666666667e+00 129 109 4.16666666666667e+00 129 214 7.63278329429795e-17 129 130 -8.88178419700125e-16 129 37 -5.55111512312578e-17 129 193 2.08333333333333e+00 129 238 3.38271077815477e-17 129 205 -4.44089209850063e-16 129 115 -6.93889390390723e-17 129 108 -4.86111111111111e+00 129 213 5.55555555555556e+00 129 134 -1.63931368479808e-16 129 36 -5.55555555555556e+00 129 192 -3.47222222222222e+00 129 237 -1.38888888888889e+00 129 204 5.55555555555556e+00 129 114 -4.86111111111112e+00 130 130 2.77777777777778e+01 130 41 -2.08333333333333e+00 130 209 2.08333333333333e+00 130 140 -2.68990558993654e-16 130 133 -4.86111111111111e+00 130 40 2.77777777777778e+00 130 208 -3.47222222222222e+00 130 139 -6.94444444444444e-01 130 132 -4.16666666666667e+00 130 39 8.39606162372775e-16 130 207 -2.08333333333333e+00 130 138 3.36536354339501e-16 130 110 7.02563007770607e-16 130 215 -6.89661001918029e-16 130 131 -8.33333333333333e+00 130 38 -2.08333333333333e+00 130 194 2.08333333333333e+00 130 239 8.33333333333333e+00 130 206 2.15214131238373e-16 130 116 -3.07371315899641e-16 130 109 -4.86111111111111e+00 130 214 -1.11111111111111e+01 130 134 -2.10768902331182e-16 130 37 2.77777777777778e+00 130 193 -3.47222222222222e+00 130 238 -9.72222222222223e+00 130 205 5.55555555555556e+00 130 115 -6.94444444444445e-01 130 108 4.16666666666667e+00 130 213 2.61075883134509e-16 130 129 -8.88178419700125e-16 130 36 -1.90819582357449e-16 130 192 2.08333333333333e+00 130 237 4.51028103753970e-17 130 204 -8.88178419700125e-16 130 114 -9.35666474854990e-17 131 131 2.77777777777778e+01 131 41 2.77777777777778e+00 131 209 -3.47222222222222e+00 131 140 -4.86111111111111e+00 131 133 -2.28983498828939e-16 131 40 -2.08333333333333e+00 131 208 2.08333333333333e+00 131 139 -4.11129463806503e-16 131 132 -1.04083408558608e-16 131 39 -1.43635103810880e-15 131 207 2.08333333333333e+00 131 138 4.16666666666667e+00 131 110 -6.94444444444444e-01 131 215 5.55555555555555e+00 131 134 -6.94444444444444e-01 131 38 2.77777777777778e+00 131 194 -3.47222222222222e+00 131 239 -9.72222222222222e+00 131 206 -1.11111111111111e+01 131 116 -4.86111111111111e+00 131 109 7.84095011141517e-16 131 214 -8.52616588442601e-16 131 130 -8.33333333333333e+00 131 37 -2.08333333333333e+00 131 193 2.08333333333333e+00 131 238 8.33333333333333e+00 131 205 4.70652163075957e-16 131 115 -3.15719672627779e-16 131 108 -2.68014777038417e-16 131 213 1.77635683940025e-15 131 129 8.88178419700125e-16 131 36 2.49691760323412e-16 131 192 -2.08333333333333e+00 131 237 2.07299455379228e-16 131 204 8.35919874986324e-17 131 114 -4.16666666666667e+00 132 132 5.55555555555556e+01 132 227 2.08333333333333e+00 132 160 -4.16666666666667e+00 132 226 -2.08333333333333e+00 132 159 -4.86111111111111e+00 132 225 -3.47222222222222e+00 132 230 -1.06902334207071e-16 132 155 1.52655665885959e-16 132 242 8.33333333333333e+00 132 221 2.08333333333333e+00 132 229 -8.98586760555986e-16 132 154 4.16666666666667e+00 132 241 -2.14997290803876e-16 132 220 2.08333333333333e+00 132 228 -1.11111111111111e+01 132 153 -4.86111111111111e+00 132 240 -9.72222222222222e+00 132 219 -3.47222222222222e+00 132 137 -1.80411241501588e-16 132 56 4.44089209850063e-16 132 212 -2.08333333333333e+00 132 143 -8.47846098883664e-17 132 136 4.16666666666667e+00 132 55 2.15105711021124e-16 132 211 2.08333333333333e+00 132 142 -2.42861286636753e-17 132 135 -4.86111111111111e+00 132 54 5.55555555555555e+00 132 210 -3.47222222222222e+00 132 141 -1.38888888888889e+00 132 215 -6.60062282609175e-16 132 134 1.77635683940025e-15 132 41 0.00000000000000e+00 132 131 -1.59594559789866e-16 132 239 -8.33333333333333e+00 132 209 2.91677489452913e-16 132 140 7.23162849047831e-17 132 206 -2.08333333333333e+00 132 214 1.67227343084164e-15 132 133 0.00000000000000e+00 132 40 -8.76035355368288e-17 132 130 -4.16666666666667e+00 132 238 5.32560107124880e-16 132 208 0.00000000000000e+00 132 139 6.84131570838353e-17 132 205 -2.08333333333333e+00 132 213 -1.11111111111111e+01 132 161 2.64545330086463e-16 132 39 5.55555555555555e+00 132 129 -4.86111111111111e+00 132 237 -9.72222222222222e+00 132 207 1.11111111111111e+01 132 138 -1.38888888888889e+00 132 204 -3.47222222222222e+00 133 133 5.55555555555556e+01 133 227 2.08333333333333e+00 133 160 -4.86111111111111e+00 133 226 -3.47222222222222e+00 133 159 -4.16666666666667e+00 133 225 -2.08333333333333e+00 133 230 8.88178419700125e-16 133 155 -3.60822483003176e-16 133 242 8.12934788929631e-16 133 221 -2.08333333333333e+00 133 229 5.55555555555556e+00 133 154 -4.86111111111111e+00 133 241 -1.38888888888889e+00 133 220 -3.47222222222222e+00 133 228 -9.50628464835290e-16 133 153 4.16666666666667e+00 133 240 -1.46584133720040e-16 133 219 2.08333333333333e+00 133 137 3.11382863937837e-16 133 56 5.07298196505968e-16 133 212 2.08333333333333e+00 133 143 8.33333333333334e+00 133 136 -4.86111111111111e+00 133 55 -1.11111111111111e+01 133 211 -3.47222222222222e+00 133 142 -9.72222222222223e+00 133 135 4.16666666666667e+00 133 54 -8.76035355368288e-17 133 210 2.08333333333333e+00 133 141 -5.52943107967607e-18 133 215 1.33226762955019e-15 133 134 -6.21724893790088e-15 133 41 1.32706345912226e-16 133 131 -2.01227923213310e-16 133 239 1.15912054260425e-15 133 209 -1.48790485141048e-15 133 140 -8.33333333333334e+00 133 206 -2.08333333333333e+00 133 214 5.55555555555556e+00 133 161 -2.22911966663020e-16 133 40 -1.11111111111111e+01 133 130 -4.86111111111111e+00 133 238 -1.38888888888889e+00 133 208 1.11111111111111e+01 133 139 -9.72222222222223e+00 133 205 -3.47222222222222e+00 133 213 1.70956998557514e-15 133 132 0.00000000000000e+00 133 39 2.63677968348475e-16 133 129 -4.16666666666667e+00 133 237 5.89697561614866e-16 133 207 -4.44089209850063e-16 133 138 -1.12757025938492e-17 133 204 -2.08333333333333e+00 134 134 5.55555555555556e+01 134 227 -3.47222222222222e+00 134 160 -2.08166817117217e-16 134 226 2.08333333333333e+00 134 159 2.63677968348475e-16 134 225 2.08333333333333e+00 134 230 5.55555555555556e+00 134 155 -6.94444444444443e-01 134 242 -9.72222222222222e+00 134 221 -3.47222222222222e+00 134 229 1.33226762955019e-15 134 154 -3.76434994286967e-16 134 241 1.05644659686988e-15 134 220 -2.08333333333333e+00 134 228 -5.03069808033274e-17 134 153 2.15105711021124e-16 134 240 8.33333333333333e+00 134 219 2.08333333333333e+00 134 137 -6.94444444444445e-01 134 56 5.55555555555556e+00 134 212 -3.47222222222222e+00 134 143 -9.72222222222222e+00 134 136 4.02455846426619e-16 134 55 4.10262102068515e-16 134 211 2.08333333333333e+00 134 142 8.33333333333334e+00 134 135 -2.40259201422788e-16 134 54 4.44089209850063e-16 134 210 -2.08333333333333e+00 134 141 -4.94396190653390e-17 134 215 5.55555555555556e+00 134 161 -6.94444444444444e-01 134 41 5.55555555555556e+00 134 131 -6.94444444444444e-01 134 239 -9.72222222222222e+00 134 209 -2.22222222222222e+01 134 140 -9.72222222222222e+00 134 206 -3.47222222222222e+00 134 214 1.33226762955019e-15 134 133 -5.32907051820075e-15 134 40 3.33717428691038e-16 134 130 -2.17707796235089e-16 134 238 1.36349265211777e-15 134 208 -1.35731269973460e-15 134 139 -8.33333333333334e+00 134 205 -2.08333333333333e+00 134 213 -7.78999260930835e-16 134 132 1.77635683940025e-15 134 39 0.00000000000000e+00 134 129 -1.63931368479808e-16 134 237 -8.33333333333333e+00 134 207 2.44921270764475e-16 134 138 -7.80625564189563e-18 134 204 -2.08333333333333e+00 135 135 2.77777777777778e+01 135 110 -1.52655665885959e-16 135 119 -4.16666666666667e+00 135 194 -2.08333333333333e+00 135 52 -1.11022302462516e-16 135 109 -4.16666666666667e+00 135 118 -1.52655665885959e-16 135 193 -2.08333333333333e+00 135 51 -5.55555555555556e+00 135 108 -4.86111111111111e+00 135 117 -4.86111111111112e+00 135 192 -3.47222222222222e+00 135 137 0.00000000000000e+00 135 56 5.20417042793042e-16 135 134 -2.40259201422788e-16 135 215 1.33226762955019e-15 135 212 7.95370713735366e-16 135 143 4.16666666666667e+00 135 209 2.08333333333333e+00 135 239 4.29560900738757e-16 135 136 -8.88178419700125e-16 135 55 8.53483950180589e-16 135 133 4.16666666666667e+00 135 214 -1.83013326715553e-16 135 211 8.88178419700125e-16 135 142 2.73218947466347e-16 135 208 2.08333333333333e+00 135 238 -1.19262238973405e-17 135 53 -1.33226762955019e-15 135 54 -5.55555555555555e+00 135 132 -4.86111111111111e+00 135 213 5.55555555555556e+00 135 210 5.55555555555556e+00 135 141 -4.86111111111111e+00 135 207 -3.47222222222222e+00 135 237 -1.38888888888889e+00 136 136 2.77777777777778e+01 136 110 -4.16333634234434e-17 136 119 8.50014503228635e-17 136 194 -2.08333333333333e+00 136 52 2.77777777777778e+00 136 109 -4.86111111111111e+00 136 118 -6.94444444444446e-01 136 193 -3.47222222222222e+00 136 51 -6.24500451351651e-17 136 108 -4.16666666666667e+00 136 117 -1.38777878078145e-16 136 192 -2.08333333333333e+00 136 137 8.33333333333334e+00 136 56 2.08333333333333e+00 136 134 3.74700270810990e-16 136 215 -5.75060832286312e-16 136 212 3.09648140461860e-16 136 143 -6.32306706993546e-16 136 209 -2.08333333333333e+00 136 239 -8.33333333333334e+00 136 53 2.08333333333333e+00 136 55 2.77777777777778e+00 136 133 -4.86111111111111e+00 136 214 -1.11111111111111e+01 136 211 5.55555555555556e+00 136 142 -6.94444444444445e-01 136 208 -3.47222222222222e+00 136 238 -9.72222222222223e+00 136 135 -8.88178419700125e-16 136 54 7.77156117237610e-16 136 132 4.16666666666667e+00 136 213 -1.45716771982052e-16 136 210 8.88178419700125e-16 136 141 2.77555756156289e-16 136 207 2.08333333333333e+00 136 237 5.46437894932694e-17 137 137 2.77777777777778e+01 137 110 -6.94444444444444e-01 137 119 -4.86111111111111e+00 137 194 -3.47222222222222e+00 137 52 2.08333333333333e+00 137 109 -3.98986399474666e-17 137 118 0.00000000000000e+00 137 193 -2.08333333333333e+00 137 51 -1.35308431126191e-15 137 108 -1.13624387676481e-16 137 117 -4.16666666666667e+00 137 192 -2.08333333333333e+00 137 53 2.77777777777778e+00 137 56 2.77777777777778e+00 137 134 -6.94444444444445e-01 137 215 5.55555555555555e+00 137 212 -1.11111111111111e+01 137 143 -4.86111111111111e+00 137 209 -3.47222222222222e+00 137 239 -9.72222222222222e+00 137 136 8.33333333333334e+00 137 55 2.08333333333333e+00 137 133 3.11382863937837e-16 137 214 -3.49655200626575e-16 137 211 7.57206797263876e-16 137 142 -5.96744875736022e-16 137 208 -2.08333333333333e+00 137 238 -8.33333333333334e+00 137 135 0.00000000000000e+00 137 54 5.55111512312578e-16 137 132 -1.80411241501588e-16 137 213 1.33226762955019e-15 137 210 6.86950496486816e-16 137 141 4.16666666666667e+00 137 207 2.08333333333333e+00 137 237 2.14238349283136e-16 138 138 5.55555555555556e+01 138 155 -4.16666666666667e+00 138 229 -2.08333333333333e+00 138 154 -9.35666474854990e-17 138 228 -3.47222222222222e+00 138 153 -4.86111111111111e+00 138 242 3.41632104550182e-16 138 221 -1.53262819102551e-15 138 218 2.08333333333333e+00 138 146 4.16666666666667e+00 138 241 -8.33333333333333e+00 138 220 -9.79115876917347e-16 138 217 -2.08333333333333e+00 138 145 -9.44340092234874e-17 138 240 -9.72222222222222e+00 138 219 -1.11111111111111e+01 138 216 -3.47222222222222e+00 138 144 -4.86111111111111e+00 138 215 2.08333333333333e+00 138 134 -7.80625564189563e-18 138 41 9.38810661155198e-16 138 131 4.16666666666667e+00 138 214 2.08333333333333e+00 138 133 2.60208521396521e-18 138 40 -8.88178419700125e-16 138 130 2.18575157973078e-16 138 213 -3.47222222222222e+00 138 132 -1.38888888888889e+00 138 39 5.55555555555555e+00 138 129 -4.86111111111111e+00 138 239 -2.84494650060196e-16 138 209 4.44089209850063e-16 138 140 3.55271367880050e-15 138 206 -2.58452113877095e-15 138 203 -2.08333333333333e+00 138 125 2.54787510534094e-17 138 11 7.98121876748048e-16 138 122 -4.16666666666667e+00 138 238 8.33333333333333e+00 138 208 2.06323673423991e-16 138 139 8.88178419700125e-16 138 205 1.81907440499618e-15 138 202 2.08333333333333e+00 138 124 -2.42861286636753e-17 138 10 -8.88178419700125e-16 138 121 2.20309881449055e-16 138 237 -9.72222222222222e+00 138 207 1.11111111111111e+01 138 230 -2.08333333333333e+00 138 204 -1.11111111111111e+01 138 201 -3.47222222222222e+00 138 123 -1.38888888888889e+00 138 9 5.55555555555555e+00 138 120 -4.86111111111111e+00 139 139 5.55555555555556e+01 139 155 -2.60208521396521e-16 139 229 -3.47222222222222e+00 139 154 -6.94444444444445e-01 139 228 -2.08333333333333e+00 139 153 -2.86229373536173e-17 139 242 -7.56447855743136e-16 139 221 0.00000000000000e+00 139 218 2.08333333333333e+00 139 146 2.40584462074533e-16 139 241 -9.72222222222222e+00 139 220 5.55555555555556e+00 139 217 -3.47222222222222e+00 139 145 -6.94444444444443e-01 139 240 -8.33333333333333e+00 139 219 -8.79071121451247e-16 139 216 -2.08333333333333e+00 139 144 -2.16840434497101e-17 139 215 -2.08333333333333e+00 139 134 -8.33333333333334e+00 139 41 -5.41016884070267e-16 139 131 -4.11129463806503e-16 139 214 -3.47222222222222e+00 139 133 -9.72222222222223e+00 139 40 5.55555555555556e+00 139 130 -6.94444444444444e-01 139 213 2.08333333333333e+00 139 132 4.15249432061948e-17 139 39 -8.88178419700125e-16 139 129 2.60208521396521e-16 139 239 2.53052787058117e-16 139 209 6.96681210984873e-16 139 140 -5.32907051820075e-15 139 206 1.33226762955019e-15 139 203 2.08333333333333e+00 139 125 8.33333333333334e+00 139 11 -7.05422591000537e-16 139 122 6.82180006927879e-16 139 238 -9.72222222222222e+00 139 208 -2.22222222222222e+01 139 230 -2.08333333333333e+00 139 205 5.55555555555556e+00 139 202 -3.47222222222222e+00 139 124 -9.72222222222223e+00 139 10 5.55555555555556e+00 139 121 -6.94444444444446e-01 139 237 8.33333333333333e+00 139 207 -1.03446439782273e-16 139 138 -8.88178419700125e-16 139 204 1.82006373947857e-15 139 201 2.08333333333333e+00 139 123 -6.28837260041593e-18 139 9 -8.88178419700125e-16 139 120 2.73110527249099e-16 140 140 5.55555555555556e+01 140 155 -4.86111111111111e+00 140 229 -2.08333333333333e+00 140 154 -3.66026653431106e-16 140 228 -2.08333333333333e+00 140 153 -4.16666666666667e+00 140 242 -1.38888888888889e+00 140 221 5.55555555555556e+00 140 218 -3.47222222222222e+00 140 146 -4.86111111111111e+00 140 241 -8.23126289350995e-16 140 220 4.44089209850063e-16 140 217 2.08333333333333e+00 140 145 3.62557206479153e-16 140 240 3.64291929955129e-16 140 219 -1.58662145921529e-15 140 216 2.08333333333333e+00 140 144 4.16666666666667e+00 140 215 -3.47222222222222e+00 140 134 -9.72222222222222e+00 140 41 -1.11111111111111e+01 140 131 -4.86111111111111e+00 140 214 -2.08333333333333e+00 140 133 -8.33333333333334e+00 140 40 -5.38889137306764e-16 140 130 -2.68990558993654e-16 140 213 2.08333333333333e+00 140 132 7.32920668600201e-17 140 39 7.98121876748048e-16 140 129 4.16666666666666e+00 140 239 -1.38888888888889e+00 140 209 1.11111111111111e+01 140 230 -3.47222222222222e+00 140 206 5.55555555555557e+00 140 203 -3.47222222222222e+00 140 125 -9.72222222222222e+00 140 11 -1.11111111111111e+01 140 122 -4.86111111111111e+00 140 238 3.38271077815477e-16 140 208 7.37257477290143e-16 140 139 -5.32907051820075e-15 140 205 1.77635683940025e-15 140 202 2.08333333333333e+00 140 124 8.33333333333334e+00 140 10 -4.23055687703844e-16 140 121 8.43942971062717e-16 140 237 -3.33066907387547e-16 140 207 4.44089209850063e-16 140 138 3.55271367880050e-15 140 204 -2.69303622370959e-15 140 201 -2.08333333333333e+00 140 123 -4.94396190653390e-17 140 9 1.04983296361771e-15 140 120 -4.16666666666667e+00 141 141 5.55555555555556e+01 141 230 -2.08333333333333e+00 141 160 -9.10729824887824e-17 141 229 2.08333333333333e+00 141 159 -4.86111111111111e+00 141 228 -3.47222222222222e+00 141 227 1.39731975989932e-15 141 242 1.21430643318376e-16 141 152 4.16666666666667e+00 141 218 2.08333333333333e+00 141 226 -8.50556604314878e-16 141 241 8.33333333333333e+00 141 151 -1.06685493772574e-16 141 217 2.08333333333333e+00 141 225 -1.11111111111111e+01 141 240 -9.72222222222222e+00 141 150 -4.86111111111111e+00 141 216 -3.47222222222222e+00 141 137 4.16666666666667e+00 141 56 -9.78384040450919e-16 141 134 -4.94396190653390e-17 141 215 2.08333333333333e+00 141 136 2.77555756156289e-16 141 55 8.88178419700125e-16 141 133 -4.66206934168767e-18 141 214 -2.08333333333333e+00 141 135 -4.86111111111111e+00 141 54 5.55555555555555e+00 141 132 -1.38888888888889e+00 141 213 -3.47222222222222e+00 141 212 1.02001740387436e-15 141 143 -8.88178419700125e-16 141 209 8.88178419700125e-16 141 239 -1.71737624121704e-16 141 128 -4.16666666666667e+00 141 26 -7.28583859910259e-16 141 125 -3.87060175577325e-17 141 203 -2.08333333333333e+00 141 211 1.45109618765460e-15 141 142 -1.77635683940025e-15 141 208 -9.99905453574756e-17 141 238 -8.33333333333333e+00 141 127 3.12250225675825e-16 141 25 8.88178419700125e-16 141 124 6.84131570838353e-17 141 202 -2.08333333333333e+00 141 210 -1.11111111111111e+01 141 161 -4.16666666666667e+00 141 207 1.11111111111111e+01 141 237 -9.72222222222222e+00 141 126 -4.86111111111111e+00 141 24 5.55555555555555e+00 141 123 -1.38888888888889e+00 141 201 -3.47222222222222e+00 142 142 5.55555555555556e+01 142 230 2.08333333333333e+00 142 160 -6.94444444444443e-01 142 229 -3.47222222222222e+00 142 159 -9.02056207507940e-17 142 228 2.08333333333333e+00 142 227 2.66453525910038e-15 142 242 -8.14452671971111e-16 142 152 5.68121938382404e-16 142 218 -2.08333333333333e+00 142 226 5.55555555555556e+00 142 241 -9.72222222222222e+00 142 151 -6.94444444444445e-01 142 217 -3.47222222222222e+00 142 225 -9.80118763926896e-16 142 240 8.33333333333333e+00 142 150 -8.32667268468867e-17 142 216 2.08333333333333e+00 142 137 -5.96744875736022e-16 142 56 -1.10068204550728e-15 142 134 8.33333333333334e+00 142 215 2.08333333333333e+00 142 136 -6.94444444444445e-01 142 55 5.55555555555556e+00 142 133 -9.72222222222223e+00 142 214 -3.47222222222222e+00 142 135 2.87096735274162e-16 142 54 8.88178419700125e-16 142 132 -2.51534904016637e-17 142 213 -2.08333333333333e+00 142 212 1.77635683940025e-15 142 143 -8.88178419700125e-16 142 209 1.40339129206524e-15 142 239 -8.00574884163296e-16 142 128 4.76181594155634e-16 142 26 -7.88648660265956e-16 142 125 -8.33333333333334e+00 142 203 -2.08333333333333e+00 142 211 5.55555555555556e+00 142 161 8.32667268468867e-17 142 208 -2.22222222222222e+01 142 238 -9.72222222222222e+00 142 127 -6.94444444444444e-01 142 25 5.55555555555556e+00 142 124 -9.72222222222223e+00 142 202 -3.47222222222222e+00 142 210 1.63150742915619e-15 142 141 -1.77635683940025e-15 142 207 3.64183509737881e-16 142 237 -8.33333333333333e+00 142 126 3.07913416985883e-16 142 24 4.44089209850063e-16 142 123 -1.12757025938492e-17 142 201 -2.08333333333333e+00 143 143 5.55555555555556e+01 143 230 -3.47222222222222e+00 143 160 1.30104260698261e-17 143 229 2.08333333333333e+00 143 159 -4.16666666666667e+00 143 228 -2.08333333333333e+00 143 227 5.55555555555556e+00 143 242 -1.38888888888889e+00 143 152 -4.86111111111111e+00 143 218 -3.47222222222222e+00 143 226 3.10862446895044e-15 143 241 -8.79071121451247e-16 143 151 6.93889390390723e-16 143 217 -2.08333333333333e+00 143 225 1.39471767468535e-15 143 240 1.29236898960272e-16 143 150 4.16666666666667e+00 143 216 2.08333333333333e+00 143 137 -4.86111111111111e+00 143 56 -1.11111111111111e+01 143 134 -9.72222222222222e+00 143 215 -3.47222222222222e+00 143 136 -6.32306706993546e-16 143 55 -8.92623648607316e-16 143 133 8.33333333333334e+00 143 214 2.08333333333333e+00 143 135 4.16666666666667e+00 143 54 -7.28583859910259e-16 143 132 8.08814820674186e-17 143 213 2.08333333333333e+00 143 212 5.55555555555556e+00 143 161 -4.86111111111111e+00 143 209 1.11111111111111e+01 143 239 -1.38888888888889e+00 143 128 -4.86111111111111e+00 143 26 -1.11111111111111e+01 143 125 -9.72222222222222e+00 143 203 -3.47222222222222e+00 143 211 1.77635683940025e-15 143 142 -8.88178419700125e-16 143 208 9.95053648852884e-16 143 238 -7.63820430516038e-16 143 127 5.20417042793042e-16 143 25 -1.15619319673854e-15 143 124 -8.33333333333334e+00 143 202 -2.08333333333333e+00 143 210 1.09200842812740e-15 143 141 -8.88178419700125e-16 143 207 8.88178419700125e-16 143 237 -1.84856470408779e-16 143 126 -4.16666666666667e+00 143 24 -1.02695629777827e-15 143 123 -7.80625564189563e-18 143 201 -2.08333333333333e+00 144 144 2.77777777777778e+01 144 164 -4.16666666666667e+00 144 149 1.47234655023532e-16 144 14 7.40279690845946e-16 144 223 -2.08333333333333e+00 144 163 3.27429056090622e-17 144 148 -4.16666666666667e+00 144 13 -4.72847672475241e-17 144 222 -3.47222222222222e+00 144 162 -4.86111111111112e+00 144 147 -4.86111111111111e+00 144 12 -5.55555555555556e+00 144 209 2.08333333333333e+00 144 242 -2.68882138776405e-17 144 221 3.67436116255337e-16 144 140 4.16666666666667e+00 144 125 1.04950770296597e-16 144 218 -4.44089209850063e-16 144 146 1.77635683940025e-15 144 11 -9.36967517461973e-16 144 208 2.08333333333333e+00 144 241 2.16840434497101e-17 144 220 0.00000000000000e+00 144 139 -4.94396190653390e-17 144 124 4.16666666666667e+00 144 217 7.62953068778049e-16 144 145 0.00000000000000e+00 144 10 -4.23597788790087e-16 144 207 -3.47222222222222e+00 144 240 -1.38888888888889e+00 144 219 5.55555555555556e+00 144 138 -4.86111111111111e+00 144 123 -4.86111111111111e+00 144 216 5.55555555555556e+00 144 224 -2.08333333333333e+00 144 9 -5.55555555555555e+00 145 145 2.77777777777778e+01 145 164 -5.89805981832114e-17 145 149 3.42933147157165e-16 145 14 2.08333333333333e+00 145 223 -3.47222222222222e+00 145 163 -6.94444444444445e-01 145 148 -4.86111111111111e+00 145 13 2.77777777777778e+00 145 222 -2.08333333333333e+00 145 162 6.07153216591882e-18 145 147 -4.16666666666667e+00 145 12 2.41777084464267e-17 145 209 -2.08333333333333e+00 145 242 -8.33333333333333e+00 145 221 -2.85470432015433e-16 145 140 2.51534904016637e-16 145 125 -6.65483293471603e-16 145 218 8.31284910698948e-16 145 146 8.33333333333333e+00 145 11 2.08333333333333e+00 145 208 -3.47222222222222e+00 145 241 -9.72222222222223e+00 145 220 5.55555555555556e+00 145 139 -6.94444444444443e-01 145 124 -4.86111111111111e+00 145 217 -1.11111111111111e+01 145 224 -2.08333333333333e+00 145 10 2.77777777777778e+00 145 207 2.08333333333333e+00 145 240 6.97141996908179e-17 145 219 0.00000000000000e+00 145 138 -9.35666474854990e-17 145 123 4.16666666666666e+00 145 216 4.79366438037310e-16 145 144 0.00000000000000e+00 145 9 -4.30062344243531e-16 146 146 2.77777777777778e+01 146 164 -4.86111111111111e+00 146 149 -6.94444444444444e-01 146 14 2.77777777777778e+00 146 223 -2.08333333333333e+00 146 163 -6.63531729561129e-17 146 148 3.84241249928863e-16 146 13 2.08333333333333e+00 146 222 -2.08333333333333e+00 146 162 -4.16666666666667e+00 146 147 1.41379963292110e-16 146 12 6.97250417125428e-16 146 209 -3.47222222222222e+00 146 242 -9.72222222222222e+00 146 221 -1.11111111111111e+01 146 140 -4.86111111111111e+00 146 125 -6.94444444444443e-01 146 218 5.55555555555556e+00 146 224 -3.47222222222222e+00 146 11 2.77777777777778e+00 146 208 -2.08333333333333e+00 146 241 -8.33333333333333e+00 146 220 -2.45111006144660e-16 146 139 2.41451823812522e-16 146 124 -6.75674793892966e-16 146 217 6.99852502339393e-16 146 145 8.33333333333333e+00 146 10 2.08333333333333e+00 146 207 2.08333333333333e+00 146 240 -1.18178036800920e-17 146 219 5.99279198314207e-16 146 138 4.16666666666667e+00 146 123 1.31730563956989e-16 146 216 -4.44089209850063e-16 146 144 1.77635683940025e-15 146 9 -8.13138076836972e-16 147 147 2.83333333333334e+01 147 29 -2.04166666666667e+00 147 166 -2.15620707053055e-17 147 28 5.77337656848531e-17 147 165 -7.08333333333333e-01 147 27 2.83333333333334e+00 147 224 -5.11750201676736e-16 147 164 -4.74202925190848e-17 147 149 -8.16666666666667e+00 147 14 -2.04166666666667e+00 147 223 -6.93889390390723e-18 147 163 -1.50568576703924e-17 147 148 1.77635683940025e-15 147 13 6.63832426257404e-17 147 222 5.66666666666667e+00 147 162 -7.08333333333333e-01 147 167 -4.74202925190848e-17 147 12 2.83333333333334e+00 147 152 1.27502175484295e-16 147 226 2.08333333333333e+00 147 151 4.16666666666667e+00 147 225 -3.47222222222222e+00 147 150 -4.86111111111111e+00 147 242 8.33333333333333e+00 147 221 2.08333333333333e+00 147 218 7.59808882477842e-16 147 146 1.48318857196017e-16 147 241 8.23993651088983e-17 147 220 -2.08333333333333e+00 147 217 -9.28077059647592e-17 147 145 -4.16666666666667e+00 147 240 -9.72222222222223e+00 147 219 -3.47222222222222e+00 147 216 -1.11111111111111e+01 147 227 2.08333333333333e+00 147 144 -4.86111111111111e+00 147 398 -4.16666666666667e-02 147 299 8.31786354203723e-19 147 397 -4.16666666666667e-02 147 298 -8.33333333333334e-02 147 396 -6.94444444444445e-02 147 297 -9.72222222222222e-02 147 449 -1.66666666666667e-01 147 392 -4.16666666666667e-02 147 389 -1.18108156582772e-17 147 293 -1.37727557223549e-18 147 448 8.41950749570775e-19 147 391 4.16666666666667e-02 147 388 -1.52317699740005e-18 147 292 8.33333333333334e-02 147 447 -1.94444444444445e-01 147 390 -6.94444444444445e-02 147 387 -2.22222222222222e-01 147 291 -9.72222222222222e-02 148 148 2.83333333333333e+01 148 29 1.60372347793683e-16 148 166 -4.95833333333333e+00 148 28 -5.66666666666666e+00 148 165 -1.59089728153303e-17 148 27 1.73936098136302e-16 148 224 -3.43158457921135e-16 148 164 4.25000000000000e+00 148 149 -3.58046925441613e-15 148 14 -4.28751137241182e-17 148 223 5.66666666666667e+00 148 163 -4.95833333333333e+00 148 167 -4.25000000000000e+00 148 13 -5.66666666666666e+00 148 222 -6.93889390390723e-18 148 162 -2.15485181781494e-17 148 147 1.77635683940025e-15 148 12 5.68664039468647e-17 148 152 -8.82540568403201e-17 148 226 -3.47222222222222e+00 148 151 -4.86111111111111e+00 148 225 2.08333333333333e+00 148 150 4.16666666666666e+00 148 242 -6.76542155630955e-17 148 221 2.08333333333333e+00 148 218 1.77635683940025e-15 148 146 3.56485674313234e-16 148 241 -1.38888888888889e+00 148 220 -3.47222222222222e+00 148 217 5.55555555555555e+00 148 227 -2.08333333333333e+00 148 145 -4.86111111111111e+00 148 240 1.03866568124111e-16 148 219 -2.08333333333333e+00 148 216 -1.70558554259126e-16 148 144 -4.16666666666667e+00 148 398 -4.16666666666667e-02 148 299 8.61093694178722e-18 148 397 -6.94444444444444e-02 148 298 -9.72222222222222e-02 148 396 -4.16666666666667e-02 148 297 -8.33333333333334e-02 148 449 -1.89464329641842e-17 148 392 4.16666666666667e-02 148 389 -4.16333634234434e-17 148 293 1.57073789738837e-17 148 448 -2.77777777777778e-02 148 391 -6.94444444444444e-02 148 388 1.11111111111111e-01 148 292 -9.72222222222222e-02 148 447 2.03287907341032e-19 148 390 4.16666666666667e-02 148 387 -4.20128341838133e-19 148 291 8.33333333333334e-02 149 149 2.83333333333333e+01 149 29 2.83333333333333e+00 149 166 -4.25000000000000e+00 149 28 2.38095879275500e-16 149 165 -7.12574937207153e-17 149 27 -2.04166666666667e+00 149 224 -1.13333333333333e+01 149 164 -4.95833333333333e+00 149 167 -4.95833333333333e+00 149 14 2.83333333333333e+00 149 223 -2.94465921915274e-16 149 163 4.25000000000000e+00 149 148 -4.46864767411626e-15 149 13 6.32276213807445e-17 149 222 -2.67408513206419e-16 149 162 4.14842856247266e-17 149 147 -8.16666666666667e+00 149 12 -2.04166666666667e+00 149 152 -6.94444444444444e-01 149 226 -2.08333333333333e+00 149 151 -2.25514051876985e-17 149 225 2.08333333333333e+00 149 150 8.13151629364128e-17 149 242 -9.72222222222222e+00 149 221 -3.47222222222222e+00 149 218 5.55555555555555e+00 149 227 -3.47222222222222e+00 149 146 -6.94444444444444e-01 149 241 -1.50812522192734e-16 149 220 2.08333333333333e+00 149 217 1.77635683940025e-15 149 145 3.42933147157165e-16 149 240 8.33333333333333e+00 149 219 2.08333333333333e+00 149 216 5.05346632595494e-16 149 144 1.67183974997265e-16 149 398 -6.94444444444444e-02 149 299 -1.38888888888889e-02 149 397 -4.16666666666667e-02 149 298 6.87113126812688e-18 149 396 -4.16666666666667e-02 149 297 2.42590236093632e-18 149 449 -1.94444444444444e-01 149 392 -6.94444444444444e-02 149 389 1.11111111111111e-01 149 293 -1.38888888888889e-02 149 448 -1.77775274969733e-17 149 391 4.16666666666667e-02 149 388 -4.16333634234434e-17 149 292 1.40438062654763e-17 149 447 -1.66666666666667e-01 149 390 -4.16666666666667e-02 149 387 -6.72882973298816e-18 149 291 -1.15196480826585e-18 150 150 2.77777777777778e+01 150 209 2.08333333333333e+00 150 26 7.21644966006352e-16 150 125 2.14238349283136e-16 150 142 -9.02056207507940e-17 150 208 -2.08333333333333e+00 150 25 -4.78783679369599e-16 150 124 -4.16666666666667e+00 150 141 -4.86111111111111e+00 150 207 -3.47222222222222e+00 150 24 -5.55555555555555e+00 150 123 -4.86111111111111e+00 150 227 -4.57966997657877e-16 150 167 -4.16666666666667e+00 150 224 -2.08333333333333e+00 150 242 -1.92554305833426e-16 150 152 -1.77635683940025e-15 150 29 -1.99493199737333e-17 150 149 1.02131844648135e-16 150 218 -4.44089209850063e-16 150 226 8.88178419700125e-16 150 166 7.11236625150491e-17 150 223 2.08333333333333e+00 150 241 7.13405029495462e-17 150 151 0.00000000000000e+00 150 28 -1.22514845490862e-16 150 148 4.16666666666666e+00 150 217 5.93966607669028e-16 150 225 5.55555555555556e+00 150 165 -4.86111111111111e+00 150 222 -3.47222222222222e+00 150 240 -1.38888888888889e+00 150 143 4.16666666666667e+00 150 27 -5.55555555555556e+00 150 147 -4.86111111111111e+00 150 216 5.55555555555556e+00 151 151 2.77777777777778e+01 151 209 2.08333333333333e+00 151 26 -2.08333333333333e+00 151 125 -5.52509427098613e-16 151 142 -6.94444444444445e-01 151 208 -3.47222222222222e+00 151 25 2.77777777777778e+00 151 124 -4.86111111111111e+00 151 141 -1.13624387676481e-16 151 207 -2.08333333333333e+00 151 24 -4.97648797170847e-16 151 123 -4.16666666666667e+00 151 227 -1.18047932540222e-15 151 167 -5.55111512312578e-17 151 224 2.08333333333333e+00 151 242 8.33333333333333e+00 151 152 -8.33333333333333e+00 151 29 -2.08333333333333e+00 151 149 -2.60208521396521e-17 151 218 8.10874804801909e-16 151 226 5.55555555555556e+00 151 166 -6.94444444444445e-01 151 223 -3.47222222222222e+00 151 241 -9.72222222222223e+00 151 143 6.93889390390723e-16 151 28 2.77777777777778e+00 151 148 -4.86111111111111e+00 151 217 -1.11111111111111e+01 151 225 8.88178419700125e-16 151 165 6.24500451351651e-17 151 222 2.08333333333333e+00 151 240 2.25514051876985e-17 151 150 0.00000000000000e+00 151 27 -2.28983498828939e-16 151 147 4.16666666666667e+00 151 216 6.56267575005476e-16 152 152 2.77777777777778e+01 152 209 -3.47222222222222e+00 152 26 2.77777777777778e+00 152 125 -6.94444444444444e-01 152 142 5.68121938382404e-16 152 208 2.08333333333333e+00 152 25 -2.08333333333333e+00 152 124 -4.70977423727703e-16 152 141 4.16666666666667e+00 152 207 2.08333333333333e+00 152 24 7.38124839028131e-16 152 123 2.47957036847435e-16 152 227 -1.11111111111111e+01 152 167 -4.86111111111111e+00 152 224 -3.47222222222222e+00 152 242 -9.72222222222222e+00 152 143 -4.86111111111111e+00 152 29 2.77777777777778e+00 152 149 -6.94444444444444e-01 152 218 5.55555555555556e+00 152 226 -1.49587373737825e-15 152 166 -1.22298005056365e-16 152 223 2.08333333333333e+00 152 241 8.33333333333333e+00 152 151 -8.33333333333333e+00 152 28 -2.08333333333333e+00 152 148 -8.82540568403201e-17 152 217 9.49259659592527e-16 152 225 -6.74807432154978e-16 152 165 -4.16666666666667e+00 152 222 -2.08333333333333e+00 152 240 -1.21322223101128e-16 152 150 -1.77635683940025e-15 152 27 6.93889390390723e-18 152 147 1.35308431126191e-16 152 216 -4.44089209850063e-16 153 153 2.77777777777778e+01 153 44 7.95153873300869e-16 153 224 2.08333333333333e+00 153 164 4.16666666666667e+00 153 157 -4.16666666666667e+00 153 43 -2.41993924898765e-16 153 223 -2.08333333333333e+00 153 163 1.88651178012478e-17 153 156 -4.86111111111111e+00 153 42 -5.55555555555556e+00 153 222 -3.47222222222222e+00 153 162 -4.86111111111112e+00 153 134 1.59594559789866e-16 153 230 0.00000000000000e+00 153 155 -1.77635683940025e-15 153 41 -6.59194920871187e-16 153 209 -2.08333333333333e+00 153 242 -6.57026516526216e-17 153 221 4.88256895851691e-16 153 140 -4.16666666666667e+00 153 133 4.16666666666667e+00 153 229 4.85722573273506e-16 153 154 8.88178419700125e-16 153 40 -4.51028103753970e-16 153 208 2.08333333333333e+00 153 241 5.72458747072346e-17 153 220 0.00000000000000e+00 153 139 -1.56125112837913e-17 153 132 -4.86111111111111e+00 153 228 5.55555555555555e+00 153 158 1.96023752785379e-16 153 39 -5.55555555555555e+00 153 207 -3.47222222222222e+00 153 240 -1.38888888888889e+00 153 219 5.55555555555556e+00 153 138 -4.86111111111111e+00 154 154 2.77777777777778e+01 154 44 -2.08333333333333e+00 154 224 2.08333333333333e+00 154 164 3.31765864780564e-17 154 157 -4.86111111111111e+00 154 43 2.77777777777778e+00 154 223 -3.47222222222222e+00 154 163 -6.94444444444446e-01 154 156 -4.16666666666667e+00 154 42 -2.84494650060196e-16 154 222 -2.08333333333333e+00 154 162 -6.93889390390723e-18 154 134 -3.76434994286967e-16 154 230 5.58038858178289e-16 154 155 -8.33333333333333e+00 154 41 -2.08333333333333e+00 154 209 2.08333333333333e+00 154 242 8.33333333333333e+00 154 221 -4.60216717165784e-16 154 140 -3.65918233213858e-16 154 133 -4.86111111111111e+00 154 229 -1.11111111111111e+01 154 158 5.20417042793042e-17 154 40 2.77777777777778e+00 154 208 -3.47222222222222e+00 154 241 -9.72222222222223e+00 154 220 5.55555555555556e+00 154 139 -6.94444444444445e-01 154 132 4.16666666666667e+00 154 228 4.21537804662364e-16 154 153 0.00000000000000e+00 154 39 -4.25874613352306e-16 154 207 2.08333333333333e+00 154 240 1.96132173002628e-16 154 219 0.00000000000000e+00 154 138 -7.96888596776846e-17 155 155 2.77777777777778e+01 155 44 2.77777777777778e+00 155 224 -3.47222222222222e+00 155 164 -4.86111111111111e+00 155 157 1.38777878078145e-17 155 43 -2.08333333333333e+00 155 223 2.08333333333333e+00 155 163 1.61329283265843e-16 155 156 1.24900090270330e-16 155 42 6.91287305176758e-16 155 222 2.08333333333333e+00 155 162 4.16666666666667e+00 155 134 -6.94444444444443e-01 155 230 5.55555555555556e+00 155 158 -6.94444444444445e-01 155 41 2.77777777777778e+00 155 209 -3.47222222222222e+00 155 242 -9.72222222222222e+00 155 221 -1.11111111111111e+01 155 140 -4.86111111111111e+00 155 133 -3.53883589099269e-16 155 229 6.51388665229291e-16 155 154 -8.33333333333333e+00 155 40 -2.08333333333333e+00 155 208 2.08333333333333e+00 155 241 8.33333333333333e+00 155 220 -2.29959280784175e-16 155 139 -2.32452945780892e-16 155 132 1.80411241501588e-16 155 228 0.00000000000000e+00 155 153 -1.77635683940025e-15 155 39 -7.70542483985448e-16 155 207 -2.08333333333333e+00 155 240 -3.29597460435593e-17 155 219 5.93817529870311e-16 155 138 -4.16666666666667e+00 156 156 2.83333333333333e+01 156 167 -6.86706550998006e-17 156 58 5.74627151417317e-17 156 166 -2.15620707053055e-17 156 57 2.83333333333333e+00 156 165 -7.08333333333333e-01 156 158 8.16666666666667e+00 156 44 2.04166666666667e+00 156 224 -4.85997011948416e-16 156 164 -1.56497807334705e-17 156 157 0.00000000000000e+00 156 43 1.04164723721545e-16 156 223 0.00000000000000e+00 156 163 -1.93462325152882e-18 156 59 2.04166666666667e+00 156 42 2.83333333333333e+00 156 222 5.66666666666667e+00 156 162 -7.08333333333333e-01 156 227 -2.08333333333333e+00 156 160 4.16666666666667e+00 156 226 2.08333333333333e+00 156 159 -4.86111111111111e+00 156 225 -3.47222222222222e+00 156 230 5.80265002714242e-16 156 155 1.24900090270330e-16 156 242 -8.33333333333333e+00 156 221 -2.08333333333333e+00 156 229 -4.51028103753970e-16 156 154 -4.16666666666667e+00 156 241 6.85215773010839e-17 156 220 -2.08333333333333e+00 156 228 -1.11111111111111e+01 156 161 1.11022302462516e-16 156 153 -4.86111111111111e+00 156 240 -9.72222222222223e+00 156 219 -3.47222222222222e+00 156 308 3.93023287525995e-19 156 398 4.16666666666667e-02 156 307 -8.33333333333333e-02 156 397 -4.16666666666667e-02 156 306 -9.72222222222222e-02 156 396 -6.94444444444445e-02 156 401 -1.19397764244966e-17 156 302 -1.57209315010398e-18 156 449 1.66666666666667e-01 156 392 4.16666666666667e-02 156 400 5.71916645986104e-18 156 301 8.33333333333334e-02 156 448 -4.43845264361253e-19 156 391 4.16666666666667e-02 156 399 -2.22222222222222e-01 156 300 -9.72222222222222e-02 156 447 -1.94444444444445e-01 156 390 -6.94444444444445e-02 157 157 2.83333333333333e+01 157 167 4.25000000000000e+00 157 58 -5.66666666666667e+00 157 166 -4.95833333333333e+00 157 57 1.04164723721545e-16 157 165 -1.41911899982985e-17 157 158 9.02056207507940e-16 157 44 -6.14945919706622e-16 157 224 -1.27878046354639e-16 157 164 -4.25000000000000e+00 157 59 -6.04051381939037e-16 157 43 -5.66666666666667e+00 157 223 5.66666666666667e+00 157 163 -4.95833333333333e+00 157 156 0.00000000000000e+00 157 42 1.68593437821496e-16 157 222 0.00000000000000e+00 157 162 -2.32967941812823e-17 157 227 2.08333333333333e+00 157 160 -4.86111111111111e+00 157 226 -3.47222222222222e+00 157 159 4.16666666666667e+00 157 225 2.08333333333333e+00 157 230 8.88178419700125e-16 157 155 1.38777878078145e-17 157 242 -1.88759598229726e-16 157 221 -2.08333333333333e+00 157 229 5.55555555555555e+00 157 161 -4.05925293378573e-16 157 154 -4.86111111111111e+00 157 241 -1.38888888888889e+00 157 220 -3.47222222222222e+00 157 228 -2.21177243187043e-16 157 153 -4.16666666666667e+00 157 240 1.11672823766007e-16 157 219 -2.08333333333333e+00 157 308 8.18572640226556e-18 157 398 4.16666666666667e-02 157 307 -9.72222222222222e-02 157 397 -6.94444444444444e-02 157 306 -8.33333333333334e-02 157 396 -4.16666666666667e-02 157 401 -2.08166817117217e-17 157 302 1.35525271560688e-17 157 449 -2.26056152963228e-17 157 392 -4.16666666666666e-02 157 400 1.11111111111111e-01 157 301 -9.72222222222222e-02 157 448 -2.77777777777778e-02 157 391 -6.94444444444444e-02 157 399 1.08420217248550e-18 157 300 8.33333333333333e-02 157 447 -8.67361737988404e-19 157 390 4.16666666666667e-02 158 158 2.83333333333333e+01 158 167 -4.95833333333333e+00 158 58 -5.02175341240974e-16 158 166 4.25000000000000e+00 158 57 2.04166666666667e+00 158 165 -4.74067399919287e-17 158 59 2.83333333333333e+00 158 44 2.83333333333333e+00 158 224 -1.13333333333333e+01 158 164 -4.95833333333333e+00 158 157 9.02056207507940e-16 158 43 -6.68183634507449e-16 158 223 -3.98617093109663e-16 158 163 -4.25000000000000e+00 158 156 8.16666666666667e+00 158 42 2.04166666666667e+00 158 222 -4.01432630626336e-16 158 162 -4.74202925190848e-17 158 227 -3.47222222222222e+00 158 160 -4.44089209850063e-16 158 226 2.08333333333333e+00 158 159 9.88792381306780e-17 158 225 -2.08333333333333e+00 158 230 5.55555555555555e+00 158 161 -6.94444444444445e-01 158 155 -6.94444444444445e-01 158 242 -9.72222222222222e+00 158 221 -3.47222222222222e+00 158 229 1.33226762955019e-15 158 154 5.20417042793042e-17 158 241 -1.43982048506075e-16 158 220 -2.08333333333333e+00 158 228 6.14851052016530e-16 158 153 1.96023752785379e-16 158 240 -8.33333333333333e+00 158 219 -2.08333333333333e+00 158 308 -1.38888888888889e-02 158 398 -6.94444444444445e-02 158 307 7.26415455565288e-18 158 397 4.16666666666667e-02 158 306 1.08420217248550e-19 158 396 4.16666666666667e-02 158 401 1.11111111111111e-01 158 302 -1.38888888888889e-02 158 449 -1.94444444444444e-01 158 392 -6.94444444444445e-02 158 400 -2.77555756156289e-17 158 301 1.36609473733174e-17 158 448 -2.36762649416522e-17 158 391 -4.16666666666666e-02 158 399 -1.12214924852250e-17 158 300 -8.67361737988404e-19 158 447 1.66666666666667e-01 158 390 4.16666666666667e-02 159 159 2.77777777777778e+01 159 134 2.70616862252382e-16 159 143 -4.16666666666667e+00 159 209 -2.08333333333333e+00 159 55 -4.99600361081320e-16 159 133 -4.16666666666667e+00 159 142 -8.32667268468867e-17 159 208 -2.08333333333333e+00 159 54 -5.55555555555555e+00 159 132 -4.86111111111111e+00 159 141 -4.86111111111111e+00 159 207 -3.47222222222222e+00 159 161 0.00000000000000e+00 159 59 -9.71445146547012e-17 159 158 1.26634813746307e-16 159 230 0.00000000000000e+00 159 227 -6.74807432154978e-16 159 167 4.16666666666667e+00 159 224 2.08333333333333e+00 159 242 -1.23707467880596e-16 159 160 8.88178419700125e-16 159 58 -1.52655665885959e-16 159 157 4.16666666666667e+00 159 229 3.10515502199848e-16 159 226 8.88178419700125e-16 159 166 5.72458747072346e-17 159 223 2.08333333333333e+00 159 241 5.58364118830035e-17 159 56 4.99600361081320e-16 159 57 -5.55555555555556e+00 159 156 -4.86111111111111e+00 159 228 5.55555555555555e+00 159 225 5.55555555555556e+00 159 165 -4.86111111111111e+00 159 222 -3.47222222222222e+00 159 240 -1.38888888888889e+00 160 160 2.77777777777778e+01 160 134 -2.08166817117217e-16 160 143 1.30104260698261e-17 160 209 -2.08333333333333e+00 160 55 2.77777777777778e+00 160 133 -4.86111111111111e+00 160 142 -6.94444444444443e-01 160 208 -3.47222222222222e+00 160 54 -4.64905891561784e-16 160 132 -4.16666666666667e+00 160 141 -1.05818132034585e-16 160 207 -2.08333333333333e+00 160 161 8.33333333333333e+00 160 59 2.08333333333333e+00 160 158 -4.99600361081320e-16 160 230 7.06899816460549e-16 160 227 -1.26678181833206e-15 160 167 -1.83013326715553e-16 160 224 -2.08333333333333e+00 160 242 -8.33333333333333e+00 160 56 2.08333333333333e+00 160 58 2.77777777777778e+00 160 157 -4.86111111111111e+00 160 229 -1.11111111111111e+01 160 226 5.55555555555556e+00 160 166 -6.94444444444445e-01 160 223 -3.47222222222222e+00 160 241 -9.72222222222223e+00 160 159 8.88178419700125e-16 160 57 -2.22044604925031e-16 160 156 4.16666666666667e+00 160 228 4.85722573273506e-16 160 225 8.88178419700125e-16 160 165 4.85722573273506e-17 160 222 2.08333333333333e+00 160 240 1.47451495458029e-17 161 161 2.77777777777778e+01 161 134 -6.94444444444444e-01 161 143 -4.86111111111111e+00 161 209 -3.47222222222222e+00 161 55 2.08333333333333e+00 161 133 -2.22044604925031e-16 161 142 8.32667268468867e-17 161 208 -2.08333333333333e+00 161 54 6.59194920871187e-16 161 132 2.64545330086463e-16 161 141 -4.16666666666667e+00 161 207 -2.08333333333333e+00 161 56 2.77777777777778e+00 161 59 2.77777777777778e+00 161 158 -6.94444444444445e-01 161 230 5.55555555555556e+00 161 227 -1.11111111111111e+01 161 167 -4.86111111111111e+00 161 224 -3.47222222222222e+00 161 242 -9.72222222222222e+00 161 160 8.33333333333333e+00 161 58 2.08333333333333e+00 161 157 -4.05057931640584e-16 161 229 6.76108474761961e-16 161 226 -1.62370117351429e-15 161 166 -2.22044604925031e-16 161 223 -2.08333333333333e+00 161 241 -8.33333333333333e+00 161 159 0.00000000000000e+00 161 57 -1.11022302462516e-16 161 156 1.11022302462516e-16 161 228 0.00000000000000e+00 161 225 -5.13478148889135e-16 161 165 4.16666666666667e+00 161 222 2.08333333333333e+00 161 240 -9.02056207507940e-17 162 162 2.83333333333333e+01 162 44 -8.04701628682319e-16 162 157 -2.15620707053055e-17 162 43 -2.04166666666667e+00 162 156 -7.08333333333333e-01 162 42 2.83333333333334e+00 162 224 1.33226762955019e-15 162 164 3.58046925441613e-15 162 149 -6.95380168377890e-17 162 14 -6.01952434295741e-16 162 223 1.18665927778538e-16 162 163 -8.16666666666667e+00 162 148 -2.15620707053055e-17 162 13 -2.04166666666667e+00 162 222 5.66666666666667e+00 162 158 8.09085871217308e-18 162 147 -7.08333333333333e-01 162 12 2.83333333333334e+00 162 155 4.16666666666667e+00 162 229 2.08333333333333e+00 162 154 6.07153216591882e-18 162 228 -3.47222222222222e+00 162 153 -4.86111111111112e+00 162 242 2.45463371850718e-16 162 221 1.38951350425742e-15 162 218 -2.08333333333333e+00 162 146 -4.16666666666667e+00 162 241 8.33333333333333e+00 162 220 -3.16587034365767e-16 162 217 2.08333333333333e+00 162 145 6.07153216591882e-18 162 240 -9.72222222222222e+00 162 230 2.08333333333333e+00 162 219 -1.11111111111111e+01 162 216 -3.47222222222222e+00 162 144 -4.86111111111112e+00 162 401 -4.16666666666667e-02 162 302 -8.33333333333333e-02 162 400 -4.16666666666667e-02 162 301 1.03168612975574e-18 162 399 -6.94444444444445e-02 162 300 -9.72222222222222e-02 162 449 -2.73252828784237e-18 162 392 4.59907126623563e-17 162 389 4.16666666666667e-02 162 293 8.33333333333334e-02 162 448 -1.66666666666667e-01 162 391 3.88597540376592e-18 162 388 -4.16666666666667e-02 162 292 2.87991202066462e-19 162 447 -1.94444444444444e-01 162 390 -2.22222222222222e-01 162 387 -6.94444444444445e-02 162 291 -9.72222222222223e-02 163 163 2.83333333333333e+01 163 44 2.26630441301466e-16 163 157 -4.95833333333333e+00 163 43 2.83333333333333e+00 163 156 -1.59089728153303e-17 163 42 -2.04166666666667e+00 163 224 -6.70060659518565e-16 163 164 -8.60422844084496e-16 163 149 4.25000000000000e+00 163 14 -6.77708943515798e-17 163 223 -1.13333333333333e+01 163 158 -4.25000000000000e+00 163 148 -4.95833333333333e+00 163 13 2.83333333333333e+00 163 222 2.81678477268813e-16 163 162 -8.16666666666667e+00 163 147 -1.50568576703924e-17 163 12 -2.04166666666667e+00 163 155 1.54390389361936e-16 163 229 -3.47222222222222e+00 163 154 -6.94444444444446e-01 163 228 2.08333333333333e+00 163 153 3.27429056090622e-17 163 242 -5.49798921667399e-16 163 221 4.44089209850063e-16 163 218 2.08333333333333e+00 163 146 -6.63531729561129e-17 163 241 -9.72222222222222e+00 163 230 -2.08333333333333e+00 163 220 5.55555555555555e+00 163 217 -3.47222222222222e+00 163 145 -6.94444444444445e-01 163 240 8.33333333333333e+00 163 219 -2.83857681283861e-16 163 216 2.08333333333333e+00 163 144 3.96817995129695e-17 163 401 -4.16666666666667e-02 163 302 -7.99599102208060e-18 163 400 -6.94444444444444e-02 163 301 -1.38888888888889e-02 163 399 -4.16666666666667e-02 163 300 8.53809210832335e-19 163 449 1.58191873229213e-17 163 392 -2.08166817117217e-17 163 389 4.16666666666667e-02 163 293 -9.01243055878576e-18 163 448 -1.94444444444444e-01 163 391 1.11111111111111e-01 163 388 -6.94444444444444e-02 163 292 -1.38888888888889e-02 163 447 -1.66666666666667e-01 163 390 1.47722546001150e-18 163 387 -4.16666666666667e-02 163 291 5.42101086242752e-19 164 164 2.83333333333333e+01 164 44 -5.66666666666666e+00 164 157 -4.25000000000000e+00 164 43 -6.77708943515798e-17 164 156 -1.57463424894574e-17 164 42 -3.83377276322663e-16 164 224 5.66666666666667e+00 164 158 -4.95833333333333e+00 164 149 -4.95833333333333e+00 164 14 -5.66666666666666e+00 164 223 -7.13372842243466e-16 164 163 -8.60422844084496e-16 164 148 4.25000000000000e+00 164 13 1.71171806112938e-16 164 222 1.33226762955019e-15 164 162 3.58046925441613e-15 164 147 -4.74067399919287e-17 164 12 -8.05514780311684e-16 164 155 -4.86111111111111e+00 164 229 -2.08333333333333e+00 164 154 3.31765864780564e-17 164 228 2.08333333333333e+00 164 153 4.16666666666667e+00 164 242 -1.38888888888889e+00 164 230 -3.47222222222222e+00 164 221 5.55555555555555e+00 164 218 -3.47222222222222e+00 164 146 -4.86111111111111e+00 164 241 -5.25621213220973e-16 164 220 8.88178419700125e-16 164 217 2.08333333333333e+00 164 145 -1.14491749414469e-16 164 240 3.60605642568679e-16 164 219 1.45314261925517e-15 164 216 -2.08333333333333e+00 164 144 -4.16666666666667e+00 164 401 -6.94444444444444e-02 164 302 -9.72222222222222e-02 164 400 -4.16666666666667e-02 164 301 -7.59788553687107e-18 164 399 -4.16666666666667e-02 164 300 -8.33333333333333e-02 164 449 -2.77777777777778e-02 164 392 1.11111111111111e-01 164 389 -6.94444444444445e-02 164 293 -9.72222222222223e-02 164 448 1.29426634340457e-17 164 391 -2.77555756156289e-17 164 388 4.16666666666667e-02 164 292 -9.14795583034644e-18 164 447 -1.04354459101730e-18 164 390 4.90669245685471e-17 164 387 4.16666666666667e-02 164 291 8.33333333333334e-02 165 165 2.83333333333333e+01 165 158 -4.74202925190848e-17 165 58 2.04166666666667e+00 165 157 -1.50568576703924e-17 165 57 2.83333333333333e+00 165 156 -7.08333333333333e-01 165 167 -1.69309011255336e-15 165 224 1.33920652345410e-15 165 29 1.15847002130076e-16 165 149 -7.11609319647283e-17 165 166 8.16666666666667e+00 165 223 1.74125833516487e-16 165 28 2.04166666666667e+00 165 148 -1.58124110593433e-17 165 59 2.92951427005583e-16 165 222 5.66666666666667e+00 165 27 2.83333333333333e+00 165 147 -7.08333333333333e-01 165 230 2.08333333333333e+00 165 160 5.55111512312578e-17 165 229 -2.08333333333333e+00 165 159 -4.86111111111111e+00 165 228 -3.47222222222222e+00 165 227 -4.85722573273506e-17 165 242 6.06285854853894e-16 165 152 -4.16666666666667e+00 165 218 -2.08333333333333e+00 165 226 -2.28116137090950e-16 165 241 -8.33333333333333e+00 165 151 6.24500451351651e-17 165 217 -2.08333333333333e+00 165 225 -1.11111111111111e+01 165 161 4.16666666666667e+00 165 240 -9.72222222222222e+00 165 150 -4.86111111111111e+00 165 216 -3.47222222222222e+00 165 308 -8.33333333333334e-02 165 401 -4.16666666666667e-02 165 307 -6.77626357803440e-20 165 400 4.16666666666667e-02 165 306 -9.72222222222223e-02 165 399 -6.94444444444445e-02 165 398 -6.79794762148411e-17 165 449 -6.20197523979599e-18 165 299 8.33333333333333e-02 165 389 4.16666666666667e-02 165 397 2.71050543121376e-19 165 448 1.66666666666667e-01 165 298 -2.98155597433514e-19 165 388 4.16666666666667e-02 165 396 -2.22222222222222e-01 165 447 -1.94444444444444e-01 165 297 -9.72222222222223e-02 165 387 -6.94444444444445e-02 166 166 2.83333333333333e+01 166 158 4.25000000000000e+00 166 58 2.83333333333333e+00 166 157 -4.95833333333333e+00 166 57 2.04166666666667e+00 166 156 -2.15485181781494e-17 166 167 -2.70616862252382e-15 166 224 -2.08527653152747e-16 166 29 -1.21691529466131e-16 166 149 -4.25000000000000e+00 166 59 -5.69788899222601e-16 166 223 -1.13333333333333e+01 166 28 2.83333333333333e+00 166 148 -4.95833333333333e+00 166 165 8.16666666666667e+00 166 222 2.29796650458303e-16 166 27 2.04166666666667e+00 166 147 -2.32967941812823e-17 166 230 2.08333333333333e+00 166 160 -6.94444444444445e-01 166 229 -3.47222222222222e+00 166 159 5.72458747072346e-17 166 228 -2.08333333333333e+00 166 227 2.22044604925031e-15 166 242 3.70363462121048e-16 166 152 -1.22298005056365e-16 166 218 -2.08333333333333e+00 166 226 5.55555555555555e+00 166 161 -2.22044604925031e-16 166 241 -9.72222222222222e+00 166 151 -6.94444444444445e-01 166 217 -3.47222222222222e+00 166 225 -1.09395999203787e-16 166 240 -8.33333333333333e+00 166 150 7.11236625150491e-17 166 216 -2.08333333333333e+00 166 308 -1.26851654180804e-17 166 401 4.16666666666667e-02 166 307 -1.38888888888889e-02 166 400 -6.94444444444444e-02 166 306 -3.25260651745651e-19 166 399 4.16666666666667e-02 166 398 -4.16333634234434e-17 166 449 3.01272678679410e-17 166 299 -1.36067372646931e-17 166 389 -4.16666666666666e-02 166 397 1.11111111111111e-01 166 448 -1.94444444444444e-01 166 298 -1.38888888888889e-02 166 388 -6.94444444444444e-02 166 396 -8.67361737988404e-19 166 447 1.66666666666667e-01 166 297 -5.42101086242752e-19 166 387 4.16666666666667e-02 167 167 2.83333333333333e+01 167 158 -4.95833333333333e+00 167 58 -1.70316302836211e-16 167 157 4.25000000000000e+00 167 57 1.15860554657232e-16 167 156 4.23499532968205e-17 167 59 -5.66666666666667e+00 167 224 5.66666666666667e+00 167 29 -5.66666666666667e+00 167 149 -4.95833333333333e+00 167 166 -2.70616862252382e-15 167 223 -3.74236096755895e-16 167 28 -5.69788899222601e-16 167 148 -4.25000000000000e+00 167 165 -1.69309011255336e-15 167 222 1.33920652345410e-15 167 27 4.04082149685348e-16 167 147 -1.58442594981600e-16 167 230 -3.47222222222222e+00 167 160 -1.83013326715553e-16 167 229 2.08333333333333e+00 167 159 4.16666666666667e+00 167 228 2.08333333333333e+00 167 227 5.55555555555555e+00 167 161 -4.86111111111111e+00 167 242 -1.38888888888889e+00 167 152 -4.86111111111111e+00 167 218 -3.47222222222222e+00 167 226 2.22044604925031e-15 167 241 3.95842213174458e-16 167 151 -4.85722573273506e-17 167 217 -2.08333333333333e+00 167 225 -1.65666091955785e-16 167 240 5.34186410383608e-16 167 150 -4.16666666666667e+00 167 216 -2.08333333333333e+00 167 308 -9.72222222222223e-02 167 401 -6.94444444444444e-02 167 307 -1.35389746289127e-17 167 400 4.16666666666667e-02 167 306 -8.33333333333334e-02 167 399 -4.16666666666667e-02 167 398 1.11111111111111e-01 167 449 -2.77777777777778e-02 167 299 -9.72222222222222e-02 167 389 -6.94444444444445e-02 167 397 -4.16333634234434e-17 167 448 3.11877531179033e-17 167 298 -1.29020058525775e-17 167 388 -4.16666666666666e-02 167 396 -6.70036942596042e-17 167 447 -4.94667241196511e-18 167 297 8.33333333333333e-02 167 387 4.16666666666667e-02 168 168 5.55555555555556e+01 168 17 0.00000000000000e+00 168 94 0.00000000000000e+00 168 16 0.00000000000000e+00 168 93 0.00000000000000e+00 168 15 0.00000000000000e+00 168 179 -7.45931094670027e-17 168 92 -2.08333333333333e+00 168 68 4.44089209850063e-16 168 20 9.77950359581925e-17 168 178 3.38271077815477e-17 168 91 -2.08333333333333e+00 168 67 3.48245737802344e-16 168 19 -4.16666666666667e+00 168 177 -1.38888888888889e+00 168 90 -3.47222222222222e+00 168 66 5.55555555555556e+00 168 18 -4.86111111111111e+00 168 176 -8.33333333333333e+00 168 89 -2.08333333333333e+00 168 65 -1.54837622758086e-16 168 5 -2.81892564846231e-18 168 175 -6.68952740423556e-17 168 88 2.08333333333333e+00 168 64 -4.22947267486595e-16 168 4 4.16666666666666e+00 168 174 -9.72222222222223e+00 168 87 -3.47222222222222e+00 168 63 -1.11111111111111e+01 168 3 -4.86111111111111e+00 168 182 0.00000000000000e+00 168 233 5.58364118830035e-16 168 173 3.72965547335014e-17 168 86 0.00000000000000e+00 168 71 0.00000000000000e+00 168 170 1.77635683940025e-15 168 62 4.44089209850063e-16 168 2 0.00000000000000e+00 168 181 0.00000000000000e+00 168 232 8.88178419700125e-16 168 172 7.84962372879505e-17 168 85 0.00000000000000e+00 168 70 0.00000000000000e+00 168 169 -1.77635683940025e-15 168 61 4.10004604052550e-16 168 1 0.00000000000000e+00 168 180 0.00000000000000e+00 168 231 1.11111111111111e+01 168 171 -1.38888888888889e+00 168 84 0.00000000000000e+00 168 69 0.00000000000000e+00 168 95 0.00000000000000e+00 168 60 5.55555555555556e+00 168 0 0.00000000000000e+00 169 169 5.55555555555556e+01 169 17 0.00000000000000e+00 169 94 0.00000000000000e+00 169 16 0.00000000000000e+00 169 93 0.00000000000000e+00 169 15 0.00000000000000e+00 169 179 -8.33333333333333e+00 169 92 -2.08333333333333e+00 169 68 3.91939085353510e-17 169 20 1.02782365951626e-16 169 178 -9.72222222222223e+00 169 91 -3.47222222222222e+00 169 67 -1.11111111111111e+01 169 19 -4.86111111111111e+00 169 177 7.68699340292223e-17 169 90 -2.08333333333333e+00 169 66 3.00717025066011e-16 169 18 -4.16666666666667e+00 169 176 -3.23525928269675e-16 169 89 2.08333333333333e+00 169 65 8.88178419700125e-16 169 5 1.56992474575901e-16 169 175 -1.38888888888889e+00 169 88 -3.47222222222222e+00 169 64 5.55555555555556e+00 169 4 -4.86111111111111e+00 169 174 -6.33174068731535e-17 169 87 2.08333333333333e+00 169 63 -2.59449579875781e-16 169 3 4.16666666666666e+00 169 182 0.00000000000000e+00 169 233 1.95047970830142e-16 169 173 8.33333333333333e+00 169 86 0.00000000000000e+00 169 71 0.00000000000000e+00 169 170 -8.88178419700125e-16 169 62 -1.81603863891322e-16 169 2 0.00000000000000e+00 169 181 0.00000000000000e+00 169 232 1.11111111111111e+01 169 172 -9.72222222222223e+00 169 85 0.00000000000000e+00 169 70 0.00000000000000e+00 169 95 0.00000000000000e+00 169 61 -1.11111111111111e+01 169 1 0.00000000000000e+00 169 180 0.00000000000000e+00 169 231 8.88178419700125e-16 169 171 1.45716771982052e-16 169 84 0.00000000000000e+00 169 69 0.00000000000000e+00 169 168 -1.77635683940025e-15 169 60 3.48245737802344e-16 169 0 0.00000000000000e+00 170 170 5.55555555555556e+01 170 17 0.00000000000000e+00 170 94 0.00000000000000e+00 170 16 0.00000000000000e+00 170 93 0.00000000000000e+00 170 15 0.00000000000000e+00 170 179 -9.72222222222222e+00 170 92 -3.47222222222222e+00 170 68 5.55555555555556e+00 170 20 -6.94444444444444e-01 170 178 -8.33333333333333e+00 170 91 -2.08333333333333e+00 170 67 4.04407410337093e-17 170 19 1.20563281580388e-16 170 177 1.75966012594397e-16 170 90 -2.08333333333333e+00 170 66 4.44089209850063e-16 170 18 1.41379963292110e-16 170 176 -9.72222222222222e+00 170 89 -3.47222222222222e+00 170 65 5.55555555555556e+00 170 5 -6.94444444444443e-01 170 175 -3.83915989277117e-16 170 88 2.08333333333333e+00 170 64 8.88178419700125e-16 170 4 1.95590071916385e-16 170 174 -8.33333333333333e+00 170 87 -2.08333333333333e+00 170 63 -2.53378047709862e-16 170 3 -9.36750677027476e-17 170 182 0.00000000000000e+00 170 233 -2.22222222222222e+01 170 173 -9.72222222222222e+00 170 86 0.00000000000000e+00 170 71 0.00000000000000e+00 170 95 0.00000000000000e+00 170 62 5.55555555555556e+00 170 2 0.00000000000000e+00 170 181 0.00000000000000e+00 170 232 8.84573447476611e-17 170 172 8.33333333333333e+00 170 85 0.00000000000000e+00 170 70 0.00000000000000e+00 170 169 -8.88178419700125e-16 170 61 -7.18419464543207e-17 170 1 0.00000000000000e+00 170 180 0.00000000000000e+00 170 231 1.41488383509358e-16 170 171 1.76833374332386e-16 170 84 0.00000000000000e+00 170 69 0.00000000000000e+00 170 168 1.77635683940025e-15 170 60 4.44089209850063e-16 170 0 0.00000000000000e+00 171 171 5.55555555555556e+01 171 35 -4.16666666666667e+00 171 76 -2.08333333333333e+00 171 34 -3.30681662608079e-17 171 75 -3.47222222222222e+00 171 33 -4.86111111111112e+00 171 83 0.00000000000000e+00 171 185 3.64291929955129e-17 171 74 -3.83807569059869e-17 171 32 0.00000000000000e+00 171 82 0.00000000000000e+00 171 184 3.38271077815477e-17 171 73 0.00000000000000e+00 171 31 0.00000000000000e+00 171 81 0.00000000000000e+00 171 183 -1.38888888888889e+00 171 72 5.55555555555556e+00 171 30 0.00000000000000e+00 171 176 -5.31259064517897e-17 171 89 2.48146772227620e-17 171 65 2.08333333333333e+00 171 5 4.16666666666667e+00 171 175 -8.33333333333333e+00 171 88 -4.22513586617601e-16 171 64 -2.08333333333333e+00 171 4 -3.39355279987963e-17 171 174 -9.72222222222222e+00 171 87 -1.11111111111111e+01 171 63 -3.47222222222222e+00 171 3 -4.86111111111112e+00 171 182 0.00000000000000e+00 171 233 1.33226762955019e-15 171 173 1.77635683940025e-15 171 86 0.00000000000000e+00 171 71 0.00000000000000e+00 171 170 1.77700736070374e-16 171 62 4.31078783780237e-16 171 2 0.00000000000000e+00 171 181 0.00000000000000e+00 171 232 3.75892893200724e-16 171 172 0.00000000000000e+00 171 85 0.00000000000000e+00 171 70 0.00000000000000e+00 171 169 1.45716771982052e-16 171 61 -4.44089209850063e-16 171 1 0.00000000000000e+00 171 180 0.00000000000000e+00 171 231 1.11111111111111e+01 171 77 -2.08333333333333e+00 171 84 0.00000000000000e+00 171 69 0.00000000000000e+00 171 168 -1.38888888888889e+00 171 60 5.55555555555556e+00 171 0 0.00000000000000e+00 172 172 5.55555555555556e+01 172 35 -1.42247325030098e-16 172 76 -3.47222222222222e+00 172 34 -6.94444444444445e-01 172 75 -2.08333333333333e+00 172 33 1.30104260698261e-17 172 83 0.00000000000000e+00 172 185 -8.33333333333333e+00 172 74 4.91685685222176e-16 172 32 0.00000000000000e+00 172 82 0.00000000000000e+00 172 184 -9.72222222222223e+00 172 73 5.55555555555556e+00 172 31 0.00000000000000e+00 172 81 0.00000000000000e+00 172 183 7.68699340292223e-17 172 72 0.00000000000000e+00 172 30 0.00000000000000e+00 172 176 1.21755903970122e-16 172 89 0.00000000000000e+00 172 65 2.08333333333333e+00 172 5 1.29995840481012e-16 172 175 -9.72222222222222e+00 172 88 5.55555555555556e+00 172 64 -3.47222222222222e+00 172 4 -6.94444444444445e-01 172 174 -8.33333333333333e+00 172 87 -3.15828092845027e-16 172 63 -2.08333333333333e+00 172 3 0.00000000000000e+00 172 182 0.00000000000000e+00 172 233 -1.83297929785831e-16 172 173 0.00000000000000e+00 172 86 0.00000000000000e+00 172 71 0.00000000000000e+00 172 170 8.33333333333333e+00 172 62 1.39956947940723e-16 172 2 0.00000000000000e+00 172 181 0.00000000000000e+00 172 232 -2.22222222222222e+01 172 77 -2.08333333333333e+00 172 85 0.00000000000000e+00 172 70 0.00000000000000e+00 172 169 -9.72222222222223e+00 172 61 5.55555555555556e+00 172 1 0.00000000000000e+00 172 180 0.00000000000000e+00 172 231 4.39589770834248e-16 172 171 0.00000000000000e+00 172 84 0.00000000000000e+00 172 69 0.00000000000000e+00 172 168 7.76288755499621e-17 172 60 0.00000000000000e+00 172 0 0.00000000000000e+00 173 173 5.55555555555556e+01 173 35 -4.86111111111111e+00 173 76 -2.08333333333333e+00 173 34 -1.35742111995185e-16 173 75 -2.08333333333333e+00 173 33 -4.16666666666667e+00 173 83 0.00000000000000e+00 173 185 -9.72222222222222e+00 173 74 -1.11111111111111e+01 173 32 0.00000000000000e+00 173 82 0.00000000000000e+00 173 184 -8.33333333333333e+00 173 73 3.62015105392910e-16 173 31 0.00000000000000e+00 173 81 0.00000000000000e+00 173 183 1.75966012594397e-16 173 72 4.31092336307393e-16 173 30 0.00000000000000e+00 173 176 -1.38888888888889e+00 173 89 5.55555555555556e+00 173 65 -3.47222222222222e+00 173 5 -4.86111111111111e+00 173 175 9.19403442267708e-17 173 88 0.00000000000000e+00 173 64 2.08333333333333e+00 173 4 1.50920942409982e-16 173 174 -1.84748050191530e-16 173 87 4.06575814682064e-17 173 63 2.08333333333333e+00 173 3 4.16666666666667e+00 173 182 0.00000000000000e+00 173 233 1.11111111111111e+01 173 77 -3.47222222222222e+00 173 86 0.00000000000000e+00 173 71 0.00000000000000e+00 173 170 -9.72222222222222e+00 173 62 -1.11111111111111e+01 173 2 0.00000000000000e+00 173 181 0.00000000000000e+00 173 232 -4.13189447934226e-16 173 172 0.00000000000000e+00 173 85 0.00000000000000e+00 173 70 0.00000000000000e+00 173 169 8.33333333333333e+00 173 61 4.36174533990918e-16 173 1 0.00000000000000e+00 173 180 0.00000000000000e+00 173 231 1.33226762955019e-15 173 171 1.77635683940025e-15 173 84 0.00000000000000e+00 173 69 0.00000000000000e+00 173 168 3.72965547335014e-17 173 60 -3.83807569059869e-17 173 0 0.00000000000000e+00 174 174 1.11111111111111e+02 174 112 -2.08333333333333e+00 174 111 -3.47222222222222e+00 174 200 -8.33333333333333e+00 174 107 -2.08333333333333e+00 174 199 9.98550200859150e-17 174 106 2.08333333333333e+00 174 198 -9.72222222222223e+00 174 105 -3.47222222222222e+00 174 197 1.60136660876109e-16 174 104 2.08333333333333e+00 174 196 -8.33333333333333e+00 174 103 -2.08333333333333e+00 174 195 -9.72222222222222e+00 174 102 -3.47222222222222e+00 174 236 -1.47898728854179e-16 174 191 -2.02745806254789e-17 174 188 8.33333333333333e+00 174 98 2.08333333333333e+00 174 235 5.61643830401803e-16 174 190 8.33333333333333e+00 174 187 9.19403442267708e-17 174 97 2.08333333333333e+00 174 234 -2.22222222222222e+01 174 189 -9.72222222222222e+00 174 186 -9.72222222222223e+00 174 96 -3.47222222222222e+00 174 80 2.08333333333333e+00 174 50 8.06646416329215e-17 174 79 2.08333333333333e+00 174 49 4.77048955893622e-17 174 78 -3.47222222222222e+00 174 48 -1.38888888888889e+00 174 185 8.33333333333333e+00 174 77 -2.59124319224036e-17 174 35 7.37257477290143e-17 174 74 2.08333333333333e+00 174 184 -1.04950770296597e-16 174 76 4.44089209850063e-16 174 34 2.17924636669586e-17 174 73 -2.08333333333333e+00 174 183 -9.72222222222223e+00 174 75 1.11111111111111e+01 174 33 -1.38888888888889e+00 174 72 -3.47222222222222e+00 174 179 -2.12503625807159e-16 174 92 1.77635683940025e-15 174 68 -2.08333333333333e+00 174 20 5.45353692760209e-17 174 178 8.33333333333333e+00 174 91 -1.62630325872826e-17 174 67 2.08333333333333e+00 174 19 5.46437894932694e-17 174 177 -9.72222222222222e+00 174 90 1.11111111111111e+01 174 66 -3.47222222222222e+00 174 18 -1.38888888888889e+00 174 233 -3.95516952522712e-16 174 176 8.88178419700125e-16 174 89 1.77635683940025e-15 174 173 -1.84748050191530e-16 174 170 -8.33333333333333e+00 174 65 2.25093923535147e-16 174 5 2.83735708539457e-16 174 62 -2.08333333333333e+00 174 232 -7.65013052905772e-16 174 175 -8.88178419700125e-16 174 88 2.08627603040523e-16 174 172 -8.33333333333333e+00 174 169 -7.71951946809679e-17 174 64 4.44089209850063e-16 174 4 8.27246257606440e-17 174 61 -2.08333333333333e+00 174 231 -2.22222222222222e+01 174 113 -2.08333333333333e+00 174 87 1.11111111111111e+01 174 171 -9.72222222222222e+00 174 168 -9.72222222222223e+00 174 63 1.11111111111111e+01 174 3 -1.38888888888889e+00 174 60 -3.47222222222222e+00 175 175 1.11111111111111e+02 175 112 -3.47222222222222e+00 175 111 -2.08333333333333e+00 175 200 4.24139889876329e-16 175 107 2.08333333333333e+00 175 199 -1.38888888888889e+00 175 106 -3.47222222222222e+00 175 198 6.93889390390723e-18 175 105 2.08333333333333e+00 175 197 1.45825192199300e-16 175 104 2.08333333333333e+00 175 196 -9.72222222222222e+00 175 103 -3.47222222222222e+00 175 195 -8.33333333333333e+00 175 102 -2.08333333333333e+00 175 236 2.66453525910038e-15 175 191 2.39391839684799e-16 175 188 -3.03901868947687e-16 175 98 -2.08333333333333e+00 175 235 1.11111111111111e+01 175 190 -9.72222222222222e+00 175 187 -1.38888888888889e+00 175 97 -3.47222222222222e+00 175 234 4.32705087038965e-16 175 189 8.33333333333333e+00 175 186 8.67361737988404e-18 175 96 2.08333333333333e+00 175 80 -2.08333333333333e+00 175 50 -8.33333333333333e+00 175 79 -3.47222222222222e+00 175 49 -9.72222222222223e+00 175 78 2.08333333333333e+00 175 48 6.88468379528295e-17 175 185 2.68882138776405e-16 175 77 3.15502832193282e-17 175 35 8.33333333333333e+00 175 74 2.08333333333333e+00 175 184 -1.38888888888889e+00 175 76 1.11111111111111e+01 175 34 -9.72222222222223e+00 175 73 -3.47222222222222e+00 175 183 -1.31080042653497e-16 175 75 4.44089209850063e-16 175 33 6.85215773010839e-17 175 72 -2.08333333333333e+00 175 179 4.02781107078365e-16 175 92 1.56192875473693e-16 175 68 2.08333333333333e+00 175 20 8.33333333333333e+00 175 178 -9.72222222222222e+00 175 91 -2.22222222222222e+01 175 67 -3.47222222222222e+00 175 19 -9.72222222222223e+00 175 177 8.33333333333333e+00 175 90 9.07748268913489e-17 175 66 2.08333333333333e+00 175 18 2.16840434497101e-19 175 233 1.33226762955019e-15 175 176 -2.66453525910038e-15 175 89 1.11672823766007e-17 175 173 9.19403442267708e-17 175 170 -3.83915989277117e-16 175 65 2.07597610976662e-16 175 5 -8.33333333333333e+00 175 62 -2.08333333333333e+00 175 232 1.11111111111111e+01 175 113 -2.08333333333333e+00 175 88 -2.22222222222222e+01 175 172 -9.72222222222222e+00 175 169 -1.38888888888889e+00 175 64 1.11111111111111e+01 175 4 -9.72222222222223e+00 175 61 -3.47222222222222e+00 175 231 -9.16150835750251e-16 175 174 -8.88178419700125e-16 175 87 3.72423446248771e-16 175 171 -8.33333333333333e+00 175 168 -1.03324467037869e-16 175 63 4.44089209850063e-16 175 3 6.15826833971767e-17 175 60 -2.08333333333333e+00 176 176 1.11111111111111e+02 176 112 -2.08333333333333e+00 176 111 -2.08333333333333e+00 176 200 -9.72222222222222e+00 176 107 -3.47222222222222e+00 176 199 2.39608680119296e-16 176 106 2.08333333333333e+00 176 198 -8.33333333333333e+00 176 105 -2.08333333333333e+00 176 197 -1.38888888888889e+00 176 104 -3.47222222222222e+00 176 196 1.98625837999344e-16 176 103 2.08333333333333e+00 176 195 1.48318857196017e-16 176 102 2.08333333333333e+00 176 236 1.11111111111111e+01 176 191 -1.38888888888889e+00 176 188 -9.72222222222222e+00 176 98 -3.47222222222222e+00 176 235 1.77635683940025e-15 176 190 2.66280053562440e-16 176 187 -1.60461921527855e-16 176 97 -2.08333333333333e+00 176 234 -3.68845579079569e-16 176 189 4.33680868994202e-18 176 186 8.33333333333333e+00 176 96 2.08333333333333e+00 176 80 -3.47222222222222e+00 176 50 -9.72222222222222e+00 176 79 -2.08333333333333e+00 176 49 -8.33333333333333e+00 176 78 2.08333333333333e+00 176 48 1.71846044338952e-16 176 185 -9.72222222222222e+00 176 77 -2.22222222222222e+01 176 35 -9.72222222222222e+00 176 74 -3.47222222222222e+00 176 184 2.89481980053630e-16 176 76 2.17368983056188e-16 176 34 8.33333333333333e+00 176 73 2.08333333333333e+00 176 183 8.33333333333333e+00 176 75 -2.82204272970821e-16 176 33 2.69749500514394e-16 176 72 2.08333333333333e+00 176 179 -1.38888888888889e+00 176 92 1.11111111111111e+01 176 68 -3.47222222222222e+00 176 20 -9.72222222222222e+00 176 178 5.17814957579077e-16 176 91 3.72206605814274e-16 176 67 2.08333333333333e+00 176 19 8.33333333333333e+00 176 177 -1.78025996722120e-16 176 90 1.77635683940025e-15 176 66 -2.08333333333333e+00 176 18 8.84708972748172e-17 176 233 1.11111111111111e+01 176 113 -3.47222222222222e+00 176 89 1.11111111111111e+01 176 173 -1.38888888888889e+00 176 170 -9.72222222222222e+00 176 65 -2.22222222222222e+01 176 5 -9.72222222222222e+00 176 62 -3.47222222222222e+00 176 232 1.77635683940025e-15 176 175 -2.66453525910038e-15 176 88 -1.73526557706305e-16 176 172 1.21755903970122e-16 176 169 -2.68014777038417e-16 176 64 1.14817010066215e-16 176 4 -8.33333333333333e+00 176 61 -2.08333333333333e+00 176 231 -3.54872923581662e-16 176 174 8.88178419700125e-16 176 87 1.77635683940025e-15 176 171 -3.40439482160448e-17 176 168 -8.33333333333333e+00 176 63 2.52402265754625e-16 176 3 8.06646416329215e-17 176 60 -2.08333333333333e+00 177 177 5.55555555555556e+01 177 83 0.00000000000000e+00 177 46 0.00000000000000e+00 177 82 0.00000000000000e+00 177 45 0.00000000000000e+00 177 81 0.00000000000000e+00 177 80 5.96744875736022e-16 177 50 -4.16666666666667e+00 177 77 -2.08333333333333e+00 177 185 3.72965547335014e-17 177 79 8.88178419700125e-16 177 49 -3.38271077815477e-17 177 76 2.08333333333333e+00 177 184 7.92551788086904e-17 177 78 5.55555555555556e+00 177 48 -4.86111111111111e+00 177 75 -3.47222222222222e+00 177 183 -1.38888888888889e+00 177 95 0.00000000000000e+00 177 182 0.00000000000000e+00 177 17 0.00000000000000e+00 177 71 0.00000000000000e+00 177 94 0.00000000000000e+00 177 181 0.00000000000000e+00 177 16 0.00000000000000e+00 177 70 0.00000000000000e+00 177 93 0.00000000000000e+00 177 180 0.00000000000000e+00 177 15 0.00000000000000e+00 177 69 0.00000000000000e+00 177 179 -8.88178419700125e-16 177 92 -2.69749500514394e-16 177 176 -1.57209315010398e-16 177 233 1.33226762955019e-15 177 68 -6.76542155630955e-17 177 20 4.16666666666667e+00 177 65 2.08333333333333e+00 177 170 6.49437101318817e-17 177 178 -1.77635683940025e-15 177 91 -4.31404044431982e-16 177 175 8.33333333333333e+00 177 232 5.48877349820787e-16 177 67 8.88178419700125e-16 177 19 -8.32667268468867e-17 177 64 2.08333333333333e+00 177 169 7.67615138119737e-17 177 47 0.00000000000000e+00 177 90 -1.11111111111111e+01 177 174 -9.72222222222222e+00 177 231 1.11111111111111e+01 177 66 5.55555555555556e+00 177 18 -4.86111111111111e+00 177 63 -3.47222222222222e+00 177 168 -1.38888888888889e+00 178 178 5.55555555555556e+01 178 83 0.00000000000000e+00 178 46 0.00000000000000e+00 178 82 0.00000000000000e+00 178 45 0.00000000000000e+00 178 81 0.00000000000000e+00 178 80 -2.41126563160776e-16 178 50 -1.80411241501588e-16 178 77 2.08333333333333e+00 178 185 8.33333333333333e+00 178 79 5.55555555555556e+00 178 49 -6.94444444444445e-01 178 76 -3.47222222222222e+00 178 184 -9.72222222222223e+00 178 78 8.88178419700125e-16 178 48 -7.63278329429795e-17 178 75 2.08333333333333e+00 178 183 1.45716771982052e-16 178 95 0.00000000000000e+00 178 182 0.00000000000000e+00 178 17 0.00000000000000e+00 178 71 0.00000000000000e+00 178 94 0.00000000000000e+00 178 181 0.00000000000000e+00 178 16 0.00000000000000e+00 178 70 0.00000000000000e+00 178 93 0.00000000000000e+00 178 180 0.00000000000000e+00 178 15 0.00000000000000e+00 178 69 0.00000000000000e+00 178 179 -8.88178419700125e-16 178 92 1.77635683940025e-15 178 176 4.62303806347819e-16 178 233 2.52944366840868e-16 178 68 -5.06322414550731e-17 178 20 1.04083408558608e-16 178 65 -2.08333333333333e+00 178 170 -8.33333333333333e+00 178 47 0.00000000000000e+00 178 91 5.55555555555556e+00 178 175 -9.72222222222222e+00 178 232 -2.22222222222222e+01 178 67 5.55555555555556e+00 178 19 -6.94444444444445e-01 178 64 -3.47222222222222e+00 178 169 -9.72222222222223e+00 178 177 -8.88178419700125e-16 178 90 -3.39138439553466e-16 178 174 8.33333333333333e+00 178 231 3.74158169724748e-16 178 66 8.88178419700125e-16 178 18 -9.71445146547012e-17 178 63 2.08333333333333e+00 178 168 3.38271077815477e-17 179 179 5.55555555555556e+01 179 83 0.00000000000000e+00 179 46 0.00000000000000e+00 179 82 0.00000000000000e+00 179 45 0.00000000000000e+00 179 81 0.00000000000000e+00 179 80 -1.11111111111111e+01 179 50 -4.86111111111111e+00 179 77 -3.47222222222222e+00 179 185 -9.72222222222222e+00 179 79 -4.36933475511658e-17 179 49 -2.47198095326695e-16 179 76 2.08333333333333e+00 179 184 8.33333333333333e+00 179 78 -6.76542155630955e-17 179 48 -4.16666666666667e+00 179 75 -2.08333333333333e+00 179 183 1.77592315853126e-16 179 95 0.00000000000000e+00 179 182 0.00000000000000e+00 179 17 0.00000000000000e+00 179 71 0.00000000000000e+00 179 94 0.00000000000000e+00 179 181 0.00000000000000e+00 179 16 0.00000000000000e+00 179 70 0.00000000000000e+00 179 93 0.00000000000000e+00 179 180 0.00000000000000e+00 179 15 0.00000000000000e+00 179 69 0.00000000000000e+00 179 47 0.00000000000000e+00 179 92 5.55555555555556e+00 179 176 -1.38888888888889e+00 179 233 1.11111111111111e+01 179 68 -1.11111111111111e+01 179 20 -4.86111111111111e+00 179 65 -3.47222222222222e+00 179 170 -9.72222222222222e+00 179 178 -8.88178419700125e-16 179 91 1.77635683940025e-15 179 175 4.07117915768307e-16 179 232 5.96582245410149e-17 179 67 -2.41126563160776e-16 179 19 1.11022302462516e-16 179 64 -2.08333333333333e+00 179 169 -8.33333333333333e+00 179 177 -8.88178419700125e-16 179 90 -4.92661467177413e-16 179 174 -2.18575157973078e-16 179 231 1.33226762955019e-15 179 66 5.96744875736022e-16 179 18 4.16666666666667e+00 179 63 2.08333333333333e+00 179 168 -7.45931094670027e-17 180 180 1.00000000000000e+00 180 80 0.00000000000000e+00 180 46 0.00000000000000e+00 180 79 0.00000000000000e+00 180 45 0.00000000000000e+00 180 78 0.00000000000000e+00 180 83 0.00000000000000e+00 180 185 0.00000000000000e+00 180 74 0.00000000000000e+00 180 32 0.00000000000000e+00 180 82 0.00000000000000e+00 180 184 0.00000000000000e+00 180 73 0.00000000000000e+00 180 31 0.00000000000000e+00 180 81 0.00000000000000e+00 180 183 0.00000000000000e+00 180 72 0.00000000000000e+00 180 30 0.00000000000000e+00 180 95 0.00000000000000e+00 180 179 0.00000000000000e+00 180 17 0.00000000000000e+00 180 68 0.00000000000000e+00 180 94 0.00000000000000e+00 180 178 0.00000000000000e+00 180 16 0.00000000000000e+00 180 67 0.00000000000000e+00 180 93 0.00000000000000e+00 180 177 0.00000000000000e+00 180 15 0.00000000000000e+00 180 66 0.00000000000000e+00 180 182 0.00000000000000e+00 180 233 0.00000000000000e+00 180 173 0.00000000000000e+00 180 86 0.00000000000000e+00 180 71 0.00000000000000e+00 180 170 0.00000000000000e+00 180 62 0.00000000000000e+00 180 2 0.00000000000000e+00 180 181 0.00000000000000e+00 180 232 0.00000000000000e+00 180 172 0.00000000000000e+00 180 85 0.00000000000000e+00 180 70 0.00000000000000e+00 180 169 0.00000000000000e+00 180 61 0.00000000000000e+00 180 1 0.00000000000000e+00 180 47 0.00000000000000e+00 180 231 0.00000000000000e+00 180 171 0.00000000000000e+00 180 84 0.00000000000000e+00 180 69 0.00000000000000e+00 180 168 0.00000000000000e+00 180 60 0.00000000000000e+00 180 0 0.00000000000000e+00 181 181 1.00000000000000e+00 181 80 0.00000000000000e+00 181 46 0.00000000000000e+00 181 79 0.00000000000000e+00 181 45 0.00000000000000e+00 181 78 0.00000000000000e+00 181 83 0.00000000000000e+00 181 185 0.00000000000000e+00 181 74 0.00000000000000e+00 181 32 0.00000000000000e+00 181 82 0.00000000000000e+00 181 184 0.00000000000000e+00 181 73 0.00000000000000e+00 181 31 0.00000000000000e+00 181 81 0.00000000000000e+00 181 183 0.00000000000000e+00 181 72 0.00000000000000e+00 181 30 0.00000000000000e+00 181 95 0.00000000000000e+00 181 179 0.00000000000000e+00 181 17 0.00000000000000e+00 181 68 0.00000000000000e+00 181 94 0.00000000000000e+00 181 178 0.00000000000000e+00 181 16 0.00000000000000e+00 181 67 0.00000000000000e+00 181 93 0.00000000000000e+00 181 177 0.00000000000000e+00 181 15 0.00000000000000e+00 181 66 0.00000000000000e+00 181 182 0.00000000000000e+00 181 233 0.00000000000000e+00 181 173 0.00000000000000e+00 181 86 0.00000000000000e+00 181 71 0.00000000000000e+00 181 170 0.00000000000000e+00 181 62 0.00000000000000e+00 181 2 0.00000000000000e+00 181 47 0.00000000000000e+00 181 232 0.00000000000000e+00 181 172 0.00000000000000e+00 181 85 0.00000000000000e+00 181 70 0.00000000000000e+00 181 169 0.00000000000000e+00 181 61 0.00000000000000e+00 181 1 0.00000000000000e+00 181 180 0.00000000000000e+00 181 231 0.00000000000000e+00 181 171 0.00000000000000e+00 181 84 0.00000000000000e+00 181 69 0.00000000000000e+00 181 168 0.00000000000000e+00 181 60 0.00000000000000e+00 181 0 0.00000000000000e+00 182 182 1.00000000000000e+00 182 80 0.00000000000000e+00 182 46 0.00000000000000e+00 182 79 0.00000000000000e+00 182 45 0.00000000000000e+00 182 78 0.00000000000000e+00 182 83 0.00000000000000e+00 182 185 0.00000000000000e+00 182 74 0.00000000000000e+00 182 32 0.00000000000000e+00 182 82 0.00000000000000e+00 182 184 0.00000000000000e+00 182 73 0.00000000000000e+00 182 31 0.00000000000000e+00 182 81 0.00000000000000e+00 182 183 0.00000000000000e+00 182 72 0.00000000000000e+00 182 30 0.00000000000000e+00 182 95 0.00000000000000e+00 182 179 0.00000000000000e+00 182 17 0.00000000000000e+00 182 68 0.00000000000000e+00 182 94 0.00000000000000e+00 182 178 0.00000000000000e+00 182 16 0.00000000000000e+00 182 67 0.00000000000000e+00 182 93 0.00000000000000e+00 182 177 0.00000000000000e+00 182 15 0.00000000000000e+00 182 66 0.00000000000000e+00 182 47 0.00000000000000e+00 182 233 0.00000000000000e+00 182 173 0.00000000000000e+00 182 86 0.00000000000000e+00 182 71 0.00000000000000e+00 182 170 0.00000000000000e+00 182 62 0.00000000000000e+00 182 2 0.00000000000000e+00 182 181 0.00000000000000e+00 182 232 0.00000000000000e+00 182 172 0.00000000000000e+00 182 85 0.00000000000000e+00 182 70 0.00000000000000e+00 182 169 0.00000000000000e+00 182 61 0.00000000000000e+00 182 1 0.00000000000000e+00 182 180 0.00000000000000e+00 182 231 0.00000000000000e+00 182 171 0.00000000000000e+00 182 84 0.00000000000000e+00 182 69 0.00000000000000e+00 182 168 0.00000000000000e+00 182 60 0.00000000000000e+00 182 0 0.00000000000000e+00 183 183 5.55555555555556e+01 183 95 0.00000000000000e+00 183 46 0.00000000000000e+00 183 94 0.00000000000000e+00 183 45 0.00000000000000e+00 183 93 0.00000000000000e+00 183 80 8.88178419700125e-16 183 50 7.45931094670027e-17 183 179 1.78459677591114e-16 183 92 2.08333333333333e+00 183 79 2.77555756156289e-17 183 49 -4.16666666666667e+00 183 178 1.45716771982052e-16 183 91 -2.08333333333333e+00 183 78 5.55555555555556e+00 183 48 -4.86111111111111e+00 183 177 -1.38888888888889e+00 183 90 -3.47222222222222e+00 183 77 -2.01011082778813e-16 183 35 -1.56125112837913e-17 183 176 8.33333333333333e+00 183 89 2.08333333333333e+00 183 76 -4.28476698566271e-16 183 34 4.16666666666667e+00 183 175 -1.31080042653497e-16 183 88 2.08333333333333e+00 183 75 -1.11111111111111e+01 183 33 -4.86111111111111e+00 183 174 -9.72222222222223e+00 183 87 -3.47222222222222e+00 183 83 0.00000000000000e+00 183 185 -1.77635683940025e-15 183 74 8.88178419700125e-16 183 32 0.00000000000000e+00 183 182 0.00000000000000e+00 183 233 3.63519435907234e-16 183 173 1.75966012594397e-16 183 86 0.00000000000000e+00 183 82 0.00000000000000e+00 183 184 0.00000000000000e+00 183 73 1.38777878078145e-16 183 31 0.00000000000000e+00 183 181 0.00000000000000e+00 183 232 4.44089209850063e-16 183 172 7.67615138119737e-17 183 85 0.00000000000000e+00 183 81 0.00000000000000e+00 183 47 0.00000000000000e+00 183 72 5.55555555555556e+00 183 30 0.00000000000000e+00 183 180 0.00000000000000e+00 183 231 1.11111111111111e+01 183 171 -1.38888888888889e+00 183 84 0.00000000000000e+00 184 184 5.55555555555556e+01 184 95 0.00000000000000e+00 184 46 0.00000000000000e+00 184 94 0.00000000000000e+00 184 45 0.00000000000000e+00 184 93 0.00000000000000e+00 184 80 1.32381085260480e-16 184 50 1.30971622436249e-16 184 179 8.33333333333333e+00 184 92 2.08333333333333e+00 184 79 -1.11111111111111e+01 184 49 -4.86111111111111e+00 184 178 -9.72222222222223e+00 184 91 -3.47222222222222e+00 184 78 1.38777878078145e-16 184 48 -4.16666666666667e+00 184 177 7.83878170707020e-17 184 90 -2.08333333333333e+00 184 77 4.44089209850063e-16 184 35 1.94289029309402e-16 184 176 2.34838190560360e-16 184 89 -2.08333333333333e+00 184 76 5.55555555555556e+00 184 34 -4.86111111111111e+00 184 175 -1.38888888888889e+00 184 88 -3.47222222222222e+00 184 75 -3.95516952522712e-16 184 33 4.16666666666667e+00 184 174 -1.11022302462516e-16 184 87 2.08333333333333e+00 184 83 0.00000000000000e+00 184 185 -8.88178419700125e-16 184 74 -2.31585584042904e-16 184 32 0.00000000000000e+00 184 182 0.00000000000000e+00 184 233 9.55046588688169e-17 184 173 -8.33333333333333e+00 184 86 0.00000000000000e+00 184 82 0.00000000000000e+00 184 47 0.00000000000000e+00 184 73 -1.11111111111111e+01 184 31 0.00000000000000e+00 184 181 0.00000000000000e+00 184 232 1.11111111111111e+01 184 172 -9.72222222222223e+00 184 85 0.00000000000000e+00 184 81 0.00000000000000e+00 184 183 8.88178419700125e-16 184 72 2.77555756156289e-17 184 30 0.00000000000000e+00 184 180 0.00000000000000e+00 184 231 8.88178419700125e-16 184 171 3.38271077815477e-17 184 84 0.00000000000000e+00 185 185 5.55555555555556e+01 185 95 0.00000000000000e+00 185 46 0.00000000000000e+00 185 94 0.00000000000000e+00 185 45 0.00000000000000e+00 185 93 0.00000000000000e+00 185 80 5.55555555555556e+00 185 50 -6.94444444444445e-01 185 179 -9.72222222222222e+00 185 92 -3.47222222222222e+00 185 79 3.23525928269675e-16 185 49 9.02056207507940e-17 185 178 8.33333333333333e+00 185 91 2.08333333333333e+00 185 78 8.88178419700125e-16 185 48 6.93889390390723e-18 185 177 3.72965547335014e-17 185 90 2.08333333333333e+00 185 77 5.55555555555556e+00 185 35 -6.94444444444444e-01 185 176 -9.72222222222222e+00 185 89 -3.47222222222222e+00 185 76 4.44089209850063e-16 185 34 2.10768902331182e-16 185 175 2.61943244872498e-16 185 88 -2.08333333333333e+00 185 75 -1.99493199737333e-16 185 33 -1.11022302462516e-16 185 174 8.33333333333333e+00 185 87 2.08333333333333e+00 185 83 0.00000000000000e+00 185 47 0.00000000000000e+00 185 74 5.55555555555556e+00 185 32 0.00000000000000e+00 185 182 0.00000000000000e+00 185 233 -2.22222222222222e+01 185 173 -9.72222222222222e+00 185 86 0.00000000000000e+00 185 82 0.00000000000000e+00 185 184 -8.88178419700125e-16 185 73 -2.07733136248223e-16 185 31 0.00000000000000e+00 185 181 0.00000000000000e+00 185 232 2.50559122061400e-16 185 172 -8.33333333333333e+00 185 85 0.00000000000000e+00 185 81 0.00000000000000e+00 185 183 -1.77635683940025e-15 185 72 8.88178419700125e-16 185 30 0.00000000000000e+00 185 180 0.00000000000000e+00 185 231 5.58364118830035e-16 185 171 3.64291929955129e-17 185 84 0.00000000000000e+00 186 186 5.55555555555556e+01 186 20 -9.28077059647592e-17 186 91 2.08333333333333e+00 186 19 4.16666666666666e+00 186 90 -3.47222222222222e+00 186 18 -4.86111111111111e+00 186 197 8.76035355368288e-17 186 119 -2.08333333333333e+00 186 104 4.44089209850063e-16 186 23 -1.90819582357449e-17 186 196 -5.11743425413158e-17 186 118 -2.08333333333333e+00 186 103 1.86591193884755e-16 186 22 -4.16666666666667e+00 186 195 -1.38888888888889e+00 186 117 -3.47222222222222e+00 186 102 5.55555555555556e+00 186 21 -4.86111111111111e+00 186 194 -8.33333333333333e+00 186 116 -2.08333333333333e+00 186 101 -1.53173372423321e-15 186 8 -1.33573707650214e-16 186 193 -1.11889664200504e-16 186 115 2.08333333333333e+00 186 100 -4.79623936053275e-16 186 7 4.16666666666666e+00 186 192 -9.72222222222223e+00 186 114 -3.47222222222222e+00 186 99 -1.11111111111111e+01 186 6 -4.86111111111111e+00 186 176 8.33333333333333e+00 186 236 6.80987384538145e-16 186 191 1.98625837999344e-16 186 89 2.08333333333333e+00 186 65 -1.35525271560688e-16 186 188 3.55271367880050e-15 186 98 4.44089209850063e-16 186 5 1.64798730217797e-17 186 175 7.80625564189563e-18 186 235 4.44089209850063e-16 186 190 7.52436307704940e-17 186 88 -2.08333333333333e+00 186 64 3.11274443720588e-16 186 187 -1.77635683940025e-15 186 97 -3.86111498676400e-17 186 4 -4.16666666666667e+00 186 174 -9.72222222222223e+00 186 234 1.11111111111111e+01 186 189 -1.38888888888889e+00 186 87 -3.47222222222222e+00 186 63 -1.11111111111111e+01 186 92 2.08333333333333e+00 186 96 5.55555555555556e+00 186 3 -4.86111111111111e+00 187 187 5.55555555555556e+01 187 20 2.07407875596477e-16 187 91 -3.47222222222222e+00 187 19 -4.86111111111111e+00 187 90 2.08333333333333e+00 187 18 4.16666666666667e+00 187 197 -8.33333333333333e+00 187 119 -2.08333333333333e+00 187 104 3.51715184754298e-16 187 23 -4.07660016854550e-16 187 196 -9.72222222222223e+00 187 118 -3.47222222222222e+00 187 103 -1.11111111111111e+01 187 22 -4.86111111111111e+00 187 195 4.07660016854550e-17 187 117 -2.08333333333333e+00 187 102 1.69000013636178e-17 187 21 -4.16666666666667e+00 187 194 1.05818132034585e-16 187 116 2.08333333333333e+00 187 101 1.77635683940025e-15 187 8 4.90059381963448e-16 187 193 -1.38888888888889e+00 187 115 -3.47222222222222e+00 187 100 5.55555555555556e+00 187 7 -4.86111111111111e+00 187 192 -2.16840434497101e-17 187 114 2.08333333333333e+00 187 99 -4.26850395307543e-16 187 6 4.16666666666667e+00 187 176 -1.88217497143484e-16 187 236 -8.84708972748172e-17 187 191 8.33333333333333e+00 187 89 2.08333333333333e+00 187 65 1.77635683940025e-15 187 188 -3.55271367880050e-15 187 98 5.04804531509251e-16 187 5 1.09287578986539e-16 187 175 -1.38888888888889e+00 187 235 1.11111111111111e+01 187 190 -9.72222222222223e+00 187 88 -3.47222222222222e+00 187 64 5.55555555555556e+00 187 92 -2.08333333333333e+00 187 97 -1.11111111111111e+01 187 4 -4.86111111111111e+00 187 174 6.41847686111419e-17 187 234 8.88178419700125e-16 187 189 -9.54097911787244e-18 187 87 -2.08333333333333e+00 187 63 3.65511657399176e-16 187 186 -2.66453525910038e-15 187 96 7.20994444702860e-17 187 3 -4.16666666666667e+00 188 188 5.55555555555556e+01 188 20 -6.94444444444444e-01 188 91 -2.08333333333333e+00 188 19 1.63064006741820e-16 188 90 2.08333333333333e+00 188 18 -1.07010754424319e-16 188 197 -9.72222222222222e+00 188 119 -3.47222222222222e+00 188 104 5.55555555555556e+00 188 23 -6.94444444444444e-01 188 196 -8.33333333333334e+00 188 118 -2.08333333333333e+00 188 103 6.92154666914746e-16 188 22 -5.08273978461204e-16 188 195 1.67400815431762e-16 188 117 -2.08333333333333e+00 188 102 4.44089209850063e-16 188 21 6.07153216591882e-18 188 194 -9.72222222222222e+00 188 116 -3.47222222222222e+00 188 101 5.55555555555555e+00 188 8 -6.94444444444444e-01 188 193 2.62810606610486e-16 188 115 2.08333333333333e+00 188 100 1.33226762955019e-15 188 7 5.15863393668603e-16 188 192 -8.33333333333333e+00 188 114 -2.08333333333333e+00 188 99 -1.76952636571359e-15 188 6 -1.24900090270330e-16 188 176 -9.72222222222222e+00 188 236 -2.22222222222222e+01 188 191 -9.72222222222222e+00 188 89 -3.47222222222222e+00 188 65 5.55555555555556e+00 188 92 -3.47222222222222e+00 188 98 5.55555555555556e+00 188 5 -6.94444444444443e-01 188 175 -3.03793448730438e-16 188 235 1.68051336735253e-16 188 190 8.33333333333333e+00 188 88 2.08333333333333e+00 188 64 1.77635683940025e-15 188 187 -3.55271367880050e-15 188 97 1.36609473733174e-16 188 4 1.25116930704827e-16 188 174 8.33333333333333e+00 188 234 4.06779102589405e-16 188 189 5.71374544899861e-17 188 87 2.08333333333333e+00 188 63 -1.00302253482065e-16 188 186 3.55271367880050e-15 188 96 4.44089209850063e-16 188 3 -2.72134745293862e-17 189 189 5.55555555555556e+01 189 38 -4.16666666666667e+00 189 109 -2.08333333333333e+00 189 37 -2.68882138776405e-17 189 108 -3.47222222222222e+00 189 36 -4.86111111111112e+00 189 77 2.08333333333333e+00 189 200 1.98625837999344e-16 189 107 3.96492734477949e-16 189 35 4.16666666666667e+00 189 76 2.08333333333333e+00 189 199 -3.72965547335014e-17 189 106 -4.44089209850063e-16 189 34 4.25007251614318e-17 189 75 -3.47222222222222e+00 189 198 -1.38888888888889e+00 189 105 5.55555555555556e+00 189 33 -4.86111111111111e+00 189 194 -1.95156391047391e-16 189 116 -2.01734787728947e-15 189 101 2.08333333333333e+00 189 8 4.16666666666666e+00 189 193 -8.33333333333333e+00 189 115 -4.62493541728004e-16 189 100 -2.08333333333333e+00 189 7 -5.55111512312578e-17 189 192 -9.72222222222222e+00 189 114 -1.11111111111111e+01 189 99 -3.47222222222222e+00 189 6 -4.86111111111111e+00 189 176 1.15359111152458e-16 189 236 1.77635683940025e-15 189 191 2.66453525910038e-15 189 89 2.79073639197769e-16 189 65 -2.08333333333333e+00 189 188 1.67292395214513e-16 189 98 4.24898831397069e-16 189 5 -4.16666666666667e+00 189 175 8.33333333333333e+00 189 235 3.60063541482436e-16 189 190 8.88178419700125e-16 189 88 4.80409982628327e-16 189 64 2.08333333333333e+00 189 187 4.33680868994202e-18 189 97 0.00000000000000e+00 189 4 4.16333634234434e-17 189 174 -9.72222222222222e+00 189 234 1.11111111111111e+01 189 110 -2.08333333333333e+00 189 87 -1.11111111111111e+01 189 63 -3.47222222222222e+00 189 186 -1.38888888888889e+00 189 96 5.55555555555556e+00 189 3 -4.86111111111111e+00 190 190 5.55555555555556e+01 190 38 1.61329283265843e-16 190 109 -3.47222222222222e+00 190 37 -6.94444444444446e-01 190 108 -2.08333333333333e+00 190 36 6.07153216591882e-18 190 77 -2.08333333333333e+00 190 200 -8.33333333333333e+00 190 107 1.18481613409216e-15 190 35 -2.16840434497101e-17 190 76 -3.47222222222222e+00 190 199 -9.72222222222223e+00 190 106 5.55555555555556e+00 190 34 -6.94444444444445e-01 190 75 2.08333333333333e+00 190 198 4.07660016854550e-17 190 105 0.00000000000000e+00 190 33 1.38777878078145e-17 190 194 -1.05644659686988e-15 190 116 4.44089209850063e-16 190 101 2.08333333333333e+00 190 8 8.57603918436034e-17 190 193 -9.72222222222222e+00 190 115 5.55555555555556e+00 190 100 -3.47222222222222e+00 190 7 -6.94444444444444e-01 190 192 -8.33333333333333e+00 190 114 -5.42209506460001e-16 190 99 -2.08333333333333e+00 190 6 -2.08166817117217e-17 190 176 2.66280053562440e-16 190 236 -2.80496654549156e-16 190 191 -8.88178419700125e-16 190 89 8.88178419700125e-16 190 65 2.08333333333333e+00 190 188 8.33333333333333e+00 190 98 5.50354575280798e-16 190 5 2.53594888144359e-16 190 175 -9.72222222222222e+00 190 235 -2.22222222222222e+01 190 110 -2.08333333333333e+00 190 88 5.55555555555556e+00 190 64 -3.47222222222222e+00 190 187 -9.72222222222223e+00 190 97 5.55555555555556e+00 190 4 -6.94444444444444e-01 190 174 8.33333333333333e+00 190 234 1.51435938441913e-16 190 189 0.00000000000000e+00 190 87 2.64247174489030e-16 190 63 2.08333333333333e+00 190 186 7.52436307704940e-17 190 96 0.00000000000000e+00 190 3 3.20923843055709e-17 191 191 5.55555555555556e+01 191 38 -4.86111111111111e+00 191 109 -2.08333333333333e+00 191 37 1.68268177169750e-16 191 108 -2.08333333333333e+00 191 36 -4.16666666666667e+00 191 77 -3.47222222222222e+00 191 200 -9.72222222222222e+00 191 107 -1.11111111111111e+01 191 35 -4.86111111111111e+00 191 76 -2.08333333333333e+00 191 199 -8.33333333333334e+00 191 106 5.78110150896427e-16 191 34 -1.23599047663348e-17 191 75 2.08333333333333e+00 191 198 1.67400815431762e-16 191 105 3.69387680165811e-16 191 33 4.16666666666667e+00 191 194 -1.38888888888889e+00 191 116 5.55555555555556e+00 191 101 -3.47222222222222e+00 191 8 -4.86111111111111e+00 191 193 -1.23685783837146e-15 191 115 0.00000000000000e+00 191 100 2.08333333333333e+00 191 7 2.92300905702092e-16 191 192 -1.88217497143484e-16 191 114 -2.13121621045476e-15 191 99 2.08333333333333e+00 191 6 4.16666666666667e+00 191 176 -1.38888888888889e+00 191 236 1.11111111111111e+01 191 110 -3.47222222222222e+00 191 89 5.55555555555556e+00 191 65 -3.47222222222222e+00 191 188 -9.72222222222222e+00 191 98 -1.11111111111111e+01 191 5 -4.86111111111111e+00 191 175 1.97758476261356e-16 191 235 8.67361737988404e-18 191 190 -8.88178419700125e-16 191 88 8.88178419700125e-16 191 64 2.08333333333333e+00 191 187 8.33333333333333e+00 191 97 1.12236608895699e-15 191 4 3.69496100383060e-16 191 174 -5.52943107967607e-18 191 234 1.77635683940025e-15 191 189 2.66453525910038e-15 191 87 4.01019278548076e-16 191 63 -2.08333333333333e+00 191 186 1.36175792864179e-16 191 96 2.86337793753422e-16 191 3 -4.16666666666667e+00 192 192 1.11111111111111e+02 192 136 -2.08333333333333e+00 192 135 -3.47222222222222e+00 192 215 -8.33333333333333e+00 192 131 -2.08333333333333e+00 192 214 -2.31477163825655e-16 192 130 2.08333333333333e+00 192 213 -9.72222222222223e+00 192 129 -3.47222222222222e+00 192 212 -2.26923514701216e-16 192 128 2.08333333333333e+00 192 211 -8.33333333333333e+00 192 127 -2.08333333333333e+00 192 210 -9.72222222222222e+00 192 126 -3.47222222222222e+00 192 239 -2.47267213215191e-15 192 206 -5.04479270857505e-16 192 203 8.33333333333333e+00 192 122 2.08333333333333e+00 192 238 -4.56313589344837e-16 192 205 8.33333333333333e+00 192 202 -2.60967462917261e-16 192 121 2.08333333333333e+00 192 237 -2.22222222222222e+01 192 204 -9.72222222222222e+00 192 201 -9.72222222222223e+00 192 120 -3.47222222222222e+00 192 113 2.08333333333333e+00 192 53 4.02455846426619e-16 192 112 2.08333333333333e+00 192 52 2.40259201422788e-16 192 111 -3.47222222222222e+00 192 51 -1.38888888888889e+00 192 200 8.33333333333333e+00 192 110 1.29193530873373e-15 192 38 4.57966997657877e-16 192 107 2.08333333333333e+00 192 199 -6.33174068731535e-17 192 109 8.88178419700125e-16 192 37 1.45283091113058e-16 192 106 -2.08333333333333e+00 192 198 -9.72222222222223e+00 192 108 1.11111111111111e+01 192 36 -1.38888888888889e+00 192 105 -3.47222222222222e+00 192 197 -3.02709246557953e-16 192 119 2.22044604925031e-15 192 104 -2.08333333333333e+00 192 23 3.33934269125535e-16 192 196 8.33333333333333e+00 192 118 7.99815942642557e-16 192 103 2.08333333333333e+00 192 22 1.16226472890446e-16 192 195 -9.72222222222222e+00 192 117 1.11111111111111e+01 192 102 -3.47222222222222e+00 192 21 -1.38888888888889e+00 192 236 -3.12683906544819e-15 192 194 7.99360577730113e-15 192 116 1.77635683940025e-15 192 191 -1.91686944095437e-16 192 188 -8.33333333333333e+00 192 101 1.05885894670366e-15 192 8 3.33283747822044e-16 192 98 -2.08333333333333e+00 192 235 -1.10154940724527e-15 192 193 0.00000000000000e+00 192 115 7.43613612526339e-16 192 190 -8.33333333333333e+00 192 187 6.07153216591882e-18 192 100 8.88178419700125e-16 192 7 1.70761842166467e-16 192 97 -2.08333333333333e+00 192 234 -2.22222222222222e+01 192 137 -2.08333333333333e+00 192 114 1.11111111111111e+01 192 189 -9.72222222222222e+00 192 186 -9.72222222222223e+00 192 99 1.11111111111111e+01 192 6 -1.38888888888889e+00 192 96 -3.47222222222222e+00 193 193 1.11111111111111e+02 193 136 -3.47222222222222e+00 193 135 -2.08333333333333e+00 193 215 -2.81025203108243e-16 193 131 2.08333333333333e+00 193 214 -1.38888888888889e+00 193 130 -3.47222222222222e+00 193 213 -1.59594559789866e-16 193 129 2.08333333333333e+00 193 212 -8.19656842399041e-17 193 128 2.08333333333333e+00 193 211 -9.72222222222222e+00 193 127 -3.47222222222222e+00 193 210 -8.33333333333333e+00 193 126 -2.08333333333333e+00 193 239 1.77635683940025e-15 193 206 1.53089346754953e-15 193 203 1.13949648328227e-16 193 122 -2.08333333333333e+00 193 238 1.11111111111111e+01 193 205 -9.72222222222222e+00 193 202 -1.38888888888889e+00 193 121 -3.47222222222222e+00 193 237 -1.00505541389406e-16 193 204 8.33333333333333e+00 193 201 -1.86482773667507e-16 193 120 2.08333333333333e+00 193 113 -2.08333333333333e+00 193 53 -8.33333333333333e+00 193 112 -3.47222222222222e+00 193 52 -9.72222222222223e+00 193 111 2.08333333333333e+00 193 51 1.56775634141404e-16 193 200 4.51895465491958e-16 193 110 5.54460991009087e-16 193 38 8.33333333333333e+00 193 107 2.08333333333333e+00 193 116 9.97791259338410e-16 193 199 -1.38888888888889e+00 193 109 1.11111111111111e+01 193 37 -9.72222222222223e+00 193 106 -3.47222222222222e+00 193 198 -1.27393755267047e-16 193 108 8.88178419700125e-16 193 36 1.16226472890446e-16 193 105 -2.08333333333333e+00 193 197 8.77444818192519e-16 193 119 1.17824315842147e-15 193 104 2.08333333333333e+00 193 23 8.33333333333333e+00 193 196 -9.72222222222222e+00 193 118 -2.22222222222222e+01 193 103 -3.47222222222222e+00 193 22 -9.72222222222223e+00 193 195 8.33333333333333e+00 193 117 5.18099560649354e-16 193 102 2.08333333333333e+00 193 21 1.43765208071578e-16 193 236 3.10862446895044e-15 193 194 -5.32907051820075e-15 193 191 -1.21604115665974e-15 193 188 2.61943244872498e-16 193 101 2.77623518792069e-16 193 8 -8.33333333333333e+00 193 98 -2.08333333333333e+00 193 235 1.11111111111111e+01 193 137 -2.08333333333333e+00 193 115 -2.22222222222222e+01 193 190 -9.72222222222222e+00 193 187 -1.38888888888889e+00 193 100 1.11111111111111e+01 193 7 -9.72222222222223e+00 193 97 -3.47222222222222e+00 193 234 -9.50276099129232e-16 193 192 0.00000000000000e+00 193 114 7.99815942642557e-16 193 189 -8.33333333333333e+00 193 186 -1.13624387676481e-16 193 99 8.88178419700125e-16 193 6 2.27248775352962e-16 193 96 -2.08333333333333e+00 194 194 1.11111111111111e+02 194 136 -2.08333333333333e+00 194 135 -2.08333333333333e+00 194 215 -9.72222222222222e+00 194 131 -3.47222222222222e+00 194 214 -2.21502503838789e-16 194 130 2.08333333333333e+00 194 213 -8.33333333333333e+00 194 129 -2.08333333333333e+00 194 212 -1.38888888888889e+00 194 128 -3.47222222222222e+00 194 211 -1.47451495458029e-16 194 127 2.08333333333333e+00 194 210 -1.99493199737333e-16 194 126 2.08333333333333e+00 194 239 1.11111111111111e+01 194 206 -1.38888888888889e+00 194 203 -9.72222222222222e+00 194 122 -3.47222222222222e+00 194 238 1.33226762955019e-15 194 205 1.41293227118311e-15 194 202 1.13624387676481e-16 194 121 -2.08333333333333e+00 194 237 -2.57259491487360e-15 194 204 -4.55364912443912e-16 194 201 8.33333333333333e+00 194 120 2.08333333333333e+00 194 113 -3.47222222222222e+00 194 53 -9.72222222222222e+00 194 112 -2.08333333333333e+00 194 52 -8.33333333333333e+00 194 111 2.08333333333333e+00 194 51 1.52764086103208e-16 194 200 -9.72222222222222e+00 194 110 -2.22222222222222e+01 194 38 -9.72222222222222e+00 194 107 -3.47222222222222e+00 194 199 3.96167473826203e-16 194 109 2.98548620721040e-16 194 37 8.33333333333333e+00 194 106 2.08333333333333e+00 194 198 8.33333333333333e+00 194 108 1.00410673699314e-15 194 36 1.52764086103208e-16 194 105 2.08333333333333e+00 194 197 -1.38888888888889e+00 194 119 1.11111111111111e+01 194 104 -3.47222222222222e+00 194 23 -9.72222222222222e+00 194 196 8.43942971062717e-16 194 118 1.47657493870801e-15 194 103 2.08333333333333e+00 194 22 8.33333333333333e+00 194 195 -3.96275894043452e-16 194 117 2.22044604925031e-15 194 102 -2.08333333333333e+00 194 21 4.30211422042248e-16 194 236 1.11111111111111e+01 194 137 -3.47222222222222e+00 194 116 1.11111111111111e+01 194 191 -1.38888888888889e+00 194 188 -9.72222222222222e+00 194 101 -2.22222222222222e+01 194 8 -9.72222222222222e+00 194 98 -3.47222222222222e+00 194 235 3.55271367880050e-15 194 193 -5.32907051820075e-15 194 115 6.16084331987732e-16 194 190 -1.08506953422349e-15 194 187 8.50014503228635e-17 194 100 4.50377582450479e-16 194 7 -8.33333333333333e+00 194 97 -2.08333333333333e+00 194 234 -3.15164019014380e-15 194 192 7.99360577730113e-15 194 114 1.77635683940025e-15 194 189 -2.20309881449055e-16 194 186 -8.33333333333333e+00 194 99 1.54162706905714e-15 194 6 5.96744875736022e-16 194 96 -2.08333333333333e+00 195 195 5.55555555555556e+01 195 77 2.08333333333333e+00 195 49 -4.85722573273506e-17 195 76 -2.08333333333333e+00 195 48 -4.86111111111111e+00 195 75 -3.47222222222222e+00 195 113 2.84494650060196e-16 195 53 -4.16666666666667e+00 195 110 -2.08333333333333e+00 195 200 1.43114686768087e-16 195 112 8.88178419700125e-16 195 52 -8.41340885848751e-17 195 109 2.08333333333333e+00 195 199 7.60025722912339e-17 195 111 5.55555555555556e+00 195 51 -4.86111111111111e+00 195 108 -3.47222222222222e+00 195 198 -1.38888888888889e+00 195 92 -2.77555756156289e-16 195 176 2.52402265754625e-16 195 20 -4.16666666666667e+00 195 65 -2.08333333333333e+00 195 91 1.12757025938492e-16 195 175 -8.33333333333333e+00 195 19 -3.46944695195361e-17 195 64 -2.08333333333333e+00 195 90 -1.11111111111111e+01 195 174 -9.72222222222222e+00 195 18 -4.86111111111111e+00 195 63 -3.47222222222222e+00 195 197 1.77635683940025e-15 195 119 -1.07899800205757e-15 195 194 -3.65159291693118e-16 195 236 1.77635683940025e-15 195 104 3.72965547335014e-17 195 23 4.16666666666667e+00 195 101 2.08333333333333e+00 195 188 5.71374544899861e-17 195 196 -1.77635683940025e-15 195 118 -5.99021700298241e-16 195 193 8.33333333333333e+00 195 235 -2.20364091557679e-17 195 103 8.88178419700125e-16 195 22 -4.42354486374086e-17 195 100 2.08333333333333e+00 195 187 1.29020058525775e-17 195 50 4.16666666666667e+00 195 117 -1.11111111111111e+01 195 192 -9.72222222222222e+00 195 234 1.11111111111111e+01 195 102 5.55555555555556e+00 195 21 -4.86111111111111e+00 195 99 -3.47222222222222e+00 195 186 -1.38888888888889e+00 196 196 5.55555555555556e+01 196 77 2.08333333333333e+00 196 49 -6.94444444444444e-01 196 76 -3.47222222222222e+00 196 48 2.94902990916057e-17 196 75 -2.08333333333333e+00 196 113 -7.73686670285656e-16 196 53 -5.55111512312578e-17 196 110 2.08333333333333e+00 196 200 8.33333333333333e+00 196 112 5.55555555555556e+00 196 52 -6.94444444444445e-01 196 109 -3.47222222222222e+00 196 199 -9.72222222222223e+00 196 111 8.88178419700125e-16 196 51 -2.77555756156289e-17 196 108 2.08333333333333e+00 196 198 -9.54097911787244e-18 196 92 1.33226762955019e-15 196 176 1.43982048506075e-16 196 20 9.71445146547012e-17 196 65 -2.08333333333333e+00 196 91 5.55555555555556e+00 196 175 -9.72222222222222e+00 196 19 -6.94444444444445e-01 196 64 -3.47222222222222e+00 196 90 5.25512793003724e-16 196 174 -8.33333333333333e+00 196 18 6.41847686111419e-17 196 63 -2.08333333333333e+00 196 197 0.00000000000000e+00 196 119 3.10862446895044e-15 196 194 8.43942971062717e-16 196 236 5.08273978461204e-16 196 104 -4.54280710271426e-16 196 23 3.09648140461860e-16 196 101 -2.08333333333333e+00 196 188 -8.33333333333334e+00 196 50 -1.66533453693773e-16 196 118 5.55555555555556e+00 196 193 -9.72222222222222e+00 196 235 -2.22222222222222e+01 196 103 5.55555555555556e+00 196 22 -6.94444444444444e-01 196 100 -3.47222222222222e+00 196 187 -9.72222222222223e+00 196 195 -1.77635683940025e-15 196 117 -5.06539254985228e-16 196 192 8.33333333333333e+00 196 234 1.27610595701544e-16 196 102 8.88178419700125e-16 196 21 -2.77555756156289e-17 196 99 2.08333333333333e+00 196 186 -5.11743425413158e-17 197 197 5.55555555555556e+01 197 77 -3.47222222222222e+00 197 49 -1.79543879763600e-16 197 76 2.08333333333333e+00 197 48 4.16666666666667e+00 197 75 2.08333333333333e+00 197 113 -1.11111111111111e+01 197 53 -4.86111111111111e+00 197 110 -3.47222222222222e+00 197 200 -9.72222222222222e+00 197 112 -3.39680540639709e-16 197 52 9.54097911787244e-17 197 109 2.08333333333333e+00 197 199 8.33333333333333e+00 197 111 2.59341159658533e-16 197 51 -4.16666666666667e+00 197 108 -2.08333333333333e+00 197 198 5.78963960107259e-17 197 92 5.55555555555556e+00 197 176 -1.38888888888889e+00 197 20 -4.86111111111111e+00 197 65 -3.47222222222222e+00 197 91 1.77635683940025e-15 197 175 1.45933612416549e-16 197 19 1.11022302462516e-16 197 64 -2.08333333333333e+00 197 90 -4.02455846426619e-16 197 174 1.57642995879392e-16 197 18 -4.16666666666667e+00 197 63 -2.08333333333333e+00 197 50 -4.86111111111111e+00 197 119 5.55555555555556e+00 197 194 -1.38888888888889e+00 197 236 1.11111111111111e+01 197 104 -1.11111111111111e+01 197 23 -4.86111111111111e+00 197 101 -3.47222222222222e+00 197 188 -9.72222222222222e+00 197 196 -1.77635683940025e-15 197 118 2.66453525910038e-15 197 193 9.91936567606988e-16 197 235 2.85131618836532e-16 197 103 -8.29197821516914e-16 197 22 2.98372437868011e-16 197 100 -2.08333333333333e+00 197 187 -8.33333333333333e+00 197 195 1.77635683940025e-15 197 117 -1.06165076729781e-15 197 192 -3.19189119579733e-16 197 234 1.77635683940025e-15 197 102 2.22044604925031e-16 197 21 4.16666666666667e+00 197 99 2.08333333333333e+00 197 186 -2.34187669256869e-17 198 198 5.55555555555556e+01 198 92 -2.08333333333333e+00 198 49 4.16666666666667e+00 198 91 2.08333333333333e+00 198 48 -4.86111111111111e+00 198 90 -3.47222222222222e+00 198 113 1.33226762955019e-15 198 53 -8.67361737988404e-18 198 197 1.68051336735253e-16 198 119 2.08333333333333e+00 198 112 1.73472347597681e-16 198 52 -4.16666666666667e+00 198 196 4.33680868994202e-18 198 118 -2.08333333333333e+00 198 111 5.55555555555555e+00 198 51 -4.86111111111111e+00 198 195 -1.38888888888889e+00 198 117 -3.47222222222222e+00 198 110 -1.62001488612784e-15 198 38 -1.20563281580388e-16 198 194 8.33333333333333e+00 198 116 2.08333333333333e+00 198 109 -5.79397640976254e-16 198 37 4.16666666666667e+00 198 193 -1.20563281580388e-16 198 115 2.08333333333333e+00 198 108 -1.11111111111111e+01 198 36 -4.86111111111111e+00 198 192 -9.72222222222223e+00 198 114 -3.47222222222222e+00 198 77 -8.58688120608520e-17 198 200 0.00000000000000e+00 198 107 1.33226762955019e-15 198 35 1.38777878078145e-17 198 176 -8.33333333333333e+00 198 236 2.95756800126890e-16 198 191 1.68159756952502e-16 198 89 -2.08333333333333e+00 198 76 2.84494650060196e-16 198 199 8.88178419700125e-16 198 106 1.64798730217797e-17 198 34 -4.16666666666667e+00 198 175 1.38777878078145e-17 198 235 8.88178419700125e-16 198 190 2.67797936603920e-17 198 88 -2.08333333333333e+00 198 75 -1.11111111111111e+01 198 50 -1.24900090270330e-16 198 105 5.55555555555555e+00 198 33 -4.86111111111111e+00 198 174 -9.72222222222223e+00 198 234 1.11111111111111e+01 198 189 -1.38888888888889e+00 198 87 -3.47222222222222e+00 199 199 5.55555555555556e+01 199 92 2.08333333333333e+00 199 49 -4.86111111111111e+00 199 91 -3.47222222222222e+00 199 48 4.16666666666667e+00 199 90 2.08333333333333e+00 199 113 -1.73255507163184e-16 199 53 -5.36896915814822e-16 199 197 8.33333333333333e+00 199 119 2.08333333333333e+00 199 112 -1.11111111111111e+01 199 52 -4.86111111111111e+00 199 196 -9.72222222222223e+00 199 118 -3.47222222222222e+00 199 111 1.34441069388203e-16 199 51 -4.16666666666667e+00 199 195 7.60025722912339e-17 199 117 -2.08333333333333e+00 199 110 2.22044604925031e-15 199 38 2.98372437868011e-16 199 194 3.96167473826203e-16 199 116 -2.08333333333333e+00 199 109 5.55555555555556e+00 199 37 -4.86111111111111e+00 199 193 -1.38888888888889e+00 199 115 -3.47222222222222e+00 199 108 -6.17561557447743e-16 199 36 4.16666666666667e+00 199 192 -6.24500451351651e-17 199 114 2.08333333333333e+00 199 77 4.44089209850063e-16 199 200 2.66453525910038e-15 199 107 -5.51642065360625e-16 199 35 3.46944695195361e-17 199 176 3.50630982581812e-16 199 236 1.02240264865383e-16 199 191 -8.33333333333334e+00 199 89 -2.08333333333333e+00 199 76 5.55555555555556e+00 199 50 1.74339709335669e-16 199 106 -1.11111111111111e+01 199 34 -4.86111111111111e+00 199 175 -1.38888888888889e+00 199 235 1.11111111111111e+01 199 190 -9.72222222222223e+00 199 88 -3.47222222222222e+00 199 75 4.26741975090295e-16 199 198 8.88178419700125e-16 199 105 5.55111512312578e-17 199 33 -4.16666666666667e+00 199 174 9.80118763926896e-17 199 234 8.88178419700125e-16 199 189 -5.11743425413158e-17 199 87 -2.08333333333333e+00 200 200 5.55555555555556e+01 200 92 -3.47222222222222e+00 200 49 1.59594559789866e-16 200 91 2.08333333333333e+00 200 48 -6.50521303491303e-17 200 90 -2.08333333333333e+00 200 113 5.55555555555556e+00 200 53 -6.94444444444444e-01 200 197 -9.72222222222222e+00 200 119 -3.47222222222222e+00 200 112 -3.29597460435593e-16 200 52 -6.10622663543836e-16 200 196 8.33333333333333e+00 200 118 2.08333333333333e+00 200 111 1.33226762955019e-15 200 51 2.77555756156289e-17 200 195 1.36175792864179e-16 200 117 2.08333333333333e+00 200 110 5.55555555555556e+00 200 38 -6.94444444444444e-01 200 194 -9.72222222222222e+00 200 116 -3.47222222222222e+00 200 109 1.33226762955019e-15 200 37 3.09648140461860e-16 200 193 5.35162192338845e-16 200 115 -2.08333333333333e+00 200 108 -1.42334061203897e-15 200 36 -8.32667268468867e-17 200 192 8.33333333333333e+00 200 114 2.08333333333333e+00 200 77 5.55555555555556e+00 200 50 -6.94444444444445e-01 200 107 5.55555555555556e+00 200 35 -6.94444444444445e-01 200 176 -9.72222222222222e+00 200 236 -2.22222222222222e+01 200 191 -9.72222222222222e+00 200 89 -3.47222222222222e+00 200 76 8.88178419700125e-16 200 199 8.88178419700125e-16 200 106 -5.16839175623840e-16 200 34 1.99493199737333e-17 200 175 5.90673343570103e-16 200 235 -9.54097911787244e-17 200 190 -8.33333333333333e+00 200 88 -2.08333333333333e+00 200 75 -6.84131570838353e-17 200 198 0.00000000000000e+00 200 105 1.33226762955019e-15 200 33 1.82145964977565e-17 200 174 -8.33333333333333e+00 200 234 7.30427003603484e-16 200 189 8.76035355368288e-17 200 87 -2.08333333333333e+00 201 201 5.55555555555556e+01 201 23 -2.48065457064683e-16 201 118 2.08333333333333e+00 201 22 4.16666666666667e+00 201 117 -3.47222222222222e+00 201 21 -4.86111111111111e+00 201 212 1.78676518025611e-16 201 143 -2.08333333333333e+00 201 128 8.88178419700125e-16 201 26 -8.06646416329215e-17 201 211 3.29597460435593e-17 201 142 -2.08333333333333e+00 201 127 -1.66316613259276e-16 201 25 -4.16666666666667e+00 201 210 -1.38888888888889e+00 201 141 -3.47222222222222e+00 201 126 5.55555555555556e+00 201 24 -4.86111111111111e+00 201 209 -8.33333333333333e+00 201 140 -2.08333333333333e+00 201 125 -9.30448751899904e-16 201 11 -1.56992474575901e-16 201 208 5.73326108810335e-16 201 139 2.08333333333333e+00 201 124 1.68887527660783e-15 201 10 4.16666666666667e+00 201 207 -9.72222222222222e+00 201 138 -3.47222222222222e+00 201 123 -1.11111111111111e+01 201 9 -4.86111111111111e+00 201 194 8.33333333333333e+00 201 239 8.03393809811759e-16 201 206 2.35055030994857e-16 201 116 2.08333333333333e+00 201 101 -1.14155646740999e-15 201 203 2.66453525910038e-15 201 122 8.88178419700125e-16 201 8 -2.41993924898765e-16 201 193 -2.49800180540660e-16 201 238 4.44089209850063e-16 201 205 -5.19332840620557e-17 201 115 -2.08333333333333e+00 201 100 -1.41379963292110e-16 201 202 -3.55271367880050e-15 201 121 -2.75021433578104e-16 201 7 -4.16666666666667e+00 201 192 -9.72222222222223e+00 201 237 1.11111111111111e+01 201 204 -1.38888888888889e+00 201 114 -3.47222222222222e+00 201 99 -1.11111111111111e+01 201 119 2.08333333333333e+00 201 120 5.55555555555556e+00 201 6 -4.86111111111111e+00 202 202 5.55555555555556e+01 202 23 8.42316667803988e-16 202 118 -3.47222222222222e+00 202 22 -4.86111111111111e+00 202 117 2.08333333333333e+00 202 21 4.16666666666666e+00 202 212 -8.33333333333334e+00 202 143 -2.08333333333333e+00 202 128 -1.20118758689669e-15 202 26 -6.60495963478169e-16 202 211 -9.72222222222223e+00 202 142 -3.47222222222222e+00 202 127 -1.11111111111111e+01 202 25 -4.86111111111111e+00 202 210 4.35849273339173e-17 202 141 -2.08333333333333e+00 202 126 -1.63999131115589e-16 202 24 -4.16666666666667e+00 202 209 1.34614541735800e-15 202 140 2.08333333333333e+00 202 125 2.22044604925031e-15 202 11 -6.41847686111419e-17 202 208 -1.38888888888889e+00 202 139 -3.47222222222222e+00 202 124 5.55555555555557e+00 202 10 -4.86111111111111e+00 202 207 5.20417042793042e-16 202 138 2.08333333333333e+00 202 123 1.71325627296159e-15 202 9 4.16666666666667e+00 202 194 1.69135538907739e-16 202 239 1.22785896033983e-15 202 206 8.33333333333333e+00 202 116 2.08333333333333e+00 202 101 8.88178419700125e-16 202 203 -8.88178419700125e-16 202 122 -1.70816052275091e-15 202 8 -1.12757025938492e-16 202 193 -1.38888888888889e+00 202 238 1.11111111111111e+01 202 205 -9.72222222222223e+00 202 115 -3.47222222222222e+00 202 100 5.55555555555555e+00 202 119 -2.08333333333333e+00 202 121 -1.11111111111111e+01 202 7 -4.86111111111111e+00 202 192 -2.89698820488127e-16 202 237 0.00000000000000e+00 202 204 -7.71951946809679e-17 202 114 -2.08333333333333e+00 202 99 -2.51182538310579e-16 202 201 -3.55271367880050e-15 202 120 -3.86518074491082e-16 202 6 -4.16666666666667e+00 203 203 5.55555555555556e+01 203 23 -6.94444444444444e-01 203 118 -2.08333333333333e+00 203 22 8.56953397132543e-16 203 117 2.08333333333333e+00 203 21 -2.85904112884428e-16 203 212 -9.72222222222222e+00 203 143 -3.47222222222222e+00 203 128 5.55555555555556e+00 203 26 -6.94444444444442e-01 203 211 -8.33333333333334e+00 203 142 -2.08333333333333e+00 203 127 -1.27101020680476e-15 203 25 -6.86083134748827e-16 203 210 4.29560900738757e-16 203 141 -2.08333333333333e+00 203 126 8.88178419700125e-16 203 24 -1.11022302462516e-16 203 209 -9.72222222222222e+00 203 140 -3.47222222222222e+00 203 125 5.55555555555556e+00 203 11 -6.94444444444443e-01 203 208 1.16530049498742e-15 203 139 2.08333333333333e+00 203 124 1.77635683940025e-15 203 10 -5.38848479725296e-17 203 207 -8.33333333333333e+00 203 138 -2.08333333333333e+00 203 123 -8.67144897553906e-16 203 9 -2.32452945780892e-16 203 194 -9.72222222222222e+00 203 239 -2.22222222222222e+01 203 206 -9.72222222222222e+00 203 116 -3.47222222222222e+00 203 101 5.55555555555555e+00 203 119 -3.47222222222222e+00 203 122 5.55555555555555e+00 203 8 -6.94444444444444e-01 203 193 1.69460799559484e-16 203 238 8.50881864966624e-16 203 205 8.33333333333333e+00 203 115 2.08333333333333e+00 203 100 8.88178419700125e-16 203 202 -8.88178419700125e-16 203 121 -1.50649891866861e-15 203 7 -9.38919081372447e-17 203 192 8.33333333333333e+00 203 237 1.43790957873174e-15 203 204 4.31187203997485e-16 203 114 2.08333333333333e+00 203 99 -1.31258936011958e-15 203 201 2.66453525910038e-15 203 120 8.88178419700125e-16 203 6 -2.38958158815805e-16 204 204 5.55555555555556e+01 204 41 -4.16666666666667e+00 204 133 -2.08333333333333e+00 204 40 2.66280053562440e-16 204 132 -3.47222222222222e+00 204 39 -4.86111111111111e+00 204 110 2.08333333333333e+00 204 215 2.89698820488127e-16 204 131 1.16443313324943e-16 204 38 4.16666666666667e+00 204 109 2.08333333333333e+00 204 214 4.68375338513738e-17 204 130 -4.44089209850063e-16 204 37 -8.32667268468867e-17 204 108 -3.47222222222222e+00 204 213 -1.38888888888889e+00 204 129 5.55555555555556e+00 204 36 -4.86111111111112e+00 204 209 -3.59087759527199e-16 204 140 -2.64099451943028e-15 204 125 2.08333333333333e+00 204 11 4.16666666666666e+00 204 208 -8.33333333333333e+00 204 139 1.76455258824731e-15 204 124 -2.08333333333333e+00 204 10 2.74953670942324e-16 204 207 -9.72222222222222e+00 204 138 -1.11111111111111e+01 204 123 -3.47222222222222e+00 204 9 -4.86111111111111e+00 204 194 -4.83987849797529e-16 204 239 2.66453525910038e-15 204 206 2.66453525910038e-15 204 116 3.07804996768635e-16 204 101 -2.08333333333333e+00 204 203 3.75676052766227e-16 204 122 5.31408142316614e-16 204 8 -4.16666666666667e+00 204 193 8.33333333333333e+00 204 238 -8.82540568403201e-17 204 205 -2.66453525910038e-15 204 115 -3.03576608295941e-17 204 100 2.08333333333333e+00 204 202 3.38271077815477e-17 204 121 -4.44089209850063e-16 204 7 -6.93889390390723e-17 204 192 -9.72222222222222e+00 204 237 1.11111111111111e+01 204 134 -2.08333333333333e+00 204 114 -1.11111111111111e+01 204 99 -3.47222222222222e+00 204 201 -1.38888888888889e+00 204 120 5.55555555555556e+00 204 6 -4.86111111111112e+00 205 205 5.55555555555556e+01 205 41 8.54351311918577e-16 205 133 -3.47222222222222e+00 205 40 -6.94444444444446e-01 205 132 -2.08333333333333e+00 205 39 2.08166817117217e-16 205 110 -2.08333333333333e+00 205 215 -8.33333333333334e+00 205 131 6.37185616769731e-16 205 38 -1.21430643318376e-16 205 109 -3.47222222222222e+00 205 214 -9.72222222222223e+00 205 130 5.55555555555556e+00 205 37 -6.94444444444446e-01 205 108 2.08333333333333e+00 205 213 5.74627151417317e-17 205 129 -8.88178419700125e-16 205 36 -1.42247325030098e-16 205 209 -8.71264865809351e-16 205 140 1.77635683940025e-15 205 125 2.08333333333333e+00 205 11 -2.68990558993654e-16 205 208 -9.72222222222222e+00 205 139 5.55555555555556e+00 205 124 -3.47222222222222e+00 205 10 -6.94444444444444e-01 205 207 -8.33333333333333e+00 205 138 1.65340831304039e-15 205 123 -2.08333333333333e+00 205 9 3.36536354339501e-16 205 194 1.48926010412609e-15 205 239 -2.22479641046741e-15 205 206 0.00000000000000e+00 205 116 -4.44089209850063e-16 205 101 2.08333333333333e+00 205 203 8.33333333333333e+00 205 122 2.15214131238373e-16 205 8 -3.07371315899641e-16 205 193 -9.72222222222222e+00 205 238 -2.22222222222222e+01 205 134 -2.08333333333333e+00 205 115 5.55555555555555e+00 205 100 -3.47222222222222e+00 205 202 -9.72222222222223e+00 205 121 5.55555555555556e+00 205 7 -6.94444444444445e-01 205 192 8.33333333333333e+00 205 237 9.71716197090133e-17 205 204 -2.66453525910038e-15 205 114 -3.97875092247868e-16 205 99 2.08333333333333e+00 205 201 3.04660810468427e-17 205 120 -8.88178419700125e-16 205 6 -1.00505541389406e-16 206 206 5.55555555555556e+01 206 41 -4.86111111111111e+00 206 133 -2.08333333333333e+00 206 40 6.82180006927879e-16 206 132 -2.08333333333333e+00 206 39 -4.16666666666667e+00 206 110 -3.47222222222222e+00 206 215 -9.72222222222222e+00 206 131 -1.11111111111111e+01 206 38 -4.86111111111111e+00 206 109 -2.08333333333333e+00 206 214 -8.33333333333334e+00 206 130 2.16081492976361e-16 206 37 -1.23599047663348e-16 206 108 2.08333333333333e+00 206 213 4.29560900738757e-16 206 129 5.86919293547872e-16 206 36 4.16666666666667e+00 206 209 -1.38888888888889e+00 206 140 5.55555555555557e+00 206 125 -3.47222222222222e+00 206 11 -4.86111111111111e+00 206 208 -9.15066633577766e-16 206 139 1.33226762955019e-15 206 124 2.08333333333333e+00 206 10 -4.11129463806503e-16 206 207 -3.26128013483640e-16 206 138 -2.81003519064793e-15 206 123 2.08333333333333e+00 206 9 4.16666666666667e+00 206 194 -1.38888888888889e+00 206 239 1.11111111111111e+01 206 134 -3.47222222222222e+00 206 116 5.55555555555555e+00 206 101 -3.47222222222222e+00 206 203 -9.72222222222222e+00 206 122 -1.11111111111111e+01 206 8 -4.86111111111111e+00 206 193 1.53002610581154e-15 206 238 -2.35954918798020e-15 206 205 -1.77635683940025e-15 206 115 -4.44089209850063e-16 206 100 2.08333333333333e+00 206 202 8.33333333333333e+00 206 121 4.70652163075957e-16 206 7 -3.15719672627779e-16 206 192 -4.98407738691586e-16 206 237 2.66453525910038e-15 206 204 2.66453525910038e-15 206 114 4.09015269570157e-16 206 99 -2.08333333333333e+00 206 201 2.07299455379228e-16 206 120 8.35919874986324e-17 206 6 -4.16666666666667e+00 207 207 1.11111111111111e+02 207 160 -2.08333333333333e+00 207 159 -3.47222222222222e+00 207 230 -8.33333333333333e+00 207 155 -2.08333333333333e+00 207 229 -1.84639629974281e-16 207 154 2.08333333333333e+00 207 228 -9.72222222222222e+00 207 153 -3.47222222222222e+00 207 227 5.09032919981944e-16 207 152 2.08333333333333e+00 207 226 -8.33333333333333e+00 207 151 -2.08333333333333e+00 207 225 -9.72222222222222e+00 207 150 -3.47222222222222e+00 207 242 -2.47957036847435e-16 207 221 2.81025203108243e-16 207 218 8.33333333333333e+00 207 146 2.08333333333333e+00 207 241 -1.82967248123223e-15 207 220 8.33333333333333e+00 207 217 -2.01119502996061e-16 207 145 2.08333333333333e+00 207 240 -2.22222222222222e+01 207 219 -9.72222222222222e+00 207 216 -9.72222222222222e+00 207 144 -3.47222222222222e+00 207 137 2.08333333333333e+00 207 56 -7.80625564189563e-18 207 136 2.08333333333333e+00 207 55 2.60208521396521e-18 207 135 -3.47222222222222e+00 207 54 -1.38888888888889e+00 207 215 8.33333333333333e+00 207 134 1.82471225629310e-16 207 41 6.15826833971767e-17 207 131 2.08333333333333e+00 207 214 4.96130914129367e-16 207 133 0.00000000000000e+00 207 40 -4.66206934168767e-18 207 130 -2.08333333333333e+00 207 213 -9.72222222222222e+00 207 132 1.11111111111111e+01 207 39 -1.38888888888889e+00 207 129 -3.47222222222222e+00 207 212 -5.13478148889135e-16 207 143 8.88178419700125e-16 207 128 -2.08333333333333e+00 207 26 -8.47846098883664e-17 207 211 8.33333333333333e+00 207 142 2.06323673423991e-16 207 127 2.08333333333333e+00 207 25 -2.42861286636753e-17 207 210 -9.72222222222222e+00 207 141 1.11111111111111e+01 207 126 -3.47222222222222e+00 207 24 -1.38888888888889e+00 207 239 -1.56537109663457e-15 207 209 5.32907051820075e-15 207 140 4.44089209850063e-16 207 206 -2.82759926584220e-16 207 203 -8.33333333333333e+00 207 125 2.91677489452913e-16 207 11 7.23162849047831e-17 207 122 -2.08333333333333e+00 207 238 3.27017059265078e-15 207 208 -1.77635683940025e-15 207 139 -9.99905453574756e-17 207 205 -8.33333333333333e+00 207 202 5.32560107124880e-16 207 124 0.00000000000000e+00 207 10 6.84131570838353e-17 207 121 -2.08333333333333e+00 207 237 -2.22222222222222e+01 207 161 -2.08333333333333e+00 207 138 1.11111111111111e+01 207 204 -9.72222222222222e+00 207 201 -9.72222222222222e+00 207 123 1.11111111111111e+01 207 9 -1.38888888888889e+00 207 120 -3.47222222222222e+00 208 208 1.11111111111111e+02 208 160 -3.47222222222222e+00 208 159 -2.08333333333333e+00 208 230 -1.76941794549634e-16 208 155 2.08333333333333e+00 208 229 -1.38888888888889e+00 208 154 -3.47222222222222e+00 208 228 -1.18828558104411e-16 208 153 2.08333333333333e+00 208 227 -7.56447855743136e-16 208 152 2.08333333333333e+00 208 226 -9.72222222222222e+00 208 151 -3.47222222222222e+00 208 225 -8.33333333333333e+00 208 150 -2.08333333333333e+00 208 242 2.66453525910038e-15 208 221 -1.03649727689614e-15 208 218 8.08597980239689e-16 208 146 -2.08333333333333e+00 208 241 1.11111111111111e+01 208 220 -9.72222222222222e+00 208 217 -1.38888888888889e+00 208 145 -3.47222222222222e+00 208 240 -1.85918988537814e-15 208 219 8.33333333333333e+00 208 216 -1.04950770296597e-16 208 144 2.08333333333333e+00 208 137 -2.08333333333333e+00 208 56 -8.33333333333334e+00 208 136 -3.47222222222222e+00 208 55 -9.72222222222223e+00 208 135 2.08333333333333e+00 208 54 4.15249432061948e-17 208 215 -1.00787433954252e-15 208 134 -1.41976274486977e-15 208 41 8.33333333333334e+00 208 131 2.08333333333333e+00 208 214 -1.38888888888889e+00 208 133 1.11111111111111e+01 208 40 -9.72222222222223e+00 208 130 -3.47222222222222e+00 208 213 5.47305256670683e-16 208 132 0.00000000000000e+00 208 39 -2.51534904016637e-17 208 129 -2.08333333333333e+00 208 212 3.09431300027363e-16 208 143 1.03679543249358e-15 208 128 2.08333333333333e+00 208 26 8.33333333333334e+00 208 211 -9.72222222222222e+00 208 142 -2.22222222222222e+01 208 127 -3.47222222222222e+00 208 25 -9.72222222222223e+00 208 210 8.33333333333333e+00 208 141 -1.03446439782273e-16 208 126 2.08333333333333e+00 208 24 -6.28837260041593e-18 208 239 3.10862446895044e-15 208 209 -7.10542735760100e-15 208 140 9.59302082215174e-16 208 206 -9.11597186625812e-16 208 203 1.15825318086626e-15 208 125 -1.49495216553164e-15 208 11 -8.33333333333334e+00 208 122 -2.08333333333333e+00 208 238 1.11111111111111e+01 208 161 -2.08333333333333e+00 208 139 -2.22222222222222e+01 208 205 -9.72222222222222e+00 208 202 -1.38888888888889e+00 208 124 1.11111111111111e+01 208 10 -9.72222222222223e+00 208 121 -3.47222222222222e+00 208 237 3.45157116863476e-15 208 207 -2.66453525910038e-15 208 138 3.64183509737881e-16 208 204 -8.33333333333333e+00 208 201 5.81023944234982e-16 208 123 -4.44089209850063e-16 208 9 -1.12757025938492e-17 208 120 -2.08333333333333e+00 209 209 1.11111111111111e+02 209 160 -2.08333333333333e+00 209 159 -2.08333333333333e+00 209 230 -9.72222222222222e+00 209 155 -3.47222222222222e+00 209 229 -3.53124647578529e-16 209 154 2.08333333333333e+00 209 228 -8.33333333333333e+00 209 153 -2.08333333333333e+00 209 227 -1.38888888888889e+00 209 152 -3.47222222222222e+00 209 226 -7.12103986888479e-16 209 151 2.08333333333333e+00 209 225 4.75314232417645e-16 209 150 2.08333333333333e+00 209 242 1.11111111111111e+01 209 221 -1.38888888888889e+00 209 218 -9.72222222222222e+00 209 146 -3.47222222222222e+00 209 241 3.55271367880050e-15 209 220 -1.04647193688301e-15 209 217 1.05644659686988e-15 209 145 -2.08333333333333e+00 209 240 -3.59304599961696e-16 209 219 4.27609336828283e-16 209 216 8.33333333333333e+00 209 144 2.08333333333333e+00 209 137 -3.47222222222222e+00 209 56 -9.72222222222222e+00 209 136 -2.08333333333333e+00 209 55 -8.33333333333334e+00 209 135 2.08333333333333e+00 209 54 -3.77302356024956e-17 209 215 -9.72222222222222e+00 209 134 -2.22222222222222e+01 209 41 -9.72222222222222e+00 209 131 -3.47222222222222e+00 209 214 -9.01297265987200e-16 209 133 -1.26586024648545e-15 209 40 8.33333333333334e+00 209 130 2.08333333333333e+00 209 213 8.33333333333333e+00 209 132 6.96328845278815e-17 209 39 8.01225405466788e-17 209 129 2.08333333333333e+00 209 212 -1.38888888888889e+00 209 143 1.11111111111111e+01 209 128 -3.47222222222222e+00 209 26 -9.72222222222222e+00 209 211 3.93782229046735e-16 209 142 1.29236898960272e-15 209 127 2.08333333333333e+00 209 25 8.33333333333334e+00 209 210 -4.82253126321552e-16 209 141 4.44089209850063e-16 209 126 -2.08333333333333e+00 209 24 -4.94396190653390e-17 209 239 1.11111111111111e+01 209 161 -3.47222222222222e+00 209 140 1.11111111111111e+01 209 206 -1.38888888888889e+00 209 203 -9.72222222222222e+00 209 125 -2.22222222222222e+01 209 11 -9.72222222222222e+00 209 122 -3.47222222222222e+00 209 238 3.55271367880050e-15 209 208 -7.10542735760100e-15 209 139 7.66070150023945e-16 209 205 -9.30353884209811e-16 209 202 1.36349265211777e-15 209 124 -1.35731269973460e-15 209 10 -8.33333333333334e+00 209 121 -2.08333333333333e+00 209 237 -1.71291745978269e-15 209 207 5.32907051820075e-15 209 138 4.44089209850063e-16 209 204 -3.54859371054506e-16 209 201 -8.33333333333333e+00 209 123 2.44921270764475e-16 209 9 -7.80625564189563e-18 209 120 -2.08333333333333e+00 210 210 5.55555555555556e+01 210 110 2.08333333333333e+00 210 52 -1.94289029309402e-16 210 109 -2.08333333333333e+00 210 51 -4.86111111111111e+00 210 108 -3.47222222222222e+00 210 137 6.86950496486816e-16 210 56 -4.16666666666667e+00 210 134 -2.08333333333333e+00 210 215 1.24032728532342e-16 210 136 8.88178419700125e-16 210 55 3.08780778723872e-16 210 133 2.08333333333333e+00 210 214 -5.19332840620557e-17 210 135 5.55555555555556e+00 210 54 -4.86111111111111e+00 210 132 -3.47222222222222e+00 210 213 -1.38888888888889e+00 210 119 -2.74086309204336e-15 210 194 -1.72604985859692e-16 210 23 -4.16666666666667e+00 210 101 -2.08333333333333e+00 210 118 -2.80157841370254e-16 210 193 -8.33333333333333e+00 210 22 -1.52655665885959e-16 210 100 -2.08333333333333e+00 210 117 -1.11111111111111e+01 210 192 -9.72222222222222e+00 210 21 -4.86111111111112e+00 210 99 -3.47222222222222e+00 210 212 8.88178419700125e-16 210 143 9.87925019568792e-16 210 209 -4.83987849797529e-16 210 239 2.22044604925031e-15 210 128 7.95370713735366e-16 210 26 4.16666666666667e+00 210 125 2.08333333333333e+00 210 203 4.29560900738757e-16 210 211 -2.66453525910038e-15 210 142 1.63053164720095e-15 210 208 8.33333333333333e+00 210 238 -4.56205169127588e-16 210 127 8.88178419700125e-16 210 25 2.80157841370254e-16 210 124 2.08333333333333e+00 210 202 -2.58040117051550e-17 210 53 4.16666666666667e+00 210 141 -1.11111111111111e+01 210 207 -9.72222222222222e+00 210 237 1.11111111111111e+01 210 126 5.55555555555556e+00 210 24 -4.86111111111111e+00 210 123 -3.47222222222222e+00 210 201 -1.38888888888889e+00 211 211 5.55555555555556e+01 211 110 2.08333333333333e+00 211 52 -6.94444444444444e-01 211 109 -3.47222222222222e+00 211 51 -1.68268177169750e-16 211 108 -2.08333333333333e+00 211 137 7.01695646032618e-16 211 56 4.92661467177413e-16 211 134 2.08333333333333e+00 211 215 8.33333333333333e+00 211 136 5.55555555555556e+00 211 55 -6.94444444444444e-01 211 133 -3.47222222222222e+00 211 214 -9.72222222222223e+00 211 135 8.88178419700125e-16 211 54 3.12250225675825e-16 211 132 2.08333333333333e+00 211 213 -7.71951946809679e-17 211 119 1.77635683940025e-15 211 194 -1.54390389361936e-16 211 23 8.50014503228635e-17 211 101 -2.08333333333333e+00 211 118 5.55555555555555e+00 211 193 -9.72222222222222e+00 211 22 -6.94444444444446e-01 211 100 -3.47222222222222e+00 211 117 -1.08094956596805e-16 211 192 -8.33333333333333e+00 211 21 -1.39645239816133e-16 211 99 -2.08333333333333e+00 211 212 3.55271367880050e-15 211 143 1.77635683940025e-15 211 209 3.66026653431106e-16 211 239 -2.07505453792001e-15 211 128 3.09539720244612e-16 211 26 -6.33174068731535e-16 211 125 -2.08333333333333e+00 211 203 -8.33333333333334e+00 211 53 2.91433543964104e-16 211 142 5.55555555555556e+00 211 208 -9.72222222222222e+00 211 238 -2.22222222222222e+01 211 127 5.55555555555556e+00 211 25 -6.94444444444445e-01 211 124 -3.47222222222222e+00 211 202 -9.72222222222223e+00 211 210 -2.66453525910038e-15 211 141 1.67487551605561e-15 211 207 8.33333333333333e+00 211 237 -5.30500122997157e-16 211 126 8.88178419700125e-16 211 24 2.98372437868011e-16 211 123 2.08333333333333e+00 211 201 4.07660016854550e-17 212 212 5.55555555555556e+01 212 110 -3.47222222222222e+00 212 52 1.82145964977565e-16 212 109 2.08333333333333e+00 212 51 4.16666666666667e+00 212 108 2.08333333333333e+00 212 137 -1.11111111111111e+01 212 56 -4.86111111111111e+00 212 134 -3.47222222222222e+00 212 215 -9.72222222222222e+00 212 136 4.20562022707127e-16 212 55 4.83987849797529e-16 212 133 2.08333333333333e+00 212 214 8.33333333333333e+00 212 135 9.06393016197882e-16 212 54 -4.16666666666667e+00 212 132 -2.08333333333333e+00 212 213 3.20164901534969e-16 212 119 5.55555555555555e+00 212 194 -1.38888888888889e+00 212 23 -4.86111111111111e+00 212 101 -3.47222222222222e+00 212 118 2.22044604925031e-15 212 193 -8.18572640226556e-17 212 22 0.00000000000000e+00 212 100 -2.08333333333333e+00 212 117 -2.76948602939697e-15 212 192 -2.69315819645399e-16 212 21 -4.16666666666667e+00 212 99 -2.08333333333333e+00 212 53 -4.86111111111111e+00 212 143 5.55555555555556e+00 212 209 -1.38888888888889e+00 212 239 1.11111111111111e+01 212 128 -1.11111111111111e+01 212 26 -4.86111111111111e+00 212 125 -3.47222222222222e+00 212 203 -9.72222222222222e+00 212 211 2.66453525910038e-15 212 142 1.77635683940025e-15 212 208 3.12900746979317e-16 212 238 -1.53784591398060e-15 212 127 7.57206797263876e-16 212 25 -5.96744875736022e-16 212 124 -2.08333333333333e+00 212 202 -8.33333333333334e+00 212 210 8.88178419700125e-16 212 141 1.06165076729781e-15 212 207 -5.23886489744996e-16 212 237 2.22044604925031e-15 212 126 6.86950496486816e-16 212 24 4.16666666666667e+00 212 123 2.08333333333333e+00 212 201 2.14238349283136e-16 213 213 5.55555555555556e+01 213 119 -2.08333333333333e+00 213 52 4.16666666666667e+00 213 118 2.08333333333333e+00 213 51 -4.86111111111111e+00 213 117 -3.47222222222222e+00 213 137 1.33226762955019e-15 213 56 -5.29090660172926e-17 213 212 2.65521112041700e-16 213 143 2.08333333333333e+00 213 136 7.63278329429795e-17 213 55 -4.16666666666667e+00 213 211 3.38271077815477e-17 213 142 -2.08333333333333e+00 213 135 5.55555555555556e+00 213 54 -4.86111111111111e+00 213 210 -1.38888888888889e+00 213 141 -3.47222222222222e+00 213 134 -8.34510412162093e-16 213 41 -1.77809156287623e-16 213 209 8.33333333333333e+00 213 140 2.08333333333333e+00 213 133 1.70956998557514e-15 213 40 4.16666666666667e+00 213 208 5.41233724504764e-16 213 139 2.08333333333333e+00 213 132 -1.11111111111111e+01 213 39 -4.86111111111111e+00 213 207 -9.72222222222222e+00 213 138 -3.47222222222222e+00 213 110 -1.29236898960272e-15 213 215 8.88178419700125e-16 213 131 1.77635683940025e-15 213 38 -2.70616862252382e-16 213 194 -8.33333333333333e+00 213 239 1.32677885605198e-15 213 206 5.40583203201273e-16 213 116 -2.08333333333333e+00 213 109 -1.66533453693773e-16 213 214 -1.77635683940025e-15 213 130 -1.83013326715553e-16 213 37 -4.16666666666667e+00 213 193 -2.22044604925031e-16 213 238 4.44089209850063e-16 213 205 -1.19262238973405e-17 213 115 -2.08333333333333e+00 213 108 -1.11111111111111e+01 213 53 -2.98372437868011e-16 213 129 5.55555555555556e+00 213 36 -4.86111111111111e+00 213 192 -9.72222222222223e+00 213 237 1.11111111111111e+01 213 204 -1.38888888888889e+00 213 114 -3.47222222222222e+00 214 214 5.55555555555556e+01 214 119 2.08333333333333e+00 214 52 -4.86111111111111e+00 214 118 -3.47222222222222e+00 214 51 4.16666666666667e+00 214 117 2.08333333333333e+00 214 137 -4.67616396992998e-16 214 56 -1.55257751099924e-16 214 212 8.33333333333333e+00 214 143 2.08333333333333e+00 214 136 -1.11111111111111e+01 214 55 -4.86111111111111e+00 214 211 -9.72222222222223e+00 214 142 -3.47222222222222e+00 214 135 2.61075883134509e-16 214 54 -4.16666666666667e+00 214 210 4.51028103753970e-17 214 141 -2.08333333333333e+00 214 134 1.33226762955019e-15 214 41 3.74700270810990e-16 214 209 -9.01297265987200e-16 214 140 -2.08333333333333e+00 214 133 5.55555555555556e+00 214 40 -4.86111111111111e+00 214 208 -1.38888888888889e+00 214 139 -3.47222222222222e+00 214 132 1.61676227961038e-15 214 39 4.16666666666667e+00 214 207 6.14092110495790e-16 214 138 2.08333333333333e+00 214 110 0.00000000000000e+00 214 215 3.55271367880050e-15 214 131 -5.75060832286312e-16 214 38 -9.71445146547012e-17 214 194 -2.22478285794026e-16 214 239 7.46906876625264e-16 214 206 -8.33333333333334e+00 214 116 -2.08333333333333e+00 214 109 5.55555555555555e+00 214 53 7.31185945124224e-16 214 130 -1.11111111111111e+01 214 37 -4.86111111111111e+00 214 193 -1.38888888888889e+00 214 238 1.11111111111111e+01 214 205 -9.72222222222223e+00 214 115 -3.47222222222222e+00 214 108 -2.53269627492614e-16 214 213 -1.77635683940025e-15 214 129 -1.45716771982052e-16 214 36 -4.16666666666667e+00 214 192 -2.32344525563644e-16 214 237 0.00000000000000e+00 214 204 5.46437894932694e-17 214 114 -2.08333333333333e+00 215 215 5.55555555555556e+01 215 119 -3.47222222222222e+00 215 52 7.84095011141517e-16 215 118 2.08333333333333e+00 215 51 -3.02709246557953e-16 215 117 -2.08333333333333e+00 215 137 5.55555555555555e+00 215 56 -6.94444444444444e-01 215 212 -9.72222222222222e+00 215 143 -3.47222222222222e+00 215 136 -6.30571983517569e-16 215 55 -2.28983498828939e-16 215 211 8.33333333333333e+00 215 142 2.08333333333333e+00 215 135 1.33226762955019e-15 215 54 -4.85722573273506e-17 215 210 9.62771529167128e-17 215 141 2.08333333333333e+00 215 134 5.55555555555556e+00 215 41 -6.94444444444445e-01 215 209 -9.72222222222222e+00 215 140 -3.47222222222222e+00 215 133 1.33226762955019e-15 215 40 3.10515502199848e-16 215 208 -1.00787433954252e-15 215 139 -2.08333333333333e+00 215 132 -7.15573433840433e-16 215 39 -1.17961196366423e-16 215 207 8.33333333333333e+00 215 138 2.08333333333333e+00 215 110 5.55555555555555e+00 215 53 -6.94444444444444e-01 215 131 5.55555555555555e+00 215 38 -6.94444444444444e-01 215 194 -9.72222222222222e+00 215 239 -2.22222222222222e+01 215 206 -9.72222222222222e+00 215 116 -3.47222222222222e+00 215 109 8.88178419700125e-16 215 214 3.55271367880050e-15 215 130 -8.00683304380545e-16 215 37 -9.54097911787244e-17 215 193 -3.15719672627779e-16 215 238 1.11683665787732e-15 215 205 -8.33333333333334e+00 215 115 -2.08333333333333e+00 215 108 -1.15977106390774e-15 215 213 8.88178419700125e-16 215 129 1.77635683940025e-15 215 36 -1.97758476261356e-16 215 192 -8.33333333333333e+00 215 237 7.70542483985448e-16 215 204 2.14238349283136e-16 215 114 -2.08333333333333e+00 216 216 5.55555555555556e+01 216 26 -1.99493199737333e-17 216 142 2.08333333333333e+00 216 25 4.16666666666667e+00 216 141 -3.47222222222222e+00 216 24 -4.86111111111111e+00 216 227 -1.38777878078145e-16 216 167 -2.08333333333333e+00 216 152 -4.44089209850063e-16 216 29 2.58365377703296e-16 216 226 2.16840434497101e-17 216 166 -2.08333333333333e+00 216 151 7.62953068778049e-16 216 28 -4.16666666666667e+00 216 225 -1.38888888888889e+00 216 165 -3.47222222222222e+00 216 150 5.55555555555556e+00 216 27 -4.86111111111111e+00 216 224 -8.33333333333333e+00 216 164 -2.08333333333333e+00 216 149 6.64832772168111e-16 216 14 1.64581889783300e-16 216 223 1.03866568124111e-16 216 163 2.08333333333333e+00 216 148 -1.69799612738386e-16 216 13 4.16666666666666e+00 216 222 -9.72222222222223e+00 216 162 -3.47222222222222e+00 216 147 -1.11111111111111e+01 216 12 -4.86111111111111e+00 216 209 8.33333333333333e+00 216 242 -3.12683906544819e-16 216 221 -1.92554305833426e-16 216 140 2.08333333333333e+00 216 125 -2.15322551455621e-16 216 218 0.00000000000000e+00 216 146 -4.44089209850063e-16 216 11 2.14238349283136e-16 216 208 -1.39645239816133e-16 216 241 8.88178419700125e-16 216 220 7.13405029495462e-17 216 139 -2.08333333333333e+00 216 124 -9.02381468159685e-16 216 217 0.00000000000000e+00 216 145 5.93966607669028e-16 216 10 -4.16666666666667e+00 216 207 -9.72222222222222e+00 216 240 1.11111111111111e+01 216 219 -1.38888888888889e+00 216 138 -3.47222222222222e+00 216 123 -1.11111111111111e+01 216 143 2.08333333333333e+00 216 144 5.55555555555556e+00 216 9 -4.86111111111111e+00 217 217 5.55555555555556e+01 217 26 -5.54460991009087e-16 217 142 -3.47222222222222e+00 217 25 -4.86111111111111e+00 217 141 2.08333333333333e+00 217 24 4.16666666666666e+00 217 227 -8.33333333333333e+00 217 167 -2.08333333333333e+00 217 152 8.31284910698948e-16 217 29 3.43041567374414e-16 217 226 -9.72222222222223e+00 217 166 -3.47222222222222e+00 217 151 -1.11111111111111e+01 217 28 -4.86111111111111e+00 217 225 6.97141996908179e-17 217 165 -2.08333333333333e+00 217 150 4.79366438037310e-16 217 27 -4.16666666666667e+00 217 224 -1.16226472890446e-16 217 164 2.08333333333333e+00 217 149 1.77635683940025e-15 217 14 -2.60208521396521e-17 217 223 -1.38888888888889e+00 217 163 -3.47222222222222e+00 217 148 5.55555555555555e+00 217 13 -4.86111111111111e+00 217 222 6.85215773010839e-17 217 162 2.08333333333333e+00 217 147 -2.04805790382512e-16 217 12 4.16666666666667e+00 217 209 9.45424294407360e-16 217 242 -1.24401357270987e-15 217 221 8.33333333333333e+00 217 140 2.08333333333333e+00 217 125 2.22044604925031e-15 217 218 -3.55271367880050e-15 217 146 6.99852502339393e-16 217 11 -5.52509427098613e-16 217 208 -1.38888888888889e+00 217 241 1.11111111111111e+01 217 220 -9.72222222222223e+00 217 139 -3.47222222222222e+00 217 124 5.55555555555556e+00 217 143 -2.08333333333333e+00 217 145 -1.11111111111111e+01 217 10 -4.86111111111111e+00 217 207 -2.07191035161980e-16 217 240 8.88178419700125e-16 217 219 2.25514051876985e-17 217 138 -2.08333333333333e+00 217 123 -9.27711141414378e-16 217 216 0.00000000000000e+00 217 144 6.56267575005476e-16 217 9 -4.16666666666667e+00 218 218 5.55555555555556e+01 218 26 -6.94444444444443e-01 218 142 -2.08333333333333e+00 218 25 -5.64652491430451e-16 218 141 2.08333333333333e+00 218 24 4.15249432061948e-17 218 227 -9.72222222222222e+00 218 167 -3.47222222222222e+00 218 152 5.55555555555556e+00 218 29 -6.94444444444444e-01 218 226 -8.33333333333333e+00 218 166 -2.08333333333333e+00 218 151 8.10874804801909e-16 218 28 3.85108611666851e-16 218 225 -1.23707467880596e-16 218 165 -2.08333333333333e+00 218 150 -4.44089209850063e-16 218 27 3.63424568217141e-16 218 224 -9.72222222222222e+00 218 164 -3.47222222222222e+00 218 149 5.55555555555555e+00 218 14 -6.94444444444444e-01 218 223 -1.89626959967715e-16 218 163 2.08333333333333e+00 218 148 1.77635683940025e-15 218 13 -8.82540568403201e-17 218 222 -8.33333333333333e+00 218 162 -2.08333333333333e+00 218 147 7.04189311029335e-16 218 12 1.35308431126191e-16 218 209 -9.72222222222222e+00 218 242 -2.22222222222222e+01 218 221 -9.72222222222222e+00 218 140 -3.47222222222222e+00 218 125 5.55555555555556e+00 218 143 -3.47222222222222e+00 218 146 5.55555555555556e+00 218 11 -6.94444444444444e-01 218 208 8.09465341977678e-16 218 241 -1.51992947308027e-15 218 220 8.33333333333333e+00 218 139 2.08333333333333e+00 218 124 1.77635683940025e-15 218 217 -3.55271367880050e-15 218 145 7.27201502140340e-16 218 10 -5.33427468862868e-16 218 207 8.33333333333333e+00 218 240 -7.55417863679275e-17 218 219 -1.22081164621868e-16 218 138 2.08333333333333e+00 218 123 -7.50132378088408e-17 218 216 0.00000000000000e+00 218 144 -4.44089209850063e-16 218 9 1.64690310000548e-16 219 219 5.55555555555556e+01 219 44 -4.16666666666667e+00 219 157 -2.08333333333333e+00 219 43 3.36102673470506e-17 219 156 -3.47222222222222e+00 219 42 -4.86111111111112e+00 219 134 2.08333333333333e+00 219 230 -2.68882138776405e-17 219 155 3.67436116255337e-16 219 41 4.16666666666667e+00 219 133 2.08333333333333e+00 219 229 2.16840434497101e-17 219 154 0.00000000000000e+00 219 40 -4.94396190653390e-17 219 132 -3.47222222222222e+00 219 228 -1.38888888888889e+00 219 153 5.55555555555556e+00 219 39 -4.86111111111111e+00 219 224 3.43258407808911e-16 219 164 1.53543356414682e-15 219 149 2.08333333333333e+00 219 14 4.16666666666667e+00 219 223 -8.33333333333333e+00 219 163 -2.91013415622265e-16 219 148 -2.08333333333333e+00 219 13 2.58040117051550e-17 219 222 -9.72222222222222e+00 219 162 -1.11111111111111e+01 219 147 -3.47222222222222e+00 219 12 -4.86111111111112e+00 219 209 2.64545330086463e-16 219 242 -4.44089209850063e-16 219 221 0.00000000000000e+00 219 140 -1.59616243833316e-15 219 125 -2.08333333333333e+00 219 218 -6.57026516526216e-17 219 146 4.88256895851691e-16 219 11 -4.16666666666667e+00 219 208 8.33333333333333e+00 219 241 1.24867564205156e-15 219 220 8.88178419700125e-16 219 139 -8.77227977758022e-16 219 124 2.08333333333333e+00 219 217 2.25514051876985e-17 219 145 0.00000000000000e+00 219 10 -1.56125112837913e-17 219 207 -9.72222222222222e+00 219 240 1.11111111111111e+01 219 158 -2.08333333333333e+00 219 138 -1.11111111111111e+01 219 123 -3.47222222222222e+00 219 216 -1.38888888888889e+00 219 144 5.55555555555556e+00 219 9 -4.86111111111111e+00 220 220 5.55555555555556e+01 220 44 -4.51028103753970e-17 220 157 -3.47222222222222e+00 220 43 -6.94444444444445e-01 220 156 -2.08333333333333e+00 220 42 6.07153216591882e-18 220 134 -2.08333333333333e+00 220 230 -8.33333333333333e+00 220 155 -2.29959280784175e-16 220 41 2.51534904016637e-16 220 133 -3.47222222222222e+00 220 229 -9.72222222222223e+00 220 154 5.55555555555556e+00 220 40 -6.94444444444443e-01 220 132 2.08333333333333e+00 220 228 6.97141996908179e-17 220 153 0.00000000000000e+00 220 39 -1.00505541389406e-16 220 224 3.94974851436469e-16 220 164 8.88178419700125e-16 220 149 2.08333333333333e+00 220 14 3.31765864780564e-17 220 223 -9.72222222222222e+00 220 163 5.55555555555555e+00 220 148 -3.47222222222222e+00 220 13 -6.94444444444446e-01 220 222 -8.33333333333333e+00 220 162 -2.61184303351758e-16 220 147 -2.08333333333333e+00 220 12 -6.93889390390723e-18 220 209 -1.04202670797582e-15 220 242 1.36762617290037e-15 220 221 -3.55271367880050e-15 220 140 4.44089209850063e-16 220 125 2.08333333333333e+00 220 218 8.33333333333333e+00 220 146 -4.67155611069692e-16 220 11 -3.72857127117765e-16 220 208 -9.72222222222222e+00 220 241 -2.22222222222222e+01 220 158 -2.08333333333333e+00 220 139 5.55555555555556e+00 220 124 -3.47222222222222e+00 220 217 -9.72222222222223e+00 220 145 5.55555555555556e+00 220 10 -6.94444444444445e-01 220 207 8.33333333333333e+00 220 240 9.02733833865743e-16 220 219 0.00000000000000e+00 220 138 -8.57563260854566e-16 220 123 2.08333333333333e+00 220 216 1.95373231481888e-16 220 144 0.00000000000000e+00 220 9 -8.05562214156730e-17 221 221 5.55555555555556e+01 221 44 -4.86111111111111e+00 221 157 -2.08333333333333e+00 221 43 -6.63531729561129e-17 221 156 -2.08333333333333e+00 221 42 -4.16666666666667e+00 221 134 -3.47222222222222e+00 221 230 -9.72222222222222e+00 221 155 -1.11111111111111e+01 221 41 -4.86111111111111e+00 221 133 -2.08333333333333e+00 221 229 -8.33333333333333e+00 221 154 -2.45111006144660e-16 221 40 2.44921270764475e-16 221 132 2.08333333333333e+00 221 228 -1.18178036800920e-17 221 153 5.99279198314207e-16 221 39 4.16666666666667e+00 221 224 -1.38888888888889e+00 221 164 5.55555555555555e+00 221 149 -3.47222222222222e+00 221 14 -4.86111111111111e+00 221 223 3.98119037736677e-16 221 163 4.44089209850063e-16 221 148 2.08333333333333e+00 221 13 1.61329283265843e-16 221 222 2.66280053562440e-16 221 162 1.38853772230219e-15 221 147 2.08333333333333e+00 221 12 4.16666666666667e+00 221 209 -1.38888888888889e+00 221 242 1.11111111111111e+01 221 158 -3.47222222222222e+00 221 140 5.55555555555556e+00 221 125 -3.47222222222222e+00 221 218 -9.72222222222222e+00 221 146 -1.11111111111111e+01 221 11 -4.86111111111111e+00 221 208 -1.02955838299224e-15 221 241 1.34430227366478e-15 221 220 -3.55271367880050e-15 221 139 -4.44089209850063e-16 221 124 2.08333333333333e+00 221 217 8.33333333333333e+00 221 145 -2.85470432015433e-16 221 10 -2.32452945780892e-16 221 207 3.12141805458577e-16 221 240 -4.44089209850063e-16 221 219 0.00000000000000e+00 221 138 -1.58368056082242e-15 221 123 -2.08333333333333e+00 221 216 -3.29597460435593e-17 221 144 5.93817529870311e-16 221 9 -4.16666666666667e+00 222 222 5.66666666666667e+01 222 58 -2.15620707053055e-17 222 57 -7.08333333333333e-01 222 158 -5.11750201676736e-16 222 44 -4.74202925190848e-17 222 157 -6.93889390390723e-18 222 43 -1.50568576703924e-17 222 156 5.66666666666667e+00 222 42 -7.08333333333333e-01 222 167 1.33920652345410e-15 222 29 -6.86706550998006e-17 222 166 1.18665927778538e-16 222 28 -2.15620707053055e-17 222 165 5.66666666666667e+00 222 27 -7.08333333333333e-01 222 224 1.85962356624714e-15 222 164 1.33226762955019e-15 222 149 -4.85997011948416e-16 222 14 -1.56497807334705e-17 222 223 1.77635683940025e-15 222 163 1.74125833516487e-16 222 148 0.00000000000000e+00 222 13 -1.58124110593433e-17 222 59 -4.74202925190848e-17 222 162 5.66666666666667e+00 222 147 5.66666666666667e+00 222 12 -7.08333333333333e-01 222 160 2.08333333333333e+00 222 159 -3.47222222222222e+00 222 230 8.33333333333333e+00 222 155 2.08333333333333e+00 222 229 6.15826833971767e-17 222 154 -2.08333333333333e+00 222 228 -9.72222222222223e+00 222 153 -3.47222222222222e+00 222 227 2.38524477946811e-16 222 152 -2.08333333333333e+00 222 226 8.33333333333333e+00 222 151 2.08333333333333e+00 222 225 -9.72222222222222e+00 222 150 -3.47222222222222e+00 222 242 1.34007388519208e-15 222 221 2.73218947466347e-16 222 218 -8.33333333333333e+00 222 146 -2.08333333333333e+00 222 241 -5.44703171456717e-16 222 220 -8.33333333333333e+00 222 217 6.85215773010839e-17 222 145 -2.08333333333333e+00 222 240 -2.22222222222222e+01 222 161 2.08333333333333e+00 222 219 -9.72222222222222e+00 222 216 -9.72222222222223e+00 222 144 -3.47222222222222e+00 222 308 -4.16666666666667e-02 222 307 -4.16666666666667e-02 222 306 -6.94444444444445e-02 222 401 -1.66666666666667e-01 222 302 -4.16666666666667e-02 222 400 9.63923493975394e-19 222 301 4.16666666666667e-02 222 399 -1.94444444444445e-01 222 300 -6.94444444444445e-02 222 398 1.22480964172972e-18 222 299 4.16666666666667e-02 222 397 -1.66666666666667e-01 222 298 -4.16666666666667e-02 222 396 -1.94444444444444e-01 222 297 -6.94444444444445e-02 222 449 -2.37505920827738e-17 222 392 -2.94936872233947e-18 222 389 1.66666666666667e-01 222 293 4.16666666666667e-02 222 448 4.15702594688729e-18 222 391 1.66666666666667e-01 222 388 -1.01643953670516e-20 222 292 4.16666666666667e-02 222 447 -4.44444444444445e-01 222 390 -1.94444444444444e-01 222 387 -1.94444444444445e-01 222 291 -6.94444444444445e-02 223 223 5.66666666666667e+01 223 58 -4.95833333333333e+00 223 57 -1.59089728153303e-17 223 158 -3.43158457921135e-16 223 44 4.25000000000000e+00 223 157 5.66666666666667e+00 223 43 -4.95833333333333e+00 223 156 -6.93889390390723e-18 223 42 -2.15485181781494e-17 223 167 -4.44546607641580e-16 223 29 4.25000000000000e+00 223 166 -1.13333333333333e+01 223 28 -4.95833333333333e+00 223 165 2.81678477268813e-16 223 27 -1.50568576703924e-17 223 224 -2.67841304690819e-15 223 164 -6.57821033430740e-16 223 149 -1.90329785555699e-16 223 14 -4.25000000000000e+00 223 59 -4.25000000000000e+00 223 163 -1.13333333333333e+01 223 148 5.66666666666667e+00 223 13 -4.95833333333333e+00 223 222 1.77635683940025e-15 223 162 2.29796650458303e-16 223 147 0.00000000000000e+00 223 12 -2.32967941812823e-17 223 160 -3.47222222222222e+00 223 159 2.08333333333333e+00 223 230 -6.76542155630955e-17 223 155 2.08333333333333e+00 223 229 -1.38888888888889e+00 223 154 -3.47222222222222e+00 223 228 8.99887803162969e-17 223 153 -2.08333333333333e+00 223 227 -4.94287770436141e-16 223 152 2.08333333333333e+00 223 226 -9.72222222222222e+00 223 151 -3.47222222222222e+00 223 225 8.33333333333333e+00 223 150 2.08333333333333e+00 223 242 2.66453525910038e-15 223 221 3.70363462121048e-16 223 218 -1.89626959967715e-16 223 146 -2.08333333333333e+00 223 241 1.11111111111111e+01 223 161 -2.08333333333333e+00 223 220 -9.72222222222222e+00 223 217 -1.38888888888889e+00 223 145 -3.47222222222222e+00 223 240 -3.93253680487649e-16 223 219 -8.33333333333333e+00 223 216 1.10805462028019e-16 223 144 -2.08333333333333e+00 223 308 -4.16666666666667e-02 223 307 -6.94444444444444e-02 223 306 -4.16666666666667e-02 223 401 -1.89464329641842e-17 223 302 4.16666666666667e-02 223 400 -2.77777777777778e-02 223 301 -6.94444444444444e-02 223 399 5.28548559086683e-19 223 300 4.16666666666667e-02 223 398 1.66865490609097e-17 223 299 4.16666666666667e-02 223 397 -1.94444444444444e-01 223 298 -6.94444444444444e-02 223 396 -1.66666666666667e-01 223 297 -4.16666666666667e-02 223 449 -6.24500451351651e-17 223 392 2.92599061299526e-17 223 389 -2.26191678234788e-17 223 293 -4.16666666666666e-02 223 448 2.22222222222222e-01 223 391 -1.94444444444444e-01 223 388 -2.77777777777778e-02 223 292 -6.94444444444444e-02 223 447 6.09863722023096e-19 223 390 1.66666666666667e-01 223 387 0.00000000000000e+00 223 291 4.16666666666667e-02 224 224 5.66666666666667e+01 224 58 -4.25000000000000e+00 224 57 -7.12574937207153e-17 224 158 -1.13333333333333e+01 224 44 -4.95833333333333e+00 224 157 -2.38954770684016e-16 224 43 4.25000000000000e+00 224 156 -2.67408513206419e-16 224 42 4.14842856247266e-17 224 167 5.66666666666667e+00 224 29 -4.95833333333333e+00 224 166 -2.64079461965473e-16 224 28 4.25000000000000e+00 224 165 1.33920652345410e-15 224 27 -4.74067399919287e-17 224 59 -4.95833333333333e+00 224 164 5.66666666666667e+00 224 149 -1.13333333333333e+01 224 14 -4.95833333333333e+00 224 223 -3.56659146660832e-15 224 163 -6.18833800934519e-16 224 148 -3.98617093109663e-16 224 13 -4.25000000000000e+00 224 222 1.85962356624714e-15 224 162 1.33226762955019e-15 224 147 -4.01432630626336e-16 224 12 -4.74202925190848e-17 224 160 -2.08333333333333e+00 224 159 2.08333333333333e+00 224 230 -9.72222222222222e+00 224 155 -3.47222222222222e+00 224 229 -1.49945160454745e-16 224 154 2.08333333333333e+00 224 228 8.33333333333333e+00 224 153 2.08333333333333e+00 224 227 -1.38888888888889e+00 224 152 -3.47222222222222e+00 224 226 -4.70110061989715e-16 224 151 2.08333333333333e+00 224 225 1.80194401067091e-16 224 150 -2.08333333333333e+00 224 242 1.11111111111111e+01 224 161 -3.47222222222222e+00 224 221 -1.38888888888889e+00 224 218 -9.72222222222222e+00 224 146 -3.47222222222222e+00 224 241 3.10862446895044e-15 224 220 3.94974851436469e-16 224 217 -1.64798730217797e-16 224 145 -2.08333333333333e+00 224 240 1.12019768461202e-15 224 219 3.63207727782644e-16 224 216 -8.33333333333333e+00 224 144 -2.08333333333333e+00 224 308 -6.94444444444444e-02 224 307 -4.16666666666667e-02 224 306 -4.16666666666667e-02 224 401 -1.94444444444444e-01 224 302 -6.94444444444444e-02 224 400 -1.76691072797247e-17 224 301 4.16666666666667e-02 224 399 -1.66666666666667e-01 224 300 -4.16666666666667e-02 224 398 -2.77777777777778e-02 224 299 -6.94444444444445e-02 224 397 1.40268656065312e-17 224 298 4.16666666666667e-02 224 396 2.53432257818487e-18 224 297 4.16666666666667e-02 224 449 2.22222222222222e-01 224 392 -2.77777777777778e-02 224 389 -1.94444444444444e-01 224 293 -6.94444444444445e-02 224 448 -6.93889390390723e-17 224 391 2.75963334215451e-17 224 388 -2.37846851589008e-17 224 292 -4.16666666666666e-02 224 447 -1.79503222182131e-17 224 390 -2.01932654625425e-18 224 387 1.66666666666667e-01 224 291 4.16666666666667e-02 225 225 5.55555555555556e+01 225 134 2.08333333333333e+00 225 55 -9.02056207507940e-17 225 133 -2.08333333333333e+00 225 54 -4.86111111111111e+00 225 132 -3.47222222222222e+00 225 161 -4.57966997657877e-16 225 59 -4.16666666666667e+00 225 158 -2.08333333333333e+00 225 230 -1.92554305833426e-16 225 160 8.88178419700125e-16 225 58 7.19910242530375e-17 225 157 2.08333333333333e+00 225 229 7.20994444702860e-17 225 159 5.55555555555556e+00 225 57 -4.86111111111111e+00 225 156 -3.47222222222222e+00 225 228 -1.38888888888889e+00 225 143 1.22124532708767e-15 225 209 4.84855211535518e-16 225 26 -4.16666666666667e+00 225 125 -2.08333333333333e+00 225 142 -9.79251402188908e-16 225 208 -8.33333333333333e+00 225 25 -8.32667268468867e-17 225 124 -2.08333333333333e+00 225 141 -1.11111111111111e+01 225 207 -9.72222222222222e+00 225 24 -4.86111111111111e+00 225 123 -3.47222222222222e+00 225 227 -1.77635683940025e-15 225 167 -1.17093834628434e-16 225 224 2.28766658394441e-16 225 242 -4.44089209850063e-16 225 152 -6.74807432154978e-16 225 29 4.16666666666667e+00 225 149 2.08333333333333e+00 225 218 -1.23707467880596e-16 225 226 8.88178419700125e-16 225 166 -2.75929452897561e-16 225 223 8.33333333333333e+00 225 241 9.06325253562101e-16 225 151 8.88178419700125e-16 225 28 6.41847686111419e-17 225 148 2.08333333333333e+00 225 217 5.58364118830035e-17 225 56 4.16666666666667e+00 225 165 -1.11111111111111e+01 225 222 -9.72222222222222e+00 225 240 1.11111111111111e+01 225 150 5.55555555555556e+00 225 27 -4.86111111111111e+00 225 147 -3.47222222222222e+00 225 216 -1.38888888888889e+00 226 226 5.55555555555556e+01 226 134 2.08333333333333e+00 226 55 -6.94444444444445e-01 226 133 -3.47222222222222e+00 226 54 -1.20563281580388e-16 226 132 -2.08333333333333e+00 226 161 -1.17961196366423e-15 226 59 -4.85722573273506e-17 226 158 2.08333333333333e+00 226 230 8.33333333333333e+00 226 160 5.55555555555556e+00 226 58 -6.94444444444445e-01 226 157 -3.47222222222222e+00 226 229 -9.72222222222223e+00 226 159 8.88178419700125e-16 226 57 6.24500451351651e-17 226 156 2.08333333333333e+00 226 228 5.03069808033274e-17 226 143 3.10862446895044e-15 226 209 -7.67615138119737e-16 226 26 1.21430643318376e-17 226 125 -2.08333333333333e+00 226 142 5.55555555555556e+00 226 208 -9.72222222222222e+00 226 25 -6.94444444444443e-01 226 124 -3.47222222222222e+00 226 141 -9.64180991991359e-16 226 207 -8.33333333333333e+00 226 24 -1.06685493772574e-16 226 123 -2.08333333333333e+00 226 227 -1.77635683940025e-15 226 167 2.22044604925031e-15 226 224 -5.25621213220973e-16 226 242 1.51777462126246e-15 226 152 -1.27382913245322e-15 226 29 -1.83013326715553e-16 226 149 -2.08333333333333e+00 226 218 -8.33333333333333e+00 226 56 6.93889390390723e-16 226 166 5.55555555555555e+00 226 223 -9.72222222222222e+00 226 241 -2.22222222222222e+01 226 151 5.55555555555556e+00 226 28 -6.94444444444445e-01 226 148 -3.47222222222222e+00 226 217 -9.72222222222223e+00 226 225 8.88178419700125e-16 226 165 -4.51895465491958e-16 226 222 8.33333333333333e+00 226 240 1.14199014827898e-15 226 150 8.88178419700125e-16 226 27 5.55111512312578e-17 226 147 2.08333333333333e+00 226 216 1.47451495458029e-17 227 227 5.55555555555556e+01 227 134 -3.47222222222222e+00 227 55 5.68989300120393e-16 227 133 2.08333333333333e+00 227 54 4.16666666666667e+00 227 132 2.08333333333333e+00 227 161 -1.11111111111111e+01 227 59 -4.86111111111111e+00 227 158 -3.47222222222222e+00 227 230 -9.72222222222222e+00 227 160 -1.48893484347434e-15 227 58 -1.21430643318376e-16 227 157 2.08333333333333e+00 227 229 8.33333333333333e+00 227 159 -6.74807432154978e-16 227 57 -4.16666666666667e+00 227 156 -2.08333333333333e+00 227 228 -1.21322223101128e-16 227 143 5.55555555555556e+00 227 209 -1.38888888888889e+00 227 26 -4.86111111111111e+00 227 125 -3.47222222222222e+00 227 142 2.66453525910038e-15 227 208 -6.93130448869983e-16 227 25 8.32667268468867e-17 227 124 -2.08333333333333e+00 227 141 1.39731975989932e-15 227 207 5.12502366933898e-16 227 24 -4.16666666666667e+00 227 123 -2.08333333333333e+00 227 56 -4.86111111111111e+00 227 167 5.55555555555555e+00 227 224 -1.38888888888889e+00 227 242 1.11111111111111e+01 227 152 -1.11111111111111e+01 227 29 -4.86111111111111e+00 227 149 -3.47222222222222e+00 227 218 -9.72222222222222e+00 227 226 -1.77635683940025e-15 227 166 2.22044604925031e-15 227 223 -4.93420408698153e-16 227 241 1.61754832618544e-15 227 151 -1.62456853525228e-15 227 28 -2.22044604925031e-16 227 148 -2.08333333333333e+00 227 217 -8.33333333333333e+00 227 225 -1.77635683940025e-15 227 165 -1.04083408558608e-16 227 222 2.46330733588707e-16 227 240 -4.44089209850063e-16 227 150 -5.13478148889135e-16 227 27 4.16666666666667e+00 227 147 2.08333333333333e+00 227 216 -9.02056207507940e-17 228 228 5.55555555555556e+01 228 143 -2.08333333333333e+00 228 55 4.16666666666667e+00 228 142 2.08333333333333e+00 228 54 -4.86111111111111e+00 228 141 -3.47222222222222e+00 228 161 0.00000000000000e+00 228 59 2.80157841370254e-16 228 227 -6.40763483938933e-17 228 167 2.08333333333333e+00 228 160 4.85722573273506e-16 228 58 -4.16666666666667e+00 228 226 5.72458747072346e-17 228 166 -2.08333333333333e+00 228 159 5.55555555555555e+00 228 57 -4.86111111111111e+00 228 225 -1.38888888888889e+00 228 165 -3.47222222222222e+00 228 158 6.69494841509799e-16 228 44 1.61329283265843e-16 228 224 8.33333333333333e+00 228 164 2.08333333333333e+00 228 157 -3.94649590784724e-16 228 43 4.16666666666667e+00 228 223 7.61109925084824e-17 228 163 2.08333333333333e+00 228 156 -1.11111111111111e+01 228 42 -4.86111111111111e+00 228 222 -9.72222222222223e+00 228 162 -3.47222222222222e+00 228 134 -2.72351585728359e-16 228 230 -8.88178419700125e-16 228 155 0.00000000000000e+00 228 41 1.59594559789866e-16 228 209 -8.33333333333333e+00 228 242 -1.86442116086039e-16 228 221 -1.18178036800920e-17 228 140 -2.08333333333333e+00 228 133 -9.50628464835290e-16 228 229 1.77635683940025e-15 228 154 3.10515502199848e-16 228 40 -4.16666666666667e+00 228 208 -9.88792381306780e-17 228 241 8.88178419700125e-16 228 220 5.58364118830035e-17 228 139 -2.08333333333333e+00 228 132 -1.11111111111111e+01 228 56 1.45716771982052e-16 228 153 5.55555555555555e+00 228 39 -4.86111111111111e+00 228 207 -9.72222222222222e+00 228 240 1.11111111111111e+01 228 219 -1.38888888888889e+00 228 138 -3.47222222222222e+00 229 229 5.55555555555556e+01 229 143 2.08333333333333e+00 229 55 -4.86111111111111e+00 229 142 -3.47222222222222e+00 229 54 4.16666666666667e+00 229 141 2.08333333333333e+00 229 161 6.76000054544712e-16 229 59 1.08420217248550e-16 229 227 8.33333333333333e+00 229 167 2.08333333333333e+00 229 160 -1.11111111111111e+01 229 58 -4.86111111111111e+00 229 226 -9.72222222222223e+00 229 166 -3.47222222222222e+00 229 159 4.21537804662364e-16 229 57 -4.16666666666667e+00 229 225 1.96132173002628e-16 229 165 -2.08333333333333e+00 229 158 1.33226762955019e-15 229 44 -4.99600361081320e-16 229 224 -1.49945160454745e-16 229 164 -2.08333333333333e+00 229 157 5.55555555555555e+00 229 43 -4.86111111111111e+00 229 223 -1.38888888888889e+00 229 163 -3.47222222222222e+00 229 156 -5.06539254985228e-16 229 42 4.16666666666667e+00 229 222 4.16333634234434e-17 229 162 2.08333333333333e+00 229 134 1.33226762955019e-15 229 230 0.00000000000000e+00 229 155 5.95877513998033e-16 229 41 -2.63677968348475e-16 229 209 -3.53124647578529e-16 229 242 -1.50681062679320e-15 229 221 -8.33333333333333e+00 229 140 -2.08333333333333e+00 229 133 5.55555555555556e+00 229 56 -3.19189119579733e-16 229 154 -1.11111111111111e+01 229 40 -4.86111111111111e+00 229 208 -1.38888888888889e+00 229 241 1.11111111111111e+01 229 220 -9.72222222222223e+00 229 139 -3.47222222222222e+00 229 132 -8.90780504914090e-16 229 228 8.88178419700125e-16 229 153 4.85722573273506e-16 229 39 -4.16666666666667e+00 229 207 -1.85506991712270e-16 229 240 8.88178419700125e-16 229 219 1.47451495458029e-17 229 138 -2.08333333333333e+00 230 230 5.55555555555556e+01 230 143 -3.47222222222222e+00 230 55 -2.42861286636753e-16 230 142 2.08333333333333e+00 230 54 5.55111512312578e-17 230 141 -2.08333333333333e+00 230 161 5.55555555555556e+00 230 59 -6.94444444444445e-01 230 227 -9.72222222222222e+00 230 167 -3.47222222222222e+00 230 160 7.62410967691807e-16 230 58 1.38777878078145e-17 230 226 8.33333333333333e+00 230 166 2.08333333333333e+00 230 159 0.00000000000000e+00 230 57 3.46944695195361e-16 230 225 -2.55004350968591e-16 230 165 2.08333333333333e+00 230 158 5.55555555555555e+00 230 44 -6.94444444444445e-01 230 224 -9.72222222222222e+00 230 164 -3.47222222222222e+00 230 157 8.88178419700125e-16 230 43 -4.61436444609831e-16 230 223 -6.07153216591882e-17 230 163 -2.08333333333333e+00 230 156 5.79397640976254e-16 230 42 1.17961196366423e-16 230 222 8.33333333333333e+00 230 162 2.08333333333333e+00 230 134 5.55555555555556e+00 230 56 -6.94444444444443e-01 230 155 5.55555555555556e+00 230 41 -6.94444444444444e-01 230 209 -9.72222222222222e+00 230 242 -2.22222222222222e+01 230 221 -9.72222222222222e+00 230 140 -3.47222222222222e+00 230 133 8.88178419700125e-16 230 229 0.00000000000000e+00 230 154 5.58038858178289e-16 230 40 -2.22911966663020e-16 230 208 -1.49186218934005e-16 230 241 -1.18763505974062e-15 230 220 -8.33333333333333e+00 230 139 -2.08333333333333e+00 230 132 -2.79507320066763e-16 230 228 -8.88178419700125e-16 230 153 0.00000000000000e+00 230 39 1.80411241501588e-16 230 207 -8.33333333333333e+00 230 240 -1.41813644161104e-16 230 219 2.16840434497101e-17 230 138 -2.08333333333333e+00 231 231 1.11111111111111e+02 231 46 0.00000000000000e+00 231 45 0.00000000000000e+00 231 80 -7.45931094670027e-17 231 50 -2.08333333333333e+00 231 79 3.38271077815477e-17 231 49 -2.08333333333333e+00 231 78 -1.38888888888889e+00 231 48 -3.47222222222222e+00 231 77 -8.33333333333333e+00 231 35 -2.08333333333333e+00 231 76 -6.68952740423556e-17 231 34 2.08333333333333e+00 231 75 -9.72222222222223e+00 231 33 -3.47222222222222e+00 231 83 0.00000000000000e+00 231 185 5.58364118830035e-16 231 74 3.72965547335014e-17 231 32 0.00000000000000e+00 231 82 0.00000000000000e+00 231 184 8.88178419700125e-16 231 73 7.92551788086904e-17 231 31 0.00000000000000e+00 231 81 0.00000000000000e+00 231 183 1.11111111111111e+01 231 72 -1.38888888888889e+00 231 30 0.00000000000000e+00 231 95 0.00000000000000e+00 231 17 0.00000000000000e+00 231 94 0.00000000000000e+00 231 16 0.00000000000000e+00 231 93 0.00000000000000e+00 231 15 0.00000000000000e+00 231 179 1.33226762955019e-15 231 92 1.72388145425195e-16 231 68 1.78459677591114e-16 231 20 2.08333333333333e+00 231 178 3.75892893200724e-16 231 91 -8.33333333333333e+00 231 67 1.45716771982052e-16 231 19 -2.08333333333333e+00 231 177 1.11111111111111e+01 231 90 -9.72222222222222e+00 231 66 -1.38888888888889e+00 231 18 -3.47222222222222e+00 231 176 -3.55848705536899e-16 231 89 -1.84314369322536e-17 231 65 8.33333333333333e+00 231 5 2.08333333333333e+00 231 175 -8.53917631049583e-16 231 88 8.33333333333333e+00 231 64 -1.17202254845683e-16 231 4 2.08333333333333e+00 231 174 -2.22222222222222e+01 231 87 -9.72222222222222e+00 231 63 -9.72222222222223e+00 231 3 -3.47222222222222e+00 231 182 0.00000000000000e+00 231 233 0.00000000000000e+00 231 173 1.33226762955019e-15 231 86 0.00000000000000e+00 231 71 0.00000000000000e+00 231 170 3.63519435907234e-16 231 62 1.75966012594397e-16 231 2 0.00000000000000e+00 231 181 0.00000000000000e+00 231 232 -1.77635683940025e-15 231 172 5.48877349820787e-16 231 85 0.00000000000000e+00 231 70 0.00000000000000e+00 231 169 4.44089209850063e-16 231 61 7.67615138119737e-17 231 1 0.00000000000000e+00 231 180 0.00000000000000e+00 231 47 0.00000000000000e+00 231 171 1.11111111111111e+01 231 84 0.00000000000000e+00 231 69 0.00000000000000e+00 231 168 1.11111111111111e+01 231 60 -1.38888888888889e+00 231 0 0.00000000000000e+00 232 232 1.11111111111111e+02 232 46 0.00000000000000e+00 232 45 0.00000000000000e+00 232 80 -8.33333333333333e+00 232 50 -2.08333333333333e+00 232 79 -9.72222222222223e+00 232 49 -3.47222222222222e+00 232 78 7.68699340292223e-17 232 48 -2.08333333333333e+00 232 77 -3.23525928269675e-16 232 35 2.08333333333333e+00 232 76 -1.38888888888889e+00 232 34 -3.47222222222222e+00 232 75 -6.33174068731535e-17 232 33 2.08333333333333e+00 232 83 0.00000000000000e+00 232 185 2.50559122061400e-16 232 74 8.33333333333333e+00 232 32 0.00000000000000e+00 232 82 0.00000000000000e+00 232 184 1.11111111111111e+01 232 73 -9.72222222222223e+00 232 31 0.00000000000000e+00 232 81 0.00000000000000e+00 232 183 8.88178419700125e-16 232 72 1.45716771982052e-16 232 30 0.00000000000000e+00 232 95 0.00000000000000e+00 232 17 0.00000000000000e+00 232 94 0.00000000000000e+00 232 16 0.00000000000000e+00 232 93 0.00000000000000e+00 232 15 0.00000000000000e+00 232 179 1.56816291722872e-16 232 92 2.33645568170626e-16 232 68 8.33333333333333e+00 232 20 2.08333333333333e+00 232 178 -2.22222222222222e+01 232 91 -9.72222222222222e+00 232 67 -9.72222222222223e+00 232 19 -3.47222222222222e+00 232 177 4.39589770834248e-16 232 90 -8.33333333333333e+00 232 66 7.76288755499621e-17 232 18 -2.08333333333333e+00 232 176 1.33226762955019e-15 232 89 3.51281503885303e-16 232 65 2.33970828822372e-16 232 5 -2.08333333333333e+00 232 175 1.11111111111111e+01 232 88 -9.72222222222222e+00 232 64 -1.38888888888889e+00 232 4 -3.47222222222222e+00 232 174 -6.54966532398493e-16 232 87 8.33333333333333e+00 232 63 -9.71445146547012e-17 232 3 2.08333333333333e+00 232 182 0.00000000000000e+00 232 233 -2.66453525910038e-15 232 173 -4.13189447934226e-16 232 86 0.00000000000000e+00 232 71 0.00000000000000e+00 232 170 8.84573447476611e-17 232 62 -8.33333333333333e+00 232 2 0.00000000000000e+00 232 181 0.00000000000000e+00 232 47 0.00000000000000e+00 232 172 -2.22222222222222e+01 232 85 0.00000000000000e+00 232 70 0.00000000000000e+00 232 169 1.11111111111111e+01 232 61 -9.72222222222223e+00 232 1 0.00000000000000e+00 232 180 0.00000000000000e+00 232 231 -8.88178419700125e-16 232 171 3.74158169724748e-16 232 84 0.00000000000000e+00 232 69 0.00000000000000e+00 232 168 8.88178419700125e-16 232 60 3.38271077815477e-17 232 0 0.00000000000000e+00 233 233 1.11111111111111e+02 233 46 0.00000000000000e+00 233 45 0.00000000000000e+00 233 80 -9.72222222222222e+00 233 50 -3.47222222222222e+00 233 79 -8.33333333333333e+00 233 49 -2.08333333333333e+00 233 78 1.75966012594397e-16 233 48 -2.08333333333333e+00 233 77 -9.72222222222222e+00 233 35 -3.47222222222222e+00 233 76 -3.83048627539129e-16 233 34 2.08333333333333e+00 233 75 -8.33333333333333e+00 233 33 -2.08333333333333e+00 233 83 0.00000000000000e+00 233 185 -2.22222222222222e+01 233 74 -9.72222222222222e+00 233 32 0.00000000000000e+00 233 82 0.00000000000000e+00 233 184 9.53962386515683e-17 233 73 8.33333333333333e+00 233 31 0.00000000000000e+00 233 81 0.00000000000000e+00 233 183 1.41488383509358e-16 233 72 1.76833374332386e-16 233 30 0.00000000000000e+00 233 95 0.00000000000000e+00 233 17 0.00000000000000e+00 233 94 0.00000000000000e+00 233 16 0.00000000000000e+00 233 93 0.00000000000000e+00 233 15 0.00000000000000e+00 233 179 1.11111111111111e+01 233 92 -1.38888888888889e+00 233 68 -9.72222222222222e+00 233 20 -3.47222222222222e+00 233 178 3.63966669303384e-16 233 91 2.02962646689286e-16 233 67 8.33333333333333e+00 233 19 2.08333333333333e+00 233 177 1.33226762955019e-15 233 90 1.48318857196017e-16 233 66 3.72965547335014e-17 233 18 2.08333333333333e+00 233 176 1.11111111111111e+01 233 89 -1.38888888888889e+00 233 65 -9.72222222222222e+00 233 5 -3.47222222222222e+00 233 175 1.33226762955019e-15 233 88 4.06250554030319e-16 233 64 2.61943244872498e-16 233 4 -2.08333333333333e+00 233 174 -4.52871247447195e-16 233 87 -2.04697370165263e-16 233 63 8.33333333333333e+00 233 3 2.08333333333333e+00 233 182 0.00000000000000e+00 233 47 0.00000000000000e+00 233 173 1.11111111111111e+01 233 86 0.00000000000000e+00 233 71 0.00000000000000e+00 233 170 -2.22222222222222e+01 233 62 -9.72222222222222e+00 233 2 0.00000000000000e+00 233 181 0.00000000000000e+00 233 232 -2.66453525910038e-15 233 172 -2.80455996967688e-16 233 85 0.00000000000000e+00 233 70 0.00000000000000e+00 233 169 1.95047970830142e-16 233 61 -8.33333333333333e+00 233 1 0.00000000000000e+00 233 180 0.00000000000000e+00 233 231 0.00000000000000e+00 233 171 1.33226762955019e-15 233 84 0.00000000000000e+00 233 69 0.00000000000000e+00 233 168 5.58364118830035e-16 233 60 3.64291929955129e-17 233 0 0.00000000000000e+00 234 234 1.11111111111111e+02 234 49 2.08333333333333e+00 234 48 -3.47222222222222e+00 234 113 8.76035355368288e-17 234 53 -2.08333333333333e+00 234 112 -3.72965547335014e-17 234 52 -2.08333333333333e+00 234 111 -1.38888888888889e+00 234 51 -3.47222222222222e+00 234 110 -8.33333333333333e+00 234 38 -2.08333333333333e+00 234 109 -1.11022302462516e-16 234 37 2.08333333333333e+00 234 108 -9.72222222222223e+00 234 36 -3.47222222222222e+00 234 77 8.33333333333333e+00 234 200 6.80987384538145e-16 234 107 1.98625837999344e-16 234 35 2.08333333333333e+00 234 76 -6.07153216591882e-18 234 199 4.44089209850063e-16 234 106 7.60025722912339e-17 234 34 -2.08333333333333e+00 234 75 -9.72222222222223e+00 234 198 1.11111111111111e+01 234 105 -1.38888888888889e+00 234 33 -3.47222222222222e+00 234 92 -2.17707796235089e-16 234 20 -2.08333333333333e+00 234 91 8.33333333333333e+00 234 19 2.08333333333333e+00 234 90 -9.72222222222222e+00 234 18 -3.47222222222222e+00 234 197 1.77635683940025e-15 234 119 -2.77555756156289e-17 234 104 1.68051336735253e-16 234 23 2.08333333333333e+00 234 196 3.60063541482436e-16 234 118 -8.33333333333333e+00 234 103 4.33680868994202e-18 234 22 -2.08333333333333e+00 234 195 1.11111111111111e+01 234 117 -9.72222222222222e+00 234 102 -1.38888888888889e+00 234 21 -3.47222222222222e+00 234 194 -3.15174861036105e-15 234 116 -2.54136989230602e-16 234 101 8.33333333333333e+00 234 8 2.08333333333333e+00 234 193 -1.06151524202625e-15 234 115 8.33333333333333e+00 234 100 -9.97465998686664e-17 234 7 2.08333333333333e+00 234 192 -2.22222222222222e+01 234 114 -9.72222222222222e+00 234 99 -9.72222222222223e+00 234 6 -3.47222222222222e+00 234 176 -2.21394083621540e-16 234 236 3.55271367880050e-15 234 191 1.77635683940025e-15 234 89 3.03576608295941e-17 234 65 -8.33333333333333e+00 234 188 2.95756800126890e-16 234 98 1.68159756952502e-16 234 5 -2.08333333333333e+00 234 175 5.93167008566819e-16 234 235 -8.88178419700125e-16 234 190 -2.20364091557679e-17 234 88 -8.33333333333333e+00 234 64 6.93889390390723e-18 234 187 8.88178419700125e-16 234 97 1.29020058525775e-17 234 4 -2.08333333333333e+00 234 174 -2.22222222222222e+01 234 50 2.08333333333333e+00 234 189 1.11111111111111e+01 234 87 -9.72222222222222e+00 234 63 -9.72222222222223e+00 234 186 1.11111111111111e+01 234 96 -1.38888888888889e+00 234 3 -3.47222222222222e+00 235 235 1.11111111111111e+02 235 49 -3.47222222222222e+00 235 48 2.08333333333333e+00 235 113 -8.33333333333333e+00 235 53 -2.08333333333333e+00 235 112 -9.72222222222223e+00 235 52 -3.47222222222222e+00 235 111 4.07660016854550e-17 235 51 -2.08333333333333e+00 235 110 1.05818132034585e-16 235 38 2.08333333333333e+00 235 109 -1.38888888888889e+00 235 37 -3.47222222222222e+00 235 108 -2.16840434497101e-17 235 36 2.08333333333333e+00 235 77 -1.88217497143484e-16 235 200 -3.29597460435593e-17 235 107 8.33333333333333e+00 235 35 2.08333333333333e+00 235 76 -1.38888888888889e+00 235 199 1.11111111111111e+01 235 106 -9.72222222222223e+00 235 34 -3.47222222222222e+00 235 75 4.33680868994202e-17 235 198 8.88178419700125e-16 235 105 -9.54097911787244e-18 235 33 -2.08333333333333e+00 235 92 3.78169717762944e-16 235 20 2.08333333333333e+00 235 91 -9.72222222222222e+00 235 19 -3.47222222222222e+00 235 90 8.33333333333333e+00 235 18 2.08333333333333e+00 235 197 1.70639869422062e-16 235 119 -9.44556932669371e-16 235 104 8.33333333333333e+00 235 23 2.08333333333333e+00 235 196 -2.22222222222222e+01 235 118 -9.72222222222222e+00 235 103 -9.72222222222223e+00 235 22 -3.47222222222222e+00 235 195 1.51435938441913e-16 235 117 -8.33333333333333e+00 235 102 7.52436307704940e-17 235 21 -2.08333333333333e+00 235 194 3.99680288865056e-15 235 116 7.88431819831459e-16 235 101 3.95300112088215e-16 235 8 -2.08333333333333e+00 235 193 1.11111111111111e+01 235 115 -9.72222222222222e+00 235 100 -1.38888888888889e+00 235 7 -3.47222222222222e+00 235 192 -1.04874876144523e-15 235 114 8.33333333333333e+00 235 99 -4.85722573273506e-17 235 6 2.08333333333333e+00 235 176 2.22044604925031e-15 235 236 -1.77635683940025e-15 235 191 -4.68375338513738e-17 235 89 1.43982048506075e-16 235 65 3.49763620843824e-16 235 188 9.51929507442273e-17 235 98 -8.33333333333334e+00 235 5 -2.08333333333333e+00 235 175 1.11111111111111e+01 235 50 -2.08333333333333e+00 235 190 -2.22222222222222e+01 235 88 -9.72222222222222e+00 235 64 -1.38888888888889e+00 235 187 1.11111111111111e+01 235 97 -9.72222222222223e+00 235 4 -3.47222222222222e+00 235 174 7.89759967492754e-16 235 234 -1.77635683940025e-15 235 189 1.27610595701544e-16 235 87 -8.33333333333333e+00 235 63 9.62771529167128e-17 235 186 8.88178419700125e-16 235 96 -5.11743425413158e-17 235 3 -2.08333333333333e+00 236 236 1.11111111111111e+02 236 49 -2.08333333333333e+00 236 48 2.08333333333333e+00 236 113 -9.72222222222222e+00 236 53 -3.47222222222222e+00 236 112 -8.33333333333334e+00 236 52 -2.08333333333333e+00 236 111 1.67400815431762e-16 236 51 -2.08333333333333e+00 236 110 -9.72222222222222e+00 236 38 -3.47222222222222e+00 236 109 2.63677968348475e-16 236 37 2.08333333333333e+00 236 108 -8.33333333333333e+00 236 36 -2.08333333333333e+00 236 77 -9.72222222222222e+00 236 200 -2.22222222222222e+01 236 107 -9.72222222222222e+00 236 35 -3.47222222222222e+00 236 76 -3.02926086992450e-16 236 199 2.37548695991574e-16 236 106 8.33333333333333e+00 236 34 2.08333333333333e+00 236 75 8.33333333333333e+00 236 198 4.06779102589405e-16 236 105 5.71374544899861e-17 236 33 2.08333333333333e+00 236 92 -1.38888888888889e+00 236 20 -3.47222222222222e+00 236 91 3.22658566531686e-16 236 19 2.08333333333333e+00 236 90 -1.72062884773450e-16 236 18 -2.08333333333333e+00 236 197 1.11111111111111e+01 236 119 -1.38888888888889e+00 236 104 -9.72222222222222e+00 236 23 -3.47222222222222e+00 236 196 3.41740524767431e-16 236 118 -1.12583553590895e-15 236 103 8.33333333333333e+00 236 22 2.08333333333333e+00 236 195 1.77635683940025e-15 236 117 3.38271077815477e-17 236 102 1.36175792864179e-16 236 21 2.08333333333333e+00 236 194 1.11111111111111e+01 236 116 -1.38888888888889e+00 236 101 -9.72222222222222e+00 236 8 -3.47222222222222e+00 236 193 2.66453525910038e-15 236 115 8.25403113913215e-16 236 100 5.35162192338845e-16 236 7 -2.08333333333333e+00 236 192 -3.19286697775256e-15 236 114 -2.08166817117217e-16 236 99 8.33333333333333e+00 236 6 2.08333333333333e+00 236 176 1.11111111111111e+01 236 50 -3.47222222222222e+00 236 191 1.11111111111111e+01 236 89 -1.38888888888889e+00 236 65 -9.72222222222222e+00 236 188 -2.22222222222222e+01 236 98 -9.72222222222222e+00 236 5 -3.47222222222222e+00 236 175 2.66453525910038e-15 236 235 -1.77635683940025e-15 236 190 -3.88049510059718e-16 236 88 1.44957830461312e-16 236 64 5.90673343570103e-16 236 187 -1.50920942409982e-16 236 97 -8.33333333333333e+00 236 4 -2.08333333333333e+00 236 174 -1.68715410565901e-16 236 234 3.55271367880050e-15 236 189 1.77635683940025e-15 236 87 -8.99887803162969e-18 236 63 -8.33333333333333e+00 236 186 7.30427003603484e-16 236 96 8.76035355368288e-17 236 3 -2.08333333333333e+00 237 237 1.11111111111111e+02 237 52 2.08333333333333e+00 237 51 -3.47222222222222e+00 237 137 1.78676518025611e-16 237 56 -2.08333333333333e+00 237 136 4.68375338513738e-17 237 55 -2.08333333333333e+00 237 135 -1.38888888888889e+00 237 54 -3.47222222222222e+00 237 134 -8.33333333333333e+00 237 41 -2.08333333333333e+00 237 133 5.75060832286312e-16 237 40 2.08333333333333e+00 237 132 -9.72222222222222e+00 237 39 -3.47222222222222e+00 237 110 8.33333333333333e+00 237 215 8.03393809811759e-16 237 131 2.35055030994857e-16 237 38 2.08333333333333e+00 237 109 -2.77555756156289e-16 237 214 4.44089209850063e-16 237 130 -5.19332840620557e-17 237 37 -2.08333333333333e+00 237 108 -9.72222222222223e+00 237 213 1.11111111111111e+01 237 129 -1.38888888888889e+00 237 36 -3.47222222222222e+00 237 119 -5.46437894932694e-16 237 23 -2.08333333333333e+00 237 118 8.33333333333333e+00 237 22 2.08333333333333e+00 237 117 -9.72222222222222e+00 237 21 -3.47222222222222e+00 237 212 2.22044604925031e-15 237 143 -1.33573707650214e-16 237 128 2.65521112041700e-16 237 26 2.08333333333333e+00 237 211 -8.82540568403201e-17 237 142 -8.33333333333333e+00 237 127 3.38271077815477e-17 237 25 -2.08333333333333e+00 237 210 1.11111111111111e+01 237 141 -9.72222222222222e+00 237 126 -1.38888888888889e+00 237 24 -3.47222222222222e+00 237 209 -1.76495916406200e-15 237 140 -3.34801630863524e-16 237 125 8.33333333333333e+00 237 11 2.08333333333333e+00 237 208 3.39508423544826e-15 237 139 8.33333333333333e+00 237 124 5.55111512312578e-16 237 10 2.08333333333333e+00 237 207 -2.22222222222222e+01 237 138 -9.72222222222222e+00 237 123 -9.72222222222222e+00 237 9 -3.47222222222222e+00 237 194 -2.43392545701271e-15 237 239 3.55271367880050e-15 237 206 2.66453525910038e-15 237 116 -5.12610787151146e-16 237 101 -8.33333333333333e+00 237 203 1.32677885605198e-15 237 122 5.40583203201273e-16 237 8 -2.08333333333333e+00 237 193 -3.10515502199848e-16 237 238 -5.32907051820075e-15 237 205 -4.56205169127588e-16 237 115 -8.33333333333333e+00 237 100 -2.22044604925031e-16 237 202 4.44089209850063e-16 237 121 -2.58040117051550e-17 237 7 -2.08333333333333e+00 237 192 -2.22222222222222e+01 237 53 2.08333333333333e+00 237 204 1.11111111111111e+01 237 114 -9.72222222222222e+00 237 99 -9.72222222222223e+00 237 201 1.11111111111111e+01 237 120 -1.38888888888889e+00 237 6 -3.47222222222222e+00 238 238 1.11111111111111e+02 238 52 -3.47222222222222e+00 238 51 2.08333333333333e+00 238 137 -8.33333333333334e+00 238 56 -2.08333333333333e+00 238 136 -9.72222222222223e+00 238 55 -3.47222222222222e+00 238 135 5.74627151417317e-17 238 54 -2.08333333333333e+00 238 134 1.34614541735800e-15 238 41 2.08333333333333e+00 238 133 -1.38888888888889e+00 238 40 -3.47222222222222e+00 238 132 5.20417042793042e-16 238 39 2.08333333333333e+00 238 110 1.69135538907739e-16 238 215 1.22785896033983e-15 238 131 8.33333333333333e+00 238 38 2.08333333333333e+00 238 109 -1.38888888888889e+00 238 214 1.11111111111111e+01 238 130 -9.72222222222223e+00 238 37 -3.47222222222222e+00 238 108 -3.10515502199848e-16 238 213 0.00000000000000e+00 238 129 -7.71951946809679e-17 238 36 -2.08333333333333e+00 238 119 1.57339419271096e-15 238 23 2.08333333333333e+00 238 118 -9.72222222222222e+00 238 22 -3.47222222222222e+00 238 117 8.33333333333333e+00 238 21 2.08333333333333e+00 238 212 -1.66968489815483e-15 238 143 -8.15753714578094e-16 238 128 8.33333333333333e+00 238 26 2.08333333333333e+00 238 211 -2.22222222222222e+01 238 142 -9.72222222222222e+00 238 127 -9.72222222222223e+00 238 25 -3.47222222222222e+00 238 210 9.71716197090133e-17 238 141 -8.33333333333333e+00 238 126 3.04660810468427e-17 238 24 -2.08333333333333e+00 238 209 3.55271367880050e-15 238 140 3.10515502199848e-16 238 125 -9.02164627725188e-16 238 11 -2.08333333333333e+00 238 208 1.11111111111111e+01 238 139 -9.72222222222222e+00 238 124 -1.38888888888889e+00 238 10 -3.47222222222222e+00 238 207 3.32828382909600e-15 238 138 8.33333333333333e+00 238 123 6.34908792207511e-16 238 9 2.08333333333333e+00 238 194 8.88178419700125e-16 238 239 2.66453525910038e-15 238 206 -2.29709914284504e-15 238 116 -2.09901540593194e-16 238 101 -2.22478285794026e-16 238 203 7.46798456408015e-16 238 122 -8.33333333333334e+00 238 8 -2.08333333333333e+00 238 193 1.11111111111111e+01 238 53 -2.08333333333333e+00 238 205 -2.22222222222222e+01 238 115 -9.72222222222222e+00 238 100 -1.38888888888889e+00 238 202 1.11111111111111e+01 238 121 -9.72222222222223e+00 238 7 -3.47222222222222e+00 238 192 -5.05970048844673e-16 238 237 -5.32907051820075e-15 238 204 -5.30500122997157e-16 238 114 -8.33333333333333e+00 238 99 -2.40150781205539e-16 238 201 0.00000000000000e+00 238 120 4.07660016854550e-17 238 6 -2.08333333333333e+00 239 239 1.11111111111111e+02 239 52 -2.08333333333333e+00 239 51 2.08333333333333e+00 239 137 -9.72222222222222e+00 239 56 -3.47222222222222e+00 239 136 -8.33333333333334e+00 239 55 -2.08333333333333e+00 239 135 4.29560900738757e-16 239 54 -2.08333333333333e+00 239 134 -9.72222222222222e+00 239 41 -3.47222222222222e+00 239 133 1.16616785672541e-15 239 40 2.08333333333333e+00 239 132 -8.33333333333333e+00 239 39 -2.08333333333333e+00 239 110 -9.72222222222222e+00 239 215 -2.22222222222222e+01 239 131 -9.72222222222222e+00 239 38 -3.47222222222222e+00 239 109 1.69460799559484e-16 239 214 9.68843061333047e-16 239 130 8.33333333333333e+00 239 37 2.08333333333333e+00 239 108 8.33333333333333e+00 239 213 1.43790957873174e-15 239 129 4.31187203997485e-16 239 36 2.08333333333333e+00 239 119 -1.38888888888889e+00 239 23 -3.47222222222222e+00 239 118 1.64104840827406e-15 239 22 2.08333333333333e+00 239 117 -5.88613359442380e-16 239 21 -2.08333333333333e+00 239 212 1.11111111111111e+01 239 143 -1.38888888888889e+00 239 128 -9.72222222222222e+00 239 26 -3.47222222222222e+00 239 211 -1.91545997813014e-15 239 142 -9.15066633577766e-16 239 127 8.33333333333333e+00 239 25 2.08333333333333e+00 239 210 2.22044604925031e-15 239 141 -1.59594559789866e-16 239 126 9.62771529167128e-17 239 24 2.08333333333333e+00 239 209 1.11111111111111e+01 239 140 -1.38888888888889e+00 239 125 -9.72222222222222e+00 239 11 -3.47222222222222e+00 239 208 3.10862446895044e-15 239 139 2.56522234010070e-16 239 124 -1.00787433954252e-15 239 10 -2.08333333333333e+00 239 207 -1.58271833139434e-15 239 138 -3.50414142147315e-16 239 123 8.33333333333333e+00 239 9 2.08333333333333e+00 239 194 1.11111111111111e+01 239 53 -3.47222222222222e+00 239 206 1.11111111111111e+01 239 116 -1.38888888888889e+00 239 101 -9.72222222222222e+00 239 203 -2.22222222222222e+01 239 122 -9.72222222222222e+00 239 8 -3.47222222222222e+00 239 193 1.77635683940025e-15 239 238 2.66453525910038e-15 239 205 -2.32194092512211e-15 239 115 -1.92879566485171e-16 239 100 -3.15719672627779e-16 239 202 1.11683665787732e-15 239 121 -8.33333333333334e+00 239 7 -2.08333333333333e+00 239 192 -2.47236042402732e-15 239 237 3.55271367880050e-15 239 204 2.66453525910038e-15 239 114 -4.36716635077161e-16 239 99 -8.33333333333333e+00 239 201 7.70542483985448e-16 239 120 2.14238349283136e-16 239 6 -2.08333333333333e+00 240 240 1.11111111111111e+02 240 55 2.08333333333333e+00 240 54 -3.47222222222222e+00 240 161 -1.38777878078145e-16 240 59 -2.08333333333333e+00 240 160 2.16840434497101e-17 240 58 -2.08333333333333e+00 240 159 -1.38888888888889e+00 240 57 -3.47222222222222e+00 240 158 -8.33333333333333e+00 240 44 -2.08333333333333e+00 240 157 1.05601291600088e-16 240 43 2.08333333333333e+00 240 156 -9.72222222222223e+00 240 42 -3.47222222222222e+00 240 134 8.33333333333333e+00 240 230 -3.12683906544819e-16 240 155 -1.92554305833426e-16 240 41 2.08333333333333e+00 240 133 -1.39645239816133e-16 240 229 8.88178419700125e-16 240 154 7.20994444702860e-17 240 40 -2.08333333333333e+00 240 132 -9.72222222222222e+00 240 228 1.11111111111111e+01 240 153 -1.38888888888889e+00 240 39 -3.47222222222222e+00 240 143 1.25767452008319e-16 240 26 -2.08333333333333e+00 240 142 8.33333333333333e+00 240 25 2.08333333333333e+00 240 141 -9.72222222222222e+00 240 24 -3.47222222222222e+00 240 227 -4.44089209850063e-16 240 167 5.38523219073550e-16 240 152 -6.40763483938933e-17 240 29 2.08333333333333e+00 240 226 1.24867564205156e-15 240 166 -8.33333333333333e+00 240 151 2.25514051876985e-17 240 28 -2.08333333333333e+00 240 225 1.11111111111111e+01 240 165 -9.72222222222222e+00 240 150 -1.38888888888889e+00 240 27 -3.47222222222222e+00 240 224 1.33432761367791e-15 240 164 3.25911173049143e-16 240 149 8.33333333333333e+00 240 14 2.08333333333333e+00 240 223 -5.66942868519826e-16 240 163 8.33333333333333e+00 240 148 8.99887803162969e-17 240 13 2.08333333333333e+00 240 222 -2.22222222222222e+01 240 162 -9.72222222222222e+00 240 147 -9.72222222222223e+00 240 12 -3.47222222222222e+00 240 209 -4.87674137183980e-16 240 242 -8.88178419700125e-16 240 221 -4.44089209850063e-16 240 140 3.73832909073002e-16 240 125 -8.33333333333333e+00 240 218 -1.86442116086039e-16 240 146 -1.18178036800920e-17 240 11 -2.08333333333333e+00 240 208 -1.85647937994693e-15 240 241 1.77635683940025e-15 240 220 9.06325253562101e-16 240 139 -8.33333333333333e+00 240 124 -9.88792381306780e-17 240 217 8.88178419700125e-16 240 145 5.58364118830035e-17 240 10 -2.08333333333333e+00 240 207 -2.22222222222222e+01 240 56 2.08333333333333e+00 240 219 1.11111111111111e+01 240 138 -9.72222222222222e+00 240 123 -9.72222222222222e+00 240 216 1.11111111111111e+01 240 144 -1.38888888888889e+00 240 9 -3.47222222222222e+00 241 241 1.11111111111111e+02 241 55 -3.47222222222222e+00 241 54 2.08333333333333e+00 241 161 -8.33333333333333e+00 241 59 -2.08333333333333e+00 241 160 -9.72222222222223e+00 241 58 -3.47222222222222e+00 241 159 6.97141996908179e-17 241 57 -2.08333333333333e+00 241 158 -9.54097911787244e-17 241 44 2.08333333333333e+00 241 157 -1.38888888888889e+00 241 43 -3.47222222222222e+00 241 156 6.85215773010839e-17 241 42 2.08333333333333e+00 241 134 9.45424294407360e-16 241 230 -1.18763505974062e-15 241 155 8.33333333333333e+00 241 41 2.08333333333333e+00 241 133 -1.38888888888889e+00 241 229 1.11111111111111e+01 241 154 -9.72222222222223e+00 241 40 -3.47222222222222e+00 241 132 -2.21068822969794e-16 241 228 8.88178419700125e-16 241 153 5.03069808033274e-17 241 39 -2.08333333333333e+00 241 143 -8.73758530806068e-16 241 26 2.08333333333333e+00 241 142 -9.72222222222222e+00 241 25 -3.47222222222222e+00 241 141 8.33333333333333e+00 241 24 2.08333333333333e+00 241 227 1.49947870960176e-15 241 167 4.51353364405715e-16 241 152 8.33333333333333e+00 241 29 2.08333333333333e+00 241 226 -2.22222222222222e+01 241 166 -9.72222222222222e+00 241 151 -9.72222222222223e+00 241 28 -3.47222222222222e+00 241 225 9.02733833865743e-16 241 165 -8.33333333333333e+00 241 150 1.95373231481888e-16 241 27 -2.08333333333333e+00 241 224 3.10862446895044e-15 241 164 -5.25621213220973e-16 241 149 -1.49945160454745e-16 241 14 -2.08333333333333e+00 241 223 1.11111111111111e+01 241 163 -9.72222222222222e+00 241 148 -1.38888888888889e+00 241 13 -3.47222222222222e+00 241 222 -7.13079768843716e-16 241 162 8.33333333333333e+00 241 147 4.85722573273506e-17 241 12 2.08333333333333e+00 241 209 3.55271367880050e-15 241 242 -3.55271367880050e-15 241 221 1.29573001633743e-15 241 140 -8.23126289350995e-16 241 125 -3.60930903220424e-16 241 218 -1.52079683481826e-15 241 146 -8.33333333333333e+00 241 11 -2.08333333333333e+00 241 208 1.11111111111111e+01 241 56 -2.08333333333333e+00 241 220 -2.22222222222222e+01 241 139 -9.72222222222222e+00 241 124 -1.38888888888889e+00 241 217 1.11111111111111e+01 241 145 -9.72222222222223e+00 241 10 -3.47222222222222e+00 241 207 -1.82174425284592e-15 241 240 8.88178419700125e-16 241 219 1.14199014827898e-15 241 138 -8.33333333333333e+00 241 123 -1.87241715188247e-16 241 216 8.88178419700125e-16 241 144 1.47451495458029e-17 241 9 -2.08333333333333e+00 242 242 1.11111111111111e+02 242 55 -2.08333333333333e+00 242 54 2.08333333333333e+00 242 161 -9.72222222222222e+00 242 59 -3.47222222222222e+00 242 160 -8.33333333333333e+00 242 58 -2.08333333333333e+00 242 159 -1.23707467880596e-16 242 57 -2.08333333333333e+00 242 158 -9.72222222222222e+00 242 44 -3.47222222222222e+00 242 157 -1.88759598229726e-16 242 43 2.08333333333333e+00 242 156 -8.33333333333333e+00 242 42 -2.08333333333333e+00 242 134 -9.72222222222222e+00 242 230 -2.22222222222222e+01 242 155 -9.72222222222222e+00 242 41 -3.47222222222222e+00 242 133 8.13802150667620e-16 242 229 -1.51299057917637e-15 242 154 8.33333333333333e+00 242 40 2.08333333333333e+00 242 132 8.33333333333333e+00 242 228 -7.55417863679275e-17 242 153 -1.22081164621868e-16 242 39 2.08333333333333e+00 242 143 -1.38888888888889e+00 242 26 -3.47222222222222e+00 242 142 -8.07513778067204e-16 242 25 2.08333333333333e+00 242 141 9.70360944374526e-17 242 24 -2.08333333333333e+00 242 227 1.11111111111111e+01 242 167 -1.38888888888889e+00 242 152 -9.72222222222222e+00 242 29 -3.47222222222222e+00 242 226 1.56634687858981e-15 242 166 3.98119037736677e-16 242 151 8.33333333333333e+00 242 28 2.08333333333333e+00 242 225 -4.44089209850063e-16 242 165 7.10369263412503e-16 242 150 -2.55004350968591e-16 242 27 2.08333333333333e+00 242 224 1.11111111111111e+01 242 164 -1.38888888888889e+00 242 149 -9.72222222222222e+00 242 14 -3.47222222222222e+00 242 223 2.66453525910038e-15 242 163 -5.49798921667399e-16 242 148 -6.07153216591882e-17 242 13 -2.08333333333333e+00 242 222 1.28358695200559e-15 242 162 2.53269627492614e-16 242 147 8.33333333333333e+00 242 12 2.08333333333333e+00 242 209 1.11111111111111e+01 242 56 -3.47222222222222e+00 242 221 1.11111111111111e+01 242 140 -1.38888888888889e+00 242 125 -9.72222222222222e+00 242 218 -2.22222222222222e+01 242 146 -9.72222222222222e+00 242 11 -3.47222222222222e+00 242 208 2.66453525910038e-15 242 241 -3.55271367880050e-15 242 220 1.27742055214958e-15 242 139 -7.56447855743136e-16 242 124 -1.49186218934005e-16 242 217 -1.24401357270987e-15 242 145 -8.33333333333333e+00 242 10 -2.08333333333333e+00 242 207 -3.54520557875604e-16 242 240 -8.88178419700125e-16 242 219 -4.44089209850063e-16 242 138 3.45101551502136e-16 242 123 -8.33333333333333e+00 242 216 -1.41813644161104e-16 242 144 2.16840434497101e-17 242 9 -2.08333333333333e+00 hypre-2.33.0/src/test/TEST_ij/data/beam_hex_dof459_np2/A.IJ.00001000066400000000000000000011112661477326011500233500ustar00rootroot00000000000000243 458 243 458 243 243 5.55555555555555e-01 243 407 -8.33333333333334e-02 243 404 -1.21871100450949e-17 243 317 -7.15747075594620e-17 243 451 -4.16666666666667e-02 243 406 -7.44372554047079e-18 243 403 -8.33333333333334e-02 243 316 -4.50100602676726e-17 243 450 -6.94444444444444e-02 243 405 -9.72222222222222e-02 243 402 -9.72222222222221e-02 243 315 -1.11111111111111e-01 243 449 4.16666666666667e-02 243 395 1.25496401465197e-17 243 311 5.25651706407074e-17 243 392 8.33333333333333e-02 243 389 -1.47451495458029e-17 243 296 4.16333634234434e-17 243 245 1.11022302462516e-16 243 293 -4.60260762879042e-17 243 448 4.16666666666667e-02 243 394 7.67073037033494e-18 243 310 1.38777878078145e-17 243 391 -8.40256683676266e-18 243 388 8.33333333333334e-02 243 295 2.84823298843731e-17 243 244 4.16333634234434e-17 243 292 -1.44622405414199e-17 243 447 -6.94444444444444e-02 243 393 -2.77777777777779e-02 243 309 1.11111111111111e-01 243 390 -9.72222222222223e-02 243 387 -9.72222222222223e-02 243 294 1.11111111111111e-01 243 452 -4.16666666666667e-02 243 291 -1.11111111111111e-01 244 244 5.55555555555556e-01 244 407 -2.01390553539182e-17 244 404 -3.32629838386764e-17 244 317 4.16666666666667e-02 244 451 -6.94444444444445e-02 244 406 -1.38888888888889e-02 244 403 -9.72222222222224e-02 244 316 5.55555555555557e-02 244 450 -4.16666666666667e-02 244 405 -7.38612730005750e-18 244 402 -8.33333333333334e-02 244 315 -4.19975875907627e-17 244 449 -4.16666666666666e-02 244 395 -1.66666666666667e-01 244 311 2.20702904736580e-17 244 392 -3.38813178901720e-19 244 389 3.39541627236359e-17 244 296 -3.51963365407843e-18 244 245 1.66666666666667e-01 244 293 4.16666666666666e-02 244 448 -6.94444444444444e-02 244 394 -1.94444444444445e-01 244 310 1.11111111111111e-01 244 391 -1.38888888888889e-02 244 388 -9.72222222222221e-02 244 295 -2.22222222222222e-01 244 452 -4.16666666666668e-02 244 292 5.55555555555554e-02 244 447 4.16666666666667e-02 244 393 9.03953561309789e-18 244 309 1.38777878078145e-17 244 390 -9.91536768055884e-18 244 387 8.33333333333334e-02 244 294 3.21883107868475e-17 244 243 4.16333634234434e-17 244 291 -1.47330793263045e-17 245 245 5.55555555555556e-01 245 407 -9.72222222222225e-02 245 404 -1.38888888888889e-02 245 317 5.55555555555557e-02 245 451 -4.16666666666668e-02 245 406 -2.04287406218792e-17 245 403 -3.29326409892472e-17 245 316 4.16666666666667e-02 245 450 -4.16666666666667e-02 245 405 -8.33333333333334e-02 245 402 -1.29833210155139e-17 245 315 -7.26957556651531e-17 245 449 -6.94444444444444e-02 245 395 -1.94444444444445e-01 245 311 -2.22222222222222e-01 245 392 -9.72222222222221e-02 245 389 -1.38888888888889e-02 245 296 1.11111111111111e-01 245 452 -6.94444444444445e-02 245 293 5.55555555555554e-02 245 448 -4.16666666666666e-02 245 394 -1.66666666666667e-01 245 310 1.94944632810577e-17 245 391 5.86146799499976e-19 245 388 3.28648783534669e-17 245 295 -8.12643409595776e-18 245 244 1.66666666666667e-01 245 292 4.16666666666666e-02 245 447 4.16666666666667e-02 245 393 1.45554141656179e-17 245 309 4.70810558237094e-17 245 390 8.33333333333333e-02 245 387 -1.33424629851497e-17 245 294 4.16333634234434e-17 245 243 1.11022302462516e-16 245 291 -4.49395447748137e-17 246 246 5.55555555555555e-01 246 422 -8.33333333333334e-02 246 419 -1.58733974315456e-17 246 341 -2.12969493928149e-17 246 454 -4.16666666666667e-02 246 421 3.34408607575998e-18 246 418 -8.33333333333334e-02 246 340 1.11545768823919e-17 246 453 -6.94444444444444e-02 246 420 -9.72222222222223e-02 246 417 -9.72222222222222e-02 246 339 -1.11111111111111e-01 246 452 4.16666666666667e-02 246 410 1.51788304147971e-18 246 335 -2.45639554703747e-18 246 407 8.33333333333334e-02 246 404 6.83047368665868e-18 246 320 6.93889390390723e-18 246 248 0.00000000000000e+00 246 317 6.22738622821362e-18 246 451 4.16666666666667e-02 246 409 -4.11996825544492e-18 246 334 -6.93889390390723e-18 246 406 3.79470760369927e-18 246 403 8.33333333333334e-02 246 319 -1.18889544476614e-17 246 247 0.00000000000000e+00 246 316 8.32125167382625e-18 246 450 -6.94444444444445e-02 246 408 -2.77777777777777e-02 246 333 1.11111111111111e-01 246 405 -9.72222222222222e-02 246 402 -9.72222222222222e-02 246 318 1.11111111111111e-01 246 455 -4.16666666666667e-02 246 315 -1.11111111111111e-01 247 247 5.55555555555556e-01 247 422 1.40268656065312e-17 247 419 -3.78488202151112e-17 247 341 4.16666666666667e-02 247 454 -6.94444444444444e-02 247 421 -1.38888888888889e-02 247 418 -9.72222222222221e-02 247 340 5.55555555555555e-02 247 453 -4.16666666666667e-02 247 420 3.15773882736403e-18 247 417 -8.33333333333334e-02 247 339 1.27021060770255e-17 247 452 -4.16666666666667e-02 247 410 -1.66666666666667e-01 247 335 -8.52115144937826e-19 247 407 -1.09504419421036e-17 247 404 1.56192875473693e-18 247 320 1.01290317415037e-17 247 248 1.66666666666667e-01 247 317 4.16666666666667e-02 247 451 -6.94444444444445e-02 247 409 -1.94444444444444e-01 247 334 1.11111111111111e-01 247 406 -1.38888888888889e-02 247 403 -9.72222222222222e-02 247 319 -2.22222222222222e-01 247 455 -4.16666666666667e-02 247 316 5.55555555555555e-02 247 450 4.16666666666667e-02 247 408 -4.42320605056196e-18 247 333 0.00000000000000e+00 247 405 4.34019682173103e-18 247 402 8.33333333333334e-02 247 318 -1.61016728108306e-17 247 246 0.00000000000000e+00 247 315 1.10588621593521e-17 248 248 5.55555555555555e-01 248 422 -9.72222222222223e-02 248 419 -1.38888888888889e-02 248 341 5.55555555555556e-02 248 454 -4.16666666666667e-02 248 421 1.27292111313376e-17 248 418 -3.80690487813973e-17 248 340 4.16666666666667e-02 248 453 -4.16666666666667e-02 248 420 -8.33333333333334e-02 248 417 -1.53008031592017e-17 248 339 -2.15281893874153e-17 248 452 -6.94444444444445e-02 248 410 -1.94444444444444e-01 248 335 -2.22222222222222e-01 248 407 -9.72222222222222e-02 248 404 -1.38888888888889e-02 248 320 1.11111111111111e-01 248 455 -6.94444444444445e-02 248 317 5.55555555555555e-02 248 451 -4.16666666666667e-02 248 409 -1.66666666666667e-01 248 334 -3.38622596488588e-18 248 406 -1.31561157367538e-17 248 403 3.17129135452010e-18 248 319 1.51940770078476e-17 248 247 1.66666666666667e-01 248 316 4.16666666666667e-02 248 450 4.16666666666667e-02 248 408 2.90871114087127e-18 248 333 1.02533338265133e-18 248 405 8.33333333333334e-02 248 402 6.70003061278152e-18 248 318 6.93889390390723e-18 248 246 0.00000000000000e+00 248 315 6.78346335808606e-18 249 249 5.55555555555555e-01 249 437 -8.33333333333333e-02 249 434 8.36868551887249e-18 249 365 3.66822440885052e-17 249 457 -4.16666666666667e-02 249 436 3.80148386727730e-18 249 433 -8.33333333333334e-02 249 364 -1.41899194488777e-18 249 456 -6.94444444444444e-02 249 435 -9.72222222222222e-02 249 432 -9.72222222222222e-02 249 363 -1.11111111111111e-01 249 455 4.16666666666667e-02 249 425 2.31748214368777e-18 249 359 -5.67156320822534e-17 249 422 8.33333333333334e-02 249 419 5.14996031930615e-18 249 344 -2.77555756156289e-17 249 251 -1.38777878078145e-16 249 341 7.92585669404794e-17 249 454 4.16666666666667e-02 249 424 -1.06929439261383e-17 249 358 -1.38777878078145e-17 249 421 8.89045781438114e-18 249 418 8.33333333333334e-02 249 343 -1.83890852848909e-17 249 250 -5.55111512312578e-17 249 340 4.02747225760475e-17 249 453 -6.94444444444444e-02 249 423 -2.77777777777778e-02 249 357 1.11111111111111e-01 249 420 -9.72222222222222e-02 249 417 -9.72222222222221e-02 249 342 1.11111111111111e-01 249 458 -4.16666666666667e-02 249 339 -1.11111111111111e-01 250 250 5.55555555555556e-01 250 437 4.14707330975705e-18 250 434 9.24282352043893e-18 250 365 4.16666666666667e-02 250 457 -6.94444444444444e-02 250 436 -1.38888888888889e-02 250 433 -9.72222222222222e-02 250 364 5.55555555555555e-02 250 456 -4.16666666666667e-02 250 435 2.68340037690162e-18 250 432 -8.33333333333334e-02 250 363 2.82909004382936e-19 250 455 -4.16666666666667e-02 250 425 -1.66666666666667e-01 250 359 1.54024471128722e-17 250 422 -3.16587034365767e-17 250 419 -1.60648268776251e-17 250 344 -7.35436356453546e-18 250 251 1.66666666666667e-01 250 341 4.16666666666667e-02 250 454 -6.94444444444445e-02 250 424 -1.94444444444445e-01 250 358 1.11111111111111e-01 250 421 -1.38888888888889e-02 250 418 -9.72222222222223e-02 250 343 -2.22222222222222e-01 250 458 -4.16666666666667e-02 250 340 5.55555555555556e-02 250 453 4.16666666666667e-02 250 423 -6.50013083722950e-18 250 357 -1.38777878078145e-17 250 420 8.91417473690426e-18 250 417 8.33333333333334e-02 250 342 -1.72011215763667e-17 250 249 -5.55111512312578e-17 250 339 4.08553636613903e-17 251 251 5.55555555555556e-01 251 437 -9.72222222222222e-02 251 434 -1.38888888888889e-02 251 365 5.55555555555555e-02 251 457 -4.16666666666667e-02 251 436 4.54009659728305e-18 251 433 9.13440330319037e-18 251 364 4.16666666666667e-02 251 456 -4.16666666666667e-02 251 435 -8.33333333333333e-02 251 432 6.96599895821937e-18 251 363 3.71305362758395e-17 251 455 -6.94444444444445e-02 251 425 -1.94444444444444e-01 251 359 -2.22222222222222e-01 251 422 -9.72222222222224e-02 251 419 -1.38888888888889e-02 251 344 1.11111111111111e-01 251 458 -6.94444444444444e-02 251 341 5.55555555555556e-02 251 454 -4.16666666666667e-02 251 424 -1.66666666666667e-01 251 358 2.75179828739241e-17 251 421 -3.10403693850811e-17 251 418 -1.63714528045311e-17 251 343 -7.14895807482629e-18 251 250 1.66666666666667e-01 251 340 4.16666666666667e-02 251 453 4.16666666666667e-02 251 423 2.06506632540598e-18 251 357 -6.60867810942014e-17 251 420 8.33333333333334e-02 251 417 3.79131947191025e-18 251 342 -2.77555756156289e-17 251 249 -1.24900090270330e-16 251 339 8.11656616212224e-17 252 252 2.77777777777778e-01 252 440 -6.61363325216158e-18 252 383 -2.13858878522766e-17 252 437 8.33333333333334e-02 252 434 8.13151629364128e-18 252 368 -4.16666666666667e-02 252 254 -8.33333333333334e-02 252 365 4.34765071166687e-17 252 457 4.16666666666667e-02 252 439 -5.42101086242752e-19 252 382 -4.16666666666667e-02 252 436 1.40946282423116e-18 252 433 8.33333333333334e-02 252 367 2.62919026827735e-18 252 253 -8.33333333333334e-02 252 364 -2.26327203506349e-18 252 456 -6.94444444444444e-02 252 438 -1.38888888888889e-02 252 381 5.55555555555555e-02 252 435 -9.72222222222223e-02 252 432 -9.72222222222222e-02 252 366 5.55555555555556e-02 252 458 4.16666666666667e-02 252 363 -1.11111111111111e-01 253 253 2.77777777777778e-01 253 440 -8.33333333333334e-02 253 383 2.25514051876985e-17 253 437 -4.06575814682064e-18 253 434 -1.07928938139143e-17 253 368 -1.18042511529359e-17 253 254 8.33333333333334e-02 253 365 4.16666666666667e-02 253 457 -6.94444444444444e-02 253 439 -9.72222222222223e-02 253 382 5.55555555555556e-02 253 436 -1.38888888888889e-02 253 433 -9.72222222222222e-02 253 367 -1.11111111111111e-01 253 458 -4.16666666666667e-02 253 364 5.55555555555555e-02 253 456 4.16666666666667e-02 253 438 -8.94466792300541e-19 253 381 -4.16666666666667e-02 253 435 1.10622502911412e-18 253 432 8.33333333333334e-02 253 366 3.99799551104030e-19 253 252 -8.33333333333334e-02 253 363 -1.26970238793420e-18 254 254 2.77777777777778e-01 254 440 -9.72222222222222e-02 254 383 -1.11111111111111e-01 254 437 -9.72222222222223e-02 254 434 -1.38888888888889e-02 254 368 5.55555555555556e-02 254 458 -6.94444444444445e-02 254 365 5.55555555555555e-02 254 457 -4.16666666666667e-02 254 439 -8.33333333333334e-02 254 382 2.27953506765077e-17 254 436 -4.54517879496658e-18 254 433 -8.94466792300541e-18 254 367 -1.21430643318376e-17 254 253 8.33333333333334e-02 254 364 4.16666666666667e-02 254 456 4.16666666666667e-02 254 438 -2.64274279543342e-18 254 381 -2.18551441050555e-17 254 435 8.33333333333334e-02 254 432 6.86604907044336e-18 254 366 -4.16666666666667e-02 254 252 -8.33333333333334e-02 254 363 4.30690842690394e-17 255 255 5.55555555555555e-01 255 452 -4.16666666666667e-02 255 323 3.07642366442762e-18 255 404 -1.36880524276295e-17 255 412 -9.14795583034644e-18 255 451 4.16666666666667e-02 255 322 -4.73355892243593e-17 255 403 8.33333333333333e-02 255 411 -9.72222222222221e-02 255 450 -6.94444444444444e-02 255 321 -1.11111111111111e-01 255 402 -9.72222222222220e-02 255 398 8.33333333333334e-02 255 314 4.11996825544492e-18 255 395 1.23327997120226e-17 255 449 4.16666666666667e-02 255 299 -1.58293517182884e-17 255 257 1.38777878078145e-17 255 296 3.46944695195361e-17 255 389 -1.12892551210053e-17 255 397 -9.10729824887824e-18 255 313 2.77555756156289e-17 255 394 1.08928437016903e-17 255 448 -4.16666666666667e-02 255 298 -1.66153982933404e-17 255 256 6.93889390390723e-17 255 295 3.21902166109788e-17 255 388 -8.33333333333334e-02 255 396 -9.72222222222222e-02 255 312 1.11111111111111e-01 255 393 -2.77777777777779e-02 255 447 -6.94444444444445e-02 255 297 -1.11111111111111e-01 255 413 -8.33333333333334e-02 255 294 1.11111111111111e-01 255 387 -9.72222222222223e-02 256 256 5.55555555555555e-01 256 452 4.16666666666667e-02 256 323 -4.16666666666667e-02 256 404 1.33898968301960e-17 256 412 -1.38888888888888e-02 256 451 -6.94444444444444e-02 256 322 5.55555555555557e-02 256 403 -9.72222222222221e-02 256 411 -7.26415455565288e-18 256 450 4.16666666666667e-02 256 321 -4.72170046117437e-17 256 402 8.33333333333333e-02 256 398 2.27682456221956e-18 256 314 -1.99222149194211e-17 256 395 1.66666666666667e-01 256 449 4.16666666666667e-02 256 299 -4.16666666666667e-02 256 257 -1.66666666666667e-01 256 296 -3.21872519956634e-19 256 389 -7.86046575051991e-18 256 397 -1.38888888888889e-02 256 313 1.11111111111111e-01 256 394 -1.94444444444445e-01 256 448 -6.94444444444444e-02 256 298 5.55555555555555e-02 256 413 -2.87313575708659e-17 256 295 -2.22222222222222e-01 256 388 -9.72222222222222e-02 256 396 -9.87979229677416e-18 256 312 2.77555756156289e-17 256 393 5.93600689435814e-18 256 447 -4.16666666666667e-02 256 297 -1.81773270480773e-17 256 255 5.55111512312578e-17 256 294 3.07032502720739e-17 256 387 -8.33333333333334e-02 257 257 5.55555555555556e-01 257 452 -6.94444444444445e-02 257 323 5.55555555555557e-02 257 404 -1.38888888888888e-02 257 412 -2.97477971075710e-17 257 451 4.16666666666667e-02 257 322 -4.16666666666667e-02 257 403 1.43521262582769e-17 257 411 -8.33333333333334e-02 257 450 -4.16666666666667e-02 257 321 1.84314369322536e-18 257 402 -1.30104260698261e-17 257 398 -9.72222222222222e-02 257 314 -2.22222222222222e-01 257 395 -1.94444444444445e-01 257 449 -6.94444444444444e-02 257 299 5.55555555555556e-02 257 413 -9.72222222222222e-02 257 296 1.11111111111111e-01 257 389 -1.38888888888889e-02 257 397 1.62630325872826e-18 257 313 -1.62325394011814e-17 257 394 1.66666666666667e-01 257 448 4.16666666666667e-02 257 298 -4.16666666666667e-02 257 256 -1.66666666666667e-01 257 295 -5.49787910239085e-18 257 388 -6.72713566709365e-18 257 396 8.33333333333334e-02 257 312 3.29326409892472e-18 257 393 1.01203496537944e-17 257 447 4.16666666666667e-02 257 297 -1.67915811463692e-17 257 255 1.38777878078145e-17 257 294 3.46944695195361e-17 257 387 -1.13756524816253e-17 258 258 5.55555555555556e-01 258 455 -4.16666666666667e-02 258 347 -5.30039337073851e-17 258 419 -1.68915310341453e-17 258 427 2.90024081139872e-18 258 454 4.16666666666667e-02 258 346 1.15670819277047e-17 258 418 8.33333333333334e-02 258 426 -9.72222222222223e-02 258 453 -6.94444444444444e-02 258 345 -1.11111111111111e-01 258 417 -9.72222222222223e-02 258 413 8.33333333333333e-02 258 338 3.75133951679985e-17 258 410 3.26615904461258e-18 258 452 4.16666666666667e-02 258 323 -2.10335221462188e-17 258 260 6.93889390390723e-17 258 320 6.93889390390723e-18 258 404 1.05167610731094e-17 258 412 3.25260651745651e-18 258 337 -1.38777878078145e-17 258 409 -4.18095462764723e-18 258 451 -4.16666666666667e-02 258 322 9.62229428080885e-18 258 259 -1.38777878078145e-17 258 319 -1.34199664998235e-17 258 403 -8.33333333333334e-02 258 411 -9.72222222222222e-02 258 336 1.11111111111111e-01 258 408 -2.77777777777777e-02 258 450 -6.94444444444444e-02 258 321 -1.11111111111111e-01 258 428 -8.33333333333333e-02 258 318 1.11111111111111e-01 258 402 -9.72222222222222e-02 259 259 5.55555555555555e-01 259 455 4.16666666666667e-02 259 347 -4.16666666666667e-02 259 419 1.52194879962653e-17 259 427 -1.38888888888889e-02 259 454 -6.94444444444444e-02 259 346 5.55555555555555e-02 259 418 -9.72222222222222e-02 259 426 3.03576608295941e-18 259 453 4.16666666666667e-02 259 345 9.79847713383775e-18 259 417 8.33333333333334e-02 259 413 -5.74627151417317e-18 259 338 -1.63443477502190e-17 259 410 1.66666666666667e-01 259 452 4.16666666666667e-02 259 323 -4.16666666666667e-02 259 260 -1.66666666666667e-01 259 320 1.68237683983649e-17 259 404 4.30970363562988e-18 259 412 -1.38888888888889e-02 259 337 1.11111111111111e-01 259 409 -1.94444444444444e-01 259 451 -6.94444444444444e-02 259 322 5.55555555555555e-02 259 428 5.09575021068187e-18 259 319 -2.22222222222222e-01 259 403 -9.72222222222221e-02 259 411 3.27971157176865e-18 259 336 -1.38777878078145e-17 259 408 -4.11996825544492e-18 259 450 -4.16666666666667e-02 259 321 7.81811410315719e-18 259 258 -1.38777878078145e-17 259 318 -1.17534291761007e-17 259 402 -8.33333333333334e-02 260 260 5.55555555555556e-01 260 455 -6.94444444444445e-02 260 347 5.55555555555555e-02 260 419 -1.38888888888889e-02 260 427 2.18195687212708e-18 260 454 4.16666666666667e-02 260 346 -4.16666666666667e-02 260 418 1.70287503716005e-17 260 426 -8.33333333333334e-02 260 453 -4.16666666666667e-02 260 345 -5.24753851482984e-17 260 417 -1.73201297054559e-17 260 413 -9.72222222222222e-02 260 338 -2.22222222222222e-01 260 410 -1.94444444444444e-01 260 452 -6.94444444444445e-02 260 323 5.55555555555556e-02 260 428 -9.72222222222223e-02 260 320 1.11111111111111e-01 260 404 -1.38888888888889e-02 260 412 -6.60008072500551e-18 260 337 -1.60766853388866e-17 260 409 1.66666666666667e-01 260 451 4.16666666666667e-02 260 322 -4.16666666666667e-02 260 259 -1.66666666666667e-01 260 319 1.86059257193880e-17 260 403 4.37407813962121e-18 260 411 8.33333333333334e-02 260 336 3.80961538357094e-17 260 408 1.22650370762423e-18 260 450 4.16666666666667e-02 260 321 -2.12503625807159e-17 260 258 6.93889390390723e-17 260 318 6.93889390390723e-18 260 402 9.12762703961234e-18 261 261 5.55555555555556e-01 261 458 -4.16666666666667e-02 261 371 -3.23905399030044e-18 261 434 6.03934491392316e-18 261 442 2.18195687212708e-18 261 457 4.16666666666667e-02 261 370 -2.91887553623832e-18 261 433 8.33333333333334e-02 261 441 -9.72222222222223e-02 261 456 -6.94444444444444e-02 261 369 -1.11111111111111e-01 261 432 -9.72222222222222e-02 261 428 8.33333333333334e-02 261 362 -6.61363325216158e-18 261 425 2.19550939928315e-18 261 455 4.16666666666667e-02 261 347 1.75640751942652e-17 261 263 -5.55111512312578e-17 261 344 -2.77555756156289e-17 261 419 5.12285526499401e-18 261 427 8.13151629364128e-18 261 361 -6.93889390390723e-18 261 424 -6.05289744107923e-18 261 454 -4.16666666666667e-02 261 346 3.80012861456169e-17 261 262 -2.77555756156289e-17 261 343 -1.37318863826499e-17 261 418 -8.33333333333334e-02 261 426 -9.72222222222222e-02 261 360 1.11111111111111e-01 261 423 -2.77777777777778e-02 261 453 -6.94444444444444e-02 261 345 -1.11111111111111e-01 261 443 -8.33333333333334e-02 261 342 1.11111111111111e-01 261 417 -9.72222222222221e-02 262 262 5.55555555555555e-01 262 458 4.16666666666667e-02 262 371 -4.16666666666667e-02 262 434 -1.36202897918491e-17 262 442 -1.38888888888889e-02 262 457 -6.94444444444444e-02 262 370 5.55555555555555e-02 262 433 -9.72222222222222e-02 262 441 3.25260651745651e-18 262 456 4.16666666666667e-02 262 369 -2.75116301268197e-18 262 432 8.33333333333334e-02 262 428 -2.87313575708659e-17 262 362 -1.22785896033983e-17 262 425 1.66666666666667e-01 262 455 4.16666666666667e-02 262 347 -4.16666666666667e-02 262 263 -1.66666666666667e-01 262 344 -2.75963334215451e-18 262 419 3.68493213373511e-17 262 427 -1.38888888888889e-02 262 361 1.11111111111111e-01 262 424 -1.94444444444445e-01 262 454 -6.94444444444444e-02 262 346 5.55555555555557e-02 262 443 -9.32413868337534e-18 262 343 -2.22222222222222e-01 262 418 -9.72222222222221e-02 262 426 9.14795583034644e-18 262 360 -6.93889390390723e-18 262 423 -1.07064964532944e-17 262 453 -4.16666666666667e-02 262 345 3.96021784159276e-17 262 261 -2.77555756156289e-17 262 342 -2.05591836957564e-17 262 417 -8.33333333333334e-02 263 263 5.55555555555556e-01 263 458 -6.94444444444444e-02 263 371 5.55555555555555e-02 263 434 -1.38888888888889e-02 263 442 -8.40256683676266e-18 263 457 4.16666666666667e-02 263 370 -4.16666666666667e-02 263 433 -1.25835214644099e-17 263 441 -8.33333333333334e-02 263 456 -4.16666666666667e-02 263 369 -5.09575021068187e-18 263 432 5.89534931288993e-18 263 428 -9.72222222222223e-02 263 362 -2.22222222222222e-01 263 425 -1.94444444444445e-01 263 455 -6.94444444444445e-02 263 347 5.55555555555557e-02 263 443 -9.72222222222222e-02 263 344 1.11111111111111e-01 263 419 -1.38888888888888e-02 263 427 -2.91921434941722e-17 263 361 -1.35237280358622e-17 263 424 1.66666666666667e-01 263 454 4.16666666666667e-02 263 346 -4.16666666666667e-02 263 262 -1.66666666666667e-01 263 343 -1.98629226131133e-19 263 418 3.52450409352514e-17 263 426 8.33333333333334e-02 263 360 -7.04731412115578e-18 263 423 1.95495204226293e-18 263 453 4.16666666666667e-02 263 345 1.59784295170051e-17 263 261 -5.55111512312578e-17 263 342 -2.08166817117217e-17 263 417 5.69206140554890e-18 264 264 2.77777777777778e-01 264 386 6.07153216591882e-18 264 440 -6.61363325216158e-18 264 458 4.16666666666667e-02 264 371 -1.62630325872826e-18 264 266 -8.33333333333334e-02 264 368 -4.16666666666667e-02 264 434 9.85268724246202e-18 264 442 1.95156391047391e-18 264 385 4.16666666666667e-02 264 439 -1.09775469964157e-18 264 457 -4.16666666666667e-02 264 370 -9.35124373768748e-19 264 265 8.33333333333334e-02 264 367 1.31967733182220e-18 264 433 -8.33333333333334e-02 264 441 -9.72222222222223e-02 264 384 5.55555555555555e-02 264 438 -1.38888888888889e-02 264 456 -6.94444444444444e-02 264 369 -1.11111111111111e-01 264 443 8.33333333333334e-02 264 366 5.55555555555556e-02 264 432 -9.72222222222222e-02 265 265 2.77777777777778e-01 265 386 -8.67361737988404e-18 265 440 8.33333333333333e-02 265 458 4.16666666666667e-02 265 371 -4.16666666666667e-02 265 266 -8.33333333333334e-02 265 368 -8.56519716263549e-18 265 434 1.79570984817912e-17 265 442 -1.38888888888889e-02 265 385 5.55555555555556e-02 265 439 -9.72222222222223e-02 265 457 -6.94444444444445e-02 265 370 5.55555555555555e-02 265 443 -2.60208521396521e-18 265 367 -1.11111111111111e-01 265 433 -9.72222222222222e-02 265 441 9.35124373768748e-19 265 384 4.16666666666667e-02 265 438 -1.40946282423116e-18 265 456 -4.16666666666667e-02 265 369 -3.61344255298685e-18 265 264 8.33333333333334e-02 265 366 2.62919026827735e-18 265 432 -8.33333333333334e-02 266 266 2.77777777777778e-01 266 386 -1.11111111111111e-01 266 440 -9.72222222222223e-02 266 458 -6.94444444444445e-02 266 371 5.55555555555555e-02 266 443 -9.72222222222222e-02 266 368 5.55555555555556e-02 266 434 -1.38888888888889e-02 266 442 -1.72117094882074e-18 266 385 -8.67361737988404e-18 266 439 8.33333333333334e-02 266 457 4.16666666666667e-02 266 370 -4.16666666666667e-02 266 265 -8.33333333333334e-02 266 367 -8.33480420098232e-18 266 433 1.81265050712420e-17 266 441 8.33333333333334e-02 266 384 5.74627151417317e-18 266 438 -6.08508469307489e-18 266 456 4.16666666666667e-02 266 369 -1.70761842166467e-18 266 264 -8.33333333333334e-02 266 366 -4.16666666666667e-02 266 432 9.22757692738835e-18 267 267 5.55555555555556e-01 267 326 -7.45490637537455e-17 267 452 4.16666666666667e-02 267 407 8.33333333333333e-02 267 415 -8.33333333333334e-02 267 325 -4.46284719249346e-17 267 451 -4.16666666666667e-02 267 406 -8.25348903804590e-18 267 414 -9.72222222222222e-02 267 324 -1.11111111111111e-01 267 450 -6.94444444444444e-02 267 405 -9.72222222222220e-02 267 401 -1.31188462870746e-17 267 305 1.38777878078145e-17 267 269 1.24900090270330e-16 267 302 -4.26226979058364e-17 267 449 -4.16666666666667e-02 267 395 1.01067971266383e-17 267 311 5.06047128842873e-17 267 392 -8.33333333333334e-02 267 400 8.33333333333333e-02 267 304 3.10081821330854e-17 267 268 6.93889390390723e-17 267 301 -1.40946282423116e-17 267 448 4.16666666666667e-02 267 394 7.67073037033494e-18 267 310 6.93889390390723e-18 267 391 -8.36190925529445e-18 267 399 -9.72222222222222e-02 267 303 1.11111111111111e-01 267 416 -1.28342432167972e-17 267 300 -1.11111111111111e-01 267 447 -6.94444444444445e-02 267 393 -2.77777777777778e-02 267 309 1.11111111111111e-01 267 390 -9.72222222222223e-02 268 268 5.55555555555556e-01 268 326 -4.16666666666667e-02 268 452 4.16666666666667e-02 268 407 2.66578209159873e-17 268 415 -9.72222222222224e-02 268 325 5.55555555555557e-02 268 451 -6.94444444444445e-02 268 406 -1.38888888888888e-02 268 414 -8.33333333333334e-02 268 324 -4.39101879856629e-17 268 450 -4.16666666666667e-02 268 405 -8.15862134795342e-18 268 401 4.62412226565068e-17 268 305 -5.10354291379661e-17 268 269 -1.66666666666667e-01 268 302 -4.16666666666667e-02 268 449 4.16666666666667e-02 268 395 1.66666666666667e-01 268 311 1.94946750392945e-17 268 392 -2.35305752747245e-17 268 400 -9.72222222222222e-02 268 304 -2.22222222222222e-01 268 416 -2.34594245071551e-17 268 301 5.55555555555555e-02 268 448 -6.94444444444444e-02 268 394 -1.94444444444445e-01 268 310 1.11111111111111e-01 268 391 -1.38888888888889e-02 268 399 8.33333333333333e-02 268 303 3.64698505769812e-17 268 267 8.32667268468867e-17 268 300 -1.52872506320456e-17 268 447 4.16666666666667e-02 268 393 1.09030080970574e-17 268 309 6.93889390390723e-18 268 390 -9.11576857835078e-18 269 269 5.55555555555555e-01 269 326 5.55555555555557e-02 269 452 -6.94444444444445e-02 269 407 -9.72222222222220e-02 269 415 -2.43945488809238e-17 269 325 -4.16666666666667e-02 269 451 4.16666666666667e-02 269 406 2.58582218137793e-17 269 414 -1.36609473733174e-17 269 324 -7.49590277002166e-17 269 450 4.16666666666667e-02 269 405 8.33333333333333e-02 269 401 -1.38888888888889e-02 269 305 1.11111111111111e-01 269 416 -1.38888888888889e-02 269 302 5.55555555555556e-02 269 449 -6.94444444444444e-02 269 395 -1.94444444444445e-01 269 311 -2.22222222222222e-01 269 392 -9.72222222222223e-02 269 400 4.78133158066107e-17 269 304 -5.67850887839283e-17 269 268 -1.66666666666667e-01 269 301 -4.16666666666667e-02 269 448 4.16666666666667e-02 269 394 1.66666666666667e-01 269 310 2.72727668356940e-17 269 391 -2.11012847819991e-17 269 399 -1.29020058525775e-17 269 303 6.93889390390723e-18 269 267 1.24900090270330e-16 269 300 -4.54331532248262e-17 269 447 -4.16666666666667e-02 269 393 1.34170018845081e-17 269 309 4.95683680733217e-17 269 390 -8.33333333333334e-02 270 270 5.55555555555556e-01 270 350 -2.20025278378777e-17 270 455 4.16666666666667e-02 270 422 8.33333333333333e-02 270 430 -8.33333333333333e-02 270 349 1.25902977279879e-17 270 454 -4.16666666666667e-02 270 421 3.45081222711402e-18 270 429 -9.72222222222223e-02 270 348 -1.11111111111111e-01 270 453 -6.94444444444444e-02 270 420 -9.72222222222222e-02 270 416 6.72205346941013e-18 270 329 -1.38777878078145e-17 270 272 1.38777878078145e-17 270 326 8.34835672813838e-18 270 452 -4.16666666666667e-02 270 410 1.19939865331209e-18 270 335 1.02194525086231e-18 270 407 -8.33333333333333e-02 270 415 8.33333333333333e-02 270 328 -7.58941520739853e-18 270 271 -1.38777878078145e-17 270 325 1.06251812903579e-17 270 451 4.16666666666667e-02 270 409 -4.10641572828885e-18 270 334 -6.93889390390723e-18 270 406 3.88957529379175e-18 270 414 -9.72222222222223e-02 270 327 1.11111111111111e-01 270 431 -1.65069780760918e-17 270 324 -1.11111111111111e-01 270 450 -6.94444444444444e-02 270 408 -2.77777777777777e-02 270 333 1.11111111111111e-01 270 405 -9.72222222222222e-02 271 271 5.55555555555556e-01 271 350 -4.16666666666666e-02 271 455 4.16666666666666e-02 271 422 2.06506632540598e-18 271 430 -9.72222222222222e-02 271 349 5.55555555555555e-02 271 454 -6.94444444444444e-02 271 421 -1.38888888888889e-02 271 429 -8.33333333333333e-02 271 348 1.50704101975485e-17 271 453 -4.16666666666667e-02 271 420 2.84603070277445e-18 271 416 1.01779478942077e-17 271 329 -8.84302396933490e-19 271 272 -1.66666666666667e-01 271 326 -4.16666666666667e-02 271 452 4.16666666666667e-02 271 410 1.66666666666667e-01 271 335 8.97854924089558e-20 271 407 -1.86177841806495e-18 271 415 -9.72222222222223e-02 271 328 -2.22222222222222e-01 271 431 -3.39219754716402e-17 271 325 5.55555555555555e-02 271 451 -6.94444444444444e-02 271 409 -1.94444444444444e-01 271 334 1.11111111111111e-01 271 406 -1.38888888888889e-02 271 414 8.33333333333334e-02 271 327 -9.28348110190713e-18 271 270 -1.38777878078145e-17 271 324 9.31058615621927e-18 271 450 4.16666666666667e-02 271 408 -3.93700913883799e-18 271 333 0.00000000000000e+00 271 405 3.98783111567325e-18 272 272 5.55555555555555e-01 272 350 5.55555555555554e-02 272 455 -6.94444444444444e-02 272 422 -9.72222222222222e-02 272 430 -3.17671236538253e-17 272 349 -4.16666666666666e-02 272 454 4.16666666666666e-02 272 421 1.70761842166467e-18 272 429 -1.64798730217797e-17 272 348 -2.21854869544846e-17 272 453 4.16666666666667e-02 272 420 8.33333333333333e-02 272 416 -1.38888888888889e-02 272 329 1.11111111111111e-01 272 431 -1.38888888888889e-02 272 326 5.55555555555555e-02 272 452 -6.94444444444444e-02 272 410 -1.94444444444444e-01 272 335 -2.22222222222222e-01 272 407 -9.72222222222222e-02 272 415 6.72205346941013e-18 272 328 2.30392961653170e-18 272 271 -1.66666666666667e-01 272 325 -4.16666666666667e-02 272 451 4.16666666666667e-02 272 409 1.66666666666667e-01 272 334 3.48808167679321e-18 272 406 2.24971950790742e-18 272 414 6.43745039913268e-18 272 327 -1.38777878078145e-17 272 270 1.38777878078145e-17 272 324 8.34496859634937e-18 272 450 -4.16666666666667e-02 272 408 1.08420217248550e-18 272 333 -1.14180041289880e-18 272 405 -8.33333333333333e-02 273 273 5.55555555555556e-01 273 374 3.57329319128699e-17 273 458 4.16666666666667e-02 273 437 8.33333333333334e-02 273 445 -8.33333333333334e-02 273 373 -3.23905399030044e-18 273 457 -4.16666666666667e-02 273 436 2.75963334215451e-18 273 444 -9.72222222222222e-02 273 372 -1.11111111111111e-01 273 456 -6.94444444444444e-02 273 435 -9.72222222222222e-02 273 431 2.05998412772246e-18 273 353 0.00000000000000e+00 273 275 -1.11022302462516e-16 273 350 8.00412253837424e-17 273 455 -4.16666666666667e-02 273 425 1.94309358100136e-18 273 359 -6.17789832827028e-17 273 422 -8.33333333333333e-02 273 430 8.33333333333334e-02 273 352 -2.56955914879065e-17 273 274 -5.55111512312578e-17 273 349 4.73796349376165e-17 273 454 4.16666666666667e-02 273 424 -1.02728155843002e-17 273 358 -1.38777878078145e-17 273 421 9.28348110190713e-18 273 429 -9.72222222222223e-02 273 351 1.11111111111111e-01 273 446 6.95244643106330e-18 273 348 -1.11111111111111e-01 273 453 -6.94444444444445e-02 273 423 -2.77777777777778e-02 273 357 1.11111111111111e-01 273 420 -9.72222222222221e-02 274 274 5.55555555555556e-01 274 374 -4.16666666666667e-02 274 458 4.16666666666667e-02 274 437 9.01751275646928e-18 274 445 -9.72222222222223e-02 274 373 5.55555555555556e-02 274 457 -6.94444444444444e-02 274 436 -1.38888888888889e-02 274 444 -8.33333333333334e-02 274 372 -5.96311194867027e-18 274 456 -4.16666666666667e-02 274 435 2.38524477946811e-18 274 431 -5.47522097105180e-18 274 353 -3.70644677059537e-17 274 275 -1.66666666666667e-01 274 350 -4.16666666666667e-02 274 455 4.16666666666667e-02 274 425 1.66666666666667e-01 274 359 2.42789288836236e-17 274 422 1.32509834268463e-17 274 430 -9.72222222222224e-02 274 352 -2.22222222222222e-01 274 446 1.06793913989822e-17 274 349 5.55555555555557e-02 274 454 -6.94444444444445e-02 274 424 -1.94444444444445e-01 274 358 1.11111111111111e-01 274 421 -1.38888888888888e-02 274 429 8.33333333333334e-02 274 351 -2.00577401909818e-17 274 273 -5.55111512312578e-17 274 348 4.61192499121021e-17 274 453 4.16666666666667e-02 274 423 -6.70511281046504e-18 274 357 -1.38777878078145e-17 274 420 8.93111539584934e-18 275 275 5.55555555555555e-01 275 374 5.55555555555555e-02 275 458 -6.94444444444444e-02 275 437 -9.72222222222223e-02 275 445 9.75781955236954e-18 275 373 -4.16666666666667e-02 275 457 4.16666666666667e-02 275 436 1.03134731657684e-17 275 444 8.23993651088983e-18 275 372 3.67680061744147e-17 275 456 4.16666666666667e-02 275 435 8.33333333333334e-02 275 431 -1.38888888888889e-02 275 353 1.11111111111111e-01 275 446 -1.38888888888889e-02 275 350 5.55555555555558e-02 275 455 -6.94444444444445e-02 275 425 -1.94444444444444e-01 275 359 -2.22222222222222e-01 275 422 -9.72222222222220e-02 275 430 -7.04731412115578e-18 275 352 -3.65647182670736e-17 275 274 -1.66666666666667e-01 275 349 -4.16666666666667e-02 275 454 4.16666666666667e-02 275 424 1.66666666666667e-01 275 358 1.37202396796252e-17 275 421 1.45147565841497e-17 275 429 2.31748214368777e-18 275 351 0.00000000000000e+00 275 273 -1.11022302462516e-16 275 348 7.72239938011746e-17 275 453 -4.16666666666667e-02 275 423 2.30392961653170e-18 275 357 -5.93194113621132e-17 275 420 -8.33333333333333e-02 276 276 2.77777777777778e-01 276 377 4.16666666666667e-02 276 278 8.33333333333333e-02 276 374 4.20263867109694e-17 276 458 -4.16666666666667e-02 276 440 -2.64274279543342e-18 276 383 -2.09352663243373e-17 276 437 -8.33333333333333e-02 276 445 8.33333333333333e-02 276 376 2.60208521396521e-18 276 277 -8.33333333333333e-02 276 373 -7.58941520739853e-19 276 457 4.16666666666667e-02 276 439 -9.75781955236954e-19 276 382 -4.16666666666667e-02 276 436 1.82959116606929e-18 276 444 -9.72222222222222e-02 276 375 5.55555555555555e-02 276 446 6.93889390390723e-18 276 372 -1.11111111111111e-01 276 456 -6.94444444444444e-02 276 438 -1.38888888888889e-02 276 381 5.55555555555555e-02 276 435 -9.72222222222222e-02 277 277 2.77777777777778e-01 277 377 -1.48535697630514e-17 277 278 -8.33333333333333e-02 277 374 -4.16666666666667e-02 277 458 4.16666666666667e-02 277 440 8.33333333333334e-02 277 383 2.28089032036638e-17 277 437 -2.20228566286118e-18 277 445 -9.72222222222222e-02 277 376 -1.11111111111111e-01 277 446 -8.57874968979155e-18 277 373 5.55555555555556e-02 277 457 -6.94444444444444e-02 277 439 -9.72222222222223e-02 277 382 5.55555555555556e-02 277 436 -1.38888888888889e-02 277 444 8.33333333333334e-02 277 375 6.50521303491303e-19 277 276 -8.33333333333333e-02 277 372 -2.57498015965307e-18 277 456 4.16666666666667e-02 277 438 0.00000000000000e+00 277 381 -4.16666666666667e-02 277 435 1.32475952950573e-18 278 278 2.77777777777778e-01 278 377 5.55555555555555e-02 278 446 -1.38888888888889e-02 278 374 5.55555555555556e-02 278 458 -6.94444444444444e-02 278 440 -9.72222222222222e-02 278 383 -1.11111111111111e-01 278 437 -9.72222222222221e-02 278 445 -7.80625564189563e-18 278 376 -1.47451495458029e-17 278 277 -8.33333333333333e-02 278 373 -4.16666666666667e-02 278 457 4.16666666666667e-02 278 439 8.33333333333333e-02 278 382 2.26598254049470e-17 278 436 -2.53432257818487e-18 278 444 6.57297567069337e-18 278 375 4.16666666666667e-02 278 276 8.33333333333333e-02 278 372 4.19772588000286e-17 278 456 -4.16666666666667e-02 278 438 -6.61363325216158e-18 278 381 -2.13858878522766e-17 278 435 -8.33333333333333e-02 279 279 5.55555555555556e-01 279 416 -1.40268656065312e-17 279 413 8.33333333333333e-02 279 452 4.16666666666667e-02 279 331 -4.45607092891542e-17 279 415 8.33333333333333e-02 279 412 -8.71427496135224e-18 279 451 4.16666666666667e-02 279 330 -1.11111111111111e-01 279 414 -9.72222222222221e-02 279 411 -9.72222222222221e-02 279 450 -6.94444444444444e-02 279 308 -1.47451495458029e-17 279 281 0.00000000000000e+00 279 305 6.93889390390723e-18 279 401 -1.02999206386123e-17 279 398 -8.33333333333334e-02 279 314 -6.77626357803440e-20 279 395 1.09775469964157e-17 279 449 -4.16666666666667e-02 279 307 -1.64798730217797e-17 279 280 8.32667268468867e-17 279 304 3.48435473182529e-17 279 400 -8.33333333333334e-02 279 397 -8.99887803162969e-18 279 313 2.77555756156289e-17 279 394 1.06793913989822e-17 279 448 -4.16666666666667e-02 279 306 -1.11111111111111e-01 279 332 2.27682456221956e-18 279 303 1.11111111111111e-01 279 399 -9.72222222222223e-02 279 396 -9.72222222222223e-02 279 312 1.11111111111111e-01 279 393 -2.77777777777778e-02 279 447 -6.94444444444445e-02 280 280 5.55555555555556e-01 280 416 2.08166817117217e-17 280 413 2.55736187435018e-17 280 452 -4.16666666666667e-02 280 331 5.55555555555558e-02 280 415 -9.72222222222222e-02 280 412 -1.38888888888888e-02 280 451 -6.94444444444444e-02 280 330 -4.33680868994202e-17 280 414 8.33333333333333e-02 280 411 -7.58941520739853e-18 280 450 4.16666666666667e-02 280 308 4.16666666666667e-02 280 281 1.66666666666667e-01 280 305 -4.42083435830964e-17 280 401 3.46944695195361e-18 280 398 -2.11825999449355e-17 280 314 -1.62291512693924e-17 280 395 -1.66666666666667e-01 280 449 -4.16666666666667e-02 280 307 5.55555555555556e-02 280 332 4.16666666666667e-02 280 304 -2.22222222222222e-01 280 400 -9.72222222222222e-02 280 397 -1.38888888888889e-02 280 313 1.11111111111111e-01 280 394 -1.94444444444445e-01 280 448 -6.94444444444445e-02 280 306 -1.65882932390282e-17 280 279 8.32667268468867e-17 280 303 3.18755438710738e-17 280 399 -8.33333333333334e-02 280 396 -9.31058615621927e-18 280 312 2.77555756156289e-17 280 393 8.30769914667018e-18 280 447 -4.16666666666667e-02 281 281 5.55555555555556e-01 281 416 -1.38888888888888e-02 281 413 -9.72222222222223e-02 281 452 -6.94444444444444e-02 281 331 4.16666666666667e-02 281 415 2.38253427403690e-17 281 412 2.73218947466347e-17 281 451 -4.16666666666667e-02 281 330 1.73472347597681e-18 281 414 -1.52872506320456e-17 281 411 8.33333333333333e-02 281 450 4.16666666666667e-02 281 308 5.55555555555554e-02 281 332 5.55555555555558e-02 281 305 1.11111111111111e-01 281 401 -1.38888888888889e-02 281 398 -9.72222222222222e-02 281 314 -2.22222222222222e-01 281 395 -1.94444444444445e-01 281 449 -6.94444444444445e-02 281 307 4.16666666666667e-02 281 280 1.66666666666667e-01 281 304 -4.74575619687639e-17 281 400 6.28837260041593e-18 281 397 -2.17924636669586e-17 281 313 -1.99086623922651e-17 281 394 -1.66666666666667e-01 281 448 -4.16666666666667e-02 281 306 -1.53956708492942e-17 281 279 0.00000000000000e+00 281 303 6.93889390390723e-18 281 399 -1.04896560187973e-17 281 396 -8.33333333333334e-02 281 312 4.98732999343332e-18 281 393 1.35118695746006e-17 281 447 -4.16666666666667e-02 282 282 5.55555555555555e-01 282 431 -1.79299934274790e-17 282 428 8.33333333333334e-02 282 455 4.16666666666667e-02 282 355 1.34441069388203e-17 282 430 8.33333333333334e-02 282 427 2.45300741524845e-18 282 454 4.16666666666667e-02 282 354 -1.11111111111111e-01 282 429 -9.72222222222223e-02 282 426 -9.72222222222222e-02 282 453 -6.94444444444444e-02 282 332 -1.99493199737333e-17 282 284 4.16333634234434e-17 282 329 -1.38777878078145e-17 282 416 8.45677694538693e-18 282 413 -8.33333333333334e-02 282 338 3.10488397145536e-17 282 410 1.27054942088145e-18 282 452 -4.16666666666667e-02 282 331 5.20417042793042e-18 282 283 -4.16333634234434e-17 282 328 -9.17506088465858e-18 282 415 -8.33333333333334e-02 282 412 4.98732999343332e-18 282 337 -1.38777878078145e-17 282 409 -3.87941089842470e-18 282 451 -4.16666666666667e-02 282 330 -1.11111111111111e-01 282 356 -5.24753851482984e-17 282 327 1.11111111111111e-01 282 414 -9.72222222222223e-02 282 411 -9.72222222222222e-02 282 336 1.11111111111111e-01 282 408 -2.77777777777777e-02 282 450 -6.94444444444444e-02 283 283 5.55555555555555e-01 283 431 1.88651178012478e-17 283 428 -1.14654379740342e-17 283 455 -4.16666666666667e-02 283 355 5.55555555555555e-02 283 430 -9.72222222222223e-02 283 427 -1.38888888888888e-02 283 454 -6.94444444444444e-02 283 354 1.56125112837913e-17 283 429 8.33333333333334e-02 283 426 2.60208521396521e-18 283 453 4.16666666666667e-02 283 332 4.16666666666667e-02 283 284 1.66666666666667e-01 283 329 2.31748214368777e-18 283 416 1.00830802041152e-17 283 413 -2.16840434497101e-19 283 338 -1.23903979524359e-17 283 410 -1.66666666666667e-01 283 452 -4.16666666666667e-02 283 331 5.55555555555555e-02 283 356 4.16666666666667e-02 283 328 -2.22222222222222e-01 283 415 -9.72222222222222e-02 283 412 -1.38888888888889e-02 283 337 1.11111111111111e-01 283 409 -1.94444444444444e-01 283 451 -6.94444444444444e-02 283 330 7.15573433840433e-18 283 282 -4.16333634234434e-17 283 327 -7.69783542464708e-18 283 414 -8.33333333333333e-02 283 411 3.07642366442762e-18 283 336 -6.93889390390723e-18 283 408 -3.67273485929465e-18 283 450 -4.16666666666667e-02 284 284 5.55555555555555e-01 284 431 -1.38888888888889e-02 284 428 -9.72222222222221e-02 284 455 -6.94444444444444e-02 284 355 4.16666666666667e-02 284 430 1.95427441590512e-17 284 427 -1.19262238973405e-17 284 454 -4.16666666666667e-02 284 354 -5.03069808033274e-17 284 429 -1.75640751942652e-17 284 426 8.33333333333333e-02 284 453 4.16666666666667e-02 284 332 5.55555555555555e-02 284 356 5.55555555555555e-02 284 329 1.11111111111111e-01 284 416 -1.38888888888889e-02 284 413 -9.72222222222222e-02 284 338 -2.22222222222222e-01 284 410 -1.94444444444444e-01 284 452 -6.94444444444444e-02 284 331 4.16666666666667e-02 284 283 1.66666666666667e-01 284 328 1.01305140491614e-18 284 415 1.10859672136643e-17 284 412 5.42101086242752e-19 284 337 -2.24023273889817e-17 284 409 -1.66666666666667e-01 284 451 -4.16666666666667e-02 284 330 -2.02745806254789e-17 284 282 4.16333634234434e-17 284 327 -1.38777878078145e-17 284 414 8.61940727125976e-18 284 411 -8.33333333333334e-02 284 336 3.39355279987963e-17 284 408 1.20617491689012e-18 284 450 -4.16666666666667e-02 285 285 5.55555555555555e-01 285 446 5.31259064517897e-18 285 443 8.33333333333334e-02 285 458 4.16666666666667e-02 285 379 -5.09575021068187e-18 285 445 8.33333333333334e-02 285 442 1.73472347597681e-18 285 457 4.16666666666667e-02 285 378 -1.11111111111111e-01 285 444 -9.72222222222223e-02 285 441 -9.72222222222222e-02 285 456 -6.94444444444444e-02 285 356 1.82145964977565e-17 285 287 1.38777878078145e-17 285 353 -6.93889390390723e-18 285 431 3.79470760369927e-18 285 428 -8.33333333333333e-02 285 362 -1.39862080250630e-17 285 425 -1.30781887056064e-18 285 455 -4.16666666666667e-02 285 355 4.42354486374086e-17 285 286 -2.77555756156289e-17 285 352 -2.17924636669586e-17 285 430 -8.33333333333333e-02 285 427 8.34835672813838e-18 285 361 -6.93889390390723e-18 285 424 -5.53620734325411e-18 285 454 -4.16666666666667e-02 285 354 -1.11111111111111e-01 285 380 -4.22838847269347e-18 285 351 1.11111111111111e-01 285 429 -9.72222222222222e-02 285 426 -9.72222222222222e-02 285 360 1.11111111111111e-01 285 423 -2.77777777777778e-02 285 453 -6.94444444444444e-02 286 286 5.55555555555556e-01 286 446 -1.17093834628434e-17 286 443 -6.42389787197661e-18 286 458 -4.16666666666667e-02 286 379 5.55555555555555e-02 286 445 -9.72222222222222e-02 286 442 -1.38888888888889e-02 286 457 -6.94444444444444e-02 286 378 -3.46944695195361e-18 286 444 8.33333333333333e-02 286 441 2.81892564846231e-18 286 456 4.16666666666667e-02 286 356 4.16666666666667e-02 286 287 1.66666666666667e-01 286 353 -2.87720151523341e-17 286 431 4.41270284201600e-17 286 428 2.17653586126465e-17 286 362 -1.33594036440948e-17 286 425 -1.66666666666667e-01 286 455 -4.16666666666667e-02 286 355 5.55555555555557e-02 286 380 4.16666666666667e-02 286 352 -2.22222222222222e-01 286 430 -9.72222222222221e-02 286 427 -1.38888888888888e-02 286 361 1.11111111111111e-01 286 424 -1.94444444444445e-01 286 454 -6.94444444444444e-02 286 354 4.53196508098941e-17 286 285 -2.77555756156289e-17 286 351 -2.39608680119296e-17 286 429 -8.33333333333333e-02 286 426 9.16150835750251e-18 286 360 -6.93889390390723e-18 286 423 -1.02728155843002e-17 286 453 -4.16666666666667e-02 287 287 5.55555555555556e-01 287 446 -1.38888888888889e-02 287 443 -9.72222222222222e-02 287 458 -6.94444444444444e-02 287 379 4.16666666666667e-02 287 445 -1.16280682999070e-17 287 442 -4.77048955893622e-18 287 457 -4.16666666666667e-02 287 378 -6.93889390390723e-18 287 444 6.28837260041593e-18 287 441 8.33333333333334e-02 287 456 4.16666666666667e-02 287 356 5.55555555555556e-02 287 380 5.55555555555555e-02 287 353 1.11111111111111e-01 287 431 -1.38888888888888e-02 287 428 -9.72222222222222e-02 287 362 -2.22222222222222e-01 287 425 -1.94444444444444e-01 287 455 -6.94444444444445e-02 287 355 4.16666666666667e-02 287 286 1.66666666666667e-01 287 352 -2.99612494102791e-17 287 430 4.58346468418247e-17 287 427 2.11419423634673e-17 287 361 -1.14247803925660e-17 287 424 -1.66666666666667e-01 287 454 -4.16666666666667e-02 287 354 1.58293517182884e-17 287 285 1.38777878078145e-17 287 351 -6.93889390390723e-18 287 429 4.93311988480905e-18 287 426 -8.33333333333333e-02 287 360 -6.61363325216158e-18 287 423 5.69206140554890e-19 287 453 -4.16666666666667e-02 288 288 2.77777777777778e-01 288 377 4.16666666666667e-02 288 446 9.54097911787244e-18 288 443 -8.33333333333334e-02 288 386 2.27682456221956e-18 288 440 -2.64274279543342e-18 288 458 -4.16666666666667e-02 288 379 -1.73472347597681e-18 288 289 8.33333333333334e-02 288 376 5.42101086242752e-19 288 445 -8.33333333333334e-02 288 442 2.16840434497101e-18 288 385 4.16666666666667e-02 288 439 -9.08019319456610e-19 288 457 -4.16666666666667e-02 288 378 -1.11111111111111e-01 288 290 8.33333333333333e-02 288 375 5.55555555555555e-02 288 444 -9.72222222222222e-02 288 441 -9.72222222222223e-02 288 384 5.55555555555555e-02 288 438 -1.38888888888889e-02 288 456 -6.94444444444444e-02 289 289 2.77777777777778e-01 289 290 8.33333333333334e-02 289 377 -1.12757025938492e-17 289 446 1.98408997564847e-17 289 443 -7.79270311473956e-18 289 386 -8.45677694538693e-18 289 440 -8.33333333333334e-02 289 458 -4.16666666666666e-02 289 379 5.55555555555555e-02 289 380 4.16666666666667e-02 289 376 -1.11111111111111e-01 289 445 -9.72222222222222e-02 289 442 -1.38888888888889e-02 289 385 5.55555555555556e-02 289 439 -9.72222222222223e-02 289 457 -6.94444444444444e-02 289 378 -1.95156391047391e-18 289 288 8.33333333333334e-02 289 375 2.60208521396521e-18 289 444 -8.33333333333334e-02 289 441 8.53809210832335e-19 289 384 4.16666666666667e-02 289 438 -5.42101086242752e-19 289 456 -4.16666666666667e-02 290 290 2.77777777777778e-01 290 380 5.55555555555555e-02 290 377 5.55555555555555e-02 290 446 -1.38888888888889e-02 290 443 -9.72222222222222e-02 290 386 -1.11111111111111e-01 290 440 -9.72222222222222e-02 290 458 -6.94444444444444e-02 290 379 4.16666666666667e-02 290 289 8.33333333333334e-02 290 376 -9.54097911787244e-18 290 445 1.90955107629009e-17 290 442 -7.04731412115578e-18 290 385 -7.80625564189563e-18 290 439 -8.33333333333334e-02 290 457 -4.16666666666667e-02 290 378 -1.95156391047391e-18 290 288 8.33333333333333e-02 290 375 4.16666666666667e-02 290 444 8.76848506997652e-18 290 441 -8.33333333333333e-02 290 384 6.07153216591882e-18 290 438 -6.61363325216158e-18 290 456 -4.16666666666667e-02 291 291 5.55555555555555e-01 291 311 -8.33333333333334e-02 291 296 -1.33153579308376e-17 291 245 -4.58700104673726e-17 291 394 -4.16666666666667e-02 291 310 -8.71088682956322e-18 291 295 -8.33333333333334e-02 291 244 -1.43436559288043e-17 291 393 -6.94444444444445e-02 291 309 -9.72222222222223e-02 291 294 -9.72222222222223e-02 291 243 -1.11111111111111e-01 291 449 1.12892551210053e-17 291 392 7.73849300611529e-18 291 389 2.77555756156289e-17 291 293 1.38777878078145e-17 291 448 1.47722546001150e-18 291 391 2.77555756156289e-17 291 388 9.46644021851406e-18 291 292 0.00000000000000e+00 291 447 -2.77777777777777e-02 291 390 1.11111111111111e-01 291 387 1.11111111111111e-01 291 395 -4.16666666666667e-02 291 224 4.16666666666667e-02 291 164 8.33333333333334e-02 291 149 -1.08420217248550e-18 291 14 2.49840838122128e-17 291 223 4.16666666666667e-02 291 163 5.42101086242752e-19 291 148 8.33333333333334e-02 291 13 -1.24683249835833e-18 291 222 -6.94444444444445e-02 291 162 -9.72222222222223e-02 291 147 -9.72222222222222e-02 291 12 -1.11111111111111e-01 292 292 5.55555555555556e-01 292 311 -2.10877322548431e-17 292 296 -7.48607718783351e-18 292 245 4.16666666666666e-02 292 394 -6.94444444444445e-02 292 310 -1.38888888888889e-02 292 295 -9.72222222222222e-02 292 244 5.55555555555554e-02 292 393 -4.16666666666667e-02 292 309 -8.37546178245052e-18 292 294 -8.33333333333334e-02 292 243 -1.45503319679344e-17 292 449 -1.66666666666667e-01 292 392 2.48959923856984e-17 292 389 -3.65793295854138e-17 292 293 1.66666666666667e-01 292 448 -1.94444444444444e-01 292 391 1.11111111111111e-01 292 388 -2.22222222222222e-01 292 395 -4.16666666666667e-02 292 447 3.46267068837558e-18 292 390 2.08166817117217e-17 292 387 1.14196981948825e-17 292 291 0.00000000000000e+00 292 224 -4.16666666666667e-02 292 164 -9.29703362906320e-18 292 149 1.40438062654763e-17 292 14 4.16666666666666e-02 292 223 -6.94444444444444e-02 292 163 -1.38888888888889e-02 292 148 -9.72222222222222e-02 292 13 5.55555555555555e-02 292 222 4.16666666666667e-02 292 162 2.86297136171954e-19 292 147 8.33333333333334e-02 292 12 -6.67673720673202e-19 293 293 5.55555555555556e-01 293 311 -9.72222222222223e-02 293 296 -1.38888888888889e-02 293 245 5.55555555555554e-02 293 394 -4.16666666666667e-02 293 310 -2.35305752747245e-17 293 295 -8.28059409235804e-18 293 244 4.16666666666666e-02 293 393 -4.16666666666667e-02 293 309 -8.33333333333334e-02 293 294 -1.40946282423116e-17 293 243 -4.43472569864461e-17 293 449 -1.94444444444444e-01 293 392 -2.22222222222222e-01 293 389 1.11111111111111e-01 293 395 -6.94444444444445e-02 293 448 -1.66666666666667e-01 293 391 3.31621869179531e-17 293 388 -3.57397081764479e-17 293 292 1.66666666666667e-01 293 447 1.16348445634851e-17 293 390 1.21301470793920e-17 293 387 3.46944695195361e-17 293 291 1.38777878078145e-17 293 224 -6.94444444444445e-02 293 164 -9.72222222222223e-02 293 149 -1.38888888888889e-02 293 14 5.55555555555555e-02 293 223 -4.16666666666666e-02 293 163 -9.01243055878576e-18 293 148 1.56667213924155e-17 293 13 4.16666666666666e-02 293 222 4.16666666666667e-02 293 162 8.33333333333334e-02 293 147 -1.75844039849993e-18 293 12 2.20702904736580e-17 294 294 1.11111111111111e+00 294 323 -9.96449559149959e-18 294 412 -4.16666666666667e-02 294 322 -8.33333333333334e-02 294 411 -6.94444444444444e-02 294 321 -9.72222222222221e-02 294 452 -1.66666666666667e-01 294 407 -4.16666666666667e-02 294 404 -7.02330073710112e-17 294 317 -1.19533289516527e-17 294 451 -1.65916813708172e-17 294 406 4.16666666666667e-02 294 403 -9.23456494920320e-17 294 316 8.33333333333333e-02 294 450 -1.94444444444444e-01 294 405 -6.94444444444444e-02 294 402 -2.22222222222222e-01 294 315 -9.72222222222220e-02 294 398 4.16666666666667e-02 294 314 1.25496401465197e-17 294 299 -1.47451495458029e-17 294 257 3.46944695195361e-17 294 397 4.16666666666667e-02 294 313 7.67073037033494e-18 294 298 8.33333333333334e-02 294 256 2.84823298843731e-17 294 396 -6.94444444444444e-02 294 312 -2.77777777777778e-02 294 297 -9.72222222222223e-02 294 255 1.11111111111111e-01 294 449 1.66666666666667e-01 294 395 6.01545858481059e-17 294 311 1.23327997120226e-17 294 392 4.16666666666667e-02 294 389 -6.35901514821693e-17 294 296 1.24900090270330e-16 294 245 3.46944695195361e-17 294 293 -1.47587020729589e-17 294 448 -1.75098650856409e-17 294 394 4.16333634234434e-17 294 310 1.08928437016903e-17 294 391 -4.16666666666667e-02 294 388 -3.10776388347603e-17 294 295 1.11022302462516e-16 294 244 3.21902166109788e-17 294 292 -8.33333333333334e-02 294 447 -1.94444444444445e-01 294 393 2.22222222222222e-01 294 309 -2.77777777777778e-02 294 390 -6.94444444444445e-02 294 387 -2.22222222222223e-01 294 413 -4.16666666666667e-02 294 243 1.11111111111111e-01 294 291 -9.72222222222223e-02 295 295 1.11111111111111e+00 295 323 -3.15282603626996e-17 295 412 -6.94444444444445e-02 295 322 -9.72222222222224e-02 295 411 -4.16666666666667e-02 295 321 -8.33333333333334e-02 295 452 -4.71356894488073e-17 295 407 4.16666666666667e-02 295 404 0.00000000000000e+00 295 317 1.33898968301960e-17 295 451 -2.77777777777777e-02 295 406 -6.94444444444444e-02 295 403 1.11111111111111e-01 295 316 -9.72222222222221e-02 295 450 -1.46502818557104e-17 295 405 4.16666666666667e-02 295 402 -8.92145922025064e-17 295 315 8.33333333333333e-02 295 398 -4.16666666666666e-02 295 314 -1.66666666666667e-01 295 299 3.48215244616243e-17 295 257 -5.01867021248173e-20 295 397 -6.94444444444444e-02 295 313 -1.94444444444445e-01 295 298 -9.72222222222221e-02 295 256 -2.22222222222222e-01 295 396 4.16666666666667e-02 295 312 9.03953561309789e-18 295 297 8.33333333333334e-02 295 255 3.21883107868475e-17 295 449 3.67273485929465e-18 295 395 2.14807555423691e-18 295 311 1.66666666666667e-01 295 392 4.16666666666667e-02 295 389 -9.71445146547012e-17 295 296 1.94289029309402e-16 295 245 -7.26076642386386e-18 295 293 -7.86046575051991e-18 295 448 -2.77777777777777e-02 295 394 2.22222222222222e-01 295 310 -1.94444444444445e-01 295 391 -6.94444444444444e-02 295 388 1.11111111111111e-01 295 413 -4.16666666666668e-02 295 244 -2.22222222222222e-01 295 292 -9.72222222222222e-02 295 447 -1.97951599773330e-17 295 393 4.16333634234434e-17 295 309 5.93600689435814e-18 295 390 -4.16666666666667e-02 295 387 -3.29104063743818e-17 295 294 9.71445146547012e-17 295 243 3.07032502720739e-17 295 291 -8.33333333333334e-02 296 296 1.11111111111111e+00 296 323 -1.38888888888889e-02 296 412 -4.16666666666668e-02 296 322 -2.94631940372936e-17 296 411 -4.16666666666667e-02 296 321 -9.51387406356030e-18 296 452 -1.94444444444445e-01 296 407 -6.94444444444445e-02 296 404 1.11111111111111e-01 296 317 -1.38888888888888e-02 296 451 -5.01765377294502e-17 296 406 4.16666666666667e-02 296 403 -6.93889390390723e-18 296 316 1.34847645202885e-17 296 450 -1.66666666666667e-01 296 405 -4.16666666666667e-02 296 402 -7.08526119719277e-17 296 315 -1.29020058525775e-17 296 398 -6.94444444444444e-02 296 314 -1.94444444444445e-01 296 299 -1.38888888888889e-02 296 257 1.11111111111111e-01 296 397 -4.16666666666666e-02 296 313 -1.66666666666667e-01 296 298 3.45996018294437e-17 296 256 2.28190675990309e-18 296 396 4.16666666666667e-02 296 312 1.10859672136643e-17 296 297 -1.50771864611265e-17 296 255 3.46944695195361e-17 296 449 -1.94444444444444e-01 296 395 -4.44444444444445e-01 296 311 -1.94444444444445e-01 296 392 -6.94444444444444e-02 296 389 1.11111111111111e-01 296 413 -6.94444444444445e-02 296 245 1.11111111111111e-01 296 293 -1.38888888888889e-02 296 448 2.21075599233372e-18 296 394 3.24815959448343e-18 296 310 1.66666666666667e-01 296 391 4.16666666666667e-02 296 388 -9.71445146547012e-17 296 295 1.94289029309402e-16 296 244 -9.18416648884157e-18 296 292 -7.59449740508206e-18 296 447 1.66666666666667e-01 296 393 5.55799726582222e-17 296 309 1.01084911925328e-17 296 390 4.16666666666667e-02 296 387 -6.43332111351482e-17 296 294 1.24900090270330e-16 296 243 4.16333634234434e-17 296 291 -1.26766950886079e-17 297 297 5.55555555555556e-01 297 398 6.28837260041593e-18 297 314 -8.33333333333334e-02 297 395 -4.16666666666667e-02 297 449 1.12892551210053e-17 297 299 2.77555756156289e-17 297 257 -1.77673631016062e-17 297 296 -1.51042915154387e-17 297 389 2.77555756156289e-17 297 397 -6.93889390390723e-18 297 313 -9.10729824887824e-18 297 394 4.16666666666667e-02 297 448 3.26954717640160e-18 297 298 1.38777878078145e-17 297 256 -1.72964127829328e-17 297 295 8.33333333333334e-02 297 388 8.00255552742182e-18 297 396 1.11111111111111e-01 297 312 -9.72222222222223e-02 297 393 -6.94444444444445e-02 297 447 -2.77777777777778e-02 297 255 -1.11111111111111e-01 297 294 -9.72222222222223e-02 297 387 1.11111111111111e-01 297 224 4.16666666666667e-02 297 29 -3.66460334300100e-17 297 149 1.62630325872826e-18 297 166 -5.42101086242752e-19 297 223 -4.16666666666667e-02 297 28 -2.58853268680914e-18 297 148 -8.33333333333334e-02 297 165 -9.72222222222223e-02 297 222 -6.94444444444445e-02 297 27 -1.11111111111111e-01 297 147 -9.72222222222222e-02 297 167 8.33333333333333e-02 298 298 5.55555555555555e-01 298 398 2.11419423634673e-18 298 314 -2.17924636669586e-17 298 395 4.16666666666667e-02 298 449 1.66666666666667e-01 298 299 -1.66666666666667e-01 298 257 -4.16666666666667e-02 298 296 3.50332826984379e-17 298 389 -3.22702612244943e-17 298 397 1.11111111111111e-01 298 313 -1.38888888888889e-02 298 394 -6.94444444444444e-02 298 448 -1.94444444444444e-01 298 256 5.55555555555555e-02 298 295 -9.72222222222221e-02 298 388 -2.22222222222222e-01 298 396 -6.93889390390723e-18 298 312 -8.89045781438114e-18 298 393 4.16666666666667e-02 298 447 1.02999206386123e-18 298 297 1.38777878078145e-17 298 255 -1.48671222902075e-17 298 294 8.33333333333334e-02 298 387 1.29341931045732e-17 298 224 4.16666666666667e-02 298 29 -4.16666666666667e-02 298 149 6.91178884959509e-18 298 166 -1.38888888888889e-02 298 223 -6.94444444444444e-02 298 28 5.55555555555555e-02 298 148 -9.72222222222222e-02 298 165 -1.89735380184963e-19 298 222 -4.16666666666667e-02 298 27 -2.04643160056639e-18 298 147 -8.33333333333334e-02 298 167 -1.29020058525775e-17 299 299 5.55555555555555e-01 299 398 -2.22222222222222e-01 299 314 -9.72222222222222e-02 299 395 -6.94444444444444e-02 299 449 -1.94444444444444e-01 299 257 5.55555555555556e-02 299 296 -1.38888888888889e-02 299 389 1.11111111111111e-01 299 397 1.27969737671180e-17 299 313 -2.11961524720916e-17 299 394 4.16666666666667e-02 299 448 1.66666666666667e-01 299 298 -1.66666666666667e-01 299 256 -4.16666666666667e-02 299 295 3.48198303957298e-17 299 388 -3.14156049807147e-17 299 396 1.75640751942652e-17 299 312 -8.33333333333334e-02 299 393 -4.16666666666667e-02 299 447 8.18911453405458e-18 299 297 2.77555756156289e-17 299 255 -1.58293517182884e-17 299 294 -1.48942273445196e-17 299 387 2.08166817117217e-17 299 224 -6.94444444444445e-02 299 29 5.55555555555556e-02 299 149 -1.38888888888889e-02 299 166 -1.37287100090977e-17 299 223 4.16666666666667e-02 299 28 -4.16666666666667e-02 299 148 8.61093694178722e-18 299 165 8.33333333333333e-02 299 222 4.16666666666667e-02 299 27 -3.55753837846806e-17 299 147 4.52315593833796e-19 299 167 -9.72222222222222e-02 300 300 5.55555555555556e-01 300 269 -4.54314591589317e-17 300 395 4.16666666666667e-02 300 311 8.33333333333333e-02 300 400 5.85469173142172e-18 300 304 -8.33333333333334e-02 300 268 -1.61681648971901e-17 300 394 -4.16666666666667e-02 300 310 -9.29364549727418e-18 300 303 -9.72222222222223e-02 300 267 -1.11111111111111e-01 300 393 -6.94444444444445e-02 300 309 -9.72222222222223e-02 300 401 0.00000000000000e+00 300 302 1.38777878078145e-17 300 449 8.17556200689851e-18 300 392 8.71279265369455e-18 300 301 2.77555756156289e-17 300 448 1.15196480826585e-18 300 391 1.38777878078145e-17 300 399 1.11111111111111e-01 300 305 -1.26580603637683e-17 300 447 -2.77777777777777e-02 300 390 1.11111111111111e-01 300 158 -8.67361737988404e-19 300 44 2.26191678234788e-17 300 224 -4.16666666666667e-02 300 164 -8.33333333333333e-02 300 157 8.33333333333333e-02 300 43 2.81892564846231e-18 300 223 4.16666666666667e-02 300 163 8.53809210832335e-19 300 156 -9.72222222222222e-02 300 42 -1.11111111111111e-01 300 222 -6.94444444444445e-02 300 162 -9.72222222222222e-02 301 301 5.55555555555556e-01 301 269 -4.16666666666667e-02 301 395 4.16666666666667e-02 301 311 5.84452733605467e-19 301 304 -9.72222222222222e-02 301 268 5.55555555555555e-02 301 394 -6.94444444444444e-02 301 310 -1.38888888888889e-02 301 303 -8.33333333333333e-02 301 267 -1.75640751942652e-17 301 393 -4.16666666666667e-02 301 309 -8.94466792300541e-18 301 401 -7.70139296302555e-17 301 302 -1.66666666666667e-01 301 449 1.66666666666667e-01 301 392 3.31621869179531e-17 301 400 -2.22222222222222e-01 301 305 5.42101086242752e-18 301 448 -1.94444444444444e-01 301 391 1.11111111111111e-01 301 399 5.97666447582634e-18 301 300 2.77555756156289e-17 301 447 3.28140563766316e-18 301 390 3.46944695195361e-17 301 158 1.35660796832249e-17 301 44 -4.16666666666667e-02 301 224 4.16666666666667e-02 301 164 -7.59788553687107e-18 301 157 -9.72222222222222e-02 301 43 5.55555555555555e-02 301 223 -6.94444444444444e-02 301 163 -1.38888888888889e-02 301 156 8.33333333333334e-02 301 42 3.86247023947961e-18 301 222 4.16666666666667e-02 301 162 1.03168612975574e-18 302 302 5.55555555555555e-01 302 269 5.55555555555556e-02 302 395 -6.94444444444444e-02 302 311 -9.72222222222221e-02 302 304 2.60208521396521e-18 302 268 -4.16666666666667e-02 302 394 4.16666666666667e-02 302 310 1.40946282423116e-18 302 303 -1.29020058525775e-17 302 267 -4.26226979058364e-17 302 393 4.16666666666667e-02 302 309 8.33333333333333e-02 302 401 1.11111111111111e-01 302 305 -1.38888888888889e-02 302 449 -1.94444444444444e-01 302 392 -2.22222222222222e-01 302 400 -7.59890197640778e-17 302 301 -1.66666666666667e-01 302 448 1.66666666666667e-01 302 391 3.19416124409597e-17 302 399 0.00000000000000e+00 302 300 1.38777878078145e-17 302 447 7.81980816905170e-18 302 390 5.16181878056771e-18 302 158 -1.38888888888889e-02 302 44 5.55555555555555e-02 302 224 -6.94444444444444e-02 302 164 -9.72222222222222e-02 302 157 1.35525271560688e-17 302 43 -4.16666666666667e-02 302 223 4.16666666666667e-02 302 163 -7.94178091345632e-18 302 156 -1.47722546001150e-18 302 42 2.27275880407274e-17 302 222 -4.16666666666667e-02 302 162 -8.33333333333333e-02 303 303 1.11111111111111e+00 303 413 4.16666666666667e-02 303 331 -8.33333333333334e-02 303 412 -4.16666666666667e-02 303 330 -9.72222222222222e-02 303 411 -6.94444444444444e-02 303 416 -7.09711965845433e-17 303 326 -1.31595038685428e-17 303 452 1.66666666666667e-01 303 407 4.16666666666667e-02 303 415 -8.91891812140888e-17 303 325 8.33333333333333e-02 303 451 -1.69677639993981e-17 303 406 4.16666666666667e-02 303 414 -2.22222222222222e-01 303 324 -9.72222222222221e-02 303 450 -1.94444444444444e-01 303 405 -6.94444444444444e-02 303 308 -1.58293517182884e-17 303 281 6.93889390390723e-18 303 398 -4.16666666666667e-02 303 314 1.01339021809504e-17 303 307 8.33333333333333e-02 303 280 3.10081821330854e-17 303 397 4.16666666666667e-02 303 313 7.67073037033494e-18 303 306 -9.72222222222222e-02 303 279 1.11111111111111e-01 303 396 -6.94444444444445e-02 303 312 -2.77777777777779e-02 303 401 -5.91296759819282e-17 303 305 1.52655665885959e-16 303 269 6.93889390390723e-18 303 302 -1.29020058525775e-17 303 449 -1.66666666666667e-01 303 395 5.57445088082264e-17 303 311 1.44469939483693e-17 303 392 -4.16666666666667e-02 303 400 -3.05745012640912e-17 303 304 1.52655665885959e-16 303 268 3.48435473182529e-17 303 301 -8.33333333333334e-02 303 448 -1.73607872869241e-17 303 394 3.46944695195361e-17 303 310 1.06793913989822e-17 303 391 -4.16666666666667e-02 303 399 -2.22222222222222e-01 303 332 -1.06658388718261e-17 303 267 1.11111111111111e-01 303 300 -9.72222222222223e-02 303 447 -1.94444444444445e-01 303 393 2.22222222222222e-01 303 309 -2.77777777777779e-02 303 390 -6.94444444444445e-02 304 304 1.11111111111111e+00 304 413 4.16666666666667e-02 304 331 -9.72222222222224e-02 304 412 -6.94444444444445e-02 304 330 -8.33333333333334e-02 304 411 -4.16666666666667e-02 304 416 3.46944695195361e-17 304 326 2.08166817117217e-17 304 452 5.22314396594892e-17 304 407 -4.16666666666667e-02 304 415 1.11111111111111e-01 304 325 -9.72222222222222e-02 304 451 -2.77777777777776e-02 304 406 -6.94444444444444e-02 304 414 -8.72782748850831e-17 304 324 8.33333333333333e-02 304 450 -1.57480365553520e-17 304 405 4.16666666666667e-02 304 308 4.79894986596396e-17 304 281 -4.90838652274922e-17 304 398 4.16666666666667e-02 304 314 1.66666666666667e-01 304 307 -9.72222222222222e-02 304 280 -2.22222222222222e-01 304 397 -6.94444444444444e-02 304 313 -1.94444444444445e-01 304 306 8.33333333333333e-02 304 279 3.64698505769812e-17 304 396 4.16666666666667e-02 304 312 1.09030080970574e-17 304 401 1.38777878078145e-17 304 305 -1.38777878078145e-17 304 269 -5.11472374870037e-17 304 302 2.60208521396521e-18 304 449 -4.64495927615313e-17 304 395 3.23841871559000e-18 304 311 -1.66666666666667e-01 304 392 -4.16666666666667e-02 304 400 1.11111111111111e-01 304 332 -2.17247010311783e-17 304 268 -2.22222222222222e-01 304 301 -9.72222222222222e-02 304 448 -2.77777777777778e-02 304 394 2.22222222222222e-01 304 310 -1.94444444444445e-01 304 391 -6.94444444444445e-02 304 399 -3.18755438710738e-17 304 303 1.66533453693773e-16 304 267 3.18755438710738e-17 304 300 -8.33333333333334e-02 304 447 -1.84263547345700e-17 304 393 3.46944695195361e-17 304 309 8.30769914667018e-18 304 390 -4.16666666666667e-02 305 305 1.11111111111111e+00 305 413 -6.94444444444445e-02 305 331 -2.26598254049470e-17 305 412 4.16666666666667e-02 305 330 -1.10588621593521e-17 305 411 4.16666666666667e-02 305 416 1.11111111111111e-01 305 326 -1.38888888888888e-02 305 452 -1.94444444444444e-01 305 407 -6.94444444444444e-02 305 415 3.46944695195361e-17 305 325 2.38253427403690e-17 305 451 5.31801165604140e-17 305 406 -4.16666666666667e-02 305 414 -7.23569424862514e-17 305 324 -1.26851654180804e-17 305 450 1.66666666666667e-01 305 405 4.16666666666667e-02 305 308 -1.38888888888889e-02 305 281 1.11111111111111e-01 305 398 -6.94444444444444e-02 305 314 -1.94444444444445e-01 305 307 4.86806775445991e-17 305 280 -4.63767479280675e-17 305 397 4.16666666666667e-02 305 313 1.66666666666667e-01 305 306 -1.47451495458029e-17 305 279 6.93889390390723e-18 305 396 -4.16666666666667e-02 305 312 1.34170018845081e-17 305 401 1.11111111111111e-01 305 332 -1.38888888888889e-02 305 269 1.11111111111111e-01 305 302 -1.38888888888889e-02 305 449 -1.94444444444444e-01 305 395 -4.44444444444445e-01 305 311 -1.94444444444445e-01 305 392 -6.94444444444445e-02 305 400 1.38777878078145e-17 305 304 -1.38777878078145e-17 305 268 -5.10371232038606e-17 305 301 5.40745833527145e-18 305 448 -4.46284719249346e-17 305 394 7.36410444342889e-18 305 310 -1.66666666666667e-01 305 391 -4.16666666666667e-02 305 399 -6.08542350625380e-17 305 303 1.24900090270330e-16 305 267 1.38777878078145e-17 305 300 -1.22379320219301e-17 305 447 -1.66666666666667e-01 305 393 5.45556980667550e-17 305 309 1.35118695746006e-17 305 390 -4.16666666666667e-02 306 306 5.55555555555555e-01 306 308 2.77555756156289e-17 306 281 -1.53956708492942e-17 306 305 -1.47315970186468e-17 306 401 0.00000000000000e+00 306 398 1.39726554979069e-17 306 314 8.33333333333334e-02 306 395 4.16666666666667e-02 306 449 8.13659849132481e-18 306 307 -1.38777878078145e-17 306 280 -1.65882932390282e-17 306 304 8.33333333333333e-02 306 400 5.97666447582634e-18 306 397 -6.93889390390723e-18 306 313 -9.98821251402271e-18 306 394 4.16666666666667e-02 306 448 3.66426452982210e-18 306 279 -1.11111111111111e-01 306 303 -9.72222222222222e-02 306 399 1.11111111111111e-01 306 396 1.11111111111111e-01 306 312 -9.72222222222222e-02 306 393 -6.94444444444444e-02 306 447 -2.77777777777777e-02 306 158 2.16840434497101e-19 306 167 -8.33333333333334e-02 306 224 -4.16666666666667e-02 306 58 8.67361737988404e-19 306 157 -8.33333333333334e-02 306 166 -3.25260651745651e-19 306 223 -4.16666666666667e-02 306 57 -1.11111111111111e-01 306 156 -9.72222222222222e-02 306 165 -9.72222222222223e-02 306 222 -6.94444444444445e-02 306 59 -3.29597460435593e-17 307 307 5.55555555555555e-01 307 308 1.66666666666667e-01 307 281 4.16666666666667e-02 307 305 4.86806775445991e-17 307 401 -7.33869345501126e-17 307 398 1.24751012471613e-17 307 314 1.63985578588433e-18 307 395 -4.16666666666666e-02 307 449 -1.66666666666667e-01 307 280 5.55555555555556e-02 307 304 -9.72222222222222e-02 307 400 -2.22222222222222e-01 307 397 1.11111111111111e-01 307 313 -1.38888888888889e-02 307 394 -6.94444444444444e-02 307 448 -1.94444444444444e-01 307 306 -1.38777878078145e-17 307 279 -1.56125112837913e-17 307 303 8.33333333333333e-02 307 399 5.74627151417317e-18 307 396 -6.93889390390723e-18 307 312 -9.43255890062389e-18 307 393 4.16666666666667e-02 307 447 1.46367293285543e-18 307 158 7.26415455565288e-18 307 167 -1.34305544116642e-17 307 224 -4.16666666666667e-02 307 58 5.55555555555555e-02 307 157 -9.72222222222222e-02 307 166 -1.38888888888889e-02 307 223 -6.94444444444444e-02 307 57 1.95156391047391e-18 307 156 -8.33333333333333e-02 307 165 -3.79470760369927e-19 307 222 -4.16666666666667e-02 307 59 4.16666666666666e-02 308 308 5.55555555555555e-01 308 281 5.55555555555554e-02 308 305 -1.38888888888889e-02 308 401 1.11111111111111e-01 308 398 -2.22222222222222e-01 308 314 -9.72222222222222e-02 308 395 -6.94444444444444e-02 308 449 -1.94444444444444e-01 308 307 1.66666666666667e-01 308 280 4.16666666666667e-02 308 304 4.71221369216512e-17 308 400 -7.00750357263483e-17 308 397 1.26038502551440e-18 308 313 2.27682456221956e-18 308 394 -4.16666666666666e-02 308 448 -1.66666666666667e-01 308 306 2.77555756156289e-17 308 279 -1.64798730217797e-17 308 303 -1.40946282423116e-17 308 399 0.00000000000000e+00 308 396 6.17995238316738e-18 308 312 8.33333333333334e-02 308 393 4.16666666666667e-02 308 447 8.02309607639273e-18 308 158 -1.38888888888889e-02 308 167 -9.72222222222223e-02 308 224 -6.94444444444444e-02 308 58 4.16666666666666e-02 308 157 8.29414661951411e-18 308 166 -1.26851654180804e-17 308 223 -4.16666666666667e-02 308 57 -3.32850066953050e-17 308 156 4.06575814682064e-19 308 165 -8.33333333333334e-02 308 222 -4.16666666666667e-02 308 59 5.55555555555555e-02 309 309 1.11111111111111e+00 309 326 -8.33333333333334e-02 309 415 -4.16666666666667e-02 309 325 -7.32175279606617e-18 309 414 -6.94444444444444e-02 309 324 -9.72222222222222e-02 309 452 -2.50213532618920e-17 309 407 -1.46123771313207e-16 309 404 4.16666666666667e-02 309 317 8.33333333333333e-02 309 451 -1.66666666666667e-01 309 406 -8.96774957081809e-17 309 403 -4.16666666666667e-02 309 316 -7.92822838630025e-18 309 450 -1.94444444444444e-01 309 405 -2.22222222222222e-01 309 402 -6.94444444444444e-02 309 315 -9.72222222222220e-02 309 401 4.16666666666667e-02 309 305 1.25496401465197e-17 309 269 5.25651706407074e-17 309 302 8.33333333333333e-02 309 400 4.16666666666667e-02 309 304 7.88757080483204e-18 309 268 6.93889390390723e-18 309 301 -8.72782748850831e-18 309 399 -6.94444444444444e-02 309 303 -2.77777777777779e-02 309 267 1.11111111111111e-01 309 300 -9.72222222222223e-02 309 449 -2.78639958328775e-17 309 395 5.55111512312578e-17 309 311 2.35922392732846e-16 309 392 -8.86487741937406e-17 309 389 -4.16666666666667e-02 309 296 1.01067971266383e-17 309 245 5.06047128842873e-17 309 293 -8.33333333333334e-02 309 448 1.66666666666667e-01 309 394 5.94888179515640e-17 309 310 1.11022302462516e-16 309 391 -2.85975263651997e-17 309 388 4.16666666666667e-02 309 295 7.67073037033494e-18 309 244 1.38777878078145e-17 309 292 -8.36190925529445e-18 309 447 -1.94444444444444e-01 309 393 2.22222222222222e-01 309 416 -4.16666666666667e-02 309 390 -2.22222222222223e-01 309 387 -6.94444444444445e-02 309 294 -2.77777777777778e-02 309 243 1.11111111111111e-01 309 291 -9.72222222222223e-02 310 310 1.11111111111111e+00 310 326 -2.01390553539182e-17 310 415 -6.94444444444445e-02 310 325 -1.38888888888889e-02 310 414 -4.16666666666667e-02 310 324 -7.27770708280895e-18 310 452 -5.67241024117260e-17 310 407 2.77555756156289e-17 310 404 4.16666666666667e-02 310 317 2.65494006987388e-17 310 451 -1.94444444444445e-01 310 406 1.11111111111111e-01 310 403 -6.94444444444445e-02 310 316 -1.38888888888888e-02 310 450 -1.66666666666667e-01 310 405 -8.59213281035817e-17 310 402 -4.16666666666667e-02 310 315 -7.83336069620777e-18 310 401 -4.16666666666666e-02 310 305 -1.66666666666667e-01 310 269 2.29376522116465e-17 310 302 -3.38813178901720e-19 310 400 -6.94444444444444e-02 310 304 -1.94444444444445e-01 310 268 1.11111111111111e-01 310 301 -1.38888888888889e-02 310 399 4.16666666666667e-02 310 303 9.25637604759499e-18 310 267 6.93889390390723e-18 310 300 -1.01322081150559e-17 310 449 8.01919972483536e-17 310 395 -5.47992200390906e-17 310 311 1.38777878078145e-16 310 392 -4.85722573273506e-17 310 389 4.16666666666667e-02 310 296 1.66666666666667e-01 310 245 1.94946750392945e-17 310 293 -2.35305752747245e-17 310 448 -1.94444444444444e-01 310 394 -4.44444444444445e-01 310 416 -4.16666666666668e-02 310 391 1.11111111111111e-01 310 388 -6.94444444444444e-02 310 295 -1.94444444444445e-01 310 244 1.11111111111111e-01 310 292 -1.38888888888889e-02 310 447 1.66666666666667e-01 310 393 6.86867487257985e-17 310 309 1.38777878078145e-16 310 390 -3.00592934739238e-17 310 387 4.16666666666667e-02 310 294 1.06624507400371e-17 310 243 1.38777878078145e-17 310 291 -9.14287363266292e-18 311 311 1.11111111111111e+00 311 326 -9.72222222222225e-02 311 415 -4.16666666666668e-02 311 325 -2.04287406218792e-17 311 414 -4.16666666666667e-02 311 324 -8.33333333333334e-02 311 452 -2.77777777777778e-02 311 407 1.11111111111111e-01 311 404 -6.94444444444445e-02 311 317 -9.72222222222220e-02 311 451 -5.73407423973271e-17 311 406 3.46944695195361e-17 311 403 4.16666666666667e-02 311 316 2.58582218137793e-17 311 450 -2.66442683888313e-17 311 405 -1.47654783365370e-16 311 402 4.16666666666667e-02 311 315 8.33333333333333e-02 311 401 -6.94444444444444e-02 311 305 -1.94444444444445e-01 311 269 -2.22222222222222e-01 311 302 -9.72222222222221e-02 311 400 -4.16666666666666e-02 311 304 -1.66666666666667e-01 311 268 1.94944632810577e-17 311 301 5.86146799499976e-19 311 399 4.16666666666667e-02 311 303 1.45554141656179e-17 311 267 4.70810558237094e-17 311 300 8.33333333333333e-02 311 449 -2.77777777777778e-02 311 395 2.22222222222222e-01 311 416 -6.94444444444445e-02 311 392 1.11111111111111e-01 311 389 -6.94444444444444e-02 311 296 -1.94444444444445e-01 311 245 -2.22222222222222e-01 311 293 -9.72222222222223e-02 311 448 8.06781941600776e-17 311 394 -6.51283633143832e-17 311 310 1.38777878078145e-16 311 391 -4.85722573273506e-17 311 388 4.16666666666667e-02 311 295 1.66666666666667e-01 311 244 2.64054050977056e-17 311 292 -2.11012847819991e-17 311 447 -2.62444688377272e-17 311 393 4.85722573273506e-17 311 309 2.35922392732846e-16 311 390 -9.03726979996399e-17 311 387 -4.16666666666667e-02 311 294 1.34170018845081e-17 311 243 4.95683680733217e-17 311 291 -8.33333333333334e-02 312 312 1.11111111111111e+00 312 416 -4.16666666666667e-02 312 331 -9.13440330319037e-18 312 415 4.16666666666667e-02 312 330 -9.72222222222221e-02 312 414 -6.94444444444444e-02 312 413 5.35324822664718e-18 312 452 -2.77149180341607e-17 312 323 8.33333333333333e-02 312 404 4.16666666666667e-02 312 412 -9.19488145562433e-17 312 451 1.66666666666667e-01 312 322 -8.38901430960659e-18 312 403 4.16666666666667e-02 312 411 -2.22222222222222e-01 312 450 -1.94444444444444e-01 312 321 -9.72222222222221e-02 312 402 -6.94444444444444e-02 312 308 8.33333333333334e-02 312 281 4.11996825544492e-18 312 305 1.23327997120226e-17 312 401 4.16666666666667e-02 312 307 -9.32413868337534e-18 312 280 2.77555756156289e-17 312 304 1.08911496357958e-17 312 400 -4.16666666666667e-02 312 306 -9.72222222222222e-02 312 279 1.11111111111111e-01 312 303 -2.77777777777779e-02 312 399 -6.94444444444445e-02 312 398 -3.05745012640912e-17 312 314 1.38777878078145e-17 312 395 4.16333634234434e-17 312 449 -2.15891757596176e-17 312 299 -8.33333333333334e-02 312 257 -6.77626357803440e-20 312 296 1.09775469964157e-17 312 389 -4.16666666666667e-02 312 397 -3.31223763694322e-17 312 313 1.52655665885959e-16 312 394 6.70604454670702e-17 312 448 -1.66666666666667e-01 312 298 -8.99887803162969e-18 312 256 2.77555756156289e-17 312 295 1.06793913989822e-17 312 388 -4.16666666666667e-02 312 396 -2.22222222222222e-01 312 332 -8.33333333333334e-02 312 393 2.22222222222222e-01 312 447 -1.94444444444445e-01 312 297 -9.72222222222223e-02 312 255 1.11111111111111e-01 312 294 -2.77777777777778e-02 312 387 -6.94444444444445e-02 313 313 1.11111111111111e+00 313 416 4.16666666666667e-02 313 331 -1.38888888888888e-02 313 415 -6.94444444444444e-02 313 330 -7.26415455565288e-18 313 414 4.16666666666667e-02 313 413 -6.93889390390723e-18 313 452 3.42065785419177e-17 313 323 2.55600662163458e-17 313 404 -4.16666666666667e-02 313 412 1.11111111111112e-01 313 451 -1.94444444444444e-01 313 322 -1.38888888888888e-02 313 403 -6.94444444444444e-02 313 411 -9.05986440383200e-17 313 450 1.66666666666667e-01 313 321 -7.26415455565288e-18 313 402 4.16666666666667e-02 313 308 2.27682456221956e-18 313 281 -1.99086623922651e-17 313 305 1.66666666666667e-01 313 401 4.16666666666667e-02 313 307 -1.38888888888889e-02 313 280 1.11111111111111e-01 313 304 -1.94444444444445e-01 313 400 -6.94444444444444e-02 313 306 -9.98821251402271e-18 313 279 2.77555756156289e-17 313 303 5.93600689435814e-18 313 399 -4.16666666666667e-02 313 398 -3.46944695195361e-17 313 314 4.16333634234434e-17 313 395 -4.47470565375502e-17 313 449 -4.39101879856629e-18 313 299 -2.11961524720916e-17 313 257 -1.63409596184300e-17 313 296 -1.66666666666667e-01 313 389 -4.16666666666667e-02 313 397 1.11111111111111e-01 313 332 -2.87313575708659e-17 313 394 -4.44444444444445e-01 313 448 -1.94444444444444e-01 313 298 -1.38888888888889e-02 313 256 1.11111111111111e-01 313 295 -1.94444444444445e-01 313 388 -6.94444444444445e-02 313 396 -3.47774787483671e-17 313 312 1.52655665885959e-16 313 393 6.25771000772532e-17 313 447 -1.66666666666667e-01 313 297 -9.32413868337534e-18 313 255 2.77555756156289e-17 313 294 8.09085871217308e-18 313 387 -4.16666666666667e-02 314 314 1.11111111111111e+00 314 416 -6.94444444444445e-02 314 331 -2.97342445804150e-17 314 415 4.16666666666667e-02 314 330 -8.33333333333334e-02 314 414 -4.16666666666667e-02 314 413 1.11111111111111e-01 314 452 -2.77777777777776e-02 314 323 -9.72222222222223e-02 314 404 -6.94444444444444e-02 314 412 -6.93889390390723e-18 314 451 3.81740808668568e-17 314 322 2.73218947466347e-17 314 403 -4.16666666666667e-02 314 411 3.57786716920216e-18 314 450 -2.82976767018717e-17 314 321 8.33333333333333e-02 314 402 4.16666666666667e-02 314 308 -9.72222222222222e-02 314 281 -2.22222222222222e-01 314 305 -1.94444444444445e-01 314 401 -6.94444444444444e-02 314 307 1.62630325872826e-18 314 280 -1.62308453352869e-17 314 304 1.66666666666667e-01 314 400 4.16666666666667e-02 314 306 8.33333333333334e-02 314 279 3.29326409892472e-18 314 303 1.01203496537944e-17 314 399 4.16666666666667e-02 314 398 1.11111111111111e-01 314 332 -9.72222222222222e-02 314 395 2.22222222222222e-01 314 449 -2.77777777777778e-02 314 299 -9.72222222222222e-02 314 257 -2.22222222222222e-01 314 296 -1.94444444444445e-01 314 389 -6.94444444444445e-02 314 397 -3.46944695195361e-17 314 313 4.16333634234434e-17 314 394 -5.33895454566226e-17 314 448 -4.38763066677728e-19 314 298 -2.17924636669586e-17 314 256 -1.99222149194211e-17 314 295 -1.66666666666667e-01 314 388 -4.16666666666667e-02 314 396 -3.21872519956634e-17 314 312 1.38777878078145e-17 314 393 4.16333634234434e-17 314 447 -2.18653085004225e-17 314 297 -8.33333333333334e-02 314 255 4.98732999343332e-18 314 294 1.35118695746006e-17 314 387 -4.16666666666667e-02 315 315 5.55555555555555e-01 315 335 -8.33333333333333e-02 315 320 7.33869345501126e-18 315 248 6.56662292358896e-18 315 409 -4.16666666666667e-02 315 334 4.31478583331341e-18 315 319 -8.33333333333334e-02 315 247 8.82290693683761e-18 315 408 -6.94444444444444e-02 315 333 -9.72222222222222e-02 315 318 -9.72222222222222e-02 315 246 -1.11111111111111e-01 315 395 4.16666666666667e-02 315 452 4.05220561966457e-18 315 407 3.00086832553254e-17 315 311 8.33333333333333e-02 315 296 -1.30781887056064e-17 315 404 -1.38777878078145e-17 315 317 8.32667268468867e-17 315 245 -7.09051280146575e-17 315 394 4.16666666666667e-02 315 451 -6.77626357803440e-19 315 406 -2.77555756156289e-17 315 310 -7.73849300611529e-18 315 295 8.33333333333333e-02 315 403 1.71388646547435e-17 315 316 4.16333634234434e-17 315 244 -4.36509959038031e-17 315 393 -6.94444444444444e-02 315 450 -2.77777777777778e-02 315 405 1.11111111111111e-01 315 309 -9.72222222222220e-02 315 294 -9.72222222222220e-02 315 402 1.11111111111111e-01 315 410 -4.16666666666667e-02 315 243 -1.11111111111111e-01 316 316 5.55555555555555e-01 316 335 2.08708918203460e-18 316 320 3.50502233573829e-18 316 248 4.16666666666667e-02 316 409 -6.94444444444444e-02 316 334 -1.38888888888889e-02 316 319 -9.72222222222221e-02 316 247 5.55555555555555e-02 316 408 -4.16666666666667e-02 316 333 3.56431464204610e-18 316 318 -8.33333333333334e-02 316 246 5.65140382408069e-18 316 395 -4.16666666666667e-02 316 452 -1.66666666666667e-01 316 407 -1.99239089853157e-17 316 311 2.75793927626000e-17 316 296 1.34830704543940e-17 316 404 9.06897000801498e-18 316 317 1.66666666666667e-01 316 245 4.16666666666667e-02 316 394 -6.94444444444444e-02 316 451 -1.94444444444445e-01 316 406 1.11111111111111e-01 316 310 -1.38888888888888e-02 316 295 -9.72222222222221e-02 316 403 -2.22222222222222e-01 316 410 -4.16666666666667e-02 316 244 5.55555555555557e-02 316 393 4.16666666666667e-02 316 450 1.11300129269215e-18 316 405 -2.08166817117217e-17 316 309 -7.90112333198811e-18 316 294 8.33333333333333e-02 316 402 2.32421605561844e-17 316 315 4.16333634234434e-17 316 243 -4.49134985116856e-17 317 317 5.55555555555556e-01 317 335 -9.72222222222222e-02 317 320 -1.38888888888889e-02 317 248 5.55555555555555e-02 317 409 -4.16666666666667e-02 317 334 -1.86177841806495e-18 317 319 4.25549352700560e-18 317 247 4.16666666666667e-02 317 408 -4.16666666666667e-02 317 333 -8.33333333333333e-02 317 318 8.78203759713259e-18 317 246 9.69683318016723e-18 317 395 -6.94444444444444e-02 317 452 -1.94444444444445e-01 317 407 -2.22222222222222e-01 317 311 -9.72222222222220e-02 317 296 -1.38888888888888e-02 317 404 1.11111111111111e-01 317 410 -6.94444444444444e-02 317 245 5.55555555555557e-02 317 394 -4.16666666666667e-02 317 451 -1.66666666666667e-01 317 406 -2.37042170289116e-17 317 310 2.56820389607504e-17 317 295 1.33763443030399e-17 317 403 6.28837260041593e-18 317 316 1.66666666666667e-01 317 244 4.16666666666667e-02 317 393 4.16666666666667e-02 317 450 1.83297929785831e-18 317 405 2.55280907225869e-17 317 309 8.33333333333333e-02 317 294 -1.21024067503694e-17 317 402 -1.38777878078145e-17 317 315 6.93889390390723e-17 317 243 -7.32552209268145e-17 318 318 1.11111111111111e+00 318 347 -1.37049930865746e-17 318 427 -4.16666666666667e-02 318 346 -8.33333333333334e-02 318 426 -6.94444444444444e-02 318 345 -9.72222222222222e-02 318 455 -1.66666666666667e-01 318 422 -4.16666666666667e-02 318 419 -7.34369094940006e-17 318 341 -1.64442976379950e-17 318 454 6.24432688715870e-18 318 421 4.16666666666667e-02 318 418 2.27216588100966e-17 318 340 8.33333333333334e-02 318 453 -1.94444444444445e-01 318 420 -6.94444444444444e-02 318 417 -2.22222222222223e-01 318 339 -9.72222222222223e-02 318 413 4.16666666666667e-02 318 338 1.51788304147971e-18 318 323 6.83047368665868e-18 318 260 6.93889390390723e-18 318 412 4.16666666666667e-02 318 337 -4.11996825544492e-18 318 322 8.33333333333334e-02 318 259 -1.18889544476614e-17 318 411 -6.94444444444445e-02 318 336 -2.77777777777777e-02 318 321 -9.72222222222222e-02 318 258 1.11111111111111e-01 318 452 1.66666666666667e-01 318 410 3.50569996209610e-17 318 335 1.53143556863578e-18 318 407 4.16666666666667e-02 318 404 -1.30714124420284e-17 318 320 8.32667268468867e-17 318 248 6.93889390390723e-18 318 317 7.91467585914418e-18 318 451 7.04731412115578e-18 318 409 -2.08166817117217e-17 318 334 -4.18095462764723e-18 318 406 -4.16666666666667e-02 318 403 1.79435459546351e-17 318 319 -1.38777878078145e-17 318 247 -1.34199664998235e-17 318 316 -8.33333333333334e-02 318 450 -1.94444444444444e-01 318 408 2.22222222222222e-01 318 333 -2.77777777777777e-02 318 405 -6.94444444444444e-02 318 402 -2.22222222222222e-01 318 428 -4.16666666666667e-02 318 246 1.11111111111111e-01 318 315 -9.72222222222222e-02 319 319 1.11111111111111e+00 319 347 -3.69814584771228e-17 319 427 -6.94444444444444e-02 319 346 -9.72222222222221e-02 319 426 -4.16666666666667e-02 319 345 -8.33333333333334e-02 319 455 1.91226158172131e-17 319 422 4.16666666666667e-02 319 419 6.93889390390723e-18 319 341 1.52059354691092e-17 319 454 -2.77777777777778e-02 319 421 -6.94444444444444e-02 319 418 1.11111111111111e-01 319 340 -9.72222222222222e-02 319 453 6.19350491032344e-18 319 420 4.16666666666667e-02 319 417 2.25005832108632e-17 319 339 8.33333333333334e-02 319 413 -4.16666666666667e-02 319 338 -1.66666666666667e-01 319 323 1.56192875473693e-18 319 260 1.70679256454110e-17 319 412 -6.94444444444445e-02 319 337 -1.94444444444444e-01 319 322 -9.72222222222222e-02 319 259 -2.22222222222222e-01 319 411 4.16666666666667e-02 319 336 -4.42320605056196e-18 319 321 8.33333333333334e-02 319 258 -1.61016728108306e-17 319 452 -1.66967134562768e-17 319 410 -1.71964628951568e-17 319 335 1.66666666666667e-01 319 407 4.16666666666667e-02 319 404 -3.46944695195361e-17 319 320 6.93889390390723e-17 319 248 1.50890449223881e-17 319 317 4.30970363562988e-18 319 451 -2.77777777777778e-02 319 409 2.22222222222222e-01 319 334 -1.94444444444444e-01 319 406 -6.94444444444444e-02 319 403 1.11111111111111e-01 319 428 -4.16666666666667e-02 319 247 -2.22222222222222e-01 319 316 -9.72222222222221e-02 319 450 7.61990839349969e-18 319 408 -1.38777878078145e-17 319 333 -4.11996825544492e-18 319 405 -4.16666666666667e-02 319 402 1.88769762625093e-17 319 318 -1.38777878078145e-17 319 246 -1.17534291761007e-17 319 315 -8.33333333333334e-02 320 320 1.11111111111111e+00 320 347 -1.38888888888889e-02 320 427 -4.16666666666667e-02 320 346 -3.80690487813973e-17 320 426 -4.16666666666667e-02 320 345 -1.44334414212133e-17 320 455 -1.94444444444445e-01 320 422 -6.94444444444445e-02 320 419 1.11111111111111e-01 320 341 -1.38888888888889e-02 320 454 1.49094739375702e-17 320 421 4.16666666666667e-02 320 418 6.93889390390723e-18 320 340 1.52923328297291e-17 320 453 -1.66666666666667e-01 320 420 -4.16666666666667e-02 320 417 -7.40069626675027e-17 320 339 -1.64392154403115e-17 320 413 -6.94444444444445e-02 320 338 -1.94444444444444e-01 320 323 -1.38888888888889e-02 320 260 1.11111111111111e-01 320 412 -4.16666666666667e-02 320 337 -1.66666666666667e-01 320 322 3.17129135452010e-18 320 259 1.51940770078476e-17 320 411 4.16666666666667e-02 320 336 2.90871114087127e-18 320 321 5.34477789717464e-18 320 258 6.93889390390723e-18 320 452 -1.94444444444444e-01 320 410 -4.44444444444445e-01 320 335 -1.94444444444444e-01 320 407 -6.94444444444445e-02 320 404 1.11111111111111e-01 320 428 -6.94444444444445e-02 320 248 1.11111111111111e-01 320 317 -1.38888888888889e-02 320 451 -1.97578905276538e-17 320 409 -1.60072286372118e-17 320 334 1.66666666666667e-01 320 406 4.16666666666667e-02 320 403 -3.46944695195361e-17 320 319 6.93889390390723e-17 320 247 1.16670318154807e-17 320 316 3.50671640163280e-18 320 450 1.66666666666667e-01 320 408 3.91229695260184e-17 320 333 4.68409219831628e-18 320 405 4.16666666666667e-02 320 402 -1.27321757466530e-17 320 318 8.32667268468867e-17 320 246 6.93889390390723e-18 320 315 7.33869345501126e-18 321 321 5.55555555555556e-01 321 395 4.16666666666667e-02 321 257 2.92734586571086e-18 321 296 -9.24282352043893e-18 321 313 -7.15573433840433e-18 321 394 -4.16666666666667e-02 321 256 -4.72034520845876e-17 321 295 -8.33333333333334e-02 321 312 -9.72222222222221e-02 321 393 -6.94444444444444e-02 321 255 -1.11111111111111e-01 321 294 -9.72222222222221e-02 321 413 1.08420217248550e-17 321 338 -8.33333333333334e-02 321 410 -4.16666666666667e-02 321 452 4.06575814682064e-18 321 323 -1.38777878078145e-17 321 260 -1.95156391047391e-17 321 320 6.21213963516304e-18 321 404 -6.93889390390723e-18 321 412 6.93889390390723e-18 321 337 3.71339244076285e-18 321 409 4.16666666666667e-02 321 451 1.91260039490021e-18 321 322 5.55111512312578e-17 321 259 8.75323847692594e-18 321 319 8.33333333333334e-02 321 403 1.89038695585847e-17 321 411 1.11111111111111e-01 321 336 -9.72222222222222e-02 321 408 -6.94444444444444e-02 321 450 -2.77777777777779e-02 321 314 8.33333333333333e-02 321 258 -1.11111111111111e-01 321 318 -9.72222222222222e-02 321 402 1.11111111111111e-01 322 322 5.55555555555556e-01 322 395 4.16666666666667e-02 322 257 -4.16666666666667e-02 322 296 -3.11979175132704e-17 322 313 -1.38888888888888e-02 322 394 -6.94444444444445e-02 322 256 5.55555555555557e-02 322 295 -9.72222222222224e-02 322 312 -8.49743452685514e-18 322 393 -4.16666666666667e-02 322 255 -4.64411224320588e-17 322 294 -8.33333333333334e-02 322 413 -2.42996811908314e-17 322 338 5.42101086242752e-19 322 410 4.16666666666667e-02 322 452 1.66666666666667e-01 322 323 -1.66666666666667e-01 322 260 -4.16666666666667e-02 322 320 3.22550146314438e-18 322 404 8.94636198889992e-18 322 412 1.11111111111111e-01 322 337 -1.38888888888889e-02 322 409 -6.94444444444444e-02 322 451 -1.94444444444445e-01 322 314 2.77555756156289e-17 322 259 5.55555555555555e-02 322 319 -9.72222222222222e-02 322 403 -2.22222222222222e-01 322 411 6.93889390390723e-18 322 336 5.09575021068187e-18 322 408 4.16666666666667e-02 322 450 1.93801138331784e-18 322 321 5.55111512312578e-17 322 258 9.63584680796492e-18 322 318 8.33333333333334e-02 322 402 1.66933253244878e-17 323 323 5.55555555555556e-01 323 395 -6.94444444444445e-02 323 257 5.55555555555557e-02 323 296 -1.38888888888889e-02 323 313 2.73896573824151e-17 323 394 4.16666666666667e-02 323 256 -4.16666666666667e-02 323 295 -3.15248722309106e-17 323 312 8.33333333333333e-02 323 393 4.16666666666667e-02 323 255 4.81114714040443e-18 323 294 -9.42070043936233e-18 323 413 -2.22222222222222e-01 323 338 -9.72222222222222e-02 323 410 -6.94444444444444e-02 323 452 -1.94444444444445e-01 323 314 -9.72222222222223e-02 323 260 5.55555555555556e-02 323 320 -1.38888888888889e-02 323 404 1.11111111111111e-01 323 412 -1.89379626347116e-17 323 337 -3.52365706057789e-19 323 409 4.16666666666667e-02 323 451 1.66666666666667e-01 323 322 -1.66666666666667e-01 323 259 -4.16666666666667e-02 323 319 2.43098455861984e-18 323 403 1.25384169599686e-17 323 411 7.87401827767598e-18 323 336 -8.33333333333334e-02 323 408 -4.16666666666667e-02 323 450 1.76352259618345e-18 323 321 -1.38777878078145e-17 323 258 -1.75640751942652e-17 323 318 7.68428289749101e-18 323 402 -6.93889390390723e-18 324 324 5.55555555555556e-01 324 272 8.29245255361960e-18 324 410 4.16666666666667e-02 324 335 8.33333333333334e-02 324 328 -8.33333333333333e-02 324 271 9.29703362906320e-18 324 409 -4.16666666666667e-02 324 334 3.79809573548828e-18 324 327 -9.72222222222223e-02 324 270 -1.11111111111111e-01 324 408 -6.94444444444444e-02 324 333 -9.72222222222222e-02 324 305 -1.29020058525775e-17 324 416 2.08166817117217e-17 324 326 5.55111512312578e-17 324 269 -7.36444325660779e-17 324 395 -4.16666666666667e-02 324 452 1.74997006902738e-18 324 407 2.89958436086460e-17 324 311 -8.33333333333334e-02 324 304 8.33333333333333e-02 324 415 1.74556549770166e-17 324 325 2.77555756156289e-17 324 268 -4.39101879856629e-17 324 394 4.16666666666667e-02 324 451 2.16840434497101e-18 324 406 -2.77555756156289e-17 324 310 -7.06086664831185e-18 324 303 -9.72222222222221e-02 324 414 1.11111111111111e-01 324 329 6.88468379528295e-18 324 267 -1.11111111111111e-01 324 393 -6.94444444444444e-02 324 450 -2.77777777777778e-02 324 405 1.11111111111111e-01 324 309 -9.72222222222222e-02 325 325 5.55555555555556e-01 325 272 -4.16666666666667e-02 325 410 4.16666666666667e-02 325 335 -1.31578098026483e-17 325 328 -9.72222222222222e-02 325 271 5.55555555555555e-02 325 409 -6.94444444444444e-02 325 334 -1.38888888888889e-02 325 327 -8.33333333333334e-02 325 270 7.15573433840433e-18 325 408 -4.16666666666667e-02 325 333 3.57786716920216e-18 325 305 2.37033699959643e-17 325 416 3.22092748522920e-17 325 326 -1.66666666666667e-01 325 269 -4.16666666666667e-02 325 395 4.16666666666667e-02 325 452 1.66666666666667e-01 325 407 -2.02349818351948e-17 325 311 -2.04253524900902e-17 325 304 -9.72222222222222e-02 325 415 -2.22222222222222e-01 325 329 1.09639944692597e-17 325 268 5.55555555555557e-02 325 394 -6.94444444444444e-02 325 451 -1.94444444444445e-01 325 406 1.11111111111111e-01 325 310 -1.38888888888889e-02 325 303 8.33333333333333e-02 325 414 2.04643160056639e-17 325 324 2.77555756156289e-17 325 267 -4.46284719249346e-17 325 393 4.16666666666667e-02 325 450 1.07064964532944e-18 325 405 -2.08166817117217e-17 325 309 -7.53689916466876e-18 326 326 5.55555555555556e-01 326 272 5.55555555555555e-02 326 410 -6.94444444444445e-02 326 335 -9.72222222222222e-02 326 328 1.00830802041152e-17 326 271 -4.16666666666667e-02 326 409 4.16666666666667e-02 326 334 -1.08962318334793e-17 326 327 6.72205346941013e-18 326 270 7.46744246299391e-18 326 408 4.16666666666667e-02 326 333 8.33333333333334e-02 326 305 -1.38888888888888e-02 326 416 1.11111111111111e-01 326 329 -1.38888888888889e-02 326 269 5.55555555555557e-02 326 395 -6.94444444444445e-02 326 452 -1.94444444444445e-01 326 407 -2.22222222222222e-01 326 311 -9.72222222222225e-02 326 304 2.08166817117217e-17 326 415 3.03170032481259e-17 326 325 -1.66666666666667e-01 326 268 -4.16666666666667e-02 326 394 4.16666666666667e-02 326 451 1.66666666666667e-01 326 406 -1.98680048107969e-17 326 310 -2.01390553539182e-17 326 303 -1.26174027823001e-17 326 414 1.38777878078145e-17 326 324 5.55111512312578e-17 326 267 -7.41170769506458e-17 326 393 -4.16666666666667e-02 326 450 3.63207727782644e-18 326 405 2.96156599677994e-17 326 309 -8.33333333333334e-02 327 327 1.11111111111111e+00 327 428 4.16666666666667e-02 327 355 -8.33333333333333e-02 327 427 -4.16666666666667e-02 327 354 -9.72222222222223e-02 327 426 -6.94444444444444e-02 327 431 -7.62261889893090e-17 327 350 -1.65205306032479e-17 327 455 1.66666666666667e-01 327 422 4.16666666666667e-02 327 430 2.60344046668082e-17 327 349 8.33333333333334e-02 327 454 5.90381964236247e-18 327 421 4.16666666666667e-02 327 429 -2.22222222222222e-01 327 348 -9.72222222222223e-02 327 453 -1.94444444444444e-01 327 420 -6.94444444444444e-02 327 332 4.77048955893622e-18 327 284 -1.38777878078145e-17 327 413 -4.16666666666667e-02 327 338 1.22650370762423e-18 327 331 8.33333333333333e-02 327 283 -7.58941520739853e-18 327 412 4.16666666666667e-02 327 337 -4.10641572828885e-18 327 330 -9.72222222222223e-02 327 282 1.11111111111111e-01 327 411 -6.94444444444444e-02 327 336 -2.77777777777777e-02 327 416 -1.24954300378954e-17 327 329 5.55111512312578e-17 327 272 -1.38777878078145e-17 327 326 6.72205346941013e-18 327 452 -1.66666666666667e-01 327 410 3.29415348351934e-17 327 335 1.27054942088145e-18 327 407 -4.16666666666667e-02 327 415 1.58293517182884e-17 327 328 -5.55111512312578e-17 327 271 -9.17506088465858e-18 327 325 -8.33333333333334e-02 327 451 8.87690528722507e-18 327 409 -2.08166817117217e-17 327 334 -3.87941089842470e-18 327 406 -4.16666666666667e-02 327 414 -2.22222222222222e-01 327 356 -1.43385737311208e-17 327 270 1.11111111111111e-01 327 324 -9.72222222222223e-02 327 450 -1.94444444444444e-01 327 408 2.22222222222222e-01 327 333 -2.77777777777777e-02 327 405 -6.94444444444444e-02 328 328 1.11111111111111e+00 328 428 4.16666666666666e-02 328 355 -9.72222222222222e-02 328 427 -6.94444444444444e-02 328 354 -8.33333333333333e-02 328 426 -4.16666666666667e-02 328 431 5.55111512312578e-17 328 350 1.88651178012478e-17 328 455 -9.42747670294036e-18 328 422 -4.16666666666667e-02 328 430 1.11111111111111e-01 328 349 -9.72222222222223e-02 328 454 -2.77777777777777e-02 328 421 -6.94444444444444e-02 328 429 3.06829214813398e-17 328 348 8.33333333333334e-02 328 453 5.44811591673966e-18 328 420 4.16666666666667e-02 328 332 1.01915004213637e-17 328 284 1.06726151354042e-18 328 413 4.16666666666667e-02 328 338 1.66666666666667e-01 328 331 -9.72222222222223e-02 328 283 -2.22222222222222e-01 328 412 -6.94444444444444e-02 328 337 -1.94444444444444e-01 328 330 8.33333333333334e-02 328 282 -9.28348110190713e-18 328 411 4.16666666666667e-02 328 336 -3.93700913883799e-18 328 416 -1.38777878078145e-17 328 329 0.00000000000000e+00 328 272 -1.15196480826585e-18 328 326 1.00830802041152e-17 328 452 -3.45589442479755e-19 328 410 -1.23277175143391e-17 328 335 -1.66666666666667e-01 328 407 -4.16666666666667e-02 328 415 1.11111111111111e-01 328 356 -3.39219754716402e-17 328 271 -2.22222222222222e-01 328 325 -9.72222222222222e-02 328 451 -2.77777777777778e-02 328 409 2.22222222222222e-01 328 334 -1.94444444444444e-01 328 406 -6.94444444444444e-02 328 414 1.64663204946236e-17 328 327 -5.55111512312578e-17 328 270 -7.69783542464708e-18 328 324 -8.33333333333333e-02 328 450 7.06425478010086e-18 328 408 -6.93889390390723e-18 328 333 -3.67273485929465e-18 328 405 -4.16666666666667e-02 329 329 1.11111111111111e+00 329 428 -6.94444444444444e-02 329 355 -3.17671236538253e-17 329 427 4.16666666666666e-02 329 354 -1.47451495458029e-17 329 426 4.16666666666667e-02 329 431 1.11111111111111e-01 329 350 -1.38888888888889e-02 329 455 -1.94444444444444e-01 329 422 -6.94444444444444e-02 329 430 5.55111512312578e-17 329 349 1.86618298939067e-17 329 454 -1.02321580028319e-17 329 421 -4.16666666666667e-02 329 429 -7.51081054989333e-17 329 348 -1.65882932390282e-17 329 453 1.66666666666667e-01 329 420 4.16666666666667e-02 329 332 -1.38888888888889e-02 329 284 1.11111111111111e-01 329 413 -6.94444444444444e-02 329 338 -1.94444444444444e-01 329 331 8.45677694538693e-18 329 283 2.30392961653170e-18 329 412 4.16666666666667e-02 329 337 1.66666666666667e-01 329 330 5.78692909564138e-18 329 282 -1.38777878078145e-17 329 411 -4.16666666666667e-02 329 336 2.81892564846231e-18 329 416 1.11111111111111e-01 329 356 -1.38888888888889e-02 329 272 1.11111111111111e-01 329 326 -1.38888888888889e-02 329 452 -1.94444444444444e-01 329 410 -4.44444444444445e-01 329 335 -1.94444444444444e-01 329 407 -6.94444444444444e-02 329 415 -2.08166817117217e-17 329 328 0.00000000000000e+00 329 271 -8.31786354203723e-19 329 325 9.33769121053141e-18 329 451 4.51299154297091e-18 329 409 -2.23836926641421e-17 329 334 -1.66666666666667e-01 329 406 -4.16666666666667e-02 329 414 -1.28223847555356e-17 329 327 5.55111512312578e-17 329 270 -1.38777878078145e-17 329 324 6.87113126812688e-18 329 450 -1.66666666666667e-01 329 408 3.27937275858975e-17 329 333 1.20617491689012e-18 329 405 -4.16666666666667e-02 330 330 5.55555555555555e-01 330 305 -1.04083408558608e-17 330 314 -8.33333333333334e-02 330 395 -4.16666666666667e-02 330 280 -4.33680868994202e-17 330 304 -8.33333333333334e-02 330 313 -8.23993651088983e-18 330 394 -4.16666666666667e-02 330 279 -1.11111111111111e-01 330 303 -9.72222222222222e-02 330 312 -9.72222222222221e-02 330 393 -6.94444444444444e-02 330 332 1.38777878078145e-17 330 284 -2.02745806254789e-17 330 329 5.80048162279745e-18 330 416 2.08166817117217e-17 330 413 1.13299127024735e-17 330 338 8.33333333333334e-02 330 410 4.16666666666667e-02 330 452 1.94139951510686e-18 330 331 2.77555756156289e-17 330 283 6.28837260041593e-18 330 328 8.33333333333334e-02 330 415 2.04643160056639e-17 330 412 6.93889390390723e-18 330 337 2.73761048552590e-18 330 409 4.16666666666667e-02 330 451 2.30562368242621e-18 330 281 1.73472347597681e-18 330 282 -1.11111111111111e-01 330 327 -9.72222222222223e-02 330 414 1.11111111111111e-01 330 411 1.11111111111111e-01 330 336 -9.72222222222222e-02 330 408 -6.94444444444445e-02 330 450 -2.77777777777778e-02 331 331 5.55555555555556e-01 331 305 -2.39608680119296e-17 331 314 -2.96122718360103e-17 331 395 -4.16666666666668e-02 331 280 5.55555555555558e-02 331 304 -9.72222222222224e-02 331 313 -1.38888888888888e-02 331 394 -6.94444444444445e-02 331 279 -4.62954327651310e-17 331 303 -8.33333333333334e-02 331 312 -8.03664860354880e-18 331 393 -4.16666666666667e-02 331 332 1.66666666666667e-01 331 284 4.16666666666667e-02 331 329 8.45677694538693e-18 331 416 3.55211736760563e-17 331 413 -1.86635239598013e-17 331 338 -6.45100292628875e-18 331 410 -4.16666666666667e-02 331 452 -1.66666666666667e-01 331 281 4.16666666666667e-02 331 283 5.55555555555555e-02 331 328 -9.72222222222223e-02 331 415 -2.22222222222222e-01 331 412 1.11111111111111e-01 331 337 -1.38888888888889e-02 331 409 -6.94444444444445e-02 331 451 -1.94444444444445e-01 331 330 5.55111512312578e-17 331 282 6.07153216591882e-18 331 327 8.33333333333333e-02 331 414 1.82145964977565e-17 331 411 1.38777878078145e-17 331 336 4.77048955893622e-18 331 408 4.16666666666667e-02 331 450 -1.20617491689012e-18 332 332 5.55555555555556e-01 332 305 -1.38888888888889e-02 332 314 -9.72222222222222e-02 332 395 -6.94444444444445e-02 332 280 4.16666666666667e-02 332 304 -2.18195687212708e-17 332 313 -2.87313575708659e-17 332 394 -4.16666666666668e-02 332 279 3.14418630020796e-18 332 303 -1.06522863446701e-17 332 312 -8.33333333333334e-02 332 393 -4.16666666666667e-02 332 281 5.55555555555558e-02 332 284 5.55555555555555e-02 332 329 -1.38888888888889e-02 332 416 1.11111111111111e-01 332 413 -2.22222222222222e-01 332 338 -9.72222222222222e-02 332 410 -6.94444444444445e-02 332 452 -1.94444444444445e-01 332 331 1.66666666666667e-01 332 283 4.16666666666667e-02 332 328 1.02999206386123e-17 332 415 3.58430461960130e-17 332 412 -1.82145964977565e-17 332 337 -5.74627151417317e-18 332 409 -4.16666666666667e-02 332 451 -1.66666666666667e-01 332 330 -1.38777878078145e-17 332 282 -1.99493199737333e-17 332 327 4.77048955893622e-18 332 414 1.38777878078145e-17 332 411 3.90312782094782e-18 332 336 8.33333333333333e-02 332 408 4.16666666666667e-02 332 450 3.51010453342182e-18 333 333 1.11111111111111e+00 333 350 -8.33333333333334e-02 333 430 -4.16666666666667e-02 333 349 3.35763860291605e-18 333 429 -6.94444444444444e-02 333 348 -9.72222222222223e-02 333 455 -3.23803755076374e-17 333 422 -4.32994772306926e-17 333 419 4.16666666666667e-02 333 341 8.33333333333333e-02 333 454 -1.66666666666667e-01 333 421 2.37330161491182e-17 333 418 -4.16666666666667e-02 333 340 3.66765266161112e-18 333 453 -1.94444444444445e-01 333 420 -2.22222222222223e-01 333 417 -6.94444444444444e-02 333 339 -9.72222222222222e-02 333 416 4.16666666666667e-02 333 329 1.51788304147971e-18 333 272 -2.45639554703747e-18 333 326 8.33333333333334e-02 333 415 4.16666666666667e-02 333 328 -3.68628738645072e-18 333 271 -6.93889390390723e-18 333 325 3.46944695195361e-18 333 414 -6.94444444444445e-02 333 327 -2.77777777777777e-02 333 270 1.11111111111111e-01 333 324 -9.72222222222222e-02 333 452 1.35525271560688e-17 333 410 -6.93889390390723e-18 333 335 1.38777878078145e-17 333 407 1.45757429563520e-17 333 404 -4.16666666666667e-02 333 320 1.19939865331209e-18 333 248 1.02194525086231e-18 333 317 -8.33333333333333e-02 333 451 1.66666666666667e-01 333 409 -1.93970544921235e-17 333 334 -1.38777878078145e-17 333 406 1.89057753827160e-17 333 403 4.16666666666667e-02 333 319 -4.54009659728305e-18 333 247 -6.93889390390723e-18 333 316 3.67273485929465e-18 333 450 -1.94444444444445e-01 333 408 2.22222222222222e-01 333 431 -4.16666666666667e-02 333 405 -2.22222222222222e-01 333 402 -6.94444444444444e-02 333 318 -2.77777777777777e-02 333 246 1.11111111111111e-01 333 315 -9.72222222222222e-02 334 334 1.11111111111111e+00 334 350 1.40268656065312e-17 334 430 -6.94444444444444e-02 334 349 -1.38888888888889e-02 334 429 -4.16666666666667e-02 334 348 3.15773882736403e-18 334 455 -7.17724897526459e-17 334 422 6.24500451351651e-17 334 419 4.16666666666666e-02 334 341 2.06506632540598e-18 334 454 -1.94444444444444e-01 334 421 1.11111111111111e-01 334 418 -6.94444444444444e-02 334 340 -1.38888888888889e-02 334 453 -1.66666666666667e-01 334 420 2.77589637474179e-17 334 417 -4.16666666666667e-02 334 339 3.17129135452010e-18 334 416 -4.16666666666667e-02 334 329 -1.66666666666667e-01 334 272 2.61733180701579e-18 334 326 -1.09504419421036e-17 334 415 -6.94444444444445e-02 334 328 -1.94444444444444e-01 334 271 1.11111111111111e-01 334 325 -1.38888888888889e-02 334 414 4.16666666666667e-02 334 327 -4.20636561606486e-18 334 270 0.00000000000000e+00 334 324 4.01493616998538e-18 334 452 1.17381825830501e-17 334 410 9.01412462468026e-18 334 335 1.38777878078145e-16 334 407 -1.38777878078145e-17 334 404 4.16666666666667e-02 334 320 1.66666666666667e-01 334 248 8.97854924089558e-20 334 317 -1.86177841806495e-18 334 451 -1.94444444444444e-01 334 409 -4.44444444444444e-01 334 431 -4.16666666666667e-02 334 406 1.11111111111111e-01 334 403 -6.94444444444444e-02 334 319 -1.94444444444444e-01 334 247 1.11111111111111e-01 334 316 -1.38888888888889e-02 334 450 1.66666666666667e-01 334 408 -2.53294614964558e-17 334 333 -1.38777878078145e-17 334 405 2.03440373271538e-17 334 402 4.16666666666667e-02 334 318 -4.16570803459665e-18 334 246 0.00000000000000e+00 334 315 3.97427858851718e-18 335 335 1.11111111111111e+00 335 350 -9.72222222222223e-02 335 430 -4.16666666666667e-02 335 349 1.27292111313376e-17 335 429 -4.16666666666667e-02 335 348 -8.33333333333334e-02 335 455 -2.77777777777778e-02 335 422 1.11111111111111e-01 335 419 -6.94444444444444e-02 335 341 -9.72222222222222e-02 335 454 -6.98361724352226e-17 335 421 5.55111512312578e-17 335 418 4.16666666666666e-02 335 340 1.70761842166467e-18 335 453 -3.17806761809813e-17 335 420 -4.37136763418999e-17 335 417 4.16666666666667e-02 335 339 8.33333333333333e-02 335 416 -6.94444444444445e-02 335 329 -1.94444444444444e-01 335 272 -2.22222222222222e-01 335 326 -9.72222222222222e-02 335 415 -4.16666666666667e-02 335 328 -1.66666666666667e-01 335 271 -3.38622596488588e-18 335 325 -1.31561157367538e-17 335 414 4.16666666666667e-02 335 327 2.90871114087127e-18 335 270 1.02533338265133e-18 335 324 8.33333333333334e-02 335 452 -2.77777777777778e-02 335 410 2.22222222222222e-01 335 431 -6.94444444444445e-02 335 407 1.11111111111111e-01 335 404 -6.94444444444444e-02 335 320 -1.94444444444444e-01 335 248 -2.22222222222222e-01 335 317 -9.72222222222222e-02 335 451 9.89334482393023e-18 335 409 1.72811661898822e-17 335 334 1.38777878078145e-16 335 406 -1.38777878078145e-17 335 403 4.16666666666667e-02 335 319 1.66666666666667e-01 335 247 1.86347248395946e-20 335 316 2.24971950790742e-18 335 450 1.31374810119142e-17 335 408 -6.93889390390723e-18 335 333 1.38777878078145e-17 335 405 1.51284319544354e-17 335 402 -4.16666666666667e-02 335 318 1.08420217248550e-18 335 246 -1.14180041289880e-18 335 315 -8.33333333333333e-02 336 336 1.11111111111111e+00 336 431 -4.16666666666667e-02 336 355 2.90024081139872e-18 336 430 4.16666666666667e-02 336 354 -9.72222222222223e-02 336 429 -6.94444444444444e-02 336 428 -1.05479318855684e-16 336 455 -3.48215244616243e-17 336 347 8.33333333333334e-02 336 419 4.16666666666667e-02 336 427 2.49840838122128e-17 336 454 1.66666666666667e-01 336 346 2.66984784974555e-18 336 418 4.16666666666667e-02 336 426 -2.22222222222222e-01 336 453 -1.94444444444445e-01 336 345 -9.72222222222222e-02 336 417 -6.94444444444444e-02 336 332 8.33333333333333e-02 336 284 3.75133951679985e-17 336 329 3.26615904461258e-18 336 416 4.16666666666667e-02 336 331 2.60208521396521e-18 336 283 -1.38777878078145e-17 336 328 -3.93700913883799e-18 336 415 -4.16666666666667e-02 336 330 -9.72222222222222e-02 336 282 1.11111111111111e-01 336 327 -2.77777777777777e-02 336 414 -6.94444444444444e-02 336 413 -4.09828421199521e-17 336 338 1.11022302462516e-16 336 410 -6.93889390390723e-18 336 452 1.89735380184963e-17 336 323 -8.33333333333334e-02 336 260 3.10488397145536e-17 336 320 1.27054942088145e-18 336 404 -4.16666666666667e-02 336 412 1.47722546001150e-17 336 337 -6.93889390390723e-17 336 409 -2.25645341983809e-17 336 451 -1.66666666666667e-01 336 322 4.98732999343332e-18 336 259 -1.38777878078145e-17 336 319 -4.09625133292180e-18 336 403 -4.16666666666667e-02 336 411 -2.22222222222222e-01 336 356 -8.33333333333333e-02 336 408 2.22222222222222e-01 336 450 -1.94444444444444e-01 336 321 -9.72222222222222e-02 336 258 1.11111111111111e-01 336 318 -2.77777777777777e-02 336 402 -6.94444444444444e-02 337 337 1.11111111111111e+00 337 431 4.16666666666667e-02 337 355 -1.38888888888889e-02 337 430 -6.94444444444444e-02 337 354 3.03576608295941e-18 337 429 4.16666666666667e-02 337 428 0.00000000000000e+00 337 455 3.40710532703570e-17 337 347 -1.14789905011903e-17 337 419 -4.16666666666667e-02 337 427 1.11111111111111e-01 337 454 -1.94444444444445e-01 337 346 -1.38888888888888e-02 337 418 -6.94444444444444e-02 337 426 2.53703308361608e-17 337 453 1.66666666666667e-01 337 345 2.71050543121376e-18 337 417 4.16666666666667e-02 337 332 -5.63785129692462e-18 337 284 -1.63443477502190e-17 337 329 1.66666666666667e-01 337 416 4.16666666666667e-02 337 331 -1.38888888888889e-02 337 283 1.11111111111111e-01 337 328 -1.94444444444444e-01 337 415 -6.94444444444444e-02 337 330 2.95445092002300e-18 337 282 -1.38777878078145e-17 337 327 -3.68628738645072e-18 337 414 -4.16666666666667e-02 337 413 -3.46944695195361e-17 337 338 -6.93889390390723e-17 337 410 1.91412505420527e-17 337 452 1.43792313125890e-17 337 323 -2.30392961653170e-19 337 260 -1.25005122355790e-17 337 320 -1.66666666666667e-01 337 404 -4.16666666666667e-02 337 412 1.11111111111111e-01 337 356 5.09575021068187e-18 337 409 -4.44444444444444e-01 337 451 -1.94444444444444e-01 337 322 -1.38888888888889e-02 337 259 1.11111111111111e-01 337 319 -1.94444444444444e-01 337 403 -6.94444444444444e-02 337 411 1.49348849259878e-17 337 336 -6.93889390390723e-17 337 408 -1.93970544921235e-17 337 450 -1.66666666666667e-01 337 321 3.06287113727155e-18 337 258 -6.93889390390723e-18 337 318 -4.10641572828885e-18 337 402 -4.16666666666667e-02 338 338 1.11111111111111e+00 338 431 -6.94444444444445e-02 338 355 2.18195687212708e-18 338 430 4.16666666666667e-02 338 354 -8.33333333333334e-02 338 429 -4.16666666666667e-02 338 428 1.11111111111111e-01 338 455 -2.77777777777778e-02 338 347 -9.72222222222221e-02 338 419 -6.94444444444444e-02 338 427 6.93889390390723e-18 338 454 3.64630743134031e-17 338 346 -1.19262238973405e-17 338 418 -4.16666666666667e-02 338 426 -1.02782365951626e-16 338 453 -3.48842048997211e-17 338 345 8.33333333333333e-02 338 417 4.16666666666667e-02 338 332 -9.72222222222222e-02 338 284 -2.22222222222222e-01 338 329 -1.94444444444444e-01 338 416 -6.94444444444445e-02 338 331 -6.57297567069337e-18 338 283 -1.58598449043895e-17 338 328 1.66666666666667e-01 338 415 4.16666666666667e-02 338 330 8.33333333333334e-02 338 282 3.80961538357094e-17 338 327 1.22650370762423e-18 338 414 4.16666666666667e-02 338 413 1.11111111111111e-01 338 356 -9.72222222222223e-02 338 410 2.22222222222222e-01 338 452 -2.77777777777778e-02 338 323 -9.72222222222222e-02 338 260 -2.22222222222222e-01 338 320 -1.94444444444444e-01 338 404 -6.94444444444444e-02 338 412 -4.16333634234434e-17 338 337 -6.93889390390723e-17 338 409 1.91717437281538e-17 338 451 1.54566572214965e-17 338 322 5.42101086242752e-19 338 259 -2.24023273889817e-17 338 319 -1.66666666666667e-01 338 403 -4.16666666666667e-02 338 411 -4.15249432061948e-17 338 336 1.11022302462516e-16 338 408 -6.93889390390723e-18 338 450 1.77470343108721e-17 338 321 -8.33333333333334e-02 338 258 3.39355279987963e-17 338 318 1.20617491689012e-18 338 402 -4.16666666666667e-02 339 339 5.55555555555555e-01 339 359 -8.33333333333333e-02 339 344 3.87602276663568e-18 339 251 7.94292440793511e-17 339 424 -4.16666666666667e-02 339 358 8.91756286869327e-18 339 343 -8.33333333333334e-02 339 250 4.08282586070782e-17 339 423 -6.94444444444444e-02 339 357 -9.72222222222221e-02 339 342 -9.72222222222221e-02 339 249 -1.11111111111111e-01 339 410 4.16666666666667e-02 339 455 6.57297567069337e-18 339 422 -3.41337337084538e-17 339 335 8.33333333333333e-02 339 320 -1.63307952230629e-17 339 419 2.08166817117217e-17 339 341 -6.93889390390723e-17 339 248 -2.15281893874153e-17 339 409 4.16666666666667e-02 339 454 -5.67850887839283e-18 339 421 0.00000000000000e+00 339 334 3.38813178901720e-18 339 319 8.33333333333334e-02 339 418 -2.32375018749745e-17 339 340 -5.55111512312578e-17 339 247 1.01542309716846e-17 339 408 -6.94444444444444e-02 339 453 -2.77777777777778e-02 339 420 1.11111111111111e-01 339 333 -9.72222222222222e-02 339 318 -9.72222222222223e-02 339 417 1.11111111111111e-01 339 425 -4.16666666666667e-02 339 246 -1.11111111111111e-01 340 340 5.55555555555555e-01 340 359 1.27800331081729e-17 340 344 3.42692589800145e-17 340 251 4.16666666666667e-02 340 424 -6.94444444444444e-02 340 358 -1.38888888888888e-02 340 343 -9.72222222222221e-02 340 250 5.55555555555556e-02 340 423 -4.16666666666667e-02 340 357 7.54875762593032e-18 340 342 -8.33333333333334e-02 340 249 3.84569898712397e-17 340 410 -4.16666666666667e-02 340 455 -1.66666666666667e-01 340 422 -3.72863903381343e-17 340 335 1.59919820441612e-18 340 320 1.52940268956236e-17 340 419 8.14083365606108e-18 340 341 1.66666666666667e-01 340 248 4.16666666666667e-02 340 409 -6.94444444444444e-02 340 454 -1.94444444444445e-01 340 421 1.11111111111111e-01 340 334 -1.38888888888889e-02 340 319 -9.72222222222222e-02 340 418 -2.22222222222222e-01 340 425 -4.16666666666667e-02 340 247 5.55555555555555e-02 340 408 4.16666666666667e-02 340 453 -5.42101086242752e-18 340 420 6.93889390390723e-18 340 333 3.34239200986547e-18 340 318 8.33333333333334e-02 340 417 -2.55795479741326e-17 340 339 -5.55111512312578e-17 340 246 1.20911835638183e-17 341 341 5.55555555555555e-01 341 359 -9.72222222222220e-02 341 344 -1.38888888888888e-02 341 251 5.55555555555556e-02 341 424 -4.16666666666667e-02 341 358 1.32645359540023e-17 341 343 3.53314382958714e-17 341 250 4.16666666666667e-02 341 423 -4.16666666666667e-02 341 357 -8.33333333333333e-02 341 342 4.03865309250850e-18 341 249 7.92585669404794e-17 341 410 -6.94444444444444e-02 341 455 -1.94444444444445e-01 341 422 -2.22222222222222e-01 341 335 -9.72222222222222e-02 341 320 -1.38888888888889e-02 341 419 1.11111111111111e-01 341 425 -6.94444444444445e-02 341 248 5.55555555555556e-02 341 409 -4.16666666666667e-02 341 454 -1.66666666666667e-01 341 421 -3.80529551553994e-17 341 334 2.06676039130049e-18 341 319 1.52059354691092e-17 341 418 9.55114351323949e-18 341 340 1.66666666666667e-01 341 247 4.16666666666667e-02 341 408 4.16666666666667e-02 341 453 4.54009659728305e-18 341 420 -2.88202960303276e-17 341 333 8.33333333333333e-02 341 318 -1.60241692961569e-17 341 417 2.08166817117217e-17 341 339 -6.93889390390723e-17 341 246 -2.13496771937815e-17 342 342 1.11111111111111e+00 342 371 9.66972812585509e-18 342 442 -4.16666666666667e-02 342 370 -8.33333333333334e-02 342 441 -6.94444444444444e-02 342 369 -9.72222222222222e-02 342 458 -1.66666666666667e-01 342 437 -4.16666666666667e-02 342 434 3.13289958618580e-17 342 365 7.50301784677859e-18 342 457 5.98344073940438e-18 342 436 4.16666666666667e-02 342 433 -4.33786748112609e-18 342 364 8.33333333333334e-02 342 456 -1.94444444444444e-01 342 435 -6.94444444444444e-02 342 432 -2.22222222222223e-01 342 363 -9.72222222222222e-02 342 428 4.16666666666667e-02 342 362 5.82758667710959e-19 342 347 2.54787510534094e-18 342 263 -2.08166817117217e-17 342 427 4.16666666666667e-02 342 361 -1.06929439261383e-17 342 346 8.33333333333334e-02 342 262 -1.83890852848909e-17 342 426 -6.94444444444444e-02 342 360 -2.77777777777778e-02 342 345 -9.72222222222221e-02 342 261 1.11111111111111e-01 342 455 1.66666666666667e-01 342 425 -6.33292653344150e-17 342 359 2.19550939928315e-18 342 422 4.16666666666667e-02 342 419 1.00292089086698e-16 342 344 -2.08166817117217e-16 342 251 -2.77555756156289e-17 342 341 5.01443504774546e-18 342 454 1.70219741080224e-17 342 424 -2.08166817117217e-17 342 358 -6.05289744107923e-18 342 421 -4.16666666666667e-02 342 418 7.82760087216644e-17 342 343 -8.32667268468867e-17 342 250 -1.37318863826499e-17 342 340 -8.33333333333334e-02 342 453 -1.94444444444444e-01 342 423 2.22222222222222e-01 342 357 -2.77777777777778e-02 342 420 -6.94444444444444e-02 342 417 -2.22222222222222e-01 342 443 -4.16666666666667e-02 342 249 1.11111111111111e-01 342 339 -9.72222222222221e-02 343 343 1.11111111111111e+00 343 371 1.09775469964157e-17 343 442 -6.94444444444444e-02 343 370 -9.72222222222222e-02 343 441 -4.16666666666667e-02 343 369 -8.33333333333334e-02 343 458 -4.30970363562988e-18 343 437 4.16666666666667e-02 343 434 6.93889390390723e-18 343 365 -1.53550132678260e-17 343 457 -2.77777777777778e-02 343 436 -6.94444444444444e-02 343 433 1.11111111111111e-01 343 364 -9.72222222222222e-02 343 456 5.93600689435814e-18 343 435 4.16666666666667e-02 343 432 -2.46825400829903e-18 343 363 8.33333333333334e-02 343 428 -4.16666666666667e-02 343 362 -1.66666666666667e-01 343 347 -1.43301034016483e-17 343 263 -2.15019313660504e-18 343 427 -6.94444444444445e-02 343 361 -1.94444444444445e-01 343 346 -9.72222222222223e-02 343 262 -2.22222222222222e-01 343 426 4.16666666666667e-02 343 360 -6.50013083722950e-18 343 345 8.33333333333334e-02 343 261 -1.72011215763667e-17 343 455 -6.03900610074426e-17 343 425 3.12385750947386e-18 343 359 1.66666666666667e-01 343 422 4.16666666666667e-02 343 419 -5.55111512312578e-17 343 344 1.66533453693773e-16 343 251 -6.22908029410812e-18 343 341 3.51145978613743e-17 343 454 -2.77777777777778e-02 343 424 2.22222222222222e-01 343 358 -1.94444444444445e-01 343 421 -6.94444444444444e-02 343 418 1.11111111111111e-01 343 443 -4.16666666666667e-02 343 250 -2.22222222222222e-01 343 340 -9.72222222222221e-02 343 453 1.80621305672507e-17 343 423 -2.08166817117217e-17 343 357 -1.07064964532944e-17 343 420 -4.16666666666667e-02 343 417 8.04575420773179e-17 343 342 -8.32667268468867e-17 343 249 -2.05591836957564e-17 343 339 -8.33333333333334e-02 344 344 1.11111111111111e+00 344 371 -1.38888888888889e-02 344 442 -4.16666666666667e-02 344 370 1.08691267791672e-17 344 441 -4.16666666666667e-02 344 369 1.04354459101730e-17 344 458 -1.94444444444444e-01 344 437 -6.94444444444444e-02 344 434 1.11111111111111e-01 344 365 -1.38888888888889e-02 344 457 -2.99680256738571e-18 344 436 4.16666666666667e-02 344 433 0.00000000000000e+00 344 364 -1.35593034196468e-17 344 456 -1.66666666666667e-01 344 435 -4.16666666666667e-02 344 432 2.68306156372272e-17 344 363 6.97955148537543e-18 344 428 -6.94444444444445e-02 344 362 -1.94444444444444e-01 344 347 -1.38888888888889e-02 344 263 1.11111111111111e-01 344 427 -4.16666666666667e-02 344 361 -1.66666666666667e-01 344 346 -1.63714528045311e-17 344 262 -3.67951112287268e-18 344 426 4.16666666666667e-02 344 360 -1.40438062654763e-18 344 345 2.49027686492764e-18 344 261 -2.77555756156289e-17 344 455 -1.94444444444445e-01 344 425 -4.44444444444445e-01 344 359 -1.94444444444444e-01 344 422 -6.94444444444445e-02 344 419 1.11111111111111e-01 344 443 -6.94444444444444e-02 344 251 1.11111111111111e-01 344 341 -1.38888888888888e-02 344 454 -6.02342069451478e-17 344 424 1.05110436007154e-17 344 358 1.66666666666667e-01 344 421 4.16666666666667e-02 344 418 -5.55111512312578e-17 344 343 1.66533453693773e-16 344 250 -3.66807617808475e-18 344 340 3.42692589800145e-17 344 453 1.66666666666667e-01 344 423 -6.87958042177575e-17 344 357 1.94478764689587e-18 344 420 4.16666666666667e-02 344 417 9.71440911382276e-17 344 342 -1.80411241501588e-16 344 249 -2.77555756156289e-17 344 339 3.90312782094782e-18 345 345 5.55555555555556e-01 345 410 4.16666666666667e-02 345 260 -5.14996031930615e-17 345 320 -1.44334414212133e-17 345 337 2.71050543121376e-18 345 409 -4.16666666666667e-02 345 259 1.15332006098146e-17 345 319 -8.33333333333334e-02 345 336 -9.72222222222222e-02 345 408 -6.94444444444444e-02 345 258 -1.11111111111111e-01 345 318 -9.72222222222222e-02 345 428 1.81061762805079e-17 345 362 -8.33333333333333e-02 345 425 -4.16666666666667e-02 345 455 5.61074624261249e-18 345 347 4.16333634234434e-17 345 263 1.85805147309703e-17 345 344 2.58683862091463e-18 345 419 2.08166817117217e-17 345 427 -1.38777878078145e-17 345 361 8.17217387510949e-18 345 424 4.16666666666667e-02 345 454 -4.21483594553740e-18 345 346 -5.55111512312578e-17 345 262 3.86789125034204e-17 345 343 8.33333333333334e-02 345 418 -2.55827243476848e-17 345 426 1.11111111111111e-01 345 360 -9.72222222222222e-02 345 423 -6.94444444444445e-02 345 453 -2.77777777777778e-02 345 338 8.33333333333334e-02 345 261 -1.11111111111111e-01 345 342 -9.72222222222221e-02 345 417 1.11111111111111e-01 346 346 5.55555555555556e-01 346 410 4.16666666666666e-02 346 260 -4.16666666666667e-02 346 320 -3.80012861456169e-17 346 337 -1.38888888888888e-02 346 409 -6.94444444444444e-02 346 259 5.55555555555555e-02 346 319 -9.72222222222221e-02 346 336 2.99510850149121e-18 346 408 -4.16666666666667e-02 346 258 1.16060454432784e-17 346 318 -8.33333333333334e-02 346 428 1.99764250280454e-17 346 362 2.46113893154210e-17 346 425 4.16666666666667e-02 346 455 1.66666666666667e-01 346 347 -1.66666666666667e-01 346 263 -4.16666666666667e-02 346 344 -1.54092233764502e-17 346 419 9.55114351323949e-18 346 427 1.11111111111111e-01 346 361 -1.38888888888888e-02 346 424 -6.94444444444445e-02 346 454 -1.94444444444445e-01 346 338 -1.19262238973405e-17 346 262 5.55555555555557e-02 346 343 -9.72222222222223e-02 346 418 -2.22222222222222e-01 346 426 -1.38777878078145e-17 346 360 7.69783542464708e-18 346 423 4.16666666666667e-02 346 453 -4.79759461324836e-18 346 345 -5.55111512312578e-17 346 261 3.93158812797556e-17 346 342 8.33333333333334e-02 346 417 -2.44843343733328e-17 347 347 5.55555555555556e-01 347 410 -6.94444444444444e-02 347 260 5.55555555555555e-02 347 320 -1.38888888888889e-02 347 337 -1.14789905011903e-17 347 409 4.16666666666666e-02 347 259 -4.16666666666667e-02 347 319 -3.78352676879551e-17 347 336 8.33333333333333e-02 347 408 4.16666666666667e-02 347 258 -5.12556577042522e-17 347 318 -1.36507829779503e-17 347 428 -2.22222222222222e-01 347 362 -9.72222222222222e-02 347 425 -6.94444444444445e-02 347 455 -1.94444444444445e-01 347 338 -9.72222222222221e-02 347 263 5.55555555555557e-02 347 344 -1.38888888888889e-02 347 419 1.11111111111111e-01 347 427 2.27953506765077e-17 347 361 2.17382535583344e-17 347 424 4.16666666666667e-02 347 454 1.66666666666667e-01 347 346 -1.66666666666667e-01 347 262 -4.16666666666667e-02 347 343 -1.34746001249214e-17 347 418 1.01197143790839e-17 347 426 1.54634334850745e-17 347 360 -8.33333333333333e-02 347 423 -4.16666666666667e-02 347 453 1.86686061574848e-18 347 345 4.16333634234434e-17 347 261 2.00577401909818e-17 347 342 1.57209315010398e-18 347 417 2.08166817117217e-17 348 348 5.55555555555556e-01 348 275 7.98243849492453e-17 348 425 4.16666666666667e-02 348 359 8.33333333333334e-02 348 352 -8.33333333333333e-02 348 274 4.76371329535819e-17 348 424 -4.16666666666667e-02 348 358 8.82100111270628e-18 348 351 -9.72222222222222e-02 348 273 -1.11111111111111e-01 348 423 -6.94444444444444e-02 348 357 -9.72222222222222e-02 348 329 -1.66967134562768e-17 348 431 1.38777878078145e-17 348 350 -5.55111512312578e-17 348 272 -2.21854869544846e-17 348 410 -4.16666666666667e-02 348 455 4.45878143434664e-18 348 422 -3.31585870279273e-17 348 335 -8.33333333333334e-02 348 328 8.33333333333334e-02 348 430 -3.48028897367847e-17 348 349 -4.16333634234434e-17 348 271 1.24683249835833e-17 348 409 4.16666666666667e-02 348 454 -5.55653613398821e-18 348 421 0.00000000000000e+00 348 334 2.95445092002300e-18 348 327 -9.72222222222223e-02 348 429 1.11111111111111e-01 348 353 2.31748214368777e-18 348 270 -1.11111111111111e-01 348 408 -6.94444444444444e-02 348 453 -2.77777777777778e-02 348 420 1.11111111111111e-01 348 333 -9.72222222222223e-02 349 349 5.55555555555556e-01 349 275 -4.16666666666667e-02 349 425 4.16666666666667e-02 349 359 -3.10386753191866e-17 349 352 -9.72222222222221e-02 349 274 5.55555555555557e-02 349 424 -6.94444444444444e-02 349 358 -1.38888888888889e-02 349 351 -8.33333333333333e-02 349 273 4.30428262476745e-17 349 423 -4.16666666666667e-02 349 357 8.67361737988404e-18 349 329 1.86618298939067e-17 349 431 1.12485975395371e-18 349 350 -1.66666666666667e-01 349 272 -4.16666666666666e-02 349 410 4.16666666666667e-02 349 455 1.66666666666667e-01 349 422 -4.32433612979370e-17 349 335 1.27292111313376e-17 349 328 -9.72222222222223e-02 349 430 -2.22222222222222e-01 349 353 4.49401800495242e-17 349 271 5.55555555555555e-02 349 409 -6.94444444444444e-02 349 454 -1.94444444444445e-01 349 421 1.11111111111111e-01 349 334 -1.38888888888889e-02 349 327 8.33333333333334e-02 349 429 -2.95309566730739e-17 349 348 -4.16333634234434e-17 349 270 1.26038502551440e-17 349 408 4.16666666666667e-02 349 453 -3.97427858851718e-18 349 420 6.93889390390723e-18 349 333 3.46605882016460e-18 350 350 5.55555555555556e-01 350 275 5.55555555555558e-02 350 425 -6.94444444444445e-02 350 359 -9.72222222222224e-02 350 352 4.36933475511658e-17 350 274 -4.16666666666667e-02 350 424 4.16666666666667e-02 350 358 -3.16722559637328e-17 350 351 1.95156391047391e-18 350 273 8.00547779108984e-17 350 423 4.16666666666667e-02 350 357 8.33333333333334e-02 350 329 -1.38888888888889e-02 350 431 1.11111111111111e-01 350 353 -1.38888888888888e-02 350 272 5.55555555555554e-02 350 410 -6.94444444444445e-02 350 455 -1.94444444444445e-01 350 422 -2.22222222222222e-01 350 335 -9.72222222222223e-02 350 328 1.88651178012478e-17 350 430 9.13440330319037e-18 350 349 -1.66666666666667e-01 350 271 -4.16666666666666e-02 350 409 4.16666666666667e-02 350 454 1.66666666666667e-01 350 421 -3.56600870794060e-17 350 334 1.40404181336873e-17 350 327 -1.66289508204964e-17 350 429 1.38777878078145e-17 350 348 -5.55111512312578e-17 350 270 -2.11368601657838e-17 350 408 -4.16666666666667e-02 350 453 8.32125167382625e-18 350 420 -3.50146479735983e-17 350 333 -8.33333333333334e-02 351 351 1.11111111111111e+00 351 443 4.16666666666667e-02 351 379 -8.33333333333334e-02 351 442 -4.16666666666667e-02 351 378 -9.72222222222222e-02 351 441 -6.94444444444444e-02 351 446 2.97427149098875e-17 351 374 6.83047368665868e-18 351 458 1.66666666666667e-01 351 437 4.16666666666667e-02 351 445 -8.33480420098232e-18 351 373 8.33333333333334e-02 351 457 4.49435681813132e-18 351 436 4.16666666666667e-02 351 444 -2.22222222222222e-01 351 372 -9.72222222222223e-02 351 456 -1.94444444444444e-01 351 435 -6.94444444444444e-02 351 356 1.08420217248550e-19 351 287 -6.93889390390723e-18 351 428 -4.16666666666667e-02 351 362 1.97019863531350e-18 351 355 8.33333333333334e-02 351 286 -2.56955914879065e-17 351 427 4.16666666666667e-02 351 361 -1.02728155843002e-17 351 354 -9.72222222222223e-02 351 285 1.11111111111111e-01 351 426 -6.94444444444445e-02 351 360 -2.77777777777778e-02 351 431 9.82287168271867e-17 351 353 -1.38777878078145e-16 351 275 0.00000000000000e+00 351 350 2.05998412772246e-18 351 455 -1.66666666666667e-01 351 425 -7.22923562240232e-17 351 359 2.16162808139297e-18 351 422 -4.16666666666667e-02 351 430 9.16150835750251e-17 351 352 -8.32667268468867e-17 351 274 -2.17924636669586e-17 351 349 -8.33333333333333e-02 351 454 1.76318378300455e-17 351 424 -2.08166817117217e-17 351 358 -5.53620734325411e-18 351 421 -4.16666666666667e-02 351 429 -2.22222222222222e-01 351 380 9.55453164502851e-18 351 273 1.11111111111111e-01 351 348 -9.72222222222222e-02 351 453 -1.94444444444444e-01 351 423 2.22222222222222e-01 351 357 -2.77777777777778e-02 351 420 -6.94444444444444e-02 352 352 1.11111111111111e+00 352 443 4.16666666666667e-02 352 379 -9.72222222222223e-02 352 442 -6.94444444444444e-02 352 378 -8.33333333333334e-02 352 441 -4.16666666666667e-02 352 446 6.93889390390723e-18 352 374 -1.51788304147971e-17 352 458 8.58891408515861e-19 352 437 -4.16666666666667e-02 352 445 1.11111111111111e-01 352 373 -9.72222222222222e-02 352 457 -2.77777777777778e-02 352 436 -6.94444444444444e-02 352 444 -9.43255890062389e-18 352 372 8.33333333333333e-02 352 456 5.20417042793042e-18 352 435 4.16666666666667e-02 352 356 -5.44811591673966e-18 352 287 -2.82824301088211e-17 352 428 4.16666666666667e-02 352 362 1.66666666666667e-01 352 355 -9.72222222222224e-02 352 286 -2.22222222222222e-01 352 427 -6.94444444444445e-02 352 361 -1.94444444444445e-01 352 354 8.33333333333334e-02 352 285 -2.00577401909818e-17 352 426 4.16666666666667e-02 352 360 -6.70511281046504e-18 352 431 -1.38777878078145e-17 352 353 2.77555756156289e-17 352 275 -3.57109090562413e-17 352 350 4.41270284201600e-17 352 455 3.50146479735983e-17 352 425 7.42297323326306e-18 352 359 -1.66666666666667e-01 352 422 -4.16666666666667e-02 352 430 1.11111111111111e-01 352 380 1.15467531369706e-17 352 274 -2.22222222222222e-01 352 349 -9.72222222222221e-02 352 454 -2.77777777777777e-02 352 424 2.22222222222222e-01 352 358 -1.94444444444445e-01 352 421 -6.94444444444444e-02 352 429 9.14389007219962e-17 352 351 -8.32667268468867e-17 352 273 -2.39608680119296e-17 352 348 -8.33333333333333e-02 352 453 1.80926237533519e-17 352 423 -2.08166817117217e-17 352 357 -1.02728155843002e-17 352 420 -4.16666666666667e-02 353 353 1.11111111111111e+00 353 443 -6.94444444444445e-02 353 379 1.14925430283463e-17 353 442 4.16666666666667e-02 353 378 9.97465998686664e-18 353 441 4.16666666666667e-02 353 446 1.11111111111111e-01 353 374 -1.38888888888889e-02 353 458 -1.94444444444444e-01 353 437 -6.94444444444444e-02 353 445 1.38777878078145e-17 353 373 -1.25089825650515e-17 353 457 3.80826013085533e-18 353 436 -4.16666666666667e-02 353 444 3.15502832193282e-17 353 372 7.26415455565288e-18 353 456 1.66666666666667e-01 353 435 4.16666666666667e-02 353 356 -1.38888888888889e-02 353 287 1.11111111111111e-01 353 428 -6.94444444444445e-02 353 362 -1.94444444444445e-01 353 355 -5.31259064517897e-18 353 286 -2.96258243631664e-17 353 427 4.16666666666667e-02 353 361 1.66666666666667e-01 353 354 1.23327997120226e-18 353 285 -6.93889390390723e-18 353 426 -4.16666666666667e-02 353 360 2.30392961653170e-18 353 431 1.11111111111111e-01 353 380 -1.38888888888889e-02 353 275 1.11111111111111e-01 353 350 -1.38888888888888e-02 353 455 -1.94444444444444e-01 353 425 -4.44444444444445e-01 353 359 -1.94444444444444e-01 353 422 -6.94444444444445e-02 353 430 -1.38777878078145e-17 353 352 1.38777878078145e-17 353 274 -3.52755341213526e-17 353 349 4.49537325766802e-17 353 454 3.39219754716402e-17 353 424 2.29545928705915e-18 353 358 -1.66666666666667e-01 353 421 -4.16666666666667e-02 353 429 9.30279345310453e-17 353 351 -1.24900090270330e-16 353 273 0.00000000000000e+00 353 348 2.31748214368777e-18 353 453 -1.66666666666667e-01 353 423 -6.59330446142747e-17 353 357 2.30392961653170e-18 353 420 -4.16666666666667e-02 354 354 5.55555555555555e-01 354 329 -1.48535697630514e-17 354 338 -8.33333333333334e-02 354 410 -4.16666666666667e-02 354 283 1.30104260698261e-17 354 328 -8.33333333333333e-02 354 337 2.71050543121376e-18 354 409 -4.16666666666667e-02 354 282 -1.11111111111111e-01 354 327 -9.72222222222223e-02 354 336 -9.72222222222223e-02 354 408 -6.94444444444444e-02 354 356 6.93889390390723e-17 354 287 1.57209315010398e-17 354 353 1.21972744404619e-18 354 431 1.38777878078145e-17 354 428 1.90548531814327e-17 354 362 8.33333333333334e-02 354 425 4.16666666666667e-02 354 455 2.91548740444930e-18 354 355 -6.93889390390723e-17 354 286 4.43438688546571e-17 354 352 8.33333333333334e-02 354 430 -2.75658402354440e-17 354 427 -1.38777878078145e-17 354 361 7.83336069620777e-18 354 424 4.16666666666667e-02 354 454 -4.66037527579316e-18 354 284 -5.29090660172926e-17 354 285 -1.11111111111111e-01 354 351 -9.72222222222223e-02 354 429 1.11111111111111e-01 354 426 1.11111111111111e-01 354 360 -9.72222222222222e-02 354 423 -6.94444444444444e-02 354 453 -2.77777777777778e-02 355 355 5.55555555555556e-01 355 329 -3.17671236538253e-17 355 338 2.18195687212708e-18 355 410 -4.16666666666667e-02 355 283 5.55555555555555e-02 355 328 -9.72222222222222e-02 355 337 -1.38888888888889e-02 355 409 -6.94444444444444e-02 355 282 1.35525271560688e-17 355 327 -8.33333333333333e-02 355 336 2.79182059415017e-18 355 408 -4.16666666666667e-02 355 356 1.66666666666667e-01 355 287 4.16666666666667e-02 355 353 -5.20417042793042e-18 355 431 8.71427496135224e-18 355 428 3.00611992980551e-17 355 362 -2.91921434941722e-17 355 425 -4.16666666666667e-02 355 455 -1.66666666666667e-01 355 284 4.16666666666667e-02 355 286 5.55555555555557e-02 355 352 -9.72222222222224e-02 355 430 -2.22222222222222e-01 355 427 1.11111111111111e-01 355 361 -1.38888888888889e-02 355 424 -6.94444444444445e-02 355 454 -1.94444444444445e-01 355 354 -6.93889390390723e-17 355 285 4.42354486374086e-17 355 351 8.33333333333334e-02 355 429 -3.65376132127615e-17 355 426 -1.38777878078145e-17 355 360 7.69783542464708e-18 355 423 4.16666666666667e-02 355 453 -4.81114714040443e-18 356 356 5.55555555555556e-01 356 329 -1.38888888888889e-02 356 338 -9.72222222222223e-02 356 410 -6.94444444444445e-02 356 283 4.16666666666667e-02 356 328 -3.30546137336518e-17 356 337 5.09575021068187e-18 356 409 -4.16666666666667e-02 356 282 -5.41016884070267e-17 356 327 -1.43385737311208e-17 356 336 -8.33333333333333e-02 356 408 -4.16666666666667e-02 356 284 5.55555555555555e-02 356 287 5.55555555555556e-02 356 353 -1.38888888888889e-02 356 431 1.11111111111111e-01 356 428 -2.22222222222222e-01 356 362 -9.72222222222223e-02 356 425 -6.94444444444445e-02 356 455 -1.94444444444444e-01 356 355 1.66666666666667e-01 356 286 4.16666666666667e-02 356 352 -5.46166844389573e-18 356 430 4.92126142354748e-18 356 427 2.17247010311783e-17 356 361 -2.81892564846231e-17 356 424 -4.16666666666667e-02 356 454 -1.66666666666667e-01 356 354 8.32667268468867e-17 356 285 1.82145964977565e-17 356 351 2.16840434497101e-19 356 429 1.38777878078145e-17 356 426 1.81061762805079e-17 356 360 8.33333333333334e-02 356 423 4.16666666666667e-02 356 453 3.21194893598831e-18 357 357 1.11111111111111e+00 357 374 -8.33333333333333e-02 357 445 -4.16666666666667e-02 357 373 3.92345661168192e-18 357 444 -6.94444444444444e-02 357 372 -9.72222222222222e-02 357 458 1.53211319499358e-17 357 437 7.24151760013751e-17 357 434 4.16666666666667e-02 357 365 8.33333333333334e-02 357 457 -1.66666666666667e-01 357 436 -4.68345692360584e-18 357 433 -4.16666666666667e-02 357 364 2.97647377665161e-18 357 456 -1.94444444444444e-01 357 435 -2.22222222222222e-01 357 432 -6.94444444444444e-02 357 363 -9.72222222222222e-02 357 431 4.16666666666667e-02 357 353 2.31748214368777e-18 357 275 -5.67156320822534e-17 357 350 8.33333333333334e-02 357 430 4.16666666666667e-02 357 352 -1.06929439261383e-17 357 274 -1.38777878078145e-17 357 349 8.56519716263549e-18 357 429 -6.94444444444444e-02 357 351 -2.77777777777778e-02 357 273 1.11111111111111e-01 357 348 -9.72222222222222e-02 357 455 7.20994444702860e-18 357 425 -2.77555756156289e-17 357 359 -2.49800180540660e-16 357 422 1.59299792324222e-16 357 419 -4.16666666666667e-02 357 344 1.94309358100136e-18 357 251 -6.17789832827028e-17 357 341 -8.33333333333333e-02 357 454 1.66666666666667e-01 357 424 -4.40846767727973e-17 357 358 -1.11022302462516e-16 357 421 8.76136999321958e-17 357 418 4.16666666666667e-02 357 343 -1.02728155843002e-17 357 250 -1.38777878078145e-17 357 340 9.28348110190713e-18 357 453 -1.94444444444444e-01 357 423 2.22222222222222e-01 357 446 -4.16666666666667e-02 357 420 -2.22222222222222e-01 357 417 -6.94444444444445e-02 357 342 -2.77777777777778e-02 357 249 1.11111111111111e-01 357 339 -9.72222222222221e-02 358 358 1.11111111111111e+00 358 374 4.14707330975705e-18 358 445 -6.94444444444444e-02 358 373 -1.38888888888889e-02 358 444 -4.16666666666667e-02 358 372 2.90024081139872e-18 358 458 1.99205208535266e-17 358 437 1.38777878078145e-17 358 434 4.16666666666667e-02 358 365 9.01751275646928e-18 358 457 -1.94444444444444e-01 358 436 1.11111111111111e-01 358 433 -6.94444444444444e-02 358 364 -1.38888888888889e-02 358 456 -1.66666666666667e-01 358 435 -5.70730799859948e-18 358 432 -4.16666666666667e-02 358 363 2.49366499671666e-18 358 431 -4.16666666666667e-02 358 353 -1.66666666666667e-01 358 275 1.54024471128722e-17 358 350 -3.16587034365767e-17 358 430 -6.94444444444445e-02 358 352 -1.94444444444445e-01 358 274 1.11111111111111e-01 358 349 -1.38888888888889e-02 358 429 4.16666666666667e-02 358 351 -6.50013083722950e-18 358 273 -1.38777878078145e-17 358 348 8.69733430240716e-18 358 455 -2.15417419145714e-17 358 425 -4.48662764248762e-17 358 359 1.80411241501588e-16 358 422 -2.77555756156289e-17 358 419 4.16666666666667e-02 358 344 1.66666666666667e-01 358 251 2.40620884491265e-17 358 341 1.32509834268463e-17 358 454 -1.94444444444445e-01 358 424 -4.44444444444445e-01 358 446 -4.16666666666667e-02 358 421 1.11111111111111e-01 358 418 -6.94444444444445e-02 358 343 -1.94444444444445e-01 358 250 1.11111111111111e-01 358 340 -1.38888888888888e-02 358 453 1.66666666666667e-01 358 423 -3.72302744053787e-17 358 357 -1.11022302462516e-16 358 420 8.69492025850748e-17 358 417 4.16666666666667e-02 358 342 -6.71527720583209e-18 358 249 -1.38777878078145e-17 358 339 8.91756286869327e-18 359 359 1.11111111111111e+00 359 374 -9.72222222222222e-02 359 445 -4.16666666666667e-02 359 373 4.54009659728305e-18 359 444 -4.16666666666667e-02 359 372 -8.33333333333333e-02 359 458 -2.77777777777778e-02 359 437 1.11111111111111e-01 359 434 -6.94444444444444e-02 359 365 -9.72222222222223e-02 359 457 1.88922228555599e-17 359 436 1.38777878078145e-17 359 433 4.16666666666667e-02 359 364 1.03134731657684e-17 359 456 1.52059354691092e-17 359 435 7.38985424502542e-17 359 432 4.16666666666667e-02 359 363 8.33333333333334e-02 359 431 -6.94444444444445e-02 359 353 -1.94444444444444e-01 359 275 -2.22222222222222e-01 359 350 -9.72222222222224e-02 359 430 -4.16666666666667e-02 359 352 -1.66666666666667e-01 359 274 2.77348233084212e-17 359 349 -3.10403693850811e-17 359 429 4.16666666666667e-02 359 351 2.06506632540598e-18 359 273 -6.60867810942014e-17 359 348 8.33333333333334e-02 359 455 -2.77777777777778e-02 359 425 2.22222222222222e-01 359 446 -6.94444444444444e-02 359 422 1.11111111111111e-01 359 419 -6.94444444444445e-02 359 344 -1.94444444444444e-01 359 251 -2.22222222222222e-01 359 341 -9.72222222222220e-02 359 454 -2.34323194528430e-17 359 424 -4.41473572108941e-17 359 358 1.80411241501588e-16 359 421 -2.77555756156289e-17 359 418 4.16666666666667e-02 359 343 1.66666666666667e-01 359 250 1.37202396796252e-17 359 340 1.45147565841497e-17 359 453 6.10880161559801e-18 359 423 -2.77555756156289e-17 359 357 -2.35922392732846e-16 359 420 1.58389655422397e-16 359 417 -4.16666666666667e-02 359 342 2.30392961653170e-18 359 249 -5.93194113621132e-17 359 339 -8.33333333333333e-02 360 360 1.11111111111111e+00 360 446 -4.16666666666667e-02 360 379 2.18195687212708e-18 360 445 4.16666666666667e-02 360 378 -9.72222222222223e-02 360 444 -6.94444444444444e-02 360 443 -7.46744246299391e-18 360 458 1.13519355591021e-17 360 371 8.33333333333334e-02 360 434 4.16666666666667e-02 360 442 -8.05528332838840e-18 360 457 1.66666666666667e-01 360 370 2.05998412772246e-18 360 433 4.16666666666667e-02 360 441 -2.22222222222222e-01 360 456 -1.94444444444444e-01 360 369 -9.72222222222222e-02 360 432 -6.94444444444444e-02 360 356 8.33333333333334e-02 360 287 -6.61363325216158e-18 360 353 2.19550939928315e-18 360 431 4.16666666666667e-02 360 355 7.91467585914418e-18 360 286 -6.93889390390723e-18 360 352 -6.05289744107923e-18 360 430 -4.16666666666667e-02 360 354 -9.72222222222222e-02 360 285 1.11111111111111e-01 360 351 -2.77777777777778e-02 360 429 -6.94444444444444e-02 360 428 3.57786716920216e-17 360 362 -4.16333634234434e-17 360 425 -3.46944695195361e-17 360 455 8.91756286869327e-18 360 347 -8.33333333333333e-02 360 263 -1.39862080250630e-17 360 344 -1.30781887056064e-18 360 419 -4.16666666666667e-02 360 427 8.22638398373376e-17 360 361 -5.55111512312578e-17 360 424 -3.55243500496085e-17 360 454 -1.66666666666667e-01 360 346 8.13151629364128e-18 360 262 -6.93889390390723e-18 360 343 -5.53620734325411e-18 360 418 -4.16666666666667e-02 360 426 -2.22222222222222e-01 360 380 -8.33333333333334e-02 360 423 2.22222222222222e-01 360 453 -1.94444444444444e-01 360 345 -9.72222222222222e-02 360 261 1.11111111111111e-01 360 342 -2.77777777777778e-02 360 417 -6.94444444444444e-02 361 361 1.11111111111111e+00 361 446 4.16666666666667e-02 361 379 -1.38888888888889e-02 361 445 -6.94444444444444e-02 361 378 3.25260651745651e-18 361 444 4.16666666666667e-02 361 443 0.00000000000000e+00 361 458 -2.53296732546926e-17 361 371 -6.43745039913268e-18 361 434 -4.16666666666667e-02 361 442 1.11111111111111e-01 361 457 -1.94444444444444e-01 361 370 -1.38888888888889e-02 361 433 -6.94444444444444e-02 361 441 -6.23416249179165e-18 361 456 1.66666666666667e-01 361 369 3.36102673470506e-18 361 432 4.16666666666667e-02 361 356 -2.87313575708659e-17 361 287 -1.22785896033983e-17 361 353 1.66666666666667e-01 361 431 4.16666666666667e-02 361 355 -1.38888888888889e-02 361 286 1.11111111111111e-01 361 352 -1.94444444444445e-01 361 430 -6.94444444444444e-02 361 354 9.03953561309789e-18 361 285 -6.93889390390723e-18 361 351 -1.02728155843002e-17 361 429 -4.16666666666667e-02 361 428 -4.16333634234434e-17 361 362 0.00000000000000e+00 361 425 -3.19653293634828e-17 361 455 8.09763497575111e-17 361 347 2.17518060854904e-17 361 263 -1.34695179272379e-17 361 344 -1.66666666666667e-01 361 419 -4.16666666666667e-02 361 427 1.11111111111111e-01 361 380 -9.32413868337534e-18 361 424 -4.44444444444445e-01 361 454 -1.94444444444444e-01 361 346 -1.38888888888888e-02 361 262 1.11111111111111e-01 361 343 -1.94444444444445e-01 361 418 -6.94444444444444e-02 361 426 8.49370758188722e-17 361 360 -5.55111512312578e-17 361 423 -4.45200517076860e-17 361 453 -1.66666666666667e-01 361 345 9.14795583034644e-18 361 261 -6.93889390390723e-18 361 342 -1.02728155843002e-17 361 417 -4.16666666666667e-02 362 362 1.11111111111111e+00 362 446 -6.94444444444444e-02 362 379 -8.40256683676266e-18 362 445 4.16666666666667e-02 362 378 -8.33333333333334e-02 362 444 -4.16666666666667e-02 362 443 1.11111111111111e-01 362 458 -2.77777777777778e-02 362 371 -9.72222222222222e-02 362 434 -6.94444444444444e-02 362 442 6.93889390390723e-18 362 457 -2.42115897643169e-17 362 370 -4.77048955893622e-18 362 433 -4.16666666666667e-02 362 441 -1.20346441145891e-17 362 456 1.21837219133059e-17 362 369 8.33333333333334e-02 362 432 4.16666666666667e-02 362 356 -9.72222222222223e-02 362 287 -2.22222222222222e-01 362 353 -1.94444444444445e-01 362 431 -6.94444444444445e-02 362 355 -2.91921434941722e-17 362 286 -1.35237280358622e-17 362 352 1.66666666666667e-01 362 430 4.16666666666667e-02 362 354 8.33333333333334e-02 362 285 -7.04731412115578e-18 362 351 1.95495204226293e-18 362 429 4.16666666666667e-02 362 428 1.11111111111111e-01 362 380 -9.72222222222222e-02 362 425 2.22222222222222e-01 362 455 -2.77777777777777e-02 362 347 -9.72222222222222e-02 362 263 -2.22222222222222e-01 362 344 -1.94444444444444e-01 362 419 -6.94444444444445e-02 362 427 -4.16333634234434e-17 362 361 0.00000000000000e+00 362 424 -3.05935595054044e-17 362 454 8.10796877770761e-17 362 346 2.11419423634673e-17 362 262 -1.14247803925660e-17 362 343 -1.66666666666667e-01 362 418 -4.16666666666667e-02 362 426 3.18077812352935e-17 362 360 -4.16333634234434e-17 362 423 -2.77555756156289e-17 362 453 1.06251812903579e-17 362 345 -8.33333333333333e-02 362 261 -6.61363325216158e-18 362 342 5.69206140554890e-19 362 417 -4.16666666666667e-02 363 363 5.55555555555555e-01 363 383 -8.33333333333333e-02 363 368 7.38273916826848e-18 363 254 4.30148741604151e-17 363 439 -4.16666666666667e-02 363 382 1.74488787134386e-18 363 367 -8.33333333333334e-02 363 253 -1.75928743144718e-18 363 438 -6.94444444444444e-02 363 381 -9.72222222222222e-02 363 366 -9.72222222222222e-02 363 252 -1.11111111111111e-01 363 425 4.16666666666667e-02 363 458 -9.87979229677416e-18 363 437 -3.52145477491503e-17 363 359 8.33333333333334e-02 363 344 7.02020906684364e-18 363 434 -4.16333634234434e-17 363 365 -6.93889390390723e-17 363 251 3.69662118840722e-17 363 424 4.16666666666667e-02 363 457 -1.20617491689012e-18 363 436 -6.93889390390723e-18 363 358 3.36102673470506e-18 363 343 8.33333333333334e-02 363 433 4.68409219831628e-18 363 364 1.38777878078145e-17 363 250 -5.57347679293330e-19 363 423 -6.94444444444444e-02 363 456 -2.77777777777778e-02 363 435 1.11111111111111e-01 363 357 -9.72222222222223e-02 363 342 -9.72222222222222e-02 363 432 1.11111111111111e-01 363 440 -4.16666666666667e-02 363 249 -1.11111111111111e-01 364 364 5.55555555555555e-01 364 383 -2.58853268680914e-18 364 368 1.72574492673591e-17 364 254 4.16666666666667e-02 364 439 -6.94444444444444e-02 364 382 -1.38888888888889e-02 364 367 -9.72222222222222e-02 364 253 5.55555555555555e-02 364 438 -4.16666666666667e-02 364 381 1.61275073157219e-18 364 366 -8.33333333333334e-02 364 252 -3.18484388167617e-18 364 425 -4.16666666666667e-02 364 458 -1.66666666666667e-01 364 437 1.56108172178968e-17 364 359 9.48676900924816e-18 364 344 -1.35576093537523e-17 364 434 3.94251485299514e-18 364 365 1.66666666666667e-01 364 251 4.16666666666667e-02 364 424 -6.94444444444444e-02 364 457 -1.94444444444444e-01 364 436 1.11111111111111e-01 364 358 -1.38888888888889e-02 364 343 -9.72222222222222e-02 364 433 -2.22222222222222e-01 364 440 -4.16666666666667e-02 364 250 5.55555555555555e-02 364 423 4.16666666666667e-02 364 456 -3.48638761089870e-18 364 435 0.00000000000000e+00 364 357 2.97477971075710e-18 364 342 8.33333333333334e-02 364 432 3.82922419629988e-18 364 363 1.38777878078145e-17 364 249 -2.25755456266952e-18 365 365 5.55555555555556e-01 365 383 -9.72222222222221e-02 365 368 -1.38888888888889e-02 365 254 5.55555555555555e-02 365 439 -4.16666666666666e-02 365 382 -2.20228566286118e-18 365 367 1.78893358460108e-17 365 253 4.16666666666667e-02 365 438 -4.16666666666667e-02 365 381 -8.33333333333333e-02 365 366 8.06375365786094e-18 365 252 4.34222970080445e-17 365 425 -6.94444444444444e-02 365 458 -1.94444444444444e-01 365 437 -2.22222222222222e-01 365 359 -9.72222222222223e-02 365 344 -1.38888888888889e-02 365 434 1.11111111111111e-01 365 440 -6.94444444444444e-02 365 251 5.55555555555555e-02 365 424 -4.16666666666667e-02 365 457 -1.66666666666667e-01 365 436 1.74137268461275e-17 365 358 7.28448334638698e-18 365 343 -1.51923829419531e-17 365 433 1.29934854108810e-18 365 364 1.66666666666667e-01 365 250 4.16666666666667e-02 365 423 4.16666666666667e-02 365 456 -9.99160064581173e-18 365 435 -3.62049410227274e-17 365 357 8.33333333333334e-02 365 342 7.55553388950836e-18 365 432 -3.46944695195361e-17 365 363 -6.93889390390723e-17 365 249 3.55438318073954e-17 366 366 5.55555555555555e-01 366 386 -6.61363325216158e-18 366 371 7.15573433840433e-18 366 266 -4.16666666666667e-02 366 442 4.16666666666667e-02 366 385 -5.42101086242752e-19 366 370 8.33333333333334e-02 366 265 2.62919026827735e-18 366 441 -6.94444444444444e-02 366 384 -1.38888888888889e-02 366 369 -9.72222222222222e-02 366 264 5.55555555555556e-02 366 458 1.66666666666667e-01 366 440 -1.53143556863578e-17 366 383 -6.61363325216158e-18 366 437 4.16666666666667e-02 366 434 4.01154803819637e-17 366 368 -1.66666666666667e-01 366 254 -4.16666666666667e-02 366 365 8.11796376648521e-18 366 457 3.36102673470506e-18 366 439 -1.38777878078145e-17 366 382 -1.09775469964157e-18 366 436 -4.16666666666667e-02 366 433 -3.19839640883224e-18 366 367 2.77555756156289e-17 366 253 1.31967733182220e-18 366 364 -8.33333333333334e-02 366 456 -1.94444444444445e-01 366 438 1.11111111111111e-01 366 381 -1.38888888888889e-02 366 435 -6.94444444444444e-02 366 432 -2.22222222222223e-01 366 443 4.16666666666667e-02 366 252 5.55555555555556e-02 366 363 -9.72222222222222e-02 367 367 5.55555555555556e-01 367 386 -8.33333333333334e-02 367 371 -9.92553207592589e-18 367 266 -8.33480420098232e-18 367 442 -6.94444444444444e-02 367 385 -9.72222222222223e-02 367 370 -9.72222222222222e-02 367 265 -1.11111111111111e-01 367 441 4.16666666666667e-02 367 384 -8.94466792300541e-19 367 369 8.33333333333334e-02 367 264 3.99799551104030e-19 367 458 -6.66784336078585e-18 367 440 1.38777878078145e-17 367 383 8.33333333333333e-02 367 437 4.16666666666667e-02 367 434 -6.93889390390723e-18 367 368 5.55111512312578e-17 367 254 -1.20346441145891e-17 367 365 1.79435459546351e-17 367 457 -2.77777777777778e-02 367 439 1.11111111111111e-01 367 382 -9.72222222222223e-02 367 436 -6.94444444444445e-02 367 433 1.11111111111111e-01 367 443 -4.16666666666667e-02 367 253 -1.11111111111111e-01 367 364 -9.72222222222222e-02 367 456 2.04134940288286e-18 367 438 -6.93889390390723e-18 367 381 -1.40946282423116e-18 367 435 -4.16666666666667e-02 367 432 -4.88314494092104e-18 367 366 2.77555756156289e-17 367 252 2.62919026827735e-18 367 363 -8.33333333333334e-02 368 368 5.55555555555556e-01 368 386 -9.72222222222222e-02 368 371 -1.38888888888889e-02 368 266 5.55555555555556e-02 368 442 -4.16666666666667e-02 368 385 -8.33333333333334e-02 368 370 -8.94466792300541e-18 368 265 -8.67361737988404e-18 368 441 4.16666666666667e-02 368 384 -2.64274279543342e-18 368 369 5.45658624621220e-18 368 264 -4.16666666666667e-02 368 458 -1.94444444444444e-01 368 440 -2.22222222222222e-01 368 383 -9.72222222222222e-02 368 437 -6.94444444444445e-02 368 434 1.11111111111111e-01 368 443 -6.94444444444445e-02 368 254 5.55555555555556e-02 368 365 -1.38888888888889e-02 368 457 -6.26804380968182e-18 368 439 1.41081807694676e-17 368 382 8.33333333333334e-02 368 436 4.16666666666667e-02 368 433 -6.93889390390723e-18 368 367 5.55111512312578e-17 368 253 -1.20210915874330e-17 368 364 1.71490290501106e-17 368 456 1.66666666666667e-01 368 438 -8.30092288309214e-18 368 381 -2.62919026827735e-18 368 435 4.16666666666667e-02 368 432 4.04943158676231e-17 368 366 -1.66666666666667e-01 368 252 -4.16666666666667e-02 368 363 7.00326840789856e-18 369 369 5.55555555555556e-01 369 425 4.16666666666667e-02 369 263 -3.36102673470506e-18 369 344 9.63584680796492e-18 369 361 3.36102673470506e-18 369 424 -4.16666666666667e-02 369 262 -2.75116301268197e-18 369 343 -8.33333333333334e-02 369 360 -9.72222222222222e-02 369 423 -6.94444444444444e-02 369 261 -1.11111111111111e-01 369 342 -9.72222222222222e-02 369 443 5.09575021068187e-18 369 386 -8.33333333333333e-02 369 440 -4.16666666666667e-02 369 458 -1.09639944692597e-17 369 371 -4.16333634234434e-17 369 266 -8.26704156520197e-19 369 368 5.89196118110091e-18 369 434 -4.16333634234434e-17 369 442 0.00000000000000e+00 369 385 1.17906986257799e-18 369 439 4.16666666666667e-02 369 457 -2.83925443919641e-18 369 370 0.00000000000000e+00 369 265 -2.69017664047966e-18 369 367 8.33333333333334e-02 369 433 2.14871082894735e-18 369 441 1.11111111111111e-01 369 384 -9.72222222222223e-02 369 438 -6.94444444444444e-02 369 456 -2.77777777777778e-02 369 362 8.33333333333334e-02 369 264 -1.11111111111111e-01 369 366 -9.72222222222222e-02 369 432 1.11111111111111e-01 370 370 5.55555555555555e-01 370 425 4.16666666666667e-02 370 263 -4.16666666666667e-02 370 344 1.09097843606354e-17 370 361 -1.38888888888889e-02 370 424 -6.94444444444444e-02 370 262 5.55555555555555e-02 370 343 -9.72222222222222e-02 370 360 2.05998412772246e-18 370 423 -4.16666666666667e-02 370 261 -2.92056960213283e-18 370 342 -8.33333333333334e-02 370 443 -2.54109884176290e-17 370 386 -7.04731412115578e-18 370 440 4.16666666666667e-02 370 458 1.66666666666667e-01 370 371 -1.66666666666667e-01 370 266 -4.16666666666667e-02 370 368 -8.90401034153721e-18 370 434 5.79878755690294e-18 370 442 1.11111111111111e-01 370 385 -1.38888888888889e-02 370 439 -6.94444444444444e-02 370 457 -1.94444444444444e-01 370 362 -4.77048955893622e-18 370 265 5.55555555555555e-02 370 367 -9.72222222222222e-02 370 433 -2.22222222222222e-01 370 441 0.00000000000000e+00 370 384 2.05998412772246e-18 370 438 4.16666666666667e-02 370 456 -2.49366499671666e-18 370 369 0.00000000000000e+00 370 264 -2.66984784974555e-18 370 366 8.33333333333334e-02 370 432 4.68409219831628e-18 371 371 5.55555555555555e-01 371 425 -6.94444444444445e-02 371 263 5.55555555555555e-02 371 344 -1.38888888888889e-02 371 361 -6.54587061638123e-18 371 424 4.16666666666667e-02 371 262 -4.16666666666667e-02 371 343 1.10859672136643e-17 371 360 8.33333333333334e-02 371 423 4.16666666666667e-02 371 261 -3.23905399030044e-18 371 342 9.72563230037388e-18 371 443 -2.22222222222222e-01 371 386 -9.72222222222222e-02 371 440 -6.94444444444444e-02 371 458 -1.94444444444445e-01 371 362 -9.72222222222222e-02 371 266 5.55555555555555e-02 371 368 -1.38888888888889e-02 371 434 1.11111111111111e-01 371 442 -2.44809462415438e-17 371 385 -7.91467585914418e-18 371 439 4.16666666666667e-02 371 457 1.66666666666667e-01 371 370 -1.66666666666667e-01 371 265 -4.16666666666667e-02 371 367 -9.92722614182040e-18 371 433 9.13313275376949e-18 371 441 8.38901430960659e-18 371 384 -8.33333333333334e-02 371 438 -4.16666666666667e-02 371 456 -1.10656384229302e-17 371 369 -4.16333634234434e-17 371 264 -1.62630325872826e-18 371 366 7.10152422978005e-18 371 432 -2.77555756156289e-17 372 372 5.55555555555556e-01 372 278 4.29005247125358e-17 372 440 4.16666666666667e-02 372 383 8.33333333333334e-02 372 376 -8.33333333333334e-02 372 277 -1.69406589450860e-18 372 439 -4.16666666666667e-02 372 382 1.32475952950573e-18 372 375 -9.72222222222222e-02 372 276 -1.11111111111111e-01 372 438 -6.94444444444444e-02 372 381 -9.72222222222223e-02 372 353 7.26415455565288e-18 372 446 -6.93889390390723e-18 372 374 -5.55111512312578e-17 372 275 3.67680061744147e-17 372 425 -4.16666666666667e-02 372 458 -1.08623505155891e-17 372 437 -3.61507309141031e-17 372 359 -8.33333333333333e-02 372 352 8.33333333333333e-02 372 445 5.09575021068187e-18 372 373 0.00000000000000e+00 372 274 -2.49366499671666e-18 372 424 4.16666666666667e-02 372 457 -2.50721752387273e-18 372 436 -6.93889390390723e-18 372 358 3.78115507654320e-18 372 351 -9.72222222222223e-02 372 444 1.11111111111111e-01 372 377 6.60008072500551e-18 372 273 -1.11111111111111e-01 372 423 -6.94444444444444e-02 372 456 -2.77777777777778e-02 372 435 1.11111111111111e-01 372 357 -9.72222222222222e-02 373 373 5.55555555555556e-01 373 278 -4.16666666666667e-02 373 440 4.16666666666667e-02 373 383 -4.54687286086108e-18 373 376 -9.72222222222222e-02 373 277 5.55555555555556e-02 373 439 -6.94444444444444e-02 373 382 -1.38888888888889e-02 373 375 -8.33333333333334e-02 373 276 -2.49366499671666e-18 373 438 -4.16666666666667e-02 373 381 1.30104260698261e-18 373 353 -1.26174027823001e-17 373 446 -1.94817577868489e-19 373 374 -1.66666666666667e-01 373 275 -4.16666666666667e-02 373 425 4.16666666666667e-02 373 458 1.66666666666667e-01 373 437 1.74135150878907e-17 373 359 4.54009659728305e-18 373 352 -9.72222222222222e-02 373 445 -2.22222222222222e-01 373 377 1.89870905456524e-17 373 274 5.55555555555556e-02 373 424 -6.94444444444444e-02 373 457 -1.94444444444444e-01 373 436 1.11111111111111e-01 373 358 -1.38888888888889e-02 373 351 8.33333333333334e-02 373 444 -2.01932654625425e-18 373 372 0.00000000000000e+00 373 273 -7.45388993583784e-19 373 423 4.16666666666667e-02 373 456 -3.69306365002875e-18 373 435 0.00000000000000e+00 373 357 4.04712342198105e-18 374 374 5.55555555555555e-01 374 278 5.55555555555556e-02 374 440 -6.94444444444445e-02 374 383 -9.72222222222223e-02 374 376 1.90819582357449e-17 374 277 -4.16666666666667e-02 374 439 4.16666666666667e-02 374 382 -4.02510056535244e-18 374 375 6.93889390390723e-18 374 276 4.37475576597901e-17 374 438 4.16666666666667e-02 374 381 8.33333333333334e-02 374 353 -1.38888888888889e-02 374 446 1.11111111111111e-01 374 377 -1.38888888888889e-02 374 275 5.55555555555555e-02 374 425 -6.94444444444444e-02 374 458 -1.94444444444444e-01 374 437 -2.22222222222222e-01 374 359 -9.72222222222222e-02 374 352 -1.51788304147971e-17 374 445 -1.11130722679764e-18 374 373 -1.66666666666667e-01 374 274 -4.16666666666667e-02 374 424 4.16666666666667e-02 374 457 1.66666666666667e-01 374 436 2.02186764509601e-17 374 358 4.18773089122526e-18 374 351 6.39679281766448e-18 374 444 -6.93889390390723e-18 374 372 -5.55111512312578e-17 374 273 3.31291526330102e-17 374 423 -4.16666666666667e-02 374 456 -1.00830802041152e-17 374 435 -3.52281002763064e-17 374 357 -8.33333333333333e-02 375 375 5.55555555555556e-01 375 290 4.16666666666667e-02 375 443 -4.16666666666667e-02 375 386 -6.08508469307489e-18 375 379 8.33333333333333e-02 375 289 2.60208521396521e-18 375 442 4.16666666666667e-02 375 385 -9.75781955236954e-19 375 378 -9.72222222222222e-02 375 288 5.55555555555555e-02 375 441 -6.94444444444444e-02 375 384 -1.38888888888889e-02 375 446 4.02645581806804e-17 375 377 1.66666666666667e-01 375 278 4.16666666666667e-02 375 374 6.93889390390723e-18 375 458 -1.66666666666667e-01 375 440 -1.17178537923160e-17 375 383 -2.64274279543342e-18 375 437 -4.16666666666667e-02 375 445 -2.49366499671666e-18 375 376 1.38777878078145e-17 375 277 5.42101086242752e-19 375 373 -8.33333333333334e-02 375 457 3.99799551104030e-18 375 439 -1.38777878078145e-17 375 382 -9.08019319456610e-19 375 436 -4.16666666666667e-02 375 444 -2.22222222222222e-01 375 380 4.98732999343332e-18 375 276 5.55555555555555e-02 375 372 -9.72222222222222e-02 375 456 -1.94444444444444e-01 375 438 1.11111111111111e-01 375 381 -1.38888888888889e-02 375 435 -6.94444444444444e-02 376 376 5.55555555555555e-01 376 290 -9.43255890062389e-18 376 443 4.16666666666667e-02 376 386 8.33333333333334e-02 376 379 -9.72222222222222e-02 376 289 -1.11111111111111e-01 376 442 -6.94444444444444e-02 376 385 -9.72222222222223e-02 376 378 8.33333333333334e-02 376 288 6.50521303491303e-19 376 441 4.16666666666667e-02 376 384 0.00000000000000e+00 376 446 0.00000000000000e+00 376 377 4.16333634234434e-17 376 278 -1.47451495458029e-17 376 374 1.89735380184963e-17 376 458 -8.27551189467451e-18 376 440 1.43250212039647e-17 376 383 -8.33333333333334e-02 376 437 -4.16666666666666e-02 376 445 1.11111111111111e-01 376 380 -7.68428289749101e-18 376 277 -1.11111111111111e-01 376 373 -9.72222222222222e-02 376 457 -2.77777777777778e-02 376 439 1.11111111111111e-01 376 382 -9.72222222222223e-02 376 436 -6.94444444444444e-02 376 444 -4.52654407012698e-18 376 375 1.38777878078145e-17 376 276 2.60208521396521e-18 376 372 -8.33333333333334e-02 376 456 2.17856874033806e-18 376 438 -6.93889390390723e-18 376 381 -5.42101086242752e-19 376 435 -4.16666666666667e-02 377 377 5.55555555555555e-01 377 290 5.55555555555555e-02 377 443 -6.94444444444444e-02 377 386 -9.72222222222223e-02 377 379 -7.80625564189563e-18 377 289 -1.12757025938492e-17 377 442 4.16666666666667e-02 377 385 8.33333333333333e-02 377 378 5.05509262921366e-18 377 288 4.16666666666667e-02 377 441 -4.16666666666667e-02 377 384 -6.61363325216158e-18 377 446 1.11111111111111e-01 377 380 -1.38888888888889e-02 377 278 5.55555555555555e-02 377 374 -1.38888888888889e-02 377 458 -1.94444444444444e-01 377 440 -2.22222222222222e-01 377 383 -9.72222222222222e-02 377 437 -6.94444444444444e-02 377 445 0.00000000000000e+00 377 376 4.16333634234434e-17 377 277 -1.48535697630514e-17 377 373 1.82145964977565e-17 377 457 -7.87401827767598e-18 377 439 1.48535697630514e-17 377 382 -8.33333333333334e-02 377 436 -4.16666666666667e-02 377 444 4.00002839011371e-17 377 375 1.66666666666667e-01 377 276 4.16666666666667e-02 377 372 6.58652819784944e-18 377 456 -1.66666666666667e-01 377 438 -1.53143556863578e-17 377 381 -6.61363325216158e-18 377 435 -4.16666666666667e-02 378 378 5.55555555555555e-01 378 353 9.97465998686664e-18 378 362 -8.33333333333334e-02 378 425 -4.16666666666667e-02 378 286 -3.46944695195361e-18 378 352 -8.33333333333334e-02 378 361 3.25260651745651e-18 378 424 -4.16666666666667e-02 378 285 -1.11111111111111e-01 378 351 -9.72222222222222e-02 378 360 -9.72222222222223e-02 378 423 -6.94444444444444e-02 378 380 2.77555756156289e-17 378 290 -1.19262238973405e-18 378 377 5.05509262921366e-18 378 446 -6.93889390390723e-18 378 443 8.38901430960659e-18 378 386 8.33333333333334e-02 378 440 4.16666666666667e-02 378 458 -9.70530350963977e-18 378 379 4.16333634234434e-17 378 289 -2.05998412772246e-18 378 376 8.33333333333334e-02 378 445 4.91956735765298e-18 378 442 6.93889390390723e-18 378 385 3.93023287525995e-19 378 439 4.16666666666667e-02 378 457 -1.88549534058807e-18 378 287 -6.93889390390723e-18 378 288 -1.11111111111111e-01 378 375 -9.72222222222222e-02 378 444 1.11111111111111e-01 378 441 1.11111111111111e-01 378 384 -9.72222222222223e-02 378 438 -6.94444444444444e-02 378 456 -2.77777777777778e-02 379 379 5.55555555555555e-01 379 353 1.06251812903579e-17 379 362 -8.29414661951411e-18 379 425 -4.16666666666667e-02 379 286 5.55555555555555e-02 379 352 -9.72222222222223e-02 379 361 -1.38888888888889e-02 379 424 -6.94444444444444e-02 379 285 -5.09575021068187e-18 379 351 -8.33333333333334e-02 379 360 2.18195687212708e-18 379 423 -4.16666666666667e-02 379 380 1.66666666666667e-01 379 290 4.16666666666667e-02 379 377 -7.69783542464708e-18 379 446 6.69494841509799e-18 379 443 -2.44267361329195e-17 379 386 -1.59919820441612e-18 379 440 -4.16666666666667e-02 379 458 -1.66666666666667e-01 379 287 4.16666666666667e-02 379 289 5.55555555555555e-02 379 376 -9.72222222222222e-02 379 445 -2.22222222222222e-01 379 442 1.11111111111111e-01 379 385 -1.38888888888889e-02 379 439 -6.94444444444444e-02 379 457 -1.94444444444444e-01 379 378 4.16333634234434e-17 379 288 -2.60208521396521e-18 379 375 8.33333333333333e-02 379 444 5.20417042793042e-18 379 441 6.93889390390723e-18 379 384 1.84314369322536e-18 379 438 4.16666666666667e-02 379 456 -2.94089839286693e-18 380 380 5.55555555555555e-01 380 353 -1.38888888888889e-02 380 362 -9.72222222222222e-02 380 425 -6.94444444444444e-02 380 286 4.16666666666667e-02 380 352 1.16551733542192e-17 380 361 -9.32413868337534e-18 380 424 -4.16666666666667e-02 380 285 -4.22838847269347e-18 380 351 9.55453164502851e-18 380 360 -8.33333333333334e-02 380 423 -4.16666666666667e-02 380 287 5.55555555555555e-02 380 290 5.55555555555556e-02 380 377 -1.38888888888889e-02 380 446 1.11111111111111e-01 380 443 -2.22222222222222e-01 380 386 -9.72222222222222e-02 380 440 -6.94444444444445e-02 380 458 -1.94444444444444e-01 380 379 1.66666666666667e-01 380 289 4.16666666666667e-02 380 376 -7.57586268024246e-18 380 445 3.32883948270940e-18 380 442 -2.53974358904729e-17 380 385 -2.49366499671666e-18 380 439 -4.16666666666667e-02 380 457 -1.66666666666667e-01 380 378 2.77555756156289e-17 380 375 4.98732999343332e-18 380 444 0.00000000000000e+00 380 441 5.20417042793042e-18 380 384 8.33333333333334e-02 380 438 4.16666666666667e-02 380 456 -1.00017650411788e-17 381 381 5.55555555555555e-01 381 377 -6.61363325216158e-18 381 278 -2.13858878522766e-17 381 374 8.33333333333334e-02 381 445 4.16666666666667e-02 381 376 -5.42101086242752e-19 381 277 -4.16666666666667e-02 381 373 1.30104260698261e-18 381 444 -6.94444444444444e-02 381 375 -1.38888888888889e-02 381 276 5.55555555555555e-02 381 372 -9.72222222222223e-02 381 458 1.50704101975485e-17 381 440 -2.77555756156289e-17 381 383 -1.24900090270330e-16 381 437 8.55028938276381e-17 381 434 -4.16666666666667e-02 381 368 -2.64274279543342e-18 381 254 -2.09352663243373e-17 381 365 -8.33333333333333e-02 381 457 1.66666666666667e-01 381 439 5.27193306371077e-18 381 382 -1.66666666666667e-01 381 436 -3.03576608295941e-18 381 433 4.16666666666667e-02 381 367 -1.40946282423116e-18 381 253 -4.16666666666667e-02 381 364 1.82959116606929e-18 381 456 -1.94444444444444e-01 381 438 1.11111111111111e-01 381 446 4.16666666666667e-02 381 435 -2.22222222222222e-01 381 432 -6.94444444444444e-02 381 366 -1.38888888888889e-02 381 252 5.55555555555555e-02 381 363 -9.72222222222222e-02 382 382 5.55555555555556e-01 382 377 -8.33333333333334e-02 382 278 2.25514051876985e-17 382 374 -4.06575814682064e-18 382 445 -6.94444444444444e-02 382 376 -9.72222222222223e-02 382 277 5.55555555555556e-02 382 373 -1.38888888888889e-02 382 444 4.16666666666667e-02 382 375 -8.94466792300541e-19 382 276 -4.16666666666667e-02 382 372 9.97804811865566e-19 382 458 -1.93733375696004e-17 382 440 -2.68882138776405e-17 382 383 1.11022302462516e-16 382 437 6.93889390390723e-18 382 434 4.16666666666667e-02 382 368 8.33333333333334e-02 382 254 2.25920627691667e-17 382 365 -2.20228566286118e-18 382 457 -1.94444444444444e-01 382 439 -2.22222222222222e-01 382 446 -4.16666666666667e-02 382 436 1.11111111111111e-01 382 433 -6.94444444444444e-02 382 367 -9.72222222222223e-02 382 253 5.55555555555556e-02 382 364 -1.38888888888889e-02 382 456 1.66666666666667e-01 382 438 1.07911997480198e-18 382 381 -1.66666666666667e-01 382 435 -3.85654100884883e-18 382 432 4.16666666666667e-02 382 366 -2.30392961653170e-19 382 252 -4.16666666666667e-02 382 363 1.31120700234966e-18 383 383 5.55555555555555e-01 383 377 -9.72222222222222e-02 383 278 -1.11111111111111e-01 383 374 -9.72222222222223e-02 383 445 -4.16666666666667e-02 383 376 -8.33333333333334e-02 383 277 2.27953506765077e-17 383 373 -4.54517879496658e-18 383 444 4.16666666666667e-02 383 375 -2.64274279543342e-18 383 276 -2.18551441050555e-17 383 372 8.33333333333334e-02 383 458 -2.77777777777778e-02 383 440 1.11111111111111e-01 383 446 -6.94444444444445e-02 383 437 1.11111111111111e-01 383 434 -6.94444444444444e-02 383 368 -9.72222222222222e-02 383 254 -1.11111111111111e-01 383 365 -9.72222222222221e-02 383 457 -1.68593437821496e-17 383 439 -2.68882138776405e-17 383 382 1.11022302462516e-16 383 436 6.93889390390723e-18 383 433 4.16666666666667e-02 383 367 8.33333333333333e-02 383 253 2.26598254049470e-17 383 364 -2.53432257818487e-18 383 456 1.34390247411367e-17 383 438 -2.08166817117217e-17 383 381 -1.24900090270330e-16 383 435 8.50463430690680e-17 383 432 -4.16666666666667e-02 383 366 -6.61363325216158e-18 383 252 -2.13858878522766e-17 383 363 -8.33333333333333e-02 384 384 5.55555555555556e-01 384 290 6.07153216591882e-18 384 377 -6.61363325216158e-18 384 446 4.16666666666667e-02 384 443 -1.62630325872826e-18 384 379 1.84314369322536e-18 384 289 4.16666666666667e-02 384 376 -8.67361737988404e-19 384 445 -4.16666666666667e-02 384 378 -9.72222222222223e-02 384 288 5.55555555555555e-02 384 375 -1.38888888888889e-02 384 444 -6.94444444444444e-02 384 386 -4.16333634234434e-17 384 440 -2.77555756156289e-17 384 458 1.93936663603345e-17 384 371 -8.33333333333334e-02 384 266 2.27682456221956e-18 384 368 -2.64274279543342e-18 384 434 -4.16666666666667e-02 384 442 -2.71050543121376e-18 384 385 1.66666666666667e-01 384 439 1.89227160416611e-18 384 457 -1.66666666666667e-01 384 370 2.16840434497101e-18 384 265 4.16666666666667e-02 384 367 -9.08019319456610e-19 384 433 -4.16666666666667e-02 384 441 -2.22222222222222e-01 384 380 8.33333333333334e-02 384 438 1.11111111111111e-01 384 456 -1.94444444444444e-01 384 369 -9.72222222222223e-02 384 264 5.55555555555555e-02 384 366 -1.38888888888889e-02 384 432 -6.94444444444444e-02 385 385 5.55555555555555e-01 385 290 -8.67361737988404e-18 385 377 8.33333333333333e-02 385 446 4.16666666666667e-02 385 379 -1.38888888888889e-02 385 289 5.55555555555556e-02 385 376 -9.72222222222223e-02 385 445 -6.94444444444445e-02 385 378 7.18283939271647e-19 385 288 4.16666666666667e-02 385 375 -9.75781955236954e-19 385 444 -4.16666666666667e-02 385 443 -6.93889390390723e-18 385 386 -1.38777878078145e-17 385 440 -1.98408997564847e-17 385 458 3.77844457111198e-17 385 371 -7.80625564189563e-18 385 266 -8.67361737988404e-18 385 368 -8.33333333333334e-02 385 434 -4.16666666666666e-02 385 442 1.11111111111111e-01 385 380 -2.60208521396521e-18 385 439 -2.22222222222222e-01 385 457 -1.94444444444444e-01 385 370 -1.38888888888889e-02 385 265 5.55555555555556e-02 385 367 -9.72222222222223e-02 385 433 -6.94444444444444e-02 385 441 -5.59041745187838e-18 385 384 1.66666666666667e-01 385 438 5.27193306371077e-18 385 456 -1.66666666666667e-01 385 369 7.31836466427715e-19 385 264 4.16666666666667e-02 385 366 -5.42101086242752e-19 385 432 -4.16666666666667e-02 386 386 5.55555555555555e-01 386 290 -1.11111111111111e-01 386 377 -9.72222222222223e-02 386 446 -6.94444444444445e-02 386 379 -1.70761842166467e-18 386 289 -8.56519716263549e-18 386 376 8.33333333333334e-02 386 445 4.16666666666667e-02 386 378 8.33333333333334e-02 386 288 5.74627151417317e-18 386 375 -6.08508469307489e-18 386 444 4.16666666666667e-02 386 443 1.11111111111111e-01 386 380 -9.72222222222222e-02 386 440 1.11111111111111e-01 386 458 -2.77777777777778e-02 386 371 -9.72222222222222e-02 386 266 -1.11111111111111e-01 386 368 -9.72222222222222e-02 386 434 -6.94444444444444e-02 386 442 -6.93889390390723e-18 386 385 -1.38777878078145e-17 386 439 -1.81061762805079e-17 386 457 3.71102074851054e-17 386 370 -7.04731412115578e-18 386 265 -7.80625564189563e-18 386 367 -8.33333333333334e-02 386 433 -4.16666666666667e-02 386 441 -3.65918233213858e-18 386 384 -4.16333634234434e-17 386 438 -2.08166817117217e-17 386 456 1.79960619973649e-17 386 369 -8.33333333333333e-02 386 264 6.07153216591882e-18 386 366 -6.61363325216158e-18 386 432 -4.16666666666667e-02 387 387 1.11111111111111e+00 387 398 7.81980816905170e-18 387 314 -4.16666666666667e-02 387 299 2.77555756156289e-17 387 257 -1.15264243462365e-17 387 397 1.47722546001150e-18 387 313 -4.16666666666667e-02 387 298 9.46644021851406e-18 387 256 -8.33333333333334e-02 387 396 -2.77777777777777e-02 387 312 -6.94444444444445e-02 387 297 1.11111111111111e-01 387 255 -9.72222222222223e-02 387 395 -1.66666666666667e-01 387 311 -4.16666666666667e-02 387 296 -6.53720970449556e-17 387 245 -1.33695680394619e-17 387 394 -1.78181850784415e-17 387 310 4.16666666666667e-02 387 295 -3.16400687117371e-17 387 244 8.33333333333334e-02 387 393 -1.94444444444445e-01 387 309 -6.94444444444445e-02 387 294 -2.22222222222223e-01 387 243 -9.72222222222223e-02 387 449 1.40268656065312e-17 387 392 7.81980816905170e-18 387 389 5.55111512312578e-17 387 293 2.77555756156289e-17 387 448 2.08166817117217e-17 387 391 3.26954717640160e-18 387 388 1.38777878078145e-17 387 292 8.00255552742182e-18 387 447 2.22222222222222e-01 387 390 -2.77777777777777e-02 387 291 1.11111111111111e-01 387 29 -3.03576608295941e-18 387 166 4.16666666666667e-02 387 28 8.33333333333334e-02 387 165 -6.94444444444445e-02 387 27 -9.72222222222222e-02 387 224 1.66666666666667e-01 387 164 4.16666666666667e-02 387 149 -1.33966730937740e-17 387 14 -1.08420217248550e-18 387 223 0.00000000000000e+00 387 163 -4.16666666666667e-02 387 148 -3.83536518516747e-18 387 13 -8.33333333333334e-02 387 222 -1.94444444444445e-01 387 162 -6.94444444444445e-02 387 147 -2.22222222222222e-01 387 167 4.16666666666667e-02 387 12 -9.72222222222222e-02 388 388 1.11111111111111e+00 388 398 -1.66666666666667e-01 388 314 -4.16666666666667e-02 388 299 -3.31098826334602e-17 388 257 -6.61871544984510e-18 388 397 -1.94444444444444e-01 388 313 -6.94444444444445e-02 388 298 -2.22222222222222e-01 388 256 -9.72222222222222e-02 388 396 3.46267068837558e-18 388 312 -4.16666666666667e-02 388 297 1.14196981948825e-17 388 255 -8.33333333333334e-02 388 395 -4.46149193977785e-17 388 311 4.16666666666667e-02 388 296 -9.02056207507940e-17 388 245 3.32985592224611e-17 388 394 -2.77777777777778e-02 388 310 -6.94444444444444e-02 388 295 1.11111111111111e-01 388 244 -9.72222222222221e-02 388 393 -1.72659195968317e-17 388 309 4.16666666666667e-02 388 294 -2.94174542581419e-17 388 243 8.33333333333334e-02 388 449 2.69017664047966e-17 388 392 1.66666666666667e-01 388 389 1.52655665885959e-16 388 293 -3.57397081764479e-17 388 448 2.22222222222222e-01 388 391 -1.94444444444444e-01 388 292 -2.22222222222222e-01 388 447 1.38777878078145e-17 388 390 1.02999206386123e-18 388 387 1.38777878078145e-17 388 291 1.29341931045732e-17 388 29 1.57785297414531e-17 388 166 -6.94444444444444e-02 388 28 -9.72222222222222e-02 388 165 4.16666666666667e-02 388 27 8.33333333333334e-02 388 224 -2.39337629576175e-17 388 164 4.16666666666667e-02 388 149 -4.16333634234434e-17 388 14 6.69494841509799e-18 388 223 -2.77777777777778e-02 388 163 -6.94444444444444e-02 388 148 1.11111111111111e-01 388 167 -4.16666666666667e-02 388 13 -9.72222222222222e-02 388 222 9.65617559869902e-20 388 162 -4.16666666666667e-02 388 147 -2.71410532123959e-18 388 12 -8.33333333333334e-02 389 389 1.11111111111111e+00 389 398 -1.94444444444444e-01 389 314 -6.94444444444445e-02 389 299 1.11111111111111e-01 389 257 -1.38888888888889e-02 389 397 -1.66666666666667e-01 389 313 -4.16666666666667e-02 389 298 -3.05355377485175e-17 389 256 -8.28059409235804e-18 389 396 8.16539761153146e-18 389 312 -4.16666666666667e-02 389 297 3.46944695195361e-17 389 255 -1.13841228110978e-17 389 395 -1.94444444444444e-01 389 311 -6.94444444444444e-02 389 296 1.11111111111111e-01 389 245 -1.38888888888889e-02 389 394 -4.64631452886874e-17 389 310 4.16666666666667e-02 389 295 -9.71445146547012e-17 389 244 3.39524686577414e-17 389 393 -1.66666666666667e-01 389 309 -4.16666666666667e-02 389 294 -6.36460556566881e-17 389 243 -1.39184453892827e-17 389 449 -4.44444444444444e-01 389 392 -1.94444444444444e-01 389 293 1.11111111111111e-01 389 448 4.59453963996782e-17 389 391 1.66666666666667e-01 389 388 1.52655665885959e-16 389 292 -3.83544988846220e-17 389 447 2.96954928230781e-17 389 390 8.17725607279302e-18 389 387 4.16333634234434e-17 389 291 2.08166817117217e-17 389 29 -1.38888888888889e-02 389 166 -4.16666666666666e-02 389 28 1.74014448683923e-17 389 165 4.16666666666667e-02 389 27 -3.60158409172529e-18 389 224 -1.94444444444444e-01 389 164 -6.94444444444445e-02 389 149 1.11111111111111e-01 389 167 -6.94444444444445e-02 389 14 -1.38888888888889e-02 389 223 -2.10081111578012e-17 389 163 4.16666666666667e-02 389 148 -4.16333634234434e-17 389 13 7.74357520379881e-18 389 222 1.66666666666667e-01 389 162 4.16666666666667e-02 389 147 -1.43724550490110e-17 389 12 -1.77029885976149e-18 390 390 1.11111111111111e+00 390 269 -8.33333333333334e-02 390 304 -4.16666666666667e-02 390 268 -8.68378177525109e-18 390 303 -6.94444444444445e-02 390 267 -9.72222222222223e-02 390 401 1.12892551210053e-17 390 302 7.73849300611529e-18 390 400 1.47722546001150e-18 390 301 2.77555756156289e-17 390 399 -2.77777777777777e-02 390 300 1.11111111111111e-01 390 395 -2.59734182946059e-17 390 311 -9.13014696263042e-17 390 296 4.16666666666667e-02 390 245 8.33333333333333e-02 390 448 1.53753420585601e-17 390 394 -1.66666666666667e-01 390 310 -3.05507843415681e-17 390 295 -4.16666666666667e-02 390 244 -9.07680506277708e-18 390 393 -1.94444444444445e-01 390 309 -2.22222222222223e-01 390 294 -6.94444444444445e-02 390 243 -9.72222222222223e-02 390 449 2.77555756156289e-17 390 392 2.77555756156289e-17 390 389 8.17556200689851e-18 390 293 8.71279265369455e-18 390 391 2.77555756156289e-17 390 388 1.04354459101730e-18 390 292 1.38777878078145e-17 390 447 2.22222222222222e-01 390 305 -4.16666666666667e-02 390 387 -2.77777777777777e-02 390 291 1.11111111111111e-01 390 158 4.16666666666667e-02 390 44 8.33333333333334e-02 390 157 4.16666666666667e-02 390 43 2.16840434497101e-19 390 156 -6.94444444444445e-02 390 42 -9.72222222222223e-02 390 224 -1.95156391047391e-18 390 164 4.76032516356917e-17 390 149 -4.16666666666667e-02 390 14 -8.33333333333333e-02 390 223 1.66666666666667e-01 390 163 1.53143556863578e-18 390 148 4.16666666666667e-02 390 13 7.45388993583784e-19 390 222 -1.94444444444444e-01 390 162 -2.22222222222222e-01 390 147 -6.94444444444445e-02 390 12 -9.72222222222222e-02 391 391 1.11111111111111e+00 391 269 -2.10877322548431e-17 391 304 -6.94444444444445e-02 391 268 -1.38888888888889e-02 391 303 -4.16666666666667e-02 391 267 -8.37546178245052e-18 391 401 -1.66666666666667e-01 391 302 2.48959923856984e-17 391 400 -1.94444444444444e-01 391 301 1.11111111111111e-01 391 399 3.67951112287268e-18 391 300 2.08166817117217e-17 391 395 -2.06676039130049e-18 391 311 -4.16333634234434e-17 391 296 4.16666666666667e-02 391 245 5.84452733605467e-19 391 394 -1.94444444444444e-01 391 310 1.11111111111111e-01 391 295 -6.94444444444444e-02 391 244 -1.38888888888889e-02 391 393 -1.66666666666667e-01 391 309 -3.21279596893556e-17 391 294 -4.16666666666667e-02 391 243 -8.40256683676266e-18 391 449 -1.13823863935559e-16 391 392 2.77555756156289e-16 391 389 1.66666666666667e-01 391 293 3.31621869179531e-17 391 448 -4.44444444444444e-01 391 305 -4.16666666666667e-02 391 388 -1.94444444444444e-01 391 292 1.11111111111111e-01 391 447 1.73995390442610e-17 391 390 2.77555756156289e-17 391 387 3.26954717640160e-18 391 291 3.46944695195361e-17 391 158 -4.16666666666667e-02 391 44 -9.29703362906320e-18 391 157 -6.94444444444444e-02 391 43 -1.38888888888889e-02 391 156 4.16666666666667e-02 391 42 6.94567016748526e-20 391 224 2.76081918828067e-17 391 164 -2.77555756156289e-17 391 149 4.16666666666667e-02 391 14 -7.70630575411962e-18 391 223 -1.94444444444444e-01 391 163 1.11111111111111e-01 391 148 -6.94444444444444e-02 391 13 -1.38888888888889e-02 391 222 1.66666666666667e-01 391 162 3.16938553038878e-18 391 147 4.16666666666667e-02 391 12 1.01813360259967e-18 392 392 1.11111111111111e+00 392 269 -9.72222222222223e-02 392 304 -4.16666666666667e-02 392 268 -2.35305752747245e-17 392 303 -4.16666666666667e-02 392 267 -8.33333333333334e-02 392 401 -1.94444444444444e-01 392 302 -2.22222222222222e-01 392 400 -1.66666666666667e-01 392 301 3.31621869179531e-17 392 399 1.16348445634851e-17 392 300 1.21301470793920e-17 392 395 -2.77777777777778e-02 392 311 1.11111111111111e-01 392 296 -6.94444444444444e-02 392 245 -9.72222222222221e-02 392 394 -5.67850887839283e-18 392 310 -4.85722573273506e-17 392 295 4.16666666666667e-02 392 244 1.40946282423116e-18 392 393 -2.69966340948891e-17 392 309 -8.69699548922825e-17 392 294 4.16666666666667e-02 392 243 8.33333333333333e-02 392 449 2.22222222222222e-01 392 305 -6.94444444444445e-02 392 389 -1.94444444444444e-01 392 293 -2.22222222222222e-01 392 448 -1.11945568375023e-16 392 391 2.49800180540660e-16 392 388 1.66666666666667e-01 392 292 3.19416124409597e-17 392 447 3.46944695195361e-17 392 390 2.77555756156289e-17 392 387 7.81980816905170e-18 392 291 5.16181878056771e-18 392 158 -6.94444444444445e-02 392 44 -9.72222222222223e-02 392 157 -4.16666666666666e-02 392 43 -9.01243055878576e-18 392 156 4.16666666666667e-02 392 42 8.33333333333334e-02 392 224 -2.77777777777778e-02 392 164 1.11111111111111e-01 392 149 -6.94444444444444e-02 392 14 -9.72222222222222e-02 392 223 2.92192485484843e-17 392 163 -2.08166817117217e-17 392 148 4.16666666666667e-02 392 13 -7.94178091345632e-18 392 222 -3.23566585851143e-18 392 162 4.47978785143854e-17 392 147 -4.16666666666667e-02 392 12 -8.33333333333333e-02 393 393 2.22222222222222e+00 393 331 -4.16666666666667e-02 393 330 -6.94444444444444e-02 393 416 -1.66666666666667e-01 393 326 -4.16666666666667e-02 393 415 -1.64561560992565e-17 393 325 4.16666666666667e-02 393 414 -1.94444444444444e-01 393 324 -6.94444444444444e-02 393 413 -2.06303344633257e-17 393 323 4.16666666666667e-02 393 412 -1.66666666666667e-01 393 322 -4.16666666666667e-02 393 411 -1.94444444444444e-01 393 321 -6.94444444444444e-02 393 452 -1.41204203955555e-16 393 407 -2.51128328201955e-17 393 404 1.66666666666667e-01 393 317 4.16666666666667e-02 393 451 -1.81626310264424e-16 393 406 1.66666666666667e-01 393 403 -1.63172426959068e-17 393 316 4.16666666666667e-02 393 450 -4.44444444444444e-01 393 405 -1.94444444444444e-01 393 402 -1.94444444444444e-01 393 315 -6.94444444444444e-02 393 308 4.16666666666667e-02 393 281 1.25496401465197e-17 393 307 4.16666666666667e-02 393 280 7.88757080483204e-18 393 306 -6.94444444444444e-02 393 279 -2.77777777777778e-02 393 401 1.66666666666667e-01 393 305 6.01545858481059e-17 393 269 1.23327997120226e-17 393 302 4.16666666666667e-02 393 400 -1.80519661718836e-17 393 304 3.46944695195361e-17 393 268 1.08911496357958e-17 393 301 -4.16666666666667e-02 393 399 -1.94444444444445e-01 393 303 2.22222222222222e-01 393 267 -2.77777777777778e-02 393 300 -6.94444444444445e-02 393 398 -3.05745012640912e-17 393 314 4.16333634234434e-17 393 299 -4.16666666666667e-02 393 257 1.01339021809504e-17 393 397 1.66666666666667e-01 393 313 5.94888179515640e-17 393 298 4.16666666666667e-02 393 256 7.67073037033494e-18 393 396 -1.94444444444444e-01 393 312 2.22222222222222e-01 393 297 -6.94444444444445e-02 393 255 -2.77777777777779e-02 393 449 -1.22719827464098e-16 393 395 2.63677968348475e-16 393 311 4.16333634234434e-17 393 392 -2.76607079255364e-17 393 389 -1.66666666666667e-01 393 296 5.57445088082264e-17 393 245 1.44469939483693e-17 393 293 -4.16666666666667e-02 393 448 -6.17199027346318e-17 393 394 2.63677968348475e-16 393 310 6.70604454670702e-17 393 391 -1.66666666666667e-01 393 388 -1.73607872869241e-17 393 295 4.16333634234434e-17 393 244 1.06793913989822e-17 393 292 -4.16666666666667e-02 393 447 -4.44444444444445e-01 393 332 -4.16666666666667e-02 393 309 2.22222222222222e-01 393 390 -1.94444444444445e-01 393 387 -1.94444444444445e-01 393 294 2.22222222222222e-01 393 243 -2.77777777777779e-02 393 291 -6.94444444444445e-02 394 394 2.22222222222222e+00 394 331 -6.94444444444445e-02 394 330 -4.16666666666667e-02 394 416 -4.71356894488073e-17 394 326 4.16666666666667e-02 394 415 -2.77777777777777e-02 394 325 -6.94444444444444e-02 394 414 -1.45418616384618e-17 394 324 4.16666666666667e-02 394 413 -5.32546554597724e-17 394 323 4.16666666666667e-02 394 412 -1.94444444444445e-01 394 322 -6.94444444444445e-02 394 411 -1.66666666666667e-01 394 321 -4.16666666666667e-02 394 452 2.77555756156289e-17 394 407 3.42065785419177e-17 394 404 5.21094669150846e-17 394 317 -4.16666666666667e-02 394 451 2.22222222222223e-01 394 406 -1.94444444444444e-01 394 403 -2.77777777777776e-02 394 316 -6.94444444444444e-02 394 450 -1.76519972141902e-16 394 405 1.66666666666667e-01 394 402 -1.50975152518606e-17 394 315 4.16666666666667e-02 394 308 -4.16666666666666e-02 394 281 -1.66666666666667e-01 394 307 -6.94444444444444e-02 394 280 -1.94444444444445e-01 394 306 4.16666666666667e-02 394 279 9.25637604759499e-18 394 401 3.67273485929465e-18 394 305 3.02898981938138e-18 394 269 1.66666666666667e-01 394 302 4.16666666666667e-02 394 400 -2.77777777777777e-02 394 304 2.22222222222222e-01 394 268 -1.94444444444445e-01 394 301 -6.94444444444444e-02 394 399 -2.01204206290787e-17 394 303 3.46944695195361e-17 394 267 5.93600689435814e-18 394 300 -4.16666666666667e-02 394 398 8.28076349894749e-17 394 314 -4.93782091766631e-17 394 299 4.16666666666667e-02 394 257 1.66666666666667e-01 394 397 -1.94444444444444e-01 394 313 -4.44444444444445e-01 394 298 -6.94444444444444e-02 394 256 -1.94444444444445e-01 394 396 1.66666666666667e-01 394 312 6.86867487257985e-17 394 297 4.16666666666667e-02 394 255 1.06624507400371e-17 394 449 -8.32667268468867e-17 394 395 1.80411241501588e-16 394 311 -5.86248443453646e-17 394 392 -5.25838053655470e-18 394 389 -4.64631452886874e-17 394 296 3.12661036655244e-18 394 245 -1.66666666666667e-01 394 293 -4.16666666666667e-02 394 448 2.22222222222222e-01 394 332 -4.16666666666668e-02 394 310 -4.44444444444445e-01 394 391 -1.94444444444444e-01 394 388 -2.77777777777778e-02 394 295 2.22222222222222e-01 394 244 -1.94444444444445e-01 394 292 -6.94444444444445e-02 394 447 -6.48367722222909e-17 394 393 2.63677968348475e-16 394 309 6.25771000772532e-17 394 390 -1.66666666666667e-01 394 387 -1.84670123160383e-17 394 294 4.16333634234434e-17 394 243 8.09085871217308e-18 394 291 -4.16666666666667e-02 395 395 2.22222222222222e+00 395 331 -4.16666666666668e-02 395 330 -4.16666666666667e-02 395 416 -1.94444444444445e-01 395 326 -6.94444444444445e-02 395 415 -5.01629852022942e-17 395 325 4.16666666666667e-02 395 414 -1.66666666666667e-01 395 324 -4.16666666666667e-02 395 413 -2.77777777777778e-02 395 323 -6.94444444444445e-02 395 412 -5.21365719693967e-17 395 322 4.16666666666667e-02 395 411 -2.05727362229124e-17 395 321 4.16666666666667e-02 395 452 2.22222222222223e-01 395 407 -2.77777777777776e-02 395 404 -1.94444444444444e-01 395 317 -6.94444444444444e-02 395 451 2.08166817117217e-17 395 406 3.73067191288684e-17 395 403 5.31801165604140e-17 395 316 -4.16666666666667e-02 395 450 -1.43209554458179e-16 395 405 -2.55871712706579e-17 395 402 1.66666666666667e-01 395 315 4.16666666666667e-02 395 308 -6.94444444444444e-02 395 281 -1.94444444444445e-01 395 307 -4.16666666666666e-02 395 280 -1.66666666666667e-01 395 306 4.16666666666667e-02 395 279 1.10859672136643e-17 395 401 -1.94444444444444e-01 395 305 -4.44444444444445e-01 395 269 -1.94444444444445e-01 395 302 -6.94444444444444e-02 395 400 2.21075599233372e-18 395 304 3.24985366037794e-18 395 268 1.66666666666667e-01 395 301 4.16666666666667e-02 395 399 1.66666666666667e-01 395 303 5.55799726582222e-17 395 267 1.01084911925328e-17 395 300 4.16666666666667e-02 395 398 -2.77777777777778e-02 395 314 2.22222222222222e-01 395 299 -6.94444444444444e-02 395 257 -1.94444444444445e-01 395 397 8.32802793740428e-17 395 313 -4.43116816026615e-17 395 298 4.16666666666667e-02 395 256 1.66666666666667e-01 395 396 -2.98223360069294e-17 395 312 4.16333634234434e-17 395 297 -4.16666666666667e-02 395 255 1.34170018845081e-17 395 449 2.22222222222222e-01 395 332 -6.94444444444445e-02 395 311 2.22222222222222e-01 395 392 -2.77777777777778e-02 395 389 -1.94444444444444e-01 395 296 -4.44444444444445e-01 395 245 -1.94444444444445e-01 395 293 -6.94444444444445e-02 395 448 -8.32667268468867e-17 395 394 1.80411241501588e-16 395 310 -6.04385536436729e-17 395 391 -2.18703906981060e-18 395 388 -4.46284719249346e-17 395 295 6.48319017828441e-18 395 244 -1.66666666666667e-01 395 292 -4.16666666666667e-02 395 447 -1.25187446197686e-16 395 393 2.63677968348475e-16 395 309 5.55111512312578e-17 395 390 -2.49146271105380e-17 395 387 -1.66666666666667e-01 395 294 5.45556980667550e-17 395 243 1.35118695746006e-17 395 291 -4.16666666666667e-02 396 396 1.11111111111111e+00 396 308 6.28837260041593e-18 396 281 -8.33333333333334e-02 396 305 -4.16666666666667e-02 396 401 1.12892551210053e-17 396 307 -6.93889390390723e-18 396 280 -9.08019319456610e-18 396 304 4.16666666666667e-02 396 400 3.28140563766316e-18 396 306 1.11111111111111e-01 396 279 -9.72222222222223e-02 396 303 -6.94444444444445e-02 396 399 -2.77777777777778e-02 396 398 5.55111512312578e-17 396 314 -3.31630339509004e-17 396 395 -2.98358885340855e-17 396 449 2.77555756156289e-17 396 299 1.39726554979069e-17 396 257 8.33333333333334e-02 396 296 4.16666666666667e-02 396 389 8.13659849132481e-18 396 397 0.00000000000000e+00 396 313 -3.38965644832226e-17 396 394 1.66666666666667e-01 396 448 1.39823963768004e-17 396 298 -6.93889390390723e-18 396 256 -9.87979229677416e-18 396 295 4.16666666666667e-02 396 388 3.44742409532500e-18 396 312 -2.22222222222222e-01 396 393 -1.94444444444444e-01 396 447 2.22222222222222e-01 396 297 1.11111111111111e-01 396 255 -9.72222222222222e-02 396 294 -6.94444444444444e-02 396 387 -2.77777777777777e-02 396 158 4.16666666666667e-02 396 58 -1.08420217248550e-18 396 157 -4.16666666666667e-02 396 57 -9.72222222222223e-02 396 156 -6.94444444444445e-02 396 167 -6.96057794735694e-17 396 224 1.84314369322536e-18 396 29 -8.33333333333334e-02 396 149 -4.16666666666667e-02 396 166 -1.73472347597681e-18 396 223 -1.66666666666667e-01 396 28 -5.42101086242752e-19 396 148 -4.16666666666667e-02 396 165 -2.22222222222222e-01 396 222 -1.94444444444444e-01 396 27 -9.72222222222223e-02 396 147 -6.94444444444445e-02 396 59 8.33333333333333e-02 397 397 1.11111111111111e+00 397 308 2.11419423634673e-18 397 281 -2.17924636669586e-17 397 305 4.16666666666667e-02 397 401 1.66666666666667e-01 397 307 1.11111111111111e-01 397 280 -1.38888888888889e-02 397 304 -6.94444444444444e-02 397 400 -1.94444444444444e-01 397 306 -6.93889390390723e-18 397 279 -8.89045781438114e-18 397 303 4.16666666666667e-02 397 399 1.13841228110978e-18 397 398 1.38777878078145e-17 397 314 -3.46944695195361e-17 397 395 8.37139602430370e-17 397 449 -1.05657195774607e-16 397 299 1.22565667467697e-17 397 257 1.62630325872826e-18 397 296 -4.16666666666666e-02 397 389 -1.66666666666667e-01 397 313 1.11111111111111e-01 397 394 -1.94444444444444e-01 397 448 -4.44444444444444e-01 397 298 1.11111111111111e-01 397 256 -1.38888888888889e-02 397 295 -6.94444444444444e-02 397 388 -1.94444444444444e-01 397 396 0.00000000000000e+00 397 312 -3.05338436826230e-17 397 393 1.66666666666667e-01 397 447 1.87346747273706e-17 397 297 -6.93889390390723e-18 397 255 -8.99887803162969e-18 397 294 4.16666666666667e-02 397 387 1.46367293285543e-18 397 158 4.16666666666667e-02 397 58 -1.38888888888889e-02 397 157 -6.94444444444444e-02 397 57 -4.06575814682064e-19 397 156 -4.16666666666667e-02 397 167 -4.16333634234434e-17 397 224 1.40675231879994e-17 397 29 -1.34441069388203e-17 397 149 -4.16666666666667e-02 397 166 1.11111111111111e-01 397 223 -1.94444444444444e-01 397 28 -1.38888888888889e-02 397 148 -6.94444444444444e-02 397 165 -1.20278678510111e-19 397 222 -1.66666666666667e-01 397 27 -3.93023287525995e-19 397 147 -4.16666666666667e-02 397 59 -1.27935856353290e-17 398 398 1.11111111111111e+00 398 308 -2.22222222222222e-01 398 281 -9.72222222222222e-02 398 305 -6.94444444444444e-02 398 401 -1.94444444444444e-01 398 307 1.29087821161555e-17 398 280 -2.11825999449355e-17 398 304 4.16666666666667e-02 398 400 1.66666666666667e-01 398 306 1.75640751942652e-17 398 279 -8.33333333333334e-02 398 303 -4.16666666666667e-02 398 399 8.18911453405458e-18 398 314 1.11111111111111e-01 398 395 -2.77777777777778e-02 398 449 2.22222222222222e-01 398 299 -2.22222222222222e-01 398 257 -9.72222222222222e-02 398 296 -6.94444444444444e-02 398 389 -1.94444444444444e-01 398 397 1.38777878078145e-17 398 313 -3.46944695195361e-17 398 394 8.19402732514865e-17 398 448 -1.01735009712346e-16 398 298 1.26038502551440e-18 398 256 2.27682456221956e-18 398 295 -4.16666666666666e-02 398 388 -1.66666666666667e-01 398 396 5.55111512312578e-17 398 312 -3.23092247400680e-17 398 393 -2.89888555868312e-17 398 447 2.08166817117217e-17 398 297 6.17995238316738e-18 398 255 8.33333333333334e-02 398 294 4.16666666666667e-02 398 387 8.02309607639273e-18 398 158 -6.94444444444445e-02 398 58 -1.37016049547856e-17 398 157 4.16666666666667e-02 398 57 8.33333333333333e-02 398 156 4.16666666666667e-02 398 167 1.11111111111111e-01 398 224 -2.77777777777778e-02 398 29 -9.72222222222223e-02 398 149 -6.94444444444444e-02 398 166 -4.16333634234434e-17 398 223 1.67932752122638e-17 398 28 -1.26851654180804e-17 398 148 -4.16666666666667e-02 398 165 -6.88603904799856e-17 398 222 8.58891408515861e-19 398 27 -8.33333333333334e-02 398 147 -4.16666666666667e-02 398 59 -9.72222222222222e-02 399 399 1.11111111111111e+00 399 308 0.00000000000000e+00 399 281 -1.09233368877915e-17 399 398 8.20266706121064e-18 399 314 4.16666666666667e-02 399 307 5.85469173142172e-18 399 280 -8.33333333333334e-02 399 397 1.15196480826585e-18 399 313 -4.16666666666667e-02 399 306 1.11111111111111e-01 399 279 -9.72222222222223e-02 399 396 -2.77777777777778e-02 399 312 -6.94444444444445e-02 399 305 -6.17215968005264e-17 399 269 -1.28884533254214e-17 399 395 1.66666666666667e-01 399 311 4.16666666666667e-02 399 304 -3.27564581362183e-17 399 268 8.33333333333333e-02 399 394 -1.92818580112969e-17 399 310 4.16666666666667e-02 399 303 -2.22222222222222e-01 399 267 -9.72222222222222e-02 399 393 -1.94444444444445e-01 399 309 -6.94444444444444e-02 399 401 5.55111512312578e-17 399 302 0.00000000000000e+00 399 449 2.26871422174960e-17 399 392 1.16060454432784e-17 399 400 1.38777878078145e-17 399 301 5.97666447582634e-18 399 448 6.93889390390723e-18 399 391 3.66426452982210e-18 399 300 1.11111111111111e-01 399 447 2.22222222222222e-01 399 390 -2.77777777777777e-02 399 167 -4.16666666666667e-02 399 58 8.33333333333333e-02 399 166 4.16666666666667e-02 399 57 -9.72222222222222e-02 399 165 -6.94444444444445e-02 399 158 -1.03676832743926e-17 399 44 -6.50521303491303e-19 399 224 -1.66666666666667e-01 399 164 -4.16666666666667e-02 399 157 3.68628738645072e-18 399 43 -8.33333333333334e-02 399 223 5.28548559086683e-19 399 163 -4.16666666666667e-02 399 156 -2.22222222222222e-01 399 59 -3.57786716920216e-18 399 42 -9.72222222222222e-02 399 222 -1.94444444444445e-01 399 162 -6.94444444444445e-02 400 400 1.11111111111111e+00 400 308 -6.99666155090997e-17 400 281 5.42101086242752e-18 400 398 1.66666666666667e-01 400 314 4.16666666666667e-02 400 307 -2.22222222222222e-01 400 280 -9.72222222222222e-02 400 397 -1.94444444444444e-01 400 313 -6.94444444444444e-02 400 306 5.97666447582634e-18 400 279 -8.33333333333333e-02 400 396 3.28140563766316e-18 400 312 -4.16666666666667e-02 400 305 1.38777878078145e-17 400 269 4.69459540686223e-17 400 395 2.22430851948979e-18 400 311 -4.16666666666666e-02 400 304 1.11111111111111e-01 400 268 -9.72222222222222e-02 400 394 -2.77777777777777e-02 400 310 -6.94444444444444e-02 400 303 -3.31765864780564e-17 400 267 8.33333333333333e-02 400 300 5.74627151417317e-18 400 393 -1.83772268236293e-17 400 309 4.16666666666667e-02 400 401 9.71445146547012e-17 400 302 -7.68563815020662e-17 400 449 4.21407361588487e-17 400 392 -1.66666666666667e-01 400 301 -2.22222222222222e-01 400 448 2.22222222222222e-01 400 391 -1.94444444444444e-01 400 399 1.38777878078145e-17 400 447 2.77555756156289e-17 400 390 1.46367293285543e-18 400 167 4.16666666666667e-02 400 58 -9.72222222222222e-02 400 166 -6.94444444444444e-02 400 57 8.33333333333334e-02 400 165 4.16666666666667e-02 400 158 -2.77555756156289e-17 400 44 6.39679281766448e-18 400 224 -1.75623811283707e-17 400 164 -4.16666666666667e-02 400 157 1.11111111111111e-01 400 59 1.53143556863578e-17 400 43 -9.72222222222222e-02 400 223 -2.77777777777778e-02 400 163 -6.94444444444444e-02 400 156 5.81403414995352e-18 400 42 -8.33333333333333e-02 400 222 6.52215369385811e-19 400 162 -4.16666666666667e-02 401 401 1.11111111111111e+00 401 308 1.11111111111111e-01 401 281 -1.38888888888889e-02 401 398 -1.94444444444444e-01 401 314 -6.94444444444444e-02 401 307 -7.25195728121242e-17 401 280 3.46944695195361e-18 401 397 1.66666666666667e-01 401 313 4.16666666666667e-02 401 306 0.00000000000000e+00 401 279 -1.02999206386123e-17 401 396 1.12892551210053e-17 401 312 4.16666666666667e-02 401 305 1.11111111111111e-01 401 269 -1.38888888888889e-02 401 395 -1.94444444444444e-01 401 311 -6.94444444444444e-02 401 304 1.38777878078145e-17 401 268 4.62276701293507e-17 401 394 3.68628738645072e-18 401 310 -4.16666666666666e-02 401 303 -6.25855704067257e-17 401 267 -1.21430643318376e-17 401 393 1.66666666666667e-01 401 309 4.16666666666667e-02 401 302 1.11111111111111e-01 401 449 -4.44444444444444e-01 401 392 -1.94444444444444e-01 401 400 8.32667268468867e-17 401 301 -7.53893204374217e-17 401 448 3.32019974664741e-17 401 391 -1.66666666666667e-01 401 399 5.55111512312578e-17 401 300 0.00000000000000e+00 401 447 1.13417711637351e-17 401 390 1.14925430283463e-17 401 167 -6.94444444444444e-02 401 58 1.44198888940572e-17 401 166 4.16666666666667e-02 401 57 -2.88668828424266e-18 401 165 -4.16666666666667e-02 401 158 1.11111111111111e-01 401 59 -1.38888888888889e-02 401 44 -1.38888888888889e-02 401 224 -1.94444444444444e-01 401 164 -6.94444444444444e-02 401 157 -2.08166817117217e-17 401 43 7.41323235436964e-18 401 223 -1.88922228555599e-17 401 163 -4.16666666666667e-02 401 156 -1.18838722499778e-17 401 42 -1.34170018845081e-18 401 222 -1.66666666666667e-01 401 162 -4.16666666666667e-02 402 402 1.11111111111111e+00 402 257 -1.30781887056064e-17 402 313 4.16666666666667e-02 402 256 8.33333333333333e-02 402 312 -6.94444444444444e-02 402 255 -9.72222222222220e-02 402 413 4.05220561966457e-18 402 338 -4.16666666666667e-02 402 323 -1.38777878078145e-17 402 260 9.94077866897647e-18 402 412 -6.77626357803440e-19 402 337 -4.16666666666667e-02 402 322 1.71388646547435e-17 402 259 -8.33333333333334e-02 402 411 -2.77777777777778e-02 402 336 -6.94444444444444e-02 402 321 1.11111111111111e-01 402 258 -9.72222222222222e-02 402 410 -1.66666666666667e-01 402 335 -4.16666666666667e-02 402 320 -1.29490161811501e-17 402 248 7.13371148177572e-18 402 409 8.02817827407626e-18 402 334 4.16666666666667e-02 402 319 1.75761454137635e-17 402 247 8.33333333333334e-02 402 408 -1.94444444444444e-01 402 333 -6.94444444444444e-02 402 318 -2.22222222222222e-01 402 246 -9.72222222222222e-02 402 395 1.66666666666667e-01 402 452 4.08507049801804e-17 402 407 4.06575814682064e-18 402 311 4.16666666666667e-02 402 296 -6.97125056249234e-17 402 404 5.55111512312578e-17 402 317 -6.93889390390723e-18 402 245 -1.18449087344041e-17 402 394 -1.48942273445196e-17 402 451 -2.08166817117217e-17 402 406 1.91260039490021e-18 402 310 -4.16666666666667e-02 402 295 -9.08544479883908e-17 402 403 9.71445146547012e-17 402 316 1.89038695585847e-17 402 244 -8.33333333333334e-02 402 393 -1.94444444444444e-01 402 450 2.22222222222222e-01 402 405 -2.77777777777778e-02 402 309 -6.94444444444444e-02 402 294 -2.22222222222222e-01 402 314 4.16666666666667e-02 402 315 1.11111111111111e-01 402 243 -9.72222222222221e-02 403 403 1.11111111111111e+00 403 257 1.34830704543940e-17 403 313 -6.94444444444444e-02 403 256 -9.72222222222221e-02 403 312 4.16666666666667e-02 403 255 8.33333333333333e-02 403 413 -1.66666666666667e-01 403 338 -4.16666666666667e-02 403 323 1.42731404359454e-17 403 260 4.37238407372670e-18 403 412 -1.94444444444445e-01 403 337 -6.94444444444444e-02 403 322 -2.22222222222222e-01 403 259 -9.72222222222221e-02 403 411 1.11300129269215e-18 403 336 -4.16666666666667e-02 403 321 2.32421605561844e-17 403 258 -8.33333333333334e-02 403 410 4.35036121709809e-18 403 335 4.16666666666667e-02 403 320 -3.46944695195361e-17 403 248 3.22550146314438e-18 403 409 -2.77777777777778e-02 403 334 -6.94444444444444e-02 403 319 1.11111111111111e-01 403 247 -9.72222222222222e-02 403 408 8.66006485272797e-18 403 333 4.16666666666667e-02 403 318 1.52872506320456e-17 403 246 8.33333333333334e-02 403 395 5.53349683782289e-17 403 452 -3.03458023683326e-17 403 407 1.66666666666667e-01 403 311 4.16666666666667e-02 403 296 -6.93889390390723e-18 403 404 -8.32667268468867e-17 403 317 5.47691503694631e-18 403 245 -3.29326409892472e-17 403 394 -2.77777777777776e-02 403 451 2.22222222222222e-01 403 406 -1.94444444444445e-01 403 310 -6.94444444444445e-02 403 295 1.11111111111111e-01 403 314 -4.16666666666667e-02 403 316 -2.22222222222222e-01 403 244 -9.72222222222224e-02 403 393 -1.63985578588433e-17 403 450 -1.38777878078145e-17 403 405 1.93801138331784e-18 403 309 -4.16666666666667e-02 403 294 -9.13546209437444e-17 403 402 9.71445146547012e-17 403 315 1.66933253244878e-17 403 243 -8.33333333333334e-02 404 404 1.11111111111111e+00 404 257 -1.38888888888888e-02 404 313 -4.16666666666667e-02 404 256 1.33763443030399e-17 404 312 4.16666666666667e-02 404 255 -1.34034493573520e-17 404 413 -1.94444444444445e-01 404 338 -6.94444444444444e-02 404 323 1.11111111111111e-01 404 260 -1.38888888888889e-02 404 412 -1.66666666666667e-01 404 337 -4.16666666666667e-02 404 322 1.32272665043232e-17 404 259 4.25549352700560e-18 404 411 1.83297929785831e-18 404 336 -4.16666666666667e-02 404 321 -6.93889390390723e-18 404 258 1.05167610731094e-17 404 410 -1.94444444444444e-01 404 335 -6.94444444444444e-02 404 320 1.11111111111111e-01 404 248 -1.38888888888889e-02 404 409 -4.81114714040443e-19 404 334 4.16666666666667e-02 404 319 -3.46944695195361e-17 404 247 2.43098455861984e-18 404 408 -1.66666666666667e-01 404 333 -4.16666666666667e-02 404 318 -7.86724201409794e-18 404 246 7.68428289749101e-18 404 395 -1.94444444444444e-01 404 452 -4.44444444444445e-01 404 407 -1.94444444444445e-01 404 311 -6.94444444444445e-02 404 296 1.11111111111111e-01 404 314 -6.94444444444444e-02 404 317 1.11111111111111e-01 404 245 -1.38888888888889e-02 404 394 5.30700022772709e-17 404 451 -3.57034975179528e-17 404 406 1.66666666666667e-01 404 310 4.16666666666667e-02 404 295 -6.93889390390723e-18 404 403 -8.32667268468867e-17 404 316 9.06897000801498e-18 404 244 -3.32595957068874e-17 404 393 1.66666666666667e-01 404 450 3.34018972420261e-17 404 405 1.76521666207796e-18 404 309 4.16666666666667e-02 404 294 -6.93114355243985e-17 404 402 5.55111512312578e-17 404 315 -6.93889390390723e-18 404 243 -1.15891047843333e-17 405 405 1.11111111111111e+00 405 272 -8.33333333333333e-02 405 328 -4.16666666666667e-02 405 271 4.32833836046947e-18 405 327 -6.94444444444444e-02 405 270 -9.72222222222222e-02 405 305 4.16666666666667e-02 405 416 4.05220561966457e-18 405 326 3.00086832553254e-17 405 269 8.33333333333333e-02 405 304 4.16666666666667e-02 405 415 -6.77626357803440e-19 405 325 -2.77555756156289e-17 405 268 -8.28059409235804e-18 405 303 -6.94444444444444e-02 405 414 -2.77777777777778e-02 405 324 1.11111111111111e-01 405 267 -9.72222222222220e-02 405 410 1.42233772502942e-17 405 335 1.48590754772086e-17 405 320 4.16666666666667e-02 405 248 8.33333333333334e-02 405 409 -1.66666666666667e-01 405 334 1.80945295774832e-17 405 319 -4.16666666666667e-02 405 247 4.12335638723393e-18 405 408 -1.94444444444444e-01 405 333 -2.22222222222222e-01 405 318 -6.94444444444444e-02 405 246 -9.72222222222222e-02 405 395 -2.59801945581839e-17 405 452 6.93889390390723e-18 405 407 1.38777878078145e-16 405 311 -1.44549560580735e-16 405 296 -4.16666666666667e-02 405 404 1.74997006902738e-18 405 317 2.89958436086460e-17 405 245 -8.33333333333334e-02 405 394 1.66666666666667e-01 405 451 3.45945196317601e-17 405 406 6.93889390390723e-17 405 310 -8.76018414709342e-17 405 295 4.16666666666667e-02 405 403 1.73472347597681e-18 405 316 -2.77555756156289e-17 405 244 -7.06086664831185e-18 405 393 -1.94444444444444e-01 405 450 2.22222222222222e-01 405 329 -4.16666666666667e-02 405 309 -2.22222222222222e-01 405 294 -6.94444444444444e-02 405 402 -2.77777777777778e-02 405 315 1.11111111111111e-01 405 243 -9.72222222222222e-02 406 406 1.11111111111111e+00 406 272 2.08708918203460e-18 406 328 -6.94444444444444e-02 406 271 -1.38888888888889e-02 406 327 -4.16666666666667e-02 406 270 3.56431464204610e-18 406 305 -4.16666666666667e-02 406 416 -1.66666666666667e-01 406 326 -1.99239089853157e-17 406 269 2.75793927626000e-17 406 304 -6.94444444444444e-02 406 415 -1.94444444444445e-01 406 325 1.11111111111111e-01 406 268 -1.38888888888888e-02 406 303 4.16666666666667e-02 406 414 1.11300129269215e-18 406 324 -2.08166817117217e-17 406 267 -8.22638398373376e-18 406 410 1.44673227391034e-17 406 335 -2.08166817117217e-17 406 320 4.16666666666667e-02 406 248 -1.31578098026483e-17 406 409 -1.94444444444444e-01 406 334 1.11111111111111e-01 406 319 -6.94444444444444e-02 406 247 -1.38888888888889e-02 406 408 -1.66666666666667e-01 406 333 1.27664805810168e-17 406 318 -4.16666666666667e-02 406 246 3.68628738645072e-18 406 395 3.71847463844638e-17 406 452 4.10476401404170e-17 406 407 -2.77555756156289e-17 406 311 3.46944695195361e-17 406 296 4.16666666666667e-02 406 404 1.66666666666667e-01 406 317 -2.02349818351948e-17 406 245 -2.04253524900902e-17 406 394 -1.94444444444444e-01 406 451 -4.44444444444445e-01 406 329 -4.16666666666667e-02 406 310 1.11111111111111e-01 406 295 -6.94444444444444e-02 406 403 -1.94444444444445e-01 406 316 1.11111111111111e-01 406 244 -1.38888888888889e-02 406 393 1.66666666666667e-01 406 450 4.37350639238181e-17 406 405 6.93889390390723e-17 406 309 -8.95809339521939e-17 406 294 4.16666666666667e-02 406 402 1.05879118406788e-18 406 315 -2.08166817117217e-17 406 243 -7.55045169182483e-18 407 407 1.11111111111111e+00 407 272 -9.72222222222222e-02 407 328 -4.16666666666667e-02 407 271 -1.86177841806495e-18 407 327 -4.16666666666667e-02 407 270 -8.33333333333333e-02 407 305 -6.94444444444444e-02 407 416 -1.94444444444445e-01 407 326 -2.22222222222222e-01 407 269 -9.72222222222220e-02 407 304 -4.16666666666667e-02 407 415 -1.66666666666667e-01 407 325 -2.37042170289116e-17 407 268 2.57904591779989e-17 407 303 4.16666666666667e-02 407 414 1.83297929785831e-18 407 324 2.55280907225869e-17 407 267 8.33333333333333e-02 407 410 -2.77777777777778e-02 407 335 1.11111111111111e-01 407 320 -6.94444444444445e-02 407 248 -9.72222222222222e-02 407 409 1.43250212039647e-17 407 334 -1.38777878078145e-17 407 319 4.16666666666667e-02 407 247 -1.08962318334793e-17 407 408 1.55040910665427e-17 407 333 1.71642756431611e-17 407 318 4.16666666666667e-02 407 246 8.33333333333334e-02 407 395 -2.77777777777776e-02 407 452 2.22222222222222e-01 407 329 -6.94444444444444e-02 407 311 1.11111111111111e-01 407 296 -6.94444444444445e-02 407 404 -1.94444444444445e-01 407 317 -2.22222222222222e-01 407 245 -9.72222222222225e-02 407 394 3.41930260147616e-17 407 451 3.62801151967962e-17 407 406 -2.77555756156289e-17 407 310 2.77555756156289e-17 407 295 4.16666666666667e-02 407 403 1.66666666666667e-01 407 316 -1.98680048107969e-17 407 244 -2.01390553539182e-17 407 393 -2.47198095326695e-17 407 450 0.00000000000000e+00 407 405 1.24900090270330e-16 407 309 -1.47372297877460e-16 407 294 -4.16666666666667e-02 407 402 3.63207727782644e-18 407 315 2.96156599677994e-17 407 243 -8.33333333333334e-02 408 408 2.22222222222222e+00 408 355 -4.16666666666667e-02 408 354 -6.94444444444444e-02 408 431 -1.66666666666667e-01 408 350 -4.16666666666667e-02 408 430 6.25787941431477e-18 408 349 4.16666666666667e-02 408 429 -1.94444444444445e-01 408 348 -6.94444444444444e-02 408 428 -2.80435668176954e-17 408 347 4.16666666666667e-02 408 427 -1.66666666666667e-01 408 346 -4.16666666666667e-02 408 426 -1.94444444444445e-01 408 345 -6.94444444444444e-02 408 455 -1.49663098483310e-16 408 422 -3.29648282412429e-17 408 419 1.66666666666667e-01 408 341 4.16666666666667e-02 408 454 4.87170999613311e-17 408 421 1.66666666666667e-01 408 418 6.33750051135668e-18 408 340 4.16666666666667e-02 408 453 -4.44444444444445e-01 408 420 -1.94444444444445e-01 408 417 -1.94444444444444e-01 408 339 -6.94444444444444e-02 408 332 4.16666666666667e-02 408 284 1.51788304147971e-18 408 331 4.16666666666667e-02 408 283 -3.68628738645072e-18 408 330 -6.94444444444445e-02 408 282 -2.77777777777777e-02 408 416 1.66666666666667e-01 408 329 3.50569996209610e-17 408 272 1.53143556863578e-18 408 326 4.16666666666667e-02 408 415 6.07153216591882e-18 408 328 -2.08166817117217e-17 408 271 -3.93700913883799e-18 408 325 -4.16666666666667e-02 408 414 -1.94444444444444e-01 408 327 2.22222222222222e-01 408 270 -2.77777777777777e-02 408 324 -6.94444444444444e-02 408 413 1.16009632455949e-17 408 338 -6.93889390390723e-18 408 323 -4.16666666666667e-02 408 260 1.22650370762423e-18 408 412 1.66666666666667e-01 408 337 -1.93970544921235e-17 408 322 4.16666666666667e-02 408 259 -4.54009659728305e-18 408 411 -1.94444444444445e-01 408 336 2.22222222222222e-01 408 321 -6.94444444444444e-02 408 258 -2.77777777777777e-02 408 452 -2.55668424799238e-17 408 410 1.38777878078145e-16 408 335 -6.93889390390723e-18 408 407 1.46367293285543e-17 408 404 -1.66666666666667e-01 408 320 3.29415348351934e-17 408 248 1.27054942088145e-18 408 317 -4.16666666666667e-02 408 451 3.36780299828310e-17 408 409 -6.93889390390723e-17 408 334 -2.25645341983809e-17 408 406 -1.66666666666667e-01 408 403 8.66006485272797e-18 408 319 -2.08166817117217e-17 408 247 -4.09625133292180e-18 408 316 -4.16666666666667e-02 408 450 -4.44444444444445e-01 408 356 -4.16666666666667e-02 408 333 2.22222222222222e-01 408 405 -1.94444444444444e-01 408 402 -1.94444444444444e-01 408 318 2.22222222222222e-01 408 246 -2.77777777777777e-02 408 315 -6.94444444444444e-02 409 409 2.22222222222222e+00 409 355 -6.94444444444444e-02 409 354 -4.16666666666667e-02 409 431 1.91226158172131e-17 409 350 4.16666666666667e-02 409 430 -2.77777777777778e-02 409 349 -6.94444444444444e-02 409 429 6.19350491032344e-18 409 348 4.16666666666667e-02 409 428 -7.09051280146575e-17 409 347 4.16666666666666e-02 409 427 -1.94444444444444e-01 409 346 -6.94444444444444e-02 409 426 -1.66666666666667e-01 409 345 -4.16666666666667e-02 409 455 6.24500451351651e-17 409 422 3.40710532703570e-17 409 419 -9.44102923009643e-18 409 341 -4.16666666666667e-02 409 454 2.22222222222222e-01 409 421 -1.94444444444445e-01 409 418 -2.77777777777777e-02 409 340 -6.94444444444444e-02 409 453 5.31292945835787e-17 409 420 1.66666666666667e-01 409 417 5.88179678573386e-18 409 339 4.16666666666667e-02 409 332 -4.16666666666667e-02 409 284 -1.66666666666667e-01 409 331 -6.94444444444445e-02 409 283 -1.94444444444444e-01 409 330 4.16666666666667e-02 409 282 -4.20636561606486e-18 409 416 -1.65882932390282e-17 409 329 -1.71964628951568e-17 409 272 1.66666666666667e-01 409 326 4.16666666666667e-02 409 415 -2.77777777777778e-02 409 328 2.22222222222222e-01 409 271 -1.94444444444444e-01 409 325 -6.94444444444444e-02 409 414 6.96938709000838e-18 409 327 -1.38777878078145e-17 409 270 -3.68628738645072e-18 409 324 -4.16666666666667e-02 409 413 1.17517351102062e-17 409 338 1.79045824390614e-17 409 323 4.16666666666667e-02 409 260 1.66666666666667e-01 409 412 -1.94444444444444e-01 409 337 -4.44444444444444e-01 409 322 -6.94444444444444e-02 409 259 -1.94444444444444e-01 409 411 1.66666666666667e-01 409 336 -2.53294614964558e-17 409 321 4.16666666666667e-02 409 258 -4.16570803459665e-18 409 452 -4.85722573273506e-17 409 410 6.93889390390723e-17 409 335 1.39370801141223e-17 409 407 1.43792313125890e-17 409 404 -3.59141969635823e-19 409 320 -1.24378317974821e-17 409 248 -1.66666666666667e-01 409 317 -4.16666666666667e-02 409 451 2.22222222222222e-01 409 356 -4.16666666666667e-02 409 334 -4.44444444444444e-01 409 406 -1.94444444444444e-01 409 403 -2.77777777777778e-02 409 319 2.22222222222222e-01 409 247 -1.94444444444444e-01 409 316 -6.94444444444444e-02 409 450 3.52789222531416e-17 409 408 -6.93889390390723e-17 409 333 -1.93970544921235e-17 409 405 -1.66666666666667e-01 409 402 7.03714972578873e-18 409 318 -6.93889390390723e-18 409 246 -4.10641572828885e-18 409 315 -4.16666666666667e-02 410 410 2.22222222222222e+00 410 355 -4.16666666666667e-02 410 354 -4.16666666666667e-02 410 431 -1.94444444444445e-01 410 350 -6.94444444444445e-02 410 430 1.49094739375702e-17 410 349 4.16666666666667e-02 410 429 -1.66666666666667e-01 410 348 -4.16666666666667e-02 410 428 -2.77777777777778e-02 410 347 -6.94444444444444e-02 410 427 -6.98361724352226e-17 410 346 4.16666666666666e-02 410 426 -2.91785909670161e-17 410 345 4.16666666666667e-02 410 455 2.22222222222222e-01 410 422 -2.77777777777778e-02 410 419 -1.94444444444444e-01 410 341 -6.94444444444444e-02 410 454 6.24500451351651e-17 410 421 3.38457425063873e-17 410 418 -1.02321580028319e-17 410 340 -4.16666666666667e-02 410 453 -1.49115068166436e-16 410 420 -3.30275086793397e-17 410 417 1.66666666666667e-01 410 339 4.16666666666667e-02 410 332 -6.94444444444445e-02 410 284 -1.94444444444444e-01 410 331 -4.16666666666667e-02 410 283 -1.66666666666667e-01 410 330 4.16666666666667e-02 410 282 2.90871114087127e-18 410 416 -1.94444444444444e-01 410 329 -4.44444444444445e-01 410 272 -1.94444444444444e-01 410 326 -6.94444444444445e-02 410 415 -1.97307854733417e-17 410 328 -1.57903882027147e-17 410 271 1.66666666666667e-01 410 325 4.16666666666667e-02 410 414 1.66666666666667e-01 410 327 3.91229695260184e-17 410 270 4.68409219831628e-18 410 324 4.16666666666667e-02 410 413 -2.77777777777778e-02 410 338 2.22222222222222e-01 410 323 -6.94444444444444e-02 410 260 -1.94444444444444e-01 410 412 1.16280682999070e-17 410 337 1.72811661898822e-17 410 322 4.16666666666667e-02 410 259 1.66666666666667e-01 410 411 1.11317069928160e-17 410 336 -6.93889390390723e-18 410 321 -4.16666666666667e-02 410 258 2.81892564846231e-18 410 452 2.22222222222222e-01 410 356 -6.94444444444445e-02 410 335 2.22222222222222e-01 410 407 -2.77777777777778e-02 410 404 -1.94444444444444e-01 410 320 -4.44444444444445e-01 410 248 -1.94444444444444e-01 410 317 -6.94444444444444e-02 410 451 -5.55111512312578e-17 410 409 6.93889390390723e-17 410 334 1.03880120651267e-17 410 406 1.28410194803752e-17 410 403 4.51299154297091e-18 410 319 -2.23836926641421e-17 410 247 -1.66666666666667e-01 410 316 -4.16666666666667e-02 410 450 -2.55545605021886e-17 410 408 1.38777878078145e-16 410 333 -6.93889390390723e-18 410 405 1.42098247231381e-17 410 402 -1.66666666666667e-01 410 318 3.27937275858975e-17 410 246 1.20617491689012e-18 410 315 -4.16666666666667e-02 411 411 1.11111111111111e+00 411 305 4.16666666666667e-02 411 280 -7.48099499014998e-18 411 304 -4.16666666666667e-02 411 279 -9.72222222222221e-02 411 303 -6.94444444444444e-02 411 332 1.08420217248550e-17 411 284 -8.33333333333334e-02 411 329 -4.16666666666667e-02 411 416 4.06575814682064e-18 411 331 6.93889390390723e-18 411 283 3.72694496791892e-18 411 328 4.16666666666667e-02 411 415 1.93801138331784e-18 411 330 1.11111111111111e-01 411 282 -9.72222222222222e-02 411 327 -6.94444444444444e-02 411 414 -2.77777777777779e-02 411 314 4.66206934168767e-18 411 395 -1.96511643762998e-17 411 257 -8.33333333333334e-02 411 296 -4.16666666666667e-02 411 313 -9.06257490926321e-17 411 394 -1.66666666666667e-01 411 256 -8.23993651088983e-18 411 295 -4.16666666666667e-02 411 312 -2.22222222222222e-01 411 393 -1.94444444444444e-01 411 255 -9.72222222222221e-02 411 294 -6.94444444444444e-02 411 413 0.00000000000000e+00 411 338 -3.97902197302180e-17 411 410 1.20126212579605e-17 411 452 1.38777878078145e-17 411 323 1.13299127024735e-17 411 260 8.33333333333334e-02 411 320 4.16666666666667e-02 411 404 1.94139951510686e-18 411 412 8.32667268468867e-17 411 337 1.50026475617682e-17 411 409 1.66666666666667e-01 411 451 3.94255720464250e-17 411 322 6.93889390390723e-18 411 259 3.06287113727155e-18 411 319 4.16666666666667e-02 411 403 2.08878324792910e-18 411 281 8.33333333333333e-02 411 336 -2.22222222222222e-01 411 408 -1.94444444444445e-01 411 450 2.22222222222222e-01 411 321 1.11111111111111e-01 411 258 -9.72222222222222e-02 411 318 -6.94444444444445e-02 411 402 -2.77777777777778e-02 412 412 1.11111111111111e+00 412 305 4.16666666666667e-02 412 280 -1.38888888888888e-02 412 304 -6.94444444444445e-02 412 279 -8.82269517860079e-18 412 303 -4.16666666666667e-02 412 332 -2.42996811908314e-17 412 284 5.42101086242752e-19 412 329 4.16666666666667e-02 412 416 1.66666666666667e-01 412 331 1.11111111111111e-01 412 283 -1.38888888888889e-02 412 328 -6.94444444444444e-02 412 415 -1.94444444444445e-01 412 330 6.93889390390723e-18 412 282 5.09575021068187e-18 412 327 4.16666666666667e-02 412 414 1.93801138331784e-18 412 314 -6.93889390390723e-18 412 395 -5.51723380523561e-17 412 257 -2.96258243631664e-17 412 296 -4.16666666666668e-02 412 313 1.11111111111112e-01 412 394 -1.94444444444445e-01 412 256 -1.38888888888888e-02 412 295 -6.94444444444445e-02 412 312 -9.27873771740251e-17 412 393 -1.66666666666667e-01 412 255 -8.05020113070487e-18 412 294 -4.16666666666667e-02 412 413 -6.93889390390723e-17 412 338 -3.46944695195361e-17 412 410 1.16822784085313e-17 412 452 4.41422750132106e-17 412 323 -1.87736382429443e-17 412 260 -6.46455545344482e-18 412 320 -4.16666666666667e-02 412 404 -1.66666666666667e-01 412 281 2.77555756156289e-17 412 337 1.11111111111111e-01 412 409 -1.94444444444444e-01 412 451 -4.44444444444445e-01 412 322 1.11111111111111e-01 412 259 -1.38888888888889e-02 412 319 -6.94444444444445e-02 412 403 -1.94444444444445e-01 412 411 1.11022302462516e-16 412 336 1.56667213924155e-17 412 408 1.66666666666667e-01 412 450 3.49079218222442e-17 412 321 1.38777878078145e-17 412 258 4.87890977618477e-18 412 318 4.16666666666667e-02 412 402 -1.42301535138722e-18 413 413 1.11111111111111e+00 413 305 -6.94444444444445e-02 413 280 2.74167624367272e-17 413 304 4.16666666666667e-02 413 279 8.33333333333333e-02 413 303 4.16666666666667e-02 413 332 -2.22222222222222e-01 413 284 -9.72222222222222e-02 413 329 -6.94444444444444e-02 413 416 -1.94444444444445e-01 413 331 -1.88278483515686e-17 413 283 -3.25260651745651e-19 413 328 4.16666666666667e-02 413 415 1.66666666666667e-01 413 330 7.87401827767598e-18 413 282 -8.33333333333334e-02 413 327 -4.16666666666667e-02 413 414 1.76352259618345e-18 413 314 1.11111111111111e-01 413 395 -2.77777777777778e-02 413 257 -9.72222222222222e-02 413 296 -6.94444444444445e-02 413 313 0.00000000000000e+00 413 394 -5.33478290839703e-17 413 256 -2.87313575708659e-17 413 295 -4.16666666666668e-02 413 312 7.95533344061239e-18 413 393 -2.00729867840324e-17 413 255 -8.33333333333334e-02 413 294 -4.16666666666667e-02 413 281 -9.72222222222223e-02 413 338 1.11111111111111e-01 413 410 -2.77777777777778e-02 413 452 2.22222222222222e-01 413 323 -2.22222222222222e-01 413 260 -9.72222222222222e-02 413 320 -6.94444444444445e-02 413 404 -1.94444444444445e-01 413 412 -6.93889390390723e-17 413 337 -3.46944695195361e-17 413 409 1.27292111313376e-17 413 451 4.81506466778548e-17 413 322 -1.82145964977565e-17 413 259 -5.85469173142172e-18 413 319 -4.16666666666667e-02 413 403 -1.66666666666667e-01 413 411 -2.77555756156289e-17 413 336 -3.75133951679985e-17 413 408 1.24547724564272e-17 413 450 6.93889390390723e-18 413 321 3.90312782094782e-18 413 258 8.33333333333333e-02 413 318 4.16666666666667e-02 413 402 3.51010453342182e-18 414 414 1.11111111111111e+00 414 314 -4.16666666666667e-02 414 280 8.33333333333333e-02 414 313 4.16666666666667e-02 414 279 -9.72222222222221e-02 414 312 -6.94444444444444e-02 414 332 2.08166817117217e-17 414 284 8.61940727125976e-18 414 413 1.74997006902738e-18 414 338 4.16666666666667e-02 414 331 1.74556549770166e-17 414 283 -8.33333333333333e-02 414 412 2.16840434497101e-18 414 337 -4.16666666666667e-02 414 330 1.11111111111111e-01 414 282 -9.72222222222223e-02 414 411 -2.77777777777779e-02 414 336 -6.94444444444444e-02 414 329 -1.28765948641599e-17 414 272 6.88468379528295e-18 414 410 1.66666666666667e-01 414 335 4.16666666666667e-02 414 328 1.55854062294791e-17 414 271 8.33333333333334e-02 414 409 6.53570622101418e-18 414 334 4.16666666666667e-02 414 327 -2.22222222222222e-01 414 270 -9.72222222222223e-02 414 408 -1.94444444444444e-01 414 333 -6.94444444444445e-02 414 305 -7.01749856141243e-17 414 416 8.32667268468867e-17 414 326 2.08166817117217e-17 414 269 -1.21430643318376e-17 414 395 -1.66666666666667e-01 414 452 3.68563093591659e-17 414 407 1.94139951510686e-18 414 311 -4.16666666666667e-02 414 304 -8.72782748850831e-17 414 415 5.55111512312578e-17 414 325 2.04643160056639e-17 414 268 -8.33333333333334e-02 414 394 -1.53008031592017e-17 414 451 -2.08166817117217e-17 414 406 2.30562368242621e-18 414 310 -4.16666666666667e-02 414 303 -2.22222222222222e-01 414 281 -1.37693675905659e-17 414 324 1.11111111111111e-01 414 267 -9.72222222222222e-02 414 393 -1.94444444444444e-01 414 450 2.22222222222222e-01 414 405 -2.77777777777778e-02 414 309 -6.94444444444444e-02 415 415 1.11111111111111e+00 415 314 4.16666666666667e-02 415 280 -9.72222222222222e-02 415 313 -6.94444444444444e-02 415 279 8.33333333333333e-02 415 312 4.16666666666667e-02 415 332 3.39439983282688e-17 415 284 1.09639944692597e-17 415 413 1.66666666666667e-01 415 338 4.16666666666667e-02 415 331 -2.22222222222222e-01 415 283 -9.72222222222222e-02 415 412 -1.94444444444445e-01 415 337 -6.94444444444444e-02 415 330 2.04643160056639e-17 415 282 -8.33333333333334e-02 415 411 1.07064964532944e-18 415 336 -4.16666666666667e-02 415 329 -2.08166817117217e-17 415 272 8.45677694538693e-18 415 410 -1.96088127289371e-17 415 335 -4.16666666666667e-02 415 328 1.11111111111111e-01 415 271 -9.72222222222223e-02 415 409 -2.77777777777778e-02 415 334 -6.94444444444445e-02 415 327 1.32272665043232e-17 415 270 8.33333333333333e-02 415 408 8.34835672813838e-18 415 333 4.16666666666667e-02 415 305 3.46944695195361e-17 415 416 1.38777878078145e-17 415 326 3.37864502000795e-17 415 269 -2.39608680119296e-17 415 395 -4.83029008501237e-17 415 452 -3.19596118910888e-17 415 407 -1.66666666666667e-01 415 311 -4.16666666666668e-02 415 304 1.11111111111111e-01 415 281 2.37033699959643e-17 415 325 -2.22222222222222e-01 415 268 -9.72222222222224e-02 415 394 -2.77777777777777e-02 415 451 2.22222222222222e-01 415 406 -1.94444444444445e-01 415 310 -6.94444444444445e-02 415 303 -9.09239046900656e-17 415 414 8.32667268468867e-17 415 324 1.82145964977565e-17 415 267 -8.33333333333334e-02 415 393 -1.55735477682176e-17 415 450 -6.93889390390723e-18 415 405 -1.20617491689012e-18 415 309 -4.16666666666667e-02 416 416 1.11111111111111e+00 416 314 -6.94444444444445e-02 416 280 2.08166817117217e-17 416 313 4.16666666666667e-02 416 279 -1.39184453892827e-17 416 312 -4.16666666666667e-02 416 332 1.11111111111111e-01 416 284 -1.38888888888889e-02 416 413 -1.94444444444445e-01 416 338 -6.94444444444445e-02 416 331 3.20517267241027e-17 416 283 1.00830802041152e-17 416 412 1.66666666666667e-01 416 337 4.16666666666667e-02 416 330 1.38777878078145e-17 416 282 8.45677694538693e-18 416 411 3.63207727782644e-18 416 336 4.16666666666667e-02 416 329 1.11111111111111e-01 416 272 -1.38888888888889e-02 416 410 -1.94444444444444e-01 416 335 -6.94444444444445e-02 416 328 -1.38777878078145e-17 416 271 1.02863681114562e-17 416 409 -1.66425033476525e-17 416 334 -4.16666666666667e-02 416 327 -1.33627917758838e-17 416 270 5.74627151417317e-18 416 408 1.66666666666667e-01 416 333 4.16666666666667e-02 416 305 1.11111111111111e-01 416 281 -1.38888888888888e-02 416 326 1.11111111111111e-01 416 269 -1.38888888888889e-02 416 395 -1.94444444444445e-01 416 452 -4.44444444444445e-01 416 407 -1.94444444444445e-01 416 311 -6.94444444444445e-02 416 304 3.46944695195361e-17 416 415 1.38777878078145e-17 416 325 3.06371817021880e-17 416 268 -2.27004829864152e-17 416 394 -4.71356894488073e-17 416 451 -2.76742604526925e-17 416 406 -1.66666666666667e-01 416 310 -4.16666666666668e-02 416 303 -7.05375157155491e-17 416 414 5.55111512312578e-17 416 324 1.38777878078145e-17 416 267 -1.24005623478030e-17 416 393 -1.66666666666667e-01 416 450 3.35187877887472e-17 416 405 3.51010453342182e-18 416 309 -4.16666666666667e-02 417 417 1.11111111111111e+00 417 260 -1.72117094882074e-17 417 337 4.16666666666667e-02 417 259 8.33333333333334e-02 417 336 -6.94444444444444e-02 417 258 -9.72222222222223e-02 417 428 3.21194893598831e-18 417 362 -4.16666666666667e-02 417 347 2.08166817117217e-17 417 263 5.61074624261249e-18 417 427 -5.67850887839283e-18 417 361 -4.16666666666667e-02 417 346 -2.32375018749745e-17 417 262 -8.33333333333334e-02 417 426 -2.77777777777778e-02 417 360 -6.94444444444444e-02 417 345 1.11111111111111e-01 417 261 -9.72222222222221e-02 417 425 -1.66666666666667e-01 417 359 -4.16666666666667e-02 417 344 9.97444822862983e-17 417 251 3.88788122789724e-18 417 424 1.70897367438028e-17 417 358 4.16666666666667e-02 417 343 7.95071711104985e-17 417 250 8.33333333333334e-02 417 423 -1.94444444444444e-01 417 357 -6.94444444444445e-02 417 342 -2.22222222222222e-01 417 249 -9.72222222222221e-02 417 410 1.66666666666667e-01 417 455 -1.60021464395282e-17 417 422 8.21283145657770e-18 417 335 4.16666666666667e-02 417 320 -7.30311807122658e-17 417 419 -2.77555756156289e-17 417 341 2.08166817117217e-17 417 248 -1.61681648971901e-17 417 409 6.09863722023096e-18 417 454 -1.38777878078145e-17 417 421 -4.21483594553740e-18 417 334 -4.16666666666667e-02 417 319 2.16874315814991e-17 417 418 -1.11022302462516e-16 417 340 -2.55827243476848e-17 417 247 -8.33333333333334e-02 417 408 -1.94444444444444e-01 417 453 2.22222222222222e-01 417 420 -2.77777777777778e-02 417 333 -6.94444444444444e-02 417 318 -2.22222222222223e-01 417 338 4.16666666666667e-02 417 339 1.11111111111111e-01 417 246 -9.72222222222222e-02 418 418 1.11111111111111e+00 418 260 1.70304444374950e-17 418 337 -6.94444444444444e-02 418 259 -9.72222222222222e-02 418 336 4.16666666666667e-02 418 258 8.33333333333334e-02 418 428 -1.66666666666667e-01 418 362 -4.16666666666667e-02 418 347 9.90266218635003e-18 418 263 3.52450409352514e-17 418 427 -1.94444444444445e-01 418 361 -6.94444444444444e-02 418 346 -2.22222222222222e-01 418 262 -9.72222222222221e-02 418 426 -5.42101086242752e-18 418 360 -4.16666666666667e-02 418 345 -2.55795479741326e-17 418 261 -8.33333333333334e-02 418 425 3.73914224235938e-17 418 359 4.16666666666667e-02 418 344 -5.55111512312578e-17 418 251 -1.71439468524270e-17 418 424 -2.77777777777777e-02 418 358 -6.94444444444445e-02 418 343 1.11111111111111e-01 418 250 -9.72222222222223e-02 418 423 1.52465930505774e-17 418 357 4.16666666666667e-02 418 342 7.77728711509953e-17 418 249 8.33333333333334e-02 418 410 -1.03541307472366e-17 418 455 -1.04811856893247e-17 418 422 1.66666666666667e-01 418 335 4.16666666666666e-02 418 320 0.00000000000000e+00 418 419 1.38777878078145e-17 418 341 7.81642003726268e-18 418 248 -3.80012861456169e-17 418 409 -2.77777777777777e-02 418 454 2.22222222222222e-01 418 421 -1.94444444444445e-01 418 334 -6.94444444444444e-02 418 319 1.11111111111111e-01 418 338 -4.16666666666667e-02 418 340 -2.22222222222222e-01 418 247 -9.72222222222221e-02 418 408 6.33750051135668e-18 418 453 -6.93889390390723e-18 418 420 -4.79759461324836e-18 418 333 -4.16666666666667e-02 418 318 2.36972290070967e-17 418 417 -1.11022302462516e-16 418 339 -2.44843343733328e-17 418 246 -8.33333333333334e-02 419 419 1.11111111111111e+00 419 260 -1.38888888888889e-02 419 337 -4.16666666666667e-02 419 259 1.52194879962653e-17 419 336 4.16666666666667e-02 419 258 -1.69050835613013e-17 419 428 -1.94444444444444e-01 419 362 -6.94444444444445e-02 419 347 1.11111111111111e-01 419 263 -1.38888888888888e-02 419 427 -1.66666666666667e-01 419 361 -4.16666666666667e-02 419 346 9.55114351323949e-18 419 262 3.70661617718482e-17 419 426 4.64851681453160e-18 419 360 -4.16666666666667e-02 419 345 2.08166817117217e-17 419 261 4.90601483049691e-18 419 425 -1.94444444444444e-01 419 359 -6.94444444444445e-02 419 344 1.11111111111111e-01 419 251 -1.38888888888889e-02 419 424 3.50010954464422e-17 419 358 4.16666666666667e-02 419 343 -5.55111512312578e-17 419 250 -1.52093236008982e-17 419 423 -1.66666666666667e-01 419 357 -4.16666666666667e-02 419 342 1.01051030607438e-16 419 249 3.30681662608079e-18 419 410 -1.94444444444444e-01 419 455 -4.44444444444445e-01 419 422 -1.94444444444445e-01 419 335 -6.94444444444444e-02 419 320 1.11111111111111e-01 419 338 -6.94444444444444e-02 419 341 1.11111111111111e-01 419 248 -1.38888888888889e-02 419 409 -9.44102923009643e-18 419 454 -1.53797889815331e-17 419 421 1.66666666666667e-01 419 334 4.16666666666666e-02 419 319 1.38777878078145e-17 419 418 1.38777878078145e-17 419 340 6.63671489997426e-18 419 247 -3.78352676879551e-17 419 408 1.66666666666667e-01 419 453 -1.42091894484277e-17 419 420 2.72236389247532e-18 419 333 4.16666666666667e-02 419 318 -7.17413612918343e-17 419 417 -2.77555756156289e-17 419 339 2.08166817117217e-17 419 246 -1.58733974315456e-17 420 420 1.11111111111111e+00 420 275 -8.33333333333333e-02 420 352 -4.16666666666667e-02 420 274 8.93111539584934e-18 420 351 -6.94444444444444e-02 420 273 -9.72222222222221e-02 420 329 4.16666666666667e-02 420 431 6.57297567069337e-18 420 350 -3.41337337084538e-17 420 272 8.33333333333333e-02 420 328 4.16666666666667e-02 420 430 -5.67850887839283e-18 420 349 0.00000000000000e+00 420 271 3.06287113727155e-18 420 327 -6.94444444444444e-02 420 429 -2.77777777777778e-02 420 348 1.11111111111111e-01 420 270 -9.72222222222222e-02 420 425 6.19350491032344e-18 420 359 1.59253629028596e-16 420 344 4.16666666666667e-02 420 251 8.33333333333334e-02 420 424 -1.66666666666667e-01 420 358 8.84399805722424e-17 420 343 -4.16666666666667e-02 420 250 9.03784154720338e-18 420 423 -1.94444444444444e-01 420 357 -2.22222222222222e-01 420 342 -6.94444444444444e-02 420 249 -9.72222222222222e-02 420 410 -3.30275086793397e-17 420 455 3.46944695195361e-17 420 422 -1.24900090270330e-16 420 335 -4.37136763418999e-17 420 320 -4.16666666666667e-02 420 419 4.45878143434664e-18 420 341 -3.31585870279273e-17 420 248 -8.33333333333334e-02 420 409 1.66666666666667e-01 420 454 -5.80014280961855e-17 420 421 -9.71445146547012e-17 420 334 2.26090034281118e-17 420 319 4.16666666666667e-02 420 418 -5.55653613398821e-18 420 340 0.00000000000000e+00 420 247 2.95445092002300e-18 420 408 -1.94444444444445e-01 420 453 2.22222222222222e-01 420 353 -4.16666666666667e-02 420 333 -2.22222222222223e-01 420 318 -6.94444444444444e-02 420 417 -2.77777777777778e-02 420 339 1.11111111111111e-01 420 246 -9.72222222222223e-02 421 421 1.11111111111111e+00 421 275 1.27800331081729e-17 421 352 -6.94444444444444e-02 421 274 -1.38888888888888e-02 421 351 -4.16666666666667e-02 421 273 7.54875762593032e-18 421 329 -4.16666666666667e-02 421 431 -1.66666666666667e-01 421 350 -3.38169433861807e-17 421 272 1.59919820441612e-18 421 328 -6.94444444444444e-02 421 430 -1.94444444444445e-01 421 349 1.11111111111111e-01 421 271 -1.38888888888889e-02 421 327 4.16666666666667e-02 421 429 -5.20417042793042e-18 421 348 6.93889390390723e-18 421 270 3.12555157536837e-18 421 425 7.92077449636441e-17 421 359 -2.77555756156289e-17 421 344 4.16666666666667e-02 421 251 -3.11470955364351e-17 421 424 -1.94444444444444e-01 421 358 1.11111111111111e-01 421 343 -6.94444444444444e-02 421 250 -1.38888888888889e-02 421 423 -1.66666666666667e-01 421 357 8.14862635917582e-17 421 342 -4.16666666666667e-02 421 249 8.99887803162969e-18 421 410 3.38457425063873e-17 421 455 9.03508869012481e-18 421 422 -1.38777878078145e-17 421 335 5.55111512312578e-17 421 320 4.16666666666667e-02 421 419 1.66666666666667e-01 421 341 -4.32433612979370e-17 421 248 1.27292111313376e-17 421 409 -1.94444444444445e-01 421 454 -4.44444444444445e-01 421 353 -4.16666666666667e-02 421 334 1.11111111111111e-01 421 319 -6.94444444444444e-02 421 418 -1.94444444444445e-01 421 340 1.11111111111111e-01 421 247 -1.38888888888889e-02 421 408 1.66666666666667e-01 421 453 -5.50819172852367e-17 421 420 -9.71445146547012e-17 421 333 2.46696228305447e-17 421 318 4.16666666666667e-02 421 417 -3.98613704977874e-18 421 339 6.93889390390723e-18 421 246 3.45250629300853e-18 422 422 1.11111111111111e+00 422 275 -9.72222222222220e-02 422 352 -4.16666666666667e-02 422 274 1.32645359540023e-17 422 351 -4.16666666666667e-02 422 273 -8.33333333333333e-02 422 329 -6.94444444444444e-02 422 431 -1.94444444444445e-01 422 350 -2.22222222222222e-01 422 272 -9.72222222222222e-02 422 328 -4.16666666666667e-02 422 430 -1.66666666666667e-01 422 349 -3.80529551553994e-17 422 271 2.06676039130049e-18 422 327 4.16666666666667e-02 422 429 4.54009659728305e-18 422 348 -2.88202960303276e-17 422 270 8.33333333333333e-02 422 425 -2.77777777777777e-02 422 359 1.11111111111111e-01 422 344 -6.94444444444445e-02 422 251 -9.72222222222224e-02 422 424 7.90247858470372e-17 422 358 -2.77555756156289e-17 422 343 4.16666666666667e-02 422 250 -3.16722559637328e-17 422 423 5.99021700298241e-18 422 357 1.59313344851378e-16 422 342 4.16666666666667e-02 422 249 8.33333333333334e-02 422 410 -2.77777777777778e-02 422 455 2.22222222222222e-01 422 353 -6.94444444444445e-02 422 335 1.11111111111111e-01 422 320 -6.94444444444445e-02 422 419 -1.94444444444445e-01 422 341 -2.22222222222222e-01 422 248 -9.72222222222223e-02 422 409 3.40710532703570e-17 422 454 1.82501718815412e-17 422 421 -1.38777878078145e-17 422 334 6.24500451351651e-17 422 319 4.16666666666667e-02 422 418 1.66666666666667e-01 422 340 -3.91295340313597e-17 422 247 1.40404181336873e-17 422 408 -3.26531201166533e-17 422 453 3.46944695195361e-17 422 420 -1.24900090270330e-16 422 333 -4.24865373595653e-17 422 318 -4.16666666666667e-02 422 417 8.32125167382625e-18 422 339 -3.50146479735983e-17 422 246 -8.33333333333334e-02 423 423 2.22222222222222e+00 423 379 -4.16666666666667e-02 423 378 -6.94444444444444e-02 423 446 -1.66666666666667e-01 423 374 -4.16666666666667e-02 423 445 6.10541348380900e-18 423 373 4.16666666666667e-02 423 444 -1.94444444444444e-01 423 372 -6.94444444444444e-02 423 443 1.92242597708836e-17 423 371 4.16666666666667e-02 423 442 -1.66666666666667e-01 423 370 -4.16666666666667e-02 423 441 -1.94444444444444e-01 423 369 -6.94444444444444e-02 423 458 6.10717107717455e-17 423 437 1.43334915334373e-17 423 434 1.66666666666667e-01 423 365 4.16666666666667e-02 423 457 -1.27387402519942e-17 423 436 1.66666666666667e-01 423 433 5.03645790437407e-18 423 364 4.16666666666667e-02 423 456 -4.44444444444445e-01 423 435 -1.94444444444444e-01 423 432 -1.94444444444444e-01 423 363 -6.94444444444444e-02 423 356 4.16666666666667e-02 423 287 5.82758667710959e-19 423 355 4.16666666666667e-02 423 286 -1.06929439261383e-17 423 354 -6.94444444444444e-02 423 285 -2.77777777777778e-02 423 431 1.66666666666667e-01 423 353 -6.33292653344150e-17 423 275 2.19550939928315e-18 423 350 4.16666666666667e-02 423 430 1.64798730217797e-17 423 352 -2.08166817117217e-17 423 274 -6.05289744107923e-18 423 349 -4.16666666666667e-02 423 429 -1.94444444444444e-01 423 351 2.22222222222222e-01 423 273 -2.77777777777778e-02 423 348 -6.94444444444444e-02 423 428 2.65629532258949e-18 423 362 -2.77555756156289e-17 423 347 -4.16666666666667e-02 423 263 1.97019863531350e-18 423 427 1.66666666666667e-01 423 361 -4.40846767727973e-17 423 346 4.16666666666667e-02 423 262 -1.02728155843002e-17 423 426 -1.94444444444444e-01 423 360 2.22222222222222e-01 423 345 -6.94444444444445e-02 423 261 -2.77777777777778e-02 423 455 1.98520805913885e-16 423 425 -3.19189119579733e-16 423 359 -2.77555756156289e-17 423 422 7.07441917546792e-18 423 419 -1.66666666666667e-01 423 344 -7.22923562240232e-17 423 251 2.16162808139297e-18 423 341 -4.16666666666667e-02 423 454 1.69877539769533e-16 423 424 -1.66533453693773e-16 423 358 -3.55243500496085e-17 423 421 -1.66666666666667e-01 423 418 1.74149973955484e-17 423 343 -2.08166817117217e-17 423 250 -5.53620734325411e-18 423 340 -4.16666666666667e-02 423 453 -4.44444444444444e-01 423 380 -4.16666666666667e-02 423 357 2.22222222222222e-01 423 420 -1.94444444444444e-01 423 417 -1.94444444444444e-01 423 342 2.22222222222222e-01 423 249 -2.77777777777778e-02 423 339 -6.94444444444444e-02 424 424 2.22222222222222e+00 424 379 -6.94444444444444e-02 424 378 -4.16666666666667e-02 424 446 -4.30970363562988e-18 424 374 4.16666666666667e-02 424 445 -2.77777777777778e-02 424 373 -6.94444444444444e-02 424 444 6.15284732885524e-18 424 372 4.16666666666667e-02 424 443 2.25226060674918e-17 424 371 4.16666666666667e-02 424 442 -1.94444444444444e-01 424 370 -6.94444444444444e-02 424 441 -1.66666666666667e-01 424 369 -4.16666666666667e-02 424 458 1.38777878078145e-17 424 437 -3.05338436826230e-17 424 434 8.45338881359792e-19 424 365 -4.16666666666667e-02 424 457 2.22222222222222e-01 424 436 -1.94444444444444e-01 424 433 -2.77777777777778e-02 424 364 -6.94444444444444e-02 424 456 -1.19414704903911e-17 424 435 1.66666666666667e-01 424 432 5.85469173142172e-18 424 363 4.16666666666667e-02 424 356 -4.16666666666667e-02 424 287 -1.66666666666667e-01 424 355 -6.94444444444445e-02 424 286 -1.94444444444445e-01 424 354 4.16666666666667e-02 424 285 -6.50013083722950e-18 424 431 -6.03900610074426e-17 424 353 3.12385750947386e-18 424 275 1.66666666666667e-01 424 350 4.16666666666667e-02 424 430 -2.77777777777778e-02 424 352 2.22222222222222e-01 424 274 -1.94444444444445e-01 424 349 -6.94444444444444e-02 424 429 1.77368699155050e-17 424 351 -2.08166817117217e-17 424 273 -1.02728155843002e-17 424 348 -4.16666666666667e-02 424 428 -1.97799133842824e-17 424 362 -3.08800683998132e-17 424 347 4.16666666666667e-02 424 263 1.66666666666667e-01 424 427 -1.94444444444445e-01 424 361 -4.44444444444445e-01 424 346 -6.94444444444445e-02 424 262 -1.94444444444445e-01 424 426 1.66666666666667e-01 424 360 -3.72302744053787e-17 424 345 4.16666666666667e-02 424 261 -6.71527720583209e-18 424 455 -6.93889390390723e-17 424 425 1.80411241501588e-16 424 359 -4.23736702193436e-17 424 422 7.92416262815343e-17 424 419 3.50010954464422e-17 424 344 7.09601851562290e-18 424 251 -1.66666666666667e-01 424 341 -4.16666666666667e-02 424 454 2.22222222222223e-01 424 380 -4.16666666666667e-02 424 358 -4.44444444444445e-01 424 421 -1.94444444444444e-01 424 418 -2.77777777777777e-02 424 343 2.22222222222222e-01 424 250 -1.94444444444445e-01 424 340 -6.94444444444444e-02 424 453 1.71886278403947e-16 424 423 -1.66533453693773e-16 424 357 -4.45200517076860e-17 424 420 -1.66666666666667e-01 424 417 1.80655186990397e-17 424 342 -2.08166817117217e-17 424 249 -1.02728155843002e-17 424 339 -4.16666666666667e-02 425 425 2.22222222222222e+00 425 379 -4.16666666666667e-02 425 378 -4.16666666666667e-02 425 446 -1.94444444444444e-01 425 374 -6.94444444444444e-02 425 445 -2.99680256738571e-18 425 373 4.16666666666667e-02 425 444 -1.66666666666667e-01 425 372 -4.16666666666667e-02 425 443 -2.77777777777778e-02 425 371 -6.94444444444445e-02 425 442 2.23616698075135e-17 425 370 4.16666666666667e-02 425 441 2.04101058970396e-17 425 369 4.16666666666667e-02 425 458 2.22222222222222e-01 425 437 -2.77777777777778e-02 425 434 -1.94444444444444e-01 425 365 -6.94444444444444e-02 425 457 1.38777878078145e-17 425 436 -2.60682859846983e-17 425 433 3.80826013085533e-18 425 364 -4.16666666666667e-02 425 456 5.83808988565554e-17 425 435 1.42437060410283e-17 425 432 1.66666666666667e-01 425 363 4.16666666666667e-02 425 356 -6.94444444444445e-02 425 287 -1.94444444444444e-01 425 355 -4.16666666666667e-02 425 286 -1.66666666666667e-01 425 354 4.16666666666667e-02 425 285 -1.40438062654763e-18 425 431 -1.94444444444445e-01 425 353 -4.44444444444445e-01 425 275 -1.94444444444444e-01 425 350 -6.94444444444445e-02 425 430 -6.02342069451478e-17 425 352 1.07278840352125e-17 425 274 1.66666666666667e-01 425 349 4.16666666666667e-02 425 429 1.66666666666667e-01 425 351 -6.87958042177575e-17 425 273 1.94478764689587e-18 425 348 4.16666666666667e-02 425 428 -2.77777777777778e-02 425 362 2.22222222222222e-01 425 347 -6.94444444444445e-02 425 263 -1.94444444444445e-01 425 427 -2.16975959768662e-17 425 361 -3.37390163550333e-17 425 346 4.16666666666667e-02 425 262 1.66666666666667e-01 425 426 3.72355683612990e-18 425 360 -3.46944695195361e-17 425 345 -4.16666666666667e-02 425 261 2.30392961653170e-18 425 455 2.22222222222223e-01 425 380 -6.94444444444444e-02 425 359 2.22222222222222e-01 425 422 -2.77777777777777e-02 425 419 -1.94444444444444e-01 425 344 -4.44444444444445e-01 425 251 -1.94444444444444e-01 425 341 -6.94444444444445e-02 425 454 -6.93889390390723e-17 425 424 1.80411241501588e-16 425 358 -3.93772911684315e-17 425 421 7.92229915566947e-17 425 418 3.39219754716402e-17 425 343 2.29545928705915e-18 425 250 -1.66666666666667e-01 425 340 -4.16666666666667e-02 425 453 1.90172025669273e-16 425 423 -3.19189119579733e-16 425 357 -2.77555756156289e-17 425 420 6.22060996463558e-18 425 417 -1.66666666666667e-01 425 342 -6.59330446142747e-17 425 249 2.30392961653170e-18 425 339 -4.16666666666667e-02 426 426 1.11111111111111e+00 426 329 4.16666666666667e-02 426 283 2.60208521396521e-18 426 328 -4.16666666666667e-02 426 282 -9.72222222222222e-02 426 327 -6.94444444444444e-02 426 356 1.81061762805079e-17 426 287 -8.33333333333333e-02 426 353 -4.16666666666667e-02 426 431 5.61074624261249e-18 426 355 -1.38777878078145e-17 426 286 8.18572640226556e-18 426 352 4.16666666666667e-02 426 430 -3.98783111567325e-18 426 354 1.11111111111111e-01 426 285 -9.72222222222222e-02 426 351 -6.94444444444445e-02 426 429 -2.77777777777778e-02 426 338 -1.04408669210354e-16 426 410 -2.92870111842647e-17 426 260 -8.33333333333334e-02 426 320 -4.16666666666667e-02 426 337 2.45029690981724e-17 426 409 -1.66666666666667e-01 426 259 2.71050543121376e-18 426 319 -4.16666666666667e-02 426 336 -2.22222222222222e-01 426 408 -1.94444444444445e-01 426 258 -9.72222222222223e-02 426 318 -6.94444444444444e-02 426 428 1.11022302462516e-16 426 362 3.43014462320101e-17 426 425 3.80656606496083e-18 426 455 3.46944695195361e-17 426 347 1.90548531814327e-17 426 263 8.33333333333334e-02 426 344 4.16666666666667e-02 426 419 2.91548740444930e-18 426 427 -1.24900090270330e-16 426 361 8.30261694898665e-17 426 424 1.66666666666667e-01 426 454 -5.30642848048770e-17 426 346 -1.38777878078145e-17 426 262 7.94178091345632e-18 426 343 4.16666666666667e-02 426 418 -4.87721571029026e-18 426 284 8.33333333333334e-02 426 360 -2.22222222222222e-01 426 423 -1.94444444444444e-01 426 453 2.22222222222222e-01 426 345 1.11111111111111e-01 426 261 -9.72222222222222e-02 426 342 -6.94444444444444e-02 426 417 -2.77777777777778e-02 427 427 1.11111111111111e+00 427 329 4.16666666666666e-02 427 283 -1.38888888888888e-02 427 328 -6.94444444444444e-02 427 282 2.77826806699411e-18 427 327 -4.16666666666667e-02 427 356 2.08437867660338e-17 427 287 2.46113893154210e-17 427 353 4.16666666666667e-02 427 431 1.66666666666667e-01 427 355 1.11111111111111e-01 427 286 -1.38888888888888e-02 427 352 -6.94444444444445e-02 427 430 -1.94444444444445e-01 427 354 -1.38777878078145e-17 427 285 7.91467585914418e-18 427 351 4.16666666666667e-02 427 429 -4.79759461324836e-18 427 338 0.00000000000000e+00 427 410 -6.97684097994422e-17 427 260 2.16840434497101e-18 427 320 -4.16666666666667e-02 427 337 1.11111111111111e-01 427 409 -1.94444444444444e-01 427 259 -1.38888888888889e-02 427 319 -6.94444444444444e-02 427 336 2.51331616109296e-17 427 408 -1.66666666666667e-01 427 258 2.77826806699411e-18 427 318 -4.16666666666667e-02 427 428 5.55111512312578e-17 427 362 -4.16333634234434e-17 427 425 -2.06269463315367e-17 427 455 1.78300435397030e-17 427 347 2.99510850149121e-17 427 263 -2.92056960213283e-17 427 344 -4.16666666666667e-02 427 419 -1.66666666666667e-01 427 284 -1.19262238973405e-17 427 361 1.11111111111111e-01 427 424 -1.94444444444445e-01 427 454 -4.44444444444445e-01 427 346 1.11111111111111e-01 427 262 -1.38888888888889e-02 427 343 -6.94444444444445e-02 427 418 -1.94444444444445e-01 427 426 -1.24900090270330e-16 427 360 8.35377773900081e-17 427 423 1.66666666666667e-01 427 453 -6.09829840705206e-17 427 345 -1.38777878078145e-17 427 261 7.80625564189563e-18 427 342 4.16666666666667e-02 427 417 -4.81114714040443e-18 428 428 1.11111111111111e+00 428 329 -6.94444444444444e-02 428 283 -1.14654379740342e-17 428 328 4.16666666666666e-02 428 282 8.33333333333333e-02 428 327 4.16666666666667e-02 428 356 -2.22222222222222e-01 428 287 -9.72222222222222e-02 428 353 -6.94444444444445e-02 428 431 -1.94444444444445e-01 428 355 2.30155792427938e-17 428 286 2.17653586126465e-17 428 352 4.16666666666667e-02 428 430 1.66666666666667e-01 428 354 1.54634334850745e-17 428 285 -8.33333333333333e-02 428 351 -4.16666666666667e-02 428 429 1.86686061574848e-18 428 338 1.11111111111111e-01 428 410 -2.77777777777778e-02 428 260 -9.72222222222223e-02 428 320 -6.94444444444445e-02 428 337 6.93889390390723e-18 428 409 -7.08915754875014e-17 428 259 5.09575021068187e-18 428 319 -4.16666666666667e-02 428 336 -1.05357346111279e-16 428 408 -2.79893567090711e-17 428 258 -8.33333333333333e-02 428 318 -4.16666666666667e-02 428 284 -9.72222222222221e-02 428 362 1.11111111111111e-01 428 425 -2.77777777777778e-02 428 455 2.22222222222222e-01 428 347 -2.22222222222222e-01 428 263 -9.72222222222223e-02 428 344 -6.94444444444445e-02 428 419 -1.94444444444444e-01 428 427 5.55111512312578e-17 428 361 -4.16333634234434e-17 428 424 -1.89379626347116e-17 428 454 1.45933188900075e-17 428 346 2.08573392931899e-17 428 262 -2.81892564846231e-17 428 343 -4.16666666666667e-02 428 418 -1.66666666666667e-01 428 426 1.24900090270330e-16 428 360 3.82723366887383e-17 428 423 1.78893358460108e-18 428 453 3.46944695195361e-17 428 345 1.81061762805079e-17 428 261 8.33333333333334e-02 428 342 4.16666666666667e-02 428 417 3.21194893598831e-18 429 429 1.11111111111111e+00 429 338 -4.16666666666667e-02 429 283 8.33333333333334e-02 429 337 4.16666666666667e-02 429 282 -9.72222222222223e-02 429 336 -6.94444444444444e-02 429 356 1.38777878078145e-17 429 287 4.93311988480905e-18 429 428 3.60158409172529e-18 429 362 4.16666666666667e-02 429 355 -3.48028897367847e-17 429 286 -8.33333333333333e-02 429 427 -5.55653613398821e-18 429 361 -4.16666666666667e-02 429 354 1.11111111111111e-01 429 285 -9.72222222222222e-02 429 426 -2.77777777777778e-02 429 360 -6.94444444444444e-02 429 353 9.46542377897736e-17 429 275 2.30392961653170e-18 429 425 1.66666666666667e-01 429 359 4.16666666666667e-02 429 352 9.19810018082390e-17 429 274 8.33333333333334e-02 429 424 1.66543618089141e-17 429 358 4.16666666666667e-02 429 351 -2.22222222222222e-01 429 273 -9.72222222222223e-02 429 423 -1.94444444444444e-01 429 357 -6.94444444444444e-02 429 329 -7.68428289749101e-17 429 431 2.77555756156289e-17 429 350 1.38777878078145e-17 429 272 -1.65882932390282e-17 429 410 -1.66666666666667e-01 429 455 -1.40872167040231e-17 429 422 2.80706718720075e-18 429 335 -4.16666666666667e-02 429 328 2.54787510534094e-17 429 430 -1.11022302462516e-16 429 349 -2.75658402354440e-17 429 271 -8.33333333333333e-02 429 409 5.66495635123676e-18 429 454 -1.38777878078145e-17 429 421 -4.66037527579316e-18 429 334 -4.16666666666667e-02 429 327 -2.22222222222222e-01 429 284 -1.68051336735253e-17 429 348 1.11111111111111e-01 429 270 -9.72222222222223e-02 429 408 -1.94444444444445e-01 429 453 2.22222222222222e-01 429 420 -2.77777777777778e-02 429 333 -6.94444444444444e-02 430 430 1.11111111111111e+00 430 338 4.16666666666667e-02 430 283 -9.72222222222223e-02 430 337 -6.94444444444444e-02 430 282 8.33333333333334e-02 430 336 4.16666666666667e-02 430 356 4.81453527219344e-18 430 287 4.49672851038363e-17 430 428 1.66666666666667e-01 430 362 4.16666666666667e-02 430 355 -2.22222222222222e-01 430 286 -9.72222222222221e-02 430 427 -1.94444444444445e-01 430 361 -6.94444444444444e-02 430 354 -2.95309566730739e-17 430 285 -8.33333333333333e-02 430 426 -3.97427858851718e-18 430 360 -4.16666666666667e-02 430 353 -1.38777878078145e-17 430 275 -6.93889390390723e-18 430 425 -6.02325128792533e-17 430 359 -4.16666666666667e-02 430 352 1.11111111111111e-01 430 274 -9.72222222222224e-02 430 424 -2.77777777777778e-02 430 358 -6.94444444444445e-02 430 351 8.72782748850831e-17 430 273 8.33333333333334e-02 430 423 1.63714528045311e-17 430 357 4.16666666666667e-02 430 329 5.55111512312578e-17 430 431 0.00000000000000e+00 430 350 3.51010453342182e-18 430 272 -3.17671236538253e-17 430 410 1.49094739375702e-17 430 455 -1.50528342638930e-17 430 422 -1.66666666666667e-01 430 335 -4.16666666666667e-02 430 328 1.11111111111111e-01 430 284 1.95427441590512e-17 430 349 -2.22222222222222e-01 430 271 -9.72222222222222e-02 430 409 -2.77777777777778e-02 430 454 2.22222222222222e-01 430 421 -1.94444444444445e-01 430 334 -6.94444444444444e-02 430 327 2.61563774112128e-17 430 429 -1.11022302462516e-16 430 348 -3.65376132127615e-17 430 270 -8.33333333333333e-02 430 408 6.25787941431477e-18 430 453 -6.93889390390723e-18 430 420 -4.81114714040443e-18 430 333 -4.16666666666667e-02 431 431 1.11111111111111e+00 431 338 -6.94444444444445e-02 431 283 1.88651178012478e-17 431 337 4.16666666666667e-02 431 282 -1.80384136447276e-17 431 336 -4.16666666666667e-02 431 356 1.11111111111111e-01 431 287 -1.38888888888888e-02 431 428 -1.94444444444445e-01 431 362 -6.94444444444445e-02 431 355 1.26038502551440e-17 431 286 4.36933475511658e-17 431 427 1.66666666666667e-01 431 361 4.16666666666667e-02 431 354 1.38777878078145e-17 431 285 3.79470760369927e-18 431 426 5.71916645986104e-18 431 360 4.16666666666667e-02 431 353 1.11111111111111e-01 431 275 -1.38888888888889e-02 431 425 -1.94444444444445e-01 431 359 -6.94444444444445e-02 431 352 -1.38777878078145e-17 431 274 -5.48877349820787e-18 431 424 -5.98615124483559e-17 431 358 -4.16666666666667e-02 431 351 9.73884601435104e-17 431 273 2.05998412772246e-18 431 423 1.66666666666667e-01 431 357 4.16666666666667e-02 431 329 1.11111111111111e-01 431 284 -1.38888888888889e-02 431 350 1.11111111111111e-01 431 272 -1.38888888888889e-02 431 410 -1.94444444444445e-01 431 455 -4.44444444444445e-01 431 422 -1.94444444444445e-01 431 335 -6.94444444444445e-02 431 328 5.55111512312578e-17 431 430 1.38777878078145e-17 431 349 -2.12774676350280e-18 431 271 -3.39355279987963e-17 431 409 1.91361683443692e-17 431 454 -1.40455003313708e-17 431 421 -1.66666666666667e-01 431 334 -4.16666666666667e-02 431 327 -7.69851305100488e-17 431 429 2.77555756156289e-17 431 348 1.38777878078145e-17 431 270 -1.65205306032479e-17 431 408 -1.66666666666667e-01 431 453 -1.68830607046727e-17 431 420 6.57297567069337e-18 431 333 -4.16666666666667e-02 432 432 1.11111111111111e+00 432 263 5.93600689435814e-18 432 361 4.16666666666667e-02 432 262 8.33333333333334e-02 432 360 -6.94444444444444e-02 432 261 -9.72222222222222e-02 432 443 -9.89334482393023e-18 432 386 -4.16666666666667e-02 432 371 -4.16333634234434e-17 432 266 9.55453164502851e-18 432 442 -1.20617491689012e-18 432 385 -4.16666666666667e-02 432 370 4.68409219831628e-18 432 265 -8.33333333333334e-02 432 441 -2.77777777777778e-02 432 384 -6.94444444444444e-02 432 369 1.11111111111111e-01 432 264 -9.72222222222222e-02 432 440 -1.66666666666667e-01 432 383 -4.16666666666667e-02 432 368 3.95865083064034e-17 432 254 7.73510487432627e-18 432 439 2.92395773392184e-18 432 382 4.16666666666667e-02 432 367 -4.44946407192684e-18 432 253 8.33333333333334e-02 432 438 -1.94444444444444e-01 432 381 -6.94444444444444e-02 432 366 -2.22222222222223e-01 432 252 -9.72222222222222e-02 432 425 1.66666666666667e-01 432 458 -3.01221856702574e-17 432 437 -1.09639944692597e-17 432 359 4.16666666666667e-02 432 344 3.01357381974135e-17 432 434 -1.11022302462516e-16 432 365 -4.16333634234434e-17 432 251 7.90112333198811e-18 432 424 6.72205346941013e-18 432 457 -6.93889390390723e-18 432 436 -2.83925443919641e-18 432 358 -4.16666666666667e-02 432 343 -3.30851069197530e-18 432 433 1.38777878078145e-17 432 364 2.14871082894735e-18 432 250 -8.33333333333334e-02 432 423 -1.94444444444444e-01 432 456 2.22222222222222e-01 432 435 -2.77777777777778e-02 432 357 -6.94444444444444e-02 432 342 -2.22222222222223e-01 432 362 4.16666666666667e-02 432 363 1.11111111111111e-01 432 249 -9.72222222222222e-02 433 433 1.11111111111111e+00 433 263 -1.26902476157639e-17 433 361 -6.94444444444444e-02 433 262 -9.72222222222222e-02 433 360 4.16666666666667e-02 433 261 8.33333333333334e-02 433 443 -1.66666666666667e-01 433 386 -4.16666666666667e-02 433 371 3.94272661123195e-18 433 266 1.81265050712420e-17 433 442 -1.94444444444444e-01 433 385 -6.94444444444444e-02 433 370 -2.22222222222222e-01 433 265 -9.72222222222222e-02 433 441 -3.48638761089870e-18 433 384 -4.16666666666667e-02 433 369 3.82922419629988e-18 433 264 -8.33333333333334e-02 433 440 -7.92822838630025e-18 433 383 4.16666666666667e-02 433 368 -6.93889390390723e-18 433 254 -8.90401034153721e-18 433 439 -2.77777777777778e-02 433 382 -6.94444444444444e-02 433 367 1.11111111111111e-01 433 253 -9.72222222222222e-02 433 438 3.67273485929465e-18 433 381 4.16666666666667e-02 433 366 -5.85469173142172e-18 433 252 8.33333333333334e-02 433 425 2.98155597433514e-18 433 458 -1.67407591695340e-17 433 437 1.66666666666667e-01 433 359 4.16666666666667e-02 433 344 6.93889390390723e-18 433 434 5.55111512312578e-17 433 365 1.46197886696092e-18 433 251 9.17506088465858e-18 433 424 -2.77777777777778e-02 433 457 2.22222222222222e-01 433 436 -1.94444444444444e-01 433 358 -6.94444444444444e-02 433 343 1.11111111111111e-01 433 362 -4.16666666666667e-02 433 364 -2.22222222222222e-01 433 250 -9.72222222222222e-02 433 423 5.03476383847956e-18 433 456 0.00000000000000e+00 433 435 -2.49366499671666e-18 433 357 -4.16666666666667e-02 433 342 -5.17812416480235e-18 433 432 1.38777878078145e-17 433 363 4.68409219831628e-18 433 249 -8.33333333333334e-02 434 434 1.11111111111111e+00 434 263 -1.38888888888889e-02 434 361 -4.16666666666667e-02 434 262 -1.34576594659763e-17 434 360 4.16666666666667e-02 434 261 6.52554182564713e-18 434 443 -1.94444444444444e-01 434 386 -6.94444444444444e-02 434 371 1.11111111111111e-01 434 266 -1.38888888888889e-02 434 442 -1.66666666666667e-01 434 385 -4.16666666666666e-02 434 370 5.63615723103011e-18 434 265 1.79028883731669e-17 434 441 -1.00051531729678e-17 434 384 -4.16666666666667e-02 434 369 -2.77555756156289e-17 434 264 9.79847713383775e-18 434 440 -1.94444444444444e-01 434 383 -6.94444444444444e-02 434 368 1.11111111111111e-01 434 254 -1.38888888888889e-02 434 439 -8.39748463907913e-18 434 382 4.16666666666667e-02 434 367 -6.93889390390723e-18 434 253 -1.07945878798088e-17 434 438 -1.66666666666667e-01 434 381 -4.16666666666667e-02 434 366 4.17959937493162e-17 434 252 8.07730618501701e-18 434 425 -1.94444444444444e-01 434 458 -4.44444444444445e-01 434 437 -1.94444444444444e-01 434 359 -6.94444444444444e-02 434 344 1.11111111111111e-01 434 362 -6.94444444444444e-02 434 365 1.11111111111111e-01 434 251 -1.38888888888889e-02 434 424 7.35224598216733e-19 434 457 -1.05523364568941e-17 434 436 1.66666666666667e-01 434 358 4.16666666666667e-02 434 343 6.93889390390723e-18 434 433 5.55111512312578e-17 434 364 3.92875056760226e-18 434 250 9.24282352043893e-18 434 423 1.66666666666667e-01 434 456 -2.78178325372521e-17 434 435 -1.10774968841917e-17 434 357 4.16666666666667e-02 434 342 3.14916261877308e-17 434 432 -1.11022302462516e-16 434 363 -3.46944695195361e-17 434 249 7.99090882439707e-18 435 435 1.11111111111111e+00 435 278 -8.33333333333333e-02 435 376 -4.16666666666667e-02 435 277 1.74488787134386e-18 435 375 -6.94444444444444e-02 435 276 -9.72222222222222e-02 435 353 4.16666666666667e-02 435 446 -9.87979229677416e-18 435 374 -3.52145477491503e-17 435 275 8.33333333333334e-02 435 352 4.16666666666667e-02 435 445 -7.72494047895922e-19 435 373 -6.93889390390723e-18 435 274 3.25260651745651e-18 435 351 -6.94444444444444e-02 435 444 -2.77777777777778e-02 435 372 1.11111111111111e-01 435 273 -9.72222222222223e-02 435 440 1.39828198932740e-17 435 383 8.59153988729509e-17 435 368 4.16666666666667e-02 435 254 8.33333333333334e-02 435 439 -1.66666666666667e-01 435 382 -3.46521178721734e-18 435 367 -4.16666666666667e-02 435 253 1.43317974675428e-18 435 438 -1.94444444444444e-01 435 381 -2.22222222222222e-01 435 366 -6.94444444444444e-02 435 252 -9.72222222222223e-02 435 425 1.42843636224965e-17 435 458 -4.85722573273506e-17 435 437 -1.24900090270330e-16 435 359 7.37342180584868e-17 435 344 -4.16666666666667e-02 435 434 -1.08623505155891e-17 435 365 -3.61507309141031e-17 435 251 -8.33333333333333e-02 435 424 1.66666666666667e-01 435 457 9.80694746331029e-18 435 436 1.38777878078145e-17 435 358 -3.05101267600999e-18 435 343 4.16666666666667e-02 435 433 -2.50721752387273e-18 435 364 -6.93889390390723e-18 435 250 3.78115507654320e-18 435 423 -1.94444444444444e-01 435 456 2.22222222222222e-01 435 377 -4.16666666666667e-02 435 357 -2.22222222222222e-01 435 342 -6.94444444444444e-02 435 432 -2.77777777777778e-02 435 363 1.11111111111111e-01 435 249 -9.72222222222222e-02 436 436 1.11111111111111e+00 436 278 -2.58853268680914e-18 436 376 -6.94444444444444e-02 436 277 -1.38888888888889e-02 436 375 -4.16666666666667e-02 436 276 1.61275073157219e-18 436 353 -4.16666666666667e-02 436 446 -1.66666666666667e-01 436 374 1.64781789558852e-17 436 275 9.48676900924816e-18 436 352 -6.94444444444444e-02 436 445 -1.94444444444444e-01 436 373 1.11111111111111e-01 436 274 -1.38888888888889e-02 436 351 4.16666666666667e-02 436 444 -3.26954717640160e-18 436 372 0.00000000000000e+00 436 273 2.75793927626000e-18 436 440 3.61327314639739e-17 436 383 6.93889390390723e-18 436 368 4.16666666666667e-02 436 254 -4.54687286086108e-18 436 439 -1.94444444444444e-01 436 382 1.11111111111111e-01 436 367 -6.94444444444444e-02 436 253 -1.38888888888889e-02 436 438 -1.66666666666667e-01 436 381 -5.71916645986104e-18 436 366 -4.16666666666667e-02 436 252 1.40946282423116e-18 436 425 -2.61767062019469e-17 436 458 3.50332826984379e-18 436 437 5.55111512312578e-17 436 359 1.38777878078145e-17 436 344 4.16666666666667e-02 436 434 1.66666666666667e-01 436 365 1.74135150878907e-17 436 251 4.54009659728305e-18 436 424 -1.94444444444444e-01 436 457 -4.44444444444445e-01 436 377 -4.16666666666667e-02 436 358 1.11111111111111e-01 436 343 -6.94444444444444e-02 436 433 -1.94444444444444e-01 436 364 1.11111111111111e-01 436 250 -1.38888888888889e-02 436 423 1.66666666666667e-01 436 456 1.83848501201546e-18 436 435 1.38777878078145e-17 436 357 -3.01480201751487e-18 436 342 4.16666666666667e-02 436 432 -3.70492211129031e-18 436 363 0.00000000000000e+00 436 249 3.92515067757643e-18 437 437 1.11111111111111e+00 437 278 -9.72222222222221e-02 437 376 -4.16666666666666e-02 437 277 -2.20228566286118e-18 437 375 -4.16666666666667e-02 437 276 -8.33333333333333e-02 437 353 -6.94444444444444e-02 437 446 -1.94444444444444e-01 437 374 -2.22222222222222e-01 437 275 -9.72222222222223e-02 437 352 -4.16666666666667e-02 437 445 -1.66666666666667e-01 437 373 1.74137268461275e-17 437 274 7.28448334638698e-18 437 351 4.16666666666667e-02 437 444 -9.99160064581173e-18 437 372 -3.62049410227274e-17 437 273 8.33333333333334e-02 437 440 -2.77777777777778e-02 437 383 1.11111111111111e-01 437 368 -6.94444444444445e-02 437 254 -9.72222222222223e-02 437 439 3.69712940817557e-17 437 382 6.93889390390723e-18 437 367 4.16666666666667e-02 437 253 -4.02510056535244e-18 437 438 1.50026475617682e-17 437 381 8.71698546678346e-17 437 366 4.16666666666667e-02 437 252 8.33333333333334e-02 437 425 -2.77777777777778e-02 437 458 2.22222222222222e-01 437 377 -6.94444444444444e-02 437 359 1.11111111111111e-01 437 344 -6.94444444444444e-02 437 434 -1.94444444444444e-01 437 365 -2.22222222222222e-01 437 251 -9.72222222222222e-02 437 424 -3.03712133567502e-17 437 457 -2.87991202066462e-20 437 436 5.55111512312578e-17 437 358 1.38777878078145e-17 437 343 4.16666666666667e-02 437 433 1.66666666666667e-01 437 364 1.93513147129717e-17 437 250 4.18773089122526e-18 437 423 1.39523267071728e-17 437 456 -4.16333634234434e-17 437 435 -1.24900090270330e-16 437 357 6.86729844404056e-17 437 342 -4.16666666666667e-02 437 432 -1.00830802041152e-17 437 363 -3.52281002763064e-17 437 249 -8.33333333333333e-02 438 438 1.11111111111111e+00 438 290 -6.61363325216158e-18 438 379 4.16666666666667e-02 438 289 -5.42101086242752e-19 438 378 -6.94444444444444e-02 438 288 -1.38888888888889e-02 438 446 1.66666666666667e-01 438 377 -1.53143556863578e-17 438 278 -6.61363325216158e-18 438 374 4.16666666666667e-02 438 445 3.14418630020796e-18 438 376 -1.38777878078145e-17 438 277 -8.67361737988404e-19 438 373 -4.16666666666667e-02 438 444 -1.94444444444445e-01 438 375 1.11111111111111e-01 438 276 -1.38888888888889e-02 438 372 -6.94444444444444e-02 438 443 1.21430643318376e-17 438 386 -2.77555756156289e-17 438 371 -4.16666666666667e-02 438 266 -6.08508469307489e-18 438 442 1.66666666666667e-01 438 385 5.27193306371077e-18 438 370 4.16666666666667e-02 438 265 -1.40946282423116e-18 438 441 -1.94444444444444e-01 438 384 1.11111111111111e-01 438 369 -6.94444444444444e-02 438 264 -1.38888888888889e-02 438 458 8.03800385626441e-17 438 440 -1.80411241501588e-16 438 383 -2.77555756156289e-17 438 437 1.50568576703924e-17 438 434 -1.66666666666667e-01 438 368 -1.17178537923160e-17 438 254 -2.64274279543342e-18 438 365 -4.16666666666667e-02 438 457 -5.74627151417317e-18 438 439 4.16333634234434e-17 438 382 1.89227160416611e-18 438 436 -1.66666666666667e-01 438 433 3.99799551104030e-18 438 367 -1.38777878078145e-17 438 253 -9.08019319456610e-19 438 364 -4.16666666666667e-02 438 456 -4.44444444444445e-01 438 380 4.16666666666667e-02 438 381 1.11111111111111e-01 438 435 -1.94444444444444e-01 438 432 -1.94444444444444e-01 438 366 1.11111111111111e-01 438 252 -1.38888888888889e-02 438 363 -6.94444444444444e-02 439 439 1.11111111111111e+00 439 290 -8.33333333333334e-02 439 379 -6.94444444444444e-02 439 289 -9.72222222222223e-02 439 378 4.16666666666667e-02 439 288 -8.94466792300541e-19 439 446 -6.66784336078585e-18 439 377 1.38777878078145e-17 439 278 8.33333333333333e-02 439 374 4.16666666666667e-02 439 445 -2.77777777777778e-02 439 376 1.11111111111111e-01 439 277 -9.72222222222223e-02 439 373 -6.94444444444445e-02 439 444 1.71608875113721e-18 439 375 -6.93889390390723e-18 439 276 -9.75781955236954e-19 439 372 -4.16666666666667e-02 439 443 -1.76115090393114e-17 439 386 -1.79977560632594e-17 439 371 4.16666666666667e-02 439 266 8.33333333333334e-02 439 442 -1.94444444444444e-01 439 385 -2.22222222222222e-01 439 370 -6.94444444444444e-02 439 265 -9.72222222222223e-02 439 441 1.66666666666667e-01 439 384 1.07911997480198e-18 439 369 4.16666666666667e-02 439 264 -2.30392961653170e-19 439 458 -6.93889390390723e-18 439 440 9.71445146547012e-17 439 383 -2.67797936603920e-17 439 437 3.69170839731314e-17 439 434 -8.28906442183058e-18 439 368 1.38913403349705e-17 439 254 -8.33333333333334e-02 439 365 -4.16666666666666e-02 439 457 2.22222222222222e-01 439 380 -4.16666666666667e-02 439 382 -2.22222222222222e-01 439 436 -1.94444444444444e-01 439 433 -2.77777777777778e-02 439 367 1.11111111111111e-01 439 253 -9.72222222222223e-02 439 364 -6.94444444444444e-02 439 456 -9.44695846072721e-18 439 438 4.16333634234434e-17 439 381 5.27193306371077e-18 439 435 -1.66666666666667e-01 439 432 2.04304346877737e-18 439 366 -6.93889390390723e-18 439 252 -5.42101086242752e-19 439 363 -4.16666666666667e-02 440 440 1.11111111111111e+00 440 290 -9.72222222222222e-02 440 379 -4.16666666666667e-02 440 289 -8.33333333333334e-02 440 378 4.16666666666667e-02 440 288 -2.64274279543342e-18 440 446 -1.94444444444444e-01 440 377 -2.22222222222222e-01 440 278 -9.72222222222222e-02 440 374 -6.94444444444445e-02 440 445 -6.25449128252575e-18 440 376 1.42166009867162e-17 440 277 8.33333333333334e-02 440 373 4.16666666666667e-02 440 444 1.66666666666667e-01 440 375 -8.30092288309214e-18 440 276 -2.62919026827735e-18 440 372 4.16666666666667e-02 440 443 -2.77777777777778e-02 440 386 1.11111111111111e-01 440 371 -6.94444444444444e-02 440 266 -9.72222222222223e-02 440 442 -1.68593437821496e-17 440 385 -1.99493199737333e-17 440 370 4.16666666666667e-02 440 265 8.33333333333333e-02 440 441 1.05116788754259e-17 440 384 -2.08166817117217e-17 440 369 -4.16666666666667e-02 440 264 -6.61363325216158e-18 440 458 2.22222222222222e-01 440 380 -6.94444444444445e-02 440 383 1.11111111111111e-01 440 437 -2.77777777777778e-02 440 434 -1.94444444444444e-01 440 368 -2.22222222222222e-01 440 254 -9.72222222222222e-02 440 365 -6.94444444444444e-02 440 457 -6.93889390390723e-18 440 439 9.71445146547012e-17 440 382 -2.71050543121376e-17 440 436 3.53602374160780e-17 440 433 -7.87401827767598e-18 440 367 1.48535697630514e-17 440 253 -8.33333333333334e-02 440 364 -4.16666666666667e-02 440 456 8.04945997687602e-17 440 438 -1.80411241501588e-16 440 381 -2.08166817117217e-17 440 435 1.35897966057480e-17 440 432 -1.66666666666667e-01 440 366 -1.53143556863578e-17 440 252 -6.61363325216158e-18 440 363 -4.16666666666667e-02 441 441 1.11111111111111e+00 441 353 4.16666666666667e-02 441 286 2.71050543121376e-18 441 352 -4.16666666666667e-02 441 285 -9.72222222222222e-02 441 351 -6.94444444444444e-02 441 380 5.09575021068187e-18 441 290 -8.33333333333333e-02 441 377 -4.16666666666667e-02 441 446 -1.09639944692597e-17 441 379 0.00000000000000e+00 441 289 1.28749007982654e-18 441 376 4.16666666666667e-02 441 445 -2.81214938488428e-18 441 378 1.11111111111111e-01 441 288 -9.72222222222223e-02 441 375 -6.94444444444444e-02 441 444 -2.77777777777778e-02 441 362 -1.02999206386123e-17 441 425 1.96105067948316e-17 441 263 -8.33333333333334e-02 441 344 -4.16666666666667e-02 441 361 -6.24771501894772e-18 441 424 -1.66666666666667e-01 441 262 3.25260651745651e-18 441 343 -4.16666666666667e-02 441 360 -2.22222222222222e-01 441 423 -1.94444444444444e-01 441 261 -9.72222222222223e-02 441 342 -6.94444444444444e-02 441 443 -1.38777878078145e-17 441 386 -2.01932654625425e-18 441 440 1.09470538103146e-17 441 458 -4.85722573273506e-17 441 371 8.38901430960659e-18 441 266 8.33333333333334e-02 441 368 4.16666666666667e-02 441 434 -9.70530350963977e-18 441 442 4.16333634234434e-17 441 385 -4.77726582251425e-18 441 439 1.66666666666667e-01 441 457 7.09707730680697e-18 441 370 6.93889390390723e-18 441 265 6.09863722023096e-19 441 367 4.16666666666667e-02 441 433 -2.10233577508517e-18 441 287 8.33333333333334e-02 441 384 -2.22222222222222e-01 441 438 -1.94444444444444e-01 441 456 2.22222222222222e-01 441 369 1.11111111111111e-01 441 264 -9.72222222222223e-02 441 366 -6.94444444444444e-02 441 432 -2.77777777777778e-02 442 442 1.11111111111111e+00 442 353 4.16666666666667e-02 442 286 -1.38888888888889e-02 442 352 -6.94444444444444e-02 442 285 1.73472347597681e-18 442 351 -4.16666666666667e-02 442 380 -2.53974358904729e-17 442 290 -7.04731412115578e-18 442 377 4.16666666666667e-02 442 446 1.66666666666667e-01 442 379 1.11111111111111e-01 442 289 -1.38888888888889e-02 442 376 -6.94444444444444e-02 442 445 -1.94444444444444e-01 442 378 0.00000000000000e+00 442 288 2.05998412772246e-18 442 375 4.16666666666667e-02 442 444 -2.49366499671666e-18 442 362 6.93889390390723e-18 442 425 2.15349656509933e-17 442 263 -8.30769914667018e-18 442 344 -4.16666666666667e-02 442 361 1.11111111111111e-01 442 424 -1.94444444444444e-01 442 262 -1.38888888888889e-02 442 343 -6.94444444444444e-02 442 360 -8.05358926249389e-18 442 423 -1.66666666666667e-01 442 261 2.16840434497101e-18 442 342 -4.16666666666667e-02 442 443 -2.77555756156289e-17 442 386 -6.93889390390723e-18 442 440 -1.67102659834328e-17 442 458 1.22768955375038e-17 442 371 -2.45368504160626e-17 442 266 -1.61275073157219e-18 442 368 -4.16666666666667e-02 442 434 -1.66666666666667e-01 442 287 -4.77048955893622e-18 442 385 1.11111111111111e-01 442 439 -1.94444444444444e-01 442 457 -4.44444444444444e-01 442 370 1.11111111111111e-01 442 265 -1.38888888888889e-02 442 367 -6.94444444444444e-02 442 433 -1.94444444444444e-01 442 441 4.16333634234434e-17 442 384 -5.31259064517897e-18 442 438 1.66666666666667e-01 442 456 9.91536768055884e-18 442 369 6.93889390390723e-18 442 264 1.95156391047391e-18 442 366 4.16666666666667e-02 442 432 -3.37457926186113e-18 443 443 1.11111111111111e+00 443 353 -6.94444444444445e-02 443 286 -6.51876556206910e-18 443 352 4.16666666666667e-02 443 285 8.33333333333334e-02 443 351 4.16666666666667e-02 443 380 -2.22222222222222e-01 443 290 -9.72222222222222e-02 443 377 -6.94444444444444e-02 443 446 -1.94444444444445e-01 443 379 -2.43725260242952e-17 443 289 -7.91467585914418e-18 443 376 4.16666666666667e-02 443 445 1.66666666666667e-01 443 378 8.38901430960659e-18 443 288 -8.33333333333334e-02 443 375 -4.16666666666667e-02 443 444 -1.10656384229302e-17 443 384 -1.62630325872826e-18 443 362 1.11111111111111e-01 443 425 -2.77777777777778e-02 443 263 -9.72222222222222e-02 443 344 -6.94444444444444e-02 443 361 0.00000000000000e+00 443 424 2.27377524360944e-17 443 262 -9.32413868337534e-18 443 343 -4.16666666666667e-02 443 360 -7.46744246299391e-18 443 423 1.92801639454024e-17 443 261 -8.33333333333334e-02 443 342 -4.16666666666667e-02 443 287 -9.72222222222222e-02 443 386 1.11111111111111e-01 443 440 -2.77777777777778e-02 443 458 2.22222222222222e-01 443 371 -2.22222222222222e-01 443 266 -9.72222222222222e-02 443 368 -6.94444444444445e-02 443 434 -1.94444444444444e-01 443 442 -2.77555756156289e-17 443 385 -6.93889390390723e-18 443 439 -1.75030888220629e-17 443 457 1.22180267476697e-17 443 370 -2.54109884176290e-17 443 265 -2.49366499671666e-18 443 367 -4.16666666666667e-02 443 433 -1.66666666666667e-01 443 441 -1.38777878078145e-17 443 438 1.20888542232134e-17 443 456 -2.77555756156289e-17 443 369 5.20417042793042e-18 443 264 8.33333333333334e-02 443 366 4.16666666666667e-02 443 432 -1.00017650411788e-17 444 444 1.11111111111111e+00 444 362 -4.16666666666667e-02 444 286 8.33333333333333e-02 444 361 4.16666666666667e-02 444 285 -9.72222222222223e-02 444 360 -6.94444444444444e-02 444 380 -6.93889390390723e-18 444 290 9.20216593897072e-18 444 443 -1.08352454612770e-17 444 386 4.16666666666667e-02 444 379 5.09575021068187e-18 444 289 -8.33333333333334e-02 444 442 -2.50721752387273e-18 444 385 -4.16666666666667e-02 444 378 1.11111111111111e-01 444 288 -9.72222222222222e-02 444 441 -2.77777777777778e-02 444 384 -6.94444444444444e-02 444 377 4.16807972684896e-17 444 278 6.57297567069337e-18 444 440 1.66666666666667e-01 444 383 4.16666666666667e-02 444 376 -3.75405002223106e-18 444 277 8.33333333333334e-02 444 439 1.71778281703172e-18 444 382 4.16666666666667e-02 444 375 -2.22222222222222e-01 444 276 -9.72222222222222e-02 444 438 -1.94444444444445e-01 444 381 -6.94444444444444e-02 444 353 2.63325602642417e-17 444 446 -5.55111512312578e-17 444 374 -6.93889390390723e-18 444 275 7.37257477290143e-18 444 425 -1.66666666666667e-01 444 458 -2.77634106703910e-17 444 437 -9.69175098248370e-18 444 359 -4.16666666666667e-02 444 352 -5.96311194867027e-18 444 445 4.16333634234434e-17 444 373 4.91956735765298e-18 444 274 -8.33333333333334e-02 444 424 7.03376159399971e-18 444 457 0.00000000000000e+00 444 436 -1.88549534058807e-18 444 358 -4.16666666666667e-02 444 351 -2.22222222222222e-01 444 287 6.17995238316738e-18 444 372 1.11111111111111e-01 444 273 -9.72222222222222e-02 444 423 -1.94444444444444e-01 444 456 2.22222222222222e-01 444 435 -2.77777777777778e-02 444 357 -6.94444444444444e-02 445 445 1.11111111111111e+00 445 362 4.16666666666667e-02 445 286 -9.72222222222222e-02 445 361 -6.94444444444444e-02 445 285 8.33333333333334e-02 445 360 4.16666666666667e-02 445 380 6.85249654328729e-18 445 290 1.89870905456524e-17 445 443 1.66666666666667e-01 445 386 4.16666666666667e-02 445 379 -2.22222222222222e-01 445 289 -9.72222222222222e-02 445 442 -1.94444444444445e-01 445 385 -6.94444444444444e-02 445 378 -2.01932654625425e-18 445 288 -8.33333333333334e-02 445 441 -3.69306365002875e-18 445 384 -4.16666666666667e-02 445 377 0.00000000000000e+00 445 278 -7.69783542464708e-18 445 440 -6.14607106527720e-18 445 383 -4.16666666666667e-02 445 376 1.11111111111111e-01 445 277 -9.72222222222222e-02 445 439 -2.77777777777778e-02 445 382 -6.94444444444444e-02 445 375 -5.09575021068187e-18 445 276 8.33333333333333e-02 445 438 3.14418630020796e-18 445 381 4.16666666666667e-02 445 353 1.38777878078145e-17 445 446 -1.38777878078145e-17 445 374 -1.11130722679764e-18 445 275 8.89045781438114e-18 445 425 -2.89007641603167e-18 445 458 -7.04202016523544e-18 445 437 -1.66666666666667e-01 445 359 -4.16666666666667e-02 445 352 1.11111111111111e-01 445 287 -1.17229359899995e-17 445 373 -2.22222222222222e-01 445 274 -9.72222222222223e-02 445 424 -2.77777777777778e-02 445 457 2.22222222222222e-01 445 436 -1.94444444444444e-01 445 358 -6.94444444444444e-02 445 351 -5.84113920426566e-18 445 444 4.16333634234434e-17 445 372 5.20417042793042e-18 445 273 -8.33333333333334e-02 445 423 6.22908029410812e-18 445 456 6.93889390390723e-18 445 435 -2.94089839286693e-18 445 357 -4.16666666666667e-02 446 446 1.11111111111111e+00 446 362 -6.94444444444444e-02 446 286 -1.17093834628434e-17 446 361 4.16666666666667e-02 446 285 4.87890977618477e-18 446 360 -4.16666666666667e-02 446 380 1.11111111111111e-01 446 290 -1.38888888888889e-02 446 443 -1.94444444444445e-01 446 386 -6.94444444444445e-02 446 379 6.69494841509799e-18 446 289 1.99493199737333e-17 446 442 1.66666666666667e-01 446 385 4.16666666666667e-02 446 378 -6.93889390390723e-18 446 288 1.04083408558608e-17 446 441 -1.00830802041152e-17 446 384 4.16666666666667e-02 446 377 1.11111111111111e-01 446 278 -1.38888888888889e-02 446 440 -1.94444444444444e-01 446 383 -6.94444444444445e-02 446 376 0.00000000000000e+00 446 277 -7.60296773455460e-18 446 439 -6.51876556206910e-18 446 382 -4.16666666666667e-02 446 375 4.19992816566572e-17 446 276 6.83047368665868e-18 446 438 1.66666666666667e-01 446 381 4.16666666666667e-02 446 353 1.11111111111111e-01 446 287 -1.38888888888889e-02 446 374 1.11111111111111e-01 446 275 -1.38888888888889e-02 446 425 -1.94444444444444e-01 446 458 -4.44444444444445e-01 446 437 -1.94444444444444e-01 446 359 -6.94444444444444e-02 446 352 6.93889390390723e-18 446 445 -1.38777878078145e-17 446 373 -1.98544522836408e-18 446 274 1.07742590890747e-17 446 424 -3.40168431617327e-18 446 457 -1.21193474093145e-17 446 436 -1.66666666666667e-01 446 358 -4.16666666666667e-02 446 351 2.62749620238284e-17 446 444 -5.55111512312578e-17 446 372 -6.93889390390723e-18 446 273 6.93889390390723e-18 446 423 -1.66666666666667e-01 446 456 -3.00256239142704e-17 446 435 -9.98821251402271e-18 446 357 -4.16666666666667e-02 447 447 2.22222222222222e+00 447 308 7.81980816905170e-18 447 281 -4.16666666666667e-02 447 307 1.47722546001150e-18 447 280 -4.16666666666667e-02 447 306 -2.77777777777777e-02 447 279 -6.94444444444445e-02 447 305 -1.66666666666667e-01 447 269 -4.16666666666667e-02 447 304 -1.77639749698172e-17 447 268 4.16666666666667e-02 447 303 -1.94444444444445e-01 447 267 -6.94444444444445e-02 447 401 1.40268656065312e-17 447 302 7.81980816905170e-18 447 400 2.08166817117217e-17 447 301 3.28140563766316e-18 447 399 2.22222222222222e-01 447 300 -2.77777777777777e-02 447 398 2.77555756156289e-17 447 314 -2.24497612340280e-17 447 299 8.20266706121064e-18 447 257 4.16666666666667e-02 447 397 1.53753420585601e-17 447 313 -1.66666666666667e-01 447 298 1.04354459101730e-18 447 256 -4.16666666666667e-02 447 396 2.22222222222222e-01 447 312 -1.94444444444445e-01 447 297 -2.77777777777778e-02 447 255 -6.94444444444445e-02 447 395 -1.27093693845482e-16 447 311 -2.62580213648833e-17 447 296 1.66666666666667e-01 447 245 4.16666666666667e-02 447 394 -6.44473488247907e-17 447 310 1.66666666666667e-01 447 295 -1.89565973595512e-17 447 244 4.16666666666667e-02 447 393 -4.44444444444445e-01 447 309 -1.94444444444444e-01 447 294 -1.94444444444445e-01 447 243 -6.94444444444444e-02 447 449 1.11022302462516e-16 447 392 2.77555756156289e-17 447 389 2.26871422174960e-17 447 293 1.16060454432784e-17 447 448 2.77555756156289e-17 447 391 1.39823963768004e-17 447 388 6.93889390390723e-18 447 292 3.44742409532500e-18 447 390 2.22222222222222e-01 447 387 2.22222222222222e-01 447 291 -2.77777777777777e-02 447 58 4.16666666666667e-02 447 57 -6.94444444444445e-02 447 158 1.66666666666667e-01 447 44 4.16666666666667e-02 447 157 -8.67361737988404e-19 447 43 -4.16666666666667e-02 447 156 -1.94444444444445e-01 447 42 -6.94444444444445e-02 447 167 -6.61363325216158e-18 447 29 -4.16666666666667e-02 447 166 1.66666666666667e-01 447 28 4.16666666666667e-02 447 165 -1.94444444444444e-01 447 27 -6.94444444444445e-02 447 224 -2.37643563681667e-17 447 164 -1.73472347597681e-18 447 149 -1.66666666666667e-01 447 14 -4.16666666666667e-02 447 223 -2.03287907341032e-19 447 163 -1.66666666666667e-01 447 148 2.03287907341032e-19 447 13 -4.16666666666667e-02 447 222 -4.44444444444445e-01 447 59 4.16666666666667e-02 447 162 -1.94444444444444e-01 447 147 -1.94444444444445e-01 447 12 -6.94444444444445e-02 448 448 2.22222222222222e+00 448 308 -1.66666666666667e-01 448 281 -4.16666666666667e-02 448 307 -1.94444444444444e-01 448 280 -6.94444444444445e-02 448 306 3.67951112287268e-18 448 279 -4.16666666666667e-02 448 305 -4.46149193977785e-17 448 269 4.16666666666667e-02 448 304 -2.77777777777778e-02 448 268 -6.94444444444444e-02 448 303 -1.72659195968317e-17 448 267 4.16666666666667e-02 448 401 2.69017664047966e-17 448 302 1.66666666666667e-01 448 400 2.22222222222222e-01 448 301 -1.94444444444444e-01 448 399 1.38777878078145e-17 448 300 1.13841228110978e-18 448 398 -1.03307102862450e-16 448 314 -1.19939865331209e-18 448 299 1.66666666666667e-01 448 257 4.16666666666667e-02 448 397 -4.44444444444444e-01 448 313 -1.94444444444444e-01 448 298 -1.94444444444444e-01 448 256 -6.94444444444444e-02 448 396 1.73995390442610e-17 448 312 -1.66666666666667e-01 448 297 3.26954717640160e-18 448 255 -4.16666666666667e-02 448 395 -7.63278329429795e-17 448 311 8.02445132910834e-17 448 296 2.21075599233372e-18 448 245 -4.16666666666666e-02 448 394 2.22222222222222e-01 448 310 -1.94444444444444e-01 448 295 -2.77777777777777e-02 448 244 -6.94444444444444e-02 448 393 -6.26618033719786e-17 448 309 1.66666666666667e-01 448 390 1.87346747273706e-17 448 294 -1.74014448683923e-17 448 243 4.16666666666667e-02 448 449 2.63677968348475e-16 448 392 -1.12812930113011e-16 448 389 4.19222016584571e-17 448 293 -1.66666666666667e-01 448 391 -4.44444444444444e-01 448 388 2.22222222222222e-01 448 292 -1.94444444444444e-01 448 447 2.77555756156289e-17 448 387 2.77555756156289e-17 448 291 1.46367293285543e-18 448 58 -6.94444444444444e-02 448 57 4.16666666666667e-02 448 158 -2.38253427403690e-17 448 44 4.16666666666667e-02 448 157 -2.77777777777778e-02 448 43 -6.94444444444444e-02 448 156 -3.37119113007212e-19 448 42 -4.16666666666667e-02 448 167 3.10911913619163e-17 448 29 4.16666666666667e-02 448 166 -1.94444444444444e-01 448 28 -6.94444444444444e-02 448 165 1.66666666666667e-01 448 27 4.16666666666667e-02 448 224 -6.93889390390723e-17 448 164 1.29833210155139e-17 448 149 -1.76843538727753e-17 448 14 -4.16666666666667e-02 448 223 2.22222222222222e-01 448 59 -4.16666666666667e-02 448 163 -1.94444444444444e-01 448 148 -2.77777777777778e-02 448 13 -6.94444444444444e-02 448 222 3.04910685187867e-18 448 162 -1.66666666666667e-01 448 147 6.25110315073674e-19 448 12 -4.16666666666667e-02 449 449 2.22222222222222e+00 449 308 -1.94444444444444e-01 449 281 -6.94444444444445e-02 449 307 -1.66666666666667e-01 449 280 -4.16666666666667e-02 449 306 8.16539761153146e-18 449 279 -4.16666666666667e-02 449 305 -1.94444444444444e-01 449 269 -6.94444444444444e-02 449 304 -4.64495927615313e-17 449 268 4.16666666666667e-02 449 303 -1.66666666666667e-01 449 267 -4.16666666666667e-02 449 401 -4.44444444444444e-01 449 302 -1.94444444444444e-01 449 400 4.60572047487158e-17 449 301 1.66666666666667e-01 449 399 2.96954928230781e-17 449 300 8.17725607279302e-18 449 398 2.22222222222222e-01 449 314 -2.77777777777778e-02 449 299 -1.94444444444444e-01 449 257 -6.94444444444444e-02 449 397 -1.03055110560642e-16 449 313 -4.81114714040443e-18 449 298 1.66666666666667e-01 449 256 4.16666666666667e-02 449 396 3.46944695195361e-17 449 312 -2.16840434497101e-17 449 297 1.12892551210053e-17 449 255 4.16666666666667e-02 449 395 2.22222222222222e-01 449 311 -2.77777777777778e-02 449 296 -1.94444444444444e-01 449 245 -6.94444444444444e-02 449 394 -8.32667268468867e-17 449 310 8.01784447211976e-17 449 295 3.68628738645072e-18 449 244 -4.16666666666666e-02 449 393 -1.26231626063414e-16 449 309 -2.60615097211203e-17 449 294 1.66666666666667e-01 449 243 4.16666666666667e-02 449 392 2.22222222222222e-01 449 389 -4.44444444444444e-01 449 293 -1.94444444444444e-01 449 448 2.63677968348475e-16 449 391 -1.13988188327327e-16 449 388 3.32019974664741e-17 449 292 -1.66666666666667e-01 449 447 9.71445146547012e-17 449 390 2.08166817117217e-17 449 387 1.13417711637351e-17 449 291 1.14925430283463e-17 449 58 -4.16666666666666e-02 449 57 4.16666666666667e-02 449 158 -1.94444444444444e-01 449 44 -6.94444444444445e-02 449 157 -2.09810061034890e-17 449 43 4.16666666666667e-02 449 156 1.66666666666667e-01 449 42 4.16666666666667e-02 449 167 -2.77777777777778e-02 449 29 -6.94444444444444e-02 449 166 3.18213337624496e-17 449 28 4.16666666666667e-02 449 165 -6.48827237596794e-18 449 27 -4.16666666666667e-02 449 224 2.22222222222222e-01 449 59 -6.94444444444445e-02 449 164 -2.77777777777778e-02 449 149 -1.94444444444444e-01 449 14 -6.94444444444444e-02 449 223 -6.24500451351651e-17 449 163 1.50449992091309e-17 449 148 -1.88922228555599e-17 449 13 -4.16666666666667e-02 449 222 -2.62563272989888e-17 449 162 -3.11199904821230e-18 449 147 -1.66666666666667e-01 449 12 -4.16666666666667e-02 450 450 2.22222222222222e+00 450 280 4.16666666666667e-02 450 279 -6.94444444444444e-02 450 332 4.05220561966457e-18 450 284 -4.16666666666667e-02 450 331 -6.77626357803440e-19 450 283 -4.16666666666667e-02 450 330 -2.77777777777778e-02 450 282 -6.94444444444444e-02 450 329 -1.66666666666667e-01 450 272 -4.16666666666667e-02 450 328 8.05528332838840e-18 450 271 4.16666666666667e-02 450 327 -1.94444444444444e-01 450 270 -6.94444444444444e-02 450 305 1.66666666666667e-01 450 416 4.08507049801804e-17 450 326 4.06575814682064e-18 450 269 4.16666666666667e-02 450 304 -1.57615890825080e-17 450 415 -2.08166817117217e-17 450 325 1.93801138331784e-18 450 268 -4.16666666666667e-02 450 303 -1.94444444444444e-01 450 414 2.22222222222222e-01 450 324 -2.77777777777778e-02 450 267 -6.94444444444444e-02 450 314 -2.68475562961723e-17 450 257 -4.16666666666667e-02 450 313 1.66666666666667e-01 450 256 4.16666666666667e-02 450 312 -1.94444444444444e-01 450 255 -6.94444444444444e-02 450 413 6.93889390390723e-18 450 338 1.85601859402362e-17 450 323 1.74997006902738e-18 450 260 4.16666666666667e-02 450 412 3.45945196317601e-17 450 337 -1.66666666666667e-01 450 322 1.73472347597681e-18 450 259 -4.16666666666667e-02 450 411 2.22222222222222e-01 450 336 -1.94444444444444e-01 450 321 -2.77777777777779e-02 450 258 -6.94444444444444e-02 450 410 -2.58256110453100e-17 450 335 1.40183952770587e-17 450 320 1.66666666666667e-01 450 248 4.16666666666667e-02 450 409 3.30971771392513e-17 450 334 1.66666666666667e-01 450 319 7.18622752450548e-18 450 247 4.16666666666667e-02 450 408 -4.44444444444445e-01 450 333 -1.94444444444445e-01 450 318 -1.94444444444444e-01 450 246 -6.94444444444445e-02 450 395 -1.39887491239048e-16 450 452 1.38777878078145e-16 450 407 1.38777878078145e-17 450 311 -2.39879730662418e-17 450 296 -1.66666666666667e-01 450 404 3.68563093591659e-17 450 317 1.94139951510686e-18 450 245 -4.16666666666667e-02 450 394 -1.78227590563566e-16 450 451 1.52655665885959e-16 450 406 3.94255720464250e-17 450 310 -1.66666666666667e-01 450 295 -1.53008031592017e-17 450 403 -2.08166817117217e-17 450 316 2.08878324792910e-18 450 244 -4.16666666666667e-02 450 393 -4.44444444444444e-01 450 281 4.16666666666667e-02 450 405 2.22222222222222e-01 450 309 -1.94444444444444e-01 450 294 -1.94444444444444e-01 450 402 2.22222222222222e-01 450 315 -2.77777777777778e-02 450 243 -6.94444444444444e-02 451 451 2.22222222222222e+00 451 280 -6.94444444444444e-02 451 279 4.16666666666667e-02 451 332 -1.66666666666667e-01 451 284 -4.16666666666667e-02 451 331 -1.94444444444445e-01 451 283 -6.94444444444444e-02 451 330 1.11300129269215e-18 451 282 -4.16666666666667e-02 451 329 4.35036121709809e-18 451 272 4.16666666666667e-02 451 328 -2.77777777777778e-02 451 271 -6.94444444444444e-02 451 327 8.66006485272797e-18 451 270 4.16666666666667e-02 451 305 5.53349683782289e-17 451 416 -3.03458023683326e-17 451 326 1.66666666666667e-01 451 269 4.16666666666667e-02 451 304 -2.77777777777776e-02 451 415 2.22222222222222e-01 451 325 -1.94444444444445e-01 451 268 -6.94444444444445e-02 451 303 -1.70490791623346e-17 451 414 -1.38777878078145e-17 451 324 1.93801138331784e-18 451 267 -4.16666666666667e-02 451 314 3.71847463844638e-17 451 257 4.16666666666667e-02 451 313 -1.94444444444444e-01 451 256 -6.94444444444444e-02 451 312 1.66666666666667e-01 451 255 4.16666666666667e-02 451 413 4.79865340443242e-17 451 338 1.53346844770919e-17 451 323 1.66666666666667e-01 451 260 4.16666666666667e-02 451 412 -4.44444444444445e-01 451 337 -1.94444444444444e-01 451 322 -1.94444444444445e-01 451 259 -6.94444444444444e-02 451 411 4.37350639238181e-17 451 336 -1.66666666666667e-01 451 321 1.05879118406788e-18 451 258 -4.16666666666667e-02 451 410 -5.55111512312578e-17 451 335 1.16822784085313e-17 451 320 -1.96223652560931e-17 451 248 -4.16666666666667e-02 451 409 2.22222222222222e-01 451 334 -1.94444444444444e-01 451 319 -2.77777777777778e-02 451 247 -6.94444444444445e-02 451 408 2.84332019734324e-17 451 333 1.66666666666667e-01 451 318 8.56519716263549e-18 451 246 4.16666666666667e-02 451 395 2.08166817117217e-17 451 452 -8.32667268468867e-17 451 407 3.89381045852802e-17 451 311 -5.69070615283329e-17 451 296 -4.83164533772798e-17 451 404 -3.20697261742319e-17 451 317 -1.66666666666667e-01 451 245 -4.16666666666668e-02 451 394 2.22222222222223e-01 451 281 -4.16666666666667e-02 451 406 -4.44444444444445e-01 451 310 -1.94444444444445e-01 451 295 -2.77777777777777e-02 451 403 2.22222222222222e-01 451 316 -1.94444444444445e-01 451 244 -6.94444444444445e-02 451 393 -1.82368311126219e-16 451 450 1.80411241501588e-16 451 405 3.49079218222442e-17 451 309 -1.66666666666667e-01 451 294 -1.56006528225297e-17 451 402 -6.93889390390723e-18 451 315 -1.42301535138722e-18 451 243 -4.16666666666667e-02 452 452 2.22222222222222e+00 452 280 -4.16666666666667e-02 452 279 4.16666666666667e-02 452 332 -1.94444444444445e-01 452 284 -6.94444444444444e-02 452 331 -1.66666666666667e-01 452 283 -4.16666666666667e-02 452 330 1.83297929785831e-18 452 282 -4.16666666666667e-02 452 329 -1.94444444444444e-01 452 272 -6.94444444444444e-02 452 328 -4.54009659728305e-19 452 271 4.16666666666667e-02 452 327 -1.66666666666667e-01 452 270 -4.16666666666667e-02 452 305 -1.94444444444444e-01 452 416 -4.44444444444445e-01 452 326 -1.94444444444445e-01 452 269 -6.94444444444445e-02 452 304 5.32055275488316e-17 452 415 -3.55933832348098e-17 452 325 1.66666666666667e-01 452 268 4.16666666666667e-02 452 303 1.66666666666667e-01 452 414 3.34018972420261e-17 452 324 1.76521666207796e-18 452 267 4.16666666666667e-02 452 314 -2.77777777777776e-02 452 257 -6.94444444444445e-02 452 313 3.41930260147616e-17 452 256 4.16666666666667e-02 452 312 -2.73218947466347e-17 452 255 -4.16666666666667e-02 452 413 2.22222222222222e-01 452 338 -2.77777777777778e-02 452 323 -1.94444444444445e-01 452 260 -6.94444444444445e-02 452 412 4.49537325766802e-17 452 337 1.43250212039647e-17 452 322 1.66666666666667e-01 452 259 4.16666666666667e-02 452 411 6.93889390390723e-18 452 336 1.89735380184963e-17 452 321 3.63207727782644e-18 452 258 4.16666666666667e-02 452 410 2.22222222222222e-01 452 335 -2.77777777777778e-02 452 320 -1.94444444444444e-01 452 248 -6.94444444444445e-02 452 409 -4.85722573273506e-17 452 334 1.27156586041816e-17 452 319 -1.67509235649010e-17 452 247 -4.16666666666667e-02 452 408 -2.12300337899818e-17 452 333 1.34305544116642e-17 452 318 1.66666666666667e-01 452 246 4.16666666666667e-02 452 395 2.22222222222223e-01 452 281 -6.94444444444444e-02 452 407 2.22222222222222e-01 452 311 -2.77777777777778e-02 452 296 -1.94444444444445e-01 452 404 -4.44444444444445e-01 452 317 -1.94444444444445e-01 452 245 -6.94444444444445e-02 452 394 2.77555756156289e-17 452 451 -8.32667268468867e-17 452 406 3.94753352320762e-17 452 310 -5.59634668250916e-17 452 295 -4.71356894488073e-17 452 403 -2.76742604526925e-17 452 316 -1.66666666666667e-01 452 244 -4.16666666666668e-02 452 393 -1.39848951239948e-16 452 450 1.11022302462516e-16 452 405 6.93889390390723e-18 452 309 -2.39896671321363e-17 452 294 -1.66666666666667e-01 452 402 3.35187877887472e-17 452 315 3.51010453342182e-18 452 243 -4.16666666666667e-02 453 453 2.22222222222222e+00 453 283 4.16666666666667e-02 453 282 -6.94444444444444e-02 453 356 3.21194893598831e-18 453 287 -4.16666666666667e-02 453 355 -5.67850887839283e-18 453 286 -4.16666666666667e-02 453 354 -2.77777777777778e-02 453 285 -6.94444444444444e-02 453 353 -1.66666666666667e-01 453 275 -4.16666666666667e-02 453 352 1.71168417981149e-17 453 274 4.16666666666667e-02 453 351 -1.94444444444444e-01 453 273 -6.94444444444445e-02 453 329 1.66666666666667e-01 453 431 -1.60021464395282e-17 453 350 8.21283145657770e-18 453 272 4.16666666666667e-02 453 328 5.66495635123676e-18 453 430 -1.38777878078145e-17 453 349 -3.98783111567325e-18 453 271 -4.16666666666667e-02 453 327 -1.94444444444444e-01 453 429 2.22222222222222e-01 453 348 -2.77777777777778e-02 453 270 -6.94444444444444e-02 453 338 -3.40168431617327e-17 453 260 -4.16666666666667e-02 453 337 1.66666666666667e-01 453 259 4.16666666666667e-02 453 336 -1.94444444444445e-01 453 258 -6.94444444444444e-02 453 428 3.46944695195361e-17 453 362 1.05438661274215e-17 453 347 3.60158409172529e-18 453 263 4.16666666666667e-02 453 427 -5.80014280961855e-17 453 361 -1.66666666666667e-01 453 346 -5.55653613398821e-18 453 262 -4.16666666666667e-02 453 426 2.22222222222222e-01 453 360 -1.94444444444444e-01 453 345 -2.77777777777778e-02 453 261 -6.94444444444444e-02 453 425 1.94398720076072e-16 453 359 6.19181084442894e-18 453 344 1.66666666666667e-01 453 251 4.16666666666667e-02 453 424 1.71466150062109e-16 453 358 1.66666666666667e-01 453 343 1.69796224606597e-17 453 250 4.16666666666667e-02 453 423 -4.44444444444444e-01 453 357 -1.94444444444444e-01 453 342 -1.94444444444444e-01 453 249 -6.94444444444444e-02 453 410 -1.49874009687176e-16 453 455 0.00000000000000e+00 453 422 3.46944695195361e-17 453 335 -3.27564581362183e-17 453 320 -1.66666666666667e-01 453 419 -1.40872167040231e-17 453 341 2.80706718720075e-18 453 248 -4.16666666666667e-02 453 409 4.71119725262842e-17 453 454 -2.22044604925031e-16 453 421 -5.30642848048770e-17 453 334 -1.66666666666667e-01 453 319 5.66495635123676e-18 453 418 -1.38777878078145e-17 453 340 -4.87721571029026e-18 453 247 -4.16666666666667e-02 453 408 -4.44444444444445e-01 453 284 4.16666666666667e-02 453 420 2.22222222222222e-01 453 333 -1.94444444444445e-01 453 318 -1.94444444444445e-01 453 417 2.22222222222222e-01 453 339 -2.77777777777778e-02 453 246 -6.94444444444444e-02 454 454 2.22222222222222e+00 454 283 -6.94444444444444e-02 454 282 4.16666666666667e-02 454 356 -1.66666666666667e-01 454 287 -4.16666666666667e-02 454 355 -1.94444444444445e-01 454 286 -6.94444444444444e-02 454 354 -5.20417042793042e-18 454 285 -4.16666666666667e-02 454 353 3.73914224235938e-17 454 275 4.16666666666667e-02 454 352 -2.77777777777777e-02 454 274 -6.94444444444445e-02 454 351 1.54634334850745e-17 454 273 4.16666666666667e-02 454 329 -1.03541307472366e-17 454 431 -9.61382395133631e-18 454 350 1.66666666666667e-01 454 272 4.16666666666666e-02 454 328 -2.77777777777777e-02 454 430 2.22222222222222e-01 454 349 -1.94444444444445e-01 454 271 -6.94444444444444e-02 454 327 5.90381964236247e-18 454 429 -6.93889390390723e-18 454 348 -4.79759461324836e-18 454 270 -4.16666666666667e-02 454 338 3.64630743134031e-17 454 260 4.16666666666667e-02 454 337 -1.94444444444445e-01 454 259 -6.94444444444444e-02 454 336 1.66666666666667e-01 454 258 4.16666666666667e-02 454 428 1.44865927386535e-17 454 362 8.02106319731932e-17 454 347 1.66666666666667e-01 454 263 4.16666666666667e-02 454 427 -4.44444444444445e-01 454 361 -1.94444444444444e-01 454 346 -1.94444444444445e-01 454 262 -6.94444444444444e-02 454 426 -5.50819172852367e-17 454 360 -1.66666666666667e-01 454 345 -3.98613704977874e-18 454 261 -4.16666666666667e-02 454 425 -6.93889390390723e-17 454 359 -2.40963932834903e-17 454 344 -6.03544856236579e-17 454 251 -4.16666666666667e-02 454 424 2.22222222222223e-01 454 358 -1.94444444444445e-01 454 343 -2.77777777777778e-02 454 250 -6.94444444444445e-02 454 423 1.65024040981766e-16 454 357 1.66666666666667e-01 454 342 1.68051336735253e-17 454 249 4.16666666666667e-02 454 410 5.55111512312578e-17 454 455 1.38777878078145e-17 454 422 1.08911496357958e-17 454 335 -6.97684097994422e-17 454 320 1.48959214104141e-17 454 419 -1.51629485470360e-17 454 341 -1.66666666666667e-01 454 248 -4.16666666666667e-02 454 409 2.22222222222222e-01 454 284 -4.16666666666667e-02 454 421 -4.44444444444445e-01 454 334 -1.94444444444444e-01 454 319 -2.77777777777778e-02 454 418 2.22222222222222e-01 454 340 -1.94444444444445e-01 454 247 -6.94444444444444e-02 454 408 4.98027844414743e-17 454 453 -2.22044604925031e-16 454 420 -6.09829840705206e-17 454 333 -1.66666666666667e-01 454 318 6.23077436000263e-18 454 417 -6.93889390390723e-18 454 339 -4.81114714040443e-18 454 246 -4.16666666666667e-02 455 455 2.22222222222222e+00 455 283 -4.16666666666667e-02 455 282 4.16666666666667e-02 455 356 -1.94444444444444e-01 455 287 -6.94444444444445e-02 455 355 -1.66666666666667e-01 455 286 -4.16666666666667e-02 455 354 4.64851681453160e-18 455 285 -4.16666666666667e-02 455 353 -1.94444444444444e-01 455 275 -6.94444444444445e-02 455 352 3.50282005007543e-17 455 274 4.16666666666667e-02 455 351 -1.66666666666667e-01 455 273 -4.16666666666667e-02 455 329 -1.94444444444444e-01 455 431 -4.44444444444445e-01 455 350 -1.94444444444445e-01 455 272 -6.94444444444444e-02 455 328 -9.42747670294036e-18 455 430 -1.51595604152470e-17 455 349 1.66666666666667e-01 455 271 4.16666666666666e-02 455 327 1.66666666666667e-01 455 429 -1.42091894484277e-17 455 348 2.72236389247532e-18 455 270 4.16666666666667e-02 455 338 -2.77777777777778e-02 455 260 -6.94444444444445e-02 455 337 3.40710532703570e-17 455 259 4.16666666666667e-02 455 336 -3.49434972060289e-17 455 258 -4.16666666666667e-02 455 428 2.22222222222222e-01 455 362 -2.77777777777777e-02 455 347 -1.94444444444445e-01 455 263 -6.94444444444445e-02 455 427 2.17196188334948e-17 455 361 8.07595093230140e-17 455 346 1.66666666666667e-01 455 262 4.16666666666667e-02 455 426 3.46944695195361e-17 455 360 8.70072243419617e-18 455 345 5.71916645986104e-18 455 261 4.16666666666667e-02 455 425 2.22222222222223e-01 455 359 -2.77777777777778e-02 455 344 -1.94444444444445e-01 455 251 -6.94444444444445e-02 455 424 -6.93889390390723e-17 455 358 -2.06997911650006e-17 455 343 -5.98615124483559e-17 455 250 -4.16666666666667e-02 455 423 1.98439490750948e-16 455 357 5.36680075380325e-18 455 342 1.66666666666667e-01 455 249 4.16666666666667e-02 455 410 2.22222222222222e-01 455 284 -6.94444444444444e-02 455 422 2.22222222222222e-01 455 335 -2.77777777777778e-02 455 320 -1.94444444444445e-01 455 419 -4.44444444444445e-01 455 341 -1.94444444444445e-01 455 248 -6.94444444444445e-02 455 409 6.93889390390723e-17 455 454 1.38777878078145e-17 455 421 4.04775869669149e-18 455 334 -7.17724897526459e-17 455 319 1.91361683443692e-17 455 418 -1.49128620693592e-17 455 340 -1.66666666666667e-01 455 247 -4.16666666666667e-02 455 408 -1.48726491801883e-16 455 453 0.00000000000000e+00 455 420 3.46944695195361e-17 455 333 -3.23939280347935e-17 455 318 -1.66666666666667e-01 455 417 -1.68830607046727e-17 455 339 6.57297567069337e-18 455 246 -4.16666666666667e-02 456 456 2.22222222222222e+00 456 286 4.16666666666667e-02 456 285 -6.94444444444444e-02 456 380 -9.89334482393023e-18 456 290 -4.16666666666667e-02 456 379 -7.72494047895922e-19 456 289 -4.16666666666667e-02 456 378 -2.77777777777778e-02 456 288 -6.94444444444444e-02 456 377 -1.66666666666667e-01 456 278 -4.16666666666667e-02 456 376 3.03237795117040e-18 456 277 4.16666666666667e-02 456 375 -1.94444444444444e-01 456 276 -6.94444444444444e-02 456 353 1.66666666666667e-01 456 446 -3.01221856702574e-17 456 374 -1.09639944692597e-17 456 275 4.16666666666667e-02 456 352 5.96311194867027e-18 456 445 -6.93889390390723e-18 456 373 -2.81214938488428e-18 456 274 -4.16666666666667e-02 456 351 -1.94444444444444e-01 456 444 2.22222222222222e-01 456 372 -2.77777777777778e-02 456 273 -6.94444444444444e-02 456 362 1.21159592775255e-17 456 263 -4.16666666666667e-02 456 361 1.66666666666667e-01 456 262 4.16666666666667e-02 456 360 -1.94444444444444e-01 456 261 -6.94444444444444e-02 456 443 -4.85722573273506e-17 456 386 1.87566975839992e-17 456 371 -1.08352454612770e-17 456 266 4.16666666666667e-02 456 442 9.80694746331029e-18 456 385 -1.66666666666667e-01 456 370 -2.50721752387273e-18 456 265 -4.16666666666667e-02 456 441 2.22222222222222e-01 456 384 -1.94444444444444e-01 456 369 -2.77777777777778e-02 456 264 -6.94444444444444e-02 456 440 8.12673055748930e-17 456 383 1.43080805450196e-17 456 368 1.66666666666667e-01 456 254 4.16666666666667e-02 456 439 -8.24247760973160e-18 456 382 1.66666666666667e-01 456 367 2.04304346877737e-18 456 253 4.16666666666667e-02 456 438 -4.44444444444445e-01 456 381 -1.94444444444444e-01 456 366 -1.94444444444445e-01 456 252 -6.94444444444444e-02 456 425 5.64682984616552e-17 456 458 -1.66533453693773e-16 456 437 -4.85722573273506e-17 456 359 1.52736981048895e-17 456 344 -1.66666666666667e-01 456 434 -2.77634106703910e-17 456 365 -9.69175098248370e-18 456 251 -4.16666666666667e-02 456 424 -9.29872769495771e-18 456 457 5.55111512312578e-17 456 436 7.09707730680697e-18 456 358 -1.66666666666667e-01 456 343 7.03376159399971e-18 456 433 0.00000000000000e+00 456 364 -2.10233577508517e-18 456 250 -4.16666666666667e-02 456 423 -4.44444444444445e-01 456 287 4.16666666666667e-02 456 435 2.22222222222222e-01 456 357 -1.94444444444444e-01 456 342 -1.94444444444444e-01 456 432 2.22222222222222e-01 456 363 -2.77777777777778e-02 456 249 -6.94444444444444e-02 457 457 2.22222222222222e+00 457 286 -6.94444444444444e-02 457 285 4.16666666666667e-02 457 380 -1.66666666666667e-01 457 290 -4.16666666666667e-02 457 379 -1.94444444444444e-01 457 289 -6.94444444444444e-02 457 378 -3.26954717640160e-18 457 288 -4.16666666666667e-02 457 377 -7.92822838630025e-18 457 278 4.16666666666667e-02 457 376 -2.77777777777778e-02 457 277 -6.94444444444444e-02 457 375 3.67273485929465e-18 457 276 4.16666666666667e-02 457 353 2.98155597433514e-18 457 446 -1.58598449043895e-17 457 374 1.66666666666667e-01 457 275 4.16666666666667e-02 457 352 -2.77777777777778e-02 457 445 2.22222222222222e-01 457 373 -1.94444444444444e-01 457 274 -6.94444444444444e-02 457 351 4.49266275223681e-18 457 444 0.00000000000000e+00 457 372 -2.49366499671666e-18 457 273 -4.16666666666667e-02 457 362 -2.44148776716580e-17 457 263 4.16666666666667e-02 457 361 -1.94444444444444e-01 457 262 -6.94444444444444e-02 457 360 1.66666666666667e-01 457 261 4.16666666666667e-02 457 443 1.05510659074732e-17 457 386 3.70034813337514e-17 457 371 1.66666666666667e-01 457 266 4.16666666666667e-02 457 442 -4.44444444444444e-01 457 385 -1.94444444444444e-01 457 370 -1.94444444444444e-01 457 265 -6.94444444444444e-02 457 441 1.83848501201546e-18 457 384 -1.66666666666667e-01 457 369 -3.70492211129031e-18 457 264 -4.16666666666667e-02 457 440 -6.93889390390723e-18 457 383 -1.67102659834328e-17 457 368 -6.15962359243327e-18 457 254 -4.16666666666667e-02 457 439 2.22222222222222e-01 457 382 -1.94444444444444e-01 457 367 -2.77777777777778e-02 457 253 -6.94444444444444e-02 457 438 -1.10317571050400e-17 457 381 1.66666666666667e-01 457 366 3.36102673470506e-18 457 252 4.16666666666667e-02 457 425 2.08166817117217e-17 457 458 0.00000000000000e+00 457 437 1.33831205666179e-19 457 359 1.80655186990397e-17 457 344 -2.90362894318774e-18 457 434 -7.15213444837850e-18 457 365 -1.66666666666667e-01 457 251 -4.16666666666667e-02 457 424 2.22222222222222e-01 457 287 -4.16666666666667e-02 457 436 -4.44444444444445e-01 457 358 -1.94444444444444e-01 457 343 -2.77777777777778e-02 457 433 2.22222222222222e-01 457 364 -1.94444444444444e-01 457 250 -6.94444444444444e-02 457 423 -1.10683912800088e-17 457 456 5.55111512312578e-17 457 435 9.91536768055884e-18 457 357 -1.66666666666667e-01 457 342 6.09355502254744e-18 457 432 6.93889390390723e-18 457 363 -3.37457926186113e-18 457 249 -4.16666666666667e-02 458 458 2.22222222222222e+00 458 286 -4.16666666666667e-02 458 285 4.16666666666667e-02 458 380 -1.94444444444444e-01 458 290 -6.94444444444444e-02 458 379 -1.66666666666667e-01 458 289 -4.16666666666666e-02 458 378 -1.00051531729678e-17 458 288 -4.16666666666667e-02 458 377 -1.94444444444444e-01 458 278 -6.94444444444444e-02 458 376 -8.39748463907913e-18 458 277 4.16666666666667e-02 458 375 -1.66666666666667e-01 458 276 -4.16666666666667e-02 458 353 -1.94444444444444e-01 458 446 -4.44444444444445e-01 458 374 -1.94444444444444e-01 458 275 -6.94444444444444e-02 458 352 7.62329652528870e-19 458 445 -1.04439162396455e-17 458 373 1.66666666666667e-01 458 274 4.16666666666667e-02 458 351 1.66666666666667e-01 458 444 -2.78178325372521e-17 458 372 -1.10774968841917e-17 458 273 4.16666666666667e-02 458 362 -2.77777777777778e-02 458 263 -6.94444444444444e-02 458 361 -2.51670429288198e-17 458 262 4.16666666666667e-02 458 360 1.14044516018319e-17 458 261 -4.16666666666667e-02 458 443 2.22222222222222e-01 458 386 -2.77777777777778e-02 458 371 -1.94444444444445e-01 458 266 -6.94444444444445e-02 458 442 1.21142652116310e-17 458 385 3.78386558197441e-17 458 370 1.66666666666667e-01 458 265 4.16666666666667e-02 458 441 -3.46944695195361e-17 458 384 2.02068179896986e-17 458 369 -1.00830802041152e-17 458 264 4.16666666666667e-02 458 440 2.22222222222222e-01 458 383 -2.77777777777778e-02 458 368 -1.94444444444444e-01 458 254 -6.94444444444445e-02 458 439 -6.93889390390723e-18 458 382 -1.83975556143634e-17 458 367 -6.51876556206910e-18 458 253 -4.16666666666667e-02 458 438 8.37952754059734e-17 458 381 1.49077798716757e-17 458 366 1.66666666666667e-01 458 252 4.16666666666667e-02 458 425 2.22222222222222e-01 458 287 -6.94444444444444e-02 458 437 2.22222222222222e-01 458 359 -2.77777777777778e-02 458 344 -1.94444444444444e-01 458 434 -4.44444444444445e-01 458 365 -1.94444444444444e-01 458 251 -6.94444444444444e-02 458 424 1.38777878078145e-17 458 457 0.00000000000000e+00 458 436 1.69935985042894e-18 458 358 2.00136944777246e-17 458 343 -3.40168431617327e-18 458 433 -1.30002616744590e-17 458 364 -1.66666666666667e-01 458 250 -4.16666666666667e-02 458 423 5.77665882115592e-17 458 456 -1.66533453693773e-16 458 435 -4.16333634234434e-17 458 357 1.49298027283043e-17 458 342 -1.66666666666667e-01 458 432 -3.00256239142704e-17 458 363 -9.98821251402271e-18 458 249 -4.16666666666667e-02 hypre-2.33.0/src/test/TEST_ij/data/beam_hex_dof459_np2/b.IJ.00000000066400000000000000000000135231477326011500234040ustar00rootroot000000000000000 242 0 0.00000000000000e+00 1 0.00000000000000e+00 2 0.00000000000000e+00 3 0.00000000000000e+00 4 0.00000000000000e+00 5 0.00000000000000e+00 6 0.00000000000000e+00 7 0.00000000000000e+00 8 0.00000000000000e+00 9 0.00000000000000e+00 10 0.00000000000000e+00 11 0.00000000000000e+00 12 0.00000000000000e+00 13 0.00000000000000e+00 14 0.00000000000000e+00 15 0.00000000000000e+00 16 0.00000000000000e+00 17 0.00000000000000e+00 18 0.00000000000000e+00 19 0.00000000000000e+00 20 0.00000000000000e+00 21 0.00000000000000e+00 22 0.00000000000000e+00 23 0.00000000000000e+00 24 0.00000000000000e+00 25 0.00000000000000e+00 26 0.00000000000000e+00 27 0.00000000000000e+00 28 0.00000000000000e+00 29 0.00000000000000e+00 30 0.00000000000000e+00 31 0.00000000000000e+00 32 0.00000000000000e+00 33 0.00000000000000e+00 34 0.00000000000000e+00 35 0.00000000000000e+00 36 0.00000000000000e+00 37 0.00000000000000e+00 38 0.00000000000000e+00 39 0.00000000000000e+00 40 0.00000000000000e+00 41 0.00000000000000e+00 42 0.00000000000000e+00 43 0.00000000000000e+00 44 0.00000000000000e+00 45 0.00000000000000e+00 46 0.00000000000000e+00 47 0.00000000000000e+00 48 0.00000000000000e+00 49 0.00000000000000e+00 50 0.00000000000000e+00 51 0.00000000000000e+00 52 0.00000000000000e+00 53 0.00000000000000e+00 54 0.00000000000000e+00 55 0.00000000000000e+00 56 0.00000000000000e+00 57 0.00000000000000e+00 58 0.00000000000000e+00 59 0.00000000000000e+00 60 0.00000000000000e+00 61 0.00000000000000e+00 62 0.00000000000000e+00 63 0.00000000000000e+00 64 0.00000000000000e+00 65 0.00000000000000e+00 66 0.00000000000000e+00 67 0.00000000000000e+00 68 0.00000000000000e+00 69 0.00000000000000e+00 70 0.00000000000000e+00 71 0.00000000000000e+00 72 0.00000000000000e+00 73 0.00000000000000e+00 74 0.00000000000000e+00 75 0.00000000000000e+00 76 0.00000000000000e+00 77 0.00000000000000e+00 78 0.00000000000000e+00 79 0.00000000000000e+00 80 0.00000000000000e+00 81 0.00000000000000e+00 82 0.00000000000000e+00 83 0.00000000000000e+00 84 0.00000000000000e+00 85 0.00000000000000e+00 86 0.00000000000000e+00 87 0.00000000000000e+00 88 0.00000000000000e+00 89 0.00000000000000e+00 90 0.00000000000000e+00 91 0.00000000000000e+00 92 0.00000000000000e+00 93 0.00000000000000e+00 94 0.00000000000000e+00 95 0.00000000000000e+00 96 0.00000000000000e+00 97 0.00000000000000e+00 98 0.00000000000000e+00 99 0.00000000000000e+00 100 0.00000000000000e+00 101 0.00000000000000e+00 102 0.00000000000000e+00 103 0.00000000000000e+00 104 0.00000000000000e+00 105 0.00000000000000e+00 106 0.00000000000000e+00 107 0.00000000000000e+00 108 0.00000000000000e+00 109 0.00000000000000e+00 110 0.00000000000000e+00 111 0.00000000000000e+00 112 0.00000000000000e+00 113 0.00000000000000e+00 114 0.00000000000000e+00 115 0.00000000000000e+00 116 0.00000000000000e+00 117 0.00000000000000e+00 118 0.00000000000000e+00 119 0.00000000000000e+00 120 0.00000000000000e+00 121 0.00000000000000e+00 122 0.00000000000000e+00 123 0.00000000000000e+00 124 0.00000000000000e+00 125 0.00000000000000e+00 126 0.00000000000000e+00 127 0.00000000000000e+00 128 0.00000000000000e+00 129 0.00000000000000e+00 130 0.00000000000000e+00 131 0.00000000000000e+00 132 0.00000000000000e+00 133 0.00000000000000e+00 134 0.00000000000000e+00 135 0.00000000000000e+00 136 0.00000000000000e+00 137 0.00000000000000e+00 138 0.00000000000000e+00 139 0.00000000000000e+00 140 0.00000000000000e+00 141 0.00000000000000e+00 142 0.00000000000000e+00 143 0.00000000000000e+00 144 0.00000000000000e+00 145 0.00000000000000e+00 146 0.00000000000000e+00 147 0.00000000000000e+00 148 0.00000000000000e+00 149 0.00000000000000e+00 150 0.00000000000000e+00 151 0.00000000000000e+00 152 0.00000000000000e+00 153 0.00000000000000e+00 154 0.00000000000000e+00 155 0.00000000000000e+00 156 0.00000000000000e+00 157 0.00000000000000e+00 158 0.00000000000000e+00 159 0.00000000000000e+00 160 0.00000000000000e+00 161 0.00000000000000e+00 162 0.00000000000000e+00 163 0.00000000000000e+00 164 0.00000000000000e+00 165 0.00000000000000e+00 166 0.00000000000000e+00 167 0.00000000000000e+00 168 0.00000000000000e+00 169 0.00000000000000e+00 170 0.00000000000000e+00 171 0.00000000000000e+00 172 0.00000000000000e+00 173 0.00000000000000e+00 174 0.00000000000000e+00 175 0.00000000000000e+00 176 0.00000000000000e+00 177 0.00000000000000e+00 178 0.00000000000000e+00 179 0.00000000000000e+00 180 0.00000000000000e+00 181 0.00000000000000e+00 182 0.00000000000000e+00 183 0.00000000000000e+00 184 0.00000000000000e+00 185 0.00000000000000e+00 186 0.00000000000000e+00 187 0.00000000000000e+00 188 0.00000000000000e+00 189 0.00000000000000e+00 190 0.00000000000000e+00 191 0.00000000000000e+00 192 0.00000000000000e+00 193 0.00000000000000e+00 194 0.00000000000000e+00 195 0.00000000000000e+00 196 0.00000000000000e+00 197 0.00000000000000e+00 198 0.00000000000000e+00 199 0.00000000000000e+00 200 0.00000000000000e+00 201 0.00000000000000e+00 202 0.00000000000000e+00 203 0.00000000000000e+00 204 0.00000000000000e+00 205 0.00000000000000e+00 206 0.00000000000000e+00 207 0.00000000000000e+00 208 0.00000000000000e+00 209 0.00000000000000e+00 210 0.00000000000000e+00 211 0.00000000000000e+00 212 0.00000000000000e+00 213 0.00000000000000e+00 214 0.00000000000000e+00 215 0.00000000000000e+00 216 0.00000000000000e+00 217 0.00000000000000e+00 218 0.00000000000000e+00 219 0.00000000000000e+00 220 0.00000000000000e+00 221 0.00000000000000e+00 222 0.00000000000000e+00 223 0.00000000000000e+00 224 0.00000000000000e+00 225 0.00000000000000e+00 226 0.00000000000000e+00 227 0.00000000000000e+00 228 0.00000000000000e+00 229 0.00000000000000e+00 230 0.00000000000000e+00 231 0.00000000000000e+00 232 0.00000000000000e+00 233 0.00000000000000e+00 234 0.00000000000000e+00 235 0.00000000000000e+00 236 0.00000000000000e+00 237 0.00000000000000e+00 238 0.00000000000000e+00 239 0.00000000000000e+00 240 0.00000000000000e+00 241 0.00000000000000e+00 242 0.00000000000000e+00 hypre-2.33.0/src/test/TEST_ij/data/beam_hex_dof459_np2/b.IJ.00001000066400000000000000000000124511477326011500234040ustar00rootroot00000000000000243 458 243 0.00000000000000e+00 244 0.00000000000000e+00 245 0.00000000000000e+00 246 0.00000000000000e+00 247 0.00000000000000e+00 248 0.00000000000000e+00 249 0.00000000000000e+00 250 0.00000000000000e+00 251 0.00000000000000e+00 252 0.00000000000000e+00 253 0.00000000000000e+00 254 -6.25000000000000e-04 255 0.00000000000000e+00 256 0.00000000000000e+00 257 0.00000000000000e+00 258 0.00000000000000e+00 259 0.00000000000000e+00 260 0.00000000000000e+00 261 0.00000000000000e+00 262 0.00000000000000e+00 263 0.00000000000000e+00 264 0.00000000000000e+00 265 0.00000000000000e+00 266 -6.25000000000000e-04 267 0.00000000000000e+00 268 0.00000000000000e+00 269 0.00000000000000e+00 270 0.00000000000000e+00 271 0.00000000000000e+00 272 0.00000000000000e+00 273 0.00000000000000e+00 274 0.00000000000000e+00 275 0.00000000000000e+00 276 0.00000000000000e+00 277 0.00000000000000e+00 278 -6.25000000000000e-04 279 0.00000000000000e+00 280 0.00000000000000e+00 281 0.00000000000000e+00 282 0.00000000000000e+00 283 0.00000000000000e+00 284 0.00000000000000e+00 285 0.00000000000000e+00 286 0.00000000000000e+00 287 0.00000000000000e+00 288 0.00000000000000e+00 289 0.00000000000000e+00 290 -6.25000000000000e-04 291 0.00000000000000e+00 292 0.00000000000000e+00 293 0.00000000000000e+00 294 0.00000000000000e+00 295 0.00000000000000e+00 296 0.00000000000000e+00 297 0.00000000000000e+00 298 0.00000000000000e+00 299 0.00000000000000e+00 300 0.00000000000000e+00 301 0.00000000000000e+00 302 0.00000000000000e+00 303 0.00000000000000e+00 304 0.00000000000000e+00 305 0.00000000000000e+00 306 0.00000000000000e+00 307 0.00000000000000e+00 308 0.00000000000000e+00 309 0.00000000000000e+00 310 0.00000000000000e+00 311 0.00000000000000e+00 312 0.00000000000000e+00 313 0.00000000000000e+00 314 0.00000000000000e+00 315 0.00000000000000e+00 316 0.00000000000000e+00 317 0.00000000000000e+00 318 0.00000000000000e+00 319 0.00000000000000e+00 320 0.00000000000000e+00 321 0.00000000000000e+00 322 0.00000000000000e+00 323 0.00000000000000e+00 324 0.00000000000000e+00 325 0.00000000000000e+00 326 0.00000000000000e+00 327 0.00000000000000e+00 328 0.00000000000000e+00 329 0.00000000000000e+00 330 0.00000000000000e+00 331 0.00000000000000e+00 332 0.00000000000000e+00 333 0.00000000000000e+00 334 0.00000000000000e+00 335 0.00000000000000e+00 336 0.00000000000000e+00 337 0.00000000000000e+00 338 0.00000000000000e+00 339 0.00000000000000e+00 340 0.00000000000000e+00 341 0.00000000000000e+00 342 0.00000000000000e+00 343 0.00000000000000e+00 344 0.00000000000000e+00 345 0.00000000000000e+00 346 0.00000000000000e+00 347 0.00000000000000e+00 348 0.00000000000000e+00 349 0.00000000000000e+00 350 0.00000000000000e+00 351 0.00000000000000e+00 352 0.00000000000000e+00 353 0.00000000000000e+00 354 0.00000000000000e+00 355 0.00000000000000e+00 356 0.00000000000000e+00 357 0.00000000000000e+00 358 0.00000000000000e+00 359 0.00000000000000e+00 360 0.00000000000000e+00 361 0.00000000000000e+00 362 0.00000000000000e+00 363 0.00000000000000e+00 364 0.00000000000000e+00 365 0.00000000000000e+00 366 0.00000000000000e+00 367 0.00000000000000e+00 368 -1.25000000000000e-03 369 0.00000000000000e+00 370 0.00000000000000e+00 371 0.00000000000000e+00 372 0.00000000000000e+00 373 0.00000000000000e+00 374 0.00000000000000e+00 375 0.00000000000000e+00 376 0.00000000000000e+00 377 -1.25000000000000e-03 378 0.00000000000000e+00 379 0.00000000000000e+00 380 0.00000000000000e+00 381 0.00000000000000e+00 382 0.00000000000000e+00 383 -1.25000000000000e-03 384 0.00000000000000e+00 385 0.00000000000000e+00 386 -1.25000000000000e-03 387 0.00000000000000e+00 388 0.00000000000000e+00 389 0.00000000000000e+00 390 0.00000000000000e+00 391 0.00000000000000e+00 392 0.00000000000000e+00 393 0.00000000000000e+00 394 0.00000000000000e+00 395 0.00000000000000e+00 396 0.00000000000000e+00 397 0.00000000000000e+00 398 0.00000000000000e+00 399 0.00000000000000e+00 400 0.00000000000000e+00 401 0.00000000000000e+00 402 0.00000000000000e+00 403 0.00000000000000e+00 404 0.00000000000000e+00 405 0.00000000000000e+00 406 0.00000000000000e+00 407 0.00000000000000e+00 408 0.00000000000000e+00 409 0.00000000000000e+00 410 0.00000000000000e+00 411 0.00000000000000e+00 412 0.00000000000000e+00 413 0.00000000000000e+00 414 0.00000000000000e+00 415 0.00000000000000e+00 416 0.00000000000000e+00 417 0.00000000000000e+00 418 0.00000000000000e+00 419 0.00000000000000e+00 420 0.00000000000000e+00 421 0.00000000000000e+00 422 0.00000000000000e+00 423 0.00000000000000e+00 424 0.00000000000000e+00 425 0.00000000000000e+00 426 0.00000000000000e+00 427 0.00000000000000e+00 428 0.00000000000000e+00 429 0.00000000000000e+00 430 0.00000000000000e+00 431 0.00000000000000e+00 432 0.00000000000000e+00 433 0.00000000000000e+00 434 0.00000000000000e+00 435 0.00000000000000e+00 436 0.00000000000000e+00 437 0.00000000000000e+00 438 0.00000000000000e+00 439 0.00000000000000e+00 440 -2.50000000000000e-03 441 0.00000000000000e+00 442 0.00000000000000e+00 443 0.00000000000000e+00 444 0.00000000000000e+00 445 0.00000000000000e+00 446 0.00000000000000e+00 447 0.00000000000000e+00 448 0.00000000000000e+00 449 0.00000000000000e+00 450 0.00000000000000e+00 451 0.00000000000000e+00 452 0.00000000000000e+00 453 0.00000000000000e+00 454 0.00000000000000e+00 455 0.00000000000000e+00 456 0.00000000000000e+00 457 0.00000000000000e+00 458 0.00000000000000e+00 hypre-2.33.0/src/test/TEST_ij/data/beam_hex_dof459_np2/mfem.txt000066400000000000000000000007531477326011500237670ustar00rootroot00000000000000$ mpirun -np 2 ./ex2p -m ../beam-hex.mesh -sr 0 -sp 1 Produced with mfem-4.4 (https://github.com/mfem/mfem/archive/refs/tags/v4.4.tar.gz) Options used: --mesh ../beam-hex.mesh --order 1 --serial_ref 0 --parallel_ref 1 --amg-for-systems --no-static-condensation --visualization --by-vdim --device cpu Device configuration: cpu Memory configuration: host-std Number of finite element unknowns: 459 Assembling: r.h.s. ... matrix ... done. Size of linear system: 459hypre-2.33.0/src/test/TEST_ij/data/beam_hex_dof459_np2/rbms.0.00000000066400000000000000000000136331477326011500237650ustar00rootroot000000000000000 243 0 0.00000000000000e+00 1 0.00000000000000e+00 2 0.00000000000000e+00 3 0.00000000000000e+00 4 -1.00000000000000e+00 5 0.00000000000000e+00 6 0.00000000000000e+00 7 -2.00000000000000e+00 8 0.00000000000000e+00 9 0.00000000000000e+00 10 -3.00000000000000e+00 11 0.00000000000000e+00 12 0.00000000000000e+00 13 -4.00000000000000e+00 14 0.00000000000000e+00 15 1.00000000000000e+00 16 0.00000000000000e+00 17 0.00000000000000e+00 18 1.00000000000000e+00 19 -1.00000000000000e+00 20 0.00000000000000e+00 21 1.00000000000000e+00 22 -2.00000000000000e+00 23 0.00000000000000e+00 24 1.00000000000000e+00 25 -3.00000000000000e+00 26 0.00000000000000e+00 27 1.00000000000000e+00 28 -4.00000000000000e+00 29 0.00000000000000e+00 30 0.00000000000000e+00 31 0.00000000000000e+00 32 0.00000000000000e+00 33 0.00000000000000e+00 34 -1.00000000000000e+00 35 0.00000000000000e+00 36 0.00000000000000e+00 37 -2.00000000000000e+00 38 0.00000000000000e+00 39 0.00000000000000e+00 40 -3.00000000000000e+00 41 0.00000000000000e+00 42 0.00000000000000e+00 43 -4.00000000000000e+00 44 0.00000000000000e+00 45 1.00000000000000e+00 46 0.00000000000000e+00 47 0.00000000000000e+00 48 1.00000000000000e+00 49 -1.00000000000000e+00 50 0.00000000000000e+00 51 1.00000000000000e+00 52 -2.00000000000000e+00 53 0.00000000000000e+00 54 1.00000000000000e+00 55 -3.00000000000000e+00 56 0.00000000000000e+00 57 1.00000000000000e+00 58 -4.00000000000000e+00 59 0.00000000000000e+00 60 0.00000000000000e+00 61 -5.00000000000000e-01 62 0.00000000000000e+00 63 5.00000000000000e-01 64 -1.00000000000000e+00 65 0.00000000000000e+00 66 1.00000000000000e+00 67 -5.00000000000000e-01 68 0.00000000000000e+00 69 5.00000000000000e-01 70 0.00000000000000e+00 71 0.00000000000000e+00 72 0.00000000000000e+00 73 -5.00000000000000e-01 74 0.00000000000000e+00 75 5.00000000000000e-01 76 -1.00000000000000e+00 77 0.00000000000000e+00 78 1.00000000000000e+00 79 -5.00000000000000e-01 80 0.00000000000000e+00 81 5.00000000000000e-01 82 0.00000000000000e+00 83 0.00000000000000e+00 84 0.00000000000000e+00 85 0.00000000000000e+00 86 0.00000000000000e+00 87 0.00000000000000e+00 88 -1.00000000000000e+00 89 0.00000000000000e+00 90 1.00000000000000e+00 91 -1.00000000000000e+00 92 0.00000000000000e+00 93 1.00000000000000e+00 94 0.00000000000000e+00 95 0.00000000000000e+00 96 0.00000000000000e+00 97 -1.50000000000000e+00 98 0.00000000000000e+00 99 5.00000000000000e-01 100 -2.00000000000000e+00 101 0.00000000000000e+00 102 1.00000000000000e+00 103 -1.50000000000000e+00 104 0.00000000000000e+00 105 0.00000000000000e+00 106 -1.50000000000000e+00 107 0.00000000000000e+00 108 5.00000000000000e-01 109 -2.00000000000000e+00 110 0.00000000000000e+00 111 1.00000000000000e+00 112 -1.50000000000000e+00 113 0.00000000000000e+00 114 0.00000000000000e+00 115 -2.00000000000000e+00 116 0.00000000000000e+00 117 1.00000000000000e+00 118 -2.00000000000000e+00 119 0.00000000000000e+00 120 0.00000000000000e+00 121 -2.50000000000000e+00 122 0.00000000000000e+00 123 5.00000000000000e-01 124 -3.00000000000000e+00 125 0.00000000000000e+00 126 1.00000000000000e+00 127 -2.50000000000000e+00 128 0.00000000000000e+00 129 0.00000000000000e+00 130 -2.50000000000000e+00 131 0.00000000000000e+00 132 5.00000000000000e-01 133 -3.00000000000000e+00 134 0.00000000000000e+00 135 1.00000000000000e+00 136 -2.50000000000000e+00 137 0.00000000000000e+00 138 0.00000000000000e+00 139 -3.00000000000000e+00 140 0.00000000000000e+00 141 1.00000000000000e+00 142 -3.00000000000000e+00 143 0.00000000000000e+00 144 0.00000000000000e+00 145 -3.50000000000000e+00 146 0.00000000000000e+00 147 5.00000000000000e-01 148 -4.00000000000000e+00 149 0.00000000000000e+00 150 1.00000000000000e+00 151 -3.50000000000000e+00 152 0.00000000000000e+00 153 0.00000000000000e+00 154 -3.50000000000000e+00 155 0.00000000000000e+00 156 5.00000000000000e-01 157 -4.00000000000000e+00 158 0.00000000000000e+00 159 1.00000000000000e+00 160 -3.50000000000000e+00 161 0.00000000000000e+00 162 0.00000000000000e+00 163 -4.00000000000000e+00 164 0.00000000000000e+00 165 1.00000000000000e+00 166 -4.00000000000000e+00 167 0.00000000000000e+00 168 5.00000000000000e-01 169 -5.00000000000000e-01 170 0.00000000000000e+00 171 0.00000000000000e+00 172 -5.00000000000000e-01 173 0.00000000000000e+00 174 5.00000000000000e-01 175 -1.00000000000000e+00 176 0.00000000000000e+00 177 1.00000000000000e+00 178 -5.00000000000000e-01 179 0.00000000000000e+00 180 5.00000000000000e-01 181 0.00000000000000e+00 182 0.00000000000000e+00 183 5.00000000000000e-01 184 -5.00000000000000e-01 185 0.00000000000000e+00 186 5.00000000000000e-01 187 -1.50000000000000e+00 188 0.00000000000000e+00 189 0.00000000000000e+00 190 -1.50000000000000e+00 191 0.00000000000000e+00 192 5.00000000000000e-01 193 -2.00000000000000e+00 194 0.00000000000000e+00 195 1.00000000000000e+00 196 -1.50000000000000e+00 197 0.00000000000000e+00 198 5.00000000000000e-01 199 -1.50000000000000e+00 200 0.00000000000000e+00 201 5.00000000000000e-01 202 -2.50000000000000e+00 203 0.00000000000000e+00 204 0.00000000000000e+00 205 -2.50000000000000e+00 206 0.00000000000000e+00 207 5.00000000000000e-01 208 -3.00000000000000e+00 209 0.00000000000000e+00 210 1.00000000000000e+00 211 -2.50000000000000e+00 212 0.00000000000000e+00 213 5.00000000000000e-01 214 -2.50000000000000e+00 215 0.00000000000000e+00 216 5.00000000000000e-01 217 -3.50000000000000e+00 218 0.00000000000000e+00 219 0.00000000000000e+00 220 -3.50000000000000e+00 221 0.00000000000000e+00 222 5.00000000000000e-01 223 -4.00000000000000e+00 224 0.00000000000000e+00 225 1.00000000000000e+00 226 -3.50000000000000e+00 227 0.00000000000000e+00 228 5.00000000000000e-01 229 -3.50000000000000e+00 230 0.00000000000000e+00 231 5.00000000000000e-01 232 -5.00000000000000e-01 233 0.00000000000000e+00 234 5.00000000000000e-01 235 -1.50000000000000e+00 236 0.00000000000000e+00 237 5.00000000000000e-01 238 -2.50000000000000e+00 239 0.00000000000000e+00 240 5.00000000000000e-01 241 -3.50000000000000e+00 242 0.00000000000000e+00 hypre-2.33.0/src/test/TEST_ij/data/beam_hex_dof459_np2/rbms.0.00001000066400000000000000000000125501477326011500237630ustar00rootroot00000000000000243 459 243 0.00000000000000e+00 244 -5.00000000000000e+00 245 0.00000000000000e+00 246 0.00000000000000e+00 247 -6.00000000000000e+00 248 0.00000000000000e+00 249 0.00000000000000e+00 250 -7.00000000000000e+00 251 0.00000000000000e+00 252 0.00000000000000e+00 253 -8.00000000000000e+00 254 0.00000000000000e+00 255 1.00000000000000e+00 256 -5.00000000000000e+00 257 0.00000000000000e+00 258 1.00000000000000e+00 259 -6.00000000000000e+00 260 0.00000000000000e+00 261 1.00000000000000e+00 262 -7.00000000000000e+00 263 0.00000000000000e+00 264 1.00000000000000e+00 265 -8.00000000000000e+00 266 0.00000000000000e+00 267 0.00000000000000e+00 268 -5.00000000000000e+00 269 0.00000000000000e+00 270 0.00000000000000e+00 271 -6.00000000000000e+00 272 0.00000000000000e+00 273 0.00000000000000e+00 274 -7.00000000000000e+00 275 0.00000000000000e+00 276 0.00000000000000e+00 277 -8.00000000000000e+00 278 0.00000000000000e+00 279 1.00000000000000e+00 280 -5.00000000000000e+00 281 0.00000000000000e+00 282 1.00000000000000e+00 283 -6.00000000000000e+00 284 0.00000000000000e+00 285 1.00000000000000e+00 286 -7.00000000000000e+00 287 0.00000000000000e+00 288 1.00000000000000e+00 289 -8.00000000000000e+00 290 0.00000000000000e+00 291 0.00000000000000e+00 292 -4.50000000000000e+00 293 0.00000000000000e+00 294 5.00000000000000e-01 295 -5.00000000000000e+00 296 0.00000000000000e+00 297 1.00000000000000e+00 298 -4.50000000000000e+00 299 0.00000000000000e+00 300 0.00000000000000e+00 301 -4.50000000000000e+00 302 0.00000000000000e+00 303 5.00000000000000e-01 304 -5.00000000000000e+00 305 0.00000000000000e+00 306 1.00000000000000e+00 307 -4.50000000000000e+00 308 0.00000000000000e+00 309 0.00000000000000e+00 310 -5.00000000000000e+00 311 0.00000000000000e+00 312 1.00000000000000e+00 313 -5.00000000000000e+00 314 0.00000000000000e+00 315 0.00000000000000e+00 316 -5.50000000000000e+00 317 0.00000000000000e+00 318 5.00000000000000e-01 319 -6.00000000000000e+00 320 0.00000000000000e+00 321 1.00000000000000e+00 322 -5.50000000000000e+00 323 0.00000000000000e+00 324 0.00000000000000e+00 325 -5.50000000000000e+00 326 0.00000000000000e+00 327 5.00000000000000e-01 328 -6.00000000000000e+00 329 0.00000000000000e+00 330 1.00000000000000e+00 331 -5.50000000000000e+00 332 0.00000000000000e+00 333 0.00000000000000e+00 334 -6.00000000000000e+00 335 0.00000000000000e+00 336 1.00000000000000e+00 337 -6.00000000000000e+00 338 0.00000000000000e+00 339 0.00000000000000e+00 340 -6.50000000000000e+00 341 0.00000000000000e+00 342 5.00000000000000e-01 343 -7.00000000000000e+00 344 0.00000000000000e+00 345 1.00000000000000e+00 346 -6.50000000000000e+00 347 0.00000000000000e+00 348 0.00000000000000e+00 349 -6.50000000000000e+00 350 0.00000000000000e+00 351 5.00000000000000e-01 352 -7.00000000000000e+00 353 0.00000000000000e+00 354 1.00000000000000e+00 355 -6.50000000000000e+00 356 0.00000000000000e+00 357 0.00000000000000e+00 358 -7.00000000000000e+00 359 0.00000000000000e+00 360 1.00000000000000e+00 361 -7.00000000000000e+00 362 0.00000000000000e+00 363 0.00000000000000e+00 364 -7.50000000000000e+00 365 0.00000000000000e+00 366 5.00000000000000e-01 367 -8.00000000000000e+00 368 0.00000000000000e+00 369 1.00000000000000e+00 370 -7.50000000000000e+00 371 0.00000000000000e+00 372 0.00000000000000e+00 373 -7.50000000000000e+00 374 0.00000000000000e+00 375 5.00000000000000e-01 376 -8.00000000000000e+00 377 0.00000000000000e+00 378 1.00000000000000e+00 379 -7.50000000000000e+00 380 0.00000000000000e+00 381 0.00000000000000e+00 382 -8.00000000000000e+00 383 0.00000000000000e+00 384 1.00000000000000e+00 385 -8.00000000000000e+00 386 0.00000000000000e+00 387 5.00000000000000e-01 388 -4.50000000000000e+00 389 0.00000000000000e+00 390 0.00000000000000e+00 391 -4.50000000000000e+00 392 0.00000000000000e+00 393 5.00000000000000e-01 394 -5.00000000000000e+00 395 0.00000000000000e+00 396 1.00000000000000e+00 397 -4.50000000000000e+00 398 0.00000000000000e+00 399 5.00000000000000e-01 400 -4.50000000000000e+00 401 0.00000000000000e+00 402 5.00000000000000e-01 403 -5.50000000000000e+00 404 0.00000000000000e+00 405 0.00000000000000e+00 406 -5.50000000000000e+00 407 0.00000000000000e+00 408 5.00000000000000e-01 409 -6.00000000000000e+00 410 0.00000000000000e+00 411 1.00000000000000e+00 412 -5.50000000000000e+00 413 0.00000000000000e+00 414 5.00000000000000e-01 415 -5.50000000000000e+00 416 0.00000000000000e+00 417 5.00000000000000e-01 418 -6.50000000000000e+00 419 0.00000000000000e+00 420 0.00000000000000e+00 421 -6.50000000000000e+00 422 0.00000000000000e+00 423 5.00000000000000e-01 424 -7.00000000000000e+00 425 0.00000000000000e+00 426 1.00000000000000e+00 427 -6.50000000000000e+00 428 0.00000000000000e+00 429 5.00000000000000e-01 430 -6.50000000000000e+00 431 0.00000000000000e+00 432 5.00000000000000e-01 433 -7.50000000000000e+00 434 0.00000000000000e+00 435 0.00000000000000e+00 436 -7.50000000000000e+00 437 0.00000000000000e+00 438 5.00000000000000e-01 439 -8.00000000000000e+00 440 0.00000000000000e+00 441 1.00000000000000e+00 442 -7.50000000000000e+00 443 0.00000000000000e+00 444 5.00000000000000e-01 445 -7.50000000000000e+00 446 0.00000000000000e+00 447 5.00000000000000e-01 448 -4.50000000000000e+00 449 0.00000000000000e+00 450 5.00000000000000e-01 451 -5.50000000000000e+00 452 0.00000000000000e+00 453 5.00000000000000e-01 454 -6.50000000000000e+00 455 0.00000000000000e+00 456 5.00000000000000e-01 457 -7.50000000000000e+00 458 0.00000000000000e+00 hypre-2.33.0/src/test/TEST_ij/data/beam_hex_dof459_np2/rbms.1.00000000066400000000000000000000136111477326011500237620ustar00rootroot000000000000000 243 0 0.00000000000000e+00 1 0.00000000000000e+00 2 0.00000000000000e+00 3 0.00000000000000e+00 4 0.00000000000000e+00 5 0.00000000000000e+00 6 0.00000000000000e+00 7 0.00000000000000e+00 8 0.00000000000000e+00 9 0.00000000000000e+00 10 0.00000000000000e+00 11 0.00000000000000e+00 12 0.00000000000000e+00 13 0.00000000000000e+00 14 0.00000000000000e+00 15 0.00000000000000e+00 16 0.00000000000000e+00 17 -1.00000000000000e+00 18 0.00000000000000e+00 19 0.00000000000000e+00 20 -1.00000000000000e+00 21 0.00000000000000e+00 22 0.00000000000000e+00 23 -1.00000000000000e+00 24 0.00000000000000e+00 25 0.00000000000000e+00 26 -1.00000000000000e+00 27 0.00000000000000e+00 28 0.00000000000000e+00 29 -1.00000000000000e+00 30 0.00000000000000e+00 31 1.00000000000000e+00 32 0.00000000000000e+00 33 0.00000000000000e+00 34 1.00000000000000e+00 35 0.00000000000000e+00 36 0.00000000000000e+00 37 1.00000000000000e+00 38 0.00000000000000e+00 39 0.00000000000000e+00 40 1.00000000000000e+00 41 0.00000000000000e+00 42 0.00000000000000e+00 43 1.00000000000000e+00 44 0.00000000000000e+00 45 0.00000000000000e+00 46 1.00000000000000e+00 47 -1.00000000000000e+00 48 0.00000000000000e+00 49 1.00000000000000e+00 50 -1.00000000000000e+00 51 0.00000000000000e+00 52 1.00000000000000e+00 53 -1.00000000000000e+00 54 0.00000000000000e+00 55 1.00000000000000e+00 56 -1.00000000000000e+00 57 0.00000000000000e+00 58 1.00000000000000e+00 59 -1.00000000000000e+00 60 0.00000000000000e+00 61 0.00000000000000e+00 62 0.00000000000000e+00 63 0.00000000000000e+00 64 0.00000000000000e+00 65 -5.00000000000000e-01 66 0.00000000000000e+00 67 0.00000000000000e+00 68 -1.00000000000000e+00 69 0.00000000000000e+00 70 0.00000000000000e+00 71 -5.00000000000000e-01 72 0.00000000000000e+00 73 1.00000000000000e+00 74 0.00000000000000e+00 75 0.00000000000000e+00 76 1.00000000000000e+00 77 -5.00000000000000e-01 78 0.00000000000000e+00 79 1.00000000000000e+00 80 -1.00000000000000e+00 81 0.00000000000000e+00 82 1.00000000000000e+00 83 -5.00000000000000e-01 84 0.00000000000000e+00 85 5.00000000000000e-01 86 0.00000000000000e+00 87 0.00000000000000e+00 88 5.00000000000000e-01 89 0.00000000000000e+00 90 0.00000000000000e+00 91 5.00000000000000e-01 92 -1.00000000000000e+00 93 0.00000000000000e+00 94 5.00000000000000e-01 95 -1.00000000000000e+00 96 0.00000000000000e+00 97 0.00000000000000e+00 98 0.00000000000000e+00 99 0.00000000000000e+00 100 0.00000000000000e+00 101 -5.00000000000000e-01 102 0.00000000000000e+00 103 0.00000000000000e+00 104 -1.00000000000000e+00 105 0.00000000000000e+00 106 1.00000000000000e+00 107 0.00000000000000e+00 108 0.00000000000000e+00 109 1.00000000000000e+00 110 -5.00000000000000e-01 111 0.00000000000000e+00 112 1.00000000000000e+00 113 -1.00000000000000e+00 114 0.00000000000000e+00 115 5.00000000000000e-01 116 0.00000000000000e+00 117 0.00000000000000e+00 118 5.00000000000000e-01 119 -1.00000000000000e+00 120 0.00000000000000e+00 121 0.00000000000000e+00 122 0.00000000000000e+00 123 0.00000000000000e+00 124 0.00000000000000e+00 125 -5.00000000000000e-01 126 0.00000000000000e+00 127 0.00000000000000e+00 128 -1.00000000000000e+00 129 0.00000000000000e+00 130 1.00000000000000e+00 131 0.00000000000000e+00 132 0.00000000000000e+00 133 1.00000000000000e+00 134 -5.00000000000000e-01 135 0.00000000000000e+00 136 1.00000000000000e+00 137 -1.00000000000000e+00 138 0.00000000000000e+00 139 5.00000000000000e-01 140 0.00000000000000e+00 141 0.00000000000000e+00 142 5.00000000000000e-01 143 -1.00000000000000e+00 144 0.00000000000000e+00 145 0.00000000000000e+00 146 0.00000000000000e+00 147 0.00000000000000e+00 148 0.00000000000000e+00 149 -5.00000000000000e-01 150 0.00000000000000e+00 151 0.00000000000000e+00 152 -1.00000000000000e+00 153 0.00000000000000e+00 154 1.00000000000000e+00 155 0.00000000000000e+00 156 0.00000000000000e+00 157 1.00000000000000e+00 158 -5.00000000000000e-01 159 0.00000000000000e+00 160 1.00000000000000e+00 161 -1.00000000000000e+00 162 0.00000000000000e+00 163 5.00000000000000e-01 164 0.00000000000000e+00 165 0.00000000000000e+00 166 5.00000000000000e-01 167 -1.00000000000000e+00 168 0.00000000000000e+00 169 0.00000000000000e+00 170 -5.00000000000000e-01 171 0.00000000000000e+00 172 5.00000000000000e-01 173 0.00000000000000e+00 174 0.00000000000000e+00 175 5.00000000000000e-01 176 -5.00000000000000e-01 177 0.00000000000000e+00 178 5.00000000000000e-01 179 -1.00000000000000e+00 180 0.00000000000000e+00 181 5.00000000000000e-01 182 -5.00000000000000e-01 183 0.00000000000000e+00 184 1.00000000000000e+00 185 -5.00000000000000e-01 186 0.00000000000000e+00 187 0.00000000000000e+00 188 -5.00000000000000e-01 189 0.00000000000000e+00 190 5.00000000000000e-01 191 0.00000000000000e+00 192 0.00000000000000e+00 193 5.00000000000000e-01 194 -5.00000000000000e-01 195 0.00000000000000e+00 196 5.00000000000000e-01 197 -1.00000000000000e+00 198 0.00000000000000e+00 199 1.00000000000000e+00 200 -5.00000000000000e-01 201 0.00000000000000e+00 202 0.00000000000000e+00 203 -5.00000000000000e-01 204 0.00000000000000e+00 205 5.00000000000000e-01 206 0.00000000000000e+00 207 0.00000000000000e+00 208 5.00000000000000e-01 209 -5.00000000000000e-01 210 0.00000000000000e+00 211 5.00000000000000e-01 212 -1.00000000000000e+00 213 0.00000000000000e+00 214 1.00000000000000e+00 215 -5.00000000000000e-01 216 0.00000000000000e+00 217 0.00000000000000e+00 218 -5.00000000000000e-01 219 0.00000000000000e+00 220 5.00000000000000e-01 221 0.00000000000000e+00 222 0.00000000000000e+00 223 5.00000000000000e-01 224 -5.00000000000000e-01 225 0.00000000000000e+00 226 5.00000000000000e-01 227 -1.00000000000000e+00 228 0.00000000000000e+00 229 1.00000000000000e+00 230 -5.00000000000000e-01 231 0.00000000000000e+00 232 5.00000000000000e-01 233 -5.00000000000000e-01 234 0.00000000000000e+00 235 5.00000000000000e-01 236 -5.00000000000000e-01 237 0.00000000000000e+00 238 5.00000000000000e-01 239 -5.00000000000000e-01 240 0.00000000000000e+00 241 5.00000000000000e-01 242 -5.00000000000000e-01 hypre-2.33.0/src/test/TEST_ij/data/beam_hex_dof459_np2/rbms.1.00001000066400000000000000000000125201477326011500237610ustar00rootroot00000000000000243 459 243 0.00000000000000e+00 244 0.00000000000000e+00 245 0.00000000000000e+00 246 0.00000000000000e+00 247 0.00000000000000e+00 248 0.00000000000000e+00 249 0.00000000000000e+00 250 0.00000000000000e+00 251 0.00000000000000e+00 252 0.00000000000000e+00 253 0.00000000000000e+00 254 0.00000000000000e+00 255 0.00000000000000e+00 256 0.00000000000000e+00 257 -1.00000000000000e+00 258 0.00000000000000e+00 259 0.00000000000000e+00 260 -1.00000000000000e+00 261 0.00000000000000e+00 262 0.00000000000000e+00 263 -1.00000000000000e+00 264 0.00000000000000e+00 265 0.00000000000000e+00 266 -1.00000000000000e+00 267 0.00000000000000e+00 268 1.00000000000000e+00 269 0.00000000000000e+00 270 0.00000000000000e+00 271 1.00000000000000e+00 272 0.00000000000000e+00 273 0.00000000000000e+00 274 1.00000000000000e+00 275 0.00000000000000e+00 276 0.00000000000000e+00 277 1.00000000000000e+00 278 0.00000000000000e+00 279 0.00000000000000e+00 280 1.00000000000000e+00 281 -1.00000000000000e+00 282 0.00000000000000e+00 283 1.00000000000000e+00 284 -1.00000000000000e+00 285 0.00000000000000e+00 286 1.00000000000000e+00 287 -1.00000000000000e+00 288 0.00000000000000e+00 289 1.00000000000000e+00 290 -1.00000000000000e+00 291 0.00000000000000e+00 292 0.00000000000000e+00 293 0.00000000000000e+00 294 0.00000000000000e+00 295 0.00000000000000e+00 296 -5.00000000000000e-01 297 0.00000000000000e+00 298 0.00000000000000e+00 299 -1.00000000000000e+00 300 0.00000000000000e+00 301 1.00000000000000e+00 302 0.00000000000000e+00 303 0.00000000000000e+00 304 1.00000000000000e+00 305 -5.00000000000000e-01 306 0.00000000000000e+00 307 1.00000000000000e+00 308 -1.00000000000000e+00 309 0.00000000000000e+00 310 5.00000000000000e-01 311 0.00000000000000e+00 312 0.00000000000000e+00 313 5.00000000000000e-01 314 -1.00000000000000e+00 315 0.00000000000000e+00 316 0.00000000000000e+00 317 0.00000000000000e+00 318 0.00000000000000e+00 319 0.00000000000000e+00 320 -5.00000000000000e-01 321 0.00000000000000e+00 322 0.00000000000000e+00 323 -1.00000000000000e+00 324 0.00000000000000e+00 325 1.00000000000000e+00 326 0.00000000000000e+00 327 0.00000000000000e+00 328 1.00000000000000e+00 329 -5.00000000000000e-01 330 0.00000000000000e+00 331 1.00000000000000e+00 332 -1.00000000000000e+00 333 0.00000000000000e+00 334 5.00000000000000e-01 335 0.00000000000000e+00 336 0.00000000000000e+00 337 5.00000000000000e-01 338 -1.00000000000000e+00 339 0.00000000000000e+00 340 0.00000000000000e+00 341 0.00000000000000e+00 342 0.00000000000000e+00 343 0.00000000000000e+00 344 -5.00000000000000e-01 345 0.00000000000000e+00 346 0.00000000000000e+00 347 -1.00000000000000e+00 348 0.00000000000000e+00 349 1.00000000000000e+00 350 0.00000000000000e+00 351 0.00000000000000e+00 352 1.00000000000000e+00 353 -5.00000000000000e-01 354 0.00000000000000e+00 355 1.00000000000000e+00 356 -1.00000000000000e+00 357 0.00000000000000e+00 358 5.00000000000000e-01 359 0.00000000000000e+00 360 0.00000000000000e+00 361 5.00000000000000e-01 362 -1.00000000000000e+00 363 0.00000000000000e+00 364 0.00000000000000e+00 365 0.00000000000000e+00 366 0.00000000000000e+00 367 0.00000000000000e+00 368 -5.00000000000000e-01 369 0.00000000000000e+00 370 0.00000000000000e+00 371 -1.00000000000000e+00 372 0.00000000000000e+00 373 1.00000000000000e+00 374 0.00000000000000e+00 375 0.00000000000000e+00 376 1.00000000000000e+00 377 -5.00000000000000e-01 378 0.00000000000000e+00 379 1.00000000000000e+00 380 -1.00000000000000e+00 381 0.00000000000000e+00 382 5.00000000000000e-01 383 0.00000000000000e+00 384 0.00000000000000e+00 385 5.00000000000000e-01 386 -1.00000000000000e+00 387 0.00000000000000e+00 388 0.00000000000000e+00 389 -5.00000000000000e-01 390 0.00000000000000e+00 391 5.00000000000000e-01 392 0.00000000000000e+00 393 0.00000000000000e+00 394 5.00000000000000e-01 395 -5.00000000000000e-01 396 0.00000000000000e+00 397 5.00000000000000e-01 398 -1.00000000000000e+00 399 0.00000000000000e+00 400 1.00000000000000e+00 401 -5.00000000000000e-01 402 0.00000000000000e+00 403 0.00000000000000e+00 404 -5.00000000000000e-01 405 0.00000000000000e+00 406 5.00000000000000e-01 407 0.00000000000000e+00 408 0.00000000000000e+00 409 5.00000000000000e-01 410 -5.00000000000000e-01 411 0.00000000000000e+00 412 5.00000000000000e-01 413 -1.00000000000000e+00 414 0.00000000000000e+00 415 1.00000000000000e+00 416 -5.00000000000000e-01 417 0.00000000000000e+00 418 0.00000000000000e+00 419 -5.00000000000000e-01 420 0.00000000000000e+00 421 5.00000000000000e-01 422 0.00000000000000e+00 423 0.00000000000000e+00 424 5.00000000000000e-01 425 -5.00000000000000e-01 426 0.00000000000000e+00 427 5.00000000000000e-01 428 -1.00000000000000e+00 429 0.00000000000000e+00 430 1.00000000000000e+00 431 -5.00000000000000e-01 432 0.00000000000000e+00 433 0.00000000000000e+00 434 -5.00000000000000e-01 435 0.00000000000000e+00 436 5.00000000000000e-01 437 0.00000000000000e+00 438 0.00000000000000e+00 439 5.00000000000000e-01 440 -5.00000000000000e-01 441 0.00000000000000e+00 442 5.00000000000000e-01 443 -1.00000000000000e+00 444 0.00000000000000e+00 445 1.00000000000000e+00 446 -5.00000000000000e-01 447 0.00000000000000e+00 448 5.00000000000000e-01 449 -5.00000000000000e-01 450 0.00000000000000e+00 451 5.00000000000000e-01 452 -5.00000000000000e-01 453 0.00000000000000e+00 454 5.00000000000000e-01 455 -5.00000000000000e-01 456 0.00000000000000e+00 457 5.00000000000000e-01 458 -5.00000000000000e-01 hypre-2.33.0/src/test/TEST_ij/data/beam_hex_dof459_np2/rbms.2.00000000066400000000000000000000136111477326011500237630ustar00rootroot000000000000000 243 0 0.00000000000000e+00 1 0.00000000000000e+00 2 0.00000000000000e+00 3 0.00000000000000e+00 4 0.00000000000000e+00 5 1.00000000000000e+00 6 0.00000000000000e+00 7 0.00000000000000e+00 8 2.00000000000000e+00 9 0.00000000000000e+00 10 0.00000000000000e+00 11 3.00000000000000e+00 12 0.00000000000000e+00 13 0.00000000000000e+00 14 4.00000000000000e+00 15 0.00000000000000e+00 16 0.00000000000000e+00 17 0.00000000000000e+00 18 0.00000000000000e+00 19 0.00000000000000e+00 20 1.00000000000000e+00 21 0.00000000000000e+00 22 0.00000000000000e+00 23 2.00000000000000e+00 24 0.00000000000000e+00 25 0.00000000000000e+00 26 3.00000000000000e+00 27 0.00000000000000e+00 28 0.00000000000000e+00 29 4.00000000000000e+00 30 -1.00000000000000e+00 31 0.00000000000000e+00 32 0.00000000000000e+00 33 -1.00000000000000e+00 34 0.00000000000000e+00 35 1.00000000000000e+00 36 -1.00000000000000e+00 37 0.00000000000000e+00 38 2.00000000000000e+00 39 -1.00000000000000e+00 40 0.00000000000000e+00 41 3.00000000000000e+00 42 -1.00000000000000e+00 43 0.00000000000000e+00 44 4.00000000000000e+00 45 -1.00000000000000e+00 46 0.00000000000000e+00 47 0.00000000000000e+00 48 -1.00000000000000e+00 49 0.00000000000000e+00 50 1.00000000000000e+00 51 -1.00000000000000e+00 52 0.00000000000000e+00 53 2.00000000000000e+00 54 -1.00000000000000e+00 55 0.00000000000000e+00 56 3.00000000000000e+00 57 -1.00000000000000e+00 58 0.00000000000000e+00 59 4.00000000000000e+00 60 0.00000000000000e+00 61 0.00000000000000e+00 62 5.00000000000000e-01 63 0.00000000000000e+00 64 0.00000000000000e+00 65 1.00000000000000e+00 66 0.00000000000000e+00 67 0.00000000000000e+00 68 5.00000000000000e-01 69 0.00000000000000e+00 70 0.00000000000000e+00 71 0.00000000000000e+00 72 -1.00000000000000e+00 73 0.00000000000000e+00 74 5.00000000000000e-01 75 -1.00000000000000e+00 76 0.00000000000000e+00 77 1.00000000000000e+00 78 -1.00000000000000e+00 79 0.00000000000000e+00 80 5.00000000000000e-01 81 -1.00000000000000e+00 82 0.00000000000000e+00 83 0.00000000000000e+00 84 -5.00000000000000e-01 85 0.00000000000000e+00 86 0.00000000000000e+00 87 -5.00000000000000e-01 88 0.00000000000000e+00 89 1.00000000000000e+00 90 -5.00000000000000e-01 91 0.00000000000000e+00 92 1.00000000000000e+00 93 -5.00000000000000e-01 94 0.00000000000000e+00 95 0.00000000000000e+00 96 0.00000000000000e+00 97 0.00000000000000e+00 98 1.50000000000000e+00 99 0.00000000000000e+00 100 0.00000000000000e+00 101 2.00000000000000e+00 102 0.00000000000000e+00 103 0.00000000000000e+00 104 1.50000000000000e+00 105 -1.00000000000000e+00 106 0.00000000000000e+00 107 1.50000000000000e+00 108 -1.00000000000000e+00 109 0.00000000000000e+00 110 2.00000000000000e+00 111 -1.00000000000000e+00 112 0.00000000000000e+00 113 1.50000000000000e+00 114 -5.00000000000000e-01 115 0.00000000000000e+00 116 2.00000000000000e+00 117 -5.00000000000000e-01 118 0.00000000000000e+00 119 2.00000000000000e+00 120 0.00000000000000e+00 121 0.00000000000000e+00 122 2.50000000000000e+00 123 0.00000000000000e+00 124 0.00000000000000e+00 125 3.00000000000000e+00 126 0.00000000000000e+00 127 0.00000000000000e+00 128 2.50000000000000e+00 129 -1.00000000000000e+00 130 0.00000000000000e+00 131 2.50000000000000e+00 132 -1.00000000000000e+00 133 0.00000000000000e+00 134 3.00000000000000e+00 135 -1.00000000000000e+00 136 0.00000000000000e+00 137 2.50000000000000e+00 138 -5.00000000000000e-01 139 0.00000000000000e+00 140 3.00000000000000e+00 141 -5.00000000000000e-01 142 0.00000000000000e+00 143 3.00000000000000e+00 144 0.00000000000000e+00 145 0.00000000000000e+00 146 3.50000000000000e+00 147 0.00000000000000e+00 148 0.00000000000000e+00 149 4.00000000000000e+00 150 0.00000000000000e+00 151 0.00000000000000e+00 152 3.50000000000000e+00 153 -1.00000000000000e+00 154 0.00000000000000e+00 155 3.50000000000000e+00 156 -1.00000000000000e+00 157 0.00000000000000e+00 158 4.00000000000000e+00 159 -1.00000000000000e+00 160 0.00000000000000e+00 161 3.50000000000000e+00 162 -5.00000000000000e-01 163 0.00000000000000e+00 164 4.00000000000000e+00 165 -5.00000000000000e-01 166 0.00000000000000e+00 167 4.00000000000000e+00 168 0.00000000000000e+00 169 0.00000000000000e+00 170 5.00000000000000e-01 171 -5.00000000000000e-01 172 0.00000000000000e+00 173 5.00000000000000e-01 174 -5.00000000000000e-01 175 0.00000000000000e+00 176 1.00000000000000e+00 177 -5.00000000000000e-01 178 0.00000000000000e+00 179 5.00000000000000e-01 180 -5.00000000000000e-01 181 0.00000000000000e+00 182 0.00000000000000e+00 183 -1.00000000000000e+00 184 0.00000000000000e+00 185 5.00000000000000e-01 186 0.00000000000000e+00 187 0.00000000000000e+00 188 1.50000000000000e+00 189 -5.00000000000000e-01 190 0.00000000000000e+00 191 1.50000000000000e+00 192 -5.00000000000000e-01 193 0.00000000000000e+00 194 2.00000000000000e+00 195 -5.00000000000000e-01 196 0.00000000000000e+00 197 1.50000000000000e+00 198 -1.00000000000000e+00 199 0.00000000000000e+00 200 1.50000000000000e+00 201 0.00000000000000e+00 202 0.00000000000000e+00 203 2.50000000000000e+00 204 -5.00000000000000e-01 205 0.00000000000000e+00 206 2.50000000000000e+00 207 -5.00000000000000e-01 208 0.00000000000000e+00 209 3.00000000000000e+00 210 -5.00000000000000e-01 211 0.00000000000000e+00 212 2.50000000000000e+00 213 -1.00000000000000e+00 214 0.00000000000000e+00 215 2.50000000000000e+00 216 0.00000000000000e+00 217 0.00000000000000e+00 218 3.50000000000000e+00 219 -5.00000000000000e-01 220 0.00000000000000e+00 221 3.50000000000000e+00 222 -5.00000000000000e-01 223 0.00000000000000e+00 224 4.00000000000000e+00 225 -5.00000000000000e-01 226 0.00000000000000e+00 227 3.50000000000000e+00 228 -1.00000000000000e+00 229 0.00000000000000e+00 230 3.50000000000000e+00 231 -5.00000000000000e-01 232 0.00000000000000e+00 233 5.00000000000000e-01 234 -5.00000000000000e-01 235 0.00000000000000e+00 236 1.50000000000000e+00 237 -5.00000000000000e-01 238 0.00000000000000e+00 239 2.50000000000000e+00 240 -5.00000000000000e-01 241 0.00000000000000e+00 242 3.50000000000000e+00 hypre-2.33.0/src/test/TEST_ij/data/beam_hex_dof459_np2/rbms.2.00001000066400000000000000000000125201477326011500237620ustar00rootroot00000000000000243 459 243 0.00000000000000e+00 244 0.00000000000000e+00 245 5.00000000000000e+00 246 0.00000000000000e+00 247 0.00000000000000e+00 248 6.00000000000000e+00 249 0.00000000000000e+00 250 0.00000000000000e+00 251 7.00000000000000e+00 252 0.00000000000000e+00 253 0.00000000000000e+00 254 8.00000000000000e+00 255 0.00000000000000e+00 256 0.00000000000000e+00 257 5.00000000000000e+00 258 0.00000000000000e+00 259 0.00000000000000e+00 260 6.00000000000000e+00 261 0.00000000000000e+00 262 0.00000000000000e+00 263 7.00000000000000e+00 264 0.00000000000000e+00 265 0.00000000000000e+00 266 8.00000000000000e+00 267 -1.00000000000000e+00 268 0.00000000000000e+00 269 5.00000000000000e+00 270 -1.00000000000000e+00 271 0.00000000000000e+00 272 6.00000000000000e+00 273 -1.00000000000000e+00 274 0.00000000000000e+00 275 7.00000000000000e+00 276 -1.00000000000000e+00 277 0.00000000000000e+00 278 8.00000000000000e+00 279 -1.00000000000000e+00 280 0.00000000000000e+00 281 5.00000000000000e+00 282 -1.00000000000000e+00 283 0.00000000000000e+00 284 6.00000000000000e+00 285 -1.00000000000000e+00 286 0.00000000000000e+00 287 7.00000000000000e+00 288 -1.00000000000000e+00 289 0.00000000000000e+00 290 8.00000000000000e+00 291 0.00000000000000e+00 292 0.00000000000000e+00 293 4.50000000000000e+00 294 0.00000000000000e+00 295 0.00000000000000e+00 296 5.00000000000000e+00 297 0.00000000000000e+00 298 0.00000000000000e+00 299 4.50000000000000e+00 300 -1.00000000000000e+00 301 0.00000000000000e+00 302 4.50000000000000e+00 303 -1.00000000000000e+00 304 0.00000000000000e+00 305 5.00000000000000e+00 306 -1.00000000000000e+00 307 0.00000000000000e+00 308 4.50000000000000e+00 309 -5.00000000000000e-01 310 0.00000000000000e+00 311 5.00000000000000e+00 312 -5.00000000000000e-01 313 0.00000000000000e+00 314 5.00000000000000e+00 315 0.00000000000000e+00 316 0.00000000000000e+00 317 5.50000000000000e+00 318 0.00000000000000e+00 319 0.00000000000000e+00 320 6.00000000000000e+00 321 0.00000000000000e+00 322 0.00000000000000e+00 323 5.50000000000000e+00 324 -1.00000000000000e+00 325 0.00000000000000e+00 326 5.50000000000000e+00 327 -1.00000000000000e+00 328 0.00000000000000e+00 329 6.00000000000000e+00 330 -1.00000000000000e+00 331 0.00000000000000e+00 332 5.50000000000000e+00 333 -5.00000000000000e-01 334 0.00000000000000e+00 335 6.00000000000000e+00 336 -5.00000000000000e-01 337 0.00000000000000e+00 338 6.00000000000000e+00 339 0.00000000000000e+00 340 0.00000000000000e+00 341 6.50000000000000e+00 342 0.00000000000000e+00 343 0.00000000000000e+00 344 7.00000000000000e+00 345 0.00000000000000e+00 346 0.00000000000000e+00 347 6.50000000000000e+00 348 -1.00000000000000e+00 349 0.00000000000000e+00 350 6.50000000000000e+00 351 -1.00000000000000e+00 352 0.00000000000000e+00 353 7.00000000000000e+00 354 -1.00000000000000e+00 355 0.00000000000000e+00 356 6.50000000000000e+00 357 -5.00000000000000e-01 358 0.00000000000000e+00 359 7.00000000000000e+00 360 -5.00000000000000e-01 361 0.00000000000000e+00 362 7.00000000000000e+00 363 0.00000000000000e+00 364 0.00000000000000e+00 365 7.50000000000000e+00 366 0.00000000000000e+00 367 0.00000000000000e+00 368 8.00000000000000e+00 369 0.00000000000000e+00 370 0.00000000000000e+00 371 7.50000000000000e+00 372 -1.00000000000000e+00 373 0.00000000000000e+00 374 7.50000000000000e+00 375 -1.00000000000000e+00 376 0.00000000000000e+00 377 8.00000000000000e+00 378 -1.00000000000000e+00 379 0.00000000000000e+00 380 7.50000000000000e+00 381 -5.00000000000000e-01 382 0.00000000000000e+00 383 8.00000000000000e+00 384 -5.00000000000000e-01 385 0.00000000000000e+00 386 8.00000000000000e+00 387 0.00000000000000e+00 388 0.00000000000000e+00 389 4.50000000000000e+00 390 -5.00000000000000e-01 391 0.00000000000000e+00 392 4.50000000000000e+00 393 -5.00000000000000e-01 394 0.00000000000000e+00 395 5.00000000000000e+00 396 -5.00000000000000e-01 397 0.00000000000000e+00 398 4.50000000000000e+00 399 -1.00000000000000e+00 400 0.00000000000000e+00 401 4.50000000000000e+00 402 0.00000000000000e+00 403 0.00000000000000e+00 404 5.50000000000000e+00 405 -5.00000000000000e-01 406 0.00000000000000e+00 407 5.50000000000000e+00 408 -5.00000000000000e-01 409 0.00000000000000e+00 410 6.00000000000000e+00 411 -5.00000000000000e-01 412 0.00000000000000e+00 413 5.50000000000000e+00 414 -1.00000000000000e+00 415 0.00000000000000e+00 416 5.50000000000000e+00 417 0.00000000000000e+00 418 0.00000000000000e+00 419 6.50000000000000e+00 420 -5.00000000000000e-01 421 0.00000000000000e+00 422 6.50000000000000e+00 423 -5.00000000000000e-01 424 0.00000000000000e+00 425 7.00000000000000e+00 426 -5.00000000000000e-01 427 0.00000000000000e+00 428 6.50000000000000e+00 429 -1.00000000000000e+00 430 0.00000000000000e+00 431 6.50000000000000e+00 432 0.00000000000000e+00 433 0.00000000000000e+00 434 7.50000000000000e+00 435 -5.00000000000000e-01 436 0.00000000000000e+00 437 7.50000000000000e+00 438 -5.00000000000000e-01 439 0.00000000000000e+00 440 8.00000000000000e+00 441 -5.00000000000000e-01 442 0.00000000000000e+00 443 7.50000000000000e+00 444 -1.00000000000000e+00 445 0.00000000000000e+00 446 7.50000000000000e+00 447 -5.00000000000000e-01 448 0.00000000000000e+00 449 4.50000000000000e+00 450 -5.00000000000000e-01 451 0.00000000000000e+00 452 5.50000000000000e+00 453 -5.00000000000000e-01 454 0.00000000000000e+00 455 6.50000000000000e+00 456 -5.00000000000000e-01 457 0.00000000000000e+00 458 7.50000000000000e+00 hypre-2.33.0/src/test/TEST_ij/data/beam_tet_dof2475_np4/000077500000000000000000000000001477326011500223675ustar00rootroot00000000000000hypre-2.33.0/src/test/TEST_ij/data/beam_tet_dof2475_np4/A.IJ.00000000066400000000000000000022061171477326011500234420ustar00rootroot000000000000000 674 0 674 0 0 1.70833333333333e+01 0 152 2.12500000000000e+00 0 1 -4.16666666666667e+00 0 139 2.12500000000000e+00 0 138 -2.16666666666667e+00 0 2 -4.16666666666667e+00 0 146 2.12500000000000e+00 0 145 -2.08333333333333e+00 0 151 2.12500000000000e+00 0 140 -2.08333333333333e+00 0 144 -2.16666666666667e+00 0 143 4.16666666666667e-02 0 155 -8.33333333333333e-02 0 136 4.16666666666667e-02 0 142 -8.33333333333333e-02 0 137 4.16666666666667e-02 0 148 4.16666666666667e-02 0 154 -8.33333333333333e-02 0 135 -2.50000000000000e-01 0 149 -8.33333333333333e-02 0 1429 2.08333333333333e+00 0 1430 2.08333333333333e+00 0 1428 -1.25000000000000e+01 1 1 1.29166666666667e+01 1 139 -6.50000000000000e+00 1 0 -4.16666666666667e+00 1 138 2.12500000000000e+00 1 146 2.12500000000000e+00 1 152 -4.25000000000000e+00 1 140 2.12500000000000e+00 1 145 -2.16666666666667e+00 1 144 -2.08333333333333e+00 1 150 2.12500000000000e+00 1 135 4.16666666666667e-02 1 141 -8.33333333333333e-02 1 136 -8.33333333333333e-02 1 147 4.16666666666667e-02 1 153 -8.33333333333333e-02 1 149 4.16666666666667e-02 1 155 -8.33333333333333e-02 1 143 4.16666666666667e-02 1 1428 2.08333333333333e+00 1 1429 -4.16666666666667e+00 2 2 1.29166666666667e+01 2 139 2.12500000000000e+00 2 138 -2.08333333333333e+00 2 150 2.12500000000000e+00 2 140 -2.16666666666667e+00 2 146 -6.50000000000000e+00 2 145 2.12500000000000e+00 2 151 -4.25000000000000e+00 2 0 -4.16666666666667e+00 2 144 2.12500000000000e+00 2 141 4.16666666666667e-02 2 153 -8.33333333333333e-02 2 137 -8.33333333333333e-02 2 135 4.16666666666667e-02 2 142 4.16666666666667e-02 2 148 4.16666666666667e-02 2 154 -8.33333333333333e-02 2 147 -8.33333333333333e-02 2 1430 -4.16666666666667e+00 2 1428 2.08333333333333e+00 3 3 7.50000000000000e-01 3 179 -8.33333333333333e-02 3 160 4.16666666666667e-02 3 166 -8.33333333333333e-02 3 161 4.16666666666667e-02 3 172 4.16666666666667e-02 3 178 -8.33333333333333e-02 3 159 -2.50000000000000e-01 3 173 -8.33333333333333e-02 3 164 -4.16666666666667e-02 3 176 8.33333333333333e-02 3 4 -8.33333333333333e-02 3 163 8.33333333333333e-02 3 157 4.16666666666667e-02 3 162 -1.25000000000000e-01 3 5 -8.33333333333333e-02 3 170 8.33333333333333e-02 3 158 4.16666666666667e-02 3 169 -4.16666666666667e-02 3 175 8.33333333333333e-02 3 167 4.16666666666667e-02 3 168 -1.25000000000000e-01 3 156 -2.50000000000000e-01 4 4 6.66666666666667e-01 4 159 4.16666666666667e-02 4 165 -8.33333333333333e-02 4 160 -8.33333333333333e-02 4 171 4.16666666666667e-02 4 177 -8.33333333333333e-02 4 173 4.16666666666667e-02 4 179 -8.33333333333333e-02 4 164 8.33333333333333e-02 4 163 -3.75000000000000e-01 4 3 -8.33333333333333e-02 4 162 8.33333333333333e-02 4 156 4.16666666666667e-02 4 170 8.33333333333333e-02 4 176 -1.66666666666667e-01 4 167 4.16666666666667e-02 4 169 -1.25000000000000e-01 4 157 -8.33333333333333e-02 4 168 -4.16666666666667e-02 4 174 8.33333333333333e-02 5 5 6.66666666666667e-01 5 165 4.16666666666667e-02 5 177 -8.33333333333333e-02 5 161 -8.33333333333333e-02 5 159 4.16666666666667e-02 5 172 4.16666666666667e-02 5 178 -8.33333333333333e-02 5 171 -8.33333333333333e-02 5 164 -1.25000000000000e-01 5 163 8.33333333333333e-02 5 162 -4.16666666666667e-02 5 174 8.33333333333333e-02 5 166 4.16666666666667e-02 5 170 -3.75000000000000e-01 5 158 -8.33333333333333e-02 5 169 8.33333333333333e-02 5 175 -1.66666666666667e-01 5 3 -8.33333333333333e-02 5 168 8.33333333333333e-02 5 156 4.16666666666667e-02 6 6 7.50000000000000e-01 6 190 8.33333333333333e-02 6 183 -1.25000000000000e-01 6 191 8.33333333333333e-02 6 188 8.33333333333333e-02 6 186 -1.25000000000000e-01 6 184 8.33333333333333e-02 6 7 -8.33333333333333e-02 6 181 4.16666666666667e-02 6 8 -8.33333333333333e-02 6 182 4.16666666666667e-02 6 187 -4.16666666666667e-02 6 185 -4.16666666666667e-02 6 180 -2.50000000000000e-01 6 788 4.16666666666667e-02 6 794 -8.33333333333333e-02 6 784 4.16666666666667e-02 6 787 -8.33333333333333e-02 6 785 4.16666666666667e-02 6 790 4.16666666666667e-02 6 793 -8.33333333333333e-02 6 783 -2.50000000000000e-01 6 791 -8.33333333333333e-02 7 7 6.66666666666667e-01 7 183 8.33333333333333e-02 7 185 8.33333333333333e-02 7 184 -3.75000000000000e-01 7 189 8.33333333333333e-02 7 191 -1.66666666666667e-01 7 188 8.33333333333333e-02 7 187 -1.25000000000000e-01 7 6 -8.33333333333333e-02 7 180 4.16666666666667e-02 7 181 -8.33333333333333e-02 7 186 -4.16666666666667e-02 7 783 4.16666666666667e-02 7 786 -8.33333333333333e-02 7 784 -8.33333333333333e-02 7 789 4.16666666666667e-02 7 792 -8.33333333333333e-02 7 791 4.16666666666667e-02 7 794 -8.33333333333333e-02 7 788 4.16666666666667e-02 8 8 6.66666666666667e-01 8 185 -1.25000000000000e-01 8 184 8.33333333333333e-02 8 190 -1.66666666666667e-01 8 187 8.33333333333333e-02 8 189 8.33333333333333e-02 8 188 -3.75000000000000e-01 8 186 8.33333333333333e-02 8 183 -4.16666666666667e-02 8 182 -8.33333333333333e-02 8 6 -8.33333333333333e-02 8 180 4.16666666666667e-02 8 786 4.16666666666667e-02 8 792 -8.33333333333333e-02 8 785 -8.33333333333333e-02 8 783 4.16666666666667e-02 8 787 4.16666666666667e-02 8 790 4.16666666666667e-02 8 793 -8.33333333333333e-02 8 789 -8.33333333333333e-02 9 9 1.27500000000000e+01 9 200 2.12500000000000e+00 9 194 -2.08333333333333e+00 9 193 2.12500000000000e+00 9 192 -2.16666666666667e+00 9 11 -4.16666666666667e+00 9 198 -4.20833333333333e+00 9 196 4.16666666666667e-02 9 10 -8.33333333333333e-02 9 195 -1.25000000000000e-01 9 203 -8.33333333333333e-02 9 199 -4.16666666666667e-02 9 202 4.16666666666667e-02 9 197 4.16666666666667e-02 9 1466 2.08333333333333e+00 9 1465 2.08333333333333e+00 9 1464 -6.25000000000000e+00 9 1463 2.08333333333333e+00 9 1462 -4.16666666666667e+00 10 10 1.28333333333333e+01 10 194 2.12500000000000e+00 10 11 -4.25000000000000e+00 10 200 2.12500000000000e+00 10 193 -6.50000000000000e+00 10 199 -4.20833333333333e+00 10 192 2.12500000000000e+00 10 203 4.16666666666667e-02 10 196 -4.16666666666667e-02 10 195 4.16666666666667e-02 10 9 -8.33333333333333e-02 10 197 -4.16666666666667e-02 10 198 -4.16666666666667e-02 10 201 4.16666666666667e-02 10 1463 2.08333333333333e+00 10 1465 -2.08333333333333e+00 10 1464 2.08333333333333e+00 10 1466 -2.08333333333333e+00 10 1461 -4.16666666666667e+00 11 11 1.69166666666667e+01 11 9 -4.16666666666667e+00 11 198 2.12500000000000e+00 11 194 -2.16666666666667e+00 11 200 -1.26250000000000e+01 11 193 2.12500000000000e+00 11 10 -4.25000000000000e+00 11 199 2.12500000000000e+00 11 192 -2.08333333333333e+00 11 196 -4.16666666666667e-02 11 202 4.16666666666667e-02 11 195 4.16666666666667e-02 11 197 -4.16666666666667e-02 11 201 -8.33333333333333e-02 11 1465 -2.08333333333333e+00 11 1462 2.08333333333333e+00 11 1464 2.08333333333333e+00 11 1466 -2.08333333333333e+00 11 1461 2.08333333333333e+00 12 12 5.00000000000000e-01 12 214 4.16666666666667e-02 12 13 -8.33333333333333e-02 12 213 -1.25000000000000e-01 12 221 -8.33333333333333e-02 12 217 -4.16666666666667e-02 12 220 4.16666666666667e-02 12 14 -8.33333333333333e-02 12 212 4.16666666666667e-02 12 218 8.33333333333333e-02 12 211 4.16666666666667e-02 12 210 -1.25000000000000e-01 12 209 -4.16666666666667e-02 12 206 4.16666666666667e-02 12 208 8.33333333333333e-02 12 205 -8.33333333333333e-02 12 207 -1.25000000000000e-01 12 215 4.16666666666667e-02 12 216 -1.25000000000000e-01 13 13 5.83333333333333e-01 13 221 4.16666666666667e-02 13 214 -4.16666666666667e-02 13 213 4.16666666666667e-02 13 12 -8.33333333333333e-02 13 216 -4.16666666666667e-02 13 219 4.16666666666667e-02 13 212 -4.16666666666667e-02 13 206 4.16666666666667e-02 13 211 -4.16666666666667e-02 13 210 4.16666666666667e-02 13 209 8.33333333333333e-02 13 14 -1.66666666666667e-01 13 218 8.33333333333333e-02 13 208 -3.75000000000000e-01 13 215 -4.16666666666667e-02 13 217 -1.25000000000000e-01 13 207 8.33333333333333e-02 13 204 -8.33333333333333e-02 14 14 5.83333333333333e-01 14 214 -4.16666666666667e-02 14 220 4.16666666666667e-02 14 213 4.16666666666667e-02 14 219 -8.33333333333333e-02 14 212 -4.16666666666667e-02 14 211 -4.16666666666667e-02 14 205 4.16666666666667e-02 14 12 -8.33333333333333e-02 14 210 4.16666666666667e-02 14 216 8.33333333333333e-02 14 209 -1.25000000000000e-01 14 215 -4.16666666666667e-02 14 218 -3.75000000000000e-01 14 208 8.33333333333333e-02 14 13 -1.66666666666667e-01 14 217 8.33333333333333e-02 14 207 -4.16666666666667e-02 14 204 4.16666666666667e-02 15 15 5.00000000000000e-01 15 16 -8.33333333333333e-02 15 226 8.33333333333333e-02 15 233 8.33333333333333e-02 15 232 -4.16666666666667e-02 15 231 -1.25000000000000e-01 15 225 -1.25000000000000e-01 15 230 4.16666666666667e-02 15 229 4.16666666666667e-02 15 228 -1.25000000000000e-01 15 227 -4.16666666666667e-02 15 224 4.16666666666667e-02 15 223 -8.33333333333333e-02 15 17 -8.33333333333333e-02 15 832 4.16666666666667e-02 15 831 -1.25000000000000e-01 15 836 -8.33333333333333e-02 15 835 4.16666666666667e-02 15 833 4.16666666666667e-02 16 16 5.83333333333333e-01 16 15 -8.33333333333333e-02 16 225 8.33333333333333e-02 16 233 8.33333333333333e-02 16 17 -1.66666666666667e-01 16 227 8.33333333333333e-02 16 232 -1.25000000000000e-01 16 226 -3.75000000000000e-01 16 231 -4.16666666666667e-02 16 224 4.16666666666667e-02 16 229 -4.16666666666667e-02 16 228 4.16666666666667e-02 16 230 -4.16666666666667e-02 16 222 -8.33333333333333e-02 16 836 4.16666666666667e-02 16 832 -4.16666666666667e-02 16 831 4.16666666666667e-02 16 833 -4.16666666666667e-02 16 834 4.16666666666667e-02 17 17 5.83333333333333e-01 17 233 -3.75000000000000e-01 17 227 -1.25000000000000e-01 17 232 8.33333333333333e-02 17 16 -1.66666666666667e-01 17 226 8.33333333333333e-02 17 231 8.33333333333333e-02 17 229 -4.16666666666667e-02 17 223 4.16666666666667e-02 17 15 -8.33333333333333e-02 17 228 4.16666666666667e-02 17 230 -4.16666666666667e-02 17 225 -4.16666666666667e-02 17 222 4.16666666666667e-02 17 832 -4.16666666666667e-02 17 835 4.16666666666667e-02 17 831 4.16666666666667e-02 17 833 -4.16666666666667e-02 17 834 -8.33333333333333e-02 18 18 1.27500000000000e+01 18 235 -2.08333333333333e+00 18 234 -2.16666666666667e+00 18 19 -4.16666666666667e+00 18 241 2.12500000000000e+00 18 236 2.12500000000000e+00 18 240 -4.20833333333333e+00 18 245 4.16666666666667e-02 18 20 -8.33333333333333e-02 18 239 4.16666666666667e-02 18 238 4.16666666666667e-02 18 244 -8.33333333333333e-02 18 242 -4.16666666666667e-02 18 237 -1.25000000000000e-01 18 1498 2.08333333333333e+00 18 1502 2.08333333333333e+00 18 1499 -4.16666666666667e+00 18 1501 2.08333333333333e+00 18 1500 -6.25000000000000e+00 19 19 1.69166666666667e+01 19 20 -4.25000000000000e+00 19 242 2.12500000000000e+00 19 235 -2.16666666666667e+00 19 234 -2.08333333333333e+00 19 236 2.12500000000000e+00 19 241 -1.26250000000000e+01 19 18 -4.16666666666667e+00 19 240 2.12500000000000e+00 19 239 -4.16666666666667e-02 19 245 4.16666666666667e-02 19 238 -4.16666666666667e-02 19 237 4.16666666666667e-02 19 243 -8.33333333333333e-02 19 1497 2.08333333333333e+00 19 1502 -2.08333333333333e+00 19 1499 2.08333333333333e+00 19 1501 -2.08333333333333e+00 19 1500 2.08333333333333e+00 20 20 1.28333333333333e+01 20 235 2.12500000000000e+00 20 19 -4.25000000000000e+00 20 241 2.12500000000000e+00 20 234 2.12500000000000e+00 20 236 -6.50000000000000e+00 20 242 -4.20833333333333e+00 20 240 -4.16666666666667e-02 20 243 4.16666666666667e-02 20 239 -4.16666666666667e-02 20 238 -4.16666666666667e-02 20 244 4.16666666666667e-02 20 18 -8.33333333333333e-02 20 237 4.16666666666667e-02 20 1502 -2.08333333333333e+00 20 1501 -2.08333333333333e+00 20 1498 2.08333333333333e+00 20 1500 2.08333333333333e+00 20 1497 -4.16666666666667e+00 21 21 5.00000000000000e-01 21 263 4.16666666666667e-02 21 23 -8.33333333333333e-02 21 257 4.16666666666667e-02 21 256 4.16666666666667e-02 21 262 -8.33333333333333e-02 21 255 -1.25000000000000e-01 21 251 8.33333333333333e-02 21 250 -4.16666666666667e-02 21 247 4.16666666666667e-02 21 249 -1.25000000000000e-01 21 254 4.16666666666667e-02 21 248 -8.33333333333333e-02 21 253 4.16666666666667e-02 21 22 -8.33333333333333e-02 21 259 8.33333333333333e-02 21 252 -1.25000000000000e-01 21 260 -4.16666666666667e-02 21 258 -1.25000000000000e-01 22 22 5.83333333333333e-01 22 263 4.16666666666667e-02 22 256 -4.16666666666667e-02 22 255 4.16666666666667e-02 22 261 -8.33333333333333e-02 22 251 8.33333333333333e-02 22 23 -1.66666666666667e-01 22 260 8.33333333333333e-02 22 250 -1.25000000000000e-01 22 249 -4.16666666666667e-02 22 246 4.16666666666667e-02 22 254 -4.16666666666667e-02 22 248 4.16666666666667e-02 22 253 -4.16666666666667e-02 22 257 -4.16666666666667e-02 22 259 -3.75000000000000e-01 22 252 4.16666666666667e-02 22 21 -8.33333333333333e-02 22 258 8.33333333333333e-02 23 23 5.83333333333333e-01 23 261 4.16666666666667e-02 23 257 -4.16666666666667e-02 23 256 -4.16666666666667e-02 23 262 4.16666666666667e-02 23 21 -8.33333333333333e-02 23 255 4.16666666666667e-02 23 251 -3.75000000000000e-01 23 250 8.33333333333333e-02 23 22 -1.66666666666667e-01 23 259 8.33333333333333e-02 23 249 8.33333333333333e-02 23 254 -4.16666666666667e-02 23 258 -4.16666666666667e-02 23 260 -1.25000000000000e-01 23 253 -4.16666666666667e-02 23 247 4.16666666666667e-02 23 252 4.16666666666667e-02 23 246 -8.33333333333333e-02 24 24 5.00000000000000e-01 24 274 8.33333333333333e-02 24 273 -1.25000000000000e-01 24 26 -8.33333333333333e-02 24 269 8.33333333333333e-02 24 275 -4.16666666666667e-02 24 267 -1.25000000000000e-01 24 268 -4.16666666666667e-02 24 265 4.16666666666667e-02 24 272 4.16666666666667e-02 24 266 -8.33333333333333e-02 24 271 4.16666666666667e-02 24 25 -8.33333333333333e-02 24 270 -1.25000000000000e-01 24 872 4.16666666666667e-02 24 869 4.16666666666667e-02 24 868 4.16666666666667e-02 24 871 -8.33333333333333e-02 24 867 -1.25000000000000e-01 25 25 5.83333333333333e-01 25 26 -1.66666666666667e-01 25 269 8.33333333333333e-02 25 274 -3.75000000000000e-01 25 273 8.33333333333333e-02 25 275 8.33333333333333e-02 25 268 -1.25000000000000e-01 25 267 -4.16666666666667e-02 25 264 4.16666666666667e-02 25 272 -4.16666666666667e-02 25 266 4.16666666666667e-02 25 271 -4.16666666666667e-02 25 270 4.16666666666667e-02 25 24 -8.33333333333333e-02 25 869 -4.16666666666667e-02 25 872 4.16666666666667e-02 25 868 -4.16666666666667e-02 25 867 4.16666666666667e-02 25 870 -8.33333333333333e-02 26 26 5.83333333333333e-01 26 274 8.33333333333333e-02 26 25 -1.66666666666667e-01 26 268 8.33333333333333e-02 26 273 -4.16666666666667e-02 26 275 -1.25000000000000e-01 26 269 -3.75000000000000e-01 26 24 -8.33333333333333e-02 26 267 8.33333333333333e-02 26 272 -4.16666666666667e-02 26 271 -4.16666666666667e-02 26 265 4.16666666666667e-02 26 270 4.16666666666667e-02 26 264 -8.33333333333333e-02 26 870 4.16666666666667e-02 26 869 -4.16666666666667e-02 26 868 -4.16666666666667e-02 26 871 4.16666666666667e-02 26 867 4.16666666666667e-02 27 27 2.11666666666667e+01 27 278 2.12500000000000e+00 27 279 -4.20833333333333e+00 27 277 2.12500000000000e+00 27 283 2.12500000000000e+00 27 282 -4.20833333333333e+00 27 281 2.12500000000000e+00 27 287 4.16666666666667e-02 27 280 -4.16666666666667e-02 27 284 -4.16666666666667e-02 27 28 -8.33333333333333e-02 27 286 4.16666666666667e-02 27 29 -8.33333333333333e-02 27 285 -2.50000000000000e-01 27 1550 2.08333333333333e+00 27 1544 -4.16666666666667e+00 27 1543 2.08333333333333e+00 27 1547 2.08333333333333e+00 27 1549 2.08333333333333e+00 27 1548 -1.25000000000000e+01 27 1541 -4.16666666666667e+00 27 1540 -4.16666666666667e+00 27 1546 -4.16666666666667e+00 28 28 2.10833333333333e+01 28 281 2.12500000000000e+00 28 280 -4.20833333333333e+00 28 278 -4.25000000000000e+00 28 284 2.12500000000000e+00 28 276 2.12500000000000e+00 28 283 -1.26250000000000e+01 28 282 2.12500000000000e+00 28 279 -4.16666666666667e-02 28 286 -8.33333333333333e-02 28 27 -8.33333333333333e-02 28 285 4.16666666666667e-02 28 1542 2.08333333333333e+00 28 1549 -4.16666666666667e+00 28 1548 2.08333333333333e+00 28 1539 -4.16666666666667e+00 28 1547 2.08333333333333e+00 28 1541 -4.16666666666667e+00 28 1544 2.08333333333333e+00 28 1545 -4.16666666666667e+00 29 29 2.10833333333333e+01 29 279 2.12500000000000e+00 29 281 -1.26250000000000e+01 29 280 2.12500000000000e+00 29 276 2.12500000000000e+00 29 277 -4.25000000000000e+00 29 283 2.12500000000000e+00 29 284 -4.20833333333333e+00 29 27 -8.33333333333333e-02 29 285 4.16666666666667e-02 29 287 -8.33333333333333e-02 29 282 -4.16666666666667e-02 29 1548 2.08333333333333e+00 29 1542 -4.16666666666667e+00 29 1550 -4.16666666666667e+00 29 1545 2.08333333333333e+00 29 1539 -4.16666666666667e+00 29 1543 2.08333333333333e+00 29 1546 2.08333333333333e+00 29 1540 -4.16666666666667e+00 30 30 7.50000000000000e-01 30 311 4.16666666666667e-02 30 298 -4.16666666666667e-02 30 305 -4.16666666666667e-02 30 31 -8.33333333333333e-02 30 310 4.16666666666667e-02 30 309 -2.50000000000000e-01 30 299 8.33333333333333e-02 30 308 4.16666666666667e-02 30 296 -8.33333333333333e-02 30 295 4.16666666666667e-02 30 302 4.16666666666667e-02 30 307 4.16666666666667e-02 30 306 -2.50000000000000e-01 30 293 8.33333333333333e-02 30 290 -8.33333333333333e-02 30 297 -1.25000000000000e-01 30 292 8.33333333333333e-02 30 289 -8.33333333333333e-02 30 301 -8.33333333333333e-02 30 304 8.33333333333333e-02 30 303 -1.25000000000000e-01 30 32 -8.33333333333333e-02 31 31 6.66666666666667e-01 31 310 -8.33333333333333e-02 31 30 -8.33333333333333e-02 31 309 4.16666666666667e-02 31 296 4.16666666666667e-02 31 294 4.16666666666667e-02 31 307 -8.33333333333333e-02 31 306 4.16666666666667e-02 31 299 8.33333333333333e-02 31 298 -1.25000000000000e-01 31 293 -1.66666666666667e-01 31 305 8.33333333333333e-02 31 291 8.33333333333333e-02 31 288 -8.33333333333333e-02 31 302 4.16666666666667e-02 31 290 -8.33333333333333e-02 31 304 -3.75000000000000e-01 31 297 -4.16666666666667e-02 31 300 -8.33333333333333e-02 31 303 8.33333333333333e-02 32 32 6.66666666666667e-01 32 309 4.16666666666667e-02 32 311 -8.33333333333333e-02 32 303 -4.16666666666667e-02 32 295 4.16666666666667e-02 32 297 8.33333333333333e-02 32 306 4.16666666666667e-02 32 294 -8.33333333333333e-02 32 308 -8.33333333333333e-02 32 300 4.16666666666667e-02 32 299 -3.75000000000000e-01 32 298 8.33333333333333e-02 32 291 8.33333333333333e-02 32 288 -8.33333333333333e-02 32 292 -1.66666666666667e-01 32 304 8.33333333333333e-02 32 305 -1.25000000000000e-01 32 30 -8.33333333333333e-02 32 301 4.16666666666667e-02 32 289 -8.33333333333333e-02 33 33 7.50000000000000e-01 33 323 8.33333333333333e-02 33 322 -4.16666666666667e-02 33 316 8.33333333333333e-02 33 321 -1.25000000000000e-01 33 329 -4.16666666666667e-02 33 317 8.33333333333333e-02 33 34 -8.33333333333333e-02 33 328 8.33333333333333e-02 33 35 -8.33333333333333e-02 33 327 -1.25000000000000e-01 33 332 4.16666666666667e-02 33 320 -8.33333333333333e-02 33 319 4.16666666666667e-02 33 326 4.16666666666667e-02 33 331 4.16666666666667e-02 33 330 -2.50000000000000e-01 33 314 -8.33333333333333e-02 33 313 -8.33333333333333e-02 33 325 -8.33333333333333e-02 33 905 4.16666666666667e-02 33 904 4.16666666666667e-02 33 903 -2.50000000000000e-01 34 34 6.66666666666667e-01 34 322 -1.25000000000000e-01 34 321 -4.16666666666667e-02 34 315 8.33333333333333e-02 34 329 8.33333333333333e-02 34 317 -1.66666666666667e-01 34 323 8.33333333333333e-02 34 328 -3.75000000000000e-01 34 33 -8.33333333333333e-02 34 327 8.33333333333333e-02 34 318 4.16666666666667e-02 34 331 -8.33333333333333e-02 34 330 4.16666666666667e-02 34 312 -8.33333333333333e-02 34 326 4.16666666666667e-02 34 314 -8.33333333333333e-02 34 320 4.16666666666667e-02 34 324 -8.33333333333333e-02 34 904 -8.33333333333333e-02 34 903 4.16666666666667e-02 35 35 6.66666666666667e-01 35 322 8.33333333333333e-02 35 33 -8.33333333333333e-02 35 321 8.33333333333333e-02 35 323 -3.75000000000000e-01 35 329 -1.25000000000000e-01 35 328 8.33333333333333e-02 35 316 -1.66666666666667e-01 35 327 -4.16666666666667e-02 35 315 8.33333333333333e-02 35 330 4.16666666666667e-02 35 318 -8.33333333333333e-02 35 332 -8.33333333333333e-02 35 324 4.16666666666667e-02 35 312 -8.33333333333333e-02 35 319 4.16666666666667e-02 35 325 4.16666666666667e-02 35 313 -8.33333333333333e-02 35 903 4.16666666666667e-02 35 905 -8.33333333333333e-02 36 36 7.50000000000000e-01 36 157 4.16666666666667e-02 36 343 -8.33333333333333e-02 36 335 -4.16666666666667e-02 36 37 -8.33333333333333e-02 36 334 8.33333333333333e-02 36 136 4.16666666666667e-02 36 333 -1.25000000000000e-01 36 350 -8.33333333333333e-02 36 341 8.33333333333333e-02 36 158 4.16666666666667e-02 36 347 -8.33333333333333e-02 36 346 4.16666666666667e-02 36 349 -8.33333333333333e-02 36 156 -2.50000000000000e-01 36 38 -8.33333333333333e-02 36 338 8.33333333333333e-02 36 137 4.16666666666667e-02 36 337 -4.16666666666667e-02 36 340 8.33333333333333e-02 36 344 4.16666666666667e-02 36 336 -1.25000000000000e-01 36 135 -2.50000000000000e-01 37 37 6.66666666666667e-01 37 156 4.16666666666667e-02 37 342 -8.33333333333333e-02 37 335 8.33333333333333e-02 37 334 -3.75000000000000e-01 37 36 -8.33333333333333e-02 37 333 8.33333333333333e-02 37 135 4.16666666666667e-02 37 347 4.16666666666667e-02 37 350 -8.33333333333333e-02 37 157 -8.33333333333333e-02 37 345 4.16666666666667e-02 37 348 -8.33333333333333e-02 37 338 8.33333333333333e-02 37 341 -1.66666666666667e-01 37 344 4.16666666666667e-02 37 337 -1.25000000000000e-01 37 136 -8.33333333333333e-02 37 336 -4.16666666666667e-02 37 339 8.33333333333333e-02 38 38 6.66666666666667e-01 38 342 4.16666666666667e-02 38 335 -1.25000000000000e-01 38 334 8.33333333333333e-02 38 333 -4.16666666666667e-02 38 346 4.16666666666667e-02 38 349 -8.33333333333333e-02 38 348 -8.33333333333333e-02 38 339 8.33333333333333e-02 38 158 -8.33333333333333e-02 38 156 4.16666666666667e-02 38 345 -8.33333333333333e-02 38 343 4.16666666666667e-02 38 338 -3.75000000000000e-01 38 137 -8.33333333333333e-02 38 337 8.33333333333333e-02 38 340 -1.66666666666667e-01 38 36 -8.33333333333333e-02 38 336 8.33333333333333e-02 38 135 4.16666666666667e-02 39 39 2.98333333333333e+01 39 41 -8.33333333333333e+00 39 356 4.25000000000000e+00 39 364 2.12500000000000e+00 39 355 -2.12500000000000e+00 39 140 -2.08333333333333e+00 39 139 2.12500000000000e+00 39 138 -2.16666666666667e+00 39 354 -6.37500000000000e+00 39 194 -2.08333333333333e+00 39 365 2.12500000000000e+00 39 40 -4.25000000000000e+00 39 193 2.12500000000000e+00 39 192 -2.16666666666667e+00 39 361 -8.33333333333333e-02 39 353 8.33333333333333e-02 39 352 8.33333333333333e-02 39 351 -3.75000000000000e-01 39 368 -8.33333333333333e-02 39 367 -8.33333333333333e-02 39 359 -1.66666666666667e-01 39 358 8.33333333333333e-02 39 362 4.16666666666667e-02 39 1688 2.08333333333333e+00 39 1687 -4.16666666666667e+00 39 1717 4.16666666666667e+00 39 1718 4.16666666666667e+00 39 1716 -1.87500000000000e+01 40 40 2.57500000000000e+01 40 363 2.12500000000000e+00 40 354 -2.12500000000000e+00 40 140 2.12500000000000e+00 40 41 -4.25000000000000e+00 40 356 4.25000000000000e+00 40 139 -6.50000000000000e+00 40 355 -6.37500000000000e+00 40 138 2.12500000000000e+00 40 194 2.12500000000000e+00 40 365 -4.25000000000000e+00 40 193 -6.50000000000000e+00 40 39 -4.25000000000000e+00 40 192 2.12500000000000e+00 40 360 -8.33333333333333e-02 40 353 -4.16666666666667e-02 40 352 -1.25000000000000e-01 40 351 8.33333333333333e-02 40 368 -8.33333333333333e-02 40 359 8.33333333333333e-02 40 366 -8.33333333333333e-02 40 362 4.16666666666667e-02 40 357 8.33333333333333e-02 40 1688 2.08333333333333e+00 40 1686 -4.16666666666667e+00 40 1718 -2.08333333333333e+00 40 1717 -6.25000000000000e+00 40 1716 4.16666666666667e+00 41 41 2.98333333333333e+01 41 39 -8.33333333333333e+00 41 354 4.25000000000000e+00 41 140 -2.16666666666667e+00 41 356 -1.91250000000000e+01 41 139 2.12500000000000e+00 41 40 -4.25000000000000e+00 41 355 4.25000000000000e+00 41 138 -2.08333333333333e+00 41 194 -2.16666666666667e+00 41 193 2.12500000000000e+00 41 364 -4.25000000000000e+00 41 192 -2.08333333333333e+00 41 363 2.12500000000000e+00 41 361 4.16666666666667e-02 41 353 -1.25000000000000e-01 41 352 -4.16666666666667e-02 41 351 8.33333333333333e-02 41 366 -8.33333333333333e-02 41 367 -8.33333333333333e-02 41 358 8.33333333333333e-02 41 360 4.16666666666667e-02 41 357 -1.66666666666667e-01 41 1687 2.08333333333333e+00 41 1716 4.16666666666667e+00 41 1686 2.08333333333333e+00 41 1717 -2.08333333333333e+00 41 1718 -6.25000000000000e+00 42 42 1.25000000000000e+00 42 382 8.33333333333333e-02 42 383 8.33333333333333e-02 42 379 8.33333333333333e-02 42 378 -1.25000000000000e-01 42 44 -1.66666666666667e-01 42 353 8.33333333333333e-02 42 352 8.33333333333333e-02 42 351 -3.75000000000000e-01 42 370 -8.33333333333333e-02 42 43 -1.66666666666667e-01 42 374 8.33333333333333e-02 42 385 -8.33333333333333e-02 42 376 8.33333333333333e-02 42 371 1.66666666666667e-01 42 377 -1.66666666666667e-01 42 206 4.16666666666667e-02 42 386 -8.33333333333333e-02 42 373 8.33333333333333e-02 42 205 -8.33333333333333e-02 42 372 -3.75000000000000e-01 42 335 -4.16666666666667e-02 42 143 4.16666666666667e-02 42 334 8.33333333333333e-02 42 142 -8.33333333333333e-02 42 333 -1.25000000000000e-01 42 380 -4.16666666666667e-02 42 369 -2.50000000000000e-01 43 43 1.25000000000000e+00 43 381 8.33333333333333e-02 43 383 -1.66666666666667e-01 43 206 4.16666666666667e-02 43 379 -3.75000000000000e-01 43 378 8.33333333333333e-02 43 353 -4.16666666666667e-02 43 143 4.16666666666667e-02 43 352 -1.25000000000000e-01 43 351 8.33333333333333e-02 43 369 -8.33333333333333e-02 43 374 -4.16666666666667e-02 43 42 -1.66666666666667e-01 43 384 -8.33333333333333e-02 43 375 8.33333333333333e-02 43 386 -8.33333333333333e-02 43 377 8.33333333333333e-02 43 373 -1.25000000000000e-01 43 372 8.33333333333333e-02 43 204 -8.33333333333333e-02 43 335 8.33333333333333e-02 43 44 -1.66666666666667e-01 43 371 1.66666666666667e-01 43 334 -3.75000000000000e-01 43 380 8.33333333333333e-02 43 370 -2.50000000000000e-01 43 333 8.33333333333333e-02 43 141 -8.33333333333333e-02 44 44 1.25000000000000e+00 44 379 8.33333333333333e-02 44 382 -1.66666666666667e-01 44 381 8.33333333333333e-02 44 380 -1.25000000000000e-01 44 205 4.16666666666667e-02 44 353 -1.25000000000000e-01 44 352 -4.16666666666667e-02 44 142 4.16666666666667e-02 44 42 -1.66666666666667e-01 44 351 8.33333333333333e-02 44 373 -4.16666666666667e-02 44 372 8.33333333333333e-02 44 385 -8.33333333333333e-02 44 376 8.33333333333333e-02 44 369 1.66666666666667e-01 44 375 -1.66666666666667e-01 44 374 -1.25000000000000e-01 44 204 4.16666666666667e-02 44 384 -8.33333333333333e-02 44 335 -1.25000000000000e-01 44 378 -4.16666666666667e-02 44 371 -7.50000000000000e-01 44 334 8.33333333333333e-02 44 43 -1.66666666666667e-01 44 370 1.66666666666667e-01 44 333 -4.16666666666667e-02 44 141 4.16666666666667e-02 45 45 2.98333333333333e+01 45 392 -2.12500000000000e+00 45 46 -8.33333333333333e+00 45 391 4.25000000000000e+00 45 146 2.12500000000000e+00 45 145 -2.08333333333333e+00 45 144 -2.16666666666667e+00 45 390 -6.37500000000000e+00 45 47 -4.25000000000000e+00 45 236 2.12500000000000e+00 45 235 -2.08333333333333e+00 45 400 2.12500000000000e+00 45 401 2.12500000000000e+00 45 234 -2.16666666666667e+00 45 395 8.33333333333333e-02 45 404 -8.33333333333333e-02 45 397 4.16666666666667e-02 45 403 -8.33333333333333e-02 45 398 -8.33333333333333e-02 45 389 8.33333333333333e-02 45 388 8.33333333333333e-02 45 394 -1.66666666666667e-01 45 387 -3.75000000000000e-01 45 1753 4.16666666666667e+00 45 1691 -4.16666666666667e+00 45 1690 2.08333333333333e+00 45 1754 4.16666666666667e+00 45 1752 -1.87500000000000e+01 46 46 2.98333333333333e+01 46 45 -8.33333333333333e+00 46 390 4.25000000000000e+00 46 146 2.12500000000000e+00 46 47 -4.25000000000000e+00 46 392 4.25000000000000e+00 46 145 -2.16666666666667e+00 46 391 -1.91250000000000e+01 46 144 -2.08333333333333e+00 46 236 2.12500000000000e+00 46 401 -4.25000000000000e+00 46 235 -2.16666666666667e+00 46 234 -2.08333333333333e+00 46 399 2.12500000000000e+00 46 396 4.16666666666667e-02 46 402 -8.33333333333333e-02 46 398 4.16666666666667e-02 46 404 -8.33333333333333e-02 46 389 -4.16666666666667e-02 46 395 8.33333333333333e-02 46 388 -1.25000000000000e-01 46 387 8.33333333333333e-02 46 393 -1.66666666666667e-01 46 1754 -2.08333333333333e+00 46 1752 4.16666666666667e+00 46 1689 2.08333333333333e+00 46 1691 2.08333333333333e+00 46 1753 -6.25000000000000e+00 47 47 2.57500000000000e+01 47 390 -2.12500000000000e+00 47 146 -6.50000000000000e+00 47 392 -6.37500000000000e+00 47 145 2.12500000000000e+00 47 46 -4.25000000000000e+00 47 391 4.25000000000000e+00 47 144 2.12500000000000e+00 47 399 2.12500000000000e+00 47 236 -6.50000000000000e+00 47 235 2.12500000000000e+00 47 400 -4.25000000000000e+00 47 45 -4.25000000000000e+00 47 234 2.12500000000000e+00 47 393 8.33333333333333e-02 47 402 -8.33333333333333e-02 47 397 4.16666666666667e-02 47 403 -8.33333333333333e-02 47 396 -8.33333333333333e-02 47 389 -1.25000000000000e-01 47 388 -4.16666666666667e-02 47 394 8.33333333333333e-02 47 387 8.33333333333333e-02 47 1690 2.08333333333333e+00 47 1753 -2.08333333333333e+00 47 1689 -4.16666666666667e+00 47 1754 -6.25000000000000e+00 47 1752 4.16666666666667e+00 48 48 1.25000000000000e+00 48 413 8.33333333333333e-02 48 412 -1.66666666666667e-01 48 410 8.33333333333333e-02 48 247 4.16666666666667e-02 48 408 -3.75000000000000e-01 48 338 8.33333333333333e-02 48 337 -4.16666666666667e-02 48 148 4.16666666666667e-02 48 336 -1.25000000000000e-01 48 407 -8.33333333333333e-02 48 50 -1.66666666666667e-01 48 415 -4.16666666666667e-02 48 422 -8.33333333333333e-02 48 419 8.33333333333333e-02 48 421 -8.33333333333333e-02 48 418 8.33333333333333e-02 48 416 8.33333333333333e-02 48 248 -8.33333333333333e-02 48 414 -1.25000000000000e-01 48 389 8.33333333333333e-02 48 149 -8.33333333333333e-02 48 388 8.33333333333333e-02 48 49 -1.66666666666667e-01 48 406 1.66666666666667e-01 48 387 -3.75000000000000e-01 48 409 8.33333333333333e-02 48 405 -2.50000000000000e-01 49 49 1.25000000000000e+00 49 413 8.33333333333333e-02 49 408 8.33333333333333e-02 49 411 -1.66666666666667e-01 49 409 -1.25000000000000e-01 49 246 4.16666666666667e-02 49 338 8.33333333333333e-02 49 50 -1.66666666666667e-01 49 337 -1.25000000000000e-01 49 336 -4.16666666666667e-02 49 147 4.16666666666667e-02 49 414 -4.16666666666667e-02 49 416 8.33333333333333e-02 49 407 1.66666666666667e-01 49 419 -1.66666666666667e-01 49 420 -8.33333333333333e-02 49 417 8.33333333333333e-02 49 248 4.16666666666667e-02 49 422 -8.33333333333333e-02 49 415 -1.25000000000000e-01 49 389 -4.16666666666667e-02 49 149 4.16666666666667e-02 49 388 -1.25000000000000e-01 49 410 -4.16666666666667e-02 49 406 -7.50000000000000e-01 49 387 8.33333333333333e-02 49 48 -1.66666666666667e-01 49 405 1.66666666666667e-01 50 50 1.25000000000000e+00 50 412 8.33333333333333e-02 50 411 8.33333333333333e-02 50 410 -1.25000000000000e-01 50 408 8.33333333333333e-02 50 338 -3.75000000000000e-01 50 337 8.33333333333333e-02 50 49 -1.66666666666667e-01 50 336 8.33333333333333e-02 50 405 -8.33333333333333e-02 50 48 -1.66666666666667e-01 50 415 8.33333333333333e-02 50 420 -8.33333333333333e-02 50 417 8.33333333333333e-02 50 406 1.66666666666667e-01 50 418 -1.66666666666667e-01 50 416 -3.75000000000000e-01 50 247 4.16666666666667e-02 50 421 -8.33333333333333e-02 50 414 8.33333333333333e-02 50 246 -8.33333333333333e-02 50 389 -1.25000000000000e-01 50 409 -4.16666666666667e-02 50 407 -2.50000000000000e-01 50 388 -4.16666666666667e-02 50 148 4.16666666666667e-02 50 387 8.33333333333333e-02 50 147 -8.33333333333333e-02 51 51 6.37500000000000e+01 51 355 -2.12500000000000e+00 51 152 2.12500000000000e+00 51 354 -6.37500000000000e+00 51 428 -2.12500000000000e+00 51 278 2.12500000000000e+00 51 52 -8.50000000000000e+00 51 427 4.25000000000000e+00 51 426 -6.37500000000000e+00 51 392 -2.12500000000000e+00 51 391 4.25000000000000e+00 51 151 2.12500000000000e+00 51 390 -6.37500000000000e+00 51 53 -8.50000000000000e+00 51 434 4.25000000000000e+00 51 433 -2.12500000000000e+00 51 277 2.12500000000000e+00 51 356 4.25000000000000e+00 51 432 -6.37500000000000e+00 51 430 -1.66666666666667e-01 51 425 1.66666666666667e-01 51 437 -1.66666666666667e-01 51 439 -8.33333333333333e-02 51 436 8.33333333333333e-02 51 440 -8.33333333333333e-02 51 424 1.66666666666667e-01 51 431 8.33333333333333e-02 51 423 -7.50000000000000e-01 51 1720 4.16666666666667e+00 51 1721 -8.33333333333333e+00 51 1694 -4.16666666666667e+00 51 1757 4.16666666666667e+00 51 1786 8.33333333333333e+00 51 1756 -8.33333333333333e+00 51 1693 -4.16666666666667e+00 51 1787 8.33333333333333e+00 51 1785 -3.75000000000000e+01 52 52 6.37500000000000e+01 52 354 -2.12500000000000e+00 52 356 4.25000000000000e+00 52 355 -6.37500000000000e+00 52 428 4.25000000000000e+00 52 427 -1.91250000000000e+01 52 51 -8.50000000000000e+00 52 426 4.25000000000000e+00 52 53 -8.50000000000000e+00 52 390 4.25000000000000e+00 52 152 -4.25000000000000e+00 52 392 4.25000000000000e+00 52 391 -1.91250000000000e+01 52 150 2.12500000000000e+00 52 434 4.25000000000000e+00 52 278 -4.25000000000000e+00 52 433 -6.37500000000000e+00 52 432 -2.12500000000000e+00 52 276 2.12500000000000e+00 52 431 8.33333333333333e-02 52 429 -1.66666666666667e-01 52 425 -8.33333333333333e-02 52 440 -8.33333333333333e-02 52 437 8.33333333333333e-02 52 438 -8.33333333333333e-02 52 435 8.33333333333333e-02 52 424 -2.50000000000000e-01 52 423 1.66666666666667e-01 52 1721 4.16666666666667e+00 52 1787 -4.16666666666667e+00 52 1694 -4.16666666666667e+00 52 1757 4.16666666666667e+00 52 1785 8.33333333333333e+00 52 1755 -8.33333333333333e+00 52 1692 -4.16666666666667e+00 52 1719 4.16666666666667e+00 52 1786 -1.25000000000000e+01 53 53 6.37500000000000e+01 53 356 -1.91250000000000e+01 53 355 4.25000000000000e+00 53 150 2.12500000000000e+00 53 428 -6.37500000000000e+00 53 427 4.25000000000000e+00 53 426 -2.12500000000000e+00 53 276 2.12500000000000e+00 53 52 -8.50000000000000e+00 53 390 -2.12500000000000e+00 53 392 -6.37500000000000e+00 53 151 -4.25000000000000e+00 53 391 4.25000000000000e+00 53 354 4.25000000000000e+00 53 434 -1.91250000000000e+01 53 433 4.25000000000000e+00 53 277 -4.25000000000000e+00 53 51 -8.50000000000000e+00 53 432 4.25000000000000e+00 53 430 8.33333333333333e-02 53 424 -8.33333333333333e-02 53 439 -8.33333333333333e-02 53 436 8.33333333333333e-02 53 423 1.66666666666667e-01 53 435 -1.66666666666667e-01 53 438 -8.33333333333333e-02 53 429 8.33333333333333e-02 53 425 -2.50000000000000e-01 53 1720 4.16666666666667e+00 53 1719 -8.33333333333333e+00 53 1786 -4.16666666666667e+00 53 1693 -4.16666666666667e+00 53 1756 4.16666666666667e+00 53 1692 -4.16666666666667e+00 53 1755 4.16666666666667e+00 53 1787 -1.25000000000000e+01 53 1785 8.33333333333333e+00 54 54 2.50000000000000e+00 54 445 1.66666666666667e-01 54 444 -2.50000000000000e-01 54 359 -1.66666666666667e-01 54 358 8.33333333333333e-02 54 425 1.66666666666667e-01 54 457 8.33333333333333e-02 54 424 1.66666666666667e-01 54 423 -7.50000000000000e-01 54 458 8.33333333333333e-02 54 370 -8.33333333333333e-02 54 371 1.66666666666667e-01 54 56 -3.33333333333333e-01 54 155 -8.33333333333333e-02 54 369 -2.50000000000000e-01 54 449 8.33333333333333e-02 54 290 -8.33333333333333e-02 54 448 -1.66666666666667e-01 54 341 8.33333333333333e-02 54 442 1.66666666666667e-01 54 55 -3.33333333333333e-01 54 443 1.66666666666667e-01 54 289 -8.33333333333333e-02 54 441 -7.50000000000000e-01 54 340 8.33333333333333e-02 54 154 -8.33333333333333e-02 54 407 -8.33333333333333e-02 54 395 8.33333333333333e-02 54 454 8.33333333333333e-02 54 451 -8.33333333333333e-02 54 394 -1.66666666666667e-01 54 406 1.66666666666667e-01 54 405 -2.50000000000000e-01 54 452 1.66666666666667e-01 54 455 -1.66666666666667e-01 54 450 -2.50000000000000e-01 54 446 -8.33333333333333e-02 55 55 2.50000000000000e+00 55 444 1.66666666666667e-01 55 446 1.66666666666667e-01 55 445 -7.50000000000000e-01 55 357 8.33333333333333e-02 55 425 -8.33333333333333e-02 55 456 8.33333333333333e-02 55 424 -2.50000000000000e-01 55 423 1.66666666666667e-01 55 458 -1.66666666666667e-01 55 369 -8.33333333333333e-02 55 449 8.33333333333333e-02 55 371 1.66666666666667e-01 55 370 -2.50000000000000e-01 55 447 -1.66666666666667e-01 55 443 -8.33333333333333e-02 55 441 1.66666666666667e-01 55 54 -3.33333333333333e-01 55 442 -2.50000000000000e-01 55 288 -8.33333333333333e-02 55 341 -1.66666666666667e-01 55 339 8.33333333333333e-02 55 153 -8.33333333333333e-02 55 407 1.66666666666667e-01 55 56 -3.33333333333333e-01 55 452 1.66666666666667e-01 55 453 8.33333333333333e-02 55 450 -8.33333333333333e-02 55 395 8.33333333333333e-02 55 155 -8.33333333333333e-02 55 406 -7.50000000000000e-01 55 393 -1.66666666666667e-01 55 405 1.66666666666667e-01 55 455 8.33333333333333e-02 55 290 -8.33333333333333e-02 55 451 -2.50000000000000e-01 55 359 8.33333333333333e-02 56 56 2.50000000000000e+00 56 358 8.33333333333333e-02 56 446 -2.50000000000000e-01 56 445 1.66666666666667e-01 56 357 -1.66666666666667e-01 56 424 -8.33333333333333e-02 56 423 1.66666666666667e-01 56 425 -2.50000000000000e-01 56 457 -1.66666666666667e-01 56 456 8.33333333333333e-02 56 448 8.33333333333333e-02 56 369 1.66666666666667e-01 56 54 -3.33333333333333e-01 56 371 -7.50000000000000e-01 56 370 1.66666666666667e-01 56 153 -8.33333333333333e-02 56 447 8.33333333333333e-02 56 288 -8.33333333333333e-02 56 442 -8.33333333333333e-02 56 339 8.33333333333333e-02 56 443 -2.50000000000000e-01 56 441 1.66666666666667e-01 56 340 -1.66666666666667e-01 56 405 -8.33333333333333e-02 56 393 8.33333333333333e-02 56 406 1.66666666666667e-01 56 55 -3.33333333333333e-01 56 451 1.66666666666667e-01 56 407 -2.50000000000000e-01 56 394 8.33333333333333e-02 56 154 -8.33333333333333e-02 56 452 -7.50000000000000e-01 56 444 -8.33333333333333e-02 56 454 8.33333333333333e-02 56 289 -8.33333333333333e-02 56 450 1.66666666666667e-01 56 453 -1.66666666666667e-01 57 57 7.50000000000000e-01 57 181 4.16666666666667e-02 57 469 -8.33333333333333e-02 57 461 -4.16666666666667e-02 57 58 -8.33333333333333e-02 57 460 8.33333333333333e-02 57 160 4.16666666666667e-02 57 459 -1.25000000000000e-01 57 476 -8.33333333333333e-02 57 467 8.33333333333333e-02 57 182 4.16666666666667e-02 57 473 -8.33333333333333e-02 57 472 4.16666666666667e-02 57 475 -8.33333333333333e-02 57 180 -2.50000000000000e-01 57 59 -8.33333333333333e-02 57 464 8.33333333333333e-02 57 161 4.16666666666667e-02 57 463 -4.16666666666667e-02 57 466 8.33333333333333e-02 57 470 4.16666666666667e-02 57 462 -1.25000000000000e-01 57 159 -2.50000000000000e-01 58 58 6.66666666666667e-01 58 180 4.16666666666667e-02 58 468 -8.33333333333333e-02 58 461 8.33333333333333e-02 58 460 -3.75000000000000e-01 58 57 -8.33333333333333e-02 58 459 8.33333333333333e-02 58 159 4.16666666666667e-02 58 473 4.16666666666667e-02 58 476 -8.33333333333333e-02 58 181 -8.33333333333333e-02 58 471 4.16666666666667e-02 58 474 -8.33333333333333e-02 58 464 8.33333333333333e-02 58 467 -1.66666666666667e-01 58 470 4.16666666666667e-02 58 463 -1.25000000000000e-01 58 160 -8.33333333333333e-02 58 462 -4.16666666666667e-02 58 465 8.33333333333333e-02 59 59 6.66666666666667e-01 59 468 4.16666666666667e-02 59 461 -1.25000000000000e-01 59 460 8.33333333333333e-02 59 459 -4.16666666666667e-02 59 472 4.16666666666667e-02 59 475 -8.33333333333333e-02 59 474 -8.33333333333333e-02 59 465 8.33333333333333e-02 59 182 -8.33333333333333e-02 59 180 4.16666666666667e-02 59 471 -8.33333333333333e-02 59 469 4.16666666666667e-02 59 464 -3.75000000000000e-01 59 161 -8.33333333333333e-02 59 463 8.33333333333333e-02 59 466 -1.66666666666667e-01 59 57 -8.33333333333333e-02 59 462 8.33333333333333e-02 59 159 4.16666666666667e-02 60 60 1.25000000000000e+00 60 487 -8.33333333333333e-02 60 479 8.33333333333333e-02 60 478 8.33333333333333e-02 60 477 -3.75000000000000e-01 60 494 -8.33333333333333e-02 60 493 -8.33333333333333e-02 60 485 -1.66666666666667e-01 60 484 8.33333333333333e-02 60 374 8.33333333333333e-02 60 62 -1.66666666666667e-01 60 482 1.66666666666667e-01 60 490 8.33333333333333e-02 60 481 -8.33333333333333e-02 60 164 -4.16666666666667e-02 60 344 4.16666666666667e-02 60 163 8.33333333333333e-02 60 343 -8.33333333333333e-02 60 162 -1.25000000000000e-01 60 480 -2.50000000000000e-01 60 209 -4.16666666666667e-02 60 491 8.33333333333333e-02 60 61 -1.66666666666667e-01 60 208 8.33333333333333e-02 60 373 8.33333333333333e-02 60 488 4.16666666666667e-02 60 207 -1.25000000000000e-01 60 372 -3.75000000000000e-01 61 61 1.25000000000000e+00 61 486 -8.33333333333333e-02 61 479 -4.16666666666667e-02 61 478 -1.25000000000000e-01 61 477 8.33333333333333e-02 61 494 -8.33333333333333e-02 61 485 8.33333333333333e-02 61 492 -8.33333333333333e-02 61 483 8.33333333333333e-02 61 374 -4.16666666666667e-02 61 344 4.16666666666667e-02 61 489 8.33333333333333e-02 61 480 -8.33333333333333e-02 61 164 8.33333333333333e-02 61 62 -1.66666666666667e-01 61 482 1.66666666666667e-01 61 163 -3.75000000000000e-01 61 481 -2.50000000000000e-01 61 162 8.33333333333333e-02 61 342 -8.33333333333333e-02 61 209 8.33333333333333e-02 61 491 -1.66666666666667e-01 61 488 4.16666666666667e-02 61 208 -3.75000000000000e-01 61 373 -1.25000000000000e-01 61 60 -1.66666666666667e-01 61 207 8.33333333333333e-02 61 372 8.33333333333333e-02 62 62 1.25000000000000e+00 62 487 4.16666666666667e-02 62 479 -1.25000000000000e-01 62 478 -4.16666666666667e-02 62 477 8.33333333333333e-02 62 492 -8.33333333333333e-02 62 493 -8.33333333333333e-02 62 484 8.33333333333333e-02 62 483 -1.66666666666667e-01 62 373 -4.16666666666667e-02 62 343 4.16666666666667e-02 62 372 8.33333333333333e-02 62 60 -1.66666666666667e-01 62 480 1.66666666666667e-01 62 164 -1.25000000000000e-01 62 482 -7.50000000000000e-01 62 163 8.33333333333333e-02 62 61 -1.66666666666667e-01 62 481 1.66666666666667e-01 62 162 -4.16666666666667e-02 62 342 4.16666666666667e-02 62 486 4.16666666666667e-02 62 209 -1.25000000000000e-01 62 374 -1.25000000000000e-01 62 208 8.33333333333333e-02 62 490 -1.66666666666667e-01 62 207 -4.16666666666667e-02 62 489 8.33333333333333e-02 63 63 1.25000000000000e+00 63 508 8.33333333333333e-02 63 509 8.33333333333333e-02 63 505 8.33333333333333e-02 63 504 -1.25000000000000e-01 63 65 -1.66666666666667e-01 63 479 8.33333333333333e-02 63 478 8.33333333333333e-02 63 477 -3.75000000000000e-01 63 496 -8.33333333333333e-02 63 64 -1.66666666666667e-01 63 500 8.33333333333333e-02 63 511 -8.33333333333333e-02 63 502 8.33333333333333e-02 63 497 1.66666666666667e-01 63 503 -1.66666666666667e-01 63 224 4.16666666666667e-02 63 512 -8.33333333333333e-02 63 499 8.33333333333333e-02 63 223 -8.33333333333333e-02 63 498 -3.75000000000000e-01 63 461 -4.16666666666667e-02 63 167 4.16666666666667e-02 63 460 8.33333333333333e-02 63 166 -8.33333333333333e-02 63 459 -1.25000000000000e-01 63 506 -4.16666666666667e-02 63 495 -2.50000000000000e-01 64 64 1.25000000000000e+00 64 507 8.33333333333333e-02 64 509 -1.66666666666667e-01 64 224 4.16666666666667e-02 64 505 -3.75000000000000e-01 64 504 8.33333333333333e-02 64 479 -4.16666666666667e-02 64 167 4.16666666666667e-02 64 478 -1.25000000000000e-01 64 477 8.33333333333333e-02 64 495 -8.33333333333333e-02 64 500 -4.16666666666667e-02 64 63 -1.66666666666667e-01 64 510 -8.33333333333333e-02 64 501 8.33333333333333e-02 64 512 -8.33333333333333e-02 64 503 8.33333333333333e-02 64 499 -1.25000000000000e-01 64 498 8.33333333333333e-02 64 222 -8.33333333333333e-02 64 461 8.33333333333333e-02 64 65 -1.66666666666667e-01 64 497 1.66666666666667e-01 64 460 -3.75000000000000e-01 64 506 8.33333333333333e-02 64 496 -2.50000000000000e-01 64 459 8.33333333333333e-02 64 165 -8.33333333333333e-02 65 65 1.25000000000000e+00 65 505 8.33333333333333e-02 65 508 -1.66666666666667e-01 65 507 8.33333333333333e-02 65 506 -1.25000000000000e-01 65 223 4.16666666666667e-02 65 479 -1.25000000000000e-01 65 478 -4.16666666666667e-02 65 166 4.16666666666667e-02 65 63 -1.66666666666667e-01 65 477 8.33333333333333e-02 65 499 -4.16666666666667e-02 65 498 8.33333333333333e-02 65 511 -8.33333333333333e-02 65 502 8.33333333333333e-02 65 495 1.66666666666667e-01 65 501 -1.66666666666667e-01 65 500 -1.25000000000000e-01 65 222 4.16666666666667e-02 65 510 -8.33333333333333e-02 65 461 -1.25000000000000e-01 65 504 -4.16666666666667e-02 65 497 -7.50000000000000e-01 65 460 8.33333333333333e-02 65 64 -1.66666666666667e-01 65 496 1.66666666666667e-01 65 459 -4.16666666666667e-02 65 165 4.16666666666667e-02 66 66 1.25000000000000e+00 66 530 -8.33333333333333e-02 66 523 4.16666666666667e-02 66 529 -8.33333333333333e-02 66 524 -8.33333333333333e-02 66 515 8.33333333333333e-02 66 514 8.33333333333333e-02 66 520 -1.66666666666667e-01 66 513 -3.75000000000000e-01 66 527 8.33333333333333e-02 66 518 -8.33333333333333e-02 66 67 -1.66666666666667e-01 66 517 1.66666666666667e-01 66 409 8.33333333333333e-02 66 170 8.33333333333333e-02 66 347 -8.33333333333333e-02 66 169 -4.16666666666667e-02 66 346 4.16666666666667e-02 66 168 -1.25000000000000e-01 66 516 -2.50000000000000e-01 66 68 -1.66666666666667e-01 66 251 8.33333333333333e-02 66 410 8.33333333333333e-02 66 250 -4.16666666666667e-02 66 526 8.33333333333333e-02 66 521 8.33333333333333e-02 66 249 -1.25000000000000e-01 66 408 -3.75000000000000e-01 67 67 1.25000000000000e+00 67 528 -8.33333333333333e-02 67 524 4.16666666666667e-02 67 530 -8.33333333333333e-02 67 515 -4.16666666666667e-02 67 521 8.33333333333333e-02 67 514 -1.25000000000000e-01 67 513 8.33333333333333e-02 67 519 -1.66666666666667e-01 67 347 4.16666666666667e-02 67 410 -4.16666666666667e-02 67 66 -1.66666666666667e-01 67 516 1.66666666666667e-01 67 408 8.33333333333333e-02 67 170 8.33333333333333e-02 67 68 -1.66666666666667e-01 67 518 1.66666666666667e-01 67 169 -1.25000000000000e-01 67 517 -7.50000000000000e-01 67 168 -4.16666666666667e-02 67 345 4.16666666666667e-02 67 251 8.33333333333333e-02 67 527 -1.66666666666667e-01 67 522 4.16666666666667e-02 67 250 -1.25000000000000e-01 67 409 -1.25000000000000e-01 67 249 -4.16666666666667e-02 67 525 8.33333333333333e-02 68 68 1.25000000000000e+00 68 528 -8.33333333333333e-02 68 523 4.16666666666667e-02 68 529 -8.33333333333333e-02 68 522 -8.33333333333333e-02 68 515 -1.25000000000000e-01 68 514 -4.16666666666667e-02 68 520 8.33333333333333e-02 68 513 8.33333333333333e-02 68 525 8.33333333333333e-02 68 516 -8.33333333333333e-02 68 346 4.16666666666667e-02 68 409 -4.16666666666667e-02 68 170 -3.75000000000000e-01 68 518 -2.50000000000000e-01 68 169 8.33333333333333e-02 68 67 -1.66666666666667e-01 68 517 1.66666666666667e-01 68 168 8.33333333333333e-02 68 345 -8.33333333333333e-02 68 519 8.33333333333333e-02 68 251 -3.75000000000000e-01 68 410 -1.25000000000000e-01 68 250 8.33333333333333e-02 68 526 -1.66666666666667e-01 68 66 -1.66666666666667e-01 68 249 8.33333333333333e-02 68 408 8.33333333333333e-02 69 69 1.25000000000000e+00 69 539 8.33333333333333e-02 69 538 -1.66666666666667e-01 69 536 8.33333333333333e-02 69 265 4.16666666666667e-02 69 534 -3.75000000000000e-01 69 464 8.33333333333333e-02 69 463 -4.16666666666667e-02 69 172 4.16666666666667e-02 69 462 -1.25000000000000e-01 69 533 -8.33333333333333e-02 69 71 -1.66666666666667e-01 69 541 -4.16666666666667e-02 69 548 -8.33333333333333e-02 69 545 8.33333333333333e-02 69 547 -8.33333333333333e-02 69 544 8.33333333333333e-02 69 542 8.33333333333333e-02 69 266 -8.33333333333333e-02 69 540 -1.25000000000000e-01 69 515 8.33333333333333e-02 69 173 -8.33333333333333e-02 69 514 8.33333333333333e-02 69 70 -1.66666666666667e-01 69 532 1.66666666666667e-01 69 513 -3.75000000000000e-01 69 535 8.33333333333333e-02 69 531 -2.50000000000000e-01 70 70 1.25000000000000e+00 70 539 8.33333333333333e-02 70 534 8.33333333333333e-02 70 537 -1.66666666666667e-01 70 535 -1.25000000000000e-01 70 264 4.16666666666667e-02 70 464 8.33333333333333e-02 70 71 -1.66666666666667e-01 70 463 -1.25000000000000e-01 70 462 -4.16666666666667e-02 70 171 4.16666666666667e-02 70 540 -4.16666666666667e-02 70 542 8.33333333333333e-02 70 533 1.66666666666667e-01 70 545 -1.66666666666667e-01 70 546 -8.33333333333333e-02 70 543 8.33333333333333e-02 70 266 4.16666666666667e-02 70 548 -8.33333333333333e-02 70 541 -1.25000000000000e-01 70 515 -4.16666666666667e-02 70 173 4.16666666666667e-02 70 514 -1.25000000000000e-01 70 536 -4.16666666666667e-02 70 532 -7.50000000000000e-01 70 513 8.33333333333333e-02 70 69 -1.66666666666667e-01 70 531 1.66666666666667e-01 71 71 1.25000000000000e+00 71 538 8.33333333333333e-02 71 537 8.33333333333333e-02 71 536 -1.25000000000000e-01 71 534 8.33333333333333e-02 71 464 -3.75000000000000e-01 71 463 8.33333333333333e-02 71 70 -1.66666666666667e-01 71 462 8.33333333333333e-02 71 531 -8.33333333333333e-02 71 69 -1.66666666666667e-01 71 541 8.33333333333333e-02 71 546 -8.33333333333333e-02 71 543 8.33333333333333e-02 71 532 1.66666666666667e-01 71 544 -1.66666666666667e-01 71 542 -3.75000000000000e-01 71 265 4.16666666666667e-02 71 547 -8.33333333333333e-02 71 540 8.33333333333333e-02 71 264 -8.33333333333333e-02 71 515 -1.25000000000000e-01 71 535 -4.16666666666667e-02 71 533 -2.50000000000000e-01 71 514 -4.16666666666667e-02 71 172 4.16666666666667e-02 71 513 8.33333333333333e-02 71 171 -8.33333333333333e-02 72 72 2.50000000000000e+00 72 556 -1.66666666666667e-01 72 551 1.66666666666667e-01 72 563 -1.66666666666667e-01 72 565 -8.33333333333333e-02 72 562 8.33333333333333e-02 72 566 -8.33333333333333e-02 72 550 1.66666666666667e-01 72 549 -7.50000000000000e-01 72 482 1.66666666666667e-01 72 376 8.33333333333333e-02 72 481 -8.33333333333333e-02 72 377 -1.66666666666667e-01 72 176 8.33333333333333e-02 72 480 -2.50000000000000e-01 72 554 -8.33333333333333e-02 72 293 8.33333333333333e-02 72 73 -3.33333333333333e-01 72 553 1.66666666666667e-01 72 552 -2.50000000000000e-01 72 518 -8.33333333333333e-02 72 517 1.66666666666667e-01 72 350 -8.33333333333333e-02 72 413 8.33333333333333e-02 72 442 1.66666666666667e-01 72 412 -1.66666666666667e-01 72 175 8.33333333333333e-02 72 349 -8.33333333333333e-02 72 516 -2.50000000000000e-01 72 74 -3.33333333333333e-01 72 560 1.66666666666667e-01 72 443 1.66666666666667e-01 72 559 -8.33333333333333e-02 72 292 8.33333333333333e-02 72 557 8.33333333333333e-02 72 558 -2.50000000000000e-01 72 441 -7.50000000000000e-01 73 73 2.50000000000000e+00 73 555 -1.66666666666667e-01 73 551 -8.33333333333333e-02 73 566 -8.33333333333333e-02 73 563 8.33333333333333e-02 73 564 -8.33333333333333e-02 73 561 8.33333333333333e-02 73 550 -2.50000000000000e-01 73 549 1.66666666666667e-01 73 375 8.33333333333333e-02 73 480 -8.33333333333333e-02 73 377 8.33333333333333e-02 73 482 1.66666666666667e-01 73 481 -2.50000000000000e-01 73 554 1.66666666666667e-01 73 553 -7.50000000000000e-01 73 72 -3.33333333333333e-01 73 552 1.66666666666667e-01 73 443 -8.33333333333333e-02 73 74 -3.33333333333333e-01 73 350 -8.33333333333333e-02 73 413 8.33333333333333e-02 73 516 1.66666666666667e-01 73 441 1.66666666666667e-01 73 411 -1.66666666666667e-01 73 176 -1.66666666666667e-01 73 518 1.66666666666667e-01 73 517 -7.50000000000000e-01 73 174 8.33333333333333e-02 73 348 -8.33333333333333e-02 73 560 1.66666666666667e-01 73 293 -1.66666666666667e-01 73 557 8.33333333333333e-02 73 559 -2.50000000000000e-01 73 442 -2.50000000000000e-01 73 558 -8.33333333333333e-02 73 291 8.33333333333333e-02 74 74 2.50000000000000e+00 74 556 8.33333333333333e-02 74 550 -8.33333333333333e-02 74 565 -8.33333333333333e-02 74 562 8.33333333333333e-02 74 549 1.66666666666667e-01 74 561 -1.66666666666667e-01 74 564 -8.33333333333333e-02 74 551 -2.50000000000000e-01 74 480 1.66666666666667e-01 74 376 8.33333333333333e-02 74 375 -1.66666666666667e-01 74 482 -7.50000000000000e-01 74 481 1.66666666666667e-01 74 174 8.33333333333333e-02 74 554 -2.50000000000000e-01 74 553 1.66666666666667e-01 74 552 -8.33333333333333e-02 74 291 8.33333333333333e-02 74 442 -8.33333333333333e-02 74 73 -3.33333333333333e-01 74 516 -8.33333333333333e-02 74 349 -8.33333333333333e-02 74 412 8.33333333333333e-02 74 348 -8.33333333333333e-02 74 411 8.33333333333333e-02 74 518 -2.50000000000000e-01 74 175 -1.66666666666667e-01 74 517 1.66666666666667e-01 74 555 8.33333333333333e-02 74 560 -7.50000000000000e-01 74 443 -2.50000000000000e-01 74 559 1.66666666666667e-01 74 292 -1.66666666666667e-01 74 72 -3.33333333333333e-01 74 558 1.66666666666667e-01 74 441 1.66666666666667e-01 75 75 2.50000000000000e+00 75 571 1.66666666666667e-01 75 570 -2.50000000000000e-01 75 485 -1.66666666666667e-01 75 484 8.33333333333333e-02 75 551 1.66666666666667e-01 75 583 8.33333333333333e-02 75 550 1.66666666666667e-01 75 549 -7.50000000000000e-01 75 584 8.33333333333333e-02 75 496 -8.33333333333333e-02 75 497 1.66666666666667e-01 75 77 -3.33333333333333e-01 75 179 -8.33333333333333e-02 75 495 -2.50000000000000e-01 75 575 8.33333333333333e-02 75 314 -8.33333333333333e-02 75 574 -1.66666666666667e-01 75 467 8.33333333333333e-02 75 568 1.66666666666667e-01 75 76 -3.33333333333333e-01 75 569 1.66666666666667e-01 75 313 -8.33333333333333e-02 75 567 -7.50000000000000e-01 75 466 8.33333333333333e-02 75 178 -8.33333333333333e-02 75 533 -8.33333333333333e-02 75 521 8.33333333333333e-02 75 580 8.33333333333333e-02 75 577 -8.33333333333333e-02 75 520 -1.66666666666667e-01 75 532 1.66666666666667e-01 75 531 -2.50000000000000e-01 75 578 1.66666666666667e-01 75 581 -1.66666666666667e-01 75 576 -2.50000000000000e-01 75 572 -8.33333333333333e-02 76 76 2.50000000000000e+00 76 570 1.66666666666667e-01 76 572 1.66666666666667e-01 76 571 -7.50000000000000e-01 76 483 8.33333333333333e-02 76 551 -8.33333333333333e-02 76 582 8.33333333333333e-02 76 550 -2.50000000000000e-01 76 549 1.66666666666667e-01 76 584 -1.66666666666667e-01 76 495 -8.33333333333333e-02 76 575 8.33333333333333e-02 76 497 1.66666666666667e-01 76 496 -2.50000000000000e-01 76 573 -1.66666666666667e-01 76 569 -8.33333333333333e-02 76 567 1.66666666666667e-01 76 75 -3.33333333333333e-01 76 568 -2.50000000000000e-01 76 312 -8.33333333333333e-02 76 467 -1.66666666666667e-01 76 465 8.33333333333333e-02 76 177 -8.33333333333333e-02 76 533 1.66666666666667e-01 76 77 -3.33333333333333e-01 76 578 1.66666666666667e-01 76 579 8.33333333333333e-02 76 576 -8.33333333333333e-02 76 521 8.33333333333333e-02 76 179 -8.33333333333333e-02 76 532 -7.50000000000000e-01 76 519 -1.66666666666667e-01 76 531 1.66666666666667e-01 76 581 8.33333333333333e-02 76 314 -8.33333333333333e-02 76 577 -2.50000000000000e-01 76 485 8.33333333333333e-02 77 77 2.50000000000000e+00 77 484 8.33333333333333e-02 77 572 -2.50000000000000e-01 77 571 1.66666666666667e-01 77 483 -1.66666666666667e-01 77 550 -8.33333333333333e-02 77 549 1.66666666666667e-01 77 551 -2.50000000000000e-01 77 583 -1.66666666666667e-01 77 582 8.33333333333333e-02 77 574 8.33333333333333e-02 77 495 1.66666666666667e-01 77 75 -3.33333333333333e-01 77 497 -7.50000000000000e-01 77 496 1.66666666666667e-01 77 177 -8.33333333333333e-02 77 573 8.33333333333333e-02 77 312 -8.33333333333333e-02 77 568 -8.33333333333333e-02 77 465 8.33333333333333e-02 77 569 -2.50000000000000e-01 77 567 1.66666666666667e-01 77 466 -1.66666666666667e-01 77 531 -8.33333333333333e-02 77 519 8.33333333333333e-02 77 532 1.66666666666667e-01 77 76 -3.33333333333333e-01 77 577 1.66666666666667e-01 77 533 -2.50000000000000e-01 77 520 8.33333333333333e-02 77 178 -8.33333333333333e-02 77 578 -7.50000000000000e-01 77 570 -8.33333333333333e-02 77 580 8.33333333333333e-02 77 313 -8.33333333333333e-02 77 576 1.66666666666667e-01 77 579 -1.66666666666667e-01 78 78 1.25000000000000e+00 78 226 8.33333333333333e-02 78 79 -1.66666666666667e-01 78 184 8.33333333333333e-02 78 590 8.33333333333333e-02 78 589 8.33333333333333e-02 78 225 -1.25000000000000e-01 78 587 1.66666666666667e-01 78 586 -8.33333333333333e-02 78 585 -2.50000000000000e-01 78 183 -1.25000000000000e-01 78 80 -1.66666666666667e-01 78 185 -4.16666666666667e-02 78 470 4.16666666666667e-02 78 469 -8.33333333333333e-02 78 227 -4.16666666666667e-02 78 499 8.33333333333333e-02 78 500 8.33333333333333e-02 78 498 -3.75000000000000e-01 78 976 -8.33333333333333e-02 78 971 8.33333333333333e-02 78 970 8.33333333333333e-02 78 969 -3.75000000000000e-01 78 980 -8.33333333333333e-02 78 979 -8.33333333333333e-02 78 974 -1.66666666666667e-01 78 973 8.33333333333333e-02 78 977 4.16666666666667e-02 79 79 1.25000000000000e+00 79 225 8.33333333333333e-02 79 78 -1.66666666666667e-01 79 183 8.33333333333333e-02 79 590 -1.66666666666667e-01 79 227 8.33333333333333e-02 79 226 -3.75000000000000e-01 79 588 8.33333333333333e-02 79 587 1.66666666666667e-01 79 80 -1.66666666666667e-01 79 185 8.33333333333333e-02 79 586 -2.50000000000000e-01 79 184 -3.75000000000000e-01 79 585 -8.33333333333333e-02 79 470 4.16666666666667e-02 79 468 -8.33333333333333e-02 79 500 -4.16666666666667e-02 79 499 -1.25000000000000e-01 79 498 8.33333333333333e-02 79 975 -8.33333333333333e-02 79 971 -4.16666666666667e-02 79 970 -1.25000000000000e-01 79 969 8.33333333333333e-02 79 980 -8.33333333333333e-02 79 974 8.33333333333333e-02 79 978 -8.33333333333333e-02 79 977 4.16666666666667e-02 79 972 8.33333333333333e-02 80 80 1.25000000000000e+00 80 588 8.33333333333333e-02 80 227 -1.25000000000000e-01 80 589 -1.66666666666667e-01 80 226 8.33333333333333e-02 80 587 -7.50000000000000e-01 80 185 -1.25000000000000e-01 80 586 1.66666666666667e-01 80 79 -1.66666666666667e-01 80 184 8.33333333333333e-02 80 585 1.66666666666667e-01 80 469 4.16666666666667e-02 80 498 8.33333333333333e-02 80 78 -1.66666666666667e-01 80 183 -4.16666666666667e-02 80 468 4.16666666666667e-02 80 499 -4.16666666666667e-02 80 500 -1.25000000000000e-01 80 225 -4.16666666666667e-02 80 976 4.16666666666667e-02 80 971 -1.25000000000000e-01 80 970 -4.16666666666667e-02 80 969 8.33333333333333e-02 80 978 -8.33333333333333e-02 80 979 -8.33333333333333e-02 80 973 8.33333333333333e-02 80 975 4.16666666666667e-02 80 972 -1.66666666666667e-01 81 81 1.25000000000000e+00 81 596 8.33333333333333e-02 81 593 -8.33333333333333e-02 81 592 1.66666666666667e-01 81 591 -2.50000000000000e-01 81 269 8.33333333333333e-02 81 267 -1.25000000000000e-01 81 83 -1.66666666666667e-01 81 188 8.33333333333333e-02 81 595 8.33333333333333e-02 81 186 -1.25000000000000e-01 81 82 -1.66666666666667e-01 81 535 8.33333333333333e-02 81 473 -8.33333333333333e-02 81 187 -4.16666666666667e-02 81 472 4.16666666666667e-02 81 536 8.33333333333333e-02 81 268 -4.16666666666667e-02 81 534 -3.75000000000000e-01 81 1004 8.33333333333333e-02 81 1010 -8.33333333333333e-02 81 1006 4.16666666666667e-02 81 1009 -8.33333333333333e-02 81 1007 -8.33333333333333e-02 81 1001 8.33333333333333e-02 81 1000 8.33333333333333e-02 81 1003 -1.66666666666667e-01 81 999 -3.75000000000000e-01 82 82 1.25000000000000e+00 82 596 -1.66666666666667e-01 82 269 8.33333333333333e-02 82 593 1.66666666666667e-01 82 83 -1.66666666666667e-01 82 188 8.33333333333333e-02 82 592 -7.50000000000000e-01 82 591 1.66666666666667e-01 82 268 -1.25000000000000e-01 82 594 8.33333333333333e-02 82 187 -1.25000000000000e-01 82 536 -4.16666666666667e-02 82 81 -1.66666666666667e-01 82 534 8.33333333333333e-02 82 186 -4.16666666666667e-02 82 471 4.16666666666667e-02 82 473 4.16666666666667e-02 82 535 -1.25000000000000e-01 82 267 -4.16666666666667e-02 82 1005 4.16666666666667e-02 82 1008 -8.33333333333333e-02 82 1007 4.16666666666667e-02 82 1010 -8.33333333333333e-02 82 1001 -4.16666666666667e-02 82 1004 8.33333333333333e-02 82 1000 -1.25000000000000e-01 82 999 8.33333333333333e-02 82 1002 -1.66666666666667e-01 83 83 1.25000000000000e+00 83 268 8.33333333333333e-02 83 594 8.33333333333333e-02 83 593 -2.50000000000000e-01 83 592 1.66666666666667e-01 83 82 -1.66666666666667e-01 83 187 8.33333333333333e-02 83 591 -8.33333333333333e-02 83 269 -3.75000000000000e-01 83 267 8.33333333333333e-02 83 595 -1.66666666666667e-01 83 188 -3.75000000000000e-01 83 81 -1.66666666666667e-01 83 186 8.33333333333333e-02 83 472 4.16666666666667e-02 83 535 -4.16666666666667e-02 83 471 -8.33333333333333e-02 83 536 -1.25000000000000e-01 83 534 8.33333333333333e-02 83 1002 8.33333333333333e-02 83 1008 -8.33333333333333e-02 83 1006 4.16666666666667e-02 83 1009 -8.33333333333333e-02 83 1005 -8.33333333333333e-02 83 1001 -1.25000000000000e-01 83 1000 -4.16666666666667e-02 83 1003 8.33333333333333e-02 83 999 8.33333333333333e-02 84 84 2.50000000000000e+00 84 599 -8.33333333333333e-02 84 598 1.66666666666667e-01 84 316 8.33333333333333e-02 84 597 -2.50000000000000e-01 84 86 -3.33333333333333e-01 84 587 1.66666666666667e-01 84 586 -8.33333333333333e-02 84 190 8.33333333333333e-02 84 585 -2.50000000000000e-01 84 601 -8.33333333333333e-02 84 602 1.66666666666667e-01 84 317 8.33333333333333e-02 84 600 -2.50000000000000e-01 84 593 -8.33333333333333e-02 84 191 8.33333333333333e-02 84 85 -3.33333333333333e-01 84 592 1.66666666666667e-01 84 591 -2.50000000000000e-01 84 502 8.33333333333333e-02 84 503 -1.66666666666667e-01 84 476 -8.33333333333333e-02 84 539 8.33333333333333e-02 84 568 1.66666666666667e-01 84 538 -1.66666666666667e-01 84 475 -8.33333333333333e-02 84 569 1.66666666666667e-01 84 567 -7.50000000000000e-01 84 1033 -1.66666666666667e-01 84 1031 1.66666666666667e-01 84 1037 -1.66666666666667e-01 84 1039 -8.33333333333333e-02 84 1036 8.33333333333333e-02 84 1040 -8.33333333333333e-02 84 1030 1.66666666666667e-01 84 1034 8.33333333333333e-02 84 1029 -7.50000000000000e-01 85 85 2.50000000000000e+00 85 599 1.66666666666667e-01 85 598 -7.50000000000000e-01 85 315 8.33333333333333e-02 85 587 1.66666666666667e-01 85 586 -2.50000000000000e-01 85 585 -8.33333333333333e-02 85 189 8.33333333333333e-02 85 86 -3.33333333333333e-01 85 600 -8.33333333333333e-02 85 317 -1.66666666666667e-01 85 602 1.66666666666667e-01 85 601 -2.50000000000000e-01 85 593 1.66666666666667e-01 85 191 -1.66666666666667e-01 85 597 1.66666666666667e-01 85 592 -7.50000000000000e-01 85 84 -3.33333333333333e-01 85 591 1.66666666666667e-01 85 503 8.33333333333333e-02 85 569 -8.33333333333333e-02 85 476 -8.33333333333333e-02 85 539 8.33333333333333e-02 85 567 1.66666666666667e-01 85 537 -1.66666666666667e-01 85 474 -8.33333333333333e-02 85 501 8.33333333333333e-02 85 568 -2.50000000000000e-01 85 1034 8.33333333333333e-02 85 1032 -1.66666666666667e-01 85 1031 -8.33333333333333e-02 85 1040 -8.33333333333333e-02 85 1037 8.33333333333333e-02 85 1038 -8.33333333333333e-02 85 1035 8.33333333333333e-02 85 1030 -2.50000000000000e-01 85 1029 1.66666666666667e-01 86 86 2.50000000000000e+00 86 597 -8.33333333333333e-02 86 599 -2.50000000000000e-01 86 598 1.66666666666667e-01 86 587 -7.50000000000000e-01 86 586 1.66666666666667e-01 86 84 -3.33333333333333e-01 86 585 1.66666666666667e-01 86 85 -3.33333333333333e-01 86 600 1.66666666666667e-01 86 602 -7.50000000000000e-01 86 316 -1.66666666666667e-01 86 601 1.66666666666667e-01 86 315 8.33333333333333e-02 86 593 -2.50000000000000e-01 86 592 1.66666666666667e-01 86 190 -1.66666666666667e-01 86 591 -8.33333333333333e-02 86 189 8.33333333333333e-02 86 502 8.33333333333333e-02 86 501 -1.66666666666667e-01 86 568 -8.33333333333333e-02 86 475 -8.33333333333333e-02 86 538 8.33333333333333e-02 86 474 -8.33333333333333e-02 86 537 8.33333333333333e-02 86 569 -2.50000000000000e-01 86 567 1.66666666666667e-01 86 1033 8.33333333333333e-02 86 1030 -8.33333333333333e-02 86 1039 -8.33333333333333e-02 86 1036 8.33333333333333e-02 86 1029 1.66666666666667e-01 86 1035 -1.66666666666667e-01 86 1038 -8.33333333333333e-02 86 1032 8.33333333333333e-02 86 1031 -2.50000000000000e-01 87 87 5.00000000000000e-01 87 380 -4.16666666666667e-02 87 607 4.16666666666667e-02 87 604 -4.16666666666667e-02 87 212 4.16666666666667e-02 87 608 -8.33333333333333e-02 87 211 4.16666666666667e-02 87 88 -8.33333333333333e-02 87 379 8.33333333333333e-02 87 210 -1.25000000000000e-01 87 378 -1.25000000000000e-01 87 89 -8.33333333333333e-02 87 197 4.16666666666667e-02 87 605 8.33333333333333e-02 87 196 4.16666666666667e-02 87 361 -8.33333333333333e-02 87 362 4.16666666666667e-02 87 195 -1.25000000000000e-01 87 603 -1.25000000000000e-01 88 88 5.83333333333333e-01 88 380 8.33333333333333e-02 88 605 8.33333333333333e-02 88 606 4.16666666666667e-02 88 603 -4.16666666666667e-02 88 212 -4.16666666666667e-02 88 608 4.16666666666667e-02 88 211 -4.16666666666667e-02 88 379 -3.75000000000000e-01 88 210 4.16666666666667e-02 88 87 -8.33333333333333e-02 88 378 8.33333333333333e-02 88 197 -4.16666666666667e-02 88 362 4.16666666666667e-02 88 89 -1.66666666666667e-01 88 196 -4.16666666666667e-02 88 604 -1.25000000000000e-01 88 195 4.16666666666667e-02 88 360 -8.33333333333333e-02 89 89 5.83333333333333e-01 89 378 -4.16666666666667e-02 89 88 -1.66666666666667e-01 89 379 8.33333333333333e-02 89 604 8.33333333333333e-02 89 212 -4.16666666666667e-02 89 380 -1.25000000000000e-01 89 211 -4.16666666666667e-02 89 607 4.16666666666667e-02 89 210 4.16666666666667e-02 89 606 -8.33333333333333e-02 89 360 4.16666666666667e-02 89 197 -4.16666666666667e-02 89 605 -3.75000000000000e-01 89 196 -4.16666666666667e-02 89 361 4.16666666666667e-02 89 87 -8.33333333333333e-02 89 195 4.16666666666667e-02 89 603 8.33333333333333e-02 90 90 3.39166666666667e+01 90 200 2.12500000000000e+00 90 92 -4.25000000000000e+00 90 281 2.12500000000000e+00 90 364 2.12500000000000e+00 90 365 2.12500000000000e+00 90 198 -4.20833333333333e+00 90 428 -2.12500000000000e+00 90 427 4.25000000000000e+00 90 426 -6.37500000000000e+00 90 279 -4.20833333333333e+00 90 610 8.33333333333333e-02 90 91 -1.66666666666667e-01 90 614 -8.33333333333333e-02 90 280 -4.16666666666667e-02 90 613 4.16666666666667e-02 90 611 8.33333333333333e-02 90 199 -4.16666666666667e-02 90 609 -3.75000000000000e-01 90 1826 -4.16666666666667e+00 90 1835 4.16666666666667e+00 90 1834 4.16666666666667e+00 90 1833 -1.87500000000000e+01 90 1729 -4.16666666666667e+00 90 1730 -4.16666666666667e+00 90 1793 4.16666666666667e+00 90 1792 -8.33333333333333e+00 90 1825 2.08333333333333e+00 91 91 3.39166666666667e+01 91 363 2.12500000000000e+00 91 365 -4.25000000000000e+00 91 200 2.12500000000000e+00 91 199 -4.20833333333333e+00 91 428 4.25000000000000e+00 91 92 -4.25000000000000e+00 91 281 2.12500000000000e+00 91 427 -1.91250000000000e+01 91 280 -4.20833333333333e+00 91 426 4.25000000000000e+00 91 614 4.16666666666667e-02 91 609 8.33333333333333e-02 91 90 -1.66666666666667e-01 91 279 -4.16666666666667e-02 91 612 4.16666666666667e-02 91 611 -4.16666666666667e-02 91 610 -1.25000000000000e-01 91 198 -4.16666666666667e-02 91 1826 2.08333333333333e+00 91 1835 -2.08333333333333e+00 91 1834 -6.25000000000000e+00 91 1833 4.16666666666667e+00 91 1728 -4.16666666666667e+00 91 1730 -4.16666666666667e+00 91 1793 4.16666666666667e+00 91 1824 2.08333333333333e+00 91 1791 -8.33333333333333e+00 92 92 3.80000000000000e+01 92 198 2.12500000000000e+00 92 90 -4.25000000000000e+00 92 279 2.12500000000000e+00 92 200 -1.26250000000000e+01 92 364 -4.25000000000000e+00 92 199 2.12500000000000e+00 92 363 2.12500000000000e+00 92 428 -6.37500000000000e+00 92 281 -1.26250000000000e+01 92 427 4.25000000000000e+00 92 91 -4.25000000000000e+00 92 280 2.12500000000000e+00 92 426 -2.12500000000000e+00 92 613 4.16666666666667e-02 92 612 -8.33333333333333e-02 92 610 -4.16666666666667e-02 92 611 -1.25000000000000e-01 92 609 8.33333333333333e-02 92 1824 -4.16666666666667e+00 92 1835 -6.25000000000000e+00 92 1834 -2.08333333333333e+00 92 1833 4.16666666666667e+00 92 1729 -4.16666666666667e+00 92 1792 4.16666666666667e+00 92 1728 -4.16666666666667e+00 92 1825 2.08333333333333e+00 92 1791 4.16666666666667e+00 93 93 1.25000000000000e+00 93 382 8.33333333333333e-02 93 383 8.33333333333333e-02 93 605 8.33333333333333e-02 93 603 -1.25000000000000e-01 93 617 8.33333333333333e-02 93 616 8.33333333333333e-02 93 94 -1.66666666666667e-01 93 615 -3.75000000000000e-01 93 446 -8.33333333333333e-02 93 95 -1.66666666666667e-01 93 368 -8.33333333333333e-02 93 431 8.33333333333333e-02 93 610 8.33333333333333e-02 93 445 1.66666666666667e-01 93 430 -1.66666666666667e-01 93 611 8.33333333333333e-02 93 203 -8.33333333333333e-02 93 202 4.16666666666667e-02 93 367 -8.33333333333333e-02 93 609 -3.75000000000000e-01 93 620 8.33333333333333e-02 93 296 -8.33333333333333e-02 93 619 -4.16666666666667e-02 93 295 4.16666666666667e-02 93 618 -1.25000000000000e-01 93 604 -4.16666666666667e-02 93 444 -2.50000000000000e-01 94 94 1.25000000000000e+00 94 603 -4.16666666666667e-02 94 381 8.33333333333333e-02 94 383 -1.66666666666667e-01 94 203 4.16666666666667e-02 94 604 -1.25000000000000e-01 94 617 -4.16666666666667e-02 94 296 4.16666666666667e-02 94 616 -1.25000000000000e-01 94 615 8.33333333333333e-02 94 93 -1.66666666666667e-01 94 611 -4.16666666666667e-02 94 609 8.33333333333333e-02 94 368 -8.33333333333333e-02 94 431 8.33333333333333e-02 94 444 1.66666666666667e-01 94 429 -1.66666666666667e-01 94 610 -1.25000000000000e-01 94 201 4.16666666666667e-02 94 366 -8.33333333333333e-02 94 620 8.33333333333333e-02 94 95 -1.66666666666667e-01 94 446 1.66666666666667e-01 94 619 -1.25000000000000e-01 94 605 8.33333333333333e-02 94 445 -7.50000000000000e-01 94 618 -4.16666666666667e-02 94 294 4.16666666666667e-02 95 95 1.25000000000000e+00 95 382 -1.66666666666667e-01 95 381 8.33333333333333e-02 95 605 -3.75000000000000e-01 95 202 4.16666666666667e-02 95 603 8.33333333333333e-02 95 617 -1.25000000000000e-01 95 616 -4.16666666666667e-02 95 295 4.16666666666667e-02 95 615 8.33333333333333e-02 95 444 -8.33333333333333e-02 95 610 -4.16666666666667e-02 95 93 -1.66666666666667e-01 95 366 -8.33333333333333e-02 95 429 8.33333333333333e-02 95 367 -8.33333333333333e-02 95 430 8.33333333333333e-02 95 611 -1.25000000000000e-01 95 609 8.33333333333333e-02 95 201 -8.33333333333333e-02 95 620 -3.75000000000000e-01 95 604 8.33333333333333e-02 95 446 -2.50000000000000e-01 95 619 8.33333333333333e-02 95 94 -1.66666666666667e-01 95 445 1.66666666666667e-01 95 618 8.33333333333333e-02 95 294 -8.33333333333333e-02 96 96 5.00000000000000e-01 96 506 -4.16666666666667e-02 96 625 4.16666666666667e-02 96 622 -4.16666666666667e-02 96 230 4.16666666666667e-02 96 626 -8.33333333333333e-02 96 229 4.16666666666667e-02 96 97 -8.33333333333333e-02 96 505 8.33333333333333e-02 96 228 -1.25000000000000e-01 96 504 -1.25000000000000e-01 96 98 -8.33333333333333e-02 96 215 4.16666666666667e-02 96 623 8.33333333333333e-02 96 214 4.16666666666667e-02 96 487 -8.33333333333333e-02 96 488 4.16666666666667e-02 96 213 -1.25000000000000e-01 96 621 -1.25000000000000e-01 97 97 5.83333333333333e-01 97 506 8.33333333333333e-02 97 623 8.33333333333333e-02 97 624 4.16666666666667e-02 97 621 -4.16666666666667e-02 97 230 -4.16666666666667e-02 97 626 4.16666666666667e-02 97 229 -4.16666666666667e-02 97 505 -3.75000000000000e-01 97 228 4.16666666666667e-02 97 96 -8.33333333333333e-02 97 504 8.33333333333333e-02 97 215 -4.16666666666667e-02 97 488 4.16666666666667e-02 97 98 -1.66666666666667e-01 97 214 -4.16666666666667e-02 97 622 -1.25000000000000e-01 97 213 4.16666666666667e-02 97 486 -8.33333333333333e-02 98 98 5.83333333333333e-01 98 504 -4.16666666666667e-02 98 97 -1.66666666666667e-01 98 505 8.33333333333333e-02 98 622 8.33333333333333e-02 98 230 -4.16666666666667e-02 98 506 -1.25000000000000e-01 98 229 -4.16666666666667e-02 98 625 4.16666666666667e-02 98 228 4.16666666666667e-02 98 624 -8.33333333333333e-02 98 486 4.16666666666667e-02 98 215 -4.16666666666667e-02 98 623 -3.75000000000000e-01 98 214 -4.16666666666667e-02 98 487 4.16666666666667e-02 98 96 -8.33333333333333e-02 98 213 4.16666666666667e-02 98 621 8.33333333333333e-02 99 99 1.25000000000000e+00 99 100 -1.66666666666667e-01 99 632 -8.33333333333333e-02 99 298 -4.16666666666667e-02 99 631 4.16666666666667e-02 99 629 8.33333333333333e-02 99 217 -4.16666666666667e-02 99 627 -3.75000000000000e-01 99 607 4.16666666666667e-02 99 218 8.33333333333333e-02 99 608 -8.33333333333333e-02 99 101 -1.66666666666667e-01 99 617 8.33333333333333e-02 99 299 8.33333333333333e-02 99 616 8.33333333333333e-02 99 615 -3.75000000000000e-01 99 385 -8.33333333333333e-02 99 490 8.33333333333333e-02 99 491 8.33333333333333e-02 99 386 -8.33333333333333e-02 99 216 -1.25000000000000e-01 99 554 -8.33333333333333e-02 99 449 8.33333333333333e-02 99 553 1.66666666666667e-01 99 448 -1.66666666666667e-01 99 552 -2.50000000000000e-01 99 628 8.33333333333333e-02 99 297 -1.25000000000000e-01 100 100 1.25000000000000e+00 100 632 4.16666666666667e-02 100 627 8.33333333333333e-02 100 99 -1.66666666666667e-01 100 297 -4.16666666666667e-02 100 630 4.16666666666667e-02 100 628 -1.25000000000000e-01 100 216 -4.16666666666667e-02 100 606 4.16666666666667e-02 100 608 4.16666666666667e-02 100 617 -4.16666666666667e-02 100 616 -1.25000000000000e-01 100 615 8.33333333333333e-02 100 384 -8.33333333333333e-02 100 489 8.33333333333333e-02 100 386 -8.33333333333333e-02 100 449 8.33333333333333e-02 100 491 -1.66666666666667e-01 100 218 8.33333333333333e-02 100 217 -1.25000000000000e-01 100 554 1.66666666666667e-01 100 101 -1.66666666666667e-01 100 299 8.33333333333333e-02 100 553 -7.50000000000000e-01 100 629 -4.16666666666667e-02 100 298 -1.25000000000000e-01 100 552 1.66666666666667e-01 100 447 -1.66666666666667e-01 101 101 1.25000000000000e+00 101 631 4.16666666666667e-02 101 630 -8.33333333333333e-02 101 629 -1.25000000000000e-01 101 627 8.33333333333333e-02 101 607 4.16666666666667e-02 101 216 8.33333333333333e-02 101 606 -8.33333333333333e-02 101 617 -1.25000000000000e-01 101 616 -4.16666666666667e-02 101 99 -1.66666666666667e-01 101 615 8.33333333333333e-02 101 297 8.33333333333333e-02 101 385 -8.33333333333333e-02 101 448 8.33333333333333e-02 101 218 -3.75000000000000e-01 101 490 -1.66666666666667e-01 101 217 8.33333333333333e-02 101 489 8.33333333333333e-02 101 384 -8.33333333333333e-02 101 554 -2.50000000000000e-01 101 628 -4.16666666666667e-02 101 299 -3.75000000000000e-01 101 553 1.66666666666667e-01 101 100 -1.66666666666667e-01 101 298 8.33333333333333e-02 101 552 -8.33333333333333e-02 101 447 8.33333333333333e-02 102 102 1.25000000000000e+00 102 508 8.33333333333333e-02 102 509 8.33333333333333e-02 102 623 8.33333333333333e-02 102 621 -1.25000000000000e-01 102 635 8.33333333333333e-02 102 634 8.33333333333333e-02 102 103 -1.66666666666667e-01 102 633 -3.75000000000000e-01 102 572 -8.33333333333333e-02 102 104 -1.66666666666667e-01 102 494 -8.33333333333333e-02 102 557 8.33333333333333e-02 102 628 8.33333333333333e-02 102 571 1.66666666666667e-01 102 556 -1.66666666666667e-01 102 629 8.33333333333333e-02 102 221 -8.33333333333333e-02 102 220 4.16666666666667e-02 102 493 -8.33333333333333e-02 102 627 -3.75000000000000e-01 102 638 8.33333333333333e-02 102 320 -8.33333333333333e-02 102 637 -4.16666666666667e-02 102 319 4.16666666666667e-02 102 636 -1.25000000000000e-01 102 622 -4.16666666666667e-02 102 570 -2.50000000000000e-01 103 103 1.25000000000000e+00 103 621 -4.16666666666667e-02 103 507 8.33333333333333e-02 103 509 -1.66666666666667e-01 103 221 4.16666666666667e-02 103 622 -1.25000000000000e-01 103 635 -4.16666666666667e-02 103 320 4.16666666666667e-02 103 634 -1.25000000000000e-01 103 633 8.33333333333333e-02 103 102 -1.66666666666667e-01 103 629 -4.16666666666667e-02 103 627 8.33333333333333e-02 103 494 -8.33333333333333e-02 103 557 8.33333333333333e-02 103 570 1.66666666666667e-01 103 555 -1.66666666666667e-01 103 628 -1.25000000000000e-01 103 219 4.16666666666667e-02 103 492 -8.33333333333333e-02 103 638 8.33333333333333e-02 103 104 -1.66666666666667e-01 103 572 1.66666666666667e-01 103 637 -1.25000000000000e-01 103 623 8.33333333333333e-02 103 571 -7.50000000000000e-01 103 636 -4.16666666666667e-02 103 318 4.16666666666667e-02 104 104 1.25000000000000e+00 104 508 -1.66666666666667e-01 104 507 8.33333333333333e-02 104 623 -3.75000000000000e-01 104 220 4.16666666666667e-02 104 621 8.33333333333333e-02 104 635 -1.25000000000000e-01 104 634 -4.16666666666667e-02 104 319 4.16666666666667e-02 104 633 8.33333333333333e-02 104 570 -8.33333333333333e-02 104 628 -4.16666666666667e-02 104 102 -1.66666666666667e-01 104 492 -8.33333333333333e-02 104 555 8.33333333333333e-02 104 493 -8.33333333333333e-02 104 556 8.33333333333333e-02 104 629 -1.25000000000000e-01 104 627 8.33333333333333e-02 104 219 -8.33333333333333e-02 104 638 -3.75000000000000e-01 104 622 8.33333333333333e-02 104 572 -2.50000000000000e-01 104 637 8.33333333333333e-02 104 103 -1.66666666666667e-01 104 571 1.66666666666667e-01 104 636 8.33333333333333e-02 104 318 -8.33333333333333e-02 105 105 1.25000000000000e+00 105 599 -8.33333333333333e-02 105 106 -1.66666666666667e-01 105 598 1.66666666666667e-01 105 323 8.33333333333333e-02 105 322 -4.16666666666667e-02 105 321 -1.25000000000000e-01 105 597 -2.50000000000000e-01 105 107 -1.66666666666667e-01 105 233 8.33333333333333e-02 105 232 -4.16666666666667e-02 105 589 8.33333333333333e-02 105 590 8.33333333333333e-02 105 231 -1.25000000000000e-01 105 626 -8.33333333333333e-02 105 635 8.33333333333333e-02 105 634 8.33333333333333e-02 105 633 -3.75000000000000e-01 105 511 -8.33333333333333e-02 105 512 -8.33333333333333e-02 105 575 8.33333333333333e-02 105 574 -1.66666666666667e-01 105 625 4.16666666666667e-02 105 1210 8.33333333333333e-02 105 1214 -8.33333333333333e-02 105 1213 4.16666666666667e-02 105 1211 8.33333333333333e-02 105 1209 -3.75000000000000e-01 106 106 1.25000000000000e+00 106 105 -1.66666666666667e-01 106 597 1.66666666666667e-01 106 323 8.33333333333333e-02 106 107 -1.66666666666667e-01 106 599 1.66666666666667e-01 106 322 -1.25000000000000e-01 106 598 -7.50000000000000e-01 106 321 -4.16666666666667e-02 106 233 8.33333333333333e-02 106 590 -1.66666666666667e-01 106 232 -1.25000000000000e-01 106 231 -4.16666666666667e-02 106 588 8.33333333333333e-02 106 626 4.16666666666667e-02 106 635 -4.16666666666667e-02 106 634 -1.25000000000000e-01 106 633 8.33333333333333e-02 106 510 -8.33333333333333e-02 106 512 -8.33333333333333e-02 106 575 8.33333333333333e-02 106 624 4.16666666666667e-02 106 573 -1.66666666666667e-01 106 1214 4.16666666666667e-02 106 1209 8.33333333333333e-02 106 1212 4.16666666666667e-02 106 1211 -4.16666666666667e-02 106 1210 -1.25000000000000e-01 107 107 1.25000000000000e+00 107 588 8.33333333333333e-02 107 597 -8.33333333333333e-02 107 323 -3.75000000000000e-01 107 599 -2.50000000000000e-01 107 322 8.33333333333333e-02 107 106 -1.66666666666667e-01 107 598 1.66666666666667e-01 107 321 8.33333333333333e-02 107 233 -3.75000000000000e-01 107 232 8.33333333333333e-02 107 589 -1.66666666666667e-01 107 105 -1.66666666666667e-01 107 231 8.33333333333333e-02 107 624 -8.33333333333333e-02 107 635 -1.25000000000000e-01 107 634 -4.16666666666667e-02 107 633 8.33333333333333e-02 107 511 -8.33333333333333e-02 107 574 8.33333333333333e-02 107 510 -8.33333333333333e-02 107 625 4.16666666666667e-02 107 573 8.33333333333333e-02 107 1213 4.16666666666667e-02 107 1212 -8.33333333333333e-02 107 1210 -4.16666666666667e-02 107 1211 -1.25000000000000e-01 107 1209 8.33333333333333e-02 108 108 5.00000000000000e-01 108 397 4.16666666666667e-02 108 644 4.16666666666667e-02 108 641 -4.16666666666667e-02 108 239 4.16666666666667e-02 108 398 -8.33333333333333e-02 108 238 4.16666666666667e-02 108 109 -8.33333333333333e-02 108 640 8.33333333333333e-02 108 237 -1.25000000000000e-01 108 639 -1.25000000000000e-01 108 110 -8.33333333333333e-02 108 254 4.16666666666667e-02 108 416 8.33333333333333e-02 108 253 4.16666666666667e-02 108 643 -8.33333333333333e-02 108 415 -4.16666666666667e-02 108 252 -1.25000000000000e-01 108 414 -1.25000000000000e-01 109 109 5.83333333333333e-01 109 396 4.16666666666667e-02 109 416 8.33333333333333e-02 109 110 -1.66666666666667e-01 109 641 8.33333333333333e-02 109 239 -4.16666666666667e-02 109 398 4.16666666666667e-02 109 238 -4.16666666666667e-02 109 640 -3.75000000000000e-01 109 237 4.16666666666667e-02 109 108 -8.33333333333333e-02 109 639 8.33333333333333e-02 109 254 -4.16666666666667e-02 109 644 4.16666666666667e-02 109 414 -4.16666666666667e-02 109 253 -4.16666666666667e-02 109 415 -1.25000000000000e-01 109 252 4.16666666666667e-02 109 642 -8.33333333333333e-02 110 110 5.83333333333333e-01 110 109 -1.66666666666667e-01 110 640 8.33333333333333e-02 110 642 4.16666666666667e-02 110 639 -4.16666666666667e-02 110 239 -4.16666666666667e-02 110 641 -1.25000000000000e-01 110 238 -4.16666666666667e-02 110 397 4.16666666666667e-02 110 237 4.16666666666667e-02 110 396 -8.33333333333333e-02 110 415 8.33333333333333e-02 110 254 -4.16666666666667e-02 110 416 -3.75000000000000e-01 110 253 -4.16666666666667e-02 110 643 4.16666666666667e-02 110 108 -8.33333333333333e-02 110 252 4.16666666666667e-02 110 414 8.33333333333333e-02 111 111 3.39166666666667e+01 111 400 2.12500000000000e+00 111 434 4.25000000000000e+00 111 433 -2.12500000000000e+00 111 432 -6.37500000000000e+00 111 241 2.12500000000000e+00 111 240 -4.20833333333333e+00 111 112 -4.25000000000000e+00 111 283 2.12500000000000e+00 111 401 2.12500000000000e+00 111 282 -4.20833333333333e+00 111 113 -1.66666666666667e-01 111 647 8.33333333333333e-02 111 284 -4.16666666666667e-02 111 650 4.16666666666667e-02 111 649 -8.33333333333333e-02 111 242 -4.16666666666667e-02 111 646 8.33333333333333e-02 111 645 -3.75000000000000e-01 111 1766 -4.16666666666667e+00 111 1862 2.08333333333333e+00 111 1765 -4.16666666666667e+00 111 1798 4.16666666666667e+00 111 1861 -4.16666666666667e+00 111 1871 4.16666666666667e+00 111 1799 -8.33333333333333e+00 111 1870 4.16666666666667e+00 111 1869 -1.87500000000000e+01 112 112 3.80000000000000e+01 112 242 2.12500000000000e+00 112 399 2.12500000000000e+00 112 434 4.25000000000000e+00 112 113 -4.25000000000000e+00 112 284 2.12500000000000e+00 112 433 -6.37500000000000e+00 112 432 -2.12500000000000e+00 112 241 -1.26250000000000e+01 112 240 2.12500000000000e+00 112 401 -4.25000000000000e+00 112 283 -1.26250000000000e+01 112 111 -4.25000000000000e+00 112 282 2.12500000000000e+00 112 650 4.16666666666667e-02 112 647 -4.16666666666667e-02 112 648 -8.33333333333333e-02 112 646 -1.25000000000000e-01 112 645 8.33333333333333e-02 112 1764 -4.16666666666667e+00 112 1797 4.16666666666667e+00 112 1862 2.08333333333333e+00 112 1766 -4.16666666666667e+00 112 1860 -4.16666666666667e+00 112 1871 -2.08333333333333e+00 112 1799 4.16666666666667e+00 112 1870 -6.25000000000000e+00 112 1869 4.16666666666667e+00 113 113 3.39166666666667e+01 113 400 -4.25000000000000e+00 113 241 2.12500000000000e+00 113 434 -1.91250000000000e+01 113 433 4.25000000000000e+00 113 112 -4.25000000000000e+00 113 283 2.12500000000000e+00 113 432 4.25000000000000e+00 113 242 -4.20833333333333e+00 113 399 2.12500000000000e+00 113 284 -4.20833333333333e+00 113 646 -4.16666666666667e-02 113 111 -1.66666666666667e-01 113 645 8.33333333333333e-02 113 282 -4.16666666666667e-02 113 648 4.16666666666667e-02 113 649 4.16666666666667e-02 113 647 -1.25000000000000e-01 113 240 -4.16666666666667e-02 113 1764 -4.16666666666667e+00 113 1860 2.08333333333333e+00 113 1861 2.08333333333333e+00 113 1765 -4.16666666666667e+00 113 1871 -6.25000000000000e+00 113 1870 -2.08333333333333e+00 113 1798 4.16666666666667e+00 113 1869 4.16666666666667e+00 113 1797 -8.33333333333333e+00 114 114 1.25000000000000e+00 114 437 -1.66666666666667e-01 114 436 8.33333333333333e-02 114 245 4.16666666666667e-02 114 646 8.33333333333333e-02 114 645 -3.75000000000000e-01 114 656 -4.16666666666667e-02 114 302 4.16666666666667e-02 114 655 8.33333333333333e-02 114 654 -1.25000000000000e-01 114 404 -8.33333333333333e-02 114 403 -8.33333333333333e-02 114 419 8.33333333333333e-02 114 641 -4.16666666666667e-02 114 115 -1.66666666666667e-01 114 418 8.33333333333333e-02 114 451 -8.33333333333333e-02 114 244 -8.33333333333333e-02 114 640 8.33333333333333e-02 114 639 -1.25000000000000e-01 114 116 -1.66666666666667e-01 114 653 8.33333333333333e-02 114 452 1.66666666666667e-01 114 652 8.33333333333333e-02 114 301 -8.33333333333333e-02 114 647 8.33333333333333e-02 114 651 -3.75000000000000e-01 114 450 -2.50000000000000e-01 115 115 1.25000000000000e+00 115 437 8.33333333333333e-02 115 435 8.33333333333333e-02 115 646 -1.25000000000000e-01 115 645 8.33333333333333e-02 115 656 8.33333333333333e-02 115 116 -1.66666666666667e-01 115 655 -3.75000000000000e-01 115 654 8.33333333333333e-02 115 402 -8.33333333333333e-02 115 641 8.33333333333333e-02 115 114 -1.66666666666667e-01 115 419 -1.66666666666667e-01 115 452 1.66666666666667e-01 115 417 8.33333333333333e-02 115 450 -8.33333333333333e-02 115 245 4.16666666666667e-02 115 404 -8.33333333333333e-02 115 640 -3.75000000000000e-01 115 243 -8.33333333333333e-02 115 639 8.33333333333333e-02 115 653 -4.16666666666667e-02 115 302 4.16666666666667e-02 115 647 -4.16666666666667e-02 115 652 -1.25000000000000e-01 115 451 -2.50000000000000e-01 115 651 8.33333333333333e-02 115 300 -8.33333333333333e-02 116 116 1.25000000000000e+00 116 436 8.33333333333333e-02 116 645 8.33333333333333e-02 116 435 -1.66666666666667e-01 116 647 -1.25000000000000e-01 116 243 4.16666666666667e-02 116 656 -1.25000000000000e-01 116 655 8.33333333333333e-02 116 115 -1.66666666666667e-01 116 654 -4.16666666666667e-02 116 300 4.16666666666667e-02 116 402 -8.33333333333333e-02 116 640 8.33333333333333e-02 116 417 8.33333333333333e-02 116 639 -4.16666666666667e-02 116 418 -1.66666666666667e-01 116 451 1.66666666666667e-01 116 641 -1.25000000000000e-01 116 244 4.16666666666667e-02 116 403 -8.33333333333333e-02 116 646 -4.16666666666667e-02 116 653 -1.25000000000000e-01 116 452 -7.50000000000000e-01 116 652 -4.16666666666667e-02 116 301 4.16666666666667e-02 116 114 -1.66666666666667e-01 116 651 8.33333333333333e-02 116 450 1.66666666666667e-01 117 117 5.00000000000000e-01 117 523 4.16666666666667e-02 117 662 4.16666666666667e-02 117 659 -4.16666666666667e-02 117 257 4.16666666666667e-02 117 524 -8.33333333333333e-02 117 256 4.16666666666667e-02 117 118 -8.33333333333333e-02 117 658 8.33333333333333e-02 117 255 -1.25000000000000e-01 117 657 -1.25000000000000e-01 117 119 -8.33333333333333e-02 117 272 4.16666666666667e-02 117 542 8.33333333333333e-02 117 271 4.16666666666667e-02 117 661 -8.33333333333333e-02 117 541 -4.16666666666667e-02 117 270 -1.25000000000000e-01 117 540 -1.25000000000000e-01 118 118 5.83333333333333e-01 118 522 4.16666666666667e-02 118 542 8.33333333333333e-02 118 119 -1.66666666666667e-01 118 659 8.33333333333333e-02 118 257 -4.16666666666667e-02 118 524 4.16666666666667e-02 118 256 -4.16666666666667e-02 118 658 -3.75000000000000e-01 118 255 4.16666666666667e-02 118 117 -8.33333333333333e-02 118 657 8.33333333333333e-02 118 272 -4.16666666666667e-02 118 662 4.16666666666667e-02 118 540 -4.16666666666667e-02 118 271 -4.16666666666667e-02 118 541 -1.25000000000000e-01 118 270 4.16666666666667e-02 118 660 -8.33333333333333e-02 119 119 5.83333333333333e-01 119 118 -1.66666666666667e-01 119 658 8.33333333333333e-02 119 660 4.16666666666667e-02 119 657 -4.16666666666667e-02 119 257 -4.16666666666667e-02 119 659 -1.25000000000000e-01 119 256 -4.16666666666667e-02 119 523 4.16666666666667e-02 119 255 4.16666666666667e-02 119 522 -8.33333333333333e-02 119 541 8.33333333333333e-02 119 272 -4.16666666666667e-02 119 542 -3.75000000000000e-01 119 271 -4.16666666666667e-02 119 661 4.16666666666667e-02 119 117 -8.33333333333333e-02 119 270 4.16666666666667e-02 119 540 8.33333333333333e-02 120 120 1.25000000000000e+00 120 665 8.33333333333333e-02 120 305 -4.16666666666667e-02 120 668 4.16666666666667e-02 120 667 -8.33333333333333e-02 120 260 -4.16666666666667e-02 120 664 8.33333333333333e-02 120 663 -3.75000000000000e-01 120 527 8.33333333333333e-02 120 526 8.33333333333333e-02 120 560 1.66666666666667e-01 120 559 -8.33333333333333e-02 120 558 -2.50000000000000e-01 120 422 -8.33333333333333e-02 120 644 4.16666666666667e-02 120 421 -8.33333333333333e-02 120 454 8.33333333333333e-02 120 643 -8.33333333333333e-02 120 259 8.33333333333333e-02 120 258 -1.25000000000000e-01 120 653 8.33333333333333e-02 120 455 -1.66666666666667e-01 120 652 8.33333333333333e-02 120 121 -1.66666666666667e-01 120 304 8.33333333333333e-02 120 651 -3.75000000000000e-01 120 122 -1.66666666666667e-01 120 303 -1.25000000000000e-01 121 121 1.25000000000000e+00 121 665 -4.16666666666667e-02 121 666 -8.33333333333333e-02 121 664 -1.25000000000000e-01 121 663 8.33333333333333e-02 121 527 -1.66666666666667e-01 121 260 8.33333333333333e-02 121 525 8.33333333333333e-02 121 560 1.66666666666667e-01 121 122 -1.66666666666667e-01 121 305 8.33333333333333e-02 121 559 -2.50000000000000e-01 121 558 -8.33333333333333e-02 121 420 -8.33333333333333e-02 121 453 8.33333333333333e-02 121 644 4.16666666666667e-02 121 422 -8.33333333333333e-02 121 259 -3.75000000000000e-01 121 642 -8.33333333333333e-02 121 258 8.33333333333333e-02 121 653 -4.16666666666667e-02 121 455 8.33333333333333e-02 121 652 -1.25000000000000e-01 121 668 4.16666666666667e-02 121 304 -3.75000000000000e-01 121 651 8.33333333333333e-02 121 120 -1.66666666666667e-01 121 303 8.33333333333333e-02 122 122 1.25000000000000e+00 122 664 -4.16666666666667e-02 122 120 -1.66666666666667e-01 122 663 8.33333333333333e-02 122 303 -4.16666666666667e-02 122 666 4.16666666666667e-02 122 665 -1.25000000000000e-01 122 258 -4.16666666666667e-02 122 525 8.33333333333333e-02 122 526 -1.66666666666667e-01 122 259 8.33333333333333e-02 122 560 -7.50000000000000e-01 122 559 1.66666666666667e-01 122 121 -1.66666666666667e-01 122 304 8.33333333333333e-02 122 558 1.66666666666667e-01 122 420 -8.33333333333333e-02 122 642 4.16666666666667e-02 122 260 -1.25000000000000e-01 122 643 4.16666666666667e-02 122 421 -8.33333333333333e-02 122 653 -1.25000000000000e-01 122 667 4.16666666666667e-02 122 305 -1.25000000000000e-01 122 652 -4.16666666666667e-02 122 454 8.33333333333333e-02 122 651 8.33333333333333e-02 122 453 -1.66666666666667e-01 123 123 1.25000000000000e+00 123 563 -1.66666666666667e-01 123 562 8.33333333333333e-02 123 263 4.16666666666667e-02 123 664 8.33333333333333e-02 123 663 -3.75000000000000e-01 123 674 -4.16666666666667e-02 123 326 4.16666666666667e-02 123 673 8.33333333333333e-02 123 672 -1.25000000000000e-01 123 530 -8.33333333333333e-02 123 529 -8.33333333333333e-02 123 545 8.33333333333333e-02 123 659 -4.16666666666667e-02 123 124 -1.66666666666667e-01 123 544 8.33333333333333e-02 123 577 -8.33333333333333e-02 123 262 -8.33333333333333e-02 123 658 8.33333333333333e-02 123 657 -1.25000000000000e-01 123 125 -1.66666666666667e-01 123 671 8.33333333333333e-02 123 578 1.66666666666667e-01 123 670 8.33333333333333e-02 123 325 -8.33333333333333e-02 123 665 8.33333333333333e-02 123 669 -3.75000000000000e-01 123 576 -2.50000000000000e-01 124 124 1.25000000000000e+00 124 563 8.33333333333333e-02 124 561 8.33333333333333e-02 124 664 -1.25000000000000e-01 124 663 8.33333333333333e-02 124 674 8.33333333333333e-02 124 125 -1.66666666666667e-01 124 673 -3.75000000000000e-01 124 672 8.33333333333333e-02 124 528 -8.33333333333333e-02 124 659 8.33333333333333e-02 124 123 -1.66666666666667e-01 124 545 -1.66666666666667e-01 124 578 1.66666666666667e-01 124 543 8.33333333333333e-02 124 576 -8.33333333333333e-02 124 263 4.16666666666667e-02 124 530 -8.33333333333333e-02 124 658 -3.75000000000000e-01 124 261 -8.33333333333333e-02 124 657 8.33333333333333e-02 124 671 -4.16666666666667e-02 124 326 4.16666666666667e-02 124 665 -4.16666666666667e-02 124 670 -1.25000000000000e-01 124 577 -2.50000000000000e-01 124 669 8.33333333333333e-02 124 324 -8.33333333333333e-02 125 125 1.25000000000000e+00 125 562 8.33333333333333e-02 125 663 8.33333333333333e-02 125 561 -1.66666666666667e-01 125 665 -1.25000000000000e-01 125 261 4.16666666666667e-02 125 674 -1.25000000000000e-01 125 673 8.33333333333333e-02 125 124 -1.66666666666667e-01 125 672 -4.16666666666667e-02 125 324 4.16666666666667e-02 125 528 -8.33333333333333e-02 125 658 8.33333333333333e-02 125 543 8.33333333333333e-02 125 657 -4.16666666666667e-02 125 544 -1.66666666666667e-01 125 577 1.66666666666667e-01 125 659 -1.25000000000000e-01 125 262 4.16666666666667e-02 125 529 -8.33333333333333e-02 125 664 -4.16666666666667e-02 125 671 -1.25000000000000e-01 125 578 -7.50000000000000e-01 125 670 -4.16666666666667e-02 125 325 4.16666666666667e-02 125 123 -1.66666666666667e-01 125 669 8.33333333333333e-02 125 576 1.66666666666667e-01 126 126 1.25000000000000e+00 126 601 -8.33333333333333e-02 126 128 -1.66666666666667e-01 126 602 1.66666666666667e-01 126 329 -4.16666666666667e-02 126 328 8.33333333333333e-02 126 327 -1.25000000000000e-01 126 600 -2.50000000000000e-01 126 275 -4.16666666666667e-02 126 596 8.33333333333333e-02 126 127 -1.66666666666667e-01 126 274 8.33333333333333e-02 126 595 8.33333333333333e-02 126 273 -1.25000000000000e-01 126 548 -8.33333333333333e-02 126 662 4.16666666666667e-02 126 547 -8.33333333333333e-02 126 580 8.33333333333333e-02 126 661 -8.33333333333333e-02 126 671 8.33333333333333e-02 126 581 -1.66666666666667e-01 126 670 8.33333333333333e-02 126 669 -3.75000000000000e-01 126 1247 8.33333333333333e-02 126 1250 4.16666666666667e-02 126 1249 -8.33333333333333e-02 126 1246 8.33333333333333e-02 126 1245 -3.75000000000000e-01 127 127 1.25000000000000e+00 127 600 -8.33333333333333e-02 127 329 8.33333333333333e-02 127 128 -1.66666666666667e-01 127 602 1.66666666666667e-01 127 328 -3.75000000000000e-01 127 601 -2.50000000000000e-01 127 327 8.33333333333333e-02 127 275 8.33333333333333e-02 127 596 -1.66666666666667e-01 127 594 8.33333333333333e-02 127 274 -3.75000000000000e-01 127 126 -1.66666666666667e-01 127 273 8.33333333333333e-02 127 546 -8.33333333333333e-02 127 579 8.33333333333333e-02 127 662 4.16666666666667e-02 127 548 -8.33333333333333e-02 127 660 -8.33333333333333e-02 127 671 -4.16666666666667e-02 127 581 8.33333333333333e-02 127 670 -1.25000000000000e-01 127 669 8.33333333333333e-02 127 1250 4.16666666666667e-02 127 1247 -4.16666666666667e-02 127 1248 -8.33333333333333e-02 127 1246 -1.25000000000000e-01 127 1245 8.33333333333333e-02 128 128 1.25000000000000e+00 128 126 -1.66666666666667e-01 128 600 1.66666666666667e-01 128 329 -1.25000000000000e-01 128 602 -7.50000000000000e-01 128 328 8.33333333333333e-02 128 127 -1.66666666666667e-01 128 601 1.66666666666667e-01 128 327 -4.16666666666667e-02 128 275 -1.25000000000000e-01 128 274 8.33333333333333e-02 128 595 -1.66666666666667e-01 128 273 -4.16666666666667e-02 128 594 8.33333333333333e-02 128 546 -8.33333333333333e-02 128 660 4.16666666666667e-02 128 661 4.16666666666667e-02 128 547 -8.33333333333333e-02 128 671 -1.25000000000000e-01 128 670 -4.16666666666667e-02 128 580 8.33333333333333e-02 128 669 8.33333333333333e-02 128 579 -1.66666666666667e-01 128 1246 -4.16666666666667e-02 128 1245 8.33333333333333e-02 128 1248 4.16666666666667e-02 128 1249 4.16666666666667e-02 128 1247 -1.25000000000000e-01 129 129 7.50000000000000e-01 129 614 -8.33333333333333e-02 129 613 4.16666666666667e-02 129 131 -8.33333333333333e-02 129 620 8.33333333333333e-02 129 308 4.16666666666667e-02 129 619 -4.16666666666667e-02 129 618 -1.25000000000000e-01 129 439 -8.33333333333333e-02 129 457 8.33333333333333e-02 129 650 4.16666666666667e-02 129 440 -8.33333333333333e-02 129 286 4.16666666666667e-02 129 649 -8.33333333333333e-02 129 285 -2.50000000000000e-01 129 656 -4.16666666666667e-02 129 458 8.33333333333333e-02 129 130 -8.33333333333333e-02 129 655 8.33333333333333e-02 129 307 4.16666666666667e-02 129 287 4.16666666666667e-02 129 654 -1.25000000000000e-01 129 306 -2.50000000000000e-01 130 130 6.66666666666667e-01 130 612 4.16666666666667e-02 130 620 8.33333333333333e-02 130 619 -1.25000000000000e-01 130 618 -4.16666666666667e-02 130 650 4.16666666666667e-02 130 440 -8.33333333333333e-02 130 438 -8.33333333333333e-02 130 456 8.33333333333333e-02 130 286 -8.33333333333333e-02 130 285 4.16666666666667e-02 130 648 -8.33333333333333e-02 130 656 8.33333333333333e-02 130 458 -1.66666666666667e-01 130 614 4.16666666666667e-02 130 655 -3.75000000000000e-01 130 307 -8.33333333333333e-02 130 129 -8.33333333333333e-02 130 654 8.33333333333333e-02 130 306 4.16666666666667e-02 131 131 6.66666666666667e-01 131 285 4.16666666666667e-02 131 612 -8.33333333333333e-02 131 620 -3.75000000000000e-01 131 619 8.33333333333333e-02 131 129 -8.33333333333333e-02 131 618 8.33333333333333e-02 131 306 4.16666666666667e-02 131 649 4.16666666666667e-02 131 439 -8.33333333333333e-02 131 287 -8.33333333333333e-02 131 648 4.16666666666667e-02 131 438 -8.33333333333333e-02 131 613 4.16666666666667e-02 131 656 -1.25000000000000e-01 131 308 -8.33333333333333e-02 131 655 8.33333333333333e-02 131 457 -1.66666666666667e-01 131 654 -4.16666666666667e-02 131 456 8.33333333333333e-02 132 132 7.50000000000000e-01 132 632 -8.33333333333333e-02 132 631 4.16666666666667e-02 132 134 -8.33333333333333e-02 132 638 8.33333333333333e-02 132 332 4.16666666666667e-02 132 637 -4.16666666666667e-02 132 636 -1.25000000000000e-01 132 565 -8.33333333333333e-02 132 583 8.33333333333333e-02 132 668 4.16666666666667e-02 132 566 -8.33333333333333e-02 132 310 4.16666666666667e-02 132 667 -8.33333333333333e-02 132 309 -2.50000000000000e-01 132 674 -4.16666666666667e-02 132 584 8.33333333333333e-02 132 133 -8.33333333333333e-02 132 673 8.33333333333333e-02 132 331 4.16666666666667e-02 132 311 4.16666666666667e-02 132 672 -1.25000000000000e-01 132 330 -2.50000000000000e-01 133 133 6.66666666666667e-01 133 630 4.16666666666667e-02 133 638 8.33333333333333e-02 133 637 -1.25000000000000e-01 133 636 -4.16666666666667e-02 133 668 4.16666666666667e-02 133 566 -8.33333333333333e-02 133 564 -8.33333333333333e-02 133 582 8.33333333333333e-02 133 310 -8.33333333333333e-02 133 309 4.16666666666667e-02 133 666 -8.33333333333333e-02 133 674 8.33333333333333e-02 133 584 -1.66666666666667e-01 133 632 4.16666666666667e-02 133 673 -3.75000000000000e-01 133 331 -8.33333333333333e-02 133 132 -8.33333333333333e-02 133 672 8.33333333333333e-02 133 330 4.16666666666667e-02 134 134 6.66666666666667e-01 134 309 4.16666666666667e-02 134 630 -8.33333333333333e-02 134 638 -3.75000000000000e-01 134 637 8.33333333333333e-02 134 132 -8.33333333333333e-02 134 636 8.33333333333333e-02 134 330 4.16666666666667e-02 134 667 4.16666666666667e-02 134 565 -8.33333333333333e-02 134 311 -8.33333333333333e-02 134 666 4.16666666666667e-02 134 564 -8.33333333333333e-02 134 631 4.16666666666667e-02 134 674 -1.25000000000000e-01 134 332 -8.33333333333333e-02 134 673 8.33333333333333e-02 134 583 -1.66666666666667e-01 134 672 -4.16666666666667e-02 134 582 8.33333333333333e-02 135 135 7.50000000000000e-01 135 37 4.16666666666667e-02 135 334 -8.33333333333333e-02 135 143 -4.16666666666667e-02 135 136 -8.33333333333333e-02 135 142 8.33333333333333e-02 135 1 4.16666666666667e-02 135 141 -1.25000000000000e-01 135 341 -8.33333333333333e-02 135 155 8.33333333333333e-02 135 38 4.16666666666667e-02 135 338 -8.33333333333333e-02 135 337 4.16666666666667e-02 135 340 -8.33333333333333e-02 135 36 -2.50000000000000e-01 135 137 -8.33333333333333e-02 135 149 8.33333333333333e-02 135 2 4.16666666666667e-02 135 148 -4.16666666666667e-02 135 154 8.33333333333333e-02 135 335 4.16666666666667e-02 135 147 -1.25000000000000e-01 135 0 -2.50000000000000e-01 136 136 6.66666666666667e-01 136 36 4.16666666666667e-02 136 333 -8.33333333333333e-02 136 143 8.33333333333333e-02 136 142 -3.75000000000000e-01 136 135 -8.33333333333333e-02 136 141 8.33333333333333e-02 136 0 4.16666666666667e-02 136 338 4.16666666666667e-02 136 341 -8.33333333333333e-02 136 37 -8.33333333333333e-02 136 336 4.16666666666667e-02 136 339 -8.33333333333333e-02 136 149 8.33333333333333e-02 136 155 -1.66666666666667e-01 136 335 4.16666666666667e-02 136 148 -1.25000000000000e-01 136 1 -8.33333333333333e-02 136 147 -4.16666666666667e-02 136 153 8.33333333333333e-02 137 137 6.66666666666667e-01 137 333 4.16666666666667e-02 137 143 -1.25000000000000e-01 137 142 8.33333333333333e-02 137 141 -4.16666666666667e-02 137 337 4.16666666666667e-02 137 340 -8.33333333333333e-02 137 339 -8.33333333333333e-02 137 153 8.33333333333333e-02 137 38 -8.33333333333333e-02 137 36 4.16666666666667e-02 137 336 -8.33333333333333e-02 137 334 4.16666666666667e-02 137 149 -3.75000000000000e-01 137 2 -8.33333333333333e-02 137 148 8.33333333333333e-02 137 154 -1.66666666666667e-01 137 135 -8.33333333333333e-02 137 147 8.33333333333333e-02 137 0 4.16666666666667e-02 138 138 2.98333333333333e+01 138 140 -8.33333333333333e+00 138 152 4.25000000000000e+00 138 355 2.12500000000000e+00 138 151 -2.12500000000000e+00 138 2 -2.08333333333333e+00 138 1 2.12500000000000e+00 138 0 -2.16666666666667e+00 138 150 -6.37500000000000e+00 138 41 -2.08333333333333e+00 138 356 2.12500000000000e+00 138 139 -4.25000000000000e+00 138 40 2.12500000000000e+00 138 39 -2.16666666666667e+00 138 352 -8.33333333333333e-02 138 143 8.33333333333333e-02 138 142 8.33333333333333e-02 138 141 -3.75000000000000e-01 138 359 -8.33333333333333e-02 138 358 -8.33333333333333e-02 138 155 -1.66666666666667e-01 138 154 8.33333333333333e-02 138 353 4.16666666666667e-02 138 1430 2.08333333333333e+00 138 1429 -4.16666666666667e+00 138 1687 4.16666666666667e+00 138 1688 4.16666666666667e+00 138 1686 -1.87500000000000e+01 139 139 2.57500000000000e+01 139 354 2.12500000000000e+00 139 150 -2.12500000000000e+00 139 2 2.12500000000000e+00 139 140 -4.25000000000000e+00 139 152 4.25000000000000e+00 139 1 -6.50000000000000e+00 139 151 -6.37500000000000e+00 139 0 2.12500000000000e+00 139 41 2.12500000000000e+00 139 356 -4.25000000000000e+00 139 40 -6.50000000000000e+00 139 138 -4.25000000000000e+00 139 39 2.12500000000000e+00 139 351 -8.33333333333333e-02 139 143 -4.16666666666667e-02 139 142 -1.25000000000000e-01 139 141 8.33333333333333e-02 139 359 -8.33333333333333e-02 139 155 8.33333333333333e-02 139 357 -8.33333333333333e-02 139 353 4.16666666666667e-02 139 153 8.33333333333333e-02 139 1430 2.08333333333333e+00 139 1428 -4.16666666666667e+00 139 1688 -2.08333333333333e+00 139 1687 -6.25000000000000e+00 139 1686 4.16666666666667e+00 140 140 2.98333333333333e+01 140 138 -8.33333333333333e+00 140 150 4.25000000000000e+00 140 2 -2.16666666666667e+00 140 152 -1.91250000000000e+01 140 1 2.12500000000000e+00 140 139 -4.25000000000000e+00 140 151 4.25000000000000e+00 140 0 -2.08333333333333e+00 140 41 -2.16666666666667e+00 140 40 2.12500000000000e+00 140 355 -4.25000000000000e+00 140 39 -2.08333333333333e+00 140 354 2.12500000000000e+00 140 352 4.16666666666667e-02 140 143 -1.25000000000000e-01 140 142 -4.16666666666667e-02 140 141 8.33333333333333e-02 140 357 -8.33333333333333e-02 140 358 -8.33333333333333e-02 140 154 8.33333333333333e-02 140 351 4.16666666666667e-02 140 153 -1.66666666666667e-01 140 1429 2.08333333333333e+00 140 1686 4.16666666666667e+00 140 1428 2.08333333333333e+00 140 1687 -2.08333333333333e+00 140 1688 -6.25000000000000e+00 141 141 1.25000000000000e+00 141 358 8.33333333333333e-02 141 359 8.33333333333333e-02 141 352 8.33333333333333e-02 141 351 -1.25000000000000e-01 141 143 -1.66666666666667e-01 141 140 8.33333333333333e-02 141 139 8.33333333333333e-02 141 138 -3.75000000000000e-01 141 154 -8.33333333333333e-02 141 142 -1.66666666666667e-01 141 335 8.33333333333333e-02 141 370 -8.33333333333333e-02 141 340 8.33333333333333e-02 141 155 1.66666666666667e-01 141 341 -1.66666666666667e-01 141 44 4.16666666666667e-02 141 371 -8.33333333333333e-02 141 334 8.33333333333333e-02 141 43 -8.33333333333333e-02 141 333 -3.75000000000000e-01 141 137 -4.16666666666667e-02 141 2 4.16666666666667e-02 141 136 8.33333333333333e-02 141 1 -8.33333333333333e-02 141 135 -1.25000000000000e-01 141 353 -4.16666666666667e-02 141 153 -2.50000000000000e-01 142 142 1.25000000000000e+00 142 357 8.33333333333333e-02 142 359 -1.66666666666667e-01 142 44 4.16666666666667e-02 142 352 -3.75000000000000e-01 142 351 8.33333333333333e-02 142 140 -4.16666666666667e-02 142 2 4.16666666666667e-02 142 139 -1.25000000000000e-01 142 138 8.33333333333333e-02 142 153 -8.33333333333333e-02 142 335 -4.16666666666667e-02 142 141 -1.66666666666667e-01 142 369 -8.33333333333333e-02 142 339 8.33333333333333e-02 142 371 -8.33333333333333e-02 142 341 8.33333333333333e-02 142 334 -1.25000000000000e-01 142 333 8.33333333333333e-02 142 42 -8.33333333333333e-02 142 137 8.33333333333333e-02 142 143 -1.66666666666667e-01 142 155 1.66666666666667e-01 142 136 -3.75000000000000e-01 142 353 8.33333333333333e-02 142 154 -2.50000000000000e-01 142 135 8.33333333333333e-02 142 0 -8.33333333333333e-02 143 143 1.25000000000000e+00 143 352 8.33333333333333e-02 143 358 -1.66666666666667e-01 143 357 8.33333333333333e-02 143 353 -1.25000000000000e-01 143 43 4.16666666666667e-02 143 140 -1.25000000000000e-01 143 139 -4.16666666666667e-02 143 1 4.16666666666667e-02 143 141 -1.66666666666667e-01 143 138 8.33333333333333e-02 143 334 -4.16666666666667e-02 143 333 8.33333333333333e-02 143 370 -8.33333333333333e-02 143 340 8.33333333333333e-02 143 153 1.66666666666667e-01 143 339 -1.66666666666667e-01 143 335 -1.25000000000000e-01 143 42 4.16666666666667e-02 143 369 -8.33333333333333e-02 143 137 -1.25000000000000e-01 143 351 -4.16666666666667e-02 143 155 -7.50000000000000e-01 143 136 8.33333333333333e-02 143 142 -1.66666666666667e-01 143 154 1.66666666666667e-01 143 135 -4.16666666666667e-02 143 0 4.16666666666667e-02 144 144 2.98333333333333e+01 144 152 -2.12500000000000e+00 144 145 -8.33333333333333e+00 144 151 4.25000000000000e+00 144 2 2.12500000000000e+00 144 1 -2.08333333333333e+00 144 0 -2.16666666666667e+00 144 150 -6.37500000000000e+00 144 146 -4.25000000000000e+00 144 47 2.12500000000000e+00 144 46 -2.08333333333333e+00 144 391 2.12500000000000e+00 144 392 2.12500000000000e+00 144 45 -2.16666666666667e+00 144 155 8.33333333333333e-02 144 395 -8.33333333333333e-02 144 388 4.16666666666667e-02 144 394 -8.33333333333333e-02 144 389 -8.33333333333333e-02 144 149 8.33333333333333e-02 144 148 8.33333333333333e-02 144 154 -1.66666666666667e-01 144 147 -3.75000000000000e-01 144 1690 4.16666666666667e+00 144 1430 -4.16666666666667e+00 144 1429 2.08333333333333e+00 144 1691 4.16666666666667e+00 144 1689 -1.87500000000000e+01 145 145 2.98333333333333e+01 145 144 -8.33333333333333e+00 145 150 4.25000000000000e+00 145 2 2.12500000000000e+00 145 146 -4.25000000000000e+00 145 152 4.25000000000000e+00 145 1 -2.16666666666667e+00 145 151 -1.91250000000000e+01 145 0 -2.08333333333333e+00 145 47 2.12500000000000e+00 145 392 -4.25000000000000e+00 145 46 -2.16666666666667e+00 145 45 -2.08333333333333e+00 145 390 2.12500000000000e+00 145 387 4.16666666666667e-02 145 393 -8.33333333333333e-02 145 389 4.16666666666667e-02 145 395 -8.33333333333333e-02 145 149 -4.16666666666667e-02 145 155 8.33333333333333e-02 145 148 -1.25000000000000e-01 145 147 8.33333333333333e-02 145 153 -1.66666666666667e-01 145 1691 -2.08333333333333e+00 145 1689 4.16666666666667e+00 145 1428 2.08333333333333e+00 145 1430 2.08333333333333e+00 145 1690 -6.25000000000000e+00 146 146 2.57500000000000e+01 146 150 -2.12500000000000e+00 146 2 -6.50000000000000e+00 146 152 -6.37500000000000e+00 146 1 2.12500000000000e+00 146 145 -4.25000000000000e+00 146 151 4.25000000000000e+00 146 0 2.12500000000000e+00 146 390 2.12500000000000e+00 146 47 -6.50000000000000e+00 146 46 2.12500000000000e+00 146 391 -4.25000000000000e+00 146 144 -4.25000000000000e+00 146 45 2.12500000000000e+00 146 153 8.33333333333333e-02 146 393 -8.33333333333333e-02 146 388 4.16666666666667e-02 146 394 -8.33333333333333e-02 146 387 -8.33333333333333e-02 146 149 -1.25000000000000e-01 146 148 -4.16666666666667e-02 146 154 8.33333333333333e-02 146 147 8.33333333333333e-02 146 1429 2.08333333333333e+00 146 1690 -2.08333333333333e+00 146 1428 -4.16666666666667e+00 146 1691 -6.25000000000000e+00 146 1689 4.16666666666667e+00 147 147 1.25000000000000e+00 147 341 8.33333333333333e-02 147 340 -1.66666666666667e-01 147 338 8.33333333333333e-02 147 49 4.16666666666667e-02 147 336 -3.75000000000000e-01 147 137 8.33333333333333e-02 147 136 -4.16666666666667e-02 147 1 4.16666666666667e-02 147 135 -1.25000000000000e-01 147 155 -8.33333333333333e-02 147 149 -1.66666666666667e-01 147 388 -4.16666666666667e-02 147 407 -8.33333333333333e-02 147 395 8.33333333333333e-02 147 406 -8.33333333333333e-02 147 394 8.33333333333333e-02 147 389 8.33333333333333e-02 147 50 -8.33333333333333e-02 147 387 -1.25000000000000e-01 147 146 8.33333333333333e-02 147 2 -8.33333333333333e-02 147 145 8.33333333333333e-02 147 148 -1.66666666666667e-01 147 154 1.66666666666667e-01 147 144 -3.75000000000000e-01 147 337 8.33333333333333e-02 147 153 -2.50000000000000e-01 148 148 1.25000000000000e+00 148 341 8.33333333333333e-02 148 336 8.33333333333333e-02 148 339 -1.66666666666667e-01 148 337 -1.25000000000000e-01 148 48 4.16666666666667e-02 148 137 8.33333333333333e-02 148 149 -1.66666666666667e-01 148 136 -1.25000000000000e-01 148 135 -4.16666666666667e-02 148 0 4.16666666666667e-02 148 387 -4.16666666666667e-02 148 389 8.33333333333333e-02 148 155 1.66666666666667e-01 148 395 -1.66666666666667e-01 148 405 -8.33333333333333e-02 148 393 8.33333333333333e-02 148 50 4.16666666666667e-02 148 407 -8.33333333333333e-02 148 388 -1.25000000000000e-01 148 146 -4.16666666666667e-02 148 2 4.16666666666667e-02 148 145 -1.25000000000000e-01 148 338 -4.16666666666667e-02 148 154 -7.50000000000000e-01 148 144 8.33333333333333e-02 148 147 -1.66666666666667e-01 148 153 1.66666666666667e-01 149 149 1.25000000000000e+00 149 340 8.33333333333333e-02 149 339 8.33333333333333e-02 149 338 -1.25000000000000e-01 149 336 8.33333333333333e-02 149 137 -3.75000000000000e-01 149 136 8.33333333333333e-02 149 148 -1.66666666666667e-01 149 135 8.33333333333333e-02 149 153 -8.33333333333333e-02 149 147 -1.66666666666667e-01 149 388 8.33333333333333e-02 149 405 -8.33333333333333e-02 149 393 8.33333333333333e-02 149 154 1.66666666666667e-01 149 394 -1.66666666666667e-01 149 389 -3.75000000000000e-01 149 49 4.16666666666667e-02 149 406 -8.33333333333333e-02 149 387 8.33333333333333e-02 149 48 -8.33333333333333e-02 149 146 -1.25000000000000e-01 149 337 -4.16666666666667e-02 149 155 -2.50000000000000e-01 149 145 -4.16666666666667e-02 149 1 4.16666666666667e-02 149 144 8.33333333333333e-02 149 0 -8.33333333333333e-02 150 150 6.37500000000000e+01 150 139 -2.12500000000000e+00 150 2 2.12500000000000e+00 150 138 -6.37500000000000e+00 150 356 -2.12500000000000e+00 150 53 2.12500000000000e+00 150 151 -8.50000000000000e+00 150 355 4.25000000000000e+00 150 354 -6.37500000000000e+00 150 146 -2.12500000000000e+00 150 145 4.25000000000000e+00 150 1 2.12500000000000e+00 150 144 -6.37500000000000e+00 150 152 -8.50000000000000e+00 150 392 4.25000000000000e+00 150 391 -2.12500000000000e+00 150 52 2.12500000000000e+00 150 140 4.25000000000000e+00 150 390 -6.37500000000000e+00 150 358 -1.66666666666667e-01 150 155 1.66666666666667e-01 150 395 -1.66666666666667e-01 150 424 -8.33333333333333e-02 150 394 8.33333333333333e-02 150 425 -8.33333333333333e-02 150 154 1.66666666666667e-01 150 359 8.33333333333333e-02 150 153 -7.50000000000000e-01 150 1687 4.16666666666667e+00 150 1688 -8.33333333333333e+00 150 1430 -4.16666666666667e+00 150 1691 4.16666666666667e+00 150 1693 8.33333333333333e+00 150 1690 -8.33333333333333e+00 150 1429 -4.16666666666667e+00 150 1694 8.33333333333333e+00 150 1692 -3.75000000000000e+01 151 151 6.37500000000000e+01 151 138 -2.12500000000000e+00 151 140 4.25000000000000e+00 151 139 -6.37500000000000e+00 151 356 4.25000000000000e+00 151 355 -1.91250000000000e+01 151 150 -8.50000000000000e+00 151 354 4.25000000000000e+00 151 152 -8.50000000000000e+00 151 144 4.25000000000000e+00 151 2 -4.25000000000000e+00 151 146 4.25000000000000e+00 151 145 -1.91250000000000e+01 151 0 2.12500000000000e+00 151 392 4.25000000000000e+00 151 53 -4.25000000000000e+00 151 391 -6.37500000000000e+00 151 390 -2.12500000000000e+00 151 51 2.12500000000000e+00 151 359 8.33333333333333e-02 151 357 -1.66666666666667e-01 151 155 -8.33333333333333e-02 151 425 -8.33333333333333e-02 151 395 8.33333333333333e-02 151 423 -8.33333333333333e-02 151 393 8.33333333333333e-02 151 154 -2.50000000000000e-01 151 153 1.66666666666667e-01 151 1688 4.16666666666667e+00 151 1694 -4.16666666666667e+00 151 1430 -4.16666666666667e+00 151 1691 4.16666666666667e+00 151 1692 8.33333333333333e+00 151 1689 -8.33333333333333e+00 151 1428 -4.16666666666667e+00 151 1686 4.16666666666667e+00 151 1693 -1.25000000000000e+01 152 152 6.37500000000000e+01 152 140 -1.91250000000000e+01 152 139 4.25000000000000e+00 152 0 2.12500000000000e+00 152 356 -6.37500000000000e+00 152 355 4.25000000000000e+00 152 354 -2.12500000000000e+00 152 51 2.12500000000000e+00 152 151 -8.50000000000000e+00 152 144 -2.12500000000000e+00 152 146 -6.37500000000000e+00 152 1 -4.25000000000000e+00 152 145 4.25000000000000e+00 152 138 4.25000000000000e+00 152 392 -1.91250000000000e+01 152 391 4.25000000000000e+00 152 52 -4.25000000000000e+00 152 150 -8.50000000000000e+00 152 390 4.25000000000000e+00 152 358 8.33333333333333e-02 152 154 -8.33333333333333e-02 152 424 -8.33333333333333e-02 152 394 8.33333333333333e-02 152 153 1.66666666666667e-01 152 393 -1.66666666666667e-01 152 423 -8.33333333333333e-02 152 357 8.33333333333333e-02 152 155 -2.50000000000000e-01 152 1687 4.16666666666667e+00 152 1686 -8.33333333333333e+00 152 1693 -4.16666666666667e+00 152 1429 -4.16666666666667e+00 152 1690 4.16666666666667e+00 152 1428 -4.16666666666667e+00 152 1689 4.16666666666667e+00 152 1694 -1.25000000000000e+01 152 1692 8.33333333333333e+00 153 153 2.50000000000000e+00 153 358 1.66666666666667e-01 153 357 -2.50000000000000e-01 153 140 -1.66666666666667e-01 153 139 8.33333333333333e-02 153 152 1.66666666666667e-01 153 424 8.33333333333333e-02 153 151 1.66666666666667e-01 153 150 -7.50000000000000e-01 153 425 8.33333333333333e-02 153 142 -8.33333333333333e-02 153 143 1.66666666666667e-01 153 155 -3.33333333333333e-01 153 2 -8.33333333333333e-02 153 141 -2.50000000000000e-01 153 371 8.33333333333333e-02 153 56 -8.33333333333333e-02 153 370 -1.66666666666667e-01 153 137 8.33333333333333e-02 153 340 1.66666666666667e-01 153 154 -3.33333333333333e-01 153 341 1.66666666666667e-01 153 55 -8.33333333333333e-02 153 339 -7.50000000000000e-01 153 136 8.33333333333333e-02 153 1 -8.33333333333333e-02 153 149 -8.33333333333333e-02 153 146 8.33333333333333e-02 153 406 8.33333333333333e-02 153 394 -8.33333333333333e-02 153 145 -1.66666666666667e-01 153 148 1.66666666666667e-01 153 147 -2.50000000000000e-01 153 395 1.66666666666667e-01 153 407 -1.66666666666667e-01 153 393 -2.50000000000000e-01 153 359 -8.33333333333333e-02 154 154 2.50000000000000e+00 154 357 1.66666666666667e-01 154 359 1.66666666666667e-01 154 358 -7.50000000000000e-01 154 138 8.33333333333333e-02 154 152 -8.33333333333333e-02 154 423 8.33333333333333e-02 154 151 -2.50000000000000e-01 154 150 1.66666666666667e-01 154 425 -1.66666666666667e-01 154 141 -8.33333333333333e-02 154 371 8.33333333333333e-02 154 143 1.66666666666667e-01 154 142 -2.50000000000000e-01 154 369 -1.66666666666667e-01 154 341 -8.33333333333333e-02 154 339 1.66666666666667e-01 154 153 -3.33333333333333e-01 154 340 -2.50000000000000e-01 154 54 -8.33333333333333e-02 154 137 -1.66666666666667e-01 154 135 8.33333333333333e-02 154 0 -8.33333333333333e-02 154 149 1.66666666666667e-01 154 155 -3.33333333333333e-01 154 395 1.66666666666667e-01 154 405 8.33333333333333e-02 154 393 -8.33333333333333e-02 154 146 8.33333333333333e-02 154 2 -8.33333333333333e-02 154 148 -7.50000000000000e-01 154 144 -1.66666666666667e-01 154 147 1.66666666666667e-01 154 407 8.33333333333333e-02 154 56 -8.33333333333333e-02 154 394 -2.50000000000000e-01 154 140 8.33333333333333e-02 155 155 2.50000000000000e+00 155 139 8.33333333333333e-02 155 359 -2.50000000000000e-01 155 358 1.66666666666667e-01 155 138 -1.66666666666667e-01 155 151 -8.33333333333333e-02 155 150 1.66666666666667e-01 155 152 -2.50000000000000e-01 155 424 -1.66666666666667e-01 155 423 8.33333333333333e-02 155 370 8.33333333333333e-02 155 141 1.66666666666667e-01 155 153 -3.33333333333333e-01 155 143 -7.50000000000000e-01 155 142 1.66666666666667e-01 155 0 -8.33333333333333e-02 155 369 8.33333333333333e-02 155 54 -8.33333333333333e-02 155 340 -8.33333333333333e-02 155 135 8.33333333333333e-02 155 341 -2.50000000000000e-01 155 339 1.66666666666667e-01 155 136 -1.66666666666667e-01 155 147 -8.33333333333333e-02 155 144 8.33333333333333e-02 155 148 1.66666666666667e-01 155 154 -3.33333333333333e-01 155 394 1.66666666666667e-01 155 149 -2.50000000000000e-01 155 145 8.33333333333333e-02 155 1 -8.33333333333333e-02 155 395 -7.50000000000000e-01 155 357 -8.33333333333333e-02 155 406 8.33333333333333e-02 155 55 -8.33333333333333e-02 155 393 1.66666666666667e-01 155 405 -1.66666666666667e-01 156 156 7.50000000000000e-01 156 4 4.16666666666667e-02 156 163 -8.33333333333333e-02 156 344 -4.16666666666667e-02 156 157 -8.33333333333333e-02 156 343 8.33333333333333e-02 156 37 4.16666666666667e-02 156 342 -1.25000000000000e-01 156 176 -8.33333333333333e-02 156 350 8.33333333333333e-02 156 5 4.16666666666667e-02 156 170 -8.33333333333333e-02 156 169 4.16666666666667e-02 156 175 -8.33333333333333e-02 156 3 -2.50000000000000e-01 156 158 -8.33333333333333e-02 156 347 8.33333333333333e-02 156 38 4.16666666666667e-02 156 346 -4.16666666666667e-02 156 349 8.33333333333333e-02 156 164 4.16666666666667e-02 156 345 -1.25000000000000e-01 156 36 -2.50000000000000e-01 157 157 6.66666666666667e-01 157 3 4.16666666666667e-02 157 162 -8.33333333333333e-02 157 344 8.33333333333333e-02 157 343 -3.75000000000000e-01 157 156 -8.33333333333333e-02 157 342 8.33333333333333e-02 157 36 4.16666666666667e-02 157 170 4.16666666666667e-02 157 176 -8.33333333333333e-02 157 4 -8.33333333333333e-02 157 168 4.16666666666667e-02 157 174 -8.33333333333333e-02 157 347 8.33333333333333e-02 157 350 -1.66666666666667e-01 157 164 4.16666666666667e-02 157 346 -1.25000000000000e-01 157 37 -8.33333333333333e-02 157 345 -4.16666666666667e-02 157 348 8.33333333333333e-02 158 158 6.66666666666667e-01 158 162 4.16666666666667e-02 158 344 -1.25000000000000e-01 158 343 8.33333333333333e-02 158 342 -4.16666666666667e-02 158 169 4.16666666666667e-02 158 175 -8.33333333333333e-02 158 174 -8.33333333333333e-02 158 348 8.33333333333333e-02 158 5 -8.33333333333333e-02 158 3 4.16666666666667e-02 158 168 -8.33333333333333e-02 158 163 4.16666666666667e-02 158 347 -3.75000000000000e-01 158 38 -8.33333333333333e-02 158 346 8.33333333333333e-02 158 349 -1.66666666666667e-01 158 156 -8.33333333333333e-02 158 345 8.33333333333333e-02 158 36 4.16666666666667e-02 159 159 7.50000000000000e-01 159 58 4.16666666666667e-02 159 460 -8.33333333333333e-02 159 167 -4.16666666666667e-02 159 160 -8.33333333333333e-02 159 166 8.33333333333333e-02 159 4 4.16666666666667e-02 159 165 -1.25000000000000e-01 159 467 -8.33333333333333e-02 159 179 8.33333333333333e-02 159 59 4.16666666666667e-02 159 464 -8.33333333333333e-02 159 463 4.16666666666667e-02 159 466 -8.33333333333333e-02 159 57 -2.50000000000000e-01 159 161 -8.33333333333333e-02 159 173 8.33333333333333e-02 159 5 4.16666666666667e-02 159 172 -4.16666666666667e-02 159 178 8.33333333333333e-02 159 461 4.16666666666667e-02 159 171 -1.25000000000000e-01 159 3 -2.50000000000000e-01 160 160 6.66666666666667e-01 160 57 4.16666666666667e-02 160 459 -8.33333333333333e-02 160 167 8.33333333333333e-02 160 166 -3.75000000000000e-01 160 159 -8.33333333333333e-02 160 165 8.33333333333333e-02 160 3 4.16666666666667e-02 160 464 4.16666666666667e-02 160 467 -8.33333333333333e-02 160 58 -8.33333333333333e-02 160 462 4.16666666666667e-02 160 465 -8.33333333333333e-02 160 173 8.33333333333333e-02 160 179 -1.66666666666667e-01 160 461 4.16666666666667e-02 160 172 -1.25000000000000e-01 160 4 -8.33333333333333e-02 160 171 -4.16666666666667e-02 160 177 8.33333333333333e-02 161 161 6.66666666666667e-01 161 459 4.16666666666667e-02 161 167 -1.25000000000000e-01 161 166 8.33333333333333e-02 161 165 -4.16666666666667e-02 161 463 4.16666666666667e-02 161 466 -8.33333333333333e-02 161 465 -8.33333333333333e-02 161 177 8.33333333333333e-02 161 59 -8.33333333333333e-02 161 57 4.16666666666667e-02 161 462 -8.33333333333333e-02 161 460 4.16666666666667e-02 161 173 -3.75000000000000e-01 161 5 -8.33333333333333e-02 161 172 8.33333333333333e-02 161 178 -1.66666666666667e-01 161 159 -8.33333333333333e-02 161 171 8.33333333333333e-02 161 3 4.16666666666667e-02 162 162 1.25000000000000e+00 162 478 -8.33333333333333e-02 162 167 8.33333333333333e-02 162 166 8.33333333333333e-02 162 165 -3.75000000000000e-01 162 485 -8.33333333333333e-02 162 484 -8.33333333333333e-02 162 179 -1.66666666666667e-01 162 178 8.33333333333333e-02 162 344 8.33333333333333e-02 162 164 -1.66666666666667e-01 162 176 1.66666666666667e-01 162 481 8.33333333333333e-02 162 175 -8.33333333333333e-02 162 5 -4.16666666666667e-02 162 158 4.16666666666667e-02 162 4 8.33333333333333e-02 162 157 -8.33333333333333e-02 162 3 -1.25000000000000e-01 162 174 -2.50000000000000e-01 162 62 -4.16666666666667e-02 162 482 8.33333333333333e-02 162 163 -1.66666666666667e-01 162 61 8.33333333333333e-02 162 343 8.33333333333333e-02 162 479 4.16666666666667e-02 162 60 -1.25000000000000e-01 162 342 -3.75000000000000e-01 163 163 1.25000000000000e+00 163 477 -8.33333333333333e-02 163 167 -4.16666666666667e-02 163 166 -1.25000000000000e-01 163 165 8.33333333333333e-02 163 485 -8.33333333333333e-02 163 179 8.33333333333333e-02 163 483 -8.33333333333333e-02 163 177 8.33333333333333e-02 163 344 -4.16666666666667e-02 163 158 4.16666666666667e-02 163 480 8.33333333333333e-02 163 174 -8.33333333333333e-02 163 5 8.33333333333333e-02 163 164 -1.66666666666667e-01 163 176 1.66666666666667e-01 163 4 -3.75000000000000e-01 163 175 -2.50000000000000e-01 163 3 8.33333333333333e-02 163 156 -8.33333333333333e-02 163 62 8.33333333333333e-02 163 482 -1.66666666666667e-01 163 479 4.16666666666667e-02 163 61 -3.75000000000000e-01 163 343 -1.25000000000000e-01 163 162 -1.66666666666667e-01 163 60 8.33333333333333e-02 163 342 8.33333333333333e-02 164 164 1.25000000000000e+00 164 478 4.16666666666667e-02 164 167 -1.25000000000000e-01 164 166 -4.16666666666667e-02 164 165 8.33333333333333e-02 164 483 -8.33333333333333e-02 164 484 -8.33333333333333e-02 164 178 8.33333333333333e-02 164 177 -1.66666666666667e-01 164 343 -4.16666666666667e-02 164 157 4.16666666666667e-02 164 342 8.33333333333333e-02 164 162 -1.66666666666667e-01 164 174 1.66666666666667e-01 164 5 -1.25000000000000e-01 164 176 -7.50000000000000e-01 164 4 8.33333333333333e-02 164 163 -1.66666666666667e-01 164 175 1.66666666666667e-01 164 3 -4.16666666666667e-02 164 156 4.16666666666667e-02 164 477 4.16666666666667e-02 164 62 -1.25000000000000e-01 164 344 -1.25000000000000e-01 164 61 8.33333333333333e-02 164 481 -1.66666666666667e-01 164 60 -4.16666666666667e-02 164 480 8.33333333333333e-02 165 165 1.25000000000000e+00 165 484 8.33333333333333e-02 165 485 8.33333333333333e-02 165 478 8.33333333333333e-02 165 477 -1.25000000000000e-01 165 167 -1.66666666666667e-01 165 164 8.33333333333333e-02 165 163 8.33333333333333e-02 165 162 -3.75000000000000e-01 165 178 -8.33333333333333e-02 165 166 -1.66666666666667e-01 165 461 8.33333333333333e-02 165 496 -8.33333333333333e-02 165 466 8.33333333333333e-02 165 179 1.66666666666667e-01 165 467 -1.66666666666667e-01 165 65 4.16666666666667e-02 165 497 -8.33333333333333e-02 165 460 8.33333333333333e-02 165 64 -8.33333333333333e-02 165 459 -3.75000000000000e-01 165 161 -4.16666666666667e-02 165 5 4.16666666666667e-02 165 160 8.33333333333333e-02 165 4 -8.33333333333333e-02 165 159 -1.25000000000000e-01 165 479 -4.16666666666667e-02 165 177 -2.50000000000000e-01 166 166 1.25000000000000e+00 166 483 8.33333333333333e-02 166 485 -1.66666666666667e-01 166 65 4.16666666666667e-02 166 478 -3.75000000000000e-01 166 477 8.33333333333333e-02 166 164 -4.16666666666667e-02 166 5 4.16666666666667e-02 166 163 -1.25000000000000e-01 166 162 8.33333333333333e-02 166 177 -8.33333333333333e-02 166 461 -4.16666666666667e-02 166 165 -1.66666666666667e-01 166 495 -8.33333333333333e-02 166 465 8.33333333333333e-02 166 497 -8.33333333333333e-02 166 467 8.33333333333333e-02 166 460 -1.25000000000000e-01 166 459 8.33333333333333e-02 166 63 -8.33333333333333e-02 166 161 8.33333333333333e-02 166 167 -1.66666666666667e-01 166 179 1.66666666666667e-01 166 160 -3.75000000000000e-01 166 479 8.33333333333333e-02 166 178 -2.50000000000000e-01 166 159 8.33333333333333e-02 166 3 -8.33333333333333e-02 167 167 1.25000000000000e+00 167 478 8.33333333333333e-02 167 484 -1.66666666666667e-01 167 483 8.33333333333333e-02 167 479 -1.25000000000000e-01 167 64 4.16666666666667e-02 167 164 -1.25000000000000e-01 167 163 -4.16666666666667e-02 167 4 4.16666666666667e-02 167 165 -1.66666666666667e-01 167 162 8.33333333333333e-02 167 460 -4.16666666666667e-02 167 459 8.33333333333333e-02 167 496 -8.33333333333333e-02 167 466 8.33333333333333e-02 167 177 1.66666666666667e-01 167 465 -1.66666666666667e-01 167 461 -1.25000000000000e-01 167 63 4.16666666666667e-02 167 495 -8.33333333333333e-02 167 161 -1.25000000000000e-01 167 477 -4.16666666666667e-02 167 179 -7.50000000000000e-01 167 160 8.33333333333333e-02 167 166 -1.66666666666667e-01 167 178 1.66666666666667e-01 167 159 -4.16666666666667e-02 167 3 4.16666666666667e-02 168 168 1.25000000000000e+00 168 521 -8.33333333333333e-02 168 514 4.16666666666667e-02 168 520 -8.33333333333333e-02 168 515 -8.33333333333333e-02 168 173 8.33333333333333e-02 168 172 8.33333333333333e-02 168 178 -1.66666666666667e-01 168 171 -3.75000000000000e-01 168 518 8.33333333333333e-02 168 176 -8.33333333333333e-02 168 169 -1.66666666666667e-01 168 175 1.66666666666667e-01 168 346 8.33333333333333e-02 168 5 8.33333333333333e-02 168 158 -8.33333333333333e-02 168 4 -4.16666666666667e-02 168 157 4.16666666666667e-02 168 3 -1.25000000000000e-01 168 174 -2.50000000000000e-01 168 170 -1.66666666666667e-01 168 68 8.33333333333333e-02 168 347 8.33333333333333e-02 168 67 -4.16666666666667e-02 168 517 8.33333333333333e-02 168 179 8.33333333333333e-02 168 66 -1.25000000000000e-01 168 345 -3.75000000000000e-01 169 169 1.25000000000000e+00 169 519 -8.33333333333333e-02 169 515 4.16666666666667e-02 169 521 -8.33333333333333e-02 169 173 -4.16666666666667e-02 169 179 8.33333333333333e-02 169 172 -1.25000000000000e-01 169 171 8.33333333333333e-02 169 177 -1.66666666666667e-01 169 158 4.16666666666667e-02 169 347 -4.16666666666667e-02 169 168 -1.66666666666667e-01 169 174 1.66666666666667e-01 169 345 8.33333333333333e-02 169 5 8.33333333333333e-02 169 170 -1.66666666666667e-01 169 176 1.66666666666667e-01 169 4 -1.25000000000000e-01 169 175 -7.50000000000000e-01 169 3 -4.16666666666667e-02 169 156 4.16666666666667e-02 169 68 8.33333333333333e-02 169 518 -1.66666666666667e-01 169 513 4.16666666666667e-02 169 67 -1.25000000000000e-01 169 346 -1.25000000000000e-01 169 66 -4.16666666666667e-02 169 516 8.33333333333333e-02 170 170 1.25000000000000e+00 170 519 -8.33333333333333e-02 170 514 4.16666666666667e-02 170 520 -8.33333333333333e-02 170 513 -8.33333333333333e-02 170 173 -1.25000000000000e-01 170 172 -4.16666666666667e-02 170 178 8.33333333333333e-02 170 171 8.33333333333333e-02 170 516 8.33333333333333e-02 170 174 -8.33333333333333e-02 170 157 4.16666666666667e-02 170 346 -4.16666666666667e-02 170 5 -3.75000000000000e-01 170 176 -2.50000000000000e-01 170 4 8.33333333333333e-02 170 169 -1.66666666666667e-01 170 175 1.66666666666667e-01 170 3 8.33333333333333e-02 170 156 -8.33333333333333e-02 170 177 8.33333333333333e-02 170 68 -3.75000000000000e-01 170 347 -1.25000000000000e-01 170 67 8.33333333333333e-02 170 517 -1.66666666666667e-01 170 168 -1.66666666666667e-01 170 66 8.33333333333333e-02 170 345 8.33333333333333e-02 171 171 1.25000000000000e+00 171 467 8.33333333333333e-02 171 466 -1.66666666666667e-01 171 464 8.33333333333333e-02 171 70 4.16666666666667e-02 171 462 -3.75000000000000e-01 171 161 8.33333333333333e-02 171 160 -4.16666666666667e-02 171 4 4.16666666666667e-02 171 159 -1.25000000000000e-01 171 179 -8.33333333333333e-02 171 173 -1.66666666666667e-01 171 514 -4.16666666666667e-02 171 533 -8.33333333333333e-02 171 521 8.33333333333333e-02 171 532 -8.33333333333333e-02 171 520 8.33333333333333e-02 171 515 8.33333333333333e-02 171 71 -8.33333333333333e-02 171 513 -1.25000000000000e-01 171 170 8.33333333333333e-02 171 5 -8.33333333333333e-02 171 169 8.33333333333333e-02 171 172 -1.66666666666667e-01 171 178 1.66666666666667e-01 171 168 -3.75000000000000e-01 171 463 8.33333333333333e-02 171 177 -2.50000000000000e-01 172 172 1.25000000000000e+00 172 467 8.33333333333333e-02 172 462 8.33333333333333e-02 172 465 -1.66666666666667e-01 172 463 -1.25000000000000e-01 172 69 4.16666666666667e-02 172 161 8.33333333333333e-02 172 173 -1.66666666666667e-01 172 160 -1.25000000000000e-01 172 159 -4.16666666666667e-02 172 3 4.16666666666667e-02 172 513 -4.16666666666667e-02 172 515 8.33333333333333e-02 172 179 1.66666666666667e-01 172 521 -1.66666666666667e-01 172 531 -8.33333333333333e-02 172 519 8.33333333333333e-02 172 71 4.16666666666667e-02 172 533 -8.33333333333333e-02 172 514 -1.25000000000000e-01 172 170 -4.16666666666667e-02 172 5 4.16666666666667e-02 172 169 -1.25000000000000e-01 172 464 -4.16666666666667e-02 172 178 -7.50000000000000e-01 172 168 8.33333333333333e-02 172 171 -1.66666666666667e-01 172 177 1.66666666666667e-01 173 173 1.25000000000000e+00 173 466 8.33333333333333e-02 173 465 8.33333333333333e-02 173 464 -1.25000000000000e-01 173 462 8.33333333333333e-02 173 161 -3.75000000000000e-01 173 160 8.33333333333333e-02 173 172 -1.66666666666667e-01 173 159 8.33333333333333e-02 173 177 -8.33333333333333e-02 173 171 -1.66666666666667e-01 173 514 8.33333333333333e-02 173 531 -8.33333333333333e-02 173 519 8.33333333333333e-02 173 178 1.66666666666667e-01 173 520 -1.66666666666667e-01 173 515 -3.75000000000000e-01 173 70 4.16666666666667e-02 173 532 -8.33333333333333e-02 173 513 8.33333333333333e-02 173 69 -8.33333333333333e-02 173 170 -1.25000000000000e-01 173 463 -4.16666666666667e-02 173 179 -2.50000000000000e-01 173 169 -4.16666666666667e-02 173 4 4.16666666666667e-02 173 168 8.33333333333333e-02 173 3 -8.33333333333333e-02 174 174 2.50000000000000e+00 174 484 -1.66666666666667e-01 174 179 1.66666666666667e-01 174 521 -1.66666666666667e-01 174 550 -8.33333333333333e-02 174 520 8.33333333333333e-02 174 551 -8.33333333333333e-02 174 178 1.66666666666667e-01 174 177 -7.50000000000000e-01 174 164 1.66666666666667e-01 174 343 8.33333333333333e-02 174 163 -8.33333333333333e-02 174 344 -1.66666666666667e-01 174 5 8.33333333333333e-02 174 162 -2.50000000000000e-01 174 482 -8.33333333333333e-02 174 74 8.33333333333333e-02 174 175 -3.33333333333333e-01 174 481 1.66666666666667e-01 174 480 -2.50000000000000e-01 174 170 -8.33333333333333e-02 174 169 1.66666666666667e-01 174 158 -8.33333333333333e-02 174 347 8.33333333333333e-02 174 349 1.66666666666667e-01 174 346 -1.66666666666667e-01 174 4 8.33333333333333e-02 174 157 -8.33333333333333e-02 174 168 -2.50000000000000e-01 174 176 -3.33333333333333e-01 174 518 1.66666666666667e-01 174 350 1.66666666666667e-01 174 517 -8.33333333333333e-02 174 73 8.33333333333333e-02 174 485 8.33333333333333e-02 174 516 -2.50000000000000e-01 174 348 -7.50000000000000e-01 175 175 2.50000000000000e+00 175 483 -1.66666666666667e-01 175 179 -8.33333333333333e-02 175 551 -8.33333333333333e-02 175 521 8.33333333333333e-02 175 549 -8.33333333333333e-02 175 519 8.33333333333333e-02 175 178 -2.50000000000000e-01 175 177 1.66666666666667e-01 175 342 8.33333333333333e-02 175 162 -8.33333333333333e-02 175 344 8.33333333333333e-02 175 164 1.66666666666667e-01 175 163 -2.50000000000000e-01 175 482 1.66666666666667e-01 175 481 -7.50000000000000e-01 175 174 -3.33333333333333e-01 175 480 1.66666666666667e-01 175 350 -8.33333333333333e-02 175 176 -3.33333333333333e-01 175 158 -8.33333333333333e-02 175 347 8.33333333333333e-02 175 168 1.66666666666667e-01 175 348 1.66666666666667e-01 175 345 -1.66666666666667e-01 175 5 -1.66666666666667e-01 175 170 1.66666666666667e-01 175 169 -7.50000000000000e-01 175 3 8.33333333333333e-02 175 156 -8.33333333333333e-02 175 518 1.66666666666667e-01 175 74 -1.66666666666667e-01 175 485 8.33333333333333e-02 175 517 -2.50000000000000e-01 175 349 -2.50000000000000e-01 175 516 -8.33333333333333e-02 175 72 8.33333333333333e-02 176 176 2.50000000000000e+00 176 484 8.33333333333333e-02 176 178 -8.33333333333333e-02 176 550 -8.33333333333333e-02 176 520 8.33333333333333e-02 176 177 1.66666666666667e-01 176 519 -1.66666666666667e-01 176 549 -8.33333333333333e-02 176 179 -2.50000000000000e-01 176 162 1.66666666666667e-01 176 343 8.33333333333333e-02 176 342 -1.66666666666667e-01 176 164 -7.50000000000000e-01 176 163 1.66666666666667e-01 176 3 8.33333333333333e-02 176 482 -2.50000000000000e-01 176 481 1.66666666666667e-01 176 480 -8.33333333333333e-02 176 72 8.33333333333333e-02 176 349 -8.33333333333333e-02 176 175 -3.33333333333333e-01 176 168 -8.33333333333333e-02 176 157 -8.33333333333333e-02 176 346 8.33333333333333e-02 176 156 -8.33333333333333e-02 176 345 8.33333333333333e-02 176 170 -2.50000000000000e-01 176 4 -1.66666666666667e-01 176 169 1.66666666666667e-01 176 483 8.33333333333333e-02 176 518 -7.50000000000000e-01 176 350 -2.50000000000000e-01 176 517 1.66666666666667e-01 176 73 -1.66666666666667e-01 176 174 -3.33333333333333e-01 176 516 1.66666666666667e-01 176 348 1.66666666666667e-01 177 177 2.50000000000000e+00 177 484 1.66666666666667e-01 177 483 -2.50000000000000e-01 177 164 -1.66666666666667e-01 177 163 8.33333333333333e-02 177 176 1.66666666666667e-01 177 550 8.33333333333333e-02 177 175 1.66666666666667e-01 177 174 -7.50000000000000e-01 177 551 8.33333333333333e-02 177 166 -8.33333333333333e-02 177 167 1.66666666666667e-01 177 179 -3.33333333333333e-01 177 5 -8.33333333333333e-02 177 165 -2.50000000000000e-01 177 497 8.33333333333333e-02 177 77 -8.33333333333333e-02 177 496 -1.66666666666667e-01 177 161 8.33333333333333e-02 177 466 1.66666666666667e-01 177 178 -3.33333333333333e-01 177 467 1.66666666666667e-01 177 76 -8.33333333333333e-02 177 465 -7.50000000000000e-01 177 160 8.33333333333333e-02 177 4 -8.33333333333333e-02 177 173 -8.33333333333333e-02 177 170 8.33333333333333e-02 177 532 8.33333333333333e-02 177 520 -8.33333333333333e-02 177 169 -1.66666666666667e-01 177 172 1.66666666666667e-01 177 171 -2.50000000000000e-01 177 521 1.66666666666667e-01 177 533 -1.66666666666667e-01 177 519 -2.50000000000000e-01 177 485 -8.33333333333333e-02 178 178 2.50000000000000e+00 178 483 1.66666666666667e-01 178 485 1.66666666666667e-01 178 484 -7.50000000000000e-01 178 162 8.33333333333333e-02 178 176 -8.33333333333333e-02 178 549 8.33333333333333e-02 178 175 -2.50000000000000e-01 178 174 1.66666666666667e-01 178 551 -1.66666666666667e-01 178 165 -8.33333333333333e-02 178 497 8.33333333333333e-02 178 167 1.66666666666667e-01 178 166 -2.50000000000000e-01 178 495 -1.66666666666667e-01 178 467 -8.33333333333333e-02 178 465 1.66666666666667e-01 178 177 -3.33333333333333e-01 178 466 -2.50000000000000e-01 178 75 -8.33333333333333e-02 178 161 -1.66666666666667e-01 178 159 8.33333333333333e-02 178 3 -8.33333333333333e-02 178 173 1.66666666666667e-01 178 179 -3.33333333333333e-01 178 521 1.66666666666667e-01 178 531 8.33333333333333e-02 178 519 -8.33333333333333e-02 178 170 8.33333333333333e-02 178 5 -8.33333333333333e-02 178 172 -7.50000000000000e-01 178 168 -1.66666666666667e-01 178 171 1.66666666666667e-01 178 533 8.33333333333333e-02 178 77 -8.33333333333333e-02 178 520 -2.50000000000000e-01 178 164 8.33333333333333e-02 179 179 2.50000000000000e+00 179 163 8.33333333333333e-02 179 485 -2.50000000000000e-01 179 484 1.66666666666667e-01 179 162 -1.66666666666667e-01 179 175 -8.33333333333333e-02 179 174 1.66666666666667e-01 179 176 -2.50000000000000e-01 179 550 -1.66666666666667e-01 179 549 8.33333333333333e-02 179 496 8.33333333333333e-02 179 165 1.66666666666667e-01 179 177 -3.33333333333333e-01 179 167 -7.50000000000000e-01 179 166 1.66666666666667e-01 179 3 -8.33333333333333e-02 179 495 8.33333333333333e-02 179 75 -8.33333333333333e-02 179 466 -8.33333333333333e-02 179 159 8.33333333333333e-02 179 467 -2.50000000000000e-01 179 465 1.66666666666667e-01 179 160 -1.66666666666667e-01 179 171 -8.33333333333333e-02 179 168 8.33333333333333e-02 179 172 1.66666666666667e-01 179 178 -3.33333333333333e-01 179 520 1.66666666666667e-01 179 173 -2.50000000000000e-01 179 169 8.33333333333333e-02 179 4 -8.33333333333333e-02 179 521 -7.50000000000000e-01 179 483 -8.33333333333333e-02 179 532 8.33333333333333e-02 179 76 -8.33333333333333e-02 179 519 1.66666666666667e-01 179 531 -1.66666666666667e-01 180 180 7.50000000000000e-01 180 7 4.16666666666667e-02 180 184 -8.33333333333333e-02 180 470 -4.16666666666667e-02 180 181 -8.33333333333333e-02 180 469 8.33333333333333e-02 180 58 4.16666666666667e-02 180 468 -1.25000000000000e-01 180 191 -8.33333333333333e-02 180 476 8.33333333333333e-02 180 8 4.16666666666667e-02 180 188 -8.33333333333333e-02 180 187 4.16666666666667e-02 180 190 -8.33333333333333e-02 180 6 -2.50000000000000e-01 180 182 -8.33333333333333e-02 180 473 8.33333333333333e-02 180 59 4.16666666666667e-02 180 472 -4.16666666666667e-02 180 475 8.33333333333333e-02 180 185 4.16666666666667e-02 180 471 -1.25000000000000e-01 180 57 -2.50000000000000e-01 181 181 6.66666666666667e-01 181 6 4.16666666666667e-02 181 183 -8.33333333333333e-02 181 470 8.33333333333333e-02 181 469 -3.75000000000000e-01 181 180 -8.33333333333333e-02 181 468 8.33333333333333e-02 181 57 4.16666666666667e-02 181 188 4.16666666666667e-02 181 191 -8.33333333333333e-02 181 7 -8.33333333333333e-02 181 186 4.16666666666667e-02 181 189 -8.33333333333333e-02 181 473 8.33333333333333e-02 181 476 -1.66666666666667e-01 181 185 4.16666666666667e-02 181 472 -1.25000000000000e-01 181 58 -8.33333333333333e-02 181 471 -4.16666666666667e-02 181 474 8.33333333333333e-02 182 182 6.66666666666667e-01 182 183 4.16666666666667e-02 182 470 -1.25000000000000e-01 182 469 8.33333333333333e-02 182 468 -4.16666666666667e-02 182 187 4.16666666666667e-02 182 190 -8.33333333333333e-02 182 189 -8.33333333333333e-02 182 474 8.33333333333333e-02 182 8 -8.33333333333333e-02 182 6 4.16666666666667e-02 182 186 -8.33333333333333e-02 182 184 4.16666666666667e-02 182 473 -3.75000000000000e-01 182 59 -8.33333333333333e-02 182 472 8.33333333333333e-02 182 475 -1.66666666666667e-01 182 180 -8.33333333333333e-02 182 471 8.33333333333333e-02 182 57 4.16666666666667e-02 183 183 1.25000000000000e+00 183 79 8.33333333333333e-02 183 184 -1.66666666666667e-01 183 7 8.33333333333333e-02 183 587 8.33333333333333e-02 183 586 8.33333333333333e-02 183 78 -1.25000000000000e-01 183 191 1.66666666666667e-01 183 190 -8.33333333333333e-02 183 189 -2.50000000000000e-01 183 6 -1.25000000000000e-01 183 185 -1.66666666666667e-01 183 8 -4.16666666666667e-02 183 182 4.16666666666667e-02 183 181 -8.33333333333333e-02 183 80 -4.16666666666667e-02 183 469 8.33333333333333e-02 183 470 8.33333333333333e-02 183 468 -3.75000000000000e-01 183 970 -8.33333333333333e-02 183 788 8.33333333333333e-02 183 787 8.33333333333333e-02 183 786 -3.75000000000000e-01 183 974 -8.33333333333333e-02 183 973 -8.33333333333333e-02 183 794 -1.66666666666667e-01 183 793 8.33333333333333e-02 183 971 4.16666666666667e-02 184 184 1.25000000000000e+00 184 78 8.33333333333333e-02 184 183 -1.66666666666667e-01 184 6 8.33333333333333e-02 184 587 -1.66666666666667e-01 184 80 8.33333333333333e-02 184 79 -3.75000000000000e-01 184 585 8.33333333333333e-02 184 191 1.66666666666667e-01 184 185 -1.66666666666667e-01 184 8 8.33333333333333e-02 184 190 -2.50000000000000e-01 184 7 -3.75000000000000e-01 184 189 -8.33333333333333e-02 184 182 4.16666666666667e-02 184 180 -8.33333333333333e-02 184 470 -4.16666666666667e-02 184 469 -1.25000000000000e-01 184 468 8.33333333333333e-02 184 969 -8.33333333333333e-02 184 788 -4.16666666666667e-02 184 787 -1.25000000000000e-01 184 786 8.33333333333333e-02 184 974 -8.33333333333333e-02 184 794 8.33333333333333e-02 184 972 -8.33333333333333e-02 184 971 4.16666666666667e-02 184 792 8.33333333333333e-02 185 185 1.25000000000000e+00 185 585 8.33333333333333e-02 185 80 -1.25000000000000e-01 185 586 -1.66666666666667e-01 185 79 8.33333333333333e-02 185 191 -7.50000000000000e-01 185 8 -1.25000000000000e-01 185 190 1.66666666666667e-01 185 184 -1.66666666666667e-01 185 7 8.33333333333333e-02 185 189 1.66666666666667e-01 185 181 4.16666666666667e-02 185 468 8.33333333333333e-02 185 183 -1.66666666666667e-01 185 6 -4.16666666666667e-02 185 180 4.16666666666667e-02 185 469 -4.16666666666667e-02 185 470 -1.25000000000000e-01 185 78 -4.16666666666667e-02 185 970 4.16666666666667e-02 185 788 -1.25000000000000e-01 185 787 -4.16666666666667e-02 185 786 8.33333333333333e-02 185 972 -8.33333333333333e-02 185 973 -8.33333333333333e-02 185 793 8.33333333333333e-02 185 969 4.16666666666667e-02 185 792 -1.66666666666667e-01 186 186 1.25000000000000e+00 186 593 8.33333333333333e-02 186 191 -8.33333333333333e-02 186 190 1.66666666666667e-01 186 189 -2.50000000000000e-01 186 83 8.33333333333333e-02 186 81 -1.25000000000000e-01 186 188 -1.66666666666667e-01 186 8 8.33333333333333e-02 186 592 8.33333333333333e-02 186 6 -1.25000000000000e-01 186 187 -1.66666666666667e-01 186 472 8.33333333333333e-02 186 182 -8.33333333333333e-02 186 7 -4.16666666666667e-02 186 181 4.16666666666667e-02 186 473 8.33333333333333e-02 186 82 -4.16666666666667e-02 186 471 -3.75000000000000e-01 186 794 8.33333333333333e-02 186 1004 -8.33333333333333e-02 186 1000 4.16666666666667e-02 186 1003 -8.33333333333333e-02 186 1001 -8.33333333333333e-02 186 791 8.33333333333333e-02 186 790 8.33333333333333e-02 186 793 -1.66666666666667e-01 186 789 -3.75000000000000e-01 187 187 1.25000000000000e+00 187 593 -1.66666666666667e-01 187 83 8.33333333333333e-02 187 191 1.66666666666667e-01 187 188 -1.66666666666667e-01 187 8 8.33333333333333e-02 187 190 -7.50000000000000e-01 187 189 1.66666666666667e-01 187 82 -1.25000000000000e-01 187 591 8.33333333333333e-02 187 7 -1.25000000000000e-01 187 473 -4.16666666666667e-02 187 186 -1.66666666666667e-01 187 471 8.33333333333333e-02 187 6 -4.16666666666667e-02 187 180 4.16666666666667e-02 187 182 4.16666666666667e-02 187 472 -1.25000000000000e-01 187 81 -4.16666666666667e-02 187 999 4.16666666666667e-02 187 1002 -8.33333333333333e-02 187 1001 4.16666666666667e-02 187 1004 -8.33333333333333e-02 187 791 -4.16666666666667e-02 187 794 8.33333333333333e-02 187 790 -1.25000000000000e-01 187 789 8.33333333333333e-02 187 792 -1.66666666666667e-01 188 188 1.25000000000000e+00 188 82 8.33333333333333e-02 188 591 8.33333333333333e-02 188 191 -2.50000000000000e-01 188 190 1.66666666666667e-01 188 187 -1.66666666666667e-01 188 7 8.33333333333333e-02 188 189 -8.33333333333333e-02 188 83 -3.75000000000000e-01 188 81 8.33333333333333e-02 188 592 -1.66666666666667e-01 188 8 -3.75000000000000e-01 188 186 -1.66666666666667e-01 188 6 8.33333333333333e-02 188 181 4.16666666666667e-02 188 472 -4.16666666666667e-02 188 180 -8.33333333333333e-02 188 473 -1.25000000000000e-01 188 471 8.33333333333333e-02 188 792 8.33333333333333e-02 188 1002 -8.33333333333333e-02 188 1000 4.16666666666667e-02 188 1003 -8.33333333333333e-02 188 999 -8.33333333333333e-02 188 791 -1.25000000000000e-01 188 790 -4.16666666666667e-02 188 793 8.33333333333333e-02 188 789 8.33333333333333e-02 189 189 2.50000000000000e+00 189 587 -8.33333333333333e-02 189 586 1.66666666666667e-01 189 85 8.33333333333333e-02 189 585 -2.50000000000000e-01 189 191 -3.33333333333333e-01 189 185 1.66666666666667e-01 189 184 -8.33333333333333e-02 189 7 8.33333333333333e-02 189 183 -2.50000000000000e-01 189 592 -8.33333333333333e-02 189 593 1.66666666666667e-01 189 86 8.33333333333333e-02 189 591 -2.50000000000000e-01 189 188 -8.33333333333333e-02 189 8 8.33333333333333e-02 189 190 -3.33333333333333e-01 189 187 1.66666666666667e-01 189 186 -2.50000000000000e-01 189 469 8.33333333333333e-02 189 470 -1.66666666666667e-01 189 182 -8.33333333333333e-02 189 473 8.33333333333333e-02 189 475 1.66666666666667e-01 189 472 -1.66666666666667e-01 189 181 -8.33333333333333e-02 189 476 1.66666666666667e-01 189 474 -7.50000000000000e-01 189 973 -1.66666666666667e-01 189 794 1.66666666666667e-01 189 1004 -1.66666666666667e-01 189 1030 -8.33333333333333e-02 189 1003 8.33333333333333e-02 189 1031 -8.33333333333333e-02 189 793 1.66666666666667e-01 189 974 8.33333333333333e-02 189 792 -7.50000000000000e-01 190 190 2.50000000000000e+00 190 587 1.66666666666667e-01 190 586 -7.50000000000000e-01 190 84 8.33333333333333e-02 190 185 1.66666666666667e-01 190 184 -2.50000000000000e-01 190 183 -8.33333333333333e-02 190 6 8.33333333333333e-02 190 191 -3.33333333333333e-01 190 591 -8.33333333333333e-02 190 86 -1.66666666666667e-01 190 593 1.66666666666667e-01 190 592 -2.50000000000000e-01 190 188 1.66666666666667e-01 190 8 -1.66666666666667e-01 190 585 1.66666666666667e-01 190 187 -7.50000000000000e-01 190 189 -3.33333333333333e-01 190 186 1.66666666666667e-01 190 470 8.33333333333333e-02 190 476 -8.33333333333333e-02 190 182 -8.33333333333333e-02 190 473 8.33333333333333e-02 190 474 1.66666666666667e-01 190 471 -1.66666666666667e-01 190 180 -8.33333333333333e-02 190 468 8.33333333333333e-02 190 475 -2.50000000000000e-01 190 974 8.33333333333333e-02 190 972 -1.66666666666667e-01 190 794 -8.33333333333333e-02 190 1031 -8.33333333333333e-02 190 1004 8.33333333333333e-02 190 1029 -8.33333333333333e-02 190 1002 8.33333333333333e-02 190 793 -2.50000000000000e-01 190 792 1.66666666666667e-01 191 191 2.50000000000000e+00 191 585 -8.33333333333333e-02 191 587 -2.50000000000000e-01 191 586 1.66666666666667e-01 191 185 -7.50000000000000e-01 191 184 1.66666666666667e-01 191 189 -3.33333333333333e-01 191 183 1.66666666666667e-01 191 190 -3.33333333333333e-01 191 591 1.66666666666667e-01 191 593 -7.50000000000000e-01 191 85 -1.66666666666667e-01 191 592 1.66666666666667e-01 191 84 8.33333333333333e-02 191 188 -2.50000000000000e-01 191 187 1.66666666666667e-01 191 7 -1.66666666666667e-01 191 186 -8.33333333333333e-02 191 6 8.33333333333333e-02 191 469 8.33333333333333e-02 191 468 -1.66666666666667e-01 191 475 -8.33333333333333e-02 191 181 -8.33333333333333e-02 191 472 8.33333333333333e-02 191 180 -8.33333333333333e-02 191 471 8.33333333333333e-02 191 476 -2.50000000000000e-01 191 474 1.66666666666667e-01 191 973 8.33333333333333e-02 191 793 -8.33333333333333e-02 191 1030 -8.33333333333333e-02 191 1003 8.33333333333333e-02 191 792 1.66666666666667e-01 191 1002 -1.66666666666667e-01 191 1029 -8.33333333333333e-02 191 972 8.33333333333333e-02 191 794 -2.50000000000000e-01 192 192 2.98333333333333e+01 192 194 -8.33333333333333e+00 192 365 4.25000000000000e+00 192 199 2.12500000000000e+00 192 364 -2.12500000000000e+00 192 41 -2.08333333333333e+00 192 40 2.12500000000000e+00 192 39 -2.16666666666667e+00 192 363 -6.37500000000000e+00 192 11 -2.08333333333333e+00 192 200 2.12500000000000e+00 192 193 -4.25000000000000e+00 192 10 2.12500000000000e+00 192 9 -2.16666666666667e+00 192 196 -8.33333333333333e-02 192 362 8.33333333333333e-02 192 361 8.33333333333333e-02 192 360 -3.75000000000000e-01 192 203 -8.33333333333333e-02 192 202 -8.33333333333333e-02 192 368 -1.66666666666667e-01 192 367 8.33333333333333e-02 192 197 4.16666666666667e-02 192 1718 2.08333333333333e+00 192 1717 -4.16666666666667e+00 192 1462 4.16666666666667e+00 192 1463 4.16666666666667e+00 192 1461 -1.87500000000000e+01 193 193 2.57500000000000e+01 193 198 2.12500000000000e+00 193 363 -2.12500000000000e+00 193 41 2.12500000000000e+00 193 194 -4.25000000000000e+00 193 365 4.25000000000000e+00 193 40 -6.50000000000000e+00 193 364 -6.37500000000000e+00 193 39 2.12500000000000e+00 193 11 2.12500000000000e+00 193 200 -4.25000000000000e+00 193 10 -6.50000000000000e+00 193 192 -4.25000000000000e+00 193 9 2.12500000000000e+00 193 195 -8.33333333333333e-02 193 362 -4.16666666666667e-02 193 361 -1.25000000000000e-01 193 360 8.33333333333333e-02 193 203 -8.33333333333333e-02 193 368 8.33333333333333e-02 193 201 -8.33333333333333e-02 193 197 4.16666666666667e-02 193 366 8.33333333333333e-02 193 1718 2.08333333333333e+00 193 1716 -4.16666666666667e+00 193 1463 -2.08333333333333e+00 193 1462 -6.25000000000000e+00 193 1461 4.16666666666667e+00 194 194 2.98333333333333e+01 194 192 -8.33333333333333e+00 194 363 4.25000000000000e+00 194 41 -2.16666666666667e+00 194 365 -1.91250000000000e+01 194 40 2.12500000000000e+00 194 193 -4.25000000000000e+00 194 364 4.25000000000000e+00 194 39 -2.08333333333333e+00 194 11 -2.16666666666667e+00 194 10 2.12500000000000e+00 194 199 -4.25000000000000e+00 194 9 -2.08333333333333e+00 194 198 2.12500000000000e+00 194 196 4.16666666666667e-02 194 362 -1.25000000000000e-01 194 361 -4.16666666666667e-02 194 360 8.33333333333333e-02 194 201 -8.33333333333333e-02 194 202 -8.33333333333333e-02 194 367 8.33333333333333e-02 194 195 4.16666666666667e-02 194 366 -1.66666666666667e-01 194 1717 2.08333333333333e+00 194 1461 4.16666666666667e+00 194 1716 2.08333333333333e+00 194 1462 -2.08333333333333e+00 194 1463 -6.25000000000000e+00 195 195 5.00000000000000e-01 195 362 -4.16666666666667e-02 195 604 4.16666666666667e-02 195 202 -4.16666666666667e-02 195 89 4.16666666666667e-02 195 605 -8.33333333333333e-02 195 88 4.16666666666667e-02 195 196 -8.33333333333333e-02 195 361 8.33333333333333e-02 195 87 -1.25000000000000e-01 195 360 -1.25000000000000e-01 195 197 -8.33333333333333e-02 195 11 4.16666666666667e-02 195 203 8.33333333333333e-02 195 10 4.16666666666667e-02 195 193 -8.33333333333333e-02 195 194 4.16666666666667e-02 195 9 -1.25000000000000e-01 195 201 -1.25000000000000e-01 196 196 5.83333333333333e-01 196 362 8.33333333333333e-02 196 203 8.33333333333333e-02 196 603 4.16666666666667e-02 196 201 -4.16666666666667e-02 196 89 -4.16666666666667e-02 196 605 4.16666666666667e-02 196 88 -4.16666666666667e-02 196 361 -3.75000000000000e-01 196 87 4.16666666666667e-02 196 195 -8.33333333333333e-02 196 360 8.33333333333333e-02 196 11 -4.16666666666667e-02 196 194 4.16666666666667e-02 196 197 -1.66666666666667e-01 196 10 -4.16666666666667e-02 196 202 -1.25000000000000e-01 196 9 4.16666666666667e-02 196 192 -8.33333333333333e-02 197 197 5.83333333333333e-01 197 360 -4.16666666666667e-02 197 196 -1.66666666666667e-01 197 361 8.33333333333333e-02 197 202 8.33333333333333e-02 197 89 -4.16666666666667e-02 197 362 -1.25000000000000e-01 197 88 -4.16666666666667e-02 197 604 4.16666666666667e-02 197 87 4.16666666666667e-02 197 603 -8.33333333333333e-02 197 192 4.16666666666667e-02 197 11 -4.16666666666667e-02 197 203 -3.75000000000000e-01 197 10 -4.16666666666667e-02 197 193 4.16666666666667e-02 197 195 -8.33333333333333e-02 197 9 4.16666666666667e-02 197 201 8.33333333333333e-02 198 198 3.39166666666667e+01 198 11 2.12500000000000e+00 198 200 -4.25000000000000e+00 198 92 2.12500000000000e+00 198 193 2.12500000000000e+00 198 194 2.12500000000000e+00 198 9 -4.20833333333333e+00 198 365 -2.12500000000000e+00 198 364 4.25000000000000e+00 198 363 -6.37500000000000e+00 198 90 -4.20833333333333e+00 198 202 8.33333333333333e-02 198 199 -1.66666666666667e-01 198 611 -8.33333333333333e-02 198 91 -4.16666666666667e-02 198 610 4.16666666666667e-02 198 203 8.33333333333333e-02 198 10 -4.16666666666667e-02 198 201 -3.75000000000000e-01 198 1466 -4.16666666666667e+00 198 1826 4.16666666666667e+00 198 1825 4.16666666666667e+00 198 1824 -1.87500000000000e+01 198 1462 -4.16666666666667e+00 198 1463 -4.16666666666667e+00 198 1730 4.16666666666667e+00 198 1729 -8.33333333333333e+00 198 1465 2.08333333333333e+00 199 199 3.39166666666667e+01 199 192 2.12500000000000e+00 199 194 -4.25000000000000e+00 199 11 2.12500000000000e+00 199 10 -4.20833333333333e+00 199 365 4.25000000000000e+00 199 200 -4.25000000000000e+00 199 92 2.12500000000000e+00 199 364 -1.91250000000000e+01 199 91 -4.20833333333333e+00 199 363 4.25000000000000e+00 199 611 4.16666666666667e-02 199 201 8.33333333333333e-02 199 198 -1.66666666666667e-01 199 90 -4.16666666666667e-02 199 609 4.16666666666667e-02 199 203 -4.16666666666667e-02 199 202 -1.25000000000000e-01 199 9 -4.16666666666667e-02 199 1466 2.08333333333333e+00 199 1826 -2.08333333333333e+00 199 1825 -6.25000000000000e+00 199 1824 4.16666666666667e+00 199 1461 -4.16666666666667e+00 199 1463 -4.16666666666667e+00 199 1730 4.16666666666667e+00 199 1464 2.08333333333333e+00 199 1728 -8.33333333333333e+00 200 200 3.80000000000000e+01 200 9 2.12500000000000e+00 200 198 -4.25000000000000e+00 200 90 2.12500000000000e+00 200 11 -1.26250000000000e+01 200 193 -4.25000000000000e+00 200 10 2.12500000000000e+00 200 192 2.12500000000000e+00 200 365 -6.37500000000000e+00 200 92 -1.26250000000000e+01 200 364 4.25000000000000e+00 200 199 -4.25000000000000e+00 200 91 2.12500000000000e+00 200 363 -2.12500000000000e+00 200 610 4.16666666666667e-02 200 609 -8.33333333333333e-02 200 202 -4.16666666666667e-02 200 203 -1.25000000000000e-01 200 201 8.33333333333333e-02 200 1464 -4.16666666666667e+00 200 1826 -6.25000000000000e+00 200 1825 -2.08333333333333e+00 200 1824 4.16666666666667e+00 200 1462 -4.16666666666667e+00 200 1729 4.16666666666667e+00 200 1461 -4.16666666666667e+00 200 1465 2.08333333333333e+00 200 1728 4.16666666666667e+00 201 201 1.25000000000000e+00 201 361 8.33333333333333e-02 201 362 8.33333333333333e-02 201 197 8.33333333333333e-02 201 195 -1.25000000000000e-01 201 605 8.33333333333333e-02 201 604 8.33333333333333e-02 201 202 -1.66666666666667e-01 201 603 -3.75000000000000e-01 201 368 -8.33333333333333e-02 201 203 -1.66666666666667e-01 201 194 -8.33333333333333e-02 201 365 8.33333333333333e-02 201 199 8.33333333333333e-02 201 367 1.66666666666667e-01 201 364 -1.66666666666667e-01 201 200 8.33333333333333e-02 201 11 -8.33333333333333e-02 201 10 4.16666666666667e-02 201 193 -8.33333333333333e-02 201 198 -3.75000000000000e-01 201 611 8.33333333333333e-02 201 95 -8.33333333333333e-02 201 610 -4.16666666666667e-02 201 94 4.16666666666667e-02 201 609 -1.25000000000000e-01 201 196 -4.16666666666667e-02 201 366 -2.50000000000000e-01 202 202 1.25000000000000e+00 202 195 -4.16666666666667e-02 202 360 8.33333333333333e-02 202 362 -1.66666666666667e-01 202 11 4.16666666666667e-02 202 196 -1.25000000000000e-01 202 605 -4.16666666666667e-02 202 95 4.16666666666667e-02 202 604 -1.25000000000000e-01 202 603 8.33333333333333e-02 202 201 -1.66666666666667e-01 202 200 -4.16666666666667e-02 202 198 8.33333333333333e-02 202 194 -8.33333333333333e-02 202 365 8.33333333333333e-02 202 366 1.66666666666667e-01 202 363 -1.66666666666667e-01 202 199 -1.25000000000000e-01 202 9 4.16666666666667e-02 202 192 -8.33333333333333e-02 202 611 8.33333333333333e-02 202 203 -1.66666666666667e-01 202 368 1.66666666666667e-01 202 610 -1.25000000000000e-01 202 197 8.33333333333333e-02 202 367 -7.50000000000000e-01 202 609 -4.16666666666667e-02 202 93 4.16666666666667e-02 203 203 1.25000000000000e+00 203 361 -1.66666666666667e-01 203 360 8.33333333333333e-02 203 197 -3.75000000000000e-01 203 10 4.16666666666667e-02 203 195 8.33333333333333e-02 203 605 -1.25000000000000e-01 203 604 -4.16666666666667e-02 203 94 4.16666666666667e-02 203 603 8.33333333333333e-02 203 366 -8.33333333333333e-02 203 199 -4.16666666666667e-02 203 201 -1.66666666666667e-01 203 192 -8.33333333333333e-02 203 363 8.33333333333333e-02 203 193 -8.33333333333333e-02 203 364 8.33333333333333e-02 203 200 -1.25000000000000e-01 203 198 8.33333333333333e-02 203 9 -8.33333333333333e-02 203 611 -3.75000000000000e-01 203 196 8.33333333333333e-02 203 368 -2.50000000000000e-01 203 610 8.33333333333333e-02 203 202 -1.66666666666667e-01 203 367 1.66666666666667e-01 203 609 8.33333333333333e-02 203 93 -8.33333333333333e-02 204 204 1.25000000000000e+00 204 607 8.33333333333333e-02 204 608 8.33333333333333e-02 204 211 8.33333333333333e-02 204 210 -1.25000000000000e-01 204 206 -1.66666666666667e-01 204 380 8.33333333333333e-02 204 379 8.33333333333333e-02 204 378 -3.75000000000000e-01 204 385 -8.33333333333333e-02 204 205 -1.66666666666667e-01 204 209 8.33333333333333e-02 204 217 -8.33333333333333e-02 204 490 8.33333333333333e-02 204 386 1.66666666666667e-01 204 491 -1.66666666666667e-01 204 14 4.16666666666667e-02 204 218 -8.33333333333333e-02 204 208 8.33333333333333e-02 204 13 -8.33333333333333e-02 204 207 -3.75000000000000e-01 204 374 -4.16666666666667e-02 204 44 4.16666666666667e-02 204 373 8.33333333333333e-02 204 43 -8.33333333333333e-02 204 372 -1.25000000000000e-01 204 212 -4.16666666666667e-02 204 384 -2.50000000000000e-01 205 205 1.25000000000000e+00 205 606 8.33333333333333e-02 205 608 -1.66666666666667e-01 205 14 4.16666666666667e-02 205 211 -3.75000000000000e-01 205 210 8.33333333333333e-02 205 380 -4.16666666666667e-02 205 44 4.16666666666667e-02 205 379 -1.25000000000000e-01 205 378 8.33333333333333e-02 205 384 -8.33333333333333e-02 205 209 -4.16666666666667e-02 205 204 -1.66666666666667e-01 205 216 -8.33333333333333e-02 205 489 8.33333333333333e-02 205 218 -8.33333333333333e-02 205 491 8.33333333333333e-02 205 208 -1.25000000000000e-01 205 207 8.33333333333333e-02 205 12 -8.33333333333333e-02 205 374 8.33333333333333e-02 205 206 -1.66666666666667e-01 205 386 1.66666666666667e-01 205 373 -3.75000000000000e-01 205 212 8.33333333333333e-02 205 385 -2.50000000000000e-01 205 372 8.33333333333333e-02 205 42 -8.33333333333333e-02 206 206 1.25000000000000e+00 206 211 8.33333333333333e-02 206 607 -1.66666666666667e-01 206 606 8.33333333333333e-02 206 212 -1.25000000000000e-01 206 13 4.16666666666667e-02 206 380 -1.25000000000000e-01 206 379 -4.16666666666667e-02 206 43 4.16666666666667e-02 206 204 -1.66666666666667e-01 206 378 8.33333333333333e-02 206 208 -4.16666666666667e-02 206 207 8.33333333333333e-02 206 217 -8.33333333333333e-02 206 490 8.33333333333333e-02 206 384 1.66666666666667e-01 206 489 -1.66666666666667e-01 206 209 -1.25000000000000e-01 206 12 4.16666666666667e-02 206 216 -8.33333333333333e-02 206 374 -1.25000000000000e-01 206 210 -4.16666666666667e-02 206 386 -7.50000000000000e-01 206 373 8.33333333333333e-02 206 205 -1.66666666666667e-01 206 385 1.66666666666667e-01 206 372 -4.16666666666667e-02 206 42 4.16666666666667e-02 207 207 1.25000000000000e+00 207 214 -8.33333333333333e-02 207 488 8.33333333333333e-02 207 487 8.33333333333333e-02 207 486 -3.75000000000000e-01 207 221 -8.33333333333333e-02 207 220 -8.33333333333333e-02 207 494 -1.66666666666667e-01 207 493 8.33333333333333e-02 207 206 8.33333333333333e-02 207 209 -1.66666666666667e-01 207 491 1.66666666666667e-01 207 217 8.33333333333333e-02 207 490 -8.33333333333333e-02 207 62 -4.16666666666667e-02 207 374 4.16666666666667e-02 207 61 8.33333333333333e-02 207 373 -8.33333333333333e-02 207 60 -1.25000000000000e-01 207 489 -2.50000000000000e-01 207 14 -4.16666666666667e-02 207 218 8.33333333333333e-02 207 208 -1.66666666666667e-01 207 13 8.33333333333333e-02 207 205 8.33333333333333e-02 207 215 4.16666666666667e-02 207 12 -1.25000000000000e-01 207 204 -3.75000000000000e-01 208 208 1.25000000000000e+00 208 213 -8.33333333333333e-02 208 488 -4.16666666666667e-02 208 487 -1.25000000000000e-01 208 486 8.33333333333333e-02 208 221 -8.33333333333333e-02 208 494 8.33333333333333e-02 208 219 -8.33333333333333e-02 208 492 8.33333333333333e-02 208 206 -4.16666666666667e-02 208 374 4.16666666666667e-02 208 216 8.33333333333333e-02 208 489 -8.33333333333333e-02 208 62 8.33333333333333e-02 208 209 -1.66666666666667e-01 208 491 1.66666666666667e-01 208 61 -3.75000000000000e-01 208 490 -2.50000000000000e-01 208 60 8.33333333333333e-02 208 372 -8.33333333333333e-02 208 14 8.33333333333333e-02 208 218 -1.66666666666667e-01 208 215 4.16666666666667e-02 208 13 -3.75000000000000e-01 208 205 -1.25000000000000e-01 208 207 -1.66666666666667e-01 208 12 8.33333333333333e-02 208 204 8.33333333333333e-02 209 209 1.25000000000000e+00 209 214 4.16666666666667e-02 209 488 -1.25000000000000e-01 209 487 -4.16666666666667e-02 209 486 8.33333333333333e-02 209 219 -8.33333333333333e-02 209 220 -8.33333333333333e-02 209 493 8.33333333333333e-02 209 492 -1.66666666666667e-01 209 205 -4.16666666666667e-02 209 373 4.16666666666667e-02 209 204 8.33333333333333e-02 209 207 -1.66666666666667e-01 209 489 1.66666666666667e-01 209 62 -1.25000000000000e-01 209 491 -7.50000000000000e-01 209 61 8.33333333333333e-02 209 208 -1.66666666666667e-01 209 490 1.66666666666667e-01 209 60 -4.16666666666667e-02 209 372 4.16666666666667e-02 209 213 4.16666666666667e-02 209 14 -1.25000000000000e-01 209 206 -1.25000000000000e-01 209 13 8.33333333333333e-02 209 217 -1.66666666666667e-01 209 12 -4.16666666666667e-02 209 216 8.33333333333333e-02 210 210 5.00000000000000e-01 210 206 -4.16666666666667e-02 210 217 4.16666666666667e-02 210 607 -4.16666666666667e-02 210 14 4.16666666666667e-02 210 218 -8.33333333333333e-02 210 13 4.16666666666667e-02 210 211 -8.33333333333333e-02 210 205 8.33333333333333e-02 210 12 -1.25000000000000e-01 210 204 -1.25000000000000e-01 210 212 -8.33333333333333e-02 210 89 4.16666666666667e-02 210 608 8.33333333333333e-02 210 88 4.16666666666667e-02 210 379 -8.33333333333333e-02 210 380 4.16666666666667e-02 210 87 -1.25000000000000e-01 210 606 -1.25000000000000e-01 211 211 5.83333333333333e-01 211 206 8.33333333333333e-02 211 608 8.33333333333333e-02 211 216 4.16666666666667e-02 211 606 -4.16666666666667e-02 211 14 -4.16666666666667e-02 211 218 4.16666666666667e-02 211 13 -4.16666666666667e-02 211 205 -3.75000000000000e-01 211 12 4.16666666666667e-02 211 210 -8.33333333333333e-02 211 204 8.33333333333333e-02 211 89 -4.16666666666667e-02 211 380 4.16666666666667e-02 211 212 -1.66666666666667e-01 211 88 -4.16666666666667e-02 211 607 -1.25000000000000e-01 211 87 4.16666666666667e-02 211 378 -8.33333333333333e-02 212 212 5.83333333333333e-01 212 204 -4.16666666666667e-02 212 211 -1.66666666666667e-01 212 205 8.33333333333333e-02 212 607 8.33333333333333e-02 212 14 -4.16666666666667e-02 212 206 -1.25000000000000e-01 212 13 -4.16666666666667e-02 212 217 4.16666666666667e-02 212 12 4.16666666666667e-02 212 216 -8.33333333333333e-02 212 378 4.16666666666667e-02 212 89 -4.16666666666667e-02 212 608 -3.75000000000000e-01 212 88 -4.16666666666667e-02 212 379 4.16666666666667e-02 212 210 -8.33333333333333e-02 212 87 4.16666666666667e-02 212 606 8.33333333333333e-02 213 213 5.00000000000000e-01 213 488 -4.16666666666667e-02 213 622 4.16666666666667e-02 213 220 -4.16666666666667e-02 213 98 4.16666666666667e-02 213 623 -8.33333333333333e-02 213 97 4.16666666666667e-02 213 214 -8.33333333333333e-02 213 487 8.33333333333333e-02 213 96 -1.25000000000000e-01 213 486 -1.25000000000000e-01 213 215 -8.33333333333333e-02 213 14 4.16666666666667e-02 213 221 8.33333333333333e-02 213 13 4.16666666666667e-02 213 208 -8.33333333333333e-02 213 209 4.16666666666667e-02 213 12 -1.25000000000000e-01 213 219 -1.25000000000000e-01 214 214 5.83333333333333e-01 214 488 8.33333333333333e-02 214 221 8.33333333333333e-02 214 621 4.16666666666667e-02 214 219 -4.16666666666667e-02 214 98 -4.16666666666667e-02 214 623 4.16666666666667e-02 214 97 -4.16666666666667e-02 214 487 -3.75000000000000e-01 214 96 4.16666666666667e-02 214 213 -8.33333333333333e-02 214 486 8.33333333333333e-02 214 14 -4.16666666666667e-02 214 209 4.16666666666667e-02 214 215 -1.66666666666667e-01 214 13 -4.16666666666667e-02 214 220 -1.25000000000000e-01 214 12 4.16666666666667e-02 214 207 -8.33333333333333e-02 215 215 5.83333333333333e-01 215 486 -4.16666666666667e-02 215 214 -1.66666666666667e-01 215 487 8.33333333333333e-02 215 220 8.33333333333333e-02 215 98 -4.16666666666667e-02 215 488 -1.25000000000000e-01 215 97 -4.16666666666667e-02 215 622 4.16666666666667e-02 215 96 4.16666666666667e-02 215 621 -8.33333333333333e-02 215 207 4.16666666666667e-02 215 14 -4.16666666666667e-02 215 221 -3.75000000000000e-01 215 13 -4.16666666666667e-02 215 208 4.16666666666667e-02 215 213 -8.33333333333333e-02 215 12 4.16666666666667e-02 215 219 8.33333333333333e-02 216 216 1.25000000000000e+00 216 217 -1.66666666666667e-01 216 629 -8.33333333333333e-02 216 100 -4.16666666666667e-02 216 628 4.16666666666667e-02 216 221 8.33333333333333e-02 216 13 -4.16666666666667e-02 216 219 -3.75000000000000e-01 216 211 4.16666666666667e-02 216 14 8.33333333333333e-02 216 212 -8.33333333333333e-02 216 218 -1.66666666666667e-01 216 608 8.33333333333333e-02 216 101 8.33333333333333e-02 216 607 8.33333333333333e-02 216 606 -3.75000000000000e-01 216 205 -8.33333333333333e-02 216 208 8.33333333333333e-02 216 209 8.33333333333333e-02 216 206 -8.33333333333333e-02 216 12 -1.25000000000000e-01 216 491 -8.33333333333333e-02 216 386 8.33333333333333e-02 216 490 1.66666666666667e-01 216 385 -1.66666666666667e-01 216 489 -2.50000000000000e-01 216 220 8.33333333333333e-02 216 99 -1.25000000000000e-01 217 217 1.25000000000000e+00 217 629 4.16666666666667e-02 217 219 8.33333333333333e-02 217 216 -1.66666666666667e-01 217 99 -4.16666666666667e-02 217 627 4.16666666666667e-02 217 220 -1.25000000000000e-01 217 12 -4.16666666666667e-02 217 210 4.16666666666667e-02 217 212 4.16666666666667e-02 217 608 -4.16666666666667e-02 217 607 -1.25000000000000e-01 217 606 8.33333333333333e-02 217 204 -8.33333333333333e-02 217 207 8.33333333333333e-02 217 206 -8.33333333333333e-02 217 386 8.33333333333333e-02 217 209 -1.66666666666667e-01 217 14 8.33333333333333e-02 217 13 -1.25000000000000e-01 217 491 1.66666666666667e-01 217 218 -1.66666666666667e-01 217 101 8.33333333333333e-02 217 490 -7.50000000000000e-01 217 221 -4.16666666666667e-02 217 100 -1.25000000000000e-01 217 489 1.66666666666667e-01 217 384 -1.66666666666667e-01 218 218 1.25000000000000e+00 218 628 4.16666666666667e-02 218 627 -8.33333333333333e-02 218 221 -1.25000000000000e-01 218 219 8.33333333333333e-02 218 211 4.16666666666667e-02 218 12 8.33333333333333e-02 218 210 -8.33333333333333e-02 218 608 -1.25000000000000e-01 218 607 -4.16666666666667e-02 218 216 -1.66666666666667e-01 218 606 8.33333333333333e-02 218 99 8.33333333333333e-02 218 205 -8.33333333333333e-02 218 385 8.33333333333333e-02 218 14 -3.75000000000000e-01 218 208 -1.66666666666667e-01 218 13 8.33333333333333e-02 218 207 8.33333333333333e-02 218 204 -8.33333333333333e-02 218 491 -2.50000000000000e-01 218 220 -4.16666666666667e-02 218 101 -3.75000000000000e-01 218 490 1.66666666666667e-01 218 217 -1.66666666666667e-01 218 100 8.33333333333333e-02 218 489 -8.33333333333333e-02 218 384 8.33333333333333e-02 219 219 1.25000000000000e+00 219 487 8.33333333333333e-02 219 488 8.33333333333333e-02 219 215 8.33333333333333e-02 219 213 -1.25000000000000e-01 219 623 8.33333333333333e-02 219 622 8.33333333333333e-02 219 220 -1.66666666666667e-01 219 621 -3.75000000000000e-01 219 494 -8.33333333333333e-02 219 221 -1.66666666666667e-01 219 209 -8.33333333333333e-02 219 491 8.33333333333333e-02 219 217 8.33333333333333e-02 219 493 1.66666666666667e-01 219 490 -1.66666666666667e-01 219 218 8.33333333333333e-02 219 14 -8.33333333333333e-02 219 13 4.16666666666667e-02 219 208 -8.33333333333333e-02 219 216 -3.75000000000000e-01 219 629 8.33333333333333e-02 219 104 -8.33333333333333e-02 219 628 -4.16666666666667e-02 219 103 4.16666666666667e-02 219 627 -1.25000000000000e-01 219 214 -4.16666666666667e-02 219 492 -2.50000000000000e-01 220 220 1.25000000000000e+00 220 213 -4.16666666666667e-02 220 486 8.33333333333333e-02 220 488 -1.66666666666667e-01 220 14 4.16666666666667e-02 220 214 -1.25000000000000e-01 220 623 -4.16666666666667e-02 220 104 4.16666666666667e-02 220 622 -1.25000000000000e-01 220 621 8.33333333333333e-02 220 219 -1.66666666666667e-01 220 218 -4.16666666666667e-02 220 216 8.33333333333333e-02 220 209 -8.33333333333333e-02 220 491 8.33333333333333e-02 220 492 1.66666666666667e-01 220 489 -1.66666666666667e-01 220 217 -1.25000000000000e-01 220 12 4.16666666666667e-02 220 207 -8.33333333333333e-02 220 629 8.33333333333333e-02 220 221 -1.66666666666667e-01 220 494 1.66666666666667e-01 220 628 -1.25000000000000e-01 220 215 8.33333333333333e-02 220 493 -7.50000000000000e-01 220 627 -4.16666666666667e-02 220 102 4.16666666666667e-02 221 221 1.25000000000000e+00 221 487 -1.66666666666667e-01 221 486 8.33333333333333e-02 221 215 -3.75000000000000e-01 221 13 4.16666666666667e-02 221 213 8.33333333333333e-02 221 623 -1.25000000000000e-01 221 622 -4.16666666666667e-02 221 103 4.16666666666667e-02 221 621 8.33333333333333e-02 221 492 -8.33333333333333e-02 221 217 -4.16666666666667e-02 221 219 -1.66666666666667e-01 221 207 -8.33333333333333e-02 221 489 8.33333333333333e-02 221 208 -8.33333333333333e-02 221 490 8.33333333333333e-02 221 218 -1.25000000000000e-01 221 216 8.33333333333333e-02 221 12 -8.33333333333333e-02 221 629 -3.75000000000000e-01 221 214 8.33333333333333e-02 221 494 -2.50000000000000e-01 221 628 8.33333333333333e-02 221 220 -1.66666666666667e-01 221 493 1.66666666666667e-01 221 627 8.33333333333333e-02 221 102 -8.33333333333333e-02 222 222 1.25000000000000e+00 222 625 8.33333333333333e-02 222 626 8.33333333333333e-02 222 229 8.33333333333333e-02 222 228 -1.25000000000000e-01 222 224 -1.66666666666667e-01 222 506 8.33333333333333e-02 222 505 8.33333333333333e-02 222 504 -3.75000000000000e-01 222 511 -8.33333333333333e-02 222 223 -1.66666666666667e-01 222 227 8.33333333333333e-02 222 232 -8.33333333333333e-02 222 589 8.33333333333333e-02 222 512 1.66666666666667e-01 222 590 -1.66666666666667e-01 222 17 4.16666666666667e-02 222 233 -8.33333333333333e-02 222 226 8.33333333333333e-02 222 16 -8.33333333333333e-02 222 225 -3.75000000000000e-01 222 500 -4.16666666666667e-02 222 65 4.16666666666667e-02 222 499 8.33333333333333e-02 222 64 -8.33333333333333e-02 222 498 -1.25000000000000e-01 222 230 -4.16666666666667e-02 222 510 -2.50000000000000e-01 223 223 1.25000000000000e+00 223 624 8.33333333333333e-02 223 626 -1.66666666666667e-01 223 17 4.16666666666667e-02 223 229 -3.75000000000000e-01 223 228 8.33333333333333e-02 223 506 -4.16666666666667e-02 223 65 4.16666666666667e-02 223 505 -1.25000000000000e-01 223 504 8.33333333333333e-02 223 510 -8.33333333333333e-02 223 227 -4.16666666666667e-02 223 222 -1.66666666666667e-01 223 231 -8.33333333333333e-02 223 588 8.33333333333333e-02 223 233 -8.33333333333333e-02 223 590 8.33333333333333e-02 223 226 -1.25000000000000e-01 223 225 8.33333333333333e-02 223 15 -8.33333333333333e-02 223 500 8.33333333333333e-02 223 224 -1.66666666666667e-01 223 512 1.66666666666667e-01 223 499 -3.75000000000000e-01 223 230 8.33333333333333e-02 223 511 -2.50000000000000e-01 223 498 8.33333333333333e-02 223 63 -8.33333333333333e-02 224 224 1.25000000000000e+00 224 229 8.33333333333333e-02 224 625 -1.66666666666667e-01 224 624 8.33333333333333e-02 224 230 -1.25000000000000e-01 224 16 4.16666666666667e-02 224 506 -1.25000000000000e-01 224 505 -4.16666666666667e-02 224 64 4.16666666666667e-02 224 222 -1.66666666666667e-01 224 504 8.33333333333333e-02 224 226 -4.16666666666667e-02 224 225 8.33333333333333e-02 224 232 -8.33333333333333e-02 224 589 8.33333333333333e-02 224 510 1.66666666666667e-01 224 588 -1.66666666666667e-01 224 227 -1.25000000000000e-01 224 15 4.16666666666667e-02 224 231 -8.33333333333333e-02 224 500 -1.25000000000000e-01 224 228 -4.16666666666667e-02 224 512 -7.50000000000000e-01 224 499 8.33333333333333e-02 224 223 -1.66666666666667e-01 224 511 1.66666666666667e-01 224 498 -4.16666666666667e-02 224 63 4.16666666666667e-02 225 225 1.25000000000000e+00 225 16 8.33333333333333e-02 225 226 -1.66666666666667e-01 225 79 8.33333333333333e-02 225 233 8.33333333333333e-02 225 232 8.33333333333333e-02 225 15 -1.25000000000000e-01 225 590 1.66666666666667e-01 225 589 -8.33333333333333e-02 225 588 -2.50000000000000e-01 225 78 -1.25000000000000e-01 225 227 -1.66666666666667e-01 225 80 -4.16666666666667e-02 225 500 4.16666666666667e-02 225 499 -8.33333333333333e-02 225 17 -4.16666666666667e-02 225 223 8.33333333333333e-02 225 224 8.33333333333333e-02 225 222 -3.75000000000000e-01 225 832 -8.33333333333333e-02 225 977 8.33333333333333e-02 225 976 8.33333333333333e-02 225 975 -3.75000000000000e-01 225 836 -8.33333333333333e-02 225 835 -8.33333333333333e-02 225 980 -1.66666666666667e-01 225 979 8.33333333333333e-02 225 833 4.16666666666667e-02 226 226 1.25000000000000e+00 226 15 8.33333333333333e-02 226 225 -1.66666666666667e-01 226 78 8.33333333333333e-02 226 233 -1.66666666666667e-01 226 17 8.33333333333333e-02 226 16 -3.75000000000000e-01 226 231 8.33333333333333e-02 226 590 1.66666666666667e-01 226 227 -1.66666666666667e-01 226 80 8.33333333333333e-02 226 589 -2.50000000000000e-01 226 79 -3.75000000000000e-01 226 588 -8.33333333333333e-02 226 500 4.16666666666667e-02 226 498 -8.33333333333333e-02 226 224 -4.16666666666667e-02 226 223 -1.25000000000000e-01 226 222 8.33333333333333e-02 226 831 -8.33333333333333e-02 226 977 -4.16666666666667e-02 226 976 -1.25000000000000e-01 226 975 8.33333333333333e-02 226 836 -8.33333333333333e-02 226 980 8.33333333333333e-02 226 834 -8.33333333333333e-02 226 833 4.16666666666667e-02 226 978 8.33333333333333e-02 227 227 1.25000000000000e+00 227 231 8.33333333333333e-02 227 17 -1.25000000000000e-01 227 232 -1.66666666666667e-01 227 16 8.33333333333333e-02 227 590 -7.50000000000000e-01 227 80 -1.25000000000000e-01 227 589 1.66666666666667e-01 227 226 -1.66666666666667e-01 227 79 8.33333333333333e-02 227 588 1.66666666666667e-01 227 499 4.16666666666667e-02 227 222 8.33333333333333e-02 227 225 -1.66666666666667e-01 227 78 -4.16666666666667e-02 227 498 4.16666666666667e-02 227 223 -4.16666666666667e-02 227 224 -1.25000000000000e-01 227 15 -4.16666666666667e-02 227 832 4.16666666666667e-02 227 977 -1.25000000000000e-01 227 976 -4.16666666666667e-02 227 975 8.33333333333333e-02 227 834 -8.33333333333333e-02 227 835 -8.33333333333333e-02 227 979 8.33333333333333e-02 227 831 4.16666666666667e-02 227 978 -1.66666666666667e-01 228 228 5.00000000000000e-01 228 224 -4.16666666666667e-02 228 232 4.16666666666667e-02 228 625 -4.16666666666667e-02 228 17 4.16666666666667e-02 228 233 -8.33333333333333e-02 228 16 4.16666666666667e-02 228 229 -8.33333333333333e-02 228 223 8.33333333333333e-02 228 15 -1.25000000000000e-01 228 222 -1.25000000000000e-01 228 230 -8.33333333333333e-02 228 98 4.16666666666667e-02 228 626 8.33333333333333e-02 228 97 4.16666666666667e-02 228 505 -8.33333333333333e-02 228 506 4.16666666666667e-02 228 96 -1.25000000000000e-01 228 624 -1.25000000000000e-01 229 229 5.83333333333333e-01 229 224 8.33333333333333e-02 229 626 8.33333333333333e-02 229 231 4.16666666666667e-02 229 624 -4.16666666666667e-02 229 17 -4.16666666666667e-02 229 233 4.16666666666667e-02 229 16 -4.16666666666667e-02 229 223 -3.75000000000000e-01 229 15 4.16666666666667e-02 229 228 -8.33333333333333e-02 229 222 8.33333333333333e-02 229 98 -4.16666666666667e-02 229 506 4.16666666666667e-02 229 230 -1.66666666666667e-01 229 97 -4.16666666666667e-02 229 625 -1.25000000000000e-01 229 96 4.16666666666667e-02 229 504 -8.33333333333333e-02 230 230 5.83333333333333e-01 230 222 -4.16666666666667e-02 230 229 -1.66666666666667e-01 230 223 8.33333333333333e-02 230 625 8.33333333333333e-02 230 17 -4.16666666666667e-02 230 224 -1.25000000000000e-01 230 16 -4.16666666666667e-02 230 232 4.16666666666667e-02 230 15 4.16666666666667e-02 230 231 -8.33333333333333e-02 230 504 4.16666666666667e-02 230 98 -4.16666666666667e-02 230 626 -3.75000000000000e-01 230 97 -4.16666666666667e-02 230 505 4.16666666666667e-02 230 228 -8.33333333333333e-02 230 96 4.16666666666667e-02 230 624 8.33333333333333e-02 231 231 1.25000000000000e+00 231 590 -8.33333333333333e-02 231 232 -1.66666666666667e-01 231 589 1.66666666666667e-01 231 107 8.33333333333333e-02 231 106 -4.16666666666667e-02 231 105 -1.25000000000000e-01 231 588 -2.50000000000000e-01 231 233 -1.66666666666667e-01 231 17 8.33333333333333e-02 231 16 -4.16666666666667e-02 231 226 8.33333333333333e-02 231 227 8.33333333333333e-02 231 15 -1.25000000000000e-01 231 230 -8.33333333333333e-02 231 626 8.33333333333333e-02 231 625 8.33333333333333e-02 231 624 -3.75000000000000e-01 231 223 -8.33333333333333e-02 231 224 -8.33333333333333e-02 231 512 8.33333333333333e-02 231 511 -1.66666666666667e-01 231 229 4.16666666666667e-02 231 835 8.33333333333333e-02 231 1211 -8.33333333333333e-02 231 1210 4.16666666666667e-02 231 836 8.33333333333333e-02 231 834 -3.75000000000000e-01 232 232 1.25000000000000e+00 232 231 -1.66666666666667e-01 232 588 1.66666666666667e-01 232 107 8.33333333333333e-02 232 233 -1.66666666666667e-01 232 590 1.66666666666667e-01 232 106 -1.25000000000000e-01 232 589 -7.50000000000000e-01 232 105 -4.16666666666667e-02 232 17 8.33333333333333e-02 232 227 -1.66666666666667e-01 232 16 -1.25000000000000e-01 232 15 -4.16666666666667e-02 232 225 8.33333333333333e-02 232 230 4.16666666666667e-02 232 626 -4.16666666666667e-02 232 625 -1.25000000000000e-01 232 624 8.33333333333333e-02 232 222 -8.33333333333333e-02 232 224 -8.33333333333333e-02 232 512 8.33333333333333e-02 232 228 4.16666666666667e-02 232 510 -1.66666666666667e-01 232 1211 4.16666666666667e-02 232 834 8.33333333333333e-02 232 1209 4.16666666666667e-02 232 836 -4.16666666666667e-02 232 835 -1.25000000000000e-01 233 233 1.25000000000000e+00 233 225 8.33333333333333e-02 233 588 -8.33333333333333e-02 233 107 -3.75000000000000e-01 233 590 -2.50000000000000e-01 233 106 8.33333333333333e-02 233 232 -1.66666666666667e-01 233 589 1.66666666666667e-01 233 105 8.33333333333333e-02 233 17 -3.75000000000000e-01 233 16 8.33333333333333e-02 233 226 -1.66666666666667e-01 233 231 -1.66666666666667e-01 233 15 8.33333333333333e-02 233 228 -8.33333333333333e-02 233 626 -1.25000000000000e-01 233 625 -4.16666666666667e-02 233 624 8.33333333333333e-02 233 223 -8.33333333333333e-02 233 511 8.33333333333333e-02 233 222 -8.33333333333333e-02 233 229 4.16666666666667e-02 233 510 8.33333333333333e-02 233 1210 4.16666666666667e-02 233 1209 -8.33333333333333e-02 233 835 -4.16666666666667e-02 233 836 -1.25000000000000e-01 233 834 8.33333333333333e-02 234 234 2.98333333333333e+01 234 401 -2.12500000000000e+00 234 235 -8.33333333333333e+00 234 400 4.25000000000000e+00 234 47 2.12500000000000e+00 234 46 -2.08333333333333e+00 234 45 -2.16666666666667e+00 234 399 -6.37500000000000e+00 234 236 -4.25000000000000e+00 234 20 2.12500000000000e+00 234 19 -2.08333333333333e+00 234 241 2.12500000000000e+00 234 242 2.12500000000000e+00 234 18 -2.16666666666667e+00 234 404 8.33333333333333e-02 234 245 -8.33333333333333e-02 234 238 4.16666666666667e-02 234 244 -8.33333333333333e-02 234 239 -8.33333333333333e-02 234 398 8.33333333333333e-02 234 397 8.33333333333333e-02 234 403 -1.66666666666667e-01 234 396 -3.75000000000000e-01 234 1498 4.16666666666667e+00 234 1754 -4.16666666666667e+00 234 1753 2.08333333333333e+00 234 1499 4.16666666666667e+00 234 1497 -1.87500000000000e+01 235 235 2.98333333333333e+01 235 234 -8.33333333333333e+00 235 399 4.25000000000000e+00 235 47 2.12500000000000e+00 235 236 -4.25000000000000e+00 235 401 4.25000000000000e+00 235 46 -2.16666666666667e+00 235 400 -1.91250000000000e+01 235 45 -2.08333333333333e+00 235 20 2.12500000000000e+00 235 242 -4.25000000000000e+00 235 19 -2.16666666666667e+00 235 18 -2.08333333333333e+00 235 240 2.12500000000000e+00 235 237 4.16666666666667e-02 235 243 -8.33333333333333e-02 235 239 4.16666666666667e-02 235 245 -8.33333333333333e-02 235 398 -4.16666666666667e-02 235 404 8.33333333333333e-02 235 397 -1.25000000000000e-01 235 396 8.33333333333333e-02 235 402 -1.66666666666667e-01 235 1499 -2.08333333333333e+00 235 1497 4.16666666666667e+00 235 1752 2.08333333333333e+00 235 1754 2.08333333333333e+00 235 1498 -6.25000000000000e+00 236 236 2.57500000000000e+01 236 399 -2.12500000000000e+00 236 47 -6.50000000000000e+00 236 401 -6.37500000000000e+00 236 46 2.12500000000000e+00 236 235 -4.25000000000000e+00 236 400 4.25000000000000e+00 236 45 2.12500000000000e+00 236 240 2.12500000000000e+00 236 20 -6.50000000000000e+00 236 19 2.12500000000000e+00 236 241 -4.25000000000000e+00 236 234 -4.25000000000000e+00 236 18 2.12500000000000e+00 236 402 8.33333333333333e-02 236 243 -8.33333333333333e-02 236 238 4.16666666666667e-02 236 244 -8.33333333333333e-02 236 237 -8.33333333333333e-02 236 398 -1.25000000000000e-01 236 397 -4.16666666666667e-02 236 403 8.33333333333333e-02 236 396 8.33333333333333e-02 236 1753 2.08333333333333e+00 236 1498 -2.08333333333333e+00 236 1752 -4.16666666666667e+00 236 1499 -6.25000000000000e+00 236 1497 4.16666666666667e+00 237 237 5.00000000000000e-01 237 235 4.16666666666667e-02 237 641 4.16666666666667e-02 237 245 -4.16666666666667e-02 237 20 4.16666666666667e-02 237 236 -8.33333333333333e-02 237 19 4.16666666666667e-02 237 238 -8.33333333333333e-02 237 244 8.33333333333333e-02 237 18 -1.25000000000000e-01 237 243 -1.25000000000000e-01 237 239 -8.33333333333333e-02 237 110 4.16666666666667e-02 237 398 8.33333333333333e-02 237 109 4.16666666666667e-02 237 640 -8.33333333333333e-02 237 397 -4.16666666666667e-02 237 108 -1.25000000000000e-01 237 396 -1.25000000000000e-01 238 238 5.83333333333333e-01 238 234 4.16666666666667e-02 238 398 8.33333333333333e-02 238 239 -1.66666666666667e-01 238 245 8.33333333333333e-02 238 20 -4.16666666666667e-02 238 236 4.16666666666667e-02 238 19 -4.16666666666667e-02 238 244 -3.75000000000000e-01 238 18 4.16666666666667e-02 238 237 -8.33333333333333e-02 238 243 8.33333333333333e-02 238 110 -4.16666666666667e-02 238 641 4.16666666666667e-02 238 396 -4.16666666666667e-02 238 109 -4.16666666666667e-02 238 397 -1.25000000000000e-01 238 108 4.16666666666667e-02 238 639 -8.33333333333333e-02 239 239 5.83333333333333e-01 239 238 -1.66666666666667e-01 239 244 8.33333333333333e-02 239 639 4.16666666666667e-02 239 243 -4.16666666666667e-02 239 20 -4.16666666666667e-02 239 245 -1.25000000000000e-01 239 19 -4.16666666666667e-02 239 235 4.16666666666667e-02 239 18 4.16666666666667e-02 239 234 -8.33333333333333e-02 239 397 8.33333333333333e-02 239 110 -4.16666666666667e-02 239 398 -3.75000000000000e-01 239 109 -4.16666666666667e-02 239 640 4.16666666666667e-02 239 237 -8.33333333333333e-02 239 108 4.16666666666667e-02 239 396 8.33333333333333e-02 240 240 3.39166666666667e+01 240 235 2.12500000000000e+00 240 401 4.25000000000000e+00 240 400 -2.12500000000000e+00 240 399 -6.37500000000000e+00 240 19 2.12500000000000e+00 240 18 -4.20833333333333e+00 240 241 -4.25000000000000e+00 240 112 2.12500000000000e+00 240 236 2.12500000000000e+00 240 111 -4.20833333333333e+00 240 242 -1.66666666666667e-01 240 245 8.33333333333333e-02 240 113 -4.16666666666667e-02 240 647 4.16666666666667e-02 240 646 -8.33333333333333e-02 240 20 -4.16666666666667e-02 240 244 8.33333333333333e-02 240 243 -3.75000000000000e-01 240 1499 -4.16666666666667e+00 240 1502 2.08333333333333e+00 240 1498 -4.16666666666667e+00 240 1765 4.16666666666667e+00 240 1501 -4.16666666666667e+00 240 1862 4.16666666666667e+00 240 1766 -8.33333333333333e+00 240 1861 4.16666666666667e+00 240 1860 -1.87500000000000e+01 241 241 3.80000000000000e+01 241 20 2.12500000000000e+00 241 234 2.12500000000000e+00 241 401 4.25000000000000e+00 241 242 -4.25000000000000e+00 241 113 2.12500000000000e+00 241 400 -6.37500000000000e+00 241 399 -2.12500000000000e+00 241 19 -1.26250000000000e+01 241 18 2.12500000000000e+00 241 236 -4.25000000000000e+00 241 112 -1.26250000000000e+01 241 240 -4.25000000000000e+00 241 111 2.12500000000000e+00 241 647 4.16666666666667e-02 241 245 -4.16666666666667e-02 241 645 -8.33333333333333e-02 241 244 -1.25000000000000e-01 241 243 8.33333333333333e-02 241 1497 -4.16666666666667e+00 241 1764 4.16666666666667e+00 241 1502 2.08333333333333e+00 241 1499 -4.16666666666667e+00 241 1500 -4.16666666666667e+00 241 1862 -2.08333333333333e+00 241 1766 4.16666666666667e+00 241 1861 -6.25000000000000e+00 241 1860 4.16666666666667e+00 242 242 3.39166666666667e+01 242 235 -4.25000000000000e+00 242 19 2.12500000000000e+00 242 401 -1.91250000000000e+01 242 400 4.25000000000000e+00 242 241 -4.25000000000000e+00 242 112 2.12500000000000e+00 242 399 4.25000000000000e+00 242 20 -4.20833333333333e+00 242 234 2.12500000000000e+00 242 113 -4.20833333333333e+00 242 244 -4.16666666666667e-02 242 240 -1.66666666666667e-01 242 243 8.33333333333333e-02 242 111 -4.16666666666667e-02 242 645 4.16666666666667e-02 242 646 4.16666666666667e-02 242 245 -1.25000000000000e-01 242 18 -4.16666666666667e-02 242 1497 -4.16666666666667e+00 242 1500 2.08333333333333e+00 242 1501 2.08333333333333e+00 242 1498 -4.16666666666667e+00 242 1862 -6.25000000000000e+00 242 1861 -2.08333333333333e+00 242 1765 4.16666666666667e+00 242 1860 4.16666666666667e+00 242 1764 -8.33333333333333e+00 243 243 1.25000000000000e+00 243 401 -1.66666666666667e-01 243 400 8.33333333333333e-02 243 20 4.16666666666667e-02 243 241 8.33333333333333e-02 243 240 -3.75000000000000e-01 243 647 -4.16666666666667e-02 243 116 4.16666666666667e-02 243 646 8.33333333333333e-02 243 645 -1.25000000000000e-01 243 236 -8.33333333333333e-02 243 235 -8.33333333333333e-02 243 398 8.33333333333333e-02 243 239 -4.16666666666667e-02 243 244 -1.66666666666667e-01 243 397 8.33333333333333e-02 243 403 -8.33333333333333e-02 243 19 -8.33333333333333e-02 243 238 8.33333333333333e-02 243 237 -1.25000000000000e-01 243 245 -1.66666666666667e-01 243 641 8.33333333333333e-02 243 404 1.66666666666667e-01 243 640 8.33333333333333e-02 243 115 -8.33333333333333e-02 243 242 8.33333333333333e-02 243 639 -3.75000000000000e-01 243 402 -2.50000000000000e-01 244 244 1.25000000000000e+00 244 401 8.33333333333333e-02 244 399 8.33333333333333e-02 244 241 -1.25000000000000e-01 244 240 8.33333333333333e-02 244 647 8.33333333333333e-02 244 245 -1.66666666666667e-01 244 646 -3.75000000000000e-01 244 645 8.33333333333333e-02 244 234 -8.33333333333333e-02 244 239 8.33333333333333e-02 244 243 -1.66666666666667e-01 244 398 -1.66666666666667e-01 244 404 1.66666666666667e-01 244 396 8.33333333333333e-02 244 402 -8.33333333333333e-02 244 20 4.16666666666667e-02 244 236 -8.33333333333333e-02 244 238 -3.75000000000000e-01 244 18 -8.33333333333333e-02 244 237 8.33333333333333e-02 244 641 -4.16666666666667e-02 244 116 4.16666666666667e-02 244 242 -4.16666666666667e-02 244 640 -1.25000000000000e-01 244 403 -2.50000000000000e-01 244 639 8.33333333333333e-02 244 114 -8.33333333333333e-02 245 245 1.25000000000000e+00 245 400 8.33333333333333e-02 245 240 8.33333333333333e-02 245 399 -1.66666666666667e-01 245 242 -1.25000000000000e-01 245 18 4.16666666666667e-02 245 647 -1.25000000000000e-01 245 646 8.33333333333333e-02 245 244 -1.66666666666667e-01 245 645 -4.16666666666667e-02 245 114 4.16666666666667e-02 245 234 -8.33333333333333e-02 245 238 8.33333333333333e-02 245 396 8.33333333333333e-02 245 237 -4.16666666666667e-02 245 397 -1.66666666666667e-01 245 403 1.66666666666667e-01 245 239 -1.25000000000000e-01 245 19 4.16666666666667e-02 245 235 -8.33333333333333e-02 245 241 -4.16666666666667e-02 245 641 -1.25000000000000e-01 245 404 -7.50000000000000e-01 245 640 -4.16666666666667e-02 245 115 4.16666666666667e-02 245 243 -1.66666666666667e-01 245 639 8.33333333333333e-02 245 402 1.66666666666667e-01 246 246 1.25000000000000e+00 246 527 8.33333333333333e-02 246 526 -1.66666666666667e-01 246 251 8.33333333333333e-02 246 22 4.16666666666667e-02 246 249 -3.75000000000000e-01 246 410 8.33333333333333e-02 246 409 -4.16666666666667e-02 246 49 4.16666666666667e-02 246 408 -1.25000000000000e-01 246 422 -8.33333333333333e-02 246 248 -1.66666666666667e-01 246 253 -4.16666666666667e-02 246 260 -8.33333333333333e-02 246 644 8.33333333333333e-02 246 259 -8.33333333333333e-02 246 643 8.33333333333333e-02 246 254 8.33333333333333e-02 246 23 -8.33333333333333e-02 246 252 -1.25000000000000e-01 246 416 8.33333333333333e-02 246 50 -8.33333333333333e-02 246 415 8.33333333333333e-02 246 247 -1.66666666666667e-01 246 421 1.66666666666667e-01 246 414 -3.75000000000000e-01 246 250 8.33333333333333e-02 246 420 -2.50000000000000e-01 247 247 1.25000000000000e+00 247 527 8.33333333333333e-02 247 249 8.33333333333333e-02 247 525 -1.66666666666667e-01 247 250 -1.25000000000000e-01 247 21 4.16666666666667e-02 247 410 8.33333333333333e-02 247 248 -1.66666666666667e-01 247 409 -1.25000000000000e-01 247 408 -4.16666666666667e-02 247 48 4.16666666666667e-02 247 252 -4.16666666666667e-02 247 254 8.33333333333333e-02 247 422 1.66666666666667e-01 247 644 -1.66666666666667e-01 247 258 -8.33333333333333e-02 247 642 8.33333333333333e-02 247 23 4.16666666666667e-02 247 260 -8.33333333333333e-02 247 253 -1.25000000000000e-01 247 416 -4.16666666666667e-02 247 50 4.16666666666667e-02 247 415 -1.25000000000000e-01 247 251 -4.16666666666667e-02 247 421 -7.50000000000000e-01 247 414 8.33333333333333e-02 247 246 -1.66666666666667e-01 247 420 1.66666666666667e-01 248 248 1.25000000000000e+00 248 526 8.33333333333333e-02 248 525 8.33333333333333e-02 248 251 -1.25000000000000e-01 248 249 8.33333333333333e-02 248 410 -3.75000000000000e-01 248 409 8.33333333333333e-02 248 247 -1.66666666666667e-01 248 408 8.33333333333333e-02 248 420 -8.33333333333333e-02 248 246 -1.66666666666667e-01 248 253 8.33333333333333e-02 248 258 -8.33333333333333e-02 248 642 8.33333333333333e-02 248 421 1.66666666666667e-01 248 643 -1.66666666666667e-01 248 254 -3.75000000000000e-01 248 22 4.16666666666667e-02 248 259 -8.33333333333333e-02 248 252 8.33333333333333e-02 248 21 -8.33333333333333e-02 248 416 -1.25000000000000e-01 248 250 -4.16666666666667e-02 248 422 -2.50000000000000e-01 248 415 -4.16666666666667e-02 248 49 4.16666666666667e-02 248 414 8.33333333333333e-02 248 48 -8.33333333333333e-02 249 249 1.25000000000000e+00 249 263 -8.33333333333333e-02 249 256 4.16666666666667e-02 249 262 -8.33333333333333e-02 249 257 -8.33333333333333e-02 249 524 8.33333333333333e-02 249 523 8.33333333333333e-02 249 529 -1.66666666666667e-01 249 522 -3.75000000000000e-01 249 260 8.33333333333333e-02 249 527 -8.33333333333333e-02 249 250 -1.66666666666667e-01 249 526 1.66666666666667e-01 249 247 8.33333333333333e-02 249 68 8.33333333333333e-02 249 410 -8.33333333333333e-02 249 67 -4.16666666666667e-02 249 409 4.16666666666667e-02 249 66 -1.25000000000000e-01 249 525 -2.50000000000000e-01 249 251 -1.66666666666667e-01 249 23 8.33333333333333e-02 249 248 8.33333333333333e-02 249 22 -4.16666666666667e-02 249 259 8.33333333333333e-02 249 530 8.33333333333333e-02 249 21 -1.25000000000000e-01 249 246 -3.75000000000000e-01 250 250 1.25000000000000e+00 250 261 -8.33333333333333e-02 250 257 4.16666666666667e-02 250 263 -8.33333333333333e-02 250 524 -4.16666666666667e-02 250 530 8.33333333333333e-02 250 523 -1.25000000000000e-01 250 522 8.33333333333333e-02 250 528 -1.66666666666667e-01 250 410 4.16666666666667e-02 250 248 -4.16666666666667e-02 250 249 -1.66666666666667e-01 250 525 1.66666666666667e-01 250 246 8.33333333333333e-02 250 68 8.33333333333333e-02 250 251 -1.66666666666667e-01 250 527 1.66666666666667e-01 250 67 -1.25000000000000e-01 250 526 -7.50000000000000e-01 250 66 -4.16666666666667e-02 250 408 4.16666666666667e-02 250 23 8.33333333333333e-02 250 260 -1.66666666666667e-01 250 255 4.16666666666667e-02 250 22 -1.25000000000000e-01 250 247 -1.25000000000000e-01 250 21 -4.16666666666667e-02 250 258 8.33333333333333e-02 251 251 1.25000000000000e+00 251 261 -8.33333333333333e-02 251 256 4.16666666666667e-02 251 262 -8.33333333333333e-02 251 255 -8.33333333333333e-02 251 524 -1.25000000000000e-01 251 523 -4.16666666666667e-02 251 529 8.33333333333333e-02 251 522 8.33333333333333e-02 251 258 8.33333333333333e-02 251 525 -8.33333333333333e-02 251 409 4.16666666666667e-02 251 247 -4.16666666666667e-02 251 68 -3.75000000000000e-01 251 527 -2.50000000000000e-01 251 67 8.33333333333333e-02 251 250 -1.66666666666667e-01 251 526 1.66666666666667e-01 251 66 8.33333333333333e-02 251 408 -8.33333333333333e-02 251 528 8.33333333333333e-02 251 23 -3.75000000000000e-01 251 248 -1.25000000000000e-01 251 22 8.33333333333333e-02 251 259 -1.66666666666667e-01 251 249 -1.66666666666667e-01 251 21 8.33333333333333e-02 251 246 8.33333333333333e-02 252 252 5.00000000000000e-01 252 415 4.16666666666667e-02 252 260 4.16666666666667e-02 252 644 -4.16666666666667e-02 252 110 4.16666666666667e-02 252 416 -8.33333333333333e-02 252 109 4.16666666666667e-02 252 253 -8.33333333333333e-02 252 643 8.33333333333333e-02 252 108 -1.25000000000000e-01 252 642 -1.25000000000000e-01 252 254 -8.33333333333333e-02 252 23 4.16666666666667e-02 252 248 8.33333333333333e-02 252 22 4.16666666666667e-02 252 259 -8.33333333333333e-02 252 247 -4.16666666666667e-02 252 21 -1.25000000000000e-01 252 246 -1.25000000000000e-01 253 253 5.83333333333333e-01 253 414 4.16666666666667e-02 253 248 8.33333333333333e-02 253 254 -1.66666666666667e-01 253 644 8.33333333333333e-02 253 110 -4.16666666666667e-02 253 416 4.16666666666667e-02 253 109 -4.16666666666667e-02 253 643 -3.75000000000000e-01 253 108 4.16666666666667e-02 253 252 -8.33333333333333e-02 253 642 8.33333333333333e-02 253 23 -4.16666666666667e-02 253 260 4.16666666666667e-02 253 246 -4.16666666666667e-02 253 22 -4.16666666666667e-02 253 247 -1.25000000000000e-01 253 21 4.16666666666667e-02 253 258 -8.33333333333333e-02 254 254 5.83333333333333e-01 254 253 -1.66666666666667e-01 254 643 8.33333333333333e-02 254 258 4.16666666666667e-02 254 642 -4.16666666666667e-02 254 110 -4.16666666666667e-02 254 644 -1.25000000000000e-01 254 109 -4.16666666666667e-02 254 415 4.16666666666667e-02 254 108 4.16666666666667e-02 254 414 -8.33333333333333e-02 254 247 8.33333333333333e-02 254 23 -4.16666666666667e-02 254 248 -3.75000000000000e-01 254 22 -4.16666666666667e-02 254 259 4.16666666666667e-02 254 252 -8.33333333333333e-02 254 21 4.16666666666667e-02 254 246 8.33333333333333e-02 255 255 5.00000000000000e-01 255 250 4.16666666666667e-02 255 659 4.16666666666667e-02 255 263 -4.16666666666667e-02 255 23 4.16666666666667e-02 255 251 -8.33333333333333e-02 255 22 4.16666666666667e-02 255 256 -8.33333333333333e-02 255 262 8.33333333333333e-02 255 21 -1.25000000000000e-01 255 261 -1.25000000000000e-01 255 257 -8.33333333333333e-02 255 119 4.16666666666667e-02 255 524 8.33333333333333e-02 255 118 4.16666666666667e-02 255 658 -8.33333333333333e-02 255 523 -4.16666666666667e-02 255 117 -1.25000000000000e-01 255 522 -1.25000000000000e-01 256 256 5.83333333333333e-01 256 249 4.16666666666667e-02 256 524 8.33333333333333e-02 256 257 -1.66666666666667e-01 256 263 8.33333333333333e-02 256 23 -4.16666666666667e-02 256 251 4.16666666666667e-02 256 22 -4.16666666666667e-02 256 262 -3.75000000000000e-01 256 21 4.16666666666667e-02 256 255 -8.33333333333333e-02 256 261 8.33333333333333e-02 256 119 -4.16666666666667e-02 256 659 4.16666666666667e-02 256 522 -4.16666666666667e-02 256 118 -4.16666666666667e-02 256 523 -1.25000000000000e-01 256 117 4.16666666666667e-02 256 657 -8.33333333333333e-02 257 257 5.83333333333333e-01 257 256 -1.66666666666667e-01 257 262 8.33333333333333e-02 257 657 4.16666666666667e-02 257 261 -4.16666666666667e-02 257 23 -4.16666666666667e-02 257 263 -1.25000000000000e-01 257 22 -4.16666666666667e-02 257 250 4.16666666666667e-02 257 21 4.16666666666667e-02 257 249 -8.33333333333333e-02 257 523 8.33333333333333e-02 257 119 -4.16666666666667e-02 257 524 -3.75000000000000e-01 257 118 -4.16666666666667e-02 257 658 4.16666666666667e-02 257 255 -8.33333333333333e-02 257 117 4.16666666666667e-02 257 522 8.33333333333333e-02 258 258 1.25000000000000e+00 258 263 8.33333333333333e-02 258 122 -4.16666666666667e-02 258 665 4.16666666666667e-02 258 664 -8.33333333333333e-02 258 23 -4.16666666666667e-02 258 262 8.33333333333333e-02 258 261 -3.75000000000000e-01 258 251 8.33333333333333e-02 258 250 8.33333333333333e-02 258 527 1.66666666666667e-01 258 526 -8.33333333333333e-02 258 525 -2.50000000000000e-01 258 248 -8.33333333333333e-02 258 254 4.16666666666667e-02 258 247 -8.33333333333333e-02 258 421 8.33333333333333e-02 258 253 -8.33333333333333e-02 258 22 8.33333333333333e-02 258 21 -1.25000000000000e-01 258 644 8.33333333333333e-02 258 422 -1.66666666666667e-01 258 643 8.33333333333333e-02 258 259 -1.66666666666667e-01 258 121 8.33333333333333e-02 258 642 -3.75000000000000e-01 258 260 -1.66666666666667e-01 258 120 -1.25000000000000e-01 259 259 1.25000000000000e+00 259 263 -4.16666666666667e-02 259 663 -8.33333333333333e-02 259 262 -1.25000000000000e-01 259 261 8.33333333333333e-02 259 251 -1.66666666666667e-01 259 23 8.33333333333333e-02 259 249 8.33333333333333e-02 259 527 1.66666666666667e-01 259 260 -1.66666666666667e-01 259 122 8.33333333333333e-02 259 526 -2.50000000000000e-01 259 525 -8.33333333333333e-02 259 246 -8.33333333333333e-02 259 420 8.33333333333333e-02 259 254 4.16666666666667e-02 259 248 -8.33333333333333e-02 259 22 -3.75000000000000e-01 259 252 -8.33333333333333e-02 259 21 8.33333333333333e-02 259 644 -4.16666666666667e-02 259 422 8.33333333333333e-02 259 643 -1.25000000000000e-01 259 665 4.16666666666667e-02 259 121 -3.75000000000000e-01 259 642 8.33333333333333e-02 259 258 -1.66666666666667e-01 259 120 8.33333333333333e-02 260 260 1.25000000000000e+00 260 262 -4.16666666666667e-02 260 258 -1.66666666666667e-01 260 261 8.33333333333333e-02 260 120 -4.16666666666667e-02 260 663 4.16666666666667e-02 260 263 -1.25000000000000e-01 260 21 -4.16666666666667e-02 260 249 8.33333333333333e-02 260 250 -1.66666666666667e-01 260 22 8.33333333333333e-02 260 527 -7.50000000000000e-01 260 526 1.66666666666667e-01 260 259 -1.66666666666667e-01 260 121 8.33333333333333e-02 260 525 1.66666666666667e-01 260 246 -8.33333333333333e-02 260 252 4.16666666666667e-02 260 23 -1.25000000000000e-01 260 253 4.16666666666667e-02 260 247 -8.33333333333333e-02 260 644 -1.25000000000000e-01 260 664 4.16666666666667e-02 260 122 -1.25000000000000e-01 260 643 -4.16666666666667e-02 260 421 8.33333333333333e-02 260 642 8.33333333333333e-02 260 420 -1.66666666666667e-01 261 261 1.25000000000000e+00 261 527 -1.66666666666667e-01 261 526 8.33333333333333e-02 261 23 4.16666666666667e-02 261 259 8.33333333333333e-02 261 258 -3.75000000000000e-01 261 665 -4.16666666666667e-02 261 125 4.16666666666667e-02 261 664 8.33333333333333e-02 261 663 -1.25000000000000e-01 261 251 -8.33333333333333e-02 261 250 -8.33333333333333e-02 261 524 8.33333333333333e-02 261 257 -4.16666666666667e-02 261 262 -1.66666666666667e-01 261 523 8.33333333333333e-02 261 529 -8.33333333333333e-02 261 22 -8.33333333333333e-02 261 256 8.33333333333333e-02 261 255 -1.25000000000000e-01 261 263 -1.66666666666667e-01 261 659 8.33333333333333e-02 261 530 1.66666666666667e-01 261 658 8.33333333333333e-02 261 124 -8.33333333333333e-02 261 260 8.33333333333333e-02 261 657 -3.75000000000000e-01 261 528 -2.50000000000000e-01 262 262 1.25000000000000e+00 262 527 8.33333333333333e-02 262 525 8.33333333333333e-02 262 259 -1.25000000000000e-01 262 258 8.33333333333333e-02 262 665 8.33333333333333e-02 262 263 -1.66666666666667e-01 262 664 -3.75000000000000e-01 262 663 8.33333333333333e-02 262 249 -8.33333333333333e-02 262 257 8.33333333333333e-02 262 261 -1.66666666666667e-01 262 524 -1.66666666666667e-01 262 530 1.66666666666667e-01 262 522 8.33333333333333e-02 262 528 -8.33333333333333e-02 262 23 4.16666666666667e-02 262 251 -8.33333333333333e-02 262 256 -3.75000000000000e-01 262 21 -8.33333333333333e-02 262 255 8.33333333333333e-02 262 659 -4.16666666666667e-02 262 125 4.16666666666667e-02 262 260 -4.16666666666667e-02 262 658 -1.25000000000000e-01 262 529 -2.50000000000000e-01 262 657 8.33333333333333e-02 262 123 -8.33333333333333e-02 263 263 1.25000000000000e+00 263 526 8.33333333333333e-02 263 258 8.33333333333333e-02 263 525 -1.66666666666667e-01 263 260 -1.25000000000000e-01 263 21 4.16666666666667e-02 263 665 -1.25000000000000e-01 263 664 8.33333333333333e-02 263 262 -1.66666666666667e-01 263 663 -4.16666666666667e-02 263 123 4.16666666666667e-02 263 249 -8.33333333333333e-02 263 256 8.33333333333333e-02 263 522 8.33333333333333e-02 263 255 -4.16666666666667e-02 263 523 -1.66666666666667e-01 263 529 1.66666666666667e-01 263 257 -1.25000000000000e-01 263 22 4.16666666666667e-02 263 250 -8.33333333333333e-02 263 259 -4.16666666666667e-02 263 659 -1.25000000000000e-01 263 530 -7.50000000000000e-01 263 658 -4.16666666666667e-02 263 124 4.16666666666667e-02 263 261 -1.66666666666667e-01 263 657 8.33333333333333e-02 263 528 1.66666666666667e-01 264 264 1.25000000000000e+00 264 596 8.33333333333333e-02 264 595 -1.66666666666667e-01 264 269 8.33333333333333e-02 264 25 4.16666666666667e-02 264 267 -3.75000000000000e-01 264 536 8.33333333333333e-02 264 535 -4.16666666666667e-02 264 70 4.16666666666667e-02 264 534 -1.25000000000000e-01 264 548 -8.33333333333333e-02 264 266 -1.66666666666667e-01 264 271 -4.16666666666667e-02 264 275 -8.33333333333333e-02 264 662 8.33333333333333e-02 264 274 -8.33333333333333e-02 264 661 8.33333333333333e-02 264 272 8.33333333333333e-02 264 26 -8.33333333333333e-02 264 270 -1.25000000000000e-01 264 542 8.33333333333333e-02 264 71 -8.33333333333333e-02 264 541 8.33333333333333e-02 264 265 -1.66666666666667e-01 264 547 1.66666666666667e-01 264 540 -3.75000000000000e-01 264 268 8.33333333333333e-02 264 546 -2.50000000000000e-01 265 265 1.25000000000000e+00 265 596 8.33333333333333e-02 265 267 8.33333333333333e-02 265 594 -1.66666666666667e-01 265 268 -1.25000000000000e-01 265 24 4.16666666666667e-02 265 536 8.33333333333333e-02 265 266 -1.66666666666667e-01 265 535 -1.25000000000000e-01 265 534 -4.16666666666667e-02 265 69 4.16666666666667e-02 265 270 -4.16666666666667e-02 265 272 8.33333333333333e-02 265 548 1.66666666666667e-01 265 662 -1.66666666666667e-01 265 273 -8.33333333333333e-02 265 660 8.33333333333333e-02 265 26 4.16666666666667e-02 265 275 -8.33333333333333e-02 265 271 -1.25000000000000e-01 265 542 -4.16666666666667e-02 265 71 4.16666666666667e-02 265 541 -1.25000000000000e-01 265 269 -4.16666666666667e-02 265 547 -7.50000000000000e-01 265 540 8.33333333333333e-02 265 264 -1.66666666666667e-01 265 546 1.66666666666667e-01 266 266 1.25000000000000e+00 266 595 8.33333333333333e-02 266 594 8.33333333333333e-02 266 269 -1.25000000000000e-01 266 267 8.33333333333333e-02 266 536 -3.75000000000000e-01 266 535 8.33333333333333e-02 266 265 -1.66666666666667e-01 266 534 8.33333333333333e-02 266 546 -8.33333333333333e-02 266 264 -1.66666666666667e-01 266 271 8.33333333333333e-02 266 273 -8.33333333333333e-02 266 660 8.33333333333333e-02 266 547 1.66666666666667e-01 266 661 -1.66666666666667e-01 266 272 -3.75000000000000e-01 266 25 4.16666666666667e-02 266 274 -8.33333333333333e-02 266 270 8.33333333333333e-02 266 24 -8.33333333333333e-02 266 542 -1.25000000000000e-01 266 268 -4.16666666666667e-02 266 548 -2.50000000000000e-01 266 541 -4.16666666666667e-02 266 70 4.16666666666667e-02 266 540 8.33333333333333e-02 266 69 -8.33333333333333e-02 267 267 1.25000000000000e+00 267 275 8.33333333333333e-02 267 596 -8.33333333333333e-02 267 595 1.66666666666667e-01 267 594 -2.50000000000000e-01 267 26 8.33333333333333e-02 267 24 -1.25000000000000e-01 267 269 -1.66666666666667e-01 267 83 8.33333333333333e-02 267 274 8.33333333333333e-02 267 81 -1.25000000000000e-01 267 268 -1.66666666666667e-01 267 265 8.33333333333333e-02 267 536 -8.33333333333333e-02 267 82 -4.16666666666667e-02 267 535 4.16666666666667e-02 267 266 8.33333333333333e-02 267 25 -4.16666666666667e-02 267 264 -3.75000000000000e-01 267 1010 8.33333333333333e-02 267 872 -8.33333333333333e-02 267 868 4.16666666666667e-02 267 871 -8.33333333333333e-02 267 869 -8.33333333333333e-02 267 1007 8.33333333333333e-02 267 1006 8.33333333333333e-02 267 1009 -1.66666666666667e-01 267 1005 -3.75000000000000e-01 268 268 1.25000000000000e+00 268 275 -1.66666666666667e-01 268 26 8.33333333333333e-02 268 596 1.66666666666667e-01 268 269 -1.66666666666667e-01 268 83 8.33333333333333e-02 268 595 -7.50000000000000e-01 268 594 1.66666666666667e-01 268 25 -1.25000000000000e-01 268 273 8.33333333333333e-02 268 82 -1.25000000000000e-01 268 266 -4.16666666666667e-02 268 267 -1.66666666666667e-01 268 264 8.33333333333333e-02 268 81 -4.16666666666667e-02 268 534 4.16666666666667e-02 268 536 4.16666666666667e-02 268 265 -1.25000000000000e-01 268 24 -4.16666666666667e-02 268 867 4.16666666666667e-02 268 870 -8.33333333333333e-02 268 869 4.16666666666667e-02 268 872 -8.33333333333333e-02 268 1007 -4.16666666666667e-02 268 1010 8.33333333333333e-02 268 1006 -1.25000000000000e-01 268 1005 8.33333333333333e-02 268 1008 -1.66666666666667e-01 269 269 1.25000000000000e+00 269 25 8.33333333333333e-02 269 273 8.33333333333333e-02 269 596 -2.50000000000000e-01 269 595 1.66666666666667e-01 269 268 -1.66666666666667e-01 269 82 8.33333333333333e-02 269 594 -8.33333333333333e-02 269 26 -3.75000000000000e-01 269 24 8.33333333333333e-02 269 274 -1.66666666666667e-01 269 83 -3.75000000000000e-01 269 267 -1.66666666666667e-01 269 81 8.33333333333333e-02 269 535 4.16666666666667e-02 269 265 -4.16666666666667e-02 269 534 -8.33333333333333e-02 269 266 -1.25000000000000e-01 269 264 8.33333333333333e-02 269 1008 8.33333333333333e-02 269 870 -8.33333333333333e-02 269 868 4.16666666666667e-02 269 871 -8.33333333333333e-02 269 867 -8.33333333333333e-02 269 1007 -1.25000000000000e-01 269 1006 -4.16666666666667e-02 269 1009 8.33333333333333e-02 269 1005 8.33333333333333e-02 270 270 5.00000000000000e-01 270 541 4.16666666666667e-02 270 275 4.16666666666667e-02 270 662 -4.16666666666667e-02 270 119 4.16666666666667e-02 270 542 -8.33333333333333e-02 270 118 4.16666666666667e-02 270 271 -8.33333333333333e-02 270 661 8.33333333333333e-02 270 117 -1.25000000000000e-01 270 660 -1.25000000000000e-01 270 272 -8.33333333333333e-02 270 26 4.16666666666667e-02 270 266 8.33333333333333e-02 270 25 4.16666666666667e-02 270 274 -8.33333333333333e-02 270 265 -4.16666666666667e-02 270 24 -1.25000000000000e-01 270 264 -1.25000000000000e-01 271 271 5.83333333333333e-01 271 540 4.16666666666667e-02 271 266 8.33333333333333e-02 271 272 -1.66666666666667e-01 271 662 8.33333333333333e-02 271 119 -4.16666666666667e-02 271 542 4.16666666666667e-02 271 118 -4.16666666666667e-02 271 661 -3.75000000000000e-01 271 117 4.16666666666667e-02 271 270 -8.33333333333333e-02 271 660 8.33333333333333e-02 271 26 -4.16666666666667e-02 271 275 4.16666666666667e-02 271 264 -4.16666666666667e-02 271 25 -4.16666666666667e-02 271 265 -1.25000000000000e-01 271 24 4.16666666666667e-02 271 273 -8.33333333333333e-02 272 272 5.83333333333333e-01 272 271 -1.66666666666667e-01 272 661 8.33333333333333e-02 272 273 4.16666666666667e-02 272 660 -4.16666666666667e-02 272 119 -4.16666666666667e-02 272 662 -1.25000000000000e-01 272 118 -4.16666666666667e-02 272 541 4.16666666666667e-02 272 117 4.16666666666667e-02 272 540 -8.33333333333333e-02 272 265 8.33333333333333e-02 272 26 -4.16666666666667e-02 272 266 -3.75000000000000e-01 272 25 -4.16666666666667e-02 272 274 4.16666666666667e-02 272 270 -8.33333333333333e-02 272 24 4.16666666666667e-02 272 264 8.33333333333333e-02 273 273 1.25000000000000e+00 273 595 -8.33333333333333e-02 273 275 -1.66666666666667e-01 273 596 1.66666666666667e-01 273 128 -4.16666666666667e-02 273 127 8.33333333333333e-02 273 126 -1.25000000000000e-01 273 594 -2.50000000000000e-01 273 26 -4.16666666666667e-02 273 269 8.33333333333333e-02 273 274 -1.66666666666667e-01 273 25 8.33333333333333e-02 273 268 8.33333333333333e-02 273 24 -1.25000000000000e-01 273 266 -8.33333333333333e-02 273 272 4.16666666666667e-02 273 265 -8.33333333333333e-02 273 547 8.33333333333333e-02 273 271 -8.33333333333333e-02 273 662 8.33333333333333e-02 273 548 -1.66666666666667e-01 273 661 8.33333333333333e-02 273 660 -3.75000000000000e-01 273 872 8.33333333333333e-02 273 1247 4.16666666666667e-02 273 1246 -8.33333333333333e-02 273 871 8.33333333333333e-02 273 870 -3.75000000000000e-01 274 274 1.25000000000000e+00 274 594 -8.33333333333333e-02 274 128 8.33333333333333e-02 274 275 -1.66666666666667e-01 274 596 1.66666666666667e-01 274 127 -3.75000000000000e-01 274 595 -2.50000000000000e-01 274 126 8.33333333333333e-02 274 26 8.33333333333333e-02 274 269 -1.66666666666667e-01 274 267 8.33333333333333e-02 274 25 -3.75000000000000e-01 274 273 -1.66666666666667e-01 274 24 8.33333333333333e-02 274 264 -8.33333333333333e-02 274 546 8.33333333333333e-02 274 272 4.16666666666667e-02 274 266 -8.33333333333333e-02 274 270 -8.33333333333333e-02 274 662 -4.16666666666667e-02 274 548 8.33333333333333e-02 274 661 -1.25000000000000e-01 274 660 8.33333333333333e-02 274 1247 4.16666666666667e-02 274 872 -4.16666666666667e-02 274 1245 -8.33333333333333e-02 274 871 -1.25000000000000e-01 274 870 8.33333333333333e-02 275 275 1.25000000000000e+00 275 273 -1.66666666666667e-01 275 594 1.66666666666667e-01 275 128 -1.25000000000000e-01 275 596 -7.50000000000000e-01 275 127 8.33333333333333e-02 275 274 -1.66666666666667e-01 275 595 1.66666666666667e-01 275 126 -4.16666666666667e-02 275 26 -1.25000000000000e-01 275 25 8.33333333333333e-02 275 268 -1.66666666666667e-01 275 24 -4.16666666666667e-02 275 267 8.33333333333333e-02 275 264 -8.33333333333333e-02 275 270 4.16666666666667e-02 275 271 4.16666666666667e-02 275 265 -8.33333333333333e-02 275 662 -1.25000000000000e-01 275 661 -4.16666666666667e-02 275 547 8.33333333333333e-02 275 660 8.33333333333333e-02 275 546 -1.66666666666667e-01 275 871 -4.16666666666667e-02 275 870 8.33333333333333e-02 275 1245 4.16666666666667e-02 275 1246 4.16666666666667e-02 275 872 -1.25000000000000e-01 276 276 6.37500000000000e+01 276 427 -2.12500000000000e+00 276 53 2.12500000000000e+00 276 426 -6.37500000000000e+00 276 281 -2.12500000000000e+00 276 29 2.12500000000000e+00 276 277 -8.50000000000000e+00 276 280 4.25000000000000e+00 276 279 -6.37500000000000e+00 276 434 -2.12500000000000e+00 276 433 4.25000000000000e+00 276 52 2.12500000000000e+00 276 432 -6.37500000000000e+00 276 278 -8.50000000000000e+00 276 284 4.25000000000000e+00 276 283 -2.12500000000000e+00 276 28 2.12500000000000e+00 276 428 4.25000000000000e+00 276 282 -6.37500000000000e+00 276 613 -1.66666666666667e-01 276 440 1.66666666666667e-01 276 650 -1.66666666666667e-01 276 286 -8.33333333333333e-02 276 649 8.33333333333333e-02 276 287 -8.33333333333333e-02 276 439 1.66666666666667e-01 276 614 8.33333333333333e-02 276 438 -7.50000000000000e-01 276 1792 4.16666666666667e+00 276 1793 -8.33333333333333e+00 276 1787 -4.16666666666667e+00 276 1799 4.16666666666667e+00 276 1540 8.33333333333333e+00 276 1798 -8.33333333333333e+00 276 1786 -4.16666666666667e+00 276 1541 8.33333333333333e+00 276 1539 -3.75000000000000e+01 277 277 6.37500000000000e+01 277 426 -2.12500000000000e+00 277 428 4.25000000000000e+00 277 427 -6.37500000000000e+00 277 281 4.25000000000000e+00 277 280 -1.91250000000000e+01 277 276 -8.50000000000000e+00 277 279 4.25000000000000e+00 277 278 -8.50000000000000e+00 277 432 4.25000000000000e+00 277 53 -4.25000000000000e+00 277 434 4.25000000000000e+00 277 433 -1.91250000000000e+01 277 51 2.12500000000000e+00 277 284 4.25000000000000e+00 277 29 -4.25000000000000e+00 277 283 -6.37500000000000e+00 277 282 -2.12500000000000e+00 277 27 2.12500000000000e+00 277 614 8.33333333333333e-02 277 612 -1.66666666666667e-01 277 440 -8.33333333333333e-02 277 287 -8.33333333333333e-02 277 650 8.33333333333333e-02 277 285 -8.33333333333333e-02 277 648 8.33333333333333e-02 277 439 -2.50000000000000e-01 277 438 1.66666666666667e-01 277 1793 4.16666666666667e+00 277 1541 -4.16666666666667e+00 277 1787 -4.16666666666667e+00 277 1799 4.16666666666667e+00 277 1539 8.33333333333333e+00 277 1797 -8.33333333333333e+00 277 1785 -4.16666666666667e+00 277 1791 4.16666666666667e+00 277 1540 -1.25000000000000e+01 278 278 6.37500000000000e+01 278 428 -1.91250000000000e+01 278 427 4.25000000000000e+00 278 51 2.12500000000000e+00 278 281 -6.37500000000000e+00 278 280 4.25000000000000e+00 278 279 -2.12500000000000e+00 278 27 2.12500000000000e+00 278 277 -8.50000000000000e+00 278 432 -2.12500000000000e+00 278 434 -6.37500000000000e+00 278 52 -4.25000000000000e+00 278 433 4.25000000000000e+00 278 426 4.25000000000000e+00 278 284 -1.91250000000000e+01 278 283 4.25000000000000e+00 278 28 -4.25000000000000e+00 278 276 -8.50000000000000e+00 278 282 4.25000000000000e+00 278 613 8.33333333333333e-02 278 439 -8.33333333333333e-02 278 286 -8.33333333333333e-02 278 649 8.33333333333333e-02 278 438 1.66666666666667e-01 278 648 -1.66666666666667e-01 278 285 -8.33333333333333e-02 278 612 8.33333333333333e-02 278 440 -2.50000000000000e-01 278 1792 4.16666666666667e+00 278 1791 -8.33333333333333e+00 278 1540 -4.16666666666667e+00 278 1786 -4.16666666666667e+00 278 1798 4.16666666666667e+00 278 1785 -4.16666666666667e+00 278 1797 4.16666666666667e+00 278 1541 -1.25000000000000e+01 278 1539 8.33333333333333e+00 279 279 3.39166666666667e+01 279 92 2.12500000000000e+00 279 281 -4.25000000000000e+00 279 29 2.12500000000000e+00 279 427 2.12500000000000e+00 279 428 2.12500000000000e+00 279 90 -4.20833333333333e+00 279 278 -2.12500000000000e+00 279 277 4.25000000000000e+00 279 276 -6.37500000000000e+00 279 27 -4.20833333333333e+00 279 613 8.33333333333333e-02 279 280 -1.66666666666667e-01 279 287 -8.33333333333333e-02 279 28 -4.16666666666667e-02 279 286 4.16666666666667e-02 279 614 8.33333333333333e-02 279 91 -4.16666666666667e-02 279 612 -3.75000000000000e-01 279 1835 -4.16666666666667e+00 279 1544 4.16666666666667e+00 279 1543 4.16666666666667e+00 279 1542 -1.87500000000000e+01 279 1792 -4.16666666666667e+00 279 1793 -4.16666666666667e+00 279 1541 4.16666666666667e+00 279 1540 -8.33333333333333e+00 279 1834 2.08333333333333e+00 280 280 3.39166666666667e+01 280 426 2.12500000000000e+00 280 428 -4.25000000000000e+00 280 92 2.12500000000000e+00 280 91 -4.20833333333333e+00 280 278 4.25000000000000e+00 280 281 -4.25000000000000e+00 280 29 2.12500000000000e+00 280 277 -1.91250000000000e+01 280 28 -4.20833333333333e+00 280 276 4.25000000000000e+00 280 287 4.16666666666667e-02 280 612 8.33333333333333e-02 280 279 -1.66666666666667e-01 280 27 -4.16666666666667e-02 280 285 4.16666666666667e-02 280 614 -4.16666666666667e-02 280 613 -1.25000000000000e-01 280 90 -4.16666666666667e-02 280 1835 2.08333333333333e+00 280 1544 -2.08333333333333e+00 280 1543 -6.25000000000000e+00 280 1542 4.16666666666667e+00 280 1791 -4.16666666666667e+00 280 1793 -4.16666666666667e+00 280 1541 4.16666666666667e+00 280 1833 2.08333333333333e+00 280 1539 -8.33333333333333e+00 281 281 3.80000000000000e+01 281 90 2.12500000000000e+00 281 279 -4.25000000000000e+00 281 27 2.12500000000000e+00 281 92 -1.26250000000000e+01 281 427 -4.25000000000000e+00 281 91 2.12500000000000e+00 281 426 2.12500000000000e+00 281 278 -6.37500000000000e+00 281 29 -1.26250000000000e+01 281 277 4.25000000000000e+00 281 280 -4.25000000000000e+00 281 28 2.12500000000000e+00 281 276 -2.12500000000000e+00 281 286 4.16666666666667e-02 281 285 -8.33333333333333e-02 281 613 -4.16666666666667e-02 281 614 -1.25000000000000e-01 281 612 8.33333333333333e-02 281 1833 -4.16666666666667e+00 281 1544 -6.25000000000000e+00 281 1543 -2.08333333333333e+00 281 1542 4.16666666666667e+00 281 1792 -4.16666666666667e+00 281 1540 4.16666666666667e+00 281 1791 -4.16666666666667e+00 281 1834 2.08333333333333e+00 281 1539 4.16666666666667e+00 282 282 3.39166666666667e+01 282 433 2.12500000000000e+00 282 278 4.25000000000000e+00 282 277 -2.12500000000000e+00 282 276 -6.37500000000000e+00 282 112 2.12500000000000e+00 282 111 -4.20833333333333e+00 282 283 -4.25000000000000e+00 282 28 2.12500000000000e+00 282 434 2.12500000000000e+00 282 27 -4.20833333333333e+00 282 284 -1.66666666666667e-01 282 650 8.33333333333333e-02 282 29 -4.16666666666667e-02 282 287 4.16666666666667e-02 282 286 -8.33333333333333e-02 282 113 -4.16666666666667e-02 282 649 8.33333333333333e-02 282 648 -3.75000000000000e-01 282 1799 -4.16666666666667e+00 282 1871 2.08333333333333e+00 282 1798 -4.16666666666667e+00 282 1540 4.16666666666667e+00 282 1870 -4.16666666666667e+00 282 1547 4.16666666666667e+00 282 1541 -8.33333333333333e+00 282 1546 4.16666666666667e+00 282 1545 -1.87500000000000e+01 283 283 3.80000000000000e+01 283 113 2.12500000000000e+00 283 432 2.12500000000000e+00 283 278 4.25000000000000e+00 283 284 -4.25000000000000e+00 283 29 2.12500000000000e+00 283 277 -6.37500000000000e+00 283 276 -2.12500000000000e+00 283 112 -1.26250000000000e+01 283 111 2.12500000000000e+00 283 434 -4.25000000000000e+00 283 28 -1.26250000000000e+01 283 282 -4.25000000000000e+00 283 27 2.12500000000000e+00 283 287 4.16666666666667e-02 283 650 -4.16666666666667e-02 283 285 -8.33333333333333e-02 283 649 -1.25000000000000e-01 283 648 8.33333333333333e-02 283 1797 -4.16666666666667e+00 283 1539 4.16666666666667e+00 283 1871 2.08333333333333e+00 283 1799 -4.16666666666667e+00 283 1869 -4.16666666666667e+00 283 1547 -2.08333333333333e+00 283 1541 4.16666666666667e+00 283 1546 -6.25000000000000e+00 283 1545 4.16666666666667e+00 284 284 3.39166666666667e+01 284 433 -4.25000000000000e+00 284 112 2.12500000000000e+00 284 278 -1.91250000000000e+01 284 277 4.25000000000000e+00 284 283 -4.25000000000000e+00 284 28 2.12500000000000e+00 284 276 4.25000000000000e+00 284 113 -4.20833333333333e+00 284 432 2.12500000000000e+00 284 29 -4.20833333333333e+00 284 649 -4.16666666666667e-02 284 282 -1.66666666666667e-01 284 648 8.33333333333333e-02 284 27 -4.16666666666667e-02 284 285 4.16666666666667e-02 284 286 4.16666666666667e-02 284 650 -1.25000000000000e-01 284 111 -4.16666666666667e-02 284 1797 -4.16666666666667e+00 284 1869 2.08333333333333e+00 284 1870 2.08333333333333e+00 284 1798 -4.16666666666667e+00 284 1547 -6.25000000000000e+00 284 1546 -2.08333333333333e+00 284 1540 4.16666666666667e+00 284 1545 4.16666666666667e+00 284 1539 -8.33333333333333e+00 285 285 7.50000000000000e-01 285 281 -8.33333333333333e-02 285 280 4.16666666666667e-02 285 287 -8.33333333333333e-02 285 614 8.33333333333333e-02 285 131 4.16666666666667e-02 285 613 -4.16666666666667e-02 285 612 -1.25000000000000e-01 285 277 -8.33333333333333e-02 285 439 8.33333333333333e-02 285 284 4.16666666666667e-02 285 278 -8.33333333333333e-02 285 28 4.16666666666667e-02 285 283 -8.33333333333333e-02 285 27 -2.50000000000000e-01 285 650 -4.16666666666667e-02 285 440 8.33333333333333e-02 285 286 -8.33333333333333e-02 285 649 8.33333333333333e-02 285 130 4.16666666666667e-02 285 29 4.16666666666667e-02 285 648 -1.25000000000000e-01 285 129 -2.50000000000000e-01 286 286 6.66666666666667e-01 286 279 4.16666666666667e-02 286 614 8.33333333333333e-02 286 613 -1.25000000000000e-01 286 612 -4.16666666666667e-02 286 284 4.16666666666667e-02 286 278 -8.33333333333333e-02 286 276 -8.33333333333333e-02 286 438 8.33333333333333e-02 286 28 -8.33333333333333e-02 286 27 4.16666666666667e-02 286 282 -8.33333333333333e-02 286 650 8.33333333333333e-02 286 440 -1.66666666666667e-01 286 281 4.16666666666667e-02 286 649 -3.75000000000000e-01 286 130 -8.33333333333333e-02 286 285 -8.33333333333333e-02 286 648 8.33333333333333e-02 286 129 4.16666666666667e-02 287 287 6.66666666666667e-01 287 27 4.16666666666667e-02 287 279 -8.33333333333333e-02 287 614 -3.75000000000000e-01 287 613 8.33333333333333e-02 287 285 -8.33333333333333e-02 287 612 8.33333333333333e-02 287 129 4.16666666666667e-02 287 283 4.16666666666667e-02 287 277 -8.33333333333333e-02 287 29 -8.33333333333333e-02 287 282 4.16666666666667e-02 287 276 -8.33333333333333e-02 287 280 4.16666666666667e-02 287 650 -1.25000000000000e-01 287 131 -8.33333333333333e-02 287 649 8.33333333333333e-02 287 439 -1.66666666666667e-01 287 648 -4.16666666666667e-02 287 438 8.33333333333333e-02 288 288 2.50000000000000e+00 288 295 1.66666666666667e-01 288 294 -2.50000000000000e-01 288 446 -1.66666666666667e-01 288 445 8.33333333333333e-02 288 458 1.66666666666667e-01 288 307 8.33333333333333e-02 288 457 1.66666666666667e-01 288 456 -7.50000000000000e-01 288 308 8.33333333333333e-02 288 448 -8.33333333333333e-02 288 449 1.66666666666667e-01 288 290 -3.33333333333333e-01 288 56 -8.33333333333333e-02 288 447 -2.50000000000000e-01 288 299 8.33333333333333e-02 288 32 -8.33333333333333e-02 288 298 -1.66666666666667e-01 288 443 8.33333333333333e-02 288 292 1.66666666666667e-01 288 289 -3.33333333333333e-01 288 293 1.66666666666667e-01 288 31 -8.33333333333333e-02 288 291 -7.50000000000000e-01 288 442 8.33333333333333e-02 288 55 -8.33333333333333e-02 288 455 -8.33333333333333e-02 288 452 8.33333333333333e-02 288 304 8.33333333333333e-02 288 301 -8.33333333333333e-02 288 451 -1.66666666666667e-01 288 454 1.66666666666667e-01 288 453 -2.50000000000000e-01 288 302 1.66666666666667e-01 288 305 -1.66666666666667e-01 288 300 -2.50000000000000e-01 288 296 -8.33333333333333e-02 289 289 2.50000000000000e+00 289 294 1.66666666666667e-01 289 296 1.66666666666667e-01 289 295 -7.50000000000000e-01 289 444 8.33333333333333e-02 289 458 -8.33333333333333e-02 289 306 8.33333333333333e-02 289 457 -2.50000000000000e-01 289 456 1.66666666666667e-01 289 308 -1.66666666666667e-01 289 447 -8.33333333333333e-02 289 299 8.33333333333333e-02 289 449 1.66666666666667e-01 289 448 -2.50000000000000e-01 289 297 -1.66666666666667e-01 289 293 -8.33333333333333e-02 289 291 1.66666666666667e-01 289 288 -3.33333333333333e-01 289 292 -2.50000000000000e-01 289 30 -8.33333333333333e-02 289 443 -1.66666666666667e-01 289 441 8.33333333333333e-02 289 54 -8.33333333333333e-02 289 455 1.66666666666667e-01 289 290 -3.33333333333333e-01 289 302 1.66666666666667e-01 289 303 8.33333333333333e-02 289 300 -8.33333333333333e-02 289 452 8.33333333333333e-02 289 56 -8.33333333333333e-02 289 454 -7.50000000000000e-01 289 450 -1.66666666666667e-01 289 453 1.66666666666667e-01 289 305 8.33333333333333e-02 289 32 -8.33333333333333e-02 289 301 -2.50000000000000e-01 289 446 8.33333333333333e-02 290 290 2.50000000000000e+00 290 445 8.33333333333333e-02 290 296 -2.50000000000000e-01 290 295 1.66666666666667e-01 290 444 -1.66666666666667e-01 290 457 -8.33333333333333e-02 290 456 1.66666666666667e-01 290 458 -2.50000000000000e-01 290 307 -1.66666666666667e-01 290 306 8.33333333333333e-02 290 298 8.33333333333333e-02 290 447 1.66666666666667e-01 290 288 -3.33333333333333e-01 290 449 -7.50000000000000e-01 290 448 1.66666666666667e-01 290 54 -8.33333333333333e-02 290 297 8.33333333333333e-02 290 30 -8.33333333333333e-02 290 292 -8.33333333333333e-02 290 441 8.33333333333333e-02 290 293 -2.50000000000000e-01 290 291 1.66666666666667e-01 290 442 -1.66666666666667e-01 290 453 -8.33333333333333e-02 290 450 8.33333333333333e-02 290 454 1.66666666666667e-01 290 289 -3.33333333333333e-01 290 301 1.66666666666667e-01 290 455 -2.50000000000000e-01 290 451 8.33333333333333e-02 290 55 -8.33333333333333e-02 290 302 -7.50000000000000e-01 290 294 -8.33333333333333e-02 290 304 8.33333333333333e-02 290 31 -8.33333333333333e-02 290 300 1.66666666666667e-01 290 303 -1.66666666666667e-01 291 291 2.50000000000000e+00 291 631 -1.66666666666667e-01 291 566 1.66666666666667e-01 291 668 -1.66666666666667e-01 291 310 -8.33333333333333e-02 291 667 8.33333333333333e-02 291 311 -8.33333333333333e-02 291 565 1.66666666666667e-01 291 564 -7.50000000000000e-01 291 554 1.66666666666667e-01 291 448 8.33333333333333e-02 291 553 -8.33333333333333e-02 291 449 -1.66666666666667e-01 291 74 8.33333333333333e-02 291 552 -2.50000000000000e-01 291 299 -8.33333333333333e-02 291 32 8.33333333333333e-02 291 292 -3.33333333333333e-01 291 298 1.66666666666667e-01 291 297 -2.50000000000000e-01 291 560 -8.33333333333333e-02 291 559 1.66666666666667e-01 291 443 -8.33333333333333e-02 291 455 8.33333333333333e-02 291 289 1.66666666666667e-01 291 454 -1.66666666666667e-01 291 73 8.33333333333333e-02 291 442 -8.33333333333333e-02 291 558 -2.50000000000000e-01 291 293 -3.33333333333333e-01 291 305 1.66666666666667e-01 291 290 1.66666666666667e-01 291 304 -8.33333333333333e-02 291 31 8.33333333333333e-02 291 632 8.33333333333333e-02 291 303 -2.50000000000000e-01 291 288 -7.50000000000000e-01 292 292 2.50000000000000e+00 292 630 -1.66666666666667e-01 292 566 -8.33333333333333e-02 292 311 -8.33333333333333e-02 292 668 8.33333333333333e-02 292 309 -8.33333333333333e-02 292 666 8.33333333333333e-02 292 565 -2.50000000000000e-01 292 564 1.66666666666667e-01 292 447 8.33333333333333e-02 292 552 -8.33333333333333e-02 292 449 8.33333333333333e-02 292 554 1.66666666666667e-01 292 553 -2.50000000000000e-01 292 299 1.66666666666667e-01 292 298 -7.50000000000000e-01 292 291 -3.33333333333333e-01 292 297 1.66666666666667e-01 292 290 -8.33333333333333e-02 292 293 -3.33333333333333e-01 292 443 -8.33333333333333e-02 292 455 8.33333333333333e-02 292 558 1.66666666666667e-01 292 288 1.66666666666667e-01 292 453 -1.66666666666667e-01 292 74 -1.66666666666667e-01 292 560 1.66666666666667e-01 292 559 -7.50000000000000e-01 292 72 8.33333333333333e-02 292 441 -8.33333333333333e-02 292 305 1.66666666666667e-01 292 32 -1.66666666666667e-01 292 632 8.33333333333333e-02 292 304 -2.50000000000000e-01 292 289 -2.50000000000000e-01 292 303 -8.33333333333333e-02 292 30 8.33333333333333e-02 293 293 2.50000000000000e+00 293 631 8.33333333333333e-02 293 565 -8.33333333333333e-02 293 310 -8.33333333333333e-02 293 667 8.33333333333333e-02 293 564 1.66666666666667e-01 293 666 -1.66666666666667e-01 293 309 -8.33333333333333e-02 293 566 -2.50000000000000e-01 293 552 1.66666666666667e-01 293 448 8.33333333333333e-02 293 447 -1.66666666666667e-01 293 554 -7.50000000000000e-01 293 553 1.66666666666667e-01 293 72 8.33333333333333e-02 293 299 -2.50000000000000e-01 293 298 1.66666666666667e-01 293 297 -8.33333333333333e-02 293 30 8.33333333333333e-02 293 289 -8.33333333333333e-02 293 292 -3.33333333333333e-01 293 558 -8.33333333333333e-02 293 442 -8.33333333333333e-02 293 454 8.33333333333333e-02 293 441 -8.33333333333333e-02 293 453 8.33333333333333e-02 293 560 -2.50000000000000e-01 293 73 -1.66666666666667e-01 293 559 1.66666666666667e-01 293 630 8.33333333333333e-02 293 305 -7.50000000000000e-01 293 290 -2.50000000000000e-01 293 304 1.66666666666667e-01 293 31 -1.66666666666667e-01 293 291 -3.33333333333333e-01 293 303 1.66666666666667e-01 293 288 1.66666666666667e-01 294 294 1.25000000000000e+00 294 448 8.33333333333333e-02 294 449 8.33333333333333e-02 294 617 8.33333333333333e-02 294 615 -1.25000000000000e-01 294 299 8.33333333333333e-02 294 298 8.33333333333333e-02 294 295 -1.66666666666667e-01 294 297 -3.75000000000000e-01 294 290 -8.33333333333333e-02 294 296 -1.66666666666667e-01 294 446 -8.33333333333333e-02 294 458 8.33333333333333e-02 294 619 8.33333333333333e-02 294 289 1.66666666666667e-01 294 457 -1.66666666666667e-01 294 620 8.33333333333333e-02 294 95 -8.33333333333333e-02 294 94 4.16666666666667e-02 294 445 -8.33333333333333e-02 294 618 -3.75000000000000e-01 294 308 8.33333333333333e-02 294 32 -8.33333333333333e-02 294 307 -4.16666666666667e-02 294 31 4.16666666666667e-02 294 306 -1.25000000000000e-01 294 616 -4.16666666666667e-02 294 288 -2.50000000000000e-01 295 295 1.25000000000000e+00 295 615 -4.16666666666667e-02 295 447 8.33333333333333e-02 295 449 -1.66666666666667e-01 295 95 4.16666666666667e-02 295 616 -1.25000000000000e-01 295 299 -4.16666666666667e-02 295 32 4.16666666666667e-02 295 298 -1.25000000000000e-01 295 297 8.33333333333333e-02 295 294 -1.66666666666667e-01 295 620 -4.16666666666667e-02 295 618 8.33333333333333e-02 295 446 -8.33333333333333e-02 295 458 8.33333333333333e-02 295 288 1.66666666666667e-01 295 456 -1.66666666666667e-01 295 619 -1.25000000000000e-01 295 93 4.16666666666667e-02 295 444 -8.33333333333333e-02 295 308 8.33333333333333e-02 295 296 -1.66666666666667e-01 295 290 1.66666666666667e-01 295 307 -1.25000000000000e-01 295 617 8.33333333333333e-02 295 289 -7.50000000000000e-01 295 306 -4.16666666666667e-02 295 30 4.16666666666667e-02 296 296 1.25000000000000e+00 296 448 -1.66666666666667e-01 296 447 8.33333333333333e-02 296 617 -3.75000000000000e-01 296 94 4.16666666666667e-02 296 615 8.33333333333333e-02 296 299 -1.25000000000000e-01 296 298 -4.16666666666667e-02 296 31 4.16666666666667e-02 296 297 8.33333333333333e-02 296 288 -8.33333333333333e-02 296 619 -4.16666666666667e-02 296 294 -1.66666666666667e-01 296 444 -8.33333333333333e-02 296 456 8.33333333333333e-02 296 445 -8.33333333333333e-02 296 457 8.33333333333333e-02 296 620 -1.25000000000000e-01 296 618 8.33333333333333e-02 296 93 -8.33333333333333e-02 296 308 -3.75000000000000e-01 296 616 8.33333333333333e-02 296 290 -2.50000000000000e-01 296 307 8.33333333333333e-02 296 295 -1.66666666666667e-01 296 289 1.66666666666667e-01 296 306 8.33333333333333e-02 296 30 -8.33333333333333e-02 297 297 1.25000000000000e+00 297 298 -1.66666666666667e-01 297 311 -8.33333333333333e-02 297 31 -4.16666666666667e-02 297 310 4.16666666666667e-02 297 632 8.33333333333333e-02 297 100 -4.16666666666667e-02 297 630 -3.75000000000000e-01 297 616 4.16666666666667e-02 297 101 8.33333333333333e-02 297 617 -8.33333333333333e-02 297 299 -1.66666666666667e-01 297 296 8.33333333333333e-02 297 32 8.33333333333333e-02 297 295 8.33333333333333e-02 297 294 -3.75000000000000e-01 297 448 -8.33333333333333e-02 297 553 8.33333333333333e-02 297 554 8.33333333333333e-02 297 449 -8.33333333333333e-02 297 99 -1.25000000000000e-01 297 293 -8.33333333333333e-02 297 290 8.33333333333333e-02 297 292 1.66666666666667e-01 297 289 -1.66666666666667e-01 297 291 -2.50000000000000e-01 297 631 8.33333333333333e-02 297 30 -1.25000000000000e-01 298 298 1.25000000000000e+00 298 311 4.16666666666667e-02 298 630 8.33333333333333e-02 298 297 -1.66666666666667e-01 298 30 -4.16666666666667e-02 298 309 4.16666666666667e-02 298 631 -1.25000000000000e-01 298 99 -4.16666666666667e-02 298 615 4.16666666666667e-02 298 617 4.16666666666667e-02 298 296 -4.16666666666667e-02 298 295 -1.25000000000000e-01 298 294 8.33333333333333e-02 298 447 -8.33333333333333e-02 298 552 8.33333333333333e-02 298 449 -8.33333333333333e-02 298 290 8.33333333333333e-02 298 554 -1.66666666666667e-01 298 101 8.33333333333333e-02 298 100 -1.25000000000000e-01 298 293 1.66666666666667e-01 298 299 -1.66666666666667e-01 298 32 8.33333333333333e-02 298 292 -7.50000000000000e-01 298 632 -4.16666666666667e-02 298 31 -1.25000000000000e-01 298 291 1.66666666666667e-01 298 288 -1.66666666666667e-01 299 299 1.25000000000000e+00 299 310 4.16666666666667e-02 299 309 -8.33333333333333e-02 299 632 -1.25000000000000e-01 299 630 8.33333333333333e-02 299 616 4.16666666666667e-02 299 99 8.33333333333333e-02 299 615 -8.33333333333333e-02 299 296 -1.25000000000000e-01 299 295 -4.16666666666667e-02 299 297 -1.66666666666667e-01 299 294 8.33333333333333e-02 299 30 8.33333333333333e-02 299 448 -8.33333333333333e-02 299 289 8.33333333333333e-02 299 101 -3.75000000000000e-01 299 553 -1.66666666666667e-01 299 100 8.33333333333333e-02 299 552 8.33333333333333e-02 299 447 -8.33333333333333e-02 299 293 -2.50000000000000e-01 299 631 -4.16666666666667e-02 299 32 -3.75000000000000e-01 299 292 1.66666666666667e-01 299 298 -1.66666666666667e-01 299 31 8.33333333333333e-02 299 291 -8.33333333333333e-02 299 288 8.33333333333333e-02 300 300 1.25000000000000e+00 300 458 -1.66666666666667e-01 300 457 8.33333333333333e-02 300 116 4.16666666666667e-02 300 655 8.33333333333333e-02 300 654 -3.75000000000000e-01 300 308 -4.16666666666667e-02 300 32 4.16666666666667e-02 300 307 8.33333333333333e-02 300 306 -1.25000000000000e-01 300 452 -8.33333333333333e-02 300 451 -8.33333333333333e-02 300 455 8.33333333333333e-02 300 653 -4.16666666666667e-02 300 301 -1.66666666666667e-01 300 454 8.33333333333333e-02 300 289 -8.33333333333333e-02 300 115 -8.33333333333333e-02 300 652 8.33333333333333e-02 300 651 -1.25000000000000e-01 300 302 -1.66666666666667e-01 300 305 8.33333333333333e-02 300 290 1.66666666666667e-01 300 304 8.33333333333333e-02 300 31 -8.33333333333333e-02 300 656 8.33333333333333e-02 300 303 -3.75000000000000e-01 300 288 -2.50000000000000e-01 301 301 1.25000000000000e+00 301 458 8.33333333333333e-02 301 456 8.33333333333333e-02 301 655 -1.25000000000000e-01 301 654 8.33333333333333e-02 301 308 8.33333333333333e-02 301 302 -1.66666666666667e-01 301 307 -3.75000000000000e-01 301 306 8.33333333333333e-02 301 450 -8.33333333333333e-02 301 653 8.33333333333333e-02 301 300 -1.66666666666667e-01 301 455 -1.66666666666667e-01 301 290 1.66666666666667e-01 301 453 8.33333333333333e-02 301 288 -8.33333333333333e-02 301 116 4.16666666666667e-02 301 452 -8.33333333333333e-02 301 652 -3.75000000000000e-01 301 114 -8.33333333333333e-02 301 651 8.33333333333333e-02 301 305 -4.16666666666667e-02 301 32 4.16666666666667e-02 301 656 -4.16666666666667e-02 301 304 -1.25000000000000e-01 301 289 -2.50000000000000e-01 301 303 8.33333333333333e-02 301 30 -8.33333333333333e-02 302 302 1.25000000000000e+00 302 457 8.33333333333333e-02 302 654 8.33333333333333e-02 302 456 -1.66666666666667e-01 302 656 -1.25000000000000e-01 302 114 4.16666666666667e-02 302 308 -1.25000000000000e-01 302 307 8.33333333333333e-02 302 301 -1.66666666666667e-01 302 306 -4.16666666666667e-02 302 30 4.16666666666667e-02 302 450 -8.33333333333333e-02 302 652 8.33333333333333e-02 302 453 8.33333333333333e-02 302 651 -4.16666666666667e-02 302 454 -1.66666666666667e-01 302 289 1.66666666666667e-01 302 653 -1.25000000000000e-01 302 115 4.16666666666667e-02 302 451 -8.33333333333333e-02 302 655 -4.16666666666667e-02 302 305 -1.25000000000000e-01 302 290 -7.50000000000000e-01 302 304 -4.16666666666667e-02 302 31 4.16666666666667e-02 302 300 -1.66666666666667e-01 302 303 8.33333333333333e-02 302 288 1.66666666666667e-01 303 303 1.25000000000000e+00 303 668 8.33333333333333e-02 303 32 -4.16666666666667e-02 303 311 4.16666666666667e-02 303 310 -8.33333333333333e-02 303 122 -4.16666666666667e-02 303 667 8.33333333333333e-02 303 666 -3.75000000000000e-01 303 560 8.33333333333333e-02 303 559 8.33333333333333e-02 303 293 1.66666666666667e-01 303 292 -8.33333333333333e-02 303 291 -2.50000000000000e-01 303 455 -8.33333333333333e-02 303 653 4.16666666666667e-02 303 454 -8.33333333333333e-02 303 289 8.33333333333333e-02 303 652 -8.33333333333333e-02 303 121 8.33333333333333e-02 303 120 -1.25000000000000e-01 303 302 8.33333333333333e-02 303 290 -1.66666666666667e-01 303 301 8.33333333333333e-02 303 304 -1.66666666666667e-01 303 31 8.33333333333333e-02 303 300 -3.75000000000000e-01 303 305 -1.66666666666667e-01 303 30 -1.25000000000000e-01 304 304 1.25000000000000e+00 304 668 -4.16666666666667e-02 304 309 -8.33333333333333e-02 304 667 -1.25000000000000e-01 304 666 8.33333333333333e-02 304 560 -1.66666666666667e-01 304 122 8.33333333333333e-02 304 558 8.33333333333333e-02 304 293 1.66666666666667e-01 304 305 -1.66666666666667e-01 304 32 8.33333333333333e-02 304 292 -2.50000000000000e-01 304 291 -8.33333333333333e-02 304 453 -8.33333333333333e-02 304 288 8.33333333333333e-02 304 653 4.16666666666667e-02 304 455 -8.33333333333333e-02 304 121 -3.75000000000000e-01 304 651 -8.33333333333333e-02 304 120 8.33333333333333e-02 304 302 -4.16666666666667e-02 304 290 8.33333333333333e-02 304 301 -1.25000000000000e-01 304 311 4.16666666666667e-02 304 31 -3.75000000000000e-01 304 300 8.33333333333333e-02 304 303 -1.66666666666667e-01 304 30 8.33333333333333e-02 305 305 1.25000000000000e+00 305 667 -4.16666666666667e-02 305 303 -1.66666666666667e-01 305 666 8.33333333333333e-02 305 30 -4.16666666666667e-02 305 309 4.16666666666667e-02 305 668 -1.25000000000000e-01 305 120 -4.16666666666667e-02 305 558 8.33333333333333e-02 305 559 -1.66666666666667e-01 305 121 8.33333333333333e-02 305 293 -7.50000000000000e-01 305 292 1.66666666666667e-01 305 304 -1.66666666666667e-01 305 31 8.33333333333333e-02 305 291 1.66666666666667e-01 305 453 -8.33333333333333e-02 305 651 4.16666666666667e-02 305 122 -1.25000000000000e-01 305 652 4.16666666666667e-02 305 454 -8.33333333333333e-02 305 302 -1.25000000000000e-01 305 310 4.16666666666667e-02 305 32 -1.25000000000000e-01 305 301 -4.16666666666667e-02 305 289 8.33333333333333e-02 305 300 8.33333333333333e-02 305 288 -1.66666666666667e-01 306 306 7.50000000000000e-01 306 620 -8.33333333333333e-02 306 619 4.16666666666667e-02 306 308 -8.33333333333333e-02 306 296 8.33333333333333e-02 306 32 4.16666666666667e-02 306 295 -4.16666666666667e-02 306 294 -1.25000000000000e-01 306 457 -8.33333333333333e-02 306 289 8.33333333333333e-02 306 656 4.16666666666667e-02 306 458 -8.33333333333333e-02 306 130 4.16666666666667e-02 306 655 -8.33333333333333e-02 306 129 -2.50000000000000e-01 306 302 -4.16666666666667e-02 306 290 8.33333333333333e-02 306 307 -8.33333333333333e-02 306 301 8.33333333333333e-02 306 31 4.16666666666667e-02 306 131 4.16666666666667e-02 306 300 -1.25000000000000e-01 306 30 -2.50000000000000e-01 307 307 6.66666666666667e-01 307 618 4.16666666666667e-02 307 296 8.33333333333333e-02 307 295 -1.25000000000000e-01 307 294 -4.16666666666667e-02 307 656 4.16666666666667e-02 307 458 -8.33333333333333e-02 307 456 -8.33333333333333e-02 307 288 8.33333333333333e-02 307 130 -8.33333333333333e-02 307 129 4.16666666666667e-02 307 654 -8.33333333333333e-02 307 302 8.33333333333333e-02 307 290 -1.66666666666667e-01 307 620 4.16666666666667e-02 307 301 -3.75000000000000e-01 307 31 -8.33333333333333e-02 307 306 -8.33333333333333e-02 307 300 8.33333333333333e-02 307 30 4.16666666666667e-02 308 308 6.66666666666667e-01 308 129 4.16666666666667e-02 308 618 -8.33333333333333e-02 308 296 -3.75000000000000e-01 308 295 8.33333333333333e-02 308 306 -8.33333333333333e-02 308 294 8.33333333333333e-02 308 30 4.16666666666667e-02 308 655 4.16666666666667e-02 308 457 -8.33333333333333e-02 308 131 -8.33333333333333e-02 308 654 4.16666666666667e-02 308 456 -8.33333333333333e-02 308 619 4.16666666666667e-02 308 302 -1.25000000000000e-01 308 32 -8.33333333333333e-02 308 301 8.33333333333333e-02 308 289 -1.66666666666667e-01 308 300 -4.16666666666667e-02 308 288 8.33333333333333e-02 309 309 7.50000000000000e-01 309 299 -8.33333333333333e-02 309 298 4.16666666666667e-02 309 311 -8.33333333333333e-02 309 632 8.33333333333333e-02 309 134 4.16666666666667e-02 309 631 -4.16666666666667e-02 309 630 -1.25000000000000e-01 309 292 -8.33333333333333e-02 309 565 8.33333333333333e-02 309 305 4.16666666666667e-02 309 293 -8.33333333333333e-02 309 31 4.16666666666667e-02 309 304 -8.33333333333333e-02 309 30 -2.50000000000000e-01 309 668 -4.16666666666667e-02 309 566 8.33333333333333e-02 309 310 -8.33333333333333e-02 309 667 8.33333333333333e-02 309 133 4.16666666666667e-02 309 32 4.16666666666667e-02 309 666 -1.25000000000000e-01 309 132 -2.50000000000000e-01 310 310 6.66666666666667e-01 310 297 4.16666666666667e-02 310 632 8.33333333333333e-02 310 631 -1.25000000000000e-01 310 630 -4.16666666666667e-02 310 305 4.16666666666667e-02 310 293 -8.33333333333333e-02 310 291 -8.33333333333333e-02 310 564 8.33333333333333e-02 310 31 -8.33333333333333e-02 310 30 4.16666666666667e-02 310 303 -8.33333333333333e-02 310 668 8.33333333333333e-02 310 566 -1.66666666666667e-01 310 299 4.16666666666667e-02 310 667 -3.75000000000000e-01 310 133 -8.33333333333333e-02 310 309 -8.33333333333333e-02 310 666 8.33333333333333e-02 310 132 4.16666666666667e-02 311 311 6.66666666666667e-01 311 30 4.16666666666667e-02 311 297 -8.33333333333333e-02 311 632 -3.75000000000000e-01 311 631 8.33333333333333e-02 311 309 -8.33333333333333e-02 311 630 8.33333333333333e-02 311 132 4.16666666666667e-02 311 304 4.16666666666667e-02 311 292 -8.33333333333333e-02 311 32 -8.33333333333333e-02 311 303 4.16666666666667e-02 311 291 -8.33333333333333e-02 311 298 4.16666666666667e-02 311 668 -1.25000000000000e-01 311 134 -8.33333333333333e-02 311 667 8.33333333333333e-02 311 565 -1.66666666666667e-01 311 666 -4.16666666666667e-02 311 564 8.33333333333333e-02 312 312 2.50000000000000e+00 312 319 1.66666666666667e-01 312 318 -2.50000000000000e-01 312 572 -1.66666666666667e-01 312 571 8.33333333333333e-02 312 584 1.66666666666667e-01 312 331 8.33333333333333e-02 312 583 1.66666666666667e-01 312 582 -7.50000000000000e-01 312 332 8.33333333333333e-02 312 574 -8.33333333333333e-02 312 575 1.66666666666667e-01 312 314 -3.33333333333333e-01 312 77 -8.33333333333333e-02 312 573 -2.50000000000000e-01 312 323 8.33333333333333e-02 312 35 -8.33333333333333e-02 312 322 -1.66666666666667e-01 312 569 8.33333333333333e-02 312 316 1.66666666666667e-01 312 313 -3.33333333333333e-01 312 317 1.66666666666667e-01 312 34 -8.33333333333333e-02 312 315 -7.50000000000000e-01 312 568 8.33333333333333e-02 312 76 -8.33333333333333e-02 312 581 -8.33333333333333e-02 312 578 8.33333333333333e-02 312 328 8.33333333333333e-02 312 325 -8.33333333333333e-02 312 577 -1.66666666666667e-01 312 580 1.66666666666667e-01 312 579 -2.50000000000000e-01 312 326 1.66666666666667e-01 312 329 -1.66666666666667e-01 312 324 -2.50000000000000e-01 312 320 -8.33333333333333e-02 313 313 2.50000000000000e+00 313 318 1.66666666666667e-01 313 320 1.66666666666667e-01 313 319 -7.50000000000000e-01 313 570 8.33333333333333e-02 313 584 -8.33333333333333e-02 313 330 8.33333333333333e-02 313 583 -2.50000000000000e-01 313 582 1.66666666666667e-01 313 332 -1.66666666666667e-01 313 573 -8.33333333333333e-02 313 323 8.33333333333333e-02 313 575 1.66666666666667e-01 313 574 -2.50000000000000e-01 313 321 -1.66666666666667e-01 313 317 -8.33333333333333e-02 313 315 1.66666666666667e-01 313 312 -3.33333333333333e-01 313 316 -2.50000000000000e-01 313 33 -8.33333333333333e-02 313 569 -1.66666666666667e-01 313 567 8.33333333333333e-02 313 75 -8.33333333333333e-02 313 581 1.66666666666667e-01 313 314 -3.33333333333333e-01 313 326 1.66666666666667e-01 313 327 8.33333333333333e-02 313 324 -8.33333333333333e-02 313 578 8.33333333333333e-02 313 77 -8.33333333333333e-02 313 580 -7.50000000000000e-01 313 576 -1.66666666666667e-01 313 579 1.66666666666667e-01 313 329 8.33333333333333e-02 313 35 -8.33333333333333e-02 313 325 -2.50000000000000e-01 313 572 8.33333333333333e-02 314 314 2.50000000000000e+00 314 571 8.33333333333333e-02 314 320 -2.50000000000000e-01 314 319 1.66666666666667e-01 314 570 -1.66666666666667e-01 314 583 -8.33333333333333e-02 314 582 1.66666666666667e-01 314 584 -2.50000000000000e-01 314 331 -1.66666666666667e-01 314 330 8.33333333333333e-02 314 322 8.33333333333333e-02 314 573 1.66666666666667e-01 314 312 -3.33333333333333e-01 314 575 -7.50000000000000e-01 314 574 1.66666666666667e-01 314 75 -8.33333333333333e-02 314 321 8.33333333333333e-02 314 33 -8.33333333333333e-02 314 316 -8.33333333333333e-02 314 567 8.33333333333333e-02 314 317 -2.50000000000000e-01 314 315 1.66666666666667e-01 314 568 -1.66666666666667e-01 314 579 -8.33333333333333e-02 314 576 8.33333333333333e-02 314 580 1.66666666666667e-01 314 313 -3.33333333333333e-01 314 325 1.66666666666667e-01 314 581 -2.50000000000000e-01 314 577 8.33333333333333e-02 314 76 -8.33333333333333e-02 314 326 -7.50000000000000e-01 314 318 -8.33333333333333e-02 314 328 8.33333333333333e-02 314 34 -8.33333333333333e-02 314 324 1.66666666666667e-01 314 327 -1.66666666666667e-01 315 315 2.50000000000000e+00 315 323 -8.33333333333333e-02 315 322 1.66666666666667e-01 315 34 8.33333333333333e-02 315 321 -2.50000000000000e-01 315 317 -3.33333333333333e-01 315 599 1.66666666666667e-01 315 598 -8.33333333333333e-02 315 85 8.33333333333333e-02 315 597 -2.50000000000000e-01 315 328 -8.33333333333333e-02 315 329 1.66666666666667e-01 315 35 8.33333333333333e-02 315 327 -2.50000000000000e-01 315 602 -8.33333333333333e-02 315 86 8.33333333333333e-02 315 316 -3.33333333333333e-01 315 601 1.66666666666667e-01 315 600 -2.50000000000000e-01 315 574 8.33333333333333e-02 315 575 -1.66666666666667e-01 315 569 -8.33333333333333e-02 315 581 8.33333333333333e-02 315 313 1.66666666666667e-01 315 580 -1.66666666666667e-01 315 568 -8.33333333333333e-02 315 314 1.66666666666667e-01 315 312 -7.50000000000000e-01 315 1213 -1.66666666666667e-01 315 1040 1.66666666666667e-01 315 1250 -1.66666666666667e-01 315 904 -8.33333333333333e-02 315 1249 8.33333333333333e-02 315 905 -8.33333333333333e-02 315 1039 1.66666666666667e-01 315 1214 8.33333333333333e-02 315 1038 -7.50000000000000e-01 316 316 2.50000000000000e+00 316 323 1.66666666666667e-01 316 322 -7.50000000000000e-01 316 33 8.33333333333333e-02 316 599 1.66666666666667e-01 316 598 -2.50000000000000e-01 316 597 -8.33333333333333e-02 316 84 8.33333333333333e-02 316 317 -3.33333333333333e-01 316 327 -8.33333333333333e-02 316 35 -1.66666666666667e-01 316 329 1.66666666666667e-01 316 328 -2.50000000000000e-01 316 602 1.66666666666667e-01 316 86 -1.66666666666667e-01 316 321 1.66666666666667e-01 316 601 -7.50000000000000e-01 316 315 -3.33333333333333e-01 316 600 1.66666666666667e-01 316 575 8.33333333333333e-02 316 314 -8.33333333333333e-02 316 569 -8.33333333333333e-02 316 581 8.33333333333333e-02 316 312 1.66666666666667e-01 316 579 -1.66666666666667e-01 316 567 -8.33333333333333e-02 316 573 8.33333333333333e-02 316 313 -2.50000000000000e-01 316 1214 8.33333333333333e-02 316 1212 -1.66666666666667e-01 316 1040 -8.33333333333333e-02 316 905 -8.33333333333333e-02 316 1250 8.33333333333333e-02 316 903 -8.33333333333333e-02 316 1248 8.33333333333333e-02 316 1039 -2.50000000000000e-01 316 1038 1.66666666666667e-01 317 317 2.50000000000000e+00 317 321 -8.33333333333333e-02 317 323 -2.50000000000000e-01 317 322 1.66666666666667e-01 317 599 -7.50000000000000e-01 317 598 1.66666666666667e-01 317 315 -3.33333333333333e-01 317 597 1.66666666666667e-01 317 316 -3.33333333333333e-01 317 327 1.66666666666667e-01 317 329 -7.50000000000000e-01 317 34 -1.66666666666667e-01 317 328 1.66666666666667e-01 317 33 8.33333333333333e-02 317 602 -2.50000000000000e-01 317 601 1.66666666666667e-01 317 85 -1.66666666666667e-01 317 600 -8.33333333333333e-02 317 84 8.33333333333333e-02 317 574 8.33333333333333e-02 317 573 -1.66666666666667e-01 317 313 -8.33333333333333e-02 317 568 -8.33333333333333e-02 317 580 8.33333333333333e-02 317 567 -8.33333333333333e-02 317 579 8.33333333333333e-02 317 314 -2.50000000000000e-01 317 312 1.66666666666667e-01 317 1213 8.33333333333333e-02 317 1039 -8.33333333333333e-02 317 904 -8.33333333333333e-02 317 1249 8.33333333333333e-02 317 1038 1.66666666666667e-01 317 1248 -1.66666666666667e-01 317 903 -8.33333333333333e-02 317 1212 8.33333333333333e-02 317 1040 -2.50000000000000e-01 318 318 1.25000000000000e+00 318 574 8.33333333333333e-02 318 575 8.33333333333333e-02 318 635 8.33333333333333e-02 318 633 -1.25000000000000e-01 318 323 8.33333333333333e-02 318 322 8.33333333333333e-02 318 319 -1.66666666666667e-01 318 321 -3.75000000000000e-01 318 314 -8.33333333333333e-02 318 320 -1.66666666666667e-01 318 572 -8.33333333333333e-02 318 584 8.33333333333333e-02 318 637 8.33333333333333e-02 318 313 1.66666666666667e-01 318 583 -1.66666666666667e-01 318 638 8.33333333333333e-02 318 104 -8.33333333333333e-02 318 103 4.16666666666667e-02 318 571 -8.33333333333333e-02 318 636 -3.75000000000000e-01 318 332 8.33333333333333e-02 318 35 -8.33333333333333e-02 318 331 -4.16666666666667e-02 318 34 4.16666666666667e-02 318 330 -1.25000000000000e-01 318 634 -4.16666666666667e-02 318 312 -2.50000000000000e-01 319 319 1.25000000000000e+00 319 633 -4.16666666666667e-02 319 573 8.33333333333333e-02 319 575 -1.66666666666667e-01 319 104 4.16666666666667e-02 319 634 -1.25000000000000e-01 319 323 -4.16666666666667e-02 319 35 4.16666666666667e-02 319 322 -1.25000000000000e-01 319 321 8.33333333333333e-02 319 318 -1.66666666666667e-01 319 638 -4.16666666666667e-02 319 636 8.33333333333333e-02 319 572 -8.33333333333333e-02 319 584 8.33333333333333e-02 319 312 1.66666666666667e-01 319 582 -1.66666666666667e-01 319 637 -1.25000000000000e-01 319 102 4.16666666666667e-02 319 570 -8.33333333333333e-02 319 332 8.33333333333333e-02 319 320 -1.66666666666667e-01 319 314 1.66666666666667e-01 319 331 -1.25000000000000e-01 319 635 8.33333333333333e-02 319 313 -7.50000000000000e-01 319 330 -4.16666666666667e-02 319 33 4.16666666666667e-02 320 320 1.25000000000000e+00 320 574 -1.66666666666667e-01 320 573 8.33333333333333e-02 320 635 -3.75000000000000e-01 320 103 4.16666666666667e-02 320 633 8.33333333333333e-02 320 323 -1.25000000000000e-01 320 322 -4.16666666666667e-02 320 34 4.16666666666667e-02 320 321 8.33333333333333e-02 320 312 -8.33333333333333e-02 320 637 -4.16666666666667e-02 320 318 -1.66666666666667e-01 320 570 -8.33333333333333e-02 320 582 8.33333333333333e-02 320 571 -8.33333333333333e-02 320 583 8.33333333333333e-02 320 638 -1.25000000000000e-01 320 636 8.33333333333333e-02 320 102 -8.33333333333333e-02 320 332 -3.75000000000000e-01 320 634 8.33333333333333e-02 320 314 -2.50000000000000e-01 320 331 8.33333333333333e-02 320 319 -1.66666666666667e-01 320 313 1.66666666666667e-01 320 330 8.33333333333333e-02 320 33 -8.33333333333333e-02 321 321 1.25000000000000e+00 321 317 -8.33333333333333e-02 321 322 -1.66666666666667e-01 321 316 1.66666666666667e-01 321 35 8.33333333333333e-02 321 34 -4.16666666666667e-02 321 33 -1.25000000000000e-01 321 315 -2.50000000000000e-01 321 323 -1.66666666666667e-01 321 107 8.33333333333333e-02 321 106 -4.16666666666667e-02 321 598 8.33333333333333e-02 321 599 8.33333333333333e-02 321 105 -1.25000000000000e-01 321 635 -8.33333333333333e-02 321 320 8.33333333333333e-02 321 319 8.33333333333333e-02 321 318 -3.75000000000000e-01 321 574 -8.33333333333333e-02 321 575 -8.33333333333333e-02 321 314 8.33333333333333e-02 321 313 -1.66666666666667e-01 321 634 4.16666666666667e-02 321 1213 8.33333333333333e-02 321 905 -8.33333333333333e-02 321 904 4.16666666666667e-02 321 1214 8.33333333333333e-02 321 1212 -3.75000000000000e-01 322 322 1.25000000000000e+00 322 321 -1.66666666666667e-01 322 315 1.66666666666667e-01 322 35 8.33333333333333e-02 322 323 -1.66666666666667e-01 322 317 1.66666666666667e-01 322 34 -1.25000000000000e-01 322 316 -7.50000000000000e-01 322 33 -4.16666666666667e-02 322 107 8.33333333333333e-02 322 599 -1.66666666666667e-01 322 106 -1.25000000000000e-01 322 105 -4.16666666666667e-02 322 597 8.33333333333333e-02 322 635 4.16666666666667e-02 322 320 -4.16666666666667e-02 322 319 -1.25000000000000e-01 322 318 8.33333333333333e-02 322 573 -8.33333333333333e-02 322 575 -8.33333333333333e-02 322 314 8.33333333333333e-02 322 633 4.16666666666667e-02 322 312 -1.66666666666667e-01 322 905 4.16666666666667e-02 322 1212 8.33333333333333e-02 322 903 4.16666666666667e-02 322 1214 -4.16666666666667e-02 322 1213 -1.25000000000000e-01 323 323 1.25000000000000e+00 323 597 8.33333333333333e-02 323 315 -8.33333333333333e-02 323 35 -3.75000000000000e-01 323 317 -2.50000000000000e-01 323 34 8.33333333333333e-02 323 322 -1.66666666666667e-01 323 316 1.66666666666667e-01 323 33 8.33333333333333e-02 323 107 -3.75000000000000e-01 323 106 8.33333333333333e-02 323 598 -1.66666666666667e-01 323 321 -1.66666666666667e-01 323 105 8.33333333333333e-02 323 633 -8.33333333333333e-02 323 320 -1.25000000000000e-01 323 319 -4.16666666666667e-02 323 318 8.33333333333333e-02 323 574 -8.33333333333333e-02 323 313 8.33333333333333e-02 323 573 -8.33333333333333e-02 323 634 4.16666666666667e-02 323 312 8.33333333333333e-02 323 904 4.16666666666667e-02 323 903 -8.33333333333333e-02 323 1213 -4.16666666666667e-02 323 1214 -1.25000000000000e-01 323 1212 8.33333333333333e-02 324 324 1.25000000000000e+00 324 584 -1.66666666666667e-01 324 583 8.33333333333333e-02 324 125 4.16666666666667e-02 324 673 8.33333333333333e-02 324 672 -3.75000000000000e-01 324 332 -4.16666666666667e-02 324 35 4.16666666666667e-02 324 331 8.33333333333333e-02 324 330 -1.25000000000000e-01 324 578 -8.33333333333333e-02 324 577 -8.33333333333333e-02 324 581 8.33333333333333e-02 324 671 -4.16666666666667e-02 324 325 -1.66666666666667e-01 324 580 8.33333333333333e-02 324 313 -8.33333333333333e-02 324 124 -8.33333333333333e-02 324 670 8.33333333333333e-02 324 669 -1.25000000000000e-01 324 326 -1.66666666666667e-01 324 329 8.33333333333333e-02 324 314 1.66666666666667e-01 324 328 8.33333333333333e-02 324 34 -8.33333333333333e-02 324 674 8.33333333333333e-02 324 327 -3.75000000000000e-01 324 312 -2.50000000000000e-01 325 325 1.25000000000000e+00 325 584 8.33333333333333e-02 325 582 8.33333333333333e-02 325 673 -1.25000000000000e-01 325 672 8.33333333333333e-02 325 332 8.33333333333333e-02 325 326 -1.66666666666667e-01 325 331 -3.75000000000000e-01 325 330 8.33333333333333e-02 325 576 -8.33333333333333e-02 325 671 8.33333333333333e-02 325 324 -1.66666666666667e-01 325 581 -1.66666666666667e-01 325 314 1.66666666666667e-01 325 579 8.33333333333333e-02 325 312 -8.33333333333333e-02 325 125 4.16666666666667e-02 325 578 -8.33333333333333e-02 325 670 -3.75000000000000e-01 325 123 -8.33333333333333e-02 325 669 8.33333333333333e-02 325 329 -4.16666666666667e-02 325 35 4.16666666666667e-02 325 674 -4.16666666666667e-02 325 328 -1.25000000000000e-01 325 313 -2.50000000000000e-01 325 327 8.33333333333333e-02 325 33 -8.33333333333333e-02 326 326 1.25000000000000e+00 326 583 8.33333333333333e-02 326 672 8.33333333333333e-02 326 582 -1.66666666666667e-01 326 674 -1.25000000000000e-01 326 123 4.16666666666667e-02 326 332 -1.25000000000000e-01 326 331 8.33333333333333e-02 326 325 -1.66666666666667e-01 326 330 -4.16666666666667e-02 326 33 4.16666666666667e-02 326 576 -8.33333333333333e-02 326 670 8.33333333333333e-02 326 579 8.33333333333333e-02 326 669 -4.16666666666667e-02 326 580 -1.66666666666667e-01 326 313 1.66666666666667e-01 326 671 -1.25000000000000e-01 326 124 4.16666666666667e-02 326 577 -8.33333333333333e-02 326 673 -4.16666666666667e-02 326 329 -1.25000000000000e-01 326 314 -7.50000000000000e-01 326 328 -4.16666666666667e-02 326 34 4.16666666666667e-02 326 324 -1.66666666666667e-01 326 327 8.33333333333333e-02 326 312 1.66666666666667e-01 327 327 1.25000000000000e+00 327 316 -8.33333333333333e-02 327 329 -1.66666666666667e-01 327 317 1.66666666666667e-01 327 35 -4.16666666666667e-02 327 34 8.33333333333333e-02 327 33 -1.25000000000000e-01 327 315 -2.50000000000000e-01 327 128 -4.16666666666667e-02 327 602 8.33333333333333e-02 327 328 -1.66666666666667e-01 327 127 8.33333333333333e-02 327 601 8.33333333333333e-02 327 126 -1.25000000000000e-01 327 581 -8.33333333333333e-02 327 671 4.16666666666667e-02 327 580 -8.33333333333333e-02 327 313 8.33333333333333e-02 327 670 -8.33333333333333e-02 327 326 8.33333333333333e-02 327 314 -1.66666666666667e-01 327 325 8.33333333333333e-02 327 324 -3.75000000000000e-01 327 1250 8.33333333333333e-02 327 905 4.16666666666667e-02 327 904 -8.33333333333333e-02 327 1249 8.33333333333333e-02 327 1248 -3.75000000000000e-01 328 328 1.25000000000000e+00 328 315 -8.33333333333333e-02 328 35 8.33333333333333e-02 328 329 -1.66666666666667e-01 328 317 1.66666666666667e-01 328 34 -3.75000000000000e-01 328 316 -2.50000000000000e-01 328 33 8.33333333333333e-02 328 128 8.33333333333333e-02 328 602 -1.66666666666667e-01 328 600 8.33333333333333e-02 328 127 -3.75000000000000e-01 328 327 -1.66666666666667e-01 328 126 8.33333333333333e-02 328 579 -8.33333333333333e-02 328 312 8.33333333333333e-02 328 671 4.16666666666667e-02 328 581 -8.33333333333333e-02 328 669 -8.33333333333333e-02 328 326 -4.16666666666667e-02 328 314 8.33333333333333e-02 328 325 -1.25000000000000e-01 328 324 8.33333333333333e-02 328 905 4.16666666666667e-02 328 1250 -4.16666666666667e-02 328 903 -8.33333333333333e-02 328 1249 -1.25000000000000e-01 328 1248 8.33333333333333e-02 329 329 1.25000000000000e+00 329 327 -1.66666666666667e-01 329 315 1.66666666666667e-01 329 35 -1.25000000000000e-01 329 317 -7.50000000000000e-01 329 34 8.33333333333333e-02 329 328 -1.66666666666667e-01 329 316 1.66666666666667e-01 329 33 -4.16666666666667e-02 329 128 -1.25000000000000e-01 329 127 8.33333333333333e-02 329 601 -1.66666666666667e-01 329 126 -4.16666666666667e-02 329 600 8.33333333333333e-02 329 579 -8.33333333333333e-02 329 669 4.16666666666667e-02 329 670 4.16666666666667e-02 329 580 -8.33333333333333e-02 329 326 -1.25000000000000e-01 329 325 -4.16666666666667e-02 329 313 8.33333333333333e-02 329 324 8.33333333333333e-02 329 312 -1.66666666666667e-01 329 1249 -4.16666666666667e-02 329 1248 8.33333333333333e-02 329 903 4.16666666666667e-02 329 904 4.16666666666667e-02 329 1250 -1.25000000000000e-01 330 330 7.50000000000000e-01 330 638 -8.33333333333333e-02 330 637 4.16666666666667e-02 330 332 -8.33333333333333e-02 330 320 8.33333333333333e-02 330 35 4.16666666666667e-02 330 319 -4.16666666666667e-02 330 318 -1.25000000000000e-01 330 583 -8.33333333333333e-02 330 313 8.33333333333333e-02 330 674 4.16666666666667e-02 330 584 -8.33333333333333e-02 330 133 4.16666666666667e-02 330 673 -8.33333333333333e-02 330 132 -2.50000000000000e-01 330 326 -4.16666666666667e-02 330 314 8.33333333333333e-02 330 331 -8.33333333333333e-02 330 325 8.33333333333333e-02 330 34 4.16666666666667e-02 330 134 4.16666666666667e-02 330 324 -1.25000000000000e-01 330 33 -2.50000000000000e-01 331 331 6.66666666666667e-01 331 636 4.16666666666667e-02 331 320 8.33333333333333e-02 331 319 -1.25000000000000e-01 331 318 -4.16666666666667e-02 331 674 4.16666666666667e-02 331 584 -8.33333333333333e-02 331 582 -8.33333333333333e-02 331 312 8.33333333333333e-02 331 133 -8.33333333333333e-02 331 132 4.16666666666667e-02 331 672 -8.33333333333333e-02 331 326 8.33333333333333e-02 331 314 -1.66666666666667e-01 331 638 4.16666666666667e-02 331 325 -3.75000000000000e-01 331 34 -8.33333333333333e-02 331 330 -8.33333333333333e-02 331 324 8.33333333333333e-02 331 33 4.16666666666667e-02 332 332 6.66666666666667e-01 332 132 4.16666666666667e-02 332 636 -8.33333333333333e-02 332 320 -3.75000000000000e-01 332 319 8.33333333333333e-02 332 330 -8.33333333333333e-02 332 318 8.33333333333333e-02 332 33 4.16666666666667e-02 332 673 4.16666666666667e-02 332 583 -8.33333333333333e-02 332 134 -8.33333333333333e-02 332 672 4.16666666666667e-02 332 582 -8.33333333333333e-02 332 637 4.16666666666667e-02 332 326 -1.25000000000000e-01 332 35 -8.33333333333333e-02 332 325 8.33333333333333e-02 332 313 -1.66666666666667e-01 332 324 -4.16666666666667e-02 332 312 8.33333333333333e-02 333 333 1.25000000000000e+00 333 377 -8.33333333333333e-02 333 349 8.33333333333333e-02 333 376 -8.33333333333333e-02 333 373 -8.33333333333333e-02 333 344 8.33333333333333e-02 333 350 -1.66666666666667e-01 333 343 8.33333333333333e-02 333 342 -3.75000000000000e-01 333 143 8.33333333333333e-02 333 335 -1.66666666666667e-01 333 341 1.66666666666667e-01 333 370 8.33333333333333e-02 333 340 -8.33333333333333e-02 333 38 -4.16666666666667e-02 333 137 4.16666666666667e-02 333 37 8.33333333333333e-02 333 136 -8.33333333333333e-02 333 36 -1.25000000000000e-01 333 339 -2.50000000000000e-01 333 44 -4.16666666666667e-02 333 371 8.33333333333333e-02 333 334 -1.66666666666667e-01 333 43 8.33333333333333e-02 333 142 8.33333333333333e-02 333 374 4.16666666666667e-02 333 42 -1.25000000000000e-01 333 141 -3.75000000000000e-01 334 334 1.25000000000000e+00 334 375 -8.33333333333333e-02 334 374 4.16666666666667e-02 334 377 -8.33333333333333e-02 334 372 -8.33333333333333e-02 334 344 -4.16666666666667e-02 334 350 8.33333333333333e-02 334 343 -1.25000000000000e-01 334 342 8.33333333333333e-02 334 143 -4.16666666666667e-02 334 137 4.16666666666667e-02 334 369 8.33333333333333e-02 334 339 -8.33333333333333e-02 334 38 8.33333333333333e-02 334 335 -1.66666666666667e-01 334 341 1.66666666666667e-01 334 37 -3.75000000000000e-01 334 340 -2.50000000000000e-01 334 36 8.33333333333333e-02 334 135 -8.33333333333333e-02 334 44 8.33333333333333e-02 334 371 -1.66666666666667e-01 334 348 8.33333333333333e-02 334 43 -3.75000000000000e-01 334 142 -1.25000000000000e-01 334 333 -1.66666666666667e-01 334 42 8.33333333333333e-02 334 141 8.33333333333333e-02 335 335 1.25000000000000e+00 335 375 -8.33333333333333e-02 335 373 4.16666666666667e-02 335 376 -8.33333333333333e-02 335 344 -1.25000000000000e-01 335 343 -4.16666666666667e-02 335 349 8.33333333333333e-02 335 342 8.33333333333333e-02 335 348 -1.66666666666667e-01 335 142 -4.16666666666667e-02 335 136 4.16666666666667e-02 335 141 8.33333333333333e-02 335 333 -1.66666666666667e-01 335 339 1.66666666666667e-01 335 38 -1.25000000000000e-01 335 341 -7.50000000000000e-01 335 37 8.33333333333333e-02 335 334 -1.66666666666667e-01 335 340 1.66666666666667e-01 335 36 -4.16666666666667e-02 335 135 4.16666666666667e-02 335 372 4.16666666666667e-02 335 44 -1.25000000000000e-01 335 143 -1.25000000000000e-01 335 43 8.33333333333333e-02 335 370 -1.66666666666667e-01 335 42 -4.16666666666667e-02 335 369 8.33333333333333e-02 336 336 1.25000000000000e+00 336 347 8.33333333333333e-02 336 346 8.33333333333333e-02 336 345 -3.75000000000000e-01 336 410 -8.33333333333333e-02 336 412 -8.33333333333333e-02 336 350 8.33333333333333e-02 336 349 -1.66666666666667e-01 336 413 -8.33333333333333e-02 336 407 8.33333333333333e-02 336 341 -8.33333333333333e-02 336 337 -1.66666666666667e-01 336 340 1.66666666666667e-01 336 148 8.33333333333333e-02 336 38 8.33333333333333e-02 336 137 -8.33333333333333e-02 336 37 -4.16666666666667e-02 336 136 4.16666666666667e-02 336 36 -1.25000000000000e-01 336 339 -2.50000000000000e-01 336 338 -1.66666666666667e-01 336 50 8.33333333333333e-02 336 149 8.33333333333333e-02 336 49 -4.16666666666667e-02 336 406 8.33333333333333e-02 336 409 4.16666666666667e-02 336 48 -1.25000000000000e-01 336 147 -3.75000000000000e-01 337 337 1.25000000000000e+00 337 347 -4.16666666666667e-02 337 346 -1.25000000000000e-01 337 345 8.33333333333333e-02 337 410 4.16666666666667e-02 337 350 8.33333333333333e-02 337 413 -8.33333333333333e-02 337 411 -8.33333333333333e-02 337 348 -1.66666666666667e-01 337 137 4.16666666666667e-02 337 149 -4.16666666666667e-02 337 336 -1.66666666666667e-01 337 339 1.66666666666667e-01 337 147 8.33333333333333e-02 337 38 8.33333333333333e-02 337 338 -1.66666666666667e-01 337 341 1.66666666666667e-01 337 37 -1.25000000000000e-01 337 340 -7.50000000000000e-01 337 36 -4.16666666666667e-02 337 135 4.16666666666667e-02 337 50 8.33333333333333e-02 337 407 -1.66666666666667e-01 337 408 4.16666666666667e-02 337 49 -1.25000000000000e-01 337 148 -1.25000000000000e-01 337 48 -4.16666666666667e-02 337 405 8.33333333333333e-02 338 338 1.25000000000000e+00 338 346 -4.16666666666667e-02 338 345 8.33333333333333e-02 338 409 4.16666666666667e-02 338 408 -8.33333333333333e-02 338 349 8.33333333333333e-02 338 412 -8.33333333333333e-02 338 348 8.33333333333333e-02 338 411 -8.33333333333333e-02 338 405 8.33333333333333e-02 338 339 -8.33333333333333e-02 338 136 4.16666666666667e-02 338 148 -4.16666666666667e-02 338 38 -3.75000000000000e-01 338 341 -2.50000000000000e-01 338 37 8.33333333333333e-02 338 337 -1.66666666666667e-01 338 340 1.66666666666667e-01 338 36 8.33333333333333e-02 338 135 -8.33333333333333e-02 338 347 -1.25000000000000e-01 338 50 -3.75000000000000e-01 338 149 -1.25000000000000e-01 338 49 8.33333333333333e-02 338 406 -1.66666666666667e-01 338 336 -1.66666666666667e-01 338 48 8.33333333333333e-02 338 147 8.33333333333333e-02 339 339 2.50000000000000e+00 339 376 -1.66666666666667e-01 339 335 1.66666666666667e-01 339 142 8.33333333333333e-02 339 334 -8.33333333333333e-02 339 143 -1.66666666666667e-01 339 333 -2.50000000000000e-01 339 371 -8.33333333333333e-02 339 370 1.66666666666667e-01 339 369 -2.50000000000000e-01 339 442 -8.33333333333333e-02 339 350 1.66666666666667e-01 339 413 -1.66666666666667e-01 339 412 8.33333333333333e-02 339 38 8.33333333333333e-02 339 349 1.66666666666667e-01 339 340 -3.33333333333333e-01 339 348 -7.50000000000000e-01 339 443 -8.33333333333333e-02 339 56 8.33333333333333e-02 339 338 -8.33333333333333e-02 339 337 1.66666666666667e-01 339 137 -8.33333333333333e-02 339 149 8.33333333333333e-02 339 154 1.66666666666667e-01 339 148 -1.66666666666667e-01 339 37 8.33333333333333e-02 339 136 -8.33333333333333e-02 339 336 -2.50000000000000e-01 339 341 -3.33333333333333e-01 339 407 1.66666666666667e-01 339 155 1.66666666666667e-01 339 406 -8.33333333333333e-02 339 55 8.33333333333333e-02 339 377 8.33333333333333e-02 339 405 -2.50000000000000e-01 339 153 -7.50000000000000e-01 340 340 2.50000000000000e+00 340 375 -1.66666666666667e-01 340 141 8.33333333333333e-02 340 333 -8.33333333333333e-02 340 143 8.33333333333333e-02 340 335 1.66666666666667e-01 340 334 -2.50000000000000e-01 340 371 1.66666666666667e-01 340 370 -7.50000000000000e-01 340 369 1.66666666666667e-01 340 443 -8.33333333333333e-02 340 441 -8.33333333333333e-02 340 350 -8.33333333333333e-02 340 413 8.33333333333333e-02 340 411 8.33333333333333e-02 340 349 -2.50000000000000e-01 340 348 1.66666666666667e-01 340 339 -3.33333333333333e-01 340 155 -8.33333333333333e-02 340 341 -3.33333333333333e-01 340 137 -8.33333333333333e-02 340 149 8.33333333333333e-02 340 336 1.66666666666667e-01 340 153 1.66666666666667e-01 340 147 -1.66666666666667e-01 340 38 -1.66666666666667e-01 340 338 1.66666666666667e-01 340 337 -7.50000000000000e-01 340 36 8.33333333333333e-02 340 135 -8.33333333333333e-02 340 407 1.66666666666667e-01 340 56 -1.66666666666667e-01 340 377 8.33333333333333e-02 340 406 -2.50000000000000e-01 340 154 -2.50000000000000e-01 340 405 -8.33333333333333e-02 340 54 8.33333333333333e-02 341 341 2.50000000000000e+00 341 375 8.33333333333333e-02 341 333 1.66666666666667e-01 341 142 8.33333333333333e-02 341 141 -1.66666666666667e-01 341 335 -7.50000000000000e-01 341 334 1.66666666666667e-01 341 371 -2.50000000000000e-01 341 370 1.66666666666667e-01 341 369 -8.33333333333333e-02 341 442 -8.33333333333333e-02 341 349 -8.33333333333333e-02 341 412 8.33333333333333e-02 341 348 1.66666666666667e-01 341 411 -1.66666666666667e-01 341 350 -2.50000000000000e-01 341 36 8.33333333333333e-02 341 441 -8.33333333333333e-02 341 54 8.33333333333333e-02 341 154 -8.33333333333333e-02 341 340 -3.33333333333333e-01 341 336 -8.33333333333333e-02 341 136 -8.33333333333333e-02 341 148 8.33333333333333e-02 341 135 -8.33333333333333e-02 341 147 8.33333333333333e-02 341 338 -2.50000000000000e-01 341 37 -1.66666666666667e-01 341 337 1.66666666666667e-01 341 376 8.33333333333333e-02 341 407 -7.50000000000000e-01 341 155 -2.50000000000000e-01 341 406 1.66666666666667e-01 341 55 -1.66666666666667e-01 341 339 -3.33333333333333e-01 341 405 1.66666666666667e-01 341 153 1.66666666666667e-01 342 342 1.25000000000000e+00 342 376 8.33333333333333e-02 342 377 8.33333333333333e-02 342 335 8.33333333333333e-02 342 344 -1.66666666666667e-01 342 334 8.33333333333333e-02 342 333 -3.75000000000000e-01 342 373 8.33333333333333e-02 342 372 -1.25000000000000e-01 342 349 -8.33333333333333e-02 342 343 -1.66666666666667e-01 342 164 8.33333333333333e-02 342 481 -8.33333333333333e-02 342 175 8.33333333333333e-02 342 350 1.66666666666667e-01 342 176 -1.66666666666667e-01 342 62 4.16666666666667e-02 342 482 -8.33333333333333e-02 342 163 8.33333333333333e-02 342 61 -8.33333333333333e-02 342 162 -3.75000000000000e-01 342 158 -4.16666666666667e-02 342 38 4.16666666666667e-02 342 157 8.33333333333333e-02 342 37 -8.33333333333333e-02 342 156 -1.25000000000000e-01 342 374 -4.16666666666667e-02 342 348 -2.50000000000000e-01 343 343 1.25000000000000e+00 343 375 8.33333333333333e-02 343 377 -1.66666666666667e-01 343 335 -4.16666666666667e-02 343 38 4.16666666666667e-02 343 334 -1.25000000000000e-01 343 333 8.33333333333333e-02 343 62 4.16666666666667e-02 343 373 -3.75000000000000e-01 343 372 8.33333333333333e-02 343 348 -8.33333333333333e-02 343 164 -4.16666666666667e-02 343 342 -1.66666666666667e-01 343 480 -8.33333333333333e-02 343 174 8.33333333333333e-02 343 482 -8.33333333333333e-02 343 176 8.33333333333333e-02 343 163 -1.25000000000000e-01 343 162 8.33333333333333e-02 343 60 -8.33333333333333e-02 343 158 8.33333333333333e-02 343 344 -1.66666666666667e-01 343 350 1.66666666666667e-01 343 157 -3.75000000000000e-01 343 374 8.33333333333333e-02 343 349 -2.50000000000000e-01 343 156 8.33333333333333e-02 343 36 -8.33333333333333e-02 344 344 1.25000000000000e+00 344 372 -4.16666666666667e-02 344 376 -1.66666666666667e-01 344 375 8.33333333333333e-02 344 335 -1.25000000000000e-01 344 334 -4.16666666666667e-02 344 37 4.16666666666667e-02 344 333 8.33333333333333e-02 344 342 -1.66666666666667e-01 344 374 -1.25000000000000e-01 344 61 4.16666666666667e-02 344 163 -4.16666666666667e-02 344 162 8.33333333333333e-02 344 481 -8.33333333333333e-02 344 175 8.33333333333333e-02 344 348 1.66666666666667e-01 344 174 -1.66666666666667e-01 344 164 -1.25000000000000e-01 344 60 4.16666666666667e-02 344 480 -8.33333333333333e-02 344 158 -1.25000000000000e-01 344 373 8.33333333333333e-02 344 350 -7.50000000000000e-01 344 157 8.33333333333333e-02 344 343 -1.66666666666667e-01 344 349 1.66666666666667e-01 344 156 -4.16666666666667e-02 344 36 4.16666666666667e-02 345 345 1.25000000000000e+00 345 409 -4.16666666666667e-02 345 412 8.33333333333333e-02 345 410 8.33333333333333e-02 345 408 -1.25000000000000e-01 345 338 8.33333333333333e-02 345 346 -1.66666666666667e-01 345 337 8.33333333333333e-02 345 336 -3.75000000000000e-01 345 518 -8.33333333333333e-02 345 347 -1.66666666666667e-01 345 169 8.33333333333333e-02 345 176 8.33333333333333e-02 345 350 -8.33333333333333e-02 345 175 -1.66666666666667e-01 345 349 1.66666666666667e-01 345 170 8.33333333333333e-02 345 68 -8.33333333333333e-02 345 67 4.16666666666667e-02 345 517 -8.33333333333333e-02 345 168 -3.75000000000000e-01 345 158 8.33333333333333e-02 345 38 -8.33333333333333e-02 345 157 -4.16666666666667e-02 345 37 4.16666666666667e-02 345 156 -1.25000000000000e-01 345 413 8.33333333333333e-02 345 348 -2.50000000000000e-01 346 346 1.25000000000000e+00 346 413 -1.66666666666667e-01 346 408 -4.16666666666667e-02 346 411 8.33333333333333e-02 346 68 4.16666666666667e-02 346 409 -1.25000000000000e-01 346 38 4.16666666666667e-02 346 338 -4.16666666666667e-02 346 337 -1.25000000000000e-01 346 345 -1.66666666666667e-01 346 336 8.33333333333333e-02 346 518 -8.33333333333333e-02 346 170 -4.16666666666667e-02 346 176 8.33333333333333e-02 346 168 8.33333333333333e-02 346 174 -1.66666666666667e-01 346 348 1.66666666666667e-01 346 169 -1.25000000000000e-01 346 66 4.16666666666667e-02 346 516 -8.33333333333333e-02 346 158 8.33333333333333e-02 346 347 -1.66666666666667e-01 346 350 1.66666666666667e-01 346 157 -1.25000000000000e-01 346 410 8.33333333333333e-02 346 349 -7.50000000000000e-01 346 156 -4.16666666666667e-02 346 36 4.16666666666667e-02 347 347 1.25000000000000e+00 347 409 8.33333333333333e-02 347 412 -1.66666666666667e-01 347 410 -3.75000000000000e-01 347 67 4.16666666666667e-02 347 408 8.33333333333333e-02 347 338 -1.25000000000000e-01 347 37 4.16666666666667e-02 347 337 -4.16666666666667e-02 347 336 8.33333333333333e-02 347 517 -8.33333333333333e-02 347 516 -8.33333333333333e-02 347 169 -4.16666666666667e-02 347 175 8.33333333333333e-02 347 345 -1.66666666666667e-01 347 174 8.33333333333333e-02 347 348 -8.33333333333333e-02 347 170 -1.25000000000000e-01 347 168 8.33333333333333e-02 347 66 -8.33333333333333e-02 347 158 -3.75000000000000e-01 347 411 8.33333333333333e-02 347 350 -2.50000000000000e-01 347 157 8.33333333333333e-02 347 346 -1.66666666666667e-01 347 349 1.66666666666667e-01 347 156 8.33333333333333e-02 347 36 -8.33333333333333e-02 348 348 2.50000000000000e+00 348 377 -8.33333333333333e-02 348 335 -1.66666666666667e-01 348 376 1.66666666666667e-01 348 375 -2.50000000000000e-01 348 343 -8.33333333333333e-02 348 344 1.66666666666667e-01 348 342 -2.50000000000000e-01 348 482 8.33333333333333e-02 348 481 -1.66666666666667e-01 348 442 8.33333333333333e-02 348 412 -8.33333333333333e-02 348 350 -3.33333333333333e-01 348 341 1.66666666666667e-01 348 413 1.66666666666667e-01 348 38 -8.33333333333333e-02 348 338 8.33333333333333e-02 348 340 1.66666666666667e-01 348 337 -1.66666666666667e-01 348 339 -7.50000000000000e-01 348 74 -8.33333333333333e-02 348 443 8.33333333333333e-02 348 411 -2.50000000000000e-01 348 158 8.33333333333333e-02 348 347 -8.33333333333333e-02 348 175 1.66666666666667e-01 348 349 -3.33333333333333e-01 348 346 1.66666666666667e-01 348 176 1.66666666666667e-01 348 518 -1.66666666666667e-01 348 517 8.33333333333333e-02 348 73 -8.33333333333333e-02 348 174 -7.50000000000000e-01 348 157 8.33333333333333e-02 348 37 -8.33333333333333e-02 348 345 -2.50000000000000e-01 348 334 8.33333333333333e-02 349 349 2.50000000000000e+00 349 377 1.66666666666667e-01 349 335 8.33333333333333e-02 349 376 -7.50000000000000e-01 349 375 1.66666666666667e-01 349 342 -8.33333333333333e-02 349 482 8.33333333333333e-02 349 344 1.66666666666667e-01 349 343 -2.50000000000000e-01 349 480 -1.66666666666667e-01 349 350 -3.33333333333333e-01 349 74 -8.33333333333333e-02 349 38 -8.33333333333333e-02 349 441 8.33333333333333e-02 349 411 -8.33333333333333e-02 349 341 -8.33333333333333e-02 349 338 8.33333333333333e-02 349 340 -2.50000000000000e-01 349 339 1.66666666666667e-01 349 336 -1.66666666666667e-01 349 443 -1.66666666666667e-01 349 413 1.66666666666667e-01 349 412 -2.50000000000000e-01 349 176 -8.33333333333333e-02 349 518 8.33333333333333e-02 349 174 1.66666666666667e-01 349 348 -3.33333333333333e-01 349 345 1.66666666666667e-01 349 175 -2.50000000000000e-01 349 516 8.33333333333333e-02 349 72 -8.33333333333333e-02 349 158 -1.66666666666667e-01 349 347 1.66666666666667e-01 349 346 -7.50000000000000e-01 349 333 8.33333333333333e-02 349 156 8.33333333333333e-02 349 36 -8.33333333333333e-02 350 350 2.50000000000000e+00 350 375 -8.33333333333333e-02 350 334 8.33333333333333e-02 350 333 -1.66666666666667e-01 350 377 -2.50000000000000e-01 350 481 8.33333333333333e-02 350 342 1.66666666666667e-01 350 344 -7.50000000000000e-01 350 343 1.66666666666667e-01 350 480 8.33333333333333e-02 350 349 -3.33333333333333e-01 350 73 -8.33333333333333e-02 350 37 -8.33333333333333e-02 350 340 -8.33333333333333e-02 350 337 8.33333333333333e-02 350 348 -3.33333333333333e-01 350 339 1.66666666666667e-01 350 411 1.66666666666667e-01 350 341 -2.50000000000000e-01 350 36 -8.33333333333333e-02 350 336 8.33333333333333e-02 350 413 -7.50000000000000e-01 350 442 -1.66666666666667e-01 350 412 1.66666666666667e-01 350 72 -8.33333333333333e-02 350 441 8.33333333333333e-02 350 175 -8.33333333333333e-02 350 517 8.33333333333333e-02 350 156 8.33333333333333e-02 350 345 -8.33333333333333e-02 350 176 -2.50000000000000e-01 350 174 1.66666666666667e-01 350 516 -1.66666666666667e-01 350 347 -2.50000000000000e-01 350 376 1.66666666666667e-01 350 157 -1.66666666666667e-01 350 346 1.66666666666667e-01 351 351 1.25000000000000e+00 351 382 -8.33333333333333e-02 351 362 -4.16666666666667e-02 351 368 8.33333333333333e-02 351 361 8.33333333333333e-02 351 360 -1.25000000000000e-01 351 380 4.16666666666667e-02 351 383 -8.33333333333333e-02 351 379 -8.33333333333333e-02 351 140 4.16666666666667e-02 351 143 -4.16666666666667e-02 351 370 8.33333333333333e-02 351 358 -8.33333333333333e-02 351 44 8.33333333333333e-02 351 371 -1.66666666666667e-01 351 43 8.33333333333333e-02 351 352 -1.66666666666667e-01 351 142 8.33333333333333e-02 351 42 -3.75000000000000e-01 351 141 -1.25000000000000e-01 351 353 -1.66666666666667e-01 351 41 8.33333333333333e-02 351 359 1.66666666666667e-01 351 40 8.33333333333333e-02 351 139 -8.33333333333333e-02 351 367 8.33333333333333e-02 351 39 -3.75000000000000e-01 351 357 -2.50000000000000e-01 352 352 1.25000000000000e+00 352 383 -8.33333333333333e-02 352 366 8.33333333333333e-02 352 381 -8.33333333333333e-02 352 362 8.33333333333333e-02 352 368 -1.66666666666667e-01 352 361 -3.75000000000000e-01 352 360 8.33333333333333e-02 352 378 -8.33333333333333e-02 352 353 -1.66666666666667e-01 352 143 8.33333333333333e-02 352 359 1.66666666666667e-01 352 369 8.33333333333333e-02 352 357 -8.33333333333333e-02 352 44 -4.16666666666667e-02 352 371 8.33333333333333e-02 352 43 -1.25000000000000e-01 352 142 -3.75000000000000e-01 352 42 8.33333333333333e-02 352 351 -1.66666666666667e-01 352 141 8.33333333333333e-02 352 41 -4.16666666666667e-02 352 140 4.16666666666667e-02 352 380 4.16666666666667e-02 352 40 -1.25000000000000e-01 352 358 -2.50000000000000e-01 352 39 8.33333333333333e-02 352 138 -8.33333333333333e-02 353 353 1.25000000000000e+00 353 382 -8.33333333333333e-02 353 362 -1.25000000000000e-01 353 361 8.33333333333333e-02 353 367 -1.66666666666667e-01 353 360 -4.16666666666667e-02 353 366 8.33333333333333e-02 353 378 4.16666666666667e-02 353 381 -8.33333333333333e-02 353 138 4.16666666666667e-02 353 141 -4.16666666666667e-02 353 352 -1.66666666666667e-01 353 142 8.33333333333333e-02 353 358 1.66666666666667e-01 353 44 -1.25000000000000e-01 353 143 -1.25000000000000e-01 353 43 -4.16666666666667e-02 353 370 8.33333333333333e-02 353 42 8.33333333333333e-02 353 369 -1.66666666666667e-01 353 379 4.16666666666667e-02 353 41 -1.25000000000000e-01 353 359 -7.50000000000000e-01 353 40 -4.16666666666667e-02 353 139 4.16666666666667e-02 353 351 -1.66666666666667e-01 353 39 8.33333333333333e-02 353 357 1.66666666666667e-01 354 354 6.37500000000000e+01 354 428 2.12500000000000e+00 354 364 4.25000000000000e+00 354 355 -8.50000000000000e+00 354 41 4.25000000000000e+00 354 40 -2.12500000000000e+00 354 363 -6.37500000000000e+00 354 356 -8.50000000000000e+00 354 53 4.25000000000000e+00 354 427 2.12500000000000e+00 354 52 -2.12500000000000e+00 354 139 2.12500000000000e+00 354 140 2.12500000000000e+00 354 39 -6.37500000000000e+00 354 152 -2.12500000000000e+00 354 151 4.25000000000000e+00 354 150 -6.37500000000000e+00 354 365 -2.12500000000000e+00 354 51 -6.37500000000000e+00 354 368 8.33333333333333e-02 354 431 -8.33333333333333e-02 354 430 -8.33333333333333e-02 354 367 -1.66666666666667e-01 354 358 1.66666666666667e-01 354 425 -1.66666666666667e-01 354 424 8.33333333333333e-02 354 359 1.66666666666667e-01 354 357 -7.50000000000000e-01 354 1720 8.33333333333333e+00 354 1718 -8.33333333333333e+00 354 1717 4.16666666666667e+00 354 1721 8.33333333333333e+00 354 1719 -3.75000000000000e+01 354 1687 -4.16666666666667e+00 354 1688 -4.16666666666667e+00 354 1694 4.16666666666667e+00 354 1693 -8.33333333333333e+00 355 355 6.37500000000000e+01 355 363 4.25000000000000e+00 355 354 -8.50000000000000e+00 355 365 4.25000000000000e+00 355 364 -1.91250000000000e+01 355 39 -2.12500000000000e+00 355 428 -4.25000000000000e+00 355 426 2.12500000000000e+00 355 51 -2.12500000000000e+00 355 138 2.12500000000000e+00 355 140 -4.25000000000000e+00 355 41 4.25000000000000e+00 355 40 -6.37500000000000e+00 355 152 4.25000000000000e+00 355 356 -8.50000000000000e+00 355 53 4.25000000000000e+00 355 151 -1.91250000000000e+01 355 52 -6.37500000000000e+00 355 150 4.25000000000000e+00 355 429 -8.33333333333333e-02 355 368 8.33333333333333e-02 355 366 -1.66666666666667e-01 355 431 -8.33333333333333e-02 355 359 -8.33333333333333e-02 355 425 8.33333333333333e-02 355 357 1.66666666666667e-01 355 423 8.33333333333333e-02 355 358 -2.50000000000000e-01 355 1721 -4.16666666666667e+00 355 1719 8.33333333333333e+00 355 1716 4.16666666666667e+00 355 1720 -1.25000000000000e+01 355 1686 -4.16666666666667e+00 355 1688 -4.16666666666667e+00 355 1694 4.16666666666667e+00 355 1718 4.16666666666667e+00 355 1692 -8.33333333333333e+00 356 356 6.37500000000000e+01 356 363 -2.12500000000000e+00 356 426 2.12500000000000e+00 356 365 -6.37500000000000e+00 356 364 4.25000000000000e+00 356 39 4.25000000000000e+00 356 427 -4.25000000000000e+00 356 354 -8.50000000000000e+00 356 51 4.25000000000000e+00 356 41 -1.91250000000000e+01 356 139 -4.25000000000000e+00 356 40 4.25000000000000e+00 356 138 2.12500000000000e+00 356 152 -6.37500000000000e+00 356 53 -1.91250000000000e+01 356 151 4.25000000000000e+00 356 355 -8.50000000000000e+00 356 52 4.25000000000000e+00 356 150 -2.12500000000000e+00 356 366 8.33333333333333e-02 356 429 -8.33333333333333e-02 356 367 8.33333333333333e-02 356 430 -8.33333333333333e-02 356 358 -8.33333333333333e-02 356 424 8.33333333333333e-02 356 423 -1.66666666666667e-01 356 359 -2.50000000000000e-01 356 357 1.66666666666667e-01 356 1720 -4.16666666666667e+00 356 1716 -8.33333333333333e+00 356 1721 -1.25000000000000e+01 356 1719 8.33333333333333e+00 356 1687 -4.16666666666667e+00 356 1693 4.16666666666667e+00 356 1686 -4.16666666666667e+00 356 1717 4.16666666666667e+00 356 1692 4.16666666666667e+00 357 357 2.50000000000000e+00 357 382 -1.66666666666667e-01 357 352 -8.33333333333333e-02 357 142 8.33333333333333e-02 357 143 8.33333333333333e-02 357 353 1.66666666666667e-01 357 351 -2.50000000000000e-01 357 371 1.66666666666667e-01 357 370 1.66666666666667e-01 357 369 -7.50000000000000e-01 357 446 -8.33333333333333e-02 357 445 -8.33333333333333e-02 357 368 -8.33333333333333e-02 357 431 8.33333333333333e-02 357 430 8.33333333333333e-02 357 367 1.66666666666667e-01 357 358 -3.33333333333333e-01 357 366 -2.50000000000000e-01 357 155 -8.33333333333333e-02 357 359 -3.33333333333333e-01 357 140 -8.33333333333333e-02 357 152 8.33333333333333e-02 357 355 1.66666666666667e-01 357 154 1.66666666666667e-01 357 151 -1.66666666666667e-01 357 356 1.66666666666667e-01 357 41 -1.66666666666667e-01 357 40 8.33333333333333e-02 357 139 -8.33333333333333e-02 357 354 -7.50000000000000e-01 357 425 1.66666666666667e-01 357 56 -1.66666666666667e-01 357 424 -8.33333333333333e-02 357 55 8.33333333333333e-02 357 423 -2.50000000000000e-01 357 383 8.33333333333333e-02 357 153 -2.50000000000000e-01 358 358 2.50000000000000e+00 358 381 -1.66666666666667e-01 358 353 1.66666666666667e-01 358 351 -8.33333333333333e-02 358 141 8.33333333333333e-02 358 143 -1.66666666666667e-01 358 352 -2.50000000000000e-01 358 371 -8.33333333333333e-02 358 370 -2.50000000000000e-01 358 369 1.66666666666667e-01 358 444 -8.33333333333333e-02 358 368 1.66666666666667e-01 358 431 -1.66666666666667e-01 358 429 8.33333333333333e-02 358 41 8.33333333333333e-02 358 367 -7.50000000000000e-01 358 366 1.66666666666667e-01 358 357 -3.33333333333333e-01 358 446 -8.33333333333333e-02 358 56 8.33333333333333e-02 358 356 -8.33333333333333e-02 358 354 1.66666666666667e-01 358 140 -8.33333333333333e-02 358 152 8.33333333333333e-02 358 153 1.66666666666667e-01 358 150 -1.66666666666667e-01 358 355 -2.50000000000000e-01 358 39 8.33333333333333e-02 358 138 -8.33333333333333e-02 358 425 1.66666666666667e-01 358 359 -3.33333333333333e-01 358 155 1.66666666666667e-01 358 424 -2.50000000000000e-01 358 383 8.33333333333333e-02 358 154 -7.50000000000000e-01 358 423 -8.33333333333333e-02 358 54 8.33333333333333e-02 359 359 2.50000000000000e+00 359 382 8.33333333333333e-02 359 352 1.66666666666667e-01 359 142 -1.66666666666667e-01 359 141 8.33333333333333e-02 359 353 -7.50000000000000e-01 359 351 1.66666666666667e-01 359 371 -2.50000000000000e-01 359 370 -8.33333333333333e-02 359 369 1.66666666666667e-01 359 444 -8.33333333333333e-02 359 367 1.66666666666667e-01 359 366 -8.33333333333333e-02 359 429 8.33333333333333e-02 359 430 -1.66666666666667e-01 359 368 -2.50000000000000e-01 359 40 8.33333333333333e-02 359 445 -8.33333333333333e-02 359 55 8.33333333333333e-02 359 153 -8.33333333333333e-02 359 355 -8.33333333333333e-02 359 357 -3.33333333333333e-01 359 138 -8.33333333333333e-02 359 150 8.33333333333333e-02 359 139 -8.33333333333333e-02 359 151 8.33333333333333e-02 359 356 -2.50000000000000e-01 359 354 1.66666666666667e-01 359 39 -1.66666666666667e-01 359 425 -7.50000000000000e-01 359 381 8.33333333333333e-02 359 155 -2.50000000000000e-01 359 424 1.66666666666667e-01 359 358 -3.33333333333333e-01 359 154 1.66666666666667e-01 359 423 1.66666666666667e-01 359 54 -1.66666666666667e-01 360 360 1.25000000000000e+00 360 382 8.33333333333333e-02 360 383 -1.66666666666667e-01 360 41 4.16666666666667e-02 360 353 -4.16666666666667e-02 360 352 8.33333333333333e-02 360 351 -1.25000000000000e-01 360 89 4.16666666666667e-02 360 379 8.33333333333333e-02 360 378 -3.75000000000000e-01 360 367 -8.33333333333333e-02 360 197 -4.16666666666667e-02 360 361 -1.66666666666667e-01 360 604 -8.33333333333333e-02 360 202 8.33333333333333e-02 360 605 -8.33333333333333e-02 360 203 8.33333333333333e-02 360 88 -8.33333333333333e-02 360 196 8.33333333333333e-02 360 195 -1.25000000000000e-01 360 362 -1.66666666666667e-01 360 194 8.33333333333333e-02 360 368 1.66666666666667e-01 360 193 8.33333333333333e-02 360 40 -8.33333333333333e-02 360 380 8.33333333333333e-02 360 192 -3.75000000000000e-01 360 366 -2.50000000000000e-01 361 361 1.25000000000000e+00 361 381 8.33333333333333e-02 361 383 8.33333333333333e-02 361 353 8.33333333333333e-02 361 362 -1.66666666666667e-01 361 352 -3.75000000000000e-01 361 351 8.33333333333333e-02 361 379 -1.25000000000000e-01 361 378 8.33333333333333e-02 361 366 -8.33333333333333e-02 361 360 -1.66666666666667e-01 361 197 8.33333333333333e-02 361 603 -8.33333333333333e-02 361 201 8.33333333333333e-02 361 368 1.66666666666667e-01 361 203 -1.66666666666667e-01 361 89 4.16666666666667e-02 361 605 -8.33333333333333e-02 361 196 -3.75000000000000e-01 361 87 -8.33333333333333e-02 361 195 8.33333333333333e-02 361 194 -4.16666666666667e-02 361 41 4.16666666666667e-02 361 380 -4.16666666666667e-02 361 193 -1.25000000000000e-01 361 367 -2.50000000000000e-01 361 192 8.33333333333333e-02 361 39 -8.33333333333333e-02 362 362 1.25000000000000e+00 362 378 8.33333333333333e-02 362 382 8.33333333333333e-02 362 381 -1.66666666666667e-01 362 353 -1.25000000000000e-01 362 352 8.33333333333333e-02 362 361 -1.66666666666667e-01 362 39 4.16666666666667e-02 362 351 -4.16666666666667e-02 362 380 -1.25000000000000e-01 362 87 4.16666666666667e-02 362 195 -4.16666666666667e-02 362 196 8.33333333333333e-02 362 367 1.66666666666667e-01 362 202 -1.66666666666667e-01 362 603 -8.33333333333333e-02 362 201 8.33333333333333e-02 362 197 -1.25000000000000e-01 362 88 4.16666666666667e-02 362 604 -8.33333333333333e-02 362 379 -4.16666666666667e-02 362 194 -1.25000000000000e-01 362 368 -7.50000000000000e-01 362 193 -4.16666666666667e-02 362 40 4.16666666666667e-02 362 360 -1.66666666666667e-01 362 192 8.33333333333333e-02 362 366 1.66666666666667e-01 363 363 6.37500000000000e+01 363 355 4.25000000000000e+00 363 40 2.12500000000000e+00 363 354 -6.37500000000000e+00 363 365 -8.50000000000000e+00 363 428 4.25000000000000e+00 363 91 2.12500000000000e+00 363 427 -2.12500000000000e+00 363 426 -6.37500000000000e+00 363 194 4.25000000000000e+00 363 193 -2.12500000000000e+00 363 41 2.12500000000000e+00 363 192 -6.37500000000000e+00 363 200 -2.12500000000000e+00 363 92 2.12500000000000e+00 363 364 -8.50000000000000e+00 363 199 4.25000000000000e+00 363 356 -2.12500000000000e+00 363 198 -6.37500000000000e+00 363 431 -1.66666666666667e-01 363 430 8.33333333333333e-02 363 611 -8.33333333333333e-02 363 203 8.33333333333333e-02 363 202 -1.66666666666667e-01 363 367 1.66666666666667e-01 363 610 -8.33333333333333e-02 363 368 1.66666666666667e-01 363 366 -7.50000000000000e-01 363 1721 4.16666666666667e+00 363 1720 -8.33333333333333e+00 363 1717 -4.16666666666667e+00 363 1462 4.16666666666667e+00 363 1463 -8.33333333333333e+00 363 1730 8.33333333333333e+00 363 1718 -4.16666666666667e+00 363 1729 8.33333333333333e+00 363 1728 -3.75000000000000e+01 364 364 6.37500000000000e+01 364 354 4.25000000000000e+00 364 356 4.25000000000000e+00 364 355 -1.91250000000000e+01 364 39 2.12500000000000e+00 364 428 4.25000000000000e+00 364 427 -6.37500000000000e+00 364 90 2.12500000000000e+00 364 426 -2.12500000000000e+00 364 365 -8.50000000000000e+00 364 192 -2.12500000000000e+00 364 41 -4.25000000000000e+00 364 194 4.25000000000000e+00 364 193 -6.37500000000000e+00 364 200 4.25000000000000e+00 364 92 -4.25000000000000e+00 364 199 -1.91250000000000e+01 364 363 -8.50000000000000e+00 364 198 4.25000000000000e+00 364 429 8.33333333333333e-02 364 611 -8.33333333333333e-02 364 203 8.33333333333333e-02 364 368 -8.33333333333333e-02 364 201 -1.66666666666667e-01 364 366 1.66666666666667e-01 364 609 -8.33333333333333e-02 364 431 8.33333333333333e-02 364 367 -2.50000000000000e-01 364 1719 -8.33333333333333e+00 364 1716 -4.16666666666667e+00 364 1718 -4.16666666666667e+00 364 1461 4.16666666666667e+00 364 1463 4.16666666666667e+00 364 1730 -4.16666666666667e+00 364 1721 4.16666666666667e+00 364 1729 -1.25000000000000e+01 364 1728 8.33333333333333e+00 365 365 6.37500000000000e+01 365 354 -2.12500000000000e+00 365 356 -6.37500000000000e+00 365 355 4.25000000000000e+00 365 428 -1.91250000000000e+01 365 427 4.25000000000000e+00 365 363 -8.50000000000000e+00 365 426 4.25000000000000e+00 365 364 -8.50000000000000e+00 365 192 4.25000000000000e+00 365 194 -1.91250000000000e+01 365 40 -4.25000000000000e+00 365 193 4.25000000000000e+00 365 39 2.12500000000000e+00 365 200 -6.37500000000000e+00 365 199 4.25000000000000e+00 365 91 -4.25000000000000e+00 365 198 -2.12500000000000e+00 365 90 2.12500000000000e+00 365 429 -1.66666666666667e-01 365 609 -8.33333333333333e-02 365 610 -8.33333333333333e-02 365 201 8.33333333333333e-02 365 202 8.33333333333333e-02 365 367 -8.33333333333333e-02 365 430 8.33333333333333e-02 365 368 -2.50000000000000e-01 365 366 1.66666666666667e-01 365 1719 4.16666666666667e+00 365 1717 -4.16666666666667e+00 365 1462 4.16666666666667e+00 365 1729 -4.16666666666667e+00 365 1461 -8.33333333333333e+00 365 1728 8.33333333333333e+00 365 1716 -4.16666666666667e+00 365 1720 4.16666666666667e+00 365 1730 -1.25000000000000e+01 366 366 2.50000000000000e+00 366 383 1.66666666666667e-01 366 353 8.33333333333333e-02 366 382 1.66666666666667e-01 366 381 -7.50000000000000e-01 366 361 -8.33333333333333e-02 366 605 8.33333333333333e-02 366 362 1.66666666666667e-01 366 360 -2.50000000000000e-01 366 604 -1.66666666666667e-01 366 368 -3.33333333333333e-01 366 95 -8.33333333333333e-02 366 41 -8.33333333333333e-02 366 445 8.33333333333333e-02 366 430 -8.33333333333333e-02 366 359 -8.33333333333333e-02 366 356 8.33333333333333e-02 366 446 -1.66666666666667e-01 366 431 1.66666666666667e-01 366 429 -2.50000000000000e-01 366 358 1.66666666666667e-01 366 355 -1.66666666666667e-01 366 357 -2.50000000000000e-01 366 203 -8.33333333333333e-02 366 611 8.33333333333333e-02 366 202 1.66666666666667e-01 366 367 -3.33333333333333e-01 366 364 1.66666666666667e-01 366 610 8.33333333333333e-02 366 94 -8.33333333333333e-02 366 201 -2.50000000000000e-01 366 365 1.66666666666667e-01 366 194 -1.66666666666667e-01 366 193 8.33333333333333e-02 366 40 -8.33333333333333e-02 366 363 -7.50000000000000e-01 366 352 8.33333333333333e-02 367 367 2.50000000000000e+00 367 383 -8.33333333333333e-02 367 353 -1.66666666666667e-01 367 382 -2.50000000000000e-01 367 381 1.66666666666667e-01 367 360 -8.33333333333333e-02 367 362 1.66666666666667e-01 367 361 -2.50000000000000e-01 367 605 8.33333333333333e-02 367 603 -1.66666666666667e-01 367 444 8.33333333333333e-02 367 429 -8.33333333333333e-02 367 359 1.66666666666667e-01 367 368 -3.33333333333333e-01 367 431 1.66666666666667e-01 367 95 -8.33333333333333e-02 367 446 8.33333333333333e-02 367 430 -2.50000000000000e-01 367 41 -8.33333333333333e-02 367 356 8.33333333333333e-02 367 358 -7.50000000000000e-01 367 357 1.66666666666667e-01 367 354 -1.66666666666667e-01 367 194 8.33333333333333e-02 367 365 -8.33333333333333e-02 367 201 1.66666666666667e-01 367 366 -3.33333333333333e-01 367 363 1.66666666666667e-01 367 611 -1.66666666666667e-01 367 203 1.66666666666667e-01 367 202 -7.50000000000000e-01 367 609 8.33333333333333e-02 367 93 -8.33333333333333e-02 367 364 -2.50000000000000e-01 367 351 8.33333333333333e-02 367 192 8.33333333333333e-02 367 39 -8.33333333333333e-02 368 368 2.50000000000000e+00 368 381 1.66666666666667e-01 368 352 -1.66666666666667e-01 368 351 8.33333333333333e-02 368 383 -2.50000000000000e-01 368 361 1.66666666666667e-01 368 603 8.33333333333333e-02 368 362 -7.50000000000000e-01 368 360 1.66666666666667e-01 368 604 8.33333333333333e-02 368 366 -3.33333333333333e-01 368 93 -8.33333333333333e-02 368 39 -8.33333333333333e-02 368 358 1.66666666666667e-01 368 367 -3.33333333333333e-01 368 430 1.66666666666667e-01 368 357 -8.33333333333333e-02 368 354 8.33333333333333e-02 368 431 -7.50000000000000e-01 368 94 -8.33333333333333e-02 368 445 8.33333333333333e-02 368 444 -1.66666666666667e-01 368 429 1.66666666666667e-01 368 359 -2.50000000000000e-01 368 40 -8.33333333333333e-02 368 355 8.33333333333333e-02 368 201 -8.33333333333333e-02 368 609 8.33333333333333e-02 368 193 8.33333333333333e-02 368 364 -8.33333333333333e-02 368 203 -2.50000000000000e-01 368 610 -1.66666666666667e-01 368 202 1.66666666666667e-01 368 365 -2.50000000000000e-01 368 382 -8.33333333333333e-02 368 363 1.66666666666667e-01 368 192 -1.66666666666667e-01 369 369 2.50000000000000e+00 369 383 -8.33333333333333e-02 369 382 1.66666666666667e-01 369 381 -2.50000000000000e-01 369 446 8.33333333333333e-02 369 352 8.33333333333333e-02 369 353 -1.66666666666667e-01 369 359 1.66666666666667e-01 369 358 1.66666666666667e-01 369 357 -7.50000000000000e-01 369 370 -3.33333333333333e-01 369 43 -8.33333333333333e-02 369 55 -8.33333333333333e-02 369 448 -8.33333333333333e-02 369 442 8.33333333333333e-02 369 449 -8.33333333333333e-02 369 386 8.33333333333333e-02 369 44 1.66666666666667e-01 369 371 -3.33333333333333e-01 369 377 1.66666666666667e-01 369 385 -1.66666666666667e-01 369 376 1.66666666666667e-01 369 375 -7.50000000000000e-01 369 56 1.66666666666667e-01 369 443 -1.66666666666667e-01 369 142 -8.33333333333333e-02 369 334 8.33333333333333e-02 369 335 8.33333333333333e-02 369 143 -8.33333333333333e-02 369 42 -2.50000000000000e-01 369 341 -8.33333333333333e-02 369 155 8.33333333333333e-02 369 340 1.66666666666667e-01 369 154 -1.66666666666667e-01 369 339 -2.50000000000000e-01 369 445 8.33333333333333e-02 369 54 -2.50000000000000e-01 370 370 2.50000000000000e+00 370 383 1.66666666666667e-01 370 382 -7.50000000000000e-01 370 381 1.66666666666667e-01 370 446 -1.66666666666667e-01 370 351 8.33333333333333e-02 370 353 8.33333333333333e-02 370 359 -8.33333333333333e-02 370 358 -2.50000000000000e-01 370 357 1.66666666666667e-01 370 369 -3.33333333333333e-01 370 42 -8.33333333333333e-02 370 54 -8.33333333333333e-02 370 447 -8.33333333333333e-02 370 441 8.33333333333333e-02 370 386 8.33333333333333e-02 370 377 -8.33333333333333e-02 370 376 -2.50000000000000e-01 370 384 -1.66666666666667e-01 370 375 1.66666666666667e-01 370 449 -8.33333333333333e-02 370 443 8.33333333333333e-02 370 141 -8.33333333333333e-02 370 333 8.33333333333333e-02 370 143 -8.33333333333333e-02 370 155 8.33333333333333e-02 370 335 -1.66666666666667e-01 370 44 1.66666666666667e-01 370 43 -2.50000000000000e-01 370 341 1.66666666666667e-01 370 371 -3.33333333333333e-01 370 56 1.66666666666667e-01 370 340 -7.50000000000000e-01 370 444 8.33333333333333e-02 370 55 -2.50000000000000e-01 370 339 1.66666666666667e-01 370 153 -1.66666666666667e-01 371 371 2.50000000000000e+00 371 382 1.66666666666667e-01 371 381 -8.33333333333333e-02 371 445 -1.66666666666667e-01 371 444 8.33333333333333e-02 371 352 8.33333333333333e-02 371 351 -1.66666666666667e-01 371 359 -2.50000000000000e-01 371 358 -8.33333333333333e-02 371 357 1.66666666666667e-01 371 447 -8.33333333333333e-02 371 384 8.33333333333333e-02 371 377 -2.50000000000000e-01 371 385 8.33333333333333e-02 371 376 -8.33333333333333e-02 371 42 1.66666666666667e-01 371 369 -3.33333333333333e-01 371 375 1.66666666666667e-01 371 448 -8.33333333333333e-02 371 442 8.33333333333333e-02 371 54 1.66666666666667e-01 371 441 -1.66666666666667e-01 371 142 -8.33333333333333e-02 371 154 8.33333333333333e-02 371 44 -7.50000000000000e-01 371 334 -1.66666666666667e-01 371 43 1.66666666666667e-01 371 333 8.33333333333333e-02 371 141 -8.33333333333333e-02 371 341 -2.50000000000000e-01 371 383 -2.50000000000000e-01 371 56 -7.50000000000000e-01 371 340 1.66666666666667e-01 371 370 -3.33333333333333e-01 371 55 1.66666666666667e-01 371 339 -8.33333333333333e-02 371 153 8.33333333333333e-02 372 372 1.25000000000000e+00 372 335 4.16666666666667e-02 372 334 -8.33333333333333e-02 372 343 8.33333333333333e-02 372 342 -1.25000000000000e-01 372 44 8.33333333333333e-02 372 374 -1.66666666666667e-01 372 377 1.66666666666667e-01 372 376 -8.33333333333333e-02 372 375 -2.50000000000000e-01 372 62 8.33333333333333e-02 372 482 -1.66666666666667e-01 372 481 8.33333333333333e-02 372 385 8.33333333333333e-02 372 490 -8.33333333333333e-02 372 209 4.16666666666667e-02 372 491 -8.33333333333333e-02 372 61 8.33333333333333e-02 372 208 -8.33333333333333e-02 372 60 -3.75000000000000e-01 372 206 -4.16666666666667e-02 372 386 8.33333333333333e-02 372 373 -1.66666666666667e-01 372 205 8.33333333333333e-02 372 43 8.33333333333333e-02 372 344 -4.16666666666667e-02 372 204 -1.25000000000000e-01 372 42 -3.75000000000000e-01 373 373 1.25000000000000e+00 373 374 -1.66666666666667e-01 373 44 -4.16666666666667e-02 373 335 4.16666666666667e-02 373 333 -8.33333333333333e-02 373 62 -4.16666666666667e-02 373 343 -3.75000000000000e-01 373 342 8.33333333333333e-02 373 482 8.33333333333333e-02 373 377 1.66666666666667e-01 373 376 -2.50000000000000e-01 373 375 -8.33333333333333e-02 373 480 8.33333333333333e-02 373 384 8.33333333333333e-02 373 489 -8.33333333333333e-02 373 209 4.16666666666667e-02 373 491 -8.33333333333333e-02 373 61 -1.25000000000000e-01 373 60 8.33333333333333e-02 373 207 -8.33333333333333e-02 373 206 8.33333333333333e-02 373 386 -1.66666666666667e-01 373 344 8.33333333333333e-02 373 205 -3.75000000000000e-01 373 43 -1.25000000000000e-01 373 372 -1.66666666666667e-01 373 204 8.33333333333333e-02 373 42 8.33333333333333e-02 374 374 1.25000000000000e+00 374 373 -1.66666666666667e-01 374 342 -4.16666666666667e-02 374 333 4.16666666666667e-02 374 43 -4.16666666666667e-02 374 334 4.16666666666667e-02 374 344 -1.25000000000000e-01 374 61 -4.16666666666667e-02 374 481 8.33333333333333e-02 374 377 -7.50000000000000e-01 374 376 1.66666666666667e-01 374 42 8.33333333333333e-02 374 372 -1.66666666666667e-01 374 375 1.66666666666667e-01 374 60 8.33333333333333e-02 374 480 -1.66666666666667e-01 374 208 4.16666666666667e-02 374 490 -8.33333333333333e-02 374 62 -1.25000000000000e-01 374 207 4.16666666666667e-02 374 489 -8.33333333333333e-02 374 343 8.33333333333333e-02 374 206 -1.25000000000000e-01 374 44 -1.25000000000000e-01 374 205 8.33333333333333e-02 374 385 -1.66666666666667e-01 374 204 -4.16666666666667e-02 374 384 8.33333333333333e-02 375 375 2.50000000000000e+00 375 340 -1.66666666666667e-01 375 335 -8.33333333333333e-02 375 343 8.33333333333333e-02 375 334 -8.33333333333333e-02 375 344 8.33333333333333e-02 375 350 -8.33333333333333e-02 375 349 1.66666666666667e-01 375 348 -2.50000000000000e-01 375 491 8.33333333333333e-02 375 490 -1.66666666666667e-01 375 481 1.66666666666667e-01 375 374 1.66666666666667e-01 375 43 8.33333333333333e-02 375 373 -8.33333333333333e-02 375 372 -2.50000000000000e-01 375 482 1.66666666666667e-01 375 73 8.33333333333333e-02 375 480 -7.50000000000000e-01 375 377 -3.33333333333333e-01 375 442 -8.33333333333333e-02 375 386 -8.33333333333333e-02 375 448 8.33333333333333e-02 375 553 -8.33333333333333e-02 375 449 8.33333333333333e-02 375 554 -8.33333333333333e-02 375 44 -1.66666666666667e-01 375 371 1.66666666666667e-01 375 385 1.66666666666667e-01 375 370 1.66666666666667e-01 375 376 -3.33333333333333e-01 375 384 -2.50000000000000e-01 375 369 -7.50000000000000e-01 375 443 1.66666666666667e-01 375 74 -1.66666666666667e-01 375 341 8.33333333333333e-02 375 441 -2.50000000000000e-01 376 376 2.50000000000000e+00 376 339 -1.66666666666667e-01 376 342 8.33333333333333e-02 376 333 -8.33333333333333e-02 376 344 -1.66666666666667e-01 376 350 1.66666666666667e-01 376 335 -8.33333333333333e-02 376 349 -7.50000000000000e-01 376 348 1.66666666666667e-01 376 491 8.33333333333333e-02 376 482 -8.33333333333333e-02 376 489 -1.66666666666667e-01 376 480 1.66666666666667e-01 376 374 1.66666666666667e-01 376 377 -3.33333333333333e-01 376 373 -2.50000000000000e-01 376 42 8.33333333333333e-02 376 372 -8.33333333333333e-02 376 481 -2.50000000000000e-01 376 72 8.33333333333333e-02 376 441 -8.33333333333333e-02 376 386 1.66666666666667e-01 376 447 8.33333333333333e-02 376 552 -8.33333333333333e-02 376 449 -1.66666666666667e-01 376 443 1.66666666666667e-01 376 44 8.33333333333333e-02 376 371 -8.33333333333333e-02 376 385 -7.50000000000000e-01 376 370 -2.50000000000000e-01 376 384 1.66666666666667e-01 376 369 1.66666666666667e-01 376 375 -3.33333333333333e-01 376 554 -8.33333333333333e-02 376 74 8.33333333333333e-02 376 341 8.33333333333333e-02 376 442 -2.50000000000000e-01 377 377 2.50000000000000e+00 377 339 8.33333333333333e-02 377 333 -8.33333333333333e-02 377 343 -1.66666666666667e-01 377 349 1.66666666666667e-01 377 342 8.33333333333333e-02 377 348 -8.33333333333333e-02 377 334 -8.33333333333333e-02 377 350 -2.50000000000000e-01 377 490 8.33333333333333e-02 377 481 -8.33333333333333e-02 377 489 8.33333333333333e-02 377 374 -7.50000000000000e-01 377 373 1.66666666666667e-01 377 376 -3.33333333333333e-01 377 372 1.66666666666667e-01 377 482 -2.50000000000000e-01 377 480 1.66666666666667e-01 377 375 -3.33333333333333e-01 377 384 -8.33333333333333e-02 377 385 1.66666666666667e-01 377 448 -1.66666666666667e-01 377 442 1.66666666666667e-01 377 447 8.33333333333333e-02 377 552 -8.33333333333333e-02 377 386 -2.50000000000000e-01 377 371 -2.50000000000000e-01 377 43 8.33333333333333e-02 377 370 -8.33333333333333e-02 377 42 -1.66666666666667e-01 377 369 1.66666666666667e-01 377 340 8.33333333333333e-02 377 443 -7.50000000000000e-01 377 553 -8.33333333333333e-02 377 73 8.33333333333333e-02 377 441 1.66666666666667e-01 377 72 -1.66666666666667e-01 378 378 1.25000000000000e+00 378 362 8.33333333333333e-02 378 353 4.16666666666667e-02 378 44 -4.16666666666667e-02 378 352 -8.33333333333333e-02 378 89 -4.16666666666667e-02 378 361 8.33333333333333e-02 378 360 -3.75000000000000e-01 378 605 8.33333333333333e-02 378 604 8.33333333333333e-02 378 383 1.66666666666667e-01 378 382 -8.33333333333333e-02 378 381 -2.50000000000000e-01 378 385 8.33333333333333e-02 378 607 -8.33333333333333e-02 378 212 4.16666666666667e-02 378 608 -8.33333333333333e-02 378 211 -8.33333333333333e-02 378 88 8.33333333333333e-02 378 87 -1.25000000000000e-01 378 206 8.33333333333333e-02 378 386 -1.66666666666667e-01 378 205 8.33333333333333e-02 378 379 -1.66666666666667e-01 378 43 8.33333333333333e-02 378 204 -3.75000000000000e-01 378 380 -1.66666666666667e-01 378 42 -1.25000000000000e-01 379 379 1.25000000000000e+00 379 353 4.16666666666667e-02 379 351 -8.33333333333333e-02 379 361 -1.25000000000000e-01 379 360 8.33333333333333e-02 379 89 8.33333333333333e-02 379 605 -1.66666666666667e-01 379 603 8.33333333333333e-02 379 380 -1.66666666666667e-01 379 44 8.33333333333333e-02 379 383 1.66666666666667e-01 379 382 -2.50000000000000e-01 379 381 -8.33333333333333e-02 379 384 8.33333333333333e-02 379 606 -8.33333333333333e-02 379 212 4.16666666666667e-02 379 608 -8.33333333333333e-02 379 88 -3.75000000000000e-01 379 210 -8.33333333333333e-02 379 87 8.33333333333333e-02 379 206 -4.16666666666667e-02 379 386 8.33333333333333e-02 379 205 -1.25000000000000e-01 379 362 -4.16666666666667e-02 379 43 -3.75000000000000e-01 379 204 8.33333333333333e-02 379 378 -1.66666666666667e-01 379 42 8.33333333333333e-02 380 380 1.25000000000000e+00 380 352 4.16666666666667e-02 380 378 -1.66666666666667e-01 380 360 8.33333333333333e-02 380 351 4.16666666666667e-02 380 42 -4.16666666666667e-02 380 362 -1.25000000000000e-01 380 87 -4.16666666666667e-02 380 603 8.33333333333333e-02 380 88 8.33333333333333e-02 380 604 -1.66666666666667e-01 380 383 -7.50000000000000e-01 380 379 -1.66666666666667e-01 380 43 8.33333333333333e-02 380 382 1.66666666666667e-01 380 381 1.66666666666667e-01 380 210 4.16666666666667e-02 380 606 -8.33333333333333e-02 380 89 -1.25000000000000e-01 380 211 4.16666666666667e-02 380 607 -8.33333333333333e-02 380 206 -1.25000000000000e-01 380 361 -4.16666666666667e-02 380 44 -1.25000000000000e-01 380 205 -4.16666666666667e-02 380 385 8.33333333333333e-02 380 204 8.33333333333333e-02 380 384 -1.66666666666667e-01 381 381 2.50000000000000e+00 381 358 -1.66666666666667e-01 381 352 -8.33333333333333e-02 381 361 8.33333333333333e-02 381 368 1.66666666666667e-01 381 362 -1.66666666666667e-01 381 353 -8.33333333333333e-02 381 367 1.66666666666667e-01 381 366 -7.50000000000000e-01 381 608 8.33333333333333e-02 381 605 -8.33333333333333e-02 381 604 1.66666666666667e-01 381 607 -1.66666666666667e-01 381 380 1.66666666666667e-01 381 383 -3.33333333333333e-01 381 379 -8.33333333333333e-02 381 43 8.33333333333333e-02 381 378 -2.50000000000000e-01 381 94 8.33333333333333e-02 381 603 -2.50000000000000e-01 381 445 -8.33333333333333e-02 381 386 1.66666666666667e-01 381 448 8.33333333333333e-02 381 616 -8.33333333333333e-02 381 449 -1.66666666666667e-01 381 446 1.66666666666667e-01 381 44 8.33333333333333e-02 381 371 -8.33333333333333e-02 381 385 1.66666666666667e-01 381 370 1.66666666666667e-01 381 382 -3.33333333333333e-01 381 384 -7.50000000000000e-01 381 369 -2.50000000000000e-01 381 617 -8.33333333333333e-02 381 95 8.33333333333333e-02 381 359 8.33333333333333e-02 381 444 -2.50000000000000e-01 382 382 2.50000000000000e+00 382 357 -1.66666666666667e-01 382 353 -8.33333333333333e-02 382 351 -8.33333333333333e-02 382 360 8.33333333333333e-02 382 368 -8.33333333333333e-02 382 362 8.33333333333333e-02 382 367 -2.50000000000000e-01 382 366 1.66666666666667e-01 382 608 8.33333333333333e-02 382 603 1.66666666666667e-01 382 606 -1.66666666666667e-01 382 380 1.66666666666667e-01 382 379 -2.50000000000000e-01 382 378 -8.33333333333333e-02 382 42 8.33333333333333e-02 382 605 1.66666666666667e-01 382 604 -7.50000000000000e-01 382 93 8.33333333333333e-02 382 383 -3.33333333333333e-01 382 444 -8.33333333333333e-02 382 386 -8.33333333333333e-02 382 447 8.33333333333333e-02 382 615 -8.33333333333333e-02 382 617 -8.33333333333333e-02 382 449 8.33333333333333e-02 382 44 -1.66666666666667e-01 382 371 1.66666666666667e-01 382 385 -2.50000000000000e-01 382 370 -7.50000000000000e-01 382 384 1.66666666666667e-01 382 369 1.66666666666667e-01 382 381 -3.33333333333333e-01 382 446 1.66666666666667e-01 382 95 -1.66666666666667e-01 382 359 8.33333333333333e-02 382 445 -2.50000000000000e-01 383 383 2.50000000000000e+00 383 358 8.33333333333333e-02 383 352 -8.33333333333333e-02 383 367 -8.33333333333333e-02 383 361 8.33333333333333e-02 383 366 1.66666666666667e-01 383 360 -1.66666666666667e-01 383 351 -8.33333333333333e-02 383 368 -2.50000000000000e-01 383 606 8.33333333333333e-02 383 603 -8.33333333333333e-02 383 607 8.33333333333333e-02 383 380 -7.50000000000000e-01 383 379 1.66666666666667e-01 383 378 1.66666666666667e-01 383 381 -3.33333333333333e-01 383 605 -2.50000000000000e-01 383 604 1.66666666666667e-01 383 382 -3.33333333333333e-01 383 385 -8.33333333333333e-02 383 384 1.66666666666667e-01 383 616 -8.33333333333333e-02 383 448 8.33333333333333e-02 383 447 -1.66666666666667e-01 383 444 1.66666666666667e-01 383 386 -2.50000000000000e-01 383 371 -2.50000000000000e-01 383 43 -1.66666666666667e-01 383 370 1.66666666666667e-01 383 42 8.33333333333333e-02 383 369 -8.33333333333333e-02 383 357 8.33333333333333e-02 383 446 -7.50000000000000e-01 383 445 1.66666666666667e-01 383 94 -1.66666666666667e-01 383 615 -8.33333333333333e-02 383 93 8.33333333333333e-02 384 384 2.50000000000000e+00 384 616 8.33333333333333e-02 384 617 8.33333333333333e-02 384 382 1.66666666666667e-01 384 381 -7.50000000000000e-01 384 379 8.33333333333333e-02 384 608 -8.33333333333333e-02 384 380 -1.66666666666667e-01 384 607 1.66666666666667e-01 384 606 -2.50000000000000e-01 384 385 -3.33333333333333e-01 384 43 -8.33333333333333e-02 384 100 -8.33333333333333e-02 384 371 8.33333333333333e-02 384 377 -8.33333333333333e-02 384 448 -8.33333333333333e-02 384 553 8.33333333333333e-02 384 370 -1.66666666666667e-01 384 376 1.66666666666667e-01 384 375 -2.50000000000000e-01 384 449 1.66666666666667e-01 384 554 -1.66666666666667e-01 384 447 -2.50000000000000e-01 384 205 -8.33333333333333e-02 384 373 8.33333333333333e-02 384 206 1.66666666666667e-01 384 386 -3.33333333333333e-01 384 491 1.66666666666667e-01 384 374 8.33333333333333e-02 384 44 -8.33333333333333e-02 384 204 -2.50000000000000e-01 384 218 8.33333333333333e-02 384 101 -8.33333333333333e-02 384 490 1.66666666666667e-01 384 217 -1.66666666666667e-01 384 489 -7.50000000000000e-01 384 383 1.66666666666667e-01 385 385 2.50000000000000e+00 385 615 8.33333333333333e-02 385 617 -1.66666666666667e-01 385 382 -2.50000000000000e-01 385 381 1.66666666666667e-01 385 378 8.33333333333333e-02 385 608 1.66666666666667e-01 385 380 8.33333333333333e-02 385 607 -7.50000000000000e-01 385 606 1.66666666666667e-01 385 384 -3.33333333333333e-01 385 42 -8.33333333333333e-02 385 99 -8.33333333333333e-02 385 449 1.66666666666667e-01 385 386 -3.33333333333333e-01 385 377 1.66666666666667e-01 385 447 -8.33333333333333e-02 385 552 8.33333333333333e-02 385 44 -8.33333333333333e-02 385 371 8.33333333333333e-02 385 376 -7.50000000000000e-01 385 369 -1.66666666666667e-01 385 375 1.66666666666667e-01 385 101 -8.33333333333333e-02 385 554 8.33333333333333e-02 385 448 -2.50000000000000e-01 385 204 -8.33333333333333e-02 385 372 8.33333333333333e-02 385 218 8.33333333333333e-02 385 491 -8.33333333333333e-02 385 374 -1.66666666666667e-01 385 206 1.66666666666667e-01 385 205 -2.50000000000000e-01 385 490 -2.50000000000000e-01 385 383 -8.33333333333333e-02 385 489 1.66666666666667e-01 385 216 -1.66666666666667e-01 386 386 2.50000000000000e+00 386 381 1.66666666666667e-01 386 616 -1.66666666666667e-01 386 615 8.33333333333333e-02 386 383 -2.50000000000000e-01 386 607 1.66666666666667e-01 386 606 -8.33333333333333e-02 386 379 8.33333333333333e-02 386 378 -1.66666666666667e-01 386 608 -2.50000000000000e-01 386 369 8.33333333333333e-02 386 375 -8.33333333333333e-02 386 448 1.66666666666667e-01 386 385 -3.33333333333333e-01 386 376 1.66666666666667e-01 386 377 -2.50000000000000e-01 386 43 -8.33333333333333e-02 386 370 8.33333333333333e-02 386 449 -7.50000000000000e-01 386 100 -8.33333333333333e-02 386 553 8.33333333333333e-02 386 447 1.66666666666667e-01 386 552 -1.66666666666667e-01 386 217 8.33333333333333e-02 386 490 -8.33333333333333e-02 386 204 1.66666666666667e-01 386 384 -3.33333333333333e-01 386 489 1.66666666666667e-01 386 206 -7.50000000000000e-01 386 373 -1.66666666666667e-01 386 205 1.66666666666667e-01 386 372 8.33333333333333e-02 386 42 -8.33333333333333e-02 386 491 -2.50000000000000e-01 386 382 -8.33333333333333e-02 386 216 8.33333333333333e-02 386 99 -8.33333333333333e-02 387 387 1.25000000000000e+00 387 419 -8.33333333333333e-02 387 416 -8.33333333333333e-02 387 415 4.16666666666667e-02 387 418 -8.33333333333333e-02 387 398 8.33333333333333e-02 387 397 -4.16666666666667e-02 387 403 8.33333333333333e-02 387 396 -1.25000000000000e-01 387 148 -4.16666666666667e-02 387 145 4.16666666666667e-02 387 407 8.33333333333333e-02 387 395 -8.33333333333333e-02 387 47 8.33333333333333e-02 387 146 -8.33333333333333e-02 387 46 8.33333333333333e-02 387 388 -1.66666666666667e-01 387 394 1.66666666666667e-01 387 45 -3.75000000000000e-01 387 393 -2.50000000000000e-01 387 389 -1.66666666666667e-01 387 50 8.33333333333333e-02 387 149 8.33333333333333e-02 387 49 8.33333333333333e-02 387 406 -1.66666666666667e-01 387 404 8.33333333333333e-02 387 48 -3.75000000000000e-01 387 147 -1.25000000000000e-01 388 388 1.25000000000000e+00 388 419 -8.33333333333333e-02 388 414 4.16666666666667e-02 388 417 -8.33333333333333e-02 388 398 8.33333333333333e-02 388 404 -1.66666666666667e-01 388 397 -1.25000000000000e-01 388 396 -4.16666666666667e-02 388 402 8.33333333333333e-02 388 147 -4.16666666666667e-02 388 144 4.16666666666667e-02 388 149 8.33333333333333e-02 388 389 -1.66666666666667e-01 388 395 1.66666666666667e-01 388 47 -4.16666666666667e-02 388 146 4.16666666666667e-02 388 46 -1.25000000000000e-01 388 394 -7.50000000000000e-01 388 45 8.33333333333333e-02 388 387 -1.66666666666667e-01 388 393 1.66666666666667e-01 388 50 -4.16666666666667e-02 388 407 8.33333333333333e-02 388 416 4.16666666666667e-02 388 49 -1.25000000000000e-01 388 148 -1.25000000000000e-01 388 48 8.33333333333333e-02 388 405 -1.66666666666667e-01 389 389 1.25000000000000e+00 389 418 -8.33333333333333e-02 389 402 8.33333333333333e-02 389 417 -8.33333333333333e-02 389 414 -8.33333333333333e-02 389 398 -3.75000000000000e-01 389 397 8.33333333333333e-02 389 403 -1.66666666666667e-01 389 396 8.33333333333333e-02 389 148 8.33333333333333e-02 389 388 -1.66666666666667e-01 389 394 1.66666666666667e-01 389 405 8.33333333333333e-02 389 393 -8.33333333333333e-02 389 47 -1.25000000000000e-01 389 395 -2.50000000000000e-01 389 46 -4.16666666666667e-02 389 145 4.16666666666667e-02 389 45 8.33333333333333e-02 389 144 -8.33333333333333e-02 389 415 4.16666666666667e-02 389 50 -1.25000000000000e-01 389 149 -3.75000000000000e-01 389 49 -4.16666666666667e-02 389 406 8.33333333333333e-02 389 387 -1.66666666666667e-01 389 48 8.33333333333333e-02 389 147 8.33333333333333e-02 390 390 6.37500000000000e+01 390 401 4.25000000000000e+00 390 400 -2.12500000000000e+00 390 433 2.12500000000000e+00 390 434 2.12500000000000e+00 390 53 -2.12500000000000e+00 390 47 -2.12500000000000e+00 390 399 -6.37500000000000e+00 390 46 4.25000000000000e+00 390 391 -8.50000000000000e+00 390 52 4.25000000000000e+00 390 146 2.12500000000000e+00 390 145 2.12500000000000e+00 390 45 -6.37500000000000e+00 390 152 4.25000000000000e+00 390 151 -2.12500000000000e+00 390 150 -6.37500000000000e+00 390 392 -8.50000000000000e+00 390 51 -6.37500000000000e+00 390 437 -8.33333333333333e-02 390 404 -1.66666666666667e-01 390 403 8.33333333333333e-02 390 436 -8.33333333333333e-02 390 395 1.66666666666667e-01 390 425 8.33333333333333e-02 390 424 -1.66666666666667e-01 390 394 1.66666666666667e-01 390 393 -7.50000000000000e-01 390 1754 4.16666666666667e+00 390 1753 -8.33333333333333e+00 390 1757 8.33333333333333e+00 390 1756 8.33333333333333e+00 390 1755 -3.75000000000000e+01 390 1691 -4.16666666666667e+00 390 1690 -4.16666666666667e+00 390 1694 -8.33333333333333e+00 390 1693 4.16666666666667e+00 391 391 6.37500000000000e+01 391 432 2.12500000000000e+00 391 434 -4.25000000000000e+00 391 401 4.25000000000000e+00 391 400 -6.37500000000000e+00 391 45 4.25000000000000e+00 391 390 -8.50000000000000e+00 391 51 4.25000000000000e+00 391 146 -4.25000000000000e+00 391 47 4.25000000000000e+00 391 46 -1.91250000000000e+01 391 144 2.12500000000000e+00 391 152 4.25000000000000e+00 391 392 -8.50000000000000e+00 391 53 4.25000000000000e+00 391 151 -6.37500000000000e+00 391 399 -2.12500000000000e+00 391 52 -1.91250000000000e+01 391 150 -2.12500000000000e+00 391 437 -8.33333333333333e-02 391 402 8.33333333333333e-02 391 435 -8.33333333333333e-02 391 425 8.33333333333333e-02 391 395 -8.33333333333333e-02 391 423 -1.66666666666667e-01 391 404 8.33333333333333e-02 391 394 -2.50000000000000e-01 391 393 1.66666666666667e-01 391 1754 4.16666666666667e+00 391 1752 -8.33333333333333e+00 391 1757 -4.16666666666667e+00 391 1756 -1.25000000000000e+01 391 1755 8.33333333333333e+00 391 1694 4.16666666666667e+00 391 1691 -4.16666666666667e+00 391 1689 -4.16666666666667e+00 391 1692 4.16666666666667e+00 392 392 6.37500000000000e+01 392 399 4.25000000000000e+00 392 433 -4.25000000000000e+00 392 432 2.12500000000000e+00 392 51 -2.12500000000000e+00 392 401 -1.91250000000000e+01 392 400 4.25000000000000e+00 392 45 -2.12500000000000e+00 392 144 2.12500000000000e+00 392 47 -6.37500000000000e+00 392 145 -4.25000000000000e+00 392 46 4.25000000000000e+00 392 152 -1.91250000000000e+01 392 390 -8.50000000000000e+00 392 53 -6.37500000000000e+00 392 151 4.25000000000000e+00 392 391 -8.50000000000000e+00 392 52 4.25000000000000e+00 392 150 4.25000000000000e+00 392 435 -8.33333333333333e-02 392 403 8.33333333333333e-02 392 436 -8.33333333333333e-02 392 402 -1.66666666666667e-01 392 424 8.33333333333333e-02 392 394 -8.33333333333333e-02 392 393 1.66666666666667e-01 392 423 8.33333333333333e-02 392 395 -2.50000000000000e-01 392 1752 4.16666666666667e+00 392 1753 4.16666666666667e+00 392 1757 -1.25000000000000e+01 392 1756 -4.16666666666667e+00 392 1755 8.33333333333333e+00 392 1693 4.16666666666667e+00 392 1690 -4.16666666666667e+00 392 1689 -4.16666666666667e+00 392 1692 -8.33333333333333e+00 393 393 2.50000000000000e+00 393 437 8.33333333333333e-02 393 392 1.66666666666667e-01 393 152 -1.66666666666667e-01 393 151 8.33333333333333e-02 393 391 1.66666666666667e-01 393 390 -7.50000000000000e-01 393 425 -8.33333333333333e-02 393 424 1.66666666666667e-01 393 423 -2.50000000000000e-01 393 403 -8.33333333333333e-02 393 451 -8.33333333333333e-02 393 418 8.33333333333333e-02 393 404 1.66666666666667e-01 393 419 -1.66666666666667e-01 393 56 8.33333333333333e-02 393 452 -8.33333333333333e-02 393 47 8.33333333333333e-02 393 402 -2.50000000000000e-01 393 146 -8.33333333333333e-02 393 145 -8.33333333333333e-02 393 149 8.33333333333333e-02 393 389 -8.33333333333333e-02 393 394 -3.33333333333333e-01 393 148 8.33333333333333e-02 393 154 -8.33333333333333e-02 393 46 -1.66666666666667e-01 393 388 1.66666666666667e-01 393 387 -2.50000000000000e-01 393 395 -3.33333333333333e-01 393 407 1.66666666666667e-01 393 155 1.66666666666667e-01 393 406 1.66666666666667e-01 393 55 -1.66666666666667e-01 393 436 8.33333333333333e-02 393 405 -7.50000000000000e-01 393 153 -2.50000000000000e-01 394 394 2.50000000000000e+00 394 437 -1.66666666666667e-01 394 392 -8.33333333333333e-02 394 152 8.33333333333333e-02 394 150 8.33333333333333e-02 394 391 -2.50000000000000e-01 394 390 1.66666666666667e-01 394 425 1.66666666666667e-01 394 424 -7.50000000000000e-01 394 423 1.66666666666667e-01 394 402 -8.33333333333333e-02 394 450 -8.33333333333333e-02 394 417 8.33333333333333e-02 394 452 -8.33333333333333e-02 394 419 8.33333333333333e-02 394 395 -3.33333333333333e-01 394 404 1.66666666666667e-01 394 403 -2.50000000000000e-01 394 144 -8.33333333333333e-02 394 389 1.66666666666667e-01 394 393 -3.33333333333333e-01 394 149 -1.66666666666667e-01 394 155 1.66666666666667e-01 394 147 8.33333333333333e-02 394 153 -8.33333333333333e-02 394 47 8.33333333333333e-02 394 146 -8.33333333333333e-02 394 388 -7.50000000000000e-01 394 45 -1.66666666666667e-01 394 387 1.66666666666667e-01 394 407 -8.33333333333333e-02 394 56 8.33333333333333e-02 394 435 8.33333333333333e-02 394 406 -2.50000000000000e-01 394 154 -2.50000000000000e-01 394 405 1.66666666666667e-01 394 54 -1.66666666666667e-01 395 395 2.50000000000000e+00 395 435 8.33333333333333e-02 395 391 -8.33333333333333e-02 395 151 8.33333333333333e-02 395 390 1.66666666666667e-01 395 150 -1.66666666666667e-01 395 392 -2.50000000000000e-01 395 425 -2.50000000000000e-01 395 424 1.66666666666667e-01 395 423 -8.33333333333333e-02 395 451 -8.33333333333333e-02 395 418 8.33333333333333e-02 395 402 1.66666666666667e-01 395 417 -1.66666666666667e-01 395 54 8.33333333333333e-02 395 450 -8.33333333333333e-02 395 404 -7.50000000000000e-01 395 394 -3.33333333333333e-01 395 403 1.66666666666667e-01 395 45 8.33333333333333e-02 395 144 -8.33333333333333e-02 395 388 1.66666666666667e-01 395 147 8.33333333333333e-02 395 387 -8.33333333333333e-02 395 148 -1.66666666666667e-01 395 154 1.66666666666667e-01 395 389 -2.50000000000000e-01 395 46 8.33333333333333e-02 395 145 -8.33333333333333e-02 395 436 -1.66666666666667e-01 395 407 -2.50000000000000e-01 395 155 -7.50000000000000e-01 395 406 -8.33333333333333e-02 395 55 8.33333333333333e-02 395 393 -3.33333333333333e-01 395 405 1.66666666666667e-01 395 153 1.66666666666667e-01 396 396 1.25000000000000e+00 396 419 8.33333333333333e-02 396 418 -1.66666666666667e-01 396 389 8.33333333333333e-02 396 388 -4.16666666666667e-02 396 46 4.16666666666667e-02 396 387 -1.25000000000000e-01 396 416 8.33333333333333e-02 396 109 4.16666666666667e-02 396 414 -3.75000000000000e-01 396 404 -8.33333333333333e-02 396 398 -1.66666666666667e-01 396 238 -4.16666666666667e-02 396 641 -8.33333333333333e-02 396 245 8.33333333333333e-02 396 640 -8.33333333333333e-02 396 244 8.33333333333333e-02 396 239 8.33333333333333e-02 396 110 -8.33333333333333e-02 396 237 -1.25000000000000e-01 396 236 8.33333333333333e-02 396 47 -8.33333333333333e-02 396 235 8.33333333333333e-02 396 397 -1.66666666666667e-01 396 403 1.66666666666667e-01 396 234 -3.75000000000000e-01 396 415 8.33333333333333e-02 396 402 -2.50000000000000e-01 397 397 1.25000000000000e+00 397 414 8.33333333333333e-02 397 419 8.33333333333333e-02 397 417 -1.66666666666667e-01 397 389 8.33333333333333e-02 397 398 -1.66666666666667e-01 397 388 -1.25000000000000e-01 397 387 -4.16666666666667e-02 397 45 4.16666666666667e-02 397 415 -1.25000000000000e-01 397 108 4.16666666666667e-02 397 237 -4.16666666666667e-02 397 239 8.33333333333333e-02 397 404 1.66666666666667e-01 397 245 -1.66666666666667e-01 397 639 -8.33333333333333e-02 397 243 8.33333333333333e-02 397 110 4.16666666666667e-02 397 641 -8.33333333333333e-02 397 238 -1.25000000000000e-01 397 236 -4.16666666666667e-02 397 47 4.16666666666667e-02 397 235 -1.25000000000000e-01 397 416 -4.16666666666667e-02 397 403 -7.50000000000000e-01 397 234 8.33333333333333e-02 397 396 -1.66666666666667e-01 397 402 1.66666666666667e-01 398 398 1.25000000000000e+00 398 417 8.33333333333333e-02 398 418 8.33333333333333e-02 398 389 -3.75000000000000e-01 398 388 8.33333333333333e-02 398 397 -1.66666666666667e-01 398 387 8.33333333333333e-02 398 416 -1.25000000000000e-01 398 414 8.33333333333333e-02 398 402 -8.33333333333333e-02 398 396 -1.66666666666667e-01 398 238 8.33333333333333e-02 398 639 -8.33333333333333e-02 398 243 8.33333333333333e-02 398 403 1.66666666666667e-01 398 244 -1.66666666666667e-01 398 239 -3.75000000000000e-01 398 109 4.16666666666667e-02 398 640 -8.33333333333333e-02 398 237 8.33333333333333e-02 398 108 -8.33333333333333e-02 398 236 -1.25000000000000e-01 398 415 -4.16666666666667e-02 398 404 -2.50000000000000e-01 398 235 -4.16666666666667e-02 398 46 4.16666666666667e-02 398 234 8.33333333333333e-02 398 45 -8.33333333333333e-02 399 399 6.37500000000000e+01 399 391 -2.12500000000000e+00 399 113 2.12500000000000e+00 399 434 -2.12500000000000e+00 399 433 4.25000000000000e+00 399 400 -8.50000000000000e+00 399 432 -6.37500000000000e+00 399 47 2.12500000000000e+00 399 390 -6.37500000000000e+00 399 236 -2.12500000000000e+00 399 235 4.25000000000000e+00 399 46 2.12500000000000e+00 399 234 -6.37500000000000e+00 399 401 -8.50000000000000e+00 399 242 4.25000000000000e+00 399 241 -2.12500000000000e+00 399 112 2.12500000000000e+00 399 392 4.25000000000000e+00 399 240 -6.37500000000000e+00 399 437 8.33333333333333e-02 399 436 -1.66666666666667e-01 399 404 1.66666666666667e-01 399 245 -1.66666666666667e-01 399 646 -8.33333333333333e-02 399 244 8.33333333333333e-02 399 647 -8.33333333333333e-02 399 403 1.66666666666667e-01 399 402 -7.50000000000000e-01 399 1757 -8.33333333333333e+00 399 1756 4.16666666666667e+00 399 1754 -4.16666666666667e+00 399 1499 4.16666666666667e+00 399 1765 8.33333333333333e+00 399 1498 -8.33333333333333e+00 399 1753 -4.16666666666667e+00 399 1766 8.33333333333333e+00 399 1764 -3.75000000000000e+01 400 400 6.37500000000000e+01 400 434 4.25000000000000e+00 400 433 -1.91250000000000e+01 400 432 4.25000000000000e+00 400 399 -8.50000000000000e+00 400 392 4.25000000000000e+00 400 391 -6.37500000000000e+00 400 401 -8.50000000000000e+00 400 234 4.25000000000000e+00 400 47 -4.25000000000000e+00 400 236 4.25000000000000e+00 400 235 -1.91250000000000e+01 400 45 2.12500000000000e+00 400 242 4.25000000000000e+00 400 113 -4.25000000000000e+00 400 390 -2.12500000000000e+00 400 241 -6.37500000000000e+00 400 240 -2.12500000000000e+00 400 111 2.12500000000000e+00 400 437 8.33333333333333e-02 400 435 -1.66666666666667e-01 400 404 -8.33333333333333e-02 400 647 -8.33333333333333e-02 400 245 8.33333333333333e-02 400 645 -8.33333333333333e-02 400 243 8.33333333333333e-02 400 403 -2.50000000000000e-01 400 402 1.66666666666667e-01 400 1757 4.16666666666667e+00 400 1755 4.16666666666667e+00 400 1766 -4.16666666666667e+00 400 1754 -4.16666666666667e+00 400 1499 4.16666666666667e+00 400 1764 8.33333333333333e+00 400 1497 -8.33333333333333e+00 400 1752 -4.16666666666667e+00 400 1765 -1.25000000000000e+01 401 401 6.37500000000000e+01 401 434 -6.37500000000000e+00 401 433 4.25000000000000e+00 401 111 2.12500000000000e+00 401 432 -2.12500000000000e+00 401 392 -1.91250000000000e+01 401 391 4.25000000000000e+00 401 45 2.12500000000000e+00 401 400 -8.50000000000000e+00 401 234 -2.12500000000000e+00 401 236 -6.37500000000000e+00 401 46 -4.25000000000000e+00 401 235 4.25000000000000e+00 401 390 4.25000000000000e+00 401 242 -1.91250000000000e+01 401 241 4.25000000000000e+00 401 112 -4.25000000000000e+00 401 399 -8.50000000000000e+00 401 240 4.25000000000000e+00 401 436 8.33333333333333e-02 401 435 8.33333333333333e-02 401 403 -8.33333333333333e-02 401 646 -8.33333333333333e-02 401 244 8.33333333333333e-02 401 402 1.66666666666667e-01 401 243 -1.66666666666667e-01 401 645 -8.33333333333333e-02 401 404 -2.50000000000000e-01 401 1756 4.16666666666667e+00 401 1755 -8.33333333333333e+00 401 1765 -4.16666666666667e+00 401 1753 -4.16666666666667e+00 401 1498 4.16666666666667e+00 401 1752 -4.16666666666667e+00 401 1497 4.16666666666667e+00 401 1766 -1.25000000000000e+01 401 1764 8.33333333333333e+00 402 402 2.50000000000000e+00 402 436 1.66666666666667e-01 402 392 -1.66666666666667e-01 402 391 8.33333333333333e-02 402 435 -2.50000000000000e-01 402 401 1.66666666666667e-01 402 646 8.33333333333333e-02 402 400 1.66666666666667e-01 402 399 -7.50000000000000e-01 402 647 8.33333333333333e-02 402 394 -8.33333333333333e-02 402 395 1.66666666666667e-01 402 404 -3.33333333333333e-01 402 47 -8.33333333333333e-02 402 393 -2.50000000000000e-01 402 452 8.33333333333333e-02 402 116 -8.33333333333333e-02 402 451 -1.66666666666667e-01 402 389 8.33333333333333e-02 402 403 -3.33333333333333e-01 402 418 1.66666666666667e-01 402 388 8.33333333333333e-02 402 46 -8.33333333333333e-02 402 419 1.66666666666667e-01 402 115 -8.33333333333333e-02 402 417 -7.50000000000000e-01 402 398 -8.33333333333333e-02 402 236 8.33333333333333e-02 402 640 8.33333333333333e-02 402 244 -8.33333333333333e-02 402 235 -1.66666666666667e-01 402 397 1.66666666666667e-01 402 396 -2.50000000000000e-01 402 245 1.66666666666667e-01 402 641 -1.66666666666667e-01 402 243 -2.50000000000000e-01 402 437 -8.33333333333333e-02 403 403 2.50000000000000e+00 403 435 1.66666666666667e-01 403 390 8.33333333333333e-02 403 437 1.66666666666667e-01 403 436 -7.50000000000000e-01 403 401 -8.33333333333333e-02 403 645 8.33333333333333e-02 403 400 -2.50000000000000e-01 403 399 1.66666666666667e-01 403 647 -1.66666666666667e-01 403 393 -8.33333333333333e-02 403 452 8.33333333333333e-02 403 395 1.66666666666667e-01 403 394 -2.50000000000000e-01 403 450 -1.66666666666667e-01 403 419 -8.33333333333333e-02 403 402 -3.33333333333333e-01 403 417 1.66666666666667e-01 403 389 -1.66666666666667e-01 403 387 8.33333333333333e-02 403 45 -8.33333333333333e-02 403 418 -2.50000000000000e-01 403 114 -8.33333333333333e-02 403 398 1.66666666666667e-01 403 404 -3.33333333333333e-01 403 245 1.66666666666667e-01 403 639 8.33333333333333e-02 403 243 -8.33333333333333e-02 403 236 8.33333333333333e-02 403 47 -8.33333333333333e-02 403 397 -7.50000000000000e-01 403 234 -1.66666666666667e-01 403 396 1.66666666666667e-01 403 641 8.33333333333333e-02 403 116 -8.33333333333333e-02 403 244 -2.50000000000000e-01 403 392 8.33333333333333e-02 404 404 2.50000000000000e+00 404 435 -8.33333333333333e-02 404 390 -1.66666666666667e-01 404 437 -2.50000000000000e-01 404 436 1.66666666666667e-01 404 400 -8.33333333333333e-02 404 399 1.66666666666667e-01 404 401 -2.50000000000000e-01 404 646 -1.66666666666667e-01 404 645 8.33333333333333e-02 404 451 8.33333333333333e-02 404 393 1.66666666666667e-01 404 402 -3.33333333333333e-01 404 395 -7.50000000000000e-01 404 394 1.66666666666667e-01 404 45 -8.33333333333333e-02 404 450 8.33333333333333e-02 404 114 -8.33333333333333e-02 404 387 8.33333333333333e-02 404 418 -8.33333333333333e-02 404 388 -1.66666666666667e-01 404 419 -2.50000000000000e-01 404 417 1.66666666666667e-01 404 396 -8.33333333333333e-02 404 234 8.33333333333333e-02 404 397 1.66666666666667e-01 404 403 -3.33333333333333e-01 404 244 1.66666666666667e-01 404 398 -2.50000000000000e-01 404 235 8.33333333333333e-02 404 46 -8.33333333333333e-02 404 245 -7.50000000000000e-01 404 391 8.33333333333333e-02 404 640 8.33333333333333e-02 404 115 -8.33333333333333e-02 404 243 1.66666666666667e-01 404 639 -1.66666666666667e-01 405 405 2.50000000000000e+00 405 443 8.33333333333333e-02 405 442 -1.66666666666667e-01 405 412 1.66666666666667e-01 405 411 -7.50000000000000e-01 405 338 8.33333333333333e-02 405 337 8.33333333333333e-02 405 341 1.66666666666667e-01 405 340 -8.33333333333333e-02 405 339 -2.50000000000000e-01 405 407 -3.33333333333333e-01 405 50 -8.33333333333333e-02 405 56 -8.33333333333333e-02 405 455 -8.33333333333333e-02 405 452 8.33333333333333e-02 405 422 -1.66666666666667e-01 405 419 1.66666666666667e-01 405 421 8.33333333333333e-02 405 418 -8.33333333333333e-02 405 417 -2.50000000000000e-01 405 454 -8.33333333333333e-02 405 451 8.33333333333333e-02 405 149 -8.33333333333333e-02 405 389 8.33333333333333e-02 405 148 -8.33333333333333e-02 405 154 8.33333333333333e-02 405 388 -1.66666666666667e-01 405 49 1.66666666666667e-01 405 48 -2.50000000000000e-01 405 395 1.66666666666667e-01 405 155 -1.66666666666667e-01 405 394 1.66666666666667e-01 405 406 -3.33333333333333e-01 405 55 1.66666666666667e-01 405 393 -7.50000000000000e-01 405 413 1.66666666666667e-01 405 54 -2.50000000000000e-01 406 406 2.50000000000000e+00 406 413 -8.33333333333333e-02 406 441 -1.66666666666667e-01 406 412 -2.50000000000000e-01 406 411 1.66666666666667e-01 406 338 -1.66666666666667e-01 406 336 8.33333333333333e-02 406 341 1.66666666666667e-01 406 340 -2.50000000000000e-01 406 339 -8.33333333333333e-02 406 455 -8.33333333333333e-02 406 422 8.33333333333333e-02 406 50 1.66666666666667e-01 406 407 -3.33333333333333e-01 406 419 1.66666666666667e-01 406 418 -2.50000000000000e-01 406 420 8.33333333333333e-02 406 417 -8.33333333333333e-02 406 56 1.66666666666667e-01 406 452 -1.66666666666667e-01 406 453 -8.33333333333333e-02 406 450 8.33333333333333e-02 406 147 -8.33333333333333e-02 406 153 8.33333333333333e-02 406 389 8.33333333333333e-02 406 149 -8.33333333333333e-02 406 49 -7.50000000000000e-01 406 387 -1.66666666666667e-01 406 48 1.66666666666667e-01 406 395 -8.33333333333333e-02 406 155 8.33333333333333e-02 406 394 -2.50000000000000e-01 406 443 8.33333333333333e-02 406 55 -7.50000000000000e-01 406 393 1.66666666666667e-01 406 405 -3.33333333333333e-01 406 54 1.66666666666667e-01 407 407 2.50000000000000e+00 407 412 -8.33333333333333e-02 407 411 1.66666666666667e-01 407 441 8.33333333333333e-02 407 413 -2.50000000000000e-01 407 336 8.33333333333333e-02 407 337 -1.66666666666667e-01 407 341 -7.50000000000000e-01 407 340 1.66666666666667e-01 407 339 1.66666666666667e-01 407 405 -3.33333333333333e-01 407 48 -8.33333333333333e-02 407 54 -8.33333333333333e-02 407 453 -8.33333333333333e-02 407 450 8.33333333333333e-02 407 454 -8.33333333333333e-02 407 421 8.33333333333333e-02 407 419 -7.50000000000000e-01 407 49 1.66666666666667e-01 407 406 -3.33333333333333e-01 407 418 1.66666666666667e-01 407 420 -1.66666666666667e-01 407 417 1.66666666666667e-01 407 55 1.66666666666667e-01 407 451 -1.66666666666667e-01 407 147 -8.33333333333333e-02 407 387 8.33333333333333e-02 407 50 -2.50000000000000e-01 407 388 8.33333333333333e-02 407 148 -8.33333333333333e-02 407 395 -2.50000000000000e-01 407 442 8.33333333333333e-02 407 56 -2.50000000000000e-01 407 394 -8.33333333333333e-02 407 154 8.33333333333333e-02 407 393 1.66666666666667e-01 407 153 -1.66666666666667e-01 408 408 1.25000000000000e+00 408 413 -8.33333333333333e-02 408 346 -4.16666666666667e-02 408 337 4.16666666666667e-02 408 347 8.33333333333333e-02 408 67 8.33333333333333e-02 408 517 -1.66666666666667e-01 408 345 -1.25000000000000e-01 408 338 -8.33333333333333e-02 408 409 -1.66666666666667e-01 408 412 1.66666666666667e-01 408 49 8.33333333333333e-02 408 411 -2.50000000000000e-01 408 527 -8.33333333333333e-02 408 422 8.33333333333333e-02 408 68 8.33333333333333e-02 408 251 -8.33333333333333e-02 408 250 4.16666666666667e-02 408 526 -8.33333333333333e-02 408 66 -3.75000000000000e-01 408 410 -1.66666666666667e-01 408 248 8.33333333333333e-02 408 50 8.33333333333333e-02 408 247 -4.16666666666667e-02 408 421 8.33333333333333e-02 408 518 8.33333333333333e-02 408 246 -1.25000000000000e-01 408 48 -3.75000000000000e-01 409 409 1.25000000000000e+00 409 347 8.33333333333333e-02 409 413 1.66666666666667e-01 409 345 -4.16666666666667e-02 409 336 4.16666666666667e-02 409 68 -4.16666666666667e-02 409 518 8.33333333333333e-02 409 346 -1.25000000000000e-01 409 66 8.33333333333333e-02 409 516 -1.66666666666667e-01 409 338 4.16666666666667e-02 409 50 -4.16666666666667e-02 409 412 -7.50000000000000e-01 409 408 -1.66666666666667e-01 409 411 1.66666666666667e-01 409 48 8.33333333333333e-02 409 251 4.16666666666667e-02 409 527 -8.33333333333333e-02 409 67 -1.25000000000000e-01 409 249 4.16666666666667e-02 409 525 -8.33333333333333e-02 409 248 8.33333333333333e-02 409 422 -1.66666666666667e-01 409 410 -1.66666666666667e-01 409 247 -1.25000000000000e-01 409 49 -1.25000000000000e-01 409 246 -4.16666666666667e-02 409 420 8.33333333333333e-02 410 410 1.25000000000000e+00 410 411 -8.33333333333333e-02 410 409 -1.66666666666667e-01 410 346 8.33333333333333e-02 410 412 1.66666666666667e-01 410 347 -3.75000000000000e-01 410 67 -4.16666666666667e-02 410 517 8.33333333333333e-02 410 345 8.33333333333333e-02 410 413 -2.50000000000000e-01 410 337 4.16666666666667e-02 410 49 -4.16666666666667e-02 410 336 -8.33333333333333e-02 410 250 4.16666666666667e-02 410 526 -8.33333333333333e-02 410 525 -8.33333333333333e-02 410 420 8.33333333333333e-02 410 68 -1.25000000000000e-01 410 66 8.33333333333333e-02 410 249 -8.33333333333333e-02 410 516 8.33333333333333e-02 410 248 -3.75000000000000e-01 410 50 -1.25000000000000e-01 410 247 8.33333333333333e-02 410 421 -1.66666666666667e-01 410 408 -1.66666666666667e-01 410 246 8.33333333333333e-02 410 48 8.33333333333333e-02 411 411 2.50000000000000e+00 411 454 8.33333333333333e-02 411 559 -8.33333333333333e-02 411 422 1.66666666666667e-01 411 527 -1.66666666666667e-01 411 421 -8.33333333333333e-02 411 526 8.33333333333333e-02 411 560 -8.33333333333333e-02 411 420 -2.50000000000000e-01 411 347 8.33333333333333e-02 411 410 -8.33333333333333e-02 411 346 8.33333333333333e-02 411 518 1.66666666666667e-01 411 413 -3.33333333333333e-01 411 517 1.66666666666667e-01 411 516 -7.50000000000000e-01 411 409 1.66666666666667e-01 411 408 -2.50000000000000e-01 411 412 -3.33333333333333e-01 411 349 -8.33333333333333e-02 411 350 1.66666666666667e-01 411 341 -1.66666666666667e-01 411 407 1.66666666666667e-01 411 337 -8.33333333333333e-02 411 340 8.33333333333333e-02 411 74 8.33333333333333e-02 411 443 -8.33333333333333e-02 411 73 -1.66666666666667e-01 411 442 1.66666666666667e-01 411 348 -2.50000000000000e-01 411 441 -2.50000000000000e-01 411 338 -8.33333333333333e-02 411 50 8.33333333333333e-02 411 406 1.66666666666667e-01 411 49 -1.66666666666667e-01 411 455 8.33333333333333e-02 411 405 -7.50000000000000e-01 412 412 2.50000000000000e+00 412 453 8.33333333333333e-02 412 558 -8.33333333333333e-02 412 560 -8.33333333333333e-02 412 527 8.33333333333333e-02 412 420 -8.33333333333333e-02 412 525 8.33333333333333e-02 412 422 1.66666666666667e-01 412 421 -2.50000000000000e-01 412 410 1.66666666666667e-01 412 347 -1.66666666666667e-01 412 345 8.33333333333333e-02 412 518 -8.33333333333333e-02 412 74 8.33333333333333e-02 412 517 -2.50000000000000e-01 412 516 1.66666666666667e-01 412 50 8.33333333333333e-02 412 409 -7.50000000000000e-01 412 408 1.66666666666667e-01 412 407 -8.33333333333333e-02 412 411 -3.33333333333333e-01 412 348 -8.33333333333333e-02 412 341 8.33333333333333e-02 412 338 -8.33333333333333e-02 412 336 -8.33333333333333e-02 412 339 8.33333333333333e-02 412 350 1.66666666666667e-01 412 443 1.66666666666667e-01 412 413 -3.33333333333333e-01 412 349 -2.50000000000000e-01 412 442 -7.50000000000000e-01 412 72 -1.66666666666667e-01 412 441 1.66666666666667e-01 412 455 -1.66666666666667e-01 412 406 -2.50000000000000e-01 412 405 1.66666666666667e-01 412 48 -1.66666666666667e-01 413 413 2.50000000000000e+00 413 454 -1.66666666666667e-01 413 559 -8.33333333333333e-02 413 526 8.33333333333333e-02 413 420 1.66666666666667e-01 413 525 -1.66666666666667e-01 413 558 -8.33333333333333e-02 413 422 -7.50000000000000e-01 413 421 1.66666666666667e-01 413 345 8.33333333333333e-02 413 408 -8.33333333333333e-02 413 409 1.66666666666667e-01 413 346 -1.66666666666667e-01 413 518 -2.50000000000000e-01 413 517 -8.33333333333333e-02 413 73 8.33333333333333e-02 413 516 1.66666666666667e-01 413 411 -3.33333333333333e-01 413 410 -2.50000000000000e-01 413 49 8.33333333333333e-02 413 406 -8.33333333333333e-02 413 340 8.33333333333333e-02 413 337 -8.33333333333333e-02 413 348 1.66666666666667e-01 413 339 -1.66666666666667e-01 413 405 1.66666666666667e-01 413 350 -7.50000000000000e-01 413 443 -2.50000000000000e-01 413 349 1.66666666666667e-01 413 442 1.66666666666667e-01 413 412 -3.33333333333333e-01 413 72 8.33333333333333e-02 413 441 -8.33333333333333e-02 413 453 8.33333333333333e-02 413 407 -2.50000000000000e-01 413 336 -8.33333333333333e-02 413 48 8.33333333333333e-02 414 414 1.25000000000000e+00 414 415 -1.66666666666667e-01 414 389 -8.33333333333333e-02 414 49 -4.16666666666667e-02 414 388 4.16666666666667e-02 414 398 8.33333333333333e-02 414 109 -4.16666666666667e-02 414 396 -3.75000000000000e-01 414 640 8.33333333333333e-02 414 419 -8.33333333333333e-02 414 418 1.66666666666667e-01 414 417 -2.50000000000000e-01 414 641 8.33333333333333e-02 414 422 8.33333333333333e-02 414 644 -8.33333333333333e-02 414 253 4.16666666666667e-02 414 643 -8.33333333333333e-02 414 110 8.33333333333333e-02 414 254 -8.33333333333333e-02 414 108 -1.25000000000000e-01 414 416 -1.66666666666667e-01 414 248 8.33333333333333e-02 414 50 8.33333333333333e-02 414 247 8.33333333333333e-02 414 421 -1.66666666666667e-01 414 397 8.33333333333333e-02 414 246 -3.75000000000000e-01 414 48 -1.25000000000000e-01 415 415 1.25000000000000e+00 415 389 4.16666666666667e-02 415 396 8.33333333333333e-02 415 414 -1.66666666666667e-01 415 48 -4.16666666666667e-02 415 387 4.16666666666667e-02 415 397 -1.25000000000000e-01 415 108 -4.16666666666667e-02 415 639 8.33333333333333e-02 415 50 8.33333333333333e-02 415 416 -1.66666666666667e-01 415 419 1.66666666666667e-01 415 418 -7.50000000000000e-01 415 417 1.66666666666667e-01 415 110 8.33333333333333e-02 415 641 -1.66666666666667e-01 415 252 4.16666666666667e-02 415 642 -8.33333333333333e-02 415 254 4.16666666666667e-02 415 644 -8.33333333333333e-02 415 109 -1.25000000000000e-01 415 248 -4.16666666666667e-02 415 422 8.33333333333333e-02 415 398 -4.16666666666667e-02 415 247 -1.25000000000000e-01 415 49 -1.25000000000000e-01 415 246 8.33333333333333e-02 415 420 -1.66666666666667e-01 416 416 1.25000000000000e+00 416 388 4.16666666666667e-02 416 387 -8.33333333333333e-02 416 398 -1.25000000000000e-01 416 396 8.33333333333333e-02 416 419 -2.50000000000000e-01 416 49 8.33333333333333e-02 416 415 -1.66666666666667e-01 416 418 1.66666666666667e-01 416 417 -8.33333333333333e-02 416 109 8.33333333333333e-02 416 640 -1.66666666666667e-01 416 639 8.33333333333333e-02 416 420 8.33333333333333e-02 416 642 -8.33333333333333e-02 416 110 -3.75000000000000e-01 416 253 4.16666666666667e-02 416 643 -8.33333333333333e-02 416 108 8.33333333333333e-02 416 252 -8.33333333333333e-02 416 397 -4.16666666666667e-02 416 248 -1.25000000000000e-01 416 50 -3.75000000000000e-01 416 247 -4.16666666666667e-02 416 421 8.33333333333333e-02 416 414 -1.66666666666667e-01 416 246 8.33333333333333e-02 416 48 8.33333333333333e-02 417 417 2.50000000000000e+00 417 395 -1.66666666666667e-01 417 398 8.33333333333333e-02 417 389 -8.33333333333333e-02 417 397 -1.66666666666667e-01 417 403 1.66666666666667e-01 417 388 -8.33333333333333e-02 417 404 1.66666666666667e-01 417 402 -7.50000000000000e-01 417 643 8.33333333333333e-02 417 640 -8.33333333333333e-02 417 644 -1.66666666666667e-01 417 641 1.66666666666667e-01 417 50 8.33333333333333e-02 417 416 -8.33333333333333e-02 417 415 1.66666666666667e-01 417 418 -3.33333333333333e-01 417 414 -2.50000000000000e-01 417 116 8.33333333333333e-02 417 639 -2.50000000000000e-01 417 452 -8.33333333333333e-02 417 455 8.33333333333333e-02 417 653 -8.33333333333333e-02 417 421 1.66666666666667e-01 417 454 -1.66666666666667e-01 417 451 1.66666666666667e-01 417 422 1.66666666666667e-01 417 407 1.66666666666667e-01 417 419 -3.33333333333333e-01 417 49 8.33333333333333e-02 417 406 -8.33333333333333e-02 417 420 -7.50000000000000e-01 417 405 -2.50000000000000e-01 417 652 -8.33333333333333e-02 417 115 8.33333333333333e-02 417 394 8.33333333333333e-02 417 450 -2.50000000000000e-01 418 418 2.50000000000000e+00 418 395 8.33333333333333e-02 418 389 -8.33333333333333e-02 418 398 8.33333333333333e-02 418 404 -8.33333333333333e-02 418 396 -1.66666666666667e-01 418 402 1.66666666666667e-01 418 387 -8.33333333333333e-02 418 403 -2.50000000000000e-01 418 642 8.33333333333333e-02 418 639 -8.33333333333333e-02 418 644 8.33333333333333e-02 418 416 1.66666666666667e-01 418 415 -7.50000000000000e-01 418 414 1.66666666666667e-01 418 417 -3.33333333333333e-01 418 641 1.66666666666667e-01 418 640 -2.50000000000000e-01 418 419 -3.33333333333333e-01 418 422 -8.33333333333333e-02 418 420 1.66666666666667e-01 418 455 8.33333333333333e-02 418 653 -8.33333333333333e-02 418 453 -1.66666666666667e-01 418 450 1.66666666666667e-01 418 50 -1.66666666666667e-01 418 407 1.66666666666667e-01 418 421 -2.50000000000000e-01 418 406 -2.50000000000000e-01 418 48 8.33333333333333e-02 418 405 -8.33333333333333e-02 418 452 1.66666666666667e-01 418 116 -1.66666666666667e-01 418 393 8.33333333333333e-02 418 451 -7.50000000000000e-01 418 651 -8.33333333333333e-02 418 114 8.33333333333333e-02 419 419 2.50000000000000e+00 419 393 -1.66666666666667e-01 419 388 -8.33333333333333e-02 419 396 8.33333333333333e-02 419 387 -8.33333333333333e-02 419 397 8.33333333333333e-02 419 403 -8.33333333333333e-02 419 404 -2.50000000000000e-01 419 402 1.66666666666667e-01 419 643 8.33333333333333e-02 419 642 -1.66666666666667e-01 419 639 1.66666666666667e-01 419 416 -2.50000000000000e-01 419 415 1.66666666666667e-01 419 48 8.33333333333333e-02 419 414 -8.33333333333333e-02 419 641 -7.50000000000000e-01 419 640 1.66666666666667e-01 419 114 8.33333333333333e-02 419 418 -3.33333333333333e-01 419 450 -8.33333333333333e-02 419 421 -8.33333333333333e-02 419 453 8.33333333333333e-02 419 651 -8.33333333333333e-02 419 454 8.33333333333333e-02 419 652 -8.33333333333333e-02 419 422 -2.50000000000000e-01 419 407 -7.50000000000000e-01 419 49 -1.66666666666667e-01 419 406 1.66666666666667e-01 419 420 1.66666666666667e-01 419 405 1.66666666666667e-01 419 417 -3.33333333333333e-01 419 394 8.33333333333333e-02 419 452 -2.50000000000000e-01 419 451 1.66666666666667e-01 419 115 -1.66666666666667e-01 420 420 2.50000000000000e+00 420 412 -8.33333333333333e-02 420 560 8.33333333333333e-02 420 559 -1.66666666666667e-01 420 411 -2.50000000000000e-01 420 410 8.33333333333333e-02 420 526 1.66666666666667e-01 420 527 1.66666666666667e-01 420 525 -7.50000000000000e-01 420 409 8.33333333333333e-02 420 422 -3.33333333333333e-01 420 50 -8.33333333333333e-02 420 122 -8.33333333333333e-02 420 455 -8.33333333333333e-02 420 653 8.33333333333333e-02 420 454 1.66666666666667e-01 420 421 -3.33333333333333e-01 420 418 1.66666666666667e-01 420 407 -1.66666666666667e-01 420 419 1.66666666666667e-01 420 49 -8.33333333333333e-02 420 406 8.33333333333333e-02 420 417 -7.50000000000000e-01 420 121 -8.33333333333333e-02 420 652 8.33333333333333e-02 420 453 -2.50000000000000e-01 420 248 -8.33333333333333e-02 420 416 8.33333333333333e-02 420 259 8.33333333333333e-02 420 643 -8.33333333333333e-02 420 415 -1.66666666666667e-01 420 247 1.66666666666667e-01 420 246 -2.50000000000000e-01 420 644 1.66666666666667e-01 420 260 -1.66666666666667e-01 420 642 -2.50000000000000e-01 420 413 1.66666666666667e-01 421 421 2.50000000000000e+00 421 411 -8.33333333333333e-02 421 558 -1.66666666666667e-01 421 413 1.66666666666667e-01 421 412 -2.50000000000000e-01 421 527 -8.33333333333333e-02 421 525 1.66666666666667e-01 421 526 -2.50000000000000e-01 421 410 -1.66666666666667e-01 421 408 8.33333333333333e-02 421 407 8.33333333333333e-02 421 419 -8.33333333333333e-02 421 453 1.66666666666667e-01 421 420 -3.33333333333333e-01 421 417 1.66666666666667e-01 421 418 -2.50000000000000e-01 421 48 -8.33333333333333e-02 421 405 8.33333333333333e-02 421 455 1.66666666666667e-01 421 653 -1.66666666666667e-01 421 454 -7.50000000000000e-01 421 120 -8.33333333333333e-02 421 651 8.33333333333333e-02 421 248 1.66666666666667e-01 421 422 -3.33333333333333e-01 421 644 1.66666666666667e-01 421 258 8.33333333333333e-02 421 642 -8.33333333333333e-02 421 416 8.33333333333333e-02 421 50 -8.33333333333333e-02 421 247 -7.50000000000000e-01 421 414 -1.66666666666667e-01 421 246 1.66666666666667e-01 421 260 8.33333333333333e-02 421 122 -8.33333333333333e-02 421 643 -2.50000000000000e-01 421 560 8.33333333333333e-02 422 422 2.50000000000000e+00 422 411 1.66666666666667e-01 422 558 8.33333333333333e-02 422 413 -7.50000000000000e-01 422 412 1.66666666666667e-01 422 526 -8.33333333333333e-02 422 408 8.33333333333333e-02 422 527 -2.50000000000000e-01 422 525 1.66666666666667e-01 422 409 -1.66666666666667e-01 422 420 -3.33333333333333e-01 422 48 -8.33333333333333e-02 422 120 -8.33333333333333e-02 422 406 8.33333333333333e-02 422 418 -8.33333333333333e-02 422 453 -8.33333333333333e-02 422 651 8.33333333333333e-02 422 419 -2.50000000000000e-01 422 405 -1.66666666666667e-01 422 417 1.66666666666667e-01 422 455 -2.50000000000000e-01 422 454 1.66666666666667e-01 422 652 -1.66666666666667e-01 422 246 -8.33333333333333e-02 422 414 8.33333333333333e-02 422 247 1.66666666666667e-01 422 421 -3.33333333333333e-01 422 643 1.66666666666667e-01 422 248 -2.50000000000000e-01 422 415 8.33333333333333e-02 422 49 -8.33333333333333e-02 422 644 -7.50000000000000e-01 422 559 8.33333333333333e-02 422 259 8.33333333333333e-02 422 121 -8.33333333333333e-02 422 642 1.66666666666667e-01 422 258 -1.66666666666667e-01 423 423 2.50000000000000e+00 423 431 -8.33333333333333e-02 423 445 -1.66666666666667e-01 423 430 1.66666666666667e-01 423 429 -2.50000000000000e-01 423 356 -1.66666666666667e-01 423 355 8.33333333333333e-02 423 359 1.66666666666667e-01 423 358 -8.33333333333333e-02 423 357 -2.50000000000000e-01 423 458 -8.33333333333333e-02 423 440 8.33333333333333e-02 423 53 1.66666666666667e-01 423 425 -3.33333333333333e-01 423 437 1.66666666666667e-01 423 439 8.33333333333333e-02 423 436 -8.33333333333333e-02 423 435 -2.50000000000000e-01 423 56 1.66666666666667e-01 423 452 -1.66666666666667e-01 423 457 -8.33333333333333e-02 423 451 8.33333333333333e-02 423 151 -8.33333333333333e-02 423 154 8.33333333333333e-02 423 392 8.33333333333333e-02 423 152 -8.33333333333333e-02 423 52 1.66666666666667e-01 423 391 -1.66666666666667e-01 423 51 -7.50000000000000e-01 423 395 -8.33333333333333e-02 423 155 8.33333333333333e-02 423 424 -3.33333333333333e-01 423 394 1.66666666666667e-01 423 55 1.66666666666667e-01 423 446 8.33333333333333e-02 423 393 -2.50000000000000e-01 423 54 -7.50000000000000e-01 424 424 2.50000000000000e+00 424 446 8.33333333333333e-02 424 444 -1.66666666666667e-01 424 430 -7.50000000000000e-01 424 429 1.66666666666667e-01 424 356 8.33333333333333e-02 424 354 8.33333333333333e-02 424 359 1.66666666666667e-01 424 358 -2.50000000000000e-01 424 357 -8.33333333333333e-02 424 425 -3.33333333333333e-01 424 56 -8.33333333333333e-02 424 53 -8.33333333333333e-02 424 452 8.33333333333333e-02 424 458 -8.33333333333333e-02 424 440 -1.66666666666667e-01 424 437 1.66666666666667e-01 424 436 -2.50000000000000e-01 424 438 8.33333333333333e-02 424 435 -8.33333333333333e-02 424 456 -8.33333333333333e-02 424 450 8.33333333333333e-02 424 392 8.33333333333333e-02 424 152 -8.33333333333333e-02 424 150 -8.33333333333333e-02 424 153 8.33333333333333e-02 424 52 -2.50000000000000e-01 424 51 1.66666666666667e-01 424 390 -1.66666666666667e-01 424 395 1.66666666666667e-01 424 155 -1.66666666666667e-01 424 431 1.66666666666667e-01 424 394 -7.50000000000000e-01 424 55 -2.50000000000000e-01 424 423 -3.33333333333333e-01 424 393 1.66666666666667e-01 424 54 1.66666666666667e-01 425 425 2.50000000000000e+00 425 429 -8.33333333333333e-02 425 430 1.66666666666667e-01 425 445 8.33333333333333e-02 425 431 -2.50000000000000e-01 425 355 8.33333333333333e-02 425 354 -1.66666666666667e-01 425 359 -7.50000000000000e-01 425 358 1.66666666666667e-01 425 357 1.66666666666667e-01 425 424 -3.33333333333333e-01 425 55 -8.33333333333333e-02 425 52 -8.33333333333333e-02 425 451 8.33333333333333e-02 425 457 -8.33333333333333e-02 425 456 -8.33333333333333e-02 425 438 8.33333333333333e-02 425 437 -7.50000000000000e-01 425 439 -1.66666666666667e-01 425 436 1.66666666666667e-01 425 51 1.66666666666667e-01 425 423 -3.33333333333333e-01 425 435 1.66666666666667e-01 425 54 1.66666666666667e-01 425 450 -1.66666666666667e-01 425 391 8.33333333333333e-02 425 151 -8.33333333333333e-02 425 53 -2.50000000000000e-01 425 390 8.33333333333333e-02 425 150 -8.33333333333333e-02 425 444 8.33333333333333e-02 425 395 -2.50000000000000e-01 425 56 -2.50000000000000e-01 425 394 1.66666666666667e-01 425 154 -1.66666666666667e-01 425 393 -8.33333333333333e-02 425 153 8.33333333333333e-02 426 426 6.37500000000000e+01 426 365 4.25000000000000e+00 426 364 -2.12500000000000e+00 426 363 -6.37500000000000e+00 426 355 2.12500000000000e+00 426 428 -8.50000000000000e+00 426 278 4.25000000000000e+00 426 280 2.12500000000000e+00 426 277 -2.12500000000000e+00 426 53 -2.12500000000000e+00 426 52 4.25000000000000e+00 426 51 -6.37500000000000e+00 426 276 -6.37500000000000e+00 426 92 -2.12500000000000e+00 426 281 2.12500000000000e+00 426 427 -8.50000000000000e+00 426 91 4.25000000000000e+00 426 356 2.12500000000000e+00 426 90 -6.37500000000000e+00 426 431 1.66666666666667e-01 426 611 8.33333333333333e-02 426 610 -1.66666666666667e-01 426 430 1.66666666666667e-01 426 429 -7.50000000000000e-01 426 614 -8.33333333333333e-02 426 613 -8.33333333333333e-02 426 440 -1.66666666666667e-01 426 439 8.33333333333333e-02 426 1729 4.16666666666667e+00 426 1720 -4.16666666666667e+00 426 1721 -4.16666666666667e+00 426 1730 -8.33333333333333e+00 426 1793 8.33333333333333e+00 426 1787 4.16666666666667e+00 426 1786 -8.33333333333333e+00 426 1792 8.33333333333333e+00 426 1791 -3.75000000000000e+01 427 427 6.37500000000000e+01 427 364 -6.37500000000000e+00 427 363 -2.12500000000000e+00 427 356 -4.25000000000000e+00 427 354 2.12500000000000e+00 427 279 2.12500000000000e+00 427 276 -2.12500000000000e+00 427 53 4.25000000000000e+00 427 428 -8.50000000000000e+00 427 278 4.25000000000000e+00 427 52 -1.91250000000000e+01 427 277 -6.37500000000000e+00 427 51 4.25000000000000e+00 427 92 4.25000000000000e+00 427 281 -4.25000000000000e+00 427 365 4.25000000000000e+00 427 91 -1.91250000000000e+01 427 426 -8.50000000000000e+00 427 90 4.25000000000000e+00 427 431 -8.33333333333333e-02 427 609 -1.66666666666667e-01 427 430 -2.50000000000000e-01 427 429 1.66666666666667e-01 427 614 -8.33333333333333e-02 427 440 8.33333333333333e-02 427 612 -8.33333333333333e-02 427 611 8.33333333333333e-02 427 438 8.33333333333333e-02 427 1728 4.16666666666667e+00 427 1719 -4.16666666666667e+00 427 1730 4.16666666666667e+00 427 1721 -4.16666666666667e+00 427 1793 -4.16666666666667e+00 427 1787 4.16666666666667e+00 427 1785 -8.33333333333333e+00 427 1792 -1.25000000000000e+01 427 1791 8.33333333333333e+00 428 428 6.37500000000000e+01 428 365 -1.91250000000000e+01 428 364 4.25000000000000e+00 428 363 4.25000000000000e+00 428 355 -4.25000000000000e+00 428 426 -8.50000000000000e+00 428 276 4.25000000000000e+00 428 53 -6.37500000000000e+00 428 278 -1.91250000000000e+01 428 52 4.25000000000000e+00 428 427 -8.50000000000000e+00 428 277 4.25000000000000e+00 428 51 -2.12500000000000e+00 428 354 2.12500000000000e+00 428 92 -6.37500000000000e+00 428 91 4.25000000000000e+00 428 280 -4.25000000000000e+00 428 90 -2.12500000000000e+00 428 279 2.12500000000000e+00 428 430 -8.33333333333333e-02 428 429 1.66666666666667e-01 428 609 8.33333333333333e-02 428 431 -2.50000000000000e-01 428 612 -8.33333333333333e-02 428 613 -8.33333333333333e-02 428 439 8.33333333333333e-02 428 610 8.33333333333333e-02 428 438 -1.66666666666667e-01 428 1719 -4.16666666666667e+00 428 1729 4.16666666666667e+00 428 1728 -8.33333333333333e+00 428 1720 -4.16666666666667e+00 428 1792 -4.16666666666667e+00 428 1786 4.16666666666667e+00 428 1791 8.33333333333333e+00 428 1785 4.16666666666667e+00 428 1793 -1.25000000000000e+01 429 429 2.50000000000000e+00 429 457 8.33333333333333e-02 429 619 -8.33333333333333e-02 429 614 8.33333333333333e-02 429 620 -8.33333333333333e-02 429 613 8.33333333333333e-02 429 439 -8.33333333333333e-02 429 440 1.66666666666667e-01 429 438 -2.50000000000000e-01 429 365 -1.66666666666667e-01 429 428 1.66666666666667e-01 429 364 8.33333333333333e-02 429 95 8.33333333333333e-02 429 611 -8.33333333333333e-02 429 610 1.66666666666667e-01 429 609 -2.50000000000000e-01 429 53 8.33333333333333e-02 429 427 1.66666666666667e-01 429 426 -7.50000000000000e-01 429 425 -8.33333333333333e-02 429 430 -3.33333333333333e-01 429 367 -8.33333333333333e-02 429 359 8.33333333333333e-02 429 356 -8.33333333333333e-02 429 358 8.33333333333333e-02 429 355 -8.33333333333333e-02 429 368 1.66666666666667e-01 429 446 1.66666666666667e-01 429 431 -3.33333333333333e-01 429 94 -1.66666666666667e-01 429 445 1.66666666666667e-01 429 366 -2.50000000000000e-01 429 444 -7.50000000000000e-01 429 424 1.66666666666667e-01 429 52 -1.66666666666667e-01 429 458 -1.66666666666667e-01 429 423 -2.50000000000000e-01 430 430 2.50000000000000e+00 430 456 8.33333333333333e-02 430 618 -8.33333333333333e-02 430 614 -1.66666666666667e-01 430 440 1.66666666666667e-01 430 612 8.33333333333333e-02 430 438 -8.33333333333333e-02 430 620 -8.33333333333333e-02 430 439 -2.50000000000000e-01 430 365 8.33333333333333e-02 430 428 -8.33333333333333e-02 430 363 8.33333333333333e-02 430 611 1.66666666666667e-01 430 431 -3.33333333333333e-01 430 610 -7.50000000000000e-01 430 609 1.66666666666667e-01 430 427 -2.50000000000000e-01 430 426 1.66666666666667e-01 430 429 -3.33333333333333e-01 430 366 -8.33333333333333e-02 430 368 1.66666666666667e-01 430 359 -1.66666666666667e-01 430 425 1.66666666666667e-01 430 357 8.33333333333333e-02 430 354 -8.33333333333333e-02 430 95 8.33333333333333e-02 430 446 -8.33333333333333e-02 430 367 -2.50000000000000e-01 430 445 -2.50000000000000e-01 430 93 -1.66666666666667e-01 430 444 1.66666666666667e-01 430 356 -8.33333333333333e-02 430 53 8.33333333333333e-02 430 458 8.33333333333333e-02 430 424 -7.50000000000000e-01 430 423 1.66666666666667e-01 430 51 -1.66666666666667e-01 431 431 2.50000000000000e+00 431 456 -1.66666666666667e-01 431 612 8.33333333333333e-02 431 618 -8.33333333333333e-02 431 613 -1.66666666666667e-01 431 439 1.66666666666667e-01 431 619 -8.33333333333333e-02 431 440 -7.50000000000000e-01 431 438 1.66666666666667e-01 431 364 8.33333333333333e-02 431 427 -8.33333333333333e-02 431 363 -1.66666666666667e-01 431 426 1.66666666666667e-01 431 611 -2.50000000000000e-01 431 610 1.66666666666667e-01 431 430 -3.33333333333333e-01 431 93 8.33333333333333e-02 431 609 -8.33333333333333e-02 431 428 -2.50000000000000e-01 431 51 8.33333333333333e-02 431 423 -8.33333333333333e-02 431 367 1.66666666666667e-01 431 357 8.33333333333333e-02 431 354 -8.33333333333333e-02 431 358 -1.66666666666667e-01 431 424 1.66666666666667e-01 431 368 -7.50000000000000e-01 431 446 -2.50000000000000e-01 431 94 8.33333333333333e-02 431 445 -8.33333333333333e-02 431 366 1.66666666666667e-01 431 444 1.66666666666667e-01 431 429 -3.33333333333333e-01 431 457 8.33333333333333e-02 431 425 -2.50000000000000e-01 431 355 -8.33333333333333e-02 431 52 8.33333333333333e-02 432 432 6.37500000000000e+01 432 401 -2.12500000000000e+00 432 400 4.25000000000000e+00 432 399 -6.37500000000000e+00 432 392 2.12500000000000e+00 432 284 2.12500000000000e+00 432 278 -2.12500000000000e+00 432 433 -8.50000000000000e+00 432 277 4.25000000000000e+00 432 53 4.25000000000000e+00 432 52 -2.12500000000000e+00 432 51 -6.37500000000000e+00 432 276 -6.37500000000000e+00 432 434 -8.50000000000000e+00 432 113 4.25000000000000e+00 432 112 -2.12500000000000e+00 432 283 2.12500000000000e+00 432 391 2.12500000000000e+00 432 111 -6.37500000000000e+00 432 646 8.33333333333333e-02 432 647 -1.66666666666667e-01 432 437 1.66666666666667e-01 432 436 1.66666666666667e-01 432 435 -7.50000000000000e-01 432 649 -8.33333333333333e-02 432 650 -8.33333333333333e-02 432 440 8.33333333333333e-02 432 439 -1.66666666666667e-01 432 1756 -4.16666666666667e+00 432 1766 4.16666666666667e+00 432 1765 -8.33333333333333e+00 432 1757 -4.16666666666667e+00 432 1798 8.33333333333333e+00 432 1787 -8.33333333333333e+00 432 1786 4.16666666666667e+00 432 1799 8.33333333333333e+00 432 1797 -3.75000000000000e+01 433 433 6.37500000000000e+01 433 401 4.25000000000000e+00 433 400 -1.91250000000000e+01 433 399 4.25000000000000e+00 433 392 -4.25000000000000e+00 433 432 -8.50000000000000e+00 433 276 4.25000000000000e+00 433 53 4.25000000000000e+00 433 434 -8.50000000000000e+00 433 278 4.25000000000000e+00 433 52 -6.37500000000000e+00 433 277 -1.91250000000000e+01 433 51 -2.12500000000000e+00 433 113 4.25000000000000e+00 433 284 -4.25000000000000e+00 433 390 2.12500000000000e+00 433 112 -6.37500000000000e+00 433 111 -2.12500000000000e+00 433 282 2.12500000000000e+00 433 645 8.33333333333333e-02 433 647 8.33333333333333e-02 433 437 -8.33333333333333e-02 433 436 -2.50000000000000e-01 433 435 1.66666666666667e-01 433 440 8.33333333333333e-02 433 650 -8.33333333333333e-02 433 648 -8.33333333333333e-02 433 438 -1.66666666666667e-01 433 1755 -4.16666666666667e+00 433 1766 4.16666666666667e+00 433 1757 -4.16666666666667e+00 433 1764 -8.33333333333333e+00 433 1787 4.16666666666667e+00 433 1799 -4.16666666666667e+00 433 1797 8.33333333333333e+00 433 1785 4.16666666666667e+00 433 1798 -1.25000000000000e+01 434 434 6.37500000000000e+01 434 401 -6.37500000000000e+00 434 400 4.25000000000000e+00 434 399 -2.12500000000000e+00 434 391 -4.25000000000000e+00 434 390 2.12500000000000e+00 434 282 2.12500000000000e+00 434 276 -2.12500000000000e+00 434 53 -1.91250000000000e+01 434 278 -6.37500000000000e+00 434 52 4.25000000000000e+00 434 433 -8.50000000000000e+00 434 277 4.25000000000000e+00 434 51 4.25000000000000e+00 434 113 -1.91250000000000e+01 434 112 4.25000000000000e+00 434 283 -4.25000000000000e+00 434 432 -8.50000000000000e+00 434 111 4.25000000000000e+00 434 646 8.33333333333333e-02 434 645 -1.66666666666667e-01 434 437 -2.50000000000000e-01 434 436 -8.33333333333333e-02 434 435 1.66666666666667e-01 434 439 8.33333333333333e-02 434 649 -8.33333333333333e-02 434 648 -8.33333333333333e-02 434 438 8.33333333333333e-02 434 1756 -4.16666666666667e+00 434 1764 4.16666666666667e+00 434 1755 -4.16666666666667e+00 434 1786 4.16666666666667e+00 434 1798 -4.16666666666667e+00 434 1785 -8.33333333333333e+00 434 1765 4.16666666666667e+00 434 1799 -1.25000000000000e+01 434 1797 8.33333333333333e+00 435 435 2.50000000000000e+00 435 395 8.33333333333333e-02 435 392 -8.33333333333333e-02 435 404 -8.33333333333333e-02 435 401 8.33333333333333e-02 435 403 1.66666666666667e-01 435 400 -1.66666666666667e-01 435 391 -8.33333333333333e-02 435 402 -2.50000000000000e-01 435 649 8.33333333333333e-02 435 646 -8.33333333333333e-02 435 650 8.33333333333333e-02 435 434 1.66666666666667e-01 435 433 1.66666666666667e-01 435 436 -3.33333333333333e-01 435 432 -7.50000000000000e-01 435 647 1.66666666666667e-01 435 645 -2.50000000000000e-01 435 437 -3.33333333333333e-01 435 440 -8.33333333333333e-02 435 439 1.66666666666667e-01 435 656 -8.33333333333333e-02 435 458 8.33333333333333e-02 435 457 -1.66666666666667e-01 435 451 1.66666666666667e-01 435 53 -1.66666666666667e-01 435 425 1.66666666666667e-01 435 52 8.33333333333333e-02 435 424 -8.33333333333333e-02 435 438 -2.50000000000000e-01 435 423 -2.50000000000000e-01 435 452 1.66666666666667e-01 435 116 -1.66666666666667e-01 435 655 -8.33333333333333e-02 435 115 8.33333333333333e-02 435 394 8.33333333333333e-02 435 450 -7.50000000000000e-01 436 436 2.50000000000000e+00 436 395 -1.66666666666667e-01 436 392 -8.33333333333333e-02 436 401 8.33333333333333e-02 436 402 1.66666666666667e-01 436 399 -1.66666666666667e-01 436 390 -8.33333333333333e-02 436 404 1.66666666666667e-01 436 403 -7.50000000000000e-01 436 648 8.33333333333333e-02 436 645 -8.33333333333333e-02 436 647 1.66666666666667e-01 436 650 -1.66666666666667e-01 436 434 -8.33333333333333e-02 436 53 8.33333333333333e-02 436 433 -2.50000000000000e-01 436 432 1.66666666666667e-01 436 435 -3.33333333333333e-01 436 116 8.33333333333333e-02 436 646 -2.50000000000000e-01 436 452 -8.33333333333333e-02 436 458 8.33333333333333e-02 436 656 -8.33333333333333e-02 436 438 1.66666666666667e-01 436 456 -1.66666666666667e-01 436 450 1.66666666666667e-01 436 440 1.66666666666667e-01 436 425 1.66666666666667e-01 436 437 -3.33333333333333e-01 436 439 -7.50000000000000e-01 436 424 -2.50000000000000e-01 436 51 8.33333333333333e-02 436 423 -8.33333333333333e-02 436 393 8.33333333333333e-02 436 451 -2.50000000000000e-01 436 654 -8.33333333333333e-02 436 114 8.33333333333333e-02 437 437 2.50000000000000e+00 437 393 8.33333333333333e-02 437 390 -8.33333333333333e-02 437 391 -8.33333333333333e-02 437 400 8.33333333333333e-02 437 402 -8.33333333333333e-02 437 399 8.33333333333333e-02 437 404 -2.50000000000000e-01 437 403 1.66666666666667e-01 437 646 1.66666666666667e-01 437 649 -1.66666666666667e-01 437 648 8.33333333333333e-02 437 434 -2.50000000000000e-01 437 433 -8.33333333333333e-02 437 52 8.33333333333333e-02 437 432 1.66666666666667e-01 437 647 -7.50000000000000e-01 437 115 8.33333333333333e-02 437 645 1.66666666666667e-01 437 451 -8.33333333333333e-02 437 435 -3.33333333333333e-01 437 438 -8.33333333333333e-02 437 457 8.33333333333333e-02 437 655 -8.33333333333333e-02 437 654 -8.33333333333333e-02 437 456 8.33333333333333e-02 437 440 -2.50000000000000e-01 437 425 -7.50000000000000e-01 437 439 1.66666666666667e-01 437 424 1.66666666666667e-01 437 436 -3.33333333333333e-01 437 51 -1.66666666666667e-01 437 423 1.66666666666667e-01 437 394 -1.66666666666667e-01 437 452 -2.50000000000000e-01 437 450 1.66666666666667e-01 437 114 -1.66666666666667e-01 438 438 2.50000000000000e+00 438 430 -8.33333333333333e-02 438 619 -1.66666666666667e-01 438 431 1.66666666666667e-01 438 429 -2.50000000000000e-01 438 614 -8.33333333333333e-02 438 613 1.66666666666667e-01 438 612 -2.50000000000000e-01 438 428 -1.66666666666667e-01 438 427 8.33333333333333e-02 438 425 8.33333333333333e-02 438 437 -8.33333333333333e-02 438 439 -3.33333333333333e-01 438 457 1.66666666666667e-01 438 436 1.66666666666667e-01 438 458 1.66666666666667e-01 438 656 -1.66666666666667e-01 438 130 -8.33333333333333e-02 438 655 8.33333333333333e-02 438 456 -7.50000000000000e-01 438 52 -8.33333333333333e-02 438 424 8.33333333333333e-02 438 435 -2.50000000000000e-01 438 278 1.66666666666667e-01 438 440 -3.33333333333333e-01 438 650 1.66666666666667e-01 438 286 8.33333333333333e-02 438 649 -8.33333333333333e-02 438 434 8.33333333333333e-02 438 53 -8.33333333333333e-02 438 277 1.66666666666667e-01 438 433 -1.66666666666667e-01 438 276 -7.50000000000000e-01 438 287 8.33333333333333e-02 438 131 -8.33333333333333e-02 438 648 -2.50000000000000e-01 438 620 8.33333333333333e-02 439 439 2.50000000000000e+00 439 429 -8.33333333333333e-02 439 620 8.33333333333333e-02 439 618 -1.66666666666667e-01 439 430 -2.50000000000000e-01 439 428 8.33333333333333e-02 439 612 1.66666666666667e-01 439 614 1.66666666666667e-01 439 613 -7.50000000000000e-01 439 426 8.33333333333333e-02 439 440 -3.33333333333333e-01 439 53 -8.33333333333333e-02 439 131 -8.33333333333333e-02 439 458 -8.33333333333333e-02 439 656 8.33333333333333e-02 439 438 -3.33333333333333e-01 439 456 1.66666666666667e-01 439 435 1.66666666666667e-01 439 457 -2.50000000000000e-01 439 129 -8.33333333333333e-02 439 654 8.33333333333333e-02 439 425 -1.66666666666667e-01 439 437 1.66666666666667e-01 439 436 -7.50000000000000e-01 439 51 -8.33333333333333e-02 439 423 8.33333333333333e-02 439 278 -8.33333333333333e-02 439 434 8.33333333333333e-02 439 285 8.33333333333333e-02 439 648 -8.33333333333333e-02 439 277 -2.50000000000000e-01 439 276 1.66666666666667e-01 439 432 -1.66666666666667e-01 439 287 -1.66666666666667e-01 439 650 1.66666666666667e-01 439 649 -2.50000000000000e-01 439 431 1.66666666666667e-01 440 440 2.50000000000000e+00 440 430 1.66666666666667e-01 440 619 8.33333333333333e-02 440 431 -7.50000000000000e-01 440 429 1.66666666666667e-01 440 612 -8.33333333333333e-02 440 427 8.33333333333333e-02 440 614 -2.50000000000000e-01 440 613 1.66666666666667e-01 440 426 -1.66666666666667e-01 440 439 -3.33333333333333e-01 440 52 -8.33333333333333e-02 440 130 -8.33333333333333e-02 440 423 8.33333333333333e-02 440 435 -8.33333333333333e-02 440 457 -8.33333333333333e-02 440 655 8.33333333333333e-02 440 458 -2.50000000000000e-01 440 456 1.66666666666667e-01 440 654 -1.66666666666667e-01 440 437 -2.50000000000000e-01 440 424 -1.66666666666667e-01 440 436 1.66666666666667e-01 440 277 -8.33333333333333e-02 440 433 8.33333333333333e-02 440 276 1.66666666666667e-01 440 438 -3.33333333333333e-01 440 648 1.66666666666667e-01 440 278 -2.50000000000000e-01 440 432 8.33333333333333e-02 440 51 -8.33333333333333e-02 440 650 -7.50000000000000e-01 440 618 8.33333333333333e-02 440 286 -1.66666666666667e-01 440 649 1.66666666666667e-01 440 285 8.33333333333333e-02 440 129 -8.33333333333333e-02 441 441 2.50000000000000e+00 441 376 -8.33333333333333e-02 441 371 -1.66666666666667e-01 441 377 1.66666666666667e-01 441 375 -2.50000000000000e-01 441 554 8.33333333333333e-02 441 553 -1.66666666666667e-01 441 449 -8.33333333333333e-02 441 448 1.66666666666667e-01 441 447 -2.50000000000000e-01 441 340 -8.33333333333333e-02 441 349 8.33333333333333e-02 441 350 8.33333333333333e-02 441 413 -8.33333333333333e-02 441 73 1.66666666666667e-01 441 442 -3.33333333333333e-01 441 412 1.66666666666667e-01 441 411 -2.50000000000000e-01 441 341 -8.33333333333333e-02 441 407 8.33333333333333e-02 441 55 1.66666666666667e-01 441 406 -1.66666666666667e-01 441 293 -8.33333333333333e-02 441 290 8.33333333333333e-02 441 74 1.66666666666667e-01 441 560 -1.66666666666667e-01 441 559 8.33333333333333e-02 441 292 -8.33333333333333e-02 441 72 -7.50000000000000e-01 441 443 -3.33333333333333e-01 441 455 1.66666666666667e-01 441 56 1.66666666666667e-01 441 454 -8.33333333333333e-02 441 289 8.33333333333333e-02 441 370 8.33333333333333e-02 441 453 -2.50000000000000e-01 441 54 -7.50000000000000e-01 442 442 2.50000000000000e+00 442 375 -8.33333333333333e-02 442 377 1.66666666666667e-01 442 371 8.33333333333333e-02 442 376 -2.50000000000000e-01 442 554 8.33333333333333e-02 442 552 -1.66666666666667e-01 442 449 1.66666666666667e-01 442 448 -7.50000000000000e-01 442 447 1.66666666666667e-01 442 443 -3.33333333333333e-01 442 56 -8.33333333333333e-02 442 74 -8.33333333333333e-02 442 407 8.33333333333333e-02 442 341 -8.33333333333333e-02 442 339 -8.33333333333333e-02 442 348 8.33333333333333e-02 442 350 -1.66666666666667e-01 442 413 1.66666666666667e-01 442 412 -7.50000000000000e-01 442 72 1.66666666666667e-01 442 441 -3.33333333333333e-01 442 411 1.66666666666667e-01 442 54 1.66666666666667e-01 442 405 -1.66666666666667e-01 442 560 8.33333333333333e-02 442 293 -8.33333333333333e-02 442 73 -2.50000000000000e-01 442 558 8.33333333333333e-02 442 291 -8.33333333333333e-02 442 455 1.66666666666667e-01 442 290 -1.66666666666667e-01 442 369 8.33333333333333e-02 442 454 -2.50000000000000e-01 442 55 -2.50000000000000e-01 442 453 -8.33333333333333e-02 442 288 8.33333333333333e-02 443 443 2.50000000000000e+00 443 370 8.33333333333333e-02 443 369 -1.66666666666667e-01 443 377 -7.50000000000000e-01 443 375 1.66666666666667e-01 443 553 8.33333333333333e-02 443 552 8.33333333333333e-02 443 449 -2.50000000000000e-01 443 448 1.66666666666667e-01 443 447 -8.33333333333333e-02 443 442 -3.33333333333333e-01 443 55 -8.33333333333333e-02 443 73 -8.33333333333333e-02 443 406 8.33333333333333e-02 443 340 -8.33333333333333e-02 443 413 -2.50000000000000e-01 443 349 -1.66666666666667e-01 443 412 1.66666666666667e-01 443 348 8.33333333333333e-02 443 411 -8.33333333333333e-02 443 339 -8.33333333333333e-02 443 405 8.33333333333333e-02 443 559 8.33333333333333e-02 443 292 -8.33333333333333e-02 443 291 -8.33333333333333e-02 443 288 8.33333333333333e-02 443 74 -2.50000000000000e-01 443 72 1.66666666666667e-01 443 558 -1.66666666666667e-01 443 376 1.66666666666667e-01 443 455 -7.50000000000000e-01 443 56 -2.50000000000000e-01 443 454 1.66666666666667e-01 443 289 -1.66666666666667e-01 443 441 -3.33333333333333e-01 443 453 1.66666666666667e-01 443 54 1.66666666666667e-01 444 444 2.50000000000000e+00 444 382 -8.33333333333333e-02 444 383 1.66666666666667e-01 444 371 8.33333333333333e-02 444 381 -2.50000000000000e-01 444 617 8.33333333333333e-02 444 616 -1.66666666666667e-01 444 449 1.66666666666667e-01 444 448 1.66666666666667e-01 444 447 -7.50000000000000e-01 444 446 -3.33333333333333e-01 444 95 -8.33333333333333e-02 444 56 -8.33333333333333e-02 444 359 -8.33333333333333e-02 444 425 8.33333333333333e-02 444 358 -8.33333333333333e-02 444 367 8.33333333333333e-02 444 368 -1.66666666666667e-01 444 431 1.66666666666667e-01 444 94 1.66666666666667e-01 444 445 -3.33333333333333e-01 444 430 1.66666666666667e-01 444 429 -7.50000000000000e-01 444 55 1.66666666666667e-01 444 424 -1.66666666666667e-01 444 296 -8.33333333333333e-02 444 620 8.33333333333333e-02 444 619 8.33333333333333e-02 444 295 -8.33333333333333e-02 444 93 -2.50000000000000e-01 444 458 1.66666666666667e-01 444 290 -1.66666666666667e-01 444 457 -8.33333333333333e-02 444 289 8.33333333333333e-02 444 456 -2.50000000000000e-01 444 370 8.33333333333333e-02 444 54 -2.50000000000000e-01 445 445 2.50000000000000e+00 445 381 -8.33333333333333e-02 445 371 -1.66666666666667e-01 445 383 1.66666666666667e-01 445 382 -2.50000000000000e-01 445 617 8.33333333333333e-02 445 615 -1.66666666666667e-01 445 449 -8.33333333333333e-02 445 448 -2.50000000000000e-01 445 447 1.66666666666667e-01 445 357 -8.33333333333333e-02 445 366 8.33333333333333e-02 445 368 8.33333333333333e-02 445 431 -8.33333333333333e-02 445 430 -2.50000000000000e-01 445 93 1.66666666666667e-01 445 444 -3.33333333333333e-01 445 429 1.66666666666667e-01 445 359 -8.33333333333333e-02 445 425 8.33333333333333e-02 445 54 1.66666666666667e-01 445 423 -1.66666666666667e-01 445 296 -8.33333333333333e-02 445 290 8.33333333333333e-02 445 620 -1.66666666666667e-01 445 95 1.66666666666667e-01 445 94 -7.50000000000000e-01 445 618 8.33333333333333e-02 445 294 -8.33333333333333e-02 445 458 1.66666666666667e-01 445 446 -3.33333333333333e-01 445 56 1.66666666666667e-01 445 457 -2.50000000000000e-01 445 369 8.33333333333333e-02 445 55 -7.50000000000000e-01 445 456 -8.33333333333333e-02 445 288 8.33333333333333e-02 446 446 2.50000000000000e+00 446 370 -1.66666666666667e-01 446 369 8.33333333333333e-02 446 383 -7.50000000000000e-01 446 382 1.66666666666667e-01 446 615 8.33333333333333e-02 446 616 8.33333333333333e-02 446 449 -2.50000000000000e-01 446 448 -8.33333333333333e-02 446 447 1.66666666666667e-01 446 444 -3.33333333333333e-01 446 93 -8.33333333333333e-02 446 54 -8.33333333333333e-02 446 357 -8.33333333333333e-02 446 423 8.33333333333333e-02 446 431 -2.50000000000000e-01 446 367 8.33333333333333e-02 446 430 -8.33333333333333e-02 446 366 -1.66666666666667e-01 446 429 1.66666666666667e-01 446 358 -8.33333333333333e-02 446 424 8.33333333333333e-02 446 294 -8.33333333333333e-02 446 618 8.33333333333333e-02 446 295 -8.33333333333333e-02 446 289 8.33333333333333e-02 446 95 -2.50000000000000e-01 446 619 -1.66666666666667e-01 446 94 1.66666666666667e-01 446 458 -7.50000000000000e-01 446 381 1.66666666666667e-01 446 56 -2.50000000000000e-01 446 457 1.66666666666667e-01 446 445 -3.33333333333333e-01 446 55 1.66666666666667e-01 446 456 1.66666666666667e-01 446 288 -1.66666666666667e-01 447 447 2.50000000000000e+00 447 383 -1.66666666666667e-01 447 617 -8.33333333333333e-02 447 295 8.33333333333333e-02 447 296 8.33333333333333e-02 447 616 1.66666666666667e-01 447 615 -2.50000000000000e-01 447 446 1.66666666666667e-01 447 445 1.66666666666667e-01 447 444 -7.50000000000000e-01 447 370 -8.33333333333333e-02 447 371 -8.33333333333333e-02 447 385 -8.33333333333333e-02 447 376 8.33333333333333e-02 447 377 8.33333333333333e-02 447 386 1.66666666666667e-01 447 449 -3.33333333333333e-01 447 384 -2.50000000000000e-01 447 289 -8.33333333333333e-02 447 448 -3.33333333333333e-01 447 554 1.66666666666667e-01 447 298 -8.33333333333333e-02 447 292 8.33333333333333e-02 447 290 1.66666666666667e-01 447 293 -1.66666666666667e-01 447 101 8.33333333333333e-02 447 299 -8.33333333333333e-02 447 553 1.66666666666667e-01 447 100 -1.66666666666667e-01 447 552 -7.50000000000000e-01 447 443 -8.33333333333333e-02 447 56 8.33333333333333e-02 447 442 1.66666666666667e-01 447 55 -1.66666666666667e-01 447 441 -2.50000000000000e-01 447 382 8.33333333333333e-02 447 288 -2.50000000000000e-01 448 448 2.50000000000000e+00 448 383 8.33333333333333e-02 448 617 1.66666666666667e-01 448 294 8.33333333333333e-02 448 296 -1.66666666666667e-01 448 616 -7.50000000000000e-01 448 615 1.66666666666667e-01 448 446 -8.33333333333333e-02 448 445 -2.50000000000000e-01 448 444 1.66666666666667e-01 448 369 -8.33333333333333e-02 448 386 1.66666666666667e-01 448 384 -8.33333333333333e-02 448 375 8.33333333333333e-02 448 377 -1.66666666666667e-01 448 101 8.33333333333333e-02 448 385 -2.50000000000000e-01 448 371 -8.33333333333333e-02 448 56 8.33333333333333e-02 448 288 -8.33333333333333e-02 448 554 -8.33333333333333e-02 448 447 -3.33333333333333e-01 448 297 -8.33333333333333e-02 448 291 8.33333333333333e-02 448 299 -8.33333333333333e-02 448 293 8.33333333333333e-02 448 553 -2.50000000000000e-01 448 552 1.66666666666667e-01 448 99 -1.66666666666667e-01 448 443 1.66666666666667e-01 448 449 -3.33333333333333e-01 448 290 1.66666666666667e-01 448 442 -7.50000000000000e-01 448 381 8.33333333333333e-02 448 289 -2.50000000000000e-01 448 441 1.66666666666667e-01 448 54 -1.66666666666667e-01 449 449 2.50000000000000e+00 449 381 -1.66666666666667e-01 449 615 -8.33333333333333e-02 449 616 1.66666666666667e-01 449 295 -1.66666666666667e-01 449 294 8.33333333333333e-02 449 617 -2.50000000000000e-01 449 446 -2.50000000000000e-01 449 445 -8.33333333333333e-02 449 444 1.66666666666667e-01 449 369 -8.33333333333333e-02 449 385 1.66666666666667e-01 449 376 -1.66666666666667e-01 449 375 8.33333333333333e-02 449 386 -7.50000000000000e-01 449 100 8.33333333333333e-02 449 384 1.66666666666667e-01 449 447 -3.33333333333333e-01 449 370 -8.33333333333333e-02 449 55 8.33333333333333e-02 449 553 -8.33333333333333e-02 449 552 1.66666666666667e-01 449 298 -8.33333333333333e-02 449 292 8.33333333333333e-02 449 288 1.66666666666667e-01 449 291 -1.66666666666667e-01 449 554 -2.50000000000000e-01 449 99 8.33333333333333e-02 449 297 -8.33333333333333e-02 449 443 -2.50000000000000e-01 449 382 8.33333333333333e-02 449 290 -7.50000000000000e-01 449 442 1.66666666666667e-01 449 448 -3.33333333333333e-01 449 289 1.66666666666667e-01 449 441 -8.33333333333333e-02 449 54 8.33333333333333e-02 450 450 2.50000000000000e+00 450 425 -1.66666666666667e-01 450 424 8.33333333333333e-02 450 437 1.66666666666667e-01 450 435 -7.50000000000000e-01 450 655 8.33333333333333e-02 450 656 8.33333333333333e-02 450 458 -8.33333333333333e-02 450 457 1.66666666666667e-01 450 456 -2.50000000000000e-01 450 394 -8.33333333333333e-02 450 395 -8.33333333333333e-02 450 404 8.33333333333333e-02 450 403 -1.66666666666667e-01 450 407 8.33333333333333e-02 450 419 -8.33333333333333e-02 450 451 -3.33333333333333e-01 450 418 1.66666666666667e-01 450 406 8.33333333333333e-02 450 55 -8.33333333333333e-02 450 115 -8.33333333333333e-02 450 417 -2.50000000000000e-01 450 290 8.33333333333333e-02 450 302 -8.33333333333333e-02 450 652 8.33333333333333e-02 450 301 -8.33333333333333e-02 450 116 1.66666666666667e-01 450 653 -1.66666666666667e-01 450 114 -2.50000000000000e-01 450 452 -3.33333333333333e-01 450 455 1.66666666666667e-01 450 56 1.66666666666667e-01 450 454 1.66666666666667e-01 450 289 -1.66666666666667e-01 450 436 1.66666666666667e-01 450 453 -7.50000000000000e-01 450 54 -2.50000000000000e-01 451 451 2.50000000000000e+00 451 437 -8.33333333333333e-02 451 435 1.66666666666667e-01 451 423 8.33333333333333e-02 451 436 -2.50000000000000e-01 451 654 8.33333333333333e-02 451 656 -1.66666666666667e-01 451 458 1.66666666666667e-01 451 457 -7.50000000000000e-01 451 456 1.66666666666667e-01 451 393 -8.33333333333333e-02 451 395 -8.33333333333333e-02 451 404 8.33333333333333e-02 451 402 -1.66666666666667e-01 451 450 -3.33333333333333e-01 451 417 1.66666666666667e-01 451 407 -1.66666666666667e-01 451 56 1.66666666666667e-01 451 405 8.33333333333333e-02 451 54 -8.33333333333333e-02 451 419 1.66666666666667e-01 451 452 -3.33333333333333e-01 451 116 1.66666666666667e-01 451 418 -7.50000000000000e-01 451 114 -8.33333333333333e-02 451 651 8.33333333333333e-02 451 300 -8.33333333333333e-02 451 653 8.33333333333333e-02 451 302 -8.33333333333333e-02 451 115 -2.50000000000000e-01 451 455 -8.33333333333333e-02 451 290 8.33333333333333e-02 451 425 8.33333333333333e-02 451 454 -2.50000000000000e-01 451 55 -2.50000000000000e-01 451 453 1.66666666666667e-01 451 288 -1.66666666666667e-01 452 452 2.50000000000000e+00 452 436 -8.33333333333333e-02 452 423 -1.66666666666667e-01 452 437 -2.50000000000000e-01 452 435 1.66666666666667e-01 452 655 -1.66666666666667e-01 452 654 8.33333333333333e-02 452 458 -2.50000000000000e-01 452 457 1.66666666666667e-01 452 456 -8.33333333333333e-02 452 394 -8.33333333333333e-02 452 403 8.33333333333333e-02 452 393 -8.33333333333333e-02 452 402 8.33333333333333e-02 452 405 8.33333333333333e-02 452 417 -8.33333333333333e-02 452 406 -1.66666666666667e-01 452 55 1.66666666666667e-01 452 419 -2.50000000000000e-01 452 418 1.66666666666667e-01 452 451 -3.33333333333333e-01 452 115 1.66666666666667e-01 452 288 8.33333333333333e-02 452 300 -8.33333333333333e-02 452 116 -7.50000000000000e-01 452 652 8.33333333333333e-02 452 301 -8.33333333333333e-02 452 114 1.66666666666667e-01 452 651 -1.66666666666667e-01 452 424 8.33333333333333e-02 452 455 -2.50000000000000e-01 452 56 -7.50000000000000e-01 452 454 -8.33333333333333e-02 452 289 8.33333333333333e-02 452 450 -3.33333333333333e-01 452 453 1.66666666666667e-01 452 54 1.66666666666667e-01 453 453 2.50000000000000e+00 453 412 8.33333333333333e-02 453 559 1.66666666666667e-01 453 293 8.33333333333333e-02 453 292 -1.66666666666667e-01 453 560 1.66666666666667e-01 453 558 -7.50000000000000e-01 453 443 1.66666666666667e-01 453 442 -8.33333333333333e-02 453 441 -2.50000000000000e-01 453 407 -8.33333333333333e-02 453 422 -8.33333333333333e-02 453 419 8.33333333333333e-02 453 421 1.66666666666667e-01 453 418 -1.66666666666667e-01 453 121 8.33333333333333e-02 453 420 -2.50000000000000e-01 453 406 -8.33333333333333e-02 453 55 8.33333333333333e-02 453 290 -8.33333333333333e-02 453 455 -3.33333333333333e-01 453 652 -8.33333333333333e-02 453 305 -8.33333333333333e-02 453 302 8.33333333333333e-02 453 304 -8.33333333333333e-02 453 301 8.33333333333333e-02 453 653 1.66666666666667e-01 453 122 -1.66666666666667e-01 453 651 -2.50000000000000e-01 453 452 1.66666666666667e-01 453 56 -1.66666666666667e-01 453 451 1.66666666666667e-01 453 454 -3.33333333333333e-01 453 289 1.66666666666667e-01 453 450 -7.50000000000000e-01 453 413 8.33333333333333e-02 453 288 -2.50000000000000e-01 454 454 2.50000000000000e+00 454 411 8.33333333333333e-02 454 560 -8.33333333333333e-02 454 293 8.33333333333333e-02 454 558 1.66666666666667e-01 454 291 -1.66666666666667e-01 454 559 -2.50000000000000e-01 454 443 1.66666666666667e-01 454 442 -2.50000000000000e-01 454 441 -8.33333333333333e-02 454 407 -8.33333333333333e-02 454 420 1.66666666666667e-01 454 419 8.33333333333333e-02 454 417 -1.66666666666667e-01 454 422 1.66666666666667e-01 454 455 -3.33333333333333e-01 454 421 -7.50000000000000e-01 454 120 8.33333333333333e-02 454 405 -8.33333333333333e-02 454 54 8.33333333333333e-02 454 651 -8.33333333333333e-02 454 653 1.66666666666667e-01 454 290 1.66666666666667e-01 454 302 -1.66666666666667e-01 454 303 -8.33333333333333e-02 454 300 8.33333333333333e-02 454 122 8.33333333333333e-02 454 305 -8.33333333333333e-02 454 652 -2.50000000000000e-01 454 452 -8.33333333333333e-02 454 56 8.33333333333333e-02 454 451 -2.50000000000000e-01 454 413 -1.66666666666667e-01 454 289 -7.50000000000000e-01 454 450 1.66666666666667e-01 454 453 -3.33333333333333e-01 454 288 1.66666666666667e-01 455 455 2.50000000000000e+00 455 412 -1.66666666666667e-01 455 559 -8.33333333333333e-02 455 292 8.33333333333333e-02 455 291 8.33333333333333e-02 455 560 -2.50000000000000e-01 455 558 1.66666666666667e-01 455 443 -7.50000000000000e-01 455 442 1.66666666666667e-01 455 441 1.66666666666667e-01 455 405 -8.33333333333333e-02 455 406 -8.33333333333333e-02 455 420 -8.33333333333333e-02 455 417 8.33333333333333e-02 455 418 8.33333333333333e-02 455 422 -2.50000000000000e-01 455 421 1.66666666666667e-01 455 454 -3.33333333333333e-01 455 288 -8.33333333333333e-02 455 453 -3.33333333333333e-01 455 652 1.66666666666667e-01 455 303 -8.33333333333333e-02 455 300 8.33333333333333e-02 455 289 1.66666666666667e-01 455 301 -1.66666666666667e-01 455 653 -7.50000000000000e-01 455 121 8.33333333333333e-02 455 304 -8.33333333333333e-02 455 651 1.66666666666667e-01 455 120 -1.66666666666667e-01 455 452 -2.50000000000000e-01 455 411 8.33333333333333e-02 455 290 -2.50000000000000e-01 455 451 -8.33333333333333e-02 455 55 8.33333333333333e-02 455 450 1.66666666666667e-01 455 54 -1.66666666666667e-01 456 456 2.50000000000000e+00 456 430 8.33333333333333e-02 456 296 8.33333333333333e-02 456 620 -8.33333333333333e-02 456 619 1.66666666666667e-01 456 295 -1.66666666666667e-01 456 618 -2.50000000000000e-01 456 446 1.66666666666667e-01 456 445 -8.33333333333333e-02 456 444 -2.50000000000000e-01 456 425 -8.33333333333333e-02 456 439 1.66666666666667e-01 456 437 8.33333333333333e-02 456 436 -1.66666666666667e-01 456 440 1.66666666666667e-01 456 458 -3.33333333333333e-01 456 130 8.33333333333333e-02 456 438 -7.50000000000000e-01 456 424 -8.33333333333333e-02 456 55 8.33333333333333e-02 456 655 -8.33333333333333e-02 456 656 1.66666666666667e-01 456 290 1.66666666666667e-01 456 302 -1.66666666666667e-01 456 307 -8.33333333333333e-02 456 301 8.33333333333333e-02 456 131 8.33333333333333e-02 456 308 -8.33333333333333e-02 456 654 -2.50000000000000e-01 456 452 -8.33333333333333e-02 456 56 8.33333333333333e-02 456 457 -3.33333333333333e-01 456 451 1.66666666666667e-01 456 289 1.66666666666667e-01 456 431 -1.66666666666667e-01 456 450 -2.50000000000000e-01 456 288 -7.50000000000000e-01 457 457 2.50000000000000e+00 457 429 8.33333333333333e-02 457 618 1.66666666666667e-01 457 296 8.33333333333333e-02 457 294 -1.66666666666667e-01 457 620 1.66666666666667e-01 457 619 -7.50000000000000e-01 457 446 1.66666666666667e-01 457 445 -2.50000000000000e-01 457 444 -8.33333333333333e-02 457 425 -8.33333333333333e-02 457 440 -8.33333333333333e-02 457 437 8.33333333333333e-02 457 438 1.66666666666667e-01 457 435 -1.66666666666667e-01 457 439 -2.50000000000000e-01 457 129 8.33333333333333e-02 457 423 -8.33333333333333e-02 457 54 8.33333333333333e-02 457 290 -8.33333333333333e-02 457 458 -3.33333333333333e-01 457 654 -8.33333333333333e-02 457 308 -8.33333333333333e-02 457 302 8.33333333333333e-02 457 306 -8.33333333333333e-02 457 300 8.33333333333333e-02 457 131 -1.66666666666667e-01 457 656 1.66666666666667e-01 457 655 -2.50000000000000e-01 457 452 1.66666666666667e-01 457 56 -1.66666666666667e-01 457 431 8.33333333333333e-02 457 451 -7.50000000000000e-01 457 289 -2.50000000000000e-01 457 456 -3.33333333333333e-01 457 450 1.66666666666667e-01 457 288 1.66666666666667e-01 458 458 2.50000000000000e+00 458 429 -1.66666666666667e-01 458 294 8.33333333333333e-02 458 618 -8.33333333333333e-02 458 295 8.33333333333333e-02 458 620 -2.50000000000000e-01 458 619 1.66666666666667e-01 458 446 -7.50000000000000e-01 458 445 1.66666666666667e-01 458 444 1.66666666666667e-01 458 424 -8.33333333333333e-02 458 423 -8.33333333333333e-02 458 439 -8.33333333333333e-02 458 436 8.33333333333333e-02 458 435 8.33333333333333e-02 458 440 -2.50000000000000e-01 458 438 1.66666666666667e-01 458 456 -3.33333333333333e-01 458 289 -8.33333333333333e-02 458 457 -3.33333333333333e-01 458 307 -8.33333333333333e-02 458 301 8.33333333333333e-02 458 654 1.66666666666667e-01 458 288 1.66666666666667e-01 458 300 -1.66666666666667e-01 458 656 -7.50000000000000e-01 458 130 -1.66666666666667e-01 458 655 1.66666666666667e-01 458 129 8.33333333333333e-02 458 306 -8.33333333333333e-02 458 430 8.33333333333333e-02 458 452 -2.50000000000000e-01 458 290 -2.50000000000000e-01 458 451 1.66666666666667e-01 458 55 -1.66666666666667e-01 458 450 -8.33333333333333e-02 458 54 8.33333333333333e-02 459 459 1.25000000000000e+00 459 503 -8.33333333333333e-02 459 475 8.33333333333333e-02 459 502 -8.33333333333333e-02 459 499 -8.33333333333333e-02 459 470 8.33333333333333e-02 459 476 -1.66666666666667e-01 459 469 8.33333333333333e-02 459 468 -3.75000000000000e-01 459 167 8.33333333333333e-02 459 461 -1.66666666666667e-01 459 467 1.66666666666667e-01 459 496 8.33333333333333e-02 459 466 -8.33333333333333e-02 459 59 -4.16666666666667e-02 459 161 4.16666666666667e-02 459 58 8.33333333333333e-02 459 160 -8.33333333333333e-02 459 57 -1.25000000000000e-01 459 465 -2.50000000000000e-01 459 65 -4.16666666666667e-02 459 497 8.33333333333333e-02 459 460 -1.66666666666667e-01 459 64 8.33333333333333e-02 459 166 8.33333333333333e-02 459 500 4.16666666666667e-02 459 63 -1.25000000000000e-01 459 165 -3.75000000000000e-01 460 460 1.25000000000000e+00 460 501 -8.33333333333333e-02 460 500 4.16666666666667e-02 460 503 -8.33333333333333e-02 460 498 -8.33333333333333e-02 460 470 -4.16666666666667e-02 460 476 8.33333333333333e-02 460 469 -1.25000000000000e-01 460 468 8.33333333333333e-02 460 167 -4.16666666666667e-02 460 161 4.16666666666667e-02 460 495 8.33333333333333e-02 460 465 -8.33333333333333e-02 460 59 8.33333333333333e-02 460 461 -1.66666666666667e-01 460 467 1.66666666666667e-01 460 58 -3.75000000000000e-01 460 466 -2.50000000000000e-01 460 57 8.33333333333333e-02 460 159 -8.33333333333333e-02 460 65 8.33333333333333e-02 460 497 -1.66666666666667e-01 460 474 8.33333333333333e-02 460 64 -3.75000000000000e-01 460 166 -1.25000000000000e-01 460 459 -1.66666666666667e-01 460 63 8.33333333333333e-02 460 165 8.33333333333333e-02 461 461 1.25000000000000e+00 461 501 -8.33333333333333e-02 461 499 4.16666666666667e-02 461 502 -8.33333333333333e-02 461 470 -1.25000000000000e-01 461 469 -4.16666666666667e-02 461 475 8.33333333333333e-02 461 468 8.33333333333333e-02 461 474 -1.66666666666667e-01 461 166 -4.16666666666667e-02 461 160 4.16666666666667e-02 461 165 8.33333333333333e-02 461 459 -1.66666666666667e-01 461 465 1.66666666666667e-01 461 59 -1.25000000000000e-01 461 467 -7.50000000000000e-01 461 58 8.33333333333333e-02 461 460 -1.66666666666667e-01 461 466 1.66666666666667e-01 461 57 -4.16666666666667e-02 461 159 4.16666666666667e-02 461 498 4.16666666666667e-02 461 65 -1.25000000000000e-01 461 167 -1.25000000000000e-01 461 64 8.33333333333333e-02 461 496 -1.66666666666667e-01 461 63 -4.16666666666667e-02 461 495 8.33333333333333e-02 462 462 1.25000000000000e+00 462 473 8.33333333333333e-02 462 472 8.33333333333333e-02 462 471 -3.75000000000000e-01 462 536 -8.33333333333333e-02 462 538 -8.33333333333333e-02 462 476 8.33333333333333e-02 462 475 -1.66666666666667e-01 462 539 -8.33333333333333e-02 462 533 8.33333333333333e-02 462 467 -8.33333333333333e-02 462 463 -1.66666666666667e-01 462 466 1.66666666666667e-01 462 172 8.33333333333333e-02 462 59 8.33333333333333e-02 462 161 -8.33333333333333e-02 462 58 -4.16666666666667e-02 462 160 4.16666666666667e-02 462 57 -1.25000000000000e-01 462 465 -2.50000000000000e-01 462 464 -1.66666666666667e-01 462 71 8.33333333333333e-02 462 173 8.33333333333333e-02 462 70 -4.16666666666667e-02 462 532 8.33333333333333e-02 462 535 4.16666666666667e-02 462 69 -1.25000000000000e-01 462 171 -3.75000000000000e-01 463 463 1.25000000000000e+00 463 473 -4.16666666666667e-02 463 472 -1.25000000000000e-01 463 471 8.33333333333333e-02 463 536 4.16666666666667e-02 463 476 8.33333333333333e-02 463 539 -8.33333333333333e-02 463 537 -8.33333333333333e-02 463 474 -1.66666666666667e-01 463 161 4.16666666666667e-02 463 173 -4.16666666666667e-02 463 462 -1.66666666666667e-01 463 465 1.66666666666667e-01 463 171 8.33333333333333e-02 463 59 8.33333333333333e-02 463 464 -1.66666666666667e-01 463 467 1.66666666666667e-01 463 58 -1.25000000000000e-01 463 466 -7.50000000000000e-01 463 57 -4.16666666666667e-02 463 159 4.16666666666667e-02 463 71 8.33333333333333e-02 463 533 -1.66666666666667e-01 463 534 4.16666666666667e-02 463 70 -1.25000000000000e-01 463 172 -1.25000000000000e-01 463 69 -4.16666666666667e-02 463 531 8.33333333333333e-02 464 464 1.25000000000000e+00 464 472 -4.16666666666667e-02 464 471 8.33333333333333e-02 464 535 4.16666666666667e-02 464 534 -8.33333333333333e-02 464 475 8.33333333333333e-02 464 538 -8.33333333333333e-02 464 474 8.33333333333333e-02 464 537 -8.33333333333333e-02 464 531 8.33333333333333e-02 464 465 -8.33333333333333e-02 464 160 4.16666666666667e-02 464 172 -4.16666666666667e-02 464 59 -3.75000000000000e-01 464 467 -2.50000000000000e-01 464 58 8.33333333333333e-02 464 463 -1.66666666666667e-01 464 466 1.66666666666667e-01 464 57 8.33333333333333e-02 464 159 -8.33333333333333e-02 464 473 -1.25000000000000e-01 464 71 -3.75000000000000e-01 464 173 -1.25000000000000e-01 464 70 8.33333333333333e-02 464 532 -1.66666666666667e-01 464 462 -1.66666666666667e-01 464 69 8.33333333333333e-02 464 171 8.33333333333333e-02 465 465 2.50000000000000e+00 465 502 -1.66666666666667e-01 465 461 1.66666666666667e-01 465 166 8.33333333333333e-02 465 460 -8.33333333333333e-02 465 167 -1.66666666666667e-01 465 459 -2.50000000000000e-01 465 497 -8.33333333333333e-02 465 496 1.66666666666667e-01 465 495 -2.50000000000000e-01 465 568 -8.33333333333333e-02 465 476 1.66666666666667e-01 465 539 -1.66666666666667e-01 465 538 8.33333333333333e-02 465 59 8.33333333333333e-02 465 475 1.66666666666667e-01 465 466 -3.33333333333333e-01 465 474 -7.50000000000000e-01 465 569 -8.33333333333333e-02 465 77 8.33333333333333e-02 465 464 -8.33333333333333e-02 465 463 1.66666666666667e-01 465 161 -8.33333333333333e-02 465 173 8.33333333333333e-02 465 178 1.66666666666667e-01 465 172 -1.66666666666667e-01 465 58 8.33333333333333e-02 465 160 -8.33333333333333e-02 465 462 -2.50000000000000e-01 465 467 -3.33333333333333e-01 465 533 1.66666666666667e-01 465 179 1.66666666666667e-01 465 532 -8.33333333333333e-02 465 76 8.33333333333333e-02 465 503 8.33333333333333e-02 465 531 -2.50000000000000e-01 465 177 -7.50000000000000e-01 466 466 2.50000000000000e+00 466 501 -1.66666666666667e-01 466 165 8.33333333333333e-02 466 459 -8.33333333333333e-02 466 167 8.33333333333333e-02 466 461 1.66666666666667e-01 466 460 -2.50000000000000e-01 466 497 1.66666666666667e-01 466 496 -7.50000000000000e-01 466 495 1.66666666666667e-01 466 569 -8.33333333333333e-02 466 567 -8.33333333333333e-02 466 476 -8.33333333333333e-02 466 539 8.33333333333333e-02 466 537 8.33333333333333e-02 466 475 -2.50000000000000e-01 466 474 1.66666666666667e-01 466 465 -3.33333333333333e-01 466 179 -8.33333333333333e-02 466 467 -3.33333333333333e-01 466 161 -8.33333333333333e-02 466 173 8.33333333333333e-02 466 462 1.66666666666667e-01 466 177 1.66666666666667e-01 466 171 -1.66666666666667e-01 466 59 -1.66666666666667e-01 466 464 1.66666666666667e-01 466 463 -7.50000000000000e-01 466 57 8.33333333333333e-02 466 159 -8.33333333333333e-02 466 533 1.66666666666667e-01 466 77 -1.66666666666667e-01 466 503 8.33333333333333e-02 466 532 -2.50000000000000e-01 466 178 -2.50000000000000e-01 466 531 -8.33333333333333e-02 466 75 8.33333333333333e-02 467 467 2.50000000000000e+00 467 501 8.33333333333333e-02 467 459 1.66666666666667e-01 467 166 8.33333333333333e-02 467 165 -1.66666666666667e-01 467 461 -7.50000000000000e-01 467 460 1.66666666666667e-01 467 497 -2.50000000000000e-01 467 496 1.66666666666667e-01 467 495 -8.33333333333333e-02 467 568 -8.33333333333333e-02 467 475 -8.33333333333333e-02 467 538 8.33333333333333e-02 467 474 1.66666666666667e-01 467 537 -1.66666666666667e-01 467 476 -2.50000000000000e-01 467 57 8.33333333333333e-02 467 567 -8.33333333333333e-02 467 75 8.33333333333333e-02 467 178 -8.33333333333333e-02 467 466 -3.33333333333333e-01 467 462 -8.33333333333333e-02 467 160 -8.33333333333333e-02 467 172 8.33333333333333e-02 467 159 -8.33333333333333e-02 467 171 8.33333333333333e-02 467 464 -2.50000000000000e-01 467 58 -1.66666666666667e-01 467 463 1.66666666666667e-01 467 502 8.33333333333333e-02 467 533 -7.50000000000000e-01 467 179 -2.50000000000000e-01 467 532 1.66666666666667e-01 467 76 -1.66666666666667e-01 467 465 -3.33333333333333e-01 467 531 1.66666666666667e-01 467 177 1.66666666666667e-01 468 468 1.25000000000000e+00 468 502 8.33333333333333e-02 468 503 8.33333333333333e-02 468 461 8.33333333333333e-02 468 470 -1.66666666666667e-01 468 460 8.33333333333333e-02 468 459 -3.75000000000000e-01 468 499 8.33333333333333e-02 468 498 -1.25000000000000e-01 468 475 -8.33333333333333e-02 468 469 -1.66666666666667e-01 468 185 8.33333333333333e-02 468 586 -8.33333333333333e-02 468 190 8.33333333333333e-02 468 476 1.66666666666667e-01 468 191 -1.66666666666667e-01 468 80 4.16666666666667e-02 468 587 -8.33333333333333e-02 468 184 8.33333333333333e-02 468 79 -8.33333333333333e-02 468 183 -3.75000000000000e-01 468 182 -4.16666666666667e-02 468 59 4.16666666666667e-02 468 181 8.33333333333333e-02 468 58 -8.33333333333333e-02 468 180 -1.25000000000000e-01 468 500 -4.16666666666667e-02 468 474 -2.50000000000000e-01 469 469 1.25000000000000e+00 469 501 8.33333333333333e-02 469 503 -1.66666666666667e-01 469 461 -4.16666666666667e-02 469 59 4.16666666666667e-02 469 460 -1.25000000000000e-01 469 459 8.33333333333333e-02 469 80 4.16666666666667e-02 469 499 -3.75000000000000e-01 469 498 8.33333333333333e-02 469 474 -8.33333333333333e-02 469 185 -4.16666666666667e-02 469 468 -1.66666666666667e-01 469 585 -8.33333333333333e-02 469 189 8.33333333333333e-02 469 587 -8.33333333333333e-02 469 191 8.33333333333333e-02 469 184 -1.25000000000000e-01 469 183 8.33333333333333e-02 469 78 -8.33333333333333e-02 469 182 8.33333333333333e-02 469 470 -1.66666666666667e-01 469 476 1.66666666666667e-01 469 181 -3.75000000000000e-01 469 500 8.33333333333333e-02 469 475 -2.50000000000000e-01 469 180 8.33333333333333e-02 469 57 -8.33333333333333e-02 470 470 1.25000000000000e+00 470 498 -4.16666666666667e-02 470 502 -1.66666666666667e-01 470 501 8.33333333333333e-02 470 461 -1.25000000000000e-01 470 460 -4.16666666666667e-02 470 58 4.16666666666667e-02 470 459 8.33333333333333e-02 470 468 -1.66666666666667e-01 470 500 -1.25000000000000e-01 470 79 4.16666666666667e-02 470 184 -4.16666666666667e-02 470 183 8.33333333333333e-02 470 586 -8.33333333333333e-02 470 190 8.33333333333333e-02 470 474 1.66666666666667e-01 470 189 -1.66666666666667e-01 470 185 -1.25000000000000e-01 470 78 4.16666666666667e-02 470 585 -8.33333333333333e-02 470 182 -1.25000000000000e-01 470 499 8.33333333333333e-02 470 476 -7.50000000000000e-01 470 181 8.33333333333333e-02 470 469 -1.66666666666667e-01 470 475 1.66666666666667e-01 470 180 -4.16666666666667e-02 470 57 4.16666666666667e-02 471 471 1.25000000000000e+00 471 535 -4.16666666666667e-02 471 538 8.33333333333333e-02 471 536 8.33333333333333e-02 471 534 -1.25000000000000e-01 471 464 8.33333333333333e-02 471 472 -1.66666666666667e-01 471 463 8.33333333333333e-02 471 462 -3.75000000000000e-01 471 593 -8.33333333333333e-02 471 473 -1.66666666666667e-01 471 187 8.33333333333333e-02 471 191 8.33333333333333e-02 471 476 -8.33333333333333e-02 471 190 -1.66666666666667e-01 471 475 1.66666666666667e-01 471 188 8.33333333333333e-02 471 83 -8.33333333333333e-02 471 82 4.16666666666667e-02 471 592 -8.33333333333333e-02 471 186 -3.75000000000000e-01 471 182 8.33333333333333e-02 471 59 -8.33333333333333e-02 471 181 -4.16666666666667e-02 471 58 4.16666666666667e-02 471 180 -1.25000000000000e-01 471 539 8.33333333333333e-02 471 474 -2.50000000000000e-01 472 472 1.25000000000000e+00 472 539 -1.66666666666667e-01 472 534 -4.16666666666667e-02 472 537 8.33333333333333e-02 472 83 4.16666666666667e-02 472 535 -1.25000000000000e-01 472 59 4.16666666666667e-02 472 464 -4.16666666666667e-02 472 463 -1.25000000000000e-01 472 471 -1.66666666666667e-01 472 462 8.33333333333333e-02 472 593 -8.33333333333333e-02 472 188 -4.16666666666667e-02 472 191 8.33333333333333e-02 472 186 8.33333333333333e-02 472 189 -1.66666666666667e-01 472 474 1.66666666666667e-01 472 187 -1.25000000000000e-01 472 81 4.16666666666667e-02 472 591 -8.33333333333333e-02 472 182 8.33333333333333e-02 472 473 -1.66666666666667e-01 472 476 1.66666666666667e-01 472 181 -1.25000000000000e-01 472 536 8.33333333333333e-02 472 475 -7.50000000000000e-01 472 180 -4.16666666666667e-02 472 57 4.16666666666667e-02 473 473 1.25000000000000e+00 473 535 8.33333333333333e-02 473 538 -1.66666666666667e-01 473 536 -3.75000000000000e-01 473 82 4.16666666666667e-02 473 534 8.33333333333333e-02 473 464 -1.25000000000000e-01 473 58 4.16666666666667e-02 473 463 -4.16666666666667e-02 473 462 8.33333333333333e-02 473 592 -8.33333333333333e-02 473 591 -8.33333333333333e-02 473 187 -4.16666666666667e-02 473 190 8.33333333333333e-02 473 471 -1.66666666666667e-01 473 189 8.33333333333333e-02 473 474 -8.33333333333333e-02 473 188 -1.25000000000000e-01 473 186 8.33333333333333e-02 473 81 -8.33333333333333e-02 473 182 -3.75000000000000e-01 473 537 8.33333333333333e-02 473 476 -2.50000000000000e-01 473 181 8.33333333333333e-02 473 472 -1.66666666666667e-01 473 475 1.66666666666667e-01 473 180 8.33333333333333e-02 473 57 -8.33333333333333e-02 474 474 2.50000000000000e+00 474 503 -8.33333333333333e-02 474 461 -1.66666666666667e-01 474 502 1.66666666666667e-01 474 501 -2.50000000000000e-01 474 469 -8.33333333333333e-02 474 470 1.66666666666667e-01 474 468 -2.50000000000000e-01 474 587 8.33333333333333e-02 474 586 -1.66666666666667e-01 474 568 8.33333333333333e-02 474 538 -8.33333333333333e-02 474 476 -3.33333333333333e-01 474 467 1.66666666666667e-01 474 539 1.66666666666667e-01 474 59 -8.33333333333333e-02 474 464 8.33333333333333e-02 474 466 1.66666666666667e-01 474 463 -1.66666666666667e-01 474 465 -7.50000000000000e-01 474 86 -8.33333333333333e-02 474 569 8.33333333333333e-02 474 537 -2.50000000000000e-01 474 182 8.33333333333333e-02 474 473 -8.33333333333333e-02 474 190 1.66666666666667e-01 474 475 -3.33333333333333e-01 474 472 1.66666666666667e-01 474 191 1.66666666666667e-01 474 593 -1.66666666666667e-01 474 592 8.33333333333333e-02 474 85 -8.33333333333333e-02 474 189 -7.50000000000000e-01 474 181 8.33333333333333e-02 474 58 -8.33333333333333e-02 474 471 -2.50000000000000e-01 474 460 8.33333333333333e-02 475 475 2.50000000000000e+00 475 503 1.66666666666667e-01 475 461 8.33333333333333e-02 475 502 -7.50000000000000e-01 475 501 1.66666666666667e-01 475 468 -8.33333333333333e-02 475 587 8.33333333333333e-02 475 470 1.66666666666667e-01 475 469 -2.50000000000000e-01 475 585 -1.66666666666667e-01 475 476 -3.33333333333333e-01 475 86 -8.33333333333333e-02 475 59 -8.33333333333333e-02 475 567 8.33333333333333e-02 475 537 -8.33333333333333e-02 475 467 -8.33333333333333e-02 475 464 8.33333333333333e-02 475 466 -2.50000000000000e-01 475 465 1.66666666666667e-01 475 462 -1.66666666666667e-01 475 569 -1.66666666666667e-01 475 539 1.66666666666667e-01 475 538 -2.50000000000000e-01 475 191 -8.33333333333333e-02 475 593 8.33333333333333e-02 475 189 1.66666666666667e-01 475 474 -3.33333333333333e-01 475 471 1.66666666666667e-01 475 190 -2.50000000000000e-01 475 591 8.33333333333333e-02 475 84 -8.33333333333333e-02 475 182 -1.66666666666667e-01 475 473 1.66666666666667e-01 475 472 -7.50000000000000e-01 475 459 8.33333333333333e-02 475 180 8.33333333333333e-02 475 57 -8.33333333333333e-02 476 476 2.50000000000000e+00 476 501 -8.33333333333333e-02 476 460 8.33333333333333e-02 476 459 -1.66666666666667e-01 476 503 -2.50000000000000e-01 476 586 8.33333333333333e-02 476 468 1.66666666666667e-01 476 470 -7.50000000000000e-01 476 469 1.66666666666667e-01 476 585 8.33333333333333e-02 476 475 -3.33333333333333e-01 476 85 -8.33333333333333e-02 476 58 -8.33333333333333e-02 476 466 -8.33333333333333e-02 476 463 8.33333333333333e-02 476 474 -3.33333333333333e-01 476 465 1.66666666666667e-01 476 537 1.66666666666667e-01 476 467 -2.50000000000000e-01 476 57 -8.33333333333333e-02 476 462 8.33333333333333e-02 476 539 -7.50000000000000e-01 476 568 -1.66666666666667e-01 476 538 1.66666666666667e-01 476 84 -8.33333333333333e-02 476 567 8.33333333333333e-02 476 190 -8.33333333333333e-02 476 592 8.33333333333333e-02 476 180 8.33333333333333e-02 476 471 -8.33333333333333e-02 476 191 -2.50000000000000e-01 476 189 1.66666666666667e-01 476 591 -1.66666666666667e-01 476 473 -2.50000000000000e-01 476 502 1.66666666666667e-01 476 181 -1.66666666666667e-01 476 472 1.66666666666667e-01 477 477 1.25000000000000e+00 477 508 -8.33333333333333e-02 477 488 -4.16666666666667e-02 477 494 8.33333333333333e-02 477 487 8.33333333333333e-02 477 486 -1.25000000000000e-01 477 506 4.16666666666667e-02 477 509 -8.33333333333333e-02 477 505 -8.33333333333333e-02 477 164 4.16666666666667e-02 477 167 -4.16666666666667e-02 477 496 8.33333333333333e-02 477 484 -8.33333333333333e-02 477 65 8.33333333333333e-02 477 497 -1.66666666666667e-01 477 64 8.33333333333333e-02 477 478 -1.66666666666667e-01 477 166 8.33333333333333e-02 477 63 -3.75000000000000e-01 477 165 -1.25000000000000e-01 477 479 -1.66666666666667e-01 477 62 8.33333333333333e-02 477 485 1.66666666666667e-01 477 61 8.33333333333333e-02 477 163 -8.33333333333333e-02 477 493 8.33333333333333e-02 477 60 -3.75000000000000e-01 477 483 -2.50000000000000e-01 478 478 1.25000000000000e+00 478 509 -8.33333333333333e-02 478 492 8.33333333333333e-02 478 507 -8.33333333333333e-02 478 488 8.33333333333333e-02 478 494 -1.66666666666667e-01 478 487 -3.75000000000000e-01 478 486 8.33333333333333e-02 478 504 -8.33333333333333e-02 478 479 -1.66666666666667e-01 478 167 8.33333333333333e-02 478 485 1.66666666666667e-01 478 495 8.33333333333333e-02 478 483 -8.33333333333333e-02 478 65 -4.16666666666667e-02 478 497 8.33333333333333e-02 478 64 -1.25000000000000e-01 478 166 -3.75000000000000e-01 478 63 8.33333333333333e-02 478 477 -1.66666666666667e-01 478 165 8.33333333333333e-02 478 62 -4.16666666666667e-02 478 164 4.16666666666667e-02 478 506 4.16666666666667e-02 478 61 -1.25000000000000e-01 478 484 -2.50000000000000e-01 478 60 8.33333333333333e-02 478 162 -8.33333333333333e-02 479 479 1.25000000000000e+00 479 508 -8.33333333333333e-02 479 488 -1.25000000000000e-01 479 487 8.33333333333333e-02 479 493 -1.66666666666667e-01 479 486 -4.16666666666667e-02 479 492 8.33333333333333e-02 479 504 4.16666666666667e-02 479 507 -8.33333333333333e-02 479 162 4.16666666666667e-02 479 165 -4.16666666666667e-02 479 478 -1.66666666666667e-01 479 166 8.33333333333333e-02 479 484 1.66666666666667e-01 479 65 -1.25000000000000e-01 479 167 -1.25000000000000e-01 479 64 -4.16666666666667e-02 479 496 8.33333333333333e-02 479 63 8.33333333333333e-02 479 495 -1.66666666666667e-01 479 505 4.16666666666667e-02 479 62 -1.25000000000000e-01 479 485 -7.50000000000000e-01 479 61 -4.16666666666667e-02 479 163 4.16666666666667e-02 479 477 -1.66666666666667e-01 479 60 8.33333333333333e-02 479 483 1.66666666666667e-01 480 480 2.50000000000000e+00 480 557 -8.33333333333333e-02 480 556 -8.33333333333333e-02 480 493 -1.66666666666667e-01 480 484 1.66666666666667e-01 480 551 -1.66666666666667e-01 480 550 8.33333333333333e-02 480 485 1.66666666666667e-01 480 483 -7.50000000000000e-01 480 491 -8.33333333333333e-02 480 554 8.33333333333333e-02 480 490 1.66666666666667e-01 480 481 -3.33333333333333e-01 480 376 1.66666666666667e-01 480 374 -1.66666666666667e-01 480 62 1.66666666666667e-01 480 373 8.33333333333333e-02 480 61 -8.33333333333333e-02 480 489 -2.50000000000000e-01 480 377 1.66666666666667e-01 480 482 -3.33333333333333e-01 480 74 1.66666666666667e-01 480 553 8.33333333333333e-02 480 73 -8.33333333333333e-02 480 375 -7.50000000000000e-01 480 343 -8.33333333333333e-02 480 163 8.33333333333333e-02 480 164 8.33333333333333e-02 480 344 -8.33333333333333e-02 480 60 -2.50000000000000e-01 480 176 -8.33333333333333e-02 480 350 8.33333333333333e-02 480 175 1.66666666666667e-01 480 349 -1.66666666666667e-01 480 174 -2.50000000000000e-01 480 494 8.33333333333333e-02 480 72 -2.50000000000000e-01 481 481 2.50000000000000e+00 481 494 8.33333333333333e-02 481 492 -1.66666666666667e-01 481 557 -8.33333333333333e-02 481 485 -8.33333333333333e-02 481 551 8.33333333333333e-02 481 483 1.66666666666667e-01 481 549 8.33333333333333e-02 481 484 -2.50000000000000e-01 481 374 8.33333333333333e-02 481 377 -8.33333333333333e-02 481 489 1.66666666666667e-01 481 480 -3.33333333333333e-01 481 375 1.66666666666667e-01 481 491 1.66666666666667e-01 481 490 -7.50000000000000e-01 481 372 8.33333333333333e-02 481 60 -8.33333333333333e-02 481 554 -1.66666666666667e-01 481 376 -2.50000000000000e-01 481 552 8.33333333333333e-02 481 72 -8.33333333333333e-02 481 342 -8.33333333333333e-02 481 162 8.33333333333333e-02 481 344 -8.33333333333333e-02 481 350 8.33333333333333e-02 481 164 -1.66666666666667e-01 481 62 1.66666666666667e-01 481 61 -2.50000000000000e-01 481 176 1.66666666666667e-01 481 482 -3.33333333333333e-01 481 74 1.66666666666667e-01 481 175 -7.50000000000000e-01 481 555 -8.33333333333333e-02 481 73 -2.50000000000000e-01 481 174 1.66666666666667e-01 481 348 -1.66666666666667e-01 482 482 2.50000000000000e+00 482 555 -8.33333333333333e-02 482 493 8.33333333333333e-02 482 556 -8.33333333333333e-02 482 484 -8.33333333333333e-02 482 550 8.33333333333333e-02 482 549 -1.66666666666667e-01 482 485 -2.50000000000000e-01 482 483 1.66666666666667e-01 482 373 8.33333333333333e-02 482 376 -8.33333333333333e-02 482 489 -8.33333333333333e-02 482 552 8.33333333333333e-02 482 491 -2.50000000000000e-01 482 490 1.66666666666667e-01 482 372 -1.66666666666667e-01 482 60 1.66666666666667e-01 482 377 -2.50000000000000e-01 482 553 -1.66666666666667e-01 482 375 1.66666666666667e-01 482 480 -3.33333333333333e-01 482 72 1.66666666666667e-01 482 343 -8.33333333333333e-02 482 349 8.33333333333333e-02 482 62 -7.50000000000000e-01 482 163 -1.66666666666667e-01 482 61 1.66666666666667e-01 482 162 8.33333333333333e-02 482 342 -8.33333333333333e-02 482 176 -2.50000000000000e-01 482 492 8.33333333333333e-02 482 74 -7.50000000000000e-01 482 175 1.66666666666667e-01 482 481 -3.33333333333333e-01 482 73 1.66666666666667e-01 482 174 -8.33333333333333e-02 482 348 8.33333333333333e-02 483 483 2.50000000000000e+00 483 508 -1.66666666666667e-01 483 478 -8.33333333333333e-02 483 166 8.33333333333333e-02 483 167 8.33333333333333e-02 483 479 1.66666666666667e-01 483 477 -2.50000000000000e-01 483 497 1.66666666666667e-01 483 496 1.66666666666667e-01 483 495 -7.50000000000000e-01 483 572 -8.33333333333333e-02 483 571 -8.33333333333333e-02 483 494 -8.33333333333333e-02 483 557 8.33333333333333e-02 483 556 8.33333333333333e-02 483 493 1.66666666666667e-01 483 484 -3.33333333333333e-01 483 492 -2.50000000000000e-01 483 179 -8.33333333333333e-02 483 485 -3.33333333333333e-01 483 164 -8.33333333333333e-02 483 176 8.33333333333333e-02 483 481 1.66666666666667e-01 483 178 1.66666666666667e-01 483 175 -1.66666666666667e-01 483 482 1.66666666666667e-01 483 62 -1.66666666666667e-01 483 61 8.33333333333333e-02 483 163 -8.33333333333333e-02 483 480 -7.50000000000000e-01 483 551 1.66666666666667e-01 483 77 -1.66666666666667e-01 483 550 -8.33333333333333e-02 483 76 8.33333333333333e-02 483 549 -2.50000000000000e-01 483 509 8.33333333333333e-02 483 177 -2.50000000000000e-01 484 484 2.50000000000000e+00 484 507 -1.66666666666667e-01 484 479 1.66666666666667e-01 484 477 -8.33333333333333e-02 484 165 8.33333333333333e-02 484 167 -1.66666666666667e-01 484 478 -2.50000000000000e-01 484 497 -8.33333333333333e-02 484 496 -2.50000000000000e-01 484 495 1.66666666666667e-01 484 570 -8.33333333333333e-02 484 494 1.66666666666667e-01 484 557 -1.66666666666667e-01 484 555 8.33333333333333e-02 484 62 8.33333333333333e-02 484 493 -7.50000000000000e-01 484 492 1.66666666666667e-01 484 483 -3.33333333333333e-01 484 572 -8.33333333333333e-02 484 77 8.33333333333333e-02 484 482 -8.33333333333333e-02 484 480 1.66666666666667e-01 484 164 -8.33333333333333e-02 484 176 8.33333333333333e-02 484 177 1.66666666666667e-01 484 174 -1.66666666666667e-01 484 481 -2.50000000000000e-01 484 60 8.33333333333333e-02 484 162 -8.33333333333333e-02 484 551 1.66666666666667e-01 484 485 -3.33333333333333e-01 484 179 1.66666666666667e-01 484 550 -2.50000000000000e-01 484 509 8.33333333333333e-02 484 178 -7.50000000000000e-01 484 549 -8.33333333333333e-02 484 75 8.33333333333333e-02 485 485 2.50000000000000e+00 485 508 8.33333333333333e-02 485 478 1.66666666666667e-01 485 166 -1.66666666666667e-01 485 165 8.33333333333333e-02 485 479 -7.50000000000000e-01 485 477 1.66666666666667e-01 485 497 -2.50000000000000e-01 485 496 -8.33333333333333e-02 485 495 1.66666666666667e-01 485 570 -8.33333333333333e-02 485 493 1.66666666666667e-01 485 492 -8.33333333333333e-02 485 555 8.33333333333333e-02 485 556 -1.66666666666667e-01 485 494 -2.50000000000000e-01 485 61 8.33333333333333e-02 485 571 -8.33333333333333e-02 485 76 8.33333333333333e-02 485 177 -8.33333333333333e-02 485 481 -8.33333333333333e-02 485 483 -3.33333333333333e-01 485 162 -8.33333333333333e-02 485 174 8.33333333333333e-02 485 163 -8.33333333333333e-02 485 175 8.33333333333333e-02 485 482 -2.50000000000000e-01 485 480 1.66666666666667e-01 485 60 -1.66666666666667e-01 485 551 -7.50000000000000e-01 485 507 8.33333333333333e-02 485 179 -2.50000000000000e-01 485 550 1.66666666666667e-01 485 484 -3.33333333333333e-01 485 178 1.66666666666667e-01 485 549 1.66666666666667e-01 485 75 -1.66666666666667e-01 486 486 1.25000000000000e+00 486 508 8.33333333333333e-02 486 509 -1.66666666666667e-01 486 62 4.16666666666667e-02 486 479 -4.16666666666667e-02 486 478 8.33333333333333e-02 486 477 -1.25000000000000e-01 486 98 4.16666666666667e-02 486 505 8.33333333333333e-02 486 504 -3.75000000000000e-01 486 493 -8.33333333333333e-02 486 215 -4.16666666666667e-02 486 487 -1.66666666666667e-01 486 622 -8.33333333333333e-02 486 220 8.33333333333333e-02 486 623 -8.33333333333333e-02 486 221 8.33333333333333e-02 486 97 -8.33333333333333e-02 486 214 8.33333333333333e-02 486 213 -1.25000000000000e-01 486 488 -1.66666666666667e-01 486 209 8.33333333333333e-02 486 494 1.66666666666667e-01 486 208 8.33333333333333e-02 486 61 -8.33333333333333e-02 486 506 8.33333333333333e-02 486 207 -3.75000000000000e-01 486 492 -2.50000000000000e-01 487 487 1.25000000000000e+00 487 507 8.33333333333333e-02 487 509 8.33333333333333e-02 487 479 8.33333333333333e-02 487 488 -1.66666666666667e-01 487 478 -3.75000000000000e-01 487 477 8.33333333333333e-02 487 505 -1.25000000000000e-01 487 504 8.33333333333333e-02 487 492 -8.33333333333333e-02 487 486 -1.66666666666667e-01 487 215 8.33333333333333e-02 487 621 -8.33333333333333e-02 487 219 8.33333333333333e-02 487 494 1.66666666666667e-01 487 221 -1.66666666666667e-01 487 98 4.16666666666667e-02 487 623 -8.33333333333333e-02 487 214 -3.75000000000000e-01 487 96 -8.33333333333333e-02 487 213 8.33333333333333e-02 487 209 -4.16666666666667e-02 487 62 4.16666666666667e-02 487 506 -4.16666666666667e-02 487 208 -1.25000000000000e-01 487 493 -2.50000000000000e-01 487 207 8.33333333333333e-02 487 60 -8.33333333333333e-02 488 488 1.25000000000000e+00 488 504 8.33333333333333e-02 488 508 8.33333333333333e-02 488 507 -1.66666666666667e-01 488 479 -1.25000000000000e-01 488 478 8.33333333333333e-02 488 487 -1.66666666666667e-01 488 60 4.16666666666667e-02 488 477 -4.16666666666667e-02 488 506 -1.25000000000000e-01 488 96 4.16666666666667e-02 488 213 -4.16666666666667e-02 488 214 8.33333333333333e-02 488 493 1.66666666666667e-01 488 220 -1.66666666666667e-01 488 621 -8.33333333333333e-02 488 219 8.33333333333333e-02 488 215 -1.25000000000000e-01 488 97 4.16666666666667e-02 488 622 -8.33333333333333e-02 488 505 -4.16666666666667e-02 488 209 -1.25000000000000e-01 488 494 -7.50000000000000e-01 488 208 -4.16666666666667e-02 488 61 4.16666666666667e-02 488 486 -1.66666666666667e-01 488 207 8.33333333333333e-02 488 492 1.66666666666667e-01 489 489 2.50000000000000e+00 489 556 8.33333333333333e-02 489 629 -8.33333333333333e-02 489 221 8.33333333333333e-02 489 220 -1.66666666666667e-01 489 493 1.66666666666667e-01 489 628 -8.33333333333333e-02 489 494 1.66666666666667e-01 489 492 -7.50000000000000e-01 489 482 -8.33333333333333e-02 489 377 8.33333333333333e-02 489 481 1.66666666666667e-01 489 376 -1.66666666666667e-01 489 61 8.33333333333333e-02 489 480 -2.50000000000000e-01 489 491 -3.33333333333333e-01 489 554 1.66666666666667e-01 489 100 8.33333333333333e-02 489 553 -8.33333333333333e-02 489 552 -2.50000000000000e-01 489 373 -8.33333333333333e-02 489 209 1.66666666666667e-01 489 205 8.33333333333333e-02 489 208 -8.33333333333333e-02 489 206 -1.66666666666667e-01 489 386 1.66666666666667e-01 489 62 8.33333333333333e-02 489 374 -8.33333333333333e-02 489 207 -2.50000000000000e-01 489 218 -8.33333333333333e-02 489 101 8.33333333333333e-02 489 490 -3.33333333333333e-01 489 217 1.66666666666667e-01 489 385 1.66666666666667e-01 489 557 -1.66666666666667e-01 489 216 -2.50000000000000e-01 489 384 -7.50000000000000e-01 490 490 2.50000000000000e+00 490 555 8.33333333333333e-02 490 629 -8.33333333333333e-02 490 221 8.33333333333333e-02 490 494 -8.33333333333333e-02 490 219 -1.66666666666667e-01 490 492 1.66666666666667e-01 490 627 -8.33333333333333e-02 490 493 -2.50000000000000e-01 490 377 8.33333333333333e-02 490 480 1.66666666666667e-01 490 375 -1.66666666666667e-01 490 482 1.66666666666667e-01 490 481 -7.50000000000000e-01 490 60 8.33333333333333e-02 490 554 1.66666666666667e-01 490 553 -2.50000000000000e-01 490 99 8.33333333333333e-02 490 552 -8.33333333333333e-02 490 372 -8.33333333333333e-02 490 374 -8.33333333333333e-02 490 491 -3.33333333333333e-01 490 204 8.33333333333333e-02 490 207 -8.33333333333333e-02 490 206 8.33333333333333e-02 490 386 -8.33333333333333e-02 490 62 -1.66666666666667e-01 490 209 1.66666666666667e-01 490 208 -2.50000000000000e-01 490 218 1.66666666666667e-01 490 101 -1.66666666666667e-01 490 557 8.33333333333333e-02 490 217 -7.50000000000000e-01 490 385 -2.50000000000000e-01 490 489 -3.33333333333333e-01 490 216 1.66666666666667e-01 490 384 1.66666666666667e-01 491 491 2.50000000000000e+00 491 555 -1.66666666666667e-01 491 627 -8.33333333333333e-02 491 628 -8.33333333333333e-02 491 219 8.33333333333333e-02 491 220 8.33333333333333e-02 491 493 -8.33333333333333e-02 491 494 -2.50000000000000e-01 491 492 1.66666666666667e-01 491 376 8.33333333333333e-02 491 480 -8.33333333333333e-02 491 375 8.33333333333333e-02 491 482 -2.50000000000000e-01 491 481 1.66666666666667e-01 491 554 -7.50000000000000e-01 491 553 1.66666666666667e-01 491 489 -3.33333333333333e-01 491 552 1.66666666666667e-01 491 373 -8.33333333333333e-02 491 490 -3.33333333333333e-01 491 207 1.66666666666667e-01 491 205 8.33333333333333e-02 491 385 -8.33333333333333e-02 491 204 -1.66666666666667e-01 491 384 1.66666666666667e-01 491 209 -7.50000000000000e-01 491 61 -1.66666666666667e-01 491 208 1.66666666666667e-01 491 60 8.33333333333333e-02 491 372 -8.33333333333333e-02 491 556 8.33333333333333e-02 491 218 -2.50000000000000e-01 491 386 -2.50000000000000e-01 491 217 1.66666666666667e-01 491 100 -1.66666666666667e-01 491 216 -8.33333333333333e-02 491 99 8.33333333333333e-02 492 492 2.50000000000000e+00 492 509 1.66666666666667e-01 492 479 8.33333333333333e-02 492 508 1.66666666666667e-01 492 507 -7.50000000000000e-01 492 487 -8.33333333333333e-02 492 623 8.33333333333333e-02 492 488 1.66666666666667e-01 492 486 -2.50000000000000e-01 492 622 -1.66666666666667e-01 492 494 -3.33333333333333e-01 492 104 -8.33333333333333e-02 492 62 -8.33333333333333e-02 492 571 8.33333333333333e-02 492 556 -8.33333333333333e-02 492 485 -8.33333333333333e-02 492 482 8.33333333333333e-02 492 572 -1.66666666666667e-01 492 557 1.66666666666667e-01 492 555 -2.50000000000000e-01 492 484 1.66666666666667e-01 492 481 -1.66666666666667e-01 492 483 -2.50000000000000e-01 492 221 -8.33333333333333e-02 492 629 8.33333333333333e-02 492 220 1.66666666666667e-01 492 493 -3.33333333333333e-01 492 490 1.66666666666667e-01 492 628 8.33333333333333e-02 492 103 -8.33333333333333e-02 492 219 -2.50000000000000e-01 492 491 1.66666666666667e-01 492 209 -1.66666666666667e-01 492 208 8.33333333333333e-02 492 61 -8.33333333333333e-02 492 489 -7.50000000000000e-01 492 478 8.33333333333333e-02 493 493 2.50000000000000e+00 493 509 -8.33333333333333e-02 493 479 -1.66666666666667e-01 493 508 -2.50000000000000e-01 493 507 1.66666666666667e-01 493 486 -8.33333333333333e-02 493 488 1.66666666666667e-01 493 487 -2.50000000000000e-01 493 623 8.33333333333333e-02 493 621 -1.66666666666667e-01 493 570 8.33333333333333e-02 493 555 -8.33333333333333e-02 493 485 1.66666666666667e-01 493 494 -3.33333333333333e-01 493 557 1.66666666666667e-01 493 104 -8.33333333333333e-02 493 572 8.33333333333333e-02 493 556 -2.50000000000000e-01 493 62 -8.33333333333333e-02 493 482 8.33333333333333e-02 493 484 -7.50000000000000e-01 493 483 1.66666666666667e-01 493 480 -1.66666666666667e-01 493 209 8.33333333333333e-02 493 491 -8.33333333333333e-02 493 219 1.66666666666667e-01 493 492 -3.33333333333333e-01 493 489 1.66666666666667e-01 493 629 -1.66666666666667e-01 493 221 1.66666666666667e-01 493 220 -7.50000000000000e-01 493 627 8.33333333333333e-02 493 102 -8.33333333333333e-02 493 490 -2.50000000000000e-01 493 477 8.33333333333333e-02 493 207 8.33333333333333e-02 493 60 -8.33333333333333e-02 494 494 2.50000000000000e+00 494 507 1.66666666666667e-01 494 478 -1.66666666666667e-01 494 477 8.33333333333333e-02 494 509 -2.50000000000000e-01 494 487 1.66666666666667e-01 494 621 8.33333333333333e-02 494 488 -7.50000000000000e-01 494 486 1.66666666666667e-01 494 622 8.33333333333333e-02 494 492 -3.33333333333333e-01 494 102 -8.33333333333333e-02 494 60 -8.33333333333333e-02 494 484 1.66666666666667e-01 494 493 -3.33333333333333e-01 494 556 1.66666666666667e-01 494 483 -8.33333333333333e-02 494 480 8.33333333333333e-02 494 557 -7.50000000000000e-01 494 103 -8.33333333333333e-02 494 571 8.33333333333333e-02 494 570 -1.66666666666667e-01 494 555 1.66666666666667e-01 494 485 -2.50000000000000e-01 494 61 -8.33333333333333e-02 494 481 8.33333333333333e-02 494 219 -8.33333333333333e-02 494 627 8.33333333333333e-02 494 208 8.33333333333333e-02 494 490 -8.33333333333333e-02 494 221 -2.50000000000000e-01 494 628 -1.66666666666667e-01 494 220 1.66666666666667e-01 494 491 -2.50000000000000e-01 494 508 -8.33333333333333e-02 494 489 1.66666666666667e-01 494 207 -1.66666666666667e-01 495 495 2.50000000000000e+00 495 509 -8.33333333333333e-02 495 508 1.66666666666667e-01 495 507 -2.50000000000000e-01 495 572 8.33333333333333e-02 495 478 8.33333333333333e-02 495 479 -1.66666666666667e-01 495 485 1.66666666666667e-01 495 484 1.66666666666667e-01 495 483 -7.50000000000000e-01 495 496 -3.33333333333333e-01 495 64 -8.33333333333333e-02 495 76 -8.33333333333333e-02 495 574 -8.33333333333333e-02 495 568 8.33333333333333e-02 495 575 -8.33333333333333e-02 495 512 8.33333333333333e-02 495 65 1.66666666666667e-01 495 497 -3.33333333333333e-01 495 503 1.66666666666667e-01 495 511 -1.66666666666667e-01 495 502 1.66666666666667e-01 495 501 -7.50000000000000e-01 495 77 1.66666666666667e-01 495 569 -1.66666666666667e-01 495 166 -8.33333333333333e-02 495 460 8.33333333333333e-02 495 461 8.33333333333333e-02 495 167 -8.33333333333333e-02 495 63 -2.50000000000000e-01 495 467 -8.33333333333333e-02 495 179 8.33333333333333e-02 495 466 1.66666666666667e-01 495 178 -1.66666666666667e-01 495 465 -2.50000000000000e-01 495 571 8.33333333333333e-02 495 75 -2.50000000000000e-01 496 496 2.50000000000000e+00 496 509 1.66666666666667e-01 496 508 -7.50000000000000e-01 496 507 1.66666666666667e-01 496 572 -1.66666666666667e-01 496 477 8.33333333333333e-02 496 479 8.33333333333333e-02 496 485 -8.33333333333333e-02 496 484 -2.50000000000000e-01 496 483 1.66666666666667e-01 496 495 -3.33333333333333e-01 496 63 -8.33333333333333e-02 496 75 -8.33333333333333e-02 496 573 -8.33333333333333e-02 496 567 8.33333333333333e-02 496 512 8.33333333333333e-02 496 503 -8.33333333333333e-02 496 502 -2.50000000000000e-01 496 510 -1.66666666666667e-01 496 501 1.66666666666667e-01 496 575 -8.33333333333333e-02 496 569 8.33333333333333e-02 496 165 -8.33333333333333e-02 496 459 8.33333333333333e-02 496 167 -8.33333333333333e-02 496 179 8.33333333333333e-02 496 461 -1.66666666666667e-01 496 65 1.66666666666667e-01 496 64 -2.50000000000000e-01 496 467 1.66666666666667e-01 496 497 -3.33333333333333e-01 496 77 1.66666666666667e-01 496 466 -7.50000000000000e-01 496 570 8.33333333333333e-02 496 76 -2.50000000000000e-01 496 465 1.66666666666667e-01 496 177 -1.66666666666667e-01 497 497 2.50000000000000e+00 497 508 1.66666666666667e-01 497 507 -8.33333333333333e-02 497 571 -1.66666666666667e-01 497 570 8.33333333333333e-02 497 478 8.33333333333333e-02 497 477 -1.66666666666667e-01 497 485 -2.50000000000000e-01 497 484 -8.33333333333333e-02 497 483 1.66666666666667e-01 497 573 -8.33333333333333e-02 497 510 8.33333333333333e-02 497 503 -2.50000000000000e-01 497 511 8.33333333333333e-02 497 502 -8.33333333333333e-02 497 63 1.66666666666667e-01 497 495 -3.33333333333333e-01 497 501 1.66666666666667e-01 497 574 -8.33333333333333e-02 497 568 8.33333333333333e-02 497 75 1.66666666666667e-01 497 567 -1.66666666666667e-01 497 166 -8.33333333333333e-02 497 178 8.33333333333333e-02 497 65 -7.50000000000000e-01 497 460 -1.66666666666667e-01 497 64 1.66666666666667e-01 497 459 8.33333333333333e-02 497 165 -8.33333333333333e-02 497 467 -2.50000000000000e-01 497 509 -2.50000000000000e-01 497 77 -7.50000000000000e-01 497 466 1.66666666666667e-01 497 496 -3.33333333333333e-01 497 76 1.66666666666667e-01 497 465 -8.33333333333333e-02 497 177 8.33333333333333e-02 498 498 1.25000000000000e+00 498 461 4.16666666666667e-02 498 460 -8.33333333333333e-02 498 469 8.33333333333333e-02 498 468 -1.25000000000000e-01 498 65 8.33333333333333e-02 498 500 -1.66666666666667e-01 498 503 1.66666666666667e-01 498 502 -8.33333333333333e-02 498 501 -2.50000000000000e-01 498 80 8.33333333333333e-02 498 587 -1.66666666666667e-01 498 586 8.33333333333333e-02 498 511 8.33333333333333e-02 498 589 -8.33333333333333e-02 498 227 4.16666666666667e-02 498 590 -8.33333333333333e-02 498 79 8.33333333333333e-02 498 226 -8.33333333333333e-02 498 78 -3.75000000000000e-01 498 224 -4.16666666666667e-02 498 512 8.33333333333333e-02 498 499 -1.66666666666667e-01 498 223 8.33333333333333e-02 498 64 8.33333333333333e-02 498 470 -4.16666666666667e-02 498 222 -1.25000000000000e-01 498 63 -3.75000000000000e-01 499 499 1.25000000000000e+00 499 500 -1.66666666666667e-01 499 65 -4.16666666666667e-02 499 461 4.16666666666667e-02 499 459 -8.33333333333333e-02 499 80 -4.16666666666667e-02 499 469 -3.75000000000000e-01 499 468 8.33333333333333e-02 499 587 8.33333333333333e-02 499 503 1.66666666666667e-01 499 502 -2.50000000000000e-01 499 501 -8.33333333333333e-02 499 585 8.33333333333333e-02 499 510 8.33333333333333e-02 499 588 -8.33333333333333e-02 499 227 4.16666666666667e-02 499 590 -8.33333333333333e-02 499 79 -1.25000000000000e-01 499 78 8.33333333333333e-02 499 225 -8.33333333333333e-02 499 224 8.33333333333333e-02 499 512 -1.66666666666667e-01 499 470 8.33333333333333e-02 499 223 -3.75000000000000e-01 499 64 -1.25000000000000e-01 499 498 -1.66666666666667e-01 499 222 8.33333333333333e-02 499 63 8.33333333333333e-02 500 500 1.25000000000000e+00 500 499 -1.66666666666667e-01 500 468 -4.16666666666667e-02 500 459 4.16666666666667e-02 500 64 -4.16666666666667e-02 500 460 4.16666666666667e-02 500 470 -1.25000000000000e-01 500 79 -4.16666666666667e-02 500 586 8.33333333333333e-02 500 503 -7.50000000000000e-01 500 502 1.66666666666667e-01 500 63 8.33333333333333e-02 500 498 -1.66666666666667e-01 500 501 1.66666666666667e-01 500 78 8.33333333333333e-02 500 585 -1.66666666666667e-01 500 226 4.16666666666667e-02 500 589 -8.33333333333333e-02 500 80 -1.25000000000000e-01 500 225 4.16666666666667e-02 500 588 -8.33333333333333e-02 500 469 8.33333333333333e-02 500 224 -1.25000000000000e-01 500 65 -1.25000000000000e-01 500 223 8.33333333333333e-02 500 511 -1.66666666666667e-01 500 222 -4.16666666666667e-02 500 510 8.33333333333333e-02 501 501 2.50000000000000e+00 501 466 -1.66666666666667e-01 501 461 -8.33333333333333e-02 501 469 8.33333333333333e-02 501 460 -8.33333333333333e-02 501 470 8.33333333333333e-02 501 476 -8.33333333333333e-02 501 475 1.66666666666667e-01 501 474 -2.50000000000000e-01 501 590 8.33333333333333e-02 501 589 -1.66666666666667e-01 501 586 1.66666666666667e-01 501 500 1.66666666666667e-01 501 64 8.33333333333333e-02 501 499 -8.33333333333333e-02 501 498 -2.50000000000000e-01 501 587 1.66666666666667e-01 501 85 8.33333333333333e-02 501 585 -7.50000000000000e-01 501 503 -3.33333333333333e-01 501 568 -8.33333333333333e-02 501 512 -8.33333333333333e-02 501 574 8.33333333333333e-02 501 598 -8.33333333333333e-02 501 575 8.33333333333333e-02 501 599 -8.33333333333333e-02 501 65 -1.66666666666667e-01 501 497 1.66666666666667e-01 501 511 1.66666666666667e-01 501 496 1.66666666666667e-01 501 502 -3.33333333333333e-01 501 510 -2.50000000000000e-01 501 495 -7.50000000000000e-01 501 569 1.66666666666667e-01 501 86 -1.66666666666667e-01 501 467 8.33333333333333e-02 501 567 -2.50000000000000e-01 502 502 2.50000000000000e+00 502 465 -1.66666666666667e-01 502 468 8.33333333333333e-02 502 459 -8.33333333333333e-02 502 470 -1.66666666666667e-01 502 476 1.66666666666667e-01 502 461 -8.33333333333333e-02 502 475 -7.50000000000000e-01 502 474 1.66666666666667e-01 502 590 8.33333333333333e-02 502 587 -8.33333333333333e-02 502 588 -1.66666666666667e-01 502 585 1.66666666666667e-01 502 500 1.66666666666667e-01 502 503 -3.33333333333333e-01 502 499 -2.50000000000000e-01 502 63 8.33333333333333e-02 502 498 -8.33333333333333e-02 502 586 -2.50000000000000e-01 502 84 8.33333333333333e-02 502 567 -8.33333333333333e-02 502 512 1.66666666666667e-01 502 573 8.33333333333333e-02 502 597 -8.33333333333333e-02 502 575 -1.66666666666667e-01 502 569 1.66666666666667e-01 502 65 8.33333333333333e-02 502 497 -8.33333333333333e-02 502 511 -7.50000000000000e-01 502 496 -2.50000000000000e-01 502 510 1.66666666666667e-01 502 495 1.66666666666667e-01 502 501 -3.33333333333333e-01 502 599 -8.33333333333333e-02 502 86 8.33333333333333e-02 502 467 8.33333333333333e-02 502 568 -2.50000000000000e-01 503 503 2.50000000000000e+00 503 465 8.33333333333333e-02 503 459 -8.33333333333333e-02 503 469 -1.66666666666667e-01 503 475 1.66666666666667e-01 503 468 8.33333333333333e-02 503 474 -8.33333333333333e-02 503 460 -8.33333333333333e-02 503 476 -2.50000000000000e-01 503 589 8.33333333333333e-02 503 586 -8.33333333333333e-02 503 588 8.33333333333333e-02 503 500 -7.50000000000000e-01 503 499 1.66666666666667e-01 503 502 -3.33333333333333e-01 503 498 1.66666666666667e-01 503 587 -2.50000000000000e-01 503 585 1.66666666666667e-01 503 501 -3.33333333333333e-01 503 510 -8.33333333333333e-02 503 511 1.66666666666667e-01 503 574 -1.66666666666667e-01 503 568 1.66666666666667e-01 503 573 8.33333333333333e-02 503 597 -8.33333333333333e-02 503 512 -2.50000000000000e-01 503 497 -2.50000000000000e-01 503 64 8.33333333333333e-02 503 496 -8.33333333333333e-02 503 63 -1.66666666666667e-01 503 495 1.66666666666667e-01 503 466 8.33333333333333e-02 503 569 -7.50000000000000e-01 503 598 -8.33333333333333e-02 503 85 8.33333333333333e-02 503 567 1.66666666666667e-01 503 84 -1.66666666666667e-01 504 504 1.25000000000000e+00 504 488 8.33333333333333e-02 504 479 4.16666666666667e-02 504 65 -4.16666666666667e-02 504 478 -8.33333333333333e-02 504 98 -4.16666666666667e-02 504 487 8.33333333333333e-02 504 486 -3.75000000000000e-01 504 623 8.33333333333333e-02 504 622 8.33333333333333e-02 504 509 1.66666666666667e-01 504 508 -8.33333333333333e-02 504 507 -2.50000000000000e-01 504 511 8.33333333333333e-02 504 625 -8.33333333333333e-02 504 230 4.16666666666667e-02 504 626 -8.33333333333333e-02 504 229 -8.33333333333333e-02 504 97 8.33333333333333e-02 504 96 -1.25000000000000e-01 504 224 8.33333333333333e-02 504 512 -1.66666666666667e-01 504 223 8.33333333333333e-02 504 505 -1.66666666666667e-01 504 64 8.33333333333333e-02 504 222 -3.75000000000000e-01 504 506 -1.66666666666667e-01 504 63 -1.25000000000000e-01 505 505 1.25000000000000e+00 505 479 4.16666666666667e-02 505 477 -8.33333333333333e-02 505 487 -1.25000000000000e-01 505 486 8.33333333333333e-02 505 98 8.33333333333333e-02 505 623 -1.66666666666667e-01 505 621 8.33333333333333e-02 505 506 -1.66666666666667e-01 505 65 8.33333333333333e-02 505 509 1.66666666666667e-01 505 508 -2.50000000000000e-01 505 507 -8.33333333333333e-02 505 510 8.33333333333333e-02 505 624 -8.33333333333333e-02 505 230 4.16666666666667e-02 505 626 -8.33333333333333e-02 505 97 -3.75000000000000e-01 505 228 -8.33333333333333e-02 505 96 8.33333333333333e-02 505 224 -4.16666666666667e-02 505 512 8.33333333333333e-02 505 223 -1.25000000000000e-01 505 488 -4.16666666666667e-02 505 64 -3.75000000000000e-01 505 222 8.33333333333333e-02 505 504 -1.66666666666667e-01 505 63 8.33333333333333e-02 506 506 1.25000000000000e+00 506 478 4.16666666666667e-02 506 504 -1.66666666666667e-01 506 486 8.33333333333333e-02 506 477 4.16666666666667e-02 506 63 -4.16666666666667e-02 506 488 -1.25000000000000e-01 506 96 -4.16666666666667e-02 506 621 8.33333333333333e-02 506 97 8.33333333333333e-02 506 622 -1.66666666666667e-01 506 509 -7.50000000000000e-01 506 505 -1.66666666666667e-01 506 64 8.33333333333333e-02 506 508 1.66666666666667e-01 506 507 1.66666666666667e-01 506 228 4.16666666666667e-02 506 624 -8.33333333333333e-02 506 98 -1.25000000000000e-01 506 229 4.16666666666667e-02 506 625 -8.33333333333333e-02 506 224 -1.25000000000000e-01 506 487 -4.16666666666667e-02 506 65 -1.25000000000000e-01 506 223 -4.16666666666667e-02 506 511 8.33333333333333e-02 506 222 8.33333333333333e-02 506 510 -1.66666666666667e-01 507 507 2.50000000000000e+00 507 484 -1.66666666666667e-01 507 478 -8.33333333333333e-02 507 487 8.33333333333333e-02 507 494 1.66666666666667e-01 507 488 -1.66666666666667e-01 507 479 -8.33333333333333e-02 507 493 1.66666666666667e-01 507 492 -7.50000000000000e-01 507 626 8.33333333333333e-02 507 623 -8.33333333333333e-02 507 622 1.66666666666667e-01 507 625 -1.66666666666667e-01 507 506 1.66666666666667e-01 507 509 -3.33333333333333e-01 507 505 -8.33333333333333e-02 507 64 8.33333333333333e-02 507 504 -2.50000000000000e-01 507 103 8.33333333333333e-02 507 621 -2.50000000000000e-01 507 571 -8.33333333333333e-02 507 512 1.66666666666667e-01 507 574 8.33333333333333e-02 507 634 -8.33333333333333e-02 507 575 -1.66666666666667e-01 507 572 1.66666666666667e-01 507 65 8.33333333333333e-02 507 497 -8.33333333333333e-02 507 511 1.66666666666667e-01 507 496 1.66666666666667e-01 507 508 -3.33333333333333e-01 507 510 -7.50000000000000e-01 507 495 -2.50000000000000e-01 507 635 -8.33333333333333e-02 507 104 8.33333333333333e-02 507 485 8.33333333333333e-02 507 570 -2.50000000000000e-01 508 508 2.50000000000000e+00 508 483 -1.66666666666667e-01 508 479 -8.33333333333333e-02 508 477 -8.33333333333333e-02 508 486 8.33333333333333e-02 508 494 -8.33333333333333e-02 508 488 8.33333333333333e-02 508 493 -2.50000000000000e-01 508 492 1.66666666666667e-01 508 626 8.33333333333333e-02 508 621 1.66666666666667e-01 508 624 -1.66666666666667e-01 508 506 1.66666666666667e-01 508 505 -2.50000000000000e-01 508 504 -8.33333333333333e-02 508 63 8.33333333333333e-02 508 623 1.66666666666667e-01 508 622 -7.50000000000000e-01 508 102 8.33333333333333e-02 508 509 -3.33333333333333e-01 508 570 -8.33333333333333e-02 508 512 -8.33333333333333e-02 508 573 8.33333333333333e-02 508 633 -8.33333333333333e-02 508 635 -8.33333333333333e-02 508 575 8.33333333333333e-02 508 65 -1.66666666666667e-01 508 497 1.66666666666667e-01 508 511 -2.50000000000000e-01 508 496 -7.50000000000000e-01 508 510 1.66666666666667e-01 508 495 1.66666666666667e-01 508 507 -3.33333333333333e-01 508 572 1.66666666666667e-01 508 104 -1.66666666666667e-01 508 485 8.33333333333333e-02 508 571 -2.50000000000000e-01 509 509 2.50000000000000e+00 509 484 8.33333333333333e-02 509 478 -8.33333333333333e-02 509 493 -8.33333333333333e-02 509 487 8.33333333333333e-02 509 492 1.66666666666667e-01 509 486 -1.66666666666667e-01 509 477 -8.33333333333333e-02 509 494 -2.50000000000000e-01 509 624 8.33333333333333e-02 509 621 -8.33333333333333e-02 509 625 8.33333333333333e-02 509 506 -7.50000000000000e-01 509 505 1.66666666666667e-01 509 504 1.66666666666667e-01 509 507 -3.33333333333333e-01 509 623 -2.50000000000000e-01 509 622 1.66666666666667e-01 509 508 -3.33333333333333e-01 509 511 -8.33333333333333e-02 509 510 1.66666666666667e-01 509 634 -8.33333333333333e-02 509 574 8.33333333333333e-02 509 573 -1.66666666666667e-01 509 570 1.66666666666667e-01 509 512 -2.50000000000000e-01 509 497 -2.50000000000000e-01 509 64 -1.66666666666667e-01 509 496 1.66666666666667e-01 509 63 8.33333333333333e-02 509 495 -8.33333333333333e-02 509 483 8.33333333333333e-02 509 572 -7.50000000000000e-01 509 571 1.66666666666667e-01 509 103 -1.66666666666667e-01 509 633 -8.33333333333333e-02 509 102 8.33333333333333e-02 510 510 2.50000000000000e+00 510 634 8.33333333333333e-02 510 635 8.33333333333333e-02 510 508 1.66666666666667e-01 510 507 -7.50000000000000e-01 510 505 8.33333333333333e-02 510 626 -8.33333333333333e-02 510 506 -1.66666666666667e-01 510 625 1.66666666666667e-01 510 624 -2.50000000000000e-01 510 511 -3.33333333333333e-01 510 64 -8.33333333333333e-02 510 106 -8.33333333333333e-02 510 497 8.33333333333333e-02 510 503 -8.33333333333333e-02 510 574 -8.33333333333333e-02 510 598 8.33333333333333e-02 510 496 -1.66666666666667e-01 510 502 1.66666666666667e-01 510 501 -2.50000000000000e-01 510 575 1.66666666666667e-01 510 599 -1.66666666666667e-01 510 573 -2.50000000000000e-01 510 223 -8.33333333333333e-02 510 499 8.33333333333333e-02 510 224 1.66666666666667e-01 510 512 -3.33333333333333e-01 510 590 1.66666666666667e-01 510 500 8.33333333333333e-02 510 65 -8.33333333333333e-02 510 222 -2.50000000000000e-01 510 233 8.33333333333333e-02 510 107 -8.33333333333333e-02 510 589 1.66666666666667e-01 510 232 -1.66666666666667e-01 510 588 -7.50000000000000e-01 510 509 1.66666666666667e-01 511 511 2.50000000000000e+00 511 633 8.33333333333333e-02 511 635 -1.66666666666667e-01 511 508 -2.50000000000000e-01 511 507 1.66666666666667e-01 511 504 8.33333333333333e-02 511 626 1.66666666666667e-01 511 506 8.33333333333333e-02 511 625 -7.50000000000000e-01 511 624 1.66666666666667e-01 511 510 -3.33333333333333e-01 511 63 -8.33333333333333e-02 511 105 -8.33333333333333e-02 511 575 1.66666666666667e-01 511 512 -3.33333333333333e-01 511 503 1.66666666666667e-01 511 573 -8.33333333333333e-02 511 597 8.33333333333333e-02 511 65 -8.33333333333333e-02 511 497 8.33333333333333e-02 511 502 -7.50000000000000e-01 511 495 -1.66666666666667e-01 511 501 1.66666666666667e-01 511 107 -8.33333333333333e-02 511 599 8.33333333333333e-02 511 574 -2.50000000000000e-01 511 222 -8.33333333333333e-02 511 498 8.33333333333333e-02 511 233 8.33333333333333e-02 511 590 -8.33333333333333e-02 511 500 -1.66666666666667e-01 511 224 1.66666666666667e-01 511 223 -2.50000000000000e-01 511 589 -2.50000000000000e-01 511 509 -8.33333333333333e-02 511 588 1.66666666666667e-01 511 231 -1.66666666666667e-01 512 512 2.50000000000000e+00 512 507 1.66666666666667e-01 512 634 -1.66666666666667e-01 512 633 8.33333333333333e-02 512 509 -2.50000000000000e-01 512 625 1.66666666666667e-01 512 624 -8.33333333333333e-02 512 505 8.33333333333333e-02 512 504 -1.66666666666667e-01 512 626 -2.50000000000000e-01 512 495 8.33333333333333e-02 512 501 -8.33333333333333e-02 512 574 1.66666666666667e-01 512 511 -3.33333333333333e-01 512 502 1.66666666666667e-01 512 503 -2.50000000000000e-01 512 64 -8.33333333333333e-02 512 496 8.33333333333333e-02 512 575 -7.50000000000000e-01 512 106 -8.33333333333333e-02 512 598 8.33333333333333e-02 512 573 1.66666666666667e-01 512 597 -1.66666666666667e-01 512 232 8.33333333333333e-02 512 589 -8.33333333333333e-02 512 222 1.66666666666667e-01 512 510 -3.33333333333333e-01 512 588 1.66666666666667e-01 512 224 -7.50000000000000e-01 512 499 -1.66666666666667e-01 512 223 1.66666666666667e-01 512 498 8.33333333333333e-02 512 63 -8.33333333333333e-02 512 590 -2.50000000000000e-01 512 508 -8.33333333333333e-02 512 231 8.33333333333333e-02 512 105 -8.33333333333333e-02 513 513 1.25000000000000e+00 513 545 -8.33333333333333e-02 513 542 -8.33333333333333e-02 513 541 4.16666666666667e-02 513 544 -8.33333333333333e-02 513 524 8.33333333333333e-02 513 523 -4.16666666666667e-02 513 529 8.33333333333333e-02 513 522 -1.25000000000000e-01 513 172 -4.16666666666667e-02 513 169 4.16666666666667e-02 513 533 8.33333333333333e-02 513 521 -8.33333333333333e-02 513 68 8.33333333333333e-02 513 170 -8.33333333333333e-02 513 67 8.33333333333333e-02 513 514 -1.66666666666667e-01 513 520 1.66666666666667e-01 513 66 -3.75000000000000e-01 513 519 -2.50000000000000e-01 513 515 -1.66666666666667e-01 513 71 8.33333333333333e-02 513 173 8.33333333333333e-02 513 70 8.33333333333333e-02 513 532 -1.66666666666667e-01 513 530 8.33333333333333e-02 513 69 -3.75000000000000e-01 513 171 -1.25000000000000e-01 514 514 1.25000000000000e+00 514 545 -8.33333333333333e-02 514 540 4.16666666666667e-02 514 543 -8.33333333333333e-02 514 524 8.33333333333333e-02 514 530 -1.66666666666667e-01 514 523 -1.25000000000000e-01 514 522 -4.16666666666667e-02 514 528 8.33333333333333e-02 514 171 -4.16666666666667e-02 514 168 4.16666666666667e-02 514 173 8.33333333333333e-02 514 515 -1.66666666666667e-01 514 521 1.66666666666667e-01 514 68 -4.16666666666667e-02 514 170 4.16666666666667e-02 514 67 -1.25000000000000e-01 514 520 -7.50000000000000e-01 514 66 8.33333333333333e-02 514 513 -1.66666666666667e-01 514 519 1.66666666666667e-01 514 71 -4.16666666666667e-02 514 533 8.33333333333333e-02 514 542 4.16666666666667e-02 514 70 -1.25000000000000e-01 514 172 -1.25000000000000e-01 514 69 8.33333333333333e-02 514 531 -1.66666666666667e-01 515 515 1.25000000000000e+00 515 544 -8.33333333333333e-02 515 528 8.33333333333333e-02 515 543 -8.33333333333333e-02 515 540 -8.33333333333333e-02 515 524 -3.75000000000000e-01 515 523 8.33333333333333e-02 515 529 -1.66666666666667e-01 515 522 8.33333333333333e-02 515 172 8.33333333333333e-02 515 514 -1.66666666666667e-01 515 520 1.66666666666667e-01 515 531 8.33333333333333e-02 515 519 -8.33333333333333e-02 515 68 -1.25000000000000e-01 515 521 -2.50000000000000e-01 515 67 -4.16666666666667e-02 515 169 4.16666666666667e-02 515 66 8.33333333333333e-02 515 168 -8.33333333333333e-02 515 541 4.16666666666667e-02 515 71 -1.25000000000000e-01 515 173 -3.75000000000000e-01 515 70 -4.16666666666667e-02 515 532 8.33333333333333e-02 515 513 -1.66666666666667e-01 515 69 8.33333333333333e-02 515 171 8.33333333333333e-02 516 516 2.50000000000000e+00 516 530 -1.66666666666667e-01 516 529 8.33333333333333e-02 516 562 -8.33333333333333e-02 516 521 1.66666666666667e-01 516 551 8.33333333333333e-02 516 550 -1.66666666666667e-01 516 520 1.66666666666667e-01 516 519 -7.50000000000000e-01 516 518 -3.33333333333333e-01 516 527 1.66666666666667e-01 516 526 -8.33333333333333e-02 516 559 8.33333333333333e-02 516 560 8.33333333333333e-02 516 74 -8.33333333333333e-02 516 68 -8.33333333333333e-02 516 525 -2.50000000000000e-01 516 410 8.33333333333333e-02 516 67 1.66666666666667e-01 516 409 -1.66666666666667e-01 516 413 1.66666666666667e-01 516 517 -3.33333333333333e-01 516 73 1.66666666666667e-01 516 412 1.66666666666667e-01 516 411 -7.50000000000000e-01 516 170 8.33333333333333e-02 516 347 -8.33333333333333e-02 516 169 8.33333333333333e-02 516 346 -8.33333333333333e-02 516 66 -2.50000000000000e-01 516 176 1.66666666666667e-01 516 350 -1.66666666666667e-01 516 175 -8.33333333333333e-02 516 349 8.33333333333333e-02 516 174 -2.50000000000000e-01 516 563 -8.33333333333333e-02 516 72 -2.50000000000000e-01 517 517 2.50000000000000e+00 517 563 -8.33333333333333e-02 517 528 8.33333333333333e-02 517 561 -8.33333333333333e-02 517 551 8.33333333333333e-02 517 521 -8.33333333333333e-02 517 549 -1.66666666666667e-01 517 520 -2.50000000000000e-01 517 519 1.66666666666667e-01 517 525 -8.33333333333333e-02 517 558 8.33333333333333e-02 517 560 -1.66666666666667e-01 517 527 1.66666666666667e-01 517 526 -2.50000000000000e-01 517 410 8.33333333333333e-02 517 66 1.66666666666667e-01 517 408 -1.66666666666667e-01 517 413 -8.33333333333333e-02 517 412 -2.50000000000000e-01 517 516 -3.33333333333333e-01 517 72 1.66666666666667e-01 517 411 1.66666666666667e-01 517 350 8.33333333333333e-02 517 347 -8.33333333333333e-02 517 170 -1.66666666666667e-01 517 68 1.66666666666667e-01 517 67 -7.50000000000000e-01 517 168 8.33333333333333e-02 517 345 -8.33333333333333e-02 517 176 1.66666666666667e-01 517 518 -3.33333333333333e-01 517 74 1.66666666666667e-01 517 175 -2.50000000000000e-01 517 530 8.33333333333333e-02 517 73 -7.50000000000000e-01 517 174 -8.33333333333333e-02 517 348 8.33333333333333e-02 518 518 2.50000000000000e+00 518 529 8.33333333333333e-02 518 562 -8.33333333333333e-02 518 528 -1.66666666666667e-01 518 550 8.33333333333333e-02 518 520 -8.33333333333333e-02 518 519 1.66666666666667e-01 518 549 8.33333333333333e-02 518 521 -2.50000000000000e-01 518 516 -3.33333333333333e-01 518 525 1.66666666666667e-01 518 559 -1.66666666666667e-01 518 558 8.33333333333333e-02 518 72 -8.33333333333333e-02 518 527 -7.50000000000000e-01 518 526 1.66666666666667e-01 518 66 -8.33333333333333e-02 518 408 8.33333333333333e-02 518 409 8.33333333333333e-02 518 413 -2.50000000000000e-01 518 412 -8.33333333333333e-02 518 411 1.66666666666667e-01 518 349 8.33333333333333e-02 518 346 -8.33333333333333e-02 518 168 8.33333333333333e-02 518 345 -8.33333333333333e-02 518 68 -2.50000000000000e-01 518 169 -1.66666666666667e-01 518 67 1.66666666666667e-01 518 176 -7.50000000000000e-01 518 561 -8.33333333333333e-02 518 74 -2.50000000000000e-01 518 175 1.66666666666667e-01 518 517 -3.33333333333333e-01 518 73 1.66666666666667e-01 518 174 1.66666666666667e-01 518 348 -1.66666666666667e-01 519 519 2.50000000000000e+00 519 563 8.33333333333333e-02 519 518 1.66666666666667e-01 519 176 -1.66666666666667e-01 519 175 8.33333333333333e-02 519 517 1.66666666666667e-01 519 516 -7.50000000000000e-01 519 551 -8.33333333333333e-02 519 550 1.66666666666667e-01 519 549 -2.50000000000000e-01 519 529 -8.33333333333333e-02 519 577 -8.33333333333333e-02 519 544 8.33333333333333e-02 519 530 1.66666666666667e-01 519 545 -1.66666666666667e-01 519 77 8.33333333333333e-02 519 578 -8.33333333333333e-02 519 68 8.33333333333333e-02 519 528 -2.50000000000000e-01 519 170 -8.33333333333333e-02 519 169 -8.33333333333333e-02 519 173 8.33333333333333e-02 519 515 -8.33333333333333e-02 519 520 -3.33333333333333e-01 519 172 8.33333333333333e-02 519 178 -8.33333333333333e-02 519 67 -1.66666666666667e-01 519 514 1.66666666666667e-01 519 513 -2.50000000000000e-01 519 521 -3.33333333333333e-01 519 533 1.66666666666667e-01 519 179 1.66666666666667e-01 519 532 1.66666666666667e-01 519 76 -1.66666666666667e-01 519 562 8.33333333333333e-02 519 531 -7.50000000000000e-01 519 177 -2.50000000000000e-01 520 520 2.50000000000000e+00 520 563 -1.66666666666667e-01 520 518 -8.33333333333333e-02 520 176 8.33333333333333e-02 520 174 8.33333333333333e-02 520 517 -2.50000000000000e-01 520 516 1.66666666666667e-01 520 551 1.66666666666667e-01 520 550 -7.50000000000000e-01 520 549 1.66666666666667e-01 520 528 -8.33333333333333e-02 520 576 -8.33333333333333e-02 520 543 8.33333333333333e-02 520 578 -8.33333333333333e-02 520 545 8.33333333333333e-02 520 521 -3.33333333333333e-01 520 530 1.66666666666667e-01 520 529 -2.50000000000000e-01 520 168 -8.33333333333333e-02 520 515 1.66666666666667e-01 520 519 -3.33333333333333e-01 520 173 -1.66666666666667e-01 520 179 1.66666666666667e-01 520 171 8.33333333333333e-02 520 177 -8.33333333333333e-02 520 68 8.33333333333333e-02 520 170 -8.33333333333333e-02 520 514 -7.50000000000000e-01 520 66 -1.66666666666667e-01 520 513 1.66666666666667e-01 520 533 -8.33333333333333e-02 520 77 8.33333333333333e-02 520 561 8.33333333333333e-02 520 532 -2.50000000000000e-01 520 178 -2.50000000000000e-01 520 531 1.66666666666667e-01 520 75 -1.66666666666667e-01 521 521 2.50000000000000e+00 521 561 8.33333333333333e-02 521 517 -8.33333333333333e-02 521 175 8.33333333333333e-02 521 516 1.66666666666667e-01 521 174 -1.66666666666667e-01 521 518 -2.50000000000000e-01 521 551 -2.50000000000000e-01 521 550 1.66666666666667e-01 521 549 -8.33333333333333e-02 521 577 -8.33333333333333e-02 521 544 8.33333333333333e-02 521 528 1.66666666666667e-01 521 543 -1.66666666666667e-01 521 75 8.33333333333333e-02 521 576 -8.33333333333333e-02 521 530 -7.50000000000000e-01 521 520 -3.33333333333333e-01 521 529 1.66666666666667e-01 521 66 8.33333333333333e-02 521 168 -8.33333333333333e-02 521 514 1.66666666666667e-01 521 171 8.33333333333333e-02 521 513 -8.33333333333333e-02 521 172 -1.66666666666667e-01 521 178 1.66666666666667e-01 521 515 -2.50000000000000e-01 521 67 8.33333333333333e-02 521 169 -8.33333333333333e-02 521 562 -1.66666666666667e-01 521 533 -2.50000000000000e-01 521 179 -7.50000000000000e-01 521 532 -8.33333333333333e-02 521 76 8.33333333333333e-02 521 519 -3.33333333333333e-01 521 531 1.66666666666667e-01 521 177 1.66666666666667e-01 522 522 1.25000000000000e+00 522 545 8.33333333333333e-02 522 544 -1.66666666666667e-01 522 515 8.33333333333333e-02 522 514 -4.16666666666667e-02 522 67 4.16666666666667e-02 522 513 -1.25000000000000e-01 522 542 8.33333333333333e-02 522 118 4.16666666666667e-02 522 540 -3.75000000000000e-01 522 530 -8.33333333333333e-02 522 524 -1.66666666666667e-01 522 256 -4.16666666666667e-02 522 659 -8.33333333333333e-02 522 263 8.33333333333333e-02 522 658 -8.33333333333333e-02 522 262 8.33333333333333e-02 522 257 8.33333333333333e-02 522 119 -8.33333333333333e-02 522 255 -1.25000000000000e-01 522 251 8.33333333333333e-02 522 68 -8.33333333333333e-02 522 250 8.33333333333333e-02 522 523 -1.66666666666667e-01 522 529 1.66666666666667e-01 522 249 -3.75000000000000e-01 522 541 8.33333333333333e-02 522 528 -2.50000000000000e-01 523 523 1.25000000000000e+00 523 540 8.33333333333333e-02 523 545 8.33333333333333e-02 523 543 -1.66666666666667e-01 523 515 8.33333333333333e-02 523 524 -1.66666666666667e-01 523 514 -1.25000000000000e-01 523 513 -4.16666666666667e-02 523 66 4.16666666666667e-02 523 541 -1.25000000000000e-01 523 117 4.16666666666667e-02 523 255 -4.16666666666667e-02 523 257 8.33333333333333e-02 523 530 1.66666666666667e-01 523 263 -1.66666666666667e-01 523 657 -8.33333333333333e-02 523 261 8.33333333333333e-02 523 119 4.16666666666667e-02 523 659 -8.33333333333333e-02 523 256 -1.25000000000000e-01 523 251 -4.16666666666667e-02 523 68 4.16666666666667e-02 523 250 -1.25000000000000e-01 523 542 -4.16666666666667e-02 523 529 -7.50000000000000e-01 523 249 8.33333333333333e-02 523 522 -1.66666666666667e-01 523 528 1.66666666666667e-01 524 524 1.25000000000000e+00 524 543 8.33333333333333e-02 524 544 8.33333333333333e-02 524 515 -3.75000000000000e-01 524 514 8.33333333333333e-02 524 523 -1.66666666666667e-01 524 513 8.33333333333333e-02 524 542 -1.25000000000000e-01 524 540 8.33333333333333e-02 524 528 -8.33333333333333e-02 524 522 -1.66666666666667e-01 524 256 8.33333333333333e-02 524 657 -8.33333333333333e-02 524 261 8.33333333333333e-02 524 529 1.66666666666667e-01 524 262 -1.66666666666667e-01 524 257 -3.75000000000000e-01 524 118 4.16666666666667e-02 524 658 -8.33333333333333e-02 524 255 8.33333333333333e-02 524 117 -8.33333333333333e-02 524 251 -1.25000000000000e-01 524 541 -4.16666666666667e-02 524 530 -2.50000000000000e-01 524 250 -4.16666666666667e-02 524 67 4.16666666666667e-02 524 249 8.33333333333333e-02 524 66 -8.33333333333333e-02 525 525 2.50000000000000e+00 525 562 -1.66666666666667e-01 525 530 1.66666666666667e-01 525 263 -1.66666666666667e-01 525 664 -8.33333333333333e-02 525 262 8.33333333333333e-02 525 665 -8.33333333333333e-02 525 529 1.66666666666667e-01 525 528 -7.50000000000000e-01 525 518 1.66666666666667e-01 525 517 -8.33333333333333e-02 525 413 -1.66666666666667e-01 525 412 8.33333333333333e-02 525 122 8.33333333333333e-02 525 560 -8.33333333333333e-02 525 559 1.66666666666667e-01 525 526 -3.33333333333333e-01 525 558 -2.50000000000000e-01 525 68 8.33333333333333e-02 525 516 -2.50000000000000e-01 525 251 -8.33333333333333e-02 525 250 1.66666666666667e-01 525 410 -8.33333333333333e-02 525 248 8.33333333333333e-02 525 421 1.66666666666667e-01 525 247 -1.66666666666667e-01 525 67 8.33333333333333e-02 525 409 -8.33333333333333e-02 525 249 -2.50000000000000e-01 525 527 -3.33333333333333e-01 525 260 1.66666666666667e-01 525 422 1.66666666666667e-01 525 259 -8.33333333333333e-02 525 121 8.33333333333333e-02 525 563 8.33333333333333e-02 525 258 -2.50000000000000e-01 525 420 -7.50000000000000e-01 526 526 2.50000000000000e+00 526 561 -1.66666666666667e-01 526 530 -8.33333333333333e-02 526 665 -8.33333333333333e-02 526 263 8.33333333333333e-02 526 663 -8.33333333333333e-02 526 261 8.33333333333333e-02 526 529 -2.50000000000000e-01 526 528 1.66666666666667e-01 526 516 -8.33333333333333e-02 526 413 8.33333333333333e-02 526 411 8.33333333333333e-02 526 560 1.66666666666667e-01 526 559 -7.50000000000000e-01 526 558 1.66666666666667e-01 526 525 -3.33333333333333e-01 526 518 1.66666666666667e-01 526 517 -2.50000000000000e-01 526 422 -8.33333333333333e-02 526 527 -3.33333333333333e-01 526 410 -8.33333333333333e-02 526 248 8.33333333333333e-02 526 249 1.66666666666667e-01 526 420 1.66666666666667e-01 526 246 -1.66666666666667e-01 526 68 -1.66666666666667e-01 526 251 1.66666666666667e-01 526 250 -7.50000000000000e-01 526 66 8.33333333333333e-02 526 408 -8.33333333333333e-02 526 260 1.66666666666667e-01 526 122 -1.66666666666667e-01 526 563 8.33333333333333e-02 526 259 -2.50000000000000e-01 526 421 -2.50000000000000e-01 526 258 -8.33333333333333e-02 526 120 8.33333333333333e-02 527 527 2.50000000000000e+00 527 561 8.33333333333333e-02 527 529 -8.33333333333333e-02 527 664 -8.33333333333333e-02 527 262 8.33333333333333e-02 527 528 1.66666666666667e-01 527 261 -1.66666666666667e-01 527 663 -8.33333333333333e-02 527 530 -2.50000000000000e-01 527 516 1.66666666666667e-01 527 412 8.33333333333333e-02 527 411 -1.66666666666667e-01 527 560 -2.50000000000000e-01 527 559 1.66666666666667e-01 527 120 8.33333333333333e-02 527 558 -8.33333333333333e-02 527 518 -7.50000000000000e-01 527 517 1.66666666666667e-01 527 66 8.33333333333333e-02 527 421 -8.33333333333333e-02 527 526 -3.33333333333333e-01 527 249 -8.33333333333333e-02 527 409 -8.33333333333333e-02 527 247 8.33333333333333e-02 527 408 -8.33333333333333e-02 527 246 8.33333333333333e-02 527 251 -2.50000000000000e-01 527 67 -1.66666666666667e-01 527 250 1.66666666666667e-01 527 562 8.33333333333333e-02 527 260 -7.50000000000000e-01 527 422 -2.50000000000000e-01 527 259 1.66666666666667e-01 527 121 -1.66666666666667e-01 527 525 -3.33333333333333e-01 527 258 1.66666666666667e-01 527 420 1.66666666666667e-01 528 528 2.50000000000000e+00 528 562 1.66666666666667e-01 528 518 -1.66666666666667e-01 528 517 8.33333333333333e-02 528 561 -2.50000000000000e-01 528 527 1.66666666666667e-01 528 664 8.33333333333333e-02 528 526 1.66666666666667e-01 528 525 -7.50000000000000e-01 528 665 8.33333333333333e-02 528 520 -8.33333333333333e-02 528 521 1.66666666666667e-01 528 530 -3.33333333333333e-01 528 68 -8.33333333333333e-02 528 519 -2.50000000000000e-01 528 578 8.33333333333333e-02 528 125 -8.33333333333333e-02 528 577 -1.66666666666667e-01 528 515 8.33333333333333e-02 528 529 -3.33333333333333e-01 528 544 1.66666666666667e-01 528 514 8.33333333333333e-02 528 67 -8.33333333333333e-02 528 545 1.66666666666667e-01 528 124 -8.33333333333333e-02 528 543 -7.50000000000000e-01 528 524 -8.33333333333333e-02 528 251 8.33333333333333e-02 528 658 8.33333333333333e-02 528 262 -8.33333333333333e-02 528 250 -1.66666666666667e-01 528 523 1.66666666666667e-01 528 522 -2.50000000000000e-01 528 263 1.66666666666667e-01 528 659 -1.66666666666667e-01 528 261 -2.50000000000000e-01 528 563 -8.33333333333333e-02 529 529 2.50000000000000e+00 529 561 1.66666666666667e-01 529 516 8.33333333333333e-02 529 563 1.66666666666667e-01 529 562 -7.50000000000000e-01 529 527 -8.33333333333333e-02 529 663 8.33333333333333e-02 529 526 -2.50000000000000e-01 529 525 1.66666666666667e-01 529 665 -1.66666666666667e-01 529 519 -8.33333333333333e-02 529 578 8.33333333333333e-02 529 521 1.66666666666667e-01 529 520 -2.50000000000000e-01 529 576 -1.66666666666667e-01 529 545 -8.33333333333333e-02 529 528 -3.33333333333333e-01 529 543 1.66666666666667e-01 529 515 -1.66666666666667e-01 529 513 8.33333333333333e-02 529 66 -8.33333333333333e-02 529 544 -2.50000000000000e-01 529 123 -8.33333333333333e-02 529 524 1.66666666666667e-01 529 530 -3.33333333333333e-01 529 263 1.66666666666667e-01 529 657 8.33333333333333e-02 529 261 -8.33333333333333e-02 529 251 8.33333333333333e-02 529 68 -8.33333333333333e-02 529 523 -7.50000000000000e-01 529 249 -1.66666666666667e-01 529 522 1.66666666666667e-01 529 659 8.33333333333333e-02 529 125 -8.33333333333333e-02 529 262 -2.50000000000000e-01 529 518 8.33333333333333e-02 530 530 2.50000000000000e+00 530 561 -8.33333333333333e-02 530 516 -1.66666666666667e-01 530 563 -2.50000000000000e-01 530 562 1.66666666666667e-01 530 526 -8.33333333333333e-02 530 525 1.66666666666667e-01 530 527 -2.50000000000000e-01 530 664 -1.66666666666667e-01 530 663 8.33333333333333e-02 530 577 8.33333333333333e-02 530 519 1.66666666666667e-01 530 528 -3.33333333333333e-01 530 521 -7.50000000000000e-01 530 520 1.66666666666667e-01 530 66 -8.33333333333333e-02 530 576 8.33333333333333e-02 530 123 -8.33333333333333e-02 530 513 8.33333333333333e-02 530 544 -8.33333333333333e-02 530 514 -1.66666666666667e-01 530 545 -2.50000000000000e-01 530 543 1.66666666666667e-01 530 522 -8.33333333333333e-02 530 249 8.33333333333333e-02 530 523 1.66666666666667e-01 530 529 -3.33333333333333e-01 530 262 1.66666666666667e-01 530 524 -2.50000000000000e-01 530 250 8.33333333333333e-02 530 67 -8.33333333333333e-02 530 263 -7.50000000000000e-01 530 517 8.33333333333333e-02 530 658 8.33333333333333e-02 530 124 -8.33333333333333e-02 530 261 1.66666666666667e-01 530 657 -1.66666666666667e-01 531 531 2.50000000000000e+00 531 569 8.33333333333333e-02 531 568 -1.66666666666667e-01 531 538 1.66666666666667e-01 531 537 -7.50000000000000e-01 531 464 8.33333333333333e-02 531 463 8.33333333333333e-02 531 467 1.66666666666667e-01 531 466 -8.33333333333333e-02 531 465 -2.50000000000000e-01 531 533 -3.33333333333333e-01 531 71 -8.33333333333333e-02 531 77 -8.33333333333333e-02 531 581 -8.33333333333333e-02 531 578 8.33333333333333e-02 531 548 -1.66666666666667e-01 531 545 1.66666666666667e-01 531 547 8.33333333333333e-02 531 544 -8.33333333333333e-02 531 543 -2.50000000000000e-01 531 580 -8.33333333333333e-02 531 577 8.33333333333333e-02 531 173 -8.33333333333333e-02 531 515 8.33333333333333e-02 531 172 -8.33333333333333e-02 531 178 8.33333333333333e-02 531 514 -1.66666666666667e-01 531 70 1.66666666666667e-01 531 69 -2.50000000000000e-01 531 521 1.66666666666667e-01 531 179 -1.66666666666667e-01 531 520 1.66666666666667e-01 531 532 -3.33333333333333e-01 531 76 1.66666666666667e-01 531 519 -7.50000000000000e-01 531 539 1.66666666666667e-01 531 75 -2.50000000000000e-01 532 532 2.50000000000000e+00 532 539 -8.33333333333333e-02 532 567 -1.66666666666667e-01 532 538 -2.50000000000000e-01 532 537 1.66666666666667e-01 532 464 -1.66666666666667e-01 532 462 8.33333333333333e-02 532 467 1.66666666666667e-01 532 466 -2.50000000000000e-01 532 465 -8.33333333333333e-02 532 581 -8.33333333333333e-02 532 548 8.33333333333333e-02 532 71 1.66666666666667e-01 532 533 -3.33333333333333e-01 532 545 1.66666666666667e-01 532 544 -2.50000000000000e-01 532 546 8.33333333333333e-02 532 543 -8.33333333333333e-02 532 77 1.66666666666667e-01 532 578 -1.66666666666667e-01 532 579 -8.33333333333333e-02 532 576 8.33333333333333e-02 532 171 -8.33333333333333e-02 532 177 8.33333333333333e-02 532 515 8.33333333333333e-02 532 173 -8.33333333333333e-02 532 70 -7.50000000000000e-01 532 513 -1.66666666666667e-01 532 69 1.66666666666667e-01 532 521 -8.33333333333333e-02 532 179 8.33333333333333e-02 532 520 -2.50000000000000e-01 532 569 8.33333333333333e-02 532 76 -7.50000000000000e-01 532 519 1.66666666666667e-01 532 531 -3.33333333333333e-01 532 75 1.66666666666667e-01 533 533 2.50000000000000e+00 533 538 -8.33333333333333e-02 533 537 1.66666666666667e-01 533 567 8.33333333333333e-02 533 539 -2.50000000000000e-01 533 462 8.33333333333333e-02 533 463 -1.66666666666667e-01 533 467 -7.50000000000000e-01 533 466 1.66666666666667e-01 533 465 1.66666666666667e-01 533 531 -3.33333333333333e-01 533 69 -8.33333333333333e-02 533 75 -8.33333333333333e-02 533 579 -8.33333333333333e-02 533 576 8.33333333333333e-02 533 580 -8.33333333333333e-02 533 547 8.33333333333333e-02 533 545 -7.50000000000000e-01 533 70 1.66666666666667e-01 533 532 -3.33333333333333e-01 533 544 1.66666666666667e-01 533 546 -1.66666666666667e-01 533 543 1.66666666666667e-01 533 76 1.66666666666667e-01 533 577 -1.66666666666667e-01 533 171 -8.33333333333333e-02 533 513 8.33333333333333e-02 533 71 -2.50000000000000e-01 533 514 8.33333333333333e-02 533 172 -8.33333333333333e-02 533 521 -2.50000000000000e-01 533 568 8.33333333333333e-02 533 77 -2.50000000000000e-01 533 520 -8.33333333333333e-02 533 178 8.33333333333333e-02 533 519 1.66666666666667e-01 533 177 -1.66666666666667e-01 534 534 1.25000000000000e+00 534 539 -8.33333333333333e-02 534 472 -4.16666666666667e-02 534 463 4.16666666666667e-02 534 473 8.33333333333333e-02 534 82 8.33333333333333e-02 534 592 -1.66666666666667e-01 534 471 -1.25000000000000e-01 534 464 -8.33333333333333e-02 534 535 -1.66666666666667e-01 534 538 1.66666666666667e-01 534 70 8.33333333333333e-02 534 537 -2.50000000000000e-01 534 596 -8.33333333333333e-02 534 548 8.33333333333333e-02 534 83 8.33333333333333e-02 534 269 -8.33333333333333e-02 534 268 4.16666666666667e-02 534 595 -8.33333333333333e-02 534 81 -3.75000000000000e-01 534 536 -1.66666666666667e-01 534 266 8.33333333333333e-02 534 71 8.33333333333333e-02 534 265 -4.16666666666667e-02 534 547 8.33333333333333e-02 534 593 8.33333333333333e-02 534 264 -1.25000000000000e-01 534 69 -3.75000000000000e-01 535 535 1.25000000000000e+00 535 473 8.33333333333333e-02 535 539 1.66666666666667e-01 535 471 -4.16666666666667e-02 535 462 4.16666666666667e-02 535 83 -4.16666666666667e-02 535 593 8.33333333333333e-02 535 472 -1.25000000000000e-01 535 81 8.33333333333333e-02 535 591 -1.66666666666667e-01 535 464 4.16666666666667e-02 535 71 -4.16666666666667e-02 535 538 -7.50000000000000e-01 535 534 -1.66666666666667e-01 535 537 1.66666666666667e-01 535 69 8.33333333333333e-02 535 269 4.16666666666667e-02 535 596 -8.33333333333333e-02 535 82 -1.25000000000000e-01 535 267 4.16666666666667e-02 535 594 -8.33333333333333e-02 535 266 8.33333333333333e-02 535 548 -1.66666666666667e-01 535 536 -1.66666666666667e-01 535 265 -1.25000000000000e-01 535 70 -1.25000000000000e-01 535 264 -4.16666666666667e-02 535 546 8.33333333333333e-02 536 536 1.25000000000000e+00 536 537 -8.33333333333333e-02 536 535 -1.66666666666667e-01 536 472 8.33333333333333e-02 536 538 1.66666666666667e-01 536 473 -3.75000000000000e-01 536 82 -4.16666666666667e-02 536 592 8.33333333333333e-02 536 471 8.33333333333333e-02 536 539 -2.50000000000000e-01 536 463 4.16666666666667e-02 536 70 -4.16666666666667e-02 536 462 -8.33333333333333e-02 536 268 4.16666666666667e-02 536 595 -8.33333333333333e-02 536 594 -8.33333333333333e-02 536 546 8.33333333333333e-02 536 83 -1.25000000000000e-01 536 81 8.33333333333333e-02 536 267 -8.33333333333333e-02 536 591 8.33333333333333e-02 536 266 -3.75000000000000e-01 536 71 -1.25000000000000e-01 536 265 8.33333333333333e-02 536 547 -1.66666666666667e-01 536 534 -1.66666666666667e-01 536 264 8.33333333333333e-02 536 69 8.33333333333333e-02 537 537 2.50000000000000e+00 537 580 8.33333333333333e-02 537 601 -8.33333333333333e-02 537 548 1.66666666666667e-01 537 596 -1.66666666666667e-01 537 547 -8.33333333333333e-02 537 595 8.33333333333333e-02 537 602 -8.33333333333333e-02 537 546 -2.50000000000000e-01 537 473 8.33333333333333e-02 537 536 -8.33333333333333e-02 537 472 8.33333333333333e-02 537 593 1.66666666666667e-01 537 539 -3.33333333333333e-01 537 592 1.66666666666667e-01 537 591 -7.50000000000000e-01 537 535 1.66666666666667e-01 537 534 -2.50000000000000e-01 537 538 -3.33333333333333e-01 537 475 -8.33333333333333e-02 537 476 1.66666666666667e-01 537 467 -1.66666666666667e-01 537 533 1.66666666666667e-01 537 463 -8.33333333333333e-02 537 466 8.33333333333333e-02 537 86 8.33333333333333e-02 537 569 -8.33333333333333e-02 537 85 -1.66666666666667e-01 537 568 1.66666666666667e-01 537 474 -2.50000000000000e-01 537 567 -2.50000000000000e-01 537 464 -8.33333333333333e-02 537 71 8.33333333333333e-02 537 532 1.66666666666667e-01 537 70 -1.66666666666667e-01 537 581 8.33333333333333e-02 537 531 -7.50000000000000e-01 538 538 2.50000000000000e+00 538 579 8.33333333333333e-02 538 600 -8.33333333333333e-02 538 602 -8.33333333333333e-02 538 596 8.33333333333333e-02 538 546 -8.33333333333333e-02 538 594 8.33333333333333e-02 538 548 1.66666666666667e-01 538 547 -2.50000000000000e-01 538 536 1.66666666666667e-01 538 473 -1.66666666666667e-01 538 471 8.33333333333333e-02 538 593 -8.33333333333333e-02 538 86 8.33333333333333e-02 538 592 -2.50000000000000e-01 538 591 1.66666666666667e-01 538 71 8.33333333333333e-02 538 535 -7.50000000000000e-01 538 534 1.66666666666667e-01 538 533 -8.33333333333333e-02 538 537 -3.33333333333333e-01 538 474 -8.33333333333333e-02 538 467 8.33333333333333e-02 538 464 -8.33333333333333e-02 538 462 -8.33333333333333e-02 538 465 8.33333333333333e-02 538 476 1.66666666666667e-01 538 569 1.66666666666667e-01 538 539 -3.33333333333333e-01 538 475 -2.50000000000000e-01 538 568 -7.50000000000000e-01 538 84 -1.66666666666667e-01 538 567 1.66666666666667e-01 538 581 -1.66666666666667e-01 538 532 -2.50000000000000e-01 538 531 1.66666666666667e-01 538 69 -1.66666666666667e-01 539 539 2.50000000000000e+00 539 580 -1.66666666666667e-01 539 601 -8.33333333333333e-02 539 595 8.33333333333333e-02 539 546 1.66666666666667e-01 539 594 -1.66666666666667e-01 539 600 -8.33333333333333e-02 539 548 -7.50000000000000e-01 539 547 1.66666666666667e-01 539 471 8.33333333333333e-02 539 534 -8.33333333333333e-02 539 535 1.66666666666667e-01 539 472 -1.66666666666667e-01 539 593 -2.50000000000000e-01 539 592 -8.33333333333333e-02 539 85 8.33333333333333e-02 539 591 1.66666666666667e-01 539 537 -3.33333333333333e-01 539 536 -2.50000000000000e-01 539 70 8.33333333333333e-02 539 532 -8.33333333333333e-02 539 466 8.33333333333333e-02 539 463 -8.33333333333333e-02 539 474 1.66666666666667e-01 539 465 -1.66666666666667e-01 539 531 1.66666666666667e-01 539 476 -7.50000000000000e-01 539 569 -2.50000000000000e-01 539 475 1.66666666666667e-01 539 568 1.66666666666667e-01 539 538 -3.33333333333333e-01 539 84 8.33333333333333e-02 539 567 -8.33333333333333e-02 539 579 8.33333333333333e-02 539 533 -2.50000000000000e-01 539 462 -8.33333333333333e-02 539 69 8.33333333333333e-02 540 540 1.25000000000000e+00 540 541 -1.66666666666667e-01 540 515 -8.33333333333333e-02 540 70 -4.16666666666667e-02 540 514 4.16666666666667e-02 540 524 8.33333333333333e-02 540 118 -4.16666666666667e-02 540 522 -3.75000000000000e-01 540 658 8.33333333333333e-02 540 545 -8.33333333333333e-02 540 544 1.66666666666667e-01 540 543 -2.50000000000000e-01 540 659 8.33333333333333e-02 540 548 8.33333333333333e-02 540 662 -8.33333333333333e-02 540 271 4.16666666666667e-02 540 661 -8.33333333333333e-02 540 119 8.33333333333333e-02 540 272 -8.33333333333333e-02 540 117 -1.25000000000000e-01 540 542 -1.66666666666667e-01 540 266 8.33333333333333e-02 540 71 8.33333333333333e-02 540 265 8.33333333333333e-02 540 547 -1.66666666666667e-01 540 523 8.33333333333333e-02 540 264 -3.75000000000000e-01 540 69 -1.25000000000000e-01 541 541 1.25000000000000e+00 541 515 4.16666666666667e-02 541 522 8.33333333333333e-02 541 540 -1.66666666666667e-01 541 69 -4.16666666666667e-02 541 513 4.16666666666667e-02 541 523 -1.25000000000000e-01 541 117 -4.16666666666667e-02 541 657 8.33333333333333e-02 541 71 8.33333333333333e-02 541 542 -1.66666666666667e-01 541 545 1.66666666666667e-01 541 544 -7.50000000000000e-01 541 543 1.66666666666667e-01 541 119 8.33333333333333e-02 541 659 -1.66666666666667e-01 541 270 4.16666666666667e-02 541 660 -8.33333333333333e-02 541 272 4.16666666666667e-02 541 662 -8.33333333333333e-02 541 118 -1.25000000000000e-01 541 266 -4.16666666666667e-02 541 548 8.33333333333333e-02 541 524 -4.16666666666667e-02 541 265 -1.25000000000000e-01 541 70 -1.25000000000000e-01 541 264 8.33333333333333e-02 541 546 -1.66666666666667e-01 542 542 1.25000000000000e+00 542 514 4.16666666666667e-02 542 513 -8.33333333333333e-02 542 524 -1.25000000000000e-01 542 522 8.33333333333333e-02 542 545 -2.50000000000000e-01 542 70 8.33333333333333e-02 542 541 -1.66666666666667e-01 542 544 1.66666666666667e-01 542 543 -8.33333333333333e-02 542 118 8.33333333333333e-02 542 658 -1.66666666666667e-01 542 657 8.33333333333333e-02 542 546 8.33333333333333e-02 542 660 -8.33333333333333e-02 542 119 -3.75000000000000e-01 542 271 4.16666666666667e-02 542 661 -8.33333333333333e-02 542 117 8.33333333333333e-02 542 270 -8.33333333333333e-02 542 523 -4.16666666666667e-02 542 266 -1.25000000000000e-01 542 71 -3.75000000000000e-01 542 265 -4.16666666666667e-02 542 547 8.33333333333333e-02 542 540 -1.66666666666667e-01 542 264 8.33333333333333e-02 542 69 8.33333333333333e-02 543 543 2.50000000000000e+00 543 521 -1.66666666666667e-01 543 524 8.33333333333333e-02 543 515 -8.33333333333333e-02 543 523 -1.66666666666667e-01 543 529 1.66666666666667e-01 543 514 -8.33333333333333e-02 543 530 1.66666666666667e-01 543 528 -7.50000000000000e-01 543 661 8.33333333333333e-02 543 658 -8.33333333333333e-02 543 662 -1.66666666666667e-01 543 659 1.66666666666667e-01 543 71 8.33333333333333e-02 543 542 -8.33333333333333e-02 543 541 1.66666666666667e-01 543 544 -3.33333333333333e-01 543 540 -2.50000000000000e-01 543 125 8.33333333333333e-02 543 657 -2.50000000000000e-01 543 578 -8.33333333333333e-02 543 581 8.33333333333333e-02 543 671 -8.33333333333333e-02 543 547 1.66666666666667e-01 543 580 -1.66666666666667e-01 543 577 1.66666666666667e-01 543 548 1.66666666666667e-01 543 533 1.66666666666667e-01 543 545 -3.33333333333333e-01 543 70 8.33333333333333e-02 543 532 -8.33333333333333e-02 543 546 -7.50000000000000e-01 543 531 -2.50000000000000e-01 543 670 -8.33333333333333e-02 543 124 8.33333333333333e-02 543 520 8.33333333333333e-02 543 576 -2.50000000000000e-01 544 544 2.50000000000000e+00 544 521 8.33333333333333e-02 544 515 -8.33333333333333e-02 544 524 8.33333333333333e-02 544 530 -8.33333333333333e-02 544 522 -1.66666666666667e-01 544 528 1.66666666666667e-01 544 513 -8.33333333333333e-02 544 529 -2.50000000000000e-01 544 660 8.33333333333333e-02 544 657 -8.33333333333333e-02 544 662 8.33333333333333e-02 544 542 1.66666666666667e-01 544 541 -7.50000000000000e-01 544 540 1.66666666666667e-01 544 543 -3.33333333333333e-01 544 659 1.66666666666667e-01 544 658 -2.50000000000000e-01 544 545 -3.33333333333333e-01 544 548 -8.33333333333333e-02 544 546 1.66666666666667e-01 544 581 8.33333333333333e-02 544 671 -8.33333333333333e-02 544 579 -1.66666666666667e-01 544 576 1.66666666666667e-01 544 71 -1.66666666666667e-01 544 533 1.66666666666667e-01 544 547 -2.50000000000000e-01 544 532 -2.50000000000000e-01 544 69 8.33333333333333e-02 544 531 -8.33333333333333e-02 544 578 1.66666666666667e-01 544 125 -1.66666666666667e-01 544 519 8.33333333333333e-02 544 577 -7.50000000000000e-01 544 669 -8.33333333333333e-02 544 123 8.33333333333333e-02 545 545 2.50000000000000e+00 545 519 -1.66666666666667e-01 545 514 -8.33333333333333e-02 545 522 8.33333333333333e-02 545 513 -8.33333333333333e-02 545 523 8.33333333333333e-02 545 529 -8.33333333333333e-02 545 530 -2.50000000000000e-01 545 528 1.66666666666667e-01 545 661 8.33333333333333e-02 545 660 -1.66666666666667e-01 545 657 1.66666666666667e-01 545 542 -2.50000000000000e-01 545 541 1.66666666666667e-01 545 69 8.33333333333333e-02 545 540 -8.33333333333333e-02 545 659 -7.50000000000000e-01 545 658 1.66666666666667e-01 545 123 8.33333333333333e-02 545 544 -3.33333333333333e-01 545 576 -8.33333333333333e-02 545 547 -8.33333333333333e-02 545 579 8.33333333333333e-02 545 669 -8.33333333333333e-02 545 580 8.33333333333333e-02 545 670 -8.33333333333333e-02 545 548 -2.50000000000000e-01 545 533 -7.50000000000000e-01 545 70 -1.66666666666667e-01 545 532 1.66666666666667e-01 545 546 1.66666666666667e-01 545 531 1.66666666666667e-01 545 543 -3.33333333333333e-01 545 520 8.33333333333333e-02 545 578 -2.50000000000000e-01 545 577 1.66666666666667e-01 545 124 -1.66666666666667e-01 546 546 2.50000000000000e+00 546 538 -8.33333333333333e-02 546 602 8.33333333333333e-02 546 601 -1.66666666666667e-01 546 537 -2.50000000000000e-01 546 536 8.33333333333333e-02 546 595 1.66666666666667e-01 546 596 1.66666666666667e-01 546 594 -7.50000000000000e-01 546 535 8.33333333333333e-02 546 548 -3.33333333333333e-01 546 71 -8.33333333333333e-02 546 128 -8.33333333333333e-02 546 581 -8.33333333333333e-02 546 671 8.33333333333333e-02 546 580 1.66666666666667e-01 546 547 -3.33333333333333e-01 546 544 1.66666666666667e-01 546 533 -1.66666666666667e-01 546 545 1.66666666666667e-01 546 70 -8.33333333333333e-02 546 532 8.33333333333333e-02 546 543 -7.50000000000000e-01 546 127 -8.33333333333333e-02 546 670 8.33333333333333e-02 546 579 -2.50000000000000e-01 546 266 -8.33333333333333e-02 546 542 8.33333333333333e-02 546 274 8.33333333333333e-02 546 661 -8.33333333333333e-02 546 541 -1.66666666666667e-01 546 265 1.66666666666667e-01 546 264 -2.50000000000000e-01 546 662 1.66666666666667e-01 546 275 -1.66666666666667e-01 546 660 -2.50000000000000e-01 546 539 1.66666666666667e-01 547 547 2.50000000000000e+00 547 537 -8.33333333333333e-02 547 600 -1.66666666666667e-01 547 539 1.66666666666667e-01 547 538 -2.50000000000000e-01 547 596 -8.33333333333333e-02 547 594 1.66666666666667e-01 547 595 -2.50000000000000e-01 547 536 -1.66666666666667e-01 547 534 8.33333333333333e-02 547 533 8.33333333333333e-02 547 545 -8.33333333333333e-02 547 579 1.66666666666667e-01 547 546 -3.33333333333333e-01 547 543 1.66666666666667e-01 547 544 -2.50000000000000e-01 547 69 -8.33333333333333e-02 547 531 8.33333333333333e-02 547 581 1.66666666666667e-01 547 671 -1.66666666666667e-01 547 580 -7.50000000000000e-01 547 126 -8.33333333333333e-02 547 669 8.33333333333333e-02 547 266 1.66666666666667e-01 547 548 -3.33333333333333e-01 547 662 1.66666666666667e-01 547 273 8.33333333333333e-02 547 660 -8.33333333333333e-02 547 542 8.33333333333333e-02 547 71 -8.33333333333333e-02 547 265 -7.50000000000000e-01 547 540 -1.66666666666667e-01 547 264 1.66666666666667e-01 547 275 8.33333333333333e-02 547 128 -8.33333333333333e-02 547 661 -2.50000000000000e-01 547 602 8.33333333333333e-02 548 548 2.50000000000000e+00 548 537 1.66666666666667e-01 548 600 8.33333333333333e-02 548 539 -7.50000000000000e-01 548 538 1.66666666666667e-01 548 595 -8.33333333333333e-02 548 534 8.33333333333333e-02 548 596 -2.50000000000000e-01 548 594 1.66666666666667e-01 548 535 -1.66666666666667e-01 548 546 -3.33333333333333e-01 548 69 -8.33333333333333e-02 548 126 -8.33333333333333e-02 548 532 8.33333333333333e-02 548 544 -8.33333333333333e-02 548 579 -8.33333333333333e-02 548 669 8.33333333333333e-02 548 545 -2.50000000000000e-01 548 531 -1.66666666666667e-01 548 543 1.66666666666667e-01 548 581 -2.50000000000000e-01 548 580 1.66666666666667e-01 548 670 -1.66666666666667e-01 548 264 -8.33333333333333e-02 548 540 8.33333333333333e-02 548 265 1.66666666666667e-01 548 547 -3.33333333333333e-01 548 661 1.66666666666667e-01 548 266 -2.50000000000000e-01 548 541 8.33333333333333e-02 548 70 -8.33333333333333e-02 548 662 -7.50000000000000e-01 548 601 8.33333333333333e-02 548 274 8.33333333333333e-02 548 127 -8.33333333333333e-02 548 660 1.66666666666667e-01 548 273 -1.66666666666667e-01 549 549 2.50000000000000e+00 549 557 -8.33333333333333e-02 549 571 -1.66666666666667e-01 549 556 1.66666666666667e-01 549 555 -2.50000000000000e-01 549 482 -1.66666666666667e-01 549 481 8.33333333333333e-02 549 485 1.66666666666667e-01 549 484 -8.33333333333333e-02 549 483 -2.50000000000000e-01 549 584 -8.33333333333333e-02 549 566 8.33333333333333e-02 549 74 1.66666666666667e-01 549 551 -3.33333333333333e-01 549 563 1.66666666666667e-01 549 565 8.33333333333333e-02 549 562 -8.33333333333333e-02 549 561 -2.50000000000000e-01 549 77 1.66666666666667e-01 549 578 -1.66666666666667e-01 549 583 -8.33333333333333e-02 549 577 8.33333333333333e-02 549 175 -8.33333333333333e-02 549 178 8.33333333333333e-02 549 518 8.33333333333333e-02 549 176 -8.33333333333333e-02 549 73 1.66666666666667e-01 549 517 -1.66666666666667e-01 549 72 -7.50000000000000e-01 549 521 -8.33333333333333e-02 549 179 8.33333333333333e-02 549 550 -3.33333333333333e-01 549 520 1.66666666666667e-01 549 76 1.66666666666667e-01 549 572 8.33333333333333e-02 549 519 -2.50000000000000e-01 549 75 -7.50000000000000e-01 550 550 2.50000000000000e+00 550 572 8.33333333333333e-02 550 570 -1.66666666666667e-01 550 556 -7.50000000000000e-01 550 555 1.66666666666667e-01 550 482 8.33333333333333e-02 550 480 8.33333333333333e-02 550 485 1.66666666666667e-01 550 484 -2.50000000000000e-01 550 483 -8.33333333333333e-02 550 551 -3.33333333333333e-01 550 77 -8.33333333333333e-02 550 74 -8.33333333333333e-02 550 578 8.33333333333333e-02 550 584 -8.33333333333333e-02 550 566 -1.66666666666667e-01 550 563 1.66666666666667e-01 550 562 -2.50000000000000e-01 550 564 8.33333333333333e-02 550 561 -8.33333333333333e-02 550 582 -8.33333333333333e-02 550 576 8.33333333333333e-02 550 518 8.33333333333333e-02 550 176 -8.33333333333333e-02 550 174 -8.33333333333333e-02 550 177 8.33333333333333e-02 550 73 -2.50000000000000e-01 550 72 1.66666666666667e-01 550 516 -1.66666666666667e-01 550 521 1.66666666666667e-01 550 179 -1.66666666666667e-01 550 557 1.66666666666667e-01 550 520 -7.50000000000000e-01 550 76 -2.50000000000000e-01 550 549 -3.33333333333333e-01 550 519 1.66666666666667e-01 550 75 1.66666666666667e-01 551 551 2.50000000000000e+00 551 555 -8.33333333333333e-02 551 556 1.66666666666667e-01 551 571 8.33333333333333e-02 551 557 -2.50000000000000e-01 551 481 8.33333333333333e-02 551 480 -1.66666666666667e-01 551 485 -7.50000000000000e-01 551 484 1.66666666666667e-01 551 483 1.66666666666667e-01 551 550 -3.33333333333333e-01 551 76 -8.33333333333333e-02 551 73 -8.33333333333333e-02 551 577 8.33333333333333e-02 551 583 -8.33333333333333e-02 551 582 -8.33333333333333e-02 551 564 8.33333333333333e-02 551 563 -7.50000000000000e-01 551 565 -1.66666666666667e-01 551 562 1.66666666666667e-01 551 72 1.66666666666667e-01 551 549 -3.33333333333333e-01 551 561 1.66666666666667e-01 551 75 1.66666666666667e-01 551 576 -1.66666666666667e-01 551 517 8.33333333333333e-02 551 175 -8.33333333333333e-02 551 74 -2.50000000000000e-01 551 516 8.33333333333333e-02 551 174 -8.33333333333333e-02 551 570 8.33333333333333e-02 551 521 -2.50000000000000e-01 551 77 -2.50000000000000e-01 551 520 1.66666666666667e-01 551 178 -1.66666666666667e-01 551 519 -8.33333333333333e-02 551 177 8.33333333333333e-02 552 552 2.50000000000000e+00 552 629 8.33333333333333e-02 552 628 -1.66666666666667e-01 552 556 1.66666666666667e-01 552 555 -7.50000000000000e-01 552 632 -8.33333333333333e-02 552 631 -8.33333333333333e-02 552 566 -1.66666666666667e-01 552 565 8.33333333333333e-02 552 482 8.33333333333333e-02 552 491 1.66666666666667e-01 552 490 -8.33333333333333e-02 552 489 -2.50000000000000e-01 552 481 8.33333333333333e-02 552 385 8.33333333333333e-02 552 376 -8.33333333333333e-02 552 377 -8.33333333333333e-02 552 386 -1.66666666666667e-01 552 449 1.66666666666667e-01 552 554 -3.33333333333333e-01 552 293 1.66666666666667e-01 552 298 8.33333333333333e-02 552 292 -8.33333333333333e-02 552 74 -8.33333333333333e-02 552 443 8.33333333333333e-02 552 73 1.66666666666667e-01 552 442 -1.66666666666667e-01 552 72 -2.50000000000000e-01 552 291 -2.50000000000000e-01 552 101 -8.33333333333333e-02 552 299 8.33333333333333e-02 552 553 -3.33333333333333e-01 552 100 1.66666666666667e-01 552 448 1.66666666666667e-01 552 557 1.66666666666667e-01 552 99 -2.50000000000000e-01 552 447 -7.50000000000000e-01 553 553 2.50000000000000e+00 553 557 -8.33333333333333e-02 553 627 -1.66666666666667e-01 553 556 -2.50000000000000e-01 553 555 1.66666666666667e-01 553 632 -8.33333333333333e-02 553 566 8.33333333333333e-02 553 630 -8.33333333333333e-02 553 564 8.33333333333333e-02 553 491 1.66666666666667e-01 553 490 -2.50000000000000e-01 553 489 -8.33333333333333e-02 553 482 -1.66666666666667e-01 553 480 8.33333333333333e-02 553 384 8.33333333333333e-02 553 375 -8.33333333333333e-02 553 386 8.33333333333333e-02 553 377 -8.33333333333333e-02 553 449 -8.33333333333333e-02 553 443 8.33333333333333e-02 553 297 8.33333333333333e-02 553 291 -8.33333333333333e-02 553 74 1.66666666666667e-01 553 554 -3.33333333333333e-01 553 293 1.66666666666667e-01 553 73 -7.50000000000000e-01 553 292 -2.50000000000000e-01 553 72 1.66666666666667e-01 553 441 -1.66666666666667e-01 553 101 1.66666666666667e-01 553 299 -1.66666666666667e-01 553 629 8.33333333333333e-02 553 100 -7.50000000000000e-01 553 448 -2.50000000000000e-01 553 552 -3.33333333333333e-01 553 99 1.66666666666667e-01 553 447 1.66666666666667e-01 554 554 2.50000000000000e+00 554 556 -8.33333333333333e-02 554 555 1.66666666666667e-01 554 627 8.33333333333333e-02 554 557 -2.50000000000000e-01 554 630 -8.33333333333333e-02 554 631 -8.33333333333333e-02 554 565 8.33333333333333e-02 554 564 -1.66666666666667e-01 554 480 8.33333333333333e-02 554 491 -7.50000000000000e-01 554 490 1.66666666666667e-01 554 489 1.66666666666667e-01 554 481 -1.66666666666667e-01 554 375 -8.33333333333333e-02 554 385 8.33333333333333e-02 554 384 -1.66666666666667e-01 554 376 -8.33333333333333e-02 554 448 -8.33333333333333e-02 554 442 8.33333333333333e-02 554 447 1.66666666666667e-01 554 552 -3.33333333333333e-01 554 291 1.66666666666667e-01 554 74 -2.50000000000000e-01 554 293 -7.50000000000000e-01 554 73 1.66666666666667e-01 554 553 -3.33333333333333e-01 554 292 1.66666666666667e-01 554 72 -8.33333333333333e-02 554 441 8.33333333333333e-02 554 628 8.33333333333333e-02 554 101 -2.50000000000000e-01 554 449 -2.50000000000000e-01 554 100 1.66666666666667e-01 554 298 -1.66666666666667e-01 554 99 -8.33333333333333e-02 554 297 8.33333333333333e-02 555 555 2.50000000000000e+00 555 583 8.33333333333333e-02 555 637 -8.33333333333333e-02 555 632 8.33333333333333e-02 555 638 -8.33333333333333e-02 555 631 8.33333333333333e-02 555 565 -8.33333333333333e-02 555 566 1.66666666666667e-01 555 564 -2.50000000000000e-01 555 491 -1.66666666666667e-01 555 554 1.66666666666667e-01 555 490 8.33333333333333e-02 555 104 8.33333333333333e-02 555 629 -8.33333333333333e-02 555 628 1.66666666666667e-01 555 627 -2.50000000000000e-01 555 74 8.33333333333333e-02 555 553 1.66666666666667e-01 555 552 -7.50000000000000e-01 555 551 -8.33333333333333e-02 555 556 -3.33333333333333e-01 555 493 -8.33333333333333e-02 555 485 8.33333333333333e-02 555 482 -8.33333333333333e-02 555 484 8.33333333333333e-02 555 481 -8.33333333333333e-02 555 494 1.66666666666667e-01 555 572 1.66666666666667e-01 555 557 -3.33333333333333e-01 555 103 -1.66666666666667e-01 555 571 1.66666666666667e-01 555 492 -2.50000000000000e-01 555 570 -7.50000000000000e-01 555 550 1.66666666666667e-01 555 73 -1.66666666666667e-01 555 584 -1.66666666666667e-01 555 549 -2.50000000000000e-01 556 556 2.50000000000000e+00 556 582 8.33333333333333e-02 556 636 -8.33333333333333e-02 556 632 -1.66666666666667e-01 556 566 1.66666666666667e-01 556 630 8.33333333333333e-02 556 564 -8.33333333333333e-02 556 638 -8.33333333333333e-02 556 565 -2.50000000000000e-01 556 491 8.33333333333333e-02 556 554 -8.33333333333333e-02 556 489 8.33333333333333e-02 556 629 1.66666666666667e-01 556 557 -3.33333333333333e-01 556 628 -7.50000000000000e-01 556 627 1.66666666666667e-01 556 553 -2.50000000000000e-01 556 552 1.66666666666667e-01 556 555 -3.33333333333333e-01 556 492 -8.33333333333333e-02 556 494 1.66666666666667e-01 556 485 -1.66666666666667e-01 556 551 1.66666666666667e-01 556 483 8.33333333333333e-02 556 480 -8.33333333333333e-02 556 104 8.33333333333333e-02 556 572 -8.33333333333333e-02 556 493 -2.50000000000000e-01 556 571 -2.50000000000000e-01 556 102 -1.66666666666667e-01 556 570 1.66666666666667e-01 556 482 -8.33333333333333e-02 556 74 8.33333333333333e-02 556 584 8.33333333333333e-02 556 550 -7.50000000000000e-01 556 549 1.66666666666667e-01 556 72 -1.66666666666667e-01 557 557 2.50000000000000e+00 557 582 -1.66666666666667e-01 557 630 8.33333333333333e-02 557 636 -8.33333333333333e-02 557 631 -1.66666666666667e-01 557 565 1.66666666666667e-01 557 637 -8.33333333333333e-02 557 566 -7.50000000000000e-01 557 564 1.66666666666667e-01 557 490 8.33333333333333e-02 557 553 -8.33333333333333e-02 557 489 -1.66666666666667e-01 557 552 1.66666666666667e-01 557 629 -2.50000000000000e-01 557 628 1.66666666666667e-01 557 556 -3.33333333333333e-01 557 102 8.33333333333333e-02 557 627 -8.33333333333333e-02 557 554 -2.50000000000000e-01 557 72 8.33333333333333e-02 557 549 -8.33333333333333e-02 557 493 1.66666666666667e-01 557 483 8.33333333333333e-02 557 480 -8.33333333333333e-02 557 484 -1.66666666666667e-01 557 550 1.66666666666667e-01 557 494 -7.50000000000000e-01 557 572 -2.50000000000000e-01 557 103 8.33333333333333e-02 557 571 -8.33333333333333e-02 557 492 1.66666666666667e-01 557 570 1.66666666666667e-01 557 555 -3.33333333333333e-01 557 583 8.33333333333333e-02 557 551 -2.50000000000000e-01 557 481 -8.33333333333333e-02 557 73 8.33333333333333e-02 558 558 2.50000000000000e+00 558 665 -1.66666666666667e-01 558 563 1.66666666666667e-01 558 562 1.66666666666667e-01 558 561 -7.50000000000000e-01 558 667 -8.33333333333333e-02 558 668 -8.33333333333333e-02 558 566 8.33333333333333e-02 558 565 -1.66666666666667e-01 558 517 8.33333333333333e-02 558 412 -8.33333333333333e-02 558 527 -8.33333333333333e-02 558 422 8.33333333333333e-02 558 526 1.66666666666667e-01 558 421 -1.66666666666667e-01 558 525 -2.50000000000000e-01 558 518 8.33333333333333e-02 558 413 -8.33333333333333e-02 558 305 8.33333333333333e-02 558 293 -8.33333333333333e-02 558 559 -3.33333333333333e-01 558 292 1.66666666666667e-01 558 454 1.66666666666667e-01 558 74 1.66666666666667e-01 558 443 -1.66666666666667e-01 558 73 -8.33333333333333e-02 558 442 8.33333333333333e-02 558 72 -2.50000000000000e-01 558 291 -2.50000000000000e-01 558 560 -3.33333333333333e-01 558 122 1.66666666666667e-01 558 455 1.66666666666667e-01 558 121 -8.33333333333333e-02 558 304 8.33333333333333e-02 558 664 8.33333333333333e-02 558 120 -2.50000000000000e-01 558 453 -7.50000000000000e-01 559 559 2.50000000000000e+00 559 665 8.33333333333333e-02 559 563 -8.33333333333333e-02 559 562 -2.50000000000000e-01 559 561 1.66666666666667e-01 559 566 8.33333333333333e-02 559 668 -8.33333333333333e-02 559 666 -8.33333333333333e-02 559 564 -1.66666666666667e-01 559 516 8.33333333333333e-02 559 411 -8.33333333333333e-02 559 422 8.33333333333333e-02 559 413 -8.33333333333333e-02 559 527 1.66666666666667e-01 559 526 -7.50000000000000e-01 559 525 1.66666666666667e-01 559 420 -1.66666666666667e-01 559 518 -1.66666666666667e-01 559 443 8.33333333333333e-02 559 455 -8.33333333333333e-02 559 558 -3.33333333333333e-01 559 291 1.66666666666667e-01 559 453 1.66666666666667e-01 559 74 1.66666666666667e-01 559 560 -3.33333333333333e-01 559 293 1.66666666666667e-01 559 73 -2.50000000000000e-01 559 292 -7.50000000000000e-01 559 72 -8.33333333333333e-02 559 441 8.33333333333333e-02 559 122 1.66666666666667e-01 559 305 -1.66666666666667e-01 559 663 8.33333333333333e-02 559 121 -2.50000000000000e-01 559 454 -2.50000000000000e-01 559 120 -8.33333333333333e-02 559 303 8.33333333333333e-02 560 560 2.50000000000000e+00 560 663 -1.66666666666667e-01 560 563 -2.50000000000000e-01 560 562 -8.33333333333333e-02 560 561 1.66666666666667e-01 560 565 8.33333333333333e-02 560 667 -8.33333333333333e-02 560 666 -8.33333333333333e-02 560 564 8.33333333333333e-02 560 421 8.33333333333333e-02 560 412 -8.33333333333333e-02 560 527 -2.50000000000000e-01 560 526 1.66666666666667e-01 560 525 -8.33333333333333e-02 560 420 8.33333333333333e-02 560 517 -1.66666666666667e-01 560 516 8.33333333333333e-02 560 411 -8.33333333333333e-02 560 303 8.33333333333333e-02 560 291 -8.33333333333333e-02 560 442 8.33333333333333e-02 560 454 -8.33333333333333e-02 560 74 -7.50000000000000e-01 560 293 -2.50000000000000e-01 560 73 1.66666666666667e-01 560 559 -3.33333333333333e-01 560 292 1.66666666666667e-01 560 72 1.66666666666667e-01 560 441 -1.66666666666667e-01 560 664 8.33333333333333e-02 560 122 -7.50000000000000e-01 560 455 -2.50000000000000e-01 560 121 1.66666666666667e-01 560 304 -1.66666666666667e-01 560 558 -3.33333333333333e-01 560 120 1.66666666666667e-01 560 453 1.66666666666667e-01 561 561 2.50000000000000e+00 561 521 8.33333333333333e-02 561 518 -8.33333333333333e-02 561 530 -8.33333333333333e-02 561 527 8.33333333333333e-02 561 529 1.66666666666667e-01 561 526 -1.66666666666667e-01 561 517 -8.33333333333333e-02 561 528 -2.50000000000000e-01 561 667 8.33333333333333e-02 561 664 -8.33333333333333e-02 561 668 8.33333333333333e-02 561 560 1.66666666666667e-01 561 559 1.66666666666667e-01 561 562 -3.33333333333333e-01 561 558 -7.50000000000000e-01 561 665 1.66666666666667e-01 561 663 -2.50000000000000e-01 561 563 -3.33333333333333e-01 561 566 -8.33333333333333e-02 561 565 1.66666666666667e-01 561 674 -8.33333333333333e-02 561 584 8.33333333333333e-02 561 583 -1.66666666666667e-01 561 577 1.66666666666667e-01 561 74 -1.66666666666667e-01 561 551 1.66666666666667e-01 561 73 8.33333333333333e-02 561 550 -8.33333333333333e-02 561 564 -2.50000000000000e-01 561 549 -2.50000000000000e-01 561 578 1.66666666666667e-01 561 125 -1.66666666666667e-01 561 673 -8.33333333333333e-02 561 124 8.33333333333333e-02 561 520 8.33333333333333e-02 561 576 -7.50000000000000e-01 562 562 2.50000000000000e+00 562 521 -1.66666666666667e-01 562 518 -8.33333333333333e-02 562 527 8.33333333333333e-02 562 528 1.66666666666667e-01 562 525 -1.66666666666667e-01 562 516 -8.33333333333333e-02 562 530 1.66666666666667e-01 562 529 -7.50000000000000e-01 562 666 8.33333333333333e-02 562 663 -8.33333333333333e-02 562 665 1.66666666666667e-01 562 668 -1.66666666666667e-01 562 560 -8.33333333333333e-02 562 74 8.33333333333333e-02 562 559 -2.50000000000000e-01 562 558 1.66666666666667e-01 562 561 -3.33333333333333e-01 562 125 8.33333333333333e-02 562 664 -2.50000000000000e-01 562 578 -8.33333333333333e-02 562 584 8.33333333333333e-02 562 674 -8.33333333333333e-02 562 564 1.66666666666667e-01 562 582 -1.66666666666667e-01 562 576 1.66666666666667e-01 562 566 1.66666666666667e-01 562 551 1.66666666666667e-01 562 563 -3.33333333333333e-01 562 565 -7.50000000000000e-01 562 550 -2.50000000000000e-01 562 72 8.33333333333333e-02 562 549 -8.33333333333333e-02 562 519 8.33333333333333e-02 562 577 -2.50000000000000e-01 562 672 -8.33333333333333e-02 562 123 8.33333333333333e-02 563 563 2.50000000000000e+00 563 519 8.33333333333333e-02 563 516 -8.33333333333333e-02 563 517 -8.33333333333333e-02 563 526 8.33333333333333e-02 563 528 -8.33333333333333e-02 563 525 8.33333333333333e-02 563 530 -2.50000000000000e-01 563 529 1.66666666666667e-01 563 664 1.66666666666667e-01 563 667 -1.66666666666667e-01 563 666 8.33333333333333e-02 563 560 -2.50000000000000e-01 563 559 -8.33333333333333e-02 563 73 8.33333333333333e-02 563 558 1.66666666666667e-01 563 665 -7.50000000000000e-01 563 124 8.33333333333333e-02 563 663 1.66666666666667e-01 563 577 -8.33333333333333e-02 563 561 -3.33333333333333e-01 563 564 -8.33333333333333e-02 563 583 8.33333333333333e-02 563 673 -8.33333333333333e-02 563 672 -8.33333333333333e-02 563 582 8.33333333333333e-02 563 566 -2.50000000000000e-01 563 551 -7.50000000000000e-01 563 565 1.66666666666667e-01 563 550 1.66666666666667e-01 563 562 -3.33333333333333e-01 563 72 -1.66666666666667e-01 563 549 1.66666666666667e-01 563 520 -1.66666666666667e-01 563 578 -2.50000000000000e-01 563 576 1.66666666666667e-01 563 123 -1.66666666666667e-01 564 564 2.50000000000000e+00 564 556 -8.33333333333333e-02 564 637 -1.66666666666667e-01 564 557 1.66666666666667e-01 564 555 -2.50000000000000e-01 564 632 -8.33333333333333e-02 564 631 1.66666666666667e-01 564 630 -2.50000000000000e-01 564 554 -1.66666666666667e-01 564 553 8.33333333333333e-02 564 551 8.33333333333333e-02 564 563 -8.33333333333333e-02 564 565 -3.33333333333333e-01 564 583 1.66666666666667e-01 564 562 1.66666666666667e-01 564 584 1.66666666666667e-01 564 674 -1.66666666666667e-01 564 133 -8.33333333333333e-02 564 673 8.33333333333333e-02 564 582 -7.50000000000000e-01 564 73 -8.33333333333333e-02 564 550 8.33333333333333e-02 564 561 -2.50000000000000e-01 564 293 1.66666666666667e-01 564 566 -3.33333333333333e-01 564 668 1.66666666666667e-01 564 310 8.33333333333333e-02 564 667 -8.33333333333333e-02 564 560 8.33333333333333e-02 564 74 -8.33333333333333e-02 564 292 1.66666666666667e-01 564 559 -1.66666666666667e-01 564 291 -7.50000000000000e-01 564 311 8.33333333333333e-02 564 134 -8.33333333333333e-02 564 666 -2.50000000000000e-01 564 638 8.33333333333333e-02 565 565 2.50000000000000e+00 565 555 -8.33333333333333e-02 565 638 8.33333333333333e-02 565 636 -1.66666666666667e-01 565 556 -2.50000000000000e-01 565 554 8.33333333333333e-02 565 630 1.66666666666667e-01 565 632 1.66666666666667e-01 565 631 -7.50000000000000e-01 565 552 8.33333333333333e-02 565 566 -3.33333333333333e-01 565 74 -8.33333333333333e-02 565 134 -8.33333333333333e-02 565 584 -8.33333333333333e-02 565 674 8.33333333333333e-02 565 564 -3.33333333333333e-01 565 582 1.66666666666667e-01 565 561 1.66666666666667e-01 565 583 -2.50000000000000e-01 565 132 -8.33333333333333e-02 565 672 8.33333333333333e-02 565 551 -1.66666666666667e-01 565 563 1.66666666666667e-01 565 562 -7.50000000000000e-01 565 72 -8.33333333333333e-02 565 549 8.33333333333333e-02 565 293 -8.33333333333333e-02 565 560 8.33333333333333e-02 565 309 8.33333333333333e-02 565 666 -8.33333333333333e-02 565 292 -2.50000000000000e-01 565 291 1.66666666666667e-01 565 558 -1.66666666666667e-01 565 311 -1.66666666666667e-01 565 668 1.66666666666667e-01 565 667 -2.50000000000000e-01 565 557 1.66666666666667e-01 566 566 2.50000000000000e+00 566 556 1.66666666666667e-01 566 637 8.33333333333333e-02 566 557 -7.50000000000000e-01 566 555 1.66666666666667e-01 566 630 -8.33333333333333e-02 566 553 8.33333333333333e-02 566 632 -2.50000000000000e-01 566 631 1.66666666666667e-01 566 552 -1.66666666666667e-01 566 565 -3.33333333333333e-01 566 73 -8.33333333333333e-02 566 133 -8.33333333333333e-02 566 549 8.33333333333333e-02 566 561 -8.33333333333333e-02 566 583 -8.33333333333333e-02 566 673 8.33333333333333e-02 566 584 -2.50000000000000e-01 566 582 1.66666666666667e-01 566 672 -1.66666666666667e-01 566 563 -2.50000000000000e-01 566 550 -1.66666666666667e-01 566 562 1.66666666666667e-01 566 292 -8.33333333333333e-02 566 559 8.33333333333333e-02 566 291 1.66666666666667e-01 566 564 -3.33333333333333e-01 566 666 1.66666666666667e-01 566 293 -2.50000000000000e-01 566 558 8.33333333333333e-02 566 72 -8.33333333333333e-02 566 668 -7.50000000000000e-01 566 636 8.33333333333333e-02 566 310 -1.66666666666667e-01 566 667 1.66666666666667e-01 566 309 8.33333333333333e-02 566 132 -8.33333333333333e-02 567 567 2.50000000000000e+00 567 502 -8.33333333333333e-02 567 497 -1.66666666666667e-01 567 503 1.66666666666667e-01 567 501 -2.50000000000000e-01 567 599 8.33333333333333e-02 567 598 -1.66666666666667e-01 567 575 -8.33333333333333e-02 567 574 1.66666666666667e-01 567 573 -2.50000000000000e-01 567 466 -8.33333333333333e-02 567 475 8.33333333333333e-02 567 476 8.33333333333333e-02 567 539 -8.33333333333333e-02 567 85 1.66666666666667e-01 567 568 -3.33333333333333e-01 567 538 1.66666666666667e-01 567 537 -2.50000000000000e-01 567 467 -8.33333333333333e-02 567 533 8.33333333333333e-02 567 76 1.66666666666667e-01 567 532 -1.66666666666667e-01 567 317 -8.33333333333333e-02 567 314 8.33333333333333e-02 567 86 1.66666666666667e-01 567 602 -1.66666666666667e-01 567 601 8.33333333333333e-02 567 316 -8.33333333333333e-02 567 84 -7.50000000000000e-01 567 569 -3.33333333333333e-01 567 581 1.66666666666667e-01 567 77 1.66666666666667e-01 567 580 -8.33333333333333e-02 567 313 8.33333333333333e-02 567 496 8.33333333333333e-02 567 579 -2.50000000000000e-01 567 75 -7.50000000000000e-01 568 568 2.50000000000000e+00 568 501 -8.33333333333333e-02 568 503 1.66666666666667e-01 568 497 8.33333333333333e-02 568 502 -2.50000000000000e-01 568 599 8.33333333333333e-02 568 597 -1.66666666666667e-01 568 575 1.66666666666667e-01 568 574 -7.50000000000000e-01 568 573 1.66666666666667e-01 568 569 -3.33333333333333e-01 568 77 -8.33333333333333e-02 568 86 -8.33333333333333e-02 568 533 8.33333333333333e-02 568 467 -8.33333333333333e-02 568 465 -8.33333333333333e-02 568 474 8.33333333333333e-02 568 476 -1.66666666666667e-01 568 539 1.66666666666667e-01 568 538 -7.50000000000000e-01 568 84 1.66666666666667e-01 568 567 -3.33333333333333e-01 568 537 1.66666666666667e-01 568 75 1.66666666666667e-01 568 531 -1.66666666666667e-01 568 602 8.33333333333333e-02 568 317 -8.33333333333333e-02 568 85 -2.50000000000000e-01 568 600 8.33333333333333e-02 568 315 -8.33333333333333e-02 568 581 1.66666666666667e-01 568 314 -1.66666666666667e-01 568 495 8.33333333333333e-02 568 580 -2.50000000000000e-01 568 76 -2.50000000000000e-01 568 579 -8.33333333333333e-02 568 312 8.33333333333333e-02 569 569 2.50000000000000e+00 569 496 8.33333333333333e-02 569 495 -1.66666666666667e-01 569 503 -7.50000000000000e-01 569 501 1.66666666666667e-01 569 598 8.33333333333333e-02 569 597 8.33333333333333e-02 569 575 -2.50000000000000e-01 569 574 1.66666666666667e-01 569 573 -8.33333333333333e-02 569 568 -3.33333333333333e-01 569 76 -8.33333333333333e-02 569 85 -8.33333333333333e-02 569 532 8.33333333333333e-02 569 466 -8.33333333333333e-02 569 539 -2.50000000000000e-01 569 475 -1.66666666666667e-01 569 538 1.66666666666667e-01 569 474 8.33333333333333e-02 569 537 -8.33333333333333e-02 569 465 -8.33333333333333e-02 569 531 8.33333333333333e-02 569 601 8.33333333333333e-02 569 316 -8.33333333333333e-02 569 315 -8.33333333333333e-02 569 312 8.33333333333333e-02 569 86 -2.50000000000000e-01 569 84 1.66666666666667e-01 569 600 -1.66666666666667e-01 569 502 1.66666666666667e-01 569 581 -7.50000000000000e-01 569 77 -2.50000000000000e-01 569 580 1.66666666666667e-01 569 313 -1.66666666666667e-01 569 567 -3.33333333333333e-01 569 579 1.66666666666667e-01 569 75 1.66666666666667e-01 570 570 2.50000000000000e+00 570 508 -8.33333333333333e-02 570 509 1.66666666666667e-01 570 497 8.33333333333333e-02 570 507 -2.50000000000000e-01 570 635 8.33333333333333e-02 570 634 -1.66666666666667e-01 570 575 1.66666666666667e-01 570 574 1.66666666666667e-01 570 573 -7.50000000000000e-01 570 572 -3.33333333333333e-01 570 104 -8.33333333333333e-02 570 77 -8.33333333333333e-02 570 485 -8.33333333333333e-02 570 551 8.33333333333333e-02 570 484 -8.33333333333333e-02 570 493 8.33333333333333e-02 570 494 -1.66666666666667e-01 570 557 1.66666666666667e-01 570 103 1.66666666666667e-01 570 571 -3.33333333333333e-01 570 556 1.66666666666667e-01 570 555 -7.50000000000000e-01 570 76 1.66666666666667e-01 570 550 -1.66666666666667e-01 570 320 -8.33333333333333e-02 570 638 8.33333333333333e-02 570 637 8.33333333333333e-02 570 319 -8.33333333333333e-02 570 102 -2.50000000000000e-01 570 584 1.66666666666667e-01 570 314 -1.66666666666667e-01 570 583 -8.33333333333333e-02 570 313 8.33333333333333e-02 570 582 -2.50000000000000e-01 570 496 8.33333333333333e-02 570 75 -2.50000000000000e-01 571 571 2.50000000000000e+00 571 507 -8.33333333333333e-02 571 497 -1.66666666666667e-01 571 509 1.66666666666667e-01 571 508 -2.50000000000000e-01 571 635 8.33333333333333e-02 571 633 -1.66666666666667e-01 571 575 -8.33333333333333e-02 571 574 -2.50000000000000e-01 571 573 1.66666666666667e-01 571 483 -8.33333333333333e-02 571 492 8.33333333333333e-02 571 494 8.33333333333333e-02 571 557 -8.33333333333333e-02 571 556 -2.50000000000000e-01 571 102 1.66666666666667e-01 571 570 -3.33333333333333e-01 571 555 1.66666666666667e-01 571 485 -8.33333333333333e-02 571 551 8.33333333333333e-02 571 75 1.66666666666667e-01 571 549 -1.66666666666667e-01 571 320 -8.33333333333333e-02 571 314 8.33333333333333e-02 571 638 -1.66666666666667e-01 571 104 1.66666666666667e-01 571 103 -7.50000000000000e-01 571 636 8.33333333333333e-02 571 318 -8.33333333333333e-02 571 584 1.66666666666667e-01 571 572 -3.33333333333333e-01 571 77 1.66666666666667e-01 571 583 -2.50000000000000e-01 571 495 8.33333333333333e-02 571 76 -7.50000000000000e-01 571 582 -8.33333333333333e-02 571 312 8.33333333333333e-02 572 572 2.50000000000000e+00 572 496 -1.66666666666667e-01 572 495 8.33333333333333e-02 572 509 -7.50000000000000e-01 572 508 1.66666666666667e-01 572 633 8.33333333333333e-02 572 634 8.33333333333333e-02 572 575 -2.50000000000000e-01 572 574 -8.33333333333333e-02 572 573 1.66666666666667e-01 572 570 -3.33333333333333e-01 572 102 -8.33333333333333e-02 572 75 -8.33333333333333e-02 572 483 -8.33333333333333e-02 572 549 8.33333333333333e-02 572 557 -2.50000000000000e-01 572 493 8.33333333333333e-02 572 556 -8.33333333333333e-02 572 492 -1.66666666666667e-01 572 555 1.66666666666667e-01 572 484 -8.33333333333333e-02 572 550 8.33333333333333e-02 572 318 -8.33333333333333e-02 572 636 8.33333333333333e-02 572 319 -8.33333333333333e-02 572 313 8.33333333333333e-02 572 104 -2.50000000000000e-01 572 637 -1.66666666666667e-01 572 103 1.66666666666667e-01 572 584 -7.50000000000000e-01 572 507 1.66666666666667e-01 572 77 -2.50000000000000e-01 572 583 1.66666666666667e-01 572 571 -3.33333333333333e-01 572 76 1.66666666666667e-01 572 582 1.66666666666667e-01 572 312 -1.66666666666667e-01 573 573 2.50000000000000e+00 573 509 -1.66666666666667e-01 573 635 -8.33333333333333e-02 573 319 8.33333333333333e-02 573 320 8.33333333333333e-02 573 634 1.66666666666667e-01 573 633 -2.50000000000000e-01 573 572 1.66666666666667e-01 573 571 1.66666666666667e-01 573 570 -7.50000000000000e-01 573 496 -8.33333333333333e-02 573 497 -8.33333333333333e-02 573 511 -8.33333333333333e-02 573 502 8.33333333333333e-02 573 503 8.33333333333333e-02 573 512 1.66666666666667e-01 573 575 -3.33333333333333e-01 573 510 -2.50000000000000e-01 573 313 -8.33333333333333e-02 573 574 -3.33333333333333e-01 573 599 1.66666666666667e-01 573 322 -8.33333333333333e-02 573 316 8.33333333333333e-02 573 314 1.66666666666667e-01 573 317 -1.66666666666667e-01 573 107 8.33333333333333e-02 573 323 -8.33333333333333e-02 573 598 1.66666666666667e-01 573 106 -1.66666666666667e-01 573 597 -7.50000000000000e-01 573 569 -8.33333333333333e-02 573 77 8.33333333333333e-02 573 568 1.66666666666667e-01 573 76 -1.66666666666667e-01 573 567 -2.50000000000000e-01 573 508 8.33333333333333e-02 573 312 -2.50000000000000e-01 574 574 2.50000000000000e+00 574 509 8.33333333333333e-02 574 635 1.66666666666667e-01 574 318 8.33333333333333e-02 574 320 -1.66666666666667e-01 574 634 -7.50000000000000e-01 574 633 1.66666666666667e-01 574 572 -8.33333333333333e-02 574 571 -2.50000000000000e-01 574 570 1.66666666666667e-01 574 495 -8.33333333333333e-02 574 512 1.66666666666667e-01 574 510 -8.33333333333333e-02 574 501 8.33333333333333e-02 574 503 -1.66666666666667e-01 574 107 8.33333333333333e-02 574 511 -2.50000000000000e-01 574 497 -8.33333333333333e-02 574 77 8.33333333333333e-02 574 312 -8.33333333333333e-02 574 599 -8.33333333333333e-02 574 573 -3.33333333333333e-01 574 321 -8.33333333333333e-02 574 315 8.33333333333333e-02 574 323 -8.33333333333333e-02 574 317 8.33333333333333e-02 574 598 -2.50000000000000e-01 574 597 1.66666666666667e-01 574 105 -1.66666666666667e-01 574 569 1.66666666666667e-01 574 575 -3.33333333333333e-01 574 314 1.66666666666667e-01 574 568 -7.50000000000000e-01 574 507 8.33333333333333e-02 574 313 -2.50000000000000e-01 574 567 1.66666666666667e-01 574 75 -1.66666666666667e-01 575 575 2.50000000000000e+00 575 507 -1.66666666666667e-01 575 633 -8.33333333333333e-02 575 634 1.66666666666667e-01 575 319 -1.66666666666667e-01 575 318 8.33333333333333e-02 575 635 -2.50000000000000e-01 575 572 -2.50000000000000e-01 575 571 -8.33333333333333e-02 575 570 1.66666666666667e-01 575 495 -8.33333333333333e-02 575 511 1.66666666666667e-01 575 502 -1.66666666666667e-01 575 501 8.33333333333333e-02 575 512 -7.50000000000000e-01 575 106 8.33333333333333e-02 575 510 1.66666666666667e-01 575 573 -3.33333333333333e-01 575 496 -8.33333333333333e-02 575 76 8.33333333333333e-02 575 598 -8.33333333333333e-02 575 597 1.66666666666667e-01 575 322 -8.33333333333333e-02 575 316 8.33333333333333e-02 575 312 1.66666666666667e-01 575 315 -1.66666666666667e-01 575 599 -2.50000000000000e-01 575 105 8.33333333333333e-02 575 321 -8.33333333333333e-02 575 569 -2.50000000000000e-01 575 508 8.33333333333333e-02 575 314 -7.50000000000000e-01 575 568 1.66666666666667e-01 575 574 -3.33333333333333e-01 575 313 1.66666666666667e-01 575 567 -8.33333333333333e-02 575 75 8.33333333333333e-02 576 576 2.50000000000000e+00 576 551 -1.66666666666667e-01 576 550 8.33333333333333e-02 576 563 1.66666666666667e-01 576 561 -7.50000000000000e-01 576 673 8.33333333333333e-02 576 674 8.33333333333333e-02 576 584 -8.33333333333333e-02 576 583 1.66666666666667e-01 576 582 -2.50000000000000e-01 576 520 -8.33333333333333e-02 576 521 -8.33333333333333e-02 576 530 8.33333333333333e-02 576 529 -1.66666666666667e-01 576 533 8.33333333333333e-02 576 545 -8.33333333333333e-02 576 577 -3.33333333333333e-01 576 544 1.66666666666667e-01 576 532 8.33333333333333e-02 576 76 -8.33333333333333e-02 576 124 -8.33333333333333e-02 576 543 -2.50000000000000e-01 576 314 8.33333333333333e-02 576 326 -8.33333333333333e-02 576 670 8.33333333333333e-02 576 325 -8.33333333333333e-02 576 125 1.66666666666667e-01 576 671 -1.66666666666667e-01 576 123 -2.50000000000000e-01 576 578 -3.33333333333333e-01 576 581 1.66666666666667e-01 576 77 1.66666666666667e-01 576 580 1.66666666666667e-01 576 313 -1.66666666666667e-01 576 562 1.66666666666667e-01 576 579 -7.50000000000000e-01 576 75 -2.50000000000000e-01 577 577 2.50000000000000e+00 577 563 -8.33333333333333e-02 577 561 1.66666666666667e-01 577 549 8.33333333333333e-02 577 562 -2.50000000000000e-01 577 672 8.33333333333333e-02 577 674 -1.66666666666667e-01 577 584 1.66666666666667e-01 577 583 -7.50000000000000e-01 577 582 1.66666666666667e-01 577 519 -8.33333333333333e-02 577 521 -8.33333333333333e-02 577 530 8.33333333333333e-02 577 528 -1.66666666666667e-01 577 576 -3.33333333333333e-01 577 543 1.66666666666667e-01 577 533 -1.66666666666667e-01 577 77 1.66666666666667e-01 577 531 8.33333333333333e-02 577 75 -8.33333333333333e-02 577 545 1.66666666666667e-01 577 578 -3.33333333333333e-01 577 125 1.66666666666667e-01 577 544 -7.50000000000000e-01 577 123 -8.33333333333333e-02 577 669 8.33333333333333e-02 577 324 -8.33333333333333e-02 577 671 8.33333333333333e-02 577 326 -8.33333333333333e-02 577 124 -2.50000000000000e-01 577 581 -8.33333333333333e-02 577 314 8.33333333333333e-02 577 551 8.33333333333333e-02 577 580 -2.50000000000000e-01 577 76 -2.50000000000000e-01 577 579 1.66666666666667e-01 577 312 -1.66666666666667e-01 578 578 2.50000000000000e+00 578 562 -8.33333333333333e-02 578 549 -1.66666666666667e-01 578 563 -2.50000000000000e-01 578 561 1.66666666666667e-01 578 673 -1.66666666666667e-01 578 672 8.33333333333333e-02 578 584 -2.50000000000000e-01 578 583 1.66666666666667e-01 578 582 -8.33333333333333e-02 578 520 -8.33333333333333e-02 578 529 8.33333333333333e-02 578 519 -8.33333333333333e-02 578 528 8.33333333333333e-02 578 531 8.33333333333333e-02 578 543 -8.33333333333333e-02 578 532 -1.66666666666667e-01 578 76 1.66666666666667e-01 578 545 -2.50000000000000e-01 578 544 1.66666666666667e-01 578 577 -3.33333333333333e-01 578 124 1.66666666666667e-01 578 312 8.33333333333333e-02 578 324 -8.33333333333333e-02 578 125 -7.50000000000000e-01 578 670 8.33333333333333e-02 578 325 -8.33333333333333e-02 578 123 1.66666666666667e-01 578 669 -1.66666666666667e-01 578 550 8.33333333333333e-02 578 581 -2.50000000000000e-01 578 77 -7.50000000000000e-01 578 580 -8.33333333333333e-02 578 313 8.33333333333333e-02 578 576 -3.33333333333333e-01 578 579 1.66666666666667e-01 578 75 1.66666666666667e-01 579 579 2.50000000000000e+00 579 538 8.33333333333333e-02 579 601 1.66666666666667e-01 579 317 8.33333333333333e-02 579 316 -1.66666666666667e-01 579 602 1.66666666666667e-01 579 600 -7.50000000000000e-01 579 569 1.66666666666667e-01 579 568 -8.33333333333333e-02 579 567 -2.50000000000000e-01 579 533 -8.33333333333333e-02 579 548 -8.33333333333333e-02 579 545 8.33333333333333e-02 579 547 1.66666666666667e-01 579 544 -1.66666666666667e-01 579 127 8.33333333333333e-02 579 546 -2.50000000000000e-01 579 532 -8.33333333333333e-02 579 76 8.33333333333333e-02 579 314 -8.33333333333333e-02 579 581 -3.33333333333333e-01 579 670 -8.33333333333333e-02 579 329 -8.33333333333333e-02 579 326 8.33333333333333e-02 579 328 -8.33333333333333e-02 579 325 8.33333333333333e-02 579 671 1.66666666666667e-01 579 128 -1.66666666666667e-01 579 669 -2.50000000000000e-01 579 578 1.66666666666667e-01 579 77 -1.66666666666667e-01 579 577 1.66666666666667e-01 579 580 -3.33333333333333e-01 579 313 1.66666666666667e-01 579 576 -7.50000000000000e-01 579 539 8.33333333333333e-02 579 312 -2.50000000000000e-01 580 580 2.50000000000000e+00 580 537 8.33333333333333e-02 580 602 -8.33333333333333e-02 580 317 8.33333333333333e-02 580 600 1.66666666666667e-01 580 315 -1.66666666666667e-01 580 601 -2.50000000000000e-01 580 569 1.66666666666667e-01 580 568 -2.50000000000000e-01 580 567 -8.33333333333333e-02 580 533 -8.33333333333333e-02 580 546 1.66666666666667e-01 580 545 8.33333333333333e-02 580 543 -1.66666666666667e-01 580 548 1.66666666666667e-01 580 581 -3.33333333333333e-01 580 547 -7.50000000000000e-01 580 126 8.33333333333333e-02 580 531 -8.33333333333333e-02 580 75 8.33333333333333e-02 580 669 -8.33333333333333e-02 580 671 1.66666666666667e-01 580 314 1.66666666666667e-01 580 326 -1.66666666666667e-01 580 327 -8.33333333333333e-02 580 324 8.33333333333333e-02 580 128 8.33333333333333e-02 580 329 -8.33333333333333e-02 580 670 -2.50000000000000e-01 580 578 -8.33333333333333e-02 580 77 8.33333333333333e-02 580 577 -2.50000000000000e-01 580 539 -1.66666666666667e-01 580 313 -7.50000000000000e-01 580 576 1.66666666666667e-01 580 579 -3.33333333333333e-01 580 312 1.66666666666667e-01 581 581 2.50000000000000e+00 581 538 -1.66666666666667e-01 581 601 -8.33333333333333e-02 581 316 8.33333333333333e-02 581 315 8.33333333333333e-02 581 602 -2.50000000000000e-01 581 600 1.66666666666667e-01 581 569 -7.50000000000000e-01 581 568 1.66666666666667e-01 581 567 1.66666666666667e-01 581 531 -8.33333333333333e-02 581 532 -8.33333333333333e-02 581 546 -8.33333333333333e-02 581 543 8.33333333333333e-02 581 544 8.33333333333333e-02 581 548 -2.50000000000000e-01 581 547 1.66666666666667e-01 581 580 -3.33333333333333e-01 581 312 -8.33333333333333e-02 581 579 -3.33333333333333e-01 581 670 1.66666666666667e-01 581 327 -8.33333333333333e-02 581 324 8.33333333333333e-02 581 313 1.66666666666667e-01 581 325 -1.66666666666667e-01 581 671 -7.50000000000000e-01 581 127 8.33333333333333e-02 581 328 -8.33333333333333e-02 581 669 1.66666666666667e-01 581 126 -1.66666666666667e-01 581 578 -2.50000000000000e-01 581 537 8.33333333333333e-02 581 314 -2.50000000000000e-01 581 577 -8.33333333333333e-02 581 76 8.33333333333333e-02 581 576 1.66666666666667e-01 581 75 -1.66666666666667e-01 582 582 2.50000000000000e+00 582 556 8.33333333333333e-02 582 320 8.33333333333333e-02 582 638 -8.33333333333333e-02 582 637 1.66666666666667e-01 582 319 -1.66666666666667e-01 582 636 -2.50000000000000e-01 582 572 1.66666666666667e-01 582 571 -8.33333333333333e-02 582 570 -2.50000000000000e-01 582 551 -8.33333333333333e-02 582 565 1.66666666666667e-01 582 563 8.33333333333333e-02 582 562 -1.66666666666667e-01 582 566 1.66666666666667e-01 582 584 -3.33333333333333e-01 582 133 8.33333333333333e-02 582 564 -7.50000000000000e-01 582 550 -8.33333333333333e-02 582 76 8.33333333333333e-02 582 673 -8.33333333333333e-02 582 674 1.66666666666667e-01 582 314 1.66666666666667e-01 582 326 -1.66666666666667e-01 582 331 -8.33333333333333e-02 582 325 8.33333333333333e-02 582 134 8.33333333333333e-02 582 332 -8.33333333333333e-02 582 672 -2.50000000000000e-01 582 578 -8.33333333333333e-02 582 77 8.33333333333333e-02 582 583 -3.33333333333333e-01 582 577 1.66666666666667e-01 582 313 1.66666666666667e-01 582 557 -1.66666666666667e-01 582 576 -2.50000000000000e-01 582 312 -7.50000000000000e-01 583 583 2.50000000000000e+00 583 555 8.33333333333333e-02 583 636 1.66666666666667e-01 583 320 8.33333333333333e-02 583 318 -1.66666666666667e-01 583 638 1.66666666666667e-01 583 637 -7.50000000000000e-01 583 572 1.66666666666667e-01 583 571 -2.50000000000000e-01 583 570 -8.33333333333333e-02 583 551 -8.33333333333333e-02 583 566 -8.33333333333333e-02 583 563 8.33333333333333e-02 583 564 1.66666666666667e-01 583 561 -1.66666666666667e-01 583 565 -2.50000000000000e-01 583 132 8.33333333333333e-02 583 549 -8.33333333333333e-02 583 75 8.33333333333333e-02 583 314 -8.33333333333333e-02 583 584 -3.33333333333333e-01 583 672 -8.33333333333333e-02 583 332 -8.33333333333333e-02 583 326 8.33333333333333e-02 583 330 -8.33333333333333e-02 583 324 8.33333333333333e-02 583 134 -1.66666666666667e-01 583 674 1.66666666666667e-01 583 673 -2.50000000000000e-01 583 578 1.66666666666667e-01 583 77 -1.66666666666667e-01 583 557 8.33333333333333e-02 583 577 -7.50000000000000e-01 583 313 -2.50000000000000e-01 583 582 -3.33333333333333e-01 583 576 1.66666666666667e-01 583 312 1.66666666666667e-01 584 584 2.50000000000000e+00 584 555 -1.66666666666667e-01 584 318 8.33333333333333e-02 584 636 -8.33333333333333e-02 584 319 8.33333333333333e-02 584 638 -2.50000000000000e-01 584 637 1.66666666666667e-01 584 572 -7.50000000000000e-01 584 571 1.66666666666667e-01 584 570 1.66666666666667e-01 584 550 -8.33333333333333e-02 584 549 -8.33333333333333e-02 584 565 -8.33333333333333e-02 584 562 8.33333333333333e-02 584 561 8.33333333333333e-02 584 566 -2.50000000000000e-01 584 564 1.66666666666667e-01 584 582 -3.33333333333333e-01 584 313 -8.33333333333333e-02 584 583 -3.33333333333333e-01 584 331 -8.33333333333333e-02 584 325 8.33333333333333e-02 584 672 1.66666666666667e-01 584 312 1.66666666666667e-01 584 324 -1.66666666666667e-01 584 674 -7.50000000000000e-01 584 133 -1.66666666666667e-01 584 673 1.66666666666667e-01 584 132 8.33333333333333e-02 584 330 -8.33333333333333e-02 584 556 8.33333333333333e-02 584 578 -2.50000000000000e-01 584 314 -2.50000000000000e-01 584 577 1.66666666666667e-01 584 76 -1.66666666666667e-01 584 576 -8.33333333333333e-02 584 75 8.33333333333333e-02 585 585 2.50000000000000e+00 585 590 -8.33333333333333e-02 585 589 1.66666666666667e-01 585 588 -2.50000000000000e-01 585 599 8.33333333333333e-02 585 185 8.33333333333333e-02 585 191 -8.33333333333333e-02 585 586 -3.33333333333333e-01 585 190 1.66666666666667e-01 585 86 1.66666666666667e-01 585 85 -8.33333333333333e-02 585 84 -2.50000000000000e-01 585 189 -2.50000000000000e-01 585 587 -3.33333333333333e-01 585 80 1.66666666666667e-01 585 79 -8.33333333333333e-02 585 184 8.33333333333333e-02 585 598 8.33333333333333e-02 585 78 -2.50000000000000e-01 585 502 1.66666666666667e-01 585 500 -1.66666666666667e-01 585 499 8.33333333333333e-02 585 503 1.66666666666667e-01 585 501 -7.50000000000000e-01 585 469 -8.33333333333333e-02 585 470 -8.33333333333333e-02 585 476 8.33333333333333e-02 585 475 -1.66666666666667e-01 585 980 8.33333333333333e-02 585 1034 -8.33333333333333e-02 585 1033 -8.33333333333333e-02 585 979 -1.66666666666667e-01 585 973 1.66666666666667e-01 585 1031 -1.66666666666667e-01 585 1030 8.33333333333333e-02 585 974 1.66666666666667e-01 585 972 -7.50000000000000e-01 586 586 2.50000000000000e+00 586 590 1.66666666666667e-01 586 589 -7.50000000000000e-01 586 588 1.66666666666667e-01 586 599 -1.66666666666667e-01 586 585 -3.33333333333333e-01 586 189 1.66666666666667e-01 586 86 1.66666666666667e-01 586 587 -3.33333333333333e-01 586 191 1.66666666666667e-01 586 85 -2.50000000000000e-01 586 190 -7.50000000000000e-01 586 84 -8.33333333333333e-02 586 80 1.66666666666667e-01 586 185 -1.66666666666667e-01 586 597 8.33333333333333e-02 586 79 -2.50000000000000e-01 586 78 -8.33333333333333e-02 586 183 8.33333333333333e-02 586 503 -8.33333333333333e-02 586 501 1.66666666666667e-01 586 498 8.33333333333333e-02 586 502 -2.50000000000000e-01 586 468 -8.33333333333333e-02 586 470 -8.33333333333333e-02 586 476 8.33333333333333e-02 586 500 8.33333333333333e-02 586 474 -1.66666666666667e-01 586 1032 -8.33333333333333e-02 586 980 8.33333333333333e-02 586 978 -1.66666666666667e-01 586 1034 -8.33333333333333e-02 586 974 -8.33333333333333e-02 586 1031 8.33333333333333e-02 586 972 1.66666666666667e-01 586 1029 8.33333333333333e-02 586 973 -2.50000000000000e-01 587 587 2.50000000000000e+00 587 589 1.66666666666667e-01 587 588 -8.33333333333333e-02 587 598 -1.66666666666667e-01 587 597 8.33333333333333e-02 587 183 8.33333333333333e-02 587 189 -8.33333333333333e-02 587 86 -7.50000000000000e-01 587 191 -2.50000000000000e-01 587 85 1.66666666666667e-01 587 586 -3.33333333333333e-01 587 190 1.66666666666667e-01 587 84 1.66666666666667e-01 587 590 -2.50000000000000e-01 587 80 -7.50000000000000e-01 587 79 1.66666666666667e-01 587 184 -1.66666666666667e-01 587 585 -3.33333333333333e-01 587 78 1.66666666666667e-01 587 502 -8.33333333333333e-02 587 498 -1.66666666666667e-01 587 503 -2.50000000000000e-01 587 501 1.66666666666667e-01 587 469 -8.33333333333333e-02 587 475 8.33333333333333e-02 587 468 -8.33333333333333e-02 587 499 8.33333333333333e-02 587 474 8.33333333333333e-02 587 978 8.33333333333333e-02 587 1032 -8.33333333333333e-02 587 979 8.33333333333333e-02 587 1033 -8.33333333333333e-02 587 973 -8.33333333333333e-02 587 1030 8.33333333333333e-02 587 1029 -1.66666666666667e-01 587 974 -2.50000000000000e-01 587 972 1.66666666666667e-01 588 588 2.50000000000000e+00 588 598 -8.33333333333333e-02 588 107 8.33333333333333e-02 588 597 -2.50000000000000e-01 588 80 8.33333333333333e-02 588 587 -8.33333333333333e-02 588 589 -3.33333333333333e-01 588 586 1.66666666666667e-01 588 585 -2.50000000000000e-01 588 233 -8.33333333333333e-02 588 232 1.66666666666667e-01 588 106 8.33333333333333e-02 588 231 -2.50000000000000e-01 588 590 -3.33333333333333e-01 588 227 1.66666666666667e-01 588 226 -8.33333333333333e-02 588 79 8.33333333333333e-02 588 599 1.66666666666667e-01 588 225 -2.50000000000000e-01 588 503 8.33333333333333e-02 588 502 -1.66666666666667e-01 588 499 -8.33333333333333e-02 588 223 8.33333333333333e-02 588 224 -1.66666666666667e-01 588 512 1.66666666666667e-01 588 500 -8.33333333333333e-02 588 511 1.66666666666667e-01 588 510 -7.50000000000000e-01 588 1034 -1.66666666666667e-01 588 1033 8.33333333333333e-02 588 1211 -8.33333333333333e-02 588 836 8.33333333333333e-02 588 835 -1.66666666666667e-01 588 979 1.66666666666667e-01 588 1210 -8.33333333333333e-02 588 980 1.66666666666667e-01 588 978 -7.50000000000000e-01 589 589 2.50000000000000e+00 589 597 -8.33333333333333e-02 589 599 1.66666666666667e-01 589 598 -2.50000000000000e-01 589 587 1.66666666666667e-01 589 586 -7.50000000000000e-01 589 588 -3.33333333333333e-01 589 585 1.66666666666667e-01 589 590 -3.33333333333333e-01 589 231 1.66666666666667e-01 589 107 -1.66666666666667e-01 589 233 1.66666666666667e-01 589 232 -7.50000000000000e-01 589 105 8.33333333333333e-02 589 227 1.66666666666667e-01 589 80 -1.66666666666667e-01 589 226 -2.50000000000000e-01 589 225 -8.33333333333333e-02 589 78 8.33333333333333e-02 589 501 -1.66666666666667e-01 589 498 -8.33333333333333e-02 589 500 -8.33333333333333e-02 589 222 8.33333333333333e-02 589 224 8.33333333333333e-02 589 512 -8.33333333333333e-02 589 503 8.33333333333333e-02 589 511 -2.50000000000000e-01 589 510 1.66666666666667e-01 589 1032 8.33333333333333e-02 589 1211 -8.33333333333333e-02 589 836 8.33333333333333e-02 589 980 -8.33333333333333e-02 589 834 -1.66666666666667e-01 589 978 1.66666666666667e-01 589 1209 -8.33333333333333e-02 589 1034 8.33333333333333e-02 589 979 -2.50000000000000e-01 590 590 2.50000000000000e+00 590 597 1.66666666666667e-01 590 599 -7.50000000000000e-01 590 598 1.66666666666667e-01 590 105 8.33333333333333e-02 590 587 -2.50000000000000e-01 590 586 1.66666666666667e-01 590 78 8.33333333333333e-02 590 585 -8.33333333333333e-02 590 589 -3.33333333333333e-01 590 231 -8.33333333333333e-02 590 233 -2.50000000000000e-01 590 106 -1.66666666666667e-01 590 232 1.66666666666667e-01 590 227 -7.50000000000000e-01 590 226 1.66666666666667e-01 590 79 -1.66666666666667e-01 590 588 -3.33333333333333e-01 590 225 1.66666666666667e-01 590 501 8.33333333333333e-02 590 499 -8.33333333333333e-02 590 223 8.33333333333333e-02 590 511 -8.33333333333333e-02 590 222 -1.66666666666667e-01 590 510 1.66666666666667e-01 590 498 -8.33333333333333e-02 590 502 8.33333333333333e-02 590 512 -2.50000000000000e-01 590 1032 -1.66666666666667e-01 590 1209 -8.33333333333333e-02 590 1210 -8.33333333333333e-02 590 834 8.33333333333333e-02 590 835 8.33333333333333e-02 590 979 -8.33333333333333e-02 590 1033 8.33333333333333e-02 590 980 -2.50000000000000e-01 590 978 1.66666666666667e-01 591 591 2.50000000000000e+00 591 596 1.66666666666667e-01 591 595 -8.33333333333333e-02 591 594 -2.50000000000000e-01 591 601 8.33333333333333e-02 591 187 8.33333333333333e-02 591 190 -8.33333333333333e-02 591 593 -3.33333333333333e-01 591 191 1.66666666666667e-01 591 86 -8.33333333333333e-02 591 85 1.66666666666667e-01 591 84 -2.50000000000000e-01 591 189 -2.50000000000000e-01 591 83 -8.33333333333333e-02 591 188 8.33333333333333e-02 591 592 -3.33333333333333e-01 591 82 1.66666666666667e-01 591 602 8.33333333333333e-02 591 81 -2.50000000000000e-01 591 536 8.33333333333333e-02 591 535 -1.66666666666667e-01 591 539 1.66666666666667e-01 591 538 1.66666666666667e-01 591 537 -7.50000000000000e-01 591 473 -8.33333333333333e-02 591 472 -8.33333333333333e-02 591 476 -1.66666666666667e-01 591 475 8.33333333333333e-02 591 1037 -8.33333333333333e-02 591 1010 -1.66666666666667e-01 591 1009 8.33333333333333e-02 591 1036 -8.33333333333333e-02 591 1004 1.66666666666667e-01 591 1031 8.33333333333333e-02 591 1030 -1.66666666666667e-01 591 1003 1.66666666666667e-01 591 1002 -7.50000000000000e-01 592 592 2.50000000000000e+00 592 596 1.66666666666667e-01 592 595 -2.50000000000000e-01 592 594 -8.33333333333333e-02 592 602 -1.66666666666667e-01 592 600 8.33333333333333e-02 592 186 8.33333333333333e-02 592 189 -8.33333333333333e-02 592 86 1.66666666666667e-01 592 593 -3.33333333333333e-01 592 191 1.66666666666667e-01 592 85 -7.50000000000000e-01 592 190 -2.50000000000000e-01 592 84 1.66666666666667e-01 592 83 1.66666666666667e-01 592 188 -1.66666666666667e-01 592 82 -7.50000000000000e-01 592 591 -3.33333333333333e-01 592 81 1.66666666666667e-01 592 536 8.33333333333333e-02 592 534 -1.66666666666667e-01 592 539 -8.33333333333333e-02 592 538 -2.50000000000000e-01 592 537 1.66666666666667e-01 592 476 8.33333333333333e-02 592 473 -8.33333333333333e-02 592 471 -8.33333333333333e-02 592 474 8.33333333333333e-02 592 1037 -8.33333333333333e-02 592 1008 8.33333333333333e-02 592 1035 -8.33333333333333e-02 592 1031 8.33333333333333e-02 592 1004 -8.33333333333333e-02 592 1029 -1.66666666666667e-01 592 1010 8.33333333333333e-02 592 1003 -2.50000000000000e-01 592 1002 1.66666666666667e-01 593 593 2.50000000000000e+00 593 596 -7.50000000000000e-01 593 595 1.66666666666667e-01 593 594 1.66666666666667e-01 593 601 -1.66666666666667e-01 593 591 -3.33333333333333e-01 593 189 1.66666666666667e-01 593 86 -2.50000000000000e-01 593 191 -7.50000000000000e-01 593 85 1.66666666666667e-01 593 592 -3.33333333333333e-01 593 190 1.66666666666667e-01 593 84 -8.33333333333333e-02 593 600 8.33333333333333e-02 593 83 -2.50000000000000e-01 593 82 1.66666666666667e-01 593 187 -1.66666666666667e-01 593 81 -8.33333333333333e-02 593 186 8.33333333333333e-02 593 534 8.33333333333333e-02 593 535 8.33333333333333e-02 593 539 -2.50000000000000e-01 593 538 -8.33333333333333e-02 593 537 1.66666666666667e-01 593 475 8.33333333333333e-02 593 472 -8.33333333333333e-02 593 471 -8.33333333333333e-02 593 474 -1.66666666666667e-01 593 1035 -8.33333333333333e-02 593 1009 8.33333333333333e-02 593 1036 -8.33333333333333e-02 593 1008 -1.66666666666667e-01 593 1030 8.33333333333333e-02 593 1003 -8.33333333333333e-02 593 1002 1.66666666666667e-01 593 1029 8.33333333333333e-02 593 1004 -2.50000000000000e-01 594 594 2.50000000000000e+00 594 601 1.66666666666667e-01 594 593 1.66666666666667e-01 594 596 -3.33333333333333e-01 594 82 8.33333333333333e-02 594 592 -8.33333333333333e-02 594 591 -2.50000000000000e-01 594 127 8.33333333333333e-02 594 600 -2.50000000000000e-01 594 274 -8.33333333333333e-02 594 275 1.66666666666667e-01 594 128 8.33333333333333e-02 594 273 -2.50000000000000e-01 594 269 -8.33333333333333e-02 594 83 8.33333333333333e-02 594 595 -3.33333333333333e-01 594 268 1.66666666666667e-01 594 602 -8.33333333333333e-02 594 267 -2.50000000000000e-01 594 539 -1.66666666666667e-01 594 538 8.33333333333333e-02 594 536 -8.33333333333333e-02 594 266 8.33333333333333e-02 594 547 1.66666666666667e-01 594 265 -1.66666666666667e-01 594 535 -8.33333333333333e-02 594 548 1.66666666666667e-01 594 546 -7.50000000000000e-01 594 1037 8.33333333333333e-02 594 1036 -1.66666666666667e-01 594 1010 1.66666666666667e-01 594 872 -1.66666666666667e-01 594 1246 -8.33333333333333e-02 594 871 8.33333333333333e-02 594 1247 -8.33333333333333e-02 594 1009 1.66666666666667e-01 594 1008 -7.50000000000000e-01 595 595 2.50000000000000e+00 595 593 1.66666666666667e-01 595 592 -2.50000000000000e-01 595 81 8.33333333333333e-02 595 591 -8.33333333333333e-02 595 602 1.66666666666667e-01 595 601 -7.50000000000000e-01 595 126 8.33333333333333e-02 595 596 -3.33333333333333e-01 595 273 -8.33333333333333e-02 595 128 -1.66666666666667e-01 595 275 1.66666666666667e-01 595 274 -2.50000000000000e-01 595 269 1.66666666666667e-01 595 83 -1.66666666666667e-01 595 600 1.66666666666667e-01 595 268 -7.50000000000000e-01 595 594 -3.33333333333333e-01 595 267 1.66666666666667e-01 595 539 8.33333333333333e-02 595 537 8.33333333333333e-02 595 548 -8.33333333333333e-02 595 536 -8.33333333333333e-02 595 266 8.33333333333333e-02 595 546 1.66666666666667e-01 595 264 -1.66666666666667e-01 595 534 -8.33333333333333e-02 595 547 -2.50000000000000e-01 595 1037 8.33333333333333e-02 595 1035 -1.66666666666667e-01 595 1010 -8.33333333333333e-02 595 1247 -8.33333333333333e-02 595 872 8.33333333333333e-02 595 1245 -8.33333333333333e-02 595 870 8.33333333333333e-02 595 1009 -2.50000000000000e-01 595 1008 1.66666666666667e-01 596 596 2.50000000000000e+00 596 593 -7.50000000000000e-01 596 592 1.66666666666667e-01 596 591 1.66666666666667e-01 596 594 -3.33333333333333e-01 596 602 -2.50000000000000e-01 596 601 1.66666666666667e-01 596 595 -3.33333333333333e-01 596 273 1.66666666666667e-01 596 275 -7.50000000000000e-01 596 127 -1.66666666666667e-01 596 274 1.66666666666667e-01 596 126 8.33333333333333e-02 596 600 -8.33333333333333e-02 596 269 -2.50000000000000e-01 596 268 1.66666666666667e-01 596 82 -1.66666666666667e-01 596 267 -8.33333333333333e-02 596 81 8.33333333333333e-02 596 538 8.33333333333333e-02 596 537 -1.66666666666667e-01 596 547 -8.33333333333333e-02 596 535 -8.33333333333333e-02 596 265 8.33333333333333e-02 596 534 -8.33333333333333e-02 596 264 8.33333333333333e-02 596 548 -2.50000000000000e-01 596 546 1.66666666666667e-01 596 1036 8.33333333333333e-02 596 1035 8.33333333333333e-02 596 1009 -8.33333333333333e-02 596 1246 -8.33333333333333e-02 596 871 8.33333333333333e-02 596 1008 1.66666666666667e-01 596 870 -1.66666666666667e-01 596 1245 -8.33333333333333e-02 596 1010 -2.50000000000000e-01 597 597 2.50000000000000e+00 597 599 -3.33333333333333e-01 597 589 -8.33333333333333e-02 597 586 8.33333333333333e-02 597 107 -8.33333333333333e-02 597 106 1.66666666666667e-01 597 588 -2.50000000000000e-01 597 587 8.33333333333333e-02 597 86 -8.33333333333333e-02 597 598 -3.33333333333333e-01 597 85 1.66666666666667e-01 597 323 8.33333333333333e-02 597 322 8.33333333333333e-02 597 105 -2.50000000000000e-01 597 317 1.66666666666667e-01 597 316 -8.33333333333333e-02 597 315 -2.50000000000000e-01 597 590 1.66666666666667e-01 597 84 -2.50000000000000e-01 597 511 8.33333333333333e-02 597 502 -8.33333333333333e-02 597 503 -8.33333333333333e-02 597 512 -1.66666666666667e-01 597 575 1.66666666666667e-01 597 569 8.33333333333333e-02 597 568 -1.66666666666667e-01 597 574 1.66666666666667e-01 597 573 -7.50000000000000e-01 597 1034 1.66666666666667e-01 597 1211 8.33333333333333e-02 597 1210 -1.66666666666667e-01 597 1033 1.66666666666667e-01 597 1032 -7.50000000000000e-01 597 1214 -8.33333333333333e-02 597 1213 -8.33333333333333e-02 597 1040 -1.66666666666667e-01 597 1039 8.33333333333333e-02 598 598 2.50000000000000e+00 598 588 -8.33333333333333e-02 598 585 8.33333333333333e-02 598 590 1.66666666666667e-01 598 589 -2.50000000000000e-01 598 105 1.66666666666667e-01 598 587 -1.66666666666667e-01 598 597 -3.33333333333333e-01 598 84 1.66666666666667e-01 598 323 -1.66666666666667e-01 598 107 1.66666666666667e-01 598 106 -7.50000000000000e-01 598 321 8.33333333333333e-02 598 317 1.66666666666667e-01 598 599 -3.33333333333333e-01 598 86 1.66666666666667e-01 598 316 -2.50000000000000e-01 598 85 -7.50000000000000e-01 598 315 -8.33333333333333e-02 598 510 8.33333333333333e-02 598 501 -8.33333333333333e-02 598 512 8.33333333333333e-02 598 503 -8.33333333333333e-02 598 575 -8.33333333333333e-02 598 569 8.33333333333333e-02 598 567 -1.66666666666667e-01 598 574 -2.50000000000000e-01 598 573 1.66666666666667e-01 598 1034 -8.33333333333333e-02 598 1209 -1.66666666666667e-01 598 1033 -2.50000000000000e-01 598 1032 1.66666666666667e-01 598 1214 -8.33333333333333e-02 598 1040 8.33333333333333e-02 598 1212 -8.33333333333333e-02 598 1211 8.33333333333333e-02 598 1038 8.33333333333333e-02 599 599 2.50000000000000e+00 599 588 1.66666666666667e-01 599 597 -3.33333333333333e-01 599 590 -7.50000000000000e-01 599 589 1.66666666666667e-01 599 105 -8.33333333333333e-02 599 586 -1.66666666666667e-01 599 585 8.33333333333333e-02 599 84 -8.33333333333333e-02 599 321 8.33333333333333e-02 599 107 -2.50000000000000e-01 599 322 -1.66666666666667e-01 599 106 1.66666666666667e-01 599 317 -7.50000000000000e-01 599 86 -2.50000000000000e-01 599 316 1.66666666666667e-01 599 598 -3.33333333333333e-01 599 85 1.66666666666667e-01 599 315 1.66666666666667e-01 599 501 -8.33333333333333e-02 599 511 8.33333333333333e-02 599 510 -1.66666666666667e-01 599 502 -8.33333333333333e-02 599 574 -8.33333333333333e-02 599 568 8.33333333333333e-02 599 573 1.66666666666667e-01 599 567 8.33333333333333e-02 599 575 -2.50000000000000e-01 599 1033 -8.33333333333333e-02 599 1032 1.66666666666667e-01 599 1209 8.33333333333333e-02 599 1034 -2.50000000000000e-01 599 1212 -8.33333333333333e-02 599 1213 -8.33333333333333e-02 599 1039 8.33333333333333e-02 599 1210 8.33333333333333e-02 599 1038 -1.66666666666667e-01 600 600 2.50000000000000e+00 600 593 8.33333333333333e-02 600 601 -3.33333333333333e-01 600 595 1.66666666666667e-01 600 592 8.33333333333333e-02 600 85 -8.33333333333333e-02 600 127 -8.33333333333333e-02 600 594 -2.50000000000000e-01 600 128 1.66666666666667e-01 600 602 -3.33333333333333e-01 600 86 1.66666666666667e-01 600 328 8.33333333333333e-02 600 329 8.33333333333333e-02 600 126 -2.50000000000000e-01 600 317 -8.33333333333333e-02 600 316 1.66666666666667e-01 600 315 -2.50000000000000e-01 600 596 -8.33333333333333e-02 600 84 -2.50000000000000e-01 600 538 -8.33333333333333e-02 600 548 8.33333333333333e-02 600 547 -1.66666666666667e-01 600 539 -8.33333333333333e-02 600 580 1.66666666666667e-01 600 569 -1.66666666666667e-01 600 568 8.33333333333333e-02 600 581 1.66666666666667e-01 600 579 -7.50000000000000e-01 600 1246 8.33333333333333e-02 600 1247 -1.66666666666667e-01 600 1037 1.66666666666667e-01 600 1036 1.66666666666667e-01 600 1035 -7.50000000000000e-01 600 1249 -8.33333333333333e-02 600 1250 -8.33333333333333e-02 600 1040 8.33333333333333e-02 600 1039 -1.66666666666667e-01 601 601 2.50000000000000e+00 601 594 1.66666666666667e-01 601 593 -1.66666666666667e-01 601 591 8.33333333333333e-02 601 84 -8.33333333333333e-02 601 596 1.66666666666667e-01 601 595 -7.50000000000000e-01 601 126 -8.33333333333333e-02 601 327 8.33333333333333e-02 601 329 -1.66666666666667e-01 601 128 1.66666666666667e-01 601 127 -2.50000000000000e-01 601 317 1.66666666666667e-01 601 602 -3.33333333333333e-01 601 86 1.66666666666667e-01 601 316 -7.50000000000000e-01 601 600 -3.33333333333333e-01 601 85 -2.50000000000000e-01 601 315 1.66666666666667e-01 601 537 -8.33333333333333e-02 601 548 8.33333333333333e-02 601 539 -8.33333333333333e-02 601 546 -1.66666666666667e-01 601 569 8.33333333333333e-02 601 581 -8.33333333333333e-02 601 579 1.66666666666667e-01 601 567 8.33333333333333e-02 601 580 -2.50000000000000e-01 601 1245 8.33333333333333e-02 601 1247 8.33333333333333e-02 601 1037 -8.33333333333333e-02 601 1036 -2.50000000000000e-01 601 1035 1.66666666666667e-01 601 1040 8.33333333333333e-02 601 1250 -8.33333333333333e-02 601 1248 -8.33333333333333e-02 601 1038 -1.66666666666667e-01 602 602 2.50000000000000e+00 602 591 8.33333333333333e-02 602 592 -1.66666666666667e-01 602 596 -2.50000000000000e-01 602 595 1.66666666666667e-01 602 126 1.66666666666667e-01 602 600 -3.33333333333333e-01 602 84 1.66666666666667e-01 602 128 -7.50000000000000e-01 602 328 -1.66666666666667e-01 602 127 1.66666666666667e-01 602 327 8.33333333333333e-02 602 317 -2.50000000000000e-01 602 594 -8.33333333333333e-02 602 86 -7.50000000000000e-01 602 316 1.66666666666667e-01 602 601 -3.33333333333333e-01 602 85 1.66666666666667e-01 602 315 -8.33333333333333e-02 602 538 -8.33333333333333e-02 602 546 8.33333333333333e-02 602 537 -8.33333333333333e-02 602 568 8.33333333333333e-02 602 580 -8.33333333333333e-02 602 567 -1.66666666666667e-01 602 547 8.33333333333333e-02 602 581 -2.50000000000000e-01 602 579 1.66666666666667e-01 602 1246 8.33333333333333e-02 602 1245 -1.66666666666667e-01 602 1037 -2.50000000000000e-01 602 1036 -8.33333333333333e-02 602 1035 1.66666666666667e-01 602 1039 8.33333333333333e-02 602 1249 -8.33333333333333e-02 602 1248 -8.33333333333333e-02 602 1038 8.33333333333333e-02 603 603 1.25000000000000e+00 603 383 -8.33333333333333e-02 603 604 -1.66666666666667e-01 603 607 8.33333333333333e-02 603 382 1.66666666666667e-01 603 608 8.33333333333333e-02 603 88 -4.16666666666667e-02 603 379 8.33333333333333e-02 603 606 -3.75000000000000e-01 603 617 -8.33333333333333e-02 603 616 4.16666666666667e-02 603 94 -4.16666666666667e-02 603 381 -2.50000000000000e-01 603 196 4.16666666666667e-02 603 361 -8.33333333333333e-02 603 362 -8.33333333333333e-02 603 368 8.33333333333333e-02 603 89 8.33333333333333e-02 603 197 -8.33333333333333e-02 603 87 -1.25000000000000e-01 603 605 -1.66666666666667e-01 603 203 8.33333333333333e-02 603 95 8.33333333333333e-02 603 202 8.33333333333333e-02 603 367 -1.66666666666667e-01 603 380 8.33333333333333e-02 603 201 -3.75000000000000e-01 603 93 -1.25000000000000e-01 604 604 1.25000000000000e+00 604 617 4.16666666666667e-02 604 603 -1.66666666666667e-01 604 606 8.33333333333333e-02 604 381 1.66666666666667e-01 604 89 8.33333333333333e-02 604 380 -1.66666666666667e-01 604 607 -1.25000000000000e-01 604 87 -4.16666666666667e-02 604 378 8.33333333333333e-02 604 605 -1.66666666666667e-01 604 383 1.66666666666667e-01 604 95 8.33333333333333e-02 604 382 -7.50000000000000e-01 604 615 4.16666666666667e-02 604 93 -4.16666666666667e-02 604 195 4.16666666666667e-02 604 360 -8.33333333333333e-02 604 197 4.16666666666667e-02 604 362 -8.33333333333333e-02 604 88 -1.25000000000000e-01 604 203 -4.16666666666667e-02 604 368 8.33333333333333e-02 604 608 -4.16666666666667e-02 604 202 -1.25000000000000e-01 604 94 -1.25000000000000e-01 604 201 8.33333333333333e-02 604 366 -1.66666666666667e-01 605 605 1.25000000000000e+00 605 381 -8.33333333333333e-02 605 607 -4.16666666666667e-02 605 616 4.16666666666667e-02 605 608 -1.25000000000000e-01 605 88 8.33333333333333e-02 605 379 -1.66666666666667e-01 605 606 8.33333333333333e-02 605 383 -2.50000000000000e-01 605 604 -1.66666666666667e-01 605 382 1.66666666666667e-01 605 94 8.33333333333333e-02 605 615 -8.33333333333333e-02 605 360 -8.33333333333333e-02 605 366 8.33333333333333e-02 605 89 -3.75000000000000e-01 605 196 4.16666666666667e-02 605 361 -8.33333333333333e-02 605 87 8.33333333333333e-02 605 195 -8.33333333333333e-02 605 378 8.33333333333333e-02 605 203 -1.25000000000000e-01 605 95 -3.75000000000000e-01 605 202 -4.16666666666667e-02 605 367 8.33333333333333e-02 605 603 -1.66666666666667e-01 605 201 8.33333333333333e-02 605 93 8.33333333333333e-02 606 606 1.25000000000000e+00 606 604 8.33333333333333e-02 606 382 -1.66666666666667e-01 606 605 8.33333333333333e-02 606 88 4.16666666666667e-02 606 603 -3.75000000000000e-01 606 617 8.33333333333333e-02 606 100 4.16666666666667e-02 606 616 -4.16666666666667e-02 606 615 -1.25000000000000e-01 606 379 -8.33333333333333e-02 606 380 -8.33333333333333e-02 606 608 -1.66666666666667e-01 606 211 -4.16666666666667e-02 606 205 8.33333333333333e-02 606 206 8.33333333333333e-02 606 386 -8.33333333333333e-02 606 212 8.33333333333333e-02 606 89 -8.33333333333333e-02 606 210 -1.25000000000000e-01 606 218 8.33333333333333e-02 606 101 -8.33333333333333e-02 606 217 8.33333333333333e-02 606 607 -1.66666666666667e-01 606 385 1.66666666666667e-01 606 216 -3.75000000000000e-01 606 383 8.33333333333333e-02 606 384 -2.50000000000000e-01 607 607 1.25000000000000e+00 607 383 8.33333333333333e-02 607 603 8.33333333333333e-02 607 381 -1.66666666666667e-01 607 604 -1.25000000000000e-01 607 87 4.16666666666667e-02 607 608 -1.66666666666667e-01 607 617 8.33333333333333e-02 607 616 -1.25000000000000e-01 607 99 4.16666666666667e-02 607 615 -4.16666666666667e-02 607 378 -8.33333333333333e-02 607 212 8.33333333333333e-02 607 210 -4.16666666666667e-02 607 204 8.33333333333333e-02 607 206 -1.66666666666667e-01 607 386 1.66666666666667e-01 607 89 4.16666666666667e-02 607 380 -8.33333333333333e-02 607 211 -1.25000000000000e-01 607 218 -4.16666666666667e-02 607 101 4.16666666666667e-02 607 217 -1.25000000000000e-01 607 605 -4.16666666666667e-02 607 385 -7.50000000000000e-01 607 216 8.33333333333333e-02 607 606 -1.66666666666667e-01 607 384 1.66666666666667e-01 608 608 1.25000000000000e+00 608 604 -4.16666666666667e-02 608 382 8.33333333333333e-02 608 605 -1.25000000000000e-01 608 603 8.33333333333333e-02 608 617 -3.75000000000000e-01 608 607 -1.66666666666667e-01 608 616 8.33333333333333e-02 608 615 8.33333333333333e-02 608 378 -8.33333333333333e-02 608 211 8.33333333333333e-02 608 606 -1.66666666666667e-01 608 205 -1.66666666666667e-01 608 385 1.66666666666667e-01 608 204 8.33333333333333e-02 608 384 -8.33333333333333e-02 608 212 -3.75000000000000e-01 608 88 4.16666666666667e-02 608 379 -8.33333333333333e-02 608 210 8.33333333333333e-02 608 87 -8.33333333333333e-02 608 218 -1.25000000000000e-01 608 381 8.33333333333333e-02 608 386 -2.50000000000000e-01 608 217 -4.16666666666667e-02 608 100 4.16666666666667e-02 608 216 8.33333333333333e-02 608 99 -8.33333333333333e-02 609 609 1.25000000000000e+00 609 619 4.16666666666667e-02 609 620 -8.33333333333333e-02 609 614 8.33333333333333e-02 609 612 -1.25000000000000e-01 609 431 -8.33333333333333e-02 609 94 8.33333333333333e-02 609 610 -1.66666666666667e-01 609 430 1.66666666666667e-01 609 429 -2.50000000000000e-01 609 428 8.33333333333333e-02 609 91 8.33333333333333e-02 609 427 -1.66666666666667e-01 609 368 8.33333333333333e-02 609 365 -8.33333333333333e-02 609 92 8.33333333333333e-02 609 200 -8.33333333333333e-02 609 199 4.16666666666667e-02 609 364 -8.33333333333333e-02 609 90 -3.75000000000000e-01 609 611 -1.66666666666667e-01 609 203 8.33333333333333e-02 609 95 8.33333333333333e-02 609 202 -4.16666666666667e-02 609 367 8.33333333333333e-02 609 613 -4.16666666666667e-02 609 201 -1.25000000000000e-01 609 93 -3.75000000000000e-01 610 610 1.25000000000000e+00 610 611 -1.66666666666667e-01 610 612 -4.16666666666667e-02 610 618 4.16666666666667e-02 610 95 -4.16666666666667e-02 610 620 4.16666666666667e-02 610 92 -4.16666666666667e-02 610 613 -1.25000000000000e-01 610 428 8.33333333333333e-02 610 431 1.66666666666667e-01 610 430 -7.50000000000000e-01 610 93 8.33333333333333e-02 610 609 -1.66666666666667e-01 610 429 1.66666666666667e-01 610 90 8.33333333333333e-02 610 426 -1.66666666666667e-01 610 200 4.16666666666667e-02 610 365 -8.33333333333333e-02 610 91 -1.25000000000000e-01 610 198 4.16666666666667e-02 610 363 -8.33333333333333e-02 610 203 8.33333333333333e-02 610 368 -1.66666666666667e-01 610 614 8.33333333333333e-02 610 202 -1.25000000000000e-01 610 94 -1.25000000000000e-01 610 201 -4.16666666666667e-02 610 366 8.33333333333333e-02 611 611 1.25000000000000e+00 611 610 -1.66666666666667e-01 611 94 -4.16666666666667e-02 611 619 4.16666666666667e-02 611 618 -8.33333333333333e-02 611 614 -3.75000000000000e-01 611 91 -4.16666666666667e-02 611 612 8.33333333333333e-02 611 427 8.33333333333333e-02 611 431 -2.50000000000000e-01 611 430 1.66666666666667e-01 611 429 -8.33333333333333e-02 611 426 8.33333333333333e-02 611 366 8.33333333333333e-02 611 363 -8.33333333333333e-02 611 199 4.16666666666667e-02 611 364 -8.33333333333333e-02 611 92 -1.25000000000000e-01 611 90 8.33333333333333e-02 611 198 -8.33333333333333e-02 611 613 8.33333333333333e-02 611 203 -3.75000000000000e-01 611 95 -1.25000000000000e-01 611 202 8.33333333333333e-02 611 367 -1.66666666666667e-01 611 609 -1.66666666666667e-01 611 201 8.33333333333333e-02 611 93 8.33333333333333e-02 612 612 1.25000000000000e+00 612 431 8.33333333333333e-02 612 430 8.33333333333333e-02 612 620 8.33333333333333e-02 612 619 8.33333333333333e-02 612 613 -1.66666666666667e-01 612 618 -3.75000000000000e-01 612 611 8.33333333333333e-02 612 609 -1.25000000000000e-01 612 440 -8.33333333333333e-02 612 614 -1.66666666666667e-01 612 428 -8.33333333333333e-02 612 278 8.33333333333333e-02 612 280 8.33333333333333e-02 612 439 1.66666666666667e-01 612 277 -1.66666666666667e-01 612 281 8.33333333333333e-02 612 92 -8.33333333333333e-02 612 91 4.16666666666667e-02 612 427 -8.33333333333333e-02 612 279 -3.75000000000000e-01 612 287 8.33333333333333e-02 612 131 -8.33333333333333e-02 612 286 -4.16666666666667e-02 612 130 4.16666666666667e-02 612 285 -1.25000000000000e-01 612 610 -4.16666666666667e-02 612 438 -2.50000000000000e-01 613 613 1.25000000000000e+00 613 609 -4.16666666666667e-02 613 431 -1.66666666666667e-01 613 429 8.33333333333333e-02 613 620 -4.16666666666667e-02 613 131 4.16666666666667e-02 613 619 -1.25000000000000e-01 613 618 8.33333333333333e-02 613 612 -1.66666666666667e-01 613 92 4.16666666666667e-02 613 610 -1.25000000000000e-01 613 281 -4.16666666666667e-02 613 279 8.33333333333333e-02 613 428 -8.33333333333333e-02 613 278 8.33333333333333e-02 613 438 1.66666666666667e-01 613 276 -1.66666666666667e-01 613 280 -1.25000000000000e-01 613 90 4.16666666666667e-02 613 426 -8.33333333333333e-02 613 287 8.33333333333333e-02 613 614 -1.66666666666667e-01 613 440 1.66666666666667e-01 613 286 -1.25000000000000e-01 613 611 8.33333333333333e-02 613 439 -7.50000000000000e-01 613 285 -4.16666666666667e-02 613 129 4.16666666666667e-02 614 614 1.25000000000000e+00 614 429 8.33333333333333e-02 614 430 -1.66666666666667e-01 614 620 -1.25000000000000e-01 614 619 -4.16666666666667e-02 614 130 4.16666666666667e-02 614 618 8.33333333333333e-02 614 611 -3.75000000000000e-01 614 91 4.16666666666667e-02 614 609 8.33333333333333e-02 614 438 -8.33333333333333e-02 614 280 -4.16666666666667e-02 614 612 -1.66666666666667e-01 614 426 -8.33333333333333e-02 614 276 8.33333333333333e-02 614 427 -8.33333333333333e-02 614 277 8.33333333333333e-02 614 281 -1.25000000000000e-01 614 279 8.33333333333333e-02 614 90 -8.33333333333333e-02 614 287 -3.75000000000000e-01 614 610 8.33333333333333e-02 614 440 -2.50000000000000e-01 614 286 8.33333333333333e-02 614 613 -1.66666666666667e-01 614 439 1.66666666666667e-01 614 285 8.33333333333333e-02 614 129 -8.33333333333333e-02 615 615 1.25000000000000e+00 615 607 -4.16666666666667e-02 615 606 -1.25000000000000e-01 615 605 -8.33333333333333e-02 615 604 4.16666666666667e-02 615 385 8.33333333333333e-02 615 382 -8.33333333333333e-02 615 386 8.33333333333333e-02 615 383 -8.33333333333333e-02 615 446 8.33333333333333e-02 615 449 -8.33333333333333e-02 615 298 4.16666666666667e-02 615 295 -4.16666666666667e-02 615 101 8.33333333333333e-02 615 299 -8.33333333333333e-02 615 100 8.33333333333333e-02 615 616 -1.66666666666667e-01 615 448 1.66666666666667e-01 615 99 -3.75000000000000e-01 615 447 -2.50000000000000e-01 615 617 -1.66666666666667e-01 615 95 8.33333333333333e-02 615 296 8.33333333333333e-02 615 94 8.33333333333333e-02 615 445 -1.66666666666667e-01 615 608 8.33333333333333e-02 615 93 -3.75000000000000e-01 615 294 -1.25000000000000e-01 616 616 1.25000000000000e+00 616 608 8.33333333333333e-02 616 607 -1.25000000000000e-01 616 606 -4.16666666666667e-02 616 603 4.16666666666667e-02 616 384 8.33333333333333e-02 616 381 -8.33333333333333e-02 616 383 -8.33333333333333e-02 616 386 -1.66666666666667e-01 616 617 -1.66666666666667e-01 616 449 1.66666666666667e-01 616 296 8.33333333333333e-02 616 297 4.16666666666667e-02 616 294 -4.16666666666667e-02 616 101 -4.16666666666667e-02 616 299 4.16666666666667e-02 616 100 -1.25000000000000e-01 616 448 -7.50000000000000e-01 616 99 8.33333333333333e-02 616 615 -1.66666666666667e-01 616 447 1.66666666666667e-01 616 95 -4.16666666666667e-02 616 446 8.33333333333333e-02 616 605 4.16666666666667e-02 616 94 -1.25000000000000e-01 616 295 -1.25000000000000e-01 616 93 8.33333333333333e-02 616 444 -1.66666666666667e-01 617 617 1.25000000000000e+00 617 608 -3.75000000000000e-01 617 607 8.33333333333333e-02 617 606 8.33333333333333e-02 617 603 -8.33333333333333e-02 617 382 -8.33333333333333e-02 617 385 -1.66666666666667e-01 617 384 8.33333333333333e-02 617 381 -8.33333333333333e-02 617 444 8.33333333333333e-02 617 447 -8.33333333333333e-02 617 616 -1.66666666666667e-01 617 448 1.66666666666667e-01 617 295 8.33333333333333e-02 617 101 -1.25000000000000e-01 617 449 -2.50000000000000e-01 617 100 -4.16666666666667e-02 617 298 4.16666666666667e-02 617 99 8.33333333333333e-02 617 297 -8.33333333333333e-02 617 604 4.16666666666667e-02 617 95 -1.25000000000000e-01 617 296 -3.75000000000000e-01 617 94 -4.16666666666667e-02 617 445 8.33333333333333e-02 617 615 -1.66666666666667e-01 617 93 8.33333333333333e-02 617 294 8.33333333333333e-02 618 618 1.25000000000000e+00 618 430 -8.33333333333333e-02 618 440 8.33333333333333e-02 618 431 -8.33333333333333e-02 618 611 -8.33333333333333e-02 618 614 8.33333333333333e-02 618 613 8.33333333333333e-02 618 439 -1.66666666666667e-01 618 612 -3.75000000000000e-01 618 446 8.33333333333333e-02 618 458 -8.33333333333333e-02 618 295 8.33333333333333e-02 618 619 -1.66666666666667e-01 618 457 1.66666666666667e-01 618 131 8.33333333333333e-02 618 308 -8.33333333333333e-02 618 130 -4.16666666666667e-02 618 307 4.16666666666667e-02 618 129 -1.25000000000000e-01 618 456 -2.50000000000000e-01 618 620 -1.66666666666667e-01 618 95 8.33333333333333e-02 618 296 8.33333333333333e-02 618 94 -4.16666666666667e-02 618 445 8.33333333333333e-02 618 610 4.16666666666667e-02 618 93 -1.25000000000000e-01 618 294 -3.75000000000000e-01 619 619 1.25000000000000e+00 619 429 -8.33333333333333e-02 619 611 4.16666666666667e-02 619 431 -8.33333333333333e-02 619 614 -4.16666666666667e-02 619 440 8.33333333333333e-02 619 613 -1.25000000000000e-01 619 612 8.33333333333333e-02 619 438 -1.66666666666667e-01 619 296 -4.16666666666667e-02 619 308 4.16666666666667e-02 619 294 8.33333333333333e-02 619 618 -1.66666666666667e-01 619 456 1.66666666666667e-01 619 131 8.33333333333333e-02 619 620 -1.66666666666667e-01 619 458 1.66666666666667e-01 619 130 -1.25000000000000e-01 619 457 -7.50000000000000e-01 619 129 -4.16666666666667e-02 619 306 4.16666666666667e-02 619 95 8.33333333333333e-02 619 446 -1.66666666666667e-01 619 609 4.16666666666667e-02 619 94 -1.25000000000000e-01 619 295 -1.25000000000000e-01 619 93 -4.16666666666667e-02 619 444 8.33333333333333e-02 620 620 1.25000000000000e+00 620 429 -8.33333333333333e-02 620 610 4.16666666666667e-02 620 430 -8.33333333333333e-02 620 609 -8.33333333333333e-02 620 614 -1.25000000000000e-01 620 613 -4.16666666666667e-02 620 439 8.33333333333333e-02 620 612 8.33333333333333e-02 620 295 -4.16666666666667e-02 620 307 4.16666666666667e-02 620 444 8.33333333333333e-02 620 456 -8.33333333333333e-02 620 131 -3.75000000000000e-01 620 458 -2.50000000000000e-01 620 130 8.33333333333333e-02 620 619 -1.66666666666667e-01 620 457 1.66666666666667e-01 620 129 8.33333333333333e-02 620 306 -8.33333333333333e-02 620 438 8.33333333333333e-02 620 95 -3.75000000000000e-01 620 296 -1.25000000000000e-01 620 94 8.33333333333333e-02 620 445 -1.66666666666667e-01 620 618 -1.66666666666667e-01 620 93 8.33333333333333e-02 620 294 8.33333333333333e-02 621 621 1.25000000000000e+00 621 509 -8.33333333333333e-02 621 622 -1.66666666666667e-01 621 625 8.33333333333333e-02 621 508 1.66666666666667e-01 621 626 8.33333333333333e-02 621 97 -4.16666666666667e-02 621 505 8.33333333333333e-02 621 624 -3.75000000000000e-01 621 635 -8.33333333333333e-02 621 634 4.16666666666667e-02 621 103 -4.16666666666667e-02 621 507 -2.50000000000000e-01 621 214 4.16666666666667e-02 621 487 -8.33333333333333e-02 621 488 -8.33333333333333e-02 621 494 8.33333333333333e-02 621 98 8.33333333333333e-02 621 215 -8.33333333333333e-02 621 96 -1.25000000000000e-01 621 623 -1.66666666666667e-01 621 221 8.33333333333333e-02 621 104 8.33333333333333e-02 621 220 8.33333333333333e-02 621 493 -1.66666666666667e-01 621 506 8.33333333333333e-02 621 219 -3.75000000000000e-01 621 102 -1.25000000000000e-01 622 622 1.25000000000000e+00 622 635 4.16666666666667e-02 622 621 -1.66666666666667e-01 622 624 8.33333333333333e-02 622 507 1.66666666666667e-01 622 98 8.33333333333333e-02 622 506 -1.66666666666667e-01 622 625 -1.25000000000000e-01 622 96 -4.16666666666667e-02 622 504 8.33333333333333e-02 622 623 -1.66666666666667e-01 622 509 1.66666666666667e-01 622 104 8.33333333333333e-02 622 508 -7.50000000000000e-01 622 633 4.16666666666667e-02 622 102 -4.16666666666667e-02 622 213 4.16666666666667e-02 622 486 -8.33333333333333e-02 622 215 4.16666666666667e-02 622 488 -8.33333333333333e-02 622 97 -1.25000000000000e-01 622 221 -4.16666666666667e-02 622 494 8.33333333333333e-02 622 626 -4.16666666666667e-02 622 220 -1.25000000000000e-01 622 103 -1.25000000000000e-01 622 219 8.33333333333333e-02 622 492 -1.66666666666667e-01 623 623 1.25000000000000e+00 623 507 -8.33333333333333e-02 623 625 -4.16666666666667e-02 623 634 4.16666666666667e-02 623 626 -1.25000000000000e-01 623 97 8.33333333333333e-02 623 505 -1.66666666666667e-01 623 624 8.33333333333333e-02 623 509 -2.50000000000000e-01 623 622 -1.66666666666667e-01 623 508 1.66666666666667e-01 623 103 8.33333333333333e-02 623 633 -8.33333333333333e-02 623 486 -8.33333333333333e-02 623 492 8.33333333333333e-02 623 98 -3.75000000000000e-01 623 214 4.16666666666667e-02 623 487 -8.33333333333333e-02 623 96 8.33333333333333e-02 623 213 -8.33333333333333e-02 623 504 8.33333333333333e-02 623 221 -1.25000000000000e-01 623 104 -3.75000000000000e-01 623 220 -4.16666666666667e-02 623 493 8.33333333333333e-02 623 621 -1.66666666666667e-01 623 219 8.33333333333333e-02 623 102 8.33333333333333e-02 624 624 1.25000000000000e+00 624 622 8.33333333333333e-02 624 508 -1.66666666666667e-01 624 623 8.33333333333333e-02 624 97 4.16666666666667e-02 624 621 -3.75000000000000e-01 624 635 8.33333333333333e-02 624 106 4.16666666666667e-02 624 634 -4.16666666666667e-02 624 633 -1.25000000000000e-01 624 505 -8.33333333333333e-02 624 506 -8.33333333333333e-02 624 626 -1.66666666666667e-01 624 229 -4.16666666666667e-02 624 223 8.33333333333333e-02 624 224 8.33333333333333e-02 624 512 -8.33333333333333e-02 624 230 8.33333333333333e-02 624 98 -8.33333333333333e-02 624 228 -1.25000000000000e-01 624 233 8.33333333333333e-02 624 107 -8.33333333333333e-02 624 232 8.33333333333333e-02 624 625 -1.66666666666667e-01 624 511 1.66666666666667e-01 624 231 -3.75000000000000e-01 624 509 8.33333333333333e-02 624 510 -2.50000000000000e-01 625 625 1.25000000000000e+00 625 509 8.33333333333333e-02 625 621 8.33333333333333e-02 625 507 -1.66666666666667e-01 625 622 -1.25000000000000e-01 625 96 4.16666666666667e-02 625 626 -1.66666666666667e-01 625 635 8.33333333333333e-02 625 634 -1.25000000000000e-01 625 105 4.16666666666667e-02 625 633 -4.16666666666667e-02 625 504 -8.33333333333333e-02 625 230 8.33333333333333e-02 625 228 -4.16666666666667e-02 625 222 8.33333333333333e-02 625 224 -1.66666666666667e-01 625 512 1.66666666666667e-01 625 98 4.16666666666667e-02 625 506 -8.33333333333333e-02 625 229 -1.25000000000000e-01 625 233 -4.16666666666667e-02 625 107 4.16666666666667e-02 625 232 -1.25000000000000e-01 625 623 -4.16666666666667e-02 625 511 -7.50000000000000e-01 625 231 8.33333333333333e-02 625 624 -1.66666666666667e-01 625 510 1.66666666666667e-01 626 626 1.25000000000000e+00 626 622 -4.16666666666667e-02 626 508 8.33333333333333e-02 626 623 -1.25000000000000e-01 626 621 8.33333333333333e-02 626 635 -3.75000000000000e-01 626 625 -1.66666666666667e-01 626 634 8.33333333333333e-02 626 633 8.33333333333333e-02 626 504 -8.33333333333333e-02 626 229 8.33333333333333e-02 626 624 -1.66666666666667e-01 626 223 -1.66666666666667e-01 626 511 1.66666666666667e-01 626 222 8.33333333333333e-02 626 510 -8.33333333333333e-02 626 230 -3.75000000000000e-01 626 97 4.16666666666667e-02 626 505 -8.33333333333333e-02 626 228 8.33333333333333e-02 626 96 -8.33333333333333e-02 626 233 -1.25000000000000e-01 626 507 8.33333333333333e-02 626 512 -2.50000000000000e-01 626 232 -4.16666666666667e-02 626 106 4.16666666666667e-02 626 231 8.33333333333333e-02 626 105 -8.33333333333333e-02 627 627 1.25000000000000e+00 627 637 4.16666666666667e-02 627 638 -8.33333333333333e-02 627 632 8.33333333333333e-02 627 630 -1.25000000000000e-01 627 557 -8.33333333333333e-02 627 103 8.33333333333333e-02 627 628 -1.66666666666667e-01 627 556 1.66666666666667e-01 627 555 -2.50000000000000e-01 627 554 8.33333333333333e-02 627 100 8.33333333333333e-02 627 553 -1.66666666666667e-01 627 494 8.33333333333333e-02 627 491 -8.33333333333333e-02 627 101 8.33333333333333e-02 627 218 -8.33333333333333e-02 627 217 4.16666666666667e-02 627 490 -8.33333333333333e-02 627 99 -3.75000000000000e-01 627 629 -1.66666666666667e-01 627 221 8.33333333333333e-02 627 104 8.33333333333333e-02 627 220 -4.16666666666667e-02 627 493 8.33333333333333e-02 627 631 -4.16666666666667e-02 627 219 -1.25000000000000e-01 627 102 -3.75000000000000e-01 628 628 1.25000000000000e+00 628 629 -1.66666666666667e-01 628 630 -4.16666666666667e-02 628 636 4.16666666666667e-02 628 104 -4.16666666666667e-02 628 638 4.16666666666667e-02 628 101 -4.16666666666667e-02 628 631 -1.25000000000000e-01 628 554 8.33333333333333e-02 628 557 1.66666666666667e-01 628 556 -7.50000000000000e-01 628 102 8.33333333333333e-02 628 627 -1.66666666666667e-01 628 555 1.66666666666667e-01 628 99 8.33333333333333e-02 628 552 -1.66666666666667e-01 628 218 4.16666666666667e-02 628 491 -8.33333333333333e-02 628 100 -1.25000000000000e-01 628 216 4.16666666666667e-02 628 489 -8.33333333333333e-02 628 221 8.33333333333333e-02 628 494 -1.66666666666667e-01 628 632 8.33333333333333e-02 628 220 -1.25000000000000e-01 628 103 -1.25000000000000e-01 628 219 -4.16666666666667e-02 628 492 8.33333333333333e-02 629 629 1.25000000000000e+00 629 628 -1.66666666666667e-01 629 103 -4.16666666666667e-02 629 637 4.16666666666667e-02 629 636 -8.33333333333333e-02 629 632 -3.75000000000000e-01 629 100 -4.16666666666667e-02 629 630 8.33333333333333e-02 629 553 8.33333333333333e-02 629 557 -2.50000000000000e-01 629 556 1.66666666666667e-01 629 555 -8.33333333333333e-02 629 552 8.33333333333333e-02 629 492 8.33333333333333e-02 629 489 -8.33333333333333e-02 629 217 4.16666666666667e-02 629 490 -8.33333333333333e-02 629 101 -1.25000000000000e-01 629 99 8.33333333333333e-02 629 216 -8.33333333333333e-02 629 631 8.33333333333333e-02 629 221 -3.75000000000000e-01 629 104 -1.25000000000000e-01 629 220 8.33333333333333e-02 629 493 -1.66666666666667e-01 629 627 -1.66666666666667e-01 629 219 8.33333333333333e-02 629 102 8.33333333333333e-02 630 630 1.25000000000000e+00 630 557 8.33333333333333e-02 630 556 8.33333333333333e-02 630 638 8.33333333333333e-02 630 637 8.33333333333333e-02 630 631 -1.66666666666667e-01 630 636 -3.75000000000000e-01 630 629 8.33333333333333e-02 630 627 -1.25000000000000e-01 630 566 -8.33333333333333e-02 630 632 -1.66666666666667e-01 630 554 -8.33333333333333e-02 630 293 8.33333333333333e-02 630 298 8.33333333333333e-02 630 565 1.66666666666667e-01 630 292 -1.66666666666667e-01 630 299 8.33333333333333e-02 630 101 -8.33333333333333e-02 630 100 4.16666666666667e-02 630 553 -8.33333333333333e-02 630 297 -3.75000000000000e-01 630 311 8.33333333333333e-02 630 134 -8.33333333333333e-02 630 310 -4.16666666666667e-02 630 133 4.16666666666667e-02 630 309 -1.25000000000000e-01 630 628 -4.16666666666667e-02 630 564 -2.50000000000000e-01 631 631 1.25000000000000e+00 631 627 -4.16666666666667e-02 631 557 -1.66666666666667e-01 631 555 8.33333333333333e-02 631 638 -4.16666666666667e-02 631 134 4.16666666666667e-02 631 637 -1.25000000000000e-01 631 636 8.33333333333333e-02 631 630 -1.66666666666667e-01 631 101 4.16666666666667e-02 631 628 -1.25000000000000e-01 631 299 -4.16666666666667e-02 631 297 8.33333333333333e-02 631 554 -8.33333333333333e-02 631 293 8.33333333333333e-02 631 564 1.66666666666667e-01 631 291 -1.66666666666667e-01 631 298 -1.25000000000000e-01 631 99 4.16666666666667e-02 631 552 -8.33333333333333e-02 631 311 8.33333333333333e-02 631 632 -1.66666666666667e-01 631 566 1.66666666666667e-01 631 310 -1.25000000000000e-01 631 629 8.33333333333333e-02 631 565 -7.50000000000000e-01 631 309 -4.16666666666667e-02 631 132 4.16666666666667e-02 632 632 1.25000000000000e+00 632 555 8.33333333333333e-02 632 556 -1.66666666666667e-01 632 638 -1.25000000000000e-01 632 637 -4.16666666666667e-02 632 133 4.16666666666667e-02 632 636 8.33333333333333e-02 632 629 -3.75000000000000e-01 632 100 4.16666666666667e-02 632 627 8.33333333333333e-02 632 564 -8.33333333333333e-02 632 298 -4.16666666666667e-02 632 630 -1.66666666666667e-01 632 552 -8.33333333333333e-02 632 291 8.33333333333333e-02 632 553 -8.33333333333333e-02 632 292 8.33333333333333e-02 632 299 -1.25000000000000e-01 632 297 8.33333333333333e-02 632 99 -8.33333333333333e-02 632 311 -3.75000000000000e-01 632 628 8.33333333333333e-02 632 566 -2.50000000000000e-01 632 310 8.33333333333333e-02 632 631 -1.66666666666667e-01 632 565 1.66666666666667e-01 632 309 8.33333333333333e-02 632 132 -8.33333333333333e-02 633 633 1.25000000000000e+00 633 625 -4.16666666666667e-02 633 624 -1.25000000000000e-01 633 623 -8.33333333333333e-02 633 622 4.16666666666667e-02 633 511 8.33333333333333e-02 633 508 -8.33333333333333e-02 633 512 8.33333333333333e-02 633 509 -8.33333333333333e-02 633 572 8.33333333333333e-02 633 575 -8.33333333333333e-02 633 322 4.16666666666667e-02 633 319 -4.16666666666667e-02 633 107 8.33333333333333e-02 633 323 -8.33333333333333e-02 633 106 8.33333333333333e-02 633 634 -1.66666666666667e-01 633 574 1.66666666666667e-01 633 105 -3.75000000000000e-01 633 573 -2.50000000000000e-01 633 635 -1.66666666666667e-01 633 104 8.33333333333333e-02 633 320 8.33333333333333e-02 633 103 8.33333333333333e-02 633 571 -1.66666666666667e-01 633 626 8.33333333333333e-02 633 102 -3.75000000000000e-01 633 318 -1.25000000000000e-01 634 634 1.25000000000000e+00 634 626 8.33333333333333e-02 634 625 -1.25000000000000e-01 634 624 -4.16666666666667e-02 634 621 4.16666666666667e-02 634 510 8.33333333333333e-02 634 507 -8.33333333333333e-02 634 509 -8.33333333333333e-02 634 512 -1.66666666666667e-01 634 635 -1.66666666666667e-01 634 575 1.66666666666667e-01 634 320 8.33333333333333e-02 634 321 4.16666666666667e-02 634 318 -4.16666666666667e-02 634 107 -4.16666666666667e-02 634 323 4.16666666666667e-02 634 106 -1.25000000000000e-01 634 574 -7.50000000000000e-01 634 105 8.33333333333333e-02 634 633 -1.66666666666667e-01 634 573 1.66666666666667e-01 634 104 -4.16666666666667e-02 634 572 8.33333333333333e-02 634 623 4.16666666666667e-02 634 103 -1.25000000000000e-01 634 319 -1.25000000000000e-01 634 102 8.33333333333333e-02 634 570 -1.66666666666667e-01 635 635 1.25000000000000e+00 635 626 -3.75000000000000e-01 635 625 8.33333333333333e-02 635 624 8.33333333333333e-02 635 621 -8.33333333333333e-02 635 508 -8.33333333333333e-02 635 511 -1.66666666666667e-01 635 510 8.33333333333333e-02 635 507 -8.33333333333333e-02 635 570 8.33333333333333e-02 635 573 -8.33333333333333e-02 635 634 -1.66666666666667e-01 635 574 1.66666666666667e-01 635 319 8.33333333333333e-02 635 107 -1.25000000000000e-01 635 575 -2.50000000000000e-01 635 106 -4.16666666666667e-02 635 322 4.16666666666667e-02 635 105 8.33333333333333e-02 635 321 -8.33333333333333e-02 635 622 4.16666666666667e-02 635 104 -1.25000000000000e-01 635 320 -3.75000000000000e-01 635 103 -4.16666666666667e-02 635 571 8.33333333333333e-02 635 633 -1.66666666666667e-01 635 102 8.33333333333333e-02 635 318 8.33333333333333e-02 636 636 1.25000000000000e+00 636 556 -8.33333333333333e-02 636 566 8.33333333333333e-02 636 557 -8.33333333333333e-02 636 629 -8.33333333333333e-02 636 632 8.33333333333333e-02 636 631 8.33333333333333e-02 636 565 -1.66666666666667e-01 636 630 -3.75000000000000e-01 636 572 8.33333333333333e-02 636 584 -8.33333333333333e-02 636 319 8.33333333333333e-02 636 637 -1.66666666666667e-01 636 583 1.66666666666667e-01 636 134 8.33333333333333e-02 636 332 -8.33333333333333e-02 636 133 -4.16666666666667e-02 636 331 4.16666666666667e-02 636 132 -1.25000000000000e-01 636 582 -2.50000000000000e-01 636 638 -1.66666666666667e-01 636 104 8.33333333333333e-02 636 320 8.33333333333333e-02 636 103 -4.16666666666667e-02 636 571 8.33333333333333e-02 636 628 4.16666666666667e-02 636 102 -1.25000000000000e-01 636 318 -3.75000000000000e-01 637 637 1.25000000000000e+00 637 555 -8.33333333333333e-02 637 629 4.16666666666667e-02 637 557 -8.33333333333333e-02 637 632 -4.16666666666667e-02 637 566 8.33333333333333e-02 637 631 -1.25000000000000e-01 637 630 8.33333333333333e-02 637 564 -1.66666666666667e-01 637 320 -4.16666666666667e-02 637 332 4.16666666666667e-02 637 318 8.33333333333333e-02 637 636 -1.66666666666667e-01 637 582 1.66666666666667e-01 637 134 8.33333333333333e-02 637 638 -1.66666666666667e-01 637 584 1.66666666666667e-01 637 133 -1.25000000000000e-01 637 583 -7.50000000000000e-01 637 132 -4.16666666666667e-02 637 330 4.16666666666667e-02 637 104 8.33333333333333e-02 637 572 -1.66666666666667e-01 637 627 4.16666666666667e-02 637 103 -1.25000000000000e-01 637 319 -1.25000000000000e-01 637 102 -4.16666666666667e-02 637 570 8.33333333333333e-02 638 638 1.25000000000000e+00 638 555 -8.33333333333333e-02 638 628 4.16666666666667e-02 638 556 -8.33333333333333e-02 638 627 -8.33333333333333e-02 638 632 -1.25000000000000e-01 638 631 -4.16666666666667e-02 638 565 8.33333333333333e-02 638 630 8.33333333333333e-02 638 319 -4.16666666666667e-02 638 331 4.16666666666667e-02 638 570 8.33333333333333e-02 638 582 -8.33333333333333e-02 638 134 -3.75000000000000e-01 638 584 -2.50000000000000e-01 638 133 8.33333333333333e-02 638 637 -1.66666666666667e-01 638 583 1.66666666666667e-01 638 132 8.33333333333333e-02 638 330 -8.33333333333333e-02 638 564 8.33333333333333e-02 638 104 -3.75000000000000e-01 638 320 -1.25000000000000e-01 638 103 8.33333333333333e-02 638 571 -1.66666666666667e-01 638 636 -1.66666666666667e-01 638 102 8.33333333333333e-02 638 318 8.33333333333333e-02 639 639 1.25000000000000e+00 639 418 -8.33333333333333e-02 639 644 8.33333333333333e-02 639 641 -1.66666666666667e-01 639 419 1.66666666666667e-01 639 416 8.33333333333333e-02 639 110 -4.16666666666667e-02 639 643 8.33333333333333e-02 639 642 -3.75000000000000e-01 639 653 4.16666666666667e-02 639 116 -4.16666666666667e-02 639 652 -8.33333333333333e-02 639 417 -2.50000000000000e-01 639 398 -8.33333333333333e-02 639 239 4.16666666666667e-02 639 397 -8.33333333333333e-02 639 403 8.33333333333333e-02 639 238 -8.33333333333333e-02 639 109 8.33333333333333e-02 639 108 -1.25000000000000e-01 639 245 8.33333333333333e-02 639 404 -1.66666666666667e-01 639 244 8.33333333333333e-02 639 640 -1.66666666666667e-01 639 115 8.33333333333333e-02 639 243 -3.75000000000000e-01 639 415 8.33333333333333e-02 639 114 -1.25000000000000e-01 640 640 1.25000000000000e+00 640 417 -8.33333333333333e-02 640 644 -4.16666666666667e-02 640 653 4.16666666666667e-02 640 416 -1.66666666666667e-01 640 110 8.33333333333333e-02 640 643 -1.25000000000000e-01 640 642 8.33333333333333e-02 640 419 1.66666666666667e-01 640 641 -1.66666666666667e-01 640 116 8.33333333333333e-02 640 418 -2.50000000000000e-01 640 651 -8.33333333333333e-02 640 396 -8.33333333333333e-02 640 402 8.33333333333333e-02 640 239 4.16666666666667e-02 640 398 -8.33333333333333e-02 640 109 -3.75000000000000e-01 640 237 -8.33333333333333e-02 640 108 8.33333333333333e-02 640 245 -4.16666666666667e-02 640 404 8.33333333333333e-02 640 244 -1.25000000000000e-01 640 414 8.33333333333333e-02 640 115 -3.75000000000000e-01 640 243 8.33333333333333e-02 640 639 -1.66666666666667e-01 640 114 8.33333333333333e-02 641 641 1.25000000000000e+00 641 652 4.16666666666667e-02 641 642 8.33333333333333e-02 641 639 -1.66666666666667e-01 641 417 1.66666666666667e-01 641 644 -1.25000000000000e-01 641 415 -1.66666666666667e-01 641 109 8.33333333333333e-02 641 414 8.33333333333333e-02 641 108 -4.16666666666667e-02 641 419 -7.50000000000000e-01 641 418 1.66666666666667e-01 641 640 -1.66666666666667e-01 641 115 8.33333333333333e-02 641 651 4.16666666666667e-02 641 114 -4.16666666666667e-02 641 396 -8.33333333333333e-02 641 237 4.16666666666667e-02 641 110 -1.25000000000000e-01 641 238 4.16666666666667e-02 641 397 -8.33333333333333e-02 641 245 -1.25000000000000e-01 641 643 -4.16666666666667e-02 641 116 -1.25000000000000e-01 641 244 -4.16666666666667e-02 641 403 8.33333333333333e-02 641 243 8.33333333333333e-02 641 402 -1.66666666666667e-01 642 642 1.25000000000000e+00 642 641 8.33333333333333e-02 642 419 -1.66666666666667e-01 642 110 4.16666666666667e-02 642 640 8.33333333333333e-02 642 639 -3.75000000000000e-01 642 122 4.16666666666667e-02 642 653 -4.16666666666667e-02 642 652 8.33333333333333e-02 642 651 -1.25000000000000e-01 642 416 -8.33333333333333e-02 642 415 -8.33333333333333e-02 642 248 8.33333333333333e-02 642 254 -4.16666666666667e-02 642 643 -1.66666666666667e-01 642 247 8.33333333333333e-02 642 421 -8.33333333333333e-02 642 109 -8.33333333333333e-02 642 253 8.33333333333333e-02 642 252 -1.25000000000000e-01 642 644 -1.66666666666667e-01 642 260 8.33333333333333e-02 642 422 1.66666666666667e-01 642 259 8.33333333333333e-02 642 121 -8.33333333333333e-02 642 418 8.33333333333333e-02 642 258 -3.75000000000000e-01 642 420 -2.50000000000000e-01 643 643 1.25000000000000e+00 643 641 -4.16666666666667e-02 643 419 8.33333333333333e-02 643 640 -1.25000000000000e-01 643 639 8.33333333333333e-02 643 644 -1.66666666666667e-01 643 653 8.33333333333333e-02 643 652 -3.75000000000000e-01 643 651 8.33333333333333e-02 643 414 -8.33333333333333e-02 643 254 8.33333333333333e-02 643 642 -1.66666666666667e-01 643 248 -1.66666666666667e-01 643 422 1.66666666666667e-01 643 246 8.33333333333333e-02 643 420 -8.33333333333333e-02 643 110 4.16666666666667e-02 643 416 -8.33333333333333e-02 643 253 -3.75000000000000e-01 643 108 -8.33333333333333e-02 643 252 8.33333333333333e-02 643 260 -4.16666666666667e-02 643 122 4.16666666666667e-02 643 417 8.33333333333333e-02 643 259 -1.25000000000000e-01 643 421 -2.50000000000000e-01 643 258 8.33333333333333e-02 643 120 -8.33333333333333e-02 644 644 1.25000000000000e+00 644 418 8.33333333333333e-02 644 639 8.33333333333333e-02 644 417 -1.66666666666667e-01 644 641 -1.25000000000000e-01 644 108 4.16666666666667e-02 644 653 -1.25000000000000e-01 644 643 -1.66666666666667e-01 644 652 8.33333333333333e-02 644 120 4.16666666666667e-02 644 651 -4.16666666666667e-02 644 414 -8.33333333333333e-02 644 253 8.33333333333333e-02 644 246 8.33333333333333e-02 644 252 -4.16666666666667e-02 644 247 -1.66666666666667e-01 644 421 1.66666666666667e-01 644 254 -1.25000000000000e-01 644 109 4.16666666666667e-02 644 415 -8.33333333333333e-02 644 640 -4.16666666666667e-02 644 260 -1.25000000000000e-01 644 422 -7.50000000000000e-01 644 259 -4.16666666666667e-02 644 121 4.16666666666667e-02 644 642 -1.66666666666667e-01 644 258 8.33333333333333e-02 644 420 1.66666666666667e-01 645 645 1.25000000000000e+00 645 436 -8.33333333333333e-02 645 650 -4.16666666666667e-02 645 656 4.16666666666667e-02 645 113 8.33333333333333e-02 645 434 -1.66666666666667e-01 645 649 8.33333333333333e-02 645 648 -1.25000000000000e-01 645 647 -1.66666666666667e-01 645 437 1.66666666666667e-01 645 116 8.33333333333333e-02 645 655 -8.33333333333333e-02 645 435 -2.50000000000000e-01 645 400 -8.33333333333333e-02 645 403 8.33333333333333e-02 645 242 4.16666666666667e-02 645 401 -8.33333333333333e-02 645 112 8.33333333333333e-02 645 241 -8.33333333333333e-02 645 111 -3.75000000000000e-01 645 245 -4.16666666666667e-02 645 404 8.33333333333333e-02 645 646 -1.66666666666667e-01 645 244 8.33333333333333e-02 645 115 8.33333333333333e-02 645 433 8.33333333333333e-02 645 243 -1.25000000000000e-01 645 114 -3.75000000000000e-01 646 646 1.25000000000000e+00 646 435 -8.33333333333333e-02 646 647 -1.66666666666667e-01 646 650 8.33333333333333e-02 646 437 1.66666666666667e-01 646 113 -4.16666666666667e-02 646 434 8.33333333333333e-02 646 649 -3.75000000000000e-01 646 648 8.33333333333333e-02 646 656 4.16666666666667e-02 646 116 -4.16666666666667e-02 646 436 -2.50000000000000e-01 646 654 -8.33333333333333e-02 646 242 4.16666666666667e-02 646 401 -8.33333333333333e-02 646 399 -8.33333333333333e-02 646 402 8.33333333333333e-02 646 112 -1.25000000000000e-01 646 111 8.33333333333333e-02 646 240 -8.33333333333333e-02 646 245 8.33333333333333e-02 646 404 -1.66666666666667e-01 646 432 8.33333333333333e-02 646 244 -3.75000000000000e-01 646 115 -1.25000000000000e-01 646 645 -1.66666666666667e-01 646 243 8.33333333333333e-02 646 114 8.33333333333333e-02 647 647 1.25000000000000e+00 647 649 8.33333333333333e-02 647 436 1.66666666666667e-01 647 648 -4.16666666666667e-02 647 654 4.16666666666667e-02 647 650 -1.25000000000000e-01 647 112 -4.16666666666667e-02 647 433 8.33333333333333e-02 647 111 8.33333333333333e-02 647 432 -1.66666666666667e-01 647 437 -7.50000000000000e-01 647 655 4.16666666666667e-02 647 115 -4.16666666666667e-02 647 645 -1.66666666666667e-01 647 435 1.66666666666667e-01 647 114 8.33333333333333e-02 647 241 4.16666666666667e-02 647 400 -8.33333333333333e-02 647 113 -1.25000000000000e-01 647 240 4.16666666666667e-02 647 399 -8.33333333333333e-02 647 646 -1.66666666666667e-01 647 245 -1.25000000000000e-01 647 116 -1.25000000000000e-01 647 244 8.33333333333333e-02 647 403 -1.66666666666667e-01 647 243 -4.16666666666667e-02 647 402 8.33333333333333e-02 648 648 1.25000000000000e+00 648 647 -4.16666666666667e-02 648 437 8.33333333333333e-02 648 646 8.33333333333333e-02 648 645 -1.25000000000000e-01 648 650 -1.66666666666667e-01 648 656 8.33333333333333e-02 648 655 8.33333333333333e-02 648 654 -3.75000000000000e-01 648 433 -8.33333333333333e-02 648 284 8.33333333333333e-02 648 649 -1.66666666666667e-01 648 278 -1.66666666666667e-01 648 440 1.66666666666667e-01 648 277 8.33333333333333e-02 648 439 -8.33333333333333e-02 648 113 4.16666666666667e-02 648 434 -8.33333333333333e-02 648 283 8.33333333333333e-02 648 112 -8.33333333333333e-02 648 282 -3.75000000000000e-01 648 287 -4.16666666666667e-02 648 131 4.16666666666667e-02 648 286 8.33333333333333e-02 648 130 -8.33333333333333e-02 648 285 -1.25000000000000e-01 648 436 8.33333333333333e-02 648 438 -2.50000000000000e-01 649 649 1.25000000000000e+00 649 647 8.33333333333333e-02 649 437 -1.66666666666667e-01 649 113 4.16666666666667e-02 649 646 -3.75000000000000e-01 649 645 8.33333333333333e-02 649 131 4.16666666666667e-02 649 656 -4.16666666666667e-02 649 655 -1.25000000000000e-01 649 654 8.33333333333333e-02 649 434 -8.33333333333333e-02 649 432 -8.33333333333333e-02 649 284 -4.16666666666667e-02 649 278 8.33333333333333e-02 649 648 -1.66666666666667e-01 649 276 8.33333333333333e-02 649 438 -8.33333333333333e-02 649 283 -1.25000000000000e-01 649 282 8.33333333333333e-02 649 111 -8.33333333333333e-02 649 287 8.33333333333333e-02 649 650 -1.66666666666667e-01 649 440 1.66666666666667e-01 649 286 -3.75000000000000e-01 649 435 8.33333333333333e-02 649 439 -2.50000000000000e-01 649 285 8.33333333333333e-02 649 129 -8.33333333333333e-02 650 650 1.25000000000000e+00 650 436 -1.66666666666667e-01 650 645 -4.16666666666667e-02 650 435 8.33333333333333e-02 650 647 -1.25000000000000e-01 650 112 4.16666666666667e-02 650 656 -1.25000000000000e-01 650 130 4.16666666666667e-02 650 655 -4.16666666666667e-02 650 648 -1.66666666666667e-01 650 654 8.33333333333333e-02 650 433 -8.33333333333333e-02 650 283 -4.16666666666667e-02 650 277 8.33333333333333e-02 650 282 8.33333333333333e-02 650 276 -1.66666666666667e-01 650 438 1.66666666666667e-01 650 284 -1.25000000000000e-01 650 111 4.16666666666667e-02 650 432 -8.33333333333333e-02 650 287 -1.25000000000000e-01 650 646 8.33333333333333e-02 650 440 -7.50000000000000e-01 650 286 8.33333333333333e-02 650 649 -1.66666666666667e-01 650 439 1.66666666666667e-01 650 285 -4.16666666666667e-02 650 129 4.16666666666667e-02 651 651 1.25000000000000e+00 651 643 8.33333333333333e-02 651 642 -1.25000000000000e-01 651 641 4.16666666666667e-02 651 640 -8.33333333333333e-02 651 422 8.33333333333333e-02 651 419 -8.33333333333333e-02 651 421 8.33333333333333e-02 651 418 -8.33333333333333e-02 651 454 -8.33333333333333e-02 651 451 8.33333333333333e-02 651 305 4.16666666666667e-02 651 302 -4.16666666666667e-02 651 116 8.33333333333333e-02 651 452 -1.66666666666667e-01 651 115 8.33333333333333e-02 651 652 -1.66666666666667e-01 651 301 8.33333333333333e-02 651 114 -3.75000000000000e-01 651 300 -1.25000000000000e-01 651 653 -1.66666666666667e-01 651 122 8.33333333333333e-02 651 455 1.66666666666667e-01 651 121 8.33333333333333e-02 651 304 -8.33333333333333e-02 651 644 -4.16666666666667e-02 651 120 -3.75000000000000e-01 651 453 -2.50000000000000e-01 652 652 1.25000000000000e+00 652 644 8.33333333333333e-02 652 643 -3.75000000000000e-01 652 642 8.33333333333333e-02 652 639 -8.33333333333333e-02 652 419 -8.33333333333333e-02 652 422 -1.66666666666667e-01 652 420 8.33333333333333e-02 652 417 -8.33333333333333e-02 652 453 -8.33333333333333e-02 652 450 8.33333333333333e-02 652 455 1.66666666666667e-01 652 653 -1.66666666666667e-01 652 302 8.33333333333333e-02 652 116 -4.16666666666667e-02 652 452 8.33333333333333e-02 652 115 -1.25000000000000e-01 652 301 -3.75000000000000e-01 652 114 8.33333333333333e-02 652 651 -1.66666666666667e-01 652 300 8.33333333333333e-02 652 122 -4.16666666666667e-02 652 305 4.16666666666667e-02 652 641 4.16666666666667e-02 652 121 -1.25000000000000e-01 652 454 -2.50000000000000e-01 652 120 8.33333333333333e-02 652 303 -8.33333333333333e-02 653 653 1.25000000000000e+00 653 644 -1.25000000000000e-01 653 643 8.33333333333333e-02 653 642 -4.16666666666667e-02 653 639 4.16666666666667e-02 653 420 8.33333333333333e-02 653 417 -8.33333333333333e-02 653 418 -8.33333333333333e-02 653 421 -1.66666666666667e-01 653 454 1.66666666666667e-01 653 652 -1.66666666666667e-01 653 301 8.33333333333333e-02 653 303 4.16666666666667e-02 653 300 -4.16666666666667e-02 653 116 -1.25000000000000e-01 653 302 -1.25000000000000e-01 653 115 -4.16666666666667e-02 653 451 8.33333333333333e-02 653 114 8.33333333333333e-02 653 450 -1.66666666666667e-01 653 640 4.16666666666667e-02 653 122 -1.25000000000000e-01 653 455 -7.50000000000000e-01 653 121 -4.16666666666667e-02 653 304 4.16666666666667e-02 653 651 -1.66666666666667e-01 653 120 8.33333333333333e-02 653 453 1.66666666666667e-01 654 654 1.25000000000000e+00 654 650 8.33333333333333e-02 654 649 8.33333333333333e-02 654 648 -3.75000000000000e-01 654 646 -8.33333333333333e-02 654 437 -8.33333333333333e-02 654 440 -1.66666666666667e-01 654 439 8.33333333333333e-02 654 436 -8.33333333333333e-02 654 451 8.33333333333333e-02 654 457 -8.33333333333333e-02 654 656 -1.66666666666667e-01 654 458 1.66666666666667e-01 654 302 8.33333333333333e-02 654 131 -4.16666666666667e-02 654 308 4.16666666666667e-02 654 130 8.33333333333333e-02 654 307 -8.33333333333333e-02 654 129 -1.25000000000000e-01 654 456 -2.50000000000000e-01 654 116 -4.16666666666667e-02 654 452 8.33333333333333e-02 654 655 -1.66666666666667e-01 654 115 8.33333333333333e-02 654 301 8.33333333333333e-02 654 647 4.16666666666667e-02 654 114 -1.25000000000000e-01 654 300 -3.75000000000000e-01 655 655 1.25000000000000e+00 655 649 -1.25000000000000e-01 655 648 8.33333333333333e-02 655 647 4.16666666666667e-02 655 645 -8.33333333333333e-02 655 440 8.33333333333333e-02 655 437 -8.33333333333333e-02 655 438 8.33333333333333e-02 655 435 -8.33333333333333e-02 655 450 8.33333333333333e-02 655 456 -8.33333333333333e-02 655 308 4.16666666666667e-02 655 302 -4.16666666666667e-02 655 131 8.33333333333333e-02 655 656 -1.66666666666667e-01 655 458 1.66666666666667e-01 655 130 -3.75000000000000e-01 655 457 -2.50000000000000e-01 655 129 8.33333333333333e-02 655 306 -8.33333333333333e-02 655 116 8.33333333333333e-02 655 452 -1.66666666666667e-01 655 650 -4.16666666666667e-02 655 115 -3.75000000000000e-01 655 301 -1.25000000000000e-01 655 654 -1.66666666666667e-01 655 114 8.33333333333333e-02 655 300 8.33333333333333e-02 656 656 1.25000000000000e+00 656 650 -1.25000000000000e-01 656 649 -4.16666666666667e-02 656 648 8.33333333333333e-02 656 646 4.16666666666667e-02 656 439 8.33333333333333e-02 656 436 -8.33333333333333e-02 656 435 -8.33333333333333e-02 656 438 -1.66666666666667e-01 656 307 4.16666666666667e-02 656 301 -4.16666666666667e-02 656 654 -1.66666666666667e-01 656 456 1.66666666666667e-01 656 300 8.33333333333333e-02 656 131 -1.25000000000000e-01 656 458 -7.50000000000000e-01 656 130 8.33333333333333e-02 656 655 -1.66666666666667e-01 656 457 1.66666666666667e-01 656 129 -4.16666666666667e-02 656 306 4.16666666666667e-02 656 645 4.16666666666667e-02 656 116 -1.25000000000000e-01 656 302 -1.25000000000000e-01 656 115 8.33333333333333e-02 656 451 -1.66666666666667e-01 656 114 -4.16666666666667e-02 656 450 8.33333333333333e-02 657 657 1.25000000000000e+00 657 544 -8.33333333333333e-02 657 662 8.33333333333333e-02 657 659 -1.66666666666667e-01 657 545 1.66666666666667e-01 657 542 8.33333333333333e-02 657 119 -4.16666666666667e-02 657 661 8.33333333333333e-02 657 660 -3.75000000000000e-01 657 671 4.16666666666667e-02 657 125 -4.16666666666667e-02 657 670 -8.33333333333333e-02 657 543 -2.50000000000000e-01 657 524 -8.33333333333333e-02 657 257 4.16666666666667e-02 657 523 -8.33333333333333e-02 657 529 8.33333333333333e-02 657 256 -8.33333333333333e-02 657 118 8.33333333333333e-02 657 117 -1.25000000000000e-01 657 263 8.33333333333333e-02 657 530 -1.66666666666667e-01 657 262 8.33333333333333e-02 657 658 -1.66666666666667e-01 657 124 8.33333333333333e-02 657 261 -3.75000000000000e-01 657 541 8.33333333333333e-02 657 123 -1.25000000000000e-01 658 658 1.25000000000000e+00 658 543 -8.33333333333333e-02 658 662 -4.16666666666667e-02 658 671 4.16666666666667e-02 658 542 -1.66666666666667e-01 658 119 8.33333333333333e-02 658 661 -1.25000000000000e-01 658 660 8.33333333333333e-02 658 545 1.66666666666667e-01 658 659 -1.66666666666667e-01 658 125 8.33333333333333e-02 658 544 -2.50000000000000e-01 658 669 -8.33333333333333e-02 658 522 -8.33333333333333e-02 658 528 8.33333333333333e-02 658 257 4.16666666666667e-02 658 524 -8.33333333333333e-02 658 118 -3.75000000000000e-01 658 255 -8.33333333333333e-02 658 117 8.33333333333333e-02 658 263 -4.16666666666667e-02 658 530 8.33333333333333e-02 658 262 -1.25000000000000e-01 658 540 8.33333333333333e-02 658 124 -3.75000000000000e-01 658 261 8.33333333333333e-02 658 657 -1.66666666666667e-01 658 123 8.33333333333333e-02 659 659 1.25000000000000e+00 659 670 4.16666666666667e-02 659 660 8.33333333333333e-02 659 657 -1.66666666666667e-01 659 543 1.66666666666667e-01 659 662 -1.25000000000000e-01 659 541 -1.66666666666667e-01 659 118 8.33333333333333e-02 659 540 8.33333333333333e-02 659 117 -4.16666666666667e-02 659 545 -7.50000000000000e-01 659 544 1.66666666666667e-01 659 658 -1.66666666666667e-01 659 124 8.33333333333333e-02 659 669 4.16666666666667e-02 659 123 -4.16666666666667e-02 659 522 -8.33333333333333e-02 659 255 4.16666666666667e-02 659 119 -1.25000000000000e-01 659 256 4.16666666666667e-02 659 523 -8.33333333333333e-02 659 263 -1.25000000000000e-01 659 661 -4.16666666666667e-02 659 125 -1.25000000000000e-01 659 262 -4.16666666666667e-02 659 529 8.33333333333333e-02 659 261 8.33333333333333e-02 659 528 -1.66666666666667e-01 660 660 1.25000000000000e+00 660 659 8.33333333333333e-02 660 545 -1.66666666666667e-01 660 119 4.16666666666667e-02 660 658 8.33333333333333e-02 660 657 -3.75000000000000e-01 660 128 4.16666666666667e-02 660 671 -4.16666666666667e-02 660 670 8.33333333333333e-02 660 669 -1.25000000000000e-01 660 542 -8.33333333333333e-02 660 541 -8.33333333333333e-02 660 266 8.33333333333333e-02 660 272 -4.16666666666667e-02 660 661 -1.66666666666667e-01 660 265 8.33333333333333e-02 660 547 -8.33333333333333e-02 660 118 -8.33333333333333e-02 660 271 8.33333333333333e-02 660 270 -1.25000000000000e-01 660 662 -1.66666666666667e-01 660 275 8.33333333333333e-02 660 548 1.66666666666667e-01 660 274 8.33333333333333e-02 660 127 -8.33333333333333e-02 660 544 8.33333333333333e-02 660 273 -3.75000000000000e-01 660 546 -2.50000000000000e-01 661 661 1.25000000000000e+00 661 659 -4.16666666666667e-02 661 545 8.33333333333333e-02 661 658 -1.25000000000000e-01 661 657 8.33333333333333e-02 661 662 -1.66666666666667e-01 661 671 8.33333333333333e-02 661 670 -3.75000000000000e-01 661 669 8.33333333333333e-02 661 540 -8.33333333333333e-02 661 272 8.33333333333333e-02 661 660 -1.66666666666667e-01 661 266 -1.66666666666667e-01 661 548 1.66666666666667e-01 661 264 8.33333333333333e-02 661 546 -8.33333333333333e-02 661 119 4.16666666666667e-02 661 542 -8.33333333333333e-02 661 271 -3.75000000000000e-01 661 117 -8.33333333333333e-02 661 270 8.33333333333333e-02 661 275 -4.16666666666667e-02 661 128 4.16666666666667e-02 661 543 8.33333333333333e-02 661 274 -1.25000000000000e-01 661 547 -2.50000000000000e-01 661 273 8.33333333333333e-02 661 126 -8.33333333333333e-02 662 662 1.25000000000000e+00 662 544 8.33333333333333e-02 662 657 8.33333333333333e-02 662 543 -1.66666666666667e-01 662 659 -1.25000000000000e-01 662 117 4.16666666666667e-02 662 671 -1.25000000000000e-01 662 661 -1.66666666666667e-01 662 670 8.33333333333333e-02 662 126 4.16666666666667e-02 662 669 -4.16666666666667e-02 662 540 -8.33333333333333e-02 662 271 8.33333333333333e-02 662 264 8.33333333333333e-02 662 270 -4.16666666666667e-02 662 265 -1.66666666666667e-01 662 547 1.66666666666667e-01 662 272 -1.25000000000000e-01 662 118 4.16666666666667e-02 662 541 -8.33333333333333e-02 662 658 -4.16666666666667e-02 662 275 -1.25000000000000e-01 662 548 -7.50000000000000e-01 662 274 -4.16666666666667e-02 662 127 4.16666666666667e-02 662 660 -1.66666666666667e-01 662 273 8.33333333333333e-02 662 546 1.66666666666667e-01 663 663 1.25000000000000e+00 663 562 -8.33333333333333e-02 663 668 -4.16666666666667e-02 663 674 4.16666666666667e-02 663 122 8.33333333333333e-02 663 560 -1.66666666666667e-01 663 667 8.33333333333333e-02 663 666 -1.25000000000000e-01 663 665 -1.66666666666667e-01 663 563 1.66666666666667e-01 663 125 8.33333333333333e-02 663 673 -8.33333333333333e-02 663 561 -2.50000000000000e-01 663 526 -8.33333333333333e-02 663 529 8.33333333333333e-02 663 260 4.16666666666667e-02 663 527 -8.33333333333333e-02 663 121 8.33333333333333e-02 663 259 -8.33333333333333e-02 663 120 -3.75000000000000e-01 663 263 -4.16666666666667e-02 663 530 8.33333333333333e-02 663 664 -1.66666666666667e-01 663 262 8.33333333333333e-02 663 124 8.33333333333333e-02 663 559 8.33333333333333e-02 663 261 -1.25000000000000e-01 663 123 -3.75000000000000e-01 664 664 1.25000000000000e+00 664 561 -8.33333333333333e-02 664 665 -1.66666666666667e-01 664 668 8.33333333333333e-02 664 563 1.66666666666667e-01 664 122 -4.16666666666667e-02 664 560 8.33333333333333e-02 664 667 -3.75000000000000e-01 664 666 8.33333333333333e-02 664 674 4.16666666666667e-02 664 125 -4.16666666666667e-02 664 562 -2.50000000000000e-01 664 672 -8.33333333333333e-02 664 260 4.16666666666667e-02 664 527 -8.33333333333333e-02 664 525 -8.33333333333333e-02 664 528 8.33333333333333e-02 664 121 -1.25000000000000e-01 664 120 8.33333333333333e-02 664 258 -8.33333333333333e-02 664 263 8.33333333333333e-02 664 530 -1.66666666666667e-01 664 558 8.33333333333333e-02 664 262 -3.75000000000000e-01 664 124 -1.25000000000000e-01 664 663 -1.66666666666667e-01 664 261 8.33333333333333e-02 664 123 8.33333333333333e-02 665 665 1.25000000000000e+00 665 667 8.33333333333333e-02 665 562 1.66666666666667e-01 665 666 -4.16666666666667e-02 665 672 4.16666666666667e-02 665 668 -1.25000000000000e-01 665 121 -4.16666666666667e-02 665 559 8.33333333333333e-02 665 120 8.33333333333333e-02 665 558 -1.66666666666667e-01 665 563 -7.50000000000000e-01 665 673 4.16666666666667e-02 665 124 -4.16666666666667e-02 665 663 -1.66666666666667e-01 665 561 1.66666666666667e-01 665 123 8.33333333333333e-02 665 259 4.16666666666667e-02 665 526 -8.33333333333333e-02 665 122 -1.25000000000000e-01 665 258 4.16666666666667e-02 665 525 -8.33333333333333e-02 665 664 -1.66666666666667e-01 665 263 -1.25000000000000e-01 665 125 -1.25000000000000e-01 665 262 8.33333333333333e-02 665 529 -1.66666666666667e-01 665 261 -4.16666666666667e-02 665 528 8.33333333333333e-02 666 666 1.25000000000000e+00 666 665 -4.16666666666667e-02 666 563 8.33333333333333e-02 666 664 8.33333333333333e-02 666 663 -1.25000000000000e-01 666 668 -1.66666666666667e-01 666 674 8.33333333333333e-02 666 673 8.33333333333333e-02 666 672 -3.75000000000000e-01 666 559 -8.33333333333333e-02 666 305 8.33333333333333e-02 666 667 -1.66666666666667e-01 666 293 -1.66666666666667e-01 666 566 1.66666666666667e-01 666 292 8.33333333333333e-02 666 565 -8.33333333333333e-02 666 122 4.16666666666667e-02 666 560 -8.33333333333333e-02 666 304 8.33333333333333e-02 666 121 -8.33333333333333e-02 666 303 -3.75000000000000e-01 666 311 -4.16666666666667e-02 666 134 4.16666666666667e-02 666 310 8.33333333333333e-02 666 133 -8.33333333333333e-02 666 309 -1.25000000000000e-01 666 562 8.33333333333333e-02 666 564 -2.50000000000000e-01 667 667 1.25000000000000e+00 667 665 8.33333333333333e-02 667 563 -1.66666666666667e-01 667 122 4.16666666666667e-02 667 664 -3.75000000000000e-01 667 663 8.33333333333333e-02 667 134 4.16666666666667e-02 667 674 -4.16666666666667e-02 667 673 -1.25000000000000e-01 667 672 8.33333333333333e-02 667 560 -8.33333333333333e-02 667 558 -8.33333333333333e-02 667 305 -4.16666666666667e-02 667 293 8.33333333333333e-02 667 666 -1.66666666666667e-01 667 291 8.33333333333333e-02 667 564 -8.33333333333333e-02 667 304 -1.25000000000000e-01 667 303 8.33333333333333e-02 667 120 -8.33333333333333e-02 667 311 8.33333333333333e-02 667 668 -1.66666666666667e-01 667 566 1.66666666666667e-01 667 310 -3.75000000000000e-01 667 561 8.33333333333333e-02 667 565 -2.50000000000000e-01 667 309 8.33333333333333e-02 667 132 -8.33333333333333e-02 668 668 1.25000000000000e+00 668 562 -1.66666666666667e-01 668 663 -4.16666666666667e-02 668 561 8.33333333333333e-02 668 665 -1.25000000000000e-01 668 121 4.16666666666667e-02 668 674 -1.25000000000000e-01 668 133 4.16666666666667e-02 668 673 -4.16666666666667e-02 668 666 -1.66666666666667e-01 668 672 8.33333333333333e-02 668 559 -8.33333333333333e-02 668 304 -4.16666666666667e-02 668 292 8.33333333333333e-02 668 303 8.33333333333333e-02 668 291 -1.66666666666667e-01 668 564 1.66666666666667e-01 668 305 -1.25000000000000e-01 668 120 4.16666666666667e-02 668 558 -8.33333333333333e-02 668 311 -1.25000000000000e-01 668 664 8.33333333333333e-02 668 566 -7.50000000000000e-01 668 310 8.33333333333333e-02 668 667 -1.66666666666667e-01 668 565 1.66666666666667e-01 668 309 -4.16666666666667e-02 668 132 4.16666666666667e-02 669 669 1.25000000000000e+00 669 661 8.33333333333333e-02 669 660 -1.25000000000000e-01 669 659 4.16666666666667e-02 669 658 -8.33333333333333e-02 669 548 8.33333333333333e-02 669 545 -8.33333333333333e-02 669 547 8.33333333333333e-02 669 544 -8.33333333333333e-02 669 580 -8.33333333333333e-02 669 577 8.33333333333333e-02 669 329 4.16666666666667e-02 669 326 -4.16666666666667e-02 669 125 8.33333333333333e-02 669 578 -1.66666666666667e-01 669 124 8.33333333333333e-02 669 670 -1.66666666666667e-01 669 325 8.33333333333333e-02 669 123 -3.75000000000000e-01 669 324 -1.25000000000000e-01 669 671 -1.66666666666667e-01 669 128 8.33333333333333e-02 669 581 1.66666666666667e-01 669 127 8.33333333333333e-02 669 328 -8.33333333333333e-02 669 662 -4.16666666666667e-02 669 126 -3.75000000000000e-01 669 579 -2.50000000000000e-01 670 670 1.25000000000000e+00 670 662 8.33333333333333e-02 670 661 -3.75000000000000e-01 670 660 8.33333333333333e-02 670 657 -8.33333333333333e-02 670 545 -8.33333333333333e-02 670 548 -1.66666666666667e-01 670 546 8.33333333333333e-02 670 543 -8.33333333333333e-02 670 579 -8.33333333333333e-02 670 576 8.33333333333333e-02 670 581 1.66666666666667e-01 670 671 -1.66666666666667e-01 670 326 8.33333333333333e-02 670 125 -4.16666666666667e-02 670 578 8.33333333333333e-02 670 124 -1.25000000000000e-01 670 325 -3.75000000000000e-01 670 123 8.33333333333333e-02 670 669 -1.66666666666667e-01 670 324 8.33333333333333e-02 670 128 -4.16666666666667e-02 670 329 4.16666666666667e-02 670 659 4.16666666666667e-02 670 127 -1.25000000000000e-01 670 580 -2.50000000000000e-01 670 126 8.33333333333333e-02 670 327 -8.33333333333333e-02 671 671 1.25000000000000e+00 671 662 -1.25000000000000e-01 671 661 8.33333333333333e-02 671 660 -4.16666666666667e-02 671 657 4.16666666666667e-02 671 546 8.33333333333333e-02 671 543 -8.33333333333333e-02 671 544 -8.33333333333333e-02 671 547 -1.66666666666667e-01 671 580 1.66666666666667e-01 671 670 -1.66666666666667e-01 671 325 8.33333333333333e-02 671 327 4.16666666666667e-02 671 324 -4.16666666666667e-02 671 125 -1.25000000000000e-01 671 326 -1.25000000000000e-01 671 124 -4.16666666666667e-02 671 577 8.33333333333333e-02 671 123 8.33333333333333e-02 671 576 -1.66666666666667e-01 671 658 4.16666666666667e-02 671 128 -1.25000000000000e-01 671 581 -7.50000000000000e-01 671 127 -4.16666666666667e-02 671 328 4.16666666666667e-02 671 669 -1.66666666666667e-01 671 126 8.33333333333333e-02 671 579 1.66666666666667e-01 672 672 1.25000000000000e+00 672 668 8.33333333333333e-02 672 667 8.33333333333333e-02 672 666 -3.75000000000000e-01 672 664 -8.33333333333333e-02 672 563 -8.33333333333333e-02 672 566 -1.66666666666667e-01 672 565 8.33333333333333e-02 672 562 -8.33333333333333e-02 672 577 8.33333333333333e-02 672 583 -8.33333333333333e-02 672 674 -1.66666666666667e-01 672 584 1.66666666666667e-01 672 326 8.33333333333333e-02 672 134 -4.16666666666667e-02 672 332 4.16666666666667e-02 672 133 8.33333333333333e-02 672 331 -8.33333333333333e-02 672 132 -1.25000000000000e-01 672 582 -2.50000000000000e-01 672 125 -4.16666666666667e-02 672 578 8.33333333333333e-02 672 673 -1.66666666666667e-01 672 124 8.33333333333333e-02 672 325 8.33333333333333e-02 672 665 4.16666666666667e-02 672 123 -1.25000000000000e-01 672 324 -3.75000000000000e-01 673 673 1.25000000000000e+00 673 667 -1.25000000000000e-01 673 666 8.33333333333333e-02 673 665 4.16666666666667e-02 673 663 -8.33333333333333e-02 673 566 8.33333333333333e-02 673 563 -8.33333333333333e-02 673 564 8.33333333333333e-02 673 561 -8.33333333333333e-02 673 576 8.33333333333333e-02 673 582 -8.33333333333333e-02 673 332 4.16666666666667e-02 673 326 -4.16666666666667e-02 673 134 8.33333333333333e-02 673 674 -1.66666666666667e-01 673 584 1.66666666666667e-01 673 133 -3.75000000000000e-01 673 583 -2.50000000000000e-01 673 132 8.33333333333333e-02 673 330 -8.33333333333333e-02 673 125 8.33333333333333e-02 673 578 -1.66666666666667e-01 673 668 -4.16666666666667e-02 673 124 -3.75000000000000e-01 673 325 -1.25000000000000e-01 673 672 -1.66666666666667e-01 673 123 8.33333333333333e-02 673 324 8.33333333333333e-02 674 674 1.25000000000000e+00 674 668 -1.25000000000000e-01 674 667 -4.16666666666667e-02 674 666 8.33333333333333e-02 674 664 4.16666666666667e-02 674 565 8.33333333333333e-02 674 562 -8.33333333333333e-02 674 561 -8.33333333333333e-02 674 564 -1.66666666666667e-01 674 331 4.16666666666667e-02 674 325 -4.16666666666667e-02 674 672 -1.66666666666667e-01 674 582 1.66666666666667e-01 674 324 8.33333333333333e-02 674 134 -1.25000000000000e-01 674 584 -7.50000000000000e-01 674 133 8.33333333333333e-02 674 673 -1.66666666666667e-01 674 583 1.66666666666667e-01 674 132 -4.16666666666667e-02 674 330 4.16666666666667e-02 674 663 4.16666666666667e-02 674 125 -1.25000000000000e-01 674 326 -1.25000000000000e-01 674 124 8.33333333333333e-02 674 577 -1.66666666666667e-01 674 123 -4.16666666666667e-02 674 576 8.33333333333333e-02 hypre-2.33.0/src/test/TEST_ij/data/beam_tet_dof2475_np4/A.IJ.00001000066400000000000000000020136751477326011500234500ustar00rootroot00000000000000675 1274 675 1274 675 675 7.50000000000000e-01 675 818 -8.33333333333333e-02 675 799 4.16666666666667e-02 675 805 -8.33333333333333e-02 675 800 4.16666666666667e-02 675 811 4.16666666666667e-02 675 817 -8.33333333333333e-02 675 798 -2.50000000000000e-01 675 812 -8.33333333333333e-02 675 803 -4.16666666666667e-02 675 815 8.33333333333333e-02 675 676 -8.33333333333333e-02 675 802 8.33333333333333e-02 675 796 4.16666666666667e-02 675 801 -1.25000000000000e-01 675 677 -8.33333333333333e-02 675 809 8.33333333333333e-02 675 797 4.16666666666667e-02 675 808 -4.16666666666667e-02 675 814 8.33333333333333e-02 675 806 4.16666666666667e-02 675 807 -1.25000000000000e-01 675 795 -2.50000000000000e-01 676 676 6.66666666666667e-01 676 798 4.16666666666667e-02 676 804 -8.33333333333333e-02 676 799 -8.33333333333333e-02 676 810 4.16666666666667e-02 676 816 -8.33333333333333e-02 676 812 4.16666666666667e-02 676 818 -8.33333333333333e-02 676 803 8.33333333333333e-02 676 802 -3.75000000000000e-01 676 675 -8.33333333333333e-02 676 801 8.33333333333333e-02 676 795 4.16666666666667e-02 676 809 8.33333333333333e-02 676 815 -1.66666666666667e-01 676 806 4.16666666666667e-02 676 808 -1.25000000000000e-01 676 796 -8.33333333333333e-02 676 807 -4.16666666666667e-02 676 813 8.33333333333333e-02 677 677 6.66666666666667e-01 677 804 4.16666666666667e-02 677 816 -8.33333333333333e-02 677 800 -8.33333333333333e-02 677 798 4.16666666666667e-02 677 811 4.16666666666667e-02 677 817 -8.33333333333333e-02 677 810 -8.33333333333333e-02 677 803 -1.25000000000000e-01 677 802 8.33333333333333e-02 677 801 -4.16666666666667e-02 677 813 8.33333333333333e-02 677 805 4.16666666666667e-02 677 809 -3.75000000000000e-01 677 797 -8.33333333333333e-02 677 808 8.33333333333333e-02 677 814 -1.66666666666667e-01 677 675 -8.33333333333333e-02 677 807 8.33333333333333e-02 677 795 4.16666666666667e-02 678 678 3.33333333333333e-01 678 830 4.16666666666667e-02 678 679 -8.33333333333333e-02 678 823 4.16666666666667e-02 678 820 4.16666666666667e-02 678 822 -4.16666666666667e-02 678 680 -8.33333333333333e-02 678 827 4.16666666666667e-02 678 821 4.16666666666667e-02 678 826 -4.16666666666667e-02 678 829 4.16666666666667e-02 678 824 -4.16666666666667e-02 678 825 -4.16666666666667e-02 678 819 -2.50000000000000e-01 679 679 2.50000000000000e-01 679 823 -1.25000000000000e-01 679 678 -8.33333333333333e-02 679 822 4.16666666666667e-02 679 819 4.16666666666667e-02 679 827 4.16666666666667e-02 679 830 -8.33333333333333e-02 679 824 4.16666666666667e-02 679 826 -4.16666666666667e-02 679 820 -8.33333333333333e-02 679 825 -4.16666666666667e-02 679 828 4.16666666666667e-02 680 680 2.50000000000000e-01 680 823 4.16666666666667e-02 680 822 -4.16666666666667e-02 680 828 4.16666666666667e-02 680 824 -4.16666666666667e-02 680 827 -1.25000000000000e-01 680 821 -8.33333333333333e-02 680 826 4.16666666666667e-02 680 829 -8.33333333333333e-02 680 678 -8.33333333333333e-02 680 825 4.16666666666667e-02 680 819 4.16666666666667e-02 681 681 5.00000000000000e-01 681 847 4.16666666666667e-02 681 682 -8.33333333333333e-02 681 846 -1.25000000000000e-01 681 854 -8.33333333333333e-02 681 850 -4.16666666666667e-02 681 853 4.16666666666667e-02 681 683 -8.33333333333333e-02 681 845 4.16666666666667e-02 681 851 8.33333333333333e-02 681 844 4.16666666666667e-02 681 843 -1.25000000000000e-01 681 842 -4.16666666666667e-02 681 839 4.16666666666667e-02 681 841 8.33333333333333e-02 681 838 -8.33333333333333e-02 681 840 -1.25000000000000e-01 681 848 4.16666666666667e-02 681 849 -1.25000000000000e-01 682 682 5.83333333333333e-01 682 854 4.16666666666667e-02 682 847 -4.16666666666667e-02 682 846 4.16666666666667e-02 682 681 -8.33333333333333e-02 682 849 -4.16666666666667e-02 682 852 4.16666666666667e-02 682 845 -4.16666666666667e-02 682 839 4.16666666666667e-02 682 844 -4.16666666666667e-02 682 843 4.16666666666667e-02 682 842 8.33333333333333e-02 682 683 -1.66666666666667e-01 682 851 8.33333333333333e-02 682 841 -3.75000000000000e-01 682 848 -4.16666666666667e-02 682 850 -1.25000000000000e-01 682 840 8.33333333333333e-02 682 837 -8.33333333333333e-02 683 683 5.83333333333333e-01 683 847 -4.16666666666667e-02 683 853 4.16666666666667e-02 683 846 4.16666666666667e-02 683 852 -8.33333333333333e-02 683 845 -4.16666666666667e-02 683 844 -4.16666666666667e-02 683 838 4.16666666666667e-02 683 681 -8.33333333333333e-02 683 843 4.16666666666667e-02 683 849 8.33333333333333e-02 683 842 -1.25000000000000e-01 683 848 -4.16666666666667e-02 683 851 -3.75000000000000e-01 683 841 8.33333333333333e-02 683 682 -1.66666666666667e-01 683 850 8.33333333333333e-02 683 840 -4.16666666666667e-02 683 837 4.16666666666667e-02 684 684 2.50000000000000e-01 684 863 4.16666666666667e-02 684 866 4.16666666666667e-02 684 862 4.16666666666667e-02 684 861 -1.25000000000000e-01 684 860 -4.16666666666667e-02 684 857 4.16666666666667e-02 684 859 4.16666666666667e-02 684 856 -8.33333333333333e-02 684 858 -4.16666666666667e-02 684 686 -8.33333333333333e-02 684 864 -8.33333333333333e-02 685 685 2.50000000000000e-01 685 857 4.16666666666667e-02 685 862 -4.16666666666667e-02 685 861 4.16666666666667e-02 685 860 4.16666666666667e-02 685 686 -8.33333333333333e-02 685 866 4.16666666666667e-02 685 859 -1.25000000000000e-01 685 863 -4.16666666666667e-02 685 865 -8.33333333333333e-02 685 858 4.16666666666667e-02 685 855 -8.33333333333333e-02 686 686 3.33333333333333e-01 686 862 -4.16666666666667e-02 686 856 4.16666666666667e-02 686 684 -8.33333333333333e-02 686 861 4.16666666666667e-02 686 864 4.16666666666667e-02 686 860 -4.16666666666667e-02 686 863 -4.16666666666667e-02 686 866 -2.50000000000000e-01 686 859 4.16666666666667e-02 686 685 -8.33333333333333e-02 686 865 4.16666666666667e-02 686 858 -4.16666666666667e-02 686 855 4.16666666666667e-02 687 687 5.00000000000000e-01 687 890 4.16666666666667e-02 687 689 -8.33333333333333e-02 687 884 4.16666666666667e-02 687 883 4.16666666666667e-02 687 889 -8.33333333333333e-02 687 882 -1.25000000000000e-01 687 878 8.33333333333333e-02 687 877 -4.16666666666667e-02 687 874 4.16666666666667e-02 687 876 -1.25000000000000e-01 687 881 4.16666666666667e-02 687 875 -8.33333333333333e-02 687 880 4.16666666666667e-02 687 688 -8.33333333333333e-02 687 886 8.33333333333333e-02 687 879 -1.25000000000000e-01 687 887 -4.16666666666667e-02 687 885 -1.25000000000000e-01 688 688 5.83333333333333e-01 688 890 4.16666666666667e-02 688 883 -4.16666666666667e-02 688 882 4.16666666666667e-02 688 888 -8.33333333333333e-02 688 878 8.33333333333333e-02 688 689 -1.66666666666667e-01 688 887 8.33333333333333e-02 688 877 -1.25000000000000e-01 688 876 -4.16666666666667e-02 688 873 4.16666666666667e-02 688 881 -4.16666666666667e-02 688 875 4.16666666666667e-02 688 880 -4.16666666666667e-02 688 884 -4.16666666666667e-02 688 886 -3.75000000000000e-01 688 879 4.16666666666667e-02 688 687 -8.33333333333333e-02 688 885 8.33333333333333e-02 689 689 5.83333333333333e-01 689 888 4.16666666666667e-02 689 884 -4.16666666666667e-02 689 883 -4.16666666666667e-02 689 889 4.16666666666667e-02 689 687 -8.33333333333333e-02 689 882 4.16666666666667e-02 689 878 -3.75000000000000e-01 689 877 8.33333333333333e-02 689 688 -1.66666666666667e-01 689 886 8.33333333333333e-02 689 876 8.33333333333333e-02 689 881 -4.16666666666667e-02 689 885 -4.16666666666667e-02 689 887 -1.25000000000000e-01 689 880 -4.16666666666667e-02 689 874 4.16666666666667e-02 689 879 4.16666666666667e-02 689 873 -8.33333333333333e-02 690 690 2.50000000000000e-01 690 895 -4.16666666666667e-02 690 892 4.16666666666667e-02 690 894 -4.16666666666667e-02 690 899 4.16666666666667e-02 690 893 -8.33333333333333e-02 690 898 4.16666666666667e-02 690 691 -8.33333333333333e-02 690 901 4.16666666666667e-02 690 897 -1.25000000000000e-01 690 896 4.16666666666667e-02 690 900 -8.33333333333333e-02 691 691 3.33333333333333e-01 691 692 -8.33333333333333e-02 691 902 4.16666666666667e-02 691 895 -4.16666666666667e-02 691 894 -4.16666666666667e-02 691 891 4.16666666666667e-02 691 899 -4.16666666666667e-02 691 893 4.16666666666667e-02 691 898 -4.16666666666667e-02 691 896 4.16666666666667e-02 691 901 -2.50000000000000e-01 691 897 4.16666666666667e-02 691 690 -8.33333333333333e-02 691 900 4.16666666666667e-02 692 692 2.50000000000000e-01 692 895 4.16666666666667e-02 692 691 -8.33333333333333e-02 692 901 4.16666666666667e-02 692 894 4.16666666666667e-02 692 899 -4.16666666666667e-02 692 896 -1.25000000000000e-01 692 902 -8.33333333333333e-02 692 898 -4.16666666666667e-02 692 892 4.16666666666667e-02 692 897 4.16666666666667e-02 692 891 -8.33333333333333e-02 693 693 7.50000000000000e-01 693 929 4.16666666666667e-02 693 916 -4.16666666666667e-02 693 923 -4.16666666666667e-02 693 694 -8.33333333333333e-02 693 928 4.16666666666667e-02 693 927 -2.50000000000000e-01 693 917 8.33333333333333e-02 693 926 4.16666666666667e-02 693 914 -8.33333333333333e-02 693 913 4.16666666666667e-02 693 920 4.16666666666667e-02 693 925 4.16666666666667e-02 693 924 -2.50000000000000e-01 693 911 8.33333333333333e-02 693 908 -8.33333333333333e-02 693 915 -1.25000000000000e-01 693 910 8.33333333333333e-02 693 907 -8.33333333333333e-02 693 919 -8.33333333333333e-02 693 922 8.33333333333333e-02 693 921 -1.25000000000000e-01 693 695 -8.33333333333333e-02 694 694 6.66666666666667e-01 694 928 -8.33333333333333e-02 694 693 -8.33333333333333e-02 694 927 4.16666666666667e-02 694 914 4.16666666666667e-02 694 912 4.16666666666667e-02 694 925 -8.33333333333333e-02 694 924 4.16666666666667e-02 694 917 8.33333333333333e-02 694 916 -1.25000000000000e-01 694 911 -1.66666666666667e-01 694 923 8.33333333333333e-02 694 909 8.33333333333333e-02 694 906 -8.33333333333333e-02 694 920 4.16666666666667e-02 694 908 -8.33333333333333e-02 694 922 -3.75000000000000e-01 694 915 -4.16666666666667e-02 694 918 -8.33333333333333e-02 694 921 8.33333333333333e-02 695 695 6.66666666666667e-01 695 927 4.16666666666667e-02 695 929 -8.33333333333333e-02 695 921 -4.16666666666667e-02 695 913 4.16666666666667e-02 695 915 8.33333333333333e-02 695 924 4.16666666666667e-02 695 912 -8.33333333333333e-02 695 926 -8.33333333333333e-02 695 918 4.16666666666667e-02 695 917 -3.75000000000000e-01 695 916 8.33333333333333e-02 695 909 8.33333333333333e-02 695 906 -8.33333333333333e-02 695 910 -1.66666666666667e-01 695 922 8.33333333333333e-02 695 923 -1.25000000000000e-01 695 693 -8.33333333333333e-02 695 919 4.16666666666667e-02 695 907 -8.33333333333333e-02 696 696 4.16666666666667e-01 696 950 4.16666666666667e-02 696 938 -8.33333333333333e-02 696 937 4.16666666666667e-02 696 944 4.16666666666667e-02 696 949 4.16666666666667e-02 696 948 -2.50000000000000e-01 696 935 4.16666666666667e-02 696 932 -8.33333333333333e-02 696 939 -8.33333333333333e-02 696 934 4.16666666666667e-02 696 931 -8.33333333333333e-02 696 943 -8.33333333333333e-02 696 946 4.16666666666667e-02 696 945 -8.33333333333333e-02 696 941 4.16666666666667e-02 697 697 4.16666666666667e-01 697 936 4.16666666666667e-02 697 949 -8.33333333333333e-02 697 948 4.16666666666667e-02 697 941 4.16666666666667e-02 697 940 -8.33333333333333e-02 697 935 -8.33333333333333e-02 697 947 4.16666666666667e-02 697 933 4.16666666666667e-02 697 930 -8.33333333333333e-02 697 944 4.16666666666667e-02 697 932 -8.33333333333333e-02 697 946 -2.50000000000000e-01 697 938 4.16666666666667e-02 697 942 -8.33333333333333e-02 697 945 4.16666666666667e-02 698 698 4.16666666666667e-01 698 939 4.16666666666667e-02 698 948 4.16666666666667e-02 698 936 -8.33333333333333e-02 698 950 -8.33333333333333e-02 698 942 4.16666666666667e-02 698 941 -2.50000000000000e-01 698 940 4.16666666666667e-02 698 933 4.16666666666667e-02 698 930 -8.33333333333333e-02 698 934 -8.33333333333333e-02 698 946 4.16666666666667e-02 698 947 -8.33333333333333e-02 698 937 4.16666666666667e-02 698 943 4.16666666666667e-02 698 931 -8.33333333333333e-02 699 699 7.50000000000000e-01 699 796 4.16666666666667e-02 699 961 -8.33333333333333e-02 699 953 -4.16666666666667e-02 699 700 -8.33333333333333e-02 699 952 8.33333333333333e-02 699 784 4.16666666666667e-02 699 951 -1.25000000000000e-01 699 968 -8.33333333333333e-02 699 959 8.33333333333333e-02 699 797 4.16666666666667e-02 699 965 -8.33333333333333e-02 699 964 4.16666666666667e-02 699 967 -8.33333333333333e-02 699 795 -2.50000000000000e-01 699 701 -8.33333333333333e-02 699 956 8.33333333333333e-02 699 785 4.16666666666667e-02 699 955 -4.16666666666667e-02 699 958 8.33333333333333e-02 699 962 4.16666666666667e-02 699 954 -1.25000000000000e-01 699 783 -2.50000000000000e-01 700 700 6.66666666666667e-01 700 795 4.16666666666667e-02 700 960 -8.33333333333333e-02 700 953 8.33333333333333e-02 700 952 -3.75000000000000e-01 700 699 -8.33333333333333e-02 700 951 8.33333333333333e-02 700 783 4.16666666666667e-02 700 965 4.16666666666667e-02 700 968 -8.33333333333333e-02 700 796 -8.33333333333333e-02 700 963 4.16666666666667e-02 700 966 -8.33333333333333e-02 700 956 8.33333333333333e-02 700 959 -1.66666666666667e-01 700 962 4.16666666666667e-02 700 955 -1.25000000000000e-01 700 784 -8.33333333333333e-02 700 954 -4.16666666666667e-02 700 957 8.33333333333333e-02 701 701 6.66666666666667e-01 701 960 4.16666666666667e-02 701 953 -1.25000000000000e-01 701 952 8.33333333333333e-02 701 951 -4.16666666666667e-02 701 964 4.16666666666667e-02 701 967 -8.33333333333333e-02 701 966 -8.33333333333333e-02 701 957 8.33333333333333e-02 701 797 -8.33333333333333e-02 701 795 4.16666666666667e-02 701 963 -8.33333333333333e-02 701 961 4.16666666666667e-02 701 956 -3.75000000000000e-01 701 785 -8.33333333333333e-02 701 955 8.33333333333333e-02 701 958 -1.66666666666667e-01 701 699 -8.33333333333333e-02 701 954 8.33333333333333e-02 701 783 4.16666666666667e-02 702 702 1.25000000000000e+00 702 994 8.33333333333333e-02 702 995 8.33333333333333e-02 702 991 8.33333333333333e-02 702 990 -1.25000000000000e-01 702 704 -1.66666666666667e-01 702 971 8.33333333333333e-02 702 970 8.33333333333333e-02 702 969 -3.75000000000000e-01 702 982 -8.33333333333333e-02 702 703 -1.66666666666667e-01 702 986 8.33333333333333e-02 702 997 -8.33333333333333e-02 702 988 8.33333333333333e-02 702 983 1.66666666666667e-01 702 989 -1.66666666666667e-01 702 839 4.16666666666667e-02 702 998 -8.33333333333333e-02 702 985 8.33333333333333e-02 702 838 -8.33333333333333e-02 702 984 -3.75000000000000e-01 702 953 -4.16666666666667e-02 702 788 4.16666666666667e-02 702 952 8.33333333333333e-02 702 787 -8.33333333333333e-02 702 951 -1.25000000000000e-01 702 992 -4.16666666666667e-02 702 981 -2.50000000000000e-01 703 703 1.25000000000000e+00 703 993 8.33333333333333e-02 703 995 -1.66666666666667e-01 703 839 4.16666666666667e-02 703 991 -3.75000000000000e-01 703 990 8.33333333333333e-02 703 971 -4.16666666666667e-02 703 788 4.16666666666667e-02 703 970 -1.25000000000000e-01 703 969 8.33333333333333e-02 703 981 -8.33333333333333e-02 703 986 -4.16666666666667e-02 703 702 -1.66666666666667e-01 703 996 -8.33333333333333e-02 703 987 8.33333333333333e-02 703 998 -8.33333333333333e-02 703 989 8.33333333333333e-02 703 985 -1.25000000000000e-01 703 984 8.33333333333333e-02 703 837 -8.33333333333333e-02 703 953 8.33333333333333e-02 703 704 -1.66666666666667e-01 703 983 1.66666666666667e-01 703 952 -3.75000000000000e-01 703 992 8.33333333333333e-02 703 982 -2.50000000000000e-01 703 951 8.33333333333333e-02 703 786 -8.33333333333333e-02 704 704 1.25000000000000e+00 704 991 8.33333333333333e-02 704 994 -1.66666666666667e-01 704 993 8.33333333333333e-02 704 992 -1.25000000000000e-01 704 838 4.16666666666667e-02 704 971 -1.25000000000000e-01 704 970 -4.16666666666667e-02 704 787 4.16666666666667e-02 704 702 -1.66666666666667e-01 704 969 8.33333333333333e-02 704 985 -4.16666666666667e-02 704 984 8.33333333333333e-02 704 997 -8.33333333333333e-02 704 988 8.33333333333333e-02 704 981 1.66666666666667e-01 704 987 -1.66666666666667e-01 704 986 -1.25000000000000e-01 704 837 4.16666666666667e-02 704 996 -8.33333333333333e-02 704 953 -1.25000000000000e-01 704 990 -4.16666666666667e-02 704 983 -7.50000000000000e-01 704 952 8.33333333333333e-02 704 703 -1.66666666666667e-01 704 982 1.66666666666667e-01 704 951 -4.16666666666667e-02 704 786 4.16666666666667e-02 705 705 1.25000000000000e+00 705 1019 8.33333333333333e-02 705 1018 -1.66666666666667e-01 705 1016 8.33333333333333e-02 705 874 4.16666666666667e-02 705 1014 -3.75000000000000e-01 705 956 8.33333333333333e-02 705 955 -4.16666666666667e-02 705 790 4.16666666666667e-02 705 954 -1.25000000000000e-01 705 1013 -8.33333333333333e-02 705 707 -1.66666666666667e-01 705 1021 -4.16666666666667e-02 705 1028 -8.33333333333333e-02 705 1025 8.33333333333333e-02 705 1027 -8.33333333333333e-02 705 1024 8.33333333333333e-02 705 1022 8.33333333333333e-02 705 875 -8.33333333333333e-02 705 1020 -1.25000000000000e-01 705 1001 8.33333333333333e-02 705 791 -8.33333333333333e-02 705 1000 8.33333333333333e-02 705 706 -1.66666666666667e-01 705 1012 1.66666666666667e-01 705 999 -3.75000000000000e-01 705 1015 8.33333333333333e-02 705 1011 -2.50000000000000e-01 706 706 1.25000000000000e+00 706 1019 8.33333333333333e-02 706 1014 8.33333333333333e-02 706 1017 -1.66666666666667e-01 706 1015 -1.25000000000000e-01 706 873 4.16666666666667e-02 706 956 8.33333333333333e-02 706 707 -1.66666666666667e-01 706 955 -1.25000000000000e-01 706 954 -4.16666666666667e-02 706 789 4.16666666666667e-02 706 1020 -4.16666666666667e-02 706 1022 8.33333333333333e-02 706 1013 1.66666666666667e-01 706 1025 -1.66666666666667e-01 706 1026 -8.33333333333333e-02 706 1023 8.33333333333333e-02 706 875 4.16666666666667e-02 706 1028 -8.33333333333333e-02 706 1021 -1.25000000000000e-01 706 1001 -4.16666666666667e-02 706 791 4.16666666666667e-02 706 1000 -1.25000000000000e-01 706 1016 -4.16666666666667e-02 706 1012 -7.50000000000000e-01 706 999 8.33333333333333e-02 706 705 -1.66666666666667e-01 706 1011 1.66666666666667e-01 707 707 1.25000000000000e+00 707 1018 8.33333333333333e-02 707 1017 8.33333333333333e-02 707 1016 -1.25000000000000e-01 707 1014 8.33333333333333e-02 707 956 -3.75000000000000e-01 707 955 8.33333333333333e-02 707 706 -1.66666666666667e-01 707 954 8.33333333333333e-02 707 1011 -8.33333333333333e-02 707 705 -1.66666666666667e-01 707 1021 8.33333333333333e-02 707 1026 -8.33333333333333e-02 707 1023 8.33333333333333e-02 707 1012 1.66666666666667e-01 707 1024 -1.66666666666667e-01 707 1022 -3.75000000000000e-01 707 874 4.16666666666667e-02 707 1027 -8.33333333333333e-02 707 1020 8.33333333333333e-02 707 873 -8.33333333333333e-02 707 1001 -1.25000000000000e-01 707 1015 -4.16666666666667e-02 707 1013 -2.50000000000000e-01 707 1000 -4.16666666666667e-02 707 790 4.16666666666667e-02 707 999 8.33333333333333e-02 707 789 -8.33333333333333e-02 708 708 2.50000000000000e+00 708 1045 1.66666666666667e-01 708 1044 -2.50000000000000e-01 708 974 -1.66666666666667e-01 708 973 8.33333333333333e-02 708 1031 1.66666666666667e-01 708 1057 8.33333333333333e-02 708 1030 1.66666666666667e-01 708 1029 -7.50000000000000e-01 708 1058 8.33333333333333e-02 708 982 -8.33333333333333e-02 708 983 1.66666666666667e-01 708 710 -3.33333333333333e-01 708 794 -8.33333333333333e-02 708 981 -2.50000000000000e-01 708 1049 8.33333333333333e-02 708 908 -8.33333333333333e-02 708 1048 -1.66666666666667e-01 708 959 8.33333333333333e-02 708 1042 1.66666666666667e-01 708 709 -3.33333333333333e-01 708 1043 1.66666666666667e-01 708 907 -8.33333333333333e-02 708 1041 -7.50000000000000e-01 708 958 8.33333333333333e-02 708 793 -8.33333333333333e-02 708 1013 -8.33333333333333e-02 708 1004 8.33333333333333e-02 708 1054 8.33333333333333e-02 708 1051 -8.33333333333333e-02 708 1003 -1.66666666666667e-01 708 1012 1.66666666666667e-01 708 1011 -2.50000000000000e-01 708 1052 1.66666666666667e-01 708 1055 -1.66666666666667e-01 708 1050 -2.50000000000000e-01 708 1046 -8.33333333333333e-02 709 709 2.50000000000000e+00 709 1044 1.66666666666667e-01 709 1046 1.66666666666667e-01 709 1045 -7.50000000000000e-01 709 972 8.33333333333333e-02 709 1031 -8.33333333333333e-02 709 1056 8.33333333333333e-02 709 1030 -2.50000000000000e-01 709 1029 1.66666666666667e-01 709 1058 -1.66666666666667e-01 709 981 -8.33333333333333e-02 709 1049 8.33333333333333e-02 709 983 1.66666666666667e-01 709 982 -2.50000000000000e-01 709 1047 -1.66666666666667e-01 709 1043 -8.33333333333333e-02 709 1041 1.66666666666667e-01 709 708 -3.33333333333333e-01 709 1042 -2.50000000000000e-01 709 906 -8.33333333333333e-02 709 959 -1.66666666666667e-01 709 957 8.33333333333333e-02 709 792 -8.33333333333333e-02 709 1013 1.66666666666667e-01 709 710 -3.33333333333333e-01 709 1052 1.66666666666667e-01 709 1053 8.33333333333333e-02 709 1050 -8.33333333333333e-02 709 1004 8.33333333333333e-02 709 794 -8.33333333333333e-02 709 1012 -7.50000000000000e-01 709 1002 -1.66666666666667e-01 709 1011 1.66666666666667e-01 709 1055 8.33333333333333e-02 709 908 -8.33333333333333e-02 709 1051 -2.50000000000000e-01 709 974 8.33333333333333e-02 710 710 2.50000000000000e+00 710 973 8.33333333333333e-02 710 1046 -2.50000000000000e-01 710 1045 1.66666666666667e-01 710 972 -1.66666666666667e-01 710 1030 -8.33333333333333e-02 710 1029 1.66666666666667e-01 710 1031 -2.50000000000000e-01 710 1057 -1.66666666666667e-01 710 1056 8.33333333333333e-02 710 1048 8.33333333333333e-02 710 981 1.66666666666667e-01 710 708 -3.33333333333333e-01 710 983 -7.50000000000000e-01 710 982 1.66666666666667e-01 710 792 -8.33333333333333e-02 710 1047 8.33333333333333e-02 710 906 -8.33333333333333e-02 710 1042 -8.33333333333333e-02 710 957 8.33333333333333e-02 710 1043 -2.50000000000000e-01 710 1041 1.66666666666667e-01 710 958 -1.66666666666667e-01 710 1011 -8.33333333333333e-02 710 1002 8.33333333333333e-02 710 1012 1.66666666666667e-01 710 709 -3.33333333333333e-01 710 1051 1.66666666666667e-01 710 1013 -2.50000000000000e-01 710 1003 8.33333333333333e-02 710 793 -8.33333333333333e-02 710 1052 -7.50000000000000e-01 710 1044 -8.33333333333333e-02 710 1054 8.33333333333333e-02 710 907 -8.33333333333333e-02 710 1050 1.66666666666667e-01 710 1053 -1.66666666666667e-01 711 711 7.50000000000000e-01 711 820 4.16666666666667e-02 711 1069 -8.33333333333333e-02 711 1061 -4.16666666666667e-02 711 712 -8.33333333333333e-02 711 1060 8.33333333333333e-02 711 799 4.16666666666667e-02 711 1059 -1.25000000000000e-01 711 1076 -8.33333333333333e-02 711 1067 8.33333333333333e-02 711 821 4.16666666666667e-02 711 1073 -8.33333333333333e-02 711 1072 4.16666666666667e-02 711 1075 -8.33333333333333e-02 711 819 -2.50000000000000e-01 711 713 -8.33333333333333e-02 711 1064 8.33333333333333e-02 711 800 4.16666666666667e-02 711 1063 -4.16666666666667e-02 711 1066 8.33333333333333e-02 711 1070 4.16666666666667e-02 711 1062 -1.25000000000000e-01 711 798 -2.50000000000000e-01 712 712 6.66666666666667e-01 712 819 4.16666666666667e-02 712 1068 -8.33333333333333e-02 712 1061 8.33333333333333e-02 712 1060 -3.75000000000000e-01 712 711 -8.33333333333333e-02 712 1059 8.33333333333333e-02 712 798 4.16666666666667e-02 712 1073 4.16666666666667e-02 712 1076 -8.33333333333333e-02 712 820 -8.33333333333333e-02 712 1071 4.16666666666667e-02 712 1074 -8.33333333333333e-02 712 1064 8.33333333333333e-02 712 1067 -1.66666666666667e-01 712 1070 4.16666666666667e-02 712 1063 -1.25000000000000e-01 712 799 -8.33333333333333e-02 712 1062 -4.16666666666667e-02 712 1065 8.33333333333333e-02 713 713 6.66666666666667e-01 713 1068 4.16666666666667e-02 713 1061 -1.25000000000000e-01 713 1060 8.33333333333333e-02 713 1059 -4.16666666666667e-02 713 1072 4.16666666666667e-02 713 1075 -8.33333333333333e-02 713 1074 -8.33333333333333e-02 713 1065 8.33333333333333e-02 713 821 -8.33333333333333e-02 713 819 4.16666666666667e-02 713 1071 -8.33333333333333e-02 713 1069 4.16666666666667e-02 713 1064 -3.75000000000000e-01 713 800 -8.33333333333333e-02 713 1063 8.33333333333333e-02 713 1066 -1.66666666666667e-01 713 711 -8.33333333333333e-02 713 1062 8.33333333333333e-02 713 798 4.16666666666667e-02 714 714 1.25000000000000e+00 714 1087 -8.33333333333333e-02 714 1079 8.33333333333333e-02 714 1078 8.33333333333333e-02 714 1077 -3.75000000000000e-01 714 1094 -8.33333333333333e-02 714 1093 -8.33333333333333e-02 714 1085 -1.66666666666667e-01 714 1084 8.33333333333333e-02 714 986 8.33333333333333e-02 714 716 -1.66666666666667e-01 714 1082 1.66666666666667e-01 714 1090 8.33333333333333e-02 714 1081 -8.33333333333333e-02 714 803 -4.16666666666667e-02 714 962 4.16666666666667e-02 714 802 8.33333333333333e-02 714 961 -8.33333333333333e-02 714 801 -1.25000000000000e-01 714 1080 -2.50000000000000e-01 714 842 -4.16666666666667e-02 714 1091 8.33333333333333e-02 714 715 -1.66666666666667e-01 714 841 8.33333333333333e-02 714 985 8.33333333333333e-02 714 1088 4.16666666666667e-02 714 840 -1.25000000000000e-01 714 984 -3.75000000000000e-01 715 715 1.25000000000000e+00 715 1086 -8.33333333333333e-02 715 1079 -4.16666666666667e-02 715 1078 -1.25000000000000e-01 715 1077 8.33333333333333e-02 715 1094 -8.33333333333333e-02 715 1085 8.33333333333333e-02 715 1092 -8.33333333333333e-02 715 1083 8.33333333333333e-02 715 986 -4.16666666666667e-02 715 962 4.16666666666667e-02 715 1089 8.33333333333333e-02 715 1080 -8.33333333333333e-02 715 803 8.33333333333333e-02 715 716 -1.66666666666667e-01 715 1082 1.66666666666667e-01 715 802 -3.75000000000000e-01 715 1081 -2.50000000000000e-01 715 801 8.33333333333333e-02 715 960 -8.33333333333333e-02 715 842 8.33333333333333e-02 715 1091 -1.66666666666667e-01 715 1088 4.16666666666667e-02 715 841 -3.75000000000000e-01 715 985 -1.25000000000000e-01 715 714 -1.66666666666667e-01 715 840 8.33333333333333e-02 715 984 8.33333333333333e-02 716 716 1.25000000000000e+00 716 1087 4.16666666666667e-02 716 1079 -1.25000000000000e-01 716 1078 -4.16666666666667e-02 716 1077 8.33333333333333e-02 716 1092 -8.33333333333333e-02 716 1093 -8.33333333333333e-02 716 1084 8.33333333333333e-02 716 1083 -1.66666666666667e-01 716 985 -4.16666666666667e-02 716 961 4.16666666666667e-02 716 984 8.33333333333333e-02 716 714 -1.66666666666667e-01 716 1080 1.66666666666667e-01 716 803 -1.25000000000000e-01 716 1082 -7.50000000000000e-01 716 802 8.33333333333333e-02 716 715 -1.66666666666667e-01 716 1081 1.66666666666667e-01 716 801 -4.16666666666667e-02 716 960 4.16666666666667e-02 716 1086 4.16666666666667e-02 716 842 -1.25000000000000e-01 716 986 -1.25000000000000e-01 716 841 8.33333333333333e-02 716 1090 -1.66666666666667e-01 716 840 -4.16666666666667e-02 716 1089 8.33333333333333e-02 717 717 1.25000000000000e+00 717 1108 8.33333333333333e-02 717 1109 8.33333333333333e-02 717 1105 8.33333333333333e-02 717 1104 -1.25000000000000e-01 717 719 -1.66666666666667e-01 717 1079 8.33333333333333e-02 717 1078 8.33333333333333e-02 717 1077 -3.75000000000000e-01 717 1096 -8.33333333333333e-02 717 718 -1.66666666666667e-01 717 1100 8.33333333333333e-02 717 1111 -8.33333333333333e-02 717 1102 8.33333333333333e-02 717 1097 1.66666666666667e-01 717 1103 -1.66666666666667e-01 717 857 4.16666666666667e-02 717 1112 -8.33333333333333e-02 717 1099 8.33333333333333e-02 717 856 -8.33333333333333e-02 717 1098 -3.75000000000000e-01 717 1061 -4.16666666666667e-02 717 806 4.16666666666667e-02 717 1060 8.33333333333333e-02 717 805 -8.33333333333333e-02 717 1059 -1.25000000000000e-01 717 1106 -4.16666666666667e-02 717 1095 -2.50000000000000e-01 718 718 1.25000000000000e+00 718 1107 8.33333333333333e-02 718 1109 -1.66666666666667e-01 718 857 4.16666666666667e-02 718 1105 -3.75000000000000e-01 718 1104 8.33333333333333e-02 718 1079 -4.16666666666667e-02 718 806 4.16666666666667e-02 718 1078 -1.25000000000000e-01 718 1077 8.33333333333333e-02 718 1095 -8.33333333333333e-02 718 1100 -4.16666666666667e-02 718 717 -1.66666666666667e-01 718 1110 -8.33333333333333e-02 718 1101 8.33333333333333e-02 718 1112 -8.33333333333333e-02 718 1103 8.33333333333333e-02 718 1099 -1.25000000000000e-01 718 1098 8.33333333333333e-02 718 855 -8.33333333333333e-02 718 1061 8.33333333333333e-02 718 719 -1.66666666666667e-01 718 1097 1.66666666666667e-01 718 1060 -3.75000000000000e-01 718 1106 8.33333333333333e-02 718 1096 -2.50000000000000e-01 718 1059 8.33333333333333e-02 718 804 -8.33333333333333e-02 719 719 1.25000000000000e+00 719 1105 8.33333333333333e-02 719 1108 -1.66666666666667e-01 719 1107 8.33333333333333e-02 719 1106 -1.25000000000000e-01 719 856 4.16666666666667e-02 719 1079 -1.25000000000000e-01 719 1078 -4.16666666666667e-02 719 805 4.16666666666667e-02 719 717 -1.66666666666667e-01 719 1077 8.33333333333333e-02 719 1099 -4.16666666666667e-02 719 1098 8.33333333333333e-02 719 1111 -8.33333333333333e-02 719 1102 8.33333333333333e-02 719 1095 1.66666666666667e-01 719 1101 -1.66666666666667e-01 719 1100 -1.25000000000000e-01 719 855 4.16666666666667e-02 719 1110 -8.33333333333333e-02 719 1061 -1.25000000000000e-01 719 1104 -4.16666666666667e-02 719 1097 -7.50000000000000e-01 719 1060 8.33333333333333e-02 719 718 -1.66666666666667e-01 719 1096 1.66666666666667e-01 719 1059 -4.16666666666667e-02 719 804 4.16666666666667e-02 720 720 1.25000000000000e+00 720 1130 -8.33333333333333e-02 720 1123 4.16666666666667e-02 720 1129 -8.33333333333333e-02 720 1124 -8.33333333333333e-02 720 1115 8.33333333333333e-02 720 1114 8.33333333333333e-02 720 1120 -1.66666666666667e-01 720 1113 -3.75000000000000e-01 720 1127 8.33333333333333e-02 720 1118 -8.33333333333333e-02 720 721 -1.66666666666667e-01 720 1117 1.66666666666667e-01 720 1015 8.33333333333333e-02 720 809 8.33333333333333e-02 720 965 -8.33333333333333e-02 720 808 -4.16666666666667e-02 720 964 4.16666666666667e-02 720 807 -1.25000000000000e-01 720 1116 -2.50000000000000e-01 720 722 -1.66666666666667e-01 720 878 8.33333333333333e-02 720 1016 8.33333333333333e-02 720 877 -4.16666666666667e-02 720 1126 8.33333333333333e-02 720 1121 8.33333333333333e-02 720 876 -1.25000000000000e-01 720 1014 -3.75000000000000e-01 721 721 1.25000000000000e+00 721 1128 -8.33333333333333e-02 721 1124 4.16666666666667e-02 721 1130 -8.33333333333333e-02 721 1115 -4.16666666666667e-02 721 1121 8.33333333333333e-02 721 1114 -1.25000000000000e-01 721 1113 8.33333333333333e-02 721 1119 -1.66666666666667e-01 721 965 4.16666666666667e-02 721 1016 -4.16666666666667e-02 721 720 -1.66666666666667e-01 721 1116 1.66666666666667e-01 721 1014 8.33333333333333e-02 721 809 8.33333333333333e-02 721 722 -1.66666666666667e-01 721 1118 1.66666666666667e-01 721 808 -1.25000000000000e-01 721 1117 -7.50000000000000e-01 721 807 -4.16666666666667e-02 721 963 4.16666666666667e-02 721 878 8.33333333333333e-02 721 1127 -1.66666666666667e-01 721 1122 4.16666666666667e-02 721 877 -1.25000000000000e-01 721 1015 -1.25000000000000e-01 721 876 -4.16666666666667e-02 721 1125 8.33333333333333e-02 722 722 1.25000000000000e+00 722 1128 -8.33333333333333e-02 722 1123 4.16666666666667e-02 722 1129 -8.33333333333333e-02 722 1122 -8.33333333333333e-02 722 1115 -1.25000000000000e-01 722 1114 -4.16666666666667e-02 722 1120 8.33333333333333e-02 722 1113 8.33333333333333e-02 722 1125 8.33333333333333e-02 722 1116 -8.33333333333333e-02 722 964 4.16666666666667e-02 722 1015 -4.16666666666667e-02 722 809 -3.75000000000000e-01 722 1118 -2.50000000000000e-01 722 808 8.33333333333333e-02 722 721 -1.66666666666667e-01 722 1117 1.66666666666667e-01 722 807 8.33333333333333e-02 722 963 -8.33333333333333e-02 722 1119 8.33333333333333e-02 722 878 -3.75000000000000e-01 722 1016 -1.25000000000000e-01 722 877 8.33333333333333e-02 722 1126 -1.66666666666667e-01 722 720 -1.66666666666667e-01 722 876 8.33333333333333e-02 722 1014 8.33333333333333e-02 723 723 1.25000000000000e+00 723 1139 8.33333333333333e-02 723 1138 -1.66666666666667e-01 723 1136 8.33333333333333e-02 723 892 4.16666666666667e-02 723 1134 -3.75000000000000e-01 723 1064 8.33333333333333e-02 723 1063 -4.16666666666667e-02 723 811 4.16666666666667e-02 723 1062 -1.25000000000000e-01 723 1133 -8.33333333333333e-02 723 725 -1.66666666666667e-01 723 1141 -4.16666666666667e-02 723 1148 -8.33333333333333e-02 723 1145 8.33333333333333e-02 723 1147 -8.33333333333333e-02 723 1144 8.33333333333333e-02 723 1142 8.33333333333333e-02 723 893 -8.33333333333333e-02 723 1140 -1.25000000000000e-01 723 1115 8.33333333333333e-02 723 812 -8.33333333333333e-02 723 1114 8.33333333333333e-02 723 724 -1.66666666666667e-01 723 1132 1.66666666666667e-01 723 1113 -3.75000000000000e-01 723 1135 8.33333333333333e-02 723 1131 -2.50000000000000e-01 724 724 1.25000000000000e+00 724 1139 8.33333333333333e-02 724 1134 8.33333333333333e-02 724 1137 -1.66666666666667e-01 724 1135 -1.25000000000000e-01 724 891 4.16666666666667e-02 724 1064 8.33333333333333e-02 724 725 -1.66666666666667e-01 724 1063 -1.25000000000000e-01 724 1062 -4.16666666666667e-02 724 810 4.16666666666667e-02 724 1140 -4.16666666666667e-02 724 1142 8.33333333333333e-02 724 1133 1.66666666666667e-01 724 1145 -1.66666666666667e-01 724 1146 -8.33333333333333e-02 724 1143 8.33333333333333e-02 724 893 4.16666666666667e-02 724 1148 -8.33333333333333e-02 724 1141 -1.25000000000000e-01 724 1115 -4.16666666666667e-02 724 812 4.16666666666667e-02 724 1114 -1.25000000000000e-01 724 1136 -4.16666666666667e-02 724 1132 -7.50000000000000e-01 724 1113 8.33333333333333e-02 724 723 -1.66666666666667e-01 724 1131 1.66666666666667e-01 725 725 1.25000000000000e+00 725 1138 8.33333333333333e-02 725 1137 8.33333333333333e-02 725 1136 -1.25000000000000e-01 725 1134 8.33333333333333e-02 725 1064 -3.75000000000000e-01 725 1063 8.33333333333333e-02 725 724 -1.66666666666667e-01 725 1062 8.33333333333333e-02 725 1131 -8.33333333333333e-02 725 723 -1.66666666666667e-01 725 1141 8.33333333333333e-02 725 1146 -8.33333333333333e-02 725 1143 8.33333333333333e-02 725 1132 1.66666666666667e-01 725 1144 -1.66666666666667e-01 725 1142 -3.75000000000000e-01 725 892 4.16666666666667e-02 725 1147 -8.33333333333333e-02 725 1140 8.33333333333333e-02 725 891 -8.33333333333333e-02 725 1115 -1.25000000000000e-01 725 1135 -4.16666666666667e-02 725 1133 -2.50000000000000e-01 725 1114 -4.16666666666667e-02 725 811 4.16666666666667e-02 725 1113 8.33333333333333e-02 725 810 -8.33333333333333e-02 726 726 2.50000000000000e+00 726 1156 -1.66666666666667e-01 726 1151 1.66666666666667e-01 726 1163 -1.66666666666667e-01 726 1165 -8.33333333333333e-02 726 1162 8.33333333333333e-02 726 1166 -8.33333333333333e-02 726 1150 1.66666666666667e-01 726 1149 -7.50000000000000e-01 726 1082 1.66666666666667e-01 726 988 8.33333333333333e-02 726 1081 -8.33333333333333e-02 726 989 -1.66666666666667e-01 726 815 8.33333333333333e-02 726 1080 -2.50000000000000e-01 726 1154 -8.33333333333333e-02 726 911 8.33333333333333e-02 726 727 -3.33333333333333e-01 726 1153 1.66666666666667e-01 726 1152 -2.50000000000000e-01 726 1118 -8.33333333333333e-02 726 1117 1.66666666666667e-01 726 968 -8.33333333333333e-02 726 1019 8.33333333333333e-02 726 1042 1.66666666666667e-01 726 1018 -1.66666666666667e-01 726 814 8.33333333333333e-02 726 967 -8.33333333333333e-02 726 1116 -2.50000000000000e-01 726 728 -3.33333333333333e-01 726 1160 1.66666666666667e-01 726 1043 1.66666666666667e-01 726 1159 -8.33333333333333e-02 726 910 8.33333333333333e-02 726 1157 8.33333333333333e-02 726 1158 -2.50000000000000e-01 726 1041 -7.50000000000000e-01 727 727 2.50000000000000e+00 727 1155 -1.66666666666667e-01 727 1151 -8.33333333333333e-02 727 1166 -8.33333333333333e-02 727 1163 8.33333333333333e-02 727 1164 -8.33333333333333e-02 727 1161 8.33333333333333e-02 727 1150 -2.50000000000000e-01 727 1149 1.66666666666667e-01 727 987 8.33333333333333e-02 727 1080 -8.33333333333333e-02 727 989 8.33333333333333e-02 727 1082 1.66666666666667e-01 727 1081 -2.50000000000000e-01 727 1154 1.66666666666667e-01 727 1153 -7.50000000000000e-01 727 726 -3.33333333333333e-01 727 1152 1.66666666666667e-01 727 1043 -8.33333333333333e-02 727 728 -3.33333333333333e-01 727 968 -8.33333333333333e-02 727 1019 8.33333333333333e-02 727 1116 1.66666666666667e-01 727 1041 1.66666666666667e-01 727 1017 -1.66666666666667e-01 727 815 -1.66666666666667e-01 727 1118 1.66666666666667e-01 727 1117 -7.50000000000000e-01 727 813 8.33333333333333e-02 727 966 -8.33333333333333e-02 727 1160 1.66666666666667e-01 727 911 -1.66666666666667e-01 727 1157 8.33333333333333e-02 727 1159 -2.50000000000000e-01 727 1042 -2.50000000000000e-01 727 1158 -8.33333333333333e-02 727 909 8.33333333333333e-02 728 728 2.50000000000000e+00 728 1156 8.33333333333333e-02 728 1150 -8.33333333333333e-02 728 1165 -8.33333333333333e-02 728 1162 8.33333333333333e-02 728 1149 1.66666666666667e-01 728 1161 -1.66666666666667e-01 728 1164 -8.33333333333333e-02 728 1151 -2.50000000000000e-01 728 1080 1.66666666666667e-01 728 988 8.33333333333333e-02 728 987 -1.66666666666667e-01 728 1082 -7.50000000000000e-01 728 1081 1.66666666666667e-01 728 813 8.33333333333333e-02 728 1154 -2.50000000000000e-01 728 1153 1.66666666666667e-01 728 1152 -8.33333333333333e-02 728 909 8.33333333333333e-02 728 1042 -8.33333333333333e-02 728 727 -3.33333333333333e-01 728 1116 -8.33333333333333e-02 728 967 -8.33333333333333e-02 728 1018 8.33333333333333e-02 728 966 -8.33333333333333e-02 728 1017 8.33333333333333e-02 728 1118 -2.50000000000000e-01 728 814 -1.66666666666667e-01 728 1117 1.66666666666667e-01 728 1155 8.33333333333333e-02 728 1160 -7.50000000000000e-01 728 1043 -2.50000000000000e-01 728 1159 1.66666666666667e-01 728 910 -1.66666666666667e-01 728 726 -3.33333333333333e-01 728 1158 1.66666666666667e-01 728 1041 1.66666666666667e-01 729 729 2.50000000000000e+00 729 1171 1.66666666666667e-01 729 1170 -2.50000000000000e-01 729 1085 -1.66666666666667e-01 729 1084 8.33333333333333e-02 729 1151 1.66666666666667e-01 729 1183 8.33333333333333e-02 729 1150 1.66666666666667e-01 729 1149 -7.50000000000000e-01 729 1184 8.33333333333333e-02 729 1096 -8.33333333333333e-02 729 1097 1.66666666666667e-01 729 731 -3.33333333333333e-01 729 818 -8.33333333333333e-02 729 1095 -2.50000000000000e-01 729 1175 8.33333333333333e-02 729 932 -8.33333333333333e-02 729 1174 -1.66666666666667e-01 729 1067 8.33333333333333e-02 729 1168 1.66666666666667e-01 729 730 -3.33333333333333e-01 729 1169 1.66666666666667e-01 729 931 -8.33333333333333e-02 729 1167 -7.50000000000000e-01 729 1066 8.33333333333333e-02 729 817 -8.33333333333333e-02 729 1133 -8.33333333333333e-02 729 1121 8.33333333333333e-02 729 1180 8.33333333333333e-02 729 1177 -8.33333333333333e-02 729 1120 -1.66666666666667e-01 729 1132 1.66666666666667e-01 729 1131 -2.50000000000000e-01 729 1178 1.66666666666667e-01 729 1181 -1.66666666666667e-01 729 1176 -2.50000000000000e-01 729 1172 -8.33333333333333e-02 730 730 2.50000000000000e+00 730 1170 1.66666666666667e-01 730 1172 1.66666666666667e-01 730 1171 -7.50000000000000e-01 730 1083 8.33333333333333e-02 730 1151 -8.33333333333333e-02 730 1182 8.33333333333333e-02 730 1150 -2.50000000000000e-01 730 1149 1.66666666666667e-01 730 1184 -1.66666666666667e-01 730 1095 -8.33333333333333e-02 730 1175 8.33333333333333e-02 730 1097 1.66666666666667e-01 730 1096 -2.50000000000000e-01 730 1173 -1.66666666666667e-01 730 1169 -8.33333333333333e-02 730 1167 1.66666666666667e-01 730 729 -3.33333333333333e-01 730 1168 -2.50000000000000e-01 730 930 -8.33333333333333e-02 730 1067 -1.66666666666667e-01 730 1065 8.33333333333333e-02 730 816 -8.33333333333333e-02 730 1133 1.66666666666667e-01 730 731 -3.33333333333333e-01 730 1178 1.66666666666667e-01 730 1179 8.33333333333333e-02 730 1176 -8.33333333333333e-02 730 1121 8.33333333333333e-02 730 818 -8.33333333333333e-02 730 1132 -7.50000000000000e-01 730 1119 -1.66666666666667e-01 730 1131 1.66666666666667e-01 730 1181 8.33333333333333e-02 730 932 -8.33333333333333e-02 730 1177 -2.50000000000000e-01 730 1085 8.33333333333333e-02 731 731 2.50000000000000e+00 731 1084 8.33333333333333e-02 731 1172 -2.50000000000000e-01 731 1171 1.66666666666667e-01 731 1083 -1.66666666666667e-01 731 1150 -8.33333333333333e-02 731 1149 1.66666666666667e-01 731 1151 -2.50000000000000e-01 731 1183 -1.66666666666667e-01 731 1182 8.33333333333333e-02 731 1174 8.33333333333333e-02 731 1095 1.66666666666667e-01 731 729 -3.33333333333333e-01 731 1097 -7.50000000000000e-01 731 1096 1.66666666666667e-01 731 816 -8.33333333333333e-02 731 1173 8.33333333333333e-02 731 930 -8.33333333333333e-02 731 1168 -8.33333333333333e-02 731 1065 8.33333333333333e-02 731 1169 -2.50000000000000e-01 731 1167 1.66666666666667e-01 731 1066 -1.66666666666667e-01 731 1131 -8.33333333333333e-02 731 1119 8.33333333333333e-02 731 1132 1.66666666666667e-01 731 730 -3.33333333333333e-01 731 1177 1.66666666666667e-01 731 1133 -2.50000000000000e-01 731 1120 8.33333333333333e-02 731 817 -8.33333333333333e-02 731 1178 -7.50000000000000e-01 731 1170 -8.33333333333333e-02 731 1180 8.33333333333333e-02 731 931 -8.33333333333333e-02 731 1176 1.66666666666667e-01 731 1179 -1.66666666666667e-01 732 732 5.83333333333333e-01 732 734 -1.66666666666667e-01 732 1187 8.33333333333333e-02 732 1189 4.16666666666667e-02 732 1186 -4.16666666666667e-02 732 824 -4.16666666666667e-02 732 1070 4.16666666666667e-02 732 823 4.16666666666667e-02 732 1069 -8.33333333333333e-02 732 822 -4.16666666666667e-02 732 1185 -1.25000000000000e-01 732 860 -4.16666666666667e-02 732 1190 4.16666666666667e-02 732 733 -8.33333333333333e-02 732 859 4.16666666666667e-02 732 1099 8.33333333333333e-02 732 1100 8.33333333333333e-02 732 858 -4.16666666666667e-02 732 1098 -3.75000000000000e-01 733 733 5.00000000000000e-01 733 1070 4.16666666666667e-02 733 1188 4.16666666666667e-02 733 1185 -4.16666666666667e-02 733 824 4.16666666666667e-02 733 734 -8.33333333333333e-02 733 1187 8.33333333333333e-02 733 823 -1.25000000000000e-01 733 1186 -1.25000000000000e-01 733 822 4.16666666666667e-02 733 1068 -8.33333333333333e-02 733 860 4.16666666666667e-02 733 1190 -8.33333333333333e-02 733 1100 -4.16666666666667e-02 733 859 -1.25000000000000e-01 733 1099 -1.25000000000000e-01 733 732 -8.33333333333333e-02 733 858 4.16666666666667e-02 733 1098 8.33333333333333e-02 734 734 5.83333333333333e-01 734 1069 4.16666666666667e-02 734 1098 8.33333333333333e-02 734 732 -1.66666666666667e-01 734 1185 8.33333333333333e-02 734 824 -4.16666666666667e-02 734 1187 -3.75000000000000e-01 734 823 4.16666666666667e-02 734 733 -8.33333333333333e-02 734 1186 8.33333333333333e-02 734 822 -4.16666666666667e-02 734 1068 4.16666666666667e-02 734 1099 -4.16666666666667e-02 734 860 -4.16666666666667e-02 734 1100 -1.25000000000000e-01 734 859 4.16666666666667e-02 734 1189 -8.33333333333333e-02 734 858 -4.16666666666667e-02 734 1188 4.16666666666667e-02 735 735 5.83333333333333e-01 735 1193 -4.16666666666667e-02 735 736 -1.66666666666667e-01 735 1192 8.33333333333333e-02 735 1135 8.33333333333333e-02 735 827 4.16666666666667e-02 735 1073 -8.33333333333333e-02 735 826 -4.16666666666667e-02 735 1072 4.16666666666667e-02 735 825 -4.16666666666667e-02 735 1191 -1.25000000000000e-01 735 737 -8.33333333333333e-02 735 896 4.16666666666667e-02 735 1136 8.33333333333333e-02 735 895 -4.16666666666667e-02 735 1195 4.16666666666667e-02 735 1196 4.16666666666667e-02 735 894 -4.16666666666667e-02 735 1134 -3.75000000000000e-01 736 736 5.83333333333333e-01 736 1136 -4.16666666666667e-02 736 735 -1.66666666666667e-01 736 1191 8.33333333333333e-02 736 1134 8.33333333333333e-02 736 827 4.16666666666667e-02 736 737 -8.33333333333333e-02 736 1193 8.33333333333333e-02 736 826 -4.16666666666667e-02 736 1192 -3.75000000000000e-01 736 825 -4.16666666666667e-02 736 1071 4.16666666666667e-02 736 896 4.16666666666667e-02 736 1196 -8.33333333333333e-02 736 1073 4.16666666666667e-02 736 895 -4.16666666666667e-02 736 1135 -1.25000000000000e-01 736 894 -4.16666666666667e-02 736 1194 4.16666666666667e-02 737 737 5.00000000000000e-01 737 1191 -4.16666666666667e-02 737 1072 4.16666666666667e-02 737 1135 -4.16666666666667e-02 737 827 -1.25000000000000e-01 737 1193 -1.25000000000000e-01 737 826 4.16666666666667e-02 737 736 -8.33333333333333e-02 737 1192 8.33333333333333e-02 737 825 4.16666666666667e-02 737 1071 -8.33333333333333e-02 737 1194 4.16666666666667e-02 737 896 -1.25000000000000e-01 737 1136 -1.25000000000000e-01 737 895 4.16666666666667e-02 737 1195 -8.33333333333333e-02 737 735 -8.33333333333333e-02 737 894 4.16666666666667e-02 737 1134 8.33333333333333e-02 738 738 1.25000000000000e+00 738 1102 8.33333333333333e-02 738 1186 -4.16666666666667e-02 738 1103 -1.66666666666667e-01 738 830 4.16666666666667e-02 738 1185 -1.25000000000000e-01 738 1199 -4.16666666666667e-02 738 935 4.16666666666667e-02 738 739 -1.66666666666667e-01 738 1198 8.33333333333333e-02 738 1197 -1.25000000000000e-01 738 1193 -4.16666666666667e-02 738 1192 8.33333333333333e-02 738 1076 -8.33333333333333e-02 738 1139 8.33333333333333e-02 738 1168 1.66666666666667e-01 738 1138 -1.66666666666667e-01 738 829 4.16666666666667e-02 738 1075 -8.33333333333333e-02 738 1191 -1.25000000000000e-01 738 740 -1.66666666666667e-01 738 1202 8.33333333333333e-02 738 1169 1.66666666666667e-01 738 1201 -4.16666666666667e-02 738 934 4.16666666666667e-02 738 1187 8.33333333333333e-02 738 1200 -1.25000000000000e-01 738 1167 -7.50000000000000e-01 739 739 1.25000000000000e+00 739 1185 -4.16666666666667e-02 739 1103 8.33333333333333e-02 739 1187 8.33333333333333e-02 739 1186 -1.25000000000000e-01 739 1199 8.33333333333333e-02 739 1198 -3.75000000000000e-01 739 738 -1.66666666666667e-01 739 1197 8.33333333333333e-02 739 1169 -8.33333333333333e-02 739 740 -1.66666666666667e-01 739 1076 -8.33333333333333e-02 739 1139 8.33333333333333e-02 739 1191 8.33333333333333e-02 739 1167 1.66666666666667e-01 739 1137 -1.66666666666667e-01 739 830 -8.33333333333333e-02 739 1193 8.33333333333333e-02 739 1192 -3.75000000000000e-01 739 828 4.16666666666667e-02 739 1074 -8.33333333333333e-02 739 1202 8.33333333333333e-02 739 935 -8.33333333333333e-02 739 1101 8.33333333333333e-02 739 1201 -1.25000000000000e-01 739 1168 -2.50000000000000e-01 739 1200 -4.16666666666667e-02 739 933 4.16666666666667e-02 740 740 1.25000000000000e+00 740 1102 8.33333333333333e-02 740 1101 -1.66666666666667e-01 740 1187 -3.75000000000000e-01 740 1186 8.33333333333333e-02 740 828 4.16666666666667e-02 740 1199 -1.25000000000000e-01 740 1198 8.33333333333333e-02 740 1197 -4.16666666666667e-02 740 933 4.16666666666667e-02 740 1168 -8.33333333333333e-02 740 739 -1.66666666666667e-01 740 1191 -4.16666666666667e-02 740 1075 -8.33333333333333e-02 740 1138 8.33333333333333e-02 740 1074 -8.33333333333333e-02 740 1137 8.33333333333333e-02 740 1193 -1.25000000000000e-01 740 829 -8.33333333333333e-02 740 1192 8.33333333333333e-02 740 1185 8.33333333333333e-02 740 1202 -3.75000000000000e-01 740 1169 -2.50000000000000e-01 740 1201 8.33333333333333e-02 740 934 -8.33333333333333e-02 740 738 -1.66666666666667e-01 740 1200 8.33333333333333e-02 740 1167 1.66666666666667e-01 741 741 5.00000000000000e-01 741 992 -4.16666666666667e-02 741 1207 4.16666666666667e-02 741 1204 -4.16666666666667e-02 741 845 4.16666666666667e-02 741 1208 -8.33333333333333e-02 741 844 4.16666666666667e-02 741 742 -8.33333333333333e-02 741 991 8.33333333333333e-02 741 843 -1.25000000000000e-01 741 990 -1.25000000000000e-01 741 743 -8.33333333333333e-02 741 833 4.16666666666667e-02 741 1205 8.33333333333333e-02 741 832 4.16666666666667e-02 741 976 -8.33333333333333e-02 741 977 4.16666666666667e-02 741 831 -1.25000000000000e-01 741 1203 -1.25000000000000e-01 742 742 5.83333333333333e-01 742 992 8.33333333333333e-02 742 1205 8.33333333333333e-02 742 1206 4.16666666666667e-02 742 1203 -4.16666666666667e-02 742 845 -4.16666666666667e-02 742 1208 4.16666666666667e-02 742 844 -4.16666666666667e-02 742 991 -3.75000000000000e-01 742 843 4.16666666666667e-02 742 741 -8.33333333333333e-02 742 990 8.33333333333333e-02 742 833 -4.16666666666667e-02 742 977 4.16666666666667e-02 742 743 -1.66666666666667e-01 742 832 -4.16666666666667e-02 742 1204 -1.25000000000000e-01 742 831 4.16666666666667e-02 742 975 -8.33333333333333e-02 743 743 5.83333333333333e-01 743 990 -4.16666666666667e-02 743 742 -1.66666666666667e-01 743 991 8.33333333333333e-02 743 1204 8.33333333333333e-02 743 845 -4.16666666666667e-02 743 992 -1.25000000000000e-01 743 844 -4.16666666666667e-02 743 1207 4.16666666666667e-02 743 843 4.16666666666667e-02 743 1206 -8.33333333333333e-02 743 975 4.16666666666667e-02 743 833 -4.16666666666667e-02 743 1205 -3.75000000000000e-01 743 832 -4.16666666666667e-02 743 976 4.16666666666667e-02 743 741 -8.33333333333333e-02 743 831 4.16666666666667e-02 743 1203 8.33333333333333e-02 744 744 1.25000000000000e+00 744 994 8.33333333333333e-02 744 995 8.33333333333333e-02 744 1205 8.33333333333333e-02 744 1203 -1.25000000000000e-01 744 1217 8.33333333333333e-02 744 1216 8.33333333333333e-02 744 745 -1.66666666666667e-01 744 1215 -3.75000000000000e-01 744 1046 -8.33333333333333e-02 744 746 -1.66666666666667e-01 744 980 -8.33333333333333e-02 744 1034 8.33333333333333e-02 744 1210 8.33333333333333e-02 744 1045 1.66666666666667e-01 744 1033 -1.66666666666667e-01 744 1211 8.33333333333333e-02 744 836 -8.33333333333333e-02 744 835 4.16666666666667e-02 744 979 -8.33333333333333e-02 744 1209 -3.75000000000000e-01 744 1220 8.33333333333333e-02 744 914 -8.33333333333333e-02 744 1219 -4.16666666666667e-02 744 913 4.16666666666667e-02 744 1218 -1.25000000000000e-01 744 1204 -4.16666666666667e-02 744 1044 -2.50000000000000e-01 745 745 1.25000000000000e+00 745 1203 -4.16666666666667e-02 745 993 8.33333333333333e-02 745 995 -1.66666666666667e-01 745 836 4.16666666666667e-02 745 1204 -1.25000000000000e-01 745 1217 -4.16666666666667e-02 745 914 4.16666666666667e-02 745 1216 -1.25000000000000e-01 745 1215 8.33333333333333e-02 745 744 -1.66666666666667e-01 745 1211 -4.16666666666667e-02 745 1209 8.33333333333333e-02 745 980 -8.33333333333333e-02 745 1034 8.33333333333333e-02 745 1044 1.66666666666667e-01 745 1032 -1.66666666666667e-01 745 1210 -1.25000000000000e-01 745 834 4.16666666666667e-02 745 978 -8.33333333333333e-02 745 1220 8.33333333333333e-02 745 746 -1.66666666666667e-01 745 1046 1.66666666666667e-01 745 1219 -1.25000000000000e-01 745 1205 8.33333333333333e-02 745 1045 -7.50000000000000e-01 745 1218 -4.16666666666667e-02 745 912 4.16666666666667e-02 746 746 1.25000000000000e+00 746 994 -1.66666666666667e-01 746 993 8.33333333333333e-02 746 1205 -3.75000000000000e-01 746 835 4.16666666666667e-02 746 1203 8.33333333333333e-02 746 1217 -1.25000000000000e-01 746 1216 -4.16666666666667e-02 746 913 4.16666666666667e-02 746 1215 8.33333333333333e-02 746 1044 -8.33333333333333e-02 746 1210 -4.16666666666667e-02 746 744 -1.66666666666667e-01 746 978 -8.33333333333333e-02 746 1032 8.33333333333333e-02 746 979 -8.33333333333333e-02 746 1033 8.33333333333333e-02 746 1211 -1.25000000000000e-01 746 1209 8.33333333333333e-02 746 834 -8.33333333333333e-02 746 1220 -3.75000000000000e-01 746 1204 8.33333333333333e-02 746 1046 -2.50000000000000e-01 746 1219 8.33333333333333e-02 746 745 -1.66666666666667e-01 746 1045 1.66666666666667e-01 746 1218 8.33333333333333e-02 746 912 -8.33333333333333e-02 747 747 5.00000000000000e-01 747 1106 -4.16666666666667e-02 747 1225 4.16666666666667e-02 747 1222 -4.16666666666667e-02 747 863 4.16666666666667e-02 747 1226 -8.33333333333333e-02 747 862 4.16666666666667e-02 747 748 -8.33333333333333e-02 747 1105 8.33333333333333e-02 747 861 -1.25000000000000e-01 747 1104 -1.25000000000000e-01 747 749 -8.33333333333333e-02 747 848 4.16666666666667e-02 747 1223 8.33333333333333e-02 747 847 4.16666666666667e-02 747 1087 -8.33333333333333e-02 747 1088 4.16666666666667e-02 747 846 -1.25000000000000e-01 747 1221 -1.25000000000000e-01 748 748 5.83333333333333e-01 748 1106 8.33333333333333e-02 748 1223 8.33333333333333e-02 748 1224 4.16666666666667e-02 748 1221 -4.16666666666667e-02 748 863 -4.16666666666667e-02 748 1226 4.16666666666667e-02 748 862 -4.16666666666667e-02 748 1105 -3.75000000000000e-01 748 861 4.16666666666667e-02 748 747 -8.33333333333333e-02 748 1104 8.33333333333333e-02 748 848 -4.16666666666667e-02 748 1088 4.16666666666667e-02 748 749 -1.66666666666667e-01 748 847 -4.16666666666667e-02 748 1222 -1.25000000000000e-01 748 846 4.16666666666667e-02 748 1086 -8.33333333333333e-02 749 749 5.83333333333333e-01 749 1104 -4.16666666666667e-02 749 748 -1.66666666666667e-01 749 1105 8.33333333333333e-02 749 1222 8.33333333333333e-02 749 863 -4.16666666666667e-02 749 1106 -1.25000000000000e-01 749 862 -4.16666666666667e-02 749 1225 4.16666666666667e-02 749 861 4.16666666666667e-02 749 1224 -8.33333333333333e-02 749 1086 4.16666666666667e-02 749 848 -4.16666666666667e-02 749 1223 -3.75000000000000e-01 749 847 -4.16666666666667e-02 749 1087 4.16666666666667e-02 749 747 -8.33333333333333e-02 749 846 4.16666666666667e-02 749 1221 8.33333333333333e-02 750 750 1.25000000000000e+00 750 751 -1.66666666666667e-01 750 1232 -8.33333333333333e-02 750 916 -4.16666666666667e-02 750 1231 4.16666666666667e-02 750 1229 8.33333333333333e-02 750 850 -4.16666666666667e-02 750 1227 -3.75000000000000e-01 750 1207 4.16666666666667e-02 750 851 8.33333333333333e-02 750 1208 -8.33333333333333e-02 750 752 -1.66666666666667e-01 750 1217 8.33333333333333e-02 750 917 8.33333333333333e-02 750 1216 8.33333333333333e-02 750 1215 -3.75000000000000e-01 750 997 -8.33333333333333e-02 750 1090 8.33333333333333e-02 750 1091 8.33333333333333e-02 750 998 -8.33333333333333e-02 750 849 -1.25000000000000e-01 750 1154 -8.33333333333333e-02 750 1049 8.33333333333333e-02 750 1153 1.66666666666667e-01 750 1048 -1.66666666666667e-01 750 1152 -2.50000000000000e-01 750 1228 8.33333333333333e-02 750 915 -1.25000000000000e-01 751 751 1.25000000000000e+00 751 1232 4.16666666666667e-02 751 1227 8.33333333333333e-02 751 750 -1.66666666666667e-01 751 915 -4.16666666666667e-02 751 1230 4.16666666666667e-02 751 1228 -1.25000000000000e-01 751 849 -4.16666666666667e-02 751 1206 4.16666666666667e-02 751 1208 4.16666666666667e-02 751 1217 -4.16666666666667e-02 751 1216 -1.25000000000000e-01 751 1215 8.33333333333333e-02 751 996 -8.33333333333333e-02 751 1089 8.33333333333333e-02 751 998 -8.33333333333333e-02 751 1049 8.33333333333333e-02 751 1091 -1.66666666666667e-01 751 851 8.33333333333333e-02 751 850 -1.25000000000000e-01 751 1154 1.66666666666667e-01 751 752 -1.66666666666667e-01 751 917 8.33333333333333e-02 751 1153 -7.50000000000000e-01 751 1229 -4.16666666666667e-02 751 916 -1.25000000000000e-01 751 1152 1.66666666666667e-01 751 1047 -1.66666666666667e-01 752 752 1.25000000000000e+00 752 1231 4.16666666666667e-02 752 1230 -8.33333333333333e-02 752 1229 -1.25000000000000e-01 752 1227 8.33333333333333e-02 752 1207 4.16666666666667e-02 752 849 8.33333333333333e-02 752 1206 -8.33333333333333e-02 752 1217 -1.25000000000000e-01 752 1216 -4.16666666666667e-02 752 750 -1.66666666666667e-01 752 1215 8.33333333333333e-02 752 915 8.33333333333333e-02 752 997 -8.33333333333333e-02 752 1048 8.33333333333333e-02 752 851 -3.75000000000000e-01 752 1090 -1.66666666666667e-01 752 850 8.33333333333333e-02 752 1089 8.33333333333333e-02 752 996 -8.33333333333333e-02 752 1154 -2.50000000000000e-01 752 1228 -4.16666666666667e-02 752 917 -3.75000000000000e-01 752 1153 1.66666666666667e-01 752 751 -1.66666666666667e-01 752 916 8.33333333333333e-02 752 1152 -8.33333333333333e-02 752 1047 8.33333333333333e-02 753 753 1.25000000000000e+00 753 1108 8.33333333333333e-02 753 1109 8.33333333333333e-02 753 1223 8.33333333333333e-02 753 1221 -1.25000000000000e-01 753 1235 8.33333333333333e-02 753 1234 8.33333333333333e-02 753 754 -1.66666666666667e-01 753 1233 -3.75000000000000e-01 753 1172 -8.33333333333333e-02 753 755 -1.66666666666667e-01 753 1094 -8.33333333333333e-02 753 1157 8.33333333333333e-02 753 1228 8.33333333333333e-02 753 1171 1.66666666666667e-01 753 1156 -1.66666666666667e-01 753 1229 8.33333333333333e-02 753 854 -8.33333333333333e-02 753 853 4.16666666666667e-02 753 1093 -8.33333333333333e-02 753 1227 -3.75000000000000e-01 753 1238 8.33333333333333e-02 753 938 -8.33333333333333e-02 753 1237 -4.16666666666667e-02 753 937 4.16666666666667e-02 753 1236 -1.25000000000000e-01 753 1222 -4.16666666666667e-02 753 1170 -2.50000000000000e-01 754 754 1.25000000000000e+00 754 1221 -4.16666666666667e-02 754 1107 8.33333333333333e-02 754 1109 -1.66666666666667e-01 754 854 4.16666666666667e-02 754 1222 -1.25000000000000e-01 754 1235 -4.16666666666667e-02 754 938 4.16666666666667e-02 754 1234 -1.25000000000000e-01 754 1233 8.33333333333333e-02 754 753 -1.66666666666667e-01 754 1229 -4.16666666666667e-02 754 1227 8.33333333333333e-02 754 1094 -8.33333333333333e-02 754 1157 8.33333333333333e-02 754 1170 1.66666666666667e-01 754 1155 -1.66666666666667e-01 754 1228 -1.25000000000000e-01 754 852 4.16666666666667e-02 754 1092 -8.33333333333333e-02 754 1238 8.33333333333333e-02 754 755 -1.66666666666667e-01 754 1172 1.66666666666667e-01 754 1237 -1.25000000000000e-01 754 1223 8.33333333333333e-02 754 1171 -7.50000000000000e-01 754 1236 -4.16666666666667e-02 754 936 4.16666666666667e-02 755 755 1.25000000000000e+00 755 1108 -1.66666666666667e-01 755 1107 8.33333333333333e-02 755 1223 -3.75000000000000e-01 755 853 4.16666666666667e-02 755 1221 8.33333333333333e-02 755 1235 -1.25000000000000e-01 755 1234 -4.16666666666667e-02 755 937 4.16666666666667e-02 755 1233 8.33333333333333e-02 755 1170 -8.33333333333333e-02 755 1228 -4.16666666666667e-02 755 753 -1.66666666666667e-01 755 1092 -8.33333333333333e-02 755 1155 8.33333333333333e-02 755 1093 -8.33333333333333e-02 755 1156 8.33333333333333e-02 755 1229 -1.25000000000000e-01 755 1227 8.33333333333333e-02 755 852 -8.33333333333333e-02 755 1238 -3.75000000000000e-01 755 1222 8.33333333333333e-02 755 1172 -2.50000000000000e-01 755 1237 8.33333333333333e-02 755 754 -1.66666666666667e-01 755 1171 1.66666666666667e-01 755 1236 8.33333333333333e-02 755 936 -8.33333333333333e-02 756 756 6.66666666666667e-01 756 866 4.16666666666667e-02 756 1226 -8.33333333333333e-02 756 758 -8.33333333333333e-02 756 1235 8.33333333333333e-02 756 941 4.16666666666667e-02 756 1234 8.33333333333333e-02 756 1233 -3.75000000000000e-01 756 1111 -8.33333333333333e-02 756 1189 4.16666666666667e-02 756 1190 4.16666666666667e-02 756 1112 -8.33333333333333e-02 756 864 -8.33333333333333e-02 756 1199 -4.16666666666667e-02 756 1175 8.33333333333333e-02 756 1198 8.33333333333333e-02 756 1174 -1.66666666666667e-01 756 1197 -1.25000000000000e-01 756 1225 4.16666666666667e-02 756 939 -8.33333333333333e-02 757 757 6.66666666666667e-01 757 1226 4.16666666666667e-02 757 1235 -4.16666666666667e-02 757 1234 -1.25000000000000e-01 757 1233 8.33333333333333e-02 757 1110 -8.33333333333333e-02 757 1188 4.16666666666667e-02 757 1112 -8.33333333333333e-02 757 1175 8.33333333333333e-02 757 1190 -8.33333333333333e-02 757 866 4.16666666666667e-02 757 865 -8.33333333333333e-02 757 1199 8.33333333333333e-02 757 758 -8.33333333333333e-02 757 941 4.16666666666667e-02 757 1198 -3.75000000000000e-01 757 1224 4.16666666666667e-02 757 940 -8.33333333333333e-02 757 1197 8.33333333333333e-02 757 1173 -1.66666666666667e-01 758 758 7.50000000000000e-01 758 864 4.16666666666667e-02 758 1224 -8.33333333333333e-02 758 1235 -1.25000000000000e-01 758 1234 -4.16666666666667e-02 758 756 -8.33333333333333e-02 758 1233 8.33333333333333e-02 758 939 4.16666666666667e-02 758 1111 -8.33333333333333e-02 758 1174 8.33333333333333e-02 758 866 -2.50000000000000e-01 758 1189 -8.33333333333333e-02 758 865 4.16666666666667e-02 758 1188 4.16666666666667e-02 758 1110 -8.33333333333333e-02 758 1199 -1.25000000000000e-01 758 1225 4.16666666666667e-02 758 941 -2.50000000000000e-01 758 1198 8.33333333333333e-02 758 757 -8.33333333333333e-02 758 940 4.16666666666667e-02 758 1197 -4.16666666666667e-02 758 1173 8.33333333333333e-02 759 759 5.00000000000000e-01 759 1006 4.16666666666667e-02 759 1244 4.16666666666667e-02 759 1241 -4.16666666666667e-02 759 869 4.16666666666667e-02 759 1007 -8.33333333333333e-02 759 868 4.16666666666667e-02 759 760 -8.33333333333333e-02 759 1240 8.33333333333333e-02 759 867 -1.25000000000000e-01 759 1239 -1.25000000000000e-01 759 761 -8.33333333333333e-02 759 881 4.16666666666667e-02 759 1022 8.33333333333333e-02 759 880 4.16666666666667e-02 759 1243 -8.33333333333333e-02 759 1021 -4.16666666666667e-02 759 879 -1.25000000000000e-01 759 1020 -1.25000000000000e-01 760 760 5.83333333333333e-01 760 1005 4.16666666666667e-02 760 1022 8.33333333333333e-02 760 761 -1.66666666666667e-01 760 1241 8.33333333333333e-02 760 869 -4.16666666666667e-02 760 1007 4.16666666666667e-02 760 868 -4.16666666666667e-02 760 1240 -3.75000000000000e-01 760 867 4.16666666666667e-02 760 759 -8.33333333333333e-02 760 1239 8.33333333333333e-02 760 881 -4.16666666666667e-02 760 1244 4.16666666666667e-02 760 1020 -4.16666666666667e-02 760 880 -4.16666666666667e-02 760 1021 -1.25000000000000e-01 760 879 4.16666666666667e-02 760 1242 -8.33333333333333e-02 761 761 5.83333333333333e-01 761 760 -1.66666666666667e-01 761 1240 8.33333333333333e-02 761 1242 4.16666666666667e-02 761 1239 -4.16666666666667e-02 761 869 -4.16666666666667e-02 761 1241 -1.25000000000000e-01 761 868 -4.16666666666667e-02 761 1006 4.16666666666667e-02 761 867 4.16666666666667e-02 761 1005 -8.33333333333333e-02 761 1021 8.33333333333333e-02 761 881 -4.16666666666667e-02 761 1022 -3.75000000000000e-01 761 880 -4.16666666666667e-02 761 1243 4.16666666666667e-02 761 759 -8.33333333333333e-02 761 879 4.16666666666667e-02 761 1020 8.33333333333333e-02 762 762 1.25000000000000e+00 762 1037 -1.66666666666667e-01 762 1036 8.33333333333333e-02 762 872 4.16666666666667e-02 762 1246 8.33333333333333e-02 762 1245 -3.75000000000000e-01 762 1256 -4.16666666666667e-02 762 920 4.16666666666667e-02 762 1255 8.33333333333333e-02 762 1254 -1.25000000000000e-01 762 1010 -8.33333333333333e-02 762 1009 -8.33333333333333e-02 762 1025 8.33333333333333e-02 762 1241 -4.16666666666667e-02 762 763 -1.66666666666667e-01 762 1024 8.33333333333333e-02 762 1051 -8.33333333333333e-02 762 871 -8.33333333333333e-02 762 1240 8.33333333333333e-02 762 1239 -1.25000000000000e-01 762 764 -1.66666666666667e-01 762 1253 8.33333333333333e-02 762 1052 1.66666666666667e-01 762 1252 8.33333333333333e-02 762 919 -8.33333333333333e-02 762 1247 8.33333333333333e-02 762 1251 -3.75000000000000e-01 762 1050 -2.50000000000000e-01 763 763 1.25000000000000e+00 763 1037 8.33333333333333e-02 763 1035 8.33333333333333e-02 763 1246 -1.25000000000000e-01 763 1245 8.33333333333333e-02 763 1256 8.33333333333333e-02 763 764 -1.66666666666667e-01 763 1255 -3.75000000000000e-01 763 1254 8.33333333333333e-02 763 1008 -8.33333333333333e-02 763 1241 8.33333333333333e-02 763 762 -1.66666666666667e-01 763 1025 -1.66666666666667e-01 763 1052 1.66666666666667e-01 763 1023 8.33333333333333e-02 763 1050 -8.33333333333333e-02 763 872 4.16666666666667e-02 763 1010 -8.33333333333333e-02 763 1240 -3.75000000000000e-01 763 870 -8.33333333333333e-02 763 1239 8.33333333333333e-02 763 1253 -4.16666666666667e-02 763 920 4.16666666666667e-02 763 1247 -4.16666666666667e-02 763 1252 -1.25000000000000e-01 763 1051 -2.50000000000000e-01 763 1251 8.33333333333333e-02 763 918 -8.33333333333333e-02 764 764 1.25000000000000e+00 764 1036 8.33333333333333e-02 764 1245 8.33333333333333e-02 764 1035 -1.66666666666667e-01 764 1247 -1.25000000000000e-01 764 870 4.16666666666667e-02 764 1256 -1.25000000000000e-01 764 1255 8.33333333333333e-02 764 763 -1.66666666666667e-01 764 1254 -4.16666666666667e-02 764 918 4.16666666666667e-02 764 1008 -8.33333333333333e-02 764 1240 8.33333333333333e-02 764 1023 8.33333333333333e-02 764 1239 -4.16666666666667e-02 764 1024 -1.66666666666667e-01 764 1051 1.66666666666667e-01 764 1241 -1.25000000000000e-01 764 871 4.16666666666667e-02 764 1009 -8.33333333333333e-02 764 1246 -4.16666666666667e-02 764 1253 -1.25000000000000e-01 764 1052 -7.50000000000000e-01 764 1252 -4.16666666666667e-02 764 919 4.16666666666667e-02 764 762 -1.66666666666667e-01 764 1251 8.33333333333333e-02 764 1050 1.66666666666667e-01 765 765 5.00000000000000e-01 765 1123 4.16666666666667e-02 765 1262 4.16666666666667e-02 765 1259 -4.16666666666667e-02 765 884 4.16666666666667e-02 765 1124 -8.33333333333333e-02 765 883 4.16666666666667e-02 765 766 -8.33333333333333e-02 765 1258 8.33333333333333e-02 765 882 -1.25000000000000e-01 765 1257 -1.25000000000000e-01 765 767 -8.33333333333333e-02 765 899 4.16666666666667e-02 765 1142 8.33333333333333e-02 765 898 4.16666666666667e-02 765 1261 -8.33333333333333e-02 765 1141 -4.16666666666667e-02 765 897 -1.25000000000000e-01 765 1140 -1.25000000000000e-01 766 766 5.83333333333333e-01 766 1122 4.16666666666667e-02 766 1142 8.33333333333333e-02 766 767 -1.66666666666667e-01 766 1259 8.33333333333333e-02 766 884 -4.16666666666667e-02 766 1124 4.16666666666667e-02 766 883 -4.16666666666667e-02 766 1258 -3.75000000000000e-01 766 882 4.16666666666667e-02 766 765 -8.33333333333333e-02 766 1257 8.33333333333333e-02 766 899 -4.16666666666667e-02 766 1262 4.16666666666667e-02 766 1140 -4.16666666666667e-02 766 898 -4.16666666666667e-02 766 1141 -1.25000000000000e-01 766 897 4.16666666666667e-02 766 1260 -8.33333333333333e-02 767 767 5.83333333333333e-01 767 766 -1.66666666666667e-01 767 1258 8.33333333333333e-02 767 1260 4.16666666666667e-02 767 1257 -4.16666666666667e-02 767 884 -4.16666666666667e-02 767 1259 -1.25000000000000e-01 767 883 -4.16666666666667e-02 767 1123 4.16666666666667e-02 767 882 4.16666666666667e-02 767 1122 -8.33333333333333e-02 767 1141 8.33333333333333e-02 767 899 -4.16666666666667e-02 767 1142 -3.75000000000000e-01 767 898 -4.16666666666667e-02 767 1261 4.16666666666667e-02 767 765 -8.33333333333333e-02 767 897 4.16666666666667e-02 767 1140 8.33333333333333e-02 768 768 1.25000000000000e+00 768 1265 8.33333333333333e-02 768 923 -4.16666666666667e-02 768 1268 4.16666666666667e-02 768 1267 -8.33333333333333e-02 768 887 -4.16666666666667e-02 768 1264 8.33333333333333e-02 768 1263 -3.75000000000000e-01 768 1127 8.33333333333333e-02 768 1126 8.33333333333333e-02 768 1160 1.66666666666667e-01 768 1159 -8.33333333333333e-02 768 1158 -2.50000000000000e-01 768 1028 -8.33333333333333e-02 768 1244 4.16666666666667e-02 768 1027 -8.33333333333333e-02 768 1054 8.33333333333333e-02 768 1243 -8.33333333333333e-02 768 886 8.33333333333333e-02 768 885 -1.25000000000000e-01 768 1253 8.33333333333333e-02 768 1055 -1.66666666666667e-01 768 1252 8.33333333333333e-02 768 769 -1.66666666666667e-01 768 922 8.33333333333333e-02 768 1251 -3.75000000000000e-01 768 770 -1.66666666666667e-01 768 921 -1.25000000000000e-01 769 769 1.25000000000000e+00 769 1265 -4.16666666666667e-02 769 1266 -8.33333333333333e-02 769 1264 -1.25000000000000e-01 769 1263 8.33333333333333e-02 769 1127 -1.66666666666667e-01 769 887 8.33333333333333e-02 769 1125 8.33333333333333e-02 769 1160 1.66666666666667e-01 769 770 -1.66666666666667e-01 769 923 8.33333333333333e-02 769 1159 -2.50000000000000e-01 769 1158 -8.33333333333333e-02 769 1026 -8.33333333333333e-02 769 1053 8.33333333333333e-02 769 1244 4.16666666666667e-02 769 1028 -8.33333333333333e-02 769 886 -3.75000000000000e-01 769 1242 -8.33333333333333e-02 769 885 8.33333333333333e-02 769 1253 -4.16666666666667e-02 769 1055 8.33333333333333e-02 769 1252 -1.25000000000000e-01 769 1268 4.16666666666667e-02 769 922 -3.75000000000000e-01 769 1251 8.33333333333333e-02 769 768 -1.66666666666667e-01 769 921 8.33333333333333e-02 770 770 1.25000000000000e+00 770 1264 -4.16666666666667e-02 770 768 -1.66666666666667e-01 770 1263 8.33333333333333e-02 770 921 -4.16666666666667e-02 770 1266 4.16666666666667e-02 770 1265 -1.25000000000000e-01 770 885 -4.16666666666667e-02 770 1125 8.33333333333333e-02 770 1126 -1.66666666666667e-01 770 886 8.33333333333333e-02 770 1160 -7.50000000000000e-01 770 1159 1.66666666666667e-01 770 769 -1.66666666666667e-01 770 922 8.33333333333333e-02 770 1158 1.66666666666667e-01 770 1026 -8.33333333333333e-02 770 1242 4.16666666666667e-02 770 887 -1.25000000000000e-01 770 1243 4.16666666666667e-02 770 1027 -8.33333333333333e-02 770 1253 -1.25000000000000e-01 770 1267 4.16666666666667e-02 770 923 -1.25000000000000e-01 770 1252 -4.16666666666667e-02 770 1054 8.33333333333333e-02 770 1251 8.33333333333333e-02 770 1053 -1.66666666666667e-01 771 771 1.25000000000000e+00 771 1163 -1.66666666666667e-01 771 1162 8.33333333333333e-02 771 890 4.16666666666667e-02 771 1264 8.33333333333333e-02 771 1263 -3.75000000000000e-01 771 1274 -4.16666666666667e-02 771 944 4.16666666666667e-02 771 1273 8.33333333333333e-02 771 1272 -1.25000000000000e-01 771 1130 -8.33333333333333e-02 771 1129 -8.33333333333333e-02 771 1145 8.33333333333333e-02 771 1259 -4.16666666666667e-02 771 772 -1.66666666666667e-01 771 1144 8.33333333333333e-02 771 1177 -8.33333333333333e-02 771 889 -8.33333333333333e-02 771 1258 8.33333333333333e-02 771 1257 -1.25000000000000e-01 771 773 -1.66666666666667e-01 771 1271 8.33333333333333e-02 771 1178 1.66666666666667e-01 771 1270 8.33333333333333e-02 771 943 -8.33333333333333e-02 771 1265 8.33333333333333e-02 771 1269 -3.75000000000000e-01 771 1176 -2.50000000000000e-01 772 772 1.25000000000000e+00 772 1163 8.33333333333333e-02 772 1161 8.33333333333333e-02 772 1264 -1.25000000000000e-01 772 1263 8.33333333333333e-02 772 1274 8.33333333333333e-02 772 773 -1.66666666666667e-01 772 1273 -3.75000000000000e-01 772 1272 8.33333333333333e-02 772 1128 -8.33333333333333e-02 772 1259 8.33333333333333e-02 772 771 -1.66666666666667e-01 772 1145 -1.66666666666667e-01 772 1178 1.66666666666667e-01 772 1143 8.33333333333333e-02 772 1176 -8.33333333333333e-02 772 890 4.16666666666667e-02 772 1130 -8.33333333333333e-02 772 1258 -3.75000000000000e-01 772 888 -8.33333333333333e-02 772 1257 8.33333333333333e-02 772 1271 -4.16666666666667e-02 772 944 4.16666666666667e-02 772 1265 -4.16666666666667e-02 772 1270 -1.25000000000000e-01 772 1177 -2.50000000000000e-01 772 1269 8.33333333333333e-02 772 942 -8.33333333333333e-02 773 773 1.25000000000000e+00 773 1162 8.33333333333333e-02 773 1263 8.33333333333333e-02 773 1161 -1.66666666666667e-01 773 1265 -1.25000000000000e-01 773 888 4.16666666666667e-02 773 1274 -1.25000000000000e-01 773 1273 8.33333333333333e-02 773 772 -1.66666666666667e-01 773 1272 -4.16666666666667e-02 773 942 4.16666666666667e-02 773 1128 -8.33333333333333e-02 773 1258 8.33333333333333e-02 773 1143 8.33333333333333e-02 773 1257 -4.16666666666667e-02 773 1144 -1.66666666666667e-01 773 1177 1.66666666666667e-01 773 1259 -1.25000000000000e-01 773 889 4.16666666666667e-02 773 1129 -8.33333333333333e-02 773 1264 -4.16666666666667e-02 773 1271 -1.25000000000000e-01 773 1178 -7.50000000000000e-01 773 1270 -4.16666666666667e-02 773 943 4.16666666666667e-02 773 771 -1.66666666666667e-01 773 1269 8.33333333333333e-02 773 1176 1.66666666666667e-01 774 774 6.66666666666667e-01 774 1195 4.16666666666667e-02 774 1202 8.33333333333333e-02 774 1201 -4.16666666666667e-02 774 1200 -1.25000000000000e-01 774 1148 -8.33333333333333e-02 774 1262 4.16666666666667e-02 774 1147 -8.33333333333333e-02 774 1180 8.33333333333333e-02 774 1261 -8.33333333333333e-02 774 901 4.16666666666667e-02 774 900 -8.33333333333333e-02 774 1271 8.33333333333333e-02 774 1181 -1.66666666666667e-01 774 1270 8.33333333333333e-02 774 775 -8.33333333333333e-02 774 946 4.16666666666667e-02 774 1269 -3.75000000000000e-01 774 1196 4.16666666666667e-02 774 945 -8.33333333333333e-02 775 775 7.50000000000000e-01 775 902 4.16666666666667e-02 775 1194 4.16666666666667e-02 775 1202 8.33333333333333e-02 775 776 -8.33333333333333e-02 775 947 4.16666666666667e-02 775 1201 -1.25000000000000e-01 775 1200 -4.16666666666667e-02 775 1146 -8.33333333333333e-02 775 1179 8.33333333333333e-02 775 1262 4.16666666666667e-02 775 1148 -8.33333333333333e-02 775 901 -2.50000000000000e-01 775 1260 -8.33333333333333e-02 775 900 4.16666666666667e-02 775 1271 -4.16666666666667e-02 775 1181 8.33333333333333e-02 775 1270 -1.25000000000000e-01 775 1196 -8.33333333333333e-02 775 946 -2.50000000000000e-01 775 1269 8.33333333333333e-02 775 774 -8.33333333333333e-02 775 945 4.16666666666667e-02 776 776 6.66666666666667e-01 776 1195 -8.33333333333333e-02 776 901 4.16666666666667e-02 776 1202 -3.75000000000000e-01 776 1201 8.33333333333333e-02 776 775 -8.33333333333333e-02 776 946 4.16666666666667e-02 776 1200 8.33333333333333e-02 776 1146 -8.33333333333333e-02 776 1260 4.16666666666667e-02 776 902 -8.33333333333333e-02 776 1261 4.16666666666667e-02 776 1147 -8.33333333333333e-02 776 1271 -1.25000000000000e-01 776 1194 4.16666666666667e-02 776 947 -8.33333333333333e-02 776 1270 -4.16666666666667e-02 776 1180 8.33333333333333e-02 776 1269 8.33333333333333e-02 776 1179 -1.66666666666667e-01 777 777 7.50000000000000e-01 777 1214 -8.33333333333333e-02 777 1213 4.16666666666667e-02 777 779 -8.33333333333333e-02 777 1220 8.33333333333333e-02 777 926 4.16666666666667e-02 777 1219 -4.16666666666667e-02 777 1218 -1.25000000000000e-01 777 1039 -8.33333333333333e-02 777 1057 8.33333333333333e-02 777 1250 4.16666666666667e-02 777 1040 -8.33333333333333e-02 777 904 4.16666666666667e-02 777 1249 -8.33333333333333e-02 777 903 -2.50000000000000e-01 777 1256 -4.16666666666667e-02 777 1058 8.33333333333333e-02 777 778 -8.33333333333333e-02 777 1255 8.33333333333333e-02 777 925 4.16666666666667e-02 777 905 4.16666666666667e-02 777 1254 -1.25000000000000e-01 777 924 -2.50000000000000e-01 778 778 6.66666666666667e-01 778 1212 4.16666666666667e-02 778 1220 8.33333333333333e-02 778 1219 -1.25000000000000e-01 778 1218 -4.16666666666667e-02 778 1250 4.16666666666667e-02 778 1040 -8.33333333333333e-02 778 1038 -8.33333333333333e-02 778 1056 8.33333333333333e-02 778 904 -8.33333333333333e-02 778 903 4.16666666666667e-02 778 1248 -8.33333333333333e-02 778 1256 8.33333333333333e-02 778 1058 -1.66666666666667e-01 778 1214 4.16666666666667e-02 778 1255 -3.75000000000000e-01 778 925 -8.33333333333333e-02 778 777 -8.33333333333333e-02 778 1254 8.33333333333333e-02 778 924 4.16666666666667e-02 779 779 6.66666666666667e-01 779 903 4.16666666666667e-02 779 1212 -8.33333333333333e-02 779 1220 -3.75000000000000e-01 779 1219 8.33333333333333e-02 779 777 -8.33333333333333e-02 779 1218 8.33333333333333e-02 779 924 4.16666666666667e-02 779 1249 4.16666666666667e-02 779 1039 -8.33333333333333e-02 779 905 -8.33333333333333e-02 779 1248 4.16666666666667e-02 779 1038 -8.33333333333333e-02 779 1213 4.16666666666667e-02 779 1256 -1.25000000000000e-01 779 926 -8.33333333333333e-02 779 1255 8.33333333333333e-02 779 1057 -1.66666666666667e-01 779 1254 -4.16666666666667e-02 779 1056 8.33333333333333e-02 780 780 7.50000000000000e-01 780 1232 -8.33333333333333e-02 780 1231 4.16666666666667e-02 780 782 -8.33333333333333e-02 780 1238 8.33333333333333e-02 780 950 4.16666666666667e-02 780 1237 -4.16666666666667e-02 780 1236 -1.25000000000000e-01 780 1165 -8.33333333333333e-02 780 1183 8.33333333333333e-02 780 1268 4.16666666666667e-02 780 1166 -8.33333333333333e-02 780 928 4.16666666666667e-02 780 1267 -8.33333333333333e-02 780 927 -2.50000000000000e-01 780 1274 -4.16666666666667e-02 780 1184 8.33333333333333e-02 780 781 -8.33333333333333e-02 780 1273 8.33333333333333e-02 780 949 4.16666666666667e-02 780 929 4.16666666666667e-02 780 1272 -1.25000000000000e-01 780 948 -2.50000000000000e-01 781 781 6.66666666666667e-01 781 1230 4.16666666666667e-02 781 1238 8.33333333333333e-02 781 1237 -1.25000000000000e-01 781 1236 -4.16666666666667e-02 781 1268 4.16666666666667e-02 781 1166 -8.33333333333333e-02 781 1164 -8.33333333333333e-02 781 1182 8.33333333333333e-02 781 928 -8.33333333333333e-02 781 927 4.16666666666667e-02 781 1266 -8.33333333333333e-02 781 1274 8.33333333333333e-02 781 1184 -1.66666666666667e-01 781 1232 4.16666666666667e-02 781 1273 -3.75000000000000e-01 781 949 -8.33333333333333e-02 781 780 -8.33333333333333e-02 781 1272 8.33333333333333e-02 781 948 4.16666666666667e-02 782 782 6.66666666666667e-01 782 927 4.16666666666667e-02 782 1230 -8.33333333333333e-02 782 1238 -3.75000000000000e-01 782 1237 8.33333333333333e-02 782 780 -8.33333333333333e-02 782 1236 8.33333333333333e-02 782 948 4.16666666666667e-02 782 1267 4.16666666666667e-02 782 1165 -8.33333333333333e-02 782 929 -8.33333333333333e-02 782 1266 4.16666666666667e-02 782 1164 -8.33333333333333e-02 782 1231 4.16666666666667e-02 782 1274 -1.25000000000000e-01 782 950 -8.33333333333333e-02 782 1273 8.33333333333333e-02 782 1183 -1.66666666666667e-01 782 1272 -4.16666666666667e-02 782 1182 8.33333333333333e-02 783 783 7.50000000000000e-01 783 700 4.16666666666667e-02 783 952 -8.33333333333333e-02 783 788 -4.16666666666667e-02 783 784 -8.33333333333333e-02 783 787 8.33333333333333e-02 783 786 -1.25000000000000e-01 783 959 -8.33333333333333e-02 783 794 8.33333333333333e-02 783 701 4.16666666666667e-02 783 956 -8.33333333333333e-02 783 955 4.16666666666667e-02 783 958 -8.33333333333333e-02 783 699 -2.50000000000000e-01 783 785 -8.33333333333333e-02 783 791 8.33333333333333e-02 783 790 -4.16666666666667e-02 783 793 8.33333333333333e-02 783 953 4.16666666666667e-02 783 789 -1.25000000000000e-01 783 7 4.16666666666667e-02 783 8 4.16666666666667e-02 783 6 -2.50000000000000e-01 784 784 6.66666666666667e-01 784 699 4.16666666666667e-02 784 951 -8.33333333333333e-02 784 788 8.33333333333333e-02 784 787 -3.75000000000000e-01 784 783 -8.33333333333333e-02 784 786 8.33333333333333e-02 784 956 4.16666666666667e-02 784 959 -8.33333333333333e-02 784 700 -8.33333333333333e-02 784 954 4.16666666666667e-02 784 957 -8.33333333333333e-02 784 791 8.33333333333333e-02 784 794 -1.66666666666667e-01 784 953 4.16666666666667e-02 784 790 -1.25000000000000e-01 784 789 -4.16666666666667e-02 784 792 8.33333333333333e-02 784 6 4.16666666666667e-02 784 7 -8.33333333333333e-02 785 785 6.66666666666667e-01 785 951 4.16666666666667e-02 785 788 -1.25000000000000e-01 785 787 8.33333333333333e-02 785 786 -4.16666666666667e-02 785 955 4.16666666666667e-02 785 958 -8.33333333333333e-02 785 957 -8.33333333333333e-02 785 792 8.33333333333333e-02 785 701 -8.33333333333333e-02 785 699 4.16666666666667e-02 785 954 -8.33333333333333e-02 785 952 4.16666666666667e-02 785 791 -3.75000000000000e-01 785 790 8.33333333333333e-02 785 793 -1.66666666666667e-01 785 783 -8.33333333333333e-02 785 789 8.33333333333333e-02 785 8 -8.33333333333333e-02 785 6 4.16666666666667e-02 786 786 1.25000000000000e+00 786 973 8.33333333333333e-02 786 974 8.33333333333333e-02 786 970 8.33333333333333e-02 786 969 -1.25000000000000e-01 786 788 -1.66666666666667e-01 786 793 -8.33333333333333e-02 786 787 -1.66666666666667e-01 786 953 8.33333333333333e-02 786 982 -8.33333333333333e-02 786 958 8.33333333333333e-02 786 794 1.66666666666667e-01 786 959 -1.66666666666667e-01 786 704 4.16666666666667e-02 786 983 -8.33333333333333e-02 786 952 8.33333333333333e-02 786 703 -8.33333333333333e-02 786 951 -3.75000000000000e-01 786 785 -4.16666666666667e-02 786 784 8.33333333333333e-02 786 783 -1.25000000000000e-01 786 971 -4.16666666666667e-02 786 792 -2.50000000000000e-01 786 185 8.33333333333333e-02 786 184 8.33333333333333e-02 786 183 -3.75000000000000e-01 786 8 4.16666666666667e-02 786 7 -8.33333333333333e-02 787 787 1.25000000000000e+00 787 972 8.33333333333333e-02 787 974 -1.66666666666667e-01 787 704 4.16666666666667e-02 787 970 -3.75000000000000e-01 787 969 8.33333333333333e-02 787 792 -8.33333333333333e-02 787 953 -4.16666666666667e-02 787 786 -1.66666666666667e-01 787 981 -8.33333333333333e-02 787 957 8.33333333333333e-02 787 983 -8.33333333333333e-02 787 959 8.33333333333333e-02 787 952 -1.25000000000000e-01 787 951 8.33333333333333e-02 787 702 -8.33333333333333e-02 787 785 8.33333333333333e-02 787 788 -1.66666666666667e-01 787 794 1.66666666666667e-01 787 784 -3.75000000000000e-01 787 971 8.33333333333333e-02 787 793 -2.50000000000000e-01 787 783 8.33333333333333e-02 787 185 -4.16666666666667e-02 787 8 4.16666666666667e-02 787 184 -1.25000000000000e-01 787 183 8.33333333333333e-02 787 6 -8.33333333333333e-02 788 788 1.25000000000000e+00 788 970 8.33333333333333e-02 788 973 -1.66666666666667e-01 788 972 8.33333333333333e-02 788 971 -1.25000000000000e-01 788 703 4.16666666666667e-02 788 786 -1.66666666666667e-01 788 952 -4.16666666666667e-02 788 951 8.33333333333333e-02 788 982 -8.33333333333333e-02 788 958 8.33333333333333e-02 788 792 1.66666666666667e-01 788 957 -1.66666666666667e-01 788 953 -1.25000000000000e-01 788 702 4.16666666666667e-02 788 981 -8.33333333333333e-02 788 785 -1.25000000000000e-01 788 969 -4.16666666666667e-02 788 794 -7.50000000000000e-01 788 784 8.33333333333333e-02 788 787 -1.66666666666667e-01 788 793 1.66666666666667e-01 788 783 -4.16666666666667e-02 788 185 -1.25000000000000e-01 788 184 -4.16666666666667e-02 788 7 4.16666666666667e-02 788 183 8.33333333333333e-02 788 6 4.16666666666667e-02 789 789 1.25000000000000e+00 789 959 8.33333333333333e-02 789 958 -1.66666666666667e-01 789 956 8.33333333333333e-02 789 706 4.16666666666667e-02 789 954 -3.75000000000000e-01 789 785 8.33333333333333e-02 789 784 -4.16666666666667e-02 789 783 -1.25000000000000e-01 789 794 -8.33333333333333e-02 789 791 -1.66666666666667e-01 789 1000 -4.16666666666667e-02 789 1013 -8.33333333333333e-02 789 1004 8.33333333333333e-02 789 1012 -8.33333333333333e-02 789 1003 8.33333333333333e-02 789 1001 8.33333333333333e-02 789 707 -8.33333333333333e-02 789 999 -1.25000000000000e-01 789 790 -1.66666666666667e-01 789 793 1.66666666666667e-01 789 955 8.33333333333333e-02 789 792 -2.50000000000000e-01 789 7 4.16666666666667e-02 789 188 8.33333333333333e-02 789 8 -8.33333333333333e-02 789 187 8.33333333333333e-02 789 186 -3.75000000000000e-01 790 790 1.25000000000000e+00 790 959 8.33333333333333e-02 790 954 8.33333333333333e-02 790 957 -1.66666666666667e-01 790 955 -1.25000000000000e-01 790 705 4.16666666666667e-02 790 785 8.33333333333333e-02 790 791 -1.66666666666667e-01 790 784 -1.25000000000000e-01 790 783 -4.16666666666667e-02 790 999 -4.16666666666667e-02 790 1001 8.33333333333333e-02 790 794 1.66666666666667e-01 790 1004 -1.66666666666667e-01 790 1011 -8.33333333333333e-02 790 1002 8.33333333333333e-02 790 707 4.16666666666667e-02 790 1013 -8.33333333333333e-02 790 1000 -1.25000000000000e-01 790 956 -4.16666666666667e-02 790 793 -7.50000000000000e-01 790 789 -1.66666666666667e-01 790 792 1.66666666666667e-01 790 6 4.16666666666667e-02 790 188 -4.16666666666667e-02 790 8 4.16666666666667e-02 790 187 -1.25000000000000e-01 790 186 8.33333333333333e-02 791 791 1.25000000000000e+00 791 958 8.33333333333333e-02 791 957 8.33333333333333e-02 791 956 -1.25000000000000e-01 791 954 8.33333333333333e-02 791 785 -3.75000000000000e-01 791 784 8.33333333333333e-02 791 790 -1.66666666666667e-01 791 783 8.33333333333333e-02 791 792 -8.33333333333333e-02 791 789 -1.66666666666667e-01 791 1000 8.33333333333333e-02 791 1011 -8.33333333333333e-02 791 1002 8.33333333333333e-02 791 793 1.66666666666667e-01 791 1003 -1.66666666666667e-01 791 1001 -3.75000000000000e-01 791 706 4.16666666666667e-02 791 1012 -8.33333333333333e-02 791 999 8.33333333333333e-02 791 705 -8.33333333333333e-02 791 955 -4.16666666666667e-02 791 794 -2.50000000000000e-01 791 188 -1.25000000000000e-01 791 187 -4.16666666666667e-02 791 7 4.16666666666667e-02 791 186 8.33333333333333e-02 791 6 -8.33333333333333e-02 792 792 2.50000000000000e+00 792 973 1.66666666666667e-01 792 972 -2.50000000000000e-01 792 1030 8.33333333333333e-02 792 1031 8.33333333333333e-02 792 787 -8.33333333333333e-02 792 788 1.66666666666667e-01 792 794 -3.33333333333333e-01 792 786 -2.50000000000000e-01 792 983 8.33333333333333e-02 792 710 -8.33333333333333e-02 792 982 -1.66666666666667e-01 792 785 8.33333333333333e-02 792 958 1.66666666666667e-01 792 793 -3.33333333333333e-01 792 959 1.66666666666667e-01 792 709 -8.33333333333333e-02 792 957 -7.50000000000000e-01 792 784 8.33333333333333e-02 792 791 -8.33333333333333e-02 792 1012 8.33333333333333e-02 792 1003 -8.33333333333333e-02 792 790 1.66666666666667e-01 792 789 -2.50000000000000e-01 792 1004 1.66666666666667e-01 792 1013 -1.66666666666667e-01 792 1002 -2.50000000000000e-01 792 974 -8.33333333333333e-02 792 185 -1.66666666666667e-01 792 184 8.33333333333333e-02 792 191 1.66666666666667e-01 792 190 1.66666666666667e-01 792 189 -7.50000000000000e-01 792 8 -8.33333333333333e-02 792 7 -8.33333333333333e-02 792 188 8.33333333333333e-02 792 187 -1.66666666666667e-01 793 793 2.50000000000000e+00 793 972 1.66666666666667e-01 793 974 1.66666666666667e-01 793 973 -7.50000000000000e-01 793 1029 8.33333333333333e-02 793 1031 -1.66666666666667e-01 793 786 -8.33333333333333e-02 793 983 8.33333333333333e-02 793 788 1.66666666666667e-01 793 787 -2.50000000000000e-01 793 981 -1.66666666666667e-01 793 959 -8.33333333333333e-02 793 957 1.66666666666667e-01 793 792 -3.33333333333333e-01 793 958 -2.50000000000000e-01 793 708 -8.33333333333333e-02 793 785 -1.66666666666667e-01 793 783 8.33333333333333e-02 793 791 1.66666666666667e-01 793 794 -3.33333333333333e-01 793 1004 1.66666666666667e-01 793 1011 8.33333333333333e-02 793 1002 -8.33333333333333e-02 793 790 -7.50000000000000e-01 793 789 1.66666666666667e-01 793 1013 8.33333333333333e-02 793 710 -8.33333333333333e-02 793 1003 -2.50000000000000e-01 793 183 8.33333333333333e-02 793 191 -8.33333333333333e-02 793 190 -2.50000000000000e-01 793 189 1.66666666666667e-01 793 6 -8.33333333333333e-02 793 188 8.33333333333333e-02 793 8 -8.33333333333333e-02 793 186 -1.66666666666667e-01 793 185 8.33333333333333e-02 794 794 2.50000000000000e+00 794 974 -2.50000000000000e-01 794 973 1.66666666666667e-01 794 1030 -1.66666666666667e-01 794 1029 8.33333333333333e-02 794 982 8.33333333333333e-02 794 786 1.66666666666667e-01 794 792 -3.33333333333333e-01 794 788 -7.50000000000000e-01 794 787 1.66666666666667e-01 794 981 8.33333333333333e-02 794 708 -8.33333333333333e-02 794 958 -8.33333333333333e-02 794 783 8.33333333333333e-02 794 959 -2.50000000000000e-01 794 957 1.66666666666667e-01 794 784 -1.66666666666667e-01 794 789 -8.33333333333333e-02 794 790 1.66666666666667e-01 794 793 -3.33333333333333e-01 794 1003 1.66666666666667e-01 794 791 -2.50000000000000e-01 794 1004 -7.50000000000000e-01 794 972 -8.33333333333333e-02 794 1012 8.33333333333333e-02 794 709 -8.33333333333333e-02 794 1002 1.66666666666667e-01 794 1011 -1.66666666666667e-01 794 184 8.33333333333333e-02 794 183 -1.66666666666667e-01 794 190 -8.33333333333333e-02 794 189 1.66666666666667e-01 794 191 -2.50000000000000e-01 794 6 -8.33333333333333e-02 794 186 8.33333333333333e-02 794 187 8.33333333333333e-02 794 7 -8.33333333333333e-02 795 795 7.50000000000000e-01 795 676 4.16666666666667e-02 795 802 -8.33333333333333e-02 795 962 -4.16666666666667e-02 795 796 -8.33333333333333e-02 795 961 8.33333333333333e-02 795 700 4.16666666666667e-02 795 960 -1.25000000000000e-01 795 815 -8.33333333333333e-02 795 968 8.33333333333333e-02 795 677 4.16666666666667e-02 795 809 -8.33333333333333e-02 795 808 4.16666666666667e-02 795 814 -8.33333333333333e-02 795 675 -2.50000000000000e-01 795 797 -8.33333333333333e-02 795 965 8.33333333333333e-02 795 701 4.16666666666667e-02 795 964 -4.16666666666667e-02 795 967 8.33333333333333e-02 795 803 4.16666666666667e-02 795 963 -1.25000000000000e-01 795 699 -2.50000000000000e-01 796 796 6.66666666666667e-01 796 675 4.16666666666667e-02 796 801 -8.33333333333333e-02 796 962 8.33333333333333e-02 796 961 -3.75000000000000e-01 796 795 -8.33333333333333e-02 796 960 8.33333333333333e-02 796 699 4.16666666666667e-02 796 809 4.16666666666667e-02 796 815 -8.33333333333333e-02 796 676 -8.33333333333333e-02 796 807 4.16666666666667e-02 796 813 -8.33333333333333e-02 796 965 8.33333333333333e-02 796 968 -1.66666666666667e-01 796 803 4.16666666666667e-02 796 964 -1.25000000000000e-01 796 700 -8.33333333333333e-02 796 963 -4.16666666666667e-02 796 966 8.33333333333333e-02 797 797 6.66666666666667e-01 797 801 4.16666666666667e-02 797 962 -1.25000000000000e-01 797 961 8.33333333333333e-02 797 960 -4.16666666666667e-02 797 808 4.16666666666667e-02 797 814 -8.33333333333333e-02 797 813 -8.33333333333333e-02 797 966 8.33333333333333e-02 797 677 -8.33333333333333e-02 797 675 4.16666666666667e-02 797 807 -8.33333333333333e-02 797 802 4.16666666666667e-02 797 965 -3.75000000000000e-01 797 701 -8.33333333333333e-02 797 964 8.33333333333333e-02 797 967 -1.66666666666667e-01 797 795 -8.33333333333333e-02 797 963 8.33333333333333e-02 797 699 4.16666666666667e-02 798 798 7.50000000000000e-01 798 712 4.16666666666667e-02 798 1060 -8.33333333333333e-02 798 806 -4.16666666666667e-02 798 799 -8.33333333333333e-02 798 805 8.33333333333333e-02 798 676 4.16666666666667e-02 798 804 -1.25000000000000e-01 798 1067 -8.33333333333333e-02 798 818 8.33333333333333e-02 798 713 4.16666666666667e-02 798 1064 -8.33333333333333e-02 798 1063 4.16666666666667e-02 798 1066 -8.33333333333333e-02 798 711 -2.50000000000000e-01 798 800 -8.33333333333333e-02 798 812 8.33333333333333e-02 798 677 4.16666666666667e-02 798 811 -4.16666666666667e-02 798 817 8.33333333333333e-02 798 1061 4.16666666666667e-02 798 810 -1.25000000000000e-01 798 675 -2.50000000000000e-01 799 799 6.66666666666667e-01 799 711 4.16666666666667e-02 799 1059 -8.33333333333333e-02 799 806 8.33333333333333e-02 799 805 -3.75000000000000e-01 799 798 -8.33333333333333e-02 799 804 8.33333333333333e-02 799 675 4.16666666666667e-02 799 1064 4.16666666666667e-02 799 1067 -8.33333333333333e-02 799 712 -8.33333333333333e-02 799 1062 4.16666666666667e-02 799 1065 -8.33333333333333e-02 799 812 8.33333333333333e-02 799 818 -1.66666666666667e-01 799 1061 4.16666666666667e-02 799 811 -1.25000000000000e-01 799 676 -8.33333333333333e-02 799 810 -4.16666666666667e-02 799 816 8.33333333333333e-02 800 800 6.66666666666667e-01 800 1059 4.16666666666667e-02 800 806 -1.25000000000000e-01 800 805 8.33333333333333e-02 800 804 -4.16666666666667e-02 800 1063 4.16666666666667e-02 800 1066 -8.33333333333333e-02 800 1065 -8.33333333333333e-02 800 816 8.33333333333333e-02 800 713 -8.33333333333333e-02 800 711 4.16666666666667e-02 800 1062 -8.33333333333333e-02 800 1060 4.16666666666667e-02 800 812 -3.75000000000000e-01 800 677 -8.33333333333333e-02 800 811 8.33333333333333e-02 800 817 -1.66666666666667e-01 800 798 -8.33333333333333e-02 800 810 8.33333333333333e-02 800 675 4.16666666666667e-02 801 801 1.25000000000000e+00 801 1078 -8.33333333333333e-02 801 806 8.33333333333333e-02 801 805 8.33333333333333e-02 801 804 -3.75000000000000e-01 801 1085 -8.33333333333333e-02 801 1084 -8.33333333333333e-02 801 818 -1.66666666666667e-01 801 817 8.33333333333333e-02 801 962 8.33333333333333e-02 801 803 -1.66666666666667e-01 801 815 1.66666666666667e-01 801 1081 8.33333333333333e-02 801 814 -8.33333333333333e-02 801 677 -4.16666666666667e-02 801 797 4.16666666666667e-02 801 676 8.33333333333333e-02 801 796 -8.33333333333333e-02 801 675 -1.25000000000000e-01 801 813 -2.50000000000000e-01 801 716 -4.16666666666667e-02 801 1082 8.33333333333333e-02 801 802 -1.66666666666667e-01 801 715 8.33333333333333e-02 801 961 8.33333333333333e-02 801 1079 4.16666666666667e-02 801 714 -1.25000000000000e-01 801 960 -3.75000000000000e-01 802 802 1.25000000000000e+00 802 1077 -8.33333333333333e-02 802 806 -4.16666666666667e-02 802 805 -1.25000000000000e-01 802 804 8.33333333333333e-02 802 1085 -8.33333333333333e-02 802 818 8.33333333333333e-02 802 1083 -8.33333333333333e-02 802 816 8.33333333333333e-02 802 962 -4.16666666666667e-02 802 797 4.16666666666667e-02 802 1080 8.33333333333333e-02 802 813 -8.33333333333333e-02 802 677 8.33333333333333e-02 802 803 -1.66666666666667e-01 802 815 1.66666666666667e-01 802 676 -3.75000000000000e-01 802 814 -2.50000000000000e-01 802 675 8.33333333333333e-02 802 795 -8.33333333333333e-02 802 716 8.33333333333333e-02 802 1082 -1.66666666666667e-01 802 1079 4.16666666666667e-02 802 715 -3.75000000000000e-01 802 961 -1.25000000000000e-01 802 801 -1.66666666666667e-01 802 714 8.33333333333333e-02 802 960 8.33333333333333e-02 803 803 1.25000000000000e+00 803 1078 4.16666666666667e-02 803 806 -1.25000000000000e-01 803 805 -4.16666666666667e-02 803 804 8.33333333333333e-02 803 1083 -8.33333333333333e-02 803 1084 -8.33333333333333e-02 803 817 8.33333333333333e-02 803 816 -1.66666666666667e-01 803 961 -4.16666666666667e-02 803 796 4.16666666666667e-02 803 960 8.33333333333333e-02 803 801 -1.66666666666667e-01 803 813 1.66666666666667e-01 803 677 -1.25000000000000e-01 803 815 -7.50000000000000e-01 803 676 8.33333333333333e-02 803 802 -1.66666666666667e-01 803 814 1.66666666666667e-01 803 675 -4.16666666666667e-02 803 795 4.16666666666667e-02 803 1077 4.16666666666667e-02 803 716 -1.25000000000000e-01 803 962 -1.25000000000000e-01 803 715 8.33333333333333e-02 803 1081 -1.66666666666667e-01 803 714 -4.16666666666667e-02 803 1080 8.33333333333333e-02 804 804 1.25000000000000e+00 804 1084 8.33333333333333e-02 804 1085 8.33333333333333e-02 804 1078 8.33333333333333e-02 804 1077 -1.25000000000000e-01 804 806 -1.66666666666667e-01 804 803 8.33333333333333e-02 804 802 8.33333333333333e-02 804 801 -3.75000000000000e-01 804 817 -8.33333333333333e-02 804 805 -1.66666666666667e-01 804 1061 8.33333333333333e-02 804 1096 -8.33333333333333e-02 804 1066 8.33333333333333e-02 804 818 1.66666666666667e-01 804 1067 -1.66666666666667e-01 804 719 4.16666666666667e-02 804 1097 -8.33333333333333e-02 804 1060 8.33333333333333e-02 804 718 -8.33333333333333e-02 804 1059 -3.75000000000000e-01 804 800 -4.16666666666667e-02 804 677 4.16666666666667e-02 804 799 8.33333333333333e-02 804 676 -8.33333333333333e-02 804 798 -1.25000000000000e-01 804 1079 -4.16666666666667e-02 804 816 -2.50000000000000e-01 805 805 1.25000000000000e+00 805 1083 8.33333333333333e-02 805 1085 -1.66666666666667e-01 805 719 4.16666666666667e-02 805 1078 -3.75000000000000e-01 805 1077 8.33333333333333e-02 805 803 -4.16666666666667e-02 805 677 4.16666666666667e-02 805 802 -1.25000000000000e-01 805 801 8.33333333333333e-02 805 816 -8.33333333333333e-02 805 1061 -4.16666666666667e-02 805 804 -1.66666666666667e-01 805 1095 -8.33333333333333e-02 805 1065 8.33333333333333e-02 805 1097 -8.33333333333333e-02 805 1067 8.33333333333333e-02 805 1060 -1.25000000000000e-01 805 1059 8.33333333333333e-02 805 717 -8.33333333333333e-02 805 800 8.33333333333333e-02 805 806 -1.66666666666667e-01 805 818 1.66666666666667e-01 805 799 -3.75000000000000e-01 805 1079 8.33333333333333e-02 805 817 -2.50000000000000e-01 805 798 8.33333333333333e-02 805 675 -8.33333333333333e-02 806 806 1.25000000000000e+00 806 1078 8.33333333333333e-02 806 1084 -1.66666666666667e-01 806 1083 8.33333333333333e-02 806 1079 -1.25000000000000e-01 806 718 4.16666666666667e-02 806 803 -1.25000000000000e-01 806 802 -4.16666666666667e-02 806 676 4.16666666666667e-02 806 804 -1.66666666666667e-01 806 801 8.33333333333333e-02 806 1060 -4.16666666666667e-02 806 1059 8.33333333333333e-02 806 1096 -8.33333333333333e-02 806 1066 8.33333333333333e-02 806 816 1.66666666666667e-01 806 1065 -1.66666666666667e-01 806 1061 -1.25000000000000e-01 806 717 4.16666666666667e-02 806 1095 -8.33333333333333e-02 806 800 -1.25000000000000e-01 806 1077 -4.16666666666667e-02 806 818 -7.50000000000000e-01 806 799 8.33333333333333e-02 806 805 -1.66666666666667e-01 806 817 1.66666666666667e-01 806 798 -4.16666666666667e-02 806 675 4.16666666666667e-02 807 807 1.25000000000000e+00 807 1121 -8.33333333333333e-02 807 1114 4.16666666666667e-02 807 1120 -8.33333333333333e-02 807 1115 -8.33333333333333e-02 807 812 8.33333333333333e-02 807 811 8.33333333333333e-02 807 817 -1.66666666666667e-01 807 810 -3.75000000000000e-01 807 1118 8.33333333333333e-02 807 815 -8.33333333333333e-02 807 808 -1.66666666666667e-01 807 814 1.66666666666667e-01 807 964 8.33333333333333e-02 807 677 8.33333333333333e-02 807 797 -8.33333333333333e-02 807 676 -4.16666666666667e-02 807 796 4.16666666666667e-02 807 675 -1.25000000000000e-01 807 813 -2.50000000000000e-01 807 809 -1.66666666666667e-01 807 722 8.33333333333333e-02 807 965 8.33333333333333e-02 807 721 -4.16666666666667e-02 807 1117 8.33333333333333e-02 807 818 8.33333333333333e-02 807 720 -1.25000000000000e-01 807 963 -3.75000000000000e-01 808 808 1.25000000000000e+00 808 1119 -8.33333333333333e-02 808 1115 4.16666666666667e-02 808 1121 -8.33333333333333e-02 808 812 -4.16666666666667e-02 808 818 8.33333333333333e-02 808 811 -1.25000000000000e-01 808 810 8.33333333333333e-02 808 816 -1.66666666666667e-01 808 797 4.16666666666667e-02 808 965 -4.16666666666667e-02 808 807 -1.66666666666667e-01 808 813 1.66666666666667e-01 808 963 8.33333333333333e-02 808 677 8.33333333333333e-02 808 809 -1.66666666666667e-01 808 815 1.66666666666667e-01 808 676 -1.25000000000000e-01 808 814 -7.50000000000000e-01 808 675 -4.16666666666667e-02 808 795 4.16666666666667e-02 808 722 8.33333333333333e-02 808 1118 -1.66666666666667e-01 808 1113 4.16666666666667e-02 808 721 -1.25000000000000e-01 808 964 -1.25000000000000e-01 808 720 -4.16666666666667e-02 808 1116 8.33333333333333e-02 809 809 1.25000000000000e+00 809 1119 -8.33333333333333e-02 809 1114 4.16666666666667e-02 809 1120 -8.33333333333333e-02 809 1113 -8.33333333333333e-02 809 812 -1.25000000000000e-01 809 811 -4.16666666666667e-02 809 817 8.33333333333333e-02 809 810 8.33333333333333e-02 809 1116 8.33333333333333e-02 809 813 -8.33333333333333e-02 809 796 4.16666666666667e-02 809 964 -4.16666666666667e-02 809 677 -3.75000000000000e-01 809 815 -2.50000000000000e-01 809 676 8.33333333333333e-02 809 808 -1.66666666666667e-01 809 814 1.66666666666667e-01 809 675 8.33333333333333e-02 809 795 -8.33333333333333e-02 809 816 8.33333333333333e-02 809 722 -3.75000000000000e-01 809 965 -1.25000000000000e-01 809 721 8.33333333333333e-02 809 1117 -1.66666666666667e-01 809 807 -1.66666666666667e-01 809 720 8.33333333333333e-02 809 963 8.33333333333333e-02 810 810 1.25000000000000e+00 810 1067 8.33333333333333e-02 810 1066 -1.66666666666667e-01 810 1064 8.33333333333333e-02 810 724 4.16666666666667e-02 810 1062 -3.75000000000000e-01 810 800 8.33333333333333e-02 810 799 -4.16666666666667e-02 810 676 4.16666666666667e-02 810 798 -1.25000000000000e-01 810 818 -8.33333333333333e-02 810 812 -1.66666666666667e-01 810 1114 -4.16666666666667e-02 810 1133 -8.33333333333333e-02 810 1121 8.33333333333333e-02 810 1132 -8.33333333333333e-02 810 1120 8.33333333333333e-02 810 1115 8.33333333333333e-02 810 725 -8.33333333333333e-02 810 1113 -1.25000000000000e-01 810 809 8.33333333333333e-02 810 677 -8.33333333333333e-02 810 808 8.33333333333333e-02 810 811 -1.66666666666667e-01 810 817 1.66666666666667e-01 810 807 -3.75000000000000e-01 810 1063 8.33333333333333e-02 810 816 -2.50000000000000e-01 811 811 1.25000000000000e+00 811 1067 8.33333333333333e-02 811 1062 8.33333333333333e-02 811 1065 -1.66666666666667e-01 811 1063 -1.25000000000000e-01 811 723 4.16666666666667e-02 811 800 8.33333333333333e-02 811 812 -1.66666666666667e-01 811 799 -1.25000000000000e-01 811 798 -4.16666666666667e-02 811 675 4.16666666666667e-02 811 1113 -4.16666666666667e-02 811 1115 8.33333333333333e-02 811 818 1.66666666666667e-01 811 1121 -1.66666666666667e-01 811 1131 -8.33333333333333e-02 811 1119 8.33333333333333e-02 811 725 4.16666666666667e-02 811 1133 -8.33333333333333e-02 811 1114 -1.25000000000000e-01 811 809 -4.16666666666667e-02 811 677 4.16666666666667e-02 811 808 -1.25000000000000e-01 811 1064 -4.16666666666667e-02 811 817 -7.50000000000000e-01 811 807 8.33333333333333e-02 811 810 -1.66666666666667e-01 811 816 1.66666666666667e-01 812 812 1.25000000000000e+00 812 1066 8.33333333333333e-02 812 1065 8.33333333333333e-02 812 1064 -1.25000000000000e-01 812 1062 8.33333333333333e-02 812 800 -3.75000000000000e-01 812 799 8.33333333333333e-02 812 811 -1.66666666666667e-01 812 798 8.33333333333333e-02 812 816 -8.33333333333333e-02 812 810 -1.66666666666667e-01 812 1114 8.33333333333333e-02 812 1131 -8.33333333333333e-02 812 1119 8.33333333333333e-02 812 817 1.66666666666667e-01 812 1120 -1.66666666666667e-01 812 1115 -3.75000000000000e-01 812 724 4.16666666666667e-02 812 1132 -8.33333333333333e-02 812 1113 8.33333333333333e-02 812 723 -8.33333333333333e-02 812 809 -1.25000000000000e-01 812 1063 -4.16666666666667e-02 812 818 -2.50000000000000e-01 812 808 -4.16666666666667e-02 812 676 4.16666666666667e-02 812 807 8.33333333333333e-02 812 675 -8.33333333333333e-02 813 813 2.50000000000000e+00 813 1084 -1.66666666666667e-01 813 818 1.66666666666667e-01 813 1121 -1.66666666666667e-01 813 1150 -8.33333333333333e-02 813 1120 8.33333333333333e-02 813 1151 -8.33333333333333e-02 813 817 1.66666666666667e-01 813 816 -7.50000000000000e-01 813 803 1.66666666666667e-01 813 961 8.33333333333333e-02 813 802 -8.33333333333333e-02 813 962 -1.66666666666667e-01 813 677 8.33333333333333e-02 813 801 -2.50000000000000e-01 813 1082 -8.33333333333333e-02 813 728 8.33333333333333e-02 813 814 -3.33333333333333e-01 813 1081 1.66666666666667e-01 813 1080 -2.50000000000000e-01 813 809 -8.33333333333333e-02 813 808 1.66666666666667e-01 813 797 -8.33333333333333e-02 813 965 8.33333333333333e-02 813 967 1.66666666666667e-01 813 964 -1.66666666666667e-01 813 676 8.33333333333333e-02 813 796 -8.33333333333333e-02 813 807 -2.50000000000000e-01 813 815 -3.33333333333333e-01 813 1118 1.66666666666667e-01 813 968 1.66666666666667e-01 813 1117 -8.33333333333333e-02 813 727 8.33333333333333e-02 813 1085 8.33333333333333e-02 813 1116 -2.50000000000000e-01 813 966 -7.50000000000000e-01 814 814 2.50000000000000e+00 814 1083 -1.66666666666667e-01 814 818 -8.33333333333333e-02 814 1151 -8.33333333333333e-02 814 1121 8.33333333333333e-02 814 1149 -8.33333333333333e-02 814 1119 8.33333333333333e-02 814 817 -2.50000000000000e-01 814 816 1.66666666666667e-01 814 960 8.33333333333333e-02 814 801 -8.33333333333333e-02 814 962 8.33333333333333e-02 814 803 1.66666666666667e-01 814 802 -2.50000000000000e-01 814 1082 1.66666666666667e-01 814 1081 -7.50000000000000e-01 814 813 -3.33333333333333e-01 814 1080 1.66666666666667e-01 814 968 -8.33333333333333e-02 814 815 -3.33333333333333e-01 814 797 -8.33333333333333e-02 814 965 8.33333333333333e-02 814 807 1.66666666666667e-01 814 966 1.66666666666667e-01 814 963 -1.66666666666667e-01 814 677 -1.66666666666667e-01 814 809 1.66666666666667e-01 814 808 -7.50000000000000e-01 814 675 8.33333333333333e-02 814 795 -8.33333333333333e-02 814 1118 1.66666666666667e-01 814 728 -1.66666666666667e-01 814 1085 8.33333333333333e-02 814 1117 -2.50000000000000e-01 814 967 -2.50000000000000e-01 814 1116 -8.33333333333333e-02 814 726 8.33333333333333e-02 815 815 2.50000000000000e+00 815 1084 8.33333333333333e-02 815 817 -8.33333333333333e-02 815 1150 -8.33333333333333e-02 815 1120 8.33333333333333e-02 815 816 1.66666666666667e-01 815 1119 -1.66666666666667e-01 815 1149 -8.33333333333333e-02 815 818 -2.50000000000000e-01 815 801 1.66666666666667e-01 815 961 8.33333333333333e-02 815 960 -1.66666666666667e-01 815 803 -7.50000000000000e-01 815 802 1.66666666666667e-01 815 675 8.33333333333333e-02 815 1082 -2.50000000000000e-01 815 1081 1.66666666666667e-01 815 1080 -8.33333333333333e-02 815 726 8.33333333333333e-02 815 967 -8.33333333333333e-02 815 814 -3.33333333333333e-01 815 807 -8.33333333333333e-02 815 796 -8.33333333333333e-02 815 964 8.33333333333333e-02 815 795 -8.33333333333333e-02 815 963 8.33333333333333e-02 815 809 -2.50000000000000e-01 815 676 -1.66666666666667e-01 815 808 1.66666666666667e-01 815 1083 8.33333333333333e-02 815 1118 -7.50000000000000e-01 815 968 -2.50000000000000e-01 815 1117 1.66666666666667e-01 815 727 -1.66666666666667e-01 815 813 -3.33333333333333e-01 815 1116 1.66666666666667e-01 815 966 1.66666666666667e-01 816 816 2.50000000000000e+00 816 1084 1.66666666666667e-01 816 1083 -2.50000000000000e-01 816 803 -1.66666666666667e-01 816 802 8.33333333333333e-02 816 815 1.66666666666667e-01 816 1150 8.33333333333333e-02 816 814 1.66666666666667e-01 816 813 -7.50000000000000e-01 816 1151 8.33333333333333e-02 816 805 -8.33333333333333e-02 816 806 1.66666666666667e-01 816 818 -3.33333333333333e-01 816 677 -8.33333333333333e-02 816 804 -2.50000000000000e-01 816 1097 8.33333333333333e-02 816 731 -8.33333333333333e-02 816 1096 -1.66666666666667e-01 816 800 8.33333333333333e-02 816 1066 1.66666666666667e-01 816 817 -3.33333333333333e-01 816 1067 1.66666666666667e-01 816 730 -8.33333333333333e-02 816 1065 -7.50000000000000e-01 816 799 8.33333333333333e-02 816 676 -8.33333333333333e-02 816 812 -8.33333333333333e-02 816 809 8.33333333333333e-02 816 1132 8.33333333333333e-02 816 1120 -8.33333333333333e-02 816 808 -1.66666666666667e-01 816 811 1.66666666666667e-01 816 810 -2.50000000000000e-01 816 1121 1.66666666666667e-01 816 1133 -1.66666666666667e-01 816 1119 -2.50000000000000e-01 816 1085 -8.33333333333333e-02 817 817 2.50000000000000e+00 817 1083 1.66666666666667e-01 817 1085 1.66666666666667e-01 817 1084 -7.50000000000000e-01 817 801 8.33333333333333e-02 817 815 -8.33333333333333e-02 817 1149 8.33333333333333e-02 817 814 -2.50000000000000e-01 817 813 1.66666666666667e-01 817 1151 -1.66666666666667e-01 817 804 -8.33333333333333e-02 817 1097 8.33333333333333e-02 817 806 1.66666666666667e-01 817 805 -2.50000000000000e-01 817 1095 -1.66666666666667e-01 817 1067 -8.33333333333333e-02 817 1065 1.66666666666667e-01 817 816 -3.33333333333333e-01 817 1066 -2.50000000000000e-01 817 729 -8.33333333333333e-02 817 800 -1.66666666666667e-01 817 798 8.33333333333333e-02 817 675 -8.33333333333333e-02 817 812 1.66666666666667e-01 817 818 -3.33333333333333e-01 817 1121 1.66666666666667e-01 817 1131 8.33333333333333e-02 817 1119 -8.33333333333333e-02 817 809 8.33333333333333e-02 817 677 -8.33333333333333e-02 817 811 -7.50000000000000e-01 817 807 -1.66666666666667e-01 817 810 1.66666666666667e-01 817 1133 8.33333333333333e-02 817 731 -8.33333333333333e-02 817 1120 -2.50000000000000e-01 817 803 8.33333333333333e-02 818 818 2.50000000000000e+00 818 802 8.33333333333333e-02 818 1085 -2.50000000000000e-01 818 1084 1.66666666666667e-01 818 801 -1.66666666666667e-01 818 814 -8.33333333333333e-02 818 813 1.66666666666667e-01 818 815 -2.50000000000000e-01 818 1150 -1.66666666666667e-01 818 1149 8.33333333333333e-02 818 1096 8.33333333333333e-02 818 804 1.66666666666667e-01 818 816 -3.33333333333333e-01 818 806 -7.50000000000000e-01 818 805 1.66666666666667e-01 818 675 -8.33333333333333e-02 818 1095 8.33333333333333e-02 818 729 -8.33333333333333e-02 818 1066 -8.33333333333333e-02 818 798 8.33333333333333e-02 818 1067 -2.50000000000000e-01 818 1065 1.66666666666667e-01 818 799 -1.66666666666667e-01 818 810 -8.33333333333333e-02 818 807 8.33333333333333e-02 818 811 1.66666666666667e-01 818 817 -3.33333333333333e-01 818 1120 1.66666666666667e-01 818 812 -2.50000000000000e-01 818 808 8.33333333333333e-02 818 676 -8.33333333333333e-02 818 1121 -7.50000000000000e-01 818 1083 -8.33333333333333e-02 818 1132 8.33333333333333e-02 818 730 -8.33333333333333e-02 818 1119 1.66666666666667e-01 818 1131 -1.66666666666667e-01 819 819 7.50000000000000e-01 819 679 4.16666666666667e-02 819 823 -8.33333333333333e-02 819 1070 -4.16666666666667e-02 819 820 -8.33333333333333e-02 819 1069 8.33333333333333e-02 819 712 4.16666666666667e-02 819 1068 -1.25000000000000e-01 819 830 -8.33333333333333e-02 819 1076 8.33333333333333e-02 819 680 4.16666666666667e-02 819 827 -8.33333333333333e-02 819 826 4.16666666666667e-02 819 829 -8.33333333333333e-02 819 678 -2.50000000000000e-01 819 821 -8.33333333333333e-02 819 1073 8.33333333333333e-02 819 713 4.16666666666667e-02 819 1072 -4.16666666666667e-02 819 1075 8.33333333333333e-02 819 824 4.16666666666667e-02 819 1071 -1.25000000000000e-01 819 711 -2.50000000000000e-01 820 820 6.66666666666667e-01 820 678 4.16666666666667e-02 820 822 -8.33333333333333e-02 820 1070 8.33333333333333e-02 820 1069 -3.75000000000000e-01 820 819 -8.33333333333333e-02 820 1068 8.33333333333333e-02 820 711 4.16666666666667e-02 820 827 4.16666666666667e-02 820 830 -8.33333333333333e-02 820 679 -8.33333333333333e-02 820 825 4.16666666666667e-02 820 828 -8.33333333333333e-02 820 1073 8.33333333333333e-02 820 1076 -1.66666666666667e-01 820 824 4.16666666666667e-02 820 1072 -1.25000000000000e-01 820 712 -8.33333333333333e-02 820 1071 -4.16666666666667e-02 820 1074 8.33333333333333e-02 821 821 6.66666666666667e-01 821 822 4.16666666666667e-02 821 1070 -1.25000000000000e-01 821 1069 8.33333333333333e-02 821 1068 -4.16666666666667e-02 821 826 4.16666666666667e-02 821 829 -8.33333333333333e-02 821 828 -8.33333333333333e-02 821 1074 8.33333333333333e-02 821 680 -8.33333333333333e-02 821 678 4.16666666666667e-02 821 825 -8.33333333333333e-02 821 823 4.16666666666667e-02 821 1073 -3.75000000000000e-01 821 713 -8.33333333333333e-02 821 1072 8.33333333333333e-02 821 1075 -1.66666666666667e-01 821 819 -8.33333333333333e-02 821 1071 8.33333333333333e-02 821 711 4.16666666666667e-02 822 822 5.83333333333333e-01 822 824 -1.66666666666667e-01 822 830 8.33333333333333e-02 822 1186 4.16666666666667e-02 822 829 -4.16666666666667e-02 822 680 -4.16666666666667e-02 822 821 4.16666666666667e-02 822 679 4.16666666666667e-02 822 820 -8.33333333333333e-02 822 678 -4.16666666666667e-02 822 828 -1.25000000000000e-01 822 734 -4.16666666666667e-02 822 1187 4.16666666666667e-02 822 823 -8.33333333333333e-02 822 733 4.16666666666667e-02 822 1069 8.33333333333333e-02 822 1070 8.33333333333333e-02 822 732 -4.16666666666667e-02 822 1068 -3.75000000000000e-01 823 823 5.00000000000000e-01 823 821 4.16666666666667e-02 823 1185 4.16666666666667e-02 823 828 -4.16666666666667e-02 823 680 4.16666666666667e-02 823 824 -8.33333333333333e-02 823 830 8.33333333333333e-02 823 679 -1.25000000000000e-01 823 829 -1.25000000000000e-01 823 678 4.16666666666667e-02 823 819 -8.33333333333333e-02 823 734 4.16666666666667e-02 823 1187 -8.33333333333333e-02 823 1070 -4.16666666666667e-02 823 733 -1.25000000000000e-01 823 1069 -1.25000000000000e-01 823 822 -8.33333333333333e-02 823 732 4.16666666666667e-02 823 1068 8.33333333333333e-02 824 824 5.83333333333333e-01 824 820 4.16666666666667e-02 824 1068 8.33333333333333e-02 824 822 -1.66666666666667e-01 824 828 8.33333333333333e-02 824 680 -4.16666666666667e-02 824 830 -3.75000000000000e-01 824 679 4.16666666666667e-02 824 823 -8.33333333333333e-02 824 829 8.33333333333333e-02 824 678 -4.16666666666667e-02 824 819 4.16666666666667e-02 824 1069 -4.16666666666667e-02 824 734 -4.16666666666667e-02 824 1070 -1.25000000000000e-01 824 733 4.16666666666667e-02 824 1186 -8.33333333333333e-02 824 732 -4.16666666666667e-02 824 1185 4.16666666666667e-02 825 825 5.83333333333333e-01 825 830 -4.16666666666667e-02 825 826 -1.66666666666667e-01 825 829 8.33333333333333e-02 825 1072 8.33333333333333e-02 825 680 4.16666666666667e-02 825 821 -8.33333333333333e-02 825 679 -4.16666666666667e-02 825 820 4.16666666666667e-02 825 678 -4.16666666666667e-02 825 828 -1.25000000000000e-01 825 827 -8.33333333333333e-02 825 737 4.16666666666667e-02 825 1073 8.33333333333333e-02 825 736 -4.16666666666667e-02 825 1192 4.16666666666667e-02 825 1193 4.16666666666667e-02 825 735 -4.16666666666667e-02 825 1071 -3.75000000000000e-01 826 826 5.83333333333333e-01 826 1073 -4.16666666666667e-02 826 825 -1.66666666666667e-01 826 828 8.33333333333333e-02 826 1071 8.33333333333333e-02 826 680 4.16666666666667e-02 826 827 -8.33333333333333e-02 826 830 8.33333333333333e-02 826 679 -4.16666666666667e-02 826 829 -3.75000000000000e-01 826 678 -4.16666666666667e-02 826 819 4.16666666666667e-02 826 737 4.16666666666667e-02 826 1193 -8.33333333333333e-02 826 821 4.16666666666667e-02 826 736 -4.16666666666667e-02 826 1072 -1.25000000000000e-01 826 735 -4.16666666666667e-02 826 1191 4.16666666666667e-02 827 827 5.00000000000000e-01 827 828 -4.16666666666667e-02 827 820 4.16666666666667e-02 827 1072 -4.16666666666667e-02 827 680 -1.25000000000000e-01 827 830 -1.25000000000000e-01 827 679 4.16666666666667e-02 827 826 -8.33333333333333e-02 827 829 8.33333333333333e-02 827 678 4.16666666666667e-02 827 819 -8.33333333333333e-02 827 1191 4.16666666666667e-02 827 737 -1.25000000000000e-01 827 1073 -1.25000000000000e-01 827 736 4.16666666666667e-02 827 1192 -8.33333333333333e-02 827 825 -8.33333333333333e-02 827 735 4.16666666666667e-02 827 1071 8.33333333333333e-02 828 828 1.25000000000000e+00 828 1069 8.33333333333333e-02 828 823 -4.16666666666667e-02 828 1070 -1.66666666666667e-01 828 680 4.16666666666667e-02 828 822 -1.25000000000000e-01 828 1187 -4.16666666666667e-02 828 740 4.16666666666667e-02 828 829 -1.66666666666667e-01 828 1186 8.33333333333333e-02 828 1185 -1.25000000000000e-01 828 827 -4.16666666666667e-02 828 826 8.33333333333333e-02 828 821 -8.33333333333333e-02 828 1073 8.33333333333333e-02 828 1075 1.66666666666667e-01 828 1072 -1.66666666666667e-01 828 679 4.16666666666667e-02 828 820 -8.33333333333333e-02 828 825 -1.25000000000000e-01 828 830 -1.66666666666667e-01 828 1193 8.33333333333333e-02 828 1076 1.66666666666667e-01 828 1192 -4.16666666666667e-02 828 739 4.16666666666667e-02 828 824 8.33333333333333e-02 828 1191 -1.25000000000000e-01 828 1074 -7.50000000000000e-01 829 829 1.25000000000000e+00 829 822 -4.16666666666667e-02 829 1070 8.33333333333333e-02 829 824 8.33333333333333e-02 829 823 -1.25000000000000e-01 829 1187 8.33333333333333e-02 829 1186 -3.75000000000000e-01 829 828 -1.66666666666667e-01 829 1185 8.33333333333333e-02 829 1076 -8.33333333333333e-02 829 830 -1.66666666666667e-01 829 821 -8.33333333333333e-02 829 1073 8.33333333333333e-02 829 825 8.33333333333333e-02 829 1074 1.66666666666667e-01 829 1071 -1.66666666666667e-01 829 680 -8.33333333333333e-02 829 827 8.33333333333333e-02 829 826 -3.75000000000000e-01 829 678 4.16666666666667e-02 829 819 -8.33333333333333e-02 829 1193 8.33333333333333e-02 829 740 -8.33333333333333e-02 829 1068 8.33333333333333e-02 829 1192 -1.25000000000000e-01 829 1075 -2.50000000000000e-01 829 1191 -4.16666666666667e-02 829 738 4.16666666666667e-02 830 830 1.25000000000000e+00 830 1069 8.33333333333333e-02 830 1068 -1.66666666666667e-01 830 824 -3.75000000000000e-01 830 823 8.33333333333333e-02 830 678 4.16666666666667e-02 830 1187 -1.25000000000000e-01 830 1186 8.33333333333333e-02 830 1185 -4.16666666666667e-02 830 738 4.16666666666667e-02 830 1075 -8.33333333333333e-02 830 829 -1.66666666666667e-01 830 825 -4.16666666666667e-02 830 820 -8.33333333333333e-02 830 1072 8.33333333333333e-02 830 819 -8.33333333333333e-02 830 1071 8.33333333333333e-02 830 827 -1.25000000000000e-01 830 679 -8.33333333333333e-02 830 826 8.33333333333333e-02 830 822 8.33333333333333e-02 830 1193 -3.75000000000000e-01 830 1076 -2.50000000000000e-01 830 1192 8.33333333333333e-02 830 739 -8.33333333333333e-02 830 828 -1.66666666666667e-01 830 1191 8.33333333333333e-02 830 1074 1.66666666666667e-01 831 831 5.00000000000000e-01 831 977 -4.16666666666667e-02 831 1204 4.16666666666667e-02 831 835 -4.16666666666667e-02 831 743 4.16666666666667e-02 831 1205 -8.33333333333333e-02 831 742 4.16666666666667e-02 831 832 -8.33333333333333e-02 831 976 8.33333333333333e-02 831 741 -1.25000000000000e-01 831 975 -1.25000000000000e-01 831 833 -8.33333333333333e-02 831 836 8.33333333333333e-02 831 834 -1.25000000000000e-01 831 17 4.16666666666667e-02 831 16 4.16666666666667e-02 831 226 -8.33333333333333e-02 831 227 4.16666666666667e-02 831 15 -1.25000000000000e-01 832 832 5.83333333333333e-01 832 977 8.33333333333333e-02 832 836 8.33333333333333e-02 832 1203 4.16666666666667e-02 832 834 -4.16666666666667e-02 832 743 -4.16666666666667e-02 832 1205 4.16666666666667e-02 832 742 -4.16666666666667e-02 832 976 -3.75000000000000e-01 832 741 4.16666666666667e-02 832 831 -8.33333333333333e-02 832 975 8.33333333333333e-02 832 833 -1.66666666666667e-01 832 835 -1.25000000000000e-01 832 17 -4.16666666666667e-02 832 227 4.16666666666667e-02 832 16 -4.16666666666667e-02 832 15 4.16666666666667e-02 832 225 -8.33333333333333e-02 833 833 5.83333333333333e-01 833 975 -4.16666666666667e-02 833 832 -1.66666666666667e-01 833 976 8.33333333333333e-02 833 835 8.33333333333333e-02 833 743 -4.16666666666667e-02 833 977 -1.25000000000000e-01 833 742 -4.16666666666667e-02 833 1204 4.16666666666667e-02 833 741 4.16666666666667e-02 833 1203 -8.33333333333333e-02 833 836 -3.75000000000000e-01 833 831 -8.33333333333333e-02 833 834 8.33333333333333e-02 833 225 4.16666666666667e-02 833 17 -4.16666666666667e-02 833 16 -4.16666666666667e-02 833 226 4.16666666666667e-02 833 15 4.16666666666667e-02 834 834 1.25000000000000e+00 834 976 8.33333333333333e-02 834 977 8.33333333333333e-02 834 833 8.33333333333333e-02 834 831 -1.25000000000000e-01 834 1205 8.33333333333333e-02 834 1204 8.33333333333333e-02 834 835 -1.66666666666667e-01 834 1203 -3.75000000000000e-01 834 980 -8.33333333333333e-02 834 836 -1.66666666666667e-01 834 979 1.66666666666667e-01 834 1211 8.33333333333333e-02 834 746 -8.33333333333333e-02 834 1210 -4.16666666666667e-02 834 745 4.16666666666667e-02 834 1209 -1.25000000000000e-01 834 832 -4.16666666666667e-02 834 978 -2.50000000000000e-01 834 227 -8.33333333333333e-02 834 590 8.33333333333333e-02 834 232 8.33333333333333e-02 834 589 -1.66666666666667e-01 834 233 8.33333333333333e-02 834 17 -8.33333333333333e-02 834 16 4.16666666666667e-02 834 226 -8.33333333333333e-02 834 231 -3.75000000000000e-01 835 835 1.25000000000000e+00 835 831 -4.16666666666667e-02 835 975 8.33333333333333e-02 835 977 -1.66666666666667e-01 835 832 -1.25000000000000e-01 835 1205 -4.16666666666667e-02 835 746 4.16666666666667e-02 835 1204 -1.25000000000000e-01 835 1203 8.33333333333333e-02 835 834 -1.66666666666667e-01 835 978 1.66666666666667e-01 835 1211 8.33333333333333e-02 835 836 -1.66666666666667e-01 835 980 1.66666666666667e-01 835 1210 -1.25000000000000e-01 835 833 8.33333333333333e-02 835 979 -7.50000000000000e-01 835 1209 -4.16666666666667e-02 835 744 4.16666666666667e-02 835 17 4.16666666666667e-02 835 233 -4.16666666666667e-02 835 231 8.33333333333333e-02 835 227 -8.33333333333333e-02 835 590 8.33333333333333e-02 835 588 -1.66666666666667e-01 835 232 -1.25000000000000e-01 835 15 4.16666666666667e-02 835 225 -8.33333333333333e-02 836 836 1.25000000000000e+00 836 976 -1.66666666666667e-01 836 975 8.33333333333333e-02 836 833 -3.75000000000000e-01 836 831 8.33333333333333e-02 836 1205 -1.25000000000000e-01 836 1204 -4.16666666666667e-02 836 745 4.16666666666667e-02 836 1203 8.33333333333333e-02 836 978 -8.33333333333333e-02 836 834 -1.66666666666667e-01 836 1211 -3.75000000000000e-01 836 832 8.33333333333333e-02 836 980 -2.50000000000000e-01 836 1210 8.33333333333333e-02 836 835 -1.66666666666667e-01 836 979 1.66666666666667e-01 836 1209 8.33333333333333e-02 836 744 -8.33333333333333e-02 836 16 4.16666666666667e-02 836 232 -4.16666666666667e-02 836 225 -8.33333333333333e-02 836 588 8.33333333333333e-02 836 226 -8.33333333333333e-02 836 589 8.33333333333333e-02 836 233 -1.25000000000000e-01 836 231 8.33333333333333e-02 836 15 -8.33333333333333e-02 837 837 1.25000000000000e+00 837 1207 8.33333333333333e-02 837 1208 8.33333333333333e-02 837 844 8.33333333333333e-02 837 843 -1.25000000000000e-01 837 839 -1.66666666666667e-01 837 992 8.33333333333333e-02 837 991 8.33333333333333e-02 837 990 -3.75000000000000e-01 837 997 -8.33333333333333e-02 837 838 -1.66666666666667e-01 837 842 8.33333333333333e-02 837 850 -8.33333333333333e-02 837 1090 8.33333333333333e-02 837 998 1.66666666666667e-01 837 1091 -1.66666666666667e-01 837 683 4.16666666666667e-02 837 851 -8.33333333333333e-02 837 841 8.33333333333333e-02 837 682 -8.33333333333333e-02 837 840 -3.75000000000000e-01 837 986 -4.16666666666667e-02 837 704 4.16666666666667e-02 837 985 8.33333333333333e-02 837 703 -8.33333333333333e-02 837 984 -1.25000000000000e-01 837 845 -4.16666666666667e-02 837 996 -2.50000000000000e-01 838 838 1.25000000000000e+00 838 1206 8.33333333333333e-02 838 1208 -1.66666666666667e-01 838 683 4.16666666666667e-02 838 844 -3.75000000000000e-01 838 843 8.33333333333333e-02 838 992 -4.16666666666667e-02 838 704 4.16666666666667e-02 838 991 -1.25000000000000e-01 838 990 8.33333333333333e-02 838 996 -8.33333333333333e-02 838 842 -4.16666666666667e-02 838 837 -1.66666666666667e-01 838 849 -8.33333333333333e-02 838 1089 8.33333333333333e-02 838 851 -8.33333333333333e-02 838 1091 8.33333333333333e-02 838 841 -1.25000000000000e-01 838 840 8.33333333333333e-02 838 681 -8.33333333333333e-02 838 986 8.33333333333333e-02 838 839 -1.66666666666667e-01 838 998 1.66666666666667e-01 838 985 -3.75000000000000e-01 838 845 8.33333333333333e-02 838 997 -2.50000000000000e-01 838 984 8.33333333333333e-02 838 702 -8.33333333333333e-02 839 839 1.25000000000000e+00 839 844 8.33333333333333e-02 839 1207 -1.66666666666667e-01 839 1206 8.33333333333333e-02 839 845 -1.25000000000000e-01 839 682 4.16666666666667e-02 839 992 -1.25000000000000e-01 839 991 -4.16666666666667e-02 839 703 4.16666666666667e-02 839 837 -1.66666666666667e-01 839 990 8.33333333333333e-02 839 841 -4.16666666666667e-02 839 840 8.33333333333333e-02 839 850 -8.33333333333333e-02 839 1090 8.33333333333333e-02 839 996 1.66666666666667e-01 839 1089 -1.66666666666667e-01 839 842 -1.25000000000000e-01 839 681 4.16666666666667e-02 839 849 -8.33333333333333e-02 839 986 -1.25000000000000e-01 839 843 -4.16666666666667e-02 839 998 -7.50000000000000e-01 839 985 8.33333333333333e-02 839 838 -1.66666666666667e-01 839 997 1.66666666666667e-01 839 984 -4.16666666666667e-02 839 702 4.16666666666667e-02 840 840 1.25000000000000e+00 840 847 -8.33333333333333e-02 840 1088 8.33333333333333e-02 840 1087 8.33333333333333e-02 840 1086 -3.75000000000000e-01 840 854 -8.33333333333333e-02 840 853 -8.33333333333333e-02 840 1094 -1.66666666666667e-01 840 1093 8.33333333333333e-02 840 839 8.33333333333333e-02 840 842 -1.66666666666667e-01 840 1091 1.66666666666667e-01 840 850 8.33333333333333e-02 840 1090 -8.33333333333333e-02 840 716 -4.16666666666667e-02 840 986 4.16666666666667e-02 840 715 8.33333333333333e-02 840 985 -8.33333333333333e-02 840 714 -1.25000000000000e-01 840 1089 -2.50000000000000e-01 840 683 -4.16666666666667e-02 840 851 8.33333333333333e-02 840 841 -1.66666666666667e-01 840 682 8.33333333333333e-02 840 838 8.33333333333333e-02 840 848 4.16666666666667e-02 840 681 -1.25000000000000e-01 840 837 -3.75000000000000e-01 841 841 1.25000000000000e+00 841 846 -8.33333333333333e-02 841 1088 -4.16666666666667e-02 841 1087 -1.25000000000000e-01 841 1086 8.33333333333333e-02 841 854 -8.33333333333333e-02 841 1094 8.33333333333333e-02 841 852 -8.33333333333333e-02 841 1092 8.33333333333333e-02 841 839 -4.16666666666667e-02 841 986 4.16666666666667e-02 841 849 8.33333333333333e-02 841 1089 -8.33333333333333e-02 841 716 8.33333333333333e-02 841 842 -1.66666666666667e-01 841 1091 1.66666666666667e-01 841 715 -3.75000000000000e-01 841 1090 -2.50000000000000e-01 841 714 8.33333333333333e-02 841 984 -8.33333333333333e-02 841 683 8.33333333333333e-02 841 851 -1.66666666666667e-01 841 848 4.16666666666667e-02 841 682 -3.75000000000000e-01 841 838 -1.25000000000000e-01 841 840 -1.66666666666667e-01 841 681 8.33333333333333e-02 841 837 8.33333333333333e-02 842 842 1.25000000000000e+00 842 847 4.16666666666667e-02 842 1088 -1.25000000000000e-01 842 1087 -4.16666666666667e-02 842 1086 8.33333333333333e-02 842 852 -8.33333333333333e-02 842 853 -8.33333333333333e-02 842 1093 8.33333333333333e-02 842 1092 -1.66666666666667e-01 842 838 -4.16666666666667e-02 842 985 4.16666666666667e-02 842 837 8.33333333333333e-02 842 840 -1.66666666666667e-01 842 1089 1.66666666666667e-01 842 716 -1.25000000000000e-01 842 1091 -7.50000000000000e-01 842 715 8.33333333333333e-02 842 841 -1.66666666666667e-01 842 1090 1.66666666666667e-01 842 714 -4.16666666666667e-02 842 984 4.16666666666667e-02 842 846 4.16666666666667e-02 842 683 -1.25000000000000e-01 842 839 -1.25000000000000e-01 842 682 8.33333333333333e-02 842 850 -1.66666666666667e-01 842 681 -4.16666666666667e-02 842 849 8.33333333333333e-02 843 843 5.00000000000000e-01 843 839 -4.16666666666667e-02 843 850 4.16666666666667e-02 843 1207 -4.16666666666667e-02 843 683 4.16666666666667e-02 843 851 -8.33333333333333e-02 843 682 4.16666666666667e-02 843 844 -8.33333333333333e-02 843 838 8.33333333333333e-02 843 681 -1.25000000000000e-01 843 837 -1.25000000000000e-01 843 845 -8.33333333333333e-02 843 743 4.16666666666667e-02 843 1208 8.33333333333333e-02 843 742 4.16666666666667e-02 843 991 -8.33333333333333e-02 843 992 4.16666666666667e-02 843 741 -1.25000000000000e-01 843 1206 -1.25000000000000e-01 844 844 5.83333333333333e-01 844 839 8.33333333333333e-02 844 1208 8.33333333333333e-02 844 849 4.16666666666667e-02 844 1206 -4.16666666666667e-02 844 683 -4.16666666666667e-02 844 851 4.16666666666667e-02 844 682 -4.16666666666667e-02 844 838 -3.75000000000000e-01 844 681 4.16666666666667e-02 844 843 -8.33333333333333e-02 844 837 8.33333333333333e-02 844 743 -4.16666666666667e-02 844 992 4.16666666666667e-02 844 845 -1.66666666666667e-01 844 742 -4.16666666666667e-02 844 1207 -1.25000000000000e-01 844 741 4.16666666666667e-02 844 990 -8.33333333333333e-02 845 845 5.83333333333333e-01 845 837 -4.16666666666667e-02 845 844 -1.66666666666667e-01 845 838 8.33333333333333e-02 845 1207 8.33333333333333e-02 845 683 -4.16666666666667e-02 845 839 -1.25000000000000e-01 845 682 -4.16666666666667e-02 845 850 4.16666666666667e-02 845 681 4.16666666666667e-02 845 849 -8.33333333333333e-02 845 990 4.16666666666667e-02 845 743 -4.16666666666667e-02 845 1208 -3.75000000000000e-01 845 742 -4.16666666666667e-02 845 991 4.16666666666667e-02 845 843 -8.33333333333333e-02 845 741 4.16666666666667e-02 845 1206 8.33333333333333e-02 846 846 5.00000000000000e-01 846 1088 -4.16666666666667e-02 846 1222 4.16666666666667e-02 846 853 -4.16666666666667e-02 846 749 4.16666666666667e-02 846 1223 -8.33333333333333e-02 846 748 4.16666666666667e-02 846 847 -8.33333333333333e-02 846 1087 8.33333333333333e-02 846 747 -1.25000000000000e-01 846 1086 -1.25000000000000e-01 846 848 -8.33333333333333e-02 846 683 4.16666666666667e-02 846 854 8.33333333333333e-02 846 682 4.16666666666667e-02 846 841 -8.33333333333333e-02 846 842 4.16666666666667e-02 846 681 -1.25000000000000e-01 846 852 -1.25000000000000e-01 847 847 5.83333333333333e-01 847 1088 8.33333333333333e-02 847 854 8.33333333333333e-02 847 1221 4.16666666666667e-02 847 852 -4.16666666666667e-02 847 749 -4.16666666666667e-02 847 1223 4.16666666666667e-02 847 748 -4.16666666666667e-02 847 1087 -3.75000000000000e-01 847 747 4.16666666666667e-02 847 846 -8.33333333333333e-02 847 1086 8.33333333333333e-02 847 683 -4.16666666666667e-02 847 842 4.16666666666667e-02 847 848 -1.66666666666667e-01 847 682 -4.16666666666667e-02 847 853 -1.25000000000000e-01 847 681 4.16666666666667e-02 847 840 -8.33333333333333e-02 848 848 5.83333333333333e-01 848 1086 -4.16666666666667e-02 848 847 -1.66666666666667e-01 848 1087 8.33333333333333e-02 848 853 8.33333333333333e-02 848 749 -4.16666666666667e-02 848 1088 -1.25000000000000e-01 848 748 -4.16666666666667e-02 848 1222 4.16666666666667e-02 848 747 4.16666666666667e-02 848 1221 -8.33333333333333e-02 848 840 4.16666666666667e-02 848 683 -4.16666666666667e-02 848 854 -3.75000000000000e-01 848 682 -4.16666666666667e-02 848 841 4.16666666666667e-02 848 846 -8.33333333333333e-02 848 681 4.16666666666667e-02 848 852 8.33333333333333e-02 849 849 1.25000000000000e+00 849 850 -1.66666666666667e-01 849 1229 -8.33333333333333e-02 849 751 -4.16666666666667e-02 849 1228 4.16666666666667e-02 849 854 8.33333333333333e-02 849 682 -4.16666666666667e-02 849 852 -3.75000000000000e-01 849 844 4.16666666666667e-02 849 683 8.33333333333333e-02 849 845 -8.33333333333333e-02 849 851 -1.66666666666667e-01 849 1208 8.33333333333333e-02 849 752 8.33333333333333e-02 849 1207 8.33333333333333e-02 849 1206 -3.75000000000000e-01 849 838 -8.33333333333333e-02 849 841 8.33333333333333e-02 849 842 8.33333333333333e-02 849 839 -8.33333333333333e-02 849 681 -1.25000000000000e-01 849 1091 -8.33333333333333e-02 849 998 8.33333333333333e-02 849 1090 1.66666666666667e-01 849 997 -1.66666666666667e-01 849 1089 -2.50000000000000e-01 849 853 8.33333333333333e-02 849 750 -1.25000000000000e-01 850 850 1.25000000000000e+00 850 1229 4.16666666666667e-02 850 852 8.33333333333333e-02 850 849 -1.66666666666667e-01 850 750 -4.16666666666667e-02 850 1227 4.16666666666667e-02 850 853 -1.25000000000000e-01 850 681 -4.16666666666667e-02 850 843 4.16666666666667e-02 850 845 4.16666666666667e-02 850 1208 -4.16666666666667e-02 850 1207 -1.25000000000000e-01 850 1206 8.33333333333333e-02 850 837 -8.33333333333333e-02 850 840 8.33333333333333e-02 850 839 -8.33333333333333e-02 850 998 8.33333333333333e-02 850 842 -1.66666666666667e-01 850 683 8.33333333333333e-02 850 682 -1.25000000000000e-01 850 1091 1.66666666666667e-01 850 851 -1.66666666666667e-01 850 752 8.33333333333333e-02 850 1090 -7.50000000000000e-01 850 854 -4.16666666666667e-02 850 751 -1.25000000000000e-01 850 1089 1.66666666666667e-01 850 996 -1.66666666666667e-01 851 851 1.25000000000000e+00 851 1228 4.16666666666667e-02 851 1227 -8.33333333333333e-02 851 854 -1.25000000000000e-01 851 852 8.33333333333333e-02 851 844 4.16666666666667e-02 851 681 8.33333333333333e-02 851 843 -8.33333333333333e-02 851 1208 -1.25000000000000e-01 851 1207 -4.16666666666667e-02 851 849 -1.66666666666667e-01 851 1206 8.33333333333333e-02 851 750 8.33333333333333e-02 851 838 -8.33333333333333e-02 851 997 8.33333333333333e-02 851 683 -3.75000000000000e-01 851 841 -1.66666666666667e-01 851 682 8.33333333333333e-02 851 840 8.33333333333333e-02 851 837 -8.33333333333333e-02 851 1091 -2.50000000000000e-01 851 853 -4.16666666666667e-02 851 752 -3.75000000000000e-01 851 1090 1.66666666666667e-01 851 850 -1.66666666666667e-01 851 751 8.33333333333333e-02 851 1089 -8.33333333333333e-02 851 996 8.33333333333333e-02 852 852 1.25000000000000e+00 852 1087 8.33333333333333e-02 852 1088 8.33333333333333e-02 852 848 8.33333333333333e-02 852 846 -1.25000000000000e-01 852 1223 8.33333333333333e-02 852 1222 8.33333333333333e-02 852 853 -1.66666666666667e-01 852 1221 -3.75000000000000e-01 852 1094 -8.33333333333333e-02 852 854 -1.66666666666667e-01 852 842 -8.33333333333333e-02 852 1091 8.33333333333333e-02 852 850 8.33333333333333e-02 852 1093 1.66666666666667e-01 852 1090 -1.66666666666667e-01 852 851 8.33333333333333e-02 852 683 -8.33333333333333e-02 852 682 4.16666666666667e-02 852 841 -8.33333333333333e-02 852 849 -3.75000000000000e-01 852 1229 8.33333333333333e-02 852 755 -8.33333333333333e-02 852 1228 -4.16666666666667e-02 852 754 4.16666666666667e-02 852 1227 -1.25000000000000e-01 852 847 -4.16666666666667e-02 852 1092 -2.50000000000000e-01 853 853 1.25000000000000e+00 853 846 -4.16666666666667e-02 853 1086 8.33333333333333e-02 853 1088 -1.66666666666667e-01 853 683 4.16666666666667e-02 853 847 -1.25000000000000e-01 853 1223 -4.16666666666667e-02 853 755 4.16666666666667e-02 853 1222 -1.25000000000000e-01 853 1221 8.33333333333333e-02 853 852 -1.66666666666667e-01 853 851 -4.16666666666667e-02 853 849 8.33333333333333e-02 853 842 -8.33333333333333e-02 853 1091 8.33333333333333e-02 853 1092 1.66666666666667e-01 853 1089 -1.66666666666667e-01 853 850 -1.25000000000000e-01 853 681 4.16666666666667e-02 853 840 -8.33333333333333e-02 853 1229 8.33333333333333e-02 853 854 -1.66666666666667e-01 853 1094 1.66666666666667e-01 853 1228 -1.25000000000000e-01 853 848 8.33333333333333e-02 853 1093 -7.50000000000000e-01 853 1227 -4.16666666666667e-02 853 753 4.16666666666667e-02 854 854 1.25000000000000e+00 854 1087 -1.66666666666667e-01 854 1086 8.33333333333333e-02 854 848 -3.75000000000000e-01 854 682 4.16666666666667e-02 854 846 8.33333333333333e-02 854 1223 -1.25000000000000e-01 854 1222 -4.16666666666667e-02 854 754 4.16666666666667e-02 854 1221 8.33333333333333e-02 854 1092 -8.33333333333333e-02 854 850 -4.16666666666667e-02 854 852 -1.66666666666667e-01 854 840 -8.33333333333333e-02 854 1089 8.33333333333333e-02 854 841 -8.33333333333333e-02 854 1090 8.33333333333333e-02 854 851 -1.25000000000000e-01 854 849 8.33333333333333e-02 854 681 -8.33333333333333e-02 854 1229 -3.75000000000000e-01 854 847 8.33333333333333e-02 854 1094 -2.50000000000000e-01 854 1228 8.33333333333333e-02 854 853 -1.66666666666667e-01 854 1093 1.66666666666667e-01 854 1227 8.33333333333333e-02 854 753 -8.33333333333333e-02 855 855 1.25000000000000e+00 855 1225 8.33333333333333e-02 855 1226 8.33333333333333e-02 855 862 8.33333333333333e-02 855 861 -1.25000000000000e-01 855 857 -1.66666666666667e-01 855 1106 8.33333333333333e-02 855 1105 8.33333333333333e-02 855 1104 -3.75000000000000e-01 855 1111 -8.33333333333333e-02 855 856 -1.66666666666667e-01 855 860 8.33333333333333e-02 855 865 -8.33333333333333e-02 855 1189 8.33333333333333e-02 855 1112 1.66666666666667e-01 855 1190 -1.66666666666667e-01 855 686 4.16666666666667e-02 855 866 -8.33333333333333e-02 855 859 8.33333333333333e-02 855 685 -8.33333333333333e-02 855 858 -3.75000000000000e-01 855 1100 -4.16666666666667e-02 855 719 4.16666666666667e-02 855 1099 8.33333333333333e-02 855 718 -8.33333333333333e-02 855 1098 -1.25000000000000e-01 855 863 -4.16666666666667e-02 855 1110 -2.50000000000000e-01 856 856 1.25000000000000e+00 856 1224 8.33333333333333e-02 856 1226 -1.66666666666667e-01 856 686 4.16666666666667e-02 856 862 -3.75000000000000e-01 856 861 8.33333333333333e-02 856 1106 -4.16666666666667e-02 856 719 4.16666666666667e-02 856 1105 -1.25000000000000e-01 856 1104 8.33333333333333e-02 856 1110 -8.33333333333333e-02 856 860 -4.16666666666667e-02 856 855 -1.66666666666667e-01 856 864 -8.33333333333333e-02 856 1188 8.33333333333333e-02 856 866 -8.33333333333333e-02 856 1190 8.33333333333333e-02 856 859 -1.25000000000000e-01 856 858 8.33333333333333e-02 856 684 -8.33333333333333e-02 856 1100 8.33333333333333e-02 856 857 -1.66666666666667e-01 856 1112 1.66666666666667e-01 856 1099 -3.75000000000000e-01 856 863 8.33333333333333e-02 856 1111 -2.50000000000000e-01 856 1098 8.33333333333333e-02 856 717 -8.33333333333333e-02 857 857 1.25000000000000e+00 857 862 8.33333333333333e-02 857 1225 -1.66666666666667e-01 857 1224 8.33333333333333e-02 857 863 -1.25000000000000e-01 857 685 4.16666666666667e-02 857 1106 -1.25000000000000e-01 857 1105 -4.16666666666667e-02 857 718 4.16666666666667e-02 857 855 -1.66666666666667e-01 857 1104 8.33333333333333e-02 857 859 -4.16666666666667e-02 857 858 8.33333333333333e-02 857 865 -8.33333333333333e-02 857 1189 8.33333333333333e-02 857 1110 1.66666666666667e-01 857 1188 -1.66666666666667e-01 857 860 -1.25000000000000e-01 857 684 4.16666666666667e-02 857 864 -8.33333333333333e-02 857 1100 -1.25000000000000e-01 857 861 -4.16666666666667e-02 857 1112 -7.50000000000000e-01 857 1099 8.33333333333333e-02 857 856 -1.66666666666667e-01 857 1111 1.66666666666667e-01 857 1098 -4.16666666666667e-02 857 717 4.16666666666667e-02 858 858 5.83333333333333e-01 858 860 -1.66666666666667e-01 858 1190 8.33333333333333e-02 858 865 4.16666666666667e-02 858 1189 -4.16666666666667e-02 858 734 -4.16666666666667e-02 858 1100 4.16666666666667e-02 858 733 4.16666666666667e-02 858 1099 -8.33333333333333e-02 858 732 -4.16666666666667e-02 858 1188 -1.25000000000000e-01 858 686 -4.16666666666667e-02 858 866 4.16666666666667e-02 858 859 -8.33333333333333e-02 858 685 4.16666666666667e-02 858 856 8.33333333333333e-02 858 857 8.33333333333333e-02 858 684 -4.16666666666667e-02 858 855 -3.75000000000000e-01 859 859 5.00000000000000e-01 859 1100 4.16666666666667e-02 859 864 4.16666666666667e-02 859 1188 -4.16666666666667e-02 859 734 4.16666666666667e-02 859 860 -8.33333333333333e-02 859 1190 8.33333333333333e-02 859 733 -1.25000000000000e-01 859 1189 -1.25000000000000e-01 859 732 4.16666666666667e-02 859 1098 -8.33333333333333e-02 859 686 4.16666666666667e-02 859 866 -8.33333333333333e-02 859 857 -4.16666666666667e-02 859 685 -1.25000000000000e-01 859 856 -1.25000000000000e-01 859 858 -8.33333333333333e-02 859 684 4.16666666666667e-02 859 855 8.33333333333333e-02 860 860 5.83333333333333e-01 860 1099 4.16666666666667e-02 860 855 8.33333333333333e-02 860 858 -1.66666666666667e-01 860 1188 8.33333333333333e-02 860 734 -4.16666666666667e-02 860 1190 -3.75000000000000e-01 860 733 4.16666666666667e-02 860 859 -8.33333333333333e-02 860 1189 8.33333333333333e-02 860 732 -4.16666666666667e-02 860 1098 4.16666666666667e-02 860 856 -4.16666666666667e-02 860 686 -4.16666666666667e-02 860 857 -1.25000000000000e-01 860 685 4.16666666666667e-02 860 865 -8.33333333333333e-02 860 684 -4.16666666666667e-02 860 864 4.16666666666667e-02 861 861 5.00000000000000e-01 861 857 -4.16666666666667e-02 861 865 4.16666666666667e-02 861 1225 -4.16666666666667e-02 861 686 4.16666666666667e-02 861 866 -8.33333333333333e-02 861 685 4.16666666666667e-02 861 862 -8.33333333333333e-02 861 856 8.33333333333333e-02 861 684 -1.25000000000000e-01 861 855 -1.25000000000000e-01 861 863 -8.33333333333333e-02 861 749 4.16666666666667e-02 861 1226 8.33333333333333e-02 861 748 4.16666666666667e-02 861 1105 -8.33333333333333e-02 861 1106 4.16666666666667e-02 861 747 -1.25000000000000e-01 861 1224 -1.25000000000000e-01 862 862 5.83333333333333e-01 862 857 8.33333333333333e-02 862 1226 8.33333333333333e-02 862 864 4.16666666666667e-02 862 1224 -4.16666666666667e-02 862 686 -4.16666666666667e-02 862 866 4.16666666666667e-02 862 685 -4.16666666666667e-02 862 856 -3.75000000000000e-01 862 684 4.16666666666667e-02 862 861 -8.33333333333333e-02 862 855 8.33333333333333e-02 862 749 -4.16666666666667e-02 862 1106 4.16666666666667e-02 862 863 -1.66666666666667e-01 862 748 -4.16666666666667e-02 862 1225 -1.25000000000000e-01 862 747 4.16666666666667e-02 862 1104 -8.33333333333333e-02 863 863 5.83333333333333e-01 863 855 -4.16666666666667e-02 863 862 -1.66666666666667e-01 863 856 8.33333333333333e-02 863 1225 8.33333333333333e-02 863 686 -4.16666666666667e-02 863 857 -1.25000000000000e-01 863 685 -4.16666666666667e-02 863 865 4.16666666666667e-02 863 684 4.16666666666667e-02 863 864 -8.33333333333333e-02 863 1104 4.16666666666667e-02 863 749 -4.16666666666667e-02 863 1226 -3.75000000000000e-01 863 748 -4.16666666666667e-02 863 1105 4.16666666666667e-02 863 861 -8.33333333333333e-02 863 747 4.16666666666667e-02 863 1224 8.33333333333333e-02 864 864 6.66666666666667e-01 864 686 4.16666666666667e-02 864 863 -8.33333333333333e-02 864 866 -8.33333333333333e-02 864 1226 8.33333333333333e-02 864 758 4.16666666666667e-02 864 1225 8.33333333333333e-02 864 1224 -3.75000000000000e-01 864 856 -8.33333333333333e-02 864 859 4.16666666666667e-02 864 860 4.16666666666667e-02 864 857 -8.33333333333333e-02 864 684 -8.33333333333333e-02 864 1190 -4.16666666666667e-02 864 1112 8.33333333333333e-02 864 1189 8.33333333333333e-02 864 1111 -1.66666666666667e-01 864 1188 -1.25000000000000e-01 864 862 4.16666666666667e-02 864 756 -8.33333333333333e-02 865 865 6.66666666666667e-01 865 863 4.16666666666667e-02 865 1226 -4.16666666666667e-02 865 1225 -1.25000000000000e-01 865 1224 8.33333333333333e-02 865 855 -8.33333333333333e-02 865 858 4.16666666666667e-02 865 857 -8.33333333333333e-02 865 1112 8.33333333333333e-02 865 860 -8.33333333333333e-02 865 686 4.16666666666667e-02 865 685 -8.33333333333333e-02 865 1190 8.33333333333333e-02 865 866 -8.33333333333333e-02 865 758 4.16666666666667e-02 865 1189 -3.75000000000000e-01 865 861 4.16666666666667e-02 865 757 -8.33333333333333e-02 865 1188 8.33333333333333e-02 865 1110 -1.66666666666667e-01 866 866 7.50000000000000e-01 866 684 4.16666666666667e-02 866 861 -8.33333333333333e-02 866 1226 -1.25000000000000e-01 866 1225 -4.16666666666667e-02 866 864 -8.33333333333333e-02 866 1224 8.33333333333333e-02 866 756 4.16666666666667e-02 866 856 -8.33333333333333e-02 866 1111 8.33333333333333e-02 866 686 -2.50000000000000e-01 866 859 -8.33333333333333e-02 866 685 4.16666666666667e-02 866 858 4.16666666666667e-02 866 855 -8.33333333333333e-02 866 1190 -1.25000000000000e-01 866 862 4.16666666666667e-02 866 758 -2.50000000000000e-01 866 1189 8.33333333333333e-02 866 865 -8.33333333333333e-02 866 757 4.16666666666667e-02 866 1188 -4.16666666666667e-02 866 1110 8.33333333333333e-02 867 867 5.00000000000000e-01 867 1241 4.16666666666667e-02 867 872 -4.16666666666667e-02 867 868 -8.33333333333333e-02 867 871 8.33333333333333e-02 867 870 -1.25000000000000e-01 867 869 -8.33333333333333e-02 867 761 4.16666666666667e-02 867 1007 8.33333333333333e-02 867 760 4.16666666666667e-02 867 1240 -8.33333333333333e-02 867 1006 -4.16666666666667e-02 867 759 -1.25000000000000e-01 867 1005 -1.25000000000000e-01 867 268 4.16666666666667e-02 867 26 4.16666666666667e-02 867 269 -8.33333333333333e-02 867 25 4.16666666666667e-02 867 24 -1.25000000000000e-01 868 868 5.83333333333333e-01 868 1007 8.33333333333333e-02 868 869 -1.66666666666667e-01 868 872 8.33333333333333e-02 868 871 -3.75000000000000e-01 868 867 -8.33333333333333e-02 868 870 8.33333333333333e-02 868 761 -4.16666666666667e-02 868 1241 4.16666666666667e-02 868 1005 -4.16666666666667e-02 868 760 -4.16666666666667e-02 868 1006 -1.25000000000000e-01 868 759 4.16666666666667e-02 868 1239 -8.33333333333333e-02 868 267 4.16666666666667e-02 868 26 -4.16666666666667e-02 868 269 4.16666666666667e-02 868 25 -4.16666666666667e-02 868 24 4.16666666666667e-02 869 869 5.83333333333333e-01 869 868 -1.66666666666667e-01 869 871 8.33333333333333e-02 869 1239 4.16666666666667e-02 869 870 -4.16666666666667e-02 869 872 -1.25000000000000e-01 869 1006 8.33333333333333e-02 869 761 -4.16666666666667e-02 869 1007 -3.75000000000000e-01 869 760 -4.16666666666667e-02 869 1240 4.16666666666667e-02 869 867 -8.33333333333333e-02 869 759 4.16666666666667e-02 869 1005 8.33333333333333e-02 869 26 -4.16666666666667e-02 869 25 -4.16666666666667e-02 869 268 4.16666666666667e-02 869 24 4.16666666666667e-02 869 267 -8.33333333333333e-02 870 870 1.25000000000000e+00 870 1247 -4.16666666666667e-02 870 764 4.16666666666667e-02 870 1246 8.33333333333333e-02 870 1245 -1.25000000000000e-01 870 1007 8.33333333333333e-02 870 869 -4.16666666666667e-02 870 871 -1.66666666666667e-01 870 1006 8.33333333333333e-02 870 1009 -8.33333333333333e-02 870 868 8.33333333333333e-02 870 867 -1.25000000000000e-01 870 872 -1.66666666666667e-01 870 1241 8.33333333333333e-02 870 1010 1.66666666666667e-01 870 1240 8.33333333333333e-02 870 763 -8.33333333333333e-02 870 1239 -3.75000000000000e-01 870 1008 -2.50000000000000e-01 870 596 -1.66666666666667e-01 870 595 8.33333333333333e-02 870 26 4.16666666666667e-02 870 274 8.33333333333333e-02 870 273 -3.75000000000000e-01 870 269 -8.33333333333333e-02 870 268 -8.33333333333333e-02 870 25 -8.33333333333333e-02 870 275 8.33333333333333e-02 871 871 1.25000000000000e+00 871 1247 8.33333333333333e-02 871 872 -1.66666666666667e-01 871 1246 -3.75000000000000e-01 871 1245 8.33333333333333e-02 871 869 8.33333333333333e-02 871 870 -1.66666666666667e-01 871 1007 -1.66666666666667e-01 871 1010 1.66666666666667e-01 871 1005 8.33333333333333e-02 871 1008 -8.33333333333333e-02 871 868 -3.75000000000000e-01 871 867 8.33333333333333e-02 871 1241 -4.16666666666667e-02 871 764 4.16666666666667e-02 871 1240 -1.25000000000000e-01 871 1009 -2.50000000000000e-01 871 1239 8.33333333333333e-02 871 762 -8.33333333333333e-02 871 596 8.33333333333333e-02 871 594 8.33333333333333e-02 871 274 -1.25000000000000e-01 871 273 8.33333333333333e-02 871 267 -8.33333333333333e-02 871 26 4.16666666666667e-02 871 269 -8.33333333333333e-02 871 24 -8.33333333333333e-02 871 275 -4.16666666666667e-02 872 872 1.25000000000000e+00 872 1247 -1.25000000000000e-01 872 1246 8.33333333333333e-02 872 871 -1.66666666666667e-01 872 1245 -4.16666666666667e-02 872 762 4.16666666666667e-02 872 868 8.33333333333333e-02 872 1005 8.33333333333333e-02 872 867 -4.16666666666667e-02 872 1006 -1.66666666666667e-01 872 1009 1.66666666666667e-01 872 869 -1.25000000000000e-01 872 1241 -1.25000000000000e-01 872 1010 -7.50000000000000e-01 872 1240 -4.16666666666667e-02 872 763 4.16666666666667e-02 872 870 -1.66666666666667e-01 872 1239 8.33333333333333e-02 872 1008 1.66666666666667e-01 872 595 8.33333333333333e-02 872 273 8.33333333333333e-02 872 594 -1.66666666666667e-01 872 275 -1.25000000000000e-01 872 24 4.16666666666667e-02 872 267 -8.33333333333333e-02 872 25 4.16666666666667e-02 872 268 -8.33333333333333e-02 872 274 -4.16666666666667e-02 873 873 1.25000000000000e+00 873 1127 8.33333333333333e-02 873 1126 -1.66666666666667e-01 873 878 8.33333333333333e-02 873 688 4.16666666666667e-02 873 876 -3.75000000000000e-01 873 1016 8.33333333333333e-02 873 1015 -4.16666666666667e-02 873 706 4.16666666666667e-02 873 1014 -1.25000000000000e-01 873 1028 -8.33333333333333e-02 873 875 -1.66666666666667e-01 873 880 -4.16666666666667e-02 873 887 -8.33333333333333e-02 873 1244 8.33333333333333e-02 873 886 -8.33333333333333e-02 873 1243 8.33333333333333e-02 873 881 8.33333333333333e-02 873 689 -8.33333333333333e-02 873 879 -1.25000000000000e-01 873 1022 8.33333333333333e-02 873 707 -8.33333333333333e-02 873 1021 8.33333333333333e-02 873 874 -1.66666666666667e-01 873 1027 1.66666666666667e-01 873 1020 -3.75000000000000e-01 873 877 8.33333333333333e-02 873 1026 -2.50000000000000e-01 874 874 1.25000000000000e+00 874 1127 8.33333333333333e-02 874 876 8.33333333333333e-02 874 1125 -1.66666666666667e-01 874 877 -1.25000000000000e-01 874 687 4.16666666666667e-02 874 1016 8.33333333333333e-02 874 875 -1.66666666666667e-01 874 1015 -1.25000000000000e-01 874 1014 -4.16666666666667e-02 874 705 4.16666666666667e-02 874 879 -4.16666666666667e-02 874 881 8.33333333333333e-02 874 1028 1.66666666666667e-01 874 1244 -1.66666666666667e-01 874 885 -8.33333333333333e-02 874 1242 8.33333333333333e-02 874 689 4.16666666666667e-02 874 887 -8.33333333333333e-02 874 880 -1.25000000000000e-01 874 1022 -4.16666666666667e-02 874 707 4.16666666666667e-02 874 1021 -1.25000000000000e-01 874 878 -4.16666666666667e-02 874 1027 -7.50000000000000e-01 874 1020 8.33333333333333e-02 874 873 -1.66666666666667e-01 874 1026 1.66666666666667e-01 875 875 1.25000000000000e+00 875 1126 8.33333333333333e-02 875 1125 8.33333333333333e-02 875 878 -1.25000000000000e-01 875 876 8.33333333333333e-02 875 1016 -3.75000000000000e-01 875 1015 8.33333333333333e-02 875 874 -1.66666666666667e-01 875 1014 8.33333333333333e-02 875 1026 -8.33333333333333e-02 875 873 -1.66666666666667e-01 875 880 8.33333333333333e-02 875 885 -8.33333333333333e-02 875 1242 8.33333333333333e-02 875 1027 1.66666666666667e-01 875 1243 -1.66666666666667e-01 875 881 -3.75000000000000e-01 875 688 4.16666666666667e-02 875 886 -8.33333333333333e-02 875 879 8.33333333333333e-02 875 687 -8.33333333333333e-02 875 1022 -1.25000000000000e-01 875 877 -4.16666666666667e-02 875 1028 -2.50000000000000e-01 875 1021 -4.16666666666667e-02 875 706 4.16666666666667e-02 875 1020 8.33333333333333e-02 875 705 -8.33333333333333e-02 876 876 1.25000000000000e+00 876 890 -8.33333333333333e-02 876 883 4.16666666666667e-02 876 889 -8.33333333333333e-02 876 884 -8.33333333333333e-02 876 1124 8.33333333333333e-02 876 1123 8.33333333333333e-02 876 1129 -1.66666666666667e-01 876 1122 -3.75000000000000e-01 876 887 8.33333333333333e-02 876 1127 -8.33333333333333e-02 876 877 -1.66666666666667e-01 876 1126 1.66666666666667e-01 876 874 8.33333333333333e-02 876 722 8.33333333333333e-02 876 1016 -8.33333333333333e-02 876 721 -4.16666666666667e-02 876 1015 4.16666666666667e-02 876 720 -1.25000000000000e-01 876 1125 -2.50000000000000e-01 876 878 -1.66666666666667e-01 876 689 8.33333333333333e-02 876 875 8.33333333333333e-02 876 688 -4.16666666666667e-02 876 886 8.33333333333333e-02 876 1130 8.33333333333333e-02 876 687 -1.25000000000000e-01 876 873 -3.75000000000000e-01 877 877 1.25000000000000e+00 877 888 -8.33333333333333e-02 877 884 4.16666666666667e-02 877 890 -8.33333333333333e-02 877 1124 -4.16666666666667e-02 877 1130 8.33333333333333e-02 877 1123 -1.25000000000000e-01 877 1122 8.33333333333333e-02 877 1128 -1.66666666666667e-01 877 1016 4.16666666666667e-02 877 875 -4.16666666666667e-02 877 876 -1.66666666666667e-01 877 1125 1.66666666666667e-01 877 873 8.33333333333333e-02 877 722 8.33333333333333e-02 877 878 -1.66666666666667e-01 877 1127 1.66666666666667e-01 877 721 -1.25000000000000e-01 877 1126 -7.50000000000000e-01 877 720 -4.16666666666667e-02 877 1014 4.16666666666667e-02 877 689 8.33333333333333e-02 877 887 -1.66666666666667e-01 877 882 4.16666666666667e-02 877 688 -1.25000000000000e-01 877 874 -1.25000000000000e-01 877 687 -4.16666666666667e-02 877 885 8.33333333333333e-02 878 878 1.25000000000000e+00 878 888 -8.33333333333333e-02 878 883 4.16666666666667e-02 878 889 -8.33333333333333e-02 878 882 -8.33333333333333e-02 878 1124 -1.25000000000000e-01 878 1123 -4.16666666666667e-02 878 1129 8.33333333333333e-02 878 1122 8.33333333333333e-02 878 885 8.33333333333333e-02 878 1125 -8.33333333333333e-02 878 1015 4.16666666666667e-02 878 874 -4.16666666666667e-02 878 722 -3.75000000000000e-01 878 1127 -2.50000000000000e-01 878 721 8.33333333333333e-02 878 877 -1.66666666666667e-01 878 1126 1.66666666666667e-01 878 720 8.33333333333333e-02 878 1014 -8.33333333333333e-02 878 1128 8.33333333333333e-02 878 689 -3.75000000000000e-01 878 875 -1.25000000000000e-01 878 688 8.33333333333333e-02 878 886 -1.66666666666667e-01 878 876 -1.66666666666667e-01 878 687 8.33333333333333e-02 878 873 8.33333333333333e-02 879 879 5.00000000000000e-01 879 1021 4.16666666666667e-02 879 887 4.16666666666667e-02 879 1244 -4.16666666666667e-02 879 761 4.16666666666667e-02 879 1022 -8.33333333333333e-02 879 760 4.16666666666667e-02 879 880 -8.33333333333333e-02 879 1243 8.33333333333333e-02 879 759 -1.25000000000000e-01 879 1242 -1.25000000000000e-01 879 881 -8.33333333333333e-02 879 689 4.16666666666667e-02 879 875 8.33333333333333e-02 879 688 4.16666666666667e-02 879 886 -8.33333333333333e-02 879 874 -4.16666666666667e-02 879 687 -1.25000000000000e-01 879 873 -1.25000000000000e-01 880 880 5.83333333333333e-01 880 1020 4.16666666666667e-02 880 875 8.33333333333333e-02 880 881 -1.66666666666667e-01 880 1244 8.33333333333333e-02 880 761 -4.16666666666667e-02 880 1022 4.16666666666667e-02 880 760 -4.16666666666667e-02 880 1243 -3.75000000000000e-01 880 759 4.16666666666667e-02 880 879 -8.33333333333333e-02 880 1242 8.33333333333333e-02 880 689 -4.16666666666667e-02 880 887 4.16666666666667e-02 880 873 -4.16666666666667e-02 880 688 -4.16666666666667e-02 880 874 -1.25000000000000e-01 880 687 4.16666666666667e-02 880 885 -8.33333333333333e-02 881 881 5.83333333333333e-01 881 880 -1.66666666666667e-01 881 1243 8.33333333333333e-02 881 885 4.16666666666667e-02 881 1242 -4.16666666666667e-02 881 761 -4.16666666666667e-02 881 1244 -1.25000000000000e-01 881 760 -4.16666666666667e-02 881 1021 4.16666666666667e-02 881 759 4.16666666666667e-02 881 1020 -8.33333333333333e-02 881 874 8.33333333333333e-02 881 689 -4.16666666666667e-02 881 875 -3.75000000000000e-01 881 688 -4.16666666666667e-02 881 886 4.16666666666667e-02 881 879 -8.33333333333333e-02 881 687 4.16666666666667e-02 881 873 8.33333333333333e-02 882 882 5.00000000000000e-01 882 877 4.16666666666667e-02 882 1259 4.16666666666667e-02 882 890 -4.16666666666667e-02 882 689 4.16666666666667e-02 882 878 -8.33333333333333e-02 882 688 4.16666666666667e-02 882 883 -8.33333333333333e-02 882 889 8.33333333333333e-02 882 687 -1.25000000000000e-01 882 888 -1.25000000000000e-01 882 884 -8.33333333333333e-02 882 767 4.16666666666667e-02 882 1124 8.33333333333333e-02 882 766 4.16666666666667e-02 882 1258 -8.33333333333333e-02 882 1123 -4.16666666666667e-02 882 765 -1.25000000000000e-01 882 1122 -1.25000000000000e-01 883 883 5.83333333333333e-01 883 876 4.16666666666667e-02 883 1124 8.33333333333333e-02 883 884 -1.66666666666667e-01 883 890 8.33333333333333e-02 883 689 -4.16666666666667e-02 883 878 4.16666666666667e-02 883 688 -4.16666666666667e-02 883 889 -3.75000000000000e-01 883 687 4.16666666666667e-02 883 882 -8.33333333333333e-02 883 888 8.33333333333333e-02 883 767 -4.16666666666667e-02 883 1259 4.16666666666667e-02 883 1122 -4.16666666666667e-02 883 766 -4.16666666666667e-02 883 1123 -1.25000000000000e-01 883 765 4.16666666666667e-02 883 1257 -8.33333333333333e-02 884 884 5.83333333333333e-01 884 883 -1.66666666666667e-01 884 889 8.33333333333333e-02 884 1257 4.16666666666667e-02 884 888 -4.16666666666667e-02 884 689 -4.16666666666667e-02 884 890 -1.25000000000000e-01 884 688 -4.16666666666667e-02 884 877 4.16666666666667e-02 884 687 4.16666666666667e-02 884 876 -8.33333333333333e-02 884 1123 8.33333333333333e-02 884 767 -4.16666666666667e-02 884 1124 -3.75000000000000e-01 884 766 -4.16666666666667e-02 884 1258 4.16666666666667e-02 884 882 -8.33333333333333e-02 884 765 4.16666666666667e-02 884 1122 8.33333333333333e-02 885 885 1.25000000000000e+00 885 890 8.33333333333333e-02 885 770 -4.16666666666667e-02 885 1265 4.16666666666667e-02 885 1264 -8.33333333333333e-02 885 689 -4.16666666666667e-02 885 889 8.33333333333333e-02 885 888 -3.75000000000000e-01 885 878 8.33333333333333e-02 885 877 8.33333333333333e-02 885 1127 1.66666666666667e-01 885 1126 -8.33333333333333e-02 885 1125 -2.50000000000000e-01 885 875 -8.33333333333333e-02 885 881 4.16666666666667e-02 885 874 -8.33333333333333e-02 885 1027 8.33333333333333e-02 885 880 -8.33333333333333e-02 885 688 8.33333333333333e-02 885 687 -1.25000000000000e-01 885 1244 8.33333333333333e-02 885 1028 -1.66666666666667e-01 885 1243 8.33333333333333e-02 885 886 -1.66666666666667e-01 885 769 8.33333333333333e-02 885 1242 -3.75000000000000e-01 885 887 -1.66666666666667e-01 885 768 -1.25000000000000e-01 886 886 1.25000000000000e+00 886 890 -4.16666666666667e-02 886 1263 -8.33333333333333e-02 886 889 -1.25000000000000e-01 886 888 8.33333333333333e-02 886 878 -1.66666666666667e-01 886 689 8.33333333333333e-02 886 876 8.33333333333333e-02 886 1127 1.66666666666667e-01 886 887 -1.66666666666667e-01 886 770 8.33333333333333e-02 886 1126 -2.50000000000000e-01 886 1125 -8.33333333333333e-02 886 873 -8.33333333333333e-02 886 1026 8.33333333333333e-02 886 881 4.16666666666667e-02 886 875 -8.33333333333333e-02 886 688 -3.75000000000000e-01 886 879 -8.33333333333333e-02 886 687 8.33333333333333e-02 886 1244 -4.16666666666667e-02 886 1028 8.33333333333333e-02 886 1243 -1.25000000000000e-01 886 1265 4.16666666666667e-02 886 769 -3.75000000000000e-01 886 1242 8.33333333333333e-02 886 885 -1.66666666666667e-01 886 768 8.33333333333333e-02 887 887 1.25000000000000e+00 887 889 -4.16666666666667e-02 887 885 -1.66666666666667e-01 887 888 8.33333333333333e-02 887 768 -4.16666666666667e-02 887 1263 4.16666666666667e-02 887 890 -1.25000000000000e-01 887 687 -4.16666666666667e-02 887 876 8.33333333333333e-02 887 877 -1.66666666666667e-01 887 688 8.33333333333333e-02 887 1127 -7.50000000000000e-01 887 1126 1.66666666666667e-01 887 886 -1.66666666666667e-01 887 769 8.33333333333333e-02 887 1125 1.66666666666667e-01 887 873 -8.33333333333333e-02 887 879 4.16666666666667e-02 887 689 -1.25000000000000e-01 887 880 4.16666666666667e-02 887 874 -8.33333333333333e-02 887 1244 -1.25000000000000e-01 887 1264 4.16666666666667e-02 887 770 -1.25000000000000e-01 887 1243 -4.16666666666667e-02 887 1027 8.33333333333333e-02 887 1242 8.33333333333333e-02 887 1026 -1.66666666666667e-01 888 888 1.25000000000000e+00 888 1127 -1.66666666666667e-01 888 1126 8.33333333333333e-02 888 689 4.16666666666667e-02 888 886 8.33333333333333e-02 888 885 -3.75000000000000e-01 888 1265 -4.16666666666667e-02 888 773 4.16666666666667e-02 888 1264 8.33333333333333e-02 888 1263 -1.25000000000000e-01 888 878 -8.33333333333333e-02 888 877 -8.33333333333333e-02 888 1124 8.33333333333333e-02 888 884 -4.16666666666667e-02 888 889 -1.66666666666667e-01 888 1123 8.33333333333333e-02 888 1129 -8.33333333333333e-02 888 688 -8.33333333333333e-02 888 883 8.33333333333333e-02 888 882 -1.25000000000000e-01 888 890 -1.66666666666667e-01 888 1259 8.33333333333333e-02 888 1130 1.66666666666667e-01 888 1258 8.33333333333333e-02 888 772 -8.33333333333333e-02 888 887 8.33333333333333e-02 888 1257 -3.75000000000000e-01 888 1128 -2.50000000000000e-01 889 889 1.25000000000000e+00 889 1127 8.33333333333333e-02 889 1125 8.33333333333333e-02 889 886 -1.25000000000000e-01 889 885 8.33333333333333e-02 889 1265 8.33333333333333e-02 889 890 -1.66666666666667e-01 889 1264 -3.75000000000000e-01 889 1263 8.33333333333333e-02 889 876 -8.33333333333333e-02 889 884 8.33333333333333e-02 889 888 -1.66666666666667e-01 889 1124 -1.66666666666667e-01 889 1130 1.66666666666667e-01 889 1122 8.33333333333333e-02 889 1128 -8.33333333333333e-02 889 689 4.16666666666667e-02 889 878 -8.33333333333333e-02 889 883 -3.75000000000000e-01 889 687 -8.33333333333333e-02 889 882 8.33333333333333e-02 889 1259 -4.16666666666667e-02 889 773 4.16666666666667e-02 889 887 -4.16666666666667e-02 889 1258 -1.25000000000000e-01 889 1129 -2.50000000000000e-01 889 1257 8.33333333333333e-02 889 771 -8.33333333333333e-02 890 890 1.25000000000000e+00 890 1126 8.33333333333333e-02 890 885 8.33333333333333e-02 890 1125 -1.66666666666667e-01 890 887 -1.25000000000000e-01 890 687 4.16666666666667e-02 890 1265 -1.25000000000000e-01 890 1264 8.33333333333333e-02 890 889 -1.66666666666667e-01 890 1263 -4.16666666666667e-02 890 771 4.16666666666667e-02 890 876 -8.33333333333333e-02 890 883 8.33333333333333e-02 890 1122 8.33333333333333e-02 890 882 -4.16666666666667e-02 890 1123 -1.66666666666667e-01 890 1129 1.66666666666667e-01 890 884 -1.25000000000000e-01 890 688 4.16666666666667e-02 890 877 -8.33333333333333e-02 890 886 -4.16666666666667e-02 890 1259 -1.25000000000000e-01 890 1130 -7.50000000000000e-01 890 1258 -4.16666666666667e-02 890 772 4.16666666666667e-02 890 888 -1.66666666666667e-01 890 1257 8.33333333333333e-02 890 1128 1.66666666666667e-01 891 891 1.25000000000000e+00 891 1196 8.33333333333333e-02 891 1195 -1.66666666666667e-01 891 896 8.33333333333333e-02 891 691 4.16666666666667e-02 891 894 -3.75000000000000e-01 891 1136 8.33333333333333e-02 891 1135 -4.16666666666667e-02 891 724 4.16666666666667e-02 891 1134 -1.25000000000000e-01 891 1148 -8.33333333333333e-02 891 893 -1.66666666666667e-01 891 898 -4.16666666666667e-02 891 902 -8.33333333333333e-02 891 1262 8.33333333333333e-02 891 901 -8.33333333333333e-02 891 1261 8.33333333333333e-02 891 899 8.33333333333333e-02 891 692 -8.33333333333333e-02 891 897 -1.25000000000000e-01 891 1142 8.33333333333333e-02 891 725 -8.33333333333333e-02 891 1141 8.33333333333333e-02 891 892 -1.66666666666667e-01 891 1147 1.66666666666667e-01 891 1140 -3.75000000000000e-01 891 895 8.33333333333333e-02 891 1146 -2.50000000000000e-01 892 892 1.25000000000000e+00 892 1196 8.33333333333333e-02 892 894 8.33333333333333e-02 892 1194 -1.66666666666667e-01 892 895 -1.25000000000000e-01 892 690 4.16666666666667e-02 892 1136 8.33333333333333e-02 892 893 -1.66666666666667e-01 892 1135 -1.25000000000000e-01 892 1134 -4.16666666666667e-02 892 723 4.16666666666667e-02 892 897 -4.16666666666667e-02 892 899 8.33333333333333e-02 892 1148 1.66666666666667e-01 892 1262 -1.66666666666667e-01 892 900 -8.33333333333333e-02 892 1260 8.33333333333333e-02 892 692 4.16666666666667e-02 892 902 -8.33333333333333e-02 892 898 -1.25000000000000e-01 892 1142 -4.16666666666667e-02 892 725 4.16666666666667e-02 892 1141 -1.25000000000000e-01 892 896 -4.16666666666667e-02 892 1147 -7.50000000000000e-01 892 1140 8.33333333333333e-02 892 891 -1.66666666666667e-01 892 1146 1.66666666666667e-01 893 893 1.25000000000000e+00 893 1195 8.33333333333333e-02 893 1194 8.33333333333333e-02 893 896 -1.25000000000000e-01 893 894 8.33333333333333e-02 893 1136 -3.75000000000000e-01 893 1135 8.33333333333333e-02 893 892 -1.66666666666667e-01 893 1134 8.33333333333333e-02 893 1146 -8.33333333333333e-02 893 891 -1.66666666666667e-01 893 898 8.33333333333333e-02 893 900 -8.33333333333333e-02 893 1260 8.33333333333333e-02 893 1147 1.66666666666667e-01 893 1261 -1.66666666666667e-01 893 899 -3.75000000000000e-01 893 691 4.16666666666667e-02 893 901 -8.33333333333333e-02 893 897 8.33333333333333e-02 893 690 -8.33333333333333e-02 893 1142 -1.25000000000000e-01 893 895 -4.16666666666667e-02 893 1148 -2.50000000000000e-01 893 1141 -4.16666666666667e-02 893 724 4.16666666666667e-02 893 1140 8.33333333333333e-02 893 723 -8.33333333333333e-02 894 894 5.83333333333333e-01 894 1196 -4.16666666666667e-02 894 895 -1.66666666666667e-01 894 1195 8.33333333333333e-02 894 892 8.33333333333333e-02 894 737 4.16666666666667e-02 894 1136 -8.33333333333333e-02 894 736 -4.16666666666667e-02 894 1135 4.16666666666667e-02 894 735 -4.16666666666667e-02 894 1194 -1.25000000000000e-01 894 896 -8.33333333333333e-02 894 692 4.16666666666667e-02 894 893 8.33333333333333e-02 894 691 -4.16666666666667e-02 894 901 4.16666666666667e-02 894 902 4.16666666666667e-02 894 690 -4.16666666666667e-02 894 891 -3.75000000000000e-01 895 895 5.83333333333333e-01 895 893 -4.16666666666667e-02 895 894 -1.66666666666667e-01 895 1194 8.33333333333333e-02 895 891 8.33333333333333e-02 895 737 4.16666666666667e-02 895 896 -8.33333333333333e-02 895 1196 8.33333333333333e-02 895 736 -4.16666666666667e-02 895 1195 -3.75000000000000e-01 895 735 -4.16666666666667e-02 895 1134 4.16666666666667e-02 895 692 4.16666666666667e-02 895 902 -8.33333333333333e-02 895 1136 4.16666666666667e-02 895 691 -4.16666666666667e-02 895 892 -1.25000000000000e-01 895 690 -4.16666666666667e-02 895 900 4.16666666666667e-02 896 896 5.00000000000000e-01 896 1194 -4.16666666666667e-02 896 1135 4.16666666666667e-02 896 892 -4.16666666666667e-02 896 737 -1.25000000000000e-01 896 1196 -1.25000000000000e-01 896 736 4.16666666666667e-02 896 895 -8.33333333333333e-02 896 1195 8.33333333333333e-02 896 735 4.16666666666667e-02 896 1134 -8.33333333333333e-02 896 900 4.16666666666667e-02 896 692 -1.25000000000000e-01 896 893 -1.25000000000000e-01 896 691 4.16666666666667e-02 896 901 -8.33333333333333e-02 896 894 -8.33333333333333e-02 896 690 4.16666666666667e-02 896 891 8.33333333333333e-02 897 897 5.00000000000000e-01 897 1141 4.16666666666667e-02 897 902 4.16666666666667e-02 897 1262 -4.16666666666667e-02 897 767 4.16666666666667e-02 897 1142 -8.33333333333333e-02 897 766 4.16666666666667e-02 897 898 -8.33333333333333e-02 897 1261 8.33333333333333e-02 897 765 -1.25000000000000e-01 897 1260 -1.25000000000000e-01 897 899 -8.33333333333333e-02 897 692 4.16666666666667e-02 897 893 8.33333333333333e-02 897 691 4.16666666666667e-02 897 901 -8.33333333333333e-02 897 892 -4.16666666666667e-02 897 690 -1.25000000000000e-01 897 891 -1.25000000000000e-01 898 898 5.83333333333333e-01 898 1140 4.16666666666667e-02 898 893 8.33333333333333e-02 898 899 -1.66666666666667e-01 898 1262 8.33333333333333e-02 898 767 -4.16666666666667e-02 898 1142 4.16666666666667e-02 898 766 -4.16666666666667e-02 898 1261 -3.75000000000000e-01 898 765 4.16666666666667e-02 898 897 -8.33333333333333e-02 898 1260 8.33333333333333e-02 898 692 -4.16666666666667e-02 898 902 4.16666666666667e-02 898 891 -4.16666666666667e-02 898 691 -4.16666666666667e-02 898 892 -1.25000000000000e-01 898 690 4.16666666666667e-02 898 900 -8.33333333333333e-02 899 899 5.83333333333333e-01 899 898 -1.66666666666667e-01 899 1261 8.33333333333333e-02 899 900 4.16666666666667e-02 899 1260 -4.16666666666667e-02 899 767 -4.16666666666667e-02 899 1262 -1.25000000000000e-01 899 766 -4.16666666666667e-02 899 1141 4.16666666666667e-02 899 765 4.16666666666667e-02 899 1140 -8.33333333333333e-02 899 892 8.33333333333333e-02 899 692 -4.16666666666667e-02 899 893 -3.75000000000000e-01 899 691 -4.16666666666667e-02 899 901 4.16666666666667e-02 899 897 -8.33333333333333e-02 899 690 4.16666666666667e-02 899 891 8.33333333333333e-02 900 900 6.66666666666667e-01 900 895 4.16666666666667e-02 900 1196 8.33333333333333e-02 900 1195 -4.16666666666667e-02 900 1194 -1.25000000000000e-01 900 893 -8.33333333333333e-02 900 899 4.16666666666667e-02 900 892 -8.33333333333333e-02 900 1147 8.33333333333333e-02 900 898 -8.33333333333333e-02 900 691 4.16666666666667e-02 900 690 -8.33333333333333e-02 900 1262 8.33333333333333e-02 900 1148 -1.66666666666667e-01 900 1261 8.33333333333333e-02 900 901 -8.33333333333333e-02 900 775 4.16666666666667e-02 900 1260 -3.75000000000000e-01 900 896 4.16666666666667e-02 900 774 -8.33333333333333e-02 901 901 7.50000000000000e-01 901 692 4.16666666666667e-02 901 894 4.16666666666667e-02 901 1196 8.33333333333333e-02 901 902 -8.33333333333333e-02 901 776 4.16666666666667e-02 901 1195 -1.25000000000000e-01 901 1194 -4.16666666666667e-02 901 891 -8.33333333333333e-02 901 1146 8.33333333333333e-02 901 899 4.16666666666667e-02 901 893 -8.33333333333333e-02 901 691 -2.50000000000000e-01 901 897 -8.33333333333333e-02 901 690 4.16666666666667e-02 901 1262 -4.16666666666667e-02 901 1148 8.33333333333333e-02 901 1261 -1.25000000000000e-01 901 896 -8.33333333333333e-02 901 775 -2.50000000000000e-01 901 1260 8.33333333333333e-02 901 900 -8.33333333333333e-02 901 774 4.16666666666667e-02 902 902 6.66666666666667e-01 902 895 -8.33333333333333e-02 902 691 4.16666666666667e-02 902 1196 -3.75000000000000e-01 902 1195 8.33333333333333e-02 902 901 -8.33333333333333e-02 902 775 4.16666666666667e-02 902 1194 8.33333333333333e-02 902 891 -8.33333333333333e-02 902 897 4.16666666666667e-02 902 692 -8.33333333333333e-02 902 898 4.16666666666667e-02 902 892 -8.33333333333333e-02 902 1262 -1.25000000000000e-01 902 894 4.16666666666667e-02 902 776 -8.33333333333333e-02 902 1261 -4.16666666666667e-02 902 1147 8.33333333333333e-02 902 1260 8.33333333333333e-02 902 1146 -1.66666666666667e-01 903 903 7.50000000000000e-01 903 905 -8.33333333333333e-02 903 1214 8.33333333333333e-02 903 779 4.16666666666667e-02 903 1213 -4.16666666666667e-02 903 1212 -1.25000000000000e-01 903 1039 8.33333333333333e-02 903 1250 -4.16666666666667e-02 903 1040 8.33333333333333e-02 903 904 -8.33333333333333e-02 903 1249 8.33333333333333e-02 903 778 4.16666666666667e-02 903 1248 -1.25000000000000e-01 903 777 -2.50000000000000e-01 903 323 -8.33333333333333e-02 903 322 4.16666666666667e-02 903 316 -8.33333333333333e-02 903 329 4.16666666666667e-02 903 317 -8.33333333333333e-02 903 34 4.16666666666667e-02 903 328 -8.33333333333333e-02 903 33 -2.50000000000000e-01 903 35 4.16666666666667e-02 904 904 6.66666666666667e-01 904 1214 8.33333333333333e-02 904 1213 -1.25000000000000e-01 904 1212 -4.16666666666667e-02 904 1038 8.33333333333333e-02 904 1250 8.33333333333333e-02 904 1040 -1.66666666666667e-01 904 1249 -3.75000000000000e-01 904 778 -8.33333333333333e-02 904 903 -8.33333333333333e-02 904 1248 8.33333333333333e-02 904 777 4.16666666666667e-02 904 321 4.16666666666667e-02 904 329 4.16666666666667e-02 904 317 -8.33333333333333e-02 904 315 -8.33333333333333e-02 904 34 -8.33333333333333e-02 904 33 4.16666666666667e-02 904 327 -8.33333333333333e-02 904 323 4.16666666666667e-02 905 905 6.66666666666667e-01 905 1214 -3.75000000000000e-01 905 1213 8.33333333333333e-02 905 903 -8.33333333333333e-02 905 1212 8.33333333333333e-02 905 777 4.16666666666667e-02 905 1250 -1.25000000000000e-01 905 779 -8.33333333333333e-02 905 1249 8.33333333333333e-02 905 1039 -1.66666666666667e-01 905 1248 -4.16666666666667e-02 905 1038 8.33333333333333e-02 905 33 4.16666666666667e-02 905 321 -8.33333333333333e-02 905 328 4.16666666666667e-02 905 316 -8.33333333333333e-02 905 35 -8.33333333333333e-02 905 327 4.16666666666667e-02 905 315 -8.33333333333333e-02 905 322 4.16666666666667e-02 906 906 2.50000000000000e+00 906 913 1.66666666666667e-01 906 912 -2.50000000000000e-01 906 1046 -1.66666666666667e-01 906 1045 8.33333333333333e-02 906 1058 1.66666666666667e-01 906 925 8.33333333333333e-02 906 1057 1.66666666666667e-01 906 1056 -7.50000000000000e-01 906 926 8.33333333333333e-02 906 1048 -8.33333333333333e-02 906 1049 1.66666666666667e-01 906 908 -3.33333333333333e-01 906 710 -8.33333333333333e-02 906 1047 -2.50000000000000e-01 906 917 8.33333333333333e-02 906 695 -8.33333333333333e-02 906 916 -1.66666666666667e-01 906 1043 8.33333333333333e-02 906 910 1.66666666666667e-01 906 907 -3.33333333333333e-01 906 911 1.66666666666667e-01 906 694 -8.33333333333333e-02 906 909 -7.50000000000000e-01 906 1042 8.33333333333333e-02 906 709 -8.33333333333333e-02 906 1055 -8.33333333333333e-02 906 1052 8.33333333333333e-02 906 922 8.33333333333333e-02 906 919 -8.33333333333333e-02 906 1051 -1.66666666666667e-01 906 1054 1.66666666666667e-01 906 1053 -2.50000000000000e-01 906 920 1.66666666666667e-01 906 923 -1.66666666666667e-01 906 918 -2.50000000000000e-01 906 914 -8.33333333333333e-02 907 907 2.50000000000000e+00 907 912 1.66666666666667e-01 907 914 1.66666666666667e-01 907 913 -7.50000000000000e-01 907 1044 8.33333333333333e-02 907 1058 -8.33333333333333e-02 907 924 8.33333333333333e-02 907 1057 -2.50000000000000e-01 907 1056 1.66666666666667e-01 907 926 -1.66666666666667e-01 907 1047 -8.33333333333333e-02 907 917 8.33333333333333e-02 907 1049 1.66666666666667e-01 907 1048 -2.50000000000000e-01 907 915 -1.66666666666667e-01 907 911 -8.33333333333333e-02 907 909 1.66666666666667e-01 907 906 -3.33333333333333e-01 907 910 -2.50000000000000e-01 907 693 -8.33333333333333e-02 907 1043 -1.66666666666667e-01 907 1041 8.33333333333333e-02 907 708 -8.33333333333333e-02 907 1055 1.66666666666667e-01 907 908 -3.33333333333333e-01 907 920 1.66666666666667e-01 907 921 8.33333333333333e-02 907 918 -8.33333333333333e-02 907 1052 8.33333333333333e-02 907 710 -8.33333333333333e-02 907 1054 -7.50000000000000e-01 907 1050 -1.66666666666667e-01 907 1053 1.66666666666667e-01 907 923 8.33333333333333e-02 907 695 -8.33333333333333e-02 907 919 -2.50000000000000e-01 907 1046 8.33333333333333e-02 908 908 2.50000000000000e+00 908 1045 8.33333333333333e-02 908 914 -2.50000000000000e-01 908 913 1.66666666666667e-01 908 1044 -1.66666666666667e-01 908 1057 -8.33333333333333e-02 908 1056 1.66666666666667e-01 908 1058 -2.50000000000000e-01 908 925 -1.66666666666667e-01 908 924 8.33333333333333e-02 908 916 8.33333333333333e-02 908 1047 1.66666666666667e-01 908 906 -3.33333333333333e-01 908 1049 -7.50000000000000e-01 908 1048 1.66666666666667e-01 908 708 -8.33333333333333e-02 908 915 8.33333333333333e-02 908 693 -8.33333333333333e-02 908 910 -8.33333333333333e-02 908 1041 8.33333333333333e-02 908 911 -2.50000000000000e-01 908 909 1.66666666666667e-01 908 1042 -1.66666666666667e-01 908 1053 -8.33333333333333e-02 908 1050 8.33333333333333e-02 908 1054 1.66666666666667e-01 908 907 -3.33333333333333e-01 908 919 1.66666666666667e-01 908 1055 -2.50000000000000e-01 908 1051 8.33333333333333e-02 908 709 -8.33333333333333e-02 908 920 -7.50000000000000e-01 908 912 -8.33333333333333e-02 908 922 8.33333333333333e-02 908 694 -8.33333333333333e-02 908 918 1.66666666666667e-01 908 921 -1.66666666666667e-01 909 909 2.50000000000000e+00 909 1231 -1.66666666666667e-01 909 1166 1.66666666666667e-01 909 1268 -1.66666666666667e-01 909 928 -8.33333333333333e-02 909 1267 8.33333333333333e-02 909 929 -8.33333333333333e-02 909 1165 1.66666666666667e-01 909 1164 -7.50000000000000e-01 909 1154 1.66666666666667e-01 909 1048 8.33333333333333e-02 909 1153 -8.33333333333333e-02 909 1049 -1.66666666666667e-01 909 728 8.33333333333333e-02 909 1152 -2.50000000000000e-01 909 917 -8.33333333333333e-02 909 695 8.33333333333333e-02 909 910 -3.33333333333333e-01 909 916 1.66666666666667e-01 909 915 -2.50000000000000e-01 909 1160 -8.33333333333333e-02 909 1159 1.66666666666667e-01 909 1043 -8.33333333333333e-02 909 1055 8.33333333333333e-02 909 907 1.66666666666667e-01 909 1054 -1.66666666666667e-01 909 727 8.33333333333333e-02 909 1042 -8.33333333333333e-02 909 1158 -2.50000000000000e-01 909 911 -3.33333333333333e-01 909 923 1.66666666666667e-01 909 908 1.66666666666667e-01 909 922 -8.33333333333333e-02 909 694 8.33333333333333e-02 909 1232 8.33333333333333e-02 909 921 -2.50000000000000e-01 909 906 -7.50000000000000e-01 910 910 2.50000000000000e+00 910 1230 -1.66666666666667e-01 910 1166 -8.33333333333333e-02 910 929 -8.33333333333333e-02 910 1268 8.33333333333333e-02 910 927 -8.33333333333333e-02 910 1266 8.33333333333333e-02 910 1165 -2.50000000000000e-01 910 1164 1.66666666666667e-01 910 1047 8.33333333333333e-02 910 1152 -8.33333333333333e-02 910 1049 8.33333333333333e-02 910 1154 1.66666666666667e-01 910 1153 -2.50000000000000e-01 910 917 1.66666666666667e-01 910 916 -7.50000000000000e-01 910 909 -3.33333333333333e-01 910 915 1.66666666666667e-01 910 908 -8.33333333333333e-02 910 911 -3.33333333333333e-01 910 1043 -8.33333333333333e-02 910 1055 8.33333333333333e-02 910 1158 1.66666666666667e-01 910 906 1.66666666666667e-01 910 1053 -1.66666666666667e-01 910 728 -1.66666666666667e-01 910 1160 1.66666666666667e-01 910 1159 -7.50000000000000e-01 910 726 8.33333333333333e-02 910 1041 -8.33333333333333e-02 910 923 1.66666666666667e-01 910 695 -1.66666666666667e-01 910 1232 8.33333333333333e-02 910 922 -2.50000000000000e-01 910 907 -2.50000000000000e-01 910 921 -8.33333333333333e-02 910 693 8.33333333333333e-02 911 911 2.50000000000000e+00 911 1231 8.33333333333333e-02 911 1165 -8.33333333333333e-02 911 928 -8.33333333333333e-02 911 1267 8.33333333333333e-02 911 1164 1.66666666666667e-01 911 1266 -1.66666666666667e-01 911 927 -8.33333333333333e-02 911 1166 -2.50000000000000e-01 911 1152 1.66666666666667e-01 911 1048 8.33333333333333e-02 911 1047 -1.66666666666667e-01 911 1154 -7.50000000000000e-01 911 1153 1.66666666666667e-01 911 726 8.33333333333333e-02 911 917 -2.50000000000000e-01 911 916 1.66666666666667e-01 911 915 -8.33333333333333e-02 911 693 8.33333333333333e-02 911 907 -8.33333333333333e-02 911 910 -3.33333333333333e-01 911 1158 -8.33333333333333e-02 911 1042 -8.33333333333333e-02 911 1054 8.33333333333333e-02 911 1041 -8.33333333333333e-02 911 1053 8.33333333333333e-02 911 1160 -2.50000000000000e-01 911 727 -1.66666666666667e-01 911 1159 1.66666666666667e-01 911 1230 8.33333333333333e-02 911 923 -7.50000000000000e-01 911 908 -2.50000000000000e-01 911 922 1.66666666666667e-01 911 694 -1.66666666666667e-01 911 909 -3.33333333333333e-01 911 921 1.66666666666667e-01 911 906 1.66666666666667e-01 912 912 1.25000000000000e+00 912 1048 8.33333333333333e-02 912 1049 8.33333333333333e-02 912 1217 8.33333333333333e-02 912 1215 -1.25000000000000e-01 912 917 8.33333333333333e-02 912 916 8.33333333333333e-02 912 913 -1.66666666666667e-01 912 915 -3.75000000000000e-01 912 908 -8.33333333333333e-02 912 914 -1.66666666666667e-01 912 1046 -8.33333333333333e-02 912 1058 8.33333333333333e-02 912 1219 8.33333333333333e-02 912 907 1.66666666666667e-01 912 1057 -1.66666666666667e-01 912 1220 8.33333333333333e-02 912 746 -8.33333333333333e-02 912 745 4.16666666666667e-02 912 1045 -8.33333333333333e-02 912 1218 -3.75000000000000e-01 912 926 8.33333333333333e-02 912 695 -8.33333333333333e-02 912 925 -4.16666666666667e-02 912 694 4.16666666666667e-02 912 924 -1.25000000000000e-01 912 1216 -4.16666666666667e-02 912 906 -2.50000000000000e-01 913 913 1.25000000000000e+00 913 1215 -4.16666666666667e-02 913 1047 8.33333333333333e-02 913 1049 -1.66666666666667e-01 913 746 4.16666666666667e-02 913 1216 -1.25000000000000e-01 913 917 -4.16666666666667e-02 913 695 4.16666666666667e-02 913 916 -1.25000000000000e-01 913 915 8.33333333333333e-02 913 912 -1.66666666666667e-01 913 1220 -4.16666666666667e-02 913 1218 8.33333333333333e-02 913 1046 -8.33333333333333e-02 913 1058 8.33333333333333e-02 913 906 1.66666666666667e-01 913 1056 -1.66666666666667e-01 913 1219 -1.25000000000000e-01 913 744 4.16666666666667e-02 913 1044 -8.33333333333333e-02 913 926 8.33333333333333e-02 913 914 -1.66666666666667e-01 913 908 1.66666666666667e-01 913 925 -1.25000000000000e-01 913 1217 8.33333333333333e-02 913 907 -7.50000000000000e-01 913 924 -4.16666666666667e-02 913 693 4.16666666666667e-02 914 914 1.25000000000000e+00 914 1048 -1.66666666666667e-01 914 1047 8.33333333333333e-02 914 1217 -3.75000000000000e-01 914 745 4.16666666666667e-02 914 1215 8.33333333333333e-02 914 917 -1.25000000000000e-01 914 916 -4.16666666666667e-02 914 694 4.16666666666667e-02 914 915 8.33333333333333e-02 914 906 -8.33333333333333e-02 914 1219 -4.16666666666667e-02 914 912 -1.66666666666667e-01 914 1044 -8.33333333333333e-02 914 1056 8.33333333333333e-02 914 1045 -8.33333333333333e-02 914 1057 8.33333333333333e-02 914 1220 -1.25000000000000e-01 914 1218 8.33333333333333e-02 914 744 -8.33333333333333e-02 914 926 -3.75000000000000e-01 914 1216 8.33333333333333e-02 914 908 -2.50000000000000e-01 914 925 8.33333333333333e-02 914 913 -1.66666666666667e-01 914 907 1.66666666666667e-01 914 924 8.33333333333333e-02 914 693 -8.33333333333333e-02 915 915 1.25000000000000e+00 915 916 -1.66666666666667e-01 915 929 -8.33333333333333e-02 915 694 -4.16666666666667e-02 915 928 4.16666666666667e-02 915 1232 8.33333333333333e-02 915 751 -4.16666666666667e-02 915 1230 -3.75000000000000e-01 915 1216 4.16666666666667e-02 915 752 8.33333333333333e-02 915 1217 -8.33333333333333e-02 915 917 -1.66666666666667e-01 915 914 8.33333333333333e-02 915 695 8.33333333333333e-02 915 913 8.33333333333333e-02 915 912 -3.75000000000000e-01 915 1048 -8.33333333333333e-02 915 1153 8.33333333333333e-02 915 1154 8.33333333333333e-02 915 1049 -8.33333333333333e-02 915 750 -1.25000000000000e-01 915 911 -8.33333333333333e-02 915 908 8.33333333333333e-02 915 910 1.66666666666667e-01 915 907 -1.66666666666667e-01 915 909 -2.50000000000000e-01 915 1231 8.33333333333333e-02 915 693 -1.25000000000000e-01 916 916 1.25000000000000e+00 916 929 4.16666666666667e-02 916 1230 8.33333333333333e-02 916 915 -1.66666666666667e-01 916 693 -4.16666666666667e-02 916 927 4.16666666666667e-02 916 1231 -1.25000000000000e-01 916 750 -4.16666666666667e-02 916 1215 4.16666666666667e-02 916 1217 4.16666666666667e-02 916 914 -4.16666666666667e-02 916 913 -1.25000000000000e-01 916 912 8.33333333333333e-02 916 1047 -8.33333333333333e-02 916 1152 8.33333333333333e-02 916 1049 -8.33333333333333e-02 916 908 8.33333333333333e-02 916 1154 -1.66666666666667e-01 916 752 8.33333333333333e-02 916 751 -1.25000000000000e-01 916 911 1.66666666666667e-01 916 917 -1.66666666666667e-01 916 695 8.33333333333333e-02 916 910 -7.50000000000000e-01 916 1232 -4.16666666666667e-02 916 694 -1.25000000000000e-01 916 909 1.66666666666667e-01 916 906 -1.66666666666667e-01 917 917 1.25000000000000e+00 917 928 4.16666666666667e-02 917 927 -8.33333333333333e-02 917 1232 -1.25000000000000e-01 917 1230 8.33333333333333e-02 917 1216 4.16666666666667e-02 917 750 8.33333333333333e-02 917 1215 -8.33333333333333e-02 917 914 -1.25000000000000e-01 917 913 -4.16666666666667e-02 917 915 -1.66666666666667e-01 917 912 8.33333333333333e-02 917 693 8.33333333333333e-02 917 1048 -8.33333333333333e-02 917 907 8.33333333333333e-02 917 752 -3.75000000000000e-01 917 1153 -1.66666666666667e-01 917 751 8.33333333333333e-02 917 1152 8.33333333333333e-02 917 1047 -8.33333333333333e-02 917 911 -2.50000000000000e-01 917 1231 -4.16666666666667e-02 917 695 -3.75000000000000e-01 917 910 1.66666666666667e-01 917 916 -1.66666666666667e-01 917 694 8.33333333333333e-02 917 909 -8.33333333333333e-02 917 906 8.33333333333333e-02 918 918 1.25000000000000e+00 918 1058 -1.66666666666667e-01 918 1057 8.33333333333333e-02 918 764 4.16666666666667e-02 918 1255 8.33333333333333e-02 918 1254 -3.75000000000000e-01 918 926 -4.16666666666667e-02 918 695 4.16666666666667e-02 918 925 8.33333333333333e-02 918 924 -1.25000000000000e-01 918 1052 -8.33333333333333e-02 918 1051 -8.33333333333333e-02 918 1055 8.33333333333333e-02 918 1253 -4.16666666666667e-02 918 919 -1.66666666666667e-01 918 1054 8.33333333333333e-02 918 907 -8.33333333333333e-02 918 763 -8.33333333333333e-02 918 1252 8.33333333333333e-02 918 1251 -1.25000000000000e-01 918 920 -1.66666666666667e-01 918 923 8.33333333333333e-02 918 908 1.66666666666667e-01 918 922 8.33333333333333e-02 918 694 -8.33333333333333e-02 918 1256 8.33333333333333e-02 918 921 -3.75000000000000e-01 918 906 -2.50000000000000e-01 919 919 1.25000000000000e+00 919 1058 8.33333333333333e-02 919 1056 8.33333333333333e-02 919 1255 -1.25000000000000e-01 919 1254 8.33333333333333e-02 919 926 8.33333333333333e-02 919 920 -1.66666666666667e-01 919 925 -3.75000000000000e-01 919 924 8.33333333333333e-02 919 1050 -8.33333333333333e-02 919 1253 8.33333333333333e-02 919 918 -1.66666666666667e-01 919 1055 -1.66666666666667e-01 919 908 1.66666666666667e-01 919 1053 8.33333333333333e-02 919 906 -8.33333333333333e-02 919 764 4.16666666666667e-02 919 1052 -8.33333333333333e-02 919 1252 -3.75000000000000e-01 919 762 -8.33333333333333e-02 919 1251 8.33333333333333e-02 919 923 -4.16666666666667e-02 919 695 4.16666666666667e-02 919 1256 -4.16666666666667e-02 919 922 -1.25000000000000e-01 919 907 -2.50000000000000e-01 919 921 8.33333333333333e-02 919 693 -8.33333333333333e-02 920 920 1.25000000000000e+00 920 1057 8.33333333333333e-02 920 1254 8.33333333333333e-02 920 1056 -1.66666666666667e-01 920 1256 -1.25000000000000e-01 920 762 4.16666666666667e-02 920 926 -1.25000000000000e-01 920 925 8.33333333333333e-02 920 919 -1.66666666666667e-01 920 924 -4.16666666666667e-02 920 693 4.16666666666667e-02 920 1050 -8.33333333333333e-02 920 1252 8.33333333333333e-02 920 1053 8.33333333333333e-02 920 1251 -4.16666666666667e-02 920 1054 -1.66666666666667e-01 920 907 1.66666666666667e-01 920 1253 -1.25000000000000e-01 920 763 4.16666666666667e-02 920 1051 -8.33333333333333e-02 920 1255 -4.16666666666667e-02 920 923 -1.25000000000000e-01 920 908 -7.50000000000000e-01 920 922 -4.16666666666667e-02 920 694 4.16666666666667e-02 920 918 -1.66666666666667e-01 920 921 8.33333333333333e-02 920 906 1.66666666666667e-01 921 921 1.25000000000000e+00 921 1268 8.33333333333333e-02 921 695 -4.16666666666667e-02 921 929 4.16666666666667e-02 921 928 -8.33333333333333e-02 921 770 -4.16666666666667e-02 921 1267 8.33333333333333e-02 921 1266 -3.75000000000000e-01 921 1160 8.33333333333333e-02 921 1159 8.33333333333333e-02 921 911 1.66666666666667e-01 921 910 -8.33333333333333e-02 921 909 -2.50000000000000e-01 921 1055 -8.33333333333333e-02 921 1253 4.16666666666667e-02 921 1054 -8.33333333333333e-02 921 907 8.33333333333333e-02 921 1252 -8.33333333333333e-02 921 769 8.33333333333333e-02 921 768 -1.25000000000000e-01 921 920 8.33333333333333e-02 921 908 -1.66666666666667e-01 921 919 8.33333333333333e-02 921 922 -1.66666666666667e-01 921 694 8.33333333333333e-02 921 918 -3.75000000000000e-01 921 923 -1.66666666666667e-01 921 693 -1.25000000000000e-01 922 922 1.25000000000000e+00 922 1268 -4.16666666666667e-02 922 927 -8.33333333333333e-02 922 1267 -1.25000000000000e-01 922 1266 8.33333333333333e-02 922 1160 -1.66666666666667e-01 922 770 8.33333333333333e-02 922 1158 8.33333333333333e-02 922 911 1.66666666666667e-01 922 923 -1.66666666666667e-01 922 695 8.33333333333333e-02 922 910 -2.50000000000000e-01 922 909 -8.33333333333333e-02 922 1053 -8.33333333333333e-02 922 906 8.33333333333333e-02 922 1253 4.16666666666667e-02 922 1055 -8.33333333333333e-02 922 769 -3.75000000000000e-01 922 1251 -8.33333333333333e-02 922 768 8.33333333333333e-02 922 920 -4.16666666666667e-02 922 908 8.33333333333333e-02 922 919 -1.25000000000000e-01 922 929 4.16666666666667e-02 922 694 -3.75000000000000e-01 922 918 8.33333333333333e-02 922 921 -1.66666666666667e-01 922 693 8.33333333333333e-02 923 923 1.25000000000000e+00 923 1267 -4.16666666666667e-02 923 921 -1.66666666666667e-01 923 1266 8.33333333333333e-02 923 693 -4.16666666666667e-02 923 927 4.16666666666667e-02 923 1268 -1.25000000000000e-01 923 768 -4.16666666666667e-02 923 1158 8.33333333333333e-02 923 1159 -1.66666666666667e-01 923 769 8.33333333333333e-02 923 911 -7.50000000000000e-01 923 910 1.66666666666667e-01 923 922 -1.66666666666667e-01 923 694 8.33333333333333e-02 923 909 1.66666666666667e-01 923 1053 -8.33333333333333e-02 923 1251 4.16666666666667e-02 923 770 -1.25000000000000e-01 923 1252 4.16666666666667e-02 923 1054 -8.33333333333333e-02 923 920 -1.25000000000000e-01 923 928 4.16666666666667e-02 923 695 -1.25000000000000e-01 923 919 -4.16666666666667e-02 923 907 8.33333333333333e-02 923 918 8.33333333333333e-02 923 906 -1.66666666666667e-01 924 924 7.50000000000000e-01 924 1220 -8.33333333333333e-02 924 1219 4.16666666666667e-02 924 926 -8.33333333333333e-02 924 914 8.33333333333333e-02 924 695 4.16666666666667e-02 924 913 -4.16666666666667e-02 924 912 -1.25000000000000e-01 924 1057 -8.33333333333333e-02 924 907 8.33333333333333e-02 924 1256 4.16666666666667e-02 924 1058 -8.33333333333333e-02 924 778 4.16666666666667e-02 924 1255 -8.33333333333333e-02 924 777 -2.50000000000000e-01 924 920 -4.16666666666667e-02 924 908 8.33333333333333e-02 924 925 -8.33333333333333e-02 924 919 8.33333333333333e-02 924 694 4.16666666666667e-02 924 779 4.16666666666667e-02 924 918 -1.25000000000000e-01 924 693 -2.50000000000000e-01 925 925 6.66666666666667e-01 925 1218 4.16666666666667e-02 925 914 8.33333333333333e-02 925 913 -1.25000000000000e-01 925 912 -4.16666666666667e-02 925 1256 4.16666666666667e-02 925 1058 -8.33333333333333e-02 925 1056 -8.33333333333333e-02 925 906 8.33333333333333e-02 925 778 -8.33333333333333e-02 925 777 4.16666666666667e-02 925 1254 -8.33333333333333e-02 925 920 8.33333333333333e-02 925 908 -1.66666666666667e-01 925 1220 4.16666666666667e-02 925 919 -3.75000000000000e-01 925 694 -8.33333333333333e-02 925 924 -8.33333333333333e-02 925 918 8.33333333333333e-02 925 693 4.16666666666667e-02 926 926 6.66666666666667e-01 926 777 4.16666666666667e-02 926 1218 -8.33333333333333e-02 926 914 -3.75000000000000e-01 926 913 8.33333333333333e-02 926 924 -8.33333333333333e-02 926 912 8.33333333333333e-02 926 693 4.16666666666667e-02 926 1255 4.16666666666667e-02 926 1057 -8.33333333333333e-02 926 779 -8.33333333333333e-02 926 1254 4.16666666666667e-02 926 1056 -8.33333333333333e-02 926 1219 4.16666666666667e-02 926 920 -1.25000000000000e-01 926 695 -8.33333333333333e-02 926 919 8.33333333333333e-02 926 907 -1.66666666666667e-01 926 918 -4.16666666666667e-02 926 906 8.33333333333333e-02 927 927 7.50000000000000e-01 927 917 -8.33333333333333e-02 927 916 4.16666666666667e-02 927 929 -8.33333333333333e-02 927 1232 8.33333333333333e-02 927 782 4.16666666666667e-02 927 1231 -4.16666666666667e-02 927 1230 -1.25000000000000e-01 927 910 -8.33333333333333e-02 927 1165 8.33333333333333e-02 927 923 4.16666666666667e-02 927 911 -8.33333333333333e-02 927 694 4.16666666666667e-02 927 922 -8.33333333333333e-02 927 693 -2.50000000000000e-01 927 1268 -4.16666666666667e-02 927 1166 8.33333333333333e-02 927 928 -8.33333333333333e-02 927 1267 8.33333333333333e-02 927 781 4.16666666666667e-02 927 695 4.16666666666667e-02 927 1266 -1.25000000000000e-01 927 780 -2.50000000000000e-01 928 928 6.66666666666667e-01 928 915 4.16666666666667e-02 928 1232 8.33333333333333e-02 928 1231 -1.25000000000000e-01 928 1230 -4.16666666666667e-02 928 923 4.16666666666667e-02 928 911 -8.33333333333333e-02 928 909 -8.33333333333333e-02 928 1164 8.33333333333333e-02 928 694 -8.33333333333333e-02 928 693 4.16666666666667e-02 928 921 -8.33333333333333e-02 928 1268 8.33333333333333e-02 928 1166 -1.66666666666667e-01 928 917 4.16666666666667e-02 928 1267 -3.75000000000000e-01 928 781 -8.33333333333333e-02 928 927 -8.33333333333333e-02 928 1266 8.33333333333333e-02 928 780 4.16666666666667e-02 929 929 6.66666666666667e-01 929 693 4.16666666666667e-02 929 915 -8.33333333333333e-02 929 1232 -3.75000000000000e-01 929 1231 8.33333333333333e-02 929 927 -8.33333333333333e-02 929 1230 8.33333333333333e-02 929 780 4.16666666666667e-02 929 922 4.16666666666667e-02 929 910 -8.33333333333333e-02 929 695 -8.33333333333333e-02 929 921 4.16666666666667e-02 929 909 -8.33333333333333e-02 929 916 4.16666666666667e-02 929 1268 -1.25000000000000e-01 929 782 -8.33333333333333e-02 929 1267 8.33333333333333e-02 929 1165 -1.66666666666667e-01 929 1266 -4.16666666666667e-02 929 1164 8.33333333333333e-02 930 930 2.50000000000000e+00 930 937 1.66666666666667e-01 930 936 -2.50000000000000e-01 930 1172 -1.66666666666667e-01 930 1171 8.33333333333333e-02 930 1184 1.66666666666667e-01 930 949 8.33333333333333e-02 930 1183 1.66666666666667e-01 930 1182 -7.50000000000000e-01 930 950 8.33333333333333e-02 930 1174 -8.33333333333333e-02 930 1175 1.66666666666667e-01 930 932 -3.33333333333333e-01 930 731 -8.33333333333333e-02 930 1173 -2.50000000000000e-01 930 941 8.33333333333333e-02 930 698 -8.33333333333333e-02 930 940 -1.66666666666667e-01 930 1169 8.33333333333333e-02 930 934 1.66666666666667e-01 930 931 -3.33333333333333e-01 930 935 1.66666666666667e-01 930 697 -8.33333333333333e-02 930 933 -7.50000000000000e-01 930 1168 8.33333333333333e-02 930 730 -8.33333333333333e-02 930 1181 -8.33333333333333e-02 930 1178 8.33333333333333e-02 930 946 8.33333333333333e-02 930 943 -8.33333333333333e-02 930 1177 -1.66666666666667e-01 930 1180 1.66666666666667e-01 930 1179 -2.50000000000000e-01 930 944 1.66666666666667e-01 930 947 -1.66666666666667e-01 930 942 -2.50000000000000e-01 930 938 -8.33333333333333e-02 931 931 2.50000000000000e+00 931 936 1.66666666666667e-01 931 938 1.66666666666667e-01 931 937 -7.50000000000000e-01 931 1170 8.33333333333333e-02 931 1184 -8.33333333333333e-02 931 948 8.33333333333333e-02 931 1183 -2.50000000000000e-01 931 1182 1.66666666666667e-01 931 950 -1.66666666666667e-01 931 1173 -8.33333333333333e-02 931 941 8.33333333333333e-02 931 1175 1.66666666666667e-01 931 1174 -2.50000000000000e-01 931 939 -1.66666666666667e-01 931 935 -8.33333333333333e-02 931 933 1.66666666666667e-01 931 930 -3.33333333333333e-01 931 934 -2.50000000000000e-01 931 696 -8.33333333333333e-02 931 1169 -1.66666666666667e-01 931 1167 8.33333333333333e-02 931 729 -8.33333333333333e-02 931 1181 1.66666666666667e-01 931 932 -3.33333333333333e-01 931 944 1.66666666666667e-01 931 945 8.33333333333333e-02 931 942 -8.33333333333333e-02 931 1178 8.33333333333333e-02 931 731 -8.33333333333333e-02 931 1180 -7.50000000000000e-01 931 1176 -1.66666666666667e-01 931 1179 1.66666666666667e-01 931 947 8.33333333333333e-02 931 698 -8.33333333333333e-02 931 943 -2.50000000000000e-01 931 1172 8.33333333333333e-02 932 932 2.50000000000000e+00 932 1171 8.33333333333333e-02 932 938 -2.50000000000000e-01 932 937 1.66666666666667e-01 932 1170 -1.66666666666667e-01 932 1183 -8.33333333333333e-02 932 1182 1.66666666666667e-01 932 1184 -2.50000000000000e-01 932 949 -1.66666666666667e-01 932 948 8.33333333333333e-02 932 940 8.33333333333333e-02 932 1173 1.66666666666667e-01 932 930 -3.33333333333333e-01 932 1175 -7.50000000000000e-01 932 1174 1.66666666666667e-01 932 729 -8.33333333333333e-02 932 939 8.33333333333333e-02 932 696 -8.33333333333333e-02 932 934 -8.33333333333333e-02 932 1167 8.33333333333333e-02 932 935 -2.50000000000000e-01 932 933 1.66666666666667e-01 932 1168 -1.66666666666667e-01 932 1179 -8.33333333333333e-02 932 1176 8.33333333333333e-02 932 1180 1.66666666666667e-01 932 931 -3.33333333333333e-01 932 943 1.66666666666667e-01 932 1181 -2.50000000000000e-01 932 1177 8.33333333333333e-02 932 730 -8.33333333333333e-02 932 944 -7.50000000000000e-01 932 936 -8.33333333333333e-02 932 946 8.33333333333333e-02 932 697 -8.33333333333333e-02 932 942 1.66666666666667e-01 932 945 -1.66666666666667e-01 933 933 1.25000000000000e+00 933 1174 8.33333333333333e-02 933 1198 -4.16666666666667e-02 933 1175 -1.66666666666667e-01 933 740 4.16666666666667e-02 933 1197 -1.25000000000000e-01 933 941 -4.16666666666667e-02 933 698 4.16666666666667e-02 933 934 -1.66666666666667e-01 933 940 8.33333333333333e-02 933 939 -1.25000000000000e-01 933 1202 -4.16666666666667e-02 933 1201 8.33333333333333e-02 933 1169 -8.33333333333333e-02 933 1181 8.33333333333333e-02 933 931 1.66666666666667e-01 933 1180 -1.66666666666667e-01 933 739 4.16666666666667e-02 933 1168 -8.33333333333333e-02 933 1200 -1.25000000000000e-01 933 935 -1.66666666666667e-01 933 947 8.33333333333333e-02 933 932 1.66666666666667e-01 933 946 -4.16666666666667e-02 933 697 4.16666666666667e-02 933 1199 8.33333333333333e-02 933 945 -1.25000000000000e-01 933 930 -7.50000000000000e-01 934 934 1.25000000000000e+00 934 1197 -4.16666666666667e-02 934 1175 8.33333333333333e-02 934 1199 8.33333333333333e-02 934 1198 -1.25000000000000e-01 934 941 8.33333333333333e-02 934 940 -3.75000000000000e-01 934 933 -1.66666666666667e-01 934 939 8.33333333333333e-02 934 932 -8.33333333333333e-02 934 935 -1.66666666666667e-01 934 1169 -8.33333333333333e-02 934 1181 8.33333333333333e-02 934 1200 8.33333333333333e-02 934 930 1.66666666666667e-01 934 1179 -1.66666666666667e-01 934 740 -8.33333333333333e-02 934 1202 8.33333333333333e-02 934 1201 -3.75000000000000e-01 934 738 4.16666666666667e-02 934 1167 -8.33333333333333e-02 934 947 8.33333333333333e-02 934 698 -8.33333333333333e-02 934 1173 8.33333333333333e-02 934 946 -1.25000000000000e-01 934 931 -2.50000000000000e-01 934 945 -4.16666666666667e-02 934 696 4.16666666666667e-02 935 935 1.25000000000000e+00 935 1174 8.33333333333333e-02 935 1173 -1.66666666666667e-01 935 1199 -3.75000000000000e-01 935 1198 8.33333333333333e-02 935 738 4.16666666666667e-02 935 941 -1.25000000000000e-01 935 940 8.33333333333333e-02 935 939 -4.16666666666667e-02 935 696 4.16666666666667e-02 935 931 -8.33333333333333e-02 935 934 -1.66666666666667e-01 935 1200 -4.16666666666667e-02 935 1168 -8.33333333333333e-02 935 1180 8.33333333333333e-02 935 1167 -8.33333333333333e-02 935 1179 8.33333333333333e-02 935 1202 -1.25000000000000e-01 935 739 -8.33333333333333e-02 935 1201 8.33333333333333e-02 935 1197 8.33333333333333e-02 935 947 -3.75000000000000e-01 935 932 -2.50000000000000e-01 935 946 8.33333333333333e-02 935 697 -8.33333333333333e-02 935 933 -1.66666666666667e-01 935 945 8.33333333333333e-02 935 930 1.66666666666667e-01 936 936 1.25000000000000e+00 936 1174 8.33333333333333e-02 936 1175 8.33333333333333e-02 936 1235 8.33333333333333e-02 936 1233 -1.25000000000000e-01 936 941 8.33333333333333e-02 936 940 8.33333333333333e-02 936 937 -1.66666666666667e-01 936 939 -3.75000000000000e-01 936 932 -8.33333333333333e-02 936 938 -1.66666666666667e-01 936 1172 -8.33333333333333e-02 936 1184 8.33333333333333e-02 936 1237 8.33333333333333e-02 936 931 1.66666666666667e-01 936 1183 -1.66666666666667e-01 936 1238 8.33333333333333e-02 936 755 -8.33333333333333e-02 936 754 4.16666666666667e-02 936 1171 -8.33333333333333e-02 936 1236 -3.75000000000000e-01 936 950 8.33333333333333e-02 936 698 -8.33333333333333e-02 936 949 -4.16666666666667e-02 936 697 4.16666666666667e-02 936 948 -1.25000000000000e-01 936 1234 -4.16666666666667e-02 936 930 -2.50000000000000e-01 937 937 1.25000000000000e+00 937 1233 -4.16666666666667e-02 937 1173 8.33333333333333e-02 937 1175 -1.66666666666667e-01 937 755 4.16666666666667e-02 937 1234 -1.25000000000000e-01 937 941 -4.16666666666667e-02 937 698 4.16666666666667e-02 937 940 -1.25000000000000e-01 937 939 8.33333333333333e-02 937 936 -1.66666666666667e-01 937 1238 -4.16666666666667e-02 937 1236 8.33333333333333e-02 937 1172 -8.33333333333333e-02 937 1184 8.33333333333333e-02 937 930 1.66666666666667e-01 937 1182 -1.66666666666667e-01 937 1237 -1.25000000000000e-01 937 753 4.16666666666667e-02 937 1170 -8.33333333333333e-02 937 950 8.33333333333333e-02 937 938 -1.66666666666667e-01 937 932 1.66666666666667e-01 937 949 -1.25000000000000e-01 937 1235 8.33333333333333e-02 937 931 -7.50000000000000e-01 937 948 -4.16666666666667e-02 937 696 4.16666666666667e-02 938 938 1.25000000000000e+00 938 1174 -1.66666666666667e-01 938 1173 8.33333333333333e-02 938 1235 -3.75000000000000e-01 938 754 4.16666666666667e-02 938 1233 8.33333333333333e-02 938 941 -1.25000000000000e-01 938 940 -4.16666666666667e-02 938 697 4.16666666666667e-02 938 939 8.33333333333333e-02 938 930 -8.33333333333333e-02 938 1237 -4.16666666666667e-02 938 936 -1.66666666666667e-01 938 1170 -8.33333333333333e-02 938 1182 8.33333333333333e-02 938 1171 -8.33333333333333e-02 938 1183 8.33333333333333e-02 938 1238 -1.25000000000000e-01 938 1236 8.33333333333333e-02 938 753 -8.33333333333333e-02 938 950 -3.75000000000000e-01 938 1234 8.33333333333333e-02 938 932 -2.50000000000000e-01 938 949 8.33333333333333e-02 938 937 -1.66666666666667e-01 938 931 1.66666666666667e-01 938 948 8.33333333333333e-02 938 696 -8.33333333333333e-02 939 939 6.66666666666667e-01 939 758 4.16666666666667e-02 939 1235 -8.33333333333333e-02 939 941 -8.33333333333333e-02 939 938 8.33333333333333e-02 939 698 4.16666666666667e-02 939 937 8.33333333333333e-02 939 936 -3.75000000000000e-01 939 1174 -8.33333333333333e-02 939 1198 4.16666666666667e-02 939 1199 4.16666666666667e-02 939 1175 -8.33333333333333e-02 939 756 -8.33333333333333e-02 939 935 -4.16666666666667e-02 939 932 8.33333333333333e-02 939 934 8.33333333333333e-02 939 931 -1.66666666666667e-01 939 933 -1.25000000000000e-01 939 1234 4.16666666666667e-02 939 696 -8.33333333333333e-02 940 940 6.66666666666667e-01 940 1235 4.16666666666667e-02 940 938 -4.16666666666667e-02 940 937 -1.25000000000000e-01 940 936 8.33333333333333e-02 940 1173 -8.33333333333333e-02 940 1197 4.16666666666667e-02 940 1175 -8.33333333333333e-02 940 932 8.33333333333333e-02 940 1199 -8.33333333333333e-02 940 758 4.16666666666667e-02 940 757 -8.33333333333333e-02 940 935 8.33333333333333e-02 940 941 -8.33333333333333e-02 940 698 4.16666666666667e-02 940 934 -3.75000000000000e-01 940 1233 4.16666666666667e-02 940 697 -8.33333333333333e-02 940 933 8.33333333333333e-02 940 930 -1.66666666666667e-01 941 941 7.50000000000000e-01 941 756 4.16666666666667e-02 941 1233 -8.33333333333333e-02 941 938 -1.25000000000000e-01 941 937 -4.16666666666667e-02 941 939 -8.33333333333333e-02 941 936 8.33333333333333e-02 941 696 4.16666666666667e-02 941 1174 -8.33333333333333e-02 941 931 8.33333333333333e-02 941 758 -2.50000000000000e-01 941 1198 -8.33333333333333e-02 941 757 4.16666666666667e-02 941 1197 4.16666666666667e-02 941 1173 -8.33333333333333e-02 941 935 -1.25000000000000e-01 941 1234 4.16666666666667e-02 941 698 -2.50000000000000e-01 941 934 8.33333333333333e-02 941 940 -8.33333333333333e-02 941 697 4.16666666666667e-02 941 933 -4.16666666666667e-02 941 930 8.33333333333333e-02 942 942 1.25000000000000e+00 942 1184 -1.66666666666667e-01 942 1183 8.33333333333333e-02 942 773 4.16666666666667e-02 942 1273 8.33333333333333e-02 942 1272 -3.75000000000000e-01 942 950 -4.16666666666667e-02 942 698 4.16666666666667e-02 942 949 8.33333333333333e-02 942 948 -1.25000000000000e-01 942 1178 -8.33333333333333e-02 942 1177 -8.33333333333333e-02 942 1181 8.33333333333333e-02 942 1271 -4.16666666666667e-02 942 943 -1.66666666666667e-01 942 1180 8.33333333333333e-02 942 931 -8.33333333333333e-02 942 772 -8.33333333333333e-02 942 1270 8.33333333333333e-02 942 1269 -1.25000000000000e-01 942 944 -1.66666666666667e-01 942 947 8.33333333333333e-02 942 932 1.66666666666667e-01 942 946 8.33333333333333e-02 942 697 -8.33333333333333e-02 942 1274 8.33333333333333e-02 942 945 -3.75000000000000e-01 942 930 -2.50000000000000e-01 943 943 1.25000000000000e+00 943 1184 8.33333333333333e-02 943 1182 8.33333333333333e-02 943 1273 -1.25000000000000e-01 943 1272 8.33333333333333e-02 943 950 8.33333333333333e-02 943 944 -1.66666666666667e-01 943 949 -3.75000000000000e-01 943 948 8.33333333333333e-02 943 1176 -8.33333333333333e-02 943 1271 8.33333333333333e-02 943 942 -1.66666666666667e-01 943 1181 -1.66666666666667e-01 943 932 1.66666666666667e-01 943 1179 8.33333333333333e-02 943 930 -8.33333333333333e-02 943 773 4.16666666666667e-02 943 1178 -8.33333333333333e-02 943 1270 -3.75000000000000e-01 943 771 -8.33333333333333e-02 943 1269 8.33333333333333e-02 943 947 -4.16666666666667e-02 943 698 4.16666666666667e-02 943 1274 -4.16666666666667e-02 943 946 -1.25000000000000e-01 943 931 -2.50000000000000e-01 943 945 8.33333333333333e-02 943 696 -8.33333333333333e-02 944 944 1.25000000000000e+00 944 1183 8.33333333333333e-02 944 1272 8.33333333333333e-02 944 1182 -1.66666666666667e-01 944 1274 -1.25000000000000e-01 944 771 4.16666666666667e-02 944 950 -1.25000000000000e-01 944 949 8.33333333333333e-02 944 943 -1.66666666666667e-01 944 948 -4.16666666666667e-02 944 696 4.16666666666667e-02 944 1176 -8.33333333333333e-02 944 1270 8.33333333333333e-02 944 1179 8.33333333333333e-02 944 1269 -4.16666666666667e-02 944 1180 -1.66666666666667e-01 944 931 1.66666666666667e-01 944 1271 -1.25000000000000e-01 944 772 4.16666666666667e-02 944 1177 -8.33333333333333e-02 944 1273 -4.16666666666667e-02 944 947 -1.25000000000000e-01 944 932 -7.50000000000000e-01 944 946 -4.16666666666667e-02 944 697 4.16666666666667e-02 944 942 -1.66666666666667e-01 944 945 8.33333333333333e-02 944 930 1.66666666666667e-01 945 945 6.66666666666667e-01 945 1201 4.16666666666667e-02 945 935 8.33333333333333e-02 945 934 -4.16666666666667e-02 945 933 -1.25000000000000e-01 945 1181 -8.33333333333333e-02 945 1271 4.16666666666667e-02 945 1180 -8.33333333333333e-02 945 931 8.33333333333333e-02 945 1270 -8.33333333333333e-02 945 775 4.16666666666667e-02 945 774 -8.33333333333333e-02 945 944 8.33333333333333e-02 945 932 -1.66666666666667e-01 945 943 8.33333333333333e-02 945 946 -8.33333333333333e-02 945 697 4.16666666666667e-02 945 942 -3.75000000000000e-01 945 1202 4.16666666666667e-02 945 696 -8.33333333333333e-02 946 946 7.50000000000000e-01 946 776 4.16666666666667e-02 946 1200 4.16666666666667e-02 946 935 8.33333333333333e-02 946 947 -8.33333333333333e-02 946 698 4.16666666666667e-02 946 934 -1.25000000000000e-01 946 933 -4.16666666666667e-02 946 1179 -8.33333333333333e-02 946 930 8.33333333333333e-02 946 1271 4.16666666666667e-02 946 1181 -8.33333333333333e-02 946 775 -2.50000000000000e-01 946 1269 -8.33333333333333e-02 946 774 4.16666666666667e-02 946 944 -4.16666666666667e-02 946 932 8.33333333333333e-02 946 943 -1.25000000000000e-01 946 1202 -8.33333333333333e-02 946 697 -2.50000000000000e-01 946 942 8.33333333333333e-02 946 945 -8.33333333333333e-02 946 696 4.16666666666667e-02 947 947 6.66666666666667e-01 947 1201 -8.33333333333333e-02 947 775 4.16666666666667e-02 947 935 -3.75000000000000e-01 947 934 8.33333333333333e-02 947 946 -8.33333333333333e-02 947 697 4.16666666666667e-02 947 933 8.33333333333333e-02 947 1179 -8.33333333333333e-02 947 1269 4.16666666666667e-02 947 776 -8.33333333333333e-02 947 1270 4.16666666666667e-02 947 1180 -8.33333333333333e-02 947 944 -1.25000000000000e-01 947 1200 4.16666666666667e-02 947 698 -8.33333333333333e-02 947 943 -4.16666666666667e-02 947 931 8.33333333333333e-02 947 942 8.33333333333333e-02 947 930 -1.66666666666667e-01 948 948 7.50000000000000e-01 948 1238 -8.33333333333333e-02 948 1237 4.16666666666667e-02 948 950 -8.33333333333333e-02 948 938 8.33333333333333e-02 948 698 4.16666666666667e-02 948 937 -4.16666666666667e-02 948 936 -1.25000000000000e-01 948 1183 -8.33333333333333e-02 948 931 8.33333333333333e-02 948 1274 4.16666666666667e-02 948 1184 -8.33333333333333e-02 948 781 4.16666666666667e-02 948 1273 -8.33333333333333e-02 948 780 -2.50000000000000e-01 948 944 -4.16666666666667e-02 948 932 8.33333333333333e-02 948 949 -8.33333333333333e-02 948 943 8.33333333333333e-02 948 697 4.16666666666667e-02 948 782 4.16666666666667e-02 948 942 -1.25000000000000e-01 948 696 -2.50000000000000e-01 949 949 6.66666666666667e-01 949 1236 4.16666666666667e-02 949 938 8.33333333333333e-02 949 937 -1.25000000000000e-01 949 936 -4.16666666666667e-02 949 1274 4.16666666666667e-02 949 1184 -8.33333333333333e-02 949 1182 -8.33333333333333e-02 949 930 8.33333333333333e-02 949 781 -8.33333333333333e-02 949 780 4.16666666666667e-02 949 1272 -8.33333333333333e-02 949 944 8.33333333333333e-02 949 932 -1.66666666666667e-01 949 1238 4.16666666666667e-02 949 943 -3.75000000000000e-01 949 697 -8.33333333333333e-02 949 948 -8.33333333333333e-02 949 942 8.33333333333333e-02 949 696 4.16666666666667e-02 950 950 6.66666666666667e-01 950 780 4.16666666666667e-02 950 1236 -8.33333333333333e-02 950 938 -3.75000000000000e-01 950 937 8.33333333333333e-02 950 948 -8.33333333333333e-02 950 936 8.33333333333333e-02 950 696 4.16666666666667e-02 950 1273 4.16666666666667e-02 950 1183 -8.33333333333333e-02 950 782 -8.33333333333333e-02 950 1272 4.16666666666667e-02 950 1182 -8.33333333333333e-02 950 1237 4.16666666666667e-02 950 944 -1.25000000000000e-01 950 698 -8.33333333333333e-02 950 943 8.33333333333333e-02 950 931 -1.66666666666667e-01 950 942 -4.16666666666667e-02 950 930 8.33333333333333e-02 951 951 1.25000000000000e+00 951 989 -8.33333333333333e-02 951 967 8.33333333333333e-02 951 988 -8.33333333333333e-02 951 985 -8.33333333333333e-02 951 962 8.33333333333333e-02 951 968 -1.66666666666667e-01 951 961 8.33333333333333e-02 951 960 -3.75000000000000e-01 951 788 8.33333333333333e-02 951 953 -1.66666666666667e-01 951 959 1.66666666666667e-01 951 982 8.33333333333333e-02 951 958 -8.33333333333333e-02 951 701 -4.16666666666667e-02 951 785 4.16666666666667e-02 951 700 8.33333333333333e-02 951 784 -8.33333333333333e-02 951 699 -1.25000000000000e-01 951 957 -2.50000000000000e-01 951 704 -4.16666666666667e-02 951 983 8.33333333333333e-02 951 952 -1.66666666666667e-01 951 703 8.33333333333333e-02 951 787 8.33333333333333e-02 951 986 4.16666666666667e-02 951 702 -1.25000000000000e-01 951 786 -3.75000000000000e-01 952 952 1.25000000000000e+00 952 987 -8.33333333333333e-02 952 986 4.16666666666667e-02 952 989 -8.33333333333333e-02 952 984 -8.33333333333333e-02 952 962 -4.16666666666667e-02 952 968 8.33333333333333e-02 952 961 -1.25000000000000e-01 952 960 8.33333333333333e-02 952 788 -4.16666666666667e-02 952 785 4.16666666666667e-02 952 981 8.33333333333333e-02 952 957 -8.33333333333333e-02 952 701 8.33333333333333e-02 952 953 -1.66666666666667e-01 952 959 1.66666666666667e-01 952 700 -3.75000000000000e-01 952 958 -2.50000000000000e-01 952 699 8.33333333333333e-02 952 783 -8.33333333333333e-02 952 704 8.33333333333333e-02 952 983 -1.66666666666667e-01 952 966 8.33333333333333e-02 952 703 -3.75000000000000e-01 952 787 -1.25000000000000e-01 952 951 -1.66666666666667e-01 952 702 8.33333333333333e-02 952 786 8.33333333333333e-02 953 953 1.25000000000000e+00 953 987 -8.33333333333333e-02 953 985 4.16666666666667e-02 953 988 -8.33333333333333e-02 953 962 -1.25000000000000e-01 953 961 -4.16666666666667e-02 953 967 8.33333333333333e-02 953 960 8.33333333333333e-02 953 966 -1.66666666666667e-01 953 787 -4.16666666666667e-02 953 784 4.16666666666667e-02 953 786 8.33333333333333e-02 953 951 -1.66666666666667e-01 953 957 1.66666666666667e-01 953 701 -1.25000000000000e-01 953 959 -7.50000000000000e-01 953 700 8.33333333333333e-02 953 952 -1.66666666666667e-01 953 958 1.66666666666667e-01 953 699 -4.16666666666667e-02 953 783 4.16666666666667e-02 953 984 4.16666666666667e-02 953 704 -1.25000000000000e-01 953 788 -1.25000000000000e-01 953 703 8.33333333333333e-02 953 982 -1.66666666666667e-01 953 702 -4.16666666666667e-02 953 981 8.33333333333333e-02 954 954 1.25000000000000e+00 954 965 8.33333333333333e-02 954 964 8.33333333333333e-02 954 963 -3.75000000000000e-01 954 1016 -8.33333333333333e-02 954 1018 -8.33333333333333e-02 954 968 8.33333333333333e-02 954 967 -1.66666666666667e-01 954 1019 -8.33333333333333e-02 954 1013 8.33333333333333e-02 954 959 -8.33333333333333e-02 954 955 -1.66666666666667e-01 954 958 1.66666666666667e-01 954 790 8.33333333333333e-02 954 701 8.33333333333333e-02 954 785 -8.33333333333333e-02 954 700 -4.16666666666667e-02 954 784 4.16666666666667e-02 954 699 -1.25000000000000e-01 954 957 -2.50000000000000e-01 954 956 -1.66666666666667e-01 954 707 8.33333333333333e-02 954 791 8.33333333333333e-02 954 706 -4.16666666666667e-02 954 1012 8.33333333333333e-02 954 1015 4.16666666666667e-02 954 705 -1.25000000000000e-01 954 789 -3.75000000000000e-01 955 955 1.25000000000000e+00 955 965 -4.16666666666667e-02 955 964 -1.25000000000000e-01 955 963 8.33333333333333e-02 955 1016 4.16666666666667e-02 955 968 8.33333333333333e-02 955 1019 -8.33333333333333e-02 955 1017 -8.33333333333333e-02 955 966 -1.66666666666667e-01 955 785 4.16666666666667e-02 955 791 -4.16666666666667e-02 955 954 -1.66666666666667e-01 955 957 1.66666666666667e-01 955 789 8.33333333333333e-02 955 701 8.33333333333333e-02 955 956 -1.66666666666667e-01 955 959 1.66666666666667e-01 955 700 -1.25000000000000e-01 955 958 -7.50000000000000e-01 955 699 -4.16666666666667e-02 955 783 4.16666666666667e-02 955 707 8.33333333333333e-02 955 1013 -1.66666666666667e-01 955 1014 4.16666666666667e-02 955 706 -1.25000000000000e-01 955 790 -1.25000000000000e-01 955 705 -4.16666666666667e-02 955 1011 8.33333333333333e-02 956 956 1.25000000000000e+00 956 964 -4.16666666666667e-02 956 963 8.33333333333333e-02 956 1015 4.16666666666667e-02 956 1014 -8.33333333333333e-02 956 967 8.33333333333333e-02 956 1018 -8.33333333333333e-02 956 966 8.33333333333333e-02 956 1017 -8.33333333333333e-02 956 1011 8.33333333333333e-02 956 957 -8.33333333333333e-02 956 784 4.16666666666667e-02 956 790 -4.16666666666667e-02 956 701 -3.75000000000000e-01 956 959 -2.50000000000000e-01 956 700 8.33333333333333e-02 956 955 -1.66666666666667e-01 956 958 1.66666666666667e-01 956 699 8.33333333333333e-02 956 783 -8.33333333333333e-02 956 965 -1.25000000000000e-01 956 707 -3.75000000000000e-01 956 791 -1.25000000000000e-01 956 706 8.33333333333333e-02 956 1012 -1.66666666666667e-01 956 954 -1.66666666666667e-01 956 705 8.33333333333333e-02 956 789 8.33333333333333e-02 957 957 2.50000000000000e+00 957 988 -1.66666666666667e-01 957 953 1.66666666666667e-01 957 787 8.33333333333333e-02 957 952 -8.33333333333333e-02 957 788 -1.66666666666667e-01 957 951 -2.50000000000000e-01 957 983 -8.33333333333333e-02 957 982 1.66666666666667e-01 957 981 -2.50000000000000e-01 957 1042 -8.33333333333333e-02 957 968 1.66666666666667e-01 957 1019 -1.66666666666667e-01 957 1018 8.33333333333333e-02 957 701 8.33333333333333e-02 957 967 1.66666666666667e-01 957 958 -3.33333333333333e-01 957 966 -7.50000000000000e-01 957 1043 -8.33333333333333e-02 957 710 8.33333333333333e-02 957 956 -8.33333333333333e-02 957 955 1.66666666666667e-01 957 785 -8.33333333333333e-02 957 791 8.33333333333333e-02 957 793 1.66666666666667e-01 957 790 -1.66666666666667e-01 957 700 8.33333333333333e-02 957 784 -8.33333333333333e-02 957 954 -2.50000000000000e-01 957 959 -3.33333333333333e-01 957 1013 1.66666666666667e-01 957 794 1.66666666666667e-01 957 1012 -8.33333333333333e-02 957 709 8.33333333333333e-02 957 989 8.33333333333333e-02 957 1011 -2.50000000000000e-01 957 792 -7.50000000000000e-01 958 958 2.50000000000000e+00 958 987 -1.66666666666667e-01 958 786 8.33333333333333e-02 958 951 -8.33333333333333e-02 958 788 8.33333333333333e-02 958 953 1.66666666666667e-01 958 952 -2.50000000000000e-01 958 983 1.66666666666667e-01 958 982 -7.50000000000000e-01 958 981 1.66666666666667e-01 958 1043 -8.33333333333333e-02 958 1041 -8.33333333333333e-02 958 968 -8.33333333333333e-02 958 1019 8.33333333333333e-02 958 1017 8.33333333333333e-02 958 967 -2.50000000000000e-01 958 966 1.66666666666667e-01 958 957 -3.33333333333333e-01 958 794 -8.33333333333333e-02 958 959 -3.33333333333333e-01 958 785 -8.33333333333333e-02 958 791 8.33333333333333e-02 958 954 1.66666666666667e-01 958 792 1.66666666666667e-01 958 789 -1.66666666666667e-01 958 701 -1.66666666666667e-01 958 956 1.66666666666667e-01 958 955 -7.50000000000000e-01 958 699 8.33333333333333e-02 958 783 -8.33333333333333e-02 958 1013 1.66666666666667e-01 958 710 -1.66666666666667e-01 958 989 8.33333333333333e-02 958 1012 -2.50000000000000e-01 958 793 -2.50000000000000e-01 958 1011 -8.33333333333333e-02 958 708 8.33333333333333e-02 959 959 2.50000000000000e+00 959 987 8.33333333333333e-02 959 951 1.66666666666667e-01 959 787 8.33333333333333e-02 959 786 -1.66666666666667e-01 959 953 -7.50000000000000e-01 959 952 1.66666666666667e-01 959 983 -2.50000000000000e-01 959 982 1.66666666666667e-01 959 981 -8.33333333333333e-02 959 1042 -8.33333333333333e-02 959 967 -8.33333333333333e-02 959 1018 8.33333333333333e-02 959 966 1.66666666666667e-01 959 1017 -1.66666666666667e-01 959 968 -2.50000000000000e-01 959 699 8.33333333333333e-02 959 1041 -8.33333333333333e-02 959 708 8.33333333333333e-02 959 793 -8.33333333333333e-02 959 958 -3.33333333333333e-01 959 954 -8.33333333333333e-02 959 784 -8.33333333333333e-02 959 790 8.33333333333333e-02 959 783 -8.33333333333333e-02 959 789 8.33333333333333e-02 959 956 -2.50000000000000e-01 959 700 -1.66666666666667e-01 959 955 1.66666666666667e-01 959 988 8.33333333333333e-02 959 1013 -7.50000000000000e-01 959 794 -2.50000000000000e-01 959 1012 1.66666666666667e-01 959 709 -1.66666666666667e-01 959 957 -3.33333333333333e-01 959 1011 1.66666666666667e-01 959 792 1.66666666666667e-01 960 960 1.25000000000000e+00 960 988 8.33333333333333e-02 960 989 8.33333333333333e-02 960 953 8.33333333333333e-02 960 962 -1.66666666666667e-01 960 952 8.33333333333333e-02 960 951 -3.75000000000000e-01 960 985 8.33333333333333e-02 960 984 -1.25000000000000e-01 960 967 -8.33333333333333e-02 960 961 -1.66666666666667e-01 960 803 8.33333333333333e-02 960 1081 -8.33333333333333e-02 960 814 8.33333333333333e-02 960 968 1.66666666666667e-01 960 815 -1.66666666666667e-01 960 716 4.16666666666667e-02 960 1082 -8.33333333333333e-02 960 802 8.33333333333333e-02 960 715 -8.33333333333333e-02 960 801 -3.75000000000000e-01 960 797 -4.16666666666667e-02 960 701 4.16666666666667e-02 960 796 8.33333333333333e-02 960 700 -8.33333333333333e-02 960 795 -1.25000000000000e-01 960 986 -4.16666666666667e-02 960 966 -2.50000000000000e-01 961 961 1.25000000000000e+00 961 987 8.33333333333333e-02 961 989 -1.66666666666667e-01 961 953 -4.16666666666667e-02 961 701 4.16666666666667e-02 961 952 -1.25000000000000e-01 961 951 8.33333333333333e-02 961 716 4.16666666666667e-02 961 985 -3.75000000000000e-01 961 984 8.33333333333333e-02 961 966 -8.33333333333333e-02 961 803 -4.16666666666667e-02 961 960 -1.66666666666667e-01 961 1080 -8.33333333333333e-02 961 813 8.33333333333333e-02 961 1082 -8.33333333333333e-02 961 815 8.33333333333333e-02 961 802 -1.25000000000000e-01 961 801 8.33333333333333e-02 961 714 -8.33333333333333e-02 961 797 8.33333333333333e-02 961 962 -1.66666666666667e-01 961 968 1.66666666666667e-01 961 796 -3.75000000000000e-01 961 986 8.33333333333333e-02 961 967 -2.50000000000000e-01 961 795 8.33333333333333e-02 961 699 -8.33333333333333e-02 962 962 1.25000000000000e+00 962 984 -4.16666666666667e-02 962 988 -1.66666666666667e-01 962 987 8.33333333333333e-02 962 953 -1.25000000000000e-01 962 952 -4.16666666666667e-02 962 700 4.16666666666667e-02 962 951 8.33333333333333e-02 962 960 -1.66666666666667e-01 962 986 -1.25000000000000e-01 962 715 4.16666666666667e-02 962 802 -4.16666666666667e-02 962 801 8.33333333333333e-02 962 1081 -8.33333333333333e-02 962 814 8.33333333333333e-02 962 966 1.66666666666667e-01 962 813 -1.66666666666667e-01 962 803 -1.25000000000000e-01 962 714 4.16666666666667e-02 962 1080 -8.33333333333333e-02 962 797 -1.25000000000000e-01 962 985 8.33333333333333e-02 962 968 -7.50000000000000e-01 962 796 8.33333333333333e-02 962 961 -1.66666666666667e-01 962 967 1.66666666666667e-01 962 795 -4.16666666666667e-02 962 699 4.16666666666667e-02 963 963 1.25000000000000e+00 963 1015 -4.16666666666667e-02 963 1018 8.33333333333333e-02 963 1016 8.33333333333333e-02 963 1014 -1.25000000000000e-01 963 956 8.33333333333333e-02 963 964 -1.66666666666667e-01 963 955 8.33333333333333e-02 963 954 -3.75000000000000e-01 963 1118 -8.33333333333333e-02 963 965 -1.66666666666667e-01 963 808 8.33333333333333e-02 963 815 8.33333333333333e-02 963 968 -8.33333333333333e-02 963 814 -1.66666666666667e-01 963 967 1.66666666666667e-01 963 809 8.33333333333333e-02 963 722 -8.33333333333333e-02 963 721 4.16666666666667e-02 963 1117 -8.33333333333333e-02 963 807 -3.75000000000000e-01 963 797 8.33333333333333e-02 963 701 -8.33333333333333e-02 963 796 -4.16666666666667e-02 963 700 4.16666666666667e-02 963 795 -1.25000000000000e-01 963 1019 8.33333333333333e-02 963 966 -2.50000000000000e-01 964 964 1.25000000000000e+00 964 1019 -1.66666666666667e-01 964 1014 -4.16666666666667e-02 964 1017 8.33333333333333e-02 964 722 4.16666666666667e-02 964 1015 -1.25000000000000e-01 964 701 4.16666666666667e-02 964 956 -4.16666666666667e-02 964 955 -1.25000000000000e-01 964 963 -1.66666666666667e-01 964 954 8.33333333333333e-02 964 1118 -8.33333333333333e-02 964 809 -4.16666666666667e-02 964 815 8.33333333333333e-02 964 807 8.33333333333333e-02 964 813 -1.66666666666667e-01 964 966 1.66666666666667e-01 964 808 -1.25000000000000e-01 964 720 4.16666666666667e-02 964 1116 -8.33333333333333e-02 964 797 8.33333333333333e-02 964 965 -1.66666666666667e-01 964 968 1.66666666666667e-01 964 796 -1.25000000000000e-01 964 1016 8.33333333333333e-02 964 967 -7.50000000000000e-01 964 795 -4.16666666666667e-02 964 699 4.16666666666667e-02 965 965 1.25000000000000e+00 965 1015 8.33333333333333e-02 965 1018 -1.66666666666667e-01 965 1016 -3.75000000000000e-01 965 721 4.16666666666667e-02 965 1014 8.33333333333333e-02 965 956 -1.25000000000000e-01 965 700 4.16666666666667e-02 965 955 -4.16666666666667e-02 965 954 8.33333333333333e-02 965 1117 -8.33333333333333e-02 965 1116 -8.33333333333333e-02 965 808 -4.16666666666667e-02 965 814 8.33333333333333e-02 965 963 -1.66666666666667e-01 965 813 8.33333333333333e-02 965 966 -8.33333333333333e-02 965 809 -1.25000000000000e-01 965 807 8.33333333333333e-02 965 720 -8.33333333333333e-02 965 797 -3.75000000000000e-01 965 1017 8.33333333333333e-02 965 968 -2.50000000000000e-01 965 796 8.33333333333333e-02 965 964 -1.66666666666667e-01 965 967 1.66666666666667e-01 965 795 8.33333333333333e-02 965 699 -8.33333333333333e-02 966 966 2.50000000000000e+00 966 989 -8.33333333333333e-02 966 953 -1.66666666666667e-01 966 988 1.66666666666667e-01 966 987 -2.50000000000000e-01 966 961 -8.33333333333333e-02 966 962 1.66666666666667e-01 966 960 -2.50000000000000e-01 966 1082 8.33333333333333e-02 966 1081 -1.66666666666667e-01 966 1042 8.33333333333333e-02 966 1018 -8.33333333333333e-02 966 968 -3.33333333333333e-01 966 959 1.66666666666667e-01 966 1019 1.66666666666667e-01 966 701 -8.33333333333333e-02 966 956 8.33333333333333e-02 966 958 1.66666666666667e-01 966 955 -1.66666666666667e-01 966 957 -7.50000000000000e-01 966 728 -8.33333333333333e-02 966 1043 8.33333333333333e-02 966 1017 -2.50000000000000e-01 966 797 8.33333333333333e-02 966 965 -8.33333333333333e-02 966 814 1.66666666666667e-01 966 967 -3.33333333333333e-01 966 964 1.66666666666667e-01 966 815 1.66666666666667e-01 966 1118 -1.66666666666667e-01 966 1117 8.33333333333333e-02 966 727 -8.33333333333333e-02 966 813 -7.50000000000000e-01 966 796 8.33333333333333e-02 966 700 -8.33333333333333e-02 966 963 -2.50000000000000e-01 966 952 8.33333333333333e-02 967 967 2.50000000000000e+00 967 989 1.66666666666667e-01 967 953 8.33333333333333e-02 967 988 -7.50000000000000e-01 967 987 1.66666666666667e-01 967 960 -8.33333333333333e-02 967 1082 8.33333333333333e-02 967 962 1.66666666666667e-01 967 961 -2.50000000000000e-01 967 1080 -1.66666666666667e-01 967 968 -3.33333333333333e-01 967 728 -8.33333333333333e-02 967 701 -8.33333333333333e-02 967 1041 8.33333333333333e-02 967 1017 -8.33333333333333e-02 967 959 -8.33333333333333e-02 967 956 8.33333333333333e-02 967 958 -2.50000000000000e-01 967 957 1.66666666666667e-01 967 954 -1.66666666666667e-01 967 1043 -1.66666666666667e-01 967 1019 1.66666666666667e-01 967 1018 -2.50000000000000e-01 967 815 -8.33333333333333e-02 967 1118 8.33333333333333e-02 967 813 1.66666666666667e-01 967 966 -3.33333333333333e-01 967 963 1.66666666666667e-01 967 814 -2.50000000000000e-01 967 1116 8.33333333333333e-02 967 726 -8.33333333333333e-02 967 797 -1.66666666666667e-01 967 965 1.66666666666667e-01 967 964 -7.50000000000000e-01 967 951 8.33333333333333e-02 967 795 8.33333333333333e-02 967 699 -8.33333333333333e-02 968 968 2.50000000000000e+00 968 987 -8.33333333333333e-02 968 952 8.33333333333333e-02 968 951 -1.66666666666667e-01 968 989 -2.50000000000000e-01 968 1081 8.33333333333333e-02 968 960 1.66666666666667e-01 968 962 -7.50000000000000e-01 968 961 1.66666666666667e-01 968 1080 8.33333333333333e-02 968 967 -3.33333333333333e-01 968 727 -8.33333333333333e-02 968 700 -8.33333333333333e-02 968 958 -8.33333333333333e-02 968 955 8.33333333333333e-02 968 966 -3.33333333333333e-01 968 957 1.66666666666667e-01 968 1017 1.66666666666667e-01 968 959 -2.50000000000000e-01 968 699 -8.33333333333333e-02 968 954 8.33333333333333e-02 968 1019 -7.50000000000000e-01 968 1042 -1.66666666666667e-01 968 1018 1.66666666666667e-01 968 726 -8.33333333333333e-02 968 1041 8.33333333333333e-02 968 814 -8.33333333333333e-02 968 1117 8.33333333333333e-02 968 795 8.33333333333333e-02 968 963 -8.33333333333333e-02 968 815 -2.50000000000000e-01 968 813 1.66666666666667e-01 968 1116 -1.66666666666667e-01 968 965 -2.50000000000000e-01 968 988 1.66666666666667e-01 968 796 -1.66666666666667e-01 968 964 1.66666666666667e-01 969 969 1.25000000000000e+00 969 994 -8.33333333333333e-02 969 977 -4.16666666666667e-02 969 980 8.33333333333333e-02 969 976 8.33333333333333e-02 969 975 -1.25000000000000e-01 969 992 4.16666666666667e-02 969 995 -8.33333333333333e-02 969 991 -8.33333333333333e-02 969 788 -4.16666666666667e-02 969 982 8.33333333333333e-02 969 973 -8.33333333333333e-02 969 704 8.33333333333333e-02 969 983 -1.66666666666667e-01 969 703 8.33333333333333e-02 969 970 -1.66666666666667e-01 969 787 8.33333333333333e-02 969 702 -3.75000000000000e-01 969 786 -1.25000000000000e-01 969 971 -1.66666666666667e-01 969 974 1.66666666666667e-01 969 979 8.33333333333333e-02 969 972 -2.50000000000000e-01 969 185 4.16666666666667e-02 969 80 8.33333333333333e-02 969 79 8.33333333333333e-02 969 184 -8.33333333333333e-02 969 78 -3.75000000000000e-01 970 970 1.25000000000000e+00 970 995 -8.33333333333333e-02 970 978 8.33333333333333e-02 970 993 -8.33333333333333e-02 970 977 8.33333333333333e-02 970 980 -1.66666666666667e-01 970 976 -3.75000000000000e-01 970 975 8.33333333333333e-02 970 990 -8.33333333333333e-02 970 971 -1.66666666666667e-01 970 788 8.33333333333333e-02 970 974 1.66666666666667e-01 970 981 8.33333333333333e-02 970 972 -8.33333333333333e-02 970 704 -4.16666666666667e-02 970 983 8.33333333333333e-02 970 703 -1.25000000000000e-01 970 787 -3.75000000000000e-01 970 702 8.33333333333333e-02 970 969 -1.66666666666667e-01 970 786 8.33333333333333e-02 970 992 4.16666666666667e-02 970 973 -2.50000000000000e-01 970 80 -4.16666666666667e-02 970 185 4.16666666666667e-02 970 79 -1.25000000000000e-01 970 78 8.33333333333333e-02 970 183 -8.33333333333333e-02 971 971 1.25000000000000e+00 971 994 -8.33333333333333e-02 971 977 -1.25000000000000e-01 971 976 8.33333333333333e-02 971 979 -1.66666666666667e-01 971 975 -4.16666666666667e-02 971 978 8.33333333333333e-02 971 990 4.16666666666667e-02 971 993 -8.33333333333333e-02 971 786 -4.16666666666667e-02 971 970 -1.66666666666667e-01 971 787 8.33333333333333e-02 971 973 1.66666666666667e-01 971 704 -1.25000000000000e-01 971 788 -1.25000000000000e-01 971 703 -4.16666666666667e-02 971 982 8.33333333333333e-02 971 702 8.33333333333333e-02 971 981 -1.66666666666667e-01 971 991 4.16666666666667e-02 971 974 -7.50000000000000e-01 971 969 -1.66666666666667e-01 971 972 1.66666666666667e-01 971 183 4.16666666666667e-02 971 80 -1.25000000000000e-01 971 79 -4.16666666666667e-02 971 184 4.16666666666667e-02 971 78 8.33333333333333e-02 972 972 2.50000000000000e+00 972 994 -1.66666666666667e-01 972 970 -8.33333333333333e-02 972 787 8.33333333333333e-02 972 788 8.33333333333333e-02 972 971 1.66666666666667e-01 972 969 -2.50000000000000e-01 972 983 1.66666666666667e-01 972 982 1.66666666666667e-01 972 981 -7.50000000000000e-01 972 1046 -8.33333333333333e-02 972 1045 -8.33333333333333e-02 972 980 -8.33333333333333e-02 972 1034 8.33333333333333e-02 972 1033 8.33333333333333e-02 972 979 1.66666666666667e-01 972 973 -3.33333333333333e-01 972 978 -2.50000000000000e-01 972 794 -8.33333333333333e-02 972 974 -3.33333333333333e-01 972 793 1.66666666666667e-01 972 1031 1.66666666666667e-01 972 710 -1.66666666666667e-01 972 1030 -8.33333333333333e-02 972 709 8.33333333333333e-02 972 1029 -2.50000000000000e-01 972 995 8.33333333333333e-02 972 792 -2.50000000000000e-01 972 185 -8.33333333333333e-02 972 191 8.33333333333333e-02 972 586 1.66666666666667e-01 972 190 -1.66666666666667e-01 972 587 1.66666666666667e-01 972 80 -1.66666666666667e-01 972 79 8.33333333333333e-02 972 184 -8.33333333333333e-02 972 585 -7.50000000000000e-01 973 973 2.50000000000000e+00 973 993 -1.66666666666667e-01 973 971 1.66666666666667e-01 973 969 -8.33333333333333e-02 973 786 8.33333333333333e-02 973 788 -1.66666666666667e-01 973 970 -2.50000000000000e-01 973 983 -8.33333333333333e-02 973 982 -2.50000000000000e-01 973 981 1.66666666666667e-01 973 1044 -8.33333333333333e-02 973 980 1.66666666666667e-01 973 1034 -1.66666666666667e-01 973 1032 8.33333333333333e-02 973 979 -7.50000000000000e-01 973 978 1.66666666666667e-01 973 972 -3.33333333333333e-01 973 1046 -8.33333333333333e-02 973 710 8.33333333333333e-02 973 792 1.66666666666667e-01 973 1031 1.66666666666667e-01 973 974 -3.33333333333333e-01 973 794 1.66666666666667e-01 973 1030 -2.50000000000000e-01 973 995 8.33333333333333e-02 973 793 -7.50000000000000e-01 973 1029 -8.33333333333333e-02 973 708 8.33333333333333e-02 973 80 8.33333333333333e-02 973 587 -8.33333333333333e-02 973 585 1.66666666666667e-01 973 185 -8.33333333333333e-02 973 191 8.33333333333333e-02 973 189 -1.66666666666667e-01 973 586 -2.50000000000000e-01 973 78 8.33333333333333e-02 973 183 -8.33333333333333e-02 974 974 2.50000000000000e+00 974 994 8.33333333333333e-02 974 970 1.66666666666667e-01 974 787 -1.66666666666667e-01 974 786 8.33333333333333e-02 974 971 -7.50000000000000e-01 974 969 1.66666666666667e-01 974 983 -2.50000000000000e-01 974 982 -8.33333333333333e-02 974 981 1.66666666666667e-01 974 1044 -8.33333333333333e-02 974 979 1.66666666666667e-01 974 978 -8.33333333333333e-02 974 1032 8.33333333333333e-02 974 1033 -1.66666666666667e-01 974 980 -2.50000000000000e-01 974 1045 -8.33333333333333e-02 974 709 8.33333333333333e-02 974 792 -8.33333333333333e-02 974 972 -3.33333333333333e-01 974 1031 -7.50000000000000e-01 974 993 8.33333333333333e-02 974 794 -2.50000000000000e-01 974 1030 1.66666666666667e-01 974 973 -3.33333333333333e-01 974 793 1.66666666666667e-01 974 1029 1.66666666666667e-01 974 708 -1.66666666666667e-01 974 79 8.33333333333333e-02 974 586 -8.33333333333333e-02 974 183 -8.33333333333333e-02 974 189 8.33333333333333e-02 974 184 -8.33333333333333e-02 974 190 8.33333333333333e-02 974 587 -2.50000000000000e-01 974 585 1.66666666666667e-01 974 78 -1.66666666666667e-01 975 975 1.25000000000000e+00 975 994 8.33333333333333e-02 975 995 -1.66666666666667e-01 975 971 -4.16666666666667e-02 975 970 8.33333333333333e-02 975 969 -1.25000000000000e-01 975 743 4.16666666666667e-02 975 991 8.33333333333333e-02 975 990 -3.75000000000000e-01 975 979 -8.33333333333333e-02 975 833 -4.16666666666667e-02 975 976 -1.66666666666667e-01 975 1204 -8.33333333333333e-02 975 835 8.33333333333333e-02 975 1205 -8.33333333333333e-02 975 836 8.33333333333333e-02 975 742 -8.33333333333333e-02 975 832 8.33333333333333e-02 975 831 -1.25000000000000e-01 975 977 -1.66666666666667e-01 975 980 1.66666666666667e-01 975 992 8.33333333333333e-02 975 978 -2.50000000000000e-01 975 80 4.16666666666667e-02 975 227 8.33333333333333e-02 975 226 8.33333333333333e-02 975 79 -8.33333333333333e-02 975 225 -3.75000000000000e-01 976 976 1.25000000000000e+00 976 993 8.33333333333333e-02 976 995 8.33333333333333e-02 976 971 8.33333333333333e-02 976 977 -1.66666666666667e-01 976 970 -3.75000000000000e-01 976 969 8.33333333333333e-02 976 991 -1.25000000000000e-01 976 990 8.33333333333333e-02 976 978 -8.33333333333333e-02 976 975 -1.66666666666667e-01 976 833 8.33333333333333e-02 976 1203 -8.33333333333333e-02 976 834 8.33333333333333e-02 976 980 1.66666666666667e-01 976 836 -1.66666666666667e-01 976 743 4.16666666666667e-02 976 1205 -8.33333333333333e-02 976 832 -3.75000000000000e-01 976 741 -8.33333333333333e-02 976 831 8.33333333333333e-02 976 992 -4.16666666666667e-02 976 979 -2.50000000000000e-01 976 227 -4.16666666666667e-02 976 80 4.16666666666667e-02 976 226 -1.25000000000000e-01 976 225 8.33333333333333e-02 976 78 -8.33333333333333e-02 977 977 1.25000000000000e+00 977 990 8.33333333333333e-02 977 994 8.33333333333333e-02 977 993 -1.66666666666667e-01 977 971 -1.25000000000000e-01 977 970 8.33333333333333e-02 977 976 -1.66666666666667e-01 977 969 -4.16666666666667e-02 977 992 -1.25000000000000e-01 977 741 4.16666666666667e-02 977 831 -4.16666666666667e-02 977 832 8.33333333333333e-02 977 979 1.66666666666667e-01 977 835 -1.66666666666667e-01 977 1203 -8.33333333333333e-02 977 834 8.33333333333333e-02 977 833 -1.25000000000000e-01 977 742 4.16666666666667e-02 977 1204 -8.33333333333333e-02 977 991 -4.16666666666667e-02 977 980 -7.50000000000000e-01 977 975 -1.66666666666667e-01 977 978 1.66666666666667e-01 977 78 4.16666666666667e-02 977 227 -1.25000000000000e-01 977 226 -4.16666666666667e-02 977 79 4.16666666666667e-02 977 225 8.33333333333333e-02 978 978 2.50000000000000e+00 978 995 1.66666666666667e-01 978 971 8.33333333333333e-02 978 994 1.66666666666667e-01 978 993 -7.50000000000000e-01 978 976 -8.33333333333333e-02 978 1205 8.33333333333333e-02 978 977 1.66666666666667e-01 978 975 -2.50000000000000e-01 978 1204 -1.66666666666667e-01 978 980 -3.33333333333333e-01 978 746 -8.33333333333333e-02 978 1045 8.33333333333333e-02 978 1033 -8.33333333333333e-02 978 974 -8.33333333333333e-02 978 1046 -1.66666666666667e-01 978 1034 1.66666666666667e-01 978 1032 -2.50000000000000e-01 978 973 1.66666666666667e-01 978 972 -2.50000000000000e-01 978 836 -8.33333333333333e-02 978 1211 8.33333333333333e-02 978 835 1.66666666666667e-01 978 979 -3.33333333333333e-01 978 1210 8.33333333333333e-02 978 745 -8.33333333333333e-02 978 834 -2.50000000000000e-01 978 970 8.33333333333333e-02 978 80 -8.33333333333333e-02 978 587 8.33333333333333e-02 978 586 -1.66666666666667e-01 978 589 1.66666666666667e-01 978 590 1.66666666666667e-01 978 227 -1.66666666666667e-01 978 226 8.33333333333333e-02 978 79 -8.33333333333333e-02 978 588 -7.50000000000000e-01 979 979 2.50000000000000e+00 979 995 -8.33333333333333e-02 979 971 -1.66666666666667e-01 979 994 -2.50000000000000e-01 979 993 1.66666666666667e-01 979 975 -8.33333333333333e-02 979 977 1.66666666666667e-01 979 976 -2.50000000000000e-01 979 1205 8.33333333333333e-02 979 1203 -1.66666666666667e-01 979 1044 8.33333333333333e-02 979 1032 -8.33333333333333e-02 979 974 1.66666666666667e-01 979 980 -3.33333333333333e-01 979 1034 1.66666666666667e-01 979 746 -8.33333333333333e-02 979 1046 8.33333333333333e-02 979 1033 -2.50000000000000e-01 979 973 -7.50000000000000e-01 979 972 1.66666666666667e-01 979 834 1.66666666666667e-01 979 978 -3.33333333333333e-01 979 1211 -1.66666666666667e-01 979 836 1.66666666666667e-01 979 835 -7.50000000000000e-01 979 1209 8.33333333333333e-02 979 744 -8.33333333333333e-02 979 969 8.33333333333333e-02 979 80 -8.33333333333333e-02 979 587 8.33333333333333e-02 979 585 -1.66666666666667e-01 979 227 8.33333333333333e-02 979 590 -8.33333333333333e-02 979 588 1.66666666666667e-01 979 589 -2.50000000000000e-01 979 225 8.33333333333333e-02 979 78 -8.33333333333333e-02 980 980 2.50000000000000e+00 980 993 1.66666666666667e-01 980 970 -1.66666666666667e-01 980 969 8.33333333333333e-02 980 995 -2.50000000000000e-01 980 976 1.66666666666667e-01 980 1203 8.33333333333333e-02 980 977 -7.50000000000000e-01 980 975 1.66666666666667e-01 980 1204 8.33333333333333e-02 980 978 -3.33333333333333e-01 980 744 -8.33333333333333e-02 980 973 1.66666666666667e-01 980 979 -3.33333333333333e-01 980 1033 1.66666666666667e-01 980 972 -8.33333333333333e-02 980 1034 -7.50000000000000e-01 980 745 -8.33333333333333e-02 980 1045 8.33333333333333e-02 980 1044 -1.66666666666667e-01 980 1032 1.66666666666667e-01 980 974 -2.50000000000000e-01 980 834 -8.33333333333333e-02 980 1209 8.33333333333333e-02 980 836 -2.50000000000000e-01 980 1210 -1.66666666666667e-01 980 835 1.66666666666667e-01 980 994 -8.33333333333333e-02 980 78 -8.33333333333333e-02 980 585 8.33333333333333e-02 980 79 -8.33333333333333e-02 980 586 8.33333333333333e-02 980 226 8.33333333333333e-02 980 589 -8.33333333333333e-02 980 590 -2.50000000000000e-01 980 588 1.66666666666667e-01 980 225 -1.66666666666667e-01 981 981 2.50000000000000e+00 981 995 -8.33333333333333e-02 981 994 1.66666666666667e-01 981 993 -2.50000000000000e-01 981 1046 8.33333333333333e-02 981 970 8.33333333333333e-02 981 971 -1.66666666666667e-01 981 974 1.66666666666667e-01 981 973 1.66666666666667e-01 981 972 -7.50000000000000e-01 981 982 -3.33333333333333e-01 981 703 -8.33333333333333e-02 981 709 -8.33333333333333e-02 981 1048 -8.33333333333333e-02 981 1042 8.33333333333333e-02 981 1049 -8.33333333333333e-02 981 998 8.33333333333333e-02 981 704 1.66666666666667e-01 981 983 -3.33333333333333e-01 981 989 1.66666666666667e-01 981 997 -1.66666666666667e-01 981 988 1.66666666666667e-01 981 987 -7.50000000000000e-01 981 710 1.66666666666667e-01 981 1043 -1.66666666666667e-01 981 787 -8.33333333333333e-02 981 952 8.33333333333333e-02 981 953 8.33333333333333e-02 981 788 -8.33333333333333e-02 981 702 -2.50000000000000e-01 981 959 -8.33333333333333e-02 981 794 8.33333333333333e-02 981 958 1.66666666666667e-01 981 793 -1.66666666666667e-01 981 957 -2.50000000000000e-01 981 1045 8.33333333333333e-02 981 708 -2.50000000000000e-01 982 982 2.50000000000000e+00 982 995 1.66666666666667e-01 982 994 -7.50000000000000e-01 982 993 1.66666666666667e-01 982 1046 -1.66666666666667e-01 982 969 8.33333333333333e-02 982 971 8.33333333333333e-02 982 974 -8.33333333333333e-02 982 973 -2.50000000000000e-01 982 972 1.66666666666667e-01 982 981 -3.33333333333333e-01 982 702 -8.33333333333333e-02 982 708 -8.33333333333333e-02 982 1047 -8.33333333333333e-02 982 1041 8.33333333333333e-02 982 998 8.33333333333333e-02 982 989 -8.33333333333333e-02 982 988 -2.50000000000000e-01 982 996 -1.66666666666667e-01 982 987 1.66666666666667e-01 982 1049 -8.33333333333333e-02 982 1043 8.33333333333333e-02 982 786 -8.33333333333333e-02 982 951 8.33333333333333e-02 982 788 -8.33333333333333e-02 982 794 8.33333333333333e-02 982 953 -1.66666666666667e-01 982 704 1.66666666666667e-01 982 703 -2.50000000000000e-01 982 959 1.66666666666667e-01 982 983 -3.33333333333333e-01 982 710 1.66666666666667e-01 982 958 -7.50000000000000e-01 982 1044 8.33333333333333e-02 982 709 -2.50000000000000e-01 982 957 1.66666666666667e-01 982 792 -1.66666666666667e-01 983 983 2.50000000000000e+00 983 994 1.66666666666667e-01 983 993 -8.33333333333333e-02 983 1045 -1.66666666666667e-01 983 1044 8.33333333333333e-02 983 970 8.33333333333333e-02 983 969 -1.66666666666667e-01 983 974 -2.50000000000000e-01 983 973 -8.33333333333333e-02 983 972 1.66666666666667e-01 983 1047 -8.33333333333333e-02 983 996 8.33333333333333e-02 983 989 -2.50000000000000e-01 983 997 8.33333333333333e-02 983 988 -8.33333333333333e-02 983 702 1.66666666666667e-01 983 981 -3.33333333333333e-01 983 987 1.66666666666667e-01 983 1048 -8.33333333333333e-02 983 1042 8.33333333333333e-02 983 708 1.66666666666667e-01 983 1041 -1.66666666666667e-01 983 787 -8.33333333333333e-02 983 793 8.33333333333333e-02 983 704 -7.50000000000000e-01 983 952 -1.66666666666667e-01 983 703 1.66666666666667e-01 983 951 8.33333333333333e-02 983 786 -8.33333333333333e-02 983 959 -2.50000000000000e-01 983 995 -2.50000000000000e-01 983 710 -7.50000000000000e-01 983 958 1.66666666666667e-01 983 982 -3.33333333333333e-01 983 709 1.66666666666667e-01 983 957 -8.33333333333333e-02 983 792 8.33333333333333e-02 984 984 1.25000000000000e+00 984 953 4.16666666666667e-02 984 952 -8.33333333333333e-02 984 961 8.33333333333333e-02 984 960 -1.25000000000000e-01 984 704 8.33333333333333e-02 984 986 -1.66666666666667e-01 984 989 1.66666666666667e-01 984 988 -8.33333333333333e-02 984 987 -2.50000000000000e-01 984 716 8.33333333333333e-02 984 1082 -1.66666666666667e-01 984 1081 8.33333333333333e-02 984 997 8.33333333333333e-02 984 1090 -8.33333333333333e-02 984 842 4.16666666666667e-02 984 1091 -8.33333333333333e-02 984 715 8.33333333333333e-02 984 841 -8.33333333333333e-02 984 714 -3.75000000000000e-01 984 839 -4.16666666666667e-02 984 998 8.33333333333333e-02 984 985 -1.66666666666667e-01 984 838 8.33333333333333e-02 984 703 8.33333333333333e-02 984 962 -4.16666666666667e-02 984 837 -1.25000000000000e-01 984 702 -3.75000000000000e-01 985 985 1.25000000000000e+00 985 986 -1.66666666666667e-01 985 704 -4.16666666666667e-02 985 953 4.16666666666667e-02 985 951 -8.33333333333333e-02 985 716 -4.16666666666667e-02 985 961 -3.75000000000000e-01 985 960 8.33333333333333e-02 985 1082 8.33333333333333e-02 985 989 1.66666666666667e-01 985 988 -2.50000000000000e-01 985 987 -8.33333333333333e-02 985 1080 8.33333333333333e-02 985 996 8.33333333333333e-02 985 1089 -8.33333333333333e-02 985 842 4.16666666666667e-02 985 1091 -8.33333333333333e-02 985 715 -1.25000000000000e-01 985 714 8.33333333333333e-02 985 840 -8.33333333333333e-02 985 839 8.33333333333333e-02 985 998 -1.66666666666667e-01 985 962 8.33333333333333e-02 985 838 -3.75000000000000e-01 985 703 -1.25000000000000e-01 985 984 -1.66666666666667e-01 985 837 8.33333333333333e-02 985 702 8.33333333333333e-02 986 986 1.25000000000000e+00 986 985 -1.66666666666667e-01 986 960 -4.16666666666667e-02 986 951 4.16666666666667e-02 986 703 -4.16666666666667e-02 986 952 4.16666666666667e-02 986 962 -1.25000000000000e-01 986 715 -4.16666666666667e-02 986 1081 8.33333333333333e-02 986 989 -7.50000000000000e-01 986 988 1.66666666666667e-01 986 702 8.33333333333333e-02 986 984 -1.66666666666667e-01 986 987 1.66666666666667e-01 986 714 8.33333333333333e-02 986 1080 -1.66666666666667e-01 986 841 4.16666666666667e-02 986 1090 -8.33333333333333e-02 986 716 -1.25000000000000e-01 986 840 4.16666666666667e-02 986 1089 -8.33333333333333e-02 986 961 8.33333333333333e-02 986 839 -1.25000000000000e-01 986 704 -1.25000000000000e-01 986 838 8.33333333333333e-02 986 997 -1.66666666666667e-01 986 837 -4.16666666666667e-02 986 996 8.33333333333333e-02 987 987 2.50000000000000e+00 987 958 -1.66666666666667e-01 987 953 -8.33333333333333e-02 987 961 8.33333333333333e-02 987 952 -8.33333333333333e-02 987 962 8.33333333333333e-02 987 968 -8.33333333333333e-02 987 967 1.66666666666667e-01 987 966 -2.50000000000000e-01 987 1091 8.33333333333333e-02 987 1090 -1.66666666666667e-01 987 1081 1.66666666666667e-01 987 986 1.66666666666667e-01 987 703 8.33333333333333e-02 987 985 -8.33333333333333e-02 987 984 -2.50000000000000e-01 987 1082 1.66666666666667e-01 987 727 8.33333333333333e-02 987 1080 -7.50000000000000e-01 987 989 -3.33333333333333e-01 987 1042 -8.33333333333333e-02 987 998 -8.33333333333333e-02 987 1048 8.33333333333333e-02 987 1153 -8.33333333333333e-02 987 1049 8.33333333333333e-02 987 1154 -8.33333333333333e-02 987 704 -1.66666666666667e-01 987 983 1.66666666666667e-01 987 997 1.66666666666667e-01 987 982 1.66666666666667e-01 987 988 -3.33333333333333e-01 987 996 -2.50000000000000e-01 987 981 -7.50000000000000e-01 987 1043 1.66666666666667e-01 987 728 -1.66666666666667e-01 987 959 8.33333333333333e-02 987 1041 -2.50000000000000e-01 988 988 2.50000000000000e+00 988 957 -1.66666666666667e-01 988 960 8.33333333333333e-02 988 951 -8.33333333333333e-02 988 962 -1.66666666666667e-01 988 968 1.66666666666667e-01 988 953 -8.33333333333333e-02 988 967 -7.50000000000000e-01 988 966 1.66666666666667e-01 988 1091 8.33333333333333e-02 988 1082 -8.33333333333333e-02 988 1089 -1.66666666666667e-01 988 1080 1.66666666666667e-01 988 986 1.66666666666667e-01 988 989 -3.33333333333333e-01 988 985 -2.50000000000000e-01 988 702 8.33333333333333e-02 988 984 -8.33333333333333e-02 988 1081 -2.50000000000000e-01 988 726 8.33333333333333e-02 988 1041 -8.33333333333333e-02 988 998 1.66666666666667e-01 988 1047 8.33333333333333e-02 988 1152 -8.33333333333333e-02 988 1049 -1.66666666666667e-01 988 1043 1.66666666666667e-01 988 704 8.33333333333333e-02 988 983 -8.33333333333333e-02 988 997 -7.50000000000000e-01 988 982 -2.50000000000000e-01 988 996 1.66666666666667e-01 988 981 1.66666666666667e-01 988 987 -3.33333333333333e-01 988 1154 -8.33333333333333e-02 988 728 8.33333333333333e-02 988 959 8.33333333333333e-02 988 1042 -2.50000000000000e-01 989 989 2.50000000000000e+00 989 957 8.33333333333333e-02 989 951 -8.33333333333333e-02 989 961 -1.66666666666667e-01 989 967 1.66666666666667e-01 989 960 8.33333333333333e-02 989 966 -8.33333333333333e-02 989 952 -8.33333333333333e-02 989 968 -2.50000000000000e-01 989 1090 8.33333333333333e-02 989 1081 -8.33333333333333e-02 989 1089 8.33333333333333e-02 989 986 -7.50000000000000e-01 989 985 1.66666666666667e-01 989 988 -3.33333333333333e-01 989 984 1.66666666666667e-01 989 1082 -2.50000000000000e-01 989 1080 1.66666666666667e-01 989 987 -3.33333333333333e-01 989 996 -8.33333333333333e-02 989 997 1.66666666666667e-01 989 1048 -1.66666666666667e-01 989 1042 1.66666666666667e-01 989 1047 8.33333333333333e-02 989 1152 -8.33333333333333e-02 989 998 -2.50000000000000e-01 989 983 -2.50000000000000e-01 989 703 8.33333333333333e-02 989 982 -8.33333333333333e-02 989 702 -1.66666666666667e-01 989 981 1.66666666666667e-01 989 958 8.33333333333333e-02 989 1043 -7.50000000000000e-01 989 1153 -8.33333333333333e-02 989 727 8.33333333333333e-02 989 1041 1.66666666666667e-01 989 726 -1.66666666666667e-01 990 990 1.25000000000000e+00 990 977 8.33333333333333e-02 990 971 4.16666666666667e-02 990 704 -4.16666666666667e-02 990 970 -8.33333333333333e-02 990 743 -4.16666666666667e-02 990 976 8.33333333333333e-02 990 975 -3.75000000000000e-01 990 1205 8.33333333333333e-02 990 1204 8.33333333333333e-02 990 995 1.66666666666667e-01 990 994 -8.33333333333333e-02 990 993 -2.50000000000000e-01 990 997 8.33333333333333e-02 990 1207 -8.33333333333333e-02 990 845 4.16666666666667e-02 990 1208 -8.33333333333333e-02 990 844 -8.33333333333333e-02 990 742 8.33333333333333e-02 990 741 -1.25000000000000e-01 990 839 8.33333333333333e-02 990 998 -1.66666666666667e-01 990 838 8.33333333333333e-02 990 991 -1.66666666666667e-01 990 703 8.33333333333333e-02 990 837 -3.75000000000000e-01 990 992 -1.66666666666667e-01 990 702 -1.25000000000000e-01 991 991 1.25000000000000e+00 991 971 4.16666666666667e-02 991 969 -8.33333333333333e-02 991 976 -1.25000000000000e-01 991 975 8.33333333333333e-02 991 743 8.33333333333333e-02 991 1205 -1.66666666666667e-01 991 1203 8.33333333333333e-02 991 992 -1.66666666666667e-01 991 704 8.33333333333333e-02 991 995 1.66666666666667e-01 991 994 -2.50000000000000e-01 991 993 -8.33333333333333e-02 991 996 8.33333333333333e-02 991 1206 -8.33333333333333e-02 991 845 4.16666666666667e-02 991 1208 -8.33333333333333e-02 991 742 -3.75000000000000e-01 991 843 -8.33333333333333e-02 991 741 8.33333333333333e-02 991 839 -4.16666666666667e-02 991 998 8.33333333333333e-02 991 838 -1.25000000000000e-01 991 977 -4.16666666666667e-02 991 703 -3.75000000000000e-01 991 837 8.33333333333333e-02 991 990 -1.66666666666667e-01 991 702 8.33333333333333e-02 992 992 1.25000000000000e+00 992 970 4.16666666666667e-02 992 990 -1.66666666666667e-01 992 975 8.33333333333333e-02 992 969 4.16666666666667e-02 992 702 -4.16666666666667e-02 992 977 -1.25000000000000e-01 992 741 -4.16666666666667e-02 992 1203 8.33333333333333e-02 992 742 8.33333333333333e-02 992 1204 -1.66666666666667e-01 992 995 -7.50000000000000e-01 992 991 -1.66666666666667e-01 992 703 8.33333333333333e-02 992 994 1.66666666666667e-01 992 993 1.66666666666667e-01 992 843 4.16666666666667e-02 992 1206 -8.33333333333333e-02 992 743 -1.25000000000000e-01 992 844 4.16666666666667e-02 992 1207 -8.33333333333333e-02 992 839 -1.25000000000000e-01 992 976 -4.16666666666667e-02 992 704 -1.25000000000000e-01 992 838 -4.16666666666667e-02 992 997 8.33333333333333e-02 992 837 8.33333333333333e-02 992 996 -1.66666666666667e-01 993 993 2.50000000000000e+00 993 973 -1.66666666666667e-01 993 970 -8.33333333333333e-02 993 976 8.33333333333333e-02 993 980 1.66666666666667e-01 993 977 -1.66666666666667e-01 993 971 -8.33333333333333e-02 993 979 1.66666666666667e-01 993 978 -7.50000000000000e-01 993 1208 8.33333333333333e-02 993 1205 -8.33333333333333e-02 993 1204 1.66666666666667e-01 993 1207 -1.66666666666667e-01 993 992 1.66666666666667e-01 993 995 -3.33333333333333e-01 993 991 -8.33333333333333e-02 993 703 8.33333333333333e-02 993 990 -2.50000000000000e-01 993 745 8.33333333333333e-02 993 1203 -2.50000000000000e-01 993 1045 -8.33333333333333e-02 993 998 1.66666666666667e-01 993 1048 8.33333333333333e-02 993 1216 -8.33333333333333e-02 993 1049 -1.66666666666667e-01 993 1046 1.66666666666667e-01 993 704 8.33333333333333e-02 993 983 -8.33333333333333e-02 993 997 1.66666666666667e-01 993 982 1.66666666666667e-01 993 994 -3.33333333333333e-01 993 996 -7.50000000000000e-01 993 981 -2.50000000000000e-01 993 1217 -8.33333333333333e-02 993 746 8.33333333333333e-02 993 974 8.33333333333333e-02 993 1044 -2.50000000000000e-01 994 994 2.50000000000000e+00 994 972 -1.66666666666667e-01 994 971 -8.33333333333333e-02 994 969 -8.33333333333333e-02 994 975 8.33333333333333e-02 994 980 -8.33333333333333e-02 994 977 8.33333333333333e-02 994 979 -2.50000000000000e-01 994 978 1.66666666666667e-01 994 1208 8.33333333333333e-02 994 1203 1.66666666666667e-01 994 1206 -1.66666666666667e-01 994 992 1.66666666666667e-01 994 991 -2.50000000000000e-01 994 990 -8.33333333333333e-02 994 702 8.33333333333333e-02 994 1205 1.66666666666667e-01 994 1204 -7.50000000000000e-01 994 744 8.33333333333333e-02 994 995 -3.33333333333333e-01 994 1044 -8.33333333333333e-02 994 998 -8.33333333333333e-02 994 1047 8.33333333333333e-02 994 1215 -8.33333333333333e-02 994 1217 -8.33333333333333e-02 994 1049 8.33333333333333e-02 994 704 -1.66666666666667e-01 994 983 1.66666666666667e-01 994 997 -2.50000000000000e-01 994 982 -7.50000000000000e-01 994 996 1.66666666666667e-01 994 981 1.66666666666667e-01 994 993 -3.33333333333333e-01 994 1046 1.66666666666667e-01 994 746 -1.66666666666667e-01 994 974 8.33333333333333e-02 994 1045 -2.50000000000000e-01 995 995 2.50000000000000e+00 995 973 8.33333333333333e-02 995 970 -8.33333333333333e-02 995 979 -8.33333333333333e-02 995 976 8.33333333333333e-02 995 978 1.66666666666667e-01 995 975 -1.66666666666667e-01 995 969 -8.33333333333333e-02 995 980 -2.50000000000000e-01 995 1206 8.33333333333333e-02 995 1203 -8.33333333333333e-02 995 1207 8.33333333333333e-02 995 992 -7.50000000000000e-01 995 991 1.66666666666667e-01 995 990 1.66666666666667e-01 995 993 -3.33333333333333e-01 995 1205 -2.50000000000000e-01 995 1204 1.66666666666667e-01 995 994 -3.33333333333333e-01 995 997 -8.33333333333333e-02 995 996 1.66666666666667e-01 995 1216 -8.33333333333333e-02 995 1048 8.33333333333333e-02 995 1047 -1.66666666666667e-01 995 1044 1.66666666666667e-01 995 998 -2.50000000000000e-01 995 983 -2.50000000000000e-01 995 703 -1.66666666666667e-01 995 982 1.66666666666667e-01 995 702 8.33333333333333e-02 995 981 -8.33333333333333e-02 995 972 8.33333333333333e-02 995 1046 -7.50000000000000e-01 995 1045 1.66666666666667e-01 995 745 -1.66666666666667e-01 995 1215 -8.33333333333333e-02 995 744 8.33333333333333e-02 996 996 2.50000000000000e+00 996 1216 8.33333333333333e-02 996 1217 8.33333333333333e-02 996 994 1.66666666666667e-01 996 993 -7.50000000000000e-01 996 991 8.33333333333333e-02 996 1208 -8.33333333333333e-02 996 992 -1.66666666666667e-01 996 1207 1.66666666666667e-01 996 1206 -2.50000000000000e-01 996 997 -3.33333333333333e-01 996 703 -8.33333333333333e-02 996 751 -8.33333333333333e-02 996 983 8.33333333333333e-02 996 989 -8.33333333333333e-02 996 1048 -8.33333333333333e-02 996 1153 8.33333333333333e-02 996 982 -1.66666666666667e-01 996 988 1.66666666666667e-01 996 987 -2.50000000000000e-01 996 1049 1.66666666666667e-01 996 1154 -1.66666666666667e-01 996 1047 -2.50000000000000e-01 996 838 -8.33333333333333e-02 996 985 8.33333333333333e-02 996 839 1.66666666666667e-01 996 998 -3.33333333333333e-01 996 1091 1.66666666666667e-01 996 986 8.33333333333333e-02 996 704 -8.33333333333333e-02 996 837 -2.50000000000000e-01 996 851 8.33333333333333e-02 996 752 -8.33333333333333e-02 996 1090 1.66666666666667e-01 996 850 -1.66666666666667e-01 996 1089 -7.50000000000000e-01 996 995 1.66666666666667e-01 997 997 2.50000000000000e+00 997 1215 8.33333333333333e-02 997 1217 -1.66666666666667e-01 997 994 -2.50000000000000e-01 997 993 1.66666666666667e-01 997 990 8.33333333333333e-02 997 1208 1.66666666666667e-01 997 992 8.33333333333333e-02 997 1207 -7.50000000000000e-01 997 1206 1.66666666666667e-01 997 996 -3.33333333333333e-01 997 702 -8.33333333333333e-02 997 750 -8.33333333333333e-02 997 1049 1.66666666666667e-01 997 998 -3.33333333333333e-01 997 989 1.66666666666667e-01 997 1047 -8.33333333333333e-02 997 1152 8.33333333333333e-02 997 704 -8.33333333333333e-02 997 983 8.33333333333333e-02 997 988 -7.50000000000000e-01 997 981 -1.66666666666667e-01 997 987 1.66666666666667e-01 997 752 -8.33333333333333e-02 997 1154 8.33333333333333e-02 997 1048 -2.50000000000000e-01 997 837 -8.33333333333333e-02 997 984 8.33333333333333e-02 997 851 8.33333333333333e-02 997 1091 -8.33333333333333e-02 997 986 -1.66666666666667e-01 997 839 1.66666666666667e-01 997 838 -2.50000000000000e-01 997 1090 -2.50000000000000e-01 997 995 -8.33333333333333e-02 997 1089 1.66666666666667e-01 997 849 -1.66666666666667e-01 998 998 2.50000000000000e+00 998 993 1.66666666666667e-01 998 1216 -1.66666666666667e-01 998 1215 8.33333333333333e-02 998 995 -2.50000000000000e-01 998 1207 1.66666666666667e-01 998 1206 -8.33333333333333e-02 998 991 8.33333333333333e-02 998 990 -1.66666666666667e-01 998 1208 -2.50000000000000e-01 998 981 8.33333333333333e-02 998 987 -8.33333333333333e-02 998 1048 1.66666666666667e-01 998 997 -3.33333333333333e-01 998 988 1.66666666666667e-01 998 989 -2.50000000000000e-01 998 703 -8.33333333333333e-02 998 982 8.33333333333333e-02 998 1049 -7.50000000000000e-01 998 751 -8.33333333333333e-02 998 1153 8.33333333333333e-02 998 1047 1.66666666666667e-01 998 1152 -1.66666666666667e-01 998 850 8.33333333333333e-02 998 1090 -8.33333333333333e-02 998 837 1.66666666666667e-01 998 996 -3.33333333333333e-01 998 1089 1.66666666666667e-01 998 839 -7.50000000000000e-01 998 985 -1.66666666666667e-01 998 838 1.66666666666667e-01 998 984 8.33333333333333e-02 998 702 -8.33333333333333e-02 998 1091 -2.50000000000000e-01 998 994 -8.33333333333333e-02 998 849 8.33333333333333e-02 998 750 -8.33333333333333e-02 999 999 1.25000000000000e+00 999 1025 -8.33333333333333e-02 999 1022 -8.33333333333333e-02 999 1021 4.16666666666667e-02 999 1024 -8.33333333333333e-02 999 1007 8.33333333333333e-02 999 1006 -4.16666666666667e-02 999 1009 8.33333333333333e-02 999 1005 -1.25000000000000e-01 999 790 -4.16666666666667e-02 999 1013 8.33333333333333e-02 999 1004 -8.33333333333333e-02 999 1000 -1.66666666666667e-01 999 1003 1.66666666666667e-01 999 1002 -2.50000000000000e-01 999 1001 -1.66666666666667e-01 999 707 8.33333333333333e-02 999 791 8.33333333333333e-02 999 706 8.33333333333333e-02 999 1012 -1.66666666666667e-01 999 1010 8.33333333333333e-02 999 705 -3.75000000000000e-01 999 789 -1.25000000000000e-01 999 187 4.16666666666667e-02 999 83 8.33333333333333e-02 999 188 -8.33333333333333e-02 999 82 8.33333333333333e-02 999 81 -3.75000000000000e-01 1000 1000 1.25000000000000e+00 1000 1025 -8.33333333333333e-02 1000 1020 4.16666666666667e-02 1000 1023 -8.33333333333333e-02 1000 1007 8.33333333333333e-02 1000 1010 -1.66666666666667e-01 1000 1006 -1.25000000000000e-01 1000 1005 -4.16666666666667e-02 1000 1008 8.33333333333333e-02 1000 789 -4.16666666666667e-02 1000 791 8.33333333333333e-02 1000 1001 -1.66666666666667e-01 1000 1004 1.66666666666667e-01 1000 1003 -7.50000000000000e-01 1000 999 -1.66666666666667e-01 1000 1002 1.66666666666667e-01 1000 707 -4.16666666666667e-02 1000 1013 8.33333333333333e-02 1000 1022 4.16666666666667e-02 1000 706 -1.25000000000000e-01 1000 790 -1.25000000000000e-01 1000 705 8.33333333333333e-02 1000 1011 -1.66666666666667e-01 1000 186 4.16666666666667e-02 1000 83 -4.16666666666667e-02 1000 188 4.16666666666667e-02 1000 82 -1.25000000000000e-01 1000 81 8.33333333333333e-02 1001 1001 1.25000000000000e+00 1001 1024 -8.33333333333333e-02 1001 1008 8.33333333333333e-02 1001 1023 -8.33333333333333e-02 1001 1020 -8.33333333333333e-02 1001 1007 -3.75000000000000e-01 1001 1006 8.33333333333333e-02 1001 1009 -1.66666666666667e-01 1001 1005 8.33333333333333e-02 1001 790 8.33333333333333e-02 1001 1000 -1.66666666666667e-01 1001 1003 1.66666666666667e-01 1001 1011 8.33333333333333e-02 1001 1002 -8.33333333333333e-02 1001 1004 -2.50000000000000e-01 1001 1021 4.16666666666667e-02 1001 707 -1.25000000000000e-01 1001 791 -3.75000000000000e-01 1001 706 -4.16666666666667e-02 1001 1012 8.33333333333333e-02 1001 999 -1.66666666666667e-01 1001 705 8.33333333333333e-02 1001 789 8.33333333333333e-02 1001 83 -1.25000000000000e-01 1001 82 -4.16666666666667e-02 1001 187 4.16666666666667e-02 1001 81 8.33333333333333e-02 1001 186 -8.33333333333333e-02 1002 1002 2.50000000000000e+00 1002 1037 8.33333333333333e-02 1002 1031 -8.33333333333333e-02 1002 1030 1.66666666666667e-01 1002 1029 -2.50000000000000e-01 1002 1009 -8.33333333333333e-02 1002 1051 -8.33333333333333e-02 1002 1024 8.33333333333333e-02 1002 1010 1.66666666666667e-01 1002 1025 -1.66666666666667e-01 1002 710 8.33333333333333e-02 1002 1052 -8.33333333333333e-02 1002 1008 -2.50000000000000e-01 1002 791 8.33333333333333e-02 1002 1001 -8.33333333333333e-02 1002 1003 -3.33333333333333e-01 1002 790 8.33333333333333e-02 1002 793 -8.33333333333333e-02 1002 1000 1.66666666666667e-01 1002 999 -2.50000000000000e-01 1002 1004 -3.33333333333333e-01 1002 1013 1.66666666666667e-01 1002 794 1.66666666666667e-01 1002 1012 1.66666666666667e-01 1002 709 -1.66666666666667e-01 1002 1036 8.33333333333333e-02 1002 1011 -7.50000000000000e-01 1002 792 -2.50000000000000e-01 1002 593 1.66666666666667e-01 1002 191 -1.66666666666667e-01 1002 190 8.33333333333333e-02 1002 592 1.66666666666667e-01 1002 591 -7.50000000000000e-01 1002 83 8.33333333333333e-02 1002 188 -8.33333333333333e-02 1002 187 -8.33333333333333e-02 1002 82 -1.66666666666667e-01 1003 1003 2.50000000000000e+00 1003 1037 -1.66666666666667e-01 1003 1031 1.66666666666667e-01 1003 1030 -7.50000000000000e-01 1003 1029 1.66666666666667e-01 1003 1008 -8.33333333333333e-02 1003 1050 -8.33333333333333e-02 1003 1023 8.33333333333333e-02 1003 1052 -8.33333333333333e-02 1003 1025 8.33333333333333e-02 1003 1004 -3.33333333333333e-01 1003 1010 1.66666666666667e-01 1003 1009 -2.50000000000000e-01 1003 1001 1.66666666666667e-01 1003 1002 -3.33333333333333e-01 1003 791 -1.66666666666667e-01 1003 794 1.66666666666667e-01 1003 789 8.33333333333333e-02 1003 792 -8.33333333333333e-02 1003 1000 -7.50000000000000e-01 1003 999 1.66666666666667e-01 1003 1013 -8.33333333333333e-02 1003 710 8.33333333333333e-02 1003 1035 8.33333333333333e-02 1003 1012 -2.50000000000000e-01 1003 793 -2.50000000000000e-01 1003 1011 1.66666666666667e-01 1003 708 -1.66666666666667e-01 1003 593 -8.33333333333333e-02 1003 191 8.33333333333333e-02 1003 189 8.33333333333333e-02 1003 592 -2.50000000000000e-01 1003 591 1.66666666666667e-01 1003 186 -8.33333333333333e-02 1003 83 8.33333333333333e-02 1003 188 -8.33333333333333e-02 1003 81 -1.66666666666667e-01 1004 1004 2.50000000000000e+00 1004 1035 8.33333333333333e-02 1004 1031 -2.50000000000000e-01 1004 1030 1.66666666666667e-01 1004 1029 -8.33333333333333e-02 1004 1051 -8.33333333333333e-02 1004 1024 8.33333333333333e-02 1004 1008 1.66666666666667e-01 1004 1023 -1.66666666666667e-01 1004 708 8.33333333333333e-02 1004 1050 -8.33333333333333e-02 1004 1010 -7.50000000000000e-01 1004 1003 -3.33333333333333e-01 1004 1009 1.66666666666667e-01 1004 1000 1.66666666666667e-01 1004 789 8.33333333333333e-02 1004 999 -8.33333333333333e-02 1004 790 -1.66666666666667e-01 1004 793 1.66666666666667e-01 1004 1001 -2.50000000000000e-01 1004 1036 -1.66666666666667e-01 1004 1013 -2.50000000000000e-01 1004 794 -7.50000000000000e-01 1004 1012 -8.33333333333333e-02 1004 709 8.33333333333333e-02 1004 1002 -3.33333333333333e-01 1004 1011 1.66666666666667e-01 1004 792 1.66666666666667e-01 1004 592 -8.33333333333333e-02 1004 190 8.33333333333333e-02 1004 591 1.66666666666667e-01 1004 189 -1.66666666666667e-01 1004 593 -2.50000000000000e-01 1004 81 8.33333333333333e-02 1004 186 -8.33333333333333e-02 1004 82 8.33333333333333e-02 1004 187 -8.33333333333333e-02 1005 1005 1.25000000000000e+00 1005 1025 8.33333333333333e-02 1005 1024 -1.66666666666667e-01 1005 1001 8.33333333333333e-02 1005 1000 -4.16666666666667e-02 1005 999 -1.25000000000000e-01 1005 1022 8.33333333333333e-02 1005 760 4.16666666666667e-02 1005 1020 -3.75000000000000e-01 1005 1010 -8.33333333333333e-02 1005 1007 -1.66666666666667e-01 1005 868 -4.16666666666667e-02 1005 1241 -8.33333333333333e-02 1005 872 8.33333333333333e-02 1005 1240 -8.33333333333333e-02 1005 871 8.33333333333333e-02 1005 869 8.33333333333333e-02 1005 761 -8.33333333333333e-02 1005 867 -1.25000000000000e-01 1005 1006 -1.66666666666667e-01 1005 1009 1.66666666666667e-01 1005 1021 8.33333333333333e-02 1005 1008 -2.50000000000000e-01 1005 82 4.16666666666667e-02 1005 269 8.33333333333333e-02 1005 83 -8.33333333333333e-02 1005 268 8.33333333333333e-02 1005 267 -3.75000000000000e-01 1006 1006 1.25000000000000e+00 1006 1020 8.33333333333333e-02 1006 1025 8.33333333333333e-02 1006 1023 -1.66666666666667e-01 1006 1001 8.33333333333333e-02 1006 1007 -1.66666666666667e-01 1006 1000 -1.25000000000000e-01 1006 999 -4.16666666666667e-02 1006 1021 -1.25000000000000e-01 1006 759 4.16666666666667e-02 1006 867 -4.16666666666667e-02 1006 869 8.33333333333333e-02 1006 1010 1.66666666666667e-01 1006 872 -1.66666666666667e-01 1006 1239 -8.33333333333333e-02 1006 870 8.33333333333333e-02 1006 761 4.16666666666667e-02 1006 1241 -8.33333333333333e-02 1006 868 -1.25000000000000e-01 1006 1022 -4.16666666666667e-02 1006 1009 -7.50000000000000e-01 1006 1005 -1.66666666666667e-01 1006 1008 1.66666666666667e-01 1006 81 4.16666666666667e-02 1006 269 -4.16666666666667e-02 1006 83 4.16666666666667e-02 1006 268 -1.25000000000000e-01 1006 267 8.33333333333333e-02 1007 1007 1.25000000000000e+00 1007 1023 8.33333333333333e-02 1007 1024 8.33333333333333e-02 1007 1001 -3.75000000000000e-01 1007 1000 8.33333333333333e-02 1007 1006 -1.66666666666667e-01 1007 999 8.33333333333333e-02 1007 1022 -1.25000000000000e-01 1007 1020 8.33333333333333e-02 1007 1008 -8.33333333333333e-02 1007 1005 -1.66666666666667e-01 1007 868 8.33333333333333e-02 1007 1239 -8.33333333333333e-02 1007 870 8.33333333333333e-02 1007 1009 1.66666666666667e-01 1007 871 -1.66666666666667e-01 1007 869 -3.75000000000000e-01 1007 760 4.16666666666667e-02 1007 1240 -8.33333333333333e-02 1007 867 8.33333333333333e-02 1007 759 -8.33333333333333e-02 1007 1021 -4.16666666666667e-02 1007 1010 -2.50000000000000e-01 1007 269 -1.25000000000000e-01 1007 268 -4.16666666666667e-02 1007 82 4.16666666666667e-02 1007 267 8.33333333333333e-02 1007 81 -8.33333333333333e-02 1008 1008 2.50000000000000e+00 1008 1036 1.66666666666667e-01 1008 1035 -2.50000000000000e-01 1008 1246 8.33333333333333e-02 1008 1247 8.33333333333333e-02 1008 1003 -8.33333333333333e-02 1008 1004 1.66666666666667e-01 1008 1010 -3.33333333333333e-01 1008 1002 -2.50000000000000e-01 1008 1052 8.33333333333333e-02 1008 764 -8.33333333333333e-02 1008 1051 -1.66666666666667e-01 1008 1001 8.33333333333333e-02 1008 1009 -3.33333333333333e-01 1008 1024 1.66666666666667e-01 1008 1000 8.33333333333333e-02 1008 1025 1.66666666666667e-01 1008 763 -8.33333333333333e-02 1008 1023 -7.50000000000000e-01 1008 1007 -8.33333333333333e-02 1008 1240 8.33333333333333e-02 1008 871 -8.33333333333333e-02 1008 1006 1.66666666666667e-01 1008 1005 -2.50000000000000e-01 1008 872 1.66666666666667e-01 1008 1241 -1.66666666666667e-01 1008 870 -2.50000000000000e-01 1008 1037 -8.33333333333333e-02 1008 593 -1.66666666666667e-01 1008 592 8.33333333333333e-02 1008 596 1.66666666666667e-01 1008 595 1.66666666666667e-01 1008 594 -7.50000000000000e-01 1008 83 -8.33333333333333e-02 1008 82 -8.33333333333333e-02 1008 269 8.33333333333333e-02 1008 268 -1.66666666666667e-01 1009 1009 2.50000000000000e+00 1009 1035 1.66666666666667e-01 1009 1037 1.66666666666667e-01 1009 1036 -7.50000000000000e-01 1009 1245 8.33333333333333e-02 1009 1247 -1.66666666666667e-01 1009 1002 -8.33333333333333e-02 1009 1052 8.33333333333333e-02 1009 1004 1.66666666666667e-01 1009 1003 -2.50000000000000e-01 1009 1050 -1.66666666666667e-01 1009 1025 -8.33333333333333e-02 1009 1008 -3.33333333333333e-01 1009 1023 1.66666666666667e-01 1009 1001 -1.66666666666667e-01 1009 999 8.33333333333333e-02 1009 1024 -2.50000000000000e-01 1009 762 -8.33333333333333e-02 1009 1007 1.66666666666667e-01 1009 1010 -3.33333333333333e-01 1009 872 1.66666666666667e-01 1009 1239 8.33333333333333e-02 1009 870 -8.33333333333333e-02 1009 1006 -7.50000000000000e-01 1009 1005 1.66666666666667e-01 1009 1241 8.33333333333333e-02 1009 764 -8.33333333333333e-02 1009 871 -2.50000000000000e-01 1009 591 8.33333333333333e-02 1009 596 -8.33333333333333e-02 1009 595 -2.50000000000000e-01 1009 594 1.66666666666667e-01 1009 81 -8.33333333333333e-02 1009 269 8.33333333333333e-02 1009 83 -8.33333333333333e-02 1009 267 -1.66666666666667e-01 1009 593 8.33333333333333e-02 1010 1010 2.50000000000000e+00 1010 1035 -8.33333333333333e-02 1010 1037 -2.50000000000000e-01 1010 1036 1.66666666666667e-01 1010 1246 -1.66666666666667e-01 1010 1245 8.33333333333333e-02 1010 1051 8.33333333333333e-02 1010 1002 1.66666666666667e-01 1010 1008 -3.33333333333333e-01 1010 1004 -7.50000000000000e-01 1010 1003 1.66666666666667e-01 1010 1050 8.33333333333333e-02 1010 762 -8.33333333333333e-02 1010 999 8.33333333333333e-02 1010 1024 -8.33333333333333e-02 1010 1000 -1.66666666666667e-01 1010 1025 -2.50000000000000e-01 1010 1023 1.66666666666667e-01 1010 1005 -8.33333333333333e-02 1010 1006 1.66666666666667e-01 1010 1009 -3.33333333333333e-01 1010 871 1.66666666666667e-01 1010 1007 -2.50000000000000e-01 1010 872 -7.50000000000000e-01 1010 1240 8.33333333333333e-02 1010 763 -8.33333333333333e-02 1010 870 1.66666666666667e-01 1010 1239 -1.66666666666667e-01 1010 591 -1.66666666666667e-01 1010 595 -8.33333333333333e-02 1010 594 1.66666666666667e-01 1010 596 -2.50000000000000e-01 1010 81 -8.33333333333333e-02 1010 267 8.33333333333333e-02 1010 268 8.33333333333333e-02 1010 82 -8.33333333333333e-02 1010 592 8.33333333333333e-02 1011 1011 2.50000000000000e+00 1011 1043 8.33333333333333e-02 1011 1042 -1.66666666666667e-01 1011 1018 1.66666666666667e-01 1011 1017 -7.50000000000000e-01 1011 956 8.33333333333333e-02 1011 955 8.33333333333333e-02 1011 959 1.66666666666667e-01 1011 958 -8.33333333333333e-02 1011 957 -2.50000000000000e-01 1011 1013 -3.33333333333333e-01 1011 707 -8.33333333333333e-02 1011 710 -8.33333333333333e-02 1011 1055 -8.33333333333333e-02 1011 1052 8.33333333333333e-02 1011 1028 -1.66666666666667e-01 1011 1025 1.66666666666667e-01 1011 1027 8.33333333333333e-02 1011 1024 -8.33333333333333e-02 1011 1023 -2.50000000000000e-01 1011 1054 -8.33333333333333e-02 1011 1051 8.33333333333333e-02 1011 791 -8.33333333333333e-02 1011 1001 8.33333333333333e-02 1011 790 -8.33333333333333e-02 1011 793 8.33333333333333e-02 1011 1000 -1.66666666666667e-01 1011 706 1.66666666666667e-01 1011 705 -2.50000000000000e-01 1011 1004 1.66666666666667e-01 1011 794 -1.66666666666667e-01 1011 1003 1.66666666666667e-01 1011 1012 -3.33333333333333e-01 1011 709 1.66666666666667e-01 1011 1002 -7.50000000000000e-01 1011 1019 1.66666666666667e-01 1011 708 -2.50000000000000e-01 1012 1012 2.50000000000000e+00 1012 1019 -8.33333333333333e-02 1012 1041 -1.66666666666667e-01 1012 1018 -2.50000000000000e-01 1012 1017 1.66666666666667e-01 1012 956 -1.66666666666667e-01 1012 954 8.33333333333333e-02 1012 959 1.66666666666667e-01 1012 958 -2.50000000000000e-01 1012 957 -8.33333333333333e-02 1012 1055 -8.33333333333333e-02 1012 1028 8.33333333333333e-02 1012 707 1.66666666666667e-01 1012 1013 -3.33333333333333e-01 1012 1025 1.66666666666667e-01 1012 1024 -2.50000000000000e-01 1012 1026 8.33333333333333e-02 1012 1023 -8.33333333333333e-02 1012 710 1.66666666666667e-01 1012 1052 -1.66666666666667e-01 1012 1053 -8.33333333333333e-02 1012 1050 8.33333333333333e-02 1012 789 -8.33333333333333e-02 1012 792 8.33333333333333e-02 1012 1001 8.33333333333333e-02 1012 791 -8.33333333333333e-02 1012 706 -7.50000000000000e-01 1012 999 -1.66666666666667e-01 1012 705 1.66666666666667e-01 1012 1004 -8.33333333333333e-02 1012 794 8.33333333333333e-02 1012 1003 -2.50000000000000e-01 1012 1043 8.33333333333333e-02 1012 709 -7.50000000000000e-01 1012 1002 1.66666666666667e-01 1012 1011 -3.33333333333333e-01 1012 708 1.66666666666667e-01 1013 1013 2.50000000000000e+00 1013 1018 -8.33333333333333e-02 1013 1017 1.66666666666667e-01 1013 1041 8.33333333333333e-02 1013 1019 -2.50000000000000e-01 1013 954 8.33333333333333e-02 1013 955 -1.66666666666667e-01 1013 959 -7.50000000000000e-01 1013 958 1.66666666666667e-01 1013 957 1.66666666666667e-01 1013 1011 -3.33333333333333e-01 1013 705 -8.33333333333333e-02 1013 708 -8.33333333333333e-02 1013 1053 -8.33333333333333e-02 1013 1050 8.33333333333333e-02 1013 1054 -8.33333333333333e-02 1013 1027 8.33333333333333e-02 1013 1025 -7.50000000000000e-01 1013 706 1.66666666666667e-01 1013 1012 -3.33333333333333e-01 1013 1024 1.66666666666667e-01 1013 1026 -1.66666666666667e-01 1013 1023 1.66666666666667e-01 1013 709 1.66666666666667e-01 1013 1051 -1.66666666666667e-01 1013 789 -8.33333333333333e-02 1013 999 8.33333333333333e-02 1013 707 -2.50000000000000e-01 1013 1000 8.33333333333333e-02 1013 790 -8.33333333333333e-02 1013 1004 -2.50000000000000e-01 1013 1042 8.33333333333333e-02 1013 710 -2.50000000000000e-01 1013 1003 -8.33333333333333e-02 1013 793 8.33333333333333e-02 1013 1002 1.66666666666667e-01 1013 792 -1.66666666666667e-01 1014 1014 1.25000000000000e+00 1014 1019 -8.33333333333333e-02 1014 964 -4.16666666666667e-02 1014 955 4.16666666666667e-02 1014 965 8.33333333333333e-02 1014 721 8.33333333333333e-02 1014 1117 -1.66666666666667e-01 1014 963 -1.25000000000000e-01 1014 956 -8.33333333333333e-02 1014 1015 -1.66666666666667e-01 1014 1018 1.66666666666667e-01 1014 706 8.33333333333333e-02 1014 1017 -2.50000000000000e-01 1014 1127 -8.33333333333333e-02 1014 1028 8.33333333333333e-02 1014 722 8.33333333333333e-02 1014 878 -8.33333333333333e-02 1014 877 4.16666666666667e-02 1014 1126 -8.33333333333333e-02 1014 720 -3.75000000000000e-01 1014 1016 -1.66666666666667e-01 1014 875 8.33333333333333e-02 1014 707 8.33333333333333e-02 1014 874 -4.16666666666667e-02 1014 1027 8.33333333333333e-02 1014 1118 8.33333333333333e-02 1014 873 -1.25000000000000e-01 1014 705 -3.75000000000000e-01 1015 1015 1.25000000000000e+00 1015 965 8.33333333333333e-02 1015 1019 1.66666666666667e-01 1015 963 -4.16666666666667e-02 1015 954 4.16666666666667e-02 1015 722 -4.16666666666667e-02 1015 1118 8.33333333333333e-02 1015 964 -1.25000000000000e-01 1015 720 8.33333333333333e-02 1015 1116 -1.66666666666667e-01 1015 956 4.16666666666667e-02 1015 707 -4.16666666666667e-02 1015 1018 -7.50000000000000e-01 1015 1014 -1.66666666666667e-01 1015 1017 1.66666666666667e-01 1015 705 8.33333333333333e-02 1015 878 4.16666666666667e-02 1015 1127 -8.33333333333333e-02 1015 721 -1.25000000000000e-01 1015 876 4.16666666666667e-02 1015 1125 -8.33333333333333e-02 1015 875 8.33333333333333e-02 1015 1028 -1.66666666666667e-01 1015 1016 -1.66666666666667e-01 1015 874 -1.25000000000000e-01 1015 706 -1.25000000000000e-01 1015 873 -4.16666666666667e-02 1015 1026 8.33333333333333e-02 1016 1016 1.25000000000000e+00 1016 1017 -8.33333333333333e-02 1016 1015 -1.66666666666667e-01 1016 964 8.33333333333333e-02 1016 1018 1.66666666666667e-01 1016 965 -3.75000000000000e-01 1016 721 -4.16666666666667e-02 1016 1117 8.33333333333333e-02 1016 963 8.33333333333333e-02 1016 1019 -2.50000000000000e-01 1016 955 4.16666666666667e-02 1016 706 -4.16666666666667e-02 1016 954 -8.33333333333333e-02 1016 877 4.16666666666667e-02 1016 1126 -8.33333333333333e-02 1016 1125 -8.33333333333333e-02 1016 1026 8.33333333333333e-02 1016 722 -1.25000000000000e-01 1016 720 8.33333333333333e-02 1016 876 -8.33333333333333e-02 1016 1116 8.33333333333333e-02 1016 875 -3.75000000000000e-01 1016 707 -1.25000000000000e-01 1016 874 8.33333333333333e-02 1016 1027 -1.66666666666667e-01 1016 1014 -1.66666666666667e-01 1016 873 8.33333333333333e-02 1016 705 8.33333333333333e-02 1017 1017 2.50000000000000e+00 1017 1054 8.33333333333333e-02 1017 1159 -8.33333333333333e-02 1017 1028 1.66666666666667e-01 1017 1127 -1.66666666666667e-01 1017 1027 -8.33333333333333e-02 1017 1126 8.33333333333333e-02 1017 1160 -8.33333333333333e-02 1017 1026 -2.50000000000000e-01 1017 965 8.33333333333333e-02 1017 1016 -8.33333333333333e-02 1017 964 8.33333333333333e-02 1017 1118 1.66666666666667e-01 1017 1019 -3.33333333333333e-01 1017 1117 1.66666666666667e-01 1017 1116 -7.50000000000000e-01 1017 1015 1.66666666666667e-01 1017 1014 -2.50000000000000e-01 1017 1018 -3.33333333333333e-01 1017 967 -8.33333333333333e-02 1017 968 1.66666666666667e-01 1017 959 -1.66666666666667e-01 1017 1013 1.66666666666667e-01 1017 955 -8.33333333333333e-02 1017 958 8.33333333333333e-02 1017 728 8.33333333333333e-02 1017 1043 -8.33333333333333e-02 1017 727 -1.66666666666667e-01 1017 1042 1.66666666666667e-01 1017 966 -2.50000000000000e-01 1017 1041 -2.50000000000000e-01 1017 956 -8.33333333333333e-02 1017 707 8.33333333333333e-02 1017 1012 1.66666666666667e-01 1017 706 -1.66666666666667e-01 1017 1055 8.33333333333333e-02 1017 1011 -7.50000000000000e-01 1018 1018 2.50000000000000e+00 1018 1053 8.33333333333333e-02 1018 1158 -8.33333333333333e-02 1018 1160 -8.33333333333333e-02 1018 1127 8.33333333333333e-02 1018 1026 -8.33333333333333e-02 1018 1125 8.33333333333333e-02 1018 1028 1.66666666666667e-01 1018 1027 -2.50000000000000e-01 1018 1016 1.66666666666667e-01 1018 965 -1.66666666666667e-01 1018 963 8.33333333333333e-02 1018 1118 -8.33333333333333e-02 1018 728 8.33333333333333e-02 1018 1117 -2.50000000000000e-01 1018 1116 1.66666666666667e-01 1018 707 8.33333333333333e-02 1018 1015 -7.50000000000000e-01 1018 1014 1.66666666666667e-01 1018 1013 -8.33333333333333e-02 1018 1017 -3.33333333333333e-01 1018 966 -8.33333333333333e-02 1018 959 8.33333333333333e-02 1018 956 -8.33333333333333e-02 1018 954 -8.33333333333333e-02 1018 957 8.33333333333333e-02 1018 968 1.66666666666667e-01 1018 1043 1.66666666666667e-01 1018 1019 -3.33333333333333e-01 1018 967 -2.50000000000000e-01 1018 1042 -7.50000000000000e-01 1018 726 -1.66666666666667e-01 1018 1041 1.66666666666667e-01 1018 1055 -1.66666666666667e-01 1018 1012 -2.50000000000000e-01 1018 1011 1.66666666666667e-01 1018 705 -1.66666666666667e-01 1019 1019 2.50000000000000e+00 1019 1054 -1.66666666666667e-01 1019 1159 -8.33333333333333e-02 1019 1126 8.33333333333333e-02 1019 1026 1.66666666666667e-01 1019 1125 -1.66666666666667e-01 1019 1158 -8.33333333333333e-02 1019 1028 -7.50000000000000e-01 1019 1027 1.66666666666667e-01 1019 963 8.33333333333333e-02 1019 1014 -8.33333333333333e-02 1019 1015 1.66666666666667e-01 1019 964 -1.66666666666667e-01 1019 1118 -2.50000000000000e-01 1019 1117 -8.33333333333333e-02 1019 727 8.33333333333333e-02 1019 1116 1.66666666666667e-01 1019 1017 -3.33333333333333e-01 1019 1016 -2.50000000000000e-01 1019 706 8.33333333333333e-02 1019 1012 -8.33333333333333e-02 1019 958 8.33333333333333e-02 1019 955 -8.33333333333333e-02 1019 966 1.66666666666667e-01 1019 957 -1.66666666666667e-01 1019 1011 1.66666666666667e-01 1019 968 -7.50000000000000e-01 1019 1043 -2.50000000000000e-01 1019 967 1.66666666666667e-01 1019 1042 1.66666666666667e-01 1019 1018 -3.33333333333333e-01 1019 726 8.33333333333333e-02 1019 1041 -8.33333333333333e-02 1019 1053 8.33333333333333e-02 1019 1013 -2.50000000000000e-01 1019 954 -8.33333333333333e-02 1019 705 8.33333333333333e-02 1020 1020 1.25000000000000e+00 1020 1021 -1.66666666666667e-01 1020 1001 -8.33333333333333e-02 1020 706 -4.16666666666667e-02 1020 1000 4.16666666666667e-02 1020 1007 8.33333333333333e-02 1020 760 -4.16666666666667e-02 1020 1005 -3.75000000000000e-01 1020 1240 8.33333333333333e-02 1020 1025 -8.33333333333333e-02 1020 1024 1.66666666666667e-01 1020 1023 -2.50000000000000e-01 1020 1241 8.33333333333333e-02 1020 1028 8.33333333333333e-02 1020 1244 -8.33333333333333e-02 1020 880 4.16666666666667e-02 1020 1243 -8.33333333333333e-02 1020 761 8.33333333333333e-02 1020 881 -8.33333333333333e-02 1020 759 -1.25000000000000e-01 1020 1022 -1.66666666666667e-01 1020 875 8.33333333333333e-02 1020 707 8.33333333333333e-02 1020 874 8.33333333333333e-02 1020 1027 -1.66666666666667e-01 1020 1006 8.33333333333333e-02 1020 873 -3.75000000000000e-01 1020 705 -1.25000000000000e-01 1021 1021 1.25000000000000e+00 1021 1001 4.16666666666667e-02 1021 1005 8.33333333333333e-02 1021 1020 -1.66666666666667e-01 1021 705 -4.16666666666667e-02 1021 999 4.16666666666667e-02 1021 1006 -1.25000000000000e-01 1021 759 -4.16666666666667e-02 1021 1239 8.33333333333333e-02 1021 707 8.33333333333333e-02 1021 1022 -1.66666666666667e-01 1021 1025 1.66666666666667e-01 1021 1024 -7.50000000000000e-01 1021 1023 1.66666666666667e-01 1021 761 8.33333333333333e-02 1021 1241 -1.66666666666667e-01 1021 879 4.16666666666667e-02 1021 1242 -8.33333333333333e-02 1021 881 4.16666666666667e-02 1021 1244 -8.33333333333333e-02 1021 760 -1.25000000000000e-01 1021 875 -4.16666666666667e-02 1021 1028 8.33333333333333e-02 1021 1007 -4.16666666666667e-02 1021 874 -1.25000000000000e-01 1021 706 -1.25000000000000e-01 1021 873 8.33333333333333e-02 1021 1026 -1.66666666666667e-01 1022 1022 1.25000000000000e+00 1022 1000 4.16666666666667e-02 1022 999 -8.33333333333333e-02 1022 1007 -1.25000000000000e-01 1022 1005 8.33333333333333e-02 1022 1025 -2.50000000000000e-01 1022 706 8.33333333333333e-02 1022 1021 -1.66666666666667e-01 1022 1024 1.66666666666667e-01 1022 1023 -8.33333333333333e-02 1022 760 8.33333333333333e-02 1022 1240 -1.66666666666667e-01 1022 1239 8.33333333333333e-02 1022 1026 8.33333333333333e-02 1022 1242 -8.33333333333333e-02 1022 761 -3.75000000000000e-01 1022 880 4.16666666666667e-02 1022 1243 -8.33333333333333e-02 1022 759 8.33333333333333e-02 1022 879 -8.33333333333333e-02 1022 1006 -4.16666666666667e-02 1022 875 -1.25000000000000e-01 1022 707 -3.75000000000000e-01 1022 874 -4.16666666666667e-02 1022 1027 8.33333333333333e-02 1022 1020 -1.66666666666667e-01 1022 873 8.33333333333333e-02 1022 705 8.33333333333333e-02 1023 1023 2.50000000000000e+00 1023 1004 -1.66666666666667e-01 1023 1007 8.33333333333333e-02 1023 1001 -8.33333333333333e-02 1023 1006 -1.66666666666667e-01 1023 1009 1.66666666666667e-01 1023 1000 -8.33333333333333e-02 1023 1010 1.66666666666667e-01 1023 1008 -7.50000000000000e-01 1023 1243 8.33333333333333e-02 1023 1240 -8.33333333333333e-02 1023 1244 -1.66666666666667e-01 1023 1241 1.66666666666667e-01 1023 707 8.33333333333333e-02 1023 1022 -8.33333333333333e-02 1023 1021 1.66666666666667e-01 1023 1024 -3.33333333333333e-01 1023 1020 -2.50000000000000e-01 1023 764 8.33333333333333e-02 1023 1239 -2.50000000000000e-01 1023 1052 -8.33333333333333e-02 1023 1055 8.33333333333333e-02 1023 1253 -8.33333333333333e-02 1023 1027 1.66666666666667e-01 1023 1054 -1.66666666666667e-01 1023 1051 1.66666666666667e-01 1023 1028 1.66666666666667e-01 1023 1013 1.66666666666667e-01 1023 1025 -3.33333333333333e-01 1023 706 8.33333333333333e-02 1023 1012 -8.33333333333333e-02 1023 1026 -7.50000000000000e-01 1023 1011 -2.50000000000000e-01 1023 1252 -8.33333333333333e-02 1023 763 8.33333333333333e-02 1023 1003 8.33333333333333e-02 1023 1050 -2.50000000000000e-01 1024 1024 2.50000000000000e+00 1024 1004 8.33333333333333e-02 1024 1001 -8.33333333333333e-02 1024 1007 8.33333333333333e-02 1024 1010 -8.33333333333333e-02 1024 1005 -1.66666666666667e-01 1024 1008 1.66666666666667e-01 1024 999 -8.33333333333333e-02 1024 1009 -2.50000000000000e-01 1024 1242 8.33333333333333e-02 1024 1239 -8.33333333333333e-02 1024 1244 8.33333333333333e-02 1024 1022 1.66666666666667e-01 1024 1021 -7.50000000000000e-01 1024 1020 1.66666666666667e-01 1024 1023 -3.33333333333333e-01 1024 1241 1.66666666666667e-01 1024 1240 -2.50000000000000e-01 1024 1025 -3.33333333333333e-01 1024 1028 -8.33333333333333e-02 1024 1026 1.66666666666667e-01 1024 1055 8.33333333333333e-02 1024 1253 -8.33333333333333e-02 1024 1053 -1.66666666666667e-01 1024 1050 1.66666666666667e-01 1024 707 -1.66666666666667e-01 1024 1013 1.66666666666667e-01 1024 1027 -2.50000000000000e-01 1024 1012 -2.50000000000000e-01 1024 705 8.33333333333333e-02 1024 1011 -8.33333333333333e-02 1024 1052 1.66666666666667e-01 1024 764 -1.66666666666667e-01 1024 1002 8.33333333333333e-02 1024 1051 -7.50000000000000e-01 1024 1251 -8.33333333333333e-02 1024 762 8.33333333333333e-02 1025 1025 2.50000000000000e+00 1025 1002 -1.66666666666667e-01 1025 1000 -8.33333333333333e-02 1025 1005 8.33333333333333e-02 1025 999 -8.33333333333333e-02 1025 1006 8.33333333333333e-02 1025 1009 -8.33333333333333e-02 1025 1010 -2.50000000000000e-01 1025 1008 1.66666666666667e-01 1025 1243 8.33333333333333e-02 1025 1242 -1.66666666666667e-01 1025 1239 1.66666666666667e-01 1025 1022 -2.50000000000000e-01 1025 1021 1.66666666666667e-01 1025 705 8.33333333333333e-02 1025 1020 -8.33333333333333e-02 1025 1241 -7.50000000000000e-01 1025 1240 1.66666666666667e-01 1025 762 8.33333333333333e-02 1025 1024 -3.33333333333333e-01 1025 1050 -8.33333333333333e-02 1025 1027 -8.33333333333333e-02 1025 1053 8.33333333333333e-02 1025 1251 -8.33333333333333e-02 1025 1054 8.33333333333333e-02 1025 1252 -8.33333333333333e-02 1025 1028 -2.50000000000000e-01 1025 1013 -7.50000000000000e-01 1025 706 -1.66666666666667e-01 1025 1012 1.66666666666667e-01 1025 1026 1.66666666666667e-01 1025 1011 1.66666666666667e-01 1025 1023 -3.33333333333333e-01 1025 1003 8.33333333333333e-02 1025 1052 -2.50000000000000e-01 1025 1051 1.66666666666667e-01 1025 763 -1.66666666666667e-01 1026 1026 2.50000000000000e+00 1026 1018 -8.33333333333333e-02 1026 1160 8.33333333333333e-02 1026 1159 -1.66666666666667e-01 1026 1017 -2.50000000000000e-01 1026 1016 8.33333333333333e-02 1026 1126 1.66666666666667e-01 1026 1127 1.66666666666667e-01 1026 1125 -7.50000000000000e-01 1026 1015 8.33333333333333e-02 1026 1028 -3.33333333333333e-01 1026 707 -8.33333333333333e-02 1026 770 -8.33333333333333e-02 1026 1055 -8.33333333333333e-02 1026 1253 8.33333333333333e-02 1026 1054 1.66666666666667e-01 1026 1027 -3.33333333333333e-01 1026 1024 1.66666666666667e-01 1026 1013 -1.66666666666667e-01 1026 1025 1.66666666666667e-01 1026 706 -8.33333333333333e-02 1026 1012 8.33333333333333e-02 1026 1023 -7.50000000000000e-01 1026 769 -8.33333333333333e-02 1026 1252 8.33333333333333e-02 1026 1053 -2.50000000000000e-01 1026 875 -8.33333333333333e-02 1026 1022 8.33333333333333e-02 1026 886 8.33333333333333e-02 1026 1243 -8.33333333333333e-02 1026 1021 -1.66666666666667e-01 1026 874 1.66666666666667e-01 1026 873 -2.50000000000000e-01 1026 1244 1.66666666666667e-01 1026 887 -1.66666666666667e-01 1026 1242 -2.50000000000000e-01 1026 1019 1.66666666666667e-01 1027 1027 2.50000000000000e+00 1027 1017 -8.33333333333333e-02 1027 1158 -1.66666666666667e-01 1027 1019 1.66666666666667e-01 1027 1018 -2.50000000000000e-01 1027 1127 -8.33333333333333e-02 1027 1125 1.66666666666667e-01 1027 1126 -2.50000000000000e-01 1027 1016 -1.66666666666667e-01 1027 1014 8.33333333333333e-02 1027 1013 8.33333333333333e-02 1027 1025 -8.33333333333333e-02 1027 1053 1.66666666666667e-01 1027 1026 -3.33333333333333e-01 1027 1023 1.66666666666667e-01 1027 1024 -2.50000000000000e-01 1027 705 -8.33333333333333e-02 1027 1011 8.33333333333333e-02 1027 1055 1.66666666666667e-01 1027 1253 -1.66666666666667e-01 1027 1054 -7.50000000000000e-01 1027 768 -8.33333333333333e-02 1027 1251 8.33333333333333e-02 1027 875 1.66666666666667e-01 1027 1028 -3.33333333333333e-01 1027 1244 1.66666666666667e-01 1027 885 8.33333333333333e-02 1027 1242 -8.33333333333333e-02 1027 1022 8.33333333333333e-02 1027 707 -8.33333333333333e-02 1027 874 -7.50000000000000e-01 1027 1020 -1.66666666666667e-01 1027 873 1.66666666666667e-01 1027 887 8.33333333333333e-02 1027 770 -8.33333333333333e-02 1027 1243 -2.50000000000000e-01 1027 1160 8.33333333333333e-02 1028 1028 2.50000000000000e+00 1028 1017 1.66666666666667e-01 1028 1158 8.33333333333333e-02 1028 1019 -7.50000000000000e-01 1028 1018 1.66666666666667e-01 1028 1126 -8.33333333333333e-02 1028 1014 8.33333333333333e-02 1028 1127 -2.50000000000000e-01 1028 1125 1.66666666666667e-01 1028 1015 -1.66666666666667e-01 1028 1026 -3.33333333333333e-01 1028 705 -8.33333333333333e-02 1028 768 -8.33333333333333e-02 1028 1012 8.33333333333333e-02 1028 1024 -8.33333333333333e-02 1028 1053 -8.33333333333333e-02 1028 1251 8.33333333333333e-02 1028 1025 -2.50000000000000e-01 1028 1011 -1.66666666666667e-01 1028 1023 1.66666666666667e-01 1028 1055 -2.50000000000000e-01 1028 1054 1.66666666666667e-01 1028 1252 -1.66666666666667e-01 1028 873 -8.33333333333333e-02 1028 1020 8.33333333333333e-02 1028 874 1.66666666666667e-01 1028 1027 -3.33333333333333e-01 1028 1243 1.66666666666667e-01 1028 875 -2.50000000000000e-01 1028 1021 8.33333333333333e-02 1028 706 -8.33333333333333e-02 1028 1244 -7.50000000000000e-01 1028 1159 8.33333333333333e-02 1028 886 8.33333333333333e-02 1028 769 -8.33333333333333e-02 1028 1242 1.66666666666667e-01 1028 885 -1.66666666666667e-01 1029 1029 2.50000000000000e+00 1029 1034 -8.33333333333333e-02 1029 1045 -1.66666666666667e-01 1029 1033 1.66666666666667e-01 1029 1032 -2.50000000000000e-01 1029 974 1.66666666666667e-01 1029 973 -8.33333333333333e-02 1029 972 -2.50000000000000e-01 1029 1058 -8.33333333333333e-02 1029 1040 8.33333333333333e-02 1029 1031 -3.33333333333333e-01 1029 1037 1.66666666666667e-01 1029 1039 8.33333333333333e-02 1029 1036 -8.33333333333333e-02 1029 1035 -2.50000000000000e-01 1029 710 1.66666666666667e-01 1029 1052 -1.66666666666667e-01 1029 1057 -8.33333333333333e-02 1029 1051 8.33333333333333e-02 1029 793 8.33333333333333e-02 1029 1004 -8.33333333333333e-02 1029 794 8.33333333333333e-02 1029 1030 -3.33333333333333e-01 1029 1003 1.66666666666667e-01 1029 709 1.66666666666667e-01 1029 1046 8.33333333333333e-02 1029 1002 -2.50000000000000e-01 1029 708 -7.50000000000000e-01 1029 587 -1.66666666666667e-01 1029 586 8.33333333333333e-02 1029 86 1.66666666666667e-01 1029 190 -8.33333333333333e-02 1029 593 8.33333333333333e-02 1029 191 -8.33333333333333e-02 1029 85 1.66666666666667e-01 1029 592 -1.66666666666667e-01 1029 84 -7.50000000000000e-01 1030 1030 2.50000000000000e+00 1030 1046 8.33333333333333e-02 1030 1044 -1.66666666666667e-01 1030 1033 -7.50000000000000e-01 1030 1032 1.66666666666667e-01 1030 974 1.66666666666667e-01 1030 973 -2.50000000000000e-01 1030 972 -8.33333333333333e-02 1030 1031 -3.33333333333333e-01 1030 710 -8.33333333333333e-02 1030 1052 8.33333333333333e-02 1030 1058 -8.33333333333333e-02 1030 1040 -1.66666666666667e-01 1030 1037 1.66666666666667e-01 1030 1036 -2.50000000000000e-01 1030 1038 8.33333333333333e-02 1030 1035 -8.33333333333333e-02 1030 1056 -8.33333333333333e-02 1030 1050 8.33333333333333e-02 1030 792 8.33333333333333e-02 1030 1004 1.66666666666667e-01 1030 794 -1.66666666666667e-01 1030 1034 1.66666666666667e-01 1030 1003 -7.50000000000000e-01 1030 709 -2.50000000000000e-01 1030 1029 -3.33333333333333e-01 1030 1002 1.66666666666667e-01 1030 708 1.66666666666667e-01 1030 587 8.33333333333333e-02 1030 585 8.33333333333333e-02 1030 86 -8.33333333333333e-02 1030 593 8.33333333333333e-02 1030 191 -8.33333333333333e-02 1030 189 -8.33333333333333e-02 1030 85 -2.50000000000000e-01 1030 84 1.66666666666667e-01 1030 591 -1.66666666666667e-01 1031 1031 2.50000000000000e+00 1031 1032 -8.33333333333333e-02 1031 1033 1.66666666666667e-01 1031 1045 8.33333333333333e-02 1031 1034 -2.50000000000000e-01 1031 974 -7.50000000000000e-01 1031 973 1.66666666666667e-01 1031 972 1.66666666666667e-01 1031 1030 -3.33333333333333e-01 1031 709 -8.33333333333333e-02 1031 1051 8.33333333333333e-02 1031 1057 -8.33333333333333e-02 1031 1056 -8.33333333333333e-02 1031 1038 8.33333333333333e-02 1031 1037 -7.50000000000000e-01 1031 1039 -1.66666666666667e-01 1031 1036 1.66666666666667e-01 1031 1029 -3.33333333333333e-01 1031 1035 1.66666666666667e-01 1031 708 1.66666666666667e-01 1031 1050 -1.66666666666667e-01 1031 1044 8.33333333333333e-02 1031 1004 -2.50000000000000e-01 1031 710 -2.50000000000000e-01 1031 1003 1.66666666666667e-01 1031 793 -1.66666666666667e-01 1031 1002 -8.33333333333333e-02 1031 792 8.33333333333333e-02 1031 586 8.33333333333333e-02 1031 585 -1.66666666666667e-01 1031 85 -8.33333333333333e-02 1031 84 1.66666666666667e-01 1031 592 8.33333333333333e-02 1031 190 -8.33333333333333e-02 1031 86 -2.50000000000000e-01 1031 591 8.33333333333333e-02 1031 189 -8.33333333333333e-02 1032 1032 2.50000000000000e+00 1032 1057 8.33333333333333e-02 1032 1219 -8.33333333333333e-02 1032 1214 8.33333333333333e-02 1032 1220 -8.33333333333333e-02 1032 1213 8.33333333333333e-02 1032 1039 -8.33333333333333e-02 1032 1040 1.66666666666667e-01 1032 1038 -2.50000000000000e-01 1032 746 8.33333333333333e-02 1032 1211 -8.33333333333333e-02 1032 1210 1.66666666666667e-01 1032 1209 -2.50000000000000e-01 1032 1031 -8.33333333333333e-02 1032 1033 -3.33333333333333e-01 1032 979 -8.33333333333333e-02 1032 974 8.33333333333333e-02 1032 973 8.33333333333333e-02 1032 980 1.66666666666667e-01 1032 1046 1.66666666666667e-01 1032 1034 -3.33333333333333e-01 1032 745 -1.66666666666667e-01 1032 1045 1.66666666666667e-01 1032 978 -2.50000000000000e-01 1032 1044 -7.50000000000000e-01 1032 1030 1.66666666666667e-01 1032 1058 -1.66666666666667e-01 1032 1029 -2.50000000000000e-01 1032 590 -1.66666666666667e-01 1032 599 1.66666666666667e-01 1032 589 8.33333333333333e-02 1032 86 8.33333333333333e-02 1032 598 1.66666666666667e-01 1032 597 -7.50000000000000e-01 1032 587 -8.33333333333333e-02 1032 586 -8.33333333333333e-02 1032 85 -1.66666666666667e-01 1033 1033 2.50000000000000e+00 1033 1056 8.33333333333333e-02 1033 1218 -8.33333333333333e-02 1033 1214 -1.66666666666667e-01 1033 1040 1.66666666666667e-01 1033 1212 8.33333333333333e-02 1033 1038 -8.33333333333333e-02 1033 1220 -8.33333333333333e-02 1033 1039 -2.50000000000000e-01 1033 1211 1.66666666666667e-01 1033 1034 -3.33333333333333e-01 1033 1210 -7.50000000000000e-01 1033 1209 1.66666666666667e-01 1033 1032 -3.33333333333333e-01 1033 978 -8.33333333333333e-02 1033 980 1.66666666666667e-01 1033 974 -1.66666666666667e-01 1033 1031 1.66666666666667e-01 1033 972 8.33333333333333e-02 1033 746 8.33333333333333e-02 1033 1046 -8.33333333333333e-02 1033 979 -2.50000000000000e-01 1033 1045 -2.50000000000000e-01 1033 744 -1.66666666666667e-01 1033 1044 1.66666666666667e-01 1033 1058 8.33333333333333e-02 1033 1030 -7.50000000000000e-01 1033 1029 1.66666666666667e-01 1033 590 8.33333333333333e-02 1033 599 -8.33333333333333e-02 1033 588 8.33333333333333e-02 1033 598 -2.50000000000000e-01 1033 597 1.66666666666667e-01 1033 585 -8.33333333333333e-02 1033 587 -8.33333333333333e-02 1033 86 8.33333333333333e-02 1033 84 -1.66666666666667e-01 1034 1034 2.50000000000000e+00 1034 1056 -1.66666666666667e-01 1034 1212 8.33333333333333e-02 1034 1218 -8.33333333333333e-02 1034 1213 -1.66666666666667e-01 1034 1039 1.66666666666667e-01 1034 1219 -8.33333333333333e-02 1034 1040 -7.50000000000000e-01 1034 1038 1.66666666666667e-01 1034 1211 -2.50000000000000e-01 1034 1210 1.66666666666667e-01 1034 1033 -3.33333333333333e-01 1034 744 8.33333333333333e-02 1034 1209 -8.33333333333333e-02 1034 1029 -8.33333333333333e-02 1034 979 1.66666666666667e-01 1034 972 8.33333333333333e-02 1034 973 -1.66666666666667e-01 1034 1030 1.66666666666667e-01 1034 980 -7.50000000000000e-01 1034 1046 -2.50000000000000e-01 1034 745 8.33333333333333e-02 1034 1045 -8.33333333333333e-02 1034 978 1.66666666666667e-01 1034 1044 1.66666666666667e-01 1034 1032 -3.33333333333333e-01 1034 1057 8.33333333333333e-02 1034 1031 -2.50000000000000e-01 1034 589 8.33333333333333e-02 1034 598 -8.33333333333333e-02 1034 588 -1.66666666666667e-01 1034 597 1.66666666666667e-01 1034 599 -2.50000000000000e-01 1034 84 8.33333333333333e-02 1034 585 -8.33333333333333e-02 1034 586 -8.33333333333333e-02 1034 85 8.33333333333333e-02 1035 1035 2.50000000000000e+00 1035 1004 8.33333333333333e-02 1035 1010 -8.33333333333333e-02 1035 1009 1.66666666666667e-01 1035 1008 -2.50000000000000e-01 1035 1249 8.33333333333333e-02 1035 1246 -8.33333333333333e-02 1035 1250 8.33333333333333e-02 1035 1036 -3.33333333333333e-01 1035 1247 1.66666666666667e-01 1035 1245 -2.50000000000000e-01 1035 1037 -3.33333333333333e-01 1035 1040 -8.33333333333333e-02 1035 1039 1.66666666666667e-01 1035 1256 -8.33333333333333e-02 1035 1058 8.33333333333333e-02 1035 1057 -1.66666666666667e-01 1035 1051 1.66666666666667e-01 1035 1031 1.66666666666667e-01 1035 1030 -8.33333333333333e-02 1035 1038 -2.50000000000000e-01 1035 1029 -2.50000000000000e-01 1035 1052 1.66666666666667e-01 1035 764 -1.66666666666667e-01 1035 1255 -8.33333333333333e-02 1035 763 8.33333333333333e-02 1035 1003 8.33333333333333e-02 1035 1050 -7.50000000000000e-01 1035 593 -8.33333333333333e-02 1035 596 8.33333333333333e-02 1035 595 -1.66666666666667e-01 1035 592 -8.33333333333333e-02 1035 602 1.66666666666667e-01 1035 601 1.66666666666667e-01 1035 600 -7.50000000000000e-01 1035 86 -1.66666666666667e-01 1035 85 8.33333333333333e-02 1036 1036 2.50000000000000e+00 1036 1004 -1.66666666666667e-01 1036 1008 1.66666666666667e-01 1036 1010 1.66666666666667e-01 1036 1009 -7.50000000000000e-01 1036 1248 8.33333333333333e-02 1036 1245 -8.33333333333333e-02 1036 1247 1.66666666666667e-01 1036 1250 -1.66666666666667e-01 1036 1035 -3.33333333333333e-01 1036 764 8.33333333333333e-02 1036 1246 -2.50000000000000e-01 1036 1052 -8.33333333333333e-02 1036 1058 8.33333333333333e-02 1036 1256 -8.33333333333333e-02 1036 1038 1.66666666666667e-01 1036 1056 -1.66666666666667e-01 1036 1050 1.66666666666667e-01 1036 1040 1.66666666666667e-01 1036 1031 1.66666666666667e-01 1036 1037 -3.33333333333333e-01 1036 1039 -7.50000000000000e-01 1036 1030 -2.50000000000000e-01 1036 1029 -8.33333333333333e-02 1036 1002 8.33333333333333e-02 1036 1051 -2.50000000000000e-01 1036 1254 -8.33333333333333e-02 1036 762 8.33333333333333e-02 1036 593 -8.33333333333333e-02 1036 596 8.33333333333333e-02 1036 594 -1.66666666666667e-01 1036 591 -8.33333333333333e-02 1036 602 -8.33333333333333e-02 1036 86 8.33333333333333e-02 1036 601 -2.50000000000000e-01 1036 600 1.66666666666667e-01 1036 84 8.33333333333333e-02 1037 1037 2.50000000000000e+00 1037 1002 8.33333333333333e-02 1037 1008 -8.33333333333333e-02 1037 1010 -2.50000000000000e-01 1037 1009 1.66666666666667e-01 1037 1246 1.66666666666667e-01 1037 1249 -1.66666666666667e-01 1037 1248 8.33333333333333e-02 1037 1247 -7.50000000000000e-01 1037 763 8.33333333333333e-02 1037 1245 1.66666666666667e-01 1037 1051 -8.33333333333333e-02 1037 1035 -3.33333333333333e-01 1037 1038 -8.33333333333333e-02 1037 1057 8.33333333333333e-02 1037 1255 -8.33333333333333e-02 1037 1254 -8.33333333333333e-02 1037 1056 8.33333333333333e-02 1037 1040 -2.50000000000000e-01 1037 1031 -7.50000000000000e-01 1037 1039 1.66666666666667e-01 1037 1030 1.66666666666667e-01 1037 1036 -3.33333333333333e-01 1037 1029 1.66666666666667e-01 1037 1003 -1.66666666666667e-01 1037 1052 -2.50000000000000e-01 1037 1050 1.66666666666667e-01 1037 762 -1.66666666666667e-01 1037 591 -8.33333333333333e-02 1037 592 -8.33333333333333e-02 1037 595 8.33333333333333e-02 1037 594 8.33333333333333e-02 1037 602 -2.50000000000000e-01 1037 601 -8.33333333333333e-02 1037 85 8.33333333333333e-02 1037 600 1.66666666666667e-01 1037 84 -1.66666666666667e-01 1038 1038 2.50000000000000e+00 1038 1033 -8.33333333333333e-02 1038 1219 -1.66666666666667e-01 1038 1034 1.66666666666667e-01 1038 1032 -2.50000000000000e-01 1038 1214 -8.33333333333333e-02 1038 1213 1.66666666666667e-01 1038 1212 -2.50000000000000e-01 1038 1031 8.33333333333333e-02 1038 1037 -8.33333333333333e-02 1038 1039 -3.33333333333333e-01 1038 1057 1.66666666666667e-01 1038 1036 1.66666666666667e-01 1038 1058 1.66666666666667e-01 1038 1256 -1.66666666666667e-01 1038 778 -8.33333333333333e-02 1038 1255 8.33333333333333e-02 1038 1056 -7.50000000000000e-01 1038 1030 8.33333333333333e-02 1038 1035 -2.50000000000000e-01 1038 1040 -3.33333333333333e-01 1038 1250 1.66666666666667e-01 1038 904 8.33333333333333e-02 1038 1249 -8.33333333333333e-02 1038 905 8.33333333333333e-02 1038 779 -8.33333333333333e-02 1038 1248 -2.50000000000000e-01 1038 1220 8.33333333333333e-02 1038 599 -1.66666666666667e-01 1038 598 8.33333333333333e-02 1038 85 -8.33333333333333e-02 1038 317 1.66666666666667e-01 1038 602 8.33333333333333e-02 1038 86 -8.33333333333333e-02 1038 316 1.66666666666667e-01 1038 601 -1.66666666666667e-01 1038 315 -7.50000000000000e-01 1039 1039 2.50000000000000e+00 1039 1032 -8.33333333333333e-02 1039 1220 8.33333333333333e-02 1039 1218 -1.66666666666667e-01 1039 1033 -2.50000000000000e-01 1039 1212 1.66666666666667e-01 1039 1214 1.66666666666667e-01 1039 1213 -7.50000000000000e-01 1039 1040 -3.33333333333333e-01 1039 779 -8.33333333333333e-02 1039 1058 -8.33333333333333e-02 1039 1256 8.33333333333333e-02 1039 1038 -3.33333333333333e-01 1039 1056 1.66666666666667e-01 1039 1035 1.66666666666667e-01 1039 1057 -2.50000000000000e-01 1039 777 -8.33333333333333e-02 1039 1254 8.33333333333333e-02 1039 1031 -1.66666666666667e-01 1039 1037 1.66666666666667e-01 1039 1036 -7.50000000000000e-01 1039 1029 8.33333333333333e-02 1039 903 8.33333333333333e-02 1039 1248 -8.33333333333333e-02 1039 905 -1.66666666666667e-01 1039 1250 1.66666666666667e-01 1039 1249 -2.50000000000000e-01 1039 1034 1.66666666666667e-01 1039 599 8.33333333333333e-02 1039 597 8.33333333333333e-02 1039 86 -8.33333333333333e-02 1039 84 -8.33333333333333e-02 1039 317 -8.33333333333333e-02 1039 602 8.33333333333333e-02 1039 316 -2.50000000000000e-01 1039 315 1.66666666666667e-01 1039 600 -1.66666666666667e-01 1040 1040 2.50000000000000e+00 1040 1033 1.66666666666667e-01 1040 1219 8.33333333333333e-02 1040 1034 -7.50000000000000e-01 1040 1032 1.66666666666667e-01 1040 1212 -8.33333333333333e-02 1040 1214 -2.50000000000000e-01 1040 1213 1.66666666666667e-01 1040 1039 -3.33333333333333e-01 1040 778 -8.33333333333333e-02 1040 1029 8.33333333333333e-02 1040 1035 -8.33333333333333e-02 1040 1057 -8.33333333333333e-02 1040 1255 8.33333333333333e-02 1040 1058 -2.50000000000000e-01 1040 1056 1.66666666666667e-01 1040 1254 -1.66666666666667e-01 1040 1037 -2.50000000000000e-01 1040 1030 -1.66666666666667e-01 1040 1036 1.66666666666667e-01 1040 1038 -3.33333333333333e-01 1040 1248 1.66666666666667e-01 1040 1250 -7.50000000000000e-01 1040 1218 8.33333333333333e-02 1040 904 -1.66666666666667e-01 1040 1249 1.66666666666667e-01 1040 903 8.33333333333333e-02 1040 777 -8.33333333333333e-02 1040 598 8.33333333333333e-02 1040 597 -1.66666666666667e-01 1040 85 -8.33333333333333e-02 1040 316 -8.33333333333333e-02 1040 601 8.33333333333333e-02 1040 315 1.66666666666667e-01 1040 317 -2.50000000000000e-01 1040 600 8.33333333333333e-02 1040 84 -8.33333333333333e-02 1041 1041 2.50000000000000e+00 1041 988 -8.33333333333333e-02 1041 983 -1.66666666666667e-01 1041 989 1.66666666666667e-01 1041 987 -2.50000000000000e-01 1041 1154 8.33333333333333e-02 1041 1153 -1.66666666666667e-01 1041 1049 -8.33333333333333e-02 1041 1048 1.66666666666667e-01 1041 1047 -2.50000000000000e-01 1041 958 -8.33333333333333e-02 1041 967 8.33333333333333e-02 1041 968 8.33333333333333e-02 1041 1019 -8.33333333333333e-02 1041 727 1.66666666666667e-01 1041 1042 -3.33333333333333e-01 1041 1018 1.66666666666667e-01 1041 1017 -2.50000000000000e-01 1041 959 -8.33333333333333e-02 1041 1013 8.33333333333333e-02 1041 709 1.66666666666667e-01 1041 1012 -1.66666666666667e-01 1041 911 -8.33333333333333e-02 1041 908 8.33333333333333e-02 1041 728 1.66666666666667e-01 1041 1160 -1.66666666666667e-01 1041 1159 8.33333333333333e-02 1041 910 -8.33333333333333e-02 1041 726 -7.50000000000000e-01 1041 1043 -3.33333333333333e-01 1041 1055 1.66666666666667e-01 1041 710 1.66666666666667e-01 1041 1054 -8.33333333333333e-02 1041 907 8.33333333333333e-02 1041 982 8.33333333333333e-02 1041 1053 -2.50000000000000e-01 1041 708 -7.50000000000000e-01 1042 1042 2.50000000000000e+00 1042 987 -8.33333333333333e-02 1042 989 1.66666666666667e-01 1042 983 8.33333333333333e-02 1042 988 -2.50000000000000e-01 1042 1154 8.33333333333333e-02 1042 1152 -1.66666666666667e-01 1042 1049 1.66666666666667e-01 1042 1048 -7.50000000000000e-01 1042 1047 1.66666666666667e-01 1042 1043 -3.33333333333333e-01 1042 710 -8.33333333333333e-02 1042 728 -8.33333333333333e-02 1042 1013 8.33333333333333e-02 1042 959 -8.33333333333333e-02 1042 957 -8.33333333333333e-02 1042 966 8.33333333333333e-02 1042 968 -1.66666666666667e-01 1042 1019 1.66666666666667e-01 1042 1018 -7.50000000000000e-01 1042 726 1.66666666666667e-01 1042 1041 -3.33333333333333e-01 1042 1017 1.66666666666667e-01 1042 708 1.66666666666667e-01 1042 1011 -1.66666666666667e-01 1042 1160 8.33333333333333e-02 1042 911 -8.33333333333333e-02 1042 727 -2.50000000000000e-01 1042 1158 8.33333333333333e-02 1042 909 -8.33333333333333e-02 1042 1055 1.66666666666667e-01 1042 908 -1.66666666666667e-01 1042 981 8.33333333333333e-02 1042 1054 -2.50000000000000e-01 1042 709 -2.50000000000000e-01 1042 1053 -8.33333333333333e-02 1042 906 8.33333333333333e-02 1043 1043 2.50000000000000e+00 1043 982 8.33333333333333e-02 1043 981 -1.66666666666667e-01 1043 989 -7.50000000000000e-01 1043 987 1.66666666666667e-01 1043 1153 8.33333333333333e-02 1043 1152 8.33333333333333e-02 1043 1049 -2.50000000000000e-01 1043 1048 1.66666666666667e-01 1043 1047 -8.33333333333333e-02 1043 1042 -3.33333333333333e-01 1043 709 -8.33333333333333e-02 1043 727 -8.33333333333333e-02 1043 1012 8.33333333333333e-02 1043 958 -8.33333333333333e-02 1043 1019 -2.50000000000000e-01 1043 967 -1.66666666666667e-01 1043 1018 1.66666666666667e-01 1043 966 8.33333333333333e-02 1043 1017 -8.33333333333333e-02 1043 957 -8.33333333333333e-02 1043 1011 8.33333333333333e-02 1043 1159 8.33333333333333e-02 1043 910 -8.33333333333333e-02 1043 909 -8.33333333333333e-02 1043 906 8.33333333333333e-02 1043 728 -2.50000000000000e-01 1043 726 1.66666666666667e-01 1043 1158 -1.66666666666667e-01 1043 988 1.66666666666667e-01 1043 1055 -7.50000000000000e-01 1043 710 -2.50000000000000e-01 1043 1054 1.66666666666667e-01 1043 907 -1.66666666666667e-01 1043 1041 -3.33333333333333e-01 1043 1053 1.66666666666667e-01 1043 708 1.66666666666667e-01 1044 1044 2.50000000000000e+00 1044 994 -8.33333333333333e-02 1044 995 1.66666666666667e-01 1044 983 8.33333333333333e-02 1044 993 -2.50000000000000e-01 1044 1217 8.33333333333333e-02 1044 1216 -1.66666666666667e-01 1044 1049 1.66666666666667e-01 1044 1048 1.66666666666667e-01 1044 1047 -7.50000000000000e-01 1044 1046 -3.33333333333333e-01 1044 746 -8.33333333333333e-02 1044 710 -8.33333333333333e-02 1044 974 -8.33333333333333e-02 1044 1031 8.33333333333333e-02 1044 973 -8.33333333333333e-02 1044 979 8.33333333333333e-02 1044 980 -1.66666666666667e-01 1044 1034 1.66666666666667e-01 1044 745 1.66666666666667e-01 1044 1045 -3.33333333333333e-01 1044 1033 1.66666666666667e-01 1044 1032 -7.50000000000000e-01 1044 709 1.66666666666667e-01 1044 1030 -1.66666666666667e-01 1044 914 -8.33333333333333e-02 1044 1220 8.33333333333333e-02 1044 1219 8.33333333333333e-02 1044 913 -8.33333333333333e-02 1044 744 -2.50000000000000e-01 1044 1058 1.66666666666667e-01 1044 908 -1.66666666666667e-01 1044 1057 -8.33333333333333e-02 1044 907 8.33333333333333e-02 1044 1056 -2.50000000000000e-01 1044 982 8.33333333333333e-02 1044 708 -2.50000000000000e-01 1045 1045 2.50000000000000e+00 1045 993 -8.33333333333333e-02 1045 983 -1.66666666666667e-01 1045 995 1.66666666666667e-01 1045 994 -2.50000000000000e-01 1045 1217 8.33333333333333e-02 1045 1215 -1.66666666666667e-01 1045 1049 -8.33333333333333e-02 1045 1048 -2.50000000000000e-01 1045 1047 1.66666666666667e-01 1045 972 -8.33333333333333e-02 1045 978 8.33333333333333e-02 1045 980 8.33333333333333e-02 1045 1034 -8.33333333333333e-02 1045 1033 -2.50000000000000e-01 1045 744 1.66666666666667e-01 1045 1044 -3.33333333333333e-01 1045 1032 1.66666666666667e-01 1045 974 -8.33333333333333e-02 1045 1031 8.33333333333333e-02 1045 708 1.66666666666667e-01 1045 1029 -1.66666666666667e-01 1045 914 -8.33333333333333e-02 1045 908 8.33333333333333e-02 1045 1220 -1.66666666666667e-01 1045 746 1.66666666666667e-01 1045 745 -7.50000000000000e-01 1045 1218 8.33333333333333e-02 1045 912 -8.33333333333333e-02 1045 1058 1.66666666666667e-01 1045 1046 -3.33333333333333e-01 1045 710 1.66666666666667e-01 1045 1057 -2.50000000000000e-01 1045 981 8.33333333333333e-02 1045 709 -7.50000000000000e-01 1045 1056 -8.33333333333333e-02 1045 906 8.33333333333333e-02 1046 1046 2.50000000000000e+00 1046 982 -1.66666666666667e-01 1046 981 8.33333333333333e-02 1046 995 -7.50000000000000e-01 1046 994 1.66666666666667e-01 1046 1215 8.33333333333333e-02 1046 1216 8.33333333333333e-02 1046 1049 -2.50000000000000e-01 1046 1048 -8.33333333333333e-02 1046 1047 1.66666666666667e-01 1046 1044 -3.33333333333333e-01 1046 744 -8.33333333333333e-02 1046 708 -8.33333333333333e-02 1046 972 -8.33333333333333e-02 1046 1029 8.33333333333333e-02 1046 1034 -2.50000000000000e-01 1046 979 8.33333333333333e-02 1046 1033 -8.33333333333333e-02 1046 978 -1.66666666666667e-01 1046 1032 1.66666666666667e-01 1046 973 -8.33333333333333e-02 1046 1030 8.33333333333333e-02 1046 912 -8.33333333333333e-02 1046 1218 8.33333333333333e-02 1046 913 -8.33333333333333e-02 1046 907 8.33333333333333e-02 1046 746 -2.50000000000000e-01 1046 1219 -1.66666666666667e-01 1046 745 1.66666666666667e-01 1046 1058 -7.50000000000000e-01 1046 993 1.66666666666667e-01 1046 710 -2.50000000000000e-01 1046 1057 1.66666666666667e-01 1046 1045 -3.33333333333333e-01 1046 709 1.66666666666667e-01 1046 1056 1.66666666666667e-01 1046 906 -1.66666666666667e-01 1047 1047 2.50000000000000e+00 1047 995 -1.66666666666667e-01 1047 1217 -8.33333333333333e-02 1047 913 8.33333333333333e-02 1047 914 8.33333333333333e-02 1047 1216 1.66666666666667e-01 1047 1215 -2.50000000000000e-01 1047 1046 1.66666666666667e-01 1047 1045 1.66666666666667e-01 1047 1044 -7.50000000000000e-01 1047 982 -8.33333333333333e-02 1047 983 -8.33333333333333e-02 1047 997 -8.33333333333333e-02 1047 988 8.33333333333333e-02 1047 989 8.33333333333333e-02 1047 998 1.66666666666667e-01 1047 1049 -3.33333333333333e-01 1047 996 -2.50000000000000e-01 1047 907 -8.33333333333333e-02 1047 1048 -3.33333333333333e-01 1047 1154 1.66666666666667e-01 1047 916 -8.33333333333333e-02 1047 910 8.33333333333333e-02 1047 908 1.66666666666667e-01 1047 911 -1.66666666666667e-01 1047 752 8.33333333333333e-02 1047 917 -8.33333333333333e-02 1047 1153 1.66666666666667e-01 1047 751 -1.66666666666667e-01 1047 1152 -7.50000000000000e-01 1047 1043 -8.33333333333333e-02 1047 710 8.33333333333333e-02 1047 1042 1.66666666666667e-01 1047 709 -1.66666666666667e-01 1047 1041 -2.50000000000000e-01 1047 994 8.33333333333333e-02 1047 906 -2.50000000000000e-01 1048 1048 2.50000000000000e+00 1048 995 8.33333333333333e-02 1048 1217 1.66666666666667e-01 1048 912 8.33333333333333e-02 1048 914 -1.66666666666667e-01 1048 1216 -7.50000000000000e-01 1048 1215 1.66666666666667e-01 1048 1046 -8.33333333333333e-02 1048 1045 -2.50000000000000e-01 1048 1044 1.66666666666667e-01 1048 981 -8.33333333333333e-02 1048 998 1.66666666666667e-01 1048 996 -8.33333333333333e-02 1048 987 8.33333333333333e-02 1048 989 -1.66666666666667e-01 1048 752 8.33333333333333e-02 1048 997 -2.50000000000000e-01 1048 983 -8.33333333333333e-02 1048 710 8.33333333333333e-02 1048 906 -8.33333333333333e-02 1048 1154 -8.33333333333333e-02 1048 1047 -3.33333333333333e-01 1048 915 -8.33333333333333e-02 1048 909 8.33333333333333e-02 1048 917 -8.33333333333333e-02 1048 911 8.33333333333333e-02 1048 1153 -2.50000000000000e-01 1048 1152 1.66666666666667e-01 1048 750 -1.66666666666667e-01 1048 1043 1.66666666666667e-01 1048 1049 -3.33333333333333e-01 1048 908 1.66666666666667e-01 1048 1042 -7.50000000000000e-01 1048 993 8.33333333333333e-02 1048 907 -2.50000000000000e-01 1048 1041 1.66666666666667e-01 1048 708 -1.66666666666667e-01 1049 1049 2.50000000000000e+00 1049 993 -1.66666666666667e-01 1049 1215 -8.33333333333333e-02 1049 1216 1.66666666666667e-01 1049 913 -1.66666666666667e-01 1049 912 8.33333333333333e-02 1049 1217 -2.50000000000000e-01 1049 1046 -2.50000000000000e-01 1049 1045 -8.33333333333333e-02 1049 1044 1.66666666666667e-01 1049 981 -8.33333333333333e-02 1049 997 1.66666666666667e-01 1049 988 -1.66666666666667e-01 1049 987 8.33333333333333e-02 1049 998 -7.50000000000000e-01 1049 751 8.33333333333333e-02 1049 996 1.66666666666667e-01 1049 1047 -3.33333333333333e-01 1049 982 -8.33333333333333e-02 1049 709 8.33333333333333e-02 1049 1153 -8.33333333333333e-02 1049 1152 1.66666666666667e-01 1049 916 -8.33333333333333e-02 1049 910 8.33333333333333e-02 1049 906 1.66666666666667e-01 1049 909 -1.66666666666667e-01 1049 1154 -2.50000000000000e-01 1049 750 8.33333333333333e-02 1049 915 -8.33333333333333e-02 1049 1043 -2.50000000000000e-01 1049 994 8.33333333333333e-02 1049 908 -7.50000000000000e-01 1049 1042 1.66666666666667e-01 1049 1048 -3.33333333333333e-01 1049 907 1.66666666666667e-01 1049 1041 -8.33333333333333e-02 1049 708 8.33333333333333e-02 1050 1050 2.50000000000000e+00 1050 1031 -1.66666666666667e-01 1050 1030 8.33333333333333e-02 1050 1037 1.66666666666667e-01 1050 1035 -7.50000000000000e-01 1050 1255 8.33333333333333e-02 1050 1256 8.33333333333333e-02 1050 1058 -8.33333333333333e-02 1050 1057 1.66666666666667e-01 1050 1056 -2.50000000000000e-01 1050 1003 -8.33333333333333e-02 1050 1004 -8.33333333333333e-02 1050 1010 8.33333333333333e-02 1050 1009 -1.66666666666667e-01 1050 1013 8.33333333333333e-02 1050 1025 -8.33333333333333e-02 1050 1051 -3.33333333333333e-01 1050 1024 1.66666666666667e-01 1050 1012 8.33333333333333e-02 1050 709 -8.33333333333333e-02 1050 763 -8.33333333333333e-02 1050 1023 -2.50000000000000e-01 1050 908 8.33333333333333e-02 1050 920 -8.33333333333333e-02 1050 1252 8.33333333333333e-02 1050 919 -8.33333333333333e-02 1050 764 1.66666666666667e-01 1050 1253 -1.66666666666667e-01 1050 762 -2.50000000000000e-01 1050 1052 -3.33333333333333e-01 1050 1055 1.66666666666667e-01 1050 710 1.66666666666667e-01 1050 1054 1.66666666666667e-01 1050 907 -1.66666666666667e-01 1050 1036 1.66666666666667e-01 1050 1053 -7.50000000000000e-01 1050 708 -2.50000000000000e-01 1051 1051 2.50000000000000e+00 1051 1037 -8.33333333333333e-02 1051 1035 1.66666666666667e-01 1051 1029 8.33333333333333e-02 1051 1036 -2.50000000000000e-01 1051 1254 8.33333333333333e-02 1051 1256 -1.66666666666667e-01 1051 1058 1.66666666666667e-01 1051 1057 -7.50000000000000e-01 1051 1056 1.66666666666667e-01 1051 1002 -8.33333333333333e-02 1051 1004 -8.33333333333333e-02 1051 1010 8.33333333333333e-02 1051 1008 -1.66666666666667e-01 1051 1050 -3.33333333333333e-01 1051 1023 1.66666666666667e-01 1051 1013 -1.66666666666667e-01 1051 710 1.66666666666667e-01 1051 1011 8.33333333333333e-02 1051 708 -8.33333333333333e-02 1051 1025 1.66666666666667e-01 1051 1052 -3.33333333333333e-01 1051 764 1.66666666666667e-01 1051 1024 -7.50000000000000e-01 1051 762 -8.33333333333333e-02 1051 1251 8.33333333333333e-02 1051 918 -8.33333333333333e-02 1051 1253 8.33333333333333e-02 1051 920 -8.33333333333333e-02 1051 763 -2.50000000000000e-01 1051 1055 -8.33333333333333e-02 1051 908 8.33333333333333e-02 1051 1031 8.33333333333333e-02 1051 1054 -2.50000000000000e-01 1051 709 -2.50000000000000e-01 1051 1053 1.66666666666667e-01 1051 906 -1.66666666666667e-01 1052 1052 2.50000000000000e+00 1052 1036 -8.33333333333333e-02 1052 1029 -1.66666666666667e-01 1052 1037 -2.50000000000000e-01 1052 1035 1.66666666666667e-01 1052 1255 -1.66666666666667e-01 1052 1254 8.33333333333333e-02 1052 1058 -2.50000000000000e-01 1052 1057 1.66666666666667e-01 1052 1056 -8.33333333333333e-02 1052 1003 -8.33333333333333e-02 1052 1009 8.33333333333333e-02 1052 1002 -8.33333333333333e-02 1052 1008 8.33333333333333e-02 1052 1011 8.33333333333333e-02 1052 1023 -8.33333333333333e-02 1052 1012 -1.66666666666667e-01 1052 709 1.66666666666667e-01 1052 1025 -2.50000000000000e-01 1052 1024 1.66666666666667e-01 1052 1051 -3.33333333333333e-01 1052 763 1.66666666666667e-01 1052 906 8.33333333333333e-02 1052 918 -8.33333333333333e-02 1052 764 -7.50000000000000e-01 1052 1252 8.33333333333333e-02 1052 919 -8.33333333333333e-02 1052 762 1.66666666666667e-01 1052 1251 -1.66666666666667e-01 1052 1030 8.33333333333333e-02 1052 1055 -2.50000000000000e-01 1052 710 -7.50000000000000e-01 1052 1054 -8.33333333333333e-02 1052 907 8.33333333333333e-02 1052 1050 -3.33333333333333e-01 1052 1053 1.66666666666667e-01 1052 708 1.66666666666667e-01 1053 1053 2.50000000000000e+00 1053 1018 8.33333333333333e-02 1053 1159 1.66666666666667e-01 1053 911 8.33333333333333e-02 1053 910 -1.66666666666667e-01 1053 1160 1.66666666666667e-01 1053 1158 -7.50000000000000e-01 1053 1043 1.66666666666667e-01 1053 1042 -8.33333333333333e-02 1053 1041 -2.50000000000000e-01 1053 1013 -8.33333333333333e-02 1053 1028 -8.33333333333333e-02 1053 1025 8.33333333333333e-02 1053 1027 1.66666666666667e-01 1053 1024 -1.66666666666667e-01 1053 769 8.33333333333333e-02 1053 1026 -2.50000000000000e-01 1053 1012 -8.33333333333333e-02 1053 709 8.33333333333333e-02 1053 908 -8.33333333333333e-02 1053 1055 -3.33333333333333e-01 1053 1252 -8.33333333333333e-02 1053 923 -8.33333333333333e-02 1053 920 8.33333333333333e-02 1053 922 -8.33333333333333e-02 1053 919 8.33333333333333e-02 1053 1253 1.66666666666667e-01 1053 770 -1.66666666666667e-01 1053 1251 -2.50000000000000e-01 1053 1052 1.66666666666667e-01 1053 710 -1.66666666666667e-01 1053 1051 1.66666666666667e-01 1053 1054 -3.33333333333333e-01 1053 907 1.66666666666667e-01 1053 1050 -7.50000000000000e-01 1053 1019 8.33333333333333e-02 1053 906 -2.50000000000000e-01 1054 1054 2.50000000000000e+00 1054 1017 8.33333333333333e-02 1054 1160 -8.33333333333333e-02 1054 911 8.33333333333333e-02 1054 1158 1.66666666666667e-01 1054 909 -1.66666666666667e-01 1054 1159 -2.50000000000000e-01 1054 1043 1.66666666666667e-01 1054 1042 -2.50000000000000e-01 1054 1041 -8.33333333333333e-02 1054 1013 -8.33333333333333e-02 1054 1026 1.66666666666667e-01 1054 1025 8.33333333333333e-02 1054 1023 -1.66666666666667e-01 1054 1028 1.66666666666667e-01 1054 1055 -3.33333333333333e-01 1054 1027 -7.50000000000000e-01 1054 768 8.33333333333333e-02 1054 1011 -8.33333333333333e-02 1054 708 8.33333333333333e-02 1054 1251 -8.33333333333333e-02 1054 1253 1.66666666666667e-01 1054 908 1.66666666666667e-01 1054 920 -1.66666666666667e-01 1054 921 -8.33333333333333e-02 1054 918 8.33333333333333e-02 1054 770 8.33333333333333e-02 1054 923 -8.33333333333333e-02 1054 1252 -2.50000000000000e-01 1054 1052 -8.33333333333333e-02 1054 710 8.33333333333333e-02 1054 1051 -2.50000000000000e-01 1054 1019 -1.66666666666667e-01 1054 907 -7.50000000000000e-01 1054 1050 1.66666666666667e-01 1054 1053 -3.33333333333333e-01 1054 906 1.66666666666667e-01 1055 1055 2.50000000000000e+00 1055 1018 -1.66666666666667e-01 1055 1159 -8.33333333333333e-02 1055 910 8.33333333333333e-02 1055 909 8.33333333333333e-02 1055 1160 -2.50000000000000e-01 1055 1158 1.66666666666667e-01 1055 1043 -7.50000000000000e-01 1055 1042 1.66666666666667e-01 1055 1041 1.66666666666667e-01 1055 1011 -8.33333333333333e-02 1055 1012 -8.33333333333333e-02 1055 1026 -8.33333333333333e-02 1055 1023 8.33333333333333e-02 1055 1024 8.33333333333333e-02 1055 1028 -2.50000000000000e-01 1055 1027 1.66666666666667e-01 1055 1054 -3.33333333333333e-01 1055 906 -8.33333333333333e-02 1055 1053 -3.33333333333333e-01 1055 1252 1.66666666666667e-01 1055 921 -8.33333333333333e-02 1055 918 8.33333333333333e-02 1055 907 1.66666666666667e-01 1055 919 -1.66666666666667e-01 1055 1253 -7.50000000000000e-01 1055 769 8.33333333333333e-02 1055 922 -8.33333333333333e-02 1055 1251 1.66666666666667e-01 1055 768 -1.66666666666667e-01 1055 1052 -2.50000000000000e-01 1055 1017 8.33333333333333e-02 1055 908 -2.50000000000000e-01 1055 1051 -8.33333333333333e-02 1055 709 8.33333333333333e-02 1055 1050 1.66666666666667e-01 1055 708 -1.66666666666667e-01 1056 1056 2.50000000000000e+00 1056 1033 8.33333333333333e-02 1056 914 8.33333333333333e-02 1056 1220 -8.33333333333333e-02 1056 1219 1.66666666666667e-01 1056 913 -1.66666666666667e-01 1056 1218 -2.50000000000000e-01 1056 1046 1.66666666666667e-01 1056 1045 -8.33333333333333e-02 1056 1044 -2.50000000000000e-01 1056 1031 -8.33333333333333e-02 1056 1039 1.66666666666667e-01 1056 1037 8.33333333333333e-02 1056 1036 -1.66666666666667e-01 1056 1040 1.66666666666667e-01 1056 1058 -3.33333333333333e-01 1056 778 8.33333333333333e-02 1056 1038 -7.50000000000000e-01 1056 1030 -8.33333333333333e-02 1056 709 8.33333333333333e-02 1056 1255 -8.33333333333333e-02 1056 1256 1.66666666666667e-01 1056 908 1.66666666666667e-01 1056 920 -1.66666666666667e-01 1056 925 -8.33333333333333e-02 1056 919 8.33333333333333e-02 1056 779 8.33333333333333e-02 1056 926 -8.33333333333333e-02 1056 1254 -2.50000000000000e-01 1056 1052 -8.33333333333333e-02 1056 710 8.33333333333333e-02 1056 1057 -3.33333333333333e-01 1056 1051 1.66666666666667e-01 1056 907 1.66666666666667e-01 1056 1034 -1.66666666666667e-01 1056 1050 -2.50000000000000e-01 1056 906 -7.50000000000000e-01 1057 1057 2.50000000000000e+00 1057 1032 8.33333333333333e-02 1057 1218 1.66666666666667e-01 1057 914 8.33333333333333e-02 1057 912 -1.66666666666667e-01 1057 1220 1.66666666666667e-01 1057 1219 -7.50000000000000e-01 1057 1046 1.66666666666667e-01 1057 1045 -2.50000000000000e-01 1057 1044 -8.33333333333333e-02 1057 1031 -8.33333333333333e-02 1057 1040 -8.33333333333333e-02 1057 1037 8.33333333333333e-02 1057 1038 1.66666666666667e-01 1057 1035 -1.66666666666667e-01 1057 1039 -2.50000000000000e-01 1057 777 8.33333333333333e-02 1057 1029 -8.33333333333333e-02 1057 708 8.33333333333333e-02 1057 908 -8.33333333333333e-02 1057 1058 -3.33333333333333e-01 1057 1254 -8.33333333333333e-02 1057 926 -8.33333333333333e-02 1057 920 8.33333333333333e-02 1057 924 -8.33333333333333e-02 1057 918 8.33333333333333e-02 1057 779 -1.66666666666667e-01 1057 1256 1.66666666666667e-01 1057 1255 -2.50000000000000e-01 1057 1052 1.66666666666667e-01 1057 710 -1.66666666666667e-01 1057 1034 8.33333333333333e-02 1057 1051 -7.50000000000000e-01 1057 907 -2.50000000000000e-01 1057 1056 -3.33333333333333e-01 1057 1050 1.66666666666667e-01 1057 906 1.66666666666667e-01 1058 1058 2.50000000000000e+00 1058 1032 -1.66666666666667e-01 1058 912 8.33333333333333e-02 1058 1218 -8.33333333333333e-02 1058 913 8.33333333333333e-02 1058 1220 -2.50000000000000e-01 1058 1219 1.66666666666667e-01 1058 1046 -7.50000000000000e-01 1058 1045 1.66666666666667e-01 1058 1044 1.66666666666667e-01 1058 1030 -8.33333333333333e-02 1058 1029 -8.33333333333333e-02 1058 1039 -8.33333333333333e-02 1058 1036 8.33333333333333e-02 1058 1035 8.33333333333333e-02 1058 1040 -2.50000000000000e-01 1058 1038 1.66666666666667e-01 1058 1056 -3.33333333333333e-01 1058 907 -8.33333333333333e-02 1058 1057 -3.33333333333333e-01 1058 925 -8.33333333333333e-02 1058 919 8.33333333333333e-02 1058 1254 1.66666666666667e-01 1058 906 1.66666666666667e-01 1058 918 -1.66666666666667e-01 1058 1256 -7.50000000000000e-01 1058 778 -1.66666666666667e-01 1058 1255 1.66666666666667e-01 1058 777 8.33333333333333e-02 1058 924 -8.33333333333333e-02 1058 1033 8.33333333333333e-02 1058 1052 -2.50000000000000e-01 1058 908 -2.50000000000000e-01 1058 1051 1.66666666666667e-01 1058 709 -1.66666666666667e-01 1058 1050 -8.33333333333333e-02 1058 708 8.33333333333333e-02 1059 1059 1.25000000000000e+00 1059 1103 -8.33333333333333e-02 1059 1075 8.33333333333333e-02 1059 1102 -8.33333333333333e-02 1059 1099 -8.33333333333333e-02 1059 1070 8.33333333333333e-02 1059 1076 -1.66666666666667e-01 1059 1069 8.33333333333333e-02 1059 1068 -3.75000000000000e-01 1059 806 8.33333333333333e-02 1059 1061 -1.66666666666667e-01 1059 1067 1.66666666666667e-01 1059 1096 8.33333333333333e-02 1059 1066 -8.33333333333333e-02 1059 713 -4.16666666666667e-02 1059 800 4.16666666666667e-02 1059 712 8.33333333333333e-02 1059 799 -8.33333333333333e-02 1059 711 -1.25000000000000e-01 1059 1065 -2.50000000000000e-01 1059 719 -4.16666666666667e-02 1059 1097 8.33333333333333e-02 1059 1060 -1.66666666666667e-01 1059 718 8.33333333333333e-02 1059 805 8.33333333333333e-02 1059 1100 4.16666666666667e-02 1059 717 -1.25000000000000e-01 1059 804 -3.75000000000000e-01 1060 1060 1.25000000000000e+00 1060 1101 -8.33333333333333e-02 1060 1100 4.16666666666667e-02 1060 1103 -8.33333333333333e-02 1060 1098 -8.33333333333333e-02 1060 1070 -4.16666666666667e-02 1060 1076 8.33333333333333e-02 1060 1069 -1.25000000000000e-01 1060 1068 8.33333333333333e-02 1060 806 -4.16666666666667e-02 1060 800 4.16666666666667e-02 1060 1095 8.33333333333333e-02 1060 1065 -8.33333333333333e-02 1060 713 8.33333333333333e-02 1060 1061 -1.66666666666667e-01 1060 1067 1.66666666666667e-01 1060 712 -3.75000000000000e-01 1060 1066 -2.50000000000000e-01 1060 711 8.33333333333333e-02 1060 798 -8.33333333333333e-02 1060 719 8.33333333333333e-02 1060 1097 -1.66666666666667e-01 1060 1074 8.33333333333333e-02 1060 718 -3.75000000000000e-01 1060 805 -1.25000000000000e-01 1060 1059 -1.66666666666667e-01 1060 717 8.33333333333333e-02 1060 804 8.33333333333333e-02 1061 1061 1.25000000000000e+00 1061 1101 -8.33333333333333e-02 1061 1099 4.16666666666667e-02 1061 1102 -8.33333333333333e-02 1061 1070 -1.25000000000000e-01 1061 1069 -4.16666666666667e-02 1061 1075 8.33333333333333e-02 1061 1068 8.33333333333333e-02 1061 1074 -1.66666666666667e-01 1061 805 -4.16666666666667e-02 1061 799 4.16666666666667e-02 1061 804 8.33333333333333e-02 1061 1059 -1.66666666666667e-01 1061 1065 1.66666666666667e-01 1061 713 -1.25000000000000e-01 1061 1067 -7.50000000000000e-01 1061 712 8.33333333333333e-02 1061 1060 -1.66666666666667e-01 1061 1066 1.66666666666667e-01 1061 711 -4.16666666666667e-02 1061 798 4.16666666666667e-02 1061 1098 4.16666666666667e-02 1061 719 -1.25000000000000e-01 1061 806 -1.25000000000000e-01 1061 718 8.33333333333333e-02 1061 1096 -1.66666666666667e-01 1061 717 -4.16666666666667e-02 1061 1095 8.33333333333333e-02 1062 1062 1.25000000000000e+00 1062 1073 8.33333333333333e-02 1062 1072 8.33333333333333e-02 1062 1071 -3.75000000000000e-01 1062 1136 -8.33333333333333e-02 1062 1138 -8.33333333333333e-02 1062 1076 8.33333333333333e-02 1062 1075 -1.66666666666667e-01 1062 1139 -8.33333333333333e-02 1062 1133 8.33333333333333e-02 1062 1067 -8.33333333333333e-02 1062 1063 -1.66666666666667e-01 1062 1066 1.66666666666667e-01 1062 811 8.33333333333333e-02 1062 713 8.33333333333333e-02 1062 800 -8.33333333333333e-02 1062 712 -4.16666666666667e-02 1062 799 4.16666666666667e-02 1062 711 -1.25000000000000e-01 1062 1065 -2.50000000000000e-01 1062 1064 -1.66666666666667e-01 1062 725 8.33333333333333e-02 1062 812 8.33333333333333e-02 1062 724 -4.16666666666667e-02 1062 1132 8.33333333333333e-02 1062 1135 4.16666666666667e-02 1062 723 -1.25000000000000e-01 1062 810 -3.75000000000000e-01 1063 1063 1.25000000000000e+00 1063 1073 -4.16666666666667e-02 1063 1072 -1.25000000000000e-01 1063 1071 8.33333333333333e-02 1063 1136 4.16666666666667e-02 1063 1076 8.33333333333333e-02 1063 1139 -8.33333333333333e-02 1063 1137 -8.33333333333333e-02 1063 1074 -1.66666666666667e-01 1063 800 4.16666666666667e-02 1063 812 -4.16666666666667e-02 1063 1062 -1.66666666666667e-01 1063 1065 1.66666666666667e-01 1063 810 8.33333333333333e-02 1063 713 8.33333333333333e-02 1063 1064 -1.66666666666667e-01 1063 1067 1.66666666666667e-01 1063 712 -1.25000000000000e-01 1063 1066 -7.50000000000000e-01 1063 711 -4.16666666666667e-02 1063 798 4.16666666666667e-02 1063 725 8.33333333333333e-02 1063 1133 -1.66666666666667e-01 1063 1134 4.16666666666667e-02 1063 724 -1.25000000000000e-01 1063 811 -1.25000000000000e-01 1063 723 -4.16666666666667e-02 1063 1131 8.33333333333333e-02 1064 1064 1.25000000000000e+00 1064 1072 -4.16666666666667e-02 1064 1071 8.33333333333333e-02 1064 1135 4.16666666666667e-02 1064 1134 -8.33333333333333e-02 1064 1075 8.33333333333333e-02 1064 1138 -8.33333333333333e-02 1064 1074 8.33333333333333e-02 1064 1137 -8.33333333333333e-02 1064 1131 8.33333333333333e-02 1064 1065 -8.33333333333333e-02 1064 799 4.16666666666667e-02 1064 811 -4.16666666666667e-02 1064 713 -3.75000000000000e-01 1064 1067 -2.50000000000000e-01 1064 712 8.33333333333333e-02 1064 1063 -1.66666666666667e-01 1064 1066 1.66666666666667e-01 1064 711 8.33333333333333e-02 1064 798 -8.33333333333333e-02 1064 1073 -1.25000000000000e-01 1064 725 -3.75000000000000e-01 1064 812 -1.25000000000000e-01 1064 724 8.33333333333333e-02 1064 1132 -1.66666666666667e-01 1064 1062 -1.66666666666667e-01 1064 723 8.33333333333333e-02 1064 810 8.33333333333333e-02 1065 1065 2.50000000000000e+00 1065 1102 -1.66666666666667e-01 1065 1061 1.66666666666667e-01 1065 805 8.33333333333333e-02 1065 1060 -8.33333333333333e-02 1065 806 -1.66666666666667e-01 1065 1059 -2.50000000000000e-01 1065 1097 -8.33333333333333e-02 1065 1096 1.66666666666667e-01 1065 1095 -2.50000000000000e-01 1065 1168 -8.33333333333333e-02 1065 1076 1.66666666666667e-01 1065 1139 -1.66666666666667e-01 1065 1138 8.33333333333333e-02 1065 713 8.33333333333333e-02 1065 1075 1.66666666666667e-01 1065 1066 -3.33333333333333e-01 1065 1074 -7.50000000000000e-01 1065 1169 -8.33333333333333e-02 1065 731 8.33333333333333e-02 1065 1064 -8.33333333333333e-02 1065 1063 1.66666666666667e-01 1065 800 -8.33333333333333e-02 1065 812 8.33333333333333e-02 1065 817 1.66666666666667e-01 1065 811 -1.66666666666667e-01 1065 712 8.33333333333333e-02 1065 799 -8.33333333333333e-02 1065 1062 -2.50000000000000e-01 1065 1067 -3.33333333333333e-01 1065 1133 1.66666666666667e-01 1065 818 1.66666666666667e-01 1065 1132 -8.33333333333333e-02 1065 730 8.33333333333333e-02 1065 1103 8.33333333333333e-02 1065 1131 -2.50000000000000e-01 1065 816 -7.50000000000000e-01 1066 1066 2.50000000000000e+00 1066 1101 -1.66666666666667e-01 1066 804 8.33333333333333e-02 1066 1059 -8.33333333333333e-02 1066 806 8.33333333333333e-02 1066 1061 1.66666666666667e-01 1066 1060 -2.50000000000000e-01 1066 1097 1.66666666666667e-01 1066 1096 -7.50000000000000e-01 1066 1095 1.66666666666667e-01 1066 1169 -8.33333333333333e-02 1066 1167 -8.33333333333333e-02 1066 1076 -8.33333333333333e-02 1066 1139 8.33333333333333e-02 1066 1137 8.33333333333333e-02 1066 1075 -2.50000000000000e-01 1066 1074 1.66666666666667e-01 1066 1065 -3.33333333333333e-01 1066 818 -8.33333333333333e-02 1066 1067 -3.33333333333333e-01 1066 800 -8.33333333333333e-02 1066 812 8.33333333333333e-02 1066 1062 1.66666666666667e-01 1066 816 1.66666666666667e-01 1066 810 -1.66666666666667e-01 1066 713 -1.66666666666667e-01 1066 1064 1.66666666666667e-01 1066 1063 -7.50000000000000e-01 1066 711 8.33333333333333e-02 1066 798 -8.33333333333333e-02 1066 1133 1.66666666666667e-01 1066 731 -1.66666666666667e-01 1066 1103 8.33333333333333e-02 1066 1132 -2.50000000000000e-01 1066 817 -2.50000000000000e-01 1066 1131 -8.33333333333333e-02 1066 729 8.33333333333333e-02 1067 1067 2.50000000000000e+00 1067 1101 8.33333333333333e-02 1067 1059 1.66666666666667e-01 1067 805 8.33333333333333e-02 1067 804 -1.66666666666667e-01 1067 1061 -7.50000000000000e-01 1067 1060 1.66666666666667e-01 1067 1097 -2.50000000000000e-01 1067 1096 1.66666666666667e-01 1067 1095 -8.33333333333333e-02 1067 1168 -8.33333333333333e-02 1067 1075 -8.33333333333333e-02 1067 1138 8.33333333333333e-02 1067 1074 1.66666666666667e-01 1067 1137 -1.66666666666667e-01 1067 1076 -2.50000000000000e-01 1067 711 8.33333333333333e-02 1067 1167 -8.33333333333333e-02 1067 729 8.33333333333333e-02 1067 817 -8.33333333333333e-02 1067 1066 -3.33333333333333e-01 1067 1062 -8.33333333333333e-02 1067 799 -8.33333333333333e-02 1067 811 8.33333333333333e-02 1067 798 -8.33333333333333e-02 1067 810 8.33333333333333e-02 1067 1064 -2.50000000000000e-01 1067 712 -1.66666666666667e-01 1067 1063 1.66666666666667e-01 1067 1102 8.33333333333333e-02 1067 1133 -7.50000000000000e-01 1067 818 -2.50000000000000e-01 1067 1132 1.66666666666667e-01 1067 730 -1.66666666666667e-01 1067 1065 -3.33333333333333e-01 1067 1131 1.66666666666667e-01 1067 816 1.66666666666667e-01 1068 1068 1.25000000000000e+00 1068 1102 8.33333333333333e-02 1068 1103 8.33333333333333e-02 1068 1061 8.33333333333333e-02 1068 1070 -1.66666666666667e-01 1068 1060 8.33333333333333e-02 1068 1059 -3.75000000000000e-01 1068 1099 8.33333333333333e-02 1068 1098 -1.25000000000000e-01 1068 1075 -8.33333333333333e-02 1068 1069 -1.66666666666667e-01 1068 824 8.33333333333333e-02 1068 1186 -8.33333333333333e-02 1068 829 8.33333333333333e-02 1068 1076 1.66666666666667e-01 1068 830 -1.66666666666667e-01 1068 734 4.16666666666667e-02 1068 1187 -8.33333333333333e-02 1068 823 8.33333333333333e-02 1068 733 -8.33333333333333e-02 1068 822 -3.75000000000000e-01 1068 821 -4.16666666666667e-02 1068 713 4.16666666666667e-02 1068 820 8.33333333333333e-02 1068 712 -8.33333333333333e-02 1068 819 -1.25000000000000e-01 1068 1100 -4.16666666666667e-02 1068 1074 -2.50000000000000e-01 1069 1069 1.25000000000000e+00 1069 1101 8.33333333333333e-02 1069 1103 -1.66666666666667e-01 1069 1061 -4.16666666666667e-02 1069 713 4.16666666666667e-02 1069 1060 -1.25000000000000e-01 1069 1059 8.33333333333333e-02 1069 734 4.16666666666667e-02 1069 1099 -3.75000000000000e-01 1069 1098 8.33333333333333e-02 1069 1074 -8.33333333333333e-02 1069 824 -4.16666666666667e-02 1069 1068 -1.66666666666667e-01 1069 1185 -8.33333333333333e-02 1069 828 8.33333333333333e-02 1069 1187 -8.33333333333333e-02 1069 830 8.33333333333333e-02 1069 823 -1.25000000000000e-01 1069 822 8.33333333333333e-02 1069 732 -8.33333333333333e-02 1069 821 8.33333333333333e-02 1069 1070 -1.66666666666667e-01 1069 1076 1.66666666666667e-01 1069 820 -3.75000000000000e-01 1069 1100 8.33333333333333e-02 1069 1075 -2.50000000000000e-01 1069 819 8.33333333333333e-02 1069 711 -8.33333333333333e-02 1070 1070 1.25000000000000e+00 1070 1098 -4.16666666666667e-02 1070 1102 -1.66666666666667e-01 1070 1101 8.33333333333333e-02 1070 1061 -1.25000000000000e-01 1070 1060 -4.16666666666667e-02 1070 712 4.16666666666667e-02 1070 1059 8.33333333333333e-02 1070 1068 -1.66666666666667e-01 1070 1100 -1.25000000000000e-01 1070 733 4.16666666666667e-02 1070 823 -4.16666666666667e-02 1070 822 8.33333333333333e-02 1070 1186 -8.33333333333333e-02 1070 829 8.33333333333333e-02 1070 1074 1.66666666666667e-01 1070 828 -1.66666666666667e-01 1070 824 -1.25000000000000e-01 1070 732 4.16666666666667e-02 1070 1185 -8.33333333333333e-02 1070 821 -1.25000000000000e-01 1070 1099 8.33333333333333e-02 1070 1076 -7.50000000000000e-01 1070 820 8.33333333333333e-02 1070 1069 -1.66666666666667e-01 1070 1075 1.66666666666667e-01 1070 819 -4.16666666666667e-02 1070 711 4.16666666666667e-02 1071 1071 1.25000000000000e+00 1071 1135 -4.16666666666667e-02 1071 1138 8.33333333333333e-02 1071 1136 8.33333333333333e-02 1071 1134 -1.25000000000000e-01 1071 1064 8.33333333333333e-02 1071 1072 -1.66666666666667e-01 1071 1063 8.33333333333333e-02 1071 1062 -3.75000000000000e-01 1071 1193 -8.33333333333333e-02 1071 1073 -1.66666666666667e-01 1071 826 8.33333333333333e-02 1071 830 8.33333333333333e-02 1071 1076 -8.33333333333333e-02 1071 829 -1.66666666666667e-01 1071 1075 1.66666666666667e-01 1071 827 8.33333333333333e-02 1071 737 -8.33333333333333e-02 1071 736 4.16666666666667e-02 1071 1192 -8.33333333333333e-02 1071 825 -3.75000000000000e-01 1071 821 8.33333333333333e-02 1071 713 -8.33333333333333e-02 1071 820 -4.16666666666667e-02 1071 712 4.16666666666667e-02 1071 819 -1.25000000000000e-01 1071 1139 8.33333333333333e-02 1071 1074 -2.50000000000000e-01 1072 1072 1.25000000000000e+00 1072 1139 -1.66666666666667e-01 1072 1134 -4.16666666666667e-02 1072 1137 8.33333333333333e-02 1072 737 4.16666666666667e-02 1072 1135 -1.25000000000000e-01 1072 713 4.16666666666667e-02 1072 1064 -4.16666666666667e-02 1072 1063 -1.25000000000000e-01 1072 1071 -1.66666666666667e-01 1072 1062 8.33333333333333e-02 1072 1193 -8.33333333333333e-02 1072 827 -4.16666666666667e-02 1072 830 8.33333333333333e-02 1072 825 8.33333333333333e-02 1072 828 -1.66666666666667e-01 1072 1074 1.66666666666667e-01 1072 826 -1.25000000000000e-01 1072 735 4.16666666666667e-02 1072 1191 -8.33333333333333e-02 1072 821 8.33333333333333e-02 1072 1073 -1.66666666666667e-01 1072 1076 1.66666666666667e-01 1072 820 -1.25000000000000e-01 1072 1136 8.33333333333333e-02 1072 1075 -7.50000000000000e-01 1072 819 -4.16666666666667e-02 1072 711 4.16666666666667e-02 1073 1073 1.25000000000000e+00 1073 1135 8.33333333333333e-02 1073 1138 -1.66666666666667e-01 1073 1136 -3.75000000000000e-01 1073 736 4.16666666666667e-02 1073 1134 8.33333333333333e-02 1073 1064 -1.25000000000000e-01 1073 712 4.16666666666667e-02 1073 1063 -4.16666666666667e-02 1073 1062 8.33333333333333e-02 1073 1192 -8.33333333333333e-02 1073 1191 -8.33333333333333e-02 1073 826 -4.16666666666667e-02 1073 829 8.33333333333333e-02 1073 1071 -1.66666666666667e-01 1073 828 8.33333333333333e-02 1073 1074 -8.33333333333333e-02 1073 827 -1.25000000000000e-01 1073 825 8.33333333333333e-02 1073 735 -8.33333333333333e-02 1073 821 -3.75000000000000e-01 1073 1137 8.33333333333333e-02 1073 1076 -2.50000000000000e-01 1073 820 8.33333333333333e-02 1073 1072 -1.66666666666667e-01 1073 1075 1.66666666666667e-01 1073 819 8.33333333333333e-02 1073 711 -8.33333333333333e-02 1074 1074 2.50000000000000e+00 1074 1103 -8.33333333333333e-02 1074 1061 -1.66666666666667e-01 1074 1102 1.66666666666667e-01 1074 1101 -2.50000000000000e-01 1074 1069 -8.33333333333333e-02 1074 1070 1.66666666666667e-01 1074 1068 -2.50000000000000e-01 1074 1187 8.33333333333333e-02 1074 1186 -1.66666666666667e-01 1074 1168 8.33333333333333e-02 1074 1138 -8.33333333333333e-02 1074 1076 -3.33333333333333e-01 1074 1067 1.66666666666667e-01 1074 1139 1.66666666666667e-01 1074 713 -8.33333333333333e-02 1074 1064 8.33333333333333e-02 1074 1066 1.66666666666667e-01 1074 1063 -1.66666666666667e-01 1074 1065 -7.50000000000000e-01 1074 740 -8.33333333333333e-02 1074 1169 8.33333333333333e-02 1074 1137 -2.50000000000000e-01 1074 821 8.33333333333333e-02 1074 1073 -8.33333333333333e-02 1074 829 1.66666666666667e-01 1074 1075 -3.33333333333333e-01 1074 1072 1.66666666666667e-01 1074 830 1.66666666666667e-01 1074 1193 -1.66666666666667e-01 1074 1192 8.33333333333333e-02 1074 739 -8.33333333333333e-02 1074 828 -7.50000000000000e-01 1074 820 8.33333333333333e-02 1074 712 -8.33333333333333e-02 1074 1071 -2.50000000000000e-01 1074 1060 8.33333333333333e-02 1075 1075 2.50000000000000e+00 1075 1103 1.66666666666667e-01 1075 1061 8.33333333333333e-02 1075 1102 -7.50000000000000e-01 1075 1101 1.66666666666667e-01 1075 1068 -8.33333333333333e-02 1075 1187 8.33333333333333e-02 1075 1070 1.66666666666667e-01 1075 1069 -2.50000000000000e-01 1075 1185 -1.66666666666667e-01 1075 1076 -3.33333333333333e-01 1075 740 -8.33333333333333e-02 1075 713 -8.33333333333333e-02 1075 1167 8.33333333333333e-02 1075 1137 -8.33333333333333e-02 1075 1067 -8.33333333333333e-02 1075 1064 8.33333333333333e-02 1075 1066 -2.50000000000000e-01 1075 1065 1.66666666666667e-01 1075 1062 -1.66666666666667e-01 1075 1169 -1.66666666666667e-01 1075 1139 1.66666666666667e-01 1075 1138 -2.50000000000000e-01 1075 830 -8.33333333333333e-02 1075 1193 8.33333333333333e-02 1075 828 1.66666666666667e-01 1075 1074 -3.33333333333333e-01 1075 1071 1.66666666666667e-01 1075 829 -2.50000000000000e-01 1075 1191 8.33333333333333e-02 1075 738 -8.33333333333333e-02 1075 821 -1.66666666666667e-01 1075 1073 1.66666666666667e-01 1075 1072 -7.50000000000000e-01 1075 1059 8.33333333333333e-02 1075 819 8.33333333333333e-02 1075 711 -8.33333333333333e-02 1076 1076 2.50000000000000e+00 1076 1101 -8.33333333333333e-02 1076 1060 8.33333333333333e-02 1076 1059 -1.66666666666667e-01 1076 1103 -2.50000000000000e-01 1076 1186 8.33333333333333e-02 1076 1068 1.66666666666667e-01 1076 1070 -7.50000000000000e-01 1076 1069 1.66666666666667e-01 1076 1185 8.33333333333333e-02 1076 1075 -3.33333333333333e-01 1076 739 -8.33333333333333e-02 1076 712 -8.33333333333333e-02 1076 1066 -8.33333333333333e-02 1076 1063 8.33333333333333e-02 1076 1074 -3.33333333333333e-01 1076 1065 1.66666666666667e-01 1076 1137 1.66666666666667e-01 1076 1067 -2.50000000000000e-01 1076 711 -8.33333333333333e-02 1076 1062 8.33333333333333e-02 1076 1139 -7.50000000000000e-01 1076 1168 -1.66666666666667e-01 1076 1138 1.66666666666667e-01 1076 738 -8.33333333333333e-02 1076 1167 8.33333333333333e-02 1076 829 -8.33333333333333e-02 1076 1192 8.33333333333333e-02 1076 819 8.33333333333333e-02 1076 1071 -8.33333333333333e-02 1076 830 -2.50000000000000e-01 1076 828 1.66666666666667e-01 1076 1191 -1.66666666666667e-01 1076 1073 -2.50000000000000e-01 1076 1102 1.66666666666667e-01 1076 820 -1.66666666666667e-01 1076 1072 1.66666666666667e-01 1077 1077 1.25000000000000e+00 1077 1108 -8.33333333333333e-02 1077 1088 -4.16666666666667e-02 1077 1094 8.33333333333333e-02 1077 1087 8.33333333333333e-02 1077 1086 -1.25000000000000e-01 1077 1106 4.16666666666667e-02 1077 1109 -8.33333333333333e-02 1077 1105 -8.33333333333333e-02 1077 803 4.16666666666667e-02 1077 806 -4.16666666666667e-02 1077 1096 8.33333333333333e-02 1077 1084 -8.33333333333333e-02 1077 719 8.33333333333333e-02 1077 1097 -1.66666666666667e-01 1077 718 8.33333333333333e-02 1077 1078 -1.66666666666667e-01 1077 805 8.33333333333333e-02 1077 717 -3.75000000000000e-01 1077 804 -1.25000000000000e-01 1077 1079 -1.66666666666667e-01 1077 716 8.33333333333333e-02 1077 1085 1.66666666666667e-01 1077 715 8.33333333333333e-02 1077 802 -8.33333333333333e-02 1077 1093 8.33333333333333e-02 1077 714 -3.75000000000000e-01 1077 1083 -2.50000000000000e-01 1078 1078 1.25000000000000e+00 1078 1109 -8.33333333333333e-02 1078 1092 8.33333333333333e-02 1078 1107 -8.33333333333333e-02 1078 1088 8.33333333333333e-02 1078 1094 -1.66666666666667e-01 1078 1087 -3.75000000000000e-01 1078 1086 8.33333333333333e-02 1078 1104 -8.33333333333333e-02 1078 1079 -1.66666666666667e-01 1078 806 8.33333333333333e-02 1078 1085 1.66666666666667e-01 1078 1095 8.33333333333333e-02 1078 1083 -8.33333333333333e-02 1078 719 -4.16666666666667e-02 1078 1097 8.33333333333333e-02 1078 718 -1.25000000000000e-01 1078 805 -3.75000000000000e-01 1078 717 8.33333333333333e-02 1078 1077 -1.66666666666667e-01 1078 804 8.33333333333333e-02 1078 716 -4.16666666666667e-02 1078 803 4.16666666666667e-02 1078 1106 4.16666666666667e-02 1078 715 -1.25000000000000e-01 1078 1084 -2.50000000000000e-01 1078 714 8.33333333333333e-02 1078 801 -8.33333333333333e-02 1079 1079 1.25000000000000e+00 1079 1108 -8.33333333333333e-02 1079 1088 -1.25000000000000e-01 1079 1087 8.33333333333333e-02 1079 1093 -1.66666666666667e-01 1079 1086 -4.16666666666667e-02 1079 1092 8.33333333333333e-02 1079 1104 4.16666666666667e-02 1079 1107 -8.33333333333333e-02 1079 801 4.16666666666667e-02 1079 804 -4.16666666666667e-02 1079 1078 -1.66666666666667e-01 1079 805 8.33333333333333e-02 1079 1084 1.66666666666667e-01 1079 719 -1.25000000000000e-01 1079 806 -1.25000000000000e-01 1079 718 -4.16666666666667e-02 1079 1096 8.33333333333333e-02 1079 717 8.33333333333333e-02 1079 1095 -1.66666666666667e-01 1079 1105 4.16666666666667e-02 1079 716 -1.25000000000000e-01 1079 1085 -7.50000000000000e-01 1079 715 -4.16666666666667e-02 1079 802 4.16666666666667e-02 1079 1077 -1.66666666666667e-01 1079 714 8.33333333333333e-02 1079 1083 1.66666666666667e-01 1080 1080 2.50000000000000e+00 1080 1157 -8.33333333333333e-02 1080 1156 -8.33333333333333e-02 1080 1093 -1.66666666666667e-01 1080 1084 1.66666666666667e-01 1080 1151 -1.66666666666667e-01 1080 1150 8.33333333333333e-02 1080 1085 1.66666666666667e-01 1080 1083 -7.50000000000000e-01 1080 1091 -8.33333333333333e-02 1080 1154 8.33333333333333e-02 1080 1090 1.66666666666667e-01 1080 1081 -3.33333333333333e-01 1080 988 1.66666666666667e-01 1080 986 -1.66666666666667e-01 1080 716 1.66666666666667e-01 1080 985 8.33333333333333e-02 1080 715 -8.33333333333333e-02 1080 1089 -2.50000000000000e-01 1080 989 1.66666666666667e-01 1080 1082 -3.33333333333333e-01 1080 728 1.66666666666667e-01 1080 1153 8.33333333333333e-02 1080 727 -8.33333333333333e-02 1080 987 -7.50000000000000e-01 1080 961 -8.33333333333333e-02 1080 802 8.33333333333333e-02 1080 803 8.33333333333333e-02 1080 962 -8.33333333333333e-02 1080 714 -2.50000000000000e-01 1080 815 -8.33333333333333e-02 1080 968 8.33333333333333e-02 1080 814 1.66666666666667e-01 1080 967 -1.66666666666667e-01 1080 813 -2.50000000000000e-01 1080 1094 8.33333333333333e-02 1080 726 -2.50000000000000e-01 1081 1081 2.50000000000000e+00 1081 1094 8.33333333333333e-02 1081 1092 -1.66666666666667e-01 1081 1157 -8.33333333333333e-02 1081 1085 -8.33333333333333e-02 1081 1151 8.33333333333333e-02 1081 1083 1.66666666666667e-01 1081 1149 8.33333333333333e-02 1081 1084 -2.50000000000000e-01 1081 986 8.33333333333333e-02 1081 989 -8.33333333333333e-02 1081 1089 1.66666666666667e-01 1081 1080 -3.33333333333333e-01 1081 987 1.66666666666667e-01 1081 1091 1.66666666666667e-01 1081 1090 -7.50000000000000e-01 1081 984 8.33333333333333e-02 1081 714 -8.33333333333333e-02 1081 1154 -1.66666666666667e-01 1081 988 -2.50000000000000e-01 1081 1152 8.33333333333333e-02 1081 726 -8.33333333333333e-02 1081 960 -8.33333333333333e-02 1081 801 8.33333333333333e-02 1081 962 -8.33333333333333e-02 1081 968 8.33333333333333e-02 1081 803 -1.66666666666667e-01 1081 716 1.66666666666667e-01 1081 715 -2.50000000000000e-01 1081 815 1.66666666666667e-01 1081 1082 -3.33333333333333e-01 1081 728 1.66666666666667e-01 1081 814 -7.50000000000000e-01 1081 1155 -8.33333333333333e-02 1081 727 -2.50000000000000e-01 1081 813 1.66666666666667e-01 1081 966 -1.66666666666667e-01 1082 1082 2.50000000000000e+00 1082 1155 -8.33333333333333e-02 1082 1093 8.33333333333333e-02 1082 1156 -8.33333333333333e-02 1082 1084 -8.33333333333333e-02 1082 1150 8.33333333333333e-02 1082 1149 -1.66666666666667e-01 1082 1085 -2.50000000000000e-01 1082 1083 1.66666666666667e-01 1082 985 8.33333333333333e-02 1082 988 -8.33333333333333e-02 1082 1089 -8.33333333333333e-02 1082 1152 8.33333333333333e-02 1082 1091 -2.50000000000000e-01 1082 1090 1.66666666666667e-01 1082 984 -1.66666666666667e-01 1082 714 1.66666666666667e-01 1082 989 -2.50000000000000e-01 1082 1153 -1.66666666666667e-01 1082 987 1.66666666666667e-01 1082 1080 -3.33333333333333e-01 1082 726 1.66666666666667e-01 1082 961 -8.33333333333333e-02 1082 967 8.33333333333333e-02 1082 716 -7.50000000000000e-01 1082 802 -1.66666666666667e-01 1082 715 1.66666666666667e-01 1082 801 8.33333333333333e-02 1082 960 -8.33333333333333e-02 1082 815 -2.50000000000000e-01 1082 1092 8.33333333333333e-02 1082 728 -7.50000000000000e-01 1082 814 1.66666666666667e-01 1082 1081 -3.33333333333333e-01 1082 727 1.66666666666667e-01 1082 813 -8.33333333333333e-02 1082 966 8.33333333333333e-02 1083 1083 2.50000000000000e+00 1083 1108 -1.66666666666667e-01 1083 1078 -8.33333333333333e-02 1083 805 8.33333333333333e-02 1083 806 8.33333333333333e-02 1083 1079 1.66666666666667e-01 1083 1077 -2.50000000000000e-01 1083 1097 1.66666666666667e-01 1083 1096 1.66666666666667e-01 1083 1095 -7.50000000000000e-01 1083 1172 -8.33333333333333e-02 1083 1171 -8.33333333333333e-02 1083 1094 -8.33333333333333e-02 1083 1157 8.33333333333333e-02 1083 1156 8.33333333333333e-02 1083 1093 1.66666666666667e-01 1083 1084 -3.33333333333333e-01 1083 1092 -2.50000000000000e-01 1083 818 -8.33333333333333e-02 1083 1085 -3.33333333333333e-01 1083 803 -8.33333333333333e-02 1083 815 8.33333333333333e-02 1083 1081 1.66666666666667e-01 1083 817 1.66666666666667e-01 1083 814 -1.66666666666667e-01 1083 1082 1.66666666666667e-01 1083 716 -1.66666666666667e-01 1083 715 8.33333333333333e-02 1083 802 -8.33333333333333e-02 1083 1080 -7.50000000000000e-01 1083 1151 1.66666666666667e-01 1083 731 -1.66666666666667e-01 1083 1150 -8.33333333333333e-02 1083 730 8.33333333333333e-02 1083 1149 -2.50000000000000e-01 1083 1109 8.33333333333333e-02 1083 816 -2.50000000000000e-01 1084 1084 2.50000000000000e+00 1084 1107 -1.66666666666667e-01 1084 1079 1.66666666666667e-01 1084 1077 -8.33333333333333e-02 1084 804 8.33333333333333e-02 1084 806 -1.66666666666667e-01 1084 1078 -2.50000000000000e-01 1084 1097 -8.33333333333333e-02 1084 1096 -2.50000000000000e-01 1084 1095 1.66666666666667e-01 1084 1170 -8.33333333333333e-02 1084 1094 1.66666666666667e-01 1084 1157 -1.66666666666667e-01 1084 1155 8.33333333333333e-02 1084 716 8.33333333333333e-02 1084 1093 -7.50000000000000e-01 1084 1092 1.66666666666667e-01 1084 1083 -3.33333333333333e-01 1084 1172 -8.33333333333333e-02 1084 731 8.33333333333333e-02 1084 1082 -8.33333333333333e-02 1084 1080 1.66666666666667e-01 1084 803 -8.33333333333333e-02 1084 815 8.33333333333333e-02 1084 816 1.66666666666667e-01 1084 813 -1.66666666666667e-01 1084 1081 -2.50000000000000e-01 1084 714 8.33333333333333e-02 1084 801 -8.33333333333333e-02 1084 1151 1.66666666666667e-01 1084 1085 -3.33333333333333e-01 1084 818 1.66666666666667e-01 1084 1150 -2.50000000000000e-01 1084 1109 8.33333333333333e-02 1084 817 -7.50000000000000e-01 1084 1149 -8.33333333333333e-02 1084 729 8.33333333333333e-02 1085 1085 2.50000000000000e+00 1085 1108 8.33333333333333e-02 1085 1078 1.66666666666667e-01 1085 805 -1.66666666666667e-01 1085 804 8.33333333333333e-02 1085 1079 -7.50000000000000e-01 1085 1077 1.66666666666667e-01 1085 1097 -2.50000000000000e-01 1085 1096 -8.33333333333333e-02 1085 1095 1.66666666666667e-01 1085 1170 -8.33333333333333e-02 1085 1093 1.66666666666667e-01 1085 1092 -8.33333333333333e-02 1085 1155 8.33333333333333e-02 1085 1156 -1.66666666666667e-01 1085 1094 -2.50000000000000e-01 1085 715 8.33333333333333e-02 1085 1171 -8.33333333333333e-02 1085 730 8.33333333333333e-02 1085 816 -8.33333333333333e-02 1085 1081 -8.33333333333333e-02 1085 1083 -3.33333333333333e-01 1085 801 -8.33333333333333e-02 1085 813 8.33333333333333e-02 1085 802 -8.33333333333333e-02 1085 814 8.33333333333333e-02 1085 1082 -2.50000000000000e-01 1085 1080 1.66666666666667e-01 1085 714 -1.66666666666667e-01 1085 1151 -7.50000000000000e-01 1085 1107 8.33333333333333e-02 1085 818 -2.50000000000000e-01 1085 1150 1.66666666666667e-01 1085 1084 -3.33333333333333e-01 1085 817 1.66666666666667e-01 1085 1149 1.66666666666667e-01 1085 729 -1.66666666666667e-01 1086 1086 1.25000000000000e+00 1086 1108 8.33333333333333e-02 1086 1109 -1.66666666666667e-01 1086 716 4.16666666666667e-02 1086 1079 -4.16666666666667e-02 1086 1078 8.33333333333333e-02 1086 1077 -1.25000000000000e-01 1086 749 4.16666666666667e-02 1086 1105 8.33333333333333e-02 1086 1104 -3.75000000000000e-01 1086 1093 -8.33333333333333e-02 1086 848 -4.16666666666667e-02 1086 1087 -1.66666666666667e-01 1086 1222 -8.33333333333333e-02 1086 853 8.33333333333333e-02 1086 1223 -8.33333333333333e-02 1086 854 8.33333333333333e-02 1086 748 -8.33333333333333e-02 1086 847 8.33333333333333e-02 1086 846 -1.25000000000000e-01 1086 1088 -1.66666666666667e-01 1086 842 8.33333333333333e-02 1086 1094 1.66666666666667e-01 1086 841 8.33333333333333e-02 1086 715 -8.33333333333333e-02 1086 1106 8.33333333333333e-02 1086 840 -3.75000000000000e-01 1086 1092 -2.50000000000000e-01 1087 1087 1.25000000000000e+00 1087 1107 8.33333333333333e-02 1087 1109 8.33333333333333e-02 1087 1079 8.33333333333333e-02 1087 1088 -1.66666666666667e-01 1087 1078 -3.75000000000000e-01 1087 1077 8.33333333333333e-02 1087 1105 -1.25000000000000e-01 1087 1104 8.33333333333333e-02 1087 1092 -8.33333333333333e-02 1087 1086 -1.66666666666667e-01 1087 848 8.33333333333333e-02 1087 1221 -8.33333333333333e-02 1087 852 8.33333333333333e-02 1087 1094 1.66666666666667e-01 1087 854 -1.66666666666667e-01 1087 749 4.16666666666667e-02 1087 1223 -8.33333333333333e-02 1087 847 -3.75000000000000e-01 1087 747 -8.33333333333333e-02 1087 846 8.33333333333333e-02 1087 842 -4.16666666666667e-02 1087 716 4.16666666666667e-02 1087 1106 -4.16666666666667e-02 1087 841 -1.25000000000000e-01 1087 1093 -2.50000000000000e-01 1087 840 8.33333333333333e-02 1087 714 -8.33333333333333e-02 1088 1088 1.25000000000000e+00 1088 1104 8.33333333333333e-02 1088 1108 8.33333333333333e-02 1088 1107 -1.66666666666667e-01 1088 1079 -1.25000000000000e-01 1088 1078 8.33333333333333e-02 1088 1087 -1.66666666666667e-01 1088 714 4.16666666666667e-02 1088 1077 -4.16666666666667e-02 1088 1106 -1.25000000000000e-01 1088 747 4.16666666666667e-02 1088 846 -4.16666666666667e-02 1088 847 8.33333333333333e-02 1088 1093 1.66666666666667e-01 1088 853 -1.66666666666667e-01 1088 1221 -8.33333333333333e-02 1088 852 8.33333333333333e-02 1088 848 -1.25000000000000e-01 1088 748 4.16666666666667e-02 1088 1222 -8.33333333333333e-02 1088 1105 -4.16666666666667e-02 1088 842 -1.25000000000000e-01 1088 1094 -7.50000000000000e-01 1088 841 -4.16666666666667e-02 1088 715 4.16666666666667e-02 1088 1086 -1.66666666666667e-01 1088 840 8.33333333333333e-02 1088 1092 1.66666666666667e-01 1089 1089 2.50000000000000e+00 1089 1156 8.33333333333333e-02 1089 1229 -8.33333333333333e-02 1089 854 8.33333333333333e-02 1089 853 -1.66666666666667e-01 1089 1093 1.66666666666667e-01 1089 1228 -8.33333333333333e-02 1089 1094 1.66666666666667e-01 1089 1092 -7.50000000000000e-01 1089 1082 -8.33333333333333e-02 1089 989 8.33333333333333e-02 1089 1081 1.66666666666667e-01 1089 988 -1.66666666666667e-01 1089 715 8.33333333333333e-02 1089 1080 -2.50000000000000e-01 1089 1091 -3.33333333333333e-01 1089 1154 1.66666666666667e-01 1089 751 8.33333333333333e-02 1089 1153 -8.33333333333333e-02 1089 1152 -2.50000000000000e-01 1089 985 -8.33333333333333e-02 1089 842 1.66666666666667e-01 1089 838 8.33333333333333e-02 1089 841 -8.33333333333333e-02 1089 839 -1.66666666666667e-01 1089 998 1.66666666666667e-01 1089 716 8.33333333333333e-02 1089 986 -8.33333333333333e-02 1089 840 -2.50000000000000e-01 1089 851 -8.33333333333333e-02 1089 752 8.33333333333333e-02 1089 1090 -3.33333333333333e-01 1089 850 1.66666666666667e-01 1089 997 1.66666666666667e-01 1089 1157 -1.66666666666667e-01 1089 849 -2.50000000000000e-01 1089 996 -7.50000000000000e-01 1090 1090 2.50000000000000e+00 1090 1155 8.33333333333333e-02 1090 1229 -8.33333333333333e-02 1090 854 8.33333333333333e-02 1090 1094 -8.33333333333333e-02 1090 852 -1.66666666666667e-01 1090 1092 1.66666666666667e-01 1090 1227 -8.33333333333333e-02 1090 1093 -2.50000000000000e-01 1090 989 8.33333333333333e-02 1090 1080 1.66666666666667e-01 1090 987 -1.66666666666667e-01 1090 1082 1.66666666666667e-01 1090 1081 -7.50000000000000e-01 1090 714 8.33333333333333e-02 1090 1154 1.66666666666667e-01 1090 1153 -2.50000000000000e-01 1090 750 8.33333333333333e-02 1090 1152 -8.33333333333333e-02 1090 984 -8.33333333333333e-02 1090 986 -8.33333333333333e-02 1090 1091 -3.33333333333333e-01 1090 837 8.33333333333333e-02 1090 840 -8.33333333333333e-02 1090 839 8.33333333333333e-02 1090 998 -8.33333333333333e-02 1090 716 -1.66666666666667e-01 1090 842 1.66666666666667e-01 1090 841 -2.50000000000000e-01 1090 851 1.66666666666667e-01 1090 752 -1.66666666666667e-01 1090 1157 8.33333333333333e-02 1090 850 -7.50000000000000e-01 1090 997 -2.50000000000000e-01 1090 1089 -3.33333333333333e-01 1090 849 1.66666666666667e-01 1090 996 1.66666666666667e-01 1091 1091 2.50000000000000e+00 1091 1155 -1.66666666666667e-01 1091 1227 -8.33333333333333e-02 1091 1228 -8.33333333333333e-02 1091 852 8.33333333333333e-02 1091 853 8.33333333333333e-02 1091 1093 -8.33333333333333e-02 1091 1094 -2.50000000000000e-01 1091 1092 1.66666666666667e-01 1091 988 8.33333333333333e-02 1091 1080 -8.33333333333333e-02 1091 987 8.33333333333333e-02 1091 1082 -2.50000000000000e-01 1091 1081 1.66666666666667e-01 1091 1154 -7.50000000000000e-01 1091 1153 1.66666666666667e-01 1091 1089 -3.33333333333333e-01 1091 1152 1.66666666666667e-01 1091 985 -8.33333333333333e-02 1091 1090 -3.33333333333333e-01 1091 840 1.66666666666667e-01 1091 838 8.33333333333333e-02 1091 997 -8.33333333333333e-02 1091 837 -1.66666666666667e-01 1091 996 1.66666666666667e-01 1091 842 -7.50000000000000e-01 1091 715 -1.66666666666667e-01 1091 841 1.66666666666667e-01 1091 714 8.33333333333333e-02 1091 984 -8.33333333333333e-02 1091 1156 8.33333333333333e-02 1091 851 -2.50000000000000e-01 1091 998 -2.50000000000000e-01 1091 850 1.66666666666667e-01 1091 751 -1.66666666666667e-01 1091 849 -8.33333333333333e-02 1091 750 8.33333333333333e-02 1092 1092 2.50000000000000e+00 1092 1109 1.66666666666667e-01 1092 1079 8.33333333333333e-02 1092 1108 1.66666666666667e-01 1092 1107 -7.50000000000000e-01 1092 1087 -8.33333333333333e-02 1092 1223 8.33333333333333e-02 1092 1088 1.66666666666667e-01 1092 1086 -2.50000000000000e-01 1092 1222 -1.66666666666667e-01 1092 1094 -3.33333333333333e-01 1092 755 -8.33333333333333e-02 1092 716 -8.33333333333333e-02 1092 1171 8.33333333333333e-02 1092 1156 -8.33333333333333e-02 1092 1085 -8.33333333333333e-02 1092 1082 8.33333333333333e-02 1092 1172 -1.66666666666667e-01 1092 1157 1.66666666666667e-01 1092 1155 -2.50000000000000e-01 1092 1084 1.66666666666667e-01 1092 1081 -1.66666666666667e-01 1092 1083 -2.50000000000000e-01 1092 854 -8.33333333333333e-02 1092 1229 8.33333333333333e-02 1092 853 1.66666666666667e-01 1092 1093 -3.33333333333333e-01 1092 1090 1.66666666666667e-01 1092 1228 8.33333333333333e-02 1092 754 -8.33333333333333e-02 1092 852 -2.50000000000000e-01 1092 1091 1.66666666666667e-01 1092 842 -1.66666666666667e-01 1092 841 8.33333333333333e-02 1092 715 -8.33333333333333e-02 1092 1089 -7.50000000000000e-01 1092 1078 8.33333333333333e-02 1093 1093 2.50000000000000e+00 1093 1109 -8.33333333333333e-02 1093 1079 -1.66666666666667e-01 1093 1108 -2.50000000000000e-01 1093 1107 1.66666666666667e-01 1093 1086 -8.33333333333333e-02 1093 1088 1.66666666666667e-01 1093 1087 -2.50000000000000e-01 1093 1223 8.33333333333333e-02 1093 1221 -1.66666666666667e-01 1093 1170 8.33333333333333e-02 1093 1155 -8.33333333333333e-02 1093 1085 1.66666666666667e-01 1093 1094 -3.33333333333333e-01 1093 1157 1.66666666666667e-01 1093 755 -8.33333333333333e-02 1093 1172 8.33333333333333e-02 1093 1156 -2.50000000000000e-01 1093 716 -8.33333333333333e-02 1093 1082 8.33333333333333e-02 1093 1084 -7.50000000000000e-01 1093 1083 1.66666666666667e-01 1093 1080 -1.66666666666667e-01 1093 842 8.33333333333333e-02 1093 1091 -8.33333333333333e-02 1093 852 1.66666666666667e-01 1093 1092 -3.33333333333333e-01 1093 1089 1.66666666666667e-01 1093 1229 -1.66666666666667e-01 1093 854 1.66666666666667e-01 1093 853 -7.50000000000000e-01 1093 1227 8.33333333333333e-02 1093 753 -8.33333333333333e-02 1093 1090 -2.50000000000000e-01 1093 1077 8.33333333333333e-02 1093 840 8.33333333333333e-02 1093 714 -8.33333333333333e-02 1094 1094 2.50000000000000e+00 1094 1107 1.66666666666667e-01 1094 1078 -1.66666666666667e-01 1094 1077 8.33333333333333e-02 1094 1109 -2.50000000000000e-01 1094 1087 1.66666666666667e-01 1094 1221 8.33333333333333e-02 1094 1088 -7.50000000000000e-01 1094 1086 1.66666666666667e-01 1094 1222 8.33333333333333e-02 1094 1092 -3.33333333333333e-01 1094 753 -8.33333333333333e-02 1094 714 -8.33333333333333e-02 1094 1084 1.66666666666667e-01 1094 1093 -3.33333333333333e-01 1094 1156 1.66666666666667e-01 1094 1083 -8.33333333333333e-02 1094 1080 8.33333333333333e-02 1094 1157 -7.50000000000000e-01 1094 754 -8.33333333333333e-02 1094 1171 8.33333333333333e-02 1094 1170 -1.66666666666667e-01 1094 1155 1.66666666666667e-01 1094 1085 -2.50000000000000e-01 1094 715 -8.33333333333333e-02 1094 1081 8.33333333333333e-02 1094 852 -8.33333333333333e-02 1094 1227 8.33333333333333e-02 1094 841 8.33333333333333e-02 1094 1090 -8.33333333333333e-02 1094 854 -2.50000000000000e-01 1094 1228 -1.66666666666667e-01 1094 853 1.66666666666667e-01 1094 1091 -2.50000000000000e-01 1094 1108 -8.33333333333333e-02 1094 1089 1.66666666666667e-01 1094 840 -1.66666666666667e-01 1095 1095 2.50000000000000e+00 1095 1109 -8.33333333333333e-02 1095 1108 1.66666666666667e-01 1095 1107 -2.50000000000000e-01 1095 1172 8.33333333333333e-02 1095 1078 8.33333333333333e-02 1095 1079 -1.66666666666667e-01 1095 1085 1.66666666666667e-01 1095 1084 1.66666666666667e-01 1095 1083 -7.50000000000000e-01 1095 1096 -3.33333333333333e-01 1095 718 -8.33333333333333e-02 1095 730 -8.33333333333333e-02 1095 1174 -8.33333333333333e-02 1095 1168 8.33333333333333e-02 1095 1175 -8.33333333333333e-02 1095 1112 8.33333333333333e-02 1095 719 1.66666666666667e-01 1095 1097 -3.33333333333333e-01 1095 1103 1.66666666666667e-01 1095 1111 -1.66666666666667e-01 1095 1102 1.66666666666667e-01 1095 1101 -7.50000000000000e-01 1095 731 1.66666666666667e-01 1095 1169 -1.66666666666667e-01 1095 805 -8.33333333333333e-02 1095 1060 8.33333333333333e-02 1095 1061 8.33333333333333e-02 1095 806 -8.33333333333333e-02 1095 717 -2.50000000000000e-01 1095 1067 -8.33333333333333e-02 1095 818 8.33333333333333e-02 1095 1066 1.66666666666667e-01 1095 817 -1.66666666666667e-01 1095 1065 -2.50000000000000e-01 1095 1171 8.33333333333333e-02 1095 729 -2.50000000000000e-01 1096 1096 2.50000000000000e+00 1096 1109 1.66666666666667e-01 1096 1108 -7.50000000000000e-01 1096 1107 1.66666666666667e-01 1096 1172 -1.66666666666667e-01 1096 1077 8.33333333333333e-02 1096 1079 8.33333333333333e-02 1096 1085 -8.33333333333333e-02 1096 1084 -2.50000000000000e-01 1096 1083 1.66666666666667e-01 1096 1095 -3.33333333333333e-01 1096 717 -8.33333333333333e-02 1096 729 -8.33333333333333e-02 1096 1173 -8.33333333333333e-02 1096 1167 8.33333333333333e-02 1096 1112 8.33333333333333e-02 1096 1103 -8.33333333333333e-02 1096 1102 -2.50000000000000e-01 1096 1110 -1.66666666666667e-01 1096 1101 1.66666666666667e-01 1096 1175 -8.33333333333333e-02 1096 1169 8.33333333333333e-02 1096 804 -8.33333333333333e-02 1096 1059 8.33333333333333e-02 1096 806 -8.33333333333333e-02 1096 818 8.33333333333333e-02 1096 1061 -1.66666666666667e-01 1096 719 1.66666666666667e-01 1096 718 -2.50000000000000e-01 1096 1067 1.66666666666667e-01 1096 1097 -3.33333333333333e-01 1096 731 1.66666666666667e-01 1096 1066 -7.50000000000000e-01 1096 1170 8.33333333333333e-02 1096 730 -2.50000000000000e-01 1096 1065 1.66666666666667e-01 1096 816 -1.66666666666667e-01 1097 1097 2.50000000000000e+00 1097 1108 1.66666666666667e-01 1097 1107 -8.33333333333333e-02 1097 1171 -1.66666666666667e-01 1097 1170 8.33333333333333e-02 1097 1078 8.33333333333333e-02 1097 1077 -1.66666666666667e-01 1097 1085 -2.50000000000000e-01 1097 1084 -8.33333333333333e-02 1097 1083 1.66666666666667e-01 1097 1173 -8.33333333333333e-02 1097 1110 8.33333333333333e-02 1097 1103 -2.50000000000000e-01 1097 1111 8.33333333333333e-02 1097 1102 -8.33333333333333e-02 1097 717 1.66666666666667e-01 1097 1095 -3.33333333333333e-01 1097 1101 1.66666666666667e-01 1097 1174 -8.33333333333333e-02 1097 1168 8.33333333333333e-02 1097 729 1.66666666666667e-01 1097 1167 -1.66666666666667e-01 1097 805 -8.33333333333333e-02 1097 817 8.33333333333333e-02 1097 719 -7.50000000000000e-01 1097 1060 -1.66666666666667e-01 1097 718 1.66666666666667e-01 1097 1059 8.33333333333333e-02 1097 804 -8.33333333333333e-02 1097 1067 -2.50000000000000e-01 1097 1109 -2.50000000000000e-01 1097 731 -7.50000000000000e-01 1097 1066 1.66666666666667e-01 1097 1096 -3.33333333333333e-01 1097 730 1.66666666666667e-01 1097 1065 -8.33333333333333e-02 1097 816 8.33333333333333e-02 1098 1098 1.25000000000000e+00 1098 1061 4.16666666666667e-02 1098 1060 -8.33333333333333e-02 1098 1069 8.33333333333333e-02 1098 1068 -1.25000000000000e-01 1098 719 8.33333333333333e-02 1098 1100 -1.66666666666667e-01 1098 1103 1.66666666666667e-01 1098 1102 -8.33333333333333e-02 1098 1101 -2.50000000000000e-01 1098 734 8.33333333333333e-02 1098 1187 -1.66666666666667e-01 1098 1186 8.33333333333333e-02 1098 1111 8.33333333333333e-02 1098 1189 -8.33333333333333e-02 1098 860 4.16666666666667e-02 1098 1190 -8.33333333333333e-02 1098 733 8.33333333333333e-02 1098 859 -8.33333333333333e-02 1098 732 -3.75000000000000e-01 1098 857 -4.16666666666667e-02 1098 1112 8.33333333333333e-02 1098 1099 -1.66666666666667e-01 1098 856 8.33333333333333e-02 1098 718 8.33333333333333e-02 1098 1070 -4.16666666666667e-02 1098 855 -1.25000000000000e-01 1098 717 -3.75000000000000e-01 1099 1099 1.25000000000000e+00 1099 1100 -1.66666666666667e-01 1099 719 -4.16666666666667e-02 1099 1061 4.16666666666667e-02 1099 1059 -8.33333333333333e-02 1099 734 -4.16666666666667e-02 1099 1069 -3.75000000000000e-01 1099 1068 8.33333333333333e-02 1099 1187 8.33333333333333e-02 1099 1103 1.66666666666667e-01 1099 1102 -2.50000000000000e-01 1099 1101 -8.33333333333333e-02 1099 1185 8.33333333333333e-02 1099 1110 8.33333333333333e-02 1099 1188 -8.33333333333333e-02 1099 860 4.16666666666667e-02 1099 1190 -8.33333333333333e-02 1099 733 -1.25000000000000e-01 1099 732 8.33333333333333e-02 1099 858 -8.33333333333333e-02 1099 857 8.33333333333333e-02 1099 1112 -1.66666666666667e-01 1099 1070 8.33333333333333e-02 1099 856 -3.75000000000000e-01 1099 718 -1.25000000000000e-01 1099 1098 -1.66666666666667e-01 1099 855 8.33333333333333e-02 1099 717 8.33333333333333e-02 1100 1100 1.25000000000000e+00 1100 1099 -1.66666666666667e-01 1100 1068 -4.16666666666667e-02 1100 1059 4.16666666666667e-02 1100 718 -4.16666666666667e-02 1100 1060 4.16666666666667e-02 1100 1070 -1.25000000000000e-01 1100 733 -4.16666666666667e-02 1100 1186 8.33333333333333e-02 1100 1103 -7.50000000000000e-01 1100 1102 1.66666666666667e-01 1100 717 8.33333333333333e-02 1100 1098 -1.66666666666667e-01 1100 1101 1.66666666666667e-01 1100 732 8.33333333333333e-02 1100 1185 -1.66666666666667e-01 1100 859 4.16666666666667e-02 1100 1189 -8.33333333333333e-02 1100 734 -1.25000000000000e-01 1100 858 4.16666666666667e-02 1100 1188 -8.33333333333333e-02 1100 1069 8.33333333333333e-02 1100 857 -1.25000000000000e-01 1100 719 -1.25000000000000e-01 1100 856 8.33333333333333e-02 1100 1111 -1.66666666666667e-01 1100 855 -4.16666666666667e-02 1100 1110 8.33333333333333e-02 1101 1101 2.50000000000000e+00 1101 1066 -1.66666666666667e-01 1101 1061 -8.33333333333333e-02 1101 1069 8.33333333333333e-02 1101 1060 -8.33333333333333e-02 1101 1070 8.33333333333333e-02 1101 1076 -8.33333333333333e-02 1101 1075 1.66666666666667e-01 1101 1074 -2.50000000000000e-01 1101 1190 8.33333333333333e-02 1101 1189 -1.66666666666667e-01 1101 1186 1.66666666666667e-01 1101 1100 1.66666666666667e-01 1101 718 8.33333333333333e-02 1101 1099 -8.33333333333333e-02 1101 1098 -2.50000000000000e-01 1101 1187 1.66666666666667e-01 1101 739 8.33333333333333e-02 1101 1185 -7.50000000000000e-01 1101 1103 -3.33333333333333e-01 1101 1168 -8.33333333333333e-02 1101 1112 -8.33333333333333e-02 1101 1174 8.33333333333333e-02 1101 1198 -8.33333333333333e-02 1101 1175 8.33333333333333e-02 1101 1199 -8.33333333333333e-02 1101 719 -1.66666666666667e-01 1101 1097 1.66666666666667e-01 1101 1111 1.66666666666667e-01 1101 1096 1.66666666666667e-01 1101 1102 -3.33333333333333e-01 1101 1110 -2.50000000000000e-01 1101 1095 -7.50000000000000e-01 1101 1169 1.66666666666667e-01 1101 740 -1.66666666666667e-01 1101 1067 8.33333333333333e-02 1101 1167 -2.50000000000000e-01 1102 1102 2.50000000000000e+00 1102 1065 -1.66666666666667e-01 1102 1068 8.33333333333333e-02 1102 1059 -8.33333333333333e-02 1102 1070 -1.66666666666667e-01 1102 1076 1.66666666666667e-01 1102 1061 -8.33333333333333e-02 1102 1075 -7.50000000000000e-01 1102 1074 1.66666666666667e-01 1102 1190 8.33333333333333e-02 1102 1187 -8.33333333333333e-02 1102 1188 -1.66666666666667e-01 1102 1185 1.66666666666667e-01 1102 1100 1.66666666666667e-01 1102 1103 -3.33333333333333e-01 1102 1099 -2.50000000000000e-01 1102 717 8.33333333333333e-02 1102 1098 -8.33333333333333e-02 1102 1186 -2.50000000000000e-01 1102 738 8.33333333333333e-02 1102 1167 -8.33333333333333e-02 1102 1112 1.66666666666667e-01 1102 1173 8.33333333333333e-02 1102 1197 -8.33333333333333e-02 1102 1175 -1.66666666666667e-01 1102 1169 1.66666666666667e-01 1102 719 8.33333333333333e-02 1102 1097 -8.33333333333333e-02 1102 1111 -7.50000000000000e-01 1102 1096 -2.50000000000000e-01 1102 1110 1.66666666666667e-01 1102 1095 1.66666666666667e-01 1102 1101 -3.33333333333333e-01 1102 1199 -8.33333333333333e-02 1102 740 8.33333333333333e-02 1102 1067 8.33333333333333e-02 1102 1168 -2.50000000000000e-01 1103 1103 2.50000000000000e+00 1103 1065 8.33333333333333e-02 1103 1059 -8.33333333333333e-02 1103 1069 -1.66666666666667e-01 1103 1075 1.66666666666667e-01 1103 1068 8.33333333333333e-02 1103 1074 -8.33333333333333e-02 1103 1060 -8.33333333333333e-02 1103 1076 -2.50000000000000e-01 1103 1189 8.33333333333333e-02 1103 1186 -8.33333333333333e-02 1103 1188 8.33333333333333e-02 1103 1100 -7.50000000000000e-01 1103 1099 1.66666666666667e-01 1103 1102 -3.33333333333333e-01 1103 1098 1.66666666666667e-01 1103 1187 -2.50000000000000e-01 1103 1185 1.66666666666667e-01 1103 1101 -3.33333333333333e-01 1103 1110 -8.33333333333333e-02 1103 1111 1.66666666666667e-01 1103 1174 -1.66666666666667e-01 1103 1168 1.66666666666667e-01 1103 1173 8.33333333333333e-02 1103 1197 -8.33333333333333e-02 1103 1112 -2.50000000000000e-01 1103 1097 -2.50000000000000e-01 1103 718 8.33333333333333e-02 1103 1096 -8.33333333333333e-02 1103 717 -1.66666666666667e-01 1103 1095 1.66666666666667e-01 1103 1066 8.33333333333333e-02 1103 1169 -7.50000000000000e-01 1103 1198 -8.33333333333333e-02 1103 739 8.33333333333333e-02 1103 1167 1.66666666666667e-01 1103 738 -1.66666666666667e-01 1104 1104 1.25000000000000e+00 1104 1088 8.33333333333333e-02 1104 1079 4.16666666666667e-02 1104 719 -4.16666666666667e-02 1104 1078 -8.33333333333333e-02 1104 749 -4.16666666666667e-02 1104 1087 8.33333333333333e-02 1104 1086 -3.75000000000000e-01 1104 1223 8.33333333333333e-02 1104 1222 8.33333333333333e-02 1104 1109 1.66666666666667e-01 1104 1108 -8.33333333333333e-02 1104 1107 -2.50000000000000e-01 1104 1111 8.33333333333333e-02 1104 1225 -8.33333333333333e-02 1104 863 4.16666666666667e-02 1104 1226 -8.33333333333333e-02 1104 862 -8.33333333333333e-02 1104 748 8.33333333333333e-02 1104 747 -1.25000000000000e-01 1104 857 8.33333333333333e-02 1104 1112 -1.66666666666667e-01 1104 856 8.33333333333333e-02 1104 1105 -1.66666666666667e-01 1104 718 8.33333333333333e-02 1104 855 -3.75000000000000e-01 1104 1106 -1.66666666666667e-01 1104 717 -1.25000000000000e-01 1105 1105 1.25000000000000e+00 1105 1079 4.16666666666667e-02 1105 1077 -8.33333333333333e-02 1105 1087 -1.25000000000000e-01 1105 1086 8.33333333333333e-02 1105 749 8.33333333333333e-02 1105 1223 -1.66666666666667e-01 1105 1221 8.33333333333333e-02 1105 1106 -1.66666666666667e-01 1105 719 8.33333333333333e-02 1105 1109 1.66666666666667e-01 1105 1108 -2.50000000000000e-01 1105 1107 -8.33333333333333e-02 1105 1110 8.33333333333333e-02 1105 1224 -8.33333333333333e-02 1105 863 4.16666666666667e-02 1105 1226 -8.33333333333333e-02 1105 748 -3.75000000000000e-01 1105 861 -8.33333333333333e-02 1105 747 8.33333333333333e-02 1105 857 -4.16666666666667e-02 1105 1112 8.33333333333333e-02 1105 856 -1.25000000000000e-01 1105 1088 -4.16666666666667e-02 1105 718 -3.75000000000000e-01 1105 855 8.33333333333333e-02 1105 1104 -1.66666666666667e-01 1105 717 8.33333333333333e-02 1106 1106 1.25000000000000e+00 1106 1078 4.16666666666667e-02 1106 1104 -1.66666666666667e-01 1106 1086 8.33333333333333e-02 1106 1077 4.16666666666667e-02 1106 717 -4.16666666666667e-02 1106 1088 -1.25000000000000e-01 1106 747 -4.16666666666667e-02 1106 1221 8.33333333333333e-02 1106 748 8.33333333333333e-02 1106 1222 -1.66666666666667e-01 1106 1109 -7.50000000000000e-01 1106 1105 -1.66666666666667e-01 1106 718 8.33333333333333e-02 1106 1108 1.66666666666667e-01 1106 1107 1.66666666666667e-01 1106 861 4.16666666666667e-02 1106 1224 -8.33333333333333e-02 1106 749 -1.25000000000000e-01 1106 862 4.16666666666667e-02 1106 1225 -8.33333333333333e-02 1106 857 -1.25000000000000e-01 1106 1087 -4.16666666666667e-02 1106 719 -1.25000000000000e-01 1106 856 -4.16666666666667e-02 1106 1111 8.33333333333333e-02 1106 855 8.33333333333333e-02 1106 1110 -1.66666666666667e-01 1107 1107 2.50000000000000e+00 1107 1084 -1.66666666666667e-01 1107 1078 -8.33333333333333e-02 1107 1087 8.33333333333333e-02 1107 1094 1.66666666666667e-01 1107 1088 -1.66666666666667e-01 1107 1079 -8.33333333333333e-02 1107 1093 1.66666666666667e-01 1107 1092 -7.50000000000000e-01 1107 1226 8.33333333333333e-02 1107 1223 -8.33333333333333e-02 1107 1222 1.66666666666667e-01 1107 1225 -1.66666666666667e-01 1107 1106 1.66666666666667e-01 1107 1109 -3.33333333333333e-01 1107 1105 -8.33333333333333e-02 1107 718 8.33333333333333e-02 1107 1104 -2.50000000000000e-01 1107 754 8.33333333333333e-02 1107 1221 -2.50000000000000e-01 1107 1171 -8.33333333333333e-02 1107 1112 1.66666666666667e-01 1107 1174 8.33333333333333e-02 1107 1234 -8.33333333333333e-02 1107 1175 -1.66666666666667e-01 1107 1172 1.66666666666667e-01 1107 719 8.33333333333333e-02 1107 1097 -8.33333333333333e-02 1107 1111 1.66666666666667e-01 1107 1096 1.66666666666667e-01 1107 1108 -3.33333333333333e-01 1107 1110 -7.50000000000000e-01 1107 1095 -2.50000000000000e-01 1107 1235 -8.33333333333333e-02 1107 755 8.33333333333333e-02 1107 1085 8.33333333333333e-02 1107 1170 -2.50000000000000e-01 1108 1108 2.50000000000000e+00 1108 1083 -1.66666666666667e-01 1108 1079 -8.33333333333333e-02 1108 1077 -8.33333333333333e-02 1108 1086 8.33333333333333e-02 1108 1094 -8.33333333333333e-02 1108 1088 8.33333333333333e-02 1108 1093 -2.50000000000000e-01 1108 1092 1.66666666666667e-01 1108 1226 8.33333333333333e-02 1108 1221 1.66666666666667e-01 1108 1224 -1.66666666666667e-01 1108 1106 1.66666666666667e-01 1108 1105 -2.50000000000000e-01 1108 1104 -8.33333333333333e-02 1108 717 8.33333333333333e-02 1108 1223 1.66666666666667e-01 1108 1222 -7.50000000000000e-01 1108 753 8.33333333333333e-02 1108 1109 -3.33333333333333e-01 1108 1170 -8.33333333333333e-02 1108 1112 -8.33333333333333e-02 1108 1173 8.33333333333333e-02 1108 1233 -8.33333333333333e-02 1108 1235 -8.33333333333333e-02 1108 1175 8.33333333333333e-02 1108 719 -1.66666666666667e-01 1108 1097 1.66666666666667e-01 1108 1111 -2.50000000000000e-01 1108 1096 -7.50000000000000e-01 1108 1110 1.66666666666667e-01 1108 1095 1.66666666666667e-01 1108 1107 -3.33333333333333e-01 1108 1172 1.66666666666667e-01 1108 755 -1.66666666666667e-01 1108 1085 8.33333333333333e-02 1108 1171 -2.50000000000000e-01 1109 1109 2.50000000000000e+00 1109 1084 8.33333333333333e-02 1109 1078 -8.33333333333333e-02 1109 1093 -8.33333333333333e-02 1109 1087 8.33333333333333e-02 1109 1092 1.66666666666667e-01 1109 1086 -1.66666666666667e-01 1109 1077 -8.33333333333333e-02 1109 1094 -2.50000000000000e-01 1109 1224 8.33333333333333e-02 1109 1221 -8.33333333333333e-02 1109 1225 8.33333333333333e-02 1109 1106 -7.50000000000000e-01 1109 1105 1.66666666666667e-01 1109 1104 1.66666666666667e-01 1109 1107 -3.33333333333333e-01 1109 1223 -2.50000000000000e-01 1109 1222 1.66666666666667e-01 1109 1108 -3.33333333333333e-01 1109 1111 -8.33333333333333e-02 1109 1110 1.66666666666667e-01 1109 1234 -8.33333333333333e-02 1109 1174 8.33333333333333e-02 1109 1173 -1.66666666666667e-01 1109 1170 1.66666666666667e-01 1109 1112 -2.50000000000000e-01 1109 1097 -2.50000000000000e-01 1109 718 -1.66666666666667e-01 1109 1096 1.66666666666667e-01 1109 717 8.33333333333333e-02 1109 1095 -8.33333333333333e-02 1109 1083 8.33333333333333e-02 1109 1172 -7.50000000000000e-01 1109 1171 1.66666666666667e-01 1109 754 -1.66666666666667e-01 1109 1233 -8.33333333333333e-02 1109 753 8.33333333333333e-02 1110 1110 2.50000000000000e+00 1110 1234 8.33333333333333e-02 1110 1235 8.33333333333333e-02 1110 1108 1.66666666666667e-01 1110 1107 -7.50000000000000e-01 1110 1105 8.33333333333333e-02 1110 1226 -8.33333333333333e-02 1110 1106 -1.66666666666667e-01 1110 1225 1.66666666666667e-01 1110 1224 -2.50000000000000e-01 1110 1111 -3.33333333333333e-01 1110 718 -8.33333333333333e-02 1110 757 -8.33333333333333e-02 1110 1097 8.33333333333333e-02 1110 1103 -8.33333333333333e-02 1110 1174 -8.33333333333333e-02 1110 1198 8.33333333333333e-02 1110 1096 -1.66666666666667e-01 1110 1102 1.66666666666667e-01 1110 1101 -2.50000000000000e-01 1110 1175 1.66666666666667e-01 1110 1199 -1.66666666666667e-01 1110 1173 -2.50000000000000e-01 1110 856 -8.33333333333333e-02 1110 1099 8.33333333333333e-02 1110 857 1.66666666666667e-01 1110 1112 -3.33333333333333e-01 1110 1190 1.66666666666667e-01 1110 1100 8.33333333333333e-02 1110 719 -8.33333333333333e-02 1110 855 -2.50000000000000e-01 1110 866 8.33333333333333e-02 1110 758 -8.33333333333333e-02 1110 1189 1.66666666666667e-01 1110 865 -1.66666666666667e-01 1110 1188 -7.50000000000000e-01 1110 1109 1.66666666666667e-01 1111 1111 2.50000000000000e+00 1111 1233 8.33333333333333e-02 1111 1235 -1.66666666666667e-01 1111 1108 -2.50000000000000e-01 1111 1107 1.66666666666667e-01 1111 1104 8.33333333333333e-02 1111 1226 1.66666666666667e-01 1111 1106 8.33333333333333e-02 1111 1225 -7.50000000000000e-01 1111 1224 1.66666666666667e-01 1111 1110 -3.33333333333333e-01 1111 717 -8.33333333333333e-02 1111 756 -8.33333333333333e-02 1111 1175 1.66666666666667e-01 1111 1112 -3.33333333333333e-01 1111 1103 1.66666666666667e-01 1111 1173 -8.33333333333333e-02 1111 1197 8.33333333333333e-02 1111 719 -8.33333333333333e-02 1111 1097 8.33333333333333e-02 1111 1102 -7.50000000000000e-01 1111 1095 -1.66666666666667e-01 1111 1101 1.66666666666667e-01 1111 758 -8.33333333333333e-02 1111 1199 8.33333333333333e-02 1111 1174 -2.50000000000000e-01 1111 855 -8.33333333333333e-02 1111 1098 8.33333333333333e-02 1111 866 8.33333333333333e-02 1111 1190 -8.33333333333333e-02 1111 1100 -1.66666666666667e-01 1111 857 1.66666666666667e-01 1111 856 -2.50000000000000e-01 1111 1189 -2.50000000000000e-01 1111 1109 -8.33333333333333e-02 1111 1188 1.66666666666667e-01 1111 864 -1.66666666666667e-01 1112 1112 2.50000000000000e+00 1112 1107 1.66666666666667e-01 1112 1234 -1.66666666666667e-01 1112 1233 8.33333333333333e-02 1112 1109 -2.50000000000000e-01 1112 1225 1.66666666666667e-01 1112 1224 -8.33333333333333e-02 1112 1105 8.33333333333333e-02 1112 1104 -1.66666666666667e-01 1112 1226 -2.50000000000000e-01 1112 1095 8.33333333333333e-02 1112 1101 -8.33333333333333e-02 1112 1174 1.66666666666667e-01 1112 1111 -3.33333333333333e-01 1112 1102 1.66666666666667e-01 1112 1103 -2.50000000000000e-01 1112 718 -8.33333333333333e-02 1112 1096 8.33333333333333e-02 1112 1175 -7.50000000000000e-01 1112 757 -8.33333333333333e-02 1112 1198 8.33333333333333e-02 1112 1173 1.66666666666667e-01 1112 1197 -1.66666666666667e-01 1112 865 8.33333333333333e-02 1112 1189 -8.33333333333333e-02 1112 855 1.66666666666667e-01 1112 1110 -3.33333333333333e-01 1112 1188 1.66666666666667e-01 1112 857 -7.50000000000000e-01 1112 1099 -1.66666666666667e-01 1112 856 1.66666666666667e-01 1112 1098 8.33333333333333e-02 1112 717 -8.33333333333333e-02 1112 1190 -2.50000000000000e-01 1112 1108 -8.33333333333333e-02 1112 864 8.33333333333333e-02 1112 756 -8.33333333333333e-02 1113 1113 1.25000000000000e+00 1113 1145 -8.33333333333333e-02 1113 1142 -8.33333333333333e-02 1113 1141 4.16666666666667e-02 1113 1144 -8.33333333333333e-02 1113 1124 8.33333333333333e-02 1113 1123 -4.16666666666667e-02 1113 1129 8.33333333333333e-02 1113 1122 -1.25000000000000e-01 1113 811 -4.16666666666667e-02 1113 808 4.16666666666667e-02 1113 1133 8.33333333333333e-02 1113 1121 -8.33333333333333e-02 1113 722 8.33333333333333e-02 1113 809 -8.33333333333333e-02 1113 721 8.33333333333333e-02 1113 1114 -1.66666666666667e-01 1113 1120 1.66666666666667e-01 1113 720 -3.75000000000000e-01 1113 1119 -2.50000000000000e-01 1113 1115 -1.66666666666667e-01 1113 725 8.33333333333333e-02 1113 812 8.33333333333333e-02 1113 724 8.33333333333333e-02 1113 1132 -1.66666666666667e-01 1113 1130 8.33333333333333e-02 1113 723 -3.75000000000000e-01 1113 810 -1.25000000000000e-01 1114 1114 1.25000000000000e+00 1114 1145 -8.33333333333333e-02 1114 1140 4.16666666666667e-02 1114 1143 -8.33333333333333e-02 1114 1124 8.33333333333333e-02 1114 1130 -1.66666666666667e-01 1114 1123 -1.25000000000000e-01 1114 1122 -4.16666666666667e-02 1114 1128 8.33333333333333e-02 1114 810 -4.16666666666667e-02 1114 807 4.16666666666667e-02 1114 812 8.33333333333333e-02 1114 1115 -1.66666666666667e-01 1114 1121 1.66666666666667e-01 1114 722 -4.16666666666667e-02 1114 809 4.16666666666667e-02 1114 721 -1.25000000000000e-01 1114 1120 -7.50000000000000e-01 1114 720 8.33333333333333e-02 1114 1113 -1.66666666666667e-01 1114 1119 1.66666666666667e-01 1114 725 -4.16666666666667e-02 1114 1133 8.33333333333333e-02 1114 1142 4.16666666666667e-02 1114 724 -1.25000000000000e-01 1114 811 -1.25000000000000e-01 1114 723 8.33333333333333e-02 1114 1131 -1.66666666666667e-01 1115 1115 1.25000000000000e+00 1115 1144 -8.33333333333333e-02 1115 1128 8.33333333333333e-02 1115 1143 -8.33333333333333e-02 1115 1140 -8.33333333333333e-02 1115 1124 -3.75000000000000e-01 1115 1123 8.33333333333333e-02 1115 1129 -1.66666666666667e-01 1115 1122 8.33333333333333e-02 1115 811 8.33333333333333e-02 1115 1114 -1.66666666666667e-01 1115 1120 1.66666666666667e-01 1115 1131 8.33333333333333e-02 1115 1119 -8.33333333333333e-02 1115 722 -1.25000000000000e-01 1115 1121 -2.50000000000000e-01 1115 721 -4.16666666666667e-02 1115 808 4.16666666666667e-02 1115 720 8.33333333333333e-02 1115 807 -8.33333333333333e-02 1115 1141 4.16666666666667e-02 1115 725 -1.25000000000000e-01 1115 812 -3.75000000000000e-01 1115 724 -4.16666666666667e-02 1115 1132 8.33333333333333e-02 1115 1113 -1.66666666666667e-01 1115 723 8.33333333333333e-02 1115 810 8.33333333333333e-02 1116 1116 2.50000000000000e+00 1116 1130 -1.66666666666667e-01 1116 1129 8.33333333333333e-02 1116 1162 -8.33333333333333e-02 1116 1121 1.66666666666667e-01 1116 1151 8.33333333333333e-02 1116 1150 -1.66666666666667e-01 1116 1120 1.66666666666667e-01 1116 1119 -7.50000000000000e-01 1116 1118 -3.33333333333333e-01 1116 1127 1.66666666666667e-01 1116 1126 -8.33333333333333e-02 1116 1159 8.33333333333333e-02 1116 1160 8.33333333333333e-02 1116 728 -8.33333333333333e-02 1116 722 -8.33333333333333e-02 1116 1125 -2.50000000000000e-01 1116 1016 8.33333333333333e-02 1116 721 1.66666666666667e-01 1116 1015 -1.66666666666667e-01 1116 1019 1.66666666666667e-01 1116 1117 -3.33333333333333e-01 1116 727 1.66666666666667e-01 1116 1018 1.66666666666667e-01 1116 1017 -7.50000000000000e-01 1116 809 8.33333333333333e-02 1116 965 -8.33333333333333e-02 1116 808 8.33333333333333e-02 1116 964 -8.33333333333333e-02 1116 720 -2.50000000000000e-01 1116 815 1.66666666666667e-01 1116 968 -1.66666666666667e-01 1116 814 -8.33333333333333e-02 1116 967 8.33333333333333e-02 1116 813 -2.50000000000000e-01 1116 1163 -8.33333333333333e-02 1116 726 -2.50000000000000e-01 1117 1117 2.50000000000000e+00 1117 1163 -8.33333333333333e-02 1117 1128 8.33333333333333e-02 1117 1161 -8.33333333333333e-02 1117 1151 8.33333333333333e-02 1117 1121 -8.33333333333333e-02 1117 1149 -1.66666666666667e-01 1117 1120 -2.50000000000000e-01 1117 1119 1.66666666666667e-01 1117 1125 -8.33333333333333e-02 1117 1158 8.33333333333333e-02 1117 1160 -1.66666666666667e-01 1117 1127 1.66666666666667e-01 1117 1126 -2.50000000000000e-01 1117 1016 8.33333333333333e-02 1117 720 1.66666666666667e-01 1117 1014 -1.66666666666667e-01 1117 1019 -8.33333333333333e-02 1117 1018 -2.50000000000000e-01 1117 1116 -3.33333333333333e-01 1117 726 1.66666666666667e-01 1117 1017 1.66666666666667e-01 1117 968 8.33333333333333e-02 1117 965 -8.33333333333333e-02 1117 809 -1.66666666666667e-01 1117 722 1.66666666666667e-01 1117 721 -7.50000000000000e-01 1117 807 8.33333333333333e-02 1117 963 -8.33333333333333e-02 1117 815 1.66666666666667e-01 1117 1118 -3.33333333333333e-01 1117 728 1.66666666666667e-01 1117 814 -2.50000000000000e-01 1117 1130 8.33333333333333e-02 1117 727 -7.50000000000000e-01 1117 813 -8.33333333333333e-02 1117 966 8.33333333333333e-02 1118 1118 2.50000000000000e+00 1118 1129 8.33333333333333e-02 1118 1162 -8.33333333333333e-02 1118 1128 -1.66666666666667e-01 1118 1150 8.33333333333333e-02 1118 1120 -8.33333333333333e-02 1118 1119 1.66666666666667e-01 1118 1149 8.33333333333333e-02 1118 1121 -2.50000000000000e-01 1118 1116 -3.33333333333333e-01 1118 1125 1.66666666666667e-01 1118 1159 -1.66666666666667e-01 1118 1158 8.33333333333333e-02 1118 726 -8.33333333333333e-02 1118 1127 -7.50000000000000e-01 1118 1126 1.66666666666667e-01 1118 720 -8.33333333333333e-02 1118 1014 8.33333333333333e-02 1118 1015 8.33333333333333e-02 1118 1019 -2.50000000000000e-01 1118 1018 -8.33333333333333e-02 1118 1017 1.66666666666667e-01 1118 967 8.33333333333333e-02 1118 964 -8.33333333333333e-02 1118 807 8.33333333333333e-02 1118 963 -8.33333333333333e-02 1118 722 -2.50000000000000e-01 1118 808 -1.66666666666667e-01 1118 721 1.66666666666667e-01 1118 815 -7.50000000000000e-01 1118 1161 -8.33333333333333e-02 1118 728 -2.50000000000000e-01 1118 814 1.66666666666667e-01 1118 1117 -3.33333333333333e-01 1118 727 1.66666666666667e-01 1118 813 1.66666666666667e-01 1118 966 -1.66666666666667e-01 1119 1119 2.50000000000000e+00 1119 1163 8.33333333333333e-02 1119 1118 1.66666666666667e-01 1119 815 -1.66666666666667e-01 1119 814 8.33333333333333e-02 1119 1117 1.66666666666667e-01 1119 1116 -7.50000000000000e-01 1119 1151 -8.33333333333333e-02 1119 1150 1.66666666666667e-01 1119 1149 -2.50000000000000e-01 1119 1129 -8.33333333333333e-02 1119 1177 -8.33333333333333e-02 1119 1144 8.33333333333333e-02 1119 1130 1.66666666666667e-01 1119 1145 -1.66666666666667e-01 1119 731 8.33333333333333e-02 1119 1178 -8.33333333333333e-02 1119 722 8.33333333333333e-02 1119 1128 -2.50000000000000e-01 1119 809 -8.33333333333333e-02 1119 808 -8.33333333333333e-02 1119 812 8.33333333333333e-02 1119 1115 -8.33333333333333e-02 1119 1120 -3.33333333333333e-01 1119 811 8.33333333333333e-02 1119 817 -8.33333333333333e-02 1119 721 -1.66666666666667e-01 1119 1114 1.66666666666667e-01 1119 1113 -2.50000000000000e-01 1119 1121 -3.33333333333333e-01 1119 1133 1.66666666666667e-01 1119 818 1.66666666666667e-01 1119 1132 1.66666666666667e-01 1119 730 -1.66666666666667e-01 1119 1162 8.33333333333333e-02 1119 1131 -7.50000000000000e-01 1119 816 -2.50000000000000e-01 1120 1120 2.50000000000000e+00 1120 1163 -1.66666666666667e-01 1120 1118 -8.33333333333333e-02 1120 815 8.33333333333333e-02 1120 813 8.33333333333333e-02 1120 1117 -2.50000000000000e-01 1120 1116 1.66666666666667e-01 1120 1151 1.66666666666667e-01 1120 1150 -7.50000000000000e-01 1120 1149 1.66666666666667e-01 1120 1128 -8.33333333333333e-02 1120 1176 -8.33333333333333e-02 1120 1143 8.33333333333333e-02 1120 1178 -8.33333333333333e-02 1120 1145 8.33333333333333e-02 1120 1121 -3.33333333333333e-01 1120 1130 1.66666666666667e-01 1120 1129 -2.50000000000000e-01 1120 807 -8.33333333333333e-02 1120 1115 1.66666666666667e-01 1120 1119 -3.33333333333333e-01 1120 812 -1.66666666666667e-01 1120 818 1.66666666666667e-01 1120 810 8.33333333333333e-02 1120 816 -8.33333333333333e-02 1120 722 8.33333333333333e-02 1120 809 -8.33333333333333e-02 1120 1114 -7.50000000000000e-01 1120 720 -1.66666666666667e-01 1120 1113 1.66666666666667e-01 1120 1133 -8.33333333333333e-02 1120 731 8.33333333333333e-02 1120 1161 8.33333333333333e-02 1120 1132 -2.50000000000000e-01 1120 817 -2.50000000000000e-01 1120 1131 1.66666666666667e-01 1120 729 -1.66666666666667e-01 1121 1121 2.50000000000000e+00 1121 1161 8.33333333333333e-02 1121 1117 -8.33333333333333e-02 1121 814 8.33333333333333e-02 1121 1116 1.66666666666667e-01 1121 813 -1.66666666666667e-01 1121 1118 -2.50000000000000e-01 1121 1151 -2.50000000000000e-01 1121 1150 1.66666666666667e-01 1121 1149 -8.33333333333333e-02 1121 1177 -8.33333333333333e-02 1121 1144 8.33333333333333e-02 1121 1128 1.66666666666667e-01 1121 1143 -1.66666666666667e-01 1121 729 8.33333333333333e-02 1121 1176 -8.33333333333333e-02 1121 1130 -7.50000000000000e-01 1121 1120 -3.33333333333333e-01 1121 1129 1.66666666666667e-01 1121 720 8.33333333333333e-02 1121 807 -8.33333333333333e-02 1121 1114 1.66666666666667e-01 1121 810 8.33333333333333e-02 1121 1113 -8.33333333333333e-02 1121 811 -1.66666666666667e-01 1121 817 1.66666666666667e-01 1121 1115 -2.50000000000000e-01 1121 721 8.33333333333333e-02 1121 808 -8.33333333333333e-02 1121 1162 -1.66666666666667e-01 1121 1133 -2.50000000000000e-01 1121 818 -7.50000000000000e-01 1121 1132 -8.33333333333333e-02 1121 730 8.33333333333333e-02 1121 1119 -3.33333333333333e-01 1121 1131 1.66666666666667e-01 1121 816 1.66666666666667e-01 1122 1122 1.25000000000000e+00 1122 1145 8.33333333333333e-02 1122 1144 -1.66666666666667e-01 1122 1115 8.33333333333333e-02 1122 1114 -4.16666666666667e-02 1122 721 4.16666666666667e-02 1122 1113 -1.25000000000000e-01 1122 1142 8.33333333333333e-02 1122 766 4.16666666666667e-02 1122 1140 -3.75000000000000e-01 1122 1130 -8.33333333333333e-02 1122 1124 -1.66666666666667e-01 1122 883 -4.16666666666667e-02 1122 1259 -8.33333333333333e-02 1122 890 8.33333333333333e-02 1122 1258 -8.33333333333333e-02 1122 889 8.33333333333333e-02 1122 884 8.33333333333333e-02 1122 767 -8.33333333333333e-02 1122 882 -1.25000000000000e-01 1122 878 8.33333333333333e-02 1122 722 -8.33333333333333e-02 1122 877 8.33333333333333e-02 1122 1123 -1.66666666666667e-01 1122 1129 1.66666666666667e-01 1122 876 -3.75000000000000e-01 1122 1141 8.33333333333333e-02 1122 1128 -2.50000000000000e-01 1123 1123 1.25000000000000e+00 1123 1140 8.33333333333333e-02 1123 1145 8.33333333333333e-02 1123 1143 -1.66666666666667e-01 1123 1115 8.33333333333333e-02 1123 1124 -1.66666666666667e-01 1123 1114 -1.25000000000000e-01 1123 1113 -4.16666666666667e-02 1123 720 4.16666666666667e-02 1123 1141 -1.25000000000000e-01 1123 765 4.16666666666667e-02 1123 882 -4.16666666666667e-02 1123 884 8.33333333333333e-02 1123 1130 1.66666666666667e-01 1123 890 -1.66666666666667e-01 1123 1257 -8.33333333333333e-02 1123 888 8.33333333333333e-02 1123 767 4.16666666666667e-02 1123 1259 -8.33333333333333e-02 1123 883 -1.25000000000000e-01 1123 878 -4.16666666666667e-02 1123 722 4.16666666666667e-02 1123 877 -1.25000000000000e-01 1123 1142 -4.16666666666667e-02 1123 1129 -7.50000000000000e-01 1123 876 8.33333333333333e-02 1123 1122 -1.66666666666667e-01 1123 1128 1.66666666666667e-01 1124 1124 1.25000000000000e+00 1124 1143 8.33333333333333e-02 1124 1144 8.33333333333333e-02 1124 1115 -3.75000000000000e-01 1124 1114 8.33333333333333e-02 1124 1123 -1.66666666666667e-01 1124 1113 8.33333333333333e-02 1124 1142 -1.25000000000000e-01 1124 1140 8.33333333333333e-02 1124 1128 -8.33333333333333e-02 1124 1122 -1.66666666666667e-01 1124 883 8.33333333333333e-02 1124 1257 -8.33333333333333e-02 1124 888 8.33333333333333e-02 1124 1129 1.66666666666667e-01 1124 889 -1.66666666666667e-01 1124 884 -3.75000000000000e-01 1124 766 4.16666666666667e-02 1124 1258 -8.33333333333333e-02 1124 882 8.33333333333333e-02 1124 765 -8.33333333333333e-02 1124 878 -1.25000000000000e-01 1124 1141 -4.16666666666667e-02 1124 1130 -2.50000000000000e-01 1124 877 -4.16666666666667e-02 1124 721 4.16666666666667e-02 1124 876 8.33333333333333e-02 1124 720 -8.33333333333333e-02 1125 1125 2.50000000000000e+00 1125 1162 -1.66666666666667e-01 1125 1130 1.66666666666667e-01 1125 890 -1.66666666666667e-01 1125 1264 -8.33333333333333e-02 1125 889 8.33333333333333e-02 1125 1265 -8.33333333333333e-02 1125 1129 1.66666666666667e-01 1125 1128 -7.50000000000000e-01 1125 1118 1.66666666666667e-01 1125 1117 -8.33333333333333e-02 1125 1019 -1.66666666666667e-01 1125 1018 8.33333333333333e-02 1125 770 8.33333333333333e-02 1125 1160 -8.33333333333333e-02 1125 1159 1.66666666666667e-01 1125 1126 -3.33333333333333e-01 1125 1158 -2.50000000000000e-01 1125 722 8.33333333333333e-02 1125 1116 -2.50000000000000e-01 1125 878 -8.33333333333333e-02 1125 877 1.66666666666667e-01 1125 1016 -8.33333333333333e-02 1125 875 8.33333333333333e-02 1125 1027 1.66666666666667e-01 1125 874 -1.66666666666667e-01 1125 721 8.33333333333333e-02 1125 1015 -8.33333333333333e-02 1125 876 -2.50000000000000e-01 1125 1127 -3.33333333333333e-01 1125 887 1.66666666666667e-01 1125 1028 1.66666666666667e-01 1125 886 -8.33333333333333e-02 1125 769 8.33333333333333e-02 1125 1163 8.33333333333333e-02 1125 885 -2.50000000000000e-01 1125 1026 -7.50000000000000e-01 1126 1126 2.50000000000000e+00 1126 1161 -1.66666666666667e-01 1126 1130 -8.33333333333333e-02 1126 1265 -8.33333333333333e-02 1126 890 8.33333333333333e-02 1126 1263 -8.33333333333333e-02 1126 888 8.33333333333333e-02 1126 1129 -2.50000000000000e-01 1126 1128 1.66666666666667e-01 1126 1116 -8.33333333333333e-02 1126 1019 8.33333333333333e-02 1126 1017 8.33333333333333e-02 1126 1160 1.66666666666667e-01 1126 1159 -7.50000000000000e-01 1126 1158 1.66666666666667e-01 1126 1125 -3.33333333333333e-01 1126 1118 1.66666666666667e-01 1126 1117 -2.50000000000000e-01 1126 1028 -8.33333333333333e-02 1126 1127 -3.33333333333333e-01 1126 1016 -8.33333333333333e-02 1126 875 8.33333333333333e-02 1126 876 1.66666666666667e-01 1126 1026 1.66666666666667e-01 1126 873 -1.66666666666667e-01 1126 722 -1.66666666666667e-01 1126 878 1.66666666666667e-01 1126 877 -7.50000000000000e-01 1126 720 8.33333333333333e-02 1126 1014 -8.33333333333333e-02 1126 887 1.66666666666667e-01 1126 770 -1.66666666666667e-01 1126 1163 8.33333333333333e-02 1126 886 -2.50000000000000e-01 1126 1027 -2.50000000000000e-01 1126 885 -8.33333333333333e-02 1126 768 8.33333333333333e-02 1127 1127 2.50000000000000e+00 1127 1161 8.33333333333333e-02 1127 1129 -8.33333333333333e-02 1127 1264 -8.33333333333333e-02 1127 889 8.33333333333333e-02 1127 1128 1.66666666666667e-01 1127 888 -1.66666666666667e-01 1127 1263 -8.33333333333333e-02 1127 1130 -2.50000000000000e-01 1127 1116 1.66666666666667e-01 1127 1018 8.33333333333333e-02 1127 1017 -1.66666666666667e-01 1127 1160 -2.50000000000000e-01 1127 1159 1.66666666666667e-01 1127 768 8.33333333333333e-02 1127 1158 -8.33333333333333e-02 1127 1118 -7.50000000000000e-01 1127 1117 1.66666666666667e-01 1127 720 8.33333333333333e-02 1127 1027 -8.33333333333333e-02 1127 1126 -3.33333333333333e-01 1127 876 -8.33333333333333e-02 1127 1015 -8.33333333333333e-02 1127 874 8.33333333333333e-02 1127 1014 -8.33333333333333e-02 1127 873 8.33333333333333e-02 1127 878 -2.50000000000000e-01 1127 721 -1.66666666666667e-01 1127 877 1.66666666666667e-01 1127 1162 8.33333333333333e-02 1127 887 -7.50000000000000e-01 1127 1028 -2.50000000000000e-01 1127 886 1.66666666666667e-01 1127 769 -1.66666666666667e-01 1127 1125 -3.33333333333333e-01 1127 885 1.66666666666667e-01 1127 1026 1.66666666666667e-01 1128 1128 2.50000000000000e+00 1128 1162 1.66666666666667e-01 1128 1118 -1.66666666666667e-01 1128 1117 8.33333333333333e-02 1128 1161 -2.50000000000000e-01 1128 1127 1.66666666666667e-01 1128 1264 8.33333333333333e-02 1128 1126 1.66666666666667e-01 1128 1125 -7.50000000000000e-01 1128 1265 8.33333333333333e-02 1128 1120 -8.33333333333333e-02 1128 1121 1.66666666666667e-01 1128 1130 -3.33333333333333e-01 1128 722 -8.33333333333333e-02 1128 1119 -2.50000000000000e-01 1128 1178 8.33333333333333e-02 1128 773 -8.33333333333333e-02 1128 1177 -1.66666666666667e-01 1128 1115 8.33333333333333e-02 1128 1129 -3.33333333333333e-01 1128 1144 1.66666666666667e-01 1128 1114 8.33333333333333e-02 1128 721 -8.33333333333333e-02 1128 1145 1.66666666666667e-01 1128 772 -8.33333333333333e-02 1128 1143 -7.50000000000000e-01 1128 1124 -8.33333333333333e-02 1128 878 8.33333333333333e-02 1128 1258 8.33333333333333e-02 1128 889 -8.33333333333333e-02 1128 877 -1.66666666666667e-01 1128 1123 1.66666666666667e-01 1128 1122 -2.50000000000000e-01 1128 890 1.66666666666667e-01 1128 1259 -1.66666666666667e-01 1128 888 -2.50000000000000e-01 1128 1163 -8.33333333333333e-02 1129 1129 2.50000000000000e+00 1129 1161 1.66666666666667e-01 1129 1116 8.33333333333333e-02 1129 1163 1.66666666666667e-01 1129 1162 -7.50000000000000e-01 1129 1127 -8.33333333333333e-02 1129 1263 8.33333333333333e-02 1129 1126 -2.50000000000000e-01 1129 1125 1.66666666666667e-01 1129 1265 -1.66666666666667e-01 1129 1119 -8.33333333333333e-02 1129 1178 8.33333333333333e-02 1129 1121 1.66666666666667e-01 1129 1120 -2.50000000000000e-01 1129 1176 -1.66666666666667e-01 1129 1145 -8.33333333333333e-02 1129 1128 -3.33333333333333e-01 1129 1143 1.66666666666667e-01 1129 1115 -1.66666666666667e-01 1129 1113 8.33333333333333e-02 1129 720 -8.33333333333333e-02 1129 1144 -2.50000000000000e-01 1129 771 -8.33333333333333e-02 1129 1124 1.66666666666667e-01 1129 1130 -3.33333333333333e-01 1129 890 1.66666666666667e-01 1129 1257 8.33333333333333e-02 1129 888 -8.33333333333333e-02 1129 878 8.33333333333333e-02 1129 722 -8.33333333333333e-02 1129 1123 -7.50000000000000e-01 1129 876 -1.66666666666667e-01 1129 1122 1.66666666666667e-01 1129 1259 8.33333333333333e-02 1129 773 -8.33333333333333e-02 1129 889 -2.50000000000000e-01 1129 1118 8.33333333333333e-02 1130 1130 2.50000000000000e+00 1130 1161 -8.33333333333333e-02 1130 1116 -1.66666666666667e-01 1130 1163 -2.50000000000000e-01 1130 1162 1.66666666666667e-01 1130 1126 -8.33333333333333e-02 1130 1125 1.66666666666667e-01 1130 1127 -2.50000000000000e-01 1130 1264 -1.66666666666667e-01 1130 1263 8.33333333333333e-02 1130 1177 8.33333333333333e-02 1130 1119 1.66666666666667e-01 1130 1128 -3.33333333333333e-01 1130 1121 -7.50000000000000e-01 1130 1120 1.66666666666667e-01 1130 720 -8.33333333333333e-02 1130 1176 8.33333333333333e-02 1130 771 -8.33333333333333e-02 1130 1113 8.33333333333333e-02 1130 1144 -8.33333333333333e-02 1130 1114 -1.66666666666667e-01 1130 1145 -2.50000000000000e-01 1130 1143 1.66666666666667e-01 1130 1122 -8.33333333333333e-02 1130 876 8.33333333333333e-02 1130 1123 1.66666666666667e-01 1130 1129 -3.33333333333333e-01 1130 889 1.66666666666667e-01 1130 1124 -2.50000000000000e-01 1130 877 8.33333333333333e-02 1130 721 -8.33333333333333e-02 1130 890 -7.50000000000000e-01 1130 1117 8.33333333333333e-02 1130 1258 8.33333333333333e-02 1130 772 -8.33333333333333e-02 1130 888 1.66666666666667e-01 1130 1257 -1.66666666666667e-01 1131 1131 2.50000000000000e+00 1131 1169 8.33333333333333e-02 1131 1168 -1.66666666666667e-01 1131 1138 1.66666666666667e-01 1131 1137 -7.50000000000000e-01 1131 1064 8.33333333333333e-02 1131 1063 8.33333333333333e-02 1131 1067 1.66666666666667e-01 1131 1066 -8.33333333333333e-02 1131 1065 -2.50000000000000e-01 1131 1133 -3.33333333333333e-01 1131 725 -8.33333333333333e-02 1131 731 -8.33333333333333e-02 1131 1181 -8.33333333333333e-02 1131 1178 8.33333333333333e-02 1131 1148 -1.66666666666667e-01 1131 1145 1.66666666666667e-01 1131 1147 8.33333333333333e-02 1131 1144 -8.33333333333333e-02 1131 1143 -2.50000000000000e-01 1131 1180 -8.33333333333333e-02 1131 1177 8.33333333333333e-02 1131 812 -8.33333333333333e-02 1131 1115 8.33333333333333e-02 1131 811 -8.33333333333333e-02 1131 817 8.33333333333333e-02 1131 1114 -1.66666666666667e-01 1131 724 1.66666666666667e-01 1131 723 -2.50000000000000e-01 1131 1121 1.66666666666667e-01 1131 818 -1.66666666666667e-01 1131 1120 1.66666666666667e-01 1131 1132 -3.33333333333333e-01 1131 730 1.66666666666667e-01 1131 1119 -7.50000000000000e-01 1131 1139 1.66666666666667e-01 1131 729 -2.50000000000000e-01 1132 1132 2.50000000000000e+00 1132 1139 -8.33333333333333e-02 1132 1167 -1.66666666666667e-01 1132 1138 -2.50000000000000e-01 1132 1137 1.66666666666667e-01 1132 1064 -1.66666666666667e-01 1132 1062 8.33333333333333e-02 1132 1067 1.66666666666667e-01 1132 1066 -2.50000000000000e-01 1132 1065 -8.33333333333333e-02 1132 1181 -8.33333333333333e-02 1132 1148 8.33333333333333e-02 1132 725 1.66666666666667e-01 1132 1133 -3.33333333333333e-01 1132 1145 1.66666666666667e-01 1132 1144 -2.50000000000000e-01 1132 1146 8.33333333333333e-02 1132 1143 -8.33333333333333e-02 1132 731 1.66666666666667e-01 1132 1178 -1.66666666666667e-01 1132 1179 -8.33333333333333e-02 1132 1176 8.33333333333333e-02 1132 810 -8.33333333333333e-02 1132 816 8.33333333333333e-02 1132 1115 8.33333333333333e-02 1132 812 -8.33333333333333e-02 1132 724 -7.50000000000000e-01 1132 1113 -1.66666666666667e-01 1132 723 1.66666666666667e-01 1132 1121 -8.33333333333333e-02 1132 818 8.33333333333333e-02 1132 1120 -2.50000000000000e-01 1132 1169 8.33333333333333e-02 1132 730 -7.50000000000000e-01 1132 1119 1.66666666666667e-01 1132 1131 -3.33333333333333e-01 1132 729 1.66666666666667e-01 1133 1133 2.50000000000000e+00 1133 1138 -8.33333333333333e-02 1133 1137 1.66666666666667e-01 1133 1167 8.33333333333333e-02 1133 1139 -2.50000000000000e-01 1133 1062 8.33333333333333e-02 1133 1063 -1.66666666666667e-01 1133 1067 -7.50000000000000e-01 1133 1066 1.66666666666667e-01 1133 1065 1.66666666666667e-01 1133 1131 -3.33333333333333e-01 1133 723 -8.33333333333333e-02 1133 729 -8.33333333333333e-02 1133 1179 -8.33333333333333e-02 1133 1176 8.33333333333333e-02 1133 1180 -8.33333333333333e-02 1133 1147 8.33333333333333e-02 1133 1145 -7.50000000000000e-01 1133 724 1.66666666666667e-01 1133 1132 -3.33333333333333e-01 1133 1144 1.66666666666667e-01 1133 1146 -1.66666666666667e-01 1133 1143 1.66666666666667e-01 1133 730 1.66666666666667e-01 1133 1177 -1.66666666666667e-01 1133 810 -8.33333333333333e-02 1133 1113 8.33333333333333e-02 1133 725 -2.50000000000000e-01 1133 1114 8.33333333333333e-02 1133 811 -8.33333333333333e-02 1133 1121 -2.50000000000000e-01 1133 1168 8.33333333333333e-02 1133 731 -2.50000000000000e-01 1133 1120 -8.33333333333333e-02 1133 817 8.33333333333333e-02 1133 1119 1.66666666666667e-01 1133 816 -1.66666666666667e-01 1134 1134 1.25000000000000e+00 1134 1139 -8.33333333333333e-02 1134 1072 -4.16666666666667e-02 1134 1063 4.16666666666667e-02 1134 1073 8.33333333333333e-02 1134 736 8.33333333333333e-02 1134 1192 -1.66666666666667e-01 1134 1071 -1.25000000000000e-01 1134 1064 -8.33333333333333e-02 1134 1135 -1.66666666666667e-01 1134 1138 1.66666666666667e-01 1134 724 8.33333333333333e-02 1134 1137 -2.50000000000000e-01 1134 1196 -8.33333333333333e-02 1134 1148 8.33333333333333e-02 1134 737 8.33333333333333e-02 1134 896 -8.33333333333333e-02 1134 895 4.16666666666667e-02 1134 1195 -8.33333333333333e-02 1134 735 -3.75000000000000e-01 1134 1136 -1.66666666666667e-01 1134 893 8.33333333333333e-02 1134 725 8.33333333333333e-02 1134 892 -4.16666666666667e-02 1134 1147 8.33333333333333e-02 1134 1193 8.33333333333333e-02 1134 891 -1.25000000000000e-01 1134 723 -3.75000000000000e-01 1135 1135 1.25000000000000e+00 1135 1073 8.33333333333333e-02 1135 1139 1.66666666666667e-01 1135 1071 -4.16666666666667e-02 1135 1062 4.16666666666667e-02 1135 737 -4.16666666666667e-02 1135 1193 8.33333333333333e-02 1135 1072 -1.25000000000000e-01 1135 735 8.33333333333333e-02 1135 1191 -1.66666666666667e-01 1135 1064 4.16666666666667e-02 1135 725 -4.16666666666667e-02 1135 1138 -7.50000000000000e-01 1135 1134 -1.66666666666667e-01 1135 1137 1.66666666666667e-01 1135 723 8.33333333333333e-02 1135 896 4.16666666666667e-02 1135 1196 -8.33333333333333e-02 1135 736 -1.25000000000000e-01 1135 894 4.16666666666667e-02 1135 1194 -8.33333333333333e-02 1135 893 8.33333333333333e-02 1135 1148 -1.66666666666667e-01 1135 1136 -1.66666666666667e-01 1135 892 -1.25000000000000e-01 1135 724 -1.25000000000000e-01 1135 891 -4.16666666666667e-02 1135 1146 8.33333333333333e-02 1136 1136 1.25000000000000e+00 1136 1137 -8.33333333333333e-02 1136 1135 -1.66666666666667e-01 1136 1072 8.33333333333333e-02 1136 1138 1.66666666666667e-01 1136 1073 -3.75000000000000e-01 1136 736 -4.16666666666667e-02 1136 1192 8.33333333333333e-02 1136 1071 8.33333333333333e-02 1136 1139 -2.50000000000000e-01 1136 1063 4.16666666666667e-02 1136 724 -4.16666666666667e-02 1136 1062 -8.33333333333333e-02 1136 895 4.16666666666667e-02 1136 1195 -8.33333333333333e-02 1136 1194 -8.33333333333333e-02 1136 1146 8.33333333333333e-02 1136 737 -1.25000000000000e-01 1136 735 8.33333333333333e-02 1136 894 -8.33333333333333e-02 1136 1191 8.33333333333333e-02 1136 893 -3.75000000000000e-01 1136 725 -1.25000000000000e-01 1136 892 8.33333333333333e-02 1136 1147 -1.66666666666667e-01 1136 1134 -1.66666666666667e-01 1136 891 8.33333333333333e-02 1136 723 8.33333333333333e-02 1137 1137 2.50000000000000e+00 1137 1180 8.33333333333333e-02 1137 1201 -8.33333333333333e-02 1137 1148 1.66666666666667e-01 1137 1196 -1.66666666666667e-01 1137 1147 -8.33333333333333e-02 1137 1195 8.33333333333333e-02 1137 1202 -8.33333333333333e-02 1137 1146 -2.50000000000000e-01 1137 1073 8.33333333333333e-02 1137 1136 -8.33333333333333e-02 1137 1072 8.33333333333333e-02 1137 1193 1.66666666666667e-01 1137 1139 -3.33333333333333e-01 1137 1192 1.66666666666667e-01 1137 1191 -7.50000000000000e-01 1137 1135 1.66666666666667e-01 1137 1134 -2.50000000000000e-01 1137 1138 -3.33333333333333e-01 1137 1075 -8.33333333333333e-02 1137 1076 1.66666666666667e-01 1137 1067 -1.66666666666667e-01 1137 1133 1.66666666666667e-01 1137 1063 -8.33333333333333e-02 1137 1066 8.33333333333333e-02 1137 740 8.33333333333333e-02 1137 1169 -8.33333333333333e-02 1137 739 -1.66666666666667e-01 1137 1168 1.66666666666667e-01 1137 1074 -2.50000000000000e-01 1137 1167 -2.50000000000000e-01 1137 1064 -8.33333333333333e-02 1137 725 8.33333333333333e-02 1137 1132 1.66666666666667e-01 1137 724 -1.66666666666667e-01 1137 1181 8.33333333333333e-02 1137 1131 -7.50000000000000e-01 1138 1138 2.50000000000000e+00 1138 1179 8.33333333333333e-02 1138 1200 -8.33333333333333e-02 1138 1202 -8.33333333333333e-02 1138 1196 8.33333333333333e-02 1138 1146 -8.33333333333333e-02 1138 1194 8.33333333333333e-02 1138 1148 1.66666666666667e-01 1138 1147 -2.50000000000000e-01 1138 1136 1.66666666666667e-01 1138 1073 -1.66666666666667e-01 1138 1071 8.33333333333333e-02 1138 1193 -8.33333333333333e-02 1138 740 8.33333333333333e-02 1138 1192 -2.50000000000000e-01 1138 1191 1.66666666666667e-01 1138 725 8.33333333333333e-02 1138 1135 -7.50000000000000e-01 1138 1134 1.66666666666667e-01 1138 1133 -8.33333333333333e-02 1138 1137 -3.33333333333333e-01 1138 1074 -8.33333333333333e-02 1138 1067 8.33333333333333e-02 1138 1064 -8.33333333333333e-02 1138 1062 -8.33333333333333e-02 1138 1065 8.33333333333333e-02 1138 1076 1.66666666666667e-01 1138 1169 1.66666666666667e-01 1138 1139 -3.33333333333333e-01 1138 1075 -2.50000000000000e-01 1138 1168 -7.50000000000000e-01 1138 738 -1.66666666666667e-01 1138 1167 1.66666666666667e-01 1138 1181 -1.66666666666667e-01 1138 1132 -2.50000000000000e-01 1138 1131 1.66666666666667e-01 1138 723 -1.66666666666667e-01 1139 1139 2.50000000000000e+00 1139 1180 -1.66666666666667e-01 1139 1201 -8.33333333333333e-02 1139 1195 8.33333333333333e-02 1139 1146 1.66666666666667e-01 1139 1194 -1.66666666666667e-01 1139 1200 -8.33333333333333e-02 1139 1148 -7.50000000000000e-01 1139 1147 1.66666666666667e-01 1139 1071 8.33333333333333e-02 1139 1134 -8.33333333333333e-02 1139 1135 1.66666666666667e-01 1139 1072 -1.66666666666667e-01 1139 1193 -2.50000000000000e-01 1139 1192 -8.33333333333333e-02 1139 739 8.33333333333333e-02 1139 1191 1.66666666666667e-01 1139 1137 -3.33333333333333e-01 1139 1136 -2.50000000000000e-01 1139 724 8.33333333333333e-02 1139 1132 -8.33333333333333e-02 1139 1066 8.33333333333333e-02 1139 1063 -8.33333333333333e-02 1139 1074 1.66666666666667e-01 1139 1065 -1.66666666666667e-01 1139 1131 1.66666666666667e-01 1139 1076 -7.50000000000000e-01 1139 1169 -2.50000000000000e-01 1139 1075 1.66666666666667e-01 1139 1168 1.66666666666667e-01 1139 1138 -3.33333333333333e-01 1139 738 8.33333333333333e-02 1139 1167 -8.33333333333333e-02 1139 1179 8.33333333333333e-02 1139 1133 -2.50000000000000e-01 1139 1062 -8.33333333333333e-02 1139 723 8.33333333333333e-02 1140 1140 1.25000000000000e+00 1140 1141 -1.66666666666667e-01 1140 1115 -8.33333333333333e-02 1140 724 -4.16666666666667e-02 1140 1114 4.16666666666667e-02 1140 1124 8.33333333333333e-02 1140 766 -4.16666666666667e-02 1140 1122 -3.75000000000000e-01 1140 1258 8.33333333333333e-02 1140 1145 -8.33333333333333e-02 1140 1144 1.66666666666667e-01 1140 1143 -2.50000000000000e-01 1140 1259 8.33333333333333e-02 1140 1148 8.33333333333333e-02 1140 1262 -8.33333333333333e-02 1140 898 4.16666666666667e-02 1140 1261 -8.33333333333333e-02 1140 767 8.33333333333333e-02 1140 899 -8.33333333333333e-02 1140 765 -1.25000000000000e-01 1140 1142 -1.66666666666667e-01 1140 893 8.33333333333333e-02 1140 725 8.33333333333333e-02 1140 892 8.33333333333333e-02 1140 1147 -1.66666666666667e-01 1140 1123 8.33333333333333e-02 1140 891 -3.75000000000000e-01 1140 723 -1.25000000000000e-01 1141 1141 1.25000000000000e+00 1141 1115 4.16666666666667e-02 1141 1122 8.33333333333333e-02 1141 1140 -1.66666666666667e-01 1141 723 -4.16666666666667e-02 1141 1113 4.16666666666667e-02 1141 1123 -1.25000000000000e-01 1141 765 -4.16666666666667e-02 1141 1257 8.33333333333333e-02 1141 725 8.33333333333333e-02 1141 1142 -1.66666666666667e-01 1141 1145 1.66666666666667e-01 1141 1144 -7.50000000000000e-01 1141 1143 1.66666666666667e-01 1141 767 8.33333333333333e-02 1141 1259 -1.66666666666667e-01 1141 897 4.16666666666667e-02 1141 1260 -8.33333333333333e-02 1141 899 4.16666666666667e-02 1141 1262 -8.33333333333333e-02 1141 766 -1.25000000000000e-01 1141 893 -4.16666666666667e-02 1141 1148 8.33333333333333e-02 1141 1124 -4.16666666666667e-02 1141 892 -1.25000000000000e-01 1141 724 -1.25000000000000e-01 1141 891 8.33333333333333e-02 1141 1146 -1.66666666666667e-01 1142 1142 1.25000000000000e+00 1142 1114 4.16666666666667e-02 1142 1113 -8.33333333333333e-02 1142 1124 -1.25000000000000e-01 1142 1122 8.33333333333333e-02 1142 1145 -2.50000000000000e-01 1142 724 8.33333333333333e-02 1142 1141 -1.66666666666667e-01 1142 1144 1.66666666666667e-01 1142 1143 -8.33333333333333e-02 1142 766 8.33333333333333e-02 1142 1258 -1.66666666666667e-01 1142 1257 8.33333333333333e-02 1142 1146 8.33333333333333e-02 1142 1260 -8.33333333333333e-02 1142 767 -3.75000000000000e-01 1142 898 4.16666666666667e-02 1142 1261 -8.33333333333333e-02 1142 765 8.33333333333333e-02 1142 897 -8.33333333333333e-02 1142 1123 -4.16666666666667e-02 1142 893 -1.25000000000000e-01 1142 725 -3.75000000000000e-01 1142 892 -4.16666666666667e-02 1142 1147 8.33333333333333e-02 1142 1140 -1.66666666666667e-01 1142 891 8.33333333333333e-02 1142 723 8.33333333333333e-02 1143 1143 2.50000000000000e+00 1143 1121 -1.66666666666667e-01 1143 1124 8.33333333333333e-02 1143 1115 -8.33333333333333e-02 1143 1123 -1.66666666666667e-01 1143 1129 1.66666666666667e-01 1143 1114 -8.33333333333333e-02 1143 1130 1.66666666666667e-01 1143 1128 -7.50000000000000e-01 1143 1261 8.33333333333333e-02 1143 1258 -8.33333333333333e-02 1143 1262 -1.66666666666667e-01 1143 1259 1.66666666666667e-01 1143 725 8.33333333333333e-02 1143 1142 -8.33333333333333e-02 1143 1141 1.66666666666667e-01 1143 1144 -3.33333333333333e-01 1143 1140 -2.50000000000000e-01 1143 773 8.33333333333333e-02 1143 1257 -2.50000000000000e-01 1143 1178 -8.33333333333333e-02 1143 1181 8.33333333333333e-02 1143 1271 -8.33333333333333e-02 1143 1147 1.66666666666667e-01 1143 1180 -1.66666666666667e-01 1143 1177 1.66666666666667e-01 1143 1148 1.66666666666667e-01 1143 1133 1.66666666666667e-01 1143 1145 -3.33333333333333e-01 1143 724 8.33333333333333e-02 1143 1132 -8.33333333333333e-02 1143 1146 -7.50000000000000e-01 1143 1131 -2.50000000000000e-01 1143 1270 -8.33333333333333e-02 1143 772 8.33333333333333e-02 1143 1120 8.33333333333333e-02 1143 1176 -2.50000000000000e-01 1144 1144 2.50000000000000e+00 1144 1121 8.33333333333333e-02 1144 1115 -8.33333333333333e-02 1144 1124 8.33333333333333e-02 1144 1130 -8.33333333333333e-02 1144 1122 -1.66666666666667e-01 1144 1128 1.66666666666667e-01 1144 1113 -8.33333333333333e-02 1144 1129 -2.50000000000000e-01 1144 1260 8.33333333333333e-02 1144 1257 -8.33333333333333e-02 1144 1262 8.33333333333333e-02 1144 1142 1.66666666666667e-01 1144 1141 -7.50000000000000e-01 1144 1140 1.66666666666667e-01 1144 1143 -3.33333333333333e-01 1144 1259 1.66666666666667e-01 1144 1258 -2.50000000000000e-01 1144 1145 -3.33333333333333e-01 1144 1148 -8.33333333333333e-02 1144 1146 1.66666666666667e-01 1144 1181 8.33333333333333e-02 1144 1271 -8.33333333333333e-02 1144 1179 -1.66666666666667e-01 1144 1176 1.66666666666667e-01 1144 725 -1.66666666666667e-01 1144 1133 1.66666666666667e-01 1144 1147 -2.50000000000000e-01 1144 1132 -2.50000000000000e-01 1144 723 8.33333333333333e-02 1144 1131 -8.33333333333333e-02 1144 1178 1.66666666666667e-01 1144 773 -1.66666666666667e-01 1144 1119 8.33333333333333e-02 1144 1177 -7.50000000000000e-01 1144 1269 -8.33333333333333e-02 1144 771 8.33333333333333e-02 1145 1145 2.50000000000000e+00 1145 1119 -1.66666666666667e-01 1145 1114 -8.33333333333333e-02 1145 1122 8.33333333333333e-02 1145 1113 -8.33333333333333e-02 1145 1123 8.33333333333333e-02 1145 1129 -8.33333333333333e-02 1145 1130 -2.50000000000000e-01 1145 1128 1.66666666666667e-01 1145 1261 8.33333333333333e-02 1145 1260 -1.66666666666667e-01 1145 1257 1.66666666666667e-01 1145 1142 -2.50000000000000e-01 1145 1141 1.66666666666667e-01 1145 723 8.33333333333333e-02 1145 1140 -8.33333333333333e-02 1145 1259 -7.50000000000000e-01 1145 1258 1.66666666666667e-01 1145 771 8.33333333333333e-02 1145 1144 -3.33333333333333e-01 1145 1176 -8.33333333333333e-02 1145 1147 -8.33333333333333e-02 1145 1179 8.33333333333333e-02 1145 1269 -8.33333333333333e-02 1145 1180 8.33333333333333e-02 1145 1270 -8.33333333333333e-02 1145 1148 -2.50000000000000e-01 1145 1133 -7.50000000000000e-01 1145 724 -1.66666666666667e-01 1145 1132 1.66666666666667e-01 1145 1146 1.66666666666667e-01 1145 1131 1.66666666666667e-01 1145 1143 -3.33333333333333e-01 1145 1120 8.33333333333333e-02 1145 1178 -2.50000000000000e-01 1145 1177 1.66666666666667e-01 1145 772 -1.66666666666667e-01 1146 1146 2.50000000000000e+00 1146 1138 -8.33333333333333e-02 1146 1202 8.33333333333333e-02 1146 1201 -1.66666666666667e-01 1146 1137 -2.50000000000000e-01 1146 1136 8.33333333333333e-02 1146 1195 1.66666666666667e-01 1146 1196 1.66666666666667e-01 1146 1194 -7.50000000000000e-01 1146 1135 8.33333333333333e-02 1146 1148 -3.33333333333333e-01 1146 725 -8.33333333333333e-02 1146 776 -8.33333333333333e-02 1146 1181 -8.33333333333333e-02 1146 1271 8.33333333333333e-02 1146 1180 1.66666666666667e-01 1146 1147 -3.33333333333333e-01 1146 1144 1.66666666666667e-01 1146 1133 -1.66666666666667e-01 1146 1145 1.66666666666667e-01 1146 724 -8.33333333333333e-02 1146 1132 8.33333333333333e-02 1146 1143 -7.50000000000000e-01 1146 775 -8.33333333333333e-02 1146 1270 8.33333333333333e-02 1146 1179 -2.50000000000000e-01 1146 893 -8.33333333333333e-02 1146 1142 8.33333333333333e-02 1146 901 8.33333333333333e-02 1146 1261 -8.33333333333333e-02 1146 1141 -1.66666666666667e-01 1146 892 1.66666666666667e-01 1146 891 -2.50000000000000e-01 1146 1262 1.66666666666667e-01 1146 902 -1.66666666666667e-01 1146 1260 -2.50000000000000e-01 1146 1139 1.66666666666667e-01 1147 1147 2.50000000000000e+00 1147 1137 -8.33333333333333e-02 1147 1200 -1.66666666666667e-01 1147 1139 1.66666666666667e-01 1147 1138 -2.50000000000000e-01 1147 1196 -8.33333333333333e-02 1147 1194 1.66666666666667e-01 1147 1195 -2.50000000000000e-01 1147 1136 -1.66666666666667e-01 1147 1134 8.33333333333333e-02 1147 1133 8.33333333333333e-02 1147 1145 -8.33333333333333e-02 1147 1179 1.66666666666667e-01 1147 1146 -3.33333333333333e-01 1147 1143 1.66666666666667e-01 1147 1144 -2.50000000000000e-01 1147 723 -8.33333333333333e-02 1147 1131 8.33333333333333e-02 1147 1181 1.66666666666667e-01 1147 1271 -1.66666666666667e-01 1147 1180 -7.50000000000000e-01 1147 774 -8.33333333333333e-02 1147 1269 8.33333333333333e-02 1147 893 1.66666666666667e-01 1147 1148 -3.33333333333333e-01 1147 1262 1.66666666666667e-01 1147 900 8.33333333333333e-02 1147 1260 -8.33333333333333e-02 1147 1142 8.33333333333333e-02 1147 725 -8.33333333333333e-02 1147 892 -7.50000000000000e-01 1147 1140 -1.66666666666667e-01 1147 891 1.66666666666667e-01 1147 902 8.33333333333333e-02 1147 776 -8.33333333333333e-02 1147 1261 -2.50000000000000e-01 1147 1202 8.33333333333333e-02 1148 1148 2.50000000000000e+00 1148 1137 1.66666666666667e-01 1148 1200 8.33333333333333e-02 1148 1139 -7.50000000000000e-01 1148 1138 1.66666666666667e-01 1148 1195 -8.33333333333333e-02 1148 1134 8.33333333333333e-02 1148 1196 -2.50000000000000e-01 1148 1194 1.66666666666667e-01 1148 1135 -1.66666666666667e-01 1148 1146 -3.33333333333333e-01 1148 723 -8.33333333333333e-02 1148 774 -8.33333333333333e-02 1148 1132 8.33333333333333e-02 1148 1144 -8.33333333333333e-02 1148 1179 -8.33333333333333e-02 1148 1269 8.33333333333333e-02 1148 1145 -2.50000000000000e-01 1148 1131 -1.66666666666667e-01 1148 1143 1.66666666666667e-01 1148 1181 -2.50000000000000e-01 1148 1180 1.66666666666667e-01 1148 1270 -1.66666666666667e-01 1148 891 -8.33333333333333e-02 1148 1140 8.33333333333333e-02 1148 892 1.66666666666667e-01 1148 1147 -3.33333333333333e-01 1148 1261 1.66666666666667e-01 1148 893 -2.50000000000000e-01 1148 1141 8.33333333333333e-02 1148 724 -8.33333333333333e-02 1148 1262 -7.50000000000000e-01 1148 1201 8.33333333333333e-02 1148 901 8.33333333333333e-02 1148 775 -8.33333333333333e-02 1148 1260 1.66666666666667e-01 1148 900 -1.66666666666667e-01 1149 1149 2.50000000000000e+00 1149 1157 -8.33333333333333e-02 1149 1171 -1.66666666666667e-01 1149 1156 1.66666666666667e-01 1149 1155 -2.50000000000000e-01 1149 1082 -1.66666666666667e-01 1149 1081 8.33333333333333e-02 1149 1085 1.66666666666667e-01 1149 1084 -8.33333333333333e-02 1149 1083 -2.50000000000000e-01 1149 1184 -8.33333333333333e-02 1149 1166 8.33333333333333e-02 1149 728 1.66666666666667e-01 1149 1151 -3.33333333333333e-01 1149 1163 1.66666666666667e-01 1149 1165 8.33333333333333e-02 1149 1162 -8.33333333333333e-02 1149 1161 -2.50000000000000e-01 1149 731 1.66666666666667e-01 1149 1178 -1.66666666666667e-01 1149 1183 -8.33333333333333e-02 1149 1177 8.33333333333333e-02 1149 814 -8.33333333333333e-02 1149 817 8.33333333333333e-02 1149 1118 8.33333333333333e-02 1149 815 -8.33333333333333e-02 1149 727 1.66666666666667e-01 1149 1117 -1.66666666666667e-01 1149 726 -7.50000000000000e-01 1149 1121 -8.33333333333333e-02 1149 818 8.33333333333333e-02 1149 1150 -3.33333333333333e-01 1149 1120 1.66666666666667e-01 1149 730 1.66666666666667e-01 1149 1172 8.33333333333333e-02 1149 1119 -2.50000000000000e-01 1149 729 -7.50000000000000e-01 1150 1150 2.50000000000000e+00 1150 1172 8.33333333333333e-02 1150 1170 -1.66666666666667e-01 1150 1156 -7.50000000000000e-01 1150 1155 1.66666666666667e-01 1150 1082 8.33333333333333e-02 1150 1080 8.33333333333333e-02 1150 1085 1.66666666666667e-01 1150 1084 -2.50000000000000e-01 1150 1083 -8.33333333333333e-02 1150 1151 -3.33333333333333e-01 1150 731 -8.33333333333333e-02 1150 728 -8.33333333333333e-02 1150 1178 8.33333333333333e-02 1150 1184 -8.33333333333333e-02 1150 1166 -1.66666666666667e-01 1150 1163 1.66666666666667e-01 1150 1162 -2.50000000000000e-01 1150 1164 8.33333333333333e-02 1150 1161 -8.33333333333333e-02 1150 1182 -8.33333333333333e-02 1150 1176 8.33333333333333e-02 1150 1118 8.33333333333333e-02 1150 815 -8.33333333333333e-02 1150 813 -8.33333333333333e-02 1150 816 8.33333333333333e-02 1150 727 -2.50000000000000e-01 1150 726 1.66666666666667e-01 1150 1116 -1.66666666666667e-01 1150 1121 1.66666666666667e-01 1150 818 -1.66666666666667e-01 1150 1157 1.66666666666667e-01 1150 1120 -7.50000000000000e-01 1150 730 -2.50000000000000e-01 1150 1149 -3.33333333333333e-01 1150 1119 1.66666666666667e-01 1150 729 1.66666666666667e-01 1151 1151 2.50000000000000e+00 1151 1155 -8.33333333333333e-02 1151 1156 1.66666666666667e-01 1151 1171 8.33333333333333e-02 1151 1157 -2.50000000000000e-01 1151 1081 8.33333333333333e-02 1151 1080 -1.66666666666667e-01 1151 1085 -7.50000000000000e-01 1151 1084 1.66666666666667e-01 1151 1083 1.66666666666667e-01 1151 1150 -3.33333333333333e-01 1151 730 -8.33333333333333e-02 1151 727 -8.33333333333333e-02 1151 1177 8.33333333333333e-02 1151 1183 -8.33333333333333e-02 1151 1182 -8.33333333333333e-02 1151 1164 8.33333333333333e-02 1151 1163 -7.50000000000000e-01 1151 1165 -1.66666666666667e-01 1151 1162 1.66666666666667e-01 1151 726 1.66666666666667e-01 1151 1149 -3.33333333333333e-01 1151 1161 1.66666666666667e-01 1151 729 1.66666666666667e-01 1151 1176 -1.66666666666667e-01 1151 1117 8.33333333333333e-02 1151 814 -8.33333333333333e-02 1151 728 -2.50000000000000e-01 1151 1116 8.33333333333333e-02 1151 813 -8.33333333333333e-02 1151 1170 8.33333333333333e-02 1151 1121 -2.50000000000000e-01 1151 731 -2.50000000000000e-01 1151 1120 1.66666666666667e-01 1151 817 -1.66666666666667e-01 1151 1119 -8.33333333333333e-02 1151 816 8.33333333333333e-02 1152 1152 2.50000000000000e+00 1152 1229 8.33333333333333e-02 1152 1228 -1.66666666666667e-01 1152 1156 1.66666666666667e-01 1152 1155 -7.50000000000000e-01 1152 1232 -8.33333333333333e-02 1152 1231 -8.33333333333333e-02 1152 1166 -1.66666666666667e-01 1152 1165 8.33333333333333e-02 1152 1082 8.33333333333333e-02 1152 1091 1.66666666666667e-01 1152 1090 -8.33333333333333e-02 1152 1089 -2.50000000000000e-01 1152 1081 8.33333333333333e-02 1152 997 8.33333333333333e-02 1152 988 -8.33333333333333e-02 1152 989 -8.33333333333333e-02 1152 998 -1.66666666666667e-01 1152 1049 1.66666666666667e-01 1152 1154 -3.33333333333333e-01 1152 911 1.66666666666667e-01 1152 916 8.33333333333333e-02 1152 910 -8.33333333333333e-02 1152 728 -8.33333333333333e-02 1152 1043 8.33333333333333e-02 1152 727 1.66666666666667e-01 1152 1042 -1.66666666666667e-01 1152 726 -2.50000000000000e-01 1152 909 -2.50000000000000e-01 1152 752 -8.33333333333333e-02 1152 917 8.33333333333333e-02 1152 1153 -3.33333333333333e-01 1152 751 1.66666666666667e-01 1152 1048 1.66666666666667e-01 1152 1157 1.66666666666667e-01 1152 750 -2.50000000000000e-01 1152 1047 -7.50000000000000e-01 1153 1153 2.50000000000000e+00 1153 1157 -8.33333333333333e-02 1153 1227 -1.66666666666667e-01 1153 1156 -2.50000000000000e-01 1153 1155 1.66666666666667e-01 1153 1232 -8.33333333333333e-02 1153 1166 8.33333333333333e-02 1153 1230 -8.33333333333333e-02 1153 1164 8.33333333333333e-02 1153 1091 1.66666666666667e-01 1153 1090 -2.50000000000000e-01 1153 1089 -8.33333333333333e-02 1153 1082 -1.66666666666667e-01 1153 1080 8.33333333333333e-02 1153 996 8.33333333333333e-02 1153 987 -8.33333333333333e-02 1153 998 8.33333333333333e-02 1153 989 -8.33333333333333e-02 1153 1049 -8.33333333333333e-02 1153 1043 8.33333333333333e-02 1153 915 8.33333333333333e-02 1153 909 -8.33333333333333e-02 1153 728 1.66666666666667e-01 1153 1154 -3.33333333333333e-01 1153 911 1.66666666666667e-01 1153 727 -7.50000000000000e-01 1153 910 -2.50000000000000e-01 1153 726 1.66666666666667e-01 1153 1041 -1.66666666666667e-01 1153 752 1.66666666666667e-01 1153 917 -1.66666666666667e-01 1153 1229 8.33333333333333e-02 1153 751 -7.50000000000000e-01 1153 1048 -2.50000000000000e-01 1153 1152 -3.33333333333333e-01 1153 750 1.66666666666667e-01 1153 1047 1.66666666666667e-01 1154 1154 2.50000000000000e+00 1154 1156 -8.33333333333333e-02 1154 1155 1.66666666666667e-01 1154 1227 8.33333333333333e-02 1154 1157 -2.50000000000000e-01 1154 1230 -8.33333333333333e-02 1154 1231 -8.33333333333333e-02 1154 1165 8.33333333333333e-02 1154 1164 -1.66666666666667e-01 1154 1080 8.33333333333333e-02 1154 1091 -7.50000000000000e-01 1154 1090 1.66666666666667e-01 1154 1089 1.66666666666667e-01 1154 1081 -1.66666666666667e-01 1154 987 -8.33333333333333e-02 1154 997 8.33333333333333e-02 1154 996 -1.66666666666667e-01 1154 988 -8.33333333333333e-02 1154 1048 -8.33333333333333e-02 1154 1042 8.33333333333333e-02 1154 1047 1.66666666666667e-01 1154 1152 -3.33333333333333e-01 1154 909 1.66666666666667e-01 1154 728 -2.50000000000000e-01 1154 911 -7.50000000000000e-01 1154 727 1.66666666666667e-01 1154 1153 -3.33333333333333e-01 1154 910 1.66666666666667e-01 1154 726 -8.33333333333333e-02 1154 1041 8.33333333333333e-02 1154 1228 8.33333333333333e-02 1154 752 -2.50000000000000e-01 1154 1049 -2.50000000000000e-01 1154 751 1.66666666666667e-01 1154 916 -1.66666666666667e-01 1154 750 -8.33333333333333e-02 1154 915 8.33333333333333e-02 1155 1155 2.50000000000000e+00 1155 1183 8.33333333333333e-02 1155 1237 -8.33333333333333e-02 1155 1232 8.33333333333333e-02 1155 1238 -8.33333333333333e-02 1155 1231 8.33333333333333e-02 1155 1165 -8.33333333333333e-02 1155 1166 1.66666666666667e-01 1155 1164 -2.50000000000000e-01 1155 1091 -1.66666666666667e-01 1155 1154 1.66666666666667e-01 1155 1090 8.33333333333333e-02 1155 755 8.33333333333333e-02 1155 1229 -8.33333333333333e-02 1155 1228 1.66666666666667e-01 1155 1227 -2.50000000000000e-01 1155 728 8.33333333333333e-02 1155 1153 1.66666666666667e-01 1155 1152 -7.50000000000000e-01 1155 1151 -8.33333333333333e-02 1155 1156 -3.33333333333333e-01 1155 1093 -8.33333333333333e-02 1155 1085 8.33333333333333e-02 1155 1082 -8.33333333333333e-02 1155 1084 8.33333333333333e-02 1155 1081 -8.33333333333333e-02 1155 1094 1.66666666666667e-01 1155 1172 1.66666666666667e-01 1155 1157 -3.33333333333333e-01 1155 754 -1.66666666666667e-01 1155 1171 1.66666666666667e-01 1155 1092 -2.50000000000000e-01 1155 1170 -7.50000000000000e-01 1155 1150 1.66666666666667e-01 1155 727 -1.66666666666667e-01 1155 1184 -1.66666666666667e-01 1155 1149 -2.50000000000000e-01 1156 1156 2.50000000000000e+00 1156 1182 8.33333333333333e-02 1156 1236 -8.33333333333333e-02 1156 1232 -1.66666666666667e-01 1156 1166 1.66666666666667e-01 1156 1230 8.33333333333333e-02 1156 1164 -8.33333333333333e-02 1156 1238 -8.33333333333333e-02 1156 1165 -2.50000000000000e-01 1156 1091 8.33333333333333e-02 1156 1154 -8.33333333333333e-02 1156 1089 8.33333333333333e-02 1156 1229 1.66666666666667e-01 1156 1157 -3.33333333333333e-01 1156 1228 -7.50000000000000e-01 1156 1227 1.66666666666667e-01 1156 1153 -2.50000000000000e-01 1156 1152 1.66666666666667e-01 1156 1155 -3.33333333333333e-01 1156 1092 -8.33333333333333e-02 1156 1094 1.66666666666667e-01 1156 1085 -1.66666666666667e-01 1156 1151 1.66666666666667e-01 1156 1083 8.33333333333333e-02 1156 1080 -8.33333333333333e-02 1156 755 8.33333333333333e-02 1156 1172 -8.33333333333333e-02 1156 1093 -2.50000000000000e-01 1156 1171 -2.50000000000000e-01 1156 753 -1.66666666666667e-01 1156 1170 1.66666666666667e-01 1156 1082 -8.33333333333333e-02 1156 728 8.33333333333333e-02 1156 1184 8.33333333333333e-02 1156 1150 -7.50000000000000e-01 1156 1149 1.66666666666667e-01 1156 726 -1.66666666666667e-01 1157 1157 2.50000000000000e+00 1157 1182 -1.66666666666667e-01 1157 1230 8.33333333333333e-02 1157 1236 -8.33333333333333e-02 1157 1231 -1.66666666666667e-01 1157 1165 1.66666666666667e-01 1157 1237 -8.33333333333333e-02 1157 1166 -7.50000000000000e-01 1157 1164 1.66666666666667e-01 1157 1090 8.33333333333333e-02 1157 1153 -8.33333333333333e-02 1157 1089 -1.66666666666667e-01 1157 1152 1.66666666666667e-01 1157 1229 -2.50000000000000e-01 1157 1228 1.66666666666667e-01 1157 1156 -3.33333333333333e-01 1157 753 8.33333333333333e-02 1157 1227 -8.33333333333333e-02 1157 1154 -2.50000000000000e-01 1157 726 8.33333333333333e-02 1157 1149 -8.33333333333333e-02 1157 1093 1.66666666666667e-01 1157 1083 8.33333333333333e-02 1157 1080 -8.33333333333333e-02 1157 1084 -1.66666666666667e-01 1157 1150 1.66666666666667e-01 1157 1094 -7.50000000000000e-01 1157 1172 -2.50000000000000e-01 1157 754 8.33333333333333e-02 1157 1171 -8.33333333333333e-02 1157 1092 1.66666666666667e-01 1157 1170 1.66666666666667e-01 1157 1155 -3.33333333333333e-01 1157 1183 8.33333333333333e-02 1157 1151 -2.50000000000000e-01 1157 1081 -8.33333333333333e-02 1157 727 8.33333333333333e-02 1158 1158 2.50000000000000e+00 1158 1265 -1.66666666666667e-01 1158 1163 1.66666666666667e-01 1158 1162 1.66666666666667e-01 1158 1161 -7.50000000000000e-01 1158 1267 -8.33333333333333e-02 1158 1268 -8.33333333333333e-02 1158 1166 8.33333333333333e-02 1158 1165 -1.66666666666667e-01 1158 1117 8.33333333333333e-02 1158 1018 -8.33333333333333e-02 1158 1127 -8.33333333333333e-02 1158 1028 8.33333333333333e-02 1158 1126 1.66666666666667e-01 1158 1027 -1.66666666666667e-01 1158 1125 -2.50000000000000e-01 1158 1118 8.33333333333333e-02 1158 1019 -8.33333333333333e-02 1158 923 8.33333333333333e-02 1158 911 -8.33333333333333e-02 1158 1159 -3.33333333333333e-01 1158 910 1.66666666666667e-01 1158 1054 1.66666666666667e-01 1158 728 1.66666666666667e-01 1158 1043 -1.66666666666667e-01 1158 727 -8.33333333333333e-02 1158 1042 8.33333333333333e-02 1158 726 -2.50000000000000e-01 1158 909 -2.50000000000000e-01 1158 1160 -3.33333333333333e-01 1158 770 1.66666666666667e-01 1158 1055 1.66666666666667e-01 1158 769 -8.33333333333333e-02 1158 922 8.33333333333333e-02 1158 1264 8.33333333333333e-02 1158 768 -2.50000000000000e-01 1158 1053 -7.50000000000000e-01 1159 1159 2.50000000000000e+00 1159 1265 8.33333333333333e-02 1159 1163 -8.33333333333333e-02 1159 1162 -2.50000000000000e-01 1159 1161 1.66666666666667e-01 1159 1166 8.33333333333333e-02 1159 1268 -8.33333333333333e-02 1159 1266 -8.33333333333333e-02 1159 1164 -1.66666666666667e-01 1159 1116 8.33333333333333e-02 1159 1017 -8.33333333333333e-02 1159 1028 8.33333333333333e-02 1159 1019 -8.33333333333333e-02 1159 1127 1.66666666666667e-01 1159 1126 -7.50000000000000e-01 1159 1125 1.66666666666667e-01 1159 1026 -1.66666666666667e-01 1159 1118 -1.66666666666667e-01 1159 1043 8.33333333333333e-02 1159 1055 -8.33333333333333e-02 1159 1158 -3.33333333333333e-01 1159 909 1.66666666666667e-01 1159 1053 1.66666666666667e-01 1159 728 1.66666666666667e-01 1159 1160 -3.33333333333333e-01 1159 911 1.66666666666667e-01 1159 727 -2.50000000000000e-01 1159 910 -7.50000000000000e-01 1159 726 -8.33333333333333e-02 1159 1041 8.33333333333333e-02 1159 770 1.66666666666667e-01 1159 923 -1.66666666666667e-01 1159 1263 8.33333333333333e-02 1159 769 -2.50000000000000e-01 1159 1054 -2.50000000000000e-01 1159 768 -8.33333333333333e-02 1159 921 8.33333333333333e-02 1160 1160 2.50000000000000e+00 1160 1263 -1.66666666666667e-01 1160 1163 -2.50000000000000e-01 1160 1162 -8.33333333333333e-02 1160 1161 1.66666666666667e-01 1160 1165 8.33333333333333e-02 1160 1267 -8.33333333333333e-02 1160 1266 -8.33333333333333e-02 1160 1164 8.33333333333333e-02 1160 1027 8.33333333333333e-02 1160 1018 -8.33333333333333e-02 1160 1127 -2.50000000000000e-01 1160 1126 1.66666666666667e-01 1160 1125 -8.33333333333333e-02 1160 1026 8.33333333333333e-02 1160 1117 -1.66666666666667e-01 1160 1116 8.33333333333333e-02 1160 1017 -8.33333333333333e-02 1160 921 8.33333333333333e-02 1160 909 -8.33333333333333e-02 1160 1042 8.33333333333333e-02 1160 1054 -8.33333333333333e-02 1160 728 -7.50000000000000e-01 1160 911 -2.50000000000000e-01 1160 727 1.66666666666667e-01 1160 1159 -3.33333333333333e-01 1160 910 1.66666666666667e-01 1160 726 1.66666666666667e-01 1160 1041 -1.66666666666667e-01 1160 1264 8.33333333333333e-02 1160 770 -7.50000000000000e-01 1160 1055 -2.50000000000000e-01 1160 769 1.66666666666667e-01 1160 922 -1.66666666666667e-01 1160 1158 -3.33333333333333e-01 1160 768 1.66666666666667e-01 1160 1053 1.66666666666667e-01 1161 1161 2.50000000000000e+00 1161 1121 8.33333333333333e-02 1161 1118 -8.33333333333333e-02 1161 1130 -8.33333333333333e-02 1161 1127 8.33333333333333e-02 1161 1129 1.66666666666667e-01 1161 1126 -1.66666666666667e-01 1161 1117 -8.33333333333333e-02 1161 1128 -2.50000000000000e-01 1161 1267 8.33333333333333e-02 1161 1264 -8.33333333333333e-02 1161 1268 8.33333333333333e-02 1161 1160 1.66666666666667e-01 1161 1159 1.66666666666667e-01 1161 1162 -3.33333333333333e-01 1161 1158 -7.50000000000000e-01 1161 1265 1.66666666666667e-01 1161 1263 -2.50000000000000e-01 1161 1163 -3.33333333333333e-01 1161 1166 -8.33333333333333e-02 1161 1165 1.66666666666667e-01 1161 1274 -8.33333333333333e-02 1161 1184 8.33333333333333e-02 1161 1183 -1.66666666666667e-01 1161 1177 1.66666666666667e-01 1161 728 -1.66666666666667e-01 1161 1151 1.66666666666667e-01 1161 727 8.33333333333333e-02 1161 1150 -8.33333333333333e-02 1161 1164 -2.50000000000000e-01 1161 1149 -2.50000000000000e-01 1161 1178 1.66666666666667e-01 1161 773 -1.66666666666667e-01 1161 1273 -8.33333333333333e-02 1161 772 8.33333333333333e-02 1161 1120 8.33333333333333e-02 1161 1176 -7.50000000000000e-01 1162 1162 2.50000000000000e+00 1162 1121 -1.66666666666667e-01 1162 1118 -8.33333333333333e-02 1162 1127 8.33333333333333e-02 1162 1128 1.66666666666667e-01 1162 1125 -1.66666666666667e-01 1162 1116 -8.33333333333333e-02 1162 1130 1.66666666666667e-01 1162 1129 -7.50000000000000e-01 1162 1266 8.33333333333333e-02 1162 1263 -8.33333333333333e-02 1162 1265 1.66666666666667e-01 1162 1268 -1.66666666666667e-01 1162 1160 -8.33333333333333e-02 1162 728 8.33333333333333e-02 1162 1159 -2.50000000000000e-01 1162 1158 1.66666666666667e-01 1162 1161 -3.33333333333333e-01 1162 773 8.33333333333333e-02 1162 1264 -2.50000000000000e-01 1162 1178 -8.33333333333333e-02 1162 1184 8.33333333333333e-02 1162 1274 -8.33333333333333e-02 1162 1164 1.66666666666667e-01 1162 1182 -1.66666666666667e-01 1162 1176 1.66666666666667e-01 1162 1166 1.66666666666667e-01 1162 1151 1.66666666666667e-01 1162 1163 -3.33333333333333e-01 1162 1165 -7.50000000000000e-01 1162 1150 -2.50000000000000e-01 1162 726 8.33333333333333e-02 1162 1149 -8.33333333333333e-02 1162 1119 8.33333333333333e-02 1162 1177 -2.50000000000000e-01 1162 1272 -8.33333333333333e-02 1162 771 8.33333333333333e-02 1163 1163 2.50000000000000e+00 1163 1119 8.33333333333333e-02 1163 1116 -8.33333333333333e-02 1163 1117 -8.33333333333333e-02 1163 1126 8.33333333333333e-02 1163 1128 -8.33333333333333e-02 1163 1125 8.33333333333333e-02 1163 1130 -2.50000000000000e-01 1163 1129 1.66666666666667e-01 1163 1264 1.66666666666667e-01 1163 1267 -1.66666666666667e-01 1163 1266 8.33333333333333e-02 1163 1160 -2.50000000000000e-01 1163 1159 -8.33333333333333e-02 1163 727 8.33333333333333e-02 1163 1158 1.66666666666667e-01 1163 1265 -7.50000000000000e-01 1163 772 8.33333333333333e-02 1163 1263 1.66666666666667e-01 1163 1177 -8.33333333333333e-02 1163 1161 -3.33333333333333e-01 1163 1164 -8.33333333333333e-02 1163 1183 8.33333333333333e-02 1163 1273 -8.33333333333333e-02 1163 1272 -8.33333333333333e-02 1163 1182 8.33333333333333e-02 1163 1166 -2.50000000000000e-01 1163 1151 -7.50000000000000e-01 1163 1165 1.66666666666667e-01 1163 1150 1.66666666666667e-01 1163 1162 -3.33333333333333e-01 1163 726 -1.66666666666667e-01 1163 1149 1.66666666666667e-01 1163 1120 -1.66666666666667e-01 1163 1178 -2.50000000000000e-01 1163 1176 1.66666666666667e-01 1163 771 -1.66666666666667e-01 1164 1164 2.50000000000000e+00 1164 1156 -8.33333333333333e-02 1164 1237 -1.66666666666667e-01 1164 1157 1.66666666666667e-01 1164 1155 -2.50000000000000e-01 1164 1232 -8.33333333333333e-02 1164 1231 1.66666666666667e-01 1164 1230 -2.50000000000000e-01 1164 1154 -1.66666666666667e-01 1164 1153 8.33333333333333e-02 1164 1151 8.33333333333333e-02 1164 1163 -8.33333333333333e-02 1164 1165 -3.33333333333333e-01 1164 1183 1.66666666666667e-01 1164 1162 1.66666666666667e-01 1164 1184 1.66666666666667e-01 1164 1274 -1.66666666666667e-01 1164 781 -8.33333333333333e-02 1164 1273 8.33333333333333e-02 1164 1182 -7.50000000000000e-01 1164 727 -8.33333333333333e-02 1164 1150 8.33333333333333e-02 1164 1161 -2.50000000000000e-01 1164 911 1.66666666666667e-01 1164 1166 -3.33333333333333e-01 1164 1268 1.66666666666667e-01 1164 928 8.33333333333333e-02 1164 1267 -8.33333333333333e-02 1164 1160 8.33333333333333e-02 1164 728 -8.33333333333333e-02 1164 910 1.66666666666667e-01 1164 1159 -1.66666666666667e-01 1164 909 -7.50000000000000e-01 1164 929 8.33333333333333e-02 1164 782 -8.33333333333333e-02 1164 1266 -2.50000000000000e-01 1164 1238 8.33333333333333e-02 1165 1165 2.50000000000000e+00 1165 1155 -8.33333333333333e-02 1165 1238 8.33333333333333e-02 1165 1236 -1.66666666666667e-01 1165 1156 -2.50000000000000e-01 1165 1154 8.33333333333333e-02 1165 1230 1.66666666666667e-01 1165 1232 1.66666666666667e-01 1165 1231 -7.50000000000000e-01 1165 1152 8.33333333333333e-02 1165 1166 -3.33333333333333e-01 1165 728 -8.33333333333333e-02 1165 782 -8.33333333333333e-02 1165 1184 -8.33333333333333e-02 1165 1274 8.33333333333333e-02 1165 1164 -3.33333333333333e-01 1165 1182 1.66666666666667e-01 1165 1161 1.66666666666667e-01 1165 1183 -2.50000000000000e-01 1165 780 -8.33333333333333e-02 1165 1272 8.33333333333333e-02 1165 1151 -1.66666666666667e-01 1165 1163 1.66666666666667e-01 1165 1162 -7.50000000000000e-01 1165 726 -8.33333333333333e-02 1165 1149 8.33333333333333e-02 1165 911 -8.33333333333333e-02 1165 1160 8.33333333333333e-02 1165 927 8.33333333333333e-02 1165 1266 -8.33333333333333e-02 1165 910 -2.50000000000000e-01 1165 909 1.66666666666667e-01 1165 1158 -1.66666666666667e-01 1165 929 -1.66666666666667e-01 1165 1268 1.66666666666667e-01 1165 1267 -2.50000000000000e-01 1165 1157 1.66666666666667e-01 1166 1166 2.50000000000000e+00 1166 1156 1.66666666666667e-01 1166 1237 8.33333333333333e-02 1166 1157 -7.50000000000000e-01 1166 1155 1.66666666666667e-01 1166 1230 -8.33333333333333e-02 1166 1153 8.33333333333333e-02 1166 1232 -2.50000000000000e-01 1166 1231 1.66666666666667e-01 1166 1152 -1.66666666666667e-01 1166 1165 -3.33333333333333e-01 1166 727 -8.33333333333333e-02 1166 781 -8.33333333333333e-02 1166 1149 8.33333333333333e-02 1166 1161 -8.33333333333333e-02 1166 1183 -8.33333333333333e-02 1166 1273 8.33333333333333e-02 1166 1184 -2.50000000000000e-01 1166 1182 1.66666666666667e-01 1166 1272 -1.66666666666667e-01 1166 1163 -2.50000000000000e-01 1166 1150 -1.66666666666667e-01 1166 1162 1.66666666666667e-01 1166 910 -8.33333333333333e-02 1166 1159 8.33333333333333e-02 1166 909 1.66666666666667e-01 1166 1164 -3.33333333333333e-01 1166 1266 1.66666666666667e-01 1166 911 -2.50000000000000e-01 1166 1158 8.33333333333333e-02 1166 726 -8.33333333333333e-02 1166 1268 -7.50000000000000e-01 1166 1236 8.33333333333333e-02 1166 928 -1.66666666666667e-01 1166 1267 1.66666666666667e-01 1166 927 8.33333333333333e-02 1166 780 -8.33333333333333e-02 1167 1167 2.50000000000000e+00 1167 1102 -8.33333333333333e-02 1167 1097 -1.66666666666667e-01 1167 1103 1.66666666666667e-01 1167 1101 -2.50000000000000e-01 1167 1199 8.33333333333333e-02 1167 1198 -1.66666666666667e-01 1167 1175 -8.33333333333333e-02 1167 1174 1.66666666666667e-01 1167 1173 -2.50000000000000e-01 1167 1066 -8.33333333333333e-02 1167 1075 8.33333333333333e-02 1167 1076 8.33333333333333e-02 1167 1139 -8.33333333333333e-02 1167 739 1.66666666666667e-01 1167 1168 -3.33333333333333e-01 1167 1138 1.66666666666667e-01 1167 1137 -2.50000000000000e-01 1167 1067 -8.33333333333333e-02 1167 1133 8.33333333333333e-02 1167 730 1.66666666666667e-01 1167 1132 -1.66666666666667e-01 1167 935 -8.33333333333333e-02 1167 932 8.33333333333333e-02 1167 740 1.66666666666667e-01 1167 1202 -1.66666666666667e-01 1167 1201 8.33333333333333e-02 1167 934 -8.33333333333333e-02 1167 738 -7.50000000000000e-01 1167 1169 -3.33333333333333e-01 1167 1181 1.66666666666667e-01 1167 731 1.66666666666667e-01 1167 1180 -8.33333333333333e-02 1167 931 8.33333333333333e-02 1167 1096 8.33333333333333e-02 1167 1179 -2.50000000000000e-01 1167 729 -7.50000000000000e-01 1168 1168 2.50000000000000e+00 1168 1101 -8.33333333333333e-02 1168 1103 1.66666666666667e-01 1168 1097 8.33333333333333e-02 1168 1102 -2.50000000000000e-01 1168 1199 8.33333333333333e-02 1168 1197 -1.66666666666667e-01 1168 1175 1.66666666666667e-01 1168 1174 -7.50000000000000e-01 1168 1173 1.66666666666667e-01 1168 1169 -3.33333333333333e-01 1168 731 -8.33333333333333e-02 1168 740 -8.33333333333333e-02 1168 1133 8.33333333333333e-02 1168 1067 -8.33333333333333e-02 1168 1065 -8.33333333333333e-02 1168 1074 8.33333333333333e-02 1168 1076 -1.66666666666667e-01 1168 1139 1.66666666666667e-01 1168 1138 -7.50000000000000e-01 1168 738 1.66666666666667e-01 1168 1167 -3.33333333333333e-01 1168 1137 1.66666666666667e-01 1168 729 1.66666666666667e-01 1168 1131 -1.66666666666667e-01 1168 1202 8.33333333333333e-02 1168 935 -8.33333333333333e-02 1168 739 -2.50000000000000e-01 1168 1200 8.33333333333333e-02 1168 933 -8.33333333333333e-02 1168 1181 1.66666666666667e-01 1168 932 -1.66666666666667e-01 1168 1095 8.33333333333333e-02 1168 1180 -2.50000000000000e-01 1168 730 -2.50000000000000e-01 1168 1179 -8.33333333333333e-02 1168 930 8.33333333333333e-02 1169 1169 2.50000000000000e+00 1169 1096 8.33333333333333e-02 1169 1095 -1.66666666666667e-01 1169 1103 -7.50000000000000e-01 1169 1101 1.66666666666667e-01 1169 1198 8.33333333333333e-02 1169 1197 8.33333333333333e-02 1169 1175 -2.50000000000000e-01 1169 1174 1.66666666666667e-01 1169 1173 -8.33333333333333e-02 1169 1168 -3.33333333333333e-01 1169 730 -8.33333333333333e-02 1169 739 -8.33333333333333e-02 1169 1132 8.33333333333333e-02 1169 1066 -8.33333333333333e-02 1169 1139 -2.50000000000000e-01 1169 1075 -1.66666666666667e-01 1169 1138 1.66666666666667e-01 1169 1074 8.33333333333333e-02 1169 1137 -8.33333333333333e-02 1169 1065 -8.33333333333333e-02 1169 1131 8.33333333333333e-02 1169 1201 8.33333333333333e-02 1169 934 -8.33333333333333e-02 1169 933 -8.33333333333333e-02 1169 930 8.33333333333333e-02 1169 740 -2.50000000000000e-01 1169 738 1.66666666666667e-01 1169 1200 -1.66666666666667e-01 1169 1102 1.66666666666667e-01 1169 1181 -7.50000000000000e-01 1169 731 -2.50000000000000e-01 1169 1180 1.66666666666667e-01 1169 931 -1.66666666666667e-01 1169 1167 -3.33333333333333e-01 1169 1179 1.66666666666667e-01 1169 729 1.66666666666667e-01 1170 1170 2.50000000000000e+00 1170 1108 -8.33333333333333e-02 1170 1109 1.66666666666667e-01 1170 1097 8.33333333333333e-02 1170 1107 -2.50000000000000e-01 1170 1235 8.33333333333333e-02 1170 1234 -1.66666666666667e-01 1170 1175 1.66666666666667e-01 1170 1174 1.66666666666667e-01 1170 1173 -7.50000000000000e-01 1170 1172 -3.33333333333333e-01 1170 755 -8.33333333333333e-02 1170 731 -8.33333333333333e-02 1170 1085 -8.33333333333333e-02 1170 1151 8.33333333333333e-02 1170 1084 -8.33333333333333e-02 1170 1093 8.33333333333333e-02 1170 1094 -1.66666666666667e-01 1170 1157 1.66666666666667e-01 1170 754 1.66666666666667e-01 1170 1171 -3.33333333333333e-01 1170 1156 1.66666666666667e-01 1170 1155 -7.50000000000000e-01 1170 730 1.66666666666667e-01 1170 1150 -1.66666666666667e-01 1170 938 -8.33333333333333e-02 1170 1238 8.33333333333333e-02 1170 1237 8.33333333333333e-02 1170 937 -8.33333333333333e-02 1170 753 -2.50000000000000e-01 1170 1184 1.66666666666667e-01 1170 932 -1.66666666666667e-01 1170 1183 -8.33333333333333e-02 1170 931 8.33333333333333e-02 1170 1182 -2.50000000000000e-01 1170 1096 8.33333333333333e-02 1170 729 -2.50000000000000e-01 1171 1171 2.50000000000000e+00 1171 1107 -8.33333333333333e-02 1171 1097 -1.66666666666667e-01 1171 1109 1.66666666666667e-01 1171 1108 -2.50000000000000e-01 1171 1235 8.33333333333333e-02 1171 1233 -1.66666666666667e-01 1171 1175 -8.33333333333333e-02 1171 1174 -2.50000000000000e-01 1171 1173 1.66666666666667e-01 1171 1083 -8.33333333333333e-02 1171 1092 8.33333333333333e-02 1171 1094 8.33333333333333e-02 1171 1157 -8.33333333333333e-02 1171 1156 -2.50000000000000e-01 1171 753 1.66666666666667e-01 1171 1170 -3.33333333333333e-01 1171 1155 1.66666666666667e-01 1171 1085 -8.33333333333333e-02 1171 1151 8.33333333333333e-02 1171 729 1.66666666666667e-01 1171 1149 -1.66666666666667e-01 1171 938 -8.33333333333333e-02 1171 932 8.33333333333333e-02 1171 1238 -1.66666666666667e-01 1171 755 1.66666666666667e-01 1171 754 -7.50000000000000e-01 1171 1236 8.33333333333333e-02 1171 936 -8.33333333333333e-02 1171 1184 1.66666666666667e-01 1171 1172 -3.33333333333333e-01 1171 731 1.66666666666667e-01 1171 1183 -2.50000000000000e-01 1171 1095 8.33333333333333e-02 1171 730 -7.50000000000000e-01 1171 1182 -8.33333333333333e-02 1171 930 8.33333333333333e-02 1172 1172 2.50000000000000e+00 1172 1096 -1.66666666666667e-01 1172 1095 8.33333333333333e-02 1172 1109 -7.50000000000000e-01 1172 1108 1.66666666666667e-01 1172 1233 8.33333333333333e-02 1172 1234 8.33333333333333e-02 1172 1175 -2.50000000000000e-01 1172 1174 -8.33333333333333e-02 1172 1173 1.66666666666667e-01 1172 1170 -3.33333333333333e-01 1172 753 -8.33333333333333e-02 1172 729 -8.33333333333333e-02 1172 1083 -8.33333333333333e-02 1172 1149 8.33333333333333e-02 1172 1157 -2.50000000000000e-01 1172 1093 8.33333333333333e-02 1172 1156 -8.33333333333333e-02 1172 1092 -1.66666666666667e-01 1172 1155 1.66666666666667e-01 1172 1084 -8.33333333333333e-02 1172 1150 8.33333333333333e-02 1172 936 -8.33333333333333e-02 1172 1236 8.33333333333333e-02 1172 937 -8.33333333333333e-02 1172 931 8.33333333333333e-02 1172 755 -2.50000000000000e-01 1172 1237 -1.66666666666667e-01 1172 754 1.66666666666667e-01 1172 1184 -7.50000000000000e-01 1172 1107 1.66666666666667e-01 1172 731 -2.50000000000000e-01 1172 1183 1.66666666666667e-01 1172 1171 -3.33333333333333e-01 1172 730 1.66666666666667e-01 1172 1182 1.66666666666667e-01 1172 930 -1.66666666666667e-01 1173 1173 2.50000000000000e+00 1173 1109 -1.66666666666667e-01 1173 1235 -8.33333333333333e-02 1173 937 8.33333333333333e-02 1173 938 8.33333333333333e-02 1173 1234 1.66666666666667e-01 1173 1233 -2.50000000000000e-01 1173 1172 1.66666666666667e-01 1173 1171 1.66666666666667e-01 1173 1170 -7.50000000000000e-01 1173 1096 -8.33333333333333e-02 1173 1097 -8.33333333333333e-02 1173 1111 -8.33333333333333e-02 1173 1102 8.33333333333333e-02 1173 1103 8.33333333333333e-02 1173 1112 1.66666666666667e-01 1173 1175 -3.33333333333333e-01 1173 1110 -2.50000000000000e-01 1173 931 -8.33333333333333e-02 1173 1174 -3.33333333333333e-01 1173 1199 1.66666666666667e-01 1173 940 -8.33333333333333e-02 1173 934 8.33333333333333e-02 1173 932 1.66666666666667e-01 1173 935 -1.66666666666667e-01 1173 758 8.33333333333333e-02 1173 941 -8.33333333333333e-02 1173 1198 1.66666666666667e-01 1173 757 -1.66666666666667e-01 1173 1197 -7.50000000000000e-01 1173 1169 -8.33333333333333e-02 1173 731 8.33333333333333e-02 1173 1168 1.66666666666667e-01 1173 730 -1.66666666666667e-01 1173 1167 -2.50000000000000e-01 1173 1108 8.33333333333333e-02 1173 930 -2.50000000000000e-01 1174 1174 2.50000000000000e+00 1174 1109 8.33333333333333e-02 1174 1235 1.66666666666667e-01 1174 936 8.33333333333333e-02 1174 938 -1.66666666666667e-01 1174 1234 -7.50000000000000e-01 1174 1233 1.66666666666667e-01 1174 1172 -8.33333333333333e-02 1174 1171 -2.50000000000000e-01 1174 1170 1.66666666666667e-01 1174 1095 -8.33333333333333e-02 1174 1112 1.66666666666667e-01 1174 1110 -8.33333333333333e-02 1174 1101 8.33333333333333e-02 1174 1103 -1.66666666666667e-01 1174 758 8.33333333333333e-02 1174 1111 -2.50000000000000e-01 1174 1097 -8.33333333333333e-02 1174 731 8.33333333333333e-02 1174 930 -8.33333333333333e-02 1174 1199 -8.33333333333333e-02 1174 1173 -3.33333333333333e-01 1174 939 -8.33333333333333e-02 1174 933 8.33333333333333e-02 1174 941 -8.33333333333333e-02 1174 935 8.33333333333333e-02 1174 1198 -2.50000000000000e-01 1174 1197 1.66666666666667e-01 1174 756 -1.66666666666667e-01 1174 1169 1.66666666666667e-01 1174 1175 -3.33333333333333e-01 1174 932 1.66666666666667e-01 1174 1168 -7.50000000000000e-01 1174 1107 8.33333333333333e-02 1174 931 -2.50000000000000e-01 1174 1167 1.66666666666667e-01 1174 729 -1.66666666666667e-01 1175 1175 2.50000000000000e+00 1175 1107 -1.66666666666667e-01 1175 1233 -8.33333333333333e-02 1175 1234 1.66666666666667e-01 1175 937 -1.66666666666667e-01 1175 936 8.33333333333333e-02 1175 1235 -2.50000000000000e-01 1175 1172 -2.50000000000000e-01 1175 1171 -8.33333333333333e-02 1175 1170 1.66666666666667e-01 1175 1095 -8.33333333333333e-02 1175 1111 1.66666666666667e-01 1175 1102 -1.66666666666667e-01 1175 1101 8.33333333333333e-02 1175 1112 -7.50000000000000e-01 1175 757 8.33333333333333e-02 1175 1110 1.66666666666667e-01 1175 1173 -3.33333333333333e-01 1175 1096 -8.33333333333333e-02 1175 730 8.33333333333333e-02 1175 1198 -8.33333333333333e-02 1175 1197 1.66666666666667e-01 1175 940 -8.33333333333333e-02 1175 934 8.33333333333333e-02 1175 930 1.66666666666667e-01 1175 933 -1.66666666666667e-01 1175 1199 -2.50000000000000e-01 1175 756 8.33333333333333e-02 1175 939 -8.33333333333333e-02 1175 1169 -2.50000000000000e-01 1175 1108 8.33333333333333e-02 1175 932 -7.50000000000000e-01 1175 1168 1.66666666666667e-01 1175 1174 -3.33333333333333e-01 1175 931 1.66666666666667e-01 1175 1167 -8.33333333333333e-02 1175 729 8.33333333333333e-02 1176 1176 2.50000000000000e+00 1176 1151 -1.66666666666667e-01 1176 1150 8.33333333333333e-02 1176 1163 1.66666666666667e-01 1176 1161 -7.50000000000000e-01 1176 1273 8.33333333333333e-02 1176 1274 8.33333333333333e-02 1176 1184 -8.33333333333333e-02 1176 1183 1.66666666666667e-01 1176 1182 -2.50000000000000e-01 1176 1120 -8.33333333333333e-02 1176 1121 -8.33333333333333e-02 1176 1130 8.33333333333333e-02 1176 1129 -1.66666666666667e-01 1176 1133 8.33333333333333e-02 1176 1145 -8.33333333333333e-02 1176 1177 -3.33333333333333e-01 1176 1144 1.66666666666667e-01 1176 1132 8.33333333333333e-02 1176 730 -8.33333333333333e-02 1176 772 -8.33333333333333e-02 1176 1143 -2.50000000000000e-01 1176 932 8.33333333333333e-02 1176 944 -8.33333333333333e-02 1176 1270 8.33333333333333e-02 1176 943 -8.33333333333333e-02 1176 773 1.66666666666667e-01 1176 1271 -1.66666666666667e-01 1176 771 -2.50000000000000e-01 1176 1178 -3.33333333333333e-01 1176 1181 1.66666666666667e-01 1176 731 1.66666666666667e-01 1176 1180 1.66666666666667e-01 1176 931 -1.66666666666667e-01 1176 1162 1.66666666666667e-01 1176 1179 -7.50000000000000e-01 1176 729 -2.50000000000000e-01 1177 1177 2.50000000000000e+00 1177 1163 -8.33333333333333e-02 1177 1161 1.66666666666667e-01 1177 1149 8.33333333333333e-02 1177 1162 -2.50000000000000e-01 1177 1272 8.33333333333333e-02 1177 1274 -1.66666666666667e-01 1177 1184 1.66666666666667e-01 1177 1183 -7.50000000000000e-01 1177 1182 1.66666666666667e-01 1177 1119 -8.33333333333333e-02 1177 1121 -8.33333333333333e-02 1177 1130 8.33333333333333e-02 1177 1128 -1.66666666666667e-01 1177 1176 -3.33333333333333e-01 1177 1143 1.66666666666667e-01 1177 1133 -1.66666666666667e-01 1177 731 1.66666666666667e-01 1177 1131 8.33333333333333e-02 1177 729 -8.33333333333333e-02 1177 1145 1.66666666666667e-01 1177 1178 -3.33333333333333e-01 1177 773 1.66666666666667e-01 1177 1144 -7.50000000000000e-01 1177 771 -8.33333333333333e-02 1177 1269 8.33333333333333e-02 1177 942 -8.33333333333333e-02 1177 1271 8.33333333333333e-02 1177 944 -8.33333333333333e-02 1177 772 -2.50000000000000e-01 1177 1181 -8.33333333333333e-02 1177 932 8.33333333333333e-02 1177 1151 8.33333333333333e-02 1177 1180 -2.50000000000000e-01 1177 730 -2.50000000000000e-01 1177 1179 1.66666666666667e-01 1177 930 -1.66666666666667e-01 1178 1178 2.50000000000000e+00 1178 1162 -8.33333333333333e-02 1178 1149 -1.66666666666667e-01 1178 1163 -2.50000000000000e-01 1178 1161 1.66666666666667e-01 1178 1273 -1.66666666666667e-01 1178 1272 8.33333333333333e-02 1178 1184 -2.50000000000000e-01 1178 1183 1.66666666666667e-01 1178 1182 -8.33333333333333e-02 1178 1120 -8.33333333333333e-02 1178 1129 8.33333333333333e-02 1178 1119 -8.33333333333333e-02 1178 1128 8.33333333333333e-02 1178 1131 8.33333333333333e-02 1178 1143 -8.33333333333333e-02 1178 1132 -1.66666666666667e-01 1178 730 1.66666666666667e-01 1178 1145 -2.50000000000000e-01 1178 1144 1.66666666666667e-01 1178 1177 -3.33333333333333e-01 1178 772 1.66666666666667e-01 1178 930 8.33333333333333e-02 1178 942 -8.33333333333333e-02 1178 773 -7.50000000000000e-01 1178 1270 8.33333333333333e-02 1178 943 -8.33333333333333e-02 1178 771 1.66666666666667e-01 1178 1269 -1.66666666666667e-01 1178 1150 8.33333333333333e-02 1178 1181 -2.50000000000000e-01 1178 731 -7.50000000000000e-01 1178 1180 -8.33333333333333e-02 1178 931 8.33333333333333e-02 1178 1176 -3.33333333333333e-01 1178 1179 1.66666666666667e-01 1178 729 1.66666666666667e-01 1179 1179 2.50000000000000e+00 1179 1138 8.33333333333333e-02 1179 1201 1.66666666666667e-01 1179 935 8.33333333333333e-02 1179 934 -1.66666666666667e-01 1179 1202 1.66666666666667e-01 1179 1200 -7.50000000000000e-01 1179 1169 1.66666666666667e-01 1179 1168 -8.33333333333333e-02 1179 1167 -2.50000000000000e-01 1179 1133 -8.33333333333333e-02 1179 1148 -8.33333333333333e-02 1179 1145 8.33333333333333e-02 1179 1147 1.66666666666667e-01 1179 1144 -1.66666666666667e-01 1179 775 8.33333333333333e-02 1179 1146 -2.50000000000000e-01 1179 1132 -8.33333333333333e-02 1179 730 8.33333333333333e-02 1179 932 -8.33333333333333e-02 1179 1181 -3.33333333333333e-01 1179 1270 -8.33333333333333e-02 1179 947 -8.33333333333333e-02 1179 944 8.33333333333333e-02 1179 946 -8.33333333333333e-02 1179 943 8.33333333333333e-02 1179 1271 1.66666666666667e-01 1179 776 -1.66666666666667e-01 1179 1269 -2.50000000000000e-01 1179 1178 1.66666666666667e-01 1179 731 -1.66666666666667e-01 1179 1177 1.66666666666667e-01 1179 1180 -3.33333333333333e-01 1179 931 1.66666666666667e-01 1179 1176 -7.50000000000000e-01 1179 1139 8.33333333333333e-02 1179 930 -2.50000000000000e-01 1180 1180 2.50000000000000e+00 1180 1137 8.33333333333333e-02 1180 1202 -8.33333333333333e-02 1180 935 8.33333333333333e-02 1180 1200 1.66666666666667e-01 1180 933 -1.66666666666667e-01 1180 1201 -2.50000000000000e-01 1180 1169 1.66666666666667e-01 1180 1168 -2.50000000000000e-01 1180 1167 -8.33333333333333e-02 1180 1133 -8.33333333333333e-02 1180 1146 1.66666666666667e-01 1180 1145 8.33333333333333e-02 1180 1143 -1.66666666666667e-01 1180 1148 1.66666666666667e-01 1180 1181 -3.33333333333333e-01 1180 1147 -7.50000000000000e-01 1180 774 8.33333333333333e-02 1180 1131 -8.33333333333333e-02 1180 729 8.33333333333333e-02 1180 1269 -8.33333333333333e-02 1180 1271 1.66666666666667e-01 1180 932 1.66666666666667e-01 1180 944 -1.66666666666667e-01 1180 945 -8.33333333333333e-02 1180 942 8.33333333333333e-02 1180 776 8.33333333333333e-02 1180 947 -8.33333333333333e-02 1180 1270 -2.50000000000000e-01 1180 1178 -8.33333333333333e-02 1180 731 8.33333333333333e-02 1180 1177 -2.50000000000000e-01 1180 1139 -1.66666666666667e-01 1180 931 -7.50000000000000e-01 1180 1176 1.66666666666667e-01 1180 1179 -3.33333333333333e-01 1180 930 1.66666666666667e-01 1181 1181 2.50000000000000e+00 1181 1138 -1.66666666666667e-01 1181 1201 -8.33333333333333e-02 1181 934 8.33333333333333e-02 1181 933 8.33333333333333e-02 1181 1202 -2.50000000000000e-01 1181 1200 1.66666666666667e-01 1181 1169 -7.50000000000000e-01 1181 1168 1.66666666666667e-01 1181 1167 1.66666666666667e-01 1181 1131 -8.33333333333333e-02 1181 1132 -8.33333333333333e-02 1181 1146 -8.33333333333333e-02 1181 1143 8.33333333333333e-02 1181 1144 8.33333333333333e-02 1181 1148 -2.50000000000000e-01 1181 1147 1.66666666666667e-01 1181 1180 -3.33333333333333e-01 1181 930 -8.33333333333333e-02 1181 1179 -3.33333333333333e-01 1181 1270 1.66666666666667e-01 1181 945 -8.33333333333333e-02 1181 942 8.33333333333333e-02 1181 931 1.66666666666667e-01 1181 943 -1.66666666666667e-01 1181 1271 -7.50000000000000e-01 1181 775 8.33333333333333e-02 1181 946 -8.33333333333333e-02 1181 1269 1.66666666666667e-01 1181 774 -1.66666666666667e-01 1181 1178 -2.50000000000000e-01 1181 1137 8.33333333333333e-02 1181 932 -2.50000000000000e-01 1181 1177 -8.33333333333333e-02 1181 730 8.33333333333333e-02 1181 1176 1.66666666666667e-01 1181 729 -1.66666666666667e-01 1182 1182 2.50000000000000e+00 1182 1156 8.33333333333333e-02 1182 938 8.33333333333333e-02 1182 1238 -8.33333333333333e-02 1182 1237 1.66666666666667e-01 1182 937 -1.66666666666667e-01 1182 1236 -2.50000000000000e-01 1182 1172 1.66666666666667e-01 1182 1171 -8.33333333333333e-02 1182 1170 -2.50000000000000e-01 1182 1151 -8.33333333333333e-02 1182 1165 1.66666666666667e-01 1182 1163 8.33333333333333e-02 1182 1162 -1.66666666666667e-01 1182 1166 1.66666666666667e-01 1182 1184 -3.33333333333333e-01 1182 781 8.33333333333333e-02 1182 1164 -7.50000000000000e-01 1182 1150 -8.33333333333333e-02 1182 730 8.33333333333333e-02 1182 1273 -8.33333333333333e-02 1182 1274 1.66666666666667e-01 1182 932 1.66666666666667e-01 1182 944 -1.66666666666667e-01 1182 949 -8.33333333333333e-02 1182 943 8.33333333333333e-02 1182 782 8.33333333333333e-02 1182 950 -8.33333333333333e-02 1182 1272 -2.50000000000000e-01 1182 1178 -8.33333333333333e-02 1182 731 8.33333333333333e-02 1182 1183 -3.33333333333333e-01 1182 1177 1.66666666666667e-01 1182 931 1.66666666666667e-01 1182 1157 -1.66666666666667e-01 1182 1176 -2.50000000000000e-01 1182 930 -7.50000000000000e-01 1183 1183 2.50000000000000e+00 1183 1155 8.33333333333333e-02 1183 1236 1.66666666666667e-01 1183 938 8.33333333333333e-02 1183 936 -1.66666666666667e-01 1183 1238 1.66666666666667e-01 1183 1237 -7.50000000000000e-01 1183 1172 1.66666666666667e-01 1183 1171 -2.50000000000000e-01 1183 1170 -8.33333333333333e-02 1183 1151 -8.33333333333333e-02 1183 1166 -8.33333333333333e-02 1183 1163 8.33333333333333e-02 1183 1164 1.66666666666667e-01 1183 1161 -1.66666666666667e-01 1183 1165 -2.50000000000000e-01 1183 780 8.33333333333333e-02 1183 1149 -8.33333333333333e-02 1183 729 8.33333333333333e-02 1183 932 -8.33333333333333e-02 1183 1184 -3.33333333333333e-01 1183 1272 -8.33333333333333e-02 1183 950 -8.33333333333333e-02 1183 944 8.33333333333333e-02 1183 948 -8.33333333333333e-02 1183 942 8.33333333333333e-02 1183 782 -1.66666666666667e-01 1183 1274 1.66666666666667e-01 1183 1273 -2.50000000000000e-01 1183 1178 1.66666666666667e-01 1183 731 -1.66666666666667e-01 1183 1157 8.33333333333333e-02 1183 1177 -7.50000000000000e-01 1183 931 -2.50000000000000e-01 1183 1182 -3.33333333333333e-01 1183 1176 1.66666666666667e-01 1183 930 1.66666666666667e-01 1184 1184 2.50000000000000e+00 1184 1155 -1.66666666666667e-01 1184 936 8.33333333333333e-02 1184 1236 -8.33333333333333e-02 1184 937 8.33333333333333e-02 1184 1238 -2.50000000000000e-01 1184 1237 1.66666666666667e-01 1184 1172 -7.50000000000000e-01 1184 1171 1.66666666666667e-01 1184 1170 1.66666666666667e-01 1184 1150 -8.33333333333333e-02 1184 1149 -8.33333333333333e-02 1184 1165 -8.33333333333333e-02 1184 1162 8.33333333333333e-02 1184 1161 8.33333333333333e-02 1184 1166 -2.50000000000000e-01 1184 1164 1.66666666666667e-01 1184 1182 -3.33333333333333e-01 1184 931 -8.33333333333333e-02 1184 1183 -3.33333333333333e-01 1184 949 -8.33333333333333e-02 1184 943 8.33333333333333e-02 1184 1272 1.66666666666667e-01 1184 930 1.66666666666667e-01 1184 942 -1.66666666666667e-01 1184 1274 -7.50000000000000e-01 1184 781 -1.66666666666667e-01 1184 1273 1.66666666666667e-01 1184 780 8.33333333333333e-02 1184 948 -8.33333333333333e-02 1184 1156 8.33333333333333e-02 1184 1178 -2.50000000000000e-01 1184 932 -2.50000000000000e-01 1184 1177 1.66666666666667e-01 1184 730 -1.66666666666667e-01 1184 1176 -8.33333333333333e-02 1184 729 8.33333333333333e-02 1185 1185 1.25000000000000e+00 1185 1199 4.16666666666667e-02 1185 1189 8.33333333333333e-02 1185 1186 -1.66666666666667e-01 1185 1102 1.66666666666667e-01 1185 1100 -1.66666666666667e-01 1185 734 8.33333333333333e-02 1185 1099 8.33333333333333e-02 1185 733 -4.16666666666667e-02 1185 1188 -1.25000000000000e-01 1185 1103 1.66666666666667e-01 1185 1187 -1.66666666666667e-01 1185 740 8.33333333333333e-02 1185 1198 4.16666666666667e-02 1185 739 -4.16666666666667e-02 1185 1101 -7.50000000000000e-01 1185 1069 -8.33333333333333e-02 1185 823 4.16666666666667e-02 1185 824 4.16666666666667e-02 1185 1070 -8.33333333333333e-02 1185 732 -1.25000000000000e-01 1185 830 -4.16666666666667e-02 1185 1076 8.33333333333333e-02 1185 829 8.33333333333333e-02 1185 1075 -1.66666666666667e-01 1185 828 -1.25000000000000e-01 1185 1190 -4.16666666666667e-02 1185 738 -1.25000000000000e-01 1186 1186 1.25000000000000e+00 1186 1103 -8.33333333333333e-02 1186 1188 8.33333333333333e-02 1186 1185 -1.66666666666667e-01 1186 1101 1.66666666666667e-01 1186 1190 8.33333333333333e-02 1186 1189 -3.75000000000000e-01 1186 1098 8.33333333333333e-02 1186 732 -4.16666666666667e-02 1186 1199 -8.33333333333333e-02 1186 1102 -2.50000000000000e-01 1186 1197 4.16666666666667e-02 1186 738 -4.16666666666667e-02 1186 1068 -8.33333333333333e-02 1186 822 4.16666666666667e-02 1186 1070 -8.33333333333333e-02 1186 1076 8.33333333333333e-02 1186 824 -8.33333333333333e-02 1186 734 8.33333333333333e-02 1186 733 -1.25000000000000e-01 1186 830 8.33333333333333e-02 1186 1187 -1.66666666666667e-01 1186 740 8.33333333333333e-02 1186 829 -3.75000000000000e-01 1186 1100 8.33333333333333e-02 1186 739 -1.25000000000000e-01 1186 828 8.33333333333333e-02 1186 1074 -1.66666666666667e-01 1187 1187 1.25000000000000e+00 1187 1102 -8.33333333333333e-02 1187 1188 -4.16666666666667e-02 1187 1197 4.16666666666667e-02 1187 1190 -1.25000000000000e-01 1187 1189 8.33333333333333e-02 1187 1098 -1.66666666666667e-01 1187 732 8.33333333333333e-02 1187 1103 -2.50000000000000e-01 1187 1198 -8.33333333333333e-02 1187 1101 1.66666666666667e-01 1187 1185 -1.66666666666667e-01 1187 738 8.33333333333333e-02 1187 1069 -8.33333333333333e-02 1187 1075 8.33333333333333e-02 1187 734 -3.75000000000000e-01 1187 823 -8.33333333333333e-02 1187 733 8.33333333333333e-02 1187 822 4.16666666666667e-02 1187 1068 -8.33333333333333e-02 1187 830 -1.25000000000000e-01 1187 1099 8.33333333333333e-02 1187 740 -3.75000000000000e-01 1187 829 8.33333333333333e-02 1187 1186 -1.66666666666667e-01 1187 739 8.33333333333333e-02 1187 828 -4.16666666666667e-02 1187 1074 8.33333333333333e-02 1188 1188 1.25000000000000e+00 1188 1103 8.33333333333333e-02 1188 1186 8.33333333333333e-02 1188 1102 -1.66666666666667e-01 1188 733 4.16666666666667e-02 1188 1185 -1.25000000000000e-01 1188 1190 -1.66666666666667e-01 1188 1199 8.33333333333333e-02 1188 757 4.16666666666667e-02 1188 1198 -4.16666666666667e-02 1188 1197 -1.25000000000000e-01 1188 1099 -8.33333333333333e-02 1188 860 8.33333333333333e-02 1188 856 8.33333333333333e-02 1188 859 -4.16666666666667e-02 1188 857 -1.66666666666667e-01 1188 1112 1.66666666666667e-01 1188 734 4.16666666666667e-02 1188 1100 -8.33333333333333e-02 1188 858 -1.25000000000000e-01 1188 866 -4.16666666666667e-02 1188 758 4.16666666666667e-02 1188 1189 -1.66666666666667e-01 1188 865 8.33333333333333e-02 1188 1111 1.66666666666667e-01 1188 1187 -4.16666666666667e-02 1188 864 -1.25000000000000e-01 1188 1110 -7.50000000000000e-01 1189 1189 1.25000000000000e+00 1189 1185 8.33333333333333e-02 1189 1101 -1.66666666666667e-01 1189 1187 8.33333333333333e-02 1189 1186 -3.75000000000000e-01 1189 732 4.16666666666667e-02 1189 1199 8.33333333333333e-02 1189 1198 -1.25000000000000e-01 1189 756 4.16666666666667e-02 1189 1197 -4.16666666666667e-02 1189 1098 -8.33333333333333e-02 1189 1100 -8.33333333333333e-02 1189 1190 -1.66666666666667e-01 1189 855 8.33333333333333e-02 1189 858 -4.16666666666667e-02 1189 857 8.33333333333333e-02 1189 1112 -8.33333333333333e-02 1189 734 -8.33333333333333e-02 1189 860 8.33333333333333e-02 1189 859 -1.25000000000000e-01 1189 866 8.33333333333333e-02 1189 758 -8.33333333333333e-02 1189 1103 8.33333333333333e-02 1189 865 -3.75000000000000e-01 1189 1111 -2.50000000000000e-01 1189 1188 -1.66666666666667e-01 1189 864 8.33333333333333e-02 1189 1110 1.66666666666667e-01 1190 1190 1.25000000000000e+00 1190 1185 -4.16666666666667e-02 1190 1101 8.33333333333333e-02 1190 1187 -1.25000000000000e-01 1190 1186 8.33333333333333e-02 1190 1199 -3.75000000000000e-01 1190 1198 8.33333333333333e-02 1190 1188 -1.66666666666667e-01 1190 1197 8.33333333333333e-02 1190 1099 -8.33333333333333e-02 1190 1189 -1.66666666666667e-01 1190 858 8.33333333333333e-02 1190 856 8.33333333333333e-02 1190 1111 -8.33333333333333e-02 1190 855 -1.66666666666667e-01 1190 1110 1.66666666666667e-01 1190 860 -3.75000000000000e-01 1190 733 -8.33333333333333e-02 1190 859 8.33333333333333e-02 1190 732 4.16666666666667e-02 1190 1098 -8.33333333333333e-02 1190 1102 8.33333333333333e-02 1190 866 -1.25000000000000e-01 1190 1112 -2.50000000000000e-01 1190 865 8.33333333333333e-02 1190 757 -8.33333333333333e-02 1190 864 -4.16666666666667e-02 1190 756 4.16666666666667e-02 1191 1191 1.25000000000000e+00 1191 1196 8.33333333333333e-02 1191 1195 -4.16666666666667e-02 1191 1201 4.16666666666667e-02 1191 1202 4.16666666666667e-02 1191 740 -4.16666666666667e-02 1191 737 -4.16666666666667e-02 1191 1194 -1.25000000000000e-01 1191 1136 8.33333333333333e-02 1191 736 8.33333333333333e-02 1191 1135 -1.66666666666667e-01 1191 1139 1.66666666666667e-01 1191 1192 -1.66666666666667e-01 1191 739 8.33333333333333e-02 1191 1138 1.66666666666667e-01 1191 1137 -7.50000000000000e-01 1191 827 4.16666666666667e-02 1191 1073 -8.33333333333333e-02 1191 826 4.16666666666667e-02 1191 1072 -8.33333333333333e-02 1191 735 -1.25000000000000e-01 1191 830 8.33333333333333e-02 1191 1076 -1.66666666666667e-01 1191 829 -4.16666666666667e-02 1191 1075 8.33333333333333e-02 1191 828 -1.25000000000000e-01 1191 1193 -1.66666666666667e-01 1191 738 -1.25000000000000e-01 1192 1192 1.25000000000000e+00 1192 1200 4.16666666666667e-02 1192 1202 -8.33333333333333e-02 1192 1196 8.33333333333333e-02 1192 1195 -1.25000000000000e-01 1192 1136 8.33333333333333e-02 1192 735 8.33333333333333e-02 1192 1134 -1.66666666666667e-01 1192 1139 -8.33333333333333e-02 1192 1138 -2.50000000000000e-01 1192 1191 -1.66666666666667e-01 1192 738 8.33333333333333e-02 1192 1137 1.66666666666667e-01 1192 1076 8.33333333333333e-02 1192 1073 -8.33333333333333e-02 1192 827 -8.33333333333333e-02 1192 737 8.33333333333333e-02 1192 736 -3.75000000000000e-01 1192 825 4.16666666666667e-02 1192 1071 -8.33333333333333e-02 1192 830 8.33333333333333e-02 1192 1193 -1.66666666666667e-01 1192 740 8.33333333333333e-02 1192 829 -1.25000000000000e-01 1192 1194 -4.16666666666667e-02 1192 739 -3.75000000000000e-01 1192 828 -4.16666666666667e-02 1192 1074 8.33333333333333e-02 1193 1193 1.25000000000000e+00 1193 1194 8.33333333333333e-02 1193 1201 -8.33333333333333e-02 1193 1200 4.16666666666667e-02 1193 738 -4.16666666666667e-02 1193 1196 -3.75000000000000e-01 1193 1195 8.33333333333333e-02 1193 735 -4.16666666666667e-02 1193 1134 8.33333333333333e-02 1193 1135 8.33333333333333e-02 1193 1139 -2.50000000000000e-01 1193 1138 -8.33333333333333e-02 1193 1137 1.66666666666667e-01 1193 1075 8.33333333333333e-02 1193 1072 -8.33333333333333e-02 1193 825 4.16666666666667e-02 1193 1071 -8.33333333333333e-02 1193 737 -1.25000000000000e-01 1193 826 -8.33333333333333e-02 1193 736 8.33333333333333e-02 1193 830 -3.75000000000000e-01 1193 1191 -1.66666666666667e-01 1193 740 -1.25000000000000e-01 1193 829 8.33333333333333e-02 1193 1192 -1.66666666666667e-01 1193 739 8.33333333333333e-02 1193 828 8.33333333333333e-02 1193 1074 -1.66666666666667e-01 1194 1194 1.25000000000000e+00 1194 1192 -4.16666666666667e-02 1194 1139 -1.66666666666667e-01 1194 1138 8.33333333333333e-02 1194 776 4.16666666666667e-02 1194 1202 -4.16666666666667e-02 1194 1201 8.33333333333333e-02 1194 1195 -1.66666666666667e-01 1194 1200 -1.25000000000000e-01 1194 737 4.16666666666667e-02 1194 1191 -1.25000000000000e-01 1194 896 -4.16666666666667e-02 1194 895 8.33333333333333e-02 1194 1136 -8.33333333333333e-02 1194 893 8.33333333333333e-02 1194 1147 1.66666666666667e-01 1194 892 -1.66666666666667e-01 1194 736 4.16666666666667e-02 1194 1135 -8.33333333333333e-02 1194 894 -1.25000000000000e-01 1194 1196 -1.66666666666667e-01 1194 902 8.33333333333333e-02 1194 1148 1.66666666666667e-01 1194 901 -4.16666666666667e-02 1194 775 4.16666666666667e-02 1194 1193 8.33333333333333e-02 1194 900 -1.25000000000000e-01 1194 1146 -7.50000000000000e-01 1195 1195 1.25000000000000e+00 1195 1139 8.33333333333333e-02 1195 1137 8.33333333333333e-02 1195 1202 8.33333333333333e-02 1195 1201 -3.75000000000000e-01 1195 1200 8.33333333333333e-02 1195 1194 -1.66666666666667e-01 1195 1193 8.33333333333333e-02 1195 1192 -1.25000000000000e-01 1195 1148 -8.33333333333333e-02 1195 1196 -1.66666666666667e-01 1195 1136 -8.33333333333333e-02 1195 893 8.33333333333333e-02 1195 894 8.33333333333333e-02 1195 1146 1.66666666666667e-01 1195 891 -1.66666666666667e-01 1195 737 -8.33333333333333e-02 1195 896 8.33333333333333e-02 1195 895 -3.75000000000000e-01 1195 735 4.16666666666667e-02 1195 1134 -8.33333333333333e-02 1195 902 8.33333333333333e-02 1195 776 -8.33333333333333e-02 1195 1191 -4.16666666666667e-02 1195 901 -1.25000000000000e-01 1195 1147 -2.50000000000000e-01 1195 900 -4.16666666666667e-02 1195 774 4.16666666666667e-02 1196 1196 1.25000000000000e+00 1196 1138 8.33333333333333e-02 1196 1137 -1.66666666666667e-01 1196 1202 -1.25000000000000e-01 1196 1201 8.33333333333333e-02 1196 774 4.16666666666667e-02 1196 1200 -4.16666666666667e-02 1196 1193 -3.75000000000000e-01 1196 1192 8.33333333333333e-02 1196 735 4.16666666666667e-02 1196 1147 -8.33333333333333e-02 1196 1195 -1.66666666666667e-01 1196 894 -4.16666666666667e-02 1196 1135 -8.33333333333333e-02 1196 892 8.33333333333333e-02 1196 1134 -8.33333333333333e-02 1196 891 8.33333333333333e-02 1196 896 -1.25000000000000e-01 1196 736 -8.33333333333333e-02 1196 895 8.33333333333333e-02 1196 1191 8.33333333333333e-02 1196 902 -3.75000000000000e-01 1196 1148 -2.50000000000000e-01 1196 901 8.33333333333333e-02 1196 775 -8.33333333333333e-02 1196 1194 -1.66666666666667e-01 1196 900 8.33333333333333e-02 1196 1146 1.66666666666667e-01 1197 1197 1.25000000000000e+00 1197 1190 8.33333333333333e-02 1197 1189 -4.16666666666667e-02 1197 1188 -1.25000000000000e-01 1197 1186 4.16666666666667e-02 1197 1111 8.33333333333333e-02 1197 1102 -8.33333333333333e-02 1197 1103 -8.33333333333333e-02 1197 1112 -1.66666666666667e-01 1197 1175 1.66666666666667e-01 1197 1199 -1.66666666666667e-01 1197 935 8.33333333333333e-02 1197 940 4.16666666666667e-02 1197 934 -4.16666666666667e-02 1197 740 -4.16666666666667e-02 1197 1169 8.33333333333333e-02 1197 739 8.33333333333333e-02 1197 1168 -1.66666666666667e-01 1197 738 -1.25000000000000e-01 1197 933 -1.25000000000000e-01 1197 758 -4.16666666666667e-02 1197 941 4.16666666666667e-02 1197 1198 -1.66666666666667e-01 1197 757 8.33333333333333e-02 1197 1174 1.66666666666667e-01 1197 1187 4.16666666666667e-02 1197 756 -1.25000000000000e-01 1197 1173 -7.50000000000000e-01 1198 1198 1.25000000000000e+00 1198 1189 -1.25000000000000e-01 1198 1188 -4.16666666666667e-02 1198 1187 -8.33333333333333e-02 1198 1185 4.16666666666667e-02 1198 1110 8.33333333333333e-02 1198 1101 -8.33333333333333e-02 1198 1112 8.33333333333333e-02 1198 1103 -8.33333333333333e-02 1198 1175 -8.33333333333333e-02 1198 1169 8.33333333333333e-02 1198 939 4.16666666666667e-02 1198 933 -4.16666666666667e-02 1198 740 8.33333333333333e-02 1198 1199 -1.66666666666667e-01 1198 935 8.33333333333333e-02 1198 739 -3.75000000000000e-01 1198 934 -1.25000000000000e-01 1198 738 8.33333333333333e-02 1198 1167 -1.66666666666667e-01 1198 758 8.33333333333333e-02 1198 941 -8.33333333333333e-02 1198 1190 8.33333333333333e-02 1198 757 -3.75000000000000e-01 1198 1174 -2.50000000000000e-01 1198 1197 -1.66666666666667e-01 1198 756 8.33333333333333e-02 1198 1173 1.66666666666667e-01 1199 1199 1.25000000000000e+00 1199 1190 -3.75000000000000e-01 1199 1189 8.33333333333333e-02 1199 1188 8.33333333333333e-02 1199 1186 -8.33333333333333e-02 1199 1101 -8.33333333333333e-02 1199 1111 8.33333333333333e-02 1199 1110 -1.66666666666667e-01 1199 1102 -8.33333333333333e-02 1199 1174 -8.33333333333333e-02 1199 1168 8.33333333333333e-02 1199 1173 1.66666666666667e-01 1199 1197 -1.66666666666667e-01 1199 933 8.33333333333333e-02 1199 740 -1.25000000000000e-01 1199 935 -3.75000000000000e-01 1199 739 8.33333333333333e-02 1199 1198 -1.66666666666667e-01 1199 934 8.33333333333333e-02 1199 738 -4.16666666666667e-02 1199 1167 8.33333333333333e-02 1199 1185 4.16666666666667e-02 1199 758 -1.25000000000000e-01 1199 1175 -2.50000000000000e-01 1199 757 8.33333333333333e-02 1199 940 -8.33333333333333e-02 1199 756 -4.16666666666667e-02 1199 939 4.16666666666667e-02 1200 1200 1.25000000000000e+00 1200 1138 -8.33333333333333e-02 1200 1196 -4.16666666666667e-02 1200 1148 8.33333333333333e-02 1200 1195 8.33333333333333e-02 1200 1147 -1.66666666666667e-01 1200 1194 -1.25000000000000e-01 1200 1193 4.16666666666667e-02 1200 1139 -8.33333333333333e-02 1200 947 4.16666666666667e-02 1200 935 -4.16666666666667e-02 1200 1201 -1.66666666666667e-01 1200 934 8.33333333333333e-02 1200 1180 1.66666666666667e-01 1200 740 8.33333333333333e-02 1200 1169 -1.66666666666667e-01 1200 739 -4.16666666666667e-02 1200 1168 8.33333333333333e-02 1200 738 -1.25000000000000e-01 1200 933 -1.25000000000000e-01 1200 1202 -1.66666666666667e-01 1200 776 8.33333333333333e-02 1200 1181 1.66666666666667e-01 1200 775 -4.16666666666667e-02 1200 946 4.16666666666667e-02 1200 1192 4.16666666666667e-02 1200 774 -1.25000000000000e-01 1200 1179 -7.50000000000000e-01 1201 1201 1.25000000000000e+00 1201 1137 -8.33333333333333e-02 1201 1148 8.33333333333333e-02 1201 1139 -8.33333333333333e-02 1201 1196 8.33333333333333e-02 1201 1195 -3.75000000000000e-01 1201 1194 8.33333333333333e-02 1201 1146 -1.66666666666667e-01 1201 1193 -8.33333333333333e-02 1201 1169 8.33333333333333e-02 1201 1181 -8.33333333333333e-02 1201 1200 -1.66666666666667e-01 1201 933 8.33333333333333e-02 1201 1179 1.66666666666667e-01 1201 740 8.33333333333333e-02 1201 1202 -1.66666666666667e-01 1201 935 8.33333333333333e-02 1201 739 -1.25000000000000e-01 1201 934 -3.75000000000000e-01 1201 738 -4.16666666666667e-02 1201 1167 8.33333333333333e-02 1201 776 8.33333333333333e-02 1201 947 -8.33333333333333e-02 1201 1191 4.16666666666667e-02 1201 775 -1.25000000000000e-01 1201 1180 -2.50000000000000e-01 1201 774 -4.16666666666667e-02 1201 945 4.16666666666667e-02 1202 1202 1.25000000000000e+00 1202 1138 -8.33333333333333e-02 1202 1196 -1.25000000000000e-01 1202 1195 8.33333333333333e-02 1202 1194 -4.16666666666667e-02 1202 1146 8.33333333333333e-02 1202 1192 -8.33333333333333e-02 1202 1191 4.16666666666667e-02 1202 1137 -8.33333333333333e-02 1202 945 4.16666666666667e-02 1202 933 -4.16666666666667e-02 1202 1168 8.33333333333333e-02 1202 1180 -8.33333333333333e-02 1202 740 -3.75000000000000e-01 1202 935 -1.25000000000000e-01 1202 739 8.33333333333333e-02 1202 1201 -1.66666666666667e-01 1202 934 8.33333333333333e-02 1202 738 8.33333333333333e-02 1202 1167 -1.66666666666667e-01 1202 1147 8.33333333333333e-02 1202 776 -3.75000000000000e-01 1202 1181 -2.50000000000000e-01 1202 775 8.33333333333333e-02 1202 946 -8.33333333333333e-02 1202 1200 -1.66666666666667e-01 1202 774 8.33333333333333e-02 1202 1179 1.66666666666667e-01 1203 1203 1.25000000000000e+00 1203 995 -8.33333333333333e-02 1203 1204 -1.66666666666667e-01 1203 1207 8.33333333333333e-02 1203 994 1.66666666666667e-01 1203 1208 8.33333333333333e-02 1203 742 -4.16666666666667e-02 1203 991 8.33333333333333e-02 1203 1206 -3.75000000000000e-01 1203 1217 -8.33333333333333e-02 1203 1216 4.16666666666667e-02 1203 745 -4.16666666666667e-02 1203 993 -2.50000000000000e-01 1203 832 4.16666666666667e-02 1203 976 -8.33333333333333e-02 1203 977 -8.33333333333333e-02 1203 980 8.33333333333333e-02 1203 743 8.33333333333333e-02 1203 833 -8.33333333333333e-02 1203 741 -1.25000000000000e-01 1203 1205 -1.66666666666667e-01 1203 836 8.33333333333333e-02 1203 746 8.33333333333333e-02 1203 835 8.33333333333333e-02 1203 979 -1.66666666666667e-01 1203 992 8.33333333333333e-02 1203 834 -3.75000000000000e-01 1203 744 -1.25000000000000e-01 1204 1204 1.25000000000000e+00 1204 1217 4.16666666666667e-02 1204 1203 -1.66666666666667e-01 1204 1206 8.33333333333333e-02 1204 993 1.66666666666667e-01 1204 743 8.33333333333333e-02 1204 992 -1.66666666666667e-01 1204 1207 -1.25000000000000e-01 1204 741 -4.16666666666667e-02 1204 990 8.33333333333333e-02 1204 1205 -1.66666666666667e-01 1204 995 1.66666666666667e-01 1204 746 8.33333333333333e-02 1204 994 -7.50000000000000e-01 1204 1215 4.16666666666667e-02 1204 744 -4.16666666666667e-02 1204 831 4.16666666666667e-02 1204 975 -8.33333333333333e-02 1204 833 4.16666666666667e-02 1204 977 -8.33333333333333e-02 1204 742 -1.25000000000000e-01 1204 836 -4.16666666666667e-02 1204 980 8.33333333333333e-02 1204 1208 -4.16666666666667e-02 1204 835 -1.25000000000000e-01 1204 745 -1.25000000000000e-01 1204 834 8.33333333333333e-02 1204 978 -1.66666666666667e-01 1205 1205 1.25000000000000e+00 1205 993 -8.33333333333333e-02 1205 1207 -4.16666666666667e-02 1205 1216 4.16666666666667e-02 1205 1208 -1.25000000000000e-01 1205 742 8.33333333333333e-02 1205 991 -1.66666666666667e-01 1205 1206 8.33333333333333e-02 1205 995 -2.50000000000000e-01 1205 1204 -1.66666666666667e-01 1205 994 1.66666666666667e-01 1205 745 8.33333333333333e-02 1205 1215 -8.33333333333333e-02 1205 975 -8.33333333333333e-02 1205 978 8.33333333333333e-02 1205 743 -3.75000000000000e-01 1205 832 4.16666666666667e-02 1205 976 -8.33333333333333e-02 1205 741 8.33333333333333e-02 1205 831 -8.33333333333333e-02 1205 990 8.33333333333333e-02 1205 836 -1.25000000000000e-01 1205 746 -3.75000000000000e-01 1205 835 -4.16666666666667e-02 1205 979 8.33333333333333e-02 1205 1203 -1.66666666666667e-01 1205 834 8.33333333333333e-02 1205 744 8.33333333333333e-02 1206 1206 1.25000000000000e+00 1206 1204 8.33333333333333e-02 1206 994 -1.66666666666667e-01 1206 1205 8.33333333333333e-02 1206 742 4.16666666666667e-02 1206 1203 -3.75000000000000e-01 1206 1217 8.33333333333333e-02 1206 751 4.16666666666667e-02 1206 1216 -4.16666666666667e-02 1206 1215 -1.25000000000000e-01 1206 991 -8.33333333333333e-02 1206 992 -8.33333333333333e-02 1206 1208 -1.66666666666667e-01 1206 844 -4.16666666666667e-02 1206 838 8.33333333333333e-02 1206 839 8.33333333333333e-02 1206 998 -8.33333333333333e-02 1206 845 8.33333333333333e-02 1206 743 -8.33333333333333e-02 1206 843 -1.25000000000000e-01 1206 851 8.33333333333333e-02 1206 752 -8.33333333333333e-02 1206 850 8.33333333333333e-02 1206 1207 -1.66666666666667e-01 1206 997 1.66666666666667e-01 1206 849 -3.75000000000000e-01 1206 995 8.33333333333333e-02 1206 996 -2.50000000000000e-01 1207 1207 1.25000000000000e+00 1207 995 8.33333333333333e-02 1207 1203 8.33333333333333e-02 1207 993 -1.66666666666667e-01 1207 1204 -1.25000000000000e-01 1207 741 4.16666666666667e-02 1207 1208 -1.66666666666667e-01 1207 1217 8.33333333333333e-02 1207 1216 -1.25000000000000e-01 1207 750 4.16666666666667e-02 1207 1215 -4.16666666666667e-02 1207 990 -8.33333333333333e-02 1207 845 8.33333333333333e-02 1207 843 -4.16666666666667e-02 1207 837 8.33333333333333e-02 1207 839 -1.66666666666667e-01 1207 998 1.66666666666667e-01 1207 743 4.16666666666667e-02 1207 992 -8.33333333333333e-02 1207 844 -1.25000000000000e-01 1207 851 -4.16666666666667e-02 1207 752 4.16666666666667e-02 1207 850 -1.25000000000000e-01 1207 1205 -4.16666666666667e-02 1207 997 -7.50000000000000e-01 1207 849 8.33333333333333e-02 1207 1206 -1.66666666666667e-01 1207 996 1.66666666666667e-01 1208 1208 1.25000000000000e+00 1208 1204 -4.16666666666667e-02 1208 994 8.33333333333333e-02 1208 1205 -1.25000000000000e-01 1208 1203 8.33333333333333e-02 1208 1217 -3.75000000000000e-01 1208 1207 -1.66666666666667e-01 1208 1216 8.33333333333333e-02 1208 1215 8.33333333333333e-02 1208 990 -8.33333333333333e-02 1208 844 8.33333333333333e-02 1208 1206 -1.66666666666667e-01 1208 838 -1.66666666666667e-01 1208 997 1.66666666666667e-01 1208 837 8.33333333333333e-02 1208 996 -8.33333333333333e-02 1208 845 -3.75000000000000e-01 1208 742 4.16666666666667e-02 1208 991 -8.33333333333333e-02 1208 843 8.33333333333333e-02 1208 741 -8.33333333333333e-02 1208 851 -1.25000000000000e-01 1208 993 8.33333333333333e-02 1208 998 -2.50000000000000e-01 1208 850 -4.16666666666667e-02 1208 751 4.16666666666667e-02 1208 849 8.33333333333333e-02 1208 750 -8.33333333333333e-02 1209 1209 1.25000000000000e+00 1209 1219 4.16666666666667e-02 1209 1220 -8.33333333333333e-02 1209 1214 8.33333333333333e-02 1209 1212 -1.25000000000000e-01 1209 1034 -8.33333333333333e-02 1209 745 8.33333333333333e-02 1209 1210 -1.66666666666667e-01 1209 1033 1.66666666666667e-01 1209 1032 -2.50000000000000e-01 1209 980 8.33333333333333e-02 1209 1211 -1.66666666666667e-01 1209 836 8.33333333333333e-02 1209 746 8.33333333333333e-02 1209 835 -4.16666666666667e-02 1209 979 8.33333333333333e-02 1209 1213 -4.16666666666667e-02 1209 834 -1.25000000000000e-01 1209 744 -3.75000000000000e-01 1209 599 8.33333333333333e-02 1209 106 8.33333333333333e-02 1209 598 -1.66666666666667e-01 1209 590 -8.33333333333333e-02 1209 107 8.33333333333333e-02 1209 233 -8.33333333333333e-02 1209 232 4.16666666666667e-02 1209 589 -8.33333333333333e-02 1209 105 -3.75000000000000e-01 1210 1210 1.25000000000000e+00 1210 1211 -1.66666666666667e-01 1210 1212 -4.16666666666667e-02 1210 1218 4.16666666666667e-02 1210 746 -4.16666666666667e-02 1210 1220 4.16666666666667e-02 1210 1213 -1.25000000000000e-01 1210 1034 1.66666666666667e-01 1210 1033 -7.50000000000000e-01 1210 744 8.33333333333333e-02 1210 1209 -1.66666666666667e-01 1210 1032 1.66666666666667e-01 1210 836 8.33333333333333e-02 1210 980 -1.66666666666667e-01 1210 1214 8.33333333333333e-02 1210 835 -1.25000000000000e-01 1210 745 -1.25000000000000e-01 1210 834 -4.16666666666667e-02 1210 978 8.33333333333333e-02 1210 107 -4.16666666666667e-02 1210 599 8.33333333333333e-02 1210 105 8.33333333333333e-02 1210 597 -1.66666666666667e-01 1210 233 4.16666666666667e-02 1210 590 -8.33333333333333e-02 1210 106 -1.25000000000000e-01 1210 231 4.16666666666667e-02 1210 588 -8.33333333333333e-02 1211 1211 1.25000000000000e+00 1211 1210 -1.66666666666667e-01 1211 745 -4.16666666666667e-02 1211 1219 4.16666666666667e-02 1211 1218 -8.33333333333333e-02 1211 1214 -3.75000000000000e-01 1211 1212 8.33333333333333e-02 1211 1034 -2.50000000000000e-01 1211 1033 1.66666666666667e-01 1211 1032 -8.33333333333333e-02 1211 978 8.33333333333333e-02 1211 1213 8.33333333333333e-02 1211 836 -3.75000000000000e-01 1211 746 -1.25000000000000e-01 1211 835 8.33333333333333e-02 1211 979 -1.66666666666667e-01 1211 1209 -1.66666666666667e-01 1211 834 8.33333333333333e-02 1211 744 8.33333333333333e-02 1211 106 -4.16666666666667e-02 1211 598 8.33333333333333e-02 1211 597 8.33333333333333e-02 1211 588 -8.33333333333333e-02 1211 232 4.16666666666667e-02 1211 589 -8.33333333333333e-02 1211 107 -1.25000000000000e-01 1211 105 8.33333333333333e-02 1211 231 -8.33333333333333e-02 1212 1212 1.25000000000000e+00 1212 1034 8.33333333333333e-02 1212 1033 8.33333333333333e-02 1212 1220 8.33333333333333e-02 1212 1219 8.33333333333333e-02 1212 1213 -1.66666666666667e-01 1212 1218 -3.75000000000000e-01 1212 1211 8.33333333333333e-02 1212 1209 -1.25000000000000e-01 1212 1040 -8.33333333333333e-02 1212 1214 -1.66666666666667e-01 1212 1039 1.66666666666667e-01 1212 905 8.33333333333333e-02 1212 779 -8.33333333333333e-02 1212 904 -4.16666666666667e-02 1212 778 4.16666666666667e-02 1212 903 -1.25000000000000e-01 1212 1210 -4.16666666666667e-02 1212 1038 -2.50000000000000e-01 1212 599 -8.33333333333333e-02 1212 317 8.33333333333333e-02 1212 322 8.33333333333333e-02 1212 316 -1.66666666666667e-01 1212 323 8.33333333333333e-02 1212 107 -8.33333333333333e-02 1212 106 4.16666666666667e-02 1212 598 -8.33333333333333e-02 1212 321 -3.75000000000000e-01 1213 1213 1.25000000000000e+00 1213 1209 -4.16666666666667e-02 1213 1034 -1.66666666666667e-01 1213 1032 8.33333333333333e-02 1213 1220 -4.16666666666667e-02 1213 779 4.16666666666667e-02 1213 1219 -1.25000000000000e-01 1213 1218 8.33333333333333e-02 1213 1212 -1.66666666666667e-01 1213 1210 -1.25000000000000e-01 1213 1038 1.66666666666667e-01 1213 905 8.33333333333333e-02 1213 1214 -1.66666666666667e-01 1213 1040 1.66666666666667e-01 1213 904 -1.25000000000000e-01 1213 1211 8.33333333333333e-02 1213 1039 -7.50000000000000e-01 1213 903 -4.16666666666667e-02 1213 777 4.16666666666667e-02 1213 107 4.16666666666667e-02 1213 323 -4.16666666666667e-02 1213 321 8.33333333333333e-02 1213 599 -8.33333333333333e-02 1213 317 8.33333333333333e-02 1213 315 -1.66666666666667e-01 1213 322 -1.25000000000000e-01 1213 105 4.16666666666667e-02 1213 597 -8.33333333333333e-02 1214 1214 1.25000000000000e+00 1214 1032 8.33333333333333e-02 1214 1033 -1.66666666666667e-01 1214 1220 -1.25000000000000e-01 1214 1219 -4.16666666666667e-02 1214 778 4.16666666666667e-02 1214 1218 8.33333333333333e-02 1214 1211 -3.75000000000000e-01 1214 1209 8.33333333333333e-02 1214 1038 -8.33333333333333e-02 1214 1212 -1.66666666666667e-01 1214 905 -3.75000000000000e-01 1214 1210 8.33333333333333e-02 1214 1040 -2.50000000000000e-01 1214 904 8.33333333333333e-02 1214 1213 -1.66666666666667e-01 1214 1039 1.66666666666667e-01 1214 903 8.33333333333333e-02 1214 777 -8.33333333333333e-02 1214 106 4.16666666666667e-02 1214 322 -4.16666666666667e-02 1214 597 -8.33333333333333e-02 1214 315 8.33333333333333e-02 1214 598 -8.33333333333333e-02 1214 316 8.33333333333333e-02 1214 323 -1.25000000000000e-01 1214 321 8.33333333333333e-02 1214 105 -8.33333333333333e-02 1215 1215 1.25000000000000e+00 1215 1207 -4.16666666666667e-02 1215 1206 -1.25000000000000e-01 1215 1205 -8.33333333333333e-02 1215 1204 4.16666666666667e-02 1215 997 8.33333333333333e-02 1215 994 -8.33333333333333e-02 1215 998 8.33333333333333e-02 1215 995 -8.33333333333333e-02 1215 1046 8.33333333333333e-02 1215 1049 -8.33333333333333e-02 1215 916 4.16666666666667e-02 1215 913 -4.16666666666667e-02 1215 752 8.33333333333333e-02 1215 917 -8.33333333333333e-02 1215 751 8.33333333333333e-02 1215 1216 -1.66666666666667e-01 1215 1048 1.66666666666667e-01 1215 750 -3.75000000000000e-01 1215 1047 -2.50000000000000e-01 1215 1217 -1.66666666666667e-01 1215 746 8.33333333333333e-02 1215 914 8.33333333333333e-02 1215 745 8.33333333333333e-02 1215 1045 -1.66666666666667e-01 1215 1208 8.33333333333333e-02 1215 744 -3.75000000000000e-01 1215 912 -1.25000000000000e-01 1216 1216 1.25000000000000e+00 1216 1208 8.33333333333333e-02 1216 1207 -1.25000000000000e-01 1216 1206 -4.16666666666667e-02 1216 1203 4.16666666666667e-02 1216 996 8.33333333333333e-02 1216 993 -8.33333333333333e-02 1216 995 -8.33333333333333e-02 1216 998 -1.66666666666667e-01 1216 1217 -1.66666666666667e-01 1216 1049 1.66666666666667e-01 1216 914 8.33333333333333e-02 1216 915 4.16666666666667e-02 1216 912 -4.16666666666667e-02 1216 752 -4.16666666666667e-02 1216 917 4.16666666666667e-02 1216 751 -1.25000000000000e-01 1216 1048 -7.50000000000000e-01 1216 750 8.33333333333333e-02 1216 1215 -1.66666666666667e-01 1216 1047 1.66666666666667e-01 1216 746 -4.16666666666667e-02 1216 1046 8.33333333333333e-02 1216 1205 4.16666666666667e-02 1216 745 -1.25000000000000e-01 1216 913 -1.25000000000000e-01 1216 744 8.33333333333333e-02 1216 1044 -1.66666666666667e-01 1217 1217 1.25000000000000e+00 1217 1208 -3.75000000000000e-01 1217 1207 8.33333333333333e-02 1217 1206 8.33333333333333e-02 1217 1203 -8.33333333333333e-02 1217 994 -8.33333333333333e-02 1217 997 -1.66666666666667e-01 1217 996 8.33333333333333e-02 1217 993 -8.33333333333333e-02 1217 1044 8.33333333333333e-02 1217 1047 -8.33333333333333e-02 1217 1216 -1.66666666666667e-01 1217 1048 1.66666666666667e-01 1217 913 8.33333333333333e-02 1217 752 -1.25000000000000e-01 1217 1049 -2.50000000000000e-01 1217 751 -4.16666666666667e-02 1217 916 4.16666666666667e-02 1217 750 8.33333333333333e-02 1217 915 -8.33333333333333e-02 1217 1204 4.16666666666667e-02 1217 746 -1.25000000000000e-01 1217 914 -3.75000000000000e-01 1217 745 -4.16666666666667e-02 1217 1045 8.33333333333333e-02 1217 1215 -1.66666666666667e-01 1217 744 8.33333333333333e-02 1217 912 8.33333333333333e-02 1218 1218 1.25000000000000e+00 1218 1033 -8.33333333333333e-02 1218 1040 8.33333333333333e-02 1218 1034 -8.33333333333333e-02 1218 1211 -8.33333333333333e-02 1218 1214 8.33333333333333e-02 1218 1213 8.33333333333333e-02 1218 1039 -1.66666666666667e-01 1218 1212 -3.75000000000000e-01 1218 1046 8.33333333333333e-02 1218 1058 -8.33333333333333e-02 1218 913 8.33333333333333e-02 1218 1219 -1.66666666666667e-01 1218 1057 1.66666666666667e-01 1218 779 8.33333333333333e-02 1218 926 -8.33333333333333e-02 1218 778 -4.16666666666667e-02 1218 925 4.16666666666667e-02 1218 777 -1.25000000000000e-01 1218 1056 -2.50000000000000e-01 1218 1220 -1.66666666666667e-01 1218 746 8.33333333333333e-02 1218 914 8.33333333333333e-02 1218 745 -4.16666666666667e-02 1218 1045 8.33333333333333e-02 1218 1210 4.16666666666667e-02 1218 744 -1.25000000000000e-01 1218 912 -3.75000000000000e-01 1219 1219 1.25000000000000e+00 1219 1032 -8.33333333333333e-02 1219 1211 4.16666666666667e-02 1219 1034 -8.33333333333333e-02 1219 1214 -4.16666666666667e-02 1219 1040 8.33333333333333e-02 1219 1213 -1.25000000000000e-01 1219 1212 8.33333333333333e-02 1219 1038 -1.66666666666667e-01 1219 914 -4.16666666666667e-02 1219 926 4.16666666666667e-02 1219 912 8.33333333333333e-02 1219 1218 -1.66666666666667e-01 1219 1056 1.66666666666667e-01 1219 779 8.33333333333333e-02 1219 1220 -1.66666666666667e-01 1219 1058 1.66666666666667e-01 1219 778 -1.25000000000000e-01 1219 1057 -7.50000000000000e-01 1219 777 -4.16666666666667e-02 1219 924 4.16666666666667e-02 1219 746 8.33333333333333e-02 1219 1046 -1.66666666666667e-01 1219 1209 4.16666666666667e-02 1219 745 -1.25000000000000e-01 1219 913 -1.25000000000000e-01 1219 744 -4.16666666666667e-02 1219 1044 8.33333333333333e-02 1220 1220 1.25000000000000e+00 1220 1032 -8.33333333333333e-02 1220 1210 4.16666666666667e-02 1220 1033 -8.33333333333333e-02 1220 1209 -8.33333333333333e-02 1220 1214 -1.25000000000000e-01 1220 1213 -4.16666666666667e-02 1220 1039 8.33333333333333e-02 1220 1212 8.33333333333333e-02 1220 913 -4.16666666666667e-02 1220 925 4.16666666666667e-02 1220 1044 8.33333333333333e-02 1220 1056 -8.33333333333333e-02 1220 779 -3.75000000000000e-01 1220 1058 -2.50000000000000e-01 1220 778 8.33333333333333e-02 1220 1219 -1.66666666666667e-01 1220 1057 1.66666666666667e-01 1220 777 8.33333333333333e-02 1220 924 -8.33333333333333e-02 1220 1038 8.33333333333333e-02 1220 746 -3.75000000000000e-01 1220 914 -1.25000000000000e-01 1220 745 8.33333333333333e-02 1220 1045 -1.66666666666667e-01 1220 1218 -1.66666666666667e-01 1220 744 8.33333333333333e-02 1220 912 8.33333333333333e-02 1221 1221 1.25000000000000e+00 1221 1109 -8.33333333333333e-02 1221 1222 -1.66666666666667e-01 1221 1225 8.33333333333333e-02 1221 1108 1.66666666666667e-01 1221 1226 8.33333333333333e-02 1221 748 -4.16666666666667e-02 1221 1105 8.33333333333333e-02 1221 1224 -3.75000000000000e-01 1221 1235 -8.33333333333333e-02 1221 1234 4.16666666666667e-02 1221 754 -4.16666666666667e-02 1221 1107 -2.50000000000000e-01 1221 847 4.16666666666667e-02 1221 1087 -8.33333333333333e-02 1221 1088 -8.33333333333333e-02 1221 1094 8.33333333333333e-02 1221 749 8.33333333333333e-02 1221 848 -8.33333333333333e-02 1221 747 -1.25000000000000e-01 1221 1223 -1.66666666666667e-01 1221 854 8.33333333333333e-02 1221 755 8.33333333333333e-02 1221 853 8.33333333333333e-02 1221 1093 -1.66666666666667e-01 1221 1106 8.33333333333333e-02 1221 852 -3.75000000000000e-01 1221 753 -1.25000000000000e-01 1222 1222 1.25000000000000e+00 1222 1235 4.16666666666667e-02 1222 1221 -1.66666666666667e-01 1222 1224 8.33333333333333e-02 1222 1107 1.66666666666667e-01 1222 749 8.33333333333333e-02 1222 1106 -1.66666666666667e-01 1222 1225 -1.25000000000000e-01 1222 747 -4.16666666666667e-02 1222 1104 8.33333333333333e-02 1222 1223 -1.66666666666667e-01 1222 1109 1.66666666666667e-01 1222 755 8.33333333333333e-02 1222 1108 -7.50000000000000e-01 1222 1233 4.16666666666667e-02 1222 753 -4.16666666666667e-02 1222 846 4.16666666666667e-02 1222 1086 -8.33333333333333e-02 1222 848 4.16666666666667e-02 1222 1088 -8.33333333333333e-02 1222 748 -1.25000000000000e-01 1222 854 -4.16666666666667e-02 1222 1094 8.33333333333333e-02 1222 1226 -4.16666666666667e-02 1222 853 -1.25000000000000e-01 1222 754 -1.25000000000000e-01 1222 852 8.33333333333333e-02 1222 1092 -1.66666666666667e-01 1223 1223 1.25000000000000e+00 1223 1107 -8.33333333333333e-02 1223 1225 -4.16666666666667e-02 1223 1234 4.16666666666667e-02 1223 1226 -1.25000000000000e-01 1223 748 8.33333333333333e-02 1223 1105 -1.66666666666667e-01 1223 1224 8.33333333333333e-02 1223 1109 -2.50000000000000e-01 1223 1222 -1.66666666666667e-01 1223 1108 1.66666666666667e-01 1223 754 8.33333333333333e-02 1223 1233 -8.33333333333333e-02 1223 1086 -8.33333333333333e-02 1223 1092 8.33333333333333e-02 1223 749 -3.75000000000000e-01 1223 847 4.16666666666667e-02 1223 1087 -8.33333333333333e-02 1223 747 8.33333333333333e-02 1223 846 -8.33333333333333e-02 1223 1104 8.33333333333333e-02 1223 854 -1.25000000000000e-01 1223 755 -3.75000000000000e-01 1223 853 -4.16666666666667e-02 1223 1093 8.33333333333333e-02 1223 1221 -1.66666666666667e-01 1223 852 8.33333333333333e-02 1223 753 8.33333333333333e-02 1224 1224 1.25000000000000e+00 1224 1222 8.33333333333333e-02 1224 1108 -1.66666666666667e-01 1224 1223 8.33333333333333e-02 1224 748 4.16666666666667e-02 1224 1221 -3.75000000000000e-01 1224 1235 8.33333333333333e-02 1224 757 4.16666666666667e-02 1224 1234 -4.16666666666667e-02 1224 1233 -1.25000000000000e-01 1224 1105 -8.33333333333333e-02 1224 1106 -8.33333333333333e-02 1224 1226 -1.66666666666667e-01 1224 862 -4.16666666666667e-02 1224 856 8.33333333333333e-02 1224 857 8.33333333333333e-02 1224 1112 -8.33333333333333e-02 1224 863 8.33333333333333e-02 1224 749 -8.33333333333333e-02 1224 861 -1.25000000000000e-01 1224 866 8.33333333333333e-02 1224 758 -8.33333333333333e-02 1224 865 8.33333333333333e-02 1224 1225 -1.66666666666667e-01 1224 1111 1.66666666666667e-01 1224 864 -3.75000000000000e-01 1224 1109 8.33333333333333e-02 1224 1110 -2.50000000000000e-01 1225 1225 1.25000000000000e+00 1225 1109 8.33333333333333e-02 1225 1221 8.33333333333333e-02 1225 1107 -1.66666666666667e-01 1225 1222 -1.25000000000000e-01 1225 747 4.16666666666667e-02 1225 1226 -1.66666666666667e-01 1225 1235 8.33333333333333e-02 1225 1234 -1.25000000000000e-01 1225 756 4.16666666666667e-02 1225 1233 -4.16666666666667e-02 1225 1104 -8.33333333333333e-02 1225 863 8.33333333333333e-02 1225 861 -4.16666666666667e-02 1225 855 8.33333333333333e-02 1225 857 -1.66666666666667e-01 1225 1112 1.66666666666667e-01 1225 749 4.16666666666667e-02 1225 1106 -8.33333333333333e-02 1225 862 -1.25000000000000e-01 1225 866 -4.16666666666667e-02 1225 758 4.16666666666667e-02 1225 865 -1.25000000000000e-01 1225 1223 -4.16666666666667e-02 1225 1111 -7.50000000000000e-01 1225 864 8.33333333333333e-02 1225 1224 -1.66666666666667e-01 1225 1110 1.66666666666667e-01 1226 1226 1.25000000000000e+00 1226 1222 -4.16666666666667e-02 1226 1108 8.33333333333333e-02 1226 1223 -1.25000000000000e-01 1226 1221 8.33333333333333e-02 1226 1235 -3.75000000000000e-01 1226 1225 -1.66666666666667e-01 1226 1234 8.33333333333333e-02 1226 1233 8.33333333333333e-02 1226 1104 -8.33333333333333e-02 1226 862 8.33333333333333e-02 1226 1224 -1.66666666666667e-01 1226 856 -1.66666666666667e-01 1226 1111 1.66666666666667e-01 1226 855 8.33333333333333e-02 1226 1110 -8.33333333333333e-02 1226 863 -3.75000000000000e-01 1226 748 4.16666666666667e-02 1226 1105 -8.33333333333333e-02 1226 861 8.33333333333333e-02 1226 747 -8.33333333333333e-02 1226 866 -1.25000000000000e-01 1226 1107 8.33333333333333e-02 1226 1112 -2.50000000000000e-01 1226 865 -4.16666666666667e-02 1226 757 4.16666666666667e-02 1226 864 8.33333333333333e-02 1226 756 -8.33333333333333e-02 1227 1227 1.25000000000000e+00 1227 1237 4.16666666666667e-02 1227 1238 -8.33333333333333e-02 1227 1232 8.33333333333333e-02 1227 1230 -1.25000000000000e-01 1227 1157 -8.33333333333333e-02 1227 754 8.33333333333333e-02 1227 1228 -1.66666666666667e-01 1227 1156 1.66666666666667e-01 1227 1155 -2.50000000000000e-01 1227 1154 8.33333333333333e-02 1227 751 8.33333333333333e-02 1227 1153 -1.66666666666667e-01 1227 1094 8.33333333333333e-02 1227 1091 -8.33333333333333e-02 1227 752 8.33333333333333e-02 1227 851 -8.33333333333333e-02 1227 850 4.16666666666667e-02 1227 1090 -8.33333333333333e-02 1227 750 -3.75000000000000e-01 1227 1229 -1.66666666666667e-01 1227 854 8.33333333333333e-02 1227 755 8.33333333333333e-02 1227 853 -4.16666666666667e-02 1227 1093 8.33333333333333e-02 1227 1231 -4.16666666666667e-02 1227 852 -1.25000000000000e-01 1227 753 -3.75000000000000e-01 1228 1228 1.25000000000000e+00 1228 1229 -1.66666666666667e-01 1228 1230 -4.16666666666667e-02 1228 1236 4.16666666666667e-02 1228 755 -4.16666666666667e-02 1228 1238 4.16666666666667e-02 1228 752 -4.16666666666667e-02 1228 1231 -1.25000000000000e-01 1228 1154 8.33333333333333e-02 1228 1157 1.66666666666667e-01 1228 1156 -7.50000000000000e-01 1228 753 8.33333333333333e-02 1228 1227 -1.66666666666667e-01 1228 1155 1.66666666666667e-01 1228 750 8.33333333333333e-02 1228 1152 -1.66666666666667e-01 1228 851 4.16666666666667e-02 1228 1091 -8.33333333333333e-02 1228 751 -1.25000000000000e-01 1228 849 4.16666666666667e-02 1228 1089 -8.33333333333333e-02 1228 854 8.33333333333333e-02 1228 1094 -1.66666666666667e-01 1228 1232 8.33333333333333e-02 1228 853 -1.25000000000000e-01 1228 754 -1.25000000000000e-01 1228 852 -4.16666666666667e-02 1228 1092 8.33333333333333e-02 1229 1229 1.25000000000000e+00 1229 1228 -1.66666666666667e-01 1229 754 -4.16666666666667e-02 1229 1237 4.16666666666667e-02 1229 1236 -8.33333333333333e-02 1229 1232 -3.75000000000000e-01 1229 751 -4.16666666666667e-02 1229 1230 8.33333333333333e-02 1229 1153 8.33333333333333e-02 1229 1157 -2.50000000000000e-01 1229 1156 1.66666666666667e-01 1229 1155 -8.33333333333333e-02 1229 1152 8.33333333333333e-02 1229 1092 8.33333333333333e-02 1229 1089 -8.33333333333333e-02 1229 850 4.16666666666667e-02 1229 1090 -8.33333333333333e-02 1229 752 -1.25000000000000e-01 1229 750 8.33333333333333e-02 1229 849 -8.33333333333333e-02 1229 1231 8.33333333333333e-02 1229 854 -3.75000000000000e-01 1229 755 -1.25000000000000e-01 1229 853 8.33333333333333e-02 1229 1093 -1.66666666666667e-01 1229 1227 -1.66666666666667e-01 1229 852 8.33333333333333e-02 1229 753 8.33333333333333e-02 1230 1230 1.25000000000000e+00 1230 1157 8.33333333333333e-02 1230 1156 8.33333333333333e-02 1230 1238 8.33333333333333e-02 1230 1237 8.33333333333333e-02 1230 1231 -1.66666666666667e-01 1230 1236 -3.75000000000000e-01 1230 1229 8.33333333333333e-02 1230 1227 -1.25000000000000e-01 1230 1166 -8.33333333333333e-02 1230 1232 -1.66666666666667e-01 1230 1154 -8.33333333333333e-02 1230 911 8.33333333333333e-02 1230 916 8.33333333333333e-02 1230 1165 1.66666666666667e-01 1230 910 -1.66666666666667e-01 1230 917 8.33333333333333e-02 1230 752 -8.33333333333333e-02 1230 751 4.16666666666667e-02 1230 1153 -8.33333333333333e-02 1230 915 -3.75000000000000e-01 1230 929 8.33333333333333e-02 1230 782 -8.33333333333333e-02 1230 928 -4.16666666666667e-02 1230 781 4.16666666666667e-02 1230 927 -1.25000000000000e-01 1230 1228 -4.16666666666667e-02 1230 1164 -2.50000000000000e-01 1231 1231 1.25000000000000e+00 1231 1227 -4.16666666666667e-02 1231 1157 -1.66666666666667e-01 1231 1155 8.33333333333333e-02 1231 1238 -4.16666666666667e-02 1231 782 4.16666666666667e-02 1231 1237 -1.25000000000000e-01 1231 1236 8.33333333333333e-02 1231 1230 -1.66666666666667e-01 1231 752 4.16666666666667e-02 1231 1228 -1.25000000000000e-01 1231 917 -4.16666666666667e-02 1231 915 8.33333333333333e-02 1231 1154 -8.33333333333333e-02 1231 911 8.33333333333333e-02 1231 1164 1.66666666666667e-01 1231 909 -1.66666666666667e-01 1231 916 -1.25000000000000e-01 1231 750 4.16666666666667e-02 1231 1152 -8.33333333333333e-02 1231 929 8.33333333333333e-02 1231 1232 -1.66666666666667e-01 1231 1166 1.66666666666667e-01 1231 928 -1.25000000000000e-01 1231 1229 8.33333333333333e-02 1231 1165 -7.50000000000000e-01 1231 927 -4.16666666666667e-02 1231 780 4.16666666666667e-02 1232 1232 1.25000000000000e+00 1232 1155 8.33333333333333e-02 1232 1156 -1.66666666666667e-01 1232 1238 -1.25000000000000e-01 1232 1237 -4.16666666666667e-02 1232 781 4.16666666666667e-02 1232 1236 8.33333333333333e-02 1232 1229 -3.75000000000000e-01 1232 751 4.16666666666667e-02 1232 1227 8.33333333333333e-02 1232 1164 -8.33333333333333e-02 1232 916 -4.16666666666667e-02 1232 1230 -1.66666666666667e-01 1232 1152 -8.33333333333333e-02 1232 909 8.33333333333333e-02 1232 1153 -8.33333333333333e-02 1232 910 8.33333333333333e-02 1232 917 -1.25000000000000e-01 1232 915 8.33333333333333e-02 1232 750 -8.33333333333333e-02 1232 929 -3.75000000000000e-01 1232 1228 8.33333333333333e-02 1232 1166 -2.50000000000000e-01 1232 928 8.33333333333333e-02 1232 1231 -1.66666666666667e-01 1232 1165 1.66666666666667e-01 1232 927 8.33333333333333e-02 1232 780 -8.33333333333333e-02 1233 1233 1.25000000000000e+00 1233 1225 -4.16666666666667e-02 1233 1224 -1.25000000000000e-01 1233 1223 -8.33333333333333e-02 1233 1222 4.16666666666667e-02 1233 1111 8.33333333333333e-02 1233 1108 -8.33333333333333e-02 1233 1112 8.33333333333333e-02 1233 1109 -8.33333333333333e-02 1233 1172 8.33333333333333e-02 1233 1175 -8.33333333333333e-02 1233 940 4.16666666666667e-02 1233 937 -4.16666666666667e-02 1233 758 8.33333333333333e-02 1233 941 -8.33333333333333e-02 1233 757 8.33333333333333e-02 1233 1234 -1.66666666666667e-01 1233 1174 1.66666666666667e-01 1233 756 -3.75000000000000e-01 1233 1173 -2.50000000000000e-01 1233 1235 -1.66666666666667e-01 1233 755 8.33333333333333e-02 1233 938 8.33333333333333e-02 1233 754 8.33333333333333e-02 1233 1171 -1.66666666666667e-01 1233 1226 8.33333333333333e-02 1233 753 -3.75000000000000e-01 1233 936 -1.25000000000000e-01 1234 1234 1.25000000000000e+00 1234 1226 8.33333333333333e-02 1234 1225 -1.25000000000000e-01 1234 1224 -4.16666666666667e-02 1234 1221 4.16666666666667e-02 1234 1110 8.33333333333333e-02 1234 1107 -8.33333333333333e-02 1234 1109 -8.33333333333333e-02 1234 1112 -1.66666666666667e-01 1234 1235 -1.66666666666667e-01 1234 1175 1.66666666666667e-01 1234 938 8.33333333333333e-02 1234 939 4.16666666666667e-02 1234 936 -4.16666666666667e-02 1234 758 -4.16666666666667e-02 1234 941 4.16666666666667e-02 1234 757 -1.25000000000000e-01 1234 1174 -7.50000000000000e-01 1234 756 8.33333333333333e-02 1234 1233 -1.66666666666667e-01 1234 1173 1.66666666666667e-01 1234 755 -4.16666666666667e-02 1234 1172 8.33333333333333e-02 1234 1223 4.16666666666667e-02 1234 754 -1.25000000000000e-01 1234 937 -1.25000000000000e-01 1234 753 8.33333333333333e-02 1234 1170 -1.66666666666667e-01 1235 1235 1.25000000000000e+00 1235 1226 -3.75000000000000e-01 1235 1225 8.33333333333333e-02 1235 1224 8.33333333333333e-02 1235 1221 -8.33333333333333e-02 1235 1108 -8.33333333333333e-02 1235 1111 -1.66666666666667e-01 1235 1110 8.33333333333333e-02 1235 1107 -8.33333333333333e-02 1235 1170 8.33333333333333e-02 1235 1173 -8.33333333333333e-02 1235 1234 -1.66666666666667e-01 1235 1174 1.66666666666667e-01 1235 937 8.33333333333333e-02 1235 758 -1.25000000000000e-01 1235 1175 -2.50000000000000e-01 1235 757 -4.16666666666667e-02 1235 940 4.16666666666667e-02 1235 756 8.33333333333333e-02 1235 939 -8.33333333333333e-02 1235 1222 4.16666666666667e-02 1235 755 -1.25000000000000e-01 1235 938 -3.75000000000000e-01 1235 754 -4.16666666666667e-02 1235 1171 8.33333333333333e-02 1235 1233 -1.66666666666667e-01 1235 753 8.33333333333333e-02 1235 936 8.33333333333333e-02 1236 1236 1.25000000000000e+00 1236 1156 -8.33333333333333e-02 1236 1166 8.33333333333333e-02 1236 1157 -8.33333333333333e-02 1236 1229 -8.33333333333333e-02 1236 1232 8.33333333333333e-02 1236 1231 8.33333333333333e-02 1236 1165 -1.66666666666667e-01 1236 1230 -3.75000000000000e-01 1236 1172 8.33333333333333e-02 1236 1184 -8.33333333333333e-02 1236 937 8.33333333333333e-02 1236 1237 -1.66666666666667e-01 1236 1183 1.66666666666667e-01 1236 782 8.33333333333333e-02 1236 950 -8.33333333333333e-02 1236 781 -4.16666666666667e-02 1236 949 4.16666666666667e-02 1236 780 -1.25000000000000e-01 1236 1182 -2.50000000000000e-01 1236 1238 -1.66666666666667e-01 1236 755 8.33333333333333e-02 1236 938 8.33333333333333e-02 1236 754 -4.16666666666667e-02 1236 1171 8.33333333333333e-02 1236 1228 4.16666666666667e-02 1236 753 -1.25000000000000e-01 1236 936 -3.75000000000000e-01 1237 1237 1.25000000000000e+00 1237 1155 -8.33333333333333e-02 1237 1229 4.16666666666667e-02 1237 1157 -8.33333333333333e-02 1237 1232 -4.16666666666667e-02 1237 1166 8.33333333333333e-02 1237 1231 -1.25000000000000e-01 1237 1230 8.33333333333333e-02 1237 1164 -1.66666666666667e-01 1237 938 -4.16666666666667e-02 1237 950 4.16666666666667e-02 1237 936 8.33333333333333e-02 1237 1236 -1.66666666666667e-01 1237 1182 1.66666666666667e-01 1237 782 8.33333333333333e-02 1237 1238 -1.66666666666667e-01 1237 1184 1.66666666666667e-01 1237 781 -1.25000000000000e-01 1237 1183 -7.50000000000000e-01 1237 780 -4.16666666666667e-02 1237 948 4.16666666666667e-02 1237 755 8.33333333333333e-02 1237 1172 -1.66666666666667e-01 1237 1227 4.16666666666667e-02 1237 754 -1.25000000000000e-01 1237 937 -1.25000000000000e-01 1237 753 -4.16666666666667e-02 1237 1170 8.33333333333333e-02 1238 1238 1.25000000000000e+00 1238 1155 -8.33333333333333e-02 1238 1228 4.16666666666667e-02 1238 1156 -8.33333333333333e-02 1238 1227 -8.33333333333333e-02 1238 1232 -1.25000000000000e-01 1238 1231 -4.16666666666667e-02 1238 1165 8.33333333333333e-02 1238 1230 8.33333333333333e-02 1238 937 -4.16666666666667e-02 1238 949 4.16666666666667e-02 1238 1170 8.33333333333333e-02 1238 1182 -8.33333333333333e-02 1238 782 -3.75000000000000e-01 1238 1184 -2.50000000000000e-01 1238 781 8.33333333333333e-02 1238 1237 -1.66666666666667e-01 1238 1183 1.66666666666667e-01 1238 780 8.33333333333333e-02 1238 948 -8.33333333333333e-02 1238 1164 8.33333333333333e-02 1238 755 -3.75000000000000e-01 1238 938 -1.25000000000000e-01 1238 754 8.33333333333333e-02 1238 1171 -1.66666666666667e-01 1238 1236 -1.66666666666667e-01 1238 753 8.33333333333333e-02 1238 936 8.33333333333333e-02 1239 1239 1.25000000000000e+00 1239 1024 -8.33333333333333e-02 1239 1244 8.33333333333333e-02 1239 1241 -1.66666666666667e-01 1239 1025 1.66666666666667e-01 1239 1022 8.33333333333333e-02 1239 761 -4.16666666666667e-02 1239 1243 8.33333333333333e-02 1239 1242 -3.75000000000000e-01 1239 1253 4.16666666666667e-02 1239 764 -4.16666666666667e-02 1239 1252 -8.33333333333333e-02 1239 1023 -2.50000000000000e-01 1239 1007 -8.33333333333333e-02 1239 869 4.16666666666667e-02 1239 1006 -8.33333333333333e-02 1239 1009 8.33333333333333e-02 1239 868 -8.33333333333333e-02 1239 760 8.33333333333333e-02 1239 759 -1.25000000000000e-01 1239 872 8.33333333333333e-02 1239 1010 -1.66666666666667e-01 1239 871 8.33333333333333e-02 1239 1240 -1.66666666666667e-01 1239 763 8.33333333333333e-02 1239 870 -3.75000000000000e-01 1239 1021 8.33333333333333e-02 1239 762 -1.25000000000000e-01 1240 1240 1.25000000000000e+00 1240 1023 -8.33333333333333e-02 1240 1244 -4.16666666666667e-02 1240 1253 4.16666666666667e-02 1240 1022 -1.66666666666667e-01 1240 761 8.33333333333333e-02 1240 1243 -1.25000000000000e-01 1240 1242 8.33333333333333e-02 1240 1025 1.66666666666667e-01 1240 1241 -1.66666666666667e-01 1240 764 8.33333333333333e-02 1240 1024 -2.50000000000000e-01 1240 1251 -8.33333333333333e-02 1240 1005 -8.33333333333333e-02 1240 1008 8.33333333333333e-02 1240 869 4.16666666666667e-02 1240 1007 -8.33333333333333e-02 1240 760 -3.75000000000000e-01 1240 867 -8.33333333333333e-02 1240 759 8.33333333333333e-02 1240 872 -4.16666666666667e-02 1240 1010 8.33333333333333e-02 1240 871 -1.25000000000000e-01 1240 1020 8.33333333333333e-02 1240 763 -3.75000000000000e-01 1240 870 8.33333333333333e-02 1240 1239 -1.66666666666667e-01 1240 762 8.33333333333333e-02 1241 1241 1.25000000000000e+00 1241 1252 4.16666666666667e-02 1241 1242 8.33333333333333e-02 1241 1239 -1.66666666666667e-01 1241 1023 1.66666666666667e-01 1241 1244 -1.25000000000000e-01 1241 1021 -1.66666666666667e-01 1241 760 8.33333333333333e-02 1241 1020 8.33333333333333e-02 1241 759 -4.16666666666667e-02 1241 1025 -7.50000000000000e-01 1241 1024 1.66666666666667e-01 1241 1240 -1.66666666666667e-01 1241 763 8.33333333333333e-02 1241 1251 4.16666666666667e-02 1241 762 -4.16666666666667e-02 1241 1005 -8.33333333333333e-02 1241 867 4.16666666666667e-02 1241 761 -1.25000000000000e-01 1241 868 4.16666666666667e-02 1241 1006 -8.33333333333333e-02 1241 872 -1.25000000000000e-01 1241 1243 -4.16666666666667e-02 1241 764 -1.25000000000000e-01 1241 871 -4.16666666666667e-02 1241 1009 8.33333333333333e-02 1241 870 8.33333333333333e-02 1241 1008 -1.66666666666667e-01 1242 1242 1.25000000000000e+00 1242 1241 8.33333333333333e-02 1242 1025 -1.66666666666667e-01 1242 761 4.16666666666667e-02 1242 1240 8.33333333333333e-02 1242 1239 -3.75000000000000e-01 1242 770 4.16666666666667e-02 1242 1253 -4.16666666666667e-02 1242 1252 8.33333333333333e-02 1242 1251 -1.25000000000000e-01 1242 1022 -8.33333333333333e-02 1242 1021 -8.33333333333333e-02 1242 875 8.33333333333333e-02 1242 881 -4.16666666666667e-02 1242 1243 -1.66666666666667e-01 1242 874 8.33333333333333e-02 1242 1027 -8.33333333333333e-02 1242 760 -8.33333333333333e-02 1242 880 8.33333333333333e-02 1242 879 -1.25000000000000e-01 1242 1244 -1.66666666666667e-01 1242 887 8.33333333333333e-02 1242 1028 1.66666666666667e-01 1242 886 8.33333333333333e-02 1242 769 -8.33333333333333e-02 1242 1024 8.33333333333333e-02 1242 885 -3.75000000000000e-01 1242 1026 -2.50000000000000e-01 1243 1243 1.25000000000000e+00 1243 1241 -4.16666666666667e-02 1243 1025 8.33333333333333e-02 1243 1240 -1.25000000000000e-01 1243 1239 8.33333333333333e-02 1243 1244 -1.66666666666667e-01 1243 1253 8.33333333333333e-02 1243 1252 -3.75000000000000e-01 1243 1251 8.33333333333333e-02 1243 1020 -8.33333333333333e-02 1243 881 8.33333333333333e-02 1243 1242 -1.66666666666667e-01 1243 875 -1.66666666666667e-01 1243 1028 1.66666666666667e-01 1243 873 8.33333333333333e-02 1243 1026 -8.33333333333333e-02 1243 761 4.16666666666667e-02 1243 1022 -8.33333333333333e-02 1243 880 -3.75000000000000e-01 1243 759 -8.33333333333333e-02 1243 879 8.33333333333333e-02 1243 887 -4.16666666666667e-02 1243 770 4.16666666666667e-02 1243 1023 8.33333333333333e-02 1243 886 -1.25000000000000e-01 1243 1027 -2.50000000000000e-01 1243 885 8.33333333333333e-02 1243 768 -8.33333333333333e-02 1244 1244 1.25000000000000e+00 1244 1024 8.33333333333333e-02 1244 1239 8.33333333333333e-02 1244 1023 -1.66666666666667e-01 1244 1241 -1.25000000000000e-01 1244 759 4.16666666666667e-02 1244 1253 -1.25000000000000e-01 1244 1243 -1.66666666666667e-01 1244 1252 8.33333333333333e-02 1244 768 4.16666666666667e-02 1244 1251 -4.16666666666667e-02 1244 1020 -8.33333333333333e-02 1244 880 8.33333333333333e-02 1244 873 8.33333333333333e-02 1244 879 -4.16666666666667e-02 1244 874 -1.66666666666667e-01 1244 1027 1.66666666666667e-01 1244 881 -1.25000000000000e-01 1244 760 4.16666666666667e-02 1244 1021 -8.33333333333333e-02 1244 1240 -4.16666666666667e-02 1244 887 -1.25000000000000e-01 1244 1028 -7.50000000000000e-01 1244 886 -4.16666666666667e-02 1244 769 4.16666666666667e-02 1244 1242 -1.66666666666667e-01 1244 885 8.33333333333333e-02 1244 1026 1.66666666666667e-01 1245 1245 1.25000000000000e+00 1245 1036 -8.33333333333333e-02 1245 1250 -4.16666666666667e-02 1245 1256 4.16666666666667e-02 1245 1249 8.33333333333333e-02 1245 1248 -1.25000000000000e-01 1245 1247 -1.66666666666667e-01 1245 1037 1.66666666666667e-01 1245 764 8.33333333333333e-02 1245 1255 -8.33333333333333e-02 1245 1035 -2.50000000000000e-01 1245 1009 8.33333333333333e-02 1245 872 -4.16666666666667e-02 1245 1010 8.33333333333333e-02 1245 1246 -1.66666666666667e-01 1245 871 8.33333333333333e-02 1245 763 8.33333333333333e-02 1245 870 -1.25000000000000e-01 1245 762 -3.75000000000000e-01 1245 128 8.33333333333333e-02 1245 602 -1.66666666666667e-01 1245 595 -8.33333333333333e-02 1245 275 4.16666666666667e-02 1245 596 -8.33333333333333e-02 1245 127 8.33333333333333e-02 1245 274 -8.33333333333333e-02 1245 126 -3.75000000000000e-01 1245 601 8.33333333333333e-02 1246 1246 1.25000000000000e+00 1246 1035 -8.33333333333333e-02 1246 1247 -1.66666666666667e-01 1246 1250 8.33333333333333e-02 1246 1037 1.66666666666667e-01 1246 1249 -3.75000000000000e-01 1246 1248 8.33333333333333e-02 1246 1256 4.16666666666667e-02 1246 764 -4.16666666666667e-02 1246 1036 -2.50000000000000e-01 1246 1254 -8.33333333333333e-02 1246 1008 8.33333333333333e-02 1246 872 8.33333333333333e-02 1246 1010 -1.66666666666667e-01 1246 871 -3.75000000000000e-01 1246 763 -1.25000000000000e-01 1246 1245 -1.66666666666667e-01 1246 870 8.33333333333333e-02 1246 762 8.33333333333333e-02 1246 128 -4.16666666666667e-02 1246 602 8.33333333333333e-02 1246 275 4.16666666666667e-02 1246 596 -8.33333333333333e-02 1246 594 -8.33333333333333e-02 1246 127 -1.25000000000000e-01 1246 126 8.33333333333333e-02 1246 273 -8.33333333333333e-02 1246 600 8.33333333333333e-02 1247 1247 1.25000000000000e+00 1247 1249 8.33333333333333e-02 1247 1036 1.66666666666667e-01 1247 1248 -4.16666666666667e-02 1247 1254 4.16666666666667e-02 1247 1250 -1.25000000000000e-01 1247 1037 -7.50000000000000e-01 1247 1255 4.16666666666667e-02 1247 763 -4.16666666666667e-02 1247 1245 -1.66666666666667e-01 1247 1035 1.66666666666667e-01 1247 762 8.33333333333333e-02 1247 1246 -1.66666666666667e-01 1247 872 -1.25000000000000e-01 1247 764 -1.25000000000000e-01 1247 871 8.33333333333333e-02 1247 1009 -1.66666666666667e-01 1247 870 -4.16666666666667e-02 1247 1008 8.33333333333333e-02 1247 127 -4.16666666666667e-02 1247 601 8.33333333333333e-02 1247 126 8.33333333333333e-02 1247 600 -1.66666666666667e-01 1247 274 4.16666666666667e-02 1247 595 -8.33333333333333e-02 1247 128 -1.25000000000000e-01 1247 273 4.16666666666667e-02 1247 594 -8.33333333333333e-02 1248 1248 1.25000000000000e+00 1248 1247 -4.16666666666667e-02 1248 1037 8.33333333333333e-02 1248 1246 8.33333333333333e-02 1248 1245 -1.25000000000000e-01 1248 1250 -1.66666666666667e-01 1248 1256 8.33333333333333e-02 1248 1255 8.33333333333333e-02 1248 1254 -3.75000000000000e-01 1248 1249 -1.66666666666667e-01 1248 1040 1.66666666666667e-01 1248 1039 -8.33333333333333e-02 1248 905 -4.16666666666667e-02 1248 779 4.16666666666667e-02 1248 904 8.33333333333333e-02 1248 778 -8.33333333333333e-02 1248 903 -1.25000000000000e-01 1248 1036 8.33333333333333e-02 1248 1038 -2.50000000000000e-01 1248 601 -8.33333333333333e-02 1248 329 8.33333333333333e-02 1248 317 -1.66666666666667e-01 1248 316 8.33333333333333e-02 1248 128 4.16666666666667e-02 1248 602 -8.33333333333333e-02 1248 328 8.33333333333333e-02 1248 127 -8.33333333333333e-02 1248 327 -3.75000000000000e-01 1249 1249 1.25000000000000e+00 1249 1247 8.33333333333333e-02 1249 1037 -1.66666666666667e-01 1249 1246 -3.75000000000000e-01 1249 1245 8.33333333333333e-02 1249 779 4.16666666666667e-02 1249 1256 -4.16666666666667e-02 1249 1255 -1.25000000000000e-01 1249 1254 8.33333333333333e-02 1249 1248 -1.66666666666667e-01 1249 1038 -8.33333333333333e-02 1249 905 8.33333333333333e-02 1249 1250 -1.66666666666667e-01 1249 1040 1.66666666666667e-01 1249 904 -3.75000000000000e-01 1249 1035 8.33333333333333e-02 1249 1039 -2.50000000000000e-01 1249 903 8.33333333333333e-02 1249 777 -8.33333333333333e-02 1249 128 4.16666666666667e-02 1249 602 -8.33333333333333e-02 1249 600 -8.33333333333333e-02 1249 329 -4.16666666666667e-02 1249 317 8.33333333333333e-02 1249 315 8.33333333333333e-02 1249 328 -1.25000000000000e-01 1249 327 8.33333333333333e-02 1249 126 -8.33333333333333e-02 1250 1250 1.25000000000000e+00 1250 1036 -1.66666666666667e-01 1250 1245 -4.16666666666667e-02 1250 1035 8.33333333333333e-02 1250 1247 -1.25000000000000e-01 1250 1256 -1.25000000000000e-01 1250 778 4.16666666666667e-02 1250 1255 -4.16666666666667e-02 1250 1248 -1.66666666666667e-01 1250 1254 8.33333333333333e-02 1250 1038 1.66666666666667e-01 1250 905 -1.25000000000000e-01 1250 1246 8.33333333333333e-02 1250 1040 -7.50000000000000e-01 1250 904 8.33333333333333e-02 1250 1249 -1.66666666666667e-01 1250 1039 1.66666666666667e-01 1250 903 -4.16666666666667e-02 1250 777 4.16666666666667e-02 1250 127 4.16666666666667e-02 1250 601 -8.33333333333333e-02 1250 328 -4.16666666666667e-02 1250 316 8.33333333333333e-02 1250 327 8.33333333333333e-02 1250 315 -1.66666666666667e-01 1250 329 -1.25000000000000e-01 1250 126 4.16666666666667e-02 1250 600 -8.33333333333333e-02 1251 1251 1.25000000000000e+00 1251 1243 8.33333333333333e-02 1251 1242 -1.25000000000000e-01 1251 1241 4.16666666666667e-02 1251 1240 -8.33333333333333e-02 1251 1028 8.33333333333333e-02 1251 1025 -8.33333333333333e-02 1251 1027 8.33333333333333e-02 1251 1024 -8.33333333333333e-02 1251 1054 -8.33333333333333e-02 1251 1051 8.33333333333333e-02 1251 923 4.16666666666667e-02 1251 920 -4.16666666666667e-02 1251 764 8.33333333333333e-02 1251 1052 -1.66666666666667e-01 1251 763 8.33333333333333e-02 1251 1252 -1.66666666666667e-01 1251 919 8.33333333333333e-02 1251 762 -3.75000000000000e-01 1251 918 -1.25000000000000e-01 1251 1253 -1.66666666666667e-01 1251 770 8.33333333333333e-02 1251 1055 1.66666666666667e-01 1251 769 8.33333333333333e-02 1251 922 -8.33333333333333e-02 1251 1244 -4.16666666666667e-02 1251 768 -3.75000000000000e-01 1251 1053 -2.50000000000000e-01 1252 1252 1.25000000000000e+00 1252 1244 8.33333333333333e-02 1252 1243 -3.75000000000000e-01 1252 1242 8.33333333333333e-02 1252 1239 -8.33333333333333e-02 1252 1025 -8.33333333333333e-02 1252 1028 -1.66666666666667e-01 1252 1026 8.33333333333333e-02 1252 1023 -8.33333333333333e-02 1252 1053 -8.33333333333333e-02 1252 1050 8.33333333333333e-02 1252 1055 1.66666666666667e-01 1252 1253 -1.66666666666667e-01 1252 920 8.33333333333333e-02 1252 764 -4.16666666666667e-02 1252 1052 8.33333333333333e-02 1252 763 -1.25000000000000e-01 1252 919 -3.75000000000000e-01 1252 762 8.33333333333333e-02 1252 1251 -1.66666666666667e-01 1252 918 8.33333333333333e-02 1252 770 -4.16666666666667e-02 1252 923 4.16666666666667e-02 1252 1241 4.16666666666667e-02 1252 769 -1.25000000000000e-01 1252 1054 -2.50000000000000e-01 1252 768 8.33333333333333e-02 1252 921 -8.33333333333333e-02 1253 1253 1.25000000000000e+00 1253 1244 -1.25000000000000e-01 1253 1243 8.33333333333333e-02 1253 1242 -4.16666666666667e-02 1253 1239 4.16666666666667e-02 1253 1026 8.33333333333333e-02 1253 1023 -8.33333333333333e-02 1253 1024 -8.33333333333333e-02 1253 1027 -1.66666666666667e-01 1253 1054 1.66666666666667e-01 1253 1252 -1.66666666666667e-01 1253 919 8.33333333333333e-02 1253 921 4.16666666666667e-02 1253 918 -4.16666666666667e-02 1253 764 -1.25000000000000e-01 1253 920 -1.25000000000000e-01 1253 763 -4.16666666666667e-02 1253 1051 8.33333333333333e-02 1253 762 8.33333333333333e-02 1253 1050 -1.66666666666667e-01 1253 1240 4.16666666666667e-02 1253 770 -1.25000000000000e-01 1253 1055 -7.50000000000000e-01 1253 769 -4.16666666666667e-02 1253 922 4.16666666666667e-02 1253 1251 -1.66666666666667e-01 1253 768 8.33333333333333e-02 1253 1053 1.66666666666667e-01 1254 1254 1.25000000000000e+00 1254 1250 8.33333333333333e-02 1254 1249 8.33333333333333e-02 1254 1248 -3.75000000000000e-01 1254 1246 -8.33333333333333e-02 1254 1037 -8.33333333333333e-02 1254 1040 -1.66666666666667e-01 1254 1039 8.33333333333333e-02 1254 1036 -8.33333333333333e-02 1254 1051 8.33333333333333e-02 1254 1057 -8.33333333333333e-02 1254 1256 -1.66666666666667e-01 1254 1058 1.66666666666667e-01 1254 920 8.33333333333333e-02 1254 779 -4.16666666666667e-02 1254 926 4.16666666666667e-02 1254 778 8.33333333333333e-02 1254 925 -8.33333333333333e-02 1254 777 -1.25000000000000e-01 1254 1056 -2.50000000000000e-01 1254 764 -4.16666666666667e-02 1254 1052 8.33333333333333e-02 1254 1255 -1.66666666666667e-01 1254 763 8.33333333333333e-02 1254 919 8.33333333333333e-02 1254 1247 4.16666666666667e-02 1254 762 -1.25000000000000e-01 1254 918 -3.75000000000000e-01 1255 1255 1.25000000000000e+00 1255 1249 -1.25000000000000e-01 1255 1248 8.33333333333333e-02 1255 1247 4.16666666666667e-02 1255 1245 -8.33333333333333e-02 1255 1040 8.33333333333333e-02 1255 1037 -8.33333333333333e-02 1255 1038 8.33333333333333e-02 1255 1035 -8.33333333333333e-02 1255 1050 8.33333333333333e-02 1255 1056 -8.33333333333333e-02 1255 926 4.16666666666667e-02 1255 920 -4.16666666666667e-02 1255 779 8.33333333333333e-02 1255 1256 -1.66666666666667e-01 1255 1058 1.66666666666667e-01 1255 778 -3.75000000000000e-01 1255 1057 -2.50000000000000e-01 1255 777 8.33333333333333e-02 1255 924 -8.33333333333333e-02 1255 764 8.33333333333333e-02 1255 1052 -1.66666666666667e-01 1255 1250 -4.16666666666667e-02 1255 763 -3.75000000000000e-01 1255 919 -1.25000000000000e-01 1255 1254 -1.66666666666667e-01 1255 762 8.33333333333333e-02 1255 918 8.33333333333333e-02 1256 1256 1.25000000000000e+00 1256 1250 -1.25000000000000e-01 1256 1249 -4.16666666666667e-02 1256 1248 8.33333333333333e-02 1256 1246 4.16666666666667e-02 1256 1039 8.33333333333333e-02 1256 1036 -8.33333333333333e-02 1256 1035 -8.33333333333333e-02 1256 1038 -1.66666666666667e-01 1256 925 4.16666666666667e-02 1256 919 -4.16666666666667e-02 1256 1254 -1.66666666666667e-01 1256 1056 1.66666666666667e-01 1256 918 8.33333333333333e-02 1256 779 -1.25000000000000e-01 1256 1058 -7.50000000000000e-01 1256 778 8.33333333333333e-02 1256 1255 -1.66666666666667e-01 1256 1057 1.66666666666667e-01 1256 777 -4.16666666666667e-02 1256 924 4.16666666666667e-02 1256 1245 4.16666666666667e-02 1256 764 -1.25000000000000e-01 1256 920 -1.25000000000000e-01 1256 763 8.33333333333333e-02 1256 1051 -1.66666666666667e-01 1256 762 -4.16666666666667e-02 1256 1050 8.33333333333333e-02 1257 1257 1.25000000000000e+00 1257 1144 -8.33333333333333e-02 1257 1262 8.33333333333333e-02 1257 1259 -1.66666666666667e-01 1257 1145 1.66666666666667e-01 1257 1142 8.33333333333333e-02 1257 767 -4.16666666666667e-02 1257 1261 8.33333333333333e-02 1257 1260 -3.75000000000000e-01 1257 1271 4.16666666666667e-02 1257 773 -4.16666666666667e-02 1257 1270 -8.33333333333333e-02 1257 1143 -2.50000000000000e-01 1257 1124 -8.33333333333333e-02 1257 884 4.16666666666667e-02 1257 1123 -8.33333333333333e-02 1257 1129 8.33333333333333e-02 1257 883 -8.33333333333333e-02 1257 766 8.33333333333333e-02 1257 765 -1.25000000000000e-01 1257 890 8.33333333333333e-02 1257 1130 -1.66666666666667e-01 1257 889 8.33333333333333e-02 1257 1258 -1.66666666666667e-01 1257 772 8.33333333333333e-02 1257 888 -3.75000000000000e-01 1257 1141 8.33333333333333e-02 1257 771 -1.25000000000000e-01 1258 1258 1.25000000000000e+00 1258 1143 -8.33333333333333e-02 1258 1262 -4.16666666666667e-02 1258 1271 4.16666666666667e-02 1258 1142 -1.66666666666667e-01 1258 767 8.33333333333333e-02 1258 1261 -1.25000000000000e-01 1258 1260 8.33333333333333e-02 1258 1145 1.66666666666667e-01 1258 1259 -1.66666666666667e-01 1258 773 8.33333333333333e-02 1258 1144 -2.50000000000000e-01 1258 1269 -8.33333333333333e-02 1258 1122 -8.33333333333333e-02 1258 1128 8.33333333333333e-02 1258 884 4.16666666666667e-02 1258 1124 -8.33333333333333e-02 1258 766 -3.75000000000000e-01 1258 882 -8.33333333333333e-02 1258 765 8.33333333333333e-02 1258 890 -4.16666666666667e-02 1258 1130 8.33333333333333e-02 1258 889 -1.25000000000000e-01 1258 1140 8.33333333333333e-02 1258 772 -3.75000000000000e-01 1258 888 8.33333333333333e-02 1258 1257 -1.66666666666667e-01 1258 771 8.33333333333333e-02 1259 1259 1.25000000000000e+00 1259 1270 4.16666666666667e-02 1259 1260 8.33333333333333e-02 1259 1257 -1.66666666666667e-01 1259 1143 1.66666666666667e-01 1259 1262 -1.25000000000000e-01 1259 1141 -1.66666666666667e-01 1259 766 8.33333333333333e-02 1259 1140 8.33333333333333e-02 1259 765 -4.16666666666667e-02 1259 1145 -7.50000000000000e-01 1259 1144 1.66666666666667e-01 1259 1258 -1.66666666666667e-01 1259 772 8.33333333333333e-02 1259 1269 4.16666666666667e-02 1259 771 -4.16666666666667e-02 1259 1122 -8.33333333333333e-02 1259 882 4.16666666666667e-02 1259 767 -1.25000000000000e-01 1259 883 4.16666666666667e-02 1259 1123 -8.33333333333333e-02 1259 890 -1.25000000000000e-01 1259 1261 -4.16666666666667e-02 1259 773 -1.25000000000000e-01 1259 889 -4.16666666666667e-02 1259 1129 8.33333333333333e-02 1259 888 8.33333333333333e-02 1259 1128 -1.66666666666667e-01 1260 1260 1.25000000000000e+00 1260 1259 8.33333333333333e-02 1260 1145 -1.66666666666667e-01 1260 767 4.16666666666667e-02 1260 1258 8.33333333333333e-02 1260 1257 -3.75000000000000e-01 1260 776 4.16666666666667e-02 1260 1271 -4.16666666666667e-02 1260 1270 8.33333333333333e-02 1260 1269 -1.25000000000000e-01 1260 1142 -8.33333333333333e-02 1260 1141 -8.33333333333333e-02 1260 893 8.33333333333333e-02 1260 899 -4.16666666666667e-02 1260 1261 -1.66666666666667e-01 1260 892 8.33333333333333e-02 1260 1147 -8.33333333333333e-02 1260 766 -8.33333333333333e-02 1260 898 8.33333333333333e-02 1260 897 -1.25000000000000e-01 1260 1262 -1.66666666666667e-01 1260 902 8.33333333333333e-02 1260 1148 1.66666666666667e-01 1260 901 8.33333333333333e-02 1260 775 -8.33333333333333e-02 1260 1144 8.33333333333333e-02 1260 900 -3.75000000000000e-01 1260 1146 -2.50000000000000e-01 1261 1261 1.25000000000000e+00 1261 1259 -4.16666666666667e-02 1261 1145 8.33333333333333e-02 1261 1258 -1.25000000000000e-01 1261 1257 8.33333333333333e-02 1261 1262 -1.66666666666667e-01 1261 1271 8.33333333333333e-02 1261 1270 -3.75000000000000e-01 1261 1269 8.33333333333333e-02 1261 1140 -8.33333333333333e-02 1261 899 8.33333333333333e-02 1261 1260 -1.66666666666667e-01 1261 893 -1.66666666666667e-01 1261 1148 1.66666666666667e-01 1261 891 8.33333333333333e-02 1261 1146 -8.33333333333333e-02 1261 767 4.16666666666667e-02 1261 1142 -8.33333333333333e-02 1261 898 -3.75000000000000e-01 1261 765 -8.33333333333333e-02 1261 897 8.33333333333333e-02 1261 902 -4.16666666666667e-02 1261 776 4.16666666666667e-02 1261 1143 8.33333333333333e-02 1261 901 -1.25000000000000e-01 1261 1147 -2.50000000000000e-01 1261 900 8.33333333333333e-02 1261 774 -8.33333333333333e-02 1262 1262 1.25000000000000e+00 1262 1144 8.33333333333333e-02 1262 1257 8.33333333333333e-02 1262 1143 -1.66666666666667e-01 1262 1259 -1.25000000000000e-01 1262 765 4.16666666666667e-02 1262 1271 -1.25000000000000e-01 1262 1261 -1.66666666666667e-01 1262 1270 8.33333333333333e-02 1262 774 4.16666666666667e-02 1262 1269 -4.16666666666667e-02 1262 1140 -8.33333333333333e-02 1262 898 8.33333333333333e-02 1262 891 8.33333333333333e-02 1262 897 -4.16666666666667e-02 1262 892 -1.66666666666667e-01 1262 1147 1.66666666666667e-01 1262 899 -1.25000000000000e-01 1262 766 4.16666666666667e-02 1262 1141 -8.33333333333333e-02 1262 1258 -4.16666666666667e-02 1262 902 -1.25000000000000e-01 1262 1148 -7.50000000000000e-01 1262 901 -4.16666666666667e-02 1262 775 4.16666666666667e-02 1262 1260 -1.66666666666667e-01 1262 900 8.33333333333333e-02 1262 1146 1.66666666666667e-01 1263 1263 1.25000000000000e+00 1263 1162 -8.33333333333333e-02 1263 1268 -4.16666666666667e-02 1263 1274 4.16666666666667e-02 1263 770 8.33333333333333e-02 1263 1160 -1.66666666666667e-01 1263 1267 8.33333333333333e-02 1263 1266 -1.25000000000000e-01 1263 1265 -1.66666666666667e-01 1263 1163 1.66666666666667e-01 1263 773 8.33333333333333e-02 1263 1273 -8.33333333333333e-02 1263 1161 -2.50000000000000e-01 1263 1126 -8.33333333333333e-02 1263 1129 8.33333333333333e-02 1263 887 4.16666666666667e-02 1263 1127 -8.33333333333333e-02 1263 769 8.33333333333333e-02 1263 886 -8.33333333333333e-02 1263 768 -3.75000000000000e-01 1263 890 -4.16666666666667e-02 1263 1130 8.33333333333333e-02 1263 1264 -1.66666666666667e-01 1263 889 8.33333333333333e-02 1263 772 8.33333333333333e-02 1263 1159 8.33333333333333e-02 1263 888 -1.25000000000000e-01 1263 771 -3.75000000000000e-01 1264 1264 1.25000000000000e+00 1264 1161 -8.33333333333333e-02 1264 1265 -1.66666666666667e-01 1264 1268 8.33333333333333e-02 1264 1163 1.66666666666667e-01 1264 770 -4.16666666666667e-02 1264 1160 8.33333333333333e-02 1264 1267 -3.75000000000000e-01 1264 1266 8.33333333333333e-02 1264 1274 4.16666666666667e-02 1264 773 -4.16666666666667e-02 1264 1162 -2.50000000000000e-01 1264 1272 -8.33333333333333e-02 1264 887 4.16666666666667e-02 1264 1127 -8.33333333333333e-02 1264 1125 -8.33333333333333e-02 1264 1128 8.33333333333333e-02 1264 769 -1.25000000000000e-01 1264 768 8.33333333333333e-02 1264 885 -8.33333333333333e-02 1264 890 8.33333333333333e-02 1264 1130 -1.66666666666667e-01 1264 1158 8.33333333333333e-02 1264 889 -3.75000000000000e-01 1264 772 -1.25000000000000e-01 1264 1263 -1.66666666666667e-01 1264 888 8.33333333333333e-02 1264 771 8.33333333333333e-02 1265 1265 1.25000000000000e+00 1265 1267 8.33333333333333e-02 1265 1162 1.66666666666667e-01 1265 1266 -4.16666666666667e-02 1265 1272 4.16666666666667e-02 1265 1268 -1.25000000000000e-01 1265 769 -4.16666666666667e-02 1265 1159 8.33333333333333e-02 1265 768 8.33333333333333e-02 1265 1158 -1.66666666666667e-01 1265 1163 -7.50000000000000e-01 1265 1273 4.16666666666667e-02 1265 772 -4.16666666666667e-02 1265 1263 -1.66666666666667e-01 1265 1161 1.66666666666667e-01 1265 771 8.33333333333333e-02 1265 886 4.16666666666667e-02 1265 1126 -8.33333333333333e-02 1265 770 -1.25000000000000e-01 1265 885 4.16666666666667e-02 1265 1125 -8.33333333333333e-02 1265 1264 -1.66666666666667e-01 1265 890 -1.25000000000000e-01 1265 773 -1.25000000000000e-01 1265 889 8.33333333333333e-02 1265 1129 -1.66666666666667e-01 1265 888 -4.16666666666667e-02 1265 1128 8.33333333333333e-02 1266 1266 1.25000000000000e+00 1266 1265 -4.16666666666667e-02 1266 1163 8.33333333333333e-02 1266 1264 8.33333333333333e-02 1266 1263 -1.25000000000000e-01 1266 1268 -1.66666666666667e-01 1266 1274 8.33333333333333e-02 1266 1273 8.33333333333333e-02 1266 1272 -3.75000000000000e-01 1266 1159 -8.33333333333333e-02 1266 923 8.33333333333333e-02 1266 1267 -1.66666666666667e-01 1266 911 -1.66666666666667e-01 1266 1166 1.66666666666667e-01 1266 910 8.33333333333333e-02 1266 1165 -8.33333333333333e-02 1266 770 4.16666666666667e-02 1266 1160 -8.33333333333333e-02 1266 922 8.33333333333333e-02 1266 769 -8.33333333333333e-02 1266 921 -3.75000000000000e-01 1266 929 -4.16666666666667e-02 1266 782 4.16666666666667e-02 1266 928 8.33333333333333e-02 1266 781 -8.33333333333333e-02 1266 927 -1.25000000000000e-01 1266 1162 8.33333333333333e-02 1266 1164 -2.50000000000000e-01 1267 1267 1.25000000000000e+00 1267 1265 8.33333333333333e-02 1267 1163 -1.66666666666667e-01 1267 770 4.16666666666667e-02 1267 1264 -3.75000000000000e-01 1267 1263 8.33333333333333e-02 1267 782 4.16666666666667e-02 1267 1274 -4.16666666666667e-02 1267 1273 -1.25000000000000e-01 1267 1272 8.33333333333333e-02 1267 1160 -8.33333333333333e-02 1267 1158 -8.33333333333333e-02 1267 923 -4.16666666666667e-02 1267 911 8.33333333333333e-02 1267 1266 -1.66666666666667e-01 1267 909 8.33333333333333e-02 1267 1164 -8.33333333333333e-02 1267 922 -1.25000000000000e-01 1267 921 8.33333333333333e-02 1267 768 -8.33333333333333e-02 1267 929 8.33333333333333e-02 1267 1268 -1.66666666666667e-01 1267 1166 1.66666666666667e-01 1267 928 -3.75000000000000e-01 1267 1161 8.33333333333333e-02 1267 1165 -2.50000000000000e-01 1267 927 8.33333333333333e-02 1267 780 -8.33333333333333e-02 1268 1268 1.25000000000000e+00 1268 1162 -1.66666666666667e-01 1268 1263 -4.16666666666667e-02 1268 1161 8.33333333333333e-02 1268 1265 -1.25000000000000e-01 1268 769 4.16666666666667e-02 1268 1274 -1.25000000000000e-01 1268 781 4.16666666666667e-02 1268 1273 -4.16666666666667e-02 1268 1266 -1.66666666666667e-01 1268 1272 8.33333333333333e-02 1268 1159 -8.33333333333333e-02 1268 922 -4.16666666666667e-02 1268 910 8.33333333333333e-02 1268 921 8.33333333333333e-02 1268 909 -1.66666666666667e-01 1268 1164 1.66666666666667e-01 1268 923 -1.25000000000000e-01 1268 768 4.16666666666667e-02 1268 1158 -8.33333333333333e-02 1268 929 -1.25000000000000e-01 1268 1264 8.33333333333333e-02 1268 1166 -7.50000000000000e-01 1268 928 8.33333333333333e-02 1268 1267 -1.66666666666667e-01 1268 1165 1.66666666666667e-01 1268 927 -4.16666666666667e-02 1268 780 4.16666666666667e-02 1269 1269 1.25000000000000e+00 1269 1261 8.33333333333333e-02 1269 1260 -1.25000000000000e-01 1269 1259 4.16666666666667e-02 1269 1258 -8.33333333333333e-02 1269 1148 8.33333333333333e-02 1269 1145 -8.33333333333333e-02 1269 1147 8.33333333333333e-02 1269 1144 -8.33333333333333e-02 1269 1180 -8.33333333333333e-02 1269 1177 8.33333333333333e-02 1269 947 4.16666666666667e-02 1269 944 -4.16666666666667e-02 1269 773 8.33333333333333e-02 1269 1178 -1.66666666666667e-01 1269 772 8.33333333333333e-02 1269 1270 -1.66666666666667e-01 1269 943 8.33333333333333e-02 1269 771 -3.75000000000000e-01 1269 942 -1.25000000000000e-01 1269 1271 -1.66666666666667e-01 1269 776 8.33333333333333e-02 1269 1181 1.66666666666667e-01 1269 775 8.33333333333333e-02 1269 946 -8.33333333333333e-02 1269 1262 -4.16666666666667e-02 1269 774 -3.75000000000000e-01 1269 1179 -2.50000000000000e-01 1270 1270 1.25000000000000e+00 1270 1262 8.33333333333333e-02 1270 1261 -3.75000000000000e-01 1270 1260 8.33333333333333e-02 1270 1257 -8.33333333333333e-02 1270 1145 -8.33333333333333e-02 1270 1148 -1.66666666666667e-01 1270 1146 8.33333333333333e-02 1270 1143 -8.33333333333333e-02 1270 1179 -8.33333333333333e-02 1270 1176 8.33333333333333e-02 1270 1181 1.66666666666667e-01 1270 1271 -1.66666666666667e-01 1270 944 8.33333333333333e-02 1270 773 -4.16666666666667e-02 1270 1178 8.33333333333333e-02 1270 772 -1.25000000000000e-01 1270 943 -3.75000000000000e-01 1270 771 8.33333333333333e-02 1270 1269 -1.66666666666667e-01 1270 942 8.33333333333333e-02 1270 776 -4.16666666666667e-02 1270 947 4.16666666666667e-02 1270 1259 4.16666666666667e-02 1270 775 -1.25000000000000e-01 1270 1180 -2.50000000000000e-01 1270 774 8.33333333333333e-02 1270 945 -8.33333333333333e-02 1271 1271 1.25000000000000e+00 1271 1262 -1.25000000000000e-01 1271 1261 8.33333333333333e-02 1271 1260 -4.16666666666667e-02 1271 1257 4.16666666666667e-02 1271 1146 8.33333333333333e-02 1271 1143 -8.33333333333333e-02 1271 1144 -8.33333333333333e-02 1271 1147 -1.66666666666667e-01 1271 1180 1.66666666666667e-01 1271 1270 -1.66666666666667e-01 1271 943 8.33333333333333e-02 1271 945 4.16666666666667e-02 1271 942 -4.16666666666667e-02 1271 773 -1.25000000000000e-01 1271 944 -1.25000000000000e-01 1271 772 -4.16666666666667e-02 1271 1177 8.33333333333333e-02 1271 771 8.33333333333333e-02 1271 1176 -1.66666666666667e-01 1271 1258 4.16666666666667e-02 1271 776 -1.25000000000000e-01 1271 1181 -7.50000000000000e-01 1271 775 -4.16666666666667e-02 1271 946 4.16666666666667e-02 1271 1269 -1.66666666666667e-01 1271 774 8.33333333333333e-02 1271 1179 1.66666666666667e-01 1272 1272 1.25000000000000e+00 1272 1268 8.33333333333333e-02 1272 1267 8.33333333333333e-02 1272 1266 -3.75000000000000e-01 1272 1264 -8.33333333333333e-02 1272 1163 -8.33333333333333e-02 1272 1166 -1.66666666666667e-01 1272 1165 8.33333333333333e-02 1272 1162 -8.33333333333333e-02 1272 1177 8.33333333333333e-02 1272 1183 -8.33333333333333e-02 1272 1274 -1.66666666666667e-01 1272 1184 1.66666666666667e-01 1272 944 8.33333333333333e-02 1272 782 -4.16666666666667e-02 1272 950 4.16666666666667e-02 1272 781 8.33333333333333e-02 1272 949 -8.33333333333333e-02 1272 780 -1.25000000000000e-01 1272 1182 -2.50000000000000e-01 1272 773 -4.16666666666667e-02 1272 1178 8.33333333333333e-02 1272 1273 -1.66666666666667e-01 1272 772 8.33333333333333e-02 1272 943 8.33333333333333e-02 1272 1265 4.16666666666667e-02 1272 771 -1.25000000000000e-01 1272 942 -3.75000000000000e-01 1273 1273 1.25000000000000e+00 1273 1267 -1.25000000000000e-01 1273 1266 8.33333333333333e-02 1273 1265 4.16666666666667e-02 1273 1263 -8.33333333333333e-02 1273 1166 8.33333333333333e-02 1273 1163 -8.33333333333333e-02 1273 1164 8.33333333333333e-02 1273 1161 -8.33333333333333e-02 1273 1176 8.33333333333333e-02 1273 1182 -8.33333333333333e-02 1273 950 4.16666666666667e-02 1273 944 -4.16666666666667e-02 1273 782 8.33333333333333e-02 1273 1274 -1.66666666666667e-01 1273 1184 1.66666666666667e-01 1273 781 -3.75000000000000e-01 1273 1183 -2.50000000000000e-01 1273 780 8.33333333333333e-02 1273 948 -8.33333333333333e-02 1273 773 8.33333333333333e-02 1273 1178 -1.66666666666667e-01 1273 1268 -4.16666666666667e-02 1273 772 -3.75000000000000e-01 1273 943 -1.25000000000000e-01 1273 1272 -1.66666666666667e-01 1273 771 8.33333333333333e-02 1273 942 8.33333333333333e-02 1274 1274 1.25000000000000e+00 1274 1268 -1.25000000000000e-01 1274 1267 -4.16666666666667e-02 1274 1266 8.33333333333333e-02 1274 1264 4.16666666666667e-02 1274 1165 8.33333333333333e-02 1274 1162 -8.33333333333333e-02 1274 1161 -8.33333333333333e-02 1274 1164 -1.66666666666667e-01 1274 949 4.16666666666667e-02 1274 943 -4.16666666666667e-02 1274 1272 -1.66666666666667e-01 1274 1182 1.66666666666667e-01 1274 942 8.33333333333333e-02 1274 782 -1.25000000000000e-01 1274 1184 -7.50000000000000e-01 1274 781 8.33333333333333e-02 1274 1273 -1.66666666666667e-01 1274 1183 1.66666666666667e-01 1274 780 -4.16666666666667e-02 1274 948 4.16666666666667e-02 1274 1263 4.16666666666667e-02 1274 773 -1.25000000000000e-01 1274 944 -1.25000000000000e-01 1274 772 8.33333333333333e-02 1274 1177 -1.66666666666667e-01 1274 771 -4.16666666666667e-02 1274 1176 8.33333333333333e-02 hypre-2.33.0/src/test/TEST_ij/data/beam_tet_dof2475_np4/A.IJ.00002000066400000000000000000021216611477326011500234440ustar00rootroot000000000000001275 1874 1275 1874 1275 1275 3.75000000000000e+01 1275 1400 4.16666666666667e+00 1275 1276 -4.16666666666667e+00 1275 1387 4.16666666666667e+00 1275 1386 -6.25000000000000e+00 1275 1277 -4.16666666666667e+00 1275 1394 4.16666666666667e+00 1275 1393 -2.08333333333333e+00 1275 1399 4.16666666666667e+00 1275 1388 -2.08333333333333e+00 1275 1392 -6.25000000000000e+00 1275 1391 2.08333333333333e+00 1275 1403 -4.16666666666667e+00 1275 1384 2.08333333333333e+00 1275 1390 -4.16666666666667e+00 1275 1385 2.08333333333333e+00 1275 1396 2.08333333333333e+00 1275 1402 -4.16666666666667e+00 1275 1383 -1.25000000000000e+01 1275 1397 -4.16666666666667e+00 1275 2029 2.08333333333333e+00 1275 2030 2.08333333333333e+00 1275 2028 -1.25000000000000e+01 1276 1276 3.33333333333333e+01 1276 1387 -1.87500000000000e+01 1276 1275 -4.16666666666667e+00 1276 1386 4.16666666666667e+00 1276 1394 4.16666666666667e+00 1276 1400 -8.33333333333333e+00 1276 1388 4.16666666666667e+00 1276 1393 -6.25000000000000e+00 1276 1392 -2.08333333333333e+00 1276 1398 4.16666666666667e+00 1276 1383 2.08333333333333e+00 1276 1389 -4.16666666666667e+00 1276 1384 -4.16666666666667e+00 1276 1395 2.08333333333333e+00 1276 1401 -4.16666666666667e+00 1276 1397 2.08333333333333e+00 1276 1403 -4.16666666666667e+00 1276 1391 2.08333333333333e+00 1276 2028 2.08333333333333e+00 1276 2029 -4.16666666666667e+00 1277 1277 3.33333333333333e+01 1277 1387 4.16666666666667e+00 1277 1386 -2.08333333333333e+00 1277 1398 4.16666666666667e+00 1277 1388 -6.25000000000000e+00 1277 1394 -1.87500000000000e+01 1277 1393 4.16666666666667e+00 1277 1399 -8.33333333333333e+00 1277 1275 -4.16666666666667e+00 1277 1392 4.16666666666667e+00 1277 1389 2.08333333333333e+00 1277 1401 -4.16666666666667e+00 1277 1385 -4.16666666666667e+00 1277 1383 2.08333333333333e+00 1277 1390 2.08333333333333e+00 1277 1396 2.08333333333333e+00 1277 1402 -4.16666666666667e+00 1277 1395 -4.16666666666667e+00 1277 2030 -4.16666666666667e+00 1277 2028 2.08333333333333e+00 1278 1278 3.75000000000000e+01 1278 1427 -4.16666666666667e+00 1278 1408 2.08333333333333e+00 1278 1414 -4.16666666666667e+00 1278 1409 2.08333333333333e+00 1278 1420 2.08333333333333e+00 1278 1426 -4.16666666666667e+00 1278 1407 -1.25000000000000e+01 1278 1421 -4.16666666666667e+00 1278 1412 -2.08333333333333e+00 1278 1424 4.16666666666667e+00 1278 1279 -4.16666666666667e+00 1278 1411 4.16666666666667e+00 1278 1405 2.08333333333333e+00 1278 1410 -6.25000000000000e+00 1278 1280 -4.16666666666667e+00 1278 1418 4.16666666666667e+00 1278 1406 2.08333333333333e+00 1278 1417 -2.08333333333333e+00 1278 1423 4.16666666666667e+00 1278 1415 2.08333333333333e+00 1278 1416 -6.25000000000000e+00 1278 1404 -1.25000000000000e+01 1279 1279 3.33333333333333e+01 1279 1407 2.08333333333333e+00 1279 1413 -4.16666666666667e+00 1279 1408 -4.16666666666667e+00 1279 1419 2.08333333333333e+00 1279 1425 -4.16666666666667e+00 1279 1421 2.08333333333333e+00 1279 1427 -4.16666666666667e+00 1279 1412 4.16666666666667e+00 1279 1411 -1.87500000000000e+01 1279 1278 -4.16666666666667e+00 1279 1410 4.16666666666667e+00 1279 1404 2.08333333333333e+00 1279 1418 4.16666666666667e+00 1279 1424 -8.33333333333333e+00 1279 1415 2.08333333333333e+00 1279 1417 -6.25000000000000e+00 1279 1405 -4.16666666666667e+00 1279 1416 -2.08333333333333e+00 1279 1422 4.16666666666667e+00 1280 1280 3.33333333333333e+01 1280 1413 2.08333333333333e+00 1280 1425 -4.16666666666667e+00 1280 1409 -4.16666666666667e+00 1280 1407 2.08333333333333e+00 1280 1420 2.08333333333333e+00 1280 1426 -4.16666666666667e+00 1280 1419 -4.16666666666667e+00 1280 1412 -6.25000000000000e+00 1280 1411 4.16666666666667e+00 1280 1410 -2.08333333333333e+00 1280 1422 4.16666666666667e+00 1280 1414 2.08333333333333e+00 1280 1418 -1.87500000000000e+01 1280 1406 -4.16666666666667e+00 1280 1417 4.16666666666667e+00 1280 1423 -8.33333333333333e+00 1280 1278 -4.16666666666667e+00 1280 1416 4.16666666666667e+00 1280 1404 2.08333333333333e+00 1281 1281 2.50000000000000e+01 1281 1439 4.16666666666667e+00 1281 1433 -2.08333333333333e+00 1281 1432 4.16666666666667e+00 1281 1431 -6.25000000000000e+00 1281 1283 -4.16666666666667e+00 1281 1437 -6.25000000000000e+00 1281 1435 2.08333333333333e+00 1281 1282 -4.16666666666667e+00 1281 1434 -6.25000000000000e+00 1281 1442 -4.16666666666667e+00 1281 1438 -2.08333333333333e+00 1281 1441 2.08333333333333e+00 1281 1436 2.08333333333333e+00 1281 2066 2.08333333333333e+00 1281 2065 2.08333333333333e+00 1281 2064 -6.25000000000000e+00 1281 2063 2.08333333333333e+00 1281 2062 -4.16666666666667e+00 1282 1282 2.91666666666667e+01 1282 1433 4.16666666666667e+00 1282 1283 -8.33333333333333e+00 1282 1439 4.16666666666667e+00 1282 1432 -1.87500000000000e+01 1282 1438 -6.25000000000000e+00 1282 1431 4.16666666666667e+00 1282 1442 2.08333333333333e+00 1282 1435 -2.08333333333333e+00 1282 1434 2.08333333333333e+00 1282 1281 -4.16666666666667e+00 1282 1436 -2.08333333333333e+00 1282 1437 -2.08333333333333e+00 1282 1440 2.08333333333333e+00 1282 2063 2.08333333333333e+00 1282 2065 -2.08333333333333e+00 1282 2064 2.08333333333333e+00 1282 2066 -2.08333333333333e+00 1282 2061 -4.16666666666667e+00 1283 1283 2.91666666666667e+01 1283 1281 -4.16666666666667e+00 1283 1437 4.16666666666667e+00 1283 1433 -6.25000000000000e+00 1283 1439 -1.87500000000000e+01 1283 1432 4.16666666666667e+00 1283 1282 -8.33333333333333e+00 1283 1438 4.16666666666667e+00 1283 1431 -2.08333333333333e+00 1283 1435 -2.08333333333333e+00 1283 1441 2.08333333333333e+00 1283 1434 2.08333333333333e+00 1283 1436 -2.08333333333333e+00 1283 1440 -4.16666666666667e+00 1283 2065 -2.08333333333333e+00 1283 2062 2.08333333333333e+00 1283 2064 2.08333333333333e+00 1283 2066 -2.08333333333333e+00 1283 2061 2.08333333333333e+00 1284 1284 2.50000000000000e+01 1284 1453 2.08333333333333e+00 1284 1285 -4.16666666666667e+00 1284 1452 -6.25000000000000e+00 1284 1460 -4.16666666666667e+00 1284 1456 -2.08333333333333e+00 1284 1459 2.08333333333333e+00 1284 1286 -4.16666666666667e+00 1284 1451 2.08333333333333e+00 1284 1457 4.16666666666667e+00 1284 1450 2.08333333333333e+00 1284 1449 -6.25000000000000e+00 1284 1448 -2.08333333333333e+00 1284 1445 2.08333333333333e+00 1284 1447 4.16666666666667e+00 1284 1444 -4.16666666666667e+00 1284 1446 -6.25000000000000e+00 1284 1454 2.08333333333333e+00 1284 1455 -6.25000000000000e+00 1285 1285 2.91666666666667e+01 1285 1460 2.08333333333333e+00 1285 1453 -2.08333333333333e+00 1285 1452 2.08333333333333e+00 1285 1284 -4.16666666666667e+00 1285 1455 -2.08333333333333e+00 1285 1458 2.08333333333333e+00 1285 1451 -2.08333333333333e+00 1285 1445 2.08333333333333e+00 1285 1450 -2.08333333333333e+00 1285 1449 2.08333333333333e+00 1285 1448 4.16666666666667e+00 1285 1286 -8.33333333333333e+00 1285 1457 4.16666666666667e+00 1285 1447 -1.87500000000000e+01 1285 1454 -2.08333333333333e+00 1285 1456 -6.25000000000000e+00 1285 1446 4.16666666666667e+00 1285 1443 -4.16666666666667e+00 1286 1286 2.91666666666667e+01 1286 1453 -2.08333333333333e+00 1286 1459 2.08333333333333e+00 1286 1452 2.08333333333333e+00 1286 1458 -4.16666666666667e+00 1286 1451 -2.08333333333333e+00 1286 1450 -2.08333333333333e+00 1286 1444 2.08333333333333e+00 1286 1284 -4.16666666666667e+00 1286 1449 2.08333333333333e+00 1286 1455 4.16666666666667e+00 1286 1448 -6.25000000000000e+00 1286 1454 -2.08333333333333e+00 1286 1457 -1.87500000000000e+01 1286 1447 4.16666666666667e+00 1286 1285 -8.33333333333333e+00 1286 1456 4.16666666666667e+00 1286 1446 -2.08333333333333e+00 1286 1443 2.08333333333333e+00 1287 1287 2.50000000000000e+01 1287 1468 -2.08333333333333e+00 1287 1467 -6.25000000000000e+00 1287 1288 -4.16666666666667e+00 1287 1474 4.16666666666667e+00 1287 1469 4.16666666666667e+00 1287 1473 -6.25000000000000e+00 1287 1478 2.08333333333333e+00 1287 1289 -4.16666666666667e+00 1287 1472 2.08333333333333e+00 1287 1471 2.08333333333333e+00 1287 1477 -4.16666666666667e+00 1287 1475 -2.08333333333333e+00 1287 1470 -6.25000000000000e+00 1287 2098 2.08333333333333e+00 1287 2102 2.08333333333333e+00 1287 2099 -4.16666666666667e+00 1287 2101 2.08333333333333e+00 1287 2100 -6.25000000000000e+00 1288 1288 2.91666666666667e+01 1288 1289 -8.33333333333333e+00 1288 1475 4.16666666666667e+00 1288 1468 -6.25000000000000e+00 1288 1467 -2.08333333333333e+00 1288 1469 4.16666666666667e+00 1288 1474 -1.87500000000000e+01 1288 1287 -4.16666666666667e+00 1288 1473 4.16666666666667e+00 1288 1472 -2.08333333333333e+00 1288 1478 2.08333333333333e+00 1288 1471 -2.08333333333333e+00 1288 1470 2.08333333333333e+00 1288 1476 -4.16666666666667e+00 1288 2097 2.08333333333333e+00 1288 2102 -2.08333333333333e+00 1288 2099 2.08333333333333e+00 1288 2101 -2.08333333333333e+00 1288 2100 2.08333333333333e+00 1289 1289 2.91666666666667e+01 1289 1468 4.16666666666667e+00 1289 1288 -8.33333333333333e+00 1289 1474 4.16666666666667e+00 1289 1467 4.16666666666667e+00 1289 1469 -1.87500000000000e+01 1289 1475 -6.25000000000000e+00 1289 1473 -2.08333333333333e+00 1289 1476 2.08333333333333e+00 1289 1472 -2.08333333333333e+00 1289 1471 -2.08333333333333e+00 1289 1477 2.08333333333333e+00 1289 1287 -4.16666666666667e+00 1289 1470 2.08333333333333e+00 1289 2102 -2.08333333333333e+00 1289 2101 -2.08333333333333e+00 1289 2098 2.08333333333333e+00 1289 2100 2.08333333333333e+00 1289 2097 -4.16666666666667e+00 1290 1290 2.50000000000000e+01 1290 1496 2.08333333333333e+00 1290 1292 -4.16666666666667e+00 1290 1490 2.08333333333333e+00 1290 1489 2.08333333333333e+00 1290 1495 -4.16666666666667e+00 1290 1488 -6.25000000000000e+00 1290 1484 4.16666666666667e+00 1290 1483 -2.08333333333333e+00 1290 1480 2.08333333333333e+00 1290 1482 -6.25000000000000e+00 1290 1487 2.08333333333333e+00 1290 1481 -4.16666666666667e+00 1290 1486 2.08333333333333e+00 1290 1291 -4.16666666666667e+00 1290 1492 4.16666666666667e+00 1290 1485 -6.25000000000000e+00 1290 1493 -2.08333333333333e+00 1290 1491 -6.25000000000000e+00 1291 1291 2.91666666666667e+01 1291 1496 2.08333333333333e+00 1291 1489 -2.08333333333333e+00 1291 1488 2.08333333333333e+00 1291 1494 -4.16666666666667e+00 1291 1484 4.16666666666667e+00 1291 1292 -8.33333333333333e+00 1291 1493 4.16666666666667e+00 1291 1483 -6.25000000000000e+00 1291 1482 -2.08333333333333e+00 1291 1479 2.08333333333333e+00 1291 1487 -2.08333333333333e+00 1291 1481 2.08333333333333e+00 1291 1486 -2.08333333333333e+00 1291 1490 -2.08333333333333e+00 1291 1492 -1.87500000000000e+01 1291 1485 2.08333333333333e+00 1291 1290 -4.16666666666667e+00 1291 1491 4.16666666666667e+00 1292 1292 2.91666666666667e+01 1292 1494 2.08333333333333e+00 1292 1490 -2.08333333333333e+00 1292 1489 -2.08333333333333e+00 1292 1495 2.08333333333333e+00 1292 1290 -4.16666666666667e+00 1292 1488 2.08333333333333e+00 1292 1484 -1.87500000000000e+01 1292 1483 4.16666666666667e+00 1292 1291 -8.33333333333333e+00 1292 1492 4.16666666666667e+00 1292 1482 4.16666666666667e+00 1292 1487 -2.08333333333333e+00 1292 1491 -2.08333333333333e+00 1292 1493 -6.25000000000000e+00 1292 1486 -2.08333333333333e+00 1292 1480 2.08333333333333e+00 1292 1485 2.08333333333333e+00 1292 1479 -4.16666666666667e+00 1293 1293 3.75000000000000e+01 1293 1505 4.16666666666667e+00 1293 1506 -6.25000000000000e+00 1293 1504 4.16666666666667e+00 1293 1510 4.16666666666667e+00 1293 1509 -6.25000000000000e+00 1293 1508 4.16666666666667e+00 1293 1514 2.08333333333333e+00 1293 1507 -2.08333333333333e+00 1293 1511 -2.08333333333333e+00 1293 1294 -4.16666666666667e+00 1293 1513 2.08333333333333e+00 1293 1295 -4.16666666666667e+00 1293 1512 -1.25000000000000e+01 1293 2150 2.08333333333333e+00 1293 2144 -4.16666666666667e+00 1293 2143 2.08333333333333e+00 1293 2147 2.08333333333333e+00 1293 2149 2.08333333333333e+00 1293 2148 -1.25000000000000e+01 1293 2141 -4.16666666666667e+00 1293 2140 -4.16666666666667e+00 1293 2146 -4.16666666666667e+00 1294 1294 3.33333333333333e+01 1294 1508 4.16666666666667e+00 1294 1507 -6.25000000000000e+00 1294 1505 -8.33333333333333e+00 1294 1511 4.16666666666667e+00 1294 1503 4.16666666666667e+00 1294 1510 -1.87500000000000e+01 1294 1509 4.16666666666667e+00 1294 1506 -2.08333333333333e+00 1294 1513 -4.16666666666667e+00 1294 1293 -4.16666666666667e+00 1294 1512 2.08333333333333e+00 1294 2142 2.08333333333333e+00 1294 2149 -4.16666666666667e+00 1294 2148 2.08333333333333e+00 1294 2139 -4.16666666666667e+00 1294 2147 2.08333333333333e+00 1294 2141 -4.16666666666667e+00 1294 2144 2.08333333333333e+00 1294 2145 -4.16666666666667e+00 1295 1295 3.33333333333333e+01 1295 1506 4.16666666666667e+00 1295 1508 -1.87500000000000e+01 1295 1507 4.16666666666667e+00 1295 1503 4.16666666666667e+00 1295 1504 -8.33333333333333e+00 1295 1510 4.16666666666667e+00 1295 1511 -6.25000000000000e+00 1295 1293 -4.16666666666667e+00 1295 1512 2.08333333333333e+00 1295 1514 -4.16666666666667e+00 1295 1509 -2.08333333333333e+00 1295 2148 2.08333333333333e+00 1295 2142 -4.16666666666667e+00 1295 2150 -4.16666666666667e+00 1295 2145 2.08333333333333e+00 1295 2139 -4.16666666666667e+00 1295 2143 2.08333333333333e+00 1295 2146 2.08333333333333e+00 1295 2140 -4.16666666666667e+00 1296 1296 3.75000000000000e+01 1296 1538 2.08333333333333e+00 1296 1525 -2.08333333333333e+00 1296 1532 -2.08333333333333e+00 1296 1297 -4.16666666666667e+00 1296 1537 2.08333333333333e+00 1296 1536 -1.25000000000000e+01 1296 1526 4.16666666666667e+00 1296 1535 2.08333333333333e+00 1296 1523 -4.16666666666667e+00 1296 1522 2.08333333333333e+00 1296 1529 2.08333333333333e+00 1296 1534 2.08333333333333e+00 1296 1533 -1.25000000000000e+01 1296 1520 4.16666666666667e+00 1296 1517 -4.16666666666667e+00 1296 1524 -6.25000000000000e+00 1296 1519 4.16666666666667e+00 1296 1516 -4.16666666666667e+00 1296 1528 -4.16666666666667e+00 1296 1531 4.16666666666667e+00 1296 1530 -6.25000000000000e+00 1296 1298 -4.16666666666667e+00 1297 1297 3.33333333333333e+01 1297 1537 -4.16666666666667e+00 1297 1296 -4.16666666666667e+00 1297 1536 2.08333333333333e+00 1297 1523 2.08333333333333e+00 1297 1521 2.08333333333333e+00 1297 1534 -4.16666666666667e+00 1297 1533 2.08333333333333e+00 1297 1526 4.16666666666667e+00 1297 1525 -6.25000000000000e+00 1297 1520 -8.33333333333333e+00 1297 1532 4.16666666666667e+00 1297 1518 4.16666666666667e+00 1297 1515 -4.16666666666667e+00 1297 1529 2.08333333333333e+00 1297 1517 -4.16666666666667e+00 1297 1531 -1.87500000000000e+01 1297 1524 -2.08333333333333e+00 1297 1527 -4.16666666666667e+00 1297 1530 4.16666666666667e+00 1298 1298 3.33333333333333e+01 1298 1536 2.08333333333333e+00 1298 1538 -4.16666666666667e+00 1298 1530 -2.08333333333333e+00 1298 1522 2.08333333333333e+00 1298 1524 4.16666666666667e+00 1298 1533 2.08333333333333e+00 1298 1521 -4.16666666666667e+00 1298 1535 -4.16666666666667e+00 1298 1527 2.08333333333333e+00 1298 1526 -1.87500000000000e+01 1298 1525 4.16666666666667e+00 1298 1518 4.16666666666667e+00 1298 1515 -4.16666666666667e+00 1298 1519 -8.33333333333333e+00 1298 1531 4.16666666666667e+00 1298 1532 -6.25000000000000e+00 1298 1296 -4.16666666666667e+00 1298 1528 2.08333333333333e+00 1298 1516 -4.16666666666667e+00 1299 1299 3.75000000000000e+01 1299 1405 2.08333333333333e+00 1299 1561 -4.16666666666667e+00 1299 1553 -2.08333333333333e+00 1299 1300 -4.16666666666667e+00 1299 1552 4.16666666666667e+00 1299 1384 2.08333333333333e+00 1299 1551 -6.25000000000000e+00 1299 1568 -4.16666666666667e+00 1299 1559 4.16666666666667e+00 1299 1406 2.08333333333333e+00 1299 1565 -4.16666666666667e+00 1299 1564 2.08333333333333e+00 1299 1567 -4.16666666666667e+00 1299 1404 -1.25000000000000e+01 1299 1301 -4.16666666666667e+00 1299 1556 4.16666666666667e+00 1299 1385 2.08333333333333e+00 1299 1555 -2.08333333333333e+00 1299 1558 4.16666666666667e+00 1299 1562 2.08333333333333e+00 1299 1554 -6.25000000000000e+00 1299 1383 -1.25000000000000e+01 1300 1300 3.33333333333333e+01 1300 1404 2.08333333333333e+00 1300 1560 -4.16666666666667e+00 1300 1553 4.16666666666667e+00 1300 1552 -1.87500000000000e+01 1300 1299 -4.16666666666667e+00 1300 1551 4.16666666666667e+00 1300 1383 2.08333333333333e+00 1300 1565 2.08333333333333e+00 1300 1568 -4.16666666666667e+00 1300 1405 -4.16666666666667e+00 1300 1563 2.08333333333333e+00 1300 1566 -4.16666666666667e+00 1300 1556 4.16666666666667e+00 1300 1559 -8.33333333333333e+00 1300 1562 2.08333333333333e+00 1300 1555 -6.25000000000000e+00 1300 1384 -4.16666666666667e+00 1300 1554 -2.08333333333333e+00 1300 1557 4.16666666666667e+00 1301 1301 3.33333333333333e+01 1301 1560 2.08333333333333e+00 1301 1553 -6.25000000000000e+00 1301 1552 4.16666666666667e+00 1301 1551 -2.08333333333333e+00 1301 1564 2.08333333333333e+00 1301 1567 -4.16666666666667e+00 1301 1566 -4.16666666666667e+00 1301 1557 4.16666666666667e+00 1301 1406 -4.16666666666667e+00 1301 1404 2.08333333333333e+00 1301 1563 -4.16666666666667e+00 1301 1561 2.08333333333333e+00 1301 1556 -1.87500000000000e+01 1301 1385 -4.16666666666667e+00 1301 1555 4.16666666666667e+00 1301 1558 -8.33333333333333e+00 1301 1299 -4.16666666666667e+00 1301 1554 4.16666666666667e+00 1301 1383 2.08333333333333e+00 1302 1302 6.25000000000000e+01 1302 1304 -8.33333333333333e+00 1302 1574 8.33333333333333e+00 1302 1582 4.16666666666667e+00 1302 1573 -4.16666666666667e+00 1302 1388 -2.08333333333333e+00 1302 1387 4.16666666666667e+00 1302 1386 -6.25000000000000e+00 1302 1572 -1.25000000000000e+01 1302 1433 -2.08333333333333e+00 1302 1583 4.16666666666667e+00 1302 1303 -8.33333333333333e+00 1302 1432 4.16666666666667e+00 1302 1431 -6.25000000000000e+00 1302 1579 -4.16666666666667e+00 1302 1571 4.16666666666667e+00 1302 1570 4.16666666666667e+00 1302 1569 -1.87500000000000e+01 1302 1586 -4.16666666666667e+00 1302 1585 -4.16666666666667e+00 1302 1577 -8.33333333333333e+00 1302 1576 4.16666666666667e+00 1302 1580 2.08333333333333e+00 1302 2288 2.08333333333333e+00 1302 2287 -4.16666666666667e+00 1302 2317 4.16666666666667e+00 1302 2318 4.16666666666667e+00 1302 2316 -1.87500000000000e+01 1303 1303 6.25000000000000e+01 1303 1581 4.16666666666667e+00 1303 1572 -4.16666666666667e+00 1303 1388 4.16666666666667e+00 1303 1304 -8.33333333333333e+00 1303 1574 8.33333333333333e+00 1303 1387 -1.87500000000000e+01 1303 1573 -1.25000000000000e+01 1303 1386 4.16666666666667e+00 1303 1433 4.16666666666667e+00 1303 1583 -8.33333333333333e+00 1303 1432 -1.87500000000000e+01 1303 1302 -8.33333333333333e+00 1303 1431 4.16666666666667e+00 1303 1578 -4.16666666666667e+00 1303 1571 -2.08333333333333e+00 1303 1570 -6.25000000000000e+00 1303 1569 4.16666666666667e+00 1303 1586 -4.16666666666667e+00 1303 1577 4.16666666666667e+00 1303 1584 -4.16666666666667e+00 1303 1580 2.08333333333333e+00 1303 1575 4.16666666666667e+00 1303 2288 2.08333333333333e+00 1303 2286 -4.16666666666667e+00 1303 2318 -2.08333333333333e+00 1303 2317 -6.25000000000000e+00 1303 2316 4.16666666666667e+00 1304 1304 6.25000000000000e+01 1304 1302 -8.33333333333333e+00 1304 1572 8.33333333333333e+00 1304 1388 -6.25000000000000e+00 1304 1574 -3.75000000000000e+01 1304 1387 4.16666666666667e+00 1304 1303 -8.33333333333333e+00 1304 1573 8.33333333333333e+00 1304 1386 -2.08333333333333e+00 1304 1433 -6.25000000000000e+00 1304 1432 4.16666666666667e+00 1304 1582 -8.33333333333333e+00 1304 1431 -2.08333333333333e+00 1304 1581 4.16666666666667e+00 1304 1579 2.08333333333333e+00 1304 1571 -6.25000000000000e+00 1304 1570 -2.08333333333333e+00 1304 1569 4.16666666666667e+00 1304 1584 -4.16666666666667e+00 1304 1585 -4.16666666666667e+00 1304 1576 4.16666666666667e+00 1304 1578 2.08333333333333e+00 1304 1575 -8.33333333333333e+00 1304 2287 2.08333333333333e+00 1304 2316 4.16666666666667e+00 1304 2286 2.08333333333333e+00 1304 2317 -2.08333333333333e+00 1304 2318 -6.25000000000000e+00 1305 1305 6.25000000000000e+01 1305 1600 4.16666666666667e+00 1305 1601 4.16666666666667e+00 1305 1597 4.16666666666667e+00 1305 1596 -6.25000000000000e+00 1305 1307 -8.33333333333333e+00 1305 1571 4.16666666666667e+00 1305 1570 4.16666666666667e+00 1305 1569 -1.87500000000000e+01 1305 1588 -4.16666666666667e+00 1305 1306 -8.33333333333333e+00 1305 1592 4.16666666666667e+00 1305 1603 -4.16666666666667e+00 1305 1594 4.16666666666667e+00 1305 1589 8.33333333333333e+00 1305 1595 -8.33333333333333e+00 1305 1445 2.08333333333333e+00 1305 1604 -4.16666666666667e+00 1305 1591 4.16666666666667e+00 1305 1444 -4.16666666666667e+00 1305 1590 -1.87500000000000e+01 1305 1553 -2.08333333333333e+00 1305 1391 2.08333333333333e+00 1305 1552 4.16666666666667e+00 1305 1390 -4.16666666666667e+00 1305 1551 -6.25000000000000e+00 1305 1598 -2.08333333333333e+00 1305 1587 -1.25000000000000e+01 1306 1306 6.25000000000000e+01 1306 1599 4.16666666666667e+00 1306 1601 -8.33333333333333e+00 1306 1445 2.08333333333333e+00 1306 1597 -1.87500000000000e+01 1306 1596 4.16666666666667e+00 1306 1571 -2.08333333333333e+00 1306 1391 2.08333333333333e+00 1306 1570 -6.25000000000000e+00 1306 1569 4.16666666666667e+00 1306 1587 -4.16666666666667e+00 1306 1592 -2.08333333333333e+00 1306 1305 -8.33333333333333e+00 1306 1602 -4.16666666666667e+00 1306 1593 4.16666666666667e+00 1306 1604 -4.16666666666667e+00 1306 1595 4.16666666666667e+00 1306 1591 -6.25000000000000e+00 1306 1590 4.16666666666667e+00 1306 1443 -4.16666666666667e+00 1306 1553 4.16666666666667e+00 1306 1307 -8.33333333333333e+00 1306 1589 8.33333333333333e+00 1306 1552 -1.87500000000000e+01 1306 1598 4.16666666666667e+00 1306 1588 -1.25000000000000e+01 1306 1551 4.16666666666667e+00 1306 1389 -4.16666666666667e+00 1307 1307 6.25000000000000e+01 1307 1597 4.16666666666667e+00 1307 1600 -8.33333333333333e+00 1307 1599 4.16666666666667e+00 1307 1598 -6.25000000000000e+00 1307 1444 2.08333333333333e+00 1307 1571 -6.25000000000000e+00 1307 1570 -2.08333333333333e+00 1307 1390 2.08333333333333e+00 1307 1305 -8.33333333333333e+00 1307 1569 4.16666666666667e+00 1307 1591 -2.08333333333333e+00 1307 1590 4.16666666666667e+00 1307 1603 -4.16666666666667e+00 1307 1594 4.16666666666667e+00 1307 1587 8.33333333333333e+00 1307 1593 -8.33333333333333e+00 1307 1592 -6.25000000000000e+00 1307 1443 2.08333333333333e+00 1307 1602 -4.16666666666667e+00 1307 1553 -6.25000000000000e+00 1307 1596 -2.08333333333333e+00 1307 1589 -3.75000000000000e+01 1307 1552 4.16666666666667e+00 1307 1306 -8.33333333333333e+00 1307 1588 8.33333333333333e+00 1307 1551 -2.08333333333333e+00 1307 1389 2.08333333333333e+00 1308 1308 6.25000000000000e+01 1308 1610 -4.16666666666667e+00 1308 1309 -8.33333333333333e+00 1308 1609 8.33333333333333e+00 1308 1394 4.16666666666667e+00 1308 1393 -2.08333333333333e+00 1308 1392 -6.25000000000000e+00 1308 1608 -1.25000000000000e+01 1308 1310 -8.33333333333333e+00 1308 1469 4.16666666666667e+00 1308 1468 -2.08333333333333e+00 1308 1618 4.16666666666667e+00 1308 1619 4.16666666666667e+00 1308 1467 -6.25000000000000e+00 1308 1613 4.16666666666667e+00 1308 1622 -4.16666666666667e+00 1308 1615 2.08333333333333e+00 1308 1621 -4.16666666666667e+00 1308 1616 -4.16666666666667e+00 1308 1607 4.16666666666667e+00 1308 1606 4.16666666666667e+00 1308 1612 -8.33333333333333e+00 1308 1605 -1.87500000000000e+01 1308 2353 4.16666666666667e+00 1308 2291 -4.16666666666667e+00 1308 2290 2.08333333333333e+00 1308 2354 4.16666666666667e+00 1308 2352 -1.87500000000000e+01 1309 1309 6.25000000000000e+01 1309 1308 -8.33333333333333e+00 1309 1608 8.33333333333333e+00 1309 1394 4.16666666666667e+00 1309 1310 -8.33333333333333e+00 1309 1610 8.33333333333333e+00 1309 1393 -6.25000000000000e+00 1309 1609 -3.75000000000000e+01 1309 1392 -2.08333333333333e+00 1309 1469 4.16666666666667e+00 1309 1619 -8.33333333333333e+00 1309 1468 -6.25000000000000e+00 1309 1467 -2.08333333333333e+00 1309 1617 4.16666666666667e+00 1309 1614 2.08333333333333e+00 1309 1620 -4.16666666666667e+00 1309 1616 2.08333333333333e+00 1309 1622 -4.16666666666667e+00 1309 1607 -2.08333333333333e+00 1309 1613 4.16666666666667e+00 1309 1606 -6.25000000000000e+00 1309 1605 4.16666666666667e+00 1309 1611 -8.33333333333333e+00 1309 2354 -2.08333333333333e+00 1309 2352 4.16666666666667e+00 1309 2289 2.08333333333333e+00 1309 2291 2.08333333333333e+00 1309 2353 -6.25000000000000e+00 1310 1310 6.25000000000000e+01 1310 1608 -4.16666666666667e+00 1310 1394 -1.87500000000000e+01 1310 1610 -1.25000000000000e+01 1310 1393 4.16666666666667e+00 1310 1309 -8.33333333333333e+00 1310 1609 8.33333333333333e+00 1310 1392 4.16666666666667e+00 1310 1617 4.16666666666667e+00 1310 1469 -1.87500000000000e+01 1310 1468 4.16666666666667e+00 1310 1618 -8.33333333333333e+00 1310 1308 -8.33333333333333e+00 1310 1467 4.16666666666667e+00 1310 1611 4.16666666666667e+00 1310 1620 -4.16666666666667e+00 1310 1615 2.08333333333333e+00 1310 1621 -4.16666666666667e+00 1310 1614 -4.16666666666667e+00 1310 1607 -6.25000000000000e+00 1310 1606 -2.08333333333333e+00 1310 1612 4.16666666666667e+00 1310 1605 4.16666666666667e+00 1310 2290 2.08333333333333e+00 1310 2353 -2.08333333333333e+00 1310 2289 -4.16666666666667e+00 1310 2354 -6.25000000000000e+00 1310 2352 4.16666666666667e+00 1311 1311 6.25000000000000e+01 1311 1631 4.16666666666667e+00 1311 1630 -8.33333333333333e+00 1311 1628 4.16666666666667e+00 1311 1480 2.08333333333333e+00 1311 1626 -1.87500000000000e+01 1311 1556 4.16666666666667e+00 1311 1555 -2.08333333333333e+00 1311 1396 2.08333333333333e+00 1311 1554 -6.25000000000000e+00 1311 1625 -4.16666666666667e+00 1311 1313 -8.33333333333333e+00 1311 1633 -2.08333333333333e+00 1311 1640 -4.16666666666667e+00 1311 1637 4.16666666666667e+00 1311 1639 -4.16666666666667e+00 1311 1636 4.16666666666667e+00 1311 1634 4.16666666666667e+00 1311 1481 -4.16666666666667e+00 1311 1632 -6.25000000000000e+00 1311 1607 4.16666666666667e+00 1311 1397 -4.16666666666667e+00 1311 1606 4.16666666666667e+00 1311 1312 -8.33333333333333e+00 1311 1624 8.33333333333333e+00 1311 1605 -1.87500000000000e+01 1311 1627 4.16666666666667e+00 1311 1623 -1.25000000000000e+01 1312 1312 6.25000000000000e+01 1312 1631 4.16666666666667e+00 1312 1626 4.16666666666667e+00 1312 1629 -8.33333333333333e+00 1312 1627 -6.25000000000000e+00 1312 1479 2.08333333333333e+00 1312 1556 4.16666666666667e+00 1312 1313 -8.33333333333333e+00 1312 1555 -6.25000000000000e+00 1312 1554 -2.08333333333333e+00 1312 1395 2.08333333333333e+00 1312 1632 -2.08333333333333e+00 1312 1634 4.16666666666667e+00 1312 1625 8.33333333333333e+00 1312 1637 -8.33333333333333e+00 1312 1638 -4.16666666666667e+00 1312 1635 4.16666666666667e+00 1312 1481 2.08333333333333e+00 1312 1640 -4.16666666666667e+00 1312 1633 -6.25000000000000e+00 1312 1607 -2.08333333333333e+00 1312 1397 2.08333333333333e+00 1312 1606 -6.25000000000000e+00 1312 1628 -2.08333333333333e+00 1312 1624 -3.75000000000000e+01 1312 1605 4.16666666666667e+00 1312 1311 -8.33333333333333e+00 1312 1623 8.33333333333333e+00 1313 1313 6.25000000000000e+01 1313 1630 4.16666666666667e+00 1313 1629 4.16666666666667e+00 1313 1628 -6.25000000000000e+00 1313 1626 4.16666666666667e+00 1313 1556 -1.87500000000000e+01 1313 1555 4.16666666666667e+00 1313 1312 -8.33333333333333e+00 1313 1554 4.16666666666667e+00 1313 1623 -4.16666666666667e+00 1313 1311 -8.33333333333333e+00 1313 1633 4.16666666666667e+00 1313 1638 -4.16666666666667e+00 1313 1635 4.16666666666667e+00 1313 1624 8.33333333333333e+00 1313 1636 -8.33333333333333e+00 1313 1634 -1.87500000000000e+01 1313 1480 2.08333333333333e+00 1313 1639 -4.16666666666667e+00 1313 1632 4.16666666666667e+00 1313 1479 -4.16666666666667e+00 1313 1607 -6.25000000000000e+00 1313 1627 -2.08333333333333e+00 1313 1625 -1.25000000000000e+01 1313 1606 -2.08333333333333e+00 1313 1396 2.08333333333333e+00 1313 1605 4.16666666666667e+00 1313 1395 -4.16666666666667e+00 1314 1314 1.25000000000000e+02 1314 1573 -4.16666666666667e+00 1314 1400 4.16666666666667e+00 1314 1572 -1.25000000000000e+01 1314 1646 -4.16666666666667e+00 1314 1505 4.16666666666667e+00 1314 1315 -1.66666666666667e+01 1314 1645 8.33333333333333e+00 1314 1644 -1.25000000000000e+01 1314 1610 -4.16666666666667e+00 1314 1609 8.33333333333333e+00 1314 1399 4.16666666666667e+00 1314 1608 -1.25000000000000e+01 1314 1316 -1.66666666666667e+01 1314 1652 8.33333333333333e+00 1314 1651 -4.16666666666667e+00 1314 1504 4.16666666666667e+00 1314 1574 8.33333333333333e+00 1314 1650 -1.25000000000000e+01 1314 1648 -8.33333333333333e+00 1314 1643 8.33333333333333e+00 1314 1655 -8.33333333333333e+00 1314 1657 -4.16666666666667e+00 1314 1654 4.16666666666667e+00 1314 1658 -4.16666666666667e+00 1314 1642 8.33333333333333e+00 1314 1649 4.16666666666667e+00 1314 1641 -3.75000000000000e+01 1314 2320 4.16666666666667e+00 1314 2321 -8.33333333333333e+00 1314 2294 -4.16666666666667e+00 1314 2357 4.16666666666667e+00 1314 2386 8.33333333333333e+00 1314 2356 -8.33333333333333e+00 1314 2293 -4.16666666666667e+00 1314 2387 8.33333333333333e+00 1314 2385 -3.75000000000000e+01 1315 1315 1.25000000000000e+02 1315 1572 -4.16666666666667e+00 1315 1574 8.33333333333333e+00 1315 1573 -1.25000000000000e+01 1315 1646 8.33333333333333e+00 1315 1645 -3.75000000000000e+01 1315 1314 -1.66666666666667e+01 1315 1644 8.33333333333333e+00 1315 1316 -1.66666666666667e+01 1315 1608 8.33333333333333e+00 1315 1400 -8.33333333333333e+00 1315 1610 8.33333333333333e+00 1315 1609 -3.75000000000000e+01 1315 1398 4.16666666666667e+00 1315 1652 8.33333333333333e+00 1315 1505 -8.33333333333333e+00 1315 1651 -1.25000000000000e+01 1315 1650 -4.16666666666667e+00 1315 1503 4.16666666666667e+00 1315 1649 4.16666666666667e+00 1315 1647 -8.33333333333333e+00 1315 1643 -4.16666666666667e+00 1315 1658 -4.16666666666667e+00 1315 1655 4.16666666666667e+00 1315 1656 -4.16666666666667e+00 1315 1653 4.16666666666667e+00 1315 1642 -1.25000000000000e+01 1315 1641 8.33333333333333e+00 1315 2321 4.16666666666667e+00 1315 2387 -4.16666666666667e+00 1315 2294 -4.16666666666667e+00 1315 2357 4.16666666666667e+00 1315 2385 8.33333333333333e+00 1315 2355 -8.33333333333333e+00 1315 2292 -4.16666666666667e+00 1315 2319 4.16666666666667e+00 1315 2386 -1.25000000000000e+01 1316 1316 1.25000000000000e+02 1316 1574 -3.75000000000000e+01 1316 1573 8.33333333333333e+00 1316 1398 4.16666666666667e+00 1316 1646 -1.25000000000000e+01 1316 1645 8.33333333333333e+00 1316 1644 -4.16666666666667e+00 1316 1503 4.16666666666667e+00 1316 1315 -1.66666666666667e+01 1316 1608 -4.16666666666667e+00 1316 1610 -1.25000000000000e+01 1316 1399 -8.33333333333333e+00 1316 1609 8.33333333333333e+00 1316 1572 8.33333333333333e+00 1316 1652 -3.75000000000000e+01 1316 1651 8.33333333333333e+00 1316 1504 -8.33333333333333e+00 1316 1314 -1.66666666666667e+01 1316 1650 8.33333333333333e+00 1316 1648 4.16666666666667e+00 1316 1642 -4.16666666666667e+00 1316 1657 -4.16666666666667e+00 1316 1654 4.16666666666667e+00 1316 1641 8.33333333333333e+00 1316 1653 -8.33333333333333e+00 1316 1656 -4.16666666666667e+00 1316 1647 4.16666666666667e+00 1316 1643 -1.25000000000000e+01 1316 2320 4.16666666666667e+00 1316 2319 -8.33333333333333e+00 1316 2386 -4.16666666666667e+00 1316 2293 -4.16666666666667e+00 1316 2356 4.16666666666667e+00 1316 2292 -4.16666666666667e+00 1316 2355 4.16666666666667e+00 1316 2387 -1.25000000000000e+01 1316 2385 8.33333333333333e+00 1317 1317 1.25000000000000e+02 1317 1663 8.33333333333333e+00 1317 1662 -1.25000000000000e+01 1317 1577 -8.33333333333333e+00 1317 1576 4.16666666666667e+00 1317 1643 8.33333333333333e+00 1317 1675 4.16666666666667e+00 1317 1642 8.33333333333333e+00 1317 1641 -3.75000000000000e+01 1317 1676 4.16666666666667e+00 1317 1588 -4.16666666666667e+00 1317 1589 8.33333333333333e+00 1317 1319 -1.66666666666667e+01 1317 1403 -4.16666666666667e+00 1317 1587 -1.25000000000000e+01 1317 1667 4.16666666666667e+00 1317 1517 -4.16666666666667e+00 1317 1666 -8.33333333333333e+00 1317 1559 4.16666666666667e+00 1317 1660 8.33333333333333e+00 1317 1318 -1.66666666666667e+01 1317 1661 8.33333333333333e+00 1317 1516 -4.16666666666667e+00 1317 1659 -3.75000000000000e+01 1317 1558 4.16666666666667e+00 1317 1402 -4.16666666666667e+00 1317 1625 -4.16666666666667e+00 1317 1613 4.16666666666667e+00 1317 1672 4.16666666666667e+00 1317 1669 -4.16666666666667e+00 1317 1612 -8.33333333333333e+00 1317 1624 8.33333333333333e+00 1317 1623 -1.25000000000000e+01 1317 1670 8.33333333333333e+00 1317 1673 -8.33333333333333e+00 1317 1668 -1.25000000000000e+01 1317 1664 -4.16666666666667e+00 1318 1318 1.25000000000000e+02 1318 1662 8.33333333333333e+00 1318 1664 8.33333333333333e+00 1318 1663 -3.75000000000000e+01 1318 1575 4.16666666666667e+00 1318 1643 -4.16666666666667e+00 1318 1674 4.16666666666667e+00 1318 1642 -1.25000000000000e+01 1318 1641 8.33333333333333e+00 1318 1676 -8.33333333333333e+00 1318 1587 -4.16666666666667e+00 1318 1667 4.16666666666667e+00 1318 1589 8.33333333333333e+00 1318 1588 -1.25000000000000e+01 1318 1665 -8.33333333333333e+00 1318 1661 -4.16666666666667e+00 1318 1659 8.33333333333333e+00 1318 1317 -1.66666666666667e+01 1318 1660 -1.25000000000000e+01 1318 1515 -4.16666666666667e+00 1318 1559 -8.33333333333333e+00 1318 1557 4.16666666666667e+00 1318 1401 -4.16666666666667e+00 1318 1625 8.33333333333333e+00 1318 1319 -1.66666666666667e+01 1318 1670 8.33333333333333e+00 1318 1671 4.16666666666667e+00 1318 1668 -4.16666666666667e+00 1318 1613 4.16666666666667e+00 1318 1403 -4.16666666666667e+00 1318 1624 -3.75000000000000e+01 1318 1611 -8.33333333333333e+00 1318 1623 8.33333333333333e+00 1318 1673 4.16666666666667e+00 1318 1517 -4.16666666666667e+00 1318 1669 -1.25000000000000e+01 1318 1577 4.16666666666667e+00 1319 1319 1.25000000000000e+02 1319 1576 4.16666666666667e+00 1319 1664 -1.25000000000000e+01 1319 1663 8.33333333333333e+00 1319 1575 -8.33333333333333e+00 1319 1642 -4.16666666666667e+00 1319 1641 8.33333333333333e+00 1319 1643 -1.25000000000000e+01 1319 1675 -8.33333333333333e+00 1319 1674 4.16666666666667e+00 1319 1666 4.16666666666667e+00 1319 1587 8.33333333333333e+00 1319 1317 -1.66666666666667e+01 1319 1589 -3.75000000000000e+01 1319 1588 8.33333333333333e+00 1319 1401 -4.16666666666667e+00 1319 1665 4.16666666666667e+00 1319 1515 -4.16666666666667e+00 1319 1660 -4.16666666666667e+00 1319 1557 4.16666666666667e+00 1319 1661 -1.25000000000000e+01 1319 1659 8.33333333333333e+00 1319 1558 -8.33333333333333e+00 1319 1623 -4.16666666666667e+00 1319 1611 4.16666666666667e+00 1319 1624 8.33333333333333e+00 1319 1318 -1.66666666666667e+01 1319 1669 8.33333333333333e+00 1319 1625 -1.25000000000000e+01 1319 1612 4.16666666666667e+00 1319 1402 -4.16666666666667e+00 1319 1670 -3.75000000000000e+01 1319 1662 -4.16666666666667e+00 1319 1672 4.16666666666667e+00 1319 1516 -4.16666666666667e+00 1319 1668 8.33333333333333e+00 1319 1671 -8.33333333333333e+00 1320 1320 3.75000000000000e+01 1320 1429 2.08333333333333e+00 1320 1687 -4.16666666666667e+00 1320 1679 -2.08333333333333e+00 1320 1321 -4.16666666666667e+00 1320 1678 4.16666666666667e+00 1320 1408 2.08333333333333e+00 1320 1677 -6.25000000000000e+00 1320 1694 -4.16666666666667e+00 1320 1685 4.16666666666667e+00 1320 1430 2.08333333333333e+00 1320 1691 -4.16666666666667e+00 1320 1690 2.08333333333333e+00 1320 1693 -4.16666666666667e+00 1320 1428 -1.25000000000000e+01 1320 1322 -4.16666666666667e+00 1320 1682 4.16666666666667e+00 1320 1409 2.08333333333333e+00 1320 1681 -2.08333333333333e+00 1320 1684 4.16666666666667e+00 1320 1688 2.08333333333333e+00 1320 1680 -6.25000000000000e+00 1320 1407 -1.25000000000000e+01 1321 1321 3.33333333333333e+01 1321 1428 2.08333333333333e+00 1321 1686 -4.16666666666667e+00 1321 1679 4.16666666666667e+00 1321 1678 -1.87500000000000e+01 1321 1320 -4.16666666666667e+00 1321 1677 4.16666666666667e+00 1321 1407 2.08333333333333e+00 1321 1691 2.08333333333333e+00 1321 1694 -4.16666666666667e+00 1321 1429 -4.16666666666667e+00 1321 1689 2.08333333333333e+00 1321 1692 -4.16666666666667e+00 1321 1682 4.16666666666667e+00 1321 1685 -8.33333333333333e+00 1321 1688 2.08333333333333e+00 1321 1681 -6.25000000000000e+00 1321 1408 -4.16666666666667e+00 1321 1680 -2.08333333333333e+00 1321 1683 4.16666666666667e+00 1322 1322 3.33333333333333e+01 1322 1686 2.08333333333333e+00 1322 1679 -6.25000000000000e+00 1322 1678 4.16666666666667e+00 1322 1677 -2.08333333333333e+00 1322 1690 2.08333333333333e+00 1322 1693 -4.16666666666667e+00 1322 1692 -4.16666666666667e+00 1322 1683 4.16666666666667e+00 1322 1430 -4.16666666666667e+00 1322 1428 2.08333333333333e+00 1322 1689 -4.16666666666667e+00 1322 1687 2.08333333333333e+00 1322 1682 -1.87500000000000e+01 1322 1409 -4.16666666666667e+00 1322 1681 4.16666666666667e+00 1322 1684 -8.33333333333333e+00 1322 1320 -4.16666666666667e+00 1322 1680 4.16666666666667e+00 1322 1407 2.08333333333333e+00 1323 1323 6.25000000000000e+01 1323 1705 -4.16666666666667e+00 1323 1697 4.16666666666667e+00 1323 1696 4.16666666666667e+00 1323 1695 -1.87500000000000e+01 1323 1712 -4.16666666666667e+00 1323 1711 -4.16666666666667e+00 1323 1703 -8.33333333333333e+00 1323 1702 4.16666666666667e+00 1323 1592 4.16666666666667e+00 1323 1325 -8.33333333333333e+00 1323 1700 8.33333333333333e+00 1323 1708 4.16666666666667e+00 1323 1699 -4.16666666666667e+00 1323 1412 -2.08333333333333e+00 1323 1562 2.08333333333333e+00 1323 1411 4.16666666666667e+00 1323 1561 -4.16666666666667e+00 1323 1410 -6.25000000000000e+00 1323 1698 -1.25000000000000e+01 1323 1448 -2.08333333333333e+00 1323 1709 4.16666666666667e+00 1323 1324 -8.33333333333333e+00 1323 1447 4.16666666666667e+00 1323 1591 4.16666666666667e+00 1323 1706 2.08333333333333e+00 1323 1446 -6.25000000000000e+00 1323 1590 -1.87500000000000e+01 1324 1324 6.25000000000000e+01 1324 1704 -4.16666666666667e+00 1324 1697 -2.08333333333333e+00 1324 1696 -6.25000000000000e+00 1324 1695 4.16666666666667e+00 1324 1712 -4.16666666666667e+00 1324 1703 4.16666666666667e+00 1324 1710 -4.16666666666667e+00 1324 1701 4.16666666666667e+00 1324 1592 -2.08333333333333e+00 1324 1562 2.08333333333333e+00 1324 1707 4.16666666666667e+00 1324 1698 -4.16666666666667e+00 1324 1412 4.16666666666667e+00 1324 1325 -8.33333333333333e+00 1324 1700 8.33333333333333e+00 1324 1411 -1.87500000000000e+01 1324 1699 -1.25000000000000e+01 1324 1410 4.16666666666667e+00 1324 1560 -4.16666666666667e+00 1324 1448 4.16666666666667e+00 1324 1709 -8.33333333333333e+00 1324 1706 2.08333333333333e+00 1324 1447 -1.87500000000000e+01 1324 1591 -6.25000000000000e+00 1324 1323 -8.33333333333333e+00 1324 1446 4.16666666666667e+00 1324 1590 4.16666666666667e+00 1325 1325 6.25000000000000e+01 1325 1705 2.08333333333333e+00 1325 1697 -6.25000000000000e+00 1325 1696 -2.08333333333333e+00 1325 1695 4.16666666666667e+00 1325 1710 -4.16666666666667e+00 1325 1711 -4.16666666666667e+00 1325 1702 4.16666666666667e+00 1325 1701 -8.33333333333333e+00 1325 1591 -2.08333333333333e+00 1325 1561 2.08333333333333e+00 1325 1590 4.16666666666667e+00 1325 1323 -8.33333333333333e+00 1325 1698 8.33333333333333e+00 1325 1412 -6.25000000000000e+00 1325 1700 -3.75000000000000e+01 1325 1411 4.16666666666667e+00 1325 1324 -8.33333333333333e+00 1325 1699 8.33333333333333e+00 1325 1410 -2.08333333333333e+00 1325 1560 2.08333333333333e+00 1325 1704 2.08333333333333e+00 1325 1448 -6.25000000000000e+00 1325 1592 -6.25000000000000e+00 1325 1447 4.16666666666667e+00 1325 1708 -8.33333333333333e+00 1325 1446 -2.08333333333333e+00 1325 1707 4.16666666666667e+00 1326 1326 6.25000000000000e+01 1326 1726 4.16666666666667e+00 1326 1727 4.16666666666667e+00 1326 1723 4.16666666666667e+00 1326 1722 -6.25000000000000e+00 1326 1328 -8.33333333333333e+00 1326 1697 4.16666666666667e+00 1326 1696 4.16666666666667e+00 1326 1695 -1.87500000000000e+01 1326 1714 -4.16666666666667e+00 1326 1327 -8.33333333333333e+00 1326 1718 4.16666666666667e+00 1326 1729 -4.16666666666667e+00 1326 1720 4.16666666666667e+00 1326 1715 8.33333333333333e+00 1326 1721 -8.33333333333333e+00 1326 1463 2.08333333333333e+00 1326 1730 -4.16666666666667e+00 1326 1717 4.16666666666667e+00 1326 1462 -4.16666666666667e+00 1326 1716 -1.87500000000000e+01 1326 1679 -2.08333333333333e+00 1326 1415 2.08333333333333e+00 1326 1678 4.16666666666667e+00 1326 1414 -4.16666666666667e+00 1326 1677 -6.25000000000000e+00 1326 1724 -2.08333333333333e+00 1326 1713 -1.25000000000000e+01 1327 1327 6.25000000000000e+01 1327 1725 4.16666666666667e+00 1327 1727 -8.33333333333333e+00 1327 1463 2.08333333333333e+00 1327 1723 -1.87500000000000e+01 1327 1722 4.16666666666667e+00 1327 1697 -2.08333333333333e+00 1327 1415 2.08333333333333e+00 1327 1696 -6.25000000000000e+00 1327 1695 4.16666666666667e+00 1327 1713 -4.16666666666667e+00 1327 1718 -2.08333333333333e+00 1327 1326 -8.33333333333333e+00 1327 1728 -4.16666666666667e+00 1327 1719 4.16666666666667e+00 1327 1730 -4.16666666666667e+00 1327 1721 4.16666666666667e+00 1327 1717 -6.25000000000000e+00 1327 1716 4.16666666666667e+00 1327 1461 -4.16666666666667e+00 1327 1679 4.16666666666667e+00 1327 1328 -8.33333333333333e+00 1327 1715 8.33333333333333e+00 1327 1678 -1.87500000000000e+01 1327 1724 4.16666666666667e+00 1327 1714 -1.25000000000000e+01 1327 1677 4.16666666666667e+00 1327 1413 -4.16666666666667e+00 1328 1328 6.25000000000000e+01 1328 1723 4.16666666666667e+00 1328 1726 -8.33333333333333e+00 1328 1725 4.16666666666667e+00 1328 1724 -6.25000000000000e+00 1328 1462 2.08333333333333e+00 1328 1697 -6.25000000000000e+00 1328 1696 -2.08333333333333e+00 1328 1414 2.08333333333333e+00 1328 1326 -8.33333333333333e+00 1328 1695 4.16666666666667e+00 1328 1717 -2.08333333333333e+00 1328 1716 4.16666666666667e+00 1328 1729 -4.16666666666667e+00 1328 1720 4.16666666666667e+00 1328 1713 8.33333333333333e+00 1328 1719 -8.33333333333333e+00 1328 1718 -6.25000000000000e+00 1328 1461 2.08333333333333e+00 1328 1728 -4.16666666666667e+00 1328 1679 -6.25000000000000e+00 1328 1722 -2.08333333333333e+00 1328 1715 -3.75000000000000e+01 1328 1678 4.16666666666667e+00 1328 1327 -8.33333333333333e+00 1328 1714 8.33333333333333e+00 1328 1677 -2.08333333333333e+00 1328 1413 2.08333333333333e+00 1329 1329 6.25000000000000e+01 1329 1748 -4.16666666666667e+00 1329 1741 2.08333333333333e+00 1329 1747 -4.16666666666667e+00 1329 1742 -4.16666666666667e+00 1329 1733 4.16666666666667e+00 1329 1732 4.16666666666667e+00 1329 1738 -8.33333333333333e+00 1329 1731 -1.87500000000000e+01 1329 1745 4.16666666666667e+00 1329 1736 -4.16666666666667e+00 1329 1330 -8.33333333333333e+00 1329 1735 8.33333333333333e+00 1329 1627 4.16666666666667e+00 1329 1418 4.16666666666667e+00 1329 1565 -4.16666666666667e+00 1329 1417 -2.08333333333333e+00 1329 1564 2.08333333333333e+00 1329 1416 -6.25000000000000e+00 1329 1734 -1.25000000000000e+01 1329 1331 -8.33333333333333e+00 1329 1484 4.16666666666667e+00 1329 1628 4.16666666666667e+00 1329 1483 -2.08333333333333e+00 1329 1744 4.16666666666667e+00 1329 1739 4.16666666666667e+00 1329 1482 -6.25000000000000e+00 1329 1626 -1.87500000000000e+01 1330 1330 6.25000000000000e+01 1330 1746 -4.16666666666667e+00 1330 1742 2.08333333333333e+00 1330 1748 -4.16666666666667e+00 1330 1733 -2.08333333333333e+00 1330 1739 4.16666666666667e+00 1330 1732 -6.25000000000000e+00 1330 1731 4.16666666666667e+00 1330 1737 -8.33333333333333e+00 1330 1565 2.08333333333333e+00 1330 1628 -2.08333333333333e+00 1330 1329 -8.33333333333333e+00 1330 1734 8.33333333333333e+00 1330 1626 4.16666666666667e+00 1330 1418 4.16666666666667e+00 1330 1331 -8.33333333333333e+00 1330 1736 8.33333333333333e+00 1330 1417 -6.25000000000000e+00 1330 1735 -3.75000000000000e+01 1330 1416 -2.08333333333333e+00 1330 1563 2.08333333333333e+00 1330 1484 4.16666666666667e+00 1330 1745 -8.33333333333333e+00 1330 1740 2.08333333333333e+00 1330 1483 -6.25000000000000e+00 1330 1627 -6.25000000000000e+00 1330 1482 -2.08333333333333e+00 1330 1743 4.16666666666667e+00 1331 1331 6.25000000000000e+01 1331 1746 -4.16666666666667e+00 1331 1741 2.08333333333333e+00 1331 1747 -4.16666666666667e+00 1331 1740 -4.16666666666667e+00 1331 1733 -6.25000000000000e+00 1331 1732 -2.08333333333333e+00 1331 1738 4.16666666666667e+00 1331 1731 4.16666666666667e+00 1331 1743 4.16666666666667e+00 1331 1734 -4.16666666666667e+00 1331 1564 2.08333333333333e+00 1331 1627 -2.08333333333333e+00 1331 1418 -1.87500000000000e+01 1331 1736 -1.25000000000000e+01 1331 1417 4.16666666666667e+00 1331 1330 -8.33333333333333e+00 1331 1735 8.33333333333333e+00 1331 1416 4.16666666666667e+00 1331 1563 -4.16666666666667e+00 1331 1737 4.16666666666667e+00 1331 1484 -1.87500000000000e+01 1331 1628 -6.25000000000000e+00 1331 1483 4.16666666666667e+00 1331 1744 -8.33333333333333e+00 1331 1329 -8.33333333333333e+00 1331 1482 4.16666666666667e+00 1331 1626 4.16666666666667e+00 1332 1332 6.25000000000000e+01 1332 1757 4.16666666666667e+00 1332 1756 -8.33333333333333e+00 1332 1754 4.16666666666667e+00 1332 1498 2.08333333333333e+00 1332 1752 -1.87500000000000e+01 1332 1682 4.16666666666667e+00 1332 1681 -2.08333333333333e+00 1332 1420 2.08333333333333e+00 1332 1680 -6.25000000000000e+00 1332 1751 -4.16666666666667e+00 1332 1334 -8.33333333333333e+00 1332 1759 -2.08333333333333e+00 1332 1766 -4.16666666666667e+00 1332 1763 4.16666666666667e+00 1332 1765 -4.16666666666667e+00 1332 1762 4.16666666666667e+00 1332 1760 4.16666666666667e+00 1332 1499 -4.16666666666667e+00 1332 1758 -6.25000000000000e+00 1332 1733 4.16666666666667e+00 1332 1421 -4.16666666666667e+00 1332 1732 4.16666666666667e+00 1332 1333 -8.33333333333333e+00 1332 1750 8.33333333333333e+00 1332 1731 -1.87500000000000e+01 1332 1753 4.16666666666667e+00 1332 1749 -1.25000000000000e+01 1333 1333 6.25000000000000e+01 1333 1757 4.16666666666667e+00 1333 1752 4.16666666666667e+00 1333 1755 -8.33333333333333e+00 1333 1753 -6.25000000000000e+00 1333 1497 2.08333333333333e+00 1333 1682 4.16666666666667e+00 1333 1334 -8.33333333333333e+00 1333 1681 -6.25000000000000e+00 1333 1680 -2.08333333333333e+00 1333 1419 2.08333333333333e+00 1333 1758 -2.08333333333333e+00 1333 1760 4.16666666666667e+00 1333 1751 8.33333333333333e+00 1333 1763 -8.33333333333333e+00 1333 1764 -4.16666666666667e+00 1333 1761 4.16666666666667e+00 1333 1499 2.08333333333333e+00 1333 1766 -4.16666666666667e+00 1333 1759 -6.25000000000000e+00 1333 1733 -2.08333333333333e+00 1333 1421 2.08333333333333e+00 1333 1732 -6.25000000000000e+00 1333 1754 -2.08333333333333e+00 1333 1750 -3.75000000000000e+01 1333 1731 4.16666666666667e+00 1333 1332 -8.33333333333333e+00 1333 1749 8.33333333333333e+00 1334 1334 6.25000000000000e+01 1334 1756 4.16666666666667e+00 1334 1755 4.16666666666667e+00 1334 1754 -6.25000000000000e+00 1334 1752 4.16666666666667e+00 1334 1682 -1.87500000000000e+01 1334 1681 4.16666666666667e+00 1334 1333 -8.33333333333333e+00 1334 1680 4.16666666666667e+00 1334 1749 -4.16666666666667e+00 1334 1332 -8.33333333333333e+00 1334 1759 4.16666666666667e+00 1334 1764 -4.16666666666667e+00 1334 1761 4.16666666666667e+00 1334 1750 8.33333333333333e+00 1334 1762 -8.33333333333333e+00 1334 1760 -1.87500000000000e+01 1334 1498 2.08333333333333e+00 1334 1765 -4.16666666666667e+00 1334 1758 4.16666666666667e+00 1334 1497 -4.16666666666667e+00 1334 1733 -6.25000000000000e+00 1334 1753 -2.08333333333333e+00 1334 1751 -1.25000000000000e+01 1334 1732 -2.08333333333333e+00 1334 1420 2.08333333333333e+00 1334 1731 4.16666666666667e+00 1334 1419 -4.16666666666667e+00 1335 1335 1.25000000000000e+02 1335 1774 -8.33333333333333e+00 1335 1769 8.33333333333333e+00 1335 1781 -8.33333333333333e+00 1335 1783 -4.16666666666667e+00 1335 1780 4.16666666666667e+00 1335 1784 -4.16666666666667e+00 1335 1768 8.33333333333333e+00 1335 1767 -3.75000000000000e+01 1335 1700 8.33333333333333e+00 1335 1594 4.16666666666667e+00 1335 1699 -4.16666666666667e+00 1335 1595 -8.33333333333333e+00 1335 1424 4.16666666666667e+00 1335 1698 -1.25000000000000e+01 1335 1772 -4.16666666666667e+00 1335 1520 4.16666666666667e+00 1335 1336 -1.66666666666667e+01 1335 1771 8.33333333333333e+00 1335 1770 -1.25000000000000e+01 1335 1736 -4.16666666666667e+00 1335 1735 8.33333333333333e+00 1335 1568 -4.16666666666667e+00 1335 1631 4.16666666666667e+00 1335 1660 8.33333333333333e+00 1335 1630 -8.33333333333333e+00 1335 1423 4.16666666666667e+00 1335 1567 -4.16666666666667e+00 1335 1734 -1.25000000000000e+01 1335 1337 -1.66666666666667e+01 1335 1778 8.33333333333333e+00 1335 1661 8.33333333333333e+00 1335 1777 -4.16666666666667e+00 1335 1519 4.16666666666667e+00 1335 1775 4.16666666666667e+00 1335 1776 -1.25000000000000e+01 1335 1659 -3.75000000000000e+01 1336 1336 1.25000000000000e+02 1336 1773 -8.33333333333333e+00 1336 1769 -4.16666666666667e+00 1336 1784 -4.16666666666667e+00 1336 1781 4.16666666666667e+00 1336 1782 -4.16666666666667e+00 1336 1779 4.16666666666667e+00 1336 1768 -1.25000000000000e+01 1336 1767 8.33333333333333e+00 1336 1593 4.16666666666667e+00 1336 1698 -4.16666666666667e+00 1336 1595 4.16666666666667e+00 1336 1700 8.33333333333333e+00 1336 1699 -1.25000000000000e+01 1336 1772 8.33333333333333e+00 1336 1771 -3.75000000000000e+01 1336 1335 -1.66666666666667e+01 1336 1770 8.33333333333333e+00 1336 1661 -4.16666666666667e+00 1336 1337 -1.66666666666667e+01 1336 1568 -4.16666666666667e+00 1336 1631 4.16666666666667e+00 1336 1734 8.33333333333333e+00 1336 1659 8.33333333333333e+00 1336 1629 -8.33333333333333e+00 1336 1424 -8.33333333333333e+00 1336 1736 8.33333333333333e+00 1336 1735 -3.75000000000000e+01 1336 1422 4.16666666666667e+00 1336 1566 -4.16666666666667e+00 1336 1778 8.33333333333333e+00 1336 1520 -8.33333333333333e+00 1336 1775 4.16666666666667e+00 1336 1777 -1.25000000000000e+01 1336 1660 -1.25000000000000e+01 1336 1776 -4.16666666666667e+00 1336 1518 4.16666666666667e+00 1337 1337 1.25000000000000e+02 1337 1774 4.16666666666667e+00 1337 1768 -4.16666666666667e+00 1337 1783 -4.16666666666667e+00 1337 1780 4.16666666666667e+00 1337 1767 8.33333333333333e+00 1337 1779 -8.33333333333333e+00 1337 1782 -4.16666666666667e+00 1337 1769 -1.25000000000000e+01 1337 1698 8.33333333333333e+00 1337 1594 4.16666666666667e+00 1337 1593 -8.33333333333333e+00 1337 1700 -3.75000000000000e+01 1337 1699 8.33333333333333e+00 1337 1422 4.16666666666667e+00 1337 1772 -1.25000000000000e+01 1337 1771 8.33333333333333e+00 1337 1770 -4.16666666666667e+00 1337 1518 4.16666666666667e+00 1337 1660 -4.16666666666667e+00 1337 1336 -1.66666666666667e+01 1337 1734 -4.16666666666667e+00 1337 1567 -4.16666666666667e+00 1337 1630 4.16666666666667e+00 1337 1566 -4.16666666666667e+00 1337 1629 4.16666666666667e+00 1337 1736 -1.25000000000000e+01 1337 1423 -8.33333333333333e+00 1337 1735 8.33333333333333e+00 1337 1773 4.16666666666667e+00 1337 1778 -3.75000000000000e+01 1337 1661 -1.25000000000000e+01 1337 1777 8.33333333333333e+00 1337 1519 -8.33333333333333e+00 1337 1335 -1.66666666666667e+01 1337 1776 8.33333333333333e+00 1337 1659 8.33333333333333e+00 1338 1338 1.25000000000000e+02 1338 1789 8.33333333333333e+00 1338 1788 -1.25000000000000e+01 1338 1703 -8.33333333333333e+00 1338 1702 4.16666666666667e+00 1338 1769 8.33333333333333e+00 1338 1801 4.16666666666667e+00 1338 1768 8.33333333333333e+00 1338 1767 -3.75000000000000e+01 1338 1802 4.16666666666667e+00 1338 1714 -4.16666666666667e+00 1338 1715 8.33333333333333e+00 1338 1340 -1.66666666666667e+01 1338 1427 -4.16666666666667e+00 1338 1713 -1.25000000000000e+01 1338 1793 4.16666666666667e+00 1338 1541 -4.16666666666667e+00 1338 1792 -8.33333333333333e+00 1338 1685 4.16666666666667e+00 1338 1786 8.33333333333333e+00 1338 1339 -1.66666666666667e+01 1338 1787 8.33333333333333e+00 1338 1540 -4.16666666666667e+00 1338 1785 -3.75000000000000e+01 1338 1684 4.16666666666667e+00 1338 1426 -4.16666666666667e+00 1338 1751 -4.16666666666667e+00 1338 1739 4.16666666666667e+00 1338 1798 4.16666666666667e+00 1338 1795 -4.16666666666667e+00 1338 1738 -8.33333333333333e+00 1338 1750 8.33333333333333e+00 1338 1749 -1.25000000000000e+01 1338 1796 8.33333333333333e+00 1338 1799 -8.33333333333333e+00 1338 1794 -1.25000000000000e+01 1338 1790 -4.16666666666667e+00 1339 1339 1.25000000000000e+02 1339 1788 8.33333333333333e+00 1339 1790 8.33333333333333e+00 1339 1789 -3.75000000000000e+01 1339 1701 4.16666666666667e+00 1339 1769 -4.16666666666667e+00 1339 1800 4.16666666666667e+00 1339 1768 -1.25000000000000e+01 1339 1767 8.33333333333333e+00 1339 1802 -8.33333333333333e+00 1339 1713 -4.16666666666667e+00 1339 1793 4.16666666666667e+00 1339 1715 8.33333333333333e+00 1339 1714 -1.25000000000000e+01 1339 1791 -8.33333333333333e+00 1339 1787 -4.16666666666667e+00 1339 1785 8.33333333333333e+00 1339 1338 -1.66666666666667e+01 1339 1786 -1.25000000000000e+01 1339 1539 -4.16666666666667e+00 1339 1685 -8.33333333333333e+00 1339 1683 4.16666666666667e+00 1339 1425 -4.16666666666667e+00 1339 1751 8.33333333333333e+00 1339 1340 -1.66666666666667e+01 1339 1796 8.33333333333333e+00 1339 1797 4.16666666666667e+00 1339 1794 -4.16666666666667e+00 1339 1739 4.16666666666667e+00 1339 1427 -4.16666666666667e+00 1339 1750 -3.75000000000000e+01 1339 1737 -8.33333333333333e+00 1339 1749 8.33333333333333e+00 1339 1799 4.16666666666667e+00 1339 1541 -4.16666666666667e+00 1339 1795 -1.25000000000000e+01 1339 1703 4.16666666666667e+00 1340 1340 1.25000000000000e+02 1340 1702 4.16666666666667e+00 1340 1790 -1.25000000000000e+01 1340 1789 8.33333333333333e+00 1340 1701 -8.33333333333333e+00 1340 1768 -4.16666666666667e+00 1340 1767 8.33333333333333e+00 1340 1769 -1.25000000000000e+01 1340 1801 -8.33333333333333e+00 1340 1800 4.16666666666667e+00 1340 1792 4.16666666666667e+00 1340 1713 8.33333333333333e+00 1340 1338 -1.66666666666667e+01 1340 1715 -3.75000000000000e+01 1340 1714 8.33333333333333e+00 1340 1425 -4.16666666666667e+00 1340 1791 4.16666666666667e+00 1340 1539 -4.16666666666667e+00 1340 1786 -4.16666666666667e+00 1340 1683 4.16666666666667e+00 1340 1787 -1.25000000000000e+01 1340 1785 8.33333333333333e+00 1340 1684 -8.33333333333333e+00 1340 1749 -4.16666666666667e+00 1340 1737 4.16666666666667e+00 1340 1750 8.33333333333333e+00 1340 1339 -1.66666666666667e+01 1340 1795 8.33333333333333e+00 1340 1751 -1.25000000000000e+01 1340 1738 4.16666666666667e+00 1340 1426 -4.16666666666667e+00 1340 1796 -3.75000000000000e+01 1340 1788 -4.16666666666667e+00 1340 1798 4.16666666666667e+00 1340 1540 -4.16666666666667e+00 1340 1794 8.33333333333333e+00 1340 1797 -8.33333333333333e+00 1341 1341 2.50000000000000e+01 1341 1598 -2.08333333333333e+00 1341 1807 2.08333333333333e+00 1341 1804 -2.08333333333333e+00 1341 1451 2.08333333333333e+00 1341 1808 -4.16666666666667e+00 1341 1450 2.08333333333333e+00 1341 1342 -4.16666666666667e+00 1341 1597 4.16666666666667e+00 1341 1449 -6.25000000000000e+00 1341 1596 -6.25000000000000e+00 1341 1343 -4.16666666666667e+00 1341 1436 2.08333333333333e+00 1341 1805 4.16666666666667e+00 1341 1435 2.08333333333333e+00 1341 1579 -4.16666666666667e+00 1341 1580 2.08333333333333e+00 1341 1434 -6.25000000000000e+00 1341 1803 -6.25000000000000e+00 1342 1342 2.91666666666667e+01 1342 1598 4.16666666666667e+00 1342 1805 4.16666666666667e+00 1342 1806 2.08333333333333e+00 1342 1803 -2.08333333333333e+00 1342 1451 -2.08333333333333e+00 1342 1808 2.08333333333333e+00 1342 1450 -2.08333333333333e+00 1342 1597 -1.87500000000000e+01 1342 1449 2.08333333333333e+00 1342 1341 -4.16666666666667e+00 1342 1596 4.16666666666667e+00 1342 1436 -2.08333333333333e+00 1342 1580 2.08333333333333e+00 1342 1343 -8.33333333333333e+00 1342 1435 -2.08333333333333e+00 1342 1804 -6.25000000000000e+00 1342 1434 2.08333333333333e+00 1342 1578 -4.16666666666667e+00 1343 1343 2.91666666666667e+01 1343 1596 -2.08333333333333e+00 1343 1342 -8.33333333333333e+00 1343 1597 4.16666666666667e+00 1343 1804 4.16666666666667e+00 1343 1451 -2.08333333333333e+00 1343 1598 -6.25000000000000e+00 1343 1450 -2.08333333333333e+00 1343 1807 2.08333333333333e+00 1343 1449 2.08333333333333e+00 1343 1806 -4.16666666666667e+00 1343 1578 2.08333333333333e+00 1343 1436 -2.08333333333333e+00 1343 1805 -1.87500000000000e+01 1343 1435 -2.08333333333333e+00 1343 1579 2.08333333333333e+00 1343 1341 -4.16666666666667e+00 1343 1434 2.08333333333333e+00 1343 1803 4.16666666666667e+00 1344 1344 6.25000000000000e+01 1344 1439 4.16666666666667e+00 1344 1346 -8.33333333333333e+00 1344 1508 4.16666666666667e+00 1344 1582 4.16666666666667e+00 1344 1583 4.16666666666667e+00 1344 1437 -6.25000000000000e+00 1344 1646 -4.16666666666667e+00 1344 1645 8.33333333333333e+00 1344 1644 -1.25000000000000e+01 1344 1506 -6.25000000000000e+00 1344 1810 4.16666666666667e+00 1344 1345 -8.33333333333333e+00 1344 1814 -4.16666666666667e+00 1344 1507 -2.08333333333333e+00 1344 1813 2.08333333333333e+00 1344 1811 4.16666666666667e+00 1344 1438 -2.08333333333333e+00 1344 1809 -1.87500000000000e+01 1344 2426 -4.16666666666667e+00 1344 2435 4.16666666666667e+00 1344 2434 4.16666666666667e+00 1344 2433 -1.87500000000000e+01 1344 2329 -4.16666666666667e+00 1344 2330 -4.16666666666667e+00 1344 2393 4.16666666666667e+00 1344 2392 -8.33333333333333e+00 1344 2425 2.08333333333333e+00 1345 1345 6.25000000000000e+01 1345 1581 4.16666666666667e+00 1345 1583 -8.33333333333333e+00 1345 1439 4.16666666666667e+00 1345 1438 -6.25000000000000e+00 1345 1646 8.33333333333333e+00 1345 1346 -8.33333333333333e+00 1345 1508 4.16666666666667e+00 1345 1645 -3.75000000000000e+01 1345 1507 -6.25000000000000e+00 1345 1644 8.33333333333333e+00 1345 1814 2.08333333333333e+00 1345 1809 4.16666666666667e+00 1345 1344 -8.33333333333333e+00 1345 1506 -2.08333333333333e+00 1345 1812 2.08333333333333e+00 1345 1811 -2.08333333333333e+00 1345 1810 -6.25000000000000e+00 1345 1437 -2.08333333333333e+00 1345 2426 2.08333333333333e+00 1345 2435 -2.08333333333333e+00 1345 2434 -6.25000000000000e+00 1345 2433 4.16666666666667e+00 1345 2328 -4.16666666666667e+00 1345 2330 -4.16666666666667e+00 1345 2393 4.16666666666667e+00 1345 2424 2.08333333333333e+00 1345 2391 -8.33333333333333e+00 1346 1346 6.25000000000000e+01 1346 1437 4.16666666666667e+00 1346 1344 -8.33333333333333e+00 1346 1506 4.16666666666667e+00 1346 1439 -1.87500000000000e+01 1346 1582 -8.33333333333333e+00 1346 1438 4.16666666666667e+00 1346 1581 4.16666666666667e+00 1346 1646 -1.25000000000000e+01 1346 1508 -1.87500000000000e+01 1346 1645 8.33333333333333e+00 1346 1345 -8.33333333333333e+00 1346 1507 4.16666666666667e+00 1346 1644 -4.16666666666667e+00 1346 1813 2.08333333333333e+00 1346 1812 -4.16666666666667e+00 1346 1810 -2.08333333333333e+00 1346 1811 -6.25000000000000e+00 1346 1809 4.16666666666667e+00 1346 2424 -4.16666666666667e+00 1346 2435 -6.25000000000000e+00 1346 2434 -2.08333333333333e+00 1346 2433 4.16666666666667e+00 1346 2329 -4.16666666666667e+00 1346 2392 4.16666666666667e+00 1346 2328 -4.16666666666667e+00 1346 2425 2.08333333333333e+00 1346 2391 4.16666666666667e+00 1347 1347 6.25000000000000e+01 1347 1600 4.16666666666667e+00 1347 1601 4.16666666666667e+00 1347 1805 4.16666666666667e+00 1347 1803 -6.25000000000000e+00 1347 1817 4.16666666666667e+00 1347 1816 4.16666666666667e+00 1347 1348 -8.33333333333333e+00 1347 1815 -1.87500000000000e+01 1347 1664 -4.16666666666667e+00 1347 1349 -8.33333333333333e+00 1347 1586 -4.16666666666667e+00 1347 1649 4.16666666666667e+00 1347 1810 4.16666666666667e+00 1347 1663 8.33333333333333e+00 1347 1648 -8.33333333333333e+00 1347 1811 4.16666666666667e+00 1347 1442 -4.16666666666667e+00 1347 1441 2.08333333333333e+00 1347 1585 -4.16666666666667e+00 1347 1809 -1.87500000000000e+01 1347 1820 4.16666666666667e+00 1347 1523 -4.16666666666667e+00 1347 1819 -2.08333333333333e+00 1347 1522 2.08333333333333e+00 1347 1818 -6.25000000000000e+00 1347 1804 -2.08333333333333e+00 1347 1662 -1.25000000000000e+01 1348 1348 6.25000000000000e+01 1348 1803 -2.08333333333333e+00 1348 1599 4.16666666666667e+00 1348 1601 -8.33333333333333e+00 1348 1442 2.08333333333333e+00 1348 1804 -6.25000000000000e+00 1348 1817 -2.08333333333333e+00 1348 1523 2.08333333333333e+00 1348 1816 -6.25000000000000e+00 1348 1815 4.16666666666667e+00 1348 1347 -8.33333333333333e+00 1348 1811 -2.08333333333333e+00 1348 1809 4.16666666666667e+00 1348 1586 -4.16666666666667e+00 1348 1649 4.16666666666667e+00 1348 1662 8.33333333333333e+00 1348 1647 -8.33333333333333e+00 1348 1810 -6.25000000000000e+00 1348 1440 2.08333333333333e+00 1348 1584 -4.16666666666667e+00 1348 1820 4.16666666666667e+00 1348 1349 -8.33333333333333e+00 1348 1664 8.33333333333333e+00 1348 1819 -6.25000000000000e+00 1348 1805 4.16666666666667e+00 1348 1663 -3.75000000000000e+01 1348 1818 -2.08333333333333e+00 1348 1521 2.08333333333333e+00 1349 1349 6.25000000000000e+01 1349 1600 -8.33333333333333e+00 1349 1599 4.16666666666667e+00 1349 1805 -1.87500000000000e+01 1349 1441 2.08333333333333e+00 1349 1803 4.16666666666667e+00 1349 1817 -6.25000000000000e+00 1349 1816 -2.08333333333333e+00 1349 1522 2.08333333333333e+00 1349 1815 4.16666666666667e+00 1349 1662 -4.16666666666667e+00 1349 1810 -2.08333333333333e+00 1349 1347 -8.33333333333333e+00 1349 1584 -4.16666666666667e+00 1349 1647 4.16666666666667e+00 1349 1585 -4.16666666666667e+00 1349 1648 4.16666666666667e+00 1349 1811 -6.25000000000000e+00 1349 1809 4.16666666666667e+00 1349 1440 -4.16666666666667e+00 1349 1820 -1.87500000000000e+01 1349 1804 4.16666666666667e+00 1349 1664 -1.25000000000000e+01 1349 1819 4.16666666666667e+00 1349 1348 -8.33333333333333e+00 1349 1663 8.33333333333333e+00 1349 1818 4.16666666666667e+00 1349 1521 -4.16666666666667e+00 1350 1350 2.50000000000000e+01 1350 1724 -2.08333333333333e+00 1350 1825 2.08333333333333e+00 1350 1822 -2.08333333333333e+00 1350 1466 2.08333333333333e+00 1350 1826 -4.16666666666667e+00 1350 1465 2.08333333333333e+00 1350 1351 -4.16666666666667e+00 1350 1723 4.16666666666667e+00 1350 1464 -6.25000000000000e+00 1350 1722 -6.25000000000000e+00 1350 1352 -4.16666666666667e+00 1350 1454 2.08333333333333e+00 1350 1823 4.16666666666667e+00 1350 1453 2.08333333333333e+00 1350 1705 -4.16666666666667e+00 1350 1706 2.08333333333333e+00 1350 1452 -6.25000000000000e+00 1350 1821 -6.25000000000000e+00 1351 1351 2.91666666666667e+01 1351 1724 4.16666666666667e+00 1351 1823 4.16666666666667e+00 1351 1824 2.08333333333333e+00 1351 1821 -2.08333333333333e+00 1351 1466 -2.08333333333333e+00 1351 1826 2.08333333333333e+00 1351 1465 -2.08333333333333e+00 1351 1723 -1.87500000000000e+01 1351 1464 2.08333333333333e+00 1351 1350 -4.16666666666667e+00 1351 1722 4.16666666666667e+00 1351 1454 -2.08333333333333e+00 1351 1706 2.08333333333333e+00 1351 1352 -8.33333333333333e+00 1351 1453 -2.08333333333333e+00 1351 1822 -6.25000000000000e+00 1351 1452 2.08333333333333e+00 1351 1704 -4.16666666666667e+00 1352 1352 2.91666666666667e+01 1352 1722 -2.08333333333333e+00 1352 1351 -8.33333333333333e+00 1352 1723 4.16666666666667e+00 1352 1822 4.16666666666667e+00 1352 1466 -2.08333333333333e+00 1352 1724 -6.25000000000000e+00 1352 1465 -2.08333333333333e+00 1352 1825 2.08333333333333e+00 1352 1464 2.08333333333333e+00 1352 1824 -4.16666666666667e+00 1352 1704 2.08333333333333e+00 1352 1454 -2.08333333333333e+00 1352 1823 -1.87500000000000e+01 1352 1453 -2.08333333333333e+00 1352 1705 2.08333333333333e+00 1352 1350 -4.16666666666667e+00 1352 1452 2.08333333333333e+00 1352 1821 4.16666666666667e+00 1353 1353 6.25000000000000e+01 1353 1354 -8.33333333333333e+00 1353 1832 -4.16666666666667e+00 1353 1525 -2.08333333333333e+00 1353 1831 2.08333333333333e+00 1353 1829 4.16666666666667e+00 1353 1456 -2.08333333333333e+00 1353 1827 -1.87500000000000e+01 1353 1807 2.08333333333333e+00 1353 1457 4.16666666666667e+00 1353 1808 -4.16666666666667e+00 1353 1355 -8.33333333333333e+00 1353 1817 4.16666666666667e+00 1353 1526 4.16666666666667e+00 1353 1816 4.16666666666667e+00 1353 1815 -1.87500000000000e+01 1353 1603 -4.16666666666667e+00 1353 1708 4.16666666666667e+00 1353 1709 4.16666666666667e+00 1353 1604 -4.16666666666667e+00 1353 1455 -6.25000000000000e+00 1353 1772 -4.16666666666667e+00 1353 1667 4.16666666666667e+00 1353 1771 8.33333333333333e+00 1353 1666 -8.33333333333333e+00 1353 1770 -1.25000000000000e+01 1353 1828 4.16666666666667e+00 1353 1524 -6.25000000000000e+00 1354 1354 6.25000000000000e+01 1354 1832 2.08333333333333e+00 1354 1827 4.16666666666667e+00 1354 1353 -8.33333333333333e+00 1354 1524 -2.08333333333333e+00 1354 1830 2.08333333333333e+00 1354 1828 -6.25000000000000e+00 1354 1455 -2.08333333333333e+00 1354 1806 2.08333333333333e+00 1354 1808 2.08333333333333e+00 1354 1817 -2.08333333333333e+00 1354 1816 -6.25000000000000e+00 1354 1815 4.16666666666667e+00 1354 1602 -4.16666666666667e+00 1354 1707 4.16666666666667e+00 1354 1604 -4.16666666666667e+00 1354 1667 4.16666666666667e+00 1354 1709 -8.33333333333333e+00 1354 1457 4.16666666666667e+00 1354 1456 -6.25000000000000e+00 1354 1772 8.33333333333333e+00 1354 1355 -8.33333333333333e+00 1354 1526 4.16666666666667e+00 1354 1771 -3.75000000000000e+01 1354 1829 -2.08333333333333e+00 1354 1525 -6.25000000000000e+00 1354 1770 8.33333333333333e+00 1354 1665 -8.33333333333333e+00 1355 1355 6.25000000000000e+01 1355 1831 2.08333333333333e+00 1355 1830 -4.16666666666667e+00 1355 1829 -6.25000000000000e+00 1355 1827 4.16666666666667e+00 1355 1807 2.08333333333333e+00 1355 1455 4.16666666666667e+00 1355 1806 -4.16666666666667e+00 1355 1817 -6.25000000000000e+00 1355 1816 -2.08333333333333e+00 1355 1353 -8.33333333333333e+00 1355 1815 4.16666666666667e+00 1355 1524 4.16666666666667e+00 1355 1603 -4.16666666666667e+00 1355 1666 4.16666666666667e+00 1355 1457 -1.87500000000000e+01 1355 1708 -8.33333333333333e+00 1355 1456 4.16666666666667e+00 1355 1707 4.16666666666667e+00 1355 1602 -4.16666666666667e+00 1355 1772 -1.25000000000000e+01 1355 1828 -2.08333333333333e+00 1355 1526 -1.87500000000000e+01 1355 1771 8.33333333333333e+00 1355 1354 -8.33333333333333e+00 1355 1525 4.16666666666667e+00 1355 1770 -4.16666666666667e+00 1355 1665 4.16666666666667e+00 1356 1356 6.25000000000000e+01 1356 1726 4.16666666666667e+00 1356 1727 4.16666666666667e+00 1356 1823 4.16666666666667e+00 1356 1821 -6.25000000000000e+00 1356 1835 4.16666666666667e+00 1356 1834 4.16666666666667e+00 1356 1357 -8.33333333333333e+00 1356 1833 -1.87500000000000e+01 1356 1790 -4.16666666666667e+00 1356 1358 -8.33333333333333e+00 1356 1712 -4.16666666666667e+00 1356 1775 4.16666666666667e+00 1356 1828 4.16666666666667e+00 1356 1789 8.33333333333333e+00 1356 1774 -8.33333333333333e+00 1356 1829 4.16666666666667e+00 1356 1460 -4.16666666666667e+00 1356 1459 2.08333333333333e+00 1356 1711 -4.16666666666667e+00 1356 1827 -1.87500000000000e+01 1356 1838 4.16666666666667e+00 1356 1544 -4.16666666666667e+00 1356 1837 -2.08333333333333e+00 1356 1543 2.08333333333333e+00 1356 1836 -6.25000000000000e+00 1356 1822 -2.08333333333333e+00 1356 1788 -1.25000000000000e+01 1357 1357 6.25000000000000e+01 1357 1821 -2.08333333333333e+00 1357 1725 4.16666666666667e+00 1357 1727 -8.33333333333333e+00 1357 1460 2.08333333333333e+00 1357 1822 -6.25000000000000e+00 1357 1835 -2.08333333333333e+00 1357 1544 2.08333333333333e+00 1357 1834 -6.25000000000000e+00 1357 1833 4.16666666666667e+00 1357 1356 -8.33333333333333e+00 1357 1829 -2.08333333333333e+00 1357 1827 4.16666666666667e+00 1357 1712 -4.16666666666667e+00 1357 1775 4.16666666666667e+00 1357 1788 8.33333333333333e+00 1357 1773 -8.33333333333333e+00 1357 1828 -6.25000000000000e+00 1357 1458 2.08333333333333e+00 1357 1710 -4.16666666666667e+00 1357 1838 4.16666666666667e+00 1357 1358 -8.33333333333333e+00 1357 1790 8.33333333333333e+00 1357 1837 -6.25000000000000e+00 1357 1823 4.16666666666667e+00 1357 1789 -3.75000000000000e+01 1357 1836 -2.08333333333333e+00 1357 1542 2.08333333333333e+00 1358 1358 6.25000000000000e+01 1358 1726 -8.33333333333333e+00 1358 1725 4.16666666666667e+00 1358 1823 -1.87500000000000e+01 1358 1459 2.08333333333333e+00 1358 1821 4.16666666666667e+00 1358 1835 -6.25000000000000e+00 1358 1834 -2.08333333333333e+00 1358 1543 2.08333333333333e+00 1358 1833 4.16666666666667e+00 1358 1788 -4.16666666666667e+00 1358 1828 -2.08333333333333e+00 1358 1356 -8.33333333333333e+00 1358 1710 -4.16666666666667e+00 1358 1773 4.16666666666667e+00 1358 1711 -4.16666666666667e+00 1358 1774 4.16666666666667e+00 1358 1829 -6.25000000000000e+00 1358 1827 4.16666666666667e+00 1358 1458 -4.16666666666667e+00 1358 1838 -1.87500000000000e+01 1358 1822 4.16666666666667e+00 1358 1790 -1.25000000000000e+01 1358 1837 4.16666666666667e+00 1358 1357 -8.33333333333333e+00 1358 1789 8.33333333333333e+00 1358 1836 4.16666666666667e+00 1358 1542 -4.16666666666667e+00 1359 1359 2.50000000000000e+01 1359 1615 2.08333333333333e+00 1359 1844 2.08333333333333e+00 1359 1841 -2.08333333333333e+00 1359 1472 2.08333333333333e+00 1359 1616 -4.16666666666667e+00 1359 1471 2.08333333333333e+00 1359 1360 -4.16666666666667e+00 1359 1840 4.16666666666667e+00 1359 1470 -6.25000000000000e+00 1359 1839 -6.25000000000000e+00 1359 1361 -4.16666666666667e+00 1359 1487 2.08333333333333e+00 1359 1634 4.16666666666667e+00 1359 1486 2.08333333333333e+00 1359 1843 -4.16666666666667e+00 1359 1633 -2.08333333333333e+00 1359 1485 -6.25000000000000e+00 1359 1632 -6.25000000000000e+00 1360 1360 2.91666666666667e+01 1360 1614 2.08333333333333e+00 1360 1634 4.16666666666667e+00 1360 1361 -8.33333333333333e+00 1360 1841 4.16666666666667e+00 1360 1472 -2.08333333333333e+00 1360 1616 2.08333333333333e+00 1360 1471 -2.08333333333333e+00 1360 1840 -1.87500000000000e+01 1360 1470 2.08333333333333e+00 1360 1359 -4.16666666666667e+00 1360 1839 4.16666666666667e+00 1360 1487 -2.08333333333333e+00 1360 1844 2.08333333333333e+00 1360 1632 -2.08333333333333e+00 1360 1486 -2.08333333333333e+00 1360 1633 -6.25000000000000e+00 1360 1485 2.08333333333333e+00 1360 1842 -4.16666666666667e+00 1361 1361 2.91666666666667e+01 1361 1360 -8.33333333333333e+00 1361 1840 4.16666666666667e+00 1361 1842 2.08333333333333e+00 1361 1839 -2.08333333333333e+00 1361 1472 -2.08333333333333e+00 1361 1841 -6.25000000000000e+00 1361 1471 -2.08333333333333e+00 1361 1615 2.08333333333333e+00 1361 1470 2.08333333333333e+00 1361 1614 -4.16666666666667e+00 1361 1633 4.16666666666667e+00 1361 1487 -2.08333333333333e+00 1361 1634 -1.87500000000000e+01 1361 1486 -2.08333333333333e+00 1361 1843 2.08333333333333e+00 1361 1359 -4.16666666666667e+00 1361 1485 2.08333333333333e+00 1361 1632 4.16666666666667e+00 1362 1362 6.25000000000000e+01 1362 1618 4.16666666666667e+00 1362 1652 8.33333333333333e+00 1362 1651 -4.16666666666667e+00 1362 1650 -1.25000000000000e+01 1362 1474 4.16666666666667e+00 1362 1473 -6.25000000000000e+00 1362 1363 -8.33333333333333e+00 1362 1510 4.16666666666667e+00 1362 1619 4.16666666666667e+00 1362 1509 -6.25000000000000e+00 1362 1364 -8.33333333333333e+00 1362 1847 4.16666666666667e+00 1362 1511 -2.08333333333333e+00 1362 1850 2.08333333333333e+00 1362 1849 -4.16666666666667e+00 1362 1475 -2.08333333333333e+00 1362 1846 4.16666666666667e+00 1362 1845 -1.87500000000000e+01 1362 2366 -4.16666666666667e+00 1362 2462 2.08333333333333e+00 1362 2365 -4.16666666666667e+00 1362 2398 4.16666666666667e+00 1362 2461 -4.16666666666667e+00 1362 2471 4.16666666666667e+00 1362 2399 -8.33333333333333e+00 1362 2470 4.16666666666667e+00 1362 2469 -1.87500000000000e+01 1363 1363 6.25000000000000e+01 1363 1475 4.16666666666667e+00 1363 1617 4.16666666666667e+00 1363 1652 8.33333333333333e+00 1363 1364 -8.33333333333333e+00 1363 1511 4.16666666666667e+00 1363 1651 -1.25000000000000e+01 1363 1650 -4.16666666666667e+00 1363 1474 -1.87500000000000e+01 1363 1473 4.16666666666667e+00 1363 1619 -8.33333333333333e+00 1363 1510 -1.87500000000000e+01 1363 1362 -8.33333333333333e+00 1363 1509 4.16666666666667e+00 1363 1850 2.08333333333333e+00 1363 1847 -2.08333333333333e+00 1363 1848 -4.16666666666667e+00 1363 1846 -6.25000000000000e+00 1363 1845 4.16666666666667e+00 1363 2364 -4.16666666666667e+00 1363 2397 4.16666666666667e+00 1363 2462 2.08333333333333e+00 1363 2366 -4.16666666666667e+00 1363 2460 -4.16666666666667e+00 1363 2471 -2.08333333333333e+00 1363 2399 4.16666666666667e+00 1363 2470 -6.25000000000000e+00 1363 2469 4.16666666666667e+00 1364 1364 6.25000000000000e+01 1364 1618 -8.33333333333333e+00 1364 1474 4.16666666666667e+00 1364 1652 -3.75000000000000e+01 1364 1651 8.33333333333333e+00 1364 1363 -8.33333333333333e+00 1364 1510 4.16666666666667e+00 1364 1650 8.33333333333333e+00 1364 1475 -6.25000000000000e+00 1364 1617 4.16666666666667e+00 1364 1511 -6.25000000000000e+00 1364 1846 -2.08333333333333e+00 1364 1362 -8.33333333333333e+00 1364 1845 4.16666666666667e+00 1364 1509 -2.08333333333333e+00 1364 1848 2.08333333333333e+00 1364 1849 2.08333333333333e+00 1364 1847 -6.25000000000000e+00 1364 1473 -2.08333333333333e+00 1364 2364 -4.16666666666667e+00 1364 2460 2.08333333333333e+00 1364 2461 2.08333333333333e+00 1364 2365 -4.16666666666667e+00 1364 2471 -6.25000000000000e+00 1364 2470 -2.08333333333333e+00 1364 2398 4.16666666666667e+00 1364 2469 4.16666666666667e+00 1364 2397 -8.33333333333333e+00 1365 1365 6.25000000000000e+01 1365 1655 -8.33333333333333e+00 1365 1654 4.16666666666667e+00 1365 1478 2.08333333333333e+00 1365 1846 4.16666666666667e+00 1365 1845 -1.87500000000000e+01 1365 1856 -2.08333333333333e+00 1365 1529 2.08333333333333e+00 1365 1855 4.16666666666667e+00 1365 1854 -6.25000000000000e+00 1365 1622 -4.16666666666667e+00 1365 1621 -4.16666666666667e+00 1365 1637 4.16666666666667e+00 1365 1841 -2.08333333333333e+00 1365 1366 -8.33333333333333e+00 1365 1636 4.16666666666667e+00 1365 1669 -4.16666666666667e+00 1365 1477 -4.16666666666667e+00 1365 1840 4.16666666666667e+00 1365 1839 -6.25000000000000e+00 1365 1367 -8.33333333333333e+00 1365 1853 4.16666666666667e+00 1365 1670 8.33333333333333e+00 1365 1852 4.16666666666667e+00 1365 1528 -4.16666666666667e+00 1365 1847 4.16666666666667e+00 1365 1851 -1.87500000000000e+01 1365 1668 -1.25000000000000e+01 1366 1366 6.25000000000000e+01 1366 1655 4.16666666666667e+00 1366 1653 4.16666666666667e+00 1366 1846 -6.25000000000000e+00 1366 1845 4.16666666666667e+00 1366 1856 4.16666666666667e+00 1366 1367 -8.33333333333333e+00 1366 1855 -1.87500000000000e+01 1366 1854 4.16666666666667e+00 1366 1620 -4.16666666666667e+00 1366 1841 4.16666666666667e+00 1366 1365 -8.33333333333333e+00 1366 1637 -8.33333333333333e+00 1366 1670 8.33333333333333e+00 1366 1635 4.16666666666667e+00 1366 1668 -4.16666666666667e+00 1366 1478 2.08333333333333e+00 1366 1622 -4.16666666666667e+00 1366 1840 -1.87500000000000e+01 1366 1476 -4.16666666666667e+00 1366 1839 4.16666666666667e+00 1366 1853 -2.08333333333333e+00 1366 1529 2.08333333333333e+00 1366 1847 -2.08333333333333e+00 1366 1852 -6.25000000000000e+00 1366 1669 -1.25000000000000e+01 1366 1851 4.16666666666667e+00 1366 1527 -4.16666666666667e+00 1367 1367 6.25000000000000e+01 1367 1654 4.16666666666667e+00 1367 1845 4.16666666666667e+00 1367 1653 -8.33333333333333e+00 1367 1847 -6.25000000000000e+00 1367 1476 2.08333333333333e+00 1367 1856 -6.25000000000000e+00 1367 1855 4.16666666666667e+00 1367 1366 -8.33333333333333e+00 1367 1854 -2.08333333333333e+00 1367 1527 2.08333333333333e+00 1367 1620 -4.16666666666667e+00 1367 1840 4.16666666666667e+00 1367 1635 4.16666666666667e+00 1367 1839 -2.08333333333333e+00 1367 1636 -8.33333333333333e+00 1367 1669 8.33333333333333e+00 1367 1841 -6.25000000000000e+00 1367 1477 2.08333333333333e+00 1367 1621 -4.16666666666667e+00 1367 1846 -2.08333333333333e+00 1367 1853 -6.25000000000000e+00 1367 1670 -3.75000000000000e+01 1367 1852 -2.08333333333333e+00 1367 1528 2.08333333333333e+00 1367 1365 -8.33333333333333e+00 1367 1851 4.16666666666667e+00 1367 1668 8.33333333333333e+00 1368 1368 2.50000000000000e+01 1368 1741 2.08333333333333e+00 1368 1862 2.08333333333333e+00 1368 1859 -2.08333333333333e+00 1368 1490 2.08333333333333e+00 1368 1742 -4.16666666666667e+00 1368 1489 2.08333333333333e+00 1368 1369 -4.16666666666667e+00 1368 1858 4.16666666666667e+00 1368 1488 -6.25000000000000e+00 1368 1857 -6.25000000000000e+00 1368 1370 -4.16666666666667e+00 1368 1502 2.08333333333333e+00 1368 1760 4.16666666666667e+00 1368 1501 2.08333333333333e+00 1368 1861 -4.16666666666667e+00 1368 1759 -2.08333333333333e+00 1368 1500 -6.25000000000000e+00 1368 1758 -6.25000000000000e+00 1369 1369 2.91666666666667e+01 1369 1740 2.08333333333333e+00 1369 1760 4.16666666666667e+00 1369 1370 -8.33333333333333e+00 1369 1859 4.16666666666667e+00 1369 1490 -2.08333333333333e+00 1369 1742 2.08333333333333e+00 1369 1489 -2.08333333333333e+00 1369 1858 -1.87500000000000e+01 1369 1488 2.08333333333333e+00 1369 1368 -4.16666666666667e+00 1369 1857 4.16666666666667e+00 1369 1502 -2.08333333333333e+00 1369 1862 2.08333333333333e+00 1369 1758 -2.08333333333333e+00 1369 1501 -2.08333333333333e+00 1369 1759 -6.25000000000000e+00 1369 1500 2.08333333333333e+00 1369 1860 -4.16666666666667e+00 1370 1370 2.91666666666667e+01 1370 1369 -8.33333333333333e+00 1370 1858 4.16666666666667e+00 1370 1860 2.08333333333333e+00 1370 1857 -2.08333333333333e+00 1370 1490 -2.08333333333333e+00 1370 1859 -6.25000000000000e+00 1370 1489 -2.08333333333333e+00 1370 1741 2.08333333333333e+00 1370 1488 2.08333333333333e+00 1370 1740 -4.16666666666667e+00 1370 1759 4.16666666666667e+00 1370 1502 -2.08333333333333e+00 1370 1760 -1.87500000000000e+01 1370 1501 -2.08333333333333e+00 1370 1861 2.08333333333333e+00 1370 1368 -4.16666666666667e+00 1370 1500 2.08333333333333e+00 1370 1758 4.16666666666667e+00 1371 1371 6.25000000000000e+01 1371 1865 4.16666666666667e+00 1371 1532 -2.08333333333333e+00 1371 1868 2.08333333333333e+00 1371 1867 -4.16666666666667e+00 1371 1493 -2.08333333333333e+00 1371 1864 4.16666666666667e+00 1371 1863 -1.87500000000000e+01 1371 1745 4.16666666666667e+00 1371 1744 4.16666666666667e+00 1371 1778 8.33333333333333e+00 1371 1777 -4.16666666666667e+00 1371 1776 -1.25000000000000e+01 1371 1640 -4.16666666666667e+00 1371 1844 2.08333333333333e+00 1371 1639 -4.16666666666667e+00 1371 1672 4.16666666666667e+00 1371 1843 -4.16666666666667e+00 1371 1492 4.16666666666667e+00 1371 1491 -6.25000000000000e+00 1371 1853 4.16666666666667e+00 1371 1673 -8.33333333333333e+00 1371 1852 4.16666666666667e+00 1371 1372 -8.33333333333333e+00 1371 1531 4.16666666666667e+00 1371 1851 -1.87500000000000e+01 1371 1373 -8.33333333333333e+00 1371 1530 -6.25000000000000e+00 1372 1372 6.25000000000000e+01 1372 1865 -2.08333333333333e+00 1372 1866 -4.16666666666667e+00 1372 1864 -6.25000000000000e+00 1372 1863 4.16666666666667e+00 1372 1745 -8.33333333333333e+00 1372 1493 4.16666666666667e+00 1372 1743 4.16666666666667e+00 1372 1778 8.33333333333333e+00 1372 1373 -8.33333333333333e+00 1372 1532 4.16666666666667e+00 1372 1777 -1.25000000000000e+01 1372 1776 -4.16666666666667e+00 1372 1638 -4.16666666666667e+00 1372 1671 4.16666666666667e+00 1372 1844 2.08333333333333e+00 1372 1640 -4.16666666666667e+00 1372 1492 -1.87500000000000e+01 1372 1842 -4.16666666666667e+00 1372 1491 4.16666666666667e+00 1372 1853 -2.08333333333333e+00 1372 1673 4.16666666666667e+00 1372 1852 -6.25000000000000e+00 1372 1868 2.08333333333333e+00 1372 1531 -1.87500000000000e+01 1372 1851 4.16666666666667e+00 1372 1371 -8.33333333333333e+00 1372 1530 4.16666666666667e+00 1373 1373 6.25000000000000e+01 1373 1864 -2.08333333333333e+00 1373 1371 -8.33333333333333e+00 1373 1863 4.16666666666667e+00 1373 1530 -2.08333333333333e+00 1373 1866 2.08333333333333e+00 1373 1865 -6.25000000000000e+00 1373 1491 -2.08333333333333e+00 1373 1743 4.16666666666667e+00 1373 1744 -8.33333333333333e+00 1373 1492 4.16666666666667e+00 1373 1778 -3.75000000000000e+01 1373 1777 8.33333333333333e+00 1373 1372 -8.33333333333333e+00 1373 1531 4.16666666666667e+00 1373 1776 8.33333333333333e+00 1373 1638 -4.16666666666667e+00 1373 1842 2.08333333333333e+00 1373 1493 -6.25000000000000e+00 1373 1843 2.08333333333333e+00 1373 1639 -4.16666666666667e+00 1373 1853 -6.25000000000000e+00 1373 1867 2.08333333333333e+00 1373 1532 -6.25000000000000e+00 1373 1852 -2.08333333333333e+00 1373 1672 4.16666666666667e+00 1373 1851 4.16666666666667e+00 1373 1671 -8.33333333333333e+00 1374 1374 6.25000000000000e+01 1374 1781 -8.33333333333333e+00 1374 1780 4.16666666666667e+00 1374 1496 2.08333333333333e+00 1374 1864 4.16666666666667e+00 1374 1863 -1.87500000000000e+01 1374 1874 -2.08333333333333e+00 1374 1547 2.08333333333333e+00 1374 1873 4.16666666666667e+00 1374 1872 -6.25000000000000e+00 1374 1748 -4.16666666666667e+00 1374 1747 -4.16666666666667e+00 1374 1763 4.16666666666667e+00 1374 1859 -2.08333333333333e+00 1374 1375 -8.33333333333333e+00 1374 1762 4.16666666666667e+00 1374 1795 -4.16666666666667e+00 1374 1495 -4.16666666666667e+00 1374 1858 4.16666666666667e+00 1374 1857 -6.25000000000000e+00 1374 1376 -8.33333333333333e+00 1374 1871 4.16666666666667e+00 1374 1796 8.33333333333333e+00 1374 1870 4.16666666666667e+00 1374 1546 -4.16666666666667e+00 1374 1865 4.16666666666667e+00 1374 1869 -1.87500000000000e+01 1374 1794 -1.25000000000000e+01 1375 1375 6.25000000000000e+01 1375 1781 4.16666666666667e+00 1375 1779 4.16666666666667e+00 1375 1864 -6.25000000000000e+00 1375 1863 4.16666666666667e+00 1375 1874 4.16666666666667e+00 1375 1376 -8.33333333333333e+00 1375 1873 -1.87500000000000e+01 1375 1872 4.16666666666667e+00 1375 1746 -4.16666666666667e+00 1375 1859 4.16666666666667e+00 1375 1374 -8.33333333333333e+00 1375 1763 -8.33333333333333e+00 1375 1796 8.33333333333333e+00 1375 1761 4.16666666666667e+00 1375 1794 -4.16666666666667e+00 1375 1496 2.08333333333333e+00 1375 1748 -4.16666666666667e+00 1375 1858 -1.87500000000000e+01 1375 1494 -4.16666666666667e+00 1375 1857 4.16666666666667e+00 1375 1871 -2.08333333333333e+00 1375 1547 2.08333333333333e+00 1375 1865 -2.08333333333333e+00 1375 1870 -6.25000000000000e+00 1375 1795 -1.25000000000000e+01 1375 1869 4.16666666666667e+00 1375 1545 -4.16666666666667e+00 1376 1376 6.25000000000000e+01 1376 1780 4.16666666666667e+00 1376 1863 4.16666666666667e+00 1376 1779 -8.33333333333333e+00 1376 1865 -6.25000000000000e+00 1376 1494 2.08333333333333e+00 1376 1874 -6.25000000000000e+00 1376 1873 4.16666666666667e+00 1376 1375 -8.33333333333333e+00 1376 1872 -2.08333333333333e+00 1376 1545 2.08333333333333e+00 1376 1746 -4.16666666666667e+00 1376 1858 4.16666666666667e+00 1376 1761 4.16666666666667e+00 1376 1857 -2.08333333333333e+00 1376 1762 -8.33333333333333e+00 1376 1795 8.33333333333333e+00 1376 1859 -6.25000000000000e+00 1376 1495 2.08333333333333e+00 1376 1747 -4.16666666666667e+00 1376 1864 -2.08333333333333e+00 1376 1871 -6.25000000000000e+00 1376 1796 -3.75000000000000e+01 1376 1870 -2.08333333333333e+00 1376 1546 2.08333333333333e+00 1376 1374 -8.33333333333333e+00 1376 1869 4.16666666666667e+00 1376 1794 8.33333333333333e+00 1377 1377 3.75000000000000e+01 1377 1814 -4.16666666666667e+00 1377 1813 2.08333333333333e+00 1377 1379 -4.16666666666667e+00 1377 1820 4.16666666666667e+00 1377 1535 2.08333333333333e+00 1377 1819 -2.08333333333333e+00 1377 1818 -6.25000000000000e+00 1377 1657 -4.16666666666667e+00 1377 1675 4.16666666666667e+00 1377 1850 2.08333333333333e+00 1377 1658 -4.16666666666667e+00 1377 1513 2.08333333333333e+00 1377 1849 -4.16666666666667e+00 1377 1512 -1.25000000000000e+01 1377 1856 -2.08333333333333e+00 1377 1676 4.16666666666667e+00 1377 1378 -4.16666666666667e+00 1377 1855 4.16666666666667e+00 1377 1534 2.08333333333333e+00 1377 1514 2.08333333333333e+00 1377 1854 -6.25000000000000e+00 1377 1533 -1.25000000000000e+01 1378 1378 3.33333333333333e+01 1378 1812 2.08333333333333e+00 1378 1820 4.16666666666667e+00 1378 1819 -6.25000000000000e+00 1378 1818 -2.08333333333333e+00 1378 1850 2.08333333333333e+00 1378 1658 -4.16666666666667e+00 1378 1656 -4.16666666666667e+00 1378 1674 4.16666666666667e+00 1378 1513 -4.16666666666667e+00 1378 1512 2.08333333333333e+00 1378 1848 -4.16666666666667e+00 1378 1856 4.16666666666667e+00 1378 1676 -8.33333333333333e+00 1378 1814 2.08333333333333e+00 1378 1855 -1.87500000000000e+01 1378 1534 -4.16666666666667e+00 1378 1377 -4.16666666666667e+00 1378 1854 4.16666666666667e+00 1378 1533 2.08333333333333e+00 1379 1379 3.33333333333333e+01 1379 1512 2.08333333333333e+00 1379 1812 -4.16666666666667e+00 1379 1820 -1.87500000000000e+01 1379 1819 4.16666666666667e+00 1379 1377 -4.16666666666667e+00 1379 1818 4.16666666666667e+00 1379 1533 2.08333333333333e+00 1379 1849 2.08333333333333e+00 1379 1657 -4.16666666666667e+00 1379 1514 -4.16666666666667e+00 1379 1848 2.08333333333333e+00 1379 1656 -4.16666666666667e+00 1379 1813 2.08333333333333e+00 1379 1856 -6.25000000000000e+00 1379 1535 -4.16666666666667e+00 1379 1855 4.16666666666667e+00 1379 1675 -8.33333333333333e+00 1379 1854 -2.08333333333333e+00 1379 1674 4.16666666666667e+00 1380 1380 3.75000000000000e+01 1380 1832 -4.16666666666667e+00 1380 1831 2.08333333333333e+00 1380 1382 -4.16666666666667e+00 1380 1838 4.16666666666667e+00 1380 1550 2.08333333333333e+00 1380 1837 -2.08333333333333e+00 1380 1836 -6.25000000000000e+00 1380 1783 -4.16666666666667e+00 1380 1801 4.16666666666667e+00 1380 1868 2.08333333333333e+00 1380 1784 -4.16666666666667e+00 1380 1537 2.08333333333333e+00 1380 1867 -4.16666666666667e+00 1380 1536 -1.25000000000000e+01 1380 1874 -2.08333333333333e+00 1380 1802 4.16666666666667e+00 1380 1381 -4.16666666666667e+00 1380 1873 4.16666666666667e+00 1380 1549 2.08333333333333e+00 1380 1538 2.08333333333333e+00 1380 1872 -6.25000000000000e+00 1380 1548 -1.25000000000000e+01 1381 1381 3.33333333333333e+01 1381 1830 2.08333333333333e+00 1381 1838 4.16666666666667e+00 1381 1837 -6.25000000000000e+00 1381 1836 -2.08333333333333e+00 1381 1868 2.08333333333333e+00 1381 1784 -4.16666666666667e+00 1381 1782 -4.16666666666667e+00 1381 1800 4.16666666666667e+00 1381 1537 -4.16666666666667e+00 1381 1536 2.08333333333333e+00 1381 1866 -4.16666666666667e+00 1381 1874 4.16666666666667e+00 1381 1802 -8.33333333333333e+00 1381 1832 2.08333333333333e+00 1381 1873 -1.87500000000000e+01 1381 1549 -4.16666666666667e+00 1381 1380 -4.16666666666667e+00 1381 1872 4.16666666666667e+00 1381 1548 2.08333333333333e+00 1382 1382 3.33333333333333e+01 1382 1536 2.08333333333333e+00 1382 1830 -4.16666666666667e+00 1382 1838 -1.87500000000000e+01 1382 1837 4.16666666666667e+00 1382 1380 -4.16666666666667e+00 1382 1836 4.16666666666667e+00 1382 1548 2.08333333333333e+00 1382 1867 2.08333333333333e+00 1382 1783 -4.16666666666667e+00 1382 1538 -4.16666666666667e+00 1382 1866 2.08333333333333e+00 1382 1782 -4.16666666666667e+00 1382 1831 2.08333333333333e+00 1382 1874 -6.25000000000000e+00 1382 1550 -4.16666666666667e+00 1382 1873 4.16666666666667e+00 1382 1801 -8.33333333333333e+00 1382 1872 -2.08333333333333e+00 1382 1800 4.16666666666667e+00 1383 1383 3.75000000000000e+01 1383 1300 2.08333333333333e+00 1383 1552 -4.16666666666667e+00 1383 1391 -2.08333333333333e+00 1383 1384 -4.16666666666667e+00 1383 1390 4.16666666666667e+00 1383 1276 2.08333333333333e+00 1383 1389 -6.25000000000000e+00 1383 1559 -4.16666666666667e+00 1383 1403 4.16666666666667e+00 1383 1301 2.08333333333333e+00 1383 1556 -4.16666666666667e+00 1383 1555 2.08333333333333e+00 1383 1558 -4.16666666666667e+00 1383 1299 -1.25000000000000e+01 1383 1385 -4.16666666666667e+00 1383 1397 4.16666666666667e+00 1383 1277 2.08333333333333e+00 1383 1396 -2.08333333333333e+00 1383 1402 4.16666666666667e+00 1383 1553 2.08333333333333e+00 1383 1395 -6.25000000000000e+00 1383 1275 -1.25000000000000e+01 1384 1384 3.33333333333333e+01 1384 1299 2.08333333333333e+00 1384 1551 -4.16666666666667e+00 1384 1391 4.16666666666667e+00 1384 1390 -1.87500000000000e+01 1384 1383 -4.16666666666667e+00 1384 1389 4.16666666666667e+00 1384 1275 2.08333333333333e+00 1384 1556 2.08333333333333e+00 1384 1559 -4.16666666666667e+00 1384 1300 -4.16666666666667e+00 1384 1554 2.08333333333333e+00 1384 1557 -4.16666666666667e+00 1384 1397 4.16666666666667e+00 1384 1403 -8.33333333333333e+00 1384 1553 2.08333333333333e+00 1384 1396 -6.25000000000000e+00 1384 1276 -4.16666666666667e+00 1384 1395 -2.08333333333333e+00 1384 1401 4.16666666666667e+00 1385 1385 3.33333333333333e+01 1385 1551 2.08333333333333e+00 1385 1391 -6.25000000000000e+00 1385 1390 4.16666666666667e+00 1385 1389 -2.08333333333333e+00 1385 1555 2.08333333333333e+00 1385 1558 -4.16666666666667e+00 1385 1557 -4.16666666666667e+00 1385 1401 4.16666666666667e+00 1385 1301 -4.16666666666667e+00 1385 1299 2.08333333333333e+00 1385 1554 -4.16666666666667e+00 1385 1552 2.08333333333333e+00 1385 1397 -1.87500000000000e+01 1385 1277 -4.16666666666667e+00 1385 1396 4.16666666666667e+00 1385 1402 -8.33333333333333e+00 1385 1383 -4.16666666666667e+00 1385 1395 4.16666666666667e+00 1385 1275 2.08333333333333e+00 1386 1386 6.25000000000000e+01 1386 1388 -8.33333333333333e+00 1386 1400 8.33333333333333e+00 1386 1573 4.16666666666667e+00 1386 1399 -4.16666666666667e+00 1386 1277 -2.08333333333333e+00 1386 1276 4.16666666666667e+00 1386 1275 -6.25000000000000e+00 1386 1398 -1.25000000000000e+01 1386 1304 -2.08333333333333e+00 1386 1574 4.16666666666667e+00 1386 1387 -8.33333333333333e+00 1386 1303 4.16666666666667e+00 1386 1302 -6.25000000000000e+00 1386 1570 -4.16666666666667e+00 1386 1391 4.16666666666667e+00 1386 1390 4.16666666666667e+00 1386 1389 -1.87500000000000e+01 1386 1577 -4.16666666666667e+00 1386 1576 -4.16666666666667e+00 1386 1403 -8.33333333333333e+00 1386 1402 4.16666666666667e+00 1386 1571 2.08333333333333e+00 1386 2030 2.08333333333333e+00 1386 2029 -4.16666666666667e+00 1386 2287 4.16666666666667e+00 1386 2288 4.16666666666667e+00 1386 2286 -1.87500000000000e+01 1387 1387 6.25000000000000e+01 1387 1572 4.16666666666667e+00 1387 1398 -4.16666666666667e+00 1387 1277 4.16666666666667e+00 1387 1388 -8.33333333333333e+00 1387 1400 8.33333333333333e+00 1387 1276 -1.87500000000000e+01 1387 1399 -1.25000000000000e+01 1387 1275 4.16666666666667e+00 1387 1304 4.16666666666667e+00 1387 1574 -8.33333333333333e+00 1387 1303 -1.87500000000000e+01 1387 1386 -8.33333333333333e+00 1387 1302 4.16666666666667e+00 1387 1569 -4.16666666666667e+00 1387 1391 -2.08333333333333e+00 1387 1390 -6.25000000000000e+00 1387 1389 4.16666666666667e+00 1387 1577 -4.16666666666667e+00 1387 1403 4.16666666666667e+00 1387 1575 -4.16666666666667e+00 1387 1571 2.08333333333333e+00 1387 1401 4.16666666666667e+00 1387 2030 2.08333333333333e+00 1387 2028 -4.16666666666667e+00 1387 2288 -2.08333333333333e+00 1387 2287 -6.25000000000000e+00 1387 2286 4.16666666666667e+00 1388 1388 6.25000000000000e+01 1388 1386 -8.33333333333333e+00 1388 1398 8.33333333333333e+00 1388 1277 -6.25000000000000e+00 1388 1400 -3.75000000000000e+01 1388 1276 4.16666666666667e+00 1388 1387 -8.33333333333333e+00 1388 1399 8.33333333333333e+00 1388 1275 -2.08333333333333e+00 1388 1304 -6.25000000000000e+00 1388 1303 4.16666666666667e+00 1388 1573 -8.33333333333333e+00 1388 1302 -2.08333333333333e+00 1388 1572 4.16666666666667e+00 1388 1570 2.08333333333333e+00 1388 1391 -6.25000000000000e+00 1388 1390 -2.08333333333333e+00 1388 1389 4.16666666666667e+00 1388 1575 -4.16666666666667e+00 1388 1576 -4.16666666666667e+00 1388 1402 4.16666666666667e+00 1388 1569 2.08333333333333e+00 1388 1401 -8.33333333333333e+00 1388 2029 2.08333333333333e+00 1388 2286 4.16666666666667e+00 1388 2028 2.08333333333333e+00 1388 2287 -2.08333333333333e+00 1388 2288 -6.25000000000000e+00 1389 1389 6.25000000000000e+01 1389 1576 4.16666666666667e+00 1389 1577 4.16666666666667e+00 1389 1570 4.16666666666667e+00 1389 1569 -6.25000000000000e+00 1389 1391 -8.33333333333333e+00 1389 1388 4.16666666666667e+00 1389 1387 4.16666666666667e+00 1389 1386 -1.87500000000000e+01 1389 1402 -4.16666666666667e+00 1389 1390 -8.33333333333333e+00 1389 1553 4.16666666666667e+00 1389 1588 -4.16666666666667e+00 1389 1558 4.16666666666667e+00 1389 1403 8.33333333333333e+00 1389 1559 -8.33333333333333e+00 1389 1307 2.08333333333333e+00 1389 1589 -4.16666666666667e+00 1389 1552 4.16666666666667e+00 1389 1306 -4.16666666666667e+00 1389 1551 -1.87500000000000e+01 1389 1385 -2.08333333333333e+00 1389 1277 2.08333333333333e+00 1389 1384 4.16666666666667e+00 1389 1276 -4.16666666666667e+00 1389 1383 -6.25000000000000e+00 1389 1571 -2.08333333333333e+00 1389 1401 -1.25000000000000e+01 1390 1390 6.25000000000000e+01 1390 1575 4.16666666666667e+00 1390 1577 -8.33333333333333e+00 1390 1307 2.08333333333333e+00 1390 1570 -1.87500000000000e+01 1390 1569 4.16666666666667e+00 1390 1388 -2.08333333333333e+00 1390 1277 2.08333333333333e+00 1390 1387 -6.25000000000000e+00 1390 1386 4.16666666666667e+00 1390 1401 -4.16666666666667e+00 1390 1553 -2.08333333333333e+00 1390 1389 -8.33333333333333e+00 1390 1587 -4.16666666666667e+00 1390 1557 4.16666666666667e+00 1390 1589 -4.16666666666667e+00 1390 1559 4.16666666666667e+00 1390 1552 -6.25000000000000e+00 1390 1551 4.16666666666667e+00 1390 1305 -4.16666666666667e+00 1390 1385 4.16666666666667e+00 1390 1391 -8.33333333333333e+00 1390 1403 8.33333333333333e+00 1390 1384 -1.87500000000000e+01 1390 1571 4.16666666666667e+00 1390 1402 -1.25000000000000e+01 1390 1383 4.16666666666667e+00 1390 1275 -4.16666666666667e+00 1391 1391 6.25000000000000e+01 1391 1570 4.16666666666667e+00 1391 1576 -8.33333333333333e+00 1391 1575 4.16666666666667e+00 1391 1571 -6.25000000000000e+00 1391 1306 2.08333333333333e+00 1391 1388 -6.25000000000000e+00 1391 1387 -2.08333333333333e+00 1391 1276 2.08333333333333e+00 1391 1389 -8.33333333333333e+00 1391 1386 4.16666666666667e+00 1391 1552 -2.08333333333333e+00 1391 1551 4.16666666666667e+00 1391 1588 -4.16666666666667e+00 1391 1558 4.16666666666667e+00 1391 1401 8.33333333333333e+00 1391 1557 -8.33333333333333e+00 1391 1553 -6.25000000000000e+00 1391 1305 2.08333333333333e+00 1391 1587 -4.16666666666667e+00 1391 1385 -6.25000000000000e+00 1391 1569 -2.08333333333333e+00 1391 1403 -3.75000000000000e+01 1391 1384 4.16666666666667e+00 1391 1390 -8.33333333333333e+00 1391 1402 8.33333333333333e+00 1391 1383 -2.08333333333333e+00 1391 1275 2.08333333333333e+00 1392 1392 6.25000000000000e+01 1392 1400 -4.16666666666667e+00 1392 1393 -8.33333333333333e+00 1392 1399 8.33333333333333e+00 1392 1277 4.16666666666667e+00 1392 1276 -2.08333333333333e+00 1392 1275 -6.25000000000000e+00 1392 1398 -1.25000000000000e+01 1392 1394 -8.33333333333333e+00 1392 1310 4.16666666666667e+00 1392 1309 -2.08333333333333e+00 1392 1609 4.16666666666667e+00 1392 1610 4.16666666666667e+00 1392 1308 -6.25000000000000e+00 1392 1403 4.16666666666667e+00 1392 1613 -4.16666666666667e+00 1392 1606 2.08333333333333e+00 1392 1612 -4.16666666666667e+00 1392 1607 -4.16666666666667e+00 1392 1397 4.16666666666667e+00 1392 1396 4.16666666666667e+00 1392 1402 -8.33333333333333e+00 1392 1395 -1.87500000000000e+01 1392 2290 4.16666666666667e+00 1392 2030 -4.16666666666667e+00 1392 2029 2.08333333333333e+00 1392 2291 4.16666666666667e+00 1392 2289 -1.87500000000000e+01 1393 1393 6.25000000000000e+01 1393 1392 -8.33333333333333e+00 1393 1398 8.33333333333333e+00 1393 1277 4.16666666666667e+00 1393 1394 -8.33333333333333e+00 1393 1400 8.33333333333333e+00 1393 1276 -6.25000000000000e+00 1393 1399 -3.75000000000000e+01 1393 1275 -2.08333333333333e+00 1393 1310 4.16666666666667e+00 1393 1610 -8.33333333333333e+00 1393 1309 -6.25000000000000e+00 1393 1308 -2.08333333333333e+00 1393 1608 4.16666666666667e+00 1393 1605 2.08333333333333e+00 1393 1611 -4.16666666666667e+00 1393 1607 2.08333333333333e+00 1393 1613 -4.16666666666667e+00 1393 1397 -2.08333333333333e+00 1393 1403 4.16666666666667e+00 1393 1396 -6.25000000000000e+00 1393 1395 4.16666666666667e+00 1393 1401 -8.33333333333333e+00 1393 2291 -2.08333333333333e+00 1393 2289 4.16666666666667e+00 1393 2028 2.08333333333333e+00 1393 2030 2.08333333333333e+00 1393 2290 -6.25000000000000e+00 1394 1394 6.25000000000000e+01 1394 1398 -4.16666666666667e+00 1394 1277 -1.87500000000000e+01 1394 1400 -1.25000000000000e+01 1394 1276 4.16666666666667e+00 1394 1393 -8.33333333333333e+00 1394 1399 8.33333333333333e+00 1394 1275 4.16666666666667e+00 1394 1608 4.16666666666667e+00 1394 1310 -1.87500000000000e+01 1394 1309 4.16666666666667e+00 1394 1609 -8.33333333333333e+00 1394 1392 -8.33333333333333e+00 1394 1308 4.16666666666667e+00 1394 1401 4.16666666666667e+00 1394 1611 -4.16666666666667e+00 1394 1606 2.08333333333333e+00 1394 1612 -4.16666666666667e+00 1394 1605 -4.16666666666667e+00 1394 1397 -6.25000000000000e+00 1394 1396 -2.08333333333333e+00 1394 1402 4.16666666666667e+00 1394 1395 4.16666666666667e+00 1394 2029 2.08333333333333e+00 1394 2290 -2.08333333333333e+00 1394 2028 -4.16666666666667e+00 1394 2291 -6.25000000000000e+00 1394 2289 4.16666666666667e+00 1395 1395 6.25000000000000e+01 1395 1559 4.16666666666667e+00 1395 1558 -8.33333333333333e+00 1395 1556 4.16666666666667e+00 1395 1312 2.08333333333333e+00 1395 1554 -1.87500000000000e+01 1395 1385 4.16666666666667e+00 1395 1384 -2.08333333333333e+00 1395 1276 2.08333333333333e+00 1395 1383 -6.25000000000000e+00 1395 1403 -4.16666666666667e+00 1395 1397 -8.33333333333333e+00 1395 1606 -2.08333333333333e+00 1395 1625 -4.16666666666667e+00 1395 1613 4.16666666666667e+00 1395 1624 -4.16666666666667e+00 1395 1612 4.16666666666667e+00 1395 1607 4.16666666666667e+00 1395 1313 -4.16666666666667e+00 1395 1605 -6.25000000000000e+00 1395 1394 4.16666666666667e+00 1395 1277 -4.16666666666667e+00 1395 1393 4.16666666666667e+00 1395 1396 -8.33333333333333e+00 1395 1402 8.33333333333333e+00 1395 1392 -1.87500000000000e+01 1395 1555 4.16666666666667e+00 1395 1401 -1.25000000000000e+01 1396 1396 6.25000000000000e+01 1396 1559 4.16666666666667e+00 1396 1554 4.16666666666667e+00 1396 1557 -8.33333333333333e+00 1396 1555 -6.25000000000000e+00 1396 1311 2.08333333333333e+00 1396 1385 4.16666666666667e+00 1396 1397 -8.33333333333333e+00 1396 1384 -6.25000000000000e+00 1396 1383 -2.08333333333333e+00 1396 1275 2.08333333333333e+00 1396 1605 -2.08333333333333e+00 1396 1607 4.16666666666667e+00 1396 1403 8.33333333333333e+00 1396 1613 -8.33333333333333e+00 1396 1623 -4.16666666666667e+00 1396 1611 4.16666666666667e+00 1396 1313 2.08333333333333e+00 1396 1625 -4.16666666666667e+00 1396 1606 -6.25000000000000e+00 1396 1394 -2.08333333333333e+00 1396 1277 2.08333333333333e+00 1396 1393 -6.25000000000000e+00 1396 1556 -2.08333333333333e+00 1396 1402 -3.75000000000000e+01 1396 1392 4.16666666666667e+00 1396 1395 -8.33333333333333e+00 1396 1401 8.33333333333333e+00 1397 1397 6.25000000000000e+01 1397 1558 4.16666666666667e+00 1397 1557 4.16666666666667e+00 1397 1556 -6.25000000000000e+00 1397 1554 4.16666666666667e+00 1397 1385 -1.87500000000000e+01 1397 1384 4.16666666666667e+00 1397 1396 -8.33333333333333e+00 1397 1383 4.16666666666667e+00 1397 1401 -4.16666666666667e+00 1397 1395 -8.33333333333333e+00 1397 1606 4.16666666666667e+00 1397 1623 -4.16666666666667e+00 1397 1611 4.16666666666667e+00 1397 1402 8.33333333333333e+00 1397 1612 -8.33333333333333e+00 1397 1607 -1.87500000000000e+01 1397 1312 2.08333333333333e+00 1397 1624 -4.16666666666667e+00 1397 1605 4.16666666666667e+00 1397 1311 -4.16666666666667e+00 1397 1394 -6.25000000000000e+00 1397 1555 -2.08333333333333e+00 1397 1403 -1.25000000000000e+01 1397 1393 -2.08333333333333e+00 1397 1276 2.08333333333333e+00 1397 1392 4.16666666666667e+00 1397 1275 -4.16666666666667e+00 1398 1398 1.25000000000000e+02 1398 1387 -4.16666666666667e+00 1398 1277 4.16666666666667e+00 1398 1386 -1.25000000000000e+01 1398 1574 -4.16666666666667e+00 1398 1316 4.16666666666667e+00 1398 1399 -1.66666666666667e+01 1398 1573 8.33333333333333e+00 1398 1572 -1.25000000000000e+01 1398 1394 -4.16666666666667e+00 1398 1393 8.33333333333333e+00 1398 1276 4.16666666666667e+00 1398 1392 -1.25000000000000e+01 1398 1400 -1.66666666666667e+01 1398 1610 8.33333333333333e+00 1398 1609 -4.16666666666667e+00 1398 1315 4.16666666666667e+00 1398 1388 8.33333333333333e+00 1398 1608 -1.25000000000000e+01 1398 1576 -8.33333333333333e+00 1398 1403 8.33333333333333e+00 1398 1613 -8.33333333333333e+00 1398 1642 -4.16666666666667e+00 1398 1612 4.16666666666667e+00 1398 1643 -4.16666666666667e+00 1398 1402 8.33333333333333e+00 1398 1577 4.16666666666667e+00 1398 1401 -3.75000000000000e+01 1398 2287 4.16666666666667e+00 1398 2288 -8.33333333333333e+00 1398 2030 -4.16666666666667e+00 1398 2291 4.16666666666667e+00 1398 2293 8.33333333333333e+00 1398 2290 -8.33333333333333e+00 1398 2029 -4.16666666666667e+00 1398 2294 8.33333333333333e+00 1398 2292 -3.75000000000000e+01 1399 1399 1.25000000000000e+02 1399 1386 -4.16666666666667e+00 1399 1388 8.33333333333333e+00 1399 1387 -1.25000000000000e+01 1399 1574 8.33333333333333e+00 1399 1573 -3.75000000000000e+01 1399 1398 -1.66666666666667e+01 1399 1572 8.33333333333333e+00 1399 1400 -1.66666666666667e+01 1399 1392 8.33333333333333e+00 1399 1277 -8.33333333333333e+00 1399 1394 8.33333333333333e+00 1399 1393 -3.75000000000000e+01 1399 1275 4.16666666666667e+00 1399 1610 8.33333333333333e+00 1399 1316 -8.33333333333333e+00 1399 1609 -1.25000000000000e+01 1399 1608 -4.16666666666667e+00 1399 1314 4.16666666666667e+00 1399 1577 4.16666666666667e+00 1399 1575 -8.33333333333333e+00 1399 1403 -4.16666666666667e+00 1399 1643 -4.16666666666667e+00 1399 1613 4.16666666666667e+00 1399 1641 -4.16666666666667e+00 1399 1611 4.16666666666667e+00 1399 1402 -1.25000000000000e+01 1399 1401 8.33333333333333e+00 1399 2288 4.16666666666667e+00 1399 2294 -4.16666666666667e+00 1399 2030 -4.16666666666667e+00 1399 2291 4.16666666666667e+00 1399 2292 8.33333333333333e+00 1399 2289 -8.33333333333333e+00 1399 2028 -4.16666666666667e+00 1399 2286 4.16666666666667e+00 1399 2293 -1.25000000000000e+01 1400 1400 1.25000000000000e+02 1400 1388 -3.75000000000000e+01 1400 1387 8.33333333333333e+00 1400 1275 4.16666666666667e+00 1400 1574 -1.25000000000000e+01 1400 1573 8.33333333333333e+00 1400 1572 -4.16666666666667e+00 1400 1314 4.16666666666667e+00 1400 1399 -1.66666666666667e+01 1400 1392 -4.16666666666667e+00 1400 1394 -1.25000000000000e+01 1400 1276 -8.33333333333333e+00 1400 1393 8.33333333333333e+00 1400 1386 8.33333333333333e+00 1400 1610 -3.75000000000000e+01 1400 1609 8.33333333333333e+00 1400 1315 -8.33333333333333e+00 1400 1398 -1.66666666666667e+01 1400 1608 8.33333333333333e+00 1400 1576 4.16666666666667e+00 1400 1402 -4.16666666666667e+00 1400 1642 -4.16666666666667e+00 1400 1612 4.16666666666667e+00 1400 1401 8.33333333333333e+00 1400 1611 -8.33333333333333e+00 1400 1641 -4.16666666666667e+00 1400 1575 4.16666666666667e+00 1400 1403 -1.25000000000000e+01 1400 2287 4.16666666666667e+00 1400 2286 -8.33333333333333e+00 1400 2293 -4.16666666666667e+00 1400 2029 -4.16666666666667e+00 1400 2290 4.16666666666667e+00 1400 2028 -4.16666666666667e+00 1400 2289 4.16666666666667e+00 1400 2294 -1.25000000000000e+01 1400 2292 8.33333333333333e+00 1401 1401 1.25000000000000e+02 1401 1576 8.33333333333333e+00 1401 1575 -1.25000000000000e+01 1401 1388 -8.33333333333333e+00 1401 1387 4.16666666666667e+00 1401 1400 8.33333333333333e+00 1401 1642 4.16666666666667e+00 1401 1399 8.33333333333333e+00 1401 1398 -3.75000000000000e+01 1401 1643 4.16666666666667e+00 1401 1390 -4.16666666666667e+00 1401 1391 8.33333333333333e+00 1401 1403 -1.66666666666667e+01 1401 1277 -4.16666666666667e+00 1401 1389 -1.25000000000000e+01 1401 1589 4.16666666666667e+00 1401 1319 -4.16666666666667e+00 1401 1588 -8.33333333333333e+00 1401 1385 4.16666666666667e+00 1401 1558 8.33333333333333e+00 1401 1402 -1.66666666666667e+01 1401 1559 8.33333333333333e+00 1401 1318 -4.16666666666667e+00 1401 1557 -3.75000000000000e+01 1401 1384 4.16666666666667e+00 1401 1276 -4.16666666666667e+00 1401 1397 -4.16666666666667e+00 1401 1394 4.16666666666667e+00 1401 1624 4.16666666666667e+00 1401 1612 -4.16666666666667e+00 1401 1393 -8.33333333333333e+00 1401 1396 8.33333333333333e+00 1401 1395 -1.25000000000000e+01 1401 1613 8.33333333333333e+00 1401 1625 -8.33333333333333e+00 1401 1611 -1.25000000000000e+01 1401 1577 -4.16666666666667e+00 1402 1402 1.25000000000000e+02 1402 1575 8.33333333333333e+00 1402 1577 8.33333333333333e+00 1402 1576 -3.75000000000000e+01 1402 1386 4.16666666666667e+00 1402 1400 -4.16666666666667e+00 1402 1641 4.16666666666667e+00 1402 1399 -1.25000000000000e+01 1402 1398 8.33333333333333e+00 1402 1643 -8.33333333333333e+00 1402 1389 -4.16666666666667e+00 1402 1589 4.16666666666667e+00 1402 1391 8.33333333333333e+00 1402 1390 -1.25000000000000e+01 1402 1587 -8.33333333333333e+00 1402 1559 -4.16666666666667e+00 1402 1557 8.33333333333333e+00 1402 1401 -1.66666666666667e+01 1402 1558 -1.25000000000000e+01 1402 1317 -4.16666666666667e+00 1402 1385 -8.33333333333333e+00 1402 1383 4.16666666666667e+00 1402 1275 -4.16666666666667e+00 1402 1397 8.33333333333333e+00 1402 1403 -1.66666666666667e+01 1402 1613 8.33333333333333e+00 1402 1623 4.16666666666667e+00 1402 1611 -4.16666666666667e+00 1402 1394 4.16666666666667e+00 1402 1277 -4.16666666666667e+00 1402 1396 -3.75000000000000e+01 1402 1392 -8.33333333333333e+00 1402 1395 8.33333333333333e+00 1402 1625 4.16666666666667e+00 1402 1319 -4.16666666666667e+00 1402 1612 -1.25000000000000e+01 1402 1388 4.16666666666667e+00 1403 1403 1.25000000000000e+02 1403 1387 4.16666666666667e+00 1403 1577 -1.25000000000000e+01 1403 1576 8.33333333333333e+00 1403 1386 -8.33333333333333e+00 1403 1399 -4.16666666666667e+00 1403 1398 8.33333333333333e+00 1403 1400 -1.25000000000000e+01 1403 1642 -8.33333333333333e+00 1403 1641 4.16666666666667e+00 1403 1588 4.16666666666667e+00 1403 1389 8.33333333333333e+00 1403 1401 -1.66666666666667e+01 1403 1391 -3.75000000000000e+01 1403 1390 8.33333333333333e+00 1403 1275 -4.16666666666667e+00 1403 1587 4.16666666666667e+00 1403 1317 -4.16666666666667e+00 1403 1558 -4.16666666666667e+00 1403 1383 4.16666666666667e+00 1403 1559 -1.25000000000000e+01 1403 1557 8.33333333333333e+00 1403 1384 -8.33333333333333e+00 1403 1395 -4.16666666666667e+00 1403 1392 4.16666666666667e+00 1403 1396 8.33333333333333e+00 1403 1402 -1.66666666666667e+01 1403 1612 8.33333333333333e+00 1403 1397 -1.25000000000000e+01 1403 1393 4.16666666666667e+00 1403 1276 -4.16666666666667e+00 1403 1613 -3.75000000000000e+01 1403 1575 -4.16666666666667e+00 1403 1624 4.16666666666667e+00 1403 1318 -4.16666666666667e+00 1403 1611 8.33333333333333e+00 1403 1623 -8.33333333333333e+00 1404 1404 3.75000000000000e+01 1404 1279 2.08333333333333e+00 1404 1411 -4.16666666666667e+00 1404 1562 -2.08333333333333e+00 1404 1405 -4.16666666666667e+00 1404 1561 4.16666666666667e+00 1404 1300 2.08333333333333e+00 1404 1560 -6.25000000000000e+00 1404 1424 -4.16666666666667e+00 1404 1568 4.16666666666667e+00 1404 1280 2.08333333333333e+00 1404 1418 -4.16666666666667e+00 1404 1417 2.08333333333333e+00 1404 1423 -4.16666666666667e+00 1404 1278 -1.25000000000000e+01 1404 1406 -4.16666666666667e+00 1404 1565 4.16666666666667e+00 1404 1301 2.08333333333333e+00 1404 1564 -2.08333333333333e+00 1404 1567 4.16666666666667e+00 1404 1412 2.08333333333333e+00 1404 1563 -6.25000000000000e+00 1404 1299 -1.25000000000000e+01 1405 1405 3.33333333333333e+01 1405 1278 2.08333333333333e+00 1405 1410 -4.16666666666667e+00 1405 1562 4.16666666666667e+00 1405 1561 -1.87500000000000e+01 1405 1404 -4.16666666666667e+00 1405 1560 4.16666666666667e+00 1405 1299 2.08333333333333e+00 1405 1418 2.08333333333333e+00 1405 1424 -4.16666666666667e+00 1405 1279 -4.16666666666667e+00 1405 1416 2.08333333333333e+00 1405 1422 -4.16666666666667e+00 1405 1565 4.16666666666667e+00 1405 1568 -8.33333333333333e+00 1405 1412 2.08333333333333e+00 1405 1564 -6.25000000000000e+00 1405 1300 -4.16666666666667e+00 1405 1563 -2.08333333333333e+00 1405 1566 4.16666666666667e+00 1406 1406 3.33333333333333e+01 1406 1410 2.08333333333333e+00 1406 1562 -6.25000000000000e+00 1406 1561 4.16666666666667e+00 1406 1560 -2.08333333333333e+00 1406 1417 2.08333333333333e+00 1406 1423 -4.16666666666667e+00 1406 1422 -4.16666666666667e+00 1406 1566 4.16666666666667e+00 1406 1280 -4.16666666666667e+00 1406 1278 2.08333333333333e+00 1406 1416 -4.16666666666667e+00 1406 1411 2.08333333333333e+00 1406 1565 -1.87500000000000e+01 1406 1301 -4.16666666666667e+00 1406 1564 4.16666666666667e+00 1406 1567 -8.33333333333333e+00 1406 1404 -4.16666666666667e+00 1406 1563 4.16666666666667e+00 1406 1299 2.08333333333333e+00 1407 1407 3.75000000000000e+01 1407 1321 2.08333333333333e+00 1407 1678 -4.16666666666667e+00 1407 1415 -2.08333333333333e+00 1407 1408 -4.16666666666667e+00 1407 1414 4.16666666666667e+00 1407 1279 2.08333333333333e+00 1407 1413 -6.25000000000000e+00 1407 1685 -4.16666666666667e+00 1407 1427 4.16666666666667e+00 1407 1322 2.08333333333333e+00 1407 1682 -4.16666666666667e+00 1407 1681 2.08333333333333e+00 1407 1684 -4.16666666666667e+00 1407 1320 -1.25000000000000e+01 1407 1409 -4.16666666666667e+00 1407 1421 4.16666666666667e+00 1407 1280 2.08333333333333e+00 1407 1420 -2.08333333333333e+00 1407 1426 4.16666666666667e+00 1407 1679 2.08333333333333e+00 1407 1419 -6.25000000000000e+00 1407 1278 -1.25000000000000e+01 1408 1408 3.33333333333333e+01 1408 1320 2.08333333333333e+00 1408 1677 -4.16666666666667e+00 1408 1415 4.16666666666667e+00 1408 1414 -1.87500000000000e+01 1408 1407 -4.16666666666667e+00 1408 1413 4.16666666666667e+00 1408 1278 2.08333333333333e+00 1408 1682 2.08333333333333e+00 1408 1685 -4.16666666666667e+00 1408 1321 -4.16666666666667e+00 1408 1680 2.08333333333333e+00 1408 1683 -4.16666666666667e+00 1408 1421 4.16666666666667e+00 1408 1427 -8.33333333333333e+00 1408 1679 2.08333333333333e+00 1408 1420 -6.25000000000000e+00 1408 1279 -4.16666666666667e+00 1408 1419 -2.08333333333333e+00 1408 1425 4.16666666666667e+00 1409 1409 3.33333333333333e+01 1409 1677 2.08333333333333e+00 1409 1415 -6.25000000000000e+00 1409 1414 4.16666666666667e+00 1409 1413 -2.08333333333333e+00 1409 1681 2.08333333333333e+00 1409 1684 -4.16666666666667e+00 1409 1683 -4.16666666666667e+00 1409 1425 4.16666666666667e+00 1409 1322 -4.16666666666667e+00 1409 1320 2.08333333333333e+00 1409 1680 -4.16666666666667e+00 1409 1678 2.08333333333333e+00 1409 1421 -1.87500000000000e+01 1409 1280 -4.16666666666667e+00 1409 1420 4.16666666666667e+00 1409 1426 -8.33333333333333e+00 1409 1407 -4.16666666666667e+00 1409 1419 4.16666666666667e+00 1409 1278 2.08333333333333e+00 1410 1410 6.25000000000000e+01 1410 1696 -4.16666666666667e+00 1410 1415 4.16666666666667e+00 1410 1414 4.16666666666667e+00 1410 1413 -1.87500000000000e+01 1410 1703 -4.16666666666667e+00 1410 1702 -4.16666666666667e+00 1410 1427 -8.33333333333333e+00 1410 1426 4.16666666666667e+00 1410 1562 4.16666666666667e+00 1410 1412 -8.33333333333333e+00 1410 1424 8.33333333333333e+00 1410 1699 4.16666666666667e+00 1410 1423 -4.16666666666667e+00 1410 1280 -2.08333333333333e+00 1410 1406 2.08333333333333e+00 1410 1279 4.16666666666667e+00 1410 1405 -4.16666666666667e+00 1410 1278 -6.25000000000000e+00 1410 1422 -1.25000000000000e+01 1410 1325 -2.08333333333333e+00 1410 1700 4.16666666666667e+00 1410 1411 -8.33333333333333e+00 1410 1324 4.16666666666667e+00 1410 1561 4.16666666666667e+00 1410 1697 2.08333333333333e+00 1410 1323 -6.25000000000000e+00 1410 1560 -1.87500000000000e+01 1411 1411 6.25000000000000e+01 1411 1695 -4.16666666666667e+00 1411 1415 -2.08333333333333e+00 1411 1414 -6.25000000000000e+00 1411 1413 4.16666666666667e+00 1411 1703 -4.16666666666667e+00 1411 1427 4.16666666666667e+00 1411 1701 -4.16666666666667e+00 1411 1425 4.16666666666667e+00 1411 1562 -2.08333333333333e+00 1411 1406 2.08333333333333e+00 1411 1698 4.16666666666667e+00 1411 1422 -4.16666666666667e+00 1411 1280 4.16666666666667e+00 1411 1412 -8.33333333333333e+00 1411 1424 8.33333333333333e+00 1411 1279 -1.87500000000000e+01 1411 1423 -1.25000000000000e+01 1411 1278 4.16666666666667e+00 1411 1404 -4.16666666666667e+00 1411 1325 4.16666666666667e+00 1411 1700 -8.33333333333333e+00 1411 1697 2.08333333333333e+00 1411 1324 -1.87500000000000e+01 1411 1561 -6.25000000000000e+00 1411 1410 -8.33333333333333e+00 1411 1323 4.16666666666667e+00 1411 1560 4.16666666666667e+00 1412 1412 6.25000000000000e+01 1412 1696 2.08333333333333e+00 1412 1415 -6.25000000000000e+00 1412 1414 -2.08333333333333e+00 1412 1413 4.16666666666667e+00 1412 1701 -4.16666666666667e+00 1412 1702 -4.16666666666667e+00 1412 1426 4.16666666666667e+00 1412 1425 -8.33333333333333e+00 1412 1561 -2.08333333333333e+00 1412 1405 2.08333333333333e+00 1412 1560 4.16666666666667e+00 1412 1410 -8.33333333333333e+00 1412 1422 8.33333333333333e+00 1412 1280 -6.25000000000000e+00 1412 1424 -3.75000000000000e+01 1412 1279 4.16666666666667e+00 1412 1411 -8.33333333333333e+00 1412 1423 8.33333333333333e+00 1412 1278 -2.08333333333333e+00 1412 1404 2.08333333333333e+00 1412 1695 2.08333333333333e+00 1412 1325 -6.25000000000000e+00 1412 1562 -6.25000000000000e+00 1412 1324 4.16666666666667e+00 1412 1699 -8.33333333333333e+00 1412 1323 -2.08333333333333e+00 1412 1698 4.16666666666667e+00 1413 1413 6.25000000000000e+01 1413 1702 4.16666666666667e+00 1413 1703 4.16666666666667e+00 1413 1696 4.16666666666667e+00 1413 1695 -6.25000000000000e+00 1413 1415 -8.33333333333333e+00 1413 1412 4.16666666666667e+00 1413 1411 4.16666666666667e+00 1413 1410 -1.87500000000000e+01 1413 1426 -4.16666666666667e+00 1413 1414 -8.33333333333333e+00 1413 1679 4.16666666666667e+00 1413 1714 -4.16666666666667e+00 1413 1684 4.16666666666667e+00 1413 1427 8.33333333333333e+00 1413 1685 -8.33333333333333e+00 1413 1328 2.08333333333333e+00 1413 1715 -4.16666666666667e+00 1413 1678 4.16666666666667e+00 1413 1327 -4.16666666666667e+00 1413 1677 -1.87500000000000e+01 1413 1409 -2.08333333333333e+00 1413 1280 2.08333333333333e+00 1413 1408 4.16666666666667e+00 1413 1279 -4.16666666666667e+00 1413 1407 -6.25000000000000e+00 1413 1697 -2.08333333333333e+00 1413 1425 -1.25000000000000e+01 1414 1414 6.25000000000000e+01 1414 1701 4.16666666666667e+00 1414 1703 -8.33333333333333e+00 1414 1328 2.08333333333333e+00 1414 1696 -1.87500000000000e+01 1414 1695 4.16666666666667e+00 1414 1412 -2.08333333333333e+00 1414 1280 2.08333333333333e+00 1414 1411 -6.25000000000000e+00 1414 1410 4.16666666666667e+00 1414 1425 -4.16666666666667e+00 1414 1679 -2.08333333333333e+00 1414 1413 -8.33333333333333e+00 1414 1713 -4.16666666666667e+00 1414 1683 4.16666666666667e+00 1414 1715 -4.16666666666667e+00 1414 1685 4.16666666666667e+00 1414 1678 -6.25000000000000e+00 1414 1677 4.16666666666667e+00 1414 1326 -4.16666666666667e+00 1414 1409 4.16666666666667e+00 1414 1415 -8.33333333333333e+00 1414 1427 8.33333333333333e+00 1414 1408 -1.87500000000000e+01 1414 1697 4.16666666666667e+00 1414 1426 -1.25000000000000e+01 1414 1407 4.16666666666667e+00 1414 1278 -4.16666666666667e+00 1415 1415 6.25000000000000e+01 1415 1696 4.16666666666667e+00 1415 1702 -8.33333333333333e+00 1415 1701 4.16666666666667e+00 1415 1697 -6.25000000000000e+00 1415 1327 2.08333333333333e+00 1415 1412 -6.25000000000000e+00 1415 1411 -2.08333333333333e+00 1415 1279 2.08333333333333e+00 1415 1413 -8.33333333333333e+00 1415 1410 4.16666666666667e+00 1415 1678 -2.08333333333333e+00 1415 1677 4.16666666666667e+00 1415 1714 -4.16666666666667e+00 1415 1684 4.16666666666667e+00 1415 1425 8.33333333333333e+00 1415 1683 -8.33333333333333e+00 1415 1679 -6.25000000000000e+00 1415 1326 2.08333333333333e+00 1415 1713 -4.16666666666667e+00 1415 1409 -6.25000000000000e+00 1415 1695 -2.08333333333333e+00 1415 1427 -3.75000000000000e+01 1415 1408 4.16666666666667e+00 1415 1414 -8.33333333333333e+00 1415 1426 8.33333333333333e+00 1415 1407 -2.08333333333333e+00 1415 1278 2.08333333333333e+00 1416 1416 6.25000000000000e+01 1416 1739 -4.16666666666667e+00 1416 1732 2.08333333333333e+00 1416 1738 -4.16666666666667e+00 1416 1733 -4.16666666666667e+00 1416 1421 4.16666666666667e+00 1416 1420 4.16666666666667e+00 1416 1426 -8.33333333333333e+00 1416 1419 -1.87500000000000e+01 1416 1736 4.16666666666667e+00 1416 1424 -4.16666666666667e+00 1416 1417 -8.33333333333333e+00 1416 1423 8.33333333333333e+00 1416 1564 4.16666666666667e+00 1416 1280 4.16666666666667e+00 1416 1406 -4.16666666666667e+00 1416 1279 -2.08333333333333e+00 1416 1405 2.08333333333333e+00 1416 1278 -6.25000000000000e+00 1416 1422 -1.25000000000000e+01 1416 1418 -8.33333333333333e+00 1416 1331 4.16666666666667e+00 1416 1565 4.16666666666667e+00 1416 1330 -2.08333333333333e+00 1416 1735 4.16666666666667e+00 1416 1427 4.16666666666667e+00 1416 1329 -6.25000000000000e+00 1416 1563 -1.87500000000000e+01 1417 1417 6.25000000000000e+01 1417 1737 -4.16666666666667e+00 1417 1733 2.08333333333333e+00 1417 1739 -4.16666666666667e+00 1417 1421 -2.08333333333333e+00 1417 1427 4.16666666666667e+00 1417 1420 -6.25000000000000e+00 1417 1419 4.16666666666667e+00 1417 1425 -8.33333333333333e+00 1417 1406 2.08333333333333e+00 1417 1565 -2.08333333333333e+00 1417 1416 -8.33333333333333e+00 1417 1422 8.33333333333333e+00 1417 1563 4.16666666666667e+00 1417 1280 4.16666666666667e+00 1417 1418 -8.33333333333333e+00 1417 1424 8.33333333333333e+00 1417 1279 -6.25000000000000e+00 1417 1423 -3.75000000000000e+01 1417 1278 -2.08333333333333e+00 1417 1404 2.08333333333333e+00 1417 1331 4.16666666666667e+00 1417 1736 -8.33333333333333e+00 1417 1731 2.08333333333333e+00 1417 1330 -6.25000000000000e+00 1417 1564 -6.25000000000000e+00 1417 1329 -2.08333333333333e+00 1417 1734 4.16666666666667e+00 1418 1418 6.25000000000000e+01 1418 1737 -4.16666666666667e+00 1418 1732 2.08333333333333e+00 1418 1738 -4.16666666666667e+00 1418 1731 -4.16666666666667e+00 1418 1421 -6.25000000000000e+00 1418 1420 -2.08333333333333e+00 1418 1426 4.16666666666667e+00 1418 1419 4.16666666666667e+00 1418 1734 4.16666666666667e+00 1418 1422 -4.16666666666667e+00 1418 1405 2.08333333333333e+00 1418 1564 -2.08333333333333e+00 1418 1280 -1.87500000000000e+01 1418 1424 -1.25000000000000e+01 1418 1279 4.16666666666667e+00 1418 1417 -8.33333333333333e+00 1418 1423 8.33333333333333e+00 1418 1278 4.16666666666667e+00 1418 1404 -4.16666666666667e+00 1418 1425 4.16666666666667e+00 1418 1331 -1.87500000000000e+01 1418 1565 -6.25000000000000e+00 1418 1330 4.16666666666667e+00 1418 1735 -8.33333333333333e+00 1418 1416 -8.33333333333333e+00 1418 1329 4.16666666666667e+00 1418 1563 4.16666666666667e+00 1419 1419 6.25000000000000e+01 1419 1685 4.16666666666667e+00 1419 1684 -8.33333333333333e+00 1419 1682 4.16666666666667e+00 1419 1333 2.08333333333333e+00 1419 1680 -1.87500000000000e+01 1419 1409 4.16666666666667e+00 1419 1408 -2.08333333333333e+00 1419 1279 2.08333333333333e+00 1419 1407 -6.25000000000000e+00 1419 1427 -4.16666666666667e+00 1419 1421 -8.33333333333333e+00 1419 1732 -2.08333333333333e+00 1419 1751 -4.16666666666667e+00 1419 1739 4.16666666666667e+00 1419 1750 -4.16666666666667e+00 1419 1738 4.16666666666667e+00 1419 1733 4.16666666666667e+00 1419 1334 -4.16666666666667e+00 1419 1731 -6.25000000000000e+00 1419 1418 4.16666666666667e+00 1419 1280 -4.16666666666667e+00 1419 1417 4.16666666666667e+00 1419 1420 -8.33333333333333e+00 1419 1426 8.33333333333333e+00 1419 1416 -1.87500000000000e+01 1419 1681 4.16666666666667e+00 1419 1425 -1.25000000000000e+01 1420 1420 6.25000000000000e+01 1420 1685 4.16666666666667e+00 1420 1680 4.16666666666667e+00 1420 1683 -8.33333333333333e+00 1420 1681 -6.25000000000000e+00 1420 1332 2.08333333333333e+00 1420 1409 4.16666666666667e+00 1420 1421 -8.33333333333333e+00 1420 1408 -6.25000000000000e+00 1420 1407 -2.08333333333333e+00 1420 1278 2.08333333333333e+00 1420 1731 -2.08333333333333e+00 1420 1733 4.16666666666667e+00 1420 1427 8.33333333333333e+00 1420 1739 -8.33333333333333e+00 1420 1749 -4.16666666666667e+00 1420 1737 4.16666666666667e+00 1420 1334 2.08333333333333e+00 1420 1751 -4.16666666666667e+00 1420 1732 -6.25000000000000e+00 1420 1418 -2.08333333333333e+00 1420 1280 2.08333333333333e+00 1420 1417 -6.25000000000000e+00 1420 1682 -2.08333333333333e+00 1420 1426 -3.75000000000000e+01 1420 1416 4.16666666666667e+00 1420 1419 -8.33333333333333e+00 1420 1425 8.33333333333333e+00 1421 1421 6.25000000000000e+01 1421 1684 4.16666666666667e+00 1421 1683 4.16666666666667e+00 1421 1682 -6.25000000000000e+00 1421 1680 4.16666666666667e+00 1421 1409 -1.87500000000000e+01 1421 1408 4.16666666666667e+00 1421 1420 -8.33333333333333e+00 1421 1407 4.16666666666667e+00 1421 1425 -4.16666666666667e+00 1421 1419 -8.33333333333333e+00 1421 1732 4.16666666666667e+00 1421 1749 -4.16666666666667e+00 1421 1737 4.16666666666667e+00 1421 1426 8.33333333333333e+00 1421 1738 -8.33333333333333e+00 1421 1733 -1.87500000000000e+01 1421 1333 2.08333333333333e+00 1421 1750 -4.16666666666667e+00 1421 1731 4.16666666666667e+00 1421 1332 -4.16666666666667e+00 1421 1418 -6.25000000000000e+00 1421 1681 -2.08333333333333e+00 1421 1427 -1.25000000000000e+01 1421 1417 -2.08333333333333e+00 1421 1279 2.08333333333333e+00 1421 1416 4.16666666666667e+00 1421 1278 -4.16666666666667e+00 1422 1422 1.25000000000000e+02 1422 1702 -8.33333333333333e+00 1422 1427 8.33333333333333e+00 1422 1739 -8.33333333333333e+00 1422 1768 -4.16666666666667e+00 1422 1738 4.16666666666667e+00 1422 1769 -4.16666666666667e+00 1422 1426 8.33333333333333e+00 1422 1425 -3.75000000000000e+01 1422 1412 8.33333333333333e+00 1422 1561 4.16666666666667e+00 1422 1411 -4.16666666666667e+00 1422 1562 -8.33333333333333e+00 1422 1280 4.16666666666667e+00 1422 1410 -1.25000000000000e+01 1422 1700 -4.16666666666667e+00 1422 1337 4.16666666666667e+00 1422 1423 -1.66666666666667e+01 1422 1699 8.33333333333333e+00 1422 1698 -1.25000000000000e+01 1422 1418 -4.16666666666667e+00 1422 1417 8.33333333333333e+00 1422 1406 -4.16666666666667e+00 1422 1565 4.16666666666667e+00 1422 1567 8.33333333333333e+00 1422 1564 -8.33333333333333e+00 1422 1279 4.16666666666667e+00 1422 1405 -4.16666666666667e+00 1422 1416 -1.25000000000000e+01 1422 1424 -1.66666666666667e+01 1422 1736 8.33333333333333e+00 1422 1568 8.33333333333333e+00 1422 1735 -4.16666666666667e+00 1422 1336 4.16666666666667e+00 1422 1703 4.16666666666667e+00 1422 1734 -1.25000000000000e+01 1422 1566 -3.75000000000000e+01 1423 1423 1.25000000000000e+02 1423 1701 -8.33333333333333e+00 1423 1427 -4.16666666666667e+00 1423 1769 -4.16666666666667e+00 1423 1739 4.16666666666667e+00 1423 1767 -4.16666666666667e+00 1423 1737 4.16666666666667e+00 1423 1426 -1.25000000000000e+01 1423 1425 8.33333333333333e+00 1423 1560 4.16666666666667e+00 1423 1410 -4.16666666666667e+00 1423 1562 4.16666666666667e+00 1423 1412 8.33333333333333e+00 1423 1411 -1.25000000000000e+01 1423 1700 8.33333333333333e+00 1423 1699 -3.75000000000000e+01 1423 1422 -1.66666666666667e+01 1423 1698 8.33333333333333e+00 1423 1568 -4.16666666666667e+00 1423 1424 -1.66666666666667e+01 1423 1406 -4.16666666666667e+00 1423 1565 4.16666666666667e+00 1423 1416 8.33333333333333e+00 1423 1566 8.33333333333333e+00 1423 1563 -8.33333333333333e+00 1423 1280 -8.33333333333333e+00 1423 1418 8.33333333333333e+00 1423 1417 -3.75000000000000e+01 1423 1278 4.16666666666667e+00 1423 1404 -4.16666666666667e+00 1423 1736 8.33333333333333e+00 1423 1337 -8.33333333333333e+00 1423 1703 4.16666666666667e+00 1423 1735 -1.25000000000000e+01 1423 1567 -1.25000000000000e+01 1423 1734 -4.16666666666667e+00 1423 1335 4.16666666666667e+00 1424 1424 1.25000000000000e+02 1424 1702 4.16666666666667e+00 1424 1426 -4.16666666666667e+00 1424 1768 -4.16666666666667e+00 1424 1738 4.16666666666667e+00 1424 1425 8.33333333333333e+00 1424 1737 -8.33333333333333e+00 1424 1767 -4.16666666666667e+00 1424 1427 -1.25000000000000e+01 1424 1410 8.33333333333333e+00 1424 1561 4.16666666666667e+00 1424 1560 -8.33333333333333e+00 1424 1412 -3.75000000000000e+01 1424 1411 8.33333333333333e+00 1424 1278 4.16666666666667e+00 1424 1700 -1.25000000000000e+01 1424 1699 8.33333333333333e+00 1424 1698 -4.16666666666667e+00 1424 1335 4.16666666666667e+00 1424 1567 -4.16666666666667e+00 1424 1423 -1.66666666666667e+01 1424 1416 -4.16666666666667e+00 1424 1405 -4.16666666666667e+00 1424 1564 4.16666666666667e+00 1424 1404 -4.16666666666667e+00 1424 1563 4.16666666666667e+00 1424 1418 -1.25000000000000e+01 1424 1279 -8.33333333333333e+00 1424 1417 8.33333333333333e+00 1424 1701 4.16666666666667e+00 1424 1736 -3.75000000000000e+01 1424 1568 -1.25000000000000e+01 1424 1735 8.33333333333333e+00 1424 1336 -8.33333333333333e+00 1424 1422 -1.66666666666667e+01 1424 1734 8.33333333333333e+00 1424 1566 8.33333333333333e+00 1425 1425 1.25000000000000e+02 1425 1702 8.33333333333333e+00 1425 1701 -1.25000000000000e+01 1425 1412 -8.33333333333333e+00 1425 1411 4.16666666666667e+00 1425 1424 8.33333333333333e+00 1425 1768 4.16666666666667e+00 1425 1423 8.33333333333333e+00 1425 1422 -3.75000000000000e+01 1425 1769 4.16666666666667e+00 1425 1414 -4.16666666666667e+00 1425 1415 8.33333333333333e+00 1425 1427 -1.66666666666667e+01 1425 1280 -4.16666666666667e+00 1425 1413 -1.25000000000000e+01 1425 1715 4.16666666666667e+00 1425 1340 -4.16666666666667e+00 1425 1714 -8.33333333333333e+00 1425 1409 4.16666666666667e+00 1425 1684 8.33333333333333e+00 1425 1426 -1.66666666666667e+01 1425 1685 8.33333333333333e+00 1425 1339 -4.16666666666667e+00 1425 1683 -3.75000000000000e+01 1425 1408 4.16666666666667e+00 1425 1279 -4.16666666666667e+00 1425 1421 -4.16666666666667e+00 1425 1418 4.16666666666667e+00 1425 1750 4.16666666666667e+00 1425 1738 -4.16666666666667e+00 1425 1417 -8.33333333333333e+00 1425 1420 8.33333333333333e+00 1425 1419 -1.25000000000000e+01 1425 1739 8.33333333333333e+00 1425 1751 -8.33333333333333e+00 1425 1737 -1.25000000000000e+01 1425 1703 -4.16666666666667e+00 1426 1426 1.25000000000000e+02 1426 1701 8.33333333333333e+00 1426 1703 8.33333333333333e+00 1426 1702 -3.75000000000000e+01 1426 1410 4.16666666666667e+00 1426 1424 -4.16666666666667e+00 1426 1767 4.16666666666667e+00 1426 1423 -1.25000000000000e+01 1426 1422 8.33333333333333e+00 1426 1769 -8.33333333333333e+00 1426 1413 -4.16666666666667e+00 1426 1715 4.16666666666667e+00 1426 1415 8.33333333333333e+00 1426 1414 -1.25000000000000e+01 1426 1713 -8.33333333333333e+00 1426 1685 -4.16666666666667e+00 1426 1683 8.33333333333333e+00 1426 1425 -1.66666666666667e+01 1426 1684 -1.25000000000000e+01 1426 1338 -4.16666666666667e+00 1426 1409 -8.33333333333333e+00 1426 1407 4.16666666666667e+00 1426 1278 -4.16666666666667e+00 1426 1421 8.33333333333333e+00 1426 1427 -1.66666666666667e+01 1426 1739 8.33333333333333e+00 1426 1749 4.16666666666667e+00 1426 1737 -4.16666666666667e+00 1426 1418 4.16666666666667e+00 1426 1280 -4.16666666666667e+00 1426 1420 -3.75000000000000e+01 1426 1416 -8.33333333333333e+00 1426 1419 8.33333333333333e+00 1426 1751 4.16666666666667e+00 1426 1340 -4.16666666666667e+00 1426 1738 -1.25000000000000e+01 1426 1412 4.16666666666667e+00 1427 1427 1.25000000000000e+02 1427 1411 4.16666666666667e+00 1427 1703 -1.25000000000000e+01 1427 1702 8.33333333333333e+00 1427 1410 -8.33333333333333e+00 1427 1423 -4.16666666666667e+00 1427 1422 8.33333333333333e+00 1427 1424 -1.25000000000000e+01 1427 1768 -8.33333333333333e+00 1427 1767 4.16666666666667e+00 1427 1714 4.16666666666667e+00 1427 1413 8.33333333333333e+00 1427 1425 -1.66666666666667e+01 1427 1415 -3.75000000000000e+01 1427 1414 8.33333333333333e+00 1427 1278 -4.16666666666667e+00 1427 1713 4.16666666666667e+00 1427 1338 -4.16666666666667e+00 1427 1684 -4.16666666666667e+00 1427 1407 4.16666666666667e+00 1427 1685 -1.25000000000000e+01 1427 1683 8.33333333333333e+00 1427 1408 -8.33333333333333e+00 1427 1419 -4.16666666666667e+00 1427 1416 4.16666666666667e+00 1427 1420 8.33333333333333e+00 1427 1426 -1.66666666666667e+01 1427 1738 8.33333333333333e+00 1427 1421 -1.25000000000000e+01 1427 1417 4.16666666666667e+00 1427 1279 -4.16666666666667e+00 1427 1739 -3.75000000000000e+01 1427 1701 -4.16666666666667e+00 1427 1750 4.16666666666667e+00 1427 1339 -4.16666666666667e+00 1427 1737 8.33333333333333e+00 1427 1749 -8.33333333333333e+00 1428 1428 3.75000000000000e+01 1428 1688 -2.08333333333333e+00 1428 1429 -4.16666666666667e+00 1428 1687 4.16666666666667e+00 1428 1321 2.08333333333333e+00 1428 1686 -6.25000000000000e+00 1428 1694 4.16666666666667e+00 1428 1430 -4.16666666666667e+00 1428 1691 4.16666666666667e+00 1428 1322 2.08333333333333e+00 1428 1690 -2.08333333333333e+00 1428 1693 4.16666666666667e+00 1428 1689 -6.25000000000000e+00 1428 1320 -1.25000000000000e+01 1428 1 2.08333333333333e+00 1428 139 -4.16666666666667e+00 1428 152 -4.16666666666667e+00 1428 2 2.08333333333333e+00 1428 146 -4.16666666666667e+00 1428 145 2.08333333333333e+00 1428 151 -4.16666666666667e+00 1428 0 -1.25000000000000e+01 1428 140 2.08333333333333e+00 1429 1429 3.33333333333333e+01 1429 1688 4.16666666666667e+00 1429 1687 -1.87500000000000e+01 1429 1428 -4.16666666666667e+00 1429 1686 4.16666666666667e+00 1429 1320 2.08333333333333e+00 1429 1691 4.16666666666667e+00 1429 1694 -8.33333333333333e+00 1429 1690 -6.25000000000000e+00 1429 1321 -4.16666666666667e+00 1429 1689 -2.08333333333333e+00 1429 1692 4.16666666666667e+00 1429 0 2.08333333333333e+00 1429 138 -4.16666666666667e+00 1429 146 2.08333333333333e+00 1429 152 -4.16666666666667e+00 1429 1 -4.16666666666667e+00 1429 144 2.08333333333333e+00 1429 150 -4.16666666666667e+00 1429 140 2.08333333333333e+00 1430 1430 3.33333333333333e+01 1430 1688 -6.25000000000000e+00 1430 1687 4.16666666666667e+00 1430 1686 -2.08333333333333e+00 1430 1692 4.16666666666667e+00 1430 1691 -1.87500000000000e+01 1430 1322 -4.16666666666667e+00 1430 1690 4.16666666666667e+00 1430 1693 -8.33333333333333e+00 1430 1428 -4.16666666666667e+00 1430 1689 4.16666666666667e+00 1430 1320 2.08333333333333e+00 1430 138 2.08333333333333e+00 1430 145 2.08333333333333e+00 1430 151 -4.16666666666667e+00 1430 150 -4.16666666666667e+00 1430 2 -4.16666666666667e+00 1430 0 2.08333333333333e+00 1430 144 -4.16666666666667e+00 1430 139 2.08333333333333e+00 1431 1431 6.25000000000000e+01 1431 1433 -8.33333333333333e+00 1431 1583 8.33333333333333e+00 1431 1438 4.16666666666667e+00 1431 1582 -4.16666666666667e+00 1431 1304 -2.08333333333333e+00 1431 1303 4.16666666666667e+00 1431 1302 -6.25000000000000e+00 1431 1581 -1.25000000000000e+01 1431 1283 -2.08333333333333e+00 1431 1439 4.16666666666667e+00 1431 1432 -8.33333333333333e+00 1431 1282 4.16666666666667e+00 1431 1281 -6.25000000000000e+00 1431 1435 -4.16666666666667e+00 1431 1580 4.16666666666667e+00 1431 1579 4.16666666666667e+00 1431 1578 -1.87500000000000e+01 1431 1442 -4.16666666666667e+00 1431 1441 -4.16666666666667e+00 1431 1586 -8.33333333333333e+00 1431 1585 4.16666666666667e+00 1431 1436 2.08333333333333e+00 1431 2318 2.08333333333333e+00 1431 2317 -4.16666666666667e+00 1431 2062 4.16666666666667e+00 1431 2063 4.16666666666667e+00 1431 2061 -1.87500000000000e+01 1432 1432 6.25000000000000e+01 1432 1437 4.16666666666667e+00 1432 1581 -4.16666666666667e+00 1432 1304 4.16666666666667e+00 1432 1433 -8.33333333333333e+00 1432 1583 8.33333333333333e+00 1432 1303 -1.87500000000000e+01 1432 1582 -1.25000000000000e+01 1432 1302 4.16666666666667e+00 1432 1283 4.16666666666667e+00 1432 1439 -8.33333333333333e+00 1432 1282 -1.87500000000000e+01 1432 1431 -8.33333333333333e+00 1432 1281 4.16666666666667e+00 1432 1434 -4.16666666666667e+00 1432 1580 -2.08333333333333e+00 1432 1579 -6.25000000000000e+00 1432 1578 4.16666666666667e+00 1432 1442 -4.16666666666667e+00 1432 1586 4.16666666666667e+00 1432 1440 -4.16666666666667e+00 1432 1436 2.08333333333333e+00 1432 1584 4.16666666666667e+00 1432 2318 2.08333333333333e+00 1432 2316 -4.16666666666667e+00 1432 2063 -2.08333333333333e+00 1432 2062 -6.25000000000000e+00 1432 2061 4.16666666666667e+00 1433 1433 6.25000000000000e+01 1433 1431 -8.33333333333333e+00 1433 1581 8.33333333333333e+00 1433 1304 -6.25000000000000e+00 1433 1583 -3.75000000000000e+01 1433 1303 4.16666666666667e+00 1433 1432 -8.33333333333333e+00 1433 1582 8.33333333333333e+00 1433 1302 -2.08333333333333e+00 1433 1283 -6.25000000000000e+00 1433 1282 4.16666666666667e+00 1433 1438 -8.33333333333333e+00 1433 1281 -2.08333333333333e+00 1433 1437 4.16666666666667e+00 1433 1435 2.08333333333333e+00 1433 1580 -6.25000000000000e+00 1433 1579 -2.08333333333333e+00 1433 1578 4.16666666666667e+00 1433 1440 -4.16666666666667e+00 1433 1441 -4.16666666666667e+00 1433 1585 4.16666666666667e+00 1433 1434 2.08333333333333e+00 1433 1584 -8.33333333333333e+00 1433 2317 2.08333333333333e+00 1433 2061 4.16666666666667e+00 1433 2316 2.08333333333333e+00 1433 2062 -2.08333333333333e+00 1433 2063 -6.25000000000000e+00 1434 1434 2.50000000000000e+01 1434 1580 -2.08333333333333e+00 1434 1804 2.08333333333333e+00 1434 1441 -2.08333333333333e+00 1434 1343 2.08333333333333e+00 1434 1805 -4.16666666666667e+00 1434 1342 2.08333333333333e+00 1434 1435 -4.16666666666667e+00 1434 1579 4.16666666666667e+00 1434 1341 -6.25000000000000e+00 1434 1578 -6.25000000000000e+00 1434 1436 -4.16666666666667e+00 1434 1283 2.08333333333333e+00 1434 1442 4.16666666666667e+00 1434 1282 2.08333333333333e+00 1434 1432 -4.16666666666667e+00 1434 1433 2.08333333333333e+00 1434 1281 -6.25000000000000e+00 1434 1440 -6.25000000000000e+00 1435 1435 2.91666666666667e+01 1435 1580 4.16666666666667e+00 1435 1442 4.16666666666667e+00 1435 1803 2.08333333333333e+00 1435 1440 -2.08333333333333e+00 1435 1343 -2.08333333333333e+00 1435 1805 2.08333333333333e+00 1435 1342 -2.08333333333333e+00 1435 1579 -1.87500000000000e+01 1435 1341 2.08333333333333e+00 1435 1434 -4.16666666666667e+00 1435 1578 4.16666666666667e+00 1435 1283 -2.08333333333333e+00 1435 1433 2.08333333333333e+00 1435 1436 -8.33333333333333e+00 1435 1282 -2.08333333333333e+00 1435 1441 -6.25000000000000e+00 1435 1281 2.08333333333333e+00 1435 1431 -4.16666666666667e+00 1436 1436 2.91666666666667e+01 1436 1578 -2.08333333333333e+00 1436 1435 -8.33333333333333e+00 1436 1579 4.16666666666667e+00 1436 1441 4.16666666666667e+00 1436 1343 -2.08333333333333e+00 1436 1580 -6.25000000000000e+00 1436 1342 -2.08333333333333e+00 1436 1804 2.08333333333333e+00 1436 1341 2.08333333333333e+00 1436 1803 -4.16666666666667e+00 1436 1431 2.08333333333333e+00 1436 1283 -2.08333333333333e+00 1436 1442 -1.87500000000000e+01 1436 1282 -2.08333333333333e+00 1436 1432 2.08333333333333e+00 1436 1434 -4.16666666666667e+00 1436 1281 2.08333333333333e+00 1436 1440 4.16666666666667e+00 1437 1437 6.25000000000000e+01 1437 1283 4.16666666666667e+00 1437 1439 -8.33333333333333e+00 1437 1346 4.16666666666667e+00 1437 1432 4.16666666666667e+00 1437 1433 4.16666666666667e+00 1437 1281 -6.25000000000000e+00 1437 1583 -4.16666666666667e+00 1437 1582 8.33333333333333e+00 1437 1581 -1.25000000000000e+01 1437 1344 -6.25000000000000e+00 1437 1441 4.16666666666667e+00 1437 1438 -8.33333333333333e+00 1437 1811 -4.16666666666667e+00 1437 1345 -2.08333333333333e+00 1437 1810 2.08333333333333e+00 1437 1442 4.16666666666667e+00 1437 1282 -2.08333333333333e+00 1437 1440 -1.87500000000000e+01 1437 2066 -4.16666666666667e+00 1437 2426 4.16666666666667e+00 1437 2425 4.16666666666667e+00 1437 2424 -1.87500000000000e+01 1437 2062 -4.16666666666667e+00 1437 2063 -4.16666666666667e+00 1437 2330 4.16666666666667e+00 1437 2329 -8.33333333333333e+00 1437 2065 2.08333333333333e+00 1438 1438 6.25000000000000e+01 1438 1431 4.16666666666667e+00 1438 1433 -8.33333333333333e+00 1438 1283 4.16666666666667e+00 1438 1282 -6.25000000000000e+00 1438 1583 8.33333333333333e+00 1438 1439 -8.33333333333333e+00 1438 1346 4.16666666666667e+00 1438 1582 -3.75000000000000e+01 1438 1345 -6.25000000000000e+00 1438 1581 8.33333333333333e+00 1438 1811 2.08333333333333e+00 1438 1440 4.16666666666667e+00 1438 1437 -8.33333333333333e+00 1438 1344 -2.08333333333333e+00 1438 1809 2.08333333333333e+00 1438 1442 -2.08333333333333e+00 1438 1441 -6.25000000000000e+00 1438 1281 -2.08333333333333e+00 1438 2066 2.08333333333333e+00 1438 2426 -2.08333333333333e+00 1438 2425 -6.25000000000000e+00 1438 2424 4.16666666666667e+00 1438 2061 -4.16666666666667e+00 1438 2063 -4.16666666666667e+00 1438 2330 4.16666666666667e+00 1438 2064 2.08333333333333e+00 1438 2328 -8.33333333333333e+00 1439 1439 6.25000000000000e+01 1439 1281 4.16666666666667e+00 1439 1437 -8.33333333333333e+00 1439 1344 4.16666666666667e+00 1439 1283 -1.87500000000000e+01 1439 1432 -8.33333333333333e+00 1439 1282 4.16666666666667e+00 1439 1431 4.16666666666667e+00 1439 1583 -1.25000000000000e+01 1439 1346 -1.87500000000000e+01 1439 1582 8.33333333333333e+00 1439 1438 -8.33333333333333e+00 1439 1345 4.16666666666667e+00 1439 1581 -4.16666666666667e+00 1439 1810 2.08333333333333e+00 1439 1809 -4.16666666666667e+00 1439 1441 -2.08333333333333e+00 1439 1442 -6.25000000000000e+00 1439 1440 4.16666666666667e+00 1439 2064 -4.16666666666667e+00 1439 2426 -6.25000000000000e+00 1439 2425 -2.08333333333333e+00 1439 2424 4.16666666666667e+00 1439 2062 -4.16666666666667e+00 1439 2329 4.16666666666667e+00 1439 2061 -4.16666666666667e+00 1439 2065 2.08333333333333e+00 1439 2328 4.16666666666667e+00 1440 1440 6.25000000000000e+01 1440 1579 4.16666666666667e+00 1440 1580 4.16666666666667e+00 1440 1436 4.16666666666667e+00 1440 1434 -6.25000000000000e+00 1440 1805 4.16666666666667e+00 1440 1804 4.16666666666667e+00 1440 1441 -8.33333333333333e+00 1440 1803 -1.87500000000000e+01 1440 1586 -4.16666666666667e+00 1440 1442 -8.33333333333333e+00 1440 1433 -4.16666666666667e+00 1440 1583 4.16666666666667e+00 1440 1438 4.16666666666667e+00 1440 1585 8.33333333333333e+00 1440 1582 -8.33333333333333e+00 1440 1439 4.16666666666667e+00 1440 1283 -4.16666666666667e+00 1440 1282 2.08333333333333e+00 1440 1432 -4.16666666666667e+00 1440 1437 -1.87500000000000e+01 1440 1811 4.16666666666667e+00 1440 1349 -4.16666666666667e+00 1440 1810 -2.08333333333333e+00 1440 1348 2.08333333333333e+00 1440 1809 -6.25000000000000e+00 1440 1435 -2.08333333333333e+00 1440 1584 -1.25000000000000e+01 1441 1441 6.25000000000000e+01 1441 1434 -2.08333333333333e+00 1441 1578 4.16666666666667e+00 1441 1580 -8.33333333333333e+00 1441 1283 2.08333333333333e+00 1441 1435 -6.25000000000000e+00 1441 1805 -2.08333333333333e+00 1441 1349 2.08333333333333e+00 1441 1804 -6.25000000000000e+00 1441 1803 4.16666666666667e+00 1441 1440 -8.33333333333333e+00 1441 1439 -2.08333333333333e+00 1441 1437 4.16666666666667e+00 1441 1433 -4.16666666666667e+00 1441 1583 4.16666666666667e+00 1441 1584 8.33333333333333e+00 1441 1581 -8.33333333333333e+00 1441 1438 -6.25000000000000e+00 1441 1281 2.08333333333333e+00 1441 1431 -4.16666666666667e+00 1441 1811 4.16666666666667e+00 1441 1442 -8.33333333333333e+00 1441 1586 8.33333333333333e+00 1441 1810 -6.25000000000000e+00 1441 1436 4.16666666666667e+00 1441 1585 -3.75000000000000e+01 1441 1809 -2.08333333333333e+00 1441 1347 2.08333333333333e+00 1442 1442 6.25000000000000e+01 1442 1579 -8.33333333333333e+00 1442 1578 4.16666666666667e+00 1442 1436 -1.87500000000000e+01 1442 1282 2.08333333333333e+00 1442 1434 4.16666666666667e+00 1442 1805 -6.25000000000000e+00 1442 1804 -2.08333333333333e+00 1442 1348 2.08333333333333e+00 1442 1803 4.16666666666667e+00 1442 1584 -4.16666666666667e+00 1442 1438 -2.08333333333333e+00 1442 1440 -8.33333333333333e+00 1442 1431 -4.16666666666667e+00 1442 1581 4.16666666666667e+00 1442 1432 -4.16666666666667e+00 1442 1582 4.16666666666667e+00 1442 1439 -6.25000000000000e+00 1442 1437 4.16666666666667e+00 1442 1281 -4.16666666666667e+00 1442 1811 -1.87500000000000e+01 1442 1435 4.16666666666667e+00 1442 1586 -1.25000000000000e+01 1442 1810 4.16666666666667e+00 1442 1441 -8.33333333333333e+00 1442 1585 8.33333333333333e+00 1442 1809 4.16666666666667e+00 1442 1347 -4.16666666666667e+00 1443 1443 6.25000000000000e+01 1443 1807 4.16666666666667e+00 1443 1808 4.16666666666667e+00 1443 1450 4.16666666666667e+00 1443 1449 -6.25000000000000e+00 1443 1445 -8.33333333333333e+00 1443 1598 4.16666666666667e+00 1443 1597 4.16666666666667e+00 1443 1596 -1.87500000000000e+01 1443 1603 -4.16666666666667e+00 1443 1444 -8.33333333333333e+00 1443 1448 4.16666666666667e+00 1443 1456 -4.16666666666667e+00 1443 1708 4.16666666666667e+00 1443 1604 8.33333333333333e+00 1443 1709 -8.33333333333333e+00 1443 1286 2.08333333333333e+00 1443 1457 -4.16666666666667e+00 1443 1447 4.16666666666667e+00 1443 1285 -4.16666666666667e+00 1443 1446 -1.87500000000000e+01 1443 1592 -2.08333333333333e+00 1443 1307 2.08333333333333e+00 1443 1591 4.16666666666667e+00 1443 1306 -4.16666666666667e+00 1443 1590 -6.25000000000000e+00 1443 1451 -2.08333333333333e+00 1443 1602 -1.25000000000000e+01 1444 1444 6.25000000000000e+01 1444 1806 4.16666666666667e+00 1444 1808 -8.33333333333333e+00 1444 1286 2.08333333333333e+00 1444 1450 -1.87500000000000e+01 1444 1449 4.16666666666667e+00 1444 1598 -2.08333333333333e+00 1444 1307 2.08333333333333e+00 1444 1597 -6.25000000000000e+00 1444 1596 4.16666666666667e+00 1444 1602 -4.16666666666667e+00 1444 1448 -2.08333333333333e+00 1444 1443 -8.33333333333333e+00 1444 1455 -4.16666666666667e+00 1444 1707 4.16666666666667e+00 1444 1457 -4.16666666666667e+00 1444 1709 4.16666666666667e+00 1444 1447 -6.25000000000000e+00 1444 1446 4.16666666666667e+00 1444 1284 -4.16666666666667e+00 1444 1592 4.16666666666667e+00 1444 1445 -8.33333333333333e+00 1444 1604 8.33333333333333e+00 1444 1591 -1.87500000000000e+01 1444 1451 4.16666666666667e+00 1444 1603 -1.25000000000000e+01 1444 1590 4.16666666666667e+00 1444 1305 -4.16666666666667e+00 1445 1445 6.25000000000000e+01 1445 1450 4.16666666666667e+00 1445 1807 -8.33333333333333e+00 1445 1806 4.16666666666667e+00 1445 1451 -6.25000000000000e+00 1445 1285 2.08333333333333e+00 1445 1598 -6.25000000000000e+00 1445 1597 -2.08333333333333e+00 1445 1306 2.08333333333333e+00 1445 1443 -8.33333333333333e+00 1445 1596 4.16666666666667e+00 1445 1447 -2.08333333333333e+00 1445 1446 4.16666666666667e+00 1445 1456 -4.16666666666667e+00 1445 1708 4.16666666666667e+00 1445 1602 8.33333333333333e+00 1445 1707 -8.33333333333333e+00 1445 1448 -6.25000000000000e+00 1445 1284 2.08333333333333e+00 1445 1455 -4.16666666666667e+00 1445 1592 -6.25000000000000e+00 1445 1449 -2.08333333333333e+00 1445 1604 -3.75000000000000e+01 1445 1591 4.16666666666667e+00 1445 1444 -8.33333333333333e+00 1445 1603 8.33333333333333e+00 1445 1590 -2.08333333333333e+00 1445 1305 2.08333333333333e+00 1446 1446 6.25000000000000e+01 1446 1453 -4.16666666666667e+00 1446 1706 4.16666666666667e+00 1446 1705 4.16666666666667e+00 1446 1704 -1.87500000000000e+01 1446 1460 -4.16666666666667e+00 1446 1459 -4.16666666666667e+00 1446 1712 -8.33333333333333e+00 1446 1711 4.16666666666667e+00 1446 1445 4.16666666666667e+00 1446 1448 -8.33333333333333e+00 1446 1709 8.33333333333333e+00 1446 1456 4.16666666666667e+00 1446 1708 -4.16666666666667e+00 1446 1325 -2.08333333333333e+00 1446 1592 2.08333333333333e+00 1446 1324 4.16666666666667e+00 1446 1591 -4.16666666666667e+00 1446 1323 -6.25000000000000e+00 1446 1707 -1.25000000000000e+01 1446 1286 -2.08333333333333e+00 1446 1457 4.16666666666667e+00 1446 1447 -8.33333333333333e+00 1446 1285 4.16666666666667e+00 1446 1444 4.16666666666667e+00 1446 1454 2.08333333333333e+00 1446 1284 -6.25000000000000e+00 1446 1443 -1.87500000000000e+01 1447 1447 6.25000000000000e+01 1447 1452 -4.16666666666667e+00 1447 1706 -2.08333333333333e+00 1447 1705 -6.25000000000000e+00 1447 1704 4.16666666666667e+00 1447 1460 -4.16666666666667e+00 1447 1712 4.16666666666667e+00 1447 1458 -4.16666666666667e+00 1447 1710 4.16666666666667e+00 1447 1445 -2.08333333333333e+00 1447 1592 2.08333333333333e+00 1447 1455 4.16666666666667e+00 1447 1707 -4.16666666666667e+00 1447 1325 4.16666666666667e+00 1447 1448 -8.33333333333333e+00 1447 1709 8.33333333333333e+00 1447 1324 -1.87500000000000e+01 1447 1708 -1.25000000000000e+01 1447 1323 4.16666666666667e+00 1447 1590 -4.16666666666667e+00 1447 1286 4.16666666666667e+00 1447 1457 -8.33333333333333e+00 1447 1454 2.08333333333333e+00 1447 1285 -1.87500000000000e+01 1447 1444 -6.25000000000000e+00 1447 1446 -8.33333333333333e+00 1447 1284 4.16666666666667e+00 1447 1443 4.16666666666667e+00 1448 1448 6.25000000000000e+01 1448 1453 2.08333333333333e+00 1448 1706 -6.25000000000000e+00 1448 1705 -2.08333333333333e+00 1448 1704 4.16666666666667e+00 1448 1458 -4.16666666666667e+00 1448 1459 -4.16666666666667e+00 1448 1711 4.16666666666667e+00 1448 1710 -8.33333333333333e+00 1448 1444 -2.08333333333333e+00 1448 1591 2.08333333333333e+00 1448 1443 4.16666666666667e+00 1448 1446 -8.33333333333333e+00 1448 1707 8.33333333333333e+00 1448 1325 -6.25000000000000e+00 1448 1709 -3.75000000000000e+01 1448 1324 4.16666666666667e+00 1448 1447 -8.33333333333333e+00 1448 1708 8.33333333333333e+00 1448 1323 -2.08333333333333e+00 1448 1590 2.08333333333333e+00 1448 1452 2.08333333333333e+00 1448 1286 -6.25000000000000e+00 1448 1445 -6.25000000000000e+00 1448 1285 4.16666666666667e+00 1448 1456 -8.33333333333333e+00 1448 1284 -2.08333333333333e+00 1448 1455 4.16666666666667e+00 1449 1449 2.50000000000000e+01 1449 1445 -2.08333333333333e+00 1449 1456 2.08333333333333e+00 1449 1807 -2.08333333333333e+00 1449 1286 2.08333333333333e+00 1449 1457 -4.16666666666667e+00 1449 1285 2.08333333333333e+00 1449 1450 -4.16666666666667e+00 1449 1444 4.16666666666667e+00 1449 1284 -6.25000000000000e+00 1449 1443 -6.25000000000000e+00 1449 1451 -4.16666666666667e+00 1449 1343 2.08333333333333e+00 1449 1808 4.16666666666667e+00 1449 1342 2.08333333333333e+00 1449 1597 -4.16666666666667e+00 1449 1598 2.08333333333333e+00 1449 1341 -6.25000000000000e+00 1449 1806 -6.25000000000000e+00 1450 1450 2.91666666666667e+01 1450 1445 4.16666666666667e+00 1450 1808 4.16666666666667e+00 1450 1455 2.08333333333333e+00 1450 1806 -2.08333333333333e+00 1450 1286 -2.08333333333333e+00 1450 1457 2.08333333333333e+00 1450 1285 -2.08333333333333e+00 1450 1444 -1.87500000000000e+01 1450 1284 2.08333333333333e+00 1450 1449 -4.16666666666667e+00 1450 1443 4.16666666666667e+00 1450 1343 -2.08333333333333e+00 1450 1598 2.08333333333333e+00 1450 1451 -8.33333333333333e+00 1450 1342 -2.08333333333333e+00 1450 1807 -6.25000000000000e+00 1450 1341 2.08333333333333e+00 1450 1596 -4.16666666666667e+00 1451 1451 2.91666666666667e+01 1451 1443 -2.08333333333333e+00 1451 1450 -8.33333333333333e+00 1451 1444 4.16666666666667e+00 1451 1807 4.16666666666667e+00 1451 1286 -2.08333333333333e+00 1451 1445 -6.25000000000000e+00 1451 1285 -2.08333333333333e+00 1451 1456 2.08333333333333e+00 1451 1284 2.08333333333333e+00 1451 1455 -4.16666666666667e+00 1451 1596 2.08333333333333e+00 1451 1343 -2.08333333333333e+00 1451 1808 -1.87500000000000e+01 1451 1342 -2.08333333333333e+00 1451 1597 2.08333333333333e+00 1451 1449 -4.16666666666667e+00 1451 1341 2.08333333333333e+00 1451 1806 4.16666666666667e+00 1452 1452 2.50000000000000e+01 1452 1706 -2.08333333333333e+00 1452 1822 2.08333333333333e+00 1452 1459 -2.08333333333333e+00 1452 1352 2.08333333333333e+00 1452 1823 -4.16666666666667e+00 1452 1351 2.08333333333333e+00 1452 1453 -4.16666666666667e+00 1452 1705 4.16666666666667e+00 1452 1350 -6.25000000000000e+00 1452 1704 -6.25000000000000e+00 1452 1454 -4.16666666666667e+00 1452 1286 2.08333333333333e+00 1452 1460 4.16666666666667e+00 1452 1285 2.08333333333333e+00 1452 1447 -4.16666666666667e+00 1452 1448 2.08333333333333e+00 1452 1284 -6.25000000000000e+00 1452 1458 -6.25000000000000e+00 1453 1453 2.91666666666667e+01 1453 1706 4.16666666666667e+00 1453 1460 4.16666666666667e+00 1453 1821 2.08333333333333e+00 1453 1458 -2.08333333333333e+00 1453 1352 -2.08333333333333e+00 1453 1823 2.08333333333333e+00 1453 1351 -2.08333333333333e+00 1453 1705 -1.87500000000000e+01 1453 1350 2.08333333333333e+00 1453 1452 -4.16666666666667e+00 1453 1704 4.16666666666667e+00 1453 1286 -2.08333333333333e+00 1453 1448 2.08333333333333e+00 1453 1454 -8.33333333333333e+00 1453 1285 -2.08333333333333e+00 1453 1459 -6.25000000000000e+00 1453 1284 2.08333333333333e+00 1453 1446 -4.16666666666667e+00 1454 1454 2.91666666666667e+01 1454 1704 -2.08333333333333e+00 1454 1453 -8.33333333333333e+00 1454 1705 4.16666666666667e+00 1454 1459 4.16666666666667e+00 1454 1352 -2.08333333333333e+00 1454 1706 -6.25000000000000e+00 1454 1351 -2.08333333333333e+00 1454 1822 2.08333333333333e+00 1454 1350 2.08333333333333e+00 1454 1821 -4.16666666666667e+00 1454 1446 2.08333333333333e+00 1454 1286 -2.08333333333333e+00 1454 1460 -1.87500000000000e+01 1454 1285 -2.08333333333333e+00 1454 1447 2.08333333333333e+00 1454 1452 -4.16666666666667e+00 1454 1284 2.08333333333333e+00 1454 1458 4.16666666666667e+00 1455 1455 6.25000000000000e+01 1455 1456 -8.33333333333333e+00 1455 1829 -4.16666666666667e+00 1455 1354 -2.08333333333333e+00 1455 1828 2.08333333333333e+00 1455 1460 4.16666666666667e+00 1455 1285 -2.08333333333333e+00 1455 1458 -1.87500000000000e+01 1455 1450 2.08333333333333e+00 1455 1286 4.16666666666667e+00 1455 1451 -4.16666666666667e+00 1455 1457 -8.33333333333333e+00 1455 1808 4.16666666666667e+00 1455 1355 4.16666666666667e+00 1455 1807 4.16666666666667e+00 1455 1806 -1.87500000000000e+01 1455 1444 -4.16666666666667e+00 1455 1447 4.16666666666667e+00 1455 1448 4.16666666666667e+00 1455 1445 -4.16666666666667e+00 1455 1284 -6.25000000000000e+00 1455 1709 -4.16666666666667e+00 1455 1604 4.16666666666667e+00 1455 1708 8.33333333333333e+00 1455 1603 -8.33333333333333e+00 1455 1707 -1.25000000000000e+01 1455 1459 4.16666666666667e+00 1455 1353 -6.25000000000000e+00 1456 1456 6.25000000000000e+01 1456 1829 2.08333333333333e+00 1456 1458 4.16666666666667e+00 1456 1455 -8.33333333333333e+00 1456 1353 -2.08333333333333e+00 1456 1827 2.08333333333333e+00 1456 1459 -6.25000000000000e+00 1456 1284 -2.08333333333333e+00 1456 1449 2.08333333333333e+00 1456 1451 2.08333333333333e+00 1456 1808 -2.08333333333333e+00 1456 1807 -6.25000000000000e+00 1456 1806 4.16666666666667e+00 1456 1443 -4.16666666666667e+00 1456 1446 4.16666666666667e+00 1456 1445 -4.16666666666667e+00 1456 1604 4.16666666666667e+00 1456 1448 -8.33333333333333e+00 1456 1286 4.16666666666667e+00 1456 1285 -6.25000000000000e+00 1456 1709 8.33333333333333e+00 1456 1457 -8.33333333333333e+00 1456 1355 4.16666666666667e+00 1456 1708 -3.75000000000000e+01 1456 1460 -2.08333333333333e+00 1456 1354 -6.25000000000000e+00 1456 1707 8.33333333333333e+00 1456 1602 -8.33333333333333e+00 1457 1457 6.25000000000000e+01 1457 1828 2.08333333333333e+00 1457 1827 -4.16666666666667e+00 1457 1460 -6.25000000000000e+00 1457 1458 4.16666666666667e+00 1457 1450 2.08333333333333e+00 1457 1284 4.16666666666667e+00 1457 1449 -4.16666666666667e+00 1457 1808 -6.25000000000000e+00 1457 1807 -2.08333333333333e+00 1457 1455 -8.33333333333333e+00 1457 1806 4.16666666666667e+00 1457 1353 4.16666666666667e+00 1457 1444 -4.16666666666667e+00 1457 1603 4.16666666666667e+00 1457 1286 -1.87500000000000e+01 1457 1447 -8.33333333333333e+00 1457 1285 4.16666666666667e+00 1457 1446 4.16666666666667e+00 1457 1443 -4.16666666666667e+00 1457 1709 -1.25000000000000e+01 1457 1459 -2.08333333333333e+00 1457 1355 -1.87500000000000e+01 1457 1708 8.33333333333333e+00 1457 1456 -8.33333333333333e+00 1457 1354 4.16666666666667e+00 1457 1707 -4.16666666666667e+00 1457 1602 4.16666666666667e+00 1458 1458 6.25000000000000e+01 1458 1705 4.16666666666667e+00 1458 1706 4.16666666666667e+00 1458 1454 4.16666666666667e+00 1458 1452 -6.25000000000000e+00 1458 1823 4.16666666666667e+00 1458 1822 4.16666666666667e+00 1458 1459 -8.33333333333333e+00 1458 1821 -1.87500000000000e+01 1458 1712 -4.16666666666667e+00 1458 1460 -8.33333333333333e+00 1458 1448 -4.16666666666667e+00 1458 1709 4.16666666666667e+00 1458 1456 4.16666666666667e+00 1458 1711 8.33333333333333e+00 1458 1708 -8.33333333333333e+00 1458 1457 4.16666666666667e+00 1458 1286 -4.16666666666667e+00 1458 1285 2.08333333333333e+00 1458 1447 -4.16666666666667e+00 1458 1455 -1.87500000000000e+01 1458 1829 4.16666666666667e+00 1458 1358 -4.16666666666667e+00 1458 1828 -2.08333333333333e+00 1458 1357 2.08333333333333e+00 1458 1827 -6.25000000000000e+00 1458 1453 -2.08333333333333e+00 1458 1710 -1.25000000000000e+01 1459 1459 6.25000000000000e+01 1459 1452 -2.08333333333333e+00 1459 1704 4.16666666666667e+00 1459 1706 -8.33333333333333e+00 1459 1286 2.08333333333333e+00 1459 1453 -6.25000000000000e+00 1459 1823 -2.08333333333333e+00 1459 1358 2.08333333333333e+00 1459 1822 -6.25000000000000e+00 1459 1821 4.16666666666667e+00 1459 1458 -8.33333333333333e+00 1459 1457 -2.08333333333333e+00 1459 1455 4.16666666666667e+00 1459 1448 -4.16666666666667e+00 1459 1709 4.16666666666667e+00 1459 1710 8.33333333333333e+00 1459 1707 -8.33333333333333e+00 1459 1456 -6.25000000000000e+00 1459 1284 2.08333333333333e+00 1459 1446 -4.16666666666667e+00 1459 1829 4.16666666666667e+00 1459 1460 -8.33333333333333e+00 1459 1712 8.33333333333333e+00 1459 1828 -6.25000000000000e+00 1459 1454 4.16666666666667e+00 1459 1711 -3.75000000000000e+01 1459 1827 -2.08333333333333e+00 1459 1356 2.08333333333333e+00 1460 1460 6.25000000000000e+01 1460 1705 -8.33333333333333e+00 1460 1704 4.16666666666667e+00 1460 1454 -1.87500000000000e+01 1460 1285 2.08333333333333e+00 1460 1452 4.16666666666667e+00 1460 1823 -6.25000000000000e+00 1460 1822 -2.08333333333333e+00 1460 1357 2.08333333333333e+00 1460 1821 4.16666666666667e+00 1460 1710 -4.16666666666667e+00 1460 1456 -2.08333333333333e+00 1460 1458 -8.33333333333333e+00 1460 1446 -4.16666666666667e+00 1460 1707 4.16666666666667e+00 1460 1447 -4.16666666666667e+00 1460 1708 4.16666666666667e+00 1460 1457 -6.25000000000000e+00 1460 1455 4.16666666666667e+00 1460 1284 -4.16666666666667e+00 1460 1829 -1.87500000000000e+01 1460 1453 4.16666666666667e+00 1460 1712 -1.25000000000000e+01 1460 1828 4.16666666666667e+00 1460 1459 -8.33333333333333e+00 1460 1711 8.33333333333333e+00 1460 1827 4.16666666666667e+00 1460 1356 -4.16666666666667e+00 1461 1461 6.25000000000000e+01 1461 1825 4.16666666666667e+00 1461 1826 4.16666666666667e+00 1461 1465 4.16666666666667e+00 1461 1464 -6.25000000000000e+00 1461 1463 -8.33333333333333e+00 1461 1724 4.16666666666667e+00 1461 1723 4.16666666666667e+00 1461 1722 -1.87500000000000e+01 1461 1729 -4.16666666666667e+00 1461 1462 -8.33333333333333e+00 1461 1730 8.33333333333333e+00 1461 1718 -2.08333333333333e+00 1461 1328 2.08333333333333e+00 1461 1717 4.16666666666667e+00 1461 1327 -4.16666666666667e+00 1461 1716 -6.25000000000000e+00 1461 1466 -2.08333333333333e+00 1461 1728 -1.25000000000000e+01 1461 194 4.16666666666667e+00 1461 199 -4.16666666666667e+00 1461 364 4.16666666666667e+00 1461 365 -8.33333333333333e+00 1461 11 2.08333333333333e+00 1461 200 -4.16666666666667e+00 1461 193 4.16666666666667e+00 1461 10 -4.16666666666667e+00 1461 192 -1.87500000000000e+01 1462 1462 6.25000000000000e+01 1462 1824 4.16666666666667e+00 1462 1826 -8.33333333333333e+00 1462 1465 -1.87500000000000e+01 1462 1464 4.16666666666667e+00 1462 1724 -2.08333333333333e+00 1462 1328 2.08333333333333e+00 1462 1723 -6.25000000000000e+00 1462 1722 4.16666666666667e+00 1462 1728 -4.16666666666667e+00 1462 1461 -8.33333333333333e+00 1462 1718 4.16666666666667e+00 1462 1463 -8.33333333333333e+00 1462 1730 8.33333333333333e+00 1462 1717 -1.87500000000000e+01 1462 1466 4.16666666666667e+00 1462 1729 -1.25000000000000e+01 1462 1716 4.16666666666667e+00 1462 1326 -4.16666666666667e+00 1462 11 2.08333333333333e+00 1462 194 -2.08333333333333e+00 1462 198 -4.16666666666667e+00 1462 363 4.16666666666667e+00 1462 200 -4.16666666666667e+00 1462 365 4.16666666666667e+00 1462 193 -6.25000000000000e+00 1462 192 4.16666666666667e+00 1462 9 -4.16666666666667e+00 1463 1463 6.25000000000000e+01 1463 1465 4.16666666666667e+00 1463 1825 -8.33333333333333e+00 1463 1824 4.16666666666667e+00 1463 1466 -6.25000000000000e+00 1463 1724 -6.25000000000000e+00 1463 1723 -2.08333333333333e+00 1463 1327 2.08333333333333e+00 1463 1461 -8.33333333333333e+00 1463 1722 4.16666666666667e+00 1463 1728 8.33333333333333e+00 1463 1718 -6.25000000000000e+00 1463 1464 -2.08333333333333e+00 1463 1730 -3.75000000000000e+01 1463 1717 4.16666666666667e+00 1463 1462 -8.33333333333333e+00 1463 1729 8.33333333333333e+00 1463 1716 -2.08333333333333e+00 1463 1326 2.08333333333333e+00 1463 10 2.08333333333333e+00 1463 193 -2.08333333333333e+00 1463 192 4.16666666666667e+00 1463 199 -4.16666666666667e+00 1463 364 4.16666666666667e+00 1463 363 -8.33333333333333e+00 1463 194 -6.25000000000000e+00 1463 9 2.08333333333333e+00 1463 198 -4.16666666666667e+00 1464 1464 2.50000000000000e+01 1464 1463 -2.08333333333333e+00 1464 1825 -2.08333333333333e+00 1464 1465 -4.16666666666667e+00 1464 1462 4.16666666666667e+00 1464 1461 -6.25000000000000e+00 1464 1466 -4.16666666666667e+00 1464 1352 2.08333333333333e+00 1464 1826 4.16666666666667e+00 1464 1351 2.08333333333333e+00 1464 1723 -4.16666666666667e+00 1464 1724 2.08333333333333e+00 1464 1350 -6.25000000000000e+00 1464 1824 -6.25000000000000e+00 1464 199 2.08333333333333e+00 1464 11 2.08333333333333e+00 1464 200 -4.16666666666667e+00 1464 10 2.08333333333333e+00 1464 9 -6.25000000000000e+00 1465 1465 2.91666666666667e+01 1465 1463 4.16666666666667e+00 1465 1826 4.16666666666667e+00 1465 1824 -2.08333333333333e+00 1465 1462 -1.87500000000000e+01 1465 1464 -4.16666666666667e+00 1465 1461 4.16666666666667e+00 1465 1352 -2.08333333333333e+00 1465 1724 2.08333333333333e+00 1465 1466 -8.33333333333333e+00 1465 1351 -2.08333333333333e+00 1465 1825 -6.25000000000000e+00 1465 1350 2.08333333333333e+00 1465 1722 -4.16666666666667e+00 1465 198 2.08333333333333e+00 1465 11 -2.08333333333333e+00 1465 200 2.08333333333333e+00 1465 10 -2.08333333333333e+00 1465 9 2.08333333333333e+00 1466 1466 2.91666666666667e+01 1466 1461 -2.08333333333333e+00 1466 1465 -8.33333333333333e+00 1466 1462 4.16666666666667e+00 1466 1825 4.16666666666667e+00 1466 1463 -6.25000000000000e+00 1466 1722 2.08333333333333e+00 1466 1352 -2.08333333333333e+00 1466 1826 -1.87500000000000e+01 1466 1351 -2.08333333333333e+00 1466 1723 2.08333333333333e+00 1466 1464 -4.16666666666667e+00 1466 1350 2.08333333333333e+00 1466 1824 4.16666666666667e+00 1466 11 -2.08333333333333e+00 1466 10 -2.08333333333333e+00 1466 199 2.08333333333333e+00 1466 9 2.08333333333333e+00 1466 198 -4.16666666666667e+00 1467 1467 6.25000000000000e+01 1467 1619 -4.16666666666667e+00 1467 1468 -8.33333333333333e+00 1467 1618 8.33333333333333e+00 1467 1310 4.16666666666667e+00 1467 1309 -2.08333333333333e+00 1467 1308 -6.25000000000000e+00 1467 1617 -1.25000000000000e+01 1467 1469 -8.33333333333333e+00 1467 1289 4.16666666666667e+00 1467 1288 -2.08333333333333e+00 1467 1474 4.16666666666667e+00 1467 1475 4.16666666666667e+00 1467 1287 -6.25000000000000e+00 1467 1622 4.16666666666667e+00 1467 1478 -4.16666666666667e+00 1467 1471 2.08333333333333e+00 1467 1477 -4.16666666666667e+00 1467 1472 -4.16666666666667e+00 1467 1616 4.16666666666667e+00 1467 1615 4.16666666666667e+00 1467 1621 -8.33333333333333e+00 1467 1614 -1.87500000000000e+01 1467 2098 4.16666666666667e+00 1467 2354 -4.16666666666667e+00 1467 2353 2.08333333333333e+00 1467 2099 4.16666666666667e+00 1467 2097 -1.87500000000000e+01 1468 1468 6.25000000000000e+01 1468 1467 -8.33333333333333e+00 1468 1617 8.33333333333333e+00 1468 1310 4.16666666666667e+00 1468 1469 -8.33333333333333e+00 1468 1619 8.33333333333333e+00 1468 1309 -6.25000000000000e+00 1468 1618 -3.75000000000000e+01 1468 1308 -2.08333333333333e+00 1468 1289 4.16666666666667e+00 1468 1475 -8.33333333333333e+00 1468 1288 -6.25000000000000e+00 1468 1287 -2.08333333333333e+00 1468 1473 4.16666666666667e+00 1468 1470 2.08333333333333e+00 1468 1476 -4.16666666666667e+00 1468 1472 2.08333333333333e+00 1468 1478 -4.16666666666667e+00 1468 1616 -2.08333333333333e+00 1468 1622 4.16666666666667e+00 1468 1615 -6.25000000000000e+00 1468 1614 4.16666666666667e+00 1468 1620 -8.33333333333333e+00 1468 2099 -2.08333333333333e+00 1468 2097 4.16666666666667e+00 1468 2352 2.08333333333333e+00 1468 2354 2.08333333333333e+00 1468 2098 -6.25000000000000e+00 1469 1469 6.25000000000000e+01 1469 1617 -4.16666666666667e+00 1469 1310 -1.87500000000000e+01 1469 1619 -1.25000000000000e+01 1469 1309 4.16666666666667e+00 1469 1468 -8.33333333333333e+00 1469 1618 8.33333333333333e+00 1469 1308 4.16666666666667e+00 1469 1473 4.16666666666667e+00 1469 1289 -1.87500000000000e+01 1469 1288 4.16666666666667e+00 1469 1474 -8.33333333333333e+00 1469 1467 -8.33333333333333e+00 1469 1287 4.16666666666667e+00 1469 1620 4.16666666666667e+00 1469 1476 -4.16666666666667e+00 1469 1471 2.08333333333333e+00 1469 1477 -4.16666666666667e+00 1469 1470 -4.16666666666667e+00 1469 1616 -6.25000000000000e+00 1469 1615 -2.08333333333333e+00 1469 1621 4.16666666666667e+00 1469 1614 4.16666666666667e+00 1469 2353 2.08333333333333e+00 1469 2098 -2.08333333333333e+00 1469 2352 -4.16666666666667e+00 1469 2099 -6.25000000000000e+00 1469 2097 4.16666666666667e+00 1470 1470 2.50000000000000e+01 1470 1468 2.08333333333333e+00 1470 1841 2.08333333333333e+00 1470 1478 -2.08333333333333e+00 1470 1289 2.08333333333333e+00 1470 1469 -4.16666666666667e+00 1470 1288 2.08333333333333e+00 1470 1471 -4.16666666666667e+00 1470 1477 4.16666666666667e+00 1470 1287 -6.25000000000000e+00 1470 1476 -6.25000000000000e+00 1470 1472 -4.16666666666667e+00 1470 1361 2.08333333333333e+00 1470 1616 4.16666666666667e+00 1470 1360 2.08333333333333e+00 1470 1840 -4.16666666666667e+00 1470 1615 -2.08333333333333e+00 1470 1359 -6.25000000000000e+00 1470 1614 -6.25000000000000e+00 1471 1471 2.91666666666667e+01 1471 1467 2.08333333333333e+00 1471 1616 4.16666666666667e+00 1471 1472 -8.33333333333333e+00 1471 1478 4.16666666666667e+00 1471 1289 -2.08333333333333e+00 1471 1469 2.08333333333333e+00 1471 1288 -2.08333333333333e+00 1471 1477 -1.87500000000000e+01 1471 1287 2.08333333333333e+00 1471 1470 -4.16666666666667e+00 1471 1476 4.16666666666667e+00 1471 1361 -2.08333333333333e+00 1471 1841 2.08333333333333e+00 1471 1614 -2.08333333333333e+00 1471 1360 -2.08333333333333e+00 1471 1615 -6.25000000000000e+00 1471 1359 2.08333333333333e+00 1471 1839 -4.16666666666667e+00 1472 1472 2.91666666666667e+01 1472 1471 -8.33333333333333e+00 1472 1477 4.16666666666667e+00 1472 1839 2.08333333333333e+00 1472 1476 -2.08333333333333e+00 1472 1289 -2.08333333333333e+00 1472 1478 -6.25000000000000e+00 1472 1288 -2.08333333333333e+00 1472 1468 2.08333333333333e+00 1472 1287 2.08333333333333e+00 1472 1467 -4.16666666666667e+00 1472 1615 4.16666666666667e+00 1472 1361 -2.08333333333333e+00 1472 1616 -1.87500000000000e+01 1472 1360 -2.08333333333333e+00 1472 1840 2.08333333333333e+00 1472 1470 -4.16666666666667e+00 1472 1359 2.08333333333333e+00 1472 1614 4.16666666666667e+00 1473 1473 6.25000000000000e+01 1473 1468 4.16666666666667e+00 1473 1619 8.33333333333333e+00 1473 1618 -4.16666666666667e+00 1473 1617 -1.25000000000000e+01 1473 1288 4.16666666666667e+00 1473 1287 -6.25000000000000e+00 1473 1474 -8.33333333333333e+00 1473 1363 4.16666666666667e+00 1473 1469 4.16666666666667e+00 1473 1362 -6.25000000000000e+00 1473 1475 -8.33333333333333e+00 1473 1478 4.16666666666667e+00 1473 1364 -2.08333333333333e+00 1473 1847 2.08333333333333e+00 1473 1846 -4.16666666666667e+00 1473 1289 -2.08333333333333e+00 1473 1477 4.16666666666667e+00 1473 1476 -1.87500000000000e+01 1473 2099 -4.16666666666667e+00 1473 2102 2.08333333333333e+00 1473 2098 -4.16666666666667e+00 1473 2365 4.16666666666667e+00 1473 2101 -4.16666666666667e+00 1473 2462 4.16666666666667e+00 1473 2366 -8.33333333333333e+00 1473 2461 4.16666666666667e+00 1473 2460 -1.87500000000000e+01 1474 1474 6.25000000000000e+01 1474 1289 4.16666666666667e+00 1474 1467 4.16666666666667e+00 1474 1619 8.33333333333333e+00 1474 1475 -8.33333333333333e+00 1474 1364 4.16666666666667e+00 1474 1618 -1.25000000000000e+01 1474 1617 -4.16666666666667e+00 1474 1288 -1.87500000000000e+01 1474 1287 4.16666666666667e+00 1474 1469 -8.33333333333333e+00 1474 1363 -1.87500000000000e+01 1474 1473 -8.33333333333333e+00 1474 1362 4.16666666666667e+00 1474 1847 2.08333333333333e+00 1474 1478 -2.08333333333333e+00 1474 1845 -4.16666666666667e+00 1474 1477 -6.25000000000000e+00 1474 1476 4.16666666666667e+00 1474 2097 -4.16666666666667e+00 1474 2364 4.16666666666667e+00 1474 2102 2.08333333333333e+00 1474 2099 -4.16666666666667e+00 1474 2100 -4.16666666666667e+00 1474 2462 -2.08333333333333e+00 1474 2366 4.16666666666667e+00 1474 2461 -6.25000000000000e+00 1474 2460 4.16666666666667e+00 1475 1475 6.25000000000000e+01 1475 1468 -8.33333333333333e+00 1475 1288 4.16666666666667e+00 1475 1619 -3.75000000000000e+01 1475 1618 8.33333333333333e+00 1475 1474 -8.33333333333333e+00 1475 1363 4.16666666666667e+00 1475 1617 8.33333333333333e+00 1475 1289 -6.25000000000000e+00 1475 1467 4.16666666666667e+00 1475 1364 -6.25000000000000e+00 1475 1477 -2.08333333333333e+00 1475 1473 -8.33333333333333e+00 1475 1476 4.16666666666667e+00 1475 1362 -2.08333333333333e+00 1475 1845 2.08333333333333e+00 1475 1846 2.08333333333333e+00 1475 1478 -6.25000000000000e+00 1475 1287 -2.08333333333333e+00 1475 2097 -4.16666666666667e+00 1475 2100 2.08333333333333e+00 1475 2101 2.08333333333333e+00 1475 2098 -4.16666666666667e+00 1475 2462 -6.25000000000000e+00 1475 2461 -2.08333333333333e+00 1475 2365 4.16666666666667e+00 1475 2460 4.16666666666667e+00 1475 2364 -8.33333333333333e+00 1476 1476 6.25000000000000e+01 1476 1619 -8.33333333333333e+00 1476 1618 4.16666666666667e+00 1476 1289 2.08333333333333e+00 1476 1474 4.16666666666667e+00 1476 1473 -1.87500000000000e+01 1476 1847 -2.08333333333333e+00 1476 1367 2.08333333333333e+00 1476 1846 4.16666666666667e+00 1476 1845 -6.25000000000000e+00 1476 1469 -4.16666666666667e+00 1476 1468 -4.16666666666667e+00 1476 1616 4.16666666666667e+00 1476 1472 -2.08333333333333e+00 1476 1477 -8.33333333333333e+00 1476 1615 4.16666666666667e+00 1476 1621 -4.16666666666667e+00 1476 1288 -4.16666666666667e+00 1476 1471 4.16666666666667e+00 1476 1470 -6.25000000000000e+00 1476 1478 -8.33333333333333e+00 1476 1841 4.16666666666667e+00 1476 1622 8.33333333333333e+00 1476 1840 4.16666666666667e+00 1476 1366 -4.16666666666667e+00 1476 1475 4.16666666666667e+00 1476 1839 -1.87500000000000e+01 1476 1620 -1.25000000000000e+01 1477 1477 6.25000000000000e+01 1477 1619 4.16666666666667e+00 1477 1617 4.16666666666667e+00 1477 1474 -6.25000000000000e+00 1477 1473 4.16666666666667e+00 1477 1847 4.16666666666667e+00 1477 1478 -8.33333333333333e+00 1477 1846 -1.87500000000000e+01 1477 1845 4.16666666666667e+00 1477 1467 -4.16666666666667e+00 1477 1472 4.16666666666667e+00 1477 1476 -8.33333333333333e+00 1477 1616 -8.33333333333333e+00 1477 1622 8.33333333333333e+00 1477 1614 4.16666666666667e+00 1477 1620 -4.16666666666667e+00 1477 1289 2.08333333333333e+00 1477 1469 -4.16666666666667e+00 1477 1471 -1.87500000000000e+01 1477 1287 -4.16666666666667e+00 1477 1470 4.16666666666667e+00 1477 1841 -2.08333333333333e+00 1477 1367 2.08333333333333e+00 1477 1475 -2.08333333333333e+00 1477 1840 -6.25000000000000e+00 1477 1621 -1.25000000000000e+01 1477 1839 4.16666666666667e+00 1477 1365 -4.16666666666667e+00 1478 1478 6.25000000000000e+01 1478 1618 4.16666666666667e+00 1478 1473 4.16666666666667e+00 1478 1617 -8.33333333333333e+00 1478 1475 -6.25000000000000e+00 1478 1287 2.08333333333333e+00 1478 1847 -6.25000000000000e+00 1478 1846 4.16666666666667e+00 1478 1477 -8.33333333333333e+00 1478 1845 -2.08333333333333e+00 1478 1365 2.08333333333333e+00 1478 1467 -4.16666666666667e+00 1478 1471 4.16666666666667e+00 1478 1614 4.16666666666667e+00 1478 1470 -2.08333333333333e+00 1478 1615 -8.33333333333333e+00 1478 1621 8.33333333333333e+00 1478 1472 -6.25000000000000e+00 1478 1288 2.08333333333333e+00 1478 1468 -4.16666666666667e+00 1478 1474 -2.08333333333333e+00 1478 1841 -6.25000000000000e+00 1478 1622 -3.75000000000000e+01 1478 1840 -2.08333333333333e+00 1478 1366 2.08333333333333e+00 1478 1476 -8.33333333333333e+00 1478 1839 4.16666666666667e+00 1478 1620 8.33333333333333e+00 1479 1479 6.25000000000000e+01 1479 1745 4.16666666666667e+00 1479 1744 -8.33333333333333e+00 1479 1484 4.16666666666667e+00 1479 1291 2.08333333333333e+00 1479 1482 -1.87500000000000e+01 1479 1628 4.16666666666667e+00 1479 1627 -2.08333333333333e+00 1479 1312 2.08333333333333e+00 1479 1626 -6.25000000000000e+00 1479 1640 -4.16666666666667e+00 1479 1481 -8.33333333333333e+00 1479 1486 -2.08333333333333e+00 1479 1493 -4.16666666666667e+00 1479 1844 4.16666666666667e+00 1479 1492 -4.16666666666667e+00 1479 1843 4.16666666666667e+00 1479 1487 4.16666666666667e+00 1479 1292 -4.16666666666667e+00 1479 1485 -6.25000000000000e+00 1479 1634 4.16666666666667e+00 1479 1313 -4.16666666666667e+00 1479 1633 4.16666666666667e+00 1479 1480 -8.33333333333333e+00 1479 1639 8.33333333333333e+00 1479 1632 -1.87500000000000e+01 1479 1483 4.16666666666667e+00 1479 1638 -1.25000000000000e+01 1480 1480 6.25000000000000e+01 1480 1745 4.16666666666667e+00 1480 1482 4.16666666666667e+00 1480 1743 -8.33333333333333e+00 1480 1483 -6.25000000000000e+00 1480 1290 2.08333333333333e+00 1480 1628 4.16666666666667e+00 1480 1481 -8.33333333333333e+00 1480 1627 -6.25000000000000e+00 1480 1626 -2.08333333333333e+00 1480 1311 2.08333333333333e+00 1480 1485 -2.08333333333333e+00 1480 1487 4.16666666666667e+00 1480 1640 8.33333333333333e+00 1480 1844 -8.33333333333333e+00 1480 1491 -4.16666666666667e+00 1480 1842 4.16666666666667e+00 1480 1292 2.08333333333333e+00 1480 1493 -4.16666666666667e+00 1480 1486 -6.25000000000000e+00 1480 1634 -2.08333333333333e+00 1480 1313 2.08333333333333e+00 1480 1633 -6.25000000000000e+00 1480 1484 -2.08333333333333e+00 1480 1639 -3.75000000000000e+01 1480 1632 4.16666666666667e+00 1480 1479 -8.33333333333333e+00 1480 1638 8.33333333333333e+00 1481 1481 6.25000000000000e+01 1481 1744 4.16666666666667e+00 1481 1743 4.16666666666667e+00 1481 1484 -6.25000000000000e+00 1481 1482 4.16666666666667e+00 1481 1628 -1.87500000000000e+01 1481 1627 4.16666666666667e+00 1481 1480 -8.33333333333333e+00 1481 1626 4.16666666666667e+00 1481 1638 -4.16666666666667e+00 1481 1479 -8.33333333333333e+00 1481 1486 4.16666666666667e+00 1481 1491 -4.16666666666667e+00 1481 1842 4.16666666666667e+00 1481 1639 8.33333333333333e+00 1481 1843 -8.33333333333333e+00 1481 1487 -1.87500000000000e+01 1481 1291 2.08333333333333e+00 1481 1492 -4.16666666666667e+00 1481 1485 4.16666666666667e+00 1481 1290 -4.16666666666667e+00 1481 1634 -6.25000000000000e+00 1481 1483 -2.08333333333333e+00 1481 1640 -1.25000000000000e+01 1481 1633 -2.08333333333333e+00 1481 1312 2.08333333333333e+00 1481 1632 4.16666666666667e+00 1481 1311 -4.16666666666667e+00 1482 1482 6.25000000000000e+01 1482 1496 -4.16666666666667e+00 1482 1489 2.08333333333333e+00 1482 1495 -4.16666666666667e+00 1482 1490 -4.16666666666667e+00 1482 1742 4.16666666666667e+00 1482 1741 4.16666666666667e+00 1482 1747 -8.33333333333333e+00 1482 1740 -1.87500000000000e+01 1482 1493 4.16666666666667e+00 1482 1745 -4.16666666666667e+00 1482 1483 -8.33333333333333e+00 1482 1744 8.33333333333333e+00 1482 1480 4.16666666666667e+00 1482 1331 4.16666666666667e+00 1482 1628 -4.16666666666667e+00 1482 1330 -2.08333333333333e+00 1482 1627 2.08333333333333e+00 1482 1329 -6.25000000000000e+00 1482 1743 -1.25000000000000e+01 1482 1484 -8.33333333333333e+00 1482 1292 4.16666666666667e+00 1482 1481 4.16666666666667e+00 1482 1291 -2.08333333333333e+00 1482 1492 4.16666666666667e+00 1482 1748 4.16666666666667e+00 1482 1290 -6.25000000000000e+00 1482 1479 -1.87500000000000e+01 1483 1483 6.25000000000000e+01 1483 1494 -4.16666666666667e+00 1483 1490 2.08333333333333e+00 1483 1496 -4.16666666666667e+00 1483 1742 -2.08333333333333e+00 1483 1748 4.16666666666667e+00 1483 1741 -6.25000000000000e+00 1483 1740 4.16666666666667e+00 1483 1746 -8.33333333333333e+00 1483 1628 2.08333333333333e+00 1483 1481 -2.08333333333333e+00 1483 1482 -8.33333333333333e+00 1483 1743 8.33333333333333e+00 1483 1479 4.16666666666667e+00 1483 1331 4.16666666666667e+00 1483 1484 -8.33333333333333e+00 1483 1745 8.33333333333333e+00 1483 1330 -6.25000000000000e+00 1483 1744 -3.75000000000000e+01 1483 1329 -2.08333333333333e+00 1483 1626 2.08333333333333e+00 1483 1292 4.16666666666667e+00 1483 1493 -8.33333333333333e+00 1483 1488 2.08333333333333e+00 1483 1291 -6.25000000000000e+00 1483 1480 -6.25000000000000e+00 1483 1290 -2.08333333333333e+00 1483 1491 4.16666666666667e+00 1484 1484 6.25000000000000e+01 1484 1494 -4.16666666666667e+00 1484 1489 2.08333333333333e+00 1484 1495 -4.16666666666667e+00 1484 1488 -4.16666666666667e+00 1484 1742 -6.25000000000000e+00 1484 1741 -2.08333333333333e+00 1484 1747 4.16666666666667e+00 1484 1740 4.16666666666667e+00 1484 1491 4.16666666666667e+00 1484 1743 -4.16666666666667e+00 1484 1627 2.08333333333333e+00 1484 1480 -2.08333333333333e+00 1484 1331 -1.87500000000000e+01 1484 1745 -1.25000000000000e+01 1484 1330 4.16666666666667e+00 1484 1483 -8.33333333333333e+00 1484 1744 8.33333333333333e+00 1484 1329 4.16666666666667e+00 1484 1626 -4.16666666666667e+00 1484 1746 4.16666666666667e+00 1484 1292 -1.87500000000000e+01 1484 1481 -6.25000000000000e+00 1484 1291 4.16666666666667e+00 1484 1492 -8.33333333333333e+00 1484 1482 -8.33333333333333e+00 1484 1290 4.16666666666667e+00 1484 1479 4.16666666666667e+00 1485 1485 2.50000000000000e+01 1485 1633 2.08333333333333e+00 1485 1493 2.08333333333333e+00 1485 1844 -2.08333333333333e+00 1485 1361 2.08333333333333e+00 1485 1634 -4.16666666666667e+00 1485 1360 2.08333333333333e+00 1485 1486 -4.16666666666667e+00 1485 1843 4.16666666666667e+00 1485 1359 -6.25000000000000e+00 1485 1842 -6.25000000000000e+00 1485 1487 -4.16666666666667e+00 1485 1292 2.08333333333333e+00 1485 1481 4.16666666666667e+00 1485 1291 2.08333333333333e+00 1485 1492 -4.16666666666667e+00 1485 1480 -2.08333333333333e+00 1485 1290 -6.25000000000000e+00 1485 1479 -6.25000000000000e+00 1486 1486 2.91666666666667e+01 1486 1632 2.08333333333333e+00 1486 1481 4.16666666666667e+00 1486 1487 -8.33333333333333e+00 1486 1844 4.16666666666667e+00 1486 1361 -2.08333333333333e+00 1486 1634 2.08333333333333e+00 1486 1360 -2.08333333333333e+00 1486 1843 -1.87500000000000e+01 1486 1359 2.08333333333333e+00 1486 1485 -4.16666666666667e+00 1486 1842 4.16666666666667e+00 1486 1292 -2.08333333333333e+00 1486 1493 2.08333333333333e+00 1486 1479 -2.08333333333333e+00 1486 1291 -2.08333333333333e+00 1486 1480 -6.25000000000000e+00 1486 1290 2.08333333333333e+00 1486 1491 -4.16666666666667e+00 1487 1487 2.91666666666667e+01 1487 1486 -8.33333333333333e+00 1487 1843 4.16666666666667e+00 1487 1491 2.08333333333333e+00 1487 1842 -2.08333333333333e+00 1487 1361 -2.08333333333333e+00 1487 1844 -6.25000000000000e+00 1487 1360 -2.08333333333333e+00 1487 1633 2.08333333333333e+00 1487 1359 2.08333333333333e+00 1487 1632 -4.16666666666667e+00 1487 1480 4.16666666666667e+00 1487 1292 -2.08333333333333e+00 1487 1481 -1.87500000000000e+01 1487 1291 -2.08333333333333e+00 1487 1492 2.08333333333333e+00 1487 1485 -4.16666666666667e+00 1487 1290 2.08333333333333e+00 1487 1479 4.16666666666667e+00 1488 1488 2.50000000000000e+01 1488 1483 2.08333333333333e+00 1488 1859 2.08333333333333e+00 1488 1496 -2.08333333333333e+00 1488 1292 2.08333333333333e+00 1488 1484 -4.16666666666667e+00 1488 1291 2.08333333333333e+00 1488 1489 -4.16666666666667e+00 1488 1495 4.16666666666667e+00 1488 1290 -6.25000000000000e+00 1488 1494 -6.25000000000000e+00 1488 1490 -4.16666666666667e+00 1488 1370 2.08333333333333e+00 1488 1742 4.16666666666667e+00 1488 1369 2.08333333333333e+00 1488 1858 -4.16666666666667e+00 1488 1741 -2.08333333333333e+00 1488 1368 -6.25000000000000e+00 1488 1740 -6.25000000000000e+00 1489 1489 2.91666666666667e+01 1489 1482 2.08333333333333e+00 1489 1742 4.16666666666667e+00 1489 1490 -8.33333333333333e+00 1489 1496 4.16666666666667e+00 1489 1292 -2.08333333333333e+00 1489 1484 2.08333333333333e+00 1489 1291 -2.08333333333333e+00 1489 1495 -1.87500000000000e+01 1489 1290 2.08333333333333e+00 1489 1488 -4.16666666666667e+00 1489 1494 4.16666666666667e+00 1489 1370 -2.08333333333333e+00 1489 1859 2.08333333333333e+00 1489 1740 -2.08333333333333e+00 1489 1369 -2.08333333333333e+00 1489 1741 -6.25000000000000e+00 1489 1368 2.08333333333333e+00 1489 1857 -4.16666666666667e+00 1490 1490 2.91666666666667e+01 1490 1489 -8.33333333333333e+00 1490 1495 4.16666666666667e+00 1490 1857 2.08333333333333e+00 1490 1494 -2.08333333333333e+00 1490 1292 -2.08333333333333e+00 1490 1496 -6.25000000000000e+00 1490 1291 -2.08333333333333e+00 1490 1483 2.08333333333333e+00 1490 1290 2.08333333333333e+00 1490 1482 -4.16666666666667e+00 1490 1741 4.16666666666667e+00 1490 1370 -2.08333333333333e+00 1490 1742 -1.87500000000000e+01 1490 1369 -2.08333333333333e+00 1490 1858 2.08333333333333e+00 1490 1488 -4.16666666666667e+00 1490 1368 2.08333333333333e+00 1490 1740 4.16666666666667e+00 1491 1491 6.25000000000000e+01 1491 1496 4.16666666666667e+00 1491 1373 -2.08333333333333e+00 1491 1865 2.08333333333333e+00 1491 1864 -4.16666666666667e+00 1491 1292 -2.08333333333333e+00 1491 1495 4.16666666666667e+00 1491 1494 -1.87500000000000e+01 1491 1484 4.16666666666667e+00 1491 1483 4.16666666666667e+00 1491 1745 8.33333333333333e+00 1491 1744 -4.16666666666667e+00 1491 1743 -1.25000000000000e+01 1491 1481 -4.16666666666667e+00 1491 1487 2.08333333333333e+00 1491 1480 -4.16666666666667e+00 1491 1639 4.16666666666667e+00 1491 1486 -4.16666666666667e+00 1491 1291 4.16666666666667e+00 1491 1290 -6.25000000000000e+00 1491 1844 4.16666666666667e+00 1491 1640 -8.33333333333333e+00 1491 1843 4.16666666666667e+00 1491 1492 -8.33333333333333e+00 1491 1372 4.16666666666667e+00 1491 1842 -1.87500000000000e+01 1491 1493 -8.33333333333333e+00 1491 1371 -6.25000000000000e+00 1492 1492 6.25000000000000e+01 1492 1496 -2.08333333333333e+00 1492 1863 -4.16666666666667e+00 1492 1495 -6.25000000000000e+00 1492 1494 4.16666666666667e+00 1492 1484 -8.33333333333333e+00 1492 1292 4.16666666666667e+00 1492 1482 4.16666666666667e+00 1492 1745 8.33333333333333e+00 1492 1493 -8.33333333333333e+00 1492 1373 4.16666666666667e+00 1492 1744 -1.25000000000000e+01 1492 1743 -4.16666666666667e+00 1492 1479 -4.16666666666667e+00 1492 1638 4.16666666666667e+00 1492 1487 2.08333333333333e+00 1492 1481 -4.16666666666667e+00 1492 1291 -1.87500000000000e+01 1492 1485 -4.16666666666667e+00 1492 1290 4.16666666666667e+00 1492 1844 -2.08333333333333e+00 1492 1640 4.16666666666667e+00 1492 1843 -6.25000000000000e+00 1492 1865 2.08333333333333e+00 1492 1372 -1.87500000000000e+01 1492 1842 4.16666666666667e+00 1492 1491 -8.33333333333333e+00 1492 1371 4.16666666666667e+00 1493 1493 6.25000000000000e+01 1493 1495 -2.08333333333333e+00 1493 1491 -8.33333333333333e+00 1493 1494 4.16666666666667e+00 1493 1371 -2.08333333333333e+00 1493 1863 2.08333333333333e+00 1493 1496 -6.25000000000000e+00 1493 1290 -2.08333333333333e+00 1493 1482 4.16666666666667e+00 1493 1483 -8.33333333333333e+00 1493 1291 4.16666666666667e+00 1493 1745 -3.75000000000000e+01 1493 1744 8.33333333333333e+00 1493 1492 -8.33333333333333e+00 1493 1372 4.16666666666667e+00 1493 1743 8.33333333333333e+00 1493 1479 -4.16666666666667e+00 1493 1485 2.08333333333333e+00 1493 1292 -6.25000000000000e+00 1493 1486 2.08333333333333e+00 1493 1480 -4.16666666666667e+00 1493 1844 -6.25000000000000e+00 1493 1864 2.08333333333333e+00 1493 1373 -6.25000000000000e+00 1493 1843 -2.08333333333333e+00 1493 1639 4.16666666666667e+00 1493 1842 4.16666666666667e+00 1493 1638 -8.33333333333333e+00 1494 1494 6.25000000000000e+01 1494 1745 -8.33333333333333e+00 1494 1744 4.16666666666667e+00 1494 1292 2.08333333333333e+00 1494 1492 4.16666666666667e+00 1494 1491 -1.87500000000000e+01 1494 1865 -2.08333333333333e+00 1494 1376 2.08333333333333e+00 1494 1864 4.16666666666667e+00 1494 1863 -6.25000000000000e+00 1494 1484 -4.16666666666667e+00 1494 1483 -4.16666666666667e+00 1494 1742 4.16666666666667e+00 1494 1490 -2.08333333333333e+00 1494 1495 -8.33333333333333e+00 1494 1741 4.16666666666667e+00 1494 1747 -4.16666666666667e+00 1494 1291 -4.16666666666667e+00 1494 1489 4.16666666666667e+00 1494 1488 -6.25000000000000e+00 1494 1496 -8.33333333333333e+00 1494 1859 4.16666666666667e+00 1494 1748 8.33333333333333e+00 1494 1858 4.16666666666667e+00 1494 1375 -4.16666666666667e+00 1494 1493 4.16666666666667e+00 1494 1857 -1.87500000000000e+01 1494 1746 -1.25000000000000e+01 1495 1495 6.25000000000000e+01 1495 1745 4.16666666666667e+00 1495 1743 4.16666666666667e+00 1495 1492 -6.25000000000000e+00 1495 1491 4.16666666666667e+00 1495 1865 4.16666666666667e+00 1495 1496 -8.33333333333333e+00 1495 1864 -1.87500000000000e+01 1495 1863 4.16666666666667e+00 1495 1482 -4.16666666666667e+00 1495 1490 4.16666666666667e+00 1495 1494 -8.33333333333333e+00 1495 1742 -8.33333333333333e+00 1495 1748 8.33333333333333e+00 1495 1740 4.16666666666667e+00 1495 1746 -4.16666666666667e+00 1495 1292 2.08333333333333e+00 1495 1484 -4.16666666666667e+00 1495 1489 -1.87500000000000e+01 1495 1290 -4.16666666666667e+00 1495 1488 4.16666666666667e+00 1495 1859 -2.08333333333333e+00 1495 1376 2.08333333333333e+00 1495 1493 -2.08333333333333e+00 1495 1858 -6.25000000000000e+00 1495 1747 -1.25000000000000e+01 1495 1857 4.16666666666667e+00 1495 1374 -4.16666666666667e+00 1496 1496 6.25000000000000e+01 1496 1744 4.16666666666667e+00 1496 1491 4.16666666666667e+00 1496 1743 -8.33333333333333e+00 1496 1493 -6.25000000000000e+00 1496 1290 2.08333333333333e+00 1496 1865 -6.25000000000000e+00 1496 1864 4.16666666666667e+00 1496 1495 -8.33333333333333e+00 1496 1863 -2.08333333333333e+00 1496 1374 2.08333333333333e+00 1496 1482 -4.16666666666667e+00 1496 1489 4.16666666666667e+00 1496 1740 4.16666666666667e+00 1496 1488 -2.08333333333333e+00 1496 1741 -8.33333333333333e+00 1496 1747 8.33333333333333e+00 1496 1490 -6.25000000000000e+00 1496 1291 2.08333333333333e+00 1496 1483 -4.16666666666667e+00 1496 1492 -2.08333333333333e+00 1496 1859 -6.25000000000000e+00 1496 1748 -3.75000000000000e+01 1496 1858 -2.08333333333333e+00 1496 1375 2.08333333333333e+00 1496 1494 -8.33333333333333e+00 1496 1857 4.16666666666667e+00 1496 1746 8.33333333333333e+00 1497 1497 6.25000000000000e+01 1497 1754 4.16666666666667e+00 1497 1753 -2.08333333333333e+00 1497 1333 2.08333333333333e+00 1497 1752 -6.25000000000000e+00 1497 1766 -4.16666666666667e+00 1497 1499 -8.33333333333333e+00 1497 1501 -2.08333333333333e+00 1497 1862 4.16666666666667e+00 1497 1861 4.16666666666667e+00 1497 1502 4.16666666666667e+00 1497 1500 -6.25000000000000e+00 1497 1760 4.16666666666667e+00 1497 1334 -4.16666666666667e+00 1497 1759 4.16666666666667e+00 1497 1498 -8.33333333333333e+00 1497 1765 8.33333333333333e+00 1497 1758 -1.87500000000000e+01 1497 1764 -1.25000000000000e+01 1497 401 4.16666666666667e+00 1497 400 -8.33333333333333e+00 1497 236 4.16666666666667e+00 1497 19 2.08333333333333e+00 1497 234 -1.87500000000000e+01 1497 242 -4.16666666666667e+00 1497 241 -4.16666666666667e+00 1497 20 -4.16666666666667e+00 1497 235 4.16666666666667e+00 1498 1498 6.25000000000000e+01 1498 1754 4.16666666666667e+00 1498 1499 -8.33333333333333e+00 1498 1753 -6.25000000000000e+00 1498 1752 -2.08333333333333e+00 1498 1332 2.08333333333333e+00 1498 1500 -2.08333333333333e+00 1498 1502 4.16666666666667e+00 1498 1766 8.33333333333333e+00 1498 1862 -8.33333333333333e+00 1498 1860 4.16666666666667e+00 1498 1501 -6.25000000000000e+00 1498 1760 -2.08333333333333e+00 1498 1334 2.08333333333333e+00 1498 1759 -6.25000000000000e+00 1498 1765 -3.75000000000000e+01 1498 1758 4.16666666666667e+00 1498 1497 -8.33333333333333e+00 1498 1764 8.33333333333333e+00 1498 401 4.16666666666667e+00 1498 234 4.16666666666667e+00 1498 399 -8.33333333333333e+00 1498 235 -6.25000000000000e+00 1498 18 2.08333333333333e+00 1498 240 -4.16666666666667e+00 1498 20 2.08333333333333e+00 1498 242 -4.16666666666667e+00 1498 236 -2.08333333333333e+00 1499 1499 6.25000000000000e+01 1499 1754 -1.87500000000000e+01 1499 1753 4.16666666666667e+00 1499 1498 -8.33333333333333e+00 1499 1752 4.16666666666667e+00 1499 1764 -4.16666666666667e+00 1499 1497 -8.33333333333333e+00 1499 1501 4.16666666666667e+00 1499 1860 4.16666666666667e+00 1499 1765 8.33333333333333e+00 1499 1861 -8.33333333333333e+00 1499 1502 -1.87500000000000e+01 1499 1500 4.16666666666667e+00 1499 1760 -6.25000000000000e+00 1499 1766 -1.25000000000000e+01 1499 1759 -2.08333333333333e+00 1499 1333 2.08333333333333e+00 1499 1758 4.16666666666667e+00 1499 1332 -4.16666666666667e+00 1499 400 4.16666666666667e+00 1499 399 4.16666666666667e+00 1499 236 -6.25000000000000e+00 1499 234 4.16666666666667e+00 1499 240 -4.16666666666667e+00 1499 19 2.08333333333333e+00 1499 241 -4.16666666666667e+00 1499 18 -4.16666666666667e+00 1499 235 -2.08333333333333e+00 1500 1500 2.50000000000000e+01 1500 1759 2.08333333333333e+00 1500 1862 -2.08333333333333e+00 1500 1370 2.08333333333333e+00 1500 1760 -4.16666666666667e+00 1500 1369 2.08333333333333e+00 1500 1501 -4.16666666666667e+00 1500 1861 4.16666666666667e+00 1500 1368 -6.25000000000000e+00 1500 1860 -6.25000000000000e+00 1500 1502 -4.16666666666667e+00 1500 1499 4.16666666666667e+00 1500 1498 -2.08333333333333e+00 1500 1497 -6.25000000000000e+00 1500 242 2.08333333333333e+00 1500 20 2.08333333333333e+00 1500 19 2.08333333333333e+00 1500 241 -4.16666666666667e+00 1500 18 -6.25000000000000e+00 1501 1501 2.91666666666667e+01 1501 1758 2.08333333333333e+00 1501 1499 4.16666666666667e+00 1501 1502 -8.33333333333333e+00 1501 1862 4.16666666666667e+00 1501 1370 -2.08333333333333e+00 1501 1760 2.08333333333333e+00 1501 1369 -2.08333333333333e+00 1501 1861 -1.87500000000000e+01 1501 1368 2.08333333333333e+00 1501 1500 -4.16666666666667e+00 1501 1860 4.16666666666667e+00 1501 1497 -2.08333333333333e+00 1501 1498 -6.25000000000000e+00 1501 20 -2.08333333333333e+00 1501 242 2.08333333333333e+00 1501 19 -2.08333333333333e+00 1501 18 2.08333333333333e+00 1501 240 -4.16666666666667e+00 1502 1502 2.91666666666667e+01 1502 1501 -8.33333333333333e+00 1502 1861 4.16666666666667e+00 1502 1860 -2.08333333333333e+00 1502 1370 -2.08333333333333e+00 1502 1862 -6.25000000000000e+00 1502 1369 -2.08333333333333e+00 1502 1759 2.08333333333333e+00 1502 1368 2.08333333333333e+00 1502 1758 -4.16666666666667e+00 1502 1498 4.16666666666667e+00 1502 1499 -1.87500000000000e+01 1502 1500 -4.16666666666667e+00 1502 1497 4.16666666666667e+00 1502 240 2.08333333333333e+00 1502 20 -2.08333333333333e+00 1502 19 -2.08333333333333e+00 1502 241 2.08333333333333e+00 1502 18 2.08333333333333e+00 1503 1503 1.25000000000000e+02 1503 1645 -4.16666666666667e+00 1503 1316 4.16666666666667e+00 1503 1644 -1.25000000000000e+01 1503 1508 -4.16666666666667e+00 1503 1295 4.16666666666667e+00 1503 1504 -1.66666666666667e+01 1503 1507 8.33333333333333e+00 1503 1506 -1.25000000000000e+01 1503 1652 -4.16666666666667e+00 1503 1651 8.33333333333333e+00 1503 1315 4.16666666666667e+00 1503 1650 -1.25000000000000e+01 1503 1505 -1.66666666666667e+01 1503 1511 8.33333333333333e+00 1503 1510 -4.16666666666667e+00 1503 1294 4.16666666666667e+00 1503 1646 8.33333333333333e+00 1503 1509 -1.25000000000000e+01 1503 1813 -8.33333333333333e+00 1503 1658 8.33333333333333e+00 1503 1850 -8.33333333333333e+00 1503 1513 -4.16666666666667e+00 1503 1849 4.16666666666667e+00 1503 1514 -4.16666666666667e+00 1503 1657 8.33333333333333e+00 1503 1814 4.16666666666667e+00 1503 1656 -3.75000000000000e+01 1503 2392 4.16666666666667e+00 1503 2393 -8.33333333333333e+00 1503 2387 -4.16666666666667e+00 1503 2399 4.16666666666667e+00 1503 2140 8.33333333333333e+00 1503 2398 -8.33333333333333e+00 1503 2386 -4.16666666666667e+00 1503 2141 8.33333333333333e+00 1503 2139 -3.75000000000000e+01 1504 1504 1.25000000000000e+02 1504 1644 -4.16666666666667e+00 1504 1646 8.33333333333333e+00 1504 1645 -1.25000000000000e+01 1504 1508 8.33333333333333e+00 1504 1507 -3.75000000000000e+01 1504 1503 -1.66666666666667e+01 1504 1506 8.33333333333333e+00 1504 1505 -1.66666666666667e+01 1504 1650 8.33333333333333e+00 1504 1316 -8.33333333333333e+00 1504 1652 8.33333333333333e+00 1504 1651 -3.75000000000000e+01 1504 1314 4.16666666666667e+00 1504 1511 8.33333333333333e+00 1504 1295 -8.33333333333333e+00 1504 1510 -1.25000000000000e+01 1504 1509 -4.16666666666667e+00 1504 1293 4.16666666666667e+00 1504 1814 4.16666666666667e+00 1504 1812 -8.33333333333333e+00 1504 1658 -4.16666666666667e+00 1504 1514 -4.16666666666667e+00 1504 1850 4.16666666666667e+00 1504 1512 -4.16666666666667e+00 1504 1848 4.16666666666667e+00 1504 1657 -1.25000000000000e+01 1504 1656 8.33333333333333e+00 1504 2393 4.16666666666667e+00 1504 2141 -4.16666666666667e+00 1504 2387 -4.16666666666667e+00 1504 2399 4.16666666666667e+00 1504 2139 8.33333333333333e+00 1504 2397 -8.33333333333333e+00 1504 2385 -4.16666666666667e+00 1504 2391 4.16666666666667e+00 1504 2140 -1.25000000000000e+01 1505 1505 1.25000000000000e+02 1505 1646 -3.75000000000000e+01 1505 1645 8.33333333333333e+00 1505 1314 4.16666666666667e+00 1505 1508 -1.25000000000000e+01 1505 1507 8.33333333333333e+00 1505 1506 -4.16666666666667e+00 1505 1293 4.16666666666667e+00 1505 1504 -1.66666666666667e+01 1505 1650 -4.16666666666667e+00 1505 1652 -1.25000000000000e+01 1505 1315 -8.33333333333333e+00 1505 1651 8.33333333333333e+00 1505 1644 8.33333333333333e+00 1505 1511 -3.75000000000000e+01 1505 1510 8.33333333333333e+00 1505 1294 -8.33333333333333e+00 1505 1503 -1.66666666666667e+01 1505 1509 8.33333333333333e+00 1505 1813 4.16666666666667e+00 1505 1657 -4.16666666666667e+00 1505 1513 -4.16666666666667e+00 1505 1849 4.16666666666667e+00 1505 1656 8.33333333333333e+00 1505 1848 -8.33333333333333e+00 1505 1512 -4.16666666666667e+00 1505 1812 4.16666666666667e+00 1505 1658 -1.25000000000000e+01 1505 2392 4.16666666666667e+00 1505 2391 -8.33333333333333e+00 1505 2140 -4.16666666666667e+00 1505 2386 -4.16666666666667e+00 1505 2398 4.16666666666667e+00 1505 2385 -4.16666666666667e+00 1505 2397 4.16666666666667e+00 1505 2141 -1.25000000000000e+01 1505 2139 8.33333333333333e+00 1506 1506 6.25000000000000e+01 1506 1346 4.16666666666667e+00 1506 1508 -8.33333333333333e+00 1506 1295 4.16666666666667e+00 1506 1645 4.16666666666667e+00 1506 1646 4.16666666666667e+00 1506 1344 -6.25000000000000e+00 1506 1505 -4.16666666666667e+00 1506 1504 8.33333333333333e+00 1506 1503 -1.25000000000000e+01 1506 1293 -6.25000000000000e+00 1506 1813 4.16666666666667e+00 1506 1507 -8.33333333333333e+00 1506 1514 -4.16666666666667e+00 1506 1294 -2.08333333333333e+00 1506 1513 2.08333333333333e+00 1506 1814 4.16666666666667e+00 1506 1345 -2.08333333333333e+00 1506 1812 -1.87500000000000e+01 1506 2435 -4.16666666666667e+00 1506 2144 4.16666666666667e+00 1506 2143 4.16666666666667e+00 1506 2142 -1.87500000000000e+01 1506 2392 -4.16666666666667e+00 1506 2393 -4.16666666666667e+00 1506 2141 4.16666666666667e+00 1506 2140 -8.33333333333333e+00 1506 2434 2.08333333333333e+00 1507 1507 6.25000000000000e+01 1507 1644 4.16666666666667e+00 1507 1646 -8.33333333333333e+00 1507 1346 4.16666666666667e+00 1507 1345 -6.25000000000000e+00 1507 1505 8.33333333333333e+00 1507 1508 -8.33333333333333e+00 1507 1295 4.16666666666667e+00 1507 1504 -3.75000000000000e+01 1507 1294 -6.25000000000000e+00 1507 1503 8.33333333333333e+00 1507 1514 2.08333333333333e+00 1507 1812 4.16666666666667e+00 1507 1506 -8.33333333333333e+00 1507 1293 -2.08333333333333e+00 1507 1512 2.08333333333333e+00 1507 1814 -2.08333333333333e+00 1507 1813 -6.25000000000000e+00 1507 1344 -2.08333333333333e+00 1507 2435 2.08333333333333e+00 1507 2144 -2.08333333333333e+00 1507 2143 -6.25000000000000e+00 1507 2142 4.16666666666667e+00 1507 2391 -4.16666666666667e+00 1507 2393 -4.16666666666667e+00 1507 2141 4.16666666666667e+00 1507 2433 2.08333333333333e+00 1507 2139 -8.33333333333333e+00 1508 1508 6.25000000000000e+01 1508 1344 4.16666666666667e+00 1508 1506 -8.33333333333333e+00 1508 1293 4.16666666666667e+00 1508 1346 -1.87500000000000e+01 1508 1645 -8.33333333333333e+00 1508 1345 4.16666666666667e+00 1508 1644 4.16666666666667e+00 1508 1505 -1.25000000000000e+01 1508 1295 -1.87500000000000e+01 1508 1504 8.33333333333333e+00 1508 1507 -8.33333333333333e+00 1508 1294 4.16666666666667e+00 1508 1503 -4.16666666666667e+00 1508 1513 2.08333333333333e+00 1508 1512 -4.16666666666667e+00 1508 1813 -2.08333333333333e+00 1508 1814 -6.25000000000000e+00 1508 1812 4.16666666666667e+00 1508 2433 -4.16666666666667e+00 1508 2144 -6.25000000000000e+00 1508 2143 -2.08333333333333e+00 1508 2142 4.16666666666667e+00 1508 2392 -4.16666666666667e+00 1508 2140 4.16666666666667e+00 1508 2391 -4.16666666666667e+00 1508 2434 2.08333333333333e+00 1508 2139 4.16666666666667e+00 1509 1509 6.25000000000000e+01 1509 1651 4.16666666666667e+00 1509 1505 8.33333333333333e+00 1509 1504 -4.16666666666667e+00 1509 1503 -1.25000000000000e+01 1509 1363 4.16666666666667e+00 1509 1362 -6.25000000000000e+00 1509 1510 -8.33333333333333e+00 1509 1294 4.16666666666667e+00 1509 1652 4.16666666666667e+00 1509 1293 -6.25000000000000e+00 1509 1511 -8.33333333333333e+00 1509 1850 4.16666666666667e+00 1509 1295 -2.08333333333333e+00 1509 1514 2.08333333333333e+00 1509 1513 -4.16666666666667e+00 1509 1364 -2.08333333333333e+00 1509 1849 4.16666666666667e+00 1509 1848 -1.87500000000000e+01 1509 2399 -4.16666666666667e+00 1509 2471 2.08333333333333e+00 1509 2398 -4.16666666666667e+00 1509 2140 4.16666666666667e+00 1509 2470 -4.16666666666667e+00 1509 2147 4.16666666666667e+00 1509 2141 -8.33333333333333e+00 1509 2146 4.16666666666667e+00 1509 2145 -1.87500000000000e+01 1510 1510 6.25000000000000e+01 1510 1364 4.16666666666667e+00 1510 1650 4.16666666666667e+00 1510 1505 8.33333333333333e+00 1510 1511 -8.33333333333333e+00 1510 1295 4.16666666666667e+00 1510 1504 -1.25000000000000e+01 1510 1503 -4.16666666666667e+00 1510 1363 -1.87500000000000e+01 1510 1362 4.16666666666667e+00 1510 1652 -8.33333333333333e+00 1510 1294 -1.87500000000000e+01 1510 1509 -8.33333333333333e+00 1510 1293 4.16666666666667e+00 1510 1514 2.08333333333333e+00 1510 1850 -2.08333333333333e+00 1510 1512 -4.16666666666667e+00 1510 1849 -6.25000000000000e+00 1510 1848 4.16666666666667e+00 1510 2397 -4.16666666666667e+00 1510 2139 4.16666666666667e+00 1510 2471 2.08333333333333e+00 1510 2399 -4.16666666666667e+00 1510 2469 -4.16666666666667e+00 1510 2147 -2.08333333333333e+00 1510 2141 4.16666666666667e+00 1510 2146 -6.25000000000000e+00 1510 2145 4.16666666666667e+00 1511 1511 6.25000000000000e+01 1511 1651 -8.33333333333333e+00 1511 1363 4.16666666666667e+00 1511 1505 -3.75000000000000e+01 1511 1504 8.33333333333333e+00 1511 1510 -8.33333333333333e+00 1511 1294 4.16666666666667e+00 1511 1503 8.33333333333333e+00 1511 1364 -6.25000000000000e+00 1511 1650 4.16666666666667e+00 1511 1295 -6.25000000000000e+00 1511 1849 -2.08333333333333e+00 1511 1509 -8.33333333333333e+00 1511 1848 4.16666666666667e+00 1511 1293 -2.08333333333333e+00 1511 1512 2.08333333333333e+00 1511 1513 2.08333333333333e+00 1511 1850 -6.25000000000000e+00 1511 1362 -2.08333333333333e+00 1511 2397 -4.16666666666667e+00 1511 2469 2.08333333333333e+00 1511 2470 2.08333333333333e+00 1511 2398 -4.16666666666667e+00 1511 2147 -6.25000000000000e+00 1511 2146 -2.08333333333333e+00 1511 2140 4.16666666666667e+00 1511 2145 4.16666666666667e+00 1511 2139 -8.33333333333333e+00 1512 1512 3.75000000000000e+01 1512 1508 -4.16666666666667e+00 1512 1507 2.08333333333333e+00 1512 1514 -4.16666666666667e+00 1512 1814 4.16666666666667e+00 1512 1379 2.08333333333333e+00 1512 1813 -2.08333333333333e+00 1512 1812 -6.25000000000000e+00 1512 1504 -4.16666666666667e+00 1512 1657 4.16666666666667e+00 1512 1511 2.08333333333333e+00 1512 1505 -4.16666666666667e+00 1512 1294 2.08333333333333e+00 1512 1510 -4.16666666666667e+00 1512 1293 -1.25000000000000e+01 1512 1850 -2.08333333333333e+00 1512 1658 4.16666666666667e+00 1512 1513 -4.16666666666667e+00 1512 1849 4.16666666666667e+00 1512 1378 2.08333333333333e+00 1512 1295 2.08333333333333e+00 1512 1848 -6.25000000000000e+00 1512 1377 -1.25000000000000e+01 1513 1513 3.33333333333333e+01 1513 1506 2.08333333333333e+00 1513 1814 4.16666666666667e+00 1513 1813 -6.25000000000000e+00 1513 1812 -2.08333333333333e+00 1513 1511 2.08333333333333e+00 1513 1505 -4.16666666666667e+00 1513 1503 -4.16666666666667e+00 1513 1656 4.16666666666667e+00 1513 1294 -4.16666666666667e+00 1513 1293 2.08333333333333e+00 1513 1509 -4.16666666666667e+00 1513 1850 4.16666666666667e+00 1513 1658 -8.33333333333333e+00 1513 1508 2.08333333333333e+00 1513 1849 -1.87500000000000e+01 1513 1378 -4.16666666666667e+00 1513 1512 -4.16666666666667e+00 1513 1848 4.16666666666667e+00 1513 1377 2.08333333333333e+00 1514 1514 3.33333333333333e+01 1514 1293 2.08333333333333e+00 1514 1506 -4.16666666666667e+00 1514 1814 -1.87500000000000e+01 1514 1813 4.16666666666667e+00 1514 1512 -4.16666666666667e+00 1514 1812 4.16666666666667e+00 1514 1377 2.08333333333333e+00 1514 1510 2.08333333333333e+00 1514 1504 -4.16666666666667e+00 1514 1295 -4.16666666666667e+00 1514 1509 2.08333333333333e+00 1514 1503 -4.16666666666667e+00 1514 1507 2.08333333333333e+00 1514 1850 -6.25000000000000e+00 1514 1379 -4.16666666666667e+00 1514 1849 4.16666666666667e+00 1514 1657 -8.33333333333333e+00 1514 1848 -2.08333333333333e+00 1514 1656 4.16666666666667e+00 1515 1515 1.25000000000000e+02 1515 1522 8.33333333333333e+00 1515 1521 -1.25000000000000e+01 1515 1664 -8.33333333333333e+00 1515 1663 4.16666666666667e+00 1515 1676 8.33333333333333e+00 1515 1534 4.16666666666667e+00 1515 1675 8.33333333333333e+00 1515 1674 -3.75000000000000e+01 1515 1535 4.16666666666667e+00 1515 1666 -4.16666666666667e+00 1515 1667 8.33333333333333e+00 1515 1517 -1.66666666666667e+01 1515 1319 -4.16666666666667e+00 1515 1665 -1.25000000000000e+01 1515 1526 4.16666666666667e+00 1515 1298 -4.16666666666667e+00 1515 1525 -8.33333333333333e+00 1515 1661 4.16666666666667e+00 1515 1519 8.33333333333333e+00 1515 1516 -1.66666666666667e+01 1515 1520 8.33333333333333e+00 1515 1297 -4.16666666666667e+00 1515 1518 -3.75000000000000e+01 1515 1660 4.16666666666667e+00 1515 1318 -4.16666666666667e+00 1515 1673 -4.16666666666667e+00 1515 1670 4.16666666666667e+00 1515 1531 4.16666666666667e+00 1515 1528 -4.16666666666667e+00 1515 1669 -8.33333333333333e+00 1515 1672 8.33333333333333e+00 1515 1671 -1.25000000000000e+01 1515 1529 8.33333333333333e+00 1515 1532 -8.33333333333333e+00 1515 1527 -1.25000000000000e+01 1515 1523 -4.16666666666667e+00 1516 1516 1.25000000000000e+02 1516 1521 8.33333333333333e+00 1516 1523 8.33333333333333e+00 1516 1522 -3.75000000000000e+01 1516 1662 4.16666666666667e+00 1516 1676 -4.16666666666667e+00 1516 1533 4.16666666666667e+00 1516 1675 -1.25000000000000e+01 1516 1674 8.33333333333333e+00 1516 1535 -8.33333333333333e+00 1516 1665 -4.16666666666667e+00 1516 1526 4.16666666666667e+00 1516 1667 8.33333333333333e+00 1516 1666 -1.25000000000000e+01 1516 1524 -8.33333333333333e+00 1516 1520 -4.16666666666667e+00 1516 1518 8.33333333333333e+00 1516 1515 -1.66666666666667e+01 1516 1519 -1.25000000000000e+01 1516 1296 -4.16666666666667e+00 1516 1661 -8.33333333333333e+00 1516 1659 4.16666666666667e+00 1516 1317 -4.16666666666667e+00 1516 1673 8.33333333333333e+00 1516 1517 -1.66666666666667e+01 1516 1529 8.33333333333333e+00 1516 1530 4.16666666666667e+00 1516 1527 -4.16666666666667e+00 1516 1670 4.16666666666667e+00 1516 1319 -4.16666666666667e+00 1516 1672 -3.75000000000000e+01 1516 1668 -8.33333333333333e+00 1516 1671 8.33333333333333e+00 1516 1532 4.16666666666667e+00 1516 1298 -4.16666666666667e+00 1516 1528 -1.25000000000000e+01 1516 1664 4.16666666666667e+00 1517 1517 1.25000000000000e+02 1517 1663 4.16666666666667e+00 1517 1523 -1.25000000000000e+01 1517 1522 8.33333333333333e+00 1517 1662 -8.33333333333333e+00 1517 1675 -4.16666666666667e+00 1517 1674 8.33333333333333e+00 1517 1676 -1.25000000000000e+01 1517 1534 -8.33333333333333e+00 1517 1533 4.16666666666667e+00 1517 1525 4.16666666666667e+00 1517 1665 8.33333333333333e+00 1517 1515 -1.66666666666667e+01 1517 1667 -3.75000000000000e+01 1517 1666 8.33333333333333e+00 1517 1317 -4.16666666666667e+00 1517 1524 4.16666666666667e+00 1517 1296 -4.16666666666667e+00 1517 1519 -4.16666666666667e+00 1517 1659 4.16666666666667e+00 1517 1520 -1.25000000000000e+01 1517 1518 8.33333333333333e+00 1517 1660 -8.33333333333333e+00 1517 1671 -4.16666666666667e+00 1517 1668 4.16666666666667e+00 1517 1672 8.33333333333333e+00 1517 1516 -1.66666666666667e+01 1517 1528 8.33333333333333e+00 1517 1673 -1.25000000000000e+01 1517 1669 4.16666666666667e+00 1517 1318 -4.16666666666667e+00 1517 1529 -3.75000000000000e+01 1517 1521 -4.16666666666667e+00 1517 1531 4.16666666666667e+00 1517 1297 -4.16666666666667e+00 1517 1527 8.33333333333333e+00 1517 1530 -8.33333333333333e+00 1518 1518 1.25000000000000e+02 1518 1831 -8.33333333333333e+00 1518 1784 8.33333333333333e+00 1518 1868 -8.33333333333333e+00 1518 1537 -4.16666666666667e+00 1518 1867 4.16666666666667e+00 1518 1538 -4.16666666666667e+00 1518 1783 8.33333333333333e+00 1518 1782 -3.75000000000000e+01 1518 1772 8.33333333333333e+00 1518 1666 4.16666666666667e+00 1518 1771 -4.16666666666667e+00 1518 1667 -8.33333333333333e+00 1518 1337 4.16666666666667e+00 1518 1770 -1.25000000000000e+01 1518 1526 -4.16666666666667e+00 1518 1298 4.16666666666667e+00 1518 1519 -1.66666666666667e+01 1518 1525 8.33333333333333e+00 1518 1524 -1.25000000000000e+01 1518 1778 -4.16666666666667e+00 1518 1777 8.33333333333333e+00 1518 1661 -4.16666666666667e+00 1518 1673 4.16666666666667e+00 1518 1516 8.33333333333333e+00 1518 1672 -8.33333333333333e+00 1518 1336 4.16666666666667e+00 1518 1660 -4.16666666666667e+00 1518 1776 -1.25000000000000e+01 1518 1520 -1.66666666666667e+01 1518 1532 8.33333333333333e+00 1518 1517 8.33333333333333e+00 1518 1531 -4.16666666666667e+00 1518 1297 4.16666666666667e+00 1518 1832 4.16666666666667e+00 1518 1530 -1.25000000000000e+01 1518 1515 -3.75000000000000e+01 1519 1519 1.25000000000000e+02 1519 1830 -8.33333333333333e+00 1519 1784 -4.16666666666667e+00 1519 1538 -4.16666666666667e+00 1519 1868 4.16666666666667e+00 1519 1536 -4.16666666666667e+00 1519 1866 4.16666666666667e+00 1519 1783 -1.25000000000000e+01 1519 1782 8.33333333333333e+00 1519 1665 4.16666666666667e+00 1519 1770 -4.16666666666667e+00 1519 1667 4.16666666666667e+00 1519 1772 8.33333333333333e+00 1519 1771 -1.25000000000000e+01 1519 1526 8.33333333333333e+00 1519 1525 -3.75000000000000e+01 1519 1518 -1.66666666666667e+01 1519 1524 8.33333333333333e+00 1519 1517 -4.16666666666667e+00 1519 1520 -1.66666666666667e+01 1519 1661 -4.16666666666667e+00 1519 1673 4.16666666666667e+00 1519 1776 8.33333333333333e+00 1519 1515 8.33333333333333e+00 1519 1671 -8.33333333333333e+00 1519 1337 -8.33333333333333e+00 1519 1778 8.33333333333333e+00 1519 1777 -3.75000000000000e+01 1519 1335 4.16666666666667e+00 1519 1659 -4.16666666666667e+00 1519 1532 8.33333333333333e+00 1519 1298 -8.33333333333333e+00 1519 1832 4.16666666666667e+00 1519 1531 -1.25000000000000e+01 1519 1516 -1.25000000000000e+01 1519 1530 -4.16666666666667e+00 1519 1296 4.16666666666667e+00 1520 1520 1.25000000000000e+02 1520 1831 4.16666666666667e+00 1520 1783 -4.16666666666667e+00 1520 1537 -4.16666666666667e+00 1520 1867 4.16666666666667e+00 1520 1782 8.33333333333333e+00 1520 1866 -8.33333333333333e+00 1520 1536 -4.16666666666667e+00 1520 1784 -1.25000000000000e+01 1520 1770 8.33333333333333e+00 1520 1666 4.16666666666667e+00 1520 1665 -8.33333333333333e+00 1520 1772 -3.75000000000000e+01 1520 1771 8.33333333333333e+00 1520 1335 4.16666666666667e+00 1520 1526 -1.25000000000000e+01 1520 1525 8.33333333333333e+00 1520 1524 -4.16666666666667e+00 1520 1296 4.16666666666667e+00 1520 1516 -4.16666666666667e+00 1520 1519 -1.66666666666667e+01 1520 1776 -4.16666666666667e+00 1520 1660 -4.16666666666667e+00 1520 1672 4.16666666666667e+00 1520 1659 -4.16666666666667e+00 1520 1671 4.16666666666667e+00 1520 1778 -1.25000000000000e+01 1520 1336 -8.33333333333333e+00 1520 1777 8.33333333333333e+00 1520 1830 4.16666666666667e+00 1520 1532 -3.75000000000000e+01 1520 1517 -1.25000000000000e+01 1520 1531 8.33333333333333e+00 1520 1297 -8.33333333333333e+00 1520 1518 -1.66666666666667e+01 1520 1530 8.33333333333333e+00 1520 1515 8.33333333333333e+00 1521 1521 6.25000000000000e+01 1521 1666 4.16666666666667e+00 1521 1667 4.16666666666667e+00 1521 1817 4.16666666666667e+00 1521 1815 -6.25000000000000e+00 1521 1526 4.16666666666667e+00 1521 1525 4.16666666666667e+00 1521 1522 -8.33333333333333e+00 1521 1524 -1.87500000000000e+01 1521 1517 -4.16666666666667e+00 1521 1523 -8.33333333333333e+00 1521 1664 -4.16666666666667e+00 1521 1676 4.16666666666667e+00 1521 1819 4.16666666666667e+00 1521 1516 8.33333333333333e+00 1521 1675 -8.33333333333333e+00 1521 1820 4.16666666666667e+00 1521 1349 -4.16666666666667e+00 1521 1348 2.08333333333333e+00 1521 1663 -4.16666666666667e+00 1521 1818 -1.87500000000000e+01 1521 1535 4.16666666666667e+00 1521 1298 -4.16666666666667e+00 1521 1534 -2.08333333333333e+00 1521 1297 2.08333333333333e+00 1521 1533 -6.25000000000000e+00 1521 1816 -2.08333333333333e+00 1521 1515 -1.25000000000000e+01 1522 1522 6.25000000000000e+01 1522 1815 -2.08333333333333e+00 1522 1665 4.16666666666667e+00 1522 1667 -8.33333333333333e+00 1522 1349 2.08333333333333e+00 1522 1816 -6.25000000000000e+00 1522 1526 -2.08333333333333e+00 1522 1298 2.08333333333333e+00 1522 1525 -6.25000000000000e+00 1522 1524 4.16666666666667e+00 1522 1521 -8.33333333333333e+00 1522 1820 -2.08333333333333e+00 1522 1818 4.16666666666667e+00 1522 1664 -4.16666666666667e+00 1522 1676 4.16666666666667e+00 1522 1515 8.33333333333333e+00 1522 1674 -8.33333333333333e+00 1522 1819 -6.25000000000000e+00 1522 1347 2.08333333333333e+00 1522 1662 -4.16666666666667e+00 1522 1535 4.16666666666667e+00 1522 1523 -8.33333333333333e+00 1522 1517 8.33333333333333e+00 1522 1534 -6.25000000000000e+00 1522 1817 4.16666666666667e+00 1522 1516 -3.75000000000000e+01 1522 1533 -2.08333333333333e+00 1522 1296 2.08333333333333e+00 1523 1523 6.25000000000000e+01 1523 1666 -8.33333333333333e+00 1523 1665 4.16666666666667e+00 1523 1817 -1.87500000000000e+01 1523 1348 2.08333333333333e+00 1523 1815 4.16666666666667e+00 1523 1526 -6.25000000000000e+00 1523 1525 -2.08333333333333e+00 1523 1297 2.08333333333333e+00 1523 1524 4.16666666666667e+00 1523 1515 -4.16666666666667e+00 1523 1819 -2.08333333333333e+00 1523 1521 -8.33333333333333e+00 1523 1662 -4.16666666666667e+00 1523 1674 4.16666666666667e+00 1523 1663 -4.16666666666667e+00 1523 1675 4.16666666666667e+00 1523 1820 -6.25000000000000e+00 1523 1818 4.16666666666667e+00 1523 1347 -4.16666666666667e+00 1523 1535 -1.87500000000000e+01 1523 1816 4.16666666666667e+00 1523 1517 -1.25000000000000e+01 1523 1534 4.16666666666667e+00 1523 1522 -8.33333333333333e+00 1523 1516 8.33333333333333e+00 1523 1533 4.16666666666667e+00 1523 1296 -4.16666666666667e+00 1524 1524 6.25000000000000e+01 1524 1525 -8.33333333333333e+00 1524 1538 -4.16666666666667e+00 1524 1297 -2.08333333333333e+00 1524 1537 2.08333333333333e+00 1524 1832 4.16666666666667e+00 1524 1354 -2.08333333333333e+00 1524 1830 -1.87500000000000e+01 1524 1816 2.08333333333333e+00 1524 1355 4.16666666666667e+00 1524 1817 -4.16666666666667e+00 1524 1526 -8.33333333333333e+00 1524 1523 4.16666666666667e+00 1524 1298 4.16666666666667e+00 1524 1522 4.16666666666667e+00 1524 1521 -1.87500000000000e+01 1524 1666 -4.16666666666667e+00 1524 1771 4.16666666666667e+00 1524 1772 4.16666666666667e+00 1524 1667 -4.16666666666667e+00 1524 1353 -6.25000000000000e+00 1524 1520 -4.16666666666667e+00 1524 1517 4.16666666666667e+00 1524 1519 8.33333333333333e+00 1524 1516 -8.33333333333333e+00 1524 1518 -1.25000000000000e+01 1524 1831 4.16666666666667e+00 1524 1296 -6.25000000000000e+00 1525 1525 6.25000000000000e+01 1525 1538 2.08333333333333e+00 1525 1830 4.16666666666667e+00 1525 1524 -8.33333333333333e+00 1525 1296 -2.08333333333333e+00 1525 1536 2.08333333333333e+00 1525 1831 -6.25000000000000e+00 1525 1353 -2.08333333333333e+00 1525 1815 2.08333333333333e+00 1525 1817 2.08333333333333e+00 1525 1523 -2.08333333333333e+00 1525 1522 -6.25000000000000e+00 1525 1521 4.16666666666667e+00 1525 1665 -4.16666666666667e+00 1525 1770 4.16666666666667e+00 1525 1667 -4.16666666666667e+00 1525 1517 4.16666666666667e+00 1525 1772 -8.33333333333333e+00 1525 1355 4.16666666666667e+00 1525 1354 -6.25000000000000e+00 1525 1520 8.33333333333333e+00 1525 1526 -8.33333333333333e+00 1525 1298 4.16666666666667e+00 1525 1519 -3.75000000000000e+01 1525 1832 -2.08333333333333e+00 1525 1297 -6.25000000000000e+00 1525 1518 8.33333333333333e+00 1525 1515 -8.33333333333333e+00 1526 1526 6.25000000000000e+01 1526 1537 2.08333333333333e+00 1526 1536 -4.16666666666667e+00 1526 1832 -6.25000000000000e+00 1526 1830 4.16666666666667e+00 1526 1816 2.08333333333333e+00 1526 1353 4.16666666666667e+00 1526 1815 -4.16666666666667e+00 1526 1523 -6.25000000000000e+00 1526 1522 -2.08333333333333e+00 1526 1524 -8.33333333333333e+00 1526 1521 4.16666666666667e+00 1526 1296 4.16666666666667e+00 1526 1666 -4.16666666666667e+00 1526 1516 4.16666666666667e+00 1526 1355 -1.87500000000000e+01 1526 1771 -8.33333333333333e+00 1526 1354 4.16666666666667e+00 1526 1770 4.16666666666667e+00 1526 1665 -4.16666666666667e+00 1526 1520 -1.25000000000000e+01 1526 1831 -2.08333333333333e+00 1526 1298 -1.87500000000000e+01 1526 1519 8.33333333333333e+00 1526 1525 -8.33333333333333e+00 1526 1297 4.16666666666667e+00 1526 1518 -4.16666666666667e+00 1526 1515 4.16666666666667e+00 1527 1527 6.25000000000000e+01 1527 1676 -8.33333333333333e+00 1527 1675 4.16666666666667e+00 1527 1367 2.08333333333333e+00 1527 1855 4.16666666666667e+00 1527 1854 -1.87500000000000e+01 1527 1535 -2.08333333333333e+00 1527 1298 2.08333333333333e+00 1527 1534 4.16666666666667e+00 1527 1533 -6.25000000000000e+00 1527 1670 -4.16666666666667e+00 1527 1669 -4.16666666666667e+00 1527 1673 4.16666666666667e+00 1527 1853 -2.08333333333333e+00 1527 1528 -8.33333333333333e+00 1527 1672 4.16666666666667e+00 1527 1516 -4.16666666666667e+00 1527 1366 -4.16666666666667e+00 1527 1852 4.16666666666667e+00 1527 1851 -6.25000000000000e+00 1527 1529 -8.33333333333333e+00 1527 1532 4.16666666666667e+00 1527 1517 8.33333333333333e+00 1527 1531 4.16666666666667e+00 1527 1297 -4.16666666666667e+00 1527 1856 4.16666666666667e+00 1527 1530 -1.87500000000000e+01 1527 1515 -1.25000000000000e+01 1528 1528 6.25000000000000e+01 1528 1676 4.16666666666667e+00 1528 1674 4.16666666666667e+00 1528 1855 -6.25000000000000e+00 1528 1854 4.16666666666667e+00 1528 1535 4.16666666666667e+00 1528 1529 -8.33333333333333e+00 1528 1534 -1.87500000000000e+01 1528 1533 4.16666666666667e+00 1528 1668 -4.16666666666667e+00 1528 1853 4.16666666666667e+00 1528 1527 -8.33333333333333e+00 1528 1673 -8.33333333333333e+00 1528 1517 8.33333333333333e+00 1528 1671 4.16666666666667e+00 1528 1515 -4.16666666666667e+00 1528 1367 2.08333333333333e+00 1528 1670 -4.16666666666667e+00 1528 1852 -1.87500000000000e+01 1528 1365 -4.16666666666667e+00 1528 1851 4.16666666666667e+00 1528 1532 -2.08333333333333e+00 1528 1298 2.08333333333333e+00 1528 1856 -2.08333333333333e+00 1528 1531 -6.25000000000000e+00 1528 1516 -1.25000000000000e+01 1528 1530 4.16666666666667e+00 1528 1296 -4.16666666666667e+00 1529 1529 6.25000000000000e+01 1529 1675 4.16666666666667e+00 1529 1854 4.16666666666667e+00 1529 1674 -8.33333333333333e+00 1529 1856 -6.25000000000000e+00 1529 1365 2.08333333333333e+00 1529 1535 -6.25000000000000e+00 1529 1534 4.16666666666667e+00 1529 1528 -8.33333333333333e+00 1529 1533 -2.08333333333333e+00 1529 1296 2.08333333333333e+00 1529 1668 -4.16666666666667e+00 1529 1852 4.16666666666667e+00 1529 1671 4.16666666666667e+00 1529 1851 -2.08333333333333e+00 1529 1672 -8.33333333333333e+00 1529 1516 8.33333333333333e+00 1529 1853 -6.25000000000000e+00 1529 1366 2.08333333333333e+00 1529 1669 -4.16666666666667e+00 1529 1855 -2.08333333333333e+00 1529 1532 -6.25000000000000e+00 1529 1517 -3.75000000000000e+01 1529 1531 -2.08333333333333e+00 1529 1297 2.08333333333333e+00 1529 1527 -8.33333333333333e+00 1529 1530 4.16666666666667e+00 1529 1515 8.33333333333333e+00 1530 1530 6.25000000000000e+01 1530 1868 4.16666666666667e+00 1530 1298 -2.08333333333333e+00 1530 1538 2.08333333333333e+00 1530 1537 -4.16666666666667e+00 1530 1373 -2.08333333333333e+00 1530 1867 4.16666666666667e+00 1530 1866 -1.87500000000000e+01 1530 1778 4.16666666666667e+00 1530 1777 4.16666666666667e+00 1530 1520 8.33333333333333e+00 1530 1519 -4.16666666666667e+00 1530 1518 -1.25000000000000e+01 1530 1673 -4.16666666666667e+00 1530 1853 2.08333333333333e+00 1530 1672 -4.16666666666667e+00 1530 1516 4.16666666666667e+00 1530 1852 -4.16666666666667e+00 1530 1372 4.16666666666667e+00 1530 1371 -6.25000000000000e+00 1530 1529 4.16666666666667e+00 1530 1517 -8.33333333333333e+00 1530 1528 4.16666666666667e+00 1530 1531 -8.33333333333333e+00 1530 1297 4.16666666666667e+00 1530 1527 -1.87500000000000e+01 1530 1532 -8.33333333333333e+00 1530 1296 -6.25000000000000e+00 1531 1531 6.25000000000000e+01 1531 1868 -2.08333333333333e+00 1531 1536 -4.16666666666667e+00 1531 1867 -6.25000000000000e+00 1531 1866 4.16666666666667e+00 1531 1778 -8.33333333333333e+00 1531 1373 4.16666666666667e+00 1531 1776 4.16666666666667e+00 1531 1520 8.33333333333333e+00 1531 1532 -8.33333333333333e+00 1531 1298 4.16666666666667e+00 1531 1519 -1.25000000000000e+01 1531 1518 -4.16666666666667e+00 1531 1671 -4.16666666666667e+00 1531 1515 4.16666666666667e+00 1531 1853 2.08333333333333e+00 1531 1673 -4.16666666666667e+00 1531 1372 -1.87500000000000e+01 1531 1851 -4.16666666666667e+00 1531 1371 4.16666666666667e+00 1531 1529 -2.08333333333333e+00 1531 1517 4.16666666666667e+00 1531 1528 -6.25000000000000e+00 1531 1538 2.08333333333333e+00 1531 1297 -1.87500000000000e+01 1531 1527 4.16666666666667e+00 1531 1530 -8.33333333333333e+00 1531 1296 4.16666666666667e+00 1532 1532 6.25000000000000e+01 1532 1867 -2.08333333333333e+00 1532 1530 -8.33333333333333e+00 1532 1866 4.16666666666667e+00 1532 1296 -2.08333333333333e+00 1532 1536 2.08333333333333e+00 1532 1868 -6.25000000000000e+00 1532 1371 -2.08333333333333e+00 1532 1776 4.16666666666667e+00 1532 1777 -8.33333333333333e+00 1532 1372 4.16666666666667e+00 1532 1520 -3.75000000000000e+01 1532 1519 8.33333333333333e+00 1532 1531 -8.33333333333333e+00 1532 1297 4.16666666666667e+00 1532 1518 8.33333333333333e+00 1532 1671 -4.16666666666667e+00 1532 1851 2.08333333333333e+00 1532 1373 -6.25000000000000e+00 1532 1852 2.08333333333333e+00 1532 1672 -4.16666666666667e+00 1532 1529 -6.25000000000000e+00 1532 1537 2.08333333333333e+00 1532 1298 -6.25000000000000e+00 1532 1528 -2.08333333333333e+00 1532 1516 4.16666666666667e+00 1532 1527 4.16666666666667e+00 1532 1515 -8.33333333333333e+00 1533 1533 3.75000000000000e+01 1533 1820 -4.16666666666667e+00 1533 1819 2.08333333333333e+00 1533 1535 -4.16666666666667e+00 1533 1523 4.16666666666667e+00 1533 1298 2.08333333333333e+00 1533 1522 -2.08333333333333e+00 1533 1521 -6.25000000000000e+00 1533 1675 -4.16666666666667e+00 1533 1516 4.16666666666667e+00 1533 1856 2.08333333333333e+00 1533 1676 -4.16666666666667e+00 1533 1378 2.08333333333333e+00 1533 1855 -4.16666666666667e+00 1533 1377 -1.25000000000000e+01 1533 1529 -2.08333333333333e+00 1533 1517 4.16666666666667e+00 1533 1534 -4.16666666666667e+00 1533 1528 4.16666666666667e+00 1533 1297 2.08333333333333e+00 1533 1379 2.08333333333333e+00 1533 1527 -6.25000000000000e+00 1533 1296 -1.25000000000000e+01 1534 1534 3.33333333333333e+01 1534 1818 2.08333333333333e+00 1534 1523 4.16666666666667e+00 1534 1522 -6.25000000000000e+00 1534 1521 -2.08333333333333e+00 1534 1856 2.08333333333333e+00 1534 1676 -4.16666666666667e+00 1534 1674 -4.16666666666667e+00 1534 1515 4.16666666666667e+00 1534 1378 -4.16666666666667e+00 1534 1377 2.08333333333333e+00 1534 1854 -4.16666666666667e+00 1534 1529 4.16666666666667e+00 1534 1517 -8.33333333333333e+00 1534 1820 2.08333333333333e+00 1534 1528 -1.87500000000000e+01 1534 1297 -4.16666666666667e+00 1534 1533 -4.16666666666667e+00 1534 1527 4.16666666666667e+00 1534 1296 2.08333333333333e+00 1535 1535 3.33333333333333e+01 1535 1377 2.08333333333333e+00 1535 1818 -4.16666666666667e+00 1535 1523 -1.87500000000000e+01 1535 1522 4.16666666666667e+00 1535 1533 -4.16666666666667e+00 1535 1521 4.16666666666667e+00 1535 1296 2.08333333333333e+00 1535 1855 2.08333333333333e+00 1535 1675 -4.16666666666667e+00 1535 1379 -4.16666666666667e+00 1535 1854 2.08333333333333e+00 1535 1674 -4.16666666666667e+00 1535 1819 2.08333333333333e+00 1535 1529 -6.25000000000000e+00 1535 1298 -4.16666666666667e+00 1535 1528 4.16666666666667e+00 1535 1516 -8.33333333333333e+00 1535 1527 -2.08333333333333e+00 1535 1515 4.16666666666667e+00 1536 1536 3.75000000000000e+01 1536 1526 -4.16666666666667e+00 1536 1525 2.08333333333333e+00 1536 1538 -4.16666666666667e+00 1536 1832 4.16666666666667e+00 1536 1382 2.08333333333333e+00 1536 1831 -2.08333333333333e+00 1536 1830 -6.25000000000000e+00 1536 1519 -4.16666666666667e+00 1536 1783 4.16666666666667e+00 1536 1532 2.08333333333333e+00 1536 1520 -4.16666666666667e+00 1536 1297 2.08333333333333e+00 1536 1531 -4.16666666666667e+00 1536 1296 -1.25000000000000e+01 1536 1868 -2.08333333333333e+00 1536 1784 4.16666666666667e+00 1536 1537 -4.16666666666667e+00 1536 1867 4.16666666666667e+00 1536 1381 2.08333333333333e+00 1536 1298 2.08333333333333e+00 1536 1866 -6.25000000000000e+00 1536 1380 -1.25000000000000e+01 1537 1537 3.33333333333333e+01 1537 1524 2.08333333333333e+00 1537 1832 4.16666666666667e+00 1537 1831 -6.25000000000000e+00 1537 1830 -2.08333333333333e+00 1537 1532 2.08333333333333e+00 1537 1520 -4.16666666666667e+00 1537 1518 -4.16666666666667e+00 1537 1782 4.16666666666667e+00 1537 1297 -4.16666666666667e+00 1537 1296 2.08333333333333e+00 1537 1530 -4.16666666666667e+00 1537 1868 4.16666666666667e+00 1537 1784 -8.33333333333333e+00 1537 1526 2.08333333333333e+00 1537 1867 -1.87500000000000e+01 1537 1381 -4.16666666666667e+00 1537 1536 -4.16666666666667e+00 1537 1866 4.16666666666667e+00 1537 1380 2.08333333333333e+00 1538 1538 3.33333333333333e+01 1538 1296 2.08333333333333e+00 1538 1524 -4.16666666666667e+00 1538 1832 -1.87500000000000e+01 1538 1831 4.16666666666667e+00 1538 1536 -4.16666666666667e+00 1538 1830 4.16666666666667e+00 1538 1380 2.08333333333333e+00 1538 1531 2.08333333333333e+00 1538 1519 -4.16666666666667e+00 1538 1298 -4.16666666666667e+00 1538 1530 2.08333333333333e+00 1538 1518 -4.16666666666667e+00 1538 1525 2.08333333333333e+00 1538 1868 -6.25000000000000e+00 1538 1382 -4.16666666666667e+00 1538 1867 4.16666666666667e+00 1538 1783 -8.33333333333333e+00 1538 1866 -2.08333333333333e+00 1538 1782 4.16666666666667e+00 1539 1539 1.25000000000000e+02 1539 1543 8.33333333333333e+00 1539 1542 -1.25000000000000e+01 1539 1790 -8.33333333333333e+00 1539 1789 4.16666666666667e+00 1539 1802 8.33333333333333e+00 1539 1549 4.16666666666667e+00 1539 1801 8.33333333333333e+00 1539 1800 -3.75000000000000e+01 1539 1550 4.16666666666667e+00 1539 1792 -4.16666666666667e+00 1539 1793 8.33333333333333e+00 1539 1541 -1.66666666666667e+01 1539 1340 -4.16666666666667e+00 1539 1791 -1.25000000000000e+01 1539 1787 4.16666666666667e+00 1539 1540 -1.66666666666667e+01 1539 1786 4.16666666666667e+00 1539 1339 -4.16666666666667e+00 1539 1799 -4.16666666666667e+00 1539 1796 4.16666666666667e+00 1539 1546 -4.16666666666667e+00 1539 1795 -8.33333333333333e+00 1539 1798 8.33333333333333e+00 1539 1797 -1.25000000000000e+01 1539 1547 8.33333333333333e+00 1539 1545 -1.25000000000000e+01 1539 1544 -4.16666666666667e+00 1539 281 4.16666666666667e+00 1539 29 -4.16666666666667e+00 1539 280 -8.33333333333333e+00 1539 277 8.33333333333333e+00 1539 278 8.33333333333333e+00 1539 28 -4.16666666666667e+00 1539 276 -3.75000000000000e+01 1539 283 4.16666666666667e+00 1539 284 -8.33333333333333e+00 1540 1540 1.25000000000000e+02 1540 1542 8.33333333333333e+00 1540 1544 8.33333333333333e+00 1540 1543 -3.75000000000000e+01 1540 1788 4.16666666666667e+00 1540 1802 -4.16666666666667e+00 1540 1548 4.16666666666667e+00 1540 1801 -1.25000000000000e+01 1540 1800 8.33333333333333e+00 1540 1550 -8.33333333333333e+00 1540 1791 -4.16666666666667e+00 1540 1793 8.33333333333333e+00 1540 1792 -1.25000000000000e+01 1540 1539 -1.66666666666667e+01 1540 1787 -8.33333333333333e+00 1540 1785 4.16666666666667e+00 1540 1338 -4.16666666666667e+00 1540 1799 8.33333333333333e+00 1540 1541 -1.66666666666667e+01 1540 1547 8.33333333333333e+00 1540 1545 -4.16666666666667e+00 1540 1796 4.16666666666667e+00 1540 1340 -4.16666666666667e+00 1540 1798 -3.75000000000000e+01 1540 1794 -8.33333333333333e+00 1540 1797 8.33333333333333e+00 1540 1546 -1.25000000000000e+01 1540 1790 4.16666666666667e+00 1540 281 4.16666666666667e+00 1540 279 -8.33333333333333e+00 1540 278 -4.16666666666667e+00 1540 276 8.33333333333333e+00 1540 277 -1.25000000000000e+01 1540 27 -4.16666666666667e+00 1540 282 4.16666666666667e+00 1540 284 4.16666666666667e+00 1540 29 -4.16666666666667e+00 1541 1541 1.25000000000000e+02 1541 1789 4.16666666666667e+00 1541 1544 -1.25000000000000e+01 1541 1543 8.33333333333333e+00 1541 1788 -8.33333333333333e+00 1541 1801 -4.16666666666667e+00 1541 1800 8.33333333333333e+00 1541 1802 -1.25000000000000e+01 1541 1549 -8.33333333333333e+00 1541 1548 4.16666666666667e+00 1541 1791 8.33333333333333e+00 1541 1539 -1.66666666666667e+01 1541 1793 -3.75000000000000e+01 1541 1792 8.33333333333333e+00 1541 1338 -4.16666666666667e+00 1541 1785 4.16666666666667e+00 1541 1786 -8.33333333333333e+00 1541 1797 -4.16666666666667e+00 1541 1794 4.16666666666667e+00 1541 1798 8.33333333333333e+00 1541 1540 -1.66666666666667e+01 1541 1546 8.33333333333333e+00 1541 1799 -1.25000000000000e+01 1541 1795 4.16666666666667e+00 1541 1339 -4.16666666666667e+00 1541 1547 -3.75000000000000e+01 1541 1542 -4.16666666666667e+00 1541 1545 8.33333333333333e+00 1541 280 4.16666666666667e+00 1541 279 4.16666666666667e+00 1541 27 -4.16666666666667e+00 1541 277 -4.16666666666667e+00 1541 278 -1.25000000000000e+01 1541 276 8.33333333333333e+00 1541 283 4.16666666666667e+00 1541 28 -4.16666666666667e+00 1541 282 -8.33333333333333e+00 1542 1542 6.25000000000000e+01 1542 1792 4.16666666666667e+00 1542 1793 4.16666666666667e+00 1542 1835 4.16666666666667e+00 1542 1833 -6.25000000000000e+00 1542 1543 -8.33333333333333e+00 1542 1541 -4.16666666666667e+00 1542 1544 -8.33333333333333e+00 1542 1790 -4.16666666666667e+00 1542 1802 4.16666666666667e+00 1542 1837 4.16666666666667e+00 1542 1540 8.33333333333333e+00 1542 1801 -8.33333333333333e+00 1542 1838 4.16666666666667e+00 1542 1358 -4.16666666666667e+00 1542 1357 2.08333333333333e+00 1542 1789 -4.16666666666667e+00 1542 1836 -1.87500000000000e+01 1542 1550 4.16666666666667e+00 1542 1549 -2.08333333333333e+00 1542 1548 -6.25000000000000e+00 1542 1834 -2.08333333333333e+00 1542 1539 -1.25000000000000e+01 1542 281 4.16666666666667e+00 1542 280 4.16666666666667e+00 1542 279 -1.87500000000000e+01 1542 29 -4.16666666666667e+00 1542 28 2.08333333333333e+00 1543 1543 6.25000000000000e+01 1543 1833 -2.08333333333333e+00 1543 1791 4.16666666666667e+00 1543 1793 -8.33333333333333e+00 1543 1358 2.08333333333333e+00 1543 1834 -6.25000000000000e+00 1543 1542 -8.33333333333333e+00 1543 1838 -2.08333333333333e+00 1543 1836 4.16666666666667e+00 1543 1790 -4.16666666666667e+00 1543 1802 4.16666666666667e+00 1543 1539 8.33333333333333e+00 1543 1800 -8.33333333333333e+00 1543 1837 -6.25000000000000e+00 1543 1356 2.08333333333333e+00 1543 1788 -4.16666666666667e+00 1543 1550 4.16666666666667e+00 1543 1544 -8.33333333333333e+00 1543 1541 8.33333333333333e+00 1543 1549 -6.25000000000000e+00 1543 1835 4.16666666666667e+00 1543 1540 -3.75000000000000e+01 1543 1548 -2.08333333333333e+00 1543 281 -2.08333333333333e+00 1543 29 2.08333333333333e+00 1543 280 -6.25000000000000e+00 1543 279 4.16666666666667e+00 1543 27 2.08333333333333e+00 1544 1544 6.25000000000000e+01 1544 1792 -8.33333333333333e+00 1544 1791 4.16666666666667e+00 1544 1835 -1.87500000000000e+01 1544 1357 2.08333333333333e+00 1544 1833 4.16666666666667e+00 1544 1539 -4.16666666666667e+00 1544 1837 -2.08333333333333e+00 1544 1542 -8.33333333333333e+00 1544 1788 -4.16666666666667e+00 1544 1800 4.16666666666667e+00 1544 1789 -4.16666666666667e+00 1544 1801 4.16666666666667e+00 1544 1838 -6.25000000000000e+00 1544 1836 4.16666666666667e+00 1544 1356 -4.16666666666667e+00 1544 1550 -1.87500000000000e+01 1544 1834 4.16666666666667e+00 1544 1541 -1.25000000000000e+01 1544 1549 4.16666666666667e+00 1544 1543 -8.33333333333333e+00 1544 1540 8.33333333333333e+00 1544 1548 4.16666666666667e+00 1544 281 -6.25000000000000e+00 1544 280 -2.08333333333333e+00 1544 28 2.08333333333333e+00 1544 279 4.16666666666667e+00 1544 27 -4.16666666666667e+00 1545 1545 6.25000000000000e+01 1545 1802 -8.33333333333333e+00 1545 1801 4.16666666666667e+00 1545 1376 2.08333333333333e+00 1545 1873 4.16666666666667e+00 1545 1872 -1.87500000000000e+01 1545 1550 -2.08333333333333e+00 1545 1549 4.16666666666667e+00 1545 1548 -6.25000000000000e+00 1545 1796 -4.16666666666667e+00 1545 1795 -4.16666666666667e+00 1545 1799 4.16666666666667e+00 1545 1871 -2.08333333333333e+00 1545 1546 -8.33333333333333e+00 1545 1798 4.16666666666667e+00 1545 1540 -4.16666666666667e+00 1545 1375 -4.16666666666667e+00 1545 1870 4.16666666666667e+00 1545 1869 -6.25000000000000e+00 1545 1547 -8.33333333333333e+00 1545 1541 8.33333333333333e+00 1545 1874 4.16666666666667e+00 1545 1539 -1.25000000000000e+01 1545 29 2.08333333333333e+00 1545 284 4.16666666666667e+00 1545 283 4.16666666666667e+00 1545 28 -4.16666666666667e+00 1545 282 -1.87500000000000e+01 1546 1546 6.25000000000000e+01 1546 1802 4.16666666666667e+00 1546 1800 4.16666666666667e+00 1546 1873 -6.25000000000000e+00 1546 1872 4.16666666666667e+00 1546 1550 4.16666666666667e+00 1546 1547 -8.33333333333333e+00 1546 1549 -1.87500000000000e+01 1546 1548 4.16666666666667e+00 1546 1794 -4.16666666666667e+00 1546 1871 4.16666666666667e+00 1546 1545 -8.33333333333333e+00 1546 1799 -8.33333333333333e+00 1546 1541 8.33333333333333e+00 1546 1797 4.16666666666667e+00 1546 1539 -4.16666666666667e+00 1546 1376 2.08333333333333e+00 1546 1796 -4.16666666666667e+00 1546 1870 -1.87500000000000e+01 1546 1374 -4.16666666666667e+00 1546 1869 4.16666666666667e+00 1546 1874 -2.08333333333333e+00 1546 1540 -1.25000000000000e+01 1546 284 -2.08333333333333e+00 1546 29 2.08333333333333e+00 1546 283 -6.25000000000000e+00 1546 282 4.16666666666667e+00 1546 27 -4.16666666666667e+00 1547 1547 6.25000000000000e+01 1547 1801 4.16666666666667e+00 1547 1872 4.16666666666667e+00 1547 1800 -8.33333333333333e+00 1547 1874 -6.25000000000000e+00 1547 1374 2.08333333333333e+00 1547 1550 -6.25000000000000e+00 1547 1549 4.16666666666667e+00 1547 1546 -8.33333333333333e+00 1547 1548 -2.08333333333333e+00 1547 1794 -4.16666666666667e+00 1547 1870 4.16666666666667e+00 1547 1797 4.16666666666667e+00 1547 1869 -2.08333333333333e+00 1547 1798 -8.33333333333333e+00 1547 1540 8.33333333333333e+00 1547 1871 -6.25000000000000e+00 1547 1375 2.08333333333333e+00 1547 1795 -4.16666666666667e+00 1547 1873 -2.08333333333333e+00 1547 1541 -3.75000000000000e+01 1547 1545 -8.33333333333333e+00 1547 1539 8.33333333333333e+00 1547 27 2.08333333333333e+00 1547 284 -6.25000000000000e+00 1547 283 -2.08333333333333e+00 1547 28 2.08333333333333e+00 1547 282 4.16666666666667e+00 1548 1548 3.75000000000000e+01 1548 1838 -4.16666666666667e+00 1548 1837 2.08333333333333e+00 1548 1550 -4.16666666666667e+00 1548 1544 4.16666666666667e+00 1548 1543 -2.08333333333333e+00 1548 1542 -6.25000000000000e+00 1548 1801 -4.16666666666667e+00 1548 1540 4.16666666666667e+00 1548 1874 2.08333333333333e+00 1548 1802 -4.16666666666667e+00 1548 1381 2.08333333333333e+00 1548 1873 -4.16666666666667e+00 1548 1380 -1.25000000000000e+01 1548 1547 -2.08333333333333e+00 1548 1541 4.16666666666667e+00 1548 1549 -4.16666666666667e+00 1548 1546 4.16666666666667e+00 1548 1382 2.08333333333333e+00 1548 1545 -6.25000000000000e+00 1548 29 2.08333333333333e+00 1548 28 2.08333333333333e+00 1548 27 -1.25000000000000e+01 1549 1549 3.33333333333333e+01 1549 1836 2.08333333333333e+00 1549 1544 4.16666666666667e+00 1549 1543 -6.25000000000000e+00 1549 1542 -2.08333333333333e+00 1549 1874 2.08333333333333e+00 1549 1802 -4.16666666666667e+00 1549 1800 -4.16666666666667e+00 1549 1539 4.16666666666667e+00 1549 1381 -4.16666666666667e+00 1549 1380 2.08333333333333e+00 1549 1872 -4.16666666666667e+00 1549 1547 4.16666666666667e+00 1549 1541 -8.33333333333333e+00 1549 1838 2.08333333333333e+00 1549 1546 -1.87500000000000e+01 1549 1548 -4.16666666666667e+00 1549 1545 4.16666666666667e+00 1549 28 -4.16666666666667e+00 1549 27 2.08333333333333e+00 1550 1550 3.33333333333333e+01 1550 1380 2.08333333333333e+00 1550 1836 -4.16666666666667e+00 1550 1544 -1.87500000000000e+01 1550 1543 4.16666666666667e+00 1550 1548 -4.16666666666667e+00 1550 1542 4.16666666666667e+00 1550 1873 2.08333333333333e+00 1550 1801 -4.16666666666667e+00 1550 1382 -4.16666666666667e+00 1550 1872 2.08333333333333e+00 1550 1800 -4.16666666666667e+00 1550 1837 2.08333333333333e+00 1550 1547 -6.25000000000000e+00 1550 1546 4.16666666666667e+00 1550 1540 -8.33333333333333e+00 1550 1545 -2.08333333333333e+00 1550 1539 4.16666666666667e+00 1550 27 2.08333333333333e+00 1550 29 -4.16666666666667e+00 1551 1551 6.25000000000000e+01 1551 1595 -4.16666666666667e+00 1551 1567 4.16666666666667e+00 1551 1594 -4.16666666666667e+00 1551 1591 -4.16666666666667e+00 1551 1562 4.16666666666667e+00 1551 1568 -8.33333333333333e+00 1551 1561 4.16666666666667e+00 1551 1560 -1.87500000000000e+01 1551 1391 4.16666666666667e+00 1551 1553 -8.33333333333333e+00 1551 1559 8.33333333333333e+00 1551 1588 4.16666666666667e+00 1551 1558 -4.16666666666667e+00 1551 1301 -2.08333333333333e+00 1551 1385 2.08333333333333e+00 1551 1300 4.16666666666667e+00 1551 1384 -4.16666666666667e+00 1551 1299 -6.25000000000000e+00 1551 1557 -1.25000000000000e+01 1551 1307 -2.08333333333333e+00 1551 1589 4.16666666666667e+00 1551 1552 -8.33333333333333e+00 1551 1306 4.16666666666667e+00 1551 1390 4.16666666666667e+00 1551 1592 2.08333333333333e+00 1551 1305 -6.25000000000000e+00 1551 1389 -1.87500000000000e+01 1552 1552 6.25000000000000e+01 1552 1593 -4.16666666666667e+00 1552 1592 2.08333333333333e+00 1552 1595 -4.16666666666667e+00 1552 1590 -4.16666666666667e+00 1552 1562 -2.08333333333333e+00 1552 1568 4.16666666666667e+00 1552 1561 -6.25000000000000e+00 1552 1560 4.16666666666667e+00 1552 1391 -2.08333333333333e+00 1552 1385 2.08333333333333e+00 1552 1587 4.16666666666667e+00 1552 1557 -4.16666666666667e+00 1552 1301 4.16666666666667e+00 1552 1553 -8.33333333333333e+00 1552 1559 8.33333333333333e+00 1552 1300 -1.87500000000000e+01 1552 1558 -1.25000000000000e+01 1552 1299 4.16666666666667e+00 1552 1383 -4.16666666666667e+00 1552 1307 4.16666666666667e+00 1552 1589 -8.33333333333333e+00 1552 1566 4.16666666666667e+00 1552 1306 -1.87500000000000e+01 1552 1390 -6.25000000000000e+00 1552 1551 -8.33333333333333e+00 1552 1305 4.16666666666667e+00 1552 1389 4.16666666666667e+00 1553 1553 6.25000000000000e+01 1553 1593 -4.16666666666667e+00 1553 1591 2.08333333333333e+00 1553 1594 -4.16666666666667e+00 1553 1562 -6.25000000000000e+00 1553 1561 -2.08333333333333e+00 1553 1567 4.16666666666667e+00 1553 1560 4.16666666666667e+00 1553 1566 -8.33333333333333e+00 1553 1390 -2.08333333333333e+00 1553 1384 2.08333333333333e+00 1553 1389 4.16666666666667e+00 1553 1551 -8.33333333333333e+00 1553 1557 8.33333333333333e+00 1553 1301 -6.25000000000000e+00 1553 1559 -3.75000000000000e+01 1553 1300 4.16666666666667e+00 1553 1552 -8.33333333333333e+00 1553 1558 8.33333333333333e+00 1553 1299 -2.08333333333333e+00 1553 1383 2.08333333333333e+00 1553 1590 2.08333333333333e+00 1553 1307 -6.25000000000000e+00 1553 1391 -6.25000000000000e+00 1553 1306 4.16666666666667e+00 1553 1588 -8.33333333333333e+00 1553 1305 -2.08333333333333e+00 1553 1587 4.16666666666667e+00 1554 1554 6.25000000000000e+01 1554 1565 4.16666666666667e+00 1554 1564 4.16666666666667e+00 1554 1563 -1.87500000000000e+01 1554 1628 -4.16666666666667e+00 1554 1630 -4.16666666666667e+00 1554 1568 4.16666666666667e+00 1554 1567 -8.33333333333333e+00 1554 1631 -4.16666666666667e+00 1554 1625 4.16666666666667e+00 1554 1559 -4.16666666666667e+00 1554 1555 -8.33333333333333e+00 1554 1558 8.33333333333333e+00 1554 1396 4.16666666666667e+00 1554 1301 4.16666666666667e+00 1554 1385 -4.16666666666667e+00 1554 1300 -2.08333333333333e+00 1554 1384 2.08333333333333e+00 1554 1299 -6.25000000000000e+00 1554 1557 -1.25000000000000e+01 1554 1556 -8.33333333333333e+00 1554 1313 4.16666666666667e+00 1554 1397 4.16666666666667e+00 1554 1312 -2.08333333333333e+00 1554 1624 4.16666666666667e+00 1554 1627 2.08333333333333e+00 1554 1311 -6.25000000000000e+00 1554 1395 -1.87500000000000e+01 1555 1555 6.25000000000000e+01 1555 1565 -2.08333333333333e+00 1555 1564 -6.25000000000000e+00 1555 1563 4.16666666666667e+00 1555 1628 2.08333333333333e+00 1555 1568 4.16666666666667e+00 1555 1631 -4.16666666666667e+00 1555 1629 -4.16666666666667e+00 1555 1566 -8.33333333333333e+00 1555 1385 2.08333333333333e+00 1555 1397 -2.08333333333333e+00 1555 1554 -8.33333333333333e+00 1555 1557 8.33333333333333e+00 1555 1395 4.16666666666667e+00 1555 1301 4.16666666666667e+00 1555 1556 -8.33333333333333e+00 1555 1559 8.33333333333333e+00 1555 1300 -6.25000000000000e+00 1555 1558 -3.75000000000000e+01 1555 1299 -2.08333333333333e+00 1555 1383 2.08333333333333e+00 1555 1313 4.16666666666667e+00 1555 1625 -8.33333333333333e+00 1555 1626 2.08333333333333e+00 1555 1312 -6.25000000000000e+00 1555 1396 -6.25000000000000e+00 1555 1311 -2.08333333333333e+00 1555 1623 4.16666666666667e+00 1556 1556 6.25000000000000e+01 1556 1564 -2.08333333333333e+00 1556 1563 4.16666666666667e+00 1556 1627 2.08333333333333e+00 1556 1626 -4.16666666666667e+00 1556 1567 4.16666666666667e+00 1556 1630 -4.16666666666667e+00 1556 1566 4.16666666666667e+00 1556 1629 -4.16666666666667e+00 1556 1623 4.16666666666667e+00 1556 1557 -4.16666666666667e+00 1556 1384 2.08333333333333e+00 1556 1396 -2.08333333333333e+00 1556 1301 -1.87500000000000e+01 1556 1559 -1.25000000000000e+01 1556 1300 4.16666666666667e+00 1556 1555 -8.33333333333333e+00 1556 1558 8.33333333333333e+00 1556 1299 4.16666666666667e+00 1556 1383 -4.16666666666667e+00 1556 1565 -6.25000000000000e+00 1556 1313 -1.87500000000000e+01 1556 1397 -6.25000000000000e+00 1556 1312 4.16666666666667e+00 1556 1624 -8.33333333333333e+00 1556 1554 -8.33333333333333e+00 1556 1311 4.16666666666667e+00 1556 1395 4.16666666666667e+00 1557 1557 1.25000000000000e+02 1557 1594 -8.33333333333333e+00 1557 1553 8.33333333333333e+00 1557 1390 4.16666666666667e+00 1557 1552 -4.16666666666667e+00 1557 1391 -8.33333333333333e+00 1557 1551 -1.25000000000000e+01 1557 1589 -4.16666666666667e+00 1557 1588 8.33333333333333e+00 1557 1587 -1.25000000000000e+01 1557 1660 -4.16666666666667e+00 1557 1568 8.33333333333333e+00 1557 1631 -8.33333333333333e+00 1557 1630 4.16666666666667e+00 1557 1301 4.16666666666667e+00 1557 1567 8.33333333333333e+00 1557 1558 -1.66666666666667e+01 1557 1566 -3.75000000000000e+01 1557 1661 -4.16666666666667e+00 1557 1319 4.16666666666667e+00 1557 1556 -4.16666666666667e+00 1557 1555 8.33333333333333e+00 1557 1385 -4.16666666666667e+00 1557 1397 4.16666666666667e+00 1557 1402 8.33333333333333e+00 1557 1396 -8.33333333333333e+00 1557 1300 4.16666666666667e+00 1557 1384 -4.16666666666667e+00 1557 1554 -1.25000000000000e+01 1557 1559 -1.66666666666667e+01 1557 1625 8.33333333333333e+00 1557 1403 8.33333333333333e+00 1557 1624 -4.16666666666667e+00 1557 1318 4.16666666666667e+00 1557 1595 4.16666666666667e+00 1557 1623 -1.25000000000000e+01 1557 1401 -3.75000000000000e+01 1558 1558 1.25000000000000e+02 1558 1593 -8.33333333333333e+00 1558 1389 4.16666666666667e+00 1558 1551 -4.16666666666667e+00 1558 1391 4.16666666666667e+00 1558 1553 8.33333333333333e+00 1558 1552 -1.25000000000000e+01 1558 1589 8.33333333333333e+00 1558 1588 -3.75000000000000e+01 1558 1587 8.33333333333333e+00 1558 1661 -4.16666666666667e+00 1558 1659 -4.16666666666667e+00 1558 1568 -4.16666666666667e+00 1558 1631 4.16666666666667e+00 1558 1629 4.16666666666667e+00 1558 1567 -1.25000000000000e+01 1558 1566 8.33333333333333e+00 1558 1557 -1.66666666666667e+01 1558 1403 -4.16666666666667e+00 1558 1559 -1.66666666666667e+01 1558 1385 -4.16666666666667e+00 1558 1397 4.16666666666667e+00 1558 1554 8.33333333333333e+00 1558 1401 8.33333333333333e+00 1558 1395 -8.33333333333333e+00 1558 1301 -8.33333333333333e+00 1558 1556 8.33333333333333e+00 1558 1555 -3.75000000000000e+01 1558 1299 4.16666666666667e+00 1558 1383 -4.16666666666667e+00 1558 1625 8.33333333333333e+00 1558 1319 -8.33333333333333e+00 1558 1595 4.16666666666667e+00 1558 1624 -1.25000000000000e+01 1558 1402 -1.25000000000000e+01 1558 1623 -4.16666666666667e+00 1558 1317 4.16666666666667e+00 1559 1559 1.25000000000000e+02 1559 1593 4.16666666666667e+00 1559 1551 8.33333333333333e+00 1559 1390 4.16666666666667e+00 1559 1389 -8.33333333333333e+00 1559 1553 -3.75000000000000e+01 1559 1552 8.33333333333333e+00 1559 1589 -1.25000000000000e+01 1559 1588 8.33333333333333e+00 1559 1587 -4.16666666666667e+00 1559 1660 -4.16666666666667e+00 1559 1567 -4.16666666666667e+00 1559 1630 4.16666666666667e+00 1559 1566 8.33333333333333e+00 1559 1629 -8.33333333333333e+00 1559 1568 -1.25000000000000e+01 1559 1299 4.16666666666667e+00 1559 1659 -4.16666666666667e+00 1559 1317 4.16666666666667e+00 1559 1402 -4.16666666666667e+00 1559 1558 -1.66666666666667e+01 1559 1554 -4.16666666666667e+00 1559 1384 -4.16666666666667e+00 1559 1396 4.16666666666667e+00 1559 1383 -4.16666666666667e+00 1559 1395 4.16666666666667e+00 1559 1556 -1.25000000000000e+01 1559 1300 -8.33333333333333e+00 1559 1555 8.33333333333333e+00 1559 1594 4.16666666666667e+00 1559 1625 -3.75000000000000e+01 1559 1403 -1.25000000000000e+01 1559 1624 8.33333333333333e+00 1559 1318 -8.33333333333333e+00 1559 1557 -1.66666666666667e+01 1559 1623 8.33333333333333e+00 1559 1401 8.33333333333333e+00 1560 1560 6.25000000000000e+01 1560 1594 4.16666666666667e+00 1560 1595 4.16666666666667e+00 1560 1553 4.16666666666667e+00 1560 1562 -8.33333333333333e+00 1560 1552 4.16666666666667e+00 1560 1551 -1.87500000000000e+01 1560 1591 4.16666666666667e+00 1560 1590 -6.25000000000000e+00 1560 1567 -4.16666666666667e+00 1560 1561 -8.33333333333333e+00 1560 1412 4.16666666666667e+00 1560 1699 -4.16666666666667e+00 1560 1423 4.16666666666667e+00 1560 1568 8.33333333333333e+00 1560 1424 -8.33333333333333e+00 1560 1325 2.08333333333333e+00 1560 1700 -4.16666666666667e+00 1560 1411 4.16666666666667e+00 1560 1324 -4.16666666666667e+00 1560 1410 -1.87500000000000e+01 1560 1406 -2.08333333333333e+00 1560 1301 2.08333333333333e+00 1560 1405 4.16666666666667e+00 1560 1300 -4.16666666666667e+00 1560 1404 -6.25000000000000e+00 1560 1592 -2.08333333333333e+00 1560 1566 -1.25000000000000e+01 1561 1561 6.25000000000000e+01 1561 1593 4.16666666666667e+00 1561 1595 -8.33333333333333e+00 1561 1553 -2.08333333333333e+00 1561 1301 2.08333333333333e+00 1561 1552 -6.25000000000000e+00 1561 1551 4.16666666666667e+00 1561 1325 2.08333333333333e+00 1561 1591 -1.87500000000000e+01 1561 1590 4.16666666666667e+00 1561 1566 -4.16666666666667e+00 1561 1412 -2.08333333333333e+00 1561 1560 -8.33333333333333e+00 1561 1698 -4.16666666666667e+00 1561 1422 4.16666666666667e+00 1561 1700 -4.16666666666667e+00 1561 1424 4.16666666666667e+00 1561 1411 -6.25000000000000e+00 1561 1410 4.16666666666667e+00 1561 1323 -4.16666666666667e+00 1561 1406 4.16666666666667e+00 1561 1562 -8.33333333333333e+00 1561 1568 8.33333333333333e+00 1561 1405 -1.87500000000000e+01 1561 1592 4.16666666666667e+00 1561 1567 -1.25000000000000e+01 1561 1404 4.16666666666667e+00 1561 1299 -4.16666666666667e+00 1562 1562 6.25000000000000e+01 1562 1590 -2.08333333333333e+00 1562 1594 -8.33333333333333e+00 1562 1593 4.16666666666667e+00 1562 1553 -6.25000000000000e+00 1562 1552 -2.08333333333333e+00 1562 1300 2.08333333333333e+00 1562 1551 4.16666666666667e+00 1562 1560 -8.33333333333333e+00 1562 1592 -6.25000000000000e+00 1562 1324 2.08333333333333e+00 1562 1411 -2.08333333333333e+00 1562 1410 4.16666666666667e+00 1562 1699 -4.16666666666667e+00 1562 1423 4.16666666666667e+00 1562 1566 8.33333333333333e+00 1562 1422 -8.33333333333333e+00 1562 1412 -6.25000000000000e+00 1562 1323 2.08333333333333e+00 1562 1698 -4.16666666666667e+00 1562 1406 -6.25000000000000e+00 1562 1591 4.16666666666667e+00 1562 1568 -3.75000000000000e+01 1562 1405 4.16666666666667e+00 1562 1561 -8.33333333333333e+00 1562 1567 8.33333333333333e+00 1562 1404 -2.08333333333333e+00 1562 1299 2.08333333333333e+00 1563 1563 6.25000000000000e+01 1563 1627 -2.08333333333333e+00 1563 1630 4.16666666666667e+00 1563 1628 4.16666666666667e+00 1563 1626 -6.25000000000000e+00 1563 1556 4.16666666666667e+00 1563 1564 -8.33333333333333e+00 1563 1555 4.16666666666667e+00 1563 1554 -1.87500000000000e+01 1563 1736 -4.16666666666667e+00 1563 1565 -8.33333333333333e+00 1563 1417 4.16666666666667e+00 1563 1424 4.16666666666667e+00 1563 1568 -4.16666666666667e+00 1563 1423 -8.33333333333333e+00 1563 1567 8.33333333333333e+00 1563 1418 4.16666666666667e+00 1563 1331 -4.16666666666667e+00 1563 1330 2.08333333333333e+00 1563 1735 -4.16666666666667e+00 1563 1416 -1.87500000000000e+01 1563 1406 4.16666666666667e+00 1563 1301 -4.16666666666667e+00 1563 1405 -2.08333333333333e+00 1563 1300 2.08333333333333e+00 1563 1404 -6.25000000000000e+00 1563 1631 4.16666666666667e+00 1563 1566 -1.25000000000000e+01 1564 1564 6.25000000000000e+01 1564 1631 -8.33333333333333e+00 1564 1626 -2.08333333333333e+00 1564 1629 4.16666666666667e+00 1564 1331 2.08333333333333e+00 1564 1627 -6.25000000000000e+00 1564 1301 2.08333333333333e+00 1564 1556 -2.08333333333333e+00 1564 1555 -6.25000000000000e+00 1564 1563 -8.33333333333333e+00 1564 1554 4.16666666666667e+00 1564 1736 -4.16666666666667e+00 1564 1418 -2.08333333333333e+00 1564 1424 4.16666666666667e+00 1564 1416 4.16666666666667e+00 1564 1422 -8.33333333333333e+00 1564 1566 8.33333333333333e+00 1564 1417 -6.25000000000000e+00 1564 1329 2.08333333333333e+00 1564 1734 -4.16666666666667e+00 1564 1406 4.16666666666667e+00 1564 1565 -8.33333333333333e+00 1564 1568 8.33333333333333e+00 1564 1405 -6.25000000000000e+00 1564 1628 4.16666666666667e+00 1564 1567 -3.75000000000000e+01 1564 1404 -2.08333333333333e+00 1564 1299 2.08333333333333e+00 1565 1565 6.25000000000000e+01 1565 1627 4.16666666666667e+00 1565 1630 -8.33333333333333e+00 1565 1628 -1.87500000000000e+01 1565 1330 2.08333333333333e+00 1565 1626 4.16666666666667e+00 1565 1556 -6.25000000000000e+00 1565 1300 2.08333333333333e+00 1565 1555 -2.08333333333333e+00 1565 1554 4.16666666666667e+00 1565 1735 -4.16666666666667e+00 1565 1734 -4.16666666666667e+00 1565 1417 -2.08333333333333e+00 1565 1423 4.16666666666667e+00 1565 1563 -8.33333333333333e+00 1565 1422 4.16666666666667e+00 1565 1566 -4.16666666666667e+00 1565 1418 -6.25000000000000e+00 1565 1416 4.16666666666667e+00 1565 1329 -4.16666666666667e+00 1565 1406 -1.87500000000000e+01 1565 1629 4.16666666666667e+00 1565 1568 -1.25000000000000e+01 1565 1405 4.16666666666667e+00 1565 1564 -8.33333333333333e+00 1565 1567 8.33333333333333e+00 1565 1404 4.16666666666667e+00 1565 1299 -4.16666666666667e+00 1566 1566 1.25000000000000e+02 1566 1595 -4.16666666666667e+00 1566 1553 -8.33333333333333e+00 1566 1594 8.33333333333333e+00 1566 1593 -1.25000000000000e+01 1566 1561 -4.16666666666667e+00 1566 1562 8.33333333333333e+00 1566 1560 -1.25000000000000e+01 1566 1700 4.16666666666667e+00 1566 1699 -8.33333333333333e+00 1566 1660 4.16666666666667e+00 1566 1630 -4.16666666666667e+00 1566 1568 -1.66666666666667e+01 1566 1559 8.33333333333333e+00 1566 1631 8.33333333333333e+00 1566 1301 -4.16666666666667e+00 1566 1556 4.16666666666667e+00 1566 1558 8.33333333333333e+00 1566 1555 -8.33333333333333e+00 1566 1557 -3.75000000000000e+01 1566 1337 -4.16666666666667e+00 1566 1661 4.16666666666667e+00 1566 1629 -1.25000000000000e+01 1566 1406 4.16666666666667e+00 1566 1565 -4.16666666666667e+00 1566 1423 8.33333333333333e+00 1566 1567 -1.66666666666667e+01 1566 1564 8.33333333333333e+00 1566 1424 8.33333333333333e+00 1566 1736 -8.33333333333333e+00 1566 1735 4.16666666666667e+00 1566 1336 -4.16666666666667e+00 1566 1422 -3.75000000000000e+01 1566 1405 4.16666666666667e+00 1566 1300 -4.16666666666667e+00 1566 1563 -1.25000000000000e+01 1566 1552 4.16666666666667e+00 1567 1567 1.25000000000000e+02 1567 1595 8.33333333333333e+00 1567 1553 4.16666666666667e+00 1567 1594 -3.75000000000000e+01 1567 1593 8.33333333333333e+00 1567 1560 -4.16666666666667e+00 1567 1700 4.16666666666667e+00 1567 1562 8.33333333333333e+00 1567 1561 -1.25000000000000e+01 1567 1698 -8.33333333333333e+00 1567 1568 -1.66666666666667e+01 1567 1337 -4.16666666666667e+00 1567 1301 -4.16666666666667e+00 1567 1659 4.16666666666667e+00 1567 1629 -4.16666666666667e+00 1567 1559 -4.16666666666667e+00 1567 1556 4.16666666666667e+00 1567 1558 -1.25000000000000e+01 1567 1557 8.33333333333333e+00 1567 1554 -8.33333333333333e+00 1567 1661 -8.33333333333333e+00 1567 1631 8.33333333333333e+00 1567 1630 -1.25000000000000e+01 1567 1424 -4.16666666666667e+00 1567 1736 4.16666666666667e+00 1567 1422 8.33333333333333e+00 1567 1566 -1.66666666666667e+01 1567 1563 8.33333333333333e+00 1567 1423 -1.25000000000000e+01 1567 1734 4.16666666666667e+00 1567 1335 -4.16666666666667e+00 1567 1406 -8.33333333333333e+00 1567 1565 8.33333333333333e+00 1567 1564 -3.75000000000000e+01 1567 1551 4.16666666666667e+00 1567 1404 4.16666666666667e+00 1567 1299 -4.16666666666667e+00 1568 1568 1.25000000000000e+02 1568 1593 -4.16666666666667e+00 1568 1552 4.16666666666667e+00 1568 1551 -8.33333333333333e+00 1568 1595 -1.25000000000000e+01 1568 1699 4.16666666666667e+00 1568 1560 8.33333333333333e+00 1568 1562 -3.75000000000000e+01 1568 1561 8.33333333333333e+00 1568 1698 4.16666666666667e+00 1568 1567 -1.66666666666667e+01 1568 1336 -4.16666666666667e+00 1568 1300 -4.16666666666667e+00 1568 1558 -4.16666666666667e+00 1568 1555 4.16666666666667e+00 1568 1566 -1.66666666666667e+01 1568 1557 8.33333333333333e+00 1568 1629 8.33333333333333e+00 1568 1559 -1.25000000000000e+01 1568 1299 -4.16666666666667e+00 1568 1554 4.16666666666667e+00 1568 1631 -3.75000000000000e+01 1568 1660 -8.33333333333333e+00 1568 1630 8.33333333333333e+00 1568 1335 -4.16666666666667e+00 1568 1659 4.16666666666667e+00 1568 1423 -4.16666666666667e+00 1568 1735 4.16666666666667e+00 1568 1404 4.16666666666667e+00 1568 1563 -4.16666666666667e+00 1568 1424 -1.25000000000000e+01 1568 1422 8.33333333333333e+00 1568 1734 -8.33333333333333e+00 1568 1565 -1.25000000000000e+01 1568 1594 8.33333333333333e+00 1568 1405 -8.33333333333333e+00 1568 1564 8.33333333333333e+00 1569 1569 6.25000000000000e+01 1569 1600 -4.16666666666667e+00 1569 1580 -2.08333333333333e+00 1569 1586 4.16666666666667e+00 1569 1579 4.16666666666667e+00 1569 1578 -6.25000000000000e+00 1569 1598 2.08333333333333e+00 1569 1601 -4.16666666666667e+00 1569 1597 -4.16666666666667e+00 1569 1388 2.08333333333333e+00 1569 1391 -2.08333333333333e+00 1569 1588 4.16666666666667e+00 1569 1576 -4.16666666666667e+00 1569 1307 4.16666666666667e+00 1569 1589 -8.33333333333333e+00 1569 1306 4.16666666666667e+00 1569 1570 -8.33333333333333e+00 1569 1390 4.16666666666667e+00 1569 1305 -1.87500000000000e+01 1569 1389 -6.25000000000000e+00 1569 1571 -8.33333333333333e+00 1569 1304 4.16666666666667e+00 1569 1577 8.33333333333333e+00 1569 1303 4.16666666666667e+00 1569 1387 -4.16666666666667e+00 1569 1585 4.16666666666667e+00 1569 1302 -1.87500000000000e+01 1569 1575 -1.25000000000000e+01 1570 1570 6.25000000000000e+01 1570 1601 -4.16666666666667e+00 1570 1584 4.16666666666667e+00 1570 1599 -4.16666666666667e+00 1570 1580 4.16666666666667e+00 1570 1586 -8.33333333333333e+00 1570 1579 -1.87500000000000e+01 1570 1578 4.16666666666667e+00 1570 1596 -4.16666666666667e+00 1570 1571 -8.33333333333333e+00 1570 1391 4.16666666666667e+00 1570 1577 8.33333333333333e+00 1570 1587 4.16666666666667e+00 1570 1575 -4.16666666666667e+00 1570 1307 -2.08333333333333e+00 1570 1589 4.16666666666667e+00 1570 1306 -6.25000000000000e+00 1570 1390 -1.87500000000000e+01 1570 1305 4.16666666666667e+00 1570 1569 -8.33333333333333e+00 1570 1389 4.16666666666667e+00 1570 1304 -2.08333333333333e+00 1570 1388 2.08333333333333e+00 1570 1598 2.08333333333333e+00 1570 1303 -6.25000000000000e+00 1570 1576 -1.25000000000000e+01 1570 1302 4.16666666666667e+00 1570 1386 -4.16666666666667e+00 1571 1571 6.25000000000000e+01 1571 1600 -4.16666666666667e+00 1571 1580 -6.25000000000000e+00 1571 1579 4.16666666666667e+00 1571 1585 -8.33333333333333e+00 1571 1578 -2.08333333333333e+00 1571 1584 4.16666666666667e+00 1571 1596 2.08333333333333e+00 1571 1599 -4.16666666666667e+00 1571 1386 2.08333333333333e+00 1571 1389 -2.08333333333333e+00 1571 1570 -8.33333333333333e+00 1571 1390 4.16666666666667e+00 1571 1576 8.33333333333333e+00 1571 1307 -6.25000000000000e+00 1571 1391 -6.25000000000000e+00 1571 1306 -2.08333333333333e+00 1571 1588 4.16666666666667e+00 1571 1305 4.16666666666667e+00 1571 1587 -8.33333333333333e+00 1571 1597 2.08333333333333e+00 1571 1304 -6.25000000000000e+00 1571 1577 -3.75000000000000e+01 1571 1303 -2.08333333333333e+00 1571 1387 2.08333333333333e+00 1571 1569 -8.33333333333333e+00 1571 1302 4.16666666666667e+00 1571 1575 8.33333333333333e+00 1572 1572 1.25000000000000e+02 1572 1646 4.16666666666667e+00 1572 1582 8.33333333333333e+00 1572 1573 -1.66666666666667e+01 1572 1304 8.33333333333333e+00 1572 1303 -4.16666666666667e+00 1572 1581 -1.25000000000000e+01 1572 1574 -1.66666666666667e+01 1572 1316 8.33333333333333e+00 1572 1645 4.16666666666667e+00 1572 1315 -4.16666666666667e+00 1572 1387 4.16666666666667e+00 1572 1388 4.16666666666667e+00 1572 1302 -1.25000000000000e+01 1572 1400 -4.16666666666667e+00 1572 1399 8.33333333333333e+00 1572 1398 -1.25000000000000e+01 1572 1583 -4.16666666666667e+00 1572 1314 -1.25000000000000e+01 1572 1586 4.16666666666667e+00 1572 1649 -4.16666666666667e+00 1572 1648 -4.16666666666667e+00 1572 1585 -8.33333333333333e+00 1572 1576 8.33333333333333e+00 1572 1643 -8.33333333333333e+00 1572 1642 4.16666666666667e+00 1572 1577 8.33333333333333e+00 1572 1575 -3.75000000000000e+01 1572 2320 8.33333333333333e+00 1572 2318 -8.33333333333333e+00 1572 2317 4.16666666666667e+00 1572 2321 8.33333333333333e+00 1572 2319 -3.75000000000000e+01 1572 2287 -4.16666666666667e+00 1572 2288 -4.16666666666667e+00 1572 2294 4.16666666666667e+00 1572 2293 -8.33333333333333e+00 1573 1573 1.25000000000000e+02 1573 1581 8.33333333333333e+00 1573 1572 -1.66666666666667e+01 1573 1583 8.33333333333333e+00 1573 1582 -3.75000000000000e+01 1573 1302 -4.16666666666667e+00 1573 1646 -8.33333333333333e+00 1573 1644 4.16666666666667e+00 1573 1314 -4.16666666666667e+00 1573 1386 4.16666666666667e+00 1573 1388 -8.33333333333333e+00 1573 1304 8.33333333333333e+00 1573 1303 -1.25000000000000e+01 1573 1400 8.33333333333333e+00 1573 1574 -1.66666666666667e+01 1573 1316 8.33333333333333e+00 1573 1399 -3.75000000000000e+01 1573 1315 -1.25000000000000e+01 1573 1398 8.33333333333333e+00 1573 1647 -4.16666666666667e+00 1573 1586 4.16666666666667e+00 1573 1584 -8.33333333333333e+00 1573 1649 -4.16666666666667e+00 1573 1577 -4.16666666666667e+00 1573 1643 4.16666666666667e+00 1573 1575 8.33333333333333e+00 1573 1641 4.16666666666667e+00 1573 1576 -1.25000000000000e+01 1573 2321 -4.16666666666667e+00 1573 2319 8.33333333333333e+00 1573 2316 4.16666666666667e+00 1573 2320 -1.25000000000000e+01 1573 2286 -4.16666666666667e+00 1573 2288 -4.16666666666667e+00 1573 2294 4.16666666666667e+00 1573 2318 4.16666666666667e+00 1573 2292 -8.33333333333333e+00 1574 1574 1.25000000000000e+02 1574 1581 -4.16666666666667e+00 1574 1644 4.16666666666667e+00 1574 1583 -1.25000000000000e+01 1574 1582 8.33333333333333e+00 1574 1302 8.33333333333333e+00 1574 1645 -8.33333333333333e+00 1574 1572 -1.66666666666667e+01 1574 1314 8.33333333333333e+00 1574 1304 -3.75000000000000e+01 1574 1387 -8.33333333333333e+00 1574 1303 8.33333333333333e+00 1574 1386 4.16666666666667e+00 1574 1400 -1.25000000000000e+01 1574 1316 -3.75000000000000e+01 1574 1399 8.33333333333333e+00 1574 1573 -1.66666666666667e+01 1574 1315 8.33333333333333e+00 1574 1398 -4.16666666666667e+00 1574 1584 4.16666666666667e+00 1574 1647 -4.16666666666667e+00 1574 1585 4.16666666666667e+00 1574 1648 -4.16666666666667e+00 1574 1576 -4.16666666666667e+00 1574 1642 4.16666666666667e+00 1574 1641 -8.33333333333333e+00 1574 1577 -1.25000000000000e+01 1574 1575 8.33333333333333e+00 1574 2320 -4.16666666666667e+00 1574 2316 -8.33333333333333e+00 1574 2321 -1.25000000000000e+01 1574 2319 8.33333333333333e+00 1574 2287 -4.16666666666667e+00 1574 2293 4.16666666666667e+00 1574 2286 -4.16666666666667e+00 1574 2317 4.16666666666667e+00 1574 2292 4.16666666666667e+00 1575 1575 1.25000000000000e+02 1575 1600 -8.33333333333333e+00 1575 1570 -4.16666666666667e+00 1575 1390 4.16666666666667e+00 1575 1391 4.16666666666667e+00 1575 1571 8.33333333333333e+00 1575 1569 -1.25000000000000e+01 1575 1589 8.33333333333333e+00 1575 1588 8.33333333333333e+00 1575 1587 -3.75000000000000e+01 1575 1664 -4.16666666666667e+00 1575 1663 -4.16666666666667e+00 1575 1586 -4.16666666666667e+00 1575 1649 4.16666666666667e+00 1575 1648 4.16666666666667e+00 1575 1585 8.33333333333333e+00 1575 1576 -1.66666666666667e+01 1575 1584 -1.25000000000000e+01 1575 1403 -4.16666666666667e+00 1575 1577 -1.66666666666667e+01 1575 1388 -4.16666666666667e+00 1575 1400 4.16666666666667e+00 1575 1573 8.33333333333333e+00 1575 1402 8.33333333333333e+00 1575 1399 -8.33333333333333e+00 1575 1574 8.33333333333333e+00 1575 1304 -8.33333333333333e+00 1575 1303 4.16666666666667e+00 1575 1387 -4.16666666666667e+00 1575 1572 -3.75000000000000e+01 1575 1643 8.33333333333333e+00 1575 1319 -8.33333333333333e+00 1575 1642 -4.16666666666667e+00 1575 1318 4.16666666666667e+00 1575 1641 -1.25000000000000e+01 1575 1601 4.16666666666667e+00 1575 1401 -1.25000000000000e+01 1576 1576 1.25000000000000e+02 1576 1599 -8.33333333333333e+00 1576 1571 8.33333333333333e+00 1576 1569 -4.16666666666667e+00 1576 1389 4.16666666666667e+00 1576 1391 -8.33333333333333e+00 1576 1570 -1.25000000000000e+01 1576 1589 -4.16666666666667e+00 1576 1588 -1.25000000000000e+01 1576 1587 8.33333333333333e+00 1576 1662 -4.16666666666667e+00 1576 1586 8.33333333333333e+00 1576 1649 -8.33333333333333e+00 1576 1647 4.16666666666667e+00 1576 1304 4.16666666666667e+00 1576 1585 -3.75000000000000e+01 1576 1584 8.33333333333333e+00 1576 1575 -1.66666666666667e+01 1576 1664 -4.16666666666667e+00 1576 1319 4.16666666666667e+00 1576 1574 -4.16666666666667e+00 1576 1572 8.33333333333333e+00 1576 1388 -4.16666666666667e+00 1576 1400 4.16666666666667e+00 1576 1401 8.33333333333333e+00 1576 1398 -8.33333333333333e+00 1576 1573 -1.25000000000000e+01 1576 1302 4.16666666666667e+00 1576 1386 -4.16666666666667e+00 1576 1643 8.33333333333333e+00 1576 1577 -1.66666666666667e+01 1576 1403 8.33333333333333e+00 1576 1642 -1.25000000000000e+01 1576 1601 4.16666666666667e+00 1576 1402 -3.75000000000000e+01 1576 1641 -4.16666666666667e+00 1576 1317 4.16666666666667e+00 1577 1577 1.25000000000000e+02 1577 1600 4.16666666666667e+00 1577 1570 8.33333333333333e+00 1577 1390 -8.33333333333333e+00 1577 1389 4.16666666666667e+00 1577 1571 -3.75000000000000e+01 1577 1569 8.33333333333333e+00 1577 1589 -1.25000000000000e+01 1577 1588 -4.16666666666667e+00 1577 1587 8.33333333333333e+00 1577 1662 -4.16666666666667e+00 1577 1585 8.33333333333333e+00 1577 1584 -4.16666666666667e+00 1577 1647 4.16666666666667e+00 1577 1648 -8.33333333333333e+00 1577 1586 -1.25000000000000e+01 1577 1303 4.16666666666667e+00 1577 1663 -4.16666666666667e+00 1577 1318 4.16666666666667e+00 1577 1401 -4.16666666666667e+00 1577 1573 -4.16666666666667e+00 1577 1575 -1.66666666666667e+01 1577 1386 -4.16666666666667e+00 1577 1398 4.16666666666667e+00 1577 1387 -4.16666666666667e+00 1577 1399 4.16666666666667e+00 1577 1574 -1.25000000000000e+01 1577 1572 8.33333333333333e+00 1577 1302 -8.33333333333333e+00 1577 1643 -3.75000000000000e+01 1577 1599 4.16666666666667e+00 1577 1403 -1.25000000000000e+01 1577 1642 8.33333333333333e+00 1577 1576 -1.66666666666667e+01 1577 1402 8.33333333333333e+00 1577 1641 8.33333333333333e+00 1577 1317 -8.33333333333333e+00 1578 1578 6.25000000000000e+01 1578 1600 4.16666666666667e+00 1578 1601 -8.33333333333333e+00 1578 1304 2.08333333333333e+00 1578 1571 -2.08333333333333e+00 1578 1570 4.16666666666667e+00 1578 1569 -6.25000000000000e+00 1578 1343 2.08333333333333e+00 1578 1597 4.16666666666667e+00 1578 1596 -1.87500000000000e+01 1578 1585 -4.16666666666667e+00 1578 1436 -2.08333333333333e+00 1578 1579 -8.33333333333333e+00 1578 1804 -4.16666666666667e+00 1578 1441 4.16666666666667e+00 1578 1805 -4.16666666666667e+00 1578 1442 4.16666666666667e+00 1578 1342 -4.16666666666667e+00 1578 1435 4.16666666666667e+00 1578 1434 -6.25000000000000e+00 1578 1580 -8.33333333333333e+00 1578 1433 4.16666666666667e+00 1578 1586 8.33333333333333e+00 1578 1432 4.16666666666667e+00 1578 1303 -4.16666666666667e+00 1578 1598 4.16666666666667e+00 1578 1431 -1.87500000000000e+01 1578 1584 -1.25000000000000e+01 1579 1579 6.25000000000000e+01 1579 1599 4.16666666666667e+00 1579 1601 4.16666666666667e+00 1579 1571 4.16666666666667e+00 1579 1580 -8.33333333333333e+00 1579 1570 -1.87500000000000e+01 1579 1569 4.16666666666667e+00 1579 1597 -6.25000000000000e+00 1579 1596 4.16666666666667e+00 1579 1584 -4.16666666666667e+00 1579 1578 -8.33333333333333e+00 1579 1436 4.16666666666667e+00 1579 1803 -4.16666666666667e+00 1579 1440 4.16666666666667e+00 1579 1586 8.33333333333333e+00 1579 1442 -8.33333333333333e+00 1579 1343 2.08333333333333e+00 1579 1805 -4.16666666666667e+00 1579 1435 -1.87500000000000e+01 1579 1341 -4.16666666666667e+00 1579 1434 4.16666666666667e+00 1579 1433 -2.08333333333333e+00 1579 1304 2.08333333333333e+00 1579 1598 -2.08333333333333e+00 1579 1432 -6.25000000000000e+00 1579 1585 -1.25000000000000e+01 1579 1431 4.16666666666667e+00 1579 1302 -4.16666666666667e+00 1580 1580 6.25000000000000e+01 1580 1596 4.16666666666667e+00 1580 1600 4.16666666666667e+00 1580 1599 -8.33333333333333e+00 1580 1571 -6.25000000000000e+00 1580 1570 4.16666666666667e+00 1580 1579 -8.33333333333333e+00 1580 1302 2.08333333333333e+00 1580 1569 -2.08333333333333e+00 1580 1598 -6.25000000000000e+00 1580 1341 2.08333333333333e+00 1580 1434 -2.08333333333333e+00 1580 1435 4.16666666666667e+00 1580 1585 8.33333333333333e+00 1580 1441 -8.33333333333333e+00 1580 1803 -4.16666666666667e+00 1580 1440 4.16666666666667e+00 1580 1436 -6.25000000000000e+00 1580 1342 2.08333333333333e+00 1580 1804 -4.16666666666667e+00 1580 1597 -2.08333333333333e+00 1580 1433 -6.25000000000000e+00 1580 1586 -3.75000000000000e+01 1580 1432 -2.08333333333333e+00 1580 1303 2.08333333333333e+00 1580 1578 -8.33333333333333e+00 1580 1431 4.16666666666667e+00 1580 1584 8.33333333333333e+00 1581 1581 1.25000000000000e+02 1581 1573 8.33333333333333e+00 1581 1303 4.16666666666667e+00 1581 1572 -1.25000000000000e+01 1581 1583 -1.66666666666667e+01 1581 1646 8.33333333333333e+00 1581 1345 4.16666666666667e+00 1581 1645 -4.16666666666667e+00 1581 1644 -1.25000000000000e+01 1581 1433 8.33333333333333e+00 1581 1432 -4.16666666666667e+00 1581 1304 4.16666666666667e+00 1581 1431 -1.25000000000000e+01 1581 1439 -4.16666666666667e+00 1581 1346 4.16666666666667e+00 1581 1582 -1.66666666666667e+01 1581 1438 8.33333333333333e+00 1581 1574 -4.16666666666667e+00 1581 1437 -1.25000000000000e+01 1581 1649 -8.33333333333333e+00 1581 1648 4.16666666666667e+00 1581 1811 -4.16666666666667e+00 1581 1442 4.16666666666667e+00 1581 1441 -8.33333333333333e+00 1581 1585 8.33333333333333e+00 1581 1810 -4.16666666666667e+00 1581 1586 8.33333333333333e+00 1581 1584 -3.75000000000000e+01 1581 2321 4.16666666666667e+00 1581 2320 -8.33333333333333e+00 1581 2317 -4.16666666666667e+00 1581 2062 4.16666666666667e+00 1581 2063 -8.33333333333333e+00 1581 2330 8.33333333333333e+00 1581 2318 -4.16666666666667e+00 1581 2329 8.33333333333333e+00 1581 2328 -3.75000000000000e+01 1582 1582 1.25000000000000e+02 1582 1572 8.33333333333333e+00 1582 1574 8.33333333333333e+00 1582 1573 -3.75000000000000e+01 1582 1302 4.16666666666667e+00 1582 1646 8.33333333333333e+00 1582 1645 -1.25000000000000e+01 1582 1344 4.16666666666667e+00 1582 1644 -4.16666666666667e+00 1582 1583 -1.66666666666667e+01 1582 1431 -4.16666666666667e+00 1582 1304 -8.33333333333333e+00 1582 1433 8.33333333333333e+00 1582 1432 -1.25000000000000e+01 1582 1439 8.33333333333333e+00 1582 1346 -8.33333333333333e+00 1582 1438 -3.75000000000000e+01 1582 1581 -1.66666666666667e+01 1582 1437 8.33333333333333e+00 1582 1647 4.16666666666667e+00 1582 1811 -4.16666666666667e+00 1582 1442 4.16666666666667e+00 1582 1586 -4.16666666666667e+00 1582 1440 -8.33333333333333e+00 1582 1584 8.33333333333333e+00 1582 1809 -4.16666666666667e+00 1582 1649 4.16666666666667e+00 1582 1585 -1.25000000000000e+01 1582 2319 -8.33333333333333e+00 1582 2316 -4.16666666666667e+00 1582 2318 -4.16666666666667e+00 1582 2061 4.16666666666667e+00 1582 2063 4.16666666666667e+00 1582 2330 -4.16666666666667e+00 1582 2321 4.16666666666667e+00 1582 2329 -1.25000000000000e+01 1582 2328 8.33333333333333e+00 1583 1583 1.25000000000000e+02 1583 1572 -4.16666666666667e+00 1583 1574 -1.25000000000000e+01 1583 1573 8.33333333333333e+00 1583 1646 -3.75000000000000e+01 1583 1645 8.33333333333333e+00 1583 1581 -1.66666666666667e+01 1583 1644 8.33333333333333e+00 1583 1582 -1.66666666666667e+01 1583 1431 8.33333333333333e+00 1583 1433 -3.75000000000000e+01 1583 1303 -8.33333333333333e+00 1583 1432 8.33333333333333e+00 1583 1302 4.16666666666667e+00 1583 1439 -1.25000000000000e+01 1583 1438 8.33333333333333e+00 1583 1345 -8.33333333333333e+00 1583 1437 -4.16666666666667e+00 1583 1344 4.16666666666667e+00 1583 1647 -8.33333333333333e+00 1583 1809 -4.16666666666667e+00 1583 1810 -4.16666666666667e+00 1583 1440 4.16666666666667e+00 1583 1441 4.16666666666667e+00 1583 1585 -4.16666666666667e+00 1583 1648 4.16666666666667e+00 1583 1586 -1.25000000000000e+01 1583 1584 8.33333333333333e+00 1583 2319 4.16666666666667e+00 1583 2317 -4.16666666666667e+00 1583 2062 4.16666666666667e+00 1583 2329 -4.16666666666667e+00 1583 2061 -8.33333333333333e+00 1583 2328 8.33333333333333e+00 1583 2316 -4.16666666666667e+00 1583 2320 4.16666666666667e+00 1583 2330 -1.25000000000000e+01 1584 1584 1.25000000000000e+02 1584 1601 8.33333333333333e+00 1584 1571 4.16666666666667e+00 1584 1600 8.33333333333333e+00 1584 1599 -3.75000000000000e+01 1584 1579 -4.16666666666667e+00 1584 1805 4.16666666666667e+00 1584 1580 8.33333333333333e+00 1584 1578 -1.25000000000000e+01 1584 1804 -8.33333333333333e+00 1584 1586 -1.66666666666667e+01 1584 1349 -4.16666666666667e+00 1584 1304 -4.16666666666667e+00 1584 1663 4.16666666666667e+00 1584 1648 -4.16666666666667e+00 1584 1577 -4.16666666666667e+00 1584 1574 4.16666666666667e+00 1584 1664 -8.33333333333333e+00 1584 1649 8.33333333333333e+00 1584 1647 -1.25000000000000e+01 1584 1576 8.33333333333333e+00 1584 1573 -8.33333333333333e+00 1584 1575 -1.25000000000000e+01 1584 1442 -4.16666666666667e+00 1584 1811 4.16666666666667e+00 1584 1441 8.33333333333333e+00 1584 1585 -1.66666666666667e+01 1584 1582 8.33333333333333e+00 1584 1810 4.16666666666667e+00 1584 1348 -4.16666666666667e+00 1584 1440 -1.25000000000000e+01 1584 1583 8.33333333333333e+00 1584 1433 -8.33333333333333e+00 1584 1432 4.16666666666667e+00 1584 1303 -4.16666666666667e+00 1584 1581 -3.75000000000000e+01 1584 1570 4.16666666666667e+00 1585 1585 1.25000000000000e+02 1585 1601 -4.16666666666667e+00 1585 1571 -8.33333333333333e+00 1585 1600 -1.25000000000000e+01 1585 1599 8.33333333333333e+00 1585 1578 -4.16666666666667e+00 1585 1580 8.33333333333333e+00 1585 1579 -1.25000000000000e+01 1585 1805 4.16666666666667e+00 1585 1803 -8.33333333333333e+00 1585 1662 4.16666666666667e+00 1585 1647 -4.16666666666667e+00 1585 1577 8.33333333333333e+00 1585 1586 -1.66666666666667e+01 1585 1649 8.33333333333333e+00 1585 1349 -4.16666666666667e+00 1585 1664 4.16666666666667e+00 1585 1648 -1.25000000000000e+01 1585 1304 -4.16666666666667e+00 1585 1574 4.16666666666667e+00 1585 1576 -3.75000000000000e+01 1585 1575 8.33333333333333e+00 1585 1572 -8.33333333333333e+00 1585 1433 4.16666666666667e+00 1585 1583 -4.16666666666667e+00 1585 1440 8.33333333333333e+00 1585 1584 -1.66666666666667e+01 1585 1581 8.33333333333333e+00 1585 1811 -8.33333333333333e+00 1585 1442 8.33333333333333e+00 1585 1441 -3.75000000000000e+01 1585 1809 4.16666666666667e+00 1585 1347 -4.16666666666667e+00 1585 1582 -1.25000000000000e+01 1585 1569 4.16666666666667e+00 1585 1431 4.16666666666667e+00 1585 1302 -4.16666666666667e+00 1586 1586 1.25000000000000e+02 1586 1599 8.33333333333333e+00 1586 1570 -8.33333333333333e+00 1586 1569 4.16666666666667e+00 1586 1601 -1.25000000000000e+01 1586 1579 8.33333333333333e+00 1586 1803 4.16666666666667e+00 1586 1580 -3.75000000000000e+01 1586 1578 8.33333333333333e+00 1586 1804 4.16666666666667e+00 1586 1584 -1.66666666666667e+01 1586 1347 -4.16666666666667e+00 1586 1302 -4.16666666666667e+00 1586 1576 8.33333333333333e+00 1586 1585 -1.66666666666667e+01 1586 1648 8.33333333333333e+00 1586 1575 -4.16666666666667e+00 1586 1572 4.16666666666667e+00 1586 1649 -3.75000000000000e+01 1586 1348 -4.16666666666667e+00 1586 1663 4.16666666666667e+00 1586 1662 -8.33333333333333e+00 1586 1647 8.33333333333333e+00 1586 1577 -1.25000000000000e+01 1586 1303 -4.16666666666667e+00 1586 1573 4.16666666666667e+00 1586 1440 -4.16666666666667e+00 1586 1809 4.16666666666667e+00 1586 1432 4.16666666666667e+00 1586 1582 -4.16666666666667e+00 1586 1442 -1.25000000000000e+01 1586 1810 -8.33333333333333e+00 1586 1441 8.33333333333333e+00 1586 1583 -1.25000000000000e+01 1586 1600 -4.16666666666667e+00 1586 1581 8.33333333333333e+00 1586 1431 -8.33333333333333e+00 1587 1587 1.25000000000000e+02 1587 1601 -4.16666666666667e+00 1587 1600 8.33333333333333e+00 1587 1599 -1.25000000000000e+01 1587 1664 4.16666666666667e+00 1587 1570 4.16666666666667e+00 1587 1571 -8.33333333333333e+00 1587 1577 8.33333333333333e+00 1587 1576 8.33333333333333e+00 1587 1575 -3.75000000000000e+01 1587 1588 -1.66666666666667e+01 1587 1306 -4.16666666666667e+00 1587 1318 -4.16666666666667e+00 1587 1666 -4.16666666666667e+00 1587 1660 4.16666666666667e+00 1587 1667 -4.16666666666667e+00 1587 1604 4.16666666666667e+00 1587 1307 8.33333333333333e+00 1587 1589 -1.66666666666667e+01 1587 1595 8.33333333333333e+00 1587 1603 -8.33333333333333e+00 1587 1594 8.33333333333333e+00 1587 1593 -3.75000000000000e+01 1587 1319 8.33333333333333e+00 1587 1661 -8.33333333333333e+00 1587 1390 -4.16666666666667e+00 1587 1552 4.16666666666667e+00 1587 1553 4.16666666666667e+00 1587 1391 -4.16666666666667e+00 1587 1305 -1.25000000000000e+01 1587 1559 -4.16666666666667e+00 1587 1403 4.16666666666667e+00 1587 1558 8.33333333333333e+00 1587 1402 -8.33333333333333e+00 1587 1557 -1.25000000000000e+01 1587 1663 4.16666666666667e+00 1587 1317 -1.25000000000000e+01 1588 1588 1.25000000000000e+02 1588 1601 8.33333333333333e+00 1588 1600 -3.75000000000000e+01 1588 1599 8.33333333333333e+00 1588 1664 -8.33333333333333e+00 1588 1569 4.16666666666667e+00 1588 1571 4.16666666666667e+00 1588 1577 -4.16666666666667e+00 1588 1576 -1.25000000000000e+01 1588 1575 8.33333333333333e+00 1588 1587 -1.66666666666667e+01 1588 1305 -4.16666666666667e+00 1588 1317 -4.16666666666667e+00 1588 1665 -4.16666666666667e+00 1588 1659 4.16666666666667e+00 1588 1604 4.16666666666667e+00 1588 1595 -4.16666666666667e+00 1588 1594 -1.25000000000000e+01 1588 1602 -8.33333333333333e+00 1588 1593 8.33333333333333e+00 1588 1667 -4.16666666666667e+00 1588 1661 4.16666666666667e+00 1588 1389 -4.16666666666667e+00 1588 1551 4.16666666666667e+00 1588 1391 -4.16666666666667e+00 1588 1403 4.16666666666667e+00 1588 1553 -8.33333333333333e+00 1588 1307 8.33333333333333e+00 1588 1306 -1.25000000000000e+01 1588 1559 8.33333333333333e+00 1588 1589 -1.66666666666667e+01 1588 1319 8.33333333333333e+00 1588 1558 -3.75000000000000e+01 1588 1662 4.16666666666667e+00 1588 1318 -1.25000000000000e+01 1588 1557 8.33333333333333e+00 1588 1401 -8.33333333333333e+00 1589 1589 1.25000000000000e+02 1589 1600 8.33333333333333e+00 1589 1599 -4.16666666666667e+00 1589 1663 -8.33333333333333e+00 1589 1662 4.16666666666667e+00 1589 1570 4.16666666666667e+00 1589 1569 -8.33333333333333e+00 1589 1577 -1.25000000000000e+01 1589 1576 -4.16666666666667e+00 1589 1575 8.33333333333333e+00 1589 1665 -4.16666666666667e+00 1589 1602 4.16666666666667e+00 1589 1595 -1.25000000000000e+01 1589 1603 4.16666666666667e+00 1589 1594 -4.16666666666667e+00 1589 1305 8.33333333333333e+00 1589 1587 -1.66666666666667e+01 1589 1593 8.33333333333333e+00 1589 1666 -4.16666666666667e+00 1589 1660 4.16666666666667e+00 1589 1317 8.33333333333333e+00 1589 1659 -8.33333333333333e+00 1589 1390 -4.16666666666667e+00 1589 1402 4.16666666666667e+00 1589 1307 -3.75000000000000e+01 1589 1552 -8.33333333333333e+00 1589 1306 8.33333333333333e+00 1589 1551 4.16666666666667e+00 1589 1389 -4.16666666666667e+00 1589 1559 -1.25000000000000e+01 1589 1601 -1.25000000000000e+01 1589 1319 -3.75000000000000e+01 1589 1558 8.33333333333333e+00 1589 1588 -1.66666666666667e+01 1589 1318 8.33333333333333e+00 1589 1557 -4.16666666666667e+00 1589 1401 4.16666666666667e+00 1590 1590 6.25000000000000e+01 1590 1553 2.08333333333333e+00 1590 1552 -4.16666666666667e+00 1590 1561 4.16666666666667e+00 1590 1560 -6.25000000000000e+00 1590 1307 4.16666666666667e+00 1590 1592 -8.33333333333333e+00 1590 1595 8.33333333333333e+00 1590 1594 -4.16666666666667e+00 1590 1593 -1.25000000000000e+01 1590 1325 4.16666666666667e+00 1590 1700 -8.33333333333333e+00 1590 1699 4.16666666666667e+00 1590 1603 4.16666666666667e+00 1590 1708 -4.16666666666667e+00 1590 1448 2.08333333333333e+00 1590 1709 -4.16666666666667e+00 1590 1324 4.16666666666667e+00 1590 1447 -4.16666666666667e+00 1590 1323 -1.87500000000000e+01 1590 1445 -2.08333333333333e+00 1590 1604 4.16666666666667e+00 1590 1591 -8.33333333333333e+00 1590 1444 4.16666666666667e+00 1590 1306 4.16666666666667e+00 1590 1562 -2.08333333333333e+00 1590 1443 -6.25000000000000e+00 1590 1305 -1.87500000000000e+01 1591 1591 6.25000000000000e+01 1591 1592 -8.33333333333333e+00 1591 1307 -2.08333333333333e+00 1591 1553 2.08333333333333e+00 1591 1551 -4.16666666666667e+00 1591 1325 -2.08333333333333e+00 1591 1561 -1.87500000000000e+01 1591 1560 4.16666666666667e+00 1591 1700 4.16666666666667e+00 1591 1595 8.33333333333333e+00 1591 1594 -1.25000000000000e+01 1591 1593 -4.16666666666667e+00 1591 1698 4.16666666666667e+00 1591 1602 4.16666666666667e+00 1591 1707 -4.16666666666667e+00 1591 1448 2.08333333333333e+00 1591 1709 -4.16666666666667e+00 1591 1324 -6.25000000000000e+00 1591 1323 4.16666666666667e+00 1591 1446 -4.16666666666667e+00 1591 1445 4.16666666666667e+00 1591 1604 -8.33333333333333e+00 1591 1562 4.16666666666667e+00 1591 1444 -1.87500000000000e+01 1591 1306 -6.25000000000000e+00 1591 1590 -8.33333333333333e+00 1591 1443 4.16666666666667e+00 1591 1305 4.16666666666667e+00 1592 1592 6.25000000000000e+01 1592 1591 -8.33333333333333e+00 1592 1560 -2.08333333333333e+00 1592 1551 2.08333333333333e+00 1592 1306 -2.08333333333333e+00 1592 1552 2.08333333333333e+00 1592 1562 -6.25000000000000e+00 1592 1324 -2.08333333333333e+00 1592 1699 4.16666666666667e+00 1592 1595 -3.75000000000000e+01 1592 1594 8.33333333333333e+00 1592 1305 4.16666666666667e+00 1592 1590 -8.33333333333333e+00 1592 1593 8.33333333333333e+00 1592 1323 4.16666666666667e+00 1592 1698 -8.33333333333333e+00 1592 1447 2.08333333333333e+00 1592 1708 -4.16666666666667e+00 1592 1325 -6.25000000000000e+00 1592 1446 2.08333333333333e+00 1592 1707 -4.16666666666667e+00 1592 1561 4.16666666666667e+00 1592 1445 -6.25000000000000e+00 1592 1307 -6.25000000000000e+00 1592 1444 4.16666666666667e+00 1592 1603 -8.33333333333333e+00 1592 1443 -2.08333333333333e+00 1592 1602 4.16666666666667e+00 1593 1593 1.25000000000000e+02 1593 1558 -8.33333333333333e+00 1593 1553 -4.16666666666667e+00 1593 1561 4.16666666666667e+00 1593 1552 -4.16666666666667e+00 1593 1562 4.16666666666667e+00 1593 1568 -4.16666666666667e+00 1593 1567 8.33333333333333e+00 1593 1566 -1.25000000000000e+01 1593 1709 4.16666666666667e+00 1593 1708 -8.33333333333333e+00 1593 1699 8.33333333333333e+00 1593 1592 8.33333333333333e+00 1593 1306 4.16666666666667e+00 1593 1591 -4.16666666666667e+00 1593 1590 -1.25000000000000e+01 1593 1700 8.33333333333333e+00 1593 1336 4.16666666666667e+00 1593 1698 -3.75000000000000e+01 1593 1595 -1.66666666666667e+01 1593 1660 -4.16666666666667e+00 1593 1604 -4.16666666666667e+00 1593 1666 4.16666666666667e+00 1593 1771 -4.16666666666667e+00 1593 1667 4.16666666666667e+00 1593 1772 -4.16666666666667e+00 1593 1307 -8.33333333333333e+00 1593 1589 8.33333333333333e+00 1593 1603 8.33333333333333e+00 1593 1588 8.33333333333333e+00 1593 1594 -1.66666666666667e+01 1593 1602 -1.25000000000000e+01 1593 1587 -3.75000000000000e+01 1593 1661 8.33333333333333e+00 1593 1337 -8.33333333333333e+00 1593 1559 4.16666666666667e+00 1593 1659 -1.25000000000000e+01 1594 1594 1.25000000000000e+02 1594 1557 -8.33333333333333e+00 1594 1560 4.16666666666667e+00 1594 1551 -4.16666666666667e+00 1594 1562 -8.33333333333333e+00 1594 1568 8.33333333333333e+00 1594 1553 -4.16666666666667e+00 1594 1567 -3.75000000000000e+01 1594 1566 8.33333333333333e+00 1594 1709 4.16666666666667e+00 1594 1700 -4.16666666666667e+00 1594 1707 -8.33333333333333e+00 1594 1698 8.33333333333333e+00 1594 1592 8.33333333333333e+00 1594 1595 -1.66666666666667e+01 1594 1591 -1.25000000000000e+01 1594 1305 4.16666666666667e+00 1594 1590 -4.16666666666667e+00 1594 1699 -1.25000000000000e+01 1594 1335 4.16666666666667e+00 1594 1659 -4.16666666666667e+00 1594 1604 8.33333333333333e+00 1594 1665 4.16666666666667e+00 1594 1770 -4.16666666666667e+00 1594 1667 -8.33333333333333e+00 1594 1661 8.33333333333333e+00 1594 1307 4.16666666666667e+00 1594 1589 -4.16666666666667e+00 1594 1603 -3.75000000000000e+01 1594 1588 -1.25000000000000e+01 1594 1602 8.33333333333333e+00 1594 1587 8.33333333333333e+00 1594 1593 -1.66666666666667e+01 1594 1772 -4.16666666666667e+00 1594 1337 4.16666666666667e+00 1594 1559 4.16666666666667e+00 1594 1660 -1.25000000000000e+01 1595 1595 1.25000000000000e+02 1595 1557 4.16666666666667e+00 1595 1551 -4.16666666666667e+00 1595 1561 -8.33333333333333e+00 1595 1567 8.33333333333333e+00 1595 1560 4.16666666666667e+00 1595 1566 -4.16666666666667e+00 1595 1552 -4.16666666666667e+00 1595 1568 -1.25000000000000e+01 1595 1708 4.16666666666667e+00 1595 1699 -4.16666666666667e+00 1595 1707 4.16666666666667e+00 1595 1592 -3.75000000000000e+01 1595 1591 8.33333333333333e+00 1595 1594 -1.66666666666667e+01 1595 1590 8.33333333333333e+00 1595 1700 -1.25000000000000e+01 1595 1698 8.33333333333333e+00 1595 1593 -1.66666666666667e+01 1595 1602 -4.16666666666667e+00 1595 1603 8.33333333333333e+00 1595 1666 -8.33333333333333e+00 1595 1660 8.33333333333333e+00 1595 1665 4.16666666666667e+00 1595 1770 -4.16666666666667e+00 1595 1604 -1.25000000000000e+01 1595 1589 -1.25000000000000e+01 1595 1306 4.16666666666667e+00 1595 1588 -4.16666666666667e+00 1595 1305 -8.33333333333333e+00 1595 1587 8.33333333333333e+00 1595 1558 4.16666666666667e+00 1595 1661 -3.75000000000000e+01 1595 1771 -4.16666666666667e+00 1595 1336 4.16666666666667e+00 1595 1659 8.33333333333333e+00 1595 1335 -8.33333333333333e+00 1596 1596 6.25000000000000e+01 1596 1580 4.16666666666667e+00 1596 1571 2.08333333333333e+00 1596 1307 -2.08333333333333e+00 1596 1570 -4.16666666666667e+00 1596 1343 -2.08333333333333e+00 1596 1579 4.16666666666667e+00 1596 1578 -1.87500000000000e+01 1596 1805 4.16666666666667e+00 1596 1804 4.16666666666667e+00 1596 1601 8.33333333333333e+00 1596 1600 -4.16666666666667e+00 1596 1599 -1.25000000000000e+01 1596 1603 4.16666666666667e+00 1596 1807 -4.16666666666667e+00 1596 1451 2.08333333333333e+00 1596 1808 -4.16666666666667e+00 1596 1450 -4.16666666666667e+00 1596 1342 4.16666666666667e+00 1596 1341 -6.25000000000000e+00 1596 1445 4.16666666666667e+00 1596 1604 -8.33333333333333e+00 1596 1444 4.16666666666667e+00 1596 1597 -8.33333333333333e+00 1596 1306 4.16666666666667e+00 1596 1443 -1.87500000000000e+01 1596 1598 -8.33333333333333e+00 1596 1305 -6.25000000000000e+00 1597 1597 6.25000000000000e+01 1597 1571 2.08333333333333e+00 1597 1569 -4.16666666666667e+00 1597 1579 -6.25000000000000e+00 1597 1578 4.16666666666667e+00 1597 1343 4.16666666666667e+00 1597 1805 -8.33333333333333e+00 1597 1803 4.16666666666667e+00 1597 1598 -8.33333333333333e+00 1597 1307 4.16666666666667e+00 1597 1601 8.33333333333333e+00 1597 1600 -1.25000000000000e+01 1597 1599 -4.16666666666667e+00 1597 1602 4.16666666666667e+00 1597 1806 -4.16666666666667e+00 1597 1451 2.08333333333333e+00 1597 1808 -4.16666666666667e+00 1597 1342 -1.87500000000000e+01 1597 1449 -4.16666666666667e+00 1597 1341 4.16666666666667e+00 1597 1445 -2.08333333333333e+00 1597 1604 4.16666666666667e+00 1597 1444 -6.25000000000000e+00 1597 1580 -2.08333333333333e+00 1597 1306 -1.87500000000000e+01 1597 1443 4.16666666666667e+00 1597 1596 -8.33333333333333e+00 1597 1305 4.16666666666667e+00 1598 1598 6.25000000000000e+01 1598 1570 2.08333333333333e+00 1598 1596 -8.33333333333333e+00 1598 1578 4.16666666666667e+00 1598 1569 2.08333333333333e+00 1598 1305 -2.08333333333333e+00 1598 1580 -6.25000000000000e+00 1598 1341 -2.08333333333333e+00 1598 1803 4.16666666666667e+00 1598 1342 4.16666666666667e+00 1598 1804 -8.33333333333333e+00 1598 1601 -3.75000000000000e+01 1598 1597 -8.33333333333333e+00 1598 1306 4.16666666666667e+00 1598 1600 8.33333333333333e+00 1598 1599 8.33333333333333e+00 1598 1449 2.08333333333333e+00 1598 1806 -4.16666666666667e+00 1598 1343 -6.25000000000000e+00 1598 1450 2.08333333333333e+00 1598 1807 -4.16666666666667e+00 1598 1445 -6.25000000000000e+00 1598 1579 -2.08333333333333e+00 1598 1307 -6.25000000000000e+00 1598 1444 -2.08333333333333e+00 1598 1603 4.16666666666667e+00 1598 1443 4.16666666666667e+00 1598 1602 -8.33333333333333e+00 1599 1599 1.25000000000000e+02 1599 1576 -8.33333333333333e+00 1599 1570 -4.16666666666667e+00 1599 1579 4.16666666666667e+00 1599 1586 8.33333333333333e+00 1599 1580 -8.33333333333333e+00 1599 1571 -4.16666666666667e+00 1599 1585 8.33333333333333e+00 1599 1584 -3.75000000000000e+01 1599 1808 4.16666666666667e+00 1599 1805 -4.16666666666667e+00 1599 1804 8.33333333333333e+00 1599 1807 -8.33333333333333e+00 1599 1598 8.33333333333333e+00 1599 1601 -1.66666666666667e+01 1599 1597 -4.16666666666667e+00 1599 1306 4.16666666666667e+00 1599 1596 -1.25000000000000e+01 1599 1348 4.16666666666667e+00 1599 1803 -1.25000000000000e+01 1599 1663 -4.16666666666667e+00 1599 1604 8.33333333333333e+00 1599 1666 4.16666666666667e+00 1599 1816 -4.16666666666667e+00 1599 1667 -8.33333333333333e+00 1599 1664 8.33333333333333e+00 1599 1307 4.16666666666667e+00 1599 1589 -4.16666666666667e+00 1599 1603 8.33333333333333e+00 1599 1588 8.33333333333333e+00 1599 1600 -1.66666666666667e+01 1599 1602 -3.75000000000000e+01 1599 1587 -1.25000000000000e+01 1599 1817 -4.16666666666667e+00 1599 1349 4.16666666666667e+00 1599 1577 4.16666666666667e+00 1599 1662 -1.25000000000000e+01 1600 1600 1.25000000000000e+02 1600 1575 -8.33333333333333e+00 1600 1571 -4.16666666666667e+00 1600 1569 -4.16666666666667e+00 1600 1578 4.16666666666667e+00 1600 1586 -4.16666666666667e+00 1600 1580 4.16666666666667e+00 1600 1585 -1.25000000000000e+01 1600 1584 8.33333333333333e+00 1600 1808 4.16666666666667e+00 1600 1803 8.33333333333333e+00 1600 1806 -8.33333333333333e+00 1600 1598 8.33333333333333e+00 1600 1597 -1.25000000000000e+01 1600 1596 -4.16666666666667e+00 1600 1305 4.16666666666667e+00 1600 1805 8.33333333333333e+00 1600 1804 -3.75000000000000e+01 1600 1347 4.16666666666667e+00 1600 1601 -1.66666666666667e+01 1600 1662 -4.16666666666667e+00 1600 1604 -4.16666666666667e+00 1600 1665 4.16666666666667e+00 1600 1815 -4.16666666666667e+00 1600 1817 -4.16666666666667e+00 1600 1667 4.16666666666667e+00 1600 1307 -8.33333333333333e+00 1600 1589 8.33333333333333e+00 1600 1603 -1.25000000000000e+01 1600 1588 -3.75000000000000e+01 1600 1602 8.33333333333333e+00 1600 1587 8.33333333333333e+00 1600 1599 -1.66666666666667e+01 1600 1664 8.33333333333333e+00 1600 1349 -8.33333333333333e+00 1600 1577 4.16666666666667e+00 1600 1663 -1.25000000000000e+01 1601 1601 1.25000000000000e+02 1601 1576 4.16666666666667e+00 1601 1570 -4.16666666666667e+00 1601 1585 -4.16666666666667e+00 1601 1579 4.16666666666667e+00 1601 1584 8.33333333333333e+00 1601 1578 -8.33333333333333e+00 1601 1569 -4.16666666666667e+00 1601 1586 -1.25000000000000e+01 1601 1806 4.16666666666667e+00 1601 1803 -4.16666666666667e+00 1601 1807 4.16666666666667e+00 1601 1598 -3.75000000000000e+01 1601 1597 8.33333333333333e+00 1601 1596 8.33333333333333e+00 1601 1599 -1.66666666666667e+01 1601 1805 -1.25000000000000e+01 1601 1804 8.33333333333333e+00 1601 1600 -1.66666666666667e+01 1601 1603 -4.16666666666667e+00 1601 1602 8.33333333333333e+00 1601 1816 -4.16666666666667e+00 1601 1666 4.16666666666667e+00 1601 1665 -8.33333333333333e+00 1601 1662 8.33333333333333e+00 1601 1604 -1.25000000000000e+01 1601 1589 -1.25000000000000e+01 1601 1306 -8.33333333333333e+00 1601 1588 8.33333333333333e+00 1601 1305 4.16666666666667e+00 1601 1587 -4.16666666666667e+00 1601 1575 4.16666666666667e+00 1601 1664 -3.75000000000000e+01 1601 1663 8.33333333333333e+00 1601 1348 -8.33333333333333e+00 1601 1815 -4.16666666666667e+00 1601 1347 4.16666666666667e+00 1602 1602 1.25000000000000e+02 1602 1816 4.16666666666667e+00 1602 1817 4.16666666666667e+00 1602 1600 8.33333333333333e+00 1602 1599 -3.75000000000000e+01 1602 1597 4.16666666666667e+00 1602 1808 -4.16666666666667e+00 1602 1598 -8.33333333333333e+00 1602 1807 8.33333333333333e+00 1602 1806 -1.25000000000000e+01 1602 1603 -1.66666666666667e+01 1602 1306 -4.16666666666667e+00 1602 1354 -4.16666666666667e+00 1602 1589 4.16666666666667e+00 1602 1595 -4.16666666666667e+00 1602 1666 -4.16666666666667e+00 1602 1771 4.16666666666667e+00 1602 1588 -8.33333333333333e+00 1602 1594 8.33333333333333e+00 1602 1593 -1.25000000000000e+01 1602 1667 8.33333333333333e+00 1602 1772 -8.33333333333333e+00 1602 1665 -1.25000000000000e+01 1602 1444 -4.16666666666667e+00 1602 1591 4.16666666666667e+00 1602 1445 8.33333333333333e+00 1602 1604 -1.66666666666667e+01 1602 1709 8.33333333333333e+00 1602 1592 4.16666666666667e+00 1602 1307 -4.16666666666667e+00 1602 1443 -1.25000000000000e+01 1602 1457 4.16666666666667e+00 1602 1355 -4.16666666666667e+00 1602 1708 8.33333333333333e+00 1602 1456 -8.33333333333333e+00 1602 1707 -3.75000000000000e+01 1602 1601 8.33333333333333e+00 1603 1603 1.25000000000000e+02 1603 1815 4.16666666666667e+00 1603 1817 -8.33333333333333e+00 1603 1600 -1.25000000000000e+01 1603 1599 8.33333333333333e+00 1603 1596 4.16666666666667e+00 1603 1808 8.33333333333333e+00 1603 1598 4.16666666666667e+00 1603 1807 -3.75000000000000e+01 1603 1806 8.33333333333333e+00 1603 1602 -1.66666666666667e+01 1603 1305 -4.16666666666667e+00 1603 1353 -4.16666666666667e+00 1603 1667 8.33333333333333e+00 1603 1604 -1.66666666666667e+01 1603 1595 8.33333333333333e+00 1603 1665 -4.16666666666667e+00 1603 1770 4.16666666666667e+00 1603 1307 -4.16666666666667e+00 1603 1589 4.16666666666667e+00 1603 1594 -3.75000000000000e+01 1603 1587 -8.33333333333333e+00 1603 1593 8.33333333333333e+00 1603 1355 -4.16666666666667e+00 1603 1772 4.16666666666667e+00 1603 1666 -1.25000000000000e+01 1603 1443 -4.16666666666667e+00 1603 1590 4.16666666666667e+00 1603 1457 4.16666666666667e+00 1603 1709 -4.16666666666667e+00 1603 1592 -8.33333333333333e+00 1603 1445 8.33333333333333e+00 1603 1444 -1.25000000000000e+01 1603 1708 -1.25000000000000e+01 1603 1601 -4.16666666666667e+00 1603 1707 8.33333333333333e+00 1603 1455 -8.33333333333333e+00 1604 1604 1.25000000000000e+02 1604 1599 8.33333333333333e+00 1604 1816 -8.33333333333333e+00 1604 1815 4.16666666666667e+00 1604 1601 -1.25000000000000e+01 1604 1807 8.33333333333333e+00 1604 1806 -4.16666666666667e+00 1604 1597 4.16666666666667e+00 1604 1596 -8.33333333333333e+00 1604 1808 -1.25000000000000e+01 1604 1587 4.16666666666667e+00 1604 1593 -4.16666666666667e+00 1604 1666 8.33333333333333e+00 1604 1603 -1.66666666666667e+01 1604 1594 8.33333333333333e+00 1604 1595 -1.25000000000000e+01 1604 1306 -4.16666666666667e+00 1604 1588 4.16666666666667e+00 1604 1667 -3.75000000000000e+01 1604 1354 -4.16666666666667e+00 1604 1771 4.16666666666667e+00 1604 1665 8.33333333333333e+00 1604 1770 -8.33333333333333e+00 1604 1456 4.16666666666667e+00 1604 1708 -4.16666666666667e+00 1604 1443 8.33333333333333e+00 1604 1602 -1.66666666666667e+01 1604 1707 8.33333333333333e+00 1604 1445 -3.75000000000000e+01 1604 1591 -8.33333333333333e+00 1604 1444 8.33333333333333e+00 1604 1590 4.16666666666667e+00 1604 1305 -4.16666666666667e+00 1604 1709 -1.25000000000000e+01 1604 1600 -4.16666666666667e+00 1604 1455 4.16666666666667e+00 1604 1353 -4.16666666666667e+00 1605 1605 6.25000000000000e+01 1605 1637 -4.16666666666667e+00 1605 1634 -4.16666666666667e+00 1605 1633 2.08333333333333e+00 1605 1636 -4.16666666666667e+00 1605 1616 4.16666666666667e+00 1605 1615 -2.08333333333333e+00 1605 1621 4.16666666666667e+00 1605 1614 -6.25000000000000e+00 1605 1396 -2.08333333333333e+00 1605 1393 2.08333333333333e+00 1605 1625 4.16666666666667e+00 1605 1613 -4.16666666666667e+00 1605 1310 4.16666666666667e+00 1605 1394 -4.16666666666667e+00 1605 1309 4.16666666666667e+00 1605 1606 -8.33333333333333e+00 1605 1612 8.33333333333333e+00 1605 1308 -1.87500000000000e+01 1605 1611 -1.25000000000000e+01 1605 1607 -8.33333333333333e+00 1605 1313 4.16666666666667e+00 1605 1397 4.16666666666667e+00 1605 1312 4.16666666666667e+00 1605 1624 -8.33333333333333e+00 1605 1622 4.16666666666667e+00 1605 1311 -1.87500000000000e+01 1605 1395 -6.25000000000000e+00 1606 1606 6.25000000000000e+01 1606 1637 -4.16666666666667e+00 1606 1632 2.08333333333333e+00 1606 1635 -4.16666666666667e+00 1606 1616 4.16666666666667e+00 1606 1622 -8.33333333333333e+00 1606 1615 -6.25000000000000e+00 1606 1614 -2.08333333333333e+00 1606 1620 4.16666666666667e+00 1606 1395 -2.08333333333333e+00 1606 1392 2.08333333333333e+00 1606 1397 4.16666666666667e+00 1606 1607 -8.33333333333333e+00 1606 1613 8.33333333333333e+00 1606 1310 -2.08333333333333e+00 1606 1394 2.08333333333333e+00 1606 1309 -6.25000000000000e+00 1606 1612 -3.75000000000000e+01 1606 1308 4.16666666666667e+00 1606 1605 -8.33333333333333e+00 1606 1611 8.33333333333333e+00 1606 1313 -2.08333333333333e+00 1606 1625 4.16666666666667e+00 1606 1634 2.08333333333333e+00 1606 1312 -6.25000000000000e+00 1606 1396 -6.25000000000000e+00 1606 1311 4.16666666666667e+00 1606 1623 -8.33333333333333e+00 1607 1607 6.25000000000000e+01 1607 1636 -4.16666666666667e+00 1607 1620 4.16666666666667e+00 1607 1635 -4.16666666666667e+00 1607 1632 -4.16666666666667e+00 1607 1616 -1.87500000000000e+01 1607 1615 4.16666666666667e+00 1607 1621 -8.33333333333333e+00 1607 1614 4.16666666666667e+00 1607 1396 4.16666666666667e+00 1607 1606 -8.33333333333333e+00 1607 1612 8.33333333333333e+00 1607 1623 4.16666666666667e+00 1607 1611 -4.16666666666667e+00 1607 1310 -6.25000000000000e+00 1607 1613 -1.25000000000000e+01 1607 1309 -2.08333333333333e+00 1607 1393 2.08333333333333e+00 1607 1308 4.16666666666667e+00 1607 1392 -4.16666666666667e+00 1607 1633 2.08333333333333e+00 1607 1313 -6.25000000000000e+00 1607 1397 -1.87500000000000e+01 1607 1312 -2.08333333333333e+00 1607 1624 4.16666666666667e+00 1607 1605 -8.33333333333333e+00 1607 1311 4.16666666666667e+00 1607 1395 4.16666666666667e+00 1608 1608 1.25000000000000e+02 1608 1619 8.33333333333333e+00 1608 1618 -4.16666666666667e+00 1608 1651 4.16666666666667e+00 1608 1652 4.16666666666667e+00 1608 1316 -4.16666666666667e+00 1608 1310 -4.16666666666667e+00 1608 1617 -1.25000000000000e+01 1608 1309 8.33333333333333e+00 1608 1609 -1.66666666666667e+01 1608 1315 8.33333333333333e+00 1608 1394 4.16666666666667e+00 1608 1393 4.16666666666667e+00 1608 1308 -1.25000000000000e+01 1608 1400 8.33333333333333e+00 1608 1399 -4.16666666666667e+00 1608 1398 -1.25000000000000e+01 1608 1610 -1.66666666666667e+01 1608 1314 -1.25000000000000e+01 1608 1655 -4.16666666666667e+00 1608 1622 -8.33333333333333e+00 1608 1621 4.16666666666667e+00 1608 1654 -4.16666666666667e+00 1608 1613 8.33333333333333e+00 1608 1643 4.16666666666667e+00 1608 1642 -8.33333333333333e+00 1608 1612 8.33333333333333e+00 1608 1611 -3.75000000000000e+01 1608 2354 4.16666666666667e+00 1608 2353 -8.33333333333333e+00 1608 2357 8.33333333333333e+00 1608 2356 8.33333333333333e+00 1608 2355 -3.75000000000000e+01 1608 2291 -4.16666666666667e+00 1608 2290 -4.16666666666667e+00 1608 2294 -8.33333333333333e+00 1608 2293 4.16666666666667e+00 1609 1609 1.25000000000000e+02 1609 1650 4.16666666666667e+00 1609 1652 -8.33333333333333e+00 1609 1619 8.33333333333333e+00 1609 1618 -1.25000000000000e+01 1609 1308 8.33333333333333e+00 1609 1608 -1.66666666666667e+01 1609 1314 8.33333333333333e+00 1609 1394 -8.33333333333333e+00 1609 1310 8.33333333333333e+00 1609 1309 -3.75000000000000e+01 1609 1392 4.16666666666667e+00 1609 1400 8.33333333333333e+00 1609 1610 -1.66666666666667e+01 1609 1316 8.33333333333333e+00 1609 1399 -1.25000000000000e+01 1609 1617 -4.16666666666667e+00 1609 1315 -3.75000000000000e+01 1609 1398 -4.16666666666667e+00 1609 1655 -4.16666666666667e+00 1609 1620 4.16666666666667e+00 1609 1653 -4.16666666666667e+00 1609 1643 4.16666666666667e+00 1609 1613 -4.16666666666667e+00 1609 1641 -8.33333333333333e+00 1609 1622 4.16666666666667e+00 1609 1612 -1.25000000000000e+01 1609 1611 8.33333333333333e+00 1609 2354 4.16666666666667e+00 1609 2352 -8.33333333333333e+00 1609 2357 -4.16666666666667e+00 1609 2356 -1.25000000000000e+01 1609 2355 8.33333333333333e+00 1609 2294 4.16666666666667e+00 1609 2291 -4.16666666666667e+00 1609 2289 -4.16666666666667e+00 1609 2292 4.16666666666667e+00 1610 1610 1.25000000000000e+02 1610 1617 8.33333333333333e+00 1610 1651 -8.33333333333333e+00 1610 1650 4.16666666666667e+00 1610 1314 -4.16666666666667e+00 1610 1619 -3.75000000000000e+01 1610 1618 8.33333333333333e+00 1610 1308 -4.16666666666667e+00 1610 1392 4.16666666666667e+00 1610 1310 -1.25000000000000e+01 1610 1393 -8.33333333333333e+00 1610 1309 8.33333333333333e+00 1610 1400 -3.75000000000000e+01 1610 1608 -1.66666666666667e+01 1610 1316 -1.25000000000000e+01 1610 1399 8.33333333333333e+00 1610 1609 -1.66666666666667e+01 1610 1315 8.33333333333333e+00 1610 1398 8.33333333333333e+00 1610 1653 -4.16666666666667e+00 1610 1621 4.16666666666667e+00 1610 1654 -4.16666666666667e+00 1610 1620 -8.33333333333333e+00 1610 1642 4.16666666666667e+00 1610 1612 -4.16666666666667e+00 1610 1611 8.33333333333333e+00 1610 1641 4.16666666666667e+00 1610 1613 -1.25000000000000e+01 1610 2352 4.16666666666667e+00 1610 2353 4.16666666666667e+00 1610 2357 -1.25000000000000e+01 1610 2356 -4.16666666666667e+00 1610 2355 8.33333333333333e+00 1610 2293 4.16666666666667e+00 1610 2290 -4.16666666666667e+00 1610 2289 -4.16666666666667e+00 1610 2292 -8.33333333333333e+00 1611 1611 1.25000000000000e+02 1611 1655 4.16666666666667e+00 1611 1610 8.33333333333333e+00 1611 1400 -8.33333333333333e+00 1611 1399 4.16666666666667e+00 1611 1609 8.33333333333333e+00 1611 1608 -3.75000000000000e+01 1611 1643 -4.16666666666667e+00 1611 1642 8.33333333333333e+00 1611 1641 -1.25000000000000e+01 1611 1621 -4.16666666666667e+00 1611 1669 -4.16666666666667e+00 1611 1636 4.16666666666667e+00 1611 1622 8.33333333333333e+00 1611 1637 -8.33333333333333e+00 1611 1319 4.16666666666667e+00 1611 1670 -4.16666666666667e+00 1611 1310 4.16666666666667e+00 1611 1620 -1.25000000000000e+01 1611 1394 -4.16666666666667e+00 1611 1393 -4.16666666666667e+00 1611 1397 4.16666666666667e+00 1611 1607 -4.16666666666667e+00 1611 1612 -1.66666666666667e+01 1611 1396 4.16666666666667e+00 1611 1402 -4.16666666666667e+00 1611 1309 -8.33333333333333e+00 1611 1606 8.33333333333333e+00 1611 1605 -1.25000000000000e+01 1611 1613 -1.66666666666667e+01 1611 1625 8.33333333333333e+00 1611 1403 8.33333333333333e+00 1611 1624 8.33333333333333e+00 1611 1318 -8.33333333333333e+00 1611 1654 4.16666666666667e+00 1611 1623 -3.75000000000000e+01 1611 1401 -1.25000000000000e+01 1612 1612 1.25000000000000e+02 1612 1655 -8.33333333333333e+00 1612 1610 -4.16666666666667e+00 1612 1400 4.16666666666667e+00 1612 1398 4.16666666666667e+00 1612 1609 -1.25000000000000e+01 1612 1608 8.33333333333333e+00 1612 1643 8.33333333333333e+00 1612 1642 -3.75000000000000e+01 1612 1641 8.33333333333333e+00 1612 1620 -4.16666666666667e+00 1612 1668 -4.16666666666667e+00 1612 1635 4.16666666666667e+00 1612 1670 -4.16666666666667e+00 1612 1637 4.16666666666667e+00 1612 1613 -1.66666666666667e+01 1612 1622 8.33333333333333e+00 1612 1621 -1.25000000000000e+01 1612 1392 -4.16666666666667e+00 1612 1607 8.33333333333333e+00 1612 1611 -1.66666666666667e+01 1612 1397 -8.33333333333333e+00 1612 1403 8.33333333333333e+00 1612 1395 4.16666666666667e+00 1612 1401 -4.16666666666667e+00 1612 1310 4.16666666666667e+00 1612 1394 -4.16666666666667e+00 1612 1606 -3.75000000000000e+01 1612 1308 -8.33333333333333e+00 1612 1605 8.33333333333333e+00 1612 1625 -4.16666666666667e+00 1612 1319 4.16666666666667e+00 1612 1653 4.16666666666667e+00 1612 1624 -1.25000000000000e+01 1612 1402 -1.25000000000000e+01 1612 1623 8.33333333333333e+00 1612 1317 -8.33333333333333e+00 1613 1613 1.25000000000000e+02 1613 1653 4.16666666666667e+00 1613 1609 -4.16666666666667e+00 1613 1399 4.16666666666667e+00 1613 1608 8.33333333333333e+00 1613 1398 -8.33333333333333e+00 1613 1610 -1.25000000000000e+01 1613 1643 -1.25000000000000e+01 1613 1642 8.33333333333333e+00 1613 1641 -4.16666666666667e+00 1613 1669 -4.16666666666667e+00 1613 1636 4.16666666666667e+00 1613 1620 8.33333333333333e+00 1613 1635 -8.33333333333333e+00 1613 1317 4.16666666666667e+00 1613 1668 -4.16666666666667e+00 1613 1622 -3.75000000000000e+01 1613 1612 -1.66666666666667e+01 1613 1621 8.33333333333333e+00 1613 1308 4.16666666666667e+00 1613 1392 -4.16666666666667e+00 1613 1606 8.33333333333333e+00 1613 1395 4.16666666666667e+00 1613 1605 -4.16666666666667e+00 1613 1396 -8.33333333333333e+00 1613 1402 8.33333333333333e+00 1613 1607 -1.25000000000000e+01 1613 1309 4.16666666666667e+00 1613 1393 -4.16666666666667e+00 1613 1654 -8.33333333333333e+00 1613 1625 -1.25000000000000e+01 1613 1403 -3.75000000000000e+01 1613 1624 -4.16666666666667e+00 1613 1318 4.16666666666667e+00 1613 1611 -1.66666666666667e+01 1613 1623 8.33333333333333e+00 1613 1401 8.33333333333333e+00 1614 1614 6.25000000000000e+01 1614 1637 4.16666666666667e+00 1614 1636 -8.33333333333333e+00 1614 1607 4.16666666666667e+00 1614 1606 -2.08333333333333e+00 1614 1309 2.08333333333333e+00 1614 1605 -6.25000000000000e+00 1614 1634 4.16666666666667e+00 1614 1360 2.08333333333333e+00 1614 1632 -1.87500000000000e+01 1614 1622 -4.16666666666667e+00 1614 1616 -8.33333333333333e+00 1614 1471 -2.08333333333333e+00 1614 1841 -4.16666666666667e+00 1614 1478 4.16666666666667e+00 1614 1840 -4.16666666666667e+00 1614 1477 4.16666666666667e+00 1614 1472 4.16666666666667e+00 1614 1361 -4.16666666666667e+00 1614 1470 -6.25000000000000e+00 1614 1469 4.16666666666667e+00 1614 1310 -4.16666666666667e+00 1614 1468 4.16666666666667e+00 1614 1615 -8.33333333333333e+00 1614 1621 8.33333333333333e+00 1614 1467 -1.87500000000000e+01 1614 1633 4.16666666666667e+00 1614 1620 -1.25000000000000e+01 1615 1615 6.25000000000000e+01 1615 1632 4.16666666666667e+00 1615 1637 4.16666666666667e+00 1615 1635 -8.33333333333333e+00 1615 1607 4.16666666666667e+00 1615 1616 -8.33333333333333e+00 1615 1606 -6.25000000000000e+00 1615 1605 -2.08333333333333e+00 1615 1308 2.08333333333333e+00 1615 1633 -6.25000000000000e+00 1615 1359 2.08333333333333e+00 1615 1470 -2.08333333333333e+00 1615 1472 4.16666666666667e+00 1615 1622 8.33333333333333e+00 1615 1478 -8.33333333333333e+00 1615 1839 -4.16666666666667e+00 1615 1476 4.16666666666667e+00 1615 1361 2.08333333333333e+00 1615 1841 -4.16666666666667e+00 1615 1471 -6.25000000000000e+00 1615 1469 -2.08333333333333e+00 1615 1310 2.08333333333333e+00 1615 1468 -6.25000000000000e+00 1615 1634 -2.08333333333333e+00 1615 1621 -3.75000000000000e+01 1615 1467 4.16666666666667e+00 1615 1614 -8.33333333333333e+00 1615 1620 8.33333333333333e+00 1616 1616 6.25000000000000e+01 1616 1635 4.16666666666667e+00 1616 1636 4.16666666666667e+00 1616 1607 -1.87500000000000e+01 1616 1606 4.16666666666667e+00 1616 1615 -8.33333333333333e+00 1616 1605 4.16666666666667e+00 1616 1634 -6.25000000000000e+00 1616 1632 4.16666666666667e+00 1616 1620 -4.16666666666667e+00 1616 1614 -8.33333333333333e+00 1616 1471 4.16666666666667e+00 1616 1839 -4.16666666666667e+00 1616 1476 4.16666666666667e+00 1616 1621 8.33333333333333e+00 1616 1477 -8.33333333333333e+00 1616 1472 -1.87500000000000e+01 1616 1360 2.08333333333333e+00 1616 1840 -4.16666666666667e+00 1616 1470 4.16666666666667e+00 1616 1359 -4.16666666666667e+00 1616 1469 -6.25000000000000e+00 1616 1633 -2.08333333333333e+00 1616 1622 -1.25000000000000e+01 1616 1468 -2.08333333333333e+00 1616 1309 2.08333333333333e+00 1616 1467 4.16666666666667e+00 1616 1308 -4.16666666666667e+00 1617 1617 1.25000000000000e+02 1617 1609 -4.16666666666667e+00 1617 1364 4.16666666666667e+00 1617 1652 -4.16666666666667e+00 1617 1651 8.33333333333333e+00 1617 1618 -1.66666666666667e+01 1617 1650 -1.25000000000000e+01 1617 1310 4.16666666666667e+00 1617 1608 -1.25000000000000e+01 1617 1469 -4.16666666666667e+00 1617 1468 8.33333333333333e+00 1617 1309 4.16666666666667e+00 1617 1467 -1.25000000000000e+01 1617 1619 -1.66666666666667e+01 1617 1475 8.33333333333333e+00 1617 1474 -4.16666666666667e+00 1617 1363 4.16666666666667e+00 1617 1610 8.33333333333333e+00 1617 1473 -1.25000000000000e+01 1617 1655 4.16666666666667e+00 1617 1654 -8.33333333333333e+00 1617 1622 8.33333333333333e+00 1617 1478 -8.33333333333333e+00 1617 1846 -4.16666666666667e+00 1617 1477 4.16666666666667e+00 1617 1847 -4.16666666666667e+00 1617 1621 8.33333333333333e+00 1617 1620 -3.75000000000000e+01 1617 2357 -8.33333333333333e+00 1617 2356 4.16666666666667e+00 1617 2354 -4.16666666666667e+00 1617 2099 4.16666666666667e+00 1617 2365 8.33333333333333e+00 1617 2098 -8.33333333333333e+00 1617 2353 -4.16666666666667e+00 1617 2366 8.33333333333333e+00 1617 2364 -3.75000000000000e+01 1618 1618 1.25000000000000e+02 1618 1652 8.33333333333333e+00 1618 1651 -3.75000000000000e+01 1618 1650 8.33333333333333e+00 1618 1617 -1.66666666666667e+01 1618 1610 8.33333333333333e+00 1618 1609 -1.25000000000000e+01 1618 1619 -1.66666666666667e+01 1618 1467 8.33333333333333e+00 1618 1310 -8.33333333333333e+00 1618 1469 8.33333333333333e+00 1618 1468 -3.75000000000000e+01 1618 1308 4.16666666666667e+00 1618 1475 8.33333333333333e+00 1618 1364 -8.33333333333333e+00 1618 1608 -4.16666666666667e+00 1618 1474 -1.25000000000000e+01 1618 1473 -4.16666666666667e+00 1618 1362 4.16666666666667e+00 1618 1655 4.16666666666667e+00 1618 1653 -8.33333333333333e+00 1618 1622 -4.16666666666667e+00 1618 1847 -4.16666666666667e+00 1618 1478 4.16666666666667e+00 1618 1845 -4.16666666666667e+00 1618 1476 4.16666666666667e+00 1618 1621 -1.25000000000000e+01 1618 1620 8.33333333333333e+00 1618 2357 4.16666666666667e+00 1618 2355 4.16666666666667e+00 1618 2366 -4.16666666666667e+00 1618 2354 -4.16666666666667e+00 1618 2099 4.16666666666667e+00 1618 2364 8.33333333333333e+00 1618 2097 -8.33333333333333e+00 1618 2352 -4.16666666666667e+00 1618 2365 -1.25000000000000e+01 1619 1619 1.25000000000000e+02 1619 1652 -1.25000000000000e+01 1619 1651 8.33333333333333e+00 1619 1362 4.16666666666667e+00 1619 1650 -4.16666666666667e+00 1619 1610 -3.75000000000000e+01 1619 1609 8.33333333333333e+00 1619 1308 4.16666666666667e+00 1619 1618 -1.66666666666667e+01 1619 1467 -4.16666666666667e+00 1619 1469 -1.25000000000000e+01 1619 1309 -8.33333333333333e+00 1619 1468 8.33333333333333e+00 1619 1608 8.33333333333333e+00 1619 1475 -3.75000000000000e+01 1619 1474 8.33333333333333e+00 1619 1363 -8.33333333333333e+00 1619 1617 -1.66666666666667e+01 1619 1473 8.33333333333333e+00 1619 1654 4.16666666666667e+00 1619 1653 4.16666666666667e+00 1619 1621 -4.16666666666667e+00 1619 1846 -4.16666666666667e+00 1619 1477 4.16666666666667e+00 1619 1620 8.33333333333333e+00 1619 1476 -8.33333333333333e+00 1619 1845 -4.16666666666667e+00 1619 1622 -1.25000000000000e+01 1619 2356 4.16666666666667e+00 1619 2355 -8.33333333333333e+00 1619 2365 -4.16666666666667e+00 1619 2353 -4.16666666666667e+00 1619 2098 4.16666666666667e+00 1619 2352 -4.16666666666667e+00 1619 2097 4.16666666666667e+00 1619 2366 -1.25000000000000e+01 1619 2364 8.33333333333333e+00 1620 1620 1.25000000000000e+02 1620 1654 8.33333333333333e+00 1620 1610 -8.33333333333333e+00 1620 1609 4.16666666666667e+00 1620 1653 -1.25000000000000e+01 1620 1619 8.33333333333333e+00 1620 1846 4.16666666666667e+00 1620 1618 8.33333333333333e+00 1620 1617 -3.75000000000000e+01 1620 1847 4.16666666666667e+00 1620 1612 -4.16666666666667e+00 1620 1613 8.33333333333333e+00 1620 1622 -1.66666666666667e+01 1620 1310 -4.16666666666667e+00 1620 1611 -1.25000000000000e+01 1620 1670 4.16666666666667e+00 1620 1367 -4.16666666666667e+00 1620 1669 -8.33333333333333e+00 1620 1607 4.16666666666667e+00 1620 1621 -1.66666666666667e+01 1620 1636 8.33333333333333e+00 1620 1606 4.16666666666667e+00 1620 1309 -4.16666666666667e+00 1620 1637 8.33333333333333e+00 1620 1366 -4.16666666666667e+00 1620 1635 -3.75000000000000e+01 1620 1616 -4.16666666666667e+00 1620 1469 4.16666666666667e+00 1620 1840 4.16666666666667e+00 1620 1477 -4.16666666666667e+00 1620 1468 -8.33333333333333e+00 1620 1615 8.33333333333333e+00 1620 1614 -1.25000000000000e+01 1620 1478 8.33333333333333e+00 1620 1841 -8.33333333333333e+00 1620 1476 -1.25000000000000e+01 1620 1655 -4.16666666666667e+00 1621 1621 1.25000000000000e+02 1621 1653 8.33333333333333e+00 1621 1608 4.16666666666667e+00 1621 1655 8.33333333333333e+00 1621 1654 -3.75000000000000e+01 1621 1619 -4.16666666666667e+00 1621 1845 4.16666666666667e+00 1621 1618 -1.25000000000000e+01 1621 1617 8.33333333333333e+00 1621 1847 -8.33333333333333e+00 1621 1611 -4.16666666666667e+00 1621 1670 4.16666666666667e+00 1621 1613 8.33333333333333e+00 1621 1612 -1.25000000000000e+01 1621 1668 -8.33333333333333e+00 1621 1637 -4.16666666666667e+00 1621 1620 -1.66666666666667e+01 1621 1635 8.33333333333333e+00 1621 1607 -8.33333333333333e+00 1621 1605 4.16666666666667e+00 1621 1308 -4.16666666666667e+00 1621 1636 -1.25000000000000e+01 1621 1365 -4.16666666666667e+00 1621 1616 8.33333333333333e+00 1621 1622 -1.66666666666667e+01 1621 1478 8.33333333333333e+00 1621 1839 4.16666666666667e+00 1621 1476 -4.16666666666667e+00 1621 1469 4.16666666666667e+00 1621 1310 -4.16666666666667e+00 1621 1615 -3.75000000000000e+01 1621 1467 -8.33333333333333e+00 1621 1614 8.33333333333333e+00 1621 1841 4.16666666666667e+00 1621 1367 -4.16666666666667e+00 1621 1477 -1.25000000000000e+01 1621 1610 4.16666666666667e+00 1622 1622 1.25000000000000e+02 1622 1653 -4.16666666666667e+00 1622 1608 -8.33333333333333e+00 1622 1655 -1.25000000000000e+01 1622 1654 8.33333333333333e+00 1622 1618 -4.16666666666667e+00 1622 1617 8.33333333333333e+00 1622 1619 -1.25000000000000e+01 1622 1846 -8.33333333333333e+00 1622 1845 4.16666666666667e+00 1622 1669 4.16666666666667e+00 1622 1611 8.33333333333333e+00 1622 1620 -1.66666666666667e+01 1622 1613 -3.75000000000000e+01 1622 1612 8.33333333333333e+00 1622 1308 -4.16666666666667e+00 1622 1668 4.16666666666667e+00 1622 1365 -4.16666666666667e+00 1622 1605 4.16666666666667e+00 1622 1636 -4.16666666666667e+00 1622 1606 -8.33333333333333e+00 1622 1637 -1.25000000000000e+01 1622 1635 8.33333333333333e+00 1622 1614 -4.16666666666667e+00 1622 1467 4.16666666666667e+00 1622 1615 8.33333333333333e+00 1622 1621 -1.66666666666667e+01 1622 1477 8.33333333333333e+00 1622 1616 -1.25000000000000e+01 1622 1468 4.16666666666667e+00 1622 1309 -4.16666666666667e+00 1622 1478 -3.75000000000000e+01 1622 1609 4.16666666666667e+00 1622 1840 4.16666666666667e+00 1622 1366 -4.16666666666667e+00 1622 1476 8.33333333333333e+00 1622 1839 -8.33333333333333e+00 1623 1623 1.25000000000000e+02 1623 1661 4.16666666666667e+00 1623 1660 -8.33333333333333e+00 1623 1630 8.33333333333333e+00 1623 1629 -3.75000000000000e+01 1623 1556 4.16666666666667e+00 1623 1555 4.16666666666667e+00 1623 1559 8.33333333333333e+00 1623 1558 -4.16666666666667e+00 1623 1557 -1.25000000000000e+01 1623 1625 -1.66666666666667e+01 1623 1313 -4.16666666666667e+00 1623 1319 -4.16666666666667e+00 1623 1673 -4.16666666666667e+00 1623 1670 4.16666666666667e+00 1623 1640 -8.33333333333333e+00 1623 1637 8.33333333333333e+00 1623 1639 4.16666666666667e+00 1623 1636 -4.16666666666667e+00 1623 1635 -1.25000000000000e+01 1623 1672 -4.16666666666667e+00 1623 1669 4.16666666666667e+00 1623 1397 -4.16666666666667e+00 1623 1607 4.16666666666667e+00 1623 1396 -4.16666666666667e+00 1623 1402 4.16666666666667e+00 1623 1606 -8.33333333333333e+00 1623 1312 8.33333333333333e+00 1623 1311 -1.25000000000000e+01 1623 1613 8.33333333333333e+00 1623 1403 -8.33333333333333e+00 1623 1612 8.33333333333333e+00 1623 1624 -1.66666666666667e+01 1623 1318 8.33333333333333e+00 1623 1611 -3.75000000000000e+01 1623 1631 8.33333333333333e+00 1623 1317 -1.25000000000000e+01 1624 1624 1.25000000000000e+02 1624 1631 -4.16666666666667e+00 1624 1659 -8.33333333333333e+00 1624 1630 -1.25000000000000e+01 1624 1629 8.33333333333333e+00 1624 1556 -8.33333333333333e+00 1624 1554 4.16666666666667e+00 1624 1559 8.33333333333333e+00 1624 1558 -1.25000000000000e+01 1624 1557 -4.16666666666667e+00 1624 1673 -4.16666666666667e+00 1624 1640 4.16666666666667e+00 1624 1313 8.33333333333333e+00 1624 1625 -1.66666666666667e+01 1624 1637 8.33333333333333e+00 1624 1636 -1.25000000000000e+01 1624 1638 4.16666666666667e+00 1624 1635 -4.16666666666667e+00 1624 1319 8.33333333333333e+00 1624 1670 -8.33333333333333e+00 1624 1671 -4.16666666666667e+00 1624 1668 4.16666666666667e+00 1624 1395 -4.16666666666667e+00 1624 1401 4.16666666666667e+00 1624 1607 4.16666666666667e+00 1624 1397 -4.16666666666667e+00 1624 1312 -3.75000000000000e+01 1624 1605 -8.33333333333333e+00 1624 1311 8.33333333333333e+00 1624 1613 -4.16666666666667e+00 1624 1403 4.16666666666667e+00 1624 1612 -1.25000000000000e+01 1624 1661 4.16666666666667e+00 1624 1318 -3.75000000000000e+01 1624 1611 8.33333333333333e+00 1624 1623 -1.66666666666667e+01 1624 1317 8.33333333333333e+00 1625 1625 1.25000000000000e+02 1625 1630 -4.16666666666667e+00 1625 1629 8.33333333333333e+00 1625 1659 4.16666666666667e+00 1625 1631 -1.25000000000000e+01 1625 1554 4.16666666666667e+00 1625 1555 -8.33333333333333e+00 1625 1559 -3.75000000000000e+01 1625 1558 8.33333333333333e+00 1625 1557 8.33333333333333e+00 1625 1623 -1.66666666666667e+01 1625 1311 -4.16666666666667e+00 1625 1317 -4.16666666666667e+00 1625 1671 -4.16666666666667e+00 1625 1668 4.16666666666667e+00 1625 1672 -4.16666666666667e+00 1625 1639 4.16666666666667e+00 1625 1637 -3.75000000000000e+01 1625 1312 8.33333333333333e+00 1625 1624 -1.66666666666667e+01 1625 1636 8.33333333333333e+00 1625 1638 -8.33333333333333e+00 1625 1635 8.33333333333333e+00 1625 1318 8.33333333333333e+00 1625 1669 -8.33333333333333e+00 1625 1395 -4.16666666666667e+00 1625 1605 4.16666666666667e+00 1625 1313 -1.25000000000000e+01 1625 1606 4.16666666666667e+00 1625 1396 -4.16666666666667e+00 1625 1613 -1.25000000000000e+01 1625 1660 4.16666666666667e+00 1625 1319 -1.25000000000000e+01 1625 1612 -4.16666666666667e+00 1625 1402 4.16666666666667e+00 1625 1611 8.33333333333333e+00 1625 1401 -8.33333333333333e+00 1626 1626 6.25000000000000e+01 1626 1631 -4.16666666666667e+00 1626 1564 -2.08333333333333e+00 1626 1555 2.08333333333333e+00 1626 1565 4.16666666666667e+00 1626 1330 4.16666666666667e+00 1626 1735 -8.33333333333333e+00 1626 1563 -6.25000000000000e+00 1626 1556 -4.16666666666667e+00 1626 1627 -8.33333333333333e+00 1626 1630 8.33333333333333e+00 1626 1312 4.16666666666667e+00 1626 1629 -1.25000000000000e+01 1626 1745 -4.16666666666667e+00 1626 1640 4.16666666666667e+00 1626 1331 4.16666666666667e+00 1626 1484 -4.16666666666667e+00 1626 1483 2.08333333333333e+00 1626 1744 -4.16666666666667e+00 1626 1329 -1.87500000000000e+01 1626 1628 -8.33333333333333e+00 1626 1481 4.16666666666667e+00 1626 1313 4.16666666666667e+00 1626 1480 -2.08333333333333e+00 1626 1639 4.16666666666667e+00 1626 1736 4.16666666666667e+00 1626 1479 -6.25000000000000e+00 1626 1311 -1.87500000000000e+01 1627 1627 6.25000000000000e+01 1627 1565 4.16666666666667e+00 1627 1631 8.33333333333333e+00 1627 1563 -2.08333333333333e+00 1627 1554 2.08333333333333e+00 1627 1331 -2.08333333333333e+00 1627 1736 4.16666666666667e+00 1627 1564 -6.25000000000000e+00 1627 1329 4.16666666666667e+00 1627 1734 -8.33333333333333e+00 1627 1556 2.08333333333333e+00 1627 1313 -2.08333333333333e+00 1627 1630 -3.75000000000000e+01 1627 1626 -8.33333333333333e+00 1627 1629 8.33333333333333e+00 1627 1311 4.16666666666667e+00 1627 1484 2.08333333333333e+00 1627 1745 -4.16666666666667e+00 1627 1330 -6.25000000000000e+00 1627 1482 2.08333333333333e+00 1627 1743 -4.16666666666667e+00 1627 1481 4.16666666666667e+00 1627 1640 -8.33333333333333e+00 1627 1628 -8.33333333333333e+00 1627 1480 -6.25000000000000e+00 1627 1312 -6.25000000000000e+00 1627 1479 -2.08333333333333e+00 1627 1638 4.16666666666667e+00 1628 1628 6.25000000000000e+01 1628 1629 -4.16666666666667e+00 1628 1627 -8.33333333333333e+00 1628 1564 4.16666666666667e+00 1628 1630 8.33333333333333e+00 1628 1565 -1.87500000000000e+01 1628 1330 -2.08333333333333e+00 1628 1735 4.16666666666667e+00 1628 1563 4.16666666666667e+00 1628 1631 -1.25000000000000e+01 1628 1555 2.08333333333333e+00 1628 1312 -2.08333333333333e+00 1628 1554 -4.16666666666667e+00 1628 1483 2.08333333333333e+00 1628 1744 -4.16666666666667e+00 1628 1743 -4.16666666666667e+00 1628 1638 4.16666666666667e+00 1628 1331 -6.25000000000000e+00 1628 1329 4.16666666666667e+00 1628 1482 -4.16666666666667e+00 1628 1734 4.16666666666667e+00 1628 1481 -1.87500000000000e+01 1628 1313 -6.25000000000000e+00 1628 1480 4.16666666666667e+00 1628 1639 -8.33333333333333e+00 1628 1626 -8.33333333333333e+00 1628 1479 4.16666666666667e+00 1628 1311 4.16666666666667e+00 1629 1629 1.25000000000000e+02 1629 1672 4.16666666666667e+00 1629 1777 -4.16666666666667e+00 1629 1640 8.33333333333333e+00 1629 1745 -8.33333333333333e+00 1629 1639 -4.16666666666667e+00 1629 1744 4.16666666666667e+00 1629 1778 -4.16666666666667e+00 1629 1638 -1.25000000000000e+01 1629 1565 4.16666666666667e+00 1629 1628 -4.16666666666667e+00 1629 1564 4.16666666666667e+00 1629 1736 8.33333333333333e+00 1629 1631 -1.66666666666667e+01 1629 1735 8.33333333333333e+00 1629 1734 -3.75000000000000e+01 1629 1627 8.33333333333333e+00 1629 1626 -1.25000000000000e+01 1629 1630 -1.66666666666667e+01 1629 1567 -4.16666666666667e+00 1629 1568 8.33333333333333e+00 1629 1559 -8.33333333333333e+00 1629 1625 8.33333333333333e+00 1629 1555 -4.16666666666667e+00 1629 1558 4.16666666666667e+00 1629 1337 4.16666666666667e+00 1629 1661 -4.16666666666667e+00 1629 1336 -8.33333333333333e+00 1629 1660 8.33333333333333e+00 1629 1566 -1.25000000000000e+01 1629 1659 -1.25000000000000e+01 1629 1556 -4.16666666666667e+00 1629 1313 4.16666666666667e+00 1629 1624 8.33333333333333e+00 1629 1312 -8.33333333333333e+00 1629 1673 4.16666666666667e+00 1629 1623 -3.75000000000000e+01 1630 1630 1.25000000000000e+02 1630 1671 4.16666666666667e+00 1630 1776 -4.16666666666667e+00 1630 1778 -4.16666666666667e+00 1630 1745 4.16666666666667e+00 1630 1638 -4.16666666666667e+00 1630 1743 4.16666666666667e+00 1630 1640 8.33333333333333e+00 1630 1639 -1.25000000000000e+01 1630 1628 8.33333333333333e+00 1630 1565 -8.33333333333333e+00 1630 1563 4.16666666666667e+00 1630 1736 -4.16666666666667e+00 1630 1337 4.16666666666667e+00 1630 1735 -1.25000000000000e+01 1630 1734 8.33333333333333e+00 1630 1313 4.16666666666667e+00 1630 1627 -3.75000000000000e+01 1630 1626 8.33333333333333e+00 1630 1625 -4.16666666666667e+00 1630 1629 -1.66666666666667e+01 1630 1566 -4.16666666666667e+00 1630 1559 4.16666666666667e+00 1630 1556 -4.16666666666667e+00 1630 1554 -4.16666666666667e+00 1630 1557 4.16666666666667e+00 1630 1568 8.33333333333333e+00 1630 1661 8.33333333333333e+00 1630 1631 -1.66666666666667e+01 1630 1567 -1.25000000000000e+01 1630 1660 -3.75000000000000e+01 1630 1335 -8.33333333333333e+00 1630 1659 8.33333333333333e+00 1630 1673 -8.33333333333333e+00 1630 1624 -1.25000000000000e+01 1630 1623 8.33333333333333e+00 1630 1311 -8.33333333333333e+00 1631 1631 1.25000000000000e+02 1631 1672 -8.33333333333333e+00 1631 1777 -4.16666666666667e+00 1631 1744 4.16666666666667e+00 1631 1638 8.33333333333333e+00 1631 1743 -8.33333333333333e+00 1631 1776 -4.16666666666667e+00 1631 1640 -3.75000000000000e+01 1631 1639 8.33333333333333e+00 1631 1563 4.16666666666667e+00 1631 1626 -4.16666666666667e+00 1631 1627 8.33333333333333e+00 1631 1564 -8.33333333333333e+00 1631 1736 -1.25000000000000e+01 1631 1735 -4.16666666666667e+00 1631 1336 4.16666666666667e+00 1631 1734 8.33333333333333e+00 1631 1629 -1.66666666666667e+01 1631 1628 -1.25000000000000e+01 1631 1312 4.16666666666667e+00 1631 1624 -4.16666666666667e+00 1631 1558 4.16666666666667e+00 1631 1555 -4.16666666666667e+00 1631 1566 8.33333333333333e+00 1631 1557 -8.33333333333333e+00 1631 1623 8.33333333333333e+00 1631 1568 -3.75000000000000e+01 1631 1661 -1.25000000000000e+01 1631 1567 8.33333333333333e+00 1631 1660 8.33333333333333e+00 1631 1630 -1.66666666666667e+01 1631 1335 4.16666666666667e+00 1631 1659 -4.16666666666667e+00 1631 1671 4.16666666666667e+00 1631 1625 -1.25000000000000e+01 1631 1554 -4.16666666666667e+00 1631 1311 4.16666666666667e+00 1632 1632 6.25000000000000e+01 1632 1633 -8.33333333333333e+00 1632 1607 -4.16666666666667e+00 1632 1312 -2.08333333333333e+00 1632 1606 2.08333333333333e+00 1632 1616 4.16666666666667e+00 1632 1360 -2.08333333333333e+00 1632 1614 -1.87500000000000e+01 1632 1840 4.16666666666667e+00 1632 1637 -4.16666666666667e+00 1632 1636 8.33333333333333e+00 1632 1635 -1.25000000000000e+01 1632 1841 4.16666666666667e+00 1632 1640 4.16666666666667e+00 1632 1844 -4.16666666666667e+00 1632 1486 2.08333333333333e+00 1632 1843 -4.16666666666667e+00 1632 1361 4.16666666666667e+00 1632 1487 -4.16666666666667e+00 1632 1359 -6.25000000000000e+00 1632 1634 -8.33333333333333e+00 1632 1481 4.16666666666667e+00 1632 1313 4.16666666666667e+00 1632 1480 4.16666666666667e+00 1632 1639 -8.33333333333333e+00 1632 1615 4.16666666666667e+00 1632 1479 -1.87500000000000e+01 1632 1311 -6.25000000000000e+00 1633 1633 6.25000000000000e+01 1633 1607 2.08333333333333e+00 1633 1614 4.16666666666667e+00 1633 1632 -8.33333333333333e+00 1633 1311 -2.08333333333333e+00 1633 1605 2.08333333333333e+00 1633 1615 -6.25000000000000e+00 1633 1359 -2.08333333333333e+00 1633 1839 4.16666666666667e+00 1633 1313 4.16666666666667e+00 1633 1634 -8.33333333333333e+00 1633 1637 8.33333333333333e+00 1633 1636 -3.75000000000000e+01 1633 1635 8.33333333333333e+00 1633 1361 4.16666666666667e+00 1633 1841 -8.33333333333333e+00 1633 1485 2.08333333333333e+00 1633 1842 -4.16666666666667e+00 1633 1487 2.08333333333333e+00 1633 1844 -4.16666666666667e+00 1633 1360 -6.25000000000000e+00 1633 1481 -2.08333333333333e+00 1633 1640 4.16666666666667e+00 1633 1616 -2.08333333333333e+00 1633 1480 -6.25000000000000e+00 1633 1312 -6.25000000000000e+00 1633 1479 4.16666666666667e+00 1633 1638 -8.33333333333333e+00 1634 1634 6.25000000000000e+01 1634 1606 2.08333333333333e+00 1634 1605 -4.16666666666667e+00 1634 1616 -6.25000000000000e+00 1634 1614 4.16666666666667e+00 1634 1637 -1.25000000000000e+01 1634 1312 4.16666666666667e+00 1634 1633 -8.33333333333333e+00 1634 1636 8.33333333333333e+00 1634 1635 -4.16666666666667e+00 1634 1360 4.16666666666667e+00 1634 1840 -8.33333333333333e+00 1634 1839 4.16666666666667e+00 1634 1638 4.16666666666667e+00 1634 1842 -4.16666666666667e+00 1634 1361 -1.87500000000000e+01 1634 1486 2.08333333333333e+00 1634 1843 -4.16666666666667e+00 1634 1359 4.16666666666667e+00 1634 1485 -4.16666666666667e+00 1634 1615 -2.08333333333333e+00 1634 1481 -6.25000000000000e+00 1634 1313 -1.87500000000000e+01 1634 1480 -2.08333333333333e+00 1634 1639 4.16666666666667e+00 1634 1632 -8.33333333333333e+00 1634 1479 4.16666666666667e+00 1634 1311 4.16666666666667e+00 1635 1635 1.25000000000000e+02 1635 1613 -8.33333333333333e+00 1635 1616 4.16666666666667e+00 1635 1607 -4.16666666666667e+00 1635 1615 -8.33333333333333e+00 1635 1621 8.33333333333333e+00 1635 1606 -4.16666666666667e+00 1635 1622 8.33333333333333e+00 1635 1620 -3.75000000000000e+01 1635 1843 4.16666666666667e+00 1635 1840 -4.16666666666667e+00 1635 1844 -8.33333333333333e+00 1635 1841 8.33333333333333e+00 1635 1313 4.16666666666667e+00 1635 1634 -4.16666666666667e+00 1635 1633 8.33333333333333e+00 1635 1636 -1.66666666666667e+01 1635 1632 -1.25000000000000e+01 1635 1367 4.16666666666667e+00 1635 1839 -1.25000000000000e+01 1635 1670 -4.16666666666667e+00 1635 1673 4.16666666666667e+00 1635 1853 -4.16666666666667e+00 1635 1639 8.33333333333333e+00 1635 1672 -8.33333333333333e+00 1635 1669 8.33333333333333e+00 1635 1640 8.33333333333333e+00 1635 1625 8.33333333333333e+00 1635 1637 -1.66666666666667e+01 1635 1312 4.16666666666667e+00 1635 1624 -4.16666666666667e+00 1635 1638 -3.75000000000000e+01 1635 1623 -1.25000000000000e+01 1635 1852 -4.16666666666667e+00 1635 1366 4.16666666666667e+00 1635 1612 4.16666666666667e+00 1635 1668 -1.25000000000000e+01 1636 1636 1.25000000000000e+02 1636 1613 4.16666666666667e+00 1636 1607 -4.16666666666667e+00 1636 1616 4.16666666666667e+00 1636 1622 -4.16666666666667e+00 1636 1614 -8.33333333333333e+00 1636 1620 8.33333333333333e+00 1636 1605 -4.16666666666667e+00 1636 1621 -1.25000000000000e+01 1636 1842 4.16666666666667e+00 1636 1839 -4.16666666666667e+00 1636 1844 4.16666666666667e+00 1636 1634 8.33333333333333e+00 1636 1633 -3.75000000000000e+01 1636 1632 8.33333333333333e+00 1636 1635 -1.66666666666667e+01 1636 1841 8.33333333333333e+00 1636 1840 -1.25000000000000e+01 1636 1637 -1.66666666666667e+01 1636 1640 -4.16666666666667e+00 1636 1638 8.33333333333333e+00 1636 1673 4.16666666666667e+00 1636 1853 -4.16666666666667e+00 1636 1671 -8.33333333333333e+00 1636 1668 8.33333333333333e+00 1636 1313 -8.33333333333333e+00 1636 1625 8.33333333333333e+00 1636 1639 -1.25000000000000e+01 1636 1624 -1.25000000000000e+01 1636 1311 4.16666666666667e+00 1636 1623 -4.16666666666667e+00 1636 1670 8.33333333333333e+00 1636 1367 -8.33333333333333e+00 1636 1611 4.16666666666667e+00 1636 1669 -3.75000000000000e+01 1636 1851 -4.16666666666667e+00 1636 1365 4.16666666666667e+00 1637 1637 1.25000000000000e+02 1637 1611 -8.33333333333333e+00 1637 1606 -4.16666666666667e+00 1637 1614 4.16666666666667e+00 1637 1605 -4.16666666666667e+00 1637 1615 4.16666666666667e+00 1637 1621 -4.16666666666667e+00 1637 1622 -1.25000000000000e+01 1637 1620 8.33333333333333e+00 1637 1843 4.16666666666667e+00 1637 1842 -8.33333333333333e+00 1637 1839 8.33333333333333e+00 1637 1634 -1.25000000000000e+01 1637 1633 8.33333333333333e+00 1637 1311 4.16666666666667e+00 1637 1632 -4.16666666666667e+00 1637 1841 -3.75000000000000e+01 1637 1840 8.33333333333333e+00 1637 1365 4.16666666666667e+00 1637 1636 -1.66666666666667e+01 1637 1668 -4.16666666666667e+00 1637 1639 -4.16666666666667e+00 1637 1671 4.16666666666667e+00 1637 1851 -4.16666666666667e+00 1637 1672 4.16666666666667e+00 1637 1852 -4.16666666666667e+00 1637 1640 -1.25000000000000e+01 1637 1625 -3.75000000000000e+01 1637 1312 -8.33333333333333e+00 1637 1624 8.33333333333333e+00 1637 1638 8.33333333333333e+00 1637 1623 8.33333333333333e+00 1637 1635 -1.66666666666667e+01 1637 1612 4.16666666666667e+00 1637 1670 -1.25000000000000e+01 1637 1669 8.33333333333333e+00 1637 1366 -8.33333333333333e+00 1638 1638 1.25000000000000e+02 1638 1630 -4.16666666666667e+00 1638 1778 4.16666666666667e+00 1638 1777 -8.33333333333333e+00 1638 1629 -1.25000000000000e+01 1638 1628 4.16666666666667e+00 1638 1744 8.33333333333333e+00 1638 1745 8.33333333333333e+00 1638 1743 -3.75000000000000e+01 1638 1627 4.16666666666667e+00 1638 1640 -1.66666666666667e+01 1638 1313 -4.16666666666667e+00 1638 1373 -4.16666666666667e+00 1638 1673 -4.16666666666667e+00 1638 1853 4.16666666666667e+00 1638 1672 8.33333333333333e+00 1638 1639 -1.66666666666667e+01 1638 1636 8.33333333333333e+00 1638 1625 -8.33333333333333e+00 1638 1637 8.33333333333333e+00 1638 1312 -4.16666666666667e+00 1638 1624 4.16666666666667e+00 1638 1635 -3.75000000000000e+01 1638 1372 -4.16666666666667e+00 1638 1852 4.16666666666667e+00 1638 1671 -1.25000000000000e+01 1638 1481 -4.16666666666667e+00 1638 1634 4.16666666666667e+00 1638 1492 4.16666666666667e+00 1638 1843 -4.16666666666667e+00 1638 1633 -8.33333333333333e+00 1638 1480 8.33333333333333e+00 1638 1479 -1.25000000000000e+01 1638 1844 8.33333333333333e+00 1638 1493 -8.33333333333333e+00 1638 1842 -1.25000000000000e+01 1638 1631 8.33333333333333e+00 1639 1639 1.25000000000000e+02 1639 1629 -4.16666666666667e+00 1639 1776 -8.33333333333333e+00 1639 1631 8.33333333333333e+00 1639 1630 -1.25000000000000e+01 1639 1745 -4.16666666666667e+00 1639 1743 8.33333333333333e+00 1639 1744 -1.25000000000000e+01 1639 1628 -8.33333333333333e+00 1639 1626 4.16666666666667e+00 1639 1625 4.16666666666667e+00 1639 1637 -4.16666666666667e+00 1639 1671 8.33333333333333e+00 1639 1638 -1.66666666666667e+01 1639 1635 8.33333333333333e+00 1639 1636 -1.25000000000000e+01 1639 1311 -4.16666666666667e+00 1639 1623 4.16666666666667e+00 1639 1673 8.33333333333333e+00 1639 1853 -8.33333333333333e+00 1639 1672 -3.75000000000000e+01 1639 1371 -4.16666666666667e+00 1639 1851 4.16666666666667e+00 1639 1481 8.33333333333333e+00 1639 1640 -1.66666666666667e+01 1639 1844 8.33333333333333e+00 1639 1491 4.16666666666667e+00 1639 1842 -4.16666666666667e+00 1639 1634 4.16666666666667e+00 1639 1313 -4.16666666666667e+00 1639 1480 -3.75000000000000e+01 1639 1632 -8.33333333333333e+00 1639 1479 8.33333333333333e+00 1639 1493 4.16666666666667e+00 1639 1373 -4.16666666666667e+00 1639 1843 -1.25000000000000e+01 1639 1778 4.16666666666667e+00 1640 1640 1.25000000000000e+02 1640 1629 8.33333333333333e+00 1640 1776 4.16666666666667e+00 1640 1631 -3.75000000000000e+01 1640 1630 8.33333333333333e+00 1640 1744 -4.16666666666667e+00 1640 1626 4.16666666666667e+00 1640 1745 -1.25000000000000e+01 1640 1743 8.33333333333333e+00 1640 1627 -8.33333333333333e+00 1640 1638 -1.66666666666667e+01 1640 1311 -4.16666666666667e+00 1640 1371 -4.16666666666667e+00 1640 1624 4.16666666666667e+00 1640 1636 -4.16666666666667e+00 1640 1671 -4.16666666666667e+00 1640 1851 4.16666666666667e+00 1640 1637 -1.25000000000000e+01 1640 1623 -8.33333333333333e+00 1640 1635 8.33333333333333e+00 1640 1673 -1.25000000000000e+01 1640 1672 8.33333333333333e+00 1640 1852 -8.33333333333333e+00 1640 1479 -4.16666666666667e+00 1640 1632 4.16666666666667e+00 1640 1480 8.33333333333333e+00 1640 1639 -1.66666666666667e+01 1640 1843 8.33333333333333e+00 1640 1481 -1.25000000000000e+01 1640 1633 4.16666666666667e+00 1640 1312 -4.16666666666667e+00 1640 1844 -3.75000000000000e+01 1640 1777 4.16666666666667e+00 1640 1492 4.16666666666667e+00 1640 1372 -4.16666666666667e+00 1640 1842 8.33333333333333e+00 1640 1491 -8.33333333333333e+00 1641 1641 1.25000000000000e+02 1641 1649 -4.16666666666667e+00 1641 1663 -8.33333333333333e+00 1641 1648 8.33333333333333e+00 1641 1647 -1.25000000000000e+01 1641 1574 -8.33333333333333e+00 1641 1573 4.16666666666667e+00 1641 1577 8.33333333333333e+00 1641 1576 -4.16666666666667e+00 1641 1575 -1.25000000000000e+01 1641 1676 -4.16666666666667e+00 1641 1658 4.16666666666667e+00 1641 1316 8.33333333333333e+00 1641 1643 -1.66666666666667e+01 1641 1655 8.33333333333333e+00 1641 1657 4.16666666666667e+00 1641 1654 -4.16666666666667e+00 1641 1653 -1.25000000000000e+01 1641 1319 8.33333333333333e+00 1641 1670 -8.33333333333333e+00 1641 1675 -4.16666666666667e+00 1641 1669 4.16666666666667e+00 1641 1399 -4.16666666666667e+00 1641 1402 4.16666666666667e+00 1641 1610 4.16666666666667e+00 1641 1400 -4.16666666666667e+00 1641 1315 8.33333333333333e+00 1641 1609 -8.33333333333333e+00 1641 1314 -3.75000000000000e+01 1641 1613 -4.16666666666667e+00 1641 1403 4.16666666666667e+00 1641 1642 -1.66666666666667e+01 1641 1612 8.33333333333333e+00 1641 1318 8.33333333333333e+00 1641 1664 4.16666666666667e+00 1641 1611 -1.25000000000000e+01 1641 1317 -3.75000000000000e+01 1642 1642 1.25000000000000e+02 1642 1664 4.16666666666667e+00 1642 1662 -8.33333333333333e+00 1642 1648 -3.75000000000000e+01 1642 1647 8.33333333333333e+00 1642 1574 4.16666666666667e+00 1642 1572 4.16666666666667e+00 1642 1577 8.33333333333333e+00 1642 1576 -1.25000000000000e+01 1642 1575 -4.16666666666667e+00 1642 1643 -1.66666666666667e+01 1642 1319 -4.16666666666667e+00 1642 1316 -4.16666666666667e+00 1642 1670 4.16666666666667e+00 1642 1676 -4.16666666666667e+00 1642 1658 -8.33333333333333e+00 1642 1655 8.33333333333333e+00 1642 1654 -1.25000000000000e+01 1642 1656 4.16666666666667e+00 1642 1653 -4.16666666666667e+00 1642 1674 -4.16666666666667e+00 1642 1668 4.16666666666667e+00 1642 1610 4.16666666666667e+00 1642 1400 -4.16666666666667e+00 1642 1398 -4.16666666666667e+00 1642 1401 4.16666666666667e+00 1642 1315 -1.25000000000000e+01 1642 1314 8.33333333333333e+00 1642 1608 -8.33333333333333e+00 1642 1613 8.33333333333333e+00 1642 1403 -8.33333333333333e+00 1642 1649 8.33333333333333e+00 1642 1612 -3.75000000000000e+01 1642 1318 -1.25000000000000e+01 1642 1641 -1.66666666666667e+01 1642 1611 8.33333333333333e+00 1642 1317 8.33333333333333e+00 1643 1643 1.25000000000000e+02 1643 1647 -4.16666666666667e+00 1643 1648 8.33333333333333e+00 1643 1663 4.16666666666667e+00 1643 1649 -1.25000000000000e+01 1643 1573 4.16666666666667e+00 1643 1572 -8.33333333333333e+00 1643 1577 -3.75000000000000e+01 1643 1576 8.33333333333333e+00 1643 1575 8.33333333333333e+00 1643 1642 -1.66666666666667e+01 1643 1318 -4.16666666666667e+00 1643 1315 -4.16666666666667e+00 1643 1669 4.16666666666667e+00 1643 1675 -4.16666666666667e+00 1643 1674 -4.16666666666667e+00 1643 1656 4.16666666666667e+00 1643 1655 -3.75000000000000e+01 1643 1657 -8.33333333333333e+00 1643 1654 8.33333333333333e+00 1643 1314 8.33333333333333e+00 1643 1641 -1.66666666666667e+01 1643 1653 8.33333333333333e+00 1643 1317 8.33333333333333e+00 1643 1668 -8.33333333333333e+00 1643 1609 4.16666666666667e+00 1643 1399 -4.16666666666667e+00 1643 1316 -1.25000000000000e+01 1643 1608 4.16666666666667e+00 1643 1398 -4.16666666666667e+00 1643 1662 4.16666666666667e+00 1643 1613 -1.25000000000000e+01 1643 1319 -1.25000000000000e+01 1643 1612 8.33333333333333e+00 1643 1402 -8.33333333333333e+00 1643 1611 -4.16666666666667e+00 1643 1401 4.16666666666667e+00 1644 1644 1.25000000000000e+02 1644 1583 8.33333333333333e+00 1644 1582 -4.16666666666667e+00 1644 1581 -1.25000000000000e+01 1644 1573 4.16666666666667e+00 1644 1646 -1.66666666666667e+01 1644 1505 8.33333333333333e+00 1644 1507 4.16666666666667e+00 1644 1504 -4.16666666666667e+00 1644 1316 -4.16666666666667e+00 1644 1315 8.33333333333333e+00 1644 1314 -1.25000000000000e+01 1644 1503 -1.25000000000000e+01 1644 1346 -4.16666666666667e+00 1644 1508 4.16666666666667e+00 1644 1645 -1.66666666666667e+01 1644 1345 8.33333333333333e+00 1644 1574 4.16666666666667e+00 1644 1344 -1.25000000000000e+01 1644 1649 8.33333333333333e+00 1644 1811 4.16666666666667e+00 1644 1810 -8.33333333333333e+00 1644 1648 8.33333333333333e+00 1644 1647 -3.75000000000000e+01 1644 1814 -4.16666666666667e+00 1644 1813 -4.16666666666667e+00 1644 1658 -8.33333333333333e+00 1644 1657 4.16666666666667e+00 1644 2329 4.16666666666667e+00 1644 2320 -4.16666666666667e+00 1644 2321 -4.16666666666667e+00 1644 2330 -8.33333333333333e+00 1644 2393 8.33333333333333e+00 1644 2387 4.16666666666667e+00 1644 2386 -8.33333333333333e+00 1644 2392 8.33333333333333e+00 1644 2391 -3.75000000000000e+01 1645 1645 1.25000000000000e+02 1645 1582 -1.25000000000000e+01 1645 1581 -4.16666666666667e+00 1645 1574 -8.33333333333333e+00 1645 1572 4.16666666666667e+00 1645 1506 4.16666666666667e+00 1645 1503 -4.16666666666667e+00 1645 1316 8.33333333333333e+00 1645 1646 -1.66666666666667e+01 1645 1505 8.33333333333333e+00 1645 1315 -3.75000000000000e+01 1645 1504 -1.25000000000000e+01 1645 1314 8.33333333333333e+00 1645 1346 8.33333333333333e+00 1645 1508 -8.33333333333333e+00 1645 1583 8.33333333333333e+00 1645 1345 -3.75000000000000e+01 1645 1644 -1.66666666666667e+01 1645 1344 8.33333333333333e+00 1645 1649 -4.16666666666667e+00 1645 1809 -8.33333333333333e+00 1645 1648 -1.25000000000000e+01 1645 1647 8.33333333333333e+00 1645 1814 -4.16666666666667e+00 1645 1658 4.16666666666667e+00 1645 1812 -4.16666666666667e+00 1645 1811 4.16666666666667e+00 1645 1656 4.16666666666667e+00 1645 2328 4.16666666666667e+00 1645 2319 -4.16666666666667e+00 1645 2330 4.16666666666667e+00 1645 2321 -4.16666666666667e+00 1645 2393 -4.16666666666667e+00 1645 2387 4.16666666666667e+00 1645 2385 -8.33333333333333e+00 1645 2392 -1.25000000000000e+01 1645 2391 8.33333333333333e+00 1646 1646 1.25000000000000e+02 1646 1583 -3.75000000000000e+01 1646 1582 8.33333333333333e+00 1646 1581 8.33333333333333e+00 1646 1573 -8.33333333333333e+00 1646 1644 -1.66666666666667e+01 1646 1503 8.33333333333333e+00 1646 1316 -1.25000000000000e+01 1646 1505 -3.75000000000000e+01 1646 1315 8.33333333333333e+00 1646 1645 -1.66666666666667e+01 1646 1504 8.33333333333333e+00 1646 1314 -4.16666666666667e+00 1646 1572 4.16666666666667e+00 1646 1346 -1.25000000000000e+01 1646 1345 8.33333333333333e+00 1646 1507 -8.33333333333333e+00 1646 1344 -4.16666666666667e+00 1646 1506 4.16666666666667e+00 1646 1648 -4.16666666666667e+00 1646 1647 8.33333333333333e+00 1646 1809 4.16666666666667e+00 1646 1649 -1.25000000000000e+01 1646 1812 -4.16666666666667e+00 1646 1813 -4.16666666666667e+00 1646 1657 4.16666666666667e+00 1646 1810 4.16666666666667e+00 1646 1656 -8.33333333333333e+00 1646 2319 -4.16666666666667e+00 1646 2329 4.16666666666667e+00 1646 2328 -8.33333333333333e+00 1646 2320 -4.16666666666667e+00 1646 2392 -4.16666666666667e+00 1646 2386 4.16666666666667e+00 1646 2391 8.33333333333333e+00 1646 2385 4.16666666666667e+00 1646 2393 -1.25000000000000e+01 1647 1647 1.25000000000000e+02 1647 1675 4.16666666666667e+00 1647 1819 -4.16666666666667e+00 1647 1814 4.16666666666667e+00 1647 1820 -4.16666666666667e+00 1647 1813 4.16666666666667e+00 1647 1657 -4.16666666666667e+00 1647 1658 8.33333333333333e+00 1647 1656 -1.25000000000000e+01 1647 1583 -8.33333333333333e+00 1647 1646 8.33333333333333e+00 1647 1582 4.16666666666667e+00 1647 1349 4.16666666666667e+00 1647 1811 -4.16666666666667e+00 1647 1810 8.33333333333333e+00 1647 1809 -1.25000000000000e+01 1647 1316 4.16666666666667e+00 1647 1645 8.33333333333333e+00 1647 1644 -3.75000000000000e+01 1647 1643 -4.16666666666667e+00 1647 1648 -1.66666666666667e+01 1647 1585 -4.16666666666667e+00 1647 1577 4.16666666666667e+00 1647 1574 -4.16666666666667e+00 1647 1576 4.16666666666667e+00 1647 1573 -4.16666666666667e+00 1647 1586 8.33333333333333e+00 1647 1664 8.33333333333333e+00 1647 1649 -1.66666666666667e+01 1647 1348 -8.33333333333333e+00 1647 1663 8.33333333333333e+00 1647 1584 -1.25000000000000e+01 1647 1662 -3.75000000000000e+01 1647 1642 8.33333333333333e+00 1647 1315 -8.33333333333333e+00 1647 1676 -8.33333333333333e+00 1647 1641 -1.25000000000000e+01 1648 1648 1.25000000000000e+02 1648 1674 4.16666666666667e+00 1648 1818 -4.16666666666667e+00 1648 1814 -8.33333333333333e+00 1648 1658 8.33333333333333e+00 1648 1812 4.16666666666667e+00 1648 1656 -4.16666666666667e+00 1648 1820 -4.16666666666667e+00 1648 1657 -1.25000000000000e+01 1648 1583 4.16666666666667e+00 1648 1646 -4.16666666666667e+00 1648 1581 4.16666666666667e+00 1648 1811 8.33333333333333e+00 1648 1649 -1.66666666666667e+01 1648 1810 -3.75000000000000e+01 1648 1809 8.33333333333333e+00 1648 1645 -1.25000000000000e+01 1648 1644 8.33333333333333e+00 1648 1647 -1.66666666666667e+01 1648 1584 -4.16666666666667e+00 1648 1586 8.33333333333333e+00 1648 1577 -8.33333333333333e+00 1648 1643 8.33333333333333e+00 1648 1575 4.16666666666667e+00 1648 1572 -4.16666666666667e+00 1648 1349 4.16666666666667e+00 1648 1664 -4.16666666666667e+00 1648 1585 -1.25000000000000e+01 1648 1663 -1.25000000000000e+01 1648 1347 -8.33333333333333e+00 1648 1662 8.33333333333333e+00 1648 1574 -4.16666666666667e+00 1648 1316 4.16666666666667e+00 1648 1676 4.16666666666667e+00 1648 1642 -3.75000000000000e+01 1648 1641 8.33333333333333e+00 1648 1314 -8.33333333333333e+00 1649 1649 1.25000000000000e+02 1649 1674 -8.33333333333333e+00 1649 1812 4.16666666666667e+00 1649 1818 -4.16666666666667e+00 1649 1813 -8.33333333333333e+00 1649 1657 8.33333333333333e+00 1649 1819 -4.16666666666667e+00 1649 1658 -3.75000000000000e+01 1649 1656 8.33333333333333e+00 1649 1582 4.16666666666667e+00 1649 1645 -4.16666666666667e+00 1649 1581 -8.33333333333333e+00 1649 1644 8.33333333333333e+00 1649 1811 -1.25000000000000e+01 1649 1810 8.33333333333333e+00 1649 1648 -1.66666666666667e+01 1649 1347 4.16666666666667e+00 1649 1809 -4.16666666666667e+00 1649 1646 -1.25000000000000e+01 1649 1314 4.16666666666667e+00 1649 1641 -4.16666666666667e+00 1649 1585 8.33333333333333e+00 1649 1575 4.16666666666667e+00 1649 1572 -4.16666666666667e+00 1649 1576 -8.33333333333333e+00 1649 1642 8.33333333333333e+00 1649 1586 -3.75000000000000e+01 1649 1664 -1.25000000000000e+01 1649 1348 4.16666666666667e+00 1649 1663 -4.16666666666667e+00 1649 1584 8.33333333333333e+00 1649 1662 8.33333333333333e+00 1649 1647 -1.66666666666667e+01 1649 1675 4.16666666666667e+00 1649 1643 -1.25000000000000e+01 1649 1573 -4.16666666666667e+00 1649 1315 4.16666666666667e+00 1650 1650 1.25000000000000e+02 1650 1619 -4.16666666666667e+00 1650 1618 8.33333333333333e+00 1650 1617 -1.25000000000000e+01 1650 1610 4.16666666666667e+00 1650 1511 4.16666666666667e+00 1650 1505 -4.16666666666667e+00 1650 1651 -1.66666666666667e+01 1650 1504 8.33333333333333e+00 1650 1316 8.33333333333333e+00 1650 1315 -4.16666666666667e+00 1650 1314 -1.25000000000000e+01 1650 1503 -1.25000000000000e+01 1650 1652 -1.66666666666667e+01 1650 1364 8.33333333333333e+00 1650 1363 -4.16666666666667e+00 1650 1510 4.16666666666667e+00 1650 1609 4.16666666666667e+00 1650 1362 -1.25000000000000e+01 1650 1846 4.16666666666667e+00 1650 1847 -8.33333333333333e+00 1650 1655 8.33333333333333e+00 1650 1654 8.33333333333333e+00 1650 1653 -3.75000000000000e+01 1650 1849 -4.16666666666667e+00 1650 1850 -4.16666666666667e+00 1650 1658 4.16666666666667e+00 1650 1657 -8.33333333333333e+00 1650 2356 -4.16666666666667e+00 1650 2366 4.16666666666667e+00 1650 2365 -8.33333333333333e+00 1650 2357 -4.16666666666667e+00 1650 2398 8.33333333333333e+00 1650 2387 -8.33333333333333e+00 1650 2386 4.16666666666667e+00 1650 2399 8.33333333333333e+00 1650 2397 -3.75000000000000e+01 1651 1651 1.25000000000000e+02 1651 1619 8.33333333333333e+00 1651 1618 -3.75000000000000e+01 1651 1617 8.33333333333333e+00 1651 1610 -8.33333333333333e+00 1651 1650 -1.66666666666667e+01 1651 1503 8.33333333333333e+00 1651 1316 8.33333333333333e+00 1651 1652 -1.66666666666667e+01 1651 1505 8.33333333333333e+00 1651 1315 -1.25000000000000e+01 1651 1504 -3.75000000000000e+01 1651 1314 -4.16666666666667e+00 1651 1364 8.33333333333333e+00 1651 1511 -8.33333333333333e+00 1651 1608 4.16666666666667e+00 1651 1363 -1.25000000000000e+01 1651 1362 -4.16666666666667e+00 1651 1509 4.16666666666667e+00 1651 1845 4.16666666666667e+00 1651 1847 4.16666666666667e+00 1651 1655 -4.16666666666667e+00 1651 1654 -1.25000000000000e+01 1651 1653 8.33333333333333e+00 1651 1658 4.16666666666667e+00 1651 1850 -4.16666666666667e+00 1651 1848 -4.16666666666667e+00 1651 1656 -8.33333333333333e+00 1651 2355 -4.16666666666667e+00 1651 2366 4.16666666666667e+00 1651 2357 -4.16666666666667e+00 1651 2364 -8.33333333333333e+00 1651 2387 4.16666666666667e+00 1651 2399 -4.16666666666667e+00 1651 2397 8.33333333333333e+00 1651 2385 4.16666666666667e+00 1651 2398 -1.25000000000000e+01 1652 1652 1.25000000000000e+02 1652 1619 -1.25000000000000e+01 1652 1618 8.33333333333333e+00 1652 1617 -4.16666666666667e+00 1652 1609 -8.33333333333333e+00 1652 1608 4.16666666666667e+00 1652 1509 4.16666666666667e+00 1652 1503 -4.16666666666667e+00 1652 1316 -3.75000000000000e+01 1652 1505 -1.25000000000000e+01 1652 1315 8.33333333333333e+00 1652 1651 -1.66666666666667e+01 1652 1504 8.33333333333333e+00 1652 1314 8.33333333333333e+00 1652 1364 -3.75000000000000e+01 1652 1363 8.33333333333333e+00 1652 1510 -8.33333333333333e+00 1652 1650 -1.66666666666667e+01 1652 1362 8.33333333333333e+00 1652 1846 4.16666666666667e+00 1652 1845 -8.33333333333333e+00 1652 1655 -1.25000000000000e+01 1652 1654 -4.16666666666667e+00 1652 1653 8.33333333333333e+00 1652 1657 4.16666666666667e+00 1652 1849 -4.16666666666667e+00 1652 1848 -4.16666666666667e+00 1652 1656 4.16666666666667e+00 1652 2356 -4.16666666666667e+00 1652 2364 4.16666666666667e+00 1652 2355 -4.16666666666667e+00 1652 2386 4.16666666666667e+00 1652 2398 -4.16666666666667e+00 1652 2385 -8.33333333333333e+00 1652 2365 4.16666666666667e+00 1652 2399 -1.25000000000000e+01 1652 2397 8.33333333333333e+00 1653 1653 1.25000000000000e+02 1653 1613 4.16666666666667e+00 1653 1610 -4.16666666666667e+00 1653 1622 -4.16666666666667e+00 1653 1619 4.16666666666667e+00 1653 1621 8.33333333333333e+00 1653 1618 -8.33333333333333e+00 1653 1609 -4.16666666666667e+00 1653 1620 -1.25000000000000e+01 1653 1849 4.16666666666667e+00 1653 1846 -4.16666666666667e+00 1653 1850 4.16666666666667e+00 1653 1652 8.33333333333333e+00 1653 1651 8.33333333333333e+00 1653 1654 -1.66666666666667e+01 1653 1650 -3.75000000000000e+01 1653 1847 8.33333333333333e+00 1653 1845 -1.25000000000000e+01 1653 1655 -1.66666666666667e+01 1653 1658 -4.16666666666667e+00 1653 1657 8.33333333333333e+00 1653 1856 -4.16666666666667e+00 1653 1676 4.16666666666667e+00 1653 1675 -8.33333333333333e+00 1653 1669 8.33333333333333e+00 1653 1316 -8.33333333333333e+00 1653 1643 8.33333333333333e+00 1653 1315 4.16666666666667e+00 1653 1642 -4.16666666666667e+00 1653 1656 -1.25000000000000e+01 1653 1641 -1.25000000000000e+01 1653 1670 8.33333333333333e+00 1653 1367 -8.33333333333333e+00 1653 1855 -4.16666666666667e+00 1653 1366 4.16666666666667e+00 1653 1612 4.16666666666667e+00 1653 1668 -3.75000000000000e+01 1654 1654 1.25000000000000e+02 1654 1613 -8.33333333333333e+00 1654 1610 -4.16666666666667e+00 1654 1619 4.16666666666667e+00 1654 1620 8.33333333333333e+00 1654 1617 -8.33333333333333e+00 1654 1608 -4.16666666666667e+00 1654 1622 8.33333333333333e+00 1654 1621 -3.75000000000000e+01 1654 1848 4.16666666666667e+00 1654 1845 -4.16666666666667e+00 1654 1847 8.33333333333333e+00 1654 1850 -8.33333333333333e+00 1654 1652 -4.16666666666667e+00 1654 1316 4.16666666666667e+00 1654 1651 -1.25000000000000e+01 1654 1650 8.33333333333333e+00 1654 1653 -1.66666666666667e+01 1654 1367 4.16666666666667e+00 1654 1846 -1.25000000000000e+01 1654 1670 -4.16666666666667e+00 1654 1676 4.16666666666667e+00 1654 1856 -4.16666666666667e+00 1654 1656 8.33333333333333e+00 1654 1674 -8.33333333333333e+00 1654 1668 8.33333333333333e+00 1654 1658 8.33333333333333e+00 1654 1643 8.33333333333333e+00 1654 1655 -1.66666666666667e+01 1654 1657 -3.75000000000000e+01 1654 1642 -1.25000000000000e+01 1654 1314 4.16666666666667e+00 1654 1641 -4.16666666666667e+00 1654 1611 4.16666666666667e+00 1654 1669 -1.25000000000000e+01 1654 1854 -4.16666666666667e+00 1654 1365 4.16666666666667e+00 1655 1655 1.25000000000000e+02 1655 1611 4.16666666666667e+00 1655 1608 -4.16666666666667e+00 1655 1609 -4.16666666666667e+00 1655 1618 4.16666666666667e+00 1655 1620 -4.16666666666667e+00 1655 1617 4.16666666666667e+00 1655 1622 -1.25000000000000e+01 1655 1621 8.33333333333333e+00 1655 1846 8.33333333333333e+00 1655 1849 -8.33333333333333e+00 1655 1848 4.16666666666667e+00 1655 1652 -1.25000000000000e+01 1655 1651 -4.16666666666667e+00 1655 1315 4.16666666666667e+00 1655 1650 8.33333333333333e+00 1655 1847 -3.75000000000000e+01 1655 1366 4.16666666666667e+00 1655 1845 8.33333333333333e+00 1655 1669 -4.16666666666667e+00 1655 1653 -1.66666666666667e+01 1655 1656 -4.16666666666667e+00 1655 1675 4.16666666666667e+00 1655 1855 -4.16666666666667e+00 1655 1854 -4.16666666666667e+00 1655 1674 4.16666666666667e+00 1655 1658 -1.25000000000000e+01 1655 1643 -3.75000000000000e+01 1655 1657 8.33333333333333e+00 1655 1642 8.33333333333333e+00 1655 1654 -1.66666666666667e+01 1655 1314 -8.33333333333333e+00 1655 1641 8.33333333333333e+00 1655 1612 -8.33333333333333e+00 1655 1670 -1.25000000000000e+01 1655 1668 8.33333333333333e+00 1655 1365 -8.33333333333333e+00 1656 1656 1.25000000000000e+02 1656 1648 -4.16666666666667e+00 1656 1819 -8.33333333333333e+00 1656 1649 8.33333333333333e+00 1656 1647 -1.25000000000000e+01 1656 1814 -4.16666666666667e+00 1656 1813 8.33333333333333e+00 1656 1812 -1.25000000000000e+01 1656 1646 -8.33333333333333e+00 1656 1645 4.16666666666667e+00 1656 1643 4.16666666666667e+00 1656 1655 -4.16666666666667e+00 1656 1657 -1.66666666666667e+01 1656 1675 8.33333333333333e+00 1656 1654 8.33333333333333e+00 1656 1676 8.33333333333333e+00 1656 1856 -8.33333333333333e+00 1656 1378 -4.16666666666667e+00 1656 1855 4.16666666666667e+00 1656 1674 -3.75000000000000e+01 1656 1315 -4.16666666666667e+00 1656 1642 4.16666666666667e+00 1656 1653 -1.25000000000000e+01 1656 1505 8.33333333333333e+00 1656 1658 -1.66666666666667e+01 1656 1850 8.33333333333333e+00 1656 1513 4.16666666666667e+00 1656 1849 -4.16666666666667e+00 1656 1652 4.16666666666667e+00 1656 1316 -4.16666666666667e+00 1656 1504 8.33333333333333e+00 1656 1651 -8.33333333333333e+00 1656 1503 -3.75000000000000e+01 1656 1514 4.16666666666667e+00 1656 1379 -4.16666666666667e+00 1656 1848 -1.25000000000000e+01 1656 1820 4.16666666666667e+00 1657 1657 1.25000000000000e+02 1657 1647 -4.16666666666667e+00 1657 1820 4.16666666666667e+00 1657 1818 -8.33333333333333e+00 1657 1648 -1.25000000000000e+01 1657 1646 4.16666666666667e+00 1657 1812 8.33333333333333e+00 1657 1814 8.33333333333333e+00 1657 1813 -3.75000000000000e+01 1657 1644 4.16666666666667e+00 1657 1658 -1.66666666666667e+01 1657 1316 -4.16666666666667e+00 1657 1379 -4.16666666666667e+00 1657 1676 -4.16666666666667e+00 1657 1856 4.16666666666667e+00 1657 1656 -1.66666666666667e+01 1657 1674 8.33333333333333e+00 1657 1653 8.33333333333333e+00 1657 1675 -1.25000000000000e+01 1657 1377 -4.16666666666667e+00 1657 1854 4.16666666666667e+00 1657 1643 -8.33333333333333e+00 1657 1655 8.33333333333333e+00 1657 1654 -3.75000000000000e+01 1657 1314 -4.16666666666667e+00 1657 1641 4.16666666666667e+00 1657 1505 -4.16666666666667e+00 1657 1652 4.16666666666667e+00 1657 1512 4.16666666666667e+00 1657 1848 -4.16666666666667e+00 1657 1504 -1.25000000000000e+01 1657 1503 8.33333333333333e+00 1657 1650 -8.33333333333333e+00 1657 1514 -8.33333333333333e+00 1657 1850 8.33333333333333e+00 1657 1849 -1.25000000000000e+01 1657 1649 8.33333333333333e+00 1658 1658 1.25000000000000e+02 1658 1648 8.33333333333333e+00 1658 1819 4.16666666666667e+00 1658 1649 -3.75000000000000e+01 1658 1647 8.33333333333333e+00 1658 1812 -4.16666666666667e+00 1658 1645 4.16666666666667e+00 1658 1814 -1.25000000000000e+01 1658 1813 8.33333333333333e+00 1658 1644 -8.33333333333333e+00 1658 1657 -1.66666666666667e+01 1658 1315 -4.16666666666667e+00 1658 1378 -4.16666666666667e+00 1658 1641 4.16666666666667e+00 1658 1653 -4.16666666666667e+00 1658 1675 -4.16666666666667e+00 1658 1855 4.16666666666667e+00 1658 1676 -1.25000000000000e+01 1658 1674 8.33333333333333e+00 1658 1854 -8.33333333333333e+00 1658 1655 -1.25000000000000e+01 1658 1642 -8.33333333333333e+00 1658 1654 8.33333333333333e+00 1658 1504 -4.16666666666667e+00 1658 1651 4.16666666666667e+00 1658 1503 8.33333333333333e+00 1658 1656 -1.66666666666667e+01 1658 1848 8.33333333333333e+00 1658 1505 -1.25000000000000e+01 1658 1650 4.16666666666667e+00 1658 1314 -4.16666666666667e+00 1658 1850 -3.75000000000000e+01 1658 1818 4.16666666666667e+00 1658 1513 -8.33333333333333e+00 1658 1849 8.33333333333333e+00 1658 1512 4.16666666666667e+00 1658 1377 -4.16666666666667e+00 1659 1659 1.25000000000000e+02 1659 1594 -4.16666666666667e+00 1659 1589 -8.33333333333333e+00 1659 1595 8.33333333333333e+00 1659 1593 -1.25000000000000e+01 1659 1772 4.16666666666667e+00 1659 1771 -8.33333333333333e+00 1659 1667 -4.16666666666667e+00 1659 1666 8.33333333333333e+00 1659 1665 -1.25000000000000e+01 1659 1558 -4.16666666666667e+00 1659 1567 4.16666666666667e+00 1659 1568 4.16666666666667e+00 1659 1631 -4.16666666666667e+00 1659 1336 8.33333333333333e+00 1659 1660 -1.66666666666667e+01 1659 1630 8.33333333333333e+00 1659 1629 -1.25000000000000e+01 1659 1559 -4.16666666666667e+00 1659 1625 4.16666666666667e+00 1659 1318 8.33333333333333e+00 1659 1624 -8.33333333333333e+00 1659 1520 -4.16666666666667e+00 1659 1517 4.16666666666667e+00 1659 1337 8.33333333333333e+00 1659 1778 -8.33333333333333e+00 1659 1777 4.16666666666667e+00 1659 1519 -4.16666666666667e+00 1659 1335 -3.75000000000000e+01 1659 1661 -1.66666666666667e+01 1659 1673 8.33333333333333e+00 1659 1319 8.33333333333333e+00 1659 1672 -4.16666666666667e+00 1659 1516 4.16666666666667e+00 1659 1588 4.16666666666667e+00 1659 1671 -1.25000000000000e+01 1659 1317 -3.75000000000000e+01 1660 1660 1.25000000000000e+02 1660 1593 -4.16666666666667e+00 1660 1595 8.33333333333333e+00 1660 1589 4.16666666666667e+00 1660 1594 -1.25000000000000e+01 1660 1772 4.16666666666667e+00 1660 1770 -8.33333333333333e+00 1660 1667 8.33333333333333e+00 1660 1666 -3.75000000000000e+01 1660 1665 8.33333333333333e+00 1660 1661 -1.66666666666667e+01 1660 1319 -4.16666666666667e+00 1660 1337 -4.16666666666667e+00 1660 1625 4.16666666666667e+00 1660 1559 -4.16666666666667e+00 1660 1557 -4.16666666666667e+00 1660 1566 4.16666666666667e+00 1660 1568 -8.33333333333333e+00 1660 1631 8.33333333333333e+00 1660 1630 -3.75000000000000e+01 1660 1335 8.33333333333333e+00 1660 1659 -1.66666666666667e+01 1660 1629 8.33333333333333e+00 1660 1317 8.33333333333333e+00 1660 1623 -8.33333333333333e+00 1660 1778 4.16666666666667e+00 1660 1520 -4.16666666666667e+00 1660 1336 -1.25000000000000e+01 1660 1776 4.16666666666667e+00 1660 1518 -4.16666666666667e+00 1660 1673 8.33333333333333e+00 1660 1517 -8.33333333333333e+00 1660 1587 4.16666666666667e+00 1660 1672 -1.25000000000000e+01 1660 1318 -1.25000000000000e+01 1660 1671 -4.16666666666667e+00 1660 1515 4.16666666666667e+00 1661 1661 1.25000000000000e+02 1661 1588 4.16666666666667e+00 1661 1587 -8.33333333333333e+00 1661 1595 -3.75000000000000e+01 1661 1593 8.33333333333333e+00 1661 1771 4.16666666666667e+00 1661 1770 4.16666666666667e+00 1661 1667 -1.25000000000000e+01 1661 1666 8.33333333333333e+00 1661 1665 -4.16666666666667e+00 1661 1660 -1.66666666666667e+01 1661 1318 -4.16666666666667e+00 1661 1336 -4.16666666666667e+00 1661 1624 4.16666666666667e+00 1661 1558 -4.16666666666667e+00 1661 1631 -1.25000000000000e+01 1661 1567 -8.33333333333333e+00 1661 1630 8.33333333333333e+00 1661 1566 4.16666666666667e+00 1661 1629 -4.16666666666667e+00 1661 1557 -4.16666666666667e+00 1661 1623 4.16666666666667e+00 1661 1777 4.16666666666667e+00 1661 1519 -4.16666666666667e+00 1661 1518 -4.16666666666667e+00 1661 1515 4.16666666666667e+00 1661 1337 -1.25000000000000e+01 1661 1335 8.33333333333333e+00 1661 1776 -8.33333333333333e+00 1661 1594 8.33333333333333e+00 1661 1673 -3.75000000000000e+01 1661 1319 -1.25000000000000e+01 1661 1672 8.33333333333333e+00 1661 1516 -8.33333333333333e+00 1661 1659 -1.66666666666667e+01 1661 1671 8.33333333333333e+00 1661 1317 8.33333333333333e+00 1662 1662 1.25000000000000e+02 1662 1600 -4.16666666666667e+00 1662 1601 8.33333333333333e+00 1662 1589 4.16666666666667e+00 1662 1599 -1.25000000000000e+01 1662 1817 4.16666666666667e+00 1662 1816 -8.33333333333333e+00 1662 1667 8.33333333333333e+00 1662 1666 8.33333333333333e+00 1662 1665 -3.75000000000000e+01 1662 1664 -1.66666666666667e+01 1662 1349 -4.16666666666667e+00 1662 1319 -4.16666666666667e+00 1662 1577 -4.16666666666667e+00 1662 1643 4.16666666666667e+00 1662 1576 -4.16666666666667e+00 1662 1585 4.16666666666667e+00 1662 1586 -8.33333333333333e+00 1662 1649 8.33333333333333e+00 1662 1348 8.33333333333333e+00 1662 1663 -1.66666666666667e+01 1662 1648 8.33333333333333e+00 1662 1647 -3.75000000000000e+01 1662 1318 8.33333333333333e+00 1662 1642 -8.33333333333333e+00 1662 1523 -4.16666666666667e+00 1662 1820 4.16666666666667e+00 1662 1819 4.16666666666667e+00 1662 1522 -4.16666666666667e+00 1662 1347 -1.25000000000000e+01 1662 1676 8.33333333333333e+00 1662 1517 -8.33333333333333e+00 1662 1675 -4.16666666666667e+00 1662 1516 4.16666666666667e+00 1662 1674 -1.25000000000000e+01 1662 1588 4.16666666666667e+00 1662 1317 -1.25000000000000e+01 1663 1663 1.25000000000000e+02 1663 1599 -4.16666666666667e+00 1663 1589 -8.33333333333333e+00 1663 1601 8.33333333333333e+00 1663 1600 -1.25000000000000e+01 1663 1817 4.16666666666667e+00 1663 1815 -8.33333333333333e+00 1663 1667 -4.16666666666667e+00 1663 1666 -1.25000000000000e+01 1663 1665 8.33333333333333e+00 1663 1575 -4.16666666666667e+00 1663 1584 4.16666666666667e+00 1663 1586 4.16666666666667e+00 1663 1649 -4.16666666666667e+00 1663 1648 -1.25000000000000e+01 1663 1347 8.33333333333333e+00 1663 1662 -1.66666666666667e+01 1663 1647 8.33333333333333e+00 1663 1577 -4.16666666666667e+00 1663 1643 4.16666666666667e+00 1663 1317 8.33333333333333e+00 1663 1641 -8.33333333333333e+00 1663 1523 -4.16666666666667e+00 1663 1517 4.16666666666667e+00 1663 1820 -8.33333333333333e+00 1663 1349 8.33333333333333e+00 1663 1348 -3.75000000000000e+01 1663 1818 4.16666666666667e+00 1663 1521 -4.16666666666667e+00 1663 1676 8.33333333333333e+00 1663 1664 -1.66666666666667e+01 1663 1319 8.33333333333333e+00 1663 1675 -1.25000000000000e+01 1663 1587 4.16666666666667e+00 1663 1318 -3.75000000000000e+01 1663 1674 -4.16666666666667e+00 1663 1515 4.16666666666667e+00 1664 1664 1.25000000000000e+02 1664 1588 -8.33333333333333e+00 1664 1587 4.16666666666667e+00 1664 1601 -3.75000000000000e+01 1664 1600 8.33333333333333e+00 1664 1815 4.16666666666667e+00 1664 1816 4.16666666666667e+00 1664 1667 -1.25000000000000e+01 1664 1666 -4.16666666666667e+00 1664 1665 8.33333333333333e+00 1664 1662 -1.66666666666667e+01 1664 1347 -4.16666666666667e+00 1664 1317 -4.16666666666667e+00 1664 1575 -4.16666666666667e+00 1664 1641 4.16666666666667e+00 1664 1649 -1.25000000000000e+01 1664 1585 4.16666666666667e+00 1664 1648 -4.16666666666667e+00 1664 1584 -8.33333333333333e+00 1664 1647 8.33333333333333e+00 1664 1576 -4.16666666666667e+00 1664 1642 4.16666666666667e+00 1664 1521 -4.16666666666667e+00 1664 1818 4.16666666666667e+00 1664 1522 -4.16666666666667e+00 1664 1516 4.16666666666667e+00 1664 1349 -1.25000000000000e+01 1664 1819 -8.33333333333333e+00 1664 1348 8.33333333333333e+00 1664 1676 -3.75000000000000e+01 1664 1599 8.33333333333333e+00 1664 1319 -1.25000000000000e+01 1664 1675 8.33333333333333e+00 1664 1663 -1.66666666666667e+01 1664 1318 8.33333333333333e+00 1664 1674 8.33333333333333e+00 1664 1515 -8.33333333333333e+00 1665 1665 1.25000000000000e+02 1665 1601 -8.33333333333333e+00 1665 1817 -4.16666666666667e+00 1665 1522 4.16666666666667e+00 1665 1523 4.16666666666667e+00 1665 1816 8.33333333333333e+00 1665 1815 -1.25000000000000e+01 1665 1664 8.33333333333333e+00 1665 1663 8.33333333333333e+00 1665 1662 -3.75000000000000e+01 1665 1588 -4.16666666666667e+00 1665 1589 -4.16666666666667e+00 1665 1603 -4.16666666666667e+00 1665 1594 4.16666666666667e+00 1665 1595 4.16666666666667e+00 1665 1604 8.33333333333333e+00 1665 1667 -1.66666666666667e+01 1665 1602 -1.25000000000000e+01 1665 1516 -4.16666666666667e+00 1665 1666 -1.66666666666667e+01 1665 1772 8.33333333333333e+00 1665 1525 -4.16666666666667e+00 1665 1519 4.16666666666667e+00 1665 1517 8.33333333333333e+00 1665 1520 -8.33333333333333e+00 1665 1355 4.16666666666667e+00 1665 1526 -4.16666666666667e+00 1665 1771 8.33333333333333e+00 1665 1354 -8.33333333333333e+00 1665 1770 -3.75000000000000e+01 1665 1661 -4.16666666666667e+00 1665 1319 4.16666666666667e+00 1665 1660 8.33333333333333e+00 1665 1318 -8.33333333333333e+00 1665 1659 -1.25000000000000e+01 1665 1600 4.16666666666667e+00 1665 1515 -1.25000000000000e+01 1666 1666 1.25000000000000e+02 1666 1601 4.16666666666667e+00 1666 1817 8.33333333333333e+00 1666 1521 4.16666666666667e+00 1666 1523 -8.33333333333333e+00 1666 1816 -3.75000000000000e+01 1666 1815 8.33333333333333e+00 1666 1664 -4.16666666666667e+00 1666 1663 -1.25000000000000e+01 1666 1662 8.33333333333333e+00 1666 1587 -4.16666666666667e+00 1666 1604 8.33333333333333e+00 1666 1602 -4.16666666666667e+00 1666 1593 4.16666666666667e+00 1666 1595 -8.33333333333333e+00 1666 1355 4.16666666666667e+00 1666 1603 -1.25000000000000e+01 1666 1589 -4.16666666666667e+00 1666 1319 4.16666666666667e+00 1666 1515 -4.16666666666667e+00 1666 1772 -4.16666666666667e+00 1666 1665 -1.66666666666667e+01 1666 1524 -4.16666666666667e+00 1666 1518 4.16666666666667e+00 1666 1526 -4.16666666666667e+00 1666 1520 4.16666666666667e+00 1666 1771 -1.25000000000000e+01 1666 1770 8.33333333333333e+00 1666 1353 -8.33333333333333e+00 1666 1661 8.33333333333333e+00 1666 1667 -1.66666666666667e+01 1666 1517 8.33333333333333e+00 1666 1660 -3.75000000000000e+01 1666 1599 4.16666666666667e+00 1666 1516 -1.25000000000000e+01 1666 1659 8.33333333333333e+00 1666 1317 -8.33333333333333e+00 1667 1667 1.25000000000000e+02 1667 1599 -8.33333333333333e+00 1667 1815 -4.16666666666667e+00 1667 1816 8.33333333333333e+00 1667 1522 -8.33333333333333e+00 1667 1521 4.16666666666667e+00 1667 1817 -1.25000000000000e+01 1667 1664 -1.25000000000000e+01 1667 1663 -4.16666666666667e+00 1667 1662 8.33333333333333e+00 1667 1587 -4.16666666666667e+00 1667 1603 8.33333333333333e+00 1667 1594 -8.33333333333333e+00 1667 1593 4.16666666666667e+00 1667 1604 -3.75000000000000e+01 1667 1354 4.16666666666667e+00 1667 1602 8.33333333333333e+00 1667 1665 -1.66666666666667e+01 1667 1588 -4.16666666666667e+00 1667 1318 4.16666666666667e+00 1667 1771 -4.16666666666667e+00 1667 1770 8.33333333333333e+00 1667 1525 -4.16666666666667e+00 1667 1519 4.16666666666667e+00 1667 1515 8.33333333333333e+00 1667 1518 -8.33333333333333e+00 1667 1772 -1.25000000000000e+01 1667 1353 4.16666666666667e+00 1667 1524 -4.16666666666667e+00 1667 1661 -1.25000000000000e+01 1667 1600 4.16666666666667e+00 1667 1517 -3.75000000000000e+01 1667 1660 8.33333333333333e+00 1667 1666 -1.66666666666667e+01 1667 1516 8.33333333333333e+00 1667 1659 -4.16666666666667e+00 1667 1317 4.16666666666667e+00 1668 1668 1.25000000000000e+02 1668 1643 -8.33333333333333e+00 1668 1642 4.16666666666667e+00 1668 1655 8.33333333333333e+00 1668 1653 -3.75000000000000e+01 1668 1855 4.16666666666667e+00 1668 1856 4.16666666666667e+00 1668 1676 -4.16666666666667e+00 1668 1675 8.33333333333333e+00 1668 1674 -1.25000000000000e+01 1668 1612 -4.16666666666667e+00 1668 1613 -4.16666666666667e+00 1668 1622 4.16666666666667e+00 1668 1621 -8.33333333333333e+00 1668 1625 4.16666666666667e+00 1668 1637 -4.16666666666667e+00 1668 1669 -1.66666666666667e+01 1668 1636 8.33333333333333e+00 1668 1624 4.16666666666667e+00 1668 1318 -4.16666666666667e+00 1668 1366 -4.16666666666667e+00 1668 1635 -1.25000000000000e+01 1668 1517 4.16666666666667e+00 1668 1529 -4.16666666666667e+00 1668 1852 4.16666666666667e+00 1668 1528 -4.16666666666667e+00 1668 1367 8.33333333333333e+00 1668 1853 -8.33333333333333e+00 1668 1365 -1.25000000000000e+01 1668 1670 -1.66666666666667e+01 1668 1673 8.33333333333333e+00 1668 1319 8.33333333333333e+00 1668 1672 8.33333333333333e+00 1668 1516 -8.33333333333333e+00 1668 1654 8.33333333333333e+00 1668 1671 -3.75000000000000e+01 1668 1317 -1.25000000000000e+01 1669 1669 1.25000000000000e+02 1669 1655 -4.16666666666667e+00 1669 1653 8.33333333333333e+00 1669 1641 4.16666666666667e+00 1669 1654 -1.25000000000000e+01 1669 1854 4.16666666666667e+00 1669 1856 -8.33333333333333e+00 1669 1676 8.33333333333333e+00 1669 1675 -3.75000000000000e+01 1669 1674 8.33333333333333e+00 1669 1611 -4.16666666666667e+00 1669 1613 -4.16666666666667e+00 1669 1622 4.16666666666667e+00 1669 1620 -8.33333333333333e+00 1669 1668 -1.66666666666667e+01 1669 1635 8.33333333333333e+00 1669 1625 -8.33333333333333e+00 1669 1319 8.33333333333333e+00 1669 1623 4.16666666666667e+00 1669 1317 -4.16666666666667e+00 1669 1637 8.33333333333333e+00 1669 1670 -1.66666666666667e+01 1669 1367 8.33333333333333e+00 1669 1636 -3.75000000000000e+01 1669 1365 -4.16666666666667e+00 1669 1851 4.16666666666667e+00 1669 1527 -4.16666666666667e+00 1669 1853 4.16666666666667e+00 1669 1529 -4.16666666666667e+00 1669 1366 -1.25000000000000e+01 1669 1673 -4.16666666666667e+00 1669 1517 4.16666666666667e+00 1669 1643 4.16666666666667e+00 1669 1672 -1.25000000000000e+01 1669 1318 -1.25000000000000e+01 1669 1671 8.33333333333333e+00 1669 1515 -8.33333333333333e+00 1670 1670 1.25000000000000e+02 1670 1654 -4.16666666666667e+00 1670 1641 -8.33333333333333e+00 1670 1655 -1.25000000000000e+01 1670 1653 8.33333333333333e+00 1670 1855 -8.33333333333333e+00 1670 1854 4.16666666666667e+00 1670 1676 -1.25000000000000e+01 1670 1675 8.33333333333333e+00 1670 1674 -4.16666666666667e+00 1670 1612 -4.16666666666667e+00 1670 1621 4.16666666666667e+00 1670 1611 -4.16666666666667e+00 1670 1620 4.16666666666667e+00 1670 1623 4.16666666666667e+00 1670 1635 -4.16666666666667e+00 1670 1624 -8.33333333333333e+00 1670 1318 8.33333333333333e+00 1670 1637 -1.25000000000000e+01 1670 1636 8.33333333333333e+00 1670 1669 -1.66666666666667e+01 1670 1366 8.33333333333333e+00 1670 1515 4.16666666666667e+00 1670 1527 -4.16666666666667e+00 1670 1367 -3.75000000000000e+01 1670 1852 4.16666666666667e+00 1670 1528 -4.16666666666667e+00 1670 1365 8.33333333333333e+00 1670 1851 -8.33333333333333e+00 1670 1642 4.16666666666667e+00 1670 1673 -1.25000000000000e+01 1670 1319 -3.75000000000000e+01 1670 1672 -4.16666666666667e+00 1670 1516 4.16666666666667e+00 1670 1668 -1.66666666666667e+01 1670 1671 8.33333333333333e+00 1670 1317 8.33333333333333e+00 1671 1671 1.25000000000000e+02 1671 1630 4.16666666666667e+00 1671 1777 8.33333333333333e+00 1671 1520 4.16666666666667e+00 1671 1519 -8.33333333333333e+00 1671 1778 8.33333333333333e+00 1671 1776 -3.75000000000000e+01 1671 1661 8.33333333333333e+00 1671 1660 -4.16666666666667e+00 1671 1659 -1.25000000000000e+01 1671 1625 -4.16666666666667e+00 1671 1640 -4.16666666666667e+00 1671 1637 4.16666666666667e+00 1671 1639 8.33333333333333e+00 1671 1636 -8.33333333333333e+00 1671 1372 4.16666666666667e+00 1671 1638 -1.25000000000000e+01 1671 1624 -4.16666666666667e+00 1671 1318 4.16666666666667e+00 1671 1517 -4.16666666666667e+00 1671 1673 -1.66666666666667e+01 1671 1852 -4.16666666666667e+00 1671 1532 -4.16666666666667e+00 1671 1529 4.16666666666667e+00 1671 1531 -4.16666666666667e+00 1671 1528 4.16666666666667e+00 1671 1853 8.33333333333333e+00 1671 1373 -8.33333333333333e+00 1671 1851 -1.25000000000000e+01 1671 1670 8.33333333333333e+00 1671 1319 -8.33333333333333e+00 1671 1669 8.33333333333333e+00 1671 1672 -1.66666666666667e+01 1671 1516 8.33333333333333e+00 1671 1668 -3.75000000000000e+01 1671 1631 4.16666666666667e+00 1671 1515 -1.25000000000000e+01 1672 1672 1.25000000000000e+02 1672 1629 4.16666666666667e+00 1672 1778 -4.16666666666667e+00 1672 1520 4.16666666666667e+00 1672 1776 8.33333333333333e+00 1672 1518 -8.33333333333333e+00 1672 1777 -1.25000000000000e+01 1672 1661 8.33333333333333e+00 1672 1660 -1.25000000000000e+01 1672 1659 -4.16666666666667e+00 1672 1625 -4.16666666666667e+00 1672 1638 8.33333333333333e+00 1672 1637 4.16666666666667e+00 1672 1635 -8.33333333333333e+00 1672 1640 8.33333333333333e+00 1672 1673 -1.66666666666667e+01 1672 1639 -3.75000000000000e+01 1672 1371 4.16666666666667e+00 1672 1623 -4.16666666666667e+00 1672 1317 4.16666666666667e+00 1672 1851 -4.16666666666667e+00 1672 1853 8.33333333333333e+00 1672 1517 8.33333333333333e+00 1672 1529 -8.33333333333333e+00 1672 1530 -4.16666666666667e+00 1672 1527 4.16666666666667e+00 1672 1373 4.16666666666667e+00 1672 1532 -4.16666666666667e+00 1672 1852 -1.25000000000000e+01 1672 1670 -4.16666666666667e+00 1672 1319 4.16666666666667e+00 1672 1669 -1.25000000000000e+01 1672 1631 -8.33333333333333e+00 1672 1516 -3.75000000000000e+01 1672 1668 8.33333333333333e+00 1672 1671 -1.66666666666667e+01 1672 1515 8.33333333333333e+00 1673 1673 1.25000000000000e+02 1673 1630 -8.33333333333333e+00 1673 1777 -4.16666666666667e+00 1673 1519 4.16666666666667e+00 1673 1518 4.16666666666667e+00 1673 1778 -1.25000000000000e+01 1673 1776 8.33333333333333e+00 1673 1661 -3.75000000000000e+01 1673 1660 8.33333333333333e+00 1673 1659 8.33333333333333e+00 1673 1623 -4.16666666666667e+00 1673 1624 -4.16666666666667e+00 1673 1638 -4.16666666666667e+00 1673 1635 4.16666666666667e+00 1673 1636 4.16666666666667e+00 1673 1640 -1.25000000000000e+01 1673 1639 8.33333333333333e+00 1673 1672 -1.66666666666667e+01 1673 1515 -4.16666666666667e+00 1673 1671 -1.66666666666667e+01 1673 1852 8.33333333333333e+00 1673 1530 -4.16666666666667e+00 1673 1527 4.16666666666667e+00 1673 1516 8.33333333333333e+00 1673 1528 -8.33333333333333e+00 1673 1853 -3.75000000000000e+01 1673 1372 4.16666666666667e+00 1673 1531 -4.16666666666667e+00 1673 1851 8.33333333333333e+00 1673 1371 -8.33333333333333e+00 1673 1670 -1.25000000000000e+01 1673 1629 4.16666666666667e+00 1673 1517 -1.25000000000000e+01 1673 1669 -4.16666666666667e+00 1673 1318 4.16666666666667e+00 1673 1668 8.33333333333333e+00 1673 1317 -8.33333333333333e+00 1674 1674 1.25000000000000e+02 1674 1648 4.16666666666667e+00 1674 1523 4.16666666666667e+00 1674 1820 -4.16666666666667e+00 1674 1819 8.33333333333333e+00 1674 1522 -8.33333333333333e+00 1674 1818 -1.25000000000000e+01 1674 1664 8.33333333333333e+00 1674 1663 -4.16666666666667e+00 1674 1662 -1.25000000000000e+01 1674 1643 -4.16666666666667e+00 1674 1657 8.33333333333333e+00 1674 1655 4.16666666666667e+00 1674 1654 -8.33333333333333e+00 1674 1658 8.33333333333333e+00 1674 1676 -1.66666666666667e+01 1674 1378 4.16666666666667e+00 1674 1656 -3.75000000000000e+01 1674 1642 -4.16666666666667e+00 1674 1318 4.16666666666667e+00 1674 1855 -4.16666666666667e+00 1674 1856 8.33333333333333e+00 1674 1517 8.33333333333333e+00 1674 1529 -8.33333333333333e+00 1674 1534 -4.16666666666667e+00 1674 1528 4.16666666666667e+00 1674 1379 4.16666666666667e+00 1674 1535 -4.16666666666667e+00 1674 1854 -1.25000000000000e+01 1674 1670 -4.16666666666667e+00 1674 1319 4.16666666666667e+00 1674 1675 -1.66666666666667e+01 1674 1669 8.33333333333333e+00 1674 1516 8.33333333333333e+00 1674 1649 -8.33333333333333e+00 1674 1668 -1.25000000000000e+01 1674 1515 -3.75000000000000e+01 1675 1675 1.25000000000000e+02 1675 1647 4.16666666666667e+00 1675 1818 8.33333333333333e+00 1675 1523 4.16666666666667e+00 1675 1521 -8.33333333333333e+00 1675 1820 8.33333333333333e+00 1675 1819 -3.75000000000000e+01 1675 1664 8.33333333333333e+00 1675 1663 -1.25000000000000e+01 1675 1662 -4.16666666666667e+00 1675 1643 -4.16666666666667e+00 1675 1658 -4.16666666666667e+00 1675 1655 4.16666666666667e+00 1675 1656 8.33333333333333e+00 1675 1653 -8.33333333333333e+00 1675 1657 -1.25000000000000e+01 1675 1377 4.16666666666667e+00 1675 1641 -4.16666666666667e+00 1675 1317 4.16666666666667e+00 1675 1517 -4.16666666666667e+00 1675 1676 -1.66666666666667e+01 1675 1854 -4.16666666666667e+00 1675 1535 -4.16666666666667e+00 1675 1529 4.16666666666667e+00 1675 1533 -4.16666666666667e+00 1675 1527 4.16666666666667e+00 1675 1379 -8.33333333333333e+00 1675 1856 8.33333333333333e+00 1675 1855 -1.25000000000000e+01 1675 1670 8.33333333333333e+00 1675 1319 -8.33333333333333e+00 1675 1649 4.16666666666667e+00 1675 1669 -3.75000000000000e+01 1675 1516 -1.25000000000000e+01 1675 1674 -1.66666666666667e+01 1675 1668 8.33333333333333e+00 1675 1515 8.33333333333333e+00 1676 1676 1.25000000000000e+02 1676 1647 -8.33333333333333e+00 1676 1521 4.16666666666667e+00 1676 1818 -4.16666666666667e+00 1676 1522 4.16666666666667e+00 1676 1820 -1.25000000000000e+01 1676 1819 8.33333333333333e+00 1676 1664 -3.75000000000000e+01 1676 1663 8.33333333333333e+00 1676 1662 8.33333333333333e+00 1676 1642 -4.16666666666667e+00 1676 1641 -4.16666666666667e+00 1676 1657 -4.16666666666667e+00 1676 1654 4.16666666666667e+00 1676 1653 4.16666666666667e+00 1676 1658 -1.25000000000000e+01 1676 1656 8.33333333333333e+00 1676 1674 -1.66666666666667e+01 1676 1516 -4.16666666666667e+00 1676 1675 -1.66666666666667e+01 1676 1534 -4.16666666666667e+00 1676 1528 4.16666666666667e+00 1676 1854 8.33333333333333e+00 1676 1515 8.33333333333333e+00 1676 1527 -8.33333333333333e+00 1676 1856 -3.75000000000000e+01 1676 1378 -8.33333333333333e+00 1676 1855 8.33333333333333e+00 1676 1377 4.16666666666667e+00 1676 1533 -4.16666666666667e+00 1676 1648 4.16666666666667e+00 1676 1670 -1.25000000000000e+01 1676 1517 -1.25000000000000e+01 1676 1669 8.33333333333333e+00 1676 1318 -8.33333333333333e+00 1676 1668 -4.16666666666667e+00 1676 1317 4.16666666666667e+00 1677 1677 6.25000000000000e+01 1677 1721 -4.16666666666667e+00 1677 1693 4.16666666666667e+00 1677 1720 -4.16666666666667e+00 1677 1717 -4.16666666666667e+00 1677 1688 4.16666666666667e+00 1677 1694 -8.33333333333333e+00 1677 1687 4.16666666666667e+00 1677 1686 -1.87500000000000e+01 1677 1415 4.16666666666667e+00 1677 1679 -8.33333333333333e+00 1677 1685 8.33333333333333e+00 1677 1714 4.16666666666667e+00 1677 1684 -4.16666666666667e+00 1677 1322 -2.08333333333333e+00 1677 1409 2.08333333333333e+00 1677 1321 4.16666666666667e+00 1677 1408 -4.16666666666667e+00 1677 1320 -6.25000000000000e+00 1677 1683 -1.25000000000000e+01 1677 1328 -2.08333333333333e+00 1677 1715 4.16666666666667e+00 1677 1678 -8.33333333333333e+00 1677 1327 4.16666666666667e+00 1677 1414 4.16666666666667e+00 1677 1718 2.08333333333333e+00 1677 1326 -6.25000000000000e+00 1677 1413 -1.87500000000000e+01 1678 1678 6.25000000000000e+01 1678 1719 -4.16666666666667e+00 1678 1718 2.08333333333333e+00 1678 1721 -4.16666666666667e+00 1678 1716 -4.16666666666667e+00 1678 1688 -2.08333333333333e+00 1678 1694 4.16666666666667e+00 1678 1687 -6.25000000000000e+00 1678 1686 4.16666666666667e+00 1678 1415 -2.08333333333333e+00 1678 1409 2.08333333333333e+00 1678 1713 4.16666666666667e+00 1678 1683 -4.16666666666667e+00 1678 1322 4.16666666666667e+00 1678 1679 -8.33333333333333e+00 1678 1685 8.33333333333333e+00 1678 1321 -1.87500000000000e+01 1678 1684 -1.25000000000000e+01 1678 1320 4.16666666666667e+00 1678 1407 -4.16666666666667e+00 1678 1328 4.16666666666667e+00 1678 1715 -8.33333333333333e+00 1678 1692 4.16666666666667e+00 1678 1327 -1.87500000000000e+01 1678 1414 -6.25000000000000e+00 1678 1677 -8.33333333333333e+00 1678 1326 4.16666666666667e+00 1678 1413 4.16666666666667e+00 1679 1679 6.25000000000000e+01 1679 1719 -4.16666666666667e+00 1679 1717 2.08333333333333e+00 1679 1720 -4.16666666666667e+00 1679 1688 -6.25000000000000e+00 1679 1687 -2.08333333333333e+00 1679 1693 4.16666666666667e+00 1679 1686 4.16666666666667e+00 1679 1692 -8.33333333333333e+00 1679 1414 -2.08333333333333e+00 1679 1408 2.08333333333333e+00 1679 1413 4.16666666666667e+00 1679 1677 -8.33333333333333e+00 1679 1683 8.33333333333333e+00 1679 1322 -6.25000000000000e+00 1679 1685 -3.75000000000000e+01 1679 1321 4.16666666666667e+00 1679 1678 -8.33333333333333e+00 1679 1684 8.33333333333333e+00 1679 1320 -2.08333333333333e+00 1679 1407 2.08333333333333e+00 1679 1716 2.08333333333333e+00 1679 1328 -6.25000000000000e+00 1679 1415 -6.25000000000000e+00 1679 1327 4.16666666666667e+00 1679 1714 -8.33333333333333e+00 1679 1326 -2.08333333333333e+00 1679 1713 4.16666666666667e+00 1680 1680 6.25000000000000e+01 1680 1691 4.16666666666667e+00 1680 1690 4.16666666666667e+00 1680 1689 -1.87500000000000e+01 1680 1754 -4.16666666666667e+00 1680 1756 -4.16666666666667e+00 1680 1694 4.16666666666667e+00 1680 1693 -8.33333333333333e+00 1680 1757 -4.16666666666667e+00 1680 1751 4.16666666666667e+00 1680 1685 -4.16666666666667e+00 1680 1681 -8.33333333333333e+00 1680 1684 8.33333333333333e+00 1680 1420 4.16666666666667e+00 1680 1322 4.16666666666667e+00 1680 1409 -4.16666666666667e+00 1680 1321 -2.08333333333333e+00 1680 1408 2.08333333333333e+00 1680 1320 -6.25000000000000e+00 1680 1683 -1.25000000000000e+01 1680 1682 -8.33333333333333e+00 1680 1334 4.16666666666667e+00 1680 1421 4.16666666666667e+00 1680 1333 -2.08333333333333e+00 1680 1750 4.16666666666667e+00 1680 1753 2.08333333333333e+00 1680 1332 -6.25000000000000e+00 1680 1419 -1.87500000000000e+01 1681 1681 6.25000000000000e+01 1681 1691 -2.08333333333333e+00 1681 1690 -6.25000000000000e+00 1681 1689 4.16666666666667e+00 1681 1754 2.08333333333333e+00 1681 1694 4.16666666666667e+00 1681 1757 -4.16666666666667e+00 1681 1755 -4.16666666666667e+00 1681 1692 -8.33333333333333e+00 1681 1409 2.08333333333333e+00 1681 1421 -2.08333333333333e+00 1681 1680 -8.33333333333333e+00 1681 1683 8.33333333333333e+00 1681 1419 4.16666666666667e+00 1681 1322 4.16666666666667e+00 1681 1682 -8.33333333333333e+00 1681 1685 8.33333333333333e+00 1681 1321 -6.25000000000000e+00 1681 1684 -3.75000000000000e+01 1681 1320 -2.08333333333333e+00 1681 1407 2.08333333333333e+00 1681 1334 4.16666666666667e+00 1681 1751 -8.33333333333333e+00 1681 1752 2.08333333333333e+00 1681 1333 -6.25000000000000e+00 1681 1420 -6.25000000000000e+00 1681 1332 -2.08333333333333e+00 1681 1749 4.16666666666667e+00 1682 1682 6.25000000000000e+01 1682 1690 -2.08333333333333e+00 1682 1689 4.16666666666667e+00 1682 1753 2.08333333333333e+00 1682 1752 -4.16666666666667e+00 1682 1693 4.16666666666667e+00 1682 1756 -4.16666666666667e+00 1682 1692 4.16666666666667e+00 1682 1755 -4.16666666666667e+00 1682 1749 4.16666666666667e+00 1682 1683 -4.16666666666667e+00 1682 1408 2.08333333333333e+00 1682 1420 -2.08333333333333e+00 1682 1322 -1.87500000000000e+01 1682 1685 -1.25000000000000e+01 1682 1321 4.16666666666667e+00 1682 1681 -8.33333333333333e+00 1682 1684 8.33333333333333e+00 1682 1320 4.16666666666667e+00 1682 1407 -4.16666666666667e+00 1682 1691 -6.25000000000000e+00 1682 1334 -1.87500000000000e+01 1682 1421 -6.25000000000000e+00 1682 1333 4.16666666666667e+00 1682 1750 -8.33333333333333e+00 1682 1680 -8.33333333333333e+00 1682 1332 4.16666666666667e+00 1682 1419 4.16666666666667e+00 1683 1683 1.25000000000000e+02 1683 1720 -8.33333333333333e+00 1683 1679 8.33333333333333e+00 1683 1414 4.16666666666667e+00 1683 1678 -4.16666666666667e+00 1683 1415 -8.33333333333333e+00 1683 1677 -1.25000000000000e+01 1683 1715 -4.16666666666667e+00 1683 1714 8.33333333333333e+00 1683 1713 -1.25000000000000e+01 1683 1786 -4.16666666666667e+00 1683 1694 8.33333333333333e+00 1683 1757 -8.33333333333333e+00 1683 1756 4.16666666666667e+00 1683 1322 4.16666666666667e+00 1683 1693 8.33333333333333e+00 1683 1684 -1.66666666666667e+01 1683 1692 -3.75000000000000e+01 1683 1787 -4.16666666666667e+00 1683 1340 4.16666666666667e+00 1683 1682 -4.16666666666667e+00 1683 1681 8.33333333333333e+00 1683 1409 -4.16666666666667e+00 1683 1421 4.16666666666667e+00 1683 1426 8.33333333333333e+00 1683 1420 -8.33333333333333e+00 1683 1321 4.16666666666667e+00 1683 1408 -4.16666666666667e+00 1683 1680 -1.25000000000000e+01 1683 1685 -1.66666666666667e+01 1683 1751 8.33333333333333e+00 1683 1427 8.33333333333333e+00 1683 1750 -4.16666666666667e+00 1683 1339 4.16666666666667e+00 1683 1721 4.16666666666667e+00 1683 1749 -1.25000000000000e+01 1683 1425 -3.75000000000000e+01 1684 1684 1.25000000000000e+02 1684 1719 -8.33333333333333e+00 1684 1413 4.16666666666667e+00 1684 1677 -4.16666666666667e+00 1684 1415 4.16666666666667e+00 1684 1679 8.33333333333333e+00 1684 1678 -1.25000000000000e+01 1684 1715 8.33333333333333e+00 1684 1714 -3.75000000000000e+01 1684 1713 8.33333333333333e+00 1684 1787 -4.16666666666667e+00 1684 1785 -4.16666666666667e+00 1684 1694 -4.16666666666667e+00 1684 1757 4.16666666666667e+00 1684 1755 4.16666666666667e+00 1684 1693 -1.25000000000000e+01 1684 1692 8.33333333333333e+00 1684 1683 -1.66666666666667e+01 1684 1427 -4.16666666666667e+00 1684 1685 -1.66666666666667e+01 1684 1409 -4.16666666666667e+00 1684 1421 4.16666666666667e+00 1684 1680 8.33333333333333e+00 1684 1425 8.33333333333333e+00 1684 1419 -8.33333333333333e+00 1684 1322 -8.33333333333333e+00 1684 1682 8.33333333333333e+00 1684 1681 -3.75000000000000e+01 1684 1320 4.16666666666667e+00 1684 1407 -4.16666666666667e+00 1684 1751 8.33333333333333e+00 1684 1340 -8.33333333333333e+00 1684 1721 4.16666666666667e+00 1684 1750 -1.25000000000000e+01 1684 1426 -1.25000000000000e+01 1684 1749 -4.16666666666667e+00 1684 1338 4.16666666666667e+00 1685 1685 1.25000000000000e+02 1685 1719 4.16666666666667e+00 1685 1677 8.33333333333333e+00 1685 1414 4.16666666666667e+00 1685 1413 -8.33333333333333e+00 1685 1679 -3.75000000000000e+01 1685 1678 8.33333333333333e+00 1685 1715 -1.25000000000000e+01 1685 1714 8.33333333333333e+00 1685 1713 -4.16666666666667e+00 1685 1786 -4.16666666666667e+00 1685 1693 -4.16666666666667e+00 1685 1756 4.16666666666667e+00 1685 1692 8.33333333333333e+00 1685 1755 -8.33333333333333e+00 1685 1694 -1.25000000000000e+01 1685 1320 4.16666666666667e+00 1685 1785 -4.16666666666667e+00 1685 1338 4.16666666666667e+00 1685 1426 -4.16666666666667e+00 1685 1684 -1.66666666666667e+01 1685 1680 -4.16666666666667e+00 1685 1408 -4.16666666666667e+00 1685 1420 4.16666666666667e+00 1685 1407 -4.16666666666667e+00 1685 1419 4.16666666666667e+00 1685 1682 -1.25000000000000e+01 1685 1321 -8.33333333333333e+00 1685 1681 8.33333333333333e+00 1685 1720 4.16666666666667e+00 1685 1751 -3.75000000000000e+01 1685 1427 -1.25000000000000e+01 1685 1750 8.33333333333333e+00 1685 1339 -8.33333333333333e+00 1685 1683 -1.66666666666667e+01 1685 1749 8.33333333333333e+00 1685 1425 8.33333333333333e+00 1686 1686 6.25000000000000e+01 1686 1720 4.16666666666667e+00 1686 1721 4.16666666666667e+00 1686 1679 4.16666666666667e+00 1686 1688 -8.33333333333333e+00 1686 1678 4.16666666666667e+00 1686 1677 -1.87500000000000e+01 1686 1717 4.16666666666667e+00 1686 1716 -6.25000000000000e+00 1686 1693 -4.16666666666667e+00 1686 1687 -8.33333333333333e+00 1686 1694 8.33333333333333e+00 1686 1430 -2.08333333333333e+00 1686 1322 2.08333333333333e+00 1686 1429 4.16666666666667e+00 1686 1321 -4.16666666666667e+00 1686 1428 -6.25000000000000e+00 1686 1718 -2.08333333333333e+00 1686 1692 -1.25000000000000e+01 1686 140 4.16666666666667e+00 1686 355 -4.16666666666667e+00 1686 151 4.16666666666667e+00 1686 152 -8.33333333333333e+00 1686 41 2.08333333333333e+00 1686 356 -4.16666666666667e+00 1686 139 4.16666666666667e+00 1686 40 -4.16666666666667e+00 1686 138 -1.87500000000000e+01 1687 1687 6.25000000000000e+01 1687 1719 4.16666666666667e+00 1687 1721 -8.33333333333333e+00 1687 1679 -2.08333333333333e+00 1687 1322 2.08333333333333e+00 1687 1678 -6.25000000000000e+00 1687 1677 4.16666666666667e+00 1687 1717 -1.87500000000000e+01 1687 1716 4.16666666666667e+00 1687 1692 -4.16666666666667e+00 1687 1686 -8.33333333333333e+00 1687 1430 4.16666666666667e+00 1687 1688 -8.33333333333333e+00 1687 1694 8.33333333333333e+00 1687 1429 -1.87500000000000e+01 1687 1718 4.16666666666667e+00 1687 1693 -1.25000000000000e+01 1687 1428 4.16666666666667e+00 1687 1320 -4.16666666666667e+00 1687 41 2.08333333333333e+00 1687 140 -2.08333333333333e+00 1687 354 -4.16666666666667e+00 1687 150 4.16666666666667e+00 1687 356 -4.16666666666667e+00 1687 152 4.16666666666667e+00 1687 139 -6.25000000000000e+00 1687 138 4.16666666666667e+00 1687 39 -4.16666666666667e+00 1688 1688 6.25000000000000e+01 1688 1716 -2.08333333333333e+00 1688 1720 -8.33333333333333e+00 1688 1719 4.16666666666667e+00 1688 1679 -6.25000000000000e+00 1688 1678 -2.08333333333333e+00 1688 1321 2.08333333333333e+00 1688 1677 4.16666666666667e+00 1688 1686 -8.33333333333333e+00 1688 1718 -6.25000000000000e+00 1688 1692 8.33333333333333e+00 1688 1430 -6.25000000000000e+00 1688 1717 4.16666666666667e+00 1688 1694 -3.75000000000000e+01 1688 1429 4.16666666666667e+00 1688 1687 -8.33333333333333e+00 1688 1693 8.33333333333333e+00 1688 1428 -2.08333333333333e+00 1688 1320 2.08333333333333e+00 1688 40 2.08333333333333e+00 1688 139 -2.08333333333333e+00 1688 138 4.16666666666667e+00 1688 355 -4.16666666666667e+00 1688 151 4.16666666666667e+00 1688 150 -8.33333333333333e+00 1688 140 -6.25000000000000e+00 1688 39 2.08333333333333e+00 1688 354 -4.16666666666667e+00 1689 1689 6.25000000000000e+01 1689 1753 -2.08333333333333e+00 1689 1756 4.16666666666667e+00 1689 1754 4.16666666666667e+00 1689 1752 -6.25000000000000e+00 1689 1682 4.16666666666667e+00 1689 1690 -8.33333333333333e+00 1689 1681 4.16666666666667e+00 1689 1680 -1.87500000000000e+01 1689 1691 -8.33333333333333e+00 1689 1694 -4.16666666666667e+00 1689 1693 8.33333333333333e+00 1689 1430 4.16666666666667e+00 1689 1322 -4.16666666666667e+00 1689 1429 -2.08333333333333e+00 1689 1321 2.08333333333333e+00 1689 1428 -6.25000000000000e+00 1689 1757 4.16666666666667e+00 1689 1692 -1.25000000000000e+01 1689 392 -4.16666666666667e+00 1689 145 4.16666666666667e+00 1689 152 4.16666666666667e+00 1689 151 -8.33333333333333e+00 1689 146 4.16666666666667e+00 1689 47 -4.16666666666667e+00 1689 46 2.08333333333333e+00 1689 391 -4.16666666666667e+00 1689 144 -1.87500000000000e+01 1690 1690 6.25000000000000e+01 1690 1757 -8.33333333333333e+00 1690 1752 -2.08333333333333e+00 1690 1755 4.16666666666667e+00 1690 1753 -6.25000000000000e+00 1690 1322 2.08333333333333e+00 1690 1682 -2.08333333333333e+00 1690 1681 -6.25000000000000e+00 1690 1689 -8.33333333333333e+00 1690 1680 4.16666666666667e+00 1690 1692 8.33333333333333e+00 1690 1430 4.16666666666667e+00 1690 1691 -8.33333333333333e+00 1690 1694 8.33333333333333e+00 1690 1429 -6.25000000000000e+00 1690 1754 4.16666666666667e+00 1690 1693 -3.75000000000000e+01 1690 1428 -2.08333333333333e+00 1690 1320 2.08333333333333e+00 1690 47 2.08333333333333e+00 1690 392 -4.16666666666667e+00 1690 146 -2.08333333333333e+00 1690 152 4.16666666666667e+00 1690 144 4.16666666666667e+00 1690 150 -8.33333333333333e+00 1690 145 -6.25000000000000e+00 1690 45 2.08333333333333e+00 1690 390 -4.16666666666667e+00 1691 1691 6.25000000000000e+01 1691 1753 4.16666666666667e+00 1691 1756 -8.33333333333333e+00 1691 1754 -1.87500000000000e+01 1691 1752 4.16666666666667e+00 1691 1682 -6.25000000000000e+00 1691 1321 2.08333333333333e+00 1691 1681 -2.08333333333333e+00 1691 1680 4.16666666666667e+00 1691 1689 -8.33333333333333e+00 1691 1692 -4.16666666666667e+00 1691 1430 -1.87500000000000e+01 1691 1755 4.16666666666667e+00 1691 1694 -1.25000000000000e+01 1691 1429 4.16666666666667e+00 1691 1690 -8.33333333333333e+00 1691 1693 8.33333333333333e+00 1691 1428 4.16666666666667e+00 1691 1320 -4.16666666666667e+00 1691 46 2.08333333333333e+00 1691 391 -4.16666666666667e+00 1691 390 -4.16666666666667e+00 1691 145 -2.08333333333333e+00 1691 151 4.16666666666667e+00 1691 150 4.16666666666667e+00 1691 146 -6.25000000000000e+00 1691 144 4.16666666666667e+00 1691 45 -4.16666666666667e+00 1692 1692 1.25000000000000e+02 1692 1721 -4.16666666666667e+00 1692 1679 -8.33333333333333e+00 1692 1720 8.33333333333333e+00 1692 1719 -1.25000000000000e+01 1692 1687 -4.16666666666667e+00 1692 1688 8.33333333333333e+00 1692 1686 -1.25000000000000e+01 1692 1786 4.16666666666667e+00 1692 1756 -4.16666666666667e+00 1692 1694 -1.66666666666667e+01 1692 1685 8.33333333333333e+00 1692 1757 8.33333333333333e+00 1692 1322 -4.16666666666667e+00 1692 1682 4.16666666666667e+00 1692 1684 8.33333333333333e+00 1692 1681 -8.33333333333333e+00 1692 1683 -3.75000000000000e+01 1692 1787 4.16666666666667e+00 1692 1755 -1.25000000000000e+01 1692 1430 4.16666666666667e+00 1692 1691 -4.16666666666667e+00 1692 1693 -1.66666666666667e+01 1692 1690 8.33333333333333e+00 1692 1429 4.16666666666667e+00 1692 1321 -4.16666666666667e+00 1692 1689 -1.25000000000000e+01 1692 1678 4.16666666666667e+00 1692 356 4.16666666666667e+00 1692 355 -8.33333333333333e+00 1692 53 -4.16666666666667e+00 1692 151 8.33333333333333e+00 1692 152 8.33333333333333e+00 1692 392 -8.33333333333333e+00 1692 391 4.16666666666667e+00 1692 52 -4.16666666666667e+00 1692 150 -3.75000000000000e+01 1693 1693 1.25000000000000e+02 1693 1721 8.33333333333333e+00 1693 1679 4.16666666666667e+00 1693 1720 -3.75000000000000e+01 1693 1719 8.33333333333333e+00 1693 1686 -4.16666666666667e+00 1693 1688 8.33333333333333e+00 1693 1687 -1.25000000000000e+01 1693 1694 -1.66666666666667e+01 1693 1322 -4.16666666666667e+00 1693 1785 4.16666666666667e+00 1693 1755 -4.16666666666667e+00 1693 1685 -4.16666666666667e+00 1693 1682 4.16666666666667e+00 1693 1684 -1.25000000000000e+01 1693 1683 8.33333333333333e+00 1693 1680 -8.33333333333333e+00 1693 1787 -8.33333333333333e+00 1693 1757 8.33333333333333e+00 1693 1756 -1.25000000000000e+01 1693 1692 -1.66666666666667e+01 1693 1689 8.33333333333333e+00 1693 1430 -8.33333333333333e+00 1693 1691 8.33333333333333e+00 1693 1690 -3.75000000000000e+01 1693 1677 4.16666666666667e+00 1693 1428 4.16666666666667e+00 1693 1320 -4.16666666666667e+00 1693 356 4.16666666666667e+00 1693 354 -8.33333333333333e+00 1693 53 -4.16666666666667e+00 1693 152 -4.16666666666667e+00 1693 392 4.16666666666667e+00 1693 150 8.33333333333333e+00 1693 151 -1.25000000000000e+01 1693 390 4.16666666666667e+00 1693 51 -4.16666666666667e+00 1694 1694 1.25000000000000e+02 1694 1719 -4.16666666666667e+00 1694 1678 4.16666666666667e+00 1694 1677 -8.33333333333333e+00 1694 1721 -1.25000000000000e+01 1694 1686 8.33333333333333e+00 1694 1688 -3.75000000000000e+01 1694 1687 8.33333333333333e+00 1694 1693 -1.66666666666667e+01 1694 1321 -4.16666666666667e+00 1694 1684 -4.16666666666667e+00 1694 1681 4.16666666666667e+00 1694 1692 -1.66666666666667e+01 1694 1683 8.33333333333333e+00 1694 1755 8.33333333333333e+00 1694 1685 -1.25000000000000e+01 1694 1320 -4.16666666666667e+00 1694 1680 4.16666666666667e+00 1694 1757 -3.75000000000000e+01 1694 1786 -8.33333333333333e+00 1694 1756 8.33333333333333e+00 1694 1785 4.16666666666667e+00 1694 1428 4.16666666666667e+00 1694 1689 -4.16666666666667e+00 1694 1691 -1.25000000000000e+01 1694 1720 8.33333333333333e+00 1694 1429 -8.33333333333333e+00 1694 1690 8.33333333333333e+00 1694 355 4.16666666666667e+00 1694 354 4.16666666666667e+00 1694 52 -4.16666666666667e+00 1694 51 -4.16666666666667e+00 1694 151 -4.16666666666667e+00 1694 391 4.16666666666667e+00 1694 152 -1.25000000000000e+01 1694 150 8.33333333333333e+00 1694 390 -8.33333333333333e+00 1695 1695 6.25000000000000e+01 1695 1726 -4.16666666666667e+00 1695 1706 -2.08333333333333e+00 1695 1712 4.16666666666667e+00 1695 1705 4.16666666666667e+00 1695 1704 -6.25000000000000e+00 1695 1724 2.08333333333333e+00 1695 1727 -4.16666666666667e+00 1695 1723 -4.16666666666667e+00 1695 1412 2.08333333333333e+00 1695 1415 -2.08333333333333e+00 1695 1714 4.16666666666667e+00 1695 1702 -4.16666666666667e+00 1695 1328 4.16666666666667e+00 1695 1715 -8.33333333333333e+00 1695 1327 4.16666666666667e+00 1695 1696 -8.33333333333333e+00 1695 1414 4.16666666666667e+00 1695 1326 -1.87500000000000e+01 1695 1413 -6.25000000000000e+00 1695 1697 -8.33333333333333e+00 1695 1325 4.16666666666667e+00 1695 1703 8.33333333333333e+00 1695 1324 4.16666666666667e+00 1695 1411 -4.16666666666667e+00 1695 1711 4.16666666666667e+00 1695 1323 -1.87500000000000e+01 1695 1701 -1.25000000000000e+01 1696 1696 6.25000000000000e+01 1696 1727 -4.16666666666667e+00 1696 1710 4.16666666666667e+00 1696 1725 -4.16666666666667e+00 1696 1706 4.16666666666667e+00 1696 1712 -8.33333333333333e+00 1696 1705 -1.87500000000000e+01 1696 1704 4.16666666666667e+00 1696 1722 -4.16666666666667e+00 1696 1697 -8.33333333333333e+00 1696 1415 4.16666666666667e+00 1696 1703 8.33333333333333e+00 1696 1713 4.16666666666667e+00 1696 1701 -4.16666666666667e+00 1696 1328 -2.08333333333333e+00 1696 1715 4.16666666666667e+00 1696 1327 -6.25000000000000e+00 1696 1414 -1.87500000000000e+01 1696 1326 4.16666666666667e+00 1696 1695 -8.33333333333333e+00 1696 1413 4.16666666666667e+00 1696 1325 -2.08333333333333e+00 1696 1412 2.08333333333333e+00 1696 1724 2.08333333333333e+00 1696 1324 -6.25000000000000e+00 1696 1702 -1.25000000000000e+01 1696 1323 4.16666666666667e+00 1696 1410 -4.16666666666667e+00 1697 1697 6.25000000000000e+01 1697 1726 -4.16666666666667e+00 1697 1706 -6.25000000000000e+00 1697 1705 4.16666666666667e+00 1697 1711 -8.33333333333333e+00 1697 1704 -2.08333333333333e+00 1697 1710 4.16666666666667e+00 1697 1722 2.08333333333333e+00 1697 1725 -4.16666666666667e+00 1697 1410 2.08333333333333e+00 1697 1413 -2.08333333333333e+00 1697 1696 -8.33333333333333e+00 1697 1414 4.16666666666667e+00 1697 1702 8.33333333333333e+00 1697 1328 -6.25000000000000e+00 1697 1415 -6.25000000000000e+00 1697 1327 -2.08333333333333e+00 1697 1714 4.16666666666667e+00 1697 1326 4.16666666666667e+00 1697 1713 -8.33333333333333e+00 1697 1723 2.08333333333333e+00 1697 1325 -6.25000000000000e+00 1697 1703 -3.75000000000000e+01 1697 1324 -2.08333333333333e+00 1697 1411 2.08333333333333e+00 1697 1695 -8.33333333333333e+00 1697 1323 4.16666666666667e+00 1697 1701 8.33333333333333e+00 1698 1698 1.25000000000000e+02 1698 1775 -4.16666666666667e+00 1698 1774 -4.16666666666667e+00 1698 1711 -8.33333333333333e+00 1698 1702 8.33333333333333e+00 1698 1769 -8.33333333333333e+00 1698 1768 4.16666666666667e+00 1698 1703 8.33333333333333e+00 1698 1701 -3.75000000000000e+01 1698 1709 -4.16666666666667e+00 1698 1772 4.16666666666667e+00 1698 1708 8.33333333333333e+00 1698 1699 -1.66666666666667e+01 1698 1594 8.33333333333333e+00 1698 1592 -8.33333333333333e+00 1698 1325 8.33333333333333e+00 1698 1591 4.16666666666667e+00 1698 1324 -4.16666666666667e+00 1698 1707 -1.25000000000000e+01 1698 1595 8.33333333333333e+00 1698 1700 -1.66666666666667e+01 1698 1337 8.33333333333333e+00 1698 1771 4.16666666666667e+00 1698 1336 -4.16666666666667e+00 1698 1593 -3.75000000000000e+01 1698 1561 -4.16666666666667e+00 1698 1411 4.16666666666667e+00 1698 1412 4.16666666666667e+00 1698 1562 -4.16666666666667e+00 1698 1323 -1.25000000000000e+01 1698 1424 -4.16666666666667e+00 1698 1568 4.16666666666667e+00 1698 1423 8.33333333333333e+00 1698 1567 -8.33333333333333e+00 1698 1422 -1.25000000000000e+01 1698 1712 4.16666666666667e+00 1698 1335 -1.25000000000000e+01 1699 1699 1.25000000000000e+02 1699 1712 4.16666666666667e+00 1699 1710 -8.33333333333333e+00 1699 1775 -4.16666666666667e+00 1699 1703 -4.16666666666667e+00 1699 1769 4.16666666666667e+00 1699 1701 8.33333333333333e+00 1699 1767 4.16666666666667e+00 1699 1702 -1.25000000000000e+01 1699 1592 4.16666666666667e+00 1699 1595 -4.16666666666667e+00 1699 1707 8.33333333333333e+00 1699 1698 -1.66666666666667e+01 1699 1593 8.33333333333333e+00 1699 1709 8.33333333333333e+00 1699 1708 -3.75000000000000e+01 1699 1590 4.16666666666667e+00 1699 1323 -4.16666666666667e+00 1699 1772 -8.33333333333333e+00 1699 1594 -1.25000000000000e+01 1699 1770 4.16666666666667e+00 1699 1335 -4.16666666666667e+00 1699 1560 -4.16666666666667e+00 1699 1410 4.16666666666667e+00 1699 1562 -4.16666666666667e+00 1699 1568 4.16666666666667e+00 1699 1412 -8.33333333333333e+00 1699 1325 8.33333333333333e+00 1699 1324 -1.25000000000000e+01 1699 1424 8.33333333333333e+00 1699 1700 -1.66666666666667e+01 1699 1337 8.33333333333333e+00 1699 1423 -3.75000000000000e+01 1699 1773 -4.16666666666667e+00 1699 1336 -1.25000000000000e+01 1699 1422 8.33333333333333e+00 1699 1566 -8.33333333333333e+00 1700 1700 1.25000000000000e+02 1700 1773 -4.16666666666667e+00 1700 1711 4.16666666666667e+00 1700 1774 -4.16666666666667e+00 1700 1702 -4.16666666666667e+00 1700 1768 4.16666666666667e+00 1700 1767 -8.33333333333333e+00 1700 1703 -1.25000000000000e+01 1700 1701 8.33333333333333e+00 1700 1591 4.16666666666667e+00 1700 1594 -4.16666666666667e+00 1700 1707 -4.16666666666667e+00 1700 1770 4.16666666666667e+00 1700 1709 -1.25000000000000e+01 1700 1708 8.33333333333333e+00 1700 1590 -8.33333333333333e+00 1700 1323 8.33333333333333e+00 1700 1595 -1.25000000000000e+01 1700 1771 -8.33333333333333e+00 1700 1593 8.33333333333333e+00 1700 1698 -1.66666666666667e+01 1700 1335 8.33333333333333e+00 1700 1561 -4.16666666666667e+00 1700 1567 4.16666666666667e+00 1700 1325 -3.75000000000000e+01 1700 1411 -8.33333333333333e+00 1700 1324 8.33333333333333e+00 1700 1410 4.16666666666667e+00 1700 1560 -4.16666666666667e+00 1700 1424 -1.25000000000000e+01 1700 1710 4.16666666666667e+00 1700 1337 -3.75000000000000e+01 1700 1423 8.33333333333333e+00 1700 1699 -1.66666666666667e+01 1700 1336 8.33333333333333e+00 1700 1422 -4.16666666666667e+00 1700 1566 4.16666666666667e+00 1701 1701 1.25000000000000e+02 1701 1726 -8.33333333333333e+00 1701 1696 -4.16666666666667e+00 1701 1414 4.16666666666667e+00 1701 1415 4.16666666666667e+00 1701 1697 8.33333333333333e+00 1701 1695 -1.25000000000000e+01 1701 1715 8.33333333333333e+00 1701 1714 8.33333333333333e+00 1701 1713 -3.75000000000000e+01 1701 1790 -4.16666666666667e+00 1701 1789 -4.16666666666667e+00 1701 1712 -4.16666666666667e+00 1701 1775 4.16666666666667e+00 1701 1774 4.16666666666667e+00 1701 1711 8.33333333333333e+00 1701 1702 -1.66666666666667e+01 1701 1710 -1.25000000000000e+01 1701 1427 -4.16666666666667e+00 1701 1703 -1.66666666666667e+01 1701 1412 -4.16666666666667e+00 1701 1424 4.16666666666667e+00 1701 1699 8.33333333333333e+00 1701 1426 8.33333333333333e+00 1701 1423 -8.33333333333333e+00 1701 1700 8.33333333333333e+00 1701 1325 -8.33333333333333e+00 1701 1324 4.16666666666667e+00 1701 1411 -4.16666666666667e+00 1701 1698 -3.75000000000000e+01 1701 1769 8.33333333333333e+00 1701 1340 -8.33333333333333e+00 1701 1768 -4.16666666666667e+00 1701 1339 4.16666666666667e+00 1701 1767 -1.25000000000000e+01 1701 1727 4.16666666666667e+00 1701 1425 -1.25000000000000e+01 1702 1702 1.25000000000000e+02 1702 1725 -8.33333333333333e+00 1702 1697 8.33333333333333e+00 1702 1695 -4.16666666666667e+00 1702 1413 4.16666666666667e+00 1702 1415 -8.33333333333333e+00 1702 1696 -1.25000000000000e+01 1702 1715 -4.16666666666667e+00 1702 1714 -1.25000000000000e+01 1702 1713 8.33333333333333e+00 1702 1788 -4.16666666666667e+00 1702 1712 8.33333333333333e+00 1702 1775 -8.33333333333333e+00 1702 1773 4.16666666666667e+00 1702 1325 4.16666666666667e+00 1702 1711 -3.75000000000000e+01 1702 1710 8.33333333333333e+00 1702 1701 -1.66666666666667e+01 1702 1790 -4.16666666666667e+00 1702 1340 4.16666666666667e+00 1702 1700 -4.16666666666667e+00 1702 1698 8.33333333333333e+00 1702 1412 -4.16666666666667e+00 1702 1424 4.16666666666667e+00 1702 1425 8.33333333333333e+00 1702 1422 -8.33333333333333e+00 1702 1699 -1.25000000000000e+01 1702 1323 4.16666666666667e+00 1702 1410 -4.16666666666667e+00 1702 1769 8.33333333333333e+00 1702 1703 -1.66666666666667e+01 1702 1427 8.33333333333333e+00 1702 1768 -1.25000000000000e+01 1702 1727 4.16666666666667e+00 1702 1426 -3.75000000000000e+01 1702 1767 -4.16666666666667e+00 1702 1338 4.16666666666667e+00 1703 1703 1.25000000000000e+02 1703 1726 4.16666666666667e+00 1703 1696 8.33333333333333e+00 1703 1414 -8.33333333333333e+00 1703 1413 4.16666666666667e+00 1703 1697 -3.75000000000000e+01 1703 1695 8.33333333333333e+00 1703 1715 -1.25000000000000e+01 1703 1714 -4.16666666666667e+00 1703 1713 8.33333333333333e+00 1703 1788 -4.16666666666667e+00 1703 1711 8.33333333333333e+00 1703 1710 -4.16666666666667e+00 1703 1773 4.16666666666667e+00 1703 1774 -8.33333333333333e+00 1703 1712 -1.25000000000000e+01 1703 1324 4.16666666666667e+00 1703 1789 -4.16666666666667e+00 1703 1339 4.16666666666667e+00 1703 1425 -4.16666666666667e+00 1703 1699 -4.16666666666667e+00 1703 1701 -1.66666666666667e+01 1703 1410 -4.16666666666667e+00 1703 1422 4.16666666666667e+00 1703 1411 -4.16666666666667e+00 1703 1423 4.16666666666667e+00 1703 1700 -1.25000000000000e+01 1703 1698 8.33333333333333e+00 1703 1323 -8.33333333333333e+00 1703 1769 -3.75000000000000e+01 1703 1725 4.16666666666667e+00 1703 1427 -1.25000000000000e+01 1703 1768 8.33333333333333e+00 1703 1702 -1.66666666666667e+01 1703 1426 8.33333333333333e+00 1703 1767 8.33333333333333e+00 1703 1338 -8.33333333333333e+00 1704 1704 6.25000000000000e+01 1704 1726 4.16666666666667e+00 1704 1727 -8.33333333333333e+00 1704 1325 2.08333333333333e+00 1704 1697 -2.08333333333333e+00 1704 1696 4.16666666666667e+00 1704 1695 -6.25000000000000e+00 1704 1352 2.08333333333333e+00 1704 1723 4.16666666666667e+00 1704 1722 -1.87500000000000e+01 1704 1711 -4.16666666666667e+00 1704 1454 -2.08333333333333e+00 1704 1705 -8.33333333333333e+00 1704 1822 -4.16666666666667e+00 1704 1459 4.16666666666667e+00 1704 1823 -4.16666666666667e+00 1704 1460 4.16666666666667e+00 1704 1351 -4.16666666666667e+00 1704 1453 4.16666666666667e+00 1704 1452 -6.25000000000000e+00 1704 1706 -8.33333333333333e+00 1704 1448 4.16666666666667e+00 1704 1712 8.33333333333333e+00 1704 1447 4.16666666666667e+00 1704 1324 -4.16666666666667e+00 1704 1724 4.16666666666667e+00 1704 1446 -1.87500000000000e+01 1704 1710 -1.25000000000000e+01 1705 1705 6.25000000000000e+01 1705 1725 4.16666666666667e+00 1705 1727 4.16666666666667e+00 1705 1697 4.16666666666667e+00 1705 1706 -8.33333333333333e+00 1705 1696 -1.87500000000000e+01 1705 1695 4.16666666666667e+00 1705 1723 -6.25000000000000e+00 1705 1722 4.16666666666667e+00 1705 1710 -4.16666666666667e+00 1705 1704 -8.33333333333333e+00 1705 1454 4.16666666666667e+00 1705 1821 -4.16666666666667e+00 1705 1458 4.16666666666667e+00 1705 1712 8.33333333333333e+00 1705 1460 -8.33333333333333e+00 1705 1352 2.08333333333333e+00 1705 1823 -4.16666666666667e+00 1705 1453 -1.87500000000000e+01 1705 1350 -4.16666666666667e+00 1705 1452 4.16666666666667e+00 1705 1448 -2.08333333333333e+00 1705 1325 2.08333333333333e+00 1705 1724 -2.08333333333333e+00 1705 1447 -6.25000000000000e+00 1705 1711 -1.25000000000000e+01 1705 1446 4.16666666666667e+00 1705 1323 -4.16666666666667e+00 1706 1706 6.25000000000000e+01 1706 1722 4.16666666666667e+00 1706 1726 4.16666666666667e+00 1706 1725 -8.33333333333333e+00 1706 1697 -6.25000000000000e+00 1706 1696 4.16666666666667e+00 1706 1705 -8.33333333333333e+00 1706 1323 2.08333333333333e+00 1706 1695 -2.08333333333333e+00 1706 1724 -6.25000000000000e+00 1706 1350 2.08333333333333e+00 1706 1452 -2.08333333333333e+00 1706 1453 4.16666666666667e+00 1706 1711 8.33333333333333e+00 1706 1459 -8.33333333333333e+00 1706 1821 -4.16666666666667e+00 1706 1458 4.16666666666667e+00 1706 1454 -6.25000000000000e+00 1706 1351 2.08333333333333e+00 1706 1822 -4.16666666666667e+00 1706 1723 -2.08333333333333e+00 1706 1448 -6.25000000000000e+00 1706 1712 -3.75000000000000e+01 1706 1447 -2.08333333333333e+00 1706 1324 2.08333333333333e+00 1706 1704 -8.33333333333333e+00 1706 1446 4.16666666666667e+00 1706 1710 8.33333333333333e+00 1707 1707 1.25000000000000e+02 1707 1774 4.16666666666667e+00 1707 1829 -4.16666666666667e+00 1707 1460 4.16666666666667e+00 1707 1459 -8.33333333333333e+00 1707 1711 8.33333333333333e+00 1707 1828 -4.16666666666667e+00 1707 1712 8.33333333333333e+00 1707 1710 -3.75000000000000e+01 1707 1700 -4.16666666666667e+00 1707 1595 4.16666666666667e+00 1707 1699 8.33333333333333e+00 1707 1594 -8.33333333333333e+00 1707 1324 4.16666666666667e+00 1707 1698 -1.25000000000000e+01 1707 1709 -1.66666666666667e+01 1707 1772 8.33333333333333e+00 1707 1354 4.16666666666667e+00 1707 1771 -4.16666666666667e+00 1707 1770 -1.25000000000000e+01 1707 1591 -4.16666666666667e+00 1707 1448 8.33333333333333e+00 1707 1444 4.16666666666667e+00 1707 1447 -4.16666666666667e+00 1707 1445 -8.33333333333333e+00 1707 1604 8.33333333333333e+00 1707 1325 4.16666666666667e+00 1707 1592 -4.16666666666667e+00 1707 1446 -1.25000000000000e+01 1707 1457 -4.16666666666667e+00 1707 1355 4.16666666666667e+00 1707 1708 -1.66666666666667e+01 1707 1456 8.33333333333333e+00 1707 1603 8.33333333333333e+00 1707 1775 -8.33333333333333e+00 1707 1455 -1.25000000000000e+01 1707 1602 -3.75000000000000e+01 1708 1708 1.25000000000000e+02 1708 1773 4.16666666666667e+00 1708 1829 -4.16666666666667e+00 1708 1460 4.16666666666667e+00 1708 1712 -4.16666666666667e+00 1708 1458 -8.33333333333333e+00 1708 1710 8.33333333333333e+00 1708 1827 -4.16666666666667e+00 1708 1711 -1.25000000000000e+01 1708 1595 4.16666666666667e+00 1708 1698 8.33333333333333e+00 1708 1593 -8.33333333333333e+00 1708 1700 8.33333333333333e+00 1708 1699 -3.75000000000000e+01 1708 1323 4.16666666666667e+00 1708 1772 8.33333333333333e+00 1708 1771 -1.25000000000000e+01 1708 1353 4.16666666666667e+00 1708 1770 -4.16666666666667e+00 1708 1590 -4.16666666666667e+00 1708 1592 -4.16666666666667e+00 1708 1709 -1.66666666666667e+01 1708 1443 4.16666666666667e+00 1708 1446 -4.16666666666667e+00 1708 1445 4.16666666666667e+00 1708 1604 -4.16666666666667e+00 1708 1325 -8.33333333333333e+00 1708 1448 8.33333333333333e+00 1708 1447 -1.25000000000000e+01 1708 1457 8.33333333333333e+00 1708 1355 -8.33333333333333e+00 1708 1775 4.16666666666667e+00 1708 1456 -3.75000000000000e+01 1708 1603 -1.25000000000000e+01 1708 1707 -1.66666666666667e+01 1708 1455 8.33333333333333e+00 1708 1602 8.33333333333333e+00 1709 1709 1.25000000000000e+02 1709 1773 -8.33333333333333e+00 1709 1827 -4.16666666666667e+00 1709 1828 -4.16666666666667e+00 1709 1458 4.16666666666667e+00 1709 1459 4.16666666666667e+00 1709 1711 -4.16666666666667e+00 1709 1712 -1.25000000000000e+01 1709 1710 8.33333333333333e+00 1709 1594 4.16666666666667e+00 1709 1698 -4.16666666666667e+00 1709 1593 4.16666666666667e+00 1709 1700 -1.25000000000000e+01 1709 1699 8.33333333333333e+00 1709 1772 -3.75000000000000e+01 1709 1771 8.33333333333333e+00 1709 1707 -1.66666666666667e+01 1709 1770 8.33333333333333e+00 1709 1591 -4.16666666666667e+00 1709 1708 -1.66666666666667e+01 1709 1446 8.33333333333333e+00 1709 1444 4.16666666666667e+00 1709 1603 -4.16666666666667e+00 1709 1443 -8.33333333333333e+00 1709 1602 8.33333333333333e+00 1709 1448 -3.75000000000000e+01 1709 1324 -8.33333333333333e+00 1709 1447 8.33333333333333e+00 1709 1323 4.16666666666667e+00 1709 1590 -4.16666666666667e+00 1709 1774 4.16666666666667e+00 1709 1457 -1.25000000000000e+01 1709 1604 -1.25000000000000e+01 1709 1456 8.33333333333333e+00 1709 1354 -8.33333333333333e+00 1709 1455 -4.16666666666667e+00 1709 1353 4.16666666666667e+00 1710 1710 1.25000000000000e+02 1710 1727 8.33333333333333e+00 1710 1697 4.16666666666667e+00 1710 1726 8.33333333333333e+00 1710 1725 -3.75000000000000e+01 1710 1705 -4.16666666666667e+00 1710 1823 4.16666666666667e+00 1710 1706 8.33333333333333e+00 1710 1704 -1.25000000000000e+01 1710 1822 -8.33333333333333e+00 1710 1712 -1.66666666666667e+01 1710 1358 -4.16666666666667e+00 1710 1325 -4.16666666666667e+00 1710 1789 4.16666666666667e+00 1710 1774 -4.16666666666667e+00 1710 1703 -4.16666666666667e+00 1710 1700 4.16666666666667e+00 1710 1790 -8.33333333333333e+00 1710 1775 8.33333333333333e+00 1710 1773 -1.25000000000000e+01 1710 1702 8.33333333333333e+00 1710 1699 -8.33333333333333e+00 1710 1701 -1.25000000000000e+01 1710 1460 -4.16666666666667e+00 1710 1829 4.16666666666667e+00 1710 1459 8.33333333333333e+00 1710 1711 -1.66666666666667e+01 1710 1708 8.33333333333333e+00 1710 1828 4.16666666666667e+00 1710 1357 -4.16666666666667e+00 1710 1458 -1.25000000000000e+01 1710 1709 8.33333333333333e+00 1710 1448 -8.33333333333333e+00 1710 1447 4.16666666666667e+00 1710 1324 -4.16666666666667e+00 1710 1707 -3.75000000000000e+01 1710 1696 4.16666666666667e+00 1711 1711 1.25000000000000e+02 1711 1727 -4.16666666666667e+00 1711 1697 -8.33333333333333e+00 1711 1726 -1.25000000000000e+01 1711 1725 8.33333333333333e+00 1711 1704 -4.16666666666667e+00 1711 1706 8.33333333333333e+00 1711 1705 -1.25000000000000e+01 1711 1823 4.16666666666667e+00 1711 1821 -8.33333333333333e+00 1711 1788 4.16666666666667e+00 1711 1773 -4.16666666666667e+00 1711 1703 8.33333333333333e+00 1711 1712 -1.66666666666667e+01 1711 1775 8.33333333333333e+00 1711 1358 -4.16666666666667e+00 1711 1790 4.16666666666667e+00 1711 1774 -1.25000000000000e+01 1711 1325 -4.16666666666667e+00 1711 1700 4.16666666666667e+00 1711 1702 -3.75000000000000e+01 1711 1701 8.33333333333333e+00 1711 1698 -8.33333333333333e+00 1711 1448 4.16666666666667e+00 1711 1709 -4.16666666666667e+00 1711 1458 8.33333333333333e+00 1711 1710 -1.66666666666667e+01 1711 1707 8.33333333333333e+00 1711 1829 -8.33333333333333e+00 1711 1460 8.33333333333333e+00 1711 1459 -3.75000000000000e+01 1711 1827 4.16666666666667e+00 1711 1356 -4.16666666666667e+00 1711 1708 -1.25000000000000e+01 1711 1695 4.16666666666667e+00 1711 1446 4.16666666666667e+00 1711 1323 -4.16666666666667e+00 1712 1712 1.25000000000000e+02 1712 1725 8.33333333333333e+00 1712 1696 -8.33333333333333e+00 1712 1695 4.16666666666667e+00 1712 1727 -1.25000000000000e+01 1712 1705 8.33333333333333e+00 1712 1821 4.16666666666667e+00 1712 1706 -3.75000000000000e+01 1712 1704 8.33333333333333e+00 1712 1822 4.16666666666667e+00 1712 1710 -1.66666666666667e+01 1712 1356 -4.16666666666667e+00 1712 1323 -4.16666666666667e+00 1712 1702 8.33333333333333e+00 1712 1711 -1.66666666666667e+01 1712 1774 8.33333333333333e+00 1712 1701 -4.16666666666667e+00 1712 1698 4.16666666666667e+00 1712 1775 -3.75000000000000e+01 1712 1357 -4.16666666666667e+00 1712 1789 4.16666666666667e+00 1712 1788 -8.33333333333333e+00 1712 1773 8.33333333333333e+00 1712 1703 -1.25000000000000e+01 1712 1324 -4.16666666666667e+00 1712 1699 4.16666666666667e+00 1712 1458 -4.16666666666667e+00 1712 1827 4.16666666666667e+00 1712 1447 4.16666666666667e+00 1712 1708 -4.16666666666667e+00 1712 1460 -1.25000000000000e+01 1712 1828 -8.33333333333333e+00 1712 1459 8.33333333333333e+00 1712 1709 -1.25000000000000e+01 1712 1726 -4.16666666666667e+00 1712 1707 8.33333333333333e+00 1712 1446 -8.33333333333333e+00 1713 1713 1.25000000000000e+02 1713 1727 -4.16666666666667e+00 1713 1726 8.33333333333333e+00 1713 1725 -1.25000000000000e+01 1713 1790 4.16666666666667e+00 1713 1696 4.16666666666667e+00 1713 1697 -8.33333333333333e+00 1713 1703 8.33333333333333e+00 1713 1702 8.33333333333333e+00 1713 1701 -3.75000000000000e+01 1713 1714 -1.66666666666667e+01 1713 1327 -4.16666666666667e+00 1713 1339 -4.16666666666667e+00 1713 1792 -4.16666666666667e+00 1713 1786 4.16666666666667e+00 1713 1793 -4.16666666666667e+00 1713 1730 4.16666666666667e+00 1713 1328 8.33333333333333e+00 1713 1715 -1.66666666666667e+01 1713 1721 8.33333333333333e+00 1713 1729 -8.33333333333333e+00 1713 1720 8.33333333333333e+00 1713 1719 -3.75000000000000e+01 1713 1340 8.33333333333333e+00 1713 1787 -8.33333333333333e+00 1713 1414 -4.16666666666667e+00 1713 1678 4.16666666666667e+00 1713 1679 4.16666666666667e+00 1713 1415 -4.16666666666667e+00 1713 1326 -1.25000000000000e+01 1713 1685 -4.16666666666667e+00 1713 1427 4.16666666666667e+00 1713 1684 8.33333333333333e+00 1713 1426 -8.33333333333333e+00 1713 1683 -1.25000000000000e+01 1713 1789 4.16666666666667e+00 1713 1338 -1.25000000000000e+01 1714 1714 1.25000000000000e+02 1714 1727 8.33333333333333e+00 1714 1726 -3.75000000000000e+01 1714 1725 8.33333333333333e+00 1714 1790 -8.33333333333333e+00 1714 1695 4.16666666666667e+00 1714 1697 4.16666666666667e+00 1714 1703 -4.16666666666667e+00 1714 1702 -1.25000000000000e+01 1714 1701 8.33333333333333e+00 1714 1713 -1.66666666666667e+01 1714 1326 -4.16666666666667e+00 1714 1338 -4.16666666666667e+00 1714 1791 -4.16666666666667e+00 1714 1785 4.16666666666667e+00 1714 1730 4.16666666666667e+00 1714 1721 -4.16666666666667e+00 1714 1720 -1.25000000000000e+01 1714 1728 -8.33333333333333e+00 1714 1719 8.33333333333333e+00 1714 1793 -4.16666666666667e+00 1714 1787 4.16666666666667e+00 1714 1413 -4.16666666666667e+00 1714 1677 4.16666666666667e+00 1714 1415 -4.16666666666667e+00 1714 1427 4.16666666666667e+00 1714 1679 -8.33333333333333e+00 1714 1328 8.33333333333333e+00 1714 1327 -1.25000000000000e+01 1714 1685 8.33333333333333e+00 1714 1715 -1.66666666666667e+01 1714 1340 8.33333333333333e+00 1714 1684 -3.75000000000000e+01 1714 1788 4.16666666666667e+00 1714 1339 -1.25000000000000e+01 1714 1683 8.33333333333333e+00 1714 1425 -8.33333333333333e+00 1715 1715 1.25000000000000e+02 1715 1726 8.33333333333333e+00 1715 1725 -4.16666666666667e+00 1715 1789 -8.33333333333333e+00 1715 1788 4.16666666666667e+00 1715 1696 4.16666666666667e+00 1715 1695 -8.33333333333333e+00 1715 1703 -1.25000000000000e+01 1715 1702 -4.16666666666667e+00 1715 1701 8.33333333333333e+00 1715 1791 -4.16666666666667e+00 1715 1728 4.16666666666667e+00 1715 1721 -1.25000000000000e+01 1715 1729 4.16666666666667e+00 1715 1720 -4.16666666666667e+00 1715 1326 8.33333333333333e+00 1715 1713 -1.66666666666667e+01 1715 1719 8.33333333333333e+00 1715 1792 -4.16666666666667e+00 1715 1786 4.16666666666667e+00 1715 1338 8.33333333333333e+00 1715 1785 -8.33333333333333e+00 1715 1414 -4.16666666666667e+00 1715 1426 4.16666666666667e+00 1715 1328 -3.75000000000000e+01 1715 1678 -8.33333333333333e+00 1715 1327 8.33333333333333e+00 1715 1677 4.16666666666667e+00 1715 1413 -4.16666666666667e+00 1715 1685 -1.25000000000000e+01 1715 1727 -1.25000000000000e+01 1715 1340 -3.75000000000000e+01 1715 1684 8.33333333333333e+00 1715 1714 -1.66666666666667e+01 1715 1339 8.33333333333333e+00 1715 1683 -4.16666666666667e+00 1715 1425 4.16666666666667e+00 1716 1716 6.25000000000000e+01 1716 1679 2.08333333333333e+00 1716 1678 -4.16666666666667e+00 1716 1687 4.16666666666667e+00 1716 1686 -6.25000000000000e+00 1716 1328 4.16666666666667e+00 1716 1718 -8.33333333333333e+00 1716 1721 8.33333333333333e+00 1716 1720 -4.16666666666667e+00 1716 1719 -1.25000000000000e+01 1716 1729 4.16666666666667e+00 1716 1463 -2.08333333333333e+00 1716 1730 4.16666666666667e+00 1716 1717 -8.33333333333333e+00 1716 1462 4.16666666666667e+00 1716 1327 4.16666666666667e+00 1716 1688 -2.08333333333333e+00 1716 1461 -6.25000000000000e+00 1716 1326 -1.87500000000000e+01 1716 41 4.16666666666667e+00 1716 356 -8.33333333333333e+00 1716 355 4.16666666666667e+00 1716 364 -4.16666666666667e+00 1716 194 2.08333333333333e+00 1716 365 -4.16666666666667e+00 1716 40 4.16666666666667e+00 1716 193 -4.16666666666667e+00 1716 39 -1.87500000000000e+01 1717 1717 6.25000000000000e+01 1717 1718 -8.33333333333333e+00 1717 1328 -2.08333333333333e+00 1717 1679 2.08333333333333e+00 1717 1677 -4.16666666666667e+00 1717 1687 -1.87500000000000e+01 1717 1686 4.16666666666667e+00 1717 1721 8.33333333333333e+00 1717 1720 -1.25000000000000e+01 1717 1719 -4.16666666666667e+00 1717 1728 4.16666666666667e+00 1717 1463 4.16666666666667e+00 1717 1730 -8.33333333333333e+00 1717 1688 4.16666666666667e+00 1717 1462 -1.87500000000000e+01 1717 1327 -6.25000000000000e+00 1717 1716 -8.33333333333333e+00 1717 1461 4.16666666666667e+00 1717 1326 4.16666666666667e+00 1717 41 -2.08333333333333e+00 1717 356 4.16666666666667e+00 1717 354 4.16666666666667e+00 1717 363 -4.16666666666667e+00 1717 194 2.08333333333333e+00 1717 365 -4.16666666666667e+00 1717 40 -6.25000000000000e+00 1717 39 4.16666666666667e+00 1717 192 -4.16666666666667e+00 1718 1718 6.25000000000000e+01 1718 1717 -8.33333333333333e+00 1718 1686 -2.08333333333333e+00 1718 1677 2.08333333333333e+00 1718 1327 -2.08333333333333e+00 1718 1678 2.08333333333333e+00 1718 1688 -6.25000000000000e+00 1718 1721 -3.75000000000000e+01 1718 1720 8.33333333333333e+00 1718 1326 4.16666666666667e+00 1718 1716 -8.33333333333333e+00 1718 1719 8.33333333333333e+00 1718 1687 4.16666666666667e+00 1718 1463 -6.25000000000000e+00 1718 1328 -6.25000000000000e+00 1718 1462 4.16666666666667e+00 1718 1729 -8.33333333333333e+00 1718 1461 -2.08333333333333e+00 1718 1728 4.16666666666667e+00 1718 40 -2.08333333333333e+00 1718 355 4.16666666666667e+00 1718 39 4.16666666666667e+00 1718 354 -8.33333333333333e+00 1718 193 2.08333333333333e+00 1718 364 -4.16666666666667e+00 1718 41 -6.25000000000000e+00 1718 192 2.08333333333333e+00 1718 363 -4.16666666666667e+00 1719 1719 1.25000000000000e+02 1719 1684 -8.33333333333333e+00 1719 1679 -4.16666666666667e+00 1719 1687 4.16666666666667e+00 1719 1678 -4.16666666666667e+00 1719 1688 4.16666666666667e+00 1719 1694 -4.16666666666667e+00 1719 1693 8.33333333333333e+00 1719 1692 -1.25000000000000e+01 1719 1718 8.33333333333333e+00 1719 1327 4.16666666666667e+00 1719 1717 -4.16666666666667e+00 1719 1716 -1.25000000000000e+01 1719 1721 -1.66666666666667e+01 1719 1786 -4.16666666666667e+00 1719 1730 -4.16666666666667e+00 1719 1792 4.16666666666667e+00 1719 1793 4.16666666666667e+00 1719 1328 -8.33333333333333e+00 1719 1715 8.33333333333333e+00 1719 1729 8.33333333333333e+00 1719 1714 8.33333333333333e+00 1719 1720 -1.66666666666667e+01 1719 1728 -1.25000000000000e+01 1719 1713 -3.75000000000000e+01 1719 1787 8.33333333333333e+00 1719 1685 4.16666666666667e+00 1719 1785 -1.25000000000000e+01 1719 365 4.16666666666667e+00 1719 364 -8.33333333333333e+00 1719 355 8.33333333333333e+00 1719 356 8.33333333333333e+00 1719 52 4.16666666666667e+00 1719 354 -3.75000000000000e+01 1719 427 -4.16666666666667e+00 1719 428 -4.16666666666667e+00 1719 53 -8.33333333333333e+00 1720 1720 1.25000000000000e+02 1720 1683 -8.33333333333333e+00 1720 1686 4.16666666666667e+00 1720 1677 -4.16666666666667e+00 1720 1688 -8.33333333333333e+00 1720 1694 8.33333333333333e+00 1720 1679 -4.16666666666667e+00 1720 1693 -3.75000000000000e+01 1720 1692 8.33333333333333e+00 1720 1718 8.33333333333333e+00 1720 1721 -1.66666666666667e+01 1720 1717 -1.25000000000000e+01 1720 1326 4.16666666666667e+00 1720 1716 -4.16666666666667e+00 1720 1785 -4.16666666666667e+00 1720 1730 8.33333333333333e+00 1720 1791 4.16666666666667e+00 1720 1793 -8.33333333333333e+00 1720 1787 8.33333333333333e+00 1720 1328 4.16666666666667e+00 1720 1715 -4.16666666666667e+00 1720 1729 -3.75000000000000e+01 1720 1714 -1.25000000000000e+01 1720 1728 8.33333333333333e+00 1720 1713 8.33333333333333e+00 1720 1719 -1.66666666666667e+01 1720 1685 4.16666666666667e+00 1720 1786 -1.25000000000000e+01 1720 365 4.16666666666667e+00 1720 356 -4.16666666666667e+00 1720 363 -8.33333333333333e+00 1720 354 8.33333333333333e+00 1720 355 -1.25000000000000e+01 1720 51 4.16666666666667e+00 1720 426 -4.16666666666667e+00 1720 428 -4.16666666666667e+00 1720 53 4.16666666666667e+00 1721 1721 1.25000000000000e+02 1721 1683 4.16666666666667e+00 1721 1677 -4.16666666666667e+00 1721 1687 -8.33333333333333e+00 1721 1693 8.33333333333333e+00 1721 1686 4.16666666666667e+00 1721 1692 -4.16666666666667e+00 1721 1678 -4.16666666666667e+00 1721 1694 -1.25000000000000e+01 1721 1718 -3.75000000000000e+01 1721 1717 8.33333333333333e+00 1721 1720 -1.66666666666667e+01 1721 1716 8.33333333333333e+00 1721 1719 -1.66666666666667e+01 1721 1728 -4.16666666666667e+00 1721 1729 8.33333333333333e+00 1721 1792 -8.33333333333333e+00 1721 1786 8.33333333333333e+00 1721 1791 4.16666666666667e+00 1721 1730 -1.25000000000000e+01 1721 1715 -1.25000000000000e+01 1721 1327 4.16666666666667e+00 1721 1714 -4.16666666666667e+00 1721 1326 -8.33333333333333e+00 1721 1713 8.33333333333333e+00 1721 1684 4.16666666666667e+00 1721 1787 -3.75000000000000e+01 1721 1785 8.33333333333333e+00 1721 364 4.16666666666667e+00 1721 355 -4.16666666666667e+00 1721 363 4.16666666666667e+00 1721 356 -1.25000000000000e+01 1721 354 8.33333333333333e+00 1721 426 -4.16666666666667e+00 1721 427 -4.16666666666667e+00 1721 52 4.16666666666667e+00 1721 51 -8.33333333333333e+00 1722 1722 6.25000000000000e+01 1722 1706 4.16666666666667e+00 1722 1697 2.08333333333333e+00 1722 1328 -2.08333333333333e+00 1722 1696 -4.16666666666667e+00 1722 1352 -2.08333333333333e+00 1722 1705 4.16666666666667e+00 1722 1704 -1.87500000000000e+01 1722 1823 4.16666666666667e+00 1722 1822 4.16666666666667e+00 1722 1727 8.33333333333333e+00 1722 1726 -4.16666666666667e+00 1722 1725 -1.25000000000000e+01 1722 1729 4.16666666666667e+00 1722 1825 -4.16666666666667e+00 1722 1466 2.08333333333333e+00 1722 1826 -4.16666666666667e+00 1722 1465 -4.16666666666667e+00 1722 1351 4.16666666666667e+00 1722 1350 -6.25000000000000e+00 1722 1463 4.16666666666667e+00 1722 1730 -8.33333333333333e+00 1722 1462 4.16666666666667e+00 1722 1723 -8.33333333333333e+00 1722 1327 4.16666666666667e+00 1722 1461 -1.87500000000000e+01 1722 1724 -8.33333333333333e+00 1722 1326 -6.25000000000000e+00 1723 1723 6.25000000000000e+01 1723 1697 2.08333333333333e+00 1723 1695 -4.16666666666667e+00 1723 1705 -6.25000000000000e+00 1723 1704 4.16666666666667e+00 1723 1352 4.16666666666667e+00 1723 1823 -8.33333333333333e+00 1723 1821 4.16666666666667e+00 1723 1724 -8.33333333333333e+00 1723 1328 4.16666666666667e+00 1723 1727 8.33333333333333e+00 1723 1726 -1.25000000000000e+01 1723 1725 -4.16666666666667e+00 1723 1728 4.16666666666667e+00 1723 1824 -4.16666666666667e+00 1723 1466 2.08333333333333e+00 1723 1826 -4.16666666666667e+00 1723 1351 -1.87500000000000e+01 1723 1464 -4.16666666666667e+00 1723 1350 4.16666666666667e+00 1723 1463 -2.08333333333333e+00 1723 1730 4.16666666666667e+00 1723 1462 -6.25000000000000e+00 1723 1706 -2.08333333333333e+00 1723 1327 -1.87500000000000e+01 1723 1461 4.16666666666667e+00 1723 1722 -8.33333333333333e+00 1723 1326 4.16666666666667e+00 1724 1724 6.25000000000000e+01 1724 1696 2.08333333333333e+00 1724 1722 -8.33333333333333e+00 1724 1704 4.16666666666667e+00 1724 1695 2.08333333333333e+00 1724 1326 -2.08333333333333e+00 1724 1706 -6.25000000000000e+00 1724 1350 -2.08333333333333e+00 1724 1821 4.16666666666667e+00 1724 1351 4.16666666666667e+00 1724 1822 -8.33333333333333e+00 1724 1727 -3.75000000000000e+01 1724 1723 -8.33333333333333e+00 1724 1327 4.16666666666667e+00 1724 1726 8.33333333333333e+00 1724 1725 8.33333333333333e+00 1724 1464 2.08333333333333e+00 1724 1824 -4.16666666666667e+00 1724 1352 -6.25000000000000e+00 1724 1465 2.08333333333333e+00 1724 1825 -4.16666666666667e+00 1724 1463 -6.25000000000000e+00 1724 1705 -2.08333333333333e+00 1724 1328 -6.25000000000000e+00 1724 1462 -2.08333333333333e+00 1724 1729 4.16666666666667e+00 1724 1461 4.16666666666667e+00 1724 1728 -8.33333333333333e+00 1725 1725 1.25000000000000e+02 1725 1702 -8.33333333333333e+00 1725 1696 -4.16666666666667e+00 1725 1705 4.16666666666667e+00 1725 1712 8.33333333333333e+00 1725 1706 -8.33333333333333e+00 1725 1697 -4.16666666666667e+00 1725 1711 8.33333333333333e+00 1725 1710 -3.75000000000000e+01 1725 1826 4.16666666666667e+00 1725 1823 -4.16666666666667e+00 1725 1822 8.33333333333333e+00 1725 1825 -8.33333333333333e+00 1725 1724 8.33333333333333e+00 1725 1727 -1.66666666666667e+01 1725 1723 -4.16666666666667e+00 1725 1327 4.16666666666667e+00 1725 1722 -1.25000000000000e+01 1725 1357 4.16666666666667e+00 1725 1821 -1.25000000000000e+01 1725 1789 -4.16666666666667e+00 1725 1730 8.33333333333333e+00 1725 1792 4.16666666666667e+00 1725 1834 -4.16666666666667e+00 1725 1793 -8.33333333333333e+00 1725 1790 8.33333333333333e+00 1725 1328 4.16666666666667e+00 1725 1715 -4.16666666666667e+00 1725 1729 8.33333333333333e+00 1725 1714 8.33333333333333e+00 1725 1726 -1.66666666666667e+01 1725 1728 -3.75000000000000e+01 1725 1713 -1.25000000000000e+01 1725 1835 -4.16666666666667e+00 1725 1358 4.16666666666667e+00 1725 1703 4.16666666666667e+00 1725 1788 -1.25000000000000e+01 1726 1726 1.25000000000000e+02 1726 1701 -8.33333333333333e+00 1726 1697 -4.16666666666667e+00 1726 1695 -4.16666666666667e+00 1726 1704 4.16666666666667e+00 1726 1712 -4.16666666666667e+00 1726 1706 4.16666666666667e+00 1726 1711 -1.25000000000000e+01 1726 1710 8.33333333333333e+00 1726 1826 4.16666666666667e+00 1726 1821 8.33333333333333e+00 1726 1824 -8.33333333333333e+00 1726 1724 8.33333333333333e+00 1726 1723 -1.25000000000000e+01 1726 1722 -4.16666666666667e+00 1726 1326 4.16666666666667e+00 1726 1823 8.33333333333333e+00 1726 1822 -3.75000000000000e+01 1726 1356 4.16666666666667e+00 1726 1727 -1.66666666666667e+01 1726 1788 -4.16666666666667e+00 1726 1730 -4.16666666666667e+00 1726 1791 4.16666666666667e+00 1726 1833 -4.16666666666667e+00 1726 1835 -4.16666666666667e+00 1726 1793 4.16666666666667e+00 1726 1328 -8.33333333333333e+00 1726 1715 8.33333333333333e+00 1726 1729 -1.25000000000000e+01 1726 1714 -3.75000000000000e+01 1726 1728 8.33333333333333e+00 1726 1713 8.33333333333333e+00 1726 1725 -1.66666666666667e+01 1726 1790 8.33333333333333e+00 1726 1358 -8.33333333333333e+00 1726 1703 4.16666666666667e+00 1726 1789 -1.25000000000000e+01 1727 1727 1.25000000000000e+02 1727 1702 4.16666666666667e+00 1727 1696 -4.16666666666667e+00 1727 1711 -4.16666666666667e+00 1727 1705 4.16666666666667e+00 1727 1710 8.33333333333333e+00 1727 1704 -8.33333333333333e+00 1727 1695 -4.16666666666667e+00 1727 1712 -1.25000000000000e+01 1727 1824 4.16666666666667e+00 1727 1821 -4.16666666666667e+00 1727 1825 4.16666666666667e+00 1727 1724 -3.75000000000000e+01 1727 1723 8.33333333333333e+00 1727 1722 8.33333333333333e+00 1727 1725 -1.66666666666667e+01 1727 1823 -1.25000000000000e+01 1727 1822 8.33333333333333e+00 1727 1726 -1.66666666666667e+01 1727 1729 -4.16666666666667e+00 1727 1728 8.33333333333333e+00 1727 1834 -4.16666666666667e+00 1727 1792 4.16666666666667e+00 1727 1791 -8.33333333333333e+00 1727 1788 8.33333333333333e+00 1727 1730 -1.25000000000000e+01 1727 1715 -1.25000000000000e+01 1727 1327 -8.33333333333333e+00 1727 1714 8.33333333333333e+00 1727 1326 4.16666666666667e+00 1727 1713 -4.16666666666667e+00 1727 1701 4.16666666666667e+00 1727 1790 -3.75000000000000e+01 1727 1789 8.33333333333333e+00 1727 1357 -8.33333333333333e+00 1727 1833 -4.16666666666667e+00 1727 1356 4.16666666666667e+00 1728 1728 1.25000000000000e+02 1728 1834 4.16666666666667e+00 1728 1835 4.16666666666667e+00 1728 1726 8.33333333333333e+00 1728 1725 -3.75000000000000e+01 1728 1723 4.16666666666667e+00 1728 1826 -4.16666666666667e+00 1728 1724 -8.33333333333333e+00 1728 1825 8.33333333333333e+00 1728 1824 -1.25000000000000e+01 1728 1729 -1.66666666666667e+01 1728 1327 -4.16666666666667e+00 1728 1715 4.16666666666667e+00 1728 1721 -4.16666666666667e+00 1728 1792 -4.16666666666667e+00 1728 1714 -8.33333333333333e+00 1728 1720 8.33333333333333e+00 1728 1719 -1.25000000000000e+01 1728 1793 8.33333333333333e+00 1728 1791 -1.25000000000000e+01 1728 1462 -4.16666666666667e+00 1728 1717 4.16666666666667e+00 1728 1463 8.33333333333333e+00 1728 1730 -1.66666666666667e+01 1728 1718 4.16666666666667e+00 1728 1328 -4.16666666666667e+00 1728 1461 -1.25000000000000e+01 1728 1727 8.33333333333333e+00 1728 91 -4.16666666666667e+00 1728 427 4.16666666666667e+00 1728 428 -8.33333333333333e+00 1728 365 8.33333333333333e+00 1728 200 4.16666666666667e+00 1728 92 -4.16666666666667e+00 1728 364 8.33333333333333e+00 1728 199 -8.33333333333333e+00 1728 363 -3.75000000000000e+01 1729 1729 1.25000000000000e+02 1729 1833 4.16666666666667e+00 1729 1835 -8.33333333333333e+00 1729 1726 -1.25000000000000e+01 1729 1725 8.33333333333333e+00 1729 1722 4.16666666666667e+00 1729 1826 8.33333333333333e+00 1729 1724 4.16666666666667e+00 1729 1825 -3.75000000000000e+01 1729 1824 8.33333333333333e+00 1729 1728 -1.66666666666667e+01 1729 1326 -4.16666666666667e+00 1729 1793 8.33333333333333e+00 1729 1730 -1.66666666666667e+01 1729 1721 8.33333333333333e+00 1729 1791 -4.16666666666667e+00 1729 1328 -4.16666666666667e+00 1729 1715 4.16666666666667e+00 1729 1720 -3.75000000000000e+01 1729 1713 -8.33333333333333e+00 1729 1719 8.33333333333333e+00 1729 1792 -1.25000000000000e+01 1729 1461 -4.16666666666667e+00 1729 1716 4.16666666666667e+00 1729 1718 -8.33333333333333e+00 1729 1463 8.33333333333333e+00 1729 1462 -1.25000000000000e+01 1729 1727 -4.16666666666667e+00 1729 90 -4.16666666666667e+00 1729 426 4.16666666666667e+00 1729 92 -4.16666666666667e+00 1729 428 4.16666666666667e+00 1729 200 4.16666666666667e+00 1729 365 -4.16666666666667e+00 1729 364 -1.25000000000000e+01 1729 363 8.33333333333333e+00 1729 198 -8.33333333333333e+00 1730 1730 1.25000000000000e+02 1730 1725 8.33333333333333e+00 1730 1834 -8.33333333333333e+00 1730 1833 4.16666666666667e+00 1730 1727 -1.25000000000000e+01 1730 1825 8.33333333333333e+00 1730 1824 -4.16666666666667e+00 1730 1723 4.16666666666667e+00 1730 1722 -8.33333333333333e+00 1730 1826 -1.25000000000000e+01 1730 1713 4.16666666666667e+00 1730 1719 -4.16666666666667e+00 1730 1792 8.33333333333333e+00 1730 1729 -1.66666666666667e+01 1730 1720 8.33333333333333e+00 1730 1721 -1.25000000000000e+01 1730 1327 -4.16666666666667e+00 1730 1714 4.16666666666667e+00 1730 1793 -3.75000000000000e+01 1730 1791 8.33333333333333e+00 1730 1461 8.33333333333333e+00 1730 1728 -1.66666666666667e+01 1730 1463 -3.75000000000000e+01 1730 1717 -8.33333333333333e+00 1730 1462 8.33333333333333e+00 1730 1716 4.16666666666667e+00 1730 1326 -4.16666666666667e+00 1730 1726 -4.16666666666667e+00 1730 91 -4.16666666666667e+00 1730 427 4.16666666666667e+00 1730 426 -8.33333333333333e+00 1730 199 4.16666666666667e+00 1730 364 -4.16666666666667e+00 1730 363 8.33333333333333e+00 1730 365 -1.25000000000000e+01 1730 198 4.16666666666667e+00 1730 90 -4.16666666666667e+00 1731 1731 6.25000000000000e+01 1731 1763 -4.16666666666667e+00 1731 1760 -4.16666666666667e+00 1731 1759 2.08333333333333e+00 1731 1762 -4.16666666666667e+00 1731 1742 4.16666666666667e+00 1731 1741 -2.08333333333333e+00 1731 1747 4.16666666666667e+00 1731 1740 -6.25000000000000e+00 1731 1420 -2.08333333333333e+00 1731 1417 2.08333333333333e+00 1731 1751 4.16666666666667e+00 1731 1739 -4.16666666666667e+00 1731 1331 4.16666666666667e+00 1731 1418 -4.16666666666667e+00 1731 1330 4.16666666666667e+00 1731 1732 -8.33333333333333e+00 1731 1738 8.33333333333333e+00 1731 1329 -1.87500000000000e+01 1731 1737 -1.25000000000000e+01 1731 1733 -8.33333333333333e+00 1731 1334 4.16666666666667e+00 1731 1421 4.16666666666667e+00 1731 1333 4.16666666666667e+00 1731 1750 -8.33333333333333e+00 1731 1748 4.16666666666667e+00 1731 1332 -1.87500000000000e+01 1731 1419 -6.25000000000000e+00 1732 1732 6.25000000000000e+01 1732 1763 -4.16666666666667e+00 1732 1758 2.08333333333333e+00 1732 1761 -4.16666666666667e+00 1732 1742 4.16666666666667e+00 1732 1748 -8.33333333333333e+00 1732 1741 -6.25000000000000e+00 1732 1740 -2.08333333333333e+00 1732 1746 4.16666666666667e+00 1732 1419 -2.08333333333333e+00 1732 1416 2.08333333333333e+00 1732 1421 4.16666666666667e+00 1732 1733 -8.33333333333333e+00 1732 1739 8.33333333333333e+00 1732 1331 -2.08333333333333e+00 1732 1418 2.08333333333333e+00 1732 1330 -6.25000000000000e+00 1732 1738 -3.75000000000000e+01 1732 1329 4.16666666666667e+00 1732 1731 -8.33333333333333e+00 1732 1737 8.33333333333333e+00 1732 1334 -2.08333333333333e+00 1732 1751 4.16666666666667e+00 1732 1760 2.08333333333333e+00 1732 1333 -6.25000000000000e+00 1732 1420 -6.25000000000000e+00 1732 1332 4.16666666666667e+00 1732 1749 -8.33333333333333e+00 1733 1733 6.25000000000000e+01 1733 1762 -4.16666666666667e+00 1733 1746 4.16666666666667e+00 1733 1761 -4.16666666666667e+00 1733 1758 -4.16666666666667e+00 1733 1742 -1.87500000000000e+01 1733 1741 4.16666666666667e+00 1733 1747 -8.33333333333333e+00 1733 1740 4.16666666666667e+00 1733 1420 4.16666666666667e+00 1733 1732 -8.33333333333333e+00 1733 1738 8.33333333333333e+00 1733 1749 4.16666666666667e+00 1733 1737 -4.16666666666667e+00 1733 1331 -6.25000000000000e+00 1733 1739 -1.25000000000000e+01 1733 1330 -2.08333333333333e+00 1733 1417 2.08333333333333e+00 1733 1329 4.16666666666667e+00 1733 1416 -4.16666666666667e+00 1733 1759 2.08333333333333e+00 1733 1334 -6.25000000000000e+00 1733 1421 -1.87500000000000e+01 1733 1333 -2.08333333333333e+00 1733 1750 4.16666666666667e+00 1733 1731 -8.33333333333333e+00 1733 1332 4.16666666666667e+00 1733 1419 4.16666666666667e+00 1734 1734 1.25000000000000e+02 1734 1748 -8.33333333333333e+00 1734 1747 4.16666666666667e+00 1734 1780 -4.16666666666667e+00 1734 1739 8.33333333333333e+00 1734 1769 4.16666666666667e+00 1734 1768 -8.33333333333333e+00 1734 1738 8.33333333333333e+00 1734 1737 -3.75000000000000e+01 1734 1736 -1.66666666666667e+01 1734 1745 8.33333333333333e+00 1734 1744 -4.16666666666667e+00 1734 1777 4.16666666666667e+00 1734 1778 4.16666666666667e+00 1734 1337 -4.16666666666667e+00 1734 1331 -4.16666666666667e+00 1734 1743 -1.25000000000000e+01 1734 1628 4.16666666666667e+00 1734 1330 8.33333333333333e+00 1734 1627 -8.33333333333333e+00 1734 1631 8.33333333333333e+00 1734 1735 -1.66666666666667e+01 1734 1336 8.33333333333333e+00 1734 1630 8.33333333333333e+00 1734 1629 -3.75000000000000e+01 1734 1418 4.16666666666667e+00 1734 1565 -4.16666666666667e+00 1734 1417 4.16666666666667e+00 1734 1564 -4.16666666666667e+00 1734 1329 -1.25000000000000e+01 1734 1424 8.33333333333333e+00 1734 1568 -8.33333333333333e+00 1734 1423 -4.16666666666667e+00 1734 1567 4.16666666666667e+00 1734 1422 -1.25000000000000e+01 1734 1781 -4.16666666666667e+00 1734 1335 -1.25000000000000e+01 1735 1735 1.25000000000000e+02 1735 1781 -4.16666666666667e+00 1735 1746 4.16666666666667e+00 1735 1779 -4.16666666666667e+00 1735 1769 4.16666666666667e+00 1735 1739 -4.16666666666667e+00 1735 1767 -8.33333333333333e+00 1735 1738 -1.25000000000000e+01 1735 1737 8.33333333333333e+00 1735 1743 -4.16666666666667e+00 1735 1776 4.16666666666667e+00 1735 1778 -8.33333333333333e+00 1735 1745 8.33333333333333e+00 1735 1744 -1.25000000000000e+01 1735 1628 4.16666666666667e+00 1735 1329 8.33333333333333e+00 1735 1626 -8.33333333333333e+00 1735 1631 -4.16666666666667e+00 1735 1630 -1.25000000000000e+01 1735 1734 -1.66666666666667e+01 1735 1335 8.33333333333333e+00 1735 1629 8.33333333333333e+00 1735 1568 4.16666666666667e+00 1735 1565 -4.16666666666667e+00 1735 1418 -8.33333333333333e+00 1735 1331 8.33333333333333e+00 1735 1330 -3.75000000000000e+01 1735 1416 4.16666666666667e+00 1735 1563 -4.16666666666667e+00 1735 1424 8.33333333333333e+00 1735 1736 -1.66666666666667e+01 1735 1337 8.33333333333333e+00 1735 1423 -1.25000000000000e+01 1735 1748 4.16666666666667e+00 1735 1336 -3.75000000000000e+01 1735 1422 -4.16666666666667e+00 1735 1566 4.16666666666667e+00 1736 1736 1.25000000000000e+02 1736 1747 4.16666666666667e+00 1736 1780 -4.16666666666667e+00 1736 1746 -8.33333333333333e+00 1736 1768 4.16666666666667e+00 1736 1738 -4.16666666666667e+00 1736 1737 8.33333333333333e+00 1736 1767 4.16666666666667e+00 1736 1739 -1.25000000000000e+01 1736 1734 -1.66666666666667e+01 1736 1743 8.33333333333333e+00 1736 1777 -8.33333333333333e+00 1736 1776 4.16666666666667e+00 1736 1335 -4.16666666666667e+00 1736 1745 -3.75000000000000e+01 1736 1744 8.33333333333333e+00 1736 1329 -4.16666666666667e+00 1736 1626 4.16666666666667e+00 1736 1627 4.16666666666667e+00 1736 1631 -1.25000000000000e+01 1736 1630 -4.16666666666667e+00 1736 1629 8.33333333333333e+00 1736 1567 4.16666666666667e+00 1736 1564 -4.16666666666667e+00 1736 1416 4.16666666666667e+00 1736 1563 -4.16666666666667e+00 1736 1331 -1.25000000000000e+01 1736 1417 -8.33333333333333e+00 1736 1330 8.33333333333333e+00 1736 1424 -3.75000000000000e+01 1736 1779 -4.16666666666667e+00 1736 1337 -1.25000000000000e+01 1736 1423 8.33333333333333e+00 1736 1735 -1.66666666666667e+01 1736 1336 8.33333333333333e+00 1736 1422 8.33333333333333e+00 1736 1566 -8.33333333333333e+00 1737 1737 1.25000000000000e+02 1737 1781 4.16666666666667e+00 1737 1736 8.33333333333333e+00 1737 1424 -8.33333333333333e+00 1737 1423 4.16666666666667e+00 1737 1735 8.33333333333333e+00 1737 1734 -3.75000000000000e+01 1737 1769 -4.16666666666667e+00 1737 1768 8.33333333333333e+00 1737 1767 -1.25000000000000e+01 1737 1747 -4.16666666666667e+00 1737 1795 -4.16666666666667e+00 1737 1762 4.16666666666667e+00 1737 1748 8.33333333333333e+00 1737 1763 -8.33333333333333e+00 1737 1340 4.16666666666667e+00 1737 1796 -4.16666666666667e+00 1737 1331 4.16666666666667e+00 1737 1746 -1.25000000000000e+01 1737 1418 -4.16666666666667e+00 1737 1417 -4.16666666666667e+00 1737 1421 4.16666666666667e+00 1737 1733 -4.16666666666667e+00 1737 1738 -1.66666666666667e+01 1737 1420 4.16666666666667e+00 1737 1426 -4.16666666666667e+00 1737 1330 -8.33333333333333e+00 1737 1732 8.33333333333333e+00 1737 1731 -1.25000000000000e+01 1737 1739 -1.66666666666667e+01 1737 1751 8.33333333333333e+00 1737 1427 8.33333333333333e+00 1737 1750 8.33333333333333e+00 1737 1339 -8.33333333333333e+00 1737 1780 4.16666666666667e+00 1737 1749 -3.75000000000000e+01 1737 1425 -1.25000000000000e+01 1738 1738 1.25000000000000e+02 1738 1781 -8.33333333333333e+00 1738 1736 -4.16666666666667e+00 1738 1424 4.16666666666667e+00 1738 1422 4.16666666666667e+00 1738 1735 -1.25000000000000e+01 1738 1734 8.33333333333333e+00 1738 1769 8.33333333333333e+00 1738 1768 -3.75000000000000e+01 1738 1767 8.33333333333333e+00 1738 1746 -4.16666666666667e+00 1738 1794 -4.16666666666667e+00 1738 1761 4.16666666666667e+00 1738 1796 -4.16666666666667e+00 1738 1763 4.16666666666667e+00 1738 1739 -1.66666666666667e+01 1738 1748 8.33333333333333e+00 1738 1747 -1.25000000000000e+01 1738 1416 -4.16666666666667e+00 1738 1733 8.33333333333333e+00 1738 1737 -1.66666666666667e+01 1738 1421 -8.33333333333333e+00 1738 1427 8.33333333333333e+00 1738 1419 4.16666666666667e+00 1738 1425 -4.16666666666667e+00 1738 1331 4.16666666666667e+00 1738 1418 -4.16666666666667e+00 1738 1732 -3.75000000000000e+01 1738 1329 -8.33333333333333e+00 1738 1731 8.33333333333333e+00 1738 1751 -4.16666666666667e+00 1738 1340 4.16666666666667e+00 1738 1779 4.16666666666667e+00 1738 1750 -1.25000000000000e+01 1738 1426 -1.25000000000000e+01 1738 1749 8.33333333333333e+00 1738 1338 -8.33333333333333e+00 1739 1739 1.25000000000000e+02 1739 1779 4.16666666666667e+00 1739 1735 -4.16666666666667e+00 1739 1423 4.16666666666667e+00 1739 1734 8.33333333333333e+00 1739 1422 -8.33333333333333e+00 1739 1736 -1.25000000000000e+01 1739 1769 -1.25000000000000e+01 1739 1768 8.33333333333333e+00 1739 1767 -4.16666666666667e+00 1739 1795 -4.16666666666667e+00 1739 1762 4.16666666666667e+00 1739 1746 8.33333333333333e+00 1739 1761 -8.33333333333333e+00 1739 1338 4.16666666666667e+00 1739 1794 -4.16666666666667e+00 1739 1748 -3.75000000000000e+01 1739 1738 -1.66666666666667e+01 1739 1747 8.33333333333333e+00 1739 1329 4.16666666666667e+00 1739 1416 -4.16666666666667e+00 1739 1732 8.33333333333333e+00 1739 1419 4.16666666666667e+00 1739 1731 -4.16666666666667e+00 1739 1420 -8.33333333333333e+00 1739 1426 8.33333333333333e+00 1739 1733 -1.25000000000000e+01 1739 1330 4.16666666666667e+00 1739 1417 -4.16666666666667e+00 1739 1780 -8.33333333333333e+00 1739 1751 -1.25000000000000e+01 1739 1427 -3.75000000000000e+01 1739 1750 -4.16666666666667e+00 1739 1339 4.16666666666667e+00 1739 1737 -1.66666666666667e+01 1739 1749 8.33333333333333e+00 1739 1425 8.33333333333333e+00 1740 1740 6.25000000000000e+01 1740 1763 4.16666666666667e+00 1740 1762 -8.33333333333333e+00 1740 1733 4.16666666666667e+00 1740 1732 -2.08333333333333e+00 1740 1330 2.08333333333333e+00 1740 1731 -6.25000000000000e+00 1740 1760 4.16666666666667e+00 1740 1369 2.08333333333333e+00 1740 1758 -1.87500000000000e+01 1740 1748 -4.16666666666667e+00 1740 1742 -8.33333333333333e+00 1740 1489 -2.08333333333333e+00 1740 1859 -4.16666666666667e+00 1740 1496 4.16666666666667e+00 1740 1858 -4.16666666666667e+00 1740 1495 4.16666666666667e+00 1740 1490 4.16666666666667e+00 1740 1370 -4.16666666666667e+00 1740 1488 -6.25000000000000e+00 1740 1484 4.16666666666667e+00 1740 1331 -4.16666666666667e+00 1740 1483 4.16666666666667e+00 1740 1741 -8.33333333333333e+00 1740 1747 8.33333333333333e+00 1740 1482 -1.87500000000000e+01 1740 1759 4.16666666666667e+00 1740 1746 -1.25000000000000e+01 1741 1741 6.25000000000000e+01 1741 1758 4.16666666666667e+00 1741 1763 4.16666666666667e+00 1741 1761 -8.33333333333333e+00 1741 1733 4.16666666666667e+00 1741 1742 -8.33333333333333e+00 1741 1732 -6.25000000000000e+00 1741 1731 -2.08333333333333e+00 1741 1329 2.08333333333333e+00 1741 1759 -6.25000000000000e+00 1741 1368 2.08333333333333e+00 1741 1488 -2.08333333333333e+00 1741 1490 4.16666666666667e+00 1741 1748 8.33333333333333e+00 1741 1496 -8.33333333333333e+00 1741 1857 -4.16666666666667e+00 1741 1494 4.16666666666667e+00 1741 1370 2.08333333333333e+00 1741 1859 -4.16666666666667e+00 1741 1489 -6.25000000000000e+00 1741 1484 -2.08333333333333e+00 1741 1331 2.08333333333333e+00 1741 1483 -6.25000000000000e+00 1741 1760 -2.08333333333333e+00 1741 1747 -3.75000000000000e+01 1741 1482 4.16666666666667e+00 1741 1740 -8.33333333333333e+00 1741 1746 8.33333333333333e+00 1742 1742 6.25000000000000e+01 1742 1761 4.16666666666667e+00 1742 1762 4.16666666666667e+00 1742 1733 -1.87500000000000e+01 1742 1732 4.16666666666667e+00 1742 1741 -8.33333333333333e+00 1742 1731 4.16666666666667e+00 1742 1760 -6.25000000000000e+00 1742 1758 4.16666666666667e+00 1742 1746 -4.16666666666667e+00 1742 1740 -8.33333333333333e+00 1742 1489 4.16666666666667e+00 1742 1857 -4.16666666666667e+00 1742 1494 4.16666666666667e+00 1742 1747 8.33333333333333e+00 1742 1495 -8.33333333333333e+00 1742 1490 -1.87500000000000e+01 1742 1369 2.08333333333333e+00 1742 1858 -4.16666666666667e+00 1742 1488 4.16666666666667e+00 1742 1368 -4.16666666666667e+00 1742 1484 -6.25000000000000e+00 1742 1759 -2.08333333333333e+00 1742 1748 -1.25000000000000e+01 1742 1483 -2.08333333333333e+00 1742 1330 2.08333333333333e+00 1742 1482 4.16666666666667e+00 1742 1329 -4.16666666666667e+00 1743 1743 1.25000000000000e+02 1743 1780 -8.33333333333333e+00 1743 1748 8.33333333333333e+00 1743 1496 -8.33333333333333e+00 1743 1864 -4.16666666666667e+00 1743 1495 4.16666666666667e+00 1743 1865 -4.16666666666667e+00 1743 1747 8.33333333333333e+00 1743 1746 -3.75000000000000e+01 1743 1736 8.33333333333333e+00 1743 1735 -4.16666666666667e+00 1743 1631 -8.33333333333333e+00 1743 1630 4.16666666666667e+00 1743 1373 4.16666666666667e+00 1743 1778 -4.16666666666667e+00 1743 1777 8.33333333333333e+00 1743 1744 -1.66666666666667e+01 1743 1776 -1.25000000000000e+01 1743 1331 4.16666666666667e+00 1743 1734 -1.25000000000000e+01 1743 1484 -4.16666666666667e+00 1743 1483 8.33333333333333e+00 1743 1628 -4.16666666666667e+00 1743 1481 4.16666666666667e+00 1743 1639 8.33333333333333e+00 1743 1480 -8.33333333333333e+00 1743 1330 4.16666666666667e+00 1743 1627 -4.16666666666667e+00 1743 1482 -1.25000000000000e+01 1743 1745 -1.66666666666667e+01 1743 1493 8.33333333333333e+00 1743 1640 8.33333333333333e+00 1743 1492 -4.16666666666667e+00 1743 1372 4.16666666666667e+00 1743 1781 4.16666666666667e+00 1743 1491 -1.25000000000000e+01 1743 1638 -3.75000000000000e+01 1744 1744 1.25000000000000e+02 1744 1779 -8.33333333333333e+00 1744 1748 -4.16666666666667e+00 1744 1865 -4.16666666666667e+00 1744 1496 4.16666666666667e+00 1744 1863 -4.16666666666667e+00 1744 1494 4.16666666666667e+00 1744 1747 -1.25000000000000e+01 1744 1746 8.33333333333333e+00 1744 1734 -4.16666666666667e+00 1744 1631 4.16666666666667e+00 1744 1629 4.16666666666667e+00 1744 1778 8.33333333333333e+00 1744 1777 -3.75000000000000e+01 1744 1776 8.33333333333333e+00 1744 1743 -1.66666666666667e+01 1744 1736 8.33333333333333e+00 1744 1735 -1.25000000000000e+01 1744 1640 -4.16666666666667e+00 1744 1745 -1.66666666666667e+01 1744 1628 -4.16666666666667e+00 1744 1481 4.16666666666667e+00 1744 1482 8.33333333333333e+00 1744 1638 8.33333333333333e+00 1744 1479 -8.33333333333333e+00 1744 1331 -8.33333333333333e+00 1744 1484 8.33333333333333e+00 1744 1483 -3.75000000000000e+01 1744 1329 4.16666666666667e+00 1744 1626 -4.16666666666667e+00 1744 1493 8.33333333333333e+00 1744 1373 -8.33333333333333e+00 1744 1781 4.16666666666667e+00 1744 1492 -1.25000000000000e+01 1744 1639 -1.25000000000000e+01 1744 1491 -4.16666666666667e+00 1744 1371 4.16666666666667e+00 1745 1745 1.25000000000000e+02 1745 1779 4.16666666666667e+00 1745 1747 -4.16666666666667e+00 1745 1864 -4.16666666666667e+00 1745 1495 4.16666666666667e+00 1745 1746 8.33333333333333e+00 1745 1494 -8.33333333333333e+00 1745 1863 -4.16666666666667e+00 1745 1748 -1.25000000000000e+01 1745 1734 8.33333333333333e+00 1745 1630 4.16666666666667e+00 1745 1629 -8.33333333333333e+00 1745 1778 -1.25000000000000e+01 1745 1777 8.33333333333333e+00 1745 1371 4.16666666666667e+00 1745 1776 -4.16666666666667e+00 1745 1736 -3.75000000000000e+01 1745 1735 8.33333333333333e+00 1745 1329 4.16666666666667e+00 1745 1639 -4.16666666666667e+00 1745 1744 -1.66666666666667e+01 1745 1482 -4.16666666666667e+00 1745 1627 -4.16666666666667e+00 1745 1480 4.16666666666667e+00 1745 1626 -4.16666666666667e+00 1745 1479 4.16666666666667e+00 1745 1484 -1.25000000000000e+01 1745 1330 -8.33333333333333e+00 1745 1483 8.33333333333333e+00 1745 1780 4.16666666666667e+00 1745 1493 -3.75000000000000e+01 1745 1640 -1.25000000000000e+01 1745 1492 8.33333333333333e+00 1745 1372 -8.33333333333333e+00 1745 1743 -1.66666666666667e+01 1745 1491 8.33333333333333e+00 1745 1638 8.33333333333333e+00 1746 1746 1.25000000000000e+02 1746 1780 8.33333333333333e+00 1746 1736 -8.33333333333333e+00 1746 1735 4.16666666666667e+00 1746 1779 -1.25000000000000e+01 1746 1745 8.33333333333333e+00 1746 1864 4.16666666666667e+00 1746 1744 8.33333333333333e+00 1746 1743 -3.75000000000000e+01 1746 1865 4.16666666666667e+00 1746 1738 -4.16666666666667e+00 1746 1739 8.33333333333333e+00 1746 1748 -1.66666666666667e+01 1746 1331 -4.16666666666667e+00 1746 1737 -1.25000000000000e+01 1746 1796 4.16666666666667e+00 1746 1376 -4.16666666666667e+00 1746 1795 -8.33333333333333e+00 1746 1733 4.16666666666667e+00 1746 1747 -1.66666666666667e+01 1746 1762 8.33333333333333e+00 1746 1732 4.16666666666667e+00 1746 1330 -4.16666666666667e+00 1746 1763 8.33333333333333e+00 1746 1375 -4.16666666666667e+00 1746 1761 -3.75000000000000e+01 1746 1742 -4.16666666666667e+00 1746 1484 4.16666666666667e+00 1746 1858 4.16666666666667e+00 1746 1495 -4.16666666666667e+00 1746 1483 -8.33333333333333e+00 1746 1741 8.33333333333333e+00 1746 1740 -1.25000000000000e+01 1746 1496 8.33333333333333e+00 1746 1859 -8.33333333333333e+00 1746 1494 -1.25000000000000e+01 1746 1781 -4.16666666666667e+00 1747 1747 1.25000000000000e+02 1747 1779 8.33333333333333e+00 1747 1734 4.16666666666667e+00 1747 1781 8.33333333333333e+00 1747 1780 -3.75000000000000e+01 1747 1745 -4.16666666666667e+00 1747 1863 4.16666666666667e+00 1747 1744 -1.25000000000000e+01 1747 1743 8.33333333333333e+00 1747 1865 -8.33333333333333e+00 1747 1737 -4.16666666666667e+00 1747 1796 4.16666666666667e+00 1747 1739 8.33333333333333e+00 1747 1738 -1.25000000000000e+01 1747 1794 -8.33333333333333e+00 1747 1763 -4.16666666666667e+00 1747 1746 -1.66666666666667e+01 1747 1761 8.33333333333333e+00 1747 1733 -8.33333333333333e+00 1747 1731 4.16666666666667e+00 1747 1329 -4.16666666666667e+00 1747 1762 -1.25000000000000e+01 1747 1374 -4.16666666666667e+00 1747 1742 8.33333333333333e+00 1747 1748 -1.66666666666667e+01 1747 1496 8.33333333333333e+00 1747 1857 4.16666666666667e+00 1747 1494 -4.16666666666667e+00 1747 1484 4.16666666666667e+00 1747 1331 -4.16666666666667e+00 1747 1741 -3.75000000000000e+01 1747 1482 -8.33333333333333e+00 1747 1740 8.33333333333333e+00 1747 1859 4.16666666666667e+00 1747 1376 -4.16666666666667e+00 1747 1495 -1.25000000000000e+01 1747 1736 4.16666666666667e+00 1748 1748 1.25000000000000e+02 1748 1779 -4.16666666666667e+00 1748 1734 -8.33333333333333e+00 1748 1781 -1.25000000000000e+01 1748 1780 8.33333333333333e+00 1748 1744 -4.16666666666667e+00 1748 1743 8.33333333333333e+00 1748 1745 -1.25000000000000e+01 1748 1864 -8.33333333333333e+00 1748 1863 4.16666666666667e+00 1748 1795 4.16666666666667e+00 1748 1737 8.33333333333333e+00 1748 1746 -1.66666666666667e+01 1748 1739 -3.75000000000000e+01 1748 1738 8.33333333333333e+00 1748 1329 -4.16666666666667e+00 1748 1794 4.16666666666667e+00 1748 1374 -4.16666666666667e+00 1748 1731 4.16666666666667e+00 1748 1762 -4.16666666666667e+00 1748 1732 -8.33333333333333e+00 1748 1763 -1.25000000000000e+01 1748 1761 8.33333333333333e+00 1748 1740 -4.16666666666667e+00 1748 1482 4.16666666666667e+00 1748 1741 8.33333333333333e+00 1748 1747 -1.66666666666667e+01 1748 1495 8.33333333333333e+00 1748 1742 -1.25000000000000e+01 1748 1483 4.16666666666667e+00 1748 1330 -4.16666666666667e+00 1748 1496 -3.75000000000000e+01 1748 1735 4.16666666666667e+00 1748 1858 4.16666666666667e+00 1748 1375 -4.16666666666667e+00 1748 1494 8.33333333333333e+00 1748 1857 -8.33333333333333e+00 1749 1749 1.25000000000000e+02 1749 1787 4.16666666666667e+00 1749 1786 -8.33333333333333e+00 1749 1756 8.33333333333333e+00 1749 1755 -3.75000000000000e+01 1749 1682 4.16666666666667e+00 1749 1681 4.16666666666667e+00 1749 1685 8.33333333333333e+00 1749 1684 -4.16666666666667e+00 1749 1683 -1.25000000000000e+01 1749 1751 -1.66666666666667e+01 1749 1334 -4.16666666666667e+00 1749 1340 -4.16666666666667e+00 1749 1799 -4.16666666666667e+00 1749 1796 4.16666666666667e+00 1749 1766 -8.33333333333333e+00 1749 1763 8.33333333333333e+00 1749 1765 4.16666666666667e+00 1749 1762 -4.16666666666667e+00 1749 1761 -1.25000000000000e+01 1749 1798 -4.16666666666667e+00 1749 1795 4.16666666666667e+00 1749 1421 -4.16666666666667e+00 1749 1733 4.16666666666667e+00 1749 1420 -4.16666666666667e+00 1749 1426 4.16666666666667e+00 1749 1732 -8.33333333333333e+00 1749 1333 8.33333333333333e+00 1749 1332 -1.25000000000000e+01 1749 1739 8.33333333333333e+00 1749 1427 -8.33333333333333e+00 1749 1738 8.33333333333333e+00 1749 1750 -1.66666666666667e+01 1749 1339 8.33333333333333e+00 1749 1737 -3.75000000000000e+01 1749 1757 8.33333333333333e+00 1749 1338 -1.25000000000000e+01 1750 1750 1.25000000000000e+02 1750 1757 -4.16666666666667e+00 1750 1785 -8.33333333333333e+00 1750 1756 -1.25000000000000e+01 1750 1755 8.33333333333333e+00 1750 1682 -8.33333333333333e+00 1750 1680 4.16666666666667e+00 1750 1685 8.33333333333333e+00 1750 1684 -1.25000000000000e+01 1750 1683 -4.16666666666667e+00 1750 1799 -4.16666666666667e+00 1750 1766 4.16666666666667e+00 1750 1334 8.33333333333333e+00 1750 1751 -1.66666666666667e+01 1750 1763 8.33333333333333e+00 1750 1762 -1.25000000000000e+01 1750 1764 4.16666666666667e+00 1750 1761 -4.16666666666667e+00 1750 1340 8.33333333333333e+00 1750 1796 -8.33333333333333e+00 1750 1797 -4.16666666666667e+00 1750 1794 4.16666666666667e+00 1750 1419 -4.16666666666667e+00 1750 1425 4.16666666666667e+00 1750 1733 4.16666666666667e+00 1750 1421 -4.16666666666667e+00 1750 1333 -3.75000000000000e+01 1750 1731 -8.33333333333333e+00 1750 1332 8.33333333333333e+00 1750 1739 -4.16666666666667e+00 1750 1427 4.16666666666667e+00 1750 1738 -1.25000000000000e+01 1750 1787 4.16666666666667e+00 1750 1339 -3.75000000000000e+01 1750 1737 8.33333333333333e+00 1750 1749 -1.66666666666667e+01 1750 1338 8.33333333333333e+00 1751 1751 1.25000000000000e+02 1751 1756 -4.16666666666667e+00 1751 1755 8.33333333333333e+00 1751 1785 4.16666666666667e+00 1751 1757 -1.25000000000000e+01 1751 1680 4.16666666666667e+00 1751 1681 -8.33333333333333e+00 1751 1685 -3.75000000000000e+01 1751 1684 8.33333333333333e+00 1751 1683 8.33333333333333e+00 1751 1749 -1.66666666666667e+01 1751 1332 -4.16666666666667e+00 1751 1338 -4.16666666666667e+00 1751 1797 -4.16666666666667e+00 1751 1794 4.16666666666667e+00 1751 1798 -4.16666666666667e+00 1751 1765 4.16666666666667e+00 1751 1763 -3.75000000000000e+01 1751 1333 8.33333333333333e+00 1751 1750 -1.66666666666667e+01 1751 1762 8.33333333333333e+00 1751 1764 -8.33333333333333e+00 1751 1761 8.33333333333333e+00 1751 1339 8.33333333333333e+00 1751 1795 -8.33333333333333e+00 1751 1419 -4.16666666666667e+00 1751 1731 4.16666666666667e+00 1751 1334 -1.25000000000000e+01 1751 1732 4.16666666666667e+00 1751 1420 -4.16666666666667e+00 1751 1739 -1.25000000000000e+01 1751 1786 4.16666666666667e+00 1751 1340 -1.25000000000000e+01 1751 1738 -4.16666666666667e+00 1751 1426 4.16666666666667e+00 1751 1737 8.33333333333333e+00 1751 1425 -8.33333333333333e+00 1752 1752 6.25000000000000e+01 1752 1757 -4.16666666666667e+00 1752 1690 -2.08333333333333e+00 1752 1681 2.08333333333333e+00 1752 1691 4.16666666666667e+00 1752 1689 -6.25000000000000e+00 1752 1682 -4.16666666666667e+00 1752 1753 -8.33333333333333e+00 1752 1756 8.33333333333333e+00 1752 1333 4.16666666666667e+00 1752 1755 -1.25000000000000e+01 1752 1766 4.16666666666667e+00 1752 1754 -8.33333333333333e+00 1752 1499 4.16666666666667e+00 1752 1334 4.16666666666667e+00 1752 1498 -2.08333333333333e+00 1752 1765 4.16666666666667e+00 1752 1497 -6.25000000000000e+00 1752 1332 -1.87500000000000e+01 1752 46 4.16666666666667e+00 1752 391 -8.33333333333333e+00 1752 401 -4.16666666666667e+00 1752 47 4.16666666666667e+00 1752 236 -4.16666666666667e+00 1752 235 2.08333333333333e+00 1752 400 -4.16666666666667e+00 1752 45 -1.87500000000000e+01 1752 392 4.16666666666667e+00 1753 1753 6.25000000000000e+01 1753 1691 4.16666666666667e+00 1753 1757 8.33333333333333e+00 1753 1689 -2.08333333333333e+00 1753 1680 2.08333333333333e+00 1753 1690 -6.25000000000000e+00 1753 1682 2.08333333333333e+00 1753 1334 -2.08333333333333e+00 1753 1756 -3.75000000000000e+01 1753 1752 -8.33333333333333e+00 1753 1755 8.33333333333333e+00 1753 1332 4.16666666666667e+00 1753 1499 4.16666666666667e+00 1753 1766 -8.33333333333333e+00 1753 1754 -8.33333333333333e+00 1753 1498 -6.25000000000000e+00 1753 1333 -6.25000000000000e+00 1753 1497 -2.08333333333333e+00 1753 1764 4.16666666666667e+00 1753 47 -2.08333333333333e+00 1753 392 4.16666666666667e+00 1753 45 4.16666666666667e+00 1753 390 -8.33333333333333e+00 1753 236 2.08333333333333e+00 1753 401 -4.16666666666667e+00 1753 46 -6.25000000000000e+00 1753 234 2.08333333333333e+00 1753 399 -4.16666666666667e+00 1754 1754 6.25000000000000e+01 1754 1755 -4.16666666666667e+00 1754 1753 -8.33333333333333e+00 1754 1690 4.16666666666667e+00 1754 1756 8.33333333333333e+00 1754 1691 -1.87500000000000e+01 1754 1689 4.16666666666667e+00 1754 1757 -1.25000000000000e+01 1754 1681 2.08333333333333e+00 1754 1333 -2.08333333333333e+00 1754 1680 -4.16666666666667e+00 1754 1764 4.16666666666667e+00 1754 1499 -1.87500000000000e+01 1754 1334 -6.25000000000000e+00 1754 1498 4.16666666666667e+00 1754 1765 -8.33333333333333e+00 1754 1752 -8.33333333333333e+00 1754 1497 4.16666666666667e+00 1754 1332 4.16666666666667e+00 1754 46 -2.08333333333333e+00 1754 391 4.16666666666667e+00 1754 235 2.08333333333333e+00 1754 400 -4.16666666666667e+00 1754 399 -4.16666666666667e+00 1754 47 -6.25000000000000e+00 1754 45 4.16666666666667e+00 1754 234 -4.16666666666667e+00 1754 390 4.16666666666667e+00 1755 1755 1.25000000000000e+02 1755 1798 4.16666666666667e+00 1755 1766 8.33333333333333e+00 1755 1765 -4.16666666666667e+00 1755 1764 -1.25000000000000e+01 1755 1691 4.16666666666667e+00 1755 1754 -4.16666666666667e+00 1755 1690 4.16666666666667e+00 1755 1757 -1.66666666666667e+01 1755 1753 8.33333333333333e+00 1755 1752 -1.25000000000000e+01 1755 1756 -1.66666666666667e+01 1755 1693 -4.16666666666667e+00 1755 1694 8.33333333333333e+00 1755 1685 -8.33333333333333e+00 1755 1751 8.33333333333333e+00 1755 1681 -4.16666666666667e+00 1755 1684 4.16666666666667e+00 1755 1787 -4.16666666666667e+00 1755 1786 8.33333333333333e+00 1755 1692 -1.25000000000000e+01 1755 1785 -1.25000000000000e+01 1755 1682 -4.16666666666667e+00 1755 1334 4.16666666666667e+00 1755 1750 8.33333333333333e+00 1755 1333 -8.33333333333333e+00 1755 1799 4.16666666666667e+00 1755 1749 -3.75000000000000e+01 1755 433 -4.16666666666667e+00 1755 401 -8.33333333333333e+00 1755 400 4.16666666666667e+00 1755 434 -4.16666666666667e+00 1755 392 8.33333333333333e+00 1755 391 8.33333333333333e+00 1755 390 -3.75000000000000e+01 1755 53 4.16666666666667e+00 1755 52 -8.33333333333333e+00 1756 1756 1.25000000000000e+02 1756 1797 4.16666666666667e+00 1756 1764 -4.16666666666667e+00 1756 1766 8.33333333333333e+00 1756 1765 -1.25000000000000e+01 1756 1754 8.33333333333333e+00 1756 1691 -8.33333333333333e+00 1756 1689 4.16666666666667e+00 1756 1334 4.16666666666667e+00 1756 1753 -3.75000000000000e+01 1756 1752 8.33333333333333e+00 1756 1751 -4.16666666666667e+00 1756 1755 -1.66666666666667e+01 1756 1692 -4.16666666666667e+00 1756 1685 4.16666666666667e+00 1756 1682 -4.16666666666667e+00 1756 1680 -4.16666666666667e+00 1756 1683 4.16666666666667e+00 1756 1694 8.33333333333333e+00 1756 1787 8.33333333333333e+00 1756 1757 -1.66666666666667e+01 1756 1693 -1.25000000000000e+01 1756 1786 -3.75000000000000e+01 1756 1785 8.33333333333333e+00 1756 1799 -8.33333333333333e+00 1756 1750 -1.25000000000000e+01 1756 1749 8.33333333333333e+00 1756 1332 -8.33333333333333e+00 1756 432 -4.16666666666667e+00 1756 434 -4.16666666666667e+00 1756 401 4.16666666666667e+00 1756 399 4.16666666666667e+00 1756 392 -4.16666666666667e+00 1756 53 4.16666666666667e+00 1756 391 -1.25000000000000e+01 1756 390 8.33333333333333e+00 1756 51 -8.33333333333333e+00 1757 1757 1.25000000000000e+02 1757 1798 -8.33333333333333e+00 1757 1764 8.33333333333333e+00 1757 1766 -3.75000000000000e+01 1757 1765 8.33333333333333e+00 1757 1689 4.16666666666667e+00 1757 1752 -4.16666666666667e+00 1757 1753 8.33333333333333e+00 1757 1690 -8.33333333333333e+00 1757 1755 -1.66666666666667e+01 1757 1754 -1.25000000000000e+01 1757 1333 4.16666666666667e+00 1757 1750 -4.16666666666667e+00 1757 1684 4.16666666666667e+00 1757 1681 -4.16666666666667e+00 1757 1692 8.33333333333333e+00 1757 1683 -8.33333333333333e+00 1757 1749 8.33333333333333e+00 1757 1694 -3.75000000000000e+01 1757 1787 -1.25000000000000e+01 1757 1693 8.33333333333333e+00 1757 1786 8.33333333333333e+00 1757 1756 -1.66666666666667e+01 1757 1785 -4.16666666666667e+00 1757 1797 4.16666666666667e+00 1757 1751 -1.25000000000000e+01 1757 1680 -4.16666666666667e+00 1757 1332 4.16666666666667e+00 1757 433 -4.16666666666667e+00 1757 400 4.16666666666667e+00 1757 399 -8.33333333333333e+00 1757 432 -4.16666666666667e+00 1757 392 -1.25000000000000e+01 1757 391 -4.16666666666667e+00 1757 52 4.16666666666667e+00 1757 390 8.33333333333333e+00 1757 51 4.16666666666667e+00 1758 1758 6.25000000000000e+01 1758 1759 -8.33333333333333e+00 1758 1733 -4.16666666666667e+00 1758 1333 -2.08333333333333e+00 1758 1732 2.08333333333333e+00 1758 1742 4.16666666666667e+00 1758 1369 -2.08333333333333e+00 1758 1740 -1.87500000000000e+01 1758 1858 4.16666666666667e+00 1758 1763 -4.16666666666667e+00 1758 1762 8.33333333333333e+00 1758 1761 -1.25000000000000e+01 1758 1859 4.16666666666667e+00 1758 1766 4.16666666666667e+00 1758 1862 -4.16666666666667e+00 1758 1501 2.08333333333333e+00 1758 1861 -4.16666666666667e+00 1758 1370 4.16666666666667e+00 1758 1502 -4.16666666666667e+00 1758 1368 -6.25000000000000e+00 1758 1760 -8.33333333333333e+00 1758 1499 4.16666666666667e+00 1758 1334 4.16666666666667e+00 1758 1498 4.16666666666667e+00 1758 1765 -8.33333333333333e+00 1758 1741 4.16666666666667e+00 1758 1497 -1.87500000000000e+01 1758 1332 -6.25000000000000e+00 1759 1759 6.25000000000000e+01 1759 1733 2.08333333333333e+00 1759 1740 4.16666666666667e+00 1759 1758 -8.33333333333333e+00 1759 1332 -2.08333333333333e+00 1759 1731 2.08333333333333e+00 1759 1741 -6.25000000000000e+00 1759 1368 -2.08333333333333e+00 1759 1857 4.16666666666667e+00 1759 1334 4.16666666666667e+00 1759 1760 -8.33333333333333e+00 1759 1763 8.33333333333333e+00 1759 1762 -3.75000000000000e+01 1759 1761 8.33333333333333e+00 1759 1370 4.16666666666667e+00 1759 1859 -8.33333333333333e+00 1759 1500 2.08333333333333e+00 1759 1860 -4.16666666666667e+00 1759 1502 2.08333333333333e+00 1759 1862 -4.16666666666667e+00 1759 1369 -6.25000000000000e+00 1759 1499 -2.08333333333333e+00 1759 1766 4.16666666666667e+00 1759 1742 -2.08333333333333e+00 1759 1498 -6.25000000000000e+00 1759 1333 -6.25000000000000e+00 1759 1497 4.16666666666667e+00 1759 1764 -8.33333333333333e+00 1760 1760 6.25000000000000e+01 1760 1732 2.08333333333333e+00 1760 1731 -4.16666666666667e+00 1760 1742 -6.25000000000000e+00 1760 1740 4.16666666666667e+00 1760 1763 -1.25000000000000e+01 1760 1333 4.16666666666667e+00 1760 1759 -8.33333333333333e+00 1760 1762 8.33333333333333e+00 1760 1761 -4.16666666666667e+00 1760 1369 4.16666666666667e+00 1760 1858 -8.33333333333333e+00 1760 1857 4.16666666666667e+00 1760 1764 4.16666666666667e+00 1760 1860 -4.16666666666667e+00 1760 1370 -1.87500000000000e+01 1760 1501 2.08333333333333e+00 1760 1861 -4.16666666666667e+00 1760 1368 4.16666666666667e+00 1760 1500 -4.16666666666667e+00 1760 1741 -2.08333333333333e+00 1760 1499 -6.25000000000000e+00 1760 1334 -1.87500000000000e+01 1760 1498 -2.08333333333333e+00 1760 1765 4.16666666666667e+00 1760 1758 -8.33333333333333e+00 1760 1497 4.16666666666667e+00 1760 1332 4.16666666666667e+00 1761 1761 1.25000000000000e+02 1761 1739 -8.33333333333333e+00 1761 1742 4.16666666666667e+00 1761 1733 -4.16666666666667e+00 1761 1741 -8.33333333333333e+00 1761 1747 8.33333333333333e+00 1761 1732 -4.16666666666667e+00 1761 1748 8.33333333333333e+00 1761 1746 -3.75000000000000e+01 1761 1861 4.16666666666667e+00 1761 1858 -4.16666666666667e+00 1761 1862 -8.33333333333333e+00 1761 1859 8.33333333333333e+00 1761 1334 4.16666666666667e+00 1761 1760 -4.16666666666667e+00 1761 1759 8.33333333333333e+00 1761 1762 -1.66666666666667e+01 1761 1758 -1.25000000000000e+01 1761 1376 4.16666666666667e+00 1761 1857 -1.25000000000000e+01 1761 1796 -4.16666666666667e+00 1761 1799 4.16666666666667e+00 1761 1871 -4.16666666666667e+00 1761 1765 8.33333333333333e+00 1761 1798 -8.33333333333333e+00 1761 1795 8.33333333333333e+00 1761 1766 8.33333333333333e+00 1761 1751 8.33333333333333e+00 1761 1763 -1.66666666666667e+01 1761 1333 4.16666666666667e+00 1761 1750 -4.16666666666667e+00 1761 1764 -3.75000000000000e+01 1761 1749 -1.25000000000000e+01 1761 1870 -4.16666666666667e+00 1761 1375 4.16666666666667e+00 1761 1738 4.16666666666667e+00 1761 1794 -1.25000000000000e+01 1762 1762 1.25000000000000e+02 1762 1739 4.16666666666667e+00 1762 1733 -4.16666666666667e+00 1762 1742 4.16666666666667e+00 1762 1748 -4.16666666666667e+00 1762 1740 -8.33333333333333e+00 1762 1746 8.33333333333333e+00 1762 1731 -4.16666666666667e+00 1762 1747 -1.25000000000000e+01 1762 1860 4.16666666666667e+00 1762 1857 -4.16666666666667e+00 1762 1862 4.16666666666667e+00 1762 1760 8.33333333333333e+00 1762 1759 -3.75000000000000e+01 1762 1758 8.33333333333333e+00 1762 1761 -1.66666666666667e+01 1762 1859 8.33333333333333e+00 1762 1858 -1.25000000000000e+01 1762 1763 -1.66666666666667e+01 1762 1766 -4.16666666666667e+00 1762 1764 8.33333333333333e+00 1762 1799 4.16666666666667e+00 1762 1871 -4.16666666666667e+00 1762 1797 -8.33333333333333e+00 1762 1794 8.33333333333333e+00 1762 1334 -8.33333333333333e+00 1762 1751 8.33333333333333e+00 1762 1765 -1.25000000000000e+01 1762 1750 -1.25000000000000e+01 1762 1332 4.16666666666667e+00 1762 1749 -4.16666666666667e+00 1762 1796 8.33333333333333e+00 1762 1376 -8.33333333333333e+00 1762 1737 4.16666666666667e+00 1762 1795 -3.75000000000000e+01 1762 1869 -4.16666666666667e+00 1762 1374 4.16666666666667e+00 1763 1763 1.25000000000000e+02 1763 1737 -8.33333333333333e+00 1763 1732 -4.16666666666667e+00 1763 1740 4.16666666666667e+00 1763 1731 -4.16666666666667e+00 1763 1741 4.16666666666667e+00 1763 1747 -4.16666666666667e+00 1763 1748 -1.25000000000000e+01 1763 1746 8.33333333333333e+00 1763 1861 4.16666666666667e+00 1763 1860 -8.33333333333333e+00 1763 1857 8.33333333333333e+00 1763 1760 -1.25000000000000e+01 1763 1759 8.33333333333333e+00 1763 1332 4.16666666666667e+00 1763 1758 -4.16666666666667e+00 1763 1859 -3.75000000000000e+01 1763 1858 8.33333333333333e+00 1763 1374 4.16666666666667e+00 1763 1762 -1.66666666666667e+01 1763 1794 -4.16666666666667e+00 1763 1765 -4.16666666666667e+00 1763 1797 4.16666666666667e+00 1763 1869 -4.16666666666667e+00 1763 1798 4.16666666666667e+00 1763 1870 -4.16666666666667e+00 1763 1766 -1.25000000000000e+01 1763 1751 -3.75000000000000e+01 1763 1333 -8.33333333333333e+00 1763 1750 8.33333333333333e+00 1763 1764 8.33333333333333e+00 1763 1749 8.33333333333333e+00 1763 1761 -1.66666666666667e+01 1763 1738 4.16666666666667e+00 1763 1796 -1.25000000000000e+01 1763 1795 8.33333333333333e+00 1763 1375 -8.33333333333333e+00 1764 1764 1.25000000000000e+02 1764 1756 -4.16666666666667e+00 1764 1755 -1.25000000000000e+01 1764 1754 4.16666666666667e+00 1764 1753 4.16666666666667e+00 1764 1766 -1.66666666666667e+01 1764 1334 -4.16666666666667e+00 1764 1799 -4.16666666666667e+00 1764 1871 4.16666666666667e+00 1764 1798 8.33333333333333e+00 1764 1765 -1.66666666666667e+01 1764 1762 8.33333333333333e+00 1764 1751 -8.33333333333333e+00 1764 1763 8.33333333333333e+00 1764 1333 -4.16666666666667e+00 1764 1750 4.16666666666667e+00 1764 1761 -3.75000000000000e+01 1764 1870 4.16666666666667e+00 1764 1797 -1.25000000000000e+01 1764 1499 -4.16666666666667e+00 1764 1760 4.16666666666667e+00 1764 1861 -4.16666666666667e+00 1764 1759 -8.33333333333333e+00 1764 1498 8.33333333333333e+00 1764 1497 -1.25000000000000e+01 1764 1862 8.33333333333333e+00 1764 1860 -1.25000000000000e+01 1764 1757 8.33333333333333e+00 1764 434 4.16666666666667e+00 1764 433 -8.33333333333333e+00 1764 400 8.33333333333333e+00 1764 401 8.33333333333333e+00 1764 399 -3.75000000000000e+01 1764 113 -4.16666666666667e+00 1764 112 -4.16666666666667e+00 1764 241 4.16666666666667e+00 1764 242 -8.33333333333333e+00 1765 1765 1.25000000000000e+02 1765 1755 -4.16666666666667e+00 1765 1757 8.33333333333333e+00 1765 1756 -1.25000000000000e+01 1765 1754 -8.33333333333333e+00 1765 1752 4.16666666666667e+00 1765 1751 4.16666666666667e+00 1765 1763 -4.16666666666667e+00 1765 1797 8.33333333333333e+00 1765 1764 -1.66666666666667e+01 1765 1761 8.33333333333333e+00 1765 1762 -1.25000000000000e+01 1765 1332 -4.16666666666667e+00 1765 1749 4.16666666666667e+00 1765 1799 8.33333333333333e+00 1765 1871 -8.33333333333333e+00 1765 1798 -3.75000000000000e+01 1765 1869 4.16666666666667e+00 1765 1499 8.33333333333333e+00 1765 1766 -1.66666666666667e+01 1765 1862 8.33333333333333e+00 1765 1860 -4.16666666666667e+00 1765 1760 4.16666666666667e+00 1765 1334 -4.16666666666667e+00 1765 1498 -3.75000000000000e+01 1765 1758 -8.33333333333333e+00 1765 1497 8.33333333333333e+00 1765 1861 -1.25000000000000e+01 1765 432 -8.33333333333333e+00 1765 401 -4.16666666666667e+00 1765 399 8.33333333333333e+00 1765 400 -1.25000000000000e+01 1765 111 -4.16666666666667e+00 1765 240 4.16666666666667e+00 1765 242 4.16666666666667e+00 1765 113 -4.16666666666667e+00 1765 434 4.16666666666667e+00 1766 1766 1.25000000000000e+02 1766 1755 8.33333333333333e+00 1766 1757 -3.75000000000000e+01 1766 1756 8.33333333333333e+00 1766 1752 4.16666666666667e+00 1766 1753 -8.33333333333333e+00 1766 1764 -1.66666666666667e+01 1766 1332 -4.16666666666667e+00 1766 1750 4.16666666666667e+00 1766 1762 -4.16666666666667e+00 1766 1797 -4.16666666666667e+00 1766 1869 4.16666666666667e+00 1766 1763 -1.25000000000000e+01 1766 1749 -8.33333333333333e+00 1766 1761 8.33333333333333e+00 1766 1799 -1.25000000000000e+01 1766 1798 8.33333333333333e+00 1766 1870 -8.33333333333333e+00 1766 1497 -4.16666666666667e+00 1766 1758 4.16666666666667e+00 1766 1498 8.33333333333333e+00 1766 1765 -1.66666666666667e+01 1766 1861 8.33333333333333e+00 1766 1499 -1.25000000000000e+01 1766 1759 4.16666666666667e+00 1766 1333 -4.16666666666667e+00 1766 1862 -3.75000000000000e+01 1766 1860 8.33333333333333e+00 1766 432 4.16666666666667e+00 1766 400 -4.16666666666667e+00 1766 401 -1.25000000000000e+01 1766 399 8.33333333333333e+00 1766 111 -4.16666666666667e+00 1766 433 4.16666666666667e+00 1766 241 4.16666666666667e+00 1766 112 -4.16666666666667e+00 1766 240 -8.33333333333333e+00 1767 1767 1.25000000000000e+02 1767 1775 -4.16666666666667e+00 1767 1789 -8.33333333333333e+00 1767 1774 8.33333333333333e+00 1767 1773 -1.25000000000000e+01 1767 1700 -8.33333333333333e+00 1767 1699 4.16666666666667e+00 1767 1703 8.33333333333333e+00 1767 1702 -4.16666666666667e+00 1767 1701 -1.25000000000000e+01 1767 1802 -4.16666666666667e+00 1767 1784 4.16666666666667e+00 1767 1337 8.33333333333333e+00 1767 1769 -1.66666666666667e+01 1767 1781 8.33333333333333e+00 1767 1783 4.16666666666667e+00 1767 1780 -4.16666666666667e+00 1767 1779 -1.25000000000000e+01 1767 1340 8.33333333333333e+00 1767 1796 -8.33333333333333e+00 1767 1801 -4.16666666666667e+00 1767 1795 4.16666666666667e+00 1767 1423 -4.16666666666667e+00 1767 1426 4.16666666666667e+00 1767 1736 4.16666666666667e+00 1767 1424 -4.16666666666667e+00 1767 1336 8.33333333333333e+00 1767 1735 -8.33333333333333e+00 1767 1335 -3.75000000000000e+01 1767 1739 -4.16666666666667e+00 1767 1427 4.16666666666667e+00 1767 1768 -1.66666666666667e+01 1767 1738 8.33333333333333e+00 1767 1339 8.33333333333333e+00 1767 1790 4.16666666666667e+00 1767 1737 -1.25000000000000e+01 1767 1338 -3.75000000000000e+01 1768 1768 1.25000000000000e+02 1768 1790 4.16666666666667e+00 1768 1788 -8.33333333333333e+00 1768 1774 -3.75000000000000e+01 1768 1773 8.33333333333333e+00 1768 1700 4.16666666666667e+00 1768 1698 4.16666666666667e+00 1768 1703 8.33333333333333e+00 1768 1702 -1.25000000000000e+01 1768 1701 -4.16666666666667e+00 1768 1769 -1.66666666666667e+01 1768 1340 -4.16666666666667e+00 1768 1337 -4.16666666666667e+00 1768 1796 4.16666666666667e+00 1768 1802 -4.16666666666667e+00 1768 1784 -8.33333333333333e+00 1768 1781 8.33333333333333e+00 1768 1780 -1.25000000000000e+01 1768 1782 4.16666666666667e+00 1768 1779 -4.16666666666667e+00 1768 1800 -4.16666666666667e+00 1768 1794 4.16666666666667e+00 1768 1736 4.16666666666667e+00 1768 1424 -4.16666666666667e+00 1768 1422 -4.16666666666667e+00 1768 1425 4.16666666666667e+00 1768 1336 -1.25000000000000e+01 1768 1335 8.33333333333333e+00 1768 1734 -8.33333333333333e+00 1768 1739 8.33333333333333e+00 1768 1427 -8.33333333333333e+00 1768 1775 8.33333333333333e+00 1768 1738 -3.75000000000000e+01 1768 1339 -1.25000000000000e+01 1768 1767 -1.66666666666667e+01 1768 1737 8.33333333333333e+00 1768 1338 8.33333333333333e+00 1769 1769 1.25000000000000e+02 1769 1773 -4.16666666666667e+00 1769 1774 8.33333333333333e+00 1769 1789 4.16666666666667e+00 1769 1775 -1.25000000000000e+01 1769 1699 4.16666666666667e+00 1769 1698 -8.33333333333333e+00 1769 1703 -3.75000000000000e+01 1769 1702 8.33333333333333e+00 1769 1701 8.33333333333333e+00 1769 1768 -1.66666666666667e+01 1769 1339 -4.16666666666667e+00 1769 1336 -4.16666666666667e+00 1769 1795 4.16666666666667e+00 1769 1801 -4.16666666666667e+00 1769 1800 -4.16666666666667e+00 1769 1782 4.16666666666667e+00 1769 1781 -3.75000000000000e+01 1769 1783 -8.33333333333333e+00 1769 1780 8.33333333333333e+00 1769 1335 8.33333333333333e+00 1769 1767 -1.66666666666667e+01 1769 1779 8.33333333333333e+00 1769 1338 8.33333333333333e+00 1769 1794 -8.33333333333333e+00 1769 1735 4.16666666666667e+00 1769 1423 -4.16666666666667e+00 1769 1337 -1.25000000000000e+01 1769 1734 4.16666666666667e+00 1769 1422 -4.16666666666667e+00 1769 1788 4.16666666666667e+00 1769 1739 -1.25000000000000e+01 1769 1340 -1.25000000000000e+01 1769 1738 8.33333333333333e+00 1769 1426 -8.33333333333333e+00 1769 1737 -4.16666666666667e+00 1769 1425 4.16666666666667e+00 1770 1770 1.25000000000000e+02 1770 1829 4.16666666666667e+00 1770 1828 -8.33333333333333e+00 1770 1774 8.33333333333333e+00 1770 1773 -3.75000000000000e+01 1770 1832 -4.16666666666667e+00 1770 1831 -4.16666666666667e+00 1770 1784 -8.33333333333333e+00 1770 1783 4.16666666666667e+00 1770 1700 4.16666666666667e+00 1770 1709 8.33333333333333e+00 1770 1708 -4.16666666666667e+00 1770 1707 -1.25000000000000e+01 1770 1699 4.16666666666667e+00 1770 1603 4.16666666666667e+00 1770 1594 -4.16666666666667e+00 1770 1595 -4.16666666666667e+00 1770 1604 -8.33333333333333e+00 1770 1667 8.33333333333333e+00 1770 1772 -1.66666666666667e+01 1770 1520 8.33333333333333e+00 1770 1525 4.16666666666667e+00 1770 1519 -4.16666666666667e+00 1770 1337 -4.16666666666667e+00 1770 1661 4.16666666666667e+00 1770 1336 8.33333333333333e+00 1770 1660 -8.33333333333333e+00 1770 1335 -1.25000000000000e+01 1770 1518 -1.25000000000000e+01 1770 1355 -4.16666666666667e+00 1770 1526 4.16666666666667e+00 1770 1771 -1.66666666666667e+01 1770 1354 8.33333333333333e+00 1770 1666 8.33333333333333e+00 1770 1775 8.33333333333333e+00 1770 1353 -1.25000000000000e+01 1770 1665 -3.75000000000000e+01 1771 1771 1.25000000000000e+02 1771 1775 -4.16666666666667e+00 1771 1827 -8.33333333333333e+00 1771 1774 -1.25000000000000e+01 1771 1773 8.33333333333333e+00 1771 1832 -4.16666666666667e+00 1771 1784 4.16666666666667e+00 1771 1830 -4.16666666666667e+00 1771 1782 4.16666666666667e+00 1771 1709 8.33333333333333e+00 1771 1708 -1.25000000000000e+01 1771 1707 -4.16666666666667e+00 1771 1700 -8.33333333333333e+00 1771 1698 4.16666666666667e+00 1771 1602 4.16666666666667e+00 1771 1593 -4.16666666666667e+00 1771 1604 4.16666666666667e+00 1771 1595 -4.16666666666667e+00 1771 1667 -4.16666666666667e+00 1771 1661 4.16666666666667e+00 1771 1524 4.16666666666667e+00 1771 1518 -4.16666666666667e+00 1771 1337 8.33333333333333e+00 1771 1772 -1.66666666666667e+01 1771 1520 8.33333333333333e+00 1771 1336 -3.75000000000000e+01 1771 1519 -1.25000000000000e+01 1771 1335 8.33333333333333e+00 1771 1659 -8.33333333333333e+00 1771 1355 8.33333333333333e+00 1771 1526 -8.33333333333333e+00 1771 1829 4.16666666666667e+00 1771 1354 -3.75000000000000e+01 1771 1666 -1.25000000000000e+01 1771 1770 -1.66666666666667e+01 1771 1353 8.33333333333333e+00 1771 1665 8.33333333333333e+00 1772 1772 1.25000000000000e+02 1772 1774 -4.16666666666667e+00 1772 1773 8.33333333333333e+00 1772 1827 4.16666666666667e+00 1772 1775 -1.25000000000000e+01 1772 1830 -4.16666666666667e+00 1772 1831 -4.16666666666667e+00 1772 1783 4.16666666666667e+00 1772 1782 -8.33333333333333e+00 1772 1698 4.16666666666667e+00 1772 1709 -3.75000000000000e+01 1772 1708 8.33333333333333e+00 1772 1707 8.33333333333333e+00 1772 1699 -8.33333333333333e+00 1772 1593 -4.16666666666667e+00 1772 1603 4.16666666666667e+00 1772 1602 -8.33333333333333e+00 1772 1594 -4.16666666666667e+00 1772 1666 -4.16666666666667e+00 1772 1660 4.16666666666667e+00 1772 1665 8.33333333333333e+00 1772 1770 -1.66666666666667e+01 1772 1518 8.33333333333333e+00 1772 1337 -1.25000000000000e+01 1772 1520 -3.75000000000000e+01 1772 1336 8.33333333333333e+00 1772 1771 -1.66666666666667e+01 1772 1519 8.33333333333333e+00 1772 1335 -4.16666666666667e+00 1772 1659 4.16666666666667e+00 1772 1828 4.16666666666667e+00 1772 1355 -1.25000000000000e+01 1772 1667 -1.25000000000000e+01 1772 1354 8.33333333333333e+00 1772 1525 -8.33333333333333e+00 1772 1353 -4.16666666666667e+00 1772 1524 4.16666666666667e+00 1773 1773 1.25000000000000e+02 1773 1801 4.16666666666667e+00 1773 1837 -4.16666666666667e+00 1773 1832 4.16666666666667e+00 1773 1838 -4.16666666666667e+00 1773 1831 4.16666666666667e+00 1773 1783 -4.16666666666667e+00 1773 1784 8.33333333333333e+00 1773 1782 -1.25000000000000e+01 1773 1709 -8.33333333333333e+00 1773 1772 8.33333333333333e+00 1773 1708 4.16666666666667e+00 1773 1358 4.16666666666667e+00 1773 1829 -4.16666666666667e+00 1773 1828 8.33333333333333e+00 1773 1827 -1.25000000000000e+01 1773 1337 4.16666666666667e+00 1773 1771 8.33333333333333e+00 1773 1770 -3.75000000000000e+01 1773 1769 -4.16666666666667e+00 1773 1774 -1.66666666666667e+01 1773 1711 -4.16666666666667e+00 1773 1703 4.16666666666667e+00 1773 1700 -4.16666666666667e+00 1773 1702 4.16666666666667e+00 1773 1699 -4.16666666666667e+00 1773 1712 8.33333333333333e+00 1773 1790 8.33333333333333e+00 1773 1775 -1.66666666666667e+01 1773 1357 -8.33333333333333e+00 1773 1789 8.33333333333333e+00 1773 1710 -1.25000000000000e+01 1773 1788 -3.75000000000000e+01 1773 1768 8.33333333333333e+00 1773 1336 -8.33333333333333e+00 1773 1802 -8.33333333333333e+00 1773 1767 -1.25000000000000e+01 1774 1774 1.25000000000000e+02 1774 1800 4.16666666666667e+00 1774 1836 -4.16666666666667e+00 1774 1832 -8.33333333333333e+00 1774 1784 8.33333333333333e+00 1774 1830 4.16666666666667e+00 1774 1782 -4.16666666666667e+00 1774 1838 -4.16666666666667e+00 1774 1783 -1.25000000000000e+01 1774 1709 4.16666666666667e+00 1774 1772 -4.16666666666667e+00 1774 1707 4.16666666666667e+00 1774 1829 8.33333333333333e+00 1774 1775 -1.66666666666667e+01 1774 1828 -3.75000000000000e+01 1774 1827 8.33333333333333e+00 1774 1771 -1.25000000000000e+01 1774 1770 8.33333333333333e+00 1774 1773 -1.66666666666667e+01 1774 1710 -4.16666666666667e+00 1774 1712 8.33333333333333e+00 1774 1703 -8.33333333333333e+00 1774 1769 8.33333333333333e+00 1774 1701 4.16666666666667e+00 1774 1698 -4.16666666666667e+00 1774 1358 4.16666666666667e+00 1774 1790 -4.16666666666667e+00 1774 1711 -1.25000000000000e+01 1774 1789 -1.25000000000000e+01 1774 1356 -8.33333333333333e+00 1774 1788 8.33333333333333e+00 1774 1700 -4.16666666666667e+00 1774 1337 4.16666666666667e+00 1774 1802 4.16666666666667e+00 1774 1768 -3.75000000000000e+01 1774 1767 8.33333333333333e+00 1774 1335 -8.33333333333333e+00 1775 1775 1.25000000000000e+02 1775 1800 -8.33333333333333e+00 1775 1830 4.16666666666667e+00 1775 1836 -4.16666666666667e+00 1775 1831 -8.33333333333333e+00 1775 1783 8.33333333333333e+00 1775 1837 -4.16666666666667e+00 1775 1784 -3.75000000000000e+01 1775 1782 8.33333333333333e+00 1775 1708 4.16666666666667e+00 1775 1771 -4.16666666666667e+00 1775 1707 -8.33333333333333e+00 1775 1770 8.33333333333333e+00 1775 1829 -1.25000000000000e+01 1775 1828 8.33333333333333e+00 1775 1774 -1.66666666666667e+01 1775 1356 4.16666666666667e+00 1775 1827 -4.16666666666667e+00 1775 1772 -1.25000000000000e+01 1775 1335 4.16666666666667e+00 1775 1767 -4.16666666666667e+00 1775 1711 8.33333333333333e+00 1775 1701 4.16666666666667e+00 1775 1698 -4.16666666666667e+00 1775 1702 -8.33333333333333e+00 1775 1768 8.33333333333333e+00 1775 1712 -3.75000000000000e+01 1775 1790 -1.25000000000000e+01 1775 1357 4.16666666666667e+00 1775 1789 -4.16666666666667e+00 1775 1710 8.33333333333333e+00 1775 1788 8.33333333333333e+00 1775 1773 -1.66666666666667e+01 1775 1801 4.16666666666667e+00 1775 1769 -1.25000000000000e+01 1775 1699 -4.16666666666667e+00 1775 1336 4.16666666666667e+00 1776 1776 1.25000000000000e+02 1776 1865 -8.33333333333333e+00 1776 1781 8.33333333333333e+00 1776 1780 8.33333333333333e+00 1776 1779 -3.75000000000000e+01 1776 1867 -4.16666666666667e+00 1776 1868 -4.16666666666667e+00 1776 1784 4.16666666666667e+00 1776 1783 -8.33333333333333e+00 1776 1735 4.16666666666667e+00 1776 1630 -4.16666666666667e+00 1776 1745 -4.16666666666667e+00 1776 1640 4.16666666666667e+00 1776 1744 8.33333333333333e+00 1776 1639 -8.33333333333333e+00 1776 1743 -1.25000000000000e+01 1776 1736 4.16666666666667e+00 1776 1631 -4.16666666666667e+00 1776 1532 4.16666666666667e+00 1776 1520 -4.16666666666667e+00 1776 1777 -1.66666666666667e+01 1776 1519 8.33333333333333e+00 1776 1672 8.33333333333333e+00 1776 1337 8.33333333333333e+00 1776 1661 -8.33333333333333e+00 1776 1336 -4.16666666666667e+00 1776 1660 4.16666666666667e+00 1776 1335 -1.25000000000000e+01 1776 1518 -1.25000000000000e+01 1776 1778 -1.66666666666667e+01 1776 1373 8.33333333333333e+00 1776 1673 8.33333333333333e+00 1776 1372 -4.16666666666667e+00 1776 1531 4.16666666666667e+00 1776 1864 4.16666666666667e+00 1776 1371 -1.25000000000000e+01 1776 1671 -3.75000000000000e+01 1777 1777 1.25000000000000e+02 1777 1865 4.16666666666667e+00 1777 1781 -4.16666666666667e+00 1777 1780 -1.25000000000000e+01 1777 1779 8.33333333333333e+00 1777 1784 4.16666666666667e+00 1777 1868 -4.16666666666667e+00 1777 1866 -4.16666666666667e+00 1777 1782 -8.33333333333333e+00 1777 1734 4.16666666666667e+00 1777 1629 -4.16666666666667e+00 1777 1640 4.16666666666667e+00 1777 1631 -4.16666666666667e+00 1777 1745 8.33333333333333e+00 1777 1744 -3.75000000000000e+01 1777 1743 8.33333333333333e+00 1777 1638 -8.33333333333333e+00 1777 1736 -8.33333333333333e+00 1777 1661 4.16666666666667e+00 1777 1673 -4.16666666666667e+00 1777 1776 -1.66666666666667e+01 1777 1518 8.33333333333333e+00 1777 1671 8.33333333333333e+00 1777 1337 8.33333333333333e+00 1777 1778 -1.66666666666667e+01 1777 1520 8.33333333333333e+00 1777 1336 -1.25000000000000e+01 1777 1519 -3.75000000000000e+01 1777 1335 -4.16666666666667e+00 1777 1659 4.16666666666667e+00 1777 1373 8.33333333333333e+00 1777 1532 -8.33333333333333e+00 1777 1863 4.16666666666667e+00 1777 1372 -1.25000000000000e+01 1777 1672 -1.25000000000000e+01 1777 1371 -4.16666666666667e+00 1777 1530 4.16666666666667e+00 1778 1778 1.25000000000000e+02 1778 1863 -8.33333333333333e+00 1778 1781 -1.25000000000000e+01 1778 1780 -4.16666666666667e+00 1778 1779 8.33333333333333e+00 1778 1783 4.16666666666667e+00 1778 1867 -4.16666666666667e+00 1778 1866 -4.16666666666667e+00 1778 1782 4.16666666666667e+00 1778 1639 4.16666666666667e+00 1778 1630 -4.16666666666667e+00 1778 1745 -1.25000000000000e+01 1778 1744 8.33333333333333e+00 1778 1743 -4.16666666666667e+00 1778 1638 4.16666666666667e+00 1778 1735 -8.33333333333333e+00 1778 1734 4.16666666666667e+00 1778 1629 -4.16666666666667e+00 1778 1530 4.16666666666667e+00 1778 1518 -4.16666666666667e+00 1778 1660 4.16666666666667e+00 1778 1672 -4.16666666666667e+00 1778 1337 -3.75000000000000e+01 1778 1520 -1.25000000000000e+01 1778 1336 8.33333333333333e+00 1778 1777 -1.66666666666667e+01 1778 1519 8.33333333333333e+00 1778 1335 8.33333333333333e+00 1778 1659 -8.33333333333333e+00 1778 1864 4.16666666666667e+00 1778 1373 -3.75000000000000e+01 1778 1673 -1.25000000000000e+01 1778 1372 8.33333333333333e+00 1778 1531 -8.33333333333333e+00 1778 1776 -1.66666666666667e+01 1778 1371 8.33333333333333e+00 1778 1671 8.33333333333333e+00 1779 1779 1.25000000000000e+02 1779 1739 4.16666666666667e+00 1779 1736 -4.16666666666667e+00 1779 1748 -4.16666666666667e+00 1779 1745 4.16666666666667e+00 1779 1747 8.33333333333333e+00 1779 1744 -8.33333333333333e+00 1779 1735 -4.16666666666667e+00 1779 1746 -1.25000000000000e+01 1779 1867 4.16666666666667e+00 1779 1864 -4.16666666666667e+00 1779 1868 4.16666666666667e+00 1779 1778 8.33333333333333e+00 1779 1777 8.33333333333333e+00 1779 1780 -1.66666666666667e+01 1779 1776 -3.75000000000000e+01 1779 1865 8.33333333333333e+00 1779 1863 -1.25000000000000e+01 1779 1781 -1.66666666666667e+01 1779 1784 -4.16666666666667e+00 1779 1783 8.33333333333333e+00 1779 1874 -4.16666666666667e+00 1779 1802 4.16666666666667e+00 1779 1801 -8.33333333333333e+00 1779 1795 8.33333333333333e+00 1779 1337 -8.33333333333333e+00 1779 1769 8.33333333333333e+00 1779 1336 4.16666666666667e+00 1779 1768 -4.16666666666667e+00 1779 1782 -1.25000000000000e+01 1779 1767 -1.25000000000000e+01 1779 1796 8.33333333333333e+00 1779 1376 -8.33333333333333e+00 1779 1873 -4.16666666666667e+00 1779 1375 4.16666666666667e+00 1779 1738 4.16666666666667e+00 1779 1794 -3.75000000000000e+01 1780 1780 1.25000000000000e+02 1780 1739 -8.33333333333333e+00 1780 1736 -4.16666666666667e+00 1780 1745 4.16666666666667e+00 1780 1746 8.33333333333333e+00 1780 1743 -8.33333333333333e+00 1780 1734 -4.16666666666667e+00 1780 1748 8.33333333333333e+00 1780 1747 -3.75000000000000e+01 1780 1866 4.16666666666667e+00 1780 1863 -4.16666666666667e+00 1780 1865 8.33333333333333e+00 1780 1868 -8.33333333333333e+00 1780 1778 -4.16666666666667e+00 1780 1337 4.16666666666667e+00 1780 1777 -1.25000000000000e+01 1780 1776 8.33333333333333e+00 1780 1779 -1.66666666666667e+01 1780 1376 4.16666666666667e+00 1780 1864 -1.25000000000000e+01 1780 1796 -4.16666666666667e+00 1780 1802 4.16666666666667e+00 1780 1874 -4.16666666666667e+00 1780 1782 8.33333333333333e+00 1780 1800 -8.33333333333333e+00 1780 1794 8.33333333333333e+00 1780 1784 8.33333333333333e+00 1780 1769 8.33333333333333e+00 1780 1781 -1.66666666666667e+01 1780 1783 -3.75000000000000e+01 1780 1768 -1.25000000000000e+01 1780 1335 4.16666666666667e+00 1780 1767 -4.16666666666667e+00 1780 1737 4.16666666666667e+00 1780 1795 -1.25000000000000e+01 1780 1872 -4.16666666666667e+00 1780 1374 4.16666666666667e+00 1781 1781 1.25000000000000e+02 1781 1737 4.16666666666667e+00 1781 1734 -4.16666666666667e+00 1781 1735 -4.16666666666667e+00 1781 1744 4.16666666666667e+00 1781 1746 -4.16666666666667e+00 1781 1743 4.16666666666667e+00 1781 1748 -1.25000000000000e+01 1781 1747 8.33333333333333e+00 1781 1864 8.33333333333333e+00 1781 1867 -8.33333333333333e+00 1781 1866 4.16666666666667e+00 1781 1778 -1.25000000000000e+01 1781 1777 -4.16666666666667e+00 1781 1336 4.16666666666667e+00 1781 1776 8.33333333333333e+00 1781 1865 -3.75000000000000e+01 1781 1375 4.16666666666667e+00 1781 1863 8.33333333333333e+00 1781 1795 -4.16666666666667e+00 1781 1779 -1.66666666666667e+01 1781 1782 -4.16666666666667e+00 1781 1801 4.16666666666667e+00 1781 1873 -4.16666666666667e+00 1781 1872 -4.16666666666667e+00 1781 1800 4.16666666666667e+00 1781 1784 -1.25000000000000e+01 1781 1769 -3.75000000000000e+01 1781 1783 8.33333333333333e+00 1781 1768 8.33333333333333e+00 1781 1780 -1.66666666666667e+01 1781 1335 -8.33333333333333e+00 1781 1767 8.33333333333333e+00 1781 1738 -8.33333333333333e+00 1781 1796 -1.25000000000000e+01 1781 1794 8.33333333333333e+00 1781 1374 -8.33333333333333e+00 1782 1782 1.25000000000000e+02 1782 1774 -4.16666666666667e+00 1782 1837 -8.33333333333333e+00 1782 1775 8.33333333333333e+00 1782 1773 -1.25000000000000e+01 1782 1832 -4.16666666666667e+00 1782 1831 8.33333333333333e+00 1782 1830 -1.25000000000000e+01 1782 1772 -8.33333333333333e+00 1782 1771 4.16666666666667e+00 1782 1769 4.16666666666667e+00 1782 1781 -4.16666666666667e+00 1782 1783 -1.66666666666667e+01 1782 1801 8.33333333333333e+00 1782 1780 8.33333333333333e+00 1782 1802 8.33333333333333e+00 1782 1874 -8.33333333333333e+00 1782 1381 -4.16666666666667e+00 1782 1873 4.16666666666667e+00 1782 1800 -3.75000000000000e+01 1782 1336 -4.16666666666667e+00 1782 1768 4.16666666666667e+00 1782 1779 -1.25000000000000e+01 1782 1520 8.33333333333333e+00 1782 1784 -1.66666666666667e+01 1782 1868 8.33333333333333e+00 1782 1537 4.16666666666667e+00 1782 1867 -4.16666666666667e+00 1782 1778 4.16666666666667e+00 1782 1337 -4.16666666666667e+00 1782 1519 8.33333333333333e+00 1782 1777 -8.33333333333333e+00 1782 1518 -3.75000000000000e+01 1782 1538 4.16666666666667e+00 1782 1382 -4.16666666666667e+00 1782 1866 -1.25000000000000e+01 1782 1838 4.16666666666667e+00 1783 1783 1.25000000000000e+02 1783 1773 -4.16666666666667e+00 1783 1838 4.16666666666667e+00 1783 1836 -8.33333333333333e+00 1783 1774 -1.25000000000000e+01 1783 1772 4.16666666666667e+00 1783 1830 8.33333333333333e+00 1783 1832 8.33333333333333e+00 1783 1831 -3.75000000000000e+01 1783 1770 4.16666666666667e+00 1783 1784 -1.66666666666667e+01 1783 1337 -4.16666666666667e+00 1783 1382 -4.16666666666667e+00 1783 1802 -4.16666666666667e+00 1783 1874 4.16666666666667e+00 1783 1782 -1.66666666666667e+01 1783 1800 8.33333333333333e+00 1783 1779 8.33333333333333e+00 1783 1801 -1.25000000000000e+01 1783 1380 -4.16666666666667e+00 1783 1872 4.16666666666667e+00 1783 1769 -8.33333333333333e+00 1783 1781 8.33333333333333e+00 1783 1780 -3.75000000000000e+01 1783 1335 -4.16666666666667e+00 1783 1767 4.16666666666667e+00 1783 1520 -4.16666666666667e+00 1783 1778 4.16666666666667e+00 1783 1536 4.16666666666667e+00 1783 1866 -4.16666666666667e+00 1783 1519 -1.25000000000000e+01 1783 1518 8.33333333333333e+00 1783 1776 -8.33333333333333e+00 1783 1538 -8.33333333333333e+00 1783 1868 8.33333333333333e+00 1783 1867 -1.25000000000000e+01 1783 1775 8.33333333333333e+00 1784 1784 1.25000000000000e+02 1784 1774 8.33333333333333e+00 1784 1837 4.16666666666667e+00 1784 1775 -3.75000000000000e+01 1784 1773 8.33333333333333e+00 1784 1830 -4.16666666666667e+00 1784 1771 4.16666666666667e+00 1784 1832 -1.25000000000000e+01 1784 1831 8.33333333333333e+00 1784 1770 -8.33333333333333e+00 1784 1783 -1.66666666666667e+01 1784 1336 -4.16666666666667e+00 1784 1381 -4.16666666666667e+00 1784 1767 4.16666666666667e+00 1784 1779 -4.16666666666667e+00 1784 1801 -4.16666666666667e+00 1784 1873 4.16666666666667e+00 1784 1802 -1.25000000000000e+01 1784 1800 8.33333333333333e+00 1784 1872 -8.33333333333333e+00 1784 1781 -1.25000000000000e+01 1784 1768 -8.33333333333333e+00 1784 1780 8.33333333333333e+00 1784 1519 -4.16666666666667e+00 1784 1777 4.16666666666667e+00 1784 1518 8.33333333333333e+00 1784 1782 -1.66666666666667e+01 1784 1866 8.33333333333333e+00 1784 1520 -1.25000000000000e+01 1784 1776 4.16666666666667e+00 1784 1335 -4.16666666666667e+00 1784 1868 -3.75000000000000e+01 1784 1836 4.16666666666667e+00 1784 1537 -8.33333333333333e+00 1784 1867 8.33333333333333e+00 1784 1536 4.16666666666667e+00 1784 1380 -4.16666666666667e+00 1785 1785 1.25000000000000e+02 1785 1720 -4.16666666666667e+00 1785 1715 -8.33333333333333e+00 1785 1721 8.33333333333333e+00 1785 1719 -1.25000000000000e+01 1785 1793 -4.16666666666667e+00 1785 1792 8.33333333333333e+00 1785 1791 -1.25000000000000e+01 1785 1684 -4.16666666666667e+00 1785 1693 4.16666666666667e+00 1785 1694 4.16666666666667e+00 1785 1757 -4.16666666666667e+00 1785 1786 -1.66666666666667e+01 1785 1756 8.33333333333333e+00 1785 1755 -1.25000000000000e+01 1785 1685 -4.16666666666667e+00 1785 1751 4.16666666666667e+00 1785 1339 8.33333333333333e+00 1785 1750 -8.33333333333333e+00 1785 1541 4.16666666666667e+00 1785 1787 -1.66666666666667e+01 1785 1799 8.33333333333333e+00 1785 1340 8.33333333333333e+00 1785 1798 -4.16666666666667e+00 1785 1540 4.16666666666667e+00 1785 1714 4.16666666666667e+00 1785 1797 -1.25000000000000e+01 1785 1338 -3.75000000000000e+01 1785 428 4.16666666666667e+00 1785 427 -8.33333333333333e+00 1785 52 8.33333333333333e+00 1785 278 -4.16666666666667e+00 1785 53 8.33333333333333e+00 1785 434 -8.33333333333333e+00 1785 433 4.16666666666667e+00 1785 277 -4.16666666666667e+00 1785 51 -3.75000000000000e+01 1786 1786 1.25000000000000e+02 1786 1719 -4.16666666666667e+00 1786 1721 8.33333333333333e+00 1786 1715 4.16666666666667e+00 1786 1720 -1.25000000000000e+01 1786 1793 8.33333333333333e+00 1786 1792 -3.75000000000000e+01 1786 1791 8.33333333333333e+00 1786 1787 -1.66666666666667e+01 1786 1340 -4.16666666666667e+00 1786 1751 4.16666666666667e+00 1786 1685 -4.16666666666667e+00 1786 1683 -4.16666666666667e+00 1786 1692 4.16666666666667e+00 1786 1694 -8.33333333333333e+00 1786 1757 8.33333333333333e+00 1786 1756 -3.75000000000000e+01 1786 1785 -1.66666666666667e+01 1786 1755 8.33333333333333e+00 1786 1338 8.33333333333333e+00 1786 1749 -8.33333333333333e+00 1786 1799 8.33333333333333e+00 1786 1541 -8.33333333333333e+00 1786 1713 4.16666666666667e+00 1786 1798 -1.25000000000000e+01 1786 1339 -1.25000000000000e+01 1786 1797 -4.16666666666667e+00 1786 1539 4.16666666666667e+00 1786 428 4.16666666666667e+00 1786 426 -8.33333333333333e+00 1786 53 -4.16666666666667e+00 1786 51 8.33333333333333e+00 1786 434 4.16666666666667e+00 1786 278 -4.16666666666667e+00 1786 52 -1.25000000000000e+01 1786 432 4.16666666666667e+00 1786 276 -4.16666666666667e+00 1787 1787 1.25000000000000e+02 1787 1714 4.16666666666667e+00 1787 1713 -8.33333333333333e+00 1787 1721 -3.75000000000000e+01 1787 1719 8.33333333333333e+00 1787 1793 -1.25000000000000e+01 1787 1792 8.33333333333333e+00 1787 1791 -4.16666666666667e+00 1787 1786 -1.66666666666667e+01 1787 1339 -4.16666666666667e+00 1787 1750 4.16666666666667e+00 1787 1684 -4.16666666666667e+00 1787 1757 -1.25000000000000e+01 1787 1693 -8.33333333333333e+00 1787 1756 8.33333333333333e+00 1787 1692 4.16666666666667e+00 1787 1755 -4.16666666666667e+00 1787 1683 -4.16666666666667e+00 1787 1749 4.16666666666667e+00 1787 1539 4.16666666666667e+00 1787 1720 8.33333333333333e+00 1787 1799 -3.75000000000000e+01 1787 1340 -1.25000000000000e+01 1787 1798 8.33333333333333e+00 1787 1540 -8.33333333333333e+00 1787 1785 -1.66666666666667e+01 1787 1797 8.33333333333333e+00 1787 1338 8.33333333333333e+00 1787 427 4.16666666666667e+00 1787 426 4.16666666666667e+00 1787 52 -4.16666666666667e+00 1787 433 4.16666666666667e+00 1787 277 -4.16666666666667e+00 1787 276 -4.16666666666667e+00 1787 53 -1.25000000000000e+01 1787 51 8.33333333333333e+00 1787 432 -8.33333333333333e+00 1788 1788 1.25000000000000e+02 1788 1726 -4.16666666666667e+00 1788 1727 8.33333333333333e+00 1788 1715 4.16666666666667e+00 1788 1725 -1.25000000000000e+01 1788 1835 4.16666666666667e+00 1788 1834 -8.33333333333333e+00 1788 1793 8.33333333333333e+00 1788 1792 8.33333333333333e+00 1788 1791 -3.75000000000000e+01 1788 1790 -1.66666666666667e+01 1788 1358 -4.16666666666667e+00 1788 1340 -4.16666666666667e+00 1788 1703 -4.16666666666667e+00 1788 1769 4.16666666666667e+00 1788 1702 -4.16666666666667e+00 1788 1711 4.16666666666667e+00 1788 1712 -8.33333333333333e+00 1788 1775 8.33333333333333e+00 1788 1357 8.33333333333333e+00 1788 1789 -1.66666666666667e+01 1788 1774 8.33333333333333e+00 1788 1773 -3.75000000000000e+01 1788 1339 8.33333333333333e+00 1788 1768 -8.33333333333333e+00 1788 1544 -4.16666666666667e+00 1788 1838 4.16666666666667e+00 1788 1837 4.16666666666667e+00 1788 1543 -4.16666666666667e+00 1788 1356 -1.25000000000000e+01 1788 1802 8.33333333333333e+00 1788 1541 -8.33333333333333e+00 1788 1801 -4.16666666666667e+00 1788 1540 4.16666666666667e+00 1788 1800 -1.25000000000000e+01 1788 1714 4.16666666666667e+00 1788 1338 -1.25000000000000e+01 1789 1789 1.25000000000000e+02 1789 1725 -4.16666666666667e+00 1789 1715 -8.33333333333333e+00 1789 1727 8.33333333333333e+00 1789 1726 -1.25000000000000e+01 1789 1835 4.16666666666667e+00 1789 1833 -8.33333333333333e+00 1789 1793 -4.16666666666667e+00 1789 1792 -1.25000000000000e+01 1789 1791 8.33333333333333e+00 1789 1701 -4.16666666666667e+00 1789 1710 4.16666666666667e+00 1789 1712 4.16666666666667e+00 1789 1775 -4.16666666666667e+00 1789 1774 -1.25000000000000e+01 1789 1356 8.33333333333333e+00 1789 1788 -1.66666666666667e+01 1789 1773 8.33333333333333e+00 1789 1703 -4.16666666666667e+00 1789 1769 4.16666666666667e+00 1789 1338 8.33333333333333e+00 1789 1767 -8.33333333333333e+00 1789 1544 -4.16666666666667e+00 1789 1541 4.16666666666667e+00 1789 1838 -8.33333333333333e+00 1789 1358 8.33333333333333e+00 1789 1357 -3.75000000000000e+01 1789 1836 4.16666666666667e+00 1789 1542 -4.16666666666667e+00 1789 1802 8.33333333333333e+00 1789 1790 -1.66666666666667e+01 1789 1340 8.33333333333333e+00 1789 1801 -1.25000000000000e+01 1789 1713 4.16666666666667e+00 1789 1339 -3.75000000000000e+01 1789 1800 -4.16666666666667e+00 1789 1539 4.16666666666667e+00 1790 1790 1.25000000000000e+02 1790 1714 -8.33333333333333e+00 1790 1713 4.16666666666667e+00 1790 1727 -3.75000000000000e+01 1790 1726 8.33333333333333e+00 1790 1833 4.16666666666667e+00 1790 1834 4.16666666666667e+00 1790 1793 -1.25000000000000e+01 1790 1792 -4.16666666666667e+00 1790 1791 8.33333333333333e+00 1790 1788 -1.66666666666667e+01 1790 1356 -4.16666666666667e+00 1790 1338 -4.16666666666667e+00 1790 1701 -4.16666666666667e+00 1790 1767 4.16666666666667e+00 1790 1775 -1.25000000000000e+01 1790 1711 4.16666666666667e+00 1790 1774 -4.16666666666667e+00 1790 1710 -8.33333333333333e+00 1790 1773 8.33333333333333e+00 1790 1702 -4.16666666666667e+00 1790 1768 4.16666666666667e+00 1790 1542 -4.16666666666667e+00 1790 1836 4.16666666666667e+00 1790 1543 -4.16666666666667e+00 1790 1540 4.16666666666667e+00 1790 1358 -1.25000000000000e+01 1790 1837 -8.33333333333333e+00 1790 1357 8.33333333333333e+00 1790 1802 -3.75000000000000e+01 1790 1725 8.33333333333333e+00 1790 1340 -1.25000000000000e+01 1790 1801 8.33333333333333e+00 1790 1789 -1.66666666666667e+01 1790 1339 8.33333333333333e+00 1790 1800 8.33333333333333e+00 1790 1539 -8.33333333333333e+00 1791 1791 1.25000000000000e+02 1791 1727 -8.33333333333333e+00 1791 1835 -4.16666666666667e+00 1791 1543 4.16666666666667e+00 1791 1544 4.16666666666667e+00 1791 1834 8.33333333333333e+00 1791 1833 -1.25000000000000e+01 1791 1790 8.33333333333333e+00 1791 1789 8.33333333333333e+00 1791 1788 -3.75000000000000e+01 1791 1714 -4.16666666666667e+00 1791 1715 -4.16666666666667e+00 1791 1729 -4.16666666666667e+00 1791 1720 4.16666666666667e+00 1791 1721 4.16666666666667e+00 1791 1730 8.33333333333333e+00 1791 1793 -1.66666666666667e+01 1791 1728 -1.25000000000000e+01 1791 1540 -4.16666666666667e+00 1791 1792 -1.66666666666667e+01 1791 1541 8.33333333333333e+00 1791 1787 -4.16666666666667e+00 1791 1340 4.16666666666667e+00 1791 1786 8.33333333333333e+00 1791 1339 -8.33333333333333e+00 1791 1785 -1.25000000000000e+01 1791 1726 4.16666666666667e+00 1791 1539 -1.25000000000000e+01 1791 428 8.33333333333333e+00 1791 280 -4.16666666666667e+00 1791 277 4.16666666666667e+00 1791 278 -8.33333333333333e+00 1791 92 4.16666666666667e+00 1791 281 -4.16666666666667e+00 1791 427 8.33333333333333e+00 1791 91 -8.33333333333333e+00 1791 426 -3.75000000000000e+01 1792 1792 1.25000000000000e+02 1792 1727 4.16666666666667e+00 1792 1835 8.33333333333333e+00 1792 1542 4.16666666666667e+00 1792 1544 -8.33333333333333e+00 1792 1834 -3.75000000000000e+01 1792 1833 8.33333333333333e+00 1792 1790 -4.16666666666667e+00 1792 1789 -1.25000000000000e+01 1792 1788 8.33333333333333e+00 1792 1713 -4.16666666666667e+00 1792 1730 8.33333333333333e+00 1792 1728 -4.16666666666667e+00 1792 1719 4.16666666666667e+00 1792 1721 -8.33333333333333e+00 1792 1729 -1.25000000000000e+01 1792 1715 -4.16666666666667e+00 1792 1340 4.16666666666667e+00 1792 1539 -4.16666666666667e+00 1792 1791 -1.66666666666667e+01 1792 1787 8.33333333333333e+00 1792 1793 -1.66666666666667e+01 1792 1541 8.33333333333333e+00 1792 1786 -3.75000000000000e+01 1792 1725 4.16666666666667e+00 1792 1540 -1.25000000000000e+01 1792 1785 8.33333333333333e+00 1792 1338 -8.33333333333333e+00 1792 92 4.16666666666667e+00 1792 428 -4.16666666666667e+00 1792 279 -4.16666666666667e+00 1792 276 4.16666666666667e+00 1792 281 -4.16666666666667e+00 1792 278 4.16666666666667e+00 1792 427 -1.25000000000000e+01 1792 426 8.33333333333333e+00 1792 90 -8.33333333333333e+00 1793 1793 1.25000000000000e+02 1793 1725 -8.33333333333333e+00 1793 1833 -4.16666666666667e+00 1793 1834 8.33333333333333e+00 1793 1543 -8.33333333333333e+00 1793 1542 4.16666666666667e+00 1793 1835 -1.25000000000000e+01 1793 1790 -1.25000000000000e+01 1793 1789 -4.16666666666667e+00 1793 1788 8.33333333333333e+00 1793 1713 -4.16666666666667e+00 1793 1729 8.33333333333333e+00 1793 1720 -8.33333333333333e+00 1793 1719 4.16666666666667e+00 1793 1730 -3.75000000000000e+01 1793 1728 8.33333333333333e+00 1793 1791 -1.66666666666667e+01 1793 1714 -4.16666666666667e+00 1793 1339 4.16666666666667e+00 1793 1539 8.33333333333333e+00 1793 1787 -1.25000000000000e+01 1793 1726 4.16666666666667e+00 1793 1541 -3.75000000000000e+01 1793 1786 8.33333333333333e+00 1793 1792 -1.66666666666667e+01 1793 1540 8.33333333333333e+00 1793 1785 -4.16666666666667e+00 1793 1338 4.16666666666667e+00 1793 91 4.16666666666667e+00 1793 427 -4.16666666666667e+00 1793 426 8.33333333333333e+00 1793 280 -4.16666666666667e+00 1793 277 4.16666666666667e+00 1793 276 -8.33333333333333e+00 1793 428 -1.25000000000000e+01 1793 90 4.16666666666667e+00 1793 279 -4.16666666666667e+00 1794 1794 1.25000000000000e+02 1794 1769 -8.33333333333333e+00 1794 1768 4.16666666666667e+00 1794 1781 8.33333333333333e+00 1794 1779 -3.75000000000000e+01 1794 1873 4.16666666666667e+00 1794 1874 4.16666666666667e+00 1794 1802 -4.16666666666667e+00 1794 1801 8.33333333333333e+00 1794 1800 -1.25000000000000e+01 1794 1738 -4.16666666666667e+00 1794 1739 -4.16666666666667e+00 1794 1748 4.16666666666667e+00 1794 1747 -8.33333333333333e+00 1794 1751 4.16666666666667e+00 1794 1763 -4.16666666666667e+00 1794 1795 -1.66666666666667e+01 1794 1762 8.33333333333333e+00 1794 1750 4.16666666666667e+00 1794 1339 -4.16666666666667e+00 1794 1375 -4.16666666666667e+00 1794 1761 -1.25000000000000e+01 1794 1541 4.16666666666667e+00 1794 1547 -4.16666666666667e+00 1794 1870 4.16666666666667e+00 1794 1546 -4.16666666666667e+00 1794 1376 8.33333333333333e+00 1794 1871 -8.33333333333333e+00 1794 1374 -1.25000000000000e+01 1794 1796 -1.66666666666667e+01 1794 1799 8.33333333333333e+00 1794 1340 8.33333333333333e+00 1794 1798 8.33333333333333e+00 1794 1540 -8.33333333333333e+00 1794 1780 8.33333333333333e+00 1794 1797 -3.75000000000000e+01 1794 1338 -1.25000000000000e+01 1795 1795 1.25000000000000e+02 1795 1781 -4.16666666666667e+00 1795 1779 8.33333333333333e+00 1795 1767 4.16666666666667e+00 1795 1780 -1.25000000000000e+01 1795 1872 4.16666666666667e+00 1795 1874 -8.33333333333333e+00 1795 1802 8.33333333333333e+00 1795 1801 -3.75000000000000e+01 1795 1800 8.33333333333333e+00 1795 1737 -4.16666666666667e+00 1795 1739 -4.16666666666667e+00 1795 1748 4.16666666666667e+00 1795 1746 -8.33333333333333e+00 1795 1794 -1.66666666666667e+01 1795 1761 8.33333333333333e+00 1795 1751 -8.33333333333333e+00 1795 1340 8.33333333333333e+00 1795 1749 4.16666666666667e+00 1795 1338 -4.16666666666667e+00 1795 1763 8.33333333333333e+00 1795 1796 -1.66666666666667e+01 1795 1376 8.33333333333333e+00 1795 1762 -3.75000000000000e+01 1795 1374 -4.16666666666667e+00 1795 1869 4.16666666666667e+00 1795 1545 -4.16666666666667e+00 1795 1871 4.16666666666667e+00 1795 1547 -4.16666666666667e+00 1795 1375 -1.25000000000000e+01 1795 1799 -4.16666666666667e+00 1795 1541 4.16666666666667e+00 1795 1769 4.16666666666667e+00 1795 1798 -1.25000000000000e+01 1795 1339 -1.25000000000000e+01 1795 1797 8.33333333333333e+00 1795 1539 -8.33333333333333e+00 1796 1796 1.25000000000000e+02 1796 1780 -4.16666666666667e+00 1796 1767 -8.33333333333333e+00 1796 1781 -1.25000000000000e+01 1796 1779 8.33333333333333e+00 1796 1873 -8.33333333333333e+00 1796 1872 4.16666666666667e+00 1796 1802 -1.25000000000000e+01 1796 1801 8.33333333333333e+00 1796 1800 -4.16666666666667e+00 1796 1738 -4.16666666666667e+00 1796 1747 4.16666666666667e+00 1796 1737 -4.16666666666667e+00 1796 1746 4.16666666666667e+00 1796 1749 4.16666666666667e+00 1796 1761 -4.16666666666667e+00 1796 1750 -8.33333333333333e+00 1796 1339 8.33333333333333e+00 1796 1763 -1.25000000000000e+01 1796 1762 8.33333333333333e+00 1796 1795 -1.66666666666667e+01 1796 1375 8.33333333333333e+00 1796 1539 4.16666666666667e+00 1796 1545 -4.16666666666667e+00 1796 1376 -3.75000000000000e+01 1796 1870 4.16666666666667e+00 1796 1546 -4.16666666666667e+00 1796 1374 8.33333333333333e+00 1796 1869 -8.33333333333333e+00 1796 1768 4.16666666666667e+00 1796 1799 -1.25000000000000e+01 1796 1340 -3.75000000000000e+01 1796 1798 -4.16666666666667e+00 1796 1540 4.16666666666667e+00 1796 1794 -1.66666666666667e+01 1796 1797 8.33333333333333e+00 1796 1338 8.33333333333333e+00 1797 1797 1.25000000000000e+02 1797 1756 4.16666666666667e+00 1797 1787 8.33333333333333e+00 1797 1786 -4.16666666666667e+00 1797 1785 -1.25000000000000e+01 1797 1751 -4.16666666666667e+00 1797 1766 -4.16666666666667e+00 1797 1763 4.16666666666667e+00 1797 1765 8.33333333333333e+00 1797 1762 -8.33333333333333e+00 1797 1764 -1.25000000000000e+01 1797 1750 -4.16666666666667e+00 1797 1339 4.16666666666667e+00 1797 1541 -4.16666666666667e+00 1797 1799 -1.66666666666667e+01 1797 1870 -4.16666666666667e+00 1797 1547 4.16666666666667e+00 1797 1546 4.16666666666667e+00 1797 1871 8.33333333333333e+00 1797 1869 -1.25000000000000e+01 1797 1796 8.33333333333333e+00 1797 1340 -8.33333333333333e+00 1797 1795 8.33333333333333e+00 1797 1798 -1.66666666666667e+01 1797 1540 8.33333333333333e+00 1797 1794 -3.75000000000000e+01 1797 1757 4.16666666666667e+00 1797 1539 -1.25000000000000e+01 1797 433 8.33333333333333e+00 1797 278 4.16666666666667e+00 1797 277 -8.33333333333333e+00 1797 434 8.33333333333333e+00 1797 432 -3.75000000000000e+01 1797 112 4.16666666666667e+00 1797 284 -4.16666666666667e+00 1797 283 -4.16666666666667e+00 1797 113 -8.33333333333333e+00 1798 1798 1.25000000000000e+02 1798 1755 4.16666666666667e+00 1798 1787 8.33333333333333e+00 1798 1786 -1.25000000000000e+01 1798 1785 -4.16666666666667e+00 1798 1751 -4.16666666666667e+00 1798 1764 8.33333333333333e+00 1798 1763 4.16666666666667e+00 1798 1761 -8.33333333333333e+00 1798 1766 8.33333333333333e+00 1798 1799 -1.66666666666667e+01 1798 1765 -3.75000000000000e+01 1798 1749 -4.16666666666667e+00 1798 1338 4.16666666666667e+00 1798 1869 -4.16666666666667e+00 1798 1871 8.33333333333333e+00 1798 1541 8.33333333333333e+00 1798 1547 -8.33333333333333e+00 1798 1545 4.16666666666667e+00 1798 1870 -1.25000000000000e+01 1798 1796 -4.16666666666667e+00 1798 1340 4.16666666666667e+00 1798 1795 -1.25000000000000e+01 1798 1757 -8.33333333333333e+00 1798 1540 -3.75000000000000e+01 1798 1794 8.33333333333333e+00 1798 1797 -1.66666666666667e+01 1798 1539 8.33333333333333e+00 1798 434 -4.16666666666667e+00 1798 278 4.16666666666667e+00 1798 432 8.33333333333333e+00 1798 276 -8.33333333333333e+00 1798 433 -1.25000000000000e+01 1798 111 4.16666666666667e+00 1798 282 -4.16666666666667e+00 1798 113 4.16666666666667e+00 1798 284 -4.16666666666667e+00 1799 1799 1.25000000000000e+02 1799 1756 -8.33333333333333e+00 1799 1787 -3.75000000000000e+01 1799 1786 8.33333333333333e+00 1799 1785 8.33333333333333e+00 1799 1749 -4.16666666666667e+00 1799 1750 -4.16666666666667e+00 1799 1764 -4.16666666666667e+00 1799 1761 4.16666666666667e+00 1799 1762 4.16666666666667e+00 1799 1766 -1.25000000000000e+01 1799 1765 8.33333333333333e+00 1799 1798 -1.66666666666667e+01 1799 1539 -4.16666666666667e+00 1799 1797 -1.66666666666667e+01 1799 1870 8.33333333333333e+00 1799 1545 4.16666666666667e+00 1799 1540 8.33333333333333e+00 1799 1546 -8.33333333333333e+00 1799 1871 -3.75000000000000e+01 1799 1869 8.33333333333333e+00 1799 1796 -1.25000000000000e+01 1799 1755 4.16666666666667e+00 1799 1541 -1.25000000000000e+01 1799 1795 -4.16666666666667e+00 1799 1339 4.16666666666667e+00 1799 1794 8.33333333333333e+00 1799 1338 -8.33333333333333e+00 1799 433 -4.16666666666667e+00 1799 277 4.16666666666667e+00 1799 276 4.16666666666667e+00 1799 434 -1.25000000000000e+01 1799 432 8.33333333333333e+00 1799 282 -4.16666666666667e+00 1799 112 4.16666666666667e+00 1799 283 -4.16666666666667e+00 1799 111 -8.33333333333333e+00 1800 1800 1.25000000000000e+02 1800 1774 4.16666666666667e+00 1800 1544 4.16666666666667e+00 1800 1838 -4.16666666666667e+00 1800 1837 8.33333333333333e+00 1800 1543 -8.33333333333333e+00 1800 1836 -1.25000000000000e+01 1800 1790 8.33333333333333e+00 1800 1789 -4.16666666666667e+00 1800 1788 -1.25000000000000e+01 1800 1769 -4.16666666666667e+00 1800 1783 8.33333333333333e+00 1800 1781 4.16666666666667e+00 1800 1780 -8.33333333333333e+00 1800 1784 8.33333333333333e+00 1800 1802 -1.66666666666667e+01 1800 1381 4.16666666666667e+00 1800 1782 -3.75000000000000e+01 1800 1768 -4.16666666666667e+00 1800 1339 4.16666666666667e+00 1800 1873 -4.16666666666667e+00 1800 1874 8.33333333333333e+00 1800 1541 8.33333333333333e+00 1800 1547 -8.33333333333333e+00 1800 1549 -4.16666666666667e+00 1800 1546 4.16666666666667e+00 1800 1382 4.16666666666667e+00 1800 1550 -4.16666666666667e+00 1800 1872 -1.25000000000000e+01 1800 1796 -4.16666666666667e+00 1800 1340 4.16666666666667e+00 1800 1801 -1.66666666666667e+01 1800 1795 8.33333333333333e+00 1800 1540 8.33333333333333e+00 1800 1775 -8.33333333333333e+00 1800 1794 -1.25000000000000e+01 1800 1539 -3.75000000000000e+01 1801 1801 1.25000000000000e+02 1801 1773 4.16666666666667e+00 1801 1836 8.33333333333333e+00 1801 1544 4.16666666666667e+00 1801 1542 -8.33333333333333e+00 1801 1838 8.33333333333333e+00 1801 1837 -3.75000000000000e+01 1801 1790 8.33333333333333e+00 1801 1789 -1.25000000000000e+01 1801 1788 -4.16666666666667e+00 1801 1769 -4.16666666666667e+00 1801 1784 -4.16666666666667e+00 1801 1781 4.16666666666667e+00 1801 1782 8.33333333333333e+00 1801 1779 -8.33333333333333e+00 1801 1783 -1.25000000000000e+01 1801 1380 4.16666666666667e+00 1801 1767 -4.16666666666667e+00 1801 1338 4.16666666666667e+00 1801 1541 -4.16666666666667e+00 1801 1802 -1.66666666666667e+01 1801 1872 -4.16666666666667e+00 1801 1550 -4.16666666666667e+00 1801 1547 4.16666666666667e+00 1801 1548 -4.16666666666667e+00 1801 1545 4.16666666666667e+00 1801 1382 -8.33333333333333e+00 1801 1874 8.33333333333333e+00 1801 1873 -1.25000000000000e+01 1801 1796 8.33333333333333e+00 1801 1340 -8.33333333333333e+00 1801 1775 4.16666666666667e+00 1801 1795 -3.75000000000000e+01 1801 1540 -1.25000000000000e+01 1801 1800 -1.66666666666667e+01 1801 1794 8.33333333333333e+00 1801 1539 8.33333333333333e+00 1802 1802 1.25000000000000e+02 1802 1773 -8.33333333333333e+00 1802 1542 4.16666666666667e+00 1802 1836 -4.16666666666667e+00 1802 1543 4.16666666666667e+00 1802 1838 -1.25000000000000e+01 1802 1837 8.33333333333333e+00 1802 1790 -3.75000000000000e+01 1802 1789 8.33333333333333e+00 1802 1788 8.33333333333333e+00 1802 1768 -4.16666666666667e+00 1802 1767 -4.16666666666667e+00 1802 1783 -4.16666666666667e+00 1802 1780 4.16666666666667e+00 1802 1779 4.16666666666667e+00 1802 1784 -1.25000000000000e+01 1802 1782 8.33333333333333e+00 1802 1800 -1.66666666666667e+01 1802 1540 -4.16666666666667e+00 1802 1801 -1.66666666666667e+01 1802 1549 -4.16666666666667e+00 1802 1546 4.16666666666667e+00 1802 1872 8.33333333333333e+00 1802 1539 8.33333333333333e+00 1802 1545 -8.33333333333333e+00 1802 1874 -3.75000000000000e+01 1802 1381 -8.33333333333333e+00 1802 1873 8.33333333333333e+00 1802 1380 4.16666666666667e+00 1802 1548 -4.16666666666667e+00 1802 1774 4.16666666666667e+00 1802 1796 -1.25000000000000e+01 1802 1541 -1.25000000000000e+01 1802 1795 8.33333333333333e+00 1802 1339 -8.33333333333333e+00 1802 1794 -4.16666666666667e+00 1802 1338 4.16666666666667e+00 1803 1803 6.25000000000000e+01 1803 1601 -4.16666666666667e+00 1803 1804 -8.33333333333333e+00 1803 1807 4.16666666666667e+00 1803 1600 8.33333333333333e+00 1803 1808 4.16666666666667e+00 1803 1342 -2.08333333333333e+00 1803 1597 4.16666666666667e+00 1803 1806 -1.87500000000000e+01 1803 1817 -4.16666666666667e+00 1803 1816 2.08333333333333e+00 1803 1348 -2.08333333333333e+00 1803 1599 -1.25000000000000e+01 1803 1435 2.08333333333333e+00 1803 1579 -4.16666666666667e+00 1803 1580 -4.16666666666667e+00 1803 1586 4.16666666666667e+00 1803 1343 4.16666666666667e+00 1803 1436 -4.16666666666667e+00 1803 1341 -6.25000000000000e+00 1803 1805 -8.33333333333333e+00 1803 1442 4.16666666666667e+00 1803 1349 4.16666666666667e+00 1803 1441 4.16666666666667e+00 1803 1585 -8.33333333333333e+00 1803 1598 4.16666666666667e+00 1803 1440 -1.87500000000000e+01 1803 1347 -6.25000000000000e+00 1804 1804 6.25000000000000e+01 1804 1817 2.08333333333333e+00 1804 1803 -8.33333333333333e+00 1804 1806 4.16666666666667e+00 1804 1599 8.33333333333333e+00 1804 1343 4.16666666666667e+00 1804 1598 -8.33333333333333e+00 1804 1807 -6.25000000000000e+00 1804 1341 -2.08333333333333e+00 1804 1596 4.16666666666667e+00 1804 1805 -8.33333333333333e+00 1804 1601 8.33333333333333e+00 1804 1349 4.16666666666667e+00 1804 1600 -3.75000000000000e+01 1804 1815 2.08333333333333e+00 1804 1347 -2.08333333333333e+00 1804 1434 2.08333333333333e+00 1804 1578 -4.16666666666667e+00 1804 1436 2.08333333333333e+00 1804 1580 -4.16666666666667e+00 1804 1342 -6.25000000000000e+00 1804 1442 -2.08333333333333e+00 1804 1586 4.16666666666667e+00 1804 1808 -2.08333333333333e+00 1804 1441 -6.25000000000000e+00 1804 1348 -6.25000000000000e+00 1804 1440 4.16666666666667e+00 1804 1584 -8.33333333333333e+00 1805 1805 6.25000000000000e+01 1805 1599 -4.16666666666667e+00 1805 1807 -2.08333333333333e+00 1805 1816 2.08333333333333e+00 1805 1808 -6.25000000000000e+00 1805 1342 4.16666666666667e+00 1805 1597 -8.33333333333333e+00 1805 1806 4.16666666666667e+00 1805 1601 -1.25000000000000e+01 1805 1804 -8.33333333333333e+00 1805 1600 8.33333333333333e+00 1805 1348 4.16666666666667e+00 1805 1815 -4.16666666666667e+00 1805 1578 -4.16666666666667e+00 1805 1584 4.16666666666667e+00 1805 1343 -1.87500000000000e+01 1805 1435 2.08333333333333e+00 1805 1579 -4.16666666666667e+00 1805 1341 4.16666666666667e+00 1805 1434 -4.16666666666667e+00 1805 1596 4.16666666666667e+00 1805 1442 -6.25000000000000e+00 1805 1349 -1.87500000000000e+01 1805 1441 -2.08333333333333e+00 1805 1585 4.16666666666667e+00 1805 1803 -8.33333333333333e+00 1805 1440 4.16666666666667e+00 1805 1347 4.16666666666667e+00 1806 1806 6.25000000000000e+01 1806 1804 4.16666666666667e+00 1806 1600 -8.33333333333333e+00 1806 1805 4.16666666666667e+00 1806 1342 2.08333333333333e+00 1806 1803 -1.87500000000000e+01 1806 1817 4.16666666666667e+00 1806 1354 2.08333333333333e+00 1806 1816 -2.08333333333333e+00 1806 1815 -6.25000000000000e+00 1806 1597 -4.16666666666667e+00 1806 1598 -4.16666666666667e+00 1806 1808 -8.33333333333333e+00 1806 1450 -2.08333333333333e+00 1806 1444 4.16666666666667e+00 1806 1445 4.16666666666667e+00 1806 1604 -4.16666666666667e+00 1806 1451 4.16666666666667e+00 1806 1343 -4.16666666666667e+00 1806 1449 -6.25000000000000e+00 1806 1457 4.16666666666667e+00 1806 1355 -4.16666666666667e+00 1806 1456 4.16666666666667e+00 1806 1807 -8.33333333333333e+00 1806 1603 8.33333333333333e+00 1806 1455 -1.87500000000000e+01 1806 1601 4.16666666666667e+00 1806 1602 -1.25000000000000e+01 1807 1807 6.25000000000000e+01 1807 1601 4.16666666666667e+00 1807 1803 4.16666666666667e+00 1807 1599 -8.33333333333333e+00 1807 1804 -6.25000000000000e+00 1807 1341 2.08333333333333e+00 1807 1808 -8.33333333333333e+00 1807 1817 4.16666666666667e+00 1807 1816 -6.25000000000000e+00 1807 1353 2.08333333333333e+00 1807 1815 -2.08333333333333e+00 1807 1596 -4.16666666666667e+00 1807 1451 4.16666666666667e+00 1807 1449 -2.08333333333333e+00 1807 1443 4.16666666666667e+00 1807 1445 -8.33333333333333e+00 1807 1604 8.33333333333333e+00 1807 1343 2.08333333333333e+00 1807 1598 -4.16666666666667e+00 1807 1450 -6.25000000000000e+00 1807 1457 -2.08333333333333e+00 1807 1355 2.08333333333333e+00 1807 1456 -6.25000000000000e+00 1807 1805 -2.08333333333333e+00 1807 1603 -3.75000000000000e+01 1807 1455 4.16666666666667e+00 1807 1806 -8.33333333333333e+00 1807 1602 8.33333333333333e+00 1808 1808 6.25000000000000e+01 1808 1804 -2.08333333333333e+00 1808 1600 4.16666666666667e+00 1808 1805 -6.25000000000000e+00 1808 1803 4.16666666666667e+00 1808 1817 -1.87500000000000e+01 1808 1807 -8.33333333333333e+00 1808 1816 4.16666666666667e+00 1808 1815 4.16666666666667e+00 1808 1596 -4.16666666666667e+00 1808 1450 4.16666666666667e+00 1808 1806 -8.33333333333333e+00 1808 1444 -8.33333333333333e+00 1808 1603 8.33333333333333e+00 1808 1443 4.16666666666667e+00 1808 1602 -4.16666666666667e+00 1808 1451 -1.87500000000000e+01 1808 1342 2.08333333333333e+00 1808 1597 -4.16666666666667e+00 1808 1449 4.16666666666667e+00 1808 1341 -4.16666666666667e+00 1808 1457 -6.25000000000000e+00 1808 1599 4.16666666666667e+00 1808 1604 -1.25000000000000e+01 1808 1456 -2.08333333333333e+00 1808 1354 2.08333333333333e+00 1808 1455 4.16666666666667e+00 1808 1353 -4.16666666666667e+00 1809 1809 6.25000000000000e+01 1809 1819 2.08333333333333e+00 1809 1820 -4.16666666666667e+00 1809 1814 4.16666666666667e+00 1809 1812 -6.25000000000000e+00 1809 1649 -4.16666666666667e+00 1809 1348 4.16666666666667e+00 1809 1810 -8.33333333333333e+00 1809 1648 8.33333333333333e+00 1809 1647 -1.25000000000000e+01 1809 1646 4.16666666666667e+00 1809 1345 4.16666666666667e+00 1809 1645 -8.33333333333333e+00 1809 1586 4.16666666666667e+00 1809 1583 -4.16666666666667e+00 1809 1346 4.16666666666667e+00 1809 1439 -4.16666666666667e+00 1809 1438 2.08333333333333e+00 1809 1582 -4.16666666666667e+00 1809 1344 -1.87500000000000e+01 1809 1811 -8.33333333333333e+00 1809 1442 4.16666666666667e+00 1809 1349 4.16666666666667e+00 1809 1441 -2.08333333333333e+00 1809 1585 4.16666666666667e+00 1809 1813 -2.08333333333333e+00 1809 1440 -6.25000000000000e+00 1809 1347 -1.87500000000000e+01 1810 1810 6.25000000000000e+01 1810 1811 -8.33333333333333e+00 1810 1812 -2.08333333333333e+00 1810 1818 2.08333333333333e+00 1810 1349 -2.08333333333333e+00 1810 1820 2.08333333333333e+00 1810 1346 -2.08333333333333e+00 1810 1813 -6.25000000000000e+00 1810 1646 4.16666666666667e+00 1810 1649 8.33333333333333e+00 1810 1648 -3.75000000000000e+01 1810 1347 4.16666666666667e+00 1810 1809 -8.33333333333333e+00 1810 1647 8.33333333333333e+00 1810 1344 4.16666666666667e+00 1810 1644 -8.33333333333333e+00 1810 1439 2.08333333333333e+00 1810 1583 -4.16666666666667e+00 1810 1345 -6.25000000000000e+00 1810 1437 2.08333333333333e+00 1810 1581 -4.16666666666667e+00 1810 1442 4.16666666666667e+00 1810 1586 -8.33333333333333e+00 1810 1814 4.16666666666667e+00 1810 1441 -6.25000000000000e+00 1810 1348 -6.25000000000000e+00 1810 1440 -2.08333333333333e+00 1810 1584 4.16666666666667e+00 1811 1811 6.25000000000000e+01 1811 1810 -8.33333333333333e+00 1811 1348 -2.08333333333333e+00 1811 1819 2.08333333333333e+00 1811 1818 -4.16666666666667e+00 1811 1814 -1.87500000000000e+01 1811 1345 -2.08333333333333e+00 1811 1812 4.16666666666667e+00 1811 1645 4.16666666666667e+00 1811 1649 -1.25000000000000e+01 1811 1648 8.33333333333333e+00 1811 1647 -4.16666666666667e+00 1811 1644 4.16666666666667e+00 1811 1584 4.16666666666667e+00 1811 1581 -4.16666666666667e+00 1811 1438 2.08333333333333e+00 1811 1582 -4.16666666666667e+00 1811 1346 -6.25000000000000e+00 1811 1344 4.16666666666667e+00 1811 1437 -4.16666666666667e+00 1811 1813 4.16666666666667e+00 1811 1442 -1.87500000000000e+01 1811 1349 -6.25000000000000e+00 1811 1441 4.16666666666667e+00 1811 1585 -8.33333333333333e+00 1811 1809 -8.33333333333333e+00 1811 1440 4.16666666666667e+00 1811 1347 4.16666666666667e+00 1812 1812 6.25000000000000e+01 1812 1649 4.16666666666667e+00 1812 1648 4.16666666666667e+00 1812 1820 4.16666666666667e+00 1812 1819 4.16666666666667e+00 1812 1813 -8.33333333333333e+00 1812 1818 -1.87500000000000e+01 1812 1811 4.16666666666667e+00 1812 1809 -6.25000000000000e+00 1812 1658 -4.16666666666667e+00 1812 1814 -8.33333333333333e+00 1812 1646 -4.16666666666667e+00 1812 1505 4.16666666666667e+00 1812 1507 4.16666666666667e+00 1812 1657 8.33333333333333e+00 1812 1504 -8.33333333333333e+00 1812 1508 4.16666666666667e+00 1812 1346 -4.16666666666667e+00 1812 1345 2.08333333333333e+00 1812 1645 -4.16666666666667e+00 1812 1506 -1.87500000000000e+01 1812 1514 4.16666666666667e+00 1812 1379 -4.16666666666667e+00 1812 1513 -2.08333333333333e+00 1812 1378 2.08333333333333e+00 1812 1512 -6.25000000000000e+00 1812 1810 -2.08333333333333e+00 1812 1656 -1.25000000000000e+01 1813 1813 6.25000000000000e+01 1813 1809 -2.08333333333333e+00 1813 1649 -8.33333333333333e+00 1813 1647 4.16666666666667e+00 1813 1820 -2.08333333333333e+00 1813 1379 2.08333333333333e+00 1813 1819 -6.25000000000000e+00 1813 1818 4.16666666666667e+00 1813 1812 -8.33333333333333e+00 1813 1346 2.08333333333333e+00 1813 1810 -6.25000000000000e+00 1813 1508 -2.08333333333333e+00 1813 1506 4.16666666666667e+00 1813 1646 -4.16666666666667e+00 1813 1505 4.16666666666667e+00 1813 1656 8.33333333333333e+00 1813 1503 -8.33333333333333e+00 1813 1507 -6.25000000000000e+00 1813 1344 2.08333333333333e+00 1813 1644 -4.16666666666667e+00 1813 1514 4.16666666666667e+00 1813 1814 -8.33333333333333e+00 1813 1658 8.33333333333333e+00 1813 1513 -6.25000000000000e+00 1813 1811 4.16666666666667e+00 1813 1657 -3.75000000000000e+01 1813 1512 -2.08333333333333e+00 1813 1377 2.08333333333333e+00 1814 1814 6.25000000000000e+01 1814 1647 4.16666666666667e+00 1814 1648 -8.33333333333333e+00 1814 1820 -6.25000000000000e+00 1814 1819 -2.08333333333333e+00 1814 1378 2.08333333333333e+00 1814 1818 4.16666666666667e+00 1814 1811 -1.87500000000000e+01 1814 1345 2.08333333333333e+00 1814 1809 4.16666666666667e+00 1814 1656 -4.16666666666667e+00 1814 1507 -2.08333333333333e+00 1814 1812 -8.33333333333333e+00 1814 1644 -4.16666666666667e+00 1814 1503 4.16666666666667e+00 1814 1645 -4.16666666666667e+00 1814 1504 4.16666666666667e+00 1814 1508 -6.25000000000000e+00 1814 1506 4.16666666666667e+00 1814 1344 -4.16666666666667e+00 1814 1514 -1.87500000000000e+01 1814 1810 4.16666666666667e+00 1814 1658 -1.25000000000000e+01 1814 1513 4.16666666666667e+00 1814 1813 -8.33333333333333e+00 1814 1657 8.33333333333333e+00 1814 1512 4.16666666666667e+00 1814 1377 -4.16666666666667e+00 1815 1815 6.25000000000000e+01 1815 1807 -2.08333333333333e+00 1815 1806 -6.25000000000000e+00 1815 1805 -4.16666666666667e+00 1815 1804 2.08333333333333e+00 1815 1603 4.16666666666667e+00 1815 1600 -4.16666666666667e+00 1815 1604 4.16666666666667e+00 1815 1601 -4.16666666666667e+00 1815 1664 4.16666666666667e+00 1815 1667 -4.16666666666667e+00 1815 1525 2.08333333333333e+00 1815 1522 -2.08333333333333e+00 1815 1355 4.16666666666667e+00 1815 1526 -4.16666666666667e+00 1815 1354 4.16666666666667e+00 1815 1816 -8.33333333333333e+00 1815 1666 8.33333333333333e+00 1815 1353 -1.87500000000000e+01 1815 1665 -1.25000000000000e+01 1815 1817 -8.33333333333333e+00 1815 1349 4.16666666666667e+00 1815 1523 4.16666666666667e+00 1815 1348 4.16666666666667e+00 1815 1663 -8.33333333333333e+00 1815 1808 4.16666666666667e+00 1815 1347 -1.87500000000000e+01 1815 1521 -6.25000000000000e+00 1816 1816 6.25000000000000e+01 1816 1808 4.16666666666667e+00 1816 1807 -6.25000000000000e+00 1816 1806 -2.08333333333333e+00 1816 1803 2.08333333333333e+00 1816 1602 4.16666666666667e+00 1816 1599 -4.16666666666667e+00 1816 1601 -4.16666666666667e+00 1816 1604 -8.33333333333333e+00 1816 1817 -8.33333333333333e+00 1816 1667 8.33333333333333e+00 1816 1523 4.16666666666667e+00 1816 1524 2.08333333333333e+00 1816 1521 -2.08333333333333e+00 1816 1355 -2.08333333333333e+00 1816 1526 2.08333333333333e+00 1816 1354 -6.25000000000000e+00 1816 1666 -3.75000000000000e+01 1816 1353 4.16666666666667e+00 1816 1815 -8.33333333333333e+00 1816 1665 8.33333333333333e+00 1816 1349 -2.08333333333333e+00 1816 1664 4.16666666666667e+00 1816 1805 2.08333333333333e+00 1816 1348 -6.25000000000000e+00 1816 1522 -6.25000000000000e+00 1816 1347 4.16666666666667e+00 1816 1662 -8.33333333333333e+00 1817 1817 6.25000000000000e+01 1817 1808 -1.87500000000000e+01 1817 1807 4.16666666666667e+00 1817 1806 4.16666666666667e+00 1817 1803 -4.16666666666667e+00 1817 1600 -4.16666666666667e+00 1817 1603 -8.33333333333333e+00 1817 1602 4.16666666666667e+00 1817 1599 -4.16666666666667e+00 1817 1662 4.16666666666667e+00 1817 1665 -4.16666666666667e+00 1817 1816 -8.33333333333333e+00 1817 1666 8.33333333333333e+00 1817 1522 4.16666666666667e+00 1817 1355 -6.25000000000000e+00 1817 1667 -1.25000000000000e+01 1817 1354 -2.08333333333333e+00 1817 1525 2.08333333333333e+00 1817 1353 4.16666666666667e+00 1817 1524 -4.16666666666667e+00 1817 1804 2.08333333333333e+00 1817 1349 -6.25000000000000e+00 1817 1523 -1.87500000000000e+01 1817 1348 -2.08333333333333e+00 1817 1663 4.16666666666667e+00 1817 1815 -8.33333333333333e+00 1817 1347 4.16666666666667e+00 1817 1521 4.16666666666667e+00 1818 1818 6.25000000000000e+01 1818 1648 -4.16666666666667e+00 1818 1658 4.16666666666667e+00 1818 1649 -4.16666666666667e+00 1818 1811 -4.16666666666667e+00 1818 1814 4.16666666666667e+00 1818 1813 4.16666666666667e+00 1818 1657 -8.33333333333333e+00 1818 1812 -1.87500000000000e+01 1818 1664 4.16666666666667e+00 1818 1676 -4.16666666666667e+00 1818 1522 4.16666666666667e+00 1818 1819 -8.33333333333333e+00 1818 1675 8.33333333333333e+00 1818 1379 4.16666666666667e+00 1818 1535 -4.16666666666667e+00 1818 1378 -2.08333333333333e+00 1818 1534 2.08333333333333e+00 1818 1377 -6.25000000000000e+00 1818 1674 -1.25000000000000e+01 1818 1820 -8.33333333333333e+00 1818 1349 4.16666666666667e+00 1818 1523 4.16666666666667e+00 1818 1348 -2.08333333333333e+00 1818 1663 4.16666666666667e+00 1818 1810 2.08333333333333e+00 1818 1347 -6.25000000000000e+00 1818 1521 -1.87500000000000e+01 1819 1819 6.25000000000000e+01 1819 1647 -4.16666666666667e+00 1819 1811 2.08333333333333e+00 1819 1649 -4.16666666666667e+00 1819 1814 -2.08333333333333e+00 1819 1658 4.16666666666667e+00 1819 1813 -6.25000000000000e+00 1819 1812 4.16666666666667e+00 1819 1656 -8.33333333333333e+00 1819 1523 -2.08333333333333e+00 1819 1535 2.08333333333333e+00 1819 1521 4.16666666666667e+00 1819 1818 -8.33333333333333e+00 1819 1674 8.33333333333333e+00 1819 1379 4.16666666666667e+00 1819 1820 -8.33333333333333e+00 1819 1676 8.33333333333333e+00 1819 1378 -6.25000000000000e+00 1819 1675 -3.75000000000000e+01 1819 1377 -2.08333333333333e+00 1819 1533 2.08333333333333e+00 1819 1349 4.16666666666667e+00 1819 1664 -8.33333333333333e+00 1819 1809 2.08333333333333e+00 1819 1348 -6.25000000000000e+00 1819 1522 -6.25000000000000e+00 1819 1347 -2.08333333333333e+00 1819 1662 4.16666666666667e+00 1820 1820 6.25000000000000e+01 1820 1647 -4.16666666666667e+00 1820 1810 2.08333333333333e+00 1820 1648 -4.16666666666667e+00 1820 1809 -4.16666666666667e+00 1820 1814 -6.25000000000000e+00 1820 1813 -2.08333333333333e+00 1820 1657 4.16666666666667e+00 1820 1812 4.16666666666667e+00 1820 1522 -2.08333333333333e+00 1820 1534 2.08333333333333e+00 1820 1662 4.16666666666667e+00 1820 1674 -4.16666666666667e+00 1820 1379 -1.87500000000000e+01 1820 1676 -1.25000000000000e+01 1820 1378 4.16666666666667e+00 1820 1819 -8.33333333333333e+00 1820 1675 8.33333333333333e+00 1820 1377 4.16666666666667e+00 1820 1533 -4.16666666666667e+00 1820 1656 4.16666666666667e+00 1820 1349 -1.87500000000000e+01 1820 1523 -6.25000000000000e+00 1820 1348 4.16666666666667e+00 1820 1663 -8.33333333333333e+00 1820 1818 -8.33333333333333e+00 1820 1347 4.16666666666667e+00 1820 1521 4.16666666666667e+00 1821 1821 6.25000000000000e+01 1821 1727 -4.16666666666667e+00 1821 1822 -8.33333333333333e+00 1821 1825 4.16666666666667e+00 1821 1726 8.33333333333333e+00 1821 1826 4.16666666666667e+00 1821 1351 -2.08333333333333e+00 1821 1723 4.16666666666667e+00 1821 1824 -1.87500000000000e+01 1821 1835 -4.16666666666667e+00 1821 1834 2.08333333333333e+00 1821 1357 -2.08333333333333e+00 1821 1725 -1.25000000000000e+01 1821 1453 2.08333333333333e+00 1821 1705 -4.16666666666667e+00 1821 1706 -4.16666666666667e+00 1821 1712 4.16666666666667e+00 1821 1352 4.16666666666667e+00 1821 1454 -4.16666666666667e+00 1821 1350 -6.25000000000000e+00 1821 1823 -8.33333333333333e+00 1821 1460 4.16666666666667e+00 1821 1358 4.16666666666667e+00 1821 1459 4.16666666666667e+00 1821 1711 -8.33333333333333e+00 1821 1724 4.16666666666667e+00 1821 1458 -1.87500000000000e+01 1821 1356 -6.25000000000000e+00 1822 1822 6.25000000000000e+01 1822 1835 2.08333333333333e+00 1822 1821 -8.33333333333333e+00 1822 1824 4.16666666666667e+00 1822 1725 8.33333333333333e+00 1822 1352 4.16666666666667e+00 1822 1724 -8.33333333333333e+00 1822 1825 -6.25000000000000e+00 1822 1350 -2.08333333333333e+00 1822 1722 4.16666666666667e+00 1822 1823 -8.33333333333333e+00 1822 1727 8.33333333333333e+00 1822 1358 4.16666666666667e+00 1822 1726 -3.75000000000000e+01 1822 1833 2.08333333333333e+00 1822 1356 -2.08333333333333e+00 1822 1452 2.08333333333333e+00 1822 1704 -4.16666666666667e+00 1822 1454 2.08333333333333e+00 1822 1706 -4.16666666666667e+00 1822 1351 -6.25000000000000e+00 1822 1460 -2.08333333333333e+00 1822 1712 4.16666666666667e+00 1822 1826 -2.08333333333333e+00 1822 1459 -6.25000000000000e+00 1822 1357 -6.25000000000000e+00 1822 1458 4.16666666666667e+00 1822 1710 -8.33333333333333e+00 1823 1823 6.25000000000000e+01 1823 1725 -4.16666666666667e+00 1823 1825 -2.08333333333333e+00 1823 1834 2.08333333333333e+00 1823 1826 -6.25000000000000e+00 1823 1351 4.16666666666667e+00 1823 1723 -8.33333333333333e+00 1823 1824 4.16666666666667e+00 1823 1727 -1.25000000000000e+01 1823 1822 -8.33333333333333e+00 1823 1726 8.33333333333333e+00 1823 1357 4.16666666666667e+00 1823 1833 -4.16666666666667e+00 1823 1704 -4.16666666666667e+00 1823 1710 4.16666666666667e+00 1823 1352 -1.87500000000000e+01 1823 1453 2.08333333333333e+00 1823 1705 -4.16666666666667e+00 1823 1350 4.16666666666667e+00 1823 1452 -4.16666666666667e+00 1823 1722 4.16666666666667e+00 1823 1460 -6.25000000000000e+00 1823 1358 -1.87500000000000e+01 1823 1459 -2.08333333333333e+00 1823 1711 4.16666666666667e+00 1823 1821 -8.33333333333333e+00 1823 1458 4.16666666666667e+00 1823 1356 4.16666666666667e+00 1824 1824 6.25000000000000e+01 1824 1822 4.16666666666667e+00 1824 1726 -8.33333333333333e+00 1824 1823 4.16666666666667e+00 1824 1351 2.08333333333333e+00 1824 1821 -1.87500000000000e+01 1824 1835 4.16666666666667e+00 1824 1834 -2.08333333333333e+00 1824 1833 -6.25000000000000e+00 1824 1723 -4.16666666666667e+00 1824 1724 -4.16666666666667e+00 1824 1826 -8.33333333333333e+00 1824 1465 -2.08333333333333e+00 1824 1462 4.16666666666667e+00 1824 1463 4.16666666666667e+00 1824 1730 -4.16666666666667e+00 1824 1466 4.16666666666667e+00 1824 1352 -4.16666666666667e+00 1824 1464 -6.25000000000000e+00 1824 1825 -8.33333333333333e+00 1824 1729 8.33333333333333e+00 1824 1727 4.16666666666667e+00 1824 1728 -1.25000000000000e+01 1824 91 2.08333333333333e+00 1824 200 4.16666666666667e+00 1824 92 -4.16666666666667e+00 1824 199 4.16666666666667e+00 1824 198 -1.87500000000000e+01 1825 1825 6.25000000000000e+01 1825 1727 4.16666666666667e+00 1825 1821 4.16666666666667e+00 1825 1725 -8.33333333333333e+00 1825 1822 -6.25000000000000e+00 1825 1350 2.08333333333333e+00 1825 1826 -8.33333333333333e+00 1825 1835 4.16666666666667e+00 1825 1834 -6.25000000000000e+00 1825 1833 -2.08333333333333e+00 1825 1722 -4.16666666666667e+00 1825 1466 4.16666666666667e+00 1825 1464 -2.08333333333333e+00 1825 1461 4.16666666666667e+00 1825 1463 -8.33333333333333e+00 1825 1730 8.33333333333333e+00 1825 1352 2.08333333333333e+00 1825 1724 -4.16666666666667e+00 1825 1465 -6.25000000000000e+00 1825 1823 -2.08333333333333e+00 1825 1729 -3.75000000000000e+01 1825 1824 -8.33333333333333e+00 1825 1728 8.33333333333333e+00 1825 90 2.08333333333333e+00 1825 200 -2.08333333333333e+00 1825 92 2.08333333333333e+00 1825 199 -6.25000000000000e+00 1825 198 4.16666666666667e+00 1826 1826 6.25000000000000e+01 1826 1822 -2.08333333333333e+00 1826 1726 4.16666666666667e+00 1826 1823 -6.25000000000000e+00 1826 1821 4.16666666666667e+00 1826 1835 -1.87500000000000e+01 1826 1825 -8.33333333333333e+00 1826 1834 4.16666666666667e+00 1826 1833 4.16666666666667e+00 1826 1722 -4.16666666666667e+00 1826 1465 4.16666666666667e+00 1826 1824 -8.33333333333333e+00 1826 1462 -8.33333333333333e+00 1826 1729 8.33333333333333e+00 1826 1461 4.16666666666667e+00 1826 1728 -4.16666666666667e+00 1826 1466 -1.87500000000000e+01 1826 1351 2.08333333333333e+00 1826 1723 -4.16666666666667e+00 1826 1464 4.16666666666667e+00 1826 1350 -4.16666666666667e+00 1826 1725 4.16666666666667e+00 1826 1730 -1.25000000000000e+01 1826 200 -6.25000000000000e+00 1826 199 -2.08333333333333e+00 1826 91 2.08333333333333e+00 1826 198 4.16666666666667e+00 1826 90 -4.16666666666667e+00 1827 1827 6.25000000000000e+01 1827 1837 2.08333333333333e+00 1827 1838 -4.16666666666667e+00 1827 1832 4.16666666666667e+00 1827 1830 -6.25000000000000e+00 1827 1775 -4.16666666666667e+00 1827 1357 4.16666666666667e+00 1827 1828 -8.33333333333333e+00 1827 1774 8.33333333333333e+00 1827 1773 -1.25000000000000e+01 1827 1772 4.16666666666667e+00 1827 1354 4.16666666666667e+00 1827 1771 -8.33333333333333e+00 1827 1712 4.16666666666667e+00 1827 1709 -4.16666666666667e+00 1827 1355 4.16666666666667e+00 1827 1457 -4.16666666666667e+00 1827 1456 2.08333333333333e+00 1827 1708 -4.16666666666667e+00 1827 1353 -1.87500000000000e+01 1827 1829 -8.33333333333333e+00 1827 1460 4.16666666666667e+00 1827 1358 4.16666666666667e+00 1827 1459 -2.08333333333333e+00 1827 1711 4.16666666666667e+00 1827 1831 -2.08333333333333e+00 1827 1458 -6.25000000000000e+00 1827 1356 -1.87500000000000e+01 1828 1828 6.25000000000000e+01 1828 1829 -8.33333333333333e+00 1828 1830 -2.08333333333333e+00 1828 1836 2.08333333333333e+00 1828 1358 -2.08333333333333e+00 1828 1838 2.08333333333333e+00 1828 1355 -2.08333333333333e+00 1828 1831 -6.25000000000000e+00 1828 1772 4.16666666666667e+00 1828 1775 8.33333333333333e+00 1828 1774 -3.75000000000000e+01 1828 1356 4.16666666666667e+00 1828 1827 -8.33333333333333e+00 1828 1773 8.33333333333333e+00 1828 1353 4.16666666666667e+00 1828 1770 -8.33333333333333e+00 1828 1457 2.08333333333333e+00 1828 1709 -4.16666666666667e+00 1828 1354 -6.25000000000000e+00 1828 1455 2.08333333333333e+00 1828 1707 -4.16666666666667e+00 1828 1460 4.16666666666667e+00 1828 1712 -8.33333333333333e+00 1828 1832 4.16666666666667e+00 1828 1459 -6.25000000000000e+00 1828 1357 -6.25000000000000e+00 1828 1458 -2.08333333333333e+00 1828 1710 4.16666666666667e+00 1829 1829 6.25000000000000e+01 1829 1828 -8.33333333333333e+00 1829 1357 -2.08333333333333e+00 1829 1837 2.08333333333333e+00 1829 1836 -4.16666666666667e+00 1829 1832 -1.87500000000000e+01 1829 1354 -2.08333333333333e+00 1829 1830 4.16666666666667e+00 1829 1771 4.16666666666667e+00 1829 1775 -1.25000000000000e+01 1829 1774 8.33333333333333e+00 1829 1773 -4.16666666666667e+00 1829 1770 4.16666666666667e+00 1829 1710 4.16666666666667e+00 1829 1707 -4.16666666666667e+00 1829 1456 2.08333333333333e+00 1829 1708 -4.16666666666667e+00 1829 1355 -6.25000000000000e+00 1829 1353 4.16666666666667e+00 1829 1455 -4.16666666666667e+00 1829 1831 4.16666666666667e+00 1829 1460 -1.87500000000000e+01 1829 1358 -6.25000000000000e+00 1829 1459 4.16666666666667e+00 1829 1711 -8.33333333333333e+00 1829 1827 -8.33333333333333e+00 1829 1458 4.16666666666667e+00 1829 1356 4.16666666666667e+00 1830 1830 6.25000000000000e+01 1830 1775 4.16666666666667e+00 1830 1774 4.16666666666667e+00 1830 1838 4.16666666666667e+00 1830 1837 4.16666666666667e+00 1830 1831 -8.33333333333333e+00 1830 1836 -1.87500000000000e+01 1830 1829 4.16666666666667e+00 1830 1827 -6.25000000000000e+00 1830 1784 -4.16666666666667e+00 1830 1832 -8.33333333333333e+00 1830 1772 -4.16666666666667e+00 1830 1520 4.16666666666667e+00 1830 1525 4.16666666666667e+00 1830 1783 8.33333333333333e+00 1830 1519 -8.33333333333333e+00 1830 1526 4.16666666666667e+00 1830 1355 -4.16666666666667e+00 1830 1354 2.08333333333333e+00 1830 1771 -4.16666666666667e+00 1830 1524 -1.87500000000000e+01 1830 1538 4.16666666666667e+00 1830 1382 -4.16666666666667e+00 1830 1537 -2.08333333333333e+00 1830 1381 2.08333333333333e+00 1830 1536 -6.25000000000000e+00 1830 1828 -2.08333333333333e+00 1830 1782 -1.25000000000000e+01 1831 1831 6.25000000000000e+01 1831 1827 -2.08333333333333e+00 1831 1775 -8.33333333333333e+00 1831 1773 4.16666666666667e+00 1831 1838 -2.08333333333333e+00 1831 1382 2.08333333333333e+00 1831 1837 -6.25000000000000e+00 1831 1836 4.16666666666667e+00 1831 1830 -8.33333333333333e+00 1831 1355 2.08333333333333e+00 1831 1828 -6.25000000000000e+00 1831 1526 -2.08333333333333e+00 1831 1524 4.16666666666667e+00 1831 1772 -4.16666666666667e+00 1831 1520 4.16666666666667e+00 1831 1782 8.33333333333333e+00 1831 1518 -8.33333333333333e+00 1831 1525 -6.25000000000000e+00 1831 1353 2.08333333333333e+00 1831 1770 -4.16666666666667e+00 1831 1538 4.16666666666667e+00 1831 1832 -8.33333333333333e+00 1831 1784 8.33333333333333e+00 1831 1537 -6.25000000000000e+00 1831 1829 4.16666666666667e+00 1831 1783 -3.75000000000000e+01 1831 1536 -2.08333333333333e+00 1831 1380 2.08333333333333e+00 1832 1832 6.25000000000000e+01 1832 1773 4.16666666666667e+00 1832 1774 -8.33333333333333e+00 1832 1838 -6.25000000000000e+00 1832 1837 -2.08333333333333e+00 1832 1381 2.08333333333333e+00 1832 1836 4.16666666666667e+00 1832 1829 -1.87500000000000e+01 1832 1354 2.08333333333333e+00 1832 1827 4.16666666666667e+00 1832 1782 -4.16666666666667e+00 1832 1525 -2.08333333333333e+00 1832 1830 -8.33333333333333e+00 1832 1770 -4.16666666666667e+00 1832 1518 4.16666666666667e+00 1832 1771 -4.16666666666667e+00 1832 1519 4.16666666666667e+00 1832 1526 -6.25000000000000e+00 1832 1524 4.16666666666667e+00 1832 1353 -4.16666666666667e+00 1832 1538 -1.87500000000000e+01 1832 1828 4.16666666666667e+00 1832 1784 -1.25000000000000e+01 1832 1537 4.16666666666667e+00 1832 1831 -8.33333333333333e+00 1832 1783 8.33333333333333e+00 1832 1536 4.16666666666667e+00 1832 1380 -4.16666666666667e+00 1833 1833 6.25000000000000e+01 1833 1825 -2.08333333333333e+00 1833 1824 -6.25000000000000e+00 1833 1823 -4.16666666666667e+00 1833 1822 2.08333333333333e+00 1833 1729 4.16666666666667e+00 1833 1726 -4.16666666666667e+00 1833 1730 4.16666666666667e+00 1833 1727 -4.16666666666667e+00 1833 1790 4.16666666666667e+00 1833 1793 -4.16666666666667e+00 1833 1543 -2.08333333333333e+00 1833 1834 -8.33333333333333e+00 1833 1792 8.33333333333333e+00 1833 1791 -1.25000000000000e+01 1833 1835 -8.33333333333333e+00 1833 1358 4.16666666666667e+00 1833 1544 4.16666666666667e+00 1833 1357 4.16666666666667e+00 1833 1789 -8.33333333333333e+00 1833 1826 4.16666666666667e+00 1833 1356 -1.87500000000000e+01 1833 1542 -6.25000000000000e+00 1833 280 2.08333333333333e+00 1833 92 4.16666666666667e+00 1833 281 -4.16666666666667e+00 1833 91 4.16666666666667e+00 1833 90 -1.87500000000000e+01 1834 1834 6.25000000000000e+01 1834 1826 4.16666666666667e+00 1834 1825 -6.25000000000000e+00 1834 1824 -2.08333333333333e+00 1834 1821 2.08333333333333e+00 1834 1728 4.16666666666667e+00 1834 1725 -4.16666666666667e+00 1834 1727 -4.16666666666667e+00 1834 1730 -8.33333333333333e+00 1834 1835 -8.33333333333333e+00 1834 1793 8.33333333333333e+00 1834 1544 4.16666666666667e+00 1834 1542 -2.08333333333333e+00 1834 1792 -3.75000000000000e+01 1834 1833 -8.33333333333333e+00 1834 1791 8.33333333333333e+00 1834 1358 -2.08333333333333e+00 1834 1790 4.16666666666667e+00 1834 1823 2.08333333333333e+00 1834 1357 -6.25000000000000e+00 1834 1543 -6.25000000000000e+00 1834 1356 4.16666666666667e+00 1834 1788 -8.33333333333333e+00 1834 279 2.08333333333333e+00 1834 92 -2.08333333333333e+00 1834 281 2.08333333333333e+00 1834 91 -6.25000000000000e+00 1834 90 4.16666666666667e+00 1835 1835 6.25000000000000e+01 1835 1826 -1.87500000000000e+01 1835 1825 4.16666666666667e+00 1835 1824 4.16666666666667e+00 1835 1821 -4.16666666666667e+00 1835 1726 -4.16666666666667e+00 1835 1729 -8.33333333333333e+00 1835 1728 4.16666666666667e+00 1835 1725 -4.16666666666667e+00 1835 1788 4.16666666666667e+00 1835 1791 -4.16666666666667e+00 1835 1834 -8.33333333333333e+00 1835 1792 8.33333333333333e+00 1835 1543 4.16666666666667e+00 1835 1793 -1.25000000000000e+01 1835 1822 2.08333333333333e+00 1835 1358 -6.25000000000000e+00 1835 1544 -1.87500000000000e+01 1835 1357 -2.08333333333333e+00 1835 1789 4.16666666666667e+00 1835 1833 -8.33333333333333e+00 1835 1356 4.16666666666667e+00 1835 1542 4.16666666666667e+00 1835 92 -6.25000000000000e+00 1835 91 -2.08333333333333e+00 1835 280 2.08333333333333e+00 1835 90 4.16666666666667e+00 1835 279 -4.16666666666667e+00 1836 1836 6.25000000000000e+01 1836 1774 -4.16666666666667e+00 1836 1784 4.16666666666667e+00 1836 1775 -4.16666666666667e+00 1836 1829 -4.16666666666667e+00 1836 1832 4.16666666666667e+00 1836 1831 4.16666666666667e+00 1836 1783 -8.33333333333333e+00 1836 1830 -1.87500000000000e+01 1836 1790 4.16666666666667e+00 1836 1802 -4.16666666666667e+00 1836 1543 4.16666666666667e+00 1836 1837 -8.33333333333333e+00 1836 1801 8.33333333333333e+00 1836 1382 4.16666666666667e+00 1836 1550 -4.16666666666667e+00 1836 1381 -2.08333333333333e+00 1836 1549 2.08333333333333e+00 1836 1380 -6.25000000000000e+00 1836 1800 -1.25000000000000e+01 1836 1838 -8.33333333333333e+00 1836 1358 4.16666666666667e+00 1836 1544 4.16666666666667e+00 1836 1357 -2.08333333333333e+00 1836 1789 4.16666666666667e+00 1836 1828 2.08333333333333e+00 1836 1356 -6.25000000000000e+00 1836 1542 -1.87500000000000e+01 1837 1837 6.25000000000000e+01 1837 1773 -4.16666666666667e+00 1837 1829 2.08333333333333e+00 1837 1775 -4.16666666666667e+00 1837 1832 -2.08333333333333e+00 1837 1784 4.16666666666667e+00 1837 1831 -6.25000000000000e+00 1837 1830 4.16666666666667e+00 1837 1782 -8.33333333333333e+00 1837 1544 -2.08333333333333e+00 1837 1550 2.08333333333333e+00 1837 1542 4.16666666666667e+00 1837 1836 -8.33333333333333e+00 1837 1800 8.33333333333333e+00 1837 1382 4.16666666666667e+00 1837 1838 -8.33333333333333e+00 1837 1802 8.33333333333333e+00 1837 1381 -6.25000000000000e+00 1837 1801 -3.75000000000000e+01 1837 1380 -2.08333333333333e+00 1837 1548 2.08333333333333e+00 1837 1358 4.16666666666667e+00 1837 1790 -8.33333333333333e+00 1837 1827 2.08333333333333e+00 1837 1357 -6.25000000000000e+00 1837 1543 -6.25000000000000e+00 1837 1356 -2.08333333333333e+00 1837 1788 4.16666666666667e+00 1838 1838 6.25000000000000e+01 1838 1773 -4.16666666666667e+00 1838 1828 2.08333333333333e+00 1838 1774 -4.16666666666667e+00 1838 1827 -4.16666666666667e+00 1838 1832 -6.25000000000000e+00 1838 1831 -2.08333333333333e+00 1838 1783 4.16666666666667e+00 1838 1830 4.16666666666667e+00 1838 1543 -2.08333333333333e+00 1838 1549 2.08333333333333e+00 1838 1788 4.16666666666667e+00 1838 1800 -4.16666666666667e+00 1838 1382 -1.87500000000000e+01 1838 1802 -1.25000000000000e+01 1838 1381 4.16666666666667e+00 1838 1837 -8.33333333333333e+00 1838 1801 8.33333333333333e+00 1838 1380 4.16666666666667e+00 1838 1548 -4.16666666666667e+00 1838 1782 4.16666666666667e+00 1838 1358 -1.87500000000000e+01 1838 1544 -6.25000000000000e+00 1838 1357 4.16666666666667e+00 1838 1789 -8.33333333333333e+00 1838 1836 -8.33333333333333e+00 1838 1356 4.16666666666667e+00 1838 1542 4.16666666666667e+00 1839 1839 6.25000000000000e+01 1839 1636 -4.16666666666667e+00 1839 1844 4.16666666666667e+00 1839 1841 -8.33333333333333e+00 1839 1637 8.33333333333333e+00 1839 1634 4.16666666666667e+00 1839 1361 -2.08333333333333e+00 1839 1843 4.16666666666667e+00 1839 1842 -1.87500000000000e+01 1839 1853 2.08333333333333e+00 1839 1367 -2.08333333333333e+00 1839 1852 -4.16666666666667e+00 1839 1635 -1.25000000000000e+01 1839 1616 -4.16666666666667e+00 1839 1472 2.08333333333333e+00 1839 1615 -4.16666666666667e+00 1839 1621 4.16666666666667e+00 1839 1471 -4.16666666666667e+00 1839 1360 4.16666666666667e+00 1839 1359 -6.25000000000000e+00 1839 1478 4.16666666666667e+00 1839 1622 -8.33333333333333e+00 1839 1477 4.16666666666667e+00 1839 1840 -8.33333333333333e+00 1839 1366 4.16666666666667e+00 1839 1476 -1.87500000000000e+01 1839 1633 4.16666666666667e+00 1839 1365 -6.25000000000000e+00 1840 1840 6.25000000000000e+01 1840 1635 -4.16666666666667e+00 1840 1844 -2.08333333333333e+00 1840 1853 2.08333333333333e+00 1840 1634 -8.33333333333333e+00 1840 1361 4.16666666666667e+00 1840 1843 -6.25000000000000e+00 1840 1842 4.16666666666667e+00 1840 1637 8.33333333333333e+00 1840 1841 -8.33333333333333e+00 1840 1367 4.16666666666667e+00 1840 1636 -1.25000000000000e+01 1840 1851 -4.16666666666667e+00 1840 1614 -4.16666666666667e+00 1840 1620 4.16666666666667e+00 1840 1472 2.08333333333333e+00 1840 1616 -4.16666666666667e+00 1840 1360 -1.87500000000000e+01 1840 1470 -4.16666666666667e+00 1840 1359 4.16666666666667e+00 1840 1478 -2.08333333333333e+00 1840 1622 4.16666666666667e+00 1840 1477 -6.25000000000000e+00 1840 1632 4.16666666666667e+00 1840 1366 -1.87500000000000e+01 1840 1476 4.16666666666667e+00 1840 1839 -8.33333333333333e+00 1840 1365 4.16666666666667e+00 1841 1841 6.25000000000000e+01 1841 1852 2.08333333333333e+00 1841 1842 4.16666666666667e+00 1841 1839 -8.33333333333333e+00 1841 1635 8.33333333333333e+00 1841 1844 -6.25000000000000e+00 1841 1633 -8.33333333333333e+00 1841 1360 4.16666666666667e+00 1841 1632 4.16666666666667e+00 1841 1359 -2.08333333333333e+00 1841 1637 -3.75000000000000e+01 1841 1636 8.33333333333333e+00 1841 1840 -8.33333333333333e+00 1841 1366 4.16666666666667e+00 1841 1851 2.08333333333333e+00 1841 1365 -2.08333333333333e+00 1841 1614 -4.16666666666667e+00 1841 1470 2.08333333333333e+00 1841 1361 -6.25000000000000e+00 1841 1471 2.08333333333333e+00 1841 1615 -4.16666666666667e+00 1841 1478 -6.25000000000000e+00 1841 1843 -2.08333333333333e+00 1841 1367 -6.25000000000000e+00 1841 1477 -2.08333333333333e+00 1841 1621 4.16666666666667e+00 1841 1476 4.16666666666667e+00 1841 1620 -8.33333333333333e+00 1842 1842 6.25000000000000e+01 1842 1841 4.16666666666667e+00 1842 1637 -8.33333333333333e+00 1842 1361 2.08333333333333e+00 1842 1840 4.16666666666667e+00 1842 1839 -1.87500000000000e+01 1842 1373 2.08333333333333e+00 1842 1853 -2.08333333333333e+00 1842 1852 4.16666666666667e+00 1842 1851 -6.25000000000000e+00 1842 1634 -4.16666666666667e+00 1842 1633 -4.16666666666667e+00 1842 1481 4.16666666666667e+00 1842 1487 -2.08333333333333e+00 1842 1843 -8.33333333333333e+00 1842 1480 4.16666666666667e+00 1842 1639 -4.16666666666667e+00 1842 1360 -4.16666666666667e+00 1842 1486 4.16666666666667e+00 1842 1485 -6.25000000000000e+00 1842 1844 -8.33333333333333e+00 1842 1493 4.16666666666667e+00 1842 1640 8.33333333333333e+00 1842 1492 4.16666666666667e+00 1842 1372 -4.16666666666667e+00 1842 1636 4.16666666666667e+00 1842 1491 -1.87500000000000e+01 1842 1638 -1.25000000000000e+01 1843 1843 6.25000000000000e+01 1843 1841 -2.08333333333333e+00 1843 1637 4.16666666666667e+00 1843 1840 -6.25000000000000e+00 1843 1839 4.16666666666667e+00 1843 1844 -8.33333333333333e+00 1843 1853 4.16666666666667e+00 1843 1852 -1.87500000000000e+01 1843 1851 4.16666666666667e+00 1843 1632 -4.16666666666667e+00 1843 1487 4.16666666666667e+00 1843 1842 -8.33333333333333e+00 1843 1481 -8.33333333333333e+00 1843 1640 8.33333333333333e+00 1843 1479 4.16666666666667e+00 1843 1638 -4.16666666666667e+00 1843 1361 2.08333333333333e+00 1843 1634 -4.16666666666667e+00 1843 1486 -1.87500000000000e+01 1843 1359 -4.16666666666667e+00 1843 1485 4.16666666666667e+00 1843 1493 -2.08333333333333e+00 1843 1373 2.08333333333333e+00 1843 1635 4.16666666666667e+00 1843 1492 -6.25000000000000e+00 1843 1639 -1.25000000000000e+01 1843 1491 4.16666666666667e+00 1843 1371 -4.16666666666667e+00 1844 1844 6.25000000000000e+01 1844 1636 4.16666666666667e+00 1844 1839 4.16666666666667e+00 1844 1635 -8.33333333333333e+00 1844 1841 -6.25000000000000e+00 1844 1359 2.08333333333333e+00 1844 1853 -6.25000000000000e+00 1844 1843 -8.33333333333333e+00 1844 1852 4.16666666666667e+00 1844 1371 2.08333333333333e+00 1844 1851 -2.08333333333333e+00 1844 1632 -4.16666666666667e+00 1844 1486 4.16666666666667e+00 1844 1479 4.16666666666667e+00 1844 1485 -2.08333333333333e+00 1844 1480 -8.33333333333333e+00 1844 1639 8.33333333333333e+00 1844 1487 -6.25000000000000e+00 1844 1360 2.08333333333333e+00 1844 1633 -4.16666666666667e+00 1844 1840 -2.08333333333333e+00 1844 1493 -6.25000000000000e+00 1844 1640 -3.75000000000000e+01 1844 1492 -2.08333333333333e+00 1844 1372 2.08333333333333e+00 1844 1842 -8.33333333333333e+00 1844 1491 4.16666666666667e+00 1844 1638 8.33333333333333e+00 1845 1845 6.25000000000000e+01 1845 1654 -4.16666666666667e+00 1845 1850 -2.08333333333333e+00 1845 1856 2.08333333333333e+00 1845 1364 4.16666666666667e+00 1845 1652 -8.33333333333333e+00 1845 1849 4.16666666666667e+00 1845 1848 -6.25000000000000e+00 1845 1847 -8.33333333333333e+00 1845 1655 8.33333333333333e+00 1845 1367 4.16666666666667e+00 1845 1855 -4.16666666666667e+00 1845 1653 -1.25000000000000e+01 1845 1618 -4.16666666666667e+00 1845 1621 4.16666666666667e+00 1845 1475 2.08333333333333e+00 1845 1619 -4.16666666666667e+00 1845 1363 4.16666666666667e+00 1845 1474 -4.16666666666667e+00 1845 1362 -1.87500000000000e+01 1845 1478 -2.08333333333333e+00 1845 1622 4.16666666666667e+00 1845 1846 -8.33333333333333e+00 1845 1477 4.16666666666667e+00 1845 1366 4.16666666666667e+00 1845 1651 4.16666666666667e+00 1845 1476 -6.25000000000000e+00 1845 1365 -1.87500000000000e+01 1846 1846 6.25000000000000e+01 1846 1653 -4.16666666666667e+00 1846 1847 -8.33333333333333e+00 1846 1850 4.16666666666667e+00 1846 1655 8.33333333333333e+00 1846 1364 -2.08333333333333e+00 1846 1652 4.16666666666667e+00 1846 1849 -1.87500000000000e+01 1846 1848 4.16666666666667e+00 1846 1856 2.08333333333333e+00 1846 1367 -2.08333333333333e+00 1846 1654 -1.25000000000000e+01 1846 1854 -4.16666666666667e+00 1846 1475 2.08333333333333e+00 1846 1619 -4.16666666666667e+00 1846 1617 -4.16666666666667e+00 1846 1620 4.16666666666667e+00 1846 1363 -6.25000000000000e+00 1846 1362 4.16666666666667e+00 1846 1473 -4.16666666666667e+00 1846 1478 4.16666666666667e+00 1846 1622 -8.33333333333333e+00 1846 1650 4.16666666666667e+00 1846 1477 -1.87500000000000e+01 1846 1366 -6.25000000000000e+00 1846 1845 -8.33333333333333e+00 1846 1476 4.16666666666667e+00 1846 1365 4.16666666666667e+00 1847 1847 6.25000000000000e+01 1847 1849 4.16666666666667e+00 1847 1654 8.33333333333333e+00 1847 1848 -2.08333333333333e+00 1847 1854 2.08333333333333e+00 1847 1850 -6.25000000000000e+00 1847 1363 -2.08333333333333e+00 1847 1651 4.16666666666667e+00 1847 1362 4.16666666666667e+00 1847 1650 -8.33333333333333e+00 1847 1655 -3.75000000000000e+01 1847 1855 2.08333333333333e+00 1847 1366 -2.08333333333333e+00 1847 1845 -8.33333333333333e+00 1847 1653 8.33333333333333e+00 1847 1365 4.16666666666667e+00 1847 1474 2.08333333333333e+00 1847 1618 -4.16666666666667e+00 1847 1364 -6.25000000000000e+00 1847 1473 2.08333333333333e+00 1847 1617 -4.16666666666667e+00 1847 1846 -8.33333333333333e+00 1847 1478 -6.25000000000000e+00 1847 1367 -6.25000000000000e+00 1847 1477 4.16666666666667e+00 1847 1621 -8.33333333333333e+00 1847 1476 -2.08333333333333e+00 1847 1620 4.16666666666667e+00 1848 1848 6.25000000000000e+01 1848 1847 -2.08333333333333e+00 1848 1655 4.16666666666667e+00 1848 1846 4.16666666666667e+00 1848 1845 -6.25000000000000e+00 1848 1850 -8.33333333333333e+00 1848 1856 4.16666666666667e+00 1848 1855 4.16666666666667e+00 1848 1854 -1.87500000000000e+01 1848 1651 -4.16666666666667e+00 1848 1511 4.16666666666667e+00 1848 1849 -8.33333333333333e+00 1848 1505 -8.33333333333333e+00 1848 1658 8.33333333333333e+00 1848 1504 4.16666666666667e+00 1848 1657 -4.16666666666667e+00 1848 1364 2.08333333333333e+00 1848 1652 -4.16666666666667e+00 1848 1510 4.16666666666667e+00 1848 1363 -4.16666666666667e+00 1848 1509 -1.87500000000000e+01 1848 1514 -2.08333333333333e+00 1848 1379 2.08333333333333e+00 1848 1513 4.16666666666667e+00 1848 1378 -4.16666666666667e+00 1848 1512 -6.25000000000000e+00 1848 1654 4.16666666666667e+00 1848 1656 -1.25000000000000e+01 1849 1849 6.25000000000000e+01 1849 1847 4.16666666666667e+00 1849 1655 -8.33333333333333e+00 1849 1364 2.08333333333333e+00 1849 1846 -1.87500000000000e+01 1849 1845 4.16666666666667e+00 1849 1379 2.08333333333333e+00 1849 1856 -2.08333333333333e+00 1849 1855 -6.25000000000000e+00 1849 1854 4.16666666666667e+00 1849 1652 -4.16666666666667e+00 1849 1650 -4.16666666666667e+00 1849 1511 -2.08333333333333e+00 1849 1505 4.16666666666667e+00 1849 1848 -8.33333333333333e+00 1849 1503 4.16666666666667e+00 1849 1656 -4.16666666666667e+00 1849 1510 -6.25000000000000e+00 1849 1509 4.16666666666667e+00 1849 1362 -4.16666666666667e+00 1849 1514 4.16666666666667e+00 1849 1850 -8.33333333333333e+00 1849 1658 8.33333333333333e+00 1849 1513 -1.87500000000000e+01 1849 1653 4.16666666666667e+00 1849 1657 -1.25000000000000e+01 1849 1512 4.16666666666667e+00 1849 1377 -4.16666666666667e+00 1850 1850 6.25000000000000e+01 1850 1654 -8.33333333333333e+00 1850 1845 -2.08333333333333e+00 1850 1653 4.16666666666667e+00 1850 1847 -6.25000000000000e+00 1850 1363 2.08333333333333e+00 1850 1856 -6.25000000000000e+00 1850 1378 2.08333333333333e+00 1850 1855 -2.08333333333333e+00 1850 1848 -8.33333333333333e+00 1850 1854 4.16666666666667e+00 1850 1651 -4.16666666666667e+00 1850 1510 -2.08333333333333e+00 1850 1504 4.16666666666667e+00 1850 1509 4.16666666666667e+00 1850 1503 -8.33333333333333e+00 1850 1656 8.33333333333333e+00 1850 1511 -6.25000000000000e+00 1850 1362 2.08333333333333e+00 1850 1650 -4.16666666666667e+00 1850 1514 -6.25000000000000e+00 1850 1846 4.16666666666667e+00 1850 1658 -3.75000000000000e+01 1850 1513 4.16666666666667e+00 1850 1849 -8.33333333333333e+00 1850 1657 8.33333333333333e+00 1850 1512 -2.08333333333333e+00 1850 1377 2.08333333333333e+00 1851 1851 6.25000000000000e+01 1851 1843 4.16666666666667e+00 1851 1842 -6.25000000000000e+00 1851 1841 2.08333333333333e+00 1851 1840 -4.16666666666667e+00 1851 1640 4.16666666666667e+00 1851 1637 -4.16666666666667e+00 1851 1639 4.16666666666667e+00 1851 1636 -4.16666666666667e+00 1851 1672 -4.16666666666667e+00 1851 1669 4.16666666666667e+00 1851 1532 2.08333333333333e+00 1851 1529 -2.08333333333333e+00 1851 1367 4.16666666666667e+00 1851 1670 -8.33333333333333e+00 1851 1366 4.16666666666667e+00 1851 1852 -8.33333333333333e+00 1851 1528 4.16666666666667e+00 1851 1365 -1.87500000000000e+01 1851 1527 -6.25000000000000e+00 1851 1853 -8.33333333333333e+00 1851 1373 4.16666666666667e+00 1851 1673 8.33333333333333e+00 1851 1372 4.16666666666667e+00 1851 1531 -4.16666666666667e+00 1851 1844 -2.08333333333333e+00 1851 1371 -1.87500000000000e+01 1851 1671 -1.25000000000000e+01 1852 1852 6.25000000000000e+01 1852 1844 4.16666666666667e+00 1852 1843 -1.87500000000000e+01 1852 1842 4.16666666666667e+00 1852 1839 -4.16666666666667e+00 1852 1637 -4.16666666666667e+00 1852 1640 -8.33333333333333e+00 1852 1638 4.16666666666667e+00 1852 1635 -4.16666666666667e+00 1852 1671 -4.16666666666667e+00 1852 1668 4.16666666666667e+00 1852 1673 8.33333333333333e+00 1852 1853 -8.33333333333333e+00 1852 1529 4.16666666666667e+00 1852 1367 -2.08333333333333e+00 1852 1670 4.16666666666667e+00 1852 1366 -6.25000000000000e+00 1852 1528 -1.87500000000000e+01 1852 1365 4.16666666666667e+00 1852 1851 -8.33333333333333e+00 1852 1527 4.16666666666667e+00 1852 1373 -2.08333333333333e+00 1852 1532 2.08333333333333e+00 1852 1841 2.08333333333333e+00 1852 1372 -6.25000000000000e+00 1852 1672 -1.25000000000000e+01 1852 1371 4.16666666666667e+00 1852 1530 -4.16666666666667e+00 1853 1853 6.25000000000000e+01 1853 1844 -6.25000000000000e+00 1853 1843 4.16666666666667e+00 1853 1842 -2.08333333333333e+00 1853 1839 2.08333333333333e+00 1853 1638 4.16666666666667e+00 1853 1635 -4.16666666666667e+00 1853 1636 -4.16666666666667e+00 1853 1639 -8.33333333333333e+00 1853 1672 8.33333333333333e+00 1853 1852 -8.33333333333333e+00 1853 1528 4.16666666666667e+00 1853 1530 2.08333333333333e+00 1853 1527 -2.08333333333333e+00 1853 1367 -6.25000000000000e+00 1853 1529 -6.25000000000000e+00 1853 1366 -2.08333333333333e+00 1853 1669 4.16666666666667e+00 1853 1365 4.16666666666667e+00 1853 1668 -8.33333333333333e+00 1853 1840 2.08333333333333e+00 1853 1373 -6.25000000000000e+00 1853 1673 -3.75000000000000e+01 1853 1372 -2.08333333333333e+00 1853 1531 2.08333333333333e+00 1853 1851 -8.33333333333333e+00 1853 1371 4.16666666666667e+00 1853 1671 8.33333333333333e+00 1854 1854 6.25000000000000e+01 1854 1850 4.16666666666667e+00 1854 1849 4.16666666666667e+00 1854 1848 -1.87500000000000e+01 1854 1846 -4.16666666666667e+00 1854 1655 -4.16666666666667e+00 1854 1658 -8.33333333333333e+00 1854 1657 4.16666666666667e+00 1854 1654 -4.16666666666667e+00 1854 1669 4.16666666666667e+00 1854 1675 -4.16666666666667e+00 1854 1856 -8.33333333333333e+00 1854 1676 8.33333333333333e+00 1854 1529 4.16666666666667e+00 1854 1379 -2.08333333333333e+00 1854 1535 2.08333333333333e+00 1854 1378 4.16666666666667e+00 1854 1534 -4.16666666666667e+00 1854 1377 -6.25000000000000e+00 1854 1674 -1.25000000000000e+01 1854 1367 -2.08333333333333e+00 1854 1670 4.16666666666667e+00 1854 1855 -8.33333333333333e+00 1854 1366 4.16666666666667e+00 1854 1528 4.16666666666667e+00 1854 1847 2.08333333333333e+00 1854 1365 -6.25000000000000e+00 1854 1527 -1.87500000000000e+01 1855 1855 6.25000000000000e+01 1855 1849 -6.25000000000000e+00 1855 1848 4.16666666666667e+00 1855 1847 2.08333333333333e+00 1855 1845 -4.16666666666667e+00 1855 1658 4.16666666666667e+00 1855 1655 -4.16666666666667e+00 1855 1656 4.16666666666667e+00 1855 1653 -4.16666666666667e+00 1855 1668 4.16666666666667e+00 1855 1674 -4.16666666666667e+00 1855 1535 2.08333333333333e+00 1855 1529 -2.08333333333333e+00 1855 1379 4.16666666666667e+00 1855 1856 -8.33333333333333e+00 1855 1676 8.33333333333333e+00 1855 1378 -1.87500000000000e+01 1855 1675 -1.25000000000000e+01 1855 1377 4.16666666666667e+00 1855 1533 -4.16666666666667e+00 1855 1367 4.16666666666667e+00 1855 1670 -8.33333333333333e+00 1855 1850 -2.08333333333333e+00 1855 1366 -1.87500000000000e+01 1855 1528 -6.25000000000000e+00 1855 1854 -8.33333333333333e+00 1855 1365 4.16666666666667e+00 1855 1527 4.16666666666667e+00 1856 1856 6.25000000000000e+01 1856 1850 -6.25000000000000e+00 1856 1849 -2.08333333333333e+00 1856 1848 4.16666666666667e+00 1856 1846 2.08333333333333e+00 1856 1657 4.16666666666667e+00 1856 1654 -4.16666666666667e+00 1856 1653 -4.16666666666667e+00 1856 1656 -8.33333333333333e+00 1856 1534 2.08333333333333e+00 1856 1528 -2.08333333333333e+00 1856 1854 -8.33333333333333e+00 1856 1674 8.33333333333333e+00 1856 1527 4.16666666666667e+00 1856 1379 -6.25000000000000e+00 1856 1676 -3.75000000000000e+01 1856 1378 4.16666666666667e+00 1856 1855 -8.33333333333333e+00 1856 1675 8.33333333333333e+00 1856 1377 -2.08333333333333e+00 1856 1533 2.08333333333333e+00 1856 1845 2.08333333333333e+00 1856 1367 -6.25000000000000e+00 1856 1529 -6.25000000000000e+00 1856 1366 4.16666666666667e+00 1856 1669 -8.33333333333333e+00 1856 1365 -2.08333333333333e+00 1856 1668 4.16666666666667e+00 1857 1857 6.25000000000000e+01 1857 1762 -4.16666666666667e+00 1857 1862 4.16666666666667e+00 1857 1859 -8.33333333333333e+00 1857 1763 8.33333333333333e+00 1857 1760 4.16666666666667e+00 1857 1370 -2.08333333333333e+00 1857 1861 4.16666666666667e+00 1857 1860 -1.87500000000000e+01 1857 1871 2.08333333333333e+00 1857 1376 -2.08333333333333e+00 1857 1870 -4.16666666666667e+00 1857 1761 -1.25000000000000e+01 1857 1742 -4.16666666666667e+00 1857 1490 2.08333333333333e+00 1857 1741 -4.16666666666667e+00 1857 1747 4.16666666666667e+00 1857 1489 -4.16666666666667e+00 1857 1369 4.16666666666667e+00 1857 1368 -6.25000000000000e+00 1857 1496 4.16666666666667e+00 1857 1748 -8.33333333333333e+00 1857 1495 4.16666666666667e+00 1857 1858 -8.33333333333333e+00 1857 1375 4.16666666666667e+00 1857 1494 -1.87500000000000e+01 1857 1759 4.16666666666667e+00 1857 1374 -6.25000000000000e+00 1858 1858 6.25000000000000e+01 1858 1761 -4.16666666666667e+00 1858 1862 -2.08333333333333e+00 1858 1871 2.08333333333333e+00 1858 1760 -8.33333333333333e+00 1858 1370 4.16666666666667e+00 1858 1861 -6.25000000000000e+00 1858 1860 4.16666666666667e+00 1858 1763 8.33333333333333e+00 1858 1859 -8.33333333333333e+00 1858 1376 4.16666666666667e+00 1858 1762 -1.25000000000000e+01 1858 1869 -4.16666666666667e+00 1858 1740 -4.16666666666667e+00 1858 1746 4.16666666666667e+00 1858 1490 2.08333333333333e+00 1858 1742 -4.16666666666667e+00 1858 1369 -1.87500000000000e+01 1858 1488 -4.16666666666667e+00 1858 1368 4.16666666666667e+00 1858 1496 -2.08333333333333e+00 1858 1748 4.16666666666667e+00 1858 1495 -6.25000000000000e+00 1858 1758 4.16666666666667e+00 1858 1375 -1.87500000000000e+01 1858 1494 4.16666666666667e+00 1858 1857 -8.33333333333333e+00 1858 1374 4.16666666666667e+00 1859 1859 6.25000000000000e+01 1859 1870 2.08333333333333e+00 1859 1860 4.16666666666667e+00 1859 1857 -8.33333333333333e+00 1859 1761 8.33333333333333e+00 1859 1862 -6.25000000000000e+00 1859 1759 -8.33333333333333e+00 1859 1369 4.16666666666667e+00 1859 1758 4.16666666666667e+00 1859 1368 -2.08333333333333e+00 1859 1763 -3.75000000000000e+01 1859 1762 8.33333333333333e+00 1859 1858 -8.33333333333333e+00 1859 1375 4.16666666666667e+00 1859 1869 2.08333333333333e+00 1859 1374 -2.08333333333333e+00 1859 1740 -4.16666666666667e+00 1859 1488 2.08333333333333e+00 1859 1370 -6.25000000000000e+00 1859 1489 2.08333333333333e+00 1859 1741 -4.16666666666667e+00 1859 1496 -6.25000000000000e+00 1859 1861 -2.08333333333333e+00 1859 1376 -6.25000000000000e+00 1859 1495 -2.08333333333333e+00 1859 1747 4.16666666666667e+00 1859 1494 4.16666666666667e+00 1859 1746 -8.33333333333333e+00 1860 1860 6.25000000000000e+01 1860 1859 4.16666666666667e+00 1860 1763 -8.33333333333333e+00 1860 1370 2.08333333333333e+00 1860 1858 4.16666666666667e+00 1860 1857 -1.87500000000000e+01 1860 1871 -2.08333333333333e+00 1860 1870 4.16666666666667e+00 1860 1869 -6.25000000000000e+00 1860 1760 -4.16666666666667e+00 1860 1759 -4.16666666666667e+00 1860 1499 4.16666666666667e+00 1860 1502 -2.08333333333333e+00 1860 1861 -8.33333333333333e+00 1860 1498 4.16666666666667e+00 1860 1765 -4.16666666666667e+00 1860 1369 -4.16666666666667e+00 1860 1501 4.16666666666667e+00 1860 1500 -6.25000000000000e+00 1860 1862 -8.33333333333333e+00 1860 1766 8.33333333333333e+00 1860 1762 4.16666666666667e+00 1860 1764 -1.25000000000000e+01 1860 113 2.08333333333333e+00 1860 242 4.16666666666667e+00 1860 241 4.16666666666667e+00 1860 112 -4.16666666666667e+00 1860 240 -1.87500000000000e+01 1861 1861 6.25000000000000e+01 1861 1859 -2.08333333333333e+00 1861 1763 4.16666666666667e+00 1861 1858 -6.25000000000000e+00 1861 1857 4.16666666666667e+00 1861 1862 -8.33333333333333e+00 1861 1871 4.16666666666667e+00 1861 1870 -1.87500000000000e+01 1861 1869 4.16666666666667e+00 1861 1758 -4.16666666666667e+00 1861 1502 4.16666666666667e+00 1861 1860 -8.33333333333333e+00 1861 1499 -8.33333333333333e+00 1861 1766 8.33333333333333e+00 1861 1497 4.16666666666667e+00 1861 1764 -4.16666666666667e+00 1861 1370 2.08333333333333e+00 1861 1760 -4.16666666666667e+00 1861 1501 -1.87500000000000e+01 1861 1368 -4.16666666666667e+00 1861 1500 4.16666666666667e+00 1861 1761 4.16666666666667e+00 1861 1765 -1.25000000000000e+01 1861 242 -2.08333333333333e+00 1861 113 2.08333333333333e+00 1861 241 -6.25000000000000e+00 1861 240 4.16666666666667e+00 1861 111 -4.16666666666667e+00 1862 1862 6.25000000000000e+01 1862 1762 4.16666666666667e+00 1862 1857 4.16666666666667e+00 1862 1761 -8.33333333333333e+00 1862 1859 -6.25000000000000e+00 1862 1368 2.08333333333333e+00 1862 1871 -6.25000000000000e+00 1862 1861 -8.33333333333333e+00 1862 1870 4.16666666666667e+00 1862 1869 -2.08333333333333e+00 1862 1758 -4.16666666666667e+00 1862 1501 4.16666666666667e+00 1862 1497 4.16666666666667e+00 1862 1500 -2.08333333333333e+00 1862 1498 -8.33333333333333e+00 1862 1765 8.33333333333333e+00 1862 1502 -6.25000000000000e+00 1862 1369 2.08333333333333e+00 1862 1759 -4.16666666666667e+00 1862 1858 -2.08333333333333e+00 1862 1766 -3.75000000000000e+01 1862 1860 -8.33333333333333e+00 1862 1764 8.33333333333333e+00 1862 111 2.08333333333333e+00 1862 242 -6.25000000000000e+00 1862 241 -2.08333333333333e+00 1862 112 2.08333333333333e+00 1862 240 4.16666666666667e+00 1863 1863 6.25000000000000e+01 1863 1780 -4.16666666666667e+00 1863 1868 -2.08333333333333e+00 1863 1874 2.08333333333333e+00 1863 1373 4.16666666666667e+00 1863 1778 -8.33333333333333e+00 1863 1867 4.16666666666667e+00 1863 1866 -6.25000000000000e+00 1863 1865 -8.33333333333333e+00 1863 1781 8.33333333333333e+00 1863 1376 4.16666666666667e+00 1863 1873 -4.16666666666667e+00 1863 1779 -1.25000000000000e+01 1863 1744 -4.16666666666667e+00 1863 1747 4.16666666666667e+00 1863 1493 2.08333333333333e+00 1863 1745 -4.16666666666667e+00 1863 1372 4.16666666666667e+00 1863 1492 -4.16666666666667e+00 1863 1371 -1.87500000000000e+01 1863 1496 -2.08333333333333e+00 1863 1748 4.16666666666667e+00 1863 1864 -8.33333333333333e+00 1863 1495 4.16666666666667e+00 1863 1375 4.16666666666667e+00 1863 1777 4.16666666666667e+00 1863 1494 -6.25000000000000e+00 1863 1374 -1.87500000000000e+01 1864 1864 6.25000000000000e+01 1864 1779 -4.16666666666667e+00 1864 1865 -8.33333333333333e+00 1864 1868 4.16666666666667e+00 1864 1781 8.33333333333333e+00 1864 1373 -2.08333333333333e+00 1864 1778 4.16666666666667e+00 1864 1867 -1.87500000000000e+01 1864 1866 4.16666666666667e+00 1864 1874 2.08333333333333e+00 1864 1376 -2.08333333333333e+00 1864 1780 -1.25000000000000e+01 1864 1872 -4.16666666666667e+00 1864 1493 2.08333333333333e+00 1864 1745 -4.16666666666667e+00 1864 1743 -4.16666666666667e+00 1864 1746 4.16666666666667e+00 1864 1372 -6.25000000000000e+00 1864 1371 4.16666666666667e+00 1864 1491 -4.16666666666667e+00 1864 1496 4.16666666666667e+00 1864 1748 -8.33333333333333e+00 1864 1776 4.16666666666667e+00 1864 1495 -1.87500000000000e+01 1864 1375 -6.25000000000000e+00 1864 1863 -8.33333333333333e+00 1864 1494 4.16666666666667e+00 1864 1374 4.16666666666667e+00 1865 1865 6.25000000000000e+01 1865 1867 4.16666666666667e+00 1865 1780 8.33333333333333e+00 1865 1866 -2.08333333333333e+00 1865 1872 2.08333333333333e+00 1865 1868 -6.25000000000000e+00 1865 1372 -2.08333333333333e+00 1865 1777 4.16666666666667e+00 1865 1371 4.16666666666667e+00 1865 1776 -8.33333333333333e+00 1865 1781 -3.75000000000000e+01 1865 1873 2.08333333333333e+00 1865 1375 -2.08333333333333e+00 1865 1863 -8.33333333333333e+00 1865 1779 8.33333333333333e+00 1865 1374 4.16666666666667e+00 1865 1492 2.08333333333333e+00 1865 1744 -4.16666666666667e+00 1865 1373 -6.25000000000000e+00 1865 1491 2.08333333333333e+00 1865 1743 -4.16666666666667e+00 1865 1864 -8.33333333333333e+00 1865 1496 -6.25000000000000e+00 1865 1376 -6.25000000000000e+00 1865 1495 4.16666666666667e+00 1865 1747 -8.33333333333333e+00 1865 1494 -2.08333333333333e+00 1865 1746 4.16666666666667e+00 1866 1866 6.25000000000000e+01 1866 1865 -2.08333333333333e+00 1866 1781 4.16666666666667e+00 1866 1864 4.16666666666667e+00 1866 1863 -6.25000000000000e+00 1866 1868 -8.33333333333333e+00 1866 1874 4.16666666666667e+00 1866 1873 4.16666666666667e+00 1866 1872 -1.87500000000000e+01 1866 1777 -4.16666666666667e+00 1866 1532 4.16666666666667e+00 1866 1867 -8.33333333333333e+00 1866 1520 -8.33333333333333e+00 1866 1784 8.33333333333333e+00 1866 1519 4.16666666666667e+00 1866 1783 -4.16666666666667e+00 1866 1373 2.08333333333333e+00 1866 1778 -4.16666666666667e+00 1866 1531 4.16666666666667e+00 1866 1372 -4.16666666666667e+00 1866 1530 -1.87500000000000e+01 1866 1538 -2.08333333333333e+00 1866 1382 2.08333333333333e+00 1866 1537 4.16666666666667e+00 1866 1381 -4.16666666666667e+00 1866 1536 -6.25000000000000e+00 1866 1780 4.16666666666667e+00 1866 1782 -1.25000000000000e+01 1867 1867 6.25000000000000e+01 1867 1865 4.16666666666667e+00 1867 1781 -8.33333333333333e+00 1867 1373 2.08333333333333e+00 1867 1864 -1.87500000000000e+01 1867 1863 4.16666666666667e+00 1867 1382 2.08333333333333e+00 1867 1874 -2.08333333333333e+00 1867 1873 -6.25000000000000e+00 1867 1872 4.16666666666667e+00 1867 1778 -4.16666666666667e+00 1867 1776 -4.16666666666667e+00 1867 1532 -2.08333333333333e+00 1867 1520 4.16666666666667e+00 1867 1866 -8.33333333333333e+00 1867 1518 4.16666666666667e+00 1867 1782 -4.16666666666667e+00 1867 1531 -6.25000000000000e+00 1867 1530 4.16666666666667e+00 1867 1371 -4.16666666666667e+00 1867 1538 4.16666666666667e+00 1867 1868 -8.33333333333333e+00 1867 1784 8.33333333333333e+00 1867 1537 -1.87500000000000e+01 1867 1779 4.16666666666667e+00 1867 1783 -1.25000000000000e+01 1867 1536 4.16666666666667e+00 1867 1380 -4.16666666666667e+00 1868 1868 6.25000000000000e+01 1868 1780 -8.33333333333333e+00 1868 1863 -2.08333333333333e+00 1868 1779 4.16666666666667e+00 1868 1865 -6.25000000000000e+00 1868 1372 2.08333333333333e+00 1868 1874 -6.25000000000000e+00 1868 1381 2.08333333333333e+00 1868 1873 -2.08333333333333e+00 1868 1866 -8.33333333333333e+00 1868 1872 4.16666666666667e+00 1868 1777 -4.16666666666667e+00 1868 1531 -2.08333333333333e+00 1868 1519 4.16666666666667e+00 1868 1530 4.16666666666667e+00 1868 1518 -8.33333333333333e+00 1868 1782 8.33333333333333e+00 1868 1532 -6.25000000000000e+00 1868 1371 2.08333333333333e+00 1868 1776 -4.16666666666667e+00 1868 1538 -6.25000000000000e+00 1868 1864 4.16666666666667e+00 1868 1784 -3.75000000000000e+01 1868 1537 4.16666666666667e+00 1868 1867 -8.33333333333333e+00 1868 1783 8.33333333333333e+00 1868 1536 -2.08333333333333e+00 1868 1380 2.08333333333333e+00 1869 1869 6.25000000000000e+01 1869 1861 4.16666666666667e+00 1869 1860 -6.25000000000000e+00 1869 1859 2.08333333333333e+00 1869 1858 -4.16666666666667e+00 1869 1766 4.16666666666667e+00 1869 1763 -4.16666666666667e+00 1869 1765 4.16666666666667e+00 1869 1762 -4.16666666666667e+00 1869 1798 -4.16666666666667e+00 1869 1795 4.16666666666667e+00 1869 1547 -2.08333333333333e+00 1869 1376 4.16666666666667e+00 1869 1796 -8.33333333333333e+00 1869 1375 4.16666666666667e+00 1869 1870 -8.33333333333333e+00 1869 1546 4.16666666666667e+00 1869 1374 -1.87500000000000e+01 1869 1545 -6.25000000000000e+00 1869 1871 -8.33333333333333e+00 1869 1799 8.33333333333333e+00 1869 1862 -2.08333333333333e+00 1869 1797 -1.25000000000000e+01 1869 284 2.08333333333333e+00 1869 113 4.16666666666667e+00 1869 112 4.16666666666667e+00 1869 283 -4.16666666666667e+00 1869 111 -1.87500000000000e+01 1870 1870 6.25000000000000e+01 1870 1862 4.16666666666667e+00 1870 1861 -1.87500000000000e+01 1870 1860 4.16666666666667e+00 1870 1857 -4.16666666666667e+00 1870 1763 -4.16666666666667e+00 1870 1766 -8.33333333333333e+00 1870 1764 4.16666666666667e+00 1870 1761 -4.16666666666667e+00 1870 1797 -4.16666666666667e+00 1870 1794 4.16666666666667e+00 1870 1799 8.33333333333333e+00 1870 1871 -8.33333333333333e+00 1870 1547 4.16666666666667e+00 1870 1376 -2.08333333333333e+00 1870 1796 4.16666666666667e+00 1870 1375 -6.25000000000000e+00 1870 1546 -1.87500000000000e+01 1870 1374 4.16666666666667e+00 1870 1869 -8.33333333333333e+00 1870 1545 4.16666666666667e+00 1870 1859 2.08333333333333e+00 1870 1798 -1.25000000000000e+01 1870 113 -2.08333333333333e+00 1870 284 2.08333333333333e+00 1870 112 -6.25000000000000e+00 1870 111 4.16666666666667e+00 1870 282 -4.16666666666667e+00 1871 1871 6.25000000000000e+01 1871 1862 -6.25000000000000e+00 1871 1861 4.16666666666667e+00 1871 1860 -2.08333333333333e+00 1871 1857 2.08333333333333e+00 1871 1764 4.16666666666667e+00 1871 1761 -4.16666666666667e+00 1871 1762 -4.16666666666667e+00 1871 1765 -8.33333333333333e+00 1871 1798 8.33333333333333e+00 1871 1870 -8.33333333333333e+00 1871 1546 4.16666666666667e+00 1871 1545 -2.08333333333333e+00 1871 1376 -6.25000000000000e+00 1871 1547 -6.25000000000000e+00 1871 1375 -2.08333333333333e+00 1871 1795 4.16666666666667e+00 1871 1374 4.16666666666667e+00 1871 1794 -8.33333333333333e+00 1871 1858 2.08333333333333e+00 1871 1799 -3.75000000000000e+01 1871 1869 -8.33333333333333e+00 1871 1797 8.33333333333333e+00 1871 282 2.08333333333333e+00 1871 113 -6.25000000000000e+00 1871 112 -2.08333333333333e+00 1871 283 2.08333333333333e+00 1871 111 4.16666666666667e+00 1872 1872 6.25000000000000e+01 1872 1868 4.16666666666667e+00 1872 1867 4.16666666666667e+00 1872 1866 -1.87500000000000e+01 1872 1864 -4.16666666666667e+00 1872 1781 -4.16666666666667e+00 1872 1784 -8.33333333333333e+00 1872 1783 4.16666666666667e+00 1872 1780 -4.16666666666667e+00 1872 1795 4.16666666666667e+00 1872 1801 -4.16666666666667e+00 1872 1874 -8.33333333333333e+00 1872 1802 8.33333333333333e+00 1872 1547 4.16666666666667e+00 1872 1382 -2.08333333333333e+00 1872 1550 2.08333333333333e+00 1872 1381 4.16666666666667e+00 1872 1549 -4.16666666666667e+00 1872 1380 -6.25000000000000e+00 1872 1800 -1.25000000000000e+01 1872 1376 -2.08333333333333e+00 1872 1796 4.16666666666667e+00 1872 1873 -8.33333333333333e+00 1872 1375 4.16666666666667e+00 1872 1546 4.16666666666667e+00 1872 1865 2.08333333333333e+00 1872 1374 -6.25000000000000e+00 1872 1545 -1.87500000000000e+01 1873 1873 6.25000000000000e+01 1873 1867 -6.25000000000000e+00 1873 1866 4.16666666666667e+00 1873 1865 2.08333333333333e+00 1873 1863 -4.16666666666667e+00 1873 1784 4.16666666666667e+00 1873 1781 -4.16666666666667e+00 1873 1782 4.16666666666667e+00 1873 1779 -4.16666666666667e+00 1873 1794 4.16666666666667e+00 1873 1800 -4.16666666666667e+00 1873 1550 2.08333333333333e+00 1873 1547 -2.08333333333333e+00 1873 1382 4.16666666666667e+00 1873 1874 -8.33333333333333e+00 1873 1802 8.33333333333333e+00 1873 1381 -1.87500000000000e+01 1873 1801 -1.25000000000000e+01 1873 1380 4.16666666666667e+00 1873 1548 -4.16666666666667e+00 1873 1376 4.16666666666667e+00 1873 1796 -8.33333333333333e+00 1873 1868 -2.08333333333333e+00 1873 1375 -1.87500000000000e+01 1873 1546 -6.25000000000000e+00 1873 1872 -8.33333333333333e+00 1873 1374 4.16666666666667e+00 1873 1545 4.16666666666667e+00 1874 1874 6.25000000000000e+01 1874 1868 -6.25000000000000e+00 1874 1867 -2.08333333333333e+00 1874 1866 4.16666666666667e+00 1874 1864 2.08333333333333e+00 1874 1783 4.16666666666667e+00 1874 1780 -4.16666666666667e+00 1874 1779 -4.16666666666667e+00 1874 1782 -8.33333333333333e+00 1874 1549 2.08333333333333e+00 1874 1546 -2.08333333333333e+00 1874 1872 -8.33333333333333e+00 1874 1800 8.33333333333333e+00 1874 1545 4.16666666666667e+00 1874 1382 -6.25000000000000e+00 1874 1802 -3.75000000000000e+01 1874 1381 4.16666666666667e+00 1874 1873 -8.33333333333333e+00 1874 1801 8.33333333333333e+00 1874 1380 -2.08333333333333e+00 1874 1548 2.08333333333333e+00 1874 1863 2.08333333333333e+00 1874 1376 -6.25000000000000e+00 1874 1547 -6.25000000000000e+00 1874 1375 4.16666666666667e+00 1874 1795 -8.33333333333333e+00 1874 1374 -2.08333333333333e+00 1874 1794 4.16666666666667e+00 hypre-2.33.0/src/test/TEST_ij/data/beam_tet_dof2475_np4/A.IJ.00003000066400000000000000000020533401477326011500234430ustar00rootroot000000000000001875 2474 1875 2474 1875 1875 1.00000000000000e+00 1875 1999 0.00000000000000e+00 1875 1986 0.00000000000000e+00 1875 2000 0.00000000000000e+00 1875 1991 0.00000000000000e+00 1875 2003 0.00000000000000e+00 1875 1984 0.00000000000000e+00 1875 1990 0.00000000000000e+00 1875 1985 0.00000000000000e+00 1875 1996 0.00000000000000e+00 1875 2002 0.00000000000000e+00 1875 1983 0.00000000000000e+00 1875 1994 0.00000000000000e+00 1875 1997 0.00000000000000e+00 1875 1992 0.00000000000000e+00 1875 1987 0.00000000000000e+00 1876 1876 1.00000000000000e+00 1876 1986 0.00000000000000e+00 1876 1988 0.00000000000000e+00 1876 1987 0.00000000000000e+00 1876 1998 0.00000000000000e+00 1876 2000 0.00000000000000e+00 1876 1994 0.00000000000000e+00 1876 1983 0.00000000000000e+00 1876 1989 0.00000000000000e+00 1876 1984 0.00000000000000e+00 1876 1995 0.00000000000000e+00 1876 2001 0.00000000000000e+00 1876 1997 0.00000000000000e+00 1876 2003 0.00000000000000e+00 1876 1993 0.00000000000000e+00 1876 1991 0.00000000000000e+00 1877 1877 1.00000000000000e+00 1877 1988 0.00000000000000e+00 1877 1987 0.00000000000000e+00 1877 1999 0.00000000000000e+00 1877 1993 0.00000000000000e+00 1877 1998 0.00000000000000e+00 1877 1989 0.00000000000000e+00 1877 2001 0.00000000000000e+00 1877 1985 0.00000000000000e+00 1877 1983 0.00000000000000e+00 1877 1994 0.00000000000000e+00 1877 1990 0.00000000000000e+00 1877 1996 0.00000000000000e+00 1877 2002 0.00000000000000e+00 1877 1992 0.00000000000000e+00 1877 1995 0.00000000000000e+00 1878 1878 3.75000000000000e+01 1878 2027 -4.16666666666667e+00 1878 2008 2.08333333333333e+00 1878 2014 -4.16666666666667e+00 1878 2009 2.08333333333333e+00 1878 2020 2.08333333333333e+00 1878 2026 -4.16666666666667e+00 1878 2007 -1.25000000000000e+01 1878 2021 -4.16666666666667e+00 1878 2012 -2.08333333333333e+00 1878 2024 4.16666666666667e+00 1878 1879 -4.16666666666667e+00 1878 2011 4.16666666666667e+00 1878 2005 2.08333333333333e+00 1878 2010 -6.25000000000000e+00 1878 1880 -4.16666666666667e+00 1878 2018 4.16666666666667e+00 1878 2006 2.08333333333333e+00 1878 2017 -2.08333333333333e+00 1878 2023 4.16666666666667e+00 1878 2015 2.08333333333333e+00 1878 2016 -6.25000000000000e+00 1878 2004 -1.25000000000000e+01 1879 1879 3.33333333333333e+01 1879 2007 2.08333333333333e+00 1879 2013 -4.16666666666667e+00 1879 2008 -4.16666666666667e+00 1879 2019 2.08333333333333e+00 1879 2025 -4.16666666666667e+00 1879 2021 2.08333333333333e+00 1879 2027 -4.16666666666667e+00 1879 2012 4.16666666666667e+00 1879 2011 -1.87500000000000e+01 1879 1878 -4.16666666666667e+00 1879 2010 4.16666666666667e+00 1879 2004 2.08333333333333e+00 1879 2018 4.16666666666667e+00 1879 2024 -8.33333333333333e+00 1879 2015 2.08333333333333e+00 1879 2017 -6.25000000000000e+00 1879 2005 -4.16666666666667e+00 1879 2016 -2.08333333333333e+00 1879 2022 4.16666666666667e+00 1880 1880 3.33333333333333e+01 1880 2013 2.08333333333333e+00 1880 2025 -4.16666666666667e+00 1880 2009 -4.16666666666667e+00 1880 2007 2.08333333333333e+00 1880 2020 2.08333333333333e+00 1880 2026 -4.16666666666667e+00 1880 2019 -4.16666666666667e+00 1880 2012 -6.25000000000000e+00 1880 2011 4.16666666666667e+00 1880 2010 -2.08333333333333e+00 1880 2022 4.16666666666667e+00 1880 2014 2.08333333333333e+00 1880 2018 -1.87500000000000e+01 1880 2006 -4.16666666666667e+00 1880 2017 4.16666666666667e+00 1880 2023 -8.33333333333333e+00 1880 1878 -4.16666666666667e+00 1880 2016 4.16666666666667e+00 1880 2004 2.08333333333333e+00 1881 1881 1.00000000000000e+00 1881 2035 0.00000000000000e+00 1881 1882 0.00000000000000e+00 1881 2032 0.00000000000000e+00 1881 2034 0.00000000000000e+00 1881 2039 0.00000000000000e+00 1881 2042 0.00000000000000e+00 1881 2038 0.00000000000000e+00 1881 2041 0.00000000000000e+00 1881 2037 0.00000000000000e+00 1881 2036 0.00000000000000e+00 1881 2031 0.00000000000000e+00 1882 1882 1.00000000000000e+00 1882 2042 0.00000000000000e+00 1882 2035 0.00000000000000e+00 1882 2034 0.00000000000000e+00 1882 1881 0.00000000000000e+00 1882 2031 0.00000000000000e+00 1882 2039 0.00000000000000e+00 1882 1883 0.00000000000000e+00 1882 2033 0.00000000000000e+00 1882 2038 0.00000000000000e+00 1882 2036 0.00000000000000e+00 1882 2032 0.00000000000000e+00 1882 2037 0.00000000000000e+00 1882 2040 0.00000000000000e+00 1883 1883 1.00000000000000e+00 1883 2035 0.00000000000000e+00 1883 2041 0.00000000000000e+00 1883 2034 0.00000000000000e+00 1883 2039 0.00000000000000e+00 1883 2036 0.00000000000000e+00 1883 2033 0.00000000000000e+00 1883 2038 0.00000000000000e+00 1883 1882 0.00000000000000e+00 1883 2032 0.00000000000000e+00 1883 2037 0.00000000000000e+00 1883 2040 0.00000000000000e+00 1884 1884 2.50000000000000e+01 1884 2053 2.08333333333333e+00 1884 1885 -4.16666666666667e+00 1884 2052 -6.25000000000000e+00 1884 2060 -4.16666666666667e+00 1884 2056 -2.08333333333333e+00 1884 2059 2.08333333333333e+00 1884 1886 -4.16666666666667e+00 1884 2051 2.08333333333333e+00 1884 2057 4.16666666666667e+00 1884 2050 2.08333333333333e+00 1884 2049 -6.25000000000000e+00 1884 2048 -2.08333333333333e+00 1884 2045 2.08333333333333e+00 1884 2047 4.16666666666667e+00 1884 2044 -4.16666666666667e+00 1884 2046 -6.25000000000000e+00 1884 2054 2.08333333333333e+00 1884 2055 -6.25000000000000e+00 1885 1885 2.91666666666667e+01 1885 2060 2.08333333333333e+00 1885 2053 -2.08333333333333e+00 1885 2052 2.08333333333333e+00 1885 1884 -4.16666666666667e+00 1885 2055 -2.08333333333333e+00 1885 2058 2.08333333333333e+00 1885 2051 -2.08333333333333e+00 1885 2045 2.08333333333333e+00 1885 2050 -2.08333333333333e+00 1885 2049 2.08333333333333e+00 1885 2048 4.16666666666667e+00 1885 1886 -8.33333333333333e+00 1885 2057 4.16666666666667e+00 1885 2047 -1.87500000000000e+01 1885 2054 -2.08333333333333e+00 1885 2056 -6.25000000000000e+00 1885 2046 4.16666666666667e+00 1885 2043 -4.16666666666667e+00 1886 1886 2.91666666666667e+01 1886 2053 -2.08333333333333e+00 1886 2059 2.08333333333333e+00 1886 2052 2.08333333333333e+00 1886 2058 -4.16666666666667e+00 1886 2051 -2.08333333333333e+00 1886 2050 -2.08333333333333e+00 1886 2044 2.08333333333333e+00 1886 1884 -4.16666666666667e+00 1886 2049 2.08333333333333e+00 1886 2055 4.16666666666667e+00 1886 2048 -6.25000000000000e+00 1886 2054 -2.08333333333333e+00 1886 2057 -1.87500000000000e+01 1886 2047 4.16666666666667e+00 1886 1885 -8.33333333333333e+00 1886 2056 4.16666666666667e+00 1886 2046 -2.08333333333333e+00 1886 2043 2.08333333333333e+00 1887 1887 1.00000000000000e+00 1887 2078 0.00000000000000e+00 1887 2074 0.00000000000000e+00 1887 2073 0.00000000000000e+00 1887 1889 0.00000000000000e+00 1887 2072 0.00000000000000e+00 1887 2069 0.00000000000000e+00 1887 2071 0.00000000000000e+00 1887 2077 0.00000000000000e+00 1887 2075 0.00000000000000e+00 1887 2070 0.00000000000000e+00 1887 2067 0.00000000000000e+00 1888 1888 1.00000000000000e+00 1888 1889 0.00000000000000e+00 1888 2069 0.00000000000000e+00 1888 2074 0.00000000000000e+00 1888 2073 0.00000000000000e+00 1888 2072 0.00000000000000e+00 1888 2078 0.00000000000000e+00 1888 2075 0.00000000000000e+00 1888 2071 0.00000000000000e+00 1888 2068 0.00000000000000e+00 1888 2070 0.00000000000000e+00 1888 2076 0.00000000000000e+00 1889 1889 1.00000000000000e+00 1889 2074 0.00000000000000e+00 1889 1888 0.00000000000000e+00 1889 2068 0.00000000000000e+00 1889 2073 0.00000000000000e+00 1889 2076 0.00000000000000e+00 1889 2075 0.00000000000000e+00 1889 2072 0.00000000000000e+00 1889 2069 0.00000000000000e+00 1889 2071 0.00000000000000e+00 1889 2077 0.00000000000000e+00 1889 1887 0.00000000000000e+00 1889 2070 0.00000000000000e+00 1889 2067 0.00000000000000e+00 1890 1890 2.50000000000000e+01 1890 2096 2.08333333333333e+00 1890 1892 -4.16666666666667e+00 1890 2090 2.08333333333333e+00 1890 2089 2.08333333333333e+00 1890 2095 -4.16666666666667e+00 1890 2088 -6.25000000000000e+00 1890 2084 4.16666666666667e+00 1890 2083 -2.08333333333333e+00 1890 2080 2.08333333333333e+00 1890 2082 -6.25000000000000e+00 1890 2087 2.08333333333333e+00 1890 2081 -4.16666666666667e+00 1890 2086 2.08333333333333e+00 1890 1891 -4.16666666666667e+00 1890 2092 4.16666666666667e+00 1890 2085 -6.25000000000000e+00 1890 2093 -2.08333333333333e+00 1890 2091 -6.25000000000000e+00 1891 1891 2.91666666666667e+01 1891 2096 2.08333333333333e+00 1891 2089 -2.08333333333333e+00 1891 2088 2.08333333333333e+00 1891 2094 -4.16666666666667e+00 1891 2084 4.16666666666667e+00 1891 1892 -8.33333333333333e+00 1891 2093 4.16666666666667e+00 1891 2083 -6.25000000000000e+00 1891 2082 -2.08333333333333e+00 1891 2079 2.08333333333333e+00 1891 2087 -2.08333333333333e+00 1891 2081 2.08333333333333e+00 1891 2086 -2.08333333333333e+00 1891 2090 -2.08333333333333e+00 1891 2092 -1.87500000000000e+01 1891 2085 2.08333333333333e+00 1891 1890 -4.16666666666667e+00 1891 2091 4.16666666666667e+00 1892 1892 2.91666666666667e+01 1892 2094 2.08333333333333e+00 1892 2090 -2.08333333333333e+00 1892 2089 -2.08333333333333e+00 1892 2095 2.08333333333333e+00 1892 1890 -4.16666666666667e+00 1892 2088 2.08333333333333e+00 1892 2084 -1.87500000000000e+01 1892 2083 4.16666666666667e+00 1892 1891 -8.33333333333333e+00 1892 2092 4.16666666666667e+00 1892 2082 4.16666666666667e+00 1892 2087 -2.08333333333333e+00 1892 2091 -2.08333333333333e+00 1892 2093 -6.25000000000000e+00 1892 2086 -2.08333333333333e+00 1892 2080 2.08333333333333e+00 1892 2085 2.08333333333333e+00 1892 2079 -4.16666666666667e+00 1893 1893 1.00000000000000e+00 1893 2108 0.00000000000000e+00 1893 2114 0.00000000000000e+00 1893 2107 0.00000000000000e+00 1893 2104 0.00000000000000e+00 1893 2106 0.00000000000000e+00 1893 2111 0.00000000000000e+00 1893 2105 0.00000000000000e+00 1893 1894 0.00000000000000e+00 1893 2110 0.00000000000000e+00 1893 2113 0.00000000000000e+00 1893 1895 0.00000000000000e+00 1893 2109 0.00000000000000e+00 1893 2112 0.00000000000000e+00 1894 1894 1.00000000000000e+00 1894 2107 0.00000000000000e+00 1894 2106 0.00000000000000e+00 1894 2103 0.00000000000000e+00 1894 2111 0.00000000000000e+00 1894 2105 0.00000000000000e+00 1894 2108 0.00000000000000e+00 1894 2110 0.00000000000000e+00 1894 2113 0.00000000000000e+00 1894 1893 0.00000000000000e+00 1894 2109 0.00000000000000e+00 1894 2112 0.00000000000000e+00 1895 1895 1.00000000000000e+00 1895 2107 0.00000000000000e+00 1895 1893 0.00000000000000e+00 1895 2106 0.00000000000000e+00 1895 2112 0.00000000000000e+00 1895 2108 0.00000000000000e+00 1895 2111 0.00000000000000e+00 1895 2114 0.00000000000000e+00 1895 2110 0.00000000000000e+00 1895 2104 0.00000000000000e+00 1895 2109 0.00000000000000e+00 1895 2103 0.00000000000000e+00 1896 1896 3.75000000000000e+01 1896 2138 2.08333333333333e+00 1896 2125 -2.08333333333333e+00 1896 2132 -2.08333333333333e+00 1896 1897 -4.16666666666667e+00 1896 2137 2.08333333333333e+00 1896 2136 -1.25000000000000e+01 1896 2126 4.16666666666667e+00 1896 2135 2.08333333333333e+00 1896 2123 -4.16666666666667e+00 1896 2122 2.08333333333333e+00 1896 2129 2.08333333333333e+00 1896 2134 2.08333333333333e+00 1896 2133 -1.25000000000000e+01 1896 2120 4.16666666666667e+00 1896 2117 -4.16666666666667e+00 1896 2124 -6.25000000000000e+00 1896 2119 4.16666666666667e+00 1896 2116 -4.16666666666667e+00 1896 2128 -4.16666666666667e+00 1896 2131 4.16666666666667e+00 1896 2130 -6.25000000000000e+00 1896 1898 -4.16666666666667e+00 1897 1897 3.33333333333333e+01 1897 2137 -4.16666666666667e+00 1897 1896 -4.16666666666667e+00 1897 2136 2.08333333333333e+00 1897 2123 2.08333333333333e+00 1897 2121 2.08333333333333e+00 1897 2134 -4.16666666666667e+00 1897 2133 2.08333333333333e+00 1897 2126 4.16666666666667e+00 1897 2125 -6.25000000000000e+00 1897 2120 -8.33333333333333e+00 1897 2132 4.16666666666667e+00 1897 2118 4.16666666666667e+00 1897 2115 -4.16666666666667e+00 1897 2129 2.08333333333333e+00 1897 2117 -4.16666666666667e+00 1897 2131 -1.87500000000000e+01 1897 2124 -2.08333333333333e+00 1897 2127 -4.16666666666667e+00 1897 2130 4.16666666666667e+00 1898 1898 3.33333333333333e+01 1898 2136 2.08333333333333e+00 1898 2138 -4.16666666666667e+00 1898 2130 -2.08333333333333e+00 1898 2122 2.08333333333333e+00 1898 2124 4.16666666666667e+00 1898 2133 2.08333333333333e+00 1898 2121 -4.16666666666667e+00 1898 2135 -4.16666666666667e+00 1898 2127 2.08333333333333e+00 1898 2126 -1.87500000000000e+01 1898 2125 4.16666666666667e+00 1898 2118 4.16666666666667e+00 1898 2115 -4.16666666666667e+00 1898 2119 -8.33333333333333e+00 1898 2131 4.16666666666667e+00 1898 2132 -6.25000000000000e+00 1898 1896 -4.16666666666667e+00 1898 2128 2.08333333333333e+00 1898 2116 -4.16666666666667e+00 1899 1899 3.75000000000000e+01 1899 2005 2.08333333333333e+00 1899 2161 -4.16666666666667e+00 1899 2153 -2.08333333333333e+00 1899 1900 -4.16666666666667e+00 1899 2152 4.16666666666667e+00 1899 1984 2.08333333333333e+00 1899 2151 -6.25000000000000e+00 1899 2168 -4.16666666666667e+00 1899 2159 4.16666666666667e+00 1899 2006 2.08333333333333e+00 1899 2165 -4.16666666666667e+00 1899 2164 2.08333333333333e+00 1899 2167 -4.16666666666667e+00 1899 2004 -1.25000000000000e+01 1899 1901 -4.16666666666667e+00 1899 2156 4.16666666666667e+00 1899 1985 2.08333333333333e+00 1899 2155 -2.08333333333333e+00 1899 2158 4.16666666666667e+00 1899 2162 2.08333333333333e+00 1899 2154 -6.25000000000000e+00 1899 1983 -1.25000000000000e+01 1900 1900 3.33333333333333e+01 1900 2004 2.08333333333333e+00 1900 2160 -4.16666666666667e+00 1900 2153 4.16666666666667e+00 1900 2152 -1.87500000000000e+01 1900 1899 -4.16666666666667e+00 1900 2151 4.16666666666667e+00 1900 1983 2.08333333333333e+00 1900 2165 2.08333333333333e+00 1900 2168 -4.16666666666667e+00 1900 2005 -4.16666666666667e+00 1900 2163 2.08333333333333e+00 1900 2166 -4.16666666666667e+00 1900 2156 4.16666666666667e+00 1900 2159 -8.33333333333333e+00 1900 2162 2.08333333333333e+00 1900 2155 -6.25000000000000e+00 1900 1984 -4.16666666666667e+00 1900 2154 -2.08333333333333e+00 1900 2157 4.16666666666667e+00 1901 1901 3.33333333333333e+01 1901 2160 2.08333333333333e+00 1901 2153 -6.25000000000000e+00 1901 2152 4.16666666666667e+00 1901 2151 -2.08333333333333e+00 1901 2164 2.08333333333333e+00 1901 2167 -4.16666666666667e+00 1901 2166 -4.16666666666667e+00 1901 2157 4.16666666666667e+00 1901 2006 -4.16666666666667e+00 1901 2004 2.08333333333333e+00 1901 2163 -4.16666666666667e+00 1901 2161 2.08333333333333e+00 1901 2156 -1.87500000000000e+01 1901 1985 -4.16666666666667e+00 1901 2155 4.16666666666667e+00 1901 2158 -8.33333333333333e+00 1901 1899 -4.16666666666667e+00 1901 2154 4.16666666666667e+00 1901 1983 2.08333333333333e+00 1902 1902 1.00000000000000e+00 1902 2179 0.00000000000000e+00 1902 2032 0.00000000000000e+00 1902 2171 0.00000000000000e+00 1902 2170 0.00000000000000e+00 1902 1903 0.00000000000000e+00 1902 1987 0.00000000000000e+00 1902 2169 0.00000000000000e+00 1902 2186 0.00000000000000e+00 1902 2183 0.00000000000000e+00 1902 2182 0.00000000000000e+00 1902 2185 0.00000000000000e+00 1902 2031 0.00000000000000e+00 1902 2174 0.00000000000000e+00 1902 2177 0.00000000000000e+00 1902 2173 0.00000000000000e+00 1902 2176 0.00000000000000e+00 1902 2172 0.00000000000000e+00 1902 2180 0.00000000000000e+00 1902 1986 0.00000000000000e+00 1903 1903 1.00000000000000e+00 1903 2178 0.00000000000000e+00 1903 2031 0.00000000000000e+00 1903 2171 0.00000000000000e+00 1903 2170 0.00000000000000e+00 1903 2169 0.00000000000000e+00 1903 1902 0.00000000000000e+00 1903 1986 0.00000000000000e+00 1903 2186 0.00000000000000e+00 1903 2177 0.00000000000000e+00 1903 2183 0.00000000000000e+00 1903 2033 0.00000000000000e+00 1903 2032 0.00000000000000e+00 1903 2181 0.00000000000000e+00 1903 2184 0.00000000000000e+00 1903 2174 0.00000000000000e+00 1903 1904 0.00000000000000e+00 1903 1988 0.00000000000000e+00 1903 2173 0.00000000000000e+00 1903 2180 0.00000000000000e+00 1903 1987 0.00000000000000e+00 1903 2172 0.00000000000000e+00 1903 2175 0.00000000000000e+00 1904 1904 1.00000000000000e+00 1904 2179 0.00000000000000e+00 1904 2171 0.00000000000000e+00 1904 2170 0.00000000000000e+00 1904 2169 0.00000000000000e+00 1904 2184 0.00000000000000e+00 1904 2181 0.00000000000000e+00 1904 2185 0.00000000000000e+00 1904 2176 0.00000000000000e+00 1904 2033 0.00000000000000e+00 1904 2182 0.00000000000000e+00 1904 2032 0.00000000000000e+00 1904 2174 0.00000000000000e+00 1904 2178 0.00000000000000e+00 1904 1988 0.00000000000000e+00 1904 2173 0.00000000000000e+00 1904 1903 0.00000000000000e+00 1904 1987 0.00000000000000e+00 1904 2172 0.00000000000000e+00 1904 2175 0.00000000000000e+00 1905 1905 6.25000000000000e+01 1905 2200 4.16666666666667e+00 1905 2201 4.16666666666667e+00 1905 2197 4.16666666666667e+00 1905 2196 -6.25000000000000e+00 1905 1907 -8.33333333333333e+00 1905 2171 4.16666666666667e+00 1905 2170 4.16666666666667e+00 1905 2169 -1.87500000000000e+01 1905 2188 -4.16666666666667e+00 1905 1906 -8.33333333333333e+00 1905 2192 4.16666666666667e+00 1905 2203 -4.16666666666667e+00 1905 2194 4.16666666666667e+00 1905 2189 8.33333333333333e+00 1905 2195 -8.33333333333333e+00 1905 2045 2.08333333333333e+00 1905 2204 -4.16666666666667e+00 1905 2191 4.16666666666667e+00 1905 2044 -4.16666666666667e+00 1905 2190 -1.87500000000000e+01 1905 2153 -2.08333333333333e+00 1905 1991 2.08333333333333e+00 1905 2152 4.16666666666667e+00 1905 1990 -4.16666666666667e+00 1905 2151 -6.25000000000000e+00 1905 2198 -2.08333333333333e+00 1905 2187 -1.25000000000000e+01 1906 1906 6.25000000000000e+01 1906 2199 4.16666666666667e+00 1906 2201 -8.33333333333333e+00 1906 2045 2.08333333333333e+00 1906 2197 -1.87500000000000e+01 1906 2196 4.16666666666667e+00 1906 2171 -2.08333333333333e+00 1906 1991 2.08333333333333e+00 1906 2170 -6.25000000000000e+00 1906 2169 4.16666666666667e+00 1906 2187 -4.16666666666667e+00 1906 2192 -2.08333333333333e+00 1906 1905 -8.33333333333333e+00 1906 2202 -4.16666666666667e+00 1906 2193 4.16666666666667e+00 1906 2204 -4.16666666666667e+00 1906 2195 4.16666666666667e+00 1906 2191 -6.25000000000000e+00 1906 2190 4.16666666666667e+00 1906 2043 -4.16666666666667e+00 1906 2153 4.16666666666667e+00 1906 1907 -8.33333333333333e+00 1906 2189 8.33333333333333e+00 1906 2152 -1.87500000000000e+01 1906 2198 4.16666666666667e+00 1906 2188 -1.25000000000000e+01 1906 2151 4.16666666666667e+00 1906 1989 -4.16666666666667e+00 1907 1907 6.25000000000000e+01 1907 2197 4.16666666666667e+00 1907 2200 -8.33333333333333e+00 1907 2199 4.16666666666667e+00 1907 2198 -6.25000000000000e+00 1907 2044 2.08333333333333e+00 1907 2171 -6.25000000000000e+00 1907 2170 -2.08333333333333e+00 1907 1990 2.08333333333333e+00 1907 1905 -8.33333333333333e+00 1907 2169 4.16666666666667e+00 1907 2191 -2.08333333333333e+00 1907 2190 4.16666666666667e+00 1907 2203 -4.16666666666667e+00 1907 2194 4.16666666666667e+00 1907 2187 8.33333333333333e+00 1907 2193 -8.33333333333333e+00 1907 2192 -6.25000000000000e+00 1907 2043 2.08333333333333e+00 1907 2202 -4.16666666666667e+00 1907 2153 -6.25000000000000e+00 1907 2196 -2.08333333333333e+00 1907 2189 -3.75000000000000e+01 1907 2152 4.16666666666667e+00 1907 1906 -8.33333333333333e+00 1907 2188 8.33333333333333e+00 1907 2151 -2.08333333333333e+00 1907 1989 2.08333333333333e+00 1908 1908 1.00000000000000e+00 1908 2219 0.00000000000000e+00 1908 2210 0.00000000000000e+00 1908 2209 0.00000000000000e+00 1908 2208 0.00000000000000e+00 1908 2213 0.00000000000000e+00 1908 2222 0.00000000000000e+00 1908 2215 0.00000000000000e+00 1908 2221 0.00000000000000e+00 1908 2069 0.00000000000000e+00 1908 2216 0.00000000000000e+00 1908 2067 0.00000000000000e+00 1908 1910 0.00000000000000e+00 1908 2207 0.00000000000000e+00 1908 1994 0.00000000000000e+00 1908 2206 0.00000000000000e+00 1908 2212 0.00000000000000e+00 1908 2218 0.00000000000000e+00 1908 2205 0.00000000000000e+00 1908 1992 0.00000000000000e+00 1909 1909 1.00000000000000e+00 1909 2219 0.00000000000000e+00 1909 2069 0.00000000000000e+00 1909 2210 0.00000000000000e+00 1909 1910 0.00000000000000e+00 1909 1994 0.00000000000000e+00 1909 2209 0.00000000000000e+00 1909 2208 0.00000000000000e+00 1909 2214 0.00000000000000e+00 1909 2220 0.00000000000000e+00 1909 2216 0.00000000000000e+00 1909 2222 0.00000000000000e+00 1909 2068 0.00000000000000e+00 1909 2207 0.00000000000000e+00 1909 2213 0.00000000000000e+00 1909 2217 0.00000000000000e+00 1909 2206 0.00000000000000e+00 1909 1993 0.00000000000000e+00 1909 2205 0.00000000000000e+00 1909 2211 0.00000000000000e+00 1910 1910 1.00000000000000e+00 1910 2068 0.00000000000000e+00 1910 2217 0.00000000000000e+00 1910 2210 0.00000000000000e+00 1910 2209 0.00000000000000e+00 1910 1909 0.00000000000000e+00 1910 1993 0.00000000000000e+00 1910 2208 0.00000000000000e+00 1910 2211 0.00000000000000e+00 1910 2220 0.00000000000000e+00 1910 2069 0.00000000000000e+00 1910 2215 0.00000000000000e+00 1910 2221 0.00000000000000e+00 1910 2067 0.00000000000000e+00 1910 2214 0.00000000000000e+00 1910 2218 0.00000000000000e+00 1910 2207 0.00000000000000e+00 1910 1994 0.00000000000000e+00 1910 2206 0.00000000000000e+00 1910 2212 0.00000000000000e+00 1910 1908 0.00000000000000e+00 1910 2205 0.00000000000000e+00 1910 1992 0.00000000000000e+00 1911 1911 6.25000000000000e+01 1911 2231 4.16666666666667e+00 1911 2230 -8.33333333333333e+00 1911 2228 4.16666666666667e+00 1911 2080 2.08333333333333e+00 1911 2226 -1.87500000000000e+01 1911 2156 4.16666666666667e+00 1911 2155 -2.08333333333333e+00 1911 1996 2.08333333333333e+00 1911 2154 -6.25000000000000e+00 1911 2225 -4.16666666666667e+00 1911 1913 -8.33333333333333e+00 1911 2233 -2.08333333333333e+00 1911 2240 -4.16666666666667e+00 1911 2237 4.16666666666667e+00 1911 2239 -4.16666666666667e+00 1911 2236 4.16666666666667e+00 1911 2234 4.16666666666667e+00 1911 2081 -4.16666666666667e+00 1911 2232 -6.25000000000000e+00 1911 2207 4.16666666666667e+00 1911 1997 -4.16666666666667e+00 1911 2206 4.16666666666667e+00 1911 1912 -8.33333333333333e+00 1911 2224 8.33333333333333e+00 1911 2205 -1.87500000000000e+01 1911 2227 4.16666666666667e+00 1911 2223 -1.25000000000000e+01 1912 1912 6.25000000000000e+01 1912 2231 4.16666666666667e+00 1912 2226 4.16666666666667e+00 1912 2229 -8.33333333333333e+00 1912 2227 -6.25000000000000e+00 1912 2079 2.08333333333333e+00 1912 2156 4.16666666666667e+00 1912 1913 -8.33333333333333e+00 1912 2155 -6.25000000000000e+00 1912 2154 -2.08333333333333e+00 1912 1995 2.08333333333333e+00 1912 2232 -2.08333333333333e+00 1912 2234 4.16666666666667e+00 1912 2225 8.33333333333333e+00 1912 2237 -8.33333333333333e+00 1912 2238 -4.16666666666667e+00 1912 2235 4.16666666666667e+00 1912 2081 2.08333333333333e+00 1912 2240 -4.16666666666667e+00 1912 2233 -6.25000000000000e+00 1912 2207 -2.08333333333333e+00 1912 1997 2.08333333333333e+00 1912 2206 -6.25000000000000e+00 1912 2228 -2.08333333333333e+00 1912 2224 -3.75000000000000e+01 1912 2205 4.16666666666667e+00 1912 1911 -8.33333333333333e+00 1912 2223 8.33333333333333e+00 1913 1913 6.25000000000000e+01 1913 2230 4.16666666666667e+00 1913 2229 4.16666666666667e+00 1913 2228 -6.25000000000000e+00 1913 2226 4.16666666666667e+00 1913 2156 -1.87500000000000e+01 1913 2155 4.16666666666667e+00 1913 1912 -8.33333333333333e+00 1913 2154 4.16666666666667e+00 1913 2223 -4.16666666666667e+00 1913 1911 -8.33333333333333e+00 1913 2233 4.16666666666667e+00 1913 2238 -4.16666666666667e+00 1913 2235 4.16666666666667e+00 1913 2224 8.33333333333333e+00 1913 2236 -8.33333333333333e+00 1913 2234 -1.87500000000000e+01 1913 2080 2.08333333333333e+00 1913 2239 -4.16666666666667e+00 1913 2232 4.16666666666667e+00 1913 2079 -4.16666666666667e+00 1913 2207 -6.25000000000000e+00 1913 2227 -2.08333333333333e+00 1913 2225 -1.25000000000000e+01 1913 2206 -2.08333333333333e+00 1913 1996 2.08333333333333e+00 1913 2205 4.16666666666667e+00 1913 1995 -4.16666666666667e+00 1914 1914 1.00000000000000e+00 1914 2246 0.00000000000000e+00 1914 2245 0.00000000000000e+00 1914 2248 0.00000000000000e+00 1914 2104 0.00000000000000e+00 1914 2244 0.00000000000000e+00 1914 1916 0.00000000000000e+00 1914 2174 0.00000000000000e+00 1914 2173 0.00000000000000e+00 1914 1999 0.00000000000000e+00 1914 2172 0.00000000000000e+00 1914 2251 0.00000000000000e+00 1914 2252 0.00000000000000e+00 1914 2243 0.00000000000000e+00 1914 2255 0.00000000000000e+00 1914 2257 0.00000000000000e+00 1914 2254 0.00000000000000e+00 1914 2105 0.00000000000000e+00 1914 2258 0.00000000000000e+00 1914 2250 0.00000000000000e+00 1914 2210 0.00000000000000e+00 1914 2000 0.00000000000000e+00 1914 1915 0.00000000000000e+00 1914 2209 0.00000000000000e+00 1914 2242 0.00000000000000e+00 1914 2249 0.00000000000000e+00 1914 2208 0.00000000000000e+00 1914 2241 0.00000000000000e+00 1915 1915 1.00000000000000e+00 1915 2249 0.00000000000000e+00 1915 2247 0.00000000000000e+00 1915 2246 0.00000000000000e+00 1915 2245 0.00000000000000e+00 1915 2103 0.00000000000000e+00 1915 2174 0.00000000000000e+00 1915 2173 0.00000000000000e+00 1915 2172 0.00000000000000e+00 1915 1998 0.00000000000000e+00 1915 2243 0.00000000000000e+00 1915 1916 0.00000000000000e+00 1915 2250 0.00000000000000e+00 1915 2258 0.00000000000000e+00 1915 2255 0.00000000000000e+00 1915 2256 0.00000000000000e+00 1915 2253 0.00000000000000e+00 1915 2105 0.00000000000000e+00 1915 2252 0.00000000000000e+00 1915 2251 0.00000000000000e+00 1915 2210 0.00000000000000e+00 1915 2000 0.00000000000000e+00 1915 2244 0.00000000000000e+00 1915 2209 0.00000000000000e+00 1915 2242 0.00000000000000e+00 1915 1914 0.00000000000000e+00 1915 2208 0.00000000000000e+00 1915 2241 0.00000000000000e+00 1916 1916 1.00000000000000e+00 1916 2244 0.00000000000000e+00 1916 2248 0.00000000000000e+00 1916 2246 0.00000000000000e+00 1916 2245 0.00000000000000e+00 1916 2174 0.00000000000000e+00 1916 2173 0.00000000000000e+00 1916 1914 0.00000000000000e+00 1916 2172 0.00000000000000e+00 1916 2242 0.00000000000000e+00 1916 1915 0.00000000000000e+00 1916 2257 0.00000000000000e+00 1916 2254 0.00000000000000e+00 1916 2250 0.00000000000000e+00 1916 2241 0.00000000000000e+00 1916 2253 0.00000000000000e+00 1916 2252 0.00000000000000e+00 1916 2104 0.00000000000000e+00 1916 2251 0.00000000000000e+00 1916 2103 0.00000000000000e+00 1916 2256 0.00000000000000e+00 1916 2247 0.00000000000000e+00 1916 2210 0.00000000000000e+00 1916 2243 0.00000000000000e+00 1916 2209 0.00000000000000e+00 1916 1999 0.00000000000000e+00 1916 2208 0.00000000000000e+00 1916 1998 0.00000000000000e+00 1917 1917 1.25000000000000e+02 1917 2263 8.33333333333333e+00 1917 2262 -1.25000000000000e+01 1917 2177 -8.33333333333333e+00 1917 2176 4.16666666666667e+00 1917 2243 8.33333333333333e+00 1917 2275 4.16666666666667e+00 1917 2242 8.33333333333333e+00 1917 2241 -3.75000000000000e+01 1917 2276 4.16666666666667e+00 1917 2188 -4.16666666666667e+00 1917 2189 8.33333333333333e+00 1917 1919 -1.66666666666667e+01 1917 2003 -4.16666666666667e+00 1917 2187 -1.25000000000000e+01 1917 2267 4.16666666666667e+00 1917 2117 -4.16666666666667e+00 1917 2266 -8.33333333333333e+00 1917 2159 4.16666666666667e+00 1917 2260 8.33333333333333e+00 1917 1918 -1.66666666666667e+01 1917 2261 8.33333333333333e+00 1917 2116 -4.16666666666667e+00 1917 2259 -3.75000000000000e+01 1917 2158 4.16666666666667e+00 1917 2002 -4.16666666666667e+00 1917 2225 -4.16666666666667e+00 1917 2213 4.16666666666667e+00 1917 2272 4.16666666666667e+00 1917 2269 -4.16666666666667e+00 1917 2212 -8.33333333333333e+00 1917 2224 8.33333333333333e+00 1917 2223 -1.25000000000000e+01 1917 2270 8.33333333333333e+00 1917 2273 -8.33333333333333e+00 1917 2268 -1.25000000000000e+01 1917 2264 -4.16666666666667e+00 1918 1918 1.25000000000000e+02 1918 2262 8.33333333333333e+00 1918 2264 8.33333333333333e+00 1918 2263 -3.75000000000000e+01 1918 2175 4.16666666666667e+00 1918 2243 -4.16666666666667e+00 1918 2274 4.16666666666667e+00 1918 2242 -1.25000000000000e+01 1918 2241 8.33333333333333e+00 1918 2276 -8.33333333333333e+00 1918 2187 -4.16666666666667e+00 1918 2267 4.16666666666667e+00 1918 2189 8.33333333333333e+00 1918 2188 -1.25000000000000e+01 1918 2265 -8.33333333333333e+00 1918 2261 -4.16666666666667e+00 1918 2259 8.33333333333333e+00 1918 1917 -1.66666666666667e+01 1918 2260 -1.25000000000000e+01 1918 2115 -4.16666666666667e+00 1918 2159 -8.33333333333333e+00 1918 2157 4.16666666666667e+00 1918 2001 -4.16666666666667e+00 1918 2225 8.33333333333333e+00 1918 1919 -1.66666666666667e+01 1918 2270 8.33333333333333e+00 1918 2271 4.16666666666667e+00 1918 2268 -4.16666666666667e+00 1918 2213 4.16666666666667e+00 1918 2003 -4.16666666666667e+00 1918 2224 -3.75000000000000e+01 1918 2211 -8.33333333333333e+00 1918 2223 8.33333333333333e+00 1918 2273 4.16666666666667e+00 1918 2117 -4.16666666666667e+00 1918 2269 -1.25000000000000e+01 1918 2177 4.16666666666667e+00 1919 1919 1.25000000000000e+02 1919 2176 4.16666666666667e+00 1919 2264 -1.25000000000000e+01 1919 2263 8.33333333333333e+00 1919 2175 -8.33333333333333e+00 1919 2242 -4.16666666666667e+00 1919 2241 8.33333333333333e+00 1919 2243 -1.25000000000000e+01 1919 2275 -8.33333333333333e+00 1919 2274 4.16666666666667e+00 1919 2266 4.16666666666667e+00 1919 2187 8.33333333333333e+00 1919 1917 -1.66666666666667e+01 1919 2189 -3.75000000000000e+01 1919 2188 8.33333333333333e+00 1919 2001 -4.16666666666667e+00 1919 2265 4.16666666666667e+00 1919 2115 -4.16666666666667e+00 1919 2260 -4.16666666666667e+00 1919 2157 4.16666666666667e+00 1919 2261 -1.25000000000000e+01 1919 2259 8.33333333333333e+00 1919 2158 -8.33333333333333e+00 1919 2223 -4.16666666666667e+00 1919 2211 4.16666666666667e+00 1919 2224 8.33333333333333e+00 1919 1918 -1.66666666666667e+01 1919 2269 8.33333333333333e+00 1919 2225 -1.25000000000000e+01 1919 2212 4.16666666666667e+00 1919 2002 -4.16666666666667e+00 1919 2270 -3.75000000000000e+01 1919 2262 -4.16666666666667e+00 1919 2272 4.16666666666667e+00 1919 2116 -4.16666666666667e+00 1919 2268 8.33333333333333e+00 1919 2271 -8.33333333333333e+00 1920 1920 3.75000000000000e+01 1920 2029 2.08333333333333e+00 1920 2287 -4.16666666666667e+00 1920 2279 -2.08333333333333e+00 1920 1921 -4.16666666666667e+00 1920 2278 4.16666666666667e+00 1920 2008 2.08333333333333e+00 1920 2277 -6.25000000000000e+00 1920 2294 -4.16666666666667e+00 1920 2285 4.16666666666667e+00 1920 2030 2.08333333333333e+00 1920 2291 -4.16666666666667e+00 1920 2290 2.08333333333333e+00 1920 2293 -4.16666666666667e+00 1920 2028 -1.25000000000000e+01 1920 1922 -4.16666666666667e+00 1920 2282 4.16666666666667e+00 1920 2009 2.08333333333333e+00 1920 2281 -2.08333333333333e+00 1920 2284 4.16666666666667e+00 1920 2288 2.08333333333333e+00 1920 2280 -6.25000000000000e+00 1920 2007 -1.25000000000000e+01 1921 1921 3.33333333333333e+01 1921 2028 2.08333333333333e+00 1921 2286 -4.16666666666667e+00 1921 2279 4.16666666666667e+00 1921 2278 -1.87500000000000e+01 1921 1920 -4.16666666666667e+00 1921 2277 4.16666666666667e+00 1921 2007 2.08333333333333e+00 1921 2291 2.08333333333333e+00 1921 2294 -4.16666666666667e+00 1921 2029 -4.16666666666667e+00 1921 2289 2.08333333333333e+00 1921 2292 -4.16666666666667e+00 1921 2282 4.16666666666667e+00 1921 2285 -8.33333333333333e+00 1921 2288 2.08333333333333e+00 1921 2281 -6.25000000000000e+00 1921 2008 -4.16666666666667e+00 1921 2280 -2.08333333333333e+00 1921 2283 4.16666666666667e+00 1922 1922 3.33333333333333e+01 1922 2286 2.08333333333333e+00 1922 2279 -6.25000000000000e+00 1922 2278 4.16666666666667e+00 1922 2277 -2.08333333333333e+00 1922 2290 2.08333333333333e+00 1922 2293 -4.16666666666667e+00 1922 2292 -4.16666666666667e+00 1922 2283 4.16666666666667e+00 1922 2030 -4.16666666666667e+00 1922 2028 2.08333333333333e+00 1922 2289 -4.16666666666667e+00 1922 2287 2.08333333333333e+00 1922 2282 -1.87500000000000e+01 1922 2009 -4.16666666666667e+00 1922 2281 4.16666666666667e+00 1922 2284 -8.33333333333333e+00 1922 1920 -4.16666666666667e+00 1922 2280 4.16666666666667e+00 1922 2007 2.08333333333333e+00 1923 1923 6.25000000000000e+01 1923 2305 -4.16666666666667e+00 1923 2297 4.16666666666667e+00 1923 2296 4.16666666666667e+00 1923 2295 -1.87500000000000e+01 1923 2312 -4.16666666666667e+00 1923 2311 -4.16666666666667e+00 1923 2303 -8.33333333333333e+00 1923 2302 4.16666666666667e+00 1923 2192 4.16666666666667e+00 1923 1925 -8.33333333333333e+00 1923 2300 8.33333333333333e+00 1923 2308 4.16666666666667e+00 1923 2299 -4.16666666666667e+00 1923 2012 -2.08333333333333e+00 1923 2162 2.08333333333333e+00 1923 2011 4.16666666666667e+00 1923 2161 -4.16666666666667e+00 1923 2010 -6.25000000000000e+00 1923 2298 -1.25000000000000e+01 1923 2048 -2.08333333333333e+00 1923 2309 4.16666666666667e+00 1923 1924 -8.33333333333333e+00 1923 2047 4.16666666666667e+00 1923 2191 4.16666666666667e+00 1923 2306 2.08333333333333e+00 1923 2046 -6.25000000000000e+00 1923 2190 -1.87500000000000e+01 1924 1924 6.25000000000000e+01 1924 2304 -4.16666666666667e+00 1924 2297 -2.08333333333333e+00 1924 2296 -6.25000000000000e+00 1924 2295 4.16666666666667e+00 1924 2312 -4.16666666666667e+00 1924 2303 4.16666666666667e+00 1924 2310 -4.16666666666667e+00 1924 2301 4.16666666666667e+00 1924 2192 -2.08333333333333e+00 1924 2162 2.08333333333333e+00 1924 2307 4.16666666666667e+00 1924 2298 -4.16666666666667e+00 1924 2012 4.16666666666667e+00 1924 1925 -8.33333333333333e+00 1924 2300 8.33333333333333e+00 1924 2011 -1.87500000000000e+01 1924 2299 -1.25000000000000e+01 1924 2010 4.16666666666667e+00 1924 2160 -4.16666666666667e+00 1924 2048 4.16666666666667e+00 1924 2309 -8.33333333333333e+00 1924 2306 2.08333333333333e+00 1924 2047 -1.87500000000000e+01 1924 2191 -6.25000000000000e+00 1924 1923 -8.33333333333333e+00 1924 2046 4.16666666666667e+00 1924 2190 4.16666666666667e+00 1925 1925 6.25000000000000e+01 1925 2305 2.08333333333333e+00 1925 2297 -6.25000000000000e+00 1925 2296 -2.08333333333333e+00 1925 2295 4.16666666666667e+00 1925 2310 -4.16666666666667e+00 1925 2311 -4.16666666666667e+00 1925 2302 4.16666666666667e+00 1925 2301 -8.33333333333333e+00 1925 2191 -2.08333333333333e+00 1925 2161 2.08333333333333e+00 1925 2190 4.16666666666667e+00 1925 1923 -8.33333333333333e+00 1925 2298 8.33333333333333e+00 1925 2012 -6.25000000000000e+00 1925 2300 -3.75000000000000e+01 1925 2011 4.16666666666667e+00 1925 1924 -8.33333333333333e+00 1925 2299 8.33333333333333e+00 1925 2010 -2.08333333333333e+00 1925 2160 2.08333333333333e+00 1925 2304 2.08333333333333e+00 1925 2048 -6.25000000000000e+00 1925 2192 -6.25000000000000e+00 1925 2047 4.16666666666667e+00 1925 2308 -8.33333333333333e+00 1925 2046 -2.08333333333333e+00 1925 2307 4.16666666666667e+00 1926 1926 6.25000000000000e+01 1926 2326 4.16666666666667e+00 1926 2327 4.16666666666667e+00 1926 2323 4.16666666666667e+00 1926 2322 -6.25000000000000e+00 1926 1928 -8.33333333333333e+00 1926 2297 4.16666666666667e+00 1926 2296 4.16666666666667e+00 1926 2295 -1.87500000000000e+01 1926 2314 -4.16666666666667e+00 1926 1927 -8.33333333333333e+00 1926 2318 4.16666666666667e+00 1926 2329 -4.16666666666667e+00 1926 2320 4.16666666666667e+00 1926 2315 8.33333333333333e+00 1926 2321 -8.33333333333333e+00 1926 2063 2.08333333333333e+00 1926 2330 -4.16666666666667e+00 1926 2317 4.16666666666667e+00 1926 2062 -4.16666666666667e+00 1926 2316 -1.87500000000000e+01 1926 2279 -2.08333333333333e+00 1926 2015 2.08333333333333e+00 1926 2278 4.16666666666667e+00 1926 2014 -4.16666666666667e+00 1926 2277 -6.25000000000000e+00 1926 2324 -2.08333333333333e+00 1926 2313 -1.25000000000000e+01 1927 1927 6.25000000000000e+01 1927 2325 4.16666666666667e+00 1927 2327 -8.33333333333333e+00 1927 2063 2.08333333333333e+00 1927 2323 -1.87500000000000e+01 1927 2322 4.16666666666667e+00 1927 2297 -2.08333333333333e+00 1927 2015 2.08333333333333e+00 1927 2296 -6.25000000000000e+00 1927 2295 4.16666666666667e+00 1927 2313 -4.16666666666667e+00 1927 2318 -2.08333333333333e+00 1927 1926 -8.33333333333333e+00 1927 2328 -4.16666666666667e+00 1927 2319 4.16666666666667e+00 1927 2330 -4.16666666666667e+00 1927 2321 4.16666666666667e+00 1927 2317 -6.25000000000000e+00 1927 2316 4.16666666666667e+00 1927 2061 -4.16666666666667e+00 1927 2279 4.16666666666667e+00 1927 1928 -8.33333333333333e+00 1927 2315 8.33333333333333e+00 1927 2278 -1.87500000000000e+01 1927 2324 4.16666666666667e+00 1927 2314 -1.25000000000000e+01 1927 2277 4.16666666666667e+00 1927 2013 -4.16666666666667e+00 1928 1928 6.25000000000000e+01 1928 2323 4.16666666666667e+00 1928 2326 -8.33333333333333e+00 1928 2325 4.16666666666667e+00 1928 2324 -6.25000000000000e+00 1928 2062 2.08333333333333e+00 1928 2297 -6.25000000000000e+00 1928 2296 -2.08333333333333e+00 1928 2014 2.08333333333333e+00 1928 1926 -8.33333333333333e+00 1928 2295 4.16666666666667e+00 1928 2317 -2.08333333333333e+00 1928 2316 4.16666666666667e+00 1928 2329 -4.16666666666667e+00 1928 2320 4.16666666666667e+00 1928 2313 8.33333333333333e+00 1928 2319 -8.33333333333333e+00 1928 2318 -6.25000000000000e+00 1928 2061 2.08333333333333e+00 1928 2328 -4.16666666666667e+00 1928 2279 -6.25000000000000e+00 1928 2322 -2.08333333333333e+00 1928 2315 -3.75000000000000e+01 1928 2278 4.16666666666667e+00 1928 1927 -8.33333333333333e+00 1928 2314 8.33333333333333e+00 1928 2277 -2.08333333333333e+00 1928 2013 2.08333333333333e+00 1929 1929 6.25000000000000e+01 1929 2348 -4.16666666666667e+00 1929 2341 2.08333333333333e+00 1929 2347 -4.16666666666667e+00 1929 2342 -4.16666666666667e+00 1929 2333 4.16666666666667e+00 1929 2332 4.16666666666667e+00 1929 2338 -8.33333333333333e+00 1929 2331 -1.87500000000000e+01 1929 2345 4.16666666666667e+00 1929 2336 -4.16666666666667e+00 1929 1930 -8.33333333333333e+00 1929 2335 8.33333333333333e+00 1929 2227 4.16666666666667e+00 1929 2018 4.16666666666667e+00 1929 2165 -4.16666666666667e+00 1929 2017 -2.08333333333333e+00 1929 2164 2.08333333333333e+00 1929 2016 -6.25000000000000e+00 1929 2334 -1.25000000000000e+01 1929 1931 -8.33333333333333e+00 1929 2084 4.16666666666667e+00 1929 2228 4.16666666666667e+00 1929 2083 -2.08333333333333e+00 1929 2344 4.16666666666667e+00 1929 2339 4.16666666666667e+00 1929 2082 -6.25000000000000e+00 1929 2226 -1.87500000000000e+01 1930 1930 6.25000000000000e+01 1930 2346 -4.16666666666667e+00 1930 2342 2.08333333333333e+00 1930 2348 -4.16666666666667e+00 1930 2333 -2.08333333333333e+00 1930 2339 4.16666666666667e+00 1930 2332 -6.25000000000000e+00 1930 2331 4.16666666666667e+00 1930 2337 -8.33333333333333e+00 1930 2165 2.08333333333333e+00 1930 2228 -2.08333333333333e+00 1930 1929 -8.33333333333333e+00 1930 2334 8.33333333333333e+00 1930 2226 4.16666666666667e+00 1930 2018 4.16666666666667e+00 1930 1931 -8.33333333333333e+00 1930 2336 8.33333333333333e+00 1930 2017 -6.25000000000000e+00 1930 2335 -3.75000000000000e+01 1930 2016 -2.08333333333333e+00 1930 2163 2.08333333333333e+00 1930 2084 4.16666666666667e+00 1930 2345 -8.33333333333333e+00 1930 2340 2.08333333333333e+00 1930 2083 -6.25000000000000e+00 1930 2227 -6.25000000000000e+00 1930 2082 -2.08333333333333e+00 1930 2343 4.16666666666667e+00 1931 1931 6.25000000000000e+01 1931 2346 -4.16666666666667e+00 1931 2341 2.08333333333333e+00 1931 2347 -4.16666666666667e+00 1931 2340 -4.16666666666667e+00 1931 2333 -6.25000000000000e+00 1931 2332 -2.08333333333333e+00 1931 2338 4.16666666666667e+00 1931 2331 4.16666666666667e+00 1931 2343 4.16666666666667e+00 1931 2334 -4.16666666666667e+00 1931 2164 2.08333333333333e+00 1931 2227 -2.08333333333333e+00 1931 2018 -1.87500000000000e+01 1931 2336 -1.25000000000000e+01 1931 2017 4.16666666666667e+00 1931 1930 -8.33333333333333e+00 1931 2335 8.33333333333333e+00 1931 2016 4.16666666666667e+00 1931 2163 -4.16666666666667e+00 1931 2337 4.16666666666667e+00 1931 2084 -1.87500000000000e+01 1931 2228 -6.25000000000000e+00 1931 2083 4.16666666666667e+00 1931 2344 -8.33333333333333e+00 1931 1929 -8.33333333333333e+00 1931 2082 4.16666666666667e+00 1931 2226 4.16666666666667e+00 1932 1932 6.25000000000000e+01 1932 2357 4.16666666666667e+00 1932 2356 -8.33333333333333e+00 1932 2354 4.16666666666667e+00 1932 2098 2.08333333333333e+00 1932 2352 -1.87500000000000e+01 1932 2282 4.16666666666667e+00 1932 2281 -2.08333333333333e+00 1932 2020 2.08333333333333e+00 1932 2280 -6.25000000000000e+00 1932 2351 -4.16666666666667e+00 1932 1934 -8.33333333333333e+00 1932 2359 -2.08333333333333e+00 1932 2366 -4.16666666666667e+00 1932 2363 4.16666666666667e+00 1932 2365 -4.16666666666667e+00 1932 2362 4.16666666666667e+00 1932 2360 4.16666666666667e+00 1932 2099 -4.16666666666667e+00 1932 2358 -6.25000000000000e+00 1932 2333 4.16666666666667e+00 1932 2021 -4.16666666666667e+00 1932 2332 4.16666666666667e+00 1932 1933 -8.33333333333333e+00 1932 2350 8.33333333333333e+00 1932 2331 -1.87500000000000e+01 1932 2353 4.16666666666667e+00 1932 2349 -1.25000000000000e+01 1933 1933 6.25000000000000e+01 1933 2357 4.16666666666667e+00 1933 2352 4.16666666666667e+00 1933 2355 -8.33333333333333e+00 1933 2353 -6.25000000000000e+00 1933 2097 2.08333333333333e+00 1933 2282 4.16666666666667e+00 1933 1934 -8.33333333333333e+00 1933 2281 -6.25000000000000e+00 1933 2280 -2.08333333333333e+00 1933 2019 2.08333333333333e+00 1933 2358 -2.08333333333333e+00 1933 2360 4.16666666666667e+00 1933 2351 8.33333333333333e+00 1933 2363 -8.33333333333333e+00 1933 2364 -4.16666666666667e+00 1933 2361 4.16666666666667e+00 1933 2099 2.08333333333333e+00 1933 2366 -4.16666666666667e+00 1933 2359 -6.25000000000000e+00 1933 2333 -2.08333333333333e+00 1933 2021 2.08333333333333e+00 1933 2332 -6.25000000000000e+00 1933 2354 -2.08333333333333e+00 1933 2350 -3.75000000000000e+01 1933 2331 4.16666666666667e+00 1933 1932 -8.33333333333333e+00 1933 2349 8.33333333333333e+00 1934 1934 6.25000000000000e+01 1934 2356 4.16666666666667e+00 1934 2355 4.16666666666667e+00 1934 2354 -6.25000000000000e+00 1934 2352 4.16666666666667e+00 1934 2282 -1.87500000000000e+01 1934 2281 4.16666666666667e+00 1934 1933 -8.33333333333333e+00 1934 2280 4.16666666666667e+00 1934 2349 -4.16666666666667e+00 1934 1932 -8.33333333333333e+00 1934 2359 4.16666666666667e+00 1934 2364 -4.16666666666667e+00 1934 2361 4.16666666666667e+00 1934 2350 8.33333333333333e+00 1934 2362 -8.33333333333333e+00 1934 2360 -1.87500000000000e+01 1934 2098 2.08333333333333e+00 1934 2365 -4.16666666666667e+00 1934 2358 4.16666666666667e+00 1934 2097 -4.16666666666667e+00 1934 2333 -6.25000000000000e+00 1934 2353 -2.08333333333333e+00 1934 2351 -1.25000000000000e+01 1934 2332 -2.08333333333333e+00 1934 2020 2.08333333333333e+00 1934 2331 4.16666666666667e+00 1934 2019 -4.16666666666667e+00 1935 1935 1.25000000000000e+02 1935 2374 -8.33333333333333e+00 1935 2369 8.33333333333333e+00 1935 2381 -8.33333333333333e+00 1935 2383 -4.16666666666667e+00 1935 2380 4.16666666666667e+00 1935 2384 -4.16666666666667e+00 1935 2368 8.33333333333333e+00 1935 2367 -3.75000000000000e+01 1935 2300 8.33333333333333e+00 1935 2194 4.16666666666667e+00 1935 2299 -4.16666666666667e+00 1935 2195 -8.33333333333333e+00 1935 2024 4.16666666666667e+00 1935 2298 -1.25000000000000e+01 1935 2372 -4.16666666666667e+00 1935 2120 4.16666666666667e+00 1935 1936 -1.66666666666667e+01 1935 2371 8.33333333333333e+00 1935 2370 -1.25000000000000e+01 1935 2336 -4.16666666666667e+00 1935 2335 8.33333333333333e+00 1935 2168 -4.16666666666667e+00 1935 2231 4.16666666666667e+00 1935 2260 8.33333333333333e+00 1935 2230 -8.33333333333333e+00 1935 2023 4.16666666666667e+00 1935 2167 -4.16666666666667e+00 1935 2334 -1.25000000000000e+01 1935 1937 -1.66666666666667e+01 1935 2378 8.33333333333333e+00 1935 2261 8.33333333333333e+00 1935 2377 -4.16666666666667e+00 1935 2119 4.16666666666667e+00 1935 2375 4.16666666666667e+00 1935 2376 -1.25000000000000e+01 1935 2259 -3.75000000000000e+01 1936 1936 1.25000000000000e+02 1936 2373 -8.33333333333333e+00 1936 2369 -4.16666666666667e+00 1936 2384 -4.16666666666667e+00 1936 2381 4.16666666666667e+00 1936 2382 -4.16666666666667e+00 1936 2379 4.16666666666667e+00 1936 2368 -1.25000000000000e+01 1936 2367 8.33333333333333e+00 1936 2193 4.16666666666667e+00 1936 2298 -4.16666666666667e+00 1936 2195 4.16666666666667e+00 1936 2300 8.33333333333333e+00 1936 2299 -1.25000000000000e+01 1936 2372 8.33333333333333e+00 1936 2371 -3.75000000000000e+01 1936 1935 -1.66666666666667e+01 1936 2370 8.33333333333333e+00 1936 2261 -4.16666666666667e+00 1936 1937 -1.66666666666667e+01 1936 2168 -4.16666666666667e+00 1936 2231 4.16666666666667e+00 1936 2334 8.33333333333333e+00 1936 2259 8.33333333333333e+00 1936 2229 -8.33333333333333e+00 1936 2024 -8.33333333333333e+00 1936 2336 8.33333333333333e+00 1936 2335 -3.75000000000000e+01 1936 2022 4.16666666666667e+00 1936 2166 -4.16666666666667e+00 1936 2378 8.33333333333333e+00 1936 2120 -8.33333333333333e+00 1936 2375 4.16666666666667e+00 1936 2377 -1.25000000000000e+01 1936 2260 -1.25000000000000e+01 1936 2376 -4.16666666666667e+00 1936 2118 4.16666666666667e+00 1937 1937 1.25000000000000e+02 1937 2374 4.16666666666667e+00 1937 2368 -4.16666666666667e+00 1937 2383 -4.16666666666667e+00 1937 2380 4.16666666666667e+00 1937 2367 8.33333333333333e+00 1937 2379 -8.33333333333333e+00 1937 2382 -4.16666666666667e+00 1937 2369 -1.25000000000000e+01 1937 2298 8.33333333333333e+00 1937 2194 4.16666666666667e+00 1937 2193 -8.33333333333333e+00 1937 2300 -3.75000000000000e+01 1937 2299 8.33333333333333e+00 1937 2022 4.16666666666667e+00 1937 2372 -1.25000000000000e+01 1937 2371 8.33333333333333e+00 1937 2370 -4.16666666666667e+00 1937 2118 4.16666666666667e+00 1937 2260 -4.16666666666667e+00 1937 1936 -1.66666666666667e+01 1937 2334 -4.16666666666667e+00 1937 2167 -4.16666666666667e+00 1937 2230 4.16666666666667e+00 1937 2166 -4.16666666666667e+00 1937 2229 4.16666666666667e+00 1937 2336 -1.25000000000000e+01 1937 2023 -8.33333333333333e+00 1937 2335 8.33333333333333e+00 1937 2373 4.16666666666667e+00 1937 2378 -3.75000000000000e+01 1937 2261 -1.25000000000000e+01 1937 2377 8.33333333333333e+00 1937 2119 -8.33333333333333e+00 1937 1935 -1.66666666666667e+01 1937 2376 8.33333333333333e+00 1937 2259 8.33333333333333e+00 1938 1938 1.25000000000000e+02 1938 2389 8.33333333333333e+00 1938 2388 -1.25000000000000e+01 1938 2303 -8.33333333333333e+00 1938 2302 4.16666666666667e+00 1938 2369 8.33333333333333e+00 1938 2401 4.16666666666667e+00 1938 2368 8.33333333333333e+00 1938 2367 -3.75000000000000e+01 1938 2402 4.16666666666667e+00 1938 2314 -4.16666666666667e+00 1938 2315 8.33333333333333e+00 1938 1940 -1.66666666666667e+01 1938 2027 -4.16666666666667e+00 1938 2313 -1.25000000000000e+01 1938 2393 4.16666666666667e+00 1938 2141 -4.16666666666667e+00 1938 2392 -8.33333333333333e+00 1938 2285 4.16666666666667e+00 1938 2386 8.33333333333333e+00 1938 1939 -1.66666666666667e+01 1938 2387 8.33333333333333e+00 1938 2140 -4.16666666666667e+00 1938 2385 -3.75000000000000e+01 1938 2284 4.16666666666667e+00 1938 2026 -4.16666666666667e+00 1938 2351 -4.16666666666667e+00 1938 2339 4.16666666666667e+00 1938 2398 4.16666666666667e+00 1938 2395 -4.16666666666667e+00 1938 2338 -8.33333333333333e+00 1938 2350 8.33333333333333e+00 1938 2349 -1.25000000000000e+01 1938 2396 8.33333333333333e+00 1938 2399 -8.33333333333333e+00 1938 2394 -1.25000000000000e+01 1938 2390 -4.16666666666667e+00 1939 1939 1.25000000000000e+02 1939 2388 8.33333333333333e+00 1939 2390 8.33333333333333e+00 1939 2389 -3.75000000000000e+01 1939 2301 4.16666666666667e+00 1939 2369 -4.16666666666667e+00 1939 2400 4.16666666666667e+00 1939 2368 -1.25000000000000e+01 1939 2367 8.33333333333333e+00 1939 2402 -8.33333333333333e+00 1939 2313 -4.16666666666667e+00 1939 2393 4.16666666666667e+00 1939 2315 8.33333333333333e+00 1939 2314 -1.25000000000000e+01 1939 2391 -8.33333333333333e+00 1939 2387 -4.16666666666667e+00 1939 2385 8.33333333333333e+00 1939 1938 -1.66666666666667e+01 1939 2386 -1.25000000000000e+01 1939 2139 -4.16666666666667e+00 1939 2285 -8.33333333333333e+00 1939 2283 4.16666666666667e+00 1939 2025 -4.16666666666667e+00 1939 2351 8.33333333333333e+00 1939 1940 -1.66666666666667e+01 1939 2396 8.33333333333333e+00 1939 2397 4.16666666666667e+00 1939 2394 -4.16666666666667e+00 1939 2339 4.16666666666667e+00 1939 2027 -4.16666666666667e+00 1939 2350 -3.75000000000000e+01 1939 2337 -8.33333333333333e+00 1939 2349 8.33333333333333e+00 1939 2399 4.16666666666667e+00 1939 2141 -4.16666666666667e+00 1939 2395 -1.25000000000000e+01 1939 2303 4.16666666666667e+00 1940 1940 1.25000000000000e+02 1940 2302 4.16666666666667e+00 1940 2390 -1.25000000000000e+01 1940 2389 8.33333333333333e+00 1940 2301 -8.33333333333333e+00 1940 2368 -4.16666666666667e+00 1940 2367 8.33333333333333e+00 1940 2369 -1.25000000000000e+01 1940 2401 -8.33333333333333e+00 1940 2400 4.16666666666667e+00 1940 2392 4.16666666666667e+00 1940 2313 8.33333333333333e+00 1940 1938 -1.66666666666667e+01 1940 2315 -3.75000000000000e+01 1940 2314 8.33333333333333e+00 1940 2025 -4.16666666666667e+00 1940 2391 4.16666666666667e+00 1940 2139 -4.16666666666667e+00 1940 2386 -4.16666666666667e+00 1940 2283 4.16666666666667e+00 1940 2387 -1.25000000000000e+01 1940 2385 8.33333333333333e+00 1940 2284 -8.33333333333333e+00 1940 2349 -4.16666666666667e+00 1940 2337 4.16666666666667e+00 1940 2350 8.33333333333333e+00 1940 1939 -1.66666666666667e+01 1940 2395 8.33333333333333e+00 1940 2351 -1.25000000000000e+01 1940 2338 4.16666666666667e+00 1940 2026 -4.16666666666667e+00 1940 2396 -3.75000000000000e+01 1940 2388 -4.16666666666667e+00 1940 2398 4.16666666666667e+00 1940 2140 -4.16666666666667e+00 1940 2394 8.33333333333333e+00 1940 2397 -8.33333333333333e+00 1941 1941 2.50000000000000e+01 1941 2198 -2.08333333333333e+00 1941 2407 2.08333333333333e+00 1941 2404 -2.08333333333333e+00 1941 2051 2.08333333333333e+00 1941 2408 -4.16666666666667e+00 1941 2050 2.08333333333333e+00 1941 1942 -4.16666666666667e+00 1941 2197 4.16666666666667e+00 1941 2049 -6.25000000000000e+00 1941 2196 -6.25000000000000e+00 1941 1943 -4.16666666666667e+00 1941 2036 2.08333333333333e+00 1941 2405 4.16666666666667e+00 1941 2035 2.08333333333333e+00 1941 2179 -4.16666666666667e+00 1941 2180 2.08333333333333e+00 1941 2034 -6.25000000000000e+00 1941 2403 -6.25000000000000e+00 1942 1942 2.91666666666667e+01 1942 2198 4.16666666666667e+00 1942 2405 4.16666666666667e+00 1942 2406 2.08333333333333e+00 1942 2403 -2.08333333333333e+00 1942 2051 -2.08333333333333e+00 1942 2408 2.08333333333333e+00 1942 2050 -2.08333333333333e+00 1942 2197 -1.87500000000000e+01 1942 2049 2.08333333333333e+00 1942 1941 -4.16666666666667e+00 1942 2196 4.16666666666667e+00 1942 2036 -2.08333333333333e+00 1942 2180 2.08333333333333e+00 1942 1943 -8.33333333333333e+00 1942 2035 -2.08333333333333e+00 1942 2404 -6.25000000000000e+00 1942 2034 2.08333333333333e+00 1942 2178 -4.16666666666667e+00 1943 1943 2.91666666666667e+01 1943 2196 -2.08333333333333e+00 1943 1942 -8.33333333333333e+00 1943 2197 4.16666666666667e+00 1943 2404 4.16666666666667e+00 1943 2051 -2.08333333333333e+00 1943 2198 -6.25000000000000e+00 1943 2050 -2.08333333333333e+00 1943 2407 2.08333333333333e+00 1943 2049 2.08333333333333e+00 1943 2406 -4.16666666666667e+00 1943 2178 2.08333333333333e+00 1943 2036 -2.08333333333333e+00 1943 2405 -1.87500000000000e+01 1943 2035 -2.08333333333333e+00 1943 2179 2.08333333333333e+00 1943 1941 -4.16666666666667e+00 1943 2034 2.08333333333333e+00 1943 2403 4.16666666666667e+00 1944 1944 1.00000000000000e+00 1944 2246 0.00000000000000e+00 1944 2410 0.00000000000000e+00 1944 1945 0.00000000000000e+00 1944 2245 0.00000000000000e+00 1944 2108 0.00000000000000e+00 1944 2414 0.00000000000000e+00 1944 2107 0.00000000000000e+00 1944 2413 0.00000000000000e+00 1944 2106 0.00000000000000e+00 1944 2244 0.00000000000000e+00 1944 1946 0.00000000000000e+00 1944 2039 0.00000000000000e+00 1944 2411 0.00000000000000e+00 1944 2038 0.00000000000000e+00 1944 2182 0.00000000000000e+00 1944 2183 0.00000000000000e+00 1944 2037 0.00000000000000e+00 1944 2409 0.00000000000000e+00 1945 1945 1.00000000000000e+00 1945 2414 0.00000000000000e+00 1945 2409 0.00000000000000e+00 1945 1944 0.00000000000000e+00 1945 2244 0.00000000000000e+00 1945 2108 0.00000000000000e+00 1945 1946 0.00000000000000e+00 1945 2246 0.00000000000000e+00 1945 2107 0.00000000000000e+00 1945 2245 0.00000000000000e+00 1945 2106 0.00000000000000e+00 1945 2412 0.00000000000000e+00 1945 2039 0.00000000000000e+00 1945 2183 0.00000000000000e+00 1945 2411 0.00000000000000e+00 1945 2038 0.00000000000000e+00 1945 2410 0.00000000000000e+00 1945 2037 0.00000000000000e+00 1945 2181 0.00000000000000e+00 1946 1946 1.00000000000000e+00 1946 2413 0.00000000000000e+00 1946 2181 0.00000000000000e+00 1946 2244 0.00000000000000e+00 1946 2108 0.00000000000000e+00 1946 2246 0.00000000000000e+00 1946 2107 0.00000000000000e+00 1946 1945 0.00000000000000e+00 1946 2245 0.00000000000000e+00 1946 2106 0.00000000000000e+00 1946 2412 0.00000000000000e+00 1946 2410 0.00000000000000e+00 1946 2039 0.00000000000000e+00 1946 2411 0.00000000000000e+00 1946 2038 0.00000000000000e+00 1946 2182 0.00000000000000e+00 1946 1944 0.00000000000000e+00 1946 2037 0.00000000000000e+00 1946 2409 0.00000000000000e+00 1947 1947 6.25000000000000e+01 1947 2200 4.16666666666667e+00 1947 2201 4.16666666666667e+00 1947 2405 4.16666666666667e+00 1947 2403 -6.25000000000000e+00 1947 2417 4.16666666666667e+00 1947 2416 4.16666666666667e+00 1947 1948 -8.33333333333333e+00 1947 2415 -1.87500000000000e+01 1947 2264 -4.16666666666667e+00 1947 1949 -8.33333333333333e+00 1947 2186 -4.16666666666667e+00 1947 2249 4.16666666666667e+00 1947 2410 4.16666666666667e+00 1947 2263 8.33333333333333e+00 1947 2248 -8.33333333333333e+00 1947 2411 4.16666666666667e+00 1947 2042 -4.16666666666667e+00 1947 2041 2.08333333333333e+00 1947 2185 -4.16666666666667e+00 1947 2409 -1.87500000000000e+01 1947 2420 4.16666666666667e+00 1947 2123 -4.16666666666667e+00 1947 2419 -2.08333333333333e+00 1947 2122 2.08333333333333e+00 1947 2418 -6.25000000000000e+00 1947 2404 -2.08333333333333e+00 1947 2262 -1.25000000000000e+01 1948 1948 6.25000000000000e+01 1948 2403 -2.08333333333333e+00 1948 2199 4.16666666666667e+00 1948 2201 -8.33333333333333e+00 1948 2042 2.08333333333333e+00 1948 2404 -6.25000000000000e+00 1948 2417 -2.08333333333333e+00 1948 2123 2.08333333333333e+00 1948 2416 -6.25000000000000e+00 1948 2415 4.16666666666667e+00 1948 1947 -8.33333333333333e+00 1948 2411 -2.08333333333333e+00 1948 2409 4.16666666666667e+00 1948 2186 -4.16666666666667e+00 1948 2249 4.16666666666667e+00 1948 2262 8.33333333333333e+00 1948 2247 -8.33333333333333e+00 1948 2410 -6.25000000000000e+00 1948 2040 2.08333333333333e+00 1948 2184 -4.16666666666667e+00 1948 2420 4.16666666666667e+00 1948 1949 -8.33333333333333e+00 1948 2264 8.33333333333333e+00 1948 2419 -6.25000000000000e+00 1948 2405 4.16666666666667e+00 1948 2263 -3.75000000000000e+01 1948 2418 -2.08333333333333e+00 1948 2121 2.08333333333333e+00 1949 1949 6.25000000000000e+01 1949 2200 -8.33333333333333e+00 1949 2199 4.16666666666667e+00 1949 2405 -1.87500000000000e+01 1949 2041 2.08333333333333e+00 1949 2403 4.16666666666667e+00 1949 2417 -6.25000000000000e+00 1949 2416 -2.08333333333333e+00 1949 2122 2.08333333333333e+00 1949 2415 4.16666666666667e+00 1949 2262 -4.16666666666667e+00 1949 2410 -2.08333333333333e+00 1949 1947 -8.33333333333333e+00 1949 2184 -4.16666666666667e+00 1949 2247 4.16666666666667e+00 1949 2185 -4.16666666666667e+00 1949 2248 4.16666666666667e+00 1949 2411 -6.25000000000000e+00 1949 2409 4.16666666666667e+00 1949 2040 -4.16666666666667e+00 1949 2420 -1.87500000000000e+01 1949 2404 4.16666666666667e+00 1949 2264 -1.25000000000000e+01 1949 2419 4.16666666666667e+00 1949 1948 -8.33333333333333e+00 1949 2263 8.33333333333333e+00 1949 2418 4.16666666666667e+00 1949 2121 -4.16666666666667e+00 1950 1950 2.50000000000000e+01 1950 2324 -2.08333333333333e+00 1950 2425 2.08333333333333e+00 1950 2422 -2.08333333333333e+00 1950 2066 2.08333333333333e+00 1950 2426 -4.16666666666667e+00 1950 2065 2.08333333333333e+00 1950 1951 -4.16666666666667e+00 1950 2323 4.16666666666667e+00 1950 2064 -6.25000000000000e+00 1950 2322 -6.25000000000000e+00 1950 1952 -4.16666666666667e+00 1950 2054 2.08333333333333e+00 1950 2423 4.16666666666667e+00 1950 2053 2.08333333333333e+00 1950 2305 -4.16666666666667e+00 1950 2306 2.08333333333333e+00 1950 2052 -6.25000000000000e+00 1950 2421 -6.25000000000000e+00 1951 1951 2.91666666666667e+01 1951 2324 4.16666666666667e+00 1951 2423 4.16666666666667e+00 1951 2424 2.08333333333333e+00 1951 2421 -2.08333333333333e+00 1951 2066 -2.08333333333333e+00 1951 2426 2.08333333333333e+00 1951 2065 -2.08333333333333e+00 1951 2323 -1.87500000000000e+01 1951 2064 2.08333333333333e+00 1951 1950 -4.16666666666667e+00 1951 2322 4.16666666666667e+00 1951 2054 -2.08333333333333e+00 1951 2306 2.08333333333333e+00 1951 1952 -8.33333333333333e+00 1951 2053 -2.08333333333333e+00 1951 2422 -6.25000000000000e+00 1951 2052 2.08333333333333e+00 1951 2304 -4.16666666666667e+00 1952 1952 2.91666666666667e+01 1952 2322 -2.08333333333333e+00 1952 1951 -8.33333333333333e+00 1952 2323 4.16666666666667e+00 1952 2422 4.16666666666667e+00 1952 2066 -2.08333333333333e+00 1952 2324 -6.25000000000000e+00 1952 2065 -2.08333333333333e+00 1952 2425 2.08333333333333e+00 1952 2064 2.08333333333333e+00 1952 2424 -4.16666666666667e+00 1952 2304 2.08333333333333e+00 1952 2054 -2.08333333333333e+00 1952 2423 -1.87500000000000e+01 1952 2053 -2.08333333333333e+00 1952 2305 2.08333333333333e+00 1952 1950 -4.16666666666667e+00 1952 2052 2.08333333333333e+00 1952 2421 4.16666666666667e+00 1953 1953 6.25000000000000e+01 1953 1954 -8.33333333333333e+00 1953 2432 -4.16666666666667e+00 1953 2125 -2.08333333333333e+00 1953 2431 2.08333333333333e+00 1953 2429 4.16666666666667e+00 1953 2056 -2.08333333333333e+00 1953 2427 -1.87500000000000e+01 1953 2407 2.08333333333333e+00 1953 2057 4.16666666666667e+00 1953 2408 -4.16666666666667e+00 1953 1955 -8.33333333333333e+00 1953 2417 4.16666666666667e+00 1953 2126 4.16666666666667e+00 1953 2416 4.16666666666667e+00 1953 2415 -1.87500000000000e+01 1953 2203 -4.16666666666667e+00 1953 2308 4.16666666666667e+00 1953 2309 4.16666666666667e+00 1953 2204 -4.16666666666667e+00 1953 2055 -6.25000000000000e+00 1953 2372 -4.16666666666667e+00 1953 2267 4.16666666666667e+00 1953 2371 8.33333333333333e+00 1953 2266 -8.33333333333333e+00 1953 2370 -1.25000000000000e+01 1953 2428 4.16666666666667e+00 1953 2124 -6.25000000000000e+00 1954 1954 6.25000000000000e+01 1954 2432 2.08333333333333e+00 1954 2427 4.16666666666667e+00 1954 1953 -8.33333333333333e+00 1954 2124 -2.08333333333333e+00 1954 2430 2.08333333333333e+00 1954 2428 -6.25000000000000e+00 1954 2055 -2.08333333333333e+00 1954 2406 2.08333333333333e+00 1954 2408 2.08333333333333e+00 1954 2417 -2.08333333333333e+00 1954 2416 -6.25000000000000e+00 1954 2415 4.16666666666667e+00 1954 2202 -4.16666666666667e+00 1954 2307 4.16666666666667e+00 1954 2204 -4.16666666666667e+00 1954 2267 4.16666666666667e+00 1954 2309 -8.33333333333333e+00 1954 2057 4.16666666666667e+00 1954 2056 -6.25000000000000e+00 1954 2372 8.33333333333333e+00 1954 1955 -8.33333333333333e+00 1954 2126 4.16666666666667e+00 1954 2371 -3.75000000000000e+01 1954 2429 -2.08333333333333e+00 1954 2125 -6.25000000000000e+00 1954 2370 8.33333333333333e+00 1954 2265 -8.33333333333333e+00 1955 1955 6.25000000000000e+01 1955 2431 2.08333333333333e+00 1955 2430 -4.16666666666667e+00 1955 2429 -6.25000000000000e+00 1955 2427 4.16666666666667e+00 1955 2407 2.08333333333333e+00 1955 2055 4.16666666666667e+00 1955 2406 -4.16666666666667e+00 1955 2417 -6.25000000000000e+00 1955 2416 -2.08333333333333e+00 1955 1953 -8.33333333333333e+00 1955 2415 4.16666666666667e+00 1955 2124 4.16666666666667e+00 1955 2203 -4.16666666666667e+00 1955 2266 4.16666666666667e+00 1955 2057 -1.87500000000000e+01 1955 2308 -8.33333333333333e+00 1955 2056 4.16666666666667e+00 1955 2307 4.16666666666667e+00 1955 2202 -4.16666666666667e+00 1955 2372 -1.25000000000000e+01 1955 2428 -2.08333333333333e+00 1955 2126 -1.87500000000000e+01 1955 2371 8.33333333333333e+00 1955 1954 -8.33333333333333e+00 1955 2125 4.16666666666667e+00 1955 2370 -4.16666666666667e+00 1955 2265 4.16666666666667e+00 1956 1956 6.25000000000000e+01 1956 2326 4.16666666666667e+00 1956 2327 4.16666666666667e+00 1956 2423 4.16666666666667e+00 1956 2421 -6.25000000000000e+00 1956 2435 4.16666666666667e+00 1956 2434 4.16666666666667e+00 1956 1957 -8.33333333333333e+00 1956 2433 -1.87500000000000e+01 1956 2390 -4.16666666666667e+00 1956 1958 -8.33333333333333e+00 1956 2312 -4.16666666666667e+00 1956 2375 4.16666666666667e+00 1956 2428 4.16666666666667e+00 1956 2389 8.33333333333333e+00 1956 2374 -8.33333333333333e+00 1956 2429 4.16666666666667e+00 1956 2060 -4.16666666666667e+00 1956 2059 2.08333333333333e+00 1956 2311 -4.16666666666667e+00 1956 2427 -1.87500000000000e+01 1956 2438 4.16666666666667e+00 1956 2144 -4.16666666666667e+00 1956 2437 -2.08333333333333e+00 1956 2143 2.08333333333333e+00 1956 2436 -6.25000000000000e+00 1956 2422 -2.08333333333333e+00 1956 2388 -1.25000000000000e+01 1957 1957 6.25000000000000e+01 1957 2421 -2.08333333333333e+00 1957 2325 4.16666666666667e+00 1957 2327 -8.33333333333333e+00 1957 2060 2.08333333333333e+00 1957 2422 -6.25000000000000e+00 1957 2435 -2.08333333333333e+00 1957 2144 2.08333333333333e+00 1957 2434 -6.25000000000000e+00 1957 2433 4.16666666666667e+00 1957 1956 -8.33333333333333e+00 1957 2429 -2.08333333333333e+00 1957 2427 4.16666666666667e+00 1957 2312 -4.16666666666667e+00 1957 2375 4.16666666666667e+00 1957 2388 8.33333333333333e+00 1957 2373 -8.33333333333333e+00 1957 2428 -6.25000000000000e+00 1957 2058 2.08333333333333e+00 1957 2310 -4.16666666666667e+00 1957 2438 4.16666666666667e+00 1957 1958 -8.33333333333333e+00 1957 2390 8.33333333333333e+00 1957 2437 -6.25000000000000e+00 1957 2423 4.16666666666667e+00 1957 2389 -3.75000000000000e+01 1957 2436 -2.08333333333333e+00 1957 2142 2.08333333333333e+00 1958 1958 6.25000000000000e+01 1958 2326 -8.33333333333333e+00 1958 2325 4.16666666666667e+00 1958 2423 -1.87500000000000e+01 1958 2059 2.08333333333333e+00 1958 2421 4.16666666666667e+00 1958 2435 -6.25000000000000e+00 1958 2434 -2.08333333333333e+00 1958 2143 2.08333333333333e+00 1958 2433 4.16666666666667e+00 1958 2388 -4.16666666666667e+00 1958 2428 -2.08333333333333e+00 1958 1956 -8.33333333333333e+00 1958 2310 -4.16666666666667e+00 1958 2373 4.16666666666667e+00 1958 2311 -4.16666666666667e+00 1958 2374 4.16666666666667e+00 1958 2429 -6.25000000000000e+00 1958 2427 4.16666666666667e+00 1958 2058 -4.16666666666667e+00 1958 2438 -1.87500000000000e+01 1958 2422 4.16666666666667e+00 1958 2390 -1.25000000000000e+01 1958 2437 4.16666666666667e+00 1958 1957 -8.33333333333333e+00 1958 2389 8.33333333333333e+00 1958 2436 4.16666666666667e+00 1958 2142 -4.16666666666667e+00 1959 1959 2.50000000000000e+01 1959 2215 2.08333333333333e+00 1959 2444 2.08333333333333e+00 1959 2441 -2.08333333333333e+00 1959 2072 2.08333333333333e+00 1959 2216 -4.16666666666667e+00 1959 2071 2.08333333333333e+00 1959 1960 -4.16666666666667e+00 1959 2440 4.16666666666667e+00 1959 2070 -6.25000000000000e+00 1959 2439 -6.25000000000000e+00 1959 1961 -4.16666666666667e+00 1959 2087 2.08333333333333e+00 1959 2234 4.16666666666667e+00 1959 2086 2.08333333333333e+00 1959 2443 -4.16666666666667e+00 1959 2233 -2.08333333333333e+00 1959 2085 -6.25000000000000e+00 1959 2232 -6.25000000000000e+00 1960 1960 2.91666666666667e+01 1960 2214 2.08333333333333e+00 1960 2234 4.16666666666667e+00 1960 1961 -8.33333333333333e+00 1960 2441 4.16666666666667e+00 1960 2072 -2.08333333333333e+00 1960 2216 2.08333333333333e+00 1960 2071 -2.08333333333333e+00 1960 2440 -1.87500000000000e+01 1960 2070 2.08333333333333e+00 1960 1959 -4.16666666666667e+00 1960 2439 4.16666666666667e+00 1960 2087 -2.08333333333333e+00 1960 2444 2.08333333333333e+00 1960 2232 -2.08333333333333e+00 1960 2086 -2.08333333333333e+00 1960 2233 -6.25000000000000e+00 1960 2085 2.08333333333333e+00 1960 2442 -4.16666666666667e+00 1961 1961 2.91666666666667e+01 1961 1960 -8.33333333333333e+00 1961 2440 4.16666666666667e+00 1961 2442 2.08333333333333e+00 1961 2439 -2.08333333333333e+00 1961 2072 -2.08333333333333e+00 1961 2441 -6.25000000000000e+00 1961 2071 -2.08333333333333e+00 1961 2215 2.08333333333333e+00 1961 2070 2.08333333333333e+00 1961 2214 -4.16666666666667e+00 1961 2233 4.16666666666667e+00 1961 2087 -2.08333333333333e+00 1961 2234 -1.87500000000000e+01 1961 2086 -2.08333333333333e+00 1961 2443 2.08333333333333e+00 1961 1959 -4.16666666666667e+00 1961 2085 2.08333333333333e+00 1961 2232 4.16666666666667e+00 1962 1962 1.00000000000000e+00 1962 2251 0.00000000000000e+00 1962 1964 0.00000000000000e+00 1962 2252 0.00000000000000e+00 1962 2447 0.00000000000000e+00 1962 2111 0.00000000000000e+00 1962 2450 0.00000000000000e+00 1962 2110 0.00000000000000e+00 1962 2449 0.00000000000000e+00 1962 2109 0.00000000000000e+00 1962 2250 0.00000000000000e+00 1962 2075 0.00000000000000e+00 1962 2219 0.00000000000000e+00 1962 1963 0.00000000000000e+00 1962 2074 0.00000000000000e+00 1962 2446 0.00000000000000e+00 1962 2218 0.00000000000000e+00 1962 2073 0.00000000000000e+00 1962 2445 0.00000000000000e+00 1963 1963 1.00000000000000e+00 1963 2250 0.00000000000000e+00 1963 2450 0.00000000000000e+00 1963 2447 0.00000000000000e+00 1963 2111 0.00000000000000e+00 1963 1964 0.00000000000000e+00 1963 2252 0.00000000000000e+00 1963 2110 0.00000000000000e+00 1963 2251 0.00000000000000e+00 1963 2109 0.00000000000000e+00 1963 2448 0.00000000000000e+00 1963 2075 0.00000000000000e+00 1963 2219 0.00000000000000e+00 1963 2217 0.00000000000000e+00 1963 2074 0.00000000000000e+00 1963 2446 0.00000000000000e+00 1963 1962 0.00000000000000e+00 1963 2073 0.00000000000000e+00 1963 2445 0.00000000000000e+00 1964 1964 1.00000000000000e+00 1964 2446 0.00000000000000e+00 1964 1962 0.00000000000000e+00 1964 2250 0.00000000000000e+00 1964 2445 0.00000000000000e+00 1964 2111 0.00000000000000e+00 1964 2252 0.00000000000000e+00 1964 2110 0.00000000000000e+00 1964 1963 0.00000000000000e+00 1964 2251 0.00000000000000e+00 1964 2109 0.00000000000000e+00 1964 2448 0.00000000000000e+00 1964 2449 0.00000000000000e+00 1964 2075 0.00000000000000e+00 1964 2447 0.00000000000000e+00 1964 2074 0.00000000000000e+00 1964 2218 0.00000000000000e+00 1964 2073 0.00000000000000e+00 1964 2217 0.00000000000000e+00 1965 1965 6.25000000000000e+01 1965 2255 -8.33333333333333e+00 1965 2254 4.16666666666667e+00 1965 2078 2.08333333333333e+00 1965 2446 4.16666666666667e+00 1965 2445 -1.87500000000000e+01 1965 2456 -2.08333333333333e+00 1965 2129 2.08333333333333e+00 1965 2455 4.16666666666667e+00 1965 2454 -6.25000000000000e+00 1965 2222 -4.16666666666667e+00 1965 2221 -4.16666666666667e+00 1965 2237 4.16666666666667e+00 1965 2441 -2.08333333333333e+00 1965 1966 -8.33333333333333e+00 1965 2236 4.16666666666667e+00 1965 2269 -4.16666666666667e+00 1965 2077 -4.16666666666667e+00 1965 2440 4.16666666666667e+00 1965 2439 -6.25000000000000e+00 1965 1967 -8.33333333333333e+00 1965 2453 4.16666666666667e+00 1965 2270 8.33333333333333e+00 1965 2452 4.16666666666667e+00 1965 2128 -4.16666666666667e+00 1965 2447 4.16666666666667e+00 1965 2451 -1.87500000000000e+01 1965 2268 -1.25000000000000e+01 1966 1966 6.25000000000000e+01 1966 2255 4.16666666666667e+00 1966 2253 4.16666666666667e+00 1966 2446 -6.25000000000000e+00 1966 2445 4.16666666666667e+00 1966 2456 4.16666666666667e+00 1966 1967 -8.33333333333333e+00 1966 2455 -1.87500000000000e+01 1966 2454 4.16666666666667e+00 1966 2220 -4.16666666666667e+00 1966 2441 4.16666666666667e+00 1966 1965 -8.33333333333333e+00 1966 2237 -8.33333333333333e+00 1966 2270 8.33333333333333e+00 1966 2235 4.16666666666667e+00 1966 2268 -4.16666666666667e+00 1966 2078 2.08333333333333e+00 1966 2222 -4.16666666666667e+00 1966 2440 -1.87500000000000e+01 1966 2076 -4.16666666666667e+00 1966 2439 4.16666666666667e+00 1966 2453 -2.08333333333333e+00 1966 2129 2.08333333333333e+00 1966 2447 -2.08333333333333e+00 1966 2452 -6.25000000000000e+00 1966 2269 -1.25000000000000e+01 1966 2451 4.16666666666667e+00 1966 2127 -4.16666666666667e+00 1967 1967 6.25000000000000e+01 1967 2254 4.16666666666667e+00 1967 2445 4.16666666666667e+00 1967 2253 -8.33333333333333e+00 1967 2447 -6.25000000000000e+00 1967 2076 2.08333333333333e+00 1967 2456 -6.25000000000000e+00 1967 2455 4.16666666666667e+00 1967 1966 -8.33333333333333e+00 1967 2454 -2.08333333333333e+00 1967 2127 2.08333333333333e+00 1967 2220 -4.16666666666667e+00 1967 2440 4.16666666666667e+00 1967 2235 4.16666666666667e+00 1967 2439 -2.08333333333333e+00 1967 2236 -8.33333333333333e+00 1967 2269 8.33333333333333e+00 1967 2441 -6.25000000000000e+00 1967 2077 2.08333333333333e+00 1967 2221 -4.16666666666667e+00 1967 2446 -2.08333333333333e+00 1967 2453 -6.25000000000000e+00 1967 2270 -3.75000000000000e+01 1967 2452 -2.08333333333333e+00 1967 2128 2.08333333333333e+00 1967 1965 -8.33333333333333e+00 1967 2451 4.16666666666667e+00 1967 2268 8.33333333333333e+00 1968 1968 2.50000000000000e+01 1968 2341 2.08333333333333e+00 1968 2462 2.08333333333333e+00 1968 2459 -2.08333333333333e+00 1968 2090 2.08333333333333e+00 1968 2342 -4.16666666666667e+00 1968 2089 2.08333333333333e+00 1968 1969 -4.16666666666667e+00 1968 2458 4.16666666666667e+00 1968 2088 -6.25000000000000e+00 1968 2457 -6.25000000000000e+00 1968 1970 -4.16666666666667e+00 1968 2102 2.08333333333333e+00 1968 2360 4.16666666666667e+00 1968 2101 2.08333333333333e+00 1968 2461 -4.16666666666667e+00 1968 2359 -2.08333333333333e+00 1968 2100 -6.25000000000000e+00 1968 2358 -6.25000000000000e+00 1969 1969 2.91666666666667e+01 1969 2340 2.08333333333333e+00 1969 2360 4.16666666666667e+00 1969 1970 -8.33333333333333e+00 1969 2459 4.16666666666667e+00 1969 2090 -2.08333333333333e+00 1969 2342 2.08333333333333e+00 1969 2089 -2.08333333333333e+00 1969 2458 -1.87500000000000e+01 1969 2088 2.08333333333333e+00 1969 1968 -4.16666666666667e+00 1969 2457 4.16666666666667e+00 1969 2102 -2.08333333333333e+00 1969 2462 2.08333333333333e+00 1969 2358 -2.08333333333333e+00 1969 2101 -2.08333333333333e+00 1969 2359 -6.25000000000000e+00 1969 2100 2.08333333333333e+00 1969 2460 -4.16666666666667e+00 1970 1970 2.91666666666667e+01 1970 1969 -8.33333333333333e+00 1970 2458 4.16666666666667e+00 1970 2460 2.08333333333333e+00 1970 2457 -2.08333333333333e+00 1970 2090 -2.08333333333333e+00 1970 2459 -6.25000000000000e+00 1970 2089 -2.08333333333333e+00 1970 2341 2.08333333333333e+00 1970 2088 2.08333333333333e+00 1970 2340 -4.16666666666667e+00 1970 2359 4.16666666666667e+00 1970 2102 -2.08333333333333e+00 1970 2360 -1.87500000000000e+01 1970 2101 -2.08333333333333e+00 1970 2461 2.08333333333333e+00 1970 1968 -4.16666666666667e+00 1970 2100 2.08333333333333e+00 1970 2358 4.16666666666667e+00 1971 1971 6.25000000000000e+01 1971 2465 4.16666666666667e+00 1971 2132 -2.08333333333333e+00 1971 2468 2.08333333333333e+00 1971 2467 -4.16666666666667e+00 1971 2093 -2.08333333333333e+00 1971 2464 4.16666666666667e+00 1971 2463 -1.87500000000000e+01 1971 2345 4.16666666666667e+00 1971 2344 4.16666666666667e+00 1971 2378 8.33333333333333e+00 1971 2377 -4.16666666666667e+00 1971 2376 -1.25000000000000e+01 1971 2240 -4.16666666666667e+00 1971 2444 2.08333333333333e+00 1971 2239 -4.16666666666667e+00 1971 2272 4.16666666666667e+00 1971 2443 -4.16666666666667e+00 1971 2092 4.16666666666667e+00 1971 2091 -6.25000000000000e+00 1971 2453 4.16666666666667e+00 1971 2273 -8.33333333333333e+00 1971 2452 4.16666666666667e+00 1971 1972 -8.33333333333333e+00 1971 2131 4.16666666666667e+00 1971 2451 -1.87500000000000e+01 1971 1973 -8.33333333333333e+00 1971 2130 -6.25000000000000e+00 1972 1972 6.25000000000000e+01 1972 2465 -2.08333333333333e+00 1972 2466 -4.16666666666667e+00 1972 2464 -6.25000000000000e+00 1972 2463 4.16666666666667e+00 1972 2345 -8.33333333333333e+00 1972 2093 4.16666666666667e+00 1972 2343 4.16666666666667e+00 1972 2378 8.33333333333333e+00 1972 1973 -8.33333333333333e+00 1972 2132 4.16666666666667e+00 1972 2377 -1.25000000000000e+01 1972 2376 -4.16666666666667e+00 1972 2238 -4.16666666666667e+00 1972 2271 4.16666666666667e+00 1972 2444 2.08333333333333e+00 1972 2240 -4.16666666666667e+00 1972 2092 -1.87500000000000e+01 1972 2442 -4.16666666666667e+00 1972 2091 4.16666666666667e+00 1972 2453 -2.08333333333333e+00 1972 2273 4.16666666666667e+00 1972 2452 -6.25000000000000e+00 1972 2468 2.08333333333333e+00 1972 2131 -1.87500000000000e+01 1972 2451 4.16666666666667e+00 1972 1971 -8.33333333333333e+00 1972 2130 4.16666666666667e+00 1973 1973 6.25000000000000e+01 1973 2464 -2.08333333333333e+00 1973 1971 -8.33333333333333e+00 1973 2463 4.16666666666667e+00 1973 2130 -2.08333333333333e+00 1973 2466 2.08333333333333e+00 1973 2465 -6.25000000000000e+00 1973 2091 -2.08333333333333e+00 1973 2343 4.16666666666667e+00 1973 2344 -8.33333333333333e+00 1973 2092 4.16666666666667e+00 1973 2378 -3.75000000000000e+01 1973 2377 8.33333333333333e+00 1973 1972 -8.33333333333333e+00 1973 2131 4.16666666666667e+00 1973 2376 8.33333333333333e+00 1973 2238 -4.16666666666667e+00 1973 2442 2.08333333333333e+00 1973 2093 -6.25000000000000e+00 1973 2443 2.08333333333333e+00 1973 2239 -4.16666666666667e+00 1973 2453 -6.25000000000000e+00 1973 2467 2.08333333333333e+00 1973 2132 -6.25000000000000e+00 1973 2452 -2.08333333333333e+00 1973 2272 4.16666666666667e+00 1973 2451 4.16666666666667e+00 1973 2271 -8.33333333333333e+00 1974 1974 6.25000000000000e+01 1974 2381 -8.33333333333333e+00 1974 2380 4.16666666666667e+00 1974 2096 2.08333333333333e+00 1974 2464 4.16666666666667e+00 1974 2463 -1.87500000000000e+01 1974 2474 -2.08333333333333e+00 1974 2147 2.08333333333333e+00 1974 2473 4.16666666666667e+00 1974 2472 -6.25000000000000e+00 1974 2348 -4.16666666666667e+00 1974 2347 -4.16666666666667e+00 1974 2363 4.16666666666667e+00 1974 2459 -2.08333333333333e+00 1974 1975 -8.33333333333333e+00 1974 2362 4.16666666666667e+00 1974 2395 -4.16666666666667e+00 1974 2095 -4.16666666666667e+00 1974 2458 4.16666666666667e+00 1974 2457 -6.25000000000000e+00 1974 1976 -8.33333333333333e+00 1974 2471 4.16666666666667e+00 1974 2396 8.33333333333333e+00 1974 2470 4.16666666666667e+00 1974 2146 -4.16666666666667e+00 1974 2465 4.16666666666667e+00 1974 2469 -1.87500000000000e+01 1974 2394 -1.25000000000000e+01 1975 1975 6.25000000000000e+01 1975 2381 4.16666666666667e+00 1975 2379 4.16666666666667e+00 1975 2464 -6.25000000000000e+00 1975 2463 4.16666666666667e+00 1975 2474 4.16666666666667e+00 1975 1976 -8.33333333333333e+00 1975 2473 -1.87500000000000e+01 1975 2472 4.16666666666667e+00 1975 2346 -4.16666666666667e+00 1975 2459 4.16666666666667e+00 1975 1974 -8.33333333333333e+00 1975 2363 -8.33333333333333e+00 1975 2396 8.33333333333333e+00 1975 2361 4.16666666666667e+00 1975 2394 -4.16666666666667e+00 1975 2096 2.08333333333333e+00 1975 2348 -4.16666666666667e+00 1975 2458 -1.87500000000000e+01 1975 2094 -4.16666666666667e+00 1975 2457 4.16666666666667e+00 1975 2471 -2.08333333333333e+00 1975 2147 2.08333333333333e+00 1975 2465 -2.08333333333333e+00 1975 2470 -6.25000000000000e+00 1975 2395 -1.25000000000000e+01 1975 2469 4.16666666666667e+00 1975 2145 -4.16666666666667e+00 1976 1976 6.25000000000000e+01 1976 2380 4.16666666666667e+00 1976 2463 4.16666666666667e+00 1976 2379 -8.33333333333333e+00 1976 2465 -6.25000000000000e+00 1976 2094 2.08333333333333e+00 1976 2474 -6.25000000000000e+00 1976 2473 4.16666666666667e+00 1976 1975 -8.33333333333333e+00 1976 2472 -2.08333333333333e+00 1976 2145 2.08333333333333e+00 1976 2346 -4.16666666666667e+00 1976 2458 4.16666666666667e+00 1976 2361 4.16666666666667e+00 1976 2457 -2.08333333333333e+00 1976 2362 -8.33333333333333e+00 1976 2395 8.33333333333333e+00 1976 2459 -6.25000000000000e+00 1976 2095 2.08333333333333e+00 1976 2347 -4.16666666666667e+00 1976 2464 -2.08333333333333e+00 1976 2471 -6.25000000000000e+00 1976 2396 -3.75000000000000e+01 1976 2470 -2.08333333333333e+00 1976 2146 2.08333333333333e+00 1976 1974 -8.33333333333333e+00 1976 2469 4.16666666666667e+00 1976 2394 8.33333333333333e+00 1977 1977 3.75000000000000e+01 1977 2414 -4.16666666666667e+00 1977 2413 2.08333333333333e+00 1977 1979 -4.16666666666667e+00 1977 2420 4.16666666666667e+00 1977 2135 2.08333333333333e+00 1977 2419 -2.08333333333333e+00 1977 2418 -6.25000000000000e+00 1977 2257 -4.16666666666667e+00 1977 2275 4.16666666666667e+00 1977 2450 2.08333333333333e+00 1977 2258 -4.16666666666667e+00 1977 2113 2.08333333333333e+00 1977 2449 -4.16666666666667e+00 1977 2112 -1.25000000000000e+01 1977 2456 -2.08333333333333e+00 1977 2276 4.16666666666667e+00 1977 1978 -4.16666666666667e+00 1977 2455 4.16666666666667e+00 1977 2134 2.08333333333333e+00 1977 2114 2.08333333333333e+00 1977 2454 -6.25000000000000e+00 1977 2133 -1.25000000000000e+01 1978 1978 3.33333333333333e+01 1978 2412 2.08333333333333e+00 1978 2420 4.16666666666667e+00 1978 2419 -6.25000000000000e+00 1978 2418 -2.08333333333333e+00 1978 2450 2.08333333333333e+00 1978 2258 -4.16666666666667e+00 1978 2256 -4.16666666666667e+00 1978 2274 4.16666666666667e+00 1978 2113 -4.16666666666667e+00 1978 2112 2.08333333333333e+00 1978 2448 -4.16666666666667e+00 1978 2456 4.16666666666667e+00 1978 2276 -8.33333333333333e+00 1978 2414 2.08333333333333e+00 1978 2455 -1.87500000000000e+01 1978 2134 -4.16666666666667e+00 1978 1977 -4.16666666666667e+00 1978 2454 4.16666666666667e+00 1978 2133 2.08333333333333e+00 1979 1979 3.33333333333333e+01 1979 2112 2.08333333333333e+00 1979 2412 -4.16666666666667e+00 1979 2420 -1.87500000000000e+01 1979 2419 4.16666666666667e+00 1979 1977 -4.16666666666667e+00 1979 2418 4.16666666666667e+00 1979 2133 2.08333333333333e+00 1979 2449 2.08333333333333e+00 1979 2257 -4.16666666666667e+00 1979 2114 -4.16666666666667e+00 1979 2448 2.08333333333333e+00 1979 2256 -4.16666666666667e+00 1979 2413 2.08333333333333e+00 1979 2456 -6.25000000000000e+00 1979 2135 -4.16666666666667e+00 1979 2455 4.16666666666667e+00 1979 2275 -8.33333333333333e+00 1979 2454 -2.08333333333333e+00 1979 2274 4.16666666666667e+00 1980 1980 3.75000000000000e+01 1980 2432 -4.16666666666667e+00 1980 2431 2.08333333333333e+00 1980 1982 -4.16666666666667e+00 1980 2438 4.16666666666667e+00 1980 2150 2.08333333333333e+00 1980 2437 -2.08333333333333e+00 1980 2436 -6.25000000000000e+00 1980 2383 -4.16666666666667e+00 1980 2401 4.16666666666667e+00 1980 2468 2.08333333333333e+00 1980 2384 -4.16666666666667e+00 1980 2137 2.08333333333333e+00 1980 2467 -4.16666666666667e+00 1980 2136 -1.25000000000000e+01 1980 2474 -2.08333333333333e+00 1980 2402 4.16666666666667e+00 1980 1981 -4.16666666666667e+00 1980 2473 4.16666666666667e+00 1980 2149 2.08333333333333e+00 1980 2138 2.08333333333333e+00 1980 2472 -6.25000000000000e+00 1980 2148 -1.25000000000000e+01 1981 1981 3.33333333333333e+01 1981 2430 2.08333333333333e+00 1981 2438 4.16666666666667e+00 1981 2437 -6.25000000000000e+00 1981 2436 -2.08333333333333e+00 1981 2468 2.08333333333333e+00 1981 2384 -4.16666666666667e+00 1981 2382 -4.16666666666667e+00 1981 2400 4.16666666666667e+00 1981 2137 -4.16666666666667e+00 1981 2136 2.08333333333333e+00 1981 2466 -4.16666666666667e+00 1981 2474 4.16666666666667e+00 1981 2402 -8.33333333333333e+00 1981 2432 2.08333333333333e+00 1981 2473 -1.87500000000000e+01 1981 2149 -4.16666666666667e+00 1981 1980 -4.16666666666667e+00 1981 2472 4.16666666666667e+00 1981 2148 2.08333333333333e+00 1982 1982 3.33333333333333e+01 1982 2136 2.08333333333333e+00 1982 2430 -4.16666666666667e+00 1982 2438 -1.87500000000000e+01 1982 2437 4.16666666666667e+00 1982 1980 -4.16666666666667e+00 1982 2436 4.16666666666667e+00 1982 2148 2.08333333333333e+00 1982 2467 2.08333333333333e+00 1982 2383 -4.16666666666667e+00 1982 2138 -4.16666666666667e+00 1982 2466 2.08333333333333e+00 1982 2382 -4.16666666666667e+00 1982 2431 2.08333333333333e+00 1982 2474 -6.25000000000000e+00 1982 2150 -4.16666666666667e+00 1982 2473 4.16666666666667e+00 1982 2401 -8.33333333333333e+00 1982 2472 -2.08333333333333e+00 1982 2400 4.16666666666667e+00 1983 1983 3.75000000000000e+01 1983 1900 2.08333333333333e+00 1983 2152 -4.16666666666667e+00 1983 1991 -2.08333333333333e+00 1983 1984 -4.16666666666667e+00 1983 1990 4.16666666666667e+00 1983 1876 0.00000000000000e+00 1983 1989 -6.25000000000000e+00 1983 2159 -4.16666666666667e+00 1983 2003 4.16666666666667e+00 1983 1901 2.08333333333333e+00 1983 2156 -4.16666666666667e+00 1983 2155 2.08333333333333e+00 1983 2158 -4.16666666666667e+00 1983 1899 -1.25000000000000e+01 1983 1985 -4.16666666666667e+00 1983 1997 4.16666666666667e+00 1983 1877 0.00000000000000e+00 1983 1996 -2.08333333333333e+00 1983 2002 4.16666666666667e+00 1983 2153 2.08333333333333e+00 1983 1995 -6.25000000000000e+00 1983 1875 0.00000000000000e+00 1984 1984 3.33333333333333e+01 1984 1899 2.08333333333333e+00 1984 2151 -4.16666666666667e+00 1984 1991 4.16666666666667e+00 1984 1990 -1.87500000000000e+01 1984 1983 -4.16666666666667e+00 1984 1989 4.16666666666667e+00 1984 1875 0.00000000000000e+00 1984 2156 2.08333333333333e+00 1984 2159 -4.16666666666667e+00 1984 1900 -4.16666666666667e+00 1984 2154 2.08333333333333e+00 1984 2157 -4.16666666666667e+00 1984 1997 4.16666666666667e+00 1984 2003 -8.33333333333333e+00 1984 2153 2.08333333333333e+00 1984 1996 -6.25000000000000e+00 1984 1876 0.00000000000000e+00 1984 1995 -2.08333333333333e+00 1984 2001 4.16666666666667e+00 1985 1985 3.33333333333333e+01 1985 2151 2.08333333333333e+00 1985 1991 -6.25000000000000e+00 1985 1990 4.16666666666667e+00 1985 1989 -2.08333333333333e+00 1985 2155 2.08333333333333e+00 1985 2158 -4.16666666666667e+00 1985 2157 -4.16666666666667e+00 1985 2001 4.16666666666667e+00 1985 1901 -4.16666666666667e+00 1985 1899 2.08333333333333e+00 1985 2154 -4.16666666666667e+00 1985 2152 2.08333333333333e+00 1985 1997 -1.87500000000000e+01 1985 1877 0.00000000000000e+00 1985 1996 4.16666666666667e+00 1985 2002 -8.33333333333333e+00 1985 1983 -4.16666666666667e+00 1985 1995 4.16666666666667e+00 1985 1875 0.00000000000000e+00 1986 1986 1.00000000000000e+00 1986 2170 0.00000000000000e+00 1986 1903 0.00000000000000e+00 1986 1991 0.00000000000000e+00 1986 1990 0.00000000000000e+00 1986 1987 0.00000000000000e+00 1986 1876 0.00000000000000e+00 1986 1989 0.00000000000000e+00 1986 2177 0.00000000000000e+00 1986 2174 0.00000000000000e+00 1986 2173 0.00000000000000e+00 1986 2176 0.00000000000000e+00 1986 1902 0.00000000000000e+00 1986 2000 0.00000000000000e+00 1986 2003 0.00000000000000e+00 1986 1999 0.00000000000000e+00 1986 2002 0.00000000000000e+00 1986 1998 0.00000000000000e+00 1986 2171 0.00000000000000e+00 1986 1875 0.00000000000000e+00 1987 1987 1.00000000000000e+00 1987 2169 0.00000000000000e+00 1987 1902 0.00000000000000e+00 1987 1991 0.00000000000000e+00 1987 1990 0.00000000000000e+00 1987 1989 0.00000000000000e+00 1987 1986 0.00000000000000e+00 1987 1875 0.00000000000000e+00 1987 2177 0.00000000000000e+00 1987 2003 0.00000000000000e+00 1987 2174 0.00000000000000e+00 1987 1904 0.00000000000000e+00 1987 1903 0.00000000000000e+00 1987 2172 0.00000000000000e+00 1987 2175 0.00000000000000e+00 1987 2000 0.00000000000000e+00 1987 1988 0.00000000000000e+00 1987 1877 0.00000000000000e+00 1987 1999 0.00000000000000e+00 1987 2171 0.00000000000000e+00 1987 1876 0.00000000000000e+00 1987 1998 0.00000000000000e+00 1987 2001 0.00000000000000e+00 1988 1988 1.00000000000000e+00 1988 2170 0.00000000000000e+00 1988 1991 0.00000000000000e+00 1988 1990 0.00000000000000e+00 1988 1989 0.00000000000000e+00 1988 2175 0.00000000000000e+00 1988 2172 0.00000000000000e+00 1988 2176 0.00000000000000e+00 1988 2002 0.00000000000000e+00 1988 1904 0.00000000000000e+00 1988 2173 0.00000000000000e+00 1988 1903 0.00000000000000e+00 1988 2000 0.00000000000000e+00 1988 2169 0.00000000000000e+00 1988 1877 0.00000000000000e+00 1988 1999 0.00000000000000e+00 1988 1987 0.00000000000000e+00 1988 1876 0.00000000000000e+00 1988 1998 0.00000000000000e+00 1988 2001 0.00000000000000e+00 1989 1989 6.25000000000000e+01 1989 2176 4.16666666666667e+00 1989 2177 4.16666666666667e+00 1989 2170 4.16666666666667e+00 1989 2169 -6.25000000000000e+00 1989 1991 -8.33333333333333e+00 1989 1988 0.00000000000000e+00 1989 1987 0.00000000000000e+00 1989 1986 0.00000000000000e+00 1989 2002 -4.16666666666667e+00 1989 1990 -8.33333333333333e+00 1989 2153 4.16666666666667e+00 1989 2188 -4.16666666666667e+00 1989 2158 4.16666666666667e+00 1989 2003 8.33333333333333e+00 1989 2159 -8.33333333333333e+00 1989 1907 2.08333333333333e+00 1989 2189 -4.16666666666667e+00 1989 2152 4.16666666666667e+00 1989 1906 -4.16666666666667e+00 1989 2151 -1.87500000000000e+01 1989 1985 -2.08333333333333e+00 1989 1877 0.00000000000000e+00 1989 1984 4.16666666666667e+00 1989 1876 0.00000000000000e+00 1989 1983 -6.25000000000000e+00 1989 2171 -2.08333333333333e+00 1989 2001 -1.25000000000000e+01 1990 1990 6.25000000000000e+01 1990 2175 4.16666666666667e+00 1990 2177 -8.33333333333333e+00 1990 1907 2.08333333333333e+00 1990 2170 -1.87500000000000e+01 1990 2169 4.16666666666667e+00 1990 1988 0.00000000000000e+00 1990 1877 0.00000000000000e+00 1990 1987 0.00000000000000e+00 1990 1986 0.00000000000000e+00 1990 2001 -4.16666666666667e+00 1990 2153 -2.08333333333333e+00 1990 1989 -8.33333333333333e+00 1990 2187 -4.16666666666667e+00 1990 2157 4.16666666666667e+00 1990 2189 -4.16666666666667e+00 1990 2159 4.16666666666667e+00 1990 2152 -6.25000000000000e+00 1990 2151 4.16666666666667e+00 1990 1905 -4.16666666666667e+00 1990 1985 4.16666666666667e+00 1990 1991 -8.33333333333333e+00 1990 2003 8.33333333333333e+00 1990 1984 -1.87500000000000e+01 1990 2171 4.16666666666667e+00 1990 2002 -1.25000000000000e+01 1990 1983 4.16666666666667e+00 1990 1875 0.00000000000000e+00 1991 1991 6.25000000000000e+01 1991 2170 4.16666666666667e+00 1991 2176 -8.33333333333333e+00 1991 2175 4.16666666666667e+00 1991 2171 -6.25000000000000e+00 1991 1906 2.08333333333333e+00 1991 1988 0.00000000000000e+00 1991 1987 0.00000000000000e+00 1991 1876 0.00000000000000e+00 1991 1989 -8.33333333333333e+00 1991 1986 0.00000000000000e+00 1991 2152 -2.08333333333333e+00 1991 2151 4.16666666666667e+00 1991 2188 -4.16666666666667e+00 1991 2158 4.16666666666667e+00 1991 2001 8.33333333333333e+00 1991 2157 -8.33333333333333e+00 1991 2153 -6.25000000000000e+00 1991 1905 2.08333333333333e+00 1991 2187 -4.16666666666667e+00 1991 1985 -6.25000000000000e+00 1991 2169 -2.08333333333333e+00 1991 2003 -3.75000000000000e+01 1991 1984 4.16666666666667e+00 1991 1990 -8.33333333333333e+00 1991 2002 8.33333333333333e+00 1991 1983 -2.08333333333333e+00 1991 1875 0.00000000000000e+00 1992 1992 1.00000000000000e+00 1992 2210 0.00000000000000e+00 1992 2000 0.00000000000000e+00 1992 1999 0.00000000000000e+00 1992 1998 0.00000000000000e+00 1992 2003 0.00000000000000e+00 1992 2213 0.00000000000000e+00 1992 2206 0.00000000000000e+00 1992 2212 0.00000000000000e+00 1992 1910 0.00000000000000e+00 1992 2207 0.00000000000000e+00 1992 1908 0.00000000000000e+00 1992 1994 0.00000000000000e+00 1992 1997 0.00000000000000e+00 1992 1877 0.00000000000000e+00 1992 1996 0.00000000000000e+00 1992 2002 0.00000000000000e+00 1992 2209 0.00000000000000e+00 1992 1995 0.00000000000000e+00 1992 1875 0.00000000000000e+00 1993 1993 1.00000000000000e+00 1993 2210 0.00000000000000e+00 1993 1910 0.00000000000000e+00 1993 2000 0.00000000000000e+00 1993 1994 0.00000000000000e+00 1993 1877 0.00000000000000e+00 1993 1999 0.00000000000000e+00 1993 1998 0.00000000000000e+00 1993 2205 0.00000000000000e+00 1993 2211 0.00000000000000e+00 1993 2207 0.00000000000000e+00 1993 2213 0.00000000000000e+00 1993 1909 0.00000000000000e+00 1993 1997 0.00000000000000e+00 1993 2003 0.00000000000000e+00 1993 2208 0.00000000000000e+00 1993 1996 0.00000000000000e+00 1993 1876 0.00000000000000e+00 1993 1995 0.00000000000000e+00 1993 2001 0.00000000000000e+00 1994 1994 1.00000000000000e+00 1994 1909 0.00000000000000e+00 1994 2208 0.00000000000000e+00 1994 2000 0.00000000000000e+00 1994 1999 0.00000000000000e+00 1994 1993 0.00000000000000e+00 1994 1876 0.00000000000000e+00 1994 1998 0.00000000000000e+00 1994 2001 0.00000000000000e+00 1994 2211 0.00000000000000e+00 1994 1910 0.00000000000000e+00 1994 2206 0.00000000000000e+00 1994 2212 0.00000000000000e+00 1994 1908 0.00000000000000e+00 1994 2205 0.00000000000000e+00 1994 2209 0.00000000000000e+00 1994 1997 0.00000000000000e+00 1994 1877 0.00000000000000e+00 1994 1996 0.00000000000000e+00 1994 2002 0.00000000000000e+00 1994 1992 0.00000000000000e+00 1994 1995 0.00000000000000e+00 1994 1875 0.00000000000000e+00 1995 1995 6.25000000000000e+01 1995 2159 4.16666666666667e+00 1995 2158 -8.33333333333333e+00 1995 2156 4.16666666666667e+00 1995 1912 2.08333333333333e+00 1995 2154 -1.87500000000000e+01 1995 1985 4.16666666666667e+00 1995 1984 -2.08333333333333e+00 1995 1876 0.00000000000000e+00 1995 1983 -6.25000000000000e+00 1995 2003 -4.16666666666667e+00 1995 1997 -8.33333333333333e+00 1995 2206 -2.08333333333333e+00 1995 2225 -4.16666666666667e+00 1995 2213 4.16666666666667e+00 1995 2224 -4.16666666666667e+00 1995 2212 4.16666666666667e+00 1995 2207 4.16666666666667e+00 1995 1913 -4.16666666666667e+00 1995 2205 -6.25000000000000e+00 1995 1994 0.00000000000000e+00 1995 1877 0.00000000000000e+00 1995 1993 0.00000000000000e+00 1995 1996 -8.33333333333333e+00 1995 2002 8.33333333333333e+00 1995 1992 0.00000000000000e+00 1995 2155 4.16666666666667e+00 1995 2001 -1.25000000000000e+01 1996 1996 6.25000000000000e+01 1996 2159 4.16666666666667e+00 1996 2154 4.16666666666667e+00 1996 2157 -8.33333333333333e+00 1996 2155 -6.25000000000000e+00 1996 1911 2.08333333333333e+00 1996 1985 4.16666666666667e+00 1996 1997 -8.33333333333333e+00 1996 1984 -6.25000000000000e+00 1996 1983 -2.08333333333333e+00 1996 1875 0.00000000000000e+00 1996 2205 -2.08333333333333e+00 1996 2207 4.16666666666667e+00 1996 2003 8.33333333333333e+00 1996 2213 -8.33333333333333e+00 1996 2223 -4.16666666666667e+00 1996 2211 4.16666666666667e+00 1996 1913 2.08333333333333e+00 1996 2225 -4.16666666666667e+00 1996 2206 -6.25000000000000e+00 1996 1994 0.00000000000000e+00 1996 1877 0.00000000000000e+00 1996 1993 0.00000000000000e+00 1996 2156 -2.08333333333333e+00 1996 2002 -3.75000000000000e+01 1996 1992 0.00000000000000e+00 1996 1995 -8.33333333333333e+00 1996 2001 8.33333333333333e+00 1997 1997 6.25000000000000e+01 1997 2158 4.16666666666667e+00 1997 2157 4.16666666666667e+00 1997 2156 -6.25000000000000e+00 1997 2154 4.16666666666667e+00 1997 1985 -1.87500000000000e+01 1997 1984 4.16666666666667e+00 1997 1996 -8.33333333333333e+00 1997 1983 4.16666666666667e+00 1997 2001 -4.16666666666667e+00 1997 1995 -8.33333333333333e+00 1997 2206 4.16666666666667e+00 1997 2223 -4.16666666666667e+00 1997 2211 4.16666666666667e+00 1997 2002 8.33333333333333e+00 1997 2212 -8.33333333333333e+00 1997 2207 -1.87500000000000e+01 1997 1912 2.08333333333333e+00 1997 2224 -4.16666666666667e+00 1997 2205 4.16666666666667e+00 1997 1911 -4.16666666666667e+00 1997 1994 0.00000000000000e+00 1997 2155 -2.08333333333333e+00 1997 2003 -1.25000000000000e+01 1997 1993 0.00000000000000e+00 1997 1876 0.00000000000000e+00 1997 1992 0.00000000000000e+00 1997 1875 0.00000000000000e+00 1998 1998 1.00000000000000e+00 1998 2174 0.00000000000000e+00 1998 2173 0.00000000000000e+00 1998 2176 0.00000000000000e+00 1998 1915 0.00000000000000e+00 1998 2172 0.00000000000000e+00 1998 2000 0.00000000000000e+00 1998 1988 0.00000000000000e+00 1998 1987 0.00000000000000e+00 1998 1876 0.00000000000000e+00 1998 1986 0.00000000000000e+00 1998 2209 0.00000000000000e+00 1998 2210 0.00000000000000e+00 1998 2003 0.00000000000000e+00 1998 2213 0.00000000000000e+00 1998 2242 0.00000000000000e+00 1998 2212 0.00000000000000e+00 1998 1916 0.00000000000000e+00 1998 2243 0.00000000000000e+00 1998 2208 0.00000000000000e+00 1998 1994 0.00000000000000e+00 1998 1877 0.00000000000000e+00 1998 1999 0.00000000000000e+00 1998 1993 0.00000000000000e+00 1998 2002 0.00000000000000e+00 1998 2177 0.00000000000000e+00 1998 1992 0.00000000000000e+00 1998 2001 0.00000000000000e+00 1999 1999 1.00000000000000e+00 1999 2177 0.00000000000000e+00 1999 2175 0.00000000000000e+00 1999 2174 0.00000000000000e+00 1999 2173 0.00000000000000e+00 1999 1914 0.00000000000000e+00 1999 1988 0.00000000000000e+00 1999 1987 0.00000000000000e+00 1999 1986 0.00000000000000e+00 1999 1875 0.00000000000000e+00 1999 2003 0.00000000000000e+00 1999 2000 0.00000000000000e+00 1999 2208 0.00000000000000e+00 1999 2243 0.00000000000000e+00 1999 2213 0.00000000000000e+00 1999 2241 0.00000000000000e+00 1999 2211 0.00000000000000e+00 1999 1916 0.00000000000000e+00 1999 2210 0.00000000000000e+00 1999 2209 0.00000000000000e+00 1999 1994 0.00000000000000e+00 1999 1877 0.00000000000000e+00 1999 2172 0.00000000000000e+00 1999 1993 0.00000000000000e+00 1999 2002 0.00000000000000e+00 1999 1998 0.00000000000000e+00 1999 1992 0.00000000000000e+00 1999 2001 0.00000000000000e+00 2000 2000 1.00000000000000e+00 2000 2172 0.00000000000000e+00 2000 2176 0.00000000000000e+00 2000 2174 0.00000000000000e+00 2000 2173 0.00000000000000e+00 2000 1988 0.00000000000000e+00 2000 1987 0.00000000000000e+00 2000 1998 0.00000000000000e+00 2000 1986 0.00000000000000e+00 2000 2002 0.00000000000000e+00 2000 1999 0.00000000000000e+00 2000 2242 0.00000000000000e+00 2000 2212 0.00000000000000e+00 2000 2208 0.00000000000000e+00 2000 2001 0.00000000000000e+00 2000 2211 0.00000000000000e+00 2000 2210 0.00000000000000e+00 2000 1915 0.00000000000000e+00 2000 2209 0.00000000000000e+00 2000 1914 0.00000000000000e+00 2000 2241 0.00000000000000e+00 2000 2175 0.00000000000000e+00 2000 1994 0.00000000000000e+00 2000 2003 0.00000000000000e+00 2000 1993 0.00000000000000e+00 2000 1876 0.00000000000000e+00 2000 1992 0.00000000000000e+00 2000 1875 0.00000000000000e+00 2001 2001 1.25000000000000e+02 2001 2176 8.33333333333333e+00 2001 2175 -1.25000000000000e+01 2001 1988 0.00000000000000e+00 2001 1987 0.00000000000000e+00 2001 2000 0.00000000000000e+00 2001 2242 4.16666666666667e+00 2001 1999 0.00000000000000e+00 2001 1998 0.00000000000000e+00 2001 2243 4.16666666666667e+00 2001 1990 -4.16666666666667e+00 2001 1991 8.33333333333333e+00 2001 2003 -1.66666666666667e+01 2001 1877 0.00000000000000e+00 2001 1989 -1.25000000000000e+01 2001 2189 4.16666666666667e+00 2001 1919 -4.16666666666667e+00 2001 2188 -8.33333333333333e+00 2001 1985 4.16666666666667e+00 2001 2158 8.33333333333333e+00 2001 2002 -1.66666666666667e+01 2001 2159 8.33333333333333e+00 2001 1918 -4.16666666666667e+00 2001 2157 -3.75000000000000e+01 2001 1984 4.16666666666667e+00 2001 1876 0.00000000000000e+00 2001 1997 -4.16666666666667e+00 2001 1994 0.00000000000000e+00 2001 2224 4.16666666666667e+00 2001 2212 -4.16666666666667e+00 2001 1993 0.00000000000000e+00 2001 1996 8.33333333333333e+00 2001 1995 -1.25000000000000e+01 2001 2213 8.33333333333333e+00 2001 2225 -8.33333333333333e+00 2001 2211 -1.25000000000000e+01 2001 2177 -4.16666666666667e+00 2002 2002 1.25000000000000e+02 2002 2175 8.33333333333333e+00 2002 2177 8.33333333333333e+00 2002 2176 -3.75000000000000e+01 2002 1986 0.00000000000000e+00 2002 2000 0.00000000000000e+00 2002 2241 4.16666666666667e+00 2002 1999 0.00000000000000e+00 2002 1998 0.00000000000000e+00 2002 2243 -8.33333333333333e+00 2002 1989 -4.16666666666667e+00 2002 2189 4.16666666666667e+00 2002 1991 8.33333333333333e+00 2002 1990 -1.25000000000000e+01 2002 2187 -8.33333333333333e+00 2002 2159 -4.16666666666667e+00 2002 2157 8.33333333333333e+00 2002 2001 -1.66666666666667e+01 2002 2158 -1.25000000000000e+01 2002 1917 -4.16666666666667e+00 2002 1985 -8.33333333333333e+00 2002 1983 4.16666666666667e+00 2002 1875 0.00000000000000e+00 2002 1997 8.33333333333333e+00 2002 2003 -1.66666666666667e+01 2002 2213 8.33333333333333e+00 2002 2223 4.16666666666667e+00 2002 2211 -4.16666666666667e+00 2002 1994 0.00000000000000e+00 2002 1877 0.00000000000000e+00 2002 1996 -3.75000000000000e+01 2002 1992 0.00000000000000e+00 2002 1995 8.33333333333333e+00 2002 2225 4.16666666666667e+00 2002 1919 -4.16666666666667e+00 2002 2212 -1.25000000000000e+01 2002 1988 0.00000000000000e+00 2003 2003 1.25000000000000e+02 2003 1987 0.00000000000000e+00 2003 2177 -1.25000000000000e+01 2003 2176 8.33333333333333e+00 2003 1986 0.00000000000000e+00 2003 1999 0.00000000000000e+00 2003 1998 0.00000000000000e+00 2003 2000 0.00000000000000e+00 2003 2242 -8.33333333333333e+00 2003 2241 4.16666666666667e+00 2003 2188 4.16666666666667e+00 2003 1989 8.33333333333333e+00 2003 2001 -1.66666666666667e+01 2003 1991 -3.75000000000000e+01 2003 1990 8.33333333333333e+00 2003 1875 0.00000000000000e+00 2003 2187 4.16666666666667e+00 2003 1917 -4.16666666666667e+00 2003 2158 -4.16666666666667e+00 2003 1983 4.16666666666667e+00 2003 2159 -1.25000000000000e+01 2003 2157 8.33333333333333e+00 2003 1984 -8.33333333333333e+00 2003 1995 -4.16666666666667e+00 2003 1992 0.00000000000000e+00 2003 1996 8.33333333333333e+00 2003 2002 -1.66666666666667e+01 2003 2212 8.33333333333333e+00 2003 1997 -1.25000000000000e+01 2003 1993 0.00000000000000e+00 2003 1876 0.00000000000000e+00 2003 2213 -3.75000000000000e+01 2003 2175 -4.16666666666667e+00 2003 2224 4.16666666666667e+00 2003 1918 -4.16666666666667e+00 2003 2211 8.33333333333333e+00 2003 2223 -8.33333333333333e+00 2004 2004 3.75000000000000e+01 2004 1879 2.08333333333333e+00 2004 2011 -4.16666666666667e+00 2004 2162 -2.08333333333333e+00 2004 2005 -4.16666666666667e+00 2004 2161 4.16666666666667e+00 2004 1900 2.08333333333333e+00 2004 2160 -6.25000000000000e+00 2004 2024 -4.16666666666667e+00 2004 2168 4.16666666666667e+00 2004 1880 2.08333333333333e+00 2004 2018 -4.16666666666667e+00 2004 2017 2.08333333333333e+00 2004 2023 -4.16666666666667e+00 2004 1878 -1.25000000000000e+01 2004 2006 -4.16666666666667e+00 2004 2165 4.16666666666667e+00 2004 1901 2.08333333333333e+00 2004 2164 -2.08333333333333e+00 2004 2167 4.16666666666667e+00 2004 2012 2.08333333333333e+00 2004 2163 -6.25000000000000e+00 2004 1899 -1.25000000000000e+01 2005 2005 3.33333333333333e+01 2005 1878 2.08333333333333e+00 2005 2010 -4.16666666666667e+00 2005 2162 4.16666666666667e+00 2005 2161 -1.87500000000000e+01 2005 2004 -4.16666666666667e+00 2005 2160 4.16666666666667e+00 2005 1899 2.08333333333333e+00 2005 2018 2.08333333333333e+00 2005 2024 -4.16666666666667e+00 2005 1879 -4.16666666666667e+00 2005 2016 2.08333333333333e+00 2005 2022 -4.16666666666667e+00 2005 2165 4.16666666666667e+00 2005 2168 -8.33333333333333e+00 2005 2012 2.08333333333333e+00 2005 2164 -6.25000000000000e+00 2005 1900 -4.16666666666667e+00 2005 2163 -2.08333333333333e+00 2005 2166 4.16666666666667e+00 2006 2006 3.33333333333333e+01 2006 2010 2.08333333333333e+00 2006 2162 -6.25000000000000e+00 2006 2161 4.16666666666667e+00 2006 2160 -2.08333333333333e+00 2006 2017 2.08333333333333e+00 2006 2023 -4.16666666666667e+00 2006 2022 -4.16666666666667e+00 2006 2166 4.16666666666667e+00 2006 1880 -4.16666666666667e+00 2006 1878 2.08333333333333e+00 2006 2016 -4.16666666666667e+00 2006 2011 2.08333333333333e+00 2006 2165 -1.87500000000000e+01 2006 1901 -4.16666666666667e+00 2006 2164 4.16666666666667e+00 2006 2167 -8.33333333333333e+00 2006 2004 -4.16666666666667e+00 2006 2163 4.16666666666667e+00 2006 1899 2.08333333333333e+00 2007 2007 3.75000000000000e+01 2007 1921 2.08333333333333e+00 2007 2278 -4.16666666666667e+00 2007 2015 -2.08333333333333e+00 2007 2008 -4.16666666666667e+00 2007 2014 4.16666666666667e+00 2007 1879 2.08333333333333e+00 2007 2013 -6.25000000000000e+00 2007 2285 -4.16666666666667e+00 2007 2027 4.16666666666667e+00 2007 1922 2.08333333333333e+00 2007 2282 -4.16666666666667e+00 2007 2281 2.08333333333333e+00 2007 2284 -4.16666666666667e+00 2007 1920 -1.25000000000000e+01 2007 2009 -4.16666666666667e+00 2007 2021 4.16666666666667e+00 2007 1880 2.08333333333333e+00 2007 2020 -2.08333333333333e+00 2007 2026 4.16666666666667e+00 2007 2279 2.08333333333333e+00 2007 2019 -6.25000000000000e+00 2007 1878 -1.25000000000000e+01 2008 2008 3.33333333333333e+01 2008 1920 2.08333333333333e+00 2008 2277 -4.16666666666667e+00 2008 2015 4.16666666666667e+00 2008 2014 -1.87500000000000e+01 2008 2007 -4.16666666666667e+00 2008 2013 4.16666666666667e+00 2008 1878 2.08333333333333e+00 2008 2282 2.08333333333333e+00 2008 2285 -4.16666666666667e+00 2008 1921 -4.16666666666667e+00 2008 2280 2.08333333333333e+00 2008 2283 -4.16666666666667e+00 2008 2021 4.16666666666667e+00 2008 2027 -8.33333333333333e+00 2008 2279 2.08333333333333e+00 2008 2020 -6.25000000000000e+00 2008 1879 -4.16666666666667e+00 2008 2019 -2.08333333333333e+00 2008 2025 4.16666666666667e+00 2009 2009 3.33333333333333e+01 2009 2277 2.08333333333333e+00 2009 2015 -6.25000000000000e+00 2009 2014 4.16666666666667e+00 2009 2013 -2.08333333333333e+00 2009 2281 2.08333333333333e+00 2009 2284 -4.16666666666667e+00 2009 2283 -4.16666666666667e+00 2009 2025 4.16666666666667e+00 2009 1922 -4.16666666666667e+00 2009 1920 2.08333333333333e+00 2009 2280 -4.16666666666667e+00 2009 2278 2.08333333333333e+00 2009 2021 -1.87500000000000e+01 2009 1880 -4.16666666666667e+00 2009 2020 4.16666666666667e+00 2009 2026 -8.33333333333333e+00 2009 2007 -4.16666666666667e+00 2009 2019 4.16666666666667e+00 2009 1878 2.08333333333333e+00 2010 2010 6.25000000000000e+01 2010 2296 -4.16666666666667e+00 2010 2015 4.16666666666667e+00 2010 2014 4.16666666666667e+00 2010 2013 -1.87500000000000e+01 2010 2303 -4.16666666666667e+00 2010 2302 -4.16666666666667e+00 2010 2027 -8.33333333333333e+00 2010 2026 4.16666666666667e+00 2010 2162 4.16666666666667e+00 2010 2012 -8.33333333333333e+00 2010 2024 8.33333333333333e+00 2010 2299 4.16666666666667e+00 2010 2023 -4.16666666666667e+00 2010 1880 -2.08333333333333e+00 2010 2006 2.08333333333333e+00 2010 1879 4.16666666666667e+00 2010 2005 -4.16666666666667e+00 2010 1878 -6.25000000000000e+00 2010 2022 -1.25000000000000e+01 2010 1925 -2.08333333333333e+00 2010 2300 4.16666666666667e+00 2010 2011 -8.33333333333333e+00 2010 1924 4.16666666666667e+00 2010 2161 4.16666666666667e+00 2010 2297 2.08333333333333e+00 2010 1923 -6.25000000000000e+00 2010 2160 -1.87500000000000e+01 2011 2011 6.25000000000000e+01 2011 2295 -4.16666666666667e+00 2011 2015 -2.08333333333333e+00 2011 2014 -6.25000000000000e+00 2011 2013 4.16666666666667e+00 2011 2303 -4.16666666666667e+00 2011 2027 4.16666666666667e+00 2011 2301 -4.16666666666667e+00 2011 2025 4.16666666666667e+00 2011 2162 -2.08333333333333e+00 2011 2006 2.08333333333333e+00 2011 2298 4.16666666666667e+00 2011 2022 -4.16666666666667e+00 2011 1880 4.16666666666667e+00 2011 2012 -8.33333333333333e+00 2011 2024 8.33333333333333e+00 2011 1879 -1.87500000000000e+01 2011 2023 -1.25000000000000e+01 2011 1878 4.16666666666667e+00 2011 2004 -4.16666666666667e+00 2011 1925 4.16666666666667e+00 2011 2300 -8.33333333333333e+00 2011 2297 2.08333333333333e+00 2011 1924 -1.87500000000000e+01 2011 2161 -6.25000000000000e+00 2011 2010 -8.33333333333333e+00 2011 1923 4.16666666666667e+00 2011 2160 4.16666666666667e+00 2012 2012 6.25000000000000e+01 2012 2296 2.08333333333333e+00 2012 2015 -6.25000000000000e+00 2012 2014 -2.08333333333333e+00 2012 2013 4.16666666666667e+00 2012 2301 -4.16666666666667e+00 2012 2302 -4.16666666666667e+00 2012 2026 4.16666666666667e+00 2012 2025 -8.33333333333333e+00 2012 2161 -2.08333333333333e+00 2012 2005 2.08333333333333e+00 2012 2160 4.16666666666667e+00 2012 2010 -8.33333333333333e+00 2012 2022 8.33333333333333e+00 2012 1880 -6.25000000000000e+00 2012 2024 -3.75000000000000e+01 2012 1879 4.16666666666667e+00 2012 2011 -8.33333333333333e+00 2012 2023 8.33333333333333e+00 2012 1878 -2.08333333333333e+00 2012 2004 2.08333333333333e+00 2012 2295 2.08333333333333e+00 2012 1925 -6.25000000000000e+00 2012 2162 -6.25000000000000e+00 2012 1924 4.16666666666667e+00 2012 2299 -8.33333333333333e+00 2012 1923 -2.08333333333333e+00 2012 2298 4.16666666666667e+00 2013 2013 6.25000000000000e+01 2013 2302 4.16666666666667e+00 2013 2303 4.16666666666667e+00 2013 2296 4.16666666666667e+00 2013 2295 -6.25000000000000e+00 2013 2015 -8.33333333333333e+00 2013 2012 4.16666666666667e+00 2013 2011 4.16666666666667e+00 2013 2010 -1.87500000000000e+01 2013 2026 -4.16666666666667e+00 2013 2014 -8.33333333333333e+00 2013 2279 4.16666666666667e+00 2013 2314 -4.16666666666667e+00 2013 2284 4.16666666666667e+00 2013 2027 8.33333333333333e+00 2013 2285 -8.33333333333333e+00 2013 1928 2.08333333333333e+00 2013 2315 -4.16666666666667e+00 2013 2278 4.16666666666667e+00 2013 1927 -4.16666666666667e+00 2013 2277 -1.87500000000000e+01 2013 2009 -2.08333333333333e+00 2013 1880 2.08333333333333e+00 2013 2008 4.16666666666667e+00 2013 1879 -4.16666666666667e+00 2013 2007 -6.25000000000000e+00 2013 2297 -2.08333333333333e+00 2013 2025 -1.25000000000000e+01 2014 2014 6.25000000000000e+01 2014 2301 4.16666666666667e+00 2014 2303 -8.33333333333333e+00 2014 1928 2.08333333333333e+00 2014 2296 -1.87500000000000e+01 2014 2295 4.16666666666667e+00 2014 2012 -2.08333333333333e+00 2014 1880 2.08333333333333e+00 2014 2011 -6.25000000000000e+00 2014 2010 4.16666666666667e+00 2014 2025 -4.16666666666667e+00 2014 2279 -2.08333333333333e+00 2014 2013 -8.33333333333333e+00 2014 2313 -4.16666666666667e+00 2014 2283 4.16666666666667e+00 2014 2315 -4.16666666666667e+00 2014 2285 4.16666666666667e+00 2014 2278 -6.25000000000000e+00 2014 2277 4.16666666666667e+00 2014 1926 -4.16666666666667e+00 2014 2009 4.16666666666667e+00 2014 2015 -8.33333333333333e+00 2014 2027 8.33333333333333e+00 2014 2008 -1.87500000000000e+01 2014 2297 4.16666666666667e+00 2014 2026 -1.25000000000000e+01 2014 2007 4.16666666666667e+00 2014 1878 -4.16666666666667e+00 2015 2015 6.25000000000000e+01 2015 2296 4.16666666666667e+00 2015 2302 -8.33333333333333e+00 2015 2301 4.16666666666667e+00 2015 2297 -6.25000000000000e+00 2015 1927 2.08333333333333e+00 2015 2012 -6.25000000000000e+00 2015 2011 -2.08333333333333e+00 2015 1879 2.08333333333333e+00 2015 2013 -8.33333333333333e+00 2015 2010 4.16666666666667e+00 2015 2278 -2.08333333333333e+00 2015 2277 4.16666666666667e+00 2015 2314 -4.16666666666667e+00 2015 2284 4.16666666666667e+00 2015 2025 8.33333333333333e+00 2015 2283 -8.33333333333333e+00 2015 2279 -6.25000000000000e+00 2015 1926 2.08333333333333e+00 2015 2313 -4.16666666666667e+00 2015 2009 -6.25000000000000e+00 2015 2295 -2.08333333333333e+00 2015 2027 -3.75000000000000e+01 2015 2008 4.16666666666667e+00 2015 2014 -8.33333333333333e+00 2015 2026 8.33333333333333e+00 2015 2007 -2.08333333333333e+00 2015 1878 2.08333333333333e+00 2016 2016 6.25000000000000e+01 2016 2339 -4.16666666666667e+00 2016 2332 2.08333333333333e+00 2016 2338 -4.16666666666667e+00 2016 2333 -4.16666666666667e+00 2016 2021 4.16666666666667e+00 2016 2020 4.16666666666667e+00 2016 2026 -8.33333333333333e+00 2016 2019 -1.87500000000000e+01 2016 2336 4.16666666666667e+00 2016 2024 -4.16666666666667e+00 2016 2017 -8.33333333333333e+00 2016 2023 8.33333333333333e+00 2016 2164 4.16666666666667e+00 2016 1880 4.16666666666667e+00 2016 2006 -4.16666666666667e+00 2016 1879 -2.08333333333333e+00 2016 2005 2.08333333333333e+00 2016 1878 -6.25000000000000e+00 2016 2022 -1.25000000000000e+01 2016 2018 -8.33333333333333e+00 2016 1931 4.16666666666667e+00 2016 2165 4.16666666666667e+00 2016 1930 -2.08333333333333e+00 2016 2335 4.16666666666667e+00 2016 2027 4.16666666666667e+00 2016 1929 -6.25000000000000e+00 2016 2163 -1.87500000000000e+01 2017 2017 6.25000000000000e+01 2017 2337 -4.16666666666667e+00 2017 2333 2.08333333333333e+00 2017 2339 -4.16666666666667e+00 2017 2021 -2.08333333333333e+00 2017 2027 4.16666666666667e+00 2017 2020 -6.25000000000000e+00 2017 2019 4.16666666666667e+00 2017 2025 -8.33333333333333e+00 2017 2006 2.08333333333333e+00 2017 2165 -2.08333333333333e+00 2017 2016 -8.33333333333333e+00 2017 2022 8.33333333333333e+00 2017 2163 4.16666666666667e+00 2017 1880 4.16666666666667e+00 2017 2018 -8.33333333333333e+00 2017 2024 8.33333333333333e+00 2017 1879 -6.25000000000000e+00 2017 2023 -3.75000000000000e+01 2017 1878 -2.08333333333333e+00 2017 2004 2.08333333333333e+00 2017 1931 4.16666666666667e+00 2017 2336 -8.33333333333333e+00 2017 2331 2.08333333333333e+00 2017 1930 -6.25000000000000e+00 2017 2164 -6.25000000000000e+00 2017 1929 -2.08333333333333e+00 2017 2334 4.16666666666667e+00 2018 2018 6.25000000000000e+01 2018 2337 -4.16666666666667e+00 2018 2332 2.08333333333333e+00 2018 2338 -4.16666666666667e+00 2018 2331 -4.16666666666667e+00 2018 2021 -6.25000000000000e+00 2018 2020 -2.08333333333333e+00 2018 2026 4.16666666666667e+00 2018 2019 4.16666666666667e+00 2018 2334 4.16666666666667e+00 2018 2022 -4.16666666666667e+00 2018 2005 2.08333333333333e+00 2018 2164 -2.08333333333333e+00 2018 1880 -1.87500000000000e+01 2018 2024 -1.25000000000000e+01 2018 1879 4.16666666666667e+00 2018 2017 -8.33333333333333e+00 2018 2023 8.33333333333333e+00 2018 1878 4.16666666666667e+00 2018 2004 -4.16666666666667e+00 2018 2025 4.16666666666667e+00 2018 1931 -1.87500000000000e+01 2018 2165 -6.25000000000000e+00 2018 1930 4.16666666666667e+00 2018 2335 -8.33333333333333e+00 2018 2016 -8.33333333333333e+00 2018 1929 4.16666666666667e+00 2018 2163 4.16666666666667e+00 2019 2019 6.25000000000000e+01 2019 2285 4.16666666666667e+00 2019 2284 -8.33333333333333e+00 2019 2282 4.16666666666667e+00 2019 1933 2.08333333333333e+00 2019 2280 -1.87500000000000e+01 2019 2009 4.16666666666667e+00 2019 2008 -2.08333333333333e+00 2019 1879 2.08333333333333e+00 2019 2007 -6.25000000000000e+00 2019 2027 -4.16666666666667e+00 2019 2021 -8.33333333333333e+00 2019 2332 -2.08333333333333e+00 2019 2351 -4.16666666666667e+00 2019 2339 4.16666666666667e+00 2019 2350 -4.16666666666667e+00 2019 2338 4.16666666666667e+00 2019 2333 4.16666666666667e+00 2019 1934 -4.16666666666667e+00 2019 2331 -6.25000000000000e+00 2019 2018 4.16666666666667e+00 2019 1880 -4.16666666666667e+00 2019 2017 4.16666666666667e+00 2019 2020 -8.33333333333333e+00 2019 2026 8.33333333333333e+00 2019 2016 -1.87500000000000e+01 2019 2281 4.16666666666667e+00 2019 2025 -1.25000000000000e+01 2020 2020 6.25000000000000e+01 2020 2285 4.16666666666667e+00 2020 2280 4.16666666666667e+00 2020 2283 -8.33333333333333e+00 2020 2281 -6.25000000000000e+00 2020 1932 2.08333333333333e+00 2020 2009 4.16666666666667e+00 2020 2021 -8.33333333333333e+00 2020 2008 -6.25000000000000e+00 2020 2007 -2.08333333333333e+00 2020 1878 2.08333333333333e+00 2020 2331 -2.08333333333333e+00 2020 2333 4.16666666666667e+00 2020 2027 8.33333333333333e+00 2020 2339 -8.33333333333333e+00 2020 2349 -4.16666666666667e+00 2020 2337 4.16666666666667e+00 2020 1934 2.08333333333333e+00 2020 2351 -4.16666666666667e+00 2020 2332 -6.25000000000000e+00 2020 2018 -2.08333333333333e+00 2020 1880 2.08333333333333e+00 2020 2017 -6.25000000000000e+00 2020 2282 -2.08333333333333e+00 2020 2026 -3.75000000000000e+01 2020 2016 4.16666666666667e+00 2020 2019 -8.33333333333333e+00 2020 2025 8.33333333333333e+00 2021 2021 6.25000000000000e+01 2021 2284 4.16666666666667e+00 2021 2283 4.16666666666667e+00 2021 2282 -6.25000000000000e+00 2021 2280 4.16666666666667e+00 2021 2009 -1.87500000000000e+01 2021 2008 4.16666666666667e+00 2021 2020 -8.33333333333333e+00 2021 2007 4.16666666666667e+00 2021 2025 -4.16666666666667e+00 2021 2019 -8.33333333333333e+00 2021 2332 4.16666666666667e+00 2021 2349 -4.16666666666667e+00 2021 2337 4.16666666666667e+00 2021 2026 8.33333333333333e+00 2021 2338 -8.33333333333333e+00 2021 2333 -1.87500000000000e+01 2021 1933 2.08333333333333e+00 2021 2350 -4.16666666666667e+00 2021 2331 4.16666666666667e+00 2021 1932 -4.16666666666667e+00 2021 2018 -6.25000000000000e+00 2021 2281 -2.08333333333333e+00 2021 2027 -1.25000000000000e+01 2021 2017 -2.08333333333333e+00 2021 1879 2.08333333333333e+00 2021 2016 4.16666666666667e+00 2021 1878 -4.16666666666667e+00 2022 2022 1.25000000000000e+02 2022 2302 -8.33333333333333e+00 2022 2027 8.33333333333333e+00 2022 2339 -8.33333333333333e+00 2022 2368 -4.16666666666667e+00 2022 2338 4.16666666666667e+00 2022 2369 -4.16666666666667e+00 2022 2026 8.33333333333333e+00 2022 2025 -3.75000000000000e+01 2022 2012 8.33333333333333e+00 2022 2161 4.16666666666667e+00 2022 2011 -4.16666666666667e+00 2022 2162 -8.33333333333333e+00 2022 1880 4.16666666666667e+00 2022 2010 -1.25000000000000e+01 2022 2300 -4.16666666666667e+00 2022 1937 4.16666666666667e+00 2022 2023 -1.66666666666667e+01 2022 2299 8.33333333333333e+00 2022 2298 -1.25000000000000e+01 2022 2018 -4.16666666666667e+00 2022 2017 8.33333333333333e+00 2022 2006 -4.16666666666667e+00 2022 2165 4.16666666666667e+00 2022 2167 8.33333333333333e+00 2022 2164 -8.33333333333333e+00 2022 1879 4.16666666666667e+00 2022 2005 -4.16666666666667e+00 2022 2016 -1.25000000000000e+01 2022 2024 -1.66666666666667e+01 2022 2336 8.33333333333333e+00 2022 2168 8.33333333333333e+00 2022 2335 -4.16666666666667e+00 2022 1936 4.16666666666667e+00 2022 2303 4.16666666666667e+00 2022 2334 -1.25000000000000e+01 2022 2166 -3.75000000000000e+01 2023 2023 1.25000000000000e+02 2023 2301 -8.33333333333333e+00 2023 2027 -4.16666666666667e+00 2023 2369 -4.16666666666667e+00 2023 2339 4.16666666666667e+00 2023 2367 -4.16666666666667e+00 2023 2337 4.16666666666667e+00 2023 2026 -1.25000000000000e+01 2023 2025 8.33333333333333e+00 2023 2160 4.16666666666667e+00 2023 2010 -4.16666666666667e+00 2023 2162 4.16666666666667e+00 2023 2012 8.33333333333333e+00 2023 2011 -1.25000000000000e+01 2023 2300 8.33333333333333e+00 2023 2299 -3.75000000000000e+01 2023 2022 -1.66666666666667e+01 2023 2298 8.33333333333333e+00 2023 2168 -4.16666666666667e+00 2023 2024 -1.66666666666667e+01 2023 2006 -4.16666666666667e+00 2023 2165 4.16666666666667e+00 2023 2016 8.33333333333333e+00 2023 2166 8.33333333333333e+00 2023 2163 -8.33333333333333e+00 2023 1880 -8.33333333333333e+00 2023 2018 8.33333333333333e+00 2023 2017 -3.75000000000000e+01 2023 1878 4.16666666666667e+00 2023 2004 -4.16666666666667e+00 2023 2336 8.33333333333333e+00 2023 1937 -8.33333333333333e+00 2023 2303 4.16666666666667e+00 2023 2335 -1.25000000000000e+01 2023 2167 -1.25000000000000e+01 2023 2334 -4.16666666666667e+00 2023 1935 4.16666666666667e+00 2024 2024 1.25000000000000e+02 2024 2302 4.16666666666667e+00 2024 2026 -4.16666666666667e+00 2024 2368 -4.16666666666667e+00 2024 2338 4.16666666666667e+00 2024 2025 8.33333333333333e+00 2024 2337 -8.33333333333333e+00 2024 2367 -4.16666666666667e+00 2024 2027 -1.25000000000000e+01 2024 2010 8.33333333333333e+00 2024 2161 4.16666666666667e+00 2024 2160 -8.33333333333333e+00 2024 2012 -3.75000000000000e+01 2024 2011 8.33333333333333e+00 2024 1878 4.16666666666667e+00 2024 2300 -1.25000000000000e+01 2024 2299 8.33333333333333e+00 2024 2298 -4.16666666666667e+00 2024 1935 4.16666666666667e+00 2024 2167 -4.16666666666667e+00 2024 2023 -1.66666666666667e+01 2024 2016 -4.16666666666667e+00 2024 2005 -4.16666666666667e+00 2024 2164 4.16666666666667e+00 2024 2004 -4.16666666666667e+00 2024 2163 4.16666666666667e+00 2024 2018 -1.25000000000000e+01 2024 1879 -8.33333333333333e+00 2024 2017 8.33333333333333e+00 2024 2301 4.16666666666667e+00 2024 2336 -3.75000000000000e+01 2024 2168 -1.25000000000000e+01 2024 2335 8.33333333333333e+00 2024 1936 -8.33333333333333e+00 2024 2022 -1.66666666666667e+01 2024 2334 8.33333333333333e+00 2024 2166 8.33333333333333e+00 2025 2025 1.25000000000000e+02 2025 2302 8.33333333333333e+00 2025 2301 -1.25000000000000e+01 2025 2012 -8.33333333333333e+00 2025 2011 4.16666666666667e+00 2025 2024 8.33333333333333e+00 2025 2368 4.16666666666667e+00 2025 2023 8.33333333333333e+00 2025 2022 -3.75000000000000e+01 2025 2369 4.16666666666667e+00 2025 2014 -4.16666666666667e+00 2025 2015 8.33333333333333e+00 2025 2027 -1.66666666666667e+01 2025 1880 -4.16666666666667e+00 2025 2013 -1.25000000000000e+01 2025 2315 4.16666666666667e+00 2025 1940 -4.16666666666667e+00 2025 2314 -8.33333333333333e+00 2025 2009 4.16666666666667e+00 2025 2284 8.33333333333333e+00 2025 2026 -1.66666666666667e+01 2025 2285 8.33333333333333e+00 2025 1939 -4.16666666666667e+00 2025 2283 -3.75000000000000e+01 2025 2008 4.16666666666667e+00 2025 1879 -4.16666666666667e+00 2025 2021 -4.16666666666667e+00 2025 2018 4.16666666666667e+00 2025 2350 4.16666666666667e+00 2025 2338 -4.16666666666667e+00 2025 2017 -8.33333333333333e+00 2025 2020 8.33333333333333e+00 2025 2019 -1.25000000000000e+01 2025 2339 8.33333333333333e+00 2025 2351 -8.33333333333333e+00 2025 2337 -1.25000000000000e+01 2025 2303 -4.16666666666667e+00 2026 2026 1.25000000000000e+02 2026 2301 8.33333333333333e+00 2026 2303 8.33333333333333e+00 2026 2302 -3.75000000000000e+01 2026 2010 4.16666666666667e+00 2026 2024 -4.16666666666667e+00 2026 2367 4.16666666666667e+00 2026 2023 -1.25000000000000e+01 2026 2022 8.33333333333333e+00 2026 2369 -8.33333333333333e+00 2026 2013 -4.16666666666667e+00 2026 2315 4.16666666666667e+00 2026 2015 8.33333333333333e+00 2026 2014 -1.25000000000000e+01 2026 2313 -8.33333333333333e+00 2026 2285 -4.16666666666667e+00 2026 2283 8.33333333333333e+00 2026 2025 -1.66666666666667e+01 2026 2284 -1.25000000000000e+01 2026 1938 -4.16666666666667e+00 2026 2009 -8.33333333333333e+00 2026 2007 4.16666666666667e+00 2026 1878 -4.16666666666667e+00 2026 2021 8.33333333333333e+00 2026 2027 -1.66666666666667e+01 2026 2339 8.33333333333333e+00 2026 2349 4.16666666666667e+00 2026 2337 -4.16666666666667e+00 2026 2018 4.16666666666667e+00 2026 1880 -4.16666666666667e+00 2026 2020 -3.75000000000000e+01 2026 2016 -8.33333333333333e+00 2026 2019 8.33333333333333e+00 2026 2351 4.16666666666667e+00 2026 1940 -4.16666666666667e+00 2026 2338 -1.25000000000000e+01 2026 2012 4.16666666666667e+00 2027 2027 1.25000000000000e+02 2027 2011 4.16666666666667e+00 2027 2303 -1.25000000000000e+01 2027 2302 8.33333333333333e+00 2027 2010 -8.33333333333333e+00 2027 2023 -4.16666666666667e+00 2027 2022 8.33333333333333e+00 2027 2024 -1.25000000000000e+01 2027 2368 -8.33333333333333e+00 2027 2367 4.16666666666667e+00 2027 2314 4.16666666666667e+00 2027 2013 8.33333333333333e+00 2027 2025 -1.66666666666667e+01 2027 2015 -3.75000000000000e+01 2027 2014 8.33333333333333e+00 2027 1878 -4.16666666666667e+00 2027 2313 4.16666666666667e+00 2027 1938 -4.16666666666667e+00 2027 2284 -4.16666666666667e+00 2027 2007 4.16666666666667e+00 2027 2285 -1.25000000000000e+01 2027 2283 8.33333333333333e+00 2027 2008 -8.33333333333333e+00 2027 2019 -4.16666666666667e+00 2027 2016 4.16666666666667e+00 2027 2020 8.33333333333333e+00 2027 2026 -1.66666666666667e+01 2027 2338 8.33333333333333e+00 2027 2021 -1.25000000000000e+01 2027 2017 4.16666666666667e+00 2027 1879 -4.16666666666667e+00 2027 2339 -3.75000000000000e+01 2027 2301 -4.16666666666667e+00 2027 2350 4.16666666666667e+00 2027 1939 -4.16666666666667e+00 2027 2337 8.33333333333333e+00 2027 2349 -8.33333333333333e+00 2028 2028 3.75000000000000e+01 2028 2288 -2.08333333333333e+00 2028 2029 -4.16666666666667e+00 2028 2287 4.16666666666667e+00 2028 1921 2.08333333333333e+00 2028 2286 -6.25000000000000e+00 2028 2294 4.16666666666667e+00 2028 2030 -4.16666666666667e+00 2028 2291 4.16666666666667e+00 2028 1922 2.08333333333333e+00 2028 2290 -2.08333333333333e+00 2028 2293 4.16666666666667e+00 2028 2289 -6.25000000000000e+00 2028 1920 -1.25000000000000e+01 2028 1276 2.08333333333333e+00 2028 1387 -4.16666666666667e+00 2028 1400 -4.16666666666667e+00 2028 1277 2.08333333333333e+00 2028 1394 -4.16666666666667e+00 2028 1393 2.08333333333333e+00 2028 1399 -4.16666666666667e+00 2028 1275 -1.25000000000000e+01 2028 1388 2.08333333333333e+00 2029 2029 3.33333333333333e+01 2029 2288 4.16666666666667e+00 2029 2287 -1.87500000000000e+01 2029 2028 -4.16666666666667e+00 2029 2286 4.16666666666667e+00 2029 1920 2.08333333333333e+00 2029 2291 4.16666666666667e+00 2029 2294 -8.33333333333333e+00 2029 2290 -6.25000000000000e+00 2029 1921 -4.16666666666667e+00 2029 2289 -2.08333333333333e+00 2029 2292 4.16666666666667e+00 2029 1275 2.08333333333333e+00 2029 1386 -4.16666666666667e+00 2029 1394 2.08333333333333e+00 2029 1400 -4.16666666666667e+00 2029 1276 -4.16666666666667e+00 2029 1392 2.08333333333333e+00 2029 1398 -4.16666666666667e+00 2029 1388 2.08333333333333e+00 2030 2030 3.33333333333333e+01 2030 2288 -6.25000000000000e+00 2030 2287 4.16666666666667e+00 2030 2286 -2.08333333333333e+00 2030 2292 4.16666666666667e+00 2030 2291 -1.87500000000000e+01 2030 1922 -4.16666666666667e+00 2030 2290 4.16666666666667e+00 2030 2293 -8.33333333333333e+00 2030 2028 -4.16666666666667e+00 2030 2289 4.16666666666667e+00 2030 1920 2.08333333333333e+00 2030 1386 2.08333333333333e+00 2030 1393 2.08333333333333e+00 2030 1399 -4.16666666666667e+00 2030 1398 -4.16666666666667e+00 2030 1277 -4.16666666666667e+00 2030 1275 2.08333333333333e+00 2030 1392 -4.16666666666667e+00 2030 1387 2.08333333333333e+00 2031 2031 1.00000000000000e+00 2031 2035 0.00000000000000e+00 2031 1882 0.00000000000000e+00 2031 2180 0.00000000000000e+00 2031 2179 0.00000000000000e+00 2031 2032 0.00000000000000e+00 2031 1903 0.00000000000000e+00 2031 2178 0.00000000000000e+00 2031 2042 0.00000000000000e+00 2031 2039 0.00000000000000e+00 2031 2038 0.00000000000000e+00 2031 2041 0.00000000000000e+00 2031 1881 0.00000000000000e+00 2031 2183 0.00000000000000e+00 2031 2186 0.00000000000000e+00 2031 2182 0.00000000000000e+00 2031 2185 0.00000000000000e+00 2031 2181 0.00000000000000e+00 2031 2036 0.00000000000000e+00 2031 1902 0.00000000000000e+00 2032 2032 1.00000000000000e+00 2032 2034 0.00000000000000e+00 2032 1881 0.00000000000000e+00 2032 2180 0.00000000000000e+00 2032 2179 0.00000000000000e+00 2032 2178 0.00000000000000e+00 2032 2031 0.00000000000000e+00 2032 1902 0.00000000000000e+00 2032 2042 0.00000000000000e+00 2032 2186 0.00000000000000e+00 2032 2039 0.00000000000000e+00 2032 1883 0.00000000000000e+00 2032 1882 0.00000000000000e+00 2032 2037 0.00000000000000e+00 2032 2040 0.00000000000000e+00 2032 2183 0.00000000000000e+00 2032 2033 0.00000000000000e+00 2032 1904 0.00000000000000e+00 2032 2182 0.00000000000000e+00 2032 2036 0.00000000000000e+00 2032 1903 0.00000000000000e+00 2032 2181 0.00000000000000e+00 2032 2184 0.00000000000000e+00 2033 2033 1.00000000000000e+00 2033 2035 0.00000000000000e+00 2033 2180 0.00000000000000e+00 2033 2179 0.00000000000000e+00 2033 2178 0.00000000000000e+00 2033 2040 0.00000000000000e+00 2033 2037 0.00000000000000e+00 2033 2041 0.00000000000000e+00 2033 2185 0.00000000000000e+00 2033 1883 0.00000000000000e+00 2033 2038 0.00000000000000e+00 2033 1882 0.00000000000000e+00 2033 2183 0.00000000000000e+00 2033 2034 0.00000000000000e+00 2033 1904 0.00000000000000e+00 2033 2182 0.00000000000000e+00 2033 2032 0.00000000000000e+00 2033 1903 0.00000000000000e+00 2033 2181 0.00000000000000e+00 2033 2184 0.00000000000000e+00 2034 2034 2.50000000000000e+01 2034 2180 -2.08333333333333e+00 2034 2404 2.08333333333333e+00 2034 2041 -2.08333333333333e+00 2034 1943 2.08333333333333e+00 2034 2405 -4.16666666666667e+00 2034 1942 2.08333333333333e+00 2034 2035 -4.16666666666667e+00 2034 2179 4.16666666666667e+00 2034 1941 -6.25000000000000e+00 2034 2178 -6.25000000000000e+00 2034 2036 -4.16666666666667e+00 2034 1883 0.00000000000000e+00 2034 2042 4.16666666666667e+00 2034 1882 0.00000000000000e+00 2034 2032 0.00000000000000e+00 2034 2033 0.00000000000000e+00 2034 1881 0.00000000000000e+00 2034 2040 -6.25000000000000e+00 2035 2035 2.91666666666667e+01 2035 2180 4.16666666666667e+00 2035 2042 4.16666666666667e+00 2035 2403 2.08333333333333e+00 2035 2040 -2.08333333333333e+00 2035 1943 -2.08333333333333e+00 2035 2405 2.08333333333333e+00 2035 1942 -2.08333333333333e+00 2035 2179 -1.87500000000000e+01 2035 1941 2.08333333333333e+00 2035 2034 -4.16666666666667e+00 2035 2178 4.16666666666667e+00 2035 1883 0.00000000000000e+00 2035 2033 0.00000000000000e+00 2035 2036 -8.33333333333333e+00 2035 1882 0.00000000000000e+00 2035 2041 -6.25000000000000e+00 2035 1881 0.00000000000000e+00 2035 2031 0.00000000000000e+00 2036 2036 2.91666666666667e+01 2036 2178 -2.08333333333333e+00 2036 2035 -8.33333333333333e+00 2036 2179 4.16666666666667e+00 2036 2041 4.16666666666667e+00 2036 1943 -2.08333333333333e+00 2036 2180 -6.25000000000000e+00 2036 1942 -2.08333333333333e+00 2036 2404 2.08333333333333e+00 2036 1941 2.08333333333333e+00 2036 2403 -4.16666666666667e+00 2036 2031 0.00000000000000e+00 2036 1883 0.00000000000000e+00 2036 2042 -1.87500000000000e+01 2036 1882 0.00000000000000e+00 2036 2032 0.00000000000000e+00 2036 2034 -4.16666666666667e+00 2036 1881 0.00000000000000e+00 2036 2040 4.16666666666667e+00 2037 2037 1.00000000000000e+00 2037 2183 0.00000000000000e+00 2037 2041 0.00000000000000e+00 2037 2038 0.00000000000000e+00 2037 2182 0.00000000000000e+00 2037 1946 0.00000000000000e+00 2037 2411 0.00000000000000e+00 2037 1945 0.00000000000000e+00 2037 2410 0.00000000000000e+00 2037 1944 0.00000000000000e+00 2037 2181 0.00000000000000e+00 2037 2039 0.00000000000000e+00 2037 1883 0.00000000000000e+00 2037 2042 0.00000000000000e+00 2037 1882 0.00000000000000e+00 2037 2032 0.00000000000000e+00 2037 2033 0.00000000000000e+00 2037 1881 0.00000000000000e+00 2037 2040 0.00000000000000e+00 2038 2038 1.00000000000000e+00 2038 2411 0.00000000000000e+00 2038 2040 0.00000000000000e+00 2038 2037 0.00000000000000e+00 2038 2181 0.00000000000000e+00 2038 1946 0.00000000000000e+00 2038 2039 0.00000000000000e+00 2038 2183 0.00000000000000e+00 2038 1945 0.00000000000000e+00 2038 2182 0.00000000000000e+00 2038 1944 0.00000000000000e+00 2038 2409 0.00000000000000e+00 2038 1883 0.00000000000000e+00 2038 2033 0.00000000000000e+00 2038 2042 0.00000000000000e+00 2038 1882 0.00000000000000e+00 2038 2041 0.00000000000000e+00 2038 1881 0.00000000000000e+00 2038 2031 0.00000000000000e+00 2039 2039 1.00000000000000e+00 2039 2410 0.00000000000000e+00 2039 2031 0.00000000000000e+00 2039 2181 0.00000000000000e+00 2039 1946 0.00000000000000e+00 2039 2183 0.00000000000000e+00 2039 1945 0.00000000000000e+00 2039 2038 0.00000000000000e+00 2039 2182 0.00000000000000e+00 2039 1944 0.00000000000000e+00 2039 2409 0.00000000000000e+00 2039 2041 0.00000000000000e+00 2039 1883 0.00000000000000e+00 2039 2042 0.00000000000000e+00 2039 1882 0.00000000000000e+00 2039 2032 0.00000000000000e+00 2039 2037 0.00000000000000e+00 2039 1881 0.00000000000000e+00 2039 2040 0.00000000000000e+00 2040 2040 6.25000000000000e+01 2040 2179 4.16666666666667e+00 2040 2180 4.16666666666667e+00 2040 2036 4.16666666666667e+00 2040 2034 -6.25000000000000e+00 2040 2405 4.16666666666667e+00 2040 2404 4.16666666666667e+00 2040 2041 -8.33333333333333e+00 2040 2403 -1.87500000000000e+01 2040 2186 -4.16666666666667e+00 2040 2042 -8.33333333333333e+00 2040 2033 0.00000000000000e+00 2040 2183 0.00000000000000e+00 2040 2038 0.00000000000000e+00 2040 2185 8.33333333333333e+00 2040 2182 0.00000000000000e+00 2040 2039 0.00000000000000e+00 2040 1883 0.00000000000000e+00 2040 1882 0.00000000000000e+00 2040 2032 0.00000000000000e+00 2040 2037 0.00000000000000e+00 2040 2411 4.16666666666667e+00 2040 1949 -4.16666666666667e+00 2040 2410 -2.08333333333333e+00 2040 1948 2.08333333333333e+00 2040 2409 -6.25000000000000e+00 2040 2035 -2.08333333333333e+00 2040 2184 -1.25000000000000e+01 2041 2041 6.25000000000000e+01 2041 2034 -2.08333333333333e+00 2041 2178 4.16666666666667e+00 2041 2180 -8.33333333333333e+00 2041 1883 0.00000000000000e+00 2041 2035 -6.25000000000000e+00 2041 2405 -2.08333333333333e+00 2041 1949 2.08333333333333e+00 2041 2404 -6.25000000000000e+00 2041 2403 4.16666666666667e+00 2041 2040 -8.33333333333333e+00 2041 2039 0.00000000000000e+00 2041 2037 0.00000000000000e+00 2041 2033 0.00000000000000e+00 2041 2183 0.00000000000000e+00 2041 2184 8.33333333333333e+00 2041 2181 0.00000000000000e+00 2041 2038 0.00000000000000e+00 2041 1881 0.00000000000000e+00 2041 2031 0.00000000000000e+00 2041 2411 4.16666666666667e+00 2041 2042 -8.33333333333333e+00 2041 2186 8.33333333333333e+00 2041 2410 -6.25000000000000e+00 2041 2036 4.16666666666667e+00 2041 2185 -3.75000000000000e+01 2041 2409 -2.08333333333333e+00 2041 1947 2.08333333333333e+00 2042 2042 6.25000000000000e+01 2042 2179 -8.33333333333333e+00 2042 2178 4.16666666666667e+00 2042 2036 -1.87500000000000e+01 2042 1882 0.00000000000000e+00 2042 2034 4.16666666666667e+00 2042 2405 -6.25000000000000e+00 2042 2404 -2.08333333333333e+00 2042 1948 2.08333333333333e+00 2042 2403 4.16666666666667e+00 2042 2184 -4.16666666666667e+00 2042 2038 0.00000000000000e+00 2042 2040 -8.33333333333333e+00 2042 2031 0.00000000000000e+00 2042 2181 0.00000000000000e+00 2042 2032 0.00000000000000e+00 2042 2182 0.00000000000000e+00 2042 2039 0.00000000000000e+00 2042 2037 0.00000000000000e+00 2042 1881 0.00000000000000e+00 2042 2411 -1.87500000000000e+01 2042 2035 4.16666666666667e+00 2042 2186 -1.25000000000000e+01 2042 2410 4.16666666666667e+00 2042 2041 -8.33333333333333e+00 2042 2185 8.33333333333333e+00 2042 2409 4.16666666666667e+00 2042 1947 -4.16666666666667e+00 2043 2043 6.25000000000000e+01 2043 2407 4.16666666666667e+00 2043 2408 4.16666666666667e+00 2043 2050 4.16666666666667e+00 2043 2049 -6.25000000000000e+00 2043 2045 -8.33333333333333e+00 2043 2198 4.16666666666667e+00 2043 2197 4.16666666666667e+00 2043 2196 -1.87500000000000e+01 2043 2203 -4.16666666666667e+00 2043 2044 -8.33333333333333e+00 2043 2048 4.16666666666667e+00 2043 2056 -4.16666666666667e+00 2043 2308 4.16666666666667e+00 2043 2204 8.33333333333333e+00 2043 2309 -8.33333333333333e+00 2043 1886 2.08333333333333e+00 2043 2057 -4.16666666666667e+00 2043 2047 4.16666666666667e+00 2043 1885 -4.16666666666667e+00 2043 2046 -1.87500000000000e+01 2043 2192 -2.08333333333333e+00 2043 1907 2.08333333333333e+00 2043 2191 4.16666666666667e+00 2043 1906 -4.16666666666667e+00 2043 2190 -6.25000000000000e+00 2043 2051 -2.08333333333333e+00 2043 2202 -1.25000000000000e+01 2044 2044 6.25000000000000e+01 2044 2406 4.16666666666667e+00 2044 2408 -8.33333333333333e+00 2044 1886 2.08333333333333e+00 2044 2050 -1.87500000000000e+01 2044 2049 4.16666666666667e+00 2044 2198 -2.08333333333333e+00 2044 1907 2.08333333333333e+00 2044 2197 -6.25000000000000e+00 2044 2196 4.16666666666667e+00 2044 2202 -4.16666666666667e+00 2044 2048 -2.08333333333333e+00 2044 2043 -8.33333333333333e+00 2044 2055 -4.16666666666667e+00 2044 2307 4.16666666666667e+00 2044 2057 -4.16666666666667e+00 2044 2309 4.16666666666667e+00 2044 2047 -6.25000000000000e+00 2044 2046 4.16666666666667e+00 2044 1884 -4.16666666666667e+00 2044 2192 4.16666666666667e+00 2044 2045 -8.33333333333333e+00 2044 2204 8.33333333333333e+00 2044 2191 -1.87500000000000e+01 2044 2051 4.16666666666667e+00 2044 2203 -1.25000000000000e+01 2044 2190 4.16666666666667e+00 2044 1905 -4.16666666666667e+00 2045 2045 6.25000000000000e+01 2045 2050 4.16666666666667e+00 2045 2407 -8.33333333333333e+00 2045 2406 4.16666666666667e+00 2045 2051 -6.25000000000000e+00 2045 1885 2.08333333333333e+00 2045 2198 -6.25000000000000e+00 2045 2197 -2.08333333333333e+00 2045 1906 2.08333333333333e+00 2045 2043 -8.33333333333333e+00 2045 2196 4.16666666666667e+00 2045 2047 -2.08333333333333e+00 2045 2046 4.16666666666667e+00 2045 2056 -4.16666666666667e+00 2045 2308 4.16666666666667e+00 2045 2202 8.33333333333333e+00 2045 2307 -8.33333333333333e+00 2045 2048 -6.25000000000000e+00 2045 1884 2.08333333333333e+00 2045 2055 -4.16666666666667e+00 2045 2192 -6.25000000000000e+00 2045 2049 -2.08333333333333e+00 2045 2204 -3.75000000000000e+01 2045 2191 4.16666666666667e+00 2045 2044 -8.33333333333333e+00 2045 2203 8.33333333333333e+00 2045 2190 -2.08333333333333e+00 2045 1905 2.08333333333333e+00 2046 2046 6.25000000000000e+01 2046 2053 -4.16666666666667e+00 2046 2306 4.16666666666667e+00 2046 2305 4.16666666666667e+00 2046 2304 -1.87500000000000e+01 2046 2060 -4.16666666666667e+00 2046 2059 -4.16666666666667e+00 2046 2312 -8.33333333333333e+00 2046 2311 4.16666666666667e+00 2046 2045 4.16666666666667e+00 2046 2048 -8.33333333333333e+00 2046 2309 8.33333333333333e+00 2046 2056 4.16666666666667e+00 2046 2308 -4.16666666666667e+00 2046 1925 -2.08333333333333e+00 2046 2192 2.08333333333333e+00 2046 1924 4.16666666666667e+00 2046 2191 -4.16666666666667e+00 2046 1923 -6.25000000000000e+00 2046 2307 -1.25000000000000e+01 2046 1886 -2.08333333333333e+00 2046 2057 4.16666666666667e+00 2046 2047 -8.33333333333333e+00 2046 1885 4.16666666666667e+00 2046 2044 4.16666666666667e+00 2046 2054 2.08333333333333e+00 2046 1884 -6.25000000000000e+00 2046 2043 -1.87500000000000e+01 2047 2047 6.25000000000000e+01 2047 2052 -4.16666666666667e+00 2047 2306 -2.08333333333333e+00 2047 2305 -6.25000000000000e+00 2047 2304 4.16666666666667e+00 2047 2060 -4.16666666666667e+00 2047 2312 4.16666666666667e+00 2047 2058 -4.16666666666667e+00 2047 2310 4.16666666666667e+00 2047 2045 -2.08333333333333e+00 2047 2192 2.08333333333333e+00 2047 2055 4.16666666666667e+00 2047 2307 -4.16666666666667e+00 2047 1925 4.16666666666667e+00 2047 2048 -8.33333333333333e+00 2047 2309 8.33333333333333e+00 2047 1924 -1.87500000000000e+01 2047 2308 -1.25000000000000e+01 2047 1923 4.16666666666667e+00 2047 2190 -4.16666666666667e+00 2047 1886 4.16666666666667e+00 2047 2057 -8.33333333333333e+00 2047 2054 2.08333333333333e+00 2047 1885 -1.87500000000000e+01 2047 2044 -6.25000000000000e+00 2047 2046 -8.33333333333333e+00 2047 1884 4.16666666666667e+00 2047 2043 4.16666666666667e+00 2048 2048 6.25000000000000e+01 2048 2053 2.08333333333333e+00 2048 2306 -6.25000000000000e+00 2048 2305 -2.08333333333333e+00 2048 2304 4.16666666666667e+00 2048 2058 -4.16666666666667e+00 2048 2059 -4.16666666666667e+00 2048 2311 4.16666666666667e+00 2048 2310 -8.33333333333333e+00 2048 2044 -2.08333333333333e+00 2048 2191 2.08333333333333e+00 2048 2043 4.16666666666667e+00 2048 2046 -8.33333333333333e+00 2048 2307 8.33333333333333e+00 2048 1925 -6.25000000000000e+00 2048 2309 -3.75000000000000e+01 2048 1924 4.16666666666667e+00 2048 2047 -8.33333333333333e+00 2048 2308 8.33333333333333e+00 2048 1923 -2.08333333333333e+00 2048 2190 2.08333333333333e+00 2048 2052 2.08333333333333e+00 2048 1886 -6.25000000000000e+00 2048 2045 -6.25000000000000e+00 2048 1885 4.16666666666667e+00 2048 2056 -8.33333333333333e+00 2048 1884 -2.08333333333333e+00 2048 2055 4.16666666666667e+00 2049 2049 2.50000000000000e+01 2049 2045 -2.08333333333333e+00 2049 2056 2.08333333333333e+00 2049 2407 -2.08333333333333e+00 2049 1886 2.08333333333333e+00 2049 2057 -4.16666666666667e+00 2049 1885 2.08333333333333e+00 2049 2050 -4.16666666666667e+00 2049 2044 4.16666666666667e+00 2049 1884 -6.25000000000000e+00 2049 2043 -6.25000000000000e+00 2049 2051 -4.16666666666667e+00 2049 1943 2.08333333333333e+00 2049 2408 4.16666666666667e+00 2049 1942 2.08333333333333e+00 2049 2197 -4.16666666666667e+00 2049 2198 2.08333333333333e+00 2049 1941 -6.25000000000000e+00 2049 2406 -6.25000000000000e+00 2050 2050 2.91666666666667e+01 2050 2045 4.16666666666667e+00 2050 2408 4.16666666666667e+00 2050 2055 2.08333333333333e+00 2050 2406 -2.08333333333333e+00 2050 1886 -2.08333333333333e+00 2050 2057 2.08333333333333e+00 2050 1885 -2.08333333333333e+00 2050 2044 -1.87500000000000e+01 2050 1884 2.08333333333333e+00 2050 2049 -4.16666666666667e+00 2050 2043 4.16666666666667e+00 2050 1943 -2.08333333333333e+00 2050 2198 2.08333333333333e+00 2050 2051 -8.33333333333333e+00 2050 1942 -2.08333333333333e+00 2050 2407 -6.25000000000000e+00 2050 1941 2.08333333333333e+00 2050 2196 -4.16666666666667e+00 2051 2051 2.91666666666667e+01 2051 2043 -2.08333333333333e+00 2051 2050 -8.33333333333333e+00 2051 2044 4.16666666666667e+00 2051 2407 4.16666666666667e+00 2051 1886 -2.08333333333333e+00 2051 2045 -6.25000000000000e+00 2051 1885 -2.08333333333333e+00 2051 2056 2.08333333333333e+00 2051 1884 2.08333333333333e+00 2051 2055 -4.16666666666667e+00 2051 2196 2.08333333333333e+00 2051 1943 -2.08333333333333e+00 2051 2408 -1.87500000000000e+01 2051 1942 -2.08333333333333e+00 2051 2197 2.08333333333333e+00 2051 2049 -4.16666666666667e+00 2051 1941 2.08333333333333e+00 2051 2406 4.16666666666667e+00 2052 2052 2.50000000000000e+01 2052 2306 -2.08333333333333e+00 2052 2422 2.08333333333333e+00 2052 2059 -2.08333333333333e+00 2052 1952 2.08333333333333e+00 2052 2423 -4.16666666666667e+00 2052 1951 2.08333333333333e+00 2052 2053 -4.16666666666667e+00 2052 2305 4.16666666666667e+00 2052 1950 -6.25000000000000e+00 2052 2304 -6.25000000000000e+00 2052 2054 -4.16666666666667e+00 2052 1886 2.08333333333333e+00 2052 2060 4.16666666666667e+00 2052 1885 2.08333333333333e+00 2052 2047 -4.16666666666667e+00 2052 2048 2.08333333333333e+00 2052 1884 -6.25000000000000e+00 2052 2058 -6.25000000000000e+00 2053 2053 2.91666666666667e+01 2053 2306 4.16666666666667e+00 2053 2060 4.16666666666667e+00 2053 2421 2.08333333333333e+00 2053 2058 -2.08333333333333e+00 2053 1952 -2.08333333333333e+00 2053 2423 2.08333333333333e+00 2053 1951 -2.08333333333333e+00 2053 2305 -1.87500000000000e+01 2053 1950 2.08333333333333e+00 2053 2052 -4.16666666666667e+00 2053 2304 4.16666666666667e+00 2053 1886 -2.08333333333333e+00 2053 2048 2.08333333333333e+00 2053 2054 -8.33333333333333e+00 2053 1885 -2.08333333333333e+00 2053 2059 -6.25000000000000e+00 2053 1884 2.08333333333333e+00 2053 2046 -4.16666666666667e+00 2054 2054 2.91666666666667e+01 2054 2304 -2.08333333333333e+00 2054 2053 -8.33333333333333e+00 2054 2305 4.16666666666667e+00 2054 2059 4.16666666666667e+00 2054 1952 -2.08333333333333e+00 2054 2306 -6.25000000000000e+00 2054 1951 -2.08333333333333e+00 2054 2422 2.08333333333333e+00 2054 1950 2.08333333333333e+00 2054 2421 -4.16666666666667e+00 2054 2046 2.08333333333333e+00 2054 1886 -2.08333333333333e+00 2054 2060 -1.87500000000000e+01 2054 1885 -2.08333333333333e+00 2054 2047 2.08333333333333e+00 2054 2052 -4.16666666666667e+00 2054 1884 2.08333333333333e+00 2054 2058 4.16666666666667e+00 2055 2055 6.25000000000000e+01 2055 2056 -8.33333333333333e+00 2055 2429 -4.16666666666667e+00 2055 1954 -2.08333333333333e+00 2055 2428 2.08333333333333e+00 2055 2060 4.16666666666667e+00 2055 1885 -2.08333333333333e+00 2055 2058 -1.87500000000000e+01 2055 2050 2.08333333333333e+00 2055 1886 4.16666666666667e+00 2055 2051 -4.16666666666667e+00 2055 2057 -8.33333333333333e+00 2055 2408 4.16666666666667e+00 2055 1955 4.16666666666667e+00 2055 2407 4.16666666666667e+00 2055 2406 -1.87500000000000e+01 2055 2044 -4.16666666666667e+00 2055 2047 4.16666666666667e+00 2055 2048 4.16666666666667e+00 2055 2045 -4.16666666666667e+00 2055 1884 -6.25000000000000e+00 2055 2309 -4.16666666666667e+00 2055 2204 4.16666666666667e+00 2055 2308 8.33333333333333e+00 2055 2203 -8.33333333333333e+00 2055 2307 -1.25000000000000e+01 2055 2059 4.16666666666667e+00 2055 1953 -6.25000000000000e+00 2056 2056 6.25000000000000e+01 2056 2429 2.08333333333333e+00 2056 2058 4.16666666666667e+00 2056 2055 -8.33333333333333e+00 2056 1953 -2.08333333333333e+00 2056 2427 2.08333333333333e+00 2056 2059 -6.25000000000000e+00 2056 1884 -2.08333333333333e+00 2056 2049 2.08333333333333e+00 2056 2051 2.08333333333333e+00 2056 2408 -2.08333333333333e+00 2056 2407 -6.25000000000000e+00 2056 2406 4.16666666666667e+00 2056 2043 -4.16666666666667e+00 2056 2046 4.16666666666667e+00 2056 2045 -4.16666666666667e+00 2056 2204 4.16666666666667e+00 2056 2048 -8.33333333333333e+00 2056 1886 4.16666666666667e+00 2056 1885 -6.25000000000000e+00 2056 2309 8.33333333333333e+00 2056 2057 -8.33333333333333e+00 2056 1955 4.16666666666667e+00 2056 2308 -3.75000000000000e+01 2056 2060 -2.08333333333333e+00 2056 1954 -6.25000000000000e+00 2056 2307 8.33333333333333e+00 2056 2202 -8.33333333333333e+00 2057 2057 6.25000000000000e+01 2057 2428 2.08333333333333e+00 2057 2427 -4.16666666666667e+00 2057 2060 -6.25000000000000e+00 2057 2058 4.16666666666667e+00 2057 2050 2.08333333333333e+00 2057 1884 4.16666666666667e+00 2057 2049 -4.16666666666667e+00 2057 2408 -6.25000000000000e+00 2057 2407 -2.08333333333333e+00 2057 2055 -8.33333333333333e+00 2057 2406 4.16666666666667e+00 2057 1953 4.16666666666667e+00 2057 2044 -4.16666666666667e+00 2057 2203 4.16666666666667e+00 2057 1886 -1.87500000000000e+01 2057 2047 -8.33333333333333e+00 2057 1885 4.16666666666667e+00 2057 2046 4.16666666666667e+00 2057 2043 -4.16666666666667e+00 2057 2309 -1.25000000000000e+01 2057 2059 -2.08333333333333e+00 2057 1955 -1.87500000000000e+01 2057 2308 8.33333333333333e+00 2057 2056 -8.33333333333333e+00 2057 1954 4.16666666666667e+00 2057 2307 -4.16666666666667e+00 2057 2202 4.16666666666667e+00 2058 2058 6.25000000000000e+01 2058 2305 4.16666666666667e+00 2058 2306 4.16666666666667e+00 2058 2054 4.16666666666667e+00 2058 2052 -6.25000000000000e+00 2058 2423 4.16666666666667e+00 2058 2422 4.16666666666667e+00 2058 2059 -8.33333333333333e+00 2058 2421 -1.87500000000000e+01 2058 2312 -4.16666666666667e+00 2058 2060 -8.33333333333333e+00 2058 2048 -4.16666666666667e+00 2058 2309 4.16666666666667e+00 2058 2056 4.16666666666667e+00 2058 2311 8.33333333333333e+00 2058 2308 -8.33333333333333e+00 2058 2057 4.16666666666667e+00 2058 1886 -4.16666666666667e+00 2058 1885 2.08333333333333e+00 2058 2047 -4.16666666666667e+00 2058 2055 -1.87500000000000e+01 2058 2429 4.16666666666667e+00 2058 1958 -4.16666666666667e+00 2058 2428 -2.08333333333333e+00 2058 1957 2.08333333333333e+00 2058 2427 -6.25000000000000e+00 2058 2053 -2.08333333333333e+00 2058 2310 -1.25000000000000e+01 2059 2059 6.25000000000000e+01 2059 2052 -2.08333333333333e+00 2059 2304 4.16666666666667e+00 2059 2306 -8.33333333333333e+00 2059 1886 2.08333333333333e+00 2059 2053 -6.25000000000000e+00 2059 2423 -2.08333333333333e+00 2059 1958 2.08333333333333e+00 2059 2422 -6.25000000000000e+00 2059 2421 4.16666666666667e+00 2059 2058 -8.33333333333333e+00 2059 2057 -2.08333333333333e+00 2059 2055 4.16666666666667e+00 2059 2048 -4.16666666666667e+00 2059 2309 4.16666666666667e+00 2059 2310 8.33333333333333e+00 2059 2307 -8.33333333333333e+00 2059 2056 -6.25000000000000e+00 2059 1884 2.08333333333333e+00 2059 2046 -4.16666666666667e+00 2059 2429 4.16666666666667e+00 2059 2060 -8.33333333333333e+00 2059 2312 8.33333333333333e+00 2059 2428 -6.25000000000000e+00 2059 2054 4.16666666666667e+00 2059 2311 -3.75000000000000e+01 2059 2427 -2.08333333333333e+00 2059 1956 2.08333333333333e+00 2060 2060 6.25000000000000e+01 2060 2305 -8.33333333333333e+00 2060 2304 4.16666666666667e+00 2060 2054 -1.87500000000000e+01 2060 1885 2.08333333333333e+00 2060 2052 4.16666666666667e+00 2060 2423 -6.25000000000000e+00 2060 2422 -2.08333333333333e+00 2060 1957 2.08333333333333e+00 2060 2421 4.16666666666667e+00 2060 2310 -4.16666666666667e+00 2060 2056 -2.08333333333333e+00 2060 2058 -8.33333333333333e+00 2060 2046 -4.16666666666667e+00 2060 2307 4.16666666666667e+00 2060 2047 -4.16666666666667e+00 2060 2308 4.16666666666667e+00 2060 2057 -6.25000000000000e+00 2060 2055 4.16666666666667e+00 2060 1884 -4.16666666666667e+00 2060 2429 -1.87500000000000e+01 2060 2053 4.16666666666667e+00 2060 2312 -1.25000000000000e+01 2060 2428 4.16666666666667e+00 2060 2059 -8.33333333333333e+00 2060 2311 8.33333333333333e+00 2060 2427 4.16666666666667e+00 2060 1956 -4.16666666666667e+00 2061 2061 6.25000000000000e+01 2061 2425 4.16666666666667e+00 2061 2426 4.16666666666667e+00 2061 2065 4.16666666666667e+00 2061 2064 -6.25000000000000e+00 2061 2063 -8.33333333333333e+00 2061 2324 4.16666666666667e+00 2061 2323 4.16666666666667e+00 2061 2322 -1.87500000000000e+01 2061 2329 -4.16666666666667e+00 2061 2062 -8.33333333333333e+00 2061 2330 8.33333333333333e+00 2061 2318 -2.08333333333333e+00 2061 1928 2.08333333333333e+00 2061 2317 4.16666666666667e+00 2061 1927 -4.16666666666667e+00 2061 2316 -6.25000000000000e+00 2061 2066 -2.08333333333333e+00 2061 2328 -1.25000000000000e+01 2061 1433 4.16666666666667e+00 2061 1438 -4.16666666666667e+00 2061 1582 4.16666666666667e+00 2061 1583 -8.33333333333333e+00 2061 1283 2.08333333333333e+00 2061 1439 -4.16666666666667e+00 2061 1432 4.16666666666667e+00 2061 1282 -4.16666666666667e+00 2061 1431 -1.87500000000000e+01 2062 2062 6.25000000000000e+01 2062 2424 4.16666666666667e+00 2062 2426 -8.33333333333333e+00 2062 2065 -1.87500000000000e+01 2062 2064 4.16666666666667e+00 2062 2324 -2.08333333333333e+00 2062 1928 2.08333333333333e+00 2062 2323 -6.25000000000000e+00 2062 2322 4.16666666666667e+00 2062 2328 -4.16666666666667e+00 2062 2061 -8.33333333333333e+00 2062 2318 4.16666666666667e+00 2062 2063 -8.33333333333333e+00 2062 2330 8.33333333333333e+00 2062 2317 -1.87500000000000e+01 2062 2066 4.16666666666667e+00 2062 2329 -1.25000000000000e+01 2062 2316 4.16666666666667e+00 2062 1926 -4.16666666666667e+00 2062 1283 2.08333333333333e+00 2062 1433 -2.08333333333333e+00 2062 1437 -4.16666666666667e+00 2062 1581 4.16666666666667e+00 2062 1439 -4.16666666666667e+00 2062 1583 4.16666666666667e+00 2062 1432 -6.25000000000000e+00 2062 1431 4.16666666666667e+00 2062 1281 -4.16666666666667e+00 2063 2063 6.25000000000000e+01 2063 2065 4.16666666666667e+00 2063 2425 -8.33333333333333e+00 2063 2424 4.16666666666667e+00 2063 2066 -6.25000000000000e+00 2063 2324 -6.25000000000000e+00 2063 2323 -2.08333333333333e+00 2063 1927 2.08333333333333e+00 2063 2061 -8.33333333333333e+00 2063 2322 4.16666666666667e+00 2063 2328 8.33333333333333e+00 2063 2318 -6.25000000000000e+00 2063 2064 -2.08333333333333e+00 2063 2330 -3.75000000000000e+01 2063 2317 4.16666666666667e+00 2063 2062 -8.33333333333333e+00 2063 2329 8.33333333333333e+00 2063 2316 -2.08333333333333e+00 2063 1926 2.08333333333333e+00 2063 1282 2.08333333333333e+00 2063 1432 -2.08333333333333e+00 2063 1431 4.16666666666667e+00 2063 1438 -4.16666666666667e+00 2063 1582 4.16666666666667e+00 2063 1581 -8.33333333333333e+00 2063 1433 -6.25000000000000e+00 2063 1281 2.08333333333333e+00 2063 1437 -4.16666666666667e+00 2064 2064 2.50000000000000e+01 2064 2063 -2.08333333333333e+00 2064 2425 -2.08333333333333e+00 2064 2065 -4.16666666666667e+00 2064 2062 4.16666666666667e+00 2064 2061 -6.25000000000000e+00 2064 2066 -4.16666666666667e+00 2064 1952 2.08333333333333e+00 2064 2426 4.16666666666667e+00 2064 1951 2.08333333333333e+00 2064 2323 -4.16666666666667e+00 2064 2324 2.08333333333333e+00 2064 1950 -6.25000000000000e+00 2064 2424 -6.25000000000000e+00 2064 1438 2.08333333333333e+00 2064 1283 2.08333333333333e+00 2064 1439 -4.16666666666667e+00 2064 1282 2.08333333333333e+00 2064 1281 -6.25000000000000e+00 2065 2065 2.91666666666667e+01 2065 2063 4.16666666666667e+00 2065 2426 4.16666666666667e+00 2065 2424 -2.08333333333333e+00 2065 2062 -1.87500000000000e+01 2065 2064 -4.16666666666667e+00 2065 2061 4.16666666666667e+00 2065 1952 -2.08333333333333e+00 2065 2324 2.08333333333333e+00 2065 2066 -8.33333333333333e+00 2065 1951 -2.08333333333333e+00 2065 2425 -6.25000000000000e+00 2065 1950 2.08333333333333e+00 2065 2322 -4.16666666666667e+00 2065 1437 2.08333333333333e+00 2065 1283 -2.08333333333333e+00 2065 1439 2.08333333333333e+00 2065 1282 -2.08333333333333e+00 2065 1281 2.08333333333333e+00 2066 2066 2.91666666666667e+01 2066 2061 -2.08333333333333e+00 2066 2065 -8.33333333333333e+00 2066 2062 4.16666666666667e+00 2066 2425 4.16666666666667e+00 2066 2063 -6.25000000000000e+00 2066 2322 2.08333333333333e+00 2066 1952 -2.08333333333333e+00 2066 2426 -1.87500000000000e+01 2066 1951 -2.08333333333333e+00 2066 2323 2.08333333333333e+00 2066 2064 -4.16666666666667e+00 2066 1950 2.08333333333333e+00 2066 2424 4.16666666666667e+00 2066 1283 -2.08333333333333e+00 2066 1282 -2.08333333333333e+00 2066 1438 2.08333333333333e+00 2066 1281 2.08333333333333e+00 2066 1437 -4.16666666666667e+00 2067 2067 1.00000000000000e+00 2067 2075 0.00000000000000e+00 2067 2219 0.00000000000000e+00 2067 2218 0.00000000000000e+00 2067 2217 0.00000000000000e+00 2067 2222 0.00000000000000e+00 2067 2078 0.00000000000000e+00 2067 2071 0.00000000000000e+00 2067 2077 0.00000000000000e+00 2067 1889 0.00000000000000e+00 2067 2072 0.00000000000000e+00 2067 1887 0.00000000000000e+00 2067 2069 0.00000000000000e+00 2067 2216 0.00000000000000e+00 2067 1910 0.00000000000000e+00 2067 2215 0.00000000000000e+00 2067 2221 0.00000000000000e+00 2067 2074 0.00000000000000e+00 2067 2214 0.00000000000000e+00 2067 1908 0.00000000000000e+00 2068 2068 1.00000000000000e+00 2068 2075 0.00000000000000e+00 2068 1889 0.00000000000000e+00 2068 2219 0.00000000000000e+00 2068 2069 0.00000000000000e+00 2068 1910 0.00000000000000e+00 2068 2218 0.00000000000000e+00 2068 2217 0.00000000000000e+00 2068 2070 0.00000000000000e+00 2068 2076 0.00000000000000e+00 2068 2072 0.00000000000000e+00 2068 2078 0.00000000000000e+00 2068 1888 0.00000000000000e+00 2068 2216 0.00000000000000e+00 2068 2222 0.00000000000000e+00 2068 2073 0.00000000000000e+00 2068 2215 0.00000000000000e+00 2068 1909 0.00000000000000e+00 2068 2214 0.00000000000000e+00 2068 2220 0.00000000000000e+00 2069 2069 1.00000000000000e+00 2069 1888 0.00000000000000e+00 2069 2073 0.00000000000000e+00 2069 2219 0.00000000000000e+00 2069 2218 0.00000000000000e+00 2069 2068 0.00000000000000e+00 2069 1909 0.00000000000000e+00 2069 2217 0.00000000000000e+00 2069 2220 0.00000000000000e+00 2069 2076 0.00000000000000e+00 2069 1889 0.00000000000000e+00 2069 2071 0.00000000000000e+00 2069 2077 0.00000000000000e+00 2069 1887 0.00000000000000e+00 2069 2070 0.00000000000000e+00 2069 2074 0.00000000000000e+00 2069 2216 0.00000000000000e+00 2069 1910 0.00000000000000e+00 2069 2215 0.00000000000000e+00 2069 2221 0.00000000000000e+00 2069 2067 0.00000000000000e+00 2069 2214 0.00000000000000e+00 2069 1908 0.00000000000000e+00 2070 2070 2.50000000000000e+01 2070 2068 0.00000000000000e+00 2070 2441 2.08333333333333e+00 2070 2078 -2.08333333333333e+00 2070 1889 0.00000000000000e+00 2070 2069 0.00000000000000e+00 2070 1888 0.00000000000000e+00 2070 2071 -4.16666666666667e+00 2070 2077 4.16666666666667e+00 2070 1887 0.00000000000000e+00 2070 2076 -6.25000000000000e+00 2070 2072 -4.16666666666667e+00 2070 1961 2.08333333333333e+00 2070 2216 4.16666666666667e+00 2070 1960 2.08333333333333e+00 2070 2440 -4.16666666666667e+00 2070 2215 -2.08333333333333e+00 2070 1959 -6.25000000000000e+00 2070 2214 -6.25000000000000e+00 2071 2071 2.91666666666667e+01 2071 2067 0.00000000000000e+00 2071 2216 4.16666666666667e+00 2071 2072 -8.33333333333333e+00 2071 2078 4.16666666666667e+00 2071 1889 0.00000000000000e+00 2071 2069 0.00000000000000e+00 2071 1888 0.00000000000000e+00 2071 2077 -1.87500000000000e+01 2071 1887 0.00000000000000e+00 2071 2070 -4.16666666666667e+00 2071 2076 4.16666666666667e+00 2071 1961 -2.08333333333333e+00 2071 2441 2.08333333333333e+00 2071 2214 -2.08333333333333e+00 2071 1960 -2.08333333333333e+00 2071 2215 -6.25000000000000e+00 2071 1959 2.08333333333333e+00 2071 2439 -4.16666666666667e+00 2072 2072 2.91666666666667e+01 2072 2071 -8.33333333333333e+00 2072 2077 4.16666666666667e+00 2072 2439 2.08333333333333e+00 2072 2076 -2.08333333333333e+00 2072 1889 0.00000000000000e+00 2072 2078 -6.25000000000000e+00 2072 1888 0.00000000000000e+00 2072 2068 0.00000000000000e+00 2072 1887 0.00000000000000e+00 2072 2067 0.00000000000000e+00 2072 2215 4.16666666666667e+00 2072 1961 -2.08333333333333e+00 2072 2216 -1.87500000000000e+01 2072 1960 -2.08333333333333e+00 2072 2440 2.08333333333333e+00 2072 2070 -4.16666666666667e+00 2072 1959 2.08333333333333e+00 2072 2214 4.16666666666667e+00 2073 2073 1.00000000000000e+00 2073 2218 0.00000000000000e+00 2073 2075 0.00000000000000e+00 2073 2219 0.00000000000000e+00 2073 2078 0.00000000000000e+00 2073 1964 0.00000000000000e+00 2073 2447 0.00000000000000e+00 2073 1963 0.00000000000000e+00 2073 2446 0.00000000000000e+00 2073 1962 0.00000000000000e+00 2073 2217 0.00000000000000e+00 2073 1889 0.00000000000000e+00 2073 2069 0.00000000000000e+00 2073 2074 0.00000000000000e+00 2073 1888 0.00000000000000e+00 2073 2077 0.00000000000000e+00 2073 2068 0.00000000000000e+00 2073 1887 0.00000000000000e+00 2073 2076 0.00000000000000e+00 2074 2074 1.00000000000000e+00 2074 2217 0.00000000000000e+00 2074 2447 0.00000000000000e+00 2074 2078 0.00000000000000e+00 2074 1964 0.00000000000000e+00 2074 2075 0.00000000000000e+00 2074 2219 0.00000000000000e+00 2074 1963 0.00000000000000e+00 2074 2218 0.00000000000000e+00 2074 1962 0.00000000000000e+00 2074 2445 0.00000000000000e+00 2074 1889 0.00000000000000e+00 2074 2069 0.00000000000000e+00 2074 2067 0.00000000000000e+00 2074 1888 0.00000000000000e+00 2074 2077 0.00000000000000e+00 2074 2073 0.00000000000000e+00 2074 1887 0.00000000000000e+00 2074 2076 0.00000000000000e+00 2075 2075 1.00000000000000e+00 2075 2077 0.00000000000000e+00 2075 2073 0.00000000000000e+00 2075 2217 0.00000000000000e+00 2075 2076 0.00000000000000e+00 2075 1964 0.00000000000000e+00 2075 2219 0.00000000000000e+00 2075 1963 0.00000000000000e+00 2075 2074 0.00000000000000e+00 2075 2218 0.00000000000000e+00 2075 1962 0.00000000000000e+00 2075 2445 0.00000000000000e+00 2075 2446 0.00000000000000e+00 2075 1889 0.00000000000000e+00 2075 2078 0.00000000000000e+00 2075 1888 0.00000000000000e+00 2075 2068 0.00000000000000e+00 2075 1887 0.00000000000000e+00 2075 2067 0.00000000000000e+00 2076 2076 6.25000000000000e+01 2076 2219 0.00000000000000e+00 2076 2218 0.00000000000000e+00 2076 1889 0.00000000000000e+00 2076 2074 0.00000000000000e+00 2076 2073 0.00000000000000e+00 2076 2447 -2.08333333333333e+00 2076 1967 2.08333333333333e+00 2076 2446 4.16666666666667e+00 2076 2445 -6.25000000000000e+00 2076 2069 0.00000000000000e+00 2076 2068 0.00000000000000e+00 2076 2216 4.16666666666667e+00 2076 2072 -2.08333333333333e+00 2076 2077 -8.33333333333333e+00 2076 2215 4.16666666666667e+00 2076 2221 -4.16666666666667e+00 2076 1888 0.00000000000000e+00 2076 2071 4.16666666666667e+00 2076 2070 -6.25000000000000e+00 2076 2078 -8.33333333333333e+00 2076 2441 4.16666666666667e+00 2076 2222 8.33333333333333e+00 2076 2440 4.16666666666667e+00 2076 1966 -4.16666666666667e+00 2076 2075 0.00000000000000e+00 2076 2439 -1.87500000000000e+01 2076 2220 -1.25000000000000e+01 2077 2077 6.25000000000000e+01 2077 2219 0.00000000000000e+00 2077 2217 0.00000000000000e+00 2077 2074 0.00000000000000e+00 2077 2073 0.00000000000000e+00 2077 2447 4.16666666666667e+00 2077 2078 -8.33333333333333e+00 2077 2446 -1.87500000000000e+01 2077 2445 4.16666666666667e+00 2077 2067 0.00000000000000e+00 2077 2072 4.16666666666667e+00 2077 2076 -8.33333333333333e+00 2077 2216 -8.33333333333333e+00 2077 2222 8.33333333333333e+00 2077 2214 4.16666666666667e+00 2077 2220 -4.16666666666667e+00 2077 1889 0.00000000000000e+00 2077 2069 0.00000000000000e+00 2077 2071 -1.87500000000000e+01 2077 1887 0.00000000000000e+00 2077 2070 4.16666666666667e+00 2077 2441 -2.08333333333333e+00 2077 1967 2.08333333333333e+00 2077 2075 0.00000000000000e+00 2077 2440 -6.25000000000000e+00 2077 2221 -1.25000000000000e+01 2077 2439 4.16666666666667e+00 2077 1965 -4.16666666666667e+00 2078 2078 6.25000000000000e+01 2078 2218 0.00000000000000e+00 2078 2073 0.00000000000000e+00 2078 2217 0.00000000000000e+00 2078 2075 0.00000000000000e+00 2078 1887 0.00000000000000e+00 2078 2447 -6.25000000000000e+00 2078 2446 4.16666666666667e+00 2078 2077 -8.33333333333333e+00 2078 2445 -2.08333333333333e+00 2078 1965 2.08333333333333e+00 2078 2067 0.00000000000000e+00 2078 2071 4.16666666666667e+00 2078 2214 4.16666666666667e+00 2078 2070 -2.08333333333333e+00 2078 2215 -8.33333333333333e+00 2078 2221 8.33333333333333e+00 2078 2072 -6.25000000000000e+00 2078 1888 0.00000000000000e+00 2078 2068 0.00000000000000e+00 2078 2074 0.00000000000000e+00 2078 2441 -6.25000000000000e+00 2078 2222 -3.75000000000000e+01 2078 2440 -2.08333333333333e+00 2078 1966 2.08333333333333e+00 2078 2076 -8.33333333333333e+00 2078 2439 4.16666666666667e+00 2078 2220 8.33333333333333e+00 2079 2079 6.25000000000000e+01 2079 2345 4.16666666666667e+00 2079 2344 -8.33333333333333e+00 2079 2084 4.16666666666667e+00 2079 1891 2.08333333333333e+00 2079 2082 -1.87500000000000e+01 2079 2228 4.16666666666667e+00 2079 2227 -2.08333333333333e+00 2079 1912 2.08333333333333e+00 2079 2226 -6.25000000000000e+00 2079 2240 -4.16666666666667e+00 2079 2081 -8.33333333333333e+00 2079 2086 -2.08333333333333e+00 2079 2093 -4.16666666666667e+00 2079 2444 4.16666666666667e+00 2079 2092 -4.16666666666667e+00 2079 2443 4.16666666666667e+00 2079 2087 4.16666666666667e+00 2079 1892 -4.16666666666667e+00 2079 2085 -6.25000000000000e+00 2079 2234 4.16666666666667e+00 2079 1913 -4.16666666666667e+00 2079 2233 4.16666666666667e+00 2079 2080 -8.33333333333333e+00 2079 2239 8.33333333333333e+00 2079 2232 -1.87500000000000e+01 2079 2083 4.16666666666667e+00 2079 2238 -1.25000000000000e+01 2080 2080 6.25000000000000e+01 2080 2345 4.16666666666667e+00 2080 2082 4.16666666666667e+00 2080 2343 -8.33333333333333e+00 2080 2083 -6.25000000000000e+00 2080 1890 2.08333333333333e+00 2080 2228 4.16666666666667e+00 2080 2081 -8.33333333333333e+00 2080 2227 -6.25000000000000e+00 2080 2226 -2.08333333333333e+00 2080 1911 2.08333333333333e+00 2080 2085 -2.08333333333333e+00 2080 2087 4.16666666666667e+00 2080 2240 8.33333333333333e+00 2080 2444 -8.33333333333333e+00 2080 2091 -4.16666666666667e+00 2080 2442 4.16666666666667e+00 2080 1892 2.08333333333333e+00 2080 2093 -4.16666666666667e+00 2080 2086 -6.25000000000000e+00 2080 2234 -2.08333333333333e+00 2080 1913 2.08333333333333e+00 2080 2233 -6.25000000000000e+00 2080 2084 -2.08333333333333e+00 2080 2239 -3.75000000000000e+01 2080 2232 4.16666666666667e+00 2080 2079 -8.33333333333333e+00 2080 2238 8.33333333333333e+00 2081 2081 6.25000000000000e+01 2081 2344 4.16666666666667e+00 2081 2343 4.16666666666667e+00 2081 2084 -6.25000000000000e+00 2081 2082 4.16666666666667e+00 2081 2228 -1.87500000000000e+01 2081 2227 4.16666666666667e+00 2081 2080 -8.33333333333333e+00 2081 2226 4.16666666666667e+00 2081 2238 -4.16666666666667e+00 2081 2079 -8.33333333333333e+00 2081 2086 4.16666666666667e+00 2081 2091 -4.16666666666667e+00 2081 2442 4.16666666666667e+00 2081 2239 8.33333333333333e+00 2081 2443 -8.33333333333333e+00 2081 2087 -1.87500000000000e+01 2081 1891 2.08333333333333e+00 2081 2092 -4.16666666666667e+00 2081 2085 4.16666666666667e+00 2081 1890 -4.16666666666667e+00 2081 2234 -6.25000000000000e+00 2081 2083 -2.08333333333333e+00 2081 2240 -1.25000000000000e+01 2081 2233 -2.08333333333333e+00 2081 1912 2.08333333333333e+00 2081 2232 4.16666666666667e+00 2081 1911 -4.16666666666667e+00 2082 2082 6.25000000000000e+01 2082 2096 -4.16666666666667e+00 2082 2089 2.08333333333333e+00 2082 2095 -4.16666666666667e+00 2082 2090 -4.16666666666667e+00 2082 2342 4.16666666666667e+00 2082 2341 4.16666666666667e+00 2082 2347 -8.33333333333333e+00 2082 2340 -1.87500000000000e+01 2082 2093 4.16666666666667e+00 2082 2345 -4.16666666666667e+00 2082 2083 -8.33333333333333e+00 2082 2344 8.33333333333333e+00 2082 2080 4.16666666666667e+00 2082 1931 4.16666666666667e+00 2082 2228 -4.16666666666667e+00 2082 1930 -2.08333333333333e+00 2082 2227 2.08333333333333e+00 2082 1929 -6.25000000000000e+00 2082 2343 -1.25000000000000e+01 2082 2084 -8.33333333333333e+00 2082 1892 4.16666666666667e+00 2082 2081 4.16666666666667e+00 2082 1891 -2.08333333333333e+00 2082 2092 4.16666666666667e+00 2082 2348 4.16666666666667e+00 2082 1890 -6.25000000000000e+00 2082 2079 -1.87500000000000e+01 2083 2083 6.25000000000000e+01 2083 2094 -4.16666666666667e+00 2083 2090 2.08333333333333e+00 2083 2096 -4.16666666666667e+00 2083 2342 -2.08333333333333e+00 2083 2348 4.16666666666667e+00 2083 2341 -6.25000000000000e+00 2083 2340 4.16666666666667e+00 2083 2346 -8.33333333333333e+00 2083 2228 2.08333333333333e+00 2083 2081 -2.08333333333333e+00 2083 2082 -8.33333333333333e+00 2083 2343 8.33333333333333e+00 2083 2079 4.16666666666667e+00 2083 1931 4.16666666666667e+00 2083 2084 -8.33333333333333e+00 2083 2345 8.33333333333333e+00 2083 1930 -6.25000000000000e+00 2083 2344 -3.75000000000000e+01 2083 1929 -2.08333333333333e+00 2083 2226 2.08333333333333e+00 2083 1892 4.16666666666667e+00 2083 2093 -8.33333333333333e+00 2083 2088 2.08333333333333e+00 2083 1891 -6.25000000000000e+00 2083 2080 -6.25000000000000e+00 2083 1890 -2.08333333333333e+00 2083 2091 4.16666666666667e+00 2084 2084 6.25000000000000e+01 2084 2094 -4.16666666666667e+00 2084 2089 2.08333333333333e+00 2084 2095 -4.16666666666667e+00 2084 2088 -4.16666666666667e+00 2084 2342 -6.25000000000000e+00 2084 2341 -2.08333333333333e+00 2084 2347 4.16666666666667e+00 2084 2340 4.16666666666667e+00 2084 2091 4.16666666666667e+00 2084 2343 -4.16666666666667e+00 2084 2227 2.08333333333333e+00 2084 2080 -2.08333333333333e+00 2084 1931 -1.87500000000000e+01 2084 2345 -1.25000000000000e+01 2084 1930 4.16666666666667e+00 2084 2083 -8.33333333333333e+00 2084 2344 8.33333333333333e+00 2084 1929 4.16666666666667e+00 2084 2226 -4.16666666666667e+00 2084 2346 4.16666666666667e+00 2084 1892 -1.87500000000000e+01 2084 2081 -6.25000000000000e+00 2084 1891 4.16666666666667e+00 2084 2092 -8.33333333333333e+00 2084 2082 -8.33333333333333e+00 2084 1890 4.16666666666667e+00 2084 2079 4.16666666666667e+00 2085 2085 2.50000000000000e+01 2085 2233 2.08333333333333e+00 2085 2093 2.08333333333333e+00 2085 2444 -2.08333333333333e+00 2085 1961 2.08333333333333e+00 2085 2234 -4.16666666666667e+00 2085 1960 2.08333333333333e+00 2085 2086 -4.16666666666667e+00 2085 2443 4.16666666666667e+00 2085 1959 -6.25000000000000e+00 2085 2442 -6.25000000000000e+00 2085 2087 -4.16666666666667e+00 2085 1892 2.08333333333333e+00 2085 2081 4.16666666666667e+00 2085 1891 2.08333333333333e+00 2085 2092 -4.16666666666667e+00 2085 2080 -2.08333333333333e+00 2085 1890 -6.25000000000000e+00 2085 2079 -6.25000000000000e+00 2086 2086 2.91666666666667e+01 2086 2232 2.08333333333333e+00 2086 2081 4.16666666666667e+00 2086 2087 -8.33333333333333e+00 2086 2444 4.16666666666667e+00 2086 1961 -2.08333333333333e+00 2086 2234 2.08333333333333e+00 2086 1960 -2.08333333333333e+00 2086 2443 -1.87500000000000e+01 2086 1959 2.08333333333333e+00 2086 2085 -4.16666666666667e+00 2086 2442 4.16666666666667e+00 2086 1892 -2.08333333333333e+00 2086 2093 2.08333333333333e+00 2086 2079 -2.08333333333333e+00 2086 1891 -2.08333333333333e+00 2086 2080 -6.25000000000000e+00 2086 1890 2.08333333333333e+00 2086 2091 -4.16666666666667e+00 2087 2087 2.91666666666667e+01 2087 2086 -8.33333333333333e+00 2087 2443 4.16666666666667e+00 2087 2091 2.08333333333333e+00 2087 2442 -2.08333333333333e+00 2087 1961 -2.08333333333333e+00 2087 2444 -6.25000000000000e+00 2087 1960 -2.08333333333333e+00 2087 2233 2.08333333333333e+00 2087 1959 2.08333333333333e+00 2087 2232 -4.16666666666667e+00 2087 2080 4.16666666666667e+00 2087 1892 -2.08333333333333e+00 2087 2081 -1.87500000000000e+01 2087 1891 -2.08333333333333e+00 2087 2092 2.08333333333333e+00 2087 2085 -4.16666666666667e+00 2087 1890 2.08333333333333e+00 2087 2079 4.16666666666667e+00 2088 2088 2.50000000000000e+01 2088 2083 2.08333333333333e+00 2088 2459 2.08333333333333e+00 2088 2096 -2.08333333333333e+00 2088 1892 2.08333333333333e+00 2088 2084 -4.16666666666667e+00 2088 1891 2.08333333333333e+00 2088 2089 -4.16666666666667e+00 2088 2095 4.16666666666667e+00 2088 1890 -6.25000000000000e+00 2088 2094 -6.25000000000000e+00 2088 2090 -4.16666666666667e+00 2088 1970 2.08333333333333e+00 2088 2342 4.16666666666667e+00 2088 1969 2.08333333333333e+00 2088 2458 -4.16666666666667e+00 2088 2341 -2.08333333333333e+00 2088 1968 -6.25000000000000e+00 2088 2340 -6.25000000000000e+00 2089 2089 2.91666666666667e+01 2089 2082 2.08333333333333e+00 2089 2342 4.16666666666667e+00 2089 2090 -8.33333333333333e+00 2089 2096 4.16666666666667e+00 2089 1892 -2.08333333333333e+00 2089 2084 2.08333333333333e+00 2089 1891 -2.08333333333333e+00 2089 2095 -1.87500000000000e+01 2089 1890 2.08333333333333e+00 2089 2088 -4.16666666666667e+00 2089 2094 4.16666666666667e+00 2089 1970 -2.08333333333333e+00 2089 2459 2.08333333333333e+00 2089 2340 -2.08333333333333e+00 2089 1969 -2.08333333333333e+00 2089 2341 -6.25000000000000e+00 2089 1968 2.08333333333333e+00 2089 2457 -4.16666666666667e+00 2090 2090 2.91666666666667e+01 2090 2089 -8.33333333333333e+00 2090 2095 4.16666666666667e+00 2090 2457 2.08333333333333e+00 2090 2094 -2.08333333333333e+00 2090 1892 -2.08333333333333e+00 2090 2096 -6.25000000000000e+00 2090 1891 -2.08333333333333e+00 2090 2083 2.08333333333333e+00 2090 1890 2.08333333333333e+00 2090 2082 -4.16666666666667e+00 2090 2341 4.16666666666667e+00 2090 1970 -2.08333333333333e+00 2090 2342 -1.87500000000000e+01 2090 1969 -2.08333333333333e+00 2090 2458 2.08333333333333e+00 2090 2088 -4.16666666666667e+00 2090 1968 2.08333333333333e+00 2090 2340 4.16666666666667e+00 2091 2091 6.25000000000000e+01 2091 2096 4.16666666666667e+00 2091 1973 -2.08333333333333e+00 2091 2465 2.08333333333333e+00 2091 2464 -4.16666666666667e+00 2091 1892 -2.08333333333333e+00 2091 2095 4.16666666666667e+00 2091 2094 -1.87500000000000e+01 2091 2084 4.16666666666667e+00 2091 2083 4.16666666666667e+00 2091 2345 8.33333333333333e+00 2091 2344 -4.16666666666667e+00 2091 2343 -1.25000000000000e+01 2091 2081 -4.16666666666667e+00 2091 2087 2.08333333333333e+00 2091 2080 -4.16666666666667e+00 2091 2239 4.16666666666667e+00 2091 2086 -4.16666666666667e+00 2091 1891 4.16666666666667e+00 2091 1890 -6.25000000000000e+00 2091 2444 4.16666666666667e+00 2091 2240 -8.33333333333333e+00 2091 2443 4.16666666666667e+00 2091 2092 -8.33333333333333e+00 2091 1972 4.16666666666667e+00 2091 2442 -1.87500000000000e+01 2091 2093 -8.33333333333333e+00 2091 1971 -6.25000000000000e+00 2092 2092 6.25000000000000e+01 2092 2096 -2.08333333333333e+00 2092 2463 -4.16666666666667e+00 2092 2095 -6.25000000000000e+00 2092 2094 4.16666666666667e+00 2092 2084 -8.33333333333333e+00 2092 1892 4.16666666666667e+00 2092 2082 4.16666666666667e+00 2092 2345 8.33333333333333e+00 2092 2093 -8.33333333333333e+00 2092 1973 4.16666666666667e+00 2092 2344 -1.25000000000000e+01 2092 2343 -4.16666666666667e+00 2092 2079 -4.16666666666667e+00 2092 2238 4.16666666666667e+00 2092 2087 2.08333333333333e+00 2092 2081 -4.16666666666667e+00 2092 1891 -1.87500000000000e+01 2092 2085 -4.16666666666667e+00 2092 1890 4.16666666666667e+00 2092 2444 -2.08333333333333e+00 2092 2240 4.16666666666667e+00 2092 2443 -6.25000000000000e+00 2092 2465 2.08333333333333e+00 2092 1972 -1.87500000000000e+01 2092 2442 4.16666666666667e+00 2092 2091 -8.33333333333333e+00 2092 1971 4.16666666666667e+00 2093 2093 6.25000000000000e+01 2093 2095 -2.08333333333333e+00 2093 2091 -8.33333333333333e+00 2093 2094 4.16666666666667e+00 2093 1971 -2.08333333333333e+00 2093 2463 2.08333333333333e+00 2093 2096 -6.25000000000000e+00 2093 1890 -2.08333333333333e+00 2093 2082 4.16666666666667e+00 2093 2083 -8.33333333333333e+00 2093 1891 4.16666666666667e+00 2093 2345 -3.75000000000000e+01 2093 2344 8.33333333333333e+00 2093 2092 -8.33333333333333e+00 2093 1972 4.16666666666667e+00 2093 2343 8.33333333333333e+00 2093 2079 -4.16666666666667e+00 2093 2085 2.08333333333333e+00 2093 1892 -6.25000000000000e+00 2093 2086 2.08333333333333e+00 2093 2080 -4.16666666666667e+00 2093 2444 -6.25000000000000e+00 2093 2464 2.08333333333333e+00 2093 1973 -6.25000000000000e+00 2093 2443 -2.08333333333333e+00 2093 2239 4.16666666666667e+00 2093 2442 4.16666666666667e+00 2093 2238 -8.33333333333333e+00 2094 2094 6.25000000000000e+01 2094 2345 -8.33333333333333e+00 2094 2344 4.16666666666667e+00 2094 1892 2.08333333333333e+00 2094 2092 4.16666666666667e+00 2094 2091 -1.87500000000000e+01 2094 2465 -2.08333333333333e+00 2094 1976 2.08333333333333e+00 2094 2464 4.16666666666667e+00 2094 2463 -6.25000000000000e+00 2094 2084 -4.16666666666667e+00 2094 2083 -4.16666666666667e+00 2094 2342 4.16666666666667e+00 2094 2090 -2.08333333333333e+00 2094 2095 -8.33333333333333e+00 2094 2341 4.16666666666667e+00 2094 2347 -4.16666666666667e+00 2094 1891 -4.16666666666667e+00 2094 2089 4.16666666666667e+00 2094 2088 -6.25000000000000e+00 2094 2096 -8.33333333333333e+00 2094 2459 4.16666666666667e+00 2094 2348 8.33333333333333e+00 2094 2458 4.16666666666667e+00 2094 1975 -4.16666666666667e+00 2094 2093 4.16666666666667e+00 2094 2457 -1.87500000000000e+01 2094 2346 -1.25000000000000e+01 2095 2095 6.25000000000000e+01 2095 2345 4.16666666666667e+00 2095 2343 4.16666666666667e+00 2095 2092 -6.25000000000000e+00 2095 2091 4.16666666666667e+00 2095 2465 4.16666666666667e+00 2095 2096 -8.33333333333333e+00 2095 2464 -1.87500000000000e+01 2095 2463 4.16666666666667e+00 2095 2082 -4.16666666666667e+00 2095 2090 4.16666666666667e+00 2095 2094 -8.33333333333333e+00 2095 2342 -8.33333333333333e+00 2095 2348 8.33333333333333e+00 2095 2340 4.16666666666667e+00 2095 2346 -4.16666666666667e+00 2095 1892 2.08333333333333e+00 2095 2084 -4.16666666666667e+00 2095 2089 -1.87500000000000e+01 2095 1890 -4.16666666666667e+00 2095 2088 4.16666666666667e+00 2095 2459 -2.08333333333333e+00 2095 1976 2.08333333333333e+00 2095 2093 -2.08333333333333e+00 2095 2458 -6.25000000000000e+00 2095 2347 -1.25000000000000e+01 2095 2457 4.16666666666667e+00 2095 1974 -4.16666666666667e+00 2096 2096 6.25000000000000e+01 2096 2344 4.16666666666667e+00 2096 2091 4.16666666666667e+00 2096 2343 -8.33333333333333e+00 2096 2093 -6.25000000000000e+00 2096 1890 2.08333333333333e+00 2096 2465 -6.25000000000000e+00 2096 2464 4.16666666666667e+00 2096 2095 -8.33333333333333e+00 2096 2463 -2.08333333333333e+00 2096 1974 2.08333333333333e+00 2096 2082 -4.16666666666667e+00 2096 2089 4.16666666666667e+00 2096 2340 4.16666666666667e+00 2096 2088 -2.08333333333333e+00 2096 2341 -8.33333333333333e+00 2096 2347 8.33333333333333e+00 2096 2090 -6.25000000000000e+00 2096 1891 2.08333333333333e+00 2096 2083 -4.16666666666667e+00 2096 2092 -2.08333333333333e+00 2096 2459 -6.25000000000000e+00 2096 2348 -3.75000000000000e+01 2096 2458 -2.08333333333333e+00 2096 1975 2.08333333333333e+00 2096 2094 -8.33333333333333e+00 2096 2457 4.16666666666667e+00 2096 2346 8.33333333333333e+00 2097 2097 6.25000000000000e+01 2097 2354 4.16666666666667e+00 2097 2353 -2.08333333333333e+00 2097 1933 2.08333333333333e+00 2097 2352 -6.25000000000000e+00 2097 2366 -4.16666666666667e+00 2097 2099 -8.33333333333333e+00 2097 2101 -2.08333333333333e+00 2097 2462 4.16666666666667e+00 2097 2461 4.16666666666667e+00 2097 2102 4.16666666666667e+00 2097 2100 -6.25000000000000e+00 2097 2360 4.16666666666667e+00 2097 1934 -4.16666666666667e+00 2097 2359 4.16666666666667e+00 2097 2098 -8.33333333333333e+00 2097 2365 8.33333333333333e+00 2097 2358 -1.87500000000000e+01 2097 2364 -1.25000000000000e+01 2097 1619 4.16666666666667e+00 2097 1618 -8.33333333333333e+00 2097 1469 4.16666666666667e+00 2097 1288 2.08333333333333e+00 2097 1467 -1.87500000000000e+01 2097 1475 -4.16666666666667e+00 2097 1474 -4.16666666666667e+00 2097 1289 -4.16666666666667e+00 2097 1468 4.16666666666667e+00 2098 2098 6.25000000000000e+01 2098 2354 4.16666666666667e+00 2098 2099 -8.33333333333333e+00 2098 2353 -6.25000000000000e+00 2098 2352 -2.08333333333333e+00 2098 1932 2.08333333333333e+00 2098 2100 -2.08333333333333e+00 2098 2102 4.16666666666667e+00 2098 2366 8.33333333333333e+00 2098 2462 -8.33333333333333e+00 2098 2460 4.16666666666667e+00 2098 2101 -6.25000000000000e+00 2098 2360 -2.08333333333333e+00 2098 1934 2.08333333333333e+00 2098 2359 -6.25000000000000e+00 2098 2365 -3.75000000000000e+01 2098 2358 4.16666666666667e+00 2098 2097 -8.33333333333333e+00 2098 2364 8.33333333333333e+00 2098 1619 4.16666666666667e+00 2098 1467 4.16666666666667e+00 2098 1617 -8.33333333333333e+00 2098 1468 -6.25000000000000e+00 2098 1287 2.08333333333333e+00 2098 1473 -4.16666666666667e+00 2098 1289 2.08333333333333e+00 2098 1475 -4.16666666666667e+00 2098 1469 -2.08333333333333e+00 2099 2099 6.25000000000000e+01 2099 2354 -1.87500000000000e+01 2099 2353 4.16666666666667e+00 2099 2098 -8.33333333333333e+00 2099 2352 4.16666666666667e+00 2099 2364 -4.16666666666667e+00 2099 2097 -8.33333333333333e+00 2099 2101 4.16666666666667e+00 2099 2460 4.16666666666667e+00 2099 2365 8.33333333333333e+00 2099 2461 -8.33333333333333e+00 2099 2102 -1.87500000000000e+01 2099 2100 4.16666666666667e+00 2099 2360 -6.25000000000000e+00 2099 2366 -1.25000000000000e+01 2099 2359 -2.08333333333333e+00 2099 1933 2.08333333333333e+00 2099 2358 4.16666666666667e+00 2099 1932 -4.16666666666667e+00 2099 1618 4.16666666666667e+00 2099 1617 4.16666666666667e+00 2099 1469 -6.25000000000000e+00 2099 1467 4.16666666666667e+00 2099 1473 -4.16666666666667e+00 2099 1288 2.08333333333333e+00 2099 1474 -4.16666666666667e+00 2099 1287 -4.16666666666667e+00 2099 1468 -2.08333333333333e+00 2100 2100 2.50000000000000e+01 2100 2359 2.08333333333333e+00 2100 2462 -2.08333333333333e+00 2100 1970 2.08333333333333e+00 2100 2360 -4.16666666666667e+00 2100 1969 2.08333333333333e+00 2100 2101 -4.16666666666667e+00 2100 2461 4.16666666666667e+00 2100 1968 -6.25000000000000e+00 2100 2460 -6.25000000000000e+00 2100 2102 -4.16666666666667e+00 2100 2099 4.16666666666667e+00 2100 2098 -2.08333333333333e+00 2100 2097 -6.25000000000000e+00 2100 1475 2.08333333333333e+00 2100 1289 2.08333333333333e+00 2100 1288 2.08333333333333e+00 2100 1474 -4.16666666666667e+00 2100 1287 -6.25000000000000e+00 2101 2101 2.91666666666667e+01 2101 2358 2.08333333333333e+00 2101 2099 4.16666666666667e+00 2101 2102 -8.33333333333333e+00 2101 2462 4.16666666666667e+00 2101 1970 -2.08333333333333e+00 2101 2360 2.08333333333333e+00 2101 1969 -2.08333333333333e+00 2101 2461 -1.87500000000000e+01 2101 1968 2.08333333333333e+00 2101 2100 -4.16666666666667e+00 2101 2460 4.16666666666667e+00 2101 2097 -2.08333333333333e+00 2101 2098 -6.25000000000000e+00 2101 1289 -2.08333333333333e+00 2101 1475 2.08333333333333e+00 2101 1288 -2.08333333333333e+00 2101 1287 2.08333333333333e+00 2101 1473 -4.16666666666667e+00 2102 2102 2.91666666666667e+01 2102 2101 -8.33333333333333e+00 2102 2461 4.16666666666667e+00 2102 2460 -2.08333333333333e+00 2102 1970 -2.08333333333333e+00 2102 2462 -6.25000000000000e+00 2102 1969 -2.08333333333333e+00 2102 2359 2.08333333333333e+00 2102 1968 2.08333333333333e+00 2102 2358 -4.16666666666667e+00 2102 2098 4.16666666666667e+00 2102 2099 -1.87500000000000e+01 2102 2100 -4.16666666666667e+00 2102 2097 4.16666666666667e+00 2102 1473 2.08333333333333e+00 2102 1289 -2.08333333333333e+00 2102 1288 -2.08333333333333e+00 2102 1474 2.08333333333333e+00 2102 1287 2.08333333333333e+00 2103 2103 1.00000000000000e+00 2103 2108 0.00000000000000e+00 2103 2107 0.00000000000000e+00 2103 2413 0.00000000000000e+00 2103 1894 0.00000000000000e+00 2103 2106 0.00000000000000e+00 2103 2105 0.00000000000000e+00 2103 2246 0.00000000000000e+00 2103 2245 0.00000000000000e+00 2103 1915 0.00000000000000e+00 2103 2244 0.00000000000000e+00 2103 2110 0.00000000000000e+00 2103 2111 0.00000000000000e+00 2103 2258 0.00000000000000e+00 2103 2450 0.00000000000000e+00 2103 2113 0.00000000000000e+00 2103 2449 0.00000000000000e+00 2103 1895 0.00000000000000e+00 2103 2114 0.00000000000000e+00 2103 2109 0.00000000000000e+00 2103 2252 0.00000000000000e+00 2103 1916 0.00000000000000e+00 2103 2104 0.00000000000000e+00 2103 2251 0.00000000000000e+00 2103 2257 0.00000000000000e+00 2103 2414 0.00000000000000e+00 2103 2250 0.00000000000000e+00 2103 2256 0.00000000000000e+00 2104 2104 1.00000000000000e+00 2104 2414 0.00000000000000e+00 2104 2412 0.00000000000000e+00 2104 2108 0.00000000000000e+00 2104 2107 0.00000000000000e+00 2104 1893 0.00000000000000e+00 2104 2246 0.00000000000000e+00 2104 2245 0.00000000000000e+00 2104 2244 0.00000000000000e+00 2104 1914 0.00000000000000e+00 2104 2258 0.00000000000000e+00 2104 2105 0.00000000000000e+00 2104 2109 0.00000000000000e+00 2104 2114 0.00000000000000e+00 2104 2450 0.00000000000000e+00 2104 2112 0.00000000000000e+00 2104 2448 0.00000000000000e+00 2104 1895 0.00000000000000e+00 2104 2111 0.00000000000000e+00 2104 2110 0.00000000000000e+00 2104 2252 0.00000000000000e+00 2104 1916 0.00000000000000e+00 2104 2106 0.00000000000000e+00 2104 2251 0.00000000000000e+00 2104 2257 0.00000000000000e+00 2104 2103 0.00000000000000e+00 2104 2250 0.00000000000000e+00 2104 2256 0.00000000000000e+00 2105 2105 1.00000000000000e+00 2105 2106 0.00000000000000e+00 2105 2413 0.00000000000000e+00 2105 2108 0.00000000000000e+00 2105 2107 0.00000000000000e+00 2105 2246 0.00000000000000e+00 2105 2245 0.00000000000000e+00 2105 2103 0.00000000000000e+00 2105 2244 0.00000000000000e+00 2105 2257 0.00000000000000e+00 2105 2104 0.00000000000000e+00 2105 2113 0.00000000000000e+00 2105 2449 0.00000000000000e+00 2105 2109 0.00000000000000e+00 2105 2256 0.00000000000000e+00 2105 2448 0.00000000000000e+00 2105 2111 0.00000000000000e+00 2105 1894 0.00000000000000e+00 2105 2110 0.00000000000000e+00 2105 1893 0.00000000000000e+00 2105 2112 0.00000000000000e+00 2105 2412 0.00000000000000e+00 2105 2252 0.00000000000000e+00 2105 2258 0.00000000000000e+00 2105 2251 0.00000000000000e+00 2105 1915 0.00000000000000e+00 2105 2250 0.00000000000000e+00 2105 1914 0.00000000000000e+00 2106 2106 1.00000000000000e+00 2106 2105 0.00000000000000e+00 2106 2413 0.00000000000000e+00 2106 2107 0.00000000000000e+00 2106 2104 0.00000000000000e+00 2106 1895 0.00000000000000e+00 2106 2114 0.00000000000000e+00 2106 1894 0.00000000000000e+00 2106 2113 0.00000000000000e+00 2106 1893 0.00000000000000e+00 2106 2103 0.00000000000000e+00 2106 2108 0.00000000000000e+00 2106 1946 0.00000000000000e+00 2106 2414 0.00000000000000e+00 2106 1945 0.00000000000000e+00 2106 2245 0.00000000000000e+00 2106 2246 0.00000000000000e+00 2106 1944 0.00000000000000e+00 2106 2412 0.00000000000000e+00 2107 2107 1.00000000000000e+00 2107 2114 0.00000000000000e+00 2107 2412 0.00000000000000e+00 2107 2106 0.00000000000000e+00 2107 2103 0.00000000000000e+00 2107 1895 0.00000000000000e+00 2107 2108 0.00000000000000e+00 2107 2105 0.00000000000000e+00 2107 1894 0.00000000000000e+00 2107 2104 0.00000000000000e+00 2107 1893 0.00000000000000e+00 2107 2112 0.00000000000000e+00 2107 1946 0.00000000000000e+00 2107 2246 0.00000000000000e+00 2107 2414 0.00000000000000e+00 2107 1945 0.00000000000000e+00 2107 2413 0.00000000000000e+00 2107 1944 0.00000000000000e+00 2107 2244 0.00000000000000e+00 2108 2108 1.00000000000000e+00 2108 2113 0.00000000000000e+00 2108 2244 0.00000000000000e+00 2108 2103 0.00000000000000e+00 2108 1895 0.00000000000000e+00 2108 2105 0.00000000000000e+00 2108 1894 0.00000000000000e+00 2108 2107 0.00000000000000e+00 2108 2104 0.00000000000000e+00 2108 1893 0.00000000000000e+00 2108 2112 0.00000000000000e+00 2108 2413 0.00000000000000e+00 2108 1946 0.00000000000000e+00 2108 2414 0.00000000000000e+00 2108 1945 0.00000000000000e+00 2108 2245 0.00000000000000e+00 2108 2106 0.00000000000000e+00 2108 1944 0.00000000000000e+00 2108 2412 0.00000000000000e+00 2109 2109 1.00000000000000e+00 2109 2104 0.00000000000000e+00 2109 2111 0.00000000000000e+00 2109 2105 0.00000000000000e+00 2109 2450 0.00000000000000e+00 2109 1895 0.00000000000000e+00 2109 2114 0.00000000000000e+00 2109 1894 0.00000000000000e+00 2109 2113 0.00000000000000e+00 2109 1893 0.00000000000000e+00 2109 2103 0.00000000000000e+00 2109 1964 0.00000000000000e+00 2109 2252 0.00000000000000e+00 2109 2110 0.00000000000000e+00 2109 1963 0.00000000000000e+00 2109 2449 0.00000000000000e+00 2109 2251 0.00000000000000e+00 2109 1962 0.00000000000000e+00 2109 2448 0.00000000000000e+00 2110 2110 1.00000000000000e+00 2110 2103 0.00000000000000e+00 2110 2114 0.00000000000000e+00 2110 2450 0.00000000000000e+00 2110 1895 0.00000000000000e+00 2110 2111 0.00000000000000e+00 2110 2105 0.00000000000000e+00 2110 1894 0.00000000000000e+00 2110 2104 0.00000000000000e+00 2110 1893 0.00000000000000e+00 2110 2112 0.00000000000000e+00 2110 1964 0.00000000000000e+00 2110 2252 0.00000000000000e+00 2110 2250 0.00000000000000e+00 2110 1963 0.00000000000000e+00 2110 2449 0.00000000000000e+00 2110 2109 0.00000000000000e+00 2110 1962 0.00000000000000e+00 2110 2448 0.00000000000000e+00 2111 2111 1.00000000000000e+00 2111 2449 0.00000000000000e+00 2111 2109 0.00000000000000e+00 2111 2103 0.00000000000000e+00 2111 2448 0.00000000000000e+00 2111 1895 0.00000000000000e+00 2111 2105 0.00000000000000e+00 2111 1894 0.00000000000000e+00 2111 2110 0.00000000000000e+00 2111 2104 0.00000000000000e+00 2111 1893 0.00000000000000e+00 2111 2112 0.00000000000000e+00 2111 2113 0.00000000000000e+00 2111 1964 0.00000000000000e+00 2111 2450 0.00000000000000e+00 2111 1963 0.00000000000000e+00 2111 2251 0.00000000000000e+00 2111 1962 0.00000000000000e+00 2111 2250 0.00000000000000e+00 2112 2112 3.75000000000000e+01 2112 2108 0.00000000000000e+00 2112 2107 0.00000000000000e+00 2112 2114 -4.16666666666667e+00 2112 2414 4.16666666666667e+00 2112 1979 2.08333333333333e+00 2112 2413 -2.08333333333333e+00 2112 2412 -6.25000000000000e+00 2112 2104 0.00000000000000e+00 2112 2257 4.16666666666667e+00 2112 2111 0.00000000000000e+00 2112 2105 0.00000000000000e+00 2112 1894 0.00000000000000e+00 2112 2110 0.00000000000000e+00 2112 1893 0.00000000000000e+00 2112 2450 -2.08333333333333e+00 2112 2258 4.16666666666667e+00 2112 2113 -4.16666666666667e+00 2112 2449 4.16666666666667e+00 2112 1978 2.08333333333333e+00 2112 1895 0.00000000000000e+00 2112 2448 -6.25000000000000e+00 2112 1977 -1.25000000000000e+01 2113 2113 3.33333333333333e+01 2113 2106 0.00000000000000e+00 2113 2414 4.16666666666667e+00 2113 2413 -6.25000000000000e+00 2113 2412 -2.08333333333333e+00 2113 2111 0.00000000000000e+00 2113 2105 0.00000000000000e+00 2113 2103 0.00000000000000e+00 2113 2256 4.16666666666667e+00 2113 1894 0.00000000000000e+00 2113 1893 0.00000000000000e+00 2113 2109 0.00000000000000e+00 2113 2450 4.16666666666667e+00 2113 2258 -8.33333333333333e+00 2113 2108 0.00000000000000e+00 2113 2449 -1.87500000000000e+01 2113 1978 -4.16666666666667e+00 2113 2112 -4.16666666666667e+00 2113 2448 4.16666666666667e+00 2113 1977 2.08333333333333e+00 2114 2114 3.33333333333333e+01 2114 1893 0.00000000000000e+00 2114 2106 0.00000000000000e+00 2114 2414 -1.87500000000000e+01 2114 2413 4.16666666666667e+00 2114 2112 -4.16666666666667e+00 2114 2412 4.16666666666667e+00 2114 1977 2.08333333333333e+00 2114 2110 0.00000000000000e+00 2114 2104 0.00000000000000e+00 2114 1895 0.00000000000000e+00 2114 2109 0.00000000000000e+00 2114 2103 0.00000000000000e+00 2114 2107 0.00000000000000e+00 2114 2450 -6.25000000000000e+00 2114 1979 -4.16666666666667e+00 2114 2449 4.16666666666667e+00 2114 2257 -8.33333333333333e+00 2114 2448 -2.08333333333333e+00 2114 2256 4.16666666666667e+00 2115 2115 1.25000000000000e+02 2115 2122 8.33333333333333e+00 2115 2121 -1.25000000000000e+01 2115 2264 -8.33333333333333e+00 2115 2263 4.16666666666667e+00 2115 2276 8.33333333333333e+00 2115 2134 4.16666666666667e+00 2115 2275 8.33333333333333e+00 2115 2274 -3.75000000000000e+01 2115 2135 4.16666666666667e+00 2115 2266 -4.16666666666667e+00 2115 2267 8.33333333333333e+00 2115 2117 -1.66666666666667e+01 2115 1919 -4.16666666666667e+00 2115 2265 -1.25000000000000e+01 2115 2126 4.16666666666667e+00 2115 1898 -4.16666666666667e+00 2115 2125 -8.33333333333333e+00 2115 2261 4.16666666666667e+00 2115 2119 8.33333333333333e+00 2115 2116 -1.66666666666667e+01 2115 2120 8.33333333333333e+00 2115 1897 -4.16666666666667e+00 2115 2118 -3.75000000000000e+01 2115 2260 4.16666666666667e+00 2115 1918 -4.16666666666667e+00 2115 2273 -4.16666666666667e+00 2115 2270 4.16666666666667e+00 2115 2131 4.16666666666667e+00 2115 2128 -4.16666666666667e+00 2115 2269 -8.33333333333333e+00 2115 2272 8.33333333333333e+00 2115 2271 -1.25000000000000e+01 2115 2129 8.33333333333333e+00 2115 2132 -8.33333333333333e+00 2115 2127 -1.25000000000000e+01 2115 2123 -4.16666666666667e+00 2116 2116 1.25000000000000e+02 2116 2121 8.33333333333333e+00 2116 2123 8.33333333333333e+00 2116 2122 -3.75000000000000e+01 2116 2262 4.16666666666667e+00 2116 2276 -4.16666666666667e+00 2116 2133 4.16666666666667e+00 2116 2275 -1.25000000000000e+01 2116 2274 8.33333333333333e+00 2116 2135 -8.33333333333333e+00 2116 2265 -4.16666666666667e+00 2116 2126 4.16666666666667e+00 2116 2267 8.33333333333333e+00 2116 2266 -1.25000000000000e+01 2116 2124 -8.33333333333333e+00 2116 2120 -4.16666666666667e+00 2116 2118 8.33333333333333e+00 2116 2115 -1.66666666666667e+01 2116 2119 -1.25000000000000e+01 2116 1896 -4.16666666666667e+00 2116 2261 -8.33333333333333e+00 2116 2259 4.16666666666667e+00 2116 1917 -4.16666666666667e+00 2116 2273 8.33333333333333e+00 2116 2117 -1.66666666666667e+01 2116 2129 8.33333333333333e+00 2116 2130 4.16666666666667e+00 2116 2127 -4.16666666666667e+00 2116 2270 4.16666666666667e+00 2116 1919 -4.16666666666667e+00 2116 2272 -3.75000000000000e+01 2116 2268 -8.33333333333333e+00 2116 2271 8.33333333333333e+00 2116 2132 4.16666666666667e+00 2116 1898 -4.16666666666667e+00 2116 2128 -1.25000000000000e+01 2116 2264 4.16666666666667e+00 2117 2117 1.25000000000000e+02 2117 2263 4.16666666666667e+00 2117 2123 -1.25000000000000e+01 2117 2122 8.33333333333333e+00 2117 2262 -8.33333333333333e+00 2117 2275 -4.16666666666667e+00 2117 2274 8.33333333333333e+00 2117 2276 -1.25000000000000e+01 2117 2134 -8.33333333333333e+00 2117 2133 4.16666666666667e+00 2117 2125 4.16666666666667e+00 2117 2265 8.33333333333333e+00 2117 2115 -1.66666666666667e+01 2117 2267 -3.75000000000000e+01 2117 2266 8.33333333333333e+00 2117 1917 -4.16666666666667e+00 2117 2124 4.16666666666667e+00 2117 1896 -4.16666666666667e+00 2117 2119 -4.16666666666667e+00 2117 2259 4.16666666666667e+00 2117 2120 -1.25000000000000e+01 2117 2118 8.33333333333333e+00 2117 2260 -8.33333333333333e+00 2117 2271 -4.16666666666667e+00 2117 2268 4.16666666666667e+00 2117 2272 8.33333333333333e+00 2117 2116 -1.66666666666667e+01 2117 2128 8.33333333333333e+00 2117 2273 -1.25000000000000e+01 2117 2269 4.16666666666667e+00 2117 1918 -4.16666666666667e+00 2117 2129 -3.75000000000000e+01 2117 2121 -4.16666666666667e+00 2117 2131 4.16666666666667e+00 2117 1897 -4.16666666666667e+00 2117 2127 8.33333333333333e+00 2117 2130 -8.33333333333333e+00 2118 2118 1.25000000000000e+02 2118 2431 -8.33333333333333e+00 2118 2384 8.33333333333333e+00 2118 2468 -8.33333333333333e+00 2118 2137 -4.16666666666667e+00 2118 2467 4.16666666666667e+00 2118 2138 -4.16666666666667e+00 2118 2383 8.33333333333333e+00 2118 2382 -3.75000000000000e+01 2118 2372 8.33333333333333e+00 2118 2266 4.16666666666667e+00 2118 2371 -4.16666666666667e+00 2118 2267 -8.33333333333333e+00 2118 1937 4.16666666666667e+00 2118 2370 -1.25000000000000e+01 2118 2126 -4.16666666666667e+00 2118 1898 4.16666666666667e+00 2118 2119 -1.66666666666667e+01 2118 2125 8.33333333333333e+00 2118 2124 -1.25000000000000e+01 2118 2378 -4.16666666666667e+00 2118 2377 8.33333333333333e+00 2118 2261 -4.16666666666667e+00 2118 2273 4.16666666666667e+00 2118 2116 8.33333333333333e+00 2118 2272 -8.33333333333333e+00 2118 1936 4.16666666666667e+00 2118 2260 -4.16666666666667e+00 2118 2376 -1.25000000000000e+01 2118 2120 -1.66666666666667e+01 2118 2132 8.33333333333333e+00 2118 2117 8.33333333333333e+00 2118 2131 -4.16666666666667e+00 2118 1897 4.16666666666667e+00 2118 2432 4.16666666666667e+00 2118 2130 -1.25000000000000e+01 2118 2115 -3.75000000000000e+01 2119 2119 1.25000000000000e+02 2119 2430 -8.33333333333333e+00 2119 2384 -4.16666666666667e+00 2119 2138 -4.16666666666667e+00 2119 2468 4.16666666666667e+00 2119 2136 -4.16666666666667e+00 2119 2466 4.16666666666667e+00 2119 2383 -1.25000000000000e+01 2119 2382 8.33333333333333e+00 2119 2265 4.16666666666667e+00 2119 2370 -4.16666666666667e+00 2119 2267 4.16666666666667e+00 2119 2372 8.33333333333333e+00 2119 2371 -1.25000000000000e+01 2119 2126 8.33333333333333e+00 2119 2125 -3.75000000000000e+01 2119 2118 -1.66666666666667e+01 2119 2124 8.33333333333333e+00 2119 2117 -4.16666666666667e+00 2119 2120 -1.66666666666667e+01 2119 2261 -4.16666666666667e+00 2119 2273 4.16666666666667e+00 2119 2376 8.33333333333333e+00 2119 2115 8.33333333333333e+00 2119 2271 -8.33333333333333e+00 2119 1937 -8.33333333333333e+00 2119 2378 8.33333333333333e+00 2119 2377 -3.75000000000000e+01 2119 1935 4.16666666666667e+00 2119 2259 -4.16666666666667e+00 2119 2132 8.33333333333333e+00 2119 1898 -8.33333333333333e+00 2119 2432 4.16666666666667e+00 2119 2131 -1.25000000000000e+01 2119 2116 -1.25000000000000e+01 2119 2130 -4.16666666666667e+00 2119 1896 4.16666666666667e+00 2120 2120 1.25000000000000e+02 2120 2431 4.16666666666667e+00 2120 2383 -4.16666666666667e+00 2120 2137 -4.16666666666667e+00 2120 2467 4.16666666666667e+00 2120 2382 8.33333333333333e+00 2120 2466 -8.33333333333333e+00 2120 2136 -4.16666666666667e+00 2120 2384 -1.25000000000000e+01 2120 2370 8.33333333333333e+00 2120 2266 4.16666666666667e+00 2120 2265 -8.33333333333333e+00 2120 2372 -3.75000000000000e+01 2120 2371 8.33333333333333e+00 2120 1935 4.16666666666667e+00 2120 2126 -1.25000000000000e+01 2120 2125 8.33333333333333e+00 2120 2124 -4.16666666666667e+00 2120 1896 4.16666666666667e+00 2120 2116 -4.16666666666667e+00 2120 2119 -1.66666666666667e+01 2120 2376 -4.16666666666667e+00 2120 2260 -4.16666666666667e+00 2120 2272 4.16666666666667e+00 2120 2259 -4.16666666666667e+00 2120 2271 4.16666666666667e+00 2120 2378 -1.25000000000000e+01 2120 1936 -8.33333333333333e+00 2120 2377 8.33333333333333e+00 2120 2430 4.16666666666667e+00 2120 2132 -3.75000000000000e+01 2120 2117 -1.25000000000000e+01 2120 2131 8.33333333333333e+00 2120 1897 -8.33333333333333e+00 2120 2118 -1.66666666666667e+01 2120 2130 8.33333333333333e+00 2120 2115 8.33333333333333e+00 2121 2121 6.25000000000000e+01 2121 2266 4.16666666666667e+00 2121 2267 4.16666666666667e+00 2121 2417 4.16666666666667e+00 2121 2415 -6.25000000000000e+00 2121 2126 4.16666666666667e+00 2121 2125 4.16666666666667e+00 2121 2122 -8.33333333333333e+00 2121 2124 -1.87500000000000e+01 2121 2117 -4.16666666666667e+00 2121 2123 -8.33333333333333e+00 2121 2264 -4.16666666666667e+00 2121 2276 4.16666666666667e+00 2121 2419 4.16666666666667e+00 2121 2116 8.33333333333333e+00 2121 2275 -8.33333333333333e+00 2121 2420 4.16666666666667e+00 2121 1949 -4.16666666666667e+00 2121 1948 2.08333333333333e+00 2121 2263 -4.16666666666667e+00 2121 2418 -1.87500000000000e+01 2121 2135 4.16666666666667e+00 2121 1898 -4.16666666666667e+00 2121 2134 -2.08333333333333e+00 2121 1897 2.08333333333333e+00 2121 2133 -6.25000000000000e+00 2121 2416 -2.08333333333333e+00 2121 2115 -1.25000000000000e+01 2122 2122 6.25000000000000e+01 2122 2415 -2.08333333333333e+00 2122 2265 4.16666666666667e+00 2122 2267 -8.33333333333333e+00 2122 1949 2.08333333333333e+00 2122 2416 -6.25000000000000e+00 2122 2126 -2.08333333333333e+00 2122 1898 2.08333333333333e+00 2122 2125 -6.25000000000000e+00 2122 2124 4.16666666666667e+00 2122 2121 -8.33333333333333e+00 2122 2420 -2.08333333333333e+00 2122 2418 4.16666666666667e+00 2122 2264 -4.16666666666667e+00 2122 2276 4.16666666666667e+00 2122 2115 8.33333333333333e+00 2122 2274 -8.33333333333333e+00 2122 2419 -6.25000000000000e+00 2122 1947 2.08333333333333e+00 2122 2262 -4.16666666666667e+00 2122 2135 4.16666666666667e+00 2122 2123 -8.33333333333333e+00 2122 2117 8.33333333333333e+00 2122 2134 -6.25000000000000e+00 2122 2417 4.16666666666667e+00 2122 2116 -3.75000000000000e+01 2122 2133 -2.08333333333333e+00 2122 1896 2.08333333333333e+00 2123 2123 6.25000000000000e+01 2123 2266 -8.33333333333333e+00 2123 2265 4.16666666666667e+00 2123 2417 -1.87500000000000e+01 2123 1948 2.08333333333333e+00 2123 2415 4.16666666666667e+00 2123 2126 -6.25000000000000e+00 2123 2125 -2.08333333333333e+00 2123 1897 2.08333333333333e+00 2123 2124 4.16666666666667e+00 2123 2115 -4.16666666666667e+00 2123 2419 -2.08333333333333e+00 2123 2121 -8.33333333333333e+00 2123 2262 -4.16666666666667e+00 2123 2274 4.16666666666667e+00 2123 2263 -4.16666666666667e+00 2123 2275 4.16666666666667e+00 2123 2420 -6.25000000000000e+00 2123 2418 4.16666666666667e+00 2123 1947 -4.16666666666667e+00 2123 2135 -1.87500000000000e+01 2123 2416 4.16666666666667e+00 2123 2117 -1.25000000000000e+01 2123 2134 4.16666666666667e+00 2123 2122 -8.33333333333333e+00 2123 2116 8.33333333333333e+00 2123 2133 4.16666666666667e+00 2123 1896 -4.16666666666667e+00 2124 2124 6.25000000000000e+01 2124 2125 -8.33333333333333e+00 2124 2138 -4.16666666666667e+00 2124 1897 -2.08333333333333e+00 2124 2137 2.08333333333333e+00 2124 2432 4.16666666666667e+00 2124 1954 -2.08333333333333e+00 2124 2430 -1.87500000000000e+01 2124 2416 2.08333333333333e+00 2124 1955 4.16666666666667e+00 2124 2417 -4.16666666666667e+00 2124 2126 -8.33333333333333e+00 2124 2123 4.16666666666667e+00 2124 1898 4.16666666666667e+00 2124 2122 4.16666666666667e+00 2124 2121 -1.87500000000000e+01 2124 2266 -4.16666666666667e+00 2124 2371 4.16666666666667e+00 2124 2372 4.16666666666667e+00 2124 2267 -4.16666666666667e+00 2124 1953 -6.25000000000000e+00 2124 2120 -4.16666666666667e+00 2124 2117 4.16666666666667e+00 2124 2119 8.33333333333333e+00 2124 2116 -8.33333333333333e+00 2124 2118 -1.25000000000000e+01 2124 2431 4.16666666666667e+00 2124 1896 -6.25000000000000e+00 2125 2125 6.25000000000000e+01 2125 2138 2.08333333333333e+00 2125 2430 4.16666666666667e+00 2125 2124 -8.33333333333333e+00 2125 1896 -2.08333333333333e+00 2125 2136 2.08333333333333e+00 2125 2431 -6.25000000000000e+00 2125 1953 -2.08333333333333e+00 2125 2415 2.08333333333333e+00 2125 2417 2.08333333333333e+00 2125 2123 -2.08333333333333e+00 2125 2122 -6.25000000000000e+00 2125 2121 4.16666666666667e+00 2125 2265 -4.16666666666667e+00 2125 2370 4.16666666666667e+00 2125 2267 -4.16666666666667e+00 2125 2117 4.16666666666667e+00 2125 2372 -8.33333333333333e+00 2125 1955 4.16666666666667e+00 2125 1954 -6.25000000000000e+00 2125 2120 8.33333333333333e+00 2125 2126 -8.33333333333333e+00 2125 1898 4.16666666666667e+00 2125 2119 -3.75000000000000e+01 2125 2432 -2.08333333333333e+00 2125 1897 -6.25000000000000e+00 2125 2118 8.33333333333333e+00 2125 2115 -8.33333333333333e+00 2126 2126 6.25000000000000e+01 2126 2137 2.08333333333333e+00 2126 2136 -4.16666666666667e+00 2126 2432 -6.25000000000000e+00 2126 2430 4.16666666666667e+00 2126 2416 2.08333333333333e+00 2126 1953 4.16666666666667e+00 2126 2415 -4.16666666666667e+00 2126 2123 -6.25000000000000e+00 2126 2122 -2.08333333333333e+00 2126 2124 -8.33333333333333e+00 2126 2121 4.16666666666667e+00 2126 1896 4.16666666666667e+00 2126 2266 -4.16666666666667e+00 2126 2116 4.16666666666667e+00 2126 1955 -1.87500000000000e+01 2126 2371 -8.33333333333333e+00 2126 1954 4.16666666666667e+00 2126 2370 4.16666666666667e+00 2126 2265 -4.16666666666667e+00 2126 2120 -1.25000000000000e+01 2126 2431 -2.08333333333333e+00 2126 1898 -1.87500000000000e+01 2126 2119 8.33333333333333e+00 2126 2125 -8.33333333333333e+00 2126 1897 4.16666666666667e+00 2126 2118 -4.16666666666667e+00 2126 2115 4.16666666666667e+00 2127 2127 6.25000000000000e+01 2127 2276 -8.33333333333333e+00 2127 2275 4.16666666666667e+00 2127 1967 2.08333333333333e+00 2127 2455 4.16666666666667e+00 2127 2454 -1.87500000000000e+01 2127 2135 -2.08333333333333e+00 2127 1898 2.08333333333333e+00 2127 2134 4.16666666666667e+00 2127 2133 -6.25000000000000e+00 2127 2270 -4.16666666666667e+00 2127 2269 -4.16666666666667e+00 2127 2273 4.16666666666667e+00 2127 2453 -2.08333333333333e+00 2127 2128 -8.33333333333333e+00 2127 2272 4.16666666666667e+00 2127 2116 -4.16666666666667e+00 2127 1966 -4.16666666666667e+00 2127 2452 4.16666666666667e+00 2127 2451 -6.25000000000000e+00 2127 2129 -8.33333333333333e+00 2127 2132 4.16666666666667e+00 2127 2117 8.33333333333333e+00 2127 2131 4.16666666666667e+00 2127 1897 -4.16666666666667e+00 2127 2456 4.16666666666667e+00 2127 2130 -1.87500000000000e+01 2127 2115 -1.25000000000000e+01 2128 2128 6.25000000000000e+01 2128 2276 4.16666666666667e+00 2128 2274 4.16666666666667e+00 2128 2455 -6.25000000000000e+00 2128 2454 4.16666666666667e+00 2128 2135 4.16666666666667e+00 2128 2129 -8.33333333333333e+00 2128 2134 -1.87500000000000e+01 2128 2133 4.16666666666667e+00 2128 2268 -4.16666666666667e+00 2128 2453 4.16666666666667e+00 2128 2127 -8.33333333333333e+00 2128 2273 -8.33333333333333e+00 2128 2117 8.33333333333333e+00 2128 2271 4.16666666666667e+00 2128 2115 -4.16666666666667e+00 2128 1967 2.08333333333333e+00 2128 2270 -4.16666666666667e+00 2128 2452 -1.87500000000000e+01 2128 1965 -4.16666666666667e+00 2128 2451 4.16666666666667e+00 2128 2132 -2.08333333333333e+00 2128 1898 2.08333333333333e+00 2128 2456 -2.08333333333333e+00 2128 2131 -6.25000000000000e+00 2128 2116 -1.25000000000000e+01 2128 2130 4.16666666666667e+00 2128 1896 -4.16666666666667e+00 2129 2129 6.25000000000000e+01 2129 2275 4.16666666666667e+00 2129 2454 4.16666666666667e+00 2129 2274 -8.33333333333333e+00 2129 2456 -6.25000000000000e+00 2129 1965 2.08333333333333e+00 2129 2135 -6.25000000000000e+00 2129 2134 4.16666666666667e+00 2129 2128 -8.33333333333333e+00 2129 2133 -2.08333333333333e+00 2129 1896 2.08333333333333e+00 2129 2268 -4.16666666666667e+00 2129 2452 4.16666666666667e+00 2129 2271 4.16666666666667e+00 2129 2451 -2.08333333333333e+00 2129 2272 -8.33333333333333e+00 2129 2116 8.33333333333333e+00 2129 2453 -6.25000000000000e+00 2129 1966 2.08333333333333e+00 2129 2269 -4.16666666666667e+00 2129 2455 -2.08333333333333e+00 2129 2132 -6.25000000000000e+00 2129 2117 -3.75000000000000e+01 2129 2131 -2.08333333333333e+00 2129 1897 2.08333333333333e+00 2129 2127 -8.33333333333333e+00 2129 2130 4.16666666666667e+00 2129 2115 8.33333333333333e+00 2130 2130 6.25000000000000e+01 2130 2468 4.16666666666667e+00 2130 1898 -2.08333333333333e+00 2130 2138 2.08333333333333e+00 2130 2137 -4.16666666666667e+00 2130 1973 -2.08333333333333e+00 2130 2467 4.16666666666667e+00 2130 2466 -1.87500000000000e+01 2130 2378 4.16666666666667e+00 2130 2377 4.16666666666667e+00 2130 2120 8.33333333333333e+00 2130 2119 -4.16666666666667e+00 2130 2118 -1.25000000000000e+01 2130 2273 -4.16666666666667e+00 2130 2453 2.08333333333333e+00 2130 2272 -4.16666666666667e+00 2130 2116 4.16666666666667e+00 2130 2452 -4.16666666666667e+00 2130 1972 4.16666666666667e+00 2130 1971 -6.25000000000000e+00 2130 2129 4.16666666666667e+00 2130 2117 -8.33333333333333e+00 2130 2128 4.16666666666667e+00 2130 2131 -8.33333333333333e+00 2130 1897 4.16666666666667e+00 2130 2127 -1.87500000000000e+01 2130 2132 -8.33333333333333e+00 2130 1896 -6.25000000000000e+00 2131 2131 6.25000000000000e+01 2131 2468 -2.08333333333333e+00 2131 2136 -4.16666666666667e+00 2131 2467 -6.25000000000000e+00 2131 2466 4.16666666666667e+00 2131 2378 -8.33333333333333e+00 2131 1973 4.16666666666667e+00 2131 2376 4.16666666666667e+00 2131 2120 8.33333333333333e+00 2131 2132 -8.33333333333333e+00 2131 1898 4.16666666666667e+00 2131 2119 -1.25000000000000e+01 2131 2118 -4.16666666666667e+00 2131 2271 -4.16666666666667e+00 2131 2115 4.16666666666667e+00 2131 2453 2.08333333333333e+00 2131 2273 -4.16666666666667e+00 2131 1972 -1.87500000000000e+01 2131 2451 -4.16666666666667e+00 2131 1971 4.16666666666667e+00 2131 2129 -2.08333333333333e+00 2131 2117 4.16666666666667e+00 2131 2128 -6.25000000000000e+00 2131 2138 2.08333333333333e+00 2131 1897 -1.87500000000000e+01 2131 2127 4.16666666666667e+00 2131 2130 -8.33333333333333e+00 2131 1896 4.16666666666667e+00 2132 2132 6.25000000000000e+01 2132 2467 -2.08333333333333e+00 2132 2130 -8.33333333333333e+00 2132 2466 4.16666666666667e+00 2132 1896 -2.08333333333333e+00 2132 2136 2.08333333333333e+00 2132 2468 -6.25000000000000e+00 2132 1971 -2.08333333333333e+00 2132 2376 4.16666666666667e+00 2132 2377 -8.33333333333333e+00 2132 1972 4.16666666666667e+00 2132 2120 -3.75000000000000e+01 2132 2119 8.33333333333333e+00 2132 2131 -8.33333333333333e+00 2132 1897 4.16666666666667e+00 2132 2118 8.33333333333333e+00 2132 2271 -4.16666666666667e+00 2132 2451 2.08333333333333e+00 2132 1973 -6.25000000000000e+00 2132 2452 2.08333333333333e+00 2132 2272 -4.16666666666667e+00 2132 2129 -6.25000000000000e+00 2132 2137 2.08333333333333e+00 2132 1898 -6.25000000000000e+00 2132 2128 -2.08333333333333e+00 2132 2116 4.16666666666667e+00 2132 2127 4.16666666666667e+00 2132 2115 -8.33333333333333e+00 2133 2133 3.75000000000000e+01 2133 2420 -4.16666666666667e+00 2133 2419 2.08333333333333e+00 2133 2135 -4.16666666666667e+00 2133 2123 4.16666666666667e+00 2133 1898 2.08333333333333e+00 2133 2122 -2.08333333333333e+00 2133 2121 -6.25000000000000e+00 2133 2275 -4.16666666666667e+00 2133 2116 4.16666666666667e+00 2133 2456 2.08333333333333e+00 2133 2276 -4.16666666666667e+00 2133 1978 2.08333333333333e+00 2133 2455 -4.16666666666667e+00 2133 1977 -1.25000000000000e+01 2133 2129 -2.08333333333333e+00 2133 2117 4.16666666666667e+00 2133 2134 -4.16666666666667e+00 2133 2128 4.16666666666667e+00 2133 1897 2.08333333333333e+00 2133 1979 2.08333333333333e+00 2133 2127 -6.25000000000000e+00 2133 1896 -1.25000000000000e+01 2134 2134 3.33333333333333e+01 2134 2418 2.08333333333333e+00 2134 2123 4.16666666666667e+00 2134 2122 -6.25000000000000e+00 2134 2121 -2.08333333333333e+00 2134 2456 2.08333333333333e+00 2134 2276 -4.16666666666667e+00 2134 2274 -4.16666666666667e+00 2134 2115 4.16666666666667e+00 2134 1978 -4.16666666666667e+00 2134 1977 2.08333333333333e+00 2134 2454 -4.16666666666667e+00 2134 2129 4.16666666666667e+00 2134 2117 -8.33333333333333e+00 2134 2420 2.08333333333333e+00 2134 2128 -1.87500000000000e+01 2134 1897 -4.16666666666667e+00 2134 2133 -4.16666666666667e+00 2134 2127 4.16666666666667e+00 2134 1896 2.08333333333333e+00 2135 2135 3.33333333333333e+01 2135 1977 2.08333333333333e+00 2135 2418 -4.16666666666667e+00 2135 2123 -1.87500000000000e+01 2135 2122 4.16666666666667e+00 2135 2133 -4.16666666666667e+00 2135 2121 4.16666666666667e+00 2135 1896 2.08333333333333e+00 2135 2455 2.08333333333333e+00 2135 2275 -4.16666666666667e+00 2135 1979 -4.16666666666667e+00 2135 2454 2.08333333333333e+00 2135 2274 -4.16666666666667e+00 2135 2419 2.08333333333333e+00 2135 2129 -6.25000000000000e+00 2135 1898 -4.16666666666667e+00 2135 2128 4.16666666666667e+00 2135 2116 -8.33333333333333e+00 2135 2127 -2.08333333333333e+00 2135 2115 4.16666666666667e+00 2136 2136 3.75000000000000e+01 2136 2126 -4.16666666666667e+00 2136 2125 2.08333333333333e+00 2136 2138 -4.16666666666667e+00 2136 2432 4.16666666666667e+00 2136 1982 2.08333333333333e+00 2136 2431 -2.08333333333333e+00 2136 2430 -6.25000000000000e+00 2136 2119 -4.16666666666667e+00 2136 2383 4.16666666666667e+00 2136 2132 2.08333333333333e+00 2136 2120 -4.16666666666667e+00 2136 1897 2.08333333333333e+00 2136 2131 -4.16666666666667e+00 2136 1896 -1.25000000000000e+01 2136 2468 -2.08333333333333e+00 2136 2384 4.16666666666667e+00 2136 2137 -4.16666666666667e+00 2136 2467 4.16666666666667e+00 2136 1981 2.08333333333333e+00 2136 1898 2.08333333333333e+00 2136 2466 -6.25000000000000e+00 2136 1980 -1.25000000000000e+01 2137 2137 3.33333333333333e+01 2137 2124 2.08333333333333e+00 2137 2432 4.16666666666667e+00 2137 2431 -6.25000000000000e+00 2137 2430 -2.08333333333333e+00 2137 2132 2.08333333333333e+00 2137 2120 -4.16666666666667e+00 2137 2118 -4.16666666666667e+00 2137 2382 4.16666666666667e+00 2137 1897 -4.16666666666667e+00 2137 1896 2.08333333333333e+00 2137 2130 -4.16666666666667e+00 2137 2468 4.16666666666667e+00 2137 2384 -8.33333333333333e+00 2137 2126 2.08333333333333e+00 2137 2467 -1.87500000000000e+01 2137 1981 -4.16666666666667e+00 2137 2136 -4.16666666666667e+00 2137 2466 4.16666666666667e+00 2137 1980 2.08333333333333e+00 2138 2138 3.33333333333333e+01 2138 1896 2.08333333333333e+00 2138 2124 -4.16666666666667e+00 2138 2432 -1.87500000000000e+01 2138 2431 4.16666666666667e+00 2138 2136 -4.16666666666667e+00 2138 2430 4.16666666666667e+00 2138 1980 2.08333333333333e+00 2138 2131 2.08333333333333e+00 2138 2119 -4.16666666666667e+00 2138 1898 -4.16666666666667e+00 2138 2130 2.08333333333333e+00 2138 2118 -4.16666666666667e+00 2138 2125 2.08333333333333e+00 2138 2468 -6.25000000000000e+00 2138 1982 -4.16666666666667e+00 2138 2467 4.16666666666667e+00 2138 2383 -8.33333333333333e+00 2138 2466 -2.08333333333333e+00 2138 2382 4.16666666666667e+00 2139 2139 1.25000000000000e+02 2139 2143 8.33333333333333e+00 2139 2142 -1.25000000000000e+01 2139 2390 -8.33333333333333e+00 2139 2389 4.16666666666667e+00 2139 2402 8.33333333333333e+00 2139 2149 4.16666666666667e+00 2139 2401 8.33333333333333e+00 2139 2400 -3.75000000000000e+01 2139 2150 4.16666666666667e+00 2139 2392 -4.16666666666667e+00 2139 2393 8.33333333333333e+00 2139 2141 -1.66666666666667e+01 2139 1940 -4.16666666666667e+00 2139 2391 -1.25000000000000e+01 2139 2387 4.16666666666667e+00 2139 2140 -1.66666666666667e+01 2139 2386 4.16666666666667e+00 2139 1939 -4.16666666666667e+00 2139 2399 -4.16666666666667e+00 2139 2396 4.16666666666667e+00 2139 2146 -4.16666666666667e+00 2139 2395 -8.33333333333333e+00 2139 2398 8.33333333333333e+00 2139 2397 -1.25000000000000e+01 2139 2147 8.33333333333333e+00 2139 2145 -1.25000000000000e+01 2139 2144 -4.16666666666667e+00 2139 1508 4.16666666666667e+00 2139 1295 -4.16666666666667e+00 2139 1507 -8.33333333333333e+00 2139 1504 8.33333333333333e+00 2139 1505 8.33333333333333e+00 2139 1294 -4.16666666666667e+00 2139 1503 -3.75000000000000e+01 2139 1510 4.16666666666667e+00 2139 1511 -8.33333333333333e+00 2140 2140 1.25000000000000e+02 2140 2142 8.33333333333333e+00 2140 2144 8.33333333333333e+00 2140 2143 -3.75000000000000e+01 2140 2388 4.16666666666667e+00 2140 2402 -4.16666666666667e+00 2140 2148 4.16666666666667e+00 2140 2401 -1.25000000000000e+01 2140 2400 8.33333333333333e+00 2140 2150 -8.33333333333333e+00 2140 2391 -4.16666666666667e+00 2140 2393 8.33333333333333e+00 2140 2392 -1.25000000000000e+01 2140 2139 -1.66666666666667e+01 2140 2387 -8.33333333333333e+00 2140 2385 4.16666666666667e+00 2140 1938 -4.16666666666667e+00 2140 2399 8.33333333333333e+00 2140 2141 -1.66666666666667e+01 2140 2147 8.33333333333333e+00 2140 2145 -4.16666666666667e+00 2140 2396 4.16666666666667e+00 2140 1940 -4.16666666666667e+00 2140 2398 -3.75000000000000e+01 2140 2394 -8.33333333333333e+00 2140 2397 8.33333333333333e+00 2140 2146 -1.25000000000000e+01 2140 2390 4.16666666666667e+00 2140 1508 4.16666666666667e+00 2140 1506 -8.33333333333333e+00 2140 1505 -4.16666666666667e+00 2140 1503 8.33333333333333e+00 2140 1504 -1.25000000000000e+01 2140 1293 -4.16666666666667e+00 2140 1509 4.16666666666667e+00 2140 1511 4.16666666666667e+00 2140 1295 -4.16666666666667e+00 2141 2141 1.25000000000000e+02 2141 2389 4.16666666666667e+00 2141 2144 -1.25000000000000e+01 2141 2143 8.33333333333333e+00 2141 2388 -8.33333333333333e+00 2141 2401 -4.16666666666667e+00 2141 2400 8.33333333333333e+00 2141 2402 -1.25000000000000e+01 2141 2149 -8.33333333333333e+00 2141 2148 4.16666666666667e+00 2141 2391 8.33333333333333e+00 2141 2139 -1.66666666666667e+01 2141 2393 -3.75000000000000e+01 2141 2392 8.33333333333333e+00 2141 1938 -4.16666666666667e+00 2141 2385 4.16666666666667e+00 2141 2386 -8.33333333333333e+00 2141 2397 -4.16666666666667e+00 2141 2394 4.16666666666667e+00 2141 2398 8.33333333333333e+00 2141 2140 -1.66666666666667e+01 2141 2146 8.33333333333333e+00 2141 2399 -1.25000000000000e+01 2141 2395 4.16666666666667e+00 2141 1939 -4.16666666666667e+00 2141 2147 -3.75000000000000e+01 2141 2142 -4.16666666666667e+00 2141 2145 8.33333333333333e+00 2141 1507 4.16666666666667e+00 2141 1506 4.16666666666667e+00 2141 1293 -4.16666666666667e+00 2141 1504 -4.16666666666667e+00 2141 1505 -1.25000000000000e+01 2141 1503 8.33333333333333e+00 2141 1510 4.16666666666667e+00 2141 1294 -4.16666666666667e+00 2141 1509 -8.33333333333333e+00 2142 2142 6.25000000000000e+01 2142 2392 4.16666666666667e+00 2142 2393 4.16666666666667e+00 2142 2435 4.16666666666667e+00 2142 2433 -6.25000000000000e+00 2142 2143 -8.33333333333333e+00 2142 2141 -4.16666666666667e+00 2142 2144 -8.33333333333333e+00 2142 2390 -4.16666666666667e+00 2142 2402 4.16666666666667e+00 2142 2437 4.16666666666667e+00 2142 2140 8.33333333333333e+00 2142 2401 -8.33333333333333e+00 2142 2438 4.16666666666667e+00 2142 1958 -4.16666666666667e+00 2142 1957 2.08333333333333e+00 2142 2389 -4.16666666666667e+00 2142 2436 -1.87500000000000e+01 2142 2150 4.16666666666667e+00 2142 2149 -2.08333333333333e+00 2142 2148 -6.25000000000000e+00 2142 2434 -2.08333333333333e+00 2142 2139 -1.25000000000000e+01 2142 1508 4.16666666666667e+00 2142 1507 4.16666666666667e+00 2142 1506 -1.87500000000000e+01 2142 1295 -4.16666666666667e+00 2142 1294 2.08333333333333e+00 2143 2143 6.25000000000000e+01 2143 2433 -2.08333333333333e+00 2143 2391 4.16666666666667e+00 2143 2393 -8.33333333333333e+00 2143 1958 2.08333333333333e+00 2143 2434 -6.25000000000000e+00 2143 2142 -8.33333333333333e+00 2143 2438 -2.08333333333333e+00 2143 2436 4.16666666666667e+00 2143 2390 -4.16666666666667e+00 2143 2402 4.16666666666667e+00 2143 2139 8.33333333333333e+00 2143 2400 -8.33333333333333e+00 2143 2437 -6.25000000000000e+00 2143 1956 2.08333333333333e+00 2143 2388 -4.16666666666667e+00 2143 2150 4.16666666666667e+00 2143 2144 -8.33333333333333e+00 2143 2141 8.33333333333333e+00 2143 2149 -6.25000000000000e+00 2143 2435 4.16666666666667e+00 2143 2140 -3.75000000000000e+01 2143 2148 -2.08333333333333e+00 2143 1508 -2.08333333333333e+00 2143 1295 2.08333333333333e+00 2143 1507 -6.25000000000000e+00 2143 1506 4.16666666666667e+00 2143 1293 2.08333333333333e+00 2144 2144 6.25000000000000e+01 2144 2392 -8.33333333333333e+00 2144 2391 4.16666666666667e+00 2144 2435 -1.87500000000000e+01 2144 1957 2.08333333333333e+00 2144 2433 4.16666666666667e+00 2144 2139 -4.16666666666667e+00 2144 2437 -2.08333333333333e+00 2144 2142 -8.33333333333333e+00 2144 2388 -4.16666666666667e+00 2144 2400 4.16666666666667e+00 2144 2389 -4.16666666666667e+00 2144 2401 4.16666666666667e+00 2144 2438 -6.25000000000000e+00 2144 2436 4.16666666666667e+00 2144 1956 -4.16666666666667e+00 2144 2150 -1.87500000000000e+01 2144 2434 4.16666666666667e+00 2144 2141 -1.25000000000000e+01 2144 2149 4.16666666666667e+00 2144 2143 -8.33333333333333e+00 2144 2140 8.33333333333333e+00 2144 2148 4.16666666666667e+00 2144 1508 -6.25000000000000e+00 2144 1507 -2.08333333333333e+00 2144 1294 2.08333333333333e+00 2144 1506 4.16666666666667e+00 2144 1293 -4.16666666666667e+00 2145 2145 6.25000000000000e+01 2145 2402 -8.33333333333333e+00 2145 2401 4.16666666666667e+00 2145 1976 2.08333333333333e+00 2145 2473 4.16666666666667e+00 2145 2472 -1.87500000000000e+01 2145 2150 -2.08333333333333e+00 2145 2149 4.16666666666667e+00 2145 2148 -6.25000000000000e+00 2145 2396 -4.16666666666667e+00 2145 2395 -4.16666666666667e+00 2145 2399 4.16666666666667e+00 2145 2471 -2.08333333333333e+00 2145 2146 -8.33333333333333e+00 2145 2398 4.16666666666667e+00 2145 2140 -4.16666666666667e+00 2145 1975 -4.16666666666667e+00 2145 2470 4.16666666666667e+00 2145 2469 -6.25000000000000e+00 2145 2147 -8.33333333333333e+00 2145 2141 8.33333333333333e+00 2145 2474 4.16666666666667e+00 2145 2139 -1.25000000000000e+01 2145 1295 2.08333333333333e+00 2145 1511 4.16666666666667e+00 2145 1510 4.16666666666667e+00 2145 1294 -4.16666666666667e+00 2145 1509 -1.87500000000000e+01 2146 2146 6.25000000000000e+01 2146 2402 4.16666666666667e+00 2146 2400 4.16666666666667e+00 2146 2473 -6.25000000000000e+00 2146 2472 4.16666666666667e+00 2146 2150 4.16666666666667e+00 2146 2147 -8.33333333333333e+00 2146 2149 -1.87500000000000e+01 2146 2148 4.16666666666667e+00 2146 2394 -4.16666666666667e+00 2146 2471 4.16666666666667e+00 2146 2145 -8.33333333333333e+00 2146 2399 -8.33333333333333e+00 2146 2141 8.33333333333333e+00 2146 2397 4.16666666666667e+00 2146 2139 -4.16666666666667e+00 2146 1976 2.08333333333333e+00 2146 2396 -4.16666666666667e+00 2146 2470 -1.87500000000000e+01 2146 1974 -4.16666666666667e+00 2146 2469 4.16666666666667e+00 2146 2474 -2.08333333333333e+00 2146 2140 -1.25000000000000e+01 2146 1511 -2.08333333333333e+00 2146 1295 2.08333333333333e+00 2146 1510 -6.25000000000000e+00 2146 1509 4.16666666666667e+00 2146 1293 -4.16666666666667e+00 2147 2147 6.25000000000000e+01 2147 2401 4.16666666666667e+00 2147 2472 4.16666666666667e+00 2147 2400 -8.33333333333333e+00 2147 2474 -6.25000000000000e+00 2147 1974 2.08333333333333e+00 2147 2150 -6.25000000000000e+00 2147 2149 4.16666666666667e+00 2147 2146 -8.33333333333333e+00 2147 2148 -2.08333333333333e+00 2147 2394 -4.16666666666667e+00 2147 2470 4.16666666666667e+00 2147 2397 4.16666666666667e+00 2147 2469 -2.08333333333333e+00 2147 2398 -8.33333333333333e+00 2147 2140 8.33333333333333e+00 2147 2471 -6.25000000000000e+00 2147 1975 2.08333333333333e+00 2147 2395 -4.16666666666667e+00 2147 2473 -2.08333333333333e+00 2147 2141 -3.75000000000000e+01 2147 2145 -8.33333333333333e+00 2147 2139 8.33333333333333e+00 2147 1293 2.08333333333333e+00 2147 1511 -6.25000000000000e+00 2147 1510 -2.08333333333333e+00 2147 1294 2.08333333333333e+00 2147 1509 4.16666666666667e+00 2148 2148 3.75000000000000e+01 2148 2438 -4.16666666666667e+00 2148 2437 2.08333333333333e+00 2148 2150 -4.16666666666667e+00 2148 2144 4.16666666666667e+00 2148 2143 -2.08333333333333e+00 2148 2142 -6.25000000000000e+00 2148 2401 -4.16666666666667e+00 2148 2140 4.16666666666667e+00 2148 2474 2.08333333333333e+00 2148 2402 -4.16666666666667e+00 2148 1981 2.08333333333333e+00 2148 2473 -4.16666666666667e+00 2148 1980 -1.25000000000000e+01 2148 2147 -2.08333333333333e+00 2148 2141 4.16666666666667e+00 2148 2149 -4.16666666666667e+00 2148 2146 4.16666666666667e+00 2148 1982 2.08333333333333e+00 2148 2145 -6.25000000000000e+00 2148 1295 2.08333333333333e+00 2148 1294 2.08333333333333e+00 2148 1293 -1.25000000000000e+01 2149 2149 3.33333333333333e+01 2149 2436 2.08333333333333e+00 2149 2144 4.16666666666667e+00 2149 2143 -6.25000000000000e+00 2149 2142 -2.08333333333333e+00 2149 2474 2.08333333333333e+00 2149 2402 -4.16666666666667e+00 2149 2400 -4.16666666666667e+00 2149 2139 4.16666666666667e+00 2149 1981 -4.16666666666667e+00 2149 1980 2.08333333333333e+00 2149 2472 -4.16666666666667e+00 2149 2147 4.16666666666667e+00 2149 2141 -8.33333333333333e+00 2149 2438 2.08333333333333e+00 2149 2146 -1.87500000000000e+01 2149 2148 -4.16666666666667e+00 2149 2145 4.16666666666667e+00 2149 1294 -4.16666666666667e+00 2149 1293 2.08333333333333e+00 2150 2150 3.33333333333333e+01 2150 1980 2.08333333333333e+00 2150 2436 -4.16666666666667e+00 2150 2144 -1.87500000000000e+01 2150 2143 4.16666666666667e+00 2150 2148 -4.16666666666667e+00 2150 2142 4.16666666666667e+00 2150 2473 2.08333333333333e+00 2150 2401 -4.16666666666667e+00 2150 1982 -4.16666666666667e+00 2150 2472 2.08333333333333e+00 2150 2400 -4.16666666666667e+00 2150 2437 2.08333333333333e+00 2150 2147 -6.25000000000000e+00 2150 2146 4.16666666666667e+00 2150 2140 -8.33333333333333e+00 2150 2145 -2.08333333333333e+00 2150 2139 4.16666666666667e+00 2150 1293 2.08333333333333e+00 2150 1295 -4.16666666666667e+00 2151 2151 6.25000000000000e+01 2151 2195 -4.16666666666667e+00 2151 2167 4.16666666666667e+00 2151 2194 -4.16666666666667e+00 2151 2191 -4.16666666666667e+00 2151 2162 4.16666666666667e+00 2151 2168 -8.33333333333333e+00 2151 2161 4.16666666666667e+00 2151 2160 -1.87500000000000e+01 2151 1991 4.16666666666667e+00 2151 2153 -8.33333333333333e+00 2151 2159 8.33333333333333e+00 2151 2188 4.16666666666667e+00 2151 2158 -4.16666666666667e+00 2151 1901 -2.08333333333333e+00 2151 1985 2.08333333333333e+00 2151 1900 4.16666666666667e+00 2151 1984 -4.16666666666667e+00 2151 1899 -6.25000000000000e+00 2151 2157 -1.25000000000000e+01 2151 1907 -2.08333333333333e+00 2151 2189 4.16666666666667e+00 2151 2152 -8.33333333333333e+00 2151 1906 4.16666666666667e+00 2151 1990 4.16666666666667e+00 2151 2192 2.08333333333333e+00 2151 1905 -6.25000000000000e+00 2151 1989 -1.87500000000000e+01 2152 2152 6.25000000000000e+01 2152 2193 -4.16666666666667e+00 2152 2192 2.08333333333333e+00 2152 2195 -4.16666666666667e+00 2152 2190 -4.16666666666667e+00 2152 2162 -2.08333333333333e+00 2152 2168 4.16666666666667e+00 2152 2161 -6.25000000000000e+00 2152 2160 4.16666666666667e+00 2152 1991 -2.08333333333333e+00 2152 1985 2.08333333333333e+00 2152 2187 4.16666666666667e+00 2152 2157 -4.16666666666667e+00 2152 1901 4.16666666666667e+00 2152 2153 -8.33333333333333e+00 2152 2159 8.33333333333333e+00 2152 1900 -1.87500000000000e+01 2152 2158 -1.25000000000000e+01 2152 1899 4.16666666666667e+00 2152 1983 -4.16666666666667e+00 2152 1907 4.16666666666667e+00 2152 2189 -8.33333333333333e+00 2152 2166 4.16666666666667e+00 2152 1906 -1.87500000000000e+01 2152 1990 -6.25000000000000e+00 2152 2151 -8.33333333333333e+00 2152 1905 4.16666666666667e+00 2152 1989 4.16666666666667e+00 2153 2153 6.25000000000000e+01 2153 2193 -4.16666666666667e+00 2153 2191 2.08333333333333e+00 2153 2194 -4.16666666666667e+00 2153 2162 -6.25000000000000e+00 2153 2161 -2.08333333333333e+00 2153 2167 4.16666666666667e+00 2153 2160 4.16666666666667e+00 2153 2166 -8.33333333333333e+00 2153 1990 -2.08333333333333e+00 2153 1984 2.08333333333333e+00 2153 1989 4.16666666666667e+00 2153 2151 -8.33333333333333e+00 2153 2157 8.33333333333333e+00 2153 1901 -6.25000000000000e+00 2153 2159 -3.75000000000000e+01 2153 1900 4.16666666666667e+00 2153 2152 -8.33333333333333e+00 2153 2158 8.33333333333333e+00 2153 1899 -2.08333333333333e+00 2153 1983 2.08333333333333e+00 2153 2190 2.08333333333333e+00 2153 1907 -6.25000000000000e+00 2153 1991 -6.25000000000000e+00 2153 1906 4.16666666666667e+00 2153 2188 -8.33333333333333e+00 2153 1905 -2.08333333333333e+00 2153 2187 4.16666666666667e+00 2154 2154 6.25000000000000e+01 2154 2165 4.16666666666667e+00 2154 2164 4.16666666666667e+00 2154 2163 -1.87500000000000e+01 2154 2228 -4.16666666666667e+00 2154 2230 -4.16666666666667e+00 2154 2168 4.16666666666667e+00 2154 2167 -8.33333333333333e+00 2154 2231 -4.16666666666667e+00 2154 2225 4.16666666666667e+00 2154 2159 -4.16666666666667e+00 2154 2155 -8.33333333333333e+00 2154 2158 8.33333333333333e+00 2154 1996 4.16666666666667e+00 2154 1901 4.16666666666667e+00 2154 1985 -4.16666666666667e+00 2154 1900 -2.08333333333333e+00 2154 1984 2.08333333333333e+00 2154 1899 -6.25000000000000e+00 2154 2157 -1.25000000000000e+01 2154 2156 -8.33333333333333e+00 2154 1913 4.16666666666667e+00 2154 1997 4.16666666666667e+00 2154 1912 -2.08333333333333e+00 2154 2224 4.16666666666667e+00 2154 2227 2.08333333333333e+00 2154 1911 -6.25000000000000e+00 2154 1995 -1.87500000000000e+01 2155 2155 6.25000000000000e+01 2155 2165 -2.08333333333333e+00 2155 2164 -6.25000000000000e+00 2155 2163 4.16666666666667e+00 2155 2228 2.08333333333333e+00 2155 2168 4.16666666666667e+00 2155 2231 -4.16666666666667e+00 2155 2229 -4.16666666666667e+00 2155 2166 -8.33333333333333e+00 2155 1985 2.08333333333333e+00 2155 1997 -2.08333333333333e+00 2155 2154 -8.33333333333333e+00 2155 2157 8.33333333333333e+00 2155 1995 4.16666666666667e+00 2155 1901 4.16666666666667e+00 2155 2156 -8.33333333333333e+00 2155 2159 8.33333333333333e+00 2155 1900 -6.25000000000000e+00 2155 2158 -3.75000000000000e+01 2155 1899 -2.08333333333333e+00 2155 1983 2.08333333333333e+00 2155 1913 4.16666666666667e+00 2155 2225 -8.33333333333333e+00 2155 2226 2.08333333333333e+00 2155 1912 -6.25000000000000e+00 2155 1996 -6.25000000000000e+00 2155 1911 -2.08333333333333e+00 2155 2223 4.16666666666667e+00 2156 2156 6.25000000000000e+01 2156 2164 -2.08333333333333e+00 2156 2163 4.16666666666667e+00 2156 2227 2.08333333333333e+00 2156 2226 -4.16666666666667e+00 2156 2167 4.16666666666667e+00 2156 2230 -4.16666666666667e+00 2156 2166 4.16666666666667e+00 2156 2229 -4.16666666666667e+00 2156 2223 4.16666666666667e+00 2156 2157 -4.16666666666667e+00 2156 1984 2.08333333333333e+00 2156 1996 -2.08333333333333e+00 2156 1901 -1.87500000000000e+01 2156 2159 -1.25000000000000e+01 2156 1900 4.16666666666667e+00 2156 2155 -8.33333333333333e+00 2156 2158 8.33333333333333e+00 2156 1899 4.16666666666667e+00 2156 1983 -4.16666666666667e+00 2156 2165 -6.25000000000000e+00 2156 1913 -1.87500000000000e+01 2156 1997 -6.25000000000000e+00 2156 1912 4.16666666666667e+00 2156 2224 -8.33333333333333e+00 2156 2154 -8.33333333333333e+00 2156 1911 4.16666666666667e+00 2156 1995 4.16666666666667e+00 2157 2157 1.25000000000000e+02 2157 2194 -8.33333333333333e+00 2157 2153 8.33333333333333e+00 2157 1990 4.16666666666667e+00 2157 2152 -4.16666666666667e+00 2157 1991 -8.33333333333333e+00 2157 2151 -1.25000000000000e+01 2157 2189 -4.16666666666667e+00 2157 2188 8.33333333333333e+00 2157 2187 -1.25000000000000e+01 2157 2260 -4.16666666666667e+00 2157 2168 8.33333333333333e+00 2157 2231 -8.33333333333333e+00 2157 2230 4.16666666666667e+00 2157 1901 4.16666666666667e+00 2157 2167 8.33333333333333e+00 2157 2158 -1.66666666666667e+01 2157 2166 -3.75000000000000e+01 2157 2261 -4.16666666666667e+00 2157 1919 4.16666666666667e+00 2157 2156 -4.16666666666667e+00 2157 2155 8.33333333333333e+00 2157 1985 -4.16666666666667e+00 2157 1997 4.16666666666667e+00 2157 2002 8.33333333333333e+00 2157 1996 -8.33333333333333e+00 2157 1900 4.16666666666667e+00 2157 1984 -4.16666666666667e+00 2157 2154 -1.25000000000000e+01 2157 2159 -1.66666666666667e+01 2157 2225 8.33333333333333e+00 2157 2003 8.33333333333333e+00 2157 2224 -4.16666666666667e+00 2157 1918 4.16666666666667e+00 2157 2195 4.16666666666667e+00 2157 2223 -1.25000000000000e+01 2157 2001 -3.75000000000000e+01 2158 2158 1.25000000000000e+02 2158 2193 -8.33333333333333e+00 2158 1989 4.16666666666667e+00 2158 2151 -4.16666666666667e+00 2158 1991 4.16666666666667e+00 2158 2153 8.33333333333333e+00 2158 2152 -1.25000000000000e+01 2158 2189 8.33333333333333e+00 2158 2188 -3.75000000000000e+01 2158 2187 8.33333333333333e+00 2158 2261 -4.16666666666667e+00 2158 2259 -4.16666666666667e+00 2158 2168 -4.16666666666667e+00 2158 2231 4.16666666666667e+00 2158 2229 4.16666666666667e+00 2158 2167 -1.25000000000000e+01 2158 2166 8.33333333333333e+00 2158 2157 -1.66666666666667e+01 2158 2003 -4.16666666666667e+00 2158 2159 -1.66666666666667e+01 2158 1985 -4.16666666666667e+00 2158 1997 4.16666666666667e+00 2158 2154 8.33333333333333e+00 2158 2001 8.33333333333333e+00 2158 1995 -8.33333333333333e+00 2158 1901 -8.33333333333333e+00 2158 2156 8.33333333333333e+00 2158 2155 -3.75000000000000e+01 2158 1899 4.16666666666667e+00 2158 1983 -4.16666666666667e+00 2158 2225 8.33333333333333e+00 2158 1919 -8.33333333333333e+00 2158 2195 4.16666666666667e+00 2158 2224 -1.25000000000000e+01 2158 2002 -1.25000000000000e+01 2158 2223 -4.16666666666667e+00 2158 1917 4.16666666666667e+00 2159 2159 1.25000000000000e+02 2159 2193 4.16666666666667e+00 2159 2151 8.33333333333333e+00 2159 1990 4.16666666666667e+00 2159 1989 -8.33333333333333e+00 2159 2153 -3.75000000000000e+01 2159 2152 8.33333333333333e+00 2159 2189 -1.25000000000000e+01 2159 2188 8.33333333333333e+00 2159 2187 -4.16666666666667e+00 2159 2260 -4.16666666666667e+00 2159 2167 -4.16666666666667e+00 2159 2230 4.16666666666667e+00 2159 2166 8.33333333333333e+00 2159 2229 -8.33333333333333e+00 2159 2168 -1.25000000000000e+01 2159 1899 4.16666666666667e+00 2159 2259 -4.16666666666667e+00 2159 1917 4.16666666666667e+00 2159 2002 -4.16666666666667e+00 2159 2158 -1.66666666666667e+01 2159 2154 -4.16666666666667e+00 2159 1984 -4.16666666666667e+00 2159 1996 4.16666666666667e+00 2159 1983 -4.16666666666667e+00 2159 1995 4.16666666666667e+00 2159 2156 -1.25000000000000e+01 2159 1900 -8.33333333333333e+00 2159 2155 8.33333333333333e+00 2159 2194 4.16666666666667e+00 2159 2225 -3.75000000000000e+01 2159 2003 -1.25000000000000e+01 2159 2224 8.33333333333333e+00 2159 1918 -8.33333333333333e+00 2159 2157 -1.66666666666667e+01 2159 2223 8.33333333333333e+00 2159 2001 8.33333333333333e+00 2160 2160 6.25000000000000e+01 2160 2194 4.16666666666667e+00 2160 2195 4.16666666666667e+00 2160 2153 4.16666666666667e+00 2160 2162 -8.33333333333333e+00 2160 2152 4.16666666666667e+00 2160 2151 -1.87500000000000e+01 2160 2191 4.16666666666667e+00 2160 2190 -6.25000000000000e+00 2160 2167 -4.16666666666667e+00 2160 2161 -8.33333333333333e+00 2160 2012 4.16666666666667e+00 2160 2299 -4.16666666666667e+00 2160 2023 4.16666666666667e+00 2160 2168 8.33333333333333e+00 2160 2024 -8.33333333333333e+00 2160 1925 2.08333333333333e+00 2160 2300 -4.16666666666667e+00 2160 2011 4.16666666666667e+00 2160 1924 -4.16666666666667e+00 2160 2010 -1.87500000000000e+01 2160 2006 -2.08333333333333e+00 2160 1901 2.08333333333333e+00 2160 2005 4.16666666666667e+00 2160 1900 -4.16666666666667e+00 2160 2004 -6.25000000000000e+00 2160 2192 -2.08333333333333e+00 2160 2166 -1.25000000000000e+01 2161 2161 6.25000000000000e+01 2161 2193 4.16666666666667e+00 2161 2195 -8.33333333333333e+00 2161 2153 -2.08333333333333e+00 2161 1901 2.08333333333333e+00 2161 2152 -6.25000000000000e+00 2161 2151 4.16666666666667e+00 2161 1925 2.08333333333333e+00 2161 2191 -1.87500000000000e+01 2161 2190 4.16666666666667e+00 2161 2166 -4.16666666666667e+00 2161 2012 -2.08333333333333e+00 2161 2160 -8.33333333333333e+00 2161 2298 -4.16666666666667e+00 2161 2022 4.16666666666667e+00 2161 2300 -4.16666666666667e+00 2161 2024 4.16666666666667e+00 2161 2011 -6.25000000000000e+00 2161 2010 4.16666666666667e+00 2161 1923 -4.16666666666667e+00 2161 2006 4.16666666666667e+00 2161 2162 -8.33333333333333e+00 2161 2168 8.33333333333333e+00 2161 2005 -1.87500000000000e+01 2161 2192 4.16666666666667e+00 2161 2167 -1.25000000000000e+01 2161 2004 4.16666666666667e+00 2161 1899 -4.16666666666667e+00 2162 2162 6.25000000000000e+01 2162 2190 -2.08333333333333e+00 2162 2194 -8.33333333333333e+00 2162 2193 4.16666666666667e+00 2162 2153 -6.25000000000000e+00 2162 2152 -2.08333333333333e+00 2162 1900 2.08333333333333e+00 2162 2151 4.16666666666667e+00 2162 2160 -8.33333333333333e+00 2162 2192 -6.25000000000000e+00 2162 1924 2.08333333333333e+00 2162 2011 -2.08333333333333e+00 2162 2010 4.16666666666667e+00 2162 2299 -4.16666666666667e+00 2162 2023 4.16666666666667e+00 2162 2166 8.33333333333333e+00 2162 2022 -8.33333333333333e+00 2162 2012 -6.25000000000000e+00 2162 1923 2.08333333333333e+00 2162 2298 -4.16666666666667e+00 2162 2006 -6.25000000000000e+00 2162 2191 4.16666666666667e+00 2162 2168 -3.75000000000000e+01 2162 2005 4.16666666666667e+00 2162 2161 -8.33333333333333e+00 2162 2167 8.33333333333333e+00 2162 2004 -2.08333333333333e+00 2162 1899 2.08333333333333e+00 2163 2163 6.25000000000000e+01 2163 2227 -2.08333333333333e+00 2163 2230 4.16666666666667e+00 2163 2228 4.16666666666667e+00 2163 2226 -6.25000000000000e+00 2163 2156 4.16666666666667e+00 2163 2164 -8.33333333333333e+00 2163 2155 4.16666666666667e+00 2163 2154 -1.87500000000000e+01 2163 2336 -4.16666666666667e+00 2163 2165 -8.33333333333333e+00 2163 2017 4.16666666666667e+00 2163 2024 4.16666666666667e+00 2163 2168 -4.16666666666667e+00 2163 2023 -8.33333333333333e+00 2163 2167 8.33333333333333e+00 2163 2018 4.16666666666667e+00 2163 1931 -4.16666666666667e+00 2163 1930 2.08333333333333e+00 2163 2335 -4.16666666666667e+00 2163 2016 -1.87500000000000e+01 2163 2006 4.16666666666667e+00 2163 1901 -4.16666666666667e+00 2163 2005 -2.08333333333333e+00 2163 1900 2.08333333333333e+00 2163 2004 -6.25000000000000e+00 2163 2231 4.16666666666667e+00 2163 2166 -1.25000000000000e+01 2164 2164 6.25000000000000e+01 2164 2231 -8.33333333333333e+00 2164 2226 -2.08333333333333e+00 2164 2229 4.16666666666667e+00 2164 1931 2.08333333333333e+00 2164 2227 -6.25000000000000e+00 2164 1901 2.08333333333333e+00 2164 2156 -2.08333333333333e+00 2164 2155 -6.25000000000000e+00 2164 2163 -8.33333333333333e+00 2164 2154 4.16666666666667e+00 2164 2336 -4.16666666666667e+00 2164 2018 -2.08333333333333e+00 2164 2024 4.16666666666667e+00 2164 2016 4.16666666666667e+00 2164 2022 -8.33333333333333e+00 2164 2166 8.33333333333333e+00 2164 2017 -6.25000000000000e+00 2164 1929 2.08333333333333e+00 2164 2334 -4.16666666666667e+00 2164 2006 4.16666666666667e+00 2164 2165 -8.33333333333333e+00 2164 2168 8.33333333333333e+00 2164 2005 -6.25000000000000e+00 2164 2228 4.16666666666667e+00 2164 2167 -3.75000000000000e+01 2164 2004 -2.08333333333333e+00 2164 1899 2.08333333333333e+00 2165 2165 6.25000000000000e+01 2165 2227 4.16666666666667e+00 2165 2230 -8.33333333333333e+00 2165 2228 -1.87500000000000e+01 2165 1930 2.08333333333333e+00 2165 2226 4.16666666666667e+00 2165 2156 -6.25000000000000e+00 2165 1900 2.08333333333333e+00 2165 2155 -2.08333333333333e+00 2165 2154 4.16666666666667e+00 2165 2335 -4.16666666666667e+00 2165 2334 -4.16666666666667e+00 2165 2017 -2.08333333333333e+00 2165 2023 4.16666666666667e+00 2165 2163 -8.33333333333333e+00 2165 2022 4.16666666666667e+00 2165 2166 -4.16666666666667e+00 2165 2018 -6.25000000000000e+00 2165 2016 4.16666666666667e+00 2165 1929 -4.16666666666667e+00 2165 2006 -1.87500000000000e+01 2165 2229 4.16666666666667e+00 2165 2168 -1.25000000000000e+01 2165 2005 4.16666666666667e+00 2165 2164 -8.33333333333333e+00 2165 2167 8.33333333333333e+00 2165 2004 4.16666666666667e+00 2165 1899 -4.16666666666667e+00 2166 2166 1.25000000000000e+02 2166 2195 -4.16666666666667e+00 2166 2153 -8.33333333333333e+00 2166 2194 8.33333333333333e+00 2166 2193 -1.25000000000000e+01 2166 2161 -4.16666666666667e+00 2166 2162 8.33333333333333e+00 2166 2160 -1.25000000000000e+01 2166 2300 4.16666666666667e+00 2166 2299 -8.33333333333333e+00 2166 2260 4.16666666666667e+00 2166 2230 -4.16666666666667e+00 2166 2168 -1.66666666666667e+01 2166 2159 8.33333333333333e+00 2166 2231 8.33333333333333e+00 2166 1901 -4.16666666666667e+00 2166 2156 4.16666666666667e+00 2166 2158 8.33333333333333e+00 2166 2155 -8.33333333333333e+00 2166 2157 -3.75000000000000e+01 2166 1937 -4.16666666666667e+00 2166 2261 4.16666666666667e+00 2166 2229 -1.25000000000000e+01 2166 2006 4.16666666666667e+00 2166 2165 -4.16666666666667e+00 2166 2023 8.33333333333333e+00 2166 2167 -1.66666666666667e+01 2166 2164 8.33333333333333e+00 2166 2024 8.33333333333333e+00 2166 2336 -8.33333333333333e+00 2166 2335 4.16666666666667e+00 2166 1936 -4.16666666666667e+00 2166 2022 -3.75000000000000e+01 2166 2005 4.16666666666667e+00 2166 1900 -4.16666666666667e+00 2166 2163 -1.25000000000000e+01 2166 2152 4.16666666666667e+00 2167 2167 1.25000000000000e+02 2167 2195 8.33333333333333e+00 2167 2153 4.16666666666667e+00 2167 2194 -3.75000000000000e+01 2167 2193 8.33333333333333e+00 2167 2160 -4.16666666666667e+00 2167 2300 4.16666666666667e+00 2167 2162 8.33333333333333e+00 2167 2161 -1.25000000000000e+01 2167 2298 -8.33333333333333e+00 2167 2168 -1.66666666666667e+01 2167 1937 -4.16666666666667e+00 2167 1901 -4.16666666666667e+00 2167 2259 4.16666666666667e+00 2167 2229 -4.16666666666667e+00 2167 2159 -4.16666666666667e+00 2167 2156 4.16666666666667e+00 2167 2158 -1.25000000000000e+01 2167 2157 8.33333333333333e+00 2167 2154 -8.33333333333333e+00 2167 2261 -8.33333333333333e+00 2167 2231 8.33333333333333e+00 2167 2230 -1.25000000000000e+01 2167 2024 -4.16666666666667e+00 2167 2336 4.16666666666667e+00 2167 2022 8.33333333333333e+00 2167 2166 -1.66666666666667e+01 2167 2163 8.33333333333333e+00 2167 2023 -1.25000000000000e+01 2167 2334 4.16666666666667e+00 2167 1935 -4.16666666666667e+00 2167 2006 -8.33333333333333e+00 2167 2165 8.33333333333333e+00 2167 2164 -3.75000000000000e+01 2167 2151 4.16666666666667e+00 2167 2004 4.16666666666667e+00 2167 1899 -4.16666666666667e+00 2168 2168 1.25000000000000e+02 2168 2193 -4.16666666666667e+00 2168 2152 4.16666666666667e+00 2168 2151 -8.33333333333333e+00 2168 2195 -1.25000000000000e+01 2168 2299 4.16666666666667e+00 2168 2160 8.33333333333333e+00 2168 2162 -3.75000000000000e+01 2168 2161 8.33333333333333e+00 2168 2298 4.16666666666667e+00 2168 2167 -1.66666666666667e+01 2168 1936 -4.16666666666667e+00 2168 1900 -4.16666666666667e+00 2168 2158 -4.16666666666667e+00 2168 2155 4.16666666666667e+00 2168 2166 -1.66666666666667e+01 2168 2157 8.33333333333333e+00 2168 2229 8.33333333333333e+00 2168 2159 -1.25000000000000e+01 2168 1899 -4.16666666666667e+00 2168 2154 4.16666666666667e+00 2168 2231 -3.75000000000000e+01 2168 2260 -8.33333333333333e+00 2168 2230 8.33333333333333e+00 2168 1935 -4.16666666666667e+00 2168 2259 4.16666666666667e+00 2168 2023 -4.16666666666667e+00 2168 2335 4.16666666666667e+00 2168 2004 4.16666666666667e+00 2168 2163 -4.16666666666667e+00 2168 2024 -1.25000000000000e+01 2168 2022 8.33333333333333e+00 2168 2334 -8.33333333333333e+00 2168 2165 -1.25000000000000e+01 2168 2194 8.33333333333333e+00 2168 2005 -8.33333333333333e+00 2168 2164 8.33333333333333e+00 2169 2169 6.25000000000000e+01 2169 2200 -4.16666666666667e+00 2169 2180 -2.08333333333333e+00 2169 2186 4.16666666666667e+00 2169 2179 4.16666666666667e+00 2169 2178 -6.25000000000000e+00 2169 2198 2.08333333333333e+00 2169 2201 -4.16666666666667e+00 2169 2197 -4.16666666666667e+00 2169 1988 0.00000000000000e+00 2169 1991 -2.08333333333333e+00 2169 2188 4.16666666666667e+00 2169 2176 -4.16666666666667e+00 2169 1907 4.16666666666667e+00 2169 2189 -8.33333333333333e+00 2169 1906 4.16666666666667e+00 2169 2170 -8.33333333333333e+00 2169 1990 4.16666666666667e+00 2169 1905 -1.87500000000000e+01 2169 1989 -6.25000000000000e+00 2169 2171 -8.33333333333333e+00 2169 1904 0.00000000000000e+00 2169 2177 8.33333333333333e+00 2169 1903 0.00000000000000e+00 2169 1987 0.00000000000000e+00 2169 2185 4.16666666666667e+00 2169 1902 0.00000000000000e+00 2169 2175 -1.25000000000000e+01 2170 2170 6.25000000000000e+01 2170 2201 -4.16666666666667e+00 2170 2184 4.16666666666667e+00 2170 2199 -4.16666666666667e+00 2170 2180 4.16666666666667e+00 2170 2186 -8.33333333333333e+00 2170 2179 -1.87500000000000e+01 2170 2178 4.16666666666667e+00 2170 2196 -4.16666666666667e+00 2170 2171 -8.33333333333333e+00 2170 1991 4.16666666666667e+00 2170 2177 8.33333333333333e+00 2170 2187 4.16666666666667e+00 2170 2175 -4.16666666666667e+00 2170 1907 -2.08333333333333e+00 2170 2189 4.16666666666667e+00 2170 1906 -6.25000000000000e+00 2170 1990 -1.87500000000000e+01 2170 1905 4.16666666666667e+00 2170 2169 -8.33333333333333e+00 2170 1989 4.16666666666667e+00 2170 1904 0.00000000000000e+00 2170 1988 0.00000000000000e+00 2170 2198 2.08333333333333e+00 2170 1903 0.00000000000000e+00 2170 2176 -1.25000000000000e+01 2170 1902 0.00000000000000e+00 2170 1986 0.00000000000000e+00 2171 2171 6.25000000000000e+01 2171 2200 -4.16666666666667e+00 2171 2180 -6.25000000000000e+00 2171 2179 4.16666666666667e+00 2171 2185 -8.33333333333333e+00 2171 2178 -2.08333333333333e+00 2171 2184 4.16666666666667e+00 2171 2196 2.08333333333333e+00 2171 2199 -4.16666666666667e+00 2171 1986 0.00000000000000e+00 2171 1989 -2.08333333333333e+00 2171 2170 -8.33333333333333e+00 2171 1990 4.16666666666667e+00 2171 2176 8.33333333333333e+00 2171 1907 -6.25000000000000e+00 2171 1991 -6.25000000000000e+00 2171 1906 -2.08333333333333e+00 2171 2188 4.16666666666667e+00 2171 1905 4.16666666666667e+00 2171 2187 -8.33333333333333e+00 2171 2197 2.08333333333333e+00 2171 1904 0.00000000000000e+00 2171 2177 -3.75000000000000e+01 2171 1903 0.00000000000000e+00 2171 1987 0.00000000000000e+00 2171 2169 -8.33333333333333e+00 2171 1902 0.00000000000000e+00 2171 2175 8.33333333333333e+00 2172 2172 1.00000000000000e+00 2172 2183 0.00000000000000e+00 2172 2182 0.00000000000000e+00 2172 2181 0.00000000000000e+00 2172 2246 0.00000000000000e+00 2172 2186 0.00000000000000e+00 2172 2249 0.00000000000000e+00 2172 2248 0.00000000000000e+00 2172 2185 0.00000000000000e+00 2172 1988 0.00000000000000e+00 2172 2000 0.00000000000000e+00 2172 2176 0.00000000000000e+00 2172 2173 0.00000000000000e+00 2172 1999 0.00000000000000e+00 2172 1916 0.00000000000000e+00 2172 2243 0.00000000000000e+00 2172 1915 0.00000000000000e+00 2172 2242 0.00000000000000e+00 2172 1914 0.00000000000000e+00 2172 1998 0.00000000000000e+00 2172 2174 0.00000000000000e+00 2172 1904 0.00000000000000e+00 2172 2177 0.00000000000000e+00 2172 1903 0.00000000000000e+00 2172 1987 0.00000000000000e+00 2172 2245 0.00000000000000e+00 2172 1902 0.00000000000000e+00 2172 2175 0.00000000000000e+00 2173 2173 1.00000000000000e+00 2173 2183 0.00000000000000e+00 2173 2182 0.00000000000000e+00 2173 2181 0.00000000000000e+00 2173 2246 0.00000000000000e+00 2173 2247 0.00000000000000e+00 2173 2186 0.00000000000000e+00 2173 2184 0.00000000000000e+00 2173 2249 0.00000000000000e+00 2173 2177 0.00000000000000e+00 2173 2243 0.00000000000000e+00 2173 2175 0.00000000000000e+00 2173 2172 0.00000000000000e+00 2173 1998 0.00000000000000e+00 2173 1916 0.00000000000000e+00 2173 2174 0.00000000000000e+00 2173 2000 0.00000000000000e+00 2173 1915 0.00000000000000e+00 2173 1999 0.00000000000000e+00 2173 1914 0.00000000000000e+00 2173 2241 0.00000000000000e+00 2173 1904 0.00000000000000e+00 2173 1988 0.00000000000000e+00 2173 2244 0.00000000000000e+00 2173 1903 0.00000000000000e+00 2173 2176 0.00000000000000e+00 2173 1902 0.00000000000000e+00 2173 1986 0.00000000000000e+00 2174 2174 1.00000000000000e+00 2174 2182 0.00000000000000e+00 2174 2181 0.00000000000000e+00 2174 2245 0.00000000000000e+00 2174 2244 0.00000000000000e+00 2174 2184 0.00000000000000e+00 2174 2247 0.00000000000000e+00 2174 2185 0.00000000000000e+00 2174 2248 0.00000000000000e+00 2174 2176 0.00000000000000e+00 2174 2242 0.00000000000000e+00 2174 1986 0.00000000000000e+00 2174 1998 0.00000000000000e+00 2174 1916 0.00000000000000e+00 2174 2000 0.00000000000000e+00 2174 1915 0.00000000000000e+00 2174 2173 0.00000000000000e+00 2174 1999 0.00000000000000e+00 2174 1914 0.00000000000000e+00 2174 2241 0.00000000000000e+00 2174 2183 0.00000000000000e+00 2174 1904 0.00000000000000e+00 2174 2177 0.00000000000000e+00 2174 1903 0.00000000000000e+00 2174 1987 0.00000000000000e+00 2174 2172 0.00000000000000e+00 2174 1902 0.00000000000000e+00 2174 2175 0.00000000000000e+00 2175 2175 1.25000000000000e+02 2175 2200 -8.33333333333333e+00 2175 2170 -4.16666666666667e+00 2175 1990 4.16666666666667e+00 2175 1991 4.16666666666667e+00 2175 2171 8.33333333333333e+00 2175 2169 -1.25000000000000e+01 2175 2189 8.33333333333333e+00 2175 2188 8.33333333333333e+00 2175 2187 -3.75000000000000e+01 2175 2264 -4.16666666666667e+00 2175 2263 -4.16666666666667e+00 2175 2186 -4.16666666666667e+00 2175 2249 4.16666666666667e+00 2175 2248 4.16666666666667e+00 2175 2185 8.33333333333333e+00 2175 2176 -1.66666666666667e+01 2175 2184 -1.25000000000000e+01 2175 2003 -4.16666666666667e+00 2175 2177 -1.66666666666667e+01 2175 1988 0.00000000000000e+00 2175 2000 0.00000000000000e+00 2175 2173 0.00000000000000e+00 2175 2002 8.33333333333333e+00 2175 1999 0.00000000000000e+00 2175 2174 0.00000000000000e+00 2175 1904 0.00000000000000e+00 2175 1903 0.00000000000000e+00 2175 1987 0.00000000000000e+00 2175 2172 0.00000000000000e+00 2175 2243 8.33333333333333e+00 2175 1919 -8.33333333333333e+00 2175 2242 -4.16666666666667e+00 2175 1918 4.16666666666667e+00 2175 2241 -1.25000000000000e+01 2175 2201 4.16666666666667e+00 2175 2001 -1.25000000000000e+01 2176 2176 1.25000000000000e+02 2176 2199 -8.33333333333333e+00 2176 2171 8.33333333333333e+00 2176 2169 -4.16666666666667e+00 2176 1989 4.16666666666667e+00 2176 1991 -8.33333333333333e+00 2176 2170 -1.25000000000000e+01 2176 2189 -4.16666666666667e+00 2176 2188 -1.25000000000000e+01 2176 2187 8.33333333333333e+00 2176 2262 -4.16666666666667e+00 2176 2186 8.33333333333333e+00 2176 2249 -8.33333333333333e+00 2176 2247 4.16666666666667e+00 2176 1904 0.00000000000000e+00 2176 2185 -3.75000000000000e+01 2176 2184 8.33333333333333e+00 2176 2175 -1.66666666666667e+01 2176 2264 -4.16666666666667e+00 2176 1919 4.16666666666667e+00 2176 2174 0.00000000000000e+00 2176 2172 0.00000000000000e+00 2176 1988 0.00000000000000e+00 2176 2000 0.00000000000000e+00 2176 2001 8.33333333333333e+00 2176 1998 0.00000000000000e+00 2176 2173 0.00000000000000e+00 2176 1902 0.00000000000000e+00 2176 1986 0.00000000000000e+00 2176 2243 8.33333333333333e+00 2176 2177 -1.66666666666667e+01 2176 2003 8.33333333333333e+00 2176 2242 -1.25000000000000e+01 2176 2201 4.16666666666667e+00 2176 2002 -3.75000000000000e+01 2176 2241 -4.16666666666667e+00 2176 1917 4.16666666666667e+00 2177 2177 1.25000000000000e+02 2177 2200 4.16666666666667e+00 2177 2170 8.33333333333333e+00 2177 1990 -8.33333333333333e+00 2177 1989 4.16666666666667e+00 2177 2171 -3.75000000000000e+01 2177 2169 8.33333333333333e+00 2177 2189 -1.25000000000000e+01 2177 2188 -4.16666666666667e+00 2177 2187 8.33333333333333e+00 2177 2262 -4.16666666666667e+00 2177 2185 8.33333333333333e+00 2177 2184 -4.16666666666667e+00 2177 2247 4.16666666666667e+00 2177 2248 -8.33333333333333e+00 2177 2186 -1.25000000000000e+01 2177 1903 0.00000000000000e+00 2177 2263 -4.16666666666667e+00 2177 1918 4.16666666666667e+00 2177 2001 -4.16666666666667e+00 2177 2173 0.00000000000000e+00 2177 2175 -1.66666666666667e+01 2177 1986 0.00000000000000e+00 2177 1998 0.00000000000000e+00 2177 1987 0.00000000000000e+00 2177 1999 0.00000000000000e+00 2177 2174 0.00000000000000e+00 2177 2172 0.00000000000000e+00 2177 1902 0.00000000000000e+00 2177 2243 -3.75000000000000e+01 2177 2199 4.16666666666667e+00 2177 2003 -1.25000000000000e+01 2177 2242 8.33333333333333e+00 2177 2176 -1.66666666666667e+01 2177 2002 8.33333333333333e+00 2177 2241 8.33333333333333e+00 2177 1917 -8.33333333333333e+00 2178 2178 6.25000000000000e+01 2178 2200 4.16666666666667e+00 2178 2201 -8.33333333333333e+00 2178 1904 0.00000000000000e+00 2178 2171 -2.08333333333333e+00 2178 2170 4.16666666666667e+00 2178 2169 -6.25000000000000e+00 2178 1943 2.08333333333333e+00 2178 2197 4.16666666666667e+00 2178 2196 -1.87500000000000e+01 2178 2185 -4.16666666666667e+00 2178 2036 -2.08333333333333e+00 2178 2179 -8.33333333333333e+00 2178 2404 -4.16666666666667e+00 2178 2041 4.16666666666667e+00 2178 2405 -4.16666666666667e+00 2178 2042 4.16666666666667e+00 2178 1942 -4.16666666666667e+00 2178 2035 4.16666666666667e+00 2178 2034 -6.25000000000000e+00 2178 2180 -8.33333333333333e+00 2178 2033 0.00000000000000e+00 2178 2186 8.33333333333333e+00 2178 2032 0.00000000000000e+00 2178 1903 0.00000000000000e+00 2178 2198 4.16666666666667e+00 2178 2031 0.00000000000000e+00 2178 2184 -1.25000000000000e+01 2179 2179 6.25000000000000e+01 2179 2199 4.16666666666667e+00 2179 2201 4.16666666666667e+00 2179 2171 4.16666666666667e+00 2179 2180 -8.33333333333333e+00 2179 2170 -1.87500000000000e+01 2179 2169 4.16666666666667e+00 2179 2197 -6.25000000000000e+00 2179 2196 4.16666666666667e+00 2179 2184 -4.16666666666667e+00 2179 2178 -8.33333333333333e+00 2179 2036 4.16666666666667e+00 2179 2403 -4.16666666666667e+00 2179 2040 4.16666666666667e+00 2179 2186 8.33333333333333e+00 2179 2042 -8.33333333333333e+00 2179 1943 2.08333333333333e+00 2179 2405 -4.16666666666667e+00 2179 2035 -1.87500000000000e+01 2179 1941 -4.16666666666667e+00 2179 2034 4.16666666666667e+00 2179 2033 0.00000000000000e+00 2179 1904 0.00000000000000e+00 2179 2198 -2.08333333333333e+00 2179 2032 0.00000000000000e+00 2179 2185 -1.25000000000000e+01 2179 2031 0.00000000000000e+00 2179 1902 0.00000000000000e+00 2180 2180 6.25000000000000e+01 2180 2196 4.16666666666667e+00 2180 2200 4.16666666666667e+00 2180 2199 -8.33333333333333e+00 2180 2171 -6.25000000000000e+00 2180 2170 4.16666666666667e+00 2180 2179 -8.33333333333333e+00 2180 1902 0.00000000000000e+00 2180 2169 -2.08333333333333e+00 2180 2198 -6.25000000000000e+00 2180 1941 2.08333333333333e+00 2180 2034 -2.08333333333333e+00 2180 2035 4.16666666666667e+00 2180 2185 8.33333333333333e+00 2180 2041 -8.33333333333333e+00 2180 2403 -4.16666666666667e+00 2180 2040 4.16666666666667e+00 2180 2036 -6.25000000000000e+00 2180 1942 2.08333333333333e+00 2180 2404 -4.16666666666667e+00 2180 2197 -2.08333333333333e+00 2180 2033 0.00000000000000e+00 2180 2186 -3.75000000000000e+01 2180 2032 0.00000000000000e+00 2180 1903 0.00000000000000e+00 2180 2178 -8.33333333333333e+00 2180 2031 0.00000000000000e+00 2180 2184 8.33333333333333e+00 2181 2181 1.00000000000000e+00 2181 2249 0.00000000000000e+00 2181 2245 0.00000000000000e+00 2181 2248 0.00000000000000e+00 2181 1946 0.00000000000000e+00 2181 2244 0.00000000000000e+00 2181 1904 0.00000000000000e+00 2181 2174 0.00000000000000e+00 2181 2182 0.00000000000000e+00 2181 2173 0.00000000000000e+00 2181 2172 0.00000000000000e+00 2181 2411 0.00000000000000e+00 2181 2042 0.00000000000000e+00 2181 2039 0.00000000000000e+00 2181 2038 0.00000000000000e+00 2181 2041 0.00000000000000e+00 2181 2185 0.00000000000000e+00 2181 1945 0.00000000000000e+00 2181 2410 0.00000000000000e+00 2181 2037 0.00000000000000e+00 2181 2183 0.00000000000000e+00 2181 2033 0.00000000000000e+00 2181 2186 0.00000000000000e+00 2181 2032 0.00000000000000e+00 2181 1903 0.00000000000000e+00 2181 2246 0.00000000000000e+00 2181 2031 0.00000000000000e+00 2181 2184 0.00000000000000e+00 2182 2182 1.00000000000000e+00 2182 2244 0.00000000000000e+00 2182 2247 0.00000000000000e+00 2182 2246 0.00000000000000e+00 2182 2245 0.00000000000000e+00 2182 2174 0.00000000000000e+00 2182 2173 0.00000000000000e+00 2182 2181 0.00000000000000e+00 2182 2172 0.00000000000000e+00 2182 2411 0.00000000000000e+00 2182 2183 0.00000000000000e+00 2182 2037 0.00000000000000e+00 2182 2042 0.00000000000000e+00 2182 2186 0.00000000000000e+00 2182 2040 0.00000000000000e+00 2182 2184 0.00000000000000e+00 2182 1946 0.00000000000000e+00 2182 2039 0.00000000000000e+00 2182 2038 0.00000000000000e+00 2182 1944 0.00000000000000e+00 2182 2409 0.00000000000000e+00 2182 2033 0.00000000000000e+00 2182 1904 0.00000000000000e+00 2182 2249 0.00000000000000e+00 2182 2032 0.00000000000000e+00 2182 2185 0.00000000000000e+00 2182 2031 0.00000000000000e+00 2182 1902 0.00000000000000e+00 2183 2183 1.00000000000000e+00 2183 2244 0.00000000000000e+00 2183 2247 0.00000000000000e+00 2183 2246 0.00000000000000e+00 2183 2245 0.00000000000000e+00 2183 1944 0.00000000000000e+00 2183 2174 0.00000000000000e+00 2183 2173 0.00000000000000e+00 2183 1902 0.00000000000000e+00 2183 2172 0.00000000000000e+00 2183 2409 0.00000000000000e+00 2183 2410 0.00000000000000e+00 2183 2182 0.00000000000000e+00 2183 2040 0.00000000000000e+00 2183 2037 0.00000000000000e+00 2183 2041 0.00000000000000e+00 2183 2185 0.00000000000000e+00 2183 2039 0.00000000000000e+00 2183 1945 0.00000000000000e+00 2183 2038 0.00000000000000e+00 2183 2248 0.00000000000000e+00 2183 2033 0.00000000000000e+00 2183 2186 0.00000000000000e+00 2183 2032 0.00000000000000e+00 2183 1903 0.00000000000000e+00 2183 2181 0.00000000000000e+00 2183 2031 0.00000000000000e+00 2183 2184 0.00000000000000e+00 2184 2184 1.25000000000000e+02 2184 2201 8.33333333333333e+00 2184 2171 4.16666666666667e+00 2184 2200 8.33333333333333e+00 2184 2199 -3.75000000000000e+01 2184 2179 -4.16666666666667e+00 2184 2405 4.16666666666667e+00 2184 2180 8.33333333333333e+00 2184 2178 -1.25000000000000e+01 2184 2404 -8.33333333333333e+00 2184 2186 -1.66666666666667e+01 2184 1949 -4.16666666666667e+00 2184 1904 0.00000000000000e+00 2184 2263 4.16666666666667e+00 2184 2248 -4.16666666666667e+00 2184 2177 -4.16666666666667e+00 2184 2174 0.00000000000000e+00 2184 2264 -8.33333333333333e+00 2184 2249 8.33333333333333e+00 2184 2247 -1.25000000000000e+01 2184 2176 8.33333333333333e+00 2184 2173 0.00000000000000e+00 2184 2175 -1.25000000000000e+01 2184 2042 -4.16666666666667e+00 2184 2411 4.16666666666667e+00 2184 2041 8.33333333333333e+00 2184 2185 -1.66666666666667e+01 2184 2182 0.00000000000000e+00 2184 2410 4.16666666666667e+00 2184 1948 -4.16666666666667e+00 2184 2040 -1.25000000000000e+01 2184 2183 0.00000000000000e+00 2184 2033 0.00000000000000e+00 2184 2032 0.00000000000000e+00 2184 1903 0.00000000000000e+00 2184 2181 0.00000000000000e+00 2184 2170 4.16666666666667e+00 2185 2185 1.25000000000000e+02 2185 2201 -4.16666666666667e+00 2185 2171 -8.33333333333333e+00 2185 2200 -1.25000000000000e+01 2185 2199 8.33333333333333e+00 2185 2178 -4.16666666666667e+00 2185 2180 8.33333333333333e+00 2185 2179 -1.25000000000000e+01 2185 2405 4.16666666666667e+00 2185 2403 -8.33333333333333e+00 2185 2262 4.16666666666667e+00 2185 2247 -4.16666666666667e+00 2185 2177 8.33333333333333e+00 2185 2186 -1.66666666666667e+01 2185 2249 8.33333333333333e+00 2185 1949 -4.16666666666667e+00 2185 2264 4.16666666666667e+00 2185 2248 -1.25000000000000e+01 2185 1904 0.00000000000000e+00 2185 2174 0.00000000000000e+00 2185 2176 -3.75000000000000e+01 2185 2175 8.33333333333333e+00 2185 2172 0.00000000000000e+00 2185 2033 0.00000000000000e+00 2185 2183 0.00000000000000e+00 2185 2040 8.33333333333333e+00 2185 2184 -1.66666666666667e+01 2185 2181 0.00000000000000e+00 2185 2411 -8.33333333333333e+00 2185 2042 8.33333333333333e+00 2185 2041 -3.75000000000000e+01 2185 2409 4.16666666666667e+00 2185 1947 -4.16666666666667e+00 2185 2182 0.00000000000000e+00 2185 2169 4.16666666666667e+00 2185 2031 0.00000000000000e+00 2185 1902 0.00000000000000e+00 2186 2186 1.25000000000000e+02 2186 2199 8.33333333333333e+00 2186 2170 -8.33333333333333e+00 2186 2169 4.16666666666667e+00 2186 2201 -1.25000000000000e+01 2186 2179 8.33333333333333e+00 2186 2403 4.16666666666667e+00 2186 2180 -3.75000000000000e+01 2186 2178 8.33333333333333e+00 2186 2404 4.16666666666667e+00 2186 2184 -1.66666666666667e+01 2186 1947 -4.16666666666667e+00 2186 1902 0.00000000000000e+00 2186 2176 8.33333333333333e+00 2186 2185 -1.66666666666667e+01 2186 2248 8.33333333333333e+00 2186 2175 -4.16666666666667e+00 2186 2172 0.00000000000000e+00 2186 2249 -3.75000000000000e+01 2186 1948 -4.16666666666667e+00 2186 2263 4.16666666666667e+00 2186 2262 -8.33333333333333e+00 2186 2247 8.33333333333333e+00 2186 2177 -1.25000000000000e+01 2186 1903 0.00000000000000e+00 2186 2173 0.00000000000000e+00 2186 2040 -4.16666666666667e+00 2186 2409 4.16666666666667e+00 2186 2032 0.00000000000000e+00 2186 2182 0.00000000000000e+00 2186 2042 -1.25000000000000e+01 2186 2410 -8.33333333333333e+00 2186 2041 8.33333333333333e+00 2186 2183 0.00000000000000e+00 2186 2200 -4.16666666666667e+00 2186 2181 0.00000000000000e+00 2186 2031 0.00000000000000e+00 2187 2187 1.25000000000000e+02 2187 2201 -4.16666666666667e+00 2187 2200 8.33333333333333e+00 2187 2199 -1.25000000000000e+01 2187 2264 4.16666666666667e+00 2187 2170 4.16666666666667e+00 2187 2171 -8.33333333333333e+00 2187 2177 8.33333333333333e+00 2187 2176 8.33333333333333e+00 2187 2175 -3.75000000000000e+01 2187 2188 -1.66666666666667e+01 2187 1906 -4.16666666666667e+00 2187 1918 -4.16666666666667e+00 2187 2266 -4.16666666666667e+00 2187 2260 4.16666666666667e+00 2187 2267 -4.16666666666667e+00 2187 2204 4.16666666666667e+00 2187 1907 8.33333333333333e+00 2187 2189 -1.66666666666667e+01 2187 2195 8.33333333333333e+00 2187 2203 -8.33333333333333e+00 2187 2194 8.33333333333333e+00 2187 2193 -3.75000000000000e+01 2187 1919 8.33333333333333e+00 2187 2261 -8.33333333333333e+00 2187 1990 -4.16666666666667e+00 2187 2152 4.16666666666667e+00 2187 2153 4.16666666666667e+00 2187 1991 -4.16666666666667e+00 2187 1905 -1.25000000000000e+01 2187 2159 -4.16666666666667e+00 2187 2003 4.16666666666667e+00 2187 2158 8.33333333333333e+00 2187 2002 -8.33333333333333e+00 2187 2157 -1.25000000000000e+01 2187 2263 4.16666666666667e+00 2187 1917 -1.25000000000000e+01 2188 2188 1.25000000000000e+02 2188 2201 8.33333333333333e+00 2188 2200 -3.75000000000000e+01 2188 2199 8.33333333333333e+00 2188 2264 -8.33333333333333e+00 2188 2169 4.16666666666667e+00 2188 2171 4.16666666666667e+00 2188 2177 -4.16666666666667e+00 2188 2176 -1.25000000000000e+01 2188 2175 8.33333333333333e+00 2188 2187 -1.66666666666667e+01 2188 1905 -4.16666666666667e+00 2188 1917 -4.16666666666667e+00 2188 2265 -4.16666666666667e+00 2188 2259 4.16666666666667e+00 2188 2204 4.16666666666667e+00 2188 2195 -4.16666666666667e+00 2188 2194 -1.25000000000000e+01 2188 2202 -8.33333333333333e+00 2188 2193 8.33333333333333e+00 2188 2267 -4.16666666666667e+00 2188 2261 4.16666666666667e+00 2188 1989 -4.16666666666667e+00 2188 2151 4.16666666666667e+00 2188 1991 -4.16666666666667e+00 2188 2003 4.16666666666667e+00 2188 2153 -8.33333333333333e+00 2188 1907 8.33333333333333e+00 2188 1906 -1.25000000000000e+01 2188 2159 8.33333333333333e+00 2188 2189 -1.66666666666667e+01 2188 1919 8.33333333333333e+00 2188 2158 -3.75000000000000e+01 2188 2262 4.16666666666667e+00 2188 1918 -1.25000000000000e+01 2188 2157 8.33333333333333e+00 2188 2001 -8.33333333333333e+00 2189 2189 1.25000000000000e+02 2189 2200 8.33333333333333e+00 2189 2199 -4.16666666666667e+00 2189 2263 -8.33333333333333e+00 2189 2262 4.16666666666667e+00 2189 2170 4.16666666666667e+00 2189 2169 -8.33333333333333e+00 2189 2177 -1.25000000000000e+01 2189 2176 -4.16666666666667e+00 2189 2175 8.33333333333333e+00 2189 2265 -4.16666666666667e+00 2189 2202 4.16666666666667e+00 2189 2195 -1.25000000000000e+01 2189 2203 4.16666666666667e+00 2189 2194 -4.16666666666667e+00 2189 1905 8.33333333333333e+00 2189 2187 -1.66666666666667e+01 2189 2193 8.33333333333333e+00 2189 2266 -4.16666666666667e+00 2189 2260 4.16666666666667e+00 2189 1917 8.33333333333333e+00 2189 2259 -8.33333333333333e+00 2189 1990 -4.16666666666667e+00 2189 2002 4.16666666666667e+00 2189 1907 -3.75000000000000e+01 2189 2152 -8.33333333333333e+00 2189 1906 8.33333333333333e+00 2189 2151 4.16666666666667e+00 2189 1989 -4.16666666666667e+00 2189 2159 -1.25000000000000e+01 2189 2201 -1.25000000000000e+01 2189 1919 -3.75000000000000e+01 2189 2158 8.33333333333333e+00 2189 2188 -1.66666666666667e+01 2189 1918 8.33333333333333e+00 2189 2157 -4.16666666666667e+00 2189 2001 4.16666666666667e+00 2190 2190 6.25000000000000e+01 2190 2153 2.08333333333333e+00 2190 2152 -4.16666666666667e+00 2190 2161 4.16666666666667e+00 2190 2160 -6.25000000000000e+00 2190 1907 4.16666666666667e+00 2190 2192 -8.33333333333333e+00 2190 2195 8.33333333333333e+00 2190 2194 -4.16666666666667e+00 2190 2193 -1.25000000000000e+01 2190 1925 4.16666666666667e+00 2190 2300 -8.33333333333333e+00 2190 2299 4.16666666666667e+00 2190 2203 4.16666666666667e+00 2190 2308 -4.16666666666667e+00 2190 2048 2.08333333333333e+00 2190 2309 -4.16666666666667e+00 2190 1924 4.16666666666667e+00 2190 2047 -4.16666666666667e+00 2190 1923 -1.87500000000000e+01 2190 2045 -2.08333333333333e+00 2190 2204 4.16666666666667e+00 2190 2191 -8.33333333333333e+00 2190 2044 4.16666666666667e+00 2190 1906 4.16666666666667e+00 2190 2162 -2.08333333333333e+00 2190 2043 -6.25000000000000e+00 2190 1905 -1.87500000000000e+01 2191 2191 6.25000000000000e+01 2191 2192 -8.33333333333333e+00 2191 1907 -2.08333333333333e+00 2191 2153 2.08333333333333e+00 2191 2151 -4.16666666666667e+00 2191 1925 -2.08333333333333e+00 2191 2161 -1.87500000000000e+01 2191 2160 4.16666666666667e+00 2191 2300 4.16666666666667e+00 2191 2195 8.33333333333333e+00 2191 2194 -1.25000000000000e+01 2191 2193 -4.16666666666667e+00 2191 2298 4.16666666666667e+00 2191 2202 4.16666666666667e+00 2191 2307 -4.16666666666667e+00 2191 2048 2.08333333333333e+00 2191 2309 -4.16666666666667e+00 2191 1924 -6.25000000000000e+00 2191 1923 4.16666666666667e+00 2191 2046 -4.16666666666667e+00 2191 2045 4.16666666666667e+00 2191 2204 -8.33333333333333e+00 2191 2162 4.16666666666667e+00 2191 2044 -1.87500000000000e+01 2191 1906 -6.25000000000000e+00 2191 2190 -8.33333333333333e+00 2191 2043 4.16666666666667e+00 2191 1905 4.16666666666667e+00 2192 2192 6.25000000000000e+01 2192 2191 -8.33333333333333e+00 2192 2160 -2.08333333333333e+00 2192 2151 2.08333333333333e+00 2192 1906 -2.08333333333333e+00 2192 2152 2.08333333333333e+00 2192 2162 -6.25000000000000e+00 2192 1924 -2.08333333333333e+00 2192 2299 4.16666666666667e+00 2192 2195 -3.75000000000000e+01 2192 2194 8.33333333333333e+00 2192 1905 4.16666666666667e+00 2192 2190 -8.33333333333333e+00 2192 2193 8.33333333333333e+00 2192 1923 4.16666666666667e+00 2192 2298 -8.33333333333333e+00 2192 2047 2.08333333333333e+00 2192 2308 -4.16666666666667e+00 2192 1925 -6.25000000000000e+00 2192 2046 2.08333333333333e+00 2192 2307 -4.16666666666667e+00 2192 2161 4.16666666666667e+00 2192 2045 -6.25000000000000e+00 2192 1907 -6.25000000000000e+00 2192 2044 4.16666666666667e+00 2192 2203 -8.33333333333333e+00 2192 2043 -2.08333333333333e+00 2192 2202 4.16666666666667e+00 2193 2193 1.25000000000000e+02 2193 2158 -8.33333333333333e+00 2193 2153 -4.16666666666667e+00 2193 2161 4.16666666666667e+00 2193 2152 -4.16666666666667e+00 2193 2162 4.16666666666667e+00 2193 2168 -4.16666666666667e+00 2193 2167 8.33333333333333e+00 2193 2166 -1.25000000000000e+01 2193 2309 4.16666666666667e+00 2193 2308 -8.33333333333333e+00 2193 2299 8.33333333333333e+00 2193 2192 8.33333333333333e+00 2193 1906 4.16666666666667e+00 2193 2191 -4.16666666666667e+00 2193 2190 -1.25000000000000e+01 2193 2300 8.33333333333333e+00 2193 1936 4.16666666666667e+00 2193 2298 -3.75000000000000e+01 2193 2195 -1.66666666666667e+01 2193 2260 -4.16666666666667e+00 2193 2204 -4.16666666666667e+00 2193 2266 4.16666666666667e+00 2193 2371 -4.16666666666667e+00 2193 2267 4.16666666666667e+00 2193 2372 -4.16666666666667e+00 2193 1907 -8.33333333333333e+00 2193 2189 8.33333333333333e+00 2193 2203 8.33333333333333e+00 2193 2188 8.33333333333333e+00 2193 2194 -1.66666666666667e+01 2193 2202 -1.25000000000000e+01 2193 2187 -3.75000000000000e+01 2193 2261 8.33333333333333e+00 2193 1937 -8.33333333333333e+00 2193 2159 4.16666666666667e+00 2193 2259 -1.25000000000000e+01 2194 2194 1.25000000000000e+02 2194 2157 -8.33333333333333e+00 2194 2160 4.16666666666667e+00 2194 2151 -4.16666666666667e+00 2194 2162 -8.33333333333333e+00 2194 2168 8.33333333333333e+00 2194 2153 -4.16666666666667e+00 2194 2167 -3.75000000000000e+01 2194 2166 8.33333333333333e+00 2194 2309 4.16666666666667e+00 2194 2300 -4.16666666666667e+00 2194 2307 -8.33333333333333e+00 2194 2298 8.33333333333333e+00 2194 2192 8.33333333333333e+00 2194 2195 -1.66666666666667e+01 2194 2191 -1.25000000000000e+01 2194 1905 4.16666666666667e+00 2194 2190 -4.16666666666667e+00 2194 2299 -1.25000000000000e+01 2194 1935 4.16666666666667e+00 2194 2259 -4.16666666666667e+00 2194 2204 8.33333333333333e+00 2194 2265 4.16666666666667e+00 2194 2370 -4.16666666666667e+00 2194 2267 -8.33333333333333e+00 2194 2261 8.33333333333333e+00 2194 1907 4.16666666666667e+00 2194 2189 -4.16666666666667e+00 2194 2203 -3.75000000000000e+01 2194 2188 -1.25000000000000e+01 2194 2202 8.33333333333333e+00 2194 2187 8.33333333333333e+00 2194 2193 -1.66666666666667e+01 2194 2372 -4.16666666666667e+00 2194 1937 4.16666666666667e+00 2194 2159 4.16666666666667e+00 2194 2260 -1.25000000000000e+01 2195 2195 1.25000000000000e+02 2195 2157 4.16666666666667e+00 2195 2151 -4.16666666666667e+00 2195 2161 -8.33333333333333e+00 2195 2167 8.33333333333333e+00 2195 2160 4.16666666666667e+00 2195 2166 -4.16666666666667e+00 2195 2152 -4.16666666666667e+00 2195 2168 -1.25000000000000e+01 2195 2308 4.16666666666667e+00 2195 2299 -4.16666666666667e+00 2195 2307 4.16666666666667e+00 2195 2192 -3.75000000000000e+01 2195 2191 8.33333333333333e+00 2195 2194 -1.66666666666667e+01 2195 2190 8.33333333333333e+00 2195 2300 -1.25000000000000e+01 2195 2298 8.33333333333333e+00 2195 2193 -1.66666666666667e+01 2195 2202 -4.16666666666667e+00 2195 2203 8.33333333333333e+00 2195 2266 -8.33333333333333e+00 2195 2260 8.33333333333333e+00 2195 2265 4.16666666666667e+00 2195 2370 -4.16666666666667e+00 2195 2204 -1.25000000000000e+01 2195 2189 -1.25000000000000e+01 2195 1906 4.16666666666667e+00 2195 2188 -4.16666666666667e+00 2195 1905 -8.33333333333333e+00 2195 2187 8.33333333333333e+00 2195 2158 4.16666666666667e+00 2195 2261 -3.75000000000000e+01 2195 2371 -4.16666666666667e+00 2195 1936 4.16666666666667e+00 2195 2259 8.33333333333333e+00 2195 1935 -8.33333333333333e+00 2196 2196 6.25000000000000e+01 2196 2180 4.16666666666667e+00 2196 2171 2.08333333333333e+00 2196 1907 -2.08333333333333e+00 2196 2170 -4.16666666666667e+00 2196 1943 -2.08333333333333e+00 2196 2179 4.16666666666667e+00 2196 2178 -1.87500000000000e+01 2196 2405 4.16666666666667e+00 2196 2404 4.16666666666667e+00 2196 2201 8.33333333333333e+00 2196 2200 -4.16666666666667e+00 2196 2199 -1.25000000000000e+01 2196 2203 4.16666666666667e+00 2196 2407 -4.16666666666667e+00 2196 2051 2.08333333333333e+00 2196 2408 -4.16666666666667e+00 2196 2050 -4.16666666666667e+00 2196 1942 4.16666666666667e+00 2196 1941 -6.25000000000000e+00 2196 2045 4.16666666666667e+00 2196 2204 -8.33333333333333e+00 2196 2044 4.16666666666667e+00 2196 2197 -8.33333333333333e+00 2196 1906 4.16666666666667e+00 2196 2043 -1.87500000000000e+01 2196 2198 -8.33333333333333e+00 2196 1905 -6.25000000000000e+00 2197 2197 6.25000000000000e+01 2197 2171 2.08333333333333e+00 2197 2169 -4.16666666666667e+00 2197 2179 -6.25000000000000e+00 2197 2178 4.16666666666667e+00 2197 1943 4.16666666666667e+00 2197 2405 -8.33333333333333e+00 2197 2403 4.16666666666667e+00 2197 2198 -8.33333333333333e+00 2197 1907 4.16666666666667e+00 2197 2201 8.33333333333333e+00 2197 2200 -1.25000000000000e+01 2197 2199 -4.16666666666667e+00 2197 2202 4.16666666666667e+00 2197 2406 -4.16666666666667e+00 2197 2051 2.08333333333333e+00 2197 2408 -4.16666666666667e+00 2197 1942 -1.87500000000000e+01 2197 2049 -4.16666666666667e+00 2197 1941 4.16666666666667e+00 2197 2045 -2.08333333333333e+00 2197 2204 4.16666666666667e+00 2197 2044 -6.25000000000000e+00 2197 2180 -2.08333333333333e+00 2197 1906 -1.87500000000000e+01 2197 2043 4.16666666666667e+00 2197 2196 -8.33333333333333e+00 2197 1905 4.16666666666667e+00 2198 2198 6.25000000000000e+01 2198 2170 2.08333333333333e+00 2198 2196 -8.33333333333333e+00 2198 2178 4.16666666666667e+00 2198 2169 2.08333333333333e+00 2198 1905 -2.08333333333333e+00 2198 2180 -6.25000000000000e+00 2198 1941 -2.08333333333333e+00 2198 2403 4.16666666666667e+00 2198 1942 4.16666666666667e+00 2198 2404 -8.33333333333333e+00 2198 2201 -3.75000000000000e+01 2198 2197 -8.33333333333333e+00 2198 1906 4.16666666666667e+00 2198 2200 8.33333333333333e+00 2198 2199 8.33333333333333e+00 2198 2049 2.08333333333333e+00 2198 2406 -4.16666666666667e+00 2198 1943 -6.25000000000000e+00 2198 2050 2.08333333333333e+00 2198 2407 -4.16666666666667e+00 2198 2045 -6.25000000000000e+00 2198 2179 -2.08333333333333e+00 2198 1907 -6.25000000000000e+00 2198 2044 -2.08333333333333e+00 2198 2203 4.16666666666667e+00 2198 2043 4.16666666666667e+00 2198 2202 -8.33333333333333e+00 2199 2199 1.25000000000000e+02 2199 2176 -8.33333333333333e+00 2199 2170 -4.16666666666667e+00 2199 2179 4.16666666666667e+00 2199 2186 8.33333333333333e+00 2199 2180 -8.33333333333333e+00 2199 2171 -4.16666666666667e+00 2199 2185 8.33333333333333e+00 2199 2184 -3.75000000000000e+01 2199 2408 4.16666666666667e+00 2199 2405 -4.16666666666667e+00 2199 2404 8.33333333333333e+00 2199 2407 -8.33333333333333e+00 2199 2198 8.33333333333333e+00 2199 2201 -1.66666666666667e+01 2199 2197 -4.16666666666667e+00 2199 1906 4.16666666666667e+00 2199 2196 -1.25000000000000e+01 2199 1948 4.16666666666667e+00 2199 2403 -1.25000000000000e+01 2199 2263 -4.16666666666667e+00 2199 2204 8.33333333333333e+00 2199 2266 4.16666666666667e+00 2199 2416 -4.16666666666667e+00 2199 2267 -8.33333333333333e+00 2199 2264 8.33333333333333e+00 2199 1907 4.16666666666667e+00 2199 2189 -4.16666666666667e+00 2199 2203 8.33333333333333e+00 2199 2188 8.33333333333333e+00 2199 2200 -1.66666666666667e+01 2199 2202 -3.75000000000000e+01 2199 2187 -1.25000000000000e+01 2199 2417 -4.16666666666667e+00 2199 1949 4.16666666666667e+00 2199 2177 4.16666666666667e+00 2199 2262 -1.25000000000000e+01 2200 2200 1.25000000000000e+02 2200 2175 -8.33333333333333e+00 2200 2171 -4.16666666666667e+00 2200 2169 -4.16666666666667e+00 2200 2178 4.16666666666667e+00 2200 2186 -4.16666666666667e+00 2200 2180 4.16666666666667e+00 2200 2185 -1.25000000000000e+01 2200 2184 8.33333333333333e+00 2200 2408 4.16666666666667e+00 2200 2403 8.33333333333333e+00 2200 2406 -8.33333333333333e+00 2200 2198 8.33333333333333e+00 2200 2197 -1.25000000000000e+01 2200 2196 -4.16666666666667e+00 2200 1905 4.16666666666667e+00 2200 2405 8.33333333333333e+00 2200 2404 -3.75000000000000e+01 2200 1947 4.16666666666667e+00 2200 2201 -1.66666666666667e+01 2200 2262 -4.16666666666667e+00 2200 2204 -4.16666666666667e+00 2200 2265 4.16666666666667e+00 2200 2415 -4.16666666666667e+00 2200 2417 -4.16666666666667e+00 2200 2267 4.16666666666667e+00 2200 1907 -8.33333333333333e+00 2200 2189 8.33333333333333e+00 2200 2203 -1.25000000000000e+01 2200 2188 -3.75000000000000e+01 2200 2202 8.33333333333333e+00 2200 2187 8.33333333333333e+00 2200 2199 -1.66666666666667e+01 2200 2264 8.33333333333333e+00 2200 1949 -8.33333333333333e+00 2200 2177 4.16666666666667e+00 2200 2263 -1.25000000000000e+01 2201 2201 1.25000000000000e+02 2201 2176 4.16666666666667e+00 2201 2170 -4.16666666666667e+00 2201 2185 -4.16666666666667e+00 2201 2179 4.16666666666667e+00 2201 2184 8.33333333333333e+00 2201 2178 -8.33333333333333e+00 2201 2169 -4.16666666666667e+00 2201 2186 -1.25000000000000e+01 2201 2406 4.16666666666667e+00 2201 2403 -4.16666666666667e+00 2201 2407 4.16666666666667e+00 2201 2198 -3.75000000000000e+01 2201 2197 8.33333333333333e+00 2201 2196 8.33333333333333e+00 2201 2199 -1.66666666666667e+01 2201 2405 -1.25000000000000e+01 2201 2404 8.33333333333333e+00 2201 2200 -1.66666666666667e+01 2201 2203 -4.16666666666667e+00 2201 2202 8.33333333333333e+00 2201 2416 -4.16666666666667e+00 2201 2266 4.16666666666667e+00 2201 2265 -8.33333333333333e+00 2201 2262 8.33333333333333e+00 2201 2204 -1.25000000000000e+01 2201 2189 -1.25000000000000e+01 2201 1906 -8.33333333333333e+00 2201 2188 8.33333333333333e+00 2201 1905 4.16666666666667e+00 2201 2187 -4.16666666666667e+00 2201 2175 4.16666666666667e+00 2201 2264 -3.75000000000000e+01 2201 2263 8.33333333333333e+00 2201 1948 -8.33333333333333e+00 2201 2415 -4.16666666666667e+00 2201 1947 4.16666666666667e+00 2202 2202 1.25000000000000e+02 2202 2416 4.16666666666667e+00 2202 2417 4.16666666666667e+00 2202 2200 8.33333333333333e+00 2202 2199 -3.75000000000000e+01 2202 2197 4.16666666666667e+00 2202 2408 -4.16666666666667e+00 2202 2198 -8.33333333333333e+00 2202 2407 8.33333333333333e+00 2202 2406 -1.25000000000000e+01 2202 2203 -1.66666666666667e+01 2202 1906 -4.16666666666667e+00 2202 1954 -4.16666666666667e+00 2202 2189 4.16666666666667e+00 2202 2195 -4.16666666666667e+00 2202 2266 -4.16666666666667e+00 2202 2371 4.16666666666667e+00 2202 2188 -8.33333333333333e+00 2202 2194 8.33333333333333e+00 2202 2193 -1.25000000000000e+01 2202 2267 8.33333333333333e+00 2202 2372 -8.33333333333333e+00 2202 2265 -1.25000000000000e+01 2202 2044 -4.16666666666667e+00 2202 2191 4.16666666666667e+00 2202 2045 8.33333333333333e+00 2202 2204 -1.66666666666667e+01 2202 2309 8.33333333333333e+00 2202 2192 4.16666666666667e+00 2202 1907 -4.16666666666667e+00 2202 2043 -1.25000000000000e+01 2202 2057 4.16666666666667e+00 2202 1955 -4.16666666666667e+00 2202 2308 8.33333333333333e+00 2202 2056 -8.33333333333333e+00 2202 2307 -3.75000000000000e+01 2202 2201 8.33333333333333e+00 2203 2203 1.25000000000000e+02 2203 2415 4.16666666666667e+00 2203 2417 -8.33333333333333e+00 2203 2200 -1.25000000000000e+01 2203 2199 8.33333333333333e+00 2203 2196 4.16666666666667e+00 2203 2408 8.33333333333333e+00 2203 2198 4.16666666666667e+00 2203 2407 -3.75000000000000e+01 2203 2406 8.33333333333333e+00 2203 2202 -1.66666666666667e+01 2203 1905 -4.16666666666667e+00 2203 1953 -4.16666666666667e+00 2203 2267 8.33333333333333e+00 2203 2204 -1.66666666666667e+01 2203 2195 8.33333333333333e+00 2203 2265 -4.16666666666667e+00 2203 2370 4.16666666666667e+00 2203 1907 -4.16666666666667e+00 2203 2189 4.16666666666667e+00 2203 2194 -3.75000000000000e+01 2203 2187 -8.33333333333333e+00 2203 2193 8.33333333333333e+00 2203 1955 -4.16666666666667e+00 2203 2372 4.16666666666667e+00 2203 2266 -1.25000000000000e+01 2203 2043 -4.16666666666667e+00 2203 2190 4.16666666666667e+00 2203 2057 4.16666666666667e+00 2203 2309 -4.16666666666667e+00 2203 2192 -8.33333333333333e+00 2203 2045 8.33333333333333e+00 2203 2044 -1.25000000000000e+01 2203 2308 -1.25000000000000e+01 2203 2201 -4.16666666666667e+00 2203 2307 8.33333333333333e+00 2203 2055 -8.33333333333333e+00 2204 2204 1.25000000000000e+02 2204 2199 8.33333333333333e+00 2204 2416 -8.33333333333333e+00 2204 2415 4.16666666666667e+00 2204 2201 -1.25000000000000e+01 2204 2407 8.33333333333333e+00 2204 2406 -4.16666666666667e+00 2204 2197 4.16666666666667e+00 2204 2196 -8.33333333333333e+00 2204 2408 -1.25000000000000e+01 2204 2187 4.16666666666667e+00 2204 2193 -4.16666666666667e+00 2204 2266 8.33333333333333e+00 2204 2203 -1.66666666666667e+01 2204 2194 8.33333333333333e+00 2204 2195 -1.25000000000000e+01 2204 1906 -4.16666666666667e+00 2204 2188 4.16666666666667e+00 2204 2267 -3.75000000000000e+01 2204 1954 -4.16666666666667e+00 2204 2371 4.16666666666667e+00 2204 2265 8.33333333333333e+00 2204 2370 -8.33333333333333e+00 2204 2056 4.16666666666667e+00 2204 2308 -4.16666666666667e+00 2204 2043 8.33333333333333e+00 2204 2202 -1.66666666666667e+01 2204 2307 8.33333333333333e+00 2204 2045 -3.75000000000000e+01 2204 2191 -8.33333333333333e+00 2204 2044 8.33333333333333e+00 2204 2190 4.16666666666667e+00 2204 1905 -4.16666666666667e+00 2204 2309 -1.25000000000000e+01 2204 2200 -4.16666666666667e+00 2204 2055 4.16666666666667e+00 2204 1953 -4.16666666666667e+00 2205 2205 6.25000000000000e+01 2205 2237 -4.16666666666667e+00 2205 2234 -4.16666666666667e+00 2205 2233 2.08333333333333e+00 2205 2236 -4.16666666666667e+00 2205 2216 4.16666666666667e+00 2205 2215 -2.08333333333333e+00 2205 2221 4.16666666666667e+00 2205 2214 -6.25000000000000e+00 2205 1996 -2.08333333333333e+00 2205 1993 0.00000000000000e+00 2205 2225 4.16666666666667e+00 2205 2213 -4.16666666666667e+00 2205 1910 0.00000000000000e+00 2205 1994 0.00000000000000e+00 2205 1909 0.00000000000000e+00 2205 2206 -8.33333333333333e+00 2205 2212 8.33333333333333e+00 2205 1908 0.00000000000000e+00 2205 2211 -1.25000000000000e+01 2205 2207 -8.33333333333333e+00 2205 1913 4.16666666666667e+00 2205 1997 4.16666666666667e+00 2205 1912 4.16666666666667e+00 2205 2224 -8.33333333333333e+00 2205 2222 4.16666666666667e+00 2205 1911 -1.87500000000000e+01 2205 1995 -6.25000000000000e+00 2206 2206 6.25000000000000e+01 2206 2237 -4.16666666666667e+00 2206 2232 2.08333333333333e+00 2206 2235 -4.16666666666667e+00 2206 2216 4.16666666666667e+00 2206 2222 -8.33333333333333e+00 2206 2215 -6.25000000000000e+00 2206 2214 -2.08333333333333e+00 2206 2220 4.16666666666667e+00 2206 1995 -2.08333333333333e+00 2206 1992 0.00000000000000e+00 2206 1997 4.16666666666667e+00 2206 2207 -8.33333333333333e+00 2206 2213 8.33333333333333e+00 2206 1910 0.00000000000000e+00 2206 1994 0.00000000000000e+00 2206 1909 0.00000000000000e+00 2206 2212 -3.75000000000000e+01 2206 1908 0.00000000000000e+00 2206 2205 -8.33333333333333e+00 2206 2211 8.33333333333333e+00 2206 1913 -2.08333333333333e+00 2206 2225 4.16666666666667e+00 2206 2234 2.08333333333333e+00 2206 1912 -6.25000000000000e+00 2206 1996 -6.25000000000000e+00 2206 1911 4.16666666666667e+00 2206 2223 -8.33333333333333e+00 2207 2207 6.25000000000000e+01 2207 2236 -4.16666666666667e+00 2207 2220 4.16666666666667e+00 2207 2235 -4.16666666666667e+00 2207 2232 -4.16666666666667e+00 2207 2216 -1.87500000000000e+01 2207 2215 4.16666666666667e+00 2207 2221 -8.33333333333333e+00 2207 2214 4.16666666666667e+00 2207 1996 4.16666666666667e+00 2207 2206 -8.33333333333333e+00 2207 2212 8.33333333333333e+00 2207 2223 4.16666666666667e+00 2207 2211 -4.16666666666667e+00 2207 1910 0.00000000000000e+00 2207 2213 -1.25000000000000e+01 2207 1909 0.00000000000000e+00 2207 1993 0.00000000000000e+00 2207 1908 0.00000000000000e+00 2207 1992 0.00000000000000e+00 2207 2233 2.08333333333333e+00 2207 1913 -6.25000000000000e+00 2207 1997 -1.87500000000000e+01 2207 1912 -2.08333333333333e+00 2207 2224 4.16666666666667e+00 2207 2205 -8.33333333333333e+00 2207 1911 4.16666666666667e+00 2207 1995 4.16666666666667e+00 2208 2208 1.00000000000000e+00 2208 2255 0.00000000000000e+00 2208 2219 0.00000000000000e+00 2208 2222 0.00000000000000e+00 2208 2218 0.00000000000000e+00 2208 2221 0.00000000000000e+00 2208 2217 0.00000000000000e+00 2208 2251 0.00000000000000e+00 2208 2254 0.00000000000000e+00 2208 1993 0.00000000000000e+00 2208 1999 0.00000000000000e+00 2208 2210 0.00000000000000e+00 2208 2000 0.00000000000000e+00 2208 2213 0.00000000000000e+00 2208 1916 0.00000000000000e+00 2208 2243 0.00000000000000e+00 2208 1915 0.00000000000000e+00 2208 2242 0.00000000000000e+00 2208 1914 0.00000000000000e+00 2208 1998 0.00000000000000e+00 2208 1910 0.00000000000000e+00 2208 1994 0.00000000000000e+00 2208 2209 0.00000000000000e+00 2208 1909 0.00000000000000e+00 2208 2212 0.00000000000000e+00 2208 2252 0.00000000000000e+00 2208 1908 0.00000000000000e+00 2208 2211 0.00000000000000e+00 2209 2209 1.00000000000000e+00 2209 2255 0.00000000000000e+00 2209 2219 0.00000000000000e+00 2209 2218 0.00000000000000e+00 2209 2217 0.00000000000000e+00 2209 2220 0.00000000000000e+00 2209 2252 0.00000000000000e+00 2209 2250 0.00000000000000e+00 2209 2253 0.00000000000000e+00 2209 1992 0.00000000000000e+00 2209 1998 0.00000000000000e+00 2209 2243 0.00000000000000e+00 2209 2213 0.00000000000000e+00 2209 1916 0.00000000000000e+00 2209 2210 0.00000000000000e+00 2209 2000 0.00000000000000e+00 2209 1915 0.00000000000000e+00 2209 1999 0.00000000000000e+00 2209 1914 0.00000000000000e+00 2209 2241 0.00000000000000e+00 2209 1910 0.00000000000000e+00 2209 1994 0.00000000000000e+00 2209 2222 0.00000000000000e+00 2209 1909 0.00000000000000e+00 2209 2212 0.00000000000000e+00 2209 2208 0.00000000000000e+00 2209 1908 0.00000000000000e+00 2209 2211 0.00000000000000e+00 2210 2210 1.00000000000000e+00 2210 2253 0.00000000000000e+00 2210 2221 0.00000000000000e+00 2210 2254 0.00000000000000e+00 2210 2219 0.00000000000000e+00 2210 2218 0.00000000000000e+00 2210 2217 0.00000000000000e+00 2210 2220 0.00000000000000e+00 2210 2251 0.00000000000000e+00 2210 2242 0.00000000000000e+00 2210 2212 0.00000000000000e+00 2210 2208 0.00000000000000e+00 2210 1998 0.00000000000000e+00 2210 2211 0.00000000000000e+00 2210 1916 0.00000000000000e+00 2210 2000 0.00000000000000e+00 2210 1915 0.00000000000000e+00 2210 2209 0.00000000000000e+00 2210 1999 0.00000000000000e+00 2210 1914 0.00000000000000e+00 2210 2241 0.00000000000000e+00 2210 2250 0.00000000000000e+00 2210 1910 0.00000000000000e+00 2210 2213 0.00000000000000e+00 2210 1909 0.00000000000000e+00 2210 1993 0.00000000000000e+00 2210 1908 0.00000000000000e+00 2210 1992 0.00000000000000e+00 2211 2211 1.25000000000000e+02 2211 2255 4.16666666666667e+00 2211 2210 0.00000000000000e+00 2211 2000 0.00000000000000e+00 2211 1999 0.00000000000000e+00 2211 2209 0.00000000000000e+00 2211 2208 0.00000000000000e+00 2211 2243 -4.16666666666667e+00 2211 2242 8.33333333333333e+00 2211 2241 -1.25000000000000e+01 2211 2221 -4.16666666666667e+00 2211 2269 -4.16666666666667e+00 2211 2236 4.16666666666667e+00 2211 2222 8.33333333333333e+00 2211 2237 -8.33333333333333e+00 2211 1919 4.16666666666667e+00 2211 2270 -4.16666666666667e+00 2211 1910 0.00000000000000e+00 2211 2220 -1.25000000000000e+01 2211 1994 0.00000000000000e+00 2211 1993 0.00000000000000e+00 2211 1997 4.16666666666667e+00 2211 2207 -4.16666666666667e+00 2211 2212 -1.66666666666667e+01 2211 1996 4.16666666666667e+00 2211 2002 -4.16666666666667e+00 2211 1909 0.00000000000000e+00 2211 2206 8.33333333333333e+00 2211 2205 -1.25000000000000e+01 2211 2213 -1.66666666666667e+01 2211 2225 8.33333333333333e+00 2211 2003 8.33333333333333e+00 2211 2224 8.33333333333333e+00 2211 1918 -8.33333333333333e+00 2211 2254 4.16666666666667e+00 2211 2223 -3.75000000000000e+01 2211 2001 -1.25000000000000e+01 2212 2212 1.25000000000000e+02 2212 2255 -8.33333333333333e+00 2212 2210 0.00000000000000e+00 2212 2000 0.00000000000000e+00 2212 1998 0.00000000000000e+00 2212 2209 0.00000000000000e+00 2212 2208 0.00000000000000e+00 2212 2243 8.33333333333333e+00 2212 2242 -3.75000000000000e+01 2212 2241 8.33333333333333e+00 2212 2220 -4.16666666666667e+00 2212 2268 -4.16666666666667e+00 2212 2235 4.16666666666667e+00 2212 2270 -4.16666666666667e+00 2212 2237 4.16666666666667e+00 2212 2213 -1.66666666666667e+01 2212 2222 8.33333333333333e+00 2212 2221 -1.25000000000000e+01 2212 1992 0.00000000000000e+00 2212 2207 8.33333333333333e+00 2212 2211 -1.66666666666667e+01 2212 1997 -8.33333333333333e+00 2212 2003 8.33333333333333e+00 2212 1995 4.16666666666667e+00 2212 2001 -4.16666666666667e+00 2212 1910 0.00000000000000e+00 2212 1994 0.00000000000000e+00 2212 2206 -3.75000000000000e+01 2212 1908 0.00000000000000e+00 2212 2205 8.33333333333333e+00 2212 2225 -4.16666666666667e+00 2212 1919 4.16666666666667e+00 2212 2253 4.16666666666667e+00 2212 2224 -1.25000000000000e+01 2212 2002 -1.25000000000000e+01 2212 2223 8.33333333333333e+00 2212 1917 -8.33333333333333e+00 2213 2213 1.25000000000000e+02 2213 2253 4.16666666666667e+00 2213 2209 0.00000000000000e+00 2213 1999 0.00000000000000e+00 2213 2208 0.00000000000000e+00 2213 1998 0.00000000000000e+00 2213 2210 0.00000000000000e+00 2213 2243 -1.25000000000000e+01 2213 2242 8.33333333333333e+00 2213 2241 -4.16666666666667e+00 2213 2269 -4.16666666666667e+00 2213 2236 4.16666666666667e+00 2213 2220 8.33333333333333e+00 2213 2235 -8.33333333333333e+00 2213 1917 4.16666666666667e+00 2213 2268 -4.16666666666667e+00 2213 2222 -3.75000000000000e+01 2213 2212 -1.66666666666667e+01 2213 2221 8.33333333333333e+00 2213 1908 0.00000000000000e+00 2213 1992 0.00000000000000e+00 2213 2206 8.33333333333333e+00 2213 1995 4.16666666666667e+00 2213 2205 -4.16666666666667e+00 2213 1996 -8.33333333333333e+00 2213 2002 8.33333333333333e+00 2213 2207 -1.25000000000000e+01 2213 1909 0.00000000000000e+00 2213 1993 0.00000000000000e+00 2213 2254 -8.33333333333333e+00 2213 2225 -1.25000000000000e+01 2213 2003 -3.75000000000000e+01 2213 2224 -4.16666666666667e+00 2213 1918 4.16666666666667e+00 2213 2211 -1.66666666666667e+01 2213 2223 8.33333333333333e+00 2213 2001 8.33333333333333e+00 2214 2214 6.25000000000000e+01 2214 2237 4.16666666666667e+00 2214 2236 -8.33333333333333e+00 2214 2207 4.16666666666667e+00 2214 2206 -2.08333333333333e+00 2214 1909 0.00000000000000e+00 2214 2205 -6.25000000000000e+00 2214 2234 4.16666666666667e+00 2214 1960 2.08333333333333e+00 2214 2232 -1.87500000000000e+01 2214 2222 -4.16666666666667e+00 2214 2216 -8.33333333333333e+00 2214 2071 -2.08333333333333e+00 2214 2441 -4.16666666666667e+00 2214 2078 4.16666666666667e+00 2214 2440 -4.16666666666667e+00 2214 2077 4.16666666666667e+00 2214 2072 4.16666666666667e+00 2214 1961 -4.16666666666667e+00 2214 2070 -6.25000000000000e+00 2214 2069 0.00000000000000e+00 2214 1910 0.00000000000000e+00 2214 2068 0.00000000000000e+00 2214 2215 -8.33333333333333e+00 2214 2221 8.33333333333333e+00 2214 2067 0.00000000000000e+00 2214 2233 4.16666666666667e+00 2214 2220 -1.25000000000000e+01 2215 2215 6.25000000000000e+01 2215 2232 4.16666666666667e+00 2215 2237 4.16666666666667e+00 2215 2235 -8.33333333333333e+00 2215 2207 4.16666666666667e+00 2215 2216 -8.33333333333333e+00 2215 2206 -6.25000000000000e+00 2215 2205 -2.08333333333333e+00 2215 1908 0.00000000000000e+00 2215 2233 -6.25000000000000e+00 2215 1959 2.08333333333333e+00 2215 2070 -2.08333333333333e+00 2215 2072 4.16666666666667e+00 2215 2222 8.33333333333333e+00 2215 2078 -8.33333333333333e+00 2215 2439 -4.16666666666667e+00 2215 2076 4.16666666666667e+00 2215 1961 2.08333333333333e+00 2215 2441 -4.16666666666667e+00 2215 2071 -6.25000000000000e+00 2215 2069 0.00000000000000e+00 2215 1910 0.00000000000000e+00 2215 2068 0.00000000000000e+00 2215 2234 -2.08333333333333e+00 2215 2221 -3.75000000000000e+01 2215 2067 0.00000000000000e+00 2215 2214 -8.33333333333333e+00 2215 2220 8.33333333333333e+00 2216 2216 6.25000000000000e+01 2216 2235 4.16666666666667e+00 2216 2236 4.16666666666667e+00 2216 2207 -1.87500000000000e+01 2216 2206 4.16666666666667e+00 2216 2215 -8.33333333333333e+00 2216 2205 4.16666666666667e+00 2216 2234 -6.25000000000000e+00 2216 2232 4.16666666666667e+00 2216 2220 -4.16666666666667e+00 2216 2214 -8.33333333333333e+00 2216 2071 4.16666666666667e+00 2216 2439 -4.16666666666667e+00 2216 2076 4.16666666666667e+00 2216 2221 8.33333333333333e+00 2216 2077 -8.33333333333333e+00 2216 2072 -1.87500000000000e+01 2216 1960 2.08333333333333e+00 2216 2440 -4.16666666666667e+00 2216 2070 4.16666666666667e+00 2216 1959 -4.16666666666667e+00 2216 2069 0.00000000000000e+00 2216 2233 -2.08333333333333e+00 2216 2222 -1.25000000000000e+01 2216 2068 0.00000000000000e+00 2216 1909 0.00000000000000e+00 2216 2067 0.00000000000000e+00 2216 1908 0.00000000000000e+00 2217 2217 1.00000000000000e+00 2217 2251 0.00000000000000e+00 2217 2255 0.00000000000000e+00 2217 2254 0.00000000000000e+00 2217 2210 0.00000000000000e+00 2217 2219 0.00000000000000e+00 2217 1909 0.00000000000000e+00 2217 2209 0.00000000000000e+00 2217 2208 0.00000000000000e+00 2217 1963 0.00000000000000e+00 2217 2250 0.00000000000000e+00 2217 2074 0.00000000000000e+00 2217 2075 0.00000000000000e+00 2217 2222 0.00000000000000e+00 2217 2078 0.00000000000000e+00 2217 2446 0.00000000000000e+00 2217 2077 0.00000000000000e+00 2217 1964 0.00000000000000e+00 2217 2447 0.00000000000000e+00 2217 2073 0.00000000000000e+00 2217 2069 0.00000000000000e+00 2217 1910 0.00000000000000e+00 2217 2218 0.00000000000000e+00 2217 2068 0.00000000000000e+00 2217 2221 0.00000000000000e+00 2217 2252 0.00000000000000e+00 2217 2067 0.00000000000000e+00 2217 2220 0.00000000000000e+00 2218 2218 1.00000000000000e+00 2218 2255 0.00000000000000e+00 2218 2253 0.00000000000000e+00 2218 2210 0.00000000000000e+00 2218 2209 0.00000000000000e+00 2218 1908 0.00000000000000e+00 2218 2208 0.00000000000000e+00 2218 2252 0.00000000000000e+00 2218 2251 0.00000000000000e+00 2218 1962 0.00000000000000e+00 2218 2222 0.00000000000000e+00 2218 2219 0.00000000000000e+00 2218 2073 0.00000000000000e+00 2218 2447 0.00000000000000e+00 2218 2078 0.00000000000000e+00 2218 2445 0.00000000000000e+00 2218 2076 0.00000000000000e+00 2218 1964 0.00000000000000e+00 2218 2075 0.00000000000000e+00 2218 2074 0.00000000000000e+00 2218 2069 0.00000000000000e+00 2218 1910 0.00000000000000e+00 2218 2250 0.00000000000000e+00 2218 2068 0.00000000000000e+00 2218 2221 0.00000000000000e+00 2218 2217 0.00000000000000e+00 2218 2067 0.00000000000000e+00 2218 2220 0.00000000000000e+00 2219 2219 1.00000000000000e+00 2219 2254 0.00000000000000e+00 2219 2253 0.00000000000000e+00 2219 2210 0.00000000000000e+00 2219 2209 0.00000000000000e+00 2219 2208 0.00000000000000e+00 2219 2217 0.00000000000000e+00 2219 2252 0.00000000000000e+00 2219 2251 0.00000000000000e+00 2219 2221 0.00000000000000e+00 2219 2218 0.00000000000000e+00 2219 2446 0.00000000000000e+00 2219 2077 0.00000000000000e+00 2219 2073 0.00000000000000e+00 2219 2220 0.00000000000000e+00 2219 2076 0.00000000000000e+00 2219 2075 0.00000000000000e+00 2219 1963 0.00000000000000e+00 2219 2074 0.00000000000000e+00 2219 1962 0.00000000000000e+00 2219 2445 0.00000000000000e+00 2219 2250 0.00000000000000e+00 2219 2069 0.00000000000000e+00 2219 2222 0.00000000000000e+00 2219 2068 0.00000000000000e+00 2219 1909 0.00000000000000e+00 2219 2067 0.00000000000000e+00 2219 1908 0.00000000000000e+00 2220 2220 1.25000000000000e+02 2220 2254 8.33333333333333e+00 2220 2210 0.00000000000000e+00 2220 2209 0.00000000000000e+00 2220 2253 -1.25000000000000e+01 2220 2219 0.00000000000000e+00 2220 2446 4.16666666666667e+00 2220 2218 0.00000000000000e+00 2220 2217 0.00000000000000e+00 2220 2447 4.16666666666667e+00 2220 2212 -4.16666666666667e+00 2220 2213 8.33333333333333e+00 2220 2222 -1.66666666666667e+01 2220 1910 0.00000000000000e+00 2220 2211 -1.25000000000000e+01 2220 2270 4.16666666666667e+00 2220 1967 -4.16666666666667e+00 2220 2269 -8.33333333333333e+00 2220 2207 4.16666666666667e+00 2220 2221 -1.66666666666667e+01 2220 2236 8.33333333333333e+00 2220 2206 4.16666666666667e+00 2220 1909 0.00000000000000e+00 2220 2237 8.33333333333333e+00 2220 1966 -4.16666666666667e+00 2220 2235 -3.75000000000000e+01 2220 2216 -4.16666666666667e+00 2220 2069 0.00000000000000e+00 2220 2440 4.16666666666667e+00 2220 2077 -4.16666666666667e+00 2220 2068 0.00000000000000e+00 2220 2215 8.33333333333333e+00 2220 2214 -1.25000000000000e+01 2220 2078 8.33333333333333e+00 2220 2441 -8.33333333333333e+00 2220 2076 -1.25000000000000e+01 2220 2255 -4.16666666666667e+00 2221 2221 1.25000000000000e+02 2221 2253 8.33333333333333e+00 2221 2208 0.00000000000000e+00 2221 2255 8.33333333333333e+00 2221 2254 -3.75000000000000e+01 2221 2219 0.00000000000000e+00 2221 2445 4.16666666666667e+00 2221 2218 0.00000000000000e+00 2221 2217 0.00000000000000e+00 2221 2447 -8.33333333333333e+00 2221 2211 -4.16666666666667e+00 2221 2270 4.16666666666667e+00 2221 2213 8.33333333333333e+00 2221 2212 -1.25000000000000e+01 2221 2268 -8.33333333333333e+00 2221 2237 -4.16666666666667e+00 2221 2220 -1.66666666666667e+01 2221 2235 8.33333333333333e+00 2221 2207 -8.33333333333333e+00 2221 2205 4.16666666666667e+00 2221 1908 0.00000000000000e+00 2221 2236 -1.25000000000000e+01 2221 1965 -4.16666666666667e+00 2221 2216 8.33333333333333e+00 2221 2222 -1.66666666666667e+01 2221 2078 8.33333333333333e+00 2221 2439 4.16666666666667e+00 2221 2076 -4.16666666666667e+00 2221 2069 0.00000000000000e+00 2221 1910 0.00000000000000e+00 2221 2215 -3.75000000000000e+01 2221 2067 0.00000000000000e+00 2221 2214 8.33333333333333e+00 2221 2441 4.16666666666667e+00 2221 1967 -4.16666666666667e+00 2221 2077 -1.25000000000000e+01 2221 2210 0.00000000000000e+00 2222 2222 1.25000000000000e+02 2222 2253 -4.16666666666667e+00 2222 2208 0.00000000000000e+00 2222 2255 -1.25000000000000e+01 2222 2254 8.33333333333333e+00 2222 2218 0.00000000000000e+00 2222 2217 0.00000000000000e+00 2222 2219 0.00000000000000e+00 2222 2446 -8.33333333333333e+00 2222 2445 4.16666666666667e+00 2222 2269 4.16666666666667e+00 2222 2211 8.33333333333333e+00 2222 2220 -1.66666666666667e+01 2222 2213 -3.75000000000000e+01 2222 2212 8.33333333333333e+00 2222 1908 0.00000000000000e+00 2222 2268 4.16666666666667e+00 2222 1965 -4.16666666666667e+00 2222 2205 4.16666666666667e+00 2222 2236 -4.16666666666667e+00 2222 2206 -8.33333333333333e+00 2222 2237 -1.25000000000000e+01 2222 2235 8.33333333333333e+00 2222 2214 -4.16666666666667e+00 2222 2067 0.00000000000000e+00 2222 2215 8.33333333333333e+00 2222 2221 -1.66666666666667e+01 2222 2077 8.33333333333333e+00 2222 2216 -1.25000000000000e+01 2222 2068 0.00000000000000e+00 2222 1909 0.00000000000000e+00 2222 2078 -3.75000000000000e+01 2222 2209 0.00000000000000e+00 2222 2440 4.16666666666667e+00 2222 1966 -4.16666666666667e+00 2222 2076 8.33333333333333e+00 2222 2439 -8.33333333333333e+00 2223 2223 1.25000000000000e+02 2223 2261 4.16666666666667e+00 2223 2260 -8.33333333333333e+00 2223 2230 8.33333333333333e+00 2223 2229 -3.75000000000000e+01 2223 2156 4.16666666666667e+00 2223 2155 4.16666666666667e+00 2223 2159 8.33333333333333e+00 2223 2158 -4.16666666666667e+00 2223 2157 -1.25000000000000e+01 2223 2225 -1.66666666666667e+01 2223 1913 -4.16666666666667e+00 2223 1919 -4.16666666666667e+00 2223 2273 -4.16666666666667e+00 2223 2270 4.16666666666667e+00 2223 2240 -8.33333333333333e+00 2223 2237 8.33333333333333e+00 2223 2239 4.16666666666667e+00 2223 2236 -4.16666666666667e+00 2223 2235 -1.25000000000000e+01 2223 2272 -4.16666666666667e+00 2223 2269 4.16666666666667e+00 2223 1997 -4.16666666666667e+00 2223 2207 4.16666666666667e+00 2223 1996 -4.16666666666667e+00 2223 2002 4.16666666666667e+00 2223 2206 -8.33333333333333e+00 2223 1912 8.33333333333333e+00 2223 1911 -1.25000000000000e+01 2223 2213 8.33333333333333e+00 2223 2003 -8.33333333333333e+00 2223 2212 8.33333333333333e+00 2223 2224 -1.66666666666667e+01 2223 1918 8.33333333333333e+00 2223 2211 -3.75000000000000e+01 2223 2231 8.33333333333333e+00 2223 1917 -1.25000000000000e+01 2224 2224 1.25000000000000e+02 2224 2231 -4.16666666666667e+00 2224 2259 -8.33333333333333e+00 2224 2230 -1.25000000000000e+01 2224 2229 8.33333333333333e+00 2224 2156 -8.33333333333333e+00 2224 2154 4.16666666666667e+00 2224 2159 8.33333333333333e+00 2224 2158 -1.25000000000000e+01 2224 2157 -4.16666666666667e+00 2224 2273 -4.16666666666667e+00 2224 2240 4.16666666666667e+00 2224 1913 8.33333333333333e+00 2224 2225 -1.66666666666667e+01 2224 2237 8.33333333333333e+00 2224 2236 -1.25000000000000e+01 2224 2238 4.16666666666667e+00 2224 2235 -4.16666666666667e+00 2224 1919 8.33333333333333e+00 2224 2270 -8.33333333333333e+00 2224 2271 -4.16666666666667e+00 2224 2268 4.16666666666667e+00 2224 1995 -4.16666666666667e+00 2224 2001 4.16666666666667e+00 2224 2207 4.16666666666667e+00 2224 1997 -4.16666666666667e+00 2224 1912 -3.75000000000000e+01 2224 2205 -8.33333333333333e+00 2224 1911 8.33333333333333e+00 2224 2213 -4.16666666666667e+00 2224 2003 4.16666666666667e+00 2224 2212 -1.25000000000000e+01 2224 2261 4.16666666666667e+00 2224 1918 -3.75000000000000e+01 2224 2211 8.33333333333333e+00 2224 2223 -1.66666666666667e+01 2224 1917 8.33333333333333e+00 2225 2225 1.25000000000000e+02 2225 2230 -4.16666666666667e+00 2225 2229 8.33333333333333e+00 2225 2259 4.16666666666667e+00 2225 2231 -1.25000000000000e+01 2225 2154 4.16666666666667e+00 2225 2155 -8.33333333333333e+00 2225 2159 -3.75000000000000e+01 2225 2158 8.33333333333333e+00 2225 2157 8.33333333333333e+00 2225 2223 -1.66666666666667e+01 2225 1911 -4.16666666666667e+00 2225 1917 -4.16666666666667e+00 2225 2271 -4.16666666666667e+00 2225 2268 4.16666666666667e+00 2225 2272 -4.16666666666667e+00 2225 2239 4.16666666666667e+00 2225 2237 -3.75000000000000e+01 2225 1912 8.33333333333333e+00 2225 2224 -1.66666666666667e+01 2225 2236 8.33333333333333e+00 2225 2238 -8.33333333333333e+00 2225 2235 8.33333333333333e+00 2225 1918 8.33333333333333e+00 2225 2269 -8.33333333333333e+00 2225 1995 -4.16666666666667e+00 2225 2205 4.16666666666667e+00 2225 1913 -1.25000000000000e+01 2225 2206 4.16666666666667e+00 2225 1996 -4.16666666666667e+00 2225 2213 -1.25000000000000e+01 2225 2260 4.16666666666667e+00 2225 1919 -1.25000000000000e+01 2225 2212 -4.16666666666667e+00 2225 2002 4.16666666666667e+00 2225 2211 8.33333333333333e+00 2225 2001 -8.33333333333333e+00 2226 2226 6.25000000000000e+01 2226 2231 -4.16666666666667e+00 2226 2164 -2.08333333333333e+00 2226 2155 2.08333333333333e+00 2226 2165 4.16666666666667e+00 2226 1930 4.16666666666667e+00 2226 2335 -8.33333333333333e+00 2226 2163 -6.25000000000000e+00 2226 2156 -4.16666666666667e+00 2226 2227 -8.33333333333333e+00 2226 2230 8.33333333333333e+00 2226 1912 4.16666666666667e+00 2226 2229 -1.25000000000000e+01 2226 2345 -4.16666666666667e+00 2226 2240 4.16666666666667e+00 2226 1931 4.16666666666667e+00 2226 2084 -4.16666666666667e+00 2226 2083 2.08333333333333e+00 2226 2344 -4.16666666666667e+00 2226 1929 -1.87500000000000e+01 2226 2228 -8.33333333333333e+00 2226 2081 4.16666666666667e+00 2226 1913 4.16666666666667e+00 2226 2080 -2.08333333333333e+00 2226 2239 4.16666666666667e+00 2226 2336 4.16666666666667e+00 2226 2079 -6.25000000000000e+00 2226 1911 -1.87500000000000e+01 2227 2227 6.25000000000000e+01 2227 2165 4.16666666666667e+00 2227 2231 8.33333333333333e+00 2227 2163 -2.08333333333333e+00 2227 2154 2.08333333333333e+00 2227 1931 -2.08333333333333e+00 2227 2336 4.16666666666667e+00 2227 2164 -6.25000000000000e+00 2227 1929 4.16666666666667e+00 2227 2334 -8.33333333333333e+00 2227 2156 2.08333333333333e+00 2227 1913 -2.08333333333333e+00 2227 2230 -3.75000000000000e+01 2227 2226 -8.33333333333333e+00 2227 2229 8.33333333333333e+00 2227 1911 4.16666666666667e+00 2227 2084 2.08333333333333e+00 2227 2345 -4.16666666666667e+00 2227 1930 -6.25000000000000e+00 2227 2082 2.08333333333333e+00 2227 2343 -4.16666666666667e+00 2227 2081 4.16666666666667e+00 2227 2240 -8.33333333333333e+00 2227 2228 -8.33333333333333e+00 2227 2080 -6.25000000000000e+00 2227 1912 -6.25000000000000e+00 2227 2079 -2.08333333333333e+00 2227 2238 4.16666666666667e+00 2228 2228 6.25000000000000e+01 2228 2229 -4.16666666666667e+00 2228 2227 -8.33333333333333e+00 2228 2164 4.16666666666667e+00 2228 2230 8.33333333333333e+00 2228 2165 -1.87500000000000e+01 2228 1930 -2.08333333333333e+00 2228 2335 4.16666666666667e+00 2228 2163 4.16666666666667e+00 2228 2231 -1.25000000000000e+01 2228 2155 2.08333333333333e+00 2228 1912 -2.08333333333333e+00 2228 2154 -4.16666666666667e+00 2228 2083 2.08333333333333e+00 2228 2344 -4.16666666666667e+00 2228 2343 -4.16666666666667e+00 2228 2238 4.16666666666667e+00 2228 1931 -6.25000000000000e+00 2228 1929 4.16666666666667e+00 2228 2082 -4.16666666666667e+00 2228 2334 4.16666666666667e+00 2228 2081 -1.87500000000000e+01 2228 1913 -6.25000000000000e+00 2228 2080 4.16666666666667e+00 2228 2239 -8.33333333333333e+00 2228 2226 -8.33333333333333e+00 2228 2079 4.16666666666667e+00 2228 1911 4.16666666666667e+00 2229 2229 1.25000000000000e+02 2229 2272 4.16666666666667e+00 2229 2377 -4.16666666666667e+00 2229 2240 8.33333333333333e+00 2229 2345 -8.33333333333333e+00 2229 2239 -4.16666666666667e+00 2229 2344 4.16666666666667e+00 2229 2378 -4.16666666666667e+00 2229 2238 -1.25000000000000e+01 2229 2165 4.16666666666667e+00 2229 2228 -4.16666666666667e+00 2229 2164 4.16666666666667e+00 2229 2336 8.33333333333333e+00 2229 2231 -1.66666666666667e+01 2229 2335 8.33333333333333e+00 2229 2334 -3.75000000000000e+01 2229 2227 8.33333333333333e+00 2229 2226 -1.25000000000000e+01 2229 2230 -1.66666666666667e+01 2229 2167 -4.16666666666667e+00 2229 2168 8.33333333333333e+00 2229 2159 -8.33333333333333e+00 2229 2225 8.33333333333333e+00 2229 2155 -4.16666666666667e+00 2229 2158 4.16666666666667e+00 2229 1937 4.16666666666667e+00 2229 2261 -4.16666666666667e+00 2229 1936 -8.33333333333333e+00 2229 2260 8.33333333333333e+00 2229 2166 -1.25000000000000e+01 2229 2259 -1.25000000000000e+01 2229 2156 -4.16666666666667e+00 2229 1913 4.16666666666667e+00 2229 2224 8.33333333333333e+00 2229 1912 -8.33333333333333e+00 2229 2273 4.16666666666667e+00 2229 2223 -3.75000000000000e+01 2230 2230 1.25000000000000e+02 2230 2271 4.16666666666667e+00 2230 2376 -4.16666666666667e+00 2230 2378 -4.16666666666667e+00 2230 2345 4.16666666666667e+00 2230 2238 -4.16666666666667e+00 2230 2343 4.16666666666667e+00 2230 2240 8.33333333333333e+00 2230 2239 -1.25000000000000e+01 2230 2228 8.33333333333333e+00 2230 2165 -8.33333333333333e+00 2230 2163 4.16666666666667e+00 2230 2336 -4.16666666666667e+00 2230 1937 4.16666666666667e+00 2230 2335 -1.25000000000000e+01 2230 2334 8.33333333333333e+00 2230 1913 4.16666666666667e+00 2230 2227 -3.75000000000000e+01 2230 2226 8.33333333333333e+00 2230 2225 -4.16666666666667e+00 2230 2229 -1.66666666666667e+01 2230 2166 -4.16666666666667e+00 2230 2159 4.16666666666667e+00 2230 2156 -4.16666666666667e+00 2230 2154 -4.16666666666667e+00 2230 2157 4.16666666666667e+00 2230 2168 8.33333333333333e+00 2230 2261 8.33333333333333e+00 2230 2231 -1.66666666666667e+01 2230 2167 -1.25000000000000e+01 2230 2260 -3.75000000000000e+01 2230 1935 -8.33333333333333e+00 2230 2259 8.33333333333333e+00 2230 2273 -8.33333333333333e+00 2230 2224 -1.25000000000000e+01 2230 2223 8.33333333333333e+00 2230 1911 -8.33333333333333e+00 2231 2231 1.25000000000000e+02 2231 2272 -8.33333333333333e+00 2231 2377 -4.16666666666667e+00 2231 2344 4.16666666666667e+00 2231 2238 8.33333333333333e+00 2231 2343 -8.33333333333333e+00 2231 2376 -4.16666666666667e+00 2231 2240 -3.75000000000000e+01 2231 2239 8.33333333333333e+00 2231 2163 4.16666666666667e+00 2231 2226 -4.16666666666667e+00 2231 2227 8.33333333333333e+00 2231 2164 -8.33333333333333e+00 2231 2336 -1.25000000000000e+01 2231 2335 -4.16666666666667e+00 2231 1936 4.16666666666667e+00 2231 2334 8.33333333333333e+00 2231 2229 -1.66666666666667e+01 2231 2228 -1.25000000000000e+01 2231 1912 4.16666666666667e+00 2231 2224 -4.16666666666667e+00 2231 2158 4.16666666666667e+00 2231 2155 -4.16666666666667e+00 2231 2166 8.33333333333333e+00 2231 2157 -8.33333333333333e+00 2231 2223 8.33333333333333e+00 2231 2168 -3.75000000000000e+01 2231 2261 -1.25000000000000e+01 2231 2167 8.33333333333333e+00 2231 2260 8.33333333333333e+00 2231 2230 -1.66666666666667e+01 2231 1935 4.16666666666667e+00 2231 2259 -4.16666666666667e+00 2231 2271 4.16666666666667e+00 2231 2225 -1.25000000000000e+01 2231 2154 -4.16666666666667e+00 2231 1911 4.16666666666667e+00 2232 2232 6.25000000000000e+01 2232 2233 -8.33333333333333e+00 2232 2207 -4.16666666666667e+00 2232 1912 -2.08333333333333e+00 2232 2206 2.08333333333333e+00 2232 2216 4.16666666666667e+00 2232 1960 -2.08333333333333e+00 2232 2214 -1.87500000000000e+01 2232 2440 4.16666666666667e+00 2232 2237 -4.16666666666667e+00 2232 2236 8.33333333333333e+00 2232 2235 -1.25000000000000e+01 2232 2441 4.16666666666667e+00 2232 2240 4.16666666666667e+00 2232 2444 -4.16666666666667e+00 2232 2086 2.08333333333333e+00 2232 2443 -4.16666666666667e+00 2232 1961 4.16666666666667e+00 2232 2087 -4.16666666666667e+00 2232 1959 -6.25000000000000e+00 2232 2234 -8.33333333333333e+00 2232 2081 4.16666666666667e+00 2232 1913 4.16666666666667e+00 2232 2080 4.16666666666667e+00 2232 2239 -8.33333333333333e+00 2232 2215 4.16666666666667e+00 2232 2079 -1.87500000000000e+01 2232 1911 -6.25000000000000e+00 2233 2233 6.25000000000000e+01 2233 2207 2.08333333333333e+00 2233 2214 4.16666666666667e+00 2233 2232 -8.33333333333333e+00 2233 1911 -2.08333333333333e+00 2233 2205 2.08333333333333e+00 2233 2215 -6.25000000000000e+00 2233 1959 -2.08333333333333e+00 2233 2439 4.16666666666667e+00 2233 1913 4.16666666666667e+00 2233 2234 -8.33333333333333e+00 2233 2237 8.33333333333333e+00 2233 2236 -3.75000000000000e+01 2233 2235 8.33333333333333e+00 2233 1961 4.16666666666667e+00 2233 2441 -8.33333333333333e+00 2233 2085 2.08333333333333e+00 2233 2442 -4.16666666666667e+00 2233 2087 2.08333333333333e+00 2233 2444 -4.16666666666667e+00 2233 1960 -6.25000000000000e+00 2233 2081 -2.08333333333333e+00 2233 2240 4.16666666666667e+00 2233 2216 -2.08333333333333e+00 2233 2080 -6.25000000000000e+00 2233 1912 -6.25000000000000e+00 2233 2079 4.16666666666667e+00 2233 2238 -8.33333333333333e+00 2234 2234 6.25000000000000e+01 2234 2206 2.08333333333333e+00 2234 2205 -4.16666666666667e+00 2234 2216 -6.25000000000000e+00 2234 2214 4.16666666666667e+00 2234 2237 -1.25000000000000e+01 2234 1912 4.16666666666667e+00 2234 2233 -8.33333333333333e+00 2234 2236 8.33333333333333e+00 2234 2235 -4.16666666666667e+00 2234 1960 4.16666666666667e+00 2234 2440 -8.33333333333333e+00 2234 2439 4.16666666666667e+00 2234 2238 4.16666666666667e+00 2234 2442 -4.16666666666667e+00 2234 1961 -1.87500000000000e+01 2234 2086 2.08333333333333e+00 2234 2443 -4.16666666666667e+00 2234 1959 4.16666666666667e+00 2234 2085 -4.16666666666667e+00 2234 2215 -2.08333333333333e+00 2234 2081 -6.25000000000000e+00 2234 1913 -1.87500000000000e+01 2234 2080 -2.08333333333333e+00 2234 2239 4.16666666666667e+00 2234 2232 -8.33333333333333e+00 2234 2079 4.16666666666667e+00 2234 1911 4.16666666666667e+00 2235 2235 1.25000000000000e+02 2235 2213 -8.33333333333333e+00 2235 2216 4.16666666666667e+00 2235 2207 -4.16666666666667e+00 2235 2215 -8.33333333333333e+00 2235 2221 8.33333333333333e+00 2235 2206 -4.16666666666667e+00 2235 2222 8.33333333333333e+00 2235 2220 -3.75000000000000e+01 2235 2443 4.16666666666667e+00 2235 2440 -4.16666666666667e+00 2235 2444 -8.33333333333333e+00 2235 2441 8.33333333333333e+00 2235 1913 4.16666666666667e+00 2235 2234 -4.16666666666667e+00 2235 2233 8.33333333333333e+00 2235 2236 -1.66666666666667e+01 2235 2232 -1.25000000000000e+01 2235 1967 4.16666666666667e+00 2235 2439 -1.25000000000000e+01 2235 2270 -4.16666666666667e+00 2235 2273 4.16666666666667e+00 2235 2453 -4.16666666666667e+00 2235 2239 8.33333333333333e+00 2235 2272 -8.33333333333333e+00 2235 2269 8.33333333333333e+00 2235 2240 8.33333333333333e+00 2235 2225 8.33333333333333e+00 2235 2237 -1.66666666666667e+01 2235 1912 4.16666666666667e+00 2235 2224 -4.16666666666667e+00 2235 2238 -3.75000000000000e+01 2235 2223 -1.25000000000000e+01 2235 2452 -4.16666666666667e+00 2235 1966 4.16666666666667e+00 2235 2212 4.16666666666667e+00 2235 2268 -1.25000000000000e+01 2236 2236 1.25000000000000e+02 2236 2213 4.16666666666667e+00 2236 2207 -4.16666666666667e+00 2236 2216 4.16666666666667e+00 2236 2222 -4.16666666666667e+00 2236 2214 -8.33333333333333e+00 2236 2220 8.33333333333333e+00 2236 2205 -4.16666666666667e+00 2236 2221 -1.25000000000000e+01 2236 2442 4.16666666666667e+00 2236 2439 -4.16666666666667e+00 2236 2444 4.16666666666667e+00 2236 2234 8.33333333333333e+00 2236 2233 -3.75000000000000e+01 2236 2232 8.33333333333333e+00 2236 2235 -1.66666666666667e+01 2236 2441 8.33333333333333e+00 2236 2440 -1.25000000000000e+01 2236 2237 -1.66666666666667e+01 2236 2240 -4.16666666666667e+00 2236 2238 8.33333333333333e+00 2236 2273 4.16666666666667e+00 2236 2453 -4.16666666666667e+00 2236 2271 -8.33333333333333e+00 2236 2268 8.33333333333333e+00 2236 1913 -8.33333333333333e+00 2236 2225 8.33333333333333e+00 2236 2239 -1.25000000000000e+01 2236 2224 -1.25000000000000e+01 2236 1911 4.16666666666667e+00 2236 2223 -4.16666666666667e+00 2236 2270 8.33333333333333e+00 2236 1967 -8.33333333333333e+00 2236 2211 4.16666666666667e+00 2236 2269 -3.75000000000000e+01 2236 2451 -4.16666666666667e+00 2236 1965 4.16666666666667e+00 2237 2237 1.25000000000000e+02 2237 2211 -8.33333333333333e+00 2237 2206 -4.16666666666667e+00 2237 2214 4.16666666666667e+00 2237 2205 -4.16666666666667e+00 2237 2215 4.16666666666667e+00 2237 2221 -4.16666666666667e+00 2237 2222 -1.25000000000000e+01 2237 2220 8.33333333333333e+00 2237 2443 4.16666666666667e+00 2237 2442 -8.33333333333333e+00 2237 2439 8.33333333333333e+00 2237 2234 -1.25000000000000e+01 2237 2233 8.33333333333333e+00 2237 1911 4.16666666666667e+00 2237 2232 -4.16666666666667e+00 2237 2441 -3.75000000000000e+01 2237 2440 8.33333333333333e+00 2237 1965 4.16666666666667e+00 2237 2236 -1.66666666666667e+01 2237 2268 -4.16666666666667e+00 2237 2239 -4.16666666666667e+00 2237 2271 4.16666666666667e+00 2237 2451 -4.16666666666667e+00 2237 2272 4.16666666666667e+00 2237 2452 -4.16666666666667e+00 2237 2240 -1.25000000000000e+01 2237 2225 -3.75000000000000e+01 2237 1912 -8.33333333333333e+00 2237 2224 8.33333333333333e+00 2237 2238 8.33333333333333e+00 2237 2223 8.33333333333333e+00 2237 2235 -1.66666666666667e+01 2237 2212 4.16666666666667e+00 2237 2270 -1.25000000000000e+01 2237 2269 8.33333333333333e+00 2237 1966 -8.33333333333333e+00 2238 2238 1.25000000000000e+02 2238 2230 -4.16666666666667e+00 2238 2378 4.16666666666667e+00 2238 2377 -8.33333333333333e+00 2238 2229 -1.25000000000000e+01 2238 2228 4.16666666666667e+00 2238 2344 8.33333333333333e+00 2238 2345 8.33333333333333e+00 2238 2343 -3.75000000000000e+01 2238 2227 4.16666666666667e+00 2238 2240 -1.66666666666667e+01 2238 1913 -4.16666666666667e+00 2238 1973 -4.16666666666667e+00 2238 2273 -4.16666666666667e+00 2238 2453 4.16666666666667e+00 2238 2272 8.33333333333333e+00 2238 2239 -1.66666666666667e+01 2238 2236 8.33333333333333e+00 2238 2225 -8.33333333333333e+00 2238 2237 8.33333333333333e+00 2238 1912 -4.16666666666667e+00 2238 2224 4.16666666666667e+00 2238 2235 -3.75000000000000e+01 2238 1972 -4.16666666666667e+00 2238 2452 4.16666666666667e+00 2238 2271 -1.25000000000000e+01 2238 2081 -4.16666666666667e+00 2238 2234 4.16666666666667e+00 2238 2092 4.16666666666667e+00 2238 2443 -4.16666666666667e+00 2238 2233 -8.33333333333333e+00 2238 2080 8.33333333333333e+00 2238 2079 -1.25000000000000e+01 2238 2444 8.33333333333333e+00 2238 2093 -8.33333333333333e+00 2238 2442 -1.25000000000000e+01 2238 2231 8.33333333333333e+00 2239 2239 1.25000000000000e+02 2239 2229 -4.16666666666667e+00 2239 2376 -8.33333333333333e+00 2239 2231 8.33333333333333e+00 2239 2230 -1.25000000000000e+01 2239 2345 -4.16666666666667e+00 2239 2343 8.33333333333333e+00 2239 2344 -1.25000000000000e+01 2239 2228 -8.33333333333333e+00 2239 2226 4.16666666666667e+00 2239 2225 4.16666666666667e+00 2239 2237 -4.16666666666667e+00 2239 2271 8.33333333333333e+00 2239 2238 -1.66666666666667e+01 2239 2235 8.33333333333333e+00 2239 2236 -1.25000000000000e+01 2239 1911 -4.16666666666667e+00 2239 2223 4.16666666666667e+00 2239 2273 8.33333333333333e+00 2239 2453 -8.33333333333333e+00 2239 2272 -3.75000000000000e+01 2239 1971 -4.16666666666667e+00 2239 2451 4.16666666666667e+00 2239 2081 8.33333333333333e+00 2239 2240 -1.66666666666667e+01 2239 2444 8.33333333333333e+00 2239 2091 4.16666666666667e+00 2239 2442 -4.16666666666667e+00 2239 2234 4.16666666666667e+00 2239 1913 -4.16666666666667e+00 2239 2080 -3.75000000000000e+01 2239 2232 -8.33333333333333e+00 2239 2079 8.33333333333333e+00 2239 2093 4.16666666666667e+00 2239 1973 -4.16666666666667e+00 2239 2443 -1.25000000000000e+01 2239 2378 4.16666666666667e+00 2240 2240 1.25000000000000e+02 2240 2229 8.33333333333333e+00 2240 2376 4.16666666666667e+00 2240 2231 -3.75000000000000e+01 2240 2230 8.33333333333333e+00 2240 2344 -4.16666666666667e+00 2240 2226 4.16666666666667e+00 2240 2345 -1.25000000000000e+01 2240 2343 8.33333333333333e+00 2240 2227 -8.33333333333333e+00 2240 2238 -1.66666666666667e+01 2240 1911 -4.16666666666667e+00 2240 1971 -4.16666666666667e+00 2240 2224 4.16666666666667e+00 2240 2236 -4.16666666666667e+00 2240 2271 -4.16666666666667e+00 2240 2451 4.16666666666667e+00 2240 2237 -1.25000000000000e+01 2240 2223 -8.33333333333333e+00 2240 2235 8.33333333333333e+00 2240 2273 -1.25000000000000e+01 2240 2272 8.33333333333333e+00 2240 2452 -8.33333333333333e+00 2240 2079 -4.16666666666667e+00 2240 2232 4.16666666666667e+00 2240 2080 8.33333333333333e+00 2240 2239 -1.66666666666667e+01 2240 2443 8.33333333333333e+00 2240 2081 -1.25000000000000e+01 2240 2233 4.16666666666667e+00 2240 1912 -4.16666666666667e+00 2240 2444 -3.75000000000000e+01 2240 2377 4.16666666666667e+00 2240 2092 4.16666666666667e+00 2240 1972 -4.16666666666667e+00 2240 2442 8.33333333333333e+00 2240 2091 -8.33333333333333e+00 2241 2241 1.25000000000000e+02 2241 2249 -4.16666666666667e+00 2241 2263 -8.33333333333333e+00 2241 2248 8.33333333333333e+00 2241 2247 -1.25000000000000e+01 2241 2174 0.00000000000000e+00 2241 2173 0.00000000000000e+00 2241 2177 8.33333333333333e+00 2241 2176 -4.16666666666667e+00 2241 2175 -1.25000000000000e+01 2241 2276 -4.16666666666667e+00 2241 2258 4.16666666666667e+00 2241 1916 0.00000000000000e+00 2241 2243 -1.66666666666667e+01 2241 2255 8.33333333333333e+00 2241 2257 4.16666666666667e+00 2241 2254 -4.16666666666667e+00 2241 2253 -1.25000000000000e+01 2241 1919 8.33333333333333e+00 2241 2270 -8.33333333333333e+00 2241 2275 -4.16666666666667e+00 2241 2269 4.16666666666667e+00 2241 1999 0.00000000000000e+00 2241 2002 4.16666666666667e+00 2241 2210 0.00000000000000e+00 2241 2000 0.00000000000000e+00 2241 1915 0.00000000000000e+00 2241 2209 0.00000000000000e+00 2241 1914 0.00000000000000e+00 2241 2213 -4.16666666666667e+00 2241 2003 4.16666666666667e+00 2241 2242 -1.66666666666667e+01 2241 2212 8.33333333333333e+00 2241 1918 8.33333333333333e+00 2241 2264 4.16666666666667e+00 2241 2211 -1.25000000000000e+01 2241 1917 -3.75000000000000e+01 2242 2242 1.25000000000000e+02 2242 2264 4.16666666666667e+00 2242 2262 -8.33333333333333e+00 2242 2248 -3.75000000000000e+01 2242 2247 8.33333333333333e+00 2242 2174 0.00000000000000e+00 2242 2172 0.00000000000000e+00 2242 2177 8.33333333333333e+00 2242 2176 -1.25000000000000e+01 2242 2175 -4.16666666666667e+00 2242 2243 -1.66666666666667e+01 2242 1919 -4.16666666666667e+00 2242 1916 0.00000000000000e+00 2242 2270 4.16666666666667e+00 2242 2276 -4.16666666666667e+00 2242 2258 -8.33333333333333e+00 2242 2255 8.33333333333333e+00 2242 2254 -1.25000000000000e+01 2242 2256 4.16666666666667e+00 2242 2253 -4.16666666666667e+00 2242 2274 -4.16666666666667e+00 2242 2268 4.16666666666667e+00 2242 2210 0.00000000000000e+00 2242 2000 0.00000000000000e+00 2242 1998 0.00000000000000e+00 2242 2001 4.16666666666667e+00 2242 1915 0.00000000000000e+00 2242 1914 0.00000000000000e+00 2242 2208 0.00000000000000e+00 2242 2213 8.33333333333333e+00 2242 2003 -8.33333333333333e+00 2242 2249 8.33333333333333e+00 2242 2212 -3.75000000000000e+01 2242 1918 -1.25000000000000e+01 2242 2241 -1.66666666666667e+01 2242 2211 8.33333333333333e+00 2242 1917 8.33333333333333e+00 2243 2243 1.25000000000000e+02 2243 2247 -4.16666666666667e+00 2243 2248 8.33333333333333e+00 2243 2263 4.16666666666667e+00 2243 2249 -1.25000000000000e+01 2243 2173 0.00000000000000e+00 2243 2172 0.00000000000000e+00 2243 2177 -3.75000000000000e+01 2243 2176 8.33333333333333e+00 2243 2175 8.33333333333333e+00 2243 2242 -1.66666666666667e+01 2243 1918 -4.16666666666667e+00 2243 1915 0.00000000000000e+00 2243 2269 4.16666666666667e+00 2243 2275 -4.16666666666667e+00 2243 2274 -4.16666666666667e+00 2243 2256 4.16666666666667e+00 2243 2255 -3.75000000000000e+01 2243 2257 -8.33333333333333e+00 2243 2254 8.33333333333333e+00 2243 1914 0.00000000000000e+00 2243 2241 -1.66666666666667e+01 2243 2253 8.33333333333333e+00 2243 1917 8.33333333333333e+00 2243 2268 -8.33333333333333e+00 2243 2209 0.00000000000000e+00 2243 1999 0.00000000000000e+00 2243 1916 0.00000000000000e+00 2243 2208 0.00000000000000e+00 2243 1998 0.00000000000000e+00 2243 2262 4.16666666666667e+00 2243 2213 -1.25000000000000e+01 2243 1919 -1.25000000000000e+01 2243 2212 8.33333333333333e+00 2243 2002 -8.33333333333333e+00 2243 2211 -4.16666666666667e+00 2243 2001 4.16666666666667e+00 2244 2244 1.00000000000000e+00 2244 2246 0.00000000000000e+00 2244 2249 0.00000000000000e+00 2244 2182 0.00000000000000e+00 2244 2173 0.00000000000000e+00 2244 2411 0.00000000000000e+00 2244 1946 0.00000000000000e+00 2244 2410 0.00000000000000e+00 2244 1945 0.00000000000000e+00 2244 2181 0.00000000000000e+00 2244 2174 0.00000000000000e+00 2244 1916 0.00000000000000e+00 2244 2248 0.00000000000000e+00 2244 2245 0.00000000000000e+00 2244 1915 0.00000000000000e+00 2244 2247 0.00000000000000e+00 2244 2414 0.00000000000000e+00 2244 2108 0.00000000000000e+00 2244 2107 0.00000000000000e+00 2244 2413 0.00000000000000e+00 2244 1944 0.00000000000000e+00 2244 2105 0.00000000000000e+00 2244 2258 0.00000000000000e+00 2244 2104 0.00000000000000e+00 2244 2257 0.00000000000000e+00 2244 2103 0.00000000000000e+00 2244 2183 0.00000000000000e+00 2244 1914 0.00000000000000e+00 2245 2245 1.00000000000000e+00 2245 2249 0.00000000000000e+00 2245 2181 0.00000000000000e+00 2245 2172 0.00000000000000e+00 2245 2183 0.00000000000000e+00 2245 2182 0.00000000000000e+00 2245 2409 0.00000000000000e+00 2245 1944 0.00000000000000e+00 2245 2174 0.00000000000000e+00 2245 2248 0.00000000000000e+00 2245 2247 0.00000000000000e+00 2245 2244 0.00000000000000e+00 2245 1914 0.00000000000000e+00 2245 2414 0.00000000000000e+00 2245 2258 0.00000000000000e+00 2245 2108 0.00000000000000e+00 2245 1946 0.00000000000000e+00 2245 1945 0.00000000000000e+00 2245 2106 0.00000000000000e+00 2245 2412 0.00000000000000e+00 2245 2105 0.00000000000000e+00 2245 2246 0.00000000000000e+00 2245 1916 0.00000000000000e+00 2245 2104 0.00000000000000e+00 2245 2411 0.00000000000000e+00 2245 1915 0.00000000000000e+00 2245 2103 0.00000000000000e+00 2245 2256 0.00000000000000e+00 2246 2246 1.00000000000000e+00 2246 2248 0.00000000000000e+00 2246 2181 0.00000000000000e+00 2246 2244 0.00000000000000e+00 2246 2247 0.00000000000000e+00 2246 2183 0.00000000000000e+00 2246 2182 0.00000000000000e+00 2246 2409 0.00000000000000e+00 2246 1944 0.00000000000000e+00 2246 2249 0.00000000000000e+00 2246 2173 0.00000000000000e+00 2246 2172 0.00000000000000e+00 2246 1914 0.00000000000000e+00 2246 2412 0.00000000000000e+00 2246 2106 0.00000000000000e+00 2246 2413 0.00000000000000e+00 2246 2257 0.00000000000000e+00 2246 1946 0.00000000000000e+00 2246 2107 0.00000000000000e+00 2246 1945 0.00000000000000e+00 2246 2105 0.00000000000000e+00 2246 2410 0.00000000000000e+00 2246 1916 0.00000000000000e+00 2246 2104 0.00000000000000e+00 2246 2245 0.00000000000000e+00 2246 1915 0.00000000000000e+00 2246 2103 0.00000000000000e+00 2246 2256 0.00000000000000e+00 2247 2247 1.25000000000000e+02 2247 2275 4.16666666666667e+00 2247 2419 -4.16666666666667e+00 2247 2414 4.16666666666667e+00 2247 2420 -4.16666666666667e+00 2247 2413 4.16666666666667e+00 2247 2257 -4.16666666666667e+00 2247 2258 8.33333333333333e+00 2247 2256 -1.25000000000000e+01 2247 2183 0.00000000000000e+00 2247 2246 0.00000000000000e+00 2247 2182 0.00000000000000e+00 2247 1949 4.16666666666667e+00 2247 2411 -4.16666666666667e+00 2247 2410 8.33333333333333e+00 2247 2409 -1.25000000000000e+01 2247 1916 0.00000000000000e+00 2247 2245 0.00000000000000e+00 2247 2244 0.00000000000000e+00 2247 2243 -4.16666666666667e+00 2247 2248 -1.66666666666667e+01 2247 2185 -4.16666666666667e+00 2247 2177 4.16666666666667e+00 2247 2174 0.00000000000000e+00 2247 2176 4.16666666666667e+00 2247 2173 0.00000000000000e+00 2247 2186 8.33333333333333e+00 2247 2264 8.33333333333333e+00 2247 2249 -1.66666666666667e+01 2247 1948 -8.33333333333333e+00 2247 2263 8.33333333333333e+00 2247 2184 -1.25000000000000e+01 2247 2262 -3.75000000000000e+01 2247 2242 8.33333333333333e+00 2247 1915 0.00000000000000e+00 2247 2276 -8.33333333333333e+00 2247 2241 -1.25000000000000e+01 2248 2248 1.25000000000000e+02 2248 2274 4.16666666666667e+00 2248 2418 -4.16666666666667e+00 2248 2414 -8.33333333333333e+00 2248 2258 8.33333333333333e+00 2248 2412 4.16666666666667e+00 2248 2256 -4.16666666666667e+00 2248 2420 -4.16666666666667e+00 2248 2257 -1.25000000000000e+01 2248 2183 0.00000000000000e+00 2248 2246 0.00000000000000e+00 2248 2181 0.00000000000000e+00 2248 2411 8.33333333333333e+00 2248 2249 -1.66666666666667e+01 2248 2410 -3.75000000000000e+01 2248 2409 8.33333333333333e+00 2248 2245 0.00000000000000e+00 2248 2244 0.00000000000000e+00 2248 2247 -1.66666666666667e+01 2248 2184 -4.16666666666667e+00 2248 2186 8.33333333333333e+00 2248 2177 -8.33333333333333e+00 2248 2243 8.33333333333333e+00 2248 2175 4.16666666666667e+00 2248 2172 0.00000000000000e+00 2248 1949 4.16666666666667e+00 2248 2264 -4.16666666666667e+00 2248 2185 -1.25000000000000e+01 2248 2263 -1.25000000000000e+01 2248 1947 -8.33333333333333e+00 2248 2262 8.33333333333333e+00 2248 2174 0.00000000000000e+00 2248 1916 0.00000000000000e+00 2248 2276 4.16666666666667e+00 2248 2242 -3.75000000000000e+01 2248 2241 8.33333333333333e+00 2248 1914 0.00000000000000e+00 2249 2249 1.25000000000000e+02 2249 2274 -8.33333333333333e+00 2249 2412 4.16666666666667e+00 2249 2418 -4.16666666666667e+00 2249 2413 -8.33333333333333e+00 2249 2257 8.33333333333333e+00 2249 2419 -4.16666666666667e+00 2249 2258 -3.75000000000000e+01 2249 2256 8.33333333333333e+00 2249 2182 0.00000000000000e+00 2249 2245 0.00000000000000e+00 2249 2181 0.00000000000000e+00 2249 2244 0.00000000000000e+00 2249 2411 -1.25000000000000e+01 2249 2410 8.33333333333333e+00 2249 2248 -1.66666666666667e+01 2249 1947 4.16666666666667e+00 2249 2409 -4.16666666666667e+00 2249 2246 0.00000000000000e+00 2249 1914 0.00000000000000e+00 2249 2241 -4.16666666666667e+00 2249 2185 8.33333333333333e+00 2249 2175 4.16666666666667e+00 2249 2172 0.00000000000000e+00 2249 2176 -8.33333333333333e+00 2249 2242 8.33333333333333e+00 2249 2186 -3.75000000000000e+01 2249 2264 -1.25000000000000e+01 2249 1948 4.16666666666667e+00 2249 2263 -4.16666666666667e+00 2249 2184 8.33333333333333e+00 2249 2262 8.33333333333333e+00 2249 2247 -1.66666666666667e+01 2249 2275 4.16666666666667e+00 2249 2243 -1.25000000000000e+01 2249 2173 0.00000000000000e+00 2249 1915 0.00000000000000e+00 2250 2250 1.00000000000000e+00 2250 2210 0.00000000000000e+00 2250 2251 0.00000000000000e+00 2250 2218 0.00000000000000e+00 2250 2209 0.00000000000000e+00 2250 1915 0.00000000000000e+00 2250 1963 0.00000000000000e+00 2250 2217 0.00000000000000e+00 2250 2446 0.00000000000000e+00 2250 1964 0.00000000000000e+00 2250 2447 0.00000000000000e+00 2250 2252 0.00000000000000e+00 2250 1916 0.00000000000000e+00 2250 2255 0.00000000000000e+00 2250 2254 0.00000000000000e+00 2250 2253 0.00000000000000e+00 2250 2110 0.00000000000000e+00 2250 2449 0.00000000000000e+00 2250 2111 0.00000000000000e+00 2250 2450 0.00000000000000e+00 2250 1962 0.00000000000000e+00 2250 2105 0.00000000000000e+00 2250 2258 0.00000000000000e+00 2250 2104 0.00000000000000e+00 2250 2257 0.00000000000000e+00 2250 2103 0.00000000000000e+00 2250 2219 0.00000000000000e+00 2250 1914 0.00000000000000e+00 2251 2251 1.00000000000000e+00 2251 2217 0.00000000000000e+00 2251 2210 0.00000000000000e+00 2251 2208 0.00000000000000e+00 2251 1914 0.00000000000000e+00 2251 2219 0.00000000000000e+00 2251 2218 0.00000000000000e+00 2251 1962 0.00000000000000e+00 2251 2445 0.00000000000000e+00 2251 2447 0.00000000000000e+00 2251 2255 0.00000000000000e+00 2251 2254 0.00000000000000e+00 2251 2253 0.00000000000000e+00 2251 2258 0.00000000000000e+00 2251 2450 0.00000000000000e+00 2251 2109 0.00000000000000e+00 2251 2448 0.00000000000000e+00 2251 2111 0.00000000000000e+00 2251 1964 0.00000000000000e+00 2251 1963 0.00000000000000e+00 2251 2105 0.00000000000000e+00 2251 2252 0.00000000000000e+00 2251 1916 0.00000000000000e+00 2251 2104 0.00000000000000e+00 2251 2250 0.00000000000000e+00 2251 1915 0.00000000000000e+00 2251 2103 0.00000000000000e+00 2251 2256 0.00000000000000e+00 2252 2252 1.00000000000000e+00 2252 2208 0.00000000000000e+00 2252 2209 0.00000000000000e+00 2252 2219 0.00000000000000e+00 2252 2218 0.00000000000000e+00 2252 2446 0.00000000000000e+00 2252 1962 0.00000000000000e+00 2252 2445 0.00000000000000e+00 2252 2255 0.00000000000000e+00 2252 2254 0.00000000000000e+00 2252 2250 0.00000000000000e+00 2252 1914 0.00000000000000e+00 2252 2253 0.00000000000000e+00 2252 2257 0.00000000000000e+00 2252 2449 0.00000000000000e+00 2252 1964 0.00000000000000e+00 2252 2110 0.00000000000000e+00 2252 1963 0.00000000000000e+00 2252 2109 0.00000000000000e+00 2252 2448 0.00000000000000e+00 2252 2105 0.00000000000000e+00 2252 2217 0.00000000000000e+00 2252 1916 0.00000000000000e+00 2252 2104 0.00000000000000e+00 2252 2251 0.00000000000000e+00 2252 1915 0.00000000000000e+00 2252 2103 0.00000000000000e+00 2252 2256 0.00000000000000e+00 2253 2253 1.25000000000000e+02 2253 2213 4.16666666666667e+00 2253 2210 0.00000000000000e+00 2253 2222 -4.16666666666667e+00 2253 2219 0.00000000000000e+00 2253 2221 8.33333333333333e+00 2253 2218 0.00000000000000e+00 2253 2209 0.00000000000000e+00 2253 2220 -1.25000000000000e+01 2253 2449 4.16666666666667e+00 2253 2446 -4.16666666666667e+00 2253 2450 4.16666666666667e+00 2253 2252 0.00000000000000e+00 2253 2251 0.00000000000000e+00 2253 2254 -1.66666666666667e+01 2253 2250 0.00000000000000e+00 2253 2447 8.33333333333333e+00 2253 2445 -1.25000000000000e+01 2253 2255 -1.66666666666667e+01 2253 2258 -4.16666666666667e+00 2253 2257 8.33333333333333e+00 2253 2456 -4.16666666666667e+00 2253 2276 4.16666666666667e+00 2253 2275 -8.33333333333333e+00 2253 2269 8.33333333333333e+00 2253 1916 0.00000000000000e+00 2253 2243 8.33333333333333e+00 2253 1915 0.00000000000000e+00 2253 2242 -4.16666666666667e+00 2253 2256 -1.25000000000000e+01 2253 2241 -1.25000000000000e+01 2253 2270 8.33333333333333e+00 2253 1967 -8.33333333333333e+00 2253 2455 -4.16666666666667e+00 2253 1966 4.16666666666667e+00 2253 2212 4.16666666666667e+00 2253 2268 -3.75000000000000e+01 2254 2254 1.25000000000000e+02 2254 2213 -8.33333333333333e+00 2254 2210 0.00000000000000e+00 2254 2219 0.00000000000000e+00 2254 2220 8.33333333333333e+00 2254 2217 0.00000000000000e+00 2254 2208 0.00000000000000e+00 2254 2222 8.33333333333333e+00 2254 2221 -3.75000000000000e+01 2254 2448 4.16666666666667e+00 2254 2445 -4.16666666666667e+00 2254 2447 8.33333333333333e+00 2254 2450 -8.33333333333333e+00 2254 2252 0.00000000000000e+00 2254 1916 0.00000000000000e+00 2254 2251 0.00000000000000e+00 2254 2250 0.00000000000000e+00 2254 2253 -1.66666666666667e+01 2254 1967 4.16666666666667e+00 2254 2446 -1.25000000000000e+01 2254 2270 -4.16666666666667e+00 2254 2276 4.16666666666667e+00 2254 2456 -4.16666666666667e+00 2254 2256 8.33333333333333e+00 2254 2274 -8.33333333333333e+00 2254 2268 8.33333333333333e+00 2254 2258 8.33333333333333e+00 2254 2243 8.33333333333333e+00 2254 2255 -1.66666666666667e+01 2254 2257 -3.75000000000000e+01 2254 2242 -1.25000000000000e+01 2254 1914 0.00000000000000e+00 2254 2241 -4.16666666666667e+00 2254 2211 4.16666666666667e+00 2254 2269 -1.25000000000000e+01 2254 2454 -4.16666666666667e+00 2254 1965 4.16666666666667e+00 2255 2255 1.25000000000000e+02 2255 2211 4.16666666666667e+00 2255 2208 0.00000000000000e+00 2255 2209 0.00000000000000e+00 2255 2218 0.00000000000000e+00 2255 2220 -4.16666666666667e+00 2255 2217 0.00000000000000e+00 2255 2222 -1.25000000000000e+01 2255 2221 8.33333333333333e+00 2255 2446 8.33333333333333e+00 2255 2449 -8.33333333333333e+00 2255 2448 4.16666666666667e+00 2255 2252 0.00000000000000e+00 2255 2251 0.00000000000000e+00 2255 1915 0.00000000000000e+00 2255 2250 0.00000000000000e+00 2255 2447 -3.75000000000000e+01 2255 1966 4.16666666666667e+00 2255 2445 8.33333333333333e+00 2255 2269 -4.16666666666667e+00 2255 2253 -1.66666666666667e+01 2255 2256 -4.16666666666667e+00 2255 2275 4.16666666666667e+00 2255 2455 -4.16666666666667e+00 2255 2454 -4.16666666666667e+00 2255 2274 4.16666666666667e+00 2255 2258 -1.25000000000000e+01 2255 2243 -3.75000000000000e+01 2255 2257 8.33333333333333e+00 2255 2242 8.33333333333333e+00 2255 2254 -1.66666666666667e+01 2255 1914 0.00000000000000e+00 2255 2241 8.33333333333333e+00 2255 2212 -8.33333333333333e+00 2255 2270 -1.25000000000000e+01 2255 2268 8.33333333333333e+00 2255 1965 -8.33333333333333e+00 2256 2256 1.25000000000000e+02 2256 2248 -4.16666666666667e+00 2256 2419 -8.33333333333333e+00 2256 2249 8.33333333333333e+00 2256 2247 -1.25000000000000e+01 2256 2414 -4.16666666666667e+00 2256 2413 8.33333333333333e+00 2256 2412 -1.25000000000000e+01 2256 2246 0.00000000000000e+00 2256 2245 0.00000000000000e+00 2256 2243 4.16666666666667e+00 2256 2255 -4.16666666666667e+00 2256 2257 -1.66666666666667e+01 2256 2275 8.33333333333333e+00 2256 2254 8.33333333333333e+00 2256 2276 8.33333333333333e+00 2256 2456 -8.33333333333333e+00 2256 1978 -4.16666666666667e+00 2256 2455 4.16666666666667e+00 2256 2274 -3.75000000000000e+01 2256 1915 0.00000000000000e+00 2256 2242 4.16666666666667e+00 2256 2253 -1.25000000000000e+01 2256 2105 0.00000000000000e+00 2256 2258 -1.66666666666667e+01 2256 2450 8.33333333333333e+00 2256 2113 4.16666666666667e+00 2256 2449 -4.16666666666667e+00 2256 2252 0.00000000000000e+00 2256 1916 0.00000000000000e+00 2256 2104 0.00000000000000e+00 2256 2251 0.00000000000000e+00 2256 2103 0.00000000000000e+00 2256 2114 4.16666666666667e+00 2256 1979 -4.16666666666667e+00 2256 2448 -1.25000000000000e+01 2256 2420 4.16666666666667e+00 2257 2257 1.25000000000000e+02 2257 2247 -4.16666666666667e+00 2257 2420 4.16666666666667e+00 2257 2418 -8.33333333333333e+00 2257 2248 -1.25000000000000e+01 2257 2246 0.00000000000000e+00 2257 2412 8.33333333333333e+00 2257 2414 8.33333333333333e+00 2257 2413 -3.75000000000000e+01 2257 2244 0.00000000000000e+00 2257 2258 -1.66666666666667e+01 2257 1916 0.00000000000000e+00 2257 1979 -4.16666666666667e+00 2257 2276 -4.16666666666667e+00 2257 2456 4.16666666666667e+00 2257 2256 -1.66666666666667e+01 2257 2274 8.33333333333333e+00 2257 2253 8.33333333333333e+00 2257 2275 -1.25000000000000e+01 2257 1977 -4.16666666666667e+00 2257 2454 4.16666666666667e+00 2257 2243 -8.33333333333333e+00 2257 2255 8.33333333333333e+00 2257 2254 -3.75000000000000e+01 2257 1914 0.00000000000000e+00 2257 2241 4.16666666666667e+00 2257 2105 0.00000000000000e+00 2257 2252 0.00000000000000e+00 2257 2112 4.16666666666667e+00 2257 2448 -4.16666666666667e+00 2257 2104 0.00000000000000e+00 2257 2103 0.00000000000000e+00 2257 2250 0.00000000000000e+00 2257 2114 -8.33333333333333e+00 2257 2450 8.33333333333333e+00 2257 2449 -1.25000000000000e+01 2257 2249 8.33333333333333e+00 2258 2258 1.25000000000000e+02 2258 2248 8.33333333333333e+00 2258 2419 4.16666666666667e+00 2258 2249 -3.75000000000000e+01 2258 2247 8.33333333333333e+00 2258 2412 -4.16666666666667e+00 2258 2245 0.00000000000000e+00 2258 2414 -1.25000000000000e+01 2258 2413 8.33333333333333e+00 2258 2244 0.00000000000000e+00 2258 2257 -1.66666666666667e+01 2258 1915 0.00000000000000e+00 2258 1978 -4.16666666666667e+00 2258 2241 4.16666666666667e+00 2258 2253 -4.16666666666667e+00 2258 2275 -4.16666666666667e+00 2258 2455 4.16666666666667e+00 2258 2276 -1.25000000000000e+01 2258 2274 8.33333333333333e+00 2258 2454 -8.33333333333333e+00 2258 2255 -1.25000000000000e+01 2258 2242 -8.33333333333333e+00 2258 2254 8.33333333333333e+00 2258 2104 0.00000000000000e+00 2258 2251 0.00000000000000e+00 2258 2103 0.00000000000000e+00 2258 2256 -1.66666666666667e+01 2258 2448 8.33333333333333e+00 2258 2105 0.00000000000000e+00 2258 2250 0.00000000000000e+00 2258 1914 0.00000000000000e+00 2258 2450 -3.75000000000000e+01 2258 2418 4.16666666666667e+00 2258 2113 -8.33333333333333e+00 2258 2449 8.33333333333333e+00 2258 2112 4.16666666666667e+00 2258 1977 -4.16666666666667e+00 2259 2259 1.25000000000000e+02 2259 2194 -4.16666666666667e+00 2259 2189 -8.33333333333333e+00 2259 2195 8.33333333333333e+00 2259 2193 -1.25000000000000e+01 2259 2372 4.16666666666667e+00 2259 2371 -8.33333333333333e+00 2259 2267 -4.16666666666667e+00 2259 2266 8.33333333333333e+00 2259 2265 -1.25000000000000e+01 2259 2158 -4.16666666666667e+00 2259 2167 4.16666666666667e+00 2259 2168 4.16666666666667e+00 2259 2231 -4.16666666666667e+00 2259 1936 8.33333333333333e+00 2259 2260 -1.66666666666667e+01 2259 2230 8.33333333333333e+00 2259 2229 -1.25000000000000e+01 2259 2159 -4.16666666666667e+00 2259 2225 4.16666666666667e+00 2259 1918 8.33333333333333e+00 2259 2224 -8.33333333333333e+00 2259 2120 -4.16666666666667e+00 2259 2117 4.16666666666667e+00 2259 1937 8.33333333333333e+00 2259 2378 -8.33333333333333e+00 2259 2377 4.16666666666667e+00 2259 2119 -4.16666666666667e+00 2259 1935 -3.75000000000000e+01 2259 2261 -1.66666666666667e+01 2259 2273 8.33333333333333e+00 2259 1919 8.33333333333333e+00 2259 2272 -4.16666666666667e+00 2259 2116 4.16666666666667e+00 2259 2188 4.16666666666667e+00 2259 2271 -1.25000000000000e+01 2259 1917 -3.75000000000000e+01 2260 2260 1.25000000000000e+02 2260 2193 -4.16666666666667e+00 2260 2195 8.33333333333333e+00 2260 2189 4.16666666666667e+00 2260 2194 -1.25000000000000e+01 2260 2372 4.16666666666667e+00 2260 2370 -8.33333333333333e+00 2260 2267 8.33333333333333e+00 2260 2266 -3.75000000000000e+01 2260 2265 8.33333333333333e+00 2260 2261 -1.66666666666667e+01 2260 1919 -4.16666666666667e+00 2260 1937 -4.16666666666667e+00 2260 2225 4.16666666666667e+00 2260 2159 -4.16666666666667e+00 2260 2157 -4.16666666666667e+00 2260 2166 4.16666666666667e+00 2260 2168 -8.33333333333333e+00 2260 2231 8.33333333333333e+00 2260 2230 -3.75000000000000e+01 2260 1935 8.33333333333333e+00 2260 2259 -1.66666666666667e+01 2260 2229 8.33333333333333e+00 2260 1917 8.33333333333333e+00 2260 2223 -8.33333333333333e+00 2260 2378 4.16666666666667e+00 2260 2120 -4.16666666666667e+00 2260 1936 -1.25000000000000e+01 2260 2376 4.16666666666667e+00 2260 2118 -4.16666666666667e+00 2260 2273 8.33333333333333e+00 2260 2117 -8.33333333333333e+00 2260 2187 4.16666666666667e+00 2260 2272 -1.25000000000000e+01 2260 1918 -1.25000000000000e+01 2260 2271 -4.16666666666667e+00 2260 2115 4.16666666666667e+00 2261 2261 1.25000000000000e+02 2261 2188 4.16666666666667e+00 2261 2187 -8.33333333333333e+00 2261 2195 -3.75000000000000e+01 2261 2193 8.33333333333333e+00 2261 2371 4.16666666666667e+00 2261 2370 4.16666666666667e+00 2261 2267 -1.25000000000000e+01 2261 2266 8.33333333333333e+00 2261 2265 -4.16666666666667e+00 2261 2260 -1.66666666666667e+01 2261 1918 -4.16666666666667e+00 2261 1936 -4.16666666666667e+00 2261 2224 4.16666666666667e+00 2261 2158 -4.16666666666667e+00 2261 2231 -1.25000000000000e+01 2261 2167 -8.33333333333333e+00 2261 2230 8.33333333333333e+00 2261 2166 4.16666666666667e+00 2261 2229 -4.16666666666667e+00 2261 2157 -4.16666666666667e+00 2261 2223 4.16666666666667e+00 2261 2377 4.16666666666667e+00 2261 2119 -4.16666666666667e+00 2261 2118 -4.16666666666667e+00 2261 2115 4.16666666666667e+00 2261 1937 -1.25000000000000e+01 2261 1935 8.33333333333333e+00 2261 2376 -8.33333333333333e+00 2261 2194 8.33333333333333e+00 2261 2273 -3.75000000000000e+01 2261 1919 -1.25000000000000e+01 2261 2272 8.33333333333333e+00 2261 2116 -8.33333333333333e+00 2261 2259 -1.66666666666667e+01 2261 2271 8.33333333333333e+00 2261 1917 8.33333333333333e+00 2262 2262 1.25000000000000e+02 2262 2200 -4.16666666666667e+00 2262 2201 8.33333333333333e+00 2262 2189 4.16666666666667e+00 2262 2199 -1.25000000000000e+01 2262 2417 4.16666666666667e+00 2262 2416 -8.33333333333333e+00 2262 2267 8.33333333333333e+00 2262 2266 8.33333333333333e+00 2262 2265 -3.75000000000000e+01 2262 2264 -1.66666666666667e+01 2262 1949 -4.16666666666667e+00 2262 1919 -4.16666666666667e+00 2262 2177 -4.16666666666667e+00 2262 2243 4.16666666666667e+00 2262 2176 -4.16666666666667e+00 2262 2185 4.16666666666667e+00 2262 2186 -8.33333333333333e+00 2262 2249 8.33333333333333e+00 2262 1948 8.33333333333333e+00 2262 2263 -1.66666666666667e+01 2262 2248 8.33333333333333e+00 2262 2247 -3.75000000000000e+01 2262 1918 8.33333333333333e+00 2262 2242 -8.33333333333333e+00 2262 2123 -4.16666666666667e+00 2262 2420 4.16666666666667e+00 2262 2419 4.16666666666667e+00 2262 2122 -4.16666666666667e+00 2262 1947 -1.25000000000000e+01 2262 2276 8.33333333333333e+00 2262 2117 -8.33333333333333e+00 2262 2275 -4.16666666666667e+00 2262 2116 4.16666666666667e+00 2262 2274 -1.25000000000000e+01 2262 2188 4.16666666666667e+00 2262 1917 -1.25000000000000e+01 2263 2263 1.25000000000000e+02 2263 2199 -4.16666666666667e+00 2263 2189 -8.33333333333333e+00 2263 2201 8.33333333333333e+00 2263 2200 -1.25000000000000e+01 2263 2417 4.16666666666667e+00 2263 2415 -8.33333333333333e+00 2263 2267 -4.16666666666667e+00 2263 2266 -1.25000000000000e+01 2263 2265 8.33333333333333e+00 2263 2175 -4.16666666666667e+00 2263 2184 4.16666666666667e+00 2263 2186 4.16666666666667e+00 2263 2249 -4.16666666666667e+00 2263 2248 -1.25000000000000e+01 2263 1947 8.33333333333333e+00 2263 2262 -1.66666666666667e+01 2263 2247 8.33333333333333e+00 2263 2177 -4.16666666666667e+00 2263 2243 4.16666666666667e+00 2263 1917 8.33333333333333e+00 2263 2241 -8.33333333333333e+00 2263 2123 -4.16666666666667e+00 2263 2117 4.16666666666667e+00 2263 2420 -8.33333333333333e+00 2263 1949 8.33333333333333e+00 2263 1948 -3.75000000000000e+01 2263 2418 4.16666666666667e+00 2263 2121 -4.16666666666667e+00 2263 2276 8.33333333333333e+00 2263 2264 -1.66666666666667e+01 2263 1919 8.33333333333333e+00 2263 2275 -1.25000000000000e+01 2263 2187 4.16666666666667e+00 2263 1918 -3.75000000000000e+01 2263 2274 -4.16666666666667e+00 2263 2115 4.16666666666667e+00 2264 2264 1.25000000000000e+02 2264 2188 -8.33333333333333e+00 2264 2187 4.16666666666667e+00 2264 2201 -3.75000000000000e+01 2264 2200 8.33333333333333e+00 2264 2415 4.16666666666667e+00 2264 2416 4.16666666666667e+00 2264 2267 -1.25000000000000e+01 2264 2266 -4.16666666666667e+00 2264 2265 8.33333333333333e+00 2264 2262 -1.66666666666667e+01 2264 1947 -4.16666666666667e+00 2264 1917 -4.16666666666667e+00 2264 2175 -4.16666666666667e+00 2264 2241 4.16666666666667e+00 2264 2249 -1.25000000000000e+01 2264 2185 4.16666666666667e+00 2264 2248 -4.16666666666667e+00 2264 2184 -8.33333333333333e+00 2264 2247 8.33333333333333e+00 2264 2176 -4.16666666666667e+00 2264 2242 4.16666666666667e+00 2264 2121 -4.16666666666667e+00 2264 2418 4.16666666666667e+00 2264 2122 -4.16666666666667e+00 2264 2116 4.16666666666667e+00 2264 1949 -1.25000000000000e+01 2264 2419 -8.33333333333333e+00 2264 1948 8.33333333333333e+00 2264 2276 -3.75000000000000e+01 2264 2199 8.33333333333333e+00 2264 1919 -1.25000000000000e+01 2264 2275 8.33333333333333e+00 2264 2263 -1.66666666666667e+01 2264 1918 8.33333333333333e+00 2264 2274 8.33333333333333e+00 2264 2115 -8.33333333333333e+00 2265 2265 1.25000000000000e+02 2265 2201 -8.33333333333333e+00 2265 2417 -4.16666666666667e+00 2265 2122 4.16666666666667e+00 2265 2123 4.16666666666667e+00 2265 2416 8.33333333333333e+00 2265 2415 -1.25000000000000e+01 2265 2264 8.33333333333333e+00 2265 2263 8.33333333333333e+00 2265 2262 -3.75000000000000e+01 2265 2188 -4.16666666666667e+00 2265 2189 -4.16666666666667e+00 2265 2203 -4.16666666666667e+00 2265 2194 4.16666666666667e+00 2265 2195 4.16666666666667e+00 2265 2204 8.33333333333333e+00 2265 2267 -1.66666666666667e+01 2265 2202 -1.25000000000000e+01 2265 2116 -4.16666666666667e+00 2265 2266 -1.66666666666667e+01 2265 2372 8.33333333333333e+00 2265 2125 -4.16666666666667e+00 2265 2119 4.16666666666667e+00 2265 2117 8.33333333333333e+00 2265 2120 -8.33333333333333e+00 2265 1955 4.16666666666667e+00 2265 2126 -4.16666666666667e+00 2265 2371 8.33333333333333e+00 2265 1954 -8.33333333333333e+00 2265 2370 -3.75000000000000e+01 2265 2261 -4.16666666666667e+00 2265 1919 4.16666666666667e+00 2265 2260 8.33333333333333e+00 2265 1918 -8.33333333333333e+00 2265 2259 -1.25000000000000e+01 2265 2200 4.16666666666667e+00 2265 2115 -1.25000000000000e+01 2266 2266 1.25000000000000e+02 2266 2201 4.16666666666667e+00 2266 2417 8.33333333333333e+00 2266 2121 4.16666666666667e+00 2266 2123 -8.33333333333333e+00 2266 2416 -3.75000000000000e+01 2266 2415 8.33333333333333e+00 2266 2264 -4.16666666666667e+00 2266 2263 -1.25000000000000e+01 2266 2262 8.33333333333333e+00 2266 2187 -4.16666666666667e+00 2266 2204 8.33333333333333e+00 2266 2202 -4.16666666666667e+00 2266 2193 4.16666666666667e+00 2266 2195 -8.33333333333333e+00 2266 1955 4.16666666666667e+00 2266 2203 -1.25000000000000e+01 2266 2189 -4.16666666666667e+00 2266 1919 4.16666666666667e+00 2266 2115 -4.16666666666667e+00 2266 2372 -4.16666666666667e+00 2266 2265 -1.66666666666667e+01 2266 2124 -4.16666666666667e+00 2266 2118 4.16666666666667e+00 2266 2126 -4.16666666666667e+00 2266 2120 4.16666666666667e+00 2266 2371 -1.25000000000000e+01 2266 2370 8.33333333333333e+00 2266 1953 -8.33333333333333e+00 2266 2261 8.33333333333333e+00 2266 2267 -1.66666666666667e+01 2266 2117 8.33333333333333e+00 2266 2260 -3.75000000000000e+01 2266 2199 4.16666666666667e+00 2266 2116 -1.25000000000000e+01 2266 2259 8.33333333333333e+00 2266 1917 -8.33333333333333e+00 2267 2267 1.25000000000000e+02 2267 2199 -8.33333333333333e+00 2267 2415 -4.16666666666667e+00 2267 2416 8.33333333333333e+00 2267 2122 -8.33333333333333e+00 2267 2121 4.16666666666667e+00 2267 2417 -1.25000000000000e+01 2267 2264 -1.25000000000000e+01 2267 2263 -4.16666666666667e+00 2267 2262 8.33333333333333e+00 2267 2187 -4.16666666666667e+00 2267 2203 8.33333333333333e+00 2267 2194 -8.33333333333333e+00 2267 2193 4.16666666666667e+00 2267 2204 -3.75000000000000e+01 2267 1954 4.16666666666667e+00 2267 2202 8.33333333333333e+00 2267 2265 -1.66666666666667e+01 2267 2188 -4.16666666666667e+00 2267 1918 4.16666666666667e+00 2267 2371 -4.16666666666667e+00 2267 2370 8.33333333333333e+00 2267 2125 -4.16666666666667e+00 2267 2119 4.16666666666667e+00 2267 2115 8.33333333333333e+00 2267 2118 -8.33333333333333e+00 2267 2372 -1.25000000000000e+01 2267 1953 4.16666666666667e+00 2267 2124 -4.16666666666667e+00 2267 2261 -1.25000000000000e+01 2267 2200 4.16666666666667e+00 2267 2117 -3.75000000000000e+01 2267 2260 8.33333333333333e+00 2267 2266 -1.66666666666667e+01 2267 2116 8.33333333333333e+00 2267 2259 -4.16666666666667e+00 2267 1917 4.16666666666667e+00 2268 2268 1.25000000000000e+02 2268 2243 -8.33333333333333e+00 2268 2242 4.16666666666667e+00 2268 2255 8.33333333333333e+00 2268 2253 -3.75000000000000e+01 2268 2455 4.16666666666667e+00 2268 2456 4.16666666666667e+00 2268 2276 -4.16666666666667e+00 2268 2275 8.33333333333333e+00 2268 2274 -1.25000000000000e+01 2268 2212 -4.16666666666667e+00 2268 2213 -4.16666666666667e+00 2268 2222 4.16666666666667e+00 2268 2221 -8.33333333333333e+00 2268 2225 4.16666666666667e+00 2268 2237 -4.16666666666667e+00 2268 2269 -1.66666666666667e+01 2268 2236 8.33333333333333e+00 2268 2224 4.16666666666667e+00 2268 1918 -4.16666666666667e+00 2268 1966 -4.16666666666667e+00 2268 2235 -1.25000000000000e+01 2268 2117 4.16666666666667e+00 2268 2129 -4.16666666666667e+00 2268 2452 4.16666666666667e+00 2268 2128 -4.16666666666667e+00 2268 1967 8.33333333333333e+00 2268 2453 -8.33333333333333e+00 2268 1965 -1.25000000000000e+01 2268 2270 -1.66666666666667e+01 2268 2273 8.33333333333333e+00 2268 1919 8.33333333333333e+00 2268 2272 8.33333333333333e+00 2268 2116 -8.33333333333333e+00 2268 2254 8.33333333333333e+00 2268 2271 -3.75000000000000e+01 2268 1917 -1.25000000000000e+01 2269 2269 1.25000000000000e+02 2269 2255 -4.16666666666667e+00 2269 2253 8.33333333333333e+00 2269 2241 4.16666666666667e+00 2269 2254 -1.25000000000000e+01 2269 2454 4.16666666666667e+00 2269 2456 -8.33333333333333e+00 2269 2276 8.33333333333333e+00 2269 2275 -3.75000000000000e+01 2269 2274 8.33333333333333e+00 2269 2211 -4.16666666666667e+00 2269 2213 -4.16666666666667e+00 2269 2222 4.16666666666667e+00 2269 2220 -8.33333333333333e+00 2269 2268 -1.66666666666667e+01 2269 2235 8.33333333333333e+00 2269 2225 -8.33333333333333e+00 2269 1919 8.33333333333333e+00 2269 2223 4.16666666666667e+00 2269 1917 -4.16666666666667e+00 2269 2237 8.33333333333333e+00 2269 2270 -1.66666666666667e+01 2269 1967 8.33333333333333e+00 2269 2236 -3.75000000000000e+01 2269 1965 -4.16666666666667e+00 2269 2451 4.16666666666667e+00 2269 2127 -4.16666666666667e+00 2269 2453 4.16666666666667e+00 2269 2129 -4.16666666666667e+00 2269 1966 -1.25000000000000e+01 2269 2273 -4.16666666666667e+00 2269 2117 4.16666666666667e+00 2269 2243 4.16666666666667e+00 2269 2272 -1.25000000000000e+01 2269 1918 -1.25000000000000e+01 2269 2271 8.33333333333333e+00 2269 2115 -8.33333333333333e+00 2270 2270 1.25000000000000e+02 2270 2254 -4.16666666666667e+00 2270 2241 -8.33333333333333e+00 2270 2255 -1.25000000000000e+01 2270 2253 8.33333333333333e+00 2270 2455 -8.33333333333333e+00 2270 2454 4.16666666666667e+00 2270 2276 -1.25000000000000e+01 2270 2275 8.33333333333333e+00 2270 2274 -4.16666666666667e+00 2270 2212 -4.16666666666667e+00 2270 2221 4.16666666666667e+00 2270 2211 -4.16666666666667e+00 2270 2220 4.16666666666667e+00 2270 2223 4.16666666666667e+00 2270 2235 -4.16666666666667e+00 2270 2224 -8.33333333333333e+00 2270 1918 8.33333333333333e+00 2270 2237 -1.25000000000000e+01 2270 2236 8.33333333333333e+00 2270 2269 -1.66666666666667e+01 2270 1966 8.33333333333333e+00 2270 2115 4.16666666666667e+00 2270 2127 -4.16666666666667e+00 2270 1967 -3.75000000000000e+01 2270 2452 4.16666666666667e+00 2270 2128 -4.16666666666667e+00 2270 1965 8.33333333333333e+00 2270 2451 -8.33333333333333e+00 2270 2242 4.16666666666667e+00 2270 2273 -1.25000000000000e+01 2270 1919 -3.75000000000000e+01 2270 2272 -4.16666666666667e+00 2270 2116 4.16666666666667e+00 2270 2268 -1.66666666666667e+01 2270 2271 8.33333333333333e+00 2270 1917 8.33333333333333e+00 2271 2271 1.25000000000000e+02 2271 2230 4.16666666666667e+00 2271 2377 8.33333333333333e+00 2271 2120 4.16666666666667e+00 2271 2119 -8.33333333333333e+00 2271 2378 8.33333333333333e+00 2271 2376 -3.75000000000000e+01 2271 2261 8.33333333333333e+00 2271 2260 -4.16666666666667e+00 2271 2259 -1.25000000000000e+01 2271 2225 -4.16666666666667e+00 2271 2240 -4.16666666666667e+00 2271 2237 4.16666666666667e+00 2271 2239 8.33333333333333e+00 2271 2236 -8.33333333333333e+00 2271 1972 4.16666666666667e+00 2271 2238 -1.25000000000000e+01 2271 2224 -4.16666666666667e+00 2271 1918 4.16666666666667e+00 2271 2117 -4.16666666666667e+00 2271 2273 -1.66666666666667e+01 2271 2452 -4.16666666666667e+00 2271 2132 -4.16666666666667e+00 2271 2129 4.16666666666667e+00 2271 2131 -4.16666666666667e+00 2271 2128 4.16666666666667e+00 2271 2453 8.33333333333333e+00 2271 1973 -8.33333333333333e+00 2271 2451 -1.25000000000000e+01 2271 2270 8.33333333333333e+00 2271 1919 -8.33333333333333e+00 2271 2269 8.33333333333333e+00 2271 2272 -1.66666666666667e+01 2271 2116 8.33333333333333e+00 2271 2268 -3.75000000000000e+01 2271 2231 4.16666666666667e+00 2271 2115 -1.25000000000000e+01 2272 2272 1.25000000000000e+02 2272 2229 4.16666666666667e+00 2272 2378 -4.16666666666667e+00 2272 2120 4.16666666666667e+00 2272 2376 8.33333333333333e+00 2272 2118 -8.33333333333333e+00 2272 2377 -1.25000000000000e+01 2272 2261 8.33333333333333e+00 2272 2260 -1.25000000000000e+01 2272 2259 -4.16666666666667e+00 2272 2225 -4.16666666666667e+00 2272 2238 8.33333333333333e+00 2272 2237 4.16666666666667e+00 2272 2235 -8.33333333333333e+00 2272 2240 8.33333333333333e+00 2272 2273 -1.66666666666667e+01 2272 2239 -3.75000000000000e+01 2272 1971 4.16666666666667e+00 2272 2223 -4.16666666666667e+00 2272 1917 4.16666666666667e+00 2272 2451 -4.16666666666667e+00 2272 2453 8.33333333333333e+00 2272 2117 8.33333333333333e+00 2272 2129 -8.33333333333333e+00 2272 2130 -4.16666666666667e+00 2272 2127 4.16666666666667e+00 2272 1973 4.16666666666667e+00 2272 2132 -4.16666666666667e+00 2272 2452 -1.25000000000000e+01 2272 2270 -4.16666666666667e+00 2272 1919 4.16666666666667e+00 2272 2269 -1.25000000000000e+01 2272 2231 -8.33333333333333e+00 2272 2116 -3.75000000000000e+01 2272 2268 8.33333333333333e+00 2272 2271 -1.66666666666667e+01 2272 2115 8.33333333333333e+00 2273 2273 1.25000000000000e+02 2273 2230 -8.33333333333333e+00 2273 2377 -4.16666666666667e+00 2273 2119 4.16666666666667e+00 2273 2118 4.16666666666667e+00 2273 2378 -1.25000000000000e+01 2273 2376 8.33333333333333e+00 2273 2261 -3.75000000000000e+01 2273 2260 8.33333333333333e+00 2273 2259 8.33333333333333e+00 2273 2223 -4.16666666666667e+00 2273 2224 -4.16666666666667e+00 2273 2238 -4.16666666666667e+00 2273 2235 4.16666666666667e+00 2273 2236 4.16666666666667e+00 2273 2240 -1.25000000000000e+01 2273 2239 8.33333333333333e+00 2273 2272 -1.66666666666667e+01 2273 2115 -4.16666666666667e+00 2273 2271 -1.66666666666667e+01 2273 2452 8.33333333333333e+00 2273 2130 -4.16666666666667e+00 2273 2127 4.16666666666667e+00 2273 2116 8.33333333333333e+00 2273 2128 -8.33333333333333e+00 2273 2453 -3.75000000000000e+01 2273 1972 4.16666666666667e+00 2273 2131 -4.16666666666667e+00 2273 2451 8.33333333333333e+00 2273 1971 -8.33333333333333e+00 2273 2270 -1.25000000000000e+01 2273 2229 4.16666666666667e+00 2273 2117 -1.25000000000000e+01 2273 2269 -4.16666666666667e+00 2273 1918 4.16666666666667e+00 2273 2268 8.33333333333333e+00 2273 1917 -8.33333333333333e+00 2274 2274 1.25000000000000e+02 2274 2248 4.16666666666667e+00 2274 2123 4.16666666666667e+00 2274 2420 -4.16666666666667e+00 2274 2419 8.33333333333333e+00 2274 2122 -8.33333333333333e+00 2274 2418 -1.25000000000000e+01 2274 2264 8.33333333333333e+00 2274 2263 -4.16666666666667e+00 2274 2262 -1.25000000000000e+01 2274 2243 -4.16666666666667e+00 2274 2257 8.33333333333333e+00 2274 2255 4.16666666666667e+00 2274 2254 -8.33333333333333e+00 2274 2258 8.33333333333333e+00 2274 2276 -1.66666666666667e+01 2274 1978 4.16666666666667e+00 2274 2256 -3.75000000000000e+01 2274 2242 -4.16666666666667e+00 2274 1918 4.16666666666667e+00 2274 2455 -4.16666666666667e+00 2274 2456 8.33333333333333e+00 2274 2117 8.33333333333333e+00 2274 2129 -8.33333333333333e+00 2274 2134 -4.16666666666667e+00 2274 2128 4.16666666666667e+00 2274 1979 4.16666666666667e+00 2274 2135 -4.16666666666667e+00 2274 2454 -1.25000000000000e+01 2274 2270 -4.16666666666667e+00 2274 1919 4.16666666666667e+00 2274 2275 -1.66666666666667e+01 2274 2269 8.33333333333333e+00 2274 2116 8.33333333333333e+00 2274 2249 -8.33333333333333e+00 2274 2268 -1.25000000000000e+01 2274 2115 -3.75000000000000e+01 2275 2275 1.25000000000000e+02 2275 2247 4.16666666666667e+00 2275 2418 8.33333333333333e+00 2275 2123 4.16666666666667e+00 2275 2121 -8.33333333333333e+00 2275 2420 8.33333333333333e+00 2275 2419 -3.75000000000000e+01 2275 2264 8.33333333333333e+00 2275 2263 -1.25000000000000e+01 2275 2262 -4.16666666666667e+00 2275 2243 -4.16666666666667e+00 2275 2258 -4.16666666666667e+00 2275 2255 4.16666666666667e+00 2275 2256 8.33333333333333e+00 2275 2253 -8.33333333333333e+00 2275 2257 -1.25000000000000e+01 2275 1977 4.16666666666667e+00 2275 2241 -4.16666666666667e+00 2275 1917 4.16666666666667e+00 2275 2117 -4.16666666666667e+00 2275 2276 -1.66666666666667e+01 2275 2454 -4.16666666666667e+00 2275 2135 -4.16666666666667e+00 2275 2129 4.16666666666667e+00 2275 2133 -4.16666666666667e+00 2275 2127 4.16666666666667e+00 2275 1979 -8.33333333333333e+00 2275 2456 8.33333333333333e+00 2275 2455 -1.25000000000000e+01 2275 2270 8.33333333333333e+00 2275 1919 -8.33333333333333e+00 2275 2249 4.16666666666667e+00 2275 2269 -3.75000000000000e+01 2275 2116 -1.25000000000000e+01 2275 2274 -1.66666666666667e+01 2275 2268 8.33333333333333e+00 2275 2115 8.33333333333333e+00 2276 2276 1.25000000000000e+02 2276 2247 -8.33333333333333e+00 2276 2121 4.16666666666667e+00 2276 2418 -4.16666666666667e+00 2276 2122 4.16666666666667e+00 2276 2420 -1.25000000000000e+01 2276 2419 8.33333333333333e+00 2276 2264 -3.75000000000000e+01 2276 2263 8.33333333333333e+00 2276 2262 8.33333333333333e+00 2276 2242 -4.16666666666667e+00 2276 2241 -4.16666666666667e+00 2276 2257 -4.16666666666667e+00 2276 2254 4.16666666666667e+00 2276 2253 4.16666666666667e+00 2276 2258 -1.25000000000000e+01 2276 2256 8.33333333333333e+00 2276 2274 -1.66666666666667e+01 2276 2116 -4.16666666666667e+00 2276 2275 -1.66666666666667e+01 2276 2134 -4.16666666666667e+00 2276 2128 4.16666666666667e+00 2276 2454 8.33333333333333e+00 2276 2115 8.33333333333333e+00 2276 2127 -8.33333333333333e+00 2276 2456 -3.75000000000000e+01 2276 1978 -8.33333333333333e+00 2276 2455 8.33333333333333e+00 2276 1977 4.16666666666667e+00 2276 2133 -4.16666666666667e+00 2276 2248 4.16666666666667e+00 2276 2270 -1.25000000000000e+01 2276 2117 -1.25000000000000e+01 2276 2269 8.33333333333333e+00 2276 1918 -8.33333333333333e+00 2276 2268 -4.16666666666667e+00 2276 1917 4.16666666666667e+00 2277 2277 6.25000000000000e+01 2277 2321 -4.16666666666667e+00 2277 2293 4.16666666666667e+00 2277 2320 -4.16666666666667e+00 2277 2317 -4.16666666666667e+00 2277 2288 4.16666666666667e+00 2277 2294 -8.33333333333333e+00 2277 2287 4.16666666666667e+00 2277 2286 -1.87500000000000e+01 2277 2015 4.16666666666667e+00 2277 2279 -8.33333333333333e+00 2277 2285 8.33333333333333e+00 2277 2314 4.16666666666667e+00 2277 2284 -4.16666666666667e+00 2277 1922 -2.08333333333333e+00 2277 2009 2.08333333333333e+00 2277 1921 4.16666666666667e+00 2277 2008 -4.16666666666667e+00 2277 1920 -6.25000000000000e+00 2277 2283 -1.25000000000000e+01 2277 1928 -2.08333333333333e+00 2277 2315 4.16666666666667e+00 2277 2278 -8.33333333333333e+00 2277 1927 4.16666666666667e+00 2277 2014 4.16666666666667e+00 2277 2318 2.08333333333333e+00 2277 1926 -6.25000000000000e+00 2277 2013 -1.87500000000000e+01 2278 2278 6.25000000000000e+01 2278 2319 -4.16666666666667e+00 2278 2318 2.08333333333333e+00 2278 2321 -4.16666666666667e+00 2278 2316 -4.16666666666667e+00 2278 2288 -2.08333333333333e+00 2278 2294 4.16666666666667e+00 2278 2287 -6.25000000000000e+00 2278 2286 4.16666666666667e+00 2278 2015 -2.08333333333333e+00 2278 2009 2.08333333333333e+00 2278 2313 4.16666666666667e+00 2278 2283 -4.16666666666667e+00 2278 1922 4.16666666666667e+00 2278 2279 -8.33333333333333e+00 2278 2285 8.33333333333333e+00 2278 1921 -1.87500000000000e+01 2278 2284 -1.25000000000000e+01 2278 1920 4.16666666666667e+00 2278 2007 -4.16666666666667e+00 2278 1928 4.16666666666667e+00 2278 2315 -8.33333333333333e+00 2278 2292 4.16666666666667e+00 2278 1927 -1.87500000000000e+01 2278 2014 -6.25000000000000e+00 2278 2277 -8.33333333333333e+00 2278 1926 4.16666666666667e+00 2278 2013 4.16666666666667e+00 2279 2279 6.25000000000000e+01 2279 2319 -4.16666666666667e+00 2279 2317 2.08333333333333e+00 2279 2320 -4.16666666666667e+00 2279 2288 -6.25000000000000e+00 2279 2287 -2.08333333333333e+00 2279 2293 4.16666666666667e+00 2279 2286 4.16666666666667e+00 2279 2292 -8.33333333333333e+00 2279 2014 -2.08333333333333e+00 2279 2008 2.08333333333333e+00 2279 2013 4.16666666666667e+00 2279 2277 -8.33333333333333e+00 2279 2283 8.33333333333333e+00 2279 1922 -6.25000000000000e+00 2279 2285 -3.75000000000000e+01 2279 1921 4.16666666666667e+00 2279 2278 -8.33333333333333e+00 2279 2284 8.33333333333333e+00 2279 1920 -2.08333333333333e+00 2279 2007 2.08333333333333e+00 2279 2316 2.08333333333333e+00 2279 1928 -6.25000000000000e+00 2279 2015 -6.25000000000000e+00 2279 1927 4.16666666666667e+00 2279 2314 -8.33333333333333e+00 2279 1926 -2.08333333333333e+00 2279 2313 4.16666666666667e+00 2280 2280 6.25000000000000e+01 2280 2291 4.16666666666667e+00 2280 2290 4.16666666666667e+00 2280 2289 -1.87500000000000e+01 2280 2354 -4.16666666666667e+00 2280 2356 -4.16666666666667e+00 2280 2294 4.16666666666667e+00 2280 2293 -8.33333333333333e+00 2280 2357 -4.16666666666667e+00 2280 2351 4.16666666666667e+00 2280 2285 -4.16666666666667e+00 2280 2281 -8.33333333333333e+00 2280 2284 8.33333333333333e+00 2280 2020 4.16666666666667e+00 2280 1922 4.16666666666667e+00 2280 2009 -4.16666666666667e+00 2280 1921 -2.08333333333333e+00 2280 2008 2.08333333333333e+00 2280 1920 -6.25000000000000e+00 2280 2283 -1.25000000000000e+01 2280 2282 -8.33333333333333e+00 2280 1934 4.16666666666667e+00 2280 2021 4.16666666666667e+00 2280 1933 -2.08333333333333e+00 2280 2350 4.16666666666667e+00 2280 2353 2.08333333333333e+00 2280 1932 -6.25000000000000e+00 2280 2019 -1.87500000000000e+01 2281 2281 6.25000000000000e+01 2281 2291 -2.08333333333333e+00 2281 2290 -6.25000000000000e+00 2281 2289 4.16666666666667e+00 2281 2354 2.08333333333333e+00 2281 2294 4.16666666666667e+00 2281 2357 -4.16666666666667e+00 2281 2355 -4.16666666666667e+00 2281 2292 -8.33333333333333e+00 2281 2009 2.08333333333333e+00 2281 2021 -2.08333333333333e+00 2281 2280 -8.33333333333333e+00 2281 2283 8.33333333333333e+00 2281 2019 4.16666666666667e+00 2281 1922 4.16666666666667e+00 2281 2282 -8.33333333333333e+00 2281 2285 8.33333333333333e+00 2281 1921 -6.25000000000000e+00 2281 2284 -3.75000000000000e+01 2281 1920 -2.08333333333333e+00 2281 2007 2.08333333333333e+00 2281 1934 4.16666666666667e+00 2281 2351 -8.33333333333333e+00 2281 2352 2.08333333333333e+00 2281 1933 -6.25000000000000e+00 2281 2020 -6.25000000000000e+00 2281 1932 -2.08333333333333e+00 2281 2349 4.16666666666667e+00 2282 2282 6.25000000000000e+01 2282 2290 -2.08333333333333e+00 2282 2289 4.16666666666667e+00 2282 2353 2.08333333333333e+00 2282 2352 -4.16666666666667e+00 2282 2293 4.16666666666667e+00 2282 2356 -4.16666666666667e+00 2282 2292 4.16666666666667e+00 2282 2355 -4.16666666666667e+00 2282 2349 4.16666666666667e+00 2282 2283 -4.16666666666667e+00 2282 2008 2.08333333333333e+00 2282 2020 -2.08333333333333e+00 2282 1922 -1.87500000000000e+01 2282 2285 -1.25000000000000e+01 2282 1921 4.16666666666667e+00 2282 2281 -8.33333333333333e+00 2282 2284 8.33333333333333e+00 2282 1920 4.16666666666667e+00 2282 2007 -4.16666666666667e+00 2282 2291 -6.25000000000000e+00 2282 1934 -1.87500000000000e+01 2282 2021 -6.25000000000000e+00 2282 1933 4.16666666666667e+00 2282 2350 -8.33333333333333e+00 2282 2280 -8.33333333333333e+00 2282 1932 4.16666666666667e+00 2282 2019 4.16666666666667e+00 2283 2283 1.25000000000000e+02 2283 2320 -8.33333333333333e+00 2283 2279 8.33333333333333e+00 2283 2014 4.16666666666667e+00 2283 2278 -4.16666666666667e+00 2283 2015 -8.33333333333333e+00 2283 2277 -1.25000000000000e+01 2283 2315 -4.16666666666667e+00 2283 2314 8.33333333333333e+00 2283 2313 -1.25000000000000e+01 2283 2386 -4.16666666666667e+00 2283 2294 8.33333333333333e+00 2283 2357 -8.33333333333333e+00 2283 2356 4.16666666666667e+00 2283 1922 4.16666666666667e+00 2283 2293 8.33333333333333e+00 2283 2284 -1.66666666666667e+01 2283 2292 -3.75000000000000e+01 2283 2387 -4.16666666666667e+00 2283 1940 4.16666666666667e+00 2283 2282 -4.16666666666667e+00 2283 2281 8.33333333333333e+00 2283 2009 -4.16666666666667e+00 2283 2021 4.16666666666667e+00 2283 2026 8.33333333333333e+00 2283 2020 -8.33333333333333e+00 2283 1921 4.16666666666667e+00 2283 2008 -4.16666666666667e+00 2283 2280 -1.25000000000000e+01 2283 2285 -1.66666666666667e+01 2283 2351 8.33333333333333e+00 2283 2027 8.33333333333333e+00 2283 2350 -4.16666666666667e+00 2283 1939 4.16666666666667e+00 2283 2321 4.16666666666667e+00 2283 2349 -1.25000000000000e+01 2283 2025 -3.75000000000000e+01 2284 2284 1.25000000000000e+02 2284 2319 -8.33333333333333e+00 2284 2013 4.16666666666667e+00 2284 2277 -4.16666666666667e+00 2284 2015 4.16666666666667e+00 2284 2279 8.33333333333333e+00 2284 2278 -1.25000000000000e+01 2284 2315 8.33333333333333e+00 2284 2314 -3.75000000000000e+01 2284 2313 8.33333333333333e+00 2284 2387 -4.16666666666667e+00 2284 2385 -4.16666666666667e+00 2284 2294 -4.16666666666667e+00 2284 2357 4.16666666666667e+00 2284 2355 4.16666666666667e+00 2284 2293 -1.25000000000000e+01 2284 2292 8.33333333333333e+00 2284 2283 -1.66666666666667e+01 2284 2027 -4.16666666666667e+00 2284 2285 -1.66666666666667e+01 2284 2009 -4.16666666666667e+00 2284 2021 4.16666666666667e+00 2284 2280 8.33333333333333e+00 2284 2025 8.33333333333333e+00 2284 2019 -8.33333333333333e+00 2284 1922 -8.33333333333333e+00 2284 2282 8.33333333333333e+00 2284 2281 -3.75000000000000e+01 2284 1920 4.16666666666667e+00 2284 2007 -4.16666666666667e+00 2284 2351 8.33333333333333e+00 2284 1940 -8.33333333333333e+00 2284 2321 4.16666666666667e+00 2284 2350 -1.25000000000000e+01 2284 2026 -1.25000000000000e+01 2284 2349 -4.16666666666667e+00 2284 1938 4.16666666666667e+00 2285 2285 1.25000000000000e+02 2285 2319 4.16666666666667e+00 2285 2277 8.33333333333333e+00 2285 2014 4.16666666666667e+00 2285 2013 -8.33333333333333e+00 2285 2279 -3.75000000000000e+01 2285 2278 8.33333333333333e+00 2285 2315 -1.25000000000000e+01 2285 2314 8.33333333333333e+00 2285 2313 -4.16666666666667e+00 2285 2386 -4.16666666666667e+00 2285 2293 -4.16666666666667e+00 2285 2356 4.16666666666667e+00 2285 2292 8.33333333333333e+00 2285 2355 -8.33333333333333e+00 2285 2294 -1.25000000000000e+01 2285 1920 4.16666666666667e+00 2285 2385 -4.16666666666667e+00 2285 1938 4.16666666666667e+00 2285 2026 -4.16666666666667e+00 2285 2284 -1.66666666666667e+01 2285 2280 -4.16666666666667e+00 2285 2008 -4.16666666666667e+00 2285 2020 4.16666666666667e+00 2285 2007 -4.16666666666667e+00 2285 2019 4.16666666666667e+00 2285 2282 -1.25000000000000e+01 2285 1921 -8.33333333333333e+00 2285 2281 8.33333333333333e+00 2285 2320 4.16666666666667e+00 2285 2351 -3.75000000000000e+01 2285 2027 -1.25000000000000e+01 2285 2350 8.33333333333333e+00 2285 1939 -8.33333333333333e+00 2285 2283 -1.66666666666667e+01 2285 2349 8.33333333333333e+00 2285 2025 8.33333333333333e+00 2286 2286 6.25000000000000e+01 2286 2320 4.16666666666667e+00 2286 2321 4.16666666666667e+00 2286 2279 4.16666666666667e+00 2286 2288 -8.33333333333333e+00 2286 2278 4.16666666666667e+00 2286 2277 -1.87500000000000e+01 2286 2317 4.16666666666667e+00 2286 2316 -6.25000000000000e+00 2286 2293 -4.16666666666667e+00 2286 2287 -8.33333333333333e+00 2286 2294 8.33333333333333e+00 2286 2030 -2.08333333333333e+00 2286 1922 2.08333333333333e+00 2286 2029 4.16666666666667e+00 2286 1921 -4.16666666666667e+00 2286 2028 -6.25000000000000e+00 2286 2318 -2.08333333333333e+00 2286 2292 -1.25000000000000e+01 2286 1388 4.16666666666667e+00 2286 1573 -4.16666666666667e+00 2286 1399 4.16666666666667e+00 2286 1400 -8.33333333333333e+00 2286 1304 2.08333333333333e+00 2286 1574 -4.16666666666667e+00 2286 1387 4.16666666666667e+00 2286 1303 -4.16666666666667e+00 2286 1386 -1.87500000000000e+01 2287 2287 6.25000000000000e+01 2287 2319 4.16666666666667e+00 2287 2321 -8.33333333333333e+00 2287 2279 -2.08333333333333e+00 2287 1922 2.08333333333333e+00 2287 2278 -6.25000000000000e+00 2287 2277 4.16666666666667e+00 2287 2317 -1.87500000000000e+01 2287 2316 4.16666666666667e+00 2287 2292 -4.16666666666667e+00 2287 2286 -8.33333333333333e+00 2287 2030 4.16666666666667e+00 2287 2288 -8.33333333333333e+00 2287 2294 8.33333333333333e+00 2287 2029 -1.87500000000000e+01 2287 2318 4.16666666666667e+00 2287 2293 -1.25000000000000e+01 2287 2028 4.16666666666667e+00 2287 1920 -4.16666666666667e+00 2287 1304 2.08333333333333e+00 2287 1388 -2.08333333333333e+00 2287 1572 -4.16666666666667e+00 2287 1398 4.16666666666667e+00 2287 1574 -4.16666666666667e+00 2287 1400 4.16666666666667e+00 2287 1387 -6.25000000000000e+00 2287 1386 4.16666666666667e+00 2287 1302 -4.16666666666667e+00 2288 2288 6.25000000000000e+01 2288 2316 -2.08333333333333e+00 2288 2320 -8.33333333333333e+00 2288 2319 4.16666666666667e+00 2288 2279 -6.25000000000000e+00 2288 2278 -2.08333333333333e+00 2288 1921 2.08333333333333e+00 2288 2277 4.16666666666667e+00 2288 2286 -8.33333333333333e+00 2288 2318 -6.25000000000000e+00 2288 2292 8.33333333333333e+00 2288 2030 -6.25000000000000e+00 2288 2317 4.16666666666667e+00 2288 2294 -3.75000000000000e+01 2288 2029 4.16666666666667e+00 2288 2287 -8.33333333333333e+00 2288 2293 8.33333333333333e+00 2288 2028 -2.08333333333333e+00 2288 1920 2.08333333333333e+00 2288 1303 2.08333333333333e+00 2288 1387 -2.08333333333333e+00 2288 1386 4.16666666666667e+00 2288 1573 -4.16666666666667e+00 2288 1399 4.16666666666667e+00 2288 1398 -8.33333333333333e+00 2288 1388 -6.25000000000000e+00 2288 1302 2.08333333333333e+00 2288 1572 -4.16666666666667e+00 2289 2289 6.25000000000000e+01 2289 2353 -2.08333333333333e+00 2289 2356 4.16666666666667e+00 2289 2354 4.16666666666667e+00 2289 2352 -6.25000000000000e+00 2289 2282 4.16666666666667e+00 2289 2290 -8.33333333333333e+00 2289 2281 4.16666666666667e+00 2289 2280 -1.87500000000000e+01 2289 2291 -8.33333333333333e+00 2289 2294 -4.16666666666667e+00 2289 2293 8.33333333333333e+00 2289 2030 4.16666666666667e+00 2289 1922 -4.16666666666667e+00 2289 2029 -2.08333333333333e+00 2289 1921 2.08333333333333e+00 2289 2028 -6.25000000000000e+00 2289 2357 4.16666666666667e+00 2289 2292 -1.25000000000000e+01 2289 1610 -4.16666666666667e+00 2289 1393 4.16666666666667e+00 2289 1400 4.16666666666667e+00 2289 1399 -8.33333333333333e+00 2289 1394 4.16666666666667e+00 2289 1310 -4.16666666666667e+00 2289 1309 2.08333333333333e+00 2289 1609 -4.16666666666667e+00 2289 1392 -1.87500000000000e+01 2290 2290 6.25000000000000e+01 2290 2357 -8.33333333333333e+00 2290 2352 -2.08333333333333e+00 2290 2355 4.16666666666667e+00 2290 2353 -6.25000000000000e+00 2290 1922 2.08333333333333e+00 2290 2282 -2.08333333333333e+00 2290 2281 -6.25000000000000e+00 2290 2289 -8.33333333333333e+00 2290 2280 4.16666666666667e+00 2290 2292 8.33333333333333e+00 2290 2030 4.16666666666667e+00 2290 2291 -8.33333333333333e+00 2290 2294 8.33333333333333e+00 2290 2029 -6.25000000000000e+00 2290 2354 4.16666666666667e+00 2290 2293 -3.75000000000000e+01 2290 2028 -2.08333333333333e+00 2290 1920 2.08333333333333e+00 2290 1310 2.08333333333333e+00 2290 1610 -4.16666666666667e+00 2290 1394 -2.08333333333333e+00 2290 1400 4.16666666666667e+00 2290 1392 4.16666666666667e+00 2290 1398 -8.33333333333333e+00 2290 1393 -6.25000000000000e+00 2290 1308 2.08333333333333e+00 2290 1608 -4.16666666666667e+00 2291 2291 6.25000000000000e+01 2291 2353 4.16666666666667e+00 2291 2356 -8.33333333333333e+00 2291 2354 -1.87500000000000e+01 2291 2352 4.16666666666667e+00 2291 2282 -6.25000000000000e+00 2291 1921 2.08333333333333e+00 2291 2281 -2.08333333333333e+00 2291 2280 4.16666666666667e+00 2291 2289 -8.33333333333333e+00 2291 2292 -4.16666666666667e+00 2291 2030 -1.87500000000000e+01 2291 2355 4.16666666666667e+00 2291 2294 -1.25000000000000e+01 2291 2029 4.16666666666667e+00 2291 2290 -8.33333333333333e+00 2291 2293 8.33333333333333e+00 2291 2028 4.16666666666667e+00 2291 1920 -4.16666666666667e+00 2291 1309 2.08333333333333e+00 2291 1609 -4.16666666666667e+00 2291 1608 -4.16666666666667e+00 2291 1393 -2.08333333333333e+00 2291 1399 4.16666666666667e+00 2291 1398 4.16666666666667e+00 2291 1394 -6.25000000000000e+00 2291 1392 4.16666666666667e+00 2291 1308 -4.16666666666667e+00 2292 2292 1.25000000000000e+02 2292 2321 -4.16666666666667e+00 2292 2279 -8.33333333333333e+00 2292 2320 8.33333333333333e+00 2292 2319 -1.25000000000000e+01 2292 2287 -4.16666666666667e+00 2292 2288 8.33333333333333e+00 2292 2286 -1.25000000000000e+01 2292 2386 4.16666666666667e+00 2292 2356 -4.16666666666667e+00 2292 2294 -1.66666666666667e+01 2292 2285 8.33333333333333e+00 2292 2357 8.33333333333333e+00 2292 1922 -4.16666666666667e+00 2292 2282 4.16666666666667e+00 2292 2284 8.33333333333333e+00 2292 2281 -8.33333333333333e+00 2292 2283 -3.75000000000000e+01 2292 2387 4.16666666666667e+00 2292 2355 -1.25000000000000e+01 2292 2030 4.16666666666667e+00 2292 2291 -4.16666666666667e+00 2292 2293 -1.66666666666667e+01 2292 2290 8.33333333333333e+00 2292 2029 4.16666666666667e+00 2292 1921 -4.16666666666667e+00 2292 2289 -1.25000000000000e+01 2292 2278 4.16666666666667e+00 2292 1574 4.16666666666667e+00 2292 1573 -8.33333333333333e+00 2292 1316 -4.16666666666667e+00 2292 1399 8.33333333333333e+00 2292 1400 8.33333333333333e+00 2292 1610 -8.33333333333333e+00 2292 1609 4.16666666666667e+00 2292 1315 -4.16666666666667e+00 2292 1398 -3.75000000000000e+01 2293 2293 1.25000000000000e+02 2293 2321 8.33333333333333e+00 2293 2279 4.16666666666667e+00 2293 2320 -3.75000000000000e+01 2293 2319 8.33333333333333e+00 2293 2286 -4.16666666666667e+00 2293 2288 8.33333333333333e+00 2293 2287 -1.25000000000000e+01 2293 2294 -1.66666666666667e+01 2293 1922 -4.16666666666667e+00 2293 2385 4.16666666666667e+00 2293 2355 -4.16666666666667e+00 2293 2285 -4.16666666666667e+00 2293 2282 4.16666666666667e+00 2293 2284 -1.25000000000000e+01 2293 2283 8.33333333333333e+00 2293 2280 -8.33333333333333e+00 2293 2387 -8.33333333333333e+00 2293 2357 8.33333333333333e+00 2293 2356 -1.25000000000000e+01 2293 2292 -1.66666666666667e+01 2293 2289 8.33333333333333e+00 2293 2030 -8.33333333333333e+00 2293 2291 8.33333333333333e+00 2293 2290 -3.75000000000000e+01 2293 2277 4.16666666666667e+00 2293 2028 4.16666666666667e+00 2293 1920 -4.16666666666667e+00 2293 1574 4.16666666666667e+00 2293 1572 -8.33333333333333e+00 2293 1316 -4.16666666666667e+00 2293 1400 -4.16666666666667e+00 2293 1610 4.16666666666667e+00 2293 1398 8.33333333333333e+00 2293 1399 -1.25000000000000e+01 2293 1608 4.16666666666667e+00 2293 1314 -4.16666666666667e+00 2294 2294 1.25000000000000e+02 2294 2319 -4.16666666666667e+00 2294 2278 4.16666666666667e+00 2294 2277 -8.33333333333333e+00 2294 2321 -1.25000000000000e+01 2294 2286 8.33333333333333e+00 2294 2288 -3.75000000000000e+01 2294 2287 8.33333333333333e+00 2294 2293 -1.66666666666667e+01 2294 1921 -4.16666666666667e+00 2294 2284 -4.16666666666667e+00 2294 2281 4.16666666666667e+00 2294 2292 -1.66666666666667e+01 2294 2283 8.33333333333333e+00 2294 2355 8.33333333333333e+00 2294 2285 -1.25000000000000e+01 2294 1920 -4.16666666666667e+00 2294 2280 4.16666666666667e+00 2294 2357 -3.75000000000000e+01 2294 2386 -8.33333333333333e+00 2294 2356 8.33333333333333e+00 2294 2385 4.16666666666667e+00 2294 2028 4.16666666666667e+00 2294 2289 -4.16666666666667e+00 2294 2291 -1.25000000000000e+01 2294 2320 8.33333333333333e+00 2294 2029 -8.33333333333333e+00 2294 2290 8.33333333333333e+00 2294 1573 4.16666666666667e+00 2294 1572 4.16666666666667e+00 2294 1315 -4.16666666666667e+00 2294 1314 -4.16666666666667e+00 2294 1399 -4.16666666666667e+00 2294 1609 4.16666666666667e+00 2294 1400 -1.25000000000000e+01 2294 1398 8.33333333333333e+00 2294 1608 -8.33333333333333e+00 2295 2295 6.25000000000000e+01 2295 2326 -4.16666666666667e+00 2295 2306 -2.08333333333333e+00 2295 2312 4.16666666666667e+00 2295 2305 4.16666666666667e+00 2295 2304 -6.25000000000000e+00 2295 2324 2.08333333333333e+00 2295 2327 -4.16666666666667e+00 2295 2323 -4.16666666666667e+00 2295 2012 2.08333333333333e+00 2295 2015 -2.08333333333333e+00 2295 2314 4.16666666666667e+00 2295 2302 -4.16666666666667e+00 2295 1928 4.16666666666667e+00 2295 2315 -8.33333333333333e+00 2295 1927 4.16666666666667e+00 2295 2296 -8.33333333333333e+00 2295 2014 4.16666666666667e+00 2295 1926 -1.87500000000000e+01 2295 2013 -6.25000000000000e+00 2295 2297 -8.33333333333333e+00 2295 1925 4.16666666666667e+00 2295 2303 8.33333333333333e+00 2295 1924 4.16666666666667e+00 2295 2011 -4.16666666666667e+00 2295 2311 4.16666666666667e+00 2295 1923 -1.87500000000000e+01 2295 2301 -1.25000000000000e+01 2296 2296 6.25000000000000e+01 2296 2327 -4.16666666666667e+00 2296 2310 4.16666666666667e+00 2296 2325 -4.16666666666667e+00 2296 2306 4.16666666666667e+00 2296 2312 -8.33333333333333e+00 2296 2305 -1.87500000000000e+01 2296 2304 4.16666666666667e+00 2296 2322 -4.16666666666667e+00 2296 2297 -8.33333333333333e+00 2296 2015 4.16666666666667e+00 2296 2303 8.33333333333333e+00 2296 2313 4.16666666666667e+00 2296 2301 -4.16666666666667e+00 2296 1928 -2.08333333333333e+00 2296 2315 4.16666666666667e+00 2296 1927 -6.25000000000000e+00 2296 2014 -1.87500000000000e+01 2296 1926 4.16666666666667e+00 2296 2295 -8.33333333333333e+00 2296 2013 4.16666666666667e+00 2296 1925 -2.08333333333333e+00 2296 2012 2.08333333333333e+00 2296 2324 2.08333333333333e+00 2296 1924 -6.25000000000000e+00 2296 2302 -1.25000000000000e+01 2296 1923 4.16666666666667e+00 2296 2010 -4.16666666666667e+00 2297 2297 6.25000000000000e+01 2297 2326 -4.16666666666667e+00 2297 2306 -6.25000000000000e+00 2297 2305 4.16666666666667e+00 2297 2311 -8.33333333333333e+00 2297 2304 -2.08333333333333e+00 2297 2310 4.16666666666667e+00 2297 2322 2.08333333333333e+00 2297 2325 -4.16666666666667e+00 2297 2010 2.08333333333333e+00 2297 2013 -2.08333333333333e+00 2297 2296 -8.33333333333333e+00 2297 2014 4.16666666666667e+00 2297 2302 8.33333333333333e+00 2297 1928 -6.25000000000000e+00 2297 2015 -6.25000000000000e+00 2297 1927 -2.08333333333333e+00 2297 2314 4.16666666666667e+00 2297 1926 4.16666666666667e+00 2297 2313 -8.33333333333333e+00 2297 2323 2.08333333333333e+00 2297 1925 -6.25000000000000e+00 2297 2303 -3.75000000000000e+01 2297 1924 -2.08333333333333e+00 2297 2011 2.08333333333333e+00 2297 2295 -8.33333333333333e+00 2297 1923 4.16666666666667e+00 2297 2301 8.33333333333333e+00 2298 2298 1.25000000000000e+02 2298 2375 -4.16666666666667e+00 2298 2374 -4.16666666666667e+00 2298 2311 -8.33333333333333e+00 2298 2302 8.33333333333333e+00 2298 2369 -8.33333333333333e+00 2298 2368 4.16666666666667e+00 2298 2303 8.33333333333333e+00 2298 2301 -3.75000000000000e+01 2298 2309 -4.16666666666667e+00 2298 2372 4.16666666666667e+00 2298 2308 8.33333333333333e+00 2298 2299 -1.66666666666667e+01 2298 2194 8.33333333333333e+00 2298 2192 -8.33333333333333e+00 2298 1925 8.33333333333333e+00 2298 2191 4.16666666666667e+00 2298 1924 -4.16666666666667e+00 2298 2307 -1.25000000000000e+01 2298 2195 8.33333333333333e+00 2298 2300 -1.66666666666667e+01 2298 1937 8.33333333333333e+00 2298 2371 4.16666666666667e+00 2298 1936 -4.16666666666667e+00 2298 2193 -3.75000000000000e+01 2298 2161 -4.16666666666667e+00 2298 2011 4.16666666666667e+00 2298 2012 4.16666666666667e+00 2298 2162 -4.16666666666667e+00 2298 1923 -1.25000000000000e+01 2298 2024 -4.16666666666667e+00 2298 2168 4.16666666666667e+00 2298 2023 8.33333333333333e+00 2298 2167 -8.33333333333333e+00 2298 2022 -1.25000000000000e+01 2298 2312 4.16666666666667e+00 2298 1935 -1.25000000000000e+01 2299 2299 1.25000000000000e+02 2299 2312 4.16666666666667e+00 2299 2310 -8.33333333333333e+00 2299 2375 -4.16666666666667e+00 2299 2303 -4.16666666666667e+00 2299 2369 4.16666666666667e+00 2299 2301 8.33333333333333e+00 2299 2367 4.16666666666667e+00 2299 2302 -1.25000000000000e+01 2299 2192 4.16666666666667e+00 2299 2195 -4.16666666666667e+00 2299 2307 8.33333333333333e+00 2299 2298 -1.66666666666667e+01 2299 2193 8.33333333333333e+00 2299 2309 8.33333333333333e+00 2299 2308 -3.75000000000000e+01 2299 2190 4.16666666666667e+00 2299 1923 -4.16666666666667e+00 2299 2372 -8.33333333333333e+00 2299 2194 -1.25000000000000e+01 2299 2370 4.16666666666667e+00 2299 1935 -4.16666666666667e+00 2299 2160 -4.16666666666667e+00 2299 2010 4.16666666666667e+00 2299 2162 -4.16666666666667e+00 2299 2168 4.16666666666667e+00 2299 2012 -8.33333333333333e+00 2299 1925 8.33333333333333e+00 2299 1924 -1.25000000000000e+01 2299 2024 8.33333333333333e+00 2299 2300 -1.66666666666667e+01 2299 1937 8.33333333333333e+00 2299 2023 -3.75000000000000e+01 2299 2373 -4.16666666666667e+00 2299 1936 -1.25000000000000e+01 2299 2022 8.33333333333333e+00 2299 2166 -8.33333333333333e+00 2300 2300 1.25000000000000e+02 2300 2373 -4.16666666666667e+00 2300 2311 4.16666666666667e+00 2300 2374 -4.16666666666667e+00 2300 2302 -4.16666666666667e+00 2300 2368 4.16666666666667e+00 2300 2367 -8.33333333333333e+00 2300 2303 -1.25000000000000e+01 2300 2301 8.33333333333333e+00 2300 2191 4.16666666666667e+00 2300 2194 -4.16666666666667e+00 2300 2307 -4.16666666666667e+00 2300 2370 4.16666666666667e+00 2300 2309 -1.25000000000000e+01 2300 2308 8.33333333333333e+00 2300 2190 -8.33333333333333e+00 2300 1923 8.33333333333333e+00 2300 2195 -1.25000000000000e+01 2300 2371 -8.33333333333333e+00 2300 2193 8.33333333333333e+00 2300 2298 -1.66666666666667e+01 2300 1935 8.33333333333333e+00 2300 2161 -4.16666666666667e+00 2300 2167 4.16666666666667e+00 2300 1925 -3.75000000000000e+01 2300 2011 -8.33333333333333e+00 2300 1924 8.33333333333333e+00 2300 2010 4.16666666666667e+00 2300 2160 -4.16666666666667e+00 2300 2024 -1.25000000000000e+01 2300 2310 4.16666666666667e+00 2300 1937 -3.75000000000000e+01 2300 2023 8.33333333333333e+00 2300 2299 -1.66666666666667e+01 2300 1936 8.33333333333333e+00 2300 2022 -4.16666666666667e+00 2300 2166 4.16666666666667e+00 2301 2301 1.25000000000000e+02 2301 2326 -8.33333333333333e+00 2301 2296 -4.16666666666667e+00 2301 2014 4.16666666666667e+00 2301 2015 4.16666666666667e+00 2301 2297 8.33333333333333e+00 2301 2295 -1.25000000000000e+01 2301 2315 8.33333333333333e+00 2301 2314 8.33333333333333e+00 2301 2313 -3.75000000000000e+01 2301 2390 -4.16666666666667e+00 2301 2389 -4.16666666666667e+00 2301 2312 -4.16666666666667e+00 2301 2375 4.16666666666667e+00 2301 2374 4.16666666666667e+00 2301 2311 8.33333333333333e+00 2301 2302 -1.66666666666667e+01 2301 2310 -1.25000000000000e+01 2301 2027 -4.16666666666667e+00 2301 2303 -1.66666666666667e+01 2301 2012 -4.16666666666667e+00 2301 2024 4.16666666666667e+00 2301 2299 8.33333333333333e+00 2301 2026 8.33333333333333e+00 2301 2023 -8.33333333333333e+00 2301 2300 8.33333333333333e+00 2301 1925 -8.33333333333333e+00 2301 1924 4.16666666666667e+00 2301 2011 -4.16666666666667e+00 2301 2298 -3.75000000000000e+01 2301 2369 8.33333333333333e+00 2301 1940 -8.33333333333333e+00 2301 2368 -4.16666666666667e+00 2301 1939 4.16666666666667e+00 2301 2367 -1.25000000000000e+01 2301 2327 4.16666666666667e+00 2301 2025 -1.25000000000000e+01 2302 2302 1.25000000000000e+02 2302 2325 -8.33333333333333e+00 2302 2297 8.33333333333333e+00 2302 2295 -4.16666666666667e+00 2302 2013 4.16666666666667e+00 2302 2015 -8.33333333333333e+00 2302 2296 -1.25000000000000e+01 2302 2315 -4.16666666666667e+00 2302 2314 -1.25000000000000e+01 2302 2313 8.33333333333333e+00 2302 2388 -4.16666666666667e+00 2302 2312 8.33333333333333e+00 2302 2375 -8.33333333333333e+00 2302 2373 4.16666666666667e+00 2302 1925 4.16666666666667e+00 2302 2311 -3.75000000000000e+01 2302 2310 8.33333333333333e+00 2302 2301 -1.66666666666667e+01 2302 2390 -4.16666666666667e+00 2302 1940 4.16666666666667e+00 2302 2300 -4.16666666666667e+00 2302 2298 8.33333333333333e+00 2302 2012 -4.16666666666667e+00 2302 2024 4.16666666666667e+00 2302 2025 8.33333333333333e+00 2302 2022 -8.33333333333333e+00 2302 2299 -1.25000000000000e+01 2302 1923 4.16666666666667e+00 2302 2010 -4.16666666666667e+00 2302 2369 8.33333333333333e+00 2302 2303 -1.66666666666667e+01 2302 2027 8.33333333333333e+00 2302 2368 -1.25000000000000e+01 2302 2327 4.16666666666667e+00 2302 2026 -3.75000000000000e+01 2302 2367 -4.16666666666667e+00 2302 1938 4.16666666666667e+00 2303 2303 1.25000000000000e+02 2303 2326 4.16666666666667e+00 2303 2296 8.33333333333333e+00 2303 2014 -8.33333333333333e+00 2303 2013 4.16666666666667e+00 2303 2297 -3.75000000000000e+01 2303 2295 8.33333333333333e+00 2303 2315 -1.25000000000000e+01 2303 2314 -4.16666666666667e+00 2303 2313 8.33333333333333e+00 2303 2388 -4.16666666666667e+00 2303 2311 8.33333333333333e+00 2303 2310 -4.16666666666667e+00 2303 2373 4.16666666666667e+00 2303 2374 -8.33333333333333e+00 2303 2312 -1.25000000000000e+01 2303 1924 4.16666666666667e+00 2303 2389 -4.16666666666667e+00 2303 1939 4.16666666666667e+00 2303 2025 -4.16666666666667e+00 2303 2299 -4.16666666666667e+00 2303 2301 -1.66666666666667e+01 2303 2010 -4.16666666666667e+00 2303 2022 4.16666666666667e+00 2303 2011 -4.16666666666667e+00 2303 2023 4.16666666666667e+00 2303 2300 -1.25000000000000e+01 2303 2298 8.33333333333333e+00 2303 1923 -8.33333333333333e+00 2303 2369 -3.75000000000000e+01 2303 2325 4.16666666666667e+00 2303 2027 -1.25000000000000e+01 2303 2368 8.33333333333333e+00 2303 2302 -1.66666666666667e+01 2303 2026 8.33333333333333e+00 2303 2367 8.33333333333333e+00 2303 1938 -8.33333333333333e+00 2304 2304 6.25000000000000e+01 2304 2326 4.16666666666667e+00 2304 2327 -8.33333333333333e+00 2304 1925 2.08333333333333e+00 2304 2297 -2.08333333333333e+00 2304 2296 4.16666666666667e+00 2304 2295 -6.25000000000000e+00 2304 1952 2.08333333333333e+00 2304 2323 4.16666666666667e+00 2304 2322 -1.87500000000000e+01 2304 2311 -4.16666666666667e+00 2304 2054 -2.08333333333333e+00 2304 2305 -8.33333333333333e+00 2304 2422 -4.16666666666667e+00 2304 2059 4.16666666666667e+00 2304 2423 -4.16666666666667e+00 2304 2060 4.16666666666667e+00 2304 1951 -4.16666666666667e+00 2304 2053 4.16666666666667e+00 2304 2052 -6.25000000000000e+00 2304 2306 -8.33333333333333e+00 2304 2048 4.16666666666667e+00 2304 2312 8.33333333333333e+00 2304 2047 4.16666666666667e+00 2304 1924 -4.16666666666667e+00 2304 2324 4.16666666666667e+00 2304 2046 -1.87500000000000e+01 2304 2310 -1.25000000000000e+01 2305 2305 6.25000000000000e+01 2305 2325 4.16666666666667e+00 2305 2327 4.16666666666667e+00 2305 2297 4.16666666666667e+00 2305 2306 -8.33333333333333e+00 2305 2296 -1.87500000000000e+01 2305 2295 4.16666666666667e+00 2305 2323 -6.25000000000000e+00 2305 2322 4.16666666666667e+00 2305 2310 -4.16666666666667e+00 2305 2304 -8.33333333333333e+00 2305 2054 4.16666666666667e+00 2305 2421 -4.16666666666667e+00 2305 2058 4.16666666666667e+00 2305 2312 8.33333333333333e+00 2305 2060 -8.33333333333333e+00 2305 1952 2.08333333333333e+00 2305 2423 -4.16666666666667e+00 2305 2053 -1.87500000000000e+01 2305 1950 -4.16666666666667e+00 2305 2052 4.16666666666667e+00 2305 2048 -2.08333333333333e+00 2305 1925 2.08333333333333e+00 2305 2324 -2.08333333333333e+00 2305 2047 -6.25000000000000e+00 2305 2311 -1.25000000000000e+01 2305 2046 4.16666666666667e+00 2305 1923 -4.16666666666667e+00 2306 2306 6.25000000000000e+01 2306 2322 4.16666666666667e+00 2306 2326 4.16666666666667e+00 2306 2325 -8.33333333333333e+00 2306 2297 -6.25000000000000e+00 2306 2296 4.16666666666667e+00 2306 2305 -8.33333333333333e+00 2306 1923 2.08333333333333e+00 2306 2295 -2.08333333333333e+00 2306 2324 -6.25000000000000e+00 2306 1950 2.08333333333333e+00 2306 2052 -2.08333333333333e+00 2306 2053 4.16666666666667e+00 2306 2311 8.33333333333333e+00 2306 2059 -8.33333333333333e+00 2306 2421 -4.16666666666667e+00 2306 2058 4.16666666666667e+00 2306 2054 -6.25000000000000e+00 2306 1951 2.08333333333333e+00 2306 2422 -4.16666666666667e+00 2306 2323 -2.08333333333333e+00 2306 2048 -6.25000000000000e+00 2306 2312 -3.75000000000000e+01 2306 2047 -2.08333333333333e+00 2306 1924 2.08333333333333e+00 2306 2304 -8.33333333333333e+00 2306 2046 4.16666666666667e+00 2306 2310 8.33333333333333e+00 2307 2307 1.25000000000000e+02 2307 2374 4.16666666666667e+00 2307 2429 -4.16666666666667e+00 2307 2060 4.16666666666667e+00 2307 2059 -8.33333333333333e+00 2307 2311 8.33333333333333e+00 2307 2428 -4.16666666666667e+00 2307 2312 8.33333333333333e+00 2307 2310 -3.75000000000000e+01 2307 2300 -4.16666666666667e+00 2307 2195 4.16666666666667e+00 2307 2299 8.33333333333333e+00 2307 2194 -8.33333333333333e+00 2307 1924 4.16666666666667e+00 2307 2298 -1.25000000000000e+01 2307 2309 -1.66666666666667e+01 2307 2372 8.33333333333333e+00 2307 1954 4.16666666666667e+00 2307 2371 -4.16666666666667e+00 2307 2370 -1.25000000000000e+01 2307 2191 -4.16666666666667e+00 2307 2048 8.33333333333333e+00 2307 2044 4.16666666666667e+00 2307 2047 -4.16666666666667e+00 2307 2045 -8.33333333333333e+00 2307 2204 8.33333333333333e+00 2307 1925 4.16666666666667e+00 2307 2192 -4.16666666666667e+00 2307 2046 -1.25000000000000e+01 2307 2057 -4.16666666666667e+00 2307 1955 4.16666666666667e+00 2307 2308 -1.66666666666667e+01 2307 2056 8.33333333333333e+00 2307 2203 8.33333333333333e+00 2307 2375 -8.33333333333333e+00 2307 2055 -1.25000000000000e+01 2307 2202 -3.75000000000000e+01 2308 2308 1.25000000000000e+02 2308 2373 4.16666666666667e+00 2308 2429 -4.16666666666667e+00 2308 2060 4.16666666666667e+00 2308 2312 -4.16666666666667e+00 2308 2058 -8.33333333333333e+00 2308 2310 8.33333333333333e+00 2308 2427 -4.16666666666667e+00 2308 2311 -1.25000000000000e+01 2308 2195 4.16666666666667e+00 2308 2298 8.33333333333333e+00 2308 2193 -8.33333333333333e+00 2308 2300 8.33333333333333e+00 2308 2299 -3.75000000000000e+01 2308 1923 4.16666666666667e+00 2308 2372 8.33333333333333e+00 2308 2371 -1.25000000000000e+01 2308 1953 4.16666666666667e+00 2308 2370 -4.16666666666667e+00 2308 2190 -4.16666666666667e+00 2308 2192 -4.16666666666667e+00 2308 2309 -1.66666666666667e+01 2308 2043 4.16666666666667e+00 2308 2046 -4.16666666666667e+00 2308 2045 4.16666666666667e+00 2308 2204 -4.16666666666667e+00 2308 1925 -8.33333333333333e+00 2308 2048 8.33333333333333e+00 2308 2047 -1.25000000000000e+01 2308 2057 8.33333333333333e+00 2308 1955 -8.33333333333333e+00 2308 2375 4.16666666666667e+00 2308 2056 -3.75000000000000e+01 2308 2203 -1.25000000000000e+01 2308 2307 -1.66666666666667e+01 2308 2055 8.33333333333333e+00 2308 2202 8.33333333333333e+00 2309 2309 1.25000000000000e+02 2309 2373 -8.33333333333333e+00 2309 2427 -4.16666666666667e+00 2309 2428 -4.16666666666667e+00 2309 2058 4.16666666666667e+00 2309 2059 4.16666666666667e+00 2309 2311 -4.16666666666667e+00 2309 2312 -1.25000000000000e+01 2309 2310 8.33333333333333e+00 2309 2194 4.16666666666667e+00 2309 2298 -4.16666666666667e+00 2309 2193 4.16666666666667e+00 2309 2300 -1.25000000000000e+01 2309 2299 8.33333333333333e+00 2309 2372 -3.75000000000000e+01 2309 2371 8.33333333333333e+00 2309 2307 -1.66666666666667e+01 2309 2370 8.33333333333333e+00 2309 2191 -4.16666666666667e+00 2309 2308 -1.66666666666667e+01 2309 2046 8.33333333333333e+00 2309 2044 4.16666666666667e+00 2309 2203 -4.16666666666667e+00 2309 2043 -8.33333333333333e+00 2309 2202 8.33333333333333e+00 2309 2048 -3.75000000000000e+01 2309 1924 -8.33333333333333e+00 2309 2047 8.33333333333333e+00 2309 1923 4.16666666666667e+00 2309 2190 -4.16666666666667e+00 2309 2374 4.16666666666667e+00 2309 2057 -1.25000000000000e+01 2309 2204 -1.25000000000000e+01 2309 2056 8.33333333333333e+00 2309 1954 -8.33333333333333e+00 2309 2055 -4.16666666666667e+00 2309 1953 4.16666666666667e+00 2310 2310 1.25000000000000e+02 2310 2327 8.33333333333333e+00 2310 2297 4.16666666666667e+00 2310 2326 8.33333333333333e+00 2310 2325 -3.75000000000000e+01 2310 2305 -4.16666666666667e+00 2310 2423 4.16666666666667e+00 2310 2306 8.33333333333333e+00 2310 2304 -1.25000000000000e+01 2310 2422 -8.33333333333333e+00 2310 2312 -1.66666666666667e+01 2310 1958 -4.16666666666667e+00 2310 1925 -4.16666666666667e+00 2310 2389 4.16666666666667e+00 2310 2374 -4.16666666666667e+00 2310 2303 -4.16666666666667e+00 2310 2300 4.16666666666667e+00 2310 2390 -8.33333333333333e+00 2310 2375 8.33333333333333e+00 2310 2373 -1.25000000000000e+01 2310 2302 8.33333333333333e+00 2310 2299 -8.33333333333333e+00 2310 2301 -1.25000000000000e+01 2310 2060 -4.16666666666667e+00 2310 2429 4.16666666666667e+00 2310 2059 8.33333333333333e+00 2310 2311 -1.66666666666667e+01 2310 2308 8.33333333333333e+00 2310 2428 4.16666666666667e+00 2310 1957 -4.16666666666667e+00 2310 2058 -1.25000000000000e+01 2310 2309 8.33333333333333e+00 2310 2048 -8.33333333333333e+00 2310 2047 4.16666666666667e+00 2310 1924 -4.16666666666667e+00 2310 2307 -3.75000000000000e+01 2310 2296 4.16666666666667e+00 2311 2311 1.25000000000000e+02 2311 2327 -4.16666666666667e+00 2311 2297 -8.33333333333333e+00 2311 2326 -1.25000000000000e+01 2311 2325 8.33333333333333e+00 2311 2304 -4.16666666666667e+00 2311 2306 8.33333333333333e+00 2311 2305 -1.25000000000000e+01 2311 2423 4.16666666666667e+00 2311 2421 -8.33333333333333e+00 2311 2388 4.16666666666667e+00 2311 2373 -4.16666666666667e+00 2311 2303 8.33333333333333e+00 2311 2312 -1.66666666666667e+01 2311 2375 8.33333333333333e+00 2311 1958 -4.16666666666667e+00 2311 2390 4.16666666666667e+00 2311 2374 -1.25000000000000e+01 2311 1925 -4.16666666666667e+00 2311 2300 4.16666666666667e+00 2311 2302 -3.75000000000000e+01 2311 2301 8.33333333333333e+00 2311 2298 -8.33333333333333e+00 2311 2048 4.16666666666667e+00 2311 2309 -4.16666666666667e+00 2311 2058 8.33333333333333e+00 2311 2310 -1.66666666666667e+01 2311 2307 8.33333333333333e+00 2311 2429 -8.33333333333333e+00 2311 2060 8.33333333333333e+00 2311 2059 -3.75000000000000e+01 2311 2427 4.16666666666667e+00 2311 1956 -4.16666666666667e+00 2311 2308 -1.25000000000000e+01 2311 2295 4.16666666666667e+00 2311 2046 4.16666666666667e+00 2311 1923 -4.16666666666667e+00 2312 2312 1.25000000000000e+02 2312 2325 8.33333333333333e+00 2312 2296 -8.33333333333333e+00 2312 2295 4.16666666666667e+00 2312 2327 -1.25000000000000e+01 2312 2305 8.33333333333333e+00 2312 2421 4.16666666666667e+00 2312 2306 -3.75000000000000e+01 2312 2304 8.33333333333333e+00 2312 2422 4.16666666666667e+00 2312 2310 -1.66666666666667e+01 2312 1956 -4.16666666666667e+00 2312 1923 -4.16666666666667e+00 2312 2302 8.33333333333333e+00 2312 2311 -1.66666666666667e+01 2312 2374 8.33333333333333e+00 2312 2301 -4.16666666666667e+00 2312 2298 4.16666666666667e+00 2312 2375 -3.75000000000000e+01 2312 1957 -4.16666666666667e+00 2312 2389 4.16666666666667e+00 2312 2388 -8.33333333333333e+00 2312 2373 8.33333333333333e+00 2312 2303 -1.25000000000000e+01 2312 1924 -4.16666666666667e+00 2312 2299 4.16666666666667e+00 2312 2058 -4.16666666666667e+00 2312 2427 4.16666666666667e+00 2312 2047 4.16666666666667e+00 2312 2308 -4.16666666666667e+00 2312 2060 -1.25000000000000e+01 2312 2428 -8.33333333333333e+00 2312 2059 8.33333333333333e+00 2312 2309 -1.25000000000000e+01 2312 2326 -4.16666666666667e+00 2312 2307 8.33333333333333e+00 2312 2046 -8.33333333333333e+00 2313 2313 1.25000000000000e+02 2313 2327 -4.16666666666667e+00 2313 2326 8.33333333333333e+00 2313 2325 -1.25000000000000e+01 2313 2390 4.16666666666667e+00 2313 2296 4.16666666666667e+00 2313 2297 -8.33333333333333e+00 2313 2303 8.33333333333333e+00 2313 2302 8.33333333333333e+00 2313 2301 -3.75000000000000e+01 2313 2314 -1.66666666666667e+01 2313 1927 -4.16666666666667e+00 2313 1939 -4.16666666666667e+00 2313 2392 -4.16666666666667e+00 2313 2386 4.16666666666667e+00 2313 2393 -4.16666666666667e+00 2313 2330 4.16666666666667e+00 2313 1928 8.33333333333333e+00 2313 2315 -1.66666666666667e+01 2313 2321 8.33333333333333e+00 2313 2329 -8.33333333333333e+00 2313 2320 8.33333333333333e+00 2313 2319 -3.75000000000000e+01 2313 1940 8.33333333333333e+00 2313 2387 -8.33333333333333e+00 2313 2014 -4.16666666666667e+00 2313 2278 4.16666666666667e+00 2313 2279 4.16666666666667e+00 2313 2015 -4.16666666666667e+00 2313 1926 -1.25000000000000e+01 2313 2285 -4.16666666666667e+00 2313 2027 4.16666666666667e+00 2313 2284 8.33333333333333e+00 2313 2026 -8.33333333333333e+00 2313 2283 -1.25000000000000e+01 2313 2389 4.16666666666667e+00 2313 1938 -1.25000000000000e+01 2314 2314 1.25000000000000e+02 2314 2327 8.33333333333333e+00 2314 2326 -3.75000000000000e+01 2314 2325 8.33333333333333e+00 2314 2390 -8.33333333333333e+00 2314 2295 4.16666666666667e+00 2314 2297 4.16666666666667e+00 2314 2303 -4.16666666666667e+00 2314 2302 -1.25000000000000e+01 2314 2301 8.33333333333333e+00 2314 2313 -1.66666666666667e+01 2314 1926 -4.16666666666667e+00 2314 1938 -4.16666666666667e+00 2314 2391 -4.16666666666667e+00 2314 2385 4.16666666666667e+00 2314 2330 4.16666666666667e+00 2314 2321 -4.16666666666667e+00 2314 2320 -1.25000000000000e+01 2314 2328 -8.33333333333333e+00 2314 2319 8.33333333333333e+00 2314 2393 -4.16666666666667e+00 2314 2387 4.16666666666667e+00 2314 2013 -4.16666666666667e+00 2314 2277 4.16666666666667e+00 2314 2015 -4.16666666666667e+00 2314 2027 4.16666666666667e+00 2314 2279 -8.33333333333333e+00 2314 1928 8.33333333333333e+00 2314 1927 -1.25000000000000e+01 2314 2285 8.33333333333333e+00 2314 2315 -1.66666666666667e+01 2314 1940 8.33333333333333e+00 2314 2284 -3.75000000000000e+01 2314 2388 4.16666666666667e+00 2314 1939 -1.25000000000000e+01 2314 2283 8.33333333333333e+00 2314 2025 -8.33333333333333e+00 2315 2315 1.25000000000000e+02 2315 2326 8.33333333333333e+00 2315 2325 -4.16666666666667e+00 2315 2389 -8.33333333333333e+00 2315 2388 4.16666666666667e+00 2315 2296 4.16666666666667e+00 2315 2295 -8.33333333333333e+00 2315 2303 -1.25000000000000e+01 2315 2302 -4.16666666666667e+00 2315 2301 8.33333333333333e+00 2315 2391 -4.16666666666667e+00 2315 2328 4.16666666666667e+00 2315 2321 -1.25000000000000e+01 2315 2329 4.16666666666667e+00 2315 2320 -4.16666666666667e+00 2315 1926 8.33333333333333e+00 2315 2313 -1.66666666666667e+01 2315 2319 8.33333333333333e+00 2315 2392 -4.16666666666667e+00 2315 2386 4.16666666666667e+00 2315 1938 8.33333333333333e+00 2315 2385 -8.33333333333333e+00 2315 2014 -4.16666666666667e+00 2315 2026 4.16666666666667e+00 2315 1928 -3.75000000000000e+01 2315 2278 -8.33333333333333e+00 2315 1927 8.33333333333333e+00 2315 2277 4.16666666666667e+00 2315 2013 -4.16666666666667e+00 2315 2285 -1.25000000000000e+01 2315 2327 -1.25000000000000e+01 2315 1940 -3.75000000000000e+01 2315 2284 8.33333333333333e+00 2315 2314 -1.66666666666667e+01 2315 1939 8.33333333333333e+00 2315 2283 -4.16666666666667e+00 2315 2025 4.16666666666667e+00 2316 2316 6.25000000000000e+01 2316 2279 2.08333333333333e+00 2316 2278 -4.16666666666667e+00 2316 2287 4.16666666666667e+00 2316 2286 -6.25000000000000e+00 2316 1928 4.16666666666667e+00 2316 2318 -8.33333333333333e+00 2316 2321 8.33333333333333e+00 2316 2320 -4.16666666666667e+00 2316 2319 -1.25000000000000e+01 2316 2329 4.16666666666667e+00 2316 2063 -2.08333333333333e+00 2316 2330 4.16666666666667e+00 2316 2317 -8.33333333333333e+00 2316 2062 4.16666666666667e+00 2316 1927 4.16666666666667e+00 2316 2288 -2.08333333333333e+00 2316 2061 -6.25000000000000e+00 2316 1926 -1.87500000000000e+01 2316 1304 4.16666666666667e+00 2316 1574 -8.33333333333333e+00 2316 1573 4.16666666666667e+00 2316 1582 -4.16666666666667e+00 2316 1433 2.08333333333333e+00 2316 1583 -4.16666666666667e+00 2316 1303 4.16666666666667e+00 2316 1432 -4.16666666666667e+00 2316 1302 -1.87500000000000e+01 2317 2317 6.25000000000000e+01 2317 2318 -8.33333333333333e+00 2317 1928 -2.08333333333333e+00 2317 2279 2.08333333333333e+00 2317 2277 -4.16666666666667e+00 2317 2287 -1.87500000000000e+01 2317 2286 4.16666666666667e+00 2317 2321 8.33333333333333e+00 2317 2320 -1.25000000000000e+01 2317 2319 -4.16666666666667e+00 2317 2328 4.16666666666667e+00 2317 2063 4.16666666666667e+00 2317 2330 -8.33333333333333e+00 2317 2288 4.16666666666667e+00 2317 2062 -1.87500000000000e+01 2317 1927 -6.25000000000000e+00 2317 2316 -8.33333333333333e+00 2317 2061 4.16666666666667e+00 2317 1926 4.16666666666667e+00 2317 1304 -2.08333333333333e+00 2317 1574 4.16666666666667e+00 2317 1572 4.16666666666667e+00 2317 1581 -4.16666666666667e+00 2317 1433 2.08333333333333e+00 2317 1583 -4.16666666666667e+00 2317 1303 -6.25000000000000e+00 2317 1302 4.16666666666667e+00 2317 1431 -4.16666666666667e+00 2318 2318 6.25000000000000e+01 2318 2317 -8.33333333333333e+00 2318 2286 -2.08333333333333e+00 2318 2277 2.08333333333333e+00 2318 1927 -2.08333333333333e+00 2318 2278 2.08333333333333e+00 2318 2288 -6.25000000000000e+00 2318 2321 -3.75000000000000e+01 2318 2320 8.33333333333333e+00 2318 1926 4.16666666666667e+00 2318 2316 -8.33333333333333e+00 2318 2319 8.33333333333333e+00 2318 2287 4.16666666666667e+00 2318 2063 -6.25000000000000e+00 2318 1928 -6.25000000000000e+00 2318 2062 4.16666666666667e+00 2318 2329 -8.33333333333333e+00 2318 2061 -2.08333333333333e+00 2318 2328 4.16666666666667e+00 2318 1303 -2.08333333333333e+00 2318 1573 4.16666666666667e+00 2318 1302 4.16666666666667e+00 2318 1572 -8.33333333333333e+00 2318 1432 2.08333333333333e+00 2318 1582 -4.16666666666667e+00 2318 1304 -6.25000000000000e+00 2318 1431 2.08333333333333e+00 2318 1581 -4.16666666666667e+00 2319 2319 1.25000000000000e+02 2319 2284 -8.33333333333333e+00 2319 2279 -4.16666666666667e+00 2319 2287 4.16666666666667e+00 2319 2278 -4.16666666666667e+00 2319 2288 4.16666666666667e+00 2319 2294 -4.16666666666667e+00 2319 2293 8.33333333333333e+00 2319 2292 -1.25000000000000e+01 2319 2318 8.33333333333333e+00 2319 1927 4.16666666666667e+00 2319 2317 -4.16666666666667e+00 2319 2316 -1.25000000000000e+01 2319 2321 -1.66666666666667e+01 2319 2386 -4.16666666666667e+00 2319 2330 -4.16666666666667e+00 2319 2392 4.16666666666667e+00 2319 2393 4.16666666666667e+00 2319 1928 -8.33333333333333e+00 2319 2315 8.33333333333333e+00 2319 2329 8.33333333333333e+00 2319 2314 8.33333333333333e+00 2319 2320 -1.66666666666667e+01 2319 2328 -1.25000000000000e+01 2319 2313 -3.75000000000000e+01 2319 2387 8.33333333333333e+00 2319 2285 4.16666666666667e+00 2319 2385 -1.25000000000000e+01 2319 1583 4.16666666666667e+00 2319 1582 -8.33333333333333e+00 2319 1573 8.33333333333333e+00 2319 1574 8.33333333333333e+00 2319 1315 4.16666666666667e+00 2319 1572 -3.75000000000000e+01 2319 1645 -4.16666666666667e+00 2319 1646 -4.16666666666667e+00 2319 1316 -8.33333333333333e+00 2320 2320 1.25000000000000e+02 2320 2283 -8.33333333333333e+00 2320 2286 4.16666666666667e+00 2320 2277 -4.16666666666667e+00 2320 2288 -8.33333333333333e+00 2320 2294 8.33333333333333e+00 2320 2279 -4.16666666666667e+00 2320 2293 -3.75000000000000e+01 2320 2292 8.33333333333333e+00 2320 2318 8.33333333333333e+00 2320 2321 -1.66666666666667e+01 2320 2317 -1.25000000000000e+01 2320 1926 4.16666666666667e+00 2320 2316 -4.16666666666667e+00 2320 2385 -4.16666666666667e+00 2320 2330 8.33333333333333e+00 2320 2391 4.16666666666667e+00 2320 2393 -8.33333333333333e+00 2320 2387 8.33333333333333e+00 2320 1928 4.16666666666667e+00 2320 2315 -4.16666666666667e+00 2320 2329 -3.75000000000000e+01 2320 2314 -1.25000000000000e+01 2320 2328 8.33333333333333e+00 2320 2313 8.33333333333333e+00 2320 2319 -1.66666666666667e+01 2320 2285 4.16666666666667e+00 2320 2386 -1.25000000000000e+01 2320 1583 4.16666666666667e+00 2320 1574 -4.16666666666667e+00 2320 1581 -8.33333333333333e+00 2320 1572 8.33333333333333e+00 2320 1573 -1.25000000000000e+01 2320 1314 4.16666666666667e+00 2320 1644 -4.16666666666667e+00 2320 1646 -4.16666666666667e+00 2320 1316 4.16666666666667e+00 2321 2321 1.25000000000000e+02 2321 2283 4.16666666666667e+00 2321 2277 -4.16666666666667e+00 2321 2287 -8.33333333333333e+00 2321 2293 8.33333333333333e+00 2321 2286 4.16666666666667e+00 2321 2292 -4.16666666666667e+00 2321 2278 -4.16666666666667e+00 2321 2294 -1.25000000000000e+01 2321 2318 -3.75000000000000e+01 2321 2317 8.33333333333333e+00 2321 2320 -1.66666666666667e+01 2321 2316 8.33333333333333e+00 2321 2319 -1.66666666666667e+01 2321 2328 -4.16666666666667e+00 2321 2329 8.33333333333333e+00 2321 2392 -8.33333333333333e+00 2321 2386 8.33333333333333e+00 2321 2391 4.16666666666667e+00 2321 2330 -1.25000000000000e+01 2321 2315 -1.25000000000000e+01 2321 1927 4.16666666666667e+00 2321 2314 -4.16666666666667e+00 2321 1926 -8.33333333333333e+00 2321 2313 8.33333333333333e+00 2321 2284 4.16666666666667e+00 2321 2387 -3.75000000000000e+01 2321 2385 8.33333333333333e+00 2321 1582 4.16666666666667e+00 2321 1573 -4.16666666666667e+00 2321 1581 4.16666666666667e+00 2321 1574 -1.25000000000000e+01 2321 1572 8.33333333333333e+00 2321 1644 -4.16666666666667e+00 2321 1645 -4.16666666666667e+00 2321 1315 4.16666666666667e+00 2321 1314 -8.33333333333333e+00 2322 2322 6.25000000000000e+01 2322 2306 4.16666666666667e+00 2322 2297 2.08333333333333e+00 2322 1928 -2.08333333333333e+00 2322 2296 -4.16666666666667e+00 2322 1952 -2.08333333333333e+00 2322 2305 4.16666666666667e+00 2322 2304 -1.87500000000000e+01 2322 2423 4.16666666666667e+00 2322 2422 4.16666666666667e+00 2322 2327 8.33333333333333e+00 2322 2326 -4.16666666666667e+00 2322 2325 -1.25000000000000e+01 2322 2329 4.16666666666667e+00 2322 2425 -4.16666666666667e+00 2322 2066 2.08333333333333e+00 2322 2426 -4.16666666666667e+00 2322 2065 -4.16666666666667e+00 2322 1951 4.16666666666667e+00 2322 1950 -6.25000000000000e+00 2322 2063 4.16666666666667e+00 2322 2330 -8.33333333333333e+00 2322 2062 4.16666666666667e+00 2322 2323 -8.33333333333333e+00 2322 1927 4.16666666666667e+00 2322 2061 -1.87500000000000e+01 2322 2324 -8.33333333333333e+00 2322 1926 -6.25000000000000e+00 2323 2323 6.25000000000000e+01 2323 2297 2.08333333333333e+00 2323 2295 -4.16666666666667e+00 2323 2305 -6.25000000000000e+00 2323 2304 4.16666666666667e+00 2323 1952 4.16666666666667e+00 2323 2423 -8.33333333333333e+00 2323 2421 4.16666666666667e+00 2323 2324 -8.33333333333333e+00 2323 1928 4.16666666666667e+00 2323 2327 8.33333333333333e+00 2323 2326 -1.25000000000000e+01 2323 2325 -4.16666666666667e+00 2323 2328 4.16666666666667e+00 2323 2424 -4.16666666666667e+00 2323 2066 2.08333333333333e+00 2323 2426 -4.16666666666667e+00 2323 1951 -1.87500000000000e+01 2323 2064 -4.16666666666667e+00 2323 1950 4.16666666666667e+00 2323 2063 -2.08333333333333e+00 2323 2330 4.16666666666667e+00 2323 2062 -6.25000000000000e+00 2323 2306 -2.08333333333333e+00 2323 1927 -1.87500000000000e+01 2323 2061 4.16666666666667e+00 2323 2322 -8.33333333333333e+00 2323 1926 4.16666666666667e+00 2324 2324 6.25000000000000e+01 2324 2296 2.08333333333333e+00 2324 2322 -8.33333333333333e+00 2324 2304 4.16666666666667e+00 2324 2295 2.08333333333333e+00 2324 1926 -2.08333333333333e+00 2324 2306 -6.25000000000000e+00 2324 1950 -2.08333333333333e+00 2324 2421 4.16666666666667e+00 2324 1951 4.16666666666667e+00 2324 2422 -8.33333333333333e+00 2324 2327 -3.75000000000000e+01 2324 2323 -8.33333333333333e+00 2324 1927 4.16666666666667e+00 2324 2326 8.33333333333333e+00 2324 2325 8.33333333333333e+00 2324 2064 2.08333333333333e+00 2324 2424 -4.16666666666667e+00 2324 1952 -6.25000000000000e+00 2324 2065 2.08333333333333e+00 2324 2425 -4.16666666666667e+00 2324 2063 -6.25000000000000e+00 2324 2305 -2.08333333333333e+00 2324 1928 -6.25000000000000e+00 2324 2062 -2.08333333333333e+00 2324 2329 4.16666666666667e+00 2324 2061 4.16666666666667e+00 2324 2328 -8.33333333333333e+00 2325 2325 1.25000000000000e+02 2325 2302 -8.33333333333333e+00 2325 2296 -4.16666666666667e+00 2325 2305 4.16666666666667e+00 2325 2312 8.33333333333333e+00 2325 2306 -8.33333333333333e+00 2325 2297 -4.16666666666667e+00 2325 2311 8.33333333333333e+00 2325 2310 -3.75000000000000e+01 2325 2426 4.16666666666667e+00 2325 2423 -4.16666666666667e+00 2325 2422 8.33333333333333e+00 2325 2425 -8.33333333333333e+00 2325 2324 8.33333333333333e+00 2325 2327 -1.66666666666667e+01 2325 2323 -4.16666666666667e+00 2325 1927 4.16666666666667e+00 2325 2322 -1.25000000000000e+01 2325 1957 4.16666666666667e+00 2325 2421 -1.25000000000000e+01 2325 2389 -4.16666666666667e+00 2325 2330 8.33333333333333e+00 2325 2392 4.16666666666667e+00 2325 2434 -4.16666666666667e+00 2325 2393 -8.33333333333333e+00 2325 2390 8.33333333333333e+00 2325 1928 4.16666666666667e+00 2325 2315 -4.16666666666667e+00 2325 2329 8.33333333333333e+00 2325 2314 8.33333333333333e+00 2325 2326 -1.66666666666667e+01 2325 2328 -3.75000000000000e+01 2325 2313 -1.25000000000000e+01 2325 2435 -4.16666666666667e+00 2325 1958 4.16666666666667e+00 2325 2303 4.16666666666667e+00 2325 2388 -1.25000000000000e+01 2326 2326 1.25000000000000e+02 2326 2301 -8.33333333333333e+00 2326 2297 -4.16666666666667e+00 2326 2295 -4.16666666666667e+00 2326 2304 4.16666666666667e+00 2326 2312 -4.16666666666667e+00 2326 2306 4.16666666666667e+00 2326 2311 -1.25000000000000e+01 2326 2310 8.33333333333333e+00 2326 2426 4.16666666666667e+00 2326 2421 8.33333333333333e+00 2326 2424 -8.33333333333333e+00 2326 2324 8.33333333333333e+00 2326 2323 -1.25000000000000e+01 2326 2322 -4.16666666666667e+00 2326 1926 4.16666666666667e+00 2326 2423 8.33333333333333e+00 2326 2422 -3.75000000000000e+01 2326 1956 4.16666666666667e+00 2326 2327 -1.66666666666667e+01 2326 2388 -4.16666666666667e+00 2326 2330 -4.16666666666667e+00 2326 2391 4.16666666666667e+00 2326 2433 -4.16666666666667e+00 2326 2435 -4.16666666666667e+00 2326 2393 4.16666666666667e+00 2326 1928 -8.33333333333333e+00 2326 2315 8.33333333333333e+00 2326 2329 -1.25000000000000e+01 2326 2314 -3.75000000000000e+01 2326 2328 8.33333333333333e+00 2326 2313 8.33333333333333e+00 2326 2325 -1.66666666666667e+01 2326 2390 8.33333333333333e+00 2326 1958 -8.33333333333333e+00 2326 2303 4.16666666666667e+00 2326 2389 -1.25000000000000e+01 2327 2327 1.25000000000000e+02 2327 2302 4.16666666666667e+00 2327 2296 -4.16666666666667e+00 2327 2311 -4.16666666666667e+00 2327 2305 4.16666666666667e+00 2327 2310 8.33333333333333e+00 2327 2304 -8.33333333333333e+00 2327 2295 -4.16666666666667e+00 2327 2312 -1.25000000000000e+01 2327 2424 4.16666666666667e+00 2327 2421 -4.16666666666667e+00 2327 2425 4.16666666666667e+00 2327 2324 -3.75000000000000e+01 2327 2323 8.33333333333333e+00 2327 2322 8.33333333333333e+00 2327 2325 -1.66666666666667e+01 2327 2423 -1.25000000000000e+01 2327 2422 8.33333333333333e+00 2327 2326 -1.66666666666667e+01 2327 2329 -4.16666666666667e+00 2327 2328 8.33333333333333e+00 2327 2434 -4.16666666666667e+00 2327 2392 4.16666666666667e+00 2327 2391 -8.33333333333333e+00 2327 2388 8.33333333333333e+00 2327 2330 -1.25000000000000e+01 2327 2315 -1.25000000000000e+01 2327 1927 -8.33333333333333e+00 2327 2314 8.33333333333333e+00 2327 1926 4.16666666666667e+00 2327 2313 -4.16666666666667e+00 2327 2301 4.16666666666667e+00 2327 2390 -3.75000000000000e+01 2327 2389 8.33333333333333e+00 2327 1957 -8.33333333333333e+00 2327 2433 -4.16666666666667e+00 2327 1956 4.16666666666667e+00 2328 2328 1.25000000000000e+02 2328 2434 4.16666666666667e+00 2328 2435 4.16666666666667e+00 2328 2326 8.33333333333333e+00 2328 2325 -3.75000000000000e+01 2328 2323 4.16666666666667e+00 2328 2426 -4.16666666666667e+00 2328 2324 -8.33333333333333e+00 2328 2425 8.33333333333333e+00 2328 2424 -1.25000000000000e+01 2328 2329 -1.66666666666667e+01 2328 1927 -4.16666666666667e+00 2328 2315 4.16666666666667e+00 2328 2321 -4.16666666666667e+00 2328 2392 -4.16666666666667e+00 2328 2314 -8.33333333333333e+00 2328 2320 8.33333333333333e+00 2328 2319 -1.25000000000000e+01 2328 2393 8.33333333333333e+00 2328 2391 -1.25000000000000e+01 2328 2062 -4.16666666666667e+00 2328 2317 4.16666666666667e+00 2328 2063 8.33333333333333e+00 2328 2330 -1.66666666666667e+01 2328 2318 4.16666666666667e+00 2328 1928 -4.16666666666667e+00 2328 2061 -1.25000000000000e+01 2328 2327 8.33333333333333e+00 2328 1345 -4.16666666666667e+00 2328 1645 4.16666666666667e+00 2328 1646 -8.33333333333333e+00 2328 1583 8.33333333333333e+00 2328 1439 4.16666666666667e+00 2328 1346 -4.16666666666667e+00 2328 1582 8.33333333333333e+00 2328 1438 -8.33333333333333e+00 2328 1581 -3.75000000000000e+01 2329 2329 1.25000000000000e+02 2329 2433 4.16666666666667e+00 2329 2435 -8.33333333333333e+00 2329 2326 -1.25000000000000e+01 2329 2325 8.33333333333333e+00 2329 2322 4.16666666666667e+00 2329 2426 8.33333333333333e+00 2329 2324 4.16666666666667e+00 2329 2425 -3.75000000000000e+01 2329 2424 8.33333333333333e+00 2329 2328 -1.66666666666667e+01 2329 1926 -4.16666666666667e+00 2329 2393 8.33333333333333e+00 2329 2330 -1.66666666666667e+01 2329 2321 8.33333333333333e+00 2329 2391 -4.16666666666667e+00 2329 1928 -4.16666666666667e+00 2329 2315 4.16666666666667e+00 2329 2320 -3.75000000000000e+01 2329 2313 -8.33333333333333e+00 2329 2319 8.33333333333333e+00 2329 2392 -1.25000000000000e+01 2329 2061 -4.16666666666667e+00 2329 2316 4.16666666666667e+00 2329 2318 -8.33333333333333e+00 2329 2063 8.33333333333333e+00 2329 2062 -1.25000000000000e+01 2329 2327 -4.16666666666667e+00 2329 1344 -4.16666666666667e+00 2329 1644 4.16666666666667e+00 2329 1346 -4.16666666666667e+00 2329 1646 4.16666666666667e+00 2329 1439 4.16666666666667e+00 2329 1583 -4.16666666666667e+00 2329 1582 -1.25000000000000e+01 2329 1581 8.33333333333333e+00 2329 1437 -8.33333333333333e+00 2330 2330 1.25000000000000e+02 2330 2325 8.33333333333333e+00 2330 2434 -8.33333333333333e+00 2330 2433 4.16666666666667e+00 2330 2327 -1.25000000000000e+01 2330 2425 8.33333333333333e+00 2330 2424 -4.16666666666667e+00 2330 2323 4.16666666666667e+00 2330 2322 -8.33333333333333e+00 2330 2426 -1.25000000000000e+01 2330 2313 4.16666666666667e+00 2330 2319 -4.16666666666667e+00 2330 2392 8.33333333333333e+00 2330 2329 -1.66666666666667e+01 2330 2320 8.33333333333333e+00 2330 2321 -1.25000000000000e+01 2330 1927 -4.16666666666667e+00 2330 2314 4.16666666666667e+00 2330 2393 -3.75000000000000e+01 2330 2391 8.33333333333333e+00 2330 2061 8.33333333333333e+00 2330 2328 -1.66666666666667e+01 2330 2063 -3.75000000000000e+01 2330 2317 -8.33333333333333e+00 2330 2062 8.33333333333333e+00 2330 2316 4.16666666666667e+00 2330 1926 -4.16666666666667e+00 2330 2326 -4.16666666666667e+00 2330 1345 -4.16666666666667e+00 2330 1645 4.16666666666667e+00 2330 1644 -8.33333333333333e+00 2330 1438 4.16666666666667e+00 2330 1582 -4.16666666666667e+00 2330 1581 8.33333333333333e+00 2330 1583 -1.25000000000000e+01 2330 1437 4.16666666666667e+00 2330 1344 -4.16666666666667e+00 2331 2331 6.25000000000000e+01 2331 2363 -4.16666666666667e+00 2331 2360 -4.16666666666667e+00 2331 2359 2.08333333333333e+00 2331 2362 -4.16666666666667e+00 2331 2342 4.16666666666667e+00 2331 2341 -2.08333333333333e+00 2331 2347 4.16666666666667e+00 2331 2340 -6.25000000000000e+00 2331 2020 -2.08333333333333e+00 2331 2017 2.08333333333333e+00 2331 2351 4.16666666666667e+00 2331 2339 -4.16666666666667e+00 2331 1931 4.16666666666667e+00 2331 2018 -4.16666666666667e+00 2331 1930 4.16666666666667e+00 2331 2332 -8.33333333333333e+00 2331 2338 8.33333333333333e+00 2331 1929 -1.87500000000000e+01 2331 2337 -1.25000000000000e+01 2331 2333 -8.33333333333333e+00 2331 1934 4.16666666666667e+00 2331 2021 4.16666666666667e+00 2331 1933 4.16666666666667e+00 2331 2350 -8.33333333333333e+00 2331 2348 4.16666666666667e+00 2331 1932 -1.87500000000000e+01 2331 2019 -6.25000000000000e+00 2332 2332 6.25000000000000e+01 2332 2363 -4.16666666666667e+00 2332 2358 2.08333333333333e+00 2332 2361 -4.16666666666667e+00 2332 2342 4.16666666666667e+00 2332 2348 -8.33333333333333e+00 2332 2341 -6.25000000000000e+00 2332 2340 -2.08333333333333e+00 2332 2346 4.16666666666667e+00 2332 2019 -2.08333333333333e+00 2332 2016 2.08333333333333e+00 2332 2021 4.16666666666667e+00 2332 2333 -8.33333333333333e+00 2332 2339 8.33333333333333e+00 2332 1931 -2.08333333333333e+00 2332 2018 2.08333333333333e+00 2332 1930 -6.25000000000000e+00 2332 2338 -3.75000000000000e+01 2332 1929 4.16666666666667e+00 2332 2331 -8.33333333333333e+00 2332 2337 8.33333333333333e+00 2332 1934 -2.08333333333333e+00 2332 2351 4.16666666666667e+00 2332 2360 2.08333333333333e+00 2332 1933 -6.25000000000000e+00 2332 2020 -6.25000000000000e+00 2332 1932 4.16666666666667e+00 2332 2349 -8.33333333333333e+00 2333 2333 6.25000000000000e+01 2333 2362 -4.16666666666667e+00 2333 2346 4.16666666666667e+00 2333 2361 -4.16666666666667e+00 2333 2358 -4.16666666666667e+00 2333 2342 -1.87500000000000e+01 2333 2341 4.16666666666667e+00 2333 2347 -8.33333333333333e+00 2333 2340 4.16666666666667e+00 2333 2020 4.16666666666667e+00 2333 2332 -8.33333333333333e+00 2333 2338 8.33333333333333e+00 2333 2349 4.16666666666667e+00 2333 2337 -4.16666666666667e+00 2333 1931 -6.25000000000000e+00 2333 2339 -1.25000000000000e+01 2333 1930 -2.08333333333333e+00 2333 2017 2.08333333333333e+00 2333 1929 4.16666666666667e+00 2333 2016 -4.16666666666667e+00 2333 2359 2.08333333333333e+00 2333 1934 -6.25000000000000e+00 2333 2021 -1.87500000000000e+01 2333 1933 -2.08333333333333e+00 2333 2350 4.16666666666667e+00 2333 2331 -8.33333333333333e+00 2333 1932 4.16666666666667e+00 2333 2019 4.16666666666667e+00 2334 2334 1.25000000000000e+02 2334 2348 -8.33333333333333e+00 2334 2347 4.16666666666667e+00 2334 2380 -4.16666666666667e+00 2334 2339 8.33333333333333e+00 2334 2369 4.16666666666667e+00 2334 2368 -8.33333333333333e+00 2334 2338 8.33333333333333e+00 2334 2337 -3.75000000000000e+01 2334 2336 -1.66666666666667e+01 2334 2345 8.33333333333333e+00 2334 2344 -4.16666666666667e+00 2334 2377 4.16666666666667e+00 2334 2378 4.16666666666667e+00 2334 1937 -4.16666666666667e+00 2334 1931 -4.16666666666667e+00 2334 2343 -1.25000000000000e+01 2334 2228 4.16666666666667e+00 2334 1930 8.33333333333333e+00 2334 2227 -8.33333333333333e+00 2334 2231 8.33333333333333e+00 2334 2335 -1.66666666666667e+01 2334 1936 8.33333333333333e+00 2334 2230 8.33333333333333e+00 2334 2229 -3.75000000000000e+01 2334 2018 4.16666666666667e+00 2334 2165 -4.16666666666667e+00 2334 2017 4.16666666666667e+00 2334 2164 -4.16666666666667e+00 2334 1929 -1.25000000000000e+01 2334 2024 8.33333333333333e+00 2334 2168 -8.33333333333333e+00 2334 2023 -4.16666666666667e+00 2334 2167 4.16666666666667e+00 2334 2022 -1.25000000000000e+01 2334 2381 -4.16666666666667e+00 2334 1935 -1.25000000000000e+01 2335 2335 1.25000000000000e+02 2335 2381 -4.16666666666667e+00 2335 2346 4.16666666666667e+00 2335 2379 -4.16666666666667e+00 2335 2369 4.16666666666667e+00 2335 2339 -4.16666666666667e+00 2335 2367 -8.33333333333333e+00 2335 2338 -1.25000000000000e+01 2335 2337 8.33333333333333e+00 2335 2343 -4.16666666666667e+00 2335 2376 4.16666666666667e+00 2335 2378 -8.33333333333333e+00 2335 2345 8.33333333333333e+00 2335 2344 -1.25000000000000e+01 2335 2228 4.16666666666667e+00 2335 1929 8.33333333333333e+00 2335 2226 -8.33333333333333e+00 2335 2231 -4.16666666666667e+00 2335 2230 -1.25000000000000e+01 2335 2334 -1.66666666666667e+01 2335 1935 8.33333333333333e+00 2335 2229 8.33333333333333e+00 2335 2168 4.16666666666667e+00 2335 2165 -4.16666666666667e+00 2335 2018 -8.33333333333333e+00 2335 1931 8.33333333333333e+00 2335 1930 -3.75000000000000e+01 2335 2016 4.16666666666667e+00 2335 2163 -4.16666666666667e+00 2335 2024 8.33333333333333e+00 2335 2336 -1.66666666666667e+01 2335 1937 8.33333333333333e+00 2335 2023 -1.25000000000000e+01 2335 2348 4.16666666666667e+00 2335 1936 -3.75000000000000e+01 2335 2022 -4.16666666666667e+00 2335 2166 4.16666666666667e+00 2336 2336 1.25000000000000e+02 2336 2347 4.16666666666667e+00 2336 2380 -4.16666666666667e+00 2336 2346 -8.33333333333333e+00 2336 2368 4.16666666666667e+00 2336 2338 -4.16666666666667e+00 2336 2337 8.33333333333333e+00 2336 2367 4.16666666666667e+00 2336 2339 -1.25000000000000e+01 2336 2334 -1.66666666666667e+01 2336 2343 8.33333333333333e+00 2336 2377 -8.33333333333333e+00 2336 2376 4.16666666666667e+00 2336 1935 -4.16666666666667e+00 2336 2345 -3.75000000000000e+01 2336 2344 8.33333333333333e+00 2336 1929 -4.16666666666667e+00 2336 2226 4.16666666666667e+00 2336 2227 4.16666666666667e+00 2336 2231 -1.25000000000000e+01 2336 2230 -4.16666666666667e+00 2336 2229 8.33333333333333e+00 2336 2167 4.16666666666667e+00 2336 2164 -4.16666666666667e+00 2336 2016 4.16666666666667e+00 2336 2163 -4.16666666666667e+00 2336 1931 -1.25000000000000e+01 2336 2017 -8.33333333333333e+00 2336 1930 8.33333333333333e+00 2336 2024 -3.75000000000000e+01 2336 2379 -4.16666666666667e+00 2336 1937 -1.25000000000000e+01 2336 2023 8.33333333333333e+00 2336 2335 -1.66666666666667e+01 2336 1936 8.33333333333333e+00 2336 2022 8.33333333333333e+00 2336 2166 -8.33333333333333e+00 2337 2337 1.25000000000000e+02 2337 2381 4.16666666666667e+00 2337 2336 8.33333333333333e+00 2337 2024 -8.33333333333333e+00 2337 2023 4.16666666666667e+00 2337 2335 8.33333333333333e+00 2337 2334 -3.75000000000000e+01 2337 2369 -4.16666666666667e+00 2337 2368 8.33333333333333e+00 2337 2367 -1.25000000000000e+01 2337 2347 -4.16666666666667e+00 2337 2395 -4.16666666666667e+00 2337 2362 4.16666666666667e+00 2337 2348 8.33333333333333e+00 2337 2363 -8.33333333333333e+00 2337 1940 4.16666666666667e+00 2337 2396 -4.16666666666667e+00 2337 1931 4.16666666666667e+00 2337 2346 -1.25000000000000e+01 2337 2018 -4.16666666666667e+00 2337 2017 -4.16666666666667e+00 2337 2021 4.16666666666667e+00 2337 2333 -4.16666666666667e+00 2337 2338 -1.66666666666667e+01 2337 2020 4.16666666666667e+00 2337 2026 -4.16666666666667e+00 2337 1930 -8.33333333333333e+00 2337 2332 8.33333333333333e+00 2337 2331 -1.25000000000000e+01 2337 2339 -1.66666666666667e+01 2337 2351 8.33333333333333e+00 2337 2027 8.33333333333333e+00 2337 2350 8.33333333333333e+00 2337 1939 -8.33333333333333e+00 2337 2380 4.16666666666667e+00 2337 2349 -3.75000000000000e+01 2337 2025 -1.25000000000000e+01 2338 2338 1.25000000000000e+02 2338 2381 -8.33333333333333e+00 2338 2336 -4.16666666666667e+00 2338 2024 4.16666666666667e+00 2338 2022 4.16666666666667e+00 2338 2335 -1.25000000000000e+01 2338 2334 8.33333333333333e+00 2338 2369 8.33333333333333e+00 2338 2368 -3.75000000000000e+01 2338 2367 8.33333333333333e+00 2338 2346 -4.16666666666667e+00 2338 2394 -4.16666666666667e+00 2338 2361 4.16666666666667e+00 2338 2396 -4.16666666666667e+00 2338 2363 4.16666666666667e+00 2338 2339 -1.66666666666667e+01 2338 2348 8.33333333333333e+00 2338 2347 -1.25000000000000e+01 2338 2016 -4.16666666666667e+00 2338 2333 8.33333333333333e+00 2338 2337 -1.66666666666667e+01 2338 2021 -8.33333333333333e+00 2338 2027 8.33333333333333e+00 2338 2019 4.16666666666667e+00 2338 2025 -4.16666666666667e+00 2338 1931 4.16666666666667e+00 2338 2018 -4.16666666666667e+00 2338 2332 -3.75000000000000e+01 2338 1929 -8.33333333333333e+00 2338 2331 8.33333333333333e+00 2338 2351 -4.16666666666667e+00 2338 1940 4.16666666666667e+00 2338 2379 4.16666666666667e+00 2338 2350 -1.25000000000000e+01 2338 2026 -1.25000000000000e+01 2338 2349 8.33333333333333e+00 2338 1938 -8.33333333333333e+00 2339 2339 1.25000000000000e+02 2339 2379 4.16666666666667e+00 2339 2335 -4.16666666666667e+00 2339 2023 4.16666666666667e+00 2339 2334 8.33333333333333e+00 2339 2022 -8.33333333333333e+00 2339 2336 -1.25000000000000e+01 2339 2369 -1.25000000000000e+01 2339 2368 8.33333333333333e+00 2339 2367 -4.16666666666667e+00 2339 2395 -4.16666666666667e+00 2339 2362 4.16666666666667e+00 2339 2346 8.33333333333333e+00 2339 2361 -8.33333333333333e+00 2339 1938 4.16666666666667e+00 2339 2394 -4.16666666666667e+00 2339 2348 -3.75000000000000e+01 2339 2338 -1.66666666666667e+01 2339 2347 8.33333333333333e+00 2339 1929 4.16666666666667e+00 2339 2016 -4.16666666666667e+00 2339 2332 8.33333333333333e+00 2339 2019 4.16666666666667e+00 2339 2331 -4.16666666666667e+00 2339 2020 -8.33333333333333e+00 2339 2026 8.33333333333333e+00 2339 2333 -1.25000000000000e+01 2339 1930 4.16666666666667e+00 2339 2017 -4.16666666666667e+00 2339 2380 -8.33333333333333e+00 2339 2351 -1.25000000000000e+01 2339 2027 -3.75000000000000e+01 2339 2350 -4.16666666666667e+00 2339 1939 4.16666666666667e+00 2339 2337 -1.66666666666667e+01 2339 2349 8.33333333333333e+00 2339 2025 8.33333333333333e+00 2340 2340 6.25000000000000e+01 2340 2363 4.16666666666667e+00 2340 2362 -8.33333333333333e+00 2340 2333 4.16666666666667e+00 2340 2332 -2.08333333333333e+00 2340 1930 2.08333333333333e+00 2340 2331 -6.25000000000000e+00 2340 2360 4.16666666666667e+00 2340 1969 2.08333333333333e+00 2340 2358 -1.87500000000000e+01 2340 2348 -4.16666666666667e+00 2340 2342 -8.33333333333333e+00 2340 2089 -2.08333333333333e+00 2340 2459 -4.16666666666667e+00 2340 2096 4.16666666666667e+00 2340 2458 -4.16666666666667e+00 2340 2095 4.16666666666667e+00 2340 2090 4.16666666666667e+00 2340 1970 -4.16666666666667e+00 2340 2088 -6.25000000000000e+00 2340 2084 4.16666666666667e+00 2340 1931 -4.16666666666667e+00 2340 2083 4.16666666666667e+00 2340 2341 -8.33333333333333e+00 2340 2347 8.33333333333333e+00 2340 2082 -1.87500000000000e+01 2340 2359 4.16666666666667e+00 2340 2346 -1.25000000000000e+01 2341 2341 6.25000000000000e+01 2341 2358 4.16666666666667e+00 2341 2363 4.16666666666667e+00 2341 2361 -8.33333333333333e+00 2341 2333 4.16666666666667e+00 2341 2342 -8.33333333333333e+00 2341 2332 -6.25000000000000e+00 2341 2331 -2.08333333333333e+00 2341 1929 2.08333333333333e+00 2341 2359 -6.25000000000000e+00 2341 1968 2.08333333333333e+00 2341 2088 -2.08333333333333e+00 2341 2090 4.16666666666667e+00 2341 2348 8.33333333333333e+00 2341 2096 -8.33333333333333e+00 2341 2457 -4.16666666666667e+00 2341 2094 4.16666666666667e+00 2341 1970 2.08333333333333e+00 2341 2459 -4.16666666666667e+00 2341 2089 -6.25000000000000e+00 2341 2084 -2.08333333333333e+00 2341 1931 2.08333333333333e+00 2341 2083 -6.25000000000000e+00 2341 2360 -2.08333333333333e+00 2341 2347 -3.75000000000000e+01 2341 2082 4.16666666666667e+00 2341 2340 -8.33333333333333e+00 2341 2346 8.33333333333333e+00 2342 2342 6.25000000000000e+01 2342 2361 4.16666666666667e+00 2342 2362 4.16666666666667e+00 2342 2333 -1.87500000000000e+01 2342 2332 4.16666666666667e+00 2342 2341 -8.33333333333333e+00 2342 2331 4.16666666666667e+00 2342 2360 -6.25000000000000e+00 2342 2358 4.16666666666667e+00 2342 2346 -4.16666666666667e+00 2342 2340 -8.33333333333333e+00 2342 2089 4.16666666666667e+00 2342 2457 -4.16666666666667e+00 2342 2094 4.16666666666667e+00 2342 2347 8.33333333333333e+00 2342 2095 -8.33333333333333e+00 2342 2090 -1.87500000000000e+01 2342 1969 2.08333333333333e+00 2342 2458 -4.16666666666667e+00 2342 2088 4.16666666666667e+00 2342 1968 -4.16666666666667e+00 2342 2084 -6.25000000000000e+00 2342 2359 -2.08333333333333e+00 2342 2348 -1.25000000000000e+01 2342 2083 -2.08333333333333e+00 2342 1930 2.08333333333333e+00 2342 2082 4.16666666666667e+00 2342 1929 -4.16666666666667e+00 2343 2343 1.25000000000000e+02 2343 2380 -8.33333333333333e+00 2343 2348 8.33333333333333e+00 2343 2096 -8.33333333333333e+00 2343 2464 -4.16666666666667e+00 2343 2095 4.16666666666667e+00 2343 2465 -4.16666666666667e+00 2343 2347 8.33333333333333e+00 2343 2346 -3.75000000000000e+01 2343 2336 8.33333333333333e+00 2343 2335 -4.16666666666667e+00 2343 2231 -8.33333333333333e+00 2343 2230 4.16666666666667e+00 2343 1973 4.16666666666667e+00 2343 2378 -4.16666666666667e+00 2343 2377 8.33333333333333e+00 2343 2344 -1.66666666666667e+01 2343 2376 -1.25000000000000e+01 2343 1931 4.16666666666667e+00 2343 2334 -1.25000000000000e+01 2343 2084 -4.16666666666667e+00 2343 2083 8.33333333333333e+00 2343 2228 -4.16666666666667e+00 2343 2081 4.16666666666667e+00 2343 2239 8.33333333333333e+00 2343 2080 -8.33333333333333e+00 2343 1930 4.16666666666667e+00 2343 2227 -4.16666666666667e+00 2343 2082 -1.25000000000000e+01 2343 2345 -1.66666666666667e+01 2343 2093 8.33333333333333e+00 2343 2240 8.33333333333333e+00 2343 2092 -4.16666666666667e+00 2343 1972 4.16666666666667e+00 2343 2381 4.16666666666667e+00 2343 2091 -1.25000000000000e+01 2343 2238 -3.75000000000000e+01 2344 2344 1.25000000000000e+02 2344 2379 -8.33333333333333e+00 2344 2348 -4.16666666666667e+00 2344 2465 -4.16666666666667e+00 2344 2096 4.16666666666667e+00 2344 2463 -4.16666666666667e+00 2344 2094 4.16666666666667e+00 2344 2347 -1.25000000000000e+01 2344 2346 8.33333333333333e+00 2344 2334 -4.16666666666667e+00 2344 2231 4.16666666666667e+00 2344 2229 4.16666666666667e+00 2344 2378 8.33333333333333e+00 2344 2377 -3.75000000000000e+01 2344 2376 8.33333333333333e+00 2344 2343 -1.66666666666667e+01 2344 2336 8.33333333333333e+00 2344 2335 -1.25000000000000e+01 2344 2240 -4.16666666666667e+00 2344 2345 -1.66666666666667e+01 2344 2228 -4.16666666666667e+00 2344 2081 4.16666666666667e+00 2344 2082 8.33333333333333e+00 2344 2238 8.33333333333333e+00 2344 2079 -8.33333333333333e+00 2344 1931 -8.33333333333333e+00 2344 2084 8.33333333333333e+00 2344 2083 -3.75000000000000e+01 2344 1929 4.16666666666667e+00 2344 2226 -4.16666666666667e+00 2344 2093 8.33333333333333e+00 2344 1973 -8.33333333333333e+00 2344 2381 4.16666666666667e+00 2344 2092 -1.25000000000000e+01 2344 2239 -1.25000000000000e+01 2344 2091 -4.16666666666667e+00 2344 1971 4.16666666666667e+00 2345 2345 1.25000000000000e+02 2345 2379 4.16666666666667e+00 2345 2347 -4.16666666666667e+00 2345 2464 -4.16666666666667e+00 2345 2095 4.16666666666667e+00 2345 2346 8.33333333333333e+00 2345 2094 -8.33333333333333e+00 2345 2463 -4.16666666666667e+00 2345 2348 -1.25000000000000e+01 2345 2334 8.33333333333333e+00 2345 2230 4.16666666666667e+00 2345 2229 -8.33333333333333e+00 2345 2378 -1.25000000000000e+01 2345 2377 8.33333333333333e+00 2345 1971 4.16666666666667e+00 2345 2376 -4.16666666666667e+00 2345 2336 -3.75000000000000e+01 2345 2335 8.33333333333333e+00 2345 1929 4.16666666666667e+00 2345 2239 -4.16666666666667e+00 2345 2344 -1.66666666666667e+01 2345 2082 -4.16666666666667e+00 2345 2227 -4.16666666666667e+00 2345 2080 4.16666666666667e+00 2345 2226 -4.16666666666667e+00 2345 2079 4.16666666666667e+00 2345 2084 -1.25000000000000e+01 2345 1930 -8.33333333333333e+00 2345 2083 8.33333333333333e+00 2345 2380 4.16666666666667e+00 2345 2093 -3.75000000000000e+01 2345 2240 -1.25000000000000e+01 2345 2092 8.33333333333333e+00 2345 1972 -8.33333333333333e+00 2345 2343 -1.66666666666667e+01 2345 2091 8.33333333333333e+00 2345 2238 8.33333333333333e+00 2346 2346 1.25000000000000e+02 2346 2380 8.33333333333333e+00 2346 2336 -8.33333333333333e+00 2346 2335 4.16666666666667e+00 2346 2379 -1.25000000000000e+01 2346 2345 8.33333333333333e+00 2346 2464 4.16666666666667e+00 2346 2344 8.33333333333333e+00 2346 2343 -3.75000000000000e+01 2346 2465 4.16666666666667e+00 2346 2338 -4.16666666666667e+00 2346 2339 8.33333333333333e+00 2346 2348 -1.66666666666667e+01 2346 1931 -4.16666666666667e+00 2346 2337 -1.25000000000000e+01 2346 2396 4.16666666666667e+00 2346 1976 -4.16666666666667e+00 2346 2395 -8.33333333333333e+00 2346 2333 4.16666666666667e+00 2346 2347 -1.66666666666667e+01 2346 2362 8.33333333333333e+00 2346 2332 4.16666666666667e+00 2346 1930 -4.16666666666667e+00 2346 2363 8.33333333333333e+00 2346 1975 -4.16666666666667e+00 2346 2361 -3.75000000000000e+01 2346 2342 -4.16666666666667e+00 2346 2084 4.16666666666667e+00 2346 2458 4.16666666666667e+00 2346 2095 -4.16666666666667e+00 2346 2083 -8.33333333333333e+00 2346 2341 8.33333333333333e+00 2346 2340 -1.25000000000000e+01 2346 2096 8.33333333333333e+00 2346 2459 -8.33333333333333e+00 2346 2094 -1.25000000000000e+01 2346 2381 -4.16666666666667e+00 2347 2347 1.25000000000000e+02 2347 2379 8.33333333333333e+00 2347 2334 4.16666666666667e+00 2347 2381 8.33333333333333e+00 2347 2380 -3.75000000000000e+01 2347 2345 -4.16666666666667e+00 2347 2463 4.16666666666667e+00 2347 2344 -1.25000000000000e+01 2347 2343 8.33333333333333e+00 2347 2465 -8.33333333333333e+00 2347 2337 -4.16666666666667e+00 2347 2396 4.16666666666667e+00 2347 2339 8.33333333333333e+00 2347 2338 -1.25000000000000e+01 2347 2394 -8.33333333333333e+00 2347 2363 -4.16666666666667e+00 2347 2346 -1.66666666666667e+01 2347 2361 8.33333333333333e+00 2347 2333 -8.33333333333333e+00 2347 2331 4.16666666666667e+00 2347 1929 -4.16666666666667e+00 2347 2362 -1.25000000000000e+01 2347 1974 -4.16666666666667e+00 2347 2342 8.33333333333333e+00 2347 2348 -1.66666666666667e+01 2347 2096 8.33333333333333e+00 2347 2457 4.16666666666667e+00 2347 2094 -4.16666666666667e+00 2347 2084 4.16666666666667e+00 2347 1931 -4.16666666666667e+00 2347 2341 -3.75000000000000e+01 2347 2082 -8.33333333333333e+00 2347 2340 8.33333333333333e+00 2347 2459 4.16666666666667e+00 2347 1976 -4.16666666666667e+00 2347 2095 -1.25000000000000e+01 2347 2336 4.16666666666667e+00 2348 2348 1.25000000000000e+02 2348 2379 -4.16666666666667e+00 2348 2334 -8.33333333333333e+00 2348 2381 -1.25000000000000e+01 2348 2380 8.33333333333333e+00 2348 2344 -4.16666666666667e+00 2348 2343 8.33333333333333e+00 2348 2345 -1.25000000000000e+01 2348 2464 -8.33333333333333e+00 2348 2463 4.16666666666667e+00 2348 2395 4.16666666666667e+00 2348 2337 8.33333333333333e+00 2348 2346 -1.66666666666667e+01 2348 2339 -3.75000000000000e+01 2348 2338 8.33333333333333e+00 2348 1929 -4.16666666666667e+00 2348 2394 4.16666666666667e+00 2348 1974 -4.16666666666667e+00 2348 2331 4.16666666666667e+00 2348 2362 -4.16666666666667e+00 2348 2332 -8.33333333333333e+00 2348 2363 -1.25000000000000e+01 2348 2361 8.33333333333333e+00 2348 2340 -4.16666666666667e+00 2348 2082 4.16666666666667e+00 2348 2341 8.33333333333333e+00 2348 2347 -1.66666666666667e+01 2348 2095 8.33333333333333e+00 2348 2342 -1.25000000000000e+01 2348 2083 4.16666666666667e+00 2348 1930 -4.16666666666667e+00 2348 2096 -3.75000000000000e+01 2348 2335 4.16666666666667e+00 2348 2458 4.16666666666667e+00 2348 1975 -4.16666666666667e+00 2348 2094 8.33333333333333e+00 2348 2457 -8.33333333333333e+00 2349 2349 1.25000000000000e+02 2349 2387 4.16666666666667e+00 2349 2386 -8.33333333333333e+00 2349 2356 8.33333333333333e+00 2349 2355 -3.75000000000000e+01 2349 2282 4.16666666666667e+00 2349 2281 4.16666666666667e+00 2349 2285 8.33333333333333e+00 2349 2284 -4.16666666666667e+00 2349 2283 -1.25000000000000e+01 2349 2351 -1.66666666666667e+01 2349 1934 -4.16666666666667e+00 2349 1940 -4.16666666666667e+00 2349 2399 -4.16666666666667e+00 2349 2396 4.16666666666667e+00 2349 2366 -8.33333333333333e+00 2349 2363 8.33333333333333e+00 2349 2365 4.16666666666667e+00 2349 2362 -4.16666666666667e+00 2349 2361 -1.25000000000000e+01 2349 2398 -4.16666666666667e+00 2349 2395 4.16666666666667e+00 2349 2021 -4.16666666666667e+00 2349 2333 4.16666666666667e+00 2349 2020 -4.16666666666667e+00 2349 2026 4.16666666666667e+00 2349 2332 -8.33333333333333e+00 2349 1933 8.33333333333333e+00 2349 1932 -1.25000000000000e+01 2349 2339 8.33333333333333e+00 2349 2027 -8.33333333333333e+00 2349 2338 8.33333333333333e+00 2349 2350 -1.66666666666667e+01 2349 1939 8.33333333333333e+00 2349 2337 -3.75000000000000e+01 2349 2357 8.33333333333333e+00 2349 1938 -1.25000000000000e+01 2350 2350 1.25000000000000e+02 2350 2357 -4.16666666666667e+00 2350 2385 -8.33333333333333e+00 2350 2356 -1.25000000000000e+01 2350 2355 8.33333333333333e+00 2350 2282 -8.33333333333333e+00 2350 2280 4.16666666666667e+00 2350 2285 8.33333333333333e+00 2350 2284 -1.25000000000000e+01 2350 2283 -4.16666666666667e+00 2350 2399 -4.16666666666667e+00 2350 2366 4.16666666666667e+00 2350 1934 8.33333333333333e+00 2350 2351 -1.66666666666667e+01 2350 2363 8.33333333333333e+00 2350 2362 -1.25000000000000e+01 2350 2364 4.16666666666667e+00 2350 2361 -4.16666666666667e+00 2350 1940 8.33333333333333e+00 2350 2396 -8.33333333333333e+00 2350 2397 -4.16666666666667e+00 2350 2394 4.16666666666667e+00 2350 2019 -4.16666666666667e+00 2350 2025 4.16666666666667e+00 2350 2333 4.16666666666667e+00 2350 2021 -4.16666666666667e+00 2350 1933 -3.75000000000000e+01 2350 2331 -8.33333333333333e+00 2350 1932 8.33333333333333e+00 2350 2339 -4.16666666666667e+00 2350 2027 4.16666666666667e+00 2350 2338 -1.25000000000000e+01 2350 2387 4.16666666666667e+00 2350 1939 -3.75000000000000e+01 2350 2337 8.33333333333333e+00 2350 2349 -1.66666666666667e+01 2350 1938 8.33333333333333e+00 2351 2351 1.25000000000000e+02 2351 2356 -4.16666666666667e+00 2351 2355 8.33333333333333e+00 2351 2385 4.16666666666667e+00 2351 2357 -1.25000000000000e+01 2351 2280 4.16666666666667e+00 2351 2281 -8.33333333333333e+00 2351 2285 -3.75000000000000e+01 2351 2284 8.33333333333333e+00 2351 2283 8.33333333333333e+00 2351 2349 -1.66666666666667e+01 2351 1932 -4.16666666666667e+00 2351 1938 -4.16666666666667e+00 2351 2397 -4.16666666666667e+00 2351 2394 4.16666666666667e+00 2351 2398 -4.16666666666667e+00 2351 2365 4.16666666666667e+00 2351 2363 -3.75000000000000e+01 2351 1933 8.33333333333333e+00 2351 2350 -1.66666666666667e+01 2351 2362 8.33333333333333e+00 2351 2364 -8.33333333333333e+00 2351 2361 8.33333333333333e+00 2351 1939 8.33333333333333e+00 2351 2395 -8.33333333333333e+00 2351 2019 -4.16666666666667e+00 2351 2331 4.16666666666667e+00 2351 1934 -1.25000000000000e+01 2351 2332 4.16666666666667e+00 2351 2020 -4.16666666666667e+00 2351 2339 -1.25000000000000e+01 2351 2386 4.16666666666667e+00 2351 1940 -1.25000000000000e+01 2351 2338 -4.16666666666667e+00 2351 2026 4.16666666666667e+00 2351 2337 8.33333333333333e+00 2351 2025 -8.33333333333333e+00 2352 2352 6.25000000000000e+01 2352 2357 -4.16666666666667e+00 2352 2290 -2.08333333333333e+00 2352 2281 2.08333333333333e+00 2352 2291 4.16666666666667e+00 2352 2289 -6.25000000000000e+00 2352 2282 -4.16666666666667e+00 2352 2353 -8.33333333333333e+00 2352 2356 8.33333333333333e+00 2352 1933 4.16666666666667e+00 2352 2355 -1.25000000000000e+01 2352 2366 4.16666666666667e+00 2352 2354 -8.33333333333333e+00 2352 2099 4.16666666666667e+00 2352 1934 4.16666666666667e+00 2352 2098 -2.08333333333333e+00 2352 2365 4.16666666666667e+00 2352 2097 -6.25000000000000e+00 2352 1932 -1.87500000000000e+01 2352 1309 4.16666666666667e+00 2352 1609 -8.33333333333333e+00 2352 1619 -4.16666666666667e+00 2352 1310 4.16666666666667e+00 2352 1469 -4.16666666666667e+00 2352 1468 2.08333333333333e+00 2352 1618 -4.16666666666667e+00 2352 1308 -1.87500000000000e+01 2352 1610 4.16666666666667e+00 2353 2353 6.25000000000000e+01 2353 2291 4.16666666666667e+00 2353 2357 8.33333333333333e+00 2353 2289 -2.08333333333333e+00 2353 2280 2.08333333333333e+00 2353 2290 -6.25000000000000e+00 2353 2282 2.08333333333333e+00 2353 1934 -2.08333333333333e+00 2353 2356 -3.75000000000000e+01 2353 2352 -8.33333333333333e+00 2353 2355 8.33333333333333e+00 2353 1932 4.16666666666667e+00 2353 2099 4.16666666666667e+00 2353 2366 -8.33333333333333e+00 2353 2354 -8.33333333333333e+00 2353 2098 -6.25000000000000e+00 2353 1933 -6.25000000000000e+00 2353 2097 -2.08333333333333e+00 2353 2364 4.16666666666667e+00 2353 1310 -2.08333333333333e+00 2353 1610 4.16666666666667e+00 2353 1308 4.16666666666667e+00 2353 1608 -8.33333333333333e+00 2353 1469 2.08333333333333e+00 2353 1619 -4.16666666666667e+00 2353 1309 -6.25000000000000e+00 2353 1467 2.08333333333333e+00 2353 1617 -4.16666666666667e+00 2354 2354 6.25000000000000e+01 2354 2355 -4.16666666666667e+00 2354 2353 -8.33333333333333e+00 2354 2290 4.16666666666667e+00 2354 2356 8.33333333333333e+00 2354 2291 -1.87500000000000e+01 2354 2289 4.16666666666667e+00 2354 2357 -1.25000000000000e+01 2354 2281 2.08333333333333e+00 2354 1933 -2.08333333333333e+00 2354 2280 -4.16666666666667e+00 2354 2364 4.16666666666667e+00 2354 2099 -1.87500000000000e+01 2354 1934 -6.25000000000000e+00 2354 2098 4.16666666666667e+00 2354 2365 -8.33333333333333e+00 2354 2352 -8.33333333333333e+00 2354 2097 4.16666666666667e+00 2354 1932 4.16666666666667e+00 2354 1309 -2.08333333333333e+00 2354 1609 4.16666666666667e+00 2354 1468 2.08333333333333e+00 2354 1618 -4.16666666666667e+00 2354 1617 -4.16666666666667e+00 2354 1310 -6.25000000000000e+00 2354 1308 4.16666666666667e+00 2354 1467 -4.16666666666667e+00 2354 1608 4.16666666666667e+00 2355 2355 1.25000000000000e+02 2355 2398 4.16666666666667e+00 2355 2366 8.33333333333333e+00 2355 2365 -4.16666666666667e+00 2355 2364 -1.25000000000000e+01 2355 2291 4.16666666666667e+00 2355 2354 -4.16666666666667e+00 2355 2290 4.16666666666667e+00 2355 2357 -1.66666666666667e+01 2355 2353 8.33333333333333e+00 2355 2352 -1.25000000000000e+01 2355 2356 -1.66666666666667e+01 2355 2293 -4.16666666666667e+00 2355 2294 8.33333333333333e+00 2355 2285 -8.33333333333333e+00 2355 2351 8.33333333333333e+00 2355 2281 -4.16666666666667e+00 2355 2284 4.16666666666667e+00 2355 2387 -4.16666666666667e+00 2355 2386 8.33333333333333e+00 2355 2292 -1.25000000000000e+01 2355 2385 -1.25000000000000e+01 2355 2282 -4.16666666666667e+00 2355 1934 4.16666666666667e+00 2355 2350 8.33333333333333e+00 2355 1933 -8.33333333333333e+00 2355 2399 4.16666666666667e+00 2355 2349 -3.75000000000000e+01 2355 1651 -4.16666666666667e+00 2355 1619 -8.33333333333333e+00 2355 1618 4.16666666666667e+00 2355 1652 -4.16666666666667e+00 2355 1610 8.33333333333333e+00 2355 1609 8.33333333333333e+00 2355 1608 -3.75000000000000e+01 2355 1316 4.16666666666667e+00 2355 1315 -8.33333333333333e+00 2356 2356 1.25000000000000e+02 2356 2397 4.16666666666667e+00 2356 2364 -4.16666666666667e+00 2356 2366 8.33333333333333e+00 2356 2365 -1.25000000000000e+01 2356 2354 8.33333333333333e+00 2356 2291 -8.33333333333333e+00 2356 2289 4.16666666666667e+00 2356 1934 4.16666666666667e+00 2356 2353 -3.75000000000000e+01 2356 2352 8.33333333333333e+00 2356 2351 -4.16666666666667e+00 2356 2355 -1.66666666666667e+01 2356 2292 -4.16666666666667e+00 2356 2285 4.16666666666667e+00 2356 2282 -4.16666666666667e+00 2356 2280 -4.16666666666667e+00 2356 2283 4.16666666666667e+00 2356 2294 8.33333333333333e+00 2356 2387 8.33333333333333e+00 2356 2357 -1.66666666666667e+01 2356 2293 -1.25000000000000e+01 2356 2386 -3.75000000000000e+01 2356 2385 8.33333333333333e+00 2356 2399 -8.33333333333333e+00 2356 2350 -1.25000000000000e+01 2356 2349 8.33333333333333e+00 2356 1932 -8.33333333333333e+00 2356 1650 -4.16666666666667e+00 2356 1652 -4.16666666666667e+00 2356 1619 4.16666666666667e+00 2356 1617 4.16666666666667e+00 2356 1610 -4.16666666666667e+00 2356 1316 4.16666666666667e+00 2356 1609 -1.25000000000000e+01 2356 1608 8.33333333333333e+00 2356 1314 -8.33333333333333e+00 2357 2357 1.25000000000000e+02 2357 2398 -8.33333333333333e+00 2357 2364 8.33333333333333e+00 2357 2366 -3.75000000000000e+01 2357 2365 8.33333333333333e+00 2357 2289 4.16666666666667e+00 2357 2352 -4.16666666666667e+00 2357 2353 8.33333333333333e+00 2357 2290 -8.33333333333333e+00 2357 2355 -1.66666666666667e+01 2357 2354 -1.25000000000000e+01 2357 1933 4.16666666666667e+00 2357 2350 -4.16666666666667e+00 2357 2284 4.16666666666667e+00 2357 2281 -4.16666666666667e+00 2357 2292 8.33333333333333e+00 2357 2283 -8.33333333333333e+00 2357 2349 8.33333333333333e+00 2357 2294 -3.75000000000000e+01 2357 2387 -1.25000000000000e+01 2357 2293 8.33333333333333e+00 2357 2386 8.33333333333333e+00 2357 2356 -1.66666666666667e+01 2357 2385 -4.16666666666667e+00 2357 2397 4.16666666666667e+00 2357 2351 -1.25000000000000e+01 2357 2280 -4.16666666666667e+00 2357 1932 4.16666666666667e+00 2357 1651 -4.16666666666667e+00 2357 1618 4.16666666666667e+00 2357 1617 -8.33333333333333e+00 2357 1650 -4.16666666666667e+00 2357 1610 -1.25000000000000e+01 2357 1609 -4.16666666666667e+00 2357 1315 4.16666666666667e+00 2357 1608 8.33333333333333e+00 2357 1314 4.16666666666667e+00 2358 2358 6.25000000000000e+01 2358 2359 -8.33333333333333e+00 2358 2333 -4.16666666666667e+00 2358 1933 -2.08333333333333e+00 2358 2332 2.08333333333333e+00 2358 2342 4.16666666666667e+00 2358 1969 -2.08333333333333e+00 2358 2340 -1.87500000000000e+01 2358 2458 4.16666666666667e+00 2358 2363 -4.16666666666667e+00 2358 2362 8.33333333333333e+00 2358 2361 -1.25000000000000e+01 2358 2459 4.16666666666667e+00 2358 2366 4.16666666666667e+00 2358 2462 -4.16666666666667e+00 2358 2101 2.08333333333333e+00 2358 2461 -4.16666666666667e+00 2358 1970 4.16666666666667e+00 2358 2102 -4.16666666666667e+00 2358 1968 -6.25000000000000e+00 2358 2360 -8.33333333333333e+00 2358 2099 4.16666666666667e+00 2358 1934 4.16666666666667e+00 2358 2098 4.16666666666667e+00 2358 2365 -8.33333333333333e+00 2358 2341 4.16666666666667e+00 2358 2097 -1.87500000000000e+01 2358 1932 -6.25000000000000e+00 2359 2359 6.25000000000000e+01 2359 2333 2.08333333333333e+00 2359 2340 4.16666666666667e+00 2359 2358 -8.33333333333333e+00 2359 1932 -2.08333333333333e+00 2359 2331 2.08333333333333e+00 2359 2341 -6.25000000000000e+00 2359 1968 -2.08333333333333e+00 2359 2457 4.16666666666667e+00 2359 1934 4.16666666666667e+00 2359 2360 -8.33333333333333e+00 2359 2363 8.33333333333333e+00 2359 2362 -3.75000000000000e+01 2359 2361 8.33333333333333e+00 2359 1970 4.16666666666667e+00 2359 2459 -8.33333333333333e+00 2359 2100 2.08333333333333e+00 2359 2460 -4.16666666666667e+00 2359 2102 2.08333333333333e+00 2359 2462 -4.16666666666667e+00 2359 1969 -6.25000000000000e+00 2359 2099 -2.08333333333333e+00 2359 2366 4.16666666666667e+00 2359 2342 -2.08333333333333e+00 2359 2098 -6.25000000000000e+00 2359 1933 -6.25000000000000e+00 2359 2097 4.16666666666667e+00 2359 2364 -8.33333333333333e+00 2360 2360 6.25000000000000e+01 2360 2332 2.08333333333333e+00 2360 2331 -4.16666666666667e+00 2360 2342 -6.25000000000000e+00 2360 2340 4.16666666666667e+00 2360 2363 -1.25000000000000e+01 2360 1933 4.16666666666667e+00 2360 2359 -8.33333333333333e+00 2360 2362 8.33333333333333e+00 2360 2361 -4.16666666666667e+00 2360 1969 4.16666666666667e+00 2360 2458 -8.33333333333333e+00 2360 2457 4.16666666666667e+00 2360 2364 4.16666666666667e+00 2360 2460 -4.16666666666667e+00 2360 1970 -1.87500000000000e+01 2360 2101 2.08333333333333e+00 2360 2461 -4.16666666666667e+00 2360 1968 4.16666666666667e+00 2360 2100 -4.16666666666667e+00 2360 2341 -2.08333333333333e+00 2360 2099 -6.25000000000000e+00 2360 1934 -1.87500000000000e+01 2360 2098 -2.08333333333333e+00 2360 2365 4.16666666666667e+00 2360 2358 -8.33333333333333e+00 2360 2097 4.16666666666667e+00 2360 1932 4.16666666666667e+00 2361 2361 1.25000000000000e+02 2361 2339 -8.33333333333333e+00 2361 2342 4.16666666666667e+00 2361 2333 -4.16666666666667e+00 2361 2341 -8.33333333333333e+00 2361 2347 8.33333333333333e+00 2361 2332 -4.16666666666667e+00 2361 2348 8.33333333333333e+00 2361 2346 -3.75000000000000e+01 2361 2461 4.16666666666667e+00 2361 2458 -4.16666666666667e+00 2361 2462 -8.33333333333333e+00 2361 2459 8.33333333333333e+00 2361 1934 4.16666666666667e+00 2361 2360 -4.16666666666667e+00 2361 2359 8.33333333333333e+00 2361 2362 -1.66666666666667e+01 2361 2358 -1.25000000000000e+01 2361 1976 4.16666666666667e+00 2361 2457 -1.25000000000000e+01 2361 2396 -4.16666666666667e+00 2361 2399 4.16666666666667e+00 2361 2471 -4.16666666666667e+00 2361 2365 8.33333333333333e+00 2361 2398 -8.33333333333333e+00 2361 2395 8.33333333333333e+00 2361 2366 8.33333333333333e+00 2361 2351 8.33333333333333e+00 2361 2363 -1.66666666666667e+01 2361 1933 4.16666666666667e+00 2361 2350 -4.16666666666667e+00 2361 2364 -3.75000000000000e+01 2361 2349 -1.25000000000000e+01 2361 2470 -4.16666666666667e+00 2361 1975 4.16666666666667e+00 2361 2338 4.16666666666667e+00 2361 2394 -1.25000000000000e+01 2362 2362 1.25000000000000e+02 2362 2339 4.16666666666667e+00 2362 2333 -4.16666666666667e+00 2362 2342 4.16666666666667e+00 2362 2348 -4.16666666666667e+00 2362 2340 -8.33333333333333e+00 2362 2346 8.33333333333333e+00 2362 2331 -4.16666666666667e+00 2362 2347 -1.25000000000000e+01 2362 2460 4.16666666666667e+00 2362 2457 -4.16666666666667e+00 2362 2462 4.16666666666667e+00 2362 2360 8.33333333333333e+00 2362 2359 -3.75000000000000e+01 2362 2358 8.33333333333333e+00 2362 2361 -1.66666666666667e+01 2362 2459 8.33333333333333e+00 2362 2458 -1.25000000000000e+01 2362 2363 -1.66666666666667e+01 2362 2366 -4.16666666666667e+00 2362 2364 8.33333333333333e+00 2362 2399 4.16666666666667e+00 2362 2471 -4.16666666666667e+00 2362 2397 -8.33333333333333e+00 2362 2394 8.33333333333333e+00 2362 1934 -8.33333333333333e+00 2362 2351 8.33333333333333e+00 2362 2365 -1.25000000000000e+01 2362 2350 -1.25000000000000e+01 2362 1932 4.16666666666667e+00 2362 2349 -4.16666666666667e+00 2362 2396 8.33333333333333e+00 2362 1976 -8.33333333333333e+00 2362 2337 4.16666666666667e+00 2362 2395 -3.75000000000000e+01 2362 2469 -4.16666666666667e+00 2362 1974 4.16666666666667e+00 2363 2363 1.25000000000000e+02 2363 2337 -8.33333333333333e+00 2363 2332 -4.16666666666667e+00 2363 2340 4.16666666666667e+00 2363 2331 -4.16666666666667e+00 2363 2341 4.16666666666667e+00 2363 2347 -4.16666666666667e+00 2363 2348 -1.25000000000000e+01 2363 2346 8.33333333333333e+00 2363 2461 4.16666666666667e+00 2363 2460 -8.33333333333333e+00 2363 2457 8.33333333333333e+00 2363 2360 -1.25000000000000e+01 2363 2359 8.33333333333333e+00 2363 1932 4.16666666666667e+00 2363 2358 -4.16666666666667e+00 2363 2459 -3.75000000000000e+01 2363 2458 8.33333333333333e+00 2363 1974 4.16666666666667e+00 2363 2362 -1.66666666666667e+01 2363 2394 -4.16666666666667e+00 2363 2365 -4.16666666666667e+00 2363 2397 4.16666666666667e+00 2363 2469 -4.16666666666667e+00 2363 2398 4.16666666666667e+00 2363 2470 -4.16666666666667e+00 2363 2366 -1.25000000000000e+01 2363 2351 -3.75000000000000e+01 2363 1933 -8.33333333333333e+00 2363 2350 8.33333333333333e+00 2363 2364 8.33333333333333e+00 2363 2349 8.33333333333333e+00 2363 2361 -1.66666666666667e+01 2363 2338 4.16666666666667e+00 2363 2396 -1.25000000000000e+01 2363 2395 8.33333333333333e+00 2363 1975 -8.33333333333333e+00 2364 2364 1.25000000000000e+02 2364 2356 -4.16666666666667e+00 2364 2355 -1.25000000000000e+01 2364 2354 4.16666666666667e+00 2364 2353 4.16666666666667e+00 2364 2366 -1.66666666666667e+01 2364 1934 -4.16666666666667e+00 2364 2399 -4.16666666666667e+00 2364 2471 4.16666666666667e+00 2364 2398 8.33333333333333e+00 2364 2365 -1.66666666666667e+01 2364 2362 8.33333333333333e+00 2364 2351 -8.33333333333333e+00 2364 2363 8.33333333333333e+00 2364 1933 -4.16666666666667e+00 2364 2350 4.16666666666667e+00 2364 2361 -3.75000000000000e+01 2364 2470 4.16666666666667e+00 2364 2397 -1.25000000000000e+01 2364 2099 -4.16666666666667e+00 2364 2360 4.16666666666667e+00 2364 2461 -4.16666666666667e+00 2364 2359 -8.33333333333333e+00 2364 2098 8.33333333333333e+00 2364 2097 -1.25000000000000e+01 2364 2462 8.33333333333333e+00 2364 2460 -1.25000000000000e+01 2364 2357 8.33333333333333e+00 2364 1652 4.16666666666667e+00 2364 1651 -8.33333333333333e+00 2364 1618 8.33333333333333e+00 2364 1619 8.33333333333333e+00 2364 1617 -3.75000000000000e+01 2364 1364 -4.16666666666667e+00 2364 1363 -4.16666666666667e+00 2364 1474 4.16666666666667e+00 2364 1475 -8.33333333333333e+00 2365 2365 1.25000000000000e+02 2365 2355 -4.16666666666667e+00 2365 2357 8.33333333333333e+00 2365 2356 -1.25000000000000e+01 2365 2354 -8.33333333333333e+00 2365 2352 4.16666666666667e+00 2365 2351 4.16666666666667e+00 2365 2363 -4.16666666666667e+00 2365 2397 8.33333333333333e+00 2365 2364 -1.66666666666667e+01 2365 2361 8.33333333333333e+00 2365 2362 -1.25000000000000e+01 2365 1932 -4.16666666666667e+00 2365 2349 4.16666666666667e+00 2365 2399 8.33333333333333e+00 2365 2471 -8.33333333333333e+00 2365 2398 -3.75000000000000e+01 2365 2469 4.16666666666667e+00 2365 2099 8.33333333333333e+00 2365 2366 -1.66666666666667e+01 2365 2462 8.33333333333333e+00 2365 2460 -4.16666666666667e+00 2365 2360 4.16666666666667e+00 2365 1934 -4.16666666666667e+00 2365 2098 -3.75000000000000e+01 2365 2358 -8.33333333333333e+00 2365 2097 8.33333333333333e+00 2365 2461 -1.25000000000000e+01 2365 1650 -8.33333333333333e+00 2365 1619 -4.16666666666667e+00 2365 1617 8.33333333333333e+00 2365 1618 -1.25000000000000e+01 2365 1362 -4.16666666666667e+00 2365 1473 4.16666666666667e+00 2365 1475 4.16666666666667e+00 2365 1364 -4.16666666666667e+00 2365 1652 4.16666666666667e+00 2366 2366 1.25000000000000e+02 2366 2355 8.33333333333333e+00 2366 2357 -3.75000000000000e+01 2366 2356 8.33333333333333e+00 2366 2352 4.16666666666667e+00 2366 2353 -8.33333333333333e+00 2366 2364 -1.66666666666667e+01 2366 1932 -4.16666666666667e+00 2366 2350 4.16666666666667e+00 2366 2362 -4.16666666666667e+00 2366 2397 -4.16666666666667e+00 2366 2469 4.16666666666667e+00 2366 2363 -1.25000000000000e+01 2366 2349 -8.33333333333333e+00 2366 2361 8.33333333333333e+00 2366 2399 -1.25000000000000e+01 2366 2398 8.33333333333333e+00 2366 2470 -8.33333333333333e+00 2366 2097 -4.16666666666667e+00 2366 2358 4.16666666666667e+00 2366 2098 8.33333333333333e+00 2366 2365 -1.66666666666667e+01 2366 2461 8.33333333333333e+00 2366 2099 -1.25000000000000e+01 2366 2359 4.16666666666667e+00 2366 1933 -4.16666666666667e+00 2366 2462 -3.75000000000000e+01 2366 2460 8.33333333333333e+00 2366 1650 4.16666666666667e+00 2366 1618 -4.16666666666667e+00 2366 1619 -1.25000000000000e+01 2366 1617 8.33333333333333e+00 2366 1362 -4.16666666666667e+00 2366 1651 4.16666666666667e+00 2366 1474 4.16666666666667e+00 2366 1363 -4.16666666666667e+00 2366 1473 -8.33333333333333e+00 2367 2367 1.25000000000000e+02 2367 2375 -4.16666666666667e+00 2367 2389 -8.33333333333333e+00 2367 2374 8.33333333333333e+00 2367 2373 -1.25000000000000e+01 2367 2300 -8.33333333333333e+00 2367 2299 4.16666666666667e+00 2367 2303 8.33333333333333e+00 2367 2302 -4.16666666666667e+00 2367 2301 -1.25000000000000e+01 2367 2402 -4.16666666666667e+00 2367 2384 4.16666666666667e+00 2367 1937 8.33333333333333e+00 2367 2369 -1.66666666666667e+01 2367 2381 8.33333333333333e+00 2367 2383 4.16666666666667e+00 2367 2380 -4.16666666666667e+00 2367 2379 -1.25000000000000e+01 2367 1940 8.33333333333333e+00 2367 2396 -8.33333333333333e+00 2367 2401 -4.16666666666667e+00 2367 2395 4.16666666666667e+00 2367 2023 -4.16666666666667e+00 2367 2026 4.16666666666667e+00 2367 2336 4.16666666666667e+00 2367 2024 -4.16666666666667e+00 2367 1936 8.33333333333333e+00 2367 2335 -8.33333333333333e+00 2367 1935 -3.75000000000000e+01 2367 2339 -4.16666666666667e+00 2367 2027 4.16666666666667e+00 2367 2368 -1.66666666666667e+01 2367 2338 8.33333333333333e+00 2367 1939 8.33333333333333e+00 2367 2390 4.16666666666667e+00 2367 2337 -1.25000000000000e+01 2367 1938 -3.75000000000000e+01 2368 2368 1.25000000000000e+02 2368 2390 4.16666666666667e+00 2368 2388 -8.33333333333333e+00 2368 2374 -3.75000000000000e+01 2368 2373 8.33333333333333e+00 2368 2300 4.16666666666667e+00 2368 2298 4.16666666666667e+00 2368 2303 8.33333333333333e+00 2368 2302 -1.25000000000000e+01 2368 2301 -4.16666666666667e+00 2368 2369 -1.66666666666667e+01 2368 1940 -4.16666666666667e+00 2368 1937 -4.16666666666667e+00 2368 2396 4.16666666666667e+00 2368 2402 -4.16666666666667e+00 2368 2384 -8.33333333333333e+00 2368 2381 8.33333333333333e+00 2368 2380 -1.25000000000000e+01 2368 2382 4.16666666666667e+00 2368 2379 -4.16666666666667e+00 2368 2400 -4.16666666666667e+00 2368 2394 4.16666666666667e+00 2368 2336 4.16666666666667e+00 2368 2024 -4.16666666666667e+00 2368 2022 -4.16666666666667e+00 2368 2025 4.16666666666667e+00 2368 1936 -1.25000000000000e+01 2368 1935 8.33333333333333e+00 2368 2334 -8.33333333333333e+00 2368 2339 8.33333333333333e+00 2368 2027 -8.33333333333333e+00 2368 2375 8.33333333333333e+00 2368 2338 -3.75000000000000e+01 2368 1939 -1.25000000000000e+01 2368 2367 -1.66666666666667e+01 2368 2337 8.33333333333333e+00 2368 1938 8.33333333333333e+00 2369 2369 1.25000000000000e+02 2369 2373 -4.16666666666667e+00 2369 2374 8.33333333333333e+00 2369 2389 4.16666666666667e+00 2369 2375 -1.25000000000000e+01 2369 2299 4.16666666666667e+00 2369 2298 -8.33333333333333e+00 2369 2303 -3.75000000000000e+01 2369 2302 8.33333333333333e+00 2369 2301 8.33333333333333e+00 2369 2368 -1.66666666666667e+01 2369 1939 -4.16666666666667e+00 2369 1936 -4.16666666666667e+00 2369 2395 4.16666666666667e+00 2369 2401 -4.16666666666667e+00 2369 2400 -4.16666666666667e+00 2369 2382 4.16666666666667e+00 2369 2381 -3.75000000000000e+01 2369 2383 -8.33333333333333e+00 2369 2380 8.33333333333333e+00 2369 1935 8.33333333333333e+00 2369 2367 -1.66666666666667e+01 2369 2379 8.33333333333333e+00 2369 1938 8.33333333333333e+00 2369 2394 -8.33333333333333e+00 2369 2335 4.16666666666667e+00 2369 2023 -4.16666666666667e+00 2369 1937 -1.25000000000000e+01 2369 2334 4.16666666666667e+00 2369 2022 -4.16666666666667e+00 2369 2388 4.16666666666667e+00 2369 2339 -1.25000000000000e+01 2369 1940 -1.25000000000000e+01 2369 2338 8.33333333333333e+00 2369 2026 -8.33333333333333e+00 2369 2337 -4.16666666666667e+00 2369 2025 4.16666666666667e+00 2370 2370 1.25000000000000e+02 2370 2429 4.16666666666667e+00 2370 2428 -8.33333333333333e+00 2370 2374 8.33333333333333e+00 2370 2373 -3.75000000000000e+01 2370 2432 -4.16666666666667e+00 2370 2431 -4.16666666666667e+00 2370 2384 -8.33333333333333e+00 2370 2383 4.16666666666667e+00 2370 2300 4.16666666666667e+00 2370 2309 8.33333333333333e+00 2370 2308 -4.16666666666667e+00 2370 2307 -1.25000000000000e+01 2370 2299 4.16666666666667e+00 2370 2203 4.16666666666667e+00 2370 2194 -4.16666666666667e+00 2370 2195 -4.16666666666667e+00 2370 2204 -8.33333333333333e+00 2370 2267 8.33333333333333e+00 2370 2372 -1.66666666666667e+01 2370 2120 8.33333333333333e+00 2370 2125 4.16666666666667e+00 2370 2119 -4.16666666666667e+00 2370 1937 -4.16666666666667e+00 2370 2261 4.16666666666667e+00 2370 1936 8.33333333333333e+00 2370 2260 -8.33333333333333e+00 2370 1935 -1.25000000000000e+01 2370 2118 -1.25000000000000e+01 2370 1955 -4.16666666666667e+00 2370 2126 4.16666666666667e+00 2370 2371 -1.66666666666667e+01 2370 1954 8.33333333333333e+00 2370 2266 8.33333333333333e+00 2370 2375 8.33333333333333e+00 2370 1953 -1.25000000000000e+01 2370 2265 -3.75000000000000e+01 2371 2371 1.25000000000000e+02 2371 2375 -4.16666666666667e+00 2371 2427 -8.33333333333333e+00 2371 2374 -1.25000000000000e+01 2371 2373 8.33333333333333e+00 2371 2432 -4.16666666666667e+00 2371 2384 4.16666666666667e+00 2371 2430 -4.16666666666667e+00 2371 2382 4.16666666666667e+00 2371 2309 8.33333333333333e+00 2371 2308 -1.25000000000000e+01 2371 2307 -4.16666666666667e+00 2371 2300 -8.33333333333333e+00 2371 2298 4.16666666666667e+00 2371 2202 4.16666666666667e+00 2371 2193 -4.16666666666667e+00 2371 2204 4.16666666666667e+00 2371 2195 -4.16666666666667e+00 2371 2267 -4.16666666666667e+00 2371 2261 4.16666666666667e+00 2371 2124 4.16666666666667e+00 2371 2118 -4.16666666666667e+00 2371 1937 8.33333333333333e+00 2371 2372 -1.66666666666667e+01 2371 2120 8.33333333333333e+00 2371 1936 -3.75000000000000e+01 2371 2119 -1.25000000000000e+01 2371 1935 8.33333333333333e+00 2371 2259 -8.33333333333333e+00 2371 1955 8.33333333333333e+00 2371 2126 -8.33333333333333e+00 2371 2429 4.16666666666667e+00 2371 1954 -3.75000000000000e+01 2371 2266 -1.25000000000000e+01 2371 2370 -1.66666666666667e+01 2371 1953 8.33333333333333e+00 2371 2265 8.33333333333333e+00 2372 2372 1.25000000000000e+02 2372 2374 -4.16666666666667e+00 2372 2373 8.33333333333333e+00 2372 2427 4.16666666666667e+00 2372 2375 -1.25000000000000e+01 2372 2430 -4.16666666666667e+00 2372 2431 -4.16666666666667e+00 2372 2383 4.16666666666667e+00 2372 2382 -8.33333333333333e+00 2372 2298 4.16666666666667e+00 2372 2309 -3.75000000000000e+01 2372 2308 8.33333333333333e+00 2372 2307 8.33333333333333e+00 2372 2299 -8.33333333333333e+00 2372 2193 -4.16666666666667e+00 2372 2203 4.16666666666667e+00 2372 2202 -8.33333333333333e+00 2372 2194 -4.16666666666667e+00 2372 2266 -4.16666666666667e+00 2372 2260 4.16666666666667e+00 2372 2265 8.33333333333333e+00 2372 2370 -1.66666666666667e+01 2372 2118 8.33333333333333e+00 2372 1937 -1.25000000000000e+01 2372 2120 -3.75000000000000e+01 2372 1936 8.33333333333333e+00 2372 2371 -1.66666666666667e+01 2372 2119 8.33333333333333e+00 2372 1935 -4.16666666666667e+00 2372 2259 4.16666666666667e+00 2372 2428 4.16666666666667e+00 2372 1955 -1.25000000000000e+01 2372 2267 -1.25000000000000e+01 2372 1954 8.33333333333333e+00 2372 2125 -8.33333333333333e+00 2372 1953 -4.16666666666667e+00 2372 2124 4.16666666666667e+00 2373 2373 1.25000000000000e+02 2373 2401 4.16666666666667e+00 2373 2437 -4.16666666666667e+00 2373 2432 4.16666666666667e+00 2373 2438 -4.16666666666667e+00 2373 2431 4.16666666666667e+00 2373 2383 -4.16666666666667e+00 2373 2384 8.33333333333333e+00 2373 2382 -1.25000000000000e+01 2373 2309 -8.33333333333333e+00 2373 2372 8.33333333333333e+00 2373 2308 4.16666666666667e+00 2373 1958 4.16666666666667e+00 2373 2429 -4.16666666666667e+00 2373 2428 8.33333333333333e+00 2373 2427 -1.25000000000000e+01 2373 1937 4.16666666666667e+00 2373 2371 8.33333333333333e+00 2373 2370 -3.75000000000000e+01 2373 2369 -4.16666666666667e+00 2373 2374 -1.66666666666667e+01 2373 2311 -4.16666666666667e+00 2373 2303 4.16666666666667e+00 2373 2300 -4.16666666666667e+00 2373 2302 4.16666666666667e+00 2373 2299 -4.16666666666667e+00 2373 2312 8.33333333333333e+00 2373 2390 8.33333333333333e+00 2373 2375 -1.66666666666667e+01 2373 1957 -8.33333333333333e+00 2373 2389 8.33333333333333e+00 2373 2310 -1.25000000000000e+01 2373 2388 -3.75000000000000e+01 2373 2368 8.33333333333333e+00 2373 1936 -8.33333333333333e+00 2373 2402 -8.33333333333333e+00 2373 2367 -1.25000000000000e+01 2374 2374 1.25000000000000e+02 2374 2400 4.16666666666667e+00 2374 2436 -4.16666666666667e+00 2374 2432 -8.33333333333333e+00 2374 2384 8.33333333333333e+00 2374 2430 4.16666666666667e+00 2374 2382 -4.16666666666667e+00 2374 2438 -4.16666666666667e+00 2374 2383 -1.25000000000000e+01 2374 2309 4.16666666666667e+00 2374 2372 -4.16666666666667e+00 2374 2307 4.16666666666667e+00 2374 2429 8.33333333333333e+00 2374 2375 -1.66666666666667e+01 2374 2428 -3.75000000000000e+01 2374 2427 8.33333333333333e+00 2374 2371 -1.25000000000000e+01 2374 2370 8.33333333333333e+00 2374 2373 -1.66666666666667e+01 2374 2310 -4.16666666666667e+00 2374 2312 8.33333333333333e+00 2374 2303 -8.33333333333333e+00 2374 2369 8.33333333333333e+00 2374 2301 4.16666666666667e+00 2374 2298 -4.16666666666667e+00 2374 1958 4.16666666666667e+00 2374 2390 -4.16666666666667e+00 2374 2311 -1.25000000000000e+01 2374 2389 -1.25000000000000e+01 2374 1956 -8.33333333333333e+00 2374 2388 8.33333333333333e+00 2374 2300 -4.16666666666667e+00 2374 1937 4.16666666666667e+00 2374 2402 4.16666666666667e+00 2374 2368 -3.75000000000000e+01 2374 2367 8.33333333333333e+00 2374 1935 -8.33333333333333e+00 2375 2375 1.25000000000000e+02 2375 2400 -8.33333333333333e+00 2375 2430 4.16666666666667e+00 2375 2436 -4.16666666666667e+00 2375 2431 -8.33333333333333e+00 2375 2383 8.33333333333333e+00 2375 2437 -4.16666666666667e+00 2375 2384 -3.75000000000000e+01 2375 2382 8.33333333333333e+00 2375 2308 4.16666666666667e+00 2375 2371 -4.16666666666667e+00 2375 2307 -8.33333333333333e+00 2375 2370 8.33333333333333e+00 2375 2429 -1.25000000000000e+01 2375 2428 8.33333333333333e+00 2375 2374 -1.66666666666667e+01 2375 1956 4.16666666666667e+00 2375 2427 -4.16666666666667e+00 2375 2372 -1.25000000000000e+01 2375 1935 4.16666666666667e+00 2375 2367 -4.16666666666667e+00 2375 2311 8.33333333333333e+00 2375 2301 4.16666666666667e+00 2375 2298 -4.16666666666667e+00 2375 2302 -8.33333333333333e+00 2375 2368 8.33333333333333e+00 2375 2312 -3.75000000000000e+01 2375 2390 -1.25000000000000e+01 2375 1957 4.16666666666667e+00 2375 2389 -4.16666666666667e+00 2375 2310 8.33333333333333e+00 2375 2388 8.33333333333333e+00 2375 2373 -1.66666666666667e+01 2375 2401 4.16666666666667e+00 2375 2369 -1.25000000000000e+01 2375 2299 -4.16666666666667e+00 2375 1936 4.16666666666667e+00 2376 2376 1.25000000000000e+02 2376 2465 -8.33333333333333e+00 2376 2381 8.33333333333333e+00 2376 2380 8.33333333333333e+00 2376 2379 -3.75000000000000e+01 2376 2467 -4.16666666666667e+00 2376 2468 -4.16666666666667e+00 2376 2384 4.16666666666667e+00 2376 2383 -8.33333333333333e+00 2376 2335 4.16666666666667e+00 2376 2230 -4.16666666666667e+00 2376 2345 -4.16666666666667e+00 2376 2240 4.16666666666667e+00 2376 2344 8.33333333333333e+00 2376 2239 -8.33333333333333e+00 2376 2343 -1.25000000000000e+01 2376 2336 4.16666666666667e+00 2376 2231 -4.16666666666667e+00 2376 2132 4.16666666666667e+00 2376 2120 -4.16666666666667e+00 2376 2377 -1.66666666666667e+01 2376 2119 8.33333333333333e+00 2376 2272 8.33333333333333e+00 2376 1937 8.33333333333333e+00 2376 2261 -8.33333333333333e+00 2376 1936 -4.16666666666667e+00 2376 2260 4.16666666666667e+00 2376 1935 -1.25000000000000e+01 2376 2118 -1.25000000000000e+01 2376 2378 -1.66666666666667e+01 2376 1973 8.33333333333333e+00 2376 2273 8.33333333333333e+00 2376 1972 -4.16666666666667e+00 2376 2131 4.16666666666667e+00 2376 2464 4.16666666666667e+00 2376 1971 -1.25000000000000e+01 2376 2271 -3.75000000000000e+01 2377 2377 1.25000000000000e+02 2377 2465 4.16666666666667e+00 2377 2381 -4.16666666666667e+00 2377 2380 -1.25000000000000e+01 2377 2379 8.33333333333333e+00 2377 2384 4.16666666666667e+00 2377 2468 -4.16666666666667e+00 2377 2466 -4.16666666666667e+00 2377 2382 -8.33333333333333e+00 2377 2334 4.16666666666667e+00 2377 2229 -4.16666666666667e+00 2377 2240 4.16666666666667e+00 2377 2231 -4.16666666666667e+00 2377 2345 8.33333333333333e+00 2377 2344 -3.75000000000000e+01 2377 2343 8.33333333333333e+00 2377 2238 -8.33333333333333e+00 2377 2336 -8.33333333333333e+00 2377 2261 4.16666666666667e+00 2377 2273 -4.16666666666667e+00 2377 2376 -1.66666666666667e+01 2377 2118 8.33333333333333e+00 2377 2271 8.33333333333333e+00 2377 1937 8.33333333333333e+00 2377 2378 -1.66666666666667e+01 2377 2120 8.33333333333333e+00 2377 1936 -1.25000000000000e+01 2377 2119 -3.75000000000000e+01 2377 1935 -4.16666666666667e+00 2377 2259 4.16666666666667e+00 2377 1973 8.33333333333333e+00 2377 2132 -8.33333333333333e+00 2377 2463 4.16666666666667e+00 2377 1972 -1.25000000000000e+01 2377 2272 -1.25000000000000e+01 2377 1971 -4.16666666666667e+00 2377 2130 4.16666666666667e+00 2378 2378 1.25000000000000e+02 2378 2463 -8.33333333333333e+00 2378 2381 -1.25000000000000e+01 2378 2380 -4.16666666666667e+00 2378 2379 8.33333333333333e+00 2378 2383 4.16666666666667e+00 2378 2467 -4.16666666666667e+00 2378 2466 -4.16666666666667e+00 2378 2382 4.16666666666667e+00 2378 2239 4.16666666666667e+00 2378 2230 -4.16666666666667e+00 2378 2345 -1.25000000000000e+01 2378 2344 8.33333333333333e+00 2378 2343 -4.16666666666667e+00 2378 2238 4.16666666666667e+00 2378 2335 -8.33333333333333e+00 2378 2334 4.16666666666667e+00 2378 2229 -4.16666666666667e+00 2378 2130 4.16666666666667e+00 2378 2118 -4.16666666666667e+00 2378 2260 4.16666666666667e+00 2378 2272 -4.16666666666667e+00 2378 1937 -3.75000000000000e+01 2378 2120 -1.25000000000000e+01 2378 1936 8.33333333333333e+00 2378 2377 -1.66666666666667e+01 2378 2119 8.33333333333333e+00 2378 1935 8.33333333333333e+00 2378 2259 -8.33333333333333e+00 2378 2464 4.16666666666667e+00 2378 1973 -3.75000000000000e+01 2378 2273 -1.25000000000000e+01 2378 1972 8.33333333333333e+00 2378 2131 -8.33333333333333e+00 2378 2376 -1.66666666666667e+01 2378 1971 8.33333333333333e+00 2378 2271 8.33333333333333e+00 2379 2379 1.25000000000000e+02 2379 2339 4.16666666666667e+00 2379 2336 -4.16666666666667e+00 2379 2348 -4.16666666666667e+00 2379 2345 4.16666666666667e+00 2379 2347 8.33333333333333e+00 2379 2344 -8.33333333333333e+00 2379 2335 -4.16666666666667e+00 2379 2346 -1.25000000000000e+01 2379 2467 4.16666666666667e+00 2379 2464 -4.16666666666667e+00 2379 2468 4.16666666666667e+00 2379 2378 8.33333333333333e+00 2379 2377 8.33333333333333e+00 2379 2380 -1.66666666666667e+01 2379 2376 -3.75000000000000e+01 2379 2465 8.33333333333333e+00 2379 2463 -1.25000000000000e+01 2379 2381 -1.66666666666667e+01 2379 2384 -4.16666666666667e+00 2379 2383 8.33333333333333e+00 2379 2474 -4.16666666666667e+00 2379 2402 4.16666666666667e+00 2379 2401 -8.33333333333333e+00 2379 2395 8.33333333333333e+00 2379 1937 -8.33333333333333e+00 2379 2369 8.33333333333333e+00 2379 1936 4.16666666666667e+00 2379 2368 -4.16666666666667e+00 2379 2382 -1.25000000000000e+01 2379 2367 -1.25000000000000e+01 2379 2396 8.33333333333333e+00 2379 1976 -8.33333333333333e+00 2379 2473 -4.16666666666667e+00 2379 1975 4.16666666666667e+00 2379 2338 4.16666666666667e+00 2379 2394 -3.75000000000000e+01 2380 2380 1.25000000000000e+02 2380 2339 -8.33333333333333e+00 2380 2336 -4.16666666666667e+00 2380 2345 4.16666666666667e+00 2380 2346 8.33333333333333e+00 2380 2343 -8.33333333333333e+00 2380 2334 -4.16666666666667e+00 2380 2348 8.33333333333333e+00 2380 2347 -3.75000000000000e+01 2380 2466 4.16666666666667e+00 2380 2463 -4.16666666666667e+00 2380 2465 8.33333333333333e+00 2380 2468 -8.33333333333333e+00 2380 2378 -4.16666666666667e+00 2380 1937 4.16666666666667e+00 2380 2377 -1.25000000000000e+01 2380 2376 8.33333333333333e+00 2380 2379 -1.66666666666667e+01 2380 1976 4.16666666666667e+00 2380 2464 -1.25000000000000e+01 2380 2396 -4.16666666666667e+00 2380 2402 4.16666666666667e+00 2380 2474 -4.16666666666667e+00 2380 2382 8.33333333333333e+00 2380 2400 -8.33333333333333e+00 2380 2394 8.33333333333333e+00 2380 2384 8.33333333333333e+00 2380 2369 8.33333333333333e+00 2380 2381 -1.66666666666667e+01 2380 2383 -3.75000000000000e+01 2380 2368 -1.25000000000000e+01 2380 1935 4.16666666666667e+00 2380 2367 -4.16666666666667e+00 2380 2337 4.16666666666667e+00 2380 2395 -1.25000000000000e+01 2380 2472 -4.16666666666667e+00 2380 1974 4.16666666666667e+00 2381 2381 1.25000000000000e+02 2381 2337 4.16666666666667e+00 2381 2334 -4.16666666666667e+00 2381 2335 -4.16666666666667e+00 2381 2344 4.16666666666667e+00 2381 2346 -4.16666666666667e+00 2381 2343 4.16666666666667e+00 2381 2348 -1.25000000000000e+01 2381 2347 8.33333333333333e+00 2381 2464 8.33333333333333e+00 2381 2467 -8.33333333333333e+00 2381 2466 4.16666666666667e+00 2381 2378 -1.25000000000000e+01 2381 2377 -4.16666666666667e+00 2381 1936 4.16666666666667e+00 2381 2376 8.33333333333333e+00 2381 2465 -3.75000000000000e+01 2381 1975 4.16666666666667e+00 2381 2463 8.33333333333333e+00 2381 2395 -4.16666666666667e+00 2381 2379 -1.66666666666667e+01 2381 2382 -4.16666666666667e+00 2381 2401 4.16666666666667e+00 2381 2473 -4.16666666666667e+00 2381 2472 -4.16666666666667e+00 2381 2400 4.16666666666667e+00 2381 2384 -1.25000000000000e+01 2381 2369 -3.75000000000000e+01 2381 2383 8.33333333333333e+00 2381 2368 8.33333333333333e+00 2381 2380 -1.66666666666667e+01 2381 1935 -8.33333333333333e+00 2381 2367 8.33333333333333e+00 2381 2338 -8.33333333333333e+00 2381 2396 -1.25000000000000e+01 2381 2394 8.33333333333333e+00 2381 1974 -8.33333333333333e+00 2382 2382 1.25000000000000e+02 2382 2374 -4.16666666666667e+00 2382 2437 -8.33333333333333e+00 2382 2375 8.33333333333333e+00 2382 2373 -1.25000000000000e+01 2382 2432 -4.16666666666667e+00 2382 2431 8.33333333333333e+00 2382 2430 -1.25000000000000e+01 2382 2372 -8.33333333333333e+00 2382 2371 4.16666666666667e+00 2382 2369 4.16666666666667e+00 2382 2381 -4.16666666666667e+00 2382 2383 -1.66666666666667e+01 2382 2401 8.33333333333333e+00 2382 2380 8.33333333333333e+00 2382 2402 8.33333333333333e+00 2382 2474 -8.33333333333333e+00 2382 1981 -4.16666666666667e+00 2382 2473 4.16666666666667e+00 2382 2400 -3.75000000000000e+01 2382 1936 -4.16666666666667e+00 2382 2368 4.16666666666667e+00 2382 2379 -1.25000000000000e+01 2382 2120 8.33333333333333e+00 2382 2384 -1.66666666666667e+01 2382 2468 8.33333333333333e+00 2382 2137 4.16666666666667e+00 2382 2467 -4.16666666666667e+00 2382 2378 4.16666666666667e+00 2382 1937 -4.16666666666667e+00 2382 2119 8.33333333333333e+00 2382 2377 -8.33333333333333e+00 2382 2118 -3.75000000000000e+01 2382 2138 4.16666666666667e+00 2382 1982 -4.16666666666667e+00 2382 2466 -1.25000000000000e+01 2382 2438 4.16666666666667e+00 2383 2383 1.25000000000000e+02 2383 2373 -4.16666666666667e+00 2383 2438 4.16666666666667e+00 2383 2436 -8.33333333333333e+00 2383 2374 -1.25000000000000e+01 2383 2372 4.16666666666667e+00 2383 2430 8.33333333333333e+00 2383 2432 8.33333333333333e+00 2383 2431 -3.75000000000000e+01 2383 2370 4.16666666666667e+00 2383 2384 -1.66666666666667e+01 2383 1937 -4.16666666666667e+00 2383 1982 -4.16666666666667e+00 2383 2402 -4.16666666666667e+00 2383 2474 4.16666666666667e+00 2383 2382 -1.66666666666667e+01 2383 2400 8.33333333333333e+00 2383 2379 8.33333333333333e+00 2383 2401 -1.25000000000000e+01 2383 1980 -4.16666666666667e+00 2383 2472 4.16666666666667e+00 2383 2369 -8.33333333333333e+00 2383 2381 8.33333333333333e+00 2383 2380 -3.75000000000000e+01 2383 1935 -4.16666666666667e+00 2383 2367 4.16666666666667e+00 2383 2120 -4.16666666666667e+00 2383 2378 4.16666666666667e+00 2383 2136 4.16666666666667e+00 2383 2466 -4.16666666666667e+00 2383 2119 -1.25000000000000e+01 2383 2118 8.33333333333333e+00 2383 2376 -8.33333333333333e+00 2383 2138 -8.33333333333333e+00 2383 2468 8.33333333333333e+00 2383 2467 -1.25000000000000e+01 2383 2375 8.33333333333333e+00 2384 2384 1.25000000000000e+02 2384 2374 8.33333333333333e+00 2384 2437 4.16666666666667e+00 2384 2375 -3.75000000000000e+01 2384 2373 8.33333333333333e+00 2384 2430 -4.16666666666667e+00 2384 2371 4.16666666666667e+00 2384 2432 -1.25000000000000e+01 2384 2431 8.33333333333333e+00 2384 2370 -8.33333333333333e+00 2384 2383 -1.66666666666667e+01 2384 1936 -4.16666666666667e+00 2384 1981 -4.16666666666667e+00 2384 2367 4.16666666666667e+00 2384 2379 -4.16666666666667e+00 2384 2401 -4.16666666666667e+00 2384 2473 4.16666666666667e+00 2384 2402 -1.25000000000000e+01 2384 2400 8.33333333333333e+00 2384 2472 -8.33333333333333e+00 2384 2381 -1.25000000000000e+01 2384 2368 -8.33333333333333e+00 2384 2380 8.33333333333333e+00 2384 2119 -4.16666666666667e+00 2384 2377 4.16666666666667e+00 2384 2118 8.33333333333333e+00 2384 2382 -1.66666666666667e+01 2384 2466 8.33333333333333e+00 2384 2120 -1.25000000000000e+01 2384 2376 4.16666666666667e+00 2384 1935 -4.16666666666667e+00 2384 2468 -3.75000000000000e+01 2384 2436 4.16666666666667e+00 2384 2137 -8.33333333333333e+00 2384 2467 8.33333333333333e+00 2384 2136 4.16666666666667e+00 2384 1980 -4.16666666666667e+00 2385 2385 1.25000000000000e+02 2385 2320 -4.16666666666667e+00 2385 2315 -8.33333333333333e+00 2385 2321 8.33333333333333e+00 2385 2319 -1.25000000000000e+01 2385 2393 -4.16666666666667e+00 2385 2392 8.33333333333333e+00 2385 2391 -1.25000000000000e+01 2385 2284 -4.16666666666667e+00 2385 2293 4.16666666666667e+00 2385 2294 4.16666666666667e+00 2385 2357 -4.16666666666667e+00 2385 2386 -1.66666666666667e+01 2385 2356 8.33333333333333e+00 2385 2355 -1.25000000000000e+01 2385 2285 -4.16666666666667e+00 2385 2351 4.16666666666667e+00 2385 1939 8.33333333333333e+00 2385 2350 -8.33333333333333e+00 2385 2141 4.16666666666667e+00 2385 2387 -1.66666666666667e+01 2385 2399 8.33333333333333e+00 2385 1940 8.33333333333333e+00 2385 2398 -4.16666666666667e+00 2385 2140 4.16666666666667e+00 2385 2314 4.16666666666667e+00 2385 2397 -1.25000000000000e+01 2385 1938 -3.75000000000000e+01 2385 1646 4.16666666666667e+00 2385 1645 -8.33333333333333e+00 2385 1315 8.33333333333333e+00 2385 1505 -4.16666666666667e+00 2385 1316 8.33333333333333e+00 2385 1652 -8.33333333333333e+00 2385 1651 4.16666666666667e+00 2385 1504 -4.16666666666667e+00 2385 1314 -3.75000000000000e+01 2386 2386 1.25000000000000e+02 2386 2319 -4.16666666666667e+00 2386 2321 8.33333333333333e+00 2386 2315 4.16666666666667e+00 2386 2320 -1.25000000000000e+01 2386 2393 8.33333333333333e+00 2386 2392 -3.75000000000000e+01 2386 2391 8.33333333333333e+00 2386 2387 -1.66666666666667e+01 2386 1940 -4.16666666666667e+00 2386 2351 4.16666666666667e+00 2386 2285 -4.16666666666667e+00 2386 2283 -4.16666666666667e+00 2386 2292 4.16666666666667e+00 2386 2294 -8.33333333333333e+00 2386 2357 8.33333333333333e+00 2386 2356 -3.75000000000000e+01 2386 2385 -1.66666666666667e+01 2386 2355 8.33333333333333e+00 2386 1938 8.33333333333333e+00 2386 2349 -8.33333333333333e+00 2386 2399 8.33333333333333e+00 2386 2141 -8.33333333333333e+00 2386 2313 4.16666666666667e+00 2386 2398 -1.25000000000000e+01 2386 1939 -1.25000000000000e+01 2386 2397 -4.16666666666667e+00 2386 2139 4.16666666666667e+00 2386 1646 4.16666666666667e+00 2386 1644 -8.33333333333333e+00 2386 1316 -4.16666666666667e+00 2386 1314 8.33333333333333e+00 2386 1652 4.16666666666667e+00 2386 1505 -4.16666666666667e+00 2386 1315 -1.25000000000000e+01 2386 1650 4.16666666666667e+00 2386 1503 -4.16666666666667e+00 2387 2387 1.25000000000000e+02 2387 2314 4.16666666666667e+00 2387 2313 -8.33333333333333e+00 2387 2321 -3.75000000000000e+01 2387 2319 8.33333333333333e+00 2387 2393 -1.25000000000000e+01 2387 2392 8.33333333333333e+00 2387 2391 -4.16666666666667e+00 2387 2386 -1.66666666666667e+01 2387 1939 -4.16666666666667e+00 2387 2350 4.16666666666667e+00 2387 2284 -4.16666666666667e+00 2387 2357 -1.25000000000000e+01 2387 2293 -8.33333333333333e+00 2387 2356 8.33333333333333e+00 2387 2292 4.16666666666667e+00 2387 2355 -4.16666666666667e+00 2387 2283 -4.16666666666667e+00 2387 2349 4.16666666666667e+00 2387 2139 4.16666666666667e+00 2387 2320 8.33333333333333e+00 2387 2399 -3.75000000000000e+01 2387 1940 -1.25000000000000e+01 2387 2398 8.33333333333333e+00 2387 2140 -8.33333333333333e+00 2387 2385 -1.66666666666667e+01 2387 2397 8.33333333333333e+00 2387 1938 8.33333333333333e+00 2387 1645 4.16666666666667e+00 2387 1644 4.16666666666667e+00 2387 1315 -4.16666666666667e+00 2387 1651 4.16666666666667e+00 2387 1504 -4.16666666666667e+00 2387 1503 -4.16666666666667e+00 2387 1316 -1.25000000000000e+01 2387 1314 8.33333333333333e+00 2387 1650 -8.33333333333333e+00 2388 2388 1.25000000000000e+02 2388 2326 -4.16666666666667e+00 2388 2327 8.33333333333333e+00 2388 2315 4.16666666666667e+00 2388 2325 -1.25000000000000e+01 2388 2435 4.16666666666667e+00 2388 2434 -8.33333333333333e+00 2388 2393 8.33333333333333e+00 2388 2392 8.33333333333333e+00 2388 2391 -3.75000000000000e+01 2388 2390 -1.66666666666667e+01 2388 1958 -4.16666666666667e+00 2388 1940 -4.16666666666667e+00 2388 2303 -4.16666666666667e+00 2388 2369 4.16666666666667e+00 2388 2302 -4.16666666666667e+00 2388 2311 4.16666666666667e+00 2388 2312 -8.33333333333333e+00 2388 2375 8.33333333333333e+00 2388 1957 8.33333333333333e+00 2388 2389 -1.66666666666667e+01 2388 2374 8.33333333333333e+00 2388 2373 -3.75000000000000e+01 2388 1939 8.33333333333333e+00 2388 2368 -8.33333333333333e+00 2388 2144 -4.16666666666667e+00 2388 2438 4.16666666666667e+00 2388 2437 4.16666666666667e+00 2388 2143 -4.16666666666667e+00 2388 1956 -1.25000000000000e+01 2388 2402 8.33333333333333e+00 2388 2141 -8.33333333333333e+00 2388 2401 -4.16666666666667e+00 2388 2140 4.16666666666667e+00 2388 2400 -1.25000000000000e+01 2388 2314 4.16666666666667e+00 2388 1938 -1.25000000000000e+01 2389 2389 1.25000000000000e+02 2389 2325 -4.16666666666667e+00 2389 2315 -8.33333333333333e+00 2389 2327 8.33333333333333e+00 2389 2326 -1.25000000000000e+01 2389 2435 4.16666666666667e+00 2389 2433 -8.33333333333333e+00 2389 2393 -4.16666666666667e+00 2389 2392 -1.25000000000000e+01 2389 2391 8.33333333333333e+00 2389 2301 -4.16666666666667e+00 2389 2310 4.16666666666667e+00 2389 2312 4.16666666666667e+00 2389 2375 -4.16666666666667e+00 2389 2374 -1.25000000000000e+01 2389 1956 8.33333333333333e+00 2389 2388 -1.66666666666667e+01 2389 2373 8.33333333333333e+00 2389 2303 -4.16666666666667e+00 2389 2369 4.16666666666667e+00 2389 1938 8.33333333333333e+00 2389 2367 -8.33333333333333e+00 2389 2144 -4.16666666666667e+00 2389 2141 4.16666666666667e+00 2389 2438 -8.33333333333333e+00 2389 1958 8.33333333333333e+00 2389 1957 -3.75000000000000e+01 2389 2436 4.16666666666667e+00 2389 2142 -4.16666666666667e+00 2389 2402 8.33333333333333e+00 2389 2390 -1.66666666666667e+01 2389 1940 8.33333333333333e+00 2389 2401 -1.25000000000000e+01 2389 2313 4.16666666666667e+00 2389 1939 -3.75000000000000e+01 2389 2400 -4.16666666666667e+00 2389 2139 4.16666666666667e+00 2390 2390 1.25000000000000e+02 2390 2314 -8.33333333333333e+00 2390 2313 4.16666666666667e+00 2390 2327 -3.75000000000000e+01 2390 2326 8.33333333333333e+00 2390 2433 4.16666666666667e+00 2390 2434 4.16666666666667e+00 2390 2393 -1.25000000000000e+01 2390 2392 -4.16666666666667e+00 2390 2391 8.33333333333333e+00 2390 2388 -1.66666666666667e+01 2390 1956 -4.16666666666667e+00 2390 1938 -4.16666666666667e+00 2390 2301 -4.16666666666667e+00 2390 2367 4.16666666666667e+00 2390 2375 -1.25000000000000e+01 2390 2311 4.16666666666667e+00 2390 2374 -4.16666666666667e+00 2390 2310 -8.33333333333333e+00 2390 2373 8.33333333333333e+00 2390 2302 -4.16666666666667e+00 2390 2368 4.16666666666667e+00 2390 2142 -4.16666666666667e+00 2390 2436 4.16666666666667e+00 2390 2143 -4.16666666666667e+00 2390 2140 4.16666666666667e+00 2390 1958 -1.25000000000000e+01 2390 2437 -8.33333333333333e+00 2390 1957 8.33333333333333e+00 2390 2402 -3.75000000000000e+01 2390 2325 8.33333333333333e+00 2390 1940 -1.25000000000000e+01 2390 2401 8.33333333333333e+00 2390 2389 -1.66666666666667e+01 2390 1939 8.33333333333333e+00 2390 2400 8.33333333333333e+00 2390 2139 -8.33333333333333e+00 2391 2391 1.25000000000000e+02 2391 2327 -8.33333333333333e+00 2391 2435 -4.16666666666667e+00 2391 2143 4.16666666666667e+00 2391 2144 4.16666666666667e+00 2391 2434 8.33333333333333e+00 2391 2433 -1.25000000000000e+01 2391 2390 8.33333333333333e+00 2391 2389 8.33333333333333e+00 2391 2388 -3.75000000000000e+01 2391 2314 -4.16666666666667e+00 2391 2315 -4.16666666666667e+00 2391 2329 -4.16666666666667e+00 2391 2320 4.16666666666667e+00 2391 2321 4.16666666666667e+00 2391 2330 8.33333333333333e+00 2391 2393 -1.66666666666667e+01 2391 2328 -1.25000000000000e+01 2391 2140 -4.16666666666667e+00 2391 2392 -1.66666666666667e+01 2391 2141 8.33333333333333e+00 2391 2387 -4.16666666666667e+00 2391 1940 4.16666666666667e+00 2391 2386 8.33333333333333e+00 2391 1939 -8.33333333333333e+00 2391 2385 -1.25000000000000e+01 2391 2326 4.16666666666667e+00 2391 2139 -1.25000000000000e+01 2391 1646 8.33333333333333e+00 2391 1507 -4.16666666666667e+00 2391 1504 4.16666666666667e+00 2391 1505 -8.33333333333333e+00 2391 1346 4.16666666666667e+00 2391 1508 -4.16666666666667e+00 2391 1645 8.33333333333333e+00 2391 1345 -8.33333333333333e+00 2391 1644 -3.75000000000000e+01 2392 2392 1.25000000000000e+02 2392 2327 4.16666666666667e+00 2392 2435 8.33333333333333e+00 2392 2142 4.16666666666667e+00 2392 2144 -8.33333333333333e+00 2392 2434 -3.75000000000000e+01 2392 2433 8.33333333333333e+00 2392 2390 -4.16666666666667e+00 2392 2389 -1.25000000000000e+01 2392 2388 8.33333333333333e+00 2392 2313 -4.16666666666667e+00 2392 2330 8.33333333333333e+00 2392 2328 -4.16666666666667e+00 2392 2319 4.16666666666667e+00 2392 2321 -8.33333333333333e+00 2392 2329 -1.25000000000000e+01 2392 2315 -4.16666666666667e+00 2392 1940 4.16666666666667e+00 2392 2139 -4.16666666666667e+00 2392 2391 -1.66666666666667e+01 2392 2387 8.33333333333333e+00 2392 2393 -1.66666666666667e+01 2392 2141 8.33333333333333e+00 2392 2386 -3.75000000000000e+01 2392 2325 4.16666666666667e+00 2392 2140 -1.25000000000000e+01 2392 2385 8.33333333333333e+00 2392 1938 -8.33333333333333e+00 2392 1346 4.16666666666667e+00 2392 1646 -4.16666666666667e+00 2392 1506 -4.16666666666667e+00 2392 1503 4.16666666666667e+00 2392 1508 -4.16666666666667e+00 2392 1505 4.16666666666667e+00 2392 1645 -1.25000000000000e+01 2392 1644 8.33333333333333e+00 2392 1344 -8.33333333333333e+00 2393 2393 1.25000000000000e+02 2393 2325 -8.33333333333333e+00 2393 2433 -4.16666666666667e+00 2393 2434 8.33333333333333e+00 2393 2143 -8.33333333333333e+00 2393 2142 4.16666666666667e+00 2393 2435 -1.25000000000000e+01 2393 2390 -1.25000000000000e+01 2393 2389 -4.16666666666667e+00 2393 2388 8.33333333333333e+00 2393 2313 -4.16666666666667e+00 2393 2329 8.33333333333333e+00 2393 2320 -8.33333333333333e+00 2393 2319 4.16666666666667e+00 2393 2330 -3.75000000000000e+01 2393 2328 8.33333333333333e+00 2393 2391 -1.66666666666667e+01 2393 2314 -4.16666666666667e+00 2393 1939 4.16666666666667e+00 2393 2139 8.33333333333333e+00 2393 2387 -1.25000000000000e+01 2393 2326 4.16666666666667e+00 2393 2141 -3.75000000000000e+01 2393 2386 8.33333333333333e+00 2393 2392 -1.66666666666667e+01 2393 2140 8.33333333333333e+00 2393 2385 -4.16666666666667e+00 2393 1938 4.16666666666667e+00 2393 1345 4.16666666666667e+00 2393 1645 -4.16666666666667e+00 2393 1644 8.33333333333333e+00 2393 1507 -4.16666666666667e+00 2393 1504 4.16666666666667e+00 2393 1503 -8.33333333333333e+00 2393 1646 -1.25000000000000e+01 2393 1344 4.16666666666667e+00 2393 1506 -4.16666666666667e+00 2394 2394 1.25000000000000e+02 2394 2369 -8.33333333333333e+00 2394 2368 4.16666666666667e+00 2394 2381 8.33333333333333e+00 2394 2379 -3.75000000000000e+01 2394 2473 4.16666666666667e+00 2394 2474 4.16666666666667e+00 2394 2402 -4.16666666666667e+00 2394 2401 8.33333333333333e+00 2394 2400 -1.25000000000000e+01 2394 2338 -4.16666666666667e+00 2394 2339 -4.16666666666667e+00 2394 2348 4.16666666666667e+00 2394 2347 -8.33333333333333e+00 2394 2351 4.16666666666667e+00 2394 2363 -4.16666666666667e+00 2394 2395 -1.66666666666667e+01 2394 2362 8.33333333333333e+00 2394 2350 4.16666666666667e+00 2394 1939 -4.16666666666667e+00 2394 1975 -4.16666666666667e+00 2394 2361 -1.25000000000000e+01 2394 2141 4.16666666666667e+00 2394 2147 -4.16666666666667e+00 2394 2470 4.16666666666667e+00 2394 2146 -4.16666666666667e+00 2394 1976 8.33333333333333e+00 2394 2471 -8.33333333333333e+00 2394 1974 -1.25000000000000e+01 2394 2396 -1.66666666666667e+01 2394 2399 8.33333333333333e+00 2394 1940 8.33333333333333e+00 2394 2398 8.33333333333333e+00 2394 2140 -8.33333333333333e+00 2394 2380 8.33333333333333e+00 2394 2397 -3.75000000000000e+01 2394 1938 -1.25000000000000e+01 2395 2395 1.25000000000000e+02 2395 2381 -4.16666666666667e+00 2395 2379 8.33333333333333e+00 2395 2367 4.16666666666667e+00 2395 2380 -1.25000000000000e+01 2395 2472 4.16666666666667e+00 2395 2474 -8.33333333333333e+00 2395 2402 8.33333333333333e+00 2395 2401 -3.75000000000000e+01 2395 2400 8.33333333333333e+00 2395 2337 -4.16666666666667e+00 2395 2339 -4.16666666666667e+00 2395 2348 4.16666666666667e+00 2395 2346 -8.33333333333333e+00 2395 2394 -1.66666666666667e+01 2395 2361 8.33333333333333e+00 2395 2351 -8.33333333333333e+00 2395 1940 8.33333333333333e+00 2395 2349 4.16666666666667e+00 2395 1938 -4.16666666666667e+00 2395 2363 8.33333333333333e+00 2395 2396 -1.66666666666667e+01 2395 1976 8.33333333333333e+00 2395 2362 -3.75000000000000e+01 2395 1974 -4.16666666666667e+00 2395 2469 4.16666666666667e+00 2395 2145 -4.16666666666667e+00 2395 2471 4.16666666666667e+00 2395 2147 -4.16666666666667e+00 2395 1975 -1.25000000000000e+01 2395 2399 -4.16666666666667e+00 2395 2141 4.16666666666667e+00 2395 2369 4.16666666666667e+00 2395 2398 -1.25000000000000e+01 2395 1939 -1.25000000000000e+01 2395 2397 8.33333333333333e+00 2395 2139 -8.33333333333333e+00 2396 2396 1.25000000000000e+02 2396 2380 -4.16666666666667e+00 2396 2367 -8.33333333333333e+00 2396 2381 -1.25000000000000e+01 2396 2379 8.33333333333333e+00 2396 2473 -8.33333333333333e+00 2396 2472 4.16666666666667e+00 2396 2402 -1.25000000000000e+01 2396 2401 8.33333333333333e+00 2396 2400 -4.16666666666667e+00 2396 2338 -4.16666666666667e+00 2396 2347 4.16666666666667e+00 2396 2337 -4.16666666666667e+00 2396 2346 4.16666666666667e+00 2396 2349 4.16666666666667e+00 2396 2361 -4.16666666666667e+00 2396 2350 -8.33333333333333e+00 2396 1939 8.33333333333333e+00 2396 2363 -1.25000000000000e+01 2396 2362 8.33333333333333e+00 2396 2395 -1.66666666666667e+01 2396 1975 8.33333333333333e+00 2396 2139 4.16666666666667e+00 2396 2145 -4.16666666666667e+00 2396 1976 -3.75000000000000e+01 2396 2470 4.16666666666667e+00 2396 2146 -4.16666666666667e+00 2396 1974 8.33333333333333e+00 2396 2469 -8.33333333333333e+00 2396 2368 4.16666666666667e+00 2396 2399 -1.25000000000000e+01 2396 1940 -3.75000000000000e+01 2396 2398 -4.16666666666667e+00 2396 2140 4.16666666666667e+00 2396 2394 -1.66666666666667e+01 2396 2397 8.33333333333333e+00 2396 1938 8.33333333333333e+00 2397 2397 1.25000000000000e+02 2397 2356 4.16666666666667e+00 2397 2387 8.33333333333333e+00 2397 2386 -4.16666666666667e+00 2397 2385 -1.25000000000000e+01 2397 2351 -4.16666666666667e+00 2397 2366 -4.16666666666667e+00 2397 2363 4.16666666666667e+00 2397 2365 8.33333333333333e+00 2397 2362 -8.33333333333333e+00 2397 2364 -1.25000000000000e+01 2397 2350 -4.16666666666667e+00 2397 1939 4.16666666666667e+00 2397 2141 -4.16666666666667e+00 2397 2399 -1.66666666666667e+01 2397 2470 -4.16666666666667e+00 2397 2147 4.16666666666667e+00 2397 2146 4.16666666666667e+00 2397 2471 8.33333333333333e+00 2397 2469 -1.25000000000000e+01 2397 2396 8.33333333333333e+00 2397 1940 -8.33333333333333e+00 2397 2395 8.33333333333333e+00 2397 2398 -1.66666666666667e+01 2397 2140 8.33333333333333e+00 2397 2394 -3.75000000000000e+01 2397 2357 4.16666666666667e+00 2397 2139 -1.25000000000000e+01 2397 1651 8.33333333333333e+00 2397 1505 4.16666666666667e+00 2397 1504 -8.33333333333333e+00 2397 1652 8.33333333333333e+00 2397 1650 -3.75000000000000e+01 2397 1363 4.16666666666667e+00 2397 1511 -4.16666666666667e+00 2397 1510 -4.16666666666667e+00 2397 1364 -8.33333333333333e+00 2398 2398 1.25000000000000e+02 2398 2355 4.16666666666667e+00 2398 2387 8.33333333333333e+00 2398 2386 -1.25000000000000e+01 2398 2385 -4.16666666666667e+00 2398 2351 -4.16666666666667e+00 2398 2364 8.33333333333333e+00 2398 2363 4.16666666666667e+00 2398 2361 -8.33333333333333e+00 2398 2366 8.33333333333333e+00 2398 2399 -1.66666666666667e+01 2398 2365 -3.75000000000000e+01 2398 2349 -4.16666666666667e+00 2398 1938 4.16666666666667e+00 2398 2469 -4.16666666666667e+00 2398 2471 8.33333333333333e+00 2398 2141 8.33333333333333e+00 2398 2147 -8.33333333333333e+00 2398 2145 4.16666666666667e+00 2398 2470 -1.25000000000000e+01 2398 2396 -4.16666666666667e+00 2398 1940 4.16666666666667e+00 2398 2395 -1.25000000000000e+01 2398 2357 -8.33333333333333e+00 2398 2140 -3.75000000000000e+01 2398 2394 8.33333333333333e+00 2398 2397 -1.66666666666667e+01 2398 2139 8.33333333333333e+00 2398 1652 -4.16666666666667e+00 2398 1505 4.16666666666667e+00 2398 1650 8.33333333333333e+00 2398 1503 -8.33333333333333e+00 2398 1651 -1.25000000000000e+01 2398 1362 4.16666666666667e+00 2398 1509 -4.16666666666667e+00 2398 1364 4.16666666666667e+00 2398 1511 -4.16666666666667e+00 2399 2399 1.25000000000000e+02 2399 2356 -8.33333333333333e+00 2399 2387 -3.75000000000000e+01 2399 2386 8.33333333333333e+00 2399 2385 8.33333333333333e+00 2399 2349 -4.16666666666667e+00 2399 2350 -4.16666666666667e+00 2399 2364 -4.16666666666667e+00 2399 2361 4.16666666666667e+00 2399 2362 4.16666666666667e+00 2399 2366 -1.25000000000000e+01 2399 2365 8.33333333333333e+00 2399 2398 -1.66666666666667e+01 2399 2139 -4.16666666666667e+00 2399 2397 -1.66666666666667e+01 2399 2470 8.33333333333333e+00 2399 2145 4.16666666666667e+00 2399 2140 8.33333333333333e+00 2399 2146 -8.33333333333333e+00 2399 2471 -3.75000000000000e+01 2399 2469 8.33333333333333e+00 2399 2396 -1.25000000000000e+01 2399 2355 4.16666666666667e+00 2399 2141 -1.25000000000000e+01 2399 2395 -4.16666666666667e+00 2399 1939 4.16666666666667e+00 2399 2394 8.33333333333333e+00 2399 1938 -8.33333333333333e+00 2399 1651 -4.16666666666667e+00 2399 1504 4.16666666666667e+00 2399 1503 4.16666666666667e+00 2399 1652 -1.25000000000000e+01 2399 1650 8.33333333333333e+00 2399 1509 -4.16666666666667e+00 2399 1363 4.16666666666667e+00 2399 1510 -4.16666666666667e+00 2399 1362 -8.33333333333333e+00 2400 2400 1.25000000000000e+02 2400 2374 4.16666666666667e+00 2400 2144 4.16666666666667e+00 2400 2438 -4.16666666666667e+00 2400 2437 8.33333333333333e+00 2400 2143 -8.33333333333333e+00 2400 2436 -1.25000000000000e+01 2400 2390 8.33333333333333e+00 2400 2389 -4.16666666666667e+00 2400 2388 -1.25000000000000e+01 2400 2369 -4.16666666666667e+00 2400 2383 8.33333333333333e+00 2400 2381 4.16666666666667e+00 2400 2380 -8.33333333333333e+00 2400 2384 8.33333333333333e+00 2400 2402 -1.66666666666667e+01 2400 1981 4.16666666666667e+00 2400 2382 -3.75000000000000e+01 2400 2368 -4.16666666666667e+00 2400 1939 4.16666666666667e+00 2400 2473 -4.16666666666667e+00 2400 2474 8.33333333333333e+00 2400 2141 8.33333333333333e+00 2400 2147 -8.33333333333333e+00 2400 2149 -4.16666666666667e+00 2400 2146 4.16666666666667e+00 2400 1982 4.16666666666667e+00 2400 2150 -4.16666666666667e+00 2400 2472 -1.25000000000000e+01 2400 2396 -4.16666666666667e+00 2400 1940 4.16666666666667e+00 2400 2401 -1.66666666666667e+01 2400 2395 8.33333333333333e+00 2400 2140 8.33333333333333e+00 2400 2375 -8.33333333333333e+00 2400 2394 -1.25000000000000e+01 2400 2139 -3.75000000000000e+01 2401 2401 1.25000000000000e+02 2401 2373 4.16666666666667e+00 2401 2436 8.33333333333333e+00 2401 2144 4.16666666666667e+00 2401 2142 -8.33333333333333e+00 2401 2438 8.33333333333333e+00 2401 2437 -3.75000000000000e+01 2401 2390 8.33333333333333e+00 2401 2389 -1.25000000000000e+01 2401 2388 -4.16666666666667e+00 2401 2369 -4.16666666666667e+00 2401 2384 -4.16666666666667e+00 2401 2381 4.16666666666667e+00 2401 2382 8.33333333333333e+00 2401 2379 -8.33333333333333e+00 2401 2383 -1.25000000000000e+01 2401 1980 4.16666666666667e+00 2401 2367 -4.16666666666667e+00 2401 1938 4.16666666666667e+00 2401 2141 -4.16666666666667e+00 2401 2402 -1.66666666666667e+01 2401 2472 -4.16666666666667e+00 2401 2150 -4.16666666666667e+00 2401 2147 4.16666666666667e+00 2401 2148 -4.16666666666667e+00 2401 2145 4.16666666666667e+00 2401 1982 -8.33333333333333e+00 2401 2474 8.33333333333333e+00 2401 2473 -1.25000000000000e+01 2401 2396 8.33333333333333e+00 2401 1940 -8.33333333333333e+00 2401 2375 4.16666666666667e+00 2401 2395 -3.75000000000000e+01 2401 2140 -1.25000000000000e+01 2401 2400 -1.66666666666667e+01 2401 2394 8.33333333333333e+00 2401 2139 8.33333333333333e+00 2402 2402 1.25000000000000e+02 2402 2373 -8.33333333333333e+00 2402 2142 4.16666666666667e+00 2402 2436 -4.16666666666667e+00 2402 2143 4.16666666666667e+00 2402 2438 -1.25000000000000e+01 2402 2437 8.33333333333333e+00 2402 2390 -3.75000000000000e+01 2402 2389 8.33333333333333e+00 2402 2388 8.33333333333333e+00 2402 2368 -4.16666666666667e+00 2402 2367 -4.16666666666667e+00 2402 2383 -4.16666666666667e+00 2402 2380 4.16666666666667e+00 2402 2379 4.16666666666667e+00 2402 2384 -1.25000000000000e+01 2402 2382 8.33333333333333e+00 2402 2400 -1.66666666666667e+01 2402 2140 -4.16666666666667e+00 2402 2401 -1.66666666666667e+01 2402 2149 -4.16666666666667e+00 2402 2146 4.16666666666667e+00 2402 2472 8.33333333333333e+00 2402 2139 8.33333333333333e+00 2402 2145 -8.33333333333333e+00 2402 2474 -3.75000000000000e+01 2402 1981 -8.33333333333333e+00 2402 2473 8.33333333333333e+00 2402 1980 4.16666666666667e+00 2402 2148 -4.16666666666667e+00 2402 2374 4.16666666666667e+00 2402 2396 -1.25000000000000e+01 2402 2141 -1.25000000000000e+01 2402 2395 8.33333333333333e+00 2402 1939 -8.33333333333333e+00 2402 2394 -4.16666666666667e+00 2402 1938 4.16666666666667e+00 2403 2403 6.25000000000000e+01 2403 2201 -4.16666666666667e+00 2403 2404 -8.33333333333333e+00 2403 2407 4.16666666666667e+00 2403 2200 8.33333333333333e+00 2403 2408 4.16666666666667e+00 2403 1942 -2.08333333333333e+00 2403 2197 4.16666666666667e+00 2403 2406 -1.87500000000000e+01 2403 2417 -4.16666666666667e+00 2403 2416 2.08333333333333e+00 2403 1948 -2.08333333333333e+00 2403 2199 -1.25000000000000e+01 2403 2035 2.08333333333333e+00 2403 2179 -4.16666666666667e+00 2403 2180 -4.16666666666667e+00 2403 2186 4.16666666666667e+00 2403 1943 4.16666666666667e+00 2403 2036 -4.16666666666667e+00 2403 1941 -6.25000000000000e+00 2403 2405 -8.33333333333333e+00 2403 2042 4.16666666666667e+00 2403 1949 4.16666666666667e+00 2403 2041 4.16666666666667e+00 2403 2185 -8.33333333333333e+00 2403 2198 4.16666666666667e+00 2403 2040 -1.87500000000000e+01 2403 1947 -6.25000000000000e+00 2404 2404 6.25000000000000e+01 2404 2417 2.08333333333333e+00 2404 2403 -8.33333333333333e+00 2404 2406 4.16666666666667e+00 2404 2199 8.33333333333333e+00 2404 1943 4.16666666666667e+00 2404 2198 -8.33333333333333e+00 2404 2407 -6.25000000000000e+00 2404 1941 -2.08333333333333e+00 2404 2196 4.16666666666667e+00 2404 2405 -8.33333333333333e+00 2404 2201 8.33333333333333e+00 2404 1949 4.16666666666667e+00 2404 2200 -3.75000000000000e+01 2404 2415 2.08333333333333e+00 2404 1947 -2.08333333333333e+00 2404 2034 2.08333333333333e+00 2404 2178 -4.16666666666667e+00 2404 2036 2.08333333333333e+00 2404 2180 -4.16666666666667e+00 2404 1942 -6.25000000000000e+00 2404 2042 -2.08333333333333e+00 2404 2186 4.16666666666667e+00 2404 2408 -2.08333333333333e+00 2404 2041 -6.25000000000000e+00 2404 1948 -6.25000000000000e+00 2404 2040 4.16666666666667e+00 2404 2184 -8.33333333333333e+00 2405 2405 6.25000000000000e+01 2405 2199 -4.16666666666667e+00 2405 2407 -2.08333333333333e+00 2405 2416 2.08333333333333e+00 2405 2408 -6.25000000000000e+00 2405 1942 4.16666666666667e+00 2405 2197 -8.33333333333333e+00 2405 2406 4.16666666666667e+00 2405 2201 -1.25000000000000e+01 2405 2404 -8.33333333333333e+00 2405 2200 8.33333333333333e+00 2405 1948 4.16666666666667e+00 2405 2415 -4.16666666666667e+00 2405 2178 -4.16666666666667e+00 2405 2184 4.16666666666667e+00 2405 1943 -1.87500000000000e+01 2405 2035 2.08333333333333e+00 2405 2179 -4.16666666666667e+00 2405 1941 4.16666666666667e+00 2405 2034 -4.16666666666667e+00 2405 2196 4.16666666666667e+00 2405 2042 -6.25000000000000e+00 2405 1949 -1.87500000000000e+01 2405 2041 -2.08333333333333e+00 2405 2185 4.16666666666667e+00 2405 2403 -8.33333333333333e+00 2405 2040 4.16666666666667e+00 2405 1947 4.16666666666667e+00 2406 2406 6.25000000000000e+01 2406 2404 4.16666666666667e+00 2406 2200 -8.33333333333333e+00 2406 2405 4.16666666666667e+00 2406 1942 2.08333333333333e+00 2406 2403 -1.87500000000000e+01 2406 2417 4.16666666666667e+00 2406 1954 2.08333333333333e+00 2406 2416 -2.08333333333333e+00 2406 2415 -6.25000000000000e+00 2406 2197 -4.16666666666667e+00 2406 2198 -4.16666666666667e+00 2406 2408 -8.33333333333333e+00 2406 2050 -2.08333333333333e+00 2406 2044 4.16666666666667e+00 2406 2045 4.16666666666667e+00 2406 2204 -4.16666666666667e+00 2406 2051 4.16666666666667e+00 2406 1943 -4.16666666666667e+00 2406 2049 -6.25000000000000e+00 2406 2057 4.16666666666667e+00 2406 1955 -4.16666666666667e+00 2406 2056 4.16666666666667e+00 2406 2407 -8.33333333333333e+00 2406 2203 8.33333333333333e+00 2406 2055 -1.87500000000000e+01 2406 2201 4.16666666666667e+00 2406 2202 -1.25000000000000e+01 2407 2407 6.25000000000000e+01 2407 2201 4.16666666666667e+00 2407 2403 4.16666666666667e+00 2407 2199 -8.33333333333333e+00 2407 2404 -6.25000000000000e+00 2407 1941 2.08333333333333e+00 2407 2408 -8.33333333333333e+00 2407 2417 4.16666666666667e+00 2407 2416 -6.25000000000000e+00 2407 1953 2.08333333333333e+00 2407 2415 -2.08333333333333e+00 2407 2196 -4.16666666666667e+00 2407 2051 4.16666666666667e+00 2407 2049 -2.08333333333333e+00 2407 2043 4.16666666666667e+00 2407 2045 -8.33333333333333e+00 2407 2204 8.33333333333333e+00 2407 1943 2.08333333333333e+00 2407 2198 -4.16666666666667e+00 2407 2050 -6.25000000000000e+00 2407 2057 -2.08333333333333e+00 2407 1955 2.08333333333333e+00 2407 2056 -6.25000000000000e+00 2407 2405 -2.08333333333333e+00 2407 2203 -3.75000000000000e+01 2407 2055 4.16666666666667e+00 2407 2406 -8.33333333333333e+00 2407 2202 8.33333333333333e+00 2408 2408 6.25000000000000e+01 2408 2404 -2.08333333333333e+00 2408 2200 4.16666666666667e+00 2408 2405 -6.25000000000000e+00 2408 2403 4.16666666666667e+00 2408 2417 -1.87500000000000e+01 2408 2407 -8.33333333333333e+00 2408 2416 4.16666666666667e+00 2408 2415 4.16666666666667e+00 2408 2196 -4.16666666666667e+00 2408 2050 4.16666666666667e+00 2408 2406 -8.33333333333333e+00 2408 2044 -8.33333333333333e+00 2408 2203 8.33333333333333e+00 2408 2043 4.16666666666667e+00 2408 2202 -4.16666666666667e+00 2408 2051 -1.87500000000000e+01 2408 1942 2.08333333333333e+00 2408 2197 -4.16666666666667e+00 2408 2049 4.16666666666667e+00 2408 1941 -4.16666666666667e+00 2408 2057 -6.25000000000000e+00 2408 2199 4.16666666666667e+00 2408 2204 -1.25000000000000e+01 2408 2056 -2.08333333333333e+00 2408 1954 2.08333333333333e+00 2408 2055 4.16666666666667e+00 2408 1953 -4.16666666666667e+00 2409 2409 6.25000000000000e+01 2409 2419 2.08333333333333e+00 2409 2420 -4.16666666666667e+00 2409 2414 4.16666666666667e+00 2409 2412 -6.25000000000000e+00 2409 2249 -4.16666666666667e+00 2409 1948 4.16666666666667e+00 2409 2410 -8.33333333333333e+00 2409 2248 8.33333333333333e+00 2409 2247 -1.25000000000000e+01 2409 2246 0.00000000000000e+00 2409 1945 0.00000000000000e+00 2409 2245 0.00000000000000e+00 2409 2186 4.16666666666667e+00 2409 2183 0.00000000000000e+00 2409 1946 0.00000000000000e+00 2409 2039 0.00000000000000e+00 2409 2038 0.00000000000000e+00 2409 2182 0.00000000000000e+00 2409 1944 0.00000000000000e+00 2409 2411 -8.33333333333333e+00 2409 2042 4.16666666666667e+00 2409 1949 4.16666666666667e+00 2409 2041 -2.08333333333333e+00 2409 2185 4.16666666666667e+00 2409 2413 -2.08333333333333e+00 2409 2040 -6.25000000000000e+00 2409 1947 -1.87500000000000e+01 2410 2410 6.25000000000000e+01 2410 2411 -8.33333333333333e+00 2410 2412 -2.08333333333333e+00 2410 2418 2.08333333333333e+00 2410 1949 -2.08333333333333e+00 2410 2420 2.08333333333333e+00 2410 1946 0.00000000000000e+00 2410 2413 -6.25000000000000e+00 2410 2246 0.00000000000000e+00 2410 2249 8.33333333333333e+00 2410 2248 -3.75000000000000e+01 2410 1947 4.16666666666667e+00 2410 2409 -8.33333333333333e+00 2410 2247 8.33333333333333e+00 2410 1944 0.00000000000000e+00 2410 2244 0.00000000000000e+00 2410 2039 0.00000000000000e+00 2410 2183 0.00000000000000e+00 2410 1945 0.00000000000000e+00 2410 2037 0.00000000000000e+00 2410 2181 0.00000000000000e+00 2410 2042 4.16666666666667e+00 2410 2186 -8.33333333333333e+00 2410 2414 4.16666666666667e+00 2410 2041 -6.25000000000000e+00 2410 1948 -6.25000000000000e+00 2410 2040 -2.08333333333333e+00 2410 2184 4.16666666666667e+00 2411 2411 6.25000000000000e+01 2411 2410 -8.33333333333333e+00 2411 1948 -2.08333333333333e+00 2411 2419 2.08333333333333e+00 2411 2418 -4.16666666666667e+00 2411 2414 -1.87500000000000e+01 2411 1945 0.00000000000000e+00 2411 2412 4.16666666666667e+00 2411 2245 0.00000000000000e+00 2411 2249 -1.25000000000000e+01 2411 2248 8.33333333333333e+00 2411 2247 -4.16666666666667e+00 2411 2244 0.00000000000000e+00 2411 2184 4.16666666666667e+00 2411 2181 0.00000000000000e+00 2411 2038 0.00000000000000e+00 2411 2182 0.00000000000000e+00 2411 1946 0.00000000000000e+00 2411 1944 0.00000000000000e+00 2411 2037 0.00000000000000e+00 2411 2413 4.16666666666667e+00 2411 2042 -1.87500000000000e+01 2411 1949 -6.25000000000000e+00 2411 2041 4.16666666666667e+00 2411 2185 -8.33333333333333e+00 2411 2409 -8.33333333333333e+00 2411 2040 4.16666666666667e+00 2411 1947 4.16666666666667e+00 2412 2412 6.25000000000000e+01 2412 2249 4.16666666666667e+00 2412 2248 4.16666666666667e+00 2412 2420 4.16666666666667e+00 2412 2419 4.16666666666667e+00 2412 2413 -8.33333333333333e+00 2412 2418 -1.87500000000000e+01 2412 2411 4.16666666666667e+00 2412 2409 -6.25000000000000e+00 2412 2258 -4.16666666666667e+00 2412 2414 -8.33333333333333e+00 2412 2246 0.00000000000000e+00 2412 2105 0.00000000000000e+00 2412 2107 0.00000000000000e+00 2412 2257 8.33333333333333e+00 2412 2104 0.00000000000000e+00 2412 2108 0.00000000000000e+00 2412 1946 0.00000000000000e+00 2412 1945 0.00000000000000e+00 2412 2245 0.00000000000000e+00 2412 2106 0.00000000000000e+00 2412 2114 4.16666666666667e+00 2412 1979 -4.16666666666667e+00 2412 2113 -2.08333333333333e+00 2412 1978 2.08333333333333e+00 2412 2112 -6.25000000000000e+00 2412 2410 -2.08333333333333e+00 2412 2256 -1.25000000000000e+01 2413 2413 6.25000000000000e+01 2413 2409 -2.08333333333333e+00 2413 2249 -8.33333333333333e+00 2413 2247 4.16666666666667e+00 2413 2420 -2.08333333333333e+00 2413 1979 2.08333333333333e+00 2413 2419 -6.25000000000000e+00 2413 2418 4.16666666666667e+00 2413 2412 -8.33333333333333e+00 2413 1946 0.00000000000000e+00 2413 2410 -6.25000000000000e+00 2413 2108 0.00000000000000e+00 2413 2106 0.00000000000000e+00 2413 2246 0.00000000000000e+00 2413 2105 0.00000000000000e+00 2413 2256 8.33333333333333e+00 2413 2103 0.00000000000000e+00 2413 2107 0.00000000000000e+00 2413 1944 0.00000000000000e+00 2413 2244 0.00000000000000e+00 2413 2114 4.16666666666667e+00 2413 2414 -8.33333333333333e+00 2413 2258 8.33333333333333e+00 2413 2113 -6.25000000000000e+00 2413 2411 4.16666666666667e+00 2413 2257 -3.75000000000000e+01 2413 2112 -2.08333333333333e+00 2413 1977 2.08333333333333e+00 2414 2414 6.25000000000000e+01 2414 2247 4.16666666666667e+00 2414 2248 -8.33333333333333e+00 2414 2420 -6.25000000000000e+00 2414 2419 -2.08333333333333e+00 2414 1978 2.08333333333333e+00 2414 2418 4.16666666666667e+00 2414 2411 -1.87500000000000e+01 2414 1945 0.00000000000000e+00 2414 2409 4.16666666666667e+00 2414 2256 -4.16666666666667e+00 2414 2107 0.00000000000000e+00 2414 2412 -8.33333333333333e+00 2414 2244 0.00000000000000e+00 2414 2103 0.00000000000000e+00 2414 2245 0.00000000000000e+00 2414 2104 0.00000000000000e+00 2414 2108 0.00000000000000e+00 2414 2106 0.00000000000000e+00 2414 1944 0.00000000000000e+00 2414 2114 -1.87500000000000e+01 2414 2410 4.16666666666667e+00 2414 2258 -1.25000000000000e+01 2414 2113 4.16666666666667e+00 2414 2413 -8.33333333333333e+00 2414 2257 8.33333333333333e+00 2414 2112 4.16666666666667e+00 2414 1977 -4.16666666666667e+00 2415 2415 6.25000000000000e+01 2415 2407 -2.08333333333333e+00 2415 2406 -6.25000000000000e+00 2415 2405 -4.16666666666667e+00 2415 2404 2.08333333333333e+00 2415 2203 4.16666666666667e+00 2415 2200 -4.16666666666667e+00 2415 2204 4.16666666666667e+00 2415 2201 -4.16666666666667e+00 2415 2264 4.16666666666667e+00 2415 2267 -4.16666666666667e+00 2415 2125 2.08333333333333e+00 2415 2122 -2.08333333333333e+00 2415 1955 4.16666666666667e+00 2415 2126 -4.16666666666667e+00 2415 1954 4.16666666666667e+00 2415 2416 -8.33333333333333e+00 2415 2266 8.33333333333333e+00 2415 1953 -1.87500000000000e+01 2415 2265 -1.25000000000000e+01 2415 2417 -8.33333333333333e+00 2415 1949 4.16666666666667e+00 2415 2123 4.16666666666667e+00 2415 1948 4.16666666666667e+00 2415 2263 -8.33333333333333e+00 2415 2408 4.16666666666667e+00 2415 1947 -1.87500000000000e+01 2415 2121 -6.25000000000000e+00 2416 2416 6.25000000000000e+01 2416 2408 4.16666666666667e+00 2416 2407 -6.25000000000000e+00 2416 2406 -2.08333333333333e+00 2416 2403 2.08333333333333e+00 2416 2202 4.16666666666667e+00 2416 2199 -4.16666666666667e+00 2416 2201 -4.16666666666667e+00 2416 2204 -8.33333333333333e+00 2416 2417 -8.33333333333333e+00 2416 2267 8.33333333333333e+00 2416 2123 4.16666666666667e+00 2416 2124 2.08333333333333e+00 2416 2121 -2.08333333333333e+00 2416 1955 -2.08333333333333e+00 2416 2126 2.08333333333333e+00 2416 1954 -6.25000000000000e+00 2416 2266 -3.75000000000000e+01 2416 1953 4.16666666666667e+00 2416 2415 -8.33333333333333e+00 2416 2265 8.33333333333333e+00 2416 1949 -2.08333333333333e+00 2416 2264 4.16666666666667e+00 2416 2405 2.08333333333333e+00 2416 1948 -6.25000000000000e+00 2416 2122 -6.25000000000000e+00 2416 1947 4.16666666666667e+00 2416 2262 -8.33333333333333e+00 2417 2417 6.25000000000000e+01 2417 2408 -1.87500000000000e+01 2417 2407 4.16666666666667e+00 2417 2406 4.16666666666667e+00 2417 2403 -4.16666666666667e+00 2417 2200 -4.16666666666667e+00 2417 2203 -8.33333333333333e+00 2417 2202 4.16666666666667e+00 2417 2199 -4.16666666666667e+00 2417 2262 4.16666666666667e+00 2417 2265 -4.16666666666667e+00 2417 2416 -8.33333333333333e+00 2417 2266 8.33333333333333e+00 2417 2122 4.16666666666667e+00 2417 1955 -6.25000000000000e+00 2417 2267 -1.25000000000000e+01 2417 1954 -2.08333333333333e+00 2417 2125 2.08333333333333e+00 2417 1953 4.16666666666667e+00 2417 2124 -4.16666666666667e+00 2417 2404 2.08333333333333e+00 2417 1949 -6.25000000000000e+00 2417 2123 -1.87500000000000e+01 2417 1948 -2.08333333333333e+00 2417 2263 4.16666666666667e+00 2417 2415 -8.33333333333333e+00 2417 1947 4.16666666666667e+00 2417 2121 4.16666666666667e+00 2418 2418 6.25000000000000e+01 2418 2248 -4.16666666666667e+00 2418 2258 4.16666666666667e+00 2418 2249 -4.16666666666667e+00 2418 2411 -4.16666666666667e+00 2418 2414 4.16666666666667e+00 2418 2413 4.16666666666667e+00 2418 2257 -8.33333333333333e+00 2418 2412 -1.87500000000000e+01 2418 2264 4.16666666666667e+00 2418 2276 -4.16666666666667e+00 2418 2122 4.16666666666667e+00 2418 2419 -8.33333333333333e+00 2418 2275 8.33333333333333e+00 2418 1979 4.16666666666667e+00 2418 2135 -4.16666666666667e+00 2418 1978 -2.08333333333333e+00 2418 2134 2.08333333333333e+00 2418 1977 -6.25000000000000e+00 2418 2274 -1.25000000000000e+01 2418 2420 -8.33333333333333e+00 2418 1949 4.16666666666667e+00 2418 2123 4.16666666666667e+00 2418 1948 -2.08333333333333e+00 2418 2263 4.16666666666667e+00 2418 2410 2.08333333333333e+00 2418 1947 -6.25000000000000e+00 2418 2121 -1.87500000000000e+01 2419 2419 6.25000000000000e+01 2419 2247 -4.16666666666667e+00 2419 2411 2.08333333333333e+00 2419 2249 -4.16666666666667e+00 2419 2414 -2.08333333333333e+00 2419 2258 4.16666666666667e+00 2419 2413 -6.25000000000000e+00 2419 2412 4.16666666666667e+00 2419 2256 -8.33333333333333e+00 2419 2123 -2.08333333333333e+00 2419 2135 2.08333333333333e+00 2419 2121 4.16666666666667e+00 2419 2418 -8.33333333333333e+00 2419 2274 8.33333333333333e+00 2419 1979 4.16666666666667e+00 2419 2420 -8.33333333333333e+00 2419 2276 8.33333333333333e+00 2419 1978 -6.25000000000000e+00 2419 2275 -3.75000000000000e+01 2419 1977 -2.08333333333333e+00 2419 2133 2.08333333333333e+00 2419 1949 4.16666666666667e+00 2419 2264 -8.33333333333333e+00 2419 2409 2.08333333333333e+00 2419 1948 -6.25000000000000e+00 2419 2122 -6.25000000000000e+00 2419 1947 -2.08333333333333e+00 2419 2262 4.16666666666667e+00 2420 2420 6.25000000000000e+01 2420 2247 -4.16666666666667e+00 2420 2410 2.08333333333333e+00 2420 2248 -4.16666666666667e+00 2420 2409 -4.16666666666667e+00 2420 2414 -6.25000000000000e+00 2420 2413 -2.08333333333333e+00 2420 2257 4.16666666666667e+00 2420 2412 4.16666666666667e+00 2420 2122 -2.08333333333333e+00 2420 2134 2.08333333333333e+00 2420 2262 4.16666666666667e+00 2420 2274 -4.16666666666667e+00 2420 1979 -1.87500000000000e+01 2420 2276 -1.25000000000000e+01 2420 1978 4.16666666666667e+00 2420 2419 -8.33333333333333e+00 2420 2275 8.33333333333333e+00 2420 1977 4.16666666666667e+00 2420 2133 -4.16666666666667e+00 2420 2256 4.16666666666667e+00 2420 1949 -1.87500000000000e+01 2420 2123 -6.25000000000000e+00 2420 1948 4.16666666666667e+00 2420 2263 -8.33333333333333e+00 2420 2418 -8.33333333333333e+00 2420 1947 4.16666666666667e+00 2420 2121 4.16666666666667e+00 2421 2421 6.25000000000000e+01 2421 2327 -4.16666666666667e+00 2421 2422 -8.33333333333333e+00 2421 2425 4.16666666666667e+00 2421 2326 8.33333333333333e+00 2421 2426 4.16666666666667e+00 2421 1951 -2.08333333333333e+00 2421 2323 4.16666666666667e+00 2421 2424 -1.87500000000000e+01 2421 2435 -4.16666666666667e+00 2421 2434 2.08333333333333e+00 2421 1957 -2.08333333333333e+00 2421 2325 -1.25000000000000e+01 2421 2053 2.08333333333333e+00 2421 2305 -4.16666666666667e+00 2421 2306 -4.16666666666667e+00 2421 2312 4.16666666666667e+00 2421 1952 4.16666666666667e+00 2421 2054 -4.16666666666667e+00 2421 1950 -6.25000000000000e+00 2421 2423 -8.33333333333333e+00 2421 2060 4.16666666666667e+00 2421 1958 4.16666666666667e+00 2421 2059 4.16666666666667e+00 2421 2311 -8.33333333333333e+00 2421 2324 4.16666666666667e+00 2421 2058 -1.87500000000000e+01 2421 1956 -6.25000000000000e+00 2422 2422 6.25000000000000e+01 2422 2435 2.08333333333333e+00 2422 2421 -8.33333333333333e+00 2422 2424 4.16666666666667e+00 2422 2325 8.33333333333333e+00 2422 1952 4.16666666666667e+00 2422 2324 -8.33333333333333e+00 2422 2425 -6.25000000000000e+00 2422 1950 -2.08333333333333e+00 2422 2322 4.16666666666667e+00 2422 2423 -8.33333333333333e+00 2422 2327 8.33333333333333e+00 2422 1958 4.16666666666667e+00 2422 2326 -3.75000000000000e+01 2422 2433 2.08333333333333e+00 2422 1956 -2.08333333333333e+00 2422 2052 2.08333333333333e+00 2422 2304 -4.16666666666667e+00 2422 2054 2.08333333333333e+00 2422 2306 -4.16666666666667e+00 2422 1951 -6.25000000000000e+00 2422 2060 -2.08333333333333e+00 2422 2312 4.16666666666667e+00 2422 2426 -2.08333333333333e+00 2422 2059 -6.25000000000000e+00 2422 1957 -6.25000000000000e+00 2422 2058 4.16666666666667e+00 2422 2310 -8.33333333333333e+00 2423 2423 6.25000000000000e+01 2423 2325 -4.16666666666667e+00 2423 2425 -2.08333333333333e+00 2423 2434 2.08333333333333e+00 2423 2426 -6.25000000000000e+00 2423 1951 4.16666666666667e+00 2423 2323 -8.33333333333333e+00 2423 2424 4.16666666666667e+00 2423 2327 -1.25000000000000e+01 2423 2422 -8.33333333333333e+00 2423 2326 8.33333333333333e+00 2423 1957 4.16666666666667e+00 2423 2433 -4.16666666666667e+00 2423 2304 -4.16666666666667e+00 2423 2310 4.16666666666667e+00 2423 1952 -1.87500000000000e+01 2423 2053 2.08333333333333e+00 2423 2305 -4.16666666666667e+00 2423 1950 4.16666666666667e+00 2423 2052 -4.16666666666667e+00 2423 2322 4.16666666666667e+00 2423 2060 -6.25000000000000e+00 2423 1958 -1.87500000000000e+01 2423 2059 -2.08333333333333e+00 2423 2311 4.16666666666667e+00 2423 2421 -8.33333333333333e+00 2423 2058 4.16666666666667e+00 2423 1956 4.16666666666667e+00 2424 2424 6.25000000000000e+01 2424 2422 4.16666666666667e+00 2424 2326 -8.33333333333333e+00 2424 2423 4.16666666666667e+00 2424 1951 2.08333333333333e+00 2424 2421 -1.87500000000000e+01 2424 2435 4.16666666666667e+00 2424 2434 -2.08333333333333e+00 2424 2433 -6.25000000000000e+00 2424 2323 -4.16666666666667e+00 2424 2324 -4.16666666666667e+00 2424 2426 -8.33333333333333e+00 2424 2065 -2.08333333333333e+00 2424 2062 4.16666666666667e+00 2424 2063 4.16666666666667e+00 2424 2330 -4.16666666666667e+00 2424 2066 4.16666666666667e+00 2424 1952 -4.16666666666667e+00 2424 2064 -6.25000000000000e+00 2424 2425 -8.33333333333333e+00 2424 2329 8.33333333333333e+00 2424 2327 4.16666666666667e+00 2424 2328 -1.25000000000000e+01 2424 1345 2.08333333333333e+00 2424 1439 4.16666666666667e+00 2424 1346 -4.16666666666667e+00 2424 1438 4.16666666666667e+00 2424 1437 -1.87500000000000e+01 2425 2425 6.25000000000000e+01 2425 2327 4.16666666666667e+00 2425 2421 4.16666666666667e+00 2425 2325 -8.33333333333333e+00 2425 2422 -6.25000000000000e+00 2425 1950 2.08333333333333e+00 2425 2426 -8.33333333333333e+00 2425 2435 4.16666666666667e+00 2425 2434 -6.25000000000000e+00 2425 2433 -2.08333333333333e+00 2425 2322 -4.16666666666667e+00 2425 2066 4.16666666666667e+00 2425 2064 -2.08333333333333e+00 2425 2061 4.16666666666667e+00 2425 2063 -8.33333333333333e+00 2425 2330 8.33333333333333e+00 2425 1952 2.08333333333333e+00 2425 2324 -4.16666666666667e+00 2425 2065 -6.25000000000000e+00 2425 2423 -2.08333333333333e+00 2425 2329 -3.75000000000000e+01 2425 2424 -8.33333333333333e+00 2425 2328 8.33333333333333e+00 2425 1344 2.08333333333333e+00 2425 1439 -2.08333333333333e+00 2425 1346 2.08333333333333e+00 2425 1438 -6.25000000000000e+00 2425 1437 4.16666666666667e+00 2426 2426 6.25000000000000e+01 2426 2422 -2.08333333333333e+00 2426 2326 4.16666666666667e+00 2426 2423 -6.25000000000000e+00 2426 2421 4.16666666666667e+00 2426 2435 -1.87500000000000e+01 2426 2425 -8.33333333333333e+00 2426 2434 4.16666666666667e+00 2426 2433 4.16666666666667e+00 2426 2322 -4.16666666666667e+00 2426 2065 4.16666666666667e+00 2426 2424 -8.33333333333333e+00 2426 2062 -8.33333333333333e+00 2426 2329 8.33333333333333e+00 2426 2061 4.16666666666667e+00 2426 2328 -4.16666666666667e+00 2426 2066 -1.87500000000000e+01 2426 1951 2.08333333333333e+00 2426 2323 -4.16666666666667e+00 2426 2064 4.16666666666667e+00 2426 1950 -4.16666666666667e+00 2426 2325 4.16666666666667e+00 2426 2330 -1.25000000000000e+01 2426 1439 -6.25000000000000e+00 2426 1438 -2.08333333333333e+00 2426 1345 2.08333333333333e+00 2426 1437 4.16666666666667e+00 2426 1344 -4.16666666666667e+00 2427 2427 6.25000000000000e+01 2427 2437 2.08333333333333e+00 2427 2438 -4.16666666666667e+00 2427 2432 4.16666666666667e+00 2427 2430 -6.25000000000000e+00 2427 2375 -4.16666666666667e+00 2427 1957 4.16666666666667e+00 2427 2428 -8.33333333333333e+00 2427 2374 8.33333333333333e+00 2427 2373 -1.25000000000000e+01 2427 2372 4.16666666666667e+00 2427 1954 4.16666666666667e+00 2427 2371 -8.33333333333333e+00 2427 2312 4.16666666666667e+00 2427 2309 -4.16666666666667e+00 2427 1955 4.16666666666667e+00 2427 2057 -4.16666666666667e+00 2427 2056 2.08333333333333e+00 2427 2308 -4.16666666666667e+00 2427 1953 -1.87500000000000e+01 2427 2429 -8.33333333333333e+00 2427 2060 4.16666666666667e+00 2427 1958 4.16666666666667e+00 2427 2059 -2.08333333333333e+00 2427 2311 4.16666666666667e+00 2427 2431 -2.08333333333333e+00 2427 2058 -6.25000000000000e+00 2427 1956 -1.87500000000000e+01 2428 2428 6.25000000000000e+01 2428 2429 -8.33333333333333e+00 2428 2430 -2.08333333333333e+00 2428 2436 2.08333333333333e+00 2428 1958 -2.08333333333333e+00 2428 2438 2.08333333333333e+00 2428 1955 -2.08333333333333e+00 2428 2431 -6.25000000000000e+00 2428 2372 4.16666666666667e+00 2428 2375 8.33333333333333e+00 2428 2374 -3.75000000000000e+01 2428 1956 4.16666666666667e+00 2428 2427 -8.33333333333333e+00 2428 2373 8.33333333333333e+00 2428 1953 4.16666666666667e+00 2428 2370 -8.33333333333333e+00 2428 2057 2.08333333333333e+00 2428 2309 -4.16666666666667e+00 2428 1954 -6.25000000000000e+00 2428 2055 2.08333333333333e+00 2428 2307 -4.16666666666667e+00 2428 2060 4.16666666666667e+00 2428 2312 -8.33333333333333e+00 2428 2432 4.16666666666667e+00 2428 2059 -6.25000000000000e+00 2428 1957 -6.25000000000000e+00 2428 2058 -2.08333333333333e+00 2428 2310 4.16666666666667e+00 2429 2429 6.25000000000000e+01 2429 2428 -8.33333333333333e+00 2429 1957 -2.08333333333333e+00 2429 2437 2.08333333333333e+00 2429 2436 -4.16666666666667e+00 2429 2432 -1.87500000000000e+01 2429 1954 -2.08333333333333e+00 2429 2430 4.16666666666667e+00 2429 2371 4.16666666666667e+00 2429 2375 -1.25000000000000e+01 2429 2374 8.33333333333333e+00 2429 2373 -4.16666666666667e+00 2429 2370 4.16666666666667e+00 2429 2310 4.16666666666667e+00 2429 2307 -4.16666666666667e+00 2429 2056 2.08333333333333e+00 2429 2308 -4.16666666666667e+00 2429 1955 -6.25000000000000e+00 2429 1953 4.16666666666667e+00 2429 2055 -4.16666666666667e+00 2429 2431 4.16666666666667e+00 2429 2060 -1.87500000000000e+01 2429 1958 -6.25000000000000e+00 2429 2059 4.16666666666667e+00 2429 2311 -8.33333333333333e+00 2429 2427 -8.33333333333333e+00 2429 2058 4.16666666666667e+00 2429 1956 4.16666666666667e+00 2430 2430 6.25000000000000e+01 2430 2375 4.16666666666667e+00 2430 2374 4.16666666666667e+00 2430 2438 4.16666666666667e+00 2430 2437 4.16666666666667e+00 2430 2431 -8.33333333333333e+00 2430 2436 -1.87500000000000e+01 2430 2429 4.16666666666667e+00 2430 2427 -6.25000000000000e+00 2430 2384 -4.16666666666667e+00 2430 2432 -8.33333333333333e+00 2430 2372 -4.16666666666667e+00 2430 2120 4.16666666666667e+00 2430 2125 4.16666666666667e+00 2430 2383 8.33333333333333e+00 2430 2119 -8.33333333333333e+00 2430 2126 4.16666666666667e+00 2430 1955 -4.16666666666667e+00 2430 1954 2.08333333333333e+00 2430 2371 -4.16666666666667e+00 2430 2124 -1.87500000000000e+01 2430 2138 4.16666666666667e+00 2430 1982 -4.16666666666667e+00 2430 2137 -2.08333333333333e+00 2430 1981 2.08333333333333e+00 2430 2136 -6.25000000000000e+00 2430 2428 -2.08333333333333e+00 2430 2382 -1.25000000000000e+01 2431 2431 6.25000000000000e+01 2431 2427 -2.08333333333333e+00 2431 2375 -8.33333333333333e+00 2431 2373 4.16666666666667e+00 2431 2438 -2.08333333333333e+00 2431 1982 2.08333333333333e+00 2431 2437 -6.25000000000000e+00 2431 2436 4.16666666666667e+00 2431 2430 -8.33333333333333e+00 2431 1955 2.08333333333333e+00 2431 2428 -6.25000000000000e+00 2431 2126 -2.08333333333333e+00 2431 2124 4.16666666666667e+00 2431 2372 -4.16666666666667e+00 2431 2120 4.16666666666667e+00 2431 2382 8.33333333333333e+00 2431 2118 -8.33333333333333e+00 2431 2125 -6.25000000000000e+00 2431 1953 2.08333333333333e+00 2431 2370 -4.16666666666667e+00 2431 2138 4.16666666666667e+00 2431 2432 -8.33333333333333e+00 2431 2384 8.33333333333333e+00 2431 2137 -6.25000000000000e+00 2431 2429 4.16666666666667e+00 2431 2383 -3.75000000000000e+01 2431 2136 -2.08333333333333e+00 2431 1980 2.08333333333333e+00 2432 2432 6.25000000000000e+01 2432 2373 4.16666666666667e+00 2432 2374 -8.33333333333333e+00 2432 2438 -6.25000000000000e+00 2432 2437 -2.08333333333333e+00 2432 1981 2.08333333333333e+00 2432 2436 4.16666666666667e+00 2432 2429 -1.87500000000000e+01 2432 1954 2.08333333333333e+00 2432 2427 4.16666666666667e+00 2432 2382 -4.16666666666667e+00 2432 2125 -2.08333333333333e+00 2432 2430 -8.33333333333333e+00 2432 2370 -4.16666666666667e+00 2432 2118 4.16666666666667e+00 2432 2371 -4.16666666666667e+00 2432 2119 4.16666666666667e+00 2432 2126 -6.25000000000000e+00 2432 2124 4.16666666666667e+00 2432 1953 -4.16666666666667e+00 2432 2138 -1.87500000000000e+01 2432 2428 4.16666666666667e+00 2432 2384 -1.25000000000000e+01 2432 2137 4.16666666666667e+00 2432 2431 -8.33333333333333e+00 2432 2383 8.33333333333333e+00 2432 2136 4.16666666666667e+00 2432 1980 -4.16666666666667e+00 2433 2433 6.25000000000000e+01 2433 2425 -2.08333333333333e+00 2433 2424 -6.25000000000000e+00 2433 2423 -4.16666666666667e+00 2433 2422 2.08333333333333e+00 2433 2329 4.16666666666667e+00 2433 2326 -4.16666666666667e+00 2433 2330 4.16666666666667e+00 2433 2327 -4.16666666666667e+00 2433 2390 4.16666666666667e+00 2433 2393 -4.16666666666667e+00 2433 2143 -2.08333333333333e+00 2433 2434 -8.33333333333333e+00 2433 2392 8.33333333333333e+00 2433 2391 -1.25000000000000e+01 2433 2435 -8.33333333333333e+00 2433 1958 4.16666666666667e+00 2433 2144 4.16666666666667e+00 2433 1957 4.16666666666667e+00 2433 2389 -8.33333333333333e+00 2433 2426 4.16666666666667e+00 2433 1956 -1.87500000000000e+01 2433 2142 -6.25000000000000e+00 2433 1507 2.08333333333333e+00 2433 1346 4.16666666666667e+00 2433 1508 -4.16666666666667e+00 2433 1345 4.16666666666667e+00 2433 1344 -1.87500000000000e+01 2434 2434 6.25000000000000e+01 2434 2426 4.16666666666667e+00 2434 2425 -6.25000000000000e+00 2434 2424 -2.08333333333333e+00 2434 2421 2.08333333333333e+00 2434 2328 4.16666666666667e+00 2434 2325 -4.16666666666667e+00 2434 2327 -4.16666666666667e+00 2434 2330 -8.33333333333333e+00 2434 2435 -8.33333333333333e+00 2434 2393 8.33333333333333e+00 2434 2144 4.16666666666667e+00 2434 2142 -2.08333333333333e+00 2434 2392 -3.75000000000000e+01 2434 2433 -8.33333333333333e+00 2434 2391 8.33333333333333e+00 2434 1958 -2.08333333333333e+00 2434 2390 4.16666666666667e+00 2434 2423 2.08333333333333e+00 2434 1957 -6.25000000000000e+00 2434 2143 -6.25000000000000e+00 2434 1956 4.16666666666667e+00 2434 2388 -8.33333333333333e+00 2434 1506 2.08333333333333e+00 2434 1346 -2.08333333333333e+00 2434 1508 2.08333333333333e+00 2434 1345 -6.25000000000000e+00 2434 1344 4.16666666666667e+00 2435 2435 6.25000000000000e+01 2435 2426 -1.87500000000000e+01 2435 2425 4.16666666666667e+00 2435 2424 4.16666666666667e+00 2435 2421 -4.16666666666667e+00 2435 2326 -4.16666666666667e+00 2435 2329 -8.33333333333333e+00 2435 2328 4.16666666666667e+00 2435 2325 -4.16666666666667e+00 2435 2388 4.16666666666667e+00 2435 2391 -4.16666666666667e+00 2435 2434 -8.33333333333333e+00 2435 2392 8.33333333333333e+00 2435 2143 4.16666666666667e+00 2435 2393 -1.25000000000000e+01 2435 2422 2.08333333333333e+00 2435 1958 -6.25000000000000e+00 2435 2144 -1.87500000000000e+01 2435 1957 -2.08333333333333e+00 2435 2389 4.16666666666667e+00 2435 2433 -8.33333333333333e+00 2435 1956 4.16666666666667e+00 2435 2142 4.16666666666667e+00 2435 1346 -6.25000000000000e+00 2435 1345 -2.08333333333333e+00 2435 1507 2.08333333333333e+00 2435 1344 4.16666666666667e+00 2435 1506 -4.16666666666667e+00 2436 2436 6.25000000000000e+01 2436 2374 -4.16666666666667e+00 2436 2384 4.16666666666667e+00 2436 2375 -4.16666666666667e+00 2436 2429 -4.16666666666667e+00 2436 2432 4.16666666666667e+00 2436 2431 4.16666666666667e+00 2436 2383 -8.33333333333333e+00 2436 2430 -1.87500000000000e+01 2436 2390 4.16666666666667e+00 2436 2402 -4.16666666666667e+00 2436 2143 4.16666666666667e+00 2436 2437 -8.33333333333333e+00 2436 2401 8.33333333333333e+00 2436 1982 4.16666666666667e+00 2436 2150 -4.16666666666667e+00 2436 1981 -2.08333333333333e+00 2436 2149 2.08333333333333e+00 2436 1980 -6.25000000000000e+00 2436 2400 -1.25000000000000e+01 2436 2438 -8.33333333333333e+00 2436 1958 4.16666666666667e+00 2436 2144 4.16666666666667e+00 2436 1957 -2.08333333333333e+00 2436 2389 4.16666666666667e+00 2436 2428 2.08333333333333e+00 2436 1956 -6.25000000000000e+00 2436 2142 -1.87500000000000e+01 2437 2437 6.25000000000000e+01 2437 2373 -4.16666666666667e+00 2437 2429 2.08333333333333e+00 2437 2375 -4.16666666666667e+00 2437 2432 -2.08333333333333e+00 2437 2384 4.16666666666667e+00 2437 2431 -6.25000000000000e+00 2437 2430 4.16666666666667e+00 2437 2382 -8.33333333333333e+00 2437 2144 -2.08333333333333e+00 2437 2150 2.08333333333333e+00 2437 2142 4.16666666666667e+00 2437 2436 -8.33333333333333e+00 2437 2400 8.33333333333333e+00 2437 1982 4.16666666666667e+00 2437 2438 -8.33333333333333e+00 2437 2402 8.33333333333333e+00 2437 1981 -6.25000000000000e+00 2437 2401 -3.75000000000000e+01 2437 1980 -2.08333333333333e+00 2437 2148 2.08333333333333e+00 2437 1958 4.16666666666667e+00 2437 2390 -8.33333333333333e+00 2437 2427 2.08333333333333e+00 2437 1957 -6.25000000000000e+00 2437 2143 -6.25000000000000e+00 2437 1956 -2.08333333333333e+00 2437 2388 4.16666666666667e+00 2438 2438 6.25000000000000e+01 2438 2373 -4.16666666666667e+00 2438 2428 2.08333333333333e+00 2438 2374 -4.16666666666667e+00 2438 2427 -4.16666666666667e+00 2438 2432 -6.25000000000000e+00 2438 2431 -2.08333333333333e+00 2438 2383 4.16666666666667e+00 2438 2430 4.16666666666667e+00 2438 2143 -2.08333333333333e+00 2438 2149 2.08333333333333e+00 2438 2388 4.16666666666667e+00 2438 2400 -4.16666666666667e+00 2438 1982 -1.87500000000000e+01 2438 2402 -1.25000000000000e+01 2438 1981 4.16666666666667e+00 2438 2437 -8.33333333333333e+00 2438 2401 8.33333333333333e+00 2438 1980 4.16666666666667e+00 2438 2148 -4.16666666666667e+00 2438 2382 4.16666666666667e+00 2438 1958 -1.87500000000000e+01 2438 2144 -6.25000000000000e+00 2438 1957 4.16666666666667e+00 2438 2389 -8.33333333333333e+00 2438 2436 -8.33333333333333e+00 2438 1956 4.16666666666667e+00 2438 2142 4.16666666666667e+00 2439 2439 6.25000000000000e+01 2439 2236 -4.16666666666667e+00 2439 2444 4.16666666666667e+00 2439 2441 -8.33333333333333e+00 2439 2237 8.33333333333333e+00 2439 2234 4.16666666666667e+00 2439 1961 -2.08333333333333e+00 2439 2443 4.16666666666667e+00 2439 2442 -1.87500000000000e+01 2439 2453 2.08333333333333e+00 2439 1967 -2.08333333333333e+00 2439 2452 -4.16666666666667e+00 2439 2235 -1.25000000000000e+01 2439 2216 -4.16666666666667e+00 2439 2072 2.08333333333333e+00 2439 2215 -4.16666666666667e+00 2439 2221 4.16666666666667e+00 2439 2071 -4.16666666666667e+00 2439 1960 4.16666666666667e+00 2439 1959 -6.25000000000000e+00 2439 2078 4.16666666666667e+00 2439 2222 -8.33333333333333e+00 2439 2077 4.16666666666667e+00 2439 2440 -8.33333333333333e+00 2439 1966 4.16666666666667e+00 2439 2076 -1.87500000000000e+01 2439 2233 4.16666666666667e+00 2439 1965 -6.25000000000000e+00 2440 2440 6.25000000000000e+01 2440 2235 -4.16666666666667e+00 2440 2444 -2.08333333333333e+00 2440 2453 2.08333333333333e+00 2440 2234 -8.33333333333333e+00 2440 1961 4.16666666666667e+00 2440 2443 -6.25000000000000e+00 2440 2442 4.16666666666667e+00 2440 2237 8.33333333333333e+00 2440 2441 -8.33333333333333e+00 2440 1967 4.16666666666667e+00 2440 2236 -1.25000000000000e+01 2440 2451 -4.16666666666667e+00 2440 2214 -4.16666666666667e+00 2440 2220 4.16666666666667e+00 2440 2072 2.08333333333333e+00 2440 2216 -4.16666666666667e+00 2440 1960 -1.87500000000000e+01 2440 2070 -4.16666666666667e+00 2440 1959 4.16666666666667e+00 2440 2078 -2.08333333333333e+00 2440 2222 4.16666666666667e+00 2440 2077 -6.25000000000000e+00 2440 2232 4.16666666666667e+00 2440 1966 -1.87500000000000e+01 2440 2076 4.16666666666667e+00 2440 2439 -8.33333333333333e+00 2440 1965 4.16666666666667e+00 2441 2441 6.25000000000000e+01 2441 2452 2.08333333333333e+00 2441 2442 4.16666666666667e+00 2441 2439 -8.33333333333333e+00 2441 2235 8.33333333333333e+00 2441 2444 -6.25000000000000e+00 2441 2233 -8.33333333333333e+00 2441 1960 4.16666666666667e+00 2441 2232 4.16666666666667e+00 2441 1959 -2.08333333333333e+00 2441 2237 -3.75000000000000e+01 2441 2236 8.33333333333333e+00 2441 2440 -8.33333333333333e+00 2441 1966 4.16666666666667e+00 2441 2451 2.08333333333333e+00 2441 1965 -2.08333333333333e+00 2441 2214 -4.16666666666667e+00 2441 2070 2.08333333333333e+00 2441 1961 -6.25000000000000e+00 2441 2071 2.08333333333333e+00 2441 2215 -4.16666666666667e+00 2441 2078 -6.25000000000000e+00 2441 2443 -2.08333333333333e+00 2441 1967 -6.25000000000000e+00 2441 2077 -2.08333333333333e+00 2441 2221 4.16666666666667e+00 2441 2076 4.16666666666667e+00 2441 2220 -8.33333333333333e+00 2442 2442 6.25000000000000e+01 2442 2441 4.16666666666667e+00 2442 2237 -8.33333333333333e+00 2442 1961 2.08333333333333e+00 2442 2440 4.16666666666667e+00 2442 2439 -1.87500000000000e+01 2442 1973 2.08333333333333e+00 2442 2453 -2.08333333333333e+00 2442 2452 4.16666666666667e+00 2442 2451 -6.25000000000000e+00 2442 2234 -4.16666666666667e+00 2442 2233 -4.16666666666667e+00 2442 2081 4.16666666666667e+00 2442 2087 -2.08333333333333e+00 2442 2443 -8.33333333333333e+00 2442 2080 4.16666666666667e+00 2442 2239 -4.16666666666667e+00 2442 1960 -4.16666666666667e+00 2442 2086 4.16666666666667e+00 2442 2085 -6.25000000000000e+00 2442 2444 -8.33333333333333e+00 2442 2093 4.16666666666667e+00 2442 2240 8.33333333333333e+00 2442 2092 4.16666666666667e+00 2442 1972 -4.16666666666667e+00 2442 2236 4.16666666666667e+00 2442 2091 -1.87500000000000e+01 2442 2238 -1.25000000000000e+01 2443 2443 6.25000000000000e+01 2443 2441 -2.08333333333333e+00 2443 2237 4.16666666666667e+00 2443 2440 -6.25000000000000e+00 2443 2439 4.16666666666667e+00 2443 2444 -8.33333333333333e+00 2443 2453 4.16666666666667e+00 2443 2452 -1.87500000000000e+01 2443 2451 4.16666666666667e+00 2443 2232 -4.16666666666667e+00 2443 2087 4.16666666666667e+00 2443 2442 -8.33333333333333e+00 2443 2081 -8.33333333333333e+00 2443 2240 8.33333333333333e+00 2443 2079 4.16666666666667e+00 2443 2238 -4.16666666666667e+00 2443 1961 2.08333333333333e+00 2443 2234 -4.16666666666667e+00 2443 2086 -1.87500000000000e+01 2443 1959 -4.16666666666667e+00 2443 2085 4.16666666666667e+00 2443 2093 -2.08333333333333e+00 2443 1973 2.08333333333333e+00 2443 2235 4.16666666666667e+00 2443 2092 -6.25000000000000e+00 2443 2239 -1.25000000000000e+01 2443 2091 4.16666666666667e+00 2443 1971 -4.16666666666667e+00 2444 2444 6.25000000000000e+01 2444 2236 4.16666666666667e+00 2444 2439 4.16666666666667e+00 2444 2235 -8.33333333333333e+00 2444 2441 -6.25000000000000e+00 2444 1959 2.08333333333333e+00 2444 2453 -6.25000000000000e+00 2444 2443 -8.33333333333333e+00 2444 2452 4.16666666666667e+00 2444 1971 2.08333333333333e+00 2444 2451 -2.08333333333333e+00 2444 2232 -4.16666666666667e+00 2444 2086 4.16666666666667e+00 2444 2079 4.16666666666667e+00 2444 2085 -2.08333333333333e+00 2444 2080 -8.33333333333333e+00 2444 2239 8.33333333333333e+00 2444 2087 -6.25000000000000e+00 2444 1960 2.08333333333333e+00 2444 2233 -4.16666666666667e+00 2444 2440 -2.08333333333333e+00 2444 2093 -6.25000000000000e+00 2444 2240 -3.75000000000000e+01 2444 2092 -2.08333333333333e+00 2444 1972 2.08333333333333e+00 2444 2442 -8.33333333333333e+00 2444 2091 4.16666666666667e+00 2444 2238 8.33333333333333e+00 2445 2445 6.25000000000000e+01 2445 2254 -4.16666666666667e+00 2445 2450 -2.08333333333333e+00 2445 2456 2.08333333333333e+00 2445 1964 0.00000000000000e+00 2445 2252 0.00000000000000e+00 2445 2449 4.16666666666667e+00 2445 2448 -6.25000000000000e+00 2445 2447 -8.33333333333333e+00 2445 2255 8.33333333333333e+00 2445 1967 4.16666666666667e+00 2445 2455 -4.16666666666667e+00 2445 2253 -1.25000000000000e+01 2445 2218 0.00000000000000e+00 2445 2221 4.16666666666667e+00 2445 2075 0.00000000000000e+00 2445 2219 0.00000000000000e+00 2445 1963 0.00000000000000e+00 2445 2074 0.00000000000000e+00 2445 1962 0.00000000000000e+00 2445 2078 -2.08333333333333e+00 2445 2222 4.16666666666667e+00 2445 2446 -8.33333333333333e+00 2445 2077 4.16666666666667e+00 2445 1966 4.16666666666667e+00 2445 2251 0.00000000000000e+00 2445 2076 -6.25000000000000e+00 2445 1965 -1.87500000000000e+01 2446 2446 6.25000000000000e+01 2446 2253 -4.16666666666667e+00 2446 2447 -8.33333333333333e+00 2446 2450 4.16666666666667e+00 2446 2255 8.33333333333333e+00 2446 1964 0.00000000000000e+00 2446 2252 0.00000000000000e+00 2446 2449 -1.87500000000000e+01 2446 2448 4.16666666666667e+00 2446 2456 2.08333333333333e+00 2446 1967 -2.08333333333333e+00 2446 2254 -1.25000000000000e+01 2446 2454 -4.16666666666667e+00 2446 2075 0.00000000000000e+00 2446 2219 0.00000000000000e+00 2446 2217 0.00000000000000e+00 2446 2220 4.16666666666667e+00 2446 1963 0.00000000000000e+00 2446 1962 0.00000000000000e+00 2446 2073 0.00000000000000e+00 2446 2078 4.16666666666667e+00 2446 2222 -8.33333333333333e+00 2446 2250 0.00000000000000e+00 2446 2077 -1.87500000000000e+01 2446 1966 -6.25000000000000e+00 2446 2445 -8.33333333333333e+00 2446 2076 4.16666666666667e+00 2446 1965 4.16666666666667e+00 2447 2447 6.25000000000000e+01 2447 2449 4.16666666666667e+00 2447 2254 8.33333333333333e+00 2447 2448 -2.08333333333333e+00 2447 2454 2.08333333333333e+00 2447 2450 -6.25000000000000e+00 2447 1963 0.00000000000000e+00 2447 2251 0.00000000000000e+00 2447 1962 0.00000000000000e+00 2447 2250 0.00000000000000e+00 2447 2255 -3.75000000000000e+01 2447 2455 2.08333333333333e+00 2447 1966 -2.08333333333333e+00 2447 2445 -8.33333333333333e+00 2447 2253 8.33333333333333e+00 2447 1965 4.16666666666667e+00 2447 2074 0.00000000000000e+00 2447 2218 0.00000000000000e+00 2447 1964 0.00000000000000e+00 2447 2073 0.00000000000000e+00 2447 2217 0.00000000000000e+00 2447 2446 -8.33333333333333e+00 2447 2078 -6.25000000000000e+00 2447 1967 -6.25000000000000e+00 2447 2077 4.16666666666667e+00 2447 2221 -8.33333333333333e+00 2447 2076 -2.08333333333333e+00 2447 2220 4.16666666666667e+00 2448 2448 6.25000000000000e+01 2448 2447 -2.08333333333333e+00 2448 2255 4.16666666666667e+00 2448 2446 4.16666666666667e+00 2448 2445 -6.25000000000000e+00 2448 2450 -8.33333333333333e+00 2448 2456 4.16666666666667e+00 2448 2455 4.16666666666667e+00 2448 2454 -1.87500000000000e+01 2448 2251 0.00000000000000e+00 2448 2111 0.00000000000000e+00 2448 2449 -8.33333333333333e+00 2448 2105 0.00000000000000e+00 2448 2258 8.33333333333333e+00 2448 2104 0.00000000000000e+00 2448 2257 -4.16666666666667e+00 2448 1964 0.00000000000000e+00 2448 2252 0.00000000000000e+00 2448 2110 0.00000000000000e+00 2448 1963 0.00000000000000e+00 2448 2109 0.00000000000000e+00 2448 2114 -2.08333333333333e+00 2448 1979 2.08333333333333e+00 2448 2113 4.16666666666667e+00 2448 1978 -4.16666666666667e+00 2448 2112 -6.25000000000000e+00 2448 2254 4.16666666666667e+00 2448 2256 -1.25000000000000e+01 2449 2449 6.25000000000000e+01 2449 2447 4.16666666666667e+00 2449 2255 -8.33333333333333e+00 2449 1964 0.00000000000000e+00 2449 2446 -1.87500000000000e+01 2449 2445 4.16666666666667e+00 2449 1979 2.08333333333333e+00 2449 2456 -2.08333333333333e+00 2449 2455 -6.25000000000000e+00 2449 2454 4.16666666666667e+00 2449 2252 0.00000000000000e+00 2449 2250 0.00000000000000e+00 2449 2111 0.00000000000000e+00 2449 2105 0.00000000000000e+00 2449 2448 -8.33333333333333e+00 2449 2103 0.00000000000000e+00 2449 2256 -4.16666666666667e+00 2449 2110 0.00000000000000e+00 2449 2109 0.00000000000000e+00 2449 1962 0.00000000000000e+00 2449 2114 4.16666666666667e+00 2449 2450 -8.33333333333333e+00 2449 2258 8.33333333333333e+00 2449 2113 -1.87500000000000e+01 2449 2253 4.16666666666667e+00 2449 2257 -1.25000000000000e+01 2449 2112 4.16666666666667e+00 2449 1977 -4.16666666666667e+00 2450 2450 6.25000000000000e+01 2450 2254 -8.33333333333333e+00 2450 2445 -2.08333333333333e+00 2450 2253 4.16666666666667e+00 2450 2447 -6.25000000000000e+00 2450 1963 0.00000000000000e+00 2450 2456 -6.25000000000000e+00 2450 1978 2.08333333333333e+00 2450 2455 -2.08333333333333e+00 2450 2448 -8.33333333333333e+00 2450 2454 4.16666666666667e+00 2450 2251 0.00000000000000e+00 2450 2110 0.00000000000000e+00 2450 2104 0.00000000000000e+00 2450 2109 0.00000000000000e+00 2450 2103 0.00000000000000e+00 2450 2256 8.33333333333333e+00 2450 2111 0.00000000000000e+00 2450 1962 0.00000000000000e+00 2450 2250 0.00000000000000e+00 2450 2114 -6.25000000000000e+00 2450 2446 4.16666666666667e+00 2450 2258 -3.75000000000000e+01 2450 2113 4.16666666666667e+00 2450 2449 -8.33333333333333e+00 2450 2257 8.33333333333333e+00 2450 2112 -2.08333333333333e+00 2450 1977 2.08333333333333e+00 2451 2451 6.25000000000000e+01 2451 2443 4.16666666666667e+00 2451 2442 -6.25000000000000e+00 2451 2441 2.08333333333333e+00 2451 2440 -4.16666666666667e+00 2451 2240 4.16666666666667e+00 2451 2237 -4.16666666666667e+00 2451 2239 4.16666666666667e+00 2451 2236 -4.16666666666667e+00 2451 2272 -4.16666666666667e+00 2451 2269 4.16666666666667e+00 2451 2132 2.08333333333333e+00 2451 2129 -2.08333333333333e+00 2451 1967 4.16666666666667e+00 2451 2270 -8.33333333333333e+00 2451 1966 4.16666666666667e+00 2451 2452 -8.33333333333333e+00 2451 2128 4.16666666666667e+00 2451 1965 -1.87500000000000e+01 2451 2127 -6.25000000000000e+00 2451 2453 -8.33333333333333e+00 2451 1973 4.16666666666667e+00 2451 2273 8.33333333333333e+00 2451 1972 4.16666666666667e+00 2451 2131 -4.16666666666667e+00 2451 2444 -2.08333333333333e+00 2451 1971 -1.87500000000000e+01 2451 2271 -1.25000000000000e+01 2452 2452 6.25000000000000e+01 2452 2444 4.16666666666667e+00 2452 2443 -1.87500000000000e+01 2452 2442 4.16666666666667e+00 2452 2439 -4.16666666666667e+00 2452 2237 -4.16666666666667e+00 2452 2240 -8.33333333333333e+00 2452 2238 4.16666666666667e+00 2452 2235 -4.16666666666667e+00 2452 2271 -4.16666666666667e+00 2452 2268 4.16666666666667e+00 2452 2273 8.33333333333333e+00 2452 2453 -8.33333333333333e+00 2452 2129 4.16666666666667e+00 2452 1967 -2.08333333333333e+00 2452 2270 4.16666666666667e+00 2452 1966 -6.25000000000000e+00 2452 2128 -1.87500000000000e+01 2452 1965 4.16666666666667e+00 2452 2451 -8.33333333333333e+00 2452 2127 4.16666666666667e+00 2452 1973 -2.08333333333333e+00 2452 2132 2.08333333333333e+00 2452 2441 2.08333333333333e+00 2452 1972 -6.25000000000000e+00 2452 2272 -1.25000000000000e+01 2452 1971 4.16666666666667e+00 2452 2130 -4.16666666666667e+00 2453 2453 6.25000000000000e+01 2453 2444 -6.25000000000000e+00 2453 2443 4.16666666666667e+00 2453 2442 -2.08333333333333e+00 2453 2439 2.08333333333333e+00 2453 2238 4.16666666666667e+00 2453 2235 -4.16666666666667e+00 2453 2236 -4.16666666666667e+00 2453 2239 -8.33333333333333e+00 2453 2272 8.33333333333333e+00 2453 2452 -8.33333333333333e+00 2453 2128 4.16666666666667e+00 2453 2130 2.08333333333333e+00 2453 2127 -2.08333333333333e+00 2453 1967 -6.25000000000000e+00 2453 2129 -6.25000000000000e+00 2453 1966 -2.08333333333333e+00 2453 2269 4.16666666666667e+00 2453 1965 4.16666666666667e+00 2453 2268 -8.33333333333333e+00 2453 2440 2.08333333333333e+00 2453 1973 -6.25000000000000e+00 2453 2273 -3.75000000000000e+01 2453 1972 -2.08333333333333e+00 2453 2131 2.08333333333333e+00 2453 2451 -8.33333333333333e+00 2453 1971 4.16666666666667e+00 2453 2271 8.33333333333333e+00 2454 2454 6.25000000000000e+01 2454 2450 4.16666666666667e+00 2454 2449 4.16666666666667e+00 2454 2448 -1.87500000000000e+01 2454 2446 -4.16666666666667e+00 2454 2255 -4.16666666666667e+00 2454 2258 -8.33333333333333e+00 2454 2257 4.16666666666667e+00 2454 2254 -4.16666666666667e+00 2454 2269 4.16666666666667e+00 2454 2275 -4.16666666666667e+00 2454 2456 -8.33333333333333e+00 2454 2276 8.33333333333333e+00 2454 2129 4.16666666666667e+00 2454 1979 -2.08333333333333e+00 2454 2135 2.08333333333333e+00 2454 1978 4.16666666666667e+00 2454 2134 -4.16666666666667e+00 2454 1977 -6.25000000000000e+00 2454 2274 -1.25000000000000e+01 2454 1967 -2.08333333333333e+00 2454 2270 4.16666666666667e+00 2454 2455 -8.33333333333333e+00 2454 1966 4.16666666666667e+00 2454 2128 4.16666666666667e+00 2454 2447 2.08333333333333e+00 2454 1965 -6.25000000000000e+00 2454 2127 -1.87500000000000e+01 2455 2455 6.25000000000000e+01 2455 2449 -6.25000000000000e+00 2455 2448 4.16666666666667e+00 2455 2447 2.08333333333333e+00 2455 2445 -4.16666666666667e+00 2455 2258 4.16666666666667e+00 2455 2255 -4.16666666666667e+00 2455 2256 4.16666666666667e+00 2455 2253 -4.16666666666667e+00 2455 2268 4.16666666666667e+00 2455 2274 -4.16666666666667e+00 2455 2135 2.08333333333333e+00 2455 2129 -2.08333333333333e+00 2455 1979 4.16666666666667e+00 2455 2456 -8.33333333333333e+00 2455 2276 8.33333333333333e+00 2455 1978 -1.87500000000000e+01 2455 2275 -1.25000000000000e+01 2455 1977 4.16666666666667e+00 2455 2133 -4.16666666666667e+00 2455 1967 4.16666666666667e+00 2455 2270 -8.33333333333333e+00 2455 2450 -2.08333333333333e+00 2455 1966 -1.87500000000000e+01 2455 2128 -6.25000000000000e+00 2455 2454 -8.33333333333333e+00 2455 1965 4.16666666666667e+00 2455 2127 4.16666666666667e+00 2456 2456 6.25000000000000e+01 2456 2450 -6.25000000000000e+00 2456 2449 -2.08333333333333e+00 2456 2448 4.16666666666667e+00 2456 2446 2.08333333333333e+00 2456 2257 4.16666666666667e+00 2456 2254 -4.16666666666667e+00 2456 2253 -4.16666666666667e+00 2456 2256 -8.33333333333333e+00 2456 2134 2.08333333333333e+00 2456 2128 -2.08333333333333e+00 2456 2454 -8.33333333333333e+00 2456 2274 8.33333333333333e+00 2456 2127 4.16666666666667e+00 2456 1979 -6.25000000000000e+00 2456 2276 -3.75000000000000e+01 2456 1978 4.16666666666667e+00 2456 2455 -8.33333333333333e+00 2456 2275 8.33333333333333e+00 2456 1977 -2.08333333333333e+00 2456 2133 2.08333333333333e+00 2456 2445 2.08333333333333e+00 2456 1967 -6.25000000000000e+00 2456 2129 -6.25000000000000e+00 2456 1966 4.16666666666667e+00 2456 2269 -8.33333333333333e+00 2456 1965 -2.08333333333333e+00 2456 2268 4.16666666666667e+00 2457 2457 6.25000000000000e+01 2457 2362 -4.16666666666667e+00 2457 2462 4.16666666666667e+00 2457 2459 -8.33333333333333e+00 2457 2363 8.33333333333333e+00 2457 2360 4.16666666666667e+00 2457 1970 -2.08333333333333e+00 2457 2461 4.16666666666667e+00 2457 2460 -1.87500000000000e+01 2457 2471 2.08333333333333e+00 2457 1976 -2.08333333333333e+00 2457 2470 -4.16666666666667e+00 2457 2361 -1.25000000000000e+01 2457 2342 -4.16666666666667e+00 2457 2090 2.08333333333333e+00 2457 2341 -4.16666666666667e+00 2457 2347 4.16666666666667e+00 2457 2089 -4.16666666666667e+00 2457 1969 4.16666666666667e+00 2457 1968 -6.25000000000000e+00 2457 2096 4.16666666666667e+00 2457 2348 -8.33333333333333e+00 2457 2095 4.16666666666667e+00 2457 2458 -8.33333333333333e+00 2457 1975 4.16666666666667e+00 2457 2094 -1.87500000000000e+01 2457 2359 4.16666666666667e+00 2457 1974 -6.25000000000000e+00 2458 2458 6.25000000000000e+01 2458 2361 -4.16666666666667e+00 2458 2462 -2.08333333333333e+00 2458 2471 2.08333333333333e+00 2458 2360 -8.33333333333333e+00 2458 1970 4.16666666666667e+00 2458 2461 -6.25000000000000e+00 2458 2460 4.16666666666667e+00 2458 2363 8.33333333333333e+00 2458 2459 -8.33333333333333e+00 2458 1976 4.16666666666667e+00 2458 2362 -1.25000000000000e+01 2458 2469 -4.16666666666667e+00 2458 2340 -4.16666666666667e+00 2458 2346 4.16666666666667e+00 2458 2090 2.08333333333333e+00 2458 2342 -4.16666666666667e+00 2458 1969 -1.87500000000000e+01 2458 2088 -4.16666666666667e+00 2458 1968 4.16666666666667e+00 2458 2096 -2.08333333333333e+00 2458 2348 4.16666666666667e+00 2458 2095 -6.25000000000000e+00 2458 2358 4.16666666666667e+00 2458 1975 -1.87500000000000e+01 2458 2094 4.16666666666667e+00 2458 2457 -8.33333333333333e+00 2458 1974 4.16666666666667e+00 2459 2459 6.25000000000000e+01 2459 2470 2.08333333333333e+00 2459 2460 4.16666666666667e+00 2459 2457 -8.33333333333333e+00 2459 2361 8.33333333333333e+00 2459 2462 -6.25000000000000e+00 2459 2359 -8.33333333333333e+00 2459 1969 4.16666666666667e+00 2459 2358 4.16666666666667e+00 2459 1968 -2.08333333333333e+00 2459 2363 -3.75000000000000e+01 2459 2362 8.33333333333333e+00 2459 2458 -8.33333333333333e+00 2459 1975 4.16666666666667e+00 2459 2469 2.08333333333333e+00 2459 1974 -2.08333333333333e+00 2459 2340 -4.16666666666667e+00 2459 2088 2.08333333333333e+00 2459 1970 -6.25000000000000e+00 2459 2089 2.08333333333333e+00 2459 2341 -4.16666666666667e+00 2459 2096 -6.25000000000000e+00 2459 2461 -2.08333333333333e+00 2459 1976 -6.25000000000000e+00 2459 2095 -2.08333333333333e+00 2459 2347 4.16666666666667e+00 2459 2094 4.16666666666667e+00 2459 2346 -8.33333333333333e+00 2460 2460 6.25000000000000e+01 2460 2459 4.16666666666667e+00 2460 2363 -8.33333333333333e+00 2460 1970 2.08333333333333e+00 2460 2458 4.16666666666667e+00 2460 2457 -1.87500000000000e+01 2460 2471 -2.08333333333333e+00 2460 2470 4.16666666666667e+00 2460 2469 -6.25000000000000e+00 2460 2360 -4.16666666666667e+00 2460 2359 -4.16666666666667e+00 2460 2099 4.16666666666667e+00 2460 2102 -2.08333333333333e+00 2460 2461 -8.33333333333333e+00 2460 2098 4.16666666666667e+00 2460 2365 -4.16666666666667e+00 2460 1969 -4.16666666666667e+00 2460 2101 4.16666666666667e+00 2460 2100 -6.25000000000000e+00 2460 2462 -8.33333333333333e+00 2460 2366 8.33333333333333e+00 2460 2362 4.16666666666667e+00 2460 2364 -1.25000000000000e+01 2460 1364 2.08333333333333e+00 2460 1475 4.16666666666667e+00 2460 1474 4.16666666666667e+00 2460 1363 -4.16666666666667e+00 2460 1473 -1.87500000000000e+01 2461 2461 6.25000000000000e+01 2461 2459 -2.08333333333333e+00 2461 2363 4.16666666666667e+00 2461 2458 -6.25000000000000e+00 2461 2457 4.16666666666667e+00 2461 2462 -8.33333333333333e+00 2461 2471 4.16666666666667e+00 2461 2470 -1.87500000000000e+01 2461 2469 4.16666666666667e+00 2461 2358 -4.16666666666667e+00 2461 2102 4.16666666666667e+00 2461 2460 -8.33333333333333e+00 2461 2099 -8.33333333333333e+00 2461 2366 8.33333333333333e+00 2461 2097 4.16666666666667e+00 2461 2364 -4.16666666666667e+00 2461 1970 2.08333333333333e+00 2461 2360 -4.16666666666667e+00 2461 2101 -1.87500000000000e+01 2461 1968 -4.16666666666667e+00 2461 2100 4.16666666666667e+00 2461 2361 4.16666666666667e+00 2461 2365 -1.25000000000000e+01 2461 1475 -2.08333333333333e+00 2461 1364 2.08333333333333e+00 2461 1474 -6.25000000000000e+00 2461 1473 4.16666666666667e+00 2461 1362 -4.16666666666667e+00 2462 2462 6.25000000000000e+01 2462 2362 4.16666666666667e+00 2462 2457 4.16666666666667e+00 2462 2361 -8.33333333333333e+00 2462 2459 -6.25000000000000e+00 2462 1968 2.08333333333333e+00 2462 2471 -6.25000000000000e+00 2462 2461 -8.33333333333333e+00 2462 2470 4.16666666666667e+00 2462 2469 -2.08333333333333e+00 2462 2358 -4.16666666666667e+00 2462 2101 4.16666666666667e+00 2462 2097 4.16666666666667e+00 2462 2100 -2.08333333333333e+00 2462 2098 -8.33333333333333e+00 2462 2365 8.33333333333333e+00 2462 2102 -6.25000000000000e+00 2462 1969 2.08333333333333e+00 2462 2359 -4.16666666666667e+00 2462 2458 -2.08333333333333e+00 2462 2366 -3.75000000000000e+01 2462 2460 -8.33333333333333e+00 2462 2364 8.33333333333333e+00 2462 1362 2.08333333333333e+00 2462 1475 -6.25000000000000e+00 2462 1474 -2.08333333333333e+00 2462 1363 2.08333333333333e+00 2462 1473 4.16666666666667e+00 2463 2463 6.25000000000000e+01 2463 2380 -4.16666666666667e+00 2463 2468 -2.08333333333333e+00 2463 2474 2.08333333333333e+00 2463 1973 4.16666666666667e+00 2463 2378 -8.33333333333333e+00 2463 2467 4.16666666666667e+00 2463 2466 -6.25000000000000e+00 2463 2465 -8.33333333333333e+00 2463 2381 8.33333333333333e+00 2463 1976 4.16666666666667e+00 2463 2473 -4.16666666666667e+00 2463 2379 -1.25000000000000e+01 2463 2344 -4.16666666666667e+00 2463 2347 4.16666666666667e+00 2463 2093 2.08333333333333e+00 2463 2345 -4.16666666666667e+00 2463 1972 4.16666666666667e+00 2463 2092 -4.16666666666667e+00 2463 1971 -1.87500000000000e+01 2463 2096 -2.08333333333333e+00 2463 2348 4.16666666666667e+00 2463 2464 -8.33333333333333e+00 2463 2095 4.16666666666667e+00 2463 1975 4.16666666666667e+00 2463 2377 4.16666666666667e+00 2463 2094 -6.25000000000000e+00 2463 1974 -1.87500000000000e+01 2464 2464 6.25000000000000e+01 2464 2379 -4.16666666666667e+00 2464 2465 -8.33333333333333e+00 2464 2468 4.16666666666667e+00 2464 2381 8.33333333333333e+00 2464 1973 -2.08333333333333e+00 2464 2378 4.16666666666667e+00 2464 2467 -1.87500000000000e+01 2464 2466 4.16666666666667e+00 2464 2474 2.08333333333333e+00 2464 1976 -2.08333333333333e+00 2464 2380 -1.25000000000000e+01 2464 2472 -4.16666666666667e+00 2464 2093 2.08333333333333e+00 2464 2345 -4.16666666666667e+00 2464 2343 -4.16666666666667e+00 2464 2346 4.16666666666667e+00 2464 1972 -6.25000000000000e+00 2464 1971 4.16666666666667e+00 2464 2091 -4.16666666666667e+00 2464 2096 4.16666666666667e+00 2464 2348 -8.33333333333333e+00 2464 2376 4.16666666666667e+00 2464 2095 -1.87500000000000e+01 2464 1975 -6.25000000000000e+00 2464 2463 -8.33333333333333e+00 2464 2094 4.16666666666667e+00 2464 1974 4.16666666666667e+00 2465 2465 6.25000000000000e+01 2465 2467 4.16666666666667e+00 2465 2380 8.33333333333333e+00 2465 2466 -2.08333333333333e+00 2465 2472 2.08333333333333e+00 2465 2468 -6.25000000000000e+00 2465 1972 -2.08333333333333e+00 2465 2377 4.16666666666667e+00 2465 1971 4.16666666666667e+00 2465 2376 -8.33333333333333e+00 2465 2381 -3.75000000000000e+01 2465 2473 2.08333333333333e+00 2465 1975 -2.08333333333333e+00 2465 2463 -8.33333333333333e+00 2465 2379 8.33333333333333e+00 2465 1974 4.16666666666667e+00 2465 2092 2.08333333333333e+00 2465 2344 -4.16666666666667e+00 2465 1973 -6.25000000000000e+00 2465 2091 2.08333333333333e+00 2465 2343 -4.16666666666667e+00 2465 2464 -8.33333333333333e+00 2465 2096 -6.25000000000000e+00 2465 1976 -6.25000000000000e+00 2465 2095 4.16666666666667e+00 2465 2347 -8.33333333333333e+00 2465 2094 -2.08333333333333e+00 2465 2346 4.16666666666667e+00 2466 2466 6.25000000000000e+01 2466 2465 -2.08333333333333e+00 2466 2381 4.16666666666667e+00 2466 2464 4.16666666666667e+00 2466 2463 -6.25000000000000e+00 2466 2468 -8.33333333333333e+00 2466 2474 4.16666666666667e+00 2466 2473 4.16666666666667e+00 2466 2472 -1.87500000000000e+01 2466 2377 -4.16666666666667e+00 2466 2132 4.16666666666667e+00 2466 2467 -8.33333333333333e+00 2466 2120 -8.33333333333333e+00 2466 2384 8.33333333333333e+00 2466 2119 4.16666666666667e+00 2466 2383 -4.16666666666667e+00 2466 1973 2.08333333333333e+00 2466 2378 -4.16666666666667e+00 2466 2131 4.16666666666667e+00 2466 1972 -4.16666666666667e+00 2466 2130 -1.87500000000000e+01 2466 2138 -2.08333333333333e+00 2466 1982 2.08333333333333e+00 2466 2137 4.16666666666667e+00 2466 1981 -4.16666666666667e+00 2466 2136 -6.25000000000000e+00 2466 2380 4.16666666666667e+00 2466 2382 -1.25000000000000e+01 2467 2467 6.25000000000000e+01 2467 2465 4.16666666666667e+00 2467 2381 -8.33333333333333e+00 2467 1973 2.08333333333333e+00 2467 2464 -1.87500000000000e+01 2467 2463 4.16666666666667e+00 2467 1982 2.08333333333333e+00 2467 2474 -2.08333333333333e+00 2467 2473 -6.25000000000000e+00 2467 2472 4.16666666666667e+00 2467 2378 -4.16666666666667e+00 2467 2376 -4.16666666666667e+00 2467 2132 -2.08333333333333e+00 2467 2120 4.16666666666667e+00 2467 2466 -8.33333333333333e+00 2467 2118 4.16666666666667e+00 2467 2382 -4.16666666666667e+00 2467 2131 -6.25000000000000e+00 2467 2130 4.16666666666667e+00 2467 1971 -4.16666666666667e+00 2467 2138 4.16666666666667e+00 2467 2468 -8.33333333333333e+00 2467 2384 8.33333333333333e+00 2467 2137 -1.87500000000000e+01 2467 2379 4.16666666666667e+00 2467 2383 -1.25000000000000e+01 2467 2136 4.16666666666667e+00 2467 1980 -4.16666666666667e+00 2468 2468 6.25000000000000e+01 2468 2380 -8.33333333333333e+00 2468 2463 -2.08333333333333e+00 2468 2379 4.16666666666667e+00 2468 2465 -6.25000000000000e+00 2468 1972 2.08333333333333e+00 2468 2474 -6.25000000000000e+00 2468 1981 2.08333333333333e+00 2468 2473 -2.08333333333333e+00 2468 2466 -8.33333333333333e+00 2468 2472 4.16666666666667e+00 2468 2377 -4.16666666666667e+00 2468 2131 -2.08333333333333e+00 2468 2119 4.16666666666667e+00 2468 2130 4.16666666666667e+00 2468 2118 -8.33333333333333e+00 2468 2382 8.33333333333333e+00 2468 2132 -6.25000000000000e+00 2468 1971 2.08333333333333e+00 2468 2376 -4.16666666666667e+00 2468 2138 -6.25000000000000e+00 2468 2464 4.16666666666667e+00 2468 2384 -3.75000000000000e+01 2468 2137 4.16666666666667e+00 2468 2467 -8.33333333333333e+00 2468 2383 8.33333333333333e+00 2468 2136 -2.08333333333333e+00 2468 1980 2.08333333333333e+00 2469 2469 6.25000000000000e+01 2469 2461 4.16666666666667e+00 2469 2460 -6.25000000000000e+00 2469 2459 2.08333333333333e+00 2469 2458 -4.16666666666667e+00 2469 2366 4.16666666666667e+00 2469 2363 -4.16666666666667e+00 2469 2365 4.16666666666667e+00 2469 2362 -4.16666666666667e+00 2469 2398 -4.16666666666667e+00 2469 2395 4.16666666666667e+00 2469 2147 -2.08333333333333e+00 2469 1976 4.16666666666667e+00 2469 2396 -8.33333333333333e+00 2469 1975 4.16666666666667e+00 2469 2470 -8.33333333333333e+00 2469 2146 4.16666666666667e+00 2469 1974 -1.87500000000000e+01 2469 2145 -6.25000000000000e+00 2469 2471 -8.33333333333333e+00 2469 2399 8.33333333333333e+00 2469 2462 -2.08333333333333e+00 2469 2397 -1.25000000000000e+01 2469 1511 2.08333333333333e+00 2469 1364 4.16666666666667e+00 2469 1363 4.16666666666667e+00 2469 1510 -4.16666666666667e+00 2469 1362 -1.87500000000000e+01 2470 2470 6.25000000000000e+01 2470 2462 4.16666666666667e+00 2470 2461 -1.87500000000000e+01 2470 2460 4.16666666666667e+00 2470 2457 -4.16666666666667e+00 2470 2363 -4.16666666666667e+00 2470 2366 -8.33333333333333e+00 2470 2364 4.16666666666667e+00 2470 2361 -4.16666666666667e+00 2470 2397 -4.16666666666667e+00 2470 2394 4.16666666666667e+00 2470 2399 8.33333333333333e+00 2470 2471 -8.33333333333333e+00 2470 2147 4.16666666666667e+00 2470 1976 -2.08333333333333e+00 2470 2396 4.16666666666667e+00 2470 1975 -6.25000000000000e+00 2470 2146 -1.87500000000000e+01 2470 1974 4.16666666666667e+00 2470 2469 -8.33333333333333e+00 2470 2145 4.16666666666667e+00 2470 2459 2.08333333333333e+00 2470 2398 -1.25000000000000e+01 2470 1364 -2.08333333333333e+00 2470 1511 2.08333333333333e+00 2470 1363 -6.25000000000000e+00 2470 1362 4.16666666666667e+00 2470 1509 -4.16666666666667e+00 2471 2471 6.25000000000000e+01 2471 2462 -6.25000000000000e+00 2471 2461 4.16666666666667e+00 2471 2460 -2.08333333333333e+00 2471 2457 2.08333333333333e+00 2471 2364 4.16666666666667e+00 2471 2361 -4.16666666666667e+00 2471 2362 -4.16666666666667e+00 2471 2365 -8.33333333333333e+00 2471 2398 8.33333333333333e+00 2471 2470 -8.33333333333333e+00 2471 2146 4.16666666666667e+00 2471 2145 -2.08333333333333e+00 2471 1976 -6.25000000000000e+00 2471 2147 -6.25000000000000e+00 2471 1975 -2.08333333333333e+00 2471 2395 4.16666666666667e+00 2471 1974 4.16666666666667e+00 2471 2394 -8.33333333333333e+00 2471 2458 2.08333333333333e+00 2471 2399 -3.75000000000000e+01 2471 2469 -8.33333333333333e+00 2471 2397 8.33333333333333e+00 2471 1509 2.08333333333333e+00 2471 1364 -6.25000000000000e+00 2471 1363 -2.08333333333333e+00 2471 1510 2.08333333333333e+00 2471 1362 4.16666666666667e+00 2472 2472 6.25000000000000e+01 2472 2468 4.16666666666667e+00 2472 2467 4.16666666666667e+00 2472 2466 -1.87500000000000e+01 2472 2464 -4.16666666666667e+00 2472 2381 -4.16666666666667e+00 2472 2384 -8.33333333333333e+00 2472 2383 4.16666666666667e+00 2472 2380 -4.16666666666667e+00 2472 2395 4.16666666666667e+00 2472 2401 -4.16666666666667e+00 2472 2474 -8.33333333333333e+00 2472 2402 8.33333333333333e+00 2472 2147 4.16666666666667e+00 2472 1982 -2.08333333333333e+00 2472 2150 2.08333333333333e+00 2472 1981 4.16666666666667e+00 2472 2149 -4.16666666666667e+00 2472 1980 -6.25000000000000e+00 2472 2400 -1.25000000000000e+01 2472 1976 -2.08333333333333e+00 2472 2396 4.16666666666667e+00 2472 2473 -8.33333333333333e+00 2472 1975 4.16666666666667e+00 2472 2146 4.16666666666667e+00 2472 2465 2.08333333333333e+00 2472 1974 -6.25000000000000e+00 2472 2145 -1.87500000000000e+01 2473 2473 6.25000000000000e+01 2473 2467 -6.25000000000000e+00 2473 2466 4.16666666666667e+00 2473 2465 2.08333333333333e+00 2473 2463 -4.16666666666667e+00 2473 2384 4.16666666666667e+00 2473 2381 -4.16666666666667e+00 2473 2382 4.16666666666667e+00 2473 2379 -4.16666666666667e+00 2473 2394 4.16666666666667e+00 2473 2400 -4.16666666666667e+00 2473 2150 2.08333333333333e+00 2473 2147 -2.08333333333333e+00 2473 1982 4.16666666666667e+00 2473 2474 -8.33333333333333e+00 2473 2402 8.33333333333333e+00 2473 1981 -1.87500000000000e+01 2473 2401 -1.25000000000000e+01 2473 1980 4.16666666666667e+00 2473 2148 -4.16666666666667e+00 2473 1976 4.16666666666667e+00 2473 2396 -8.33333333333333e+00 2473 2468 -2.08333333333333e+00 2473 1975 -1.87500000000000e+01 2473 2146 -6.25000000000000e+00 2473 2472 -8.33333333333333e+00 2473 1974 4.16666666666667e+00 2473 2145 4.16666666666667e+00 2474 2474 6.25000000000000e+01 2474 2468 -6.25000000000000e+00 2474 2467 -2.08333333333333e+00 2474 2466 4.16666666666667e+00 2474 2464 2.08333333333333e+00 2474 2383 4.16666666666667e+00 2474 2380 -4.16666666666667e+00 2474 2379 -4.16666666666667e+00 2474 2382 -8.33333333333333e+00 2474 2149 2.08333333333333e+00 2474 2146 -2.08333333333333e+00 2474 2472 -8.33333333333333e+00 2474 2400 8.33333333333333e+00 2474 2145 4.16666666666667e+00 2474 1982 -6.25000000000000e+00 2474 2402 -3.75000000000000e+01 2474 1981 4.16666666666667e+00 2474 2473 -8.33333333333333e+00 2474 2401 8.33333333333333e+00 2474 1980 -2.08333333333333e+00 2474 2148 2.08333333333333e+00 2474 2463 2.08333333333333e+00 2474 1976 -6.25000000000000e+00 2474 2147 -6.25000000000000e+00 2474 1975 4.16666666666667e+00 2474 2395 -8.33333333333333e+00 2474 1974 -2.08333333333333e+00 2474 2394 4.16666666666667e+00 hypre-2.33.0/src/test/TEST_ij/data/beam_tet_dof2475_np4/b.IJ.00000000066400000000000000000000406031477326011500234750ustar00rootroot000000000000000 674 0 0.00000000000000e+00 1 0.00000000000000e+00 2 0.00000000000000e+00 3 0.00000000000000e+00 4 0.00000000000000e+00 5 0.00000000000000e+00 6 0.00000000000000e+00 7 0.00000000000000e+00 8 0.00000000000000e+00 9 0.00000000000000e+00 10 0.00000000000000e+00 11 0.00000000000000e+00 12 0.00000000000000e+00 13 0.00000000000000e+00 14 0.00000000000000e+00 15 0.00000000000000e+00 16 0.00000000000000e+00 17 0.00000000000000e+00 18 0.00000000000000e+00 19 0.00000000000000e+00 20 0.00000000000000e+00 21 0.00000000000000e+00 22 0.00000000000000e+00 23 0.00000000000000e+00 24 0.00000000000000e+00 25 0.00000000000000e+00 26 0.00000000000000e+00 27 0.00000000000000e+00 28 0.00000000000000e+00 29 0.00000000000000e+00 30 0.00000000000000e+00 31 0.00000000000000e+00 32 0.00000000000000e+00 33 0.00000000000000e+00 34 0.00000000000000e+00 35 0.00000000000000e+00 36 0.00000000000000e+00 37 0.00000000000000e+00 38 0.00000000000000e+00 39 0.00000000000000e+00 40 0.00000000000000e+00 41 0.00000000000000e+00 42 0.00000000000000e+00 43 0.00000000000000e+00 44 0.00000000000000e+00 45 0.00000000000000e+00 46 0.00000000000000e+00 47 0.00000000000000e+00 48 0.00000000000000e+00 49 0.00000000000000e+00 50 0.00000000000000e+00 51 0.00000000000000e+00 52 0.00000000000000e+00 53 0.00000000000000e+00 54 0.00000000000000e+00 55 0.00000000000000e+00 56 0.00000000000000e+00 57 0.00000000000000e+00 58 0.00000000000000e+00 59 0.00000000000000e+00 60 0.00000000000000e+00 61 0.00000000000000e+00 62 0.00000000000000e+00 63 0.00000000000000e+00 64 0.00000000000000e+00 65 0.00000000000000e+00 66 0.00000000000000e+00 67 0.00000000000000e+00 68 0.00000000000000e+00 69 0.00000000000000e+00 70 0.00000000000000e+00 71 0.00000000000000e+00 72 0.00000000000000e+00 73 0.00000000000000e+00 74 0.00000000000000e+00 75 0.00000000000000e+00 76 0.00000000000000e+00 77 0.00000000000000e+00 78 0.00000000000000e+00 79 0.00000000000000e+00 80 0.00000000000000e+00 81 0.00000000000000e+00 82 0.00000000000000e+00 83 0.00000000000000e+00 84 0.00000000000000e+00 85 0.00000000000000e+00 86 0.00000000000000e+00 87 0.00000000000000e+00 88 0.00000000000000e+00 89 0.00000000000000e+00 90 0.00000000000000e+00 91 0.00000000000000e+00 92 0.00000000000000e+00 93 0.00000000000000e+00 94 0.00000000000000e+00 95 0.00000000000000e+00 96 0.00000000000000e+00 97 0.00000000000000e+00 98 0.00000000000000e+00 99 0.00000000000000e+00 100 0.00000000000000e+00 101 0.00000000000000e+00 102 0.00000000000000e+00 103 0.00000000000000e+00 104 0.00000000000000e+00 105 0.00000000000000e+00 106 0.00000000000000e+00 107 0.00000000000000e+00 108 0.00000000000000e+00 109 0.00000000000000e+00 110 0.00000000000000e+00 111 0.00000000000000e+00 112 0.00000000000000e+00 113 0.00000000000000e+00 114 0.00000000000000e+00 115 0.00000000000000e+00 116 0.00000000000000e+00 117 0.00000000000000e+00 118 0.00000000000000e+00 119 0.00000000000000e+00 120 0.00000000000000e+00 121 0.00000000000000e+00 122 0.00000000000000e+00 123 0.00000000000000e+00 124 0.00000000000000e+00 125 0.00000000000000e+00 126 0.00000000000000e+00 127 0.00000000000000e+00 128 0.00000000000000e+00 129 0.00000000000000e+00 130 0.00000000000000e+00 131 0.00000000000000e+00 132 0.00000000000000e+00 133 0.00000000000000e+00 134 0.00000000000000e+00 135 0.00000000000000e+00 136 0.00000000000000e+00 137 0.00000000000000e+00 138 0.00000000000000e+00 139 0.00000000000000e+00 140 0.00000000000000e+00 141 0.00000000000000e+00 142 0.00000000000000e+00 143 0.00000000000000e+00 144 0.00000000000000e+00 145 0.00000000000000e+00 146 0.00000000000000e+00 147 0.00000000000000e+00 148 0.00000000000000e+00 149 0.00000000000000e+00 150 0.00000000000000e+00 151 0.00000000000000e+00 152 0.00000000000000e+00 153 0.00000000000000e+00 154 0.00000000000000e+00 155 0.00000000000000e+00 156 0.00000000000000e+00 157 0.00000000000000e+00 158 0.00000000000000e+00 159 0.00000000000000e+00 160 0.00000000000000e+00 161 0.00000000000000e+00 162 0.00000000000000e+00 163 0.00000000000000e+00 164 0.00000000000000e+00 165 0.00000000000000e+00 166 0.00000000000000e+00 167 0.00000000000000e+00 168 0.00000000000000e+00 169 0.00000000000000e+00 170 0.00000000000000e+00 171 0.00000000000000e+00 172 0.00000000000000e+00 173 0.00000000000000e+00 174 0.00000000000000e+00 175 0.00000000000000e+00 176 0.00000000000000e+00 177 0.00000000000000e+00 178 0.00000000000000e+00 179 0.00000000000000e+00 180 0.00000000000000e+00 181 0.00000000000000e+00 182 0.00000000000000e+00 183 0.00000000000000e+00 184 0.00000000000000e+00 185 0.00000000000000e+00 186 0.00000000000000e+00 187 0.00000000000000e+00 188 0.00000000000000e+00 189 0.00000000000000e+00 190 0.00000000000000e+00 191 0.00000000000000e+00 192 0.00000000000000e+00 193 0.00000000000000e+00 194 0.00000000000000e+00 195 0.00000000000000e+00 196 0.00000000000000e+00 197 0.00000000000000e+00 198 0.00000000000000e+00 199 0.00000000000000e+00 200 0.00000000000000e+00 201 0.00000000000000e+00 202 0.00000000000000e+00 203 0.00000000000000e+00 204 0.00000000000000e+00 205 0.00000000000000e+00 206 0.00000000000000e+00 207 0.00000000000000e+00 208 0.00000000000000e+00 209 0.00000000000000e+00 210 0.00000000000000e+00 211 0.00000000000000e+00 212 0.00000000000000e+00 213 0.00000000000000e+00 214 0.00000000000000e+00 215 0.00000000000000e+00 216 0.00000000000000e+00 217 0.00000000000000e+00 218 0.00000000000000e+00 219 0.00000000000000e+00 220 0.00000000000000e+00 221 0.00000000000000e+00 222 0.00000000000000e+00 223 0.00000000000000e+00 224 0.00000000000000e+00 225 0.00000000000000e+00 226 0.00000000000000e+00 227 0.00000000000000e+00 228 0.00000000000000e+00 229 0.00000000000000e+00 230 0.00000000000000e+00 231 0.00000000000000e+00 232 0.00000000000000e+00 233 0.00000000000000e+00 234 0.00000000000000e+00 235 0.00000000000000e+00 236 0.00000000000000e+00 237 0.00000000000000e+00 238 0.00000000000000e+00 239 0.00000000000000e+00 240 0.00000000000000e+00 241 0.00000000000000e+00 242 0.00000000000000e+00 243 0.00000000000000e+00 244 0.00000000000000e+00 245 0.00000000000000e+00 246 0.00000000000000e+00 247 0.00000000000000e+00 248 0.00000000000000e+00 249 0.00000000000000e+00 250 0.00000000000000e+00 251 0.00000000000000e+00 252 0.00000000000000e+00 253 0.00000000000000e+00 254 0.00000000000000e+00 255 0.00000000000000e+00 256 0.00000000000000e+00 257 0.00000000000000e+00 258 0.00000000000000e+00 259 0.00000000000000e+00 260 0.00000000000000e+00 261 0.00000000000000e+00 262 0.00000000000000e+00 263 0.00000000000000e+00 264 0.00000000000000e+00 265 0.00000000000000e+00 266 0.00000000000000e+00 267 0.00000000000000e+00 268 0.00000000000000e+00 269 0.00000000000000e+00 270 0.00000000000000e+00 271 0.00000000000000e+00 272 0.00000000000000e+00 273 0.00000000000000e+00 274 0.00000000000000e+00 275 0.00000000000000e+00 276 0.00000000000000e+00 277 0.00000000000000e+00 278 0.00000000000000e+00 279 0.00000000000000e+00 280 0.00000000000000e+00 281 0.00000000000000e+00 282 0.00000000000000e+00 283 0.00000000000000e+00 284 0.00000000000000e+00 285 0.00000000000000e+00 286 0.00000000000000e+00 287 0.00000000000000e+00 288 0.00000000000000e+00 289 0.00000000000000e+00 290 0.00000000000000e+00 291 0.00000000000000e+00 292 0.00000000000000e+00 293 0.00000000000000e+00 294 0.00000000000000e+00 295 0.00000000000000e+00 296 0.00000000000000e+00 297 0.00000000000000e+00 298 0.00000000000000e+00 299 0.00000000000000e+00 300 0.00000000000000e+00 301 0.00000000000000e+00 302 0.00000000000000e+00 303 0.00000000000000e+00 304 0.00000000000000e+00 305 0.00000000000000e+00 306 0.00000000000000e+00 307 0.00000000000000e+00 308 0.00000000000000e+00 309 0.00000000000000e+00 310 0.00000000000000e+00 311 0.00000000000000e+00 312 0.00000000000000e+00 313 0.00000000000000e+00 314 0.00000000000000e+00 315 0.00000000000000e+00 316 0.00000000000000e+00 317 0.00000000000000e+00 318 0.00000000000000e+00 319 0.00000000000000e+00 320 0.00000000000000e+00 321 0.00000000000000e+00 322 0.00000000000000e+00 323 0.00000000000000e+00 324 0.00000000000000e+00 325 0.00000000000000e+00 326 0.00000000000000e+00 327 0.00000000000000e+00 328 0.00000000000000e+00 329 0.00000000000000e+00 330 0.00000000000000e+00 331 0.00000000000000e+00 332 0.00000000000000e+00 333 0.00000000000000e+00 334 0.00000000000000e+00 335 0.00000000000000e+00 336 0.00000000000000e+00 337 0.00000000000000e+00 338 0.00000000000000e+00 339 0.00000000000000e+00 340 0.00000000000000e+00 341 0.00000000000000e+00 342 0.00000000000000e+00 343 0.00000000000000e+00 344 0.00000000000000e+00 345 0.00000000000000e+00 346 0.00000000000000e+00 347 0.00000000000000e+00 348 0.00000000000000e+00 349 0.00000000000000e+00 350 0.00000000000000e+00 351 0.00000000000000e+00 352 0.00000000000000e+00 353 0.00000000000000e+00 354 0.00000000000000e+00 355 0.00000000000000e+00 356 0.00000000000000e+00 357 0.00000000000000e+00 358 0.00000000000000e+00 359 0.00000000000000e+00 360 0.00000000000000e+00 361 0.00000000000000e+00 362 0.00000000000000e+00 363 0.00000000000000e+00 364 0.00000000000000e+00 365 0.00000000000000e+00 366 0.00000000000000e+00 367 0.00000000000000e+00 368 0.00000000000000e+00 369 0.00000000000000e+00 370 0.00000000000000e+00 371 0.00000000000000e+00 372 0.00000000000000e+00 373 0.00000000000000e+00 374 0.00000000000000e+00 375 0.00000000000000e+00 376 0.00000000000000e+00 377 0.00000000000000e+00 378 0.00000000000000e+00 379 0.00000000000000e+00 380 0.00000000000000e+00 381 0.00000000000000e+00 382 0.00000000000000e+00 383 0.00000000000000e+00 384 0.00000000000000e+00 385 0.00000000000000e+00 386 0.00000000000000e+00 387 0.00000000000000e+00 388 0.00000000000000e+00 389 0.00000000000000e+00 390 0.00000000000000e+00 391 0.00000000000000e+00 392 0.00000000000000e+00 393 0.00000000000000e+00 394 0.00000000000000e+00 395 0.00000000000000e+00 396 0.00000000000000e+00 397 0.00000000000000e+00 398 0.00000000000000e+00 399 0.00000000000000e+00 400 0.00000000000000e+00 401 0.00000000000000e+00 402 0.00000000000000e+00 403 0.00000000000000e+00 404 0.00000000000000e+00 405 0.00000000000000e+00 406 0.00000000000000e+00 407 0.00000000000000e+00 408 0.00000000000000e+00 409 0.00000000000000e+00 410 0.00000000000000e+00 411 0.00000000000000e+00 412 0.00000000000000e+00 413 0.00000000000000e+00 414 0.00000000000000e+00 415 0.00000000000000e+00 416 0.00000000000000e+00 417 0.00000000000000e+00 418 0.00000000000000e+00 419 0.00000000000000e+00 420 0.00000000000000e+00 421 0.00000000000000e+00 422 0.00000000000000e+00 423 0.00000000000000e+00 424 0.00000000000000e+00 425 0.00000000000000e+00 426 0.00000000000000e+00 427 0.00000000000000e+00 428 0.00000000000000e+00 429 0.00000000000000e+00 430 0.00000000000000e+00 431 0.00000000000000e+00 432 0.00000000000000e+00 433 0.00000000000000e+00 434 0.00000000000000e+00 435 0.00000000000000e+00 436 0.00000000000000e+00 437 0.00000000000000e+00 438 0.00000000000000e+00 439 0.00000000000000e+00 440 0.00000000000000e+00 441 0.00000000000000e+00 442 0.00000000000000e+00 443 0.00000000000000e+00 444 0.00000000000000e+00 445 0.00000000000000e+00 446 0.00000000000000e+00 447 0.00000000000000e+00 448 0.00000000000000e+00 449 0.00000000000000e+00 450 0.00000000000000e+00 451 0.00000000000000e+00 452 0.00000000000000e+00 453 0.00000000000000e+00 454 0.00000000000000e+00 455 0.00000000000000e+00 456 0.00000000000000e+00 457 0.00000000000000e+00 458 0.00000000000000e+00 459 0.00000000000000e+00 460 0.00000000000000e+00 461 0.00000000000000e+00 462 0.00000000000000e+00 463 0.00000000000000e+00 464 0.00000000000000e+00 465 0.00000000000000e+00 466 0.00000000000000e+00 467 0.00000000000000e+00 468 0.00000000000000e+00 469 0.00000000000000e+00 470 0.00000000000000e+00 471 0.00000000000000e+00 472 0.00000000000000e+00 473 0.00000000000000e+00 474 0.00000000000000e+00 475 0.00000000000000e+00 476 0.00000000000000e+00 477 0.00000000000000e+00 478 0.00000000000000e+00 479 0.00000000000000e+00 480 0.00000000000000e+00 481 0.00000000000000e+00 482 0.00000000000000e+00 483 0.00000000000000e+00 484 0.00000000000000e+00 485 0.00000000000000e+00 486 0.00000000000000e+00 487 0.00000000000000e+00 488 0.00000000000000e+00 489 0.00000000000000e+00 490 0.00000000000000e+00 491 0.00000000000000e+00 492 0.00000000000000e+00 493 0.00000000000000e+00 494 0.00000000000000e+00 495 0.00000000000000e+00 496 0.00000000000000e+00 497 0.00000000000000e+00 498 0.00000000000000e+00 499 0.00000000000000e+00 500 0.00000000000000e+00 501 0.00000000000000e+00 502 0.00000000000000e+00 503 0.00000000000000e+00 504 0.00000000000000e+00 505 0.00000000000000e+00 506 0.00000000000000e+00 507 0.00000000000000e+00 508 0.00000000000000e+00 509 0.00000000000000e+00 510 0.00000000000000e+00 511 0.00000000000000e+00 512 0.00000000000000e+00 513 0.00000000000000e+00 514 0.00000000000000e+00 515 0.00000000000000e+00 516 0.00000000000000e+00 517 0.00000000000000e+00 518 0.00000000000000e+00 519 0.00000000000000e+00 520 0.00000000000000e+00 521 0.00000000000000e+00 522 0.00000000000000e+00 523 0.00000000000000e+00 524 0.00000000000000e+00 525 0.00000000000000e+00 526 0.00000000000000e+00 527 0.00000000000000e+00 528 0.00000000000000e+00 529 0.00000000000000e+00 530 0.00000000000000e+00 531 0.00000000000000e+00 532 0.00000000000000e+00 533 0.00000000000000e+00 534 0.00000000000000e+00 535 0.00000000000000e+00 536 0.00000000000000e+00 537 0.00000000000000e+00 538 0.00000000000000e+00 539 0.00000000000000e+00 540 0.00000000000000e+00 541 0.00000000000000e+00 542 0.00000000000000e+00 543 0.00000000000000e+00 544 0.00000000000000e+00 545 0.00000000000000e+00 546 0.00000000000000e+00 547 0.00000000000000e+00 548 0.00000000000000e+00 549 0.00000000000000e+00 550 0.00000000000000e+00 551 0.00000000000000e+00 552 0.00000000000000e+00 553 0.00000000000000e+00 554 0.00000000000000e+00 555 0.00000000000000e+00 556 0.00000000000000e+00 557 0.00000000000000e+00 558 0.00000000000000e+00 559 0.00000000000000e+00 560 0.00000000000000e+00 561 0.00000000000000e+00 562 0.00000000000000e+00 563 0.00000000000000e+00 564 0.00000000000000e+00 565 0.00000000000000e+00 566 0.00000000000000e+00 567 0.00000000000000e+00 568 0.00000000000000e+00 569 0.00000000000000e+00 570 0.00000000000000e+00 571 0.00000000000000e+00 572 0.00000000000000e+00 573 0.00000000000000e+00 574 0.00000000000000e+00 575 0.00000000000000e+00 576 0.00000000000000e+00 577 0.00000000000000e+00 578 0.00000000000000e+00 579 0.00000000000000e+00 580 0.00000000000000e+00 581 0.00000000000000e+00 582 0.00000000000000e+00 583 0.00000000000000e+00 584 0.00000000000000e+00 585 0.00000000000000e+00 586 0.00000000000000e+00 587 0.00000000000000e+00 588 0.00000000000000e+00 589 0.00000000000000e+00 590 0.00000000000000e+00 591 0.00000000000000e+00 592 0.00000000000000e+00 593 0.00000000000000e+00 594 0.00000000000000e+00 595 0.00000000000000e+00 596 0.00000000000000e+00 597 0.00000000000000e+00 598 0.00000000000000e+00 599 0.00000000000000e+00 600 0.00000000000000e+00 601 0.00000000000000e+00 602 0.00000000000000e+00 603 0.00000000000000e+00 604 0.00000000000000e+00 605 0.00000000000000e+00 606 0.00000000000000e+00 607 0.00000000000000e+00 608 0.00000000000000e+00 609 0.00000000000000e+00 610 0.00000000000000e+00 611 0.00000000000000e+00 612 0.00000000000000e+00 613 0.00000000000000e+00 614 0.00000000000000e+00 615 0.00000000000000e+00 616 0.00000000000000e+00 617 0.00000000000000e+00 618 0.00000000000000e+00 619 0.00000000000000e+00 620 0.00000000000000e+00 621 0.00000000000000e+00 622 0.00000000000000e+00 623 0.00000000000000e+00 624 0.00000000000000e+00 625 0.00000000000000e+00 626 0.00000000000000e+00 627 0.00000000000000e+00 628 0.00000000000000e+00 629 0.00000000000000e+00 630 0.00000000000000e+00 631 0.00000000000000e+00 632 0.00000000000000e+00 633 0.00000000000000e+00 634 0.00000000000000e+00 635 0.00000000000000e+00 636 0.00000000000000e+00 637 0.00000000000000e+00 638 0.00000000000000e+00 639 0.00000000000000e+00 640 0.00000000000000e+00 641 0.00000000000000e+00 642 0.00000000000000e+00 643 0.00000000000000e+00 644 0.00000000000000e+00 645 0.00000000000000e+00 646 0.00000000000000e+00 647 0.00000000000000e+00 648 0.00000000000000e+00 649 0.00000000000000e+00 650 0.00000000000000e+00 651 0.00000000000000e+00 652 0.00000000000000e+00 653 0.00000000000000e+00 654 0.00000000000000e+00 655 0.00000000000000e+00 656 0.00000000000000e+00 657 0.00000000000000e+00 658 0.00000000000000e+00 659 0.00000000000000e+00 660 0.00000000000000e+00 661 0.00000000000000e+00 662 0.00000000000000e+00 663 0.00000000000000e+00 664 0.00000000000000e+00 665 0.00000000000000e+00 666 0.00000000000000e+00 667 0.00000000000000e+00 668 0.00000000000000e+00 669 0.00000000000000e+00 670 0.00000000000000e+00 671 0.00000000000000e+00 672 0.00000000000000e+00 673 0.00000000000000e+00 674 0.00000000000000e+00 hypre-2.33.0/src/test/TEST_ij/data/beam_tet_dof2475_np4/b.IJ.00001000066400000000000000000000357151477326011500235060ustar00rootroot00000000000000675 1274 675 0.00000000000000e+00 676 0.00000000000000e+00 677 0.00000000000000e+00 678 0.00000000000000e+00 679 0.00000000000000e+00 680 -2.08333333333333e-04 681 0.00000000000000e+00 682 0.00000000000000e+00 683 0.00000000000000e+00 684 0.00000000000000e+00 685 0.00000000000000e+00 686 -1.04166666666667e-04 687 0.00000000000000e+00 688 0.00000000000000e+00 689 0.00000000000000e+00 690 0.00000000000000e+00 691 0.00000000000000e+00 692 -1.04166666666667e-04 693 0.00000000000000e+00 694 0.00000000000000e+00 695 0.00000000000000e+00 696 0.00000000000000e+00 697 0.00000000000000e+00 698 -2.08333333333333e-04 699 0.00000000000000e+00 700 0.00000000000000e+00 701 0.00000000000000e+00 702 0.00000000000000e+00 703 0.00000000000000e+00 704 0.00000000000000e+00 705 0.00000000000000e+00 706 0.00000000000000e+00 707 0.00000000000000e+00 708 0.00000000000000e+00 709 0.00000000000000e+00 710 0.00000000000000e+00 711 0.00000000000000e+00 712 0.00000000000000e+00 713 0.00000000000000e+00 714 0.00000000000000e+00 715 0.00000000000000e+00 716 0.00000000000000e+00 717 0.00000000000000e+00 718 0.00000000000000e+00 719 0.00000000000000e+00 720 0.00000000000000e+00 721 0.00000000000000e+00 722 0.00000000000000e+00 723 0.00000000000000e+00 724 0.00000000000000e+00 725 0.00000000000000e+00 726 0.00000000000000e+00 727 0.00000000000000e+00 728 0.00000000000000e+00 729 0.00000000000000e+00 730 0.00000000000000e+00 731 0.00000000000000e+00 732 0.00000000000000e+00 733 0.00000000000000e+00 734 -3.12500000000000e-04 735 0.00000000000000e+00 736 0.00000000000000e+00 737 -3.12500000000000e-04 738 0.00000000000000e+00 739 0.00000000000000e+00 740 -6.25000000000000e-04 741 0.00000000000000e+00 742 0.00000000000000e+00 743 0.00000000000000e+00 744 0.00000000000000e+00 745 0.00000000000000e+00 746 0.00000000000000e+00 747 0.00000000000000e+00 748 0.00000000000000e+00 749 0.00000000000000e+00 750 0.00000000000000e+00 751 0.00000000000000e+00 752 0.00000000000000e+00 753 0.00000000000000e+00 754 0.00000000000000e+00 755 0.00000000000000e+00 756 0.00000000000000e+00 757 0.00000000000000e+00 758 -3.12500000000000e-04 759 0.00000000000000e+00 760 0.00000000000000e+00 761 0.00000000000000e+00 762 0.00000000000000e+00 763 0.00000000000000e+00 764 0.00000000000000e+00 765 0.00000000000000e+00 766 0.00000000000000e+00 767 0.00000000000000e+00 768 0.00000000000000e+00 769 0.00000000000000e+00 770 0.00000000000000e+00 771 0.00000000000000e+00 772 0.00000000000000e+00 773 0.00000000000000e+00 774 0.00000000000000e+00 775 0.00000000000000e+00 776 -3.12500000000000e-04 777 0.00000000000000e+00 778 0.00000000000000e+00 779 0.00000000000000e+00 780 0.00000000000000e+00 781 0.00000000000000e+00 782 0.00000000000000e+00 783 0.00000000000000e+00 784 0.00000000000000e+00 785 0.00000000000000e+00 786 0.00000000000000e+00 787 0.00000000000000e+00 788 0.00000000000000e+00 789 0.00000000000000e+00 790 0.00000000000000e+00 791 0.00000000000000e+00 792 0.00000000000000e+00 793 0.00000000000000e+00 794 0.00000000000000e+00 795 0.00000000000000e+00 796 0.00000000000000e+00 797 0.00000000000000e+00 798 0.00000000000000e+00 799 0.00000000000000e+00 800 0.00000000000000e+00 801 0.00000000000000e+00 802 0.00000000000000e+00 803 0.00000000000000e+00 804 0.00000000000000e+00 805 0.00000000000000e+00 806 0.00000000000000e+00 807 0.00000000000000e+00 808 0.00000000000000e+00 809 0.00000000000000e+00 810 0.00000000000000e+00 811 0.00000000000000e+00 812 0.00000000000000e+00 813 0.00000000000000e+00 814 0.00000000000000e+00 815 0.00000000000000e+00 816 0.00000000000000e+00 817 0.00000000000000e+00 818 0.00000000000000e+00 819 0.00000000000000e+00 820 0.00000000000000e+00 821 0.00000000000000e+00 822 0.00000000000000e+00 823 0.00000000000000e+00 824 -3.12500000000000e-04 825 0.00000000000000e+00 826 0.00000000000000e+00 827 -3.12500000000000e-04 828 0.00000000000000e+00 829 0.00000000000000e+00 830 -6.25000000000000e-04 831 0.00000000000000e+00 832 0.00000000000000e+00 833 0.00000000000000e+00 834 0.00000000000000e+00 835 0.00000000000000e+00 836 0.00000000000000e+00 837 0.00000000000000e+00 838 0.00000000000000e+00 839 0.00000000000000e+00 840 0.00000000000000e+00 841 0.00000000000000e+00 842 0.00000000000000e+00 843 0.00000000000000e+00 844 0.00000000000000e+00 845 0.00000000000000e+00 846 0.00000000000000e+00 847 0.00000000000000e+00 848 0.00000000000000e+00 849 0.00000000000000e+00 850 0.00000000000000e+00 851 0.00000000000000e+00 852 0.00000000000000e+00 853 0.00000000000000e+00 854 0.00000000000000e+00 855 0.00000000000000e+00 856 0.00000000000000e+00 857 0.00000000000000e+00 858 0.00000000000000e+00 859 0.00000000000000e+00 860 -3.12500000000000e-04 861 0.00000000000000e+00 862 0.00000000000000e+00 863 0.00000000000000e+00 864 0.00000000000000e+00 865 0.00000000000000e+00 866 -3.12500000000000e-04 867 0.00000000000000e+00 868 0.00000000000000e+00 869 0.00000000000000e+00 870 0.00000000000000e+00 871 0.00000000000000e+00 872 0.00000000000000e+00 873 0.00000000000000e+00 874 0.00000000000000e+00 875 0.00000000000000e+00 876 0.00000000000000e+00 877 0.00000000000000e+00 878 0.00000000000000e+00 879 0.00000000000000e+00 880 0.00000000000000e+00 881 0.00000000000000e+00 882 0.00000000000000e+00 883 0.00000000000000e+00 884 0.00000000000000e+00 885 0.00000000000000e+00 886 0.00000000000000e+00 887 0.00000000000000e+00 888 0.00000000000000e+00 889 0.00000000000000e+00 890 0.00000000000000e+00 891 0.00000000000000e+00 892 0.00000000000000e+00 893 0.00000000000000e+00 894 0.00000000000000e+00 895 0.00000000000000e+00 896 -3.12500000000000e-04 897 0.00000000000000e+00 898 0.00000000000000e+00 899 0.00000000000000e+00 900 0.00000000000000e+00 901 0.00000000000000e+00 902 -3.12500000000000e-04 903 0.00000000000000e+00 904 0.00000000000000e+00 905 0.00000000000000e+00 906 0.00000000000000e+00 907 0.00000000000000e+00 908 0.00000000000000e+00 909 0.00000000000000e+00 910 0.00000000000000e+00 911 0.00000000000000e+00 912 0.00000000000000e+00 913 0.00000000000000e+00 914 0.00000000000000e+00 915 0.00000000000000e+00 916 0.00000000000000e+00 917 0.00000000000000e+00 918 0.00000000000000e+00 919 0.00000000000000e+00 920 0.00000000000000e+00 921 0.00000000000000e+00 922 0.00000000000000e+00 923 0.00000000000000e+00 924 0.00000000000000e+00 925 0.00000000000000e+00 926 0.00000000000000e+00 927 0.00000000000000e+00 928 0.00000000000000e+00 929 0.00000000000000e+00 930 0.00000000000000e+00 931 0.00000000000000e+00 932 0.00000000000000e+00 933 0.00000000000000e+00 934 0.00000000000000e+00 935 -6.25000000000000e-04 936 0.00000000000000e+00 937 0.00000000000000e+00 938 0.00000000000000e+00 939 0.00000000000000e+00 940 0.00000000000000e+00 941 -3.12500000000000e-04 942 0.00000000000000e+00 943 0.00000000000000e+00 944 0.00000000000000e+00 945 0.00000000000000e+00 946 0.00000000000000e+00 947 -3.12500000000000e-04 948 0.00000000000000e+00 949 0.00000000000000e+00 950 0.00000000000000e+00 951 0.00000000000000e+00 952 0.00000000000000e+00 953 0.00000000000000e+00 954 0.00000000000000e+00 955 0.00000000000000e+00 956 0.00000000000000e+00 957 0.00000000000000e+00 958 0.00000000000000e+00 959 0.00000000000000e+00 960 0.00000000000000e+00 961 0.00000000000000e+00 962 0.00000000000000e+00 963 0.00000000000000e+00 964 0.00000000000000e+00 965 0.00000000000000e+00 966 0.00000000000000e+00 967 0.00000000000000e+00 968 0.00000000000000e+00 969 0.00000000000000e+00 970 0.00000000000000e+00 971 0.00000000000000e+00 972 0.00000000000000e+00 973 0.00000000000000e+00 974 0.00000000000000e+00 975 0.00000000000000e+00 976 0.00000000000000e+00 977 0.00000000000000e+00 978 0.00000000000000e+00 979 0.00000000000000e+00 980 0.00000000000000e+00 981 0.00000000000000e+00 982 0.00000000000000e+00 983 0.00000000000000e+00 984 0.00000000000000e+00 985 0.00000000000000e+00 986 0.00000000000000e+00 987 0.00000000000000e+00 988 0.00000000000000e+00 989 0.00000000000000e+00 990 0.00000000000000e+00 991 0.00000000000000e+00 992 0.00000000000000e+00 993 0.00000000000000e+00 994 0.00000000000000e+00 995 0.00000000000000e+00 996 0.00000000000000e+00 997 0.00000000000000e+00 998 0.00000000000000e+00 999 0.00000000000000e+00 1000 0.00000000000000e+00 1001 0.00000000000000e+00 1002 0.00000000000000e+00 1003 0.00000000000000e+00 1004 0.00000000000000e+00 1005 0.00000000000000e+00 1006 0.00000000000000e+00 1007 0.00000000000000e+00 1008 0.00000000000000e+00 1009 0.00000000000000e+00 1010 0.00000000000000e+00 1011 0.00000000000000e+00 1012 0.00000000000000e+00 1013 0.00000000000000e+00 1014 0.00000000000000e+00 1015 0.00000000000000e+00 1016 0.00000000000000e+00 1017 0.00000000000000e+00 1018 0.00000000000000e+00 1019 0.00000000000000e+00 1020 0.00000000000000e+00 1021 0.00000000000000e+00 1022 0.00000000000000e+00 1023 0.00000000000000e+00 1024 0.00000000000000e+00 1025 0.00000000000000e+00 1026 0.00000000000000e+00 1027 0.00000000000000e+00 1028 0.00000000000000e+00 1029 0.00000000000000e+00 1030 0.00000000000000e+00 1031 0.00000000000000e+00 1032 0.00000000000000e+00 1033 0.00000000000000e+00 1034 0.00000000000000e+00 1035 0.00000000000000e+00 1036 0.00000000000000e+00 1037 0.00000000000000e+00 1038 0.00000000000000e+00 1039 0.00000000000000e+00 1040 0.00000000000000e+00 1041 0.00000000000000e+00 1042 0.00000000000000e+00 1043 0.00000000000000e+00 1044 0.00000000000000e+00 1045 0.00000000000000e+00 1046 0.00000000000000e+00 1047 0.00000000000000e+00 1048 0.00000000000000e+00 1049 0.00000000000000e+00 1050 0.00000000000000e+00 1051 0.00000000000000e+00 1052 0.00000000000000e+00 1053 0.00000000000000e+00 1054 0.00000000000000e+00 1055 0.00000000000000e+00 1056 0.00000000000000e+00 1057 0.00000000000000e+00 1058 0.00000000000000e+00 1059 0.00000000000000e+00 1060 0.00000000000000e+00 1061 0.00000000000000e+00 1062 0.00000000000000e+00 1063 0.00000000000000e+00 1064 0.00000000000000e+00 1065 0.00000000000000e+00 1066 0.00000000000000e+00 1067 0.00000000000000e+00 1068 0.00000000000000e+00 1069 0.00000000000000e+00 1070 0.00000000000000e+00 1071 0.00000000000000e+00 1072 0.00000000000000e+00 1073 0.00000000000000e+00 1074 0.00000000000000e+00 1075 0.00000000000000e+00 1076 0.00000000000000e+00 1077 0.00000000000000e+00 1078 0.00000000000000e+00 1079 0.00000000000000e+00 1080 0.00000000000000e+00 1081 0.00000000000000e+00 1082 0.00000000000000e+00 1083 0.00000000000000e+00 1084 0.00000000000000e+00 1085 0.00000000000000e+00 1086 0.00000000000000e+00 1087 0.00000000000000e+00 1088 0.00000000000000e+00 1089 0.00000000000000e+00 1090 0.00000000000000e+00 1091 0.00000000000000e+00 1092 0.00000000000000e+00 1093 0.00000000000000e+00 1094 0.00000000000000e+00 1095 0.00000000000000e+00 1096 0.00000000000000e+00 1097 0.00000000000000e+00 1098 0.00000000000000e+00 1099 0.00000000000000e+00 1100 0.00000000000000e+00 1101 0.00000000000000e+00 1102 0.00000000000000e+00 1103 0.00000000000000e+00 1104 0.00000000000000e+00 1105 0.00000000000000e+00 1106 0.00000000000000e+00 1107 0.00000000000000e+00 1108 0.00000000000000e+00 1109 0.00000000000000e+00 1110 0.00000000000000e+00 1111 0.00000000000000e+00 1112 0.00000000000000e+00 1113 0.00000000000000e+00 1114 0.00000000000000e+00 1115 0.00000000000000e+00 1116 0.00000000000000e+00 1117 0.00000000000000e+00 1118 0.00000000000000e+00 1119 0.00000000000000e+00 1120 0.00000000000000e+00 1121 0.00000000000000e+00 1122 0.00000000000000e+00 1123 0.00000000000000e+00 1124 0.00000000000000e+00 1125 0.00000000000000e+00 1126 0.00000000000000e+00 1127 0.00000000000000e+00 1128 0.00000000000000e+00 1129 0.00000000000000e+00 1130 0.00000000000000e+00 1131 0.00000000000000e+00 1132 0.00000000000000e+00 1133 0.00000000000000e+00 1134 0.00000000000000e+00 1135 0.00000000000000e+00 1136 0.00000000000000e+00 1137 0.00000000000000e+00 1138 0.00000000000000e+00 1139 0.00000000000000e+00 1140 0.00000000000000e+00 1141 0.00000000000000e+00 1142 0.00000000000000e+00 1143 0.00000000000000e+00 1144 0.00000000000000e+00 1145 0.00000000000000e+00 1146 0.00000000000000e+00 1147 0.00000000000000e+00 1148 0.00000000000000e+00 1149 0.00000000000000e+00 1150 0.00000000000000e+00 1151 0.00000000000000e+00 1152 0.00000000000000e+00 1153 0.00000000000000e+00 1154 0.00000000000000e+00 1155 0.00000000000000e+00 1156 0.00000000000000e+00 1157 0.00000000000000e+00 1158 0.00000000000000e+00 1159 0.00000000000000e+00 1160 0.00000000000000e+00 1161 0.00000000000000e+00 1162 0.00000000000000e+00 1163 0.00000000000000e+00 1164 0.00000000000000e+00 1165 0.00000000000000e+00 1166 0.00000000000000e+00 1167 0.00000000000000e+00 1168 0.00000000000000e+00 1169 0.00000000000000e+00 1170 0.00000000000000e+00 1171 0.00000000000000e+00 1172 0.00000000000000e+00 1173 0.00000000000000e+00 1174 0.00000000000000e+00 1175 0.00000000000000e+00 1176 0.00000000000000e+00 1177 0.00000000000000e+00 1178 0.00000000000000e+00 1179 0.00000000000000e+00 1180 0.00000000000000e+00 1181 0.00000000000000e+00 1182 0.00000000000000e+00 1183 0.00000000000000e+00 1184 0.00000000000000e+00 1185 0.00000000000000e+00 1186 0.00000000000000e+00 1187 -6.25000000000000e-04 1188 0.00000000000000e+00 1189 0.00000000000000e+00 1190 -6.25000000000000e-04 1191 0.00000000000000e+00 1192 0.00000000000000e+00 1193 -6.25000000000000e-04 1194 0.00000000000000e+00 1195 0.00000000000000e+00 1196 -6.25000000000000e-04 1197 0.00000000000000e+00 1198 0.00000000000000e+00 1199 -6.25000000000000e-04 1200 0.00000000000000e+00 1201 0.00000000000000e+00 1202 -6.25000000000000e-04 1203 0.00000000000000e+00 1204 0.00000000000000e+00 1205 0.00000000000000e+00 1206 0.00000000000000e+00 1207 0.00000000000000e+00 1208 0.00000000000000e+00 1209 0.00000000000000e+00 1210 0.00000000000000e+00 1211 0.00000000000000e+00 1212 0.00000000000000e+00 1213 0.00000000000000e+00 1214 0.00000000000000e+00 1215 0.00000000000000e+00 1216 0.00000000000000e+00 1217 0.00000000000000e+00 1218 0.00000000000000e+00 1219 0.00000000000000e+00 1220 0.00000000000000e+00 1221 0.00000000000000e+00 1222 0.00000000000000e+00 1223 0.00000000000000e+00 1224 0.00000000000000e+00 1225 0.00000000000000e+00 1226 0.00000000000000e+00 1227 0.00000000000000e+00 1228 0.00000000000000e+00 1229 0.00000000000000e+00 1230 0.00000000000000e+00 1231 0.00000000000000e+00 1232 0.00000000000000e+00 1233 0.00000000000000e+00 1234 0.00000000000000e+00 1235 0.00000000000000e+00 1236 0.00000000000000e+00 1237 0.00000000000000e+00 1238 0.00000000000000e+00 1239 0.00000000000000e+00 1240 0.00000000000000e+00 1241 0.00000000000000e+00 1242 0.00000000000000e+00 1243 0.00000000000000e+00 1244 0.00000000000000e+00 1245 0.00000000000000e+00 1246 0.00000000000000e+00 1247 0.00000000000000e+00 1248 0.00000000000000e+00 1249 0.00000000000000e+00 1250 0.00000000000000e+00 1251 0.00000000000000e+00 1252 0.00000000000000e+00 1253 0.00000000000000e+00 1254 0.00000000000000e+00 1255 0.00000000000000e+00 1256 0.00000000000000e+00 1257 0.00000000000000e+00 1258 0.00000000000000e+00 1259 0.00000000000000e+00 1260 0.00000000000000e+00 1261 0.00000000000000e+00 1262 0.00000000000000e+00 1263 0.00000000000000e+00 1264 0.00000000000000e+00 1265 0.00000000000000e+00 1266 0.00000000000000e+00 1267 0.00000000000000e+00 1268 0.00000000000000e+00 1269 0.00000000000000e+00 1270 0.00000000000000e+00 1271 0.00000000000000e+00 1272 0.00000000000000e+00 1273 0.00000000000000e+00 1274 0.00000000000000e+00 hypre-2.33.0/src/test/TEST_ij/data/beam_tet_dof2475_np4/b.IJ.00002000066400000000000000000000363721477326011500235070ustar00rootroot000000000000001275 1874 1275 0.00000000000000e+00 1276 0.00000000000000e+00 1277 0.00000000000000e+00 1278 0.00000000000000e+00 1279 0.00000000000000e+00 1280 0.00000000000000e+00 1281 0.00000000000000e+00 1282 0.00000000000000e+00 1283 0.00000000000000e+00 1284 0.00000000000000e+00 1285 0.00000000000000e+00 1286 0.00000000000000e+00 1287 0.00000000000000e+00 1288 0.00000000000000e+00 1289 0.00000000000000e+00 1290 0.00000000000000e+00 1291 0.00000000000000e+00 1292 0.00000000000000e+00 1293 0.00000000000000e+00 1294 0.00000000000000e+00 1295 0.00000000000000e+00 1296 0.00000000000000e+00 1297 0.00000000000000e+00 1298 0.00000000000000e+00 1299 0.00000000000000e+00 1300 0.00000000000000e+00 1301 0.00000000000000e+00 1302 0.00000000000000e+00 1303 0.00000000000000e+00 1304 0.00000000000000e+00 1305 0.00000000000000e+00 1306 0.00000000000000e+00 1307 0.00000000000000e+00 1308 0.00000000000000e+00 1309 0.00000000000000e+00 1310 0.00000000000000e+00 1311 0.00000000000000e+00 1312 0.00000000000000e+00 1313 0.00000000000000e+00 1314 0.00000000000000e+00 1315 0.00000000000000e+00 1316 0.00000000000000e+00 1317 0.00000000000000e+00 1318 0.00000000000000e+00 1319 0.00000000000000e+00 1320 0.00000000000000e+00 1321 0.00000000000000e+00 1322 0.00000000000000e+00 1323 0.00000000000000e+00 1324 0.00000000000000e+00 1325 0.00000000000000e+00 1326 0.00000000000000e+00 1327 0.00000000000000e+00 1328 0.00000000000000e+00 1329 0.00000000000000e+00 1330 0.00000000000000e+00 1331 0.00000000000000e+00 1332 0.00000000000000e+00 1333 0.00000000000000e+00 1334 0.00000000000000e+00 1335 0.00000000000000e+00 1336 0.00000000000000e+00 1337 0.00000000000000e+00 1338 0.00000000000000e+00 1339 0.00000000000000e+00 1340 0.00000000000000e+00 1341 0.00000000000000e+00 1342 0.00000000000000e+00 1343 0.00000000000000e+00 1344 0.00000000000000e+00 1345 0.00000000000000e+00 1346 0.00000000000000e+00 1347 0.00000000000000e+00 1348 0.00000000000000e+00 1349 0.00000000000000e+00 1350 0.00000000000000e+00 1351 0.00000000000000e+00 1352 0.00000000000000e+00 1353 0.00000000000000e+00 1354 0.00000000000000e+00 1355 0.00000000000000e+00 1356 0.00000000000000e+00 1357 0.00000000000000e+00 1358 0.00000000000000e+00 1359 0.00000000000000e+00 1360 0.00000000000000e+00 1361 0.00000000000000e+00 1362 0.00000000000000e+00 1363 0.00000000000000e+00 1364 0.00000000000000e+00 1365 0.00000000000000e+00 1366 0.00000000000000e+00 1367 0.00000000000000e+00 1368 0.00000000000000e+00 1369 0.00000000000000e+00 1370 0.00000000000000e+00 1371 0.00000000000000e+00 1372 0.00000000000000e+00 1373 0.00000000000000e+00 1374 0.00000000000000e+00 1375 0.00000000000000e+00 1376 0.00000000000000e+00 1377 0.00000000000000e+00 1378 0.00000000000000e+00 1379 0.00000000000000e+00 1380 0.00000000000000e+00 1381 0.00000000000000e+00 1382 0.00000000000000e+00 1383 0.00000000000000e+00 1384 0.00000000000000e+00 1385 0.00000000000000e+00 1386 0.00000000000000e+00 1387 0.00000000000000e+00 1388 0.00000000000000e+00 1389 0.00000000000000e+00 1390 0.00000000000000e+00 1391 0.00000000000000e+00 1392 0.00000000000000e+00 1393 0.00000000000000e+00 1394 0.00000000000000e+00 1395 0.00000000000000e+00 1396 0.00000000000000e+00 1397 0.00000000000000e+00 1398 0.00000000000000e+00 1399 0.00000000000000e+00 1400 0.00000000000000e+00 1401 0.00000000000000e+00 1402 0.00000000000000e+00 1403 0.00000000000000e+00 1404 0.00000000000000e+00 1405 0.00000000000000e+00 1406 0.00000000000000e+00 1407 0.00000000000000e+00 1408 0.00000000000000e+00 1409 0.00000000000000e+00 1410 0.00000000000000e+00 1411 0.00000000000000e+00 1412 0.00000000000000e+00 1413 0.00000000000000e+00 1414 0.00000000000000e+00 1415 0.00000000000000e+00 1416 0.00000000000000e+00 1417 0.00000000000000e+00 1418 0.00000000000000e+00 1419 0.00000000000000e+00 1420 0.00000000000000e+00 1421 0.00000000000000e+00 1422 0.00000000000000e+00 1423 0.00000000000000e+00 1424 0.00000000000000e+00 1425 0.00000000000000e+00 1426 0.00000000000000e+00 1427 0.00000000000000e+00 1428 0.00000000000000e+00 1429 0.00000000000000e+00 1430 0.00000000000000e+00 1431 0.00000000000000e+00 1432 0.00000000000000e+00 1433 0.00000000000000e+00 1434 0.00000000000000e+00 1435 0.00000000000000e+00 1436 0.00000000000000e+00 1437 0.00000000000000e+00 1438 0.00000000000000e+00 1439 0.00000000000000e+00 1440 0.00000000000000e+00 1441 0.00000000000000e+00 1442 0.00000000000000e+00 1443 0.00000000000000e+00 1444 0.00000000000000e+00 1445 0.00000000000000e+00 1446 0.00000000000000e+00 1447 0.00000000000000e+00 1448 0.00000000000000e+00 1449 0.00000000000000e+00 1450 0.00000000000000e+00 1451 0.00000000000000e+00 1452 0.00000000000000e+00 1453 0.00000000000000e+00 1454 0.00000000000000e+00 1455 0.00000000000000e+00 1456 0.00000000000000e+00 1457 0.00000000000000e+00 1458 0.00000000000000e+00 1459 0.00000000000000e+00 1460 0.00000000000000e+00 1461 0.00000000000000e+00 1462 0.00000000000000e+00 1463 0.00000000000000e+00 1464 0.00000000000000e+00 1465 0.00000000000000e+00 1466 0.00000000000000e+00 1467 0.00000000000000e+00 1468 0.00000000000000e+00 1469 0.00000000000000e+00 1470 0.00000000000000e+00 1471 0.00000000000000e+00 1472 0.00000000000000e+00 1473 0.00000000000000e+00 1474 0.00000000000000e+00 1475 0.00000000000000e+00 1476 0.00000000000000e+00 1477 0.00000000000000e+00 1478 0.00000000000000e+00 1479 0.00000000000000e+00 1480 0.00000000000000e+00 1481 0.00000000000000e+00 1482 0.00000000000000e+00 1483 0.00000000000000e+00 1484 0.00000000000000e+00 1485 0.00000000000000e+00 1486 0.00000000000000e+00 1487 0.00000000000000e+00 1488 0.00000000000000e+00 1489 0.00000000000000e+00 1490 0.00000000000000e+00 1491 0.00000000000000e+00 1492 0.00000000000000e+00 1493 0.00000000000000e+00 1494 0.00000000000000e+00 1495 0.00000000000000e+00 1496 0.00000000000000e+00 1497 0.00000000000000e+00 1498 0.00000000000000e+00 1499 0.00000000000000e+00 1500 0.00000000000000e+00 1501 0.00000000000000e+00 1502 0.00000000000000e+00 1503 0.00000000000000e+00 1504 0.00000000000000e+00 1505 0.00000000000000e+00 1506 0.00000000000000e+00 1507 0.00000000000000e+00 1508 0.00000000000000e+00 1509 0.00000000000000e+00 1510 0.00000000000000e+00 1511 0.00000000000000e+00 1512 0.00000000000000e+00 1513 0.00000000000000e+00 1514 0.00000000000000e+00 1515 0.00000000000000e+00 1516 0.00000000000000e+00 1517 0.00000000000000e+00 1518 0.00000000000000e+00 1519 0.00000000000000e+00 1520 0.00000000000000e+00 1521 0.00000000000000e+00 1522 0.00000000000000e+00 1523 0.00000000000000e+00 1524 0.00000000000000e+00 1525 0.00000000000000e+00 1526 0.00000000000000e+00 1527 0.00000000000000e+00 1528 0.00000000000000e+00 1529 0.00000000000000e+00 1530 0.00000000000000e+00 1531 0.00000000000000e+00 1532 0.00000000000000e+00 1533 0.00000000000000e+00 1534 0.00000000000000e+00 1535 0.00000000000000e+00 1536 0.00000000000000e+00 1537 0.00000000000000e+00 1538 0.00000000000000e+00 1539 0.00000000000000e+00 1540 0.00000000000000e+00 1541 0.00000000000000e+00 1542 0.00000000000000e+00 1543 0.00000000000000e+00 1544 0.00000000000000e+00 1545 0.00000000000000e+00 1546 0.00000000000000e+00 1547 0.00000000000000e+00 1548 0.00000000000000e+00 1549 0.00000000000000e+00 1550 0.00000000000000e+00 1551 0.00000000000000e+00 1552 0.00000000000000e+00 1553 0.00000000000000e+00 1554 0.00000000000000e+00 1555 0.00000000000000e+00 1556 0.00000000000000e+00 1557 0.00000000000000e+00 1558 0.00000000000000e+00 1559 0.00000000000000e+00 1560 0.00000000000000e+00 1561 0.00000000000000e+00 1562 0.00000000000000e+00 1563 0.00000000000000e+00 1564 0.00000000000000e+00 1565 0.00000000000000e+00 1566 0.00000000000000e+00 1567 0.00000000000000e+00 1568 0.00000000000000e+00 1569 0.00000000000000e+00 1570 0.00000000000000e+00 1571 0.00000000000000e+00 1572 0.00000000000000e+00 1573 0.00000000000000e+00 1574 0.00000000000000e+00 1575 0.00000000000000e+00 1576 0.00000000000000e+00 1577 0.00000000000000e+00 1578 0.00000000000000e+00 1579 0.00000000000000e+00 1580 0.00000000000000e+00 1581 0.00000000000000e+00 1582 0.00000000000000e+00 1583 0.00000000000000e+00 1584 0.00000000000000e+00 1585 0.00000000000000e+00 1586 0.00000000000000e+00 1587 0.00000000000000e+00 1588 0.00000000000000e+00 1589 0.00000000000000e+00 1590 0.00000000000000e+00 1591 0.00000000000000e+00 1592 0.00000000000000e+00 1593 0.00000000000000e+00 1594 0.00000000000000e+00 1595 0.00000000000000e+00 1596 0.00000000000000e+00 1597 0.00000000000000e+00 1598 0.00000000000000e+00 1599 0.00000000000000e+00 1600 0.00000000000000e+00 1601 0.00000000000000e+00 1602 0.00000000000000e+00 1603 0.00000000000000e+00 1604 0.00000000000000e+00 1605 0.00000000000000e+00 1606 0.00000000000000e+00 1607 0.00000000000000e+00 1608 0.00000000000000e+00 1609 0.00000000000000e+00 1610 0.00000000000000e+00 1611 0.00000000000000e+00 1612 0.00000000000000e+00 1613 0.00000000000000e+00 1614 0.00000000000000e+00 1615 0.00000000000000e+00 1616 0.00000000000000e+00 1617 0.00000000000000e+00 1618 0.00000000000000e+00 1619 0.00000000000000e+00 1620 0.00000000000000e+00 1621 0.00000000000000e+00 1622 0.00000000000000e+00 1623 0.00000000000000e+00 1624 0.00000000000000e+00 1625 0.00000000000000e+00 1626 0.00000000000000e+00 1627 0.00000000000000e+00 1628 0.00000000000000e+00 1629 0.00000000000000e+00 1630 0.00000000000000e+00 1631 0.00000000000000e+00 1632 0.00000000000000e+00 1633 0.00000000000000e+00 1634 0.00000000000000e+00 1635 0.00000000000000e+00 1636 0.00000000000000e+00 1637 0.00000000000000e+00 1638 0.00000000000000e+00 1639 0.00000000000000e+00 1640 0.00000000000000e+00 1641 0.00000000000000e+00 1642 0.00000000000000e+00 1643 0.00000000000000e+00 1644 0.00000000000000e+00 1645 0.00000000000000e+00 1646 0.00000000000000e+00 1647 0.00000000000000e+00 1648 0.00000000000000e+00 1649 0.00000000000000e+00 1650 0.00000000000000e+00 1651 0.00000000000000e+00 1652 0.00000000000000e+00 1653 0.00000000000000e+00 1654 0.00000000000000e+00 1655 0.00000000000000e+00 1656 0.00000000000000e+00 1657 0.00000000000000e+00 1658 0.00000000000000e+00 1659 0.00000000000000e+00 1660 0.00000000000000e+00 1661 0.00000000000000e+00 1662 0.00000000000000e+00 1663 0.00000000000000e+00 1664 0.00000000000000e+00 1665 0.00000000000000e+00 1666 0.00000000000000e+00 1667 0.00000000000000e+00 1668 0.00000000000000e+00 1669 0.00000000000000e+00 1670 0.00000000000000e+00 1671 0.00000000000000e+00 1672 0.00000000000000e+00 1673 0.00000000000000e+00 1674 0.00000000000000e+00 1675 0.00000000000000e+00 1676 0.00000000000000e+00 1677 0.00000000000000e+00 1678 0.00000000000000e+00 1679 0.00000000000000e+00 1680 0.00000000000000e+00 1681 0.00000000000000e+00 1682 0.00000000000000e+00 1683 0.00000000000000e+00 1684 0.00000000000000e+00 1685 0.00000000000000e+00 1686 0.00000000000000e+00 1687 0.00000000000000e+00 1688 0.00000000000000e+00 1689 0.00000000000000e+00 1690 0.00000000000000e+00 1691 0.00000000000000e+00 1692 0.00000000000000e+00 1693 0.00000000000000e+00 1694 0.00000000000000e+00 1695 0.00000000000000e+00 1696 0.00000000000000e+00 1697 0.00000000000000e+00 1698 0.00000000000000e+00 1699 0.00000000000000e+00 1700 0.00000000000000e+00 1701 0.00000000000000e+00 1702 0.00000000000000e+00 1703 0.00000000000000e+00 1704 0.00000000000000e+00 1705 0.00000000000000e+00 1706 0.00000000000000e+00 1707 0.00000000000000e+00 1708 0.00000000000000e+00 1709 0.00000000000000e+00 1710 0.00000000000000e+00 1711 0.00000000000000e+00 1712 0.00000000000000e+00 1713 0.00000000000000e+00 1714 0.00000000000000e+00 1715 0.00000000000000e+00 1716 0.00000000000000e+00 1717 0.00000000000000e+00 1718 0.00000000000000e+00 1719 0.00000000000000e+00 1720 0.00000000000000e+00 1721 0.00000000000000e+00 1722 0.00000000000000e+00 1723 0.00000000000000e+00 1724 0.00000000000000e+00 1725 0.00000000000000e+00 1726 0.00000000000000e+00 1727 0.00000000000000e+00 1728 0.00000000000000e+00 1729 0.00000000000000e+00 1730 0.00000000000000e+00 1731 0.00000000000000e+00 1732 0.00000000000000e+00 1733 0.00000000000000e+00 1734 0.00000000000000e+00 1735 0.00000000000000e+00 1736 0.00000000000000e+00 1737 0.00000000000000e+00 1738 0.00000000000000e+00 1739 0.00000000000000e+00 1740 0.00000000000000e+00 1741 0.00000000000000e+00 1742 0.00000000000000e+00 1743 0.00000000000000e+00 1744 0.00000000000000e+00 1745 0.00000000000000e+00 1746 0.00000000000000e+00 1747 0.00000000000000e+00 1748 0.00000000000000e+00 1749 0.00000000000000e+00 1750 0.00000000000000e+00 1751 0.00000000000000e+00 1752 0.00000000000000e+00 1753 0.00000000000000e+00 1754 0.00000000000000e+00 1755 0.00000000000000e+00 1756 0.00000000000000e+00 1757 0.00000000000000e+00 1758 0.00000000000000e+00 1759 0.00000000000000e+00 1760 0.00000000000000e+00 1761 0.00000000000000e+00 1762 0.00000000000000e+00 1763 0.00000000000000e+00 1764 0.00000000000000e+00 1765 0.00000000000000e+00 1766 0.00000000000000e+00 1767 0.00000000000000e+00 1768 0.00000000000000e+00 1769 0.00000000000000e+00 1770 0.00000000000000e+00 1771 0.00000000000000e+00 1772 0.00000000000000e+00 1773 0.00000000000000e+00 1774 0.00000000000000e+00 1775 0.00000000000000e+00 1776 0.00000000000000e+00 1777 0.00000000000000e+00 1778 0.00000000000000e+00 1779 0.00000000000000e+00 1780 0.00000000000000e+00 1781 0.00000000000000e+00 1782 0.00000000000000e+00 1783 0.00000000000000e+00 1784 0.00000000000000e+00 1785 0.00000000000000e+00 1786 0.00000000000000e+00 1787 0.00000000000000e+00 1788 0.00000000000000e+00 1789 0.00000000000000e+00 1790 0.00000000000000e+00 1791 0.00000000000000e+00 1792 0.00000000000000e+00 1793 0.00000000000000e+00 1794 0.00000000000000e+00 1795 0.00000000000000e+00 1796 0.00000000000000e+00 1797 0.00000000000000e+00 1798 0.00000000000000e+00 1799 0.00000000000000e+00 1800 0.00000000000000e+00 1801 0.00000000000000e+00 1802 0.00000000000000e+00 1803 0.00000000000000e+00 1804 0.00000000000000e+00 1805 0.00000000000000e+00 1806 0.00000000000000e+00 1807 0.00000000000000e+00 1808 0.00000000000000e+00 1809 0.00000000000000e+00 1810 0.00000000000000e+00 1811 0.00000000000000e+00 1812 0.00000000000000e+00 1813 0.00000000000000e+00 1814 0.00000000000000e+00 1815 0.00000000000000e+00 1816 0.00000000000000e+00 1817 0.00000000000000e+00 1818 0.00000000000000e+00 1819 0.00000000000000e+00 1820 0.00000000000000e+00 1821 0.00000000000000e+00 1822 0.00000000000000e+00 1823 0.00000000000000e+00 1824 0.00000000000000e+00 1825 0.00000000000000e+00 1826 0.00000000000000e+00 1827 0.00000000000000e+00 1828 0.00000000000000e+00 1829 0.00000000000000e+00 1830 0.00000000000000e+00 1831 0.00000000000000e+00 1832 0.00000000000000e+00 1833 0.00000000000000e+00 1834 0.00000000000000e+00 1835 0.00000000000000e+00 1836 0.00000000000000e+00 1837 0.00000000000000e+00 1838 0.00000000000000e+00 1839 0.00000000000000e+00 1840 0.00000000000000e+00 1841 0.00000000000000e+00 1842 0.00000000000000e+00 1843 0.00000000000000e+00 1844 0.00000000000000e+00 1845 0.00000000000000e+00 1846 0.00000000000000e+00 1847 0.00000000000000e+00 1848 0.00000000000000e+00 1849 0.00000000000000e+00 1850 0.00000000000000e+00 1851 0.00000000000000e+00 1852 0.00000000000000e+00 1853 0.00000000000000e+00 1854 0.00000000000000e+00 1855 0.00000000000000e+00 1856 0.00000000000000e+00 1857 0.00000000000000e+00 1858 0.00000000000000e+00 1859 0.00000000000000e+00 1860 0.00000000000000e+00 1861 0.00000000000000e+00 1862 0.00000000000000e+00 1863 0.00000000000000e+00 1864 0.00000000000000e+00 1865 0.00000000000000e+00 1866 0.00000000000000e+00 1867 0.00000000000000e+00 1868 0.00000000000000e+00 1869 0.00000000000000e+00 1870 0.00000000000000e+00 1871 0.00000000000000e+00 1872 0.00000000000000e+00 1873 0.00000000000000e+00 1874 0.00000000000000e+00 hypre-2.33.0/src/test/TEST_ij/data/beam_tet_dof2475_np4/b.IJ.00003000066400000000000000000000363721477326011500235100ustar00rootroot000000000000001875 2474 1875 0.00000000000000e+00 1876 0.00000000000000e+00 1877 0.00000000000000e+00 1878 0.00000000000000e+00 1879 0.00000000000000e+00 1880 0.00000000000000e+00 1881 0.00000000000000e+00 1882 0.00000000000000e+00 1883 0.00000000000000e+00 1884 0.00000000000000e+00 1885 0.00000000000000e+00 1886 0.00000000000000e+00 1887 0.00000000000000e+00 1888 0.00000000000000e+00 1889 0.00000000000000e+00 1890 0.00000000000000e+00 1891 0.00000000000000e+00 1892 0.00000000000000e+00 1893 0.00000000000000e+00 1894 0.00000000000000e+00 1895 0.00000000000000e+00 1896 0.00000000000000e+00 1897 0.00000000000000e+00 1898 0.00000000000000e+00 1899 0.00000000000000e+00 1900 0.00000000000000e+00 1901 0.00000000000000e+00 1902 0.00000000000000e+00 1903 0.00000000000000e+00 1904 0.00000000000000e+00 1905 0.00000000000000e+00 1906 0.00000000000000e+00 1907 0.00000000000000e+00 1908 0.00000000000000e+00 1909 0.00000000000000e+00 1910 0.00000000000000e+00 1911 0.00000000000000e+00 1912 0.00000000000000e+00 1913 0.00000000000000e+00 1914 0.00000000000000e+00 1915 0.00000000000000e+00 1916 0.00000000000000e+00 1917 0.00000000000000e+00 1918 0.00000000000000e+00 1919 0.00000000000000e+00 1920 0.00000000000000e+00 1921 0.00000000000000e+00 1922 0.00000000000000e+00 1923 0.00000000000000e+00 1924 0.00000000000000e+00 1925 0.00000000000000e+00 1926 0.00000000000000e+00 1927 0.00000000000000e+00 1928 0.00000000000000e+00 1929 0.00000000000000e+00 1930 0.00000000000000e+00 1931 0.00000000000000e+00 1932 0.00000000000000e+00 1933 0.00000000000000e+00 1934 0.00000000000000e+00 1935 0.00000000000000e+00 1936 0.00000000000000e+00 1937 0.00000000000000e+00 1938 0.00000000000000e+00 1939 0.00000000000000e+00 1940 0.00000000000000e+00 1941 0.00000000000000e+00 1942 0.00000000000000e+00 1943 0.00000000000000e+00 1944 0.00000000000000e+00 1945 0.00000000000000e+00 1946 0.00000000000000e+00 1947 0.00000000000000e+00 1948 0.00000000000000e+00 1949 0.00000000000000e+00 1950 0.00000000000000e+00 1951 0.00000000000000e+00 1952 0.00000000000000e+00 1953 0.00000000000000e+00 1954 0.00000000000000e+00 1955 0.00000000000000e+00 1956 0.00000000000000e+00 1957 0.00000000000000e+00 1958 0.00000000000000e+00 1959 0.00000000000000e+00 1960 0.00000000000000e+00 1961 0.00000000000000e+00 1962 0.00000000000000e+00 1963 0.00000000000000e+00 1964 0.00000000000000e+00 1965 0.00000000000000e+00 1966 0.00000000000000e+00 1967 0.00000000000000e+00 1968 0.00000000000000e+00 1969 0.00000000000000e+00 1970 0.00000000000000e+00 1971 0.00000000000000e+00 1972 0.00000000000000e+00 1973 0.00000000000000e+00 1974 0.00000000000000e+00 1975 0.00000000000000e+00 1976 0.00000000000000e+00 1977 0.00000000000000e+00 1978 0.00000000000000e+00 1979 0.00000000000000e+00 1980 0.00000000000000e+00 1981 0.00000000000000e+00 1982 0.00000000000000e+00 1983 0.00000000000000e+00 1984 0.00000000000000e+00 1985 0.00000000000000e+00 1986 0.00000000000000e+00 1987 0.00000000000000e+00 1988 0.00000000000000e+00 1989 0.00000000000000e+00 1990 0.00000000000000e+00 1991 0.00000000000000e+00 1992 0.00000000000000e+00 1993 0.00000000000000e+00 1994 0.00000000000000e+00 1995 0.00000000000000e+00 1996 0.00000000000000e+00 1997 0.00000000000000e+00 1998 0.00000000000000e+00 1999 0.00000000000000e+00 2000 0.00000000000000e+00 2001 0.00000000000000e+00 2002 0.00000000000000e+00 2003 0.00000000000000e+00 2004 0.00000000000000e+00 2005 0.00000000000000e+00 2006 0.00000000000000e+00 2007 0.00000000000000e+00 2008 0.00000000000000e+00 2009 0.00000000000000e+00 2010 0.00000000000000e+00 2011 0.00000000000000e+00 2012 0.00000000000000e+00 2013 0.00000000000000e+00 2014 0.00000000000000e+00 2015 0.00000000000000e+00 2016 0.00000000000000e+00 2017 0.00000000000000e+00 2018 0.00000000000000e+00 2019 0.00000000000000e+00 2020 0.00000000000000e+00 2021 0.00000000000000e+00 2022 0.00000000000000e+00 2023 0.00000000000000e+00 2024 0.00000000000000e+00 2025 0.00000000000000e+00 2026 0.00000000000000e+00 2027 0.00000000000000e+00 2028 0.00000000000000e+00 2029 0.00000000000000e+00 2030 0.00000000000000e+00 2031 0.00000000000000e+00 2032 0.00000000000000e+00 2033 0.00000000000000e+00 2034 0.00000000000000e+00 2035 0.00000000000000e+00 2036 0.00000000000000e+00 2037 0.00000000000000e+00 2038 0.00000000000000e+00 2039 0.00000000000000e+00 2040 0.00000000000000e+00 2041 0.00000000000000e+00 2042 0.00000000000000e+00 2043 0.00000000000000e+00 2044 0.00000000000000e+00 2045 0.00000000000000e+00 2046 0.00000000000000e+00 2047 0.00000000000000e+00 2048 0.00000000000000e+00 2049 0.00000000000000e+00 2050 0.00000000000000e+00 2051 0.00000000000000e+00 2052 0.00000000000000e+00 2053 0.00000000000000e+00 2054 0.00000000000000e+00 2055 0.00000000000000e+00 2056 0.00000000000000e+00 2057 0.00000000000000e+00 2058 0.00000000000000e+00 2059 0.00000000000000e+00 2060 0.00000000000000e+00 2061 0.00000000000000e+00 2062 0.00000000000000e+00 2063 0.00000000000000e+00 2064 0.00000000000000e+00 2065 0.00000000000000e+00 2066 0.00000000000000e+00 2067 0.00000000000000e+00 2068 0.00000000000000e+00 2069 0.00000000000000e+00 2070 0.00000000000000e+00 2071 0.00000000000000e+00 2072 0.00000000000000e+00 2073 0.00000000000000e+00 2074 0.00000000000000e+00 2075 0.00000000000000e+00 2076 0.00000000000000e+00 2077 0.00000000000000e+00 2078 0.00000000000000e+00 2079 0.00000000000000e+00 2080 0.00000000000000e+00 2081 0.00000000000000e+00 2082 0.00000000000000e+00 2083 0.00000000000000e+00 2084 0.00000000000000e+00 2085 0.00000000000000e+00 2086 0.00000000000000e+00 2087 0.00000000000000e+00 2088 0.00000000000000e+00 2089 0.00000000000000e+00 2090 0.00000000000000e+00 2091 0.00000000000000e+00 2092 0.00000000000000e+00 2093 0.00000000000000e+00 2094 0.00000000000000e+00 2095 0.00000000000000e+00 2096 0.00000000000000e+00 2097 0.00000000000000e+00 2098 0.00000000000000e+00 2099 0.00000000000000e+00 2100 0.00000000000000e+00 2101 0.00000000000000e+00 2102 0.00000000000000e+00 2103 0.00000000000000e+00 2104 0.00000000000000e+00 2105 0.00000000000000e+00 2106 0.00000000000000e+00 2107 0.00000000000000e+00 2108 0.00000000000000e+00 2109 0.00000000000000e+00 2110 0.00000000000000e+00 2111 0.00000000000000e+00 2112 0.00000000000000e+00 2113 0.00000000000000e+00 2114 0.00000000000000e+00 2115 0.00000000000000e+00 2116 0.00000000000000e+00 2117 0.00000000000000e+00 2118 0.00000000000000e+00 2119 0.00000000000000e+00 2120 0.00000000000000e+00 2121 0.00000000000000e+00 2122 0.00000000000000e+00 2123 0.00000000000000e+00 2124 0.00000000000000e+00 2125 0.00000000000000e+00 2126 0.00000000000000e+00 2127 0.00000000000000e+00 2128 0.00000000000000e+00 2129 0.00000000000000e+00 2130 0.00000000000000e+00 2131 0.00000000000000e+00 2132 0.00000000000000e+00 2133 0.00000000000000e+00 2134 0.00000000000000e+00 2135 0.00000000000000e+00 2136 0.00000000000000e+00 2137 0.00000000000000e+00 2138 0.00000000000000e+00 2139 0.00000000000000e+00 2140 0.00000000000000e+00 2141 0.00000000000000e+00 2142 0.00000000000000e+00 2143 0.00000000000000e+00 2144 0.00000000000000e+00 2145 0.00000000000000e+00 2146 0.00000000000000e+00 2147 0.00000000000000e+00 2148 0.00000000000000e+00 2149 0.00000000000000e+00 2150 0.00000000000000e+00 2151 0.00000000000000e+00 2152 0.00000000000000e+00 2153 0.00000000000000e+00 2154 0.00000000000000e+00 2155 0.00000000000000e+00 2156 0.00000000000000e+00 2157 0.00000000000000e+00 2158 0.00000000000000e+00 2159 0.00000000000000e+00 2160 0.00000000000000e+00 2161 0.00000000000000e+00 2162 0.00000000000000e+00 2163 0.00000000000000e+00 2164 0.00000000000000e+00 2165 0.00000000000000e+00 2166 0.00000000000000e+00 2167 0.00000000000000e+00 2168 0.00000000000000e+00 2169 0.00000000000000e+00 2170 0.00000000000000e+00 2171 0.00000000000000e+00 2172 0.00000000000000e+00 2173 0.00000000000000e+00 2174 0.00000000000000e+00 2175 0.00000000000000e+00 2176 0.00000000000000e+00 2177 0.00000000000000e+00 2178 0.00000000000000e+00 2179 0.00000000000000e+00 2180 0.00000000000000e+00 2181 0.00000000000000e+00 2182 0.00000000000000e+00 2183 0.00000000000000e+00 2184 0.00000000000000e+00 2185 0.00000000000000e+00 2186 0.00000000000000e+00 2187 0.00000000000000e+00 2188 0.00000000000000e+00 2189 0.00000000000000e+00 2190 0.00000000000000e+00 2191 0.00000000000000e+00 2192 0.00000000000000e+00 2193 0.00000000000000e+00 2194 0.00000000000000e+00 2195 0.00000000000000e+00 2196 0.00000000000000e+00 2197 0.00000000000000e+00 2198 0.00000000000000e+00 2199 0.00000000000000e+00 2200 0.00000000000000e+00 2201 0.00000000000000e+00 2202 0.00000000000000e+00 2203 0.00000000000000e+00 2204 0.00000000000000e+00 2205 0.00000000000000e+00 2206 0.00000000000000e+00 2207 0.00000000000000e+00 2208 0.00000000000000e+00 2209 0.00000000000000e+00 2210 0.00000000000000e+00 2211 0.00000000000000e+00 2212 0.00000000000000e+00 2213 0.00000000000000e+00 2214 0.00000000000000e+00 2215 0.00000000000000e+00 2216 0.00000000000000e+00 2217 0.00000000000000e+00 2218 0.00000000000000e+00 2219 0.00000000000000e+00 2220 0.00000000000000e+00 2221 0.00000000000000e+00 2222 0.00000000000000e+00 2223 0.00000000000000e+00 2224 0.00000000000000e+00 2225 0.00000000000000e+00 2226 0.00000000000000e+00 2227 0.00000000000000e+00 2228 0.00000000000000e+00 2229 0.00000000000000e+00 2230 0.00000000000000e+00 2231 0.00000000000000e+00 2232 0.00000000000000e+00 2233 0.00000000000000e+00 2234 0.00000000000000e+00 2235 0.00000000000000e+00 2236 0.00000000000000e+00 2237 0.00000000000000e+00 2238 0.00000000000000e+00 2239 0.00000000000000e+00 2240 0.00000000000000e+00 2241 0.00000000000000e+00 2242 0.00000000000000e+00 2243 0.00000000000000e+00 2244 0.00000000000000e+00 2245 0.00000000000000e+00 2246 0.00000000000000e+00 2247 0.00000000000000e+00 2248 0.00000000000000e+00 2249 0.00000000000000e+00 2250 0.00000000000000e+00 2251 0.00000000000000e+00 2252 0.00000000000000e+00 2253 0.00000000000000e+00 2254 0.00000000000000e+00 2255 0.00000000000000e+00 2256 0.00000000000000e+00 2257 0.00000000000000e+00 2258 0.00000000000000e+00 2259 0.00000000000000e+00 2260 0.00000000000000e+00 2261 0.00000000000000e+00 2262 0.00000000000000e+00 2263 0.00000000000000e+00 2264 0.00000000000000e+00 2265 0.00000000000000e+00 2266 0.00000000000000e+00 2267 0.00000000000000e+00 2268 0.00000000000000e+00 2269 0.00000000000000e+00 2270 0.00000000000000e+00 2271 0.00000000000000e+00 2272 0.00000000000000e+00 2273 0.00000000000000e+00 2274 0.00000000000000e+00 2275 0.00000000000000e+00 2276 0.00000000000000e+00 2277 0.00000000000000e+00 2278 0.00000000000000e+00 2279 0.00000000000000e+00 2280 0.00000000000000e+00 2281 0.00000000000000e+00 2282 0.00000000000000e+00 2283 0.00000000000000e+00 2284 0.00000000000000e+00 2285 0.00000000000000e+00 2286 0.00000000000000e+00 2287 0.00000000000000e+00 2288 0.00000000000000e+00 2289 0.00000000000000e+00 2290 0.00000000000000e+00 2291 0.00000000000000e+00 2292 0.00000000000000e+00 2293 0.00000000000000e+00 2294 0.00000000000000e+00 2295 0.00000000000000e+00 2296 0.00000000000000e+00 2297 0.00000000000000e+00 2298 0.00000000000000e+00 2299 0.00000000000000e+00 2300 0.00000000000000e+00 2301 0.00000000000000e+00 2302 0.00000000000000e+00 2303 0.00000000000000e+00 2304 0.00000000000000e+00 2305 0.00000000000000e+00 2306 0.00000000000000e+00 2307 0.00000000000000e+00 2308 0.00000000000000e+00 2309 0.00000000000000e+00 2310 0.00000000000000e+00 2311 0.00000000000000e+00 2312 0.00000000000000e+00 2313 0.00000000000000e+00 2314 0.00000000000000e+00 2315 0.00000000000000e+00 2316 0.00000000000000e+00 2317 0.00000000000000e+00 2318 0.00000000000000e+00 2319 0.00000000000000e+00 2320 0.00000000000000e+00 2321 0.00000000000000e+00 2322 0.00000000000000e+00 2323 0.00000000000000e+00 2324 0.00000000000000e+00 2325 0.00000000000000e+00 2326 0.00000000000000e+00 2327 0.00000000000000e+00 2328 0.00000000000000e+00 2329 0.00000000000000e+00 2330 0.00000000000000e+00 2331 0.00000000000000e+00 2332 0.00000000000000e+00 2333 0.00000000000000e+00 2334 0.00000000000000e+00 2335 0.00000000000000e+00 2336 0.00000000000000e+00 2337 0.00000000000000e+00 2338 0.00000000000000e+00 2339 0.00000000000000e+00 2340 0.00000000000000e+00 2341 0.00000000000000e+00 2342 0.00000000000000e+00 2343 0.00000000000000e+00 2344 0.00000000000000e+00 2345 0.00000000000000e+00 2346 0.00000000000000e+00 2347 0.00000000000000e+00 2348 0.00000000000000e+00 2349 0.00000000000000e+00 2350 0.00000000000000e+00 2351 0.00000000000000e+00 2352 0.00000000000000e+00 2353 0.00000000000000e+00 2354 0.00000000000000e+00 2355 0.00000000000000e+00 2356 0.00000000000000e+00 2357 0.00000000000000e+00 2358 0.00000000000000e+00 2359 0.00000000000000e+00 2360 0.00000000000000e+00 2361 0.00000000000000e+00 2362 0.00000000000000e+00 2363 0.00000000000000e+00 2364 0.00000000000000e+00 2365 0.00000000000000e+00 2366 0.00000000000000e+00 2367 0.00000000000000e+00 2368 0.00000000000000e+00 2369 0.00000000000000e+00 2370 0.00000000000000e+00 2371 0.00000000000000e+00 2372 0.00000000000000e+00 2373 0.00000000000000e+00 2374 0.00000000000000e+00 2375 0.00000000000000e+00 2376 0.00000000000000e+00 2377 0.00000000000000e+00 2378 0.00000000000000e+00 2379 0.00000000000000e+00 2380 0.00000000000000e+00 2381 0.00000000000000e+00 2382 0.00000000000000e+00 2383 0.00000000000000e+00 2384 0.00000000000000e+00 2385 0.00000000000000e+00 2386 0.00000000000000e+00 2387 0.00000000000000e+00 2388 0.00000000000000e+00 2389 0.00000000000000e+00 2390 0.00000000000000e+00 2391 0.00000000000000e+00 2392 0.00000000000000e+00 2393 0.00000000000000e+00 2394 0.00000000000000e+00 2395 0.00000000000000e+00 2396 0.00000000000000e+00 2397 0.00000000000000e+00 2398 0.00000000000000e+00 2399 0.00000000000000e+00 2400 0.00000000000000e+00 2401 0.00000000000000e+00 2402 0.00000000000000e+00 2403 0.00000000000000e+00 2404 0.00000000000000e+00 2405 0.00000000000000e+00 2406 0.00000000000000e+00 2407 0.00000000000000e+00 2408 0.00000000000000e+00 2409 0.00000000000000e+00 2410 0.00000000000000e+00 2411 0.00000000000000e+00 2412 0.00000000000000e+00 2413 0.00000000000000e+00 2414 0.00000000000000e+00 2415 0.00000000000000e+00 2416 0.00000000000000e+00 2417 0.00000000000000e+00 2418 0.00000000000000e+00 2419 0.00000000000000e+00 2420 0.00000000000000e+00 2421 0.00000000000000e+00 2422 0.00000000000000e+00 2423 0.00000000000000e+00 2424 0.00000000000000e+00 2425 0.00000000000000e+00 2426 0.00000000000000e+00 2427 0.00000000000000e+00 2428 0.00000000000000e+00 2429 0.00000000000000e+00 2430 0.00000000000000e+00 2431 0.00000000000000e+00 2432 0.00000000000000e+00 2433 0.00000000000000e+00 2434 0.00000000000000e+00 2435 0.00000000000000e+00 2436 0.00000000000000e+00 2437 0.00000000000000e+00 2438 0.00000000000000e+00 2439 0.00000000000000e+00 2440 0.00000000000000e+00 2441 0.00000000000000e+00 2442 0.00000000000000e+00 2443 0.00000000000000e+00 2444 0.00000000000000e+00 2445 0.00000000000000e+00 2446 0.00000000000000e+00 2447 0.00000000000000e+00 2448 0.00000000000000e+00 2449 0.00000000000000e+00 2450 0.00000000000000e+00 2451 0.00000000000000e+00 2452 0.00000000000000e+00 2453 0.00000000000000e+00 2454 0.00000000000000e+00 2455 0.00000000000000e+00 2456 0.00000000000000e+00 2457 0.00000000000000e+00 2458 0.00000000000000e+00 2459 0.00000000000000e+00 2460 0.00000000000000e+00 2461 0.00000000000000e+00 2462 0.00000000000000e+00 2463 0.00000000000000e+00 2464 0.00000000000000e+00 2465 0.00000000000000e+00 2466 0.00000000000000e+00 2467 0.00000000000000e+00 2468 0.00000000000000e+00 2469 0.00000000000000e+00 2470 0.00000000000000e+00 2471 0.00000000000000e+00 2472 0.00000000000000e+00 2473 0.00000000000000e+00 2474 0.00000000000000e+00 hypre-2.33.0/src/test/TEST_ij/data/beam_tet_dof2475_np4/mfem.txt000066400000000000000000000007701477326011500240600ustar00rootroot00000000000000$ mpirun -np 4 ./ex2p -m ../beam-tet.mesh -sr 0 -sp 2 -no-vis Produced with mfem-4.4 (https://github.com/mfem/mfem/archive/refs/tags/v4.4.tar.gz) Options used: --mesh ../beam-tet.mesh --order 1 --serial_ref 0 --parallel_ref 2 --amg-for-systems --no-static-condensation --no-visualization --by-vdim --device cpu Device configuration: cpu Memory configuration: host-std Number of finite element unknowns: 2475 Assembling: r.h.s. ... matrix ... done. Size of linear system: 2475hypre-2.33.0/src/test/TEST_ij/data/beam_tet_dof2475_np4/rbms.0.00000000066400000000000000000000411441477326011500240550ustar00rootroot000000000000000 675 0 0.00000000000000e+00 1 -4.00000000000000e+00 2 0.00000000000000e+00 3 0.00000000000000e+00 4 -5.00000000000000e+00 5 0.00000000000000e+00 6 0.00000000000000e+00 7 -6.00000000000000e+00 8 0.00000000000000e+00 9 1.00000000000000e+00 10 -4.00000000000000e+00 11 0.00000000000000e+00 12 1.00000000000000e+00 13 -5.00000000000000e+00 14 0.00000000000000e+00 15 1.00000000000000e+00 16 -6.00000000000000e+00 17 0.00000000000000e+00 18 0.00000000000000e+00 19 -4.00000000000000e+00 20 0.00000000000000e+00 21 0.00000000000000e+00 22 -5.00000000000000e+00 23 0.00000000000000e+00 24 0.00000000000000e+00 25 -6.00000000000000e+00 26 0.00000000000000e+00 27 1.00000000000000e+00 28 -4.00000000000000e+00 29 0.00000000000000e+00 30 1.00000000000000e+00 31 -5.00000000000000e+00 32 0.00000000000000e+00 33 1.00000000000000e+00 34 -6.00000000000000e+00 35 0.00000000000000e+00 36 0.00000000000000e+00 37 -4.50000000000000e+00 38 0.00000000000000e+00 39 5.00000000000000e-01 40 -4.00000000000000e+00 41 0.00000000000000e+00 42 5.00000000000000e-01 43 -4.50000000000000e+00 44 0.00000000000000e+00 45 0.00000000000000e+00 46 -4.00000000000000e+00 47 0.00000000000000e+00 48 0.00000000000000e+00 49 -4.50000000000000e+00 50 0.00000000000000e+00 51 5.00000000000000e-01 52 -4.00000000000000e+00 53 0.00000000000000e+00 54 5.00000000000000e-01 55 -4.50000000000000e+00 56 0.00000000000000e+00 57 0.00000000000000e+00 58 -5.50000000000000e+00 59 0.00000000000000e+00 60 5.00000000000000e-01 61 -5.00000000000000e+00 62 0.00000000000000e+00 63 5.00000000000000e-01 64 -5.50000000000000e+00 65 0.00000000000000e+00 66 0.00000000000000e+00 67 -5.00000000000000e+00 68 0.00000000000000e+00 69 0.00000000000000e+00 70 -5.50000000000000e+00 71 0.00000000000000e+00 72 5.00000000000000e-01 73 -5.00000000000000e+00 74 0.00000000000000e+00 75 5.00000000000000e-01 76 -5.50000000000000e+00 77 0.00000000000000e+00 78 5.00000000000000e-01 79 -6.00000000000000e+00 80 0.00000000000000e+00 81 0.00000000000000e+00 82 -6.00000000000000e+00 83 0.00000000000000e+00 84 5.00000000000000e-01 85 -6.00000000000000e+00 86 0.00000000000000e+00 87 1.00000000000000e+00 88 -4.50000000000000e+00 89 0.00000000000000e+00 90 1.00000000000000e+00 91 -4.00000000000000e+00 92 0.00000000000000e+00 93 1.00000000000000e+00 94 -4.50000000000000e+00 95 0.00000000000000e+00 96 1.00000000000000e+00 97 -5.50000000000000e+00 98 0.00000000000000e+00 99 1.00000000000000e+00 100 -5.00000000000000e+00 101 0.00000000000000e+00 102 1.00000000000000e+00 103 -5.50000000000000e+00 104 0.00000000000000e+00 105 1.00000000000000e+00 106 -6.00000000000000e+00 107 0.00000000000000e+00 108 0.00000000000000e+00 109 -4.50000000000000e+00 110 0.00000000000000e+00 111 5.00000000000000e-01 112 -4.00000000000000e+00 113 0.00000000000000e+00 114 5.00000000000000e-01 115 -4.50000000000000e+00 116 0.00000000000000e+00 117 0.00000000000000e+00 118 -5.50000000000000e+00 119 0.00000000000000e+00 120 5.00000000000000e-01 121 -5.00000000000000e+00 122 0.00000000000000e+00 123 5.00000000000000e-01 124 -5.50000000000000e+00 125 0.00000000000000e+00 126 5.00000000000000e-01 127 -6.00000000000000e+00 128 0.00000000000000e+00 129 1.00000000000000e+00 130 -4.50000000000000e+00 131 0.00000000000000e+00 132 1.00000000000000e+00 133 -5.50000000000000e+00 134 0.00000000000000e+00 135 0.00000000000000e+00 136 -4.25000000000000e+00 137 0.00000000000000e+00 138 2.50000000000000e-01 139 -4.00000000000000e+00 140 0.00000000000000e+00 141 2.50000000000000e-01 142 -4.25000000000000e+00 143 0.00000000000000e+00 144 0.00000000000000e+00 145 -4.00000000000000e+00 146 0.00000000000000e+00 147 0.00000000000000e+00 148 -4.25000000000000e+00 149 0.00000000000000e+00 150 2.50000000000000e-01 151 -4.00000000000000e+00 152 0.00000000000000e+00 153 2.50000000000000e-01 154 -4.25000000000000e+00 155 0.00000000000000e+00 156 0.00000000000000e+00 157 -4.75000000000000e+00 158 0.00000000000000e+00 159 0.00000000000000e+00 160 -5.25000000000000e+00 161 0.00000000000000e+00 162 2.50000000000000e-01 163 -5.00000000000000e+00 164 0.00000000000000e+00 165 2.50000000000000e-01 166 -5.25000000000000e+00 167 0.00000000000000e+00 168 0.00000000000000e+00 169 -5.00000000000000e+00 170 0.00000000000000e+00 171 0.00000000000000e+00 172 -5.25000000000000e+00 173 0.00000000000000e+00 174 2.50000000000000e-01 175 -5.00000000000000e+00 176 0.00000000000000e+00 177 2.50000000000000e-01 178 -5.25000000000000e+00 179 0.00000000000000e+00 180 0.00000000000000e+00 181 -5.75000000000000e+00 182 0.00000000000000e+00 183 2.50000000000000e-01 184 -6.00000000000000e+00 185 0.00000000000000e+00 186 0.00000000000000e+00 187 -6.00000000000000e+00 188 0.00000000000000e+00 189 2.50000000000000e-01 190 -6.00000000000000e+00 191 0.00000000000000e+00 192 7.50000000000000e-01 193 -4.00000000000000e+00 194 0.00000000000000e+00 195 1.00000000000000e+00 196 -4.25000000000000e+00 197 0.00000000000000e+00 198 1.00000000000000e+00 199 -4.00000000000000e+00 200 0.00000000000000e+00 201 1.00000000000000e+00 202 -4.25000000000000e+00 203 0.00000000000000e+00 204 7.50000000000000e-01 205 -4.75000000000000e+00 206 0.00000000000000e+00 207 7.50000000000000e-01 208 -5.00000000000000e+00 209 0.00000000000000e+00 210 1.00000000000000e+00 211 -4.75000000000000e+00 212 0.00000000000000e+00 213 1.00000000000000e+00 214 -5.25000000000000e+00 215 0.00000000000000e+00 216 1.00000000000000e+00 217 -5.00000000000000e+00 218 0.00000000000000e+00 219 1.00000000000000e+00 220 -5.25000000000000e+00 221 0.00000000000000e+00 222 7.50000000000000e-01 223 -5.75000000000000e+00 224 0.00000000000000e+00 225 7.50000000000000e-01 226 -6.00000000000000e+00 227 0.00000000000000e+00 228 1.00000000000000e+00 229 -5.75000000000000e+00 230 0.00000000000000e+00 231 1.00000000000000e+00 232 -6.00000000000000e+00 233 0.00000000000000e+00 234 0.00000000000000e+00 235 -4.00000000000000e+00 236 0.00000000000000e+00 237 0.00000000000000e+00 238 -4.25000000000000e+00 239 0.00000000000000e+00 240 2.50000000000000e-01 241 -4.00000000000000e+00 242 0.00000000000000e+00 243 2.50000000000000e-01 244 -4.25000000000000e+00 245 0.00000000000000e+00 246 0.00000000000000e+00 247 -4.75000000000000e+00 248 0.00000000000000e+00 249 0.00000000000000e+00 250 -5.00000000000000e+00 251 0.00000000000000e+00 252 0.00000000000000e+00 253 -4.75000000000000e+00 254 0.00000000000000e+00 255 0.00000000000000e+00 256 -5.25000000000000e+00 257 0.00000000000000e+00 258 2.50000000000000e-01 259 -5.00000000000000e+00 260 0.00000000000000e+00 261 2.50000000000000e-01 262 -5.25000000000000e+00 263 0.00000000000000e+00 264 0.00000000000000e+00 265 -5.75000000000000e+00 266 0.00000000000000e+00 267 0.00000000000000e+00 268 -6.00000000000000e+00 269 0.00000000000000e+00 270 0.00000000000000e+00 271 -5.75000000000000e+00 272 0.00000000000000e+00 273 2.50000000000000e-01 274 -6.00000000000000e+00 275 0.00000000000000e+00 276 7.50000000000000e-01 277 -4.00000000000000e+00 278 0.00000000000000e+00 279 1.00000000000000e+00 280 -4.00000000000000e+00 281 0.00000000000000e+00 282 7.50000000000000e-01 283 -4.00000000000000e+00 284 0.00000000000000e+00 285 1.00000000000000e+00 286 -4.25000000000000e+00 287 0.00000000000000e+00 288 7.50000000000000e-01 289 -4.75000000000000e+00 290 0.00000000000000e+00 291 7.50000000000000e-01 292 -5.00000000000000e+00 293 0.00000000000000e+00 294 1.00000000000000e+00 295 -4.75000000000000e+00 296 0.00000000000000e+00 297 1.00000000000000e+00 298 -5.00000000000000e+00 299 0.00000000000000e+00 300 7.50000000000000e-01 301 -4.75000000000000e+00 302 0.00000000000000e+00 303 7.50000000000000e-01 304 -5.00000000000000e+00 305 0.00000000000000e+00 306 1.00000000000000e+00 307 -4.75000000000000e+00 308 0.00000000000000e+00 309 1.00000000000000e+00 310 -5.25000000000000e+00 311 0.00000000000000e+00 312 7.50000000000000e-01 313 -5.75000000000000e+00 314 0.00000000000000e+00 315 7.50000000000000e-01 316 -6.00000000000000e+00 317 0.00000000000000e+00 318 1.00000000000000e+00 319 -5.75000000000000e+00 320 0.00000000000000e+00 321 1.00000000000000e+00 322 -6.00000000000000e+00 323 0.00000000000000e+00 324 7.50000000000000e-01 325 -5.75000000000000e+00 326 0.00000000000000e+00 327 7.50000000000000e-01 328 -6.00000000000000e+00 329 0.00000000000000e+00 330 1.00000000000000e+00 331 -5.75000000000000e+00 332 0.00000000000000e+00 333 2.50000000000000e-01 334 -4.50000000000000e+00 335 0.00000000000000e+00 336 0.00000000000000e+00 337 -4.50000000000000e+00 338 0.00000000000000e+00 339 2.50000000000000e-01 340 -4.50000000000000e+00 341 0.00000000000000e+00 342 2.50000000000000e-01 343 -4.75000000000000e+00 344 0.00000000000000e+00 345 0.00000000000000e+00 346 -4.75000000000000e+00 347 0.00000000000000e+00 348 2.50000000000000e-01 349 -4.75000000000000e+00 350 0.00000000000000e+00 351 5.00000000000000e-01 352 -4.25000000000000e+00 353 0.00000000000000e+00 354 5.00000000000000e-01 355 -4.00000000000000e+00 356 0.00000000000000e+00 357 5.00000000000000e-01 358 -4.25000000000000e+00 359 0.00000000000000e+00 360 7.50000000000000e-01 361 -4.25000000000000e+00 362 0.00000000000000e+00 363 7.50000000000000e-01 364 -4.00000000000000e+00 365 0.00000000000000e+00 366 7.50000000000000e-01 367 -4.25000000000000e+00 368 0.00000000000000e+00 369 5.00000000000000e-01 370 -4.50000000000000e+00 371 0.00000000000000e+00 372 5.00000000000000e-01 373 -4.75000000000000e+00 374 0.00000000000000e+00 375 5.00000000000000e-01 376 -4.75000000000000e+00 377 0.00000000000000e+00 378 7.50000000000000e-01 379 -4.50000000000000e+00 380 0.00000000000000e+00 381 7.50000000000000e-01 382 -4.50000000000000e+00 383 0.00000000000000e+00 384 7.50000000000000e-01 385 -4.75000000000000e+00 386 0.00000000000000e+00 387 0.00000000000000e+00 388 -4.25000000000000e+00 389 0.00000000000000e+00 390 2.50000000000000e-01 391 -4.00000000000000e+00 392 0.00000000000000e+00 393 2.50000000000000e-01 394 -4.25000000000000e+00 395 0.00000000000000e+00 396 0.00000000000000e+00 397 -4.25000000000000e+00 398 0.00000000000000e+00 399 2.50000000000000e-01 400 -4.00000000000000e+00 401 0.00000000000000e+00 402 2.50000000000000e-01 403 -4.25000000000000e+00 404 0.00000000000000e+00 405 2.50000000000000e-01 406 -4.50000000000000e+00 407 0.00000000000000e+00 408 0.00000000000000e+00 409 -4.75000000000000e+00 410 0.00000000000000e+00 411 2.50000000000000e-01 412 -4.75000000000000e+00 413 0.00000000000000e+00 414 0.00000000000000e+00 415 -4.50000000000000e+00 416 0.00000000000000e+00 417 2.50000000000000e-01 418 -4.50000000000000e+00 419 0.00000000000000e+00 420 2.50000000000000e-01 421 -4.75000000000000e+00 422 0.00000000000000e+00 423 5.00000000000000e-01 424 -4.25000000000000e+00 425 0.00000000000000e+00 426 7.50000000000000e-01 427 -4.00000000000000e+00 428 0.00000000000000e+00 429 7.50000000000000e-01 430 -4.25000000000000e+00 431 0.00000000000000e+00 432 5.00000000000000e-01 433 -4.00000000000000e+00 434 0.00000000000000e+00 435 5.00000000000000e-01 436 -4.25000000000000e+00 437 0.00000000000000e+00 438 7.50000000000000e-01 439 -4.25000000000000e+00 440 0.00000000000000e+00 441 5.00000000000000e-01 442 -4.75000000000000e+00 443 0.00000000000000e+00 444 7.50000000000000e-01 445 -4.50000000000000e+00 446 0.00000000000000e+00 447 7.50000000000000e-01 448 -4.75000000000000e+00 449 0.00000000000000e+00 450 5.00000000000000e-01 451 -4.50000000000000e+00 452 0.00000000000000e+00 453 5.00000000000000e-01 454 -4.75000000000000e+00 455 0.00000000000000e+00 456 7.50000000000000e-01 457 -4.50000000000000e+00 458 0.00000000000000e+00 459 2.50000000000000e-01 460 -5.50000000000000e+00 461 0.00000000000000e+00 462 0.00000000000000e+00 463 -5.50000000000000e+00 464 0.00000000000000e+00 465 2.50000000000000e-01 466 -5.50000000000000e+00 467 0.00000000000000e+00 468 2.50000000000000e-01 469 -5.75000000000000e+00 470 0.00000000000000e+00 471 0.00000000000000e+00 472 -5.75000000000000e+00 473 0.00000000000000e+00 474 2.50000000000000e-01 475 -5.75000000000000e+00 476 0.00000000000000e+00 477 5.00000000000000e-01 478 -5.25000000000000e+00 479 0.00000000000000e+00 480 5.00000000000000e-01 481 -5.00000000000000e+00 482 0.00000000000000e+00 483 5.00000000000000e-01 484 -5.25000000000000e+00 485 0.00000000000000e+00 486 7.50000000000000e-01 487 -5.25000000000000e+00 488 0.00000000000000e+00 489 7.50000000000000e-01 490 -5.00000000000000e+00 491 0.00000000000000e+00 492 7.50000000000000e-01 493 -5.25000000000000e+00 494 0.00000000000000e+00 495 5.00000000000000e-01 496 -5.50000000000000e+00 497 0.00000000000000e+00 498 5.00000000000000e-01 499 -5.75000000000000e+00 500 0.00000000000000e+00 501 5.00000000000000e-01 502 -5.75000000000000e+00 503 0.00000000000000e+00 504 7.50000000000000e-01 505 -5.50000000000000e+00 506 0.00000000000000e+00 507 7.50000000000000e-01 508 -5.50000000000000e+00 509 0.00000000000000e+00 510 7.50000000000000e-01 511 -5.75000000000000e+00 512 0.00000000000000e+00 513 0.00000000000000e+00 514 -5.25000000000000e+00 515 0.00000000000000e+00 516 2.50000000000000e-01 517 -5.00000000000000e+00 518 0.00000000000000e+00 519 2.50000000000000e-01 520 -5.25000000000000e+00 521 0.00000000000000e+00 522 0.00000000000000e+00 523 -5.25000000000000e+00 524 0.00000000000000e+00 525 2.50000000000000e-01 526 -5.00000000000000e+00 527 0.00000000000000e+00 528 2.50000000000000e-01 529 -5.25000000000000e+00 530 0.00000000000000e+00 531 2.50000000000000e-01 532 -5.50000000000000e+00 533 0.00000000000000e+00 534 0.00000000000000e+00 535 -5.75000000000000e+00 536 0.00000000000000e+00 537 2.50000000000000e-01 538 -5.75000000000000e+00 539 0.00000000000000e+00 540 0.00000000000000e+00 541 -5.50000000000000e+00 542 0.00000000000000e+00 543 2.50000000000000e-01 544 -5.50000000000000e+00 545 0.00000000000000e+00 546 2.50000000000000e-01 547 -5.75000000000000e+00 548 0.00000000000000e+00 549 5.00000000000000e-01 550 -5.25000000000000e+00 551 0.00000000000000e+00 552 7.50000000000000e-01 553 -5.00000000000000e+00 554 0.00000000000000e+00 555 7.50000000000000e-01 556 -5.25000000000000e+00 557 0.00000000000000e+00 558 5.00000000000000e-01 559 -5.00000000000000e+00 560 0.00000000000000e+00 561 5.00000000000000e-01 562 -5.25000000000000e+00 563 0.00000000000000e+00 564 7.50000000000000e-01 565 -5.25000000000000e+00 566 0.00000000000000e+00 567 5.00000000000000e-01 568 -5.75000000000000e+00 569 0.00000000000000e+00 570 7.50000000000000e-01 571 -5.50000000000000e+00 572 0.00000000000000e+00 573 7.50000000000000e-01 574 -5.75000000000000e+00 575 0.00000000000000e+00 576 5.00000000000000e-01 577 -5.50000000000000e+00 578 0.00000000000000e+00 579 5.00000000000000e-01 580 -5.75000000000000e+00 581 0.00000000000000e+00 582 7.50000000000000e-01 583 -5.50000000000000e+00 584 0.00000000000000e+00 585 5.00000000000000e-01 586 -6.00000000000000e+00 587 0.00000000000000e+00 588 7.50000000000000e-01 589 -6.00000000000000e+00 590 0.00000000000000e+00 591 2.50000000000000e-01 592 -6.00000000000000e+00 593 0.00000000000000e+00 594 2.50000000000000e-01 595 -6.00000000000000e+00 596 0.00000000000000e+00 597 7.50000000000000e-01 598 -6.00000000000000e+00 599 0.00000000000000e+00 600 5.00000000000000e-01 601 -6.00000000000000e+00 602 0.00000000000000e+00 603 1.00000000000000e+00 604 -4.50000000000000e+00 605 0.00000000000000e+00 606 1.00000000000000e+00 607 -4.75000000000000e+00 608 0.00000000000000e+00 609 1.00000000000000e+00 610 -4.25000000000000e+00 611 0.00000000000000e+00 612 1.00000000000000e+00 613 -4.25000000000000e+00 614 0.00000000000000e+00 615 1.00000000000000e+00 616 -4.75000000000000e+00 617 0.00000000000000e+00 618 1.00000000000000e+00 619 -4.50000000000000e+00 620 0.00000000000000e+00 621 1.00000000000000e+00 622 -5.50000000000000e+00 623 0.00000000000000e+00 624 1.00000000000000e+00 625 -5.75000000000000e+00 626 0.00000000000000e+00 627 1.00000000000000e+00 628 -5.25000000000000e+00 629 0.00000000000000e+00 630 1.00000000000000e+00 631 -5.25000000000000e+00 632 0.00000000000000e+00 633 1.00000000000000e+00 634 -5.75000000000000e+00 635 0.00000000000000e+00 636 1.00000000000000e+00 637 -5.50000000000000e+00 638 0.00000000000000e+00 639 2.50000000000000e-01 640 -4.50000000000000e+00 641 0.00000000000000e+00 642 2.50000000000000e-01 643 -4.75000000000000e+00 644 0.00000000000000e+00 645 5.00000000000000e-01 646 -4.25000000000000e+00 647 0.00000000000000e+00 648 7.50000000000000e-01 649 -4.25000000000000e+00 650 0.00000000000000e+00 651 5.00000000000000e-01 652 -4.75000000000000e+00 653 0.00000000000000e+00 654 7.50000000000000e-01 655 -4.50000000000000e+00 656 0.00000000000000e+00 657 2.50000000000000e-01 658 -5.50000000000000e+00 659 0.00000000000000e+00 660 2.50000000000000e-01 661 -5.75000000000000e+00 662 0.00000000000000e+00 663 5.00000000000000e-01 664 -5.25000000000000e+00 665 0.00000000000000e+00 666 7.50000000000000e-01 667 -5.25000000000000e+00 668 0.00000000000000e+00 669 5.00000000000000e-01 670 -5.75000000000000e+00 671 0.00000000000000e+00 672 7.50000000000000e-01 673 -5.50000000000000e+00 674 0.00000000000000e+00 hypre-2.33.0/src/test/TEST_ij/data/beam_tet_dof2475_np4/rbms.0.00001000066400000000000000000000361741477326011500240650ustar00rootroot00000000000000675 1275 675 0.00000000000000e+00 676 -7.00000000000000e+00 677 0.00000000000000e+00 678 0.00000000000000e+00 679 -8.00000000000000e+00 680 0.00000000000000e+00 681 1.00000000000000e+00 682 -7.00000000000000e+00 683 0.00000000000000e+00 684 1.00000000000000e+00 685 -8.00000000000000e+00 686 0.00000000000000e+00 687 0.00000000000000e+00 688 -7.00000000000000e+00 689 0.00000000000000e+00 690 0.00000000000000e+00 691 -8.00000000000000e+00 692 0.00000000000000e+00 693 1.00000000000000e+00 694 -7.00000000000000e+00 695 0.00000000000000e+00 696 1.00000000000000e+00 697 -8.00000000000000e+00 698 0.00000000000000e+00 699 0.00000000000000e+00 700 -6.50000000000000e+00 701 0.00000000000000e+00 702 5.00000000000000e-01 703 -6.50000000000000e+00 704 0.00000000000000e+00 705 0.00000000000000e+00 706 -6.50000000000000e+00 707 0.00000000000000e+00 708 5.00000000000000e-01 709 -6.50000000000000e+00 710 0.00000000000000e+00 711 0.00000000000000e+00 712 -7.50000000000000e+00 713 0.00000000000000e+00 714 5.00000000000000e-01 715 -7.00000000000000e+00 716 0.00000000000000e+00 717 5.00000000000000e-01 718 -7.50000000000000e+00 719 0.00000000000000e+00 720 0.00000000000000e+00 721 -7.00000000000000e+00 722 0.00000000000000e+00 723 0.00000000000000e+00 724 -7.50000000000000e+00 725 0.00000000000000e+00 726 5.00000000000000e-01 727 -7.00000000000000e+00 728 0.00000000000000e+00 729 5.00000000000000e-01 730 -7.50000000000000e+00 731 0.00000000000000e+00 732 5.00000000000000e-01 733 -8.00000000000000e+00 734 0.00000000000000e+00 735 0.00000000000000e+00 736 -8.00000000000000e+00 737 0.00000000000000e+00 738 5.00000000000000e-01 739 -8.00000000000000e+00 740 0.00000000000000e+00 741 1.00000000000000e+00 742 -6.50000000000000e+00 743 0.00000000000000e+00 744 1.00000000000000e+00 745 -6.50000000000000e+00 746 0.00000000000000e+00 747 1.00000000000000e+00 748 -7.50000000000000e+00 749 0.00000000000000e+00 750 1.00000000000000e+00 751 -7.00000000000000e+00 752 0.00000000000000e+00 753 1.00000000000000e+00 754 -7.50000000000000e+00 755 0.00000000000000e+00 756 1.00000000000000e+00 757 -8.00000000000000e+00 758 0.00000000000000e+00 759 0.00000000000000e+00 760 -6.50000000000000e+00 761 0.00000000000000e+00 762 5.00000000000000e-01 763 -6.50000000000000e+00 764 0.00000000000000e+00 765 0.00000000000000e+00 766 -7.50000000000000e+00 767 0.00000000000000e+00 768 5.00000000000000e-01 769 -7.00000000000000e+00 770 0.00000000000000e+00 771 5.00000000000000e-01 772 -7.50000000000000e+00 773 0.00000000000000e+00 774 5.00000000000000e-01 775 -8.00000000000000e+00 776 0.00000000000000e+00 777 1.00000000000000e+00 778 -6.50000000000000e+00 779 0.00000000000000e+00 780 1.00000000000000e+00 781 -7.50000000000000e+00 782 0.00000000000000e+00 783 0.00000000000000e+00 784 -6.25000000000000e+00 785 0.00000000000000e+00 786 2.50000000000000e-01 787 -6.25000000000000e+00 788 0.00000000000000e+00 789 0.00000000000000e+00 790 -6.25000000000000e+00 791 0.00000000000000e+00 792 2.50000000000000e-01 793 -6.25000000000000e+00 794 0.00000000000000e+00 795 0.00000000000000e+00 796 -6.75000000000000e+00 797 0.00000000000000e+00 798 0.00000000000000e+00 799 -7.25000000000000e+00 800 0.00000000000000e+00 801 2.50000000000000e-01 802 -7.00000000000000e+00 803 0.00000000000000e+00 804 2.50000000000000e-01 805 -7.25000000000000e+00 806 0.00000000000000e+00 807 0.00000000000000e+00 808 -7.00000000000000e+00 809 0.00000000000000e+00 810 0.00000000000000e+00 811 -7.25000000000000e+00 812 0.00000000000000e+00 813 2.50000000000000e-01 814 -7.00000000000000e+00 815 0.00000000000000e+00 816 2.50000000000000e-01 817 -7.25000000000000e+00 818 0.00000000000000e+00 819 0.00000000000000e+00 820 -7.75000000000000e+00 821 0.00000000000000e+00 822 2.50000000000000e-01 823 -8.00000000000000e+00 824 0.00000000000000e+00 825 0.00000000000000e+00 826 -8.00000000000000e+00 827 0.00000000000000e+00 828 2.50000000000000e-01 829 -8.00000000000000e+00 830 0.00000000000000e+00 831 1.00000000000000e+00 832 -6.25000000000000e+00 833 0.00000000000000e+00 834 1.00000000000000e+00 835 -6.25000000000000e+00 836 0.00000000000000e+00 837 7.50000000000000e-01 838 -6.75000000000000e+00 839 0.00000000000000e+00 840 7.50000000000000e-01 841 -7.00000000000000e+00 842 0.00000000000000e+00 843 1.00000000000000e+00 844 -6.75000000000000e+00 845 0.00000000000000e+00 846 1.00000000000000e+00 847 -7.25000000000000e+00 848 0.00000000000000e+00 849 1.00000000000000e+00 850 -7.00000000000000e+00 851 0.00000000000000e+00 852 1.00000000000000e+00 853 -7.25000000000000e+00 854 0.00000000000000e+00 855 7.50000000000000e-01 856 -7.75000000000000e+00 857 0.00000000000000e+00 858 7.50000000000000e-01 859 -8.00000000000000e+00 860 0.00000000000000e+00 861 1.00000000000000e+00 862 -7.75000000000000e+00 863 0.00000000000000e+00 864 1.00000000000000e+00 865 -8.00000000000000e+00 866 0.00000000000000e+00 867 0.00000000000000e+00 868 -6.25000000000000e+00 869 0.00000000000000e+00 870 2.50000000000000e-01 871 -6.25000000000000e+00 872 0.00000000000000e+00 873 0.00000000000000e+00 874 -6.75000000000000e+00 875 0.00000000000000e+00 876 0.00000000000000e+00 877 -7.00000000000000e+00 878 0.00000000000000e+00 879 0.00000000000000e+00 880 -6.75000000000000e+00 881 0.00000000000000e+00 882 0.00000000000000e+00 883 -7.25000000000000e+00 884 0.00000000000000e+00 885 2.50000000000000e-01 886 -7.00000000000000e+00 887 0.00000000000000e+00 888 2.50000000000000e-01 889 -7.25000000000000e+00 890 0.00000000000000e+00 891 0.00000000000000e+00 892 -7.75000000000000e+00 893 0.00000000000000e+00 894 0.00000000000000e+00 895 -8.00000000000000e+00 896 0.00000000000000e+00 897 0.00000000000000e+00 898 -7.75000000000000e+00 899 0.00000000000000e+00 900 2.50000000000000e-01 901 -8.00000000000000e+00 902 0.00000000000000e+00 903 1.00000000000000e+00 904 -6.25000000000000e+00 905 0.00000000000000e+00 906 7.50000000000000e-01 907 -6.75000000000000e+00 908 0.00000000000000e+00 909 7.50000000000000e-01 910 -7.00000000000000e+00 911 0.00000000000000e+00 912 1.00000000000000e+00 913 -6.75000000000000e+00 914 0.00000000000000e+00 915 1.00000000000000e+00 916 -7.00000000000000e+00 917 0.00000000000000e+00 918 7.50000000000000e-01 919 -6.75000000000000e+00 920 0.00000000000000e+00 921 7.50000000000000e-01 922 -7.00000000000000e+00 923 0.00000000000000e+00 924 1.00000000000000e+00 925 -6.75000000000000e+00 926 0.00000000000000e+00 927 1.00000000000000e+00 928 -7.25000000000000e+00 929 0.00000000000000e+00 930 7.50000000000000e-01 931 -7.75000000000000e+00 932 0.00000000000000e+00 933 7.50000000000000e-01 934 -8.00000000000000e+00 935 0.00000000000000e+00 936 1.00000000000000e+00 937 -7.75000000000000e+00 938 0.00000000000000e+00 939 1.00000000000000e+00 940 -8.00000000000000e+00 941 0.00000000000000e+00 942 7.50000000000000e-01 943 -7.75000000000000e+00 944 0.00000000000000e+00 945 7.50000000000000e-01 946 -8.00000000000000e+00 947 0.00000000000000e+00 948 1.00000000000000e+00 949 -7.75000000000000e+00 950 0.00000000000000e+00 951 2.50000000000000e-01 952 -6.50000000000000e+00 953 0.00000000000000e+00 954 0.00000000000000e+00 955 -6.50000000000000e+00 956 0.00000000000000e+00 957 2.50000000000000e-01 958 -6.50000000000000e+00 959 0.00000000000000e+00 960 2.50000000000000e-01 961 -6.75000000000000e+00 962 0.00000000000000e+00 963 0.00000000000000e+00 964 -6.75000000000000e+00 965 0.00000000000000e+00 966 2.50000000000000e-01 967 -6.75000000000000e+00 968 0.00000000000000e+00 969 5.00000000000000e-01 970 -6.25000000000000e+00 971 0.00000000000000e+00 972 5.00000000000000e-01 973 -6.25000000000000e+00 974 0.00000000000000e+00 975 7.50000000000000e-01 976 -6.25000000000000e+00 977 0.00000000000000e+00 978 7.50000000000000e-01 979 -6.25000000000000e+00 980 0.00000000000000e+00 981 5.00000000000000e-01 982 -6.50000000000000e+00 983 0.00000000000000e+00 984 5.00000000000000e-01 985 -6.75000000000000e+00 986 0.00000000000000e+00 987 5.00000000000000e-01 988 -6.75000000000000e+00 989 0.00000000000000e+00 990 7.50000000000000e-01 991 -6.50000000000000e+00 992 0.00000000000000e+00 993 7.50000000000000e-01 994 -6.50000000000000e+00 995 0.00000000000000e+00 996 7.50000000000000e-01 997 -6.75000000000000e+00 998 0.00000000000000e+00 999 0.00000000000000e+00 1000 -6.25000000000000e+00 1001 0.00000000000000e+00 1002 2.50000000000000e-01 1003 -6.25000000000000e+00 1004 0.00000000000000e+00 1005 0.00000000000000e+00 1006 -6.25000000000000e+00 1007 0.00000000000000e+00 1008 2.50000000000000e-01 1009 -6.25000000000000e+00 1010 0.00000000000000e+00 1011 2.50000000000000e-01 1012 -6.50000000000000e+00 1013 0.00000000000000e+00 1014 0.00000000000000e+00 1015 -6.75000000000000e+00 1016 0.00000000000000e+00 1017 2.50000000000000e-01 1018 -6.75000000000000e+00 1019 0.00000000000000e+00 1020 0.00000000000000e+00 1021 -6.50000000000000e+00 1022 0.00000000000000e+00 1023 2.50000000000000e-01 1024 -6.50000000000000e+00 1025 0.00000000000000e+00 1026 2.50000000000000e-01 1027 -6.75000000000000e+00 1028 0.00000000000000e+00 1029 5.00000000000000e-01 1030 -6.25000000000000e+00 1031 0.00000000000000e+00 1032 7.50000000000000e-01 1033 -6.25000000000000e+00 1034 0.00000000000000e+00 1035 5.00000000000000e-01 1036 -6.25000000000000e+00 1037 0.00000000000000e+00 1038 7.50000000000000e-01 1039 -6.25000000000000e+00 1040 0.00000000000000e+00 1041 5.00000000000000e-01 1042 -6.75000000000000e+00 1043 0.00000000000000e+00 1044 7.50000000000000e-01 1045 -6.50000000000000e+00 1046 0.00000000000000e+00 1047 7.50000000000000e-01 1048 -6.75000000000000e+00 1049 0.00000000000000e+00 1050 5.00000000000000e-01 1051 -6.50000000000000e+00 1052 0.00000000000000e+00 1053 5.00000000000000e-01 1054 -6.75000000000000e+00 1055 0.00000000000000e+00 1056 7.50000000000000e-01 1057 -6.50000000000000e+00 1058 0.00000000000000e+00 1059 2.50000000000000e-01 1060 -7.50000000000000e+00 1061 0.00000000000000e+00 1062 0.00000000000000e+00 1063 -7.50000000000000e+00 1064 0.00000000000000e+00 1065 2.50000000000000e-01 1066 -7.50000000000000e+00 1067 0.00000000000000e+00 1068 2.50000000000000e-01 1069 -7.75000000000000e+00 1070 0.00000000000000e+00 1071 0.00000000000000e+00 1072 -7.75000000000000e+00 1073 0.00000000000000e+00 1074 2.50000000000000e-01 1075 -7.75000000000000e+00 1076 0.00000000000000e+00 1077 5.00000000000000e-01 1078 -7.25000000000000e+00 1079 0.00000000000000e+00 1080 5.00000000000000e-01 1081 -7.00000000000000e+00 1082 0.00000000000000e+00 1083 5.00000000000000e-01 1084 -7.25000000000000e+00 1085 0.00000000000000e+00 1086 7.50000000000000e-01 1087 -7.25000000000000e+00 1088 0.00000000000000e+00 1089 7.50000000000000e-01 1090 -7.00000000000000e+00 1091 0.00000000000000e+00 1092 7.50000000000000e-01 1093 -7.25000000000000e+00 1094 0.00000000000000e+00 1095 5.00000000000000e-01 1096 -7.50000000000000e+00 1097 0.00000000000000e+00 1098 5.00000000000000e-01 1099 -7.75000000000000e+00 1100 0.00000000000000e+00 1101 5.00000000000000e-01 1102 -7.75000000000000e+00 1103 0.00000000000000e+00 1104 7.50000000000000e-01 1105 -7.50000000000000e+00 1106 0.00000000000000e+00 1107 7.50000000000000e-01 1108 -7.50000000000000e+00 1109 0.00000000000000e+00 1110 7.50000000000000e-01 1111 -7.75000000000000e+00 1112 0.00000000000000e+00 1113 0.00000000000000e+00 1114 -7.25000000000000e+00 1115 0.00000000000000e+00 1116 2.50000000000000e-01 1117 -7.00000000000000e+00 1118 0.00000000000000e+00 1119 2.50000000000000e-01 1120 -7.25000000000000e+00 1121 0.00000000000000e+00 1122 0.00000000000000e+00 1123 -7.25000000000000e+00 1124 0.00000000000000e+00 1125 2.50000000000000e-01 1126 -7.00000000000000e+00 1127 0.00000000000000e+00 1128 2.50000000000000e-01 1129 -7.25000000000000e+00 1130 0.00000000000000e+00 1131 2.50000000000000e-01 1132 -7.50000000000000e+00 1133 0.00000000000000e+00 1134 0.00000000000000e+00 1135 -7.75000000000000e+00 1136 0.00000000000000e+00 1137 2.50000000000000e-01 1138 -7.75000000000000e+00 1139 0.00000000000000e+00 1140 0.00000000000000e+00 1141 -7.50000000000000e+00 1142 0.00000000000000e+00 1143 2.50000000000000e-01 1144 -7.50000000000000e+00 1145 0.00000000000000e+00 1146 2.50000000000000e-01 1147 -7.75000000000000e+00 1148 0.00000000000000e+00 1149 5.00000000000000e-01 1150 -7.25000000000000e+00 1151 0.00000000000000e+00 1152 7.50000000000000e-01 1153 -7.00000000000000e+00 1154 0.00000000000000e+00 1155 7.50000000000000e-01 1156 -7.25000000000000e+00 1157 0.00000000000000e+00 1158 5.00000000000000e-01 1159 -7.00000000000000e+00 1160 0.00000000000000e+00 1161 5.00000000000000e-01 1162 -7.25000000000000e+00 1163 0.00000000000000e+00 1164 7.50000000000000e-01 1165 -7.25000000000000e+00 1166 0.00000000000000e+00 1167 5.00000000000000e-01 1168 -7.75000000000000e+00 1169 0.00000000000000e+00 1170 7.50000000000000e-01 1171 -7.50000000000000e+00 1172 0.00000000000000e+00 1173 7.50000000000000e-01 1174 -7.75000000000000e+00 1175 0.00000000000000e+00 1176 5.00000000000000e-01 1177 -7.50000000000000e+00 1178 0.00000000000000e+00 1179 5.00000000000000e-01 1180 -7.75000000000000e+00 1181 0.00000000000000e+00 1182 7.50000000000000e-01 1183 -7.50000000000000e+00 1184 0.00000000000000e+00 1185 5.00000000000000e-01 1186 -8.00000000000000e+00 1187 0.00000000000000e+00 1188 7.50000000000000e-01 1189 -8.00000000000000e+00 1190 0.00000000000000e+00 1191 2.50000000000000e-01 1192 -8.00000000000000e+00 1193 0.00000000000000e+00 1194 2.50000000000000e-01 1195 -8.00000000000000e+00 1196 0.00000000000000e+00 1197 7.50000000000000e-01 1198 -8.00000000000000e+00 1199 0.00000000000000e+00 1200 5.00000000000000e-01 1201 -8.00000000000000e+00 1202 0.00000000000000e+00 1203 1.00000000000000e+00 1204 -6.50000000000000e+00 1205 0.00000000000000e+00 1206 1.00000000000000e+00 1207 -6.75000000000000e+00 1208 0.00000000000000e+00 1209 1.00000000000000e+00 1210 -6.25000000000000e+00 1211 0.00000000000000e+00 1212 1.00000000000000e+00 1213 -6.25000000000000e+00 1214 0.00000000000000e+00 1215 1.00000000000000e+00 1216 -6.75000000000000e+00 1217 0.00000000000000e+00 1218 1.00000000000000e+00 1219 -6.50000000000000e+00 1220 0.00000000000000e+00 1221 1.00000000000000e+00 1222 -7.50000000000000e+00 1223 0.00000000000000e+00 1224 1.00000000000000e+00 1225 -7.75000000000000e+00 1226 0.00000000000000e+00 1227 1.00000000000000e+00 1228 -7.25000000000000e+00 1229 0.00000000000000e+00 1230 1.00000000000000e+00 1231 -7.25000000000000e+00 1232 0.00000000000000e+00 1233 1.00000000000000e+00 1234 -7.75000000000000e+00 1235 0.00000000000000e+00 1236 1.00000000000000e+00 1237 -7.50000000000000e+00 1238 0.00000000000000e+00 1239 2.50000000000000e-01 1240 -6.50000000000000e+00 1241 0.00000000000000e+00 1242 2.50000000000000e-01 1243 -6.75000000000000e+00 1244 0.00000000000000e+00 1245 5.00000000000000e-01 1246 -6.25000000000000e+00 1247 0.00000000000000e+00 1248 7.50000000000000e-01 1249 -6.25000000000000e+00 1250 0.00000000000000e+00 1251 5.00000000000000e-01 1252 -6.75000000000000e+00 1253 0.00000000000000e+00 1254 7.50000000000000e-01 1255 -6.50000000000000e+00 1256 0.00000000000000e+00 1257 2.50000000000000e-01 1258 -7.50000000000000e+00 1259 0.00000000000000e+00 1260 2.50000000000000e-01 1261 -7.75000000000000e+00 1262 0.00000000000000e+00 1263 5.00000000000000e-01 1264 -7.25000000000000e+00 1265 0.00000000000000e+00 1266 7.50000000000000e-01 1267 -7.25000000000000e+00 1268 0.00000000000000e+00 1269 5.00000000000000e-01 1270 -7.75000000000000e+00 1271 0.00000000000000e+00 1272 7.50000000000000e-01 1273 -7.50000000000000e+00 1274 0.00000000000000e+00 hypre-2.33.0/src/test/TEST_ij/data/beam_tet_dof2475_np4/rbms.0.00002000066400000000000000000000367021477326011500240630ustar00rootroot000000000000001275 1875 1275 0.00000000000000e+00 1276 -2.00000000000000e+00 1277 0.00000000000000e+00 1278 0.00000000000000e+00 1279 -3.00000000000000e+00 1280 0.00000000000000e+00 1281 1.00000000000000e+00 1282 -2.00000000000000e+00 1283 0.00000000000000e+00 1284 1.00000000000000e+00 1285 -3.00000000000000e+00 1286 0.00000000000000e+00 1287 0.00000000000000e+00 1288 -2.00000000000000e+00 1289 0.00000000000000e+00 1290 0.00000000000000e+00 1291 -3.00000000000000e+00 1292 0.00000000000000e+00 1293 1.00000000000000e+00 1294 -2.00000000000000e+00 1295 0.00000000000000e+00 1296 1.00000000000000e+00 1297 -3.00000000000000e+00 1298 0.00000000000000e+00 1299 0.00000000000000e+00 1300 -2.50000000000000e+00 1301 0.00000000000000e+00 1302 5.00000000000000e-01 1303 -2.00000000000000e+00 1304 0.00000000000000e+00 1305 5.00000000000000e-01 1306 -2.50000000000000e+00 1307 0.00000000000000e+00 1308 0.00000000000000e+00 1309 -2.00000000000000e+00 1310 0.00000000000000e+00 1311 0.00000000000000e+00 1312 -2.50000000000000e+00 1313 0.00000000000000e+00 1314 5.00000000000000e-01 1315 -2.00000000000000e+00 1316 0.00000000000000e+00 1317 5.00000000000000e-01 1318 -2.50000000000000e+00 1319 0.00000000000000e+00 1320 0.00000000000000e+00 1321 -3.50000000000000e+00 1322 0.00000000000000e+00 1323 5.00000000000000e-01 1324 -3.00000000000000e+00 1325 0.00000000000000e+00 1326 5.00000000000000e-01 1327 -3.50000000000000e+00 1328 0.00000000000000e+00 1329 0.00000000000000e+00 1330 -3.00000000000000e+00 1331 0.00000000000000e+00 1332 0.00000000000000e+00 1333 -3.50000000000000e+00 1334 0.00000000000000e+00 1335 5.00000000000000e-01 1336 -3.00000000000000e+00 1337 0.00000000000000e+00 1338 5.00000000000000e-01 1339 -3.50000000000000e+00 1340 0.00000000000000e+00 1341 1.00000000000000e+00 1342 -2.50000000000000e+00 1343 0.00000000000000e+00 1344 1.00000000000000e+00 1345 -2.00000000000000e+00 1346 0.00000000000000e+00 1347 1.00000000000000e+00 1348 -2.50000000000000e+00 1349 0.00000000000000e+00 1350 1.00000000000000e+00 1351 -3.50000000000000e+00 1352 0.00000000000000e+00 1353 1.00000000000000e+00 1354 -3.00000000000000e+00 1355 0.00000000000000e+00 1356 1.00000000000000e+00 1357 -3.50000000000000e+00 1358 0.00000000000000e+00 1359 0.00000000000000e+00 1360 -2.50000000000000e+00 1361 0.00000000000000e+00 1362 5.00000000000000e-01 1363 -2.00000000000000e+00 1364 0.00000000000000e+00 1365 5.00000000000000e-01 1366 -2.50000000000000e+00 1367 0.00000000000000e+00 1368 0.00000000000000e+00 1369 -3.50000000000000e+00 1370 0.00000000000000e+00 1371 5.00000000000000e-01 1372 -3.00000000000000e+00 1373 0.00000000000000e+00 1374 5.00000000000000e-01 1375 -3.50000000000000e+00 1376 0.00000000000000e+00 1377 1.00000000000000e+00 1378 -2.50000000000000e+00 1379 0.00000000000000e+00 1380 1.00000000000000e+00 1381 -3.50000000000000e+00 1382 0.00000000000000e+00 1383 0.00000000000000e+00 1384 -2.25000000000000e+00 1385 0.00000000000000e+00 1386 2.50000000000000e-01 1387 -2.00000000000000e+00 1388 0.00000000000000e+00 1389 2.50000000000000e-01 1390 -2.25000000000000e+00 1391 0.00000000000000e+00 1392 0.00000000000000e+00 1393 -2.00000000000000e+00 1394 0.00000000000000e+00 1395 0.00000000000000e+00 1396 -2.25000000000000e+00 1397 0.00000000000000e+00 1398 2.50000000000000e-01 1399 -2.00000000000000e+00 1400 0.00000000000000e+00 1401 2.50000000000000e-01 1402 -2.25000000000000e+00 1403 0.00000000000000e+00 1404 0.00000000000000e+00 1405 -2.75000000000000e+00 1406 0.00000000000000e+00 1407 0.00000000000000e+00 1408 -3.25000000000000e+00 1409 0.00000000000000e+00 1410 2.50000000000000e-01 1411 -3.00000000000000e+00 1412 0.00000000000000e+00 1413 2.50000000000000e-01 1414 -3.25000000000000e+00 1415 0.00000000000000e+00 1416 0.00000000000000e+00 1417 -3.00000000000000e+00 1418 0.00000000000000e+00 1419 0.00000000000000e+00 1420 -3.25000000000000e+00 1421 0.00000000000000e+00 1422 2.50000000000000e-01 1423 -3.00000000000000e+00 1424 0.00000000000000e+00 1425 2.50000000000000e-01 1426 -3.25000000000000e+00 1427 0.00000000000000e+00 1428 0.00000000000000e+00 1429 -3.75000000000000e+00 1430 0.00000000000000e+00 1431 7.50000000000000e-01 1432 -2.00000000000000e+00 1433 0.00000000000000e+00 1434 1.00000000000000e+00 1435 -2.25000000000000e+00 1436 0.00000000000000e+00 1437 1.00000000000000e+00 1438 -2.00000000000000e+00 1439 0.00000000000000e+00 1440 1.00000000000000e+00 1441 -2.25000000000000e+00 1442 0.00000000000000e+00 1443 7.50000000000000e-01 1444 -2.75000000000000e+00 1445 0.00000000000000e+00 1446 7.50000000000000e-01 1447 -3.00000000000000e+00 1448 0.00000000000000e+00 1449 1.00000000000000e+00 1450 -2.75000000000000e+00 1451 0.00000000000000e+00 1452 1.00000000000000e+00 1453 -3.25000000000000e+00 1454 0.00000000000000e+00 1455 1.00000000000000e+00 1456 -3.00000000000000e+00 1457 0.00000000000000e+00 1458 1.00000000000000e+00 1459 -3.25000000000000e+00 1460 0.00000000000000e+00 1461 7.50000000000000e-01 1462 -3.75000000000000e+00 1463 0.00000000000000e+00 1464 1.00000000000000e+00 1465 -3.75000000000000e+00 1466 0.00000000000000e+00 1467 0.00000000000000e+00 1468 -2.00000000000000e+00 1469 0.00000000000000e+00 1470 0.00000000000000e+00 1471 -2.25000000000000e+00 1472 0.00000000000000e+00 1473 2.50000000000000e-01 1474 -2.00000000000000e+00 1475 0.00000000000000e+00 1476 2.50000000000000e-01 1477 -2.25000000000000e+00 1478 0.00000000000000e+00 1479 0.00000000000000e+00 1480 -2.75000000000000e+00 1481 0.00000000000000e+00 1482 0.00000000000000e+00 1483 -3.00000000000000e+00 1484 0.00000000000000e+00 1485 0.00000000000000e+00 1486 -2.75000000000000e+00 1487 0.00000000000000e+00 1488 0.00000000000000e+00 1489 -3.25000000000000e+00 1490 0.00000000000000e+00 1491 2.50000000000000e-01 1492 -3.00000000000000e+00 1493 0.00000000000000e+00 1494 2.50000000000000e-01 1495 -3.25000000000000e+00 1496 0.00000000000000e+00 1497 0.00000000000000e+00 1498 -3.75000000000000e+00 1499 0.00000000000000e+00 1500 0.00000000000000e+00 1501 -3.75000000000000e+00 1502 0.00000000000000e+00 1503 7.50000000000000e-01 1504 -2.00000000000000e+00 1505 0.00000000000000e+00 1506 1.00000000000000e+00 1507 -2.00000000000000e+00 1508 0.00000000000000e+00 1509 7.50000000000000e-01 1510 -2.00000000000000e+00 1511 0.00000000000000e+00 1512 1.00000000000000e+00 1513 -2.25000000000000e+00 1514 0.00000000000000e+00 1515 7.50000000000000e-01 1516 -2.75000000000000e+00 1517 0.00000000000000e+00 1518 7.50000000000000e-01 1519 -3.00000000000000e+00 1520 0.00000000000000e+00 1521 1.00000000000000e+00 1522 -2.75000000000000e+00 1523 0.00000000000000e+00 1524 1.00000000000000e+00 1525 -3.00000000000000e+00 1526 0.00000000000000e+00 1527 7.50000000000000e-01 1528 -2.75000000000000e+00 1529 0.00000000000000e+00 1530 7.50000000000000e-01 1531 -3.00000000000000e+00 1532 0.00000000000000e+00 1533 1.00000000000000e+00 1534 -2.75000000000000e+00 1535 0.00000000000000e+00 1536 1.00000000000000e+00 1537 -3.25000000000000e+00 1538 0.00000000000000e+00 1539 7.50000000000000e-01 1540 -3.75000000000000e+00 1541 0.00000000000000e+00 1542 1.00000000000000e+00 1543 -3.75000000000000e+00 1544 0.00000000000000e+00 1545 7.50000000000000e-01 1546 -3.75000000000000e+00 1547 0.00000000000000e+00 1548 1.00000000000000e+00 1549 -3.75000000000000e+00 1550 0.00000000000000e+00 1551 2.50000000000000e-01 1552 -2.50000000000000e+00 1553 0.00000000000000e+00 1554 0.00000000000000e+00 1555 -2.50000000000000e+00 1556 0.00000000000000e+00 1557 2.50000000000000e-01 1558 -2.50000000000000e+00 1559 0.00000000000000e+00 1560 2.50000000000000e-01 1561 -2.75000000000000e+00 1562 0.00000000000000e+00 1563 0.00000000000000e+00 1564 -2.75000000000000e+00 1565 0.00000000000000e+00 1566 2.50000000000000e-01 1567 -2.75000000000000e+00 1568 0.00000000000000e+00 1569 5.00000000000000e-01 1570 -2.25000000000000e+00 1571 0.00000000000000e+00 1572 5.00000000000000e-01 1573 -2.00000000000000e+00 1574 0.00000000000000e+00 1575 5.00000000000000e-01 1576 -2.25000000000000e+00 1577 0.00000000000000e+00 1578 7.50000000000000e-01 1579 -2.25000000000000e+00 1580 0.00000000000000e+00 1581 7.50000000000000e-01 1582 -2.00000000000000e+00 1583 0.00000000000000e+00 1584 7.50000000000000e-01 1585 -2.25000000000000e+00 1586 0.00000000000000e+00 1587 5.00000000000000e-01 1588 -2.50000000000000e+00 1589 0.00000000000000e+00 1590 5.00000000000000e-01 1591 -2.75000000000000e+00 1592 0.00000000000000e+00 1593 5.00000000000000e-01 1594 -2.75000000000000e+00 1595 0.00000000000000e+00 1596 7.50000000000000e-01 1597 -2.50000000000000e+00 1598 0.00000000000000e+00 1599 7.50000000000000e-01 1600 -2.50000000000000e+00 1601 0.00000000000000e+00 1602 7.50000000000000e-01 1603 -2.75000000000000e+00 1604 0.00000000000000e+00 1605 0.00000000000000e+00 1606 -2.25000000000000e+00 1607 0.00000000000000e+00 1608 2.50000000000000e-01 1609 -2.00000000000000e+00 1610 0.00000000000000e+00 1611 2.50000000000000e-01 1612 -2.25000000000000e+00 1613 0.00000000000000e+00 1614 0.00000000000000e+00 1615 -2.25000000000000e+00 1616 0.00000000000000e+00 1617 2.50000000000000e-01 1618 -2.00000000000000e+00 1619 0.00000000000000e+00 1620 2.50000000000000e-01 1621 -2.25000000000000e+00 1622 0.00000000000000e+00 1623 2.50000000000000e-01 1624 -2.50000000000000e+00 1625 0.00000000000000e+00 1626 0.00000000000000e+00 1627 -2.75000000000000e+00 1628 0.00000000000000e+00 1629 2.50000000000000e-01 1630 -2.75000000000000e+00 1631 0.00000000000000e+00 1632 0.00000000000000e+00 1633 -2.50000000000000e+00 1634 0.00000000000000e+00 1635 2.50000000000000e-01 1636 -2.50000000000000e+00 1637 0.00000000000000e+00 1638 2.50000000000000e-01 1639 -2.75000000000000e+00 1640 0.00000000000000e+00 1641 5.00000000000000e-01 1642 -2.25000000000000e+00 1643 0.00000000000000e+00 1644 7.50000000000000e-01 1645 -2.00000000000000e+00 1646 0.00000000000000e+00 1647 7.50000000000000e-01 1648 -2.25000000000000e+00 1649 0.00000000000000e+00 1650 5.00000000000000e-01 1651 -2.00000000000000e+00 1652 0.00000000000000e+00 1653 5.00000000000000e-01 1654 -2.25000000000000e+00 1655 0.00000000000000e+00 1656 7.50000000000000e-01 1657 -2.25000000000000e+00 1658 0.00000000000000e+00 1659 5.00000000000000e-01 1660 -2.75000000000000e+00 1661 0.00000000000000e+00 1662 7.50000000000000e-01 1663 -2.50000000000000e+00 1664 0.00000000000000e+00 1665 7.50000000000000e-01 1666 -2.75000000000000e+00 1667 0.00000000000000e+00 1668 5.00000000000000e-01 1669 -2.50000000000000e+00 1670 0.00000000000000e+00 1671 5.00000000000000e-01 1672 -2.75000000000000e+00 1673 0.00000000000000e+00 1674 7.50000000000000e-01 1675 -2.50000000000000e+00 1676 0.00000000000000e+00 1677 2.50000000000000e-01 1678 -3.50000000000000e+00 1679 0.00000000000000e+00 1680 0.00000000000000e+00 1681 -3.50000000000000e+00 1682 0.00000000000000e+00 1683 2.50000000000000e-01 1684 -3.50000000000000e+00 1685 0.00000000000000e+00 1686 2.50000000000000e-01 1687 -3.75000000000000e+00 1688 0.00000000000000e+00 1689 0.00000000000000e+00 1690 -3.75000000000000e+00 1691 0.00000000000000e+00 1692 2.50000000000000e-01 1693 -3.75000000000000e+00 1694 0.00000000000000e+00 1695 5.00000000000000e-01 1696 -3.25000000000000e+00 1697 0.00000000000000e+00 1698 5.00000000000000e-01 1699 -3.00000000000000e+00 1700 0.00000000000000e+00 1701 5.00000000000000e-01 1702 -3.25000000000000e+00 1703 0.00000000000000e+00 1704 7.50000000000000e-01 1705 -3.25000000000000e+00 1706 0.00000000000000e+00 1707 7.50000000000000e-01 1708 -3.00000000000000e+00 1709 0.00000000000000e+00 1710 7.50000000000000e-01 1711 -3.25000000000000e+00 1712 0.00000000000000e+00 1713 5.00000000000000e-01 1714 -3.50000000000000e+00 1715 0.00000000000000e+00 1716 5.00000000000000e-01 1717 -3.75000000000000e+00 1718 0.00000000000000e+00 1719 5.00000000000000e-01 1720 -3.75000000000000e+00 1721 0.00000000000000e+00 1722 7.50000000000000e-01 1723 -3.50000000000000e+00 1724 0.00000000000000e+00 1725 7.50000000000000e-01 1726 -3.50000000000000e+00 1727 0.00000000000000e+00 1728 7.50000000000000e-01 1729 -3.75000000000000e+00 1730 0.00000000000000e+00 1731 0.00000000000000e+00 1732 -3.25000000000000e+00 1733 0.00000000000000e+00 1734 2.50000000000000e-01 1735 -3.00000000000000e+00 1736 0.00000000000000e+00 1737 2.50000000000000e-01 1738 -3.25000000000000e+00 1739 0.00000000000000e+00 1740 0.00000000000000e+00 1741 -3.25000000000000e+00 1742 0.00000000000000e+00 1743 2.50000000000000e-01 1744 -3.00000000000000e+00 1745 0.00000000000000e+00 1746 2.50000000000000e-01 1747 -3.25000000000000e+00 1748 0.00000000000000e+00 1749 2.50000000000000e-01 1750 -3.50000000000000e+00 1751 0.00000000000000e+00 1752 0.00000000000000e+00 1753 -3.75000000000000e+00 1754 0.00000000000000e+00 1755 2.50000000000000e-01 1756 -3.75000000000000e+00 1757 0.00000000000000e+00 1758 0.00000000000000e+00 1759 -3.50000000000000e+00 1760 0.00000000000000e+00 1761 2.50000000000000e-01 1762 -3.50000000000000e+00 1763 0.00000000000000e+00 1764 2.50000000000000e-01 1765 -3.75000000000000e+00 1766 0.00000000000000e+00 1767 5.00000000000000e-01 1768 -3.25000000000000e+00 1769 0.00000000000000e+00 1770 7.50000000000000e-01 1771 -3.00000000000000e+00 1772 0.00000000000000e+00 1773 7.50000000000000e-01 1774 -3.25000000000000e+00 1775 0.00000000000000e+00 1776 5.00000000000000e-01 1777 -3.00000000000000e+00 1778 0.00000000000000e+00 1779 5.00000000000000e-01 1780 -3.25000000000000e+00 1781 0.00000000000000e+00 1782 7.50000000000000e-01 1783 -3.25000000000000e+00 1784 0.00000000000000e+00 1785 5.00000000000000e-01 1786 -3.75000000000000e+00 1787 0.00000000000000e+00 1788 7.50000000000000e-01 1789 -3.50000000000000e+00 1790 0.00000000000000e+00 1791 7.50000000000000e-01 1792 -3.75000000000000e+00 1793 0.00000000000000e+00 1794 5.00000000000000e-01 1795 -3.50000000000000e+00 1796 0.00000000000000e+00 1797 5.00000000000000e-01 1798 -3.75000000000000e+00 1799 0.00000000000000e+00 1800 7.50000000000000e-01 1801 -3.50000000000000e+00 1802 0.00000000000000e+00 1803 1.00000000000000e+00 1804 -2.50000000000000e+00 1805 0.00000000000000e+00 1806 1.00000000000000e+00 1807 -2.75000000000000e+00 1808 0.00000000000000e+00 1809 1.00000000000000e+00 1810 -2.25000000000000e+00 1811 0.00000000000000e+00 1812 1.00000000000000e+00 1813 -2.25000000000000e+00 1814 0.00000000000000e+00 1815 1.00000000000000e+00 1816 -2.75000000000000e+00 1817 0.00000000000000e+00 1818 1.00000000000000e+00 1819 -2.50000000000000e+00 1820 0.00000000000000e+00 1821 1.00000000000000e+00 1822 -3.50000000000000e+00 1823 0.00000000000000e+00 1824 1.00000000000000e+00 1825 -3.75000000000000e+00 1826 0.00000000000000e+00 1827 1.00000000000000e+00 1828 -3.25000000000000e+00 1829 0.00000000000000e+00 1830 1.00000000000000e+00 1831 -3.25000000000000e+00 1832 0.00000000000000e+00 1833 1.00000000000000e+00 1834 -3.75000000000000e+00 1835 0.00000000000000e+00 1836 1.00000000000000e+00 1837 -3.50000000000000e+00 1838 0.00000000000000e+00 1839 2.50000000000000e-01 1840 -2.50000000000000e+00 1841 0.00000000000000e+00 1842 2.50000000000000e-01 1843 -2.75000000000000e+00 1844 0.00000000000000e+00 1845 5.00000000000000e-01 1846 -2.25000000000000e+00 1847 0.00000000000000e+00 1848 7.50000000000000e-01 1849 -2.25000000000000e+00 1850 0.00000000000000e+00 1851 5.00000000000000e-01 1852 -2.75000000000000e+00 1853 0.00000000000000e+00 1854 7.50000000000000e-01 1855 -2.50000000000000e+00 1856 0.00000000000000e+00 1857 2.50000000000000e-01 1858 -3.50000000000000e+00 1859 0.00000000000000e+00 1860 2.50000000000000e-01 1861 -3.75000000000000e+00 1862 0.00000000000000e+00 1863 5.00000000000000e-01 1864 -3.25000000000000e+00 1865 0.00000000000000e+00 1866 7.50000000000000e-01 1867 -3.25000000000000e+00 1868 0.00000000000000e+00 1869 5.00000000000000e-01 1870 -3.75000000000000e+00 1871 0.00000000000000e+00 1872 7.50000000000000e-01 1873 -3.50000000000000e+00 1874 0.00000000000000e+00 hypre-2.33.0/src/test/TEST_ij/data/beam_tet_dof2475_np4/rbms.0.00003000066400000000000000000000366511477326011500240670ustar00rootroot000000000000001875 2475 1875 0.00000000000000e+00 1876 0.00000000000000e+00 1877 0.00000000000000e+00 1878 0.00000000000000e+00 1879 -1.00000000000000e+00 1880 0.00000000000000e+00 1881 1.00000000000000e+00 1882 0.00000000000000e+00 1883 0.00000000000000e+00 1884 1.00000000000000e+00 1885 -1.00000000000000e+00 1886 0.00000000000000e+00 1887 0.00000000000000e+00 1888 0.00000000000000e+00 1889 0.00000000000000e+00 1890 0.00000000000000e+00 1891 -1.00000000000000e+00 1892 0.00000000000000e+00 1893 1.00000000000000e+00 1894 0.00000000000000e+00 1895 0.00000000000000e+00 1896 1.00000000000000e+00 1897 -1.00000000000000e+00 1898 0.00000000000000e+00 1899 0.00000000000000e+00 1900 -5.00000000000000e-01 1901 0.00000000000000e+00 1902 5.00000000000000e-01 1903 0.00000000000000e+00 1904 0.00000000000000e+00 1905 5.00000000000000e-01 1906 -5.00000000000000e-01 1907 0.00000000000000e+00 1908 0.00000000000000e+00 1909 0.00000000000000e+00 1910 0.00000000000000e+00 1911 0.00000000000000e+00 1912 -5.00000000000000e-01 1913 0.00000000000000e+00 1914 5.00000000000000e-01 1915 0.00000000000000e+00 1916 0.00000000000000e+00 1917 5.00000000000000e-01 1918 -5.00000000000000e-01 1919 0.00000000000000e+00 1920 0.00000000000000e+00 1921 -1.50000000000000e+00 1922 0.00000000000000e+00 1923 5.00000000000000e-01 1924 -1.00000000000000e+00 1925 0.00000000000000e+00 1926 5.00000000000000e-01 1927 -1.50000000000000e+00 1928 0.00000000000000e+00 1929 0.00000000000000e+00 1930 -1.00000000000000e+00 1931 0.00000000000000e+00 1932 0.00000000000000e+00 1933 -1.50000000000000e+00 1934 0.00000000000000e+00 1935 5.00000000000000e-01 1936 -1.00000000000000e+00 1937 0.00000000000000e+00 1938 5.00000000000000e-01 1939 -1.50000000000000e+00 1940 0.00000000000000e+00 1941 1.00000000000000e+00 1942 -5.00000000000000e-01 1943 0.00000000000000e+00 1944 1.00000000000000e+00 1945 0.00000000000000e+00 1946 0.00000000000000e+00 1947 1.00000000000000e+00 1948 -5.00000000000000e-01 1949 0.00000000000000e+00 1950 1.00000000000000e+00 1951 -1.50000000000000e+00 1952 0.00000000000000e+00 1953 1.00000000000000e+00 1954 -1.00000000000000e+00 1955 0.00000000000000e+00 1956 1.00000000000000e+00 1957 -1.50000000000000e+00 1958 0.00000000000000e+00 1959 0.00000000000000e+00 1960 -5.00000000000000e-01 1961 0.00000000000000e+00 1962 5.00000000000000e-01 1963 0.00000000000000e+00 1964 0.00000000000000e+00 1965 5.00000000000000e-01 1966 -5.00000000000000e-01 1967 0.00000000000000e+00 1968 0.00000000000000e+00 1969 -1.50000000000000e+00 1970 0.00000000000000e+00 1971 5.00000000000000e-01 1972 -1.00000000000000e+00 1973 0.00000000000000e+00 1974 5.00000000000000e-01 1975 -1.50000000000000e+00 1976 0.00000000000000e+00 1977 1.00000000000000e+00 1978 -5.00000000000000e-01 1979 0.00000000000000e+00 1980 1.00000000000000e+00 1981 -1.50000000000000e+00 1982 0.00000000000000e+00 1983 0.00000000000000e+00 1984 -2.50000000000000e-01 1985 0.00000000000000e+00 1986 2.50000000000000e-01 1987 0.00000000000000e+00 1988 0.00000000000000e+00 1989 2.50000000000000e-01 1990 -2.50000000000000e-01 1991 0.00000000000000e+00 1992 0.00000000000000e+00 1993 0.00000000000000e+00 1994 0.00000000000000e+00 1995 0.00000000000000e+00 1996 -2.50000000000000e-01 1997 0.00000000000000e+00 1998 2.50000000000000e-01 1999 0.00000000000000e+00 2000 0.00000000000000e+00 2001 2.50000000000000e-01 2002 -2.50000000000000e-01 2003 0.00000000000000e+00 2004 0.00000000000000e+00 2005 -7.50000000000000e-01 2006 0.00000000000000e+00 2007 0.00000000000000e+00 2008 -1.25000000000000e+00 2009 0.00000000000000e+00 2010 2.50000000000000e-01 2011 -1.00000000000000e+00 2012 0.00000000000000e+00 2013 2.50000000000000e-01 2014 -1.25000000000000e+00 2015 0.00000000000000e+00 2016 0.00000000000000e+00 2017 -1.00000000000000e+00 2018 0.00000000000000e+00 2019 0.00000000000000e+00 2020 -1.25000000000000e+00 2021 0.00000000000000e+00 2022 2.50000000000000e-01 2023 -1.00000000000000e+00 2024 0.00000000000000e+00 2025 2.50000000000000e-01 2026 -1.25000000000000e+00 2027 0.00000000000000e+00 2028 0.00000000000000e+00 2029 -1.75000000000000e+00 2030 0.00000000000000e+00 2031 7.50000000000000e-01 2032 0.00000000000000e+00 2033 0.00000000000000e+00 2034 1.00000000000000e+00 2035 -2.50000000000000e-01 2036 0.00000000000000e+00 2037 1.00000000000000e+00 2038 0.00000000000000e+00 2039 0.00000000000000e+00 2040 1.00000000000000e+00 2041 -2.50000000000000e-01 2042 0.00000000000000e+00 2043 7.50000000000000e-01 2044 -7.50000000000000e-01 2045 0.00000000000000e+00 2046 7.50000000000000e-01 2047 -1.00000000000000e+00 2048 0.00000000000000e+00 2049 1.00000000000000e+00 2050 -7.50000000000000e-01 2051 0.00000000000000e+00 2052 1.00000000000000e+00 2053 -1.25000000000000e+00 2054 0.00000000000000e+00 2055 1.00000000000000e+00 2056 -1.00000000000000e+00 2057 0.00000000000000e+00 2058 1.00000000000000e+00 2059 -1.25000000000000e+00 2060 0.00000000000000e+00 2061 7.50000000000000e-01 2062 -1.75000000000000e+00 2063 0.00000000000000e+00 2064 1.00000000000000e+00 2065 -1.75000000000000e+00 2066 0.00000000000000e+00 2067 0.00000000000000e+00 2068 0.00000000000000e+00 2069 0.00000000000000e+00 2070 0.00000000000000e+00 2071 -2.50000000000000e-01 2072 0.00000000000000e+00 2073 2.50000000000000e-01 2074 0.00000000000000e+00 2075 0.00000000000000e+00 2076 2.50000000000000e-01 2077 -2.50000000000000e-01 2078 0.00000000000000e+00 2079 0.00000000000000e+00 2080 -7.50000000000000e-01 2081 0.00000000000000e+00 2082 0.00000000000000e+00 2083 -1.00000000000000e+00 2084 0.00000000000000e+00 2085 0.00000000000000e+00 2086 -7.50000000000000e-01 2087 0.00000000000000e+00 2088 0.00000000000000e+00 2089 -1.25000000000000e+00 2090 0.00000000000000e+00 2091 2.50000000000000e-01 2092 -1.00000000000000e+00 2093 0.00000000000000e+00 2094 2.50000000000000e-01 2095 -1.25000000000000e+00 2096 0.00000000000000e+00 2097 0.00000000000000e+00 2098 -1.75000000000000e+00 2099 0.00000000000000e+00 2100 0.00000000000000e+00 2101 -1.75000000000000e+00 2102 0.00000000000000e+00 2103 7.50000000000000e-01 2104 0.00000000000000e+00 2105 0.00000000000000e+00 2106 1.00000000000000e+00 2107 0.00000000000000e+00 2108 0.00000000000000e+00 2109 7.50000000000000e-01 2110 0.00000000000000e+00 2111 0.00000000000000e+00 2112 1.00000000000000e+00 2113 -2.50000000000000e-01 2114 0.00000000000000e+00 2115 7.50000000000000e-01 2116 -7.50000000000000e-01 2117 0.00000000000000e+00 2118 7.50000000000000e-01 2119 -1.00000000000000e+00 2120 0.00000000000000e+00 2121 1.00000000000000e+00 2122 -7.50000000000000e-01 2123 0.00000000000000e+00 2124 1.00000000000000e+00 2125 -1.00000000000000e+00 2126 0.00000000000000e+00 2127 7.50000000000000e-01 2128 -7.50000000000000e-01 2129 0.00000000000000e+00 2130 7.50000000000000e-01 2131 -1.00000000000000e+00 2132 0.00000000000000e+00 2133 1.00000000000000e+00 2134 -7.50000000000000e-01 2135 0.00000000000000e+00 2136 1.00000000000000e+00 2137 -1.25000000000000e+00 2138 0.00000000000000e+00 2139 7.50000000000000e-01 2140 -1.75000000000000e+00 2141 0.00000000000000e+00 2142 1.00000000000000e+00 2143 -1.75000000000000e+00 2144 0.00000000000000e+00 2145 7.50000000000000e-01 2146 -1.75000000000000e+00 2147 0.00000000000000e+00 2148 1.00000000000000e+00 2149 -1.75000000000000e+00 2150 0.00000000000000e+00 2151 2.50000000000000e-01 2152 -5.00000000000000e-01 2153 0.00000000000000e+00 2154 0.00000000000000e+00 2155 -5.00000000000000e-01 2156 0.00000000000000e+00 2157 2.50000000000000e-01 2158 -5.00000000000000e-01 2159 0.00000000000000e+00 2160 2.50000000000000e-01 2161 -7.50000000000000e-01 2162 0.00000000000000e+00 2163 0.00000000000000e+00 2164 -7.50000000000000e-01 2165 0.00000000000000e+00 2166 2.50000000000000e-01 2167 -7.50000000000000e-01 2168 0.00000000000000e+00 2169 5.00000000000000e-01 2170 -2.50000000000000e-01 2171 0.00000000000000e+00 2172 5.00000000000000e-01 2173 0.00000000000000e+00 2174 0.00000000000000e+00 2175 5.00000000000000e-01 2176 -2.50000000000000e-01 2177 0.00000000000000e+00 2178 7.50000000000000e-01 2179 -2.50000000000000e-01 2180 0.00000000000000e+00 2181 7.50000000000000e-01 2182 0.00000000000000e+00 2183 0.00000000000000e+00 2184 7.50000000000000e-01 2185 -2.50000000000000e-01 2186 0.00000000000000e+00 2187 5.00000000000000e-01 2188 -5.00000000000000e-01 2189 0.00000000000000e+00 2190 5.00000000000000e-01 2191 -7.50000000000000e-01 2192 0.00000000000000e+00 2193 5.00000000000000e-01 2194 -7.50000000000000e-01 2195 0.00000000000000e+00 2196 7.50000000000000e-01 2197 -5.00000000000000e-01 2198 0.00000000000000e+00 2199 7.50000000000000e-01 2200 -5.00000000000000e-01 2201 0.00000000000000e+00 2202 7.50000000000000e-01 2203 -7.50000000000000e-01 2204 0.00000000000000e+00 2205 0.00000000000000e+00 2206 -2.50000000000000e-01 2207 0.00000000000000e+00 2208 2.50000000000000e-01 2209 0.00000000000000e+00 2210 0.00000000000000e+00 2211 2.50000000000000e-01 2212 -2.50000000000000e-01 2213 0.00000000000000e+00 2214 0.00000000000000e+00 2215 -2.50000000000000e-01 2216 0.00000000000000e+00 2217 2.50000000000000e-01 2218 0.00000000000000e+00 2219 0.00000000000000e+00 2220 2.50000000000000e-01 2221 -2.50000000000000e-01 2222 0.00000000000000e+00 2223 2.50000000000000e-01 2224 -5.00000000000000e-01 2225 0.00000000000000e+00 2226 0.00000000000000e+00 2227 -7.50000000000000e-01 2228 0.00000000000000e+00 2229 2.50000000000000e-01 2230 -7.50000000000000e-01 2231 0.00000000000000e+00 2232 0.00000000000000e+00 2233 -5.00000000000000e-01 2234 0.00000000000000e+00 2235 2.50000000000000e-01 2236 -5.00000000000000e-01 2237 0.00000000000000e+00 2238 2.50000000000000e-01 2239 -7.50000000000000e-01 2240 0.00000000000000e+00 2241 5.00000000000000e-01 2242 -2.50000000000000e-01 2243 0.00000000000000e+00 2244 7.50000000000000e-01 2245 0.00000000000000e+00 2246 0.00000000000000e+00 2247 7.50000000000000e-01 2248 -2.50000000000000e-01 2249 0.00000000000000e+00 2250 5.00000000000000e-01 2251 0.00000000000000e+00 2252 0.00000000000000e+00 2253 5.00000000000000e-01 2254 -2.50000000000000e-01 2255 0.00000000000000e+00 2256 7.50000000000000e-01 2257 -2.50000000000000e-01 2258 0.00000000000000e+00 2259 5.00000000000000e-01 2260 -7.50000000000000e-01 2261 0.00000000000000e+00 2262 7.50000000000000e-01 2263 -5.00000000000000e-01 2264 0.00000000000000e+00 2265 7.50000000000000e-01 2266 -7.50000000000000e-01 2267 0.00000000000000e+00 2268 5.00000000000000e-01 2269 -5.00000000000000e-01 2270 0.00000000000000e+00 2271 5.00000000000000e-01 2272 -7.50000000000000e-01 2273 0.00000000000000e+00 2274 7.50000000000000e-01 2275 -5.00000000000000e-01 2276 0.00000000000000e+00 2277 2.50000000000000e-01 2278 -1.50000000000000e+00 2279 0.00000000000000e+00 2280 0.00000000000000e+00 2281 -1.50000000000000e+00 2282 0.00000000000000e+00 2283 2.50000000000000e-01 2284 -1.50000000000000e+00 2285 0.00000000000000e+00 2286 2.50000000000000e-01 2287 -1.75000000000000e+00 2288 0.00000000000000e+00 2289 0.00000000000000e+00 2290 -1.75000000000000e+00 2291 0.00000000000000e+00 2292 2.50000000000000e-01 2293 -1.75000000000000e+00 2294 0.00000000000000e+00 2295 5.00000000000000e-01 2296 -1.25000000000000e+00 2297 0.00000000000000e+00 2298 5.00000000000000e-01 2299 -1.00000000000000e+00 2300 0.00000000000000e+00 2301 5.00000000000000e-01 2302 -1.25000000000000e+00 2303 0.00000000000000e+00 2304 7.50000000000000e-01 2305 -1.25000000000000e+00 2306 0.00000000000000e+00 2307 7.50000000000000e-01 2308 -1.00000000000000e+00 2309 0.00000000000000e+00 2310 7.50000000000000e-01 2311 -1.25000000000000e+00 2312 0.00000000000000e+00 2313 5.00000000000000e-01 2314 -1.50000000000000e+00 2315 0.00000000000000e+00 2316 5.00000000000000e-01 2317 -1.75000000000000e+00 2318 0.00000000000000e+00 2319 5.00000000000000e-01 2320 -1.75000000000000e+00 2321 0.00000000000000e+00 2322 7.50000000000000e-01 2323 -1.50000000000000e+00 2324 0.00000000000000e+00 2325 7.50000000000000e-01 2326 -1.50000000000000e+00 2327 0.00000000000000e+00 2328 7.50000000000000e-01 2329 -1.75000000000000e+00 2330 0.00000000000000e+00 2331 0.00000000000000e+00 2332 -1.25000000000000e+00 2333 0.00000000000000e+00 2334 2.50000000000000e-01 2335 -1.00000000000000e+00 2336 0.00000000000000e+00 2337 2.50000000000000e-01 2338 -1.25000000000000e+00 2339 0.00000000000000e+00 2340 0.00000000000000e+00 2341 -1.25000000000000e+00 2342 0.00000000000000e+00 2343 2.50000000000000e-01 2344 -1.00000000000000e+00 2345 0.00000000000000e+00 2346 2.50000000000000e-01 2347 -1.25000000000000e+00 2348 0.00000000000000e+00 2349 2.50000000000000e-01 2350 -1.50000000000000e+00 2351 0.00000000000000e+00 2352 0.00000000000000e+00 2353 -1.75000000000000e+00 2354 0.00000000000000e+00 2355 2.50000000000000e-01 2356 -1.75000000000000e+00 2357 0.00000000000000e+00 2358 0.00000000000000e+00 2359 -1.50000000000000e+00 2360 0.00000000000000e+00 2361 2.50000000000000e-01 2362 -1.50000000000000e+00 2363 0.00000000000000e+00 2364 2.50000000000000e-01 2365 -1.75000000000000e+00 2366 0.00000000000000e+00 2367 5.00000000000000e-01 2368 -1.25000000000000e+00 2369 0.00000000000000e+00 2370 7.50000000000000e-01 2371 -1.00000000000000e+00 2372 0.00000000000000e+00 2373 7.50000000000000e-01 2374 -1.25000000000000e+00 2375 0.00000000000000e+00 2376 5.00000000000000e-01 2377 -1.00000000000000e+00 2378 0.00000000000000e+00 2379 5.00000000000000e-01 2380 -1.25000000000000e+00 2381 0.00000000000000e+00 2382 7.50000000000000e-01 2383 -1.25000000000000e+00 2384 0.00000000000000e+00 2385 5.00000000000000e-01 2386 -1.75000000000000e+00 2387 0.00000000000000e+00 2388 7.50000000000000e-01 2389 -1.50000000000000e+00 2390 0.00000000000000e+00 2391 7.50000000000000e-01 2392 -1.75000000000000e+00 2393 0.00000000000000e+00 2394 5.00000000000000e-01 2395 -1.50000000000000e+00 2396 0.00000000000000e+00 2397 5.00000000000000e-01 2398 -1.75000000000000e+00 2399 0.00000000000000e+00 2400 7.50000000000000e-01 2401 -1.50000000000000e+00 2402 0.00000000000000e+00 2403 1.00000000000000e+00 2404 -5.00000000000000e-01 2405 0.00000000000000e+00 2406 1.00000000000000e+00 2407 -7.50000000000000e-01 2408 0.00000000000000e+00 2409 1.00000000000000e+00 2410 -2.50000000000000e-01 2411 0.00000000000000e+00 2412 1.00000000000000e+00 2413 -2.50000000000000e-01 2414 0.00000000000000e+00 2415 1.00000000000000e+00 2416 -7.50000000000000e-01 2417 0.00000000000000e+00 2418 1.00000000000000e+00 2419 -5.00000000000000e-01 2420 0.00000000000000e+00 2421 1.00000000000000e+00 2422 -1.50000000000000e+00 2423 0.00000000000000e+00 2424 1.00000000000000e+00 2425 -1.75000000000000e+00 2426 0.00000000000000e+00 2427 1.00000000000000e+00 2428 -1.25000000000000e+00 2429 0.00000000000000e+00 2430 1.00000000000000e+00 2431 -1.25000000000000e+00 2432 0.00000000000000e+00 2433 1.00000000000000e+00 2434 -1.75000000000000e+00 2435 0.00000000000000e+00 2436 1.00000000000000e+00 2437 -1.50000000000000e+00 2438 0.00000000000000e+00 2439 2.50000000000000e-01 2440 -5.00000000000000e-01 2441 0.00000000000000e+00 2442 2.50000000000000e-01 2443 -7.50000000000000e-01 2444 0.00000000000000e+00 2445 5.00000000000000e-01 2446 -2.50000000000000e-01 2447 0.00000000000000e+00 2448 7.50000000000000e-01 2449 -2.50000000000000e-01 2450 0.00000000000000e+00 2451 5.00000000000000e-01 2452 -7.50000000000000e-01 2453 0.00000000000000e+00 2454 7.50000000000000e-01 2455 -5.00000000000000e-01 2456 0.00000000000000e+00 2457 2.50000000000000e-01 2458 -1.50000000000000e+00 2459 0.00000000000000e+00 2460 2.50000000000000e-01 2461 -1.75000000000000e+00 2462 0.00000000000000e+00 2463 5.00000000000000e-01 2464 -1.25000000000000e+00 2465 0.00000000000000e+00 2466 7.50000000000000e-01 2467 -1.25000000000000e+00 2468 0.00000000000000e+00 2469 5.00000000000000e-01 2470 -1.75000000000000e+00 2471 0.00000000000000e+00 2472 7.50000000000000e-01 2473 -1.50000000000000e+00 2474 0.00000000000000e+00 hypre-2.33.0/src/test/TEST_ij/data/beam_tet_dof2475_np4/rbms.1.00000000066400000000000000000000410671477326011500240620ustar00rootroot000000000000000 675 0 0.00000000000000e+00 1 0.00000000000000e+00 2 0.00000000000000e+00 3 0.00000000000000e+00 4 0.00000000000000e+00 5 0.00000000000000e+00 6 0.00000000000000e+00 7 0.00000000000000e+00 8 0.00000000000000e+00 9 0.00000000000000e+00 10 0.00000000000000e+00 11 -1.00000000000000e+00 12 0.00000000000000e+00 13 0.00000000000000e+00 14 -1.00000000000000e+00 15 0.00000000000000e+00 16 0.00000000000000e+00 17 -1.00000000000000e+00 18 0.00000000000000e+00 19 1.00000000000000e+00 20 0.00000000000000e+00 21 0.00000000000000e+00 22 1.00000000000000e+00 23 0.00000000000000e+00 24 0.00000000000000e+00 25 1.00000000000000e+00 26 0.00000000000000e+00 27 0.00000000000000e+00 28 1.00000000000000e+00 29 -1.00000000000000e+00 30 0.00000000000000e+00 31 1.00000000000000e+00 32 -1.00000000000000e+00 33 0.00000000000000e+00 34 1.00000000000000e+00 35 -1.00000000000000e+00 36 0.00000000000000e+00 37 0.00000000000000e+00 38 0.00000000000000e+00 39 0.00000000000000e+00 40 0.00000000000000e+00 41 -5.00000000000000e-01 42 0.00000000000000e+00 43 0.00000000000000e+00 44 -5.00000000000000e-01 45 0.00000000000000e+00 46 5.00000000000000e-01 47 0.00000000000000e+00 48 0.00000000000000e+00 49 5.00000000000000e-01 50 0.00000000000000e+00 51 0.00000000000000e+00 52 5.00000000000000e-01 53 -5.00000000000000e-01 54 0.00000000000000e+00 55 5.00000000000000e-01 56 -5.00000000000000e-01 57 0.00000000000000e+00 58 0.00000000000000e+00 59 0.00000000000000e+00 60 0.00000000000000e+00 61 0.00000000000000e+00 62 -5.00000000000000e-01 63 0.00000000000000e+00 64 0.00000000000000e+00 65 -5.00000000000000e-01 66 0.00000000000000e+00 67 5.00000000000000e-01 68 0.00000000000000e+00 69 0.00000000000000e+00 70 5.00000000000000e-01 71 0.00000000000000e+00 72 0.00000000000000e+00 73 5.00000000000000e-01 74 -5.00000000000000e-01 75 0.00000000000000e+00 76 5.00000000000000e-01 77 -5.00000000000000e-01 78 0.00000000000000e+00 79 0.00000000000000e+00 80 -5.00000000000000e-01 81 0.00000000000000e+00 82 5.00000000000000e-01 83 0.00000000000000e+00 84 0.00000000000000e+00 85 5.00000000000000e-01 86 -5.00000000000000e-01 87 0.00000000000000e+00 88 0.00000000000000e+00 89 -1.00000000000000e+00 90 0.00000000000000e+00 91 5.00000000000000e-01 92 -1.00000000000000e+00 93 0.00000000000000e+00 94 5.00000000000000e-01 95 -1.00000000000000e+00 96 0.00000000000000e+00 97 0.00000000000000e+00 98 -1.00000000000000e+00 99 0.00000000000000e+00 100 5.00000000000000e-01 101 -1.00000000000000e+00 102 0.00000000000000e+00 103 5.00000000000000e-01 104 -1.00000000000000e+00 105 0.00000000000000e+00 106 5.00000000000000e-01 107 -1.00000000000000e+00 108 0.00000000000000e+00 109 1.00000000000000e+00 110 0.00000000000000e+00 111 0.00000000000000e+00 112 1.00000000000000e+00 113 -5.00000000000000e-01 114 0.00000000000000e+00 115 1.00000000000000e+00 116 -5.00000000000000e-01 117 0.00000000000000e+00 118 1.00000000000000e+00 119 0.00000000000000e+00 120 0.00000000000000e+00 121 1.00000000000000e+00 122 -5.00000000000000e-01 123 0.00000000000000e+00 124 1.00000000000000e+00 125 -5.00000000000000e-01 126 0.00000000000000e+00 127 1.00000000000000e+00 128 -5.00000000000000e-01 129 0.00000000000000e+00 130 1.00000000000000e+00 131 -1.00000000000000e+00 132 0.00000000000000e+00 133 1.00000000000000e+00 134 -1.00000000000000e+00 135 0.00000000000000e+00 136 0.00000000000000e+00 137 0.00000000000000e+00 138 0.00000000000000e+00 139 0.00000000000000e+00 140 -2.50000000000000e-01 141 0.00000000000000e+00 142 0.00000000000000e+00 143 -2.50000000000000e-01 144 0.00000000000000e+00 145 2.50000000000000e-01 146 0.00000000000000e+00 147 0.00000000000000e+00 148 2.50000000000000e-01 149 0.00000000000000e+00 150 0.00000000000000e+00 151 2.50000000000000e-01 152 -2.50000000000000e-01 153 0.00000000000000e+00 154 2.50000000000000e-01 155 -2.50000000000000e-01 156 0.00000000000000e+00 157 0.00000000000000e+00 158 0.00000000000000e+00 159 0.00000000000000e+00 160 0.00000000000000e+00 161 0.00000000000000e+00 162 0.00000000000000e+00 163 0.00000000000000e+00 164 -2.50000000000000e-01 165 0.00000000000000e+00 166 0.00000000000000e+00 167 -2.50000000000000e-01 168 0.00000000000000e+00 169 2.50000000000000e-01 170 0.00000000000000e+00 171 0.00000000000000e+00 172 2.50000000000000e-01 173 0.00000000000000e+00 174 0.00000000000000e+00 175 2.50000000000000e-01 176 -2.50000000000000e-01 177 0.00000000000000e+00 178 2.50000000000000e-01 179 -2.50000000000000e-01 180 0.00000000000000e+00 181 0.00000000000000e+00 182 0.00000000000000e+00 183 0.00000000000000e+00 184 0.00000000000000e+00 185 -2.50000000000000e-01 186 0.00000000000000e+00 187 2.50000000000000e-01 188 0.00000000000000e+00 189 0.00000000000000e+00 190 2.50000000000000e-01 191 -2.50000000000000e-01 192 0.00000000000000e+00 193 0.00000000000000e+00 194 -7.50000000000000e-01 195 0.00000000000000e+00 196 0.00000000000000e+00 197 -1.00000000000000e+00 198 0.00000000000000e+00 199 2.50000000000000e-01 200 -1.00000000000000e+00 201 0.00000000000000e+00 202 2.50000000000000e-01 203 -1.00000000000000e+00 204 0.00000000000000e+00 205 0.00000000000000e+00 206 -7.50000000000000e-01 207 0.00000000000000e+00 208 0.00000000000000e+00 209 -7.50000000000000e-01 210 0.00000000000000e+00 211 0.00000000000000e+00 212 -1.00000000000000e+00 213 0.00000000000000e+00 214 0.00000000000000e+00 215 -1.00000000000000e+00 216 0.00000000000000e+00 217 2.50000000000000e-01 218 -1.00000000000000e+00 219 0.00000000000000e+00 220 2.50000000000000e-01 221 -1.00000000000000e+00 222 0.00000000000000e+00 223 0.00000000000000e+00 224 -7.50000000000000e-01 225 0.00000000000000e+00 226 0.00000000000000e+00 227 -7.50000000000000e-01 228 0.00000000000000e+00 229 0.00000000000000e+00 230 -1.00000000000000e+00 231 0.00000000000000e+00 232 2.50000000000000e-01 233 -1.00000000000000e+00 234 0.00000000000000e+00 235 7.50000000000000e-01 236 0.00000000000000e+00 237 0.00000000000000e+00 238 1.00000000000000e+00 239 0.00000000000000e+00 240 0.00000000000000e+00 241 1.00000000000000e+00 242 -2.50000000000000e-01 243 0.00000000000000e+00 244 1.00000000000000e+00 245 -2.50000000000000e-01 246 0.00000000000000e+00 247 7.50000000000000e-01 248 0.00000000000000e+00 249 0.00000000000000e+00 250 7.50000000000000e-01 251 0.00000000000000e+00 252 0.00000000000000e+00 253 1.00000000000000e+00 254 0.00000000000000e+00 255 0.00000000000000e+00 256 1.00000000000000e+00 257 0.00000000000000e+00 258 0.00000000000000e+00 259 1.00000000000000e+00 260 -2.50000000000000e-01 261 0.00000000000000e+00 262 1.00000000000000e+00 263 -2.50000000000000e-01 264 0.00000000000000e+00 265 7.50000000000000e-01 266 0.00000000000000e+00 267 0.00000000000000e+00 268 7.50000000000000e-01 269 0.00000000000000e+00 270 0.00000000000000e+00 271 1.00000000000000e+00 272 0.00000000000000e+00 273 0.00000000000000e+00 274 1.00000000000000e+00 275 -2.50000000000000e-01 276 0.00000000000000e+00 277 7.50000000000000e-01 278 -7.50000000000000e-01 279 0.00000000000000e+00 280 7.50000000000000e-01 281 -1.00000000000000e+00 282 0.00000000000000e+00 283 1.00000000000000e+00 284 -7.50000000000000e-01 285 0.00000000000000e+00 286 1.00000000000000e+00 287 -1.00000000000000e+00 288 0.00000000000000e+00 289 7.50000000000000e-01 290 -7.50000000000000e-01 291 0.00000000000000e+00 292 7.50000000000000e-01 293 -7.50000000000000e-01 294 0.00000000000000e+00 295 7.50000000000000e-01 296 -1.00000000000000e+00 297 0.00000000000000e+00 298 7.50000000000000e-01 299 -1.00000000000000e+00 300 0.00000000000000e+00 301 1.00000000000000e+00 302 -7.50000000000000e-01 303 0.00000000000000e+00 304 1.00000000000000e+00 305 -7.50000000000000e-01 306 0.00000000000000e+00 307 1.00000000000000e+00 308 -1.00000000000000e+00 309 0.00000000000000e+00 310 1.00000000000000e+00 311 -1.00000000000000e+00 312 0.00000000000000e+00 313 7.50000000000000e-01 314 -7.50000000000000e-01 315 0.00000000000000e+00 316 7.50000000000000e-01 317 -7.50000000000000e-01 318 0.00000000000000e+00 319 7.50000000000000e-01 320 -1.00000000000000e+00 321 0.00000000000000e+00 322 7.50000000000000e-01 323 -1.00000000000000e+00 324 0.00000000000000e+00 325 1.00000000000000e+00 326 -7.50000000000000e-01 327 0.00000000000000e+00 328 1.00000000000000e+00 329 -7.50000000000000e-01 330 0.00000000000000e+00 331 1.00000000000000e+00 332 -1.00000000000000e+00 333 0.00000000000000e+00 334 0.00000000000000e+00 335 -2.50000000000000e-01 336 0.00000000000000e+00 337 2.50000000000000e-01 338 0.00000000000000e+00 339 0.00000000000000e+00 340 2.50000000000000e-01 341 -2.50000000000000e-01 342 0.00000000000000e+00 343 0.00000000000000e+00 344 -2.50000000000000e-01 345 0.00000000000000e+00 346 2.50000000000000e-01 347 0.00000000000000e+00 348 0.00000000000000e+00 349 2.50000000000000e-01 350 -2.50000000000000e-01 351 0.00000000000000e+00 352 0.00000000000000e+00 353 -5.00000000000000e-01 354 0.00000000000000e+00 355 2.50000000000000e-01 356 -5.00000000000000e-01 357 0.00000000000000e+00 358 2.50000000000000e-01 359 -5.00000000000000e-01 360 0.00000000000000e+00 361 0.00000000000000e+00 362 -7.50000000000000e-01 363 0.00000000000000e+00 364 2.50000000000000e-01 365 -7.50000000000000e-01 366 0.00000000000000e+00 367 2.50000000000000e-01 368 -7.50000000000000e-01 369 0.00000000000000e+00 370 2.50000000000000e-01 371 -5.00000000000000e-01 372 0.00000000000000e+00 373 0.00000000000000e+00 374 -5.00000000000000e-01 375 0.00000000000000e+00 376 2.50000000000000e-01 377 -5.00000000000000e-01 378 0.00000000000000e+00 379 0.00000000000000e+00 380 -7.50000000000000e-01 381 0.00000000000000e+00 382 2.50000000000000e-01 383 -7.50000000000000e-01 384 0.00000000000000e+00 385 2.50000000000000e-01 386 -7.50000000000000e-01 387 0.00000000000000e+00 388 5.00000000000000e-01 389 0.00000000000000e+00 390 0.00000000000000e+00 391 5.00000000000000e-01 392 -2.50000000000000e-01 393 0.00000000000000e+00 394 5.00000000000000e-01 395 -2.50000000000000e-01 396 0.00000000000000e+00 397 7.50000000000000e-01 398 0.00000000000000e+00 399 0.00000000000000e+00 400 7.50000000000000e-01 401 -2.50000000000000e-01 402 0.00000000000000e+00 403 7.50000000000000e-01 404 -2.50000000000000e-01 405 0.00000000000000e+00 406 5.00000000000000e-01 407 -2.50000000000000e-01 408 0.00000000000000e+00 409 5.00000000000000e-01 410 0.00000000000000e+00 411 0.00000000000000e+00 412 5.00000000000000e-01 413 -2.50000000000000e-01 414 0.00000000000000e+00 415 7.50000000000000e-01 416 0.00000000000000e+00 417 0.00000000000000e+00 418 7.50000000000000e-01 419 -2.50000000000000e-01 420 0.00000000000000e+00 421 7.50000000000000e-01 422 -2.50000000000000e-01 423 0.00000000000000e+00 424 5.00000000000000e-01 425 -5.00000000000000e-01 426 0.00000000000000e+00 427 5.00000000000000e-01 428 -7.50000000000000e-01 429 0.00000000000000e+00 430 5.00000000000000e-01 431 -7.50000000000000e-01 432 0.00000000000000e+00 433 7.50000000000000e-01 434 -5.00000000000000e-01 435 0.00000000000000e+00 436 7.50000000000000e-01 437 -5.00000000000000e-01 438 0.00000000000000e+00 439 7.50000000000000e-01 440 -7.50000000000000e-01 441 0.00000000000000e+00 442 5.00000000000000e-01 443 -5.00000000000000e-01 444 0.00000000000000e+00 445 5.00000000000000e-01 446 -7.50000000000000e-01 447 0.00000000000000e+00 448 5.00000000000000e-01 449 -7.50000000000000e-01 450 0.00000000000000e+00 451 7.50000000000000e-01 452 -5.00000000000000e-01 453 0.00000000000000e+00 454 7.50000000000000e-01 455 -5.00000000000000e-01 456 0.00000000000000e+00 457 7.50000000000000e-01 458 -7.50000000000000e-01 459 0.00000000000000e+00 460 0.00000000000000e+00 461 -2.50000000000000e-01 462 0.00000000000000e+00 463 2.50000000000000e-01 464 0.00000000000000e+00 465 0.00000000000000e+00 466 2.50000000000000e-01 467 -2.50000000000000e-01 468 0.00000000000000e+00 469 0.00000000000000e+00 470 -2.50000000000000e-01 471 0.00000000000000e+00 472 2.50000000000000e-01 473 0.00000000000000e+00 474 0.00000000000000e+00 475 2.50000000000000e-01 476 -2.50000000000000e-01 477 0.00000000000000e+00 478 0.00000000000000e+00 479 -5.00000000000000e-01 480 0.00000000000000e+00 481 2.50000000000000e-01 482 -5.00000000000000e-01 483 0.00000000000000e+00 484 2.50000000000000e-01 485 -5.00000000000000e-01 486 0.00000000000000e+00 487 0.00000000000000e+00 488 -7.50000000000000e-01 489 0.00000000000000e+00 490 2.50000000000000e-01 491 -7.50000000000000e-01 492 0.00000000000000e+00 493 2.50000000000000e-01 494 -7.50000000000000e-01 495 0.00000000000000e+00 496 2.50000000000000e-01 497 -5.00000000000000e-01 498 0.00000000000000e+00 499 0.00000000000000e+00 500 -5.00000000000000e-01 501 0.00000000000000e+00 502 2.50000000000000e-01 503 -5.00000000000000e-01 504 0.00000000000000e+00 505 0.00000000000000e+00 506 -7.50000000000000e-01 507 0.00000000000000e+00 508 2.50000000000000e-01 509 -7.50000000000000e-01 510 0.00000000000000e+00 511 2.50000000000000e-01 512 -7.50000000000000e-01 513 0.00000000000000e+00 514 5.00000000000000e-01 515 0.00000000000000e+00 516 0.00000000000000e+00 517 5.00000000000000e-01 518 -2.50000000000000e-01 519 0.00000000000000e+00 520 5.00000000000000e-01 521 -2.50000000000000e-01 522 0.00000000000000e+00 523 7.50000000000000e-01 524 0.00000000000000e+00 525 0.00000000000000e+00 526 7.50000000000000e-01 527 -2.50000000000000e-01 528 0.00000000000000e+00 529 7.50000000000000e-01 530 -2.50000000000000e-01 531 0.00000000000000e+00 532 5.00000000000000e-01 533 -2.50000000000000e-01 534 0.00000000000000e+00 535 5.00000000000000e-01 536 0.00000000000000e+00 537 0.00000000000000e+00 538 5.00000000000000e-01 539 -2.50000000000000e-01 540 0.00000000000000e+00 541 7.50000000000000e-01 542 0.00000000000000e+00 543 0.00000000000000e+00 544 7.50000000000000e-01 545 -2.50000000000000e-01 546 0.00000000000000e+00 547 7.50000000000000e-01 548 -2.50000000000000e-01 549 0.00000000000000e+00 550 5.00000000000000e-01 551 -5.00000000000000e-01 552 0.00000000000000e+00 553 5.00000000000000e-01 554 -7.50000000000000e-01 555 0.00000000000000e+00 556 5.00000000000000e-01 557 -7.50000000000000e-01 558 0.00000000000000e+00 559 7.50000000000000e-01 560 -5.00000000000000e-01 561 0.00000000000000e+00 562 7.50000000000000e-01 563 -5.00000000000000e-01 564 0.00000000000000e+00 565 7.50000000000000e-01 566 -7.50000000000000e-01 567 0.00000000000000e+00 568 5.00000000000000e-01 569 -5.00000000000000e-01 570 0.00000000000000e+00 571 5.00000000000000e-01 572 -7.50000000000000e-01 573 0.00000000000000e+00 574 5.00000000000000e-01 575 -7.50000000000000e-01 576 0.00000000000000e+00 577 7.50000000000000e-01 578 -5.00000000000000e-01 579 0.00000000000000e+00 580 7.50000000000000e-01 581 -5.00000000000000e-01 582 0.00000000000000e+00 583 7.50000000000000e-01 584 -7.50000000000000e-01 585 0.00000000000000e+00 586 2.50000000000000e-01 587 -5.00000000000000e-01 588 0.00000000000000e+00 589 2.50000000000000e-01 590 -7.50000000000000e-01 591 0.00000000000000e+00 592 5.00000000000000e-01 593 -2.50000000000000e-01 594 0.00000000000000e+00 595 7.50000000000000e-01 596 -2.50000000000000e-01 597 0.00000000000000e+00 598 5.00000000000000e-01 599 -7.50000000000000e-01 600 0.00000000000000e+00 601 7.50000000000000e-01 602 -5.00000000000000e-01 603 0.00000000000000e+00 604 2.50000000000000e-01 605 -1.00000000000000e+00 606 0.00000000000000e+00 607 2.50000000000000e-01 608 -1.00000000000000e+00 609 0.00000000000000e+00 610 5.00000000000000e-01 611 -1.00000000000000e+00 612 0.00000000000000e+00 613 7.50000000000000e-01 614 -1.00000000000000e+00 615 0.00000000000000e+00 616 5.00000000000000e-01 617 -1.00000000000000e+00 618 0.00000000000000e+00 619 7.50000000000000e-01 620 -1.00000000000000e+00 621 0.00000000000000e+00 622 2.50000000000000e-01 623 -1.00000000000000e+00 624 0.00000000000000e+00 625 2.50000000000000e-01 626 -1.00000000000000e+00 627 0.00000000000000e+00 628 5.00000000000000e-01 629 -1.00000000000000e+00 630 0.00000000000000e+00 631 7.50000000000000e-01 632 -1.00000000000000e+00 633 0.00000000000000e+00 634 5.00000000000000e-01 635 -1.00000000000000e+00 636 0.00000000000000e+00 637 7.50000000000000e-01 638 -1.00000000000000e+00 639 0.00000000000000e+00 640 1.00000000000000e+00 641 -2.50000000000000e-01 642 0.00000000000000e+00 643 1.00000000000000e+00 644 -2.50000000000000e-01 645 0.00000000000000e+00 646 1.00000000000000e+00 647 -5.00000000000000e-01 648 0.00000000000000e+00 649 1.00000000000000e+00 650 -7.50000000000000e-01 651 0.00000000000000e+00 652 1.00000000000000e+00 653 -5.00000000000000e-01 654 0.00000000000000e+00 655 1.00000000000000e+00 656 -7.50000000000000e-01 657 0.00000000000000e+00 658 1.00000000000000e+00 659 -2.50000000000000e-01 660 0.00000000000000e+00 661 1.00000000000000e+00 662 -2.50000000000000e-01 663 0.00000000000000e+00 664 1.00000000000000e+00 665 -5.00000000000000e-01 666 0.00000000000000e+00 667 1.00000000000000e+00 668 -7.50000000000000e-01 669 0.00000000000000e+00 670 1.00000000000000e+00 671 -5.00000000000000e-01 672 0.00000000000000e+00 673 1.00000000000000e+00 674 -7.50000000000000e-01 hypre-2.33.0/src/test/TEST_ij/data/beam_tet_dof2475_np4/rbms.1.00001000066400000000000000000000361241477326011500240610ustar00rootroot00000000000000675 1275 675 0.00000000000000e+00 676 0.00000000000000e+00 677 0.00000000000000e+00 678 0.00000000000000e+00 679 0.00000000000000e+00 680 0.00000000000000e+00 681 0.00000000000000e+00 682 0.00000000000000e+00 683 -1.00000000000000e+00 684 0.00000000000000e+00 685 0.00000000000000e+00 686 -1.00000000000000e+00 687 0.00000000000000e+00 688 1.00000000000000e+00 689 0.00000000000000e+00 690 0.00000000000000e+00 691 1.00000000000000e+00 692 0.00000000000000e+00 693 0.00000000000000e+00 694 1.00000000000000e+00 695 -1.00000000000000e+00 696 0.00000000000000e+00 697 1.00000000000000e+00 698 -1.00000000000000e+00 699 0.00000000000000e+00 700 0.00000000000000e+00 701 0.00000000000000e+00 702 0.00000000000000e+00 703 0.00000000000000e+00 704 -5.00000000000000e-01 705 0.00000000000000e+00 706 5.00000000000000e-01 707 0.00000000000000e+00 708 0.00000000000000e+00 709 5.00000000000000e-01 710 -5.00000000000000e-01 711 0.00000000000000e+00 712 0.00000000000000e+00 713 0.00000000000000e+00 714 0.00000000000000e+00 715 0.00000000000000e+00 716 -5.00000000000000e-01 717 0.00000000000000e+00 718 0.00000000000000e+00 719 -5.00000000000000e-01 720 0.00000000000000e+00 721 5.00000000000000e-01 722 0.00000000000000e+00 723 0.00000000000000e+00 724 5.00000000000000e-01 725 0.00000000000000e+00 726 0.00000000000000e+00 727 5.00000000000000e-01 728 -5.00000000000000e-01 729 0.00000000000000e+00 730 5.00000000000000e-01 731 -5.00000000000000e-01 732 0.00000000000000e+00 733 0.00000000000000e+00 734 -5.00000000000000e-01 735 0.00000000000000e+00 736 5.00000000000000e-01 737 0.00000000000000e+00 738 0.00000000000000e+00 739 5.00000000000000e-01 740 -5.00000000000000e-01 741 0.00000000000000e+00 742 0.00000000000000e+00 743 -1.00000000000000e+00 744 0.00000000000000e+00 745 5.00000000000000e-01 746 -1.00000000000000e+00 747 0.00000000000000e+00 748 0.00000000000000e+00 749 -1.00000000000000e+00 750 0.00000000000000e+00 751 5.00000000000000e-01 752 -1.00000000000000e+00 753 0.00000000000000e+00 754 5.00000000000000e-01 755 -1.00000000000000e+00 756 0.00000000000000e+00 757 5.00000000000000e-01 758 -1.00000000000000e+00 759 0.00000000000000e+00 760 1.00000000000000e+00 761 0.00000000000000e+00 762 0.00000000000000e+00 763 1.00000000000000e+00 764 -5.00000000000000e-01 765 0.00000000000000e+00 766 1.00000000000000e+00 767 0.00000000000000e+00 768 0.00000000000000e+00 769 1.00000000000000e+00 770 -5.00000000000000e-01 771 0.00000000000000e+00 772 1.00000000000000e+00 773 -5.00000000000000e-01 774 0.00000000000000e+00 775 1.00000000000000e+00 776 -5.00000000000000e-01 777 0.00000000000000e+00 778 1.00000000000000e+00 779 -1.00000000000000e+00 780 0.00000000000000e+00 781 1.00000000000000e+00 782 -1.00000000000000e+00 783 0.00000000000000e+00 784 0.00000000000000e+00 785 0.00000000000000e+00 786 0.00000000000000e+00 787 0.00000000000000e+00 788 -2.50000000000000e-01 789 0.00000000000000e+00 790 2.50000000000000e-01 791 0.00000000000000e+00 792 0.00000000000000e+00 793 2.50000000000000e-01 794 -2.50000000000000e-01 795 0.00000000000000e+00 796 0.00000000000000e+00 797 0.00000000000000e+00 798 0.00000000000000e+00 799 0.00000000000000e+00 800 0.00000000000000e+00 801 0.00000000000000e+00 802 0.00000000000000e+00 803 -2.50000000000000e-01 804 0.00000000000000e+00 805 0.00000000000000e+00 806 -2.50000000000000e-01 807 0.00000000000000e+00 808 2.50000000000000e-01 809 0.00000000000000e+00 810 0.00000000000000e+00 811 2.50000000000000e-01 812 0.00000000000000e+00 813 0.00000000000000e+00 814 2.50000000000000e-01 815 -2.50000000000000e-01 816 0.00000000000000e+00 817 2.50000000000000e-01 818 -2.50000000000000e-01 819 0.00000000000000e+00 820 0.00000000000000e+00 821 0.00000000000000e+00 822 0.00000000000000e+00 823 0.00000000000000e+00 824 -2.50000000000000e-01 825 0.00000000000000e+00 826 2.50000000000000e-01 827 0.00000000000000e+00 828 0.00000000000000e+00 829 2.50000000000000e-01 830 -2.50000000000000e-01 831 0.00000000000000e+00 832 0.00000000000000e+00 833 -1.00000000000000e+00 834 0.00000000000000e+00 835 2.50000000000000e-01 836 -1.00000000000000e+00 837 0.00000000000000e+00 838 0.00000000000000e+00 839 -7.50000000000000e-01 840 0.00000000000000e+00 841 0.00000000000000e+00 842 -7.50000000000000e-01 843 0.00000000000000e+00 844 0.00000000000000e+00 845 -1.00000000000000e+00 846 0.00000000000000e+00 847 0.00000000000000e+00 848 -1.00000000000000e+00 849 0.00000000000000e+00 850 2.50000000000000e-01 851 -1.00000000000000e+00 852 0.00000000000000e+00 853 2.50000000000000e-01 854 -1.00000000000000e+00 855 0.00000000000000e+00 856 0.00000000000000e+00 857 -7.50000000000000e-01 858 0.00000000000000e+00 859 0.00000000000000e+00 860 -7.50000000000000e-01 861 0.00000000000000e+00 862 0.00000000000000e+00 863 -1.00000000000000e+00 864 0.00000000000000e+00 865 2.50000000000000e-01 866 -1.00000000000000e+00 867 0.00000000000000e+00 868 1.00000000000000e+00 869 0.00000000000000e+00 870 0.00000000000000e+00 871 1.00000000000000e+00 872 -2.50000000000000e-01 873 0.00000000000000e+00 874 7.50000000000000e-01 875 0.00000000000000e+00 876 0.00000000000000e+00 877 7.50000000000000e-01 878 0.00000000000000e+00 879 0.00000000000000e+00 880 1.00000000000000e+00 881 0.00000000000000e+00 882 0.00000000000000e+00 883 1.00000000000000e+00 884 0.00000000000000e+00 885 0.00000000000000e+00 886 1.00000000000000e+00 887 -2.50000000000000e-01 888 0.00000000000000e+00 889 1.00000000000000e+00 890 -2.50000000000000e-01 891 0.00000000000000e+00 892 7.50000000000000e-01 893 0.00000000000000e+00 894 0.00000000000000e+00 895 7.50000000000000e-01 896 0.00000000000000e+00 897 0.00000000000000e+00 898 1.00000000000000e+00 899 0.00000000000000e+00 900 0.00000000000000e+00 901 1.00000000000000e+00 902 -2.50000000000000e-01 903 0.00000000000000e+00 904 1.00000000000000e+00 905 -1.00000000000000e+00 906 0.00000000000000e+00 907 7.50000000000000e-01 908 -7.50000000000000e-01 909 0.00000000000000e+00 910 7.50000000000000e-01 911 -7.50000000000000e-01 912 0.00000000000000e+00 913 7.50000000000000e-01 914 -1.00000000000000e+00 915 0.00000000000000e+00 916 7.50000000000000e-01 917 -1.00000000000000e+00 918 0.00000000000000e+00 919 1.00000000000000e+00 920 -7.50000000000000e-01 921 0.00000000000000e+00 922 1.00000000000000e+00 923 -7.50000000000000e-01 924 0.00000000000000e+00 925 1.00000000000000e+00 926 -1.00000000000000e+00 927 0.00000000000000e+00 928 1.00000000000000e+00 929 -1.00000000000000e+00 930 0.00000000000000e+00 931 7.50000000000000e-01 932 -7.50000000000000e-01 933 0.00000000000000e+00 934 7.50000000000000e-01 935 -7.50000000000000e-01 936 0.00000000000000e+00 937 7.50000000000000e-01 938 -1.00000000000000e+00 939 0.00000000000000e+00 940 7.50000000000000e-01 941 -1.00000000000000e+00 942 0.00000000000000e+00 943 1.00000000000000e+00 944 -7.50000000000000e-01 945 0.00000000000000e+00 946 1.00000000000000e+00 947 -7.50000000000000e-01 948 0.00000000000000e+00 949 1.00000000000000e+00 950 -1.00000000000000e+00 951 0.00000000000000e+00 952 0.00000000000000e+00 953 -2.50000000000000e-01 954 0.00000000000000e+00 955 2.50000000000000e-01 956 0.00000000000000e+00 957 0.00000000000000e+00 958 2.50000000000000e-01 959 -2.50000000000000e-01 960 0.00000000000000e+00 961 0.00000000000000e+00 962 -2.50000000000000e-01 963 0.00000000000000e+00 964 2.50000000000000e-01 965 0.00000000000000e+00 966 0.00000000000000e+00 967 2.50000000000000e-01 968 -2.50000000000000e-01 969 0.00000000000000e+00 970 0.00000000000000e+00 971 -5.00000000000000e-01 972 0.00000000000000e+00 973 2.50000000000000e-01 974 -5.00000000000000e-01 975 0.00000000000000e+00 976 0.00000000000000e+00 977 -7.50000000000000e-01 978 0.00000000000000e+00 979 2.50000000000000e-01 980 -7.50000000000000e-01 981 0.00000000000000e+00 982 2.50000000000000e-01 983 -5.00000000000000e-01 984 0.00000000000000e+00 985 0.00000000000000e+00 986 -5.00000000000000e-01 987 0.00000000000000e+00 988 2.50000000000000e-01 989 -5.00000000000000e-01 990 0.00000000000000e+00 991 0.00000000000000e+00 992 -7.50000000000000e-01 993 0.00000000000000e+00 994 2.50000000000000e-01 995 -7.50000000000000e-01 996 0.00000000000000e+00 997 2.50000000000000e-01 998 -7.50000000000000e-01 999 0.00000000000000e+00 1000 5.00000000000000e-01 1001 0.00000000000000e+00 1002 0.00000000000000e+00 1003 5.00000000000000e-01 1004 -2.50000000000000e-01 1005 0.00000000000000e+00 1006 7.50000000000000e-01 1007 0.00000000000000e+00 1008 0.00000000000000e+00 1009 7.50000000000000e-01 1010 -2.50000000000000e-01 1011 0.00000000000000e+00 1012 5.00000000000000e-01 1013 -2.50000000000000e-01 1014 0.00000000000000e+00 1015 5.00000000000000e-01 1016 0.00000000000000e+00 1017 0.00000000000000e+00 1018 5.00000000000000e-01 1019 -2.50000000000000e-01 1020 0.00000000000000e+00 1021 7.50000000000000e-01 1022 0.00000000000000e+00 1023 0.00000000000000e+00 1024 7.50000000000000e-01 1025 -2.50000000000000e-01 1026 0.00000000000000e+00 1027 7.50000000000000e-01 1028 -2.50000000000000e-01 1029 0.00000000000000e+00 1030 5.00000000000000e-01 1031 -5.00000000000000e-01 1032 0.00000000000000e+00 1033 5.00000000000000e-01 1034 -7.50000000000000e-01 1035 0.00000000000000e+00 1036 7.50000000000000e-01 1037 -5.00000000000000e-01 1038 0.00000000000000e+00 1039 7.50000000000000e-01 1040 -7.50000000000000e-01 1041 0.00000000000000e+00 1042 5.00000000000000e-01 1043 -5.00000000000000e-01 1044 0.00000000000000e+00 1045 5.00000000000000e-01 1046 -7.50000000000000e-01 1047 0.00000000000000e+00 1048 5.00000000000000e-01 1049 -7.50000000000000e-01 1050 0.00000000000000e+00 1051 7.50000000000000e-01 1052 -5.00000000000000e-01 1053 0.00000000000000e+00 1054 7.50000000000000e-01 1055 -5.00000000000000e-01 1056 0.00000000000000e+00 1057 7.50000000000000e-01 1058 -7.50000000000000e-01 1059 0.00000000000000e+00 1060 0.00000000000000e+00 1061 -2.50000000000000e-01 1062 0.00000000000000e+00 1063 2.50000000000000e-01 1064 0.00000000000000e+00 1065 0.00000000000000e+00 1066 2.50000000000000e-01 1067 -2.50000000000000e-01 1068 0.00000000000000e+00 1069 0.00000000000000e+00 1070 -2.50000000000000e-01 1071 0.00000000000000e+00 1072 2.50000000000000e-01 1073 0.00000000000000e+00 1074 0.00000000000000e+00 1075 2.50000000000000e-01 1076 -2.50000000000000e-01 1077 0.00000000000000e+00 1078 0.00000000000000e+00 1079 -5.00000000000000e-01 1080 0.00000000000000e+00 1081 2.50000000000000e-01 1082 -5.00000000000000e-01 1083 0.00000000000000e+00 1084 2.50000000000000e-01 1085 -5.00000000000000e-01 1086 0.00000000000000e+00 1087 0.00000000000000e+00 1088 -7.50000000000000e-01 1089 0.00000000000000e+00 1090 2.50000000000000e-01 1091 -7.50000000000000e-01 1092 0.00000000000000e+00 1093 2.50000000000000e-01 1094 -7.50000000000000e-01 1095 0.00000000000000e+00 1096 2.50000000000000e-01 1097 -5.00000000000000e-01 1098 0.00000000000000e+00 1099 0.00000000000000e+00 1100 -5.00000000000000e-01 1101 0.00000000000000e+00 1102 2.50000000000000e-01 1103 -5.00000000000000e-01 1104 0.00000000000000e+00 1105 0.00000000000000e+00 1106 -7.50000000000000e-01 1107 0.00000000000000e+00 1108 2.50000000000000e-01 1109 -7.50000000000000e-01 1110 0.00000000000000e+00 1111 2.50000000000000e-01 1112 -7.50000000000000e-01 1113 0.00000000000000e+00 1114 5.00000000000000e-01 1115 0.00000000000000e+00 1116 0.00000000000000e+00 1117 5.00000000000000e-01 1118 -2.50000000000000e-01 1119 0.00000000000000e+00 1120 5.00000000000000e-01 1121 -2.50000000000000e-01 1122 0.00000000000000e+00 1123 7.50000000000000e-01 1124 0.00000000000000e+00 1125 0.00000000000000e+00 1126 7.50000000000000e-01 1127 -2.50000000000000e-01 1128 0.00000000000000e+00 1129 7.50000000000000e-01 1130 -2.50000000000000e-01 1131 0.00000000000000e+00 1132 5.00000000000000e-01 1133 -2.50000000000000e-01 1134 0.00000000000000e+00 1135 5.00000000000000e-01 1136 0.00000000000000e+00 1137 0.00000000000000e+00 1138 5.00000000000000e-01 1139 -2.50000000000000e-01 1140 0.00000000000000e+00 1141 7.50000000000000e-01 1142 0.00000000000000e+00 1143 0.00000000000000e+00 1144 7.50000000000000e-01 1145 -2.50000000000000e-01 1146 0.00000000000000e+00 1147 7.50000000000000e-01 1148 -2.50000000000000e-01 1149 0.00000000000000e+00 1150 5.00000000000000e-01 1151 -5.00000000000000e-01 1152 0.00000000000000e+00 1153 5.00000000000000e-01 1154 -7.50000000000000e-01 1155 0.00000000000000e+00 1156 5.00000000000000e-01 1157 -7.50000000000000e-01 1158 0.00000000000000e+00 1159 7.50000000000000e-01 1160 -5.00000000000000e-01 1161 0.00000000000000e+00 1162 7.50000000000000e-01 1163 -5.00000000000000e-01 1164 0.00000000000000e+00 1165 7.50000000000000e-01 1166 -7.50000000000000e-01 1167 0.00000000000000e+00 1168 5.00000000000000e-01 1169 -5.00000000000000e-01 1170 0.00000000000000e+00 1171 5.00000000000000e-01 1172 -7.50000000000000e-01 1173 0.00000000000000e+00 1174 5.00000000000000e-01 1175 -7.50000000000000e-01 1176 0.00000000000000e+00 1177 7.50000000000000e-01 1178 -5.00000000000000e-01 1179 0.00000000000000e+00 1180 7.50000000000000e-01 1181 -5.00000000000000e-01 1182 0.00000000000000e+00 1183 7.50000000000000e-01 1184 -7.50000000000000e-01 1185 0.00000000000000e+00 1186 2.50000000000000e-01 1187 -5.00000000000000e-01 1188 0.00000000000000e+00 1189 2.50000000000000e-01 1190 -7.50000000000000e-01 1191 0.00000000000000e+00 1192 5.00000000000000e-01 1193 -2.50000000000000e-01 1194 0.00000000000000e+00 1195 7.50000000000000e-01 1196 -2.50000000000000e-01 1197 0.00000000000000e+00 1198 5.00000000000000e-01 1199 -7.50000000000000e-01 1200 0.00000000000000e+00 1201 7.50000000000000e-01 1202 -5.00000000000000e-01 1203 0.00000000000000e+00 1204 2.50000000000000e-01 1205 -1.00000000000000e+00 1206 0.00000000000000e+00 1207 2.50000000000000e-01 1208 -1.00000000000000e+00 1209 0.00000000000000e+00 1210 5.00000000000000e-01 1211 -1.00000000000000e+00 1212 0.00000000000000e+00 1213 7.50000000000000e-01 1214 -1.00000000000000e+00 1215 0.00000000000000e+00 1216 5.00000000000000e-01 1217 -1.00000000000000e+00 1218 0.00000000000000e+00 1219 7.50000000000000e-01 1220 -1.00000000000000e+00 1221 0.00000000000000e+00 1222 2.50000000000000e-01 1223 -1.00000000000000e+00 1224 0.00000000000000e+00 1225 2.50000000000000e-01 1226 -1.00000000000000e+00 1227 0.00000000000000e+00 1228 5.00000000000000e-01 1229 -1.00000000000000e+00 1230 0.00000000000000e+00 1231 7.50000000000000e-01 1232 -1.00000000000000e+00 1233 0.00000000000000e+00 1234 5.00000000000000e-01 1235 -1.00000000000000e+00 1236 0.00000000000000e+00 1237 7.50000000000000e-01 1238 -1.00000000000000e+00 1239 0.00000000000000e+00 1240 1.00000000000000e+00 1241 -2.50000000000000e-01 1242 0.00000000000000e+00 1243 1.00000000000000e+00 1244 -2.50000000000000e-01 1245 0.00000000000000e+00 1246 1.00000000000000e+00 1247 -5.00000000000000e-01 1248 0.00000000000000e+00 1249 1.00000000000000e+00 1250 -7.50000000000000e-01 1251 0.00000000000000e+00 1252 1.00000000000000e+00 1253 -5.00000000000000e-01 1254 0.00000000000000e+00 1255 1.00000000000000e+00 1256 -7.50000000000000e-01 1257 0.00000000000000e+00 1258 1.00000000000000e+00 1259 -2.50000000000000e-01 1260 0.00000000000000e+00 1261 1.00000000000000e+00 1262 -2.50000000000000e-01 1263 0.00000000000000e+00 1264 1.00000000000000e+00 1265 -5.00000000000000e-01 1266 0.00000000000000e+00 1267 1.00000000000000e+00 1268 -7.50000000000000e-01 1269 0.00000000000000e+00 1270 1.00000000000000e+00 1271 -5.00000000000000e-01 1272 0.00000000000000e+00 1273 1.00000000000000e+00 1274 -7.50000000000000e-01 hypre-2.33.0/src/test/TEST_ij/data/beam_tet_dof2475_np4/rbms.1.00002000066400000000000000000000366321477326011500240660ustar00rootroot000000000000001275 1875 1275 0.00000000000000e+00 1276 0.00000000000000e+00 1277 0.00000000000000e+00 1278 0.00000000000000e+00 1279 0.00000000000000e+00 1280 0.00000000000000e+00 1281 0.00000000000000e+00 1282 0.00000000000000e+00 1283 -1.00000000000000e+00 1284 0.00000000000000e+00 1285 0.00000000000000e+00 1286 -1.00000000000000e+00 1287 0.00000000000000e+00 1288 1.00000000000000e+00 1289 0.00000000000000e+00 1290 0.00000000000000e+00 1291 1.00000000000000e+00 1292 0.00000000000000e+00 1293 0.00000000000000e+00 1294 1.00000000000000e+00 1295 -1.00000000000000e+00 1296 0.00000000000000e+00 1297 1.00000000000000e+00 1298 -1.00000000000000e+00 1299 0.00000000000000e+00 1300 0.00000000000000e+00 1301 0.00000000000000e+00 1302 0.00000000000000e+00 1303 0.00000000000000e+00 1304 -5.00000000000000e-01 1305 0.00000000000000e+00 1306 0.00000000000000e+00 1307 -5.00000000000000e-01 1308 0.00000000000000e+00 1309 5.00000000000000e-01 1310 0.00000000000000e+00 1311 0.00000000000000e+00 1312 5.00000000000000e-01 1313 0.00000000000000e+00 1314 0.00000000000000e+00 1315 5.00000000000000e-01 1316 -5.00000000000000e-01 1317 0.00000000000000e+00 1318 5.00000000000000e-01 1319 -5.00000000000000e-01 1320 0.00000000000000e+00 1321 0.00000000000000e+00 1322 0.00000000000000e+00 1323 0.00000000000000e+00 1324 0.00000000000000e+00 1325 -5.00000000000000e-01 1326 0.00000000000000e+00 1327 0.00000000000000e+00 1328 -5.00000000000000e-01 1329 0.00000000000000e+00 1330 5.00000000000000e-01 1331 0.00000000000000e+00 1332 0.00000000000000e+00 1333 5.00000000000000e-01 1334 0.00000000000000e+00 1335 0.00000000000000e+00 1336 5.00000000000000e-01 1337 -5.00000000000000e-01 1338 0.00000000000000e+00 1339 5.00000000000000e-01 1340 -5.00000000000000e-01 1341 0.00000000000000e+00 1342 0.00000000000000e+00 1343 -1.00000000000000e+00 1344 0.00000000000000e+00 1345 5.00000000000000e-01 1346 -1.00000000000000e+00 1347 0.00000000000000e+00 1348 5.00000000000000e-01 1349 -1.00000000000000e+00 1350 0.00000000000000e+00 1351 0.00000000000000e+00 1352 -1.00000000000000e+00 1353 0.00000000000000e+00 1354 5.00000000000000e-01 1355 -1.00000000000000e+00 1356 0.00000000000000e+00 1357 5.00000000000000e-01 1358 -1.00000000000000e+00 1359 0.00000000000000e+00 1360 1.00000000000000e+00 1361 0.00000000000000e+00 1362 0.00000000000000e+00 1363 1.00000000000000e+00 1364 -5.00000000000000e-01 1365 0.00000000000000e+00 1366 1.00000000000000e+00 1367 -5.00000000000000e-01 1368 0.00000000000000e+00 1369 1.00000000000000e+00 1370 0.00000000000000e+00 1371 0.00000000000000e+00 1372 1.00000000000000e+00 1373 -5.00000000000000e-01 1374 0.00000000000000e+00 1375 1.00000000000000e+00 1376 -5.00000000000000e-01 1377 0.00000000000000e+00 1378 1.00000000000000e+00 1379 -1.00000000000000e+00 1380 0.00000000000000e+00 1381 1.00000000000000e+00 1382 -1.00000000000000e+00 1383 0.00000000000000e+00 1384 0.00000000000000e+00 1385 0.00000000000000e+00 1386 0.00000000000000e+00 1387 0.00000000000000e+00 1388 -2.50000000000000e-01 1389 0.00000000000000e+00 1390 0.00000000000000e+00 1391 -2.50000000000000e-01 1392 0.00000000000000e+00 1393 2.50000000000000e-01 1394 0.00000000000000e+00 1395 0.00000000000000e+00 1396 2.50000000000000e-01 1397 0.00000000000000e+00 1398 0.00000000000000e+00 1399 2.50000000000000e-01 1400 -2.50000000000000e-01 1401 0.00000000000000e+00 1402 2.50000000000000e-01 1403 -2.50000000000000e-01 1404 0.00000000000000e+00 1405 0.00000000000000e+00 1406 0.00000000000000e+00 1407 0.00000000000000e+00 1408 0.00000000000000e+00 1409 0.00000000000000e+00 1410 0.00000000000000e+00 1411 0.00000000000000e+00 1412 -2.50000000000000e-01 1413 0.00000000000000e+00 1414 0.00000000000000e+00 1415 -2.50000000000000e-01 1416 0.00000000000000e+00 1417 2.50000000000000e-01 1418 0.00000000000000e+00 1419 0.00000000000000e+00 1420 2.50000000000000e-01 1421 0.00000000000000e+00 1422 0.00000000000000e+00 1423 2.50000000000000e-01 1424 -2.50000000000000e-01 1425 0.00000000000000e+00 1426 2.50000000000000e-01 1427 -2.50000000000000e-01 1428 0.00000000000000e+00 1429 0.00000000000000e+00 1430 0.00000000000000e+00 1431 0.00000000000000e+00 1432 0.00000000000000e+00 1433 -7.50000000000000e-01 1434 0.00000000000000e+00 1435 0.00000000000000e+00 1436 -1.00000000000000e+00 1437 0.00000000000000e+00 1438 2.50000000000000e-01 1439 -1.00000000000000e+00 1440 0.00000000000000e+00 1441 2.50000000000000e-01 1442 -1.00000000000000e+00 1443 0.00000000000000e+00 1444 0.00000000000000e+00 1445 -7.50000000000000e-01 1446 0.00000000000000e+00 1447 0.00000000000000e+00 1448 -7.50000000000000e-01 1449 0.00000000000000e+00 1450 0.00000000000000e+00 1451 -1.00000000000000e+00 1452 0.00000000000000e+00 1453 0.00000000000000e+00 1454 -1.00000000000000e+00 1455 0.00000000000000e+00 1456 2.50000000000000e-01 1457 -1.00000000000000e+00 1458 0.00000000000000e+00 1459 2.50000000000000e-01 1460 -1.00000000000000e+00 1461 0.00000000000000e+00 1462 0.00000000000000e+00 1463 -7.50000000000000e-01 1464 0.00000000000000e+00 1465 0.00000000000000e+00 1466 -1.00000000000000e+00 1467 0.00000000000000e+00 1468 7.50000000000000e-01 1469 0.00000000000000e+00 1470 0.00000000000000e+00 1471 1.00000000000000e+00 1472 0.00000000000000e+00 1473 0.00000000000000e+00 1474 1.00000000000000e+00 1475 -2.50000000000000e-01 1476 0.00000000000000e+00 1477 1.00000000000000e+00 1478 -2.50000000000000e-01 1479 0.00000000000000e+00 1480 7.50000000000000e-01 1481 0.00000000000000e+00 1482 0.00000000000000e+00 1483 7.50000000000000e-01 1484 0.00000000000000e+00 1485 0.00000000000000e+00 1486 1.00000000000000e+00 1487 0.00000000000000e+00 1488 0.00000000000000e+00 1489 1.00000000000000e+00 1490 0.00000000000000e+00 1491 0.00000000000000e+00 1492 1.00000000000000e+00 1493 -2.50000000000000e-01 1494 0.00000000000000e+00 1495 1.00000000000000e+00 1496 -2.50000000000000e-01 1497 0.00000000000000e+00 1498 7.50000000000000e-01 1499 0.00000000000000e+00 1500 0.00000000000000e+00 1501 1.00000000000000e+00 1502 0.00000000000000e+00 1503 0.00000000000000e+00 1504 7.50000000000000e-01 1505 -7.50000000000000e-01 1506 0.00000000000000e+00 1507 7.50000000000000e-01 1508 -1.00000000000000e+00 1509 0.00000000000000e+00 1510 1.00000000000000e+00 1511 -7.50000000000000e-01 1512 0.00000000000000e+00 1513 1.00000000000000e+00 1514 -1.00000000000000e+00 1515 0.00000000000000e+00 1516 7.50000000000000e-01 1517 -7.50000000000000e-01 1518 0.00000000000000e+00 1519 7.50000000000000e-01 1520 -7.50000000000000e-01 1521 0.00000000000000e+00 1522 7.50000000000000e-01 1523 -1.00000000000000e+00 1524 0.00000000000000e+00 1525 7.50000000000000e-01 1526 -1.00000000000000e+00 1527 0.00000000000000e+00 1528 1.00000000000000e+00 1529 -7.50000000000000e-01 1530 0.00000000000000e+00 1531 1.00000000000000e+00 1532 -7.50000000000000e-01 1533 0.00000000000000e+00 1534 1.00000000000000e+00 1535 -1.00000000000000e+00 1536 0.00000000000000e+00 1537 1.00000000000000e+00 1538 -1.00000000000000e+00 1539 0.00000000000000e+00 1540 7.50000000000000e-01 1541 -7.50000000000000e-01 1542 0.00000000000000e+00 1543 7.50000000000000e-01 1544 -1.00000000000000e+00 1545 0.00000000000000e+00 1546 1.00000000000000e+00 1547 -7.50000000000000e-01 1548 0.00000000000000e+00 1549 1.00000000000000e+00 1550 -1.00000000000000e+00 1551 0.00000000000000e+00 1552 0.00000000000000e+00 1553 -2.50000000000000e-01 1554 0.00000000000000e+00 1555 2.50000000000000e-01 1556 0.00000000000000e+00 1557 0.00000000000000e+00 1558 2.50000000000000e-01 1559 -2.50000000000000e-01 1560 0.00000000000000e+00 1561 0.00000000000000e+00 1562 -2.50000000000000e-01 1563 0.00000000000000e+00 1564 2.50000000000000e-01 1565 0.00000000000000e+00 1566 0.00000000000000e+00 1567 2.50000000000000e-01 1568 -2.50000000000000e-01 1569 0.00000000000000e+00 1570 0.00000000000000e+00 1571 -5.00000000000000e-01 1572 0.00000000000000e+00 1573 2.50000000000000e-01 1574 -5.00000000000000e-01 1575 0.00000000000000e+00 1576 2.50000000000000e-01 1577 -5.00000000000000e-01 1578 0.00000000000000e+00 1579 0.00000000000000e+00 1580 -7.50000000000000e-01 1581 0.00000000000000e+00 1582 2.50000000000000e-01 1583 -7.50000000000000e-01 1584 0.00000000000000e+00 1585 2.50000000000000e-01 1586 -7.50000000000000e-01 1587 0.00000000000000e+00 1588 2.50000000000000e-01 1589 -5.00000000000000e-01 1590 0.00000000000000e+00 1591 0.00000000000000e+00 1592 -5.00000000000000e-01 1593 0.00000000000000e+00 1594 2.50000000000000e-01 1595 -5.00000000000000e-01 1596 0.00000000000000e+00 1597 0.00000000000000e+00 1598 -7.50000000000000e-01 1599 0.00000000000000e+00 1600 2.50000000000000e-01 1601 -7.50000000000000e-01 1602 0.00000000000000e+00 1603 2.50000000000000e-01 1604 -7.50000000000000e-01 1605 0.00000000000000e+00 1606 5.00000000000000e-01 1607 0.00000000000000e+00 1608 0.00000000000000e+00 1609 5.00000000000000e-01 1610 -2.50000000000000e-01 1611 0.00000000000000e+00 1612 5.00000000000000e-01 1613 -2.50000000000000e-01 1614 0.00000000000000e+00 1615 7.50000000000000e-01 1616 0.00000000000000e+00 1617 0.00000000000000e+00 1618 7.50000000000000e-01 1619 -2.50000000000000e-01 1620 0.00000000000000e+00 1621 7.50000000000000e-01 1622 -2.50000000000000e-01 1623 0.00000000000000e+00 1624 5.00000000000000e-01 1625 -2.50000000000000e-01 1626 0.00000000000000e+00 1627 5.00000000000000e-01 1628 0.00000000000000e+00 1629 0.00000000000000e+00 1630 5.00000000000000e-01 1631 -2.50000000000000e-01 1632 0.00000000000000e+00 1633 7.50000000000000e-01 1634 0.00000000000000e+00 1635 0.00000000000000e+00 1636 7.50000000000000e-01 1637 -2.50000000000000e-01 1638 0.00000000000000e+00 1639 7.50000000000000e-01 1640 -2.50000000000000e-01 1641 0.00000000000000e+00 1642 5.00000000000000e-01 1643 -5.00000000000000e-01 1644 0.00000000000000e+00 1645 5.00000000000000e-01 1646 -7.50000000000000e-01 1647 0.00000000000000e+00 1648 5.00000000000000e-01 1649 -7.50000000000000e-01 1650 0.00000000000000e+00 1651 7.50000000000000e-01 1652 -5.00000000000000e-01 1653 0.00000000000000e+00 1654 7.50000000000000e-01 1655 -5.00000000000000e-01 1656 0.00000000000000e+00 1657 7.50000000000000e-01 1658 -7.50000000000000e-01 1659 0.00000000000000e+00 1660 5.00000000000000e-01 1661 -5.00000000000000e-01 1662 0.00000000000000e+00 1663 5.00000000000000e-01 1664 -7.50000000000000e-01 1665 0.00000000000000e+00 1666 5.00000000000000e-01 1667 -7.50000000000000e-01 1668 0.00000000000000e+00 1669 7.50000000000000e-01 1670 -5.00000000000000e-01 1671 0.00000000000000e+00 1672 7.50000000000000e-01 1673 -5.00000000000000e-01 1674 0.00000000000000e+00 1675 7.50000000000000e-01 1676 -7.50000000000000e-01 1677 0.00000000000000e+00 1678 0.00000000000000e+00 1679 -2.50000000000000e-01 1680 0.00000000000000e+00 1681 2.50000000000000e-01 1682 0.00000000000000e+00 1683 0.00000000000000e+00 1684 2.50000000000000e-01 1685 -2.50000000000000e-01 1686 0.00000000000000e+00 1687 0.00000000000000e+00 1688 -2.50000000000000e-01 1689 0.00000000000000e+00 1690 2.50000000000000e-01 1691 0.00000000000000e+00 1692 0.00000000000000e+00 1693 2.50000000000000e-01 1694 -2.50000000000000e-01 1695 0.00000000000000e+00 1696 0.00000000000000e+00 1697 -5.00000000000000e-01 1698 0.00000000000000e+00 1699 2.50000000000000e-01 1700 -5.00000000000000e-01 1701 0.00000000000000e+00 1702 2.50000000000000e-01 1703 -5.00000000000000e-01 1704 0.00000000000000e+00 1705 0.00000000000000e+00 1706 -7.50000000000000e-01 1707 0.00000000000000e+00 1708 2.50000000000000e-01 1709 -7.50000000000000e-01 1710 0.00000000000000e+00 1711 2.50000000000000e-01 1712 -7.50000000000000e-01 1713 0.00000000000000e+00 1714 2.50000000000000e-01 1715 -5.00000000000000e-01 1716 0.00000000000000e+00 1717 0.00000000000000e+00 1718 -5.00000000000000e-01 1719 0.00000000000000e+00 1720 2.50000000000000e-01 1721 -5.00000000000000e-01 1722 0.00000000000000e+00 1723 0.00000000000000e+00 1724 -7.50000000000000e-01 1725 0.00000000000000e+00 1726 2.50000000000000e-01 1727 -7.50000000000000e-01 1728 0.00000000000000e+00 1729 2.50000000000000e-01 1730 -7.50000000000000e-01 1731 0.00000000000000e+00 1732 5.00000000000000e-01 1733 0.00000000000000e+00 1734 0.00000000000000e+00 1735 5.00000000000000e-01 1736 -2.50000000000000e-01 1737 0.00000000000000e+00 1738 5.00000000000000e-01 1739 -2.50000000000000e-01 1740 0.00000000000000e+00 1741 7.50000000000000e-01 1742 0.00000000000000e+00 1743 0.00000000000000e+00 1744 7.50000000000000e-01 1745 -2.50000000000000e-01 1746 0.00000000000000e+00 1747 7.50000000000000e-01 1748 -2.50000000000000e-01 1749 0.00000000000000e+00 1750 5.00000000000000e-01 1751 -2.50000000000000e-01 1752 0.00000000000000e+00 1753 5.00000000000000e-01 1754 0.00000000000000e+00 1755 0.00000000000000e+00 1756 5.00000000000000e-01 1757 -2.50000000000000e-01 1758 0.00000000000000e+00 1759 7.50000000000000e-01 1760 0.00000000000000e+00 1761 0.00000000000000e+00 1762 7.50000000000000e-01 1763 -2.50000000000000e-01 1764 0.00000000000000e+00 1765 7.50000000000000e-01 1766 -2.50000000000000e-01 1767 0.00000000000000e+00 1768 5.00000000000000e-01 1769 -5.00000000000000e-01 1770 0.00000000000000e+00 1771 5.00000000000000e-01 1772 -7.50000000000000e-01 1773 0.00000000000000e+00 1774 5.00000000000000e-01 1775 -7.50000000000000e-01 1776 0.00000000000000e+00 1777 7.50000000000000e-01 1778 -5.00000000000000e-01 1779 0.00000000000000e+00 1780 7.50000000000000e-01 1781 -5.00000000000000e-01 1782 0.00000000000000e+00 1783 7.50000000000000e-01 1784 -7.50000000000000e-01 1785 0.00000000000000e+00 1786 5.00000000000000e-01 1787 -5.00000000000000e-01 1788 0.00000000000000e+00 1789 5.00000000000000e-01 1790 -7.50000000000000e-01 1791 0.00000000000000e+00 1792 5.00000000000000e-01 1793 -7.50000000000000e-01 1794 0.00000000000000e+00 1795 7.50000000000000e-01 1796 -5.00000000000000e-01 1797 0.00000000000000e+00 1798 7.50000000000000e-01 1799 -5.00000000000000e-01 1800 0.00000000000000e+00 1801 7.50000000000000e-01 1802 -7.50000000000000e-01 1803 0.00000000000000e+00 1804 2.50000000000000e-01 1805 -1.00000000000000e+00 1806 0.00000000000000e+00 1807 2.50000000000000e-01 1808 -1.00000000000000e+00 1809 0.00000000000000e+00 1810 5.00000000000000e-01 1811 -1.00000000000000e+00 1812 0.00000000000000e+00 1813 7.50000000000000e-01 1814 -1.00000000000000e+00 1815 0.00000000000000e+00 1816 5.00000000000000e-01 1817 -1.00000000000000e+00 1818 0.00000000000000e+00 1819 7.50000000000000e-01 1820 -1.00000000000000e+00 1821 0.00000000000000e+00 1822 2.50000000000000e-01 1823 -1.00000000000000e+00 1824 0.00000000000000e+00 1825 2.50000000000000e-01 1826 -1.00000000000000e+00 1827 0.00000000000000e+00 1828 5.00000000000000e-01 1829 -1.00000000000000e+00 1830 0.00000000000000e+00 1831 7.50000000000000e-01 1832 -1.00000000000000e+00 1833 0.00000000000000e+00 1834 5.00000000000000e-01 1835 -1.00000000000000e+00 1836 0.00000000000000e+00 1837 7.50000000000000e-01 1838 -1.00000000000000e+00 1839 0.00000000000000e+00 1840 1.00000000000000e+00 1841 -2.50000000000000e-01 1842 0.00000000000000e+00 1843 1.00000000000000e+00 1844 -2.50000000000000e-01 1845 0.00000000000000e+00 1846 1.00000000000000e+00 1847 -5.00000000000000e-01 1848 0.00000000000000e+00 1849 1.00000000000000e+00 1850 -7.50000000000000e-01 1851 0.00000000000000e+00 1852 1.00000000000000e+00 1853 -5.00000000000000e-01 1854 0.00000000000000e+00 1855 1.00000000000000e+00 1856 -7.50000000000000e-01 1857 0.00000000000000e+00 1858 1.00000000000000e+00 1859 -2.50000000000000e-01 1860 0.00000000000000e+00 1861 1.00000000000000e+00 1862 -2.50000000000000e-01 1863 0.00000000000000e+00 1864 1.00000000000000e+00 1865 -5.00000000000000e-01 1866 0.00000000000000e+00 1867 1.00000000000000e+00 1868 -7.50000000000000e-01 1869 0.00000000000000e+00 1870 1.00000000000000e+00 1871 -5.00000000000000e-01 1872 0.00000000000000e+00 1873 1.00000000000000e+00 1874 -7.50000000000000e-01 hypre-2.33.0/src/test/TEST_ij/data/beam_tet_dof2475_np4/rbms.1.00003000066400000000000000000000366321477326011500240670ustar00rootroot000000000000001875 2475 1875 0.00000000000000e+00 1876 0.00000000000000e+00 1877 0.00000000000000e+00 1878 0.00000000000000e+00 1879 0.00000000000000e+00 1880 0.00000000000000e+00 1881 0.00000000000000e+00 1882 0.00000000000000e+00 1883 -1.00000000000000e+00 1884 0.00000000000000e+00 1885 0.00000000000000e+00 1886 -1.00000000000000e+00 1887 0.00000000000000e+00 1888 1.00000000000000e+00 1889 0.00000000000000e+00 1890 0.00000000000000e+00 1891 1.00000000000000e+00 1892 0.00000000000000e+00 1893 0.00000000000000e+00 1894 1.00000000000000e+00 1895 -1.00000000000000e+00 1896 0.00000000000000e+00 1897 1.00000000000000e+00 1898 -1.00000000000000e+00 1899 0.00000000000000e+00 1900 0.00000000000000e+00 1901 0.00000000000000e+00 1902 0.00000000000000e+00 1903 0.00000000000000e+00 1904 -5.00000000000000e-01 1905 0.00000000000000e+00 1906 0.00000000000000e+00 1907 -5.00000000000000e-01 1908 0.00000000000000e+00 1909 5.00000000000000e-01 1910 0.00000000000000e+00 1911 0.00000000000000e+00 1912 5.00000000000000e-01 1913 0.00000000000000e+00 1914 0.00000000000000e+00 1915 5.00000000000000e-01 1916 -5.00000000000000e-01 1917 0.00000000000000e+00 1918 5.00000000000000e-01 1919 -5.00000000000000e-01 1920 0.00000000000000e+00 1921 0.00000000000000e+00 1922 0.00000000000000e+00 1923 0.00000000000000e+00 1924 0.00000000000000e+00 1925 -5.00000000000000e-01 1926 0.00000000000000e+00 1927 0.00000000000000e+00 1928 -5.00000000000000e-01 1929 0.00000000000000e+00 1930 5.00000000000000e-01 1931 0.00000000000000e+00 1932 0.00000000000000e+00 1933 5.00000000000000e-01 1934 0.00000000000000e+00 1935 0.00000000000000e+00 1936 5.00000000000000e-01 1937 -5.00000000000000e-01 1938 0.00000000000000e+00 1939 5.00000000000000e-01 1940 -5.00000000000000e-01 1941 0.00000000000000e+00 1942 0.00000000000000e+00 1943 -1.00000000000000e+00 1944 0.00000000000000e+00 1945 5.00000000000000e-01 1946 -1.00000000000000e+00 1947 0.00000000000000e+00 1948 5.00000000000000e-01 1949 -1.00000000000000e+00 1950 0.00000000000000e+00 1951 0.00000000000000e+00 1952 -1.00000000000000e+00 1953 0.00000000000000e+00 1954 5.00000000000000e-01 1955 -1.00000000000000e+00 1956 0.00000000000000e+00 1957 5.00000000000000e-01 1958 -1.00000000000000e+00 1959 0.00000000000000e+00 1960 1.00000000000000e+00 1961 0.00000000000000e+00 1962 0.00000000000000e+00 1963 1.00000000000000e+00 1964 -5.00000000000000e-01 1965 0.00000000000000e+00 1966 1.00000000000000e+00 1967 -5.00000000000000e-01 1968 0.00000000000000e+00 1969 1.00000000000000e+00 1970 0.00000000000000e+00 1971 0.00000000000000e+00 1972 1.00000000000000e+00 1973 -5.00000000000000e-01 1974 0.00000000000000e+00 1975 1.00000000000000e+00 1976 -5.00000000000000e-01 1977 0.00000000000000e+00 1978 1.00000000000000e+00 1979 -1.00000000000000e+00 1980 0.00000000000000e+00 1981 1.00000000000000e+00 1982 -1.00000000000000e+00 1983 0.00000000000000e+00 1984 0.00000000000000e+00 1985 0.00000000000000e+00 1986 0.00000000000000e+00 1987 0.00000000000000e+00 1988 -2.50000000000000e-01 1989 0.00000000000000e+00 1990 0.00000000000000e+00 1991 -2.50000000000000e-01 1992 0.00000000000000e+00 1993 2.50000000000000e-01 1994 0.00000000000000e+00 1995 0.00000000000000e+00 1996 2.50000000000000e-01 1997 0.00000000000000e+00 1998 0.00000000000000e+00 1999 2.50000000000000e-01 2000 -2.50000000000000e-01 2001 0.00000000000000e+00 2002 2.50000000000000e-01 2003 -2.50000000000000e-01 2004 0.00000000000000e+00 2005 0.00000000000000e+00 2006 0.00000000000000e+00 2007 0.00000000000000e+00 2008 0.00000000000000e+00 2009 0.00000000000000e+00 2010 0.00000000000000e+00 2011 0.00000000000000e+00 2012 -2.50000000000000e-01 2013 0.00000000000000e+00 2014 0.00000000000000e+00 2015 -2.50000000000000e-01 2016 0.00000000000000e+00 2017 2.50000000000000e-01 2018 0.00000000000000e+00 2019 0.00000000000000e+00 2020 2.50000000000000e-01 2021 0.00000000000000e+00 2022 0.00000000000000e+00 2023 2.50000000000000e-01 2024 -2.50000000000000e-01 2025 0.00000000000000e+00 2026 2.50000000000000e-01 2027 -2.50000000000000e-01 2028 0.00000000000000e+00 2029 0.00000000000000e+00 2030 0.00000000000000e+00 2031 0.00000000000000e+00 2032 0.00000000000000e+00 2033 -7.50000000000000e-01 2034 0.00000000000000e+00 2035 0.00000000000000e+00 2036 -1.00000000000000e+00 2037 0.00000000000000e+00 2038 2.50000000000000e-01 2039 -1.00000000000000e+00 2040 0.00000000000000e+00 2041 2.50000000000000e-01 2042 -1.00000000000000e+00 2043 0.00000000000000e+00 2044 0.00000000000000e+00 2045 -7.50000000000000e-01 2046 0.00000000000000e+00 2047 0.00000000000000e+00 2048 -7.50000000000000e-01 2049 0.00000000000000e+00 2050 0.00000000000000e+00 2051 -1.00000000000000e+00 2052 0.00000000000000e+00 2053 0.00000000000000e+00 2054 -1.00000000000000e+00 2055 0.00000000000000e+00 2056 2.50000000000000e-01 2057 -1.00000000000000e+00 2058 0.00000000000000e+00 2059 2.50000000000000e-01 2060 -1.00000000000000e+00 2061 0.00000000000000e+00 2062 0.00000000000000e+00 2063 -7.50000000000000e-01 2064 0.00000000000000e+00 2065 0.00000000000000e+00 2066 -1.00000000000000e+00 2067 0.00000000000000e+00 2068 7.50000000000000e-01 2069 0.00000000000000e+00 2070 0.00000000000000e+00 2071 1.00000000000000e+00 2072 0.00000000000000e+00 2073 0.00000000000000e+00 2074 1.00000000000000e+00 2075 -2.50000000000000e-01 2076 0.00000000000000e+00 2077 1.00000000000000e+00 2078 -2.50000000000000e-01 2079 0.00000000000000e+00 2080 7.50000000000000e-01 2081 0.00000000000000e+00 2082 0.00000000000000e+00 2083 7.50000000000000e-01 2084 0.00000000000000e+00 2085 0.00000000000000e+00 2086 1.00000000000000e+00 2087 0.00000000000000e+00 2088 0.00000000000000e+00 2089 1.00000000000000e+00 2090 0.00000000000000e+00 2091 0.00000000000000e+00 2092 1.00000000000000e+00 2093 -2.50000000000000e-01 2094 0.00000000000000e+00 2095 1.00000000000000e+00 2096 -2.50000000000000e-01 2097 0.00000000000000e+00 2098 7.50000000000000e-01 2099 0.00000000000000e+00 2100 0.00000000000000e+00 2101 1.00000000000000e+00 2102 0.00000000000000e+00 2103 0.00000000000000e+00 2104 7.50000000000000e-01 2105 -7.50000000000000e-01 2106 0.00000000000000e+00 2107 7.50000000000000e-01 2108 -1.00000000000000e+00 2109 0.00000000000000e+00 2110 1.00000000000000e+00 2111 -7.50000000000000e-01 2112 0.00000000000000e+00 2113 1.00000000000000e+00 2114 -1.00000000000000e+00 2115 0.00000000000000e+00 2116 7.50000000000000e-01 2117 -7.50000000000000e-01 2118 0.00000000000000e+00 2119 7.50000000000000e-01 2120 -7.50000000000000e-01 2121 0.00000000000000e+00 2122 7.50000000000000e-01 2123 -1.00000000000000e+00 2124 0.00000000000000e+00 2125 7.50000000000000e-01 2126 -1.00000000000000e+00 2127 0.00000000000000e+00 2128 1.00000000000000e+00 2129 -7.50000000000000e-01 2130 0.00000000000000e+00 2131 1.00000000000000e+00 2132 -7.50000000000000e-01 2133 0.00000000000000e+00 2134 1.00000000000000e+00 2135 -1.00000000000000e+00 2136 0.00000000000000e+00 2137 1.00000000000000e+00 2138 -1.00000000000000e+00 2139 0.00000000000000e+00 2140 7.50000000000000e-01 2141 -7.50000000000000e-01 2142 0.00000000000000e+00 2143 7.50000000000000e-01 2144 -1.00000000000000e+00 2145 0.00000000000000e+00 2146 1.00000000000000e+00 2147 -7.50000000000000e-01 2148 0.00000000000000e+00 2149 1.00000000000000e+00 2150 -1.00000000000000e+00 2151 0.00000000000000e+00 2152 0.00000000000000e+00 2153 -2.50000000000000e-01 2154 0.00000000000000e+00 2155 2.50000000000000e-01 2156 0.00000000000000e+00 2157 0.00000000000000e+00 2158 2.50000000000000e-01 2159 -2.50000000000000e-01 2160 0.00000000000000e+00 2161 0.00000000000000e+00 2162 -2.50000000000000e-01 2163 0.00000000000000e+00 2164 2.50000000000000e-01 2165 0.00000000000000e+00 2166 0.00000000000000e+00 2167 2.50000000000000e-01 2168 -2.50000000000000e-01 2169 0.00000000000000e+00 2170 0.00000000000000e+00 2171 -5.00000000000000e-01 2172 0.00000000000000e+00 2173 2.50000000000000e-01 2174 -5.00000000000000e-01 2175 0.00000000000000e+00 2176 2.50000000000000e-01 2177 -5.00000000000000e-01 2178 0.00000000000000e+00 2179 0.00000000000000e+00 2180 -7.50000000000000e-01 2181 0.00000000000000e+00 2182 2.50000000000000e-01 2183 -7.50000000000000e-01 2184 0.00000000000000e+00 2185 2.50000000000000e-01 2186 -7.50000000000000e-01 2187 0.00000000000000e+00 2188 2.50000000000000e-01 2189 -5.00000000000000e-01 2190 0.00000000000000e+00 2191 0.00000000000000e+00 2192 -5.00000000000000e-01 2193 0.00000000000000e+00 2194 2.50000000000000e-01 2195 -5.00000000000000e-01 2196 0.00000000000000e+00 2197 0.00000000000000e+00 2198 -7.50000000000000e-01 2199 0.00000000000000e+00 2200 2.50000000000000e-01 2201 -7.50000000000000e-01 2202 0.00000000000000e+00 2203 2.50000000000000e-01 2204 -7.50000000000000e-01 2205 0.00000000000000e+00 2206 5.00000000000000e-01 2207 0.00000000000000e+00 2208 0.00000000000000e+00 2209 5.00000000000000e-01 2210 -2.50000000000000e-01 2211 0.00000000000000e+00 2212 5.00000000000000e-01 2213 -2.50000000000000e-01 2214 0.00000000000000e+00 2215 7.50000000000000e-01 2216 0.00000000000000e+00 2217 0.00000000000000e+00 2218 7.50000000000000e-01 2219 -2.50000000000000e-01 2220 0.00000000000000e+00 2221 7.50000000000000e-01 2222 -2.50000000000000e-01 2223 0.00000000000000e+00 2224 5.00000000000000e-01 2225 -2.50000000000000e-01 2226 0.00000000000000e+00 2227 5.00000000000000e-01 2228 0.00000000000000e+00 2229 0.00000000000000e+00 2230 5.00000000000000e-01 2231 -2.50000000000000e-01 2232 0.00000000000000e+00 2233 7.50000000000000e-01 2234 0.00000000000000e+00 2235 0.00000000000000e+00 2236 7.50000000000000e-01 2237 -2.50000000000000e-01 2238 0.00000000000000e+00 2239 7.50000000000000e-01 2240 -2.50000000000000e-01 2241 0.00000000000000e+00 2242 5.00000000000000e-01 2243 -5.00000000000000e-01 2244 0.00000000000000e+00 2245 5.00000000000000e-01 2246 -7.50000000000000e-01 2247 0.00000000000000e+00 2248 5.00000000000000e-01 2249 -7.50000000000000e-01 2250 0.00000000000000e+00 2251 7.50000000000000e-01 2252 -5.00000000000000e-01 2253 0.00000000000000e+00 2254 7.50000000000000e-01 2255 -5.00000000000000e-01 2256 0.00000000000000e+00 2257 7.50000000000000e-01 2258 -7.50000000000000e-01 2259 0.00000000000000e+00 2260 5.00000000000000e-01 2261 -5.00000000000000e-01 2262 0.00000000000000e+00 2263 5.00000000000000e-01 2264 -7.50000000000000e-01 2265 0.00000000000000e+00 2266 5.00000000000000e-01 2267 -7.50000000000000e-01 2268 0.00000000000000e+00 2269 7.50000000000000e-01 2270 -5.00000000000000e-01 2271 0.00000000000000e+00 2272 7.50000000000000e-01 2273 -5.00000000000000e-01 2274 0.00000000000000e+00 2275 7.50000000000000e-01 2276 -7.50000000000000e-01 2277 0.00000000000000e+00 2278 0.00000000000000e+00 2279 -2.50000000000000e-01 2280 0.00000000000000e+00 2281 2.50000000000000e-01 2282 0.00000000000000e+00 2283 0.00000000000000e+00 2284 2.50000000000000e-01 2285 -2.50000000000000e-01 2286 0.00000000000000e+00 2287 0.00000000000000e+00 2288 -2.50000000000000e-01 2289 0.00000000000000e+00 2290 2.50000000000000e-01 2291 0.00000000000000e+00 2292 0.00000000000000e+00 2293 2.50000000000000e-01 2294 -2.50000000000000e-01 2295 0.00000000000000e+00 2296 0.00000000000000e+00 2297 -5.00000000000000e-01 2298 0.00000000000000e+00 2299 2.50000000000000e-01 2300 -5.00000000000000e-01 2301 0.00000000000000e+00 2302 2.50000000000000e-01 2303 -5.00000000000000e-01 2304 0.00000000000000e+00 2305 0.00000000000000e+00 2306 -7.50000000000000e-01 2307 0.00000000000000e+00 2308 2.50000000000000e-01 2309 -7.50000000000000e-01 2310 0.00000000000000e+00 2311 2.50000000000000e-01 2312 -7.50000000000000e-01 2313 0.00000000000000e+00 2314 2.50000000000000e-01 2315 -5.00000000000000e-01 2316 0.00000000000000e+00 2317 0.00000000000000e+00 2318 -5.00000000000000e-01 2319 0.00000000000000e+00 2320 2.50000000000000e-01 2321 -5.00000000000000e-01 2322 0.00000000000000e+00 2323 0.00000000000000e+00 2324 -7.50000000000000e-01 2325 0.00000000000000e+00 2326 2.50000000000000e-01 2327 -7.50000000000000e-01 2328 0.00000000000000e+00 2329 2.50000000000000e-01 2330 -7.50000000000000e-01 2331 0.00000000000000e+00 2332 5.00000000000000e-01 2333 0.00000000000000e+00 2334 0.00000000000000e+00 2335 5.00000000000000e-01 2336 -2.50000000000000e-01 2337 0.00000000000000e+00 2338 5.00000000000000e-01 2339 -2.50000000000000e-01 2340 0.00000000000000e+00 2341 7.50000000000000e-01 2342 0.00000000000000e+00 2343 0.00000000000000e+00 2344 7.50000000000000e-01 2345 -2.50000000000000e-01 2346 0.00000000000000e+00 2347 7.50000000000000e-01 2348 -2.50000000000000e-01 2349 0.00000000000000e+00 2350 5.00000000000000e-01 2351 -2.50000000000000e-01 2352 0.00000000000000e+00 2353 5.00000000000000e-01 2354 0.00000000000000e+00 2355 0.00000000000000e+00 2356 5.00000000000000e-01 2357 -2.50000000000000e-01 2358 0.00000000000000e+00 2359 7.50000000000000e-01 2360 0.00000000000000e+00 2361 0.00000000000000e+00 2362 7.50000000000000e-01 2363 -2.50000000000000e-01 2364 0.00000000000000e+00 2365 7.50000000000000e-01 2366 -2.50000000000000e-01 2367 0.00000000000000e+00 2368 5.00000000000000e-01 2369 -5.00000000000000e-01 2370 0.00000000000000e+00 2371 5.00000000000000e-01 2372 -7.50000000000000e-01 2373 0.00000000000000e+00 2374 5.00000000000000e-01 2375 -7.50000000000000e-01 2376 0.00000000000000e+00 2377 7.50000000000000e-01 2378 -5.00000000000000e-01 2379 0.00000000000000e+00 2380 7.50000000000000e-01 2381 -5.00000000000000e-01 2382 0.00000000000000e+00 2383 7.50000000000000e-01 2384 -7.50000000000000e-01 2385 0.00000000000000e+00 2386 5.00000000000000e-01 2387 -5.00000000000000e-01 2388 0.00000000000000e+00 2389 5.00000000000000e-01 2390 -7.50000000000000e-01 2391 0.00000000000000e+00 2392 5.00000000000000e-01 2393 -7.50000000000000e-01 2394 0.00000000000000e+00 2395 7.50000000000000e-01 2396 -5.00000000000000e-01 2397 0.00000000000000e+00 2398 7.50000000000000e-01 2399 -5.00000000000000e-01 2400 0.00000000000000e+00 2401 7.50000000000000e-01 2402 -7.50000000000000e-01 2403 0.00000000000000e+00 2404 2.50000000000000e-01 2405 -1.00000000000000e+00 2406 0.00000000000000e+00 2407 2.50000000000000e-01 2408 -1.00000000000000e+00 2409 0.00000000000000e+00 2410 5.00000000000000e-01 2411 -1.00000000000000e+00 2412 0.00000000000000e+00 2413 7.50000000000000e-01 2414 -1.00000000000000e+00 2415 0.00000000000000e+00 2416 5.00000000000000e-01 2417 -1.00000000000000e+00 2418 0.00000000000000e+00 2419 7.50000000000000e-01 2420 -1.00000000000000e+00 2421 0.00000000000000e+00 2422 2.50000000000000e-01 2423 -1.00000000000000e+00 2424 0.00000000000000e+00 2425 2.50000000000000e-01 2426 -1.00000000000000e+00 2427 0.00000000000000e+00 2428 5.00000000000000e-01 2429 -1.00000000000000e+00 2430 0.00000000000000e+00 2431 7.50000000000000e-01 2432 -1.00000000000000e+00 2433 0.00000000000000e+00 2434 5.00000000000000e-01 2435 -1.00000000000000e+00 2436 0.00000000000000e+00 2437 7.50000000000000e-01 2438 -1.00000000000000e+00 2439 0.00000000000000e+00 2440 1.00000000000000e+00 2441 -2.50000000000000e-01 2442 0.00000000000000e+00 2443 1.00000000000000e+00 2444 -2.50000000000000e-01 2445 0.00000000000000e+00 2446 1.00000000000000e+00 2447 -5.00000000000000e-01 2448 0.00000000000000e+00 2449 1.00000000000000e+00 2450 -7.50000000000000e-01 2451 0.00000000000000e+00 2452 1.00000000000000e+00 2453 -5.00000000000000e-01 2454 0.00000000000000e+00 2455 1.00000000000000e+00 2456 -7.50000000000000e-01 2457 0.00000000000000e+00 2458 1.00000000000000e+00 2459 -2.50000000000000e-01 2460 0.00000000000000e+00 2461 1.00000000000000e+00 2462 -2.50000000000000e-01 2463 0.00000000000000e+00 2464 1.00000000000000e+00 2465 -5.00000000000000e-01 2466 0.00000000000000e+00 2467 1.00000000000000e+00 2468 -7.50000000000000e-01 2469 0.00000000000000e+00 2470 1.00000000000000e+00 2471 -5.00000000000000e-01 2472 0.00000000000000e+00 2473 1.00000000000000e+00 2474 -7.50000000000000e-01 hypre-2.33.0/src/test/TEST_ij/data/beam_tet_dof2475_np4/rbms.2.00000000066400000000000000000000410671477326011500240630ustar00rootroot000000000000000 675 0 0.00000000000000e+00 1 0.00000000000000e+00 2 4.00000000000000e+00 3 0.00000000000000e+00 4 0.00000000000000e+00 5 5.00000000000000e+00 6 0.00000000000000e+00 7 0.00000000000000e+00 8 6.00000000000000e+00 9 0.00000000000000e+00 10 0.00000000000000e+00 11 4.00000000000000e+00 12 0.00000000000000e+00 13 0.00000000000000e+00 14 5.00000000000000e+00 15 0.00000000000000e+00 16 0.00000000000000e+00 17 6.00000000000000e+00 18 -1.00000000000000e+00 19 0.00000000000000e+00 20 4.00000000000000e+00 21 -1.00000000000000e+00 22 0.00000000000000e+00 23 5.00000000000000e+00 24 -1.00000000000000e+00 25 0.00000000000000e+00 26 6.00000000000000e+00 27 -1.00000000000000e+00 28 0.00000000000000e+00 29 4.00000000000000e+00 30 -1.00000000000000e+00 31 0.00000000000000e+00 32 5.00000000000000e+00 33 -1.00000000000000e+00 34 0.00000000000000e+00 35 6.00000000000000e+00 36 0.00000000000000e+00 37 0.00000000000000e+00 38 4.50000000000000e+00 39 0.00000000000000e+00 40 0.00000000000000e+00 41 4.00000000000000e+00 42 0.00000000000000e+00 43 0.00000000000000e+00 44 4.50000000000000e+00 45 -5.00000000000000e-01 46 0.00000000000000e+00 47 4.00000000000000e+00 48 -5.00000000000000e-01 49 0.00000000000000e+00 50 4.50000000000000e+00 51 -5.00000000000000e-01 52 0.00000000000000e+00 53 4.00000000000000e+00 54 -5.00000000000000e-01 55 0.00000000000000e+00 56 4.50000000000000e+00 57 0.00000000000000e+00 58 0.00000000000000e+00 59 5.50000000000000e+00 60 0.00000000000000e+00 61 0.00000000000000e+00 62 5.00000000000000e+00 63 0.00000000000000e+00 64 0.00000000000000e+00 65 5.50000000000000e+00 66 -5.00000000000000e-01 67 0.00000000000000e+00 68 5.00000000000000e+00 69 -5.00000000000000e-01 70 0.00000000000000e+00 71 5.50000000000000e+00 72 -5.00000000000000e-01 73 0.00000000000000e+00 74 5.00000000000000e+00 75 -5.00000000000000e-01 76 0.00000000000000e+00 77 5.50000000000000e+00 78 0.00000000000000e+00 79 0.00000000000000e+00 80 6.00000000000000e+00 81 -5.00000000000000e-01 82 0.00000000000000e+00 83 6.00000000000000e+00 84 -5.00000000000000e-01 85 0.00000000000000e+00 86 6.00000000000000e+00 87 0.00000000000000e+00 88 0.00000000000000e+00 89 4.50000000000000e+00 90 -5.00000000000000e-01 91 0.00000000000000e+00 92 4.00000000000000e+00 93 -5.00000000000000e-01 94 0.00000000000000e+00 95 4.50000000000000e+00 96 0.00000000000000e+00 97 0.00000000000000e+00 98 5.50000000000000e+00 99 -5.00000000000000e-01 100 0.00000000000000e+00 101 5.00000000000000e+00 102 -5.00000000000000e-01 103 0.00000000000000e+00 104 5.50000000000000e+00 105 -5.00000000000000e-01 106 0.00000000000000e+00 107 6.00000000000000e+00 108 -1.00000000000000e+00 109 0.00000000000000e+00 110 4.50000000000000e+00 111 -1.00000000000000e+00 112 0.00000000000000e+00 113 4.00000000000000e+00 114 -1.00000000000000e+00 115 0.00000000000000e+00 116 4.50000000000000e+00 117 -1.00000000000000e+00 118 0.00000000000000e+00 119 5.50000000000000e+00 120 -1.00000000000000e+00 121 0.00000000000000e+00 122 5.00000000000000e+00 123 -1.00000000000000e+00 124 0.00000000000000e+00 125 5.50000000000000e+00 126 -1.00000000000000e+00 127 0.00000000000000e+00 128 6.00000000000000e+00 129 -1.00000000000000e+00 130 0.00000000000000e+00 131 4.50000000000000e+00 132 -1.00000000000000e+00 133 0.00000000000000e+00 134 5.50000000000000e+00 135 0.00000000000000e+00 136 0.00000000000000e+00 137 4.25000000000000e+00 138 0.00000000000000e+00 139 0.00000000000000e+00 140 4.00000000000000e+00 141 0.00000000000000e+00 142 0.00000000000000e+00 143 4.25000000000000e+00 144 -2.50000000000000e-01 145 0.00000000000000e+00 146 4.00000000000000e+00 147 -2.50000000000000e-01 148 0.00000000000000e+00 149 4.25000000000000e+00 150 -2.50000000000000e-01 151 0.00000000000000e+00 152 4.00000000000000e+00 153 -2.50000000000000e-01 154 0.00000000000000e+00 155 4.25000000000000e+00 156 0.00000000000000e+00 157 0.00000000000000e+00 158 4.75000000000000e+00 159 0.00000000000000e+00 160 0.00000000000000e+00 161 5.25000000000000e+00 162 0.00000000000000e+00 163 0.00000000000000e+00 164 5.00000000000000e+00 165 0.00000000000000e+00 166 0.00000000000000e+00 167 5.25000000000000e+00 168 -2.50000000000000e-01 169 0.00000000000000e+00 170 5.00000000000000e+00 171 -2.50000000000000e-01 172 0.00000000000000e+00 173 5.25000000000000e+00 174 -2.50000000000000e-01 175 0.00000000000000e+00 176 5.00000000000000e+00 177 -2.50000000000000e-01 178 0.00000000000000e+00 179 5.25000000000000e+00 180 0.00000000000000e+00 181 0.00000000000000e+00 182 5.75000000000000e+00 183 0.00000000000000e+00 184 0.00000000000000e+00 185 6.00000000000000e+00 186 -2.50000000000000e-01 187 0.00000000000000e+00 188 6.00000000000000e+00 189 -2.50000000000000e-01 190 0.00000000000000e+00 191 6.00000000000000e+00 192 0.00000000000000e+00 193 0.00000000000000e+00 194 4.00000000000000e+00 195 0.00000000000000e+00 196 0.00000000000000e+00 197 4.25000000000000e+00 198 -2.50000000000000e-01 199 0.00000000000000e+00 200 4.00000000000000e+00 201 -2.50000000000000e-01 202 0.00000000000000e+00 203 4.25000000000000e+00 204 0.00000000000000e+00 205 0.00000000000000e+00 206 4.75000000000000e+00 207 0.00000000000000e+00 208 0.00000000000000e+00 209 5.00000000000000e+00 210 0.00000000000000e+00 211 0.00000000000000e+00 212 4.75000000000000e+00 213 0.00000000000000e+00 214 0.00000000000000e+00 215 5.25000000000000e+00 216 -2.50000000000000e-01 217 0.00000000000000e+00 218 5.00000000000000e+00 219 -2.50000000000000e-01 220 0.00000000000000e+00 221 5.25000000000000e+00 222 0.00000000000000e+00 223 0.00000000000000e+00 224 5.75000000000000e+00 225 0.00000000000000e+00 226 0.00000000000000e+00 227 6.00000000000000e+00 228 0.00000000000000e+00 229 0.00000000000000e+00 230 5.75000000000000e+00 231 -2.50000000000000e-01 232 0.00000000000000e+00 233 6.00000000000000e+00 234 -7.50000000000000e-01 235 0.00000000000000e+00 236 4.00000000000000e+00 237 -1.00000000000000e+00 238 0.00000000000000e+00 239 4.25000000000000e+00 240 -1.00000000000000e+00 241 0.00000000000000e+00 242 4.00000000000000e+00 243 -1.00000000000000e+00 244 0.00000000000000e+00 245 4.25000000000000e+00 246 -7.50000000000000e-01 247 0.00000000000000e+00 248 4.75000000000000e+00 249 -7.50000000000000e-01 250 0.00000000000000e+00 251 5.00000000000000e+00 252 -1.00000000000000e+00 253 0.00000000000000e+00 254 4.75000000000000e+00 255 -1.00000000000000e+00 256 0.00000000000000e+00 257 5.25000000000000e+00 258 -1.00000000000000e+00 259 0.00000000000000e+00 260 5.00000000000000e+00 261 -1.00000000000000e+00 262 0.00000000000000e+00 263 5.25000000000000e+00 264 -7.50000000000000e-01 265 0.00000000000000e+00 266 5.75000000000000e+00 267 -7.50000000000000e-01 268 0.00000000000000e+00 269 6.00000000000000e+00 270 -1.00000000000000e+00 271 0.00000000000000e+00 272 5.75000000000000e+00 273 -1.00000000000000e+00 274 0.00000000000000e+00 275 6.00000000000000e+00 276 -7.50000000000000e-01 277 0.00000000000000e+00 278 4.00000000000000e+00 279 -7.50000000000000e-01 280 0.00000000000000e+00 281 4.00000000000000e+00 282 -1.00000000000000e+00 283 0.00000000000000e+00 284 4.00000000000000e+00 285 -1.00000000000000e+00 286 0.00000000000000e+00 287 4.25000000000000e+00 288 -7.50000000000000e-01 289 0.00000000000000e+00 290 4.75000000000000e+00 291 -7.50000000000000e-01 292 0.00000000000000e+00 293 5.00000000000000e+00 294 -7.50000000000000e-01 295 0.00000000000000e+00 296 4.75000000000000e+00 297 -7.50000000000000e-01 298 0.00000000000000e+00 299 5.00000000000000e+00 300 -1.00000000000000e+00 301 0.00000000000000e+00 302 4.75000000000000e+00 303 -1.00000000000000e+00 304 0.00000000000000e+00 305 5.00000000000000e+00 306 -1.00000000000000e+00 307 0.00000000000000e+00 308 4.75000000000000e+00 309 -1.00000000000000e+00 310 0.00000000000000e+00 311 5.25000000000000e+00 312 -7.50000000000000e-01 313 0.00000000000000e+00 314 5.75000000000000e+00 315 -7.50000000000000e-01 316 0.00000000000000e+00 317 6.00000000000000e+00 318 -7.50000000000000e-01 319 0.00000000000000e+00 320 5.75000000000000e+00 321 -7.50000000000000e-01 322 0.00000000000000e+00 323 6.00000000000000e+00 324 -1.00000000000000e+00 325 0.00000000000000e+00 326 5.75000000000000e+00 327 -1.00000000000000e+00 328 0.00000000000000e+00 329 6.00000000000000e+00 330 -1.00000000000000e+00 331 0.00000000000000e+00 332 5.75000000000000e+00 333 0.00000000000000e+00 334 0.00000000000000e+00 335 4.50000000000000e+00 336 -2.50000000000000e-01 337 0.00000000000000e+00 338 4.50000000000000e+00 339 -2.50000000000000e-01 340 0.00000000000000e+00 341 4.50000000000000e+00 342 0.00000000000000e+00 343 0.00000000000000e+00 344 4.75000000000000e+00 345 -2.50000000000000e-01 346 0.00000000000000e+00 347 4.75000000000000e+00 348 -2.50000000000000e-01 349 0.00000000000000e+00 350 4.75000000000000e+00 351 0.00000000000000e+00 352 0.00000000000000e+00 353 4.25000000000000e+00 354 -2.50000000000000e-01 355 0.00000000000000e+00 356 4.00000000000000e+00 357 -2.50000000000000e-01 358 0.00000000000000e+00 359 4.25000000000000e+00 360 0.00000000000000e+00 361 0.00000000000000e+00 362 4.25000000000000e+00 363 -2.50000000000000e-01 364 0.00000000000000e+00 365 4.00000000000000e+00 366 -2.50000000000000e-01 367 0.00000000000000e+00 368 4.25000000000000e+00 369 -2.50000000000000e-01 370 0.00000000000000e+00 371 4.50000000000000e+00 372 0.00000000000000e+00 373 0.00000000000000e+00 374 4.75000000000000e+00 375 -2.50000000000000e-01 376 0.00000000000000e+00 377 4.75000000000000e+00 378 0.00000000000000e+00 379 0.00000000000000e+00 380 4.50000000000000e+00 381 -2.50000000000000e-01 382 0.00000000000000e+00 383 4.50000000000000e+00 384 -2.50000000000000e-01 385 0.00000000000000e+00 386 4.75000000000000e+00 387 -5.00000000000000e-01 388 0.00000000000000e+00 389 4.25000000000000e+00 390 -5.00000000000000e-01 391 0.00000000000000e+00 392 4.00000000000000e+00 393 -5.00000000000000e-01 394 0.00000000000000e+00 395 4.25000000000000e+00 396 -7.50000000000000e-01 397 0.00000000000000e+00 398 4.25000000000000e+00 399 -7.50000000000000e-01 400 0.00000000000000e+00 401 4.00000000000000e+00 402 -7.50000000000000e-01 403 0.00000000000000e+00 404 4.25000000000000e+00 405 -5.00000000000000e-01 406 0.00000000000000e+00 407 4.50000000000000e+00 408 -5.00000000000000e-01 409 0.00000000000000e+00 410 4.75000000000000e+00 411 -5.00000000000000e-01 412 0.00000000000000e+00 413 4.75000000000000e+00 414 -7.50000000000000e-01 415 0.00000000000000e+00 416 4.50000000000000e+00 417 -7.50000000000000e-01 418 0.00000000000000e+00 419 4.50000000000000e+00 420 -7.50000000000000e-01 421 0.00000000000000e+00 422 4.75000000000000e+00 423 -5.00000000000000e-01 424 0.00000000000000e+00 425 4.25000000000000e+00 426 -5.00000000000000e-01 427 0.00000000000000e+00 428 4.00000000000000e+00 429 -5.00000000000000e-01 430 0.00000000000000e+00 431 4.25000000000000e+00 432 -7.50000000000000e-01 433 0.00000000000000e+00 434 4.00000000000000e+00 435 -7.50000000000000e-01 436 0.00000000000000e+00 437 4.25000000000000e+00 438 -7.50000000000000e-01 439 0.00000000000000e+00 440 4.25000000000000e+00 441 -5.00000000000000e-01 442 0.00000000000000e+00 443 4.75000000000000e+00 444 -5.00000000000000e-01 445 0.00000000000000e+00 446 4.50000000000000e+00 447 -5.00000000000000e-01 448 0.00000000000000e+00 449 4.75000000000000e+00 450 -7.50000000000000e-01 451 0.00000000000000e+00 452 4.50000000000000e+00 453 -7.50000000000000e-01 454 0.00000000000000e+00 455 4.75000000000000e+00 456 -7.50000000000000e-01 457 0.00000000000000e+00 458 4.50000000000000e+00 459 0.00000000000000e+00 460 0.00000000000000e+00 461 5.50000000000000e+00 462 -2.50000000000000e-01 463 0.00000000000000e+00 464 5.50000000000000e+00 465 -2.50000000000000e-01 466 0.00000000000000e+00 467 5.50000000000000e+00 468 0.00000000000000e+00 469 0.00000000000000e+00 470 5.75000000000000e+00 471 -2.50000000000000e-01 472 0.00000000000000e+00 473 5.75000000000000e+00 474 -2.50000000000000e-01 475 0.00000000000000e+00 476 5.75000000000000e+00 477 0.00000000000000e+00 478 0.00000000000000e+00 479 5.25000000000000e+00 480 -2.50000000000000e-01 481 0.00000000000000e+00 482 5.00000000000000e+00 483 -2.50000000000000e-01 484 0.00000000000000e+00 485 5.25000000000000e+00 486 0.00000000000000e+00 487 0.00000000000000e+00 488 5.25000000000000e+00 489 -2.50000000000000e-01 490 0.00000000000000e+00 491 5.00000000000000e+00 492 -2.50000000000000e-01 493 0.00000000000000e+00 494 5.25000000000000e+00 495 -2.50000000000000e-01 496 0.00000000000000e+00 497 5.50000000000000e+00 498 0.00000000000000e+00 499 0.00000000000000e+00 500 5.75000000000000e+00 501 -2.50000000000000e-01 502 0.00000000000000e+00 503 5.75000000000000e+00 504 0.00000000000000e+00 505 0.00000000000000e+00 506 5.50000000000000e+00 507 -2.50000000000000e-01 508 0.00000000000000e+00 509 5.50000000000000e+00 510 -2.50000000000000e-01 511 0.00000000000000e+00 512 5.75000000000000e+00 513 -5.00000000000000e-01 514 0.00000000000000e+00 515 5.25000000000000e+00 516 -5.00000000000000e-01 517 0.00000000000000e+00 518 5.00000000000000e+00 519 -5.00000000000000e-01 520 0.00000000000000e+00 521 5.25000000000000e+00 522 -7.50000000000000e-01 523 0.00000000000000e+00 524 5.25000000000000e+00 525 -7.50000000000000e-01 526 0.00000000000000e+00 527 5.00000000000000e+00 528 -7.50000000000000e-01 529 0.00000000000000e+00 530 5.25000000000000e+00 531 -5.00000000000000e-01 532 0.00000000000000e+00 533 5.50000000000000e+00 534 -5.00000000000000e-01 535 0.00000000000000e+00 536 5.75000000000000e+00 537 -5.00000000000000e-01 538 0.00000000000000e+00 539 5.75000000000000e+00 540 -7.50000000000000e-01 541 0.00000000000000e+00 542 5.50000000000000e+00 543 -7.50000000000000e-01 544 0.00000000000000e+00 545 5.50000000000000e+00 546 -7.50000000000000e-01 547 0.00000000000000e+00 548 5.75000000000000e+00 549 -5.00000000000000e-01 550 0.00000000000000e+00 551 5.25000000000000e+00 552 -5.00000000000000e-01 553 0.00000000000000e+00 554 5.00000000000000e+00 555 -5.00000000000000e-01 556 0.00000000000000e+00 557 5.25000000000000e+00 558 -7.50000000000000e-01 559 0.00000000000000e+00 560 5.00000000000000e+00 561 -7.50000000000000e-01 562 0.00000000000000e+00 563 5.25000000000000e+00 564 -7.50000000000000e-01 565 0.00000000000000e+00 566 5.25000000000000e+00 567 -5.00000000000000e-01 568 0.00000000000000e+00 569 5.75000000000000e+00 570 -5.00000000000000e-01 571 0.00000000000000e+00 572 5.50000000000000e+00 573 -5.00000000000000e-01 574 0.00000000000000e+00 575 5.75000000000000e+00 576 -7.50000000000000e-01 577 0.00000000000000e+00 578 5.50000000000000e+00 579 -7.50000000000000e-01 580 0.00000000000000e+00 581 5.75000000000000e+00 582 -7.50000000000000e-01 583 0.00000000000000e+00 584 5.50000000000000e+00 585 -2.50000000000000e-01 586 0.00000000000000e+00 587 6.00000000000000e+00 588 -2.50000000000000e-01 589 0.00000000000000e+00 590 6.00000000000000e+00 591 -5.00000000000000e-01 592 0.00000000000000e+00 593 6.00000000000000e+00 594 -7.50000000000000e-01 595 0.00000000000000e+00 596 6.00000000000000e+00 597 -5.00000000000000e-01 598 0.00000000000000e+00 599 6.00000000000000e+00 600 -7.50000000000000e-01 601 0.00000000000000e+00 602 6.00000000000000e+00 603 -2.50000000000000e-01 604 0.00000000000000e+00 605 4.50000000000000e+00 606 -2.50000000000000e-01 607 0.00000000000000e+00 608 4.75000000000000e+00 609 -5.00000000000000e-01 610 0.00000000000000e+00 611 4.25000000000000e+00 612 -7.50000000000000e-01 613 0.00000000000000e+00 614 4.25000000000000e+00 615 -5.00000000000000e-01 616 0.00000000000000e+00 617 4.75000000000000e+00 618 -7.50000000000000e-01 619 0.00000000000000e+00 620 4.50000000000000e+00 621 -2.50000000000000e-01 622 0.00000000000000e+00 623 5.50000000000000e+00 624 -2.50000000000000e-01 625 0.00000000000000e+00 626 5.75000000000000e+00 627 -5.00000000000000e-01 628 0.00000000000000e+00 629 5.25000000000000e+00 630 -7.50000000000000e-01 631 0.00000000000000e+00 632 5.25000000000000e+00 633 -5.00000000000000e-01 634 0.00000000000000e+00 635 5.75000000000000e+00 636 -7.50000000000000e-01 637 0.00000000000000e+00 638 5.50000000000000e+00 639 -1.00000000000000e+00 640 0.00000000000000e+00 641 4.50000000000000e+00 642 -1.00000000000000e+00 643 0.00000000000000e+00 644 4.75000000000000e+00 645 -1.00000000000000e+00 646 0.00000000000000e+00 647 4.25000000000000e+00 648 -1.00000000000000e+00 649 0.00000000000000e+00 650 4.25000000000000e+00 651 -1.00000000000000e+00 652 0.00000000000000e+00 653 4.75000000000000e+00 654 -1.00000000000000e+00 655 0.00000000000000e+00 656 4.50000000000000e+00 657 -1.00000000000000e+00 658 0.00000000000000e+00 659 5.50000000000000e+00 660 -1.00000000000000e+00 661 0.00000000000000e+00 662 5.75000000000000e+00 663 -1.00000000000000e+00 664 0.00000000000000e+00 665 5.25000000000000e+00 666 -1.00000000000000e+00 667 0.00000000000000e+00 668 5.25000000000000e+00 669 -1.00000000000000e+00 670 0.00000000000000e+00 671 5.75000000000000e+00 672 -1.00000000000000e+00 673 0.00000000000000e+00 674 5.50000000000000e+00 hypre-2.33.0/src/test/TEST_ij/data/beam_tet_dof2475_np4/rbms.2.00001000066400000000000000000000361241477326011500240620ustar00rootroot00000000000000675 1275 675 0.00000000000000e+00 676 0.00000000000000e+00 677 7.00000000000000e+00 678 0.00000000000000e+00 679 0.00000000000000e+00 680 8.00000000000000e+00 681 0.00000000000000e+00 682 0.00000000000000e+00 683 7.00000000000000e+00 684 0.00000000000000e+00 685 0.00000000000000e+00 686 8.00000000000000e+00 687 -1.00000000000000e+00 688 0.00000000000000e+00 689 7.00000000000000e+00 690 -1.00000000000000e+00 691 0.00000000000000e+00 692 8.00000000000000e+00 693 -1.00000000000000e+00 694 0.00000000000000e+00 695 7.00000000000000e+00 696 -1.00000000000000e+00 697 0.00000000000000e+00 698 8.00000000000000e+00 699 0.00000000000000e+00 700 0.00000000000000e+00 701 6.50000000000000e+00 702 0.00000000000000e+00 703 0.00000000000000e+00 704 6.50000000000000e+00 705 -5.00000000000000e-01 706 0.00000000000000e+00 707 6.50000000000000e+00 708 -5.00000000000000e-01 709 0.00000000000000e+00 710 6.50000000000000e+00 711 0.00000000000000e+00 712 0.00000000000000e+00 713 7.50000000000000e+00 714 0.00000000000000e+00 715 0.00000000000000e+00 716 7.00000000000000e+00 717 0.00000000000000e+00 718 0.00000000000000e+00 719 7.50000000000000e+00 720 -5.00000000000000e-01 721 0.00000000000000e+00 722 7.00000000000000e+00 723 -5.00000000000000e-01 724 0.00000000000000e+00 725 7.50000000000000e+00 726 -5.00000000000000e-01 727 0.00000000000000e+00 728 7.00000000000000e+00 729 -5.00000000000000e-01 730 0.00000000000000e+00 731 7.50000000000000e+00 732 0.00000000000000e+00 733 0.00000000000000e+00 734 8.00000000000000e+00 735 -5.00000000000000e-01 736 0.00000000000000e+00 737 8.00000000000000e+00 738 -5.00000000000000e-01 739 0.00000000000000e+00 740 8.00000000000000e+00 741 0.00000000000000e+00 742 0.00000000000000e+00 743 6.50000000000000e+00 744 -5.00000000000000e-01 745 0.00000000000000e+00 746 6.50000000000000e+00 747 0.00000000000000e+00 748 0.00000000000000e+00 749 7.50000000000000e+00 750 -5.00000000000000e-01 751 0.00000000000000e+00 752 7.00000000000000e+00 753 -5.00000000000000e-01 754 0.00000000000000e+00 755 7.50000000000000e+00 756 -5.00000000000000e-01 757 0.00000000000000e+00 758 8.00000000000000e+00 759 -1.00000000000000e+00 760 0.00000000000000e+00 761 6.50000000000000e+00 762 -1.00000000000000e+00 763 0.00000000000000e+00 764 6.50000000000000e+00 765 -1.00000000000000e+00 766 0.00000000000000e+00 767 7.50000000000000e+00 768 -1.00000000000000e+00 769 0.00000000000000e+00 770 7.00000000000000e+00 771 -1.00000000000000e+00 772 0.00000000000000e+00 773 7.50000000000000e+00 774 -1.00000000000000e+00 775 0.00000000000000e+00 776 8.00000000000000e+00 777 -1.00000000000000e+00 778 0.00000000000000e+00 779 6.50000000000000e+00 780 -1.00000000000000e+00 781 0.00000000000000e+00 782 7.50000000000000e+00 783 0.00000000000000e+00 784 0.00000000000000e+00 785 6.25000000000000e+00 786 0.00000000000000e+00 787 0.00000000000000e+00 788 6.25000000000000e+00 789 -2.50000000000000e-01 790 0.00000000000000e+00 791 6.25000000000000e+00 792 -2.50000000000000e-01 793 0.00000000000000e+00 794 6.25000000000000e+00 795 0.00000000000000e+00 796 0.00000000000000e+00 797 6.75000000000000e+00 798 0.00000000000000e+00 799 0.00000000000000e+00 800 7.25000000000000e+00 801 0.00000000000000e+00 802 0.00000000000000e+00 803 7.00000000000000e+00 804 0.00000000000000e+00 805 0.00000000000000e+00 806 7.25000000000000e+00 807 -2.50000000000000e-01 808 0.00000000000000e+00 809 7.00000000000000e+00 810 -2.50000000000000e-01 811 0.00000000000000e+00 812 7.25000000000000e+00 813 -2.50000000000000e-01 814 0.00000000000000e+00 815 7.00000000000000e+00 816 -2.50000000000000e-01 817 0.00000000000000e+00 818 7.25000000000000e+00 819 0.00000000000000e+00 820 0.00000000000000e+00 821 7.75000000000000e+00 822 0.00000000000000e+00 823 0.00000000000000e+00 824 8.00000000000000e+00 825 -2.50000000000000e-01 826 0.00000000000000e+00 827 8.00000000000000e+00 828 -2.50000000000000e-01 829 0.00000000000000e+00 830 8.00000000000000e+00 831 0.00000000000000e+00 832 0.00000000000000e+00 833 6.25000000000000e+00 834 -2.50000000000000e-01 835 0.00000000000000e+00 836 6.25000000000000e+00 837 0.00000000000000e+00 838 0.00000000000000e+00 839 6.75000000000000e+00 840 0.00000000000000e+00 841 0.00000000000000e+00 842 7.00000000000000e+00 843 0.00000000000000e+00 844 0.00000000000000e+00 845 6.75000000000000e+00 846 0.00000000000000e+00 847 0.00000000000000e+00 848 7.25000000000000e+00 849 -2.50000000000000e-01 850 0.00000000000000e+00 851 7.00000000000000e+00 852 -2.50000000000000e-01 853 0.00000000000000e+00 854 7.25000000000000e+00 855 0.00000000000000e+00 856 0.00000000000000e+00 857 7.75000000000000e+00 858 0.00000000000000e+00 859 0.00000000000000e+00 860 8.00000000000000e+00 861 0.00000000000000e+00 862 0.00000000000000e+00 863 7.75000000000000e+00 864 -2.50000000000000e-01 865 0.00000000000000e+00 866 8.00000000000000e+00 867 -1.00000000000000e+00 868 0.00000000000000e+00 869 6.25000000000000e+00 870 -1.00000000000000e+00 871 0.00000000000000e+00 872 6.25000000000000e+00 873 -7.50000000000000e-01 874 0.00000000000000e+00 875 6.75000000000000e+00 876 -7.50000000000000e-01 877 0.00000000000000e+00 878 7.00000000000000e+00 879 -1.00000000000000e+00 880 0.00000000000000e+00 881 6.75000000000000e+00 882 -1.00000000000000e+00 883 0.00000000000000e+00 884 7.25000000000000e+00 885 -1.00000000000000e+00 886 0.00000000000000e+00 887 7.00000000000000e+00 888 -1.00000000000000e+00 889 0.00000000000000e+00 890 7.25000000000000e+00 891 -7.50000000000000e-01 892 0.00000000000000e+00 893 7.75000000000000e+00 894 -7.50000000000000e-01 895 0.00000000000000e+00 896 8.00000000000000e+00 897 -1.00000000000000e+00 898 0.00000000000000e+00 899 7.75000000000000e+00 900 -1.00000000000000e+00 901 0.00000000000000e+00 902 8.00000000000000e+00 903 -1.00000000000000e+00 904 0.00000000000000e+00 905 6.25000000000000e+00 906 -7.50000000000000e-01 907 0.00000000000000e+00 908 6.75000000000000e+00 909 -7.50000000000000e-01 910 0.00000000000000e+00 911 7.00000000000000e+00 912 -7.50000000000000e-01 913 0.00000000000000e+00 914 6.75000000000000e+00 915 -7.50000000000000e-01 916 0.00000000000000e+00 917 7.00000000000000e+00 918 -1.00000000000000e+00 919 0.00000000000000e+00 920 6.75000000000000e+00 921 -1.00000000000000e+00 922 0.00000000000000e+00 923 7.00000000000000e+00 924 -1.00000000000000e+00 925 0.00000000000000e+00 926 6.75000000000000e+00 927 -1.00000000000000e+00 928 0.00000000000000e+00 929 7.25000000000000e+00 930 -7.50000000000000e-01 931 0.00000000000000e+00 932 7.75000000000000e+00 933 -7.50000000000000e-01 934 0.00000000000000e+00 935 8.00000000000000e+00 936 -7.50000000000000e-01 937 0.00000000000000e+00 938 7.75000000000000e+00 939 -7.50000000000000e-01 940 0.00000000000000e+00 941 8.00000000000000e+00 942 -1.00000000000000e+00 943 0.00000000000000e+00 944 7.75000000000000e+00 945 -1.00000000000000e+00 946 0.00000000000000e+00 947 8.00000000000000e+00 948 -1.00000000000000e+00 949 0.00000000000000e+00 950 7.75000000000000e+00 951 0.00000000000000e+00 952 0.00000000000000e+00 953 6.50000000000000e+00 954 -2.50000000000000e-01 955 0.00000000000000e+00 956 6.50000000000000e+00 957 -2.50000000000000e-01 958 0.00000000000000e+00 959 6.50000000000000e+00 960 0.00000000000000e+00 961 0.00000000000000e+00 962 6.75000000000000e+00 963 -2.50000000000000e-01 964 0.00000000000000e+00 965 6.75000000000000e+00 966 -2.50000000000000e-01 967 0.00000000000000e+00 968 6.75000000000000e+00 969 0.00000000000000e+00 970 0.00000000000000e+00 971 6.25000000000000e+00 972 -2.50000000000000e-01 973 0.00000000000000e+00 974 6.25000000000000e+00 975 0.00000000000000e+00 976 0.00000000000000e+00 977 6.25000000000000e+00 978 -2.50000000000000e-01 979 0.00000000000000e+00 980 6.25000000000000e+00 981 -2.50000000000000e-01 982 0.00000000000000e+00 983 6.50000000000000e+00 984 0.00000000000000e+00 985 0.00000000000000e+00 986 6.75000000000000e+00 987 -2.50000000000000e-01 988 0.00000000000000e+00 989 6.75000000000000e+00 990 0.00000000000000e+00 991 0.00000000000000e+00 992 6.50000000000000e+00 993 -2.50000000000000e-01 994 0.00000000000000e+00 995 6.50000000000000e+00 996 -2.50000000000000e-01 997 0.00000000000000e+00 998 6.75000000000000e+00 999 -5.00000000000000e-01 1000 0.00000000000000e+00 1001 6.25000000000000e+00 1002 -5.00000000000000e-01 1003 0.00000000000000e+00 1004 6.25000000000000e+00 1005 -7.50000000000000e-01 1006 0.00000000000000e+00 1007 6.25000000000000e+00 1008 -7.50000000000000e-01 1009 0.00000000000000e+00 1010 6.25000000000000e+00 1011 -5.00000000000000e-01 1012 0.00000000000000e+00 1013 6.50000000000000e+00 1014 -5.00000000000000e-01 1015 0.00000000000000e+00 1016 6.75000000000000e+00 1017 -5.00000000000000e-01 1018 0.00000000000000e+00 1019 6.75000000000000e+00 1020 -7.50000000000000e-01 1021 0.00000000000000e+00 1022 6.50000000000000e+00 1023 -7.50000000000000e-01 1024 0.00000000000000e+00 1025 6.50000000000000e+00 1026 -7.50000000000000e-01 1027 0.00000000000000e+00 1028 6.75000000000000e+00 1029 -5.00000000000000e-01 1030 0.00000000000000e+00 1031 6.25000000000000e+00 1032 -5.00000000000000e-01 1033 0.00000000000000e+00 1034 6.25000000000000e+00 1035 -7.50000000000000e-01 1036 0.00000000000000e+00 1037 6.25000000000000e+00 1038 -7.50000000000000e-01 1039 0.00000000000000e+00 1040 6.25000000000000e+00 1041 -5.00000000000000e-01 1042 0.00000000000000e+00 1043 6.75000000000000e+00 1044 -5.00000000000000e-01 1045 0.00000000000000e+00 1046 6.50000000000000e+00 1047 -5.00000000000000e-01 1048 0.00000000000000e+00 1049 6.75000000000000e+00 1050 -7.50000000000000e-01 1051 0.00000000000000e+00 1052 6.50000000000000e+00 1053 -7.50000000000000e-01 1054 0.00000000000000e+00 1055 6.75000000000000e+00 1056 -7.50000000000000e-01 1057 0.00000000000000e+00 1058 6.50000000000000e+00 1059 0.00000000000000e+00 1060 0.00000000000000e+00 1061 7.50000000000000e+00 1062 -2.50000000000000e-01 1063 0.00000000000000e+00 1064 7.50000000000000e+00 1065 -2.50000000000000e-01 1066 0.00000000000000e+00 1067 7.50000000000000e+00 1068 0.00000000000000e+00 1069 0.00000000000000e+00 1070 7.75000000000000e+00 1071 -2.50000000000000e-01 1072 0.00000000000000e+00 1073 7.75000000000000e+00 1074 -2.50000000000000e-01 1075 0.00000000000000e+00 1076 7.75000000000000e+00 1077 0.00000000000000e+00 1078 0.00000000000000e+00 1079 7.25000000000000e+00 1080 -2.50000000000000e-01 1081 0.00000000000000e+00 1082 7.00000000000000e+00 1083 -2.50000000000000e-01 1084 0.00000000000000e+00 1085 7.25000000000000e+00 1086 0.00000000000000e+00 1087 0.00000000000000e+00 1088 7.25000000000000e+00 1089 -2.50000000000000e-01 1090 0.00000000000000e+00 1091 7.00000000000000e+00 1092 -2.50000000000000e-01 1093 0.00000000000000e+00 1094 7.25000000000000e+00 1095 -2.50000000000000e-01 1096 0.00000000000000e+00 1097 7.50000000000000e+00 1098 0.00000000000000e+00 1099 0.00000000000000e+00 1100 7.75000000000000e+00 1101 -2.50000000000000e-01 1102 0.00000000000000e+00 1103 7.75000000000000e+00 1104 0.00000000000000e+00 1105 0.00000000000000e+00 1106 7.50000000000000e+00 1107 -2.50000000000000e-01 1108 0.00000000000000e+00 1109 7.50000000000000e+00 1110 -2.50000000000000e-01 1111 0.00000000000000e+00 1112 7.75000000000000e+00 1113 -5.00000000000000e-01 1114 0.00000000000000e+00 1115 7.25000000000000e+00 1116 -5.00000000000000e-01 1117 0.00000000000000e+00 1118 7.00000000000000e+00 1119 -5.00000000000000e-01 1120 0.00000000000000e+00 1121 7.25000000000000e+00 1122 -7.50000000000000e-01 1123 0.00000000000000e+00 1124 7.25000000000000e+00 1125 -7.50000000000000e-01 1126 0.00000000000000e+00 1127 7.00000000000000e+00 1128 -7.50000000000000e-01 1129 0.00000000000000e+00 1130 7.25000000000000e+00 1131 -5.00000000000000e-01 1132 0.00000000000000e+00 1133 7.50000000000000e+00 1134 -5.00000000000000e-01 1135 0.00000000000000e+00 1136 7.75000000000000e+00 1137 -5.00000000000000e-01 1138 0.00000000000000e+00 1139 7.75000000000000e+00 1140 -7.50000000000000e-01 1141 0.00000000000000e+00 1142 7.50000000000000e+00 1143 -7.50000000000000e-01 1144 0.00000000000000e+00 1145 7.50000000000000e+00 1146 -7.50000000000000e-01 1147 0.00000000000000e+00 1148 7.75000000000000e+00 1149 -5.00000000000000e-01 1150 0.00000000000000e+00 1151 7.25000000000000e+00 1152 -5.00000000000000e-01 1153 0.00000000000000e+00 1154 7.00000000000000e+00 1155 -5.00000000000000e-01 1156 0.00000000000000e+00 1157 7.25000000000000e+00 1158 -7.50000000000000e-01 1159 0.00000000000000e+00 1160 7.00000000000000e+00 1161 -7.50000000000000e-01 1162 0.00000000000000e+00 1163 7.25000000000000e+00 1164 -7.50000000000000e-01 1165 0.00000000000000e+00 1166 7.25000000000000e+00 1167 -5.00000000000000e-01 1168 0.00000000000000e+00 1169 7.75000000000000e+00 1170 -5.00000000000000e-01 1171 0.00000000000000e+00 1172 7.50000000000000e+00 1173 -5.00000000000000e-01 1174 0.00000000000000e+00 1175 7.75000000000000e+00 1176 -7.50000000000000e-01 1177 0.00000000000000e+00 1178 7.50000000000000e+00 1179 -7.50000000000000e-01 1180 0.00000000000000e+00 1181 7.75000000000000e+00 1182 -7.50000000000000e-01 1183 0.00000000000000e+00 1184 7.50000000000000e+00 1185 -2.50000000000000e-01 1186 0.00000000000000e+00 1187 8.00000000000000e+00 1188 -2.50000000000000e-01 1189 0.00000000000000e+00 1190 8.00000000000000e+00 1191 -5.00000000000000e-01 1192 0.00000000000000e+00 1193 8.00000000000000e+00 1194 -7.50000000000000e-01 1195 0.00000000000000e+00 1196 8.00000000000000e+00 1197 -5.00000000000000e-01 1198 0.00000000000000e+00 1199 8.00000000000000e+00 1200 -7.50000000000000e-01 1201 0.00000000000000e+00 1202 8.00000000000000e+00 1203 -2.50000000000000e-01 1204 0.00000000000000e+00 1205 6.50000000000000e+00 1206 -2.50000000000000e-01 1207 0.00000000000000e+00 1208 6.75000000000000e+00 1209 -5.00000000000000e-01 1210 0.00000000000000e+00 1211 6.25000000000000e+00 1212 -7.50000000000000e-01 1213 0.00000000000000e+00 1214 6.25000000000000e+00 1215 -5.00000000000000e-01 1216 0.00000000000000e+00 1217 6.75000000000000e+00 1218 -7.50000000000000e-01 1219 0.00000000000000e+00 1220 6.50000000000000e+00 1221 -2.50000000000000e-01 1222 0.00000000000000e+00 1223 7.50000000000000e+00 1224 -2.50000000000000e-01 1225 0.00000000000000e+00 1226 7.75000000000000e+00 1227 -5.00000000000000e-01 1228 0.00000000000000e+00 1229 7.25000000000000e+00 1230 -7.50000000000000e-01 1231 0.00000000000000e+00 1232 7.25000000000000e+00 1233 -5.00000000000000e-01 1234 0.00000000000000e+00 1235 7.75000000000000e+00 1236 -7.50000000000000e-01 1237 0.00000000000000e+00 1238 7.50000000000000e+00 1239 -1.00000000000000e+00 1240 0.00000000000000e+00 1241 6.50000000000000e+00 1242 -1.00000000000000e+00 1243 0.00000000000000e+00 1244 6.75000000000000e+00 1245 -1.00000000000000e+00 1246 0.00000000000000e+00 1247 6.25000000000000e+00 1248 -1.00000000000000e+00 1249 0.00000000000000e+00 1250 6.25000000000000e+00 1251 -1.00000000000000e+00 1252 0.00000000000000e+00 1253 6.75000000000000e+00 1254 -1.00000000000000e+00 1255 0.00000000000000e+00 1256 6.50000000000000e+00 1257 -1.00000000000000e+00 1258 0.00000000000000e+00 1259 7.50000000000000e+00 1260 -1.00000000000000e+00 1261 0.00000000000000e+00 1262 7.75000000000000e+00 1263 -1.00000000000000e+00 1264 0.00000000000000e+00 1265 7.25000000000000e+00 1266 -1.00000000000000e+00 1267 0.00000000000000e+00 1268 7.25000000000000e+00 1269 -1.00000000000000e+00 1270 0.00000000000000e+00 1271 7.75000000000000e+00 1272 -1.00000000000000e+00 1273 0.00000000000000e+00 1274 7.50000000000000e+00 hypre-2.33.0/src/test/TEST_ij/data/beam_tet_dof2475_np4/rbms.2.00002000066400000000000000000000366321477326011500240670ustar00rootroot000000000000001275 1875 1275 0.00000000000000e+00 1276 0.00000000000000e+00 1277 2.00000000000000e+00 1278 0.00000000000000e+00 1279 0.00000000000000e+00 1280 3.00000000000000e+00 1281 0.00000000000000e+00 1282 0.00000000000000e+00 1283 2.00000000000000e+00 1284 0.00000000000000e+00 1285 0.00000000000000e+00 1286 3.00000000000000e+00 1287 -1.00000000000000e+00 1288 0.00000000000000e+00 1289 2.00000000000000e+00 1290 -1.00000000000000e+00 1291 0.00000000000000e+00 1292 3.00000000000000e+00 1293 -1.00000000000000e+00 1294 0.00000000000000e+00 1295 2.00000000000000e+00 1296 -1.00000000000000e+00 1297 0.00000000000000e+00 1298 3.00000000000000e+00 1299 0.00000000000000e+00 1300 0.00000000000000e+00 1301 2.50000000000000e+00 1302 0.00000000000000e+00 1303 0.00000000000000e+00 1304 2.00000000000000e+00 1305 0.00000000000000e+00 1306 0.00000000000000e+00 1307 2.50000000000000e+00 1308 -5.00000000000000e-01 1309 0.00000000000000e+00 1310 2.00000000000000e+00 1311 -5.00000000000000e-01 1312 0.00000000000000e+00 1313 2.50000000000000e+00 1314 -5.00000000000000e-01 1315 0.00000000000000e+00 1316 2.00000000000000e+00 1317 -5.00000000000000e-01 1318 0.00000000000000e+00 1319 2.50000000000000e+00 1320 0.00000000000000e+00 1321 0.00000000000000e+00 1322 3.50000000000000e+00 1323 0.00000000000000e+00 1324 0.00000000000000e+00 1325 3.00000000000000e+00 1326 0.00000000000000e+00 1327 0.00000000000000e+00 1328 3.50000000000000e+00 1329 -5.00000000000000e-01 1330 0.00000000000000e+00 1331 3.00000000000000e+00 1332 -5.00000000000000e-01 1333 0.00000000000000e+00 1334 3.50000000000000e+00 1335 -5.00000000000000e-01 1336 0.00000000000000e+00 1337 3.00000000000000e+00 1338 -5.00000000000000e-01 1339 0.00000000000000e+00 1340 3.50000000000000e+00 1341 0.00000000000000e+00 1342 0.00000000000000e+00 1343 2.50000000000000e+00 1344 -5.00000000000000e-01 1345 0.00000000000000e+00 1346 2.00000000000000e+00 1347 -5.00000000000000e-01 1348 0.00000000000000e+00 1349 2.50000000000000e+00 1350 0.00000000000000e+00 1351 0.00000000000000e+00 1352 3.50000000000000e+00 1353 -5.00000000000000e-01 1354 0.00000000000000e+00 1355 3.00000000000000e+00 1356 -5.00000000000000e-01 1357 0.00000000000000e+00 1358 3.50000000000000e+00 1359 -1.00000000000000e+00 1360 0.00000000000000e+00 1361 2.50000000000000e+00 1362 -1.00000000000000e+00 1363 0.00000000000000e+00 1364 2.00000000000000e+00 1365 -1.00000000000000e+00 1366 0.00000000000000e+00 1367 2.50000000000000e+00 1368 -1.00000000000000e+00 1369 0.00000000000000e+00 1370 3.50000000000000e+00 1371 -1.00000000000000e+00 1372 0.00000000000000e+00 1373 3.00000000000000e+00 1374 -1.00000000000000e+00 1375 0.00000000000000e+00 1376 3.50000000000000e+00 1377 -1.00000000000000e+00 1378 0.00000000000000e+00 1379 2.50000000000000e+00 1380 -1.00000000000000e+00 1381 0.00000000000000e+00 1382 3.50000000000000e+00 1383 0.00000000000000e+00 1384 0.00000000000000e+00 1385 2.25000000000000e+00 1386 0.00000000000000e+00 1387 0.00000000000000e+00 1388 2.00000000000000e+00 1389 0.00000000000000e+00 1390 0.00000000000000e+00 1391 2.25000000000000e+00 1392 -2.50000000000000e-01 1393 0.00000000000000e+00 1394 2.00000000000000e+00 1395 -2.50000000000000e-01 1396 0.00000000000000e+00 1397 2.25000000000000e+00 1398 -2.50000000000000e-01 1399 0.00000000000000e+00 1400 2.00000000000000e+00 1401 -2.50000000000000e-01 1402 0.00000000000000e+00 1403 2.25000000000000e+00 1404 0.00000000000000e+00 1405 0.00000000000000e+00 1406 2.75000000000000e+00 1407 0.00000000000000e+00 1408 0.00000000000000e+00 1409 3.25000000000000e+00 1410 0.00000000000000e+00 1411 0.00000000000000e+00 1412 3.00000000000000e+00 1413 0.00000000000000e+00 1414 0.00000000000000e+00 1415 3.25000000000000e+00 1416 -2.50000000000000e-01 1417 0.00000000000000e+00 1418 3.00000000000000e+00 1419 -2.50000000000000e-01 1420 0.00000000000000e+00 1421 3.25000000000000e+00 1422 -2.50000000000000e-01 1423 0.00000000000000e+00 1424 3.00000000000000e+00 1425 -2.50000000000000e-01 1426 0.00000000000000e+00 1427 3.25000000000000e+00 1428 0.00000000000000e+00 1429 0.00000000000000e+00 1430 3.75000000000000e+00 1431 0.00000000000000e+00 1432 0.00000000000000e+00 1433 2.00000000000000e+00 1434 0.00000000000000e+00 1435 0.00000000000000e+00 1436 2.25000000000000e+00 1437 -2.50000000000000e-01 1438 0.00000000000000e+00 1439 2.00000000000000e+00 1440 -2.50000000000000e-01 1441 0.00000000000000e+00 1442 2.25000000000000e+00 1443 0.00000000000000e+00 1444 0.00000000000000e+00 1445 2.75000000000000e+00 1446 0.00000000000000e+00 1447 0.00000000000000e+00 1448 3.00000000000000e+00 1449 0.00000000000000e+00 1450 0.00000000000000e+00 1451 2.75000000000000e+00 1452 0.00000000000000e+00 1453 0.00000000000000e+00 1454 3.25000000000000e+00 1455 -2.50000000000000e-01 1456 0.00000000000000e+00 1457 3.00000000000000e+00 1458 -2.50000000000000e-01 1459 0.00000000000000e+00 1460 3.25000000000000e+00 1461 0.00000000000000e+00 1462 0.00000000000000e+00 1463 3.75000000000000e+00 1464 0.00000000000000e+00 1465 0.00000000000000e+00 1466 3.75000000000000e+00 1467 -7.50000000000000e-01 1468 0.00000000000000e+00 1469 2.00000000000000e+00 1470 -1.00000000000000e+00 1471 0.00000000000000e+00 1472 2.25000000000000e+00 1473 -1.00000000000000e+00 1474 0.00000000000000e+00 1475 2.00000000000000e+00 1476 -1.00000000000000e+00 1477 0.00000000000000e+00 1478 2.25000000000000e+00 1479 -7.50000000000000e-01 1480 0.00000000000000e+00 1481 2.75000000000000e+00 1482 -7.50000000000000e-01 1483 0.00000000000000e+00 1484 3.00000000000000e+00 1485 -1.00000000000000e+00 1486 0.00000000000000e+00 1487 2.75000000000000e+00 1488 -1.00000000000000e+00 1489 0.00000000000000e+00 1490 3.25000000000000e+00 1491 -1.00000000000000e+00 1492 0.00000000000000e+00 1493 3.00000000000000e+00 1494 -1.00000000000000e+00 1495 0.00000000000000e+00 1496 3.25000000000000e+00 1497 -7.50000000000000e-01 1498 0.00000000000000e+00 1499 3.75000000000000e+00 1500 -1.00000000000000e+00 1501 0.00000000000000e+00 1502 3.75000000000000e+00 1503 -7.50000000000000e-01 1504 0.00000000000000e+00 1505 2.00000000000000e+00 1506 -7.50000000000000e-01 1507 0.00000000000000e+00 1508 2.00000000000000e+00 1509 -1.00000000000000e+00 1510 0.00000000000000e+00 1511 2.00000000000000e+00 1512 -1.00000000000000e+00 1513 0.00000000000000e+00 1514 2.25000000000000e+00 1515 -7.50000000000000e-01 1516 0.00000000000000e+00 1517 2.75000000000000e+00 1518 -7.50000000000000e-01 1519 0.00000000000000e+00 1520 3.00000000000000e+00 1521 -7.50000000000000e-01 1522 0.00000000000000e+00 1523 2.75000000000000e+00 1524 -7.50000000000000e-01 1525 0.00000000000000e+00 1526 3.00000000000000e+00 1527 -1.00000000000000e+00 1528 0.00000000000000e+00 1529 2.75000000000000e+00 1530 -1.00000000000000e+00 1531 0.00000000000000e+00 1532 3.00000000000000e+00 1533 -1.00000000000000e+00 1534 0.00000000000000e+00 1535 2.75000000000000e+00 1536 -1.00000000000000e+00 1537 0.00000000000000e+00 1538 3.25000000000000e+00 1539 -7.50000000000000e-01 1540 0.00000000000000e+00 1541 3.75000000000000e+00 1542 -7.50000000000000e-01 1543 0.00000000000000e+00 1544 3.75000000000000e+00 1545 -1.00000000000000e+00 1546 0.00000000000000e+00 1547 3.75000000000000e+00 1548 -1.00000000000000e+00 1549 0.00000000000000e+00 1550 3.75000000000000e+00 1551 0.00000000000000e+00 1552 0.00000000000000e+00 1553 2.50000000000000e+00 1554 -2.50000000000000e-01 1555 0.00000000000000e+00 1556 2.50000000000000e+00 1557 -2.50000000000000e-01 1558 0.00000000000000e+00 1559 2.50000000000000e+00 1560 0.00000000000000e+00 1561 0.00000000000000e+00 1562 2.75000000000000e+00 1563 -2.50000000000000e-01 1564 0.00000000000000e+00 1565 2.75000000000000e+00 1566 -2.50000000000000e-01 1567 0.00000000000000e+00 1568 2.75000000000000e+00 1569 0.00000000000000e+00 1570 0.00000000000000e+00 1571 2.25000000000000e+00 1572 -2.50000000000000e-01 1573 0.00000000000000e+00 1574 2.00000000000000e+00 1575 -2.50000000000000e-01 1576 0.00000000000000e+00 1577 2.25000000000000e+00 1578 0.00000000000000e+00 1579 0.00000000000000e+00 1580 2.25000000000000e+00 1581 -2.50000000000000e-01 1582 0.00000000000000e+00 1583 2.00000000000000e+00 1584 -2.50000000000000e-01 1585 0.00000000000000e+00 1586 2.25000000000000e+00 1587 -2.50000000000000e-01 1588 0.00000000000000e+00 1589 2.50000000000000e+00 1590 0.00000000000000e+00 1591 0.00000000000000e+00 1592 2.75000000000000e+00 1593 -2.50000000000000e-01 1594 0.00000000000000e+00 1595 2.75000000000000e+00 1596 0.00000000000000e+00 1597 0.00000000000000e+00 1598 2.50000000000000e+00 1599 -2.50000000000000e-01 1600 0.00000000000000e+00 1601 2.50000000000000e+00 1602 -2.50000000000000e-01 1603 0.00000000000000e+00 1604 2.75000000000000e+00 1605 -5.00000000000000e-01 1606 0.00000000000000e+00 1607 2.25000000000000e+00 1608 -5.00000000000000e-01 1609 0.00000000000000e+00 1610 2.00000000000000e+00 1611 -5.00000000000000e-01 1612 0.00000000000000e+00 1613 2.25000000000000e+00 1614 -7.50000000000000e-01 1615 0.00000000000000e+00 1616 2.25000000000000e+00 1617 -7.50000000000000e-01 1618 0.00000000000000e+00 1619 2.00000000000000e+00 1620 -7.50000000000000e-01 1621 0.00000000000000e+00 1622 2.25000000000000e+00 1623 -5.00000000000000e-01 1624 0.00000000000000e+00 1625 2.50000000000000e+00 1626 -5.00000000000000e-01 1627 0.00000000000000e+00 1628 2.75000000000000e+00 1629 -5.00000000000000e-01 1630 0.00000000000000e+00 1631 2.75000000000000e+00 1632 -7.50000000000000e-01 1633 0.00000000000000e+00 1634 2.50000000000000e+00 1635 -7.50000000000000e-01 1636 0.00000000000000e+00 1637 2.50000000000000e+00 1638 -7.50000000000000e-01 1639 0.00000000000000e+00 1640 2.75000000000000e+00 1641 -5.00000000000000e-01 1642 0.00000000000000e+00 1643 2.25000000000000e+00 1644 -5.00000000000000e-01 1645 0.00000000000000e+00 1646 2.00000000000000e+00 1647 -5.00000000000000e-01 1648 0.00000000000000e+00 1649 2.25000000000000e+00 1650 -7.50000000000000e-01 1651 0.00000000000000e+00 1652 2.00000000000000e+00 1653 -7.50000000000000e-01 1654 0.00000000000000e+00 1655 2.25000000000000e+00 1656 -7.50000000000000e-01 1657 0.00000000000000e+00 1658 2.25000000000000e+00 1659 -5.00000000000000e-01 1660 0.00000000000000e+00 1661 2.75000000000000e+00 1662 -5.00000000000000e-01 1663 0.00000000000000e+00 1664 2.50000000000000e+00 1665 -5.00000000000000e-01 1666 0.00000000000000e+00 1667 2.75000000000000e+00 1668 -7.50000000000000e-01 1669 0.00000000000000e+00 1670 2.50000000000000e+00 1671 -7.50000000000000e-01 1672 0.00000000000000e+00 1673 2.75000000000000e+00 1674 -7.50000000000000e-01 1675 0.00000000000000e+00 1676 2.50000000000000e+00 1677 0.00000000000000e+00 1678 0.00000000000000e+00 1679 3.50000000000000e+00 1680 -2.50000000000000e-01 1681 0.00000000000000e+00 1682 3.50000000000000e+00 1683 -2.50000000000000e-01 1684 0.00000000000000e+00 1685 3.50000000000000e+00 1686 0.00000000000000e+00 1687 0.00000000000000e+00 1688 3.75000000000000e+00 1689 -2.50000000000000e-01 1690 0.00000000000000e+00 1691 3.75000000000000e+00 1692 -2.50000000000000e-01 1693 0.00000000000000e+00 1694 3.75000000000000e+00 1695 0.00000000000000e+00 1696 0.00000000000000e+00 1697 3.25000000000000e+00 1698 -2.50000000000000e-01 1699 0.00000000000000e+00 1700 3.00000000000000e+00 1701 -2.50000000000000e-01 1702 0.00000000000000e+00 1703 3.25000000000000e+00 1704 0.00000000000000e+00 1705 0.00000000000000e+00 1706 3.25000000000000e+00 1707 -2.50000000000000e-01 1708 0.00000000000000e+00 1709 3.00000000000000e+00 1710 -2.50000000000000e-01 1711 0.00000000000000e+00 1712 3.25000000000000e+00 1713 -2.50000000000000e-01 1714 0.00000000000000e+00 1715 3.50000000000000e+00 1716 0.00000000000000e+00 1717 0.00000000000000e+00 1718 3.75000000000000e+00 1719 -2.50000000000000e-01 1720 0.00000000000000e+00 1721 3.75000000000000e+00 1722 0.00000000000000e+00 1723 0.00000000000000e+00 1724 3.50000000000000e+00 1725 -2.50000000000000e-01 1726 0.00000000000000e+00 1727 3.50000000000000e+00 1728 -2.50000000000000e-01 1729 0.00000000000000e+00 1730 3.75000000000000e+00 1731 -5.00000000000000e-01 1732 0.00000000000000e+00 1733 3.25000000000000e+00 1734 -5.00000000000000e-01 1735 0.00000000000000e+00 1736 3.00000000000000e+00 1737 -5.00000000000000e-01 1738 0.00000000000000e+00 1739 3.25000000000000e+00 1740 -7.50000000000000e-01 1741 0.00000000000000e+00 1742 3.25000000000000e+00 1743 -7.50000000000000e-01 1744 0.00000000000000e+00 1745 3.00000000000000e+00 1746 -7.50000000000000e-01 1747 0.00000000000000e+00 1748 3.25000000000000e+00 1749 -5.00000000000000e-01 1750 0.00000000000000e+00 1751 3.50000000000000e+00 1752 -5.00000000000000e-01 1753 0.00000000000000e+00 1754 3.75000000000000e+00 1755 -5.00000000000000e-01 1756 0.00000000000000e+00 1757 3.75000000000000e+00 1758 -7.50000000000000e-01 1759 0.00000000000000e+00 1760 3.50000000000000e+00 1761 -7.50000000000000e-01 1762 0.00000000000000e+00 1763 3.50000000000000e+00 1764 -7.50000000000000e-01 1765 0.00000000000000e+00 1766 3.75000000000000e+00 1767 -5.00000000000000e-01 1768 0.00000000000000e+00 1769 3.25000000000000e+00 1770 -5.00000000000000e-01 1771 0.00000000000000e+00 1772 3.00000000000000e+00 1773 -5.00000000000000e-01 1774 0.00000000000000e+00 1775 3.25000000000000e+00 1776 -7.50000000000000e-01 1777 0.00000000000000e+00 1778 3.00000000000000e+00 1779 -7.50000000000000e-01 1780 0.00000000000000e+00 1781 3.25000000000000e+00 1782 -7.50000000000000e-01 1783 0.00000000000000e+00 1784 3.25000000000000e+00 1785 -5.00000000000000e-01 1786 0.00000000000000e+00 1787 3.75000000000000e+00 1788 -5.00000000000000e-01 1789 0.00000000000000e+00 1790 3.50000000000000e+00 1791 -5.00000000000000e-01 1792 0.00000000000000e+00 1793 3.75000000000000e+00 1794 -7.50000000000000e-01 1795 0.00000000000000e+00 1796 3.50000000000000e+00 1797 -7.50000000000000e-01 1798 0.00000000000000e+00 1799 3.75000000000000e+00 1800 -7.50000000000000e-01 1801 0.00000000000000e+00 1802 3.50000000000000e+00 1803 -2.50000000000000e-01 1804 0.00000000000000e+00 1805 2.50000000000000e+00 1806 -2.50000000000000e-01 1807 0.00000000000000e+00 1808 2.75000000000000e+00 1809 -5.00000000000000e-01 1810 0.00000000000000e+00 1811 2.25000000000000e+00 1812 -7.50000000000000e-01 1813 0.00000000000000e+00 1814 2.25000000000000e+00 1815 -5.00000000000000e-01 1816 0.00000000000000e+00 1817 2.75000000000000e+00 1818 -7.50000000000000e-01 1819 0.00000000000000e+00 1820 2.50000000000000e+00 1821 -2.50000000000000e-01 1822 0.00000000000000e+00 1823 3.50000000000000e+00 1824 -2.50000000000000e-01 1825 0.00000000000000e+00 1826 3.75000000000000e+00 1827 -5.00000000000000e-01 1828 0.00000000000000e+00 1829 3.25000000000000e+00 1830 -7.50000000000000e-01 1831 0.00000000000000e+00 1832 3.25000000000000e+00 1833 -5.00000000000000e-01 1834 0.00000000000000e+00 1835 3.75000000000000e+00 1836 -7.50000000000000e-01 1837 0.00000000000000e+00 1838 3.50000000000000e+00 1839 -1.00000000000000e+00 1840 0.00000000000000e+00 1841 2.50000000000000e+00 1842 -1.00000000000000e+00 1843 0.00000000000000e+00 1844 2.75000000000000e+00 1845 -1.00000000000000e+00 1846 0.00000000000000e+00 1847 2.25000000000000e+00 1848 -1.00000000000000e+00 1849 0.00000000000000e+00 1850 2.25000000000000e+00 1851 -1.00000000000000e+00 1852 0.00000000000000e+00 1853 2.75000000000000e+00 1854 -1.00000000000000e+00 1855 0.00000000000000e+00 1856 2.50000000000000e+00 1857 -1.00000000000000e+00 1858 0.00000000000000e+00 1859 3.50000000000000e+00 1860 -1.00000000000000e+00 1861 0.00000000000000e+00 1862 3.75000000000000e+00 1863 -1.00000000000000e+00 1864 0.00000000000000e+00 1865 3.25000000000000e+00 1866 -1.00000000000000e+00 1867 0.00000000000000e+00 1868 3.25000000000000e+00 1869 -1.00000000000000e+00 1870 0.00000000000000e+00 1871 3.75000000000000e+00 1872 -1.00000000000000e+00 1873 0.00000000000000e+00 1874 3.50000000000000e+00 hypre-2.33.0/src/test/TEST_ij/data/beam_tet_dof2475_np4/rbms.2.00003000066400000000000000000000366321477326011500240700ustar00rootroot000000000000001875 2475 1875 0.00000000000000e+00 1876 0.00000000000000e+00 1877 0.00000000000000e+00 1878 0.00000000000000e+00 1879 0.00000000000000e+00 1880 1.00000000000000e+00 1881 0.00000000000000e+00 1882 0.00000000000000e+00 1883 0.00000000000000e+00 1884 0.00000000000000e+00 1885 0.00000000000000e+00 1886 1.00000000000000e+00 1887 -1.00000000000000e+00 1888 0.00000000000000e+00 1889 0.00000000000000e+00 1890 -1.00000000000000e+00 1891 0.00000000000000e+00 1892 1.00000000000000e+00 1893 -1.00000000000000e+00 1894 0.00000000000000e+00 1895 0.00000000000000e+00 1896 -1.00000000000000e+00 1897 0.00000000000000e+00 1898 1.00000000000000e+00 1899 0.00000000000000e+00 1900 0.00000000000000e+00 1901 5.00000000000000e-01 1902 0.00000000000000e+00 1903 0.00000000000000e+00 1904 0.00000000000000e+00 1905 0.00000000000000e+00 1906 0.00000000000000e+00 1907 5.00000000000000e-01 1908 -5.00000000000000e-01 1909 0.00000000000000e+00 1910 0.00000000000000e+00 1911 -5.00000000000000e-01 1912 0.00000000000000e+00 1913 5.00000000000000e-01 1914 -5.00000000000000e-01 1915 0.00000000000000e+00 1916 0.00000000000000e+00 1917 -5.00000000000000e-01 1918 0.00000000000000e+00 1919 5.00000000000000e-01 1920 0.00000000000000e+00 1921 0.00000000000000e+00 1922 1.50000000000000e+00 1923 0.00000000000000e+00 1924 0.00000000000000e+00 1925 1.00000000000000e+00 1926 0.00000000000000e+00 1927 0.00000000000000e+00 1928 1.50000000000000e+00 1929 -5.00000000000000e-01 1930 0.00000000000000e+00 1931 1.00000000000000e+00 1932 -5.00000000000000e-01 1933 0.00000000000000e+00 1934 1.50000000000000e+00 1935 -5.00000000000000e-01 1936 0.00000000000000e+00 1937 1.00000000000000e+00 1938 -5.00000000000000e-01 1939 0.00000000000000e+00 1940 1.50000000000000e+00 1941 0.00000000000000e+00 1942 0.00000000000000e+00 1943 5.00000000000000e-01 1944 -5.00000000000000e-01 1945 0.00000000000000e+00 1946 0.00000000000000e+00 1947 -5.00000000000000e-01 1948 0.00000000000000e+00 1949 5.00000000000000e-01 1950 0.00000000000000e+00 1951 0.00000000000000e+00 1952 1.50000000000000e+00 1953 -5.00000000000000e-01 1954 0.00000000000000e+00 1955 1.00000000000000e+00 1956 -5.00000000000000e-01 1957 0.00000000000000e+00 1958 1.50000000000000e+00 1959 -1.00000000000000e+00 1960 0.00000000000000e+00 1961 5.00000000000000e-01 1962 -1.00000000000000e+00 1963 0.00000000000000e+00 1964 0.00000000000000e+00 1965 -1.00000000000000e+00 1966 0.00000000000000e+00 1967 5.00000000000000e-01 1968 -1.00000000000000e+00 1969 0.00000000000000e+00 1970 1.50000000000000e+00 1971 -1.00000000000000e+00 1972 0.00000000000000e+00 1973 1.00000000000000e+00 1974 -1.00000000000000e+00 1975 0.00000000000000e+00 1976 1.50000000000000e+00 1977 -1.00000000000000e+00 1978 0.00000000000000e+00 1979 5.00000000000000e-01 1980 -1.00000000000000e+00 1981 0.00000000000000e+00 1982 1.50000000000000e+00 1983 0.00000000000000e+00 1984 0.00000000000000e+00 1985 2.50000000000000e-01 1986 0.00000000000000e+00 1987 0.00000000000000e+00 1988 0.00000000000000e+00 1989 0.00000000000000e+00 1990 0.00000000000000e+00 1991 2.50000000000000e-01 1992 -2.50000000000000e-01 1993 0.00000000000000e+00 1994 0.00000000000000e+00 1995 -2.50000000000000e-01 1996 0.00000000000000e+00 1997 2.50000000000000e-01 1998 -2.50000000000000e-01 1999 0.00000000000000e+00 2000 0.00000000000000e+00 2001 -2.50000000000000e-01 2002 0.00000000000000e+00 2003 2.50000000000000e-01 2004 0.00000000000000e+00 2005 0.00000000000000e+00 2006 7.50000000000000e-01 2007 0.00000000000000e+00 2008 0.00000000000000e+00 2009 1.25000000000000e+00 2010 0.00000000000000e+00 2011 0.00000000000000e+00 2012 1.00000000000000e+00 2013 0.00000000000000e+00 2014 0.00000000000000e+00 2015 1.25000000000000e+00 2016 -2.50000000000000e-01 2017 0.00000000000000e+00 2018 1.00000000000000e+00 2019 -2.50000000000000e-01 2020 0.00000000000000e+00 2021 1.25000000000000e+00 2022 -2.50000000000000e-01 2023 0.00000000000000e+00 2024 1.00000000000000e+00 2025 -2.50000000000000e-01 2026 0.00000000000000e+00 2027 1.25000000000000e+00 2028 0.00000000000000e+00 2029 0.00000000000000e+00 2030 1.75000000000000e+00 2031 0.00000000000000e+00 2032 0.00000000000000e+00 2033 0.00000000000000e+00 2034 0.00000000000000e+00 2035 0.00000000000000e+00 2036 2.50000000000000e-01 2037 -2.50000000000000e-01 2038 0.00000000000000e+00 2039 0.00000000000000e+00 2040 -2.50000000000000e-01 2041 0.00000000000000e+00 2042 2.50000000000000e-01 2043 0.00000000000000e+00 2044 0.00000000000000e+00 2045 7.50000000000000e-01 2046 0.00000000000000e+00 2047 0.00000000000000e+00 2048 1.00000000000000e+00 2049 0.00000000000000e+00 2050 0.00000000000000e+00 2051 7.50000000000000e-01 2052 0.00000000000000e+00 2053 0.00000000000000e+00 2054 1.25000000000000e+00 2055 -2.50000000000000e-01 2056 0.00000000000000e+00 2057 1.00000000000000e+00 2058 -2.50000000000000e-01 2059 0.00000000000000e+00 2060 1.25000000000000e+00 2061 0.00000000000000e+00 2062 0.00000000000000e+00 2063 1.75000000000000e+00 2064 0.00000000000000e+00 2065 0.00000000000000e+00 2066 1.75000000000000e+00 2067 -7.50000000000000e-01 2068 0.00000000000000e+00 2069 0.00000000000000e+00 2070 -1.00000000000000e+00 2071 0.00000000000000e+00 2072 2.50000000000000e-01 2073 -1.00000000000000e+00 2074 0.00000000000000e+00 2075 0.00000000000000e+00 2076 -1.00000000000000e+00 2077 0.00000000000000e+00 2078 2.50000000000000e-01 2079 -7.50000000000000e-01 2080 0.00000000000000e+00 2081 7.50000000000000e-01 2082 -7.50000000000000e-01 2083 0.00000000000000e+00 2084 1.00000000000000e+00 2085 -1.00000000000000e+00 2086 0.00000000000000e+00 2087 7.50000000000000e-01 2088 -1.00000000000000e+00 2089 0.00000000000000e+00 2090 1.25000000000000e+00 2091 -1.00000000000000e+00 2092 0.00000000000000e+00 2093 1.00000000000000e+00 2094 -1.00000000000000e+00 2095 0.00000000000000e+00 2096 1.25000000000000e+00 2097 -7.50000000000000e-01 2098 0.00000000000000e+00 2099 1.75000000000000e+00 2100 -1.00000000000000e+00 2101 0.00000000000000e+00 2102 1.75000000000000e+00 2103 -7.50000000000000e-01 2104 0.00000000000000e+00 2105 0.00000000000000e+00 2106 -7.50000000000000e-01 2107 0.00000000000000e+00 2108 0.00000000000000e+00 2109 -1.00000000000000e+00 2110 0.00000000000000e+00 2111 0.00000000000000e+00 2112 -1.00000000000000e+00 2113 0.00000000000000e+00 2114 2.50000000000000e-01 2115 -7.50000000000000e-01 2116 0.00000000000000e+00 2117 7.50000000000000e-01 2118 -7.50000000000000e-01 2119 0.00000000000000e+00 2120 1.00000000000000e+00 2121 -7.50000000000000e-01 2122 0.00000000000000e+00 2123 7.50000000000000e-01 2124 -7.50000000000000e-01 2125 0.00000000000000e+00 2126 1.00000000000000e+00 2127 -1.00000000000000e+00 2128 0.00000000000000e+00 2129 7.50000000000000e-01 2130 -1.00000000000000e+00 2131 0.00000000000000e+00 2132 1.00000000000000e+00 2133 -1.00000000000000e+00 2134 0.00000000000000e+00 2135 7.50000000000000e-01 2136 -1.00000000000000e+00 2137 0.00000000000000e+00 2138 1.25000000000000e+00 2139 -7.50000000000000e-01 2140 0.00000000000000e+00 2141 1.75000000000000e+00 2142 -7.50000000000000e-01 2143 0.00000000000000e+00 2144 1.75000000000000e+00 2145 -1.00000000000000e+00 2146 0.00000000000000e+00 2147 1.75000000000000e+00 2148 -1.00000000000000e+00 2149 0.00000000000000e+00 2150 1.75000000000000e+00 2151 0.00000000000000e+00 2152 0.00000000000000e+00 2153 5.00000000000000e-01 2154 -2.50000000000000e-01 2155 0.00000000000000e+00 2156 5.00000000000000e-01 2157 -2.50000000000000e-01 2158 0.00000000000000e+00 2159 5.00000000000000e-01 2160 0.00000000000000e+00 2161 0.00000000000000e+00 2162 7.50000000000000e-01 2163 -2.50000000000000e-01 2164 0.00000000000000e+00 2165 7.50000000000000e-01 2166 -2.50000000000000e-01 2167 0.00000000000000e+00 2168 7.50000000000000e-01 2169 0.00000000000000e+00 2170 0.00000000000000e+00 2171 2.50000000000000e-01 2172 -2.50000000000000e-01 2173 0.00000000000000e+00 2174 0.00000000000000e+00 2175 -2.50000000000000e-01 2176 0.00000000000000e+00 2177 2.50000000000000e-01 2178 0.00000000000000e+00 2179 0.00000000000000e+00 2180 2.50000000000000e-01 2181 -2.50000000000000e-01 2182 0.00000000000000e+00 2183 0.00000000000000e+00 2184 -2.50000000000000e-01 2185 0.00000000000000e+00 2186 2.50000000000000e-01 2187 -2.50000000000000e-01 2188 0.00000000000000e+00 2189 5.00000000000000e-01 2190 0.00000000000000e+00 2191 0.00000000000000e+00 2192 7.50000000000000e-01 2193 -2.50000000000000e-01 2194 0.00000000000000e+00 2195 7.50000000000000e-01 2196 0.00000000000000e+00 2197 0.00000000000000e+00 2198 5.00000000000000e-01 2199 -2.50000000000000e-01 2200 0.00000000000000e+00 2201 5.00000000000000e-01 2202 -2.50000000000000e-01 2203 0.00000000000000e+00 2204 7.50000000000000e-01 2205 -5.00000000000000e-01 2206 0.00000000000000e+00 2207 2.50000000000000e-01 2208 -5.00000000000000e-01 2209 0.00000000000000e+00 2210 0.00000000000000e+00 2211 -5.00000000000000e-01 2212 0.00000000000000e+00 2213 2.50000000000000e-01 2214 -7.50000000000000e-01 2215 0.00000000000000e+00 2216 2.50000000000000e-01 2217 -7.50000000000000e-01 2218 0.00000000000000e+00 2219 0.00000000000000e+00 2220 -7.50000000000000e-01 2221 0.00000000000000e+00 2222 2.50000000000000e-01 2223 -5.00000000000000e-01 2224 0.00000000000000e+00 2225 5.00000000000000e-01 2226 -5.00000000000000e-01 2227 0.00000000000000e+00 2228 7.50000000000000e-01 2229 -5.00000000000000e-01 2230 0.00000000000000e+00 2231 7.50000000000000e-01 2232 -7.50000000000000e-01 2233 0.00000000000000e+00 2234 5.00000000000000e-01 2235 -7.50000000000000e-01 2236 0.00000000000000e+00 2237 5.00000000000000e-01 2238 -7.50000000000000e-01 2239 0.00000000000000e+00 2240 7.50000000000000e-01 2241 -5.00000000000000e-01 2242 0.00000000000000e+00 2243 2.50000000000000e-01 2244 -5.00000000000000e-01 2245 0.00000000000000e+00 2246 0.00000000000000e+00 2247 -5.00000000000000e-01 2248 0.00000000000000e+00 2249 2.50000000000000e-01 2250 -7.50000000000000e-01 2251 0.00000000000000e+00 2252 0.00000000000000e+00 2253 -7.50000000000000e-01 2254 0.00000000000000e+00 2255 2.50000000000000e-01 2256 -7.50000000000000e-01 2257 0.00000000000000e+00 2258 2.50000000000000e-01 2259 -5.00000000000000e-01 2260 0.00000000000000e+00 2261 7.50000000000000e-01 2262 -5.00000000000000e-01 2263 0.00000000000000e+00 2264 5.00000000000000e-01 2265 -5.00000000000000e-01 2266 0.00000000000000e+00 2267 7.50000000000000e-01 2268 -7.50000000000000e-01 2269 0.00000000000000e+00 2270 5.00000000000000e-01 2271 -7.50000000000000e-01 2272 0.00000000000000e+00 2273 7.50000000000000e-01 2274 -7.50000000000000e-01 2275 0.00000000000000e+00 2276 5.00000000000000e-01 2277 0.00000000000000e+00 2278 0.00000000000000e+00 2279 1.50000000000000e+00 2280 -2.50000000000000e-01 2281 0.00000000000000e+00 2282 1.50000000000000e+00 2283 -2.50000000000000e-01 2284 0.00000000000000e+00 2285 1.50000000000000e+00 2286 0.00000000000000e+00 2287 0.00000000000000e+00 2288 1.75000000000000e+00 2289 -2.50000000000000e-01 2290 0.00000000000000e+00 2291 1.75000000000000e+00 2292 -2.50000000000000e-01 2293 0.00000000000000e+00 2294 1.75000000000000e+00 2295 0.00000000000000e+00 2296 0.00000000000000e+00 2297 1.25000000000000e+00 2298 -2.50000000000000e-01 2299 0.00000000000000e+00 2300 1.00000000000000e+00 2301 -2.50000000000000e-01 2302 0.00000000000000e+00 2303 1.25000000000000e+00 2304 0.00000000000000e+00 2305 0.00000000000000e+00 2306 1.25000000000000e+00 2307 -2.50000000000000e-01 2308 0.00000000000000e+00 2309 1.00000000000000e+00 2310 -2.50000000000000e-01 2311 0.00000000000000e+00 2312 1.25000000000000e+00 2313 -2.50000000000000e-01 2314 0.00000000000000e+00 2315 1.50000000000000e+00 2316 0.00000000000000e+00 2317 0.00000000000000e+00 2318 1.75000000000000e+00 2319 -2.50000000000000e-01 2320 0.00000000000000e+00 2321 1.75000000000000e+00 2322 0.00000000000000e+00 2323 0.00000000000000e+00 2324 1.50000000000000e+00 2325 -2.50000000000000e-01 2326 0.00000000000000e+00 2327 1.50000000000000e+00 2328 -2.50000000000000e-01 2329 0.00000000000000e+00 2330 1.75000000000000e+00 2331 -5.00000000000000e-01 2332 0.00000000000000e+00 2333 1.25000000000000e+00 2334 -5.00000000000000e-01 2335 0.00000000000000e+00 2336 1.00000000000000e+00 2337 -5.00000000000000e-01 2338 0.00000000000000e+00 2339 1.25000000000000e+00 2340 -7.50000000000000e-01 2341 0.00000000000000e+00 2342 1.25000000000000e+00 2343 -7.50000000000000e-01 2344 0.00000000000000e+00 2345 1.00000000000000e+00 2346 -7.50000000000000e-01 2347 0.00000000000000e+00 2348 1.25000000000000e+00 2349 -5.00000000000000e-01 2350 0.00000000000000e+00 2351 1.50000000000000e+00 2352 -5.00000000000000e-01 2353 0.00000000000000e+00 2354 1.75000000000000e+00 2355 -5.00000000000000e-01 2356 0.00000000000000e+00 2357 1.75000000000000e+00 2358 -7.50000000000000e-01 2359 0.00000000000000e+00 2360 1.50000000000000e+00 2361 -7.50000000000000e-01 2362 0.00000000000000e+00 2363 1.50000000000000e+00 2364 -7.50000000000000e-01 2365 0.00000000000000e+00 2366 1.75000000000000e+00 2367 -5.00000000000000e-01 2368 0.00000000000000e+00 2369 1.25000000000000e+00 2370 -5.00000000000000e-01 2371 0.00000000000000e+00 2372 1.00000000000000e+00 2373 -5.00000000000000e-01 2374 0.00000000000000e+00 2375 1.25000000000000e+00 2376 -7.50000000000000e-01 2377 0.00000000000000e+00 2378 1.00000000000000e+00 2379 -7.50000000000000e-01 2380 0.00000000000000e+00 2381 1.25000000000000e+00 2382 -7.50000000000000e-01 2383 0.00000000000000e+00 2384 1.25000000000000e+00 2385 -5.00000000000000e-01 2386 0.00000000000000e+00 2387 1.75000000000000e+00 2388 -5.00000000000000e-01 2389 0.00000000000000e+00 2390 1.50000000000000e+00 2391 -5.00000000000000e-01 2392 0.00000000000000e+00 2393 1.75000000000000e+00 2394 -7.50000000000000e-01 2395 0.00000000000000e+00 2396 1.50000000000000e+00 2397 -7.50000000000000e-01 2398 0.00000000000000e+00 2399 1.75000000000000e+00 2400 -7.50000000000000e-01 2401 0.00000000000000e+00 2402 1.50000000000000e+00 2403 -2.50000000000000e-01 2404 0.00000000000000e+00 2405 5.00000000000000e-01 2406 -2.50000000000000e-01 2407 0.00000000000000e+00 2408 7.50000000000000e-01 2409 -5.00000000000000e-01 2410 0.00000000000000e+00 2411 2.50000000000000e-01 2412 -7.50000000000000e-01 2413 0.00000000000000e+00 2414 2.50000000000000e-01 2415 -5.00000000000000e-01 2416 0.00000000000000e+00 2417 7.50000000000000e-01 2418 -7.50000000000000e-01 2419 0.00000000000000e+00 2420 5.00000000000000e-01 2421 -2.50000000000000e-01 2422 0.00000000000000e+00 2423 1.50000000000000e+00 2424 -2.50000000000000e-01 2425 0.00000000000000e+00 2426 1.75000000000000e+00 2427 -5.00000000000000e-01 2428 0.00000000000000e+00 2429 1.25000000000000e+00 2430 -7.50000000000000e-01 2431 0.00000000000000e+00 2432 1.25000000000000e+00 2433 -5.00000000000000e-01 2434 0.00000000000000e+00 2435 1.75000000000000e+00 2436 -7.50000000000000e-01 2437 0.00000000000000e+00 2438 1.50000000000000e+00 2439 -1.00000000000000e+00 2440 0.00000000000000e+00 2441 5.00000000000000e-01 2442 -1.00000000000000e+00 2443 0.00000000000000e+00 2444 7.50000000000000e-01 2445 -1.00000000000000e+00 2446 0.00000000000000e+00 2447 2.50000000000000e-01 2448 -1.00000000000000e+00 2449 0.00000000000000e+00 2450 2.50000000000000e-01 2451 -1.00000000000000e+00 2452 0.00000000000000e+00 2453 7.50000000000000e-01 2454 -1.00000000000000e+00 2455 0.00000000000000e+00 2456 5.00000000000000e-01 2457 -1.00000000000000e+00 2458 0.00000000000000e+00 2459 1.50000000000000e+00 2460 -1.00000000000000e+00 2461 0.00000000000000e+00 2462 1.75000000000000e+00 2463 -1.00000000000000e+00 2464 0.00000000000000e+00 2465 1.25000000000000e+00 2466 -1.00000000000000e+00 2467 0.00000000000000e+00 2468 1.25000000000000e+00 2469 -1.00000000000000e+00 2470 0.00000000000000e+00 2471 1.75000000000000e+00 2472 -1.00000000000000e+00 2473 0.00000000000000e+00 2474 1.50000000000000e+00 hypre-2.33.0/src/test/TEST_ij/data/beam_tet_dof459_np1/000077500000000000000000000000001477326011500223045ustar00rootroot00000000000000hypre-2.33.0/src/test/TEST_ij/data/beam_tet_dof459_np1/A.IJ.00000000066400000000000000000012015631477326011500233560ustar00rootroot000000000000000 458 0 458 0 0 1.00000000000000e+00 0 124 0.00000000000000e+00 0 111 0.00000000000000e+00 0 125 0.00000000000000e+00 0 116 0.00000000000000e+00 0 128 0.00000000000000e+00 0 109 0.00000000000000e+00 0 115 0.00000000000000e+00 0 110 0.00000000000000e+00 0 121 0.00000000000000e+00 0 127 0.00000000000000e+00 0 108 0.00000000000000e+00 0 119 0.00000000000000e+00 0 122 0.00000000000000e+00 0 117 0.00000000000000e+00 0 112 0.00000000000000e+00 1 1 1.00000000000000e+00 1 111 0.00000000000000e+00 1 113 0.00000000000000e+00 1 112 0.00000000000000e+00 1 123 0.00000000000000e+00 1 125 0.00000000000000e+00 1 119 0.00000000000000e+00 1 108 0.00000000000000e+00 1 114 0.00000000000000e+00 1 109 0.00000000000000e+00 1 120 0.00000000000000e+00 1 126 0.00000000000000e+00 1 122 0.00000000000000e+00 1 128 0.00000000000000e+00 1 118 0.00000000000000e+00 1 116 0.00000000000000e+00 2 2 1.00000000000000e+00 2 113 0.00000000000000e+00 2 112 0.00000000000000e+00 2 124 0.00000000000000e+00 2 118 0.00000000000000e+00 2 123 0.00000000000000e+00 2 114 0.00000000000000e+00 2 126 0.00000000000000e+00 2 110 0.00000000000000e+00 2 108 0.00000000000000e+00 2 119 0.00000000000000e+00 2 115 0.00000000000000e+00 2 121 0.00000000000000e+00 2 127 0.00000000000000e+00 2 117 0.00000000000000e+00 2 120 0.00000000000000e+00 3 3 7.50000000000000e+01 3 149 -8.33333333333333e+00 3 130 4.16666666666667e+00 3 136 -8.33333333333333e+00 3 131 4.16666666666667e+00 3 142 4.16666666666667e+00 3 148 -8.33333333333333e+00 3 129 -2.50000000000000e+01 3 143 -8.33333333333333e+00 3 134 -4.16666666666667e+00 3 146 8.33333333333333e+00 3 4 -8.33333333333333e+00 3 133 8.33333333333333e+00 3 109 4.16666666666667e+00 3 132 -1.25000000000000e+01 3 5 -8.33333333333333e+00 3 140 8.33333333333333e+00 3 110 4.16666666666667e+00 3 139 -4.16666666666667e+00 3 145 8.33333333333333e+00 3 137 4.16666666666667e+00 3 138 -1.25000000000000e+01 3 108 -2.50000000000000e+01 4 4 6.66666666666667e+01 4 129 4.16666666666667e+00 4 135 -8.33333333333333e+00 4 130 -8.33333333333333e+00 4 141 4.16666666666667e+00 4 147 -8.33333333333333e+00 4 143 4.16666666666667e+00 4 149 -8.33333333333333e+00 4 134 8.33333333333333e+00 4 133 -3.75000000000000e+01 4 3 -8.33333333333333e+00 4 132 8.33333333333333e+00 4 108 4.16666666666667e+00 4 140 8.33333333333333e+00 4 146 -1.66666666666667e+01 4 137 4.16666666666667e+00 4 139 -1.25000000000000e+01 4 109 -8.33333333333333e+00 4 138 -4.16666666666667e+00 4 144 8.33333333333333e+00 5 5 6.66666666666667e+01 5 135 4.16666666666667e+00 5 147 -8.33333333333333e+00 5 131 -8.33333333333333e+00 5 129 4.16666666666667e+00 5 142 4.16666666666667e+00 5 148 -8.33333333333333e+00 5 141 -8.33333333333333e+00 5 134 -1.25000000000000e+01 5 133 8.33333333333333e+00 5 132 -4.16666666666667e+00 5 144 8.33333333333333e+00 5 136 4.16666666666667e+00 5 140 -3.75000000000000e+01 5 110 -8.33333333333333e+00 5 139 8.33333333333333e+00 5 145 -1.66666666666667e+01 5 3 -8.33333333333333e+00 5 138 8.33333333333333e+00 5 108 4.16666666666667e+00 6 6 7.50000000000000e+01 6 170 -8.33333333333333e+00 6 151 4.16666666666667e+00 6 157 -8.33333333333333e+00 6 152 4.16666666666667e+00 6 163 4.16666666666667e+00 6 169 -8.33333333333333e+00 6 150 -2.50000000000000e+01 6 164 -8.33333333333333e+00 6 155 -4.16666666666667e+00 6 167 8.33333333333333e+00 6 7 -8.33333333333333e+00 6 154 8.33333333333333e+00 6 130 4.16666666666667e+00 6 153 -1.25000000000000e+01 6 8 -8.33333333333333e+00 6 161 8.33333333333333e+00 6 131 4.16666666666667e+00 6 160 -4.16666666666667e+00 6 166 8.33333333333333e+00 6 158 4.16666666666667e+00 6 159 -1.25000000000000e+01 6 129 -2.50000000000000e+01 7 7 6.66666666666667e+01 7 150 4.16666666666667e+00 7 156 -8.33333333333333e+00 7 151 -8.33333333333333e+00 7 162 4.16666666666667e+00 7 168 -8.33333333333333e+00 7 164 4.16666666666667e+00 7 170 -8.33333333333333e+00 7 155 8.33333333333333e+00 7 154 -3.75000000000000e+01 7 6 -8.33333333333333e+00 7 153 8.33333333333333e+00 7 129 4.16666666666667e+00 7 161 8.33333333333333e+00 7 167 -1.66666666666667e+01 7 158 4.16666666666667e+00 7 160 -1.25000000000000e+01 7 130 -8.33333333333333e+00 7 159 -4.16666666666667e+00 7 165 8.33333333333333e+00 8 8 6.66666666666667e+01 8 156 4.16666666666667e+00 8 168 -8.33333333333333e+00 8 152 -8.33333333333333e+00 8 150 4.16666666666667e+00 8 163 4.16666666666667e+00 8 169 -8.33333333333333e+00 8 162 -8.33333333333333e+00 8 155 -1.25000000000000e+01 8 154 8.33333333333333e+00 8 153 -4.16666666666667e+00 8 165 8.33333333333333e+00 8 157 4.16666666666667e+00 8 161 -3.75000000000000e+01 8 131 -8.33333333333333e+00 8 160 8.33333333333333e+00 8 166 -1.66666666666667e+01 8 6 -8.33333333333333e+00 8 159 8.33333333333333e+00 8 129 4.16666666666667e+00 9 9 7.50000000000000e+01 9 191 -8.33333333333333e+00 9 172 4.16666666666667e+00 9 178 -8.33333333333333e+00 9 173 4.16666666666667e+00 9 184 4.16666666666667e+00 9 190 -8.33333333333333e+00 9 171 -2.50000000000000e+01 9 185 -8.33333333333333e+00 9 176 -4.16666666666667e+00 9 188 8.33333333333333e+00 9 10 -8.33333333333333e+00 9 175 8.33333333333333e+00 9 151 4.16666666666667e+00 9 174 -1.25000000000000e+01 9 11 -8.33333333333333e+00 9 182 8.33333333333333e+00 9 152 4.16666666666667e+00 9 181 -4.16666666666667e+00 9 187 8.33333333333333e+00 9 179 4.16666666666667e+00 9 180 -1.25000000000000e+01 9 150 -2.50000000000000e+01 10 10 6.66666666666667e+01 10 171 4.16666666666667e+00 10 177 -8.33333333333333e+00 10 172 -8.33333333333333e+00 10 183 4.16666666666667e+00 10 189 -8.33333333333333e+00 10 185 4.16666666666667e+00 10 191 -8.33333333333333e+00 10 176 8.33333333333333e+00 10 175 -3.75000000000000e+01 10 9 -8.33333333333333e+00 10 174 8.33333333333333e+00 10 150 4.16666666666667e+00 10 182 8.33333333333333e+00 10 188 -1.66666666666667e+01 10 179 4.16666666666667e+00 10 181 -1.25000000000000e+01 10 151 -8.33333333333333e+00 10 180 -4.16666666666667e+00 10 186 8.33333333333333e+00 11 11 6.66666666666667e+01 11 177 4.16666666666667e+00 11 189 -8.33333333333333e+00 11 173 -8.33333333333333e+00 11 171 4.16666666666667e+00 11 184 4.16666666666667e+00 11 190 -8.33333333333333e+00 11 183 -8.33333333333333e+00 11 176 -1.25000000000000e+01 11 175 8.33333333333333e+00 11 174 -4.16666666666667e+00 11 186 8.33333333333333e+00 11 178 4.16666666666667e+00 11 182 -3.75000000000000e+01 11 152 -8.33333333333333e+00 11 181 8.33333333333333e+00 11 187 -1.66666666666667e+01 11 9 -8.33333333333333e+00 11 180 8.33333333333333e+00 11 150 4.16666666666667e+00 12 12 3.41666666666667e+01 12 212 -1.66666666666667e-01 12 193 8.33333333333333e-02 12 199 -1.66666666666667e-01 12 194 8.33333333333333e-02 12 205 8.33333333333333e-02 12 211 -1.66666666666667e-01 12 192 -5.00000000000000e-01 12 206 -1.66666666666667e-01 12 197 -4.16666666666667e+00 12 209 4.25000000000000e+00 12 13 -8.33333333333333e+00 12 196 4.25000000000000e+00 12 172 4.16666666666667e+00 12 195 -4.33333333333333e+00 12 14 -8.33333333333333e+00 12 203 4.25000000000000e+00 12 173 4.16666666666667e+00 12 202 -4.16666666666667e+00 12 208 4.25000000000000e+00 12 200 8.33333333333333e-02 12 201 -4.33333333333333e+00 12 171 -2.50000000000000e+01 13 13 2.58333333333333e+01 13 192 8.33333333333333e-02 13 198 -1.66666666666667e-01 13 193 -1.66666666666667e-01 13 204 8.33333333333333e-02 13 210 -1.66666666666667e-01 13 206 8.33333333333333e-02 13 212 -1.66666666666667e-01 13 197 4.25000000000000e+00 13 196 -1.30000000000000e+01 13 12 -8.33333333333333e+00 13 195 4.25000000000000e+00 13 171 4.16666666666667e+00 13 203 4.25000000000000e+00 13 209 -8.50000000000000e+00 13 200 8.33333333333333e-02 13 202 -4.33333333333333e+00 13 172 -8.33333333333333e+00 13 201 -4.16666666666667e+00 13 207 4.25000000000000e+00 14 14 2.58333333333333e+01 14 198 8.33333333333333e-02 14 210 -1.66666666666667e-01 14 194 -1.66666666666667e-01 14 192 8.33333333333333e-02 14 205 8.33333333333333e-02 14 211 -1.66666666666667e-01 14 204 -1.66666666666667e-01 14 197 -4.33333333333333e+00 14 196 4.25000000000000e+00 14 195 -4.16666666666667e+00 14 207 4.25000000000000e+00 14 199 8.33333333333333e-02 14 203 -1.30000000000000e+01 14 173 -8.33333333333333e+00 14 202 4.25000000000000e+00 14 208 -8.50000000000000e+00 14 12 -8.33333333333333e+00 14 201 4.25000000000000e+00 14 171 4.16666666666667e+00 15 15 1.50000000000000e+00 15 233 -1.66666666666667e-01 15 214 8.33333333333333e-02 15 220 -1.66666666666667e-01 15 215 8.33333333333333e-02 15 226 8.33333333333333e-02 15 232 -1.66666666666667e-01 15 213 -5.00000000000000e-01 15 227 -1.66666666666667e-01 15 218 -8.33333333333333e-02 15 230 1.66666666666667e-01 15 16 -1.66666666666667e-01 15 217 1.66666666666667e-01 15 193 8.33333333333333e-02 15 216 -2.50000000000000e-01 15 17 -1.66666666666667e-01 15 224 1.66666666666667e-01 15 194 8.33333333333333e-02 15 223 -8.33333333333333e-02 15 229 1.66666666666667e-01 15 221 8.33333333333333e-02 15 222 -2.50000000000000e-01 15 192 -5.00000000000000e-01 16 16 1.33333333333333e+00 16 213 8.33333333333333e-02 16 219 -1.66666666666667e-01 16 214 -1.66666666666667e-01 16 225 8.33333333333333e-02 16 231 -1.66666666666667e-01 16 227 8.33333333333333e-02 16 233 -1.66666666666667e-01 16 218 1.66666666666667e-01 16 217 -7.50000000000000e-01 16 15 -1.66666666666667e-01 16 216 1.66666666666667e-01 16 192 8.33333333333333e-02 16 224 1.66666666666667e-01 16 230 -3.33333333333333e-01 16 221 8.33333333333333e-02 16 223 -2.50000000000000e-01 16 193 -1.66666666666667e-01 16 222 -8.33333333333333e-02 16 228 1.66666666666667e-01 17 17 1.33333333333333e+00 17 219 8.33333333333333e-02 17 231 -1.66666666666667e-01 17 215 -1.66666666666667e-01 17 213 8.33333333333333e-02 17 226 8.33333333333333e-02 17 232 -1.66666666666667e-01 17 225 -1.66666666666667e-01 17 218 -2.50000000000000e-01 17 217 1.66666666666667e-01 17 216 -8.33333333333333e-02 17 228 1.66666666666667e-01 17 220 8.33333333333333e-02 17 224 -7.50000000000000e-01 17 194 -1.66666666666667e-01 17 223 1.66666666666667e-01 17 229 -3.33333333333333e-01 17 15 -1.66666666666667e-01 17 222 1.66666666666667e-01 17 192 8.33333333333333e-02 18 18 1.50000000000000e+00 18 254 -1.66666666666667e-01 18 235 8.33333333333333e-02 18 241 -1.66666666666667e-01 18 236 8.33333333333333e-02 18 247 8.33333333333333e-02 18 253 -1.66666666666667e-01 18 234 -5.00000000000000e-01 18 248 -1.66666666666667e-01 18 239 -8.33333333333333e-02 18 251 1.66666666666667e-01 18 19 -1.66666666666667e-01 18 238 1.66666666666667e-01 18 214 8.33333333333333e-02 18 237 -2.50000000000000e-01 18 20 -1.66666666666667e-01 18 245 1.66666666666667e-01 18 215 8.33333333333333e-02 18 244 -8.33333333333333e-02 18 250 1.66666666666667e-01 18 242 8.33333333333333e-02 18 243 -2.50000000000000e-01 18 213 -5.00000000000000e-01 19 19 1.33333333333333e+00 19 234 8.33333333333333e-02 19 240 -1.66666666666667e-01 19 235 -1.66666666666667e-01 19 246 8.33333333333333e-02 19 252 -1.66666666666667e-01 19 248 8.33333333333333e-02 19 254 -1.66666666666667e-01 19 239 1.66666666666667e-01 19 238 -7.50000000000000e-01 19 18 -1.66666666666667e-01 19 237 1.66666666666667e-01 19 213 8.33333333333333e-02 19 245 1.66666666666667e-01 19 251 -3.33333333333333e-01 19 242 8.33333333333333e-02 19 244 -2.50000000000000e-01 19 214 -1.66666666666667e-01 19 243 -8.33333333333333e-02 19 249 1.66666666666667e-01 20 20 1.33333333333333e+00 20 240 8.33333333333333e-02 20 252 -1.66666666666667e-01 20 236 -1.66666666666667e-01 20 234 8.33333333333333e-02 20 247 8.33333333333333e-02 20 253 -1.66666666666667e-01 20 246 -1.66666666666667e-01 20 239 -2.50000000000000e-01 20 238 1.66666666666667e-01 20 237 -8.33333333333333e-02 20 249 1.66666666666667e-01 20 241 8.33333333333333e-02 20 245 -7.50000000000000e-01 20 215 -1.66666666666667e-01 20 244 1.66666666666667e-01 20 250 -3.33333333333333e-01 20 18 -1.66666666666667e-01 20 243 1.66666666666667e-01 20 213 8.33333333333333e-02 21 21 1.50000000000000e+00 21 275 -1.66666666666667e-01 21 256 8.33333333333333e-02 21 262 -1.66666666666667e-01 21 257 8.33333333333333e-02 21 268 8.33333333333333e-02 21 274 -1.66666666666667e-01 21 255 -5.00000000000000e-01 21 269 -1.66666666666667e-01 21 260 -8.33333333333333e-02 21 272 1.66666666666667e-01 21 22 -1.66666666666667e-01 21 259 1.66666666666667e-01 21 235 8.33333333333333e-02 21 258 -2.50000000000000e-01 21 23 -1.66666666666667e-01 21 266 1.66666666666667e-01 21 236 8.33333333333333e-02 21 265 -8.33333333333333e-02 21 271 1.66666666666667e-01 21 263 8.33333333333333e-02 21 264 -2.50000000000000e-01 21 234 -5.00000000000000e-01 22 22 1.33333333333333e+00 22 255 8.33333333333333e-02 22 261 -1.66666666666667e-01 22 256 -1.66666666666667e-01 22 267 8.33333333333333e-02 22 273 -1.66666666666667e-01 22 269 8.33333333333333e-02 22 275 -1.66666666666667e-01 22 260 1.66666666666667e-01 22 259 -7.50000000000000e-01 22 21 -1.66666666666667e-01 22 258 1.66666666666667e-01 22 234 8.33333333333333e-02 22 266 1.66666666666667e-01 22 272 -3.33333333333333e-01 22 263 8.33333333333333e-02 22 265 -2.50000000000000e-01 22 235 -1.66666666666667e-01 22 264 -8.33333333333333e-02 22 270 1.66666666666667e-01 23 23 1.33333333333333e+00 23 261 8.33333333333333e-02 23 273 -1.66666666666667e-01 23 257 -1.66666666666667e-01 23 255 8.33333333333333e-02 23 268 8.33333333333333e-02 23 274 -1.66666666666667e-01 23 267 -1.66666666666667e-01 23 260 -2.50000000000000e-01 23 259 1.66666666666667e-01 23 258 -8.33333333333333e-02 23 270 1.66666666666667e-01 23 262 8.33333333333333e-02 23 266 -7.50000000000000e-01 23 236 -1.66666666666667e-01 23 265 1.66666666666667e-01 23 271 -3.33333333333333e-01 23 21 -1.66666666666667e-01 23 264 1.66666666666667e-01 23 234 8.33333333333333e-02 24 24 6.66666666666667e-01 24 284 8.33333333333333e-02 24 25 -1.66666666666667e-01 24 277 8.33333333333333e-02 24 256 8.33333333333333e-02 24 276 -8.33333333333333e-02 24 26 -1.66666666666667e-01 24 281 8.33333333333333e-02 24 257 8.33333333333333e-02 24 280 -8.33333333333333e-02 24 283 8.33333333333333e-02 24 278 -8.33333333333333e-02 24 279 -8.33333333333333e-02 24 255 -5.00000000000000e-01 25 25 5.00000000000000e-01 25 277 -2.50000000000000e-01 25 24 -1.66666666666667e-01 25 276 8.33333333333333e-02 25 255 8.33333333333333e-02 25 281 8.33333333333333e-02 25 284 -1.66666666666667e-01 25 278 8.33333333333333e-02 25 280 -8.33333333333333e-02 25 256 -1.66666666666667e-01 25 279 -8.33333333333333e-02 25 282 8.33333333333333e-02 26 26 5.00000000000000e-01 26 277 8.33333333333333e-02 26 276 -8.33333333333333e-02 26 282 8.33333333333333e-02 26 278 -8.33333333333333e-02 26 281 -2.50000000000000e-01 26 257 -1.66666666666667e-01 26 280 8.33333333333333e-02 26 283 -1.66666666666667e-01 26 24 -1.66666666666667e-01 26 279 8.33333333333333e-02 26 255 8.33333333333333e-02 27 27 1.00000000000000e+00 27 286 0.00000000000000e+00 27 28 0.00000000000000e+00 27 112 0.00000000000000e+00 27 285 0.00000000000000e+00 27 290 0.00000000000000e+00 27 293 0.00000000000000e+00 27 289 0.00000000000000e+00 27 292 0.00000000000000e+00 27 288 0.00000000000000e+00 27 287 0.00000000000000e+00 27 111 0.00000000000000e+00 28 28 1.00000000000000e+00 28 293 0.00000000000000e+00 28 286 0.00000000000000e+00 28 285 0.00000000000000e+00 28 27 0.00000000000000e+00 28 111 0.00000000000000e+00 28 290 0.00000000000000e+00 28 29 0.00000000000000e+00 28 113 0.00000000000000e+00 28 289 0.00000000000000e+00 28 287 0.00000000000000e+00 28 112 0.00000000000000e+00 28 288 0.00000000000000e+00 28 291 0.00000000000000e+00 29 29 1.00000000000000e+00 29 286 0.00000000000000e+00 29 292 0.00000000000000e+00 29 285 0.00000000000000e+00 29 290 0.00000000000000e+00 29 287 0.00000000000000e+00 29 113 0.00000000000000e+00 29 289 0.00000000000000e+00 29 28 0.00000000000000e+00 29 112 0.00000000000000e+00 29 288 0.00000000000000e+00 29 291 0.00000000000000e+00 30 30 5.00000000000000e+01 30 295 4.16666666666667e+00 30 31 -8.33333333333333e+00 30 294 -1.25000000000000e+01 30 302 -8.33333333333333e+00 30 298 -4.16666666666667e+00 30 301 4.16666666666667e+00 30 32 -8.33333333333333e+00 30 287 4.16666666666667e+00 30 299 8.33333333333333e+00 30 286 4.16666666666667e+00 30 285 -1.25000000000000e+01 30 134 -4.16666666666667e+00 30 116 4.16666666666667e+00 30 133 8.33333333333333e+00 30 115 -8.33333333333333e+00 30 132 -1.25000000000000e+01 30 296 4.16666666666667e+00 30 297 -1.25000000000000e+01 31 31 5.83333333333333e+01 31 302 4.16666666666667e+00 31 295 -4.16666666666667e+00 31 294 4.16666666666667e+00 31 30 -8.33333333333333e+00 31 297 -4.16666666666667e+00 31 300 4.16666666666667e+00 31 287 -4.16666666666667e+00 31 116 4.16666666666667e+00 31 286 -4.16666666666667e+00 31 285 4.16666666666667e+00 31 134 8.33333333333333e+00 31 32 -1.66666666666667e+01 31 299 8.33333333333333e+00 31 133 -3.75000000000000e+01 31 296 -4.16666666666667e+00 31 298 -1.25000000000000e+01 31 132 8.33333333333333e+00 31 114 -8.33333333333333e+00 32 32 5.83333333333333e+01 32 295 -4.16666666666667e+00 32 301 4.16666666666667e+00 32 294 4.16666666666667e+00 32 300 -8.33333333333333e+00 32 287 -4.16666666666667e+00 32 286 -4.16666666666667e+00 32 115 4.16666666666667e+00 32 30 -8.33333333333333e+00 32 285 4.16666666666667e+00 32 297 8.33333333333333e+00 32 134 -1.25000000000000e+01 32 296 -4.16666666666667e+00 32 299 -3.75000000000000e+01 32 133 8.33333333333333e+00 32 31 -1.66666666666667e+01 32 298 8.33333333333333e+00 32 132 -4.16666666666667e+00 32 114 4.16666666666667e+00 33 33 5.00000000000000e+01 33 304 4.16666666666667e+00 33 34 -8.33333333333333e+00 33 303 -1.25000000000000e+01 33 311 -8.33333333333333e+00 33 307 -4.16666666666667e+00 33 310 4.16666666666667e+00 33 35 -8.33333333333333e+00 33 296 4.16666666666667e+00 33 308 8.33333333333333e+00 33 295 4.16666666666667e+00 33 294 -1.25000000000000e+01 33 155 -4.16666666666667e+00 33 137 4.16666666666667e+00 33 154 8.33333333333333e+00 33 136 -8.33333333333333e+00 33 153 -1.25000000000000e+01 33 305 4.16666666666667e+00 33 306 -1.25000000000000e+01 34 34 5.83333333333333e+01 34 311 4.16666666666667e+00 34 304 -4.16666666666667e+00 34 303 4.16666666666667e+00 34 33 -8.33333333333333e+00 34 306 -4.16666666666667e+00 34 309 4.16666666666667e+00 34 296 -4.16666666666667e+00 34 137 4.16666666666667e+00 34 295 -4.16666666666667e+00 34 294 4.16666666666667e+00 34 155 8.33333333333333e+00 34 35 -1.66666666666667e+01 34 308 8.33333333333333e+00 34 154 -3.75000000000000e+01 34 305 -4.16666666666667e+00 34 307 -1.25000000000000e+01 34 153 8.33333333333333e+00 34 135 -8.33333333333333e+00 35 35 5.83333333333333e+01 35 304 -4.16666666666667e+00 35 310 4.16666666666667e+00 35 303 4.16666666666667e+00 35 309 -8.33333333333333e+00 35 296 -4.16666666666667e+00 35 295 -4.16666666666667e+00 35 136 4.16666666666667e+00 35 33 -8.33333333333333e+00 35 294 4.16666666666667e+00 35 306 8.33333333333333e+00 35 155 -1.25000000000000e+01 35 305 -4.16666666666667e+00 35 308 -3.75000000000000e+01 35 154 8.33333333333333e+00 35 34 -1.66666666666667e+01 35 307 8.33333333333333e+00 35 153 -4.16666666666667e+00 35 135 4.16666666666667e+00 36 36 5.00000000000000e+01 36 313 4.16666666666667e+00 36 37 -8.33333333333333e+00 36 312 -1.25000000000000e+01 36 320 -8.33333333333333e+00 36 316 -4.16666666666667e+00 36 319 4.16666666666667e+00 36 38 -8.33333333333333e+00 36 305 4.16666666666667e+00 36 317 8.33333333333333e+00 36 304 4.16666666666667e+00 36 303 -1.25000000000000e+01 36 176 -4.16666666666667e+00 36 158 4.16666666666667e+00 36 175 8.33333333333333e+00 36 157 -8.33333333333333e+00 36 174 -1.25000000000000e+01 36 314 4.16666666666667e+00 36 315 -1.25000000000000e+01 37 37 5.83333333333333e+01 37 320 4.16666666666667e+00 37 313 -4.16666666666667e+00 37 312 4.16666666666667e+00 37 36 -8.33333333333333e+00 37 315 -4.16666666666667e+00 37 318 4.16666666666667e+00 37 305 -4.16666666666667e+00 37 158 4.16666666666667e+00 37 304 -4.16666666666667e+00 37 303 4.16666666666667e+00 37 176 8.33333333333333e+00 37 38 -1.66666666666667e+01 37 317 8.33333333333333e+00 37 175 -3.75000000000000e+01 37 314 -4.16666666666667e+00 37 316 -1.25000000000000e+01 37 174 8.33333333333333e+00 37 156 -8.33333333333333e+00 38 38 5.83333333333333e+01 38 313 -4.16666666666667e+00 38 319 4.16666666666667e+00 38 312 4.16666666666667e+00 38 318 -8.33333333333333e+00 38 305 -4.16666666666667e+00 38 304 -4.16666666666667e+00 38 157 4.16666666666667e+00 38 36 -8.33333333333333e+00 38 303 4.16666666666667e+00 38 315 8.33333333333333e+00 38 176 -1.25000000000000e+01 38 314 -4.16666666666667e+00 38 317 -3.75000000000000e+01 38 175 8.33333333333333e+00 38 37 -1.66666666666667e+01 38 316 8.33333333333333e+00 38 174 -4.16666666666667e+00 38 156 4.16666666666667e+00 39 39 2.55000000000000e+01 39 322 8.33333333333333e-02 39 40 -1.66666666666667e-01 39 321 -2.50000000000000e-01 39 329 -1.66666666666667e-01 39 325 -8.33333333333333e-02 39 328 8.33333333333333e-02 39 41 -8.33333333333333e+00 39 314 4.16666666666667e+00 39 326 4.25000000000000e+00 39 313 4.16666666666667e+00 39 312 -1.25000000000000e+01 39 197 -4.16666666666667e+00 39 179 4.16666666666667e+00 39 196 4.25000000000000e+00 39 178 -8.33333333333333e+00 39 195 -4.33333333333333e+00 39 323 8.33333333333333e-02 39 324 -8.41666666666667e+00 40 40 2.56666666666667e+01 40 329 8.33333333333333e-02 40 322 -8.33333333333333e-02 40 321 8.33333333333333e-02 40 39 -1.66666666666667e-01 40 324 -8.33333333333333e-02 40 327 8.33333333333333e-02 40 314 -4.16666666666667e+00 40 179 4.16666666666667e+00 40 313 -4.16666666666667e+00 40 312 4.16666666666667e+00 40 197 4.25000000000000e+00 40 41 -8.50000000000000e+00 40 326 4.25000000000000e+00 40 196 -1.30000000000000e+01 40 323 -8.33333333333333e-02 40 325 -8.41666666666667e+00 40 195 4.25000000000000e+00 40 177 -8.33333333333333e+00 41 41 3.38333333333333e+01 41 322 -8.33333333333333e-02 41 328 8.33333333333333e-02 41 321 8.33333333333333e-02 41 327 -1.66666666666667e-01 41 314 -4.16666666666667e+00 41 313 -4.16666666666667e+00 41 178 4.16666666666667e+00 41 39 -8.33333333333333e+00 41 312 4.16666666666667e+00 41 324 4.25000000000000e+00 41 197 -4.33333333333333e+00 41 323 -8.33333333333333e-02 41 326 -2.52500000000000e+01 41 196 4.25000000000000e+00 41 40 -8.50000000000000e+00 41 325 4.25000000000000e+00 41 195 -4.16666666666667e+00 41 177 4.16666666666667e+00 42 42 1.00000000000000e+00 42 331 8.33333333333333e-02 42 43 -1.66666666666667e-01 42 330 -2.50000000000000e-01 42 338 -1.66666666666667e-01 42 334 -8.33333333333333e-02 42 337 8.33333333333333e-02 42 44 -1.66666666666667e-01 42 323 8.33333333333333e-02 42 335 1.66666666666667e-01 42 322 8.33333333333333e-02 42 321 -2.50000000000000e-01 42 218 -8.33333333333333e-02 42 200 8.33333333333333e-02 42 217 1.66666666666667e-01 42 199 -1.66666666666667e-01 42 216 -2.50000000000000e-01 42 332 8.33333333333333e-02 42 333 -2.50000000000000e-01 43 43 1.16666666666667e+00 43 338 8.33333333333333e-02 43 331 -8.33333333333333e-02 43 330 8.33333333333333e-02 43 42 -1.66666666666667e-01 43 333 -8.33333333333333e-02 43 336 8.33333333333333e-02 43 323 -8.33333333333333e-02 43 200 8.33333333333333e-02 43 322 -8.33333333333333e-02 43 321 8.33333333333333e-02 43 218 1.66666666666667e-01 43 44 -3.33333333333333e-01 43 335 1.66666666666667e-01 43 217 -7.50000000000000e-01 43 332 -8.33333333333333e-02 43 334 -2.50000000000000e-01 43 216 1.66666666666667e-01 43 198 -1.66666666666667e-01 44 44 1.16666666666667e+00 44 331 -8.33333333333333e-02 44 337 8.33333333333333e-02 44 330 8.33333333333333e-02 44 336 -1.66666666666667e-01 44 323 -8.33333333333333e-02 44 322 -8.33333333333333e-02 44 199 8.33333333333333e-02 44 42 -1.66666666666667e-01 44 321 8.33333333333333e-02 44 333 1.66666666666667e-01 44 218 -2.50000000000000e-01 44 332 -8.33333333333333e-02 44 335 -7.50000000000000e-01 44 217 1.66666666666667e-01 44 43 -3.33333333333333e-01 44 334 1.66666666666667e-01 44 216 -8.33333333333333e-02 44 198 8.33333333333333e-02 45 45 1.00000000000000e+00 45 340 8.33333333333333e-02 45 46 -1.66666666666667e-01 45 339 -2.50000000000000e-01 45 347 -1.66666666666667e-01 45 343 -8.33333333333333e-02 45 346 8.33333333333333e-02 45 47 -1.66666666666667e-01 45 332 8.33333333333333e-02 45 344 1.66666666666667e-01 45 331 8.33333333333333e-02 45 330 -2.50000000000000e-01 45 239 -8.33333333333333e-02 45 221 8.33333333333333e-02 45 238 1.66666666666667e-01 45 220 -1.66666666666667e-01 45 237 -2.50000000000000e-01 45 341 8.33333333333333e-02 45 342 -2.50000000000000e-01 46 46 1.16666666666667e+00 46 347 8.33333333333333e-02 46 340 -8.33333333333333e-02 46 339 8.33333333333333e-02 46 45 -1.66666666666667e-01 46 342 -8.33333333333333e-02 46 345 8.33333333333333e-02 46 332 -8.33333333333333e-02 46 221 8.33333333333333e-02 46 331 -8.33333333333333e-02 46 330 8.33333333333333e-02 46 239 1.66666666666667e-01 46 47 -3.33333333333333e-01 46 344 1.66666666666667e-01 46 238 -7.50000000000000e-01 46 341 -8.33333333333333e-02 46 343 -2.50000000000000e-01 46 237 1.66666666666667e-01 46 219 -1.66666666666667e-01 47 47 1.16666666666667e+00 47 340 -8.33333333333333e-02 47 346 8.33333333333333e-02 47 339 8.33333333333333e-02 47 345 -1.66666666666667e-01 47 332 -8.33333333333333e-02 47 331 -8.33333333333333e-02 47 220 8.33333333333333e-02 47 45 -1.66666666666667e-01 47 330 8.33333333333333e-02 47 342 1.66666666666667e-01 47 239 -2.50000000000000e-01 47 341 -8.33333333333333e-02 47 344 -7.50000000000000e-01 47 238 1.66666666666667e-01 47 46 -3.33333333333333e-01 47 343 1.66666666666667e-01 47 237 -8.33333333333333e-02 47 219 8.33333333333333e-02 48 48 1.00000000000000e+00 48 349 8.33333333333333e-02 48 49 -1.66666666666667e-01 48 348 -2.50000000000000e-01 48 356 -1.66666666666667e-01 48 352 -8.33333333333333e-02 48 355 8.33333333333333e-02 48 50 -1.66666666666667e-01 48 341 8.33333333333333e-02 48 353 1.66666666666667e-01 48 340 8.33333333333333e-02 48 339 -2.50000000000000e-01 48 260 -8.33333333333333e-02 48 242 8.33333333333333e-02 48 259 1.66666666666667e-01 48 241 -1.66666666666667e-01 48 258 -2.50000000000000e-01 48 350 8.33333333333333e-02 48 351 -2.50000000000000e-01 49 49 1.16666666666667e+00 49 356 8.33333333333333e-02 49 349 -8.33333333333333e-02 49 348 8.33333333333333e-02 49 48 -1.66666666666667e-01 49 351 -8.33333333333333e-02 49 354 8.33333333333333e-02 49 341 -8.33333333333333e-02 49 242 8.33333333333333e-02 49 340 -8.33333333333333e-02 49 339 8.33333333333333e-02 49 260 1.66666666666667e-01 49 50 -3.33333333333333e-01 49 353 1.66666666666667e-01 49 259 -7.50000000000000e-01 49 350 -8.33333333333333e-02 49 352 -2.50000000000000e-01 49 258 1.66666666666667e-01 49 240 -1.66666666666667e-01 50 50 1.16666666666667e+00 50 349 -8.33333333333333e-02 50 355 8.33333333333333e-02 50 348 8.33333333333333e-02 50 354 -1.66666666666667e-01 50 341 -8.33333333333333e-02 50 340 -8.33333333333333e-02 50 241 8.33333333333333e-02 50 48 -1.66666666666667e-01 50 339 8.33333333333333e-02 50 351 1.66666666666667e-01 50 260 -2.50000000000000e-01 50 350 -8.33333333333333e-02 50 353 -7.50000000000000e-01 50 259 1.66666666666667e-01 50 49 -3.33333333333333e-01 50 352 1.66666666666667e-01 50 258 -8.33333333333333e-02 50 240 8.33333333333333e-02 51 51 5.00000000000000e-01 51 350 8.33333333333333e-02 51 359 8.33333333333333e-02 51 349 8.33333333333333e-02 51 348 -2.50000000000000e-01 51 278 -8.33333333333333e-02 51 263 8.33333333333333e-02 51 277 8.33333333333333e-02 51 262 -1.66666666666667e-01 51 276 -8.33333333333333e-02 51 53 -1.66666666666667e-01 51 357 -1.66666666666667e-01 52 52 5.00000000000000e-01 52 263 8.33333333333333e-02 52 349 -8.33333333333333e-02 52 348 8.33333333333333e-02 52 278 8.33333333333333e-02 52 53 -1.66666666666667e-01 52 359 8.33333333333333e-02 52 277 -2.50000000000000e-01 52 350 -8.33333333333333e-02 52 358 -1.66666666666667e-01 52 276 8.33333333333333e-02 52 261 -1.66666666666667e-01 53 53 6.66666666666667e-01 53 349 -8.33333333333333e-02 53 262 8.33333333333333e-02 53 51 -1.66666666666667e-01 53 348 8.33333333333333e-02 53 357 8.33333333333333e-02 53 278 -8.33333333333333e-02 53 350 -8.33333333333333e-02 53 359 -5.00000000000000e-01 53 277 8.33333333333333e-02 53 52 -1.66666666666667e-01 53 358 8.33333333333333e-02 53 276 -8.33333333333333e-02 53 261 8.33333333333333e-02 54 54 1.00000000000000e+00 54 368 0.00000000000000e+00 54 364 0.00000000000000e+00 54 363 0.00000000000000e+00 54 56 0.00000000000000e+00 54 362 0.00000000000000e+00 54 119 0.00000000000000e+00 54 361 0.00000000000000e+00 54 367 0.00000000000000e+00 54 365 0.00000000000000e+00 54 360 0.00000000000000e+00 54 117 0.00000000000000e+00 55 55 1.00000000000000e+00 55 56 0.00000000000000e+00 55 119 0.00000000000000e+00 55 364 0.00000000000000e+00 55 363 0.00000000000000e+00 55 362 0.00000000000000e+00 55 368 0.00000000000000e+00 55 365 0.00000000000000e+00 55 361 0.00000000000000e+00 55 118 0.00000000000000e+00 55 360 0.00000000000000e+00 55 366 0.00000000000000e+00 56 56 1.00000000000000e+00 56 364 0.00000000000000e+00 56 55 0.00000000000000e+00 56 118 0.00000000000000e+00 56 363 0.00000000000000e+00 56 366 0.00000000000000e+00 56 365 0.00000000000000e+00 56 362 0.00000000000000e+00 56 119 0.00000000000000e+00 56 361 0.00000000000000e+00 56 367 0.00000000000000e+00 56 54 0.00000000000000e+00 56 360 0.00000000000000e+00 56 117 0.00000000000000e+00 57 57 5.00000000000000e+01 57 377 4.16666666666667e+00 57 59 -8.33333333333333e+00 57 371 4.16666666666667e+00 57 370 4.16666666666667e+00 57 376 -8.33333333333333e+00 57 369 -1.25000000000000e+01 57 140 8.33333333333333e+00 57 139 -4.16666666666667e+00 57 121 4.16666666666667e+00 57 138 -1.25000000000000e+01 57 362 4.16666666666667e+00 57 122 -8.33333333333333e+00 57 361 4.16666666666667e+00 57 58 -8.33333333333333e+00 57 373 8.33333333333333e+00 57 360 -1.25000000000000e+01 57 374 -4.16666666666667e+00 57 372 -1.25000000000000e+01 58 58 5.83333333333333e+01 58 377 4.16666666666667e+00 58 370 -4.16666666666667e+00 58 369 4.16666666666667e+00 58 375 -8.33333333333333e+00 58 140 8.33333333333333e+00 58 59 -1.66666666666667e+01 58 374 8.33333333333333e+00 58 139 -1.25000000000000e+01 58 138 -4.16666666666667e+00 58 120 4.16666666666667e+00 58 362 -4.16666666666667e+00 58 122 4.16666666666667e+00 58 361 -4.16666666666667e+00 58 371 -4.16666666666667e+00 58 373 -3.75000000000000e+01 58 360 4.16666666666667e+00 58 57 -8.33333333333333e+00 58 372 8.33333333333333e+00 59 59 5.83333333333333e+01 59 375 4.16666666666667e+00 59 371 -4.16666666666667e+00 59 370 -4.16666666666667e+00 59 376 4.16666666666667e+00 59 57 -8.33333333333333e+00 59 369 4.16666666666667e+00 59 140 -3.75000000000000e+01 59 139 8.33333333333333e+00 59 58 -1.66666666666667e+01 59 373 8.33333333333333e+00 59 138 8.33333333333333e+00 59 362 -4.16666666666667e+00 59 372 -4.16666666666667e+00 59 374 -1.25000000000000e+01 59 361 -4.16666666666667e+00 59 121 4.16666666666667e+00 59 360 4.16666666666667e+00 59 120 -8.33333333333333e+00 60 60 5.00000000000000e+01 60 386 4.16666666666667e+00 60 62 -8.33333333333333e+00 60 380 4.16666666666667e+00 60 379 4.16666666666667e+00 60 385 -8.33333333333333e+00 60 378 -1.25000000000000e+01 60 161 8.33333333333333e+00 60 160 -4.16666666666667e+00 60 142 4.16666666666667e+00 60 159 -1.25000000000000e+01 60 371 4.16666666666667e+00 60 143 -8.33333333333333e+00 60 370 4.16666666666667e+00 60 61 -8.33333333333333e+00 60 382 8.33333333333333e+00 60 369 -1.25000000000000e+01 60 383 -4.16666666666667e+00 60 381 -1.25000000000000e+01 61 61 5.83333333333333e+01 61 386 4.16666666666667e+00 61 379 -4.16666666666667e+00 61 378 4.16666666666667e+00 61 384 -8.33333333333333e+00 61 161 8.33333333333333e+00 61 62 -1.66666666666667e+01 61 383 8.33333333333333e+00 61 160 -1.25000000000000e+01 61 159 -4.16666666666667e+00 61 141 4.16666666666667e+00 61 371 -4.16666666666667e+00 61 143 4.16666666666667e+00 61 370 -4.16666666666667e+00 61 380 -4.16666666666667e+00 61 382 -3.75000000000000e+01 61 369 4.16666666666667e+00 61 60 -8.33333333333333e+00 61 381 8.33333333333333e+00 62 62 5.83333333333333e+01 62 384 4.16666666666667e+00 62 380 -4.16666666666667e+00 62 379 -4.16666666666667e+00 62 385 4.16666666666667e+00 62 60 -8.33333333333333e+00 62 378 4.16666666666667e+00 62 161 -3.75000000000000e+01 62 160 8.33333333333333e+00 62 61 -1.66666666666667e+01 62 382 8.33333333333333e+00 62 159 8.33333333333333e+00 62 371 -4.16666666666667e+00 62 381 -4.16666666666667e+00 62 383 -1.25000000000000e+01 62 370 -4.16666666666667e+00 62 142 4.16666666666667e+00 62 369 4.16666666666667e+00 62 141 -8.33333333333333e+00 63 63 5.00000000000000e+01 63 395 4.16666666666667e+00 63 65 -8.33333333333333e+00 63 389 4.16666666666667e+00 63 388 4.16666666666667e+00 63 394 -8.33333333333333e+00 63 387 -1.25000000000000e+01 63 182 8.33333333333333e+00 63 181 -4.16666666666667e+00 63 163 4.16666666666667e+00 63 180 -1.25000000000000e+01 63 380 4.16666666666667e+00 63 164 -8.33333333333333e+00 63 379 4.16666666666667e+00 63 64 -8.33333333333333e+00 63 391 8.33333333333333e+00 63 378 -1.25000000000000e+01 63 392 -4.16666666666667e+00 63 390 -1.25000000000000e+01 64 64 5.83333333333333e+01 64 395 4.16666666666667e+00 64 388 -4.16666666666667e+00 64 387 4.16666666666667e+00 64 393 -8.33333333333333e+00 64 182 8.33333333333333e+00 64 65 -1.66666666666667e+01 64 392 8.33333333333333e+00 64 181 -1.25000000000000e+01 64 180 -4.16666666666667e+00 64 162 4.16666666666667e+00 64 380 -4.16666666666667e+00 64 164 4.16666666666667e+00 64 379 -4.16666666666667e+00 64 389 -4.16666666666667e+00 64 391 -3.75000000000000e+01 64 378 4.16666666666667e+00 64 63 -8.33333333333333e+00 64 390 8.33333333333333e+00 65 65 5.83333333333333e+01 65 393 4.16666666666667e+00 65 389 -4.16666666666667e+00 65 388 -4.16666666666667e+00 65 394 4.16666666666667e+00 65 63 -8.33333333333333e+00 65 387 4.16666666666667e+00 65 182 -3.75000000000000e+01 65 181 8.33333333333333e+00 65 64 -1.66666666666667e+01 65 391 8.33333333333333e+00 65 180 8.33333333333333e+00 65 380 -4.16666666666667e+00 65 390 -4.16666666666667e+00 65 392 -1.25000000000000e+01 65 379 -4.16666666666667e+00 65 163 4.16666666666667e+00 65 378 4.16666666666667e+00 65 162 -8.33333333333333e+00 66 66 2.55000000000000e+01 66 404 8.33333333333333e-02 66 68 -1.66666666666667e-01 66 398 8.33333333333333e-02 66 397 8.33333333333333e-02 66 403 -1.66666666666667e-01 66 396 -2.50000000000000e-01 66 203 4.25000000000000e+00 66 202 -4.16666666666667e+00 66 184 4.16666666666667e+00 66 201 -4.33333333333333e+00 66 389 4.16666666666667e+00 66 185 -8.33333333333333e+00 66 388 4.16666666666667e+00 66 67 -8.33333333333333e+00 66 400 4.25000000000000e+00 66 387 -1.25000000000000e+01 66 401 -8.33333333333333e-02 66 399 -8.41666666666667e+00 67 67 3.38333333333333e+01 67 404 8.33333333333333e-02 67 397 -8.33333333333333e-02 67 396 8.33333333333333e-02 67 402 -1.66666666666667e-01 67 203 4.25000000000000e+00 67 68 -8.50000000000000e+00 67 401 4.25000000000000e+00 67 202 -4.33333333333333e+00 67 201 -4.16666666666667e+00 67 183 4.16666666666667e+00 67 389 -4.16666666666667e+00 67 185 4.16666666666667e+00 67 388 -4.16666666666667e+00 67 398 -8.33333333333333e-02 67 400 -2.52500000000000e+01 67 387 4.16666666666667e+00 67 66 -8.33333333333333e+00 67 399 4.25000000000000e+00 68 68 2.56666666666667e+01 68 402 8.33333333333333e-02 68 398 -8.33333333333333e-02 68 397 -8.33333333333333e-02 68 403 8.33333333333333e-02 68 66 -1.66666666666667e-01 68 396 8.33333333333333e-02 68 203 -1.30000000000000e+01 68 202 4.25000000000000e+00 68 67 -8.50000000000000e+00 68 400 4.25000000000000e+00 68 201 4.25000000000000e+00 68 389 -4.16666666666667e+00 68 399 -8.33333333333333e-02 68 401 -8.41666666666667e+00 68 388 -4.16666666666667e+00 68 184 4.16666666666667e+00 68 387 4.16666666666667e+00 68 183 -8.33333333333333e+00 69 69 1.00000000000000e+00 69 413 8.33333333333333e-02 69 71 -1.66666666666667e-01 69 407 8.33333333333333e-02 69 406 8.33333333333333e-02 69 412 -1.66666666666667e-01 69 405 -2.50000000000000e-01 69 224 1.66666666666667e-01 69 223 -8.33333333333333e-02 69 205 8.33333333333333e-02 69 222 -2.50000000000000e-01 69 398 8.33333333333333e-02 69 206 -1.66666666666667e-01 69 397 8.33333333333333e-02 69 70 -1.66666666666667e-01 69 409 1.66666666666667e-01 69 396 -2.50000000000000e-01 69 410 -8.33333333333333e-02 69 408 -2.50000000000000e-01 70 70 1.16666666666667e+00 70 413 8.33333333333333e-02 70 406 -8.33333333333333e-02 70 405 8.33333333333333e-02 70 411 -1.66666666666667e-01 70 224 1.66666666666667e-01 70 71 -3.33333333333333e-01 70 410 1.66666666666667e-01 70 223 -2.50000000000000e-01 70 222 -8.33333333333333e-02 70 204 8.33333333333333e-02 70 398 -8.33333333333333e-02 70 206 8.33333333333333e-02 70 397 -8.33333333333333e-02 70 407 -8.33333333333333e-02 70 409 -7.50000000000000e-01 70 396 8.33333333333333e-02 70 69 -1.66666666666667e-01 70 408 1.66666666666667e-01 71 71 1.16666666666667e+00 71 411 8.33333333333333e-02 71 407 -8.33333333333333e-02 71 406 -8.33333333333333e-02 71 412 8.33333333333333e-02 71 69 -1.66666666666667e-01 71 405 8.33333333333333e-02 71 224 -7.50000000000000e-01 71 223 1.66666666666667e-01 71 70 -3.33333333333333e-01 71 409 1.66666666666667e-01 71 222 1.66666666666667e-01 71 398 -8.33333333333333e-02 71 408 -8.33333333333333e-02 71 410 -2.50000000000000e-01 71 397 -8.33333333333333e-02 71 205 8.33333333333333e-02 71 396 8.33333333333333e-02 71 204 -1.66666666666667e-01 72 72 1.00000000000000e+00 72 422 8.33333333333333e-02 72 74 -1.66666666666667e-01 72 416 8.33333333333333e-02 72 415 8.33333333333333e-02 72 421 -1.66666666666667e-01 72 414 -2.50000000000000e-01 72 245 1.66666666666667e-01 72 244 -8.33333333333333e-02 72 226 8.33333333333333e-02 72 243 -2.50000000000000e-01 72 407 8.33333333333333e-02 72 227 -1.66666666666667e-01 72 406 8.33333333333333e-02 72 73 -1.66666666666667e-01 72 418 1.66666666666667e-01 72 405 -2.50000000000000e-01 72 419 -8.33333333333333e-02 72 417 -2.50000000000000e-01 73 73 1.16666666666667e+00 73 422 8.33333333333333e-02 73 415 -8.33333333333333e-02 73 414 8.33333333333333e-02 73 420 -1.66666666666667e-01 73 245 1.66666666666667e-01 73 74 -3.33333333333333e-01 73 419 1.66666666666667e-01 73 244 -2.50000000000000e-01 73 243 -8.33333333333333e-02 73 225 8.33333333333333e-02 73 407 -8.33333333333333e-02 73 227 8.33333333333333e-02 73 406 -8.33333333333333e-02 73 416 -8.33333333333333e-02 73 418 -7.50000000000000e-01 73 405 8.33333333333333e-02 73 72 -1.66666666666667e-01 73 417 1.66666666666667e-01 74 74 1.16666666666667e+00 74 420 8.33333333333333e-02 74 416 -8.33333333333333e-02 74 415 -8.33333333333333e-02 74 421 8.33333333333333e-02 74 72 -1.66666666666667e-01 74 414 8.33333333333333e-02 74 245 -7.50000000000000e-01 74 244 1.66666666666667e-01 74 73 -3.33333333333333e-01 74 418 1.66666666666667e-01 74 243 1.66666666666667e-01 74 407 -8.33333333333333e-02 74 417 -8.33333333333333e-02 74 419 -2.50000000000000e-01 74 406 -8.33333333333333e-02 74 226 8.33333333333333e-02 74 405 8.33333333333333e-02 74 225 -1.66666666666667e-01 75 75 1.00000000000000e+00 75 431 8.33333333333333e-02 75 77 -1.66666666666667e-01 75 425 8.33333333333333e-02 75 424 8.33333333333333e-02 75 430 -1.66666666666667e-01 75 423 -2.50000000000000e-01 75 266 1.66666666666667e-01 75 265 -8.33333333333333e-02 75 247 8.33333333333333e-02 75 264 -2.50000000000000e-01 75 416 8.33333333333333e-02 75 248 -1.66666666666667e-01 75 415 8.33333333333333e-02 75 76 -1.66666666666667e-01 75 427 1.66666666666667e-01 75 414 -2.50000000000000e-01 75 428 -8.33333333333333e-02 75 426 -2.50000000000000e-01 76 76 1.16666666666667e+00 76 431 8.33333333333333e-02 76 424 -8.33333333333333e-02 76 423 8.33333333333333e-02 76 429 -1.66666666666667e-01 76 266 1.66666666666667e-01 76 77 -3.33333333333333e-01 76 428 1.66666666666667e-01 76 265 -2.50000000000000e-01 76 264 -8.33333333333333e-02 76 246 8.33333333333333e-02 76 416 -8.33333333333333e-02 76 248 8.33333333333333e-02 76 415 -8.33333333333333e-02 76 425 -8.33333333333333e-02 76 427 -7.50000000000000e-01 76 414 8.33333333333333e-02 76 75 -1.66666666666667e-01 76 426 1.66666666666667e-01 77 77 1.16666666666667e+00 77 429 8.33333333333333e-02 77 425 -8.33333333333333e-02 77 424 -8.33333333333333e-02 77 430 8.33333333333333e-02 77 75 -1.66666666666667e-01 77 423 8.33333333333333e-02 77 266 -7.50000000000000e-01 77 265 1.66666666666667e-01 77 76 -3.33333333333333e-01 77 427 1.66666666666667e-01 77 264 1.66666666666667e-01 77 416 -8.33333333333333e-02 77 426 -8.33333333333333e-02 77 428 -2.50000000000000e-01 77 415 -8.33333333333333e-02 77 247 8.33333333333333e-02 77 414 8.33333333333333e-02 77 246 -1.66666666666667e-01 78 78 5.00000000000000e-01 78 280 -8.33333333333333e-02 78 268 8.33333333333333e-02 78 279 -8.33333333333333e-02 78 425 8.33333333333333e-02 78 269 -1.66666666666667e-01 78 424 8.33333333333333e-02 78 79 -1.66666666666667e-01 78 433 8.33333333333333e-02 78 423 -2.50000000000000e-01 78 281 8.33333333333333e-02 78 432 -1.66666666666667e-01 79 79 6.66666666666667e-01 79 80 -1.66666666666667e-01 79 434 8.33333333333333e-02 79 280 -8.33333333333333e-02 79 279 -8.33333333333333e-02 79 267 8.33333333333333e-02 79 425 -8.33333333333333e-02 79 269 8.33333333333333e-02 79 424 -8.33333333333333e-02 79 281 8.33333333333333e-02 79 433 -5.00000000000000e-01 79 423 8.33333333333333e-02 79 78 -1.66666666666667e-01 79 432 8.33333333333333e-02 80 80 5.00000000000000e-01 80 280 8.33333333333333e-02 80 79 -1.66666666666667e-01 80 433 8.33333333333333e-02 80 279 8.33333333333333e-02 80 425 -8.33333333333333e-02 80 281 -2.50000000000000e-01 80 434 -1.66666666666667e-01 80 424 -8.33333333333333e-02 80 268 8.33333333333333e-02 80 423 8.33333333333333e-02 80 267 -1.66666666666667e-01 81 81 1.00000000000000e+00 81 290 0.00000000000000e+00 81 437 0.00000000000000e+00 81 289 0.00000000000000e+00 81 124 0.00000000000000e+00 81 288 0.00000000000000e+00 81 365 0.00000000000000e+00 81 125 0.00000000000000e+00 81 82 0.00000000000000e+00 81 364 0.00000000000000e+00 81 436 0.00000000000000e+00 81 83 0.00000000000000e+00 81 363 0.00000000000000e+00 81 435 0.00000000000000e+00 82 82 1.00000000000000e+00 82 289 0.00000000000000e+00 82 288 0.00000000000000e+00 82 123 0.00000000000000e+00 82 365 0.00000000000000e+00 82 125 0.00000000000000e+00 82 290 0.00000000000000e+00 82 364 0.00000000000000e+00 82 436 0.00000000000000e+00 82 81 0.00000000000000e+00 82 363 0.00000000000000e+00 82 435 0.00000000000000e+00 83 83 1.00000000000000e+00 83 289 0.00000000000000e+00 83 81 0.00000000000000e+00 83 288 0.00000000000000e+00 83 435 0.00000000000000e+00 83 290 0.00000000000000e+00 83 365 0.00000000000000e+00 83 437 0.00000000000000e+00 83 364 0.00000000000000e+00 83 124 0.00000000000000e+00 83 363 0.00000000000000e+00 83 123 0.00000000000000e+00 84 84 7.50000000000000e+01 84 440 4.16666666666667e+00 84 298 -4.16666666666667e+00 84 374 -4.16666666666667e+00 84 85 -8.33333333333333e+00 84 439 4.16666666666667e+00 84 438 -2.50000000000000e+01 84 299 8.33333333333333e+00 84 437 4.16666666666667e+00 84 293 -8.33333333333333e+00 84 292 4.16666666666667e+00 84 368 4.16666666666667e+00 84 436 4.16666666666667e+00 84 435 -2.50000000000000e+01 84 146 8.33333333333333e+00 84 128 -8.33333333333333e+00 84 297 -1.25000000000000e+01 84 145 8.33333333333333e+00 84 127 -8.33333333333333e+00 84 367 -8.33333333333333e+00 84 373 8.33333333333333e+00 84 372 -1.25000000000000e+01 84 86 -8.33333333333333e+00 85 85 6.66666666666667e+01 85 439 -8.33333333333333e+00 85 84 -8.33333333333333e+00 85 438 4.16666666666667e+00 85 293 4.16666666666667e+00 85 291 4.16666666666667e+00 85 436 -8.33333333333333e+00 85 435 4.16666666666667e+00 85 299 8.33333333333333e+00 85 298 -1.25000000000000e+01 85 146 -1.66666666666667e+01 85 374 8.33333333333333e+00 85 144 8.33333333333333e+00 85 126 -8.33333333333333e+00 85 368 4.16666666666667e+00 85 128 -8.33333333333333e+00 85 373 -3.75000000000000e+01 85 297 -4.16666666666667e+00 85 366 -8.33333333333333e+00 85 372 8.33333333333333e+00 86 86 6.66666666666667e+01 86 438 4.16666666666667e+00 86 440 -8.33333333333333e+00 86 372 -4.16666666666667e+00 86 292 4.16666666666667e+00 86 297 8.33333333333333e+00 86 435 4.16666666666667e+00 86 291 -8.33333333333333e+00 86 437 -8.33333333333333e+00 86 366 4.16666666666667e+00 86 299 -3.75000000000000e+01 86 298 8.33333333333333e+00 86 144 8.33333333333333e+00 86 126 -8.33333333333333e+00 86 145 -1.66666666666667e+01 86 373 8.33333333333333e+00 86 374 -1.25000000000000e+01 86 84 -8.33333333333333e+00 86 367 4.16666666666667e+00 86 127 -8.33333333333333e+00 87 87 7.50000000000000e+01 87 443 4.16666666666667e+00 87 307 -4.16666666666667e+00 87 383 -4.16666666666667e+00 87 88 -8.33333333333333e+00 87 442 4.16666666666667e+00 87 441 -2.50000000000000e+01 87 308 8.33333333333333e+00 87 440 4.16666666666667e+00 87 302 -8.33333333333333e+00 87 301 4.16666666666667e+00 87 377 4.16666666666667e+00 87 439 4.16666666666667e+00 87 438 -2.50000000000000e+01 87 167 8.33333333333333e+00 87 149 -8.33333333333333e+00 87 306 -1.25000000000000e+01 87 166 8.33333333333333e+00 87 148 -8.33333333333333e+00 87 376 -8.33333333333333e+00 87 382 8.33333333333333e+00 87 381 -1.25000000000000e+01 87 89 -8.33333333333333e+00 88 88 6.66666666666667e+01 88 442 -8.33333333333333e+00 88 87 -8.33333333333333e+00 88 441 4.16666666666667e+00 88 302 4.16666666666667e+00 88 300 4.16666666666667e+00 88 439 -8.33333333333333e+00 88 438 4.16666666666667e+00 88 308 8.33333333333333e+00 88 307 -1.25000000000000e+01 88 167 -1.66666666666667e+01 88 383 8.33333333333333e+00 88 165 8.33333333333333e+00 88 147 -8.33333333333333e+00 88 377 4.16666666666667e+00 88 149 -8.33333333333333e+00 88 382 -3.75000000000000e+01 88 306 -4.16666666666667e+00 88 375 -8.33333333333333e+00 88 381 8.33333333333333e+00 89 89 6.66666666666667e+01 89 441 4.16666666666667e+00 89 443 -8.33333333333333e+00 89 381 -4.16666666666667e+00 89 301 4.16666666666667e+00 89 306 8.33333333333333e+00 89 438 4.16666666666667e+00 89 300 -8.33333333333333e+00 89 440 -8.33333333333333e+00 89 375 4.16666666666667e+00 89 308 -3.75000000000000e+01 89 307 8.33333333333333e+00 89 165 8.33333333333333e+00 89 147 -8.33333333333333e+00 89 166 -1.66666666666667e+01 89 382 8.33333333333333e+00 89 383 -1.25000000000000e+01 89 87 -8.33333333333333e+00 89 376 4.16666666666667e+00 89 148 -8.33333333333333e+00 90 90 7.50000000000000e+01 90 446 4.16666666666667e+00 90 316 -4.16666666666667e+00 90 392 -4.16666666666667e+00 90 91 -8.33333333333333e+00 90 445 4.16666666666667e+00 90 444 -2.50000000000000e+01 90 317 8.33333333333333e+00 90 443 4.16666666666667e+00 90 311 -8.33333333333333e+00 90 310 4.16666666666667e+00 90 386 4.16666666666667e+00 90 442 4.16666666666667e+00 90 441 -2.50000000000000e+01 90 188 8.33333333333333e+00 90 170 -8.33333333333333e+00 90 315 -1.25000000000000e+01 90 187 8.33333333333333e+00 90 169 -8.33333333333333e+00 90 385 -8.33333333333333e+00 90 391 8.33333333333333e+00 90 390 -1.25000000000000e+01 90 92 -8.33333333333333e+00 91 91 6.66666666666667e+01 91 445 -8.33333333333333e+00 91 90 -8.33333333333333e+00 91 444 4.16666666666667e+00 91 311 4.16666666666667e+00 91 309 4.16666666666667e+00 91 442 -8.33333333333333e+00 91 441 4.16666666666667e+00 91 317 8.33333333333333e+00 91 316 -1.25000000000000e+01 91 188 -1.66666666666667e+01 91 392 8.33333333333333e+00 91 186 8.33333333333333e+00 91 168 -8.33333333333333e+00 91 386 4.16666666666667e+00 91 170 -8.33333333333333e+00 91 391 -3.75000000000000e+01 91 315 -4.16666666666667e+00 91 384 -8.33333333333333e+00 91 390 8.33333333333333e+00 92 92 6.66666666666667e+01 92 444 4.16666666666667e+00 92 446 -8.33333333333333e+00 92 390 -4.16666666666667e+00 92 310 4.16666666666667e+00 92 315 8.33333333333333e+00 92 441 4.16666666666667e+00 92 309 -8.33333333333333e+00 92 443 -8.33333333333333e+00 92 384 4.16666666666667e+00 92 317 -3.75000000000000e+01 92 316 8.33333333333333e+00 92 186 8.33333333333333e+00 92 168 -8.33333333333333e+00 92 187 -1.66666666666667e+01 92 391 8.33333333333333e+00 92 392 -1.25000000000000e+01 92 90 -8.33333333333333e+00 92 385 4.16666666666667e+00 92 169 -8.33333333333333e+00 93 93 4.23333333333333e+01 93 449 8.33333333333333e-02 93 325 -8.33333333333333e-02 93 401 -8.33333333333333e-02 93 94 -1.66666666666667e-01 93 448 8.33333333333333e-02 93 447 -5.00000000000000e-01 93 326 4.25000000000000e+00 93 446 4.16666666666667e+00 93 320 -8.33333333333333e+00 93 319 4.16666666666667e+00 93 395 4.16666666666667e+00 93 445 4.16666666666667e+00 93 444 -2.50000000000000e+01 93 209 4.25000000000000e+00 93 191 -8.33333333333333e+00 93 324 -8.41666666666667e+00 93 208 4.25000000000000e+00 93 190 -8.33333333333333e+00 93 394 -8.33333333333333e+00 93 400 4.25000000000000e+00 93 399 -8.41666666666667e+00 93 95 -1.66666666666667e-01 94 94 4.21666666666667e+01 94 448 -1.66666666666667e-01 94 93 -1.66666666666667e-01 94 447 8.33333333333333e-02 94 320 4.16666666666667e+00 94 318 4.16666666666667e+00 94 445 -8.33333333333333e+00 94 444 4.16666666666667e+00 94 326 4.25000000000000e+00 94 325 -8.41666666666667e+00 94 209 -8.50000000000000e+00 94 401 4.25000000000000e+00 94 207 4.25000000000000e+00 94 189 -8.33333333333333e+00 94 395 4.16666666666667e+00 94 191 -8.33333333333333e+00 94 400 -2.52500000000000e+01 94 324 -8.33333333333333e-02 94 393 -8.33333333333333e+00 94 399 4.25000000000000e+00 95 95 4.21666666666667e+01 95 447 8.33333333333333e-02 95 449 -1.66666666666667e-01 95 399 -8.33333333333333e-02 95 319 4.16666666666667e+00 95 324 4.25000000000000e+00 95 444 4.16666666666667e+00 95 318 -8.33333333333333e+00 95 446 -8.33333333333333e+00 95 393 4.16666666666667e+00 95 326 -2.52500000000000e+01 95 325 4.25000000000000e+00 95 207 4.25000000000000e+00 95 189 -8.33333333333333e+00 95 208 -8.50000000000000e+00 95 400 4.25000000000000e+00 95 401 -8.41666666666667e+00 95 93 -1.66666666666667e-01 95 394 4.16666666666667e+00 95 190 -8.33333333333333e+00 96 96 1.50000000000000e+00 96 452 8.33333333333333e-02 96 334 -8.33333333333333e-02 96 410 -8.33333333333333e-02 96 97 -1.66666666666667e-01 96 451 8.33333333333333e-02 96 450 -5.00000000000000e-01 96 335 1.66666666666667e-01 96 449 8.33333333333333e-02 96 329 -1.66666666666667e-01 96 328 8.33333333333333e-02 96 404 8.33333333333333e-02 96 448 8.33333333333333e-02 96 447 -5.00000000000000e-01 96 230 1.66666666666667e-01 96 212 -1.66666666666667e-01 96 333 -2.50000000000000e-01 96 229 1.66666666666667e-01 96 211 -1.66666666666667e-01 96 403 -1.66666666666667e-01 96 409 1.66666666666667e-01 96 408 -2.50000000000000e-01 96 98 -1.66666666666667e-01 97 97 1.33333333333333e+00 97 451 -1.66666666666667e-01 97 96 -1.66666666666667e-01 97 450 8.33333333333333e-02 97 329 8.33333333333333e-02 97 327 8.33333333333333e-02 97 448 -1.66666666666667e-01 97 447 8.33333333333333e-02 97 335 1.66666666666667e-01 97 334 -2.50000000000000e-01 97 230 -3.33333333333333e-01 97 410 1.66666666666667e-01 97 228 1.66666666666667e-01 97 210 -1.66666666666667e-01 97 404 8.33333333333333e-02 97 212 -1.66666666666667e-01 97 409 -7.50000000000000e-01 97 333 -8.33333333333333e-02 97 402 -1.66666666666667e-01 97 408 1.66666666666667e-01 98 98 1.33333333333333e+00 98 450 8.33333333333333e-02 98 452 -1.66666666666667e-01 98 408 -8.33333333333333e-02 98 328 8.33333333333333e-02 98 333 1.66666666666667e-01 98 447 8.33333333333333e-02 98 327 -1.66666666666667e-01 98 449 -1.66666666666667e-01 98 402 8.33333333333333e-02 98 335 -7.50000000000000e-01 98 334 1.66666666666667e-01 98 228 1.66666666666667e-01 98 210 -1.66666666666667e-01 98 229 -3.33333333333333e-01 98 409 1.66666666666667e-01 98 410 -2.50000000000000e-01 98 96 -1.66666666666667e-01 98 403 8.33333333333333e-02 98 211 -1.66666666666667e-01 99 99 1.50000000000000e+00 99 455 8.33333333333333e-02 99 343 -8.33333333333333e-02 99 419 -8.33333333333333e-02 99 100 -1.66666666666667e-01 99 454 8.33333333333333e-02 99 453 -5.00000000000000e-01 99 344 1.66666666666667e-01 99 452 8.33333333333333e-02 99 338 -1.66666666666667e-01 99 337 8.33333333333333e-02 99 413 8.33333333333333e-02 99 451 8.33333333333333e-02 99 450 -5.00000000000000e-01 99 251 1.66666666666667e-01 99 233 -1.66666666666667e-01 99 342 -2.50000000000000e-01 99 250 1.66666666666667e-01 99 232 -1.66666666666667e-01 99 412 -1.66666666666667e-01 99 418 1.66666666666667e-01 99 417 -2.50000000000000e-01 99 101 -1.66666666666667e-01 100 100 1.33333333333333e+00 100 454 -1.66666666666667e-01 100 99 -1.66666666666667e-01 100 453 8.33333333333333e-02 100 338 8.33333333333333e-02 100 336 8.33333333333333e-02 100 451 -1.66666666666667e-01 100 450 8.33333333333333e-02 100 344 1.66666666666667e-01 100 343 -2.50000000000000e-01 100 251 -3.33333333333333e-01 100 419 1.66666666666667e-01 100 249 1.66666666666667e-01 100 231 -1.66666666666667e-01 100 413 8.33333333333333e-02 100 233 -1.66666666666667e-01 100 418 -7.50000000000000e-01 100 342 -8.33333333333333e-02 100 411 -1.66666666666667e-01 100 417 1.66666666666667e-01 101 101 1.33333333333333e+00 101 453 8.33333333333333e-02 101 455 -1.66666666666667e-01 101 417 -8.33333333333333e-02 101 337 8.33333333333333e-02 101 342 1.66666666666667e-01 101 450 8.33333333333333e-02 101 336 -1.66666666666667e-01 101 452 -1.66666666666667e-01 101 411 8.33333333333333e-02 101 344 -7.50000000000000e-01 101 343 1.66666666666667e-01 101 249 1.66666666666667e-01 101 231 -1.66666666666667e-01 101 250 -3.33333333333333e-01 101 418 1.66666666666667e-01 101 419 -2.50000000000000e-01 101 99 -1.66666666666667e-01 101 412 8.33333333333333e-02 101 232 -1.66666666666667e-01 102 102 1.50000000000000e+00 102 458 8.33333333333333e-02 102 352 -8.33333333333333e-02 102 428 -8.33333333333333e-02 102 103 -1.66666666666667e-01 102 457 8.33333333333333e-02 102 456 -5.00000000000000e-01 102 353 1.66666666666667e-01 102 455 8.33333333333333e-02 102 347 -1.66666666666667e-01 102 346 8.33333333333333e-02 102 422 8.33333333333333e-02 102 454 8.33333333333333e-02 102 453 -5.00000000000000e-01 102 272 1.66666666666667e-01 102 254 -1.66666666666667e-01 102 351 -2.50000000000000e-01 102 271 1.66666666666667e-01 102 253 -1.66666666666667e-01 102 421 -1.66666666666667e-01 102 427 1.66666666666667e-01 102 426 -2.50000000000000e-01 102 104 -1.66666666666667e-01 103 103 1.33333333333333e+00 103 457 -1.66666666666667e-01 103 102 -1.66666666666667e-01 103 456 8.33333333333333e-02 103 347 8.33333333333333e-02 103 345 8.33333333333333e-02 103 454 -1.66666666666667e-01 103 453 8.33333333333333e-02 103 353 1.66666666666667e-01 103 352 -2.50000000000000e-01 103 272 -3.33333333333333e-01 103 428 1.66666666666667e-01 103 270 1.66666666666667e-01 103 252 -1.66666666666667e-01 103 422 8.33333333333333e-02 103 254 -1.66666666666667e-01 103 427 -7.50000000000000e-01 103 351 -8.33333333333333e-02 103 420 -1.66666666666667e-01 103 426 1.66666666666667e-01 104 104 1.33333333333333e+00 104 456 8.33333333333333e-02 104 458 -1.66666666666667e-01 104 426 -8.33333333333333e-02 104 346 8.33333333333333e-02 104 351 1.66666666666667e-01 104 453 8.33333333333333e-02 104 345 -1.66666666666667e-01 104 455 -1.66666666666667e-01 104 420 8.33333333333333e-02 104 353 -7.50000000000000e-01 104 352 1.66666666666667e-01 104 270 1.66666666666667e-01 104 252 -1.66666666666667e-01 104 271 -3.33333333333333e-01 104 427 1.66666666666667e-01 104 428 -2.50000000000000e-01 104 102 -1.66666666666667e-01 104 421 8.33333333333333e-02 104 253 -1.66666666666667e-01 105 105 8.33333333333333e-01 105 458 8.33333333333333e-02 105 356 -1.66666666666667e-01 105 355 8.33333333333333e-02 105 431 8.33333333333333e-02 105 457 8.33333333333333e-02 105 456 -5.00000000000000e-01 105 284 8.33333333333333e-02 105 275 -1.66666666666667e-01 105 357 -1.66666666666667e-01 105 283 8.33333333333333e-02 105 274 -1.66666666666667e-01 105 430 -1.66666666666667e-01 105 433 8.33333333333333e-02 105 432 -1.66666666666667e-01 105 359 8.33333333333333e-02 106 106 8.33333333333333e-01 106 354 8.33333333333333e-02 106 457 -1.66666666666667e-01 106 456 8.33333333333333e-02 106 359 8.33333333333333e-02 106 358 -1.66666666666667e-01 106 284 -1.66666666666667e-01 106 434 8.33333333333333e-02 106 282 8.33333333333333e-02 106 273 -1.66666666666667e-01 106 431 8.33333333333333e-02 106 275 -1.66666666666667e-01 106 433 -5.00000000000000e-01 106 356 8.33333333333333e-02 106 429 -1.66666666666667e-01 106 432 8.33333333333333e-02 107 107 8.33333333333333e-01 107 357 8.33333333333333e-02 107 456 8.33333333333333e-02 107 354 -1.66666666666667e-01 107 458 -1.66666666666667e-01 107 429 8.33333333333333e-02 107 359 -5.00000000000000e-01 107 358 8.33333333333333e-02 107 282 8.33333333333333e-02 107 273 -1.66666666666667e-01 107 283 -1.66666666666667e-01 107 433 8.33333333333333e-02 107 434 -1.66666666666667e-01 107 355 8.33333333333333e-02 107 430 8.33333333333333e-02 107 274 -1.66666666666667e-01 108 108 7.50000000000000e+01 108 4 4.16666666666667e+00 108 133 -8.33333333333333e+00 108 116 -4.16666666666667e+00 108 109 -8.33333333333333e+00 108 115 8.33333333333333e+00 108 1 0.00000000000000e+00 108 114 -1.25000000000000e+01 108 146 -8.33333333333333e+00 108 128 8.33333333333333e+00 108 5 4.16666666666667e+00 108 140 -8.33333333333333e+00 108 139 4.16666666666667e+00 108 145 -8.33333333333333e+00 108 3 -2.50000000000000e+01 108 110 -8.33333333333333e+00 108 122 8.33333333333333e+00 108 2 0.00000000000000e+00 108 121 -4.16666666666667e+00 108 127 8.33333333333333e+00 108 134 4.16666666666667e+00 108 120 -1.25000000000000e+01 108 0 0.00000000000000e+00 109 109 6.66666666666667e+01 109 3 4.16666666666667e+00 109 132 -8.33333333333333e+00 109 116 8.33333333333333e+00 109 115 -3.75000000000000e+01 109 108 -8.33333333333333e+00 109 114 8.33333333333333e+00 109 0 0.00000000000000e+00 109 140 4.16666666666667e+00 109 146 -8.33333333333333e+00 109 4 -8.33333333333333e+00 109 138 4.16666666666667e+00 109 144 -8.33333333333333e+00 109 122 8.33333333333333e+00 109 128 -1.66666666666667e+01 109 134 4.16666666666667e+00 109 121 -1.25000000000000e+01 109 1 0.00000000000000e+00 109 120 -4.16666666666667e+00 109 126 8.33333333333333e+00 110 110 6.66666666666667e+01 110 132 4.16666666666667e+00 110 116 -1.25000000000000e+01 110 115 8.33333333333333e+00 110 114 -4.16666666666667e+00 110 139 4.16666666666667e+00 110 145 -8.33333333333333e+00 110 144 -8.33333333333333e+00 110 126 8.33333333333333e+00 110 5 -8.33333333333333e+00 110 3 4.16666666666667e+00 110 138 -8.33333333333333e+00 110 133 4.16666666666667e+00 110 122 -3.75000000000000e+01 110 2 0.00000000000000e+00 110 121 8.33333333333333e+00 110 127 -1.66666666666667e+01 110 108 -8.33333333333333e+00 110 120 8.33333333333333e+00 110 0 0.00000000000000e+00 111 111 1.00000000000000e+00 111 286 0.00000000000000e+00 111 28 0.00000000000000e+00 111 116 0.00000000000000e+00 111 115 0.00000000000000e+00 111 112 0.00000000000000e+00 111 1 0.00000000000000e+00 111 114 0.00000000000000e+00 111 293 0.00000000000000e+00 111 290 0.00000000000000e+00 111 289 0.00000000000000e+00 111 292 0.00000000000000e+00 111 27 0.00000000000000e+00 111 125 0.00000000000000e+00 111 128 0.00000000000000e+00 111 124 0.00000000000000e+00 111 127 0.00000000000000e+00 111 123 0.00000000000000e+00 111 287 0.00000000000000e+00 111 0 0.00000000000000e+00 112 112 1.00000000000000e+00 112 285 0.00000000000000e+00 112 27 0.00000000000000e+00 112 116 0.00000000000000e+00 112 115 0.00000000000000e+00 112 114 0.00000000000000e+00 112 111 0.00000000000000e+00 112 0 0.00000000000000e+00 112 293 0.00000000000000e+00 112 128 0.00000000000000e+00 112 290 0.00000000000000e+00 112 29 0.00000000000000e+00 112 28 0.00000000000000e+00 112 288 0.00000000000000e+00 112 291 0.00000000000000e+00 112 125 0.00000000000000e+00 112 113 0.00000000000000e+00 112 2 0.00000000000000e+00 112 124 0.00000000000000e+00 112 287 0.00000000000000e+00 112 1 0.00000000000000e+00 112 123 0.00000000000000e+00 112 126 0.00000000000000e+00 113 113 1.00000000000000e+00 113 286 0.00000000000000e+00 113 116 0.00000000000000e+00 113 115 0.00000000000000e+00 113 114 0.00000000000000e+00 113 291 0.00000000000000e+00 113 288 0.00000000000000e+00 113 292 0.00000000000000e+00 113 127 0.00000000000000e+00 113 29 0.00000000000000e+00 113 289 0.00000000000000e+00 113 28 0.00000000000000e+00 113 125 0.00000000000000e+00 113 285 0.00000000000000e+00 113 2 0.00000000000000e+00 113 124 0.00000000000000e+00 113 112 0.00000000000000e+00 113 1 0.00000000000000e+00 113 123 0.00000000000000e+00 113 126 0.00000000000000e+00 114 114 1.25000000000000e+02 114 292 8.33333333333333e+00 114 293 8.33333333333333e+00 114 286 8.33333333333333e+00 114 285 -1.25000000000000e+01 114 116 -1.66666666666667e+01 114 113 0.00000000000000e+00 114 112 0.00000000000000e+00 114 111 0.00000000000000e+00 114 127 -8.33333333333333e+00 114 115 -1.66666666666667e+01 114 134 8.33333333333333e+00 114 298 -8.33333333333333e+00 114 145 8.33333333333333e+00 114 128 1.66666666666667e+01 114 146 -1.66666666666667e+01 114 32 4.16666666666667e+00 114 299 -8.33333333333333e+00 114 133 8.33333333333333e+00 114 31 -8.33333333333333e+00 114 132 -3.75000000000000e+01 114 110 -4.16666666666667e+00 114 2 0.00000000000000e+00 114 109 8.33333333333333e+00 114 1 0.00000000000000e+00 114 108 -1.25000000000000e+01 114 287 -4.16666666666667e+00 114 126 -2.50000000000000e+01 115 115 1.25000000000000e+02 115 291 8.33333333333333e+00 115 293 -1.66666666666667e+01 115 32 4.16666666666667e+00 115 286 -3.75000000000000e+01 115 285 8.33333333333333e+00 115 113 0.00000000000000e+00 115 2 0.00000000000000e+00 115 112 0.00000000000000e+00 115 111 0.00000000000000e+00 115 126 -8.33333333333333e+00 115 134 -4.16666666666667e+00 115 114 -1.66666666666667e+01 115 297 -8.33333333333333e+00 115 144 8.33333333333333e+00 115 299 -8.33333333333333e+00 115 146 8.33333333333333e+00 115 133 -1.25000000000000e+01 115 132 8.33333333333333e+00 115 30 -8.33333333333333e+00 115 110 8.33333333333333e+00 115 116 -1.66666666666667e+01 115 128 1.66666666666667e+01 115 109 -3.75000000000000e+01 115 287 8.33333333333333e+00 115 127 -2.50000000000000e+01 115 108 8.33333333333333e+00 115 0 0.00000000000000e+00 116 116 1.25000000000000e+02 116 286 8.33333333333333e+00 116 292 -1.66666666666667e+01 116 291 8.33333333333333e+00 116 287 -1.25000000000000e+01 116 31 4.16666666666667e+00 116 113 0.00000000000000e+00 116 112 0.00000000000000e+00 116 1 0.00000000000000e+00 116 114 -1.66666666666667e+01 116 111 0.00000000000000e+00 116 133 -4.16666666666667e+00 116 132 8.33333333333333e+00 116 298 -8.33333333333333e+00 116 145 8.33333333333333e+00 116 126 1.66666666666667e+01 116 144 -1.66666666666667e+01 116 134 -1.25000000000000e+01 116 30 4.16666666666667e+00 116 297 -8.33333333333333e+00 116 110 -1.25000000000000e+01 116 285 -4.16666666666667e+00 116 128 -7.50000000000000e+01 116 109 8.33333333333333e+00 116 115 -1.66666666666667e+01 116 127 1.66666666666667e+01 116 108 -4.16666666666667e+00 116 0 0.00000000000000e+00 117 117 1.00000000000000e+00 117 365 0.00000000000000e+00 117 125 0.00000000000000e+00 117 124 0.00000000000000e+00 117 123 0.00000000000000e+00 117 128 0.00000000000000e+00 117 368 0.00000000000000e+00 117 361 0.00000000000000e+00 117 367 0.00000000000000e+00 117 56 0.00000000000000e+00 117 362 0.00000000000000e+00 117 54 0.00000000000000e+00 117 119 0.00000000000000e+00 117 122 0.00000000000000e+00 117 2 0.00000000000000e+00 117 121 0.00000000000000e+00 117 127 0.00000000000000e+00 117 364 0.00000000000000e+00 117 120 0.00000000000000e+00 117 0 0.00000000000000e+00 118 118 1.00000000000000e+00 118 365 0.00000000000000e+00 118 56 0.00000000000000e+00 118 125 0.00000000000000e+00 118 119 0.00000000000000e+00 118 2 0.00000000000000e+00 118 124 0.00000000000000e+00 118 123 0.00000000000000e+00 118 360 0.00000000000000e+00 118 366 0.00000000000000e+00 118 362 0.00000000000000e+00 118 368 0.00000000000000e+00 118 55 0.00000000000000e+00 118 122 0.00000000000000e+00 118 128 0.00000000000000e+00 118 363 0.00000000000000e+00 118 121 0.00000000000000e+00 118 1 0.00000000000000e+00 118 120 0.00000000000000e+00 118 126 0.00000000000000e+00 119 119 1.00000000000000e+00 119 55 0.00000000000000e+00 119 363 0.00000000000000e+00 119 125 0.00000000000000e+00 119 124 0.00000000000000e+00 119 118 0.00000000000000e+00 119 1 0.00000000000000e+00 119 123 0.00000000000000e+00 119 126 0.00000000000000e+00 119 366 0.00000000000000e+00 119 56 0.00000000000000e+00 119 361 0.00000000000000e+00 119 367 0.00000000000000e+00 119 54 0.00000000000000e+00 119 360 0.00000000000000e+00 119 364 0.00000000000000e+00 119 122 0.00000000000000e+00 119 2 0.00000000000000e+00 119 121 0.00000000000000e+00 119 127 0.00000000000000e+00 119 117 0.00000000000000e+00 119 120 0.00000000000000e+00 119 0 0.00000000000000e+00 120 120 1.25000000000000e+02 120 146 8.33333333333333e+00 120 145 -1.66666666666667e+01 120 140 8.33333333333333e+00 120 58 4.16666666666667e+00 120 138 -3.75000000000000e+01 120 110 8.33333333333333e+00 120 109 -4.16666666666667e+00 120 1 0.00000000000000e+00 120 108 -1.25000000000000e+01 120 128 -8.33333333333333e+00 120 122 -1.66666666666667e+01 120 361 -4.16666666666667e+00 120 374 -8.33333333333333e+00 120 368 8.33333333333333e+00 120 373 -8.33333333333333e+00 120 367 8.33333333333333e+00 120 362 8.33333333333333e+00 120 59 -8.33333333333333e+00 120 360 -1.25000000000000e+01 120 119 0.00000000000000e+00 120 2 0.00000000000000e+00 120 118 0.00000000000000e+00 120 121 -1.66666666666667e+01 120 127 1.66666666666667e+01 120 117 0.00000000000000e+00 120 139 8.33333333333333e+00 120 126 -2.50000000000000e+01 121 121 1.25000000000000e+02 121 146 8.33333333333333e+00 121 138 8.33333333333333e+00 121 144 -1.66666666666667e+01 121 139 -1.25000000000000e+01 121 57 4.16666666666667e+00 121 110 8.33333333333333e+00 121 122 -1.66666666666667e+01 121 109 -1.25000000000000e+01 121 108 -4.16666666666667e+00 121 0 0.00000000000000e+00 121 360 -4.16666666666667e+00 121 362 8.33333333333333e+00 121 128 1.66666666666667e+01 121 368 -1.66666666666667e+01 121 372 -8.33333333333333e+00 121 366 8.33333333333333e+00 121 59 4.16666666666667e+00 121 374 -8.33333333333333e+00 121 361 -1.25000000000000e+01 121 119 0.00000000000000e+00 121 2 0.00000000000000e+00 121 118 0.00000000000000e+00 121 140 -4.16666666666667e+00 121 127 -7.50000000000000e+01 121 117 0.00000000000000e+00 121 120 -1.66666666666667e+01 121 126 1.66666666666667e+01 122 122 1.25000000000000e+02 122 145 8.33333333333333e+00 122 144 8.33333333333333e+00 122 140 -1.25000000000000e+01 122 138 8.33333333333333e+00 122 110 -3.75000000000000e+01 122 109 8.33333333333333e+00 122 121 -1.66666666666667e+01 122 108 8.33333333333333e+00 122 126 -8.33333333333333e+00 122 120 -1.66666666666667e+01 122 361 8.33333333333333e+00 122 372 -8.33333333333333e+00 122 366 8.33333333333333e+00 122 127 1.66666666666667e+01 122 367 -1.66666666666667e+01 122 362 -3.75000000000000e+01 122 58 4.16666666666667e+00 122 373 -8.33333333333333e+00 122 360 8.33333333333333e+00 122 57 -8.33333333333333e+00 122 119 0.00000000000000e+00 122 139 -4.16666666666667e+00 122 128 -2.50000000000000e+01 122 118 0.00000000000000e+00 122 1 0.00000000000000e+00 122 117 0.00000000000000e+00 122 0 0.00000000000000e+00 123 123 1.00000000000000e+00 123 290 0.00000000000000e+00 123 289 0.00000000000000e+00 123 292 0.00000000000000e+00 123 82 0.00000000000000e+00 123 288 0.00000000000000e+00 123 125 0.00000000000000e+00 123 113 0.00000000000000e+00 123 112 0.00000000000000e+00 123 1 0.00000000000000e+00 123 111 0.00000000000000e+00 123 364 0.00000000000000e+00 123 365 0.00000000000000e+00 123 128 0.00000000000000e+00 123 368 0.00000000000000e+00 123 436 0.00000000000000e+00 123 367 0.00000000000000e+00 123 83 0.00000000000000e+00 123 437 0.00000000000000e+00 123 363 0.00000000000000e+00 123 119 0.00000000000000e+00 123 2 0.00000000000000e+00 123 124 0.00000000000000e+00 123 118 0.00000000000000e+00 123 127 0.00000000000000e+00 123 293 0.00000000000000e+00 123 117 0.00000000000000e+00 123 126 0.00000000000000e+00 124 124 1.00000000000000e+00 124 293 0.00000000000000e+00 124 291 0.00000000000000e+00 124 290 0.00000000000000e+00 124 289 0.00000000000000e+00 124 81 0.00000000000000e+00 124 113 0.00000000000000e+00 124 112 0.00000000000000e+00 124 111 0.00000000000000e+00 124 0 0.00000000000000e+00 124 128 0.00000000000000e+00 124 125 0.00000000000000e+00 124 363 0.00000000000000e+00 124 437 0.00000000000000e+00 124 368 0.00000000000000e+00 124 435 0.00000000000000e+00 124 366 0.00000000000000e+00 124 83 0.00000000000000e+00 124 365 0.00000000000000e+00 124 364 0.00000000000000e+00 124 119 0.00000000000000e+00 124 2 0.00000000000000e+00 124 288 0.00000000000000e+00 124 118 0.00000000000000e+00 124 127 0.00000000000000e+00 124 123 0.00000000000000e+00 124 117 0.00000000000000e+00 124 126 0.00000000000000e+00 125 125 1.00000000000000e+00 125 288 0.00000000000000e+00 125 292 0.00000000000000e+00 125 290 0.00000000000000e+00 125 289 0.00000000000000e+00 125 113 0.00000000000000e+00 125 112 0.00000000000000e+00 125 123 0.00000000000000e+00 125 111 0.00000000000000e+00 125 127 0.00000000000000e+00 125 124 0.00000000000000e+00 125 436 0.00000000000000e+00 125 367 0.00000000000000e+00 125 363 0.00000000000000e+00 125 126 0.00000000000000e+00 125 366 0.00000000000000e+00 125 365 0.00000000000000e+00 125 82 0.00000000000000e+00 125 364 0.00000000000000e+00 125 81 0.00000000000000e+00 125 435 0.00000000000000e+00 125 291 0.00000000000000e+00 125 119 0.00000000000000e+00 125 128 0.00000000000000e+00 125 118 0.00000000000000e+00 125 1 0.00000000000000e+00 125 117 0.00000000000000e+00 125 0 0.00000000000000e+00 126 126 2.50000000000000e+02 126 292 1.66666666666667e+01 126 291 -2.50000000000000e+01 126 113 0.00000000000000e+00 126 112 0.00000000000000e+00 126 125 0.00000000000000e+00 126 436 8.33333333333333e+00 126 124 0.00000000000000e+00 126 123 0.00000000000000e+00 126 437 8.33333333333333e+00 126 115 -8.33333333333333e+00 126 116 1.66666666666667e+01 126 128 -3.33333333333333e+01 126 2 0.00000000000000e+00 126 114 -2.50000000000000e+01 126 299 8.33333333333333e+00 126 86 -8.33333333333333e+00 126 298 -1.66666666666667e+01 126 110 8.33333333333333e+00 126 145 1.66666666666667e+01 126 127 -3.33333333333333e+01 126 146 1.66666666666667e+01 126 85 -8.33333333333333e+00 126 144 -7.50000000000000e+01 126 109 8.33333333333333e+00 126 1 0.00000000000000e+00 126 122 -8.33333333333333e+00 126 119 0.00000000000000e+00 126 373 8.33333333333333e+00 126 367 -8.33333333333333e+00 126 118 0.00000000000000e+00 126 121 1.66666666666667e+01 126 120 -2.50000000000000e+01 126 368 1.66666666666667e+01 126 374 -1.66666666666667e+01 126 366 -2.50000000000000e+01 126 293 -8.33333333333333e+00 127 127 2.50000000000000e+02 127 291 1.66666666666667e+01 127 293 1.66666666666667e+01 127 292 -7.50000000000000e+01 127 111 0.00000000000000e+00 127 125 0.00000000000000e+00 127 435 8.33333333333333e+00 127 124 0.00000000000000e+00 127 123 0.00000000000000e+00 127 437 -1.66666666666667e+01 127 114 -8.33333333333333e+00 127 299 8.33333333333333e+00 127 116 1.66666666666667e+01 127 115 -2.50000000000000e+01 127 297 -1.66666666666667e+01 127 146 -8.33333333333333e+00 127 144 1.66666666666667e+01 127 126 -3.33333333333333e+01 127 145 -2.50000000000000e+01 127 84 -8.33333333333333e+00 127 110 -1.66666666666667e+01 127 108 8.33333333333333e+00 127 0 0.00000000000000e+00 127 122 1.66666666666667e+01 127 128 -3.33333333333333e+01 127 368 1.66666666666667e+01 127 372 8.33333333333333e+00 127 366 -8.33333333333333e+00 127 119 0.00000000000000e+00 127 2 0.00000000000000e+00 127 121 -7.50000000000000e+01 127 117 0.00000000000000e+00 127 120 1.66666666666667e+01 127 374 8.33333333333333e+00 127 86 -8.33333333333333e+00 127 367 -2.50000000000000e+01 127 113 0.00000000000000e+00 128 128 2.50000000000000e+02 128 112 0.00000000000000e+00 128 293 -2.50000000000000e+01 128 292 1.66666666666667e+01 128 111 0.00000000000000e+00 128 124 0.00000000000000e+00 128 123 0.00000000000000e+00 128 125 0.00000000000000e+00 128 436 -1.66666666666667e+01 128 435 8.33333333333333e+00 128 298 8.33333333333333e+00 128 114 1.66666666666667e+01 128 126 -3.33333333333333e+01 128 116 -7.50000000000000e+01 128 115 1.66666666666667e+01 128 0 0.00000000000000e+00 128 297 8.33333333333333e+00 128 84 -8.33333333333333e+00 128 145 -8.33333333333333e+00 128 108 8.33333333333333e+00 128 146 -2.50000000000000e+01 128 144 1.66666666666667e+01 128 109 -1.66666666666667e+01 128 120 -8.33333333333333e+00 128 117 0.00000000000000e+00 128 121 1.66666666666667e+01 128 127 -3.33333333333333e+01 128 367 1.66666666666667e+01 128 122 -2.50000000000000e+01 128 118 0.00000000000000e+00 128 1 0.00000000000000e+00 128 368 -7.50000000000000e+01 128 291 -8.33333333333333e+00 128 373 8.33333333333333e+00 128 85 -8.33333333333333e+00 128 366 1.66666666666667e+01 128 372 -1.66666666666667e+01 129 129 7.50000000000000e+01 129 7 4.16666666666667e+00 129 154 -8.33333333333333e+00 129 137 -4.16666666666667e+00 129 130 -8.33333333333333e+00 129 136 8.33333333333333e+00 129 4 4.16666666666667e+00 129 135 -1.25000000000000e+01 129 167 -8.33333333333333e+00 129 149 8.33333333333333e+00 129 8 4.16666666666667e+00 129 161 -8.33333333333333e+00 129 160 4.16666666666667e+00 129 166 -8.33333333333333e+00 129 6 -2.50000000000000e+01 129 131 -8.33333333333333e+00 129 143 8.33333333333333e+00 129 5 4.16666666666667e+00 129 142 -4.16666666666667e+00 129 148 8.33333333333333e+00 129 155 4.16666666666667e+00 129 141 -1.25000000000000e+01 129 3 -2.50000000000000e+01 130 130 6.66666666666667e+01 130 6 4.16666666666667e+00 130 153 -8.33333333333333e+00 130 137 8.33333333333333e+00 130 136 -3.75000000000000e+01 130 129 -8.33333333333333e+00 130 135 8.33333333333333e+00 130 3 4.16666666666667e+00 130 161 4.16666666666667e+00 130 167 -8.33333333333333e+00 130 7 -8.33333333333333e+00 130 159 4.16666666666667e+00 130 165 -8.33333333333333e+00 130 143 8.33333333333333e+00 130 149 -1.66666666666667e+01 130 155 4.16666666666667e+00 130 142 -1.25000000000000e+01 130 4 -8.33333333333333e+00 130 141 -4.16666666666667e+00 130 147 8.33333333333333e+00 131 131 6.66666666666667e+01 131 153 4.16666666666667e+00 131 137 -1.25000000000000e+01 131 136 8.33333333333333e+00 131 135 -4.16666666666667e+00 131 160 4.16666666666667e+00 131 166 -8.33333333333333e+00 131 165 -8.33333333333333e+00 131 147 8.33333333333333e+00 131 8 -8.33333333333333e+00 131 6 4.16666666666667e+00 131 159 -8.33333333333333e+00 131 154 4.16666666666667e+00 131 143 -3.75000000000000e+01 131 5 -8.33333333333333e+00 131 142 8.33333333333333e+00 131 148 -1.66666666666667e+01 131 129 -8.33333333333333e+00 131 141 8.33333333333333e+00 131 3 4.16666666666667e+00 132 132 1.25000000000000e+02 132 295 -8.33333333333333e+00 132 137 8.33333333333333e+00 132 136 8.33333333333333e+00 132 135 -3.75000000000000e+01 132 302 -8.33333333333333e+00 132 301 -8.33333333333333e+00 132 149 -1.66666666666667e+01 132 148 8.33333333333333e+00 132 116 8.33333333333333e+00 132 134 -1.66666666666667e+01 132 146 1.66666666666667e+01 132 298 8.33333333333333e+00 132 145 -8.33333333333333e+00 132 5 -4.16666666666667e+00 132 110 4.16666666666667e+00 132 4 8.33333333333333e+00 132 109 -8.33333333333333e+00 132 3 -1.25000000000000e+01 132 144 -2.50000000000000e+01 132 32 -4.16666666666667e+00 132 299 8.33333333333333e+00 132 133 -1.66666666666667e+01 132 31 8.33333333333333e+00 132 115 8.33333333333333e+00 132 296 4.16666666666667e+00 132 30 -1.25000000000000e+01 132 114 -3.75000000000000e+01 133 133 1.25000000000000e+02 133 294 -8.33333333333333e+00 133 137 -4.16666666666667e+00 133 136 -1.25000000000000e+01 133 135 8.33333333333333e+00 133 302 -8.33333333333333e+00 133 149 8.33333333333333e+00 133 300 -8.33333333333333e+00 133 147 8.33333333333333e+00 133 116 -4.16666666666667e+00 133 110 4.16666666666667e+00 133 297 8.33333333333333e+00 133 144 -8.33333333333333e+00 133 5 8.33333333333333e+00 133 134 -1.66666666666667e+01 133 146 1.66666666666667e+01 133 4 -3.75000000000000e+01 133 145 -2.50000000000000e+01 133 3 8.33333333333333e+00 133 108 -8.33333333333333e+00 133 32 8.33333333333333e+00 133 299 -1.66666666666667e+01 133 296 4.16666666666667e+00 133 31 -3.75000000000000e+01 133 115 -1.25000000000000e+01 133 132 -1.66666666666667e+01 133 30 8.33333333333333e+00 133 114 8.33333333333333e+00 134 134 1.25000000000000e+02 134 295 4.16666666666667e+00 134 137 -1.25000000000000e+01 134 136 -4.16666666666667e+00 134 135 8.33333333333333e+00 134 300 -8.33333333333333e+00 134 301 -8.33333333333333e+00 134 148 8.33333333333333e+00 134 147 -1.66666666666667e+01 134 115 -4.16666666666667e+00 134 109 4.16666666666667e+00 134 114 8.33333333333333e+00 134 132 -1.66666666666667e+01 134 144 1.66666666666667e+01 134 5 -1.25000000000000e+01 134 146 -7.50000000000000e+01 134 4 8.33333333333333e+00 134 133 -1.66666666666667e+01 134 145 1.66666666666667e+01 134 3 -4.16666666666667e+00 134 108 4.16666666666667e+00 134 294 4.16666666666667e+00 134 32 -1.25000000000000e+01 134 116 -1.25000000000000e+01 134 31 8.33333333333333e+00 134 298 -1.66666666666667e+01 134 30 -4.16666666666667e+00 134 297 8.33333333333333e+00 135 135 1.25000000000000e+02 135 301 8.33333333333333e+00 135 302 8.33333333333333e+00 135 295 8.33333333333333e+00 135 294 -1.25000000000000e+01 135 137 -1.66666666666667e+01 135 134 8.33333333333333e+00 135 133 8.33333333333333e+00 135 132 -3.75000000000000e+01 135 148 -8.33333333333333e+00 135 136 -1.66666666666667e+01 135 155 8.33333333333333e+00 135 307 -8.33333333333333e+00 135 166 8.33333333333333e+00 135 149 1.66666666666667e+01 135 167 -1.66666666666667e+01 135 35 4.16666666666667e+00 135 308 -8.33333333333333e+00 135 154 8.33333333333333e+00 135 34 -8.33333333333333e+00 135 153 -3.75000000000000e+01 135 131 -4.16666666666667e+00 135 5 4.16666666666667e+00 135 130 8.33333333333333e+00 135 4 -8.33333333333333e+00 135 129 -1.25000000000000e+01 135 296 -4.16666666666667e+00 135 147 -2.50000000000000e+01 136 136 1.25000000000000e+02 136 300 8.33333333333333e+00 136 302 -1.66666666666667e+01 136 35 4.16666666666667e+00 136 295 -3.75000000000000e+01 136 294 8.33333333333333e+00 136 134 -4.16666666666667e+00 136 5 4.16666666666667e+00 136 133 -1.25000000000000e+01 136 132 8.33333333333333e+00 136 147 -8.33333333333333e+00 136 155 -4.16666666666667e+00 136 135 -1.66666666666667e+01 136 306 -8.33333333333333e+00 136 165 8.33333333333333e+00 136 308 -8.33333333333333e+00 136 167 8.33333333333333e+00 136 154 -1.25000000000000e+01 136 153 8.33333333333333e+00 136 33 -8.33333333333333e+00 136 131 8.33333333333333e+00 136 137 -1.66666666666667e+01 136 149 1.66666666666667e+01 136 130 -3.75000000000000e+01 136 296 8.33333333333333e+00 136 148 -2.50000000000000e+01 136 129 8.33333333333333e+00 136 3 -8.33333333333333e+00 137 137 1.25000000000000e+02 137 295 8.33333333333333e+00 137 301 -1.66666666666667e+01 137 300 8.33333333333333e+00 137 296 -1.25000000000000e+01 137 34 4.16666666666667e+00 137 134 -1.25000000000000e+01 137 133 -4.16666666666667e+00 137 4 4.16666666666667e+00 137 135 -1.66666666666667e+01 137 132 8.33333333333333e+00 137 154 -4.16666666666667e+00 137 153 8.33333333333333e+00 137 307 -8.33333333333333e+00 137 166 8.33333333333333e+00 137 147 1.66666666666667e+01 137 165 -1.66666666666667e+01 137 155 -1.25000000000000e+01 137 33 4.16666666666667e+00 137 306 -8.33333333333333e+00 137 131 -1.25000000000000e+01 137 294 -4.16666666666667e+00 137 149 -7.50000000000000e+01 137 130 8.33333333333333e+00 137 136 -1.66666666666667e+01 137 148 1.66666666666667e+01 137 129 -4.16666666666667e+00 137 3 4.16666666666667e+00 138 138 1.25000000000000e+02 138 377 -8.33333333333333e+00 138 370 4.16666666666667e+00 138 376 -8.33333333333333e+00 138 371 -8.33333333333333e+00 138 143 8.33333333333333e+00 138 142 8.33333333333333e+00 138 148 -1.66666666666667e+01 138 141 -3.75000000000000e+01 138 374 8.33333333333333e+00 138 146 -8.33333333333333e+00 138 139 -1.66666666666667e+01 138 145 1.66666666666667e+01 138 121 8.33333333333333e+00 138 5 8.33333333333333e+00 138 110 -8.33333333333333e+00 138 4 -4.16666666666667e+00 138 109 4.16666666666667e+00 138 3 -1.25000000000000e+01 138 144 -2.50000000000000e+01 138 140 -1.66666666666667e+01 138 59 8.33333333333333e+00 138 122 8.33333333333333e+00 138 58 -4.16666666666667e+00 138 373 8.33333333333333e+00 138 149 8.33333333333333e+00 138 57 -1.25000000000000e+01 138 120 -3.75000000000000e+01 139 139 1.25000000000000e+02 139 375 -8.33333333333333e+00 139 371 4.16666666666667e+00 139 377 -8.33333333333333e+00 139 143 -4.16666666666667e+00 139 149 8.33333333333333e+00 139 142 -1.25000000000000e+01 139 141 8.33333333333333e+00 139 147 -1.66666666666667e+01 139 110 4.16666666666667e+00 139 122 -4.16666666666667e+00 139 138 -1.66666666666667e+01 139 144 1.66666666666667e+01 139 120 8.33333333333333e+00 139 5 8.33333333333333e+00 139 140 -1.66666666666667e+01 139 146 1.66666666666667e+01 139 4 -1.25000000000000e+01 139 145 -7.50000000000000e+01 139 3 -4.16666666666667e+00 139 108 4.16666666666667e+00 139 59 8.33333333333333e+00 139 374 -1.66666666666667e+01 139 369 4.16666666666667e+00 139 58 -1.25000000000000e+01 139 121 -1.25000000000000e+01 139 57 -4.16666666666667e+00 139 372 8.33333333333333e+00 140 140 1.25000000000000e+02 140 375 -8.33333333333333e+00 140 370 4.16666666666667e+00 140 376 -8.33333333333333e+00 140 369 -8.33333333333333e+00 140 143 -1.25000000000000e+01 140 142 -4.16666666666667e+00 140 148 8.33333333333333e+00 140 141 8.33333333333333e+00 140 372 8.33333333333333e+00 140 144 -8.33333333333333e+00 140 109 4.16666666666667e+00 140 121 -4.16666666666667e+00 140 5 -3.75000000000000e+01 140 146 -2.50000000000000e+01 140 4 8.33333333333333e+00 140 139 -1.66666666666667e+01 140 145 1.66666666666667e+01 140 3 8.33333333333333e+00 140 108 -8.33333333333333e+00 140 147 8.33333333333333e+00 140 59 -3.75000000000000e+01 140 122 -1.25000000000000e+01 140 58 8.33333333333333e+00 140 373 -1.66666666666667e+01 140 138 -1.66666666666667e+01 140 57 8.33333333333333e+00 140 120 8.33333333333333e+00 141 141 1.25000000000000e+02 141 167 8.33333333333333e+00 141 166 -1.66666666666667e+01 141 161 8.33333333333333e+00 141 61 4.16666666666667e+00 141 159 -3.75000000000000e+01 141 131 8.33333333333333e+00 141 130 -4.16666666666667e+00 141 4 4.16666666666667e+00 141 129 -1.25000000000000e+01 141 149 -8.33333333333333e+00 141 143 -1.66666666666667e+01 141 370 -4.16666666666667e+00 141 383 -8.33333333333333e+00 141 377 8.33333333333333e+00 141 382 -8.33333333333333e+00 141 376 8.33333333333333e+00 141 371 8.33333333333333e+00 141 62 -8.33333333333333e+00 141 369 -1.25000000000000e+01 141 140 8.33333333333333e+00 141 5 -8.33333333333333e+00 141 139 8.33333333333333e+00 141 142 -1.66666666666667e+01 141 148 1.66666666666667e+01 141 138 -3.75000000000000e+01 141 160 8.33333333333333e+00 141 147 -2.50000000000000e+01 142 142 1.25000000000000e+02 142 167 8.33333333333333e+00 142 159 8.33333333333333e+00 142 165 -1.66666666666667e+01 142 160 -1.25000000000000e+01 142 60 4.16666666666667e+00 142 131 8.33333333333333e+00 142 143 -1.66666666666667e+01 142 130 -1.25000000000000e+01 142 129 -4.16666666666667e+00 142 3 4.16666666666667e+00 142 369 -4.16666666666667e+00 142 371 8.33333333333333e+00 142 149 1.66666666666667e+01 142 377 -1.66666666666667e+01 142 381 -8.33333333333333e+00 142 375 8.33333333333333e+00 142 62 4.16666666666667e+00 142 383 -8.33333333333333e+00 142 370 -1.25000000000000e+01 142 140 -4.16666666666667e+00 142 5 4.16666666666667e+00 142 139 -1.25000000000000e+01 142 161 -4.16666666666667e+00 142 148 -7.50000000000000e+01 142 138 8.33333333333333e+00 142 141 -1.66666666666667e+01 142 147 1.66666666666667e+01 143 143 1.25000000000000e+02 143 166 8.33333333333333e+00 143 165 8.33333333333333e+00 143 161 -1.25000000000000e+01 143 159 8.33333333333333e+00 143 131 -3.75000000000000e+01 143 130 8.33333333333333e+00 143 142 -1.66666666666667e+01 143 129 8.33333333333333e+00 143 147 -8.33333333333333e+00 143 141 -1.66666666666667e+01 143 370 8.33333333333333e+00 143 381 -8.33333333333333e+00 143 375 8.33333333333333e+00 143 148 1.66666666666667e+01 143 376 -1.66666666666667e+01 143 371 -3.75000000000000e+01 143 61 4.16666666666667e+00 143 382 -8.33333333333333e+00 143 369 8.33333333333333e+00 143 60 -8.33333333333333e+00 143 140 -1.25000000000000e+01 143 160 -4.16666666666667e+00 143 149 -2.50000000000000e+01 143 139 -4.16666666666667e+00 143 4 4.16666666666667e+00 143 138 8.33333333333333e+00 143 3 -8.33333333333333e+00 144 144 2.50000000000000e+02 144 301 -1.66666666666667e+01 144 149 1.66666666666667e+01 144 377 -1.66666666666667e+01 144 439 -8.33333333333333e+00 144 376 8.33333333333333e+00 144 440 -8.33333333333333e+00 144 148 1.66666666666667e+01 144 147 -7.50000000000000e+01 144 134 1.66666666666667e+01 144 115 8.33333333333333e+00 144 133 -8.33333333333333e+00 144 116 -1.66666666666667e+01 144 5 8.33333333333333e+00 144 132 -2.50000000000000e+01 144 299 -8.33333333333333e+00 144 86 8.33333333333333e+00 144 145 -3.33333333333333e+01 144 298 1.66666666666667e+01 144 297 -2.50000000000000e+01 144 140 -8.33333333333333e+00 144 139 1.66666666666667e+01 144 110 -8.33333333333333e+00 144 122 8.33333333333333e+00 144 127 1.66666666666667e+01 144 121 -1.66666666666667e+01 144 4 8.33333333333333e+00 144 109 -8.33333333333333e+00 144 138 -2.50000000000000e+01 144 146 -3.33333333333333e+01 144 374 1.66666666666667e+01 144 128 1.66666666666667e+01 144 373 -8.33333333333333e+00 144 85 8.33333333333333e+00 144 302 8.33333333333333e+00 144 372 -2.50000000000000e+01 144 126 -7.50000000000000e+01 145 145 2.50000000000000e+02 145 300 -1.66666666666667e+01 145 149 -8.33333333333333e+00 145 440 -8.33333333333333e+00 145 377 8.33333333333333e+00 145 438 -8.33333333333333e+00 145 375 8.33333333333333e+00 145 148 -2.50000000000000e+01 145 147 1.66666666666667e+01 145 114 8.33333333333333e+00 145 132 -8.33333333333333e+00 145 116 8.33333333333333e+00 145 134 1.66666666666667e+01 145 133 -2.50000000000000e+01 145 299 1.66666666666667e+01 145 298 -7.50000000000000e+01 145 144 -3.33333333333333e+01 145 297 1.66666666666667e+01 145 128 -8.33333333333333e+00 145 146 -3.33333333333333e+01 145 110 -8.33333333333333e+00 145 122 8.33333333333333e+00 145 138 1.66666666666667e+01 145 126 1.66666666666667e+01 145 120 -1.66666666666667e+01 145 5 -1.66666666666667e+01 145 140 1.66666666666667e+01 145 139 -7.50000000000000e+01 145 3 8.33333333333333e+00 145 108 -8.33333333333333e+00 145 374 1.66666666666667e+01 145 86 -1.66666666666667e+01 145 302 8.33333333333333e+00 145 373 -2.50000000000000e+01 145 127 -2.50000000000000e+01 145 372 -8.33333333333333e+00 145 84 8.33333333333333e+00 146 146 2.50000000000000e+02 146 301 8.33333333333333e+00 146 148 -8.33333333333333e+00 146 439 -8.33333333333333e+00 146 376 8.33333333333333e+00 146 147 1.66666666666667e+01 146 375 -1.66666666666667e+01 146 438 -8.33333333333333e+00 146 149 -2.50000000000000e+01 146 132 1.66666666666667e+01 146 115 8.33333333333333e+00 146 114 -1.66666666666667e+01 146 134 -7.50000000000000e+01 146 133 1.66666666666667e+01 146 3 8.33333333333333e+00 146 299 -2.50000000000000e+01 146 298 1.66666666666667e+01 146 297 -8.33333333333333e+00 146 84 8.33333333333333e+00 146 127 -8.33333333333333e+00 146 145 -3.33333333333333e+01 146 138 -8.33333333333333e+00 146 109 -8.33333333333333e+00 146 121 8.33333333333333e+00 146 108 -8.33333333333333e+00 146 120 8.33333333333333e+00 146 140 -2.50000000000000e+01 146 4 -1.66666666666667e+01 146 139 1.66666666666667e+01 146 300 8.33333333333333e+00 146 374 -7.50000000000000e+01 146 128 -2.50000000000000e+01 146 373 1.66666666666667e+01 146 85 -1.66666666666667e+01 146 144 -3.33333333333333e+01 146 372 1.66666666666667e+01 146 126 1.66666666666667e+01 147 147 2.50000000000000e+02 147 301 1.66666666666667e+01 147 300 -2.50000000000000e+01 147 134 -1.66666666666667e+01 147 133 8.33333333333333e+00 147 146 1.66666666666667e+01 147 439 8.33333333333333e+00 147 145 1.66666666666667e+01 147 144 -7.50000000000000e+01 147 440 8.33333333333333e+00 147 136 -8.33333333333333e+00 147 137 1.66666666666667e+01 147 149 -3.33333333333333e+01 147 5 -8.33333333333333e+00 147 135 -2.50000000000000e+01 147 308 8.33333333333333e+00 147 89 -8.33333333333333e+00 147 307 -1.66666666666667e+01 147 131 8.33333333333333e+00 147 166 1.66666666666667e+01 147 148 -3.33333333333333e+01 147 167 1.66666666666667e+01 147 88 -8.33333333333333e+00 147 165 -7.50000000000000e+01 147 130 8.33333333333333e+00 147 4 -8.33333333333333e+00 147 143 -8.33333333333333e+00 147 140 8.33333333333333e+00 147 382 8.33333333333333e+00 147 376 -8.33333333333333e+00 147 139 -1.66666666666667e+01 147 142 1.66666666666667e+01 147 141 -2.50000000000000e+01 147 377 1.66666666666667e+01 147 383 -1.66666666666667e+01 147 375 -2.50000000000000e+01 147 302 -8.33333333333333e+00 148 148 2.50000000000000e+02 148 300 1.66666666666667e+01 148 302 1.66666666666667e+01 148 301 -7.50000000000000e+01 148 132 8.33333333333333e+00 148 146 -8.33333333333333e+00 148 438 8.33333333333333e+00 148 145 -2.50000000000000e+01 148 144 1.66666666666667e+01 148 440 -1.66666666666667e+01 148 135 -8.33333333333333e+00 148 308 8.33333333333333e+00 148 137 1.66666666666667e+01 148 136 -2.50000000000000e+01 148 306 -1.66666666666667e+01 148 167 -8.33333333333333e+00 148 165 1.66666666666667e+01 148 147 -3.33333333333333e+01 148 166 -2.50000000000000e+01 148 87 -8.33333333333333e+00 148 131 -1.66666666666667e+01 148 129 8.33333333333333e+00 148 3 -8.33333333333333e+00 148 143 1.66666666666667e+01 148 149 -3.33333333333333e+01 148 377 1.66666666666667e+01 148 381 8.33333333333333e+00 148 375 -8.33333333333333e+00 148 140 8.33333333333333e+00 148 5 -8.33333333333333e+00 148 142 -7.50000000000000e+01 148 138 -1.66666666666667e+01 148 141 1.66666666666667e+01 148 383 8.33333333333333e+00 148 89 -8.33333333333333e+00 148 376 -2.50000000000000e+01 148 134 8.33333333333333e+00 149 149 2.50000000000000e+02 149 133 8.33333333333333e+00 149 302 -2.50000000000000e+01 149 301 1.66666666666667e+01 149 132 -1.66666666666667e+01 149 145 -8.33333333333333e+00 149 144 1.66666666666667e+01 149 146 -2.50000000000000e+01 149 439 -1.66666666666667e+01 149 438 8.33333333333333e+00 149 307 8.33333333333333e+00 149 135 1.66666666666667e+01 149 147 -3.33333333333333e+01 149 137 -7.50000000000000e+01 149 136 1.66666666666667e+01 149 3 -8.33333333333333e+00 149 306 8.33333333333333e+00 149 87 -8.33333333333333e+00 149 166 -8.33333333333333e+00 149 129 8.33333333333333e+00 149 167 -2.50000000000000e+01 149 165 1.66666666666667e+01 149 130 -1.66666666666667e+01 149 141 -8.33333333333333e+00 149 138 8.33333333333333e+00 149 142 1.66666666666667e+01 149 148 -3.33333333333333e+01 149 376 1.66666666666667e+01 149 143 -2.50000000000000e+01 149 139 8.33333333333333e+00 149 4 -8.33333333333333e+00 149 377 -7.50000000000000e+01 149 300 -8.33333333333333e+00 149 382 8.33333333333333e+00 149 88 -8.33333333333333e+00 149 375 1.66666666666667e+01 149 381 -1.66666666666667e+01 150 150 7.50000000000000e+01 150 10 4.16666666666667e+00 150 175 -8.33333333333333e+00 150 158 -4.16666666666667e+00 150 151 -8.33333333333333e+00 150 157 8.33333333333333e+00 150 7 4.16666666666667e+00 150 156 -1.25000000000000e+01 150 188 -8.33333333333333e+00 150 170 8.33333333333333e+00 150 11 4.16666666666667e+00 150 182 -8.33333333333333e+00 150 181 4.16666666666667e+00 150 187 -8.33333333333333e+00 150 9 -2.50000000000000e+01 150 152 -8.33333333333333e+00 150 164 8.33333333333333e+00 150 8 4.16666666666667e+00 150 163 -4.16666666666667e+00 150 169 8.33333333333333e+00 150 176 4.16666666666667e+00 150 162 -1.25000000000000e+01 150 6 -2.50000000000000e+01 151 151 6.66666666666667e+01 151 9 4.16666666666667e+00 151 174 -8.33333333333333e+00 151 158 8.33333333333333e+00 151 157 -3.75000000000000e+01 151 150 -8.33333333333333e+00 151 156 8.33333333333333e+00 151 6 4.16666666666667e+00 151 182 4.16666666666667e+00 151 188 -8.33333333333333e+00 151 10 -8.33333333333333e+00 151 180 4.16666666666667e+00 151 186 -8.33333333333333e+00 151 164 8.33333333333333e+00 151 170 -1.66666666666667e+01 151 176 4.16666666666667e+00 151 163 -1.25000000000000e+01 151 7 -8.33333333333333e+00 151 162 -4.16666666666667e+00 151 168 8.33333333333333e+00 152 152 6.66666666666667e+01 152 174 4.16666666666667e+00 152 158 -1.25000000000000e+01 152 157 8.33333333333333e+00 152 156 -4.16666666666667e+00 152 181 4.16666666666667e+00 152 187 -8.33333333333333e+00 152 186 -8.33333333333333e+00 152 168 8.33333333333333e+00 152 11 -8.33333333333333e+00 152 9 4.16666666666667e+00 152 180 -8.33333333333333e+00 152 175 4.16666666666667e+00 152 164 -3.75000000000000e+01 152 8 -8.33333333333333e+00 152 163 8.33333333333333e+00 152 169 -1.66666666666667e+01 152 150 -8.33333333333333e+00 152 162 8.33333333333333e+00 152 6 4.16666666666667e+00 153 153 1.25000000000000e+02 153 304 -8.33333333333333e+00 153 158 8.33333333333333e+00 153 157 8.33333333333333e+00 153 156 -3.75000000000000e+01 153 311 -8.33333333333333e+00 153 310 -8.33333333333333e+00 153 170 -1.66666666666667e+01 153 169 8.33333333333333e+00 153 137 8.33333333333333e+00 153 155 -1.66666666666667e+01 153 167 1.66666666666667e+01 153 307 8.33333333333333e+00 153 166 -8.33333333333333e+00 153 8 -4.16666666666667e+00 153 131 4.16666666666667e+00 153 7 8.33333333333333e+00 153 130 -8.33333333333333e+00 153 6 -1.25000000000000e+01 153 165 -2.50000000000000e+01 153 35 -4.16666666666667e+00 153 308 8.33333333333333e+00 153 154 -1.66666666666667e+01 153 34 8.33333333333333e+00 153 136 8.33333333333333e+00 153 305 4.16666666666667e+00 153 33 -1.25000000000000e+01 153 135 -3.75000000000000e+01 154 154 1.25000000000000e+02 154 303 -8.33333333333333e+00 154 158 -4.16666666666667e+00 154 157 -1.25000000000000e+01 154 156 8.33333333333333e+00 154 311 -8.33333333333333e+00 154 170 8.33333333333333e+00 154 309 -8.33333333333333e+00 154 168 8.33333333333333e+00 154 137 -4.16666666666667e+00 154 131 4.16666666666667e+00 154 306 8.33333333333333e+00 154 165 -8.33333333333333e+00 154 8 8.33333333333333e+00 154 155 -1.66666666666667e+01 154 167 1.66666666666667e+01 154 7 -3.75000000000000e+01 154 166 -2.50000000000000e+01 154 6 8.33333333333333e+00 154 129 -8.33333333333333e+00 154 35 8.33333333333333e+00 154 308 -1.66666666666667e+01 154 305 4.16666666666667e+00 154 34 -3.75000000000000e+01 154 136 -1.25000000000000e+01 154 153 -1.66666666666667e+01 154 33 8.33333333333333e+00 154 135 8.33333333333333e+00 155 155 1.25000000000000e+02 155 304 4.16666666666667e+00 155 158 -1.25000000000000e+01 155 157 -4.16666666666667e+00 155 156 8.33333333333333e+00 155 309 -8.33333333333333e+00 155 310 -8.33333333333333e+00 155 169 8.33333333333333e+00 155 168 -1.66666666666667e+01 155 136 -4.16666666666667e+00 155 130 4.16666666666667e+00 155 135 8.33333333333333e+00 155 153 -1.66666666666667e+01 155 165 1.66666666666667e+01 155 8 -1.25000000000000e+01 155 167 -7.50000000000000e+01 155 7 8.33333333333333e+00 155 154 -1.66666666666667e+01 155 166 1.66666666666667e+01 155 6 -4.16666666666667e+00 155 129 4.16666666666667e+00 155 303 4.16666666666667e+00 155 35 -1.25000000000000e+01 155 137 -1.25000000000000e+01 155 34 8.33333333333333e+00 155 307 -1.66666666666667e+01 155 33 -4.16666666666667e+00 155 306 8.33333333333333e+00 156 156 1.25000000000000e+02 156 310 8.33333333333333e+00 156 311 8.33333333333333e+00 156 304 8.33333333333333e+00 156 303 -1.25000000000000e+01 156 158 -1.66666666666667e+01 156 155 8.33333333333333e+00 156 154 8.33333333333333e+00 156 153 -3.75000000000000e+01 156 169 -8.33333333333333e+00 156 157 -1.66666666666667e+01 156 176 8.33333333333333e+00 156 316 -8.33333333333333e+00 156 187 8.33333333333333e+00 156 170 1.66666666666667e+01 156 188 -1.66666666666667e+01 156 38 4.16666666666667e+00 156 317 -8.33333333333333e+00 156 175 8.33333333333333e+00 156 37 -8.33333333333333e+00 156 174 -3.75000000000000e+01 156 152 -4.16666666666667e+00 156 8 4.16666666666667e+00 156 151 8.33333333333333e+00 156 7 -8.33333333333333e+00 156 150 -1.25000000000000e+01 156 305 -4.16666666666667e+00 156 168 -2.50000000000000e+01 157 157 1.25000000000000e+02 157 309 8.33333333333333e+00 157 311 -1.66666666666667e+01 157 38 4.16666666666667e+00 157 304 -3.75000000000000e+01 157 303 8.33333333333333e+00 157 155 -4.16666666666667e+00 157 8 4.16666666666667e+00 157 154 -1.25000000000000e+01 157 153 8.33333333333333e+00 157 168 -8.33333333333333e+00 157 176 -4.16666666666667e+00 157 156 -1.66666666666667e+01 157 315 -8.33333333333333e+00 157 186 8.33333333333333e+00 157 317 -8.33333333333333e+00 157 188 8.33333333333333e+00 157 175 -1.25000000000000e+01 157 174 8.33333333333333e+00 157 36 -8.33333333333333e+00 157 152 8.33333333333333e+00 157 158 -1.66666666666667e+01 157 170 1.66666666666667e+01 157 151 -3.75000000000000e+01 157 305 8.33333333333333e+00 157 169 -2.50000000000000e+01 157 150 8.33333333333333e+00 157 6 -8.33333333333333e+00 158 158 1.25000000000000e+02 158 304 8.33333333333333e+00 158 310 -1.66666666666667e+01 158 309 8.33333333333333e+00 158 305 -1.25000000000000e+01 158 37 4.16666666666667e+00 158 155 -1.25000000000000e+01 158 154 -4.16666666666667e+00 158 7 4.16666666666667e+00 158 156 -1.66666666666667e+01 158 153 8.33333333333333e+00 158 175 -4.16666666666667e+00 158 174 8.33333333333333e+00 158 316 -8.33333333333333e+00 158 187 8.33333333333333e+00 158 168 1.66666666666667e+01 158 186 -1.66666666666667e+01 158 176 -1.25000000000000e+01 158 36 4.16666666666667e+00 158 315 -8.33333333333333e+00 158 152 -1.25000000000000e+01 158 303 -4.16666666666667e+00 158 170 -7.50000000000000e+01 158 151 8.33333333333333e+00 158 157 -1.66666666666667e+01 158 169 1.66666666666667e+01 158 150 -4.16666666666667e+00 158 6 4.16666666666667e+00 159 159 1.25000000000000e+02 159 386 -8.33333333333333e+00 159 379 4.16666666666667e+00 159 385 -8.33333333333333e+00 159 380 -8.33333333333333e+00 159 164 8.33333333333333e+00 159 163 8.33333333333333e+00 159 169 -1.66666666666667e+01 159 162 -3.75000000000000e+01 159 383 8.33333333333333e+00 159 167 -8.33333333333333e+00 159 160 -1.66666666666667e+01 159 166 1.66666666666667e+01 159 142 8.33333333333333e+00 159 8 8.33333333333333e+00 159 131 -8.33333333333333e+00 159 7 -4.16666666666667e+00 159 130 4.16666666666667e+00 159 6 -1.25000000000000e+01 159 165 -2.50000000000000e+01 159 161 -1.66666666666667e+01 159 62 8.33333333333333e+00 159 143 8.33333333333333e+00 159 61 -4.16666666666667e+00 159 382 8.33333333333333e+00 159 170 8.33333333333333e+00 159 60 -1.25000000000000e+01 159 141 -3.75000000000000e+01 160 160 1.25000000000000e+02 160 384 -8.33333333333333e+00 160 380 4.16666666666667e+00 160 386 -8.33333333333333e+00 160 164 -4.16666666666667e+00 160 170 8.33333333333333e+00 160 163 -1.25000000000000e+01 160 162 8.33333333333333e+00 160 168 -1.66666666666667e+01 160 131 4.16666666666667e+00 160 143 -4.16666666666667e+00 160 159 -1.66666666666667e+01 160 165 1.66666666666667e+01 160 141 8.33333333333333e+00 160 8 8.33333333333333e+00 160 161 -1.66666666666667e+01 160 167 1.66666666666667e+01 160 7 -1.25000000000000e+01 160 166 -7.50000000000000e+01 160 6 -4.16666666666667e+00 160 129 4.16666666666667e+00 160 62 8.33333333333333e+00 160 383 -1.66666666666667e+01 160 378 4.16666666666667e+00 160 61 -1.25000000000000e+01 160 142 -1.25000000000000e+01 160 60 -4.16666666666667e+00 160 381 8.33333333333333e+00 161 161 1.25000000000000e+02 161 384 -8.33333333333333e+00 161 379 4.16666666666667e+00 161 385 -8.33333333333333e+00 161 378 -8.33333333333333e+00 161 164 -1.25000000000000e+01 161 163 -4.16666666666667e+00 161 169 8.33333333333333e+00 161 162 8.33333333333333e+00 161 381 8.33333333333333e+00 161 165 -8.33333333333333e+00 161 130 4.16666666666667e+00 161 142 -4.16666666666667e+00 161 8 -3.75000000000000e+01 161 167 -2.50000000000000e+01 161 7 8.33333333333333e+00 161 160 -1.66666666666667e+01 161 166 1.66666666666667e+01 161 6 8.33333333333333e+00 161 129 -8.33333333333333e+00 161 168 8.33333333333333e+00 161 62 -3.75000000000000e+01 161 143 -1.25000000000000e+01 161 61 8.33333333333333e+00 161 382 -1.66666666666667e+01 161 159 -1.66666666666667e+01 161 60 8.33333333333333e+00 161 141 8.33333333333333e+00 162 162 1.25000000000000e+02 162 188 8.33333333333333e+00 162 187 -1.66666666666667e+01 162 182 8.33333333333333e+00 162 64 4.16666666666667e+00 162 180 -3.75000000000000e+01 162 152 8.33333333333333e+00 162 151 -4.16666666666667e+00 162 7 4.16666666666667e+00 162 150 -1.25000000000000e+01 162 170 -8.33333333333333e+00 162 164 -1.66666666666667e+01 162 379 -4.16666666666667e+00 162 392 -8.33333333333333e+00 162 386 8.33333333333333e+00 162 391 -8.33333333333333e+00 162 385 8.33333333333333e+00 162 380 8.33333333333333e+00 162 65 -8.33333333333333e+00 162 378 -1.25000000000000e+01 162 161 8.33333333333333e+00 162 8 -8.33333333333333e+00 162 160 8.33333333333333e+00 162 163 -1.66666666666667e+01 162 169 1.66666666666667e+01 162 159 -3.75000000000000e+01 162 181 8.33333333333333e+00 162 168 -2.50000000000000e+01 163 163 1.25000000000000e+02 163 188 8.33333333333333e+00 163 180 8.33333333333333e+00 163 186 -1.66666666666667e+01 163 181 -1.25000000000000e+01 163 63 4.16666666666667e+00 163 152 8.33333333333333e+00 163 164 -1.66666666666667e+01 163 151 -1.25000000000000e+01 163 150 -4.16666666666667e+00 163 6 4.16666666666667e+00 163 378 -4.16666666666667e+00 163 380 8.33333333333333e+00 163 170 1.66666666666667e+01 163 386 -1.66666666666667e+01 163 390 -8.33333333333333e+00 163 384 8.33333333333333e+00 163 65 4.16666666666667e+00 163 392 -8.33333333333333e+00 163 379 -1.25000000000000e+01 163 161 -4.16666666666667e+00 163 8 4.16666666666667e+00 163 160 -1.25000000000000e+01 163 182 -4.16666666666667e+00 163 169 -7.50000000000000e+01 163 159 8.33333333333333e+00 163 162 -1.66666666666667e+01 163 168 1.66666666666667e+01 164 164 1.25000000000000e+02 164 187 8.33333333333333e+00 164 186 8.33333333333333e+00 164 182 -1.25000000000000e+01 164 180 8.33333333333333e+00 164 152 -3.75000000000000e+01 164 151 8.33333333333333e+00 164 163 -1.66666666666667e+01 164 150 8.33333333333333e+00 164 168 -8.33333333333333e+00 164 162 -1.66666666666667e+01 164 379 8.33333333333333e+00 164 390 -8.33333333333333e+00 164 384 8.33333333333333e+00 164 169 1.66666666666667e+01 164 385 -1.66666666666667e+01 164 380 -3.75000000000000e+01 164 64 4.16666666666667e+00 164 391 -8.33333333333333e+00 164 378 8.33333333333333e+00 164 63 -8.33333333333333e+00 164 161 -1.25000000000000e+01 164 181 -4.16666666666667e+00 164 170 -2.50000000000000e+01 164 160 -4.16666666666667e+00 164 7 4.16666666666667e+00 164 159 8.33333333333333e+00 164 6 -8.33333333333333e+00 165 165 2.50000000000000e+02 165 310 -1.66666666666667e+01 165 170 1.66666666666667e+01 165 386 -1.66666666666667e+01 165 442 -8.33333333333333e+00 165 385 8.33333333333333e+00 165 443 -8.33333333333333e+00 165 169 1.66666666666667e+01 165 168 -7.50000000000000e+01 165 155 1.66666666666667e+01 165 136 8.33333333333333e+00 165 154 -8.33333333333333e+00 165 137 -1.66666666666667e+01 165 8 8.33333333333333e+00 165 153 -2.50000000000000e+01 165 308 -8.33333333333333e+00 165 89 8.33333333333333e+00 165 166 -3.33333333333333e+01 165 307 1.66666666666667e+01 165 306 -2.50000000000000e+01 165 161 -8.33333333333333e+00 165 160 1.66666666666667e+01 165 131 -8.33333333333333e+00 165 143 8.33333333333333e+00 165 148 1.66666666666667e+01 165 142 -1.66666666666667e+01 165 7 8.33333333333333e+00 165 130 -8.33333333333333e+00 165 159 -2.50000000000000e+01 165 167 -3.33333333333333e+01 165 383 1.66666666666667e+01 165 149 1.66666666666667e+01 165 382 -8.33333333333333e+00 165 88 8.33333333333333e+00 165 311 8.33333333333333e+00 165 381 -2.50000000000000e+01 165 147 -7.50000000000000e+01 166 166 2.50000000000000e+02 166 309 -1.66666666666667e+01 166 170 -8.33333333333333e+00 166 443 -8.33333333333333e+00 166 386 8.33333333333333e+00 166 441 -8.33333333333333e+00 166 384 8.33333333333333e+00 166 169 -2.50000000000000e+01 166 168 1.66666666666667e+01 166 135 8.33333333333333e+00 166 153 -8.33333333333333e+00 166 137 8.33333333333333e+00 166 155 1.66666666666667e+01 166 154 -2.50000000000000e+01 166 308 1.66666666666667e+01 166 307 -7.50000000000000e+01 166 165 -3.33333333333333e+01 166 306 1.66666666666667e+01 166 149 -8.33333333333333e+00 166 167 -3.33333333333333e+01 166 131 -8.33333333333333e+00 166 143 8.33333333333333e+00 166 159 1.66666666666667e+01 166 147 1.66666666666667e+01 166 141 -1.66666666666667e+01 166 8 -1.66666666666667e+01 166 161 1.66666666666667e+01 166 160 -7.50000000000000e+01 166 6 8.33333333333333e+00 166 129 -8.33333333333333e+00 166 383 1.66666666666667e+01 166 89 -1.66666666666667e+01 166 311 8.33333333333333e+00 166 382 -2.50000000000000e+01 166 148 -2.50000000000000e+01 166 381 -8.33333333333333e+00 166 87 8.33333333333333e+00 167 167 2.50000000000000e+02 167 310 8.33333333333333e+00 167 169 -8.33333333333333e+00 167 442 -8.33333333333333e+00 167 385 8.33333333333333e+00 167 168 1.66666666666667e+01 167 384 -1.66666666666667e+01 167 441 -8.33333333333333e+00 167 170 -2.50000000000000e+01 167 153 1.66666666666667e+01 167 136 8.33333333333333e+00 167 135 -1.66666666666667e+01 167 155 -7.50000000000000e+01 167 154 1.66666666666667e+01 167 6 8.33333333333333e+00 167 308 -2.50000000000000e+01 167 307 1.66666666666667e+01 167 306 -8.33333333333333e+00 167 87 8.33333333333333e+00 167 148 -8.33333333333333e+00 167 166 -3.33333333333333e+01 167 159 -8.33333333333333e+00 167 130 -8.33333333333333e+00 167 142 8.33333333333333e+00 167 129 -8.33333333333333e+00 167 141 8.33333333333333e+00 167 161 -2.50000000000000e+01 167 7 -1.66666666666667e+01 167 160 1.66666666666667e+01 167 309 8.33333333333333e+00 167 383 -7.50000000000000e+01 167 149 -2.50000000000000e+01 167 382 1.66666666666667e+01 167 88 -1.66666666666667e+01 167 165 -3.33333333333333e+01 167 381 1.66666666666667e+01 167 147 1.66666666666667e+01 168 168 2.50000000000000e+02 168 310 1.66666666666667e+01 168 309 -2.50000000000000e+01 168 155 -1.66666666666667e+01 168 154 8.33333333333333e+00 168 167 1.66666666666667e+01 168 442 8.33333333333333e+00 168 166 1.66666666666667e+01 168 165 -7.50000000000000e+01 168 443 8.33333333333333e+00 168 157 -8.33333333333333e+00 168 158 1.66666666666667e+01 168 170 -3.33333333333333e+01 168 8 -8.33333333333333e+00 168 156 -2.50000000000000e+01 168 317 8.33333333333333e+00 168 92 -8.33333333333333e+00 168 316 -1.66666666666667e+01 168 152 8.33333333333333e+00 168 187 1.66666666666667e+01 168 169 -3.33333333333333e+01 168 188 1.66666666666667e+01 168 91 -8.33333333333333e+00 168 186 -7.50000000000000e+01 168 151 8.33333333333333e+00 168 7 -8.33333333333333e+00 168 164 -8.33333333333333e+00 168 161 8.33333333333333e+00 168 391 8.33333333333333e+00 168 385 -8.33333333333333e+00 168 160 -1.66666666666667e+01 168 163 1.66666666666667e+01 168 162 -2.50000000000000e+01 168 386 1.66666666666667e+01 168 392 -1.66666666666667e+01 168 384 -2.50000000000000e+01 168 311 -8.33333333333333e+00 169 169 2.50000000000000e+02 169 309 1.66666666666667e+01 169 311 1.66666666666667e+01 169 310 -7.50000000000000e+01 169 153 8.33333333333333e+00 169 167 -8.33333333333333e+00 169 441 8.33333333333333e+00 169 166 -2.50000000000000e+01 169 165 1.66666666666667e+01 169 443 -1.66666666666667e+01 169 156 -8.33333333333333e+00 169 317 8.33333333333333e+00 169 158 1.66666666666667e+01 169 157 -2.50000000000000e+01 169 315 -1.66666666666667e+01 169 188 -8.33333333333333e+00 169 186 1.66666666666667e+01 169 168 -3.33333333333333e+01 169 187 -2.50000000000000e+01 169 90 -8.33333333333333e+00 169 152 -1.66666666666667e+01 169 150 8.33333333333333e+00 169 6 -8.33333333333333e+00 169 164 1.66666666666667e+01 169 170 -3.33333333333333e+01 169 386 1.66666666666667e+01 169 390 8.33333333333333e+00 169 384 -8.33333333333333e+00 169 161 8.33333333333333e+00 169 8 -8.33333333333333e+00 169 163 -7.50000000000000e+01 169 159 -1.66666666666667e+01 169 162 1.66666666666667e+01 169 392 8.33333333333333e+00 169 92 -8.33333333333333e+00 169 385 -2.50000000000000e+01 169 155 8.33333333333333e+00 170 170 2.50000000000000e+02 170 154 8.33333333333333e+00 170 311 -2.50000000000000e+01 170 310 1.66666666666667e+01 170 153 -1.66666666666667e+01 170 166 -8.33333333333333e+00 170 165 1.66666666666667e+01 170 167 -2.50000000000000e+01 170 442 -1.66666666666667e+01 170 441 8.33333333333333e+00 170 316 8.33333333333333e+00 170 156 1.66666666666667e+01 170 168 -3.33333333333333e+01 170 158 -7.50000000000000e+01 170 157 1.66666666666667e+01 170 6 -8.33333333333333e+00 170 315 8.33333333333333e+00 170 90 -8.33333333333333e+00 170 187 -8.33333333333333e+00 170 150 8.33333333333333e+00 170 188 -2.50000000000000e+01 170 186 1.66666666666667e+01 170 151 -1.66666666666667e+01 170 162 -8.33333333333333e+00 170 159 8.33333333333333e+00 170 163 1.66666666666667e+01 170 169 -3.33333333333333e+01 170 385 1.66666666666667e+01 170 164 -2.50000000000000e+01 170 160 8.33333333333333e+00 170 7 -8.33333333333333e+00 170 386 -7.50000000000000e+01 170 309 -8.33333333333333e+00 170 391 8.33333333333333e+00 170 91 -8.33333333333333e+00 170 384 1.66666666666667e+01 170 390 -1.66666666666667e+01 171 171 7.50000000000000e+01 171 13 4.16666666666667e+00 171 196 -8.33333333333333e+00 171 179 -4.16666666666667e+00 171 172 -8.33333333333333e+00 171 178 8.33333333333333e+00 171 10 4.16666666666667e+00 171 177 -1.25000000000000e+01 171 209 -8.33333333333333e+00 171 191 8.33333333333333e+00 171 14 4.16666666666667e+00 171 203 -8.33333333333333e+00 171 202 4.16666666666667e+00 171 208 -8.33333333333333e+00 171 12 -2.50000000000000e+01 171 173 -8.33333333333333e+00 171 185 8.33333333333333e+00 171 11 4.16666666666667e+00 171 184 -4.16666666666667e+00 171 190 8.33333333333333e+00 171 197 4.16666666666667e+00 171 183 -1.25000000000000e+01 171 9 -2.50000000000000e+01 172 172 6.66666666666667e+01 172 12 4.16666666666667e+00 172 195 -8.33333333333333e+00 172 179 8.33333333333333e+00 172 178 -3.75000000000000e+01 172 171 -8.33333333333333e+00 172 177 8.33333333333333e+00 172 9 4.16666666666667e+00 172 203 4.16666666666667e+00 172 209 -8.33333333333333e+00 172 13 -8.33333333333333e+00 172 201 4.16666666666667e+00 172 207 -8.33333333333333e+00 172 185 8.33333333333333e+00 172 191 -1.66666666666667e+01 172 197 4.16666666666667e+00 172 184 -1.25000000000000e+01 172 10 -8.33333333333333e+00 172 183 -4.16666666666667e+00 172 189 8.33333333333333e+00 173 173 6.66666666666667e+01 173 195 4.16666666666667e+00 173 179 -1.25000000000000e+01 173 178 8.33333333333333e+00 173 177 -4.16666666666667e+00 173 202 4.16666666666667e+00 173 208 -8.33333333333333e+00 173 207 -8.33333333333333e+00 173 189 8.33333333333333e+00 173 14 -8.33333333333333e+00 173 12 4.16666666666667e+00 173 201 -8.33333333333333e+00 173 196 4.16666666666667e+00 173 185 -3.75000000000000e+01 173 11 -8.33333333333333e+00 173 184 8.33333333333333e+00 173 190 -1.66666666666667e+01 173 171 -8.33333333333333e+00 173 183 8.33333333333333e+00 173 9 4.16666666666667e+00 174 174 1.25000000000000e+02 174 313 -8.33333333333333e+00 174 179 8.33333333333333e+00 174 178 8.33333333333333e+00 174 177 -3.75000000000000e+01 174 320 -8.33333333333333e+00 174 319 -8.33333333333333e+00 174 191 -1.66666666666667e+01 174 190 8.33333333333333e+00 174 158 8.33333333333333e+00 174 176 -1.66666666666667e+01 174 188 1.66666666666667e+01 174 316 8.33333333333333e+00 174 187 -8.33333333333333e+00 174 11 -4.16666666666667e+00 174 152 4.16666666666667e+00 174 10 8.33333333333333e+00 174 151 -8.33333333333333e+00 174 9 -1.25000000000000e+01 174 186 -2.50000000000000e+01 174 38 -4.16666666666667e+00 174 317 8.33333333333333e+00 174 175 -1.66666666666667e+01 174 37 8.33333333333333e+00 174 157 8.33333333333333e+00 174 314 4.16666666666667e+00 174 36 -1.25000000000000e+01 174 156 -3.75000000000000e+01 175 175 1.25000000000000e+02 175 312 -8.33333333333333e+00 175 179 -4.16666666666667e+00 175 178 -1.25000000000000e+01 175 177 8.33333333333333e+00 175 320 -8.33333333333333e+00 175 191 8.33333333333333e+00 175 318 -8.33333333333333e+00 175 189 8.33333333333333e+00 175 158 -4.16666666666667e+00 175 152 4.16666666666667e+00 175 315 8.33333333333333e+00 175 186 -8.33333333333333e+00 175 11 8.33333333333333e+00 175 176 -1.66666666666667e+01 175 188 1.66666666666667e+01 175 10 -3.75000000000000e+01 175 187 -2.50000000000000e+01 175 9 8.33333333333333e+00 175 150 -8.33333333333333e+00 175 38 8.33333333333333e+00 175 317 -1.66666666666667e+01 175 314 4.16666666666667e+00 175 37 -3.75000000000000e+01 175 157 -1.25000000000000e+01 175 174 -1.66666666666667e+01 175 36 8.33333333333333e+00 175 156 8.33333333333333e+00 176 176 1.25000000000000e+02 176 313 4.16666666666667e+00 176 179 -1.25000000000000e+01 176 178 -4.16666666666667e+00 176 177 8.33333333333333e+00 176 318 -8.33333333333333e+00 176 319 -8.33333333333333e+00 176 190 8.33333333333333e+00 176 189 -1.66666666666667e+01 176 157 -4.16666666666667e+00 176 151 4.16666666666667e+00 176 156 8.33333333333333e+00 176 174 -1.66666666666667e+01 176 186 1.66666666666667e+01 176 11 -1.25000000000000e+01 176 188 -7.50000000000000e+01 176 10 8.33333333333333e+00 176 175 -1.66666666666667e+01 176 187 1.66666666666667e+01 176 9 -4.16666666666667e+00 176 150 4.16666666666667e+00 176 312 4.16666666666667e+00 176 38 -1.25000000000000e+01 176 158 -1.25000000000000e+01 176 37 8.33333333333333e+00 176 316 -1.66666666666667e+01 176 36 -4.16666666666667e+00 176 315 8.33333333333333e+00 177 177 1.25000000000000e+02 177 319 8.33333333333333e+00 177 320 8.33333333333333e+00 177 313 8.33333333333333e+00 177 312 -1.25000000000000e+01 177 179 -1.66666666666667e+01 177 176 8.33333333333333e+00 177 175 8.33333333333333e+00 177 174 -3.75000000000000e+01 177 190 -8.33333333333333e+00 177 178 -1.66666666666667e+01 177 197 8.33333333333333e+00 177 325 -8.33333333333333e+00 177 208 8.33333333333333e+00 177 191 1.66666666666667e+01 177 209 -1.66666666666667e+01 177 41 4.16666666666667e+00 177 326 -8.33333333333333e+00 177 196 8.33333333333333e+00 177 40 -8.33333333333333e+00 177 195 -3.75000000000000e+01 177 173 -4.16666666666667e+00 177 11 4.16666666666667e+00 177 172 8.33333333333333e+00 177 10 -8.33333333333333e+00 177 171 -1.25000000000000e+01 177 314 -4.16666666666667e+00 177 189 -2.50000000000000e+01 178 178 1.25000000000000e+02 178 318 8.33333333333333e+00 178 320 -1.66666666666667e+01 178 41 4.16666666666667e+00 178 313 -3.75000000000000e+01 178 312 8.33333333333333e+00 178 176 -4.16666666666667e+00 178 11 4.16666666666667e+00 178 175 -1.25000000000000e+01 178 174 8.33333333333333e+00 178 189 -8.33333333333333e+00 178 197 -4.16666666666667e+00 178 177 -1.66666666666667e+01 178 324 -8.33333333333333e+00 178 207 8.33333333333333e+00 178 326 -8.33333333333333e+00 178 209 8.33333333333333e+00 178 196 -1.25000000000000e+01 178 195 8.33333333333333e+00 178 39 -8.33333333333333e+00 178 173 8.33333333333333e+00 178 179 -1.66666666666667e+01 178 191 1.66666666666667e+01 178 172 -3.75000000000000e+01 178 314 8.33333333333333e+00 178 190 -2.50000000000000e+01 178 171 8.33333333333333e+00 178 9 -8.33333333333333e+00 179 179 1.25000000000000e+02 179 313 8.33333333333333e+00 179 319 -1.66666666666667e+01 179 318 8.33333333333333e+00 179 314 -1.25000000000000e+01 179 40 4.16666666666667e+00 179 176 -1.25000000000000e+01 179 175 -4.16666666666667e+00 179 10 4.16666666666667e+00 179 177 -1.66666666666667e+01 179 174 8.33333333333333e+00 179 196 -4.16666666666667e+00 179 195 8.33333333333333e+00 179 325 -8.33333333333333e+00 179 208 8.33333333333333e+00 179 189 1.66666666666667e+01 179 207 -1.66666666666667e+01 179 197 -1.25000000000000e+01 179 39 4.16666666666667e+00 179 324 -8.33333333333333e+00 179 173 -1.25000000000000e+01 179 312 -4.16666666666667e+00 179 191 -7.50000000000000e+01 179 172 8.33333333333333e+00 179 178 -1.66666666666667e+01 179 190 1.66666666666667e+01 179 171 -4.16666666666667e+00 179 9 4.16666666666667e+00 180 180 1.25000000000000e+02 180 395 -8.33333333333333e+00 180 388 4.16666666666667e+00 180 394 -8.33333333333333e+00 180 389 -8.33333333333333e+00 180 185 8.33333333333333e+00 180 184 8.33333333333333e+00 180 190 -1.66666666666667e+01 180 183 -3.75000000000000e+01 180 392 8.33333333333333e+00 180 188 -8.33333333333333e+00 180 181 -1.66666666666667e+01 180 187 1.66666666666667e+01 180 163 8.33333333333333e+00 180 11 8.33333333333333e+00 180 152 -8.33333333333333e+00 180 10 -4.16666666666667e+00 180 151 4.16666666666667e+00 180 9 -1.25000000000000e+01 180 186 -2.50000000000000e+01 180 182 -1.66666666666667e+01 180 65 8.33333333333333e+00 180 164 8.33333333333333e+00 180 64 -4.16666666666667e+00 180 391 8.33333333333333e+00 180 191 8.33333333333333e+00 180 63 -1.25000000000000e+01 180 162 -3.75000000000000e+01 181 181 1.25000000000000e+02 181 393 -8.33333333333333e+00 181 389 4.16666666666667e+00 181 395 -8.33333333333333e+00 181 185 -4.16666666666667e+00 181 191 8.33333333333333e+00 181 184 -1.25000000000000e+01 181 183 8.33333333333333e+00 181 189 -1.66666666666667e+01 181 152 4.16666666666667e+00 181 164 -4.16666666666667e+00 181 180 -1.66666666666667e+01 181 186 1.66666666666667e+01 181 162 8.33333333333333e+00 181 11 8.33333333333333e+00 181 182 -1.66666666666667e+01 181 188 1.66666666666667e+01 181 10 -1.25000000000000e+01 181 187 -7.50000000000000e+01 181 9 -4.16666666666667e+00 181 150 4.16666666666667e+00 181 65 8.33333333333333e+00 181 392 -1.66666666666667e+01 181 387 4.16666666666667e+00 181 64 -1.25000000000000e+01 181 163 -1.25000000000000e+01 181 63 -4.16666666666667e+00 181 390 8.33333333333333e+00 182 182 1.25000000000000e+02 182 393 -8.33333333333333e+00 182 388 4.16666666666667e+00 182 394 -8.33333333333333e+00 182 387 -8.33333333333333e+00 182 185 -1.25000000000000e+01 182 184 -4.16666666666667e+00 182 190 8.33333333333333e+00 182 183 8.33333333333333e+00 182 390 8.33333333333333e+00 182 186 -8.33333333333333e+00 182 151 4.16666666666667e+00 182 163 -4.16666666666667e+00 182 11 -3.75000000000000e+01 182 188 -2.50000000000000e+01 182 10 8.33333333333333e+00 182 181 -1.66666666666667e+01 182 187 1.66666666666667e+01 182 9 8.33333333333333e+00 182 150 -8.33333333333333e+00 182 189 8.33333333333333e+00 182 65 -3.75000000000000e+01 182 164 -1.25000000000000e+01 182 64 8.33333333333333e+00 182 391 -1.66666666666667e+01 182 180 -1.66666666666667e+01 182 63 8.33333333333333e+00 182 162 8.33333333333333e+00 183 183 1.25000000000000e+02 183 209 8.33333333333333e+00 183 208 -1.66666666666667e+01 183 203 8.33333333333333e+00 183 67 4.16666666666667e+00 183 201 -3.75000000000000e+01 183 173 8.33333333333333e+00 183 172 -4.16666666666667e+00 183 10 4.16666666666667e+00 183 171 -1.25000000000000e+01 183 191 -8.33333333333333e+00 183 185 -1.66666666666667e+01 183 388 -4.16666666666667e+00 183 401 -8.33333333333333e+00 183 395 8.33333333333333e+00 183 400 -8.33333333333333e+00 183 394 8.33333333333333e+00 183 389 8.33333333333333e+00 183 68 -8.33333333333333e+00 183 387 -1.25000000000000e+01 183 182 8.33333333333333e+00 183 11 -8.33333333333333e+00 183 181 8.33333333333333e+00 183 184 -1.66666666666667e+01 183 190 1.66666666666667e+01 183 180 -3.75000000000000e+01 183 202 8.33333333333333e+00 183 189 -2.50000000000000e+01 184 184 1.25000000000000e+02 184 209 8.33333333333333e+00 184 201 8.33333333333333e+00 184 207 -1.66666666666667e+01 184 202 -1.25000000000000e+01 184 66 4.16666666666667e+00 184 173 8.33333333333333e+00 184 185 -1.66666666666667e+01 184 172 -1.25000000000000e+01 184 171 -4.16666666666667e+00 184 9 4.16666666666667e+00 184 387 -4.16666666666667e+00 184 389 8.33333333333333e+00 184 191 1.66666666666667e+01 184 395 -1.66666666666667e+01 184 399 -8.33333333333333e+00 184 393 8.33333333333333e+00 184 68 4.16666666666667e+00 184 401 -8.33333333333333e+00 184 388 -1.25000000000000e+01 184 182 -4.16666666666667e+00 184 11 4.16666666666667e+00 184 181 -1.25000000000000e+01 184 203 -4.16666666666667e+00 184 190 -7.50000000000000e+01 184 180 8.33333333333333e+00 184 183 -1.66666666666667e+01 184 189 1.66666666666667e+01 185 185 1.25000000000000e+02 185 208 8.33333333333333e+00 185 207 8.33333333333333e+00 185 203 -1.25000000000000e+01 185 201 8.33333333333333e+00 185 173 -3.75000000000000e+01 185 172 8.33333333333333e+00 185 184 -1.66666666666667e+01 185 171 8.33333333333333e+00 185 189 -8.33333333333333e+00 185 183 -1.66666666666667e+01 185 388 8.33333333333333e+00 185 399 -8.33333333333333e+00 185 393 8.33333333333333e+00 185 190 1.66666666666667e+01 185 394 -1.66666666666667e+01 185 389 -3.75000000000000e+01 185 67 4.16666666666667e+00 185 400 -8.33333333333333e+00 185 387 8.33333333333333e+00 185 66 -8.33333333333333e+00 185 182 -1.25000000000000e+01 185 202 -4.16666666666667e+00 185 191 -2.50000000000000e+01 185 181 -4.16666666666667e+00 185 10 4.16666666666667e+00 185 180 8.33333333333333e+00 185 9 -8.33333333333333e+00 186 186 2.50000000000000e+02 186 319 -1.66666666666667e+01 186 191 1.66666666666667e+01 186 395 -1.66666666666667e+01 186 445 -8.33333333333333e+00 186 394 8.33333333333333e+00 186 446 -8.33333333333333e+00 186 190 1.66666666666667e+01 186 189 -7.50000000000000e+01 186 176 1.66666666666667e+01 186 157 8.33333333333333e+00 186 175 -8.33333333333333e+00 186 158 -1.66666666666667e+01 186 11 8.33333333333333e+00 186 174 -2.50000000000000e+01 186 317 -8.33333333333333e+00 186 92 8.33333333333333e+00 186 187 -3.33333333333333e+01 186 316 1.66666666666667e+01 186 315 -2.50000000000000e+01 186 182 -8.33333333333333e+00 186 181 1.66666666666667e+01 186 152 -8.33333333333333e+00 186 164 8.33333333333333e+00 186 169 1.66666666666667e+01 186 163 -1.66666666666667e+01 186 10 8.33333333333333e+00 186 151 -8.33333333333333e+00 186 180 -2.50000000000000e+01 186 188 -3.33333333333333e+01 186 392 1.66666666666667e+01 186 170 1.66666666666667e+01 186 391 -8.33333333333333e+00 186 91 8.33333333333333e+00 186 320 8.33333333333333e+00 186 390 -2.50000000000000e+01 186 168 -7.50000000000000e+01 187 187 2.50000000000000e+02 187 318 -1.66666666666667e+01 187 191 -8.33333333333333e+00 187 446 -8.33333333333333e+00 187 395 8.33333333333333e+00 187 444 -8.33333333333333e+00 187 393 8.33333333333333e+00 187 190 -2.50000000000000e+01 187 189 1.66666666666667e+01 187 156 8.33333333333333e+00 187 174 -8.33333333333333e+00 187 158 8.33333333333333e+00 187 176 1.66666666666667e+01 187 175 -2.50000000000000e+01 187 317 1.66666666666667e+01 187 316 -7.50000000000000e+01 187 186 -3.33333333333333e+01 187 315 1.66666666666667e+01 187 170 -8.33333333333333e+00 187 188 -3.33333333333333e+01 187 152 -8.33333333333333e+00 187 164 8.33333333333333e+00 187 180 1.66666666666667e+01 187 168 1.66666666666667e+01 187 162 -1.66666666666667e+01 187 11 -1.66666666666667e+01 187 182 1.66666666666667e+01 187 181 -7.50000000000000e+01 187 9 8.33333333333333e+00 187 150 -8.33333333333333e+00 187 392 1.66666666666667e+01 187 92 -1.66666666666667e+01 187 320 8.33333333333333e+00 187 391 -2.50000000000000e+01 187 169 -2.50000000000000e+01 187 390 -8.33333333333333e+00 187 90 8.33333333333333e+00 188 188 2.50000000000000e+02 188 319 8.33333333333333e+00 188 190 -8.33333333333333e+00 188 445 -8.33333333333333e+00 188 394 8.33333333333333e+00 188 189 1.66666666666667e+01 188 393 -1.66666666666667e+01 188 444 -8.33333333333333e+00 188 191 -2.50000000000000e+01 188 174 1.66666666666667e+01 188 157 8.33333333333333e+00 188 156 -1.66666666666667e+01 188 176 -7.50000000000000e+01 188 175 1.66666666666667e+01 188 9 8.33333333333333e+00 188 317 -2.50000000000000e+01 188 316 1.66666666666667e+01 188 315 -8.33333333333333e+00 188 90 8.33333333333333e+00 188 169 -8.33333333333333e+00 188 187 -3.33333333333333e+01 188 180 -8.33333333333333e+00 188 151 -8.33333333333333e+00 188 163 8.33333333333333e+00 188 150 -8.33333333333333e+00 188 162 8.33333333333333e+00 188 182 -2.50000000000000e+01 188 10 -1.66666666666667e+01 188 181 1.66666666666667e+01 188 318 8.33333333333333e+00 188 392 -7.50000000000000e+01 188 170 -2.50000000000000e+01 188 391 1.66666666666667e+01 188 91 -1.66666666666667e+01 188 186 -3.33333333333333e+01 188 390 1.66666666666667e+01 188 168 1.66666666666667e+01 189 189 2.50000000000000e+02 189 319 1.66666666666667e+01 189 318 -2.50000000000000e+01 189 176 -1.66666666666667e+01 189 175 8.33333333333333e+00 189 188 1.66666666666667e+01 189 445 8.33333333333333e+00 189 187 1.66666666666667e+01 189 186 -7.50000000000000e+01 189 446 8.33333333333333e+00 189 178 -8.33333333333333e+00 189 179 1.66666666666667e+01 189 191 -3.33333333333333e+01 189 11 -8.33333333333333e+00 189 177 -2.50000000000000e+01 189 326 8.33333333333333e+00 189 95 -8.33333333333333e+00 189 325 -1.66666666666667e+01 189 173 8.33333333333333e+00 189 208 1.66666666666667e+01 189 190 -3.33333333333333e+01 189 209 1.66666666666667e+01 189 94 -8.33333333333333e+00 189 207 -7.50000000000000e+01 189 172 8.33333333333333e+00 189 10 -8.33333333333333e+00 189 185 -8.33333333333333e+00 189 182 8.33333333333333e+00 189 400 8.33333333333333e+00 189 394 -8.33333333333333e+00 189 181 -1.66666666666667e+01 189 184 1.66666666666667e+01 189 183 -2.50000000000000e+01 189 395 1.66666666666667e+01 189 401 -1.66666666666667e+01 189 393 -2.50000000000000e+01 189 320 -8.33333333333333e+00 190 190 2.50000000000000e+02 190 318 1.66666666666667e+01 190 320 1.66666666666667e+01 190 319 -7.50000000000000e+01 190 174 8.33333333333333e+00 190 188 -8.33333333333333e+00 190 444 8.33333333333333e+00 190 187 -2.50000000000000e+01 190 186 1.66666666666667e+01 190 446 -1.66666666666667e+01 190 177 -8.33333333333333e+00 190 326 8.33333333333333e+00 190 179 1.66666666666667e+01 190 178 -2.50000000000000e+01 190 324 -1.66666666666667e+01 190 209 -8.33333333333333e+00 190 207 1.66666666666667e+01 190 189 -3.33333333333333e+01 190 208 -2.50000000000000e+01 190 93 -8.33333333333333e+00 190 173 -1.66666666666667e+01 190 171 8.33333333333333e+00 190 9 -8.33333333333333e+00 190 185 1.66666666666667e+01 190 191 -3.33333333333333e+01 190 395 1.66666666666667e+01 190 399 8.33333333333333e+00 190 393 -8.33333333333333e+00 190 182 8.33333333333333e+00 190 11 -8.33333333333333e+00 190 184 -7.50000000000000e+01 190 180 -1.66666666666667e+01 190 183 1.66666666666667e+01 190 401 8.33333333333333e+00 190 95 -8.33333333333333e+00 190 394 -2.50000000000000e+01 190 176 8.33333333333333e+00 191 191 2.50000000000000e+02 191 175 8.33333333333333e+00 191 320 -2.50000000000000e+01 191 319 1.66666666666667e+01 191 174 -1.66666666666667e+01 191 187 -8.33333333333333e+00 191 186 1.66666666666667e+01 191 188 -2.50000000000000e+01 191 445 -1.66666666666667e+01 191 444 8.33333333333333e+00 191 325 8.33333333333333e+00 191 177 1.66666666666667e+01 191 189 -3.33333333333333e+01 191 179 -7.50000000000000e+01 191 178 1.66666666666667e+01 191 9 -8.33333333333333e+00 191 324 8.33333333333333e+00 191 93 -8.33333333333333e+00 191 208 -8.33333333333333e+00 191 171 8.33333333333333e+00 191 209 -2.50000000000000e+01 191 207 1.66666666666667e+01 191 172 -1.66666666666667e+01 191 183 -8.33333333333333e+00 191 180 8.33333333333333e+00 191 184 1.66666666666667e+01 191 190 -3.33333333333333e+01 191 394 1.66666666666667e+01 191 185 -2.50000000000000e+01 191 181 8.33333333333333e+00 191 10 -8.33333333333333e+00 191 395 -7.50000000000000e+01 191 318 -8.33333333333333e+00 191 400 8.33333333333333e+00 191 94 -8.33333333333333e+00 191 393 1.66666666666667e+01 191 399 -1.66666666666667e+01 192 192 1.50000000000000e+00 192 16 8.33333333333333e-02 192 217 -1.66666666666667e-01 192 200 -8.33333333333333e-02 192 193 -1.66666666666667e-01 192 199 1.66666666666667e-01 192 13 8.33333333333333e-02 192 198 -2.50000000000000e-01 192 230 -1.66666666666667e-01 192 212 1.66666666666667e-01 192 17 8.33333333333333e-02 192 224 -1.66666666666667e-01 192 223 8.33333333333333e-02 192 229 -1.66666666666667e-01 192 15 -5.00000000000000e-01 192 194 -1.66666666666667e-01 192 206 1.66666666666667e-01 192 14 8.33333333333333e-02 192 205 -8.33333333333333e-02 192 211 1.66666666666667e-01 192 218 8.33333333333333e-02 192 204 -2.50000000000000e-01 192 12 -5.00000000000000e-01 193 193 1.33333333333333e+00 193 15 8.33333333333333e-02 193 216 -1.66666666666667e-01 193 200 1.66666666666667e-01 193 199 -7.50000000000000e-01 193 192 -1.66666666666667e-01 193 198 1.66666666666667e-01 193 12 8.33333333333333e-02 193 224 8.33333333333333e-02 193 230 -1.66666666666667e-01 193 16 -1.66666666666667e-01 193 222 8.33333333333333e-02 193 228 -1.66666666666667e-01 193 206 1.66666666666667e-01 193 212 -3.33333333333333e-01 193 218 8.33333333333333e-02 193 205 -2.50000000000000e-01 193 13 -1.66666666666667e-01 193 204 -8.33333333333333e-02 193 210 1.66666666666667e-01 194 194 1.33333333333333e+00 194 216 8.33333333333333e-02 194 200 -2.50000000000000e-01 194 199 1.66666666666667e-01 194 198 -8.33333333333333e-02 194 223 8.33333333333333e-02 194 229 -1.66666666666667e-01 194 228 -1.66666666666667e-01 194 210 1.66666666666667e-01 194 17 -1.66666666666667e-01 194 15 8.33333333333333e-02 194 222 -1.66666666666667e-01 194 217 8.33333333333333e-02 194 206 -7.50000000000000e-01 194 14 -1.66666666666667e-01 194 205 1.66666666666667e-01 194 211 -3.33333333333333e-01 194 192 -1.66666666666667e-01 194 204 1.66666666666667e-01 194 12 8.33333333333333e-02 195 195 5.96666666666667e+01 195 322 -1.66666666666667e-01 195 200 1.66666666666667e-01 195 199 1.66666666666667e-01 195 198 -7.50000000000000e-01 195 329 -1.66666666666667e-01 195 328 -1.66666666666667e-01 195 212 -3.33333333333333e-01 195 211 1.66666666666667e-01 195 179 8.33333333333333e+00 195 197 -1.66666666666667e+01 195 209 8.50000000000000e+00 195 325 4.25000000000000e+00 195 208 -4.25000000000000e+00 195 14 -4.16666666666667e+00 195 173 4.16666666666667e+00 195 13 4.25000000000000e+00 195 172 -8.33333333333333e+00 195 12 -4.33333333333333e+00 195 207 -1.27500000000000e+01 195 41 -4.16666666666667e+00 195 326 4.25000000000000e+00 195 196 -8.50000000000000e+00 195 40 4.25000000000000e+00 195 178 8.33333333333333e+00 195 323 8.33333333333333e-02 195 39 -4.33333333333333e+00 195 177 -3.75000000000000e+01 196 196 5.15000000000000e+01 196 321 -1.66666666666667e-01 196 200 -8.33333333333333e-02 196 199 -2.50000000000000e-01 196 198 1.66666666666667e-01 196 329 -1.66666666666667e-01 196 212 1.66666666666667e-01 196 327 -1.66666666666667e-01 196 210 1.66666666666667e-01 196 179 -4.16666666666667e+00 196 173 4.16666666666667e+00 196 324 4.25000000000000e+00 196 207 -4.25000000000000e+00 196 14 4.25000000000000e+00 196 197 -8.50000000000000e+00 196 209 8.50000000000000e+00 196 13 -1.30000000000000e+01 196 208 -1.27500000000000e+01 196 12 4.25000000000000e+00 196 171 -8.33333333333333e+00 196 41 4.25000000000000e+00 196 326 -8.50000000000000e+00 196 323 8.33333333333333e-02 196 40 -1.30000000000000e+01 196 178 -1.25000000000000e+01 196 195 -8.50000000000000e+00 196 39 4.25000000000000e+00 196 177 8.33333333333333e+00 197 197 5.96666666666667e+01 197 322 8.33333333333333e-02 197 200 -2.50000000000000e-01 197 199 -8.33333333333333e-02 197 198 1.66666666666667e-01 197 327 -1.66666666666667e-01 197 328 -1.66666666666667e-01 197 211 1.66666666666667e-01 197 210 -3.33333333333333e-01 197 178 -4.16666666666667e+00 197 172 4.16666666666667e+00 197 177 8.33333333333333e+00 197 195 -1.66666666666667e+01 197 207 8.50000000000000e+00 197 14 -4.33333333333333e+00 197 209 -3.82500000000000e+01 197 13 4.25000000000000e+00 197 196 -8.50000000000000e+00 197 208 8.50000000000000e+00 197 12 -4.16666666666667e+00 197 171 4.16666666666667e+00 197 321 8.33333333333333e-02 197 41 -4.33333333333333e+00 197 179 -1.25000000000000e+01 197 40 4.25000000000000e+00 197 325 -8.50000000000000e+00 197 39 -4.16666666666667e+00 197 324 4.25000000000000e+00 198 198 2.50000000000000e+00 198 328 1.66666666666667e-01 198 329 1.66666666666667e-01 198 322 1.66666666666667e-01 198 321 -2.50000000000000e-01 198 200 -3.33333333333333e-01 198 197 1.66666666666667e-01 198 196 1.66666666666667e-01 198 195 -7.50000000000000e-01 198 211 -1.66666666666667e-01 198 199 -3.33333333333333e-01 198 218 1.66666666666667e-01 198 334 -1.66666666666667e-01 198 229 1.66666666666667e-01 198 212 3.33333333333333e-01 198 230 -3.33333333333333e-01 198 44 8.33333333333333e-02 198 335 -1.66666666666667e-01 198 217 1.66666666666667e-01 198 43 -1.66666666666667e-01 198 216 -7.50000000000000e-01 198 194 -8.33333333333333e-02 198 14 8.33333333333333e-02 198 193 1.66666666666667e-01 198 13 -1.66666666666667e-01 198 192 -2.50000000000000e-01 198 323 -8.33333333333333e-02 198 210 -5.00000000000000e-01 199 199 2.50000000000000e+00 199 327 1.66666666666667e-01 199 329 -3.33333333333333e-01 199 44 8.33333333333333e-02 199 322 -7.50000000000000e-01 199 321 1.66666666666667e-01 199 197 -8.33333333333333e-02 199 14 8.33333333333333e-02 199 196 -2.50000000000000e-01 199 195 1.66666666666667e-01 199 210 -1.66666666666667e-01 199 218 -8.33333333333333e-02 199 198 -3.33333333333333e-01 199 333 -1.66666666666667e-01 199 228 1.66666666666667e-01 199 335 -1.66666666666667e-01 199 230 1.66666666666667e-01 199 217 -2.50000000000000e-01 199 216 1.66666666666667e-01 199 42 -1.66666666666667e-01 199 194 1.66666666666667e-01 199 200 -3.33333333333333e-01 199 212 3.33333333333333e-01 199 193 -7.50000000000000e-01 199 323 1.66666666666667e-01 199 211 -5.00000000000000e-01 199 192 1.66666666666667e-01 199 12 -1.66666666666667e-01 200 200 2.50000000000000e+00 200 322 1.66666666666667e-01 200 328 -3.33333333333333e-01 200 327 1.66666666666667e-01 200 323 -2.50000000000000e-01 200 43 8.33333333333333e-02 200 197 -2.50000000000000e-01 200 196 -8.33333333333333e-02 200 13 8.33333333333333e-02 200 198 -3.33333333333333e-01 200 195 1.66666666666667e-01 200 217 -8.33333333333333e-02 200 216 1.66666666666667e-01 200 334 -1.66666666666667e-01 200 229 1.66666666666667e-01 200 210 3.33333333333333e-01 200 228 -3.33333333333333e-01 200 218 -2.50000000000000e-01 200 42 8.33333333333333e-02 200 333 -1.66666666666667e-01 200 194 -2.50000000000000e-01 200 321 -8.33333333333333e-02 200 212 -1.50000000000000e+00 200 193 1.66666666666667e-01 200 199 -3.33333333333333e-01 200 211 3.33333333333333e-01 200 192 -8.33333333333333e-02 200 12 8.33333333333333e-02 201 201 5.96666666666667e+01 201 404 -1.66666666666667e-01 201 397 8.33333333333333e-02 201 403 -1.66666666666667e-01 201 398 -1.66666666666667e-01 201 206 1.66666666666667e-01 201 205 1.66666666666667e-01 201 211 -3.33333333333333e-01 201 204 -7.50000000000000e-01 201 401 4.25000000000000e+00 201 209 -4.25000000000000e+00 201 202 -1.66666666666667e+01 201 208 8.50000000000000e+00 201 184 8.33333333333333e+00 201 14 4.25000000000000e+00 201 173 -8.33333333333333e+00 201 13 -4.16666666666667e+00 201 172 4.16666666666667e+00 201 12 -4.33333333333333e+00 201 207 -1.27500000000000e+01 201 203 -8.50000000000000e+00 201 68 4.25000000000000e+00 201 185 8.33333333333333e+00 201 67 -4.16666666666667e+00 201 400 4.25000000000000e+00 201 212 1.66666666666667e-01 201 66 -4.33333333333333e+00 201 183 -3.75000000000000e+01 202 202 5.96666666666667e+01 202 402 -1.66666666666667e-01 202 398 8.33333333333333e-02 202 404 -1.66666666666667e-01 202 206 -8.33333333333333e-02 202 212 1.66666666666667e-01 202 205 -2.50000000000000e-01 202 204 1.66666666666667e-01 202 210 -3.33333333333333e-01 202 173 4.16666666666667e+00 202 185 -4.16666666666667e+00 202 201 -1.66666666666667e+01 202 207 8.50000000000000e+00 202 183 8.33333333333333e+00 202 14 4.25000000000000e+00 202 203 -8.50000000000000e+00 202 209 8.50000000000000e+00 202 13 -4.33333333333333e+00 202 208 -3.82500000000000e+01 202 12 -4.16666666666667e+00 202 171 4.16666666666667e+00 202 68 4.25000000000000e+00 202 401 -8.50000000000000e+00 202 396 8.33333333333333e-02 202 67 -4.33333333333333e+00 202 184 -1.25000000000000e+01 202 66 -4.16666666666667e+00 202 399 4.25000000000000e+00 203 203 5.15000000000000e+01 203 402 -1.66666666666667e-01 203 397 8.33333333333333e-02 203 403 -1.66666666666667e-01 203 396 -1.66666666666667e-01 203 206 -2.50000000000000e-01 203 205 -8.33333333333333e-02 203 211 1.66666666666667e-01 203 204 1.66666666666667e-01 203 399 4.25000000000000e+00 203 207 -4.25000000000000e+00 203 172 4.16666666666667e+00 203 184 -4.16666666666667e+00 203 14 -1.30000000000000e+01 203 209 -1.27500000000000e+01 203 13 4.25000000000000e+00 203 202 -8.50000000000000e+00 203 208 8.50000000000000e+00 203 12 4.25000000000000e+00 203 171 -8.33333333333333e+00 203 210 1.66666666666667e-01 203 68 -1.30000000000000e+01 203 185 -1.25000000000000e+01 203 67 4.25000000000000e+00 203 400 -8.50000000000000e+00 203 201 -8.50000000000000e+00 203 66 4.25000000000000e+00 203 183 8.33333333333333e+00 204 204 2.50000000000000e+00 204 230 1.66666666666667e-01 204 229 -3.33333333333333e-01 204 224 1.66666666666667e-01 204 70 8.33333333333333e-02 204 222 -7.50000000000000e-01 204 194 1.66666666666667e-01 204 193 -8.33333333333333e-02 204 13 8.33333333333333e-02 204 192 -2.50000000000000e-01 204 212 -1.66666666666667e-01 204 206 -3.33333333333333e-01 204 397 -8.33333333333333e-02 204 410 -1.66666666666667e-01 204 404 1.66666666666667e-01 204 409 -1.66666666666667e-01 204 403 1.66666666666667e-01 204 398 1.66666666666667e-01 204 71 -1.66666666666667e-01 204 396 -2.50000000000000e-01 204 203 1.66666666666667e-01 204 14 -1.66666666666667e-01 204 202 1.66666666666667e-01 204 205 -3.33333333333333e-01 204 211 3.33333333333333e-01 204 201 -7.50000000000000e-01 204 223 1.66666666666667e-01 204 210 -5.00000000000000e-01 205 205 2.50000000000000e+00 205 230 1.66666666666667e-01 205 222 1.66666666666667e-01 205 228 -3.33333333333333e-01 205 223 -2.50000000000000e-01 205 69 8.33333333333333e-02 205 194 1.66666666666667e-01 205 206 -3.33333333333333e-01 205 193 -2.50000000000000e-01 205 192 -8.33333333333333e-02 205 12 8.33333333333333e-02 205 396 -8.33333333333333e-02 205 398 1.66666666666667e-01 205 212 3.33333333333333e-01 205 404 -3.33333333333333e-01 205 408 -1.66666666666667e-01 205 402 1.66666666666667e-01 205 71 8.33333333333333e-02 205 410 -1.66666666666667e-01 205 397 -2.50000000000000e-01 205 203 -8.33333333333333e-02 205 14 8.33333333333333e-02 205 202 -2.50000000000000e-01 205 224 -8.33333333333333e-02 205 211 -1.50000000000000e+00 205 201 1.66666666666667e-01 205 204 -3.33333333333333e-01 205 210 3.33333333333333e-01 206 206 2.50000000000000e+00 206 229 1.66666666666667e-01 206 228 1.66666666666667e-01 206 224 -2.50000000000000e-01 206 222 1.66666666666667e-01 206 194 -7.50000000000000e-01 206 193 1.66666666666667e-01 206 205 -3.33333333333333e-01 206 192 1.66666666666667e-01 206 210 -1.66666666666667e-01 206 204 -3.33333333333333e-01 206 397 1.66666666666667e-01 206 408 -1.66666666666667e-01 206 402 1.66666666666667e-01 206 211 3.33333333333333e-01 206 403 -3.33333333333333e-01 206 398 -7.50000000000000e-01 206 70 8.33333333333333e-02 206 409 -1.66666666666667e-01 206 396 1.66666666666667e-01 206 69 -1.66666666666667e-01 206 203 -2.50000000000000e-01 206 223 -8.33333333333333e-02 206 212 -5.00000000000000e-01 206 202 -8.33333333333333e-02 206 13 8.33333333333333e-02 206 201 1.66666666666667e-01 206 12 -1.66666666666667e-01 207 207 1.27500000000000e+02 207 328 -3.33333333333333e-01 207 212 3.33333333333333e-01 207 404 -3.33333333333333e-01 207 448 -1.66666666666667e-01 207 403 1.66666666666667e-01 207 449 -1.66666666666667e-01 207 211 3.33333333333333e-01 207 210 -1.50000000000000e+00 207 197 8.50000000000000e+00 207 178 8.33333333333333e+00 207 196 -4.25000000000000e+00 207 179 -1.66666666666667e+01 207 14 4.25000000000000e+00 207 195 -1.27500000000000e+01 207 326 -4.25000000000000e+00 207 95 4.25000000000000e+00 207 208 -1.70000000000000e+01 207 325 8.50000000000000e+00 207 324 -1.27500000000000e+01 207 203 -4.25000000000000e+00 207 202 8.50000000000000e+00 207 173 -8.33333333333333e+00 207 185 8.33333333333333e+00 207 190 1.66666666666667e+01 207 184 -1.66666666666667e+01 207 13 4.25000000000000e+00 207 172 -8.33333333333333e+00 207 201 -1.27500000000000e+01 207 209 -1.70000000000000e+01 207 401 8.50000000000000e+00 207 191 1.66666666666667e+01 207 400 -4.25000000000000e+00 207 94 4.25000000000000e+00 207 329 1.66666666666667e-01 207 399 -1.27500000000000e+01 207 189 -7.50000000000000e+01 208 208 1.27500000000000e+02 208 327 -3.33333333333333e-01 208 212 -1.66666666666667e-01 208 449 -1.66666666666667e-01 208 404 1.66666666666667e-01 208 447 -1.66666666666667e-01 208 402 1.66666666666667e-01 208 211 -5.00000000000000e-01 208 210 3.33333333333333e-01 208 177 8.33333333333333e+00 208 195 -4.25000000000000e+00 208 179 8.33333333333333e+00 208 197 8.50000000000000e+00 208 196 -1.27500000000000e+01 208 326 8.50000000000000e+00 208 325 -3.82500000000000e+01 208 207 -1.70000000000000e+01 208 324 8.50000000000000e+00 208 191 -8.33333333333333e+00 208 209 -1.70000000000000e+01 208 173 -8.33333333333333e+00 208 185 8.33333333333333e+00 208 201 8.50000000000000e+00 208 189 1.66666666666667e+01 208 183 -1.66666666666667e+01 208 14 -8.50000000000000e+00 208 203 8.50000000000000e+00 208 202 -3.82500000000000e+01 208 12 4.25000000000000e+00 208 171 -8.33333333333333e+00 208 401 8.50000000000000e+00 208 95 -8.50000000000000e+00 208 329 1.66666666666667e-01 208 400 -1.27500000000000e+01 208 190 -2.50000000000000e+01 208 399 -4.25000000000000e+00 208 93 4.25000000000000e+00 209 209 1.27500000000000e+02 209 328 1.66666666666667e-01 209 211 -1.66666666666667e-01 209 448 -1.66666666666667e-01 209 403 1.66666666666667e-01 209 210 3.33333333333333e-01 209 402 -3.33333333333333e-01 209 447 -1.66666666666667e-01 209 212 -5.00000000000000e-01 209 195 8.50000000000000e+00 209 178 8.33333333333333e+00 209 177 -1.66666666666667e+01 209 197 -3.82500000000000e+01 209 196 8.50000000000000e+00 209 12 4.25000000000000e+00 209 326 -1.27500000000000e+01 209 325 8.50000000000000e+00 209 324 -4.25000000000000e+00 209 93 4.25000000000000e+00 209 190 -8.33333333333333e+00 209 208 -1.70000000000000e+01 209 201 -4.25000000000000e+00 209 172 -8.33333333333333e+00 209 184 8.33333333333333e+00 209 171 -8.33333333333333e+00 209 183 8.33333333333333e+00 209 203 -1.27500000000000e+01 209 13 -8.50000000000000e+00 209 202 8.50000000000000e+00 209 327 1.66666666666667e-01 209 401 -3.82500000000000e+01 209 191 -2.50000000000000e+01 209 400 8.50000000000000e+00 209 94 -8.50000000000000e+00 209 207 -1.70000000000000e+01 209 399 8.50000000000000e+00 209 189 1.66666666666667e+01 210 210 5.00000000000000e+00 210 328 3.33333333333333e-01 210 327 -5.00000000000000e-01 210 197 -3.33333333333333e-01 210 196 1.66666666666667e-01 210 209 3.33333333333333e-01 210 448 1.66666666666667e-01 210 208 3.33333333333333e-01 210 207 -1.50000000000000e+00 210 449 1.66666666666667e-01 210 199 -1.66666666666667e-01 210 200 3.33333333333333e-01 210 212 -6.66666666666667e-01 210 14 -1.66666666666667e-01 210 198 -5.00000000000000e-01 210 335 1.66666666666667e-01 210 98 -1.66666666666667e-01 210 334 -3.33333333333333e-01 210 194 1.66666666666667e-01 210 229 3.33333333333333e-01 210 211 -6.66666666666667e-01 210 230 3.33333333333333e-01 210 97 -1.66666666666667e-01 210 228 -1.50000000000000e+00 210 193 1.66666666666667e-01 210 13 -1.66666666666667e-01 210 206 -1.66666666666667e-01 210 203 1.66666666666667e-01 210 409 1.66666666666667e-01 210 403 -1.66666666666667e-01 210 202 -3.33333333333333e-01 210 205 3.33333333333333e-01 210 204 -5.00000000000000e-01 210 404 3.33333333333333e-01 210 410 -3.33333333333333e-01 210 402 -5.00000000000000e-01 210 329 -1.66666666666667e-01 211 211 5.00000000000000e+00 211 327 3.33333333333333e-01 211 329 3.33333333333333e-01 211 328 -1.50000000000000e+00 211 195 1.66666666666667e-01 211 209 -1.66666666666667e-01 211 447 1.66666666666667e-01 211 208 -5.00000000000000e-01 211 207 3.33333333333333e-01 211 449 -3.33333333333333e-01 211 198 -1.66666666666667e-01 211 335 1.66666666666667e-01 211 200 3.33333333333333e-01 211 199 -5.00000000000000e-01 211 333 -3.33333333333333e-01 211 230 -1.66666666666667e-01 211 228 3.33333333333333e-01 211 210 -6.66666666666667e-01 211 229 -5.00000000000000e-01 211 96 -1.66666666666667e-01 211 194 -3.33333333333333e-01 211 192 1.66666666666667e-01 211 12 -1.66666666666667e-01 211 206 3.33333333333333e-01 211 212 -6.66666666666667e-01 211 404 3.33333333333333e-01 211 408 1.66666666666667e-01 211 402 -1.66666666666667e-01 211 203 1.66666666666667e-01 211 14 -1.66666666666667e-01 211 205 -1.50000000000000e+00 211 201 -3.33333333333333e-01 211 204 3.33333333333333e-01 211 410 1.66666666666667e-01 211 98 -1.66666666666667e-01 211 403 -5.00000000000000e-01 211 197 1.66666666666667e-01 212 212 5.00000000000000e+00 212 196 1.66666666666667e-01 212 329 -5.00000000000000e-01 212 328 3.33333333333333e-01 212 195 -3.33333333333333e-01 212 208 -1.66666666666667e-01 212 207 3.33333333333333e-01 212 209 -5.00000000000000e-01 212 448 -3.33333333333333e-01 212 447 1.66666666666667e-01 212 334 1.66666666666667e-01 212 198 3.33333333333333e-01 212 210 -6.66666666666667e-01 212 200 -1.50000000000000e+00 212 199 3.33333333333333e-01 212 12 -1.66666666666667e-01 212 333 1.66666666666667e-01 212 96 -1.66666666666667e-01 212 229 -1.66666666666667e-01 212 192 1.66666666666667e-01 212 230 -5.00000000000000e-01 212 228 3.33333333333333e-01 212 193 -3.33333333333333e-01 212 204 -1.66666666666667e-01 212 201 1.66666666666667e-01 212 205 3.33333333333333e-01 212 211 -6.66666666666667e-01 212 403 3.33333333333333e-01 212 206 -5.00000000000000e-01 212 202 1.66666666666667e-01 212 13 -1.66666666666667e-01 212 404 -1.50000000000000e+00 212 327 -1.66666666666667e-01 212 409 1.66666666666667e-01 212 97 -1.66666666666667e-01 212 402 3.33333333333333e-01 212 408 -3.33333333333333e-01 213 213 1.50000000000000e+00 213 19 8.33333333333333e-02 213 238 -1.66666666666667e-01 213 221 -8.33333333333333e-02 213 214 -1.66666666666667e-01 213 220 1.66666666666667e-01 213 16 8.33333333333333e-02 213 219 -2.50000000000000e-01 213 251 -1.66666666666667e-01 213 233 1.66666666666667e-01 213 20 8.33333333333333e-02 213 245 -1.66666666666667e-01 213 244 8.33333333333333e-02 213 250 -1.66666666666667e-01 213 18 -5.00000000000000e-01 213 215 -1.66666666666667e-01 213 227 1.66666666666667e-01 213 17 8.33333333333333e-02 213 226 -8.33333333333333e-02 213 232 1.66666666666667e-01 213 239 8.33333333333333e-02 213 225 -2.50000000000000e-01 213 15 -5.00000000000000e-01 214 214 1.33333333333333e+00 214 18 8.33333333333333e-02 214 237 -1.66666666666667e-01 214 221 1.66666666666667e-01 214 220 -7.50000000000000e-01 214 213 -1.66666666666667e-01 214 219 1.66666666666667e-01 214 15 8.33333333333333e-02 214 245 8.33333333333333e-02 214 251 -1.66666666666667e-01 214 19 -1.66666666666667e-01 214 243 8.33333333333333e-02 214 249 -1.66666666666667e-01 214 227 1.66666666666667e-01 214 233 -3.33333333333333e-01 214 239 8.33333333333333e-02 214 226 -2.50000000000000e-01 214 16 -1.66666666666667e-01 214 225 -8.33333333333333e-02 214 231 1.66666666666667e-01 215 215 1.33333333333333e+00 215 237 8.33333333333333e-02 215 221 -2.50000000000000e-01 215 220 1.66666666666667e-01 215 219 -8.33333333333333e-02 215 244 8.33333333333333e-02 215 250 -1.66666666666667e-01 215 249 -1.66666666666667e-01 215 231 1.66666666666667e-01 215 20 -1.66666666666667e-01 215 18 8.33333333333333e-02 215 243 -1.66666666666667e-01 215 238 8.33333333333333e-02 215 227 -7.50000000000000e-01 215 17 -1.66666666666667e-01 215 226 1.66666666666667e-01 215 232 -3.33333333333333e-01 215 213 -1.66666666666667e-01 215 225 1.66666666666667e-01 215 15 8.33333333333333e-02 216 216 2.50000000000000e+00 216 331 -1.66666666666667e-01 216 221 1.66666666666667e-01 216 220 1.66666666666667e-01 216 219 -7.50000000000000e-01 216 338 -1.66666666666667e-01 216 337 -1.66666666666667e-01 216 233 -3.33333333333333e-01 216 232 1.66666666666667e-01 216 200 1.66666666666667e-01 216 218 -3.33333333333333e-01 216 230 3.33333333333333e-01 216 334 1.66666666666667e-01 216 229 -1.66666666666667e-01 216 17 -8.33333333333333e-02 216 194 8.33333333333333e-02 216 16 1.66666666666667e-01 216 193 -1.66666666666667e-01 216 15 -2.50000000000000e-01 216 228 -5.00000000000000e-01 216 44 -8.33333333333333e-02 216 335 1.66666666666667e-01 216 217 -3.33333333333333e-01 216 43 1.66666666666667e-01 216 199 1.66666666666667e-01 216 332 8.33333333333333e-02 216 42 -2.50000000000000e-01 216 198 -7.50000000000000e-01 217 217 2.50000000000000e+00 217 330 -1.66666666666667e-01 217 221 -8.33333333333333e-02 217 220 -2.50000000000000e-01 217 219 1.66666666666667e-01 217 338 -1.66666666666667e-01 217 233 1.66666666666667e-01 217 336 -1.66666666666667e-01 217 231 1.66666666666667e-01 217 200 -8.33333333333333e-02 217 194 8.33333333333333e-02 217 333 1.66666666666667e-01 217 228 -1.66666666666667e-01 217 17 1.66666666666667e-01 217 218 -3.33333333333333e-01 217 230 3.33333333333333e-01 217 16 -7.50000000000000e-01 217 229 -5.00000000000000e-01 217 15 1.66666666666667e-01 217 192 -1.66666666666667e-01 217 44 1.66666666666667e-01 217 335 -3.33333333333333e-01 217 332 8.33333333333333e-02 217 43 -7.50000000000000e-01 217 199 -2.50000000000000e-01 217 216 -3.33333333333333e-01 217 42 1.66666666666667e-01 217 198 1.66666666666667e-01 218 218 2.50000000000000e+00 218 331 8.33333333333333e-02 218 221 -2.50000000000000e-01 218 220 -8.33333333333333e-02 218 219 1.66666666666667e-01 218 336 -1.66666666666667e-01 218 337 -1.66666666666667e-01 218 232 1.66666666666667e-01 218 231 -3.33333333333333e-01 218 199 -8.33333333333333e-02 218 193 8.33333333333333e-02 218 198 1.66666666666667e-01 218 216 -3.33333333333333e-01 218 228 3.33333333333333e-01 218 17 -2.50000000000000e-01 218 230 -1.50000000000000e+00 218 16 1.66666666666667e-01 218 217 -3.33333333333333e-01 218 229 3.33333333333333e-01 218 15 -8.33333333333333e-02 218 192 8.33333333333333e-02 218 330 8.33333333333333e-02 218 44 -2.50000000000000e-01 218 200 -2.50000000000000e-01 218 43 1.66666666666667e-01 218 334 -3.33333333333333e-01 218 42 -8.33333333333333e-02 218 333 1.66666666666667e-01 219 219 2.50000000000000e+00 219 337 1.66666666666667e-01 219 338 1.66666666666667e-01 219 331 1.66666666666667e-01 219 330 -2.50000000000000e-01 219 221 -3.33333333333333e-01 219 218 1.66666666666667e-01 219 217 1.66666666666667e-01 219 216 -7.50000000000000e-01 219 232 -1.66666666666667e-01 219 220 -3.33333333333333e-01 219 239 1.66666666666667e-01 219 343 -1.66666666666667e-01 219 250 1.66666666666667e-01 219 233 3.33333333333333e-01 219 251 -3.33333333333333e-01 219 47 8.33333333333333e-02 219 344 -1.66666666666667e-01 219 238 1.66666666666667e-01 219 46 -1.66666666666667e-01 219 237 -7.50000000000000e-01 219 215 -8.33333333333333e-02 219 17 8.33333333333333e-02 219 214 1.66666666666667e-01 219 16 -1.66666666666667e-01 219 213 -2.50000000000000e-01 219 332 -8.33333333333333e-02 219 231 -5.00000000000000e-01 220 220 2.50000000000000e+00 220 336 1.66666666666667e-01 220 338 -3.33333333333333e-01 220 47 8.33333333333333e-02 220 331 -7.50000000000000e-01 220 330 1.66666666666667e-01 220 218 -8.33333333333333e-02 220 17 8.33333333333333e-02 220 217 -2.50000000000000e-01 220 216 1.66666666666667e-01 220 231 -1.66666666666667e-01 220 239 -8.33333333333333e-02 220 219 -3.33333333333333e-01 220 342 -1.66666666666667e-01 220 249 1.66666666666667e-01 220 344 -1.66666666666667e-01 220 251 1.66666666666667e-01 220 238 -2.50000000000000e-01 220 237 1.66666666666667e-01 220 45 -1.66666666666667e-01 220 215 1.66666666666667e-01 220 221 -3.33333333333333e-01 220 233 3.33333333333333e-01 220 214 -7.50000000000000e-01 220 332 1.66666666666667e-01 220 232 -5.00000000000000e-01 220 213 1.66666666666667e-01 220 15 -1.66666666666667e-01 221 221 2.50000000000000e+00 221 331 1.66666666666667e-01 221 337 -3.33333333333333e-01 221 336 1.66666666666667e-01 221 332 -2.50000000000000e-01 221 46 8.33333333333333e-02 221 218 -2.50000000000000e-01 221 217 -8.33333333333333e-02 221 16 8.33333333333333e-02 221 219 -3.33333333333333e-01 221 216 1.66666666666667e-01 221 238 -8.33333333333333e-02 221 237 1.66666666666667e-01 221 343 -1.66666666666667e-01 221 250 1.66666666666667e-01 221 231 3.33333333333333e-01 221 249 -3.33333333333333e-01 221 239 -2.50000000000000e-01 221 45 8.33333333333333e-02 221 342 -1.66666666666667e-01 221 215 -2.50000000000000e-01 221 330 -8.33333333333333e-02 221 233 -1.50000000000000e+00 221 214 1.66666666666667e-01 221 220 -3.33333333333333e-01 221 232 3.33333333333333e-01 221 213 -8.33333333333333e-02 221 15 8.33333333333333e-02 222 222 2.50000000000000e+00 222 413 -1.66666666666667e-01 222 406 8.33333333333333e-02 222 412 -1.66666666666667e-01 222 407 -1.66666666666667e-01 222 227 1.66666666666667e-01 222 226 1.66666666666667e-01 222 232 -3.33333333333333e-01 222 225 -7.50000000000000e-01 222 410 1.66666666666667e-01 222 230 -1.66666666666667e-01 222 223 -3.33333333333333e-01 222 229 3.33333333333333e-01 222 205 1.66666666666667e-01 222 17 1.66666666666667e-01 222 194 -1.66666666666667e-01 222 16 -8.33333333333333e-02 222 193 8.33333333333333e-02 222 15 -2.50000000000000e-01 222 228 -5.00000000000000e-01 222 224 -3.33333333333333e-01 222 71 1.66666666666667e-01 222 206 1.66666666666667e-01 222 70 -8.33333333333333e-02 222 409 1.66666666666667e-01 222 233 1.66666666666667e-01 222 69 -2.50000000000000e-01 222 204 -7.50000000000000e-01 223 223 2.50000000000000e+00 223 411 -1.66666666666667e-01 223 407 8.33333333333333e-02 223 413 -1.66666666666667e-01 223 227 -8.33333333333333e-02 223 233 1.66666666666667e-01 223 226 -2.50000000000000e-01 223 225 1.66666666666667e-01 223 231 -3.33333333333333e-01 223 194 8.33333333333333e-02 223 206 -8.33333333333333e-02 223 222 -3.33333333333333e-01 223 228 3.33333333333333e-01 223 204 1.66666666666667e-01 223 17 1.66666666666667e-01 223 224 -3.33333333333333e-01 223 230 3.33333333333333e-01 223 16 -2.50000000000000e-01 223 229 -1.50000000000000e+00 223 15 -8.33333333333333e-02 223 192 8.33333333333333e-02 223 71 1.66666666666667e-01 223 410 -3.33333333333333e-01 223 405 8.33333333333333e-02 223 70 -2.50000000000000e-01 223 205 -2.50000000000000e-01 223 69 -8.33333333333333e-02 223 408 1.66666666666667e-01 224 224 2.50000000000000e+00 224 411 -1.66666666666667e-01 224 406 8.33333333333333e-02 224 412 -1.66666666666667e-01 224 405 -1.66666666666667e-01 224 227 -2.50000000000000e-01 224 226 -8.33333333333333e-02 224 232 1.66666666666667e-01 224 225 1.66666666666667e-01 224 408 1.66666666666667e-01 224 228 -1.66666666666667e-01 224 193 8.33333333333333e-02 224 205 -8.33333333333333e-02 224 17 -7.50000000000000e-01 224 230 -5.00000000000000e-01 224 16 1.66666666666667e-01 224 223 -3.33333333333333e-01 224 229 3.33333333333333e-01 224 15 1.66666666666667e-01 224 192 -1.66666666666667e-01 224 231 1.66666666666667e-01 224 71 -7.50000000000000e-01 224 206 -2.50000000000000e-01 224 70 1.66666666666667e-01 224 409 -3.33333333333333e-01 224 222 -3.33333333333333e-01 224 69 1.66666666666667e-01 224 204 1.66666666666667e-01 225 225 2.50000000000000e+00 225 251 1.66666666666667e-01 225 250 -3.33333333333333e-01 225 245 1.66666666666667e-01 225 73 8.33333333333333e-02 225 243 -7.50000000000000e-01 225 215 1.66666666666667e-01 225 214 -8.33333333333333e-02 225 16 8.33333333333333e-02 225 213 -2.50000000000000e-01 225 233 -1.66666666666667e-01 225 227 -3.33333333333333e-01 225 406 -8.33333333333333e-02 225 419 -1.66666666666667e-01 225 413 1.66666666666667e-01 225 418 -1.66666666666667e-01 225 412 1.66666666666667e-01 225 407 1.66666666666667e-01 225 74 -1.66666666666667e-01 225 405 -2.50000000000000e-01 225 224 1.66666666666667e-01 225 17 -1.66666666666667e-01 225 223 1.66666666666667e-01 225 226 -3.33333333333333e-01 225 232 3.33333333333333e-01 225 222 -7.50000000000000e-01 225 244 1.66666666666667e-01 225 231 -5.00000000000000e-01 226 226 2.50000000000000e+00 226 251 1.66666666666667e-01 226 243 1.66666666666667e-01 226 249 -3.33333333333333e-01 226 244 -2.50000000000000e-01 226 72 8.33333333333333e-02 226 215 1.66666666666667e-01 226 227 -3.33333333333333e-01 226 214 -2.50000000000000e-01 226 213 -8.33333333333333e-02 226 15 8.33333333333333e-02 226 405 -8.33333333333333e-02 226 407 1.66666666666667e-01 226 233 3.33333333333333e-01 226 413 -3.33333333333333e-01 226 417 -1.66666666666667e-01 226 411 1.66666666666667e-01 226 74 8.33333333333333e-02 226 419 -1.66666666666667e-01 226 406 -2.50000000000000e-01 226 224 -8.33333333333333e-02 226 17 8.33333333333333e-02 226 223 -2.50000000000000e-01 226 245 -8.33333333333333e-02 226 232 -1.50000000000000e+00 226 222 1.66666666666667e-01 226 225 -3.33333333333333e-01 226 231 3.33333333333333e-01 227 227 2.50000000000000e+00 227 250 1.66666666666667e-01 227 249 1.66666666666667e-01 227 245 -2.50000000000000e-01 227 243 1.66666666666667e-01 227 215 -7.50000000000000e-01 227 214 1.66666666666667e-01 227 226 -3.33333333333333e-01 227 213 1.66666666666667e-01 227 231 -1.66666666666667e-01 227 225 -3.33333333333333e-01 227 406 1.66666666666667e-01 227 417 -1.66666666666667e-01 227 411 1.66666666666667e-01 227 232 3.33333333333333e-01 227 412 -3.33333333333333e-01 227 407 -7.50000000000000e-01 227 73 8.33333333333333e-02 227 418 -1.66666666666667e-01 227 405 1.66666666666667e-01 227 72 -1.66666666666667e-01 227 224 -2.50000000000000e-01 227 244 -8.33333333333333e-02 227 233 -5.00000000000000e-01 227 223 -8.33333333333333e-02 227 16 8.33333333333333e-02 227 222 1.66666666666667e-01 227 15 -1.66666666666667e-01 228 228 5.00000000000000e+00 228 337 -3.33333333333333e-01 228 233 3.33333333333333e-01 228 413 -3.33333333333333e-01 228 451 -1.66666666666667e-01 228 412 1.66666666666667e-01 228 452 -1.66666666666667e-01 228 232 3.33333333333333e-01 228 231 -1.50000000000000e+00 228 218 3.33333333333333e-01 228 199 1.66666666666667e-01 228 217 -1.66666666666667e-01 228 200 -3.33333333333333e-01 228 17 1.66666666666667e-01 228 216 -5.00000000000000e-01 228 335 -1.66666666666667e-01 228 98 1.66666666666667e-01 228 229 -6.66666666666667e-01 228 334 3.33333333333333e-01 228 333 -5.00000000000000e-01 228 224 -1.66666666666667e-01 228 223 3.33333333333333e-01 228 194 -1.66666666666667e-01 228 206 1.66666666666667e-01 228 211 3.33333333333333e-01 228 205 -3.33333333333333e-01 228 16 1.66666666666667e-01 228 193 -1.66666666666667e-01 228 222 -5.00000000000000e-01 228 230 -6.66666666666667e-01 228 410 3.33333333333333e-01 228 212 3.33333333333333e-01 228 409 -1.66666666666667e-01 228 97 1.66666666666667e-01 228 338 1.66666666666667e-01 228 408 -5.00000000000000e-01 228 210 -1.50000000000000e+00 229 229 5.00000000000000e+00 229 336 -3.33333333333333e-01 229 233 -1.66666666666667e-01 229 452 -1.66666666666667e-01 229 413 1.66666666666667e-01 229 450 -1.66666666666667e-01 229 411 1.66666666666667e-01 229 232 -5.00000000000000e-01 229 231 3.33333333333333e-01 229 198 1.66666666666667e-01 229 216 -1.66666666666667e-01 229 200 1.66666666666667e-01 229 218 3.33333333333333e-01 229 217 -5.00000000000000e-01 229 335 3.33333333333333e-01 229 334 -1.50000000000000e+00 229 228 -6.66666666666667e-01 229 333 3.33333333333333e-01 229 212 -1.66666666666667e-01 229 230 -6.66666666666667e-01 229 194 -1.66666666666667e-01 229 206 1.66666666666667e-01 229 222 3.33333333333333e-01 229 210 3.33333333333333e-01 229 204 -3.33333333333333e-01 229 17 -3.33333333333333e-01 229 224 3.33333333333333e-01 229 223 -1.50000000000000e+00 229 15 1.66666666666667e-01 229 192 -1.66666666666667e-01 229 410 3.33333333333333e-01 229 98 -3.33333333333333e-01 229 338 1.66666666666667e-01 229 409 -5.00000000000000e-01 229 211 -5.00000000000000e-01 229 408 -1.66666666666667e-01 229 96 1.66666666666667e-01 230 230 5.00000000000000e+00 230 337 1.66666666666667e-01 230 232 -1.66666666666667e-01 230 451 -1.66666666666667e-01 230 412 1.66666666666667e-01 230 231 3.33333333333333e-01 230 411 -3.33333333333333e-01 230 450 -1.66666666666667e-01 230 233 -5.00000000000000e-01 230 216 3.33333333333333e-01 230 199 1.66666666666667e-01 230 198 -3.33333333333333e-01 230 218 -1.50000000000000e+00 230 217 3.33333333333333e-01 230 15 1.66666666666667e-01 230 335 -5.00000000000000e-01 230 334 3.33333333333333e-01 230 333 -1.66666666666667e-01 230 96 1.66666666666667e-01 230 211 -1.66666666666667e-01 230 229 -6.66666666666667e-01 230 222 -1.66666666666667e-01 230 193 -1.66666666666667e-01 230 205 1.66666666666667e-01 230 192 -1.66666666666667e-01 230 204 1.66666666666667e-01 230 224 -5.00000000000000e-01 230 16 -3.33333333333333e-01 230 223 3.33333333333333e-01 230 336 1.66666666666667e-01 230 410 -1.50000000000000e+00 230 212 -5.00000000000000e-01 230 409 3.33333333333333e-01 230 97 -3.33333333333333e-01 230 228 -6.66666666666667e-01 230 408 3.33333333333333e-01 230 210 3.33333333333333e-01 231 231 5.00000000000000e+00 231 337 3.33333333333333e-01 231 336 -5.00000000000000e-01 231 218 -3.33333333333333e-01 231 217 1.66666666666667e-01 231 230 3.33333333333333e-01 231 451 1.66666666666667e-01 231 229 3.33333333333333e-01 231 228 -1.50000000000000e+00 231 452 1.66666666666667e-01 231 220 -1.66666666666667e-01 231 221 3.33333333333333e-01 231 233 -6.66666666666667e-01 231 17 -1.66666666666667e-01 231 219 -5.00000000000000e-01 231 344 1.66666666666667e-01 231 101 -1.66666666666667e-01 231 343 -3.33333333333333e-01 231 215 1.66666666666667e-01 231 250 3.33333333333333e-01 231 232 -6.66666666666667e-01 231 251 3.33333333333333e-01 231 100 -1.66666666666667e-01 231 249 -1.50000000000000e+00 231 214 1.66666666666667e-01 231 16 -1.66666666666667e-01 231 227 -1.66666666666667e-01 231 224 1.66666666666667e-01 231 418 1.66666666666667e-01 231 412 -1.66666666666667e-01 231 223 -3.33333333333333e-01 231 226 3.33333333333333e-01 231 225 -5.00000000000000e-01 231 413 3.33333333333333e-01 231 419 -3.33333333333333e-01 231 411 -5.00000000000000e-01 231 338 -1.66666666666667e-01 232 232 5.00000000000000e+00 232 336 3.33333333333333e-01 232 338 3.33333333333333e-01 232 337 -1.50000000000000e+00 232 216 1.66666666666667e-01 232 230 -1.66666666666667e-01 232 450 1.66666666666667e-01 232 229 -5.00000000000000e-01 232 228 3.33333333333333e-01 232 452 -3.33333333333333e-01 232 219 -1.66666666666667e-01 232 344 1.66666666666667e-01 232 221 3.33333333333333e-01 232 220 -5.00000000000000e-01 232 342 -3.33333333333333e-01 232 251 -1.66666666666667e-01 232 249 3.33333333333333e-01 232 231 -6.66666666666667e-01 232 250 -5.00000000000000e-01 232 99 -1.66666666666667e-01 232 215 -3.33333333333333e-01 232 213 1.66666666666667e-01 232 15 -1.66666666666667e-01 232 227 3.33333333333333e-01 232 233 -6.66666666666667e-01 232 413 3.33333333333333e-01 232 417 1.66666666666667e-01 232 411 -1.66666666666667e-01 232 224 1.66666666666667e-01 232 17 -1.66666666666667e-01 232 226 -1.50000000000000e+00 232 222 -3.33333333333333e-01 232 225 3.33333333333333e-01 232 419 1.66666666666667e-01 232 101 -1.66666666666667e-01 232 412 -5.00000000000000e-01 232 218 1.66666666666667e-01 233 233 5.00000000000000e+00 233 217 1.66666666666667e-01 233 338 -5.00000000000000e-01 233 337 3.33333333333333e-01 233 216 -3.33333333333333e-01 233 229 -1.66666666666667e-01 233 228 3.33333333333333e-01 233 230 -5.00000000000000e-01 233 451 -3.33333333333333e-01 233 450 1.66666666666667e-01 233 343 1.66666666666667e-01 233 219 3.33333333333333e-01 233 231 -6.66666666666667e-01 233 221 -1.50000000000000e+00 233 220 3.33333333333333e-01 233 15 -1.66666666666667e-01 233 342 1.66666666666667e-01 233 99 -1.66666666666667e-01 233 250 -1.66666666666667e-01 233 213 1.66666666666667e-01 233 251 -5.00000000000000e-01 233 249 3.33333333333333e-01 233 214 -3.33333333333333e-01 233 225 -1.66666666666667e-01 233 222 1.66666666666667e-01 233 226 3.33333333333333e-01 233 232 -6.66666666666667e-01 233 412 3.33333333333333e-01 233 227 -5.00000000000000e-01 233 223 1.66666666666667e-01 233 16 -1.66666666666667e-01 233 413 -1.50000000000000e+00 233 336 -1.66666666666667e-01 233 418 1.66666666666667e-01 233 100 -1.66666666666667e-01 233 411 3.33333333333333e-01 233 417 -3.33333333333333e-01 234 234 1.50000000000000e+00 234 22 8.33333333333333e-02 234 259 -1.66666666666667e-01 234 242 -8.33333333333333e-02 234 235 -1.66666666666667e-01 234 241 1.66666666666667e-01 234 19 8.33333333333333e-02 234 240 -2.50000000000000e-01 234 272 -1.66666666666667e-01 234 254 1.66666666666667e-01 234 23 8.33333333333333e-02 234 266 -1.66666666666667e-01 234 265 8.33333333333333e-02 234 271 -1.66666666666667e-01 234 21 -5.00000000000000e-01 234 236 -1.66666666666667e-01 234 248 1.66666666666667e-01 234 20 8.33333333333333e-02 234 247 -8.33333333333333e-02 234 253 1.66666666666667e-01 234 260 8.33333333333333e-02 234 246 -2.50000000000000e-01 234 18 -5.00000000000000e-01 235 235 1.33333333333333e+00 235 21 8.33333333333333e-02 235 258 -1.66666666666667e-01 235 242 1.66666666666667e-01 235 241 -7.50000000000000e-01 235 234 -1.66666666666667e-01 235 240 1.66666666666667e-01 235 18 8.33333333333333e-02 235 266 8.33333333333333e-02 235 272 -1.66666666666667e-01 235 22 -1.66666666666667e-01 235 264 8.33333333333333e-02 235 270 -1.66666666666667e-01 235 248 1.66666666666667e-01 235 254 -3.33333333333333e-01 235 260 8.33333333333333e-02 235 247 -2.50000000000000e-01 235 19 -1.66666666666667e-01 235 246 -8.33333333333333e-02 235 252 1.66666666666667e-01 236 236 1.33333333333333e+00 236 258 8.33333333333333e-02 236 242 -2.50000000000000e-01 236 241 1.66666666666667e-01 236 240 -8.33333333333333e-02 236 265 8.33333333333333e-02 236 271 -1.66666666666667e-01 236 270 -1.66666666666667e-01 236 252 1.66666666666667e-01 236 23 -1.66666666666667e-01 236 21 8.33333333333333e-02 236 264 -1.66666666666667e-01 236 259 8.33333333333333e-02 236 248 -7.50000000000000e-01 236 20 -1.66666666666667e-01 236 247 1.66666666666667e-01 236 253 -3.33333333333333e-01 236 234 -1.66666666666667e-01 236 246 1.66666666666667e-01 236 18 8.33333333333333e-02 237 237 2.50000000000000e+00 237 340 -1.66666666666667e-01 237 242 1.66666666666667e-01 237 241 1.66666666666667e-01 237 240 -7.50000000000000e-01 237 347 -1.66666666666667e-01 237 346 -1.66666666666667e-01 237 254 -3.33333333333333e-01 237 253 1.66666666666667e-01 237 221 1.66666666666667e-01 237 239 -3.33333333333333e-01 237 251 3.33333333333333e-01 237 343 1.66666666666667e-01 237 250 -1.66666666666667e-01 237 20 -8.33333333333333e-02 237 215 8.33333333333333e-02 237 19 1.66666666666667e-01 237 214 -1.66666666666667e-01 237 18 -2.50000000000000e-01 237 249 -5.00000000000000e-01 237 47 -8.33333333333333e-02 237 344 1.66666666666667e-01 237 238 -3.33333333333333e-01 237 46 1.66666666666667e-01 237 220 1.66666666666667e-01 237 341 8.33333333333333e-02 237 45 -2.50000000000000e-01 237 219 -7.50000000000000e-01 238 238 2.50000000000000e+00 238 339 -1.66666666666667e-01 238 242 -8.33333333333333e-02 238 241 -2.50000000000000e-01 238 240 1.66666666666667e-01 238 347 -1.66666666666667e-01 238 254 1.66666666666667e-01 238 345 -1.66666666666667e-01 238 252 1.66666666666667e-01 238 221 -8.33333333333333e-02 238 215 8.33333333333333e-02 238 342 1.66666666666667e-01 238 249 -1.66666666666667e-01 238 20 1.66666666666667e-01 238 239 -3.33333333333333e-01 238 251 3.33333333333333e-01 238 19 -7.50000000000000e-01 238 250 -5.00000000000000e-01 238 18 1.66666666666667e-01 238 213 -1.66666666666667e-01 238 47 1.66666666666667e-01 238 344 -3.33333333333333e-01 238 341 8.33333333333333e-02 238 46 -7.50000000000000e-01 238 220 -2.50000000000000e-01 238 237 -3.33333333333333e-01 238 45 1.66666666666667e-01 238 219 1.66666666666667e-01 239 239 2.50000000000000e+00 239 340 8.33333333333333e-02 239 242 -2.50000000000000e-01 239 241 -8.33333333333333e-02 239 240 1.66666666666667e-01 239 345 -1.66666666666667e-01 239 346 -1.66666666666667e-01 239 253 1.66666666666667e-01 239 252 -3.33333333333333e-01 239 220 -8.33333333333333e-02 239 214 8.33333333333333e-02 239 219 1.66666666666667e-01 239 237 -3.33333333333333e-01 239 249 3.33333333333333e-01 239 20 -2.50000000000000e-01 239 251 -1.50000000000000e+00 239 19 1.66666666666667e-01 239 238 -3.33333333333333e-01 239 250 3.33333333333333e-01 239 18 -8.33333333333333e-02 239 213 8.33333333333333e-02 239 339 8.33333333333333e-02 239 47 -2.50000000000000e-01 239 221 -2.50000000000000e-01 239 46 1.66666666666667e-01 239 343 -3.33333333333333e-01 239 45 -8.33333333333333e-02 239 342 1.66666666666667e-01 240 240 2.50000000000000e+00 240 346 1.66666666666667e-01 240 347 1.66666666666667e-01 240 340 1.66666666666667e-01 240 339 -2.50000000000000e-01 240 242 -3.33333333333333e-01 240 239 1.66666666666667e-01 240 238 1.66666666666667e-01 240 237 -7.50000000000000e-01 240 253 -1.66666666666667e-01 240 241 -3.33333333333333e-01 240 260 1.66666666666667e-01 240 352 -1.66666666666667e-01 240 271 1.66666666666667e-01 240 254 3.33333333333333e-01 240 272 -3.33333333333333e-01 240 50 8.33333333333333e-02 240 353 -1.66666666666667e-01 240 259 1.66666666666667e-01 240 49 -1.66666666666667e-01 240 258 -7.50000000000000e-01 240 236 -8.33333333333333e-02 240 20 8.33333333333333e-02 240 235 1.66666666666667e-01 240 19 -1.66666666666667e-01 240 234 -2.50000000000000e-01 240 341 -8.33333333333333e-02 240 252 -5.00000000000000e-01 241 241 2.50000000000000e+00 241 345 1.66666666666667e-01 241 347 -3.33333333333333e-01 241 50 8.33333333333333e-02 241 340 -7.50000000000000e-01 241 339 1.66666666666667e-01 241 239 -8.33333333333333e-02 241 20 8.33333333333333e-02 241 238 -2.50000000000000e-01 241 237 1.66666666666667e-01 241 252 -1.66666666666667e-01 241 260 -8.33333333333333e-02 241 240 -3.33333333333333e-01 241 351 -1.66666666666667e-01 241 270 1.66666666666667e-01 241 353 -1.66666666666667e-01 241 272 1.66666666666667e-01 241 259 -2.50000000000000e-01 241 258 1.66666666666667e-01 241 48 -1.66666666666667e-01 241 236 1.66666666666667e-01 241 242 -3.33333333333333e-01 241 254 3.33333333333333e-01 241 235 -7.50000000000000e-01 241 341 1.66666666666667e-01 241 253 -5.00000000000000e-01 241 234 1.66666666666667e-01 241 18 -1.66666666666667e-01 242 242 2.50000000000000e+00 242 340 1.66666666666667e-01 242 346 -3.33333333333333e-01 242 345 1.66666666666667e-01 242 341 -2.50000000000000e-01 242 49 8.33333333333333e-02 242 239 -2.50000000000000e-01 242 238 -8.33333333333333e-02 242 19 8.33333333333333e-02 242 240 -3.33333333333333e-01 242 237 1.66666666666667e-01 242 259 -8.33333333333333e-02 242 258 1.66666666666667e-01 242 352 -1.66666666666667e-01 242 271 1.66666666666667e-01 242 252 3.33333333333333e-01 242 270 -3.33333333333333e-01 242 260 -2.50000000000000e-01 242 48 8.33333333333333e-02 242 351 -1.66666666666667e-01 242 236 -2.50000000000000e-01 242 339 -8.33333333333333e-02 242 254 -1.50000000000000e+00 242 235 1.66666666666667e-01 242 241 -3.33333333333333e-01 242 253 3.33333333333333e-01 242 234 -8.33333333333333e-02 242 18 8.33333333333333e-02 243 243 2.50000000000000e+00 243 422 -1.66666666666667e-01 243 415 8.33333333333333e-02 243 421 -1.66666666666667e-01 243 416 -1.66666666666667e-01 243 248 1.66666666666667e-01 243 247 1.66666666666667e-01 243 253 -3.33333333333333e-01 243 246 -7.50000000000000e-01 243 419 1.66666666666667e-01 243 251 -1.66666666666667e-01 243 244 -3.33333333333333e-01 243 250 3.33333333333333e-01 243 226 1.66666666666667e-01 243 20 1.66666666666667e-01 243 215 -1.66666666666667e-01 243 19 -8.33333333333333e-02 243 214 8.33333333333333e-02 243 18 -2.50000000000000e-01 243 249 -5.00000000000000e-01 243 245 -3.33333333333333e-01 243 74 1.66666666666667e-01 243 227 1.66666666666667e-01 243 73 -8.33333333333333e-02 243 418 1.66666666666667e-01 243 254 1.66666666666667e-01 243 72 -2.50000000000000e-01 243 225 -7.50000000000000e-01 244 244 2.50000000000000e+00 244 420 -1.66666666666667e-01 244 416 8.33333333333333e-02 244 422 -1.66666666666667e-01 244 248 -8.33333333333333e-02 244 254 1.66666666666667e-01 244 247 -2.50000000000000e-01 244 246 1.66666666666667e-01 244 252 -3.33333333333333e-01 244 215 8.33333333333333e-02 244 227 -8.33333333333333e-02 244 243 -3.33333333333333e-01 244 249 3.33333333333333e-01 244 225 1.66666666666667e-01 244 20 1.66666666666667e-01 244 245 -3.33333333333333e-01 244 251 3.33333333333333e-01 244 19 -2.50000000000000e-01 244 250 -1.50000000000000e+00 244 18 -8.33333333333333e-02 244 213 8.33333333333333e-02 244 74 1.66666666666667e-01 244 419 -3.33333333333333e-01 244 414 8.33333333333333e-02 244 73 -2.50000000000000e-01 244 226 -2.50000000000000e-01 244 72 -8.33333333333333e-02 244 417 1.66666666666667e-01 245 245 2.50000000000000e+00 245 420 -1.66666666666667e-01 245 415 8.33333333333333e-02 245 421 -1.66666666666667e-01 245 414 -1.66666666666667e-01 245 248 -2.50000000000000e-01 245 247 -8.33333333333333e-02 245 253 1.66666666666667e-01 245 246 1.66666666666667e-01 245 417 1.66666666666667e-01 245 249 -1.66666666666667e-01 245 214 8.33333333333333e-02 245 226 -8.33333333333333e-02 245 20 -7.50000000000000e-01 245 251 -5.00000000000000e-01 245 19 1.66666666666667e-01 245 244 -3.33333333333333e-01 245 250 3.33333333333333e-01 245 18 1.66666666666667e-01 245 213 -1.66666666666667e-01 245 252 1.66666666666667e-01 245 74 -7.50000000000000e-01 245 227 -2.50000000000000e-01 245 73 1.66666666666667e-01 245 418 -3.33333333333333e-01 245 243 -3.33333333333333e-01 245 72 1.66666666666667e-01 245 225 1.66666666666667e-01 246 246 2.50000000000000e+00 246 272 1.66666666666667e-01 246 271 -3.33333333333333e-01 246 266 1.66666666666667e-01 246 76 8.33333333333333e-02 246 264 -7.50000000000000e-01 246 236 1.66666666666667e-01 246 235 -8.33333333333333e-02 246 19 8.33333333333333e-02 246 234 -2.50000000000000e-01 246 254 -1.66666666666667e-01 246 248 -3.33333333333333e-01 246 415 -8.33333333333333e-02 246 428 -1.66666666666667e-01 246 422 1.66666666666667e-01 246 427 -1.66666666666667e-01 246 421 1.66666666666667e-01 246 416 1.66666666666667e-01 246 77 -1.66666666666667e-01 246 414 -2.50000000000000e-01 246 245 1.66666666666667e-01 246 20 -1.66666666666667e-01 246 244 1.66666666666667e-01 246 247 -3.33333333333333e-01 246 253 3.33333333333333e-01 246 243 -7.50000000000000e-01 246 265 1.66666666666667e-01 246 252 -5.00000000000000e-01 247 247 2.50000000000000e+00 247 272 1.66666666666667e-01 247 264 1.66666666666667e-01 247 270 -3.33333333333333e-01 247 265 -2.50000000000000e-01 247 75 8.33333333333333e-02 247 236 1.66666666666667e-01 247 248 -3.33333333333333e-01 247 235 -2.50000000000000e-01 247 234 -8.33333333333333e-02 247 18 8.33333333333333e-02 247 414 -8.33333333333333e-02 247 416 1.66666666666667e-01 247 254 3.33333333333333e-01 247 422 -3.33333333333333e-01 247 426 -1.66666666666667e-01 247 420 1.66666666666667e-01 247 77 8.33333333333333e-02 247 428 -1.66666666666667e-01 247 415 -2.50000000000000e-01 247 245 -8.33333333333333e-02 247 20 8.33333333333333e-02 247 244 -2.50000000000000e-01 247 266 -8.33333333333333e-02 247 253 -1.50000000000000e+00 247 243 1.66666666666667e-01 247 246 -3.33333333333333e-01 247 252 3.33333333333333e-01 248 248 2.50000000000000e+00 248 271 1.66666666666667e-01 248 270 1.66666666666667e-01 248 266 -2.50000000000000e-01 248 264 1.66666666666667e-01 248 236 -7.50000000000000e-01 248 235 1.66666666666667e-01 248 247 -3.33333333333333e-01 248 234 1.66666666666667e-01 248 252 -1.66666666666667e-01 248 246 -3.33333333333333e-01 248 415 1.66666666666667e-01 248 426 -1.66666666666667e-01 248 420 1.66666666666667e-01 248 253 3.33333333333333e-01 248 421 -3.33333333333333e-01 248 416 -7.50000000000000e-01 248 76 8.33333333333333e-02 248 427 -1.66666666666667e-01 248 414 1.66666666666667e-01 248 75 -1.66666666666667e-01 248 245 -2.50000000000000e-01 248 265 -8.33333333333333e-02 248 254 -5.00000000000000e-01 248 244 -8.33333333333333e-02 248 19 8.33333333333333e-02 248 243 1.66666666666667e-01 248 18 -1.66666666666667e-01 249 249 5.00000000000000e+00 249 346 -3.33333333333333e-01 249 254 3.33333333333333e-01 249 422 -3.33333333333333e-01 249 454 -1.66666666666667e-01 249 421 1.66666666666667e-01 249 455 -1.66666666666667e-01 249 253 3.33333333333333e-01 249 252 -1.50000000000000e+00 249 239 3.33333333333333e-01 249 220 1.66666666666667e-01 249 238 -1.66666666666667e-01 249 221 -3.33333333333333e-01 249 20 1.66666666666667e-01 249 237 -5.00000000000000e-01 249 344 -1.66666666666667e-01 249 101 1.66666666666667e-01 249 250 -6.66666666666667e-01 249 343 3.33333333333333e-01 249 342 -5.00000000000000e-01 249 245 -1.66666666666667e-01 249 244 3.33333333333333e-01 249 215 -1.66666666666667e-01 249 227 1.66666666666667e-01 249 232 3.33333333333333e-01 249 226 -3.33333333333333e-01 249 19 1.66666666666667e-01 249 214 -1.66666666666667e-01 249 243 -5.00000000000000e-01 249 251 -6.66666666666667e-01 249 419 3.33333333333333e-01 249 233 3.33333333333333e-01 249 418 -1.66666666666667e-01 249 100 1.66666666666667e-01 249 347 1.66666666666667e-01 249 417 -5.00000000000000e-01 249 231 -1.50000000000000e+00 250 250 5.00000000000000e+00 250 345 -3.33333333333333e-01 250 254 -1.66666666666667e-01 250 455 -1.66666666666667e-01 250 422 1.66666666666667e-01 250 453 -1.66666666666667e-01 250 420 1.66666666666667e-01 250 253 -5.00000000000000e-01 250 252 3.33333333333333e-01 250 219 1.66666666666667e-01 250 237 -1.66666666666667e-01 250 221 1.66666666666667e-01 250 239 3.33333333333333e-01 250 238 -5.00000000000000e-01 250 344 3.33333333333333e-01 250 343 -1.50000000000000e+00 250 249 -6.66666666666667e-01 250 342 3.33333333333333e-01 250 233 -1.66666666666667e-01 250 251 -6.66666666666667e-01 250 215 -1.66666666666667e-01 250 227 1.66666666666667e-01 250 243 3.33333333333333e-01 250 231 3.33333333333333e-01 250 225 -3.33333333333333e-01 250 20 -3.33333333333333e-01 250 245 3.33333333333333e-01 250 244 -1.50000000000000e+00 250 18 1.66666666666667e-01 250 213 -1.66666666666667e-01 250 419 3.33333333333333e-01 250 101 -3.33333333333333e-01 250 347 1.66666666666667e-01 250 418 -5.00000000000000e-01 250 232 -5.00000000000000e-01 250 417 -1.66666666666667e-01 250 99 1.66666666666667e-01 251 251 5.00000000000000e+00 251 346 1.66666666666667e-01 251 253 -1.66666666666667e-01 251 454 -1.66666666666667e-01 251 421 1.66666666666667e-01 251 252 3.33333333333333e-01 251 420 -3.33333333333333e-01 251 453 -1.66666666666667e-01 251 254 -5.00000000000000e-01 251 237 3.33333333333333e-01 251 220 1.66666666666667e-01 251 219 -3.33333333333333e-01 251 239 -1.50000000000000e+00 251 238 3.33333333333333e-01 251 18 1.66666666666667e-01 251 344 -5.00000000000000e-01 251 343 3.33333333333333e-01 251 342 -1.66666666666667e-01 251 99 1.66666666666667e-01 251 232 -1.66666666666667e-01 251 250 -6.66666666666667e-01 251 243 -1.66666666666667e-01 251 214 -1.66666666666667e-01 251 226 1.66666666666667e-01 251 213 -1.66666666666667e-01 251 225 1.66666666666667e-01 251 245 -5.00000000000000e-01 251 19 -3.33333333333333e-01 251 244 3.33333333333333e-01 251 345 1.66666666666667e-01 251 419 -1.50000000000000e+00 251 233 -5.00000000000000e-01 251 418 3.33333333333333e-01 251 100 -3.33333333333333e-01 251 249 -6.66666666666667e-01 251 417 3.33333333333333e-01 251 231 3.33333333333333e-01 252 252 5.00000000000000e+00 252 346 3.33333333333333e-01 252 345 -5.00000000000000e-01 252 239 -3.33333333333333e-01 252 238 1.66666666666667e-01 252 251 3.33333333333333e-01 252 454 1.66666666666667e-01 252 250 3.33333333333333e-01 252 249 -1.50000000000000e+00 252 455 1.66666666666667e-01 252 241 -1.66666666666667e-01 252 242 3.33333333333333e-01 252 254 -6.66666666666667e-01 252 20 -1.66666666666667e-01 252 240 -5.00000000000000e-01 252 353 1.66666666666667e-01 252 104 -1.66666666666667e-01 252 352 -3.33333333333333e-01 252 236 1.66666666666667e-01 252 271 3.33333333333333e-01 252 253 -6.66666666666667e-01 252 272 3.33333333333333e-01 252 103 -1.66666666666667e-01 252 270 -1.50000000000000e+00 252 235 1.66666666666667e-01 252 19 -1.66666666666667e-01 252 248 -1.66666666666667e-01 252 245 1.66666666666667e-01 252 427 1.66666666666667e-01 252 421 -1.66666666666667e-01 252 244 -3.33333333333333e-01 252 247 3.33333333333333e-01 252 246 -5.00000000000000e-01 252 422 3.33333333333333e-01 252 428 -3.33333333333333e-01 252 420 -5.00000000000000e-01 252 347 -1.66666666666667e-01 253 253 5.00000000000000e+00 253 345 3.33333333333333e-01 253 347 3.33333333333333e-01 253 346 -1.50000000000000e+00 253 237 1.66666666666667e-01 253 251 -1.66666666666667e-01 253 453 1.66666666666667e-01 253 250 -5.00000000000000e-01 253 249 3.33333333333333e-01 253 455 -3.33333333333333e-01 253 240 -1.66666666666667e-01 253 353 1.66666666666667e-01 253 242 3.33333333333333e-01 253 241 -5.00000000000000e-01 253 351 -3.33333333333333e-01 253 272 -1.66666666666667e-01 253 270 3.33333333333333e-01 253 252 -6.66666666666667e-01 253 271 -5.00000000000000e-01 253 102 -1.66666666666667e-01 253 236 -3.33333333333333e-01 253 234 1.66666666666667e-01 253 18 -1.66666666666667e-01 253 248 3.33333333333333e-01 253 254 -6.66666666666667e-01 253 422 3.33333333333333e-01 253 426 1.66666666666667e-01 253 420 -1.66666666666667e-01 253 245 1.66666666666667e-01 253 20 -1.66666666666667e-01 253 247 -1.50000000000000e+00 253 243 -3.33333333333333e-01 253 246 3.33333333333333e-01 253 428 1.66666666666667e-01 253 104 -1.66666666666667e-01 253 421 -5.00000000000000e-01 253 239 1.66666666666667e-01 254 254 5.00000000000000e+00 254 238 1.66666666666667e-01 254 347 -5.00000000000000e-01 254 346 3.33333333333333e-01 254 237 -3.33333333333333e-01 254 250 -1.66666666666667e-01 254 249 3.33333333333333e-01 254 251 -5.00000000000000e-01 254 454 -3.33333333333333e-01 254 453 1.66666666666667e-01 254 352 1.66666666666667e-01 254 240 3.33333333333333e-01 254 252 -6.66666666666667e-01 254 242 -1.50000000000000e+00 254 241 3.33333333333333e-01 254 18 -1.66666666666667e-01 254 351 1.66666666666667e-01 254 102 -1.66666666666667e-01 254 271 -1.66666666666667e-01 254 234 1.66666666666667e-01 254 272 -5.00000000000000e-01 254 270 3.33333333333333e-01 254 235 -3.33333333333333e-01 254 246 -1.66666666666667e-01 254 243 1.66666666666667e-01 254 247 3.33333333333333e-01 254 253 -6.66666666666667e-01 254 421 3.33333333333333e-01 254 248 -5.00000000000000e-01 254 244 1.66666666666667e-01 254 19 -1.66666666666667e-01 254 422 -1.50000000000000e+00 254 345 -1.66666666666667e-01 254 427 1.66666666666667e-01 254 103 -1.66666666666667e-01 254 420 3.33333333333333e-01 254 426 -3.33333333333333e-01 255 255 1.50000000000000e+00 255 25 8.33333333333333e-02 255 277 -1.66666666666667e-01 255 263 -8.33333333333333e-02 255 256 -1.66666666666667e-01 255 262 1.66666666666667e-01 255 22 8.33333333333333e-02 255 261 -2.50000000000000e-01 255 284 -1.66666666666667e-01 255 275 1.66666666666667e-01 255 26 8.33333333333333e-02 255 281 -1.66666666666667e-01 255 280 8.33333333333333e-02 255 283 -1.66666666666667e-01 255 24 -5.00000000000000e-01 255 257 -1.66666666666667e-01 255 269 1.66666666666667e-01 255 23 8.33333333333333e-02 255 268 -8.33333333333333e-02 255 274 1.66666666666667e-01 255 278 8.33333333333333e-02 255 267 -2.50000000000000e-01 255 21 -5.00000000000000e-01 256 256 1.33333333333333e+00 256 24 8.33333333333333e-02 256 276 -1.66666666666667e-01 256 263 1.66666666666667e-01 256 262 -7.50000000000000e-01 256 255 -1.66666666666667e-01 256 261 1.66666666666667e-01 256 21 8.33333333333333e-02 256 281 8.33333333333333e-02 256 284 -1.66666666666667e-01 256 25 -1.66666666666667e-01 256 279 8.33333333333333e-02 256 282 -1.66666666666667e-01 256 269 1.66666666666667e-01 256 275 -3.33333333333333e-01 256 278 8.33333333333333e-02 256 268 -2.50000000000000e-01 256 22 -1.66666666666667e-01 256 267 -8.33333333333333e-02 256 273 1.66666666666667e-01 257 257 1.33333333333333e+00 257 276 8.33333333333333e-02 257 263 -2.50000000000000e-01 257 262 1.66666666666667e-01 257 261 -8.33333333333333e-02 257 280 8.33333333333333e-02 257 283 -1.66666666666667e-01 257 282 -1.66666666666667e-01 257 273 1.66666666666667e-01 257 26 -1.66666666666667e-01 257 24 8.33333333333333e-02 257 279 -1.66666666666667e-01 257 277 8.33333333333333e-02 257 269 -7.50000000000000e-01 257 23 -1.66666666666667e-01 257 268 1.66666666666667e-01 257 274 -3.33333333333333e-01 257 255 -1.66666666666667e-01 257 267 1.66666666666667e-01 257 21 8.33333333333333e-02 258 258 2.50000000000000e+00 258 349 -1.66666666666667e-01 258 263 1.66666666666667e-01 258 262 1.66666666666667e-01 258 261 -7.50000000000000e-01 258 356 -1.66666666666667e-01 258 355 -1.66666666666667e-01 258 275 -3.33333333333333e-01 258 274 1.66666666666667e-01 258 242 1.66666666666667e-01 258 260 -3.33333333333333e-01 258 272 3.33333333333333e-01 258 352 1.66666666666667e-01 258 271 -1.66666666666667e-01 258 23 -8.33333333333333e-02 258 236 8.33333333333333e-02 258 22 1.66666666666667e-01 258 235 -1.66666666666667e-01 258 21 -2.50000000000000e-01 258 270 -5.00000000000000e-01 258 50 -8.33333333333333e-02 258 353 1.66666666666667e-01 258 259 -3.33333333333333e-01 258 49 1.66666666666667e-01 258 241 1.66666666666667e-01 258 350 8.33333333333333e-02 258 48 -2.50000000000000e-01 258 240 -7.50000000000000e-01 259 259 2.50000000000000e+00 259 348 -1.66666666666667e-01 259 263 -8.33333333333333e-02 259 262 -2.50000000000000e-01 259 261 1.66666666666667e-01 259 356 -1.66666666666667e-01 259 275 1.66666666666667e-01 259 354 -1.66666666666667e-01 259 273 1.66666666666667e-01 259 242 -8.33333333333333e-02 259 236 8.33333333333333e-02 259 351 1.66666666666667e-01 259 270 -1.66666666666667e-01 259 23 1.66666666666667e-01 259 260 -3.33333333333333e-01 259 272 3.33333333333333e-01 259 22 -7.50000000000000e-01 259 271 -5.00000000000000e-01 259 21 1.66666666666667e-01 259 234 -1.66666666666667e-01 259 50 1.66666666666667e-01 259 353 -3.33333333333333e-01 259 350 8.33333333333333e-02 259 49 -7.50000000000000e-01 259 241 -2.50000000000000e-01 259 258 -3.33333333333333e-01 259 48 1.66666666666667e-01 259 240 1.66666666666667e-01 260 260 2.50000000000000e+00 260 349 8.33333333333333e-02 260 263 -2.50000000000000e-01 260 262 -8.33333333333333e-02 260 261 1.66666666666667e-01 260 354 -1.66666666666667e-01 260 355 -1.66666666666667e-01 260 274 1.66666666666667e-01 260 273 -3.33333333333333e-01 260 241 -8.33333333333333e-02 260 235 8.33333333333333e-02 260 240 1.66666666666667e-01 260 258 -3.33333333333333e-01 260 270 3.33333333333333e-01 260 23 -2.50000000000000e-01 260 272 -1.50000000000000e+00 260 22 1.66666666666667e-01 260 259 -3.33333333333333e-01 260 271 3.33333333333333e-01 260 21 -8.33333333333333e-02 260 234 8.33333333333333e-02 260 348 8.33333333333333e-02 260 50 -2.50000000000000e-01 260 242 -2.50000000000000e-01 260 49 1.66666666666667e-01 260 352 -3.33333333333333e-01 260 48 -8.33333333333333e-02 260 351 1.66666666666667e-01 261 261 2.50000000000000e+00 261 355 1.66666666666667e-01 261 356 1.66666666666667e-01 261 349 1.66666666666667e-01 261 348 -2.50000000000000e-01 261 263 -3.33333333333333e-01 261 260 1.66666666666667e-01 261 259 1.66666666666667e-01 261 258 -7.50000000000000e-01 261 274 -1.66666666666667e-01 261 262 -3.33333333333333e-01 261 278 1.66666666666667e-01 261 358 -1.66666666666667e-01 261 283 1.66666666666667e-01 261 275 3.33333333333333e-01 261 284 -3.33333333333333e-01 261 53 8.33333333333333e-02 261 359 -1.66666666666667e-01 261 277 1.66666666666667e-01 261 52 -1.66666666666667e-01 261 276 -7.50000000000000e-01 261 257 -8.33333333333333e-02 261 23 8.33333333333333e-02 261 256 1.66666666666667e-01 261 22 -1.66666666666667e-01 261 255 -2.50000000000000e-01 261 350 -8.33333333333333e-02 261 273 -5.00000000000000e-01 262 262 2.50000000000000e+00 262 354 1.66666666666667e-01 262 356 -3.33333333333333e-01 262 53 8.33333333333333e-02 262 349 -7.50000000000000e-01 262 348 1.66666666666667e-01 262 260 -8.33333333333333e-02 262 23 8.33333333333333e-02 262 259 -2.50000000000000e-01 262 258 1.66666666666667e-01 262 273 -1.66666666666667e-01 262 278 -8.33333333333333e-02 262 261 -3.33333333333333e-01 262 357 -1.66666666666667e-01 262 282 1.66666666666667e-01 262 359 -1.66666666666667e-01 262 284 1.66666666666667e-01 262 277 -2.50000000000000e-01 262 276 1.66666666666667e-01 262 51 -1.66666666666667e-01 262 257 1.66666666666667e-01 262 263 -3.33333333333333e-01 262 275 3.33333333333333e-01 262 256 -7.50000000000000e-01 262 350 1.66666666666667e-01 262 274 -5.00000000000000e-01 262 255 1.66666666666667e-01 262 21 -1.66666666666667e-01 263 263 2.50000000000000e+00 263 349 1.66666666666667e-01 263 355 -3.33333333333333e-01 263 354 1.66666666666667e-01 263 350 -2.50000000000000e-01 263 52 8.33333333333333e-02 263 260 -2.50000000000000e-01 263 259 -8.33333333333333e-02 263 22 8.33333333333333e-02 263 261 -3.33333333333333e-01 263 258 1.66666666666667e-01 263 277 -8.33333333333333e-02 263 276 1.66666666666667e-01 263 358 -1.66666666666667e-01 263 283 1.66666666666667e-01 263 273 3.33333333333333e-01 263 282 -3.33333333333333e-01 263 278 -2.50000000000000e-01 263 51 8.33333333333333e-02 263 357 -1.66666666666667e-01 263 257 -2.50000000000000e-01 263 348 -8.33333333333333e-02 263 275 -1.50000000000000e+00 263 256 1.66666666666667e-01 263 262 -3.33333333333333e-01 263 274 3.33333333333333e-01 263 255 -8.33333333333333e-02 263 21 8.33333333333333e-02 264 264 2.50000000000000e+00 264 431 -1.66666666666667e-01 264 424 8.33333333333333e-02 264 430 -1.66666666666667e-01 264 425 -1.66666666666667e-01 264 269 1.66666666666667e-01 264 268 1.66666666666667e-01 264 274 -3.33333333333333e-01 264 267 -7.50000000000000e-01 264 428 1.66666666666667e-01 264 272 -1.66666666666667e-01 264 265 -3.33333333333333e-01 264 271 3.33333333333333e-01 264 247 1.66666666666667e-01 264 23 1.66666666666667e-01 264 236 -1.66666666666667e-01 264 22 -8.33333333333333e-02 264 235 8.33333333333333e-02 264 21 -2.50000000000000e-01 264 270 -5.00000000000000e-01 264 266 -3.33333333333333e-01 264 77 1.66666666666667e-01 264 248 1.66666666666667e-01 264 76 -8.33333333333333e-02 264 427 1.66666666666667e-01 264 275 1.66666666666667e-01 264 75 -2.50000000000000e-01 264 246 -7.50000000000000e-01 265 265 2.50000000000000e+00 265 429 -1.66666666666667e-01 265 425 8.33333333333333e-02 265 431 -1.66666666666667e-01 265 269 -8.33333333333333e-02 265 275 1.66666666666667e-01 265 268 -2.50000000000000e-01 265 267 1.66666666666667e-01 265 273 -3.33333333333333e-01 265 236 8.33333333333333e-02 265 248 -8.33333333333333e-02 265 264 -3.33333333333333e-01 265 270 3.33333333333333e-01 265 246 1.66666666666667e-01 265 23 1.66666666666667e-01 265 266 -3.33333333333333e-01 265 272 3.33333333333333e-01 265 22 -2.50000000000000e-01 265 271 -1.50000000000000e+00 265 21 -8.33333333333333e-02 265 234 8.33333333333333e-02 265 77 1.66666666666667e-01 265 428 -3.33333333333333e-01 265 423 8.33333333333333e-02 265 76 -2.50000000000000e-01 265 247 -2.50000000000000e-01 265 75 -8.33333333333333e-02 265 426 1.66666666666667e-01 266 266 2.50000000000000e+00 266 429 -1.66666666666667e-01 266 424 8.33333333333333e-02 266 430 -1.66666666666667e-01 266 423 -1.66666666666667e-01 266 269 -2.50000000000000e-01 266 268 -8.33333333333333e-02 266 274 1.66666666666667e-01 266 267 1.66666666666667e-01 266 426 1.66666666666667e-01 266 270 -1.66666666666667e-01 266 235 8.33333333333333e-02 266 247 -8.33333333333333e-02 266 23 -7.50000000000000e-01 266 272 -5.00000000000000e-01 266 22 1.66666666666667e-01 266 265 -3.33333333333333e-01 266 271 3.33333333333333e-01 266 21 1.66666666666667e-01 266 234 -1.66666666666667e-01 266 273 1.66666666666667e-01 266 77 -7.50000000000000e-01 266 248 -2.50000000000000e-01 266 76 1.66666666666667e-01 266 427 -3.33333333333333e-01 266 264 -3.33333333333333e-01 266 75 1.66666666666667e-01 266 246 1.66666666666667e-01 267 267 2.50000000000000e+00 267 284 1.66666666666667e-01 267 283 -3.33333333333333e-01 267 281 1.66666666666667e-01 267 79 8.33333333333333e-02 267 279 -7.50000000000000e-01 267 257 1.66666666666667e-01 267 256 -8.33333333333333e-02 267 22 8.33333333333333e-02 267 255 -2.50000000000000e-01 267 275 -1.66666666666667e-01 267 269 -3.33333333333333e-01 267 424 -8.33333333333333e-02 267 434 -1.66666666666667e-01 267 431 1.66666666666667e-01 267 433 -1.66666666666667e-01 267 430 1.66666666666667e-01 267 425 1.66666666666667e-01 267 80 -1.66666666666667e-01 267 423 -2.50000000000000e-01 267 266 1.66666666666667e-01 267 23 -1.66666666666667e-01 267 265 1.66666666666667e-01 267 268 -3.33333333333333e-01 267 274 3.33333333333333e-01 267 264 -7.50000000000000e-01 267 280 1.66666666666667e-01 267 273 -5.00000000000000e-01 268 268 2.50000000000000e+00 268 284 1.66666666666667e-01 268 279 1.66666666666667e-01 268 282 -3.33333333333333e-01 268 280 -2.50000000000000e-01 268 78 8.33333333333333e-02 268 257 1.66666666666667e-01 268 269 -3.33333333333333e-01 268 256 -2.50000000000000e-01 268 255 -8.33333333333333e-02 268 21 8.33333333333333e-02 268 423 -8.33333333333333e-02 268 425 1.66666666666667e-01 268 275 3.33333333333333e-01 268 431 -3.33333333333333e-01 268 432 -1.66666666666667e-01 268 429 1.66666666666667e-01 268 80 8.33333333333333e-02 268 434 -1.66666666666667e-01 268 424 -2.50000000000000e-01 268 266 -8.33333333333333e-02 268 23 8.33333333333333e-02 268 265 -2.50000000000000e-01 268 281 -8.33333333333333e-02 268 274 -1.50000000000000e+00 268 264 1.66666666666667e-01 268 267 -3.33333333333333e-01 268 273 3.33333333333333e-01 269 269 2.50000000000000e+00 269 283 1.66666666666667e-01 269 282 1.66666666666667e-01 269 281 -2.50000000000000e-01 269 279 1.66666666666667e-01 269 257 -7.50000000000000e-01 269 256 1.66666666666667e-01 269 268 -3.33333333333333e-01 269 255 1.66666666666667e-01 269 273 -1.66666666666667e-01 269 267 -3.33333333333333e-01 269 424 1.66666666666667e-01 269 432 -1.66666666666667e-01 269 429 1.66666666666667e-01 269 274 3.33333333333333e-01 269 430 -3.33333333333333e-01 269 425 -7.50000000000000e-01 269 79 8.33333333333333e-02 269 433 -1.66666666666667e-01 269 423 1.66666666666667e-01 269 78 -1.66666666666667e-01 269 266 -2.50000000000000e-01 269 280 -8.33333333333333e-02 269 275 -5.00000000000000e-01 269 265 -8.33333333333333e-02 269 22 8.33333333333333e-02 269 264 1.66666666666667e-01 269 21 -1.66666666666667e-01 270 270 5.00000000000000e+00 270 355 -3.33333333333333e-01 270 275 3.33333333333333e-01 270 431 -3.33333333333333e-01 270 457 -1.66666666666667e-01 270 430 1.66666666666667e-01 270 458 -1.66666666666667e-01 270 274 3.33333333333333e-01 270 273 -1.50000000000000e+00 270 260 3.33333333333333e-01 270 241 1.66666666666667e-01 270 259 -1.66666666666667e-01 270 242 -3.33333333333333e-01 270 23 1.66666666666667e-01 270 258 -5.00000000000000e-01 270 353 -1.66666666666667e-01 270 104 1.66666666666667e-01 270 271 -6.66666666666667e-01 270 352 3.33333333333333e-01 270 351 -5.00000000000000e-01 270 266 -1.66666666666667e-01 270 265 3.33333333333333e-01 270 236 -1.66666666666667e-01 270 248 1.66666666666667e-01 270 253 3.33333333333333e-01 270 247 -3.33333333333333e-01 270 22 1.66666666666667e-01 270 235 -1.66666666666667e-01 270 264 -5.00000000000000e-01 270 272 -6.66666666666667e-01 270 428 3.33333333333333e-01 270 254 3.33333333333333e-01 270 427 -1.66666666666667e-01 270 103 1.66666666666667e-01 270 356 1.66666666666667e-01 270 426 -5.00000000000000e-01 270 252 -1.50000000000000e+00 271 271 5.00000000000000e+00 271 354 -3.33333333333333e-01 271 275 -1.66666666666667e-01 271 458 -1.66666666666667e-01 271 431 1.66666666666667e-01 271 456 -1.66666666666667e-01 271 429 1.66666666666667e-01 271 274 -5.00000000000000e-01 271 273 3.33333333333333e-01 271 240 1.66666666666667e-01 271 258 -1.66666666666667e-01 271 242 1.66666666666667e-01 271 260 3.33333333333333e-01 271 259 -5.00000000000000e-01 271 353 3.33333333333333e-01 271 352 -1.50000000000000e+00 271 270 -6.66666666666667e-01 271 351 3.33333333333333e-01 271 254 -1.66666666666667e-01 271 272 -6.66666666666667e-01 271 236 -1.66666666666667e-01 271 248 1.66666666666667e-01 271 264 3.33333333333333e-01 271 252 3.33333333333333e-01 271 246 -3.33333333333333e-01 271 23 -3.33333333333333e-01 271 266 3.33333333333333e-01 271 265 -1.50000000000000e+00 271 21 1.66666666666667e-01 271 234 -1.66666666666667e-01 271 428 3.33333333333333e-01 271 104 -3.33333333333333e-01 271 356 1.66666666666667e-01 271 427 -5.00000000000000e-01 271 253 -5.00000000000000e-01 271 426 -1.66666666666667e-01 271 102 1.66666666666667e-01 272 272 5.00000000000000e+00 272 355 1.66666666666667e-01 272 274 -1.66666666666667e-01 272 457 -1.66666666666667e-01 272 430 1.66666666666667e-01 272 273 3.33333333333333e-01 272 429 -3.33333333333333e-01 272 456 -1.66666666666667e-01 272 275 -5.00000000000000e-01 272 258 3.33333333333333e-01 272 241 1.66666666666667e-01 272 240 -3.33333333333333e-01 272 260 -1.50000000000000e+00 272 259 3.33333333333333e-01 272 21 1.66666666666667e-01 272 353 -5.00000000000000e-01 272 352 3.33333333333333e-01 272 351 -1.66666666666667e-01 272 102 1.66666666666667e-01 272 253 -1.66666666666667e-01 272 271 -6.66666666666667e-01 272 264 -1.66666666666667e-01 272 235 -1.66666666666667e-01 272 247 1.66666666666667e-01 272 234 -1.66666666666667e-01 272 246 1.66666666666667e-01 272 266 -5.00000000000000e-01 272 22 -3.33333333333333e-01 272 265 3.33333333333333e-01 272 354 1.66666666666667e-01 272 428 -1.50000000000000e+00 272 254 -5.00000000000000e-01 272 427 3.33333333333333e-01 272 103 -3.33333333333333e-01 272 270 -6.66666666666667e-01 272 426 3.33333333333333e-01 272 252 3.33333333333333e-01 273 273 5.00000000000000e+00 273 355 3.33333333333333e-01 273 354 -5.00000000000000e-01 273 260 -3.33333333333333e-01 273 259 1.66666666666667e-01 273 272 3.33333333333333e-01 273 457 1.66666666666667e-01 273 271 3.33333333333333e-01 273 270 -1.50000000000000e+00 273 458 1.66666666666667e-01 273 262 -1.66666666666667e-01 273 263 3.33333333333333e-01 273 275 -6.66666666666667e-01 273 23 -1.66666666666667e-01 273 261 -5.00000000000000e-01 273 359 1.66666666666667e-01 273 107 -1.66666666666667e-01 273 358 -3.33333333333333e-01 273 257 1.66666666666667e-01 273 283 3.33333333333333e-01 273 274 -6.66666666666667e-01 273 284 3.33333333333333e-01 273 106 -1.66666666666667e-01 273 282 -1.50000000000000e+00 273 256 1.66666666666667e-01 273 22 -1.66666666666667e-01 273 269 -1.66666666666667e-01 273 266 1.66666666666667e-01 273 433 1.66666666666667e-01 273 430 -1.66666666666667e-01 273 265 -3.33333333333333e-01 273 268 3.33333333333333e-01 273 267 -5.00000000000000e-01 273 431 3.33333333333333e-01 273 434 -3.33333333333333e-01 273 429 -5.00000000000000e-01 273 356 -1.66666666666667e-01 274 274 5.00000000000000e+00 274 354 3.33333333333333e-01 274 356 3.33333333333333e-01 274 355 -1.50000000000000e+00 274 258 1.66666666666667e-01 274 272 -1.66666666666667e-01 274 456 1.66666666666667e-01 274 271 -5.00000000000000e-01 274 270 3.33333333333333e-01 274 458 -3.33333333333333e-01 274 261 -1.66666666666667e-01 274 359 1.66666666666667e-01 274 263 3.33333333333333e-01 274 262 -5.00000000000000e-01 274 357 -3.33333333333333e-01 274 284 -1.66666666666667e-01 274 282 3.33333333333333e-01 274 273 -6.66666666666667e-01 274 283 -5.00000000000000e-01 274 105 -1.66666666666667e-01 274 257 -3.33333333333333e-01 274 255 1.66666666666667e-01 274 21 -1.66666666666667e-01 274 269 3.33333333333333e-01 274 275 -6.66666666666667e-01 274 431 3.33333333333333e-01 274 432 1.66666666666667e-01 274 429 -1.66666666666667e-01 274 266 1.66666666666667e-01 274 23 -1.66666666666667e-01 274 268 -1.50000000000000e+00 274 264 -3.33333333333333e-01 274 267 3.33333333333333e-01 274 434 1.66666666666667e-01 274 107 -1.66666666666667e-01 274 430 -5.00000000000000e-01 274 260 1.66666666666667e-01 275 275 5.00000000000000e+00 275 259 1.66666666666667e-01 275 356 -5.00000000000000e-01 275 355 3.33333333333333e-01 275 258 -3.33333333333333e-01 275 271 -1.66666666666667e-01 275 270 3.33333333333333e-01 275 272 -5.00000000000000e-01 275 457 -3.33333333333333e-01 275 456 1.66666666666667e-01 275 358 1.66666666666667e-01 275 261 3.33333333333333e-01 275 273 -6.66666666666667e-01 275 263 -1.50000000000000e+00 275 262 3.33333333333333e-01 275 21 -1.66666666666667e-01 275 357 1.66666666666667e-01 275 105 -1.66666666666667e-01 275 283 -1.66666666666667e-01 275 255 1.66666666666667e-01 275 284 -5.00000000000000e-01 275 282 3.33333333333333e-01 275 256 -3.33333333333333e-01 275 267 -1.66666666666667e-01 275 264 1.66666666666667e-01 275 268 3.33333333333333e-01 275 274 -6.66666666666667e-01 275 430 3.33333333333333e-01 275 269 -5.00000000000000e-01 275 265 1.66666666666667e-01 275 22 -1.66666666666667e-01 275 431 -1.50000000000000e+00 275 354 -1.66666666666667e-01 275 433 1.66666666666667e-01 275 106 -1.66666666666667e-01 275 429 3.33333333333333e-01 275 432 -3.33333333333333e-01 276 276 1.16666666666667e+00 276 278 -3.33333333333333e-01 276 284 1.66666666666667e-01 276 358 8.33333333333333e-02 276 283 -8.33333333333333e-02 276 26 -8.33333333333333e-02 276 257 8.33333333333333e-02 276 25 8.33333333333333e-02 276 256 -1.66666666666667e-01 276 24 -8.33333333333333e-02 276 282 -2.50000000000000e-01 276 53 -8.33333333333333e-02 276 359 8.33333333333333e-02 276 277 -1.66666666666667e-01 276 52 8.33333333333333e-02 276 262 1.66666666666667e-01 276 263 1.66666666666667e-01 276 51 -8.33333333333333e-02 276 261 -7.50000000000000e-01 277 277 1.00000000000000e+00 277 257 8.33333333333333e-02 277 357 8.33333333333333e-02 277 282 -8.33333333333333e-02 277 26 8.33333333333333e-02 277 278 -1.66666666666667e-01 277 284 1.66666666666667e-01 277 25 -2.50000000000000e-01 277 283 -2.50000000000000e-01 277 24 8.33333333333333e-02 277 255 -1.66666666666667e-01 277 53 8.33333333333333e-02 277 359 -1.66666666666667e-01 277 263 -8.33333333333333e-02 277 52 -2.50000000000000e-01 277 262 -2.50000000000000e-01 277 276 -1.66666666666667e-01 277 51 8.33333333333333e-02 277 261 1.66666666666667e-01 278 278 1.16666666666667e+00 278 256 8.33333333333333e-02 278 261 1.66666666666667e-01 278 276 -3.33333333333333e-01 278 282 1.66666666666667e-01 278 26 -8.33333333333333e-02 278 284 -7.50000000000000e-01 278 25 8.33333333333333e-02 278 277 -1.66666666666667e-01 278 283 1.66666666666667e-01 278 24 -8.33333333333333e-02 278 255 8.33333333333333e-02 278 262 -8.33333333333333e-02 278 53 -8.33333333333333e-02 278 263 -2.50000000000000e-01 278 52 8.33333333333333e-02 278 358 -1.66666666666667e-01 278 51 -8.33333333333333e-02 278 357 8.33333333333333e-02 279 279 1.16666666666667e+00 279 284 -8.33333333333333e-02 279 280 -3.33333333333333e-01 279 283 1.66666666666667e-01 279 268 1.66666666666667e-01 279 26 8.33333333333333e-02 279 257 -1.66666666666667e-01 279 25 -8.33333333333333e-02 279 256 8.33333333333333e-02 279 24 -8.33333333333333e-02 279 282 -2.50000000000000e-01 279 281 -1.66666666666667e-01 279 80 8.33333333333333e-02 279 269 1.66666666666667e-01 279 79 -8.33333333333333e-02 279 433 8.33333333333333e-02 279 434 8.33333333333333e-02 279 78 -8.33333333333333e-02 279 267 -7.50000000000000e-01 280 280 1.16666666666667e+00 280 269 -8.33333333333333e-02 280 279 -3.33333333333333e-01 280 282 1.66666666666667e-01 280 267 1.66666666666667e-01 280 26 8.33333333333333e-02 280 281 -1.66666666666667e-01 280 284 1.66666666666667e-01 280 25 -8.33333333333333e-02 280 283 -7.50000000000000e-01 280 24 -8.33333333333333e-02 280 255 8.33333333333333e-02 280 80 8.33333333333333e-02 280 434 -1.66666666666667e-01 280 257 8.33333333333333e-02 280 79 -8.33333333333333e-02 280 268 -2.50000000000000e-01 280 78 -8.33333333333333e-02 280 432 8.33333333333333e-02 281 281 1.00000000000000e+00 281 282 -8.33333333333333e-02 281 256 8.33333333333333e-02 281 268 -8.33333333333333e-02 281 26 -2.50000000000000e-01 281 284 -2.50000000000000e-01 281 25 8.33333333333333e-02 281 280 -1.66666666666667e-01 281 283 1.66666666666667e-01 281 24 8.33333333333333e-02 281 255 -1.66666666666667e-01 281 432 8.33333333333333e-02 281 80 -2.50000000000000e-01 281 269 -2.50000000000000e-01 281 79 8.33333333333333e-02 281 433 -1.66666666666667e-01 281 279 -1.66666666666667e-01 281 78 8.33333333333333e-02 281 267 1.66666666666667e-01 282 282 2.50000000000000e+00 282 262 1.66666666666667e-01 282 277 -8.33333333333333e-02 282 263 -3.33333333333333e-01 282 26 8.33333333333333e-02 282 276 -2.50000000000000e-01 282 359 -8.33333333333333e-02 282 107 8.33333333333333e-02 282 283 -3.33333333333333e-01 282 358 1.66666666666667e-01 282 357 -2.50000000000000e-01 282 281 -8.33333333333333e-02 282 280 1.66666666666667e-01 282 257 -1.66666666666667e-01 282 269 1.66666666666667e-01 282 274 3.33333333333333e-01 282 268 -3.33333333333333e-01 282 25 8.33333333333333e-02 282 256 -1.66666666666667e-01 282 279 -2.50000000000000e-01 282 284 -3.33333333333333e-01 282 434 1.66666666666667e-01 282 275 3.33333333333333e-01 282 433 -8.33333333333333e-02 282 106 8.33333333333333e-02 282 278 1.66666666666667e-01 282 432 -2.50000000000000e-01 282 273 -1.50000000000000e+00 283 283 2.50000000000000e+00 283 276 -8.33333333333333e-02 283 263 1.66666666666667e-01 283 278 1.66666666666667e-01 283 277 -2.50000000000000e-01 283 359 1.66666666666667e-01 283 358 -7.50000000000000e-01 283 282 -3.33333333333333e-01 283 357 1.66666666666667e-01 283 275 -1.66666666666667e-01 283 284 -3.33333333333333e-01 283 257 -1.66666666666667e-01 283 269 1.66666666666667e-01 283 279 1.66666666666667e-01 283 273 3.33333333333333e-01 283 267 -3.33333333333333e-01 283 26 -1.66666666666667e-01 283 281 1.66666666666667e-01 283 280 -7.50000000000000e-01 283 24 8.33333333333333e-02 283 255 -1.66666666666667e-01 283 434 1.66666666666667e-01 283 107 -1.66666666666667e-01 283 261 1.66666666666667e-01 283 433 -2.50000000000000e-01 283 274 -5.00000000000000e-01 283 432 -8.33333333333333e-02 283 105 8.33333333333333e-02 284 284 2.50000000000000e+00 284 262 1.66666666666667e-01 284 261 -3.33333333333333e-01 284 278 -7.50000000000000e-01 284 277 1.66666666666667e-01 284 24 8.33333333333333e-02 284 359 -2.50000000000000e-01 284 358 1.66666666666667e-01 284 357 -8.33333333333333e-02 284 105 8.33333333333333e-02 284 274 -1.66666666666667e-01 284 283 -3.33333333333333e-01 284 279 -8.33333333333333e-02 284 256 -1.66666666666667e-01 284 268 1.66666666666667e-01 284 255 -1.66666666666667e-01 284 267 1.66666666666667e-01 284 281 -2.50000000000000e-01 284 25 -1.66666666666667e-01 284 280 1.66666666666667e-01 284 276 1.66666666666667e-01 284 434 -7.50000000000000e-01 284 275 -5.00000000000000e-01 284 433 1.66666666666667e-01 284 106 -1.66666666666667e-01 284 282 -3.33333333333333e-01 284 432 1.66666666666667e-01 284 273 3.33333333333333e-01 285 285 5.00000000000000e+01 285 116 -4.16666666666667e+00 285 298 4.16666666666667e+00 285 292 -4.16666666666667e+00 285 32 4.16666666666667e+00 285 299 -8.33333333333333e+00 285 31 4.16666666666667e+00 285 286 -8.33333333333333e+00 285 115 8.33333333333333e+00 285 30 -1.25000000000000e+01 285 114 -1.25000000000000e+01 285 287 -8.33333333333333e+00 285 29 0.00000000000000e+00 285 293 8.33333333333333e+00 285 28 0.00000000000000e+00 285 112 0.00000000000000e+00 285 113 0.00000000000000e+00 285 27 0.00000000000000e+00 285 291 -1.25000000000000e+01 286 286 5.83333333333333e+01 286 116 8.33333333333333e+00 286 293 8.33333333333333e+00 286 297 4.16666666666667e+00 286 291 -4.16666666666667e+00 286 32 -4.16666666666667e+00 286 299 4.16666666666667e+00 286 31 -4.16666666666667e+00 286 115 -3.75000000000000e+01 286 30 4.16666666666667e+00 286 285 -8.33333333333333e+00 286 114 8.33333333333333e+00 286 29 0.00000000000000e+00 286 113 0.00000000000000e+00 286 287 -1.66666666666667e+01 286 28 0.00000000000000e+00 286 292 -1.25000000000000e+01 286 27 0.00000000000000e+00 286 111 0.00000000000000e+00 287 287 5.83333333333333e+01 287 114 -4.16666666666667e+00 287 286 -1.66666666666667e+01 287 115 8.33333333333333e+00 287 292 8.33333333333333e+00 287 32 -4.16666666666667e+00 287 116 -1.25000000000000e+01 287 31 -4.16666666666667e+00 287 298 4.16666666666667e+00 287 30 4.16666666666667e+00 287 297 -8.33333333333333e+00 287 111 0.00000000000000e+00 287 29 0.00000000000000e+00 287 293 -3.75000000000000e+01 287 28 0.00000000000000e+00 287 112 0.00000000000000e+00 287 285 -8.33333333333333e+00 287 27 0.00000000000000e+00 287 291 8.33333333333333e+00 288 288 1.00000000000000e+00 288 125 0.00000000000000e+00 288 292 0.00000000000000e+00 288 289 0.00000000000000e+00 288 124 0.00000000000000e+00 288 83 0.00000000000000e+00 288 437 0.00000000000000e+00 288 82 0.00000000000000e+00 288 436 0.00000000000000e+00 288 81 0.00000000000000e+00 288 123 0.00000000000000e+00 288 290 0.00000000000000e+00 288 29 0.00000000000000e+00 288 293 0.00000000000000e+00 288 28 0.00000000000000e+00 288 112 0.00000000000000e+00 288 113 0.00000000000000e+00 288 27 0.00000000000000e+00 288 291 0.00000000000000e+00 289 289 1.00000000000000e+00 289 437 0.00000000000000e+00 289 291 0.00000000000000e+00 289 288 0.00000000000000e+00 289 123 0.00000000000000e+00 289 83 0.00000000000000e+00 289 290 0.00000000000000e+00 289 125 0.00000000000000e+00 289 82 0.00000000000000e+00 289 124 0.00000000000000e+00 289 81 0.00000000000000e+00 289 435 0.00000000000000e+00 289 29 0.00000000000000e+00 289 113 0.00000000000000e+00 289 293 0.00000000000000e+00 289 28 0.00000000000000e+00 289 292 0.00000000000000e+00 289 27 0.00000000000000e+00 289 111 0.00000000000000e+00 290 290 1.00000000000000e+00 290 436 0.00000000000000e+00 290 111 0.00000000000000e+00 290 123 0.00000000000000e+00 290 83 0.00000000000000e+00 290 125 0.00000000000000e+00 290 82 0.00000000000000e+00 290 289 0.00000000000000e+00 290 124 0.00000000000000e+00 290 81 0.00000000000000e+00 290 435 0.00000000000000e+00 290 292 0.00000000000000e+00 290 29 0.00000000000000e+00 290 293 0.00000000000000e+00 290 28 0.00000000000000e+00 290 112 0.00000000000000e+00 290 288 0.00000000000000e+00 290 27 0.00000000000000e+00 290 291 0.00000000000000e+00 291 291 1.25000000000000e+02 291 115 8.33333333333333e+00 291 116 8.33333333333333e+00 291 287 8.33333333333333e+00 291 285 -1.25000000000000e+01 291 299 8.33333333333333e+00 291 298 8.33333333333333e+00 291 292 -1.66666666666667e+01 291 297 -3.75000000000000e+01 291 128 -8.33333333333333e+00 291 293 -1.66666666666667e+01 291 113 0.00000000000000e+00 291 125 0.00000000000000e+00 291 289 0.00000000000000e+00 291 127 1.66666666666667e+01 291 124 0.00000000000000e+00 291 290 0.00000000000000e+00 291 29 0.00000000000000e+00 291 28 0.00000000000000e+00 291 112 0.00000000000000e+00 291 288 0.00000000000000e+00 291 437 8.33333333333333e+00 291 86 -8.33333333333333e+00 291 436 -4.16666666666667e+00 291 85 4.16666666666667e+00 291 435 -1.25000000000000e+01 291 286 -4.16666666666667e+00 291 126 -2.50000000000000e+01 292 292 1.25000000000000e+02 292 285 -4.16666666666667e+00 292 114 8.33333333333333e+00 292 116 -1.66666666666667e+01 292 29 0.00000000000000e+00 292 286 -1.25000000000000e+01 292 299 -4.16666666666667e+00 292 86 4.16666666666667e+00 292 298 -1.25000000000000e+01 292 297 8.33333333333333e+00 292 291 -1.66666666666667e+01 292 290 0.00000000000000e+00 292 288 0.00000000000000e+00 292 113 0.00000000000000e+00 292 125 0.00000000000000e+00 292 126 1.66666666666667e+01 292 123 0.00000000000000e+00 292 289 0.00000000000000e+00 292 27 0.00000000000000e+00 292 111 0.00000000000000e+00 292 437 8.33333333333333e+00 292 293 -1.66666666666667e+01 292 128 1.66666666666667e+01 292 436 -1.25000000000000e+01 292 287 8.33333333333333e+00 292 127 -7.50000000000000e+01 292 435 -4.16666666666667e+00 292 84 4.16666666666667e+00 293 293 1.25000000000000e+02 293 115 -1.66666666666667e+01 293 114 8.33333333333333e+00 293 287 -3.75000000000000e+01 293 28 0.00000000000000e+00 293 285 8.33333333333333e+00 293 299 -1.25000000000000e+01 293 298 -4.16666666666667e+00 293 85 4.16666666666667e+00 293 297 8.33333333333333e+00 293 126 -8.33333333333333e+00 293 289 0.00000000000000e+00 293 291 -1.66666666666667e+01 293 111 0.00000000000000e+00 293 123 0.00000000000000e+00 293 112 0.00000000000000e+00 293 124 0.00000000000000e+00 293 290 0.00000000000000e+00 293 288 0.00000000000000e+00 293 27 0.00000000000000e+00 293 437 -3.75000000000000e+01 293 286 8.33333333333333e+00 293 128 -2.50000000000000e+01 293 436 8.33333333333333e+00 293 292 -1.66666666666667e+01 293 127 1.66666666666667e+01 293 435 8.33333333333333e+00 293 84 -8.33333333333333e+00 294 294 5.00000000000000e+01 294 137 -4.16666666666667e+00 294 307 4.16666666666667e+00 294 301 -4.16666666666667e+00 294 35 4.16666666666667e+00 294 308 -8.33333333333333e+00 294 34 4.16666666666667e+00 294 295 -8.33333333333333e+00 294 136 8.33333333333333e+00 294 33 -1.25000000000000e+01 294 135 -1.25000000000000e+01 294 296 -8.33333333333333e+00 294 32 4.16666666666667e+00 294 302 8.33333333333333e+00 294 31 4.16666666666667e+00 294 133 -8.33333333333333e+00 294 134 4.16666666666667e+00 294 30 -1.25000000000000e+01 294 300 -1.25000000000000e+01 295 295 5.83333333333333e+01 295 137 8.33333333333333e+00 295 302 8.33333333333333e+00 295 306 4.16666666666667e+00 295 300 -4.16666666666667e+00 295 35 -4.16666666666667e+00 295 308 4.16666666666667e+00 295 34 -4.16666666666667e+00 295 136 -3.75000000000000e+01 295 33 4.16666666666667e+00 295 294 -8.33333333333333e+00 295 135 8.33333333333333e+00 295 32 -4.16666666666667e+00 295 134 4.16666666666667e+00 295 296 -1.66666666666667e+01 295 31 -4.16666666666667e+00 295 301 -1.25000000000000e+01 295 30 4.16666666666667e+00 295 132 -8.33333333333333e+00 296 296 5.83333333333333e+01 296 135 -4.16666666666667e+00 296 295 -1.66666666666667e+01 296 136 8.33333333333333e+00 296 301 8.33333333333333e+00 296 35 -4.16666666666667e+00 296 137 -1.25000000000000e+01 296 34 -4.16666666666667e+00 296 307 4.16666666666667e+00 296 33 4.16666666666667e+00 296 306 -8.33333333333333e+00 296 132 4.16666666666667e+00 296 32 -4.16666666666667e+00 296 302 -3.75000000000000e+01 296 31 -4.16666666666667e+00 296 133 4.16666666666667e+00 296 294 -8.33333333333333e+00 296 30 4.16666666666667e+00 296 300 8.33333333333333e+00 297 297 1.25000000000000e+02 297 298 -1.66666666666667e+01 297 440 -8.33333333333333e+00 297 85 -4.16666666666667e+00 297 439 4.16666666666667e+00 297 302 8.33333333333333e+00 297 31 -4.16666666666667e+00 297 300 -3.75000000000000e+01 297 286 4.16666666666667e+00 297 32 8.33333333333333e+00 297 287 -8.33333333333333e+00 297 299 -1.66666666666667e+01 297 293 8.33333333333333e+00 297 86 8.33333333333333e+00 297 292 8.33333333333333e+00 297 291 -3.75000000000000e+01 297 115 -8.33333333333333e+00 297 133 8.33333333333333e+00 297 134 8.33333333333333e+00 297 116 -8.33333333333333e+00 297 30 -1.25000000000000e+01 297 146 -8.33333333333333e+00 297 128 8.33333333333333e+00 297 145 1.66666666666667e+01 297 127 -1.66666666666667e+01 297 144 -2.50000000000000e+01 297 301 8.33333333333333e+00 297 84 -1.25000000000000e+01 298 298 1.25000000000000e+02 298 440 4.16666666666667e+00 298 300 8.33333333333333e+00 298 297 -1.66666666666667e+01 298 84 -4.16666666666667e+00 298 438 4.16666666666667e+00 298 301 -1.25000000000000e+01 298 30 -4.16666666666667e+00 298 285 4.16666666666667e+00 298 287 4.16666666666667e+00 298 293 -4.16666666666667e+00 298 292 -1.25000000000000e+01 298 291 8.33333333333333e+00 298 114 -8.33333333333333e+00 298 132 8.33333333333333e+00 298 116 -8.33333333333333e+00 298 128 8.33333333333333e+00 298 134 -1.66666666666667e+01 298 32 8.33333333333333e+00 298 31 -1.25000000000000e+01 298 146 1.66666666666667e+01 298 299 -1.66666666666667e+01 298 86 8.33333333333333e+00 298 145 -7.50000000000000e+01 298 302 -4.16666666666667e+00 298 85 -1.25000000000000e+01 298 144 1.66666666666667e+01 298 126 -1.66666666666667e+01 299 299 1.25000000000000e+02 299 439 4.16666666666667e+00 299 438 -8.33333333333333e+00 299 302 -1.25000000000000e+01 299 300 8.33333333333333e+00 299 286 4.16666666666667e+00 299 30 8.33333333333333e+00 299 285 -8.33333333333333e+00 299 293 -1.25000000000000e+01 299 292 -4.16666666666667e+00 299 297 -1.66666666666667e+01 299 291 8.33333333333333e+00 299 84 8.33333333333333e+00 299 115 -8.33333333333333e+00 299 127 8.33333333333333e+00 299 32 -3.75000000000000e+01 299 133 -1.66666666666667e+01 299 31 8.33333333333333e+00 299 132 8.33333333333333e+00 299 114 -8.33333333333333e+00 299 146 -2.50000000000000e+01 299 301 -4.16666666666667e+00 299 86 -3.75000000000000e+01 299 145 1.66666666666667e+01 299 298 -1.66666666666667e+01 299 85 8.33333333333333e+00 299 144 -8.33333333333333e+00 299 126 8.33333333333333e+00 300 300 1.25000000000000e+02 300 136 8.33333333333333e+00 300 137 8.33333333333333e+00 300 296 8.33333333333333e+00 300 294 -1.25000000000000e+01 300 308 8.33333333333333e+00 300 307 8.33333333333333e+00 300 301 -1.66666666666667e+01 300 306 -3.75000000000000e+01 300 149 -8.33333333333333e+00 300 302 -1.66666666666667e+01 300 134 -8.33333333333333e+00 300 146 8.33333333333333e+00 300 298 8.33333333333333e+00 300 148 1.66666666666667e+01 300 145 -1.66666666666667e+01 300 299 8.33333333333333e+00 300 32 -8.33333333333333e+00 300 31 4.16666666666667e+00 300 133 -8.33333333333333e+00 300 297 -3.75000000000000e+01 300 440 8.33333333333333e+00 300 89 -8.33333333333333e+00 300 439 -4.16666666666667e+00 300 88 4.16666666666667e+00 300 438 -1.25000000000000e+01 300 295 -4.16666666666667e+00 300 147 -2.50000000000000e+01 301 301 1.25000000000000e+02 301 294 -4.16666666666667e+00 301 135 8.33333333333333e+00 301 137 -1.66666666666667e+01 301 32 4.16666666666667e+00 301 295 -1.25000000000000e+01 301 308 -4.16666666666667e+00 301 89 4.16666666666667e+00 301 307 -1.25000000000000e+01 301 306 8.33333333333333e+00 301 300 -1.66666666666667e+01 301 299 -4.16666666666667e+00 301 297 8.33333333333333e+00 301 134 -8.33333333333333e+00 301 146 8.33333333333333e+00 301 147 1.66666666666667e+01 301 144 -1.66666666666667e+01 301 298 -1.25000000000000e+01 301 30 4.16666666666667e+00 301 132 -8.33333333333333e+00 301 440 8.33333333333333e+00 301 302 -1.66666666666667e+01 301 149 1.66666666666667e+01 301 439 -1.25000000000000e+01 301 296 8.33333333333333e+00 301 148 -7.50000000000000e+01 301 438 -4.16666666666667e+00 301 87 4.16666666666667e+00 302 302 1.25000000000000e+02 302 136 -1.66666666666667e+01 302 135 8.33333333333333e+00 302 296 -3.75000000000000e+01 302 31 4.16666666666667e+00 302 294 8.33333333333333e+00 302 308 -1.25000000000000e+01 302 307 -4.16666666666667e+00 302 88 4.16666666666667e+00 302 306 8.33333333333333e+00 302 147 -8.33333333333333e+00 302 298 -4.16666666666667e+00 302 300 -1.66666666666667e+01 302 132 -8.33333333333333e+00 302 144 8.33333333333333e+00 302 133 -8.33333333333333e+00 302 145 8.33333333333333e+00 302 299 -1.25000000000000e+01 302 297 8.33333333333333e+00 302 30 -8.33333333333333e+00 302 440 -3.75000000000000e+01 302 295 8.33333333333333e+00 302 149 -2.50000000000000e+01 302 439 8.33333333333333e+00 302 301 -1.66666666666667e+01 302 148 1.66666666666667e+01 302 438 8.33333333333333e+00 302 87 -8.33333333333333e+00 303 303 5.00000000000000e+01 303 158 -4.16666666666667e+00 303 316 4.16666666666667e+00 303 310 -4.16666666666667e+00 303 38 4.16666666666667e+00 303 317 -8.33333333333333e+00 303 37 4.16666666666667e+00 303 304 -8.33333333333333e+00 303 157 8.33333333333333e+00 303 36 -1.25000000000000e+01 303 156 -1.25000000000000e+01 303 305 -8.33333333333333e+00 303 35 4.16666666666667e+00 303 311 8.33333333333333e+00 303 34 4.16666666666667e+00 303 154 -8.33333333333333e+00 303 155 4.16666666666667e+00 303 33 -1.25000000000000e+01 303 309 -1.25000000000000e+01 304 304 5.83333333333333e+01 304 158 8.33333333333333e+00 304 311 8.33333333333333e+00 304 315 4.16666666666667e+00 304 309 -4.16666666666667e+00 304 38 -4.16666666666667e+00 304 317 4.16666666666667e+00 304 37 -4.16666666666667e+00 304 157 -3.75000000000000e+01 304 36 4.16666666666667e+00 304 303 -8.33333333333333e+00 304 156 8.33333333333333e+00 304 35 -4.16666666666667e+00 304 155 4.16666666666667e+00 304 305 -1.66666666666667e+01 304 34 -4.16666666666667e+00 304 310 -1.25000000000000e+01 304 33 4.16666666666667e+00 304 153 -8.33333333333333e+00 305 305 5.83333333333333e+01 305 156 -4.16666666666667e+00 305 304 -1.66666666666667e+01 305 157 8.33333333333333e+00 305 310 8.33333333333333e+00 305 38 -4.16666666666667e+00 305 158 -1.25000000000000e+01 305 37 -4.16666666666667e+00 305 316 4.16666666666667e+00 305 36 4.16666666666667e+00 305 315 -8.33333333333333e+00 305 153 4.16666666666667e+00 305 35 -4.16666666666667e+00 305 311 -3.75000000000000e+01 305 34 -4.16666666666667e+00 305 154 4.16666666666667e+00 305 303 -8.33333333333333e+00 305 33 4.16666666666667e+00 305 309 8.33333333333333e+00 306 306 1.25000000000000e+02 306 307 -1.66666666666667e+01 306 443 -8.33333333333333e+00 306 88 -4.16666666666667e+00 306 442 4.16666666666667e+00 306 311 8.33333333333333e+00 306 34 -4.16666666666667e+00 306 309 -3.75000000000000e+01 306 295 4.16666666666667e+00 306 35 8.33333333333333e+00 306 296 -8.33333333333333e+00 306 308 -1.66666666666667e+01 306 302 8.33333333333333e+00 306 89 8.33333333333333e+00 306 301 8.33333333333333e+00 306 300 -3.75000000000000e+01 306 136 -8.33333333333333e+00 306 154 8.33333333333333e+00 306 155 8.33333333333333e+00 306 137 -8.33333333333333e+00 306 33 -1.25000000000000e+01 306 167 -8.33333333333333e+00 306 149 8.33333333333333e+00 306 166 1.66666666666667e+01 306 148 -1.66666666666667e+01 306 165 -2.50000000000000e+01 306 310 8.33333333333333e+00 306 87 -1.25000000000000e+01 307 307 1.25000000000000e+02 307 443 4.16666666666667e+00 307 309 8.33333333333333e+00 307 306 -1.66666666666667e+01 307 87 -4.16666666666667e+00 307 441 4.16666666666667e+00 307 310 -1.25000000000000e+01 307 33 -4.16666666666667e+00 307 294 4.16666666666667e+00 307 296 4.16666666666667e+00 307 302 -4.16666666666667e+00 307 301 -1.25000000000000e+01 307 300 8.33333333333333e+00 307 135 -8.33333333333333e+00 307 153 8.33333333333333e+00 307 137 -8.33333333333333e+00 307 149 8.33333333333333e+00 307 155 -1.66666666666667e+01 307 35 8.33333333333333e+00 307 34 -1.25000000000000e+01 307 167 1.66666666666667e+01 307 308 -1.66666666666667e+01 307 89 8.33333333333333e+00 307 166 -7.50000000000000e+01 307 311 -4.16666666666667e+00 307 88 -1.25000000000000e+01 307 165 1.66666666666667e+01 307 147 -1.66666666666667e+01 308 308 1.25000000000000e+02 308 442 4.16666666666667e+00 308 441 -8.33333333333333e+00 308 311 -1.25000000000000e+01 308 309 8.33333333333333e+00 308 295 4.16666666666667e+00 308 33 8.33333333333333e+00 308 294 -8.33333333333333e+00 308 302 -1.25000000000000e+01 308 301 -4.16666666666667e+00 308 306 -1.66666666666667e+01 308 300 8.33333333333333e+00 308 87 8.33333333333333e+00 308 136 -8.33333333333333e+00 308 148 8.33333333333333e+00 308 35 -3.75000000000000e+01 308 154 -1.66666666666667e+01 308 34 8.33333333333333e+00 308 153 8.33333333333333e+00 308 135 -8.33333333333333e+00 308 167 -2.50000000000000e+01 308 310 -4.16666666666667e+00 308 89 -3.75000000000000e+01 308 166 1.66666666666667e+01 308 307 -1.66666666666667e+01 308 88 8.33333333333333e+00 308 165 -8.33333333333333e+00 308 147 8.33333333333333e+00 309 309 1.25000000000000e+02 309 157 8.33333333333333e+00 309 158 8.33333333333333e+00 309 305 8.33333333333333e+00 309 303 -1.25000000000000e+01 309 317 8.33333333333333e+00 309 316 8.33333333333333e+00 309 310 -1.66666666666667e+01 309 315 -3.75000000000000e+01 309 170 -8.33333333333333e+00 309 311 -1.66666666666667e+01 309 155 -8.33333333333333e+00 309 167 8.33333333333333e+00 309 307 8.33333333333333e+00 309 169 1.66666666666667e+01 309 166 -1.66666666666667e+01 309 308 8.33333333333333e+00 309 35 -8.33333333333333e+00 309 34 4.16666666666667e+00 309 154 -8.33333333333333e+00 309 306 -3.75000000000000e+01 309 443 8.33333333333333e+00 309 92 -8.33333333333333e+00 309 442 -4.16666666666667e+00 309 91 4.16666666666667e+00 309 441 -1.25000000000000e+01 309 304 -4.16666666666667e+00 309 168 -2.50000000000000e+01 310 310 1.25000000000000e+02 310 303 -4.16666666666667e+00 310 156 8.33333333333333e+00 310 158 -1.66666666666667e+01 310 35 4.16666666666667e+00 310 304 -1.25000000000000e+01 310 317 -4.16666666666667e+00 310 92 4.16666666666667e+00 310 316 -1.25000000000000e+01 310 315 8.33333333333333e+00 310 309 -1.66666666666667e+01 310 308 -4.16666666666667e+00 310 306 8.33333333333333e+00 310 155 -8.33333333333333e+00 310 167 8.33333333333333e+00 310 168 1.66666666666667e+01 310 165 -1.66666666666667e+01 310 307 -1.25000000000000e+01 310 33 4.16666666666667e+00 310 153 -8.33333333333333e+00 310 443 8.33333333333333e+00 310 311 -1.66666666666667e+01 310 170 1.66666666666667e+01 310 442 -1.25000000000000e+01 310 305 8.33333333333333e+00 310 169 -7.50000000000000e+01 310 441 -4.16666666666667e+00 310 90 4.16666666666667e+00 311 311 1.25000000000000e+02 311 157 -1.66666666666667e+01 311 156 8.33333333333333e+00 311 305 -3.75000000000000e+01 311 34 4.16666666666667e+00 311 303 8.33333333333333e+00 311 317 -1.25000000000000e+01 311 316 -4.16666666666667e+00 311 91 4.16666666666667e+00 311 315 8.33333333333333e+00 311 168 -8.33333333333333e+00 311 307 -4.16666666666667e+00 311 309 -1.66666666666667e+01 311 153 -8.33333333333333e+00 311 165 8.33333333333333e+00 311 154 -8.33333333333333e+00 311 166 8.33333333333333e+00 311 308 -1.25000000000000e+01 311 306 8.33333333333333e+00 311 33 -8.33333333333333e+00 311 443 -3.75000000000000e+01 311 304 8.33333333333333e+00 311 170 -2.50000000000000e+01 311 442 8.33333333333333e+00 311 310 -1.66666666666667e+01 311 169 1.66666666666667e+01 311 441 8.33333333333333e+00 311 90 -8.33333333333333e+00 312 312 5.00000000000000e+01 312 179 -4.16666666666667e+00 312 325 4.16666666666667e+00 312 319 -4.16666666666667e+00 312 41 4.16666666666667e+00 312 326 -8.33333333333333e+00 312 40 4.16666666666667e+00 312 313 -8.33333333333333e+00 312 178 8.33333333333333e+00 312 39 -1.25000000000000e+01 312 177 -1.25000000000000e+01 312 314 -8.33333333333333e+00 312 38 4.16666666666667e+00 312 320 8.33333333333333e+00 312 37 4.16666666666667e+00 312 175 -8.33333333333333e+00 312 176 4.16666666666667e+00 312 36 -1.25000000000000e+01 312 318 -1.25000000000000e+01 313 313 5.83333333333333e+01 313 179 8.33333333333333e+00 313 320 8.33333333333333e+00 313 324 4.16666666666667e+00 313 318 -4.16666666666667e+00 313 41 -4.16666666666667e+00 313 326 4.16666666666667e+00 313 40 -4.16666666666667e+00 313 178 -3.75000000000000e+01 313 39 4.16666666666667e+00 313 312 -8.33333333333333e+00 313 177 8.33333333333333e+00 313 38 -4.16666666666667e+00 313 176 4.16666666666667e+00 313 314 -1.66666666666667e+01 313 37 -4.16666666666667e+00 313 319 -1.25000000000000e+01 313 36 4.16666666666667e+00 313 174 -8.33333333333333e+00 314 314 5.83333333333333e+01 314 177 -4.16666666666667e+00 314 313 -1.66666666666667e+01 314 178 8.33333333333333e+00 314 319 8.33333333333333e+00 314 41 -4.16666666666667e+00 314 179 -1.25000000000000e+01 314 40 -4.16666666666667e+00 314 325 4.16666666666667e+00 314 39 4.16666666666667e+00 314 324 -8.33333333333333e+00 314 174 4.16666666666667e+00 314 38 -4.16666666666667e+00 314 320 -3.75000000000000e+01 314 37 -4.16666666666667e+00 314 175 4.16666666666667e+00 314 312 -8.33333333333333e+00 314 36 4.16666666666667e+00 314 318 8.33333333333333e+00 315 315 1.25000000000000e+02 315 316 -1.66666666666667e+01 315 446 -8.33333333333333e+00 315 91 -4.16666666666667e+00 315 445 4.16666666666667e+00 315 320 8.33333333333333e+00 315 37 -4.16666666666667e+00 315 318 -3.75000000000000e+01 315 304 4.16666666666667e+00 315 38 8.33333333333333e+00 315 305 -8.33333333333333e+00 315 317 -1.66666666666667e+01 315 311 8.33333333333333e+00 315 92 8.33333333333333e+00 315 310 8.33333333333333e+00 315 309 -3.75000000000000e+01 315 157 -8.33333333333333e+00 315 175 8.33333333333333e+00 315 176 8.33333333333333e+00 315 158 -8.33333333333333e+00 315 36 -1.25000000000000e+01 315 188 -8.33333333333333e+00 315 170 8.33333333333333e+00 315 187 1.66666666666667e+01 315 169 -1.66666666666667e+01 315 186 -2.50000000000000e+01 315 319 8.33333333333333e+00 315 90 -1.25000000000000e+01 316 316 1.25000000000000e+02 316 446 4.16666666666667e+00 316 318 8.33333333333333e+00 316 315 -1.66666666666667e+01 316 90 -4.16666666666667e+00 316 444 4.16666666666667e+00 316 319 -1.25000000000000e+01 316 36 -4.16666666666667e+00 316 303 4.16666666666667e+00 316 305 4.16666666666667e+00 316 311 -4.16666666666667e+00 316 310 -1.25000000000000e+01 316 309 8.33333333333333e+00 316 156 -8.33333333333333e+00 316 174 8.33333333333333e+00 316 158 -8.33333333333333e+00 316 170 8.33333333333333e+00 316 176 -1.66666666666667e+01 316 38 8.33333333333333e+00 316 37 -1.25000000000000e+01 316 188 1.66666666666667e+01 316 317 -1.66666666666667e+01 316 92 8.33333333333333e+00 316 187 -7.50000000000000e+01 316 320 -4.16666666666667e+00 316 91 -1.25000000000000e+01 316 186 1.66666666666667e+01 316 168 -1.66666666666667e+01 317 317 1.25000000000000e+02 317 445 4.16666666666667e+00 317 444 -8.33333333333333e+00 317 320 -1.25000000000000e+01 317 318 8.33333333333333e+00 317 304 4.16666666666667e+00 317 36 8.33333333333333e+00 317 303 -8.33333333333333e+00 317 311 -1.25000000000000e+01 317 310 -4.16666666666667e+00 317 315 -1.66666666666667e+01 317 309 8.33333333333333e+00 317 90 8.33333333333333e+00 317 157 -8.33333333333333e+00 317 169 8.33333333333333e+00 317 38 -3.75000000000000e+01 317 175 -1.66666666666667e+01 317 37 8.33333333333333e+00 317 174 8.33333333333333e+00 317 156 -8.33333333333333e+00 317 188 -2.50000000000000e+01 317 319 -4.16666666666667e+00 317 92 -3.75000000000000e+01 317 187 1.66666666666667e+01 317 316 -1.66666666666667e+01 317 91 8.33333333333333e+00 317 186 -8.33333333333333e+00 317 168 8.33333333333333e+00 318 318 1.25000000000000e+02 318 178 8.33333333333333e+00 318 179 8.33333333333333e+00 318 314 8.33333333333333e+00 318 312 -1.25000000000000e+01 318 326 8.33333333333333e+00 318 325 8.33333333333333e+00 318 319 -1.66666666666667e+01 318 324 -3.75000000000000e+01 318 191 -8.33333333333333e+00 318 320 -1.66666666666667e+01 318 176 -8.33333333333333e+00 318 188 8.33333333333333e+00 318 316 8.33333333333333e+00 318 190 1.66666666666667e+01 318 187 -1.66666666666667e+01 318 317 8.33333333333333e+00 318 38 -8.33333333333333e+00 318 37 4.16666666666667e+00 318 175 -8.33333333333333e+00 318 315 -3.75000000000000e+01 318 446 8.33333333333333e+00 318 95 -8.33333333333333e+00 318 445 -4.16666666666667e+00 318 94 4.16666666666667e+00 318 444 -1.25000000000000e+01 318 313 -4.16666666666667e+00 318 189 -2.50000000000000e+01 319 319 1.25000000000000e+02 319 312 -4.16666666666667e+00 319 177 8.33333333333333e+00 319 179 -1.66666666666667e+01 319 38 4.16666666666667e+00 319 313 -1.25000000000000e+01 319 326 -4.16666666666667e+00 319 95 4.16666666666667e+00 319 325 -1.25000000000000e+01 319 324 8.33333333333333e+00 319 318 -1.66666666666667e+01 319 317 -4.16666666666667e+00 319 315 8.33333333333333e+00 319 176 -8.33333333333333e+00 319 188 8.33333333333333e+00 319 189 1.66666666666667e+01 319 186 -1.66666666666667e+01 319 316 -1.25000000000000e+01 319 36 4.16666666666667e+00 319 174 -8.33333333333333e+00 319 446 8.33333333333333e+00 319 320 -1.66666666666667e+01 319 191 1.66666666666667e+01 319 445 -1.25000000000000e+01 319 314 8.33333333333333e+00 319 190 -7.50000000000000e+01 319 444 -4.16666666666667e+00 319 93 4.16666666666667e+00 320 320 1.25000000000000e+02 320 178 -1.66666666666667e+01 320 177 8.33333333333333e+00 320 314 -3.75000000000000e+01 320 37 4.16666666666667e+00 320 312 8.33333333333333e+00 320 326 -1.25000000000000e+01 320 325 -4.16666666666667e+00 320 94 4.16666666666667e+00 320 324 8.33333333333333e+00 320 189 -8.33333333333333e+00 320 316 -4.16666666666667e+00 320 318 -1.66666666666667e+01 320 174 -8.33333333333333e+00 320 186 8.33333333333333e+00 320 175 -8.33333333333333e+00 320 187 8.33333333333333e+00 320 317 -1.25000000000000e+01 320 315 8.33333333333333e+00 320 36 -8.33333333333333e+00 320 446 -3.75000000000000e+01 320 313 8.33333333333333e+00 320 191 -2.50000000000000e+01 320 445 8.33333333333333e+00 320 319 -1.66666666666667e+01 320 190 1.66666666666667e+01 320 444 8.33333333333333e+00 320 93 -8.33333333333333e+00 321 321 1.00000000000000e+00 321 200 -8.33333333333333e-02 321 334 8.33333333333333e-02 321 328 -8.33333333333333e-02 321 44 8.33333333333333e-02 321 335 -1.66666666666667e-01 321 43 8.33333333333333e-02 321 322 -1.66666666666667e-01 321 199 1.66666666666667e-01 321 42 -2.50000000000000e-01 321 198 -2.50000000000000e-01 321 323 -1.66666666666667e-01 321 41 8.33333333333333e-02 321 329 1.66666666666667e-01 321 40 8.33333333333333e-02 321 196 -1.66666666666667e-01 321 197 8.33333333333333e-02 321 39 -2.50000000000000e-01 321 327 -2.50000000000000e-01 322 322 1.16666666666667e+00 322 200 1.66666666666667e-01 322 329 1.66666666666667e-01 322 333 8.33333333333333e-02 322 327 -8.33333333333333e-02 322 44 -8.33333333333333e-02 322 335 8.33333333333333e-02 322 43 -8.33333333333333e-02 322 199 -7.50000000000000e-01 322 42 8.33333333333333e-02 322 321 -1.66666666666667e-01 322 198 1.66666666666667e-01 322 41 -8.33333333333333e-02 322 197 8.33333333333333e-02 322 323 -3.33333333333333e-01 322 40 -8.33333333333333e-02 322 328 -2.50000000000000e-01 322 39 8.33333333333333e-02 322 195 -1.66666666666667e-01 323 323 1.16666666666667e+00 323 198 -8.33333333333333e-02 323 322 -3.33333333333333e-01 323 199 1.66666666666667e-01 323 328 1.66666666666667e-01 323 44 -8.33333333333333e-02 323 200 -2.50000000000000e-01 323 43 -8.33333333333333e-02 323 334 8.33333333333333e-02 323 42 8.33333333333333e-02 323 333 -1.66666666666667e-01 323 195 8.33333333333333e-02 323 41 -8.33333333333333e-02 323 329 -7.50000000000000e-01 323 40 -8.33333333333333e-02 323 196 8.33333333333333e-02 323 321 -1.66666666666667e-01 323 39 8.33333333333333e-02 323 327 1.66666666666667e-01 324 324 6.78333333333333e+01 324 325 -3.33333333333333e-01 324 449 -1.66666666666667e-01 324 94 -8.33333333333333e-02 324 448 8.33333333333333e-02 324 329 1.66666666666667e-01 324 40 -8.33333333333333e-02 324 327 -7.50000000000000e-01 324 313 4.16666666666667e+00 324 41 4.25000000000000e+00 324 314 -8.33333333333333e+00 324 326 -8.50000000000000e+00 324 320 8.33333333333333e+00 324 95 4.25000000000000e+00 324 319 8.33333333333333e+00 324 318 -3.75000000000000e+01 324 178 -8.33333333333333e+00 324 196 4.25000000000000e+00 324 197 4.25000000000000e+00 324 179 -8.33333333333333e+00 324 39 -8.41666666666667e+00 324 209 -4.25000000000000e+00 324 191 8.33333333333333e+00 324 208 8.50000000000000e+00 324 190 -1.66666666666667e+01 324 207 -1.27500000000000e+01 324 328 1.66666666666667e-01 324 93 -8.41666666666667e+00 325 325 6.78333333333333e+01 325 449 8.33333333333333e-02 325 327 1.66666666666667e-01 325 324 -3.33333333333333e-01 325 93 -8.33333333333333e-02 325 447 8.33333333333333e-02 325 328 -2.50000000000000e-01 325 39 -8.33333333333333e-02 325 312 4.16666666666667e+00 325 314 4.16666666666667e+00 325 320 -4.16666666666667e+00 325 319 -1.25000000000000e+01 325 318 8.33333333333333e+00 325 177 -8.33333333333333e+00 325 195 4.25000000000000e+00 325 179 -8.33333333333333e+00 325 191 8.33333333333333e+00 325 197 -8.50000000000000e+00 325 41 4.25000000000000e+00 325 40 -8.41666666666667e+00 325 209 8.50000000000000e+00 325 326 -8.50000000000000e+00 325 95 4.25000000000000e+00 325 208 -3.82500000000000e+01 325 329 -8.33333333333333e-02 325 94 -8.41666666666667e+00 325 207 8.50000000000000e+00 325 189 -1.66666666666667e+01 326 326 7.60000000000000e+01 326 448 8.33333333333333e-02 326 447 -1.66666666666667e-01 326 329 -2.50000000000000e-01 326 327 1.66666666666667e-01 326 313 4.16666666666667e+00 326 39 4.25000000000000e+00 326 312 -8.33333333333333e+00 326 320 -1.25000000000000e+01 326 319 -4.16666666666667e+00 326 324 -8.50000000000000e+00 326 318 8.33333333333333e+00 326 93 4.25000000000000e+00 326 178 -8.33333333333333e+00 326 190 8.33333333333333e+00 326 41 -2.52500000000000e+01 326 196 -8.50000000000000e+00 326 40 4.25000000000000e+00 326 195 4.25000000000000e+00 326 177 -8.33333333333333e+00 326 209 -1.27500000000000e+01 326 328 -8.33333333333333e-02 326 95 -2.52500000000000e+01 326 208 8.50000000000000e+00 326 325 -8.50000000000000e+00 326 94 4.25000000000000e+00 326 207 -4.25000000000000e+00 326 189 8.33333333333333e+00 327 327 2.50000000000000e+00 327 199 1.66666666666667e-01 327 200 1.66666666666667e-01 327 323 1.66666666666667e-01 327 321 -2.50000000000000e-01 327 335 1.66666666666667e-01 327 334 1.66666666666667e-01 327 328 -3.33333333333333e-01 327 333 -7.50000000000000e-01 327 212 -1.66666666666667e-01 327 329 -3.33333333333333e-01 327 197 -1.66666666666667e-01 327 209 1.66666666666667e-01 327 325 1.66666666666667e-01 327 211 3.33333333333333e-01 327 208 -3.33333333333333e-01 327 326 1.66666666666667e-01 327 41 -1.66666666666667e-01 327 40 8.33333333333333e-02 327 196 -1.66666666666667e-01 327 324 -7.50000000000000e-01 327 449 1.66666666666667e-01 327 98 -1.66666666666667e-01 327 448 -8.33333333333333e-02 327 97 8.33333333333333e-02 327 447 -2.50000000000000e-01 327 322 -8.33333333333333e-02 327 210 -5.00000000000000e-01 328 328 2.50000000000000e+00 328 321 -8.33333333333333e-02 328 198 1.66666666666667e-01 328 200 -3.33333333333333e-01 328 41 8.33333333333333e-02 328 322 -2.50000000000000e-01 328 335 -8.33333333333333e-02 328 98 8.33333333333333e-02 328 334 -2.50000000000000e-01 328 333 1.66666666666667e-01 328 327 -3.33333333333333e-01 328 326 -8.33333333333333e-02 328 324 1.66666666666667e-01 328 197 -1.66666666666667e-01 328 209 1.66666666666667e-01 328 210 3.33333333333333e-01 328 207 -3.33333333333333e-01 328 325 -2.50000000000000e-01 328 39 8.33333333333333e-02 328 195 -1.66666666666667e-01 328 449 1.66666666666667e-01 328 329 -3.33333333333333e-01 328 212 3.33333333333333e-01 328 448 -2.50000000000000e-01 328 323 1.66666666666667e-01 328 211 -1.50000000000000e+00 328 447 -8.33333333333333e-02 328 96 8.33333333333333e-02 329 329 2.50000000000000e+00 329 199 -3.33333333333333e-01 329 198 1.66666666666667e-01 329 323 -7.50000000000000e-01 329 40 8.33333333333333e-02 329 321 1.66666666666667e-01 329 335 -2.50000000000000e-01 329 334 -8.33333333333333e-02 329 97 8.33333333333333e-02 329 333 1.66666666666667e-01 329 210 -1.66666666666667e-01 329 325 -8.33333333333333e-02 329 327 -3.33333333333333e-01 329 195 -1.66666666666667e-01 329 207 1.66666666666667e-01 329 196 -1.66666666666667e-01 329 208 1.66666666666667e-01 329 326 -2.50000000000000e-01 329 324 1.66666666666667e-01 329 39 -1.66666666666667e-01 329 449 -7.50000000000000e-01 329 322 1.66666666666667e-01 329 212 -5.00000000000000e-01 329 448 1.66666666666667e-01 329 328 -3.33333333333333e-01 329 211 3.33333333333333e-01 329 447 1.66666666666667e-01 329 96 -1.66666666666667e-01 330 330 1.00000000000000e+00 330 221 -8.33333333333333e-02 330 343 8.33333333333333e-02 330 337 -8.33333333333333e-02 330 47 8.33333333333333e-02 330 344 -1.66666666666667e-01 330 46 8.33333333333333e-02 330 331 -1.66666666666667e-01 330 220 1.66666666666667e-01 330 45 -2.50000000000000e-01 330 219 -2.50000000000000e-01 330 332 -1.66666666666667e-01 330 44 8.33333333333333e-02 330 338 1.66666666666667e-01 330 43 8.33333333333333e-02 330 217 -1.66666666666667e-01 330 218 8.33333333333333e-02 330 42 -2.50000000000000e-01 330 336 -2.50000000000000e-01 331 331 1.16666666666667e+00 331 221 1.66666666666667e-01 331 338 1.66666666666667e-01 331 342 8.33333333333333e-02 331 336 -8.33333333333333e-02 331 47 -8.33333333333333e-02 331 344 8.33333333333333e-02 331 46 -8.33333333333333e-02 331 220 -7.50000000000000e-01 331 45 8.33333333333333e-02 331 330 -1.66666666666667e-01 331 219 1.66666666666667e-01 331 44 -8.33333333333333e-02 331 218 8.33333333333333e-02 331 332 -3.33333333333333e-01 331 43 -8.33333333333333e-02 331 337 -2.50000000000000e-01 331 42 8.33333333333333e-02 331 216 -1.66666666666667e-01 332 332 1.16666666666667e+00 332 219 -8.33333333333333e-02 332 331 -3.33333333333333e-01 332 220 1.66666666666667e-01 332 337 1.66666666666667e-01 332 47 -8.33333333333333e-02 332 221 -2.50000000000000e-01 332 46 -8.33333333333333e-02 332 343 8.33333333333333e-02 332 45 8.33333333333333e-02 332 342 -1.66666666666667e-01 332 216 8.33333333333333e-02 332 44 -8.33333333333333e-02 332 338 -7.50000000000000e-01 332 43 -8.33333333333333e-02 332 217 8.33333333333333e-02 332 330 -1.66666666666667e-01 332 42 8.33333333333333e-02 332 336 1.66666666666667e-01 333 333 2.50000000000000e+00 333 334 -3.33333333333333e-01 333 452 -1.66666666666667e-01 333 97 -8.33333333333333e-02 333 451 8.33333333333333e-02 333 338 1.66666666666667e-01 333 43 -8.33333333333333e-02 333 336 -7.50000000000000e-01 333 322 8.33333333333333e-02 333 44 1.66666666666667e-01 333 323 -1.66666666666667e-01 333 335 -3.33333333333333e-01 333 329 1.66666666666667e-01 333 98 1.66666666666667e-01 333 328 1.66666666666667e-01 333 327 -7.50000000000000e-01 333 199 -1.66666666666667e-01 333 217 1.66666666666667e-01 333 218 1.66666666666667e-01 333 200 -1.66666666666667e-01 333 42 -2.50000000000000e-01 333 230 -1.66666666666667e-01 333 212 1.66666666666667e-01 333 229 3.33333333333333e-01 333 211 -3.33333333333333e-01 333 228 -5.00000000000000e-01 333 337 1.66666666666667e-01 333 96 -2.50000000000000e-01 334 334 2.50000000000000e+00 334 452 8.33333333333333e-02 334 336 1.66666666666667e-01 334 333 -3.33333333333333e-01 334 96 -8.33333333333333e-02 334 450 8.33333333333333e-02 334 337 -2.50000000000000e-01 334 42 -8.33333333333333e-02 334 321 8.33333333333333e-02 334 323 8.33333333333333e-02 334 329 -8.33333333333333e-02 334 328 -2.50000000000000e-01 334 327 1.66666666666667e-01 334 198 -1.66666666666667e-01 334 216 1.66666666666667e-01 334 200 -1.66666666666667e-01 334 212 1.66666666666667e-01 334 218 -3.33333333333333e-01 334 44 1.66666666666667e-01 334 43 -2.50000000000000e-01 334 230 3.33333333333333e-01 334 335 -3.33333333333333e-01 334 98 1.66666666666667e-01 334 229 -1.50000000000000e+00 334 338 -8.33333333333333e-02 334 97 -2.50000000000000e-01 334 228 3.33333333333333e-01 334 210 -3.33333333333333e-01 335 335 2.50000000000000e+00 335 451 8.33333333333333e-02 335 450 -1.66666666666667e-01 335 338 -2.50000000000000e-01 335 336 1.66666666666667e-01 335 322 8.33333333333333e-02 335 42 1.66666666666667e-01 335 321 -1.66666666666667e-01 335 329 -2.50000000000000e-01 335 328 -8.33333333333333e-02 335 333 -3.33333333333333e-01 335 327 1.66666666666667e-01 335 96 1.66666666666667e-01 335 199 -1.66666666666667e-01 335 211 1.66666666666667e-01 335 44 -7.50000000000000e-01 335 217 -3.33333333333333e-01 335 43 1.66666666666667e-01 335 216 1.66666666666667e-01 335 198 -1.66666666666667e-01 335 230 -5.00000000000000e-01 335 337 -8.33333333333333e-02 335 98 -7.50000000000000e-01 335 229 3.33333333333333e-01 335 334 -3.33333333333333e-01 335 97 1.66666666666667e-01 335 228 -1.66666666666667e-01 335 210 1.66666666666667e-01 336 336 2.50000000000000e+00 336 220 1.66666666666667e-01 336 221 1.66666666666667e-01 336 332 1.66666666666667e-01 336 330 -2.50000000000000e-01 336 344 1.66666666666667e-01 336 343 1.66666666666667e-01 336 337 -3.33333333333333e-01 336 342 -7.50000000000000e-01 336 233 -1.66666666666667e-01 336 338 -3.33333333333333e-01 336 218 -1.66666666666667e-01 336 230 1.66666666666667e-01 336 334 1.66666666666667e-01 336 232 3.33333333333333e-01 336 229 -3.33333333333333e-01 336 335 1.66666666666667e-01 336 44 -1.66666666666667e-01 336 43 8.33333333333333e-02 336 217 -1.66666666666667e-01 336 333 -7.50000000000000e-01 336 452 1.66666666666667e-01 336 101 -1.66666666666667e-01 336 451 -8.33333333333333e-02 336 100 8.33333333333333e-02 336 450 -2.50000000000000e-01 336 331 -8.33333333333333e-02 336 231 -5.00000000000000e-01 337 337 2.50000000000000e+00 337 330 -8.33333333333333e-02 337 219 1.66666666666667e-01 337 221 -3.33333333333333e-01 337 44 8.33333333333333e-02 337 331 -2.50000000000000e-01 337 344 -8.33333333333333e-02 337 101 8.33333333333333e-02 337 343 -2.50000000000000e-01 337 342 1.66666666666667e-01 337 336 -3.33333333333333e-01 337 335 -8.33333333333333e-02 337 333 1.66666666666667e-01 337 218 -1.66666666666667e-01 337 230 1.66666666666667e-01 337 231 3.33333333333333e-01 337 228 -3.33333333333333e-01 337 334 -2.50000000000000e-01 337 42 8.33333333333333e-02 337 216 -1.66666666666667e-01 337 452 1.66666666666667e-01 337 338 -3.33333333333333e-01 337 233 3.33333333333333e-01 337 451 -2.50000000000000e-01 337 332 1.66666666666667e-01 337 232 -1.50000000000000e+00 337 450 -8.33333333333333e-02 337 99 8.33333333333333e-02 338 338 2.50000000000000e+00 338 220 -3.33333333333333e-01 338 219 1.66666666666667e-01 338 332 -7.50000000000000e-01 338 43 8.33333333333333e-02 338 330 1.66666666666667e-01 338 344 -2.50000000000000e-01 338 343 -8.33333333333333e-02 338 100 8.33333333333333e-02 338 342 1.66666666666667e-01 338 231 -1.66666666666667e-01 338 334 -8.33333333333333e-02 338 336 -3.33333333333333e-01 338 216 -1.66666666666667e-01 338 228 1.66666666666667e-01 338 217 -1.66666666666667e-01 338 229 1.66666666666667e-01 338 335 -2.50000000000000e-01 338 333 1.66666666666667e-01 338 42 -1.66666666666667e-01 338 452 -7.50000000000000e-01 338 331 1.66666666666667e-01 338 233 -5.00000000000000e-01 338 451 1.66666666666667e-01 338 337 -3.33333333333333e-01 338 232 3.33333333333333e-01 338 450 1.66666666666667e-01 338 99 -1.66666666666667e-01 339 339 1.00000000000000e+00 339 242 -8.33333333333333e-02 339 352 8.33333333333333e-02 339 346 -8.33333333333333e-02 339 50 8.33333333333333e-02 339 353 -1.66666666666667e-01 339 49 8.33333333333333e-02 339 340 -1.66666666666667e-01 339 241 1.66666666666667e-01 339 48 -2.50000000000000e-01 339 240 -2.50000000000000e-01 339 341 -1.66666666666667e-01 339 47 8.33333333333333e-02 339 347 1.66666666666667e-01 339 46 8.33333333333333e-02 339 238 -1.66666666666667e-01 339 239 8.33333333333333e-02 339 45 -2.50000000000000e-01 339 345 -2.50000000000000e-01 340 340 1.16666666666667e+00 340 242 1.66666666666667e-01 340 347 1.66666666666667e-01 340 351 8.33333333333333e-02 340 345 -8.33333333333333e-02 340 50 -8.33333333333333e-02 340 353 8.33333333333333e-02 340 49 -8.33333333333333e-02 340 241 -7.50000000000000e-01 340 48 8.33333333333333e-02 340 339 -1.66666666666667e-01 340 240 1.66666666666667e-01 340 47 -8.33333333333333e-02 340 239 8.33333333333333e-02 340 341 -3.33333333333333e-01 340 46 -8.33333333333333e-02 340 346 -2.50000000000000e-01 340 45 8.33333333333333e-02 340 237 -1.66666666666667e-01 341 341 1.16666666666667e+00 341 240 -8.33333333333333e-02 341 340 -3.33333333333333e-01 341 241 1.66666666666667e-01 341 346 1.66666666666667e-01 341 50 -8.33333333333333e-02 341 242 -2.50000000000000e-01 341 49 -8.33333333333333e-02 341 352 8.33333333333333e-02 341 48 8.33333333333333e-02 341 351 -1.66666666666667e-01 341 237 8.33333333333333e-02 341 47 -8.33333333333333e-02 341 347 -7.50000000000000e-01 341 46 -8.33333333333333e-02 341 238 8.33333333333333e-02 341 339 -1.66666666666667e-01 341 45 8.33333333333333e-02 341 345 1.66666666666667e-01 342 342 2.50000000000000e+00 342 343 -3.33333333333333e-01 342 455 -1.66666666666667e-01 342 100 -8.33333333333333e-02 342 454 8.33333333333333e-02 342 347 1.66666666666667e-01 342 46 -8.33333333333333e-02 342 345 -7.50000000000000e-01 342 331 8.33333333333333e-02 342 47 1.66666666666667e-01 342 332 -1.66666666666667e-01 342 344 -3.33333333333333e-01 342 338 1.66666666666667e-01 342 101 1.66666666666667e-01 342 337 1.66666666666667e-01 342 336 -7.50000000000000e-01 342 220 -1.66666666666667e-01 342 238 1.66666666666667e-01 342 239 1.66666666666667e-01 342 221 -1.66666666666667e-01 342 45 -2.50000000000000e-01 342 251 -1.66666666666667e-01 342 233 1.66666666666667e-01 342 250 3.33333333333333e-01 342 232 -3.33333333333333e-01 342 249 -5.00000000000000e-01 342 346 1.66666666666667e-01 342 99 -2.50000000000000e-01 343 343 2.50000000000000e+00 343 455 8.33333333333333e-02 343 345 1.66666666666667e-01 343 342 -3.33333333333333e-01 343 99 -8.33333333333333e-02 343 453 8.33333333333333e-02 343 346 -2.50000000000000e-01 343 45 -8.33333333333333e-02 343 330 8.33333333333333e-02 343 332 8.33333333333333e-02 343 338 -8.33333333333333e-02 343 337 -2.50000000000000e-01 343 336 1.66666666666667e-01 343 219 -1.66666666666667e-01 343 237 1.66666666666667e-01 343 221 -1.66666666666667e-01 343 233 1.66666666666667e-01 343 239 -3.33333333333333e-01 343 47 1.66666666666667e-01 343 46 -2.50000000000000e-01 343 251 3.33333333333333e-01 343 344 -3.33333333333333e-01 343 101 1.66666666666667e-01 343 250 -1.50000000000000e+00 343 347 -8.33333333333333e-02 343 100 -2.50000000000000e-01 343 249 3.33333333333333e-01 343 231 -3.33333333333333e-01 344 344 2.50000000000000e+00 344 454 8.33333333333333e-02 344 453 -1.66666666666667e-01 344 347 -2.50000000000000e-01 344 345 1.66666666666667e-01 344 331 8.33333333333333e-02 344 45 1.66666666666667e-01 344 330 -1.66666666666667e-01 344 338 -2.50000000000000e-01 344 337 -8.33333333333333e-02 344 342 -3.33333333333333e-01 344 336 1.66666666666667e-01 344 99 1.66666666666667e-01 344 220 -1.66666666666667e-01 344 232 1.66666666666667e-01 344 47 -7.50000000000000e-01 344 238 -3.33333333333333e-01 344 46 1.66666666666667e-01 344 237 1.66666666666667e-01 344 219 -1.66666666666667e-01 344 251 -5.00000000000000e-01 344 346 -8.33333333333333e-02 344 101 -7.50000000000000e-01 344 250 3.33333333333333e-01 344 343 -3.33333333333333e-01 344 100 1.66666666666667e-01 344 249 -1.66666666666667e-01 344 231 1.66666666666667e-01 345 345 2.50000000000000e+00 345 241 1.66666666666667e-01 345 242 1.66666666666667e-01 345 341 1.66666666666667e-01 345 339 -2.50000000000000e-01 345 353 1.66666666666667e-01 345 352 1.66666666666667e-01 345 346 -3.33333333333333e-01 345 351 -7.50000000000000e-01 345 254 -1.66666666666667e-01 345 347 -3.33333333333333e-01 345 239 -1.66666666666667e-01 345 251 1.66666666666667e-01 345 343 1.66666666666667e-01 345 253 3.33333333333333e-01 345 250 -3.33333333333333e-01 345 344 1.66666666666667e-01 345 47 -1.66666666666667e-01 345 46 8.33333333333333e-02 345 238 -1.66666666666667e-01 345 342 -7.50000000000000e-01 345 455 1.66666666666667e-01 345 104 -1.66666666666667e-01 345 454 -8.33333333333333e-02 345 103 8.33333333333333e-02 345 453 -2.50000000000000e-01 345 340 -8.33333333333333e-02 345 252 -5.00000000000000e-01 346 346 2.50000000000000e+00 346 339 -8.33333333333333e-02 346 240 1.66666666666667e-01 346 242 -3.33333333333333e-01 346 47 8.33333333333333e-02 346 340 -2.50000000000000e-01 346 353 -8.33333333333333e-02 346 104 8.33333333333333e-02 346 352 -2.50000000000000e-01 346 351 1.66666666666667e-01 346 345 -3.33333333333333e-01 346 344 -8.33333333333333e-02 346 342 1.66666666666667e-01 346 239 -1.66666666666667e-01 346 251 1.66666666666667e-01 346 252 3.33333333333333e-01 346 249 -3.33333333333333e-01 346 343 -2.50000000000000e-01 346 45 8.33333333333333e-02 346 237 -1.66666666666667e-01 346 455 1.66666666666667e-01 346 347 -3.33333333333333e-01 346 254 3.33333333333333e-01 346 454 -2.50000000000000e-01 346 341 1.66666666666667e-01 346 253 -1.50000000000000e+00 346 453 -8.33333333333333e-02 346 102 8.33333333333333e-02 347 347 2.50000000000000e+00 347 241 -3.33333333333333e-01 347 240 1.66666666666667e-01 347 341 -7.50000000000000e-01 347 46 8.33333333333333e-02 347 339 1.66666666666667e-01 347 353 -2.50000000000000e-01 347 352 -8.33333333333333e-02 347 103 8.33333333333333e-02 347 351 1.66666666666667e-01 347 252 -1.66666666666667e-01 347 343 -8.33333333333333e-02 347 345 -3.33333333333333e-01 347 237 -1.66666666666667e-01 347 249 1.66666666666667e-01 347 238 -1.66666666666667e-01 347 250 1.66666666666667e-01 347 344 -2.50000000000000e-01 347 342 1.66666666666667e-01 347 45 -1.66666666666667e-01 347 455 -7.50000000000000e-01 347 340 1.66666666666667e-01 347 254 -5.00000000000000e-01 347 454 1.66666666666667e-01 347 346 -3.33333333333333e-01 347 253 3.33333333333333e-01 347 453 1.66666666666667e-01 347 102 -1.66666666666667e-01 348 348 1.00000000000000e+00 348 263 -8.33333333333333e-02 348 358 8.33333333333333e-02 348 355 -8.33333333333333e-02 348 53 8.33333333333333e-02 348 359 -1.66666666666667e-01 348 52 8.33333333333333e-02 348 349 -1.66666666666667e-01 348 262 1.66666666666667e-01 348 51 -2.50000000000000e-01 348 261 -2.50000000000000e-01 348 350 -1.66666666666667e-01 348 50 8.33333333333333e-02 348 356 1.66666666666667e-01 348 49 8.33333333333333e-02 348 259 -1.66666666666667e-01 348 260 8.33333333333333e-02 348 48 -2.50000000000000e-01 348 354 -2.50000000000000e-01 349 349 1.16666666666667e+00 349 263 1.66666666666667e-01 349 356 1.66666666666667e-01 349 357 8.33333333333333e-02 349 354 -8.33333333333333e-02 349 53 -8.33333333333333e-02 349 359 8.33333333333333e-02 349 52 -8.33333333333333e-02 349 262 -7.50000000000000e-01 349 51 8.33333333333333e-02 349 348 -1.66666666666667e-01 349 261 1.66666666666667e-01 349 50 -8.33333333333333e-02 349 260 8.33333333333333e-02 349 350 -3.33333333333333e-01 349 49 -8.33333333333333e-02 349 355 -2.50000000000000e-01 349 48 8.33333333333333e-02 349 258 -1.66666666666667e-01 350 350 1.16666666666667e+00 350 261 -8.33333333333333e-02 350 349 -3.33333333333333e-01 350 262 1.66666666666667e-01 350 355 1.66666666666667e-01 350 53 -8.33333333333333e-02 350 263 -2.50000000000000e-01 350 52 -8.33333333333333e-02 350 358 8.33333333333333e-02 350 51 8.33333333333333e-02 350 357 -1.66666666666667e-01 350 258 8.33333333333333e-02 350 50 -8.33333333333333e-02 350 356 -7.50000000000000e-01 350 49 -8.33333333333333e-02 350 259 8.33333333333333e-02 350 348 -1.66666666666667e-01 350 48 8.33333333333333e-02 350 354 1.66666666666667e-01 351 351 2.50000000000000e+00 351 352 -3.33333333333333e-01 351 458 -1.66666666666667e-01 351 103 -8.33333333333333e-02 351 457 8.33333333333333e-02 351 356 1.66666666666667e-01 351 49 -8.33333333333333e-02 351 354 -7.50000000000000e-01 351 340 8.33333333333333e-02 351 50 1.66666666666667e-01 351 341 -1.66666666666667e-01 351 353 -3.33333333333333e-01 351 347 1.66666666666667e-01 351 104 1.66666666666667e-01 351 346 1.66666666666667e-01 351 345 -7.50000000000000e-01 351 241 -1.66666666666667e-01 351 259 1.66666666666667e-01 351 260 1.66666666666667e-01 351 242 -1.66666666666667e-01 351 48 -2.50000000000000e-01 351 272 -1.66666666666667e-01 351 254 1.66666666666667e-01 351 271 3.33333333333333e-01 351 253 -3.33333333333333e-01 351 270 -5.00000000000000e-01 351 355 1.66666666666667e-01 351 102 -2.50000000000000e-01 352 352 2.50000000000000e+00 352 458 8.33333333333333e-02 352 354 1.66666666666667e-01 352 351 -3.33333333333333e-01 352 102 -8.33333333333333e-02 352 456 8.33333333333333e-02 352 355 -2.50000000000000e-01 352 48 -8.33333333333333e-02 352 339 8.33333333333333e-02 352 341 8.33333333333333e-02 352 347 -8.33333333333333e-02 352 346 -2.50000000000000e-01 352 345 1.66666666666667e-01 352 240 -1.66666666666667e-01 352 258 1.66666666666667e-01 352 242 -1.66666666666667e-01 352 254 1.66666666666667e-01 352 260 -3.33333333333333e-01 352 50 1.66666666666667e-01 352 49 -2.50000000000000e-01 352 272 3.33333333333333e-01 352 353 -3.33333333333333e-01 352 104 1.66666666666667e-01 352 271 -1.50000000000000e+00 352 356 -8.33333333333333e-02 352 103 -2.50000000000000e-01 352 270 3.33333333333333e-01 352 252 -3.33333333333333e-01 353 353 2.50000000000000e+00 353 457 8.33333333333333e-02 353 456 -1.66666666666667e-01 353 356 -2.50000000000000e-01 353 354 1.66666666666667e-01 353 340 8.33333333333333e-02 353 48 1.66666666666667e-01 353 339 -1.66666666666667e-01 353 347 -2.50000000000000e-01 353 346 -8.33333333333333e-02 353 351 -3.33333333333333e-01 353 345 1.66666666666667e-01 353 102 1.66666666666667e-01 353 241 -1.66666666666667e-01 353 253 1.66666666666667e-01 353 50 -7.50000000000000e-01 353 259 -3.33333333333333e-01 353 49 1.66666666666667e-01 353 258 1.66666666666667e-01 353 240 -1.66666666666667e-01 353 272 -5.00000000000000e-01 353 355 -8.33333333333333e-02 353 104 -7.50000000000000e-01 353 271 3.33333333333333e-01 353 352 -3.33333333333333e-01 353 103 1.66666666666667e-01 353 270 -1.66666666666667e-01 353 252 1.66666666666667e-01 354 354 2.50000000000000e+00 354 262 1.66666666666667e-01 354 263 1.66666666666667e-01 354 350 1.66666666666667e-01 354 348 -2.50000000000000e-01 354 359 1.66666666666667e-01 354 358 1.66666666666667e-01 354 355 -3.33333333333333e-01 354 357 -7.50000000000000e-01 354 275 -1.66666666666667e-01 354 356 -3.33333333333333e-01 354 260 -1.66666666666667e-01 354 272 1.66666666666667e-01 354 352 1.66666666666667e-01 354 274 3.33333333333333e-01 354 271 -3.33333333333333e-01 354 353 1.66666666666667e-01 354 50 -1.66666666666667e-01 354 49 8.33333333333333e-02 354 259 -1.66666666666667e-01 354 351 -7.50000000000000e-01 354 458 1.66666666666667e-01 354 107 -1.66666666666667e-01 354 457 -8.33333333333333e-02 354 106 8.33333333333333e-02 354 456 -2.50000000000000e-01 354 349 -8.33333333333333e-02 354 273 -5.00000000000000e-01 355 355 2.50000000000000e+00 355 348 -8.33333333333333e-02 355 261 1.66666666666667e-01 355 263 -3.33333333333333e-01 355 50 8.33333333333333e-02 355 349 -2.50000000000000e-01 355 359 -8.33333333333333e-02 355 107 8.33333333333333e-02 355 358 -2.50000000000000e-01 355 357 1.66666666666667e-01 355 354 -3.33333333333333e-01 355 353 -8.33333333333333e-02 355 351 1.66666666666667e-01 355 260 -1.66666666666667e-01 355 272 1.66666666666667e-01 355 273 3.33333333333333e-01 355 270 -3.33333333333333e-01 355 352 -2.50000000000000e-01 355 48 8.33333333333333e-02 355 258 -1.66666666666667e-01 355 458 1.66666666666667e-01 355 356 -3.33333333333333e-01 355 275 3.33333333333333e-01 355 457 -2.50000000000000e-01 355 350 1.66666666666667e-01 355 274 -1.50000000000000e+00 355 456 -8.33333333333333e-02 355 105 8.33333333333333e-02 356 356 2.50000000000000e+00 356 262 -3.33333333333333e-01 356 261 1.66666666666667e-01 356 350 -7.50000000000000e-01 356 49 8.33333333333333e-02 356 348 1.66666666666667e-01 356 359 -2.50000000000000e-01 356 358 -8.33333333333333e-02 356 106 8.33333333333333e-02 356 357 1.66666666666667e-01 356 273 -1.66666666666667e-01 356 352 -8.33333333333333e-02 356 354 -3.33333333333333e-01 356 258 -1.66666666666667e-01 356 270 1.66666666666667e-01 356 259 -1.66666666666667e-01 356 271 1.66666666666667e-01 356 353 -2.50000000000000e-01 356 351 1.66666666666667e-01 356 48 -1.66666666666667e-01 356 458 -7.50000000000000e-01 356 349 1.66666666666667e-01 356 275 -5.00000000000000e-01 356 457 1.66666666666667e-01 356 355 -3.33333333333333e-01 356 274 3.33333333333333e-01 356 456 1.66666666666667e-01 356 105 -1.66666666666667e-01 357 357 1.33333333333333e+00 357 53 8.33333333333333e-02 357 350 -1.66666666666667e-01 357 359 -1.66666666666667e-01 357 356 1.66666666666667e-01 357 107 8.33333333333333e-02 357 355 1.66666666666667e-01 357 354 -7.50000000000000e-01 357 262 -1.66666666666667e-01 357 277 8.33333333333333e-02 357 278 8.33333333333333e-02 357 263 -1.66666666666667e-01 357 51 -1.66666666666667e-01 357 284 -8.33333333333333e-02 357 275 1.66666666666667e-01 357 283 1.66666666666667e-01 357 274 -3.33333333333333e-01 357 282 -2.50000000000000e-01 357 349 8.33333333333333e-02 357 105 -1.66666666666667e-01 358 358 1.33333333333333e+00 358 350 8.33333333333333e-02 358 356 -8.33333333333333e-02 358 355 -2.50000000000000e-01 358 354 1.66666666666667e-01 358 261 -1.66666666666667e-01 358 276 8.33333333333333e-02 358 263 -1.66666666666667e-01 358 275 1.66666666666667e-01 358 278 -1.66666666666667e-01 358 53 8.33333333333333e-02 358 52 -1.66666666666667e-01 358 284 1.66666666666667e-01 358 359 -1.66666666666667e-01 358 107 8.33333333333333e-02 358 283 -7.50000000000000e-01 358 348 8.33333333333333e-02 358 106 -1.66666666666667e-01 358 282 1.66666666666667e-01 358 273 -3.33333333333333e-01 359 359 1.50000000000000e+00 359 51 8.33333333333333e-02 359 348 -1.66666666666667e-01 359 356 -2.50000000000000e-01 359 355 -8.33333333333333e-02 359 357 -1.66666666666667e-01 359 354 1.66666666666667e-01 359 105 8.33333333333333e-02 359 262 -1.66666666666667e-01 359 274 1.66666666666667e-01 359 53 -5.00000000000000e-01 359 277 -1.66666666666667e-01 359 52 8.33333333333333e-02 359 276 8.33333333333333e-02 359 261 -1.66666666666667e-01 359 284 -2.50000000000000e-01 359 349 8.33333333333333e-02 359 107 -5.00000000000000e-01 359 283 1.66666666666667e-01 359 358 -1.66666666666667e-01 359 106 8.33333333333333e-02 359 282 -8.33333333333333e-02 359 273 1.66666666666667e-01 360 360 5.00000000000000e+01 360 118 0.00000000000000e+00 360 374 4.16666666666667e+00 360 368 -4.16666666666667e+00 360 56 0.00000000000000e+00 360 119 0.00000000000000e+00 360 55 0.00000000000000e+00 360 361 -8.33333333333333e+00 360 367 8.33333333333333e+00 360 54 0.00000000000000e+00 360 366 -1.25000000000000e+01 360 362 -8.33333333333333e+00 360 59 4.16666666666667e+00 360 122 8.33333333333333e+00 360 58 4.16666666666667e+00 360 373 -8.33333333333333e+00 360 121 -4.16666666666667e+00 360 57 -1.25000000000000e+01 360 120 -1.25000000000000e+01 361 361 5.83333333333333e+01 361 117 0.00000000000000e+00 361 122 8.33333333333333e+00 361 362 -1.66666666666667e+01 361 368 8.33333333333333e+00 361 56 0.00000000000000e+00 361 119 0.00000000000000e+00 361 55 0.00000000000000e+00 361 367 -3.75000000000000e+01 361 54 0.00000000000000e+00 361 360 -8.33333333333333e+00 361 366 8.33333333333333e+00 361 59 -4.16666666666667e+00 361 374 4.16666666666667e+00 361 120 -4.16666666666667e+00 361 58 -4.16666666666667e+00 361 121 -1.25000000000000e+01 361 57 4.16666666666667e+00 361 372 -8.33333333333333e+00 362 362 5.83333333333333e+01 362 361 -1.66666666666667e+01 362 367 8.33333333333333e+00 362 372 4.16666666666667e+00 362 366 -4.16666666666667e+00 362 56 0.00000000000000e+00 362 368 -1.25000000000000e+01 362 55 0.00000000000000e+00 362 118 0.00000000000000e+00 362 54 0.00000000000000e+00 362 117 0.00000000000000e+00 362 121 8.33333333333333e+00 362 59 -4.16666666666667e+00 362 122 -3.75000000000000e+01 362 58 -4.16666666666667e+00 362 373 4.16666666666667e+00 362 360 -8.33333333333333e+00 362 57 4.16666666666667e+00 362 120 8.33333333333333e+00 363 363 1.00000000000000e+00 363 124 0.00000000000000e+00 363 365 0.00000000000000e+00 363 125 0.00000000000000e+00 363 368 0.00000000000000e+00 363 83 0.00000000000000e+00 363 437 0.00000000000000e+00 363 82 0.00000000000000e+00 363 436 0.00000000000000e+00 363 81 0.00000000000000e+00 363 123 0.00000000000000e+00 363 56 0.00000000000000e+00 363 119 0.00000000000000e+00 363 364 0.00000000000000e+00 363 55 0.00000000000000e+00 363 367 0.00000000000000e+00 363 118 0.00000000000000e+00 363 54 0.00000000000000e+00 363 366 0.00000000000000e+00 364 364 1.00000000000000e+00 364 123 0.00000000000000e+00 364 437 0.00000000000000e+00 364 368 0.00000000000000e+00 364 83 0.00000000000000e+00 364 365 0.00000000000000e+00 364 125 0.00000000000000e+00 364 82 0.00000000000000e+00 364 124 0.00000000000000e+00 364 81 0.00000000000000e+00 364 435 0.00000000000000e+00 364 56 0.00000000000000e+00 364 119 0.00000000000000e+00 364 117 0.00000000000000e+00 364 55 0.00000000000000e+00 364 367 0.00000000000000e+00 364 363 0.00000000000000e+00 364 54 0.00000000000000e+00 364 366 0.00000000000000e+00 365 365 1.00000000000000e+00 365 367 0.00000000000000e+00 365 363 0.00000000000000e+00 365 123 0.00000000000000e+00 365 366 0.00000000000000e+00 365 83 0.00000000000000e+00 365 125 0.00000000000000e+00 365 82 0.00000000000000e+00 365 364 0.00000000000000e+00 365 124 0.00000000000000e+00 365 81 0.00000000000000e+00 365 435 0.00000000000000e+00 365 436 0.00000000000000e+00 365 56 0.00000000000000e+00 365 368 0.00000000000000e+00 365 55 0.00000000000000e+00 365 118 0.00000000000000e+00 365 54 0.00000000000000e+00 365 117 0.00000000000000e+00 366 366 1.25000000000000e+02 366 125 0.00000000000000e+00 366 124 0.00000000000000e+00 366 56 0.00000000000000e+00 366 364 0.00000000000000e+00 366 363 0.00000000000000e+00 366 437 -4.16666666666667e+00 366 86 4.16666666666667e+00 366 436 8.33333333333333e+00 366 435 -1.25000000000000e+01 366 119 0.00000000000000e+00 366 118 0.00000000000000e+00 366 122 8.33333333333333e+00 366 362 -4.16666666666667e+00 366 367 -1.66666666666667e+01 366 121 8.33333333333333e+00 366 127 -8.33333333333333e+00 366 55 0.00000000000000e+00 366 361 8.33333333333333e+00 366 360 -1.25000000000000e+01 366 368 -1.66666666666667e+01 366 374 8.33333333333333e+00 366 128 1.66666666666667e+01 366 373 8.33333333333333e+00 366 85 -8.33333333333333e+00 366 365 0.00000000000000e+00 366 372 -3.75000000000000e+01 366 126 -2.50000000000000e+01 367 367 1.25000000000000e+02 367 125 0.00000000000000e+00 367 123 0.00000000000000e+00 367 364 0.00000000000000e+00 367 363 0.00000000000000e+00 367 437 8.33333333333333e+00 367 368 -1.66666666666667e+01 367 436 -3.75000000000000e+01 367 435 8.33333333333333e+00 367 117 0.00000000000000e+00 367 362 8.33333333333333e+00 367 366 -1.66666666666667e+01 367 122 -1.66666666666667e+01 367 128 1.66666666666667e+01 367 120 8.33333333333333e+00 367 126 -8.33333333333333e+00 367 56 0.00000000000000e+00 367 119 0.00000000000000e+00 367 361 -3.75000000000000e+01 367 54 0.00000000000000e+00 367 360 8.33333333333333e+00 367 374 -4.16666666666667e+00 367 86 4.16666666666667e+00 367 365 0.00000000000000e+00 367 373 -1.25000000000000e+01 367 127 -2.50000000000000e+01 367 372 8.33333333333333e+00 367 84 -8.33333333333333e+00 368 368 1.25000000000000e+02 368 124 0.00000000000000e+00 368 363 0.00000000000000e+00 368 123 0.00000000000000e+00 368 365 0.00000000000000e+00 368 54 0.00000000000000e+00 368 437 -1.25000000000000e+01 368 436 8.33333333333333e+00 368 367 -1.66666666666667e+01 368 435 -4.16666666666667e+00 368 84 4.16666666666667e+00 368 117 0.00000000000000e+00 368 361 8.33333333333333e+00 368 120 8.33333333333333e+00 368 360 -4.16666666666667e+00 368 121 -1.66666666666667e+01 368 127 1.66666666666667e+01 368 362 -1.25000000000000e+01 368 55 0.00000000000000e+00 368 118 0.00000000000000e+00 368 364 0.00000000000000e+00 368 374 -1.25000000000000e+01 368 128 -7.50000000000000e+01 368 373 -4.16666666666667e+00 368 85 4.16666666666667e+00 368 366 -1.66666666666667e+01 368 372 8.33333333333333e+00 368 126 1.66666666666667e+01 369 369 5.00000000000000e+01 369 139 4.16666666666667e+00 369 383 4.16666666666667e+00 369 377 -4.16666666666667e+00 369 59 4.16666666666667e+00 369 140 -8.33333333333333e+00 369 58 4.16666666666667e+00 369 370 -8.33333333333333e+00 369 376 8.33333333333333e+00 369 57 -1.25000000000000e+01 369 375 -1.25000000000000e+01 369 371 -8.33333333333333e+00 369 62 4.16666666666667e+00 369 143 8.33333333333333e+00 369 61 4.16666666666667e+00 369 382 -8.33333333333333e+00 369 142 -4.16666666666667e+00 369 60 -1.25000000000000e+01 369 141 -1.25000000000000e+01 370 370 5.83333333333333e+01 370 138 4.16666666666667e+00 370 143 8.33333333333333e+00 370 371 -1.66666666666667e+01 370 377 8.33333333333333e+00 370 59 -4.16666666666667e+00 370 140 4.16666666666667e+00 370 58 -4.16666666666667e+00 370 376 -3.75000000000000e+01 370 57 4.16666666666667e+00 370 369 -8.33333333333333e+00 370 375 8.33333333333333e+00 370 62 -4.16666666666667e+00 370 383 4.16666666666667e+00 370 141 -4.16666666666667e+00 370 61 -4.16666666666667e+00 370 142 -1.25000000000000e+01 370 60 4.16666666666667e+00 370 381 -8.33333333333333e+00 371 371 5.83333333333333e+01 371 370 -1.66666666666667e+01 371 376 8.33333333333333e+00 371 381 4.16666666666667e+00 371 375 -4.16666666666667e+00 371 59 -4.16666666666667e+00 371 377 -1.25000000000000e+01 371 58 -4.16666666666667e+00 371 139 4.16666666666667e+00 371 57 4.16666666666667e+00 371 138 -8.33333333333333e+00 371 142 8.33333333333333e+00 371 62 -4.16666666666667e+00 371 143 -3.75000000000000e+01 371 61 -4.16666666666667e+00 371 382 4.16666666666667e+00 371 369 -8.33333333333333e+00 371 60 4.16666666666667e+00 371 141 8.33333333333333e+00 372 372 1.25000000000000e+02 372 377 8.33333333333333e+00 372 86 -4.16666666666667e+00 372 440 4.16666666666667e+00 372 439 -8.33333333333333e+00 372 59 -4.16666666666667e+00 372 376 8.33333333333333e+00 372 375 -3.75000000000000e+01 372 140 8.33333333333333e+00 372 139 8.33333333333333e+00 372 146 1.66666666666667e+01 372 145 -8.33333333333333e+00 372 144 -2.50000000000000e+01 372 122 -8.33333333333333e+00 372 362 4.16666666666667e+00 372 121 -8.33333333333333e+00 372 127 8.33333333333333e+00 372 361 -8.33333333333333e+00 372 58 8.33333333333333e+00 372 57 -1.25000000000000e+01 372 368 8.33333333333333e+00 372 128 -1.66666666666667e+01 372 367 8.33333333333333e+00 372 373 -1.66666666666667e+01 372 85 8.33333333333333e+00 372 366 -3.75000000000000e+01 372 374 -1.66666666666667e+01 372 84 -1.25000000000000e+01 373 373 1.25000000000000e+02 373 377 -4.16666666666667e+00 373 438 -8.33333333333333e+00 373 376 -1.25000000000000e+01 373 375 8.33333333333333e+00 373 140 -1.66666666666667e+01 373 59 8.33333333333333e+00 373 138 8.33333333333333e+00 373 146 1.66666666666667e+01 373 374 -1.66666666666667e+01 373 86 8.33333333333333e+00 373 145 -2.50000000000000e+01 373 144 -8.33333333333333e+00 373 120 -8.33333333333333e+00 373 126 8.33333333333333e+00 373 362 4.16666666666667e+00 373 122 -8.33333333333333e+00 373 58 -3.75000000000000e+01 373 360 -8.33333333333333e+00 373 57 8.33333333333333e+00 373 368 -4.16666666666667e+00 373 128 8.33333333333333e+00 373 367 -1.25000000000000e+01 373 440 4.16666666666667e+00 373 85 -3.75000000000000e+01 373 366 8.33333333333333e+00 373 372 -1.66666666666667e+01 373 84 8.33333333333333e+00 374 374 1.25000000000000e+02 374 376 -4.16666666666667e+00 374 372 -1.66666666666667e+01 374 375 8.33333333333333e+00 374 84 -4.16666666666667e+00 374 438 4.16666666666667e+00 374 377 -1.25000000000000e+01 374 57 -4.16666666666667e+00 374 138 8.33333333333333e+00 374 139 -1.66666666666667e+01 374 58 8.33333333333333e+00 374 146 -7.50000000000000e+01 374 145 1.66666666666667e+01 374 373 -1.66666666666667e+01 374 85 8.33333333333333e+00 374 144 1.66666666666667e+01 374 120 -8.33333333333333e+00 374 360 4.16666666666667e+00 374 59 -1.25000000000000e+01 374 361 4.16666666666667e+00 374 121 -8.33333333333333e+00 374 368 -1.25000000000000e+01 374 439 4.16666666666667e+00 374 86 -1.25000000000000e+01 374 367 -4.16666666666667e+00 374 127 8.33333333333333e+00 374 366 8.33333333333333e+00 374 126 -1.66666666666667e+01 375 375 1.25000000000000e+02 375 146 -1.66666666666667e+01 375 145 8.33333333333333e+00 375 59 4.16666666666667e+00 375 373 8.33333333333333e+00 375 372 -3.75000000000000e+01 375 440 -4.16666666666667e+00 375 89 4.16666666666667e+00 375 439 8.33333333333333e+00 375 438 -1.25000000000000e+01 375 140 -8.33333333333333e+00 375 139 -8.33333333333333e+00 375 143 8.33333333333333e+00 375 371 -4.16666666666667e+00 375 376 -1.66666666666667e+01 375 142 8.33333333333333e+00 375 148 -8.33333333333333e+00 375 58 -8.33333333333333e+00 375 370 8.33333333333333e+00 375 369 -1.25000000000000e+01 375 377 -1.66666666666667e+01 375 383 8.33333333333333e+00 375 149 1.66666666666667e+01 375 382 8.33333333333333e+00 375 88 -8.33333333333333e+00 375 374 8.33333333333333e+00 375 381 -3.75000000000000e+01 375 147 -2.50000000000000e+01 376 376 1.25000000000000e+02 376 146 8.33333333333333e+00 376 144 8.33333333333333e+00 376 373 -1.25000000000000e+01 376 372 8.33333333333333e+00 376 440 8.33333333333333e+00 376 377 -1.66666666666667e+01 376 439 -3.75000000000000e+01 376 438 8.33333333333333e+00 376 138 -8.33333333333333e+00 376 371 8.33333333333333e+00 376 375 -1.66666666666667e+01 376 143 -1.66666666666667e+01 376 149 1.66666666666667e+01 376 141 8.33333333333333e+00 376 147 -8.33333333333333e+00 376 59 4.16666666666667e+00 376 140 -8.33333333333333e+00 376 370 -3.75000000000000e+01 376 57 -8.33333333333333e+00 376 369 8.33333333333333e+00 376 383 -4.16666666666667e+00 376 89 4.16666666666667e+00 376 374 -4.16666666666667e+00 376 382 -1.25000000000000e+01 376 148 -2.50000000000000e+01 376 381 8.33333333333333e+00 376 87 -8.33333333333333e+00 377 377 1.25000000000000e+02 377 145 8.33333333333333e+00 377 372 8.33333333333333e+00 377 144 -1.66666666666667e+01 377 374 -1.25000000000000e+01 377 57 4.16666666666667e+00 377 440 -1.25000000000000e+01 377 439 8.33333333333333e+00 377 376 -1.66666666666667e+01 377 438 -4.16666666666667e+00 377 87 4.16666666666667e+00 377 138 -8.33333333333333e+00 377 370 8.33333333333333e+00 377 141 8.33333333333333e+00 377 369 -4.16666666666667e+00 377 142 -1.66666666666667e+01 377 148 1.66666666666667e+01 377 371 -1.25000000000000e+01 377 58 4.16666666666667e+00 377 139 -8.33333333333333e+00 377 373 -4.16666666666667e+00 377 383 -1.25000000000000e+01 377 149 -7.50000000000000e+01 377 382 -4.16666666666667e+00 377 88 4.16666666666667e+00 377 375 -1.66666666666667e+01 377 381 8.33333333333333e+00 377 147 1.66666666666667e+01 378 378 5.00000000000000e+01 378 160 4.16666666666667e+00 378 392 4.16666666666667e+00 378 386 -4.16666666666667e+00 378 62 4.16666666666667e+00 378 161 -8.33333333333333e+00 378 61 4.16666666666667e+00 378 379 -8.33333333333333e+00 378 385 8.33333333333333e+00 378 60 -1.25000000000000e+01 378 384 -1.25000000000000e+01 378 380 -8.33333333333333e+00 378 65 4.16666666666667e+00 378 164 8.33333333333333e+00 378 64 4.16666666666667e+00 378 391 -8.33333333333333e+00 378 163 -4.16666666666667e+00 378 63 -1.25000000000000e+01 378 162 -1.25000000000000e+01 379 379 5.83333333333333e+01 379 159 4.16666666666667e+00 379 164 8.33333333333333e+00 379 380 -1.66666666666667e+01 379 386 8.33333333333333e+00 379 62 -4.16666666666667e+00 379 161 4.16666666666667e+00 379 61 -4.16666666666667e+00 379 385 -3.75000000000000e+01 379 60 4.16666666666667e+00 379 378 -8.33333333333333e+00 379 384 8.33333333333333e+00 379 65 -4.16666666666667e+00 379 392 4.16666666666667e+00 379 162 -4.16666666666667e+00 379 64 -4.16666666666667e+00 379 163 -1.25000000000000e+01 379 63 4.16666666666667e+00 379 390 -8.33333333333333e+00 380 380 5.83333333333333e+01 380 379 -1.66666666666667e+01 380 385 8.33333333333333e+00 380 390 4.16666666666667e+00 380 384 -4.16666666666667e+00 380 62 -4.16666666666667e+00 380 386 -1.25000000000000e+01 380 61 -4.16666666666667e+00 380 160 4.16666666666667e+00 380 60 4.16666666666667e+00 380 159 -8.33333333333333e+00 380 163 8.33333333333333e+00 380 65 -4.16666666666667e+00 380 164 -3.75000000000000e+01 380 64 -4.16666666666667e+00 380 391 4.16666666666667e+00 380 378 -8.33333333333333e+00 380 63 4.16666666666667e+00 380 162 8.33333333333333e+00 381 381 1.25000000000000e+02 381 386 8.33333333333333e+00 381 89 -4.16666666666667e+00 381 443 4.16666666666667e+00 381 442 -8.33333333333333e+00 381 62 -4.16666666666667e+00 381 385 8.33333333333333e+00 381 384 -3.75000000000000e+01 381 161 8.33333333333333e+00 381 160 8.33333333333333e+00 381 167 1.66666666666667e+01 381 166 -8.33333333333333e+00 381 165 -2.50000000000000e+01 381 143 -8.33333333333333e+00 381 371 4.16666666666667e+00 381 142 -8.33333333333333e+00 381 148 8.33333333333333e+00 381 370 -8.33333333333333e+00 381 61 8.33333333333333e+00 381 60 -1.25000000000000e+01 381 377 8.33333333333333e+00 381 149 -1.66666666666667e+01 381 376 8.33333333333333e+00 381 382 -1.66666666666667e+01 381 88 8.33333333333333e+00 381 375 -3.75000000000000e+01 381 383 -1.66666666666667e+01 381 87 -1.25000000000000e+01 382 382 1.25000000000000e+02 382 386 -4.16666666666667e+00 382 441 -8.33333333333333e+00 382 385 -1.25000000000000e+01 382 384 8.33333333333333e+00 382 161 -1.66666666666667e+01 382 62 8.33333333333333e+00 382 159 8.33333333333333e+00 382 167 1.66666666666667e+01 382 383 -1.66666666666667e+01 382 89 8.33333333333333e+00 382 166 -2.50000000000000e+01 382 165 -8.33333333333333e+00 382 141 -8.33333333333333e+00 382 147 8.33333333333333e+00 382 371 4.16666666666667e+00 382 143 -8.33333333333333e+00 382 61 -3.75000000000000e+01 382 369 -8.33333333333333e+00 382 60 8.33333333333333e+00 382 377 -4.16666666666667e+00 382 149 8.33333333333333e+00 382 376 -1.25000000000000e+01 382 443 4.16666666666667e+00 382 88 -3.75000000000000e+01 382 375 8.33333333333333e+00 382 381 -1.66666666666667e+01 382 87 8.33333333333333e+00 383 383 1.25000000000000e+02 383 385 -4.16666666666667e+00 383 381 -1.66666666666667e+01 383 384 8.33333333333333e+00 383 87 -4.16666666666667e+00 383 441 4.16666666666667e+00 383 386 -1.25000000000000e+01 383 60 -4.16666666666667e+00 383 159 8.33333333333333e+00 383 160 -1.66666666666667e+01 383 61 8.33333333333333e+00 383 167 -7.50000000000000e+01 383 166 1.66666666666667e+01 383 382 -1.66666666666667e+01 383 88 8.33333333333333e+00 383 165 1.66666666666667e+01 383 141 -8.33333333333333e+00 383 369 4.16666666666667e+00 383 62 -1.25000000000000e+01 383 370 4.16666666666667e+00 383 142 -8.33333333333333e+00 383 377 -1.25000000000000e+01 383 442 4.16666666666667e+00 383 89 -1.25000000000000e+01 383 376 -4.16666666666667e+00 383 148 8.33333333333333e+00 383 375 8.33333333333333e+00 383 147 -1.66666666666667e+01 384 384 1.25000000000000e+02 384 167 -1.66666666666667e+01 384 166 8.33333333333333e+00 384 62 4.16666666666667e+00 384 382 8.33333333333333e+00 384 381 -3.75000000000000e+01 384 443 -4.16666666666667e+00 384 92 4.16666666666667e+00 384 442 8.33333333333333e+00 384 441 -1.25000000000000e+01 384 161 -8.33333333333333e+00 384 160 -8.33333333333333e+00 384 164 8.33333333333333e+00 384 380 -4.16666666666667e+00 384 385 -1.66666666666667e+01 384 163 8.33333333333333e+00 384 169 -8.33333333333333e+00 384 61 -8.33333333333333e+00 384 379 8.33333333333333e+00 384 378 -1.25000000000000e+01 384 386 -1.66666666666667e+01 384 392 8.33333333333333e+00 384 170 1.66666666666667e+01 384 391 8.33333333333333e+00 384 91 -8.33333333333333e+00 384 383 8.33333333333333e+00 384 390 -3.75000000000000e+01 384 168 -2.50000000000000e+01 385 385 1.25000000000000e+02 385 167 8.33333333333333e+00 385 165 8.33333333333333e+00 385 382 -1.25000000000000e+01 385 381 8.33333333333333e+00 385 443 8.33333333333333e+00 385 386 -1.66666666666667e+01 385 442 -3.75000000000000e+01 385 441 8.33333333333333e+00 385 159 -8.33333333333333e+00 385 380 8.33333333333333e+00 385 384 -1.66666666666667e+01 385 164 -1.66666666666667e+01 385 170 1.66666666666667e+01 385 162 8.33333333333333e+00 385 168 -8.33333333333333e+00 385 62 4.16666666666667e+00 385 161 -8.33333333333333e+00 385 379 -3.75000000000000e+01 385 60 -8.33333333333333e+00 385 378 8.33333333333333e+00 385 392 -4.16666666666667e+00 385 92 4.16666666666667e+00 385 383 -4.16666666666667e+00 385 391 -1.25000000000000e+01 385 169 -2.50000000000000e+01 385 390 8.33333333333333e+00 385 90 -8.33333333333333e+00 386 386 1.25000000000000e+02 386 166 8.33333333333333e+00 386 381 8.33333333333333e+00 386 165 -1.66666666666667e+01 386 383 -1.25000000000000e+01 386 60 4.16666666666667e+00 386 443 -1.25000000000000e+01 386 442 8.33333333333333e+00 386 385 -1.66666666666667e+01 386 441 -4.16666666666667e+00 386 90 4.16666666666667e+00 386 159 -8.33333333333333e+00 386 379 8.33333333333333e+00 386 162 8.33333333333333e+00 386 378 -4.16666666666667e+00 386 163 -1.66666666666667e+01 386 169 1.66666666666667e+01 386 380 -1.25000000000000e+01 386 61 4.16666666666667e+00 386 160 -8.33333333333333e+00 386 382 -4.16666666666667e+00 386 392 -1.25000000000000e+01 386 170 -7.50000000000000e+01 386 391 -4.16666666666667e+00 386 91 4.16666666666667e+00 386 384 -1.66666666666667e+01 386 390 8.33333333333333e+00 386 168 1.66666666666667e+01 387 387 5.00000000000000e+01 387 181 4.16666666666667e+00 387 401 4.16666666666667e+00 387 395 -4.16666666666667e+00 387 65 4.16666666666667e+00 387 182 -8.33333333333333e+00 387 64 4.16666666666667e+00 387 388 -8.33333333333333e+00 387 394 8.33333333333333e+00 387 63 -1.25000000000000e+01 387 393 -1.25000000000000e+01 387 389 -8.33333333333333e+00 387 68 4.16666666666667e+00 387 185 8.33333333333333e+00 387 67 4.16666666666667e+00 387 400 -8.33333333333333e+00 387 184 -4.16666666666667e+00 387 66 -1.25000000000000e+01 387 183 -1.25000000000000e+01 388 388 5.83333333333333e+01 388 180 4.16666666666667e+00 388 185 8.33333333333333e+00 388 389 -1.66666666666667e+01 388 395 8.33333333333333e+00 388 65 -4.16666666666667e+00 388 182 4.16666666666667e+00 388 64 -4.16666666666667e+00 388 394 -3.75000000000000e+01 388 63 4.16666666666667e+00 388 387 -8.33333333333333e+00 388 393 8.33333333333333e+00 388 68 -4.16666666666667e+00 388 401 4.16666666666667e+00 388 183 -4.16666666666667e+00 388 67 -4.16666666666667e+00 388 184 -1.25000000000000e+01 388 66 4.16666666666667e+00 388 399 -8.33333333333333e+00 389 389 5.83333333333333e+01 389 388 -1.66666666666667e+01 389 394 8.33333333333333e+00 389 399 4.16666666666667e+00 389 393 -4.16666666666667e+00 389 65 -4.16666666666667e+00 389 395 -1.25000000000000e+01 389 64 -4.16666666666667e+00 389 181 4.16666666666667e+00 389 63 4.16666666666667e+00 389 180 -8.33333333333333e+00 389 184 8.33333333333333e+00 389 68 -4.16666666666667e+00 389 185 -3.75000000000000e+01 389 67 -4.16666666666667e+00 389 400 4.16666666666667e+00 389 387 -8.33333333333333e+00 389 66 4.16666666666667e+00 389 183 8.33333333333333e+00 390 390 1.25000000000000e+02 390 395 8.33333333333333e+00 390 92 -4.16666666666667e+00 390 446 4.16666666666667e+00 390 445 -8.33333333333333e+00 390 65 -4.16666666666667e+00 390 394 8.33333333333333e+00 390 393 -3.75000000000000e+01 390 182 8.33333333333333e+00 390 181 8.33333333333333e+00 390 188 1.66666666666667e+01 390 187 -8.33333333333333e+00 390 186 -2.50000000000000e+01 390 164 -8.33333333333333e+00 390 380 4.16666666666667e+00 390 163 -8.33333333333333e+00 390 169 8.33333333333333e+00 390 379 -8.33333333333333e+00 390 64 8.33333333333333e+00 390 63 -1.25000000000000e+01 390 386 8.33333333333333e+00 390 170 -1.66666666666667e+01 390 385 8.33333333333333e+00 390 391 -1.66666666666667e+01 390 91 8.33333333333333e+00 390 384 -3.75000000000000e+01 390 392 -1.66666666666667e+01 390 90 -1.25000000000000e+01 391 391 1.25000000000000e+02 391 395 -4.16666666666667e+00 391 444 -8.33333333333333e+00 391 394 -1.25000000000000e+01 391 393 8.33333333333333e+00 391 182 -1.66666666666667e+01 391 65 8.33333333333333e+00 391 180 8.33333333333333e+00 391 188 1.66666666666667e+01 391 392 -1.66666666666667e+01 391 92 8.33333333333333e+00 391 187 -2.50000000000000e+01 391 186 -8.33333333333333e+00 391 162 -8.33333333333333e+00 391 168 8.33333333333333e+00 391 380 4.16666666666667e+00 391 164 -8.33333333333333e+00 391 64 -3.75000000000000e+01 391 378 -8.33333333333333e+00 391 63 8.33333333333333e+00 391 386 -4.16666666666667e+00 391 170 8.33333333333333e+00 391 385 -1.25000000000000e+01 391 446 4.16666666666667e+00 391 91 -3.75000000000000e+01 391 384 8.33333333333333e+00 391 390 -1.66666666666667e+01 391 90 8.33333333333333e+00 392 392 1.25000000000000e+02 392 394 -4.16666666666667e+00 392 390 -1.66666666666667e+01 392 393 8.33333333333333e+00 392 90 -4.16666666666667e+00 392 444 4.16666666666667e+00 392 395 -1.25000000000000e+01 392 63 -4.16666666666667e+00 392 180 8.33333333333333e+00 392 181 -1.66666666666667e+01 392 64 8.33333333333333e+00 392 188 -7.50000000000000e+01 392 187 1.66666666666667e+01 392 391 -1.66666666666667e+01 392 91 8.33333333333333e+00 392 186 1.66666666666667e+01 392 162 -8.33333333333333e+00 392 378 4.16666666666667e+00 392 65 -1.25000000000000e+01 392 379 4.16666666666667e+00 392 163 -8.33333333333333e+00 392 386 -1.25000000000000e+01 392 445 4.16666666666667e+00 392 92 -1.25000000000000e+01 392 385 -4.16666666666667e+00 392 169 8.33333333333333e+00 392 384 8.33333333333333e+00 392 168 -1.66666666666667e+01 393 393 1.25000000000000e+02 393 188 -1.66666666666667e+01 393 187 8.33333333333333e+00 393 65 4.16666666666667e+00 393 391 8.33333333333333e+00 393 390 -3.75000000000000e+01 393 446 -4.16666666666667e+00 393 95 4.16666666666667e+00 393 445 8.33333333333333e+00 393 444 -1.25000000000000e+01 393 182 -8.33333333333333e+00 393 181 -8.33333333333333e+00 393 185 8.33333333333333e+00 393 389 -4.16666666666667e+00 393 394 -1.66666666666667e+01 393 184 8.33333333333333e+00 393 190 -8.33333333333333e+00 393 64 -8.33333333333333e+00 393 388 8.33333333333333e+00 393 387 -1.25000000000000e+01 393 395 -1.66666666666667e+01 393 401 8.33333333333333e+00 393 191 1.66666666666667e+01 393 400 8.33333333333333e+00 393 94 -8.33333333333333e+00 393 392 8.33333333333333e+00 393 399 -3.75000000000000e+01 393 189 -2.50000000000000e+01 394 394 1.25000000000000e+02 394 188 8.33333333333333e+00 394 186 8.33333333333333e+00 394 391 -1.25000000000000e+01 394 390 8.33333333333333e+00 394 446 8.33333333333333e+00 394 395 -1.66666666666667e+01 394 445 -3.75000000000000e+01 394 444 8.33333333333333e+00 394 180 -8.33333333333333e+00 394 389 8.33333333333333e+00 394 393 -1.66666666666667e+01 394 185 -1.66666666666667e+01 394 191 1.66666666666667e+01 394 183 8.33333333333333e+00 394 189 -8.33333333333333e+00 394 65 4.16666666666667e+00 394 182 -8.33333333333333e+00 394 388 -3.75000000000000e+01 394 63 -8.33333333333333e+00 394 387 8.33333333333333e+00 394 401 -4.16666666666667e+00 394 95 4.16666666666667e+00 394 392 -4.16666666666667e+00 394 400 -1.25000000000000e+01 394 190 -2.50000000000000e+01 394 399 8.33333333333333e+00 394 93 -8.33333333333333e+00 395 395 1.25000000000000e+02 395 187 8.33333333333333e+00 395 390 8.33333333333333e+00 395 186 -1.66666666666667e+01 395 392 -1.25000000000000e+01 395 63 4.16666666666667e+00 395 446 -1.25000000000000e+01 395 445 8.33333333333333e+00 395 394 -1.66666666666667e+01 395 444 -4.16666666666667e+00 395 93 4.16666666666667e+00 395 180 -8.33333333333333e+00 395 388 8.33333333333333e+00 395 183 8.33333333333333e+00 395 387 -4.16666666666667e+00 395 184 -1.66666666666667e+01 395 190 1.66666666666667e+01 395 389 -1.25000000000000e+01 395 64 4.16666666666667e+00 395 181 -8.33333333333333e+00 395 391 -4.16666666666667e+00 395 401 -1.25000000000000e+01 395 191 -7.50000000000000e+01 395 400 -4.16666666666667e+00 395 94 4.16666666666667e+00 395 393 -1.66666666666667e+01 395 399 8.33333333333333e+00 395 189 1.66666666666667e+01 396 396 1.00000000000000e+00 396 202 8.33333333333333e-02 396 410 8.33333333333333e-02 396 404 -8.33333333333333e-02 396 68 8.33333333333333e-02 396 203 -1.66666666666667e-01 396 67 8.33333333333333e-02 396 397 -1.66666666666667e-01 396 403 1.66666666666667e-01 396 66 -2.50000000000000e-01 396 402 -2.50000000000000e-01 396 398 -1.66666666666667e-01 396 71 8.33333333333333e-02 396 206 1.66666666666667e-01 396 70 8.33333333333333e-02 396 409 -1.66666666666667e-01 396 205 -8.33333333333333e-02 396 69 -2.50000000000000e-01 396 204 -2.50000000000000e-01 397 397 1.16666666666667e+00 397 201 8.33333333333333e-02 397 206 1.66666666666667e-01 397 398 -3.33333333333333e-01 397 404 1.66666666666667e-01 397 68 -8.33333333333333e-02 397 203 8.33333333333333e-02 397 67 -8.33333333333333e-02 397 403 -7.50000000000000e-01 397 66 8.33333333333333e-02 397 396 -1.66666666666667e-01 397 402 1.66666666666667e-01 397 71 -8.33333333333333e-02 397 410 8.33333333333333e-02 397 204 -8.33333333333333e-02 397 70 -8.33333333333333e-02 397 205 -2.50000000000000e-01 397 69 8.33333333333333e-02 397 408 -1.66666666666667e-01 398 398 1.16666666666667e+00 398 397 -3.33333333333333e-01 398 403 1.66666666666667e-01 398 408 8.33333333333333e-02 398 402 -8.33333333333333e-02 398 68 -8.33333333333333e-02 398 404 -2.50000000000000e-01 398 67 -8.33333333333333e-02 398 202 8.33333333333333e-02 398 66 8.33333333333333e-02 398 201 -1.66666666666667e-01 398 205 1.66666666666667e-01 398 71 -8.33333333333333e-02 398 206 -7.50000000000000e-01 398 70 -8.33333333333333e-02 398 409 8.33333333333333e-02 398 396 -1.66666666666667e-01 398 69 8.33333333333333e-02 398 204 1.66666666666667e-01 399 399 6.78333333333333e+01 399 404 1.66666666666667e-01 399 95 -8.33333333333333e-02 399 449 8.33333333333333e-02 399 448 -1.66666666666667e-01 399 68 -8.33333333333333e-02 399 403 1.66666666666667e-01 399 402 -7.50000000000000e-01 399 203 4.25000000000000e+00 399 202 4.25000000000000e+00 399 209 8.50000000000000e+00 399 208 -4.25000000000000e+00 399 207 -1.27500000000000e+01 399 185 -8.33333333333333e+00 399 389 4.16666666666667e+00 399 184 -8.33333333333333e+00 399 190 8.33333333333333e+00 399 388 -8.33333333333333e+00 399 67 4.25000000000000e+00 399 66 -8.41666666666667e+00 399 395 8.33333333333333e+00 399 191 -1.66666666666667e+01 399 394 8.33333333333333e+00 399 400 -8.50000000000000e+00 399 94 4.25000000000000e+00 399 393 -3.75000000000000e+01 399 401 -3.33333333333333e-01 399 93 -8.41666666666667e+00 400 400 7.60000000000000e+01 400 404 -8.33333333333333e-02 400 447 -1.66666666666667e-01 400 403 -2.50000000000000e-01 400 402 1.66666666666667e-01 400 203 -8.50000000000000e+00 400 68 4.25000000000000e+00 400 201 4.25000000000000e+00 400 209 8.50000000000000e+00 400 401 -8.50000000000000e+00 400 95 4.25000000000000e+00 400 208 -1.27500000000000e+01 400 207 -4.25000000000000e+00 400 183 -8.33333333333333e+00 400 189 8.33333333333333e+00 400 389 4.16666666666667e+00 400 185 -8.33333333333333e+00 400 67 -2.52500000000000e+01 400 387 -8.33333333333333e+00 400 66 4.25000000000000e+00 400 395 -4.16666666666667e+00 400 191 8.33333333333333e+00 400 394 -1.25000000000000e+01 400 449 8.33333333333333e-02 400 94 -2.52500000000000e+01 400 393 8.33333333333333e+00 400 399 -8.50000000000000e+00 400 93 4.25000000000000e+00 401 401 6.78333333333333e+01 401 403 -8.33333333333333e-02 401 399 -3.33333333333333e-01 401 402 1.66666666666667e-01 401 93 -8.33333333333333e-02 401 447 8.33333333333333e-02 401 404 -2.50000000000000e-01 401 66 -8.33333333333333e-02 401 201 4.25000000000000e+00 401 202 -8.50000000000000e+00 401 67 4.25000000000000e+00 401 209 -3.82500000000000e+01 401 208 8.50000000000000e+00 401 400 -8.50000000000000e+00 401 94 4.25000000000000e+00 401 207 8.50000000000000e+00 401 183 -8.33333333333333e+00 401 387 4.16666666666667e+00 401 68 -8.41666666666667e+00 401 388 4.16666666666667e+00 401 184 -8.33333333333333e+00 401 395 -1.25000000000000e+01 401 448 8.33333333333333e-02 401 95 -8.41666666666667e+00 401 394 -4.16666666666667e+00 401 190 8.33333333333333e+00 401 393 8.33333333333333e+00 401 189 -1.66666666666667e+01 402 402 2.50000000000000e+00 402 209 -3.33333333333333e-01 402 208 1.66666666666667e-01 402 68 8.33333333333333e-02 402 400 1.66666666666667e-01 402 399 -7.50000000000000e-01 402 449 -8.33333333333333e-02 402 98 8.33333333333333e-02 402 448 1.66666666666667e-01 402 447 -2.50000000000000e-01 402 203 -1.66666666666667e-01 402 202 -1.66666666666667e-01 402 206 1.66666666666667e-01 402 398 -8.33333333333333e-02 402 403 -3.33333333333333e-01 402 205 1.66666666666667e-01 402 211 -1.66666666666667e-01 402 67 -1.66666666666667e-01 402 397 1.66666666666667e-01 402 396 -2.50000000000000e-01 402 404 -3.33333333333333e-01 402 410 1.66666666666667e-01 402 212 3.33333333333333e-01 402 409 1.66666666666667e-01 402 97 -1.66666666666667e-01 402 401 1.66666666666667e-01 402 408 -7.50000000000000e-01 402 210 -5.00000000000000e-01 403 403 2.50000000000000e+00 403 209 1.66666666666667e-01 403 207 1.66666666666667e-01 403 400 -2.50000000000000e-01 403 399 1.66666666666667e-01 403 449 1.66666666666667e-01 403 404 -3.33333333333333e-01 403 448 -7.50000000000000e-01 403 447 1.66666666666667e-01 403 201 -1.66666666666667e-01 403 398 1.66666666666667e-01 403 402 -3.33333333333333e-01 403 206 -3.33333333333333e-01 403 212 3.33333333333333e-01 403 204 1.66666666666667e-01 403 210 -1.66666666666667e-01 403 68 8.33333333333333e-02 403 203 -1.66666666666667e-01 403 397 -7.50000000000000e-01 403 66 -1.66666666666667e-01 403 396 1.66666666666667e-01 403 410 -8.33333333333333e-02 403 98 8.33333333333333e-02 403 401 -8.33333333333333e-02 403 409 -2.50000000000000e-01 403 211 -5.00000000000000e-01 403 408 1.66666666666667e-01 403 96 -1.66666666666667e-01 404 404 2.50000000000000e+00 404 208 1.66666666666667e-01 404 399 1.66666666666667e-01 404 207 -3.33333333333333e-01 404 401 -2.50000000000000e-01 404 66 8.33333333333333e-02 404 449 -2.50000000000000e-01 404 448 1.66666666666667e-01 404 403 -3.33333333333333e-01 404 447 -8.33333333333333e-02 404 96 8.33333333333333e-02 404 201 -1.66666666666667e-01 404 397 1.66666666666667e-01 404 204 1.66666666666667e-01 404 396 -8.33333333333333e-02 404 205 -3.33333333333333e-01 404 211 3.33333333333333e-01 404 398 -2.50000000000000e-01 404 67 8.33333333333333e-02 404 202 -1.66666666666667e-01 404 400 -8.33333333333333e-02 404 410 -2.50000000000000e-01 404 212 -1.50000000000000e+00 404 409 -8.33333333333333e-02 404 97 8.33333333333333e-02 404 402 -3.33333333333333e-01 404 408 1.66666666666667e-01 404 210 3.33333333333333e-01 405 405 1.00000000000000e+00 405 223 8.33333333333333e-02 405 419 8.33333333333333e-02 405 413 -8.33333333333333e-02 405 71 8.33333333333333e-02 405 224 -1.66666666666667e-01 405 70 8.33333333333333e-02 405 406 -1.66666666666667e-01 405 412 1.66666666666667e-01 405 69 -2.50000000000000e-01 405 411 -2.50000000000000e-01 405 407 -1.66666666666667e-01 405 74 8.33333333333333e-02 405 227 1.66666666666667e-01 405 73 8.33333333333333e-02 405 418 -1.66666666666667e-01 405 226 -8.33333333333333e-02 405 72 -2.50000000000000e-01 405 225 -2.50000000000000e-01 406 406 1.16666666666667e+00 406 222 8.33333333333333e-02 406 227 1.66666666666667e-01 406 407 -3.33333333333333e-01 406 413 1.66666666666667e-01 406 71 -8.33333333333333e-02 406 224 8.33333333333333e-02 406 70 -8.33333333333333e-02 406 412 -7.50000000000000e-01 406 69 8.33333333333333e-02 406 405 -1.66666666666667e-01 406 411 1.66666666666667e-01 406 74 -8.33333333333333e-02 406 419 8.33333333333333e-02 406 225 -8.33333333333333e-02 406 73 -8.33333333333333e-02 406 226 -2.50000000000000e-01 406 72 8.33333333333333e-02 406 417 -1.66666666666667e-01 407 407 1.16666666666667e+00 407 406 -3.33333333333333e-01 407 412 1.66666666666667e-01 407 417 8.33333333333333e-02 407 411 -8.33333333333333e-02 407 71 -8.33333333333333e-02 407 413 -2.50000000000000e-01 407 70 -8.33333333333333e-02 407 223 8.33333333333333e-02 407 69 8.33333333333333e-02 407 222 -1.66666666666667e-01 407 226 1.66666666666667e-01 407 74 -8.33333333333333e-02 407 227 -7.50000000000000e-01 407 73 -8.33333333333333e-02 407 418 8.33333333333333e-02 407 405 -1.66666666666667e-01 407 72 8.33333333333333e-02 407 225 1.66666666666667e-01 408 408 2.50000000000000e+00 408 413 1.66666666666667e-01 408 98 -8.33333333333333e-02 408 452 8.33333333333333e-02 408 451 -1.66666666666667e-01 408 71 -8.33333333333333e-02 408 412 1.66666666666667e-01 408 411 -7.50000000000000e-01 408 224 1.66666666666667e-01 408 223 1.66666666666667e-01 408 230 3.33333333333333e-01 408 229 -1.66666666666667e-01 408 228 -5.00000000000000e-01 408 206 -1.66666666666667e-01 408 398 8.33333333333333e-02 408 205 -1.66666666666667e-01 408 211 1.66666666666667e-01 408 397 -1.66666666666667e-01 408 70 1.66666666666667e-01 408 69 -2.50000000000000e-01 408 404 1.66666666666667e-01 408 212 -3.33333333333333e-01 408 403 1.66666666666667e-01 408 409 -3.33333333333333e-01 408 97 1.66666666666667e-01 408 402 -7.50000000000000e-01 408 410 -3.33333333333333e-01 408 96 -2.50000000000000e-01 409 409 2.50000000000000e+00 409 413 -8.33333333333333e-02 409 450 -1.66666666666667e-01 409 412 -2.50000000000000e-01 409 411 1.66666666666667e-01 409 224 -3.33333333333333e-01 409 71 1.66666666666667e-01 409 222 1.66666666666667e-01 409 230 3.33333333333333e-01 409 410 -3.33333333333333e-01 409 98 1.66666666666667e-01 409 229 -5.00000000000000e-01 409 228 -1.66666666666667e-01 409 204 -1.66666666666667e-01 409 210 1.66666666666667e-01 409 398 8.33333333333333e-02 409 206 -1.66666666666667e-01 409 70 -7.50000000000000e-01 409 396 -1.66666666666667e-01 409 69 1.66666666666667e-01 409 404 -8.33333333333333e-02 409 212 1.66666666666667e-01 409 403 -2.50000000000000e-01 409 452 8.33333333333333e-02 409 97 -7.50000000000000e-01 409 402 1.66666666666667e-01 409 408 -3.33333333333333e-01 409 96 1.66666666666667e-01 410 410 2.50000000000000e+00 410 412 -8.33333333333333e-02 410 408 -3.33333333333333e-01 410 411 1.66666666666667e-01 410 96 -8.33333333333333e-02 410 450 8.33333333333333e-02 410 413 -2.50000000000000e-01 410 69 -8.33333333333333e-02 410 222 1.66666666666667e-01 410 223 -3.33333333333333e-01 410 70 1.66666666666667e-01 410 230 -1.50000000000000e+00 410 229 3.33333333333333e-01 410 409 -3.33333333333333e-01 410 97 1.66666666666667e-01 410 228 3.33333333333333e-01 410 204 -1.66666666666667e-01 410 396 8.33333333333333e-02 410 71 -2.50000000000000e-01 410 397 8.33333333333333e-02 410 205 -1.66666666666667e-01 410 404 -2.50000000000000e-01 410 451 8.33333333333333e-02 410 98 -2.50000000000000e-01 410 403 -8.33333333333333e-02 410 211 1.66666666666667e-01 410 402 1.66666666666667e-01 410 210 -3.33333333333333e-01 411 411 2.50000000000000e+00 411 230 -3.33333333333333e-01 411 229 1.66666666666667e-01 411 71 8.33333333333333e-02 411 409 1.66666666666667e-01 411 408 -7.50000000000000e-01 411 452 -8.33333333333333e-02 411 101 8.33333333333333e-02 411 451 1.66666666666667e-01 411 450 -2.50000000000000e-01 411 224 -1.66666666666667e-01 411 223 -1.66666666666667e-01 411 227 1.66666666666667e-01 411 407 -8.33333333333333e-02 411 412 -3.33333333333333e-01 411 226 1.66666666666667e-01 411 232 -1.66666666666667e-01 411 70 -1.66666666666667e-01 411 406 1.66666666666667e-01 411 405 -2.50000000000000e-01 411 413 -3.33333333333333e-01 411 419 1.66666666666667e-01 411 233 3.33333333333333e-01 411 418 1.66666666666667e-01 411 100 -1.66666666666667e-01 411 410 1.66666666666667e-01 411 417 -7.50000000000000e-01 411 231 -5.00000000000000e-01 412 412 2.50000000000000e+00 412 230 1.66666666666667e-01 412 228 1.66666666666667e-01 412 409 -2.50000000000000e-01 412 408 1.66666666666667e-01 412 452 1.66666666666667e-01 412 413 -3.33333333333333e-01 412 451 -7.50000000000000e-01 412 450 1.66666666666667e-01 412 222 -1.66666666666667e-01 412 407 1.66666666666667e-01 412 411 -3.33333333333333e-01 412 227 -3.33333333333333e-01 412 233 3.33333333333333e-01 412 225 1.66666666666667e-01 412 231 -1.66666666666667e-01 412 71 8.33333333333333e-02 412 224 -1.66666666666667e-01 412 406 -7.50000000000000e-01 412 69 -1.66666666666667e-01 412 405 1.66666666666667e-01 412 419 -8.33333333333333e-02 412 101 8.33333333333333e-02 412 410 -8.33333333333333e-02 412 418 -2.50000000000000e-01 412 232 -5.00000000000000e-01 412 417 1.66666666666667e-01 412 99 -1.66666666666667e-01 413 413 2.50000000000000e+00 413 229 1.66666666666667e-01 413 408 1.66666666666667e-01 413 228 -3.33333333333333e-01 413 410 -2.50000000000000e-01 413 69 8.33333333333333e-02 413 452 -2.50000000000000e-01 413 451 1.66666666666667e-01 413 412 -3.33333333333333e-01 413 450 -8.33333333333333e-02 413 99 8.33333333333333e-02 413 222 -1.66666666666667e-01 413 406 1.66666666666667e-01 413 225 1.66666666666667e-01 413 405 -8.33333333333333e-02 413 226 -3.33333333333333e-01 413 232 3.33333333333333e-01 413 407 -2.50000000000000e-01 413 70 8.33333333333333e-02 413 223 -1.66666666666667e-01 413 409 -8.33333333333333e-02 413 419 -2.50000000000000e-01 413 233 -1.50000000000000e+00 413 418 -8.33333333333333e-02 413 100 8.33333333333333e-02 413 411 -3.33333333333333e-01 413 417 1.66666666666667e-01 413 231 3.33333333333333e-01 414 414 1.00000000000000e+00 414 244 8.33333333333333e-02 414 428 8.33333333333333e-02 414 422 -8.33333333333333e-02 414 74 8.33333333333333e-02 414 245 -1.66666666666667e-01 414 73 8.33333333333333e-02 414 415 -1.66666666666667e-01 414 421 1.66666666666667e-01 414 72 -2.50000000000000e-01 414 420 -2.50000000000000e-01 414 416 -1.66666666666667e-01 414 77 8.33333333333333e-02 414 248 1.66666666666667e-01 414 76 8.33333333333333e-02 414 427 -1.66666666666667e-01 414 247 -8.33333333333333e-02 414 75 -2.50000000000000e-01 414 246 -2.50000000000000e-01 415 415 1.16666666666667e+00 415 243 8.33333333333333e-02 415 248 1.66666666666667e-01 415 416 -3.33333333333333e-01 415 422 1.66666666666667e-01 415 74 -8.33333333333333e-02 415 245 8.33333333333333e-02 415 73 -8.33333333333333e-02 415 421 -7.50000000000000e-01 415 72 8.33333333333333e-02 415 414 -1.66666666666667e-01 415 420 1.66666666666667e-01 415 77 -8.33333333333333e-02 415 428 8.33333333333333e-02 415 246 -8.33333333333333e-02 415 76 -8.33333333333333e-02 415 247 -2.50000000000000e-01 415 75 8.33333333333333e-02 415 426 -1.66666666666667e-01 416 416 1.16666666666667e+00 416 415 -3.33333333333333e-01 416 421 1.66666666666667e-01 416 426 8.33333333333333e-02 416 420 -8.33333333333333e-02 416 74 -8.33333333333333e-02 416 422 -2.50000000000000e-01 416 73 -8.33333333333333e-02 416 244 8.33333333333333e-02 416 72 8.33333333333333e-02 416 243 -1.66666666666667e-01 416 247 1.66666666666667e-01 416 77 -8.33333333333333e-02 416 248 -7.50000000000000e-01 416 76 -8.33333333333333e-02 416 427 8.33333333333333e-02 416 414 -1.66666666666667e-01 416 75 8.33333333333333e-02 416 246 1.66666666666667e-01 417 417 2.50000000000000e+00 417 422 1.66666666666667e-01 417 101 -8.33333333333333e-02 417 455 8.33333333333333e-02 417 454 -1.66666666666667e-01 417 74 -8.33333333333333e-02 417 421 1.66666666666667e-01 417 420 -7.50000000000000e-01 417 245 1.66666666666667e-01 417 244 1.66666666666667e-01 417 251 3.33333333333333e-01 417 250 -1.66666666666667e-01 417 249 -5.00000000000000e-01 417 227 -1.66666666666667e-01 417 407 8.33333333333333e-02 417 226 -1.66666666666667e-01 417 232 1.66666666666667e-01 417 406 -1.66666666666667e-01 417 73 1.66666666666667e-01 417 72 -2.50000000000000e-01 417 413 1.66666666666667e-01 417 233 -3.33333333333333e-01 417 412 1.66666666666667e-01 417 418 -3.33333333333333e-01 417 100 1.66666666666667e-01 417 411 -7.50000000000000e-01 417 419 -3.33333333333333e-01 417 99 -2.50000000000000e-01 418 418 2.50000000000000e+00 418 422 -8.33333333333333e-02 418 453 -1.66666666666667e-01 418 421 -2.50000000000000e-01 418 420 1.66666666666667e-01 418 245 -3.33333333333333e-01 418 74 1.66666666666667e-01 418 243 1.66666666666667e-01 418 251 3.33333333333333e-01 418 419 -3.33333333333333e-01 418 101 1.66666666666667e-01 418 250 -5.00000000000000e-01 418 249 -1.66666666666667e-01 418 225 -1.66666666666667e-01 418 231 1.66666666666667e-01 418 407 8.33333333333333e-02 418 227 -1.66666666666667e-01 418 73 -7.50000000000000e-01 418 405 -1.66666666666667e-01 418 72 1.66666666666667e-01 418 413 -8.33333333333333e-02 418 233 1.66666666666667e-01 418 412 -2.50000000000000e-01 418 455 8.33333333333333e-02 418 100 -7.50000000000000e-01 418 411 1.66666666666667e-01 418 417 -3.33333333333333e-01 418 99 1.66666666666667e-01 419 419 2.50000000000000e+00 419 421 -8.33333333333333e-02 419 417 -3.33333333333333e-01 419 420 1.66666666666667e-01 419 99 -8.33333333333333e-02 419 453 8.33333333333333e-02 419 422 -2.50000000000000e-01 419 72 -8.33333333333333e-02 419 243 1.66666666666667e-01 419 244 -3.33333333333333e-01 419 73 1.66666666666667e-01 419 251 -1.50000000000000e+00 419 250 3.33333333333333e-01 419 418 -3.33333333333333e-01 419 100 1.66666666666667e-01 419 249 3.33333333333333e-01 419 225 -1.66666666666667e-01 419 405 8.33333333333333e-02 419 74 -2.50000000000000e-01 419 406 8.33333333333333e-02 419 226 -1.66666666666667e-01 419 413 -2.50000000000000e-01 419 454 8.33333333333333e-02 419 101 -2.50000000000000e-01 419 412 -8.33333333333333e-02 419 232 1.66666666666667e-01 419 411 1.66666666666667e-01 419 231 -3.33333333333333e-01 420 420 2.50000000000000e+00 420 251 -3.33333333333333e-01 420 250 1.66666666666667e-01 420 74 8.33333333333333e-02 420 418 1.66666666666667e-01 420 417 -7.50000000000000e-01 420 455 -8.33333333333333e-02 420 104 8.33333333333333e-02 420 454 1.66666666666667e-01 420 453 -2.50000000000000e-01 420 245 -1.66666666666667e-01 420 244 -1.66666666666667e-01 420 248 1.66666666666667e-01 420 416 -8.33333333333333e-02 420 421 -3.33333333333333e-01 420 247 1.66666666666667e-01 420 253 -1.66666666666667e-01 420 73 -1.66666666666667e-01 420 415 1.66666666666667e-01 420 414 -2.50000000000000e-01 420 422 -3.33333333333333e-01 420 428 1.66666666666667e-01 420 254 3.33333333333333e-01 420 427 1.66666666666667e-01 420 103 -1.66666666666667e-01 420 419 1.66666666666667e-01 420 426 -7.50000000000000e-01 420 252 -5.00000000000000e-01 421 421 2.50000000000000e+00 421 251 1.66666666666667e-01 421 249 1.66666666666667e-01 421 418 -2.50000000000000e-01 421 417 1.66666666666667e-01 421 455 1.66666666666667e-01 421 422 -3.33333333333333e-01 421 454 -7.50000000000000e-01 421 453 1.66666666666667e-01 421 243 -1.66666666666667e-01 421 416 1.66666666666667e-01 421 420 -3.33333333333333e-01 421 248 -3.33333333333333e-01 421 254 3.33333333333333e-01 421 246 1.66666666666667e-01 421 252 -1.66666666666667e-01 421 74 8.33333333333333e-02 421 245 -1.66666666666667e-01 421 415 -7.50000000000000e-01 421 72 -1.66666666666667e-01 421 414 1.66666666666667e-01 421 428 -8.33333333333333e-02 421 104 8.33333333333333e-02 421 419 -8.33333333333333e-02 421 427 -2.50000000000000e-01 421 253 -5.00000000000000e-01 421 426 1.66666666666667e-01 421 102 -1.66666666666667e-01 422 422 2.50000000000000e+00 422 250 1.66666666666667e-01 422 417 1.66666666666667e-01 422 249 -3.33333333333333e-01 422 419 -2.50000000000000e-01 422 72 8.33333333333333e-02 422 455 -2.50000000000000e-01 422 454 1.66666666666667e-01 422 421 -3.33333333333333e-01 422 453 -8.33333333333333e-02 422 102 8.33333333333333e-02 422 243 -1.66666666666667e-01 422 415 1.66666666666667e-01 422 246 1.66666666666667e-01 422 414 -8.33333333333333e-02 422 247 -3.33333333333333e-01 422 253 3.33333333333333e-01 422 416 -2.50000000000000e-01 422 73 8.33333333333333e-02 422 244 -1.66666666666667e-01 422 418 -8.33333333333333e-02 422 428 -2.50000000000000e-01 422 254 -1.50000000000000e+00 422 427 -8.33333333333333e-02 422 103 8.33333333333333e-02 422 420 -3.33333333333333e-01 422 426 1.66666666666667e-01 422 252 3.33333333333333e-01 423 423 1.00000000000000e+00 423 265 8.33333333333333e-02 423 434 8.33333333333333e-02 423 431 -8.33333333333333e-02 423 77 8.33333333333333e-02 423 266 -1.66666666666667e-01 423 76 8.33333333333333e-02 423 424 -1.66666666666667e-01 423 430 1.66666666666667e-01 423 75 -2.50000000000000e-01 423 429 -2.50000000000000e-01 423 425 -1.66666666666667e-01 423 80 8.33333333333333e-02 423 269 1.66666666666667e-01 423 79 8.33333333333333e-02 423 433 -1.66666666666667e-01 423 268 -8.33333333333333e-02 423 78 -2.50000000000000e-01 423 267 -2.50000000000000e-01 424 424 1.16666666666667e+00 424 264 8.33333333333333e-02 424 269 1.66666666666667e-01 424 425 -3.33333333333333e-01 424 431 1.66666666666667e-01 424 77 -8.33333333333333e-02 424 266 8.33333333333333e-02 424 76 -8.33333333333333e-02 424 430 -7.50000000000000e-01 424 75 8.33333333333333e-02 424 423 -1.66666666666667e-01 424 429 1.66666666666667e-01 424 80 -8.33333333333333e-02 424 434 8.33333333333333e-02 424 267 -8.33333333333333e-02 424 79 -8.33333333333333e-02 424 268 -2.50000000000000e-01 424 78 8.33333333333333e-02 424 432 -1.66666666666667e-01 425 425 1.16666666666667e+00 425 424 -3.33333333333333e-01 425 430 1.66666666666667e-01 425 432 8.33333333333333e-02 425 429 -8.33333333333333e-02 425 77 -8.33333333333333e-02 425 431 -2.50000000000000e-01 425 76 -8.33333333333333e-02 425 265 8.33333333333333e-02 425 75 8.33333333333333e-02 425 264 -1.66666666666667e-01 425 268 1.66666666666667e-01 425 80 -8.33333333333333e-02 425 269 -7.50000000000000e-01 425 79 -8.33333333333333e-02 425 433 8.33333333333333e-02 425 423 -1.66666666666667e-01 425 78 8.33333333333333e-02 425 267 1.66666666666667e-01 426 426 2.50000000000000e+00 426 431 1.66666666666667e-01 426 104 -8.33333333333333e-02 426 458 8.33333333333333e-02 426 457 -1.66666666666667e-01 426 77 -8.33333333333333e-02 426 430 1.66666666666667e-01 426 429 -7.50000000000000e-01 426 266 1.66666666666667e-01 426 265 1.66666666666667e-01 426 272 3.33333333333333e-01 426 271 -1.66666666666667e-01 426 270 -5.00000000000000e-01 426 248 -1.66666666666667e-01 426 416 8.33333333333333e-02 426 247 -1.66666666666667e-01 426 253 1.66666666666667e-01 426 415 -1.66666666666667e-01 426 76 1.66666666666667e-01 426 75 -2.50000000000000e-01 426 422 1.66666666666667e-01 426 254 -3.33333333333333e-01 426 421 1.66666666666667e-01 426 427 -3.33333333333333e-01 426 103 1.66666666666667e-01 426 420 -7.50000000000000e-01 426 428 -3.33333333333333e-01 426 102 -2.50000000000000e-01 427 427 2.50000000000000e+00 427 431 -8.33333333333333e-02 427 456 -1.66666666666667e-01 427 430 -2.50000000000000e-01 427 429 1.66666666666667e-01 427 266 -3.33333333333333e-01 427 77 1.66666666666667e-01 427 264 1.66666666666667e-01 427 272 3.33333333333333e-01 427 428 -3.33333333333333e-01 427 104 1.66666666666667e-01 427 271 -5.00000000000000e-01 427 270 -1.66666666666667e-01 427 246 -1.66666666666667e-01 427 252 1.66666666666667e-01 427 416 8.33333333333333e-02 427 248 -1.66666666666667e-01 427 76 -7.50000000000000e-01 427 414 -1.66666666666667e-01 427 75 1.66666666666667e-01 427 422 -8.33333333333333e-02 427 254 1.66666666666667e-01 427 421 -2.50000000000000e-01 427 458 8.33333333333333e-02 427 103 -7.50000000000000e-01 427 420 1.66666666666667e-01 427 426 -3.33333333333333e-01 427 102 1.66666666666667e-01 428 428 2.50000000000000e+00 428 430 -8.33333333333333e-02 428 426 -3.33333333333333e-01 428 429 1.66666666666667e-01 428 102 -8.33333333333333e-02 428 456 8.33333333333333e-02 428 431 -2.50000000000000e-01 428 75 -8.33333333333333e-02 428 264 1.66666666666667e-01 428 265 -3.33333333333333e-01 428 76 1.66666666666667e-01 428 272 -1.50000000000000e+00 428 271 3.33333333333333e-01 428 427 -3.33333333333333e-01 428 103 1.66666666666667e-01 428 270 3.33333333333333e-01 428 246 -1.66666666666667e-01 428 414 8.33333333333333e-02 428 77 -2.50000000000000e-01 428 415 8.33333333333333e-02 428 247 -1.66666666666667e-01 428 422 -2.50000000000000e-01 428 457 8.33333333333333e-02 428 104 -2.50000000000000e-01 428 421 -8.33333333333333e-02 428 253 1.66666666666667e-01 428 420 1.66666666666667e-01 428 252 -3.33333333333333e-01 429 429 2.50000000000000e+00 429 272 -3.33333333333333e-01 429 271 1.66666666666667e-01 429 77 8.33333333333333e-02 429 427 1.66666666666667e-01 429 426 -7.50000000000000e-01 429 458 -8.33333333333333e-02 429 107 8.33333333333333e-02 429 457 1.66666666666667e-01 429 456 -2.50000000000000e-01 429 266 -1.66666666666667e-01 429 265 -1.66666666666667e-01 429 269 1.66666666666667e-01 429 425 -8.33333333333333e-02 429 430 -3.33333333333333e-01 429 268 1.66666666666667e-01 429 274 -1.66666666666667e-01 429 76 -1.66666666666667e-01 429 424 1.66666666666667e-01 429 423 -2.50000000000000e-01 429 431 -3.33333333333333e-01 429 434 1.66666666666667e-01 429 275 3.33333333333333e-01 429 433 1.66666666666667e-01 429 106 -1.66666666666667e-01 429 428 1.66666666666667e-01 429 432 -7.50000000000000e-01 429 273 -5.00000000000000e-01 430 430 2.50000000000000e+00 430 272 1.66666666666667e-01 430 270 1.66666666666667e-01 430 427 -2.50000000000000e-01 430 426 1.66666666666667e-01 430 458 1.66666666666667e-01 430 431 -3.33333333333333e-01 430 457 -7.50000000000000e-01 430 456 1.66666666666667e-01 430 264 -1.66666666666667e-01 430 425 1.66666666666667e-01 430 429 -3.33333333333333e-01 430 269 -3.33333333333333e-01 430 275 3.33333333333333e-01 430 267 1.66666666666667e-01 430 273 -1.66666666666667e-01 430 77 8.33333333333333e-02 430 266 -1.66666666666667e-01 430 424 -7.50000000000000e-01 430 75 -1.66666666666667e-01 430 423 1.66666666666667e-01 430 434 -8.33333333333333e-02 430 107 8.33333333333333e-02 430 428 -8.33333333333333e-02 430 433 -2.50000000000000e-01 430 274 -5.00000000000000e-01 430 432 1.66666666666667e-01 430 105 -1.66666666666667e-01 431 431 2.50000000000000e+00 431 271 1.66666666666667e-01 431 426 1.66666666666667e-01 431 270 -3.33333333333333e-01 431 428 -2.50000000000000e-01 431 75 8.33333333333333e-02 431 458 -2.50000000000000e-01 431 457 1.66666666666667e-01 431 430 -3.33333333333333e-01 431 456 -8.33333333333333e-02 431 105 8.33333333333333e-02 431 264 -1.66666666666667e-01 431 424 1.66666666666667e-01 431 267 1.66666666666667e-01 431 423 -8.33333333333333e-02 431 268 -3.33333333333333e-01 431 274 3.33333333333333e-01 431 425 -2.50000000000000e-01 431 76 8.33333333333333e-02 431 265 -1.66666666666667e-01 431 427 -8.33333333333333e-02 431 434 -2.50000000000000e-01 431 275 -1.50000000000000e+00 431 433 -8.33333333333333e-02 431 106 8.33333333333333e-02 431 429 -3.33333333333333e-01 431 432 1.66666666666667e-01 431 273 3.33333333333333e-01 432 432 1.33333333333333e+00 432 280 8.33333333333333e-02 432 284 1.66666666666667e-01 432 283 -8.33333333333333e-02 432 282 -2.50000000000000e-01 432 269 -1.66666666666667e-01 432 425 8.33333333333333e-02 432 268 -1.66666666666667e-01 432 274 1.66666666666667e-01 432 424 -1.66666666666667e-01 432 79 8.33333333333333e-02 432 78 -1.66666666666667e-01 432 431 1.66666666666667e-01 432 275 -3.33333333333333e-01 432 430 1.66666666666667e-01 432 433 -1.66666666666667e-01 432 106 8.33333333333333e-02 432 429 -7.50000000000000e-01 432 281 8.33333333333333e-02 432 105 -1.66666666666667e-01 433 433 1.50000000000000e+00 433 80 8.33333333333333e-02 433 279 8.33333333333333e-02 433 284 1.66666666666667e-01 433 434 -1.66666666666667e-01 433 107 8.33333333333333e-02 433 283 -2.50000000000000e-01 433 282 -8.33333333333333e-02 433 267 -1.66666666666667e-01 433 273 1.66666666666667e-01 433 425 8.33333333333333e-02 433 269 -1.66666666666667e-01 433 79 -5.00000000000000e-01 433 423 -1.66666666666667e-01 433 78 8.33333333333333e-02 433 431 -8.33333333333333e-02 433 275 1.66666666666667e-01 433 430 -2.50000000000000e-01 433 281 -1.66666666666667e-01 433 106 -5.00000000000000e-01 433 429 1.66666666666667e-01 433 432 -1.66666666666667e-01 433 105 8.33333333333333e-02 434 434 1.33333333333333e+00 434 280 -1.66666666666667e-01 434 79 8.33333333333333e-02 434 284 -7.50000000000000e-01 434 283 1.66666666666667e-01 434 433 -1.66666666666667e-01 434 106 8.33333333333333e-02 434 282 1.66666666666667e-01 434 267 -1.66666666666667e-01 434 423 8.33333333333333e-02 434 80 -1.66666666666667e-01 434 424 8.33333333333333e-02 434 268 -1.66666666666667e-01 434 431 -2.50000000000000e-01 434 279 8.33333333333333e-02 434 107 -1.66666666666667e-01 434 430 -8.33333333333333e-02 434 274 1.66666666666667e-01 434 429 1.66666666666667e-01 434 273 -3.33333333333333e-01 435 435 7.50000000000000e+01 435 290 0.00000000000000e+00 435 289 0.00000000000000e+00 435 437 -8.33333333333333e+00 435 293 8.33333333333333e+00 435 86 4.16666666666667e+00 435 292 -4.16666666666667e+00 435 291 -1.25000000000000e+01 435 124 0.00000000000000e+00 435 127 8.33333333333333e+00 435 365 0.00000000000000e+00 435 125 0.00000000000000e+00 435 82 0.00000000000000e+00 435 364 0.00000000000000e+00 435 81 0.00000000000000e+00 435 368 -4.16666666666667e+00 435 128 8.33333333333333e+00 435 436 -8.33333333333333e+00 435 367 8.33333333333333e+00 435 85 4.16666666666667e+00 435 83 0.00000000000000e+00 435 366 -1.25000000000000e+01 435 84 -2.50000000000000e+01 436 436 6.66666666666667e+01 436 288 0.00000000000000e+00 436 293 8.33333333333333e+00 436 292 -1.25000000000000e+01 436 291 -4.16666666666667e+00 436 365 0.00000000000000e+00 436 125 0.00000000000000e+00 436 123 0.00000000000000e+00 436 126 8.33333333333333e+00 436 82 0.00000000000000e+00 436 81 0.00000000000000e+00 436 363 0.00000000000000e+00 436 368 8.33333333333333e+00 436 128 -1.66666666666667e+01 436 290 0.00000000000000e+00 436 367 -3.75000000000000e+01 436 85 -8.33333333333333e+00 436 435 -8.33333333333333e+00 436 366 8.33333333333333e+00 436 84 4.16666666666667e+00 437 437 6.66666666666667e+01 437 81 0.00000000000000e+00 437 288 0.00000000000000e+00 437 293 -3.75000000000000e+01 437 292 8.33333333333333e+00 437 435 -8.33333333333333e+00 437 291 8.33333333333333e+00 437 84 4.16666666666667e+00 437 364 0.00000000000000e+00 437 124 0.00000000000000e+00 437 83 0.00000000000000e+00 437 363 0.00000000000000e+00 437 123 0.00000000000000e+00 437 289 0.00000000000000e+00 437 368 -1.25000000000000e+01 437 86 -8.33333333333333e+00 437 367 8.33333333333333e+00 437 127 -1.66666666666667e+01 437 366 -4.16666666666667e+00 437 126 8.33333333333333e+00 438 438 7.50000000000000e+01 438 299 -8.33333333333333e+00 438 298 4.16666666666667e+00 438 440 -8.33333333333333e+00 438 302 8.33333333333333e+00 438 89 4.16666666666667e+00 438 301 -4.16666666666667e+00 438 300 -1.25000000000000e+01 438 145 -8.33333333333333e+00 438 148 8.33333333333333e+00 438 374 4.16666666666667e+00 438 146 -8.33333333333333e+00 438 85 4.16666666666667e+00 438 373 -8.33333333333333e+00 438 84 -2.50000000000000e+01 438 377 -4.16666666666667e+00 438 149 8.33333333333333e+00 438 439 -8.33333333333333e+00 438 376 8.33333333333333e+00 438 88 4.16666666666667e+00 438 86 4.16666666666667e+00 438 375 -1.25000000000000e+01 438 87 -2.50000000000000e+01 439 439 6.66666666666667e+01 439 297 4.16666666666667e+00 439 302 8.33333333333333e+00 439 301 -1.25000000000000e+01 439 300 -4.16666666666667e+00 439 374 4.16666666666667e+00 439 146 -8.33333333333333e+00 439 144 -8.33333333333333e+00 439 147 8.33333333333333e+00 439 85 -8.33333333333333e+00 439 84 4.16666666666667e+00 439 372 -8.33333333333333e+00 439 377 8.33333333333333e+00 439 149 -1.66666666666667e+01 439 299 4.16666666666667e+00 439 376 -3.75000000000000e+01 439 88 -8.33333333333333e+00 439 438 -8.33333333333333e+00 439 375 8.33333333333333e+00 439 87 4.16666666666667e+00 440 440 6.66666666666667e+01 440 84 4.16666666666667e+00 440 297 -8.33333333333333e+00 440 302 -3.75000000000000e+01 440 301 8.33333333333333e+00 440 438 -8.33333333333333e+00 440 300 8.33333333333333e+00 440 87 4.16666666666667e+00 440 373 4.16666666666667e+00 440 145 -8.33333333333333e+00 440 86 -8.33333333333333e+00 440 372 4.16666666666667e+00 440 144 -8.33333333333333e+00 440 298 4.16666666666667e+00 440 377 -1.25000000000000e+01 440 89 -8.33333333333333e+00 440 376 8.33333333333333e+00 440 148 -1.66666666666667e+01 440 375 -4.16666666666667e+00 440 147 8.33333333333333e+00 441 441 7.50000000000000e+01 441 308 -8.33333333333333e+00 441 307 4.16666666666667e+00 441 443 -8.33333333333333e+00 441 311 8.33333333333333e+00 441 92 4.16666666666667e+00 441 310 -4.16666666666667e+00 441 309 -1.25000000000000e+01 441 166 -8.33333333333333e+00 441 169 8.33333333333333e+00 441 383 4.16666666666667e+00 441 167 -8.33333333333333e+00 441 88 4.16666666666667e+00 441 382 -8.33333333333333e+00 441 87 -2.50000000000000e+01 441 386 -4.16666666666667e+00 441 170 8.33333333333333e+00 441 442 -8.33333333333333e+00 441 385 8.33333333333333e+00 441 91 4.16666666666667e+00 441 89 4.16666666666667e+00 441 384 -1.25000000000000e+01 441 90 -2.50000000000000e+01 442 442 6.66666666666667e+01 442 306 4.16666666666667e+00 442 311 8.33333333333333e+00 442 310 -1.25000000000000e+01 442 309 -4.16666666666667e+00 442 383 4.16666666666667e+00 442 167 -8.33333333333333e+00 442 165 -8.33333333333333e+00 442 168 8.33333333333333e+00 442 88 -8.33333333333333e+00 442 87 4.16666666666667e+00 442 381 -8.33333333333333e+00 442 386 8.33333333333333e+00 442 170 -1.66666666666667e+01 442 308 4.16666666666667e+00 442 385 -3.75000000000000e+01 442 91 -8.33333333333333e+00 442 441 -8.33333333333333e+00 442 384 8.33333333333333e+00 442 90 4.16666666666667e+00 443 443 6.66666666666667e+01 443 87 4.16666666666667e+00 443 306 -8.33333333333333e+00 443 311 -3.75000000000000e+01 443 310 8.33333333333333e+00 443 441 -8.33333333333333e+00 443 309 8.33333333333333e+00 443 90 4.16666666666667e+00 443 382 4.16666666666667e+00 443 166 -8.33333333333333e+00 443 89 -8.33333333333333e+00 443 381 4.16666666666667e+00 443 165 -8.33333333333333e+00 443 307 4.16666666666667e+00 443 386 -1.25000000000000e+01 443 92 -8.33333333333333e+00 443 385 8.33333333333333e+00 443 169 -1.66666666666667e+01 443 384 -4.16666666666667e+00 443 168 8.33333333333333e+00 444 444 7.50000000000000e+01 444 317 -8.33333333333333e+00 444 316 4.16666666666667e+00 444 446 -8.33333333333333e+00 444 320 8.33333333333333e+00 444 95 4.16666666666667e+00 444 319 -4.16666666666667e+00 444 318 -1.25000000000000e+01 444 187 -8.33333333333333e+00 444 190 8.33333333333333e+00 444 392 4.16666666666667e+00 444 188 -8.33333333333333e+00 444 91 4.16666666666667e+00 444 391 -8.33333333333333e+00 444 90 -2.50000000000000e+01 444 395 -4.16666666666667e+00 444 191 8.33333333333333e+00 444 445 -8.33333333333333e+00 444 394 8.33333333333333e+00 444 94 4.16666666666667e+00 444 92 4.16666666666667e+00 444 393 -1.25000000000000e+01 444 93 -2.50000000000000e+01 445 445 6.66666666666667e+01 445 315 4.16666666666667e+00 445 320 8.33333333333333e+00 445 319 -1.25000000000000e+01 445 318 -4.16666666666667e+00 445 392 4.16666666666667e+00 445 188 -8.33333333333333e+00 445 186 -8.33333333333333e+00 445 189 8.33333333333333e+00 445 91 -8.33333333333333e+00 445 90 4.16666666666667e+00 445 390 -8.33333333333333e+00 445 395 8.33333333333333e+00 445 191 -1.66666666666667e+01 445 317 4.16666666666667e+00 445 394 -3.75000000000000e+01 445 94 -8.33333333333333e+00 445 444 -8.33333333333333e+00 445 393 8.33333333333333e+00 445 93 4.16666666666667e+00 446 446 6.66666666666667e+01 446 90 4.16666666666667e+00 446 315 -8.33333333333333e+00 446 320 -3.75000000000000e+01 446 319 8.33333333333333e+00 446 444 -8.33333333333333e+00 446 318 8.33333333333333e+00 446 93 4.16666666666667e+00 446 391 4.16666666666667e+00 446 187 -8.33333333333333e+00 446 92 -8.33333333333333e+00 446 390 4.16666666666667e+00 446 186 -8.33333333333333e+00 446 316 4.16666666666667e+00 446 395 -1.25000000000000e+01 446 95 -8.33333333333333e+00 446 394 8.33333333333333e+00 446 190 -1.66666666666667e+01 446 393 -4.16666666666667e+00 446 189 8.33333333333333e+00 447 447 1.50000000000000e+00 447 326 -1.66666666666667e-01 447 325 8.33333333333333e-02 447 449 -1.66666666666667e-01 447 329 1.66666666666667e-01 447 98 8.33333333333333e-02 447 328 -8.33333333333333e-02 447 327 -2.50000000000000e-01 447 208 -1.66666666666667e-01 447 211 1.66666666666667e-01 447 401 8.33333333333333e-02 447 209 -1.66666666666667e-01 447 94 8.33333333333333e-02 447 400 -1.66666666666667e-01 447 93 -5.00000000000000e-01 447 404 -8.33333333333333e-02 447 212 1.66666666666667e-01 447 448 -1.66666666666667e-01 447 403 1.66666666666667e-01 447 97 8.33333333333333e-02 447 95 8.33333333333333e-02 447 402 -2.50000000000000e-01 447 96 -5.00000000000000e-01 448 448 1.33333333333333e+00 448 324 8.33333333333333e-02 448 329 1.66666666666667e-01 448 328 -2.50000000000000e-01 448 327 -8.33333333333333e-02 448 401 8.33333333333333e-02 448 209 -1.66666666666667e-01 448 207 -1.66666666666667e-01 448 210 1.66666666666667e-01 448 94 -1.66666666666667e-01 448 93 8.33333333333333e-02 448 399 -1.66666666666667e-01 448 404 1.66666666666667e-01 448 212 -3.33333333333333e-01 448 326 8.33333333333333e-02 448 403 -7.50000000000000e-01 448 97 -1.66666666666667e-01 448 447 -1.66666666666667e-01 448 402 1.66666666666667e-01 448 96 8.33333333333333e-02 449 449 1.33333333333333e+00 449 93 8.33333333333333e-02 449 324 -1.66666666666667e-01 449 329 -7.50000000000000e-01 449 328 1.66666666666667e-01 449 447 -1.66666666666667e-01 449 327 1.66666666666667e-01 449 96 8.33333333333333e-02 449 400 8.33333333333333e-02 449 208 -1.66666666666667e-01 449 95 -1.66666666666667e-01 449 399 8.33333333333333e-02 449 207 -1.66666666666667e-01 449 325 8.33333333333333e-02 449 404 -2.50000000000000e-01 449 98 -1.66666666666667e-01 449 403 1.66666666666667e-01 449 211 -3.33333333333333e-01 449 402 -8.33333333333333e-02 449 210 1.66666666666667e-01 450 450 1.50000000000000e+00 450 335 -1.66666666666667e-01 450 334 8.33333333333333e-02 450 452 -1.66666666666667e-01 450 338 1.66666666666667e-01 450 101 8.33333333333333e-02 450 337 -8.33333333333333e-02 450 336 -2.50000000000000e-01 450 229 -1.66666666666667e-01 450 232 1.66666666666667e-01 450 410 8.33333333333333e-02 450 230 -1.66666666666667e-01 450 97 8.33333333333333e-02 450 409 -1.66666666666667e-01 450 96 -5.00000000000000e-01 450 413 -8.33333333333333e-02 450 233 1.66666666666667e-01 450 451 -1.66666666666667e-01 450 412 1.66666666666667e-01 450 100 8.33333333333333e-02 450 98 8.33333333333333e-02 450 411 -2.50000000000000e-01 450 99 -5.00000000000000e-01 451 451 1.33333333333333e+00 451 333 8.33333333333333e-02 451 338 1.66666666666667e-01 451 337 -2.50000000000000e-01 451 336 -8.33333333333333e-02 451 410 8.33333333333333e-02 451 230 -1.66666666666667e-01 451 228 -1.66666666666667e-01 451 231 1.66666666666667e-01 451 97 -1.66666666666667e-01 451 96 8.33333333333333e-02 451 408 -1.66666666666667e-01 451 413 1.66666666666667e-01 451 233 -3.33333333333333e-01 451 335 8.33333333333333e-02 451 412 -7.50000000000000e-01 451 100 -1.66666666666667e-01 451 450 -1.66666666666667e-01 451 411 1.66666666666667e-01 451 99 8.33333333333333e-02 452 452 1.33333333333333e+00 452 96 8.33333333333333e-02 452 333 -1.66666666666667e-01 452 338 -7.50000000000000e-01 452 337 1.66666666666667e-01 452 450 -1.66666666666667e-01 452 336 1.66666666666667e-01 452 99 8.33333333333333e-02 452 409 8.33333333333333e-02 452 229 -1.66666666666667e-01 452 98 -1.66666666666667e-01 452 408 8.33333333333333e-02 452 228 -1.66666666666667e-01 452 334 8.33333333333333e-02 452 413 -2.50000000000000e-01 452 101 -1.66666666666667e-01 452 412 1.66666666666667e-01 452 232 -3.33333333333333e-01 452 411 -8.33333333333333e-02 452 231 1.66666666666667e-01 453 453 1.50000000000000e+00 453 344 -1.66666666666667e-01 453 343 8.33333333333333e-02 453 455 -1.66666666666667e-01 453 347 1.66666666666667e-01 453 104 8.33333333333333e-02 453 346 -8.33333333333333e-02 453 345 -2.50000000000000e-01 453 250 -1.66666666666667e-01 453 253 1.66666666666667e-01 453 419 8.33333333333333e-02 453 251 -1.66666666666667e-01 453 100 8.33333333333333e-02 453 418 -1.66666666666667e-01 453 99 -5.00000000000000e-01 453 422 -8.33333333333333e-02 453 254 1.66666666666667e-01 453 454 -1.66666666666667e-01 453 421 1.66666666666667e-01 453 103 8.33333333333333e-02 453 101 8.33333333333333e-02 453 420 -2.50000000000000e-01 453 102 -5.00000000000000e-01 454 454 1.33333333333333e+00 454 342 8.33333333333333e-02 454 347 1.66666666666667e-01 454 346 -2.50000000000000e-01 454 345 -8.33333333333333e-02 454 419 8.33333333333333e-02 454 251 -1.66666666666667e-01 454 249 -1.66666666666667e-01 454 252 1.66666666666667e-01 454 100 -1.66666666666667e-01 454 99 8.33333333333333e-02 454 417 -1.66666666666667e-01 454 422 1.66666666666667e-01 454 254 -3.33333333333333e-01 454 344 8.33333333333333e-02 454 421 -7.50000000000000e-01 454 103 -1.66666666666667e-01 454 453 -1.66666666666667e-01 454 420 1.66666666666667e-01 454 102 8.33333333333333e-02 455 455 1.33333333333333e+00 455 99 8.33333333333333e-02 455 342 -1.66666666666667e-01 455 347 -7.50000000000000e-01 455 346 1.66666666666667e-01 455 453 -1.66666666666667e-01 455 345 1.66666666666667e-01 455 102 8.33333333333333e-02 455 418 8.33333333333333e-02 455 250 -1.66666666666667e-01 455 101 -1.66666666666667e-01 455 417 8.33333333333333e-02 455 249 -1.66666666666667e-01 455 343 8.33333333333333e-02 455 422 -2.50000000000000e-01 455 104 -1.66666666666667e-01 455 421 1.66666666666667e-01 455 253 -3.33333333333333e-01 455 420 -8.33333333333333e-02 455 252 1.66666666666667e-01 456 456 1.50000000000000e+00 456 353 -1.66666666666667e-01 456 352 8.33333333333333e-02 456 458 -1.66666666666667e-01 456 356 1.66666666666667e-01 456 107 8.33333333333333e-02 456 355 -8.33333333333333e-02 456 354 -2.50000000000000e-01 456 271 -1.66666666666667e-01 456 274 1.66666666666667e-01 456 428 8.33333333333333e-02 456 272 -1.66666666666667e-01 456 103 8.33333333333333e-02 456 427 -1.66666666666667e-01 456 102 -5.00000000000000e-01 456 431 -8.33333333333333e-02 456 275 1.66666666666667e-01 456 457 -1.66666666666667e-01 456 430 1.66666666666667e-01 456 106 8.33333333333333e-02 456 104 8.33333333333333e-02 456 429 -2.50000000000000e-01 456 105 -5.00000000000000e-01 457 457 1.33333333333333e+00 457 351 8.33333333333333e-02 457 356 1.66666666666667e-01 457 355 -2.50000000000000e-01 457 354 -8.33333333333333e-02 457 428 8.33333333333333e-02 457 272 -1.66666666666667e-01 457 270 -1.66666666666667e-01 457 273 1.66666666666667e-01 457 103 -1.66666666666667e-01 457 102 8.33333333333333e-02 457 426 -1.66666666666667e-01 457 431 1.66666666666667e-01 457 275 -3.33333333333333e-01 457 353 8.33333333333333e-02 457 430 -7.50000000000000e-01 457 106 -1.66666666666667e-01 457 456 -1.66666666666667e-01 457 429 1.66666666666667e-01 457 105 8.33333333333333e-02 458 458 1.33333333333333e+00 458 102 8.33333333333333e-02 458 351 -1.66666666666667e-01 458 356 -7.50000000000000e-01 458 355 1.66666666666667e-01 458 456 -1.66666666666667e-01 458 354 1.66666666666667e-01 458 105 8.33333333333333e-02 458 427 8.33333333333333e-02 458 271 -1.66666666666667e-01 458 104 -1.66666666666667e-01 458 426 8.33333333333333e-02 458 270 -1.66666666666667e-01 458 352 8.33333333333333e-02 458 431 -2.50000000000000e-01 458 107 -1.66666666666667e-01 458 430 1.66666666666667e-01 458 274 -3.33333333333333e-01 458 429 -8.33333333333333e-02 458 273 1.66666666666667e-01 hypre-2.33.0/src/test/TEST_ij/data/beam_tet_dof459_np1/b.IJ.00000000066400000000000000000000261641477326011500234200ustar00rootroot000000000000000 458 0 0.00000000000000e+00 1 0.00000000000000e+00 2 0.00000000000000e+00 3 0.00000000000000e+00 4 0.00000000000000e+00 5 0.00000000000000e+00 6 0.00000000000000e+00 7 0.00000000000000e+00 8 0.00000000000000e+00 9 0.00000000000000e+00 10 0.00000000000000e+00 11 0.00000000000000e+00 12 0.00000000000000e+00 13 0.00000000000000e+00 14 0.00000000000000e+00 15 0.00000000000000e+00 16 0.00000000000000e+00 17 0.00000000000000e+00 18 0.00000000000000e+00 19 0.00000000000000e+00 20 0.00000000000000e+00 21 0.00000000000000e+00 22 0.00000000000000e+00 23 0.00000000000000e+00 24 0.00000000000000e+00 25 0.00000000000000e+00 26 -8.33333333333333e-04 27 0.00000000000000e+00 28 0.00000000000000e+00 29 0.00000000000000e+00 30 0.00000000000000e+00 31 0.00000000000000e+00 32 0.00000000000000e+00 33 0.00000000000000e+00 34 0.00000000000000e+00 35 0.00000000000000e+00 36 0.00000000000000e+00 37 0.00000000000000e+00 38 0.00000000000000e+00 39 0.00000000000000e+00 40 0.00000000000000e+00 41 0.00000000000000e+00 42 0.00000000000000e+00 43 0.00000000000000e+00 44 0.00000000000000e+00 45 0.00000000000000e+00 46 0.00000000000000e+00 47 0.00000000000000e+00 48 0.00000000000000e+00 49 0.00000000000000e+00 50 0.00000000000000e+00 51 0.00000000000000e+00 52 0.00000000000000e+00 53 -4.16666666666667e-04 54 0.00000000000000e+00 55 0.00000000000000e+00 56 0.00000000000000e+00 57 0.00000000000000e+00 58 0.00000000000000e+00 59 0.00000000000000e+00 60 0.00000000000000e+00 61 0.00000000000000e+00 62 0.00000000000000e+00 63 0.00000000000000e+00 64 0.00000000000000e+00 65 0.00000000000000e+00 66 0.00000000000000e+00 67 0.00000000000000e+00 68 0.00000000000000e+00 69 0.00000000000000e+00 70 0.00000000000000e+00 71 0.00000000000000e+00 72 0.00000000000000e+00 73 0.00000000000000e+00 74 0.00000000000000e+00 75 0.00000000000000e+00 76 0.00000000000000e+00 77 0.00000000000000e+00 78 0.00000000000000e+00 79 0.00000000000000e+00 80 -4.16666666666667e-04 81 0.00000000000000e+00 82 0.00000000000000e+00 83 0.00000000000000e+00 84 0.00000000000000e+00 85 0.00000000000000e+00 86 0.00000000000000e+00 87 0.00000000000000e+00 88 0.00000000000000e+00 89 0.00000000000000e+00 90 0.00000000000000e+00 91 0.00000000000000e+00 92 0.00000000000000e+00 93 0.00000000000000e+00 94 0.00000000000000e+00 95 0.00000000000000e+00 96 0.00000000000000e+00 97 0.00000000000000e+00 98 0.00000000000000e+00 99 0.00000000000000e+00 100 0.00000000000000e+00 101 0.00000000000000e+00 102 0.00000000000000e+00 103 0.00000000000000e+00 104 0.00000000000000e+00 105 0.00000000000000e+00 106 0.00000000000000e+00 107 -8.33333333333333e-04 108 0.00000000000000e+00 109 0.00000000000000e+00 110 0.00000000000000e+00 111 0.00000000000000e+00 112 0.00000000000000e+00 113 0.00000000000000e+00 114 0.00000000000000e+00 115 0.00000000000000e+00 116 0.00000000000000e+00 117 0.00000000000000e+00 118 0.00000000000000e+00 119 0.00000000000000e+00 120 0.00000000000000e+00 121 0.00000000000000e+00 122 0.00000000000000e+00 123 0.00000000000000e+00 124 0.00000000000000e+00 125 0.00000000000000e+00 126 0.00000000000000e+00 127 0.00000000000000e+00 128 0.00000000000000e+00 129 0.00000000000000e+00 130 0.00000000000000e+00 131 0.00000000000000e+00 132 0.00000000000000e+00 133 0.00000000000000e+00 134 0.00000000000000e+00 135 0.00000000000000e+00 136 0.00000000000000e+00 137 0.00000000000000e+00 138 0.00000000000000e+00 139 0.00000000000000e+00 140 0.00000000000000e+00 141 0.00000000000000e+00 142 0.00000000000000e+00 143 0.00000000000000e+00 144 0.00000000000000e+00 145 0.00000000000000e+00 146 0.00000000000000e+00 147 0.00000000000000e+00 148 0.00000000000000e+00 149 0.00000000000000e+00 150 0.00000000000000e+00 151 0.00000000000000e+00 152 0.00000000000000e+00 153 0.00000000000000e+00 154 0.00000000000000e+00 155 0.00000000000000e+00 156 0.00000000000000e+00 157 0.00000000000000e+00 158 0.00000000000000e+00 159 0.00000000000000e+00 160 0.00000000000000e+00 161 0.00000000000000e+00 162 0.00000000000000e+00 163 0.00000000000000e+00 164 0.00000000000000e+00 165 0.00000000000000e+00 166 0.00000000000000e+00 167 0.00000000000000e+00 168 0.00000000000000e+00 169 0.00000000000000e+00 170 0.00000000000000e+00 171 0.00000000000000e+00 172 0.00000000000000e+00 173 0.00000000000000e+00 174 0.00000000000000e+00 175 0.00000000000000e+00 176 0.00000000000000e+00 177 0.00000000000000e+00 178 0.00000000000000e+00 179 0.00000000000000e+00 180 0.00000000000000e+00 181 0.00000000000000e+00 182 0.00000000000000e+00 183 0.00000000000000e+00 184 0.00000000000000e+00 185 0.00000000000000e+00 186 0.00000000000000e+00 187 0.00000000000000e+00 188 0.00000000000000e+00 189 0.00000000000000e+00 190 0.00000000000000e+00 191 0.00000000000000e+00 192 0.00000000000000e+00 193 0.00000000000000e+00 194 0.00000000000000e+00 195 0.00000000000000e+00 196 0.00000000000000e+00 197 0.00000000000000e+00 198 0.00000000000000e+00 199 0.00000000000000e+00 200 0.00000000000000e+00 201 0.00000000000000e+00 202 0.00000000000000e+00 203 0.00000000000000e+00 204 0.00000000000000e+00 205 0.00000000000000e+00 206 0.00000000000000e+00 207 0.00000000000000e+00 208 0.00000000000000e+00 209 0.00000000000000e+00 210 0.00000000000000e+00 211 0.00000000000000e+00 212 0.00000000000000e+00 213 0.00000000000000e+00 214 0.00000000000000e+00 215 0.00000000000000e+00 216 0.00000000000000e+00 217 0.00000000000000e+00 218 0.00000000000000e+00 219 0.00000000000000e+00 220 0.00000000000000e+00 221 0.00000000000000e+00 222 0.00000000000000e+00 223 0.00000000000000e+00 224 0.00000000000000e+00 225 0.00000000000000e+00 226 0.00000000000000e+00 227 0.00000000000000e+00 228 0.00000000000000e+00 229 0.00000000000000e+00 230 0.00000000000000e+00 231 0.00000000000000e+00 232 0.00000000000000e+00 233 0.00000000000000e+00 234 0.00000000000000e+00 235 0.00000000000000e+00 236 0.00000000000000e+00 237 0.00000000000000e+00 238 0.00000000000000e+00 239 0.00000000000000e+00 240 0.00000000000000e+00 241 0.00000000000000e+00 242 0.00000000000000e+00 243 0.00000000000000e+00 244 0.00000000000000e+00 245 0.00000000000000e+00 246 0.00000000000000e+00 247 0.00000000000000e+00 248 0.00000000000000e+00 249 0.00000000000000e+00 250 0.00000000000000e+00 251 0.00000000000000e+00 252 0.00000000000000e+00 253 0.00000000000000e+00 254 0.00000000000000e+00 255 0.00000000000000e+00 256 0.00000000000000e+00 257 0.00000000000000e+00 258 0.00000000000000e+00 259 0.00000000000000e+00 260 0.00000000000000e+00 261 0.00000000000000e+00 262 0.00000000000000e+00 263 0.00000000000000e+00 264 0.00000000000000e+00 265 0.00000000000000e+00 266 0.00000000000000e+00 267 0.00000000000000e+00 268 0.00000000000000e+00 269 0.00000000000000e+00 270 0.00000000000000e+00 271 0.00000000000000e+00 272 0.00000000000000e+00 273 0.00000000000000e+00 274 0.00000000000000e+00 275 0.00000000000000e+00 276 0.00000000000000e+00 277 0.00000000000000e+00 278 -1.25000000000000e-03 279 0.00000000000000e+00 280 0.00000000000000e+00 281 -1.25000000000000e-03 282 0.00000000000000e+00 283 0.00000000000000e+00 284 -2.50000000000000e-03 285 0.00000000000000e+00 286 0.00000000000000e+00 287 0.00000000000000e+00 288 0.00000000000000e+00 289 0.00000000000000e+00 290 0.00000000000000e+00 291 0.00000000000000e+00 292 0.00000000000000e+00 293 0.00000000000000e+00 294 0.00000000000000e+00 295 0.00000000000000e+00 296 0.00000000000000e+00 297 0.00000000000000e+00 298 0.00000000000000e+00 299 0.00000000000000e+00 300 0.00000000000000e+00 301 0.00000000000000e+00 302 0.00000000000000e+00 303 0.00000000000000e+00 304 0.00000000000000e+00 305 0.00000000000000e+00 306 0.00000000000000e+00 307 0.00000000000000e+00 308 0.00000000000000e+00 309 0.00000000000000e+00 310 0.00000000000000e+00 311 0.00000000000000e+00 312 0.00000000000000e+00 313 0.00000000000000e+00 314 0.00000000000000e+00 315 0.00000000000000e+00 316 0.00000000000000e+00 317 0.00000000000000e+00 318 0.00000000000000e+00 319 0.00000000000000e+00 320 0.00000000000000e+00 321 0.00000000000000e+00 322 0.00000000000000e+00 323 0.00000000000000e+00 324 0.00000000000000e+00 325 0.00000000000000e+00 326 0.00000000000000e+00 327 0.00000000000000e+00 328 0.00000000000000e+00 329 0.00000000000000e+00 330 0.00000000000000e+00 331 0.00000000000000e+00 332 0.00000000000000e+00 333 0.00000000000000e+00 334 0.00000000000000e+00 335 0.00000000000000e+00 336 0.00000000000000e+00 337 0.00000000000000e+00 338 0.00000000000000e+00 339 0.00000000000000e+00 340 0.00000000000000e+00 341 0.00000000000000e+00 342 0.00000000000000e+00 343 0.00000000000000e+00 344 0.00000000000000e+00 345 0.00000000000000e+00 346 0.00000000000000e+00 347 0.00000000000000e+00 348 0.00000000000000e+00 349 0.00000000000000e+00 350 0.00000000000000e+00 351 0.00000000000000e+00 352 0.00000000000000e+00 353 0.00000000000000e+00 354 0.00000000000000e+00 355 0.00000000000000e+00 356 0.00000000000000e+00 357 0.00000000000000e+00 358 0.00000000000000e+00 359 -1.25000000000000e-03 360 0.00000000000000e+00 361 0.00000000000000e+00 362 0.00000000000000e+00 363 0.00000000000000e+00 364 0.00000000000000e+00 365 0.00000000000000e+00 366 0.00000000000000e+00 367 0.00000000000000e+00 368 0.00000000000000e+00 369 0.00000000000000e+00 370 0.00000000000000e+00 371 0.00000000000000e+00 372 0.00000000000000e+00 373 0.00000000000000e+00 374 0.00000000000000e+00 375 0.00000000000000e+00 376 0.00000000000000e+00 377 0.00000000000000e+00 378 0.00000000000000e+00 379 0.00000000000000e+00 380 0.00000000000000e+00 381 0.00000000000000e+00 382 0.00000000000000e+00 383 0.00000000000000e+00 384 0.00000000000000e+00 385 0.00000000000000e+00 386 0.00000000000000e+00 387 0.00000000000000e+00 388 0.00000000000000e+00 389 0.00000000000000e+00 390 0.00000000000000e+00 391 0.00000000000000e+00 392 0.00000000000000e+00 393 0.00000000000000e+00 394 0.00000000000000e+00 395 0.00000000000000e+00 396 0.00000000000000e+00 397 0.00000000000000e+00 398 0.00000000000000e+00 399 0.00000000000000e+00 400 0.00000000000000e+00 401 0.00000000000000e+00 402 0.00000000000000e+00 403 0.00000000000000e+00 404 0.00000000000000e+00 405 0.00000000000000e+00 406 0.00000000000000e+00 407 0.00000000000000e+00 408 0.00000000000000e+00 409 0.00000000000000e+00 410 0.00000000000000e+00 411 0.00000000000000e+00 412 0.00000000000000e+00 413 0.00000000000000e+00 414 0.00000000000000e+00 415 0.00000000000000e+00 416 0.00000000000000e+00 417 0.00000000000000e+00 418 0.00000000000000e+00 419 0.00000000000000e+00 420 0.00000000000000e+00 421 0.00000000000000e+00 422 0.00000000000000e+00 423 0.00000000000000e+00 424 0.00000000000000e+00 425 0.00000000000000e+00 426 0.00000000000000e+00 427 0.00000000000000e+00 428 0.00000000000000e+00 429 0.00000000000000e+00 430 0.00000000000000e+00 431 0.00000000000000e+00 432 0.00000000000000e+00 433 0.00000000000000e+00 434 -1.25000000000000e-03 435 0.00000000000000e+00 436 0.00000000000000e+00 437 0.00000000000000e+00 438 0.00000000000000e+00 439 0.00000000000000e+00 440 0.00000000000000e+00 441 0.00000000000000e+00 442 0.00000000000000e+00 443 0.00000000000000e+00 444 0.00000000000000e+00 445 0.00000000000000e+00 446 0.00000000000000e+00 447 0.00000000000000e+00 448 0.00000000000000e+00 449 0.00000000000000e+00 450 0.00000000000000e+00 451 0.00000000000000e+00 452 0.00000000000000e+00 453 0.00000000000000e+00 454 0.00000000000000e+00 455 0.00000000000000e+00 456 0.00000000000000e+00 457 0.00000000000000e+00 458 0.00000000000000e+00 hypre-2.33.0/src/test/TEST_ij/data/beam_tet_dof459_np1/mfem.txt000066400000000000000000000007661477326011500240020ustar00rootroot00000000000000$ mpirun -np 1 ./ex2p -m ../beam-tet.mesh -sr 1 -sp 0 -no-vis Produced with mfem-4.4 (https://github.com/mfem/mfem/archive/refs/tags/v4.4.tar.gz) Options used: --mesh ../beam-tet.mesh --order 1 --serial_ref 1 --parallel_ref 0 --amg-for-systems --no-static-condensation --no-visualization --by-vdim --device cpu Device configuration: cpu Memory configuration: host-std Number of finite element unknowns: 459 Assembling: r.h.s. ... matrix ... done. Size of linear system: 459hypre-2.33.0/src/test/TEST_ij/data/beam_tet_dof459_np1/rbms.0.00000000066400000000000000000000264041477326011500237740ustar00rootroot000000000000000 459 0 0.00000000000000e+00 1 -0.00000000000000e+00 2 0.00000000000000e+00 3 0.00000000000000e+00 4 -1.00000000000000e+00 5 0.00000000000000e+00 6 0.00000000000000e+00 7 -2.00000000000000e+00 8 0.00000000000000e+00 9 0.00000000000000e+00 10 -3.00000000000000e+00 11 0.00000000000000e+00 12 0.00000000000000e+00 13 -4.00000000000000e+00 14 0.00000000000000e+00 15 0.00000000000000e+00 16 -5.00000000000000e+00 17 0.00000000000000e+00 18 0.00000000000000e+00 19 -6.00000000000000e+00 20 0.00000000000000e+00 21 0.00000000000000e+00 22 -7.00000000000000e+00 23 0.00000000000000e+00 24 0.00000000000000e+00 25 -8.00000000000000e+00 26 0.00000000000000e+00 27 1.00000000000000e+00 28 -0.00000000000000e+00 29 0.00000000000000e+00 30 1.00000000000000e+00 31 -1.00000000000000e+00 32 0.00000000000000e+00 33 1.00000000000000e+00 34 -2.00000000000000e+00 35 0.00000000000000e+00 36 1.00000000000000e+00 37 -3.00000000000000e+00 38 0.00000000000000e+00 39 1.00000000000000e+00 40 -4.00000000000000e+00 41 0.00000000000000e+00 42 1.00000000000000e+00 43 -5.00000000000000e+00 44 0.00000000000000e+00 45 1.00000000000000e+00 46 -6.00000000000000e+00 47 0.00000000000000e+00 48 1.00000000000000e+00 49 -7.00000000000000e+00 50 0.00000000000000e+00 51 1.00000000000000e+00 52 -8.00000000000000e+00 53 0.00000000000000e+00 54 0.00000000000000e+00 55 -0.00000000000000e+00 56 0.00000000000000e+00 57 0.00000000000000e+00 58 -1.00000000000000e+00 59 0.00000000000000e+00 60 0.00000000000000e+00 61 -2.00000000000000e+00 62 0.00000000000000e+00 63 0.00000000000000e+00 64 -3.00000000000000e+00 65 0.00000000000000e+00 66 0.00000000000000e+00 67 -4.00000000000000e+00 68 0.00000000000000e+00 69 0.00000000000000e+00 70 -5.00000000000000e+00 71 0.00000000000000e+00 72 0.00000000000000e+00 73 -6.00000000000000e+00 74 0.00000000000000e+00 75 0.00000000000000e+00 76 -7.00000000000000e+00 77 0.00000000000000e+00 78 0.00000000000000e+00 79 -8.00000000000000e+00 80 0.00000000000000e+00 81 1.00000000000000e+00 82 -0.00000000000000e+00 83 0.00000000000000e+00 84 1.00000000000000e+00 85 -1.00000000000000e+00 86 0.00000000000000e+00 87 1.00000000000000e+00 88 -2.00000000000000e+00 89 0.00000000000000e+00 90 1.00000000000000e+00 91 -3.00000000000000e+00 92 0.00000000000000e+00 93 1.00000000000000e+00 94 -4.00000000000000e+00 95 0.00000000000000e+00 96 1.00000000000000e+00 97 -5.00000000000000e+00 98 0.00000000000000e+00 99 1.00000000000000e+00 100 -6.00000000000000e+00 101 0.00000000000000e+00 102 1.00000000000000e+00 103 -7.00000000000000e+00 104 0.00000000000000e+00 105 1.00000000000000e+00 106 -8.00000000000000e+00 107 0.00000000000000e+00 108 0.00000000000000e+00 109 -5.00000000000000e-01 110 0.00000000000000e+00 111 5.00000000000000e-01 112 -0.00000000000000e+00 113 0.00000000000000e+00 114 5.00000000000000e-01 115 -5.00000000000000e-01 116 0.00000000000000e+00 117 0.00000000000000e+00 118 -0.00000000000000e+00 119 0.00000000000000e+00 120 0.00000000000000e+00 121 -5.00000000000000e-01 122 0.00000000000000e+00 123 5.00000000000000e-01 124 -0.00000000000000e+00 125 0.00000000000000e+00 126 5.00000000000000e-01 127 -5.00000000000000e-01 128 0.00000000000000e+00 129 0.00000000000000e+00 130 -1.50000000000000e+00 131 0.00000000000000e+00 132 5.00000000000000e-01 133 -1.00000000000000e+00 134 0.00000000000000e+00 135 5.00000000000000e-01 136 -1.50000000000000e+00 137 0.00000000000000e+00 138 0.00000000000000e+00 139 -1.00000000000000e+00 140 0.00000000000000e+00 141 0.00000000000000e+00 142 -1.50000000000000e+00 143 0.00000000000000e+00 144 5.00000000000000e-01 145 -1.00000000000000e+00 146 0.00000000000000e+00 147 5.00000000000000e-01 148 -1.50000000000000e+00 149 0.00000000000000e+00 150 0.00000000000000e+00 151 -2.50000000000000e+00 152 0.00000000000000e+00 153 5.00000000000000e-01 154 -2.00000000000000e+00 155 0.00000000000000e+00 156 5.00000000000000e-01 157 -2.50000000000000e+00 158 0.00000000000000e+00 159 0.00000000000000e+00 160 -2.00000000000000e+00 161 0.00000000000000e+00 162 0.00000000000000e+00 163 -2.50000000000000e+00 164 0.00000000000000e+00 165 5.00000000000000e-01 166 -2.00000000000000e+00 167 0.00000000000000e+00 168 5.00000000000000e-01 169 -2.50000000000000e+00 170 0.00000000000000e+00 171 0.00000000000000e+00 172 -3.50000000000000e+00 173 0.00000000000000e+00 174 5.00000000000000e-01 175 -3.00000000000000e+00 176 0.00000000000000e+00 177 5.00000000000000e-01 178 -3.50000000000000e+00 179 0.00000000000000e+00 180 0.00000000000000e+00 181 -3.00000000000000e+00 182 0.00000000000000e+00 183 0.00000000000000e+00 184 -3.50000000000000e+00 185 0.00000000000000e+00 186 5.00000000000000e-01 187 -3.00000000000000e+00 188 0.00000000000000e+00 189 5.00000000000000e-01 190 -3.50000000000000e+00 191 0.00000000000000e+00 192 0.00000000000000e+00 193 -4.50000000000000e+00 194 0.00000000000000e+00 195 5.00000000000000e-01 196 -4.00000000000000e+00 197 0.00000000000000e+00 198 5.00000000000000e-01 199 -4.50000000000000e+00 200 0.00000000000000e+00 201 0.00000000000000e+00 202 -4.00000000000000e+00 203 0.00000000000000e+00 204 0.00000000000000e+00 205 -4.50000000000000e+00 206 0.00000000000000e+00 207 5.00000000000000e-01 208 -4.00000000000000e+00 209 0.00000000000000e+00 210 5.00000000000000e-01 211 -4.50000000000000e+00 212 0.00000000000000e+00 213 0.00000000000000e+00 214 -5.50000000000000e+00 215 0.00000000000000e+00 216 5.00000000000000e-01 217 -5.00000000000000e+00 218 0.00000000000000e+00 219 5.00000000000000e-01 220 -5.50000000000000e+00 221 0.00000000000000e+00 222 0.00000000000000e+00 223 -5.00000000000000e+00 224 0.00000000000000e+00 225 0.00000000000000e+00 226 -5.50000000000000e+00 227 0.00000000000000e+00 228 5.00000000000000e-01 229 -5.00000000000000e+00 230 0.00000000000000e+00 231 5.00000000000000e-01 232 -5.50000000000000e+00 233 0.00000000000000e+00 234 0.00000000000000e+00 235 -6.50000000000000e+00 236 0.00000000000000e+00 237 5.00000000000000e-01 238 -6.00000000000000e+00 239 0.00000000000000e+00 240 5.00000000000000e-01 241 -6.50000000000000e+00 242 0.00000000000000e+00 243 0.00000000000000e+00 244 -6.00000000000000e+00 245 0.00000000000000e+00 246 0.00000000000000e+00 247 -6.50000000000000e+00 248 0.00000000000000e+00 249 5.00000000000000e-01 250 -6.00000000000000e+00 251 0.00000000000000e+00 252 5.00000000000000e-01 253 -6.50000000000000e+00 254 0.00000000000000e+00 255 0.00000000000000e+00 256 -7.50000000000000e+00 257 0.00000000000000e+00 258 5.00000000000000e-01 259 -7.00000000000000e+00 260 0.00000000000000e+00 261 5.00000000000000e-01 262 -7.50000000000000e+00 263 0.00000000000000e+00 264 0.00000000000000e+00 265 -7.00000000000000e+00 266 0.00000000000000e+00 267 0.00000000000000e+00 268 -7.50000000000000e+00 269 0.00000000000000e+00 270 5.00000000000000e-01 271 -7.00000000000000e+00 272 0.00000000000000e+00 273 5.00000000000000e-01 274 -7.50000000000000e+00 275 0.00000000000000e+00 276 5.00000000000000e-01 277 -8.00000000000000e+00 278 0.00000000000000e+00 279 0.00000000000000e+00 280 -8.00000000000000e+00 281 0.00000000000000e+00 282 5.00000000000000e-01 283 -8.00000000000000e+00 284 0.00000000000000e+00 285 1.00000000000000e+00 286 -5.00000000000000e-01 287 0.00000000000000e+00 288 1.00000000000000e+00 289 -0.00000000000000e+00 290 0.00000000000000e+00 291 1.00000000000000e+00 292 -5.00000000000000e-01 293 0.00000000000000e+00 294 1.00000000000000e+00 295 -1.50000000000000e+00 296 0.00000000000000e+00 297 1.00000000000000e+00 298 -1.00000000000000e+00 299 0.00000000000000e+00 300 1.00000000000000e+00 301 -1.50000000000000e+00 302 0.00000000000000e+00 303 1.00000000000000e+00 304 -2.50000000000000e+00 305 0.00000000000000e+00 306 1.00000000000000e+00 307 -2.00000000000000e+00 308 0.00000000000000e+00 309 1.00000000000000e+00 310 -2.50000000000000e+00 311 0.00000000000000e+00 312 1.00000000000000e+00 313 -3.50000000000000e+00 314 0.00000000000000e+00 315 1.00000000000000e+00 316 -3.00000000000000e+00 317 0.00000000000000e+00 318 1.00000000000000e+00 319 -3.50000000000000e+00 320 0.00000000000000e+00 321 1.00000000000000e+00 322 -4.50000000000000e+00 323 0.00000000000000e+00 324 1.00000000000000e+00 325 -4.00000000000000e+00 326 0.00000000000000e+00 327 1.00000000000000e+00 328 -4.50000000000000e+00 329 0.00000000000000e+00 330 1.00000000000000e+00 331 -5.50000000000000e+00 332 0.00000000000000e+00 333 1.00000000000000e+00 334 -5.00000000000000e+00 335 0.00000000000000e+00 336 1.00000000000000e+00 337 -5.50000000000000e+00 338 0.00000000000000e+00 339 1.00000000000000e+00 340 -6.50000000000000e+00 341 0.00000000000000e+00 342 1.00000000000000e+00 343 -6.00000000000000e+00 344 0.00000000000000e+00 345 1.00000000000000e+00 346 -6.50000000000000e+00 347 0.00000000000000e+00 348 1.00000000000000e+00 349 -7.50000000000000e+00 350 0.00000000000000e+00 351 1.00000000000000e+00 352 -7.00000000000000e+00 353 0.00000000000000e+00 354 1.00000000000000e+00 355 -7.50000000000000e+00 356 0.00000000000000e+00 357 1.00000000000000e+00 358 -8.00000000000000e+00 359 0.00000000000000e+00 360 0.00000000000000e+00 361 -5.00000000000000e-01 362 0.00000000000000e+00 363 5.00000000000000e-01 364 -0.00000000000000e+00 365 0.00000000000000e+00 366 5.00000000000000e-01 367 -5.00000000000000e-01 368 0.00000000000000e+00 369 0.00000000000000e+00 370 -1.50000000000000e+00 371 0.00000000000000e+00 372 5.00000000000000e-01 373 -1.00000000000000e+00 374 0.00000000000000e+00 375 5.00000000000000e-01 376 -1.50000000000000e+00 377 0.00000000000000e+00 378 0.00000000000000e+00 379 -2.50000000000000e+00 380 0.00000000000000e+00 381 5.00000000000000e-01 382 -2.00000000000000e+00 383 0.00000000000000e+00 384 5.00000000000000e-01 385 -2.50000000000000e+00 386 0.00000000000000e+00 387 0.00000000000000e+00 388 -3.50000000000000e+00 389 0.00000000000000e+00 390 5.00000000000000e-01 391 -3.00000000000000e+00 392 0.00000000000000e+00 393 5.00000000000000e-01 394 -3.50000000000000e+00 395 0.00000000000000e+00 396 0.00000000000000e+00 397 -4.50000000000000e+00 398 0.00000000000000e+00 399 5.00000000000000e-01 400 -4.00000000000000e+00 401 0.00000000000000e+00 402 5.00000000000000e-01 403 -4.50000000000000e+00 404 0.00000000000000e+00 405 0.00000000000000e+00 406 -5.50000000000000e+00 407 0.00000000000000e+00 408 5.00000000000000e-01 409 -5.00000000000000e+00 410 0.00000000000000e+00 411 5.00000000000000e-01 412 -5.50000000000000e+00 413 0.00000000000000e+00 414 0.00000000000000e+00 415 -6.50000000000000e+00 416 0.00000000000000e+00 417 5.00000000000000e-01 418 -6.00000000000000e+00 419 0.00000000000000e+00 420 5.00000000000000e-01 421 -6.50000000000000e+00 422 0.00000000000000e+00 423 0.00000000000000e+00 424 -7.50000000000000e+00 425 0.00000000000000e+00 426 5.00000000000000e-01 427 -7.00000000000000e+00 428 0.00000000000000e+00 429 5.00000000000000e-01 430 -7.50000000000000e+00 431 0.00000000000000e+00 432 5.00000000000000e-01 433 -8.00000000000000e+00 434 0.00000000000000e+00 435 1.00000000000000e+00 436 -5.00000000000000e-01 437 0.00000000000000e+00 438 1.00000000000000e+00 439 -1.50000000000000e+00 440 0.00000000000000e+00 441 1.00000000000000e+00 442 -2.50000000000000e+00 443 0.00000000000000e+00 444 1.00000000000000e+00 445 -3.50000000000000e+00 446 0.00000000000000e+00 447 1.00000000000000e+00 448 -4.50000000000000e+00 449 0.00000000000000e+00 450 1.00000000000000e+00 451 -5.50000000000000e+00 452 0.00000000000000e+00 453 1.00000000000000e+00 454 -6.50000000000000e+00 455 0.00000000000000e+00 456 1.00000000000000e+00 457 -7.50000000000000e+00 458 0.00000000000000e+00 hypre-2.33.0/src/test/TEST_ij/data/beam_tet_dof459_np1/rbms.1.00000000066400000000000000000000264041477326011500237750ustar00rootroot000000000000000 459 0 0.00000000000000e+00 1 0.00000000000000e+00 2 -0.00000000000000e+00 3 0.00000000000000e+00 4 0.00000000000000e+00 5 -0.00000000000000e+00 6 0.00000000000000e+00 7 0.00000000000000e+00 8 -0.00000000000000e+00 9 0.00000000000000e+00 10 0.00000000000000e+00 11 -0.00000000000000e+00 12 0.00000000000000e+00 13 0.00000000000000e+00 14 -0.00000000000000e+00 15 0.00000000000000e+00 16 0.00000000000000e+00 17 -0.00000000000000e+00 18 0.00000000000000e+00 19 0.00000000000000e+00 20 -0.00000000000000e+00 21 0.00000000000000e+00 22 0.00000000000000e+00 23 -0.00000000000000e+00 24 0.00000000000000e+00 25 0.00000000000000e+00 26 -0.00000000000000e+00 27 0.00000000000000e+00 28 0.00000000000000e+00 29 -1.00000000000000e+00 30 0.00000000000000e+00 31 0.00000000000000e+00 32 -1.00000000000000e+00 33 0.00000000000000e+00 34 0.00000000000000e+00 35 -1.00000000000000e+00 36 0.00000000000000e+00 37 0.00000000000000e+00 38 -1.00000000000000e+00 39 0.00000000000000e+00 40 0.00000000000000e+00 41 -1.00000000000000e+00 42 0.00000000000000e+00 43 0.00000000000000e+00 44 -1.00000000000000e+00 45 0.00000000000000e+00 46 0.00000000000000e+00 47 -1.00000000000000e+00 48 0.00000000000000e+00 49 0.00000000000000e+00 50 -1.00000000000000e+00 51 0.00000000000000e+00 52 0.00000000000000e+00 53 -1.00000000000000e+00 54 0.00000000000000e+00 55 1.00000000000000e+00 56 -0.00000000000000e+00 57 0.00000000000000e+00 58 1.00000000000000e+00 59 -0.00000000000000e+00 60 0.00000000000000e+00 61 1.00000000000000e+00 62 -0.00000000000000e+00 63 0.00000000000000e+00 64 1.00000000000000e+00 65 -0.00000000000000e+00 66 0.00000000000000e+00 67 1.00000000000000e+00 68 -0.00000000000000e+00 69 0.00000000000000e+00 70 1.00000000000000e+00 71 -0.00000000000000e+00 72 0.00000000000000e+00 73 1.00000000000000e+00 74 -0.00000000000000e+00 75 0.00000000000000e+00 76 1.00000000000000e+00 77 -0.00000000000000e+00 78 0.00000000000000e+00 79 1.00000000000000e+00 80 -0.00000000000000e+00 81 0.00000000000000e+00 82 1.00000000000000e+00 83 -1.00000000000000e+00 84 0.00000000000000e+00 85 1.00000000000000e+00 86 -1.00000000000000e+00 87 0.00000000000000e+00 88 1.00000000000000e+00 89 -1.00000000000000e+00 90 0.00000000000000e+00 91 1.00000000000000e+00 92 -1.00000000000000e+00 93 0.00000000000000e+00 94 1.00000000000000e+00 95 -1.00000000000000e+00 96 0.00000000000000e+00 97 1.00000000000000e+00 98 -1.00000000000000e+00 99 0.00000000000000e+00 100 1.00000000000000e+00 101 -1.00000000000000e+00 102 0.00000000000000e+00 103 1.00000000000000e+00 104 -1.00000000000000e+00 105 0.00000000000000e+00 106 1.00000000000000e+00 107 -1.00000000000000e+00 108 0.00000000000000e+00 109 0.00000000000000e+00 110 -0.00000000000000e+00 111 0.00000000000000e+00 112 0.00000000000000e+00 113 -5.00000000000000e-01 114 0.00000000000000e+00 115 0.00000000000000e+00 116 -5.00000000000000e-01 117 0.00000000000000e+00 118 5.00000000000000e-01 119 -0.00000000000000e+00 120 0.00000000000000e+00 121 5.00000000000000e-01 122 -0.00000000000000e+00 123 0.00000000000000e+00 124 5.00000000000000e-01 125 -5.00000000000000e-01 126 0.00000000000000e+00 127 5.00000000000000e-01 128 -5.00000000000000e-01 129 0.00000000000000e+00 130 0.00000000000000e+00 131 -0.00000000000000e+00 132 0.00000000000000e+00 133 0.00000000000000e+00 134 -5.00000000000000e-01 135 0.00000000000000e+00 136 0.00000000000000e+00 137 -5.00000000000000e-01 138 0.00000000000000e+00 139 5.00000000000000e-01 140 -0.00000000000000e+00 141 0.00000000000000e+00 142 5.00000000000000e-01 143 -0.00000000000000e+00 144 0.00000000000000e+00 145 5.00000000000000e-01 146 -5.00000000000000e-01 147 0.00000000000000e+00 148 5.00000000000000e-01 149 -5.00000000000000e-01 150 0.00000000000000e+00 151 0.00000000000000e+00 152 -0.00000000000000e+00 153 0.00000000000000e+00 154 0.00000000000000e+00 155 -5.00000000000000e-01 156 0.00000000000000e+00 157 0.00000000000000e+00 158 -5.00000000000000e-01 159 0.00000000000000e+00 160 5.00000000000000e-01 161 -0.00000000000000e+00 162 0.00000000000000e+00 163 5.00000000000000e-01 164 -0.00000000000000e+00 165 0.00000000000000e+00 166 5.00000000000000e-01 167 -5.00000000000000e-01 168 0.00000000000000e+00 169 5.00000000000000e-01 170 -5.00000000000000e-01 171 0.00000000000000e+00 172 0.00000000000000e+00 173 -0.00000000000000e+00 174 0.00000000000000e+00 175 0.00000000000000e+00 176 -5.00000000000000e-01 177 0.00000000000000e+00 178 0.00000000000000e+00 179 -5.00000000000000e-01 180 0.00000000000000e+00 181 5.00000000000000e-01 182 -0.00000000000000e+00 183 0.00000000000000e+00 184 5.00000000000000e-01 185 -0.00000000000000e+00 186 0.00000000000000e+00 187 5.00000000000000e-01 188 -5.00000000000000e-01 189 0.00000000000000e+00 190 5.00000000000000e-01 191 -5.00000000000000e-01 192 0.00000000000000e+00 193 0.00000000000000e+00 194 -0.00000000000000e+00 195 0.00000000000000e+00 196 0.00000000000000e+00 197 -5.00000000000000e-01 198 0.00000000000000e+00 199 0.00000000000000e+00 200 -5.00000000000000e-01 201 0.00000000000000e+00 202 5.00000000000000e-01 203 -0.00000000000000e+00 204 0.00000000000000e+00 205 5.00000000000000e-01 206 -0.00000000000000e+00 207 0.00000000000000e+00 208 5.00000000000000e-01 209 -5.00000000000000e-01 210 0.00000000000000e+00 211 5.00000000000000e-01 212 -5.00000000000000e-01 213 0.00000000000000e+00 214 0.00000000000000e+00 215 -0.00000000000000e+00 216 0.00000000000000e+00 217 0.00000000000000e+00 218 -5.00000000000000e-01 219 0.00000000000000e+00 220 0.00000000000000e+00 221 -5.00000000000000e-01 222 0.00000000000000e+00 223 5.00000000000000e-01 224 -0.00000000000000e+00 225 0.00000000000000e+00 226 5.00000000000000e-01 227 -0.00000000000000e+00 228 0.00000000000000e+00 229 5.00000000000000e-01 230 -5.00000000000000e-01 231 0.00000000000000e+00 232 5.00000000000000e-01 233 -5.00000000000000e-01 234 0.00000000000000e+00 235 0.00000000000000e+00 236 -0.00000000000000e+00 237 0.00000000000000e+00 238 0.00000000000000e+00 239 -5.00000000000000e-01 240 0.00000000000000e+00 241 0.00000000000000e+00 242 -5.00000000000000e-01 243 0.00000000000000e+00 244 5.00000000000000e-01 245 -0.00000000000000e+00 246 0.00000000000000e+00 247 5.00000000000000e-01 248 -0.00000000000000e+00 249 0.00000000000000e+00 250 5.00000000000000e-01 251 -5.00000000000000e-01 252 0.00000000000000e+00 253 5.00000000000000e-01 254 -5.00000000000000e-01 255 0.00000000000000e+00 256 0.00000000000000e+00 257 -0.00000000000000e+00 258 0.00000000000000e+00 259 0.00000000000000e+00 260 -5.00000000000000e-01 261 0.00000000000000e+00 262 0.00000000000000e+00 263 -5.00000000000000e-01 264 0.00000000000000e+00 265 5.00000000000000e-01 266 -0.00000000000000e+00 267 0.00000000000000e+00 268 5.00000000000000e-01 269 -0.00000000000000e+00 270 0.00000000000000e+00 271 5.00000000000000e-01 272 -5.00000000000000e-01 273 0.00000000000000e+00 274 5.00000000000000e-01 275 -5.00000000000000e-01 276 0.00000000000000e+00 277 0.00000000000000e+00 278 -5.00000000000000e-01 279 0.00000000000000e+00 280 5.00000000000000e-01 281 -0.00000000000000e+00 282 0.00000000000000e+00 283 5.00000000000000e-01 284 -5.00000000000000e-01 285 0.00000000000000e+00 286 0.00000000000000e+00 287 -1.00000000000000e+00 288 0.00000000000000e+00 289 5.00000000000000e-01 290 -1.00000000000000e+00 291 0.00000000000000e+00 292 5.00000000000000e-01 293 -1.00000000000000e+00 294 0.00000000000000e+00 295 0.00000000000000e+00 296 -1.00000000000000e+00 297 0.00000000000000e+00 298 5.00000000000000e-01 299 -1.00000000000000e+00 300 0.00000000000000e+00 301 5.00000000000000e-01 302 -1.00000000000000e+00 303 0.00000000000000e+00 304 0.00000000000000e+00 305 -1.00000000000000e+00 306 0.00000000000000e+00 307 5.00000000000000e-01 308 -1.00000000000000e+00 309 0.00000000000000e+00 310 5.00000000000000e-01 311 -1.00000000000000e+00 312 0.00000000000000e+00 313 0.00000000000000e+00 314 -1.00000000000000e+00 315 0.00000000000000e+00 316 5.00000000000000e-01 317 -1.00000000000000e+00 318 0.00000000000000e+00 319 5.00000000000000e-01 320 -1.00000000000000e+00 321 0.00000000000000e+00 322 0.00000000000000e+00 323 -1.00000000000000e+00 324 0.00000000000000e+00 325 5.00000000000000e-01 326 -1.00000000000000e+00 327 0.00000000000000e+00 328 5.00000000000000e-01 329 -1.00000000000000e+00 330 0.00000000000000e+00 331 0.00000000000000e+00 332 -1.00000000000000e+00 333 0.00000000000000e+00 334 5.00000000000000e-01 335 -1.00000000000000e+00 336 0.00000000000000e+00 337 5.00000000000000e-01 338 -1.00000000000000e+00 339 0.00000000000000e+00 340 0.00000000000000e+00 341 -1.00000000000000e+00 342 0.00000000000000e+00 343 5.00000000000000e-01 344 -1.00000000000000e+00 345 0.00000000000000e+00 346 5.00000000000000e-01 347 -1.00000000000000e+00 348 0.00000000000000e+00 349 0.00000000000000e+00 350 -1.00000000000000e+00 351 0.00000000000000e+00 352 5.00000000000000e-01 353 -1.00000000000000e+00 354 0.00000000000000e+00 355 5.00000000000000e-01 356 -1.00000000000000e+00 357 0.00000000000000e+00 358 5.00000000000000e-01 359 -1.00000000000000e+00 360 0.00000000000000e+00 361 1.00000000000000e+00 362 -0.00000000000000e+00 363 0.00000000000000e+00 364 1.00000000000000e+00 365 -5.00000000000000e-01 366 0.00000000000000e+00 367 1.00000000000000e+00 368 -5.00000000000000e-01 369 0.00000000000000e+00 370 1.00000000000000e+00 371 -0.00000000000000e+00 372 0.00000000000000e+00 373 1.00000000000000e+00 374 -5.00000000000000e-01 375 0.00000000000000e+00 376 1.00000000000000e+00 377 -5.00000000000000e-01 378 0.00000000000000e+00 379 1.00000000000000e+00 380 -0.00000000000000e+00 381 0.00000000000000e+00 382 1.00000000000000e+00 383 -5.00000000000000e-01 384 0.00000000000000e+00 385 1.00000000000000e+00 386 -5.00000000000000e-01 387 0.00000000000000e+00 388 1.00000000000000e+00 389 -0.00000000000000e+00 390 0.00000000000000e+00 391 1.00000000000000e+00 392 -5.00000000000000e-01 393 0.00000000000000e+00 394 1.00000000000000e+00 395 -5.00000000000000e-01 396 0.00000000000000e+00 397 1.00000000000000e+00 398 -0.00000000000000e+00 399 0.00000000000000e+00 400 1.00000000000000e+00 401 -5.00000000000000e-01 402 0.00000000000000e+00 403 1.00000000000000e+00 404 -5.00000000000000e-01 405 0.00000000000000e+00 406 1.00000000000000e+00 407 -0.00000000000000e+00 408 0.00000000000000e+00 409 1.00000000000000e+00 410 -5.00000000000000e-01 411 0.00000000000000e+00 412 1.00000000000000e+00 413 -5.00000000000000e-01 414 0.00000000000000e+00 415 1.00000000000000e+00 416 -0.00000000000000e+00 417 0.00000000000000e+00 418 1.00000000000000e+00 419 -5.00000000000000e-01 420 0.00000000000000e+00 421 1.00000000000000e+00 422 -5.00000000000000e-01 423 0.00000000000000e+00 424 1.00000000000000e+00 425 -0.00000000000000e+00 426 0.00000000000000e+00 427 1.00000000000000e+00 428 -5.00000000000000e-01 429 0.00000000000000e+00 430 1.00000000000000e+00 431 -5.00000000000000e-01 432 0.00000000000000e+00 433 1.00000000000000e+00 434 -5.00000000000000e-01 435 0.00000000000000e+00 436 1.00000000000000e+00 437 -1.00000000000000e+00 438 0.00000000000000e+00 439 1.00000000000000e+00 440 -1.00000000000000e+00 441 0.00000000000000e+00 442 1.00000000000000e+00 443 -1.00000000000000e+00 444 0.00000000000000e+00 445 1.00000000000000e+00 446 -1.00000000000000e+00 447 0.00000000000000e+00 448 1.00000000000000e+00 449 -1.00000000000000e+00 450 0.00000000000000e+00 451 1.00000000000000e+00 452 -1.00000000000000e+00 453 0.00000000000000e+00 454 1.00000000000000e+00 455 -1.00000000000000e+00 456 0.00000000000000e+00 457 1.00000000000000e+00 458 -1.00000000000000e+00 hypre-2.33.0/src/test/TEST_ij/data/beam_tet_dof459_np1/rbms.2.00000000066400000000000000000000264041477326011500237760ustar00rootroot000000000000000 459 0 -0.00000000000000e+00 1 0.00000000000000e+00 2 0.00000000000000e+00 3 -0.00000000000000e+00 4 0.00000000000000e+00 5 1.00000000000000e+00 6 -0.00000000000000e+00 7 0.00000000000000e+00 8 2.00000000000000e+00 9 -0.00000000000000e+00 10 0.00000000000000e+00 11 3.00000000000000e+00 12 -0.00000000000000e+00 13 0.00000000000000e+00 14 4.00000000000000e+00 15 -0.00000000000000e+00 16 0.00000000000000e+00 17 5.00000000000000e+00 18 -0.00000000000000e+00 19 0.00000000000000e+00 20 6.00000000000000e+00 21 -0.00000000000000e+00 22 0.00000000000000e+00 23 7.00000000000000e+00 24 -0.00000000000000e+00 25 0.00000000000000e+00 26 8.00000000000000e+00 27 -0.00000000000000e+00 28 0.00000000000000e+00 29 0.00000000000000e+00 30 -0.00000000000000e+00 31 0.00000000000000e+00 32 1.00000000000000e+00 33 -0.00000000000000e+00 34 0.00000000000000e+00 35 2.00000000000000e+00 36 -0.00000000000000e+00 37 0.00000000000000e+00 38 3.00000000000000e+00 39 -0.00000000000000e+00 40 0.00000000000000e+00 41 4.00000000000000e+00 42 -0.00000000000000e+00 43 0.00000000000000e+00 44 5.00000000000000e+00 45 -0.00000000000000e+00 46 0.00000000000000e+00 47 6.00000000000000e+00 48 -0.00000000000000e+00 49 0.00000000000000e+00 50 7.00000000000000e+00 51 -0.00000000000000e+00 52 0.00000000000000e+00 53 8.00000000000000e+00 54 -1.00000000000000e+00 55 0.00000000000000e+00 56 0.00000000000000e+00 57 -1.00000000000000e+00 58 0.00000000000000e+00 59 1.00000000000000e+00 60 -1.00000000000000e+00 61 0.00000000000000e+00 62 2.00000000000000e+00 63 -1.00000000000000e+00 64 0.00000000000000e+00 65 3.00000000000000e+00 66 -1.00000000000000e+00 67 0.00000000000000e+00 68 4.00000000000000e+00 69 -1.00000000000000e+00 70 0.00000000000000e+00 71 5.00000000000000e+00 72 -1.00000000000000e+00 73 0.00000000000000e+00 74 6.00000000000000e+00 75 -1.00000000000000e+00 76 0.00000000000000e+00 77 7.00000000000000e+00 78 -1.00000000000000e+00 79 0.00000000000000e+00 80 8.00000000000000e+00 81 -1.00000000000000e+00 82 0.00000000000000e+00 83 0.00000000000000e+00 84 -1.00000000000000e+00 85 0.00000000000000e+00 86 1.00000000000000e+00 87 -1.00000000000000e+00 88 0.00000000000000e+00 89 2.00000000000000e+00 90 -1.00000000000000e+00 91 0.00000000000000e+00 92 3.00000000000000e+00 93 -1.00000000000000e+00 94 0.00000000000000e+00 95 4.00000000000000e+00 96 -1.00000000000000e+00 97 0.00000000000000e+00 98 5.00000000000000e+00 99 -1.00000000000000e+00 100 0.00000000000000e+00 101 6.00000000000000e+00 102 -1.00000000000000e+00 103 0.00000000000000e+00 104 7.00000000000000e+00 105 -1.00000000000000e+00 106 0.00000000000000e+00 107 8.00000000000000e+00 108 -0.00000000000000e+00 109 0.00000000000000e+00 110 5.00000000000000e-01 111 -0.00000000000000e+00 112 0.00000000000000e+00 113 0.00000000000000e+00 114 -0.00000000000000e+00 115 0.00000000000000e+00 116 5.00000000000000e-01 117 -5.00000000000000e-01 118 0.00000000000000e+00 119 0.00000000000000e+00 120 -5.00000000000000e-01 121 0.00000000000000e+00 122 5.00000000000000e-01 123 -5.00000000000000e-01 124 0.00000000000000e+00 125 0.00000000000000e+00 126 -5.00000000000000e-01 127 0.00000000000000e+00 128 5.00000000000000e-01 129 -0.00000000000000e+00 130 0.00000000000000e+00 131 1.50000000000000e+00 132 -0.00000000000000e+00 133 0.00000000000000e+00 134 1.00000000000000e+00 135 -0.00000000000000e+00 136 0.00000000000000e+00 137 1.50000000000000e+00 138 -5.00000000000000e-01 139 0.00000000000000e+00 140 1.00000000000000e+00 141 -5.00000000000000e-01 142 0.00000000000000e+00 143 1.50000000000000e+00 144 -5.00000000000000e-01 145 0.00000000000000e+00 146 1.00000000000000e+00 147 -5.00000000000000e-01 148 0.00000000000000e+00 149 1.50000000000000e+00 150 -0.00000000000000e+00 151 0.00000000000000e+00 152 2.50000000000000e+00 153 -0.00000000000000e+00 154 0.00000000000000e+00 155 2.00000000000000e+00 156 -0.00000000000000e+00 157 0.00000000000000e+00 158 2.50000000000000e+00 159 -5.00000000000000e-01 160 0.00000000000000e+00 161 2.00000000000000e+00 162 -5.00000000000000e-01 163 0.00000000000000e+00 164 2.50000000000000e+00 165 -5.00000000000000e-01 166 0.00000000000000e+00 167 2.00000000000000e+00 168 -5.00000000000000e-01 169 0.00000000000000e+00 170 2.50000000000000e+00 171 -0.00000000000000e+00 172 0.00000000000000e+00 173 3.50000000000000e+00 174 -0.00000000000000e+00 175 0.00000000000000e+00 176 3.00000000000000e+00 177 -0.00000000000000e+00 178 0.00000000000000e+00 179 3.50000000000000e+00 180 -5.00000000000000e-01 181 0.00000000000000e+00 182 3.00000000000000e+00 183 -5.00000000000000e-01 184 0.00000000000000e+00 185 3.50000000000000e+00 186 -5.00000000000000e-01 187 0.00000000000000e+00 188 3.00000000000000e+00 189 -5.00000000000000e-01 190 0.00000000000000e+00 191 3.50000000000000e+00 192 -0.00000000000000e+00 193 0.00000000000000e+00 194 4.50000000000000e+00 195 -0.00000000000000e+00 196 0.00000000000000e+00 197 4.00000000000000e+00 198 -0.00000000000000e+00 199 0.00000000000000e+00 200 4.50000000000000e+00 201 -5.00000000000000e-01 202 0.00000000000000e+00 203 4.00000000000000e+00 204 -5.00000000000000e-01 205 0.00000000000000e+00 206 4.50000000000000e+00 207 -5.00000000000000e-01 208 0.00000000000000e+00 209 4.00000000000000e+00 210 -5.00000000000000e-01 211 0.00000000000000e+00 212 4.50000000000000e+00 213 -0.00000000000000e+00 214 0.00000000000000e+00 215 5.50000000000000e+00 216 -0.00000000000000e+00 217 0.00000000000000e+00 218 5.00000000000000e+00 219 -0.00000000000000e+00 220 0.00000000000000e+00 221 5.50000000000000e+00 222 -5.00000000000000e-01 223 0.00000000000000e+00 224 5.00000000000000e+00 225 -5.00000000000000e-01 226 0.00000000000000e+00 227 5.50000000000000e+00 228 -5.00000000000000e-01 229 0.00000000000000e+00 230 5.00000000000000e+00 231 -5.00000000000000e-01 232 0.00000000000000e+00 233 5.50000000000000e+00 234 -0.00000000000000e+00 235 0.00000000000000e+00 236 6.50000000000000e+00 237 -0.00000000000000e+00 238 0.00000000000000e+00 239 6.00000000000000e+00 240 -0.00000000000000e+00 241 0.00000000000000e+00 242 6.50000000000000e+00 243 -5.00000000000000e-01 244 0.00000000000000e+00 245 6.00000000000000e+00 246 -5.00000000000000e-01 247 0.00000000000000e+00 248 6.50000000000000e+00 249 -5.00000000000000e-01 250 0.00000000000000e+00 251 6.00000000000000e+00 252 -5.00000000000000e-01 253 0.00000000000000e+00 254 6.50000000000000e+00 255 -0.00000000000000e+00 256 0.00000000000000e+00 257 7.50000000000000e+00 258 -0.00000000000000e+00 259 0.00000000000000e+00 260 7.00000000000000e+00 261 -0.00000000000000e+00 262 0.00000000000000e+00 263 7.50000000000000e+00 264 -5.00000000000000e-01 265 0.00000000000000e+00 266 7.00000000000000e+00 267 -5.00000000000000e-01 268 0.00000000000000e+00 269 7.50000000000000e+00 270 -5.00000000000000e-01 271 0.00000000000000e+00 272 7.00000000000000e+00 273 -5.00000000000000e-01 274 0.00000000000000e+00 275 7.50000000000000e+00 276 -0.00000000000000e+00 277 0.00000000000000e+00 278 8.00000000000000e+00 279 -5.00000000000000e-01 280 0.00000000000000e+00 281 8.00000000000000e+00 282 -5.00000000000000e-01 283 0.00000000000000e+00 284 8.00000000000000e+00 285 -0.00000000000000e+00 286 0.00000000000000e+00 287 5.00000000000000e-01 288 -5.00000000000000e-01 289 0.00000000000000e+00 290 0.00000000000000e+00 291 -5.00000000000000e-01 292 0.00000000000000e+00 293 5.00000000000000e-01 294 -0.00000000000000e+00 295 0.00000000000000e+00 296 1.50000000000000e+00 297 -5.00000000000000e-01 298 0.00000000000000e+00 299 1.00000000000000e+00 300 -5.00000000000000e-01 301 0.00000000000000e+00 302 1.50000000000000e+00 303 -0.00000000000000e+00 304 0.00000000000000e+00 305 2.50000000000000e+00 306 -5.00000000000000e-01 307 0.00000000000000e+00 308 2.00000000000000e+00 309 -5.00000000000000e-01 310 0.00000000000000e+00 311 2.50000000000000e+00 312 -0.00000000000000e+00 313 0.00000000000000e+00 314 3.50000000000000e+00 315 -5.00000000000000e-01 316 0.00000000000000e+00 317 3.00000000000000e+00 318 -5.00000000000000e-01 319 0.00000000000000e+00 320 3.50000000000000e+00 321 -0.00000000000000e+00 322 0.00000000000000e+00 323 4.50000000000000e+00 324 -5.00000000000000e-01 325 0.00000000000000e+00 326 4.00000000000000e+00 327 -5.00000000000000e-01 328 0.00000000000000e+00 329 4.50000000000000e+00 330 -0.00000000000000e+00 331 0.00000000000000e+00 332 5.50000000000000e+00 333 -5.00000000000000e-01 334 0.00000000000000e+00 335 5.00000000000000e+00 336 -5.00000000000000e-01 337 0.00000000000000e+00 338 5.50000000000000e+00 339 -0.00000000000000e+00 340 0.00000000000000e+00 341 6.50000000000000e+00 342 -5.00000000000000e-01 343 0.00000000000000e+00 344 6.00000000000000e+00 345 -5.00000000000000e-01 346 0.00000000000000e+00 347 6.50000000000000e+00 348 -0.00000000000000e+00 349 0.00000000000000e+00 350 7.50000000000000e+00 351 -5.00000000000000e-01 352 0.00000000000000e+00 353 7.00000000000000e+00 354 -5.00000000000000e-01 355 0.00000000000000e+00 356 7.50000000000000e+00 357 -5.00000000000000e-01 358 0.00000000000000e+00 359 8.00000000000000e+00 360 -1.00000000000000e+00 361 0.00000000000000e+00 362 5.00000000000000e-01 363 -1.00000000000000e+00 364 0.00000000000000e+00 365 0.00000000000000e+00 366 -1.00000000000000e+00 367 0.00000000000000e+00 368 5.00000000000000e-01 369 -1.00000000000000e+00 370 0.00000000000000e+00 371 1.50000000000000e+00 372 -1.00000000000000e+00 373 0.00000000000000e+00 374 1.00000000000000e+00 375 -1.00000000000000e+00 376 0.00000000000000e+00 377 1.50000000000000e+00 378 -1.00000000000000e+00 379 0.00000000000000e+00 380 2.50000000000000e+00 381 -1.00000000000000e+00 382 0.00000000000000e+00 383 2.00000000000000e+00 384 -1.00000000000000e+00 385 0.00000000000000e+00 386 2.50000000000000e+00 387 -1.00000000000000e+00 388 0.00000000000000e+00 389 3.50000000000000e+00 390 -1.00000000000000e+00 391 0.00000000000000e+00 392 3.00000000000000e+00 393 -1.00000000000000e+00 394 0.00000000000000e+00 395 3.50000000000000e+00 396 -1.00000000000000e+00 397 0.00000000000000e+00 398 4.50000000000000e+00 399 -1.00000000000000e+00 400 0.00000000000000e+00 401 4.00000000000000e+00 402 -1.00000000000000e+00 403 0.00000000000000e+00 404 4.50000000000000e+00 405 -1.00000000000000e+00 406 0.00000000000000e+00 407 5.50000000000000e+00 408 -1.00000000000000e+00 409 0.00000000000000e+00 410 5.00000000000000e+00 411 -1.00000000000000e+00 412 0.00000000000000e+00 413 5.50000000000000e+00 414 -1.00000000000000e+00 415 0.00000000000000e+00 416 6.50000000000000e+00 417 -1.00000000000000e+00 418 0.00000000000000e+00 419 6.00000000000000e+00 420 -1.00000000000000e+00 421 0.00000000000000e+00 422 6.50000000000000e+00 423 -1.00000000000000e+00 424 0.00000000000000e+00 425 7.50000000000000e+00 426 -1.00000000000000e+00 427 0.00000000000000e+00 428 7.00000000000000e+00 429 -1.00000000000000e+00 430 0.00000000000000e+00 431 7.50000000000000e+00 432 -1.00000000000000e+00 433 0.00000000000000e+00 434 8.00000000000000e+00 435 -1.00000000000000e+00 436 0.00000000000000e+00 437 5.00000000000000e-01 438 -1.00000000000000e+00 439 0.00000000000000e+00 440 1.50000000000000e+00 441 -1.00000000000000e+00 442 0.00000000000000e+00 443 2.50000000000000e+00 444 -1.00000000000000e+00 445 0.00000000000000e+00 446 3.50000000000000e+00 447 -1.00000000000000e+00 448 0.00000000000000e+00 449 4.50000000000000e+00 450 -1.00000000000000e+00 451 0.00000000000000e+00 452 5.50000000000000e+00 453 -1.00000000000000e+00 454 0.00000000000000e+00 455 6.50000000000000e+00 456 -1.00000000000000e+00 457 0.00000000000000e+00 458 7.50000000000000e+00 hypre-2.33.0/src/test/TEST_ij/data/generate_poisson_10x10x10.sh000077500000000000000000000033031477326011500237400ustar00rootroot00000000000000#!/bin/bash # Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) #################################################################### # This bash script is intended to regenerate the binary files under # the folders poisson_10x10x10_np1 and poisson_10x10x10_np4 if the # binary input/output functions from the IJ interface get changed. #################################################################### function movefiles() { mv -v IJ.out.A.${SUFFIX} ${DEST_DIR}/IJ.A.${PREC}.${SUFFIX} mv -v IJ.out.b.${SUFFIX} ${DEST_DIR}/IJ.b.${PREC}.${SUFFIX} mv -v IJ.out.x0.${SUFFIX} ${DEST_DIR}/IJ.x0.${PREC}.${SUFFIX} } CWD=$(pwd) HYPRE_SRC=$(dirname "$(readlink -f "${CWD}/../../")") PREC_ARRAY=("i4f4" "i4f8" "i8f4" "i8f8") CONFOPTS_ARRAY=("--disable-mixedint --enable-single" "--disable-mixedint --disable-single" "--enable-mixedint --enable-single" "--enable-mixedint --disable-single") IJOPTS="-n 10 10 10 -printbin -tol 1 -solver 2" for I in {0..3}; do PREC=${PREC_ARRAY[${I}]} CONFOPTS=${CONFOPTS_ARRAY[${I}]} cd ${HYPRE_SRC} ./configure --enable-debug ${CONFOPTS} make clean make -j cd test make clean ij # Sequential case DEST_DIR=${HYPRE_SRC}/test/TEST_ij/data/poisson_10x10x10_np1 mpirun -np 1 ./ij ${IJOPTS} SUFFIX=00000.bin movefiles # Parallel case DEST_DIR=${HYPRE_SRC}/test/TEST_ij/data/poisson_10x10x10_np4 mpirun -np 4 ./ij ${IJOPTS} -P 2 2 1 for J in {0..3}; do SUFFIX=0000${J}.bin movefiles done rm -rf IJ.out.x.* done hypre-2.33.0/src/test/TEST_ij/data/poisson_10x10x10_np1/000077500000000000000000000000001477326011500223065ustar00rootroot00000000000000hypre-2.33.0/src/test/TEST_ij/data/poisson_10x10x10_np1/IJ.A.i4f4.00000.bin000066400000000000000000002261301477326011500246700ustar00rootroot00000000000000èèçç  !!!!!!""""""######$$$$$$%%%%%%&&&&&&'''''((((())))))******++++++,,,,,,------......//////0000001111122222333333444444555555666666777777888888999999::::::;;;;;<<<<<======>>>>>>??????@@@@@@AAAAAABBBBBBCCCCCCDDDDDDEEEEEFFFFFGGGGGGHHHHHHIIIIIIJJJJJJKKKKKKLLLLLLMMMMMMNNNNNNOOOOOPPPPPQQQQQQRRRRRRSSSSSSTTTTTTUUUUUUVVVVVVWWWWWWXXXXXXYYYYYZZZZ[[[[[\\\\\]]]]]^^^^^_____`````aaaaabbbbbccccdddddeeeeeeffffffgggggghhhhhhiiiiiijjjjjjkkkkkkllllllmmmmmnnnnnnooooooopppppppqqqqqqqrrrrrrrssssssstttttttuuuuuuuvvvvvvvwwwwwwxxxxxxyyyyyyyzzzzzzz{{{{{{{|||||||}}}}}}}~~~~~~~€€€€€€€‚‚‚‚‚‚ƒƒƒƒƒƒƒ„„„„„„„…………………†††††††‡‡‡‡‡‡‡ˆˆˆˆˆˆˆ‰‰‰‰‰‰‰ŠŠŠŠŠŠŠ‹‹‹‹‹‹ŒŒŒŒŒŒŽŽŽŽŽŽŽ‘‘‘‘‘‘‘’’’’’’’“““““““”””””””••••••––––––———————˜˜˜˜˜˜˜™™™™™™™ššššššš›››››››œœœœœœœžžžžžžžŸŸŸŸŸŸ      ¡¡¡¡¡¡¡¢¢¢¢¢¢¢£££££££¤¤¤¤¤¤¤¥¥¥¥¥¥¥¦¦¦¦¦¦¦§§§§§§§¨¨¨¨¨¨¨©©©©©©ªªªªªª«««««««¬¬¬¬¬¬¬­­­­­­­®®®®®®®¯¯¯¯¯¯¯°°°°°°°±±±±±±±²²²²²²²³³³³³³´´´´´´µµµµµµµ¶¶¶¶¶¶¶·······¸¸¸¸¸¸¸¹¹¹¹¹¹¹ººººººº»»»»»»»¼¼¼¼¼¼¼½½½½½½¾¾¾¾¾¿¿¿¿¿¿ÀÀÀÀÀÀÁÁÁÁÁÁÂÂÂÂÂÂÃÃÃÃÃÃÄÄÄÄÄÄÅÅÅÅÅÅÆÆÆÆÆÆÇÇÇÇÇÈÈÈÈÈÉÉÉÉÉÉÊÊÊÊÊÊËËËËËËÌÌÌÌÌÌÍÍÍÍÍÍÎÎÎÎÎÎÏÏÏÏÏÏÐÐÐÐÐÐÑÑÑÑÑÒÒÒÒÒÒÓÓÓÓÓÓÓÔÔÔÔÔÔÔÕÕÕÕÕÕÕÖÖÖÖÖÖÖ×××××××ØØØØØØØÙÙÙÙÙÙÙÚÚÚÚÚÚÚÛÛÛÛÛÛÜÜÜÜÜÜÝÝÝÝÝÝÝÞÞÞÞÞÞÞßßßßßßßàààààààáááááááâââââââãããããããäääääääååååååææææææçççççççèèèèèèèéééééééêêêêêêêëëëëëëëìììììììíííííííîîîîîîîïïïïïïððððððñññññññòòòòòòòóóóóóóóôôôôôôôõõõõõõõööööööö÷÷÷÷÷÷÷øøøøøøøùùùùùùúúúúúúûûûûûûûüüüüüüüýýýýýýýþþþþþþþÿÿÿÿÿÿÿ                                         !!!!!!"""""######$$$$$$%%%%%%&&&&&&''''''(((((())))))******+++++,,,,,------......//////00000011111122222233333344444455555666666777777788888889999999:::::::;;;;;;;<<<<<<<=======>>>>>>>??????@@@@@@AAAAAAABBBBBBBCCCCCCCDDDDDDDEEEEEEEFFFFFFFGGGGGGGHHHHHHHIIIIIIJJJJJJKKKKKKKLLLLLLLMMMMMMMNNNNNNNOOOOOOOPPPPPPPQQQQQQQRRRRRRRSSSSSSTTTTTTUUUUUUUVVVVVVVWWWWWWWXXXXXXXYYYYYYYZZZZZZZ[[[[[[[\\\\\\\]]]]]]^^^^^^_______```````aaaaaaabbbbbbbcccccccdddddddeeeeeeefffffffgggggghhhhhhiiiiiiijjjjjjjkkkkkkklllllllmmmmmmmnnnnnnnooooooopppppppqqqqqqrrrrrrssssssstttttttuuuuuuuvvvvvvvwwwwwwwxxxxxxxyyyyyyyzzzzzzz{{{{{{||||||}}}}}}}~~~~~~~€€€€€€€‚‚‚‚‚‚‚ƒƒƒƒƒƒƒ„„„„„„„………………†††††‡‡‡‡‡‡ˆˆˆˆˆˆ‰‰‰‰‰‰ŠŠŠŠŠŠ‹‹‹‹‹‹ŒŒŒŒŒŒŽŽŽŽŽŽ‘‘‘‘‘‘’’’’’’““““““””””””••••••––––––——————˜˜˜˜˜˜™™™™™šššššš›››››››œœœœœœœžžžžžžžŸŸŸŸŸŸŸ       ¡¡¡¡¡¡¡¢¢¢¢¢¢¢££££££¤¤¤¤¤¤¥¥¥¥¥¥¥¦¦¦¦¦¦¦§§§§§§§¨¨¨¨¨¨¨©©©©©©©ªªªªªªª«««««««¬¬¬¬¬¬¬­­­­­­®®®®®®¯¯¯¯¯¯¯°°°°°°°±±±±±±±²²²²²²²³³³³³³³´´´´´´´µµµµµµµ¶¶¶¶¶¶¶······¸¸¸¸¸¸¹¹¹¹¹¹¹ººººººº»»»»»»»¼¼¼¼¼¼¼½½½½½½½¾¾¾¾¾¾¾¿¿¿¿¿¿¿ÀÀÀÀÀÀÀÁÁÁÁÁÁÂÂÂÂÂÂÃÃÃÃÃÃÃÄÄÄÄÄÄÄÅÅÅÅÅÅÅÆÆÆÆÆÆÆÇÇÇÇÇÇÇÈÈÈÈÈÈÈÉÉÉÉÉÉÉÊÊÊÊÊÊÊËËËËËËÌÌÌÌÌÌÍÍÍÍÍÍÍÎÎÎÎÎÎÎÏÏÏÏÏÏÏÐÐÐÐÐÐÐÑÑÑÑÑÑÑÒÒÒÒÒÒÒÓÓÓÓÓÓÓÔÔÔÔÔÔÔÕÕÕÕÕÕÖÖÖÖÖÖ×××××××ØØØØØØØÙÙÙÙÙÙÙÚÚÚÚÚÚÚÛÛÛÛÛÛÛÜÜÜÜÜÜÜÝÝÝÝÝÝÝÞÞÞÞÞÞÞßßßßßßààààààáááááááâââââââãããããããäääääääåååååååæææææææçççççççèèèèèèèééééééêêêêêëëëëëëììììììííííííîîîîîîïïïïïïððððððññññññòòòòòòóóóóóôôôôôõõõõõõöööööö÷÷÷÷÷÷øøøøøøùùùùùùúúúúúúûûûûûûüüüüüüýýýýýþþþþþþÿÿÿÿÿÿÿ                                          !!!!!!!"""""""#######$$$$$$$%%%%%%&&&&&&'''''''((((((()))))))*******+++++++,,,,,,,-------.......//////00000011111112222222333333344444445555555666666677777778888888999999::::::;;;;;;;<<<<<<<=======>>>>>>>???????@@@@@@@AAAAAAABBBBBBBCCCCCCDDDDDDEEEEEEEFFFFFFFGGGGGGGHHHHHHHIIIIIIIJJJJJJJKKKKKKKLLLLLLLMMMMMMNNNNNOOOOOOPPPPPPQQQQQQRRRRRRSSSSSSTTTTTTUUUUUUVVVVVVWWWWWXXXXXYYYYYYZZZZZZ[[[[[[\\\\\\]]]]]]^^^^^^______``````aaaaabbbbbbcccccccdddddddeeeeeeefffffffggggggghhhhhhhiiiiiiijjjjjjjkkkkkkllllllmmmmmmmnnnnnnnooooooopppppppqqqqqqqrrrrrrrssssssstttttttuuuuuuvvvvvvwwwwwwwxxxxxxxyyyyyyyzzzzzzz{{{{{{{|||||||}}}}}}}~~~~~~~€€€€€€‚‚‚‚‚‚‚ƒƒƒƒƒƒƒ„„„„„„„…………………†††††††‡‡‡‡‡‡‡ˆˆˆˆˆˆˆ‰‰‰‰‰‰ŠŠŠŠŠŠ‹‹‹‹‹‹‹ŒŒŒŒŒŒŒŽŽŽŽŽŽŽ‘‘‘‘‘‘‘’’’’’’’““““““””””””•••••••–––––––———————˜˜˜˜˜˜˜™™™™™™™ššššššš›››››››œœœœœœœžžžžžžŸŸŸŸŸŸŸ       ¡¡¡¡¡¡¡¢¢¢¢¢¢¢£££££££¤¤¤¤¤¤¤¥¥¥¥¥¥¥¦¦¦¦¦¦¦§§§§§§¨¨¨¨¨¨©©©©©©©ªªªªªªª«««««««¬¬¬¬¬¬¬­­­­­­­®®®®®®®¯¯¯¯¯¯¯°°°°°°°±±±±±±²²²²²³³³³³³´´´´´´µµµµµµ¶¶¶¶¶¶······¸¸¸¸¸¸¹¹¹¹¹¹ºººººº»»»»»¼¼¼¼¼½½½½½½¾¾¾¾¾¾¿¿¿¿¿¿ÀÀÀÀÀÀÁÁÁÁÁÁÂÂÂÂÂÂÃÃÃÃÃÃÄÄÄÄÄÄÅÅÅÅÅÆÆÆÆÆÆÇÇÇÇÇÇÇÈÈÈÈÈÈÈÉÉÉÉÉÉÉÊÊÊÊÊÊÊËËËËËËËÌÌÌÌÌÌÌÍÍÍÍÍÍÍÎÎÎÎÎÎÎÏÏÏÏÏÏÐÐÐÐÐÐÑÑÑÑÑÑÑÒÒÒÒÒÒÒÓÓÓÓÓÓÓÔÔÔÔÔÔÔÕÕÕÕÕÕÕÖÖÖÖÖÖÖ×××××××ØØØØØØØÙÙÙÙÙÙÚÚÚÚÚÚÛÛÛÛÛÛÛÜÜÜÜÜÜÜÝÝÝÝÝÝÝÞÞÞÞÞÞÞßßßßßßßàààààààáááááááâââââââããããããääääääåååååååæææææææçççççççèèèèèèèéééééééêêêêêêêëëëëëëëìììììììííííííîîîîîîïïïïïïïðððððððñññññññòòòòòòòóóóóóóóôôôôôôôõõõõõõõööööööö÷÷÷÷÷÷øøøøøøùùùùùùùúúúúúúúûûûûûûûüüüüüüüýýýýýýýþþþþþþþÿÿÿÿÿÿÿ                                      !!!!!!""""""######$$$$$$%%%%%%&&&&&&''''''(((((()))))******+++++++,,,,,,,-------.......///////00000001111111222222233333344444455555556666666777777788888889999999:::::::;;;;;;;<<<<<<<======>>>>>>???????@@@@@@@AAAAAAABBBBBBBCCCCCCCDDDDDDDEEEEEEEFFFFFFFGGGGGGHHHHHHIIIIIIIJJJJJJJKKKKKKKLLLLLLLMMMMMMMNNNNNNNOOOOOOOPPPPPPPQQQQQQRRRRRRSSSSSSSTTTTTTTUUUUUUUVVVVVVVWWWWWWWXXXXXXXYYYYYYYZZZZZZZ[[[[[[\\\\\\]]]]]]]^^^^^^^_______```````aaaaaaabbbbbbbcccccccdddddddeeeeeeffffffggggggghhhhhhhiiiiiiijjjjjjjkkkkkkklllllllmmmmmmmnnnnnnnooooooppppppqqqqqqqrrrrrrrssssssstttttttuuuuuuuvvvvvvvwwwwwwwxxxxxxxyyyyyyzzzzz{{{{{{||||||}}}}}}~~~~~~€€€€€€‚‚‚‚‚‚ƒƒƒƒƒ„„„„……………†††††‡‡‡‡‡ˆˆˆˆˆ‰‰‰‰‰ŠŠŠŠŠ‹‹‹‹‹ŒŒŒŒŒŽŽŽŽŽ‘‘‘‘‘‘’’’’’’““““““””””””••••••––––––—————˜˜˜˜˜™™™™™™šššššš››››››œœœœœœžžžžžžŸŸŸŸŸŸ      ¡¡¡¡¡¢¢¢¢¢££££££¤¤¤¤¤¤¥¥¥¥¥¥¦¦¦¦¦¦§§§§§§¨¨¨¨¨¨©©©©©©ªªªªªª«««««¬¬¬¬¬­­­­­­®®®®®®¯¯¯¯¯¯°°°°°°±±±±±±²²²²²²³³³³³³´´´´´´µµµµµ¶¶¶¶¶······¸¸¸¸¸¸¹¹¹¹¹¹ºººººº»»»»»»¼¼¼¼¼¼½½½½½½¾¾¾¾¾¾¿¿¿¿¿ÀÀÀÀÀÁÁÁÁÁÁÂÂÂÂÂÂÃÃÃÃÃÃÄÄÄÄÄÄÅÅÅÅÅÅÆÆÆÆÆÆÇÇÇÇÇÇÈÈÈÈÈÈÉÉÉÉÉÊÊÊÊÊËËËËËËÌÌÌÌÌÌÍÍÍÍÍÍÎÎÎÎÎÎÏÏÏÏÏÏÐÐÐÐÐÐÑÑÑÑÑÑÒÒÒÒÒÒÓÓÓÓÓÔÔÔÔÔÕÕÕÕÕÕÖÖÖÖÖÖ××××××ØØØØØØÙÙÙÙÙÙÚÚÚÚÚÚÛÛÛÛÛÛÜÜÜÜÜÜÝÝÝÝÝÞÞÞÞßßßßßàààààáááááâââââãããããäääääåååååæææææçççç d e f ghijk l m n  o  p  q rstuv w x y  z !{"|#}$~%&€'(‚ )ƒ !*„! "+…"!#,†#"$-‡$#%.ˆ%$&/‰&%'0Š'&1‹()2Œ)(*3* )+4Ž+!*,5,"+-6-#,.7‘.$-/8’/%.09“0&/1:”1'0;•2(3<–3)24=—4*35>˜5+46?™6,57@š7-68A›8.79Bœ9/8:C:09;Dž;1:EŸ<2=F =3<>G¡>4=?H¢?5>@I£@6?AJ¤A7@BK¥B8ACL¦C9BDM§D:CEN¨E;DO©F<GPªG=FHQ«H>GIR¬I?HJS­J@IKT®KAJLU¯LBKMV°MCLNW±NDMOX²OENY³PFQZ´QGPR[µRHQS\¶SIRT]·TJSU^¸UKTV_¹VLUW`ºWMVXa»XNWYb¼YOXc½ZP[¾[QZ\¿\R[]À]S\^Á^T]_Â_U^`Ã`V_aÄaW`bÅbXacÆcYbÇdenÈedfoÉfegpÊgfhqËhgirÌihjsÍjiktÎkjluÏlkmvÐm lwÑn doxÒo enpyÓp foqzÔq gpr{Õrhqs|Ösirt}×tjsu~ØuktvÙvluw€ÚwmvÛxny‚ÜyoxzƒÝzpy{„Þ{qz|…ß|r{}†à}s|~‡á~t}ˆâu~€‰ã€vŠäw€‹å‚xƒŒæƒy‚„ç„ zƒ…Žè…!{„†é†"|…‡ê‡#}†ˆ‘ëˆ$~‡‰’ì‰%ˆŠ“íŠ&€‰‹”î‹'Š•ïŒ(‚–ð)ƒŒŽ—ñŽ*„˜ò+…Ž™ó,†‘šô‘-‡’›õ’.ˆ‘“œö“/‰’”÷”0Š“•žø•1‹”Ÿù–2Œ— ú—3–˜¡û˜4Ž—™¢ü™5˜š£ýš6™›¤þ›7‘šœ¥ÿœ8’›¦9“œž§ž:”Ÿ¨Ÿ;•ž© <–¡ª¡=— ¢«¢>˜¡£¬£?™¢¤­¤@𣥮¥A›¤¦¯ ¦Bœ¥§° §C¦¨± ¨Dž§©² ©EŸ¨³ ªF «´«G¡ª¬µ¬H¢«­¶­I£¬®·®J¤­¯¸¯K¥®°¹°L¦¯±º±M§°²»²N¨±³¼³O©²½´Pªµ¾µQ«´¶¿¶R¬µ·À·S­¶¸Á¸T®·¹Â¹U¯¸ºÃºV°¹»Ä»W±º¼Å¼X²»½Æ ½Y³¼Ç!¾Z´¿"¿[µ¾À#À\¶¿Á$Á]·ÀÂ%Â^¸ÁÃ&Ã_¹ÂÄ'Ä`ºÃÅ(Åa»ÄÆ)Æb¼ÅÇ*Çc½Æ+ÈdÉÒ,ÉeÈÊÓ-ÊfÉËÔ.ËgÊÌÕ/ÌhËÍÖ0ÍiÌÎ×1ÎjÍÏØ2ÏkÎÐÙ3ÐlÏÑÚ4ÑmÐÛ5ÒnÈÓÜ6ÓoÉÒÔÝ7ÔpÊÓÕÞ8ÕqËÔÖß9ÖrÌÕ×à:×sÍÖØá;ØtÎ×Ùâ<ÙuÏØÚã=ÚvÐÙÛä>ÛwÑÚå?ÜxÒÝæ@ÝyÓÜÞçAÞzÔÝßèBß{ÕÞàéCà|ÖßáêDá}×àâëEâ~ØáãìFãÙâäíGä€ÚãåîHåÛäïIæ‚ÜçðJçƒÝæèñKè„ÞçéòLé…ßèêóMê†àéëôNë‡áêìõOìˆâëíöPí‰ãìî÷QîŠäíïøRï‹åîùSðŒæñúTñçðòûUòŽèñóüVóéòôýWôêóõþXõ‘ëôöÿYö’ìõ÷Z÷“íöø[ø”î÷ù\ù•ïø]ú–ðû^û—ñúü_ü˜òûý`ý™óüþaþšôýÿbÿ›õþ cœöÿ d÷ ežø fŸù g úh¡ûi¢üj£ýk¤þ l ¥ÿ m ¦  n §  o ¨  p © qªr«s¬t­u®v¯ w° x± y²  z³ !{´"|µ#}¶$~·%¸&€¹'º(‚» )ƒ ¼!*„!½ +…"¾#†#¿"$‡$À#%ˆ%Á$&‰&Â%'Š'Ã&(‹(Ä')Œ)Å(**Æ )+Ž+Ç!*,È-6-É,.7‘.Ê-/8’/Ë.09“0Ì/1:”1Í02;•2Î13<–3Ï24=—4Ð35>˜5Ñ4?™6Ò,7@š7Ó-68A›8Ô.79Bœ9Õ/8:C:Ö09;Dž;×1:<EŸ<Ø2;=F =Ù3<>G¡>Ú4=?H¢?Û5>I£@Ü6AJ¤AÝ7@BK¥BÞ8ACL¦Cß9BDM§Dà:CEN¨Eá;DFO©Fâ<EGPªGã=FHQ«Hä>GIR¬Iå?HS­Jæ@KT®KçAJLU¯LèBKMV°MéCLNW±NêDMOX²OëENPY³PìFOQZ´QíGPR[µRîHQS\¶SïIR]·TðJU^¸UñKTV_¹VòLUW`ºWóMVXa»XôNWYb¼YõOXZc½ZöPY[d¾[÷QZ\e¿\øR[]fÀ]ùS\gÁ^úT_hÂ_ûU^`iÃ`üV_ajÄaýW`bkÅbþXaclÆcÿYbdmÇdZcenÈe[dfoÉf\egpÊg]fqËh^irÌi_hjsÍj`iktÎkajluÏlbkmvÐm clnwÑn dmoxÒo enpyÓp foqzÔq gp{Õrhs|Ösirt}×tjsu~ØuktvÙvluw€ÚwmvxÛxnwy‚ÜyoxzƒÝzpy{„Þ{qz…ß|r}†à}s|~‡á~t}ˆâu~€‰ã€vŠäw€‚‹å‚xƒŒæƒy‚„ç„ zƒ…Žè…!{„é†"|‡ê‡#}†ˆëˆ$~‡‰ì‰%ˆŠíŠ&€‰‹î‹'ŠŒïŒ(‚‹ð)ƒŒŽñŽ*„ò+…Žó,‘šô‘-’›õ’.‘“œö“/’”÷”0“•žø•1”–Ÿù–2•— ú—3–˜¡û˜4—™¢ü™5˜£ýš6›¤þ›7‘šœ¥ÿœ8’›¦9“œž§ž:”Ÿ¨Ÿ;•ž © <–Ÿ¡ª¡=— ¢«¢>˜¡£¬£?™¢­¤@𥮥A›¤¦¯ ¦Bœ¥§° §C¦¨± ¨Dž§©² ©EŸ¨ª³ ªF ©«´«G¡ª¬µ¬H¢«­¶­I£¬·®J¤¯¸¯K¥®°¹°L¦¯±º±M§°²»²N¨±³¼³O©²´½´Pª³µ¾µQ«´¶¿¶R¬µ·À·S­¶Á¸T®¹Â¹U¯¸ºÃºV°¹»Ä»W±º¼Å¼X²»½Æ ½Y³¼¾Ç!¾Z´½¿È"¿[µ¾ÀÉ#À\¶¿ÁÊ$Á]·ÀË%Â^¸ÃÌ&Ã_¹ÂÄÍ'Ä`ºÃÅÎ(Åa»ÄÆÏ)Æb¼ÅÇÐ*Çc½ÆÈÑ+Èd¾ÇÉÒ,Ée¿ÈÊÓ-ÊfÀÉËÔ.ËgÁÊÕ/ÌhÂÍÖ0ÍiÃÌÎ×1ÎjÄÍÏØ2ÏkÅÎÐÙ3ÐlÆÏÑÚ4ÑmÇÐÒÛ5ÒnÈÑÓÜ6ÓoÉÒÔÝ7ÔpÊÓÕÞ8ÕqËÔß9ÖrÌ×à:×sÍÖØá;ØtÎ×Ùâ<ÙuÏØÚã=ÚvÐÙÛä>ÛwÑÚÜå?ÜxÒÛÝæ@ÝyÓÜÞçAÞzÔÝßèBß{ÕÞéCà|ÖáêDá}×àâëEâ~ØáãìFãÙâäíGä€ÚãåîHåÛäæïIæ‚ÜåçðJçƒÝæèñKè„ÞçéòLé…ßèóMê†àëNë‡áêìOìˆâëíPí‰ãìîQîŠäíïRï‹åîðSðŒæïñTñçðòUòŽèñóVóéòWôõþXõ‘ôöÿYö’õ÷Z÷“öø[ø”÷ù\ù•øú]ú–ùû^û—úü_ü˜ûý`ý™üaþšôÿbÿ›õþ cœöÿ d÷ ežø fŸù g úh¡ûi¢üj£ýk¤þ l ¥ÿ m ¦  n §  o ¨  p © qª r«s¬t­u®v¯ w° x± y²  z³ !{´"|µ#}¶$~·%¸&€¹'º(‚» )ƒ ¼!*„!½ "+…"¾!#,†#¿"$-‡$À#%.ˆ%Á$/‰&Â'0Š'Ã&(1‹(Ä')2Œ)Å(*3*Æ )+4Ž+Ç!*,5,È"+-6-É#,.7‘.Ê$-/8’/Ë%.9“0Ì&1:”1Í'02;•2Î(13<–3Ï)24=—4Ð*35>˜5Ñ+46?™6Ò,57@š7Ó-68A›8Ô.79Bœ9Õ/8C:Ö0;Dž;×1:<EŸ<Ø2;=F =Ù3<>G¡>Ú4=?H¢?Û5>@I£@Ü6?AJ¤AÝ7@BK¥BÞ8ACL¦Cß9BM§Dà:EN¨Eá;DFO©Fâ<EGPªGã=FHQ«Hä>GIR¬Iå?HJS­Jæ@IKT®KçAJLU¯LèBKMV°MéCLW±NêDO²OëENP³PìFOQ´QíGPRµRîHQS¶SïIRT·TðJSU¸UñKTV¹VòLUWºWóMV»XôYb¼YõXZc½ZöY[d¾[÷Z\e¿\ø[]fÀ]ù\^gÁ^ú]_hÂ_û^`iÃ`ü_ajÄaý`kÅbþXclÆcÿYbdmÇdZcenÈe[dfoÉf\egpÊg]fhqËh^girÌi_hjsÍj`iktÎkajuÏlbmvÐm clnwÑn dmoxÒo enpyÓp foqzÔq gpr{Õrhqs|Ösirt}×tjsu~ØuktÙvlw€ÚwmvxÛxnwy‚ÜyoxzƒÝzpy{„Þ{qz|…ß|r{}†à}s|~‡á~t}ˆâu~‰ã€vŠäw€‚‹å‚xƒŒæƒy‚„ç„ zƒ…Žè…!{„†é†"|…‡ê‡#}†ˆ‘ëˆ$~‡‰’ì‰%ˆ“íŠ&€‹”î‹'ŠŒ•ïŒ(‚‹–ð)ƒŒŽ—ñŽ*„˜ò+…Ž™ó,†‘šô‘-‡’›õ’.ˆ‘“œö“/‰’÷”0Š•žø•1‹”–Ÿù–2Œ•— ú—3–˜¡û˜4Ž—™¢ü™5˜š£ýš6™›¤þ›7‘šœ¥ÿœ8’›¦9“œ§ž:”Ÿ¨Ÿ;•ž © <–Ÿ¡ª¡=— ¢«¢>˜¡£¬£?™¢¤­¤@𣥮¥A›¤¦¯ ¦Bœ¥§° §C¦± ¨Dž©² ©EŸ¨ª³ ªF ©«´«G¡ª¬µ¬H¢«­¶­I£¬®·®J¤­¯¸¯K¥®°¹°L¦¯±º±M§°»²N¨³³O©²´´Pª³µµQ«´¶¶R¬µ··S­¶¸¸T®·¹¹U¯¸ººV°¹»»W±º¼X½Æ ½Y¼¾Ç!¾Z½¿È"¿[¾ÀÉ#À\¿ÁÊ$Á]ÀÂË%Â^ÁÃÌ&Ã_ÂÄÍ'Ä`ÃÅÎ(ÅaÄÏ)Æb¼ÇÐ*Çc½ÆÈÑ+Èd¾ÇÉÒ,Ée¿ÈÊÓ-ÊfÀÉËÔ.ËgÁÊÌÕ/ÌhÂËÍÖ0ÍiÃÌÎ×1ÎjÄÍÏØ2ÏkÅÎÙ3ÐlÆÑÚ4ÑmÇÐÒÛ5ÒnÈÑÓÜ6ÓoÉÒÔÝ7ÔpÊÓÕÞ8ÕqËÔÖß9ÖrÌÕ×à:×sÍÖØá;ØtÎ×Ùâ<ÙuÏØã=ÚvÐÛä>ÛwÑÚÜå?ÜxÒÛÝæ@ÝyÓÜÞçAÞzÔÝßèBß{ÕÞàéCà|ÖßáêDá}×àâëEâ~ØáãìFãÙâíGä€ÚåîHåÛäæïIæ‚ÜåçðJçƒÝæèñKè„ÞçéòLé…ßèêóMê†àéëôNë‡áêìõOìˆâëíöPí‰ãì÷QîŠäïøRï‹åîðùSðŒæïñúTñçðòûUòŽèñóüVóéòôýWôêóõþXõ‘ëôöÿYö’ìõ÷Z÷“íö[ø”îù\ù•ïøú]ú–ðùû^û—ñúü_ü˜òûý`ý™óüþaþšôýÿbÿ›õþ cœöÿ d÷ ežø fŸù g úh¡ûi¢üj£ýk¤þ l ¥ÿ m ¦  n § o ¨ p © qª r«s¬t­u®v¯ w° x± y² z³ {´|µ}¶~·¸€¹º‚»ƒ ¼!*„!½ "+…"¾!#,†#¿"$-‡$À#%.ˆ%Á$&/‰&Â%'0Š'Ã&(1‹(Ä')2Œ)Å(3*Æ +4Ž+Ç!*,5,È"+-6-É#,.7‘.Ê$-/8’/Ë%.09“0Ì&/1:”1Í'02;•2Î(13<–3Ï)2=—4Ð*5>˜5Ñ+46?™6Ò,57@š7Ó-68A›8Ô.79Bœ9Õ/8:C:Ö09;Dž;×1:<EŸ<Ø2;=F =Ù3<G¡>Ú4?H¢?Û5>@I£@Ü6?AJ¤AÝ7@BK¥BÞ8ACL¦Cß9BDM§Dà:CEN¨Eá;DFO©Fâ<EGPªGã=FQ«Hä>IR¬Iå?HJS­Jæ@IKT®KçAJLU¯LèBKMV°MéCLNW±NêDMOX²OëENPY³PìFOQZ´QíGP[µRîHS\¶SïIRT]·TðJSU^¸UñKTV_¹VòLUW`ºWóMVXa»XôNWYb¼YõOXZc½ZöPY[d¾[÷QZe¿\øR]fÀ]ùS\^gÁ^úT]_hÂ_ûU^`iÃ`üV_ajÄaýW`bkÅbþXaclÆcÿYbdmÇdZcenÈe[doÉf\gpÊg]fhqËh^girÌi_hjsÍj`iktÎkajluÏlbkmvÐm clnwÑn dmoxÒo enyÓp fqzÔq gpr{Õrhqs|Ösirt}×tjsu~ØuktvÙvluw€ÚwmvxÛxnwy‚ÜyoxƒÝzp{Þ{qz|ß|r{}à}s|~á~t}âu~€ã€väw€‚å‚xƒæƒy‚ç„ …Ž…!„††"…‡‡#†ˆ‘ˆ$‡‰’‰%ˆŠ“Š&‰‹”‹'ŠŒ•Œ(‹–)Œ—Ž*„˜+…Ž™,†‘š‘-‡’›’.ˆ‘“œ“/‰’””0Š“•ž•1‹”–Ÿ–2Œ•— —3–¡˜4Ž™¢™5˜š£š6™›¤›7‘šœ¥œ8’›¦9“œž§ž:”Ÿ¨Ÿ;•ž © <–Ÿ¡ª¡=— «¢>˜£¬£?™¢¤­¤@𣥮¥A›¤¦¯¦Bœ¥§°§C¦¨±¨Dž§©²©EŸ¨ª³ªF ©«´«G¡ªµ¬H¢­¶­I£¬®·®J¤­¯¸¯K¥®°¹°L¦¯±º±M§°²»²N¨±³¼³O©²´½´Pª³µ¾µQ«´¿¶R¬·À·S­¶¸Á¸T®·¹Â¹U¯¸ºÃºV°¹»Ä»W±º¼Å¼X²»½Æ½Y³¼¾Ç¾Z´½¿È¿[µ¾ÉÀ\¶ÁÊÁ]·ÀÂËÂ^¸ÁÃÌÃ_¹ÂÄÍÄ`ºÃÅÎÅa»ÄÆÏÆb¼ÅÇÐÇc½ÆÈÑÈd¾ÇÉÒÉe¿ÈÓÊfÀËÔËgÁÊÌÕÌhÂËÍÖÍiÃÌÎ×ÎjÄÍÏØÏkÅÎÐÙÐlÆÏÑÚÑmÇÐÒÛÒnÈÑÓÜÓoÉÒÝÔpÊÕÞÕqËÔÖßÖrÌÕ×à×sÍÖØáØtÎ×ÙâÙuÏØÚãÚvÐÙÛäÛwÑÚÜåÜxÒÛÝæÝyÓÜçÞzÔßß{ÕÞàà|Ößáá}×àââ~ØáããÙâää€ÚãååÛäææ‚ÜåççƒÝæÀ@€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿hypre-2.33.0/src/test/TEST_ij/data/poisson_10x10x10_np1/IJ.A.i4f8.00000.bin000066400000000000000000003101301477326011500246660ustar00rootroot00000000000000èèçç  !!!!!!""""""######$$$$$$%%%%%%&&&&&&'''''((((())))))******++++++,,,,,,------......//////0000001111122222333333444444555555666666777777888888999999::::::;;;;;<<<<<======>>>>>>??????@@@@@@AAAAAABBBBBBCCCCCCDDDDDDEEEEEFFFFFGGGGGGHHHHHHIIIIIIJJJJJJKKKKKKLLLLLLMMMMMMNNNNNNOOOOOPPPPPQQQQQQRRRRRRSSSSSSTTTTTTUUUUUUVVVVVVWWWWWWXXXXXXYYYYYZZZZ[[[[[\\\\\]]]]]^^^^^_____`````aaaaabbbbbccccdddddeeeeeeffffffgggggghhhhhhiiiiiijjjjjjkkkkkkllllllmmmmmnnnnnnooooooopppppppqqqqqqqrrrrrrrssssssstttttttuuuuuuuvvvvvvvwwwwwwxxxxxxyyyyyyyzzzzzzz{{{{{{{|||||||}}}}}}}~~~~~~~€€€€€€€‚‚‚‚‚‚ƒƒƒƒƒƒƒ„„„„„„„…………………†††††††‡‡‡‡‡‡‡ˆˆˆˆˆˆˆ‰‰‰‰‰‰‰ŠŠŠŠŠŠŠ‹‹‹‹‹‹ŒŒŒŒŒŒŽŽŽŽŽŽŽ‘‘‘‘‘‘‘’’’’’’’“““““““”””””””••••••––––––———————˜˜˜˜˜˜˜™™™™™™™ššššššš›››››››œœœœœœœžžžžžžžŸŸŸŸŸŸ      ¡¡¡¡¡¡¡¢¢¢¢¢¢¢£££££££¤¤¤¤¤¤¤¥¥¥¥¥¥¥¦¦¦¦¦¦¦§§§§§§§¨¨¨¨¨¨¨©©©©©©ªªªªªª«««««««¬¬¬¬¬¬¬­­­­­­­®®®®®®®¯¯¯¯¯¯¯°°°°°°°±±±±±±±²²²²²²²³³³³³³´´´´´´µµµµµµµ¶¶¶¶¶¶¶·······¸¸¸¸¸¸¸¹¹¹¹¹¹¹ººººººº»»»»»»»¼¼¼¼¼¼¼½½½½½½¾¾¾¾¾¿¿¿¿¿¿ÀÀÀÀÀÀÁÁÁÁÁÁÂÂÂÂÂÂÃÃÃÃÃÃÄÄÄÄÄÄÅÅÅÅÅÅÆÆÆÆÆÆÇÇÇÇÇÈÈÈÈÈÉÉÉÉÉÉÊÊÊÊÊÊËËËËËËÌÌÌÌÌÌÍÍÍÍÍÍÎÎÎÎÎÎÏÏÏÏÏÏÐÐÐÐÐÐÑÑÑÑÑÒÒÒÒÒÒÓÓÓÓÓÓÓÔÔÔÔÔÔÔÕÕÕÕÕÕÕÖÖÖÖÖÖÖ×××××××ØØØØØØØÙÙÙÙÙÙÙÚÚÚÚÚÚÚÛÛÛÛÛÛÜÜÜÜÜÜÝÝÝÝÝÝÝÞÞÞÞÞÞÞßßßßßßßàààààààáááááááâââââââãããããããäääääääååååååææææææçççççççèèèèèèèéééééééêêêêêêêëëëëëëëìììììììíííííííîîîîîîîïïïïïïððððððñññññññòòòòòòòóóóóóóóôôôôôôôõõõõõõõööööööö÷÷÷÷÷÷÷øøøøøøøùùùùùùúúúúúúûûûûûûûüüüüüüüýýýýýýýþþþþþþþÿÿÿÿÿÿÿ                                         !!!!!!"""""######$$$$$$%%%%%%&&&&&&''''''(((((())))))******+++++,,,,,------......//////00000011111122222233333344444455555666666777777788888889999999:::::::;;;;;;;<<<<<<<=======>>>>>>>??????@@@@@@AAAAAAABBBBBBBCCCCCCCDDDDDDDEEEEEEEFFFFFFFGGGGGGGHHHHHHHIIIIIIJJJJJJKKKKKKKLLLLLLLMMMMMMMNNNNNNNOOOOOOOPPPPPPPQQQQQQQRRRRRRRSSSSSSTTTTTTUUUUUUUVVVVVVVWWWWWWWXXXXXXXYYYYYYYZZZZZZZ[[[[[[[\\\\\\\]]]]]]^^^^^^_______```````aaaaaaabbbbbbbcccccccdddddddeeeeeeefffffffgggggghhhhhhiiiiiiijjjjjjjkkkkkkklllllllmmmmmmmnnnnnnnooooooopppppppqqqqqqrrrrrrssssssstttttttuuuuuuuvvvvvvvwwwwwwwxxxxxxxyyyyyyyzzzzzzz{{{{{{||||||}}}}}}}~~~~~~~€€€€€€€‚‚‚‚‚‚‚ƒƒƒƒƒƒƒ„„„„„„„………………†††††‡‡‡‡‡‡ˆˆˆˆˆˆ‰‰‰‰‰‰ŠŠŠŠŠŠ‹‹‹‹‹‹ŒŒŒŒŒŒŽŽŽŽŽŽ‘‘‘‘‘‘’’’’’’““““““””””””••••••––––––——————˜˜˜˜˜˜™™™™™šššššš›››››››œœœœœœœžžžžžžžŸŸŸŸŸŸŸ       ¡¡¡¡¡¡¡¢¢¢¢¢¢¢££££££¤¤¤¤¤¤¥¥¥¥¥¥¥¦¦¦¦¦¦¦§§§§§§§¨¨¨¨¨¨¨©©©©©©©ªªªªªªª«««««««¬¬¬¬¬¬¬­­­­­­®®®®®®¯¯¯¯¯¯¯°°°°°°°±±±±±±±²²²²²²²³³³³³³³´´´´´´´µµµµµµµ¶¶¶¶¶¶¶······¸¸¸¸¸¸¹¹¹¹¹¹¹ººººººº»»»»»»»¼¼¼¼¼¼¼½½½½½½½¾¾¾¾¾¾¾¿¿¿¿¿¿¿ÀÀÀÀÀÀÀÁÁÁÁÁÁÂÂÂÂÂÂÃÃÃÃÃÃÃÄÄÄÄÄÄÄÅÅÅÅÅÅÅÆÆÆÆÆÆÆÇÇÇÇÇÇÇÈÈÈÈÈÈÈÉÉÉÉÉÉÉÊÊÊÊÊÊÊËËËËËËÌÌÌÌÌÌÍÍÍÍÍÍÍÎÎÎÎÎÎÎÏÏÏÏÏÏÏÐÐÐÐÐÐÐÑÑÑÑÑÑÑÒÒÒÒÒÒÒÓÓÓÓÓÓÓÔÔÔÔÔÔÔÕÕÕÕÕÕÖÖÖÖÖÖ×××××××ØØØØØØØÙÙÙÙÙÙÙÚÚÚÚÚÚÚÛÛÛÛÛÛÛÜÜÜÜÜÜÜÝÝÝÝÝÝÝÞÞÞÞÞÞÞßßßßßßààààààáááááááâââââââãããããããäääääääåååååååæææææææçççççççèèèèèèèééééééêêêêêëëëëëëììììììííííííîîîîîîïïïïïïððððððññññññòòòòòòóóóóóôôôôôõõõõõõöööööö÷÷÷÷÷÷øøøøøøùùùùùùúúúúúúûûûûûûüüüüüüýýýýýþþþþþþÿÿÿÿÿÿÿ                                          !!!!!!!"""""""#######$$$$$$$%%%%%%&&&&&&'''''''((((((()))))))*******+++++++,,,,,,,-------.......//////00000011111112222222333333344444445555555666666677777778888888999999::::::;;;;;;;<<<<<<<=======>>>>>>>???????@@@@@@@AAAAAAABBBBBBBCCCCCCDDDDDDEEEEEEEFFFFFFFGGGGGGGHHHHHHHIIIIIIIJJJJJJJKKKKKKKLLLLLLLMMMMMMNNNNNOOOOOOPPPPPPQQQQQQRRRRRRSSSSSSTTTTTTUUUUUUVVVVVVWWWWWXXXXXYYYYYYZZZZZZ[[[[[[\\\\\\]]]]]]^^^^^^______``````aaaaabbbbbbcccccccdddddddeeeeeeefffffffggggggghhhhhhhiiiiiiijjjjjjjkkkkkkllllllmmmmmmmnnnnnnnooooooopppppppqqqqqqqrrrrrrrssssssstttttttuuuuuuvvvvvvwwwwwwwxxxxxxxyyyyyyyzzzzzzz{{{{{{{|||||||}}}}}}}~~~~~~~€€€€€€‚‚‚‚‚‚‚ƒƒƒƒƒƒƒ„„„„„„„…………………†††††††‡‡‡‡‡‡‡ˆˆˆˆˆˆˆ‰‰‰‰‰‰ŠŠŠŠŠŠ‹‹‹‹‹‹‹ŒŒŒŒŒŒŒŽŽŽŽŽŽŽ‘‘‘‘‘‘‘’’’’’’’““““““””””””•••••••–––––––———————˜˜˜˜˜˜˜™™™™™™™ššššššš›››››››œœœœœœœžžžžžžŸŸŸŸŸŸŸ       ¡¡¡¡¡¡¡¢¢¢¢¢¢¢£££££££¤¤¤¤¤¤¤¥¥¥¥¥¥¥¦¦¦¦¦¦¦§§§§§§¨¨¨¨¨¨©©©©©©©ªªªªªªª«««««««¬¬¬¬¬¬¬­­­­­­­®®®®®®®¯¯¯¯¯¯¯°°°°°°°±±±±±±²²²²²³³³³³³´´´´´´µµµµµµ¶¶¶¶¶¶······¸¸¸¸¸¸¹¹¹¹¹¹ºººººº»»»»»¼¼¼¼¼½½½½½½¾¾¾¾¾¾¿¿¿¿¿¿ÀÀÀÀÀÀÁÁÁÁÁÁÂÂÂÂÂÂÃÃÃÃÃÃÄÄÄÄÄÄÅÅÅÅÅÆÆÆÆÆÆÇÇÇÇÇÇÇÈÈÈÈÈÈÈÉÉÉÉÉÉÉÊÊÊÊÊÊÊËËËËËËËÌÌÌÌÌÌÌÍÍÍÍÍÍÍÎÎÎÎÎÎÎÏÏÏÏÏÏÐÐÐÐÐÐÑÑÑÑÑÑÑÒÒÒÒÒÒÒÓÓÓÓÓÓÓÔÔÔÔÔÔÔÕÕÕÕÕÕÕÖÖÖÖÖÖÖ×××××××ØØØØØØØÙÙÙÙÙÙÚÚÚÚÚÚÛÛÛÛÛÛÛÜÜÜÜÜÜÜÝÝÝÝÝÝÝÞÞÞÞÞÞÞßßßßßßßàààààààáááááááâââââââããããããääääääåååååååæææææææçççççççèèèèèèèéééééééêêêêêêêëëëëëëëìììììììííííííîîîîîîïïïïïïïðððððððñññññññòòòòòòòóóóóóóóôôôôôôôõõõõõõõööööööö÷÷÷÷÷÷øøøøøøùùùùùùùúúúúúúúûûûûûûûüüüüüüüýýýýýýýþþþþþþþÿÿÿÿÿÿÿ                                      !!!!!!""""""######$$$$$$%%%%%%&&&&&&''''''(((((()))))******+++++++,,,,,,,-------.......///////00000001111111222222233333344444455555556666666777777788888889999999:::::::;;;;;;;<<<<<<<======>>>>>>???????@@@@@@@AAAAAAABBBBBBBCCCCCCCDDDDDDDEEEEEEEFFFFFFFGGGGGGHHHHHHIIIIIIIJJJJJJJKKKKKKKLLLLLLLMMMMMMMNNNNNNNOOOOOOOPPPPPPPQQQQQQRRRRRRSSSSSSSTTTTTTTUUUUUUUVVVVVVVWWWWWWWXXXXXXXYYYYYYYZZZZZZZ[[[[[[\\\\\\]]]]]]]^^^^^^^_______```````aaaaaaabbbbbbbcccccccdddddddeeeeeeffffffggggggghhhhhhhiiiiiiijjjjjjjkkkkkkklllllllmmmmmmmnnnnnnnooooooppppppqqqqqqqrrrrrrrssssssstttttttuuuuuuuvvvvvvvwwwwwwwxxxxxxxyyyyyyzzzzz{{{{{{||||||}}}}}}~~~~~~€€€€€€‚‚‚‚‚‚ƒƒƒƒƒ„„„„……………†††††‡‡‡‡‡ˆˆˆˆˆ‰‰‰‰‰ŠŠŠŠŠ‹‹‹‹‹ŒŒŒŒŒŽŽŽŽŽ‘‘‘‘‘‘’’’’’’““““““””””””••••••––––––—————˜˜˜˜˜™™™™™™šššššš››››››œœœœœœžžžžžžŸŸŸŸŸŸ      ¡¡¡¡¡¢¢¢¢¢££££££¤¤¤¤¤¤¥¥¥¥¥¥¦¦¦¦¦¦§§§§§§¨¨¨¨¨¨©©©©©©ªªªªªª«««««¬¬¬¬¬­­­­­­®®®®®®¯¯¯¯¯¯°°°°°°±±±±±±²²²²²²³³³³³³´´´´´´µµµµµ¶¶¶¶¶······¸¸¸¸¸¸¹¹¹¹¹¹ºººººº»»»»»»¼¼¼¼¼¼½½½½½½¾¾¾¾¾¾¿¿¿¿¿ÀÀÀÀÀÁÁÁÁÁÁÂÂÂÂÂÂÃÃÃÃÃÃÄÄÄÄÄÄÅÅÅÅÅÅÆÆÆÆÆÆÇÇÇÇÇÇÈÈÈÈÈÈÉÉÉÉÉÊÊÊÊÊËËËËËËÌÌÌÌÌÌÍÍÍÍÍÍÎÎÎÎÎÎÏÏÏÏÏÏÐÐÐÐÐÐÑÑÑÑÑÑÒÒÒÒÒÒÓÓÓÓÓÔÔÔÔÔÕÕÕÕÕÕÖÖÖÖÖÖ××××××ØØØØØØÙÙÙÙÙÙÚÚÚÚÚÚÛÛÛÛÛÛÜÜÜÜÜÜÝÝÝÝÝÞÞÞÞßßßßßàààààáááááâââââãããããäääääåååååæææææçççç d e f ghijk l m n  o  p  q rstuv w x y  z !{"|#}$~%&€'(‚ )ƒ !*„! "+…"!#,†#"$-‡$#%.ˆ%$&/‰&%'0Š'&1‹()2Œ)(*3* )+4Ž+!*,5,"+-6-#,.7‘.$-/8’/%.09“0&/1:”1'0;•2(3<–3)24=—4*35>˜5+46?™6,57@š7-68A›8.79Bœ9/8:C:09;Dž;1:EŸ<2=F =3<>G¡>4=?H¢?5>@I£@6?AJ¤A7@BK¥B8ACL¦C9BDM§D:CEN¨E;DO©F<GPªG=FHQ«H>GIR¬I?HJS­J@IKT®KAJLU¯LBKMV°MCLNW±NDMOX²OENY³PFQZ´QGPR[µRHQS\¶SIRT]·TJSU^¸UKTV_¹VLUW`ºWMVXa»XNWYb¼YOXc½ZP[¾[QZ\¿\R[]À]S\^Á^T]_Â_U^`Ã`V_aÄaW`bÅbXacÆcYbÇdenÈedfoÉfegpÊgfhqËhgirÌihjsÍjiktÎkjluÏlkmvÐm lwÑn doxÒo enpyÓp foqzÔq gpr{Õrhqs|Ösirt}×tjsu~ØuktvÙvluw€ÚwmvÛxny‚ÜyoxzƒÝzpy{„Þ{qz|…ß|r{}†à}s|~‡á~t}ˆâu~€‰ã€vŠäw€‹å‚xƒŒæƒy‚„ç„ zƒ…Žè…!{„†é†"|…‡ê‡#}†ˆ‘ëˆ$~‡‰’ì‰%ˆŠ“íŠ&€‰‹”î‹'Š•ïŒ(‚–ð)ƒŒŽ—ñŽ*„˜ò+…Ž™ó,†‘šô‘-‡’›õ’.ˆ‘“œö“/‰’”÷”0Š“•žø•1‹”Ÿù–2Œ— ú—3–˜¡û˜4Ž—™¢ü™5˜š£ýš6™›¤þ›7‘šœ¥ÿœ8’›¦9“œž§ž:”Ÿ¨Ÿ;•ž© <–¡ª¡=— ¢«¢>˜¡£¬£?™¢¤­¤@𣥮¥A›¤¦¯ ¦Bœ¥§° §C¦¨± ¨Dž§©² ©EŸ¨³ ªF «´«G¡ª¬µ¬H¢«­¶­I£¬®·®J¤­¯¸¯K¥®°¹°L¦¯±º±M§°²»²N¨±³¼³O©²½´Pªµ¾µQ«´¶¿¶R¬µ·À·S­¶¸Á¸T®·¹Â¹U¯¸ºÃºV°¹»Ä»W±º¼Å¼X²»½Æ ½Y³¼Ç!¾Z´¿"¿[µ¾À#À\¶¿Á$Á]·ÀÂ%Â^¸ÁÃ&Ã_¹ÂÄ'Ä`ºÃÅ(Åa»ÄÆ)Æb¼ÅÇ*Çc½Æ+ÈdÉÒ,ÉeÈÊÓ-ÊfÉËÔ.ËgÊÌÕ/ÌhËÍÖ0ÍiÌÎ×1ÎjÍÏØ2ÏkÎÐÙ3ÐlÏÑÚ4ÑmÐÛ5ÒnÈÓÜ6ÓoÉÒÔÝ7ÔpÊÓÕÞ8ÕqËÔÖß9ÖrÌÕ×à:×sÍÖØá;ØtÎ×Ùâ<ÙuÏØÚã=ÚvÐÙÛä>ÛwÑÚå?ÜxÒÝæ@ÝyÓÜÞçAÞzÔÝßèBß{ÕÞàéCà|ÖßáêDá}×àâëEâ~ØáãìFãÙâäíGä€ÚãåîHåÛäïIæ‚ÜçðJçƒÝæèñKè„ÞçéòLé…ßèêóMê†àéëôNë‡áêìõOìˆâëíöPí‰ãìî÷QîŠäíïøRï‹åîùSðŒæñúTñçðòûUòŽèñóüVóéòôýWôêóõþXõ‘ëôöÿYö’ìõ÷Z÷“íöø[ø”î÷ù\ù•ïø]ú–ðû^û—ñúü_ü˜òûý`ý™óüþaþšôýÿbÿ›õþ cœöÿ d÷ ežø fŸù g úh¡ûi¢üj£ýk¤þ l ¥ÿ m ¦  n §  o ¨  p © qªr«s¬t­u®v¯ w° x± y²  z³ !{´"|µ#}¶$~·%¸&€¹'º(‚» )ƒ ¼!*„!½ +…"¾#†#¿"$‡$À#%ˆ%Á$&‰&Â%'Š'Ã&(‹(Ä')Œ)Å(**Æ )+Ž+Ç!*,È-6-É,.7‘.Ê-/8’/Ë.09“0Ì/1:”1Í02;•2Î13<–3Ï24=—4Ð35>˜5Ñ4?™6Ò,7@š7Ó-68A›8Ô.79Bœ9Õ/8:C:Ö09;Dž;×1:<EŸ<Ø2;=F =Ù3<>G¡>Ú4=?H¢?Û5>I£@Ü6AJ¤AÝ7@BK¥BÞ8ACL¦Cß9BDM§Dà:CEN¨Eá;DFO©Fâ<EGPªGã=FHQ«Hä>GIR¬Iå?HS­Jæ@KT®KçAJLU¯LèBKMV°MéCLNW±NêDMOX²OëENPY³PìFOQZ´QíGPR[µRîHQS\¶SïIR]·TðJU^¸UñKTV_¹VòLUW`ºWóMVXa»XôNWYb¼YõOXZc½ZöPY[d¾[÷QZ\e¿\øR[]fÀ]ùS\gÁ^úT_hÂ_ûU^`iÃ`üV_ajÄaýW`bkÅbþXaclÆcÿYbdmÇdZcenÈe[dfoÉf\egpÊg]fqËh^irÌi_hjsÍj`iktÎkajluÏlbkmvÐm clnwÑn dmoxÒo enpyÓp foqzÔq gp{Õrhs|Ösirt}×tjsu~ØuktvÙvluw€ÚwmvxÛxnwy‚ÜyoxzƒÝzpy{„Þ{qz…ß|r}†à}s|~‡á~t}ˆâu~€‰ã€vŠäw€‚‹å‚xƒŒæƒy‚„ç„ zƒ…Žè…!{„é†"|‡ê‡#}†ˆëˆ$~‡‰ì‰%ˆŠíŠ&€‰‹î‹'ŠŒïŒ(‚‹ð)ƒŒŽñŽ*„ò+…Žó,‘šô‘-’›õ’.‘“œö“/’”÷”0“•žø•1”–Ÿù–2•— ú—3–˜¡û˜4—™¢ü™5˜£ýš6›¤þ›7‘šœ¥ÿœ8’›¦9“œž§ž:”Ÿ¨Ÿ;•ž © <–Ÿ¡ª¡=— ¢«¢>˜¡£¬£?™¢­¤@𥮥A›¤¦¯ ¦Bœ¥§° §C¦¨± ¨Dž§©² ©EŸ¨ª³ ªF ©«´«G¡ª¬µ¬H¢«­¶­I£¬·®J¤¯¸¯K¥®°¹°L¦¯±º±M§°²»²N¨±³¼³O©²´½´Pª³µ¾µQ«´¶¿¶R¬µ·À·S­¶Á¸T®¹Â¹U¯¸ºÃºV°¹»Ä»W±º¼Å¼X²»½Æ ½Y³¼¾Ç!¾Z´½¿È"¿[µ¾ÀÉ#À\¶¿ÁÊ$Á]·ÀË%Â^¸ÃÌ&Ã_¹ÂÄÍ'Ä`ºÃÅÎ(Åa»ÄÆÏ)Æb¼ÅÇÐ*Çc½ÆÈÑ+Èd¾ÇÉÒ,Ée¿ÈÊÓ-ÊfÀÉËÔ.ËgÁÊÕ/ÌhÂÍÖ0ÍiÃÌÎ×1ÎjÄÍÏØ2ÏkÅÎÐÙ3ÐlÆÏÑÚ4ÑmÇÐÒÛ5ÒnÈÑÓÜ6ÓoÉÒÔÝ7ÔpÊÓÕÞ8ÕqËÔß9ÖrÌ×à:×sÍÖØá;ØtÎ×Ùâ<ÙuÏØÚã=ÚvÐÙÛä>ÛwÑÚÜå?ÜxÒÛÝæ@ÝyÓÜÞçAÞzÔÝßèBß{ÕÞéCà|ÖáêDá}×àâëEâ~ØáãìFãÙâäíGä€ÚãåîHåÛäæïIæ‚ÜåçðJçƒÝæèñKè„ÞçéòLé…ßèóMê†àëNë‡áêìOìˆâëíPí‰ãìîQîŠäíïRï‹åîðSðŒæïñTñçðòUòŽèñóVóéòWôõþXõ‘ôöÿYö’õ÷Z÷“öø[ø”÷ù\ù•øú]ú–ùû^û—úü_ü˜ûý`ý™üaþšôÿbÿ›õþ cœöÿ d÷ ežø fŸù g úh¡ûi¢üj£ýk¤þ l ¥ÿ m ¦  n §  o ¨  p © qª r«s¬t­u®v¯ w° x± y²  z³ !{´"|µ#}¶$~·%¸&€¹'º(‚» )ƒ ¼!*„!½ "+…"¾!#,†#¿"$-‡$À#%.ˆ%Á$/‰&Â'0Š'Ã&(1‹(Ä')2Œ)Å(*3*Æ )+4Ž+Ç!*,5,È"+-6-É#,.7‘.Ê$-/8’/Ë%.9“0Ì&1:”1Í'02;•2Î(13<–3Ï)24=—4Ð*35>˜5Ñ+46?™6Ò,57@š7Ó-68A›8Ô.79Bœ9Õ/8C:Ö0;Dž;×1:<EŸ<Ø2;=F =Ù3<>G¡>Ú4=?H¢?Û5>@I£@Ü6?AJ¤AÝ7@BK¥BÞ8ACL¦Cß9BM§Dà:EN¨Eá;DFO©Fâ<EGPªGã=FHQ«Hä>GIR¬Iå?HJS­Jæ@IKT®KçAJLU¯LèBKMV°MéCLW±NêDO²OëENP³PìFOQ´QíGPRµRîHQS¶SïIRT·TðJSU¸UñKTV¹VòLUWºWóMV»XôYb¼YõXZc½ZöY[d¾[÷Z\e¿\ø[]fÀ]ù\^gÁ^ú]_hÂ_û^`iÃ`ü_ajÄaý`kÅbþXclÆcÿYbdmÇdZcenÈe[dfoÉf\egpÊg]fhqËh^girÌi_hjsÍj`iktÎkajuÏlbmvÐm clnwÑn dmoxÒo enpyÓp foqzÔq gpr{Õrhqs|Ösirt}×tjsu~ØuktÙvlw€ÚwmvxÛxnwy‚ÜyoxzƒÝzpy{„Þ{qz|…ß|r{}†à}s|~‡á~t}ˆâu~‰ã€vŠäw€‚‹å‚xƒŒæƒy‚„ç„ zƒ…Žè…!{„†é†"|…‡ê‡#}†ˆ‘ëˆ$~‡‰’ì‰%ˆ“íŠ&€‹”î‹'ŠŒ•ïŒ(‚‹–ð)ƒŒŽ—ñŽ*„˜ò+…Ž™ó,†‘šô‘-‡’›õ’.ˆ‘“œö“/‰’÷”0Š•žø•1‹”–Ÿù–2Œ•— ú—3–˜¡û˜4Ž—™¢ü™5˜š£ýš6™›¤þ›7‘šœ¥ÿœ8’›¦9“œ§ž:”Ÿ¨Ÿ;•ž © <–Ÿ¡ª¡=— ¢«¢>˜¡£¬£?™¢¤­¤@𣥮¥A›¤¦¯ ¦Bœ¥§° §C¦± ¨Dž©² ©EŸ¨ª³ ªF ©«´«G¡ª¬µ¬H¢«­¶­I£¬®·®J¤­¯¸¯K¥®°¹°L¦¯±º±M§°»²N¨³³O©²´´Pª³µµQ«´¶¶R¬µ··S­¶¸¸T®·¹¹U¯¸ººV°¹»»W±º¼X½Æ ½Y¼¾Ç!¾Z½¿È"¿[¾ÀÉ#À\¿ÁÊ$Á]ÀÂË%Â^ÁÃÌ&Ã_ÂÄÍ'Ä`ÃÅÎ(ÅaÄÏ)Æb¼ÇÐ*Çc½ÆÈÑ+Èd¾ÇÉÒ,Ée¿ÈÊÓ-ÊfÀÉËÔ.ËgÁÊÌÕ/ÌhÂËÍÖ0ÍiÃÌÎ×1ÎjÄÍÏØ2ÏkÅÎÙ3ÐlÆÑÚ4ÑmÇÐÒÛ5ÒnÈÑÓÜ6ÓoÉÒÔÝ7ÔpÊÓÕÞ8ÕqËÔÖß9ÖrÌÕ×à:×sÍÖØá;ØtÎ×Ùâ<ÙuÏØã=ÚvÐÛä>ÛwÑÚÜå?ÜxÒÛÝæ@ÝyÓÜÞçAÞzÔÝßèBß{ÕÞàéCà|ÖßáêDá}×àâëEâ~ØáãìFãÙâíGä€ÚåîHåÛäæïIæ‚ÜåçðJçƒÝæèñKè„ÞçéòLé…ßèêóMê†àéëôNë‡áêìõOìˆâëíöPí‰ãì÷QîŠäïøRï‹åîðùSðŒæïñúTñçðòûUòŽèñóüVóéòôýWôêóõþXõ‘ëôöÿYö’ìõ÷Z÷“íö[ø”îù\ù•ïøú]ú–ðùû^û—ñúü_ü˜òûý`ý™óüþaþšôýÿbÿ›õþ cœöÿ d÷ ežø fŸù g úh¡ûi¢üj£ýk¤þ l ¥ÿ m ¦  n § o ¨ p © qª r«s¬t­u®v¯ w° x± y² z³ {´|µ}¶~·¸€¹º‚»ƒ ¼!*„!½ "+…"¾!#,†#¿"$-‡$À#%.ˆ%Á$&/‰&Â%'0Š'Ã&(1‹(Ä')2Œ)Å(3*Æ +4Ž+Ç!*,5,È"+-6-É#,.7‘.Ê$-/8’/Ë%.09“0Ì&/1:”1Í'02;•2Î(13<–3Ï)2=—4Ð*5>˜5Ñ+46?™6Ò,57@š7Ó-68A›8Ô.79Bœ9Õ/8:C:Ö09;Dž;×1:<EŸ<Ø2;=F =Ù3<G¡>Ú4?H¢?Û5>@I£@Ü6?AJ¤AÝ7@BK¥BÞ8ACL¦Cß9BDM§Dà:CEN¨Eá;DFO©Fâ<EGPªGã=FQ«Hä>IR¬Iå?HJS­Jæ@IKT®KçAJLU¯LèBKMV°MéCLNW±NêDMOX²OëENPY³PìFOQZ´QíGP[µRîHS\¶SïIRT]·TðJSU^¸UñKTV_¹VòLUW`ºWóMVXa»XôNWYb¼YõOXZc½ZöPY[d¾[÷QZe¿\øR]fÀ]ùS\^gÁ^úT]_hÂ_ûU^`iÃ`üV_ajÄaýW`bkÅbþXaclÆcÿYbdmÇdZcenÈe[doÉf\gpÊg]fhqËh^girÌi_hjsÍj`iktÎkajluÏlbkmvÐm clnwÑn dmoxÒo enyÓp fqzÔq gpr{Õrhqs|Ösirt}×tjsu~ØuktvÙvluw€ÚwmvxÛxnwy‚ÜyoxƒÝzp{Þ{qz|ß|r{}à}s|~á~t}âu~€ã€väw€‚å‚xƒæƒy‚ç„ …Ž…!„††"…‡‡#†ˆ‘ˆ$‡‰’‰%ˆŠ“Š&‰‹”‹'ŠŒ•Œ(‹–)Œ—Ž*„˜+…Ž™,†‘š‘-‡’›’.ˆ‘“œ“/‰’””0Š“•ž•1‹”–Ÿ–2Œ•— —3–¡˜4Ž™¢™5˜š£š6™›¤›7‘šœ¥œ8’›¦9“œž§ž:”Ÿ¨Ÿ;•ž © <–Ÿ¡ª¡=— «¢>˜£¬£?™¢¤­¤@𣥮¥A›¤¦¯¦Bœ¥§°§C¦¨±¨Dž§©²©EŸ¨ª³ªF ©«´«G¡ªµ¬H¢­¶­I£¬®·®J¤­¯¸¯K¥®°¹°L¦¯±º±M§°²»²N¨±³¼³O©²´½´Pª³µ¾µQ«´¿¶R¬·À·S­¶¸Á¸T®·¹Â¹U¯¸ºÃºV°¹»Ä»W±º¼Å¼X²»½Æ½Y³¼¾Ç¾Z´½¿È¿[µ¾ÉÀ\¶ÁÊÁ]·ÀÂËÂ^¸ÁÃÌÃ_¹ÂÄÍÄ`ºÃÅÎÅa»ÄÆÏÆb¼ÅÇÐÇc½ÆÈÑÈd¾ÇÉÒÉe¿ÈÓÊfÀËÔËgÁÊÌÕÌhÂËÍÖÍiÃÌÎ×ÎjÄÍÏØÏkÅÎÐÙÐlÆÏÑÚÑmÇÐÒÛÒnÈÑÓÜÓoÉÒÝÔpÊÕÞÕqËÔÖßÖrÌÕ×à×sÍÖØáØtÎ×ÙâÙuÏØÚãÚvÐÙÛäÛwÑÚÜåÜxÒÛÝæÝyÓÜçÞzÔßß{ÕÞàà|Ößáá}×àââ~ØáããÙâää€ÚãååÛäææ‚ÜåççƒÝæ@ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿hypre-2.33.0/src/test/TEST_ij/data/poisson_10x10x10_np1/IJ.A.i8f4.00000.bin000066400000000000000000003721301477326011500246760ustar00rootroot00000000000000èèçç  !!!!!!""""""######$$$$$$%%%%%%&&&&&&'''''((((())))))******++++++,,,,,,------......//////0000001111122222333333444444555555666666777777888888999999::::::;;;;;<<<<<======>>>>>>??????@@@@@@AAAAAABBBBBBCCCCCCDDDDDDEEEEEFFFFFGGGGGGHHHHHHIIIIIIJJJJJJKKKKKKLLLLLLMMMMMMNNNNNNOOOOOPPPPPQQQQQQRRRRRRSSSSSSTTTTTTUUUUUUVVVVVVWWWWWWXXXXXXYYYYYZZZZ[[[[[\\\\\]]]]]^^^^^_____`````aaaaabbbbbccccdddddeeeeeeffffffgggggghhhhhhiiiiiijjjjjjkkkkkkllllllmmmmmnnnnnnooooooopppppppqqqqqqqrrrrrrrssssssstttttttuuuuuuuvvvvvvvwwwwwwxxxxxxyyyyyyyzzzzzzz{{{{{{{|||||||}}}}}}}~~~~~~~€€€€€€€‚‚‚‚‚‚ƒƒƒƒƒƒƒ„„„„„„„…………………†††††††‡‡‡‡‡‡‡ˆˆˆˆˆˆˆ‰‰‰‰‰‰‰ŠŠŠŠŠŠŠ‹‹‹‹‹‹ŒŒŒŒŒŒŽŽŽŽŽŽŽ‘‘‘‘‘‘‘’’’’’’’“““““““”””””””••••••––––––———————˜˜˜˜˜˜˜™™™™™™™ššššššš›››››››œœœœœœœžžžžžžžŸŸŸŸŸŸ      ¡¡¡¡¡¡¡¢¢¢¢¢¢¢£££££££¤¤¤¤¤¤¤¥¥¥¥¥¥¥¦¦¦¦¦¦¦§§§§§§§¨¨¨¨¨¨¨©©©©©©ªªªªªª«««««««¬¬¬¬¬¬¬­­­­­­­®®®®®®®¯¯¯¯¯¯¯°°°°°°°±±±±±±±²²²²²²²³³³³³³´´´´´´µµµµµµµ¶¶¶¶¶¶¶·······¸¸¸¸¸¸¸¹¹¹¹¹¹¹ººººººº»»»»»»»¼¼¼¼¼¼¼½½½½½½¾¾¾¾¾¿¿¿¿¿¿ÀÀÀÀÀÀÁÁÁÁÁÁÂÂÂÂÂÂÃÃÃÃÃÃÄÄÄÄÄÄÅÅÅÅÅÅÆÆÆÆÆÆÇÇÇÇÇÈÈÈÈÈÉÉÉÉÉÉÊÊÊÊÊÊËËËËËËÌÌÌÌÌÌÍÍÍÍÍÍÎÎÎÎÎÎÏÏÏÏÏÏÐÐÐÐÐÐÑÑÑÑÑÒÒÒÒÒÒÓÓÓÓÓÓÓÔÔÔÔÔÔÔÕÕÕÕÕÕÕÖÖÖÖÖÖÖ×××××××ØØØØØØØÙÙÙÙÙÙÙÚÚÚÚÚÚÚÛÛÛÛÛÛÜÜÜÜÜÜÝÝÝÝÝÝÝÞÞÞÞÞÞÞßßßßßßßàààààààáááááááâââââââãããããããäääääääååååååææææææçççççççèèèèèèèéééééééêêêêêêêëëëëëëëìììììììíííííííîîîîîîîïïïïïïððððððñññññññòòòòòòòóóóóóóóôôôôôôôõõõõõõõööööööö÷÷÷÷÷÷÷øøøøøøøùùùùùùúúúúúúûûûûûûûüüüüüüüýýýýýýýþþþþþþþÿÿÿÿÿÿÿ                                         !!!!!!"""""######$$$$$$%%%%%%&&&&&&''''''(((((())))))******+++++,,,,,------......//////00000011111122222233333344444455555666666777777788888889999999:::::::;;;;;;;<<<<<<<=======>>>>>>>??????@@@@@@AAAAAAABBBBBBBCCCCCCCDDDDDDDEEEEEEEFFFFFFFGGGGGGGHHHHHHHIIIIIIJJJJJJKKKKKKKLLLLLLLMMMMMMMNNNNNNNOOOOOOOPPPPPPPQQQQQQQRRRRRRRSSSSSSTTTTTTUUUUUUUVVVVVVVWWWWWWWXXXXXXXYYYYYYYZZZZZZZ[[[[[[[\\\\\\\]]]]]]^^^^^^_______```````aaaaaaabbbbbbbcccccccdddddddeeeeeeefffffffgggggghhhhhhiiiiiiijjjjjjjkkkkkkklllllllmmmmmmmnnnnnnnooooooopppppppqqqqqqrrrrrrssssssstttttttuuuuuuuvvvvvvvwwwwwwwxxxxxxxyyyyyyyzzzzzzz{{{{{{||||||}}}}}}}~~~~~~~€€€€€€€‚‚‚‚‚‚‚ƒƒƒƒƒƒƒ„„„„„„„………………†††††‡‡‡‡‡‡ˆˆˆˆˆˆ‰‰‰‰‰‰ŠŠŠŠŠŠ‹‹‹‹‹‹ŒŒŒŒŒŒŽŽŽŽŽŽ‘‘‘‘‘‘’’’’’’““““““””””””••••••––––––——————˜˜˜˜˜˜™™™™™šššššš›››››››œœœœœœœžžžžžžžŸŸŸŸŸŸŸ       ¡¡¡¡¡¡¡¢¢¢¢¢¢¢££££££¤¤¤¤¤¤¥¥¥¥¥¥¥¦¦¦¦¦¦¦§§§§§§§¨¨¨¨¨¨¨©©©©©©©ªªªªªªª«««««««¬¬¬¬¬¬¬­­­­­­®®®®®®¯¯¯¯¯¯¯°°°°°°°±±±±±±±²²²²²²²³³³³³³³´´´´´´´µµµµµµµ¶¶¶¶¶¶¶······¸¸¸¸¸¸¹¹¹¹¹¹¹ººººººº»»»»»»»¼¼¼¼¼¼¼½½½½½½½¾¾¾¾¾¾¾¿¿¿¿¿¿¿ÀÀÀÀÀÀÀÁÁÁÁÁÁÂÂÂÂÂÂÃÃÃÃÃÃÃÄÄÄÄÄÄÄÅÅÅÅÅÅÅÆÆÆÆÆÆÆÇÇÇÇÇÇÇÈÈÈÈÈÈÈÉÉÉÉÉÉÉÊÊÊÊÊÊÊËËËËËËÌÌÌÌÌÌÍÍÍÍÍÍÍÎÎÎÎÎÎÎÏÏÏÏÏÏÏÐÐÐÐÐÐÐÑÑÑÑÑÑÑÒÒÒÒÒÒÒÓÓÓÓÓÓÓÔÔÔÔÔÔÔÕÕÕÕÕÕÖÖÖÖÖÖ×××××××ØØØØØØØÙÙÙÙÙÙÙÚÚÚÚÚÚÚÛÛÛÛÛÛÛÜÜÜÜÜÜÜÝÝÝÝÝÝÝÞÞÞÞÞÞÞßßßßßßààààààáááááááâââââââãããããããäääääääåååååååæææææææçççççççèèèèèèèééééééêêêêêëëëëëëììììììííííííîîîîîîïïïïïïððððððññññññòòòòòòóóóóóôôôôôõõõõõõöööööö÷÷÷÷÷÷øøøøøøùùùùùùúúúúúúûûûûûûüüüüüüýýýýýþþþþþþÿÿÿÿÿÿÿ                                          !!!!!!!"""""""#######$$$$$$$%%%%%%&&&&&&'''''''((((((()))))))*******+++++++,,,,,,,-------.......//////00000011111112222222333333344444445555555666666677777778888888999999::::::;;;;;;;<<<<<<<=======>>>>>>>???????@@@@@@@AAAAAAABBBBBBBCCCCCCDDDDDDEEEEEEEFFFFFFFGGGGGGGHHHHHHHIIIIIIIJJJJJJJKKKKKKKLLLLLLLMMMMMMNNNNNOOOOOOPPPPPPQQQQQQRRRRRRSSSSSSTTTTTTUUUUUUVVVVVVWWWWWXXXXXYYYYYYZZZZZZ[[[[[[\\\\\\]]]]]]^^^^^^______``````aaaaabbbbbbcccccccdddddddeeeeeeefffffffggggggghhhhhhhiiiiiiijjjjjjjkkkkkkllllllmmmmmmmnnnnnnnooooooopppppppqqqqqqqrrrrrrrssssssstttttttuuuuuuvvvvvvwwwwwwwxxxxxxxyyyyyyyzzzzzzz{{{{{{{|||||||}}}}}}}~~~~~~~€€€€€€‚‚‚‚‚‚‚ƒƒƒƒƒƒƒ„„„„„„„…………………†††††††‡‡‡‡‡‡‡ˆˆˆˆˆˆˆ‰‰‰‰‰‰ŠŠŠŠŠŠ‹‹‹‹‹‹‹ŒŒŒŒŒŒŒŽŽŽŽŽŽŽ‘‘‘‘‘‘‘’’’’’’’““““““””””””•••••••–––––––———————˜˜˜˜˜˜˜™™™™™™™ššššššš›››››››œœœœœœœžžžžžžŸŸŸŸŸŸŸ       ¡¡¡¡¡¡¡¢¢¢¢¢¢¢£££££££¤¤¤¤¤¤¤¥¥¥¥¥¥¥¦¦¦¦¦¦¦§§§§§§¨¨¨¨¨¨©©©©©©©ªªªªªªª«««««««¬¬¬¬¬¬¬­­­­­­­®®®®®®®¯¯¯¯¯¯¯°°°°°°°±±±±±±²²²²²³³³³³³´´´´´´µµµµµµ¶¶¶¶¶¶······¸¸¸¸¸¸¹¹¹¹¹¹ºººººº»»»»»¼¼¼¼¼½½½½½½¾¾¾¾¾¾¿¿¿¿¿¿ÀÀÀÀÀÀÁÁÁÁÁÁÂÂÂÂÂÂÃÃÃÃÃÃÄÄÄÄÄÄÅÅÅÅÅÆÆÆÆÆÆÇÇÇÇÇÇÇÈÈÈÈÈÈÈÉÉÉÉÉÉÉÊÊÊÊÊÊÊËËËËËËËÌÌÌÌÌÌÌÍÍÍÍÍÍÍÎÎÎÎÎÎÎÏÏÏÏÏÏÐÐÐÐÐÐÑÑÑÑÑÑÑÒÒÒÒÒÒÒÓÓÓÓÓÓÓÔÔÔÔÔÔÔÕÕÕÕÕÕÕÖÖÖÖÖÖÖ×××××××ØØØØØØØÙÙÙÙÙÙÚÚÚÚÚÚÛÛÛÛÛÛÛÜÜÜÜÜÜÜÝÝÝÝÝÝÝÞÞÞÞÞÞÞßßßßßßßàààààààáááááááâââââââããããããääääääåååååååæææææææçççççççèèèèèèèéééééééêêêêêêêëëëëëëëìììììììííííííîîîîîîïïïïïïïðððððððñññññññòòòòòòòóóóóóóóôôôôôôôõõõõõõõööööööö÷÷÷÷÷÷øøøøøøùùùùùùùúúúúúúúûûûûûûûüüüüüüüýýýýýýýþþþþþþþÿÿÿÿÿÿÿ                                      !!!!!!""""""######$$$$$$%%%%%%&&&&&&''''''(((((()))))******+++++++,,,,,,,-------.......///////00000001111111222222233333344444455555556666666777777788888889999999:::::::;;;;;;;<<<<<<<======>>>>>>???????@@@@@@@AAAAAAABBBBBBBCCCCCCCDDDDDDDEEEEEEEFFFFFFFGGGGGGHHHHHHIIIIIIIJJJJJJJKKKKKKKLLLLLLLMMMMMMMNNNNNNNOOOOOOOPPPPPPPQQQQQQRRRRRRSSSSSSSTTTTTTTUUUUUUUVVVVVVVWWWWWWWXXXXXXXYYYYYYYZZZZZZZ[[[[[[\\\\\\]]]]]]]^^^^^^^_______```````aaaaaaabbbbbbbcccccccdddddddeeeeeeffffffggggggghhhhhhhiiiiiiijjjjjjjkkkkkkklllllllmmmmmmmnnnnnnnooooooppppppqqqqqqqrrrrrrrssssssstttttttuuuuuuuvvvvvvvwwwwwwwxxxxxxxyyyyyyzzzzz{{{{{{||||||}}}}}}~~~~~~€€€€€€‚‚‚‚‚‚ƒƒƒƒƒ„„„„……………†††††‡‡‡‡‡ˆˆˆˆˆ‰‰‰‰‰ŠŠŠŠŠ‹‹‹‹‹ŒŒŒŒŒŽŽŽŽŽ‘‘‘‘‘‘’’’’’’““““““””””””••••••––––––—————˜˜˜˜˜™™™™™™šššššš››››››œœœœœœžžžžžžŸŸŸŸŸŸ      ¡¡¡¡¡¢¢¢¢¢££££££¤¤¤¤¤¤¥¥¥¥¥¥¦¦¦¦¦¦§§§§§§¨¨¨¨¨¨©©©©©©ªªªªªª«««««¬¬¬¬¬­­­­­­®®®®®®¯¯¯¯¯¯°°°°°°±±±±±±²²²²²²³³³³³³´´´´´´µµµµµ¶¶¶¶¶······¸¸¸¸¸¸¹¹¹¹¹¹ºººººº»»»»»»¼¼¼¼¼¼½½½½½½¾¾¾¾¾¾¿¿¿¿¿ÀÀÀÀÀÁÁÁÁÁÁÂÂÂÂÂÂÃÃÃÃÃÃÄÄÄÄÄÄÅÅÅÅÅÅÆÆÆÆÆÆÇÇÇÇÇÇÈÈÈÈÈÈÉÉÉÉÉÊÊÊÊÊËËËËËËÌÌÌÌÌÌÍÍÍÍÍÍÎÎÎÎÎÎÏÏÏÏÏÏÐÐÐÐÐÐÑÑÑÑÑÑÒÒÒÒÒÒÓÓÓÓÓÔÔÔÔÔÕÕÕÕÕÕÖÖÖÖÖÖ××××××ØØØØØØÙÙÙÙÙÙÚÚÚÚÚÚÛÛÛÛÛÛÜÜÜÜÜÜÝÝÝÝÝÞÞÞÞßßßßßàààààáááááâââââãããããäääääåååååæææææçççç d e f ghijk l m n  o  p  q rstuv w x y  z !{"|#}$~%&€'(‚ )ƒ !*„! "+…"!#,†#"$-‡$#%.ˆ%$&/‰&%'0Š'&1‹()2Œ)(*3* )+4Ž+!*,5,"+-6-#,.7‘.$-/8’/%.09“0&/1:”1'0;•2(3<–3)24=—4*35>˜5+46?™6,57@š7-68A›8.79Bœ9/8:C:09;Dž;1:EŸ<2=F =3<>G¡>4=?H¢?5>@I£@6?AJ¤A7@BK¥B8ACL¦C9BDM§D:CEN¨E;DO©F<GPªG=FHQ«H>GIR¬I?HJS­J@IKT®KAJLU¯LBKMV°MCLNW±NDMOX²OENY³PFQZ´QGPR[µRHQS\¶SIRT]·TJSU^¸UKTV_¹VLUW`ºWMVXa»XNWYb¼YOXc½ZP[¾[QZ\¿\R[]À]S\^Á^T]_Â_U^`Ã`V_aÄaW`bÅbXacÆcYbÇdenÈedfoÉfegpÊgfhqËhgirÌihjsÍjiktÎkjluÏlkmvÐm lwÑn doxÒo enpyÓp foqzÔq gpr{Õrhqs|Ösirt}×tjsu~ØuktvÙvluw€ÚwmvÛxny‚ÜyoxzƒÝzpy{„Þ{qz|…ß|r{}†à}s|~‡á~t}ˆâu~€‰ã€vŠäw€‹å‚xƒŒæƒy‚„ç„ zƒ…Žè…!{„†é†"|…‡ê‡#}†ˆ‘ëˆ$~‡‰’ì‰%ˆŠ“íŠ&€‰‹”î‹'Š•ïŒ(‚–ð)ƒŒŽ—ñŽ*„˜ò+…Ž™ó,†‘šô‘-‡’›õ’.ˆ‘“œö“/‰’”÷”0Š“•žø•1‹”Ÿù–2Œ— ú—3–˜¡û˜4Ž—™¢ü™5˜š£ýš6™›¤þ›7‘šœ¥ÿœ8’›¦9“œž§ž:”Ÿ¨Ÿ;•ž© <–¡ª¡=— ¢«¢>˜¡£¬£?™¢¤­¤@𣥮¥A›¤¦¯ ¦Bœ¥§° §C¦¨± ¨Dž§©² ©EŸ¨³ ªF «´«G¡ª¬µ¬H¢«­¶­I£¬®·®J¤­¯¸¯K¥®°¹°L¦¯±º±M§°²»²N¨±³¼³O©²½´Pªµ¾µQ«´¶¿¶R¬µ·À·S­¶¸Á¸T®·¹Â¹U¯¸ºÃºV°¹»Ä»W±º¼Å¼X²»½Æ ½Y³¼Ç!¾Z´¿"¿[µ¾À#À\¶¿Á$Á]·ÀÂ%Â^¸ÁÃ&Ã_¹ÂÄ'Ä`ºÃÅ(Åa»ÄÆ)Æb¼ÅÇ*Çc½Æ+ÈdÉÒ,ÉeÈÊÓ-ÊfÉËÔ.ËgÊÌÕ/ÌhËÍÖ0ÍiÌÎ×1ÎjÍÏØ2ÏkÎÐÙ3ÐlÏÑÚ4ÑmÐÛ5ÒnÈÓÜ6ÓoÉÒÔÝ7ÔpÊÓÕÞ8ÕqËÔÖß9ÖrÌÕ×à:×sÍÖØá;ØtÎ×Ùâ<ÙuÏØÚã=ÚvÐÙÛä>ÛwÑÚå?ÜxÒÝæ@ÝyÓÜÞçAÞzÔÝßèBß{ÕÞàéCà|ÖßáêDá}×àâëEâ~ØáãìFãÙâäíGä€ÚãåîHåÛäïIæ‚ÜçðJçƒÝæèñKè„ÞçéòLé…ßèêóMê†àéëôNë‡áêìõOìˆâëíöPí‰ãìî÷QîŠäíïøRï‹åîùSðŒæñúTñçðòûUòŽèñóüVóéòôýWôêóõþXõ‘ëôöÿYö’ìõ÷Z÷“íöø[ø”î÷ù\ù•ïø]ú–ðû^û—ñúü_ü˜òûý`ý™óüþaþšôýÿbÿ›õþ cœöÿ d÷ ežø fŸù g úh¡ûi¢üj£ýk¤þ l ¥ÿ m ¦  n §  o ¨  p © qªr«s¬t­u®v¯ w° x± y²  z³ !{´"|µ#}¶$~·%¸&€¹'º(‚» )ƒ ¼!*„!½ +…"¾#†#¿"$‡$À#%ˆ%Á$&‰&Â%'Š'Ã&(‹(Ä')Œ)Å(**Æ )+Ž+Ç!*,È-6-É,.7‘.Ê-/8’/Ë.09“0Ì/1:”1Í02;•2Î13<–3Ï24=—4Ð35>˜5Ñ4?™6Ò,7@š7Ó-68A›8Ô.79Bœ9Õ/8:C:Ö09;Dž;×1:<EŸ<Ø2;=F =Ù3<>G¡>Ú4=?H¢?Û5>I£@Ü6AJ¤AÝ7@BK¥BÞ8ACL¦Cß9BDM§Dà:CEN¨Eá;DFO©Fâ<EGPªGã=FHQ«Hä>GIR¬Iå?HS­Jæ@KT®KçAJLU¯LèBKMV°MéCLNW±NêDMOX²OëENPY³PìFOQZ´QíGPR[µRîHQS\¶SïIR]·TðJU^¸UñKTV_¹VòLUW`ºWóMVXa»XôNWYb¼YõOXZc½ZöPY[d¾[÷QZ\e¿\øR[]fÀ]ùS\gÁ^úT_hÂ_ûU^`iÃ`üV_ajÄaýW`bkÅbþXaclÆcÿYbdmÇdZcenÈe[dfoÉf\egpÊg]fqËh^irÌi_hjsÍj`iktÎkajluÏlbkmvÐm clnwÑn dmoxÒo enpyÓp foqzÔq gp{Õrhs|Ösirt}×tjsu~ØuktvÙvluw€ÚwmvxÛxnwy‚ÜyoxzƒÝzpy{„Þ{qz…ß|r}†à}s|~‡á~t}ˆâu~€‰ã€vŠäw€‚‹å‚xƒŒæƒy‚„ç„ zƒ…Žè…!{„é†"|‡ê‡#}†ˆëˆ$~‡‰ì‰%ˆŠíŠ&€‰‹î‹'ŠŒïŒ(‚‹ð)ƒŒŽñŽ*„ò+…Žó,‘šô‘-’›õ’.‘“œö“/’”÷”0“•žø•1”–Ÿù–2•— ú—3–˜¡û˜4—™¢ü™5˜£ýš6›¤þ›7‘šœ¥ÿœ8’›¦9“œž§ž:”Ÿ¨Ÿ;•ž © <–Ÿ¡ª¡=— ¢«¢>˜¡£¬£?™¢­¤@𥮥A›¤¦¯ ¦Bœ¥§° §C¦¨± ¨Dž§©² ©EŸ¨ª³ ªF ©«´«G¡ª¬µ¬H¢«­¶­I£¬·®J¤¯¸¯K¥®°¹°L¦¯±º±M§°²»²N¨±³¼³O©²´½´Pª³µ¾µQ«´¶¿¶R¬µ·À·S­¶Á¸T®¹Â¹U¯¸ºÃºV°¹»Ä»W±º¼Å¼X²»½Æ ½Y³¼¾Ç!¾Z´½¿È"¿[µ¾ÀÉ#À\¶¿ÁÊ$Á]·ÀË%Â^¸ÃÌ&Ã_¹ÂÄÍ'Ä`ºÃÅÎ(Åa»ÄÆÏ)Æb¼ÅÇÐ*Çc½ÆÈÑ+Èd¾ÇÉÒ,Ée¿ÈÊÓ-ÊfÀÉËÔ.ËgÁÊÕ/ÌhÂÍÖ0ÍiÃÌÎ×1ÎjÄÍÏØ2ÏkÅÎÐÙ3ÐlÆÏÑÚ4ÑmÇÐÒÛ5ÒnÈÑÓÜ6ÓoÉÒÔÝ7ÔpÊÓÕÞ8ÕqËÔß9ÖrÌ×à:×sÍÖØá;ØtÎ×Ùâ<ÙuÏØÚã=ÚvÐÙÛä>ÛwÑÚÜå?ÜxÒÛÝæ@ÝyÓÜÞçAÞzÔÝßèBß{ÕÞéCà|ÖáêDá}×àâëEâ~ØáãìFãÙâäíGä€ÚãåîHåÛäæïIæ‚ÜåçðJçƒÝæèñKè„ÞçéòLé…ßèóMê†àëNë‡áêìOìˆâëíPí‰ãìîQîŠäíïRï‹åîðSðŒæïñTñçðòUòŽèñóVóéòWôõþXõ‘ôöÿYö’õ÷Z÷“öø[ø”÷ù\ù•øú]ú–ùû^û—úü_ü˜ûý`ý™üaþšôÿbÿ›õþ cœöÿ d÷ ežø fŸù g úh¡ûi¢üj£ýk¤þ l ¥ÿ m ¦  n §  o ¨  p © qª r«s¬t­u®v¯ w° x± y²  z³ !{´"|µ#}¶$~·%¸&€¹'º(‚» )ƒ ¼!*„!½ "+…"¾!#,†#¿"$-‡$À#%.ˆ%Á$/‰&Â'0Š'Ã&(1‹(Ä')2Œ)Å(*3*Æ )+4Ž+Ç!*,5,È"+-6-É#,.7‘.Ê$-/8’/Ë%.9“0Ì&1:”1Í'02;•2Î(13<–3Ï)24=—4Ð*35>˜5Ñ+46?™6Ò,57@š7Ó-68A›8Ô.79Bœ9Õ/8C:Ö0;Dž;×1:<EŸ<Ø2;=F =Ù3<>G¡>Ú4=?H¢?Û5>@I£@Ü6?AJ¤AÝ7@BK¥BÞ8ACL¦Cß9BM§Dà:EN¨Eá;DFO©Fâ<EGPªGã=FHQ«Hä>GIR¬Iå?HJS­Jæ@IKT®KçAJLU¯LèBKMV°MéCLW±NêDO²OëENP³PìFOQ´QíGPRµRîHQS¶SïIRT·TðJSU¸UñKTV¹VòLUWºWóMV»XôYb¼YõXZc½ZöY[d¾[÷Z\e¿\ø[]fÀ]ù\^gÁ^ú]_hÂ_û^`iÃ`ü_ajÄaý`kÅbþXclÆcÿYbdmÇdZcenÈe[dfoÉf\egpÊg]fhqËh^girÌi_hjsÍj`iktÎkajuÏlbmvÐm clnwÑn dmoxÒo enpyÓp foqzÔq gpr{Õrhqs|Ösirt}×tjsu~ØuktÙvlw€ÚwmvxÛxnwy‚ÜyoxzƒÝzpy{„Þ{qz|…ß|r{}†à}s|~‡á~t}ˆâu~‰ã€vŠäw€‚‹å‚xƒŒæƒy‚„ç„ zƒ…Žè…!{„†é†"|…‡ê‡#}†ˆ‘ëˆ$~‡‰’ì‰%ˆ“íŠ&€‹”î‹'ŠŒ•ïŒ(‚‹–ð)ƒŒŽ—ñŽ*„˜ò+…Ž™ó,†‘šô‘-‡’›õ’.ˆ‘“œö“/‰’÷”0Š•žø•1‹”–Ÿù–2Œ•— ú—3–˜¡û˜4Ž—™¢ü™5˜š£ýš6™›¤þ›7‘šœ¥ÿœ8’›¦9“œ§ž:”Ÿ¨Ÿ;•ž © <–Ÿ¡ª¡=— ¢«¢>˜¡£¬£?™¢¤­¤@𣥮¥A›¤¦¯ ¦Bœ¥§° §C¦± ¨Dž©² ©EŸ¨ª³ ªF ©«´«G¡ª¬µ¬H¢«­¶­I£¬®·®J¤­¯¸¯K¥®°¹°L¦¯±º±M§°»²N¨³³O©²´´Pª³µµQ«´¶¶R¬µ··S­¶¸¸T®·¹¹U¯¸ººV°¹»»W±º¼X½Æ ½Y¼¾Ç!¾Z½¿È"¿[¾ÀÉ#À\¿ÁÊ$Á]ÀÂË%Â^ÁÃÌ&Ã_ÂÄÍ'Ä`ÃÅÎ(ÅaÄÏ)Æb¼ÇÐ*Çc½ÆÈÑ+Èd¾ÇÉÒ,Ée¿ÈÊÓ-ÊfÀÉËÔ.ËgÁÊÌÕ/ÌhÂËÍÖ0ÍiÃÌÎ×1ÎjÄÍÏØ2ÏkÅÎÙ3ÐlÆÑÚ4ÑmÇÐÒÛ5ÒnÈÑÓÜ6ÓoÉÒÔÝ7ÔpÊÓÕÞ8ÕqËÔÖß9ÖrÌÕ×à:×sÍÖØá;ØtÎ×Ùâ<ÙuÏØã=ÚvÐÛä>ÛwÑÚÜå?ÜxÒÛÝæ@ÝyÓÜÞçAÞzÔÝßèBß{ÕÞàéCà|ÖßáêDá}×àâëEâ~ØáãìFãÙâíGä€ÚåîHåÛäæïIæ‚ÜåçðJçƒÝæèñKè„ÞçéòLé…ßèêóMê†àéëôNë‡áêìõOìˆâëíöPí‰ãì÷QîŠäïøRï‹åîðùSðŒæïñúTñçðòûUòŽèñóüVóéòôýWôêóõþXõ‘ëôöÿYö’ìõ÷Z÷“íö[ø”îù\ù•ïøú]ú–ðùû^û—ñúü_ü˜òûý`ý™óüþaþšôýÿbÿ›õþ cœöÿ d÷ ežø fŸù g úh¡ûi¢üj£ýk¤þ l ¥ÿ m ¦  n § o ¨ p © qª r«s¬t­u®v¯ w° x± y² z³ {´|µ}¶~·¸€¹º‚»ƒ ¼!*„!½ "+…"¾!#,†#¿"$-‡$À#%.ˆ%Á$&/‰&Â%'0Š'Ã&(1‹(Ä')2Œ)Å(3*Æ +4Ž+Ç!*,5,È"+-6-É#,.7‘.Ê$-/8’/Ë%.09“0Ì&/1:”1Í'02;•2Î(13<–3Ï)2=—4Ð*5>˜5Ñ+46?™6Ò,57@š7Ó-68A›8Ô.79Bœ9Õ/8:C:Ö09;Dž;×1:<EŸ<Ø2;=F =Ù3<G¡>Ú4?H¢?Û5>@I£@Ü6?AJ¤AÝ7@BK¥BÞ8ACL¦Cß9BDM§Dà:CEN¨Eá;DFO©Fâ<EGPªGã=FQ«Hä>IR¬Iå?HJS­Jæ@IKT®KçAJLU¯LèBKMV°MéCLNW±NêDMOX²OëENPY³PìFOQZ´QíGP[µRîHS\¶SïIRT]·TðJSU^¸UñKTV_¹VòLUW`ºWóMVXa»XôNWYb¼YõOXZc½ZöPY[d¾[÷QZe¿\øR]fÀ]ùS\^gÁ^úT]_hÂ_ûU^`iÃ`üV_ajÄaýW`bkÅbþXaclÆcÿYbdmÇdZcenÈe[doÉf\gpÊg]fhqËh^girÌi_hjsÍj`iktÎkajluÏlbkmvÐm clnwÑn dmoxÒo enyÓp fqzÔq gpr{Õrhqs|Ösirt}×tjsu~ØuktvÙvluw€ÚwmvxÛxnwy‚ÜyoxƒÝzp{Þ{qz|ß|r{}à}s|~á~t}âu~€ã€väw€‚å‚xƒæƒy‚ç„ …Ž…!„††"…‡‡#†ˆ‘ˆ$‡‰’‰%ˆŠ“Š&‰‹”‹'ŠŒ•Œ(‹–)Œ—Ž*„˜+…Ž™,†‘š‘-‡’›’.ˆ‘“œ“/‰’””0Š“•ž•1‹”–Ÿ–2Œ•— —3–¡˜4Ž™¢™5˜š£š6™›¤›7‘šœ¥œ8’›¦9“œž§ž:”Ÿ¨Ÿ;•ž © <–Ÿ¡ª¡=— «¢>˜£¬£?™¢¤­¤@𣥮¥A›¤¦¯¦Bœ¥§°§C¦¨±¨Dž§©²©EŸ¨ª³ªF ©«´«G¡ªµ¬H¢­¶­I£¬®·®J¤­¯¸¯K¥®°¹°L¦¯±º±M§°²»²N¨±³¼³O©²´½´Pª³µ¾µQ«´¿¶R¬·À·S­¶¸Á¸T®·¹Â¹U¯¸ºÃºV°¹»Ä»W±º¼Å¼X²»½Æ½Y³¼¾Ç¾Z´½¿È¿[µ¾ÉÀ\¶ÁÊÁ]·ÀÂËÂ^¸ÁÃÌÃ_¹ÂÄÍÄ`ºÃÅÎÅa»ÄÆÏÆb¼ÅÇÐÇc½ÆÈÑÈd¾ÇÉÒÉe¿ÈÓÊfÀËÔËgÁÊÌÕÌhÂËÍÖÍiÃÌÎ×ÎjÄÍÏØÏkÅÎÐÙÐlÆÏÑÚÑmÇÐÒÛÒnÈÑÓÜÓoÉÒÝÔpÊÕÞÕqËÔÖßÖrÌÕ×à×sÍÖØáØtÎ×ÙâÙuÏØÚãÚvÐÙÛäÛwÑÚÜåÜxÒÛÝæÝyÓÜçÞzÔßß{ÕÞàà|Ößáá}×àââ~ØáããÙâää€ÚãååÛäææ‚ÜåççƒÝæÀ@€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿hypre-2.33.0/src/test/TEST_ij/data/poisson_10x10x10_np1/IJ.A.i8f8.00000.bin000066400000000000000000004541301477326011500247030ustar00rootroot00000000000000èèçç  !!!!!!""""""######$$$$$$%%%%%%&&&&&&'''''((((())))))******++++++,,,,,,------......//////0000001111122222333333444444555555666666777777888888999999::::::;;;;;<<<<<======>>>>>>??????@@@@@@AAAAAABBBBBBCCCCCCDDDDDDEEEEEFFFFFGGGGGGHHHHHHIIIIIIJJJJJJKKKKKKLLLLLLMMMMMMNNNNNNOOOOOPPPPPQQQQQQRRRRRRSSSSSSTTTTTTUUUUUUVVVVVVWWWWWWXXXXXXYYYYYZZZZ[[[[[\\\\\]]]]]^^^^^_____`````aaaaabbbbbccccdddddeeeeeeffffffgggggghhhhhhiiiiiijjjjjjkkkkkkllllllmmmmmnnnnnnooooooopppppppqqqqqqqrrrrrrrssssssstttttttuuuuuuuvvvvvvvwwwwwwxxxxxxyyyyyyyzzzzzzz{{{{{{{|||||||}}}}}}}~~~~~~~€€€€€€€‚‚‚‚‚‚ƒƒƒƒƒƒƒ„„„„„„„…………………†††††††‡‡‡‡‡‡‡ˆˆˆˆˆˆˆ‰‰‰‰‰‰‰ŠŠŠŠŠŠŠ‹‹‹‹‹‹ŒŒŒŒŒŒŽŽŽŽŽŽŽ‘‘‘‘‘‘‘’’’’’’’“““““““”””””””••••••––––––———————˜˜˜˜˜˜˜™™™™™™™ššššššš›››››››œœœœœœœžžžžžžžŸŸŸŸŸŸ      ¡¡¡¡¡¡¡¢¢¢¢¢¢¢£££££££¤¤¤¤¤¤¤¥¥¥¥¥¥¥¦¦¦¦¦¦¦§§§§§§§¨¨¨¨¨¨¨©©©©©©ªªªªªª«««««««¬¬¬¬¬¬¬­­­­­­­®®®®®®®¯¯¯¯¯¯¯°°°°°°°±±±±±±±²²²²²²²³³³³³³´´´´´´µµµµµµµ¶¶¶¶¶¶¶·······¸¸¸¸¸¸¸¹¹¹¹¹¹¹ººººººº»»»»»»»¼¼¼¼¼¼¼½½½½½½¾¾¾¾¾¿¿¿¿¿¿ÀÀÀÀÀÀÁÁÁÁÁÁÂÂÂÂÂÂÃÃÃÃÃÃÄÄÄÄÄÄÅÅÅÅÅÅÆÆÆÆÆÆÇÇÇÇÇÈÈÈÈÈÉÉÉÉÉÉÊÊÊÊÊÊËËËËËËÌÌÌÌÌÌÍÍÍÍÍÍÎÎÎÎÎÎÏÏÏÏÏÏÐÐÐÐÐÐÑÑÑÑÑÒÒÒÒÒÒÓÓÓÓÓÓÓÔÔÔÔÔÔÔÕÕÕÕÕÕÕÖÖÖÖÖÖÖ×××××××ØØØØØØØÙÙÙÙÙÙÙÚÚÚÚÚÚÚÛÛÛÛÛÛÜÜÜÜÜÜÝÝÝÝÝÝÝÞÞÞÞÞÞÞßßßßßßßàààààààáááááááâââââââãããããããäääääääååååååææææææçççççççèèèèèèèéééééééêêêêêêêëëëëëëëìììììììíííííííîîîîîîîïïïïïïððððððñññññññòòòòòòòóóóóóóóôôôôôôôõõõõõõõööööööö÷÷÷÷÷÷÷øøøøøøøùùùùùùúúúúúúûûûûûûûüüüüüüüýýýýýýýþþþþþþþÿÿÿÿÿÿÿ                                         !!!!!!"""""######$$$$$$%%%%%%&&&&&&''''''(((((())))))******+++++,,,,,------......//////00000011111122222233333344444455555666666777777788888889999999:::::::;;;;;;;<<<<<<<=======>>>>>>>??????@@@@@@AAAAAAABBBBBBBCCCCCCCDDDDDDDEEEEEEEFFFFFFFGGGGGGGHHHHHHHIIIIIIJJJJJJKKKKKKKLLLLLLLMMMMMMMNNNNNNNOOOOOOOPPPPPPPQQQQQQQRRRRRRRSSSSSSTTTTTTUUUUUUUVVVVVVVWWWWWWWXXXXXXXYYYYYYYZZZZZZZ[[[[[[[\\\\\\\]]]]]]^^^^^^_______```````aaaaaaabbbbbbbcccccccdddddddeeeeeeefffffffgggggghhhhhhiiiiiiijjjjjjjkkkkkkklllllllmmmmmmmnnnnnnnooooooopppppppqqqqqqrrrrrrssssssstttttttuuuuuuuvvvvvvvwwwwwwwxxxxxxxyyyyyyyzzzzzzz{{{{{{||||||}}}}}}}~~~~~~~€€€€€€€‚‚‚‚‚‚‚ƒƒƒƒƒƒƒ„„„„„„„………………†††††‡‡‡‡‡‡ˆˆˆˆˆˆ‰‰‰‰‰‰ŠŠŠŠŠŠ‹‹‹‹‹‹ŒŒŒŒŒŒŽŽŽŽŽŽ‘‘‘‘‘‘’’’’’’““““““””””””••••••––––––——————˜˜˜˜˜˜™™™™™šššššš›››››››œœœœœœœžžžžžžžŸŸŸŸŸŸŸ       ¡¡¡¡¡¡¡¢¢¢¢¢¢¢££££££¤¤¤¤¤¤¥¥¥¥¥¥¥¦¦¦¦¦¦¦§§§§§§§¨¨¨¨¨¨¨©©©©©©©ªªªªªªª«««««««¬¬¬¬¬¬¬­­­­­­®®®®®®¯¯¯¯¯¯¯°°°°°°°±±±±±±±²²²²²²²³³³³³³³´´´´´´´µµµµµµµ¶¶¶¶¶¶¶······¸¸¸¸¸¸¹¹¹¹¹¹¹ººººººº»»»»»»»¼¼¼¼¼¼¼½½½½½½½¾¾¾¾¾¾¾¿¿¿¿¿¿¿ÀÀÀÀÀÀÀÁÁÁÁÁÁÂÂÂÂÂÂÃÃÃÃÃÃÃÄÄÄÄÄÄÄÅÅÅÅÅÅÅÆÆÆÆÆÆÆÇÇÇÇÇÇÇÈÈÈÈÈÈÈÉÉÉÉÉÉÉÊÊÊÊÊÊÊËËËËËËÌÌÌÌÌÌÍÍÍÍÍÍÍÎÎÎÎÎÎÎÏÏÏÏÏÏÏÐÐÐÐÐÐÐÑÑÑÑÑÑÑÒÒÒÒÒÒÒÓÓÓÓÓÓÓÔÔÔÔÔÔÔÕÕÕÕÕÕÖÖÖÖÖÖ×××××××ØØØØØØØÙÙÙÙÙÙÙÚÚÚÚÚÚÚÛÛÛÛÛÛÛÜÜÜÜÜÜÜÝÝÝÝÝÝÝÞÞÞÞÞÞÞßßßßßßààààààáááááááâââââââãããããããäääääääåååååååæææææææçççççççèèèèèèèééééééêêêêêëëëëëëììììììííííííîîîîîîïïïïïïððððððññññññòòòòòòóóóóóôôôôôõõõõõõöööööö÷÷÷÷÷÷øøøøøøùùùùùùúúúúúúûûûûûûüüüüüüýýýýýþþþþþþÿÿÿÿÿÿÿ                                          !!!!!!!"""""""#######$$$$$$$%%%%%%&&&&&&'''''''((((((()))))))*******+++++++,,,,,,,-------.......//////00000011111112222222333333344444445555555666666677777778888888999999::::::;;;;;;;<<<<<<<=======>>>>>>>???????@@@@@@@AAAAAAABBBBBBBCCCCCCDDDDDDEEEEEEEFFFFFFFGGGGGGGHHHHHHHIIIIIIIJJJJJJJKKKKKKKLLLLLLLMMMMMMNNNNNOOOOOOPPPPPPQQQQQQRRRRRRSSSSSSTTTTTTUUUUUUVVVVVVWWWWWXXXXXYYYYYYZZZZZZ[[[[[[\\\\\\]]]]]]^^^^^^______``````aaaaabbbbbbcccccccdddddddeeeeeeefffffffggggggghhhhhhhiiiiiiijjjjjjjkkkkkkllllllmmmmmmmnnnnnnnooooooopppppppqqqqqqqrrrrrrrssssssstttttttuuuuuuvvvvvvwwwwwwwxxxxxxxyyyyyyyzzzzzzz{{{{{{{|||||||}}}}}}}~~~~~~~€€€€€€‚‚‚‚‚‚‚ƒƒƒƒƒƒƒ„„„„„„„…………………†††††††‡‡‡‡‡‡‡ˆˆˆˆˆˆˆ‰‰‰‰‰‰ŠŠŠŠŠŠ‹‹‹‹‹‹‹ŒŒŒŒŒŒŒŽŽŽŽŽŽŽ‘‘‘‘‘‘‘’’’’’’’““““““””””””•••••••–––––––———————˜˜˜˜˜˜˜™™™™™™™ššššššš›››››››œœœœœœœžžžžžžŸŸŸŸŸŸŸ       ¡¡¡¡¡¡¡¢¢¢¢¢¢¢£££££££¤¤¤¤¤¤¤¥¥¥¥¥¥¥¦¦¦¦¦¦¦§§§§§§¨¨¨¨¨¨©©©©©©©ªªªªªªª«««««««¬¬¬¬¬¬¬­­­­­­­®®®®®®®¯¯¯¯¯¯¯°°°°°°°±±±±±±²²²²²³³³³³³´´´´´´µµµµµµ¶¶¶¶¶¶······¸¸¸¸¸¸¹¹¹¹¹¹ºººººº»»»»»¼¼¼¼¼½½½½½½¾¾¾¾¾¾¿¿¿¿¿¿ÀÀÀÀÀÀÁÁÁÁÁÁÂÂÂÂÂÂÃÃÃÃÃÃÄÄÄÄÄÄÅÅÅÅÅÆÆÆÆÆÆÇÇÇÇÇÇÇÈÈÈÈÈÈÈÉÉÉÉÉÉÉÊÊÊÊÊÊÊËËËËËËËÌÌÌÌÌÌÌÍÍÍÍÍÍÍÎÎÎÎÎÎÎÏÏÏÏÏÏÐÐÐÐÐÐÑÑÑÑÑÑÑÒÒÒÒÒÒÒÓÓÓÓÓÓÓÔÔÔÔÔÔÔÕÕÕÕÕÕÕÖÖÖÖÖÖÖ×××××××ØØØØØØØÙÙÙÙÙÙÚÚÚÚÚÚÛÛÛÛÛÛÛÜÜÜÜÜÜÜÝÝÝÝÝÝÝÞÞÞÞÞÞÞßßßßßßßàààààààáááááááâââââââããããããääääääåååååååæææææææçççççççèèèèèèèéééééééêêêêêêêëëëëëëëìììììììííííííîîîîîîïïïïïïïðððððððñññññññòòòòòòòóóóóóóóôôôôôôôõõõõõõõööööööö÷÷÷÷÷÷øøøøøøùùùùùùùúúúúúúúûûûûûûûüüüüüüüýýýýýýýþþþþþþþÿÿÿÿÿÿÿ                                      !!!!!!""""""######$$$$$$%%%%%%&&&&&&''''''(((((()))))******+++++++,,,,,,,-------.......///////00000001111111222222233333344444455555556666666777777788888889999999:::::::;;;;;;;<<<<<<<======>>>>>>???????@@@@@@@AAAAAAABBBBBBBCCCCCCCDDDDDDDEEEEEEEFFFFFFFGGGGGGHHHHHHIIIIIIIJJJJJJJKKKKKKKLLLLLLLMMMMMMMNNNNNNNOOOOOOOPPPPPPPQQQQQQRRRRRRSSSSSSSTTTTTTTUUUUUUUVVVVVVVWWWWWWWXXXXXXXYYYYYYYZZZZZZZ[[[[[[\\\\\\]]]]]]]^^^^^^^_______```````aaaaaaabbbbbbbcccccccdddddddeeeeeeffffffggggggghhhhhhhiiiiiiijjjjjjjkkkkkkklllllllmmmmmmmnnnnnnnooooooppppppqqqqqqqrrrrrrrssssssstttttttuuuuuuuvvvvvvvwwwwwwwxxxxxxxyyyyyyzzzzz{{{{{{||||||}}}}}}~~~~~~€€€€€€‚‚‚‚‚‚ƒƒƒƒƒ„„„„……………†††††‡‡‡‡‡ˆˆˆˆˆ‰‰‰‰‰ŠŠŠŠŠ‹‹‹‹‹ŒŒŒŒŒŽŽŽŽŽ‘‘‘‘‘‘’’’’’’““““““””””””••••••––––––—————˜˜˜˜˜™™™™™™šššššš››››››œœœœœœžžžžžžŸŸŸŸŸŸ      ¡¡¡¡¡¢¢¢¢¢££££££¤¤¤¤¤¤¥¥¥¥¥¥¦¦¦¦¦¦§§§§§§¨¨¨¨¨¨©©©©©©ªªªªªª«««««¬¬¬¬¬­­­­­­®®®®®®¯¯¯¯¯¯°°°°°°±±±±±±²²²²²²³³³³³³´´´´´´µµµµµ¶¶¶¶¶······¸¸¸¸¸¸¹¹¹¹¹¹ºººººº»»»»»»¼¼¼¼¼¼½½½½½½¾¾¾¾¾¾¿¿¿¿¿ÀÀÀÀÀÁÁÁÁÁÁÂÂÂÂÂÂÃÃÃÃÃÃÄÄÄÄÄÄÅÅÅÅÅÅÆÆÆÆÆÆÇÇÇÇÇÇÈÈÈÈÈÈÉÉÉÉÉÊÊÊÊÊËËËËËËÌÌÌÌÌÌÍÍÍÍÍÍÎÎÎÎÎÎÏÏÏÏÏÏÐÐÐÐÐÐÑÑÑÑÑÑÒÒÒÒÒÒÓÓÓÓÓÔÔÔÔÔÕÕÕÕÕÕÖÖÖÖÖÖ××××××ØØØØØØÙÙÙÙÙÙÚÚÚÚÚÚÛÛÛÛÛÛÜÜÜÜÜÜÝÝÝÝÝÞÞÞÞßßßßßàààààáááááâââââãããããäääääåååååæææææçççç d e f ghijk l m n  o  p  q rstuv w x y  z !{"|#}$~%&€'(‚ )ƒ !*„! "+…"!#,†#"$-‡$#%.ˆ%$&/‰&%'0Š'&1‹()2Œ)(*3* )+4Ž+!*,5,"+-6-#,.7‘.$-/8’/%.09“0&/1:”1'0;•2(3<–3)24=—4*35>˜5+46?™6,57@š7-68A›8.79Bœ9/8:C:09;Dž;1:EŸ<2=F =3<>G¡>4=?H¢?5>@I£@6?AJ¤A7@BK¥B8ACL¦C9BDM§D:CEN¨E;DO©F<GPªG=FHQ«H>GIR¬I?HJS­J@IKT®KAJLU¯LBKMV°MCLNW±NDMOX²OENY³PFQZ´QGPR[µRHQS\¶SIRT]·TJSU^¸UKTV_¹VLUW`ºWMVXa»XNWYb¼YOXc½ZP[¾[QZ\¿\R[]À]S\^Á^T]_Â_U^`Ã`V_aÄaW`bÅbXacÆcYbÇdenÈedfoÉfegpÊgfhqËhgirÌihjsÍjiktÎkjluÏlkmvÐm lwÑn doxÒo enpyÓp foqzÔq gpr{Õrhqs|Ösirt}×tjsu~ØuktvÙvluw€ÚwmvÛxny‚ÜyoxzƒÝzpy{„Þ{qz|…ß|r{}†à}s|~‡á~t}ˆâu~€‰ã€vŠäw€‹å‚xƒŒæƒy‚„ç„ zƒ…Žè…!{„†é†"|…‡ê‡#}†ˆ‘ëˆ$~‡‰’ì‰%ˆŠ“íŠ&€‰‹”î‹'Š•ïŒ(‚–ð)ƒŒŽ—ñŽ*„˜ò+…Ž™ó,†‘šô‘-‡’›õ’.ˆ‘“œö“/‰’”÷”0Š“•žø•1‹”Ÿù–2Œ— ú—3–˜¡û˜4Ž—™¢ü™5˜š£ýš6™›¤þ›7‘šœ¥ÿœ8’›¦9“œž§ž:”Ÿ¨Ÿ;•ž© <–¡ª¡=— ¢«¢>˜¡£¬£?™¢¤­¤@𣥮¥A›¤¦¯ ¦Bœ¥§° §C¦¨± ¨Dž§©² ©EŸ¨³ ªF «´«G¡ª¬µ¬H¢«­¶­I£¬®·®J¤­¯¸¯K¥®°¹°L¦¯±º±M§°²»²N¨±³¼³O©²½´Pªµ¾µQ«´¶¿¶R¬µ·À·S­¶¸Á¸T®·¹Â¹U¯¸ºÃºV°¹»Ä»W±º¼Å¼X²»½Æ ½Y³¼Ç!¾Z´¿"¿[µ¾À#À\¶¿Á$Á]·ÀÂ%Â^¸ÁÃ&Ã_¹ÂÄ'Ä`ºÃÅ(Åa»ÄÆ)Æb¼ÅÇ*Çc½Æ+ÈdÉÒ,ÉeÈÊÓ-ÊfÉËÔ.ËgÊÌÕ/ÌhËÍÖ0ÍiÌÎ×1ÎjÍÏØ2ÏkÎÐÙ3ÐlÏÑÚ4ÑmÐÛ5ÒnÈÓÜ6ÓoÉÒÔÝ7ÔpÊÓÕÞ8ÕqËÔÖß9ÖrÌÕ×à:×sÍÖØá;ØtÎ×Ùâ<ÙuÏØÚã=ÚvÐÙÛä>ÛwÑÚå?ÜxÒÝæ@ÝyÓÜÞçAÞzÔÝßèBß{ÕÞàéCà|ÖßáêDá}×àâëEâ~ØáãìFãÙâäíGä€ÚãåîHåÛäïIæ‚ÜçðJçƒÝæèñKè„ÞçéòLé…ßèêóMê†àéëôNë‡áêìõOìˆâëíöPí‰ãìî÷QîŠäíïøRï‹åîùSðŒæñúTñçðòûUòŽèñóüVóéòôýWôêóõþXõ‘ëôöÿYö’ìõ÷Z÷“íöø[ø”î÷ù\ù•ïø]ú–ðû^û—ñúü_ü˜òûý`ý™óüþaþšôýÿbÿ›õþ cœöÿ d÷ ežø fŸù g úh¡ûi¢üj£ýk¤þ l ¥ÿ m ¦  n §  o ¨  p © qªr«s¬t­u®v¯ w° x± y²  z³ !{´"|µ#}¶$~·%¸&€¹'º(‚» )ƒ ¼!*„!½ +…"¾#†#¿"$‡$À#%ˆ%Á$&‰&Â%'Š'Ã&(‹(Ä')Œ)Å(**Æ )+Ž+Ç!*,È-6-É,.7‘.Ê-/8’/Ë.09“0Ì/1:”1Í02;•2Î13<–3Ï24=—4Ð35>˜5Ñ4?™6Ò,7@š7Ó-68A›8Ô.79Bœ9Õ/8:C:Ö09;Dž;×1:<EŸ<Ø2;=F =Ù3<>G¡>Ú4=?H¢?Û5>I£@Ü6AJ¤AÝ7@BK¥BÞ8ACL¦Cß9BDM§Dà:CEN¨Eá;DFO©Fâ<EGPªGã=FHQ«Hä>GIR¬Iå?HS­Jæ@KT®KçAJLU¯LèBKMV°MéCLNW±NêDMOX²OëENPY³PìFOQZ´QíGPR[µRîHQS\¶SïIR]·TðJU^¸UñKTV_¹VòLUW`ºWóMVXa»XôNWYb¼YõOXZc½ZöPY[d¾[÷QZ\e¿\øR[]fÀ]ùS\gÁ^úT_hÂ_ûU^`iÃ`üV_ajÄaýW`bkÅbþXaclÆcÿYbdmÇdZcenÈe[dfoÉf\egpÊg]fqËh^irÌi_hjsÍj`iktÎkajluÏlbkmvÐm clnwÑn dmoxÒo enpyÓp foqzÔq gp{Õrhs|Ösirt}×tjsu~ØuktvÙvluw€ÚwmvxÛxnwy‚ÜyoxzƒÝzpy{„Þ{qz…ß|r}†à}s|~‡á~t}ˆâu~€‰ã€vŠäw€‚‹å‚xƒŒæƒy‚„ç„ zƒ…Žè…!{„é†"|‡ê‡#}†ˆëˆ$~‡‰ì‰%ˆŠíŠ&€‰‹î‹'ŠŒïŒ(‚‹ð)ƒŒŽñŽ*„ò+…Žó,‘šô‘-’›õ’.‘“œö“/’”÷”0“•žø•1”–Ÿù–2•— ú—3–˜¡û˜4—™¢ü™5˜£ýš6›¤þ›7‘šœ¥ÿœ8’›¦9“œž§ž:”Ÿ¨Ÿ;•ž © <–Ÿ¡ª¡=— ¢«¢>˜¡£¬£?™¢­¤@𥮥A›¤¦¯ ¦Bœ¥§° §C¦¨± ¨Dž§©² ©EŸ¨ª³ ªF ©«´«G¡ª¬µ¬H¢«­¶­I£¬·®J¤¯¸¯K¥®°¹°L¦¯±º±M§°²»²N¨±³¼³O©²´½´Pª³µ¾µQ«´¶¿¶R¬µ·À·S­¶Á¸T®¹Â¹U¯¸ºÃºV°¹»Ä»W±º¼Å¼X²»½Æ ½Y³¼¾Ç!¾Z´½¿È"¿[µ¾ÀÉ#À\¶¿ÁÊ$Á]·ÀË%Â^¸ÃÌ&Ã_¹ÂÄÍ'Ä`ºÃÅÎ(Åa»ÄÆÏ)Æb¼ÅÇÐ*Çc½ÆÈÑ+Èd¾ÇÉÒ,Ée¿ÈÊÓ-ÊfÀÉËÔ.ËgÁÊÕ/ÌhÂÍÖ0ÍiÃÌÎ×1ÎjÄÍÏØ2ÏkÅÎÐÙ3ÐlÆÏÑÚ4ÑmÇÐÒÛ5ÒnÈÑÓÜ6ÓoÉÒÔÝ7ÔpÊÓÕÞ8ÕqËÔß9ÖrÌ×à:×sÍÖØá;ØtÎ×Ùâ<ÙuÏØÚã=ÚvÐÙÛä>ÛwÑÚÜå?ÜxÒÛÝæ@ÝyÓÜÞçAÞzÔÝßèBß{ÕÞéCà|ÖáêDá}×àâëEâ~ØáãìFãÙâäíGä€ÚãåîHåÛäæïIæ‚ÜåçðJçƒÝæèñKè„ÞçéòLé…ßèóMê†àëNë‡áêìOìˆâëíPí‰ãìîQîŠäíïRï‹åîðSðŒæïñTñçðòUòŽèñóVóéòWôõþXõ‘ôöÿYö’õ÷Z÷“öø[ø”÷ù\ù•øú]ú–ùû^û—úü_ü˜ûý`ý™üaþšôÿbÿ›õþ cœöÿ d÷ ežø fŸù g úh¡ûi¢üj£ýk¤þ l ¥ÿ m ¦  n §  o ¨  p © qª r«s¬t­u®v¯ w° x± y²  z³ !{´"|µ#}¶$~·%¸&€¹'º(‚» )ƒ ¼!*„!½ "+…"¾!#,†#¿"$-‡$À#%.ˆ%Á$/‰&Â'0Š'Ã&(1‹(Ä')2Œ)Å(*3*Æ )+4Ž+Ç!*,5,È"+-6-É#,.7‘.Ê$-/8’/Ë%.9“0Ì&1:”1Í'02;•2Î(13<–3Ï)24=—4Ð*35>˜5Ñ+46?™6Ò,57@š7Ó-68A›8Ô.79Bœ9Õ/8C:Ö0;Dž;×1:<EŸ<Ø2;=F =Ù3<>G¡>Ú4=?H¢?Û5>@I£@Ü6?AJ¤AÝ7@BK¥BÞ8ACL¦Cß9BM§Dà:EN¨Eá;DFO©Fâ<EGPªGã=FHQ«Hä>GIR¬Iå?HJS­Jæ@IKT®KçAJLU¯LèBKMV°MéCLW±NêDO²OëENP³PìFOQ´QíGPRµRîHQS¶SïIRT·TðJSU¸UñKTV¹VòLUWºWóMV»XôYb¼YõXZc½ZöY[d¾[÷Z\e¿\ø[]fÀ]ù\^gÁ^ú]_hÂ_û^`iÃ`ü_ajÄaý`kÅbþXclÆcÿYbdmÇdZcenÈe[dfoÉf\egpÊg]fhqËh^girÌi_hjsÍj`iktÎkajuÏlbmvÐm clnwÑn dmoxÒo enpyÓp foqzÔq gpr{Õrhqs|Ösirt}×tjsu~ØuktÙvlw€ÚwmvxÛxnwy‚ÜyoxzƒÝzpy{„Þ{qz|…ß|r{}†à}s|~‡á~t}ˆâu~‰ã€vŠäw€‚‹å‚xƒŒæƒy‚„ç„ zƒ…Žè…!{„†é†"|…‡ê‡#}†ˆ‘ëˆ$~‡‰’ì‰%ˆ“íŠ&€‹”î‹'ŠŒ•ïŒ(‚‹–ð)ƒŒŽ—ñŽ*„˜ò+…Ž™ó,†‘šô‘-‡’›õ’.ˆ‘“œö“/‰’÷”0Š•žø•1‹”–Ÿù–2Œ•— ú—3–˜¡û˜4Ž—™¢ü™5˜š£ýš6™›¤þ›7‘šœ¥ÿœ8’›¦9“œ§ž:”Ÿ¨Ÿ;•ž © <–Ÿ¡ª¡=— ¢«¢>˜¡£¬£?™¢¤­¤@𣥮¥A›¤¦¯ ¦Bœ¥§° §C¦± ¨Dž©² ©EŸ¨ª³ ªF ©«´«G¡ª¬µ¬H¢«­¶­I£¬®·®J¤­¯¸¯K¥®°¹°L¦¯±º±M§°»²N¨³³O©²´´Pª³µµQ«´¶¶R¬µ··S­¶¸¸T®·¹¹U¯¸ººV°¹»»W±º¼X½Æ ½Y¼¾Ç!¾Z½¿È"¿[¾ÀÉ#À\¿ÁÊ$Á]ÀÂË%Â^ÁÃÌ&Ã_ÂÄÍ'Ä`ÃÅÎ(ÅaÄÏ)Æb¼ÇÐ*Çc½ÆÈÑ+Èd¾ÇÉÒ,Ée¿ÈÊÓ-ÊfÀÉËÔ.ËgÁÊÌÕ/ÌhÂËÍÖ0ÍiÃÌÎ×1ÎjÄÍÏØ2ÏkÅÎÙ3ÐlÆÑÚ4ÑmÇÐÒÛ5ÒnÈÑÓÜ6ÓoÉÒÔÝ7ÔpÊÓÕÞ8ÕqËÔÖß9ÖrÌÕ×à:×sÍÖØá;ØtÎ×Ùâ<ÙuÏØã=ÚvÐÛä>ÛwÑÚÜå?ÜxÒÛÝæ@ÝyÓÜÞçAÞzÔÝßèBß{ÕÞàéCà|ÖßáêDá}×àâëEâ~ØáãìFãÙâíGä€ÚåîHåÛäæïIæ‚ÜåçðJçƒÝæèñKè„ÞçéòLé…ßèêóMê†àéëôNë‡áêìõOìˆâëíöPí‰ãì÷QîŠäïøRï‹åîðùSðŒæïñúTñçðòûUòŽèñóüVóéòôýWôêóõþXõ‘ëôöÿYö’ìõ÷Z÷“íö[ø”îù\ù•ïøú]ú–ðùû^û—ñúü_ü˜òûý`ý™óüþaþšôýÿbÿ›õþ cœöÿ d÷ ežø fŸù g úh¡ûi¢üj£ýk¤þ l ¥ÿ m ¦  n § o ¨ p © qª r«s¬t­u®v¯ w° x± y² z³ {´|µ}¶~·¸€¹º‚»ƒ ¼!*„!½ "+…"¾!#,†#¿"$-‡$À#%.ˆ%Á$&/‰&Â%'0Š'Ã&(1‹(Ä')2Œ)Å(3*Æ +4Ž+Ç!*,5,È"+-6-É#,.7‘.Ê$-/8’/Ë%.09“0Ì&/1:”1Í'02;•2Î(13<–3Ï)2=—4Ð*5>˜5Ñ+46?™6Ò,57@š7Ó-68A›8Ô.79Bœ9Õ/8:C:Ö09;Dž;×1:<EŸ<Ø2;=F =Ù3<G¡>Ú4?H¢?Û5>@I£@Ü6?AJ¤AÝ7@BK¥BÞ8ACL¦Cß9BDM§Dà:CEN¨Eá;DFO©Fâ<EGPªGã=FQ«Hä>IR¬Iå?HJS­Jæ@IKT®KçAJLU¯LèBKMV°MéCLNW±NêDMOX²OëENPY³PìFOQZ´QíGP[µRîHS\¶SïIRT]·TðJSU^¸UñKTV_¹VòLUW`ºWóMVXa»XôNWYb¼YõOXZc½ZöPY[d¾[÷QZe¿\øR]fÀ]ùS\^gÁ^úT]_hÂ_ûU^`iÃ`üV_ajÄaýW`bkÅbþXaclÆcÿYbdmÇdZcenÈe[doÉf\gpÊg]fhqËh^girÌi_hjsÍj`iktÎkajluÏlbkmvÐm clnwÑn dmoxÒo enyÓp fqzÔq gpr{Õrhqs|Ösirt}×tjsu~ØuktvÙvluw€ÚwmvxÛxnwy‚ÜyoxƒÝzp{Þ{qz|ß|r{}à}s|~á~t}âu~€ã€väw€‚å‚xƒæƒy‚ç„ …Ž…!„††"…‡‡#†ˆ‘ˆ$‡‰’‰%ˆŠ“Š&‰‹”‹'ŠŒ•Œ(‹–)Œ—Ž*„˜+…Ž™,†‘š‘-‡’›’.ˆ‘“œ“/‰’””0Š“•ž•1‹”–Ÿ–2Œ•— —3–¡˜4Ž™¢™5˜š£š6™›¤›7‘šœ¥œ8’›¦9“œž§ž:”Ÿ¨Ÿ;•ž © <–Ÿ¡ª¡=— «¢>˜£¬£?™¢¤­¤@𣥮¥A›¤¦¯¦Bœ¥§°§C¦¨±¨Dž§©²©EŸ¨ª³ªF ©«´«G¡ªµ¬H¢­¶­I£¬®·®J¤­¯¸¯K¥®°¹°L¦¯±º±M§°²»²N¨±³¼³O©²´½´Pª³µ¾µQ«´¿¶R¬·À·S­¶¸Á¸T®·¹Â¹U¯¸ºÃºV°¹»Ä»W±º¼Å¼X²»½Æ½Y³¼¾Ç¾Z´½¿È¿[µ¾ÉÀ\¶ÁÊÁ]·ÀÂËÂ^¸ÁÃÌÃ_¹ÂÄÍÄ`ºÃÅÎÅa»ÄÆÏÆb¼ÅÇÐÇc½ÆÈÑÈd¾ÇÉÒÉe¿ÈÓÊfÀËÔËgÁÊÌÕÌhÂËÍÖÍiÃÌÎ×ÎjÄÍÏØÏkÅÎÐÙÐlÆÏÑÚÑmÇÐÒÛÒnÈÑÓÜÓoÉÒÝÔpÊÕÞÕqËÔÖßÖrÌÕ×à×sÍÖØáØtÎ×ÙâÙuÏØÚãÚvÐÙÛäÛwÑÚÜåÜxÒÛÝæÝyÓÜçÞzÔßß{ÕÞàà|Ößáá}×àââ~ØáããÙâää€ÚãååÛäææ‚ÜåççƒÝæ@ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿hypre-2.33.0/src/test/TEST_ij/data/poisson_10x10x10_np1/IJ.b.i4f4.00000.bin000066400000000000000000000077401477326011500247350ustar00rootroot00000000000000èèè€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?hypre-2.33.0/src/test/TEST_ij/data/poisson_10x10x10_np1/IJ.b.i4f8.00000.bin000066400000000000000000000176001477326011500247350ustar00rootroot00000000000000èèèð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?hypre-2.33.0/src/test/TEST_ij/data/poisson_10x10x10_np1/IJ.b.i8f4.00000.bin000066400000000000000000000077401477326011500247410ustar00rootroot00000000000000èèè€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?hypre-2.33.0/src/test/TEST_ij/data/poisson_10x10x10_np1/IJ.b.i8f8.00000.bin000066400000000000000000000176001477326011500247410ustar00rootroot00000000000000èèèð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?hypre-2.33.0/src/test/TEST_ij/data/poisson_10x10x10_np1/IJ.x0.i4f4.00000.bin000066400000000000000000000077401477326011500250430ustar00rootroot00000000000000èèèhypre-2.33.0/src/test/TEST_ij/data/poisson_10x10x10_np1/IJ.x0.i4f8.00000.bin000066400000000000000000000176001477326011500250430ustar00rootroot00000000000000èèèhypre-2.33.0/src/test/TEST_ij/data/poisson_10x10x10_np1/IJ.x0.i8f4.00000.bin000066400000000000000000000077401477326011500250470ustar00rootroot00000000000000èèèhypre-2.33.0/src/test/TEST_ij/data/poisson_10x10x10_np1/IJ.x0.i8f8.00000.bin000066400000000000000000000176001477326011500250470ustar00rootroot00000000000000èèèhypre-2.33.0/src/test/TEST_ij/data/poisson_10x10x10_np4/000077500000000000000000000000001477326011500223115ustar00rootroot00000000000000hypre-2.33.0/src/test/TEST_ij/data/poisson_10x10x10_np4/IJ.A.i4f4.00000.bin000066400000000000000000000455301477326011500246760ustar00rootroot00000000000000èè@ùù  !!!!!!!"""""""######$$$$$$$%%%%%%%&&&&&&&'''''''(((((()))))))*******+++++++,,,,,,,------.......///////000000011111112222233333344444455555566666677777788888889999999:::::::;;;;;;;<<<<<<=======>>>>>>>???????@@@@@@@AAAAAABBBBBBBCCCCCCCDDDDDDDEEEEEEEFFFFFFGGGGGGGHHHHHHHIIIIIIIJJJJJJJKKKKKLLLLLLMMMMMMNNNNNNOOOOOOPPPPPPQQQQQQQRRRRRRRSSSSSSSTTTTTTTUUUUUUVVVVVVVWWWWWWWXXXXXXXYYYYYYYZZZZZZ[[[[[[[\\\\\\\]]]]]]]^^^^^^^______```````aaaaaaabbbbbbbcccccccdddddeeeeeeffffffgggggghhhhhhiiiiiijjjjjjjkkkkkkklllllllmmmmmmmnnnnnnooooooopppppppqqqqqqqrrrrrrrsssssstttttttuuuuuuuvvvvvvvwwwwwwwxxxxxxyyyyyyyzzzzzzz{{{{{{{|||||||}}}}}~~~~~~€€€€€€‚‚‚‚‚‚ƒƒƒƒƒƒƒ„„„„„„„…………………†††††††‡‡‡‡‡‡ˆˆˆˆˆˆˆ‰‰‰‰‰‰‰ŠŠŠŠŠŠŠ‹‹‹‹‹‹‹ŒŒŒŒŒŒŽŽŽŽŽŽŽ‘‘‘‘‘‘’’’’’’’“““““““”””””””•••••••–––––——————˜˜˜˜˜˜™™™™™™šššššš››››››œœœœœœœžžžžžžžŸŸŸŸŸŸŸ      ¡¡¡¡¡¡¡¢¢¢¢¢¢¢£££££££¤¤¤¤¤¤¤¥¥¥¥¥¥¦¦¦¦¦¦¦§§§§§§§¨¨¨¨¨¨¨©©©©©©©ªªªªªª«««««««¬¬¬¬¬¬¬­­­­­­­®®®®®®®¯¯¯¯¯°°°°°°±±±±±±²²²²²²³³³³³³´´´´´´µµµµµµµ¶¶¶¶¶¶¶·······¸¸¸¸¸¸¸¹¹¹¹¹¹ººººººº»»»»»»»¼¼¼¼¼¼¼½½½½½½½¾¾¾¾¾¾¿¿¿¿¿¿¿ÀÀÀÀÀÀÀÁÁÁÁÁÁÁÂÂÂÂÂÂÂÃÃÃÃÃÃÄÄÄÄÄÄÄÅÅÅÅÅÅÅÆÆÆÆÆÆÆÇÇÇÇÇÇÇÈÈÈÈÈÉÉÉÉÉÉÊÊÊÊÊÊËËËËËËÌÌÌÌÌÌÍÍÍÍÍÍÎÎÎÎÎÎÎÏÏÏÏÏÏÏÐÐÐÐÐÐÐÑÑÑÑÑÑÑÒÒÒÒÒÒÓÓÓÓÓÓÓÔÔÔÔÔÔÔÕÕÕÕÕÕÕÖÖÖÖÖÖÖ××××××ØØØØØØØÙÙÙÙÙÙÙÚÚÚÚÚÚÚÛÛÛÛÛÛÛÜÜÜÜÜÜÝÝÝÝÝÝÝÞÞÞÞÞÞÞßßßßßßßàààààààááááâââââãããããäääääåååååæææææççççççèèèèèèééééééêêêêêêëëëëëììììììííííííîîîîîîïïïïïïðððððññññññòòòòòòóóóóóóôôôôôôõõõõõöööööö÷÷÷÷÷÷øøøøøøùùùùùù ú    ! "ÿ  #  $  %  & ' ( ) * +, -ô.õ/ö0÷1ø23 4!5"6#7 $8 !%9! "&:" !';# $(<$ #%)=% $&*>& !%'+?'"&,@(#)-A)$(*.B*%)+/C+&*,0D,'+1E"-(.F .)-/G/*.0H0+/1I1,0J'237K3248L4359M546:N65;O,728<P8379=Q9 48:>R:!59;?S;"6:@T1<#7=AU=$8<>BV>%9=?CW?&:>@DX@';?EY6A(<BFZB)=ACG[C*>BDH\D+?CEI]E,@DJ^;F-AG_&G.BFH`'H/CGIa(I0DHJb)J1EIc@*K2LPdL3KMQeM4LNRfN5MOSgO6NThEP7KQUiQ8LPRVjR9MQSWkS:NRTXlT;OSYmJU<PVZnV=QUW[oW>RVX\pX?SWY]qY@TX^rOZAU[_s[BVZ\`t\CW[]au]DX\^bv^EY]cwT_FZ`x?`G[_ay@aH\`bzAbI]ac{BcJ^b|YCdKei}eLdfj~fMegkgNfhl€hOgm^iPdjn‚jQeikoƒkRfjlp„lSgkmq…mThlr†cnUios‡oVjnptˆpWkoqu‰qXlprvŠrYmqw‹hsZntxŒt[osuyu\ptvzŽv]quw{w^rv|mx_sy‘Xy`txz’Yzauy{“Z{bvz|”[|cw{•r\}d~‚–~e}ƒ—f~€„˜€g…™h€†šw‚i}ƒ‡›ƒj~‚„ˆœ„kƒ…‰…l€„†Šž†m…‹Ÿ|‡n‚ˆŒ ˆoƒ‡‰¡‰p„ˆŠŽ¢Šq…‰‹£‹r†Š¤Œs‡‘¥tˆŒŽ’¦Žu‰“§vŠŽ”¨w‹•©†‘xŒ’ªq’y‘“«r“zŽ’”¬s”{“•­t•|”®‹u–}—›¯—~–˜œ°˜—™±™€˜šž²š™Ÿ³›‚–œ ´œƒ—›¡µ„˜œž¢¶ž…™Ÿ£·Ÿ†šž¤¸• ‡›¡¥¹¡ˆœ ¢¦º¢‰¡£§»£Šž¢¤¨¼¤‹Ÿ£©½š¥Œ ¦ª¾¦¡¥§«¿§Ž¢¦¨¬À¨£§©­Á©¤¨®ÂŸª‘¥«ÃŠ«’¦ª¬Ä‹¬“§«­ÅŒ­”¨¬®Æ®•©­Ç¤Ž¯–°´È°—¯±µÉ±˜°²¶Ê²™±³·Ë³š²¸Ì©´›¯µ¹Íµœ°´¶ºÎ¶±µ·»Ï·ž²¶¸¼Ð¸Ÿ³·½Ñ®¹ ´º¾Òº¡µ¹»¿Ó»¢¶º¼ÀÔ¼£·»½ÁÕ½¤¸¼ÂÖ³¾¥¹¿Ã׿¦º¾ÀÄØÀ§»¿ÁÅÙÁ¨¼ÀÂÆÚ©½ÁÇÛ¸ê¾Äܣī¿ÃÅݤŬÀÄÆÞ¥Æ­ÁÅÇߦÇ®ÂÆà½§ȯÉÍáɰÈÊÎâʱÉËÏã˲ÊÌÐä̳ËÑåÂÍ´ÈÎÒæÎµÉÍÏÓç϶ÊÎÐÔèзËÏÑÕéѸÌÐÖêÇÒ¹ÍÓ×ëÓºÎÒÔØìÔ»ÏÓÕÙíÕ¼ÐÔÖÚîÖ½ÑÕÛïÌ×¾ÒØÜðØ¿Ó×ÙÝñÙÀÔØÚÞòÚÁÕÙÛßóÛÂÖÚàôÑÜÃ×Ýõ¼ÝÄØÜÞö½ÞÅÙÝß÷¾߯ÚÞàø¿àÇÛßùÖÀáÈâæâÉáãçãÊâäèäËãåéåÌäêÛæÍáçëçÎâæèìèÏãçéíéÐäèêîêÑåéïàëÒæìðìÓçëíñíÔèìîòîÕéíïóïÖêîôåð×ëñõñØìðòöòÙíñó÷óÚîòôøôÛïóùêõÜðöÕöÝñõ÷Ö÷Þòöø×øßó÷ùØùàôøïÙÀ@€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿hypre-2.33.0/src/test/TEST_ij/data/poisson_10x10x10_np4/IJ.A.i4f4.00001.bin000066400000000000000000000455301477326011500246770ustar00rootroot00000000000000èè@úóúóúúúúúûûûûûüüüüüýýýýýþþþþÿÿÿÿÿÿ                                    !!!!!!"""""""#######$$$$$$$%%%%%%%&&&&&&'''''''((((((()))))))*******++++++,,,,,,------......//////0000011111112222222333333344444445555556666666777777788888889999999::::::;;;;;;;<<<<<<<=======>>>>>>>??????@@@@@@@AAAAAAABBBBBBBCCCCCCCDDDDDDEEEEEEFFFFFFGGGGGGHHHHHHIIIIIJJJJJJJKKKKKKKLLLLLLLMMMMMMMNNNNNNOOOOOOOPPPPPPPQQQQQQQRRRRRRRSSSSSSTTTTTTTUUUUUUUVVVVVVVWWWWWWWXXXXXXYYYYYYYZZZZZZZ[[[[[[[\\\\\\\]]]]]]^^^^^^______``````aaaaaabbbbbcccccccdddddddeeeeeeefffffffgggggghhhhhhhiiiiiiijjjjjjjkkkkkkkllllllmmmmmmmnnnnnnnooooooopppppppqqqqqqrrrrrrrssssssstttttttuuuuuuuvvvvvvwwwwwwxxxxxxyyyyyyzzzzzz{{{{{|||||||}}}}}}}~~~~~~~€€€€€€‚‚‚‚‚‚‚ƒƒƒƒƒƒƒ„„„„„„„………………†††††††‡‡‡‡‡‡‡ˆˆˆˆˆˆˆ‰‰‰‰‰‰‰ŠŠŠŠŠŠ‹‹‹‹‹‹‹ŒŒŒŒŒŒŒŽŽŽŽŽŽŽ‘‘‘‘‘‘’’’’’’““““““”””””•••••••–––––––———————˜˜˜˜˜˜˜™™™™™™ššššššš›››››››œœœœœœœžžžžžžŸŸŸŸŸŸŸ       ¡¡¡¡¡¡¡¢¢¢¢¢¢¢££££££¤¤¤¤¤¤¤¥¥¥¥¥¥¥¦¦¦¦¦¦¦§§§§§§§¨¨¨¨¨¨©©©©©©ªªªªªª««««««¬¬¬¬¬¬­­­­­®®®®®®®¯¯¯¯¯¯¯°°°°°°°±±±±±±±²²²²²²³³³³³³³´´´´´´´µµµµµµµ¶¶¶¶¶¶¶······¸¸¸¸¸¸¸¹¹¹¹¹¹¹ººººººº»»»»»»»¼¼¼¼¼¼½½½½½½½¾¾¾¾¾¾¾¿¿¿¿¿¿¿ÀÀÀÀÀÀÀÁÁÁÁÁÁÂÂÂÂÂÂÃÃÃÃÃÃÄÄÄÄÄÄÅÅÅÅÅÅÆÆÆÆÆÇÇÇÇÇÇÇÈÈÈÈÈÈÈÉÉÉÉÉÉÉÊÊÊÊÊÊÊËËËËËËÌÌÌÌÌÌÌÍÍÍÍÍÍÍÎÎÎÎÎÎÎÏÏÏÏÏÏÏÐÐÐÐÐÐÑÑÑÑÑÑÑÒÒÒÒÒÒÒÓÓÓÓÓÓÓÔÔÔÔÔÔÔÕÕÕÕÕÕÖÖÖÖÖÖÖ×××××××ØØØØØØØÙÙÙÙÙÙÙÚÚÚÚÚÚÛÛÛÛÛÜÜÜÜÜÝÝÝÝÝÞÞÞÞÞßßßßààààààááááááââââââããããããäääääååååååææææææççççççèèèèèèéééééêêêêêêëëëëëëììììììííííííîîîîîïïïïïïððððððññññññòòòòòòóóóóóúûÿûúüüûýýüþþýÿú ûÿüýþÿ      !  "   #   $   %  & 'î (ï )ð *ñ +òú,û-ü.ý/þ0ÿ1"23 4!5"6'#7 $8 !%9! &:" #';,# "$(<$ #%)=%  $&*>& !%+?'"(@1(#')A)$(*B *%)+C +&*D ,-1E6-,.2F.-/3G/.04H0/5I1,26J;2-137K3.248L4/359M504:N617;O@7268<P8379=Q9 48:>R:!59?S;"6<@TE<#7;=AU=$8<>BV>%9=?CW?&:>DX@';AYJ A(<@BZ!B)=AC["C*>BD\#D+?C]$E,FJ^OF-EGK_G.FHL`H/GIMaI0HNbJ1EKOcTK2FJLPdL3GKMQeM4HLNRfN5IMSgO6JPThYP7KOQUiQ8LPRVjR9MQSWkS:NRXlT;OUYm^U<PTVZnV=QUW[oW>RVX\pX?SW]qY@TZrc9ZAUY[s:[BVZ\t;\CW[]u<]DX\v=^E_cwh_F^`dx`G_aeyaH`bfzbIag{cJ^dh|mdK_cei}eL`dfj~fMaegkgNbfl€hOcimriPdhjn‚jQeikoƒkRfjlp„lSgkq…mThnr†wnUimos‡oVjnptˆpWkoqu‰qXlpvŠrYms‹|RsZnrtŒSt[osuTu\ptvŽUv]quVw^x|x_wy}‘y`xz~’zay{“{bz€”|cw}•†}dx|~‚–~ey}ƒ—fz~€„˜€g{…™h|‚†š‹‚i}ƒ‡›ƒj~‚„ˆœ„kƒ…‰…l€„Šž†m‡‹Ÿ‡n‚†ˆŒ ˆoƒ‡‰¡‰p„ˆŠŽ¢Šq…‰£‹r†Œ¤•kŒs‡‹¥ltˆŒŽ¦mŽu‰§nvŠŽ¨ow‘•©š‘x’–ª’y‘“—«“z’”˜¬”{“™­•|–š®Ÿ–}‘•—›¯—~’–˜œ°˜“—™±™€”˜ž²š•›Ÿ³¤›‚–šœ ´œƒ—›¡µ„˜œž¢¶ž…™£·Ÿ†š ¤¸© ‡›Ÿ¡¥¹¡ˆœ ¢¦º¢‰¡£§»£Šž¢¨¼¤‹Ÿ¥½®„¥Œ ¤¦¾…¦¡¥§¿†§Ž¢¦¨À‡¨£§Áˆ©ª®Â³ª‘©«¯Ã«’ª¬°Ä¬“«­±Å­”¬²Æ®•©¯³Ç¸¯–ª®°´È°—«¯±µÉ±˜¬°²¶Ê²™­±·Ë³š®´¸Ì½´›¯³µ¹Íµœ°´¶ºÎ¶±µ·»Ï·ž²¶¼Ð¸Ÿ³¹½Ñ¹ ´¸º¾Òº¡µ¹»¿Ó»¢¶º¼ÀÔ¼£·»ÁÕ½¤¸¾ÖǾ¥¹½¿×ž¿¦º¾ÀØŸÀ§»¿ÁÙ Á¨¼Àڡ©ÃÇÛÌêÂÄÈÜÄ«ÃÅÉÝŬįÊÞÆ­ÅËßÇ®ÂÈÌàÑȯÃÇÉÍáɰÄÈÊÎâʱÅÉËÏã˲ÆÊÐä̳ÇÍÑåÖÍ´ÈÌÎÒæÎµÉÍÏÓç϶ÊÎÐÔèзËÏÕéѸÌÒÖêÛÒ¹ÍÑÓ×ëÓºÎÒÔØìÔ»ÏÓÕÙíÕ¼ÐÔÚîÖ½Ñ×ïà¶×¾ÒÖØð·Ø¿Ó×Ùñ¸ÙÀÔØÚò¹ÚÁÕÙóºÛÂÜàåÜÃÛÝáÝÄÜÞâÞÅÝßã߯ÞäàÇÛáåêáÈÜàâæâÉÝáãçãÊÞâäèäËßãéåÌàæêïæÍáåçëçÎâæèìèÏãçéíéÐäèîêÑåëïôëÒæêìðìÓçëíñíÔèìîòîÕéíóïÖêðùÏð×ëïñÐñØìðòÑòÙíñóÒóÚîòÓÀ@€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿hypre-2.33.0/src/test/TEST_ij/data/poisson_10x10x10_np4/IJ.A.i4f4.00002.bin000066400000000000000000000455301477326011500247000ustar00rootroot00000000000000èè@ôíôíôôôôôõõõõõõöööööö÷÷÷÷÷÷øøøøøøùùùùùúúúúúúûûûûûûüüüüüüýýýýýýþþþþþÿÿÿÿÿÿ                                 !!!!!""""""######$$$$$$%%%%%%&&&&&&'''''''((((((()))))))*******++++++,,,,,,,-------.......///////00000011111112222222333333344444445555556666666777777788888889999999:::::;;;;;;<<<<<<======>>>>>>??????@@@@@@@AAAAAAABBBBBBBCCCCCCCDDDDDDEEEEEEEFFFFFFFGGGGGGGHHHHHHHIIIIIIJJJJJJJKKKKKKKLLLLLLLMMMMMMMNNNNNNOOOOOOOPPPPPPPQQQQQQQRRRRRRRSSSSSTTTTTTUUUUUUVVVVVVWWWWWWXXXXXXYYYYYYYZZZZZZZ[[[[[[[\\\\\\\]]]]]]^^^^^^^_______```````aaaaaaabbbbbbcccccccdddddddeeeeeeefffffffgggggghhhhhhhiiiiiiijjjjjjjkkkkkkklllllmmmmmmnnnnnnooooooppppppqqqqqqrrrrrrrssssssstttttttuuuuuuuvvvvvvwwwwwwwxxxxxxxyyyyyyyzzzzzzz{{{{{{|||||||}}}}}}}~~~~~~~€€€€€€‚‚‚‚‚‚‚ƒƒƒƒƒƒƒ„„„„„„„……………††††††‡‡‡‡‡‡ˆˆˆˆˆˆ‰‰‰‰‰‰ŠŠŠŠŠŠ‹‹‹‹‹‹‹ŒŒŒŒŒŒŒŽŽŽŽŽŽŽ‘‘‘‘‘‘‘’’’’’’’“““““““””””””•••••••–––––––———————˜˜˜˜˜˜˜™™™™™™ššššššš›››››››œœœœœœœžžžžžŸŸŸŸŸŸ      ¡¡¡¡¡¡¢¢¢¢¢¢££££££¤¤¤¤¤¤¤¥¥¥¥¥¥¥¦¦¦¦¦¦¦§§§§§§§¨¨¨¨¨¨©©©©©©©ªªªªªªª«««««««¬¬¬¬¬¬¬­­­­­­®®®®®®®¯¯¯¯¯¯¯°°°°°°°±±±±±±±²²²²²²³³³³³³³´´´´´´´µµµµµµµ¶¶¶¶¶¶¶·····¸¸¸¸¸¸¹¹¹¹¹¹ºººººº»»»»»»¼¼¼¼¼¼½½½½½½½¾¾¾¾¾¾¾¿¿¿¿¿¿¿ÀÀÀÀÀÀÀÁÁÁÁÁÁÂÂÂÂÂÂÂÃÃÃÃÃÃÃÄÄÄÄÄÄÄÅÅÅÅÅÅÅÆÆÆÆÆÆÇÇÇÇÇÇÇÈÈÈÈÈÈÈÉÉÉÉÉÉÉÊÊÊÊÊÊÊËËËËËËÌÌÌÌÌÌÌÍÍÍÍÍÍÍÎÎÎÎÎÎÎÏÏÏÏÏÏÏÐÐÐÐÐÑÑÑÑÑÑÒÒÒÒÒÒÓÓÓÓÓÓÔÔÔÔÔÔÕÕÕÕÕÖÖÖÖÖÖ××××××ØØØØØØÙÙÙÙÙÙÚÚÚÚÚÛÛÛÛÛÛÜÜÜÜÜÜÝÝÝÝÝÝÞÞÞÞÞÞßßßßßààààààááááááââââââããããããäääääååååååææææææççççççèèèèèèééééêêêêêëëëëëìììììíííííôõù õôöúöõ÷û÷öøüø÷ýîùôúþúõùûÿûöúüü÷ûýýøüóþùÿÿúþûÿüýøþÿ     ý !  "   #   $  % ô&-õ '.ö(/÷)0ø*1ù +ú,û-ü.ý/ þ0ÿ123 4!5"6#7 $8 %9!":" !#;# "$<$ #%=%  $>& '+?F'&(,@G(')-AH)(*.BI*)/CJ +&,0D,'+-1E-(,.2F.)-/3G/*.4H%0+15I1,026J2-137K3.248L4/39M*506:N6157;O7268<P8379=Q9 48>R/:!5;S;"6:<T<#7;=U=$8<>V>%9=W4?&@DX_@'?AEY`A(@BFZaB)ACG[bC*BH\c9D+?EI]E,@DFJ^F-AEGK_G.BFHL`H/CGMa>I0DJNbJ1EIKOcK2FJLPdL3GKMQeM4HLRfCN5IOSgO6JNPThP7KOQUiQ8LPRVjR9MQWkHS:NTlT;OSUmU<PTVnV=QUWoW>RVpMX?Y]qxY@XZ^ryZAY[_sz[BZ\`t{\C[au|R]DX^bv^EY]_cw_FZ^`dx`G[_aeyaH\`fzWbI]cg{cJ^bdh|dK_cei}eL`dfj~fMaek\gNbhl€hOcgimiPdhjn‚jQeikoƒkRfjp„alSgm…mThln†nUimo‡oVjnpˆpWko‰fqXrvŠ‘rYqsw‹’sZrtxŒ“t[suy”u\tzŽ•kv]qw{w^rvx|x_swy}‘y`txz~’zauy“p{bv|€”|cw{}•}dx|~‚–~ey}ƒ—fz~„˜u€g{…™h|€‚†š‚i}ƒ‡›ƒj~‚„ˆœ„kƒ‰z…l€†ž†m…‡Ÿ‡n‚†ˆ ˆoƒ‡‰¡‰p„ˆ¢Šq‹£ª‹rŠŒ¤«Œs‹‘¥¬tŒŽ’¦­Žu“§®„vŠ”¨w‹‘•©‘xŒ’–ª’y‘“—«“zŽ’˜¬‰”{•™­•|”–š®–}‘•—›¯—~’–˜œ°˜“—±Ž™€”šž²š•™›Ÿ³›‚–šœ ´œƒ—›¡µ„˜œ¢¶“ž…™Ÿ·Ÿ†šž ¸ ‡›Ÿ¡¹¡ˆœ ¢º¢‰¡»˜£Š¤¨¼ä‹£¥©½Ä¥Œ¤¦ª¾Ŧ¥§«¿Ƨަ¬ÀǨ£©­Á©¤¨ª®Âª‘¥©«¯Ã«’¦ª¬°Ä¬“§«±Å¢­”¨®²Æ®•©­¯³Ç¯–ª®°´È°—«¯±µÉ±˜¬°¶Ê§²™­³·Ë³š®²´¸Ì´›¯³µ¹Íµœ°´¶ºÎ¶±µ»Ï¬·ž²¸Ð¸Ÿ³·¹Ñ¹ ´¸ºÒº¡µ¹»Ó»¢¶ºÔ±¼£½ÁÕܽ¤¼¾ÂÖݾ¥½¿Ã×Þ¿¦¾ÀÄØßÀ§¿ÅÙà¶Á¨¼ÂÆÚ©½ÁÃÇÛê¾ÂÄÈÜÄ«¿ÃÅÉÝŬÀÄÊ޻ƭÁÇËßÇ®ÂÆÈÌàȯÃÇÉÍáɰÄÈÊÎâʱÅÉÏãÀ˲ÆÌÐä̳ÇËÍÑåÍ´ÈÌÎÒæÎµÉÍÏÓç϶ÊÎÔèÅзËÑéѸÌÐÒêÒ¹ÍÑÓëÓºÎÒÔìÔ»ÏÓíÊÕ¼ÖÚõÖ½Õ×Ûö×¾ÖØÜ÷Ø¿×ÙÝøÙÀØÞùÏÚÁÕÛßÛÂÖÚÜàÜÃ×ÛÝáÝÄØÜÞâÞÅÙÝãÔ߯ÚàäàÇÛßáåáÈÜàâæâÉÝáãçãÊÞâèÙäËßåéåÌàäæêæÍáåçëçÎâæèìèÏãçíÞéÐäêêÑåéëëÒæêììÓçëííÔèìãÀ@€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿hypre-2.33.0/src/test/TEST_ij/data/poisson_10x10x10_np4/IJ.A.i4f4.00003.bin000066400000000000000000000455301477326011500247010ustar00rootroot00000000000000èè@îçîçîîîîîîïïïïïïððððððññññññòòòòòóóóóóóôôôôôôõõõõõõöööööö÷÷÷÷÷øøøøøøùùùùùùúúúúúúûûûûûûüüüüüýýýýýýþþþþþþÿÿÿÿÿÿ                                         !!!!!!!"""""""#######$$$$$$%%%%%%%&&&&&&&'''''''((((((())))))*******+++++++,,,,,,,-------......///////000000011111112222222333333444444555555666666777777888889999999:::::::;;;;;;;<<<<<<<======>>>>>>>???????@@@@@@@AAAAAAABBBBBBCCCCCCCDDDDDDDEEEEEEEFFFFFFFGGGGGGHHHHHHHIIIIIIIJJJJJJJKKKKKKKLLLLLLMMMMMMNNNNNNOOOOOOPPPPPPQQQQQRRRRRRRSSSSSSSTTTTTTTUUUUUUUVVVVVVWWWWWWWXXXXXXXYYYYYYYZZZZZZZ[[[[[[\\\\\\\]]]]]]]^^^^^^^_______``````aaaaaaabbbbbbbcccccccdddddddeeeeeeffffffgggggghhhhhhiiiiiijjjjjkkkkkkklllllllmmmmmmmnnnnnnnoooooopppppppqqqqqqqrrrrrrrsssssssttttttuuuuuuuvvvvvvvwwwwwwwxxxxxxxyyyyyyzzzzzzz{{{{{{{|||||||}}}}}}}~~~~~~€€€€€€‚‚‚‚‚‚ƒƒƒƒƒ„„„„„„„…………………†††††††‡‡‡‡‡‡‡ˆˆˆˆˆˆ‰‰‰‰‰‰‰ŠŠŠŠŠŠŠ‹‹‹‹‹‹‹ŒŒŒŒŒŒŒŽŽŽŽŽŽŽ‘‘‘‘‘‘‘’’’’’’“““““““”””””””•••••••–––––––——————˜˜˜˜˜˜™™™™™™šššššš››››››œœœœœžžžžžžžŸŸŸŸŸŸŸ       ¡¡¡¡¡¡¢¢¢¢¢¢¢£££££££¤¤¤¤¤¤¤¥¥¥¥¥¥¥¦¦¦¦¦¦§§§§§§§¨¨¨¨¨¨¨©©©©©©©ªªªªªªª««««««¬¬¬¬¬¬¬­­­­­­­®®®®®®®¯¯¯¯¯¯¯°°°°°°±±±±±±²²²²²²³³³³³³´´´´´´µµµµµ¶¶¶¶¶¶¶·······¸¸¸¸¸¸¸¹¹¹¹¹¹¹ºººººº»»»»»»»¼¼¼¼¼¼¼½½½½½½½¾¾¾¾¾¾¾¿¿¿¿¿¿ÀÀÀÀÀÀÀÁÁÁÁÁÁÁÂÂÂÂÂÂÂÃÃÃÃÃÃÃÄÄÄÄÄÄÅÅÅÅÅÅÅÆÆÆÆÆÆÆÇÇÇÇÇÇÇÈÈÈÈÈÈÈÉÉÉÉÉÉÊÊÊÊÊÊËËËËËËÌÌÌÌÌÌÍÍÍÍÍÍÎÎÎÎÎÏÏÏÏÏÏÐÐÐÐÐÐÑÑÑÑÑÑÒÒÒÒÒÒÓÓÓÓÓÔÔÔÔÔÔÕÕÕÕÕÕÖÖÖÖÖÖ××××××ØØØØØÙÙÙÙÙÙÚÚÚÚÚÚÛÛÛÛÛÛÜÜÜÜÜÜÝÝÝÝÝÞÞÞÞÞÞßßßßßßààààààááááááâââââãããããäääääåååååæææææççççîïóøïîðôðïñõ ñðòö òñ÷ óîôø ýôïóõù õðôöúöñõ÷û÷òöüøóùýùôøúþúõùûÿûöúüü÷ûýøþþùýÿÿúþûÿüý þÿî  'ï  !( ð ") ñ  #* ò $+ ó % ô &õ  'ö (÷ )ø *ù +ú,û-ü.ý/ þ0ÿ1234%5678 !%9@*! "&:A" !#';B# "$(<C$ #)=D%  &*>/& !%'+?'"&(,@(#')-A)$(.B*%+/C4+&*,0D,'+-1E-(,.2F.)-3G/*04H90+/15I1,026J2-137K3.28L4/5M>5046N6157O7268P837Q9 :>RYC:!9;?SZ;":<@T[<#;=AU\=$<BV]>%9?CWH?&:>@DX@';?AEYA(<@BFZB)=AG[C*>DH\MD+?CEI]E,@DFJ^F-AEGK_G.BFL`H/CIMaRI0DHJNbJ1EIKOcK2FJLPdL3GKQeM4HNfWN5IMOgO6JNPhP7KOQiQ8LPjR9SWkr\S:RTXlsT;SUYmtU<TVZnuV=U[ovW>RX\paX?SWY]qY@TXZ^rZAUY[_s[BVZ`t\CW]auf]DX\^bv^EY]_cw_FZ^`dx`G[_eyaH\bfzkbI]acg{cJ^bdh|dK_cei}eL`dj~fMagpgNbfh€hOcgiiPdhj‚jQeiƒkRlp„‹ulSkmq…ŒmTlnr†nUmos‡ŽoVntˆpWkqu‰zqXlprvŠrYmqsw‹sZnrtxŒt[osyu\pvzŽv]quw{w^rvx|x_swy}‘y`tx~’zau{“„{bvz|€”|cw{}•}dx|~‚–~ey}ƒ—fz€˜‰€g{™h|€‚š‚i}ƒ›ƒj~‚œ„k…‰¤Ž…l„†Šž¥†m…‡‹Ÿ¦‡n†ˆŒ §ˆo‡¡¨‰p„ŠŽ¢“Šq…‰‹£‹r†ŠŒ¤Œs‡‹‘¥tˆŒ’¦Žu‰“§˜vŠŽ”¨w‹‘•©‘xŒ’–ª’y‘—«“zŽ”˜¬”{“•™­•|”–š®–}‘•—›¯—~’–œ°˜“™±¢™€”˜š²š•™›³›‚–šœ´œƒ—›µ„ž¢¶½§ž…Ÿ£·¾Ÿ†ž ¤¸¿ ‡Ÿ¡¥¹À¡ˆ ¦ºÁ¢‰£§»¬£Šž¢¤¨¼¤‹Ÿ£¥©½¥Œ ¤¦ª¾¦¡¥«¿§Ž¢¨¬À±¨£§©­Á©¤¨ª®Âª‘¥©«¯Ã«’¦ª°Ä¬“§­±Å¶­”¨¬®²Æ®•©­¯³Ç¯–ª®°´È°—«¯µÉ±˜¬²Ê»²™­±³Ë³š®²´Ì´›¯³µÍµœ°´Î¶·»ÏÖÀ·ž¶¸¼Ð׸Ÿ·¹½Ñع ¸º¾ÒÙº¡¹¿ÓÚ»¢¶¼ÀÔż£·»½ÁÕ½¤¸¼¾ÂÖ¾¥¹½¿Ã׿¦º¾ÄØÀ§»ÁÅÙÊÁ¨¼ÀÂÆÚ©½ÁÃÇÛê¾ÂÄÈÜÄ«¿ÃÉÝŬÀÆÊÞÏÆ­ÁÅÇËßÇ®ÂÆÈÌàȯÃÇÉÍáɰÄÈÎâʱÅËãÔ˲ÆÊÌä̳ÇËÍåÍ´ÈÌÎæÎµÉÍç϶ÐÔïÙзÏÑÕðѸÐÒÖñÒ¹ÑÓ×òÓºÒØóÔ»ÏÕÙÞÕ¼ÐÔÖÚÖ½ÑÕ×Û×¾ÒÖØÜØ¿Ó×ÝÙÀÔÚÞãÚÁÕÙÛßÛÂÖÚÜàÜÃ×ÛÝáÝÄØÜâÞÅÙßãè߯ÚÞàäàÇÛßáåáÈÜàâæâÉÝáçãÊÞäíäËßãååÌàäææÍáåççÎâæÀ@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿hypre-2.33.0/src/test/TEST_ij/data/poisson_10x10x10_np4/IJ.A.i4f8.00000.bin000066400000000000000000000621301477326011500246750ustar00rootroot00000000000000èè@ùù  !!!!!!!"""""""######$$$$$$$%%%%%%%&&&&&&&'''''''(((((()))))))*******+++++++,,,,,,,------.......///////000000011111112222233333344444455555566666677777788888889999999:::::::;;;;;;;<<<<<<=======>>>>>>>???????@@@@@@@AAAAAABBBBBBBCCCCCCCDDDDDDDEEEEEEEFFFFFFGGGGGGGHHHHHHHIIIIIIIJJJJJJJKKKKKLLLLLLMMMMMMNNNNNNOOOOOOPPPPPPQQQQQQQRRRRRRRSSSSSSSTTTTTTTUUUUUUVVVVVVVWWWWWWWXXXXXXXYYYYYYYZZZZZZ[[[[[[[\\\\\\\]]]]]]]^^^^^^^______```````aaaaaaabbbbbbbcccccccdddddeeeeeeffffffgggggghhhhhhiiiiiijjjjjjjkkkkkkklllllllmmmmmmmnnnnnnooooooopppppppqqqqqqqrrrrrrrsssssstttttttuuuuuuuvvvvvvvwwwwwwwxxxxxxyyyyyyyzzzzzzz{{{{{{{|||||||}}}}}~~~~~~€€€€€€‚‚‚‚‚‚ƒƒƒƒƒƒƒ„„„„„„„…………………†††††††‡‡‡‡‡‡ˆˆˆˆˆˆˆ‰‰‰‰‰‰‰ŠŠŠŠŠŠŠ‹‹‹‹‹‹‹ŒŒŒŒŒŒŽŽŽŽŽŽŽ‘‘‘‘‘‘’’’’’’’“““““““”””””””•••••••–––––——————˜˜˜˜˜˜™™™™™™šššššš››››››œœœœœœœžžžžžžžŸŸŸŸŸŸŸ      ¡¡¡¡¡¡¡¢¢¢¢¢¢¢£££££££¤¤¤¤¤¤¤¥¥¥¥¥¥¦¦¦¦¦¦¦§§§§§§§¨¨¨¨¨¨¨©©©©©©©ªªªªªª«««««««¬¬¬¬¬¬¬­­­­­­­®®®®®®®¯¯¯¯¯°°°°°°±±±±±±²²²²²²³³³³³³´´´´´´µµµµµµµ¶¶¶¶¶¶¶·······¸¸¸¸¸¸¸¹¹¹¹¹¹ººººººº»»»»»»»¼¼¼¼¼¼¼½½½½½½½¾¾¾¾¾¾¿¿¿¿¿¿¿ÀÀÀÀÀÀÀÁÁÁÁÁÁÁÂÂÂÂÂÂÂÃÃÃÃÃÃÄÄÄÄÄÄÄÅÅÅÅÅÅÅÆÆÆÆÆÆÆÇÇÇÇÇÇÇÈÈÈÈÈÉÉÉÉÉÉÊÊÊÊÊÊËËËËËËÌÌÌÌÌÌÍÍÍÍÍÍÎÎÎÎÎÎÎÏÏÏÏÏÏÏÐÐÐÐÐÐÐÑÑÑÑÑÑÑÒÒÒÒÒÒÓÓÓÓÓÓÓÔÔÔÔÔÔÔÕÕÕÕÕÕÕÖÖÖÖÖÖÖ××××××ØØØØØØØÙÙÙÙÙÙÙÚÚÚÚÚÚÚÛÛÛÛÛÛÛÜÜÜÜÜÜÝÝÝÝÝÝÝÞÞÞÞÞÞÞßßßßßßßàààààààááááâââââãããããäääääåååååæææææççççççèèèèèèééééééêêêêêêëëëëëììììììííííííîîîîîîïïïïïïðððððññññññòòòòòòóóóóóóôôôôôôõõõõõöööööö÷÷÷÷÷÷øøøøøøùùùùùù ú    ! "ÿ  #  $  %  & ' ( ) * +, -ô.õ/ö0÷1ø23 4!5"6#7 $8 !%9! "&:" !';# $(<$ #%)=% $&*>& !%'+?'"&,@(#)-A)$(*.B*%)+/C+&*,0D,'+1E"-(.F .)-/G/*.0H0+/1I1,0J'237K3248L4359M546:N65;O,728<P8379=Q9 48:>R:!59;?S;"6:@T1<#7=AU=$8<>BV>%9=?CW?&:>@DX@';?EY6A(<BFZB)=ACG[C*>BDH\D+?CEI]E,@DJ^;F-AG_&G.BFH`'H/CGIa(I0DHJb)J1EIc@*K2LPdL3KMQeM4LNRfN5MOSgO6NThEP7KQUiQ8LPRVjR9MQSWkS:NRTXlT;OSYmJU<PVZnV=QUW[oW>RVX\pX?SWY]qY@TX^rOZAU[_s[BVZ\`t\CW[]au]DX\^bv^EY]cwT_FZ`x?`G[_ay@aH\`bzAbI]ac{BcJ^b|YCdKei}eLdfj~fMegkgNfhl€hOgm^iPdjn‚jQeikoƒkRfjlp„lSgkmq…mThlr†cnUios‡oVjnptˆpWkoqu‰qXlprvŠrYmqw‹hsZntxŒt[osuyu\ptvzŽv]quw{w^rv|mx_sy‘Xy`txz’Yzauy{“Z{bvz|”[|cw{•r\}d~‚–~e}ƒ—f~€„˜€g…™h€†šw‚i}ƒ‡›ƒj~‚„ˆœ„kƒ…‰…l€„†Šž†m…‹Ÿ|‡n‚ˆŒ ˆoƒ‡‰¡‰p„ˆŠŽ¢Šq…‰‹£‹r†Š¤Œs‡‘¥tˆŒŽ’¦Žu‰“§vŠŽ”¨w‹•©†‘xŒ’ªq’y‘“«r“zŽ’”¬s”{“•­t•|”®‹u–}—›¯—~–˜œ°˜—™±™€˜šž²š™Ÿ³›‚–œ ´œƒ—›¡µ„˜œž¢¶ž…™Ÿ£·Ÿ†šž¤¸• ‡›¡¥¹¡ˆœ ¢¦º¢‰¡£§»£Šž¢¤¨¼¤‹Ÿ£©½š¥Œ ¦ª¾¦¡¥§«¿§Ž¢¦¨¬À¨£§©­Á©¤¨®ÂŸª‘¥«ÃŠ«’¦ª¬Ä‹¬“§«­ÅŒ­”¨¬®Æ®•©­Ç¤Ž¯–°´È°—¯±µÉ±˜°²¶Ê²™±³·Ë³š²¸Ì©´›¯µ¹Íµœ°´¶ºÎ¶±µ·»Ï·ž²¶¸¼Ð¸Ÿ³·½Ñ®¹ ´º¾Òº¡µ¹»¿Ó»¢¶º¼ÀÔ¼£·»½ÁÕ½¤¸¼ÂÖ³¾¥¹¿Ã׿¦º¾ÀÄØÀ§»¿ÁÅÙÁ¨¼ÀÂÆÚ©½ÁÇÛ¸ê¾Äܣī¿ÃÅݤŬÀÄÆÞ¥Æ­ÁÅÇߦÇ®ÂÆà½§ȯÉÍáɰÈÊÎâʱÉËÏã˲ÊÌÐä̳ËÑåÂÍ´ÈÎÒæÎµÉÍÏÓç϶ÊÎÐÔèзËÏÑÕéѸÌÐÖêÇÒ¹ÍÓ×ëÓºÎÒÔØìÔ»ÏÓÕÙíÕ¼ÐÔÖÚîÖ½ÑÕÛïÌ×¾ÒØÜðØ¿Ó×ÙÝñÙÀÔØÚÞòÚÁÕÙÛßóÛÂÖÚàôÑÜÃ×Ýõ¼ÝÄØÜÞö½ÞÅÙÝß÷¾߯ÚÞàø¿àÇÛßùÖÀáÈâæâÉáãçãÊâäèäËãåéåÌäêÛæÍáçëçÎâæèìèÏãçéíéÐäèêîêÑåéïàëÒæìðìÓçëíñíÔèìîòîÕéíïóïÖêîôåð×ëñõñØìðòöòÙíñó÷óÚîòôøôÛïóùêõÜðöÕöÝñõ÷Ö÷Þòöø×øßó÷ùØùàôøïÙ@ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿hypre-2.33.0/src/test/TEST_ij/data/poisson_10x10x10_np4/IJ.A.i4f8.00001.bin000066400000000000000000000621301477326011500246760ustar00rootroot00000000000000èè@úóúóúúúúúûûûûûüüüüüýýýýýþþþþÿÿÿÿÿÿ                                    !!!!!!"""""""#######$$$$$$$%%%%%%%&&&&&&'''''''((((((()))))))*******++++++,,,,,,------......//////0000011111112222222333333344444445555556666666777777788888889999999::::::;;;;;;;<<<<<<<=======>>>>>>>??????@@@@@@@AAAAAAABBBBBBBCCCCCCCDDDDDDEEEEEEFFFFFFGGGGGGHHHHHHIIIIIJJJJJJJKKKKKKKLLLLLLLMMMMMMMNNNNNNOOOOOOOPPPPPPPQQQQQQQRRRRRRRSSSSSSTTTTTTTUUUUUUUVVVVVVVWWWWWWWXXXXXXYYYYYYYZZZZZZZ[[[[[[[\\\\\\\]]]]]]^^^^^^______``````aaaaaabbbbbcccccccdddddddeeeeeeefffffffgggggghhhhhhhiiiiiiijjjjjjjkkkkkkkllllllmmmmmmmnnnnnnnooooooopppppppqqqqqqrrrrrrrssssssstttttttuuuuuuuvvvvvvwwwwwwxxxxxxyyyyyyzzzzzz{{{{{|||||||}}}}}}}~~~~~~~€€€€€€‚‚‚‚‚‚‚ƒƒƒƒƒƒƒ„„„„„„„………………†††††††‡‡‡‡‡‡‡ˆˆˆˆˆˆˆ‰‰‰‰‰‰‰ŠŠŠŠŠŠ‹‹‹‹‹‹‹ŒŒŒŒŒŒŒŽŽŽŽŽŽŽ‘‘‘‘‘‘’’’’’’““““““”””””•••••••–––––––———————˜˜˜˜˜˜˜™™™™™™ššššššš›››››››œœœœœœœžžžžžžŸŸŸŸŸŸŸ       ¡¡¡¡¡¡¡¢¢¢¢¢¢¢££££££¤¤¤¤¤¤¤¥¥¥¥¥¥¥¦¦¦¦¦¦¦§§§§§§§¨¨¨¨¨¨©©©©©©ªªªªªª««««««¬¬¬¬¬¬­­­­­®®®®®®®¯¯¯¯¯¯¯°°°°°°°±±±±±±±²²²²²²³³³³³³³´´´´´´´µµµµµµµ¶¶¶¶¶¶¶······¸¸¸¸¸¸¸¹¹¹¹¹¹¹ººººººº»»»»»»»¼¼¼¼¼¼½½½½½½½¾¾¾¾¾¾¾¿¿¿¿¿¿¿ÀÀÀÀÀÀÀÁÁÁÁÁÁÂÂÂÂÂÂÃÃÃÃÃÃÄÄÄÄÄÄÅÅÅÅÅÅÆÆÆÆÆÇÇÇÇÇÇÇÈÈÈÈÈÈÈÉÉÉÉÉÉÉÊÊÊÊÊÊÊËËËËËËÌÌÌÌÌÌÌÍÍÍÍÍÍÍÎÎÎÎÎÎÎÏÏÏÏÏÏÏÐÐÐÐÐÐÑÑÑÑÑÑÑÒÒÒÒÒÒÒÓÓÓÓÓÓÓÔÔÔÔÔÔÔÕÕÕÕÕÕÖÖÖÖÖÖÖ×××××××ØØØØØØØÙÙÙÙÙÙÙÚÚÚÚÚÚÛÛÛÛÛÜÜÜÜÜÝÝÝÝÝÞÞÞÞÞßßßßààààààááááááââââââããããããäääääååååååææææææççççççèèèèèèéééééêêêêêêëëëëëëììììììííííííîîîîîïïïïïïððððððññññññòòòòòòóóóóóúûÿûúüüûýýüþþýÿú ûÿüýþÿ      !  "   #   $   %  & 'î (ï )ð *ñ +òú,û-ü.ý/þ0ÿ1"23 4!5"6'#7 $8 !%9! &:" #';,# "$(<$ #%)=%  $&*>& !%+?'"(@1(#')A)$(*B *%)+C +&*D ,-1E6-,.2F.-/3G/.04H0/5I1,26J;2-137K3.248L4/359M504:N617;O@7268<P8379=Q9 48:>R:!59?S;"6<@TE<#7;=AU=$8<>BV>%9=?CW?&:>DX@';AYJ A(<@BZ!B)=AC["C*>BD\#D+?C]$E,FJ^OF-EGK_G.FHL`H/GIMaI0HNbJ1EKOcTK2FJLPdL3GKMQeM4HLNRfN5IMSgO6JPThYP7KOQUiQ8LPRVjR9MQSWkS:NRXlT;OUYm^U<PTVZnV=QUW[oW>RVX\pX?SW]qY@TZrc9ZAUY[s:[BVZ\t;\CW[]u<]DX\v=^E_cwh_F^`dx`G_aeyaH`bfzbIag{cJ^dh|mdK_cei}eL`dfj~fMaegkgNbfl€hOcimriPdhjn‚jQeikoƒkRfjlp„lSgkq…mThnr†wnUimos‡oVjnptˆpWkoqu‰qXlpvŠrYms‹|RsZnrtŒSt[osuTu\ptvŽUv]quVw^x|x_wy}‘y`xz~’zay{“{bz€”|cw}•†}dx|~‚–~ey}ƒ—fz~€„˜€g{…™h|‚†š‹‚i}ƒ‡›ƒj~‚„ˆœ„kƒ…‰…l€„Šž†m‡‹Ÿ‡n‚†ˆŒ ˆoƒ‡‰¡‰p„ˆŠŽ¢Šq…‰£‹r†Œ¤•kŒs‡‹¥ltˆŒŽ¦mŽu‰§nvŠŽ¨ow‘•©š‘x’–ª’y‘“—«“z’”˜¬”{“™­•|–š®Ÿ–}‘•—›¯—~’–˜œ°˜“—™±™€”˜ž²š•›Ÿ³¤›‚–šœ ´œƒ—›¡µ„˜œž¢¶ž…™£·Ÿ†š ¤¸© ‡›Ÿ¡¥¹¡ˆœ ¢¦º¢‰¡£§»£Šž¢¨¼¤‹Ÿ¥½®„¥Œ ¤¦¾…¦¡¥§¿†§Ž¢¦¨À‡¨£§Áˆ©ª®Â³ª‘©«¯Ã«’ª¬°Ä¬“«­±Å­”¬²Æ®•©¯³Ç¸¯–ª®°´È°—«¯±µÉ±˜¬°²¶Ê²™­±·Ë³š®´¸Ì½´›¯³µ¹Íµœ°´¶ºÎ¶±µ·»Ï·ž²¶¼Ð¸Ÿ³¹½Ñ¹ ´¸º¾Òº¡µ¹»¿Ó»¢¶º¼ÀÔ¼£·»ÁÕ½¤¸¾ÖǾ¥¹½¿×ž¿¦º¾ÀØŸÀ§»¿ÁÙ Á¨¼Àڡ©ÃÇÛÌêÂÄÈÜÄ«ÃÅÉÝŬįÊÞÆ­ÅËßÇ®ÂÈÌàÑȯÃÇÉÍáɰÄÈÊÎâʱÅÉËÏã˲ÆÊÐä̳ÇÍÑåÖÍ´ÈÌÎÒæÎµÉÍÏÓç϶ÊÎÐÔèзËÏÕéѸÌÒÖêÛÒ¹ÍÑÓ×ëÓºÎÒÔØìÔ»ÏÓÕÙíÕ¼ÐÔÚîÖ½Ñ×ïà¶×¾ÒÖØð·Ø¿Ó×Ùñ¸ÙÀÔØÚò¹ÚÁÕÙóºÛÂÜàåÜÃÛÝáÝÄÜÞâÞÅÝßã߯ÞäàÇÛáåêáÈÜàâæâÉÝáãçãÊÞâäèäËßãéåÌàæêïæÍáåçëçÎâæèìèÏãçéíéÐäèîêÑåëïôëÒæêìðìÓçëíñíÔèìîòîÕéíóïÖêðùÏð×ëïñÐñØìðòÑòÙíñóÒóÚîòÓ@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿hypre-2.33.0/src/test/TEST_ij/data/poisson_10x10x10_np4/IJ.A.i4f8.00002.bin000066400000000000000000000621301477326011500246770ustar00rootroot00000000000000èè@ôíôíôôôôôõõõõõõöööööö÷÷÷÷÷÷øøøøøøùùùùùúúúúúúûûûûûûüüüüüüýýýýýýþþþþþÿÿÿÿÿÿ                                 !!!!!""""""######$$$$$$%%%%%%&&&&&&'''''''((((((()))))))*******++++++,,,,,,,-------.......///////00000011111112222222333333344444445555556666666777777788888889999999:::::;;;;;;<<<<<<======>>>>>>??????@@@@@@@AAAAAAABBBBBBBCCCCCCCDDDDDDEEEEEEEFFFFFFFGGGGGGGHHHHHHHIIIIIIJJJJJJJKKKKKKKLLLLLLLMMMMMMMNNNNNNOOOOOOOPPPPPPPQQQQQQQRRRRRRRSSSSSTTTTTTUUUUUUVVVVVVWWWWWWXXXXXXYYYYYYYZZZZZZZ[[[[[[[\\\\\\\]]]]]]^^^^^^^_______```````aaaaaaabbbbbbcccccccdddddddeeeeeeefffffffgggggghhhhhhhiiiiiiijjjjjjjkkkkkkklllllmmmmmmnnnnnnooooooppppppqqqqqqrrrrrrrssssssstttttttuuuuuuuvvvvvvwwwwwwwxxxxxxxyyyyyyyzzzzzzz{{{{{{|||||||}}}}}}}~~~~~~~€€€€€€‚‚‚‚‚‚‚ƒƒƒƒƒƒƒ„„„„„„„……………††††††‡‡‡‡‡‡ˆˆˆˆˆˆ‰‰‰‰‰‰ŠŠŠŠŠŠ‹‹‹‹‹‹‹ŒŒŒŒŒŒŒŽŽŽŽŽŽŽ‘‘‘‘‘‘‘’’’’’’’“““““““””””””•••••••–––––––———————˜˜˜˜˜˜˜™™™™™™ššššššš›››››››œœœœœœœžžžžžŸŸŸŸŸŸ      ¡¡¡¡¡¡¢¢¢¢¢¢££££££¤¤¤¤¤¤¤¥¥¥¥¥¥¥¦¦¦¦¦¦¦§§§§§§§¨¨¨¨¨¨©©©©©©©ªªªªªªª«««««««¬¬¬¬¬¬¬­­­­­­®®®®®®®¯¯¯¯¯¯¯°°°°°°°±±±±±±±²²²²²²³³³³³³³´´´´´´´µµµµµµµ¶¶¶¶¶¶¶·····¸¸¸¸¸¸¹¹¹¹¹¹ºººººº»»»»»»¼¼¼¼¼¼½½½½½½½¾¾¾¾¾¾¾¿¿¿¿¿¿¿ÀÀÀÀÀÀÀÁÁÁÁÁÁÂÂÂÂÂÂÂÃÃÃÃÃÃÃÄÄÄÄÄÄÄÅÅÅÅÅÅÅÆÆÆÆÆÆÇÇÇÇÇÇÇÈÈÈÈÈÈÈÉÉÉÉÉÉÉÊÊÊÊÊÊÊËËËËËËÌÌÌÌÌÌÌÍÍÍÍÍÍÍÎÎÎÎÎÎÎÏÏÏÏÏÏÏÐÐÐÐÐÑÑÑÑÑÑÒÒÒÒÒÒÓÓÓÓÓÓÔÔÔÔÔÔÕÕÕÕÕÖÖÖÖÖÖ××××××ØØØØØØÙÙÙÙÙÙÚÚÚÚÚÛÛÛÛÛÛÜÜÜÜÜÜÝÝÝÝÝÝÞÞÞÞÞÞßßßßßààààààááááááââââââããããããäääääååååååææææææççççççèèèèèèééééêêêêêëëëëëìììììíííííôõù õôöúöõ÷û÷öøüø÷ýîùôúþúõùûÿûöúüü÷ûýýøüóþùÿÿúþûÿüýøþÿ     ý !  "   #   $  % ô&-õ '.ö(/÷)0ø*1ù +ú,û-ü.ý/ þ0ÿ123 4!5"6#7 $8 %9!":" !#;# "$<$ #%=%  $>& '+?F'&(,@G(')-AH)(*.BI*)/CJ +&,0D,'+-1E-(,.2F.)-/3G/*.4H%0+15I1,026J2-137K3.248L4/39M*506:N6157;O7268<P8379=Q9 48>R/:!5;S;"6:<T<#7;=U=$8<>V>%9=W4?&@DX_@'?AEY`A(@BFZaB)ACG[bC*BH\c9D+?EI]E,@DFJ^F-AEGK_G.BFHL`H/CGMa>I0DJNbJ1EIKOcK2FJLPdL3GKMQeM4HLRfCN5IOSgO6JNPThP7KOQUiQ8LPRVjR9MQWkHS:NTlT;OSUmU<PTVnV=QUWoW>RVpMX?Y]qxY@XZ^ryZAY[_sz[BZ\`t{\C[au|R]DX^bv^EY]_cw_FZ^`dx`G[_aeyaH\`fzWbI]cg{cJ^bdh|dK_cei}eL`dfj~fMaek\gNbhl€hOcgimiPdhjn‚jQeikoƒkRfjp„alSgm…mThln†nUimo‡oVjnpˆpWko‰fqXrvŠ‘rYqsw‹’sZrtxŒ“t[suy”u\tzŽ•kv]qw{w^rvx|x_swy}‘y`txz~’zauy“p{bv|€”|cw{}•}dx|~‚–~ey}ƒ—fz~„˜u€g{…™h|€‚†š‚i}ƒ‡›ƒj~‚„ˆœ„kƒ‰z…l€†ž†m…‡Ÿ‡n‚†ˆ ˆoƒ‡‰¡‰p„ˆ¢Šq‹£ª‹rŠŒ¤«Œs‹‘¥¬tŒŽ’¦­Žu“§®„vŠ”¨w‹‘•©‘xŒ’–ª’y‘“—«“zŽ’˜¬‰”{•™­•|”–š®–}‘•—›¯—~’–˜œ°˜“—±Ž™€”šž²š•™›Ÿ³›‚–šœ ´œƒ—›¡µ„˜œ¢¶“ž…™Ÿ·Ÿ†šž ¸ ‡›Ÿ¡¹¡ˆœ ¢º¢‰¡»˜£Š¤¨¼ä‹£¥©½Ä¥Œ¤¦ª¾Ŧ¥§«¿Ƨަ¬ÀǨ£©­Á©¤¨ª®Âª‘¥©«¯Ã«’¦ª¬°Ä¬“§«±Å¢­”¨®²Æ®•©­¯³Ç¯–ª®°´È°—«¯±µÉ±˜¬°¶Ê§²™­³·Ë³š®²´¸Ì´›¯³µ¹Íµœ°´¶ºÎ¶±µ»Ï¬·ž²¸Ð¸Ÿ³·¹Ñ¹ ´¸ºÒº¡µ¹»Ó»¢¶ºÔ±¼£½ÁÕܽ¤¼¾ÂÖݾ¥½¿Ã×Þ¿¦¾ÀÄØßÀ§¿ÅÙà¶Á¨¼ÂÆÚ©½ÁÃÇÛê¾ÂÄÈÜÄ«¿ÃÅÉÝŬÀÄÊ޻ƭÁÇËßÇ®ÂÆÈÌàȯÃÇÉÍáɰÄÈÊÎâʱÅÉÏãÀ˲ÆÌÐä̳ÇËÍÑåÍ´ÈÌÎÒæÎµÉÍÏÓç϶ÊÎÔèÅзËÑéѸÌÐÒêÒ¹ÍÑÓëÓºÎÒÔìÔ»ÏÓíÊÕ¼ÖÚõÖ½Õ×Ûö×¾ÖØÜ÷Ø¿×ÙÝøÙÀØÞùÏÚÁÕÛßÛÂÖÚÜàÜÃ×ÛÝáÝÄØÜÞâÞÅÙÝãÔ߯ÚàäàÇÛßáåáÈÜàâæâÉÝáãçãÊÞâèÙäËßåéåÌàäæêæÍáåçëçÎâæèìèÏãçíÞéÐäêêÑåéëëÒæêììÓçëííÔèìã@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿hypre-2.33.0/src/test/TEST_ij/data/poisson_10x10x10_np4/IJ.A.i4f8.00003.bin000066400000000000000000000621301477326011500247000ustar00rootroot00000000000000èè@îçîçîîîîîîïïïïïïððððððññññññòòòòòóóóóóóôôôôôôõõõõõõöööööö÷÷÷÷÷øøøøøøùùùùùùúúúúúúûûûûûûüüüüüýýýýýýþþþþþþÿÿÿÿÿÿ                                         !!!!!!!"""""""#######$$$$$$%%%%%%%&&&&&&&'''''''((((((())))))*******+++++++,,,,,,,-------......///////000000011111112222222333333444444555555666666777777888889999999:::::::;;;;;;;<<<<<<<======>>>>>>>???????@@@@@@@AAAAAAABBBBBBCCCCCCCDDDDDDDEEEEEEEFFFFFFFGGGGGGHHHHHHHIIIIIIIJJJJJJJKKKKKKKLLLLLLMMMMMMNNNNNNOOOOOOPPPPPPQQQQQRRRRRRRSSSSSSSTTTTTTTUUUUUUUVVVVVVWWWWWWWXXXXXXXYYYYYYYZZZZZZZ[[[[[[\\\\\\\]]]]]]]^^^^^^^_______``````aaaaaaabbbbbbbcccccccdddddddeeeeeeffffffgggggghhhhhhiiiiiijjjjjkkkkkkklllllllmmmmmmmnnnnnnnoooooopppppppqqqqqqqrrrrrrrsssssssttttttuuuuuuuvvvvvvvwwwwwwwxxxxxxxyyyyyyzzzzzzz{{{{{{{|||||||}}}}}}}~~~~~~€€€€€€‚‚‚‚‚‚ƒƒƒƒƒ„„„„„„„…………………†††††††‡‡‡‡‡‡‡ˆˆˆˆˆˆ‰‰‰‰‰‰‰ŠŠŠŠŠŠŠ‹‹‹‹‹‹‹ŒŒŒŒŒŒŒŽŽŽŽŽŽŽ‘‘‘‘‘‘‘’’’’’’“““““““”””””””•••••••–––––––——————˜˜˜˜˜˜™™™™™™šššššš››››››œœœœœžžžžžžžŸŸŸŸŸŸŸ       ¡¡¡¡¡¡¢¢¢¢¢¢¢£££££££¤¤¤¤¤¤¤¥¥¥¥¥¥¥¦¦¦¦¦¦§§§§§§§¨¨¨¨¨¨¨©©©©©©©ªªªªªªª««««««¬¬¬¬¬¬¬­­­­­­­®®®®®®®¯¯¯¯¯¯¯°°°°°°±±±±±±²²²²²²³³³³³³´´´´´´µµµµµ¶¶¶¶¶¶¶·······¸¸¸¸¸¸¸¹¹¹¹¹¹¹ºººººº»»»»»»»¼¼¼¼¼¼¼½½½½½½½¾¾¾¾¾¾¾¿¿¿¿¿¿ÀÀÀÀÀÀÀÁÁÁÁÁÁÁÂÂÂÂÂÂÂÃÃÃÃÃÃÃÄÄÄÄÄÄÅÅÅÅÅÅÅÆÆÆÆÆÆÆÇÇÇÇÇÇÇÈÈÈÈÈÈÈÉÉÉÉÉÉÊÊÊÊÊÊËËËËËËÌÌÌÌÌÌÍÍÍÍÍÍÎÎÎÎÎÏÏÏÏÏÏÐÐÐÐÐÐÑÑÑÑÑÑÒÒÒÒÒÒÓÓÓÓÓÔÔÔÔÔÔÕÕÕÕÕÕÖÖÖÖÖÖ××××××ØØØØØÙÙÙÙÙÙÚÚÚÚÚÚÛÛÛÛÛÛÜÜÜÜÜÜÝÝÝÝÝÞÞÞÞÞÞßßßßßßààààààááááááâââââãããããäääääåååååæææææççççîïóøïîðôðïñõ ñðòö òñ÷ óîôø ýôïóõù õðôöúöñõ÷û÷òöüøóùýùôøúþúõùûÿûöúüü÷ûýøþþùýÿÿúþûÿüý þÿî  'ï  !( ð ") ñ  #* ò $+ ó % ô &õ  'ö (÷ )ø *ù +ú,û-ü.ý/ þ0ÿ1234%5678 !%9@*! "&:A" !#';B# "$(<C$ #)=D%  &*>/& !%'+?'"&(,@(#')-A)$(.B*%+/C4+&*,0D,'+-1E-(,.2F.)-3G/*04H90+/15I1,026J2-137K3.28L4/5M>5046N6157O7268P837Q9 :>RYC:!9;?SZ;":<@T[<#;=AU\=$<BV]>%9?CWH?&:>@DX@';?AEYA(<@BFZB)=AG[C*>DH\MD+?CEI]E,@DFJ^F-AEGK_G.BFL`H/CIMaRI0DHJNbJ1EIKOcK2FJLPdL3GKQeM4HNfWN5IMOgO6JNPhP7KOQiQ8LPjR9SWkr\S:RTXlsT;SUYmtU<TVZnuV=U[ovW>RX\paX?SWY]qY@TXZ^rZAUY[_s[BVZ`t\CW]auf]DX\^bv^EY]_cw_FZ^`dx`G[_eyaH\bfzkbI]acg{cJ^bdh|dK_cei}eL`dj~fMagpgNbfh€hOcgiiPdhj‚jQeiƒkRlp„‹ulSkmq…ŒmTlnr†nUmos‡ŽoVntˆpWkqu‰zqXlprvŠrYmqsw‹sZnrtxŒt[osyu\pvzŽv]quw{w^rvx|x_swy}‘y`tx~’zau{“„{bvz|€”|cw{}•}dx|~‚–~ey}ƒ—fz€˜‰€g{™h|€‚š‚i}ƒ›ƒj~‚œ„k…‰¤Ž…l„†Šž¥†m…‡‹Ÿ¦‡n†ˆŒ §ˆo‡¡¨‰p„ŠŽ¢“Šq…‰‹£‹r†ŠŒ¤Œs‡‹‘¥tˆŒ’¦Žu‰“§˜vŠŽ”¨w‹‘•©‘xŒ’–ª’y‘—«“zŽ”˜¬”{“•™­•|”–š®–}‘•—›¯—~’–œ°˜“™±¢™€”˜š²š•™›³›‚–šœ´œƒ—›µ„ž¢¶½§ž…Ÿ£·¾Ÿ†ž ¤¸¿ ‡Ÿ¡¥¹À¡ˆ ¦ºÁ¢‰£§»¬£Šž¢¤¨¼¤‹Ÿ£¥©½¥Œ ¤¦ª¾¦¡¥«¿§Ž¢¨¬À±¨£§©­Á©¤¨ª®Âª‘¥©«¯Ã«’¦ª°Ä¬“§­±Å¶­”¨¬®²Æ®•©­¯³Ç¯–ª®°´È°—«¯µÉ±˜¬²Ê»²™­±³Ë³š®²´Ì´›¯³µÍµœ°´Î¶·»ÏÖÀ·ž¶¸¼Ð׸Ÿ·¹½Ñع ¸º¾ÒÙº¡¹¿ÓÚ»¢¶¼ÀÔż£·»½ÁÕ½¤¸¼¾ÂÖ¾¥¹½¿Ã׿¦º¾ÄØÀ§»ÁÅÙÊÁ¨¼ÀÂÆÚ©½ÁÃÇÛê¾ÂÄÈÜÄ«¿ÃÉÝŬÀÆÊÞÏÆ­ÁÅÇËßÇ®ÂÆÈÌàȯÃÇÉÍáɰÄÈÎâʱÅËãÔ˲ÆÊÌä̳ÇËÍåÍ´ÈÌÎæÎµÉÍç϶ÐÔïÙзÏÑÕðѸÐÒÖñÒ¹ÑÓ×òÓºÒØóÔ»ÏÕÙÞÕ¼ÐÔÖÚÖ½ÑÕ×Û×¾ÒÖØÜØ¿Ó×ÝÙÀÔÚÞãÚÁÕÙÛßÛÂÖÚÜàÜÃ×ÛÝáÝÄØÜâÞÅÙßãè߯ÚÞàäàÇÛßáåáÈÜàâæâÉÝáçãÊÞäíäËßãååÌàäææÍáåççÎâæ@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿hypre-2.33.0/src/test/TEST_ij/data/poisson_10x10x10_np4/IJ.A.i8f4.00000.bin000066400000000000000000000765301477326011500247060ustar00rootroot00000000000000èè@ùù  !!!!!!!"""""""######$$$$$$$%%%%%%%&&&&&&&'''''''(((((()))))))*******+++++++,,,,,,,------.......///////000000011111112222233333344444455555566666677777788888889999999:::::::;;;;;;;<<<<<<=======>>>>>>>???????@@@@@@@AAAAAABBBBBBBCCCCCCCDDDDDDDEEEEEEEFFFFFFGGGGGGGHHHHHHHIIIIIIIJJJJJJJKKKKKLLLLLLMMMMMMNNNNNNOOOOOOPPPPPPQQQQQQQRRRRRRRSSSSSSSTTTTTTTUUUUUUVVVVVVVWWWWWWWXXXXXXXYYYYYYYZZZZZZ[[[[[[[\\\\\\\]]]]]]]^^^^^^^______```````aaaaaaabbbbbbbcccccccdddddeeeeeeffffffgggggghhhhhhiiiiiijjjjjjjkkkkkkklllllllmmmmmmmnnnnnnooooooopppppppqqqqqqqrrrrrrrsssssstttttttuuuuuuuvvvvvvvwwwwwwwxxxxxxyyyyyyyzzzzzzz{{{{{{{|||||||}}}}}~~~~~~€€€€€€‚‚‚‚‚‚ƒƒƒƒƒƒƒ„„„„„„„…………………†††††††‡‡‡‡‡‡ˆˆˆˆˆˆˆ‰‰‰‰‰‰‰ŠŠŠŠŠŠŠ‹‹‹‹‹‹‹ŒŒŒŒŒŒŽŽŽŽŽŽŽ‘‘‘‘‘‘’’’’’’’“““““““”””””””•••••••–––––——————˜˜˜˜˜˜™™™™™™šššššš››››››œœœœœœœžžžžžžžŸŸŸŸŸŸŸ      ¡¡¡¡¡¡¡¢¢¢¢¢¢¢£££££££¤¤¤¤¤¤¤¥¥¥¥¥¥¦¦¦¦¦¦¦§§§§§§§¨¨¨¨¨¨¨©©©©©©©ªªªªªª«««««««¬¬¬¬¬¬¬­­­­­­­®®®®®®®¯¯¯¯¯°°°°°°±±±±±±²²²²²²³³³³³³´´´´´´µµµµµµµ¶¶¶¶¶¶¶·······¸¸¸¸¸¸¸¹¹¹¹¹¹ººººººº»»»»»»»¼¼¼¼¼¼¼½½½½½½½¾¾¾¾¾¾¿¿¿¿¿¿¿ÀÀÀÀÀÀÀÁÁÁÁÁÁÁÂÂÂÂÂÂÂÃÃÃÃÃÃÄÄÄÄÄÄÄÅÅÅÅÅÅÅÆÆÆÆÆÆÆÇÇÇÇÇÇÇÈÈÈÈÈÉÉÉÉÉÉÊÊÊÊÊÊËËËËËËÌÌÌÌÌÌÍÍÍÍÍÍÎÎÎÎÎÎÎÏÏÏÏÏÏÏÐÐÐÐÐÐÐÑÑÑÑÑÑÑÒÒÒÒÒÒÓÓÓÓÓÓÓÔÔÔÔÔÔÔÕÕÕÕÕÕÕÖÖÖÖÖÖÖ××××××ØØØØØØØÙÙÙÙÙÙÙÚÚÚÚÚÚÚÛÛÛÛÛÛÛÜÜÜÜÜÜÝÝÝÝÝÝÝÞÞÞÞÞÞÞßßßßßßßàààààààááááâââââãããããäääääåååååæææææççççççèèèèèèééééééêêêêêêëëëëëììììììííííííîîîîîîïïïïïïðððððññññññòòòòòòóóóóóóôôôôôôõõõõõöööööö÷÷÷÷÷÷øøøøøøùùùùùù ú    ! "ÿ  #  $  %  & ' ( ) * +, -ô.õ/ö0÷1ø23 4!5"6#7 $8 !%9! "&:" !';# $(<$ #%)=% $&*>& !%'+?'"&,@(#)-A)$(*.B*%)+/C+&*,0D,'+1E"-(.F .)-/G/*.0H0+/1I1,0J'237K3248L4359M546:N65;O,728<P8379=Q9 48:>R:!59;?S;"6:@T1<#7=AU=$8<>BV>%9=?CW?&:>@DX@';?EY6A(<BFZB)=ACG[C*>BDH\D+?CEI]E,@DJ^;F-AG_&G.BFH`'H/CGIa(I0DHJb)J1EIc@*K2LPdL3KMQeM4LNRfN5MOSgO6NThEP7KQUiQ8LPRVjR9MQSWkS:NRTXlT;OSYmJU<PVZnV=QUW[oW>RVX\pX?SWY]qY@TX^rOZAU[_s[BVZ\`t\CW[]au]DX\^bv^EY]cwT_FZ`x?`G[_ay@aH\`bzAbI]ac{BcJ^b|YCdKei}eLdfj~fMegkgNfhl€hOgm^iPdjn‚jQeikoƒkRfjlp„lSgkmq…mThlr†cnUios‡oVjnptˆpWkoqu‰qXlprvŠrYmqw‹hsZntxŒt[osuyu\ptvzŽv]quw{w^rv|mx_sy‘Xy`txz’Yzauy{“Z{bvz|”[|cw{•r\}d~‚–~e}ƒ—f~€„˜€g…™h€†šw‚i}ƒ‡›ƒj~‚„ˆœ„kƒ…‰…l€„†Šž†m…‹Ÿ|‡n‚ˆŒ ˆoƒ‡‰¡‰p„ˆŠŽ¢Šq…‰‹£‹r†Š¤Œs‡‘¥tˆŒŽ’¦Žu‰“§vŠŽ”¨w‹•©†‘xŒ’ªq’y‘“«r“zŽ’”¬s”{“•­t•|”®‹u–}—›¯—~–˜œ°˜—™±™€˜šž²š™Ÿ³›‚–œ ´œƒ—›¡µ„˜œž¢¶ž…™Ÿ£·Ÿ†šž¤¸• ‡›¡¥¹¡ˆœ ¢¦º¢‰¡£§»£Šž¢¤¨¼¤‹Ÿ£©½š¥Œ ¦ª¾¦¡¥§«¿§Ž¢¦¨¬À¨£§©­Á©¤¨®ÂŸª‘¥«ÃŠ«’¦ª¬Ä‹¬“§«­ÅŒ­”¨¬®Æ®•©­Ç¤Ž¯–°´È°—¯±µÉ±˜°²¶Ê²™±³·Ë³š²¸Ì©´›¯µ¹Íµœ°´¶ºÎ¶±µ·»Ï·ž²¶¸¼Ð¸Ÿ³·½Ñ®¹ ´º¾Òº¡µ¹»¿Ó»¢¶º¼ÀÔ¼£·»½ÁÕ½¤¸¼ÂÖ³¾¥¹¿Ã׿¦º¾ÀÄØÀ§»¿ÁÅÙÁ¨¼ÀÂÆÚ©½ÁÇÛ¸ê¾Äܣī¿ÃÅݤŬÀÄÆÞ¥Æ­ÁÅÇߦÇ®ÂÆà½§ȯÉÍáɰÈÊÎâʱÉËÏã˲ÊÌÐä̳ËÑåÂÍ´ÈÎÒæÎµÉÍÏÓç϶ÊÎÐÔèзËÏÑÕéѸÌÐÖêÇÒ¹ÍÓ×ëÓºÎÒÔØìÔ»ÏÓÕÙíÕ¼ÐÔÖÚîÖ½ÑÕÛïÌ×¾ÒØÜðØ¿Ó×ÙÝñÙÀÔØÚÞòÚÁÕÙÛßóÛÂÖÚàôÑÜÃ×Ýõ¼ÝÄØÜÞö½ÞÅÙÝß÷¾߯ÚÞàø¿àÇÛßùÖÀáÈâæâÉáãçãÊâäèäËãåéåÌäêÛæÍáçëçÎâæèìèÏãçéíéÐäèêîêÑåéïàëÒæìðìÓçëíñíÔèìîòîÕéíïóïÖêîôåð×ëñõñØìðòöòÙíñó÷óÚîòôøôÛïóùêõÜðöÕöÝñõ÷Ö÷Þòöø×øßó÷ùØùàôøïÙÀ@€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿hypre-2.33.0/src/test/TEST_ij/data/poisson_10x10x10_np4/IJ.A.i8f4.00001.bin000066400000000000000000000765301477326011500247070ustar00rootroot00000000000000èè@úóúóúúúúúûûûûûüüüüüýýýýýþþþþÿÿÿÿÿÿ                                    !!!!!!"""""""#######$$$$$$$%%%%%%%&&&&&&'''''''((((((()))))))*******++++++,,,,,,------......//////0000011111112222222333333344444445555556666666777777788888889999999::::::;;;;;;;<<<<<<<=======>>>>>>>??????@@@@@@@AAAAAAABBBBBBBCCCCCCCDDDDDDEEEEEEFFFFFFGGGGGGHHHHHHIIIIIJJJJJJJKKKKKKKLLLLLLLMMMMMMMNNNNNNOOOOOOOPPPPPPPQQQQQQQRRRRRRRSSSSSSTTTTTTTUUUUUUUVVVVVVVWWWWWWWXXXXXXYYYYYYYZZZZZZZ[[[[[[[\\\\\\\]]]]]]^^^^^^______``````aaaaaabbbbbcccccccdddddddeeeeeeefffffffgggggghhhhhhhiiiiiiijjjjjjjkkkkkkkllllllmmmmmmmnnnnnnnooooooopppppppqqqqqqrrrrrrrssssssstttttttuuuuuuuvvvvvvwwwwwwxxxxxxyyyyyyzzzzzz{{{{{|||||||}}}}}}}~~~~~~~€€€€€€‚‚‚‚‚‚‚ƒƒƒƒƒƒƒ„„„„„„„………………†††††††‡‡‡‡‡‡‡ˆˆˆˆˆˆˆ‰‰‰‰‰‰‰ŠŠŠŠŠŠ‹‹‹‹‹‹‹ŒŒŒŒŒŒŒŽŽŽŽŽŽŽ‘‘‘‘‘‘’’’’’’““““““”””””•••••••–––––––———————˜˜˜˜˜˜˜™™™™™™ššššššš›››››››œœœœœœœžžžžžžŸŸŸŸŸŸŸ       ¡¡¡¡¡¡¡¢¢¢¢¢¢¢££££££¤¤¤¤¤¤¤¥¥¥¥¥¥¥¦¦¦¦¦¦¦§§§§§§§¨¨¨¨¨¨©©©©©©ªªªªªª««««««¬¬¬¬¬¬­­­­­®®®®®®®¯¯¯¯¯¯¯°°°°°°°±±±±±±±²²²²²²³³³³³³³´´´´´´´µµµµµµµ¶¶¶¶¶¶¶······¸¸¸¸¸¸¸¹¹¹¹¹¹¹ººººººº»»»»»»»¼¼¼¼¼¼½½½½½½½¾¾¾¾¾¾¾¿¿¿¿¿¿¿ÀÀÀÀÀÀÀÁÁÁÁÁÁÂÂÂÂÂÂÃÃÃÃÃÃÄÄÄÄÄÄÅÅÅÅÅÅÆÆÆÆÆÇÇÇÇÇÇÇÈÈÈÈÈÈÈÉÉÉÉÉÉÉÊÊÊÊÊÊÊËËËËËËÌÌÌÌÌÌÌÍÍÍÍÍÍÍÎÎÎÎÎÎÎÏÏÏÏÏÏÏÐÐÐÐÐÐÑÑÑÑÑÑÑÒÒÒÒÒÒÒÓÓÓÓÓÓÓÔÔÔÔÔÔÔÕÕÕÕÕÕÖÖÖÖÖÖÖ×××××××ØØØØØØØÙÙÙÙÙÙÙÚÚÚÚÚÚÛÛÛÛÛÜÜÜÜÜÝÝÝÝÝÞÞÞÞÞßßßßààààààááááááââââââããããããäääääååååååææææææççççççèèèèèèéééééêêêêêêëëëëëëììììììííííííîîîîîïïïïïïððððððññññññòòòòòòóóóóóúûÿûúüüûýýüþþýÿú ûÿüýþÿ      !  "   #   $   %  & 'î (ï )ð *ñ +òú,û-ü.ý/þ0ÿ1"23 4!5"6'#7 $8 !%9! &:" #';,# "$(<$ #%)=%  $&*>& !%+?'"(@1(#')A)$(*B *%)+C +&*D ,-1E6-,.2F.-/3G/.04H0/5I1,26J;2-137K3.248L4/359M504:N617;O@7268<P8379=Q9 48:>R:!59?S;"6<@TE<#7;=AU=$8<>BV>%9=?CW?&:>DX@';AYJ A(<@BZ!B)=AC["C*>BD\#D+?C]$E,FJ^OF-EGK_G.FHL`H/GIMaI0HNbJ1EKOcTK2FJLPdL3GKMQeM4HLNRfN5IMSgO6JPThYP7KOQUiQ8LPRVjR9MQSWkS:NRXlT;OUYm^U<PTVZnV=QUW[oW>RVX\pX?SW]qY@TZrc9ZAUY[s:[BVZ\t;\CW[]u<]DX\v=^E_cwh_F^`dx`G_aeyaH`bfzbIag{cJ^dh|mdK_cei}eL`dfj~fMaegkgNbfl€hOcimriPdhjn‚jQeikoƒkRfjlp„lSgkq…mThnr†wnUimos‡oVjnptˆpWkoqu‰qXlpvŠrYms‹|RsZnrtŒSt[osuTu\ptvŽUv]quVw^x|x_wy}‘y`xz~’zay{“{bz€”|cw}•†}dx|~‚–~ey}ƒ—fz~€„˜€g{…™h|‚†š‹‚i}ƒ‡›ƒj~‚„ˆœ„kƒ…‰…l€„Šž†m‡‹Ÿ‡n‚†ˆŒ ˆoƒ‡‰¡‰p„ˆŠŽ¢Šq…‰£‹r†Œ¤•kŒs‡‹¥ltˆŒŽ¦mŽu‰§nvŠŽ¨ow‘•©š‘x’–ª’y‘“—«“z’”˜¬”{“™­•|–š®Ÿ–}‘•—›¯—~’–˜œ°˜“—™±™€”˜ž²š•›Ÿ³¤›‚–šœ ´œƒ—›¡µ„˜œž¢¶ž…™£·Ÿ†š ¤¸© ‡›Ÿ¡¥¹¡ˆœ ¢¦º¢‰¡£§»£Šž¢¨¼¤‹Ÿ¥½®„¥Œ ¤¦¾…¦¡¥§¿†§Ž¢¦¨À‡¨£§Áˆ©ª®Â³ª‘©«¯Ã«’ª¬°Ä¬“«­±Å­”¬²Æ®•©¯³Ç¸¯–ª®°´È°—«¯±µÉ±˜¬°²¶Ê²™­±·Ë³š®´¸Ì½´›¯³µ¹Íµœ°´¶ºÎ¶±µ·»Ï·ž²¶¼Ð¸Ÿ³¹½Ñ¹ ´¸º¾Òº¡µ¹»¿Ó»¢¶º¼ÀÔ¼£·»ÁÕ½¤¸¾ÖǾ¥¹½¿×ž¿¦º¾ÀØŸÀ§»¿ÁÙ Á¨¼Àڡ©ÃÇÛÌêÂÄÈÜÄ«ÃÅÉÝŬįÊÞÆ­ÅËßÇ®ÂÈÌàÑȯÃÇÉÍáɰÄÈÊÎâʱÅÉËÏã˲ÆÊÐä̳ÇÍÑåÖÍ´ÈÌÎÒæÎµÉÍÏÓç϶ÊÎÐÔèзËÏÕéѸÌÒÖêÛÒ¹ÍÑÓ×ëÓºÎÒÔØìÔ»ÏÓÕÙíÕ¼ÐÔÚîÖ½Ñ×ïà¶×¾ÒÖØð·Ø¿Ó×Ùñ¸ÙÀÔØÚò¹ÚÁÕÙóºÛÂÜàåÜÃÛÝáÝÄÜÞâÞÅÝßã߯ÞäàÇÛáåêáÈÜàâæâÉÝáãçãÊÞâäèäËßãéåÌàæêïæÍáåçëçÎâæèìèÏãçéíéÐäèîêÑåëïôëÒæêìðìÓçëíñíÔèìîòîÕéíóïÖêðùÏð×ëïñÐñØìðòÑòÙíñóÒóÚîòÓÀ@€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿hypre-2.33.0/src/test/TEST_ij/data/poisson_10x10x10_np4/IJ.A.i8f4.00002.bin000066400000000000000000000765301477326011500247100ustar00rootroot00000000000000èè@ôíôíôôôôôõõõõõõöööööö÷÷÷÷÷÷øøøøøøùùùùùúúúúúúûûûûûûüüüüüüýýýýýýþþþþþÿÿÿÿÿÿ                                 !!!!!""""""######$$$$$$%%%%%%&&&&&&'''''''((((((()))))))*******++++++,,,,,,,-------.......///////00000011111112222222333333344444445555556666666777777788888889999999:::::;;;;;;<<<<<<======>>>>>>??????@@@@@@@AAAAAAABBBBBBBCCCCCCCDDDDDDEEEEEEEFFFFFFFGGGGGGGHHHHHHHIIIIIIJJJJJJJKKKKKKKLLLLLLLMMMMMMMNNNNNNOOOOOOOPPPPPPPQQQQQQQRRRRRRRSSSSSTTTTTTUUUUUUVVVVVVWWWWWWXXXXXXYYYYYYYZZZZZZZ[[[[[[[\\\\\\\]]]]]]^^^^^^^_______```````aaaaaaabbbbbbcccccccdddddddeeeeeeefffffffgggggghhhhhhhiiiiiiijjjjjjjkkkkkkklllllmmmmmmnnnnnnooooooppppppqqqqqqrrrrrrrssssssstttttttuuuuuuuvvvvvvwwwwwwwxxxxxxxyyyyyyyzzzzzzz{{{{{{|||||||}}}}}}}~~~~~~~€€€€€€‚‚‚‚‚‚‚ƒƒƒƒƒƒƒ„„„„„„„……………††††††‡‡‡‡‡‡ˆˆˆˆˆˆ‰‰‰‰‰‰ŠŠŠŠŠŠ‹‹‹‹‹‹‹ŒŒŒŒŒŒŒŽŽŽŽŽŽŽ‘‘‘‘‘‘‘’’’’’’’“““““““””””””•••••••–––––––———————˜˜˜˜˜˜˜™™™™™™ššššššš›››››››œœœœœœœžžžžžŸŸŸŸŸŸ      ¡¡¡¡¡¡¢¢¢¢¢¢££££££¤¤¤¤¤¤¤¥¥¥¥¥¥¥¦¦¦¦¦¦¦§§§§§§§¨¨¨¨¨¨©©©©©©©ªªªªªªª«««««««¬¬¬¬¬¬¬­­­­­­®®®®®®®¯¯¯¯¯¯¯°°°°°°°±±±±±±±²²²²²²³³³³³³³´´´´´´´µµµµµµµ¶¶¶¶¶¶¶·····¸¸¸¸¸¸¹¹¹¹¹¹ºººººº»»»»»»¼¼¼¼¼¼½½½½½½½¾¾¾¾¾¾¾¿¿¿¿¿¿¿ÀÀÀÀÀÀÀÁÁÁÁÁÁÂÂÂÂÂÂÂÃÃÃÃÃÃÃÄÄÄÄÄÄÄÅÅÅÅÅÅÅÆÆÆÆÆÆÇÇÇÇÇÇÇÈÈÈÈÈÈÈÉÉÉÉÉÉÉÊÊÊÊÊÊÊËËËËËËÌÌÌÌÌÌÌÍÍÍÍÍÍÍÎÎÎÎÎÎÎÏÏÏÏÏÏÏÐÐÐÐÐÑÑÑÑÑÑÒÒÒÒÒÒÓÓÓÓÓÓÔÔÔÔÔÔÕÕÕÕÕÖÖÖÖÖÖ××××××ØØØØØØÙÙÙÙÙÙÚÚÚÚÚÛÛÛÛÛÛÜÜÜÜÜÜÝÝÝÝÝÝÞÞÞÞÞÞßßßßßààààààááááááââââââããããããäääääååååååææææææççççççèèèèèèééééêêêêêëëëëëìììììíííííôõù õôöúöõ÷û÷öøüø÷ýîùôúþúõùûÿûöúüü÷ûýýøüóþùÿÿúþûÿüýøþÿ     ý !  "   #   $  % ô&-õ '.ö(/÷)0ø*1ù +ú,û-ü.ý/ þ0ÿ123 4!5"6#7 $8 %9!":" !#;# "$<$ #%=%  $>& '+?F'&(,@G(')-AH)(*.BI*)/CJ +&,0D,'+-1E-(,.2F.)-/3G/*.4H%0+15I1,026J2-137K3.248L4/39M*506:N6157;O7268<P8379=Q9 48>R/:!5;S;"6:<T<#7;=U=$8<>V>%9=W4?&@DX_@'?AEY`A(@BFZaB)ACG[bC*BH\c9D+?EI]E,@DFJ^F-AEGK_G.BFHL`H/CGMa>I0DJNbJ1EIKOcK2FJLPdL3GKMQeM4HLRfCN5IOSgO6JNPThP7KOQUiQ8LPRVjR9MQWkHS:NTlT;OSUmU<PTVnV=QUWoW>RVpMX?Y]qxY@XZ^ryZAY[_sz[BZ\`t{\C[au|R]DX^bv^EY]_cw_FZ^`dx`G[_aeyaH\`fzWbI]cg{cJ^bdh|dK_cei}eL`dfj~fMaek\gNbhl€hOcgimiPdhjn‚jQeikoƒkRfjp„alSgm…mThln†nUimo‡oVjnpˆpWko‰fqXrvŠ‘rYqsw‹’sZrtxŒ“t[suy”u\tzŽ•kv]qw{w^rvx|x_swy}‘y`txz~’zauy“p{bv|€”|cw{}•}dx|~‚–~ey}ƒ—fz~„˜u€g{…™h|€‚†š‚i}ƒ‡›ƒj~‚„ˆœ„kƒ‰z…l€†ž†m…‡Ÿ‡n‚†ˆ ˆoƒ‡‰¡‰p„ˆ¢Šq‹£ª‹rŠŒ¤«Œs‹‘¥¬tŒŽ’¦­Žu“§®„vŠ”¨w‹‘•©‘xŒ’–ª’y‘“—«“zŽ’˜¬‰”{•™­•|”–š®–}‘•—›¯—~’–˜œ°˜“—±Ž™€”šž²š•™›Ÿ³›‚–šœ ´œƒ—›¡µ„˜œ¢¶“ž…™Ÿ·Ÿ†šž ¸ ‡›Ÿ¡¹¡ˆœ ¢º¢‰¡»˜£Š¤¨¼ä‹£¥©½Ä¥Œ¤¦ª¾Ŧ¥§«¿Ƨަ¬ÀǨ£©­Á©¤¨ª®Âª‘¥©«¯Ã«’¦ª¬°Ä¬“§«±Å¢­”¨®²Æ®•©­¯³Ç¯–ª®°´È°—«¯±µÉ±˜¬°¶Ê§²™­³·Ë³š®²´¸Ì´›¯³µ¹Íµœ°´¶ºÎ¶±µ»Ï¬·ž²¸Ð¸Ÿ³·¹Ñ¹ ´¸ºÒº¡µ¹»Ó»¢¶ºÔ±¼£½ÁÕܽ¤¼¾ÂÖݾ¥½¿Ã×Þ¿¦¾ÀÄØßÀ§¿ÅÙà¶Á¨¼ÂÆÚ©½ÁÃÇÛê¾ÂÄÈÜÄ«¿ÃÅÉÝŬÀÄÊ޻ƭÁÇËßÇ®ÂÆÈÌàȯÃÇÉÍáɰÄÈÊÎâʱÅÉÏãÀ˲ÆÌÐä̳ÇËÍÑåÍ´ÈÌÎÒæÎµÉÍÏÓç϶ÊÎÔèÅзËÑéѸÌÐÒêÒ¹ÍÑÓëÓºÎÒÔìÔ»ÏÓíÊÕ¼ÖÚõÖ½Õ×Ûö×¾ÖØÜ÷Ø¿×ÙÝøÙÀØÞùÏÚÁÕÛßÛÂÖÚÜàÜÃ×ÛÝáÝÄØÜÞâÞÅÙÝãÔ߯ÚàäàÇÛßáåáÈÜàâæâÉÝáãçãÊÞâèÙäËßåéåÌàäæêæÍáåçëçÎâæèìèÏãçíÞéÐäêêÑåéëëÒæêììÓçëííÔèìãÀ@€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿hypre-2.33.0/src/test/TEST_ij/data/poisson_10x10x10_np4/IJ.A.i8f4.00003.bin000066400000000000000000000765301477326011500247110ustar00rootroot00000000000000èè@îçîçîîîîîîïïïïïïððððððññññññòòòòòóóóóóóôôôôôôõõõõõõöööööö÷÷÷÷÷øøøøøøùùùùùùúúúúúúûûûûûûüüüüüýýýýýýþþþþþþÿÿÿÿÿÿ                                         !!!!!!!"""""""#######$$$$$$%%%%%%%&&&&&&&'''''''((((((())))))*******+++++++,,,,,,,-------......///////000000011111112222222333333444444555555666666777777888889999999:::::::;;;;;;;<<<<<<<======>>>>>>>???????@@@@@@@AAAAAAABBBBBBCCCCCCCDDDDDDDEEEEEEEFFFFFFFGGGGGGHHHHHHHIIIIIIIJJJJJJJKKKKKKKLLLLLLMMMMMMNNNNNNOOOOOOPPPPPPQQQQQRRRRRRRSSSSSSSTTTTTTTUUUUUUUVVVVVVWWWWWWWXXXXXXXYYYYYYYZZZZZZZ[[[[[[\\\\\\\]]]]]]]^^^^^^^_______``````aaaaaaabbbbbbbcccccccdddddddeeeeeeffffffgggggghhhhhhiiiiiijjjjjkkkkkkklllllllmmmmmmmnnnnnnnoooooopppppppqqqqqqqrrrrrrrsssssssttttttuuuuuuuvvvvvvvwwwwwwwxxxxxxxyyyyyyzzzzzzz{{{{{{{|||||||}}}}}}}~~~~~~€€€€€€‚‚‚‚‚‚ƒƒƒƒƒ„„„„„„„…………………†††††††‡‡‡‡‡‡‡ˆˆˆˆˆˆ‰‰‰‰‰‰‰ŠŠŠŠŠŠŠ‹‹‹‹‹‹‹ŒŒŒŒŒŒŒŽŽŽŽŽŽŽ‘‘‘‘‘‘‘’’’’’’“““““““”””””””•••••••–––––––——————˜˜˜˜˜˜™™™™™™šššššš››››››œœœœœžžžžžžžŸŸŸŸŸŸŸ       ¡¡¡¡¡¡¢¢¢¢¢¢¢£££££££¤¤¤¤¤¤¤¥¥¥¥¥¥¥¦¦¦¦¦¦§§§§§§§¨¨¨¨¨¨¨©©©©©©©ªªªªªªª««««««¬¬¬¬¬¬¬­­­­­­­®®®®®®®¯¯¯¯¯¯¯°°°°°°±±±±±±²²²²²²³³³³³³´´´´´´µµµµµ¶¶¶¶¶¶¶·······¸¸¸¸¸¸¸¹¹¹¹¹¹¹ºººººº»»»»»»»¼¼¼¼¼¼¼½½½½½½½¾¾¾¾¾¾¾¿¿¿¿¿¿ÀÀÀÀÀÀÀÁÁÁÁÁÁÁÂÂÂÂÂÂÂÃÃÃÃÃÃÃÄÄÄÄÄÄÅÅÅÅÅÅÅÆÆÆÆÆÆÆÇÇÇÇÇÇÇÈÈÈÈÈÈÈÉÉÉÉÉÉÊÊÊÊÊÊËËËËËËÌÌÌÌÌÌÍÍÍÍÍÍÎÎÎÎÎÏÏÏÏÏÏÐÐÐÐÐÐÑÑÑÑÑÑÒÒÒÒÒÒÓÓÓÓÓÔÔÔÔÔÔÕÕÕÕÕÕÖÖÖÖÖÖ××××××ØØØØØÙÙÙÙÙÙÚÚÚÚÚÚÛÛÛÛÛÛÜÜÜÜÜÜÝÝÝÝÝÞÞÞÞÞÞßßßßßßààààààááááááâââââãããããäääääåååååæææææççççîïóøïîðôðïñõ ñðòö òñ÷ óîôø ýôïóõù õðôöúöñõ÷û÷òöüøóùýùôøúþúõùûÿûöúüü÷ûýøþþùýÿÿúþûÿüý þÿî  'ï  !( ð ") ñ  #* ò $+ ó % ô &õ  'ö (÷ )ø *ù +ú,û-ü.ý/ þ0ÿ1234%5678 !%9@*! "&:A" !#';B# "$(<C$ #)=D%  &*>/& !%'+?'"&(,@(#')-A)$(.B*%+/C4+&*,0D,'+-1E-(,.2F.)-3G/*04H90+/15I1,026J2-137K3.28L4/5M>5046N6157O7268P837Q9 :>RYC:!9;?SZ;":<@T[<#;=AU\=$<BV]>%9?CWH?&:>@DX@';?AEYA(<@BFZB)=AG[C*>DH\MD+?CEI]E,@DFJ^F-AEGK_G.BFL`H/CIMaRI0DHJNbJ1EIKOcK2FJLPdL3GKQeM4HNfWN5IMOgO6JNPhP7KOQiQ8LPjR9SWkr\S:RTXlsT;SUYmtU<TVZnuV=U[ovW>RX\paX?SWY]qY@TXZ^rZAUY[_s[BVZ`t\CW]auf]DX\^bv^EY]_cw_FZ^`dx`G[_eyaH\bfzkbI]acg{cJ^bdh|dK_cei}eL`dj~fMagpgNbfh€hOcgiiPdhj‚jQeiƒkRlp„‹ulSkmq…ŒmTlnr†nUmos‡ŽoVntˆpWkqu‰zqXlprvŠrYmqsw‹sZnrtxŒt[osyu\pvzŽv]quw{w^rvx|x_swy}‘y`tx~’zau{“„{bvz|€”|cw{}•}dx|~‚–~ey}ƒ—fz€˜‰€g{™h|€‚š‚i}ƒ›ƒj~‚œ„k…‰¤Ž…l„†Šž¥†m…‡‹Ÿ¦‡n†ˆŒ §ˆo‡¡¨‰p„ŠŽ¢“Šq…‰‹£‹r†ŠŒ¤Œs‡‹‘¥tˆŒ’¦Žu‰“§˜vŠŽ”¨w‹‘•©‘xŒ’–ª’y‘—«“zŽ”˜¬”{“•™­•|”–š®–}‘•—›¯—~’–œ°˜“™±¢™€”˜š²š•™›³›‚–šœ´œƒ—›µ„ž¢¶½§ž…Ÿ£·¾Ÿ†ž ¤¸¿ ‡Ÿ¡¥¹À¡ˆ ¦ºÁ¢‰£§»¬£Šž¢¤¨¼¤‹Ÿ£¥©½¥Œ ¤¦ª¾¦¡¥«¿§Ž¢¨¬À±¨£§©­Á©¤¨ª®Âª‘¥©«¯Ã«’¦ª°Ä¬“§­±Å¶­”¨¬®²Æ®•©­¯³Ç¯–ª®°´È°—«¯µÉ±˜¬²Ê»²™­±³Ë³š®²´Ì´›¯³µÍµœ°´Î¶·»ÏÖÀ·ž¶¸¼Ð׸Ÿ·¹½Ñع ¸º¾ÒÙº¡¹¿ÓÚ»¢¶¼ÀÔż£·»½ÁÕ½¤¸¼¾ÂÖ¾¥¹½¿Ã׿¦º¾ÄØÀ§»ÁÅÙÊÁ¨¼ÀÂÆÚ©½ÁÃÇÛê¾ÂÄÈÜÄ«¿ÃÉÝŬÀÆÊÞÏÆ­ÁÅÇËßÇ®ÂÆÈÌàȯÃÇÉÍáɰÄÈÎâʱÅËãÔ˲ÆÊÌä̳ÇËÍåÍ´ÈÌÎæÎµÉÍç϶ÐÔïÙзÏÑÕðѸÐÒÖñÒ¹ÑÓ×òÓºÒØóÔ»ÏÕÙÞÕ¼ÐÔÖÚÖ½ÑÕ×Û×¾ÒÖØÜØ¿Ó×ÝÙÀÔÚÞãÚÁÕÙÛßÛÂÖÚÜàÜÃ×ÛÝáÝÄØÜâÞÅÙßãè߯ÚÞàäàÇÛßáåáÈÜàâæâÉÝáçãÊÞäíäËßãååÌàäææÍáåççÎâæÀ@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿€¿À@€¿€¿€¿hypre-2.33.0/src/test/TEST_ij/data/poisson_10x10x10_np4/IJ.A.i8f8.00000.bin000066400000000000000000001131301477326011500246760ustar00rootroot00000000000000èè@ùù  !!!!!!!"""""""######$$$$$$$%%%%%%%&&&&&&&'''''''(((((()))))))*******+++++++,,,,,,,------.......///////000000011111112222233333344444455555566666677777788888889999999:::::::;;;;;;;<<<<<<=======>>>>>>>???????@@@@@@@AAAAAABBBBBBBCCCCCCCDDDDDDDEEEEEEEFFFFFFGGGGGGGHHHHHHHIIIIIIIJJJJJJJKKKKKLLLLLLMMMMMMNNNNNNOOOOOOPPPPPPQQQQQQQRRRRRRRSSSSSSSTTTTTTTUUUUUUVVVVVVVWWWWWWWXXXXXXXYYYYYYYZZZZZZ[[[[[[[\\\\\\\]]]]]]]^^^^^^^______```````aaaaaaabbbbbbbcccccccdddddeeeeeeffffffgggggghhhhhhiiiiiijjjjjjjkkkkkkklllllllmmmmmmmnnnnnnooooooopppppppqqqqqqqrrrrrrrsssssstttttttuuuuuuuvvvvvvvwwwwwwwxxxxxxyyyyyyyzzzzzzz{{{{{{{|||||||}}}}}~~~~~~€€€€€€‚‚‚‚‚‚ƒƒƒƒƒƒƒ„„„„„„„…………………†††††††‡‡‡‡‡‡ˆˆˆˆˆˆˆ‰‰‰‰‰‰‰ŠŠŠŠŠŠŠ‹‹‹‹‹‹‹ŒŒŒŒŒŒŽŽŽŽŽŽŽ‘‘‘‘‘‘’’’’’’’“““““““”””””””•••••••–––––——————˜˜˜˜˜˜™™™™™™šššššš››››››œœœœœœœžžžžžžžŸŸŸŸŸŸŸ      ¡¡¡¡¡¡¡¢¢¢¢¢¢¢£££££££¤¤¤¤¤¤¤¥¥¥¥¥¥¦¦¦¦¦¦¦§§§§§§§¨¨¨¨¨¨¨©©©©©©©ªªªªªª«««««««¬¬¬¬¬¬¬­­­­­­­®®®®®®®¯¯¯¯¯°°°°°°±±±±±±²²²²²²³³³³³³´´´´´´µµµµµµµ¶¶¶¶¶¶¶·······¸¸¸¸¸¸¸¹¹¹¹¹¹ººººººº»»»»»»»¼¼¼¼¼¼¼½½½½½½½¾¾¾¾¾¾¿¿¿¿¿¿¿ÀÀÀÀÀÀÀÁÁÁÁÁÁÁÂÂÂÂÂÂÂÃÃÃÃÃÃÄÄÄÄÄÄÄÅÅÅÅÅÅÅÆÆÆÆÆÆÆÇÇÇÇÇÇÇÈÈÈÈÈÉÉÉÉÉÉÊÊÊÊÊÊËËËËËËÌÌÌÌÌÌÍÍÍÍÍÍÎÎÎÎÎÎÎÏÏÏÏÏÏÏÐÐÐÐÐÐÐÑÑÑÑÑÑÑÒÒÒÒÒÒÓÓÓÓÓÓÓÔÔÔÔÔÔÔÕÕÕÕÕÕÕÖÖÖÖÖÖÖ××××××ØØØØØØØÙÙÙÙÙÙÙÚÚÚÚÚÚÚÛÛÛÛÛÛÛÜÜÜÜÜÜÝÝÝÝÝÝÝÞÞÞÞÞÞÞßßßßßßßàààààààááááâââââãããããäääääåååååæææææççççççèèèèèèééééééêêêêêêëëëëëììììììííííííîîîîîîïïïïïïðððððññññññòòòòòòóóóóóóôôôôôôõõõõõöööööö÷÷÷÷÷÷øøøøøøùùùùùù ú    ! "ÿ  #  $  %  & ' ( ) * +, -ô.õ/ö0÷1ø23 4!5"6#7 $8 !%9! "&:" !';# $(<$ #%)=% $&*>& !%'+?'"&,@(#)-A)$(*.B*%)+/C+&*,0D,'+1E"-(.F .)-/G/*.0H0+/1I1,0J'237K3248L4359M546:N65;O,728<P8379=Q9 48:>R:!59;?S;"6:@T1<#7=AU=$8<>BV>%9=?CW?&:>@DX@';?EY6A(<BFZB)=ACG[C*>BDH\D+?CEI]E,@DJ^;F-AG_&G.BFH`'H/CGIa(I0DHJb)J1EIc@*K2LPdL3KMQeM4LNRfN5MOSgO6NThEP7KQUiQ8LPRVjR9MQSWkS:NRTXlT;OSYmJU<PVZnV=QUW[oW>RVX\pX?SWY]qY@TX^rOZAU[_s[BVZ\`t\CW[]au]DX\^bv^EY]cwT_FZ`x?`G[_ay@aH\`bzAbI]ac{BcJ^b|YCdKei}eLdfj~fMegkgNfhl€hOgm^iPdjn‚jQeikoƒkRfjlp„lSgkmq…mThlr†cnUios‡oVjnptˆpWkoqu‰qXlprvŠrYmqw‹hsZntxŒt[osuyu\ptvzŽv]quw{w^rv|mx_sy‘Xy`txz’Yzauy{“Z{bvz|”[|cw{•r\}d~‚–~e}ƒ—f~€„˜€g…™h€†šw‚i}ƒ‡›ƒj~‚„ˆœ„kƒ…‰…l€„†Šž†m…‹Ÿ|‡n‚ˆŒ ˆoƒ‡‰¡‰p„ˆŠŽ¢Šq…‰‹£‹r†Š¤Œs‡‘¥tˆŒŽ’¦Žu‰“§vŠŽ”¨w‹•©†‘xŒ’ªq’y‘“«r“zŽ’”¬s”{“•­t•|”®‹u–}—›¯—~–˜œ°˜—™±™€˜šž²š™Ÿ³›‚–œ ´œƒ—›¡µ„˜œž¢¶ž…™Ÿ£·Ÿ†šž¤¸• ‡›¡¥¹¡ˆœ ¢¦º¢‰¡£§»£Šž¢¤¨¼¤‹Ÿ£©½š¥Œ ¦ª¾¦¡¥§«¿§Ž¢¦¨¬À¨£§©­Á©¤¨®ÂŸª‘¥«ÃŠ«’¦ª¬Ä‹¬“§«­ÅŒ­”¨¬®Æ®•©­Ç¤Ž¯–°´È°—¯±µÉ±˜°²¶Ê²™±³·Ë³š²¸Ì©´›¯µ¹Íµœ°´¶ºÎ¶±µ·»Ï·ž²¶¸¼Ð¸Ÿ³·½Ñ®¹ ´º¾Òº¡µ¹»¿Ó»¢¶º¼ÀÔ¼£·»½ÁÕ½¤¸¼ÂÖ³¾¥¹¿Ã׿¦º¾ÀÄØÀ§»¿ÁÅÙÁ¨¼ÀÂÆÚ©½ÁÇÛ¸ê¾Äܣī¿ÃÅݤŬÀÄÆÞ¥Æ­ÁÅÇߦÇ®ÂÆà½§ȯÉÍáɰÈÊÎâʱÉËÏã˲ÊÌÐä̳ËÑåÂÍ´ÈÎÒæÎµÉÍÏÓç϶ÊÎÐÔèзËÏÑÕéѸÌÐÖêÇÒ¹ÍÓ×ëÓºÎÒÔØìÔ»ÏÓÕÙíÕ¼ÐÔÖÚîÖ½ÑÕÛïÌ×¾ÒØÜðØ¿Ó×ÙÝñÙÀÔØÚÞòÚÁÕÙÛßóÛÂÖÚàôÑÜÃ×Ýõ¼ÝÄØÜÞö½ÞÅÙÝß÷¾߯ÚÞàø¿àÇÛßùÖÀáÈâæâÉáãçãÊâäèäËãåéåÌäêÛæÍáçëçÎâæèìèÏãçéíéÐäèêîêÑåéïàëÒæìðìÓçëíñíÔèìîòîÕéíïóïÖêîôåð×ëñõñØìðòöòÙíñó÷óÚîòôøôÛïóùêõÜðöÕöÝñõ÷Ö÷Þòöø×øßó÷ùØùàôøïÙ@ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿hypre-2.33.0/src/test/TEST_ij/data/poisson_10x10x10_np4/IJ.A.i8f8.00001.bin000066400000000000000000001131301477326011500246770ustar00rootroot00000000000000èè@úóúóúúúúúûûûûûüüüüüýýýýýþþþþÿÿÿÿÿÿ                                    !!!!!!"""""""#######$$$$$$$%%%%%%%&&&&&&'''''''((((((()))))))*******++++++,,,,,,------......//////0000011111112222222333333344444445555556666666777777788888889999999::::::;;;;;;;<<<<<<<=======>>>>>>>??????@@@@@@@AAAAAAABBBBBBBCCCCCCCDDDDDDEEEEEEFFFFFFGGGGGGHHHHHHIIIIIJJJJJJJKKKKKKKLLLLLLLMMMMMMMNNNNNNOOOOOOOPPPPPPPQQQQQQQRRRRRRRSSSSSSTTTTTTTUUUUUUUVVVVVVVWWWWWWWXXXXXXYYYYYYYZZZZZZZ[[[[[[[\\\\\\\]]]]]]^^^^^^______``````aaaaaabbbbbcccccccdddddddeeeeeeefffffffgggggghhhhhhhiiiiiiijjjjjjjkkkkkkkllllllmmmmmmmnnnnnnnooooooopppppppqqqqqqrrrrrrrssssssstttttttuuuuuuuvvvvvvwwwwwwxxxxxxyyyyyyzzzzzz{{{{{|||||||}}}}}}}~~~~~~~€€€€€€‚‚‚‚‚‚‚ƒƒƒƒƒƒƒ„„„„„„„………………†††††††‡‡‡‡‡‡‡ˆˆˆˆˆˆˆ‰‰‰‰‰‰‰ŠŠŠŠŠŠ‹‹‹‹‹‹‹ŒŒŒŒŒŒŒŽŽŽŽŽŽŽ‘‘‘‘‘‘’’’’’’““““““”””””•••••••–––––––———————˜˜˜˜˜˜˜™™™™™™ššššššš›››››››œœœœœœœžžžžžžŸŸŸŸŸŸŸ       ¡¡¡¡¡¡¡¢¢¢¢¢¢¢££££££¤¤¤¤¤¤¤¥¥¥¥¥¥¥¦¦¦¦¦¦¦§§§§§§§¨¨¨¨¨¨©©©©©©ªªªªªª««««««¬¬¬¬¬¬­­­­­®®®®®®®¯¯¯¯¯¯¯°°°°°°°±±±±±±±²²²²²²³³³³³³³´´´´´´´µµµµµµµ¶¶¶¶¶¶¶······¸¸¸¸¸¸¸¹¹¹¹¹¹¹ººººººº»»»»»»»¼¼¼¼¼¼½½½½½½½¾¾¾¾¾¾¾¿¿¿¿¿¿¿ÀÀÀÀÀÀÀÁÁÁÁÁÁÂÂÂÂÂÂÃÃÃÃÃÃÄÄÄÄÄÄÅÅÅÅÅÅÆÆÆÆÆÇÇÇÇÇÇÇÈÈÈÈÈÈÈÉÉÉÉÉÉÉÊÊÊÊÊÊÊËËËËËËÌÌÌÌÌÌÌÍÍÍÍÍÍÍÎÎÎÎÎÎÎÏÏÏÏÏÏÏÐÐÐÐÐÐÑÑÑÑÑÑÑÒÒÒÒÒÒÒÓÓÓÓÓÓÓÔÔÔÔÔÔÔÕÕÕÕÕÕÖÖÖÖÖÖÖ×××××××ØØØØØØØÙÙÙÙÙÙÙÚÚÚÚÚÚÛÛÛÛÛÜÜÜÜÜÝÝÝÝÝÞÞÞÞÞßßßßààààààááááááââââââããããããäääääååååååææææææççççççèèèèèèéééééêêêêêêëëëëëëììììììííííííîîîîîïïïïïïððððððññññññòòòòòòóóóóóúûÿûúüüûýýüþþýÿú ûÿüýþÿ      !  "   #   $   %  & 'î (ï )ð *ñ +òú,û-ü.ý/þ0ÿ1"23 4!5"6'#7 $8 !%9! &:" #';,# "$(<$ #%)=%  $&*>& !%+?'"(@1(#')A)$(*B *%)+C +&*D ,-1E6-,.2F.-/3G/.04H0/5I1,26J;2-137K3.248L4/359M504:N617;O@7268<P8379=Q9 48:>R:!59?S;"6<@TE<#7;=AU=$8<>BV>%9=?CW?&:>DX@';AYJ A(<@BZ!B)=AC["C*>BD\#D+?C]$E,FJ^OF-EGK_G.FHL`H/GIMaI0HNbJ1EKOcTK2FJLPdL3GKMQeM4HLNRfN5IMSgO6JPThYP7KOQUiQ8LPRVjR9MQSWkS:NRXlT;OUYm^U<PTVZnV=QUW[oW>RVX\pX?SW]qY@TZrc9ZAUY[s:[BVZ\t;\CW[]u<]DX\v=^E_cwh_F^`dx`G_aeyaH`bfzbIag{cJ^dh|mdK_cei}eL`dfj~fMaegkgNbfl€hOcimriPdhjn‚jQeikoƒkRfjlp„lSgkq…mThnr†wnUimos‡oVjnptˆpWkoqu‰qXlpvŠrYms‹|RsZnrtŒSt[osuTu\ptvŽUv]quVw^x|x_wy}‘y`xz~’zay{“{bz€”|cw}•†}dx|~‚–~ey}ƒ—fz~€„˜€g{…™h|‚†š‹‚i}ƒ‡›ƒj~‚„ˆœ„kƒ…‰…l€„Šž†m‡‹Ÿ‡n‚†ˆŒ ˆoƒ‡‰¡‰p„ˆŠŽ¢Šq…‰£‹r†Œ¤•kŒs‡‹¥ltˆŒŽ¦mŽu‰§nvŠŽ¨ow‘•©š‘x’–ª’y‘“—«“z’”˜¬”{“™­•|–š®Ÿ–}‘•—›¯—~’–˜œ°˜“—™±™€”˜ž²š•›Ÿ³¤›‚–šœ ´œƒ—›¡µ„˜œž¢¶ž…™£·Ÿ†š ¤¸© ‡›Ÿ¡¥¹¡ˆœ ¢¦º¢‰¡£§»£Šž¢¨¼¤‹Ÿ¥½®„¥Œ ¤¦¾…¦¡¥§¿†§Ž¢¦¨À‡¨£§Áˆ©ª®Â³ª‘©«¯Ã«’ª¬°Ä¬“«­±Å­”¬²Æ®•©¯³Ç¸¯–ª®°´È°—«¯±µÉ±˜¬°²¶Ê²™­±·Ë³š®´¸Ì½´›¯³µ¹Íµœ°´¶ºÎ¶±µ·»Ï·ž²¶¼Ð¸Ÿ³¹½Ñ¹ ´¸º¾Òº¡µ¹»¿Ó»¢¶º¼ÀÔ¼£·»ÁÕ½¤¸¾ÖǾ¥¹½¿×ž¿¦º¾ÀØŸÀ§»¿ÁÙ Á¨¼Àڡ©ÃÇÛÌêÂÄÈÜÄ«ÃÅÉÝŬįÊÞÆ­ÅËßÇ®ÂÈÌàÑȯÃÇÉÍáɰÄÈÊÎâʱÅÉËÏã˲ÆÊÐä̳ÇÍÑåÖÍ´ÈÌÎÒæÎµÉÍÏÓç϶ÊÎÐÔèзËÏÕéѸÌÒÖêÛÒ¹ÍÑÓ×ëÓºÎÒÔØìÔ»ÏÓÕÙíÕ¼ÐÔÚîÖ½Ñ×ïà¶×¾ÒÖØð·Ø¿Ó×Ùñ¸ÙÀÔØÚò¹ÚÁÕÙóºÛÂÜàåÜÃÛÝáÝÄÜÞâÞÅÝßã߯ÞäàÇÛáåêáÈÜàâæâÉÝáãçãÊÞâäèäËßãéåÌàæêïæÍáåçëçÎâæèìèÏãçéíéÐäèîêÑåëïôëÒæêìðìÓçëíñíÔèìîòîÕéíóïÖêðùÏð×ëïñÐñØìðòÑòÙíñóÒóÚîòÓ@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿hypre-2.33.0/src/test/TEST_ij/data/poisson_10x10x10_np4/IJ.A.i8f8.00002.bin000066400000000000000000001131301477326011500247000ustar00rootroot00000000000000èè@ôíôíôôôôôõõõõõõöööööö÷÷÷÷÷÷øøøøøøùùùùùúúúúúúûûûûûûüüüüüüýýýýýýþþþþþÿÿÿÿÿÿ                                 !!!!!""""""######$$$$$$%%%%%%&&&&&&'''''''((((((()))))))*******++++++,,,,,,,-------.......///////00000011111112222222333333344444445555556666666777777788888889999999:::::;;;;;;<<<<<<======>>>>>>??????@@@@@@@AAAAAAABBBBBBBCCCCCCCDDDDDDEEEEEEEFFFFFFFGGGGGGGHHHHHHHIIIIIIJJJJJJJKKKKKKKLLLLLLLMMMMMMMNNNNNNOOOOOOOPPPPPPPQQQQQQQRRRRRRRSSSSSTTTTTTUUUUUUVVVVVVWWWWWWXXXXXXYYYYYYYZZZZZZZ[[[[[[[\\\\\\\]]]]]]^^^^^^^_______```````aaaaaaabbbbbbcccccccdddddddeeeeeeefffffffgggggghhhhhhhiiiiiiijjjjjjjkkkkkkklllllmmmmmmnnnnnnooooooppppppqqqqqqrrrrrrrssssssstttttttuuuuuuuvvvvvvwwwwwwwxxxxxxxyyyyyyyzzzzzzz{{{{{{|||||||}}}}}}}~~~~~~~€€€€€€‚‚‚‚‚‚‚ƒƒƒƒƒƒƒ„„„„„„„……………††††††‡‡‡‡‡‡ˆˆˆˆˆˆ‰‰‰‰‰‰ŠŠŠŠŠŠ‹‹‹‹‹‹‹ŒŒŒŒŒŒŒŽŽŽŽŽŽŽ‘‘‘‘‘‘‘’’’’’’’“““““““””””””•••••••–––––––———————˜˜˜˜˜˜˜™™™™™™ššššššš›››››››œœœœœœœžžžžžŸŸŸŸŸŸ      ¡¡¡¡¡¡¢¢¢¢¢¢££££££¤¤¤¤¤¤¤¥¥¥¥¥¥¥¦¦¦¦¦¦¦§§§§§§§¨¨¨¨¨¨©©©©©©©ªªªªªªª«««««««¬¬¬¬¬¬¬­­­­­­®®®®®®®¯¯¯¯¯¯¯°°°°°°°±±±±±±±²²²²²²³³³³³³³´´´´´´´µµµµµµµ¶¶¶¶¶¶¶·····¸¸¸¸¸¸¹¹¹¹¹¹ºººººº»»»»»»¼¼¼¼¼¼½½½½½½½¾¾¾¾¾¾¾¿¿¿¿¿¿¿ÀÀÀÀÀÀÀÁÁÁÁÁÁÂÂÂÂÂÂÂÃÃÃÃÃÃÃÄÄÄÄÄÄÄÅÅÅÅÅÅÅÆÆÆÆÆÆÇÇÇÇÇÇÇÈÈÈÈÈÈÈÉÉÉÉÉÉÉÊÊÊÊÊÊÊËËËËËËÌÌÌÌÌÌÌÍÍÍÍÍÍÍÎÎÎÎÎÎÎÏÏÏÏÏÏÏÐÐÐÐÐÑÑÑÑÑÑÒÒÒÒÒÒÓÓÓÓÓÓÔÔÔÔÔÔÕÕÕÕÕÖÖÖÖÖÖ××××××ØØØØØØÙÙÙÙÙÙÚÚÚÚÚÛÛÛÛÛÛÜÜÜÜÜÜÝÝÝÝÝÝÞÞÞÞÞÞßßßßßààààààááááááââââââããããããäääääååååååææææææççççççèèèèèèééééêêêêêëëëëëìììììíííííôõù õôöúöõ÷û÷öøüø÷ýîùôúþúõùûÿûöúüü÷ûýýøüóþùÿÿúþûÿüýøþÿ     ý !  "   #   $  % ô&-õ '.ö(/÷)0ø*1ù +ú,û-ü.ý/ þ0ÿ123 4!5"6#7 $8 %9!":" !#;# "$<$ #%=%  $>& '+?F'&(,@G(')-AH)(*.BI*)/CJ +&,0D,'+-1E-(,.2F.)-/3G/*.4H%0+15I1,026J2-137K3.248L4/39M*506:N6157;O7268<P8379=Q9 48>R/:!5;S;"6:<T<#7;=U=$8<>V>%9=W4?&@DX_@'?AEY`A(@BFZaB)ACG[bC*BH\c9D+?EI]E,@DFJ^F-AEGK_G.BFHL`H/CGMa>I0DJNbJ1EIKOcK2FJLPdL3GKMQeM4HLRfCN5IOSgO6JNPThP7KOQUiQ8LPRVjR9MQWkHS:NTlT;OSUmU<PTVnV=QUWoW>RVpMX?Y]qxY@XZ^ryZAY[_sz[BZ\`t{\C[au|R]DX^bv^EY]_cw_FZ^`dx`G[_aeyaH\`fzWbI]cg{cJ^bdh|dK_cei}eL`dfj~fMaek\gNbhl€hOcgimiPdhjn‚jQeikoƒkRfjp„alSgm…mThln†nUimo‡oVjnpˆpWko‰fqXrvŠ‘rYqsw‹’sZrtxŒ“t[suy”u\tzŽ•kv]qw{w^rvx|x_swy}‘y`txz~’zauy“p{bv|€”|cw{}•}dx|~‚–~ey}ƒ—fz~„˜u€g{…™h|€‚†š‚i}ƒ‡›ƒj~‚„ˆœ„kƒ‰z…l€†ž†m…‡Ÿ‡n‚†ˆ ˆoƒ‡‰¡‰p„ˆ¢Šq‹£ª‹rŠŒ¤«Œs‹‘¥¬tŒŽ’¦­Žu“§®„vŠ”¨w‹‘•©‘xŒ’–ª’y‘“—«“zŽ’˜¬‰”{•™­•|”–š®–}‘•—›¯—~’–˜œ°˜“—±Ž™€”šž²š•™›Ÿ³›‚–šœ ´œƒ—›¡µ„˜œ¢¶“ž…™Ÿ·Ÿ†šž ¸ ‡›Ÿ¡¹¡ˆœ ¢º¢‰¡»˜£Š¤¨¼ä‹£¥©½Ä¥Œ¤¦ª¾Ŧ¥§«¿Ƨަ¬ÀǨ£©­Á©¤¨ª®Âª‘¥©«¯Ã«’¦ª¬°Ä¬“§«±Å¢­”¨®²Æ®•©­¯³Ç¯–ª®°´È°—«¯±µÉ±˜¬°¶Ê§²™­³·Ë³š®²´¸Ì´›¯³µ¹Íµœ°´¶ºÎ¶±µ»Ï¬·ž²¸Ð¸Ÿ³·¹Ñ¹ ´¸ºÒº¡µ¹»Ó»¢¶ºÔ±¼£½ÁÕܽ¤¼¾ÂÖݾ¥½¿Ã×Þ¿¦¾ÀÄØßÀ§¿ÅÙà¶Á¨¼ÂÆÚ©½ÁÃÇÛê¾ÂÄÈÜÄ«¿ÃÅÉÝŬÀÄÊ޻ƭÁÇËßÇ®ÂÆÈÌàȯÃÇÉÍáɰÄÈÊÎâʱÅÉÏãÀ˲ÆÌÐä̳ÇËÍÑåÍ´ÈÌÎÒæÎµÉÍÏÓç϶ÊÎÔèÅзËÑéѸÌÐÒêÒ¹ÍÑÓëÓºÎÒÔìÔ»ÏÓíÊÕ¼ÖÚõÖ½Õ×Ûö×¾ÖØÜ÷Ø¿×ÙÝøÙÀØÞùÏÚÁÕÛßÛÂÖÚÜàÜÃ×ÛÝáÝÄØÜÞâÞÅÙÝãÔ߯ÚàäàÇÛßáåáÈÜàâæâÉÝáãçãÊÞâèÙäËßåéåÌàäæêæÍáåçëçÎâæèìèÏãçíÞéÐäêêÑåéëëÒæêììÓçëííÔèìã@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿hypre-2.33.0/src/test/TEST_ij/data/poisson_10x10x10_np4/IJ.A.i8f8.00003.bin000066400000000000000000001131301477326011500247010ustar00rootroot00000000000000èè@îçîçîîîîîîïïïïïïððððððññññññòòòòòóóóóóóôôôôôôõõõõõõöööööö÷÷÷÷÷øøøøøøùùùùùùúúúúúúûûûûûûüüüüüýýýýýýþþþþþþÿÿÿÿÿÿ                                         !!!!!!!"""""""#######$$$$$$%%%%%%%&&&&&&&'''''''((((((())))))*******+++++++,,,,,,,-------......///////000000011111112222222333333444444555555666666777777888889999999:::::::;;;;;;;<<<<<<<======>>>>>>>???????@@@@@@@AAAAAAABBBBBBCCCCCCCDDDDDDDEEEEEEEFFFFFFFGGGGGGHHHHHHHIIIIIIIJJJJJJJKKKKKKKLLLLLLMMMMMMNNNNNNOOOOOOPPPPPPQQQQQRRRRRRRSSSSSSSTTTTTTTUUUUUUUVVVVVVWWWWWWWXXXXXXXYYYYYYYZZZZZZZ[[[[[[\\\\\\\]]]]]]]^^^^^^^_______``````aaaaaaabbbbbbbcccccccdddddddeeeeeeffffffgggggghhhhhhiiiiiijjjjjkkkkkkklllllllmmmmmmmnnnnnnnoooooopppppppqqqqqqqrrrrrrrsssssssttttttuuuuuuuvvvvvvvwwwwwwwxxxxxxxyyyyyyzzzzzzz{{{{{{{|||||||}}}}}}}~~~~~~€€€€€€‚‚‚‚‚‚ƒƒƒƒƒ„„„„„„„…………………†††††††‡‡‡‡‡‡‡ˆˆˆˆˆˆ‰‰‰‰‰‰‰ŠŠŠŠŠŠŠ‹‹‹‹‹‹‹ŒŒŒŒŒŒŒŽŽŽŽŽŽŽ‘‘‘‘‘‘‘’’’’’’“““““““”””””””•••••••–––––––——————˜˜˜˜˜˜™™™™™™šššššš››››››œœœœœžžžžžžžŸŸŸŸŸŸŸ       ¡¡¡¡¡¡¢¢¢¢¢¢¢£££££££¤¤¤¤¤¤¤¥¥¥¥¥¥¥¦¦¦¦¦¦§§§§§§§¨¨¨¨¨¨¨©©©©©©©ªªªªªªª««««««¬¬¬¬¬¬¬­­­­­­­®®®®®®®¯¯¯¯¯¯¯°°°°°°±±±±±±²²²²²²³³³³³³´´´´´´µµµµµ¶¶¶¶¶¶¶·······¸¸¸¸¸¸¸¹¹¹¹¹¹¹ºººººº»»»»»»»¼¼¼¼¼¼¼½½½½½½½¾¾¾¾¾¾¾¿¿¿¿¿¿ÀÀÀÀÀÀÀÁÁÁÁÁÁÁÂÂÂÂÂÂÂÃÃÃÃÃÃÃÄÄÄÄÄÄÅÅÅÅÅÅÅÆÆÆÆÆÆÆÇÇÇÇÇÇÇÈÈÈÈÈÈÈÉÉÉÉÉÉÊÊÊÊÊÊËËËËËËÌÌÌÌÌÌÍÍÍÍÍÍÎÎÎÎÎÏÏÏÏÏÏÐÐÐÐÐÐÑÑÑÑÑÑÒÒÒÒÒÒÓÓÓÓÓÔÔÔÔÔÔÕÕÕÕÕÕÖÖÖÖÖÖ××××××ØØØØØÙÙÙÙÙÙÚÚÚÚÚÚÛÛÛÛÛÛÜÜÜÜÜÜÝÝÝÝÝÞÞÞÞÞÞßßßßßßààààààááááááâââââãããããäääääåååååæææææççççîïóøïîðôðïñõ ñðòö òñ÷ óîôø ýôïóõù õðôöúöñõ÷û÷òöüøóùýùôøúþúõùûÿûöúüü÷ûýøþþùýÿÿúþûÿüý þÿî  'ï  !( ð ") ñ  #* ò $+ ó % ô &õ  'ö (÷ )ø *ù +ú,û-ü.ý/ þ0ÿ1234%5678 !%9@*! "&:A" !#';B# "$(<C$ #)=D%  &*>/& !%'+?'"&(,@(#')-A)$(.B*%+/C4+&*,0D,'+-1E-(,.2F.)-3G/*04H90+/15I1,026J2-137K3.28L4/5M>5046N6157O7268P837Q9 :>RYC:!9;?SZ;":<@T[<#;=AU\=$<BV]>%9?CWH?&:>@DX@';?AEYA(<@BFZB)=AG[C*>DH\MD+?CEI]E,@DFJ^F-AEGK_G.BFL`H/CIMaRI0DHJNbJ1EIKOcK2FJLPdL3GKQeM4HNfWN5IMOgO6JNPhP7KOQiQ8LPjR9SWkr\S:RTXlsT;SUYmtU<TVZnuV=U[ovW>RX\paX?SWY]qY@TXZ^rZAUY[_s[BVZ`t\CW]auf]DX\^bv^EY]_cw_FZ^`dx`G[_eyaH\bfzkbI]acg{cJ^bdh|dK_cei}eL`dj~fMagpgNbfh€hOcgiiPdhj‚jQeiƒkRlp„‹ulSkmq…ŒmTlnr†nUmos‡ŽoVntˆpWkqu‰zqXlprvŠrYmqsw‹sZnrtxŒt[osyu\pvzŽv]quw{w^rvx|x_swy}‘y`tx~’zau{“„{bvz|€”|cw{}•}dx|~‚–~ey}ƒ—fz€˜‰€g{™h|€‚š‚i}ƒ›ƒj~‚œ„k…‰¤Ž…l„†Šž¥†m…‡‹Ÿ¦‡n†ˆŒ §ˆo‡¡¨‰p„ŠŽ¢“Šq…‰‹£‹r†ŠŒ¤Œs‡‹‘¥tˆŒ’¦Žu‰“§˜vŠŽ”¨w‹‘•©‘xŒ’–ª’y‘—«“zŽ”˜¬”{“•™­•|”–š®–}‘•—›¯—~’–œ°˜“™±¢™€”˜š²š•™›³›‚–šœ´œƒ—›µ„ž¢¶½§ž…Ÿ£·¾Ÿ†ž ¤¸¿ ‡Ÿ¡¥¹À¡ˆ ¦ºÁ¢‰£§»¬£Šž¢¤¨¼¤‹Ÿ£¥©½¥Œ ¤¦ª¾¦¡¥«¿§Ž¢¨¬À±¨£§©­Á©¤¨ª®Âª‘¥©«¯Ã«’¦ª°Ä¬“§­±Å¶­”¨¬®²Æ®•©­¯³Ç¯–ª®°´È°—«¯µÉ±˜¬²Ê»²™­±³Ë³š®²´Ì´›¯³µÍµœ°´Î¶·»ÏÖÀ·ž¶¸¼Ð׸Ÿ·¹½Ñع ¸º¾ÒÙº¡¹¿ÓÚ»¢¶¼ÀÔż£·»½ÁÕ½¤¸¼¾ÂÖ¾¥¹½¿Ã׿¦º¾ÄØÀ§»ÁÅÙÊÁ¨¼ÀÂÆÚ©½ÁÃÇÛê¾ÂÄÈÜÄ«¿ÃÉÝŬÀÆÊÞÏÆ­ÁÅÇËßÇ®ÂÆÈÌàȯÃÇÉÍáɰÄÈÎâʱÅËãÔ˲ÆÊÌä̳ÇËÍåÍ´ÈÌÎæÎµÉÍç϶ÐÔïÙзÏÑÕðѸÐÒÖñÒ¹ÑÓ×òÓºÒØóÔ»ÏÕÙÞÕ¼ÐÔÖÚÖ½ÑÕ×Û×¾ÒÖØÜØ¿Ó×ÝÙÀÔÚÞãÚÁÕÙÛßÛÂÖÚÜàÜÃ×ÛÝáÝÄØÜâÞÅÙßãè߯ÚÞàäàÇÛßáåáÈÜàâæâÉÝáçãÊÞäíäËßãååÌàäææÍáåççÎâæ@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿ð¿@ð¿ð¿ð¿hypre-2.33.0/src/test/TEST_ij/data/poisson_10x10x10_np4/IJ.b.i4f4.00000.bin000066400000000000000000000020501477326011500247250ustar00rootroot00000000000000úèú€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?hypre-2.33.0/src/test/TEST_ij/data/poisson_10x10x10_np4/IJ.b.i4f4.00001.bin000066400000000000000000000020501477326011500247260ustar00rootroot00000000000000úôèú€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?hypre-2.33.0/src/test/TEST_ij/data/poisson_10x10x10_np4/IJ.b.i4f4.00002.bin000066400000000000000000000020501477326011500247270ustar00rootroot00000000000000ôîèú€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?hypre-2.33.0/src/test/TEST_ij/data/poisson_10x10x10_np4/IJ.b.i4f4.00003.bin000066400000000000000000000020501477326011500247300ustar00rootroot00000000000000îèèú€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?hypre-2.33.0/src/test/TEST_ij/data/poisson_10x10x10_np4/IJ.b.i4f8.00000.bin000066400000000000000000000040201477326011500247300ustar00rootroot00000000000000úèúð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?hypre-2.33.0/src/test/TEST_ij/data/poisson_10x10x10_np4/IJ.b.i4f8.00001.bin000066400000000000000000000040201477326011500247310ustar00rootroot00000000000000úôèúð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?hypre-2.33.0/src/test/TEST_ij/data/poisson_10x10x10_np4/IJ.b.i4f8.00002.bin000066400000000000000000000040201477326011500247320ustar00rootroot00000000000000ôîèúð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?hypre-2.33.0/src/test/TEST_ij/data/poisson_10x10x10_np4/IJ.b.i4f8.00003.bin000066400000000000000000000040201477326011500247330ustar00rootroot00000000000000îèèúð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?hypre-2.33.0/src/test/TEST_ij/data/poisson_10x10x10_np4/IJ.b.i8f4.00000.bin000066400000000000000000000020501477326011500247310ustar00rootroot00000000000000úèú€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?hypre-2.33.0/src/test/TEST_ij/data/poisson_10x10x10_np4/IJ.b.i8f4.00001.bin000066400000000000000000000020501477326011500247320ustar00rootroot00000000000000úôèú€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?hypre-2.33.0/src/test/TEST_ij/data/poisson_10x10x10_np4/IJ.b.i8f4.00002.bin000066400000000000000000000020501477326011500247330ustar00rootroot00000000000000ôîèú€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?hypre-2.33.0/src/test/TEST_ij/data/poisson_10x10x10_np4/IJ.b.i8f4.00003.bin000066400000000000000000000020501477326011500247340ustar00rootroot00000000000000îèèú€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?hypre-2.33.0/src/test/TEST_ij/data/poisson_10x10x10_np4/IJ.b.i8f8.00000.bin000066400000000000000000000040201477326011500247340ustar00rootroot00000000000000úèúð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?hypre-2.33.0/src/test/TEST_ij/data/poisson_10x10x10_np4/IJ.b.i8f8.00001.bin000066400000000000000000000040201477326011500247350ustar00rootroot00000000000000úôèúð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?hypre-2.33.0/src/test/TEST_ij/data/poisson_10x10x10_np4/IJ.b.i8f8.00002.bin000066400000000000000000000040201477326011500247360ustar00rootroot00000000000000ôîèúð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?hypre-2.33.0/src/test/TEST_ij/data/poisson_10x10x10_np4/IJ.b.i8f8.00003.bin000066400000000000000000000040201477326011500247370ustar00rootroot00000000000000îèèúð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?hypre-2.33.0/src/test/TEST_ij/data/poisson_10x10x10_np4/IJ.x0.i4f4.00000.bin000066400000000000000000000020501477326011500250330ustar00rootroot00000000000000úèúhypre-2.33.0/src/test/TEST_ij/data/poisson_10x10x10_np4/IJ.x0.i4f4.00001.bin000066400000000000000000000020501477326011500250340ustar00rootroot00000000000000úôèúhypre-2.33.0/src/test/TEST_ij/data/poisson_10x10x10_np4/IJ.x0.i4f4.00002.bin000066400000000000000000000020501477326011500250350ustar00rootroot00000000000000ôîèúhypre-2.33.0/src/test/TEST_ij/data/poisson_10x10x10_np4/IJ.x0.i4f4.00003.bin000066400000000000000000000020501477326011500250360ustar00rootroot00000000000000îèèúhypre-2.33.0/src/test/TEST_ij/data/poisson_10x10x10_np4/IJ.x0.i4f8.00000.bin000066400000000000000000000040201477326011500250360ustar00rootroot00000000000000úèúhypre-2.33.0/src/test/TEST_ij/data/poisson_10x10x10_np4/IJ.x0.i4f8.00001.bin000066400000000000000000000040201477326011500250370ustar00rootroot00000000000000úôèúhypre-2.33.0/src/test/TEST_ij/data/poisson_10x10x10_np4/IJ.x0.i4f8.00002.bin000066400000000000000000000040201477326011500250400ustar00rootroot00000000000000ôîèúhypre-2.33.0/src/test/TEST_ij/data/poisson_10x10x10_np4/IJ.x0.i4f8.00003.bin000066400000000000000000000040201477326011500250410ustar00rootroot00000000000000îèèúhypre-2.33.0/src/test/TEST_ij/data/poisson_10x10x10_np4/IJ.x0.i8f4.00000.bin000066400000000000000000000020501477326011500250370ustar00rootroot00000000000000úèúhypre-2.33.0/src/test/TEST_ij/data/poisson_10x10x10_np4/IJ.x0.i8f4.00001.bin000066400000000000000000000020501477326011500250400ustar00rootroot00000000000000úôèúhypre-2.33.0/src/test/TEST_ij/data/poisson_10x10x10_np4/IJ.x0.i8f4.00002.bin000066400000000000000000000020501477326011500250410ustar00rootroot00000000000000ôîèúhypre-2.33.0/src/test/TEST_ij/data/poisson_10x10x10_np4/IJ.x0.i8f4.00003.bin000066400000000000000000000020501477326011500250420ustar00rootroot00000000000000îèèúhypre-2.33.0/src/test/TEST_ij/data/poisson_10x10x10_np4/IJ.x0.i8f8.00000.bin000066400000000000000000000040201477326011500250420ustar00rootroot00000000000000úèúhypre-2.33.0/src/test/TEST_ij/data/poisson_10x10x10_np4/IJ.x0.i8f8.00001.bin000066400000000000000000000040201477326011500250430ustar00rootroot00000000000000úôèúhypre-2.33.0/src/test/TEST_ij/data/poisson_10x10x10_np4/IJ.x0.i8f8.00002.bin000066400000000000000000000040201477326011500250440ustar00rootroot00000000000000ôîèúhypre-2.33.0/src/test/TEST_ij/data/poisson_10x10x10_np4/IJ.x0.i8f8.00003.bin000066400000000000000000000040201477326011500250450ustar00rootroot00000000000000îèèúhypre-2.33.0/src/test/TEST_ij/data/tucker21935/000077500000000000000000000000001477326011500205555ustar00rootroot00000000000000hypre-2.33.0/src/test/TEST_ij/data/tucker21935/IJ.A.00000000066400000000000000000010102671477326011500216260ustar00rootroot000000000000000 5483 0 5483 0 0 1.00000000000000e+00 1 1 1.00000000000000e+00 2 2 1.00000000000000e+00 3 3 1.00000000000000e+00 4 4 1.00000000000000e+00 5 5 1.00000000000000e+00 6 6 1.00000000000000e+00 7 7 1.00000000000000e+00 8 8 1.00000000000000e+00 9 9 1.00000000000000e+00 10 10 1.00000000000000e+00 11 11 1.00000000000000e+00 12 12 1.00000000000000e+00 13 13 1.00000000000000e+00 14 14 1.00000000000000e+00 15 15 1.00000000000000e+00 16 16 1.00000000000000e+00 17 17 1.00000000000000e+00 18 18 1.00000000000000e+00 19 19 1.00000000000000e+00 20 20 1.00000000000000e+00 21 21 1.00000000000000e+00 22 22 1.00000000000000e+00 23 23 1.00000000000000e+00 24 24 1.00000000000000e+00 25 25 1.00000000000000e+00 26 26 1.00000000000000e+00 27 27 1.00000000000000e+00 28 28 1.00000000000000e+00 29 29 1.00000000000000e+00 30 30 1.00000000000000e+00 31 31 1.00000000000000e+00 32 32 1.00000000000000e+00 33 33 1.00000000000000e+00 34 34 1.00000000000000e+00 35 35 1.00000000000000e+00 36 36 1.00000000000000e+00 37 37 1.00000000000000e+00 38 38 1.00000000000000e+00 39 39 1.00000000000000e+00 40 40 1.00000000000000e+00 41 41 1.00000000000000e+00 42 42 1.00000000000000e+00 43 43 1.00000000000000e+00 44 44 1.00000000000000e+00 45 45 1.00000000000000e+00 46 46 1.00000000000000e+00 47 47 1.00000000000000e+00 48 48 1.00000000000000e+00 49 49 1.00000000000000e+00 50 50 1.00000000000000e+00 51 51 1.00000000000000e+00 52 52 1.00000000000000e+00 53 53 1.00000000000000e+00 54 54 1.00000000000000e+00 55 55 1.00000000000000e+00 56 56 1.00000000000000e+00 57 57 1.00000000000000e+00 58 58 1.00000000000000e+00 59 59 1.00000000000000e+00 60 60 1.00000000000000e+00 61 61 1.00000000000000e+00 62 62 1.00000000000000e+00 63 63 1.00000000000000e+00 64 64 1.00000000000000e+00 65 65 1.00000000000000e+00 66 66 1.00000000000000e+00 67 67 1.00000000000000e+00 68 68 1.00000000000000e+00 69 69 1.00000000000000e+00 70 70 1.00000000000000e+00 71 71 1.00000000000000e+00 72 72 1.00000000000000e+00 73 73 1.00000000000000e+00 74 74 1.00000000000000e+00 75 75 1.00000000000000e+00 76 76 1.00000000000000e+00 77 77 1.00000000000000e+00 78 78 1.00000000000000e+00 79 79 1.00000000000000e+00 80 80 1.00000000000000e+00 81 81 1.00000000000000e+00 82 82 1.00000000000000e+00 83 83 1.00000000000000e+00 84 84 1.00000000000000e+00 85 85 1.00000000000000e+00 86 86 1.00000000000000e+00 87 87 1.00000000000000e+00 88 88 1.00000000000000e+00 89 89 1.00000000000000e+00 90 90 1.00000000000000e+00 91 91 1.00000000000000e+00 92 92 1.00000000000000e+00 93 93 1.00000000000000e+00 94 94 1.00000000000000e+00 95 95 1.00000000000000e+00 96 96 1.00000000000000e+00 97 97 1.00000000000000e+00 98 98 1.00000000000000e+00 99 99 1.00000000000000e+00 100 100 1.00000000000000e+00 101 101 1.00000000000000e+00 102 102 1.00000000000000e+00 103 103 1.00000000000000e+00 104 104 1.00000000000000e+00 105 105 1.00000000000000e+00 106 106 1.00000000000000e+00 107 107 1.00000000000000e+00 108 108 1.00000000000000e+00 109 109 1.00000000000000e+00 110 110 1.00000000000000e+00 111 111 1.00000000000000e+00 112 112 1.00000000000000e+00 113 113 1.00000000000000e+00 114 114 1.00000000000000e+00 115 115 1.00000000000000e+00 116 116 1.00000000000000e+00 117 117 1.00000000000000e+00 118 118 1.00000000000000e+00 119 119 1.00000000000000e+00 120 120 1.00000000000000e+00 121 121 1.00000000000000e+00 122 122 1.00000000000000e+00 123 123 1.00000000000000e+00 124 124 1.00000000000000e+00 125 125 1.00000000000000e+00 126 126 1.00000000000000e+00 127 127 1.00000000000000e+00 128 128 1.00000000000000e+00 129 129 1.00000000000000e+00 130 130 1.00000000000000e+00 131 131 1.00000000000000e+00 132 132 1.00000000000000e+00 133 133 1.00000000000000e+00 134 134 1.00000000000000e+00 135 135 1.00000000000000e+00 136 136 1.00000000000000e+00 137 137 1.00000000000000e+00 138 138 1.00000000000000e+00 139 139 1.00000000000000e+00 140 140 1.00000000000000e+00 141 141 1.00000000000000e+00 142 142 1.00000000000000e+00 143 143 1.00000000000000e+00 144 144 1.00000000000000e+00 145 145 1.00000000000000e+00 146 146 1.00000000000000e+00 147 147 1.00000000000000e+00 148 148 1.00000000000000e+00 149 149 1.00000000000000e+00 150 150 1.00000000000000e+00 151 151 1.00000000000000e+00 152 152 1.00000000000000e+00 153 153 1.00000000000000e+00 154 154 1.00000000000000e+00 155 155 1.00000000000000e+00 156 156 1.00000000000000e+00 157 157 1.00000000000000e+00 158 158 1.00000000000000e+00 159 159 1.00000000000000e+00 160 160 1.00000000000000e+00 161 161 1.00000000000000e+00 162 162 1.00000000000000e+00 163 163 1.00000000000000e+00 164 164 1.00000000000000e+00 165 165 1.00000000000000e+00 166 166 1.00000000000000e+00 167 167 1.00000000000000e+00 168 168 1.00000000000000e+00 169 169 1.00000000000000e+00 170 170 1.00000000000000e+00 171 171 1.00000000000000e+00 172 172 1.00000000000000e+00 173 173 1.00000000000000e+00 174 174 1.00000000000000e+00 175 175 1.00000000000000e+00 176 176 1.00000000000000e+00 177 177 1.00000000000000e+00 178 178 1.00000000000000e+00 179 179 1.00000000000000e+00 180 180 1.00000000000000e+00 181 181 1.00000000000000e+00 182 182 1.00000000000000e+00 183 183 1.00000000000000e+00 184 184 1.00000000000000e+00 185 185 1.00000000000000e+00 186 186 1.00000000000000e+00 187 187 1.00000000000000e+00 188 188 1.00000000000000e+00 189 189 1.00000000000000e+00 190 190 1.00000000000000e+00 191 191 1.00000000000000e+00 192 192 1.00000000000000e+00 193 193 1.00000000000000e+00 194 194 1.00000000000000e+00 195 195 1.00000000000000e+00 196 196 1.00000000000000e+00 197 197 1.00000000000000e+00 198 198 1.00000000000000e+00 199 199 1.00000000000000e+00 200 200 1.00000000000000e+00 201 201 1.00000000000000e+00 202 202 1.00000000000000e+00 203 203 1.00000000000000e+00 204 204 1.00000000000000e+00 205 205 1.00000000000000e+00 206 206 1.00000000000000e+00 207 207 1.00000000000000e+00 208 208 1.00000000000000e+00 209 209 1.00000000000000e+00 210 210 1.00000000000000e+00 211 211 1.00000000000000e+00 212 212 1.00000000000000e+00 213 213 1.00000000000000e+00 214 214 1.00000000000000e+00 215 215 1.00000000000000e+00 216 216 1.00000000000000e+00 217 217 1.00000000000000e+00 218 218 1.00000000000000e+00 219 219 1.00000000000000e+00 220 220 1.00000000000000e+00 221 221 1.00000000000000e+00 222 222 1.00000000000000e+00 223 223 1.00000000000000e+00 224 224 1.00000000000000e+00 225 225 1.00000000000000e+00 226 226 1.00000000000000e+00 227 227 1.00000000000000e+00 228 228 1.00000000000000e+00 229 229 1.00000000000000e+00 230 230 1.00000000000000e+00 231 231 1.00000000000000e+00 232 232 1.00000000000000e+00 233 233 1.00000000000000e+00 234 234 1.00000000000000e+00 235 235 1.00000000000000e+00 236 236 1.00000000000000e+00 237 237 1.00000000000000e+00 238 238 1.00000000000000e+00 239 239 1.00000000000000e+00 240 240 1.00000000000000e+00 241 241 1.00000000000000e+00 242 242 1.00000000000000e+00 243 243 1.00000000000000e+00 244 244 1.00000000000000e+00 245 245 1.00000000000000e+00 246 246 1.00000000000000e+00 247 247 1.00000000000000e+00 248 248 1.00000000000000e+00 249 249 1.00000000000000e+00 250 250 1.00000000000000e+00 251 251 1.00000000000000e+00 252 252 1.00000000000000e+00 253 253 1.00000000000000e+00 254 254 1.00000000000000e+00 255 255 1.00000000000000e+00 256 256 1.00000000000000e+00 257 257 1.00000000000000e+00 258 258 1.00000000000000e+00 259 259 1.00000000000000e+00 260 260 1.00000000000000e+00 261 261 1.00000000000000e+00 262 262 1.00000000000000e+00 263 263 1.00000000000000e+00 264 264 1.00000000000000e+00 265 265 1.00000000000000e+00 266 266 1.00000000000000e+00 267 267 1.00000000000000e+00 268 268 1.00000000000000e+00 269 269 1.00000000000000e+00 270 270 1.00000000000000e+00 271 271 1.00000000000000e+00 272 272 1.00000000000000e+00 273 273 1.00000000000000e+00 274 274 1.00000000000000e+00 275 275 1.00000000000000e+00 276 276 1.00000000000000e+00 277 277 1.00000000000000e+00 278 278 1.00000000000000e+00 279 279 1.00000000000000e+00 280 280 1.00000000000000e+00 281 281 1.00000000000000e+00 282 282 1.00000000000000e+00 283 283 1.00000000000000e+00 284 284 1.00000000000000e+00 285 285 1.00000000000000e+00 286 286 1.00000000000000e+00 287 287 1.00000000000000e+00 288 288 1.00000000000000e+00 289 289 1.00000000000000e+00 290 290 1.00000000000000e+00 291 291 1.00000000000000e+00 292 292 1.00000000000000e+00 293 293 1.00000000000000e+00 294 294 1.00000000000000e+00 295 295 1.00000000000000e+00 296 296 1.00000000000000e+00 297 297 1.00000000000000e+00 298 298 1.00000000000000e+00 299 299 1.00000000000000e+00 300 300 1.00000000000000e+00 301 301 1.00000000000000e+00 302 302 1.00000000000000e+00 303 303 1.00000000000000e+00 304 304 1.00000000000000e+00 305 305 1.00000000000000e+00 306 306 1.00000000000000e+00 307 307 1.00000000000000e+00 308 308 1.00000000000000e+00 309 309 1.00000000000000e+00 310 310 1.00000000000000e+00 311 311 1.00000000000000e+00 312 312 1.00000000000000e+00 313 313 1.00000000000000e+00 314 314 1.00000000000000e+00 315 315 1.00000000000000e+00 316 316 1.00000000000000e+00 317 317 1.00000000000000e+00 318 318 1.00000000000000e+00 319 319 1.00000000000000e+00 320 320 1.00000000000000e+00 321 321 1.00000000000000e+00 322 322 1.00000000000000e+00 323 323 1.00000000000000e+00 324 324 1.00000000000000e+00 325 325 1.00000000000000e+00 326 326 1.00000000000000e+00 327 327 1.00000000000000e+00 328 328 1.00000000000000e+00 329 329 1.00000000000000e+00 330 330 1.00000000000000e+00 331 331 1.00000000000000e+00 332 332 1.00000000000000e+00 333 333 1.00000000000000e+00 334 334 1.00000000000000e+00 335 335 1.00000000000000e+00 336 336 1.00000000000000e+00 337 337 1.00000000000000e+00 338 338 1.00000000000000e+00 339 339 1.00000000000000e+00 340 340 1.00000000000000e+00 341 341 1.00000000000000e+00 342 342 1.00000000000000e+00 343 343 1.00000000000000e+00 344 344 1.00000000000000e+00 345 345 1.00000000000000e+00 346 346 1.00000000000000e+00 347 347 1.00000000000000e+00 348 348 1.00000000000000e+00 349 349 1.00000000000000e+00 350 350 1.00000000000000e+00 351 351 1.00000000000000e+00 352 352 1.00000000000000e+00 353 353 1.00000000000000e+00 354 354 1.00000000000000e+00 355 355 1.00000000000000e+00 356 356 1.00000000000000e+00 357 357 1.00000000000000e+00 358 358 1.00000000000000e+00 359 359 1.00000000000000e+00 360 360 1.00000000000000e+00 361 361 1.00000000000000e+00 362 362 1.00000000000000e+00 363 363 1.00000000000000e+00 364 364 1.00000000000000e+00 365 365 1.00000000000000e+00 366 366 1.00000000000000e+00 367 367 1.00000000000000e+00 368 368 1.00000000000000e+00 369 369 1.00000000000000e+00 370 370 1.00000000000000e+00 371 371 1.00000000000000e+00 372 372 1.00000000000000e+00 373 373 1.00000000000000e+00 374 374 1.00000000000000e+00 375 375 1.00000000000000e+00 376 376 1.00000000000000e+00 377 377 1.00000000000000e+00 378 378 1.00000000000000e+00 379 379 1.00000000000000e+00 380 380 1.00000000000000e+00 381 381 1.00000000000000e+00 382 382 1.00000000000000e+00 383 383 1.00000000000000e+00 384 384 1.00000000000000e+00 385 385 1.00000000000000e+00 386 386 1.00000000000000e+00 387 387 1.00000000000000e+00 388 388 1.00000000000000e+00 389 389 1.00000000000000e+00 390 390 1.00000000000000e+00 391 391 1.00000000000000e+00 392 392 1.00000000000000e+00 393 393 1.00000000000000e+00 394 394 1.00000000000000e+00 395 395 1.00000000000000e+00 396 396 1.00000000000000e+00 397 397 1.00000000000000e+00 398 398 1.00000000000000e+00 399 399 1.00000000000000e+00 400 400 1.00000000000000e+00 401 401 1.00000000000000e+00 402 402 1.00000000000000e+00 403 403 1.00000000000000e+00 404 404 1.00000000000000e+00 405 405 1.00000000000000e+00 406 406 1.00000000000000e+00 407 407 1.00000000000000e+00 408 408 1.00000000000000e+00 409 409 1.00000000000000e+00 410 410 1.00000000000000e+00 411 411 1.00000000000000e+00 412 412 1.00000000000000e+00 413 413 1.00000000000000e+00 414 414 1.00000000000000e+00 415 415 1.00000000000000e+00 416 416 1.00000000000000e+00 417 417 1.00000000000000e+00 418 418 1.00000000000000e+00 419 419 1.00000000000000e+00 420 420 1.00000000000000e+00 421 421 1.00000000000000e+00 422 422 1.00000000000000e+00 423 423 1.00000000000000e+00 424 424 1.00000000000000e+00 425 425 1.00000000000000e+00 426 426 1.00000000000000e+00 427 427 1.00000000000000e+00 428 428 1.00000000000000e+00 429 429 1.00000000000000e+00 430 430 1.00000000000000e+00 431 431 1.00000000000000e+00 432 432 1.00000000000000e+00 433 433 1.00000000000000e+00 434 434 1.00000000000000e+00 435 435 1.00000000000000e+00 436 436 1.00000000000000e+00 437 437 1.00000000000000e+00 438 438 1.00000000000000e+00 439 439 1.00000000000000e+00 440 440 1.00000000000000e+00 441 441 1.00000000000000e+00 442 442 1.00000000000000e+00 443 443 1.00000000000000e+00 444 444 1.00000000000000e+00 445 445 1.00000000000000e+00 446 446 1.00000000000000e+00 447 447 1.00000000000000e+00 448 448 1.00000000000000e+00 449 449 1.00000000000000e+00 450 450 1.00000000000000e+00 451 451 1.00000000000000e+00 452 452 1.00000000000000e+00 453 453 1.00000000000000e+00 454 454 1.00000000000000e+00 455 455 1.00000000000000e+00 456 456 1.00000000000000e+00 457 457 1.00000000000000e+00 458 458 1.00000000000000e+00 459 459 1.00000000000000e+00 460 460 1.00000000000000e+00 461 461 1.00000000000000e+00 462 462 1.00000000000000e+00 463 463 1.00000000000000e+00 464 464 1.00000000000000e+00 465 465 1.00000000000000e+00 466 466 1.00000000000000e+00 467 467 1.00000000000000e+00 468 468 1.00000000000000e+00 469 469 1.00000000000000e+00 470 470 1.00000000000000e+00 471 471 1.00000000000000e+00 472 472 1.00000000000000e+00 473 473 1.00000000000000e+00 474 474 1.00000000000000e+00 475 475 1.00000000000000e+00 476 476 1.00000000000000e+00 477 477 1.00000000000000e+00 478 478 1.00000000000000e+00 479 479 1.00000000000000e+00 480 480 1.00000000000000e+00 481 481 1.00000000000000e+00 482 482 1.00000000000000e+00 483 483 1.00000000000000e+00 484 484 1.00000000000000e+00 485 485 1.00000000000000e+00 486 486 1.00000000000000e+00 487 487 1.00000000000000e+00 488 488 1.00000000000000e+00 489 489 1.00000000000000e+00 490 490 1.00000000000000e+00 491 491 1.00000000000000e+00 492 492 1.00000000000000e+00 493 493 1.00000000000000e+00 494 494 1.00000000000000e+00 495 495 1.00000000000000e+00 496 496 1.00000000000000e+00 497 497 1.00000000000000e+00 498 498 1.00000000000000e+00 499 499 1.00000000000000e+00 500 500 1.00000000000000e+00 501 501 1.00000000000000e+00 502 502 1.00000000000000e+00 503 503 1.00000000000000e+00 504 504 1.00000000000000e+00 505 505 1.00000000000000e+00 506 506 1.00000000000000e+00 507 507 1.00000000000000e+00 508 508 1.00000000000000e+00 509 509 1.00000000000000e+00 510 510 1.00000000000000e+00 511 511 1.00000000000000e+00 512 512 1.00000000000000e+00 513 513 1.00000000000000e+00 514 514 1.00000000000000e+00 515 515 1.00000000000000e+00 516 516 1.00000000000000e+00 517 517 1.00000000000000e+00 518 518 1.00000000000000e+00 519 519 1.00000000000000e+00 520 520 1.00000000000000e+00 521 521 1.00000000000000e+00 522 522 1.00000000000000e+00 523 523 1.00000000000000e+00 524 524 1.00000000000000e+00 525 525 1.00000000000000e+00 526 526 1.00000000000000e+00 527 527 1.00000000000000e+00 528 528 1.00000000000000e+00 529 529 1.00000000000000e+00 530 530 1.00000000000000e+00 531 531 1.00000000000000e+00 532 532 1.00000000000000e+00 533 533 1.00000000000000e+00 534 534 1.00000000000000e+00 535 535 1.00000000000000e+00 536 536 1.00000000000000e+00 537 537 1.00000000000000e+00 538 538 1.00000000000000e+00 539 539 1.00000000000000e+00 540 540 1.00000000000000e+00 541 541 1.00000000000000e+00 542 542 1.00000000000000e+00 543 543 1.00000000000000e+00 544 544 1.00000000000000e+00 545 545 1.00000000000000e+00 546 546 1.00000000000000e+00 547 547 1.00000000000000e+00 548 548 1.00000000000000e+00 549 549 1.00000000000000e+00 550 550 1.00000000000000e+00 551 551 1.00000000000000e+00 552 552 1.00000000000000e+00 553 553 1.00000000000000e+00 554 554 1.00000000000000e+00 555 555 1.00000000000000e+00 556 556 1.00000000000000e+00 557 557 1.00000000000000e+00 558 558 1.00000000000000e+00 559 559 1.00000000000000e+00 560 560 1.00000000000000e+00 561 561 1.00000000000000e+00 562 562 1.00000000000000e+00 563 563 1.00000000000000e+00 564 564 1.00000000000000e+00 565 565 1.00000000000000e+00 566 566 1.00000000000000e+00 567 567 1.00000000000000e+00 568 568 1.00000000000000e+00 569 569 1.00000000000000e+00 570 570 1.00000000000000e+00 571 571 1.00000000000000e+00 572 572 1.00000000000000e+00 573 573 1.00000000000000e+00 574 574 1.00000000000000e+00 575 575 1.00000000000000e+00 576 576 1.00000000000000e+00 577 577 1.00000000000000e+00 578 578 1.00000000000000e+00 579 579 1.00000000000000e+00 580 580 1.00000000000000e+00 581 581 1.00000000000000e+00 582 582 1.00000000000000e+00 583 583 1.00000000000000e+00 584 584 1.00000000000000e+00 585 585 1.00000000000000e+00 586 586 1.00000000000000e+00 587 587 1.00000000000000e+00 588 588 1.00000000000000e+00 589 589 1.00000000000000e+00 590 590 1.00000000000000e+00 591 591 1.00000000000000e+00 592 592 1.00000000000000e+00 593 593 1.00000000000000e+00 594 594 1.00000000000000e+00 595 595 1.00000000000000e+00 596 596 1.00000000000000e+00 597 597 1.00000000000000e+00 598 598 1.00000000000000e+00 599 599 1.00000000000000e+00 600 600 1.00000000000000e+00 601 601 1.00000000000000e+00 602 602 1.00000000000000e+00 603 603 1.00000000000000e+00 604 604 1.00000000000000e+00 605 605 1.00000000000000e+00 606 606 1.00000000000000e+00 607 607 1.00000000000000e+00 608 608 1.00000000000000e+00 609 609 1.00000000000000e+00 610 610 1.00000000000000e+00 611 611 1.00000000000000e+00 612 612 1.00000000000000e+00 613 613 1.00000000000000e+00 614 614 1.00000000000000e+00 615 615 1.00000000000000e+00 616 616 1.00000000000000e+00 617 617 1.00000000000000e+00 618 618 1.00000000000000e+00 619 619 1.00000000000000e+00 620 620 1.00000000000000e+00 621 621 1.00000000000000e+00 622 622 1.00000000000000e+00 623 623 1.00000000000000e+00 624 624 1.00000000000000e+00 625 625 1.00000000000000e+00 626 626 1.00000000000000e+00 627 627 1.00000000000000e+00 628 628 1.00000000000000e+00 629 629 1.00000000000000e+00 630 630 1.00000000000000e+00 631 631 1.00000000000000e+00 632 632 1.00000000000000e+00 633 633 1.00000000000000e+00 634 634 1.00000000000000e+00 635 635 1.00000000000000e+00 636 636 1.00000000000000e+00 637 637 1.00000000000000e+00 638 638 1.00000000000000e+00 639 639 1.00000000000000e+00 640 640 1.00000000000000e+00 641 641 1.00000000000000e+00 642 642 1.00000000000000e+00 643 643 1.00000000000000e+00 644 644 1.00000000000000e+00 645 645 1.00000000000000e+00 646 646 1.00000000000000e+00 647 647 1.00000000000000e+00 648 648 1.00000000000000e+00 649 649 1.00000000000000e+00 650 650 1.00000000000000e+00 651 651 1.00000000000000e+00 652 652 1.00000000000000e+00 653 653 1.00000000000000e+00 654 654 1.00000000000000e+00 655 655 1.00000000000000e+00 656 656 1.00000000000000e+00 657 657 1.00000000000000e+00 658 658 1.00000000000000e+00 659 659 1.00000000000000e+00 660 660 1.00000000000000e+00 661 661 1.00000000000000e+00 662 662 1.00000000000000e+00 663 663 1.00000000000000e+00 664 664 1.00000000000000e+00 665 665 1.00000000000000e+00 666 666 1.00000000000000e+00 667 667 1.00000000000000e+00 668 668 1.00000000000000e+00 669 669 1.00000000000000e+00 670 670 1.00000000000000e+00 671 671 1.00000000000000e+00 672 672 1.00000000000000e+00 673 673 1.00000000000000e+00 674 674 1.00000000000000e+00 675 675 1.00000000000000e+00 676 676 1.00000000000000e+00 677 677 1.00000000000000e+00 678 678 1.00000000000000e+00 679 679 1.00000000000000e+00 680 680 1.00000000000000e+00 681 681 1.00000000000000e+00 682 682 1.00000000000000e+00 683 683 1.00000000000000e+00 684 684 1.00000000000000e+00 685 685 1.00000000000000e+00 686 686 1.00000000000000e+00 687 687 1.00000000000000e+00 688 688 1.00000000000000e+00 689 689 1.00000000000000e+00 690 690 1.00000000000000e+00 691 691 1.00000000000000e+00 692 692 1.00000000000000e+00 693 693 1.00000000000000e+00 694 694 1.00000000000000e+00 695 695 1.00000000000000e+00 696 696 1.00000000000000e+00 697 697 1.00000000000000e+00 698 698 1.00000000000000e+00 699 699 1.00000000000000e+00 700 700 1.00000000000000e+00 701 701 1.00000000000000e+00 702 702 1.00000000000000e+00 703 703 1.00000000000000e+00 704 704 1.00000000000000e+00 705 705 1.00000000000000e+00 706 706 1.00000000000000e+00 707 707 1.00000000000000e+00 708 708 1.00000000000000e+00 709 709 1.00000000000000e+00 710 710 1.00000000000000e+00 711 711 1.00000000000000e+00 712 712 1.00000000000000e+00 713 713 1.00000000000000e+00 714 714 1.00000000000000e+00 715 715 1.00000000000000e+00 716 716 1.00000000000000e+00 717 717 1.00000000000000e+00 718 718 1.00000000000000e+00 719 719 1.00000000000000e+00 720 720 1.00000000000000e+00 721 721 1.00000000000000e+00 722 722 1.00000000000000e+00 723 723 1.00000000000000e+00 724 724 1.00000000000000e+00 725 725 1.00000000000000e+00 726 726 1.00000000000000e+00 727 727 1.00000000000000e+00 728 728 1.00000000000000e+00 729 729 1.00000000000000e+00 730 730 1.00000000000000e+00 731 731 1.00000000000000e+00 732 732 1.00000000000000e+00 733 733 1.00000000000000e+00 734 734 1.00000000000000e+00 735 735 1.00000000000000e+00 736 736 1.00000000000000e+00 737 737 1.00000000000000e+00 738 738 1.00000000000000e+00 739 739 1.00000000000000e+00 740 740 1.00000000000000e+00 741 741 1.00000000000000e+00 742 742 1.00000000000000e+00 743 743 1.00000000000000e+00 744 744 1.00000000000000e+00 745 745 1.00000000000000e+00 746 746 1.00000000000000e+00 747 747 1.00000000000000e+00 748 748 1.00000000000000e+00 749 749 1.00000000000000e+00 750 750 1.00000000000000e+00 751 751 1.00000000000000e+00 752 752 1.00000000000000e+00 753 753 1.00000000000000e+00 754 754 1.00000000000000e+00 755 755 1.00000000000000e+00 756 756 1.00000000000000e+00 757 757 1.00000000000000e+00 758 758 1.00000000000000e+00 759 759 1.00000000000000e+00 760 760 1.00000000000000e+00 761 761 1.00000000000000e+00 762 762 1.00000000000000e+00 763 763 1.00000000000000e+00 764 764 1.00000000000000e+00 765 765 1.00000000000000e+00 766 766 1.00000000000000e+00 767 767 1.00000000000000e+00 768 768 1.00000000000000e+00 769 769 1.00000000000000e+00 770 770 1.00000000000000e+00 771 771 1.00000000000000e+00 772 772 1.00000000000000e+00 773 773 1.00000000000000e+00 774 774 1.00000000000000e+00 775 775 1.00000000000000e+00 776 776 1.00000000000000e+00 777 777 1.00000000000000e+00 778 778 1.00000000000000e+00 779 779 1.00000000000000e+00 780 780 1.00000000000000e+00 781 781 1.00000000000000e+00 782 782 1.00000000000000e+00 783 783 1.00000000000000e+00 784 784 1.00000000000000e+00 785 785 1.00000000000000e+00 786 786 1.00000000000000e+00 787 787 1.00000000000000e+00 788 788 1.00000000000000e+00 789 789 1.00000000000000e+00 790 790 1.00000000000000e+00 791 791 1.00000000000000e+00 792 792 1.00000000000000e+00 793 793 1.00000000000000e+00 794 794 1.00000000000000e+00 795 795 1.00000000000000e+00 796 796 1.00000000000000e+00 797 797 1.00000000000000e+00 798 798 1.00000000000000e+00 799 799 1.00000000000000e+00 800 800 1.00000000000000e+00 801 801 1.00000000000000e+00 802 802 1.00000000000000e+00 803 803 1.00000000000000e+00 804 804 1.00000000000000e+00 805 805 1.00000000000000e+00 806 806 1.00000000000000e+00 807 807 1.00000000000000e+00 808 808 1.00000000000000e+00 809 809 1.00000000000000e+00 810 810 1.00000000000000e+00 811 811 1.00000000000000e+00 812 812 1.00000000000000e+00 813 813 1.00000000000000e+00 814 814 1.00000000000000e+00 815 815 1.00000000000000e+00 816 816 1.00000000000000e+00 817 817 1.00000000000000e+00 818 818 1.00000000000000e+00 819 819 1.00000000000000e+00 820 820 1.00000000000000e+00 821 821 1.00000000000000e+00 822 822 1.00000000000000e+00 823 823 1.00000000000000e+00 824 824 1.00000000000000e+00 825 825 1.00000000000000e+00 826 826 1.00000000000000e+00 827 827 1.00000000000000e+00 828 828 1.00000000000000e+00 829 829 1.00000000000000e+00 830 830 1.00000000000000e+00 831 831 1.00000000000000e+00 832 832 1.00000000000000e+00 833 833 1.00000000000000e+00 834 834 1.00000000000000e+00 835 835 1.00000000000000e+00 836 836 1.00000000000000e+00 837 837 1.00000000000000e+00 838 838 1.00000000000000e+00 839 839 1.00000000000000e+00 840 840 1.00000000000000e+00 841 841 1.00000000000000e+00 842 842 1.00000000000000e+00 843 843 1.00000000000000e+00 844 844 1.00000000000000e+00 845 845 1.00000000000000e+00 846 846 1.00000000000000e+00 847 847 1.00000000000000e+00 848 848 1.00000000000000e+00 849 849 1.00000000000000e+00 850 850 1.00000000000000e+00 851 851 1.00000000000000e+00 852 852 1.00000000000000e+00 853 853 1.00000000000000e+00 854 854 1.00000000000000e+00 855 855 1.00000000000000e+00 856 856 1.00000000000000e+00 857 857 1.00000000000000e+00 858 858 1.00000000000000e+00 859 859 1.00000000000000e+00 860 860 1.00000000000000e+00 861 861 1.00000000000000e+00 862 862 1.00000000000000e+00 863 863 1.00000000000000e+00 864 864 1.00000000000000e+00 865 865 1.00000000000000e+00 866 866 1.00000000000000e+00 867 867 1.00000000000000e+00 868 868 1.00000000000000e+00 869 869 1.00000000000000e+00 870 870 1.00000000000000e+00 871 871 1.00000000000000e+00 872 872 1.00000000000000e+00 873 873 1.00000000000000e+00 874 874 1.00000000000000e+00 875 875 1.00000000000000e+00 876 876 1.00000000000000e+00 877 877 1.00000000000000e+00 878 878 1.00000000000000e+00 879 879 1.00000000000000e+00 880 880 1.00000000000000e+00 881 881 1.00000000000000e+00 882 882 1.00000000000000e+00 883 883 1.00000000000000e+00 884 884 1.00000000000000e+00 885 885 1.00000000000000e+00 886 886 1.00000000000000e+00 887 887 1.00000000000000e+00 888 888 1.00000000000000e+00 889 889 1.00000000000000e+00 890 890 1.00000000000000e+00 891 891 1.00000000000000e+00 892 892 1.00000000000000e+00 893 893 1.00000000000000e+00 894 894 1.00000000000000e+00 895 895 1.00000000000000e+00 896 896 1.00000000000000e+00 897 897 1.00000000000000e+00 898 898 1.00000000000000e+00 899 899 1.00000000000000e+00 900 900 1.00000000000000e+00 901 901 1.00000000000000e+00 902 902 1.00000000000000e+00 903 903 1.00000000000000e+00 904 904 1.00000000000000e+00 905 905 1.00000000000000e+00 906 906 1.00000000000000e+00 907 907 1.00000000000000e+00 908 908 1.00000000000000e+00 909 909 1.00000000000000e+00 910 910 1.00000000000000e+00 911 911 1.00000000000000e+00 912 912 1.00000000000000e+00 913 913 1.00000000000000e+00 914 914 1.00000000000000e+00 915 915 1.00000000000000e+00 916 916 1.00000000000000e+00 917 917 1.00000000000000e+00 918 918 1.00000000000000e+00 919 919 1.00000000000000e+00 920 920 1.00000000000000e+00 921 921 1.00000000000000e+00 922 922 1.00000000000000e+00 923 923 1.00000000000000e+00 924 924 1.00000000000000e+00 925 925 1.00000000000000e+00 926 926 1.00000000000000e+00 927 927 1.00000000000000e+00 928 928 1.00000000000000e+00 929 929 1.00000000000000e+00 930 930 1.00000000000000e+00 931 931 1.00000000000000e+00 932 932 1.00000000000000e+00 933 933 1.00000000000000e+00 934 934 1.00000000000000e+00 935 935 1.00000000000000e+00 936 936 1.00000000000000e+00 937 937 1.00000000000000e+00 938 938 1.00000000000000e+00 939 939 1.00000000000000e+00 940 940 1.00000000000000e+00 941 941 1.00000000000000e+00 942 942 1.00000000000000e+00 943 943 1.00000000000000e+00 944 944 1.00000000000000e+00 945 945 1.00000000000000e+00 946 946 1.00000000000000e+00 947 947 1.00000000000000e+00 948 948 1.00000000000000e+00 949 949 1.00000000000000e+00 950 950 1.00000000000000e+00 951 951 1.00000000000000e+00 952 952 1.00000000000000e+00 953 953 1.00000000000000e+00 954 954 1.00000000000000e+00 955 955 1.00000000000000e+00 956 956 1.00000000000000e+00 957 957 1.00000000000000e+00 958 958 1.00000000000000e+00 959 959 1.00000000000000e+00 960 960 1.00000000000000e+00 961 961 1.00000000000000e+00 962 962 1.00000000000000e+00 963 963 1.00000000000000e+00 964 964 1.00000000000000e+00 965 965 1.00000000000000e+00 966 966 1.00000000000000e+00 967 967 1.00000000000000e+00 968 968 1.00000000000000e+00 969 969 1.00000000000000e+00 970 970 1.00000000000000e+00 971 971 1.00000000000000e+00 972 972 1.00000000000000e+00 973 973 1.00000000000000e+00 974 974 1.00000000000000e+00 975 975 1.00000000000000e+00 976 976 1.00000000000000e+00 977 977 1.00000000000000e+00 978 978 1.00000000000000e+00 979 979 1.00000000000000e+00 980 980 1.00000000000000e+00 981 981 1.00000000000000e+00 982 982 1.00000000000000e+00 983 983 1.00000000000000e+00 984 984 1.00000000000000e+00 985 985 1.00000000000000e+00 986 986 1.00000000000000e+00 987 987 1.00000000000000e+00 988 988 1.00000000000000e+00 989 989 1.00000000000000e+00 990 990 1.00000000000000e+00 991 991 1.00000000000000e+00 992 992 1.00000000000000e+00 993 993 1.00000000000000e+00 994 994 1.00000000000000e+00 995 995 1.00000000000000e+00 996 996 1.00000000000000e+00 997 997 1.00000000000000e+00 998 998 1.00000000000000e+00 999 999 1.00000000000000e+00 1000 1000 1.00000000000000e+00 1001 1001 1.00000000000000e+00 1002 1002 1.00000000000000e+00 1003 1003 1.00000000000000e+00 1004 1004 1.00000000000000e+00 1005 1005 1.00000000000000e+00 1006 1006 1.00000000000000e+00 1007 1007 1.00000000000000e+00 1008 1008 1.00000000000000e+00 1009 1009 1.00000000000000e+00 1010 1010 1.00000000000000e+00 1011 1011 1.00000000000000e+00 1012 1012 1.00000000000000e+00 1013 1013 1.00000000000000e+00 1014 1014 1.00000000000000e+00 1015 1015 1.00000000000000e+00 1016 1016 1.00000000000000e+00 1017 1017 1.00000000000000e+00 1018 1018 1.00000000000000e+00 1019 1019 1.00000000000000e+00 1020 1020 1.00000000000000e+00 1021 1021 1.00000000000000e+00 1022 1022 1.00000000000000e+00 1023 1023 1.00000000000000e+00 1024 1024 1.00000000000000e+00 1025 1025 1.00000000000000e+00 1026 1026 1.00000000000000e+00 1027 1027 1.00000000000000e+00 1028 1028 1.00000000000000e+00 1029 1029 1.00000000000000e+00 1030 1030 1.00000000000000e+00 1031 1031 1.00000000000000e+00 1032 1032 1.00000000000000e+00 1033 1033 1.00000000000000e+00 1034 1034 1.00000000000000e+00 1035 1035 1.00000000000000e+00 1036 1036 1.00000000000000e+00 1037 1037 1.00000000000000e+00 1038 1038 1.00000000000000e+00 1039 1039 1.00000000000000e+00 1040 1040 1.00000000000000e+00 1041 1041 1.00000000000000e+00 1042 1042 1.00000000000000e+00 1043 1043 1.00000000000000e+00 1044 1044 1.00000000000000e+00 1045 1045 1.00000000000000e+00 1046 1046 1.00000000000000e+00 1047 1047 1.00000000000000e+00 1048 1048 1.00000000000000e+00 1049 1049 1.00000000000000e+00 1050 1050 1.00000000000000e+00 1051 1051 1.00000000000000e+00 1052 1052 1.00000000000000e+00 1053 1053 1.00000000000000e+00 1054 1054 1.00000000000000e+00 1055 1055 1.00000000000000e+00 1056 1056 1.00000000000000e+00 1057 1057 1.00000000000000e+00 1058 1058 1.00000000000000e+00 1059 1059 1.00000000000000e+00 1060 1060 1.00000000000000e+00 1061 1061 1.00000000000000e+00 1062 1062 1.00000000000000e+00 1063 1063 1.00000000000000e+00 1064 1064 1.00000000000000e+00 1065 1065 1.00000000000000e+00 1066 1066 1.00000000000000e+00 1067 1067 1.00000000000000e+00 1068 1068 1.00000000000000e+00 1069 1069 1.00000000000000e+00 1070 1070 1.00000000000000e+00 1071 1071 1.00000000000000e+00 1072 1072 1.00000000000000e+00 1073 1073 1.00000000000000e+00 1074 1074 1.00000000000000e+00 1075 1075 1.00000000000000e+00 1076 1076 1.00000000000000e+00 1077 1077 1.00000000000000e+00 1078 1078 1.00000000000000e+00 1079 1079 1.00000000000000e+00 1080 1080 1.00000000000000e+00 1081 1081 1.00000000000000e+00 1082 1082 1.00000000000000e+00 1083 1083 1.00000000000000e+00 1084 1084 1.00000000000000e+00 1085 1085 1.00000000000000e+00 1086 1086 1.00000000000000e+00 1087 1087 1.00000000000000e+00 1088 1088 1.00000000000000e+00 1089 1089 1.00000000000000e+00 1090 1090 1.00000000000000e+00 1091 1091 1.00000000000000e+00 1092 1092 1.00000000000000e+00 1093 1093 1.00000000000000e+00 1094 1094 1.00000000000000e+00 1095 1095 1.00000000000000e+00 1096 1096 1.00000000000000e+00 1097 1097 1.00000000000000e+00 1098 1098 1.00000000000000e+00 1099 1099 1.00000000000000e+00 1100 1100 1.00000000000000e+00 1101 1101 1.00000000000000e+00 1102 1102 1.00000000000000e+00 1103 1103 1.00000000000000e+00 1104 1104 1.00000000000000e+00 1105 1105 1.00000000000000e+00 1106 1106 1.00000000000000e+00 1107 1107 1.00000000000000e+00 1108 1108 1.00000000000000e+00 1109 1109 1.00000000000000e+00 1110 1110 1.00000000000000e+00 1111 1111 1.00000000000000e+00 1112 1112 1.00000000000000e+00 1113 1113 1.00000000000000e+00 1114 1114 1.00000000000000e+00 1115 1115 1.00000000000000e+00 1116 1116 1.00000000000000e+00 1117 1117 1.00000000000000e+00 1118 1118 1.00000000000000e+00 1119 1119 1.00000000000000e+00 1120 1120 1.00000000000000e+00 1121 1121 1.00000000000000e+00 1122 1122 1.00000000000000e+00 1123 1123 1.00000000000000e+00 1124 1124 1.00000000000000e+00 1125 1125 1.00000000000000e+00 1126 1126 1.00000000000000e+00 1127 1127 1.00000000000000e+00 1128 1128 1.00000000000000e+00 1129 1129 1.00000000000000e+00 1130 1130 1.00000000000000e+00 1131 1131 1.00000000000000e+00 1132 1132 1.00000000000000e+00 1133 1133 1.00000000000000e+00 1134 1134 1.00000000000000e+00 1135 1135 1.00000000000000e+00 1136 1136 1.00000000000000e+00 1137 1137 1.00000000000000e+00 1138 1138 1.00000000000000e+00 1139 1139 1.00000000000000e+00 1140 1140 1.00000000000000e+00 1141 1141 1.00000000000000e+00 1142 1142 1.00000000000000e+00 1143 1143 1.00000000000000e+00 1144 1144 1.00000000000000e+00 1145 1145 1.00000000000000e+00 1146 1146 1.00000000000000e+00 1147 1147 1.00000000000000e+00 1148 1148 1.00000000000000e+00 1149 1149 1.00000000000000e+00 1150 1150 1.00000000000000e+00 1151 1151 1.00000000000000e+00 1152 1152 1.00000000000000e+00 1153 1153 1.00000000000000e+00 1154 1154 1.00000000000000e+00 1155 1155 1.00000000000000e+00 1156 1156 1.00000000000000e+00 1157 1157 1.00000000000000e+00 1158 1158 1.00000000000000e+00 1159 1159 1.00000000000000e+00 1160 1160 1.00000000000000e+00 1161 1161 1.00000000000000e+00 1162 1162 1.00000000000000e+00 1163 1163 1.00000000000000e+00 1164 1164 1.00000000000000e+00 1165 1165 1.00000000000000e+00 1166 1166 1.00000000000000e+00 1167 1167 1.00000000000000e+00 1168 1168 1.00000000000000e+00 1169 1169 1.00000000000000e+00 1170 1170 1.00000000000000e+00 1171 1171 1.00000000000000e+00 1172 1172 1.00000000000000e+00 1173 1173 1.00000000000000e+00 1174 1174 1.00000000000000e+00 1175 1175 1.00000000000000e+00 1176 1176 1.00000000000000e+00 1177 1177 1.00000000000000e+00 1178 1178 1.00000000000000e+00 1179 1179 1.00000000000000e+00 1180 1180 1.00000000000000e+00 1181 1181 1.00000000000000e+00 1182 1182 1.00000000000000e+00 1183 1183 1.00000000000000e+00 1184 1184 1.00000000000000e+00 1185 1185 1.00000000000000e+00 1186 1186 1.00000000000000e+00 1187 1187 1.00000000000000e+00 1188 1188 1.00000000000000e+00 1189 1189 1.00000000000000e+00 1190 1190 1.00000000000000e+00 1191 1191 1.00000000000000e+00 1192 1192 1.00000000000000e+00 1193 1193 1.00000000000000e+00 1194 1194 1.00000000000000e+00 1195 1195 1.00000000000000e+00 1196 1196 1.00000000000000e+00 1197 1197 1.00000000000000e+00 1198 1198 1.00000000000000e+00 1199 1199 1.00000000000000e+00 1200 1200 1.00000000000000e+00 1201 1201 1.00000000000000e+00 1202 1202 1.00000000000000e+00 1203 1203 1.00000000000000e+00 1204 1204 1.00000000000000e+00 1205 1205 1.00000000000000e+00 1206 1206 1.00000000000000e+00 1207 1207 1.00000000000000e+00 1208 1208 1.00000000000000e+00 1209 1209 1.00000000000000e+00 1210 1210 1.00000000000000e+00 1211 1211 1.00000000000000e+00 1212 1212 1.00000000000000e+00 1213 1213 1.00000000000000e+00 1214 1214 1.00000000000000e+00 1215 1215 1.00000000000000e+00 1216 1216 1.00000000000000e+00 1217 1217 1.00000000000000e+00 1218 1218 1.00000000000000e+00 1219 1219 1.00000000000000e+00 1220 1220 1.00000000000000e+00 1221 1221 1.00000000000000e+00 1222 1222 1.00000000000000e+00 1223 1223 1.00000000000000e+00 1224 1224 1.00000000000000e+00 1225 1225 1.00000000000000e+00 1226 1226 1.00000000000000e+00 1227 1227 1.00000000000000e+00 1228 1228 1.00000000000000e+00 1229 1229 1.00000000000000e+00 1230 1230 1.00000000000000e+00 1231 1231 1.00000000000000e+00 1232 1232 1.00000000000000e+00 1233 1233 1.00000000000000e+00 1234 1234 1.00000000000000e+00 1235 1235 1.00000000000000e+00 1236 1236 1.00000000000000e+00 1237 1237 1.00000000000000e+00 1238 1238 1.00000000000000e+00 1239 1239 1.00000000000000e+00 1240 1240 1.00000000000000e+00 1241 1241 1.00000000000000e+00 1242 1242 1.00000000000000e+00 1243 1243 1.00000000000000e+00 1244 1244 1.00000000000000e+00 1245 1245 1.00000000000000e+00 1246 1246 1.00000000000000e+00 1247 1247 1.00000000000000e+00 1248 1248 1.00000000000000e+00 1249 1249 1.00000000000000e+00 1250 1250 1.00000000000000e+00 1251 1251 1.00000000000000e+00 1252 1252 1.00000000000000e+00 1253 1253 1.00000000000000e+00 1254 1254 1.00000000000000e+00 1255 1255 1.00000000000000e+00 1256 1256 1.00000000000000e+00 1257 1257 1.00000000000000e+00 1258 1258 1.00000000000000e+00 1259 1259 1.00000000000000e+00 1260 1260 1.00000000000000e+00 1261 1261 1.00000000000000e+00 1262 1262 1.00000000000000e+00 1263 1263 1.00000000000000e+00 1264 1264 1.00000000000000e+00 1265 1265 1.00000000000000e+00 1266 1266 1.00000000000000e+00 1267 1267 1.00000000000000e+00 1268 1268 1.00000000000000e+00 1269 1269 1.00000000000000e+00 1270 1270 1.00000000000000e+00 1271 1271 1.00000000000000e+00 1272 1272 1.00000000000000e+00 1273 1273 1.00000000000000e+00 1274 1274 1.00000000000000e+00 1275 1275 1.00000000000000e+00 1276 1276 1.00000000000000e+00 1277 1277 1.00000000000000e+00 1278 1278 1.00000000000000e+00 1279 1279 1.00000000000000e+00 1280 1280 1.00000000000000e+00 1281 1281 1.00000000000000e+00 1282 1282 1.00000000000000e+00 1283 1283 1.00000000000000e+00 1284 1284 1.00000000000000e+00 1285 1285 1.00000000000000e+00 1286 1286 1.00000000000000e+00 1287 1287 1.00000000000000e+00 1288 1288 1.00000000000000e+00 1289 1289 1.00000000000000e+00 1290 1290 1.00000000000000e+00 1291 1291 1.00000000000000e+00 1292 1292 1.00000000000000e+00 1293 1293 1.00000000000000e+00 1294 1294 1.00000000000000e+00 1295 1295 1.00000000000000e+00 1296 1296 1.00000000000000e+00 1297 1297 1.00000000000000e+00 1298 1298 1.00000000000000e+00 1299 1299 1.00000000000000e+00 1300 1300 1.00000000000000e+00 1301 1301 1.00000000000000e+00 1302 1302 1.00000000000000e+00 1303 1303 1.00000000000000e+00 1304 1304 1.00000000000000e+00 1305 1305 1.00000000000000e+00 1306 1306 1.00000000000000e+00 1307 1307 1.00000000000000e+00 1308 1308 1.00000000000000e+00 1309 1309 1.00000000000000e+00 1310 1310 1.00000000000000e+00 1311 1311 1.00000000000000e+00 1312 1312 1.00000000000000e+00 1313 1313 1.00000000000000e+00 1314 1314 1.00000000000000e+00 1315 1315 1.00000000000000e+00 1316 1316 1.00000000000000e+00 1317 1317 1.00000000000000e+00 1318 1318 1.00000000000000e+00 1319 1319 1.00000000000000e+00 1320 1320 1.00000000000000e+00 1321 1321 1.00000000000000e+00 1322 1322 1.00000000000000e+00 1323 1323 1.00000000000000e+00 1324 1324 1.00000000000000e+00 1325 1325 1.00000000000000e+00 1326 1326 1.00000000000000e+00 1327 1327 1.00000000000000e+00 1328 1328 1.00000000000000e+00 1329 1329 1.00000000000000e+00 1330 1330 1.00000000000000e+00 1331 1331 1.00000000000000e+00 1332 1332 1.00000000000000e+00 1333 1333 1.00000000000000e+00 1334 1334 1.00000000000000e+00 1335 1335 1.00000000000000e+00 1336 1336 1.00000000000000e+00 1337 1337 1.00000000000000e+00 1338 1338 1.00000000000000e+00 1339 1339 1.00000000000000e+00 1340 1340 1.00000000000000e+00 1341 1341 1.00000000000000e+00 1342 1342 1.00000000000000e+00 1343 1343 1.00000000000000e+00 1344 1344 1.00000000000000e+00 1345 1345 1.00000000000000e+00 1346 1346 1.00000000000000e+00 1347 1347 1.00000000000000e+00 1348 1348 1.00000000000000e+00 1349 1349 1.00000000000000e+00 1350 1350 1.00000000000000e+00 1351 1351 1.00000000000000e+00 1352 1352 1.00000000000000e+00 1353 1353 1.00000000000000e+00 1354 1354 1.00000000000000e+00 1355 1355 1.00000000000000e+00 1356 1356 1.00000000000000e+00 1357 1357 1.00000000000000e+00 1358 1358 1.00000000000000e+00 1359 1359 1.00000000000000e+00 1360 1360 1.00000000000000e+00 1361 1361 1.00000000000000e+00 1362 1362 1.00000000000000e+00 1363 1363 1.00000000000000e+00 1364 1364 1.00000000000000e+00 1365 1365 1.00000000000000e+00 1366 1366 1.00000000000000e+00 1367 1367 1.00000000000000e+00 1368 1368 1.00000000000000e+00 1369 1369 1.00000000000000e+00 1370 1370 1.00000000000000e+00 1371 1371 1.00000000000000e+00 1372 1372 1.00000000000000e+00 1373 1373 1.00000000000000e+00 1374 1374 1.00000000000000e+00 1375 1375 1.00000000000000e+00 1376 1376 1.00000000000000e+00 1377 1377 1.00000000000000e+00 1378 1378 1.00000000000000e+00 1379 1379 1.00000000000000e+00 1380 1380 1.00000000000000e+00 1381 1381 1.00000000000000e+00 1382 1382 1.00000000000000e+00 1383 1383 1.00000000000000e+00 1384 1384 1.00000000000000e+00 1385 1385 1.00000000000000e+00 1386 1386 1.00000000000000e+00 1387 1387 1.00000000000000e+00 1388 1388 1.00000000000000e+00 1389 1389 1.00000000000000e+00 1390 1390 1.00000000000000e+00 1391 1391 1.00000000000000e+00 1392 1392 1.00000000000000e+00 1393 1393 1.00000000000000e+00 1394 1394 1.00000000000000e+00 1395 1395 1.00000000000000e+00 1396 1396 1.00000000000000e+00 1397 1397 1.00000000000000e+00 1398 1398 1.00000000000000e+00 1399 1399 1.00000000000000e+00 1400 1400 1.00000000000000e+00 1401 1401 1.00000000000000e+00 1402 1402 1.00000000000000e+00 1403 1403 1.00000000000000e+00 1404 1404 1.00000000000000e+00 1405 1405 1.00000000000000e+00 1406 1406 1.00000000000000e+00 1407 1407 1.00000000000000e+00 1408 1408 1.00000000000000e+00 1409 1409 1.00000000000000e+00 1410 1410 1.00000000000000e+00 1411 1411 1.00000000000000e+00 1412 1412 1.00000000000000e+00 1413 1413 1.00000000000000e+00 1414 1414 1.00000000000000e+00 1415 1415 1.00000000000000e+00 1416 1416 1.00000000000000e+00 1417 1417 1.00000000000000e+00 1418 1418 1.00000000000000e+00 1419 1419 1.00000000000000e+00 1420 1420 1.00000000000000e+00 1421 1421 1.00000000000000e+00 1422 1422 1.00000000000000e+00 1423 1423 1.00000000000000e+00 1424 1424 1.00000000000000e+00 1425 1425 1.00000000000000e+00 1426 1426 1.00000000000000e+00 1427 1427 1.00000000000000e+00 1428 1428 1.00000000000000e+00 1429 1429 1.00000000000000e+00 1430 1430 1.00000000000000e+00 1431 1431 1.00000000000000e+00 1432 1432 1.00000000000000e+00 1433 1433 1.00000000000000e+00 1434 1434 1.00000000000000e+00 1435 1435 1.00000000000000e+00 1436 1436 1.00000000000000e+00 1437 1437 1.00000000000000e+00 1438 1438 1.00000000000000e+00 1439 1439 1.00000000000000e+00 1440 1440 1.00000000000000e+00 1441 1441 1.00000000000000e+00 1442 1442 1.00000000000000e+00 1443 1443 1.00000000000000e+00 1444 1444 1.00000000000000e+00 1445 1445 1.00000000000000e+00 1446 1446 1.00000000000000e+00 1447 1447 1.00000000000000e+00 1448 1448 1.00000000000000e+00 1449 1449 1.00000000000000e+00 1450 1450 1.00000000000000e+00 1451 1451 1.00000000000000e+00 1452 1452 1.00000000000000e+00 1453 1453 1.00000000000000e+00 1454 1454 1.00000000000000e+00 1455 1455 1.00000000000000e+00 1456 1456 1.00000000000000e+00 1457 1457 1.00000000000000e+00 1458 1458 1.00000000000000e+00 1459 1459 1.00000000000000e+00 1460 1460 1.00000000000000e+00 1461 1461 1.00000000000000e+00 1462 1462 1.00000000000000e+00 1463 1463 1.00000000000000e+00 1464 1464 1.00000000000000e+00 1465 1465 1.00000000000000e+00 1466 1466 1.00000000000000e+00 1467 1467 1.00000000000000e+00 1468 1468 1.00000000000000e+00 1469 1469 1.00000000000000e+00 1470 1470 1.00000000000000e+00 1471 1471 1.00000000000000e+00 1472 1472 1.00000000000000e+00 1473 1473 1.00000000000000e+00 1474 1474 1.00000000000000e+00 1475 1475 1.00000000000000e+00 1476 1476 1.00000000000000e+00 1477 1477 1.00000000000000e+00 1478 1478 1.00000000000000e+00 1479 1479 1.00000000000000e+00 1480 1480 1.00000000000000e+00 1481 1481 1.00000000000000e+00 1482 1482 1.00000000000000e+00 1483 1483 1.00000000000000e+00 1484 1484 1.00000000000000e+00 1485 1485 1.00000000000000e+00 1486 1486 1.00000000000000e+00 1487 1487 1.00000000000000e+00 1488 1488 1.00000000000000e+00 1489 1489 1.00000000000000e+00 1490 1490 1.00000000000000e+00 1491 1491 1.00000000000000e+00 1492 1492 1.00000000000000e+00 1493 1493 1.00000000000000e+00 1494 1494 1.00000000000000e+00 1495 1495 1.00000000000000e+00 1496 1496 1.00000000000000e+00 1497 1497 1.00000000000000e+00 1498 1498 1.00000000000000e+00 1499 1499 1.00000000000000e+00 1500 1500 1.00000000000000e+00 1501 1501 1.00000000000000e+00 1502 1502 1.00000000000000e+00 1503 1503 1.00000000000000e+00 1504 1504 1.00000000000000e+00 1505 1505 1.00000000000000e+00 1506 1506 1.00000000000000e+00 1507 1507 1.00000000000000e+00 1508 1508 1.00000000000000e+00 1509 1509 1.00000000000000e+00 1510 1510 1.00000000000000e+00 1511 1511 1.00000000000000e+00 1512 1512 1.00000000000000e+00 1513 1513 1.00000000000000e+00 1514 1514 1.00000000000000e+00 1515 1515 1.00000000000000e+00 1516 1516 1.00000000000000e+00 1517 1517 1.00000000000000e+00 1518 1518 1.00000000000000e+00 1519 1519 1.00000000000000e+00 1520 1520 1.00000000000000e+00 1521 1521 1.00000000000000e+00 1522 1522 1.00000000000000e+00 1523 1523 1.00000000000000e+00 1524 1524 1.00000000000000e+00 1525 1525 1.00000000000000e+00 1526 1526 1.00000000000000e+00 1527 1527 1.00000000000000e+00 1528 1528 1.00000000000000e+00 1529 1529 1.00000000000000e+00 1530 1530 1.00000000000000e+00 1531 1531 1.00000000000000e+00 1532 1532 1.00000000000000e+00 1533 1533 1.00000000000000e+00 1534 1534 1.00000000000000e+00 1535 1535 1.00000000000000e+00 1536 1536 1.00000000000000e+00 1537 1537 1.00000000000000e+00 1538 1538 1.00000000000000e+00 1539 1539 1.00000000000000e+00 1540 1540 1.00000000000000e+00 1541 1541 1.00000000000000e+00 1542 1542 1.00000000000000e+00 1543 1543 1.00000000000000e+00 1544 1544 1.00000000000000e+00 1545 1545 1.00000000000000e+00 1546 1546 1.00000000000000e+00 1547 1547 1.00000000000000e+00 1548 1548 1.00000000000000e+00 1549 1549 1.00000000000000e+00 1550 1550 1.00000000000000e+00 1551 1551 1.00000000000000e+00 1552 1552 1.00000000000000e+00 1553 1553 1.00000000000000e+00 1554 1554 1.00000000000000e+00 1555 1555 1.00000000000000e+00 1556 1556 1.00000000000000e+00 1557 1557 1.00000000000000e+00 1558 1558 1.00000000000000e+00 1559 1559 1.00000000000000e+00 1560 1560 1.00000000000000e+00 1561 1561 1.00000000000000e+00 1562 1562 1.00000000000000e+00 1563 1563 1.00000000000000e+00 1564 1564 1.00000000000000e+00 1565 1565 1.00000000000000e+00 1566 1566 1.00000000000000e+00 1567 1567 1.00000000000000e+00 1568 1568 1.00000000000000e+00 1569 1569 1.00000000000000e+00 1570 1570 1.00000000000000e+00 1571 1571 1.00000000000000e+00 1572 1572 1.00000000000000e+00 1573 1573 1.00000000000000e+00 1574 1574 1.00000000000000e+00 1575 1575 1.00000000000000e+00 1576 1576 1.00000000000000e+00 1577 1577 1.00000000000000e+00 1578 1578 1.00000000000000e+00 1579 1579 1.00000000000000e+00 1580 1580 1.00000000000000e+00 1581 1581 1.00000000000000e+00 1582 1582 1.00000000000000e+00 1583 1583 1.00000000000000e+00 1584 1584 1.00000000000000e+00 1585 1585 1.00000000000000e+00 1586 1586 1.00000000000000e+00 1587 1587 1.00000000000000e+00 1588 1588 1.00000000000000e+00 1589 1589 1.00000000000000e+00 1590 1590 1.00000000000000e+00 1591 1591 1.00000000000000e+00 1592 1592 1.00000000000000e+00 1593 1593 1.00000000000000e+00 1594 1594 1.00000000000000e+00 1595 1595 1.00000000000000e+00 1596 1596 1.00000000000000e+00 1597 1597 1.00000000000000e+00 1598 1598 1.00000000000000e+00 1599 1599 1.00000000000000e+00 1600 1600 1.00000000000000e+00 1601 1601 1.00000000000000e+00 1602 1602 1.00000000000000e+00 1603 1603 1.00000000000000e+00 1604 1604 1.00000000000000e+00 1605 1605 1.00000000000000e+00 1606 1606 1.00000000000000e+00 1607 1607 1.00000000000000e+00 1608 1608 1.00000000000000e+00 1609 1609 1.00000000000000e+00 1610 1610 1.00000000000000e+00 1611 1611 1.00000000000000e+00 1612 1612 1.00000000000000e+00 1613 1613 1.00000000000000e+00 1614 1614 1.00000000000000e+00 1615 1615 1.00000000000000e+00 1616 1616 1.00000000000000e+00 1617 1617 1.00000000000000e+00 1618 1618 1.00000000000000e+00 1619 1619 1.00000000000000e+00 1620 1620 1.00000000000000e+00 1621 1621 1.00000000000000e+00 1622 1622 1.00000000000000e+00 1623 1623 1.00000000000000e+00 1624 1624 1.00000000000000e+00 1625 1625 1.00000000000000e+00 1626 1626 1.00000000000000e+00 1627 1627 1.00000000000000e+00 1628 1628 1.00000000000000e+00 1629 1629 1.00000000000000e+00 1630 1630 1.00000000000000e+00 1631 1631 1.00000000000000e+00 1632 1632 1.00000000000000e+00 1633 1633 1.00000000000000e+00 1634 1634 1.00000000000000e+00 1635 1635 1.00000000000000e+00 1636 1636 1.00000000000000e+00 1637 1637 1.00000000000000e+00 1638 1638 1.00000000000000e+00 1639 1639 1.00000000000000e+00 1640 1640 1.00000000000000e+00 1641 1641 1.00000000000000e+00 1642 1642 1.00000000000000e+00 1643 1643 1.00000000000000e+00 1644 1644 1.00000000000000e+00 1645 1645 1.00000000000000e+00 1646 1646 1.00000000000000e+00 1647 1647 1.00000000000000e+00 1648 1648 1.00000000000000e+00 1649 1649 1.00000000000000e+00 1650 1650 1.00000000000000e+00 1651 1651 1.00000000000000e+00 1652 1652 1.00000000000000e+00 1653 1653 1.00000000000000e+00 1654 1654 1.00000000000000e+00 1655 1655 1.00000000000000e+00 1656 1656 1.00000000000000e+00 1657 1657 1.00000000000000e+00 1658 1658 1.00000000000000e+00 1659 1659 1.00000000000000e+00 1660 1660 1.00000000000000e+00 1661 1661 1.00000000000000e+00 1662 1662 1.00000000000000e+00 1663 1663 1.00000000000000e+00 1664 1664 1.00000000000000e+00 1665 1665 1.00000000000000e+00 1666 1666 1.00000000000000e+00 1667 1667 1.00000000000000e+00 1668 1668 1.00000000000000e+00 1669 1669 1.00000000000000e+00 1670 1670 1.00000000000000e+00 1671 1671 1.00000000000000e+00 1672 1672 1.00000000000000e+00 1673 1673 1.00000000000000e+00 1674 1674 1.00000000000000e+00 1675 1675 1.00000000000000e+00 1676 1676 1.00000000000000e+00 1677 1677 1.00000000000000e+00 1678 1678 1.00000000000000e+00 1679 1679 1.00000000000000e+00 1680 1680 1.00000000000000e+00 1681 1681 1.00000000000000e+00 1682 1682 1.00000000000000e+00 1683 1683 1.00000000000000e+00 1684 1684 1.00000000000000e+00 1685 1685 1.00000000000000e+00 1686 1686 1.00000000000000e+00 1687 1687 1.00000000000000e+00 1688 1688 1.00000000000000e+00 1689 1689 1.00000000000000e+00 1690 1690 1.00000000000000e+00 1691 1691 1.00000000000000e+00 1692 1692 1.00000000000000e+00 1693 1693 1.00000000000000e+00 1694 1694 1.00000000000000e+00 1695 1695 1.00000000000000e+00 1696 1696 1.00000000000000e+00 1697 1697 1.00000000000000e+00 1698 1698 1.00000000000000e+00 1699 1699 1.00000000000000e+00 1700 1700 1.00000000000000e+00 1701 1701 1.00000000000000e+00 1702 1702 1.00000000000000e+00 1703 1703 1.00000000000000e+00 1704 1704 1.00000000000000e+00 1705 1705 1.00000000000000e+00 1706 1706 1.00000000000000e+00 1707 1707 1.00000000000000e+00 1708 1708 1.00000000000000e+00 1709 1709 1.00000000000000e+00 1710 1710 1.00000000000000e+00 1711 1711 1.00000000000000e+00 1712 1712 1.00000000000000e+00 1713 1713 1.00000000000000e+00 1714 1714 1.00000000000000e+00 1715 1715 1.00000000000000e+00 1716 1716 1.00000000000000e+00 1717 1717 1.00000000000000e+00 1718 1718 1.00000000000000e+00 1719 1719 1.00000000000000e+00 1720 1720 1.00000000000000e+00 1721 1721 1.00000000000000e+00 1722 1722 1.00000000000000e+00 1723 1723 1.00000000000000e+00 1724 1724 1.00000000000000e+00 1725 1725 1.00000000000000e+00 1726 1726 1.00000000000000e+00 1727 1727 1.00000000000000e+00 1728 1728 1.00000000000000e+00 1729 1729 1.00000000000000e+00 1730 1730 1.00000000000000e+00 1731 1731 1.00000000000000e+00 1732 1732 1.00000000000000e+00 1733 1733 1.00000000000000e+00 1734 1734 1.00000000000000e+00 1735 1735 1.00000000000000e+00 1736 1736 1.00000000000000e+00 1737 1737 1.00000000000000e+00 1738 1738 1.00000000000000e+00 1739 1739 1.00000000000000e+00 1740 1740 1.00000000000000e+00 1741 1741 1.00000000000000e+00 1742 1742 1.00000000000000e+00 1743 1743 1.00000000000000e+00 1744 1744 1.00000000000000e+00 1745 1745 1.00000000000000e+00 1746 1746 1.00000000000000e+00 1747 1747 1.00000000000000e+00 1748 1748 1.00000000000000e+00 1749 1749 1.00000000000000e+00 1750 1750 1.00000000000000e+00 1751 1751 1.00000000000000e+00 1752 1752 1.00000000000000e+00 1753 1753 1.00000000000000e+00 1754 1754 1.00000000000000e+00 1755 1755 1.00000000000000e+00 1756 1756 1.00000000000000e+00 1757 1757 1.00000000000000e+00 1758 1758 1.00000000000000e+00 1759 1759 1.00000000000000e+00 1760 1760 1.00000000000000e+00 1761 1761 1.00000000000000e+00 1762 1762 1.00000000000000e+00 1763 1763 1.00000000000000e+00 1764 1764 1.00000000000000e+00 1765 1765 1.00000000000000e+00 1766 1766 1.00000000000000e+00 1767 1767 1.00000000000000e+00 1768 1768 1.00000000000000e+00 1769 1769 1.00000000000000e+00 1770 1770 1.00000000000000e+00 1771 1771 1.00000000000000e+00 1772 1772 1.00000000000000e+00 1773 1773 1.00000000000000e+00 1774 1774 1.00000000000000e+00 1775 1775 1.00000000000000e+00 1776 1776 1.00000000000000e+00 1777 1777 1.00000000000000e+00 1778 1778 1.00000000000000e+00 1779 1779 1.00000000000000e+00 1780 1780 1.00000000000000e+00 1781 1781 1.00000000000000e+00 1782 1782 1.00000000000000e+00 1783 1783 1.00000000000000e+00 1784 1784 1.00000000000000e+00 1785 1785 1.00000000000000e+00 1786 1786 1.00000000000000e+00 1787 1787 1.00000000000000e+00 1788 1788 1.00000000000000e+00 1789 1789 1.00000000000000e+00 1790 1790 1.00000000000000e+00 1791 1791 1.00000000000000e+00 1792 1792 1.00000000000000e+00 1793 1793 1.00000000000000e+00 1794 1794 1.00000000000000e+00 1795 1795 1.00000000000000e+00 1796 1796 1.00000000000000e+00 1797 1797 1.00000000000000e+00 1798 1798 1.00000000000000e+00 1799 1799 1.00000000000000e+00 1800 1800 1.00000000000000e+00 1801 1801 1.00000000000000e+00 1802 1802 1.00000000000000e+00 1803 1803 1.00000000000000e+00 1804 1804 1.00000000000000e+00 1805 1805 1.00000000000000e+00 1806 1806 1.00000000000000e+00 1807 1807 1.00000000000000e+00 1808 1808 1.00000000000000e+00 1809 1809 1.00000000000000e+00 1810 1810 1.00000000000000e+00 1811 1811 1.00000000000000e+00 1812 1812 1.00000000000000e+00 1813 1813 1.00000000000000e+00 1814 1814 1.00000000000000e+00 1815 1815 1.00000000000000e+00 1816 1816 1.00000000000000e+00 1817 1817 1.00000000000000e+00 1818 1818 1.00000000000000e+00 1819 1819 1.00000000000000e+00 1820 1820 1.00000000000000e+00 1821 1821 1.00000000000000e+00 1822 1822 1.00000000000000e+00 1823 1823 1.00000000000000e+00 1824 1824 1.00000000000000e+00 1825 1825 1.00000000000000e+00 1826 1826 1.00000000000000e+00 1827 1827 1.00000000000000e+00 1828 1828 1.00000000000000e+00 1829 1829 1.00000000000000e+00 1830 1830 1.00000000000000e+00 1831 1831 1.00000000000000e+00 1832 1832 1.00000000000000e+00 1833 1833 1.00000000000000e+00 1834 1834 1.00000000000000e+00 1835 1835 1.00000000000000e+00 1836 1836 1.00000000000000e+00 1837 1837 1.00000000000000e+00 1838 1838 1.00000000000000e+00 1839 1839 1.00000000000000e+00 1840 1840 1.00000000000000e+00 1841 1841 1.00000000000000e+00 1842 1842 1.00000000000000e+00 1843 1843 1.00000000000000e+00 1844 1844 1.00000000000000e+00 1845 1845 1.00000000000000e+00 1846 1846 1.00000000000000e+00 1847 1847 1.00000000000000e+00 1848 1848 1.00000000000000e+00 1849 1849 1.00000000000000e+00 1850 1850 1.00000000000000e+00 1851 1851 1.00000000000000e+00 1852 1852 1.00000000000000e+00 1853 1853 1.00000000000000e+00 1854 1854 1.00000000000000e+00 1855 1855 1.00000000000000e+00 1856 1856 1.00000000000000e+00 1857 1857 1.00000000000000e+00 1858 1858 1.00000000000000e+00 1859 1859 1.00000000000000e+00 1860 1860 1.00000000000000e+00 1861 1861 1.00000000000000e+00 1862 1862 1.00000000000000e+00 1863 1863 1.00000000000000e+00 1864 1864 1.00000000000000e+00 1865 1865 1.00000000000000e+00 1866 1866 1.00000000000000e+00 1867 1867 1.00000000000000e+00 1868 1868 1.00000000000000e+00 1869 1869 1.00000000000000e+00 1870 1870 1.00000000000000e+00 1871 1871 1.00000000000000e+00 1872 1872 1.00000000000000e+00 1873 1873 1.00000000000000e+00 1874 1874 1.00000000000000e+00 1875 1875 1.00000000000000e+00 1876 1876 1.00000000000000e+00 1877 1877 1.00000000000000e+00 1878 1878 1.00000000000000e+00 1879 1879 1.00000000000000e+00 1880 1880 1.00000000000000e+00 1881 1881 1.00000000000000e+00 1882 1882 1.00000000000000e+00 1883 1883 1.00000000000000e+00 1884 1884 1.00000000000000e+00 1885 1885 1.00000000000000e+00 1886 1886 1.00000000000000e+00 1887 1887 1.00000000000000e+00 1888 1888 1.00000000000000e+00 1889 1889 1.00000000000000e+00 1890 1890 1.00000000000000e+00 1891 1891 1.00000000000000e+00 1892 1892 1.00000000000000e+00 1893 1893 1.00000000000000e+00 1894 1894 1.00000000000000e+00 1895 1895 1.00000000000000e+00 1896 1896 1.00000000000000e+00 1897 1897 1.00000000000000e+00 1898 1898 1.00000000000000e+00 1899 1899 1.00000000000000e+00 1900 1900 1.00000000000000e+00 1901 1901 1.00000000000000e+00 1902 1902 1.00000000000000e+00 1903 1903 1.00000000000000e+00 1904 1904 1.00000000000000e+00 1905 1905 1.00000000000000e+00 1906 1906 1.00000000000000e+00 1907 1907 1.00000000000000e+00 1908 1908 1.00000000000000e+00 1909 1909 1.00000000000000e+00 1910 1910 1.00000000000000e+00 1911 1911 1.00000000000000e+00 1912 1912 1.00000000000000e+00 1913 1913 1.00000000000000e+00 1914 1914 1.00000000000000e+00 1915 1915 1.00000000000000e+00 1916 1916 1.00000000000000e+00 1917 1917 1.00000000000000e+00 1918 1918 1.00000000000000e+00 1919 1919 1.00000000000000e+00 1920 1920 1.00000000000000e+00 1921 1921 1.00000000000000e+00 1922 1922 1.00000000000000e+00 1923 1923 1.00000000000000e+00 1924 1924 1.00000000000000e+00 1925 1925 1.00000000000000e+00 1926 1926 1.00000000000000e+00 1927 1927 1.00000000000000e+00 1928 1928 1.00000000000000e+00 1929 1929 1.00000000000000e+00 1930 1930 1.00000000000000e+00 1931 1931 1.00000000000000e+00 1932 1932 1.00000000000000e+00 1933 1933 1.00000000000000e+00 1934 1934 1.00000000000000e+00 1935 1935 1.00000000000000e+00 1936 1936 1.00000000000000e+00 1937 1937 1.00000000000000e+00 1938 1938 1.00000000000000e+00 1939 1939 1.00000000000000e+00 1940 1940 1.00000000000000e+00 1941 1941 1.00000000000000e+00 1942 1942 1.00000000000000e+00 1943 1943 1.00000000000000e+00 1944 1944 1.00000000000000e+00 1945 1945 1.00000000000000e+00 1946 1946 1.00000000000000e+00 1947 1947 1.00000000000000e+00 1948 1948 1.00000000000000e+00 1949 1949 1.00000000000000e+00 1950 1950 1.00000000000000e+00 1951 1951 1.00000000000000e+00 1952 1952 1.00000000000000e+00 1953 1953 1.00000000000000e+00 1954 1954 1.00000000000000e+00 1955 1955 1.00000000000000e+00 1956 1956 1.00000000000000e+00 1957 1957 1.00000000000000e+00 1958 1958 1.00000000000000e+00 1959 1959 1.00000000000000e+00 1960 1960 1.00000000000000e+00 1961 1961 1.00000000000000e+00 1962 1962 1.00000000000000e+00 1963 1963 1.00000000000000e+00 1964 1964 1.00000000000000e+00 1965 1965 1.00000000000000e+00 1966 1966 1.00000000000000e+00 1967 1967 1.00000000000000e+00 1968 1968 1.00000000000000e+00 1969 1969 1.00000000000000e+00 1970 1970 1.00000000000000e+00 1971 1971 1.00000000000000e+00 1972 1972 1.00000000000000e+00 1973 1973 1.00000000000000e+00 1974 1974 1.00000000000000e+00 1975 1975 1.00000000000000e+00 1976 1976 1.00000000000000e+00 1977 1977 1.00000000000000e+00 1978 1978 1.00000000000000e+00 1979 1979 1.00000000000000e+00 1980 1980 1.00000000000000e+00 1981 1981 1.00000000000000e+00 1982 1982 1.00000000000000e+00 1983 1983 1.00000000000000e+00 1984 1984 1.00000000000000e+00 1985 1985 1.00000000000000e+00 1986 1986 1.00000000000000e+00 1987 1987 1.00000000000000e+00 1988 1988 1.00000000000000e+00 1989 1989 1.00000000000000e+00 1990 1990 1.00000000000000e+00 1991 1991 1.00000000000000e+00 1992 1992 1.00000000000000e+00 1993 1993 1.00000000000000e+00 1994 1994 1.00000000000000e+00 1995 1995 1.00000000000000e+00 1996 1996 1.00000000000000e+00 1997 1997 1.00000000000000e+00 1998 1998 1.00000000000000e+00 1999 1999 1.00000000000000e+00 2000 2000 1.00000000000000e+00 2001 2001 1.00000000000000e+00 2002 2002 1.00000000000000e+00 2003 2003 1.00000000000000e+00 2004 2004 1.00000000000000e+00 2005 2005 1.00000000000000e+00 2006 2006 1.00000000000000e+00 2007 2007 1.00000000000000e+00 2008 2008 1.00000000000000e+00 2009 2009 1.00000000000000e+00 2010 2010 1.00000000000000e+00 2011 2011 1.00000000000000e+00 2012 2012 1.00000000000000e+00 2013 2013 1.00000000000000e+00 2014 2014 1.00000000000000e+00 2015 2015 1.00000000000000e+00 2016 2016 1.00000000000000e+00 2017 2017 1.00000000000000e+00 2018 2018 1.00000000000000e+00 2019 2019 1.00000000000000e+00 2020 2020 1.00000000000000e+00 2021 2021 1.00000000000000e+00 2022 2022 1.00000000000000e+00 2023 2023 1.00000000000000e+00 2024 2024 1.00000000000000e+00 2025 2025 1.00000000000000e+00 2026 2026 1.00000000000000e+00 2027 2027 1.00000000000000e+00 2028 2028 1.00000000000000e+00 2029 2029 1.00000000000000e+00 2030 2030 1.00000000000000e+00 2031 2031 1.00000000000000e+00 2032 2032 1.00000000000000e+00 2033 2033 1.00000000000000e+00 2034 2034 1.00000000000000e+00 2035 2035 1.00000000000000e+00 2036 2036 1.00000000000000e+00 2037 2037 1.00118062439057e+00 2037 2061 6.14289272445784e-03 2037 2085 5.45386769826278e-05 2037 2637 2.46870374499711e-02 2037 2661 1.09822659070729e-01 2037 2685 7.20909761037706e-03 2037 2709 3.38261348833630e-07 2037 3237 1.06727575900903e-02 2037 3261 2.33776633015668e-02 2037 3285 2.79091754131915e-03 2037 3309 2.84965056096460e-07 2037 3837 4.59011807340396e-05 2037 3861 7.20900767794626e-05 2037 3885 4.55990495249551e-06 2037 15000 -6.22474803362324e-02 2037 15024 -3.88419704019061e-02 2037 15048 -2.20520863822570e-03 2037 15408 -4.69807489686164e-02 2037 15432 -2.76749461282608e-02 2037 15456 -1.19559189827217e-03 2037 15816 -4.53057394300007e-03 2037 15840 -2.35827455065936e-03 2037 15864 -2.65678797598061e-05 2038 2038 1.00000000000000e+00 2039 2039 1.00000000000000e+00 2040 2040 1.00000000000000e+00 2041 2041 1.00000000000000e+00 2042 2042 1.00000000000000e+00 2043 2043 1.00000000000000e+00 2044 2044 1.00000000000000e+00 2045 2045 1.00000000000000e+00 2046 2046 1.00000000000000e+00 2047 2047 1.00000000000000e+00 2048 2048 1.00000000000000e+00 2049 2049 1.00000000000000e+00 2050 2050 1.00000000000000e+00 2051 2051 1.00000000000000e+00 2052 2052 1.00000000000000e+00 2053 2053 1.00000000000000e+00 2054 2054 1.00000000000000e+00 2055 2055 1.00000000000000e+00 2056 2056 1.00000000000000e+00 2057 2057 1.00000000000000e+00 2058 2058 1.00000000000000e+00 2059 2059 1.00000000000000e+00 2060 2060 1.00000000000000e+00 2061 2061 1.03255630443834e+00 2061 2037 6.14289272445784e-03 2061 2085 3.16146648534741e-04 2061 2637 1.19790234883611e-01 2061 2661 6.14209279220181e-01 2061 2685 6.52632710066743e-02 2061 2709 4.09279816281546e-06 2061 3237 4.36793967859312e-02 2061 3261 1.30411080783781e-01 2061 3285 3.06976858560456e-02 2061 3309 3.44776521549161e-06 2061 3837 1.80194811187150e-04 2061 3861 3.54827271089046e-04 2061 3885 3.30881342016367e-05 2061 15000 -3.31168804452562e-01 2061 15024 -2.58559228758133e-01 2061 15048 -2.65642361519578e-02 2061 15408 -2.25383879039393e-01 2061 15432 -1.61524079405966e-01 2061 15456 -1.39520399675055e-02 2061 15816 -1.70855648037462e-02 2061 15840 -9.21270429339967e-03 2061 15864 -1.91406254721879e-04 2062 2062 1.00000000000000e+00 2063 2063 1.00000000000000e+00 2064 2064 1.00000000000000e+00 2065 2065 1.00000000000000e+00 2066 2066 1.00000000000000e+00 2067 2067 1.00000000000000e+00 2068 2068 1.00000000000000e+00 2069 2069 1.00000000000000e+00 2070 2070 1.00000000000000e+00 2071 2071 1.00000000000000e+00 2072 2072 1.00000000000000e+00 2073 2073 1.00000000000000e+00 2074 2074 1.00000000000000e+00 2075 2075 1.00000000000000e+00 2076 2076 1.00000000000000e+00 2077 2077 1.00000000000000e+00 2078 2078 1.00000000000000e+00 2079 2079 1.00000000000000e+00 2080 2080 1.00000000000000e+00 2081 2081 1.00000000000000e+00 2082 2082 1.00000000000000e+00 2083 2083 1.00000000000000e+00 2084 2084 1.00000000000000e+00 2085 2085 1.00000435929869e+00 2085 2037 5.45386769826278e-05 2085 2061 3.16146648534741e-04 2085 2637 9.64122588329135e-04 2085 2661 8.11544335798943e-03 2085 2685 1.95729919479387e-03 2085 2709 1.52197706490310e-07 2085 3237 2.13706456323183e-04 2085 3261 2.07534537618295e-03 2085 3285 1.07228177540026e-03 2085 3309 1.28205453431010e-07 2085 3837 7.09230616116290e-07 2085 3861 3.19208832744818e-06 2085 3885 5.18496828096290e-07 2085 15000 -3.44015283048547e-03 2085 15024 -5.16422235334543e-03 2085 15048 -9.84041696600769e-04 2085 15408 -1.89434110109505e-03 2085 15432 -2.70507787133988e-03 2085 15456 -5.02259234512101e-04 2085 15816 -4.97899102435188e-05 2085 15840 -3.51333413334755e-05 2085 15864 -2.92525320334745e-06 2086 2086 1.00000000000000e+00 2087 2087 1.00000000000000e+00 2088 2088 1.00000000000000e+00 2089 2089 1.00000000000000e+00 2090 2090 1.00000000000000e+00 2091 2091 1.00000000000000e+00 2092 2092 1.00000000000000e+00 2093 2093 1.00000000000000e+00 2094 2094 1.00000000000000e+00 2095 2095 1.00000000000000e+00 2096 2096 1.00000000000000e+00 2097 2097 1.00000000000000e+00 2098 2098 1.00000000000000e+00 2099 2099 1.00000000000000e+00 2100 2100 1.00000000000000e+00 2101 2101 1.00000000000000e+00 2102 2102 1.00000000000000e+00 2103 2103 1.00000000000000e+00 2104 2104 1.00000000000000e+00 2105 2105 1.00000000000000e+00 2106 2106 1.00000000000000e+00 2107 2107 1.00000000000000e+00 2108 2108 1.00000000000000e+00 2109 2109 1.00000000000000e+00 2110 2110 1.00000000000000e+00 2111 2111 1.00000000000000e+00 2112 2112 1.00000000000000e+00 2113 2113 1.00000000000000e+00 2114 2114 1.00000000000000e+00 2115 2115 1.00000000000000e+00 2116 2116 1.00000000000000e+00 2117 2117 1.00000000000000e+00 2118 2118 1.00000000000000e+00 2119 2119 1.00000000000000e+00 2120 2120 1.00000000000000e+00 2121 2121 1.00000000000000e+00 2122 2122 1.00000000000000e+00 2123 2123 1.00000000000000e+00 2124 2124 1.00000000000000e+00 2125 2125 1.00000000000000e+00 2126 2126 1.00000000000000e+00 2127 2127 1.00000000000000e+00 2128 2128 1.00000000000000e+00 2129 2129 1.00000000000000e+00 2130 2130 1.00000000000000e+00 2131 2131 1.00000000000000e+00 2132 2132 1.00000000000000e+00 2133 2133 1.00000000000000e+00 2134 2134 1.00000000000000e+00 2135 2135 1.00000000000000e+00 2136 2136 1.00000000000000e+00 2137 2137 1.00000000000000e+00 2138 2138 1.00000000000000e+00 2139 2139 1.00000000000000e+00 2140 2140 1.00000000000000e+00 2141 2141 1.00000000000000e+00 2142 2142 1.00000000000000e+00 2143 2143 1.00000000000000e+00 2144 2144 1.00000000000000e+00 2145 2145 1.00000000000000e+00 2146 2146 1.00000000000000e+00 2147 2147 1.00000000000000e+00 2148 2148 1.00000000000000e+00 2149 2149 1.00000000000000e+00 2150 2150 1.00000000000000e+00 2151 2151 1.00000000000000e+00 2152 2152 1.00000000000000e+00 2153 2153 1.00000000000000e+00 2154 2154 1.00000000000000e+00 2155 2155 1.00000000000000e+00 2156 2156 1.00000000000000e+00 2157 2157 1.00000000000000e+00 2158 2158 1.00000000000000e+00 2159 2159 1.00000000000000e+00 2160 2160 1.00000000000000e+00 2161 2161 1.00000000000000e+00 2162 2162 1.00000000000000e+00 2163 2163 1.00000000000000e+00 2164 2164 1.00000000000000e+00 2165 2165 1.00000000000000e+00 2166 2166 1.00000000000000e+00 2167 2167 1.00000000000000e+00 2168 2168 1.00000000000000e+00 2169 2169 1.00000000000000e+00 2170 2170 1.00000000000000e+00 2171 2171 1.00000000000000e+00 2172 2172 1.00000000000000e+00 2173 2173 1.00000000000000e+00 2174 2174 1.00000000000000e+00 2175 2175 1.00000000000000e+00 2176 2176 1.00000000000000e+00 2177 2177 1.00000000000000e+00 2178 2178 1.00000000000000e+00 2179 2179 1.00000000000000e+00 2180 2180 1.00000000000000e+00 2181 2181 1.00000000000000e+00 2182 2182 1.00000000000000e+00 2183 2183 1.00000000000000e+00 2184 2184 1.00000000000000e+00 2185 2185 1.00000000000000e+00 2186 2186 1.00000000000000e+00 2187 2187 1.00000000000000e+00 2188 2188 1.00000000000000e+00 2189 2189 1.00000000000000e+00 2190 2190 1.00000000000000e+00 2191 2191 1.00000000000000e+00 2192 2192 1.00000000000000e+00 2193 2193 1.00000000000000e+00 2194 2194 1.00000000000000e+00 2195 2195 1.00000000000000e+00 2196 2196 1.00000000000000e+00 2197 2197 1.00000000000000e+00 2198 2198 1.00000000000000e+00 2199 2199 1.00000000000000e+00 2200 2200 1.00000000000000e+00 2201 2201 1.00000000000000e+00 2202 2202 1.00000000000000e+00 2203 2203 1.00000000000000e+00 2204 2204 1.00000000000000e+00 2205 2205 1.00000000000000e+00 2206 2206 1.00000000000000e+00 2207 2207 1.00000000000000e+00 2208 2208 1.00000000000000e+00 2209 2209 1.00000000000000e+00 2210 2210 1.00000000000000e+00 2211 2211 1.00000000000000e+00 2212 2212 1.00000000000000e+00 2213 2213 1.00000000000000e+00 2214 2214 1.00000000000000e+00 2215 2215 1.00000000000000e+00 2216 2216 1.00000000000000e+00 2217 2217 1.00000000000000e+00 2218 2218 1.00000000000000e+00 2219 2219 1.00000000000000e+00 2220 2220 1.00000000000000e+00 2221 2221 1.00000000000000e+00 2222 2222 1.00000000000000e+00 2223 2223 1.00000000000000e+00 2224 2224 1.00000000000000e+00 2225 2225 1.00000000000000e+00 2226 2226 1.00000000000000e+00 2227 2227 1.00000000000000e+00 2228 2228 1.00000000000000e+00 2229 2229 1.00000000000000e+00 2230 2230 1.00000000000000e+00 2231 2231 1.00000000000000e+00 2232 2232 1.00000000000000e+00 2233 2233 1.00000000000000e+00 2234 2234 1.00000000000000e+00 2235 2235 1.00000000000000e+00 2236 2236 1.00000000000000e+00 2237 2237 1.00000000000000e+00 2238 2238 1.00000000000000e+00 2239 2239 1.00000000000000e+00 2240 2240 1.00000000000000e+00 2241 2241 1.00000000000000e+00 2242 2242 1.00000000000000e+00 2243 2243 1.00000000000000e+00 2244 2244 1.00000000000000e+00 2245 2245 1.00000000000000e+00 2246 2246 1.00000000000000e+00 2247 2247 1.00000000000000e+00 2248 2248 1.00000000000000e+00 2249 2249 1.00000000000000e+00 2250 2250 1.00000000000000e+00 2251 2251 1.00000000000000e+00 2252 2252 1.00000000000000e+00 2253 2253 1.00000000000000e+00 2254 2254 1.00000000000000e+00 2255 2255 1.00000000000000e+00 2256 2256 1.00000000000000e+00 2257 2257 1.00000000000000e+00 2258 2258 1.00000000000000e+00 2259 2259 1.00000000000000e+00 2260 2260 1.00000000000000e+00 2261 2261 1.00000000000000e+00 2262 2262 1.00000000000000e+00 2263 2263 1.00000000000000e+00 2264 2264 1.00000000000000e+00 2265 2265 1.00000000000000e+00 2266 2266 1.00000000000000e+00 2267 2267 1.00000000000000e+00 2268 2268 1.00000000000000e+00 2269 2269 1.00000000000000e+00 2270 2270 1.00000000000000e+00 2271 2271 1.00000000000000e+00 2272 2272 1.00000000000000e+00 2273 2273 1.00000000000000e+00 2274 2274 1.00000000000000e+00 2275 2275 1.00000000000000e+00 2276 2276 1.00000000000000e+00 2277 2277 1.00000000000000e+00 2278 2278 1.00000000000000e+00 2279 2279 1.00000000000000e+00 2280 2280 1.00000000000000e+00 2281 2281 1.00000000000000e+00 2282 2282 1.00000000000000e+00 2283 2283 1.00000000000000e+00 2284 2284 1.00000000000000e+00 2285 2285 1.00000000000000e+00 2286 2286 1.00000000000000e+00 2287 2287 1.00000000000000e+00 2288 2288 1.00000000000000e+00 2289 2289 1.00000000000000e+00 2290 2290 1.00000000000000e+00 2291 2291 1.00000000000000e+00 2292 2292 1.00000000000000e+00 2293 2293 1.00000000000000e+00 2294 2294 1.00000000000000e+00 2295 2295 1.00000000000000e+00 2296 2296 1.00000000000000e+00 2297 2297 1.00000000000000e+00 2298 2298 1.00000000000000e+00 2299 2299 1.00000000000000e+00 2300 2300 1.00000000000000e+00 2301 2301 1.00000000000000e+00 2302 2302 1.00000000000000e+00 2303 2303 1.00000000000000e+00 2304 2304 1.00000000000000e+00 2305 2305 1.00000000000000e+00 2306 2306 1.00000000000000e+00 2307 2307 1.00000000000000e+00 2308 2308 1.00000000000000e+00 2309 2309 1.00000000000000e+00 2310 2310 1.00000000000000e+00 2311 2311 1.00000000000000e+00 2312 2312 1.00000000000000e+00 2313 2313 1.00000000000000e+00 2314 2314 1.00000000000000e+00 2315 2315 1.00000000000000e+00 2316 2316 1.00000000000000e+00 2317 2317 1.00000000000000e+00 2318 2318 1.00000000000000e+00 2319 2319 1.00000000000000e+00 2320 2320 1.00000000000000e+00 2321 2321 1.00000000000000e+00 2322 2322 1.00000000000000e+00 2323 2323 1.00000000000000e+00 2324 2324 1.00000000000000e+00 2325 2325 1.00000000000000e+00 2326 2326 1.00000000000000e+00 2327 2327 1.00000000000000e+00 2328 2328 1.00000000000000e+00 2329 2329 1.00000000000000e+00 2330 2330 1.00000000000000e+00 2331 2331 1.00000000000000e+00 2332 2332 1.00000000000000e+00 2333 2333 1.00000000000000e+00 2334 2334 1.00000000000000e+00 2335 2335 1.00000000000000e+00 2336 2336 1.00000000000000e+00 2337 2337 1.00000000000000e+00 2338 2338 1.00000000000000e+00 2339 2339 1.00000000000000e+00 2340 2340 1.00000000000000e+00 2341 2341 1.00000000000000e+00 2342 2342 1.00000000000000e+00 2343 2343 1.00000000000000e+00 2344 2344 1.00000000000000e+00 2345 2345 1.00000000000000e+00 2346 2346 1.00000000000000e+00 2347 2347 1.00000000000000e+00 2348 2348 1.00000000000000e+00 2349 2349 1.00000000000000e+00 2350 2350 1.00000000000000e+00 2351 2351 1.00000000000000e+00 2352 2352 1.00000000000000e+00 2353 2353 1.00000000000000e+00 2354 2354 1.00000000000000e+00 2355 2355 1.00000000000000e+00 2356 2356 1.00000000000000e+00 2357 2357 1.00000000000000e+00 2358 2358 1.00000000000000e+00 2359 2359 1.00000000000000e+00 2360 2360 1.00000000000000e+00 2361 2361 1.00000000000000e+00 2362 2362 1.00000000000000e+00 2363 2363 1.00000000000000e+00 2364 2364 1.00000000000000e+00 2365 2365 1.00000000000000e+00 2366 2366 1.00000000000000e+00 2367 2367 1.00000000000000e+00 2368 2368 1.00000000000000e+00 2369 2369 1.00000000000000e+00 2370 2370 1.00000000000000e+00 2371 2371 1.00000000000000e+00 2372 2372 1.00000000000000e+00 2373 2373 1.00000000000000e+00 2374 2374 1.00000000000000e+00 2375 2375 1.00000000000000e+00 2376 2376 1.00000000000000e+00 2377 2377 1.00000000000000e+00 2378 2378 1.00000000000000e+00 2379 2379 1.00000000000000e+00 2380 2380 1.00000000000000e+00 2381 2381 1.00000000000000e+00 2382 2382 1.00000000000000e+00 2383 2383 1.00000000000000e+00 2384 2384 1.00000000000000e+00 2385 2385 1.00000000000000e+00 2386 2386 1.00000000000000e+00 2387 2387 1.00000000000000e+00 2388 2388 1.00000000000000e+00 2389 2389 1.00000000000000e+00 2390 2390 1.00000000000000e+00 2391 2391 1.00000000000000e+00 2392 2392 1.00000000000000e+00 2393 2393 1.00000000000000e+00 2394 2394 1.00000000000000e+00 2395 2395 1.00000000000000e+00 2396 2396 1.00000000000000e+00 2397 2397 1.00000000000000e+00 2398 2398 1.00000000000000e+00 2399 2399 1.00000000000000e+00 2400 2400 1.00000000000000e+00 2401 2401 1.00000000000000e+00 2402 2402 1.00000000000000e+00 2403 2403 1.00000000000000e+00 2404 2404 1.00000000000000e+00 2405 2405 1.00000000000000e+00 2406 2406 1.00000000000000e+00 2407 2407 1.00000000000000e+00 2408 2408 1.00000000000000e+00 2409 2409 1.00000000000000e+00 2410 2410 1.00000000000000e+00 2411 2411 1.00000000000000e+00 2412 2412 1.00000000000000e+00 2413 2413 1.00000000000000e+00 2414 2414 1.00000000000000e+00 2415 2415 1.00000000000000e+00 2416 2416 1.00000000000000e+00 2417 2417 1.00000000000000e+00 2418 2418 1.00000000000000e+00 2419 2419 1.00000000000000e+00 2420 2420 1.00000000000000e+00 2421 2421 1.00000000000000e+00 2422 2422 1.00000000000000e+00 2423 2423 1.00000000000000e+00 2424 2424 1.00000000000000e+00 2425 2425 1.00000000000000e+00 2426 2426 1.00000000000000e+00 2427 2427 1.00000000000000e+00 2428 2428 1.00000000000000e+00 2429 2429 1.00000000000000e+00 2430 2430 1.00000000000000e+00 2431 2431 1.00000000000000e+00 2432 2432 1.00000000000000e+00 2433 2433 1.00000000000000e+00 2434 2434 1.00000000000000e+00 2435 2435 1.00000000000000e+00 2436 2436 1.00000000000000e+00 2437 2437 1.00000000000000e+00 2438 2438 1.00000000000000e+00 2439 2439 1.00000000000000e+00 2440 2440 1.00000000000000e+00 2441 2441 1.00000000000000e+00 2442 2442 1.00000000000000e+00 2443 2443 1.00000000000000e+00 2444 2444 1.00000000000000e+00 2445 2445 1.00000000000000e+00 2446 2446 1.00000000000000e+00 2447 2447 1.00000000000000e+00 2448 2448 1.00000000000000e+00 2449 2449 1.00000000000000e+00 2450 2450 1.00000000000000e+00 2451 2451 1.00000000000000e+00 2452 2452 1.00000000000000e+00 2453 2453 1.00000000000000e+00 2454 2454 1.00000000000000e+00 2455 2455 1.00000000000000e+00 2456 2456 1.00000000000000e+00 2457 2457 1.00000000000000e+00 2458 2458 1.00000000000000e+00 2459 2459 1.00000000000000e+00 2460 2460 1.00000000000000e+00 2461 2461 1.00000000000000e+00 2462 2462 1.00000000000000e+00 2463 2463 1.00000000000000e+00 2464 2464 1.00000000000000e+00 2465 2465 1.00000000000000e+00 2466 2466 1.00000000000000e+00 2467 2467 1.00000000000000e+00 2468 2468 1.00000000000000e+00 2469 2469 1.00000000000000e+00 2470 2470 1.00000000000000e+00 2471 2471 1.00000000000000e+00 2472 2472 1.00000000000000e+00 2473 2473 1.00000000000000e+00 2474 2474 1.00000000000000e+00 2475 2475 1.00000000000000e+00 2476 2476 1.00000000000000e+00 2477 2477 1.00000000000000e+00 2478 2478 1.00000000000000e+00 2479 2479 1.00000000000000e+00 2480 2480 1.00000000000000e+00 2481 2481 1.00000000000000e+00 2482 2482 1.00000000000000e+00 2483 2483 1.00000000000000e+00 2484 2484 1.00000000000000e+00 2485 2485 1.00000000000000e+00 2486 2486 1.00000000000000e+00 2487 2487 1.00000000000000e+00 2488 2488 1.00000000000000e+00 2489 2489 1.00000000000000e+00 2490 2490 1.00000000000000e+00 2491 2491 1.00000000000000e+00 2492 2492 1.00000000000000e+00 2493 2493 1.00000000000000e+00 2494 2494 1.00000000000000e+00 2495 2495 1.00000000000000e+00 2496 2496 1.00000000000000e+00 2497 2497 1.00000000000000e+00 2498 2498 1.00000000000000e+00 2499 2499 1.00000000000000e+00 2500 2500 1.00000000000000e+00 2501 2501 1.00000000000000e+00 2502 2502 1.00000000000000e+00 2503 2503 1.00000000000000e+00 2504 2504 1.00000000000000e+00 2505 2505 1.00000000000000e+00 2506 2506 1.00000000000000e+00 2507 2507 1.00000000000000e+00 2508 2508 1.00000000000000e+00 2509 2509 1.00000000000000e+00 2510 2510 1.00000000000000e+00 2511 2511 1.00000000000000e+00 2512 2512 1.00000000000000e+00 2513 2513 1.00000000000000e+00 2514 2514 1.00000000000000e+00 2515 2515 1.00000000000000e+00 2516 2516 1.00000000000000e+00 2517 2517 1.00000000000000e+00 2518 2518 1.00000000000000e+00 2519 2519 1.00000000000000e+00 2520 2520 1.00000000000000e+00 2521 2521 1.00000000000000e+00 2522 2522 1.00000000000000e+00 2523 2523 1.00000000000000e+00 2524 2524 1.00000000000000e+00 2525 2525 1.00000000000000e+00 2526 2526 1.00000000000000e+00 2527 2527 1.00000000000000e+00 2528 2528 1.00000000000000e+00 2529 2529 1.00000000000000e+00 2530 2530 1.00000000000000e+00 2531 2531 1.00000000000000e+00 2532 2532 1.00000000000000e+00 2533 2533 1.00000000000000e+00 2534 2534 1.00000000000000e+00 2535 2535 1.00000000000000e+00 2536 2536 1.00000000000000e+00 2537 2537 1.00000000000000e+00 2538 2538 1.00000000000000e+00 2539 2539 1.00000000000000e+00 2540 2540 1.00000000000000e+00 2541 2541 1.00000000000000e+00 2542 2542 1.00000000000000e+00 2543 2543 1.00000000000000e+00 2544 2544 1.00000000000000e+00 2545 2545 1.00000000000000e+00 2546 2546 1.00000000000000e+00 2547 2547 1.00000000000000e+00 2548 2548 1.00000000000000e+00 2549 2549 1.00000000000000e+00 2550 2550 1.00000000000000e+00 2551 2551 1.00000000000000e+00 2552 2552 1.00000000000000e+00 2553 2553 1.00000000000000e+00 2554 2554 1.00000000000000e+00 2555 2555 1.00000000000000e+00 2556 2556 1.00000000000000e+00 2557 2557 1.00000000000000e+00 2558 2558 1.00000000000000e+00 2559 2559 1.00000000000000e+00 2560 2560 1.00000000000000e+00 2561 2561 1.00000000000000e+00 2562 2562 1.00000000000000e+00 2563 2563 1.00000000000000e+00 2564 2564 1.00000000000000e+00 2565 2565 1.00000000000000e+00 2566 2566 1.00000000000000e+00 2567 2567 1.00000000000000e+00 2568 2568 1.00000000000000e+00 2569 2569 1.00000000000000e+00 2570 2570 1.00000000000000e+00 2571 2571 1.00000000000000e+00 2572 2572 1.00000000000000e+00 2573 2573 1.00000000000000e+00 2574 2574 1.00000000000000e+00 2575 2575 1.00000000000000e+00 2576 2576 1.00000000000000e+00 2577 2577 1.00000000000000e+00 2578 2578 1.00000000000000e+00 2579 2579 1.00000000000000e+00 2580 2580 1.00000000000000e+00 2581 2581 1.00000000000000e+00 2582 2582 1.00000000000000e+00 2583 2583 1.00000000000000e+00 2584 2584 1.00000000000000e+00 2585 2585 1.00000000000000e+00 2586 2586 1.00000000000000e+00 2587 2587 1.00000000000000e+00 2588 2588 1.00000000000000e+00 2589 2589 1.00000000000000e+00 2590 2590 1.00000000000000e+00 2591 2591 1.00000000000000e+00 2592 2592 1.00000000000000e+00 2593 2593 1.00000000000000e+00 2594 2594 1.00000000000000e+00 2595 2595 1.00000000000000e+00 2596 2596 1.00000000000000e+00 2597 2597 1.00000000000000e+00 2598 2598 1.00000000000000e+00 2599 2599 1.00000000000000e+00 2600 2600 1.00000000000000e+00 2601 2601 1.00000000000000e+00 2602 2602 1.00000000000000e+00 2603 2603 1.00000000000000e+00 2604 2604 1.00000000000000e+00 2605 2605 1.00000000000000e+00 2606 2606 1.00000000000000e+00 2607 2607 1.00000000000000e+00 2608 2608 1.00000000000000e+00 2609 2609 1.00000000000000e+00 2610 2610 1.00000000000000e+00 2611 2611 1.00000000000000e+00 2612 2612 1.00000000000000e+00 2613 2613 1.00000000000000e+00 2614 2614 1.00000000000000e+00 2615 2615 1.00000000000000e+00 2616 2616 1.00000000000000e+00 2617 2617 1.00000000000000e+00 2618 2618 1.00000000000000e+00 2619 2619 1.00000000000000e+00 2620 2620 1.00000000000000e+00 2621 2621 1.00000000000000e+00 2622 2622 1.00000000000000e+00 2623 2623 1.00000000000000e+00 2624 2624 1.00000000000000e+00 2625 2625 1.00000000000000e+00 2626 2626 1.00000000000000e+00 2627 2627 1.00000000000000e+00 2628 2628 1.00000000000000e+00 2629 2629 1.00000000000000e+00 2630 2630 1.00000000000000e+00 2631 2631 1.00000000000000e+00 2632 2632 1.00000000000000e+00 2633 2633 1.00000000000000e+00 2634 2634 1.00000000000000e+00 2635 2635 1.00000000000000e+00 2636 2636 1.00000000000000e+00 2637 2637 2.89240257957879e+00 2637 2037 2.46870374499711e-02 2637 2061 1.19790234883611e-01 2637 2085 9.64122588329135e-04 2637 2661 4.66704907915603e+00 2637 2685 2.17844836818969e-01 2637 2709 1.01894477122350e-05 2637 3213 1.48846185431150e-02 2637 3237 2.93723459434132e+00 2637 3261 3.18335899755208e+00 2637 3285 1.45416647043228e-01 2637 3309 8.82040844097354e-06 2637 3813 1.18136420444713e-02 2637 3837 3.21523235303118e-01 2637 3861 1.29727964301456e-01 2637 3885 4.32657486010460e-03 2637 3909 4.80711473217600e-08 2637 4437 7.09412875459543e-05 2637 4461 2.54420757694263e-04 2637 4485 1.16629760528201e-06 2637 4509 8.34516350000000e-13 2637 15000 -1.86912480621183e+00 2637 15024 -1.21722609796363e+00 2637 15048 -8.07620712877337e-02 2637 15072 -2.73434565390910e-07 2637 15408 -4.54030951783678e+00 2637 15432 -2.63427490152780e+00 2637 15456 -1.04039244321090e-01 2637 15480 -1.32403957025801e-06 2637 15816 -1.81449700885238e+00 2637 15840 -1.03543496275687e+00 2637 15864 -3.66291396137364e-02 2637 15888 -1.19463980016838e-06 2637 16224 -2.11153262788651e-01 2637 16248 -1.22950809007927e-01 2637 16272 -4.96490615160416e-03 2637 16296 -2.30301308694370e-07 2638 2638 1.00000000000000e+00 2639 2639 1.00000000000000e+00 2640 2640 1.00000000000000e+00 2641 2641 1.00000000000000e+00 2642 2642 1.00000000000000e+00 2643 2643 1.00000000000000e+00 2644 2644 1.00000000000000e+00 2645 2645 1.00000000000000e+00 2646 2646 1.00000000000000e+00 2647 2647 1.00000000000000e+00 2648 2648 1.00000000000000e+00 2649 2649 1.00000000000000e+00 2650 2650 1.00000000000000e+00 2651 2651 1.00000000000000e+00 2652 2652 1.00000000000000e+00 2653 2653 1.00000000000000e+00 2654 2654 1.00000000000000e+00 2655 2655 1.00000000000000e+00 2656 2656 1.00000000000000e+00 2657 2657 1.00000000000000e+00 2658 2658 1.00000000000000e+00 2659 2659 1.00000000000000e+00 2660 2660 1.00000000000000e+00 2661 2661 2.23335933073396e+01 2661 2037 1.09822659070729e-01 2661 2061 6.14209279220181e-01 2661 2085 8.11544335798943e-03 2661 2637 4.66704907915603e+00 2661 2685 4.86555311739368e+00 2661 2709 7.50878594565593e-02 2661 2733 1.09086417370000e-10 2661 3213 9.22890593949129e-03 2661 3237 4.64065275503838e+00 2661 3261 1.07535791920085e+01 2661 3285 4.49687532095990e+00 2661 3309 2.76648894908239e-01 2661 3333 7.67643334023892e-06 2661 3813 7.34843574811677e-03 2661 3837 2.45504972402707e-01 2661 3861 2.79777465397475e-01 2661 3885 1.09481969201773e-01 2661 3909 7.50438699090477e-03 2661 3933 2.36590348617495e-06 2661 4437 1.20547285967300e-04 2661 4461 5.98389187080576e-04 2661 4485 1.08990327590319e-04 2661 4509 1.13169651915075e-06 2661 15000 -8.01986008310668e+00 2661 15024 -1.13506209985229e+01 2661 15048 -3.59414605494425e+00 2661 15072 -4.03388434389487e-01 2661 15096 -1.07822922226173e-04 2661 15408 -1.09051654129362e+01 2661 15432 -1.07635608328280e+01 2661 15456 -2.45302092463139e+00 2661 15480 -2.52264035490318e-01 2661 15504 -9.97392066839166e-05 2661 15816 -2.47118942806325e+00 2661 15840 -1.81132176135841e+00 2661 15864 -2.20635404010207e-01 2661 15888 -1.51639929481642e-02 2661 15912 -1.30936415916657e-05 2661 16224 -1.34917509756813e-01 2661 16248 -9.62596793221455e-02 2661 16272 -8.94430899049705e-03 2661 16296 -1.92627463307723e-04 2662 2662 1.00000000000000e+00 2663 2663 1.00000000000000e+00 2664 2664 1.00000000000000e+00 2665 2665 1.00000000000000e+00 2666 2666 1.00000000000000e+00 2667 2667 1.00000000000000e+00 2668 2668 1.00000000000000e+00 2669 2669 1.00000000000000e+00 2670 2670 1.00000000000000e+00 2671 2671 1.00000000000000e+00 2672 2672 1.00000000000000e+00 2673 2673 1.00000000000000e+00 2674 2674 1.00000000000000e+00 2675 2675 1.00000000000000e+00 2676 2676 1.00000000000000e+00 2677 2677 1.00000000000000e+00 2678 2678 1.00000000000000e+00 2679 2679 1.00000000000000e+00 2680 2680 1.00000000000000e+00 2681 2681 1.00000000000000e+00 2682 2682 1.00000000000000e+00 2683 2683 1.00000000000000e+00 2684 2684 1.00000000000000e+00 2685 2685 6.56924940955695e+00 2685 2037 7.20909761037706e-03 2685 2061 6.52632710066743e-02 2685 2085 1.95729919479387e-03 2685 2637 2.17844836818969e-01 2685 2661 4.86555311739368e+00 2685 2709 3.57682624143001e-01 2685 2733 1.65206772175220e-07 2685 3213 1.25052203376214e-06 2685 3237 1.27181616251688e-01 2685 3261 3.15491505639718e+00 2685 3285 9.52331039881100e+00 2685 3309 1.82785208832563e+00 2685 3333 1.20671885798248e-02 2685 3357 2.60784759250900e-08 2685 3813 1.36192251944492e-06 2685 3837 2.98352467610303e-03 2685 3861 9.08790737019995e-02 2685 3885 2.98235611124593e-01 2685 3909 1.55044360737322e-01 2685 3933 4.31692185634905e-03 2685 3957 3.84760914064400e-08 2685 4437 1.85443126627615e-06 2685 4461 3.87416569810659e-05 2685 4485 3.90821018534074e-04 2685 4509 2.98307779105627e-04 2685 4533 1.76345157057950e-06 2685 15000 -9.93950143461300e-01 2685 15024 -5.11769890541419e+00 2685 15048 -7.82386178903436e+00 2685 15072 -2.29847746643466e+00 2685 15096 -1.49586861259650e-01 2685 15120 -7.59934449608780e-04 2685 15408 -6.43859071509858e-01 2685 15432 -3.05351420152938e+00 2685 15456 -4.43068966198704e+00 2685 15480 -1.30109975791990e+00 2685 15504 -8.67773264820810e-02 2685 15528 -3.88025594488405e-04 2685 15816 -4.22648233034794e-02 2685 15840 -1.42656758267414e-01 2685 15864 -1.49049353647891e-01 2685 15888 -4.35226319330419e-02 2685 15912 -3.42397024350168e-03 2685 15936 -2.30239133829011e-06 2685 16224 -8.02216756130927e-05 2685 16248 -3.56454239513493e-04 2685 16272 -2.24151561366762e-04 2685 16296 -3.60143894674400e-05 2686 2686 1.00000000000000e+00 2687 2687 1.00000000000000e+00 2688 2688 1.00000000000000e+00 2689 2689 1.00000000000000e+00 2690 2690 1.00000000000000e+00 2691 2691 1.00000000000000e+00 2692 2692 1.00000000000000e+00 2693 2693 1.00000000000000e+00 2694 2694 1.00000000000000e+00 2695 2695 1.00000000000000e+00 2696 2696 1.00000000000000e+00 2697 2697 1.00000000000000e+00 2698 2698 1.00000000000000e+00 2699 2699 1.00000000000000e+00 2700 2700 1.00000000000000e+00 2701 2701 1.00000000000000e+00 2702 2702 1.00000000000000e+00 2703 2703 1.00000000000000e+00 2704 2704 1.00000000000000e+00 2705 2705 1.00000000000000e+00 2706 2706 1.00000000000000e+00 2707 2707 1.00000000000000e+00 2708 2708 1.00000000000000e+00 2709 2709 1.05242261230147e+00 2709 2037 3.38261348833630e-07 2709 2061 4.09279816281546e-06 2709 2085 1.52197706490310e-07 2709 2637 1.01894477122350e-05 2709 2661 7.50878594565593e-02 2709 2685 3.57682624143001e-01 2709 2733 1.23430727922290e-07 2709 3237 1.74314569669890e-05 2709 3261 1.02332936929997e-01 2709 3285 9.54978556178009e-01 2709 3309 5.82260908100780e-01 2709 3333 1.38154135506727e-02 2709 3357 1.47384460888300e-07 2709 3837 5.17938663274500e-06 2709 3861 2.93365015021248e-03 2709 3885 5.66352263340657e-02 2709 3909 9.79813381742708e-02 2709 3933 8.35456992673652e-03 2709 3957 2.17449701422410e-07 2709 4461 2.08930460891820e-07 2709 4485 1.60494948635366e-04 2709 4509 1.51134942095430e-04 2709 4533 9.01164771458639e-06 2709 15000 -6.75149496405289e-05 2709 15024 -1.38468320828470e-01 2709 15048 -6.58684771145473e-01 2709 15072 -5.65787260988341e-01 2709 15096 -1.22992818690726e-01 2709 15120 -4.29215165363144e-03 2709 15408 -3.45539493907760e-05 2709 15432 -7.30006766659667e-02 2709 15456 -3.49593855422099e-01 2709 15480 -3.07481855106385e-01 2709 15504 -6.68357069655295e-02 2709 15528 -2.18156224160910e-03 2709 15816 -2.27564163003290e-07 2709 15840 -1.07614750049477e-03 2709 15864 -5.78613424267483e-03 2709 15888 -7.02520703206120e-03 2709 15912 -1.52551360576180e-03 2709 15936 -1.01389756552504e-05 2710 2710 1.00000000000000e+00 2711 2711 1.00000000000000e+00 2712 2712 1.00000000000000e+00 2713 2713 1.00000000000000e+00 2714 2714 1.00000000000000e+00 2715 2715 1.00000000000000e+00 2716 2716 1.00000000000000e+00 2717 2717 1.00000000000000e+00 2718 2718 1.00000000000000e+00 2719 2719 1.00000000000000e+00 2720 2720 1.00000000000000e+00 2721 2721 1.00000000000000e+00 2722 2722 1.00000000000000e+00 2723 2723 1.00000000000000e+00 2724 2724 1.00000000000000e+00 2725 2725 1.00000000000000e+00 2726 2726 1.00000000000000e+00 2727 2727 1.00000000000000e+00 2728 2728 1.00000000000000e+00 2729 2729 1.00000000000000e+00 2730 2730 1.00000000000000e+00 2731 2731 1.00000000000000e+00 2732 2732 1.00000000000000e+00 2733 2733 1.00000000000106e+00 2733 2661 1.09086417370000e-10 2733 2685 1.65206772175220e-07 2733 2709 1.23430727922290e-07 2733 3261 2.22990279934000e-09 2733 3285 1.47101733658933e-06 2733 3309 4.40213679917619e-06 2733 3333 8.87085011605720e-07 2733 3357 2.16381754700000e-11 2733 3861 1.91012521360000e-10 2733 3885 1.76934258518440e-07 2733 3909 1.86054858380126e-06 2733 3933 8.87219725627850e-07 2733 3957 3.19243961200000e-11 2733 4461 3.55340800000000e-14 2733 4485 7.31269937100000e-11 2733 4509 9.32791876860000e-10 2733 4533 8.85453302770000e-10 2733 15048 -4.78380215078030e-07 2733 15072 -2.54244484549938e-06 2733 15096 -2.99407615582714e-06 2733 15120 -6.28923985187280e-07 2733 15456 -2.40186428761690e-07 2733 15480 -1.27580809196147e-06 2733 15504 -1.50043593642060e-06 2733 15528 -3.15062376914730e-07 2733 15864 -2.84663206480000e-10 2733 15888 -1.31019120337000e-09 2733 15912 -9.70816716290000e-10 2733 15936 -1.71538377450000e-10 2734 2734 1.00000000000000e+00 2735 2735 1.00000000000000e+00 2736 2736 1.00000000000000e+00 2737 2737 1.00000000000000e+00 2738 2738 1.00000000000000e+00 2739 2739 1.00000000000000e+00 2740 2740 1.00000000000000e+00 2741 2741 1.00000000000000e+00 2742 2742 1.00000000000000e+00 2743 2743 1.00000000000000e+00 2744 2744 1.00000000000000e+00 2745 2745 1.00000000000000e+00 2746 2746 1.00000000000000e+00 2747 2747 1.00000000000000e+00 2748 2748 1.00000000000000e+00 2749 2749 1.00000000000000e+00 2750 2750 1.00000000000000e+00 2751 2751 1.00000000000000e+00 2752 2752 1.00000000000000e+00 2753 2753 1.00000000000000e+00 2754 2754 1.00000000000000e+00 2755 2755 1.00000000000000e+00 2756 2756 1.00000000000000e+00 2757 2757 1.00000000000000e+00 2758 2758 1.00000000000000e+00 2759 2759 1.00000000000000e+00 2760 2760 1.00000000000000e+00 2761 2761 1.00000000000000e+00 2762 2762 1.00000000000000e+00 2763 2763 1.00000000000000e+00 2764 2764 1.00000000000000e+00 2765 2765 1.00000000000000e+00 2766 2766 1.00000000000000e+00 2767 2767 1.00000000000000e+00 2768 2768 1.00000000000000e+00 2769 2769 1.00000000000000e+00 2770 2770 1.00000000000000e+00 2771 2771 1.00000000000000e+00 2772 2772 1.00000000000000e+00 2773 2773 1.00000000000000e+00 2774 2774 1.00000000000000e+00 2775 2775 1.00000000000000e+00 2776 2776 1.00000000000000e+00 2777 2777 1.00000000000000e+00 2778 2778 1.00000000000000e+00 2779 2779 1.00000000000000e+00 2780 2780 1.00000000000000e+00 2781 2781 1.00000000000000e+00 2782 2782 1.00000000000000e+00 2783 2783 1.00000000000000e+00 2784 2784 1.00000000000000e+00 2785 2785 1.00000000000000e+00 2786 2786 1.00000000000000e+00 2787 2787 1.00000000000000e+00 2788 2788 1.00000000000000e+00 2789 2789 1.00000000000000e+00 2790 2790 1.00000000000000e+00 2791 2791 1.00000000000000e+00 2792 2792 1.00000000000000e+00 2793 2793 1.00000000000000e+00 2794 2794 1.00000000000000e+00 2795 2795 1.00000000000000e+00 2796 2796 1.00000000000000e+00 2797 2797 1.00000000000000e+00 2798 2798 1.00000000000000e+00 2799 2799 1.00000000000000e+00 2800 2800 1.00000000000000e+00 2801 2801 1.00000000000000e+00 2802 2802 1.00000000000000e+00 2803 2803 1.00000000000000e+00 2804 2804 1.00000000000000e+00 2805 2805 1.00000000000000e+00 2806 2806 1.00000000000000e+00 2807 2807 1.00000000000000e+00 2808 2808 1.00000000000000e+00 2809 2809 1.00000000000000e+00 2810 2810 1.00000000000000e+00 2811 2811 1.00000000000000e+00 2812 2812 1.00000000000000e+00 2813 2813 1.00000000000000e+00 2814 2814 1.00000000000000e+00 2815 2815 1.00000000000000e+00 2816 2816 1.00000000000000e+00 2817 2817 1.00000000000000e+00 2818 2818 1.00000000000000e+00 2819 2819 1.00000000000000e+00 2820 2820 1.00000000000000e+00 2821 2821 1.00000000000000e+00 2822 2822 1.00000000000000e+00 2823 2823 1.00000000000000e+00 2824 2824 1.00000000000000e+00 2825 2825 1.00000000000000e+00 2826 2826 1.00000000000000e+00 2827 2827 1.00000000000000e+00 2828 2828 1.00000000000000e+00 2829 2829 1.00000000000000e+00 2830 2830 1.00000000000000e+00 2831 2831 1.00000000000000e+00 2832 2832 1.00000000000000e+00 2833 2833 1.00000000000000e+00 2834 2834 1.00000000000000e+00 2835 2835 1.00000000000000e+00 2836 2836 1.00000000000000e+00 2837 2837 1.00000000000000e+00 2838 2838 1.00000000000000e+00 2839 2839 1.00000000000000e+00 2840 2840 1.00000000000000e+00 2841 2841 1.00000000000000e+00 2842 2842 1.00000000000000e+00 2843 2843 1.00000000000000e+00 2844 2844 1.00000000000000e+00 2845 2845 1.00000000000000e+00 2846 2846 1.00000000000000e+00 2847 2847 1.00000000000000e+00 2848 2848 1.00000000000000e+00 2849 2849 1.00000000000000e+00 2850 2850 1.00000000000000e+00 2851 2851 1.00000000000000e+00 2852 2852 1.00000000000000e+00 2853 2853 1.00000000000000e+00 2854 2854 1.00000000000000e+00 2855 2855 1.00000000000000e+00 2856 2856 1.00000000000000e+00 2857 2857 1.00000000000000e+00 2858 2858 1.00000000000000e+00 2859 2859 1.00000000000000e+00 2860 2860 1.00000000000000e+00 2861 2861 1.00000000000000e+00 2862 2862 1.00000000000000e+00 2863 2863 1.00000000000000e+00 2864 2864 1.00000000000000e+00 2865 2865 1.00000000000000e+00 2866 2866 1.00000000000000e+00 2867 2867 1.00000000000000e+00 2868 2868 1.00000000000000e+00 2869 2869 1.00000000000000e+00 2870 2870 1.00000000000000e+00 2871 2871 1.00000000000000e+00 2872 2872 1.00000000000000e+00 2873 2873 1.00000000000000e+00 2874 2874 1.00000000000000e+00 2875 2875 1.00000000000000e+00 2876 2876 1.00000000000000e+00 2877 2877 1.00000000000000e+00 2878 2878 1.00000000000000e+00 2879 2879 1.00000000000000e+00 2880 2880 1.00000000000000e+00 2881 2881 1.00000000000000e+00 2882 2882 1.00000000000000e+00 2883 2883 1.00000000000000e+00 2884 2884 1.00000000000000e+00 2885 2885 1.00000000000000e+00 2886 2886 1.00000000000000e+00 2887 2887 1.00000000000000e+00 2888 2888 1.00000000000000e+00 2889 2889 1.00000000000000e+00 2890 2890 1.00000000000000e+00 2891 2891 1.00000000000000e+00 2892 2892 1.00000000000000e+00 2893 2893 1.00000000000000e+00 2894 2894 1.00000000000000e+00 2895 2895 1.00000000000000e+00 2896 2896 1.00000000000000e+00 2897 2897 1.00000000000000e+00 2898 2898 1.00000000000000e+00 2899 2899 1.00000000000000e+00 2900 2900 1.00000000000000e+00 2901 2901 1.00000000000000e+00 2902 2902 1.00000000000000e+00 2903 2903 1.00000000000000e+00 2904 2904 1.00000000000000e+00 2905 2905 1.00000000000000e+00 2906 2906 1.00000000000000e+00 2907 2907 1.00000000000000e+00 2908 2908 1.00000000000000e+00 2909 2909 1.00000000000000e+00 2910 2910 1.00000000000000e+00 2911 2911 1.00000000000000e+00 2912 2912 1.00000000000000e+00 2913 2913 1.00000000000000e+00 2914 2914 1.00000000000000e+00 2915 2915 1.00000000000000e+00 2916 2916 1.00000000000000e+00 2917 2917 1.00000000000000e+00 2918 2918 1.00000000000000e+00 2919 2919 1.00000000000000e+00 2920 2920 1.00000000000000e+00 2921 2921 1.00000000000000e+00 2922 2922 1.00000000000000e+00 2923 2923 1.00000000000000e+00 2924 2924 1.00000000000000e+00 2925 2925 1.00000000000000e+00 2926 2926 1.00000000000000e+00 2927 2927 1.00000000000000e+00 2928 2928 1.00000000000000e+00 2929 2929 1.00000000000000e+00 2930 2930 1.00000000000000e+00 2931 2931 1.00000000000000e+00 2932 2932 1.00000000000000e+00 2933 2933 1.00000000000000e+00 2934 2934 1.00000000000000e+00 2935 2935 1.00000000000000e+00 2936 2936 1.00000000000000e+00 2937 2937 1.00000000000000e+00 2938 2938 1.00000000000000e+00 2939 2939 1.00000000000000e+00 2940 2940 1.00000000000000e+00 2941 2941 1.00000000000000e+00 2942 2942 1.00000000000000e+00 2943 2943 1.00000000000000e+00 2944 2944 1.00000000000000e+00 2945 2945 1.00000000000000e+00 2946 2946 1.00000000000000e+00 2947 2947 1.00000000000000e+00 2948 2948 1.00000000000000e+00 2949 2949 1.00000000000000e+00 2950 2950 1.00000000000000e+00 2951 2951 1.00000000000000e+00 2952 2952 1.00000000000000e+00 2953 2953 1.00000000000000e+00 2954 2954 1.00000000000000e+00 2955 2955 1.00000000000000e+00 2956 2956 1.00000000000000e+00 2957 2957 1.00000000000000e+00 2958 2958 1.00000000000000e+00 2959 2959 1.00000000000000e+00 2960 2960 1.00000000000000e+00 2961 2961 1.00000000000000e+00 2962 2962 1.00000000000000e+00 2963 2963 1.00000000000000e+00 2964 2964 1.00000000000000e+00 2965 2965 1.00000000000000e+00 2966 2966 1.00000000000000e+00 2967 2967 1.00000000000000e+00 2968 2968 1.00000000000000e+00 2969 2969 1.00000000000000e+00 2970 2970 1.00000000000000e+00 2971 2971 1.00000000000000e+00 2972 2972 1.00000000000000e+00 2973 2973 1.00000000000000e+00 2974 2974 1.00000000000000e+00 2975 2975 1.00000000000000e+00 2976 2976 1.00000000000000e+00 2977 2977 1.00000000000000e+00 2978 2978 1.00000000000000e+00 2979 2979 1.00000000000000e+00 2980 2980 1.00000000000000e+00 2981 2981 1.00000000000000e+00 2982 2982 1.00000000000000e+00 2983 2983 1.00000000000000e+00 2984 2984 1.00000000000000e+00 2985 2985 1.00000000000000e+00 2986 2986 1.00000000000000e+00 2987 2987 1.00000000000000e+00 2988 2988 1.00000000000000e+00 2989 2989 1.00000000000000e+00 2990 2990 1.00000000000000e+00 2991 2991 1.00000000000000e+00 2992 2992 1.00000000000000e+00 2993 2993 1.00000000000000e+00 2994 2994 1.00000000000000e+00 2995 2995 1.00000000000000e+00 2996 2996 1.00000000000000e+00 2997 2997 1.00000000000000e+00 2998 2998 1.00000000000000e+00 2999 2999 1.00000000000000e+00 3000 3000 1.00000000000000e+00 3001 3001 1.00000000000000e+00 3002 3002 1.00000000000000e+00 3003 3003 1.00000000000000e+00 3004 3004 1.00000000000000e+00 3005 3005 1.00000000000000e+00 3006 3006 1.00000000000000e+00 3007 3007 1.00000000000000e+00 3008 3008 1.00000000000000e+00 3009 3009 1.00000000000000e+00 3010 3010 1.00000000000000e+00 3011 3011 1.00000000000000e+00 3012 3012 1.00000000000000e+00 3013 3013 1.00000000000000e+00 3014 3014 1.00000000000000e+00 3015 3015 1.00000000000000e+00 3016 3016 1.00000000000000e+00 3017 3017 1.00000000000000e+00 3018 3018 1.00000000000000e+00 3019 3019 1.00000000000000e+00 3020 3020 1.00000000000000e+00 3021 3021 1.00000000000000e+00 3022 3022 1.00000000000000e+00 3023 3023 1.00000000000000e+00 3024 3024 1.00000000000000e+00 3025 3025 1.00000000000000e+00 3026 3026 1.00000000000000e+00 3027 3027 1.00000000000000e+00 3028 3028 1.00000000000000e+00 3029 3029 1.00000000000000e+00 3030 3030 1.00000000000000e+00 3031 3031 1.00000000000000e+00 3032 3032 1.00000000000000e+00 3033 3033 1.00000000000000e+00 3034 3034 1.00000000000000e+00 3035 3035 1.00000000000000e+00 3036 3036 1.00000000000000e+00 3037 3037 1.00000000000000e+00 3038 3038 1.00000000000000e+00 3039 3039 1.00000000000000e+00 3040 3040 1.00000000000000e+00 3041 3041 1.00000000000000e+00 3042 3042 1.00000000000000e+00 3043 3043 1.00000000000000e+00 3044 3044 1.00000000000000e+00 3045 3045 1.00000000000000e+00 3046 3046 1.00000000000000e+00 3047 3047 1.00000000000000e+00 3048 3048 1.00000000000000e+00 3049 3049 1.00000000000000e+00 3050 3050 1.00000000000000e+00 3051 3051 1.00000000000000e+00 3052 3052 1.00000000000000e+00 3053 3053 1.00000000000000e+00 3054 3054 1.00000000000000e+00 3055 3055 1.00000000000000e+00 3056 3056 1.00000000000000e+00 3057 3057 1.00000000000000e+00 3058 3058 1.00000000000000e+00 3059 3059 1.00000000000000e+00 3060 3060 1.00000000000000e+00 3061 3061 1.00000000000000e+00 3062 3062 1.00000000000000e+00 3063 3063 1.00000000000000e+00 3064 3064 1.00000000000000e+00 3065 3065 1.00000000000000e+00 3066 3066 1.00000000000000e+00 3067 3067 1.00000000000000e+00 3068 3068 1.00000000000000e+00 3069 3069 1.00000000000000e+00 3070 3070 1.00000000000000e+00 3071 3071 1.00000000000000e+00 3072 3072 1.00000000000000e+00 3073 3073 1.00000000000000e+00 3074 3074 1.00000000000000e+00 3075 3075 1.00000000000000e+00 3076 3076 1.00000000000000e+00 3077 3077 1.00000000000000e+00 3078 3078 1.00000000000000e+00 3079 3079 1.00000000000000e+00 3080 3080 1.00000000000000e+00 3081 3081 1.00000000000000e+00 3082 3082 1.00000000000000e+00 3083 3083 1.00000000000000e+00 3084 3084 1.00000000000000e+00 3085 3085 1.00000000000000e+00 3086 3086 1.00000000000000e+00 3087 3087 1.00000000000000e+00 3088 3088 1.00000000000000e+00 3089 3089 1.00000000000000e+00 3090 3090 1.00000000000000e+00 3091 3091 1.00000000000000e+00 3092 3092 1.00000000000000e+00 3093 3093 1.00000000000000e+00 3094 3094 1.00000000000000e+00 3095 3095 1.00000000000000e+00 3096 3096 1.00000000000000e+00 3097 3097 1.00000000000000e+00 3098 3098 1.00000000000000e+00 3099 3099 1.00000000000000e+00 3100 3100 1.00000000000000e+00 3101 3101 1.00000000000000e+00 3102 3102 1.00000000000000e+00 3103 3103 1.00000000000000e+00 3104 3104 1.00000000000000e+00 3105 3105 1.00000000000000e+00 3106 3106 1.00000000000000e+00 3107 3107 1.00000000000000e+00 3108 3108 1.00000000000000e+00 3109 3109 1.00000000000000e+00 3110 3110 1.00000000000000e+00 3111 3111 1.00000000000000e+00 3112 3112 1.00000000000000e+00 3113 3113 1.00000000000000e+00 3114 3114 1.00000000000000e+00 3115 3115 1.00000000000000e+00 3116 3116 1.00000000000000e+00 3117 3117 1.00000000000000e+00 3118 3118 1.00000000000000e+00 3119 3119 1.00000000000000e+00 3120 3120 1.00000000000000e+00 3121 3121 1.00000000000000e+00 3122 3122 1.00000000000000e+00 3123 3123 1.00000000000000e+00 3124 3124 1.00000000000000e+00 3125 3125 1.00000000000000e+00 3126 3126 1.00000000000000e+00 3127 3127 1.00000000000000e+00 3128 3128 1.00000000000000e+00 3129 3129 1.00000000000000e+00 3130 3130 1.00000000000000e+00 3131 3131 1.00000000000000e+00 3132 3132 1.00000000000000e+00 3133 3133 1.00000000000000e+00 3134 3134 1.00000000000000e+00 3135 3135 1.00000000000000e+00 3136 3136 1.00000000000000e+00 3137 3137 1.00000000000000e+00 3138 3138 1.00000000000000e+00 3139 3139 1.00000000000000e+00 3140 3140 1.00000000000000e+00 3141 3141 1.00000000000000e+00 3142 3142 1.00000000000000e+00 3143 3143 1.00000000000000e+00 3144 3144 1.00000000000000e+00 3145 3145 1.00000000000000e+00 3146 3146 1.00000000000000e+00 3147 3147 1.00000000000000e+00 3148 3148 1.00000000000000e+00 3149 3149 1.00000000000000e+00 3150 3150 1.00000000000000e+00 3151 3151 1.00000000000000e+00 3152 3152 1.00000000000000e+00 3153 3153 1.00000000000000e+00 3154 3154 1.00000000000000e+00 3155 3155 1.00000000000000e+00 3156 3156 1.00000000000000e+00 3157 3157 1.00000000000000e+00 3158 3158 1.00000000000000e+00 3159 3159 1.00000000000000e+00 3160 3160 1.00000000000000e+00 3161 3161 1.00000000000000e+00 3162 3162 1.00000000000000e+00 3163 3163 1.00000000000000e+00 3164 3164 1.00000000000000e+00 3165 3165 1.00000000000000e+00 3166 3166 1.00000000000000e+00 3167 3167 1.00000000000000e+00 3168 3168 1.00000000000000e+00 3169 3169 1.00000000000000e+00 3170 3170 1.00000000000000e+00 3171 3171 1.00000000000000e+00 3172 3172 1.00000000000000e+00 3173 3173 1.00000000000000e+00 3174 3174 1.00000000000000e+00 3175 3175 1.00000000000000e+00 3176 3176 1.00000000000000e+00 3177 3177 1.00000000000000e+00 3178 3178 1.00000000000000e+00 3179 3179 1.00000000000000e+00 3180 3180 1.00000000000000e+00 3181 3181 1.00000000000000e+00 3182 3182 1.00000000000000e+00 3183 3183 1.00000000000000e+00 3184 3184 1.00000000000000e+00 3185 3185 1.00000000000000e+00 3186 3186 1.00000000000000e+00 3187 3187 1.00000000000000e+00 3188 3188 1.00000000000000e+00 3189 3189 1.00000000000000e+00 3190 3190 1.00000000000000e+00 3191 3191 1.00000000000000e+00 3192 3192 1.00000000000000e+00 3193 3193 1.00000000000000e+00 3194 3194 1.00000000000000e+00 3195 3195 1.00000000000000e+00 3196 3196 1.00000000000000e+00 3197 3197 1.00000000000000e+00 3198 3198 1.00000000000000e+00 3199 3199 1.00000000000000e+00 3200 3200 1.00000000000000e+00 3201 3201 1.00000000000000e+00 3202 3202 1.00000000000000e+00 3203 3203 1.00000000000000e+00 3204 3204 1.00000000000000e+00 3205 3205 1.00000000000000e+00 3206 3206 1.00000000000000e+00 3207 3207 1.00000000000000e+00 3208 3208 1.00000000000000e+00 3209 3209 1.00000000000000e+00 3210 3210 1.00000000000000e+00 3211 3211 1.00000000000000e+00 3212 3212 1.00000000000000e+00 3213 3213 1.03178973644449e+00 3213 2637 1.48846185431150e-02 3213 2661 9.22890593949129e-03 3213 2685 1.25052203376214e-06 3213 3237 4.31840613477253e-01 3213 3261 9.43953024244507e-02 3213 3285 1.95371943844939e-04 3213 3789 2.80088098136377e-06 3213 3813 1.83378625356757e-01 3213 3837 6.74357737899597e-01 3213 3861 4.82735193069476e-02 3213 3885 1.28664970767145e-04 3213 4389 2.68083483975976e-05 3213 4413 4.59222211420516e-02 3213 4437 5.71113368287821e-02 3213 4461 2.48600030779947e-03 3213 4485 4.13083515611080e-07 3213 4989 5.75738267860000e-09 3213 5013 1.38667055159875e-04 3213 5037 1.48757014544795e-04 3213 5061 6.07076150326416e-06 3213 15408 -4.39367443243404e-02 3213 15432 -2.32563123210227e-02 3213 15456 -3.67982902529272e-04 3213 15816 -2.89759613634642e-01 3213 15840 -1.54266916353445e-01 3213 15864 -2.68203129603534e-03 3213 16224 -5.14197856185744e-01 3213 16248 -2.75622480796976e-01 3213 16272 -5.29244362974372e-03 3213 16632 -1.70854902386414e-01 3213 16656 -9.08396678635010e-02 3213 16680 -1.54634762008396e-03 3213 17040 -1.42105665122835e-02 3213 17064 -7.39950019853676e-03 3213 17088 -8.40619835414269e-05 3214 3214 1.00000000000000e+00 3215 3215 1.00000000000000e+00 3216 3216 1.00000000000000e+00 3217 3217 1.00000000000000e+00 3218 3218 1.00000000000000e+00 3219 3219 1.00000000000000e+00 3220 3220 1.00000000000000e+00 3221 3221 1.00000000000000e+00 3222 3222 1.00000000000000e+00 3223 3223 1.00000000000000e+00 3224 3224 1.00000000000000e+00 3225 3225 1.00000000000000e+00 3226 3226 1.00000000000000e+00 3227 3227 1.00000000000000e+00 3228 3228 1.00000000000000e+00 3229 3229 1.00000000000000e+00 3230 3230 1.00000000000000e+00 3231 3231 1.00000000000000e+00 3232 3232 1.00000000000000e+00 3233 3233 1.00000000000000e+00 3234 3234 1.00000000000000e+00 3235 3235 1.00000000000000e+00 3236 3236 1.00000000000000e+00 3237 3237 2.09499843293971e+01 3237 2037 1.06727575900903e-02 3237 2061 4.36793967859312e-02 3237 2085 2.13706456323183e-04 3237 2637 2.93723459434132e+00 3237 2661 4.64065275503838e+00 3237 2685 1.27181616251688e-01 3237 2709 1.74314569669890e-05 3237 3213 4.31840613477253e-01 3237 3261 1.09723187831806e+01 3237 3285 2.82792704146781e-01 3237 3309 2.53629710191405e-04 3237 3789 5.22093285751312e-06 3237 3813 1.35780839835569e+00 3237 3837 9.91943451262241e+00 3237 3861 3.09914208319462e+00 3237 3885 1.15026971954077e-01 3237 3909 1.55156966072355e-04 3237 4389 4.99765527714196e-05 3237 4413 1.56701631720264e-01 3237 4437 3.98093749650465e-01 3237 4461 1.02944973256480e-01 3237 4485 5.91766666038560e-03 3237 4509 1.80315251593800e-08 3237 4989 1.07430315361200e-08 3237 5013 2.73574244309960e-04 3237 5037 3.73082498911609e-04 3237 5061 1.72881141110555e-04 3237 5085 1.78071334005430e-05 3237 15000 -1.27202318270220e+00 3237 15024 -8.20147575343321e-01 3237 15048 -5.34115908914601e-02 3237 15072 -2.15737240607034e-04 3237 15408 -7.86715197249462e+00 3237 15432 -5.11981516898454e+00 3237 15456 -3.64114134599591e-01 3237 15480 -6.78156064318102e-03 3237 15816 -1.47080981867762e+01 3237 15840 -1.01045841424138e+01 3237 15864 -8.81159512977690e-01 3237 15888 -2.56556343381720e-02 3237 16224 -6.70591694751832e+00 3237 16248 -4.52174059881932e+00 3237 16272 -3.82150713253347e-01 3237 16296 -1.29804131789667e-02 3237 16632 -9.84383496535956e-01 3237 16656 -6.32999049357043e-01 3237 16680 -4.67880445595028e-02 3237 16704 -1.76545037455345e-03 3237 17040 -2.65905112531984e-02 3237 17064 -1.42217084326021e-02 3237 17088 -2.64700801715131e-04 3238 3238 1.00000000000000e+00 3239 3239 1.00000000000000e+00 3240 3240 1.00000000000000e+00 3241 3241 1.00000000000000e+00 3242 3242 1.00000000000000e+00 3243 3243 1.00000000000000e+00 3244 3244 1.00000000000000e+00 3245 3245 1.00000000000000e+00 3246 3246 1.00000000000000e+00 3247 3247 1.00000000000000e+00 3248 3248 1.00000000000000e+00 3249 3249 1.00000000000000e+00 3250 3250 1.00000000000000e+00 3251 3251 1.00000000000000e+00 3252 3252 1.00000000000000e+00 3253 3253 1.00000000000000e+00 3254 3254 1.00000000000000e+00 3255 3255 1.00000000000000e+00 3256 3256 1.00000000000000e+00 3257 3257 1.00000000000000e+00 3258 3258 1.00000000000000e+00 3259 3259 1.00000000000000e+00 3260 3260 1.00000000000000e+00 3261 3261 1.87919716657741e+01 3261 2037 2.33776633015668e-02 3261 2061 1.30411080783781e-01 3261 2085 2.07534537618295e-03 3261 2637 3.18335899755208e+00 3261 2661 1.07535791920085e+01 3261 2685 3.15491505639718e+00 3261 2709 1.02332936929997e-01 3261 2733 2.22990279934000e-09 3261 3213 9.43953024244507e-02 3261 3237 1.09723187831806e+01 3261 3285 7.14083795988865e+00 3261 3309 4.95673214491780e-01 3261 3333 3.47698256597022e-04 3261 3789 1.31921271842000e-09 3261 3813 1.48862480810996e-01 3261 3837 3.76737230205419e+00 3261 3861 6.98081283453296e+00 3261 3885 2.68222047618842e+00 3261 3909 9.86337930065479e-02 3261 3933 1.59825900986147e-04 3261 4389 1.26524962030200e-08 3261 4413 8.22857654823530e-03 3261 4437 1.06494160843870e-01 3261 4461 3.44526895845680e-01 3261 4485 1.65476629083131e-01 3261 4509 7.60696239971773e-03 3261 4989 2.76977475000000e-12 3261 5013 1.44369951344170e-07 3261 5037 4.77661153452631e-05 3261 5061 8.42968691652808e-04 3261 5085 1.53185448900642e-04 3261 5109 2.13656657686153e-06 3261 15000 -2.77159021881337e+00 3261 15024 -5.32072509956956e+00 3261 15048 -3.43113164804828e+00 3261 15072 -6.50483221529800e-01 3261 15096 -7.88146601817142e-03 3261 15408 -8.54372163120853e+00 3261 15432 -1.13396010740793e+01 3261 15456 -5.66071931761898e+00 3261 15480 -1.10367230428952e+00 3261 15504 -3.30507753107728e-02 3261 15816 -7.14013593441134e+00 3261 15840 -9.88798952076251e+00 3261 15864 -5.27654274785870e+00 3261 15888 -1.07744492518077e+00 3261 15912 -3.82846590392059e-02 3261 16224 -1.63815643084325e+00 3261 16248 -2.39548250059446e+00 3261 16272 -1.32287667106862e+00 3261 16296 -2.65653515247310e-01 3261 16320 -8.24395122984949e-03 3261 16632 -7.14390121570557e-02 3261 16656 -1.07496598483682e-01 3261 16680 -5.51496939522471e-02 3261 16704 -9.50245677540159e-03 3261 16728 -4.71154979898933e-05 3261 17040 -7.22506791617707e-06 3261 17064 -5.73103372691874e-06 3261 17088 -6.05285648237200e-07 3262 3262 1.00000000000000e+00 3263 3263 1.00000000000000e+00 3264 3264 1.00000000000000e+00 3265 3265 1.00000000000000e+00 3266 3266 1.00000000000000e+00 3267 3267 1.00000000000000e+00 3268 3268 1.00000000000000e+00 3269 3269 1.00000000000000e+00 3270 3270 1.00000000000000e+00 3271 3271 1.00000000000000e+00 3272 3272 1.00000000000000e+00 3273 3273 1.00000000000000e+00 3274 3274 1.00000000000000e+00 3275 3275 1.00000000000000e+00 3276 3276 1.00000000000000e+00 3277 3277 1.00000000000000e+00 3278 3278 1.00000000000000e+00 3279 3279 1.00000000000000e+00 3280 3280 1.00000000000000e+00 3281 3281 1.00000000000000e+00 3282 3282 1.00000000000000e+00 3283 3283 1.00000000000000e+00 3284 3284 1.00000000000000e+00 3285 3285 2.74181977528582e+01 3285 2037 2.79091754131915e-03 3285 2061 3.06976858560456e-02 3285 2085 1.07228177540026e-03 3285 2637 1.45416647043228e-01 3285 2661 4.49687532095990e+00 3285 2685 9.52331039881100e+00 3285 2709 9.54978556178009e-01 3285 2733 1.47101733658933e-06 3285 3213 1.95371943844939e-04 3285 3237 2.82792704146781e-01 3285 3261 7.14083795988865e+00 3285 3309 9.78199297230538e+00 3285 3333 2.74929435139289e-01 3285 3357 4.17426610680257e-06 3285 3813 2.39044322190814e-04 3285 3837 1.37148490235047e-01 3285 3861 2.64884504318002e+00 3285 3885 5.96431524939480e+00 3285 3909 3.14714061325156e+00 3285 3933 2.50073467614360e-01 3285 3957 6.16672890543066e-06 3285 4413 5.17228162006518e-06 3285 4437 3.82984705123397e-03 3285 4461 1.58330381854041e-01 3285 4485 3.90074702897613e-01 3285 4509 1.10751375218815e-01 3285 4533 5.34094459172507e-03 3285 4557 1.50853894583000e-09 3285 5037 3.03133255660104e-06 3285 5061 7.51344158719152e-05 3285 5085 2.31229553062047e-04 3285 5109 3.60350842428249e-04 3285 5133 1.89409891545966e-06 3285 5157 2.19544460000000e-13 3285 15000 -5.40869660850670e-01 3285 15024 -5.62748706111379e+00 3285 15048 -1.60834728731331e+01 3285 15072 -9.31757742472425e+00 3285 15096 -1.94760161133873e+00 3285 15120 -1.34062314544309e-01 3285 15144 -6.63024342517000e-09 3285 15408 -4.98997919341108e-01 3285 15432 -4.72007968522738e+00 3285 15456 -1.32830061635956e+01 3285 15480 -9.03319033806758e+00 3285 15504 -1.99097178969350e+00 3285 15528 -1.16854240285122e-01 3285 15552 -2.84816028581600e-08 3285 15816 -1.11494712416163e-01 3285 15840 -1.13078752502025e+00 3285 15864 -3.33774787695725e+00 3285 15888 -2.41236416441363e+00 3285 15912 -5.06189018822970e-01 3285 15936 -2.09752511183678e-02 3285 15960 -1.44727600551000e-08 3285 16224 -1.25654930568486e-02 3285 16248 -1.60508309066097e-01 3285 16272 -5.04462076015912e-01 3285 16296 -3.15687715384813e-01 3285 16320 -5.81648819907583e-02 3285 16344 -1.81463814625538e-03 3285 16368 -1.96062915748000e-09 3285 16632 -3.47011381079172e-05 3285 16656 -7.25522370285966e-04 3285 16680 -2.41565249248580e-03 3285 16704 -7.23038149697060e-04 3285 16728 -3.40800829606908e-05 3286 3286 1.00000000000000e+00 3287 3287 1.00000000000000e+00 3288 3288 1.00000000000000e+00 3289 3289 1.00000000000000e+00 3290 3290 1.00000000000000e+00 3291 3291 1.00000000000000e+00 3292 3292 1.00000000000000e+00 3293 3293 1.00000000000000e+00 3294 3294 1.00000000000000e+00 3295 3295 1.00000000000000e+00 3296 3296 1.00000000000000e+00 3297 3297 1.00000000000000e+00 3298 3298 1.00000000000000e+00 3299 3299 1.00000000000000e+00 3300 3300 1.00000000000000e+00 3301 3301 1.00000000000000e+00 3302 3302 1.00000000000000e+00 3303 3303 1.00000000000000e+00 3304 3304 1.00000000000000e+00 3305 3305 1.00000000000000e+00 3306 3306 1.00000000000000e+00 3307 3307 1.00000000000000e+00 3308 3308 1.00000000000000e+00 3309 3309 2.13447489157978e+01 3309 2037 2.84965056096460e-07 3309 2061 3.44776521549161e-06 3309 2085 1.28205453431010e-07 3309 2637 8.82040844097354e-06 3309 2661 2.76648894908239e-01 3309 2685 1.82785208832563e+00 3309 2709 5.82260908100780e-01 3309 2733 4.40213679917619e-06 3309 3237 2.53629710191405e-04 3309 3261 4.95673214491780e-01 3309 3285 9.78199297230538e+00 3309 3333 4.34538569436140e+00 3309 3357 1.55949680715273e-02 3309 3837 2.94496133374683e-04 3309 3861 1.04720627674970e-01 3309 3885 2.68265796979801e+00 3309 3909 1.12062297642624e+01 3309 3933 5.44645677899667e+00 3309 3957 1.33556506834827e-01 3309 3981 2.00195419374276e-06 3309 4437 7.44503075326017e-06 3309 4461 7.20183881084101e-03 3309 4485 9.51566419059972e-02 3309 4509 2.61946729281432e-01 3309 4533 1.18442951526062e-01 3309 4557 8.70653938089605e-03 3309 4581 1.18392864123259e-06 3309 5061 2.19087640160000e-10 3309 5085 1.93604114647185e-04 3309 5109 4.72542549108676e-04 3309 5133 6.44276186536676e-05 3309 5157 6.93965276951370e-07 3309 5181 1.81280000000000e-16 3309 15000 -5.68909072862895e-05 3309 15024 -5.03800392544225e-01 3309 15048 -3.99767481908073e+00 3309 15072 -1.13558941478981e+01 3309 15096 -1.38577901086792e+01 3309 15120 -3.71267255158997e+00 3309 15144 -1.98570423981024e-01 3309 15168 -4.16008843137181e-05 3309 15408 -2.91886673369857e-05 3309 15432 -2.98294215297016e-01 3309 15456 -2.68385561620018e+00 3309 15480 -8.06189223988929e+00 3309 15504 -8.81234700362064e+00 3309 15528 -2.29622406868491e+00 3309 15552 -1.24352589445774e-01 3309 15576 -2.89818847393746e-05 3309 15816 -2.12346769668850e-07 3309 15840 -1.46556642943468e-02 3309 15864 -2.26898724073114e-01 3309 15888 -7.93553797255192e-01 3309 15912 -5.98577294457400e-01 3309 15936 -1.34464897613046e-01 3309 15960 -7.17949674489180e-03 3309 15984 -2.33755502357587e-06 3309 16248 -3.76985077331550e-04 3309 16272 -8.39440981508346e-03 3309 16296 -3.02687018809989e-02 3309 16320 -1.62745062553764e-02 3309 16344 -2.36456528890254e-03 3309 16368 -4.68162706606915e-06 3310 3310 1.00000000000000e+00 3311 3311 1.00000000000000e+00 3312 3312 1.00000000000000e+00 3313 3313 1.00000000000000e+00 3314 3314 1.00000000000000e+00 3315 3315 1.00000000000000e+00 3316 3316 1.00000000000000e+00 3317 3317 1.00000000000000e+00 3318 3318 1.00000000000000e+00 3319 3319 1.00000000000000e+00 3320 3320 1.00000000000000e+00 3321 3321 1.00000000000000e+00 3322 3322 1.00000000000000e+00 3323 3323 1.00000000000000e+00 3324 3324 1.00000000000000e+00 3325 3325 1.00000000000000e+00 3326 3326 1.00000000000000e+00 3327 3327 1.00000000000000e+00 3328 3328 1.00000000000000e+00 3329 3329 1.00000000000000e+00 3330 3330 1.00000000000000e+00 3331 3331 1.00000000000000e+00 3332 3332 1.00000000000000e+00 3333 3333 3.46517180999946e+00 3333 2661 7.67643334023892e-06 3333 2685 1.20671885798248e-02 3333 2709 1.38154135506727e-02 3333 2733 8.87085011605720e-07 3333 3261 3.47698256597022e-04 3333 3285 2.74929435139289e-01 3333 3309 4.34538569436140e+00 3333 3357 5.97228003931983e-02 3333 3837 2.37500000000000e-16 3333 3861 2.33188526392932e-04 3333 3885 1.36090564095540e-01 3333 3909 3.62600246314894e+00 3333 3933 5.54000696248019e+00 3333 3957 7.56157576803354e-01 3333 3981 3.63532297866516e-03 3333 4005 5.45496585000000e-12 3333 4437 1.61450000000000e-16 3333 4461 1.65821052232080e-07 3333 4485 4.58947816494336e-03 3333 4509 8.90814666278429e-02 3333 4533 2.74020269122421e-01 3333 4557 1.27588687451478e-01 3333 4581 2.12411346181340e-03 3333 4605 1.51028246000000e-11 3333 5061 7.79578600000000e-14 3333 5085 2.46575223213150e-07 3333 5109 2.27667645083760e-05 3333 5133 4.39095393213610e-04 3333 5157 2.13322127890800e-04 3333 5181 1.55053844990900e-08 3333 5757 4.20640000000000e-16 3333 5781 1.50650000000000e-16 3333 15048 -3.24275802740584e-02 3333 15072 -1.19951607928587e+00 3333 15096 -5.00898442642425e+00 3333 15120 -3.93265630313742e+00 3333 15144 -9.91396379203770e-01 3333 15168 -7.35208925300189e-02 3333 15192 -1.40028719608417e-06 3333 15456 -1.86238563130756e-02 3333 15480 -6.70418245275486e-01 3333 15504 -2.79768642905903e+00 3333 15528 -2.21730298722634e+00 3333 15552 -5.54951980889222e-01 3333 15576 -3.98978040899699e-02 3333 15600 -7.01874925208510e-07 3333 15864 -6.88591247467974e-04 3333 15888 -2.01988474371420e-02 3333 15912 -8.38121177760752e-02 3333 15936 -7.17232553767070e-02 3333 15960 -1.69311411195082e-02 3333 15984 -8.96387949988693e-04 3333 16008 -4.94664904690000e-10 3333 16272 -2.45391655890000e-10 3333 16296 -2.75079980372742e-06 3333 16320 -1.13997207202415e-05 3333 16344 -4.35062775778430e-06 3333 16368 -4.00202380170110e-07 3334 3334 1.00000000000000e+00 3335 3335 1.00000000000000e+00 3336 3336 1.00000000000000e+00 3337 3337 1.00000000000000e+00 3338 3338 1.00000000000000e+00 3339 3339 1.00000000000000e+00 3340 3340 1.00000000000000e+00 3341 3341 1.00000000000000e+00 3342 3342 1.00000000000000e+00 3343 3343 1.00000000000000e+00 3344 3344 1.00000000000000e+00 3345 3345 1.00000000000000e+00 3346 3346 1.00000000000000e+00 3347 3347 1.00000000000000e+00 3348 3348 1.00000000000000e+00 3349 3349 1.00000000000000e+00 3350 3350 1.00000000000000e+00 3351 3351 1.00000000000000e+00 3352 3352 1.00000000000000e+00 3353 3353 1.00000000000000e+00 3354 3354 1.00000000000000e+00 3355 3355 1.00000000000000e+00 3356 3356 1.00000000000000e+00 3357 3357 1.00509671531337e+00 3357 2685 2.60784759250900e-08 3357 2709 1.47384460888300e-07 3357 2733 2.16381754700000e-11 3357 3285 4.17426610680256e-06 3357 3309 1.55949680715273e-02 3357 3333 5.97228003931983e-02 3357 3861 3.85400000000000e-17 3357 3885 6.61673559220368e-06 3357 3909 3.70617261712393e-02 3357 3933 3.02172057297916e-01 3357 3957 1.57248436422912e-01 3357 3981 1.67498720578745e-03 3357 4005 1.57623610900000e-11 3357 4461 6.35000000000000e-18 3357 4485 3.07268247464825e-06 3357 4509 1.60503283768704e-03 3357 4533 3.21160075323181e-02 3357 4557 4.60996910959770e-02 3357 4581 9.81314367921115e-04 3357 4605 4.36402672700000e-11 3357 5109 1.32826164813375e-06 3357 5133 1.00310287655638e-04 3357 5157 6.26332162683865e-05 3357 5181 4.47785888509600e-08 3357 5757 1.17839000000000e-15 3357 5781 4.22030000000000e-16 3357 15072 -2.68177621415981e-05 3357 15096 -3.79506224605989e-02 3357 15120 -1.85121313218595e-01 3357 15144 -1.72731756794418e-01 3357 15168 -3.37372744046849e-02 3357 15192 -4.04614909029325e-06 3357 15480 -1.35540959531497e-05 3357 15504 -2.00238148159727e-02 3357 15528 -9.76740571612998e-02 3357 15552 -9.11000637037561e-02 3357 15576 -1.77902210357923e-02 3357 15600 -2.02792477156880e-06 3357 15888 -4.14899663859000e-08 3357 15912 -2.99572453049507e-04 3357 15936 -1.46097158628630e-03 3357 15960 -1.35262437329919e-03 3357 15984 -2.63309666699972e-04 3357 16008 -1.38577897776000e-09 3358 3358 1.00000000000000e+00 3359 3359 1.00000000000000e+00 3360 3360 1.00000000000000e+00 3361 3361 1.00000000000000e+00 3362 3362 1.00000000000000e+00 3363 3363 1.00000000000000e+00 3364 3364 1.00000000000000e+00 3365 3365 1.00000000000000e+00 3366 3366 1.00000000000000e+00 3367 3367 1.00000000000000e+00 3368 3368 1.00000000000000e+00 3369 3369 1.00000000000000e+00 3370 3370 1.00000000000000e+00 3371 3371 1.00000000000000e+00 3372 3372 1.00000000000000e+00 3373 3373 1.00000000000000e+00 3374 3374 1.00000000000000e+00 3375 3375 1.00000000000000e+00 3376 3376 1.00000000000000e+00 3377 3377 1.00000000000000e+00 3378 3378 1.00000000000000e+00 3379 3379 1.00000000000000e+00 3380 3380 1.00000000000000e+00 3381 3381 1.00000000000000e+00 3382 3382 1.00000000000000e+00 3383 3383 1.00000000000000e+00 3384 3384 1.00000000000000e+00 3385 3385 1.00000000000000e+00 3386 3386 1.00000000000000e+00 3387 3387 1.00000000000000e+00 3388 3388 1.00000000000000e+00 3389 3389 1.00000000000000e+00 3390 3390 1.00000000000000e+00 3391 3391 1.00000000000000e+00 3392 3392 1.00000000000000e+00 3393 3393 1.00000000000000e+00 3394 3394 1.00000000000000e+00 3395 3395 1.00000000000000e+00 3396 3396 1.00000000000000e+00 3397 3397 1.00000000000000e+00 3398 3398 1.00000000000000e+00 3399 3399 1.00000000000000e+00 3400 3400 1.00000000000000e+00 3401 3401 1.00000000000000e+00 3402 3402 1.00000000000000e+00 3403 3403 1.00000000000000e+00 3404 3404 1.00000000000000e+00 3405 3405 1.00000000000000e+00 3406 3406 1.00000000000000e+00 3407 3407 1.00000000000000e+00 3408 3408 1.00000000000000e+00 3409 3409 1.00000000000000e+00 3410 3410 1.00000000000000e+00 3411 3411 1.00000000000000e+00 3412 3412 1.00000000000000e+00 3413 3413 1.00000000000000e+00 3414 3414 1.00000000000000e+00 3415 3415 1.00000000000000e+00 3416 3416 1.00000000000000e+00 3417 3417 1.00000000000000e+00 3418 3418 1.00000000000000e+00 3419 3419 1.00000000000000e+00 3420 3420 1.00000000000000e+00 3421 3421 1.00000000000000e+00 3422 3422 1.00000000000000e+00 3423 3423 1.00000000000000e+00 3424 3424 1.00000000000000e+00 3425 3425 1.00000000000000e+00 3426 3426 1.00000000000000e+00 3427 3427 1.00000000000000e+00 3428 3428 1.00000000000000e+00 3429 3429 1.00000000000000e+00 3430 3430 1.00000000000000e+00 3431 3431 1.00000000000000e+00 3432 3432 1.00000000000000e+00 3433 3433 1.00000000000000e+00 3434 3434 1.00000000000000e+00 3435 3435 1.00000000000000e+00 3436 3436 1.00000000000000e+00 3437 3437 1.00000000000000e+00 3438 3438 1.00000000000000e+00 3439 3439 1.00000000000000e+00 3440 3440 1.00000000000000e+00 3441 3441 1.00000000000000e+00 3442 3442 1.00000000000000e+00 3443 3443 1.00000000000000e+00 3444 3444 1.00000000000000e+00 3445 3445 1.00000000000000e+00 3446 3446 1.00000000000000e+00 3447 3447 1.00000000000000e+00 3448 3448 1.00000000000000e+00 3449 3449 1.00000000000000e+00 3450 3450 1.00000000000000e+00 3451 3451 1.00000000000000e+00 3452 3452 1.00000000000000e+00 3453 3453 1.00000000000000e+00 3454 3454 1.00000000000000e+00 3455 3455 1.00000000000000e+00 3456 3456 1.00000000000000e+00 3457 3457 1.00000000000000e+00 3458 3458 1.00000000000000e+00 3459 3459 1.00000000000000e+00 3460 3460 1.00000000000000e+00 3461 3461 1.00000000000000e+00 3462 3462 1.00000000000000e+00 3463 3463 1.00000000000000e+00 3464 3464 1.00000000000000e+00 3465 3465 1.00000000000000e+00 3466 3466 1.00000000000000e+00 3467 3467 1.00000000000000e+00 3468 3468 1.00000000000000e+00 3469 3469 1.00000000000000e+00 3470 3470 1.00000000000000e+00 3471 3471 1.00000000000000e+00 3472 3472 1.00000000000000e+00 3473 3473 1.00000000000000e+00 3474 3474 1.00000000000000e+00 3475 3475 1.00000000000000e+00 3476 3476 1.00000000000000e+00 3477 3477 1.00000000000000e+00 3478 3478 1.00000000000000e+00 3479 3479 1.00000000000000e+00 3480 3480 1.00000000000000e+00 3481 3481 1.00000000000000e+00 3482 3482 1.00000000000000e+00 3483 3483 1.00000000000000e+00 3484 3484 1.00000000000000e+00 3485 3485 1.00000000000000e+00 3486 3486 1.00000000000000e+00 3487 3487 1.00000000000000e+00 3488 3488 1.00000000000000e+00 3489 3489 1.00000000000000e+00 3490 3490 1.00000000000000e+00 3491 3491 1.00000000000000e+00 3492 3492 1.00000000000000e+00 3493 3493 1.00000000000000e+00 3494 3494 1.00000000000000e+00 3495 3495 1.00000000000000e+00 3496 3496 1.00000000000000e+00 3497 3497 1.00000000000000e+00 3498 3498 1.00000000000000e+00 3499 3499 1.00000000000000e+00 3500 3500 1.00000000000000e+00 3501 3501 1.00000000000000e+00 3502 3502 1.00000000000000e+00 3503 3503 1.00000000000000e+00 3504 3504 1.00000000000000e+00 3505 3505 1.00000000000000e+00 3506 3506 1.00000000000000e+00 3507 3507 1.00000000000000e+00 3508 3508 1.00000000000000e+00 3509 3509 1.00000000000000e+00 3510 3510 1.00000000000000e+00 3511 3511 1.00000000000000e+00 3512 3512 1.00000000000000e+00 3513 3513 1.00000000000000e+00 3514 3514 1.00000000000000e+00 3515 3515 1.00000000000000e+00 3516 3516 1.00000000000000e+00 3517 3517 1.00000000000000e+00 3518 3518 1.00000000000000e+00 3519 3519 1.00000000000000e+00 3520 3520 1.00000000000000e+00 3521 3521 1.00000000000000e+00 3522 3522 1.00000000000000e+00 3523 3523 1.00000000000000e+00 3524 3524 1.00000000000000e+00 3525 3525 1.00000000000000e+00 3526 3526 1.00000000000000e+00 3527 3527 1.00000000000000e+00 3528 3528 1.00000000000000e+00 3529 3529 1.00000000000000e+00 3530 3530 1.00000000000000e+00 3531 3531 1.00000000000000e+00 3532 3532 1.00000000000000e+00 3533 3533 1.00000000000000e+00 3534 3534 1.00000000000000e+00 3535 3535 1.00000000000000e+00 3536 3536 1.00000000000000e+00 3537 3537 1.00000000000000e+00 3538 3538 1.00000000000000e+00 3539 3539 1.00000000000000e+00 3540 3540 1.00000000000000e+00 3541 3541 1.00000000000000e+00 3542 3542 1.00000000000000e+00 3543 3543 1.00000000000000e+00 3544 3544 1.00000000000000e+00 3545 3545 1.00000000000000e+00 3546 3546 1.00000000000000e+00 3547 3547 1.00000000000000e+00 3548 3548 1.00000000000000e+00 3549 3549 1.00000000000000e+00 3550 3550 1.00000000000000e+00 3551 3551 1.00000000000000e+00 3552 3552 1.00000000000000e+00 3553 3553 1.00000000000000e+00 3554 3554 1.00000000000000e+00 3555 3555 1.00000000000000e+00 3556 3556 1.00000000000000e+00 3557 3557 1.00000000000000e+00 3558 3558 1.00000000000000e+00 3559 3559 1.00000000000000e+00 3560 3560 1.00000000000000e+00 3561 3561 1.00000000000000e+00 3562 3562 1.00000000000000e+00 3563 3563 1.00000000000000e+00 3564 3564 1.00000000000000e+00 3565 3565 1.00000000000000e+00 3566 3566 1.00000000000000e+00 3567 3567 1.00000000000000e+00 3568 3568 1.00000000000000e+00 3569 3569 1.00000000000000e+00 3570 3570 1.00000000000000e+00 3571 3571 1.00000000000000e+00 3572 3572 1.00000000000000e+00 3573 3573 1.00000000000000e+00 3574 3574 1.00000000000000e+00 3575 3575 1.00000000000000e+00 3576 3576 1.00000000000000e+00 3577 3577 1.00000000000000e+00 3578 3578 1.00000000000000e+00 3579 3579 1.00000000000000e+00 3580 3580 1.00000000000000e+00 3581 3581 1.00000000000000e+00 3582 3582 1.00000000000000e+00 3583 3583 1.00000000000000e+00 3584 3584 1.00000000000000e+00 3585 3585 1.00000000000000e+00 3586 3586 1.00000000000000e+00 3587 3587 1.00000000000000e+00 3588 3588 1.00000000000000e+00 3589 3589 1.00000000000000e+00 3590 3590 1.00000000000000e+00 3591 3591 1.00000000000000e+00 3592 3592 1.00000000000000e+00 3593 3593 1.00000000000000e+00 3594 3594 1.00000000000000e+00 3595 3595 1.00000000000000e+00 3596 3596 1.00000000000000e+00 3597 3597 1.00000000000000e+00 3598 3598 1.00000000000000e+00 3599 3599 1.00000000000000e+00 3600 3600 1.00000000000000e+00 3601 3601 1.00000000000000e+00 3602 3602 1.00000000000000e+00 3603 3603 1.00000000000000e+00 3604 3604 1.00000000000000e+00 3605 3605 1.00000000000000e+00 3606 3606 1.00000000000000e+00 3607 3607 1.00000000000000e+00 3608 3608 1.00000000000000e+00 3609 3609 1.00000000000000e+00 3610 3610 1.00000000000000e+00 3611 3611 1.00000000000000e+00 3612 3612 1.00000000000000e+00 3613 3613 1.00000000000000e+00 3614 3614 1.00000000000000e+00 3615 3615 1.00000000000000e+00 3616 3616 1.00000000000000e+00 3617 3617 1.00000000000000e+00 3618 3618 1.00000000000000e+00 3619 3619 1.00000000000000e+00 3620 3620 1.00000000000000e+00 3621 3621 1.00000000000000e+00 3622 3622 1.00000000000000e+00 3623 3623 1.00000000000000e+00 3624 3624 1.00000000000000e+00 3625 3625 1.00000000000000e+00 3626 3626 1.00000000000000e+00 3627 3627 1.00000000000000e+00 3628 3628 1.00000000000000e+00 3629 3629 1.00000000000000e+00 3630 3630 1.00000000000000e+00 3631 3631 1.00000000000000e+00 3632 3632 1.00000000000000e+00 3633 3633 1.00000000000000e+00 3634 3634 1.00000000000000e+00 3635 3635 1.00000000000000e+00 3636 3636 1.00000000000000e+00 3637 3637 1.00000000000000e+00 3638 3638 1.00000000000000e+00 3639 3639 1.00000000000000e+00 3640 3640 1.00000000000000e+00 3641 3641 1.00000000000000e+00 3642 3642 1.00000000000000e+00 3643 3643 1.00000000000000e+00 3644 3644 1.00000000000000e+00 3645 3645 1.00000000000000e+00 3646 3646 1.00000000000000e+00 3647 3647 1.00000000000000e+00 3648 3648 1.00000000000000e+00 3649 3649 1.00000000000000e+00 3650 3650 1.00000000000000e+00 3651 3651 1.00000000000000e+00 3652 3652 1.00000000000000e+00 3653 3653 1.00000000000000e+00 3654 3654 1.00000000000000e+00 3655 3655 1.00000000000000e+00 3656 3656 1.00000000000000e+00 3657 3657 1.00000000000000e+00 3658 3658 1.00000000000000e+00 3659 3659 1.00000000000000e+00 3660 3660 1.00000000000000e+00 3661 3661 1.00000000000000e+00 3662 3662 1.00000000000000e+00 3663 3663 1.00000000000000e+00 3664 3664 1.00000000000000e+00 3665 3665 1.00000000000000e+00 3666 3666 1.00000000000000e+00 3667 3667 1.00000000000000e+00 3668 3668 1.00000000000000e+00 3669 3669 1.00000000000000e+00 3670 3670 1.00000000000000e+00 3671 3671 1.00000000000000e+00 3672 3672 1.00000000000000e+00 3673 3673 1.00000000000000e+00 3674 3674 1.00000000000000e+00 3675 3675 1.00000000000000e+00 3676 3676 1.00000000000000e+00 3677 3677 1.00000000000000e+00 3678 3678 1.00000000000000e+00 3679 3679 1.00000000000000e+00 3680 3680 1.00000000000000e+00 3681 3681 1.00000000000000e+00 3682 3682 1.00000000000000e+00 3683 3683 1.00000000000000e+00 3684 3684 1.00000000000000e+00 3685 3685 1.00000000000000e+00 3686 3686 1.00000000000000e+00 3687 3687 1.00000000000000e+00 3688 3688 1.00000000000000e+00 3689 3689 1.00000000000000e+00 3690 3690 1.00000000000000e+00 3691 3691 1.00000000000000e+00 3692 3692 1.00000000000000e+00 3693 3693 1.00000000000000e+00 3694 3694 1.00000000000000e+00 3695 3695 1.00000000000000e+00 3696 3696 1.00000000000000e+00 3697 3697 1.00000000000000e+00 3698 3698 1.00000000000000e+00 3699 3699 1.00000000000000e+00 3700 3700 1.00000000000000e+00 3701 3701 1.00000000000000e+00 3702 3702 1.00000000000000e+00 3703 3703 1.00000000000000e+00 3704 3704 1.00000000000000e+00 3705 3705 1.00000000000000e+00 3706 3706 1.00000000000000e+00 3707 3707 1.00000000000000e+00 3708 3708 1.00000000000000e+00 3709 3709 1.00000000000000e+00 3710 3710 1.00000000000000e+00 3711 3711 1.00000000000000e+00 3712 3712 1.00000000000000e+00 3713 3713 1.00000000000000e+00 3714 3714 1.00000000000000e+00 3715 3715 1.00000000000000e+00 3716 3716 1.00000000000000e+00 3717 3717 1.00000000000000e+00 3718 3718 1.00000000000000e+00 3719 3719 1.00000000000000e+00 3720 3720 1.00000000000000e+00 3721 3721 1.00000000000000e+00 3722 3722 1.00000000000000e+00 3723 3723 1.00000000000000e+00 3724 3724 1.00000000000000e+00 3725 3725 1.00000000000000e+00 3726 3726 1.00000000000000e+00 3727 3727 1.00000000000000e+00 3728 3728 1.00000000000000e+00 3729 3729 1.00000000000000e+00 3730 3730 1.00000000000000e+00 3731 3731 1.00000000000000e+00 3732 3732 1.00000000000000e+00 3733 3733 1.00000000000000e+00 3734 3734 1.00000000000000e+00 3735 3735 1.00000000000000e+00 3736 3736 1.00000000000000e+00 3737 3737 1.00000000000000e+00 3738 3738 1.00000000000000e+00 3739 3739 1.00000000000000e+00 3740 3740 1.00000000000000e+00 3741 3741 1.00000000000000e+00 3742 3742 1.00000000000000e+00 3743 3743 1.00000000000000e+00 3744 3744 1.00000000000000e+00 3745 3745 1.00000000000000e+00 3746 3746 1.00000000000000e+00 3747 3747 1.00000000000000e+00 3748 3748 1.00000000000000e+00 3749 3749 1.00000000000000e+00 3750 3750 1.00000000000000e+00 3751 3751 1.00000000000000e+00 3752 3752 1.00000000000000e+00 3753 3753 1.00000000000000e+00 3754 3754 1.00000000000000e+00 3755 3755 1.00000000000000e+00 3756 3756 1.00000000000000e+00 3757 3757 1.00000000000000e+00 3758 3758 1.00000000000000e+00 3759 3759 1.00000000000000e+00 3760 3760 1.00000000000000e+00 3761 3761 1.00000000000000e+00 3762 3762 1.00000000000000e+00 3763 3763 1.00000000000000e+00 3764 3764 1.00000000000000e+00 3765 3765 1.00000000000000e+00 3766 3766 1.00000000000000e+00 3767 3767 1.00000000000000e+00 3768 3768 1.00000000000000e+00 3769 3769 1.00000000000000e+00 3770 3770 1.00000000000000e+00 3771 3771 1.00000000000000e+00 3772 3772 1.00000000000000e+00 3773 3773 1.00000000000000e+00 3774 3774 1.00000000000000e+00 3775 3775 1.00000000000000e+00 3776 3776 1.00000000000000e+00 3777 3777 1.00000000000000e+00 3778 3778 1.00000000000000e+00 3779 3779 1.00000000000000e+00 3780 3780 1.00000000000000e+00 3781 3781 1.00000000000000e+00 3782 3782 1.00000000000000e+00 3783 3783 1.00000000000000e+00 3784 3784 1.00000000000000e+00 3785 3785 1.00000000000000e+00 3786 3786 1.00000000000000e+00 3787 3787 1.00000000000000e+00 3788 3788 1.00000000000000e+00 3789 3789 1.00000068632295e+00 3789 3213 2.80088098136377e-06 3789 3237 5.22093285751312e-06 3789 3261 1.31921271842000e-09 3789 3813 6.42960599027272e-04 3789 3837 5.01825510064345e-04 3789 3861 8.97612361523940e-07 3789 4389 1.54671107146394e-04 3789 4413 3.30908086177547e-03 3789 4437 8.16320942124741e-04 3789 4461 8.78103357304610e-07 3789 4989 7.80904127106641e-05 3789 5013 7.01132519780409e-04 3789 5037 8.29054817407587e-05 3789 5061 1.62635643746710e-07 3789 5589 5.88890614340000e-09 3789 5613 3.75230044358600e-08 3789 5637 5.61618000186800e-08 3789 5661 1.65361740000000e-13 3789 6213 3.96000000000000e-17 3789 6237 2.69600000000000e-17 3789 16224 -1.67620106534635e-04 3789 16248 -8.45132164331546e-05 3789 16272 -2.00903761667800e-07 3789 16632 -1.19673275115655e-03 3789 16656 -6.07278449815367e-04 3789 16680 -2.54630692488353e-06 3789 17040 -2.27267444385334e-03 3789 17064 -1.16143813803570e-03 3789 17088 -7.17169031686446e-06 3789 17448 -5.26432474004659e-04 3789 17472 -2.69315925168935e-04 3789 17496 -1.74276804760170e-06 3789 17856 -4.50372466621900e-08 3789 17880 -2.25852715468000e-08 3789 17904 -1.90423473400000e-11 3790 3790 1.00000000000000e+00 3791 3791 1.00000000000000e+00 3792 3792 1.00000000000000e+00 3793 3793 1.00000000000000e+00 3794 3794 1.00000000000000e+00 3795 3795 1.00000000000000e+00 3796 3796 1.00000000000000e+00 3797 3797 1.00000000000000e+00 3798 3798 1.00000000000000e+00 3799 3799 1.00000000000000e+00 3800 3800 1.00000000000000e+00 3801 3801 1.00000000000000e+00 3802 3802 1.00000000000000e+00 3803 3803 1.00000000000000e+00 3804 3804 1.00000000000000e+00 3805 3805 1.00000000000000e+00 3806 3806 1.00000000000000e+00 3807 3807 1.00000000000000e+00 3808 3808 1.00000000000000e+00 3809 3809 1.00000000000000e+00 3810 3810 1.00000000000000e+00 3811 3811 1.00000000000000e+00 3812 3812 1.00000000000000e+00 3813 3813 6.60889732475958e+00 3813 2637 1.18136420444713e-02 3813 2661 7.34843574811677e-03 3813 2685 1.36192251944492e-06 3813 3213 1.83378625356757e-01 3813 3237 1.35780839835569e+00 3813 3261 1.48862480810996e-01 3813 3285 2.39044322190814e-04 3813 3789 6.42960599027272e-04 3813 3837 8.47559702554766e+00 3813 3861 2.78118470954534e-01 3813 3885 3.23989771589686e-04 3813 4389 6.30109354465528e-02 3813 4413 6.11383506306117e+00 3813 4437 4.37323350928698e+00 3813 4461 9.56967206476581e-02 3813 4485 1.81715951490776e-05 3813 4989 3.01114647711882e-02 3813 5013 3.28881041915934e-01 3813 5037 1.15120413221378e-01 3813 5061 3.27777054418445e-03 3813 5085 1.82413221143818e-06 3813 5589 4.05234314351900e-08 3813 5613 1.19958834153309e-04 3813 5637 2.34927877494182e-04 3813 5661 3.01784208052619e-06 3813 6213 2.85680000000000e-16 3813 6237 1.94460000000000e-16 3813 15408 -3.49139124709039e-02 3813 15432 -1.88624550732972e-02 3813 15456 -4.01571096527211e-04 3813 15816 -7.35786296464262e-01 3813 15840 -4.17890200362018e-01 3813 15864 -1.42858512538454e-02 3813 15888 -2.63635274781220e-07 3813 16224 -4.44043579606690e+00 3813 16248 -2.51925394366342e+00 3813 16272 -8.56064705006712e-02 3813 16296 -4.51231632600826e-05 3813 16632 -8.88650814138442e+00 3813 16656 -4.99269484567996e+00 3813 16680 -1.57674992663909e-01 3813 16704 -1.86284564303322e-04 3813 17040 -2.84652083002149e+00 3813 17064 -1.64156849315697e+00 3813 17088 -6.26822243240912e-02 3813 17112 -8.30543836997973e-05 3813 17448 -2.06381545340387e-01 3813 17472 -1.27735214090191e-01 3813 17496 -7.04889861285685e-03 3813 17520 -9.74644038470988e-06 3813 17856 -3.09907564292860e-07 3813 17880 -1.55434573406250e-07 3813 17904 -1.37368931380000e-10 3814 3814 1.00000000000000e+00 3815 3815 1.00000000000000e+00 3816 3816 1.00000000000000e+00 3817 3817 1.00000000000000e+00 3818 3818 1.00000000000000e+00 3819 3819 1.00000000000000e+00 3820 3820 1.00000000000000e+00 3821 3821 1.00000000000000e+00 3822 3822 1.00000000000000e+00 3823 3823 1.00000000000000e+00 3824 3824 1.00000000000000e+00 3825 3825 1.00000000000000e+00 3826 3826 1.00000000000000e+00 3827 3827 1.00000000000000e+00 3828 3828 1.00000000000000e+00 3829 3829 1.00000000000000e+00 3830 3830 1.00000000000000e+00 3831 3831 1.00000000000000e+00 3832 3832 1.00000000000000e+00 3833 3833 1.00000000000000e+00 3834 3834 1.00000000000000e+00 3835 3835 1.00000000000000e+00 3836 3836 1.00000000000000e+00 3837 3837 2.52133658919628e+01 3837 2037 4.59011807340396e-05 3837 2061 1.80194811187150e-04 3837 2085 7.09230616116290e-07 3837 2637 3.21523235303118e-01 3837 2661 2.45504972402707e-01 3837 2685 2.98352467610303e-03 3837 2709 5.17938663274500e-06 3837 3213 6.74357737899597e-01 3837 3237 9.91943451262241e+00 3837 3261 3.76737230205418e+00 3837 3285 1.37148490235047e-01 3837 3309 2.94496133374683e-04 3837 3333 2.37500000000000e-16 3837 3789 5.01825510064345e-04 3837 3813 8.47559702554766e+00 3837 3861 5.81461242173243e+00 3837 3885 3.88254869960615e-01 3837 3909 4.30184941148576e-04 3837 3933 1.70813000000000e-15 3837 4389 2.29883960010645e-02 3837 4413 6.37363411517362e+00 3837 4437 8.30042343340743e+00 3837 4461 2.28682142390906e+00 3837 4485 1.59134713973787e-01 3837 4509 7.38617469010381e-05 3837 4989 9.74515294596649e-03 3837 5013 1.65911619907650e-01 3837 5037 2.84023234766726e-01 3837 5061 1.41458480609613e-01 3837 5085 3.14962360091569e-03 3837 5109 2.33546346859161e-06 3837 5613 1.28078995586533e-04 3837 5637 4.71482473101207e-04 3837 5661 1.01435749871596e-04 3837 5685 6.98380998805092e-06 3837 15000 -7.07189490284714e-03 3837 15024 -8.34695865135725e-03 3837 15048 -1.65556807285418e-03 3837 15072 -7.56520811581506e-05 3837 15408 -9.88607456833689e-01 3837 15432 -9.48787970187838e-01 3837 15456 -2.02228954966383e-01 3837 15480 -1.94860308560969e-02 3837 15504 -2.68148023391800e-08 3837 15816 -6.32291240332999e+00 3837 15840 -5.92201974611259e+00 3837 15864 -1.39480511332749e+00 3837 15888 -1.63888366341900e-01 3837 15912 -1.91637324661198e-04 3837 16224 -1.31344205713099e+01 3837 16248 -1.16102424187959e+01 3837 16272 -2.92410451374053e+00 3837 16296 -4.02728245207740e-01 3837 16320 -9.09969541231139e-04 3837 16632 -1.16470936735664e+01 3837 16656 -9.05696095074172e+00 3837 16680 -1.76103804557888e+00 3837 16704 -2.28262293221427e-01 3837 16728 -7.66819923937577e-04 3837 17040 -2.55228025707649e+00 3837 17064 -1.92125528213324e+00 3837 17088 -3.17162331399170e-01 3837 17112 -3.63021842950960e-02 3837 17136 -1.43822464621434e-04 3837 17448 -6.91058902851671e-02 3837 17472 -5.86754948615213e-02 3837 17496 -7.88893963817137e-03 3837 17520 -2.68364539589388e-04 3838 3838 1.00000000000000e+00 3839 3839 1.00000000000000e+00 3840 3840 1.00000000000000e+00 3841 3841 1.00000000000000e+00 3842 3842 1.00000000000000e+00 3843 3843 1.00000000000000e+00 3844 3844 1.00000000000000e+00 3845 3845 1.00000000000000e+00 3846 3846 1.00000000000000e+00 3847 3847 1.00000000000000e+00 3848 3848 1.00000000000000e+00 3849 3849 1.00000000000000e+00 3850 3850 1.00000000000000e+00 3851 3851 1.00000000000000e+00 3852 3852 1.00000000000000e+00 3853 3853 1.00000000000000e+00 3854 3854 1.00000000000000e+00 3855 3855 1.00000000000000e+00 3856 3856 1.00000000000000e+00 3857 3857 1.00000000000000e+00 3858 3858 1.00000000000000e+00 3859 3859 1.00000000000000e+00 3860 3860 1.00000000000000e+00 3861 3861 1.85107007957681e+01 3861 2037 7.20900767794626e-05 3861 2061 3.54827271089046e-04 3861 2085 3.19208832744818e-06 3861 2637 1.29727964301456e-01 3861 2661 2.79777465397475e-01 3861 2685 9.08790737019995e-02 3861 2709 2.93365015021248e-03 3861 2733 1.91012521360000e-10 3861 3213 4.82735193069476e-02 3861 3237 3.09914208319462e+00 3861 3261 6.98081283453296e+00 3861 3285 2.64884504318002e+00 3861 3309 1.04720627674970e-01 3861 3333 2.33188526392932e-04 3861 3357 3.85400000000000e-17 3861 3789 8.97612361523940e-07 3861 3813 2.78118470954534e-01 3861 3837 5.81461242173243e+00 3861 3885 7.60940118776541e+00 3861 3909 3.83651946384645e-01 3861 3933 2.67258390988048e-04 3861 3957 6.14500000000000e-17 3861 4389 1.11277923894419e-05 3861 4413 1.11544915246482e-01 3861 4437 2.30136421296784e+00 3861 4461 7.22470846299925e+00 3861 4485 2.77392916116127e+00 3861 4509 1.29158141991549e-01 3861 4533 1.40199035422927e-04 3861 4989 1.43358216180975e-06 3861 5013 3.49349886848894e-03 3861 5037 1.35101238191699e-01 3861 5061 3.05741013405640e-01 3861 5085 1.30017308321317e-01 3861 5109 3.37533779248329e-03 3861 5133 1.07354659163104e-06 3861 5613 1.08879937028275e-06 3861 5637 2.10763663817745e-05 3861 5661 5.42606048985633e-04 3861 5685 2.64738694593930e-04 3861 5709 2.40795486257654e-06 3861 15000 -2.04644255858374e-02 3861 15024 -9.39954658147409e-02 3861 15048 -1.57084032693361e-01 3861 15072 -6.09452274392239e-02 3861 15096 -6.72695047920763e-03 3861 15120 -1.62243194400000e-11 3861 15408 -4.70523537717523e-01 3861 15432 -1.79211733908759e+00 3861 15456 -2.84276194806406e+00 3861 15480 -1.10467050991717e+00 3861 15504 -1.24457816678191e-01 3861 15528 -3.77341038477285e-04 3861 15816 -1.79324213756288e+00 3861 15840 -6.75754988964338e+00 3861 15864 -1.09547396060201e+01 3861 15888 -4.28313906253394e+00 3861 15912 -4.87379513125262e-01 3861 15936 -2.41855455161586e-03 3861 16224 -1.28138291463891e+00 3861 16248 -5.48334295921221e+00 3861 16272 -1.00015592700933e+01 3861 16296 -3.98187100407156e+00 3861 16320 -4.60405244955091e-01 3861 16344 -4.02285784986327e-03 3861 16632 -3.00034719279312e-01 3861 16656 -1.43888709538292e+00 3861 16680 -2.67231919083986e+00 3861 16704 -1.01738905164711e+00 3861 16728 -1.09952822002806e-01 3861 16752 -9.44207889060296e-04 3861 17040 -2.05692093069995e-02 3861 17064 -1.13112689805212e-01 3861 17088 -1.94606147503319e-01 3861 17112 -6.35762543224439e-02 3861 17136 -5.15015269182185e-03 3861 17160 -8.75431199719495e-06 3861 17448 -1.96369108521814e-05 3861 17472 -9.55235986069291e-05 3861 17496 -8.75407316449953e-05 3861 17520 -1.69759551982035e-05 3862 3862 1.00000000000000e+00 3863 3863 1.00000000000000e+00 3864 3864 1.00000000000000e+00 3865 3865 1.00000000000000e+00 3866 3866 1.00000000000000e+00 3867 3867 1.00000000000000e+00 3868 3868 1.00000000000000e+00 3869 3869 1.00000000000000e+00 3870 3870 1.00000000000000e+00 3871 3871 1.00000000000000e+00 3872 3872 1.00000000000000e+00 3873 3873 1.00000000000000e+00 3874 3874 1.00000000000000e+00 3875 3875 1.00000000000000e+00 3876 3876 1.00000000000000e+00 3877 3877 1.00000000000000e+00 3878 3878 1.00000000000000e+00 3879 3879 1.00000000000000e+00 3880 3880 1.00000000000000e+00 3881 3881 1.00000000000000e+00 3882 3882 1.00000000000000e+00 3883 3883 1.00000000000000e+00 3884 3884 1.00000000000000e+00 3885 3885 1.81406348468672e+01 3885 2037 4.55990495249551e-06 3885 2061 3.30881342016367e-05 3885 2085 5.18496828096290e-07 3885 2637 4.32657486010460e-03 3885 2661 1.09481969201773e-01 3885 2685 2.98235611124593e-01 3885 2709 5.66352263340657e-02 3885 2733 1.76934258518440e-07 3885 3213 1.28664970767145e-04 3885 3237 1.15026971954077e-01 3885 3261 2.68222047618842e+00 3885 3285 5.96431524939480e+00 3885 3309 2.68265796979801e+00 3885 3333 1.36090564095540e-01 3885 3357 6.61673559220368e-06 3885 3813 3.23989771589686e-04 3885 3837 3.88254869960615e-01 3885 3861 7.60940118776541e+00 3885 3909 6.00181058392049e+00 3885 3933 3.37952987363555e-01 3885 3957 1.84499564047513e-04 3885 4413 9.87647472616811e-05 3885 4437 1.63787166671299e-01 3885 4461 2.77588105773609e+00 3885 4485 6.72471884021619e+00 3885 4509 2.67314736954823e+00 3885 4533 1.03910226659845e-01 3885 4557 1.14998784692893e-04 3885 5013 1.53658882619243e-05 3885 5037 3.35210990307837e-03 3885 5061 1.17467751532464e-01 3885 5085 3.25771669079227e-01 3885 5109 1.19649369036845e-01 3885 5133 4.53064416783978e-03 3885 5157 1.66357890694840e-07 3885 5637 8.42870972887720e-07 3885 5661 1.33659463189934e-04 3885 5685 1.52045374293928e-04 3885 5709 1.86724261971482e-04 3885 5733 1.40334369341953e-05 3885 15000 -2.63702574884978e-03 3885 15024 -1.17498240106751e-01 3885 15048 -7.56106341981153e-01 3885 15072 -1.51207846681762e+00 3885 15096 -7.35724208401014e-01 3885 15120 -1.03422884076186e-01 3885 15144 -2.42406379375074e-04 3885 15408 -1.75666651323256e-02 3885 15432 -6.38508544939129e-01 3885 15456 -3.72278010225770e+00 3885 15480 -6.68777816209319e+00 3885 15504 -2.99889266328806e+00 3885 15528 -4.08296859121539e-01 3885 15552 -4.43604484561120e-03 3885 15816 -3.10803560498734e-02 3885 15840 -1.33316206270320e+00 3885 15864 -7.34164664187888e+00 3885 15888 -1.18093709731944e+01 3885 15912 -5.28864690628289e+00 3885 15936 -7.58041586363656e-01 3885 15960 -1.45815447323934e-02 3885 16224 -8.02848167035927e-03 3885 16248 -5.38961450759740e-01 3885 16272 -3.06527398950026e+00 3885 16296 -4.89729124264456e+00 3885 16320 -2.11930396500524e+00 3885 16344 -2.92463126461178e-01 3885 16368 -5.36026349040975e-03 3885 16632 -2.44065315422977e-04 3885 16656 -6.28594643042423e-02 3885 16680 -3.75923620321791e-01 3885 16704 -6.03687179371143e-01 3885 16728 -2.45488223812454e-01 3885 16752 -3.11108491462272e-02 3885 16776 -4.73461040574712e-04 3885 17064 -7.09905820190926e-04 3885 17088 -4.05950296912925e-03 3885 17112 -5.60829570506774e-03 3885 17136 -1.29536421402409e-03 3885 17160 -1.88711314146374e-05 3886 3886 1.00000000000000e+00 3887 3887 1.00000000000000e+00 3888 3888 1.00000000000000e+00 3889 3889 1.00000000000000e+00 3890 3890 1.00000000000000e+00 3891 3891 1.00000000000000e+00 3892 3892 1.00000000000000e+00 3893 3893 1.00000000000000e+00 3894 3894 1.00000000000000e+00 3895 3895 1.00000000000000e+00 3896 3896 1.00000000000000e+00 3897 3897 1.00000000000000e+00 3898 3898 1.00000000000000e+00 3899 3899 1.00000000000000e+00 3900 3900 1.00000000000000e+00 3901 3901 1.00000000000000e+00 3902 3902 1.00000000000000e+00 3903 3903 1.00000000000000e+00 3904 3904 1.00000000000000e+00 3905 3905 1.00000000000000e+00 3906 3906 1.00000000000000e+00 3907 3907 1.00000000000000e+00 3908 3908 1.00000000000000e+00 3909 3909 1.79804363934441e+01 3909 2637 4.80711473217600e-08 3909 2661 7.50438699090477e-03 3909 2685 1.55044360737322e-01 3909 2709 9.79813381742708e-02 3909 2733 1.86054858380126e-06 3909 3237 1.55156966072355e-04 3909 3261 9.86337930065479e-02 3909 3285 3.14714061325156e+00 3909 3309 1.12062297642624e+01 3909 3333 3.62600246314894e+00 3909 3357 3.70617261712393e-02 3909 3837 4.30184941148576e-04 3909 3861 3.83651946384645e-01 3909 3885 6.00181058392049e+00 3909 3933 8.40787723111200e+00 3909 3957 4.11150698402183e-01 3909 3981 2.73392609382710e-04 3909 4437 2.12410211905635e-04 3909 4461 1.38803384818389e-01 3909 4485 2.69560330541532e+00 3909 4509 6.03243372310633e+00 3909 4533 2.20243939165178e+00 3909 4557 1.01036021558391e-01 3909 4581 2.02409678011769e-04 3909 5037 6.81126937739456e-06 3909 5061 5.70101788762022e-03 3909 5085 1.04668459507658e-01 3909 5109 3.28037469003473e-01 3909 5133 1.48638855963735e-01 3909 5157 5.85510262322272e-03 3909 5181 3.96083470000000e-13 3909 5685 9.19256200499717e-05 3909 5709 6.35178349373478e-04 3909 5733 1.17189641502778e-04 3909 5757 8.73668005157790e-06 3909 15024 -1.19215732302669e-02 3909 15048 -4.83551374784487e-01 3909 15072 -3.96155814643469e+00 3909 15096 -9.81224485046643e+00 3909 15120 -4.42153745514157e+00 3909 15144 -5.86323053563013e-01 3909 15168 -8.66206699074866e-03 3909 15432 -1.53507695888664e-02 3909 15456 -8.37895207133275e-01 3909 15480 -5.66644235563035e+00 3909 15504 -1.17788140657166e+01 3909 15528 -5.85915587839815e+00 3909 15552 -9.28686431603785e-01 3909 15576 -2.67141945964824e-02 3909 15840 -5.05501392373296e-03 3909 15864 -5.12343280474779e-01 3909 15888 -3.34211054867200e+00 3909 15912 -6.52746285474573e+00 3909 15936 -3.63348164739559e+00 3909 15960 -6.43339735310622e-01 3909 15984 -2.05626619650520e-02 3909 16248 -6.38658904564033e-04 3909 16272 -1.04269346786835e-01 3909 16296 -7.08432062787709e-01 3909 16320 -1.42191071427140e+00 3909 16344 -7.70581711034155e-01 3909 16368 -1.31722113288670e-01 3909 16392 -3.81608675529010e-03 3909 16680 -3.26638239810645e-03 3909 16704 -2.46988284185830e-02 3909 16728 -5.17816687505499e-02 3909 16752 -1.95621366677711e-02 3909 16776 -1.98398564923316e-03 3909 16800 -4.73650354579950e-07 3910 3910 1.00000000000000e+00 3911 3911 1.00000000000000e+00 3912 3912 1.00000000000000e+00 3913 3913 1.00000000000000e+00 3914 3914 1.00000000000000e+00 3915 3915 1.00000000000000e+00 3916 3916 1.00000000000000e+00 3917 3917 1.00000000000000e+00 3918 3918 1.00000000000000e+00 3919 3919 1.00000000000000e+00 3920 3920 1.00000000000000e+00 3921 3921 1.00000000000000e+00 3922 3922 1.00000000000000e+00 3923 3923 1.00000000000000e+00 3924 3924 1.00000000000000e+00 3925 3925 1.00000000000000e+00 3926 3926 1.00000000000000e+00 3927 3927 1.00000000000000e+00 3928 3928 1.00000000000000e+00 3929 3929 1.00000000000000e+00 3930 3930 1.00000000000000e+00 3931 3931 1.00000000000000e+00 3932 3932 1.00000000000000e+00 3933 3933 2.55581485016706e+01 3933 2661 2.36590348617495e-06 3933 2685 4.31692185634905e-03 3933 2709 8.35456992673652e-03 3933 2733 8.87219725627850e-07 3933 3261 1.59825900986147e-04 3933 3285 2.50073467614360e-01 3933 3309 5.44645677899667e+00 3933 3333 5.54000696248019e+00 3933 3357 3.02172057297916e-01 3933 3837 1.70813000000000e-15 3933 3861 2.67258390988048e-04 3933 3885 3.37952987363555e-01 3933 3909 8.40787723111200e+00 3933 3957 9.26996687393116e+00 3933 3981 1.92744512039679e-01 3933 4005 4.57242407563120e-07 3933 4437 1.16118000000000e-15 3933 4461 2.62041531254356e-04 3933 4485 1.20597050544890e-01 3933 4509 2.14495058601446e+00 3933 4533 6.20292311079304e+00 3933 4557 4.15240925190621e+00 3933 4581 2.69689879613936e-01 3933 4605 1.26615946688093e-06 3933 5061 2.74962501930980e-06 3933 5085 4.53171246542357e-03 3933 5109 1.46585707143295e-01 3933 5133 3.19728559420901e-01 3933 5157 1.02243790726410e-01 3933 5181 5.64636705605441e-03 3933 5685 1.74930753381091e-06 3933 5709 1.97278770701293e-05 3933 5733 4.54537256974676e-04 3933 5757 2.67866754088802e-04 3933 5781 1.54657054999065e-06 3933 15048 -9.65306573404754e-03 3933 15072 -1.18740850620940e+00 3933 15096 -7.28706157576636e+00 3933 15120 -1.36483898526966e+01 3933 15144 -9.88947253249652e+00 3933 15168 -2.26850405724519e+00 3933 15192 -1.24451148894912e-01 3933 15456 -6.21525660309214e-03 3933 15480 -8.34970990283421e-01 3933 15504 -5.46128485173948e+00 3933 15528 -1.11982184290233e+01 3933 15552 -8.42168416152394e+00 3933 15576 -1.88437508933349e+00 3933 15600 -8.86963956974814e-02 3933 15864 -3.96784765631882e-04 3933 15888 -1.01470518843150e-01 3933 15912 -8.51279404173898e-01 3933 15936 -2.17167163998994e+00 3933 15960 -1.52603805139534e+00 3933 15984 -3.02877918445012e-01 3933 16008 -9.12151484469944e-03 3933 16272 -1.76489563238000e-09 3933 16296 -8.79520094271788e-03 3933 16320 -8.96751616157894e-02 3933 16344 -2.48937627752003e-01 3933 16368 -1.43573546139141e-01 3933 16392 -2.38431983512806e-02 3933 16416 -4.19575438955597e-04 3933 16704 -9.43368006238351e-06 3933 16728 -8.35721701630065e-05 3933 16752 -1.93029350231713e-04 3933 16776 -4.68209319752308e-05 3933 16800 -2.45870515439590e-07 3934 3934 1.00000000000000e+00 3935 3935 1.00000000000000e+00 3936 3936 1.00000000000000e+00 3937 3937 1.00000000000000e+00 3938 3938 1.00000000000000e+00 3939 3939 1.00000000000000e+00 3940 3940 1.00000000000000e+00 3941 3941 1.00000000000000e+00 3942 3942 1.00000000000000e+00 3943 3943 1.00000000000000e+00 3944 3944 1.00000000000000e+00 3945 3945 1.00000000000000e+00 3946 3946 1.00000000000000e+00 3947 3947 1.00000000000000e+00 3948 3948 1.00000000000000e+00 3949 3949 1.00000000000000e+00 3950 3950 1.00000000000000e+00 3951 3951 1.00000000000000e+00 3952 3952 1.00000000000000e+00 3953 3953 1.00000000000000e+00 3954 3954 1.00000000000000e+00 3955 3955 1.00000000000000e+00 3956 3956 1.00000000000000e+00 3957 3957 1.65352612376491e+01 3957 2685 3.84760914064400e-08 3957 2709 2.17449701422410e-07 3957 2733 3.19243961200000e-11 3957 3285 6.16672890543066e-06 3957 3309 1.33556506834827e-01 3957 3333 7.56157576803354e-01 3957 3357 1.57248436422912e-01 3957 3861 6.14500000000000e-17 3957 3885 1.84499564047513e-04 3957 3909 4.11150698402183e-01 3957 3933 9.26996687393116e+00 3957 3981 2.24680920254792e+00 3957 4005 2.08212736614838e-03 3957 4461 1.01200000000000e-17 3957 4485 2.14991453078892e-04 3957 4509 1.01082040273076e-01 3957 4533 3.20527510274181e+00 3957 4557 1.20747408504984e+01 3957 4581 4.59301705652272e+00 3957 4605 6.52643325329211e-02 3957 4629 2.65320809328760e-07 3957 5085 9.75132400737207e-06 3957 5109 4.31287933667559e-03 3957 5133 8.83750882412678e-02 3957 5157 2.53180377174194e-01 3957 5181 1.34864340673858e-01 3957 5205 9.82793053106742e-03 3957 5229 2.76965240371850e-07 3957 5709 5.63269850000790e-07 3957 5733 1.46665177000229e-04 3957 5757 2.69575548313876e-04 3957 5781 1.97291361919338e-04 3957 5805 7.77337397786230e-07 3957 5829 1.83791670000000e-12 3957 15072 -3.95711006277197e-05 3957 15096 -3.24429347867767e-01 3957 15120 -3.50736818545126e+00 3957 15144 -1.14588221436155e+01 3957 15168 -1.14939187741039e+01 3957 15192 -2.73110193042548e+00 3957 15216 -1.09415256228251e-01 3957 15240 -8.84884528789628e-06 3957 15480 -2.00170805911734e-05 3957 15504 -1.97918336106527e-01 3957 15528 -2.26455304050106e+00 3957 15552 -7.40748823356999e+00 3957 15576 -6.80856023493019e+00 3957 15600 -1.58757384800460e+00 3957 15624 -6.76799247529334e-02 3957 15648 -5.06717717815108e-06 3957 15888 -6.61515078038700e-08 3957 15912 -1.07430284427307e-02 3957 15936 -1.56376062952831e-01 3957 15960 -5.14460043694642e-01 3957 15984 -3.17500633505508e-01 3957 16008 -6.49202412504744e-02 3957 16032 -3.70637046823079e-03 3957 16056 -1.83644152629410e-07 3957 16320 -1.45918259762627e-04 3957 16344 -2.80363635072941e-03 3957 16368 -9.42561470530920e-03 3957 16392 -3.81933610700285e-03 3957 16416 -3.99843198830990e-04 3958 3958 1.00000000000000e+00 3959 3959 1.00000000000000e+00 3960 3960 1.00000000000000e+00 3961 3961 1.00000000000000e+00 3962 3962 1.00000000000000e+00 3963 3963 1.00000000000000e+00 3964 3964 1.00000000000000e+00 3965 3965 1.00000000000000e+00 3966 3966 1.00000000000000e+00 3967 3967 1.00000000000000e+00 3968 3968 1.00000000000000e+00 3969 3969 1.00000000000000e+00 3970 3970 1.00000000000000e+00 3971 3971 1.00000000000000e+00 3972 3972 1.00000000000000e+00 3973 3973 1.00000000000000e+00 3974 3974 1.00000000000000e+00 3975 3975 1.00000000000000e+00 3976 3976 1.00000000000000e+00 3977 3977 1.00000000000000e+00 3978 3978 1.00000000000000e+00 3979 3979 1.00000000000000e+00 3980 3980 1.00000000000000e+00 3981 3981 1.87999395128718e+00 3981 3309 2.00195419374276e-06 3981 3333 3.63532297866516e-03 3981 3357 1.67498720578745e-03 3981 3909 2.73392609382710e-04 3981 3933 1.92744512039679e-01 3981 3957 2.24680920254792e+00 3981 4005 5.96412141363916e-03 3981 4509 2.27061860767542e-04 3981 4533 1.26642207232517e-01 3981 4557 2.93990643686120e+00 3981 4581 3.00812933496055e+00 3981 4605 2.51332964486057e-01 3981 4629 6.84807729967547e-04 3981 5109 1.44666009939137e-06 3981 5133 4.48672969599088e-03 3981 5157 7.91253656423224e-02 3981 5181 2.29394337282822e-01 3981 5205 6.99586949078880e-02 3981 5229 7.12317907240396e-04 3981 5757 9.38864787359752e-05 3981 5781 4.20437398965708e-04 3981 5805 6.46479002001113e-05 3981 5829 4.08628167584000e-09 3981 15120 -2.72999557635276e-02 3981 15144 -8.31443655203386e-01 3981 15168 -3.21770864406451e+00 3981 15192 -1.95058358179339e+00 3981 15216 -3.91858603018195e-01 3981 15240 -2.26063108285778e-02 3981 15528 -1.51031657139677e-02 3981 15552 -4.48334279241388e-01 3981 15576 -1.73811843761455e+00 3981 15600 -1.08493774795170e+00 3981 15624 -2.18132430886976e-01 3981 15648 -1.17009061321146e-02 3981 15936 -4.15196523486826e-04 3981 15960 -9.31784332562704e-03 3981 15984 -3.69326044520844e-02 3981 16008 -3.13274163014303e-02 3981 16032 -6.34375125082232e-03 3981 16056 -1.13643062235915e-04 3982 3982 1.00000000000000e+00 3983 3983 1.00000000000000e+00 3984 3984 1.00000000000000e+00 3985 3985 1.00000000000000e+00 3986 3986 1.00000000000000e+00 3987 3987 1.00000000000000e+00 3988 3988 1.00000000000000e+00 3989 3989 1.00000000000000e+00 3990 3990 1.00000000000000e+00 3991 3991 1.00000000000000e+00 3992 3992 1.00000000000000e+00 3993 3993 1.00000000000000e+00 3994 3994 1.00000000000000e+00 3995 3995 1.00000000000000e+00 3996 3996 1.00000000000000e+00 3997 3997 1.00000000000000e+00 3998 3998 1.00000000000000e+00 3999 3999 1.00000000000000e+00 4000 4000 1.00000000000000e+00 4001 4001 1.00000000000000e+00 4002 4002 1.00000000000000e+00 4003 4003 1.00000000000000e+00 4004 4004 1.00000000000000e+00 4005 4005 1.00019295784113e+00 4005 3333 5.45496585000000e-12 4005 3357 1.57623610900000e-11 4005 3933 4.57242407563120e-07 4005 3957 2.08212736614838e-03 4005 3981 5.96412141363916e-03 4005 4509 4.86770000000000e-16 4005 4533 1.24828921303146e-06 4005 4557 9.08688838913287e-03 4005 4581 5.92060211873687e-02 4005 4605 2.27218828907762e-02 4005 4629 1.74906230975336e-04 4005 5109 1.82940000000000e-16 4005 5133 9.84462529829360e-07 4005 5157 6.51068255958210e-04 4005 5181 1.04734868936988e-02 4005 5205 1.17535898769437e-02 4005 5229 1.81867178720743e-04 4005 5757 1.23556813447244e-06 4005 5781 2.18137199729476e-05 4005 5805 1.13653088228281e-05 4005 5829 1.02677524531000e-09 4005 15144 -3.07830518340566e-06 4005 15168 -7.64040556608113e-03 4005 15192 -3.62833187129932e-02 4005 15216 -3.06995764510265e-02 4005 15240 -5.76787102641976e-03 4005 15552 -1.54782487178359e-06 4005 15576 -4.00184406382046e-03 4005 15600 -1.89372668443837e-02 4005 15624 -1.58080846130477e-02 4005 15648 -2.95310796217859e-03 4005 15960 -2.47779430879000e-09 4005 15984 -5.18975087942567e-05 4005 16008 -2.27316425110599e-04 4005 16032 -1.30941825009837e-04 4005 16056 -1.97635568482039e-05 4006 4006 1.00000000000000e+00 4007 4007 1.00000000000000e+00 4008 4008 1.00000000000000e+00 4009 4009 1.00000000000000e+00 4010 4010 1.00000000000000e+00 4011 4011 1.00000000000000e+00 4012 4012 1.00000000000000e+00 4013 4013 1.00000000000000e+00 4014 4014 1.00000000000000e+00 4015 4015 1.00000000000000e+00 4016 4016 1.00000000000000e+00 4017 4017 1.00000000000000e+00 4018 4018 1.00000000000000e+00 4019 4019 1.00000000000000e+00 4020 4020 1.00000000000000e+00 4021 4021 1.00000000000000e+00 4022 4022 1.00000000000000e+00 4023 4023 1.00000000000000e+00 4024 4024 1.00000000000000e+00 4025 4025 1.00000000000000e+00 4026 4026 1.00000000000000e+00 4027 4027 1.00000000000000e+00 4028 4028 1.00000000000000e+00 4029 4029 1.00000000000000e+00 4030 4030 1.00000000000000e+00 4031 4031 1.00000000000000e+00 4032 4032 1.00000000000000e+00 4033 4033 1.00000000000000e+00 4034 4034 1.00000000000000e+00 4035 4035 1.00000000000000e+00 4036 4036 1.00000000000000e+00 4037 4037 1.00000000000000e+00 4038 4038 1.00000000000000e+00 4039 4039 1.00000000000000e+00 4040 4040 1.00000000000000e+00 4041 4041 1.00000000000000e+00 4042 4042 1.00000000000000e+00 4043 4043 1.00000000000000e+00 4044 4044 1.00000000000000e+00 4045 4045 1.00000000000000e+00 4046 4046 1.00000000000000e+00 4047 4047 1.00000000000000e+00 4048 4048 1.00000000000000e+00 4049 4049 1.00000000000000e+00 4050 4050 1.00000000000000e+00 4051 4051 1.00000000000000e+00 4052 4052 1.00000000000000e+00 4053 4053 1.00000000000000e+00 4054 4054 1.00000000000000e+00 4055 4055 1.00000000000000e+00 4056 4056 1.00000000000000e+00 4057 4057 1.00000000000000e+00 4058 4058 1.00000000000000e+00 4059 4059 1.00000000000000e+00 4060 4060 1.00000000000000e+00 4061 4061 1.00000000000000e+00 4062 4062 1.00000000000000e+00 4063 4063 1.00000000000000e+00 4064 4064 1.00000000000000e+00 4065 4065 1.00000000000000e+00 4066 4066 1.00000000000000e+00 4067 4067 1.00000000000000e+00 4068 4068 1.00000000000000e+00 4069 4069 1.00000000000000e+00 4070 4070 1.00000000000000e+00 4071 4071 1.00000000000000e+00 4072 4072 1.00000000000000e+00 4073 4073 1.00000000000000e+00 4074 4074 1.00000000000000e+00 4075 4075 1.00000000000000e+00 4076 4076 1.00000000000000e+00 4077 4077 1.00000000000000e+00 4078 4078 1.00000000000000e+00 4079 4079 1.00000000000000e+00 4080 4080 1.00000000000000e+00 4081 4081 1.00000000000000e+00 4082 4082 1.00000000000000e+00 4083 4083 1.00000000000000e+00 4084 4084 1.00000000000000e+00 4085 4085 1.00000000000000e+00 4086 4086 1.00000000000000e+00 4087 4087 1.00000000000000e+00 4088 4088 1.00000000000000e+00 4089 4089 1.00000000000000e+00 4090 4090 1.00000000000000e+00 4091 4091 1.00000000000000e+00 4092 4092 1.00000000000000e+00 4093 4093 1.00000000000000e+00 4094 4094 1.00000000000000e+00 4095 4095 1.00000000000000e+00 4096 4096 1.00000000000000e+00 4097 4097 1.00000000000000e+00 4098 4098 1.00000000000000e+00 4099 4099 1.00000000000000e+00 4100 4100 1.00000000000000e+00 4101 4101 1.00000000000000e+00 4102 4102 1.00000000000000e+00 4103 4103 1.00000000000000e+00 4104 4104 1.00000000000000e+00 4105 4105 1.00000000000000e+00 4106 4106 1.00000000000000e+00 4107 4107 1.00000000000000e+00 4108 4108 1.00000000000000e+00 4109 4109 1.00000000000000e+00 4110 4110 1.00000000000000e+00 4111 4111 1.00000000000000e+00 4112 4112 1.00000000000000e+00 4113 4113 1.00000000000000e+00 4114 4114 1.00000000000000e+00 4115 4115 1.00000000000000e+00 4116 4116 1.00000000000000e+00 4117 4117 1.00000000000000e+00 4118 4118 1.00000000000000e+00 4119 4119 1.00000000000000e+00 4120 4120 1.00000000000000e+00 4121 4121 1.00000000000000e+00 4122 4122 1.00000000000000e+00 4123 4123 1.00000000000000e+00 4124 4124 1.00000000000000e+00 4125 4125 1.00000000000000e+00 4126 4126 1.00000000000000e+00 4127 4127 1.00000000000000e+00 4128 4128 1.00000000000000e+00 4129 4129 1.00000000000000e+00 4130 4130 1.00000000000000e+00 4131 4131 1.00000000000000e+00 4132 4132 1.00000000000000e+00 4133 4133 1.00000000000000e+00 4134 4134 1.00000000000000e+00 4135 4135 1.00000000000000e+00 4136 4136 1.00000000000000e+00 4137 4137 1.00000000000000e+00 4138 4138 1.00000000000000e+00 4139 4139 1.00000000000000e+00 4140 4140 1.00000000000000e+00 4141 4141 1.00000000000000e+00 4142 4142 1.00000000000000e+00 4143 4143 1.00000000000000e+00 4144 4144 1.00000000000000e+00 4145 4145 1.00000000000000e+00 4146 4146 1.00000000000000e+00 4147 4147 1.00000000000000e+00 4148 4148 1.00000000000000e+00 4149 4149 1.00000000000000e+00 4150 4150 1.00000000000000e+00 4151 4151 1.00000000000000e+00 4152 4152 1.00000000000000e+00 4153 4153 1.00000000000000e+00 4154 4154 1.00000000000000e+00 4155 4155 1.00000000000000e+00 4156 4156 1.00000000000000e+00 4157 4157 1.00000000000000e+00 4158 4158 1.00000000000000e+00 4159 4159 1.00000000000000e+00 4160 4160 1.00000000000000e+00 4161 4161 1.00000000000000e+00 4162 4162 1.00000000000000e+00 4163 4163 1.00000000000000e+00 4164 4164 1.00000000000000e+00 4165 4165 1.00000000000000e+00 4166 4166 1.00000000000000e+00 4167 4167 1.00000000000000e+00 4168 4168 1.00000000000000e+00 4169 4169 1.00000000000000e+00 4170 4170 1.00000000000000e+00 4171 4171 1.00000000000000e+00 4172 4172 1.00000000000000e+00 4173 4173 1.00000000000000e+00 4174 4174 1.00000000000000e+00 4175 4175 1.00000000000000e+00 4176 4176 1.00000000000000e+00 4177 4177 1.00000000000000e+00 4178 4178 1.00000000000000e+00 4179 4179 1.00000000000000e+00 4180 4180 1.00000000000000e+00 4181 4181 1.00000000000000e+00 4182 4182 1.00000000000000e+00 4183 4183 1.00000000000000e+00 4184 4184 1.00000000000000e+00 4185 4185 1.00000000000000e+00 4186 4186 1.00000000000000e+00 4187 4187 1.00000000000000e+00 4188 4188 1.00000000000000e+00 4189 4189 1.00000000000000e+00 4190 4190 1.00000000000000e+00 4191 4191 1.00000000000000e+00 4192 4192 1.00000000000000e+00 4193 4193 1.00000000000000e+00 4194 4194 1.00000000000000e+00 4195 4195 1.00000000000000e+00 4196 4196 1.00000000000000e+00 4197 4197 1.00000000000000e+00 4198 4198 1.00000000000000e+00 4199 4199 1.00000000000000e+00 4200 4200 1.00000000000000e+00 4201 4201 1.00000000000000e+00 4202 4202 1.00000000000000e+00 4203 4203 1.00000000000000e+00 4204 4204 1.00000000000000e+00 4205 4205 1.00000000000000e+00 4206 4206 1.00000000000000e+00 4207 4207 1.00000000000000e+00 4208 4208 1.00000000000000e+00 4209 4209 1.00000000000000e+00 4210 4210 1.00000000000000e+00 4211 4211 1.00000000000000e+00 4212 4212 1.00000000000000e+00 4213 4213 1.00000000000000e+00 4214 4214 1.00000000000000e+00 4215 4215 1.00000000000000e+00 4216 4216 1.00000000000000e+00 4217 4217 1.00000000000000e+00 4218 4218 1.00000000000000e+00 4219 4219 1.00000000000000e+00 4220 4220 1.00000000000000e+00 4221 4221 1.00000000000000e+00 4222 4222 1.00000000000000e+00 4223 4223 1.00000000000000e+00 4224 4224 1.00000000000000e+00 4225 4225 1.00000000000000e+00 4226 4226 1.00000000000000e+00 4227 4227 1.00000000000000e+00 4228 4228 1.00000000000000e+00 4229 4229 1.00000000000000e+00 4230 4230 1.00000000000000e+00 4231 4231 1.00000000000000e+00 4232 4232 1.00000000000000e+00 4233 4233 1.00000000000000e+00 4234 4234 1.00000000000000e+00 4235 4235 1.00000000000000e+00 4236 4236 1.00000000000000e+00 4237 4237 1.00000000000000e+00 4238 4238 1.00000000000000e+00 4239 4239 1.00000000000000e+00 4240 4240 1.00000000000000e+00 4241 4241 1.00000000000000e+00 4242 4242 1.00000000000000e+00 4243 4243 1.00000000000000e+00 4244 4244 1.00000000000000e+00 4245 4245 1.00000000000000e+00 4246 4246 1.00000000000000e+00 4247 4247 1.00000000000000e+00 4248 4248 1.00000000000000e+00 4249 4249 1.00000000000000e+00 4250 4250 1.00000000000000e+00 4251 4251 1.00000000000000e+00 4252 4252 1.00000000000000e+00 4253 4253 1.00000000000000e+00 4254 4254 1.00000000000000e+00 4255 4255 1.00000000000000e+00 4256 4256 1.00000000000000e+00 4257 4257 1.00000000000000e+00 4258 4258 1.00000000000000e+00 4259 4259 1.00000000000000e+00 4260 4260 1.00000000000000e+00 4261 4261 1.00000000000000e+00 4262 4262 1.00000000000000e+00 4263 4263 1.00000000000000e+00 4264 4264 1.00000000000000e+00 4265 4265 1.00000000000000e+00 4266 4266 1.00000000000000e+00 4267 4267 1.00000000000000e+00 4268 4268 1.00000000000000e+00 4269 4269 1.00000000000000e+00 4270 4270 1.00000000000000e+00 4271 4271 1.00000000000000e+00 4272 4272 1.00000000000000e+00 4273 4273 1.00000000000000e+00 4274 4274 1.00000000000000e+00 4275 4275 1.00000000000000e+00 4276 4276 1.00000000000000e+00 4277 4277 1.00000000000000e+00 4278 4278 1.00000000000000e+00 4279 4279 1.00000000000000e+00 4280 4280 1.00000000000000e+00 4281 4281 1.00000000000000e+00 4282 4282 1.00000000000000e+00 4283 4283 1.00000000000000e+00 4284 4284 1.00000000000000e+00 4285 4285 1.00000000000000e+00 4286 4286 1.00000000000000e+00 4287 4287 1.00000000000000e+00 4288 4288 1.00000000000000e+00 4289 4289 1.00000000000000e+00 4290 4290 1.00000000000000e+00 4291 4291 1.00000000000000e+00 4292 4292 1.00000000000000e+00 4293 4293 1.00000000000000e+00 4294 4294 1.00000000000000e+00 4295 4295 1.00000000000000e+00 4296 4296 1.00000000000000e+00 4297 4297 1.00000000000000e+00 4298 4298 1.00000000000000e+00 4299 4299 1.00000000000000e+00 4300 4300 1.00000000000000e+00 4301 4301 1.00000000000000e+00 4302 4302 1.00000000000000e+00 4303 4303 1.00000000000000e+00 4304 4304 1.00000000000000e+00 4305 4305 1.00000000000000e+00 4306 4306 1.00000000000000e+00 4307 4307 1.00000000000000e+00 4308 4308 1.00000000000000e+00 4309 4309 1.00000000000000e+00 4310 4310 1.00000000000000e+00 4311 4311 1.00000000000000e+00 4312 4312 1.00000000000000e+00 4313 4313 1.00000000000000e+00 4314 4314 1.00000000000000e+00 4315 4315 1.00000000000000e+00 4316 4316 1.00000000000000e+00 4317 4317 1.00000000000000e+00 4318 4318 1.00000000000000e+00 4319 4319 1.00000000000000e+00 4320 4320 1.00000000000000e+00 4321 4321 1.00000000000000e+00 4322 4322 1.00000000000000e+00 4323 4323 1.00000000000000e+00 4324 4324 1.00000000000000e+00 4325 4325 1.00000000000000e+00 4326 4326 1.00000000000000e+00 4327 4327 1.00000000000000e+00 4328 4328 1.00000000000000e+00 4329 4329 1.00000000000000e+00 4330 4330 1.00000000000000e+00 4331 4331 1.00000000000000e+00 4332 4332 1.00000000000000e+00 4333 4333 1.00000000000000e+00 4334 4334 1.00000000000000e+00 4335 4335 1.00000000000000e+00 4336 4336 1.00000000000000e+00 4337 4337 1.00000000000000e+00 4338 4338 1.00000000000000e+00 4339 4339 1.00000000000000e+00 4340 4340 1.00000000000000e+00 4341 4341 1.00000000000000e+00 4342 4342 1.00000000000000e+00 4343 4343 1.00000000000000e+00 4344 4344 1.00000000000000e+00 4345 4345 1.00000000000000e+00 4346 4346 1.00000000000000e+00 4347 4347 1.00000000000000e+00 4348 4348 1.00000000000000e+00 4349 4349 1.00000000000000e+00 4350 4350 1.00000000000000e+00 4351 4351 1.00000000000000e+00 4352 4352 1.00000000000000e+00 4353 4353 1.00000000000000e+00 4354 4354 1.00000000000000e+00 4355 4355 1.00000000000000e+00 4356 4356 1.00000000000000e+00 4357 4357 1.00000000000000e+00 4358 4358 1.00000000000000e+00 4359 4359 1.00000000000000e+00 4360 4360 1.00000000000000e+00 4361 4361 1.00000000000000e+00 4362 4362 1.00000000000000e+00 4363 4363 1.00000000000000e+00 4364 4364 1.00000000000000e+00 4365 4365 1.00000000000000e+00 4366 4366 1.00000000000000e+00 4367 4367 1.00000000000000e+00 4368 4368 1.00000000000000e+00 4369 4369 1.00000000000000e+00 4370 4370 1.00000000000000e+00 4371 4371 1.00000000000000e+00 4372 4372 1.00000000000000e+00 4373 4373 1.00000000000000e+00 4374 4374 1.00000000000000e+00 4375 4375 1.00000000000000e+00 4376 4376 1.00000000000000e+00 4377 4377 1.00000000000000e+00 4378 4378 1.00000000000000e+00 4379 4379 1.00000000000000e+00 4380 4380 1.00000000000000e+00 4381 4381 1.00000000000000e+00 4382 4382 1.00000000000000e+00 4383 4383 1.00000000000000e+00 4384 4384 1.00000000000000e+00 4385 4385 1.00000000000000e+00 4386 4386 1.00000000000000e+00 4387 4387 1.00000000000000e+00 4388 4388 1.00000000000000e+00 4389 4389 1.21320765838513e+00 4389 3213 2.68083483975976e-05 4389 3237 4.99765527714196e-05 4389 3261 1.26524962030200e-08 4389 3789 1.54671107146394e-04 4389 3813 6.30109354465528e-02 4389 3837 2.29883960010645e-02 4389 3861 1.11277923894419e-05 4389 4413 1.31811892162328e+00 4389 4437 1.62292688555021e-01 4389 4461 3.80183219577206e-04 4389 4965 1.74906230975333e-04 4389 4989 7.68476838705000e-01 4389 5013 1.66127993386259e+00 4389 5037 6.68679335058792e-02 4389 5061 1.64562920078711e-04 4389 5565 6.84807729967536e-04 4389 5589 1.07199625704486e-01 4389 5613 9.52927344201592e-02 4389 5637 3.56458842680582e-03 4389 5661 4.13226415410000e-10 4389 6165 2.65320809328760e-07 4389 6189 2.15051154370615e-04 4389 6213 1.96678742491974e-04 4389 6237 4.55670212600412e-06 4389 16224 -1.60490305820052e-03 4389 16248 -8.11888108207356e-04 4389 16272 -2.69616545916967e-06 4389 16632 -1.32155033546539e-01 4389 16656 -7.27606402896119e-02 4389 16680 -1.90946386181216e-03 4389 17040 -8.37008468300366e-01 4389 17064 -4.56253711353295e-01 4389 17088 -1.07855649151747e-02 4389 17448 -1.47814744601899e+00 4389 17472 -7.91085148021584e-01 4389 17496 -1.48604071463105e-02 4389 17856 -4.22719899012738e-01 4389 17880 -2.25446163389847e-01 4389 17904 -4.02463253813648e-03 4389 18264 -2.25645047563798e-02 4389 18288 -1.20141728929724e-02 4389 18312 -2.09120147080729e-04 4390 4390 1.00000000000000e+00 4391 4391 1.00000000000000e+00 4392 4392 1.00000000000000e+00 4393 4393 1.00000000000000e+00 4394 4394 1.00000000000000e+00 4395 4395 1.00000000000000e+00 4396 4396 1.00000000000000e+00 4397 4397 1.00000000000000e+00 4398 4398 1.00000000000000e+00 4399 4399 1.00000000000000e+00 4400 4400 1.00000000000000e+00 4401 4401 1.00000000000000e+00 4402 4402 1.00000000000000e+00 4403 4403 1.00000000000000e+00 4404 4404 1.00000000000000e+00 4405 4405 1.00000000000000e+00 4406 4406 1.00000000000000e+00 4407 4407 1.00000000000000e+00 4408 4408 1.00000000000000e+00 4409 4409 1.00000000000000e+00 4410 4410 1.00000000000000e+00 4411 4411 1.00000000000000e+00 4412 4412 1.00000000000000e+00 4413 4413 2.32800694414842e+01 4413 3213 4.59222211420516e-02 4413 3237 1.56701631720264e-01 4413 3261 8.22857654823530e-03 4413 3285 5.17228162006518e-06 4413 3789 3.30908086177547e-03 4413 3813 6.11383506306117e+00 4413 3837 6.37363411517362e+00 4413 3861 1.11544915246482e-01 4413 3885 9.87647472616811e-05 4413 4389 1.31811892162328e+00 4413 4437 9.48469133812469e+00 4413 4461 2.56110343441899e-01 4413 4485 7.01342460993342e-04 4413 4965 1.81867178720740e-04 4413 4989 2.82246097617265e+00 4413 5013 1.00664315766850e+01 4413 5037 2.47430333521974e+00 4413 5061 1.14640260342688e-01 4413 5085 1.09163930156511e-04 4413 5565 7.12317907240384e-04 4413 5589 2.26802376575180e-01 4413 5613 3.91337936004920e-01 4413 5637 9.66358510578611e-02 4413 5661 6.61404141397720e-03 4413 6165 2.76965240371850e-07 4413 6189 2.50863875796689e-04 4413 6213 3.22067592846329e-04 4413 6237 2.22694656811325e-04 4413 6261 7.65518854573805e-06 4413 15816 -4.88682978709439e-02 4413 15840 -3.23742370319451e-02 4413 15864 -2.27056743930502e-03 4413 15888 -5.30610853420280e-07 4413 16224 -2.28074346771651e+00 4413 16248 -1.42156879861829e+00 4413 16272 -8.82386895391234e-02 4413 16296 -2.12602681745371e-03 4413 16632 -1.09254701506262e+01 4413 16656 -7.22856710572103e+00 4413 16680 -5.87225973957979e-01 4413 16704 -2.22660675726953e-02 4413 17040 -1.34003793834150e+01 4413 17064 -1.01403827040803e+01 4413 17088 -1.20726376709721e+00 4413 17112 -6.04023209590327e-02 4413 17448 -7.25120728299891e+00 4413 17472 -4.98769432682693e+00 4413 17496 -4.87838300554039e-01 4413 17520 -2.65648743547446e-02 4413 17856 -1.26735440242565e+00 4413 17880 -7.88820640174501e-01 4413 17904 -5.62077263860371e-02 4413 17928 -3.19873872226571e-03 4413 18264 -2.35820716352029e-02 4413 18288 -1.30329133732078e-02 4413 18312 -3.54822158744667e-04 4414 4414 1.00000000000000e+00 4415 4415 1.00000000000000e+00 4416 4416 1.00000000000000e+00 4417 4417 1.00000000000000e+00 4418 4418 1.00000000000000e+00 4419 4419 1.00000000000000e+00 4420 4420 1.00000000000000e+00 4421 4421 1.00000000000000e+00 4422 4422 1.00000000000000e+00 4423 4423 1.00000000000000e+00 4424 4424 1.00000000000000e+00 4425 4425 1.00000000000000e+00 4426 4426 1.00000000000000e+00 4427 4427 1.00000000000000e+00 4428 4428 1.00000000000000e+00 4429 4429 1.00000000000000e+00 4430 4430 1.00000000000000e+00 4431 4431 1.00000000000000e+00 4432 4432 1.00000000000000e+00 4433 4433 1.00000000000000e+00 4434 4434 1.00000000000000e+00 4435 4435 1.00000000000000e+00 4436 4436 1.00000000000000e+00 4437 4437 1.66107668831665e+01 4437 2637 7.09412875459543e-05 4437 2661 1.20547285967300e-04 4437 2685 1.85443126627615e-06 4437 3213 5.71113368287821e-02 4437 3237 3.98093749650465e-01 4437 3261 1.06494160843870e-01 4437 3285 3.82984705123397e-03 4437 3309 7.44503075326017e-06 4437 3333 1.61450000000000e-16 4437 3789 8.16320942124741e-04 4437 3813 4.37323350928698e+00 4437 3837 8.30042343340743e+00 4437 3861 2.30136421296784e+00 4437 3885 1.63787166671299e-01 4437 3909 2.12410211905635e-04 4437 3933 1.16118000000000e-15 4437 4389 1.62292688555021e-01 4437 4413 9.48469133812469e+00 4437 4461 6.43803972467895e+00 4437 4485 3.08047702966223e-01 4437 4509 6.38231870732978e-04 4437 4965 1.02677524531000e-09 4437 4989 1.54296983896809e-01 4437 5013 2.75103404825537e+00 4437 5037 6.38956406917378e+00 4437 5061 2.63300019074898e+00 4437 5085 1.12349617391641e-01 4437 5109 4.76842667935605e-05 4437 5565 4.08628167584000e-09 4437 5589 6.97895973065605e-03 4437 5613 9.18742608481252e-02 4437 5637 3.19722565471041e-01 4437 5661 1.33641182211232e-01 4437 5685 5.78011380667543e-03 4437 5709 1.51877667859400e-08 4437 6165 1.83791670000000e-12 4437 6189 8.30405258521000e-09 4437 6213 8.08979821477044e-05 4437 6237 6.78079290028163e-04 4437 6261 9.36342827745027e-05 4437 6285 5.17030619608310e-07 4437 6309 1.07492419000000e-12 4437 15408 -3.39183723660170e-04 4437 15432 -1.97299421219378e-03 4437 15456 -2.80648045101085e-03 4437 15480 -6.16935639697721e-04 4437 15504 -1.82286164144400e-08 4437 15816 -1.65636733875927e-01 4437 15840 -3.45089594634299e-01 4437 15864 -3.35634600221834e-01 4437 15888 -7.56563029286552e-02 4437 15912 -1.46560958747284e-03 4437 16224 -2.36081159036054e+00 4437 16248 -3.50368766140365e+00 4437 16272 -2.74934680092513e+00 4437 16296 -6.47334861429473e-01 4437 16320 -2.30088250458341e-02 4437 16344 -3.73102447881600e-08 4437 16632 -7.62575536054902e+00 4437 16656 -1.02980360621150e+01 4437 16680 -7.16654941689140e+00 4437 16704 -1.73717993124592e+00 4437 16728 -8.21777190579343e-02 4437 16752 -2.47764597396860e-07 4437 17040 -4.33414068707040e+00 4437 17064 -7.61855577416926e+00 4437 17088 -5.68289186565238e+00 4437 17112 -1.35589596977103e+00 4437 17136 -6.57338060232603e-02 4437 17160 -4.31404717765000e-07 4437 17448 -8.02167487971855e-01 4437 17472 -1.62540162070129e+00 4437 17496 -1.23817040319278e+00 4437 17520 -2.85679637321199e-01 4437 17544 -1.24654553297144e-02 4437 17568 -9.85236182442100e-08 4437 17856 -3.85260548717751e-02 4437 17880 -6.90657784007949e-02 4437 17904 -4.79131606910220e-02 4437 17928 -9.38575092160602e-03 4437 17952 -8.49783613857458e-05 4437 18264 -1.63349069221820e-07 4437 18288 -2.10202261173670e-07 4437 18312 -3.67222075893600e-08 4438 4438 1.00000000000000e+00 4439 4439 1.00000000000000e+00 4440 4440 1.00000000000000e+00 4441 4441 1.00000000000000e+00 4442 4442 1.00000000000000e+00 4443 4443 1.00000000000000e+00 4444 4444 1.00000000000000e+00 4445 4445 1.00000000000000e+00 4446 4446 1.00000000000000e+00 4447 4447 1.00000000000000e+00 4448 4448 1.00000000000000e+00 4449 4449 1.00000000000000e+00 4450 4450 1.00000000000000e+00 4451 4451 1.00000000000000e+00 4452 4452 1.00000000000000e+00 4453 4453 1.00000000000000e+00 4454 4454 1.00000000000000e+00 4455 4455 1.00000000000000e+00 4456 4456 1.00000000000000e+00 4457 4457 1.00000000000000e+00 4458 4458 1.00000000000000e+00 4459 4459 1.00000000000000e+00 4460 4460 1.00000000000000e+00 4461 4461 1.66152374232947e+01 4461 2637 2.54420757694263e-04 4461 2661 5.98389187080576e-04 4461 2685 3.87416569810659e-05 4461 2709 2.08930460891820e-07 4461 2733 3.55340800000000e-14 4461 3213 2.48600030779947e-03 4461 3237 1.02944973256480e-01 4461 3261 3.44526895845680e-01 4461 3285 1.58330381854041e-01 4461 3309 7.20183881084101e-03 4461 3333 1.65821052232080e-07 4461 3357 6.35000000000000e-18 4461 3789 8.78103357304610e-07 4461 3813 9.56967206476581e-02 4461 3837 2.28682142390906e+00 4461 3861 7.22470846299925e+00 4461 3885 2.77588105773609e+00 4461 3909 1.38803384818389e-01 4461 3933 2.62041531254356e-04 4461 3957 1.01200000000000e-17 4461 4389 3.80183219577206e-04 4461 4413 2.56110343441899e-01 4461 4437 6.43803972467895e+00 4461 4485 6.32140157665027e+00 4461 4509 2.91682199132937e-01 4461 4533 4.67153324025478e-04 4461 4989 3.05165715246753e-04 4461 5013 1.30468906119894e-01 4461 5037 2.61139860278923e+00 4461 5061 6.01317879021487e+00 4461 5085 2.31426725984317e+00 4461 5109 1.13542902326334e-01 4461 5133 1.87607910286077e-05 4461 5589 1.31669194616127e-06 4461 5613 4.00256385214300e-03 4461 5637 1.29959229577417e-01 4461 5661 3.01419830152279e-01 4461 5685 1.03986644421699e-01 4461 5709 4.70380571098778e-03 4461 5733 7.22147823010720e-07 4461 6213 2.47633161065664e-06 4461 6237 4.54682972154229e-05 4461 6261 2.76673039955496e-04 4461 6285 3.16588033027809e-04 4461 6309 3.90695406012370e-07 4461 15024 -3.45535269833850e-07 4461 15048 -3.90079655830210e-06 4461 15072 -1.04201598584569e-05 4461 15096 -2.51866616999200e-06 4461 15120 -2.67275633000000e-12 4461 15408 -1.21583139608406e-03 4461 15432 -3.39913024247126e-02 4461 15456 -1.44954846645986e-01 4461 15480 -1.38745469119399e-01 4461 15504 -3.00750972078252e-02 4461 15528 -7.12208246196801e-04 4461 15816 -3.17314047065666e-02 4461 15840 -5.66300017826269e-01 4461 15864 -2.15460430129381e+00 4461 15888 -1.87921702765295e+00 4461 15912 -4.41673679756449e-01 4461 15936 -2.20016673822274e-02 4461 15960 -3.98147192210440e-07 4461 16224 -1.43634132019865e-01 4461 16248 -2.25180646794102e+00 4461 16272 -8.19445174042288e+00 4461 16296 -6.94499300146922e+00 4461 16320 -1.71506375002887e+00 4461 16344 -1.07211408631076e-01 4461 16368 -1.33092751663790e-05 4461 16632 -1.70767136446978e-01 4461 16656 -2.49991636289071e+00 4461 16680 -8.89099175463522e+00 4461 16704 -7.59830514439927e+00 4461 16728 -1.97095422806589e+00 4461 16752 -1.41157639159402e-01 4461 16776 -4.77885378091524e-05 4461 17040 -5.14093378669864e-02 4461 17064 -8.31720144615531e-01 4461 17088 -3.01355636355886e+00 4461 17112 -2.46519311509011e+00 4461 17136 -6.07890324229406e-01 4461 17160 -3.97012792058160e-02 4461 17184 -1.38112665047085e-05 4461 17448 -4.12660314887432e-03 4461 17472 -8.48036522135806e-02 4461 17496 -3.19772793067185e-01 4461 17520 -2.40577424961979e-01 4461 17544 -5.22627933309471e-02 4461 17568 -2.45335414009289e-03 4461 17592 -5.23645026792810e-07 4461 17856 -2.87059089138043e-06 4461 17880 -2.63403151354003e-04 4461 17904 -1.04490660266624e-03 4461 17928 -3.89332230272224e-04 4461 17952 -3.43528606209355e-05 4462 4462 1.00000000000000e+00 4463 4463 1.00000000000000e+00 4464 4464 1.00000000000000e+00 4465 4465 1.00000000000000e+00 4466 4466 1.00000000000000e+00 4467 4467 1.00000000000000e+00 4468 4468 1.00000000000000e+00 4469 4469 1.00000000000000e+00 4470 4470 1.00000000000000e+00 4471 4471 1.00000000000000e+00 4472 4472 1.00000000000000e+00 4473 4473 1.00000000000000e+00 4474 4474 1.00000000000000e+00 4475 4475 1.00000000000000e+00 4476 4476 1.00000000000000e+00 4477 4477 1.00000000000000e+00 4478 4478 1.00000000000000e+00 4479 4479 1.00000000000000e+00 4480 4480 1.00000000000000e+00 4481 4481 1.00000000000000e+00 4482 4482 1.00000000000000e+00 4483 4483 1.00000000000000e+00 4484 4484 1.00000000000000e+00 4485 4485 1.58390083592943e+01 4485 2637 1.16629760528201e-06 4485 2661 1.08990327590319e-04 4485 2685 3.90821018534074e-04 4485 2709 1.60494948635366e-04 4485 2733 7.31269937100000e-11 4485 3213 4.13083515611080e-07 4485 3237 5.91766666038560e-03 4485 3261 1.65476629083131e-01 4485 3285 3.90074702897613e-01 4485 3309 9.51566419059972e-02 4485 3333 4.58947816494336e-03 4485 3357 3.07268247464825e-06 4485 3813 1.81715951490776e-05 4485 3837 1.59134713973787e-01 4485 3861 2.77392916116127e+00 4485 3885 6.72471884021619e+00 4485 3909 2.69560330541532e+00 4485 3933 1.20597050544890e-01 4485 3957 2.14991453078892e-04 4485 4413 7.01342460993342e-04 4485 4437 3.08047702966223e-01 4485 4461 6.32140157665027e+00 4485 4509 6.07253200657606e+00 4485 4533 3.24085759625726e-01 4485 4557 3.89714704487467e-04 4485 4581 3.80000000000000e-19 4485 5013 2.20082275981327e-04 4485 5037 1.22356735855194e-01 4485 5061 2.32069493927853e+00 4485 5085 5.58574866139339e+00 4485 5109 2.27567422516411e+00 4485 5133 1.29265031934992e-01 4485 5157 3.45354354387674e-05 4485 5613 2.79430157966997e-06 4485 5637 4.93536473027629e-03 4485 5661 8.99707006266845e-02 4485 5685 2.94052596094355e-01 4485 5709 1.13586382165692e-01 4485 5733 3.00569983360125e-03 4485 5757 2.19066051226412e-06 4485 6237 2.14304096016500e-08 4485 6261 1.76641060064218e-04 4485 6285 2.80445054406418e-04 4485 6309 8.43467389934002e-05 4485 6333 5.31858846635916e-06 4485 15024 -4.61831190340904e-06 4485 15048 -2.16046850008645e-03 4485 15072 -1.29413237855623e-02 4485 15096 -1.97720813716512e-02 4485 15120 -4.98947752019860e-03 4485 15144 -1.55188264107734e-04 4485 15408 -4.99658735013190e-06 4485 15432 -1.65362016833932e-02 4485 15456 -2.34219438433393e-01 4485 15480 -8.76028072878760e-01 4485 15504 -9.36190402441567e-01 4485 15528 -2.68460388411363e-01 4485 15552 -2.03872129237745e-02 4485 15576 -1.33252547496470e-07 4485 15816 -2.42166638779722e-05 4485 15840 -1.10018885673366e-01 4485 15864 -1.43097519682743e+00 4485 15888 -5.11917555376152e+00 4485 15912 -5.30453705292561e+00 4485 15936 -1.59016329279602e+00 4485 15960 -1.36848367689043e-01 4485 15984 -9.54730890178446e-05 4485 16224 -2.19178452599104e-05 4485 16248 -2.00180555053652e-01 4485 16272 -2.47405737344552e+00 4485 16296 -8.63045626787820e+00 4485 16320 -8.88021871768787e+00 4485 16344 -2.79102250318825e+00 4485 16368 -2.65399292796339e-01 4485 16392 -4.18824570894584e-04 4485 16632 -4.23031447744463e-06 4485 16656 -7.55358123396616e-02 4485 16680 -1.09956716241353e+00 4485 16704 -4.10122884318575e+00 4485 16728 -4.25765599427586e+00 4485 16752 -1.30451795486918e+00 4485 16776 -1.18129358804485e-01 4485 16800 -2.50664090970469e-04 4485 17064 -8.02865271786982e-03 4485 17088 -1.55321867795441e-01 4485 17112 -6.26267686291771e-01 4485 17136 -6.39847535218463e-01 4485 17160 -1.85449956010224e-01 4485 17184 -1.51559787944261e-02 4485 17208 -3.89310030356526e-05 4485 17472 -3.48101433441661e-05 4485 17496 -3.21498529089219e-03 4485 17520 -1.42016680674157e-02 4485 17544 -1.05393873554719e-02 4485 17568 -1.89638474168424e-03 4485 17592 -8.12642191870758e-06 4486 4486 1.00000000000000e+00 4487 4487 1.00000000000000e+00 4488 4488 1.00000000000000e+00 4489 4489 1.00000000000000e+00 4490 4490 1.00000000000000e+00 4491 4491 1.00000000000000e+00 4492 4492 1.00000000000000e+00 4493 4493 1.00000000000000e+00 4494 4494 1.00000000000000e+00 4495 4495 1.00000000000000e+00 4496 4496 1.00000000000000e+00 4497 4497 1.00000000000000e+00 4498 4498 1.00000000000000e+00 4499 4499 1.00000000000000e+00 4500 4500 1.00000000000000e+00 4501 4501 1.00000000000000e+00 4502 4502 1.00000000000000e+00 4503 4503 1.00000000000000e+00 4504 4504 1.00000000000000e+00 4505 4505 1.00000000000000e+00 4506 4506 1.00000000000000e+00 4507 4507 1.00000000000000e+00 4508 4508 1.00000000000000e+00 4509 4509 1.66019127419810e+01 4509 2637 8.34516350000000e-13 4509 2661 1.13169651915075e-06 4509 2685 2.98307779105627e-04 4509 2709 1.51134942095430e-04 4509 2733 9.32791876860000e-10 4509 3237 1.80315251593800e-08 4509 3261 7.60696239971773e-03 4509 3285 1.10751375218815e-01 4509 3309 2.61946729281432e-01 4509 3333 8.90814666278429e-02 4509 3357 1.60503283768704e-03 4509 3837 7.38617469010381e-05 4509 3861 1.29158141991549e-01 4509 3885 2.67314736954823e+00 4509 3909 6.03243372310633e+00 4509 3933 2.14495058601446e+00 4509 3957 1.01082040273076e-01 4509 3981 2.27061860767542e-04 4509 4005 4.86770000000000e-16 4509 4437 6.38231870732978e-04 4509 4461 2.91682199132937e-01 4509 4485 6.07253200657607e+00 4509 4533 6.56258203238964e+00 4509 4557 3.38445502301242e-01 4509 4581 2.83309791446212e-04 4509 4605 1.43269000000000e-15 4509 5037 9.68204573979320e-05 4509 5061 1.17330424634126e-01 4509 5085 2.28425795486040e+00 4509 5109 6.05533313607160e+00 4509 5133 2.44145806955096e+00 4509 5157 1.33750852826006e-01 4509 5181 1.16427669681292e-04 4509 5637 4.10056075839950e-07 4509 5661 5.39569286250705e-03 4509 5685 1.04894232584914e-01 4509 5709 2.61254999604077e-01 4509 5733 1.24287728839431e-01 4509 5757 2.88298668641234e-03 4509 5781 1.67959048382325e-06 4509 6237 1.11133603000000e-12 4509 6261 2.29509986312700e-08 4509 6285 3.99813715338224e-05 4509 6309 5.34088471120003e-04 4509 6333 1.78814708764559e-04 4509 6357 4.70536121254552e-06 4509 6933 5.46280000000000e-16 4509 6957 8.29700000000000e-17 4509 15024 -7.90465775745000e-09 4509 15048 -1.73196606922709e-03 4509 15072 -4.16778281377553e-02 4509 15096 -1.98215657855372e-01 4509 15120 -2.75221263027286e-01 4509 15144 -9.96338200064898e-02 4509 15168 -1.05376172650655e-02 4509 15192 -2.84904636177000e-09 4509 15432 -1.26266347100430e-07 4509 15456 -3.12514410067268e-02 4509 15480 -5.39531734989152e-01 4509 15504 -2.34143120142432e+00 4509 15528 -3.15212942479744e+00 4509 15552 -1.16968533203041e+00 4509 15576 -1.30571047099530e-01 4509 15600 -3.11177468058395e-04 4509 15840 -3.86495522040020e-07 4509 15864 -1.08175470687364e-01 4509 15888 -1.74396899578495e+00 4509 15912 -7.42284113932549e+00 4509 15936 -1.00058294587787e+01 4509 15960 -3.73623591502840e+00 4509 15984 -4.22827509282693e-01 4509 16008 -1.64331298995035e-03 4509 16248 -9.46477160706400e-08 4509 16272 -6.10196194821578e-02 4509 16296 -1.19479722097738e+00 4509 16320 -5.34832249232646e+00 4509 16344 -7.17876805185175e+00 4509 16368 -2.64775831761198e+00 4509 16392 -2.97980555261445e-01 4509 16416 -1.90576692073232e-03 4509 16680 -9.54620552641469e-03 4509 16704 -2.51340603069218e-01 4509 16728 -1.18550249725813e+00 4509 16752 -1.56150964536207e+00 4509 16776 -5.43816655026182e-01 4509 16800 -5.66160552656316e-02 4509 16824 -3.98715594254582e-04 4509 17088 -9.92519568879602e-05 4509 17112 -1.23920601170130e-02 4509 17136 -6.46783074102988e-02 4509 17160 -7.96429948358936e-02 4509 17184 -2.16090931874468e-02 4509 17208 -1.25262710500987e-03 4509 17232 -1.74352105968200e-08 4509 17520 -1.61126130499370e-07 4509 17544 -7.02160393795410e-07 4509 17568 -3.91749617691140e-07 4509 17592 -5.76558717979400e-08 4510 4510 1.00000000000000e+00 4511 4511 1.00000000000000e+00 4512 4512 1.00000000000000e+00 4513 4513 1.00000000000000e+00 4514 4514 1.00000000000000e+00 4515 4515 1.00000000000000e+00 4516 4516 1.00000000000000e+00 4517 4517 1.00000000000000e+00 4518 4518 1.00000000000000e+00 4519 4519 1.00000000000000e+00 4520 4520 1.00000000000000e+00 4521 4521 1.00000000000000e+00 4522 4522 1.00000000000000e+00 4523 4523 1.00000000000000e+00 4524 4524 1.00000000000000e+00 4525 4525 1.00000000000000e+00 4526 4526 1.00000000000000e+00 4527 4527 1.00000000000000e+00 4528 4528 1.00000000000000e+00 4529 4529 1.00000000000000e+00 4530 4530 1.00000000000000e+00 4531 4531 1.00000000000000e+00 4532 4532 1.00000000000000e+00 4533 4533 1.64581799012988e+01 4533 2685 1.76345157057950e-06 4533 2709 9.01164771458639e-06 4533 2733 8.85453302770000e-10 4533 3285 5.34094459172507e-03 4533 3309 1.18442951526062e-01 4533 3333 2.74020269122421e-01 4533 3357 3.21160075323181e-02 4533 3861 1.40199035422927e-04 4533 3885 1.03910226659845e-01 4533 3909 2.20243939165178e+00 4533 3933 6.20292311079304e+00 4533 3957 3.20527510274181e+00 4533 3981 1.26642207232517e-01 4533 4005 1.24828921303146e-06 4533 4461 4.67153324025478e-04 4533 4485 3.24085759625726e-01 4533 4509 6.56258203238964e+00 4533 4557 5.95013494598460e+00 4533 4581 3.65589698849338e-01 4533 4605 1.57546452617901e-04 4533 5061 8.91005421407040e-05 4533 5085 1.32107227727700e-01 4533 5109 2.43971202276566e+00 4533 5133 6.54732452314663e+00 4533 5157 2.52076813096792e+00 4533 5181 9.38903743213116e-02 4533 5205 1.17729495477174e-04 4533 5661 6.72456755290744e-06 4533 5685 2.66749886865829e-03 4533 5709 1.19507368978337e-01 4533 5733 2.93701725343253e-01 4533 5757 1.20361755725486e-01 4533 5781 4.36077583164111e-03 4533 5805 5.57780449472120e-07 4533 6285 1.93816942058847e-06 4533 6309 6.51738304218107e-05 4533 6333 2.93336389137458e-04 4533 6357 2.41938520180969e-04 4533 6381 7.38583222521854e-06 4533 6933 8.37030000000000e-16 4533 6957 1.27120000000000e-16 4533 15072 -6.82991249166330e-03 4533 15096 -2.12057904827481e-01 4533 15120 -1.33921351264528e+00 4533 15144 -2.69515405120276e+00 4533 15168 -1.14051294456304e+00 4533 15192 -1.37927352900205e-01 4533 15216 -3.08469849872086e-04 4533 15480 -3.21841845409029e-02 4533 15504 -8.00085278224091e-01 4533 15528 -4.42373616499343e+00 4533 15552 -7.85669670876051e+00 4533 15576 -3.15244129814918e+00 4533 15600 -3.74380593890012e-01 4533 15624 -3.41592650809739e-03 4533 15888 -3.98639657652776e-02 4533 15912 -1.20828029646931e+00 4533 15936 -6.39325921400920e+00 4533 15960 -1.02216097184026e+01 4533 15984 -4.32881999660594e+00 4533 16008 -5.76961529729774e-01 4533 16032 -9.14157579495089e-03 4533 16296 -9.44696404610494e-03 4533 16320 -3.96364039902606e-01 4533 16344 -2.16294920165829e+00 4533 16368 -3.40775270230956e+00 4533 16392 -1.41134525042510e+00 4533 16416 -1.82793376238339e-01 4533 16440 -2.60171715117958e-03 4533 16704 -2.48574860122963e-04 4533 16728 -3.39204386699666e-02 4533 16752 -1.98701968048536e-01 4533 16776 -3.13158933648111e-01 4533 16800 -1.19803551127479e-01 4533 16824 -1.36571193791511e-02 4533 16848 -1.04917510642634e-04 4533 17136 -1.51013638628263e-04 4533 17160 -7.78915299212616e-04 4533 17184 -8.50483332369722e-04 4533 17208 -1.74967604472396e-04 4533 17232 -2.67149432083500e-08 4534 4534 1.00000000000000e+00 4535 4535 1.00000000000000e+00 4536 4536 1.00000000000000e+00 4537 4537 1.00000000000000e+00 4538 4538 1.00000000000000e+00 4539 4539 1.00000000000000e+00 4540 4540 1.00000000000000e+00 4541 4541 1.00000000000000e+00 4542 4542 1.00000000000000e+00 4543 4543 1.00000000000000e+00 4544 4544 1.00000000000000e+00 4545 4545 1.00000000000000e+00 4546 4546 1.00000000000000e+00 4547 4547 1.00000000000000e+00 4548 4548 1.00000000000000e+00 4549 4549 1.00000000000000e+00 4550 4550 1.00000000000000e+00 4551 4551 1.00000000000000e+00 4552 4552 1.00000000000000e+00 4553 4553 1.00000000000000e+00 4554 4554 1.00000000000000e+00 4555 4555 1.00000000000000e+00 4556 4556 1.00000000000000e+00 4557 4557 2.08251633581960e+01 4557 3285 1.50853894583000e-09 4557 3309 8.70653938089605e-03 4557 3333 1.27588687451478e-01 4557 3357 4.60996910959769e-02 4557 3885 1.14998784692893e-04 4557 3909 1.01036021558391e-01 4557 3933 4.15240925190621e+00 4557 3957 1.20747408504984e+01 4557 3981 2.93990643686120e+00 4557 4005 9.08688838913287e-03 4557 4485 3.89714704487467e-04 4557 4509 3.38445502301242e-01 4557 4533 5.95013494598460e+00 4557 4581 9.74156077354730e+00 4557 4605 3.62451739099553e-01 4557 4629 2.15051154370617e-04 4557 5085 1.44147466930786e-04 4557 5109 1.41882974823337e-01 4557 5133 2.54478197047026e+00 4557 5157 5.48682765881343e+00 4557 5181 2.30610993286478e+00 4557 5205 1.22248691713119e-01 4557 5229 2.50863875796691e-04 4557 5685 1.29078208718040e-05 4557 5709 4.30756462080179e-03 4557 5733 1.03318965213879e-01 4557 5757 3.57259474892100e-01 4557 5781 1.41675838469124e-01 4557 5805 4.47462327059547e-03 4557 5829 8.30405258521000e-09 4557 6309 7.04711743687000e-09 4557 6333 1.28308173330619e-04 4557 6357 3.16858225254116e-04 4557 6381 1.65828879302896e-04 4557 6405 1.56403018457287e-05 4557 15096 -2.06081244686773e-02 4557 15120 -9.31015863958383e-01 4557 15144 -6.32062101669729e+00 4557 15168 -1.30472690748129e+01 4557 15192 -5.21913909453381e+00 4557 15216 -6.14318709256894e-01 4557 15240 -9.58767802584515e-03 4557 15504 -2.25678303861427e-02 4557 15528 -1.14792032596769e+00 4557 15552 -6.90326339321347e+00 4557 15576 -1.24786044584956e+01 4557 15600 -5.95229647679307e+00 4557 15624 -9.00428623635621e-01 4557 15648 -1.99678375256178e-02 4557 15912 -5.20445063742404e-03 4557 15936 -4.57856882564987e-01 4557 15960 -2.77314972883564e+00 4557 15984 -4.91357092063532e+00 4557 16008 -2.61950144724899e+00 4557 16032 -4.38209835369890e-01 4557 16056 -1.02084568245078e-02 4557 16320 -4.57831467629243e-04 4557 16344 -7.60852993516091e-02 4557 16368 -4.95781694150880e-01 4557 16392 -9.34677063180291e-01 4557 16416 -4.68654027442267e-01 4557 16440 -7.35160147784661e-02 4557 16464 -1.58120002869862e-03 4557 16752 -1.42313807385484e-03 4557 16776 -9.94001768869187e-03 4557 16800 -1.87272890764834e-02 4557 16824 -5.50462311142662e-03 4557 16848 -3.14289429538529e-04 4558 4558 1.00000000000000e+00 4559 4559 1.00000000000000e+00 4560 4560 1.00000000000000e+00 4561 4561 1.00000000000000e+00 4562 4562 1.00000000000000e+00 4563 4563 1.00000000000000e+00 4564 4564 1.00000000000000e+00 4565 4565 1.00000000000000e+00 4566 4566 1.00000000000000e+00 4567 4567 1.00000000000000e+00 4568 4568 1.00000000000000e+00 4569 4569 1.00000000000000e+00 4570 4570 1.00000000000000e+00 4571 4571 1.00000000000000e+00 4572 4572 1.00000000000000e+00 4573 4573 1.00000000000000e+00 4574 4574 1.00000000000000e+00 4575 4575 1.00000000000000e+00 4576 4576 1.00000000000000e+00 4577 4577 1.00000000000000e+00 4578 4578 1.00000000000000e+00 4579 4579 1.00000000000000e+00 4580 4580 1.00000000000000e+00 4581 4581 2.50014043927918e+01 4581 3309 1.18392864123259e-06 4581 3333 2.12411346181340e-03 4581 3357 9.81314367921115e-04 4581 3909 2.02409678011769e-04 4581 3933 2.69689879613936e-01 4581 3957 4.59301705652272e+00 4581 3981 3.00812933496055e+00 4581 4005 5.92060211873687e-02 4581 4485 3.80000000000000e-19 4581 4509 2.83309791446212e-04 4581 4533 3.65589698849338e-01 4581 4557 9.74156077354730e+00 4581 4605 8.41036131317713e+00 4581 4629 1.07199625704489e-01 4581 4653 5.88890614340000e-09 4581 5085 4.40000000000000e-19 4581 5109 2.51116470786623e-04 4581 5133 1.05567678610664e-01 4581 5157 2.18313486092396e+00 4581 5181 7.59651806450870e+00 4581 5205 5.59124452074491e+00 4581 5229 2.26802376575185e-01 4581 5253 4.05234314351900e-08 4581 5709 1.01551698587120e-06 4581 5733 6.21683783583442e-03 4581 5757 1.34764034047412e-01 4581 5781 2.76348776783462e-01 4581 5805 1.05217503878585e-01 4581 5829 6.97895973065629e-03 4581 6309 5.21894530000000e-13 4581 6333 8.53127317558100e-08 4581 6357 4.63231239090605e-05 4581 6381 7.57288505340502e-04 4581 6405 1.35092304002422e-04 4581 6429 1.31669194616131e-06 4581 15120 -1.60538004493400e-02 4581 15144 -1.42258422170924e+00 4581 15168 -7.85719513899029e+00 4581 15192 -1.31480554177428e+01 4581 15216 -1.11286651487524e+01 4581 15240 -2.49861912557892e+00 4581 15264 -8.48984408304521e-02 4581 15528 -9.46517302950758e-03 4581 15552 -9.00313035298760e-01 4581 15576 -5.50103384768730e+00 4581 15600 -1.05430018435054e+01 4581 15624 -8.15239410774465e+00 4581 15648 -1.73985483446228e+00 4581 15672 -5.65856354692914e-02 4581 15936 -4.10935087373676e-04 4581 15960 -7.39964518854133e-02 4581 15984 -6.38758052884543e-01 4581 16008 -1.62177710123623e+00 4581 16032 -9.67865603429280e-01 4581 16056 -1.70527780808149e-01 4581 16080 -4.21211943045404e-03 4581 16344 -7.46393400000000e-14 4581 16368 -5.38291298606254e-03 4581 16392 -5.10221569510306e-02 4581 16416 -1.31335544505488e-01 4581 16440 -6.14995665721276e-02 4581 16464 -8.17707393505412e-03 4581 16488 -4.66156117325986e-05 4581 16776 -2.31168330062660e-07 4581 16800 -1.46666927100903e-06 4581 16824 -2.39915213309629e-06 4581 16848 -5.41995950758410e-07 4582 4582 1.00000000000000e+00 4583 4583 1.00000000000000e+00 4584 4584 1.00000000000000e+00 4585 4585 1.00000000000000e+00 4586 4586 1.00000000000000e+00 4587 4587 1.00000000000000e+00 4588 4588 1.00000000000000e+00 4589 4589 1.00000000000000e+00 4590 4590 1.00000000000000e+00 4591 4591 1.00000000000000e+00 4592 4592 1.00000000000000e+00 4593 4593 1.00000000000000e+00 4594 4594 1.00000000000000e+00 4595 4595 1.00000000000000e+00 4596 4596 1.00000000000000e+00 4597 4597 1.00000000000000e+00 4598 4598 1.00000000000000e+00 4599 4599 1.00000000000000e+00 4600 4600 1.00000000000000e+00 4601 4601 1.00000000000000e+00 4602 4602 1.00000000000000e+00 4603 4603 1.00000000000000e+00 4604 4604 1.00000000000000e+00 4605 4605 1.12846611172946e+01 4605 3333 1.51028246000000e-11 4605 3357 4.36402672700000e-11 4605 3933 1.26615946688093e-06 4605 3957 6.52643325329211e-02 4605 3981 2.51332964486057e-01 4605 4005 2.27218828907762e-02 4605 4509 1.43269000000000e-15 4605 4533 1.57546452617901e-04 4605 4557 3.62451739099553e-01 4605 4581 8.41036131317713e+00 4605 4629 7.68476838705022e-01 4605 4653 7.80904127106655e-05 4605 5109 5.38430000000000e-16 4605 5133 2.11681717864975e-04 4605 5157 1.07149062964959e-01 4605 5181 3.98787308235862e+00 4605 5205 1.08522054118621e+01 4605 5229 2.82246097617273e+00 4605 5253 3.01114647711887e-02 4605 5277 5.75738267860000e-09 4605 5733 8.25552108883434e-06 4605 5757 2.91387883519292e-03 4605 5781 9.43923886567084e-02 4605 5805 2.68021749546518e-01 4605 5829 1.54296983896814e-01 4605 5853 9.74515294596671e-03 4605 5877 1.07430315361200e-08 4605 6357 2.76280475736875e-06 4605 6381 6.65602558937131e-05 4605 6405 1.93413419972703e-04 4605 6429 3.05165715246779e-04 4605 6453 1.43358216180987e-06 4605 6477 2.76977475000000e-12 4605 15144 -8.52313646765143e-06 4605 15168 -2.41641731088433e-01 4605 15192 -3.34611990479090e+00 4605 15216 -1.10499459964701e+01 4605 15240 -7.60221651864066e+00 4605 15264 -1.54591739054225e+00 4605 15288 -6.40768823076013e-02 4605 15312 -3.45778598212080e-07 4605 15552 -4.28709318978558e-06 4605 15576 -1.51606456257916e-01 4605 15600 -2.02506210321666e+00 4605 15624 -6.55683928723499e+00 4605 15648 -4.37787045752163e+00 4605 15672 -8.79965056906127e-01 4605 15696 -3.73800305753875e-02 4605 15720 -1.80427590875910e-07 4605 15960 -7.29284455996000e-09 4605 15984 -8.98842633280559e-03 4605 16008 -1.03095708974912e-01 4605 16032 -3.02145747279514e-01 4605 16056 -1.67023864717950e-01 4605 16080 -3.06935392903597e-02 4605 16104 -1.52616840616767e-03 4605 16128 -2.15379764853000e-09 4605 16392 -5.18385731630734e-05 4605 16416 -6.79448506998607e-04 4605 16440 -1.97260203679892e-03 4605 16464 -6.01640639348701e-04 4605 16488 -3.23866062505968e-05 4606 4606 1.00000000000000e+00 4607 4607 1.00000000000000e+00 4608 4608 1.00000000000000e+00 4609 4609 1.00000000000000e+00 4610 4610 1.00000000000000e+00 4611 4611 1.00000000000000e+00 4612 4612 1.00000000000000e+00 4613 4613 1.00000000000000e+00 4614 4614 1.00000000000000e+00 4615 4615 1.00000000000000e+00 4616 4616 1.00000000000000e+00 4617 4617 1.00000000000000e+00 4618 4618 1.00000000000000e+00 4619 4619 1.00000000000000e+00 4620 4620 1.00000000000000e+00 4621 4621 1.00000000000000e+00 4622 4622 1.00000000000000e+00 4623 4623 1.00000000000000e+00 4624 4624 1.00000000000000e+00 4625 4625 1.00000000000000e+00 4626 4626 1.00000000000000e+00 4627 4627 1.00000000000000e+00 4628 4628 1.00000000000000e+00 4629 4629 1.21320765838513e+00 4629 3957 2.65320809328760e-07 4629 3981 6.84807729967547e-04 4629 4005 1.74906230975336e-04 4629 4557 2.15051154370617e-04 4629 4581 1.07199625704489e-01 4629 4605 7.68476838705022e-01 4629 4653 1.54671107146397e-04 4629 5157 1.96678742491973e-04 4629 5181 9.52927344201617e-02 4629 5205 1.66127993386264e+00 4629 5229 1.31811892162331e+00 4629 5253 6.30109354465539e-02 4629 5277 2.68083483975976e-05 4629 5757 4.55670212600404e-06 4629 5781 3.56458842680596e-03 4629 5805 6.68679335058819e-02 4629 5829 1.62292688555026e-01 4629 5853 2.29883960010649e-02 4629 5877 4.99765527714198e-05 4629 6381 4.13226415410000e-10 4629 6405 1.64562920078725e-04 4629 6429 3.80183219577239e-04 4629 6453 1.11277923894421e-05 4629 6477 1.26524962030200e-08 4629 15192 -2.25645047563801e-02 4629 15216 -4.22719899012749e-01 4629 15240 -1.47814744601903e+00 4629 15264 -8.37008468300385e-01 4629 15288 -1.32155033546541e-01 4629 15312 -1.60490305820053e-03 4629 15600 -1.20141728929726e-02 4629 15624 -2.25446163389853e-01 4629 15648 -7.91085148021607e-01 4629 15672 -4.56253711353308e-01 4629 15696 -7.27606402896137e-02 4629 15720 -8.11888108207359e-04 4629 16008 -2.09120147080725e-04 4629 16032 -4.02463253813659e-03 4629 16056 -1.48604071463111e-02 4629 16080 -1.07855649151755e-02 4629 16104 -1.90946386181233e-03 4629 16128 -2.69616545916973e-06 4630 4630 1.00000000000000e+00 4631 4631 1.00000000000000e+00 4632 4632 1.00000000000000e+00 4633 4633 1.00000000000000e+00 4634 4634 1.00000000000000e+00 4635 4635 1.00000000000000e+00 4636 4636 1.00000000000000e+00 4637 4637 1.00000000000000e+00 4638 4638 1.00000000000000e+00 4639 4639 1.00000000000000e+00 4640 4640 1.00000000000000e+00 4641 4641 1.00000000000000e+00 4642 4642 1.00000000000000e+00 4643 4643 1.00000000000000e+00 4644 4644 1.00000000000000e+00 4645 4645 1.00000000000000e+00 4646 4646 1.00000000000000e+00 4647 4647 1.00000000000000e+00 4648 4648 1.00000000000000e+00 4649 4649 1.00000000000000e+00 4650 4650 1.00000000000000e+00 4651 4651 1.00000000000000e+00 4652 4652 1.00000000000000e+00 4653 4653 1.00000068632295e+00 4653 4581 5.88890614340000e-09 4653 4605 7.80904127106655e-05 4653 4629 1.54671107146397e-04 4653 5157 3.96000000000000e-17 4653 5181 3.75230044358600e-08 4653 5205 7.01132519780422e-04 4653 5229 3.30908086177553e-03 4653 5253 6.42960599027278e-04 4653 5277 2.80088098136378e-06 4653 5757 2.69600000000000e-17 4653 5781 5.61618000186900e-08 4653 5805 8.29054817407610e-05 4653 5829 8.16320942124753e-04 4653 5853 5.01825510064348e-04 4653 5877 5.22093285751313e-06 4653 6381 1.65361740000000e-13 4653 6405 1.62635643746720e-07 4653 6429 8.78103357304650e-07 4653 6453 8.97612361523940e-07 4653 6477 1.31921271842000e-09 4653 15216 -4.50372466621900e-08 4653 15240 -5.26432474004669e-04 4653 15264 -2.27267444385338e-03 4653 15288 -1.19673275115656e-03 4653 15312 -1.67620106534635e-04 4653 15624 -2.25852715468000e-08 4653 15648 -2.69315925168941e-04 4653 15672 -1.16143813803572e-03 4653 15696 -6.07278449815373e-04 4653 15720 -8.45132164331549e-05 4653 16032 -1.90423473400000e-11 4653 16056 -1.74276804760186e-06 4653 16080 -7.17169031686507e-06 4653 16104 -2.54630692488370e-06 4653 16128 -2.00903761667810e-07 4654 4654 1.00000000000000e+00 4655 4655 1.00000000000000e+00 4656 4656 1.00000000000000e+00 4657 4657 1.00000000000000e+00 4658 4658 1.00000000000000e+00 4659 4659 1.00000000000000e+00 4660 4660 1.00000000000000e+00 4661 4661 1.00000000000000e+00 4662 4662 1.00000000000000e+00 4663 4663 1.00000000000000e+00 4664 4664 1.00000000000000e+00 4665 4665 1.00000000000000e+00 4666 4666 1.00000000000000e+00 4667 4667 1.00000000000000e+00 4668 4668 1.00000000000000e+00 4669 4669 1.00000000000000e+00 4670 4670 1.00000000000000e+00 4671 4671 1.00000000000000e+00 4672 4672 1.00000000000000e+00 4673 4673 1.00000000000000e+00 4674 4674 1.00000000000000e+00 4675 4675 1.00000000000000e+00 4676 4676 1.00000000000000e+00 4677 4677 1.00000000000000e+00 4678 4678 1.00000000000000e+00 4679 4679 1.00000000000000e+00 4680 4680 1.00000000000000e+00 4681 4681 1.00000000000000e+00 4682 4682 1.00000000000000e+00 4683 4683 1.00000000000000e+00 4684 4684 1.00000000000000e+00 4685 4685 1.00000000000000e+00 4686 4686 1.00000000000000e+00 4687 4687 1.00000000000000e+00 4688 4688 1.00000000000000e+00 4689 4689 1.00000000000000e+00 4690 4690 1.00000000000000e+00 4691 4691 1.00000000000000e+00 4692 4692 1.00000000000000e+00 4693 4693 1.00000000000000e+00 4694 4694 1.00000000000000e+00 4695 4695 1.00000000000000e+00 4696 4696 1.00000000000000e+00 4697 4697 1.00000000000000e+00 4698 4698 1.00000000000000e+00 4699 4699 1.00000000000000e+00 4700 4700 1.00000000000000e+00 4701 4701 1.00000000000000e+00 4702 4702 1.00000000000000e+00 4703 4703 1.00000000000000e+00 4704 4704 1.00000000000000e+00 4705 4705 1.00000000000000e+00 4706 4706 1.00000000000000e+00 4707 4707 1.00000000000000e+00 4708 4708 1.00000000000000e+00 4709 4709 1.00000000000000e+00 4710 4710 1.00000000000000e+00 4711 4711 1.00000000000000e+00 4712 4712 1.00000000000000e+00 4713 4713 1.00000000000000e+00 4714 4714 1.00000000000000e+00 4715 4715 1.00000000000000e+00 4716 4716 1.00000000000000e+00 4717 4717 1.00000000000000e+00 4718 4718 1.00000000000000e+00 4719 4719 1.00000000000000e+00 4720 4720 1.00000000000000e+00 4721 4721 1.00000000000000e+00 4722 4722 1.00000000000000e+00 4723 4723 1.00000000000000e+00 4724 4724 1.00000000000000e+00 4725 4725 1.00000000000000e+00 4726 4726 1.00000000000000e+00 4727 4727 1.00000000000000e+00 4728 4728 1.00000000000000e+00 4729 4729 1.00000000000000e+00 4730 4730 1.00000000000000e+00 4731 4731 1.00000000000000e+00 4732 4732 1.00000000000000e+00 4733 4733 1.00000000000000e+00 4734 4734 1.00000000000000e+00 4735 4735 1.00000000000000e+00 4736 4736 1.00000000000000e+00 4737 4737 1.00000000000000e+00 4738 4738 1.00000000000000e+00 4739 4739 1.00000000000000e+00 4740 4740 1.00000000000000e+00 4741 4741 1.00000000000000e+00 4742 4742 1.00000000000000e+00 4743 4743 1.00000000000000e+00 4744 4744 1.00000000000000e+00 4745 4745 1.00000000000000e+00 4746 4746 1.00000000000000e+00 4747 4747 1.00000000000000e+00 4748 4748 1.00000000000000e+00 4749 4749 1.00000000000000e+00 4750 4750 1.00000000000000e+00 4751 4751 1.00000000000000e+00 4752 4752 1.00000000000000e+00 4753 4753 1.00000000000000e+00 4754 4754 1.00000000000000e+00 4755 4755 1.00000000000000e+00 4756 4756 1.00000000000000e+00 4757 4757 1.00000000000000e+00 4758 4758 1.00000000000000e+00 4759 4759 1.00000000000000e+00 4760 4760 1.00000000000000e+00 4761 4761 1.00000000000000e+00 4762 4762 1.00000000000000e+00 4763 4763 1.00000000000000e+00 4764 4764 1.00000000000000e+00 4765 4765 1.00000000000000e+00 4766 4766 1.00000000000000e+00 4767 4767 1.00000000000000e+00 4768 4768 1.00000000000000e+00 4769 4769 1.00000000000000e+00 4770 4770 1.00000000000000e+00 4771 4771 1.00000000000000e+00 4772 4772 1.00000000000000e+00 4773 4773 1.00000000000000e+00 4774 4774 1.00000000000000e+00 4775 4775 1.00000000000000e+00 4776 4776 1.00000000000000e+00 4777 4777 1.00000000000000e+00 4778 4778 1.00000000000000e+00 4779 4779 1.00000000000000e+00 4780 4780 1.00000000000000e+00 4781 4781 1.00000000000000e+00 4782 4782 1.00000000000000e+00 4783 4783 1.00000000000000e+00 4784 4784 1.00000000000000e+00 4785 4785 1.00000000000000e+00 4786 4786 1.00000000000000e+00 4787 4787 1.00000000000000e+00 4788 4788 1.00000000000000e+00 4789 4789 1.00000000000000e+00 4790 4790 1.00000000000000e+00 4791 4791 1.00000000000000e+00 4792 4792 1.00000000000000e+00 4793 4793 1.00000000000000e+00 4794 4794 1.00000000000000e+00 4795 4795 1.00000000000000e+00 4796 4796 1.00000000000000e+00 4797 4797 1.00000000000000e+00 4798 4798 1.00000000000000e+00 4799 4799 1.00000000000000e+00 4800 4800 1.00000000000000e+00 4801 4801 1.00000000000000e+00 4802 4802 1.00000000000000e+00 4803 4803 1.00000000000000e+00 4804 4804 1.00000000000000e+00 4805 4805 1.00000000000000e+00 4806 4806 1.00000000000000e+00 4807 4807 1.00000000000000e+00 4808 4808 1.00000000000000e+00 4809 4809 1.00000000000000e+00 4810 4810 1.00000000000000e+00 4811 4811 1.00000000000000e+00 4812 4812 1.00000000000000e+00 4813 4813 1.00000000000000e+00 4814 4814 1.00000000000000e+00 4815 4815 1.00000000000000e+00 4816 4816 1.00000000000000e+00 4817 4817 1.00000000000000e+00 4818 4818 1.00000000000000e+00 4819 4819 1.00000000000000e+00 4820 4820 1.00000000000000e+00 4821 4821 1.00000000000000e+00 4822 4822 1.00000000000000e+00 4823 4823 1.00000000000000e+00 4824 4824 1.00000000000000e+00 4825 4825 1.00000000000000e+00 4826 4826 1.00000000000000e+00 4827 4827 1.00000000000000e+00 4828 4828 1.00000000000000e+00 4829 4829 1.00000000000000e+00 4830 4830 1.00000000000000e+00 4831 4831 1.00000000000000e+00 4832 4832 1.00000000000000e+00 4833 4833 1.00000000000000e+00 4834 4834 1.00000000000000e+00 4835 4835 1.00000000000000e+00 4836 4836 1.00000000000000e+00 4837 4837 1.00000000000000e+00 4838 4838 1.00000000000000e+00 4839 4839 1.00000000000000e+00 4840 4840 1.00000000000000e+00 4841 4841 1.00000000000000e+00 4842 4842 1.00000000000000e+00 4843 4843 1.00000000000000e+00 4844 4844 1.00000000000000e+00 4845 4845 1.00000000000000e+00 4846 4846 1.00000000000000e+00 4847 4847 1.00000000000000e+00 4848 4848 1.00000000000000e+00 4849 4849 1.00000000000000e+00 4850 4850 1.00000000000000e+00 4851 4851 1.00000000000000e+00 4852 4852 1.00000000000000e+00 4853 4853 1.00000000000000e+00 4854 4854 1.00000000000000e+00 4855 4855 1.00000000000000e+00 4856 4856 1.00000000000000e+00 4857 4857 1.00000000000000e+00 4858 4858 1.00000000000000e+00 4859 4859 1.00000000000000e+00 4860 4860 1.00000000000000e+00 4861 4861 1.00000000000000e+00 4862 4862 1.00000000000000e+00 4863 4863 1.00000000000000e+00 4864 4864 1.00000000000000e+00 4865 4865 1.00000000000000e+00 4866 4866 1.00000000000000e+00 4867 4867 1.00000000000000e+00 4868 4868 1.00000000000000e+00 4869 4869 1.00000000000000e+00 4870 4870 1.00000000000000e+00 4871 4871 1.00000000000000e+00 4872 4872 1.00000000000000e+00 4873 4873 1.00000000000000e+00 4874 4874 1.00000000000000e+00 4875 4875 1.00000000000000e+00 4876 4876 1.00000000000000e+00 4877 4877 1.00000000000000e+00 4878 4878 1.00000000000000e+00 4879 4879 1.00000000000000e+00 4880 4880 1.00000000000000e+00 4881 4881 1.00000000000000e+00 4882 4882 1.00000000000000e+00 4883 4883 1.00000000000000e+00 4884 4884 1.00000000000000e+00 4885 4885 1.00000000000000e+00 4886 4886 1.00000000000000e+00 4887 4887 1.00000000000000e+00 4888 4888 1.00000000000000e+00 4889 4889 1.00000000000000e+00 4890 4890 1.00000000000000e+00 4891 4891 1.00000000000000e+00 4892 4892 1.00000000000000e+00 4893 4893 1.00000000000000e+00 4894 4894 1.00000000000000e+00 4895 4895 1.00000000000000e+00 4896 4896 1.00000000000000e+00 4897 4897 1.00000000000000e+00 4898 4898 1.00000000000000e+00 4899 4899 1.00000000000000e+00 4900 4900 1.00000000000000e+00 4901 4901 1.00000000000000e+00 4902 4902 1.00000000000000e+00 4903 4903 1.00000000000000e+00 4904 4904 1.00000000000000e+00 4905 4905 1.00000000000000e+00 4906 4906 1.00000000000000e+00 4907 4907 1.00000000000000e+00 4908 4908 1.00000000000000e+00 4909 4909 1.00000000000000e+00 4910 4910 1.00000000000000e+00 4911 4911 1.00000000000000e+00 4912 4912 1.00000000000000e+00 4913 4913 1.00000000000000e+00 4914 4914 1.00000000000000e+00 4915 4915 1.00000000000000e+00 4916 4916 1.00000000000000e+00 4917 4917 1.00000000000000e+00 4918 4918 1.00000000000000e+00 4919 4919 1.00000000000000e+00 4920 4920 1.00000000000000e+00 4921 4921 1.00000000000000e+00 4922 4922 1.00000000000000e+00 4923 4923 1.00000000000000e+00 4924 4924 1.00000000000000e+00 4925 4925 1.00000000000000e+00 4926 4926 1.00000000000000e+00 4927 4927 1.00000000000000e+00 4928 4928 1.00000000000000e+00 4929 4929 1.00000000000000e+00 4930 4930 1.00000000000000e+00 4931 4931 1.00000000000000e+00 4932 4932 1.00000000000000e+00 4933 4933 1.00000000000000e+00 4934 4934 1.00000000000000e+00 4935 4935 1.00000000000000e+00 4936 4936 1.00000000000000e+00 4937 4937 1.00000000000000e+00 4938 4938 1.00000000000000e+00 4939 4939 1.00000000000000e+00 4940 4940 1.00000000000000e+00 4941 4941 1.00000000000000e+00 4942 4942 1.00000000000000e+00 4943 4943 1.00000000000000e+00 4944 4944 1.00000000000000e+00 4945 4945 1.00000000000000e+00 4946 4946 1.00000000000000e+00 4947 4947 1.00000000000000e+00 4948 4948 1.00000000000000e+00 4949 4949 1.00000000000000e+00 4950 4950 1.00000000000000e+00 4951 4951 1.00000000000000e+00 4952 4952 1.00000000000000e+00 4953 4953 1.00000000000000e+00 4954 4954 1.00000000000000e+00 4955 4955 1.00000000000000e+00 4956 4956 1.00000000000000e+00 4957 4957 1.00000000000000e+00 4958 4958 1.00000000000000e+00 4959 4959 1.00000000000000e+00 4960 4960 1.00000000000000e+00 4961 4961 1.00000000000000e+00 4962 4962 1.00000000000000e+00 4963 4963 1.00000000000000e+00 4964 4964 1.00000000000000e+00 4965 4965 1.00019295784113e+00 4965 4389 1.74906230975333e-04 4965 4413 1.81867178720740e-04 4965 4437 1.02677524531000e-09 4965 4989 2.27218828907758e-02 4965 5013 1.17535898769435e-02 4965 5037 1.13653088228283e-05 4965 5565 5.96412141363904e-03 4965 5589 5.92060211873675e-02 4965 5613 1.04734868936986e-02 4965 5637 2.18137199729478e-05 4965 6141 1.57623610900000e-11 4965 6165 2.08212736614834e-03 4965 6189 9.08688838913268e-03 4965 6213 6.51068255958192e-04 4965 6237 1.23556813447242e-06 4965 6741 5.45496585000000e-12 4965 6765 4.57242407563110e-07 4965 6789 1.24828921303143e-06 4965 6813 9.84462529829330e-07 4965 7389 4.86770000000000e-16 4965 7413 1.82940000000000e-16 4965 17448 -5.76787102641967e-03 4965 17472 -2.95310796217855e-03 4965 17496 -1.97635568482042e-05 4965 17856 -3.06995764510260e-02 4965 17880 -1.58080846130474e-02 4965 17904 -1.30941825009836e-04 4965 18264 -3.62833187129925e-02 4965 18288 -1.89372668443833e-02 4965 18312 -2.27316425110591e-04 4965 18672 -7.64040556608097e-03 4965 18696 -4.00184406382038e-03 4965 18720 -5.18975087942547e-05 4965 19080 -3.07830518340563e-06 4965 19104 -1.54782487178358e-06 4965 19128 -2.47779430879000e-09 4966 4966 1.00000000000000e+00 4967 4967 1.00000000000000e+00 4968 4968 1.00000000000000e+00 4969 4969 1.00000000000000e+00 4970 4970 1.00000000000000e+00 4971 4971 1.00000000000000e+00 4972 4972 1.00000000000000e+00 4973 4973 1.00000000000000e+00 4974 4974 1.00000000000000e+00 4975 4975 1.00000000000000e+00 4976 4976 1.00000000000000e+00 4977 4977 1.00000000000000e+00 4978 4978 1.00000000000000e+00 4979 4979 1.00000000000000e+00 4980 4980 1.00000000000000e+00 4981 4981 1.00000000000000e+00 4982 4982 1.00000000000000e+00 4983 4983 1.00000000000000e+00 4984 4984 1.00000000000000e+00 4985 4985 1.00000000000000e+00 4986 4986 1.00000000000000e+00 4987 4987 1.00000000000000e+00 4988 4988 1.00000000000000e+00 4989 4989 1.12846611172944e+01 4989 3213 5.75738267860000e-09 4989 3237 1.07430315361200e-08 4989 3261 2.76977475000000e-12 4989 3789 7.80904127106641e-05 4989 3813 3.01114647711882e-02 4989 3837 9.74515294596650e-03 4989 3861 1.43358216180975e-06 4989 4389 7.68476838705000e-01 4989 4413 2.82246097617265e+00 4989 4437 1.54296983896809e-01 4989 4461 3.05165715246753e-04 4989 4965 2.27218828907758e-02 4989 5013 1.08522054118619e+01 4989 5037 2.68021749546509e-01 4989 5061 1.93413419972690e-04 4989 5565 2.51332964486052e-01 4989 5589 8.41036131317700e+00 4989 5613 3.98787308235858e+00 4989 5637 9.43923886567082e-02 4989 5661 6.65602558937116e-05 4989 6141 4.36402672700000e-11 4989 6165 6.52643325329198e-02 4989 6189 3.62451739099545e-01 4989 6213 1.07149062964958e-01 4989 6237 2.91387883519289e-03 4989 6261 2.76280475736864e-06 4989 6741 1.51028246000000e-11 4989 6765 1.26615946688092e-06 4989 6789 1.57546452617895e-04 4989 6813 2.11681717864968e-04 4989 6837 8.25552108883428e-06 4989 7389 1.43269000000000e-15 4989 7413 5.38430000000000e-16 4989 16224 -3.45778598212080e-07 4989 16248 -1.80427590875910e-07 4989 16272 -2.15379764853000e-09 4989 16632 -6.40768823076001e-02 4989 16656 -3.73800305753864e-02 4989 16680 -1.52616840616753e-03 4989 17040 -1.54591739054221e+00 4989 17064 -8.79965056906100e-01 4989 17088 -3.06935392903582e-02 4989 17112 -3.23866062505970e-05 4989 17448 -7.60221651864047e+00 4989 17472 -4.37787045752153e+00 4989 17496 -1.67023864717947e-01 4989 17520 -6.01640639348683e-04 4989 17856 -1.10499459964699e+01 4989 17880 -6.55683928723491e+00 4989 17904 -3.02145747279517e-01 4989 17928 -1.97260203679885e-03 4989 18264 -3.34611990479084e+00 4989 18288 -2.02506210321663e+00 4989 18312 -1.03095708974912e-01 4989 18336 -6.79448506998587e-04 4989 18672 -2.41641731088428e-01 4989 18696 -1.51606456257912e-01 4989 18720 -8.98842633280525e-03 4989 18744 -5.18385731630731e-05 4989 19080 -8.52313646765135e-06 4989 19104 -4.28709318978555e-06 4989 19128 -7.29284455996000e-09 4990 4990 1.00000000000000e+00 4991 4991 1.00000000000000e+00 4992 4992 1.00000000000000e+00 4993 4993 1.00000000000000e+00 4994 4994 1.00000000000000e+00 4995 4995 1.00000000000000e+00 4996 4996 1.00000000000000e+00 4997 4997 1.00000000000000e+00 4998 4998 1.00000000000000e+00 4999 4999 1.00000000000000e+00 5000 5000 1.00000000000000e+00 5001 5001 1.00000000000000e+00 5002 5002 1.00000000000000e+00 5003 5003 1.00000000000000e+00 5004 5004 1.00000000000000e+00 5005 5005 1.00000000000000e+00 5006 5006 1.00000000000000e+00 5007 5007 1.00000000000000e+00 5008 5008 1.00000000000000e+00 5009 5009 1.00000000000000e+00 5010 5010 1.00000000000000e+00 5011 5011 1.00000000000000e+00 5012 5012 1.00000000000000e+00 5013 5013 2.33744226411695e+01 5013 3213 1.38667055159875e-04 5013 3237 2.73574244309960e-04 5013 3261 1.44369951344170e-07 5013 3789 7.01132519780409e-04 5013 3813 3.28881041915934e-01 5013 3837 1.65911619907650e-01 5013 3861 3.49349886848894e-03 5013 3885 1.53658882619243e-05 5013 4389 1.66127993386259e+00 5013 4413 1.00664315766850e+01 5013 4437 2.75103404825537e+00 5013 4461 1.30468906119894e-01 5013 4485 2.20082275981327e-04 5013 4965 1.17535898769435e-02 5013 4989 1.08522054118619e+01 5013 5037 5.30068757924893e+00 5013 5061 3.70222890871775e-01 5013 5085 1.66440736458122e-04 5013 5565 6.99586949078867e-02 5013 5589 5.59124452074484e+00 5013 5613 6.71549843465456e+00 5013 5637 2.39184467225705e+00 5013 5661 1.24157463156090e-01 5013 5685 1.31358384121015e-04 5013 6165 9.82793053106720e-03 5013 6189 1.22248691713117e-01 5013 6213 3.04211210513150e-01 5013 6237 1.45180600441257e-01 5013 6261 2.98338614606087e-03 5013 6285 9.53315919924650e-07 5013 6789 1.17729495477171e-04 5013 6813 4.19351447657609e-04 5013 6837 1.11714081298827e-04 5013 6861 1.30211113888135e-05 5013 16224 -9.96711146675233e-03 5013 16248 -1.38478634824622e-02 5013 16272 -4.50836102338880e-03 5013 16296 -5.31919679444214e-04 5013 16632 -7.26009893524988e-01 5013 16656 -9.00513750001239e-01 5013 16680 -2.94052989407059e-01 5013 16704 -3.78886813069680e-02 5013 16728 -1.80659238066758e-05 5013 17040 -5.61186521115540e+00 5013 17064 -5.86735061115188e+00 5013 17088 -1.87862984396715e+00 5013 17112 -2.74822116270493e-01 5013 17136 -1.21445491145512e-03 5013 17448 -1.36812044076585e+01 5013 17472 -1.21491661808581e+01 5013 17496 -3.72294246617868e+00 5013 17520 -6.13134529254239e-01 5013 17544 -5.13431393213634e-03 5013 17856 -9.15748002497567e+00 5013 17880 -8.15750338257090e+00 5013 17904 -2.24353417678793e+00 5013 17928 -3.41170327114189e-01 5013 17952 -3.33212378989235e-03 5013 18264 -1.71458500707120e+00 5013 18288 -1.55811480797780e+00 5013 18312 -3.92717788799686e-01 5013 18336 -5.38648376009517e-02 5013 18360 -5.47483143415981e-04 5013 18672 -3.72128208243898e-02 5013 18696 -3.65312941816119e-02 5013 18720 -6.49201867337113e-03 5013 18744 -3.69013968260151e-04 5014 5014 1.00000000000000e+00 5015 5015 1.00000000000000e+00 5016 5016 1.00000000000000e+00 5017 5017 1.00000000000000e+00 5018 5018 1.00000000000000e+00 5019 5019 1.00000000000000e+00 5020 5020 1.00000000000000e+00 5021 5021 1.00000000000000e+00 5022 5022 1.00000000000000e+00 5023 5023 1.00000000000000e+00 5024 5024 1.00000000000000e+00 5025 5025 1.00000000000000e+00 5026 5026 1.00000000000000e+00 5027 5027 1.00000000000000e+00 5028 5028 1.00000000000000e+00 5029 5029 1.00000000000000e+00 5030 5030 1.00000000000000e+00 5031 5031 1.00000000000000e+00 5032 5032 1.00000000000000e+00 5033 5033 1.00000000000000e+00 5034 5034 1.00000000000000e+00 5035 5035 1.00000000000000e+00 5036 5036 1.00000000000000e+00 5037 5037 1.69611461768896e+01 5037 3213 1.48757014544795e-04 5037 3237 3.73082498911609e-04 5037 3261 4.77661153452631e-05 5037 3285 3.03133255660104e-06 5037 3789 8.29054817407587e-05 5037 3813 1.15120413221378e-01 5037 3837 2.84023234766726e-01 5037 3861 1.35101238191699e-01 5037 3885 3.35210990307837e-03 5037 3909 6.81126937739456e-06 5037 4389 6.68679335058792e-02 5037 4413 2.47430333521974e+00 5037 4437 6.38956406917378e+00 5037 4461 2.61139860278923e+00 5037 4485 1.22356735855194e-01 5037 4509 9.68204573979320e-05 5037 4965 1.13653088228283e-05 5037 4989 2.68021749546509e-01 5037 5013 5.30068757924893e+00 5037 5061 6.29112857326277e+00 5037 5085 3.12738875079127e-01 5037 5109 2.74904578863916e-04 5037 5565 6.46479002001122e-05 5037 5589 1.05217503878584e-01 5037 5613 2.38090503758765e+00 5037 5637 6.44362061844826e+00 5037 5661 2.39295414762298e+00 5037 5685 9.21548851110123e-02 5037 5709 1.76444125597529e-04 5037 6165 7.77337397786210e-07 5037 6189 4.47462327059541e-03 5037 6213 1.37978003661636e-01 5037 6237 2.82925116133218e-01 5037 6261 1.18382376377729e-01 5037 6285 4.38303943466953e-03 5037 6309 3.05027687506100e-08 5037 6789 5.57780449472110e-07 5037 6813 1.86095276753439e-05 5037 6837 6.00232747143536e-04 5037 6861 1.80679317919321e-04 5037 6885 2.33359908483914e-06 5037 15816 -1.33099563758210e-07 5037 15840 -1.43016294015590e-04 5037 15864 -6.20042783016785e-04 5037 15888 -3.42380297403751e-04 5037 15912 -4.99741004107984e-05 5037 16224 -1.84717084370414e-02 5037 16248 -1.23074941957581e-01 5037 16272 -2.94623651010266e-01 5037 16296 -1.30904245935941e-01 5037 16320 -1.62013567064915e-02 5037 16344 -7.48228670978528e-06 5037 16632 -2.77611194666452e-01 5037 16656 -1.56020234216348e+00 5037 16680 -3.24277390371008e+00 5037 16704 -1.46587366422926e+00 5037 16728 -1.94900128605114e-01 5037 16752 -1.79342829018024e-03 5037 17040 -9.47053835614428e-01 5037 17064 -5.10178297208419e+00 5037 17088 -1.02349311736185e+01 5037 17112 -4.72026243498163e+00 5037 17136 -6.58101042165475e-01 5037 17160 -9.66017648426699e-03 5037 17448 -6.68819689456864e-01 5037 17472 -3.94528752716482e+00 5037 17496 -8.83501779089225e+00 5037 17520 -4.21473093150739e+00 5037 17544 -6.12047630761570e-01 5037 17568 -1.21795169504232e-02 5037 17856 -1.55218139672082e-01 5037 17880 -1.01464558466501e+00 5037 17904 -2.31875979400015e+00 5037 17928 -1.05198764373595e+00 5037 17952 -1.43978339114223e-01 5037 17976 -2.68360686543640e-03 5037 18264 -1.03974540170888e-02 5037 18288 -7.89606507668571e-02 5037 18312 -1.67675406492187e-01 5037 18336 -6.27299216796498e-02 5037 18360 -6.31400259870883e-03 5037 18384 -2.12273103108980e-05 5037 18672 -3.26042166295232e-06 5037 18696 -1.90559154330356e-05 5037 18720 -2.73173367878575e-05 5037 18744 -6.01422878122630e-06 5038 5038 1.00000000000000e+00 5039 5039 1.00000000000000e+00 5040 5040 1.00000000000000e+00 5041 5041 1.00000000000000e+00 5042 5042 1.00000000000000e+00 5043 5043 1.00000000000000e+00 5044 5044 1.00000000000000e+00 5045 5045 1.00000000000000e+00 5046 5046 1.00000000000000e+00 5047 5047 1.00000000000000e+00 5048 5048 1.00000000000000e+00 5049 5049 1.00000000000000e+00 5050 5050 1.00000000000000e+00 5051 5051 1.00000000000000e+00 5052 5052 1.00000000000000e+00 5053 5053 1.00000000000000e+00 5054 5054 1.00000000000000e+00 5055 5055 1.00000000000000e+00 5056 5056 1.00000000000000e+00 5057 5057 1.00000000000000e+00 5058 5058 1.00000000000000e+00 5059 5059 1.00000000000000e+00 5060 5060 1.00000000000000e+00 5061 5061 1.52368589982419e+01 5061 3213 6.07076150326416e-06 5061 3237 1.72881141110555e-04 5061 3261 8.42968691652808e-04 5061 3285 7.51344158719152e-05 5061 3309 2.19087640160000e-10 5061 3333 7.79578600000000e-14 5061 3789 1.62635643746710e-07 5061 3813 3.27777054418445e-03 5061 3837 1.41458480609613e-01 5061 3861 3.05741013405640e-01 5061 3885 1.17467751532464e-01 5061 3909 5.70101788762022e-03 5061 3933 2.74962501930980e-06 5061 4389 1.64562920078711e-04 5061 4413 1.14640260342688e-01 5061 4437 2.63300019074898e+00 5061 4461 6.01317879021487e+00 5061 4485 2.32069493927853e+00 5061 4509 1.17330424634126e-01 5061 4533 8.91005421407040e-05 5061 4989 1.93413419972690e-04 5061 5013 3.70222890871775e-01 5061 5037 6.29112857326277e+00 5061 5085 5.42353049705149e+00 5061 5109 2.82601434453932e-01 5061 5133 5.00161568839047e-04 5061 5589 1.35092304002419e-04 5061 5613 1.36104287771051e-01 5061 5637 2.38740455251694e+00 5061 5661 5.50681995523432e+00 5061 5685 2.25780169589532e+00 5061 5709 8.63918164591274e-02 5061 5733 1.25135402336310e-04 5061 6189 1.56403018457281e-05 5061 6213 2.81609474262592e-03 5061 6237 1.09787995396197e-01 5061 6261 2.90694425790977e-01 5061 6285 9.94207410797819e-02 5061 6309 5.12001329153910e-03 5061 6813 1.62962235055496e-06 5061 6837 8.84933336397303e-05 5061 6861 1.38422994045988e-04 5061 6885 2.33697018029741e-04 5061 6909 6.86885643072792e-06 5061 15456 -6.13896168510000e-10 5061 15480 -3.15286122116000e-09 5061 15504 -3.40300235706000e-09 5061 15528 -6.97276547140000e-10 5061 15816 -1.54286544133720e-07 5061 15840 -2.45483860613439e-03 5061 15864 -2.67986772911736e-02 5061 15888 -7.66304469585001e-02 5061 15912 -4.19819363012440e-02 5061 15936 -6.25604395553294e-03 5061 15960 -1.59177904572117e-06 5061 16224 -1.22365447471562e-03 5061 16248 -9.94144917253992e-02 5061 16272 -6.94820792058661e-01 5061 16296 -1.48312847787423e+00 5061 16320 -8.23602821426849e-01 5061 16344 -1.34270192548720e-01 5061 16368 -1.93303940305551e-03 5061 16632 -6.67400920711623e-03 5061 16656 -5.23272904718788e-01 5061 16680 -3.40661737920480e+00 5061 16704 -6.73991693558080e+00 5061 16728 -3.78383013424038e+00 5061 16752 -6.48829834041628e-01 5061 16776 -1.50083400241686e-02 5061 17040 -8.36244219545003e-03 5061 17064 -7.67651190101427e-01 5061 17088 -4.91376916156051e+00 5061 17112 -9.44829471250612e+00 5061 17136 -5.35935612814149e+00 5061 17160 -9.67683053614479e-01 5061 17184 -3.19984746935319e-02 5061 17448 -1.83203537140733e-03 5061 17472 -2.75908869197928e-01 5061 17496 -1.86663739218363e+00 5061 17520 -3.73729413925658e+00 5061 17544 -2.02840327989387e+00 5061 17568 -3.49928920340780e-01 5061 17592 -1.07863231621519e-02 5061 17856 -1.25824412478916e-05 5061 17880 -2.92956316988241e-02 5061 17904 -2.16006340598428e-01 5061 17928 -4.57991835894876e-01 5061 17952 -2.30669445532562e-01 5061 17976 -3.61825963381653e-02 5061 18000 -8.71566016129888e-04 5061 18288 -2.47411633771678e-04 5061 18312 -1.78015374464236e-03 5061 18336 -3.43551708160322e-03 5061 18360 -8.94813647991479e-04 5061 18384 -2.60766096089580e-05 5062 5062 1.00000000000000e+00 5063 5063 1.00000000000000e+00 5064 5064 1.00000000000000e+00 5065 5065 1.00000000000000e+00 5066 5066 1.00000000000000e+00 5067 5067 1.00000000000000e+00 5068 5068 1.00000000000000e+00 5069 5069 1.00000000000000e+00 5070 5070 1.00000000000000e+00 5071 5071 1.00000000000000e+00 5072 5072 1.00000000000000e+00 5073 5073 1.00000000000000e+00 5074 5074 1.00000000000000e+00 5075 5075 1.00000000000000e+00 5076 5076 1.00000000000000e+00 5077 5077 1.00000000000000e+00 5078 5078 1.00000000000000e+00 5079 5079 1.00000000000000e+00 5080 5080 1.00000000000000e+00 5081 5081 1.00000000000000e+00 5082 5082 1.00000000000000e+00 5083 5083 1.00000000000000e+00 5084 5084 1.00000000000000e+00 5085 5085 1.43612580844071e+01 5085 3237 1.78071334005430e-05 5085 3261 1.53185448900642e-04 5085 3285 2.31229553062047e-04 5085 3309 1.93604114647185e-04 5085 3333 2.46575223213150e-07 5085 3813 1.82413221143818e-06 5085 3837 3.14962360091569e-03 5085 3861 1.30017308321317e-01 5085 3885 3.25771669079227e-01 5085 3909 1.04668459507658e-01 5085 3933 4.53171246542357e-03 5085 3957 9.75132400737207e-06 5085 4413 1.09163930156511e-04 5085 4437 1.12349617391641e-01 5085 4461 2.31426725984317e+00 5085 4485 5.58574866139339e+00 5085 4509 2.28425795486040e+00 5085 4533 1.32107227727700e-01 5085 4557 1.44147466930786e-04 5085 4581 4.40000000000000e-19 5085 5013 1.66440736458122e-04 5085 5037 3.12738875079127e-01 5085 5061 5.42353049705149e+00 5085 5109 5.50028633803765e+00 5085 5133 2.67067283445572e-01 5085 5157 6.20724038309034e-04 5085 5613 2.62739118781422e-04 5085 5637 1.06238221895663e-01 5085 5661 2.25961989461752e+00 5085 5685 5.23127818559829e+00 5085 5709 2.15224436646039e+00 5085 5733 9.81329879921890e-02 5085 5757 6.03166389497410e-05 5085 6213 7.46695746236243e-06 5085 6237 5.24590795012682e-03 5085 6261 8.59626371374436e-02 5085 6285 2.70682180385703e-01 5085 6309 1.09060475920185e-01 5085 6333 4.96671538245728e-03 5085 6357 5.23284682600000e-11 5085 6861 1.17724328222055e-04 5085 6885 4.91919438840005e-04 5085 6909 7.84963079505855e-05 5085 6933 2.57973066677054e-06 5085 6957 2.42173700000000e-14 5085 15456 -2.30368090416419e-05 5085 15480 -2.05883233787824e-03 5085 15504 -9.62297346308543e-03 5085 15528 -8.89962435477855e-03 5085 15552 -1.73381330431106e-03 5085 15576 -1.54264278491780e-07 5085 15840 -2.84870293465081e-04 5085 15864 -2.79573555867753e-02 5085 15888 -2.38646796391964e-01 5085 15912 -6.31129289373418e-01 5085 15936 -4.52565793524384e-01 5085 15960 -8.66559427129929e-02 5085 15984 -1.67656038496181e-03 5085 16248 -2.14648723749301e-03 5085 16272 -2.12494015931437e-01 5085 16296 -1.69477015015129e+00 5085 16320 -4.23415220768885e+00 5085 16344 -2.98627124706644e+00 5085 16368 -6.02940997111873e-01 5085 16392 -2.01656095848379e-02 5085 16416 -1.32206470670000e-10 5085 16656 -4.35560139697675e-03 5085 16680 -4.69701797998804e-01 5085 16704 -3.64519484217994e+00 5085 16728 -8.86448444528996e+00 5085 16752 -6.23407982509964e+00 5085 16776 -1.32965709172447e+00 5085 16800 -6.10846835017304e-02 5085 16824 -7.06933854300000e-10 5085 17064 -1.17783345955631e-03 5085 17088 -2.53257024583946e-01 5085 17112 -2.10508368685631e+00 5085 17136 -5.31142189658302e+00 5085 17160 -3.64136977461592e+00 5085 17184 -7.66829074925670e-01 5085 17208 -3.57113108533592e-02 5085 17232 -8.44638357170000e-10 5085 17472 -4.27068489809045e-05 5085 17496 -4.20474139306105e-02 5085 17520 -3.78249300822852e-01 5085 17544 -9.90842359719972e-01 5085 17568 -6.40927707820455e-01 5085 17592 -1.28438112447599e-01 5085 17616 -5.56833331860741e-03 5085 17640 -1.78107971630000e-10 5085 17904 -1.06285179056372e-03 5085 17928 -1.19319310724472e-02 5085 17952 -3.37284796292224e-02 5085 17976 -1.54562329970989e-02 5085 18000 -1.94985337928625e-03 5085 18024 -1.58029534922598e-06 5086 5086 1.00000000000000e+00 5087 5087 1.00000000000000e+00 5088 5088 1.00000000000000e+00 5089 5089 1.00000000000000e+00 5090 5090 1.00000000000000e+00 5091 5091 1.00000000000000e+00 5092 5092 1.00000000000000e+00 5093 5093 1.00000000000000e+00 5094 5094 1.00000000000000e+00 5095 5095 1.00000000000000e+00 5096 5096 1.00000000000000e+00 5097 5097 1.00000000000000e+00 5098 5098 1.00000000000000e+00 5099 5099 1.00000000000000e+00 5100 5100 1.00000000000000e+00 5101 5101 1.00000000000000e+00 5102 5102 1.00000000000000e+00 5103 5103 1.00000000000000e+00 5104 5104 1.00000000000000e+00 5105 5105 1.00000000000000e+00 5106 5106 1.00000000000000e+00 5107 5107 1.00000000000000e+00 5108 5108 1.00000000000000e+00 5109 5109 1.44213860298006e+01 5109 3261 2.13656657686153e-06 5109 3285 3.60350842428249e-04 5109 3309 4.72542549108676e-04 5109 3333 2.27667645083760e-05 5109 3357 1.32826164813375e-06 5109 3837 2.33546346859161e-06 5109 3861 3.37533779248329e-03 5109 3885 1.19649369036845e-01 5109 3909 3.28037469003473e-01 5109 3933 1.46585707143295e-01 5109 3957 4.31287933667559e-03 5109 3981 1.44666009939137e-06 5109 4005 1.82940000000000e-16 5109 4437 4.76842667935605e-05 5109 4461 1.13542902326334e-01 5109 4485 2.27567422516411e+00 5109 4509 6.05533313607160e+00 5109 4533 2.43971202276566e+00 5109 4557 1.41882974823337e-01 5109 4581 2.51116470786623e-04 5109 4605 5.38430000000000e-16 5109 5037 2.74904578863916e-04 5109 5061 2.82601434453932e-01 5109 5085 5.50028633803765e+00 5109 5133 5.76486307275885e+00 5109 5157 2.77770045261555e-01 5109 5181 5.43624149202182e-04 5109 5637 3.16321383374538e-04 5109 5661 1.00146710530681e-01 5109 5685 2.14309867129194e+00 5109 5709 5.35940821716823e+00 5109 5733 2.13949290794890e+00 5109 5757 1.08523138370519e-01 5109 5781 3.05226841770284e-05 5109 6237 4.62919780307250e-07 5109 6261 4.42976897962892e-03 5109 6285 1.06063705484242e-01 5109 6309 2.50889615789968e-01 5109 6333 1.03347535291058e-01 5109 6357 5.11135706757784e-03 5109 6381 1.84048516669520e-07 5109 6861 7.87821774847100e-07 5109 6885 1.58758229703413e-05 5109 6909 3.84182544807877e-04 5109 6933 2.12636592359754e-04 5109 6957 1.45607376990150e-07 5109 6981 8.10624600000000e-14 5109 7533 2.84600000000000e-17 5109 7557 1.86000000000000e-17 5109 15096 -2.08381299950430e-05 5109 15120 -1.55563455594227e-04 5109 15144 -3.09682943183139e-04 5109 15168 -7.22152185415608e-05 5109 15192 -1.07073187650000e-09 5109 15456 -5.59793347357103e-06 5109 15480 -4.76276778342306e-03 5109 15504 -7.02222855708120e-02 5109 15528 -2.52605295670644e-01 5109 15552 -2.23748796928769e-01 5109 15576 -4.73116659948546e-02 5109 15600 -1.11687003265817e-03 5109 15864 -2.81280434771745e-04 5109 15888 -7.51061278934854e-02 5109 15912 -8.20278751359089e-01 5109 15936 -2.57969505935665e+00 5109 15960 -2.18514483610328e+00 5109 15984 -5.02981888970402e-01 5109 16008 -2.33917155530080e-02 5109 16032 -3.49414465273950e-07 5109 16272 -1.08121285912410e-03 5109 16296 -2.70400200659882e-01 5109 16320 -2.65973954927669e+00 5109 16344 -7.84475762036920e+00 5109 16368 -6.49493602195029e+00 5109 16392 -1.58350204718123e+00 5109 16416 -9.55746831138025e-02 5109 16440 -3.41322157762277e-06 5109 16680 -4.19129189440223e-04 5109 16704 -2.24374614877636e-01 5109 16728 -2.30331252695497e+00 5109 16752 -6.93663822977327e+00 5109 16776 -5.76875780633052e+00 5109 16800 -1.44359395821833e+00 5109 16824 -9.45460057249820e-02 5109 16848 -8.41167939047497e-06 5109 17088 -4.00601221406904e-05 5109 17112 -5.20208389584607e-02 5109 17136 -5.92579518169749e-01 5109 17160 -1.86500071194450e+00 5109 17184 -1.49717127446898e+00 5109 17208 -3.57021004769807e-01 5109 17232 -2.10748455066423e-02 5109 17256 -2.01560395289938e-06 5109 17520 -2.65351095419135e-03 5109 17544 -4.05088426167653e-02 5109 17568 -1.39874140180184e-01 5109 17592 -1.01039043382733e-01 5109 17616 -1.99554679510911e-02 5109 17640 -5.78508518996033e-04 5109 17664 -1.00590931000000e-11 5109 17928 -6.94046372686320e-07 5109 17952 -1.65162946727462e-05 5109 17976 -5.60742176785095e-05 5109 18000 -1.54190474932794e-05 5109 18024 -4.19734577819620e-07 5110 5110 1.00000000000000e+00 5111 5111 1.00000000000000e+00 5112 5112 1.00000000000000e+00 5113 5113 1.00000000000000e+00 5114 5114 1.00000000000000e+00 5115 5115 1.00000000000000e+00 5116 5116 1.00000000000000e+00 5117 5117 1.00000000000000e+00 5118 5118 1.00000000000000e+00 5119 5119 1.00000000000000e+00 5120 5120 1.00000000000000e+00 5121 5121 1.00000000000000e+00 5122 5122 1.00000000000000e+00 5123 5123 1.00000000000000e+00 5124 5124 1.00000000000000e+00 5125 5125 1.00000000000000e+00 5126 5126 1.00000000000000e+00 5127 5127 1.00000000000000e+00 5128 5128 1.00000000000000e+00 5129 5129 1.00000000000000e+00 5130 5130 1.00000000000000e+00 5131 5131 1.00000000000000e+00 5132 5132 1.00000000000000e+00 5133 5133 1.52048834911819e+01 5133 3285 1.89409891545966e-06 5133 3309 6.44276186536676e-05 5133 3333 4.39095393213610e-04 5133 3357 1.00310287655638e-04 5133 3861 1.07354659163104e-06 5133 3885 4.53064416783978e-03 5133 3909 1.48638855963735e-01 5133 3933 3.19728559420901e-01 5133 3957 8.83750882412678e-02 5133 3981 4.48672969599089e-03 5133 4005 9.84462529829360e-07 5133 4461 1.87607910286077e-05 5133 4485 1.29265031934992e-01 5133 4509 2.44145806955096e+00 5133 4533 6.54732452314663e+00 5133 4557 2.54478197047026e+00 5133 4581 1.05567678610664e-01 5133 4605 2.11681717864975e-04 5133 5061 5.00161568839047e-04 5133 5085 2.67067283445572e-01 5133 5109 5.76486307275885e+00 5133 5157 6.10174473440794e+00 5133 5181 3.22180068646861e-01 5133 5205 4.19351447657615e-04 5133 5661 2.46473168732270e-04 5133 5685 1.09523577382535e-01 5133 5709 2.13680044591839e+00 5133 5733 5.46392976673377e+00 5133 5757 2.30005723638079e+00 5133 5781 1.28294801162544e-01 5133 5805 1.86095276753436e-05 5133 6261 2.33219156354420e-06 5133 6285 2.99554152661755e-03 5133 6309 9.54297444868264e-02 5133 6333 2.86213876935506e-01 5133 6357 1.03852201314301e-01 5133 6381 3.81948091007362e-03 5133 6405 1.62962235055491e-06 5133 6885 8.44175032531260e-07 5133 6909 1.15050029531138e-04 5133 6933 2.33536006397605e-04 5133 6957 2.24058402351042e-04 5133 6981 2.33286633743798e-06 5133 7533 1.87940000000000e-16 5133 7557 1.22830000000000e-16 5133 15096 -1.19661164935190e-04 5133 15120 -8.19121310477230e-03 5133 15144 -3.89639863280265e-02 5133 15168 -4.00258339285648e-02 5133 15192 -9.34229118965538e-03 5133 15216 -3.37059951672553e-04 5133 15480 -2.56465629442625e-05 5133 15504 -2.67245997549201e-02 5133 15528 -3.59609790199509e-01 5133 15552 -1.28251347224220e+00 5133 15576 -1.25135147236016e+00 5133 15600 -3.40415392059889e-01 5133 15624 -2.42284408096525e-02 5133 15648 -3.64761453425590e-07 5133 15888 -1.18646387859601e-04 5133 15912 -1.44830657291899e-01 5133 15936 -1.79075268972266e+00 5133 15960 -6.17588936427211e+00 5133 15984 -6.06421539807091e+00 5133 16008 -1.72365237570311e+00 5133 16032 -1.36403831570534e-01 5133 16056 -4.38145079191052e-05 5133 16296 -8.98871072744665e-05 5133 16320 -1.90281153849869e-01 5133 16344 -2.32104302524860e+00 5133 16368 -8.01336539963254e+00 5133 16392 -8.08169379493117e+00 5133 16416 -2.40623175819998e+00 5133 16440 -2.07628844917463e-01 5133 16464 -1.77369989909063e-04 5133 16704 -1.60601360825510e-05 5133 16728 -6.02435661366246e-02 5133 16752 -8.49994985456520e-01 5133 16776 -3.09628035087762e+00 5133 16800 -3.07599406256264e+00 5133 16824 -8.81184445223637e-01 5133 16848 -7.08050616192471e-02 5133 16872 -7.26889822415073e-05 5133 17136 -5.16812501595177e-03 5133 17160 -9.71852575256437e-02 5133 17184 -3.81038440365992e-01 5133 17208 -3.62324339704616e-01 5133 17232 -9.59646298107551e-02 5133 17256 -6.56477375214311e-03 5133 17280 -7.58338003402613e-06 5133 17544 -1.04073115619177e-05 5133 17568 -9.28518009400162e-04 5133 17592 -3.87791204741481e-03 5133 17616 -2.16668756254668e-03 5133 17640 -3.19949948932865e-04 5133 17664 -6.64224849700000e-11 5134 5134 1.00000000000000e+00 5135 5135 1.00000000000000e+00 5136 5136 1.00000000000000e+00 5137 5137 1.00000000000000e+00 5138 5138 1.00000000000000e+00 5139 5139 1.00000000000000e+00 5140 5140 1.00000000000000e+00 5141 5141 1.00000000000000e+00 5142 5142 1.00000000000000e+00 5143 5143 1.00000000000000e+00 5144 5144 1.00000000000000e+00 5145 5145 1.00000000000000e+00 5146 5146 1.00000000000000e+00 5147 5147 1.00000000000000e+00 5148 5148 1.00000000000000e+00 5149 5149 1.00000000000000e+00 5150 5150 1.00000000000000e+00 5151 5151 1.00000000000000e+00 5152 5152 1.00000000000000e+00 5153 5153 1.00000000000000e+00 5154 5154 1.00000000000000e+00 5155 5155 1.00000000000000e+00 5156 5156 1.00000000000000e+00 5157 5157 1.67148947905030e+01 5157 3285 2.19544460000000e-13 5157 3309 6.93965276951370e-07 5157 3333 2.13322127890800e-04 5157 3357 6.26332162683865e-05 5157 3885 1.66357890694840e-07 5157 3909 5.85510262322272e-03 5157 3933 1.02243790726410e-01 5157 3957 2.53180377174194e-01 5157 3981 7.91253656423224e-02 5157 4005 6.51068255958210e-04 5157 4485 3.45354354387674e-05 5157 4509 1.33750852826006e-01 5157 4533 2.52076813096792e+00 5157 4557 5.48682765881343e+00 5157 4581 2.18313486092396e+00 5157 4605 1.07149062964959e-01 5157 4629 1.96678742491973e-04 5157 4653 3.96000000000000e-17 5157 5085 6.20724038309034e-04 5157 5109 2.77770045261555e-01 5157 5133 6.10174473440794e+00 5157 5181 6.41976470167608e+00 5157 5205 3.04211210513155e-01 5157 5229 3.22067592846326e-04 5157 5253 2.85680000000000e-16 5157 5685 1.20323550370871e-04 5157 5709 1.14020590599329e-01 5157 5733 2.31147641763552e+00 5157 5757 6.06166136081314e+00 5157 5781 2.48928706355118e+00 5157 5805 1.37978003661640e-01 5157 5829 8.08979821477038e-05 5157 6285 1.40034993139732e-06 5157 6309 5.51968148406408e-03 5157 6333 8.98139243420832e-02 5157 6357 2.80845679566269e-01 5157 6381 1.24288913731442e-01 5157 6405 2.81609474262595e-03 5157 6429 2.47633161065664e-06 5157 6933 1.21338636937123e-04 5157 6957 3.83618832664588e-04 5157 6981 7.72839565029899e-05 5157 7005 7.46695746236279e-06 5157 15096 -2.93151783220590e-07 5157 15120 -4.92885197545324e-03 5157 15144 -7.96440172054075e-02 5157 15168 -3.54401329386659e-01 5157 15192 -5.13545222136790e-01 5157 15216 -1.68324535039272e-01 5157 15240 -1.46458338405460e-02 5157 15264 -2.82679919691200e-08 5157 15504 -2.38387544049822e-06 5157 15528 -5.10251812906409e-02 5157 15552 -7.34540317333676e-01 5157 15576 -3.00685097530556e+00 5157 15600 -3.99618407387613e+00 5157 15624 -1.35404939750064e+00 5157 15648 -1.30866721526178e-01 5157 15672 -2.23427793991180e-04 5157 15912 -5.13822501368402e-06 5157 15936 -1.37572068971864e-01 5157 15960 -2.01546910711484e+00 5157 15984 -8.10899043378017e+00 5157 16008 -1.02624281112437e+01 5157 16032 -3.53361738223860e+00 5157 16056 -3.59725190024005e-01 5157 16080 -1.04604514369131e-03 5157 16320 -1.21126830761586e-06 5157 16344 -6.09726191576301e-02 5157 16368 -1.11422845009597e+00 5157 16392 -4.74306814100736e+00 5157 16416 -5.86868412923079e+00 5157 16440 -1.98400933919516e+00 5157 16464 -1.98962185579800e-01 5157 16488 -8.34346672447818e-04 5157 16752 -7.58954126479118e-03 5157 16776 -1.90496251635002e-01 5157 16800 -8.56623399539284e-01 5157 16824 -1.02406696179595e+00 5157 16848 -3.28645579300924e-01 5157 16872 -3.06138592859684e-02 5157 16896 -1.52757987606129e-04 5157 17160 -4.63546319988521e-05 5157 17184 -6.15205480232561e-03 5157 17208 -3.00451118904865e-02 5157 17232 -3.06819938875620e-02 5157 17256 -6.87824803542487e-03 5157 17280 -1.86508968564511e-04 5158 5158 1.00000000000000e+00 5159 5159 1.00000000000000e+00 5160 5160 1.00000000000000e+00 5161 5161 1.00000000000000e+00 5162 5162 1.00000000000000e+00 5163 5163 1.00000000000000e+00 5164 5164 1.00000000000000e+00 5165 5165 1.00000000000000e+00 5166 5166 1.00000000000000e+00 5167 5167 1.00000000000000e+00 5168 5168 1.00000000000000e+00 5169 5169 1.00000000000000e+00 5170 5170 1.00000000000000e+00 5171 5171 1.00000000000000e+00 5172 5172 1.00000000000000e+00 5173 5173 1.00000000000000e+00 5174 5174 1.00000000000000e+00 5175 5175 1.00000000000000e+00 5176 5176 1.00000000000000e+00 5177 5177 1.00000000000000e+00 5178 5178 1.00000000000000e+00 5179 5179 1.00000000000000e+00 5180 5180 1.00000000000000e+00 5181 5181 1.59550388736789e+01 5181 3309 1.81280000000000e-16 5181 3333 1.55053844990900e-08 5181 3357 4.47785888509600e-08 5181 3909 3.96083470000000e-13 5181 3933 5.64636705605441e-03 5181 3957 1.34864340673858e-01 5181 3981 2.29394337282822e-01 5181 4005 1.04734868936988e-02 5181 4509 1.16427669681292e-04 5181 4533 9.38903743213116e-02 5181 4557 2.30610993286478e+00 5181 4581 7.59651806450870e+00 5181 4605 3.98787308235862e+00 5181 4629 9.52927344201617e-02 5181 4653 3.75230044358600e-08 5181 5109 5.43624149202182e-04 5181 5133 3.22180068646861e-01 5181 5157 6.41976470167608e+00 5181 5205 6.71549843465462e+00 5181 5229 3.91337936004932e-01 5181 5253 1.19958834153319e-04 5181 5709 8.34240246487340e-05 5181 5733 1.30553376912942e-01 5181 5757 2.49741496761038e+00 5181 5781 6.56471963283418e+00 5181 5805 2.38090503758767e+00 5181 5829 9.18742608481268e-02 5181 5853 1.28078995586542e-04 5181 6309 1.22408211906465e-06 5181 6333 4.01865511835701e-03 5181 6357 1.20227799418492e-01 5181 6381 2.81822420274195e-01 5181 6405 1.36104287771051e-01 5181 6429 4.00256385214289e-03 5181 6453 1.08879937028275e-06 5181 6933 7.94031900597660e-07 5181 6957 1.59114016612105e-05 5181 6981 5.56133606008093e-04 5181 7005 2.62739118781434e-04 5181 7029 2.79430157966992e-06 5181 15120 -1.64223745000000e-12 5181 15144 -1.68082945346771e-02 5181 15168 -4.08749207963312e-01 5181 15192 -2.47152522189266e+00 5181 15216 -4.85138247369466e+00 5181 15240 -1.71003083767369e+00 5181 15264 -1.56683939199441e-01 5181 15288 -3.57181806112216e-04 5181 15528 -6.23034231000000e-12 5181 15552 -4.59803680636695e-02 5181 15576 -1.13270057768641e+00 5181 15600 -5.81223872309210e+00 5181 15624 -9.17219547194405e+00 5181 15648 -3.32914583511338e+00 5181 15672 -3.49286089514239e-01 5181 15696 -2.60936372640858e-03 5181 15936 -1.54549245000000e-12 5181 15960 -4.35511837740995e-02 5181 15984 -1.23592080630089e+00 5181 16008 -6.10453891104462e+00 5181 16032 -8.73478129569143e+00 5181 16056 -3.48549779286629e+00 5181 16080 -4.36925577003898e-01 5181 16104 -5.08853050101870e-03 5181 16368 -9.40248882104724e-03 5181 16392 -3.40186827062610e-01 5181 16416 -1.72986038849151e+00 5181 16440 -2.45398170369841e+00 5181 16464 -9.54578846059269e-01 5181 16488 -1.15666008616456e-01 5181 16512 -1.21570673088841e-03 5181 16776 -1.52153242486531e-04 5181 16800 -2.11921539795369e-02 5181 16824 -1.17769960030617e-01 5181 16848 -1.66742076918547e-01 5181 16872 -5.53882674114007e-02 5181 16896 -5.05902499824354e-03 5181 16920 -8.76502208940870e-06 5181 17208 -1.54009090715194e-05 5181 17232 -7.21993790366314e-05 5181 17256 -5.77838800737353e-05 5181 17280 -1.05957427505540e-05 5182 5182 1.00000000000000e+00 5183 5183 1.00000000000000e+00 5184 5184 1.00000000000000e+00 5185 5185 1.00000000000000e+00 5186 5186 1.00000000000000e+00 5187 5187 1.00000000000000e+00 5188 5188 1.00000000000000e+00 5189 5189 1.00000000000000e+00 5190 5190 1.00000000000000e+00 5191 5191 1.00000000000000e+00 5192 5192 1.00000000000000e+00 5193 5193 1.00000000000000e+00 5194 5194 1.00000000000000e+00 5195 5195 1.00000000000000e+00 5196 5196 1.00000000000000e+00 5197 5197 1.00000000000000e+00 5198 5198 1.00000000000000e+00 5199 5199 1.00000000000000e+00 5200 5200 1.00000000000000e+00 5201 5201 1.00000000000000e+00 5202 5202 1.00000000000000e+00 5203 5203 1.00000000000000e+00 5204 5204 1.00000000000000e+00 5205 5205 2.33744226411701e+01 5205 3957 9.82793053106742e-03 5205 3981 6.99586949078880e-02 5205 4005 1.17535898769437e-02 5205 4533 1.17729495477174e-04 5205 4557 1.22248691713119e-01 5205 4581 5.59124452074491e+00 5205 4605 1.08522054118621e+01 5205 4629 1.66127993386264e+00 5205 4653 7.01132519780422e-04 5205 5133 4.19351447657615e-04 5205 5157 3.04211210513155e-01 5205 5181 6.71549843465462e+00 5205 5229 1.00664315766853e+01 5205 5253 3.28881041915943e-01 5205 5277 1.38667055159876e-04 5205 5733 1.11714081298826e-04 5205 5757 1.45180600441261e-01 5205 5781 2.39184467225707e+00 5205 5805 5.30068757924905e+00 5205 5829 2.75103404825551e+00 5205 5853 1.65911619907656e-01 5205 5877 2.73574244309962e-04 5205 6333 1.30211113888131e-05 5205 6357 2.98338614606087e-03 5205 6381 1.24157463156090e-01 5205 6405 3.70222890871767e-01 5205 6429 1.30468906119894e-01 5205 6453 3.49349886848909e-03 5205 6477 1.44369951344170e-07 5205 6957 9.53315919924690e-07 5205 6981 1.31358384121021e-04 5205 7005 1.66440736458125e-04 5205 7029 2.20082275981342e-04 5205 7053 1.53658882619258e-05 5205 15168 -3.72128208243907e-02 5205 15192 -1.71458500707122e+00 5205 15216 -9.15748002497584e+00 5205 15240 -1.36812044076589e+01 5205 15264 -5.61186521115557e+00 5205 15288 -7.26009893525010e-01 5205 15312 -9.96711146675240e-03 5205 15576 -3.65312941816130e-02 5205 15600 -1.55811480797781e+00 5205 15624 -8.15750338257099e+00 5205 15648 -1.21491661808585e+01 5205 15672 -5.86735061115216e+00 5205 15696 -9.00513750001290e-01 5205 15720 -1.38478634824625e-02 5205 15984 -6.49201867337133e-03 5205 16008 -3.92717788799692e-01 5205 16032 -2.24353417678795e+00 5205 16056 -3.72294246617872e+00 5205 16080 -1.87862984396718e+00 5205 16104 -2.94052989407066e-01 5205 16128 -4.50836102338906e-03 5205 16392 -3.69013968260154e-04 5205 16416 -5.38648376009536e-02 5205 16440 -3.41170327114196e-01 5205 16464 -6.13134529254237e-01 5205 16488 -2.74822116270487e-01 5205 16512 -3.78886813069669e-02 5205 16536 -5.31919679444265e-04 5205 16824 -5.47483143415965e-04 5205 16848 -3.33212378989233e-03 5205 16872 -5.13431393213654e-03 5205 16896 -1.21445491145518e-03 5205 16920 -1.80659238066759e-05 5206 5206 1.00000000000000e+00 5207 5207 1.00000000000000e+00 5208 5208 1.00000000000000e+00 5209 5209 1.00000000000000e+00 5210 5210 1.00000000000000e+00 5211 5211 1.00000000000000e+00 5212 5212 1.00000000000000e+00 5213 5213 1.00000000000000e+00 5214 5214 1.00000000000000e+00 5215 5215 1.00000000000000e+00 5216 5216 1.00000000000000e+00 5217 5217 1.00000000000000e+00 5218 5218 1.00000000000000e+00 5219 5219 1.00000000000000e+00 5220 5220 1.00000000000000e+00 5221 5221 1.00000000000000e+00 5222 5222 1.00000000000000e+00 5223 5223 1.00000000000000e+00 5224 5224 1.00000000000000e+00 5225 5225 1.00000000000000e+00 5226 5226 1.00000000000000e+00 5227 5227 1.00000000000000e+00 5228 5228 1.00000000000000e+00 5229 5229 2.32800694414847e+01 5229 3957 2.76965240371850e-07 5229 3981 7.12317907240396e-04 5229 4005 1.81867178720743e-04 5229 4557 2.50863875796691e-04 5229 4581 2.26802376575185e-01 5229 4605 2.82246097617273e+00 5229 4629 1.31811892162331e+00 5229 4653 3.30908086177553e-03 5229 5157 3.22067592846326e-04 5229 5181 3.91337936004932e-01 5229 5205 1.00664315766853e+01 5229 5253 6.11383506306121e+00 5229 5277 4.59222211420520e-02 5229 5757 2.22694656811323e-04 5229 5781 9.66358510578628e-02 5229 5805 2.47430333521989e+00 5229 5829 9.48469133812500e+00 5229 5853 6.37363411517367e+00 5229 5877 1.56701631720266e-01 5229 6357 7.65518854573800e-06 5229 6381 6.61404141397703e-03 5229 6405 1.14640260342687e-01 5229 6429 2.56110343441907e-01 5229 6453 1.11544915246484e-01 5229 6477 8.22857654823547e-03 5229 7005 1.09163930156518e-04 5229 7029 7.01342460993407e-04 5229 7053 9.87647472616876e-05 5229 7077 5.17228162006526e-06 5229 15192 -2.35820716352033e-02 5229 15216 -1.26735440242569e+00 5229 15240 -7.25120728299911e+00 5229 15264 -1.34003793834153e+01 5229 15288 -1.09254701506263e+01 5229 15312 -2.28074346771652e+00 5229 15336 -4.88682978709450e-02 5229 15600 -1.30329133732079e-02 5229 15624 -7.88820640174525e-01 5229 15648 -4.98769432682711e+00 5229 15672 -1.01403827040808e+01 5229 15696 -7.22856710572116e+00 5229 15720 -1.42156879861830e+00 5229 15744 -3.23742370319457e-02 5229 16008 -3.54822158744661e-04 5229 16032 -5.62077263860387e-02 5229 16056 -4.87838300554062e-01 5229 16080 -1.20726376709728e+00 5229 16104 -5.87225973958005e-01 5229 16128 -8.82386895391259e-02 5229 16152 -2.27056743930506e-03 5229 16440 -3.19873872226569e-03 5229 16464 -2.65648743547440e-02 5229 16488 -6.04023209590308e-02 5229 16512 -2.22660675726956e-02 5229 16536 -2.12602681745391e-03 5229 16560 -5.30610853420270e-07 5230 5230 1.00000000000000e+00 5231 5231 1.00000000000000e+00 5232 5232 1.00000000000000e+00 5233 5233 1.00000000000000e+00 5234 5234 1.00000000000000e+00 5235 5235 1.00000000000000e+00 5236 5236 1.00000000000000e+00 5237 5237 1.00000000000000e+00 5238 5238 1.00000000000000e+00 5239 5239 1.00000000000000e+00 5240 5240 1.00000000000000e+00 5241 5241 1.00000000000000e+00 5242 5242 1.00000000000000e+00 5243 5243 1.00000000000000e+00 5244 5244 1.00000000000000e+00 5245 5245 1.00000000000000e+00 5246 5246 1.00000000000000e+00 5247 5247 1.00000000000000e+00 5248 5248 1.00000000000000e+00 5249 5249 1.00000000000000e+00 5250 5250 1.00000000000000e+00 5251 5251 1.00000000000000e+00 5252 5252 1.00000000000000e+00 5253 5253 6.60889732475962e+00 5253 4581 4.05234314351900e-08 5253 4605 3.01114647711887e-02 5253 4629 6.30109354465539e-02 5253 4653 6.42960599027278e-04 5253 5157 2.85680000000000e-16 5253 5181 1.19958834153319e-04 5253 5205 3.28881041915943e-01 5253 5229 6.11383506306121e+00 5253 5277 1.83378625356760e-01 5253 5757 1.94460000000000e-16 5253 5781 2.34927877494202e-04 5253 5805 1.15120413221383e-01 5253 5829 4.37323350928703e+00 5253 5853 8.47559702554776e+00 5253 5877 1.35780839835573e+00 5253 5901 1.18136420444717e-02 5253 6381 3.01784208052608e-06 5253 6405 3.27777054418457e-03 5253 6429 9.56967206476602e-02 5253 6453 2.78118470954539e-01 5253 6477 1.48862480811000e-01 5253 6501 7.34843574811701e-03 5253 7005 1.82413221143836e-06 5253 7029 1.81715951490790e-05 5253 7053 3.23989771589693e-04 5253 7077 2.39044322190822e-04 5253 7101 1.36192251944497e-06 5253 15216 -3.09907564292870e-07 5253 15240 -2.06381545340391e-01 5253 15264 -2.84652083002152e+00 5253 15288 -8.88650814138446e+00 5253 15312 -4.44043579606696e+00 5253 15336 -7.35786296464280e-01 5253 15360 -3.49139124709050e-02 5253 15624 -1.55434573406250e-07 5253 15648 -1.27735214090195e-01 5253 15672 -1.64156849315699e+00 5253 15696 -4.99269484567999e+00 5253 15720 -2.51925394366346e+00 5253 15744 -4.17890200362028e-01 5253 15768 -1.88624550732978e-02 5253 16032 -1.37368931380000e-10 5253 16056 -7.04889861285746e-03 5253 16080 -6.26822243240944e-02 5253 16104 -1.57674992663913e-01 5253 16128 -8.56064705006728e-02 5253 16152 -1.42858512538457e-02 5253 16176 -4.01571096527226e-04 5253 16464 -9.74644038470951e-06 5253 16488 -8.30543836998000e-05 5253 16512 -1.86284564303339e-04 5253 16536 -4.51231632600868e-05 5253 16560 -2.63635274781210e-07 5254 5254 1.00000000000000e+00 5255 5255 1.00000000000000e+00 5256 5256 1.00000000000000e+00 5257 5257 1.00000000000000e+00 5258 5258 1.00000000000000e+00 5259 5259 1.00000000000000e+00 5260 5260 1.00000000000000e+00 5261 5261 1.00000000000000e+00 5262 5262 1.00000000000000e+00 5263 5263 1.00000000000000e+00 5264 5264 1.00000000000000e+00 5265 5265 1.00000000000000e+00 5266 5266 1.00000000000000e+00 5267 5267 1.00000000000000e+00 5268 5268 1.00000000000000e+00 5269 5269 1.00000000000000e+00 5270 5270 1.00000000000000e+00 5271 5271 1.00000000000000e+00 5272 5272 1.00000000000000e+00 5273 5273 1.00000000000000e+00 5274 5274 1.00000000000000e+00 5275 5275 1.00000000000000e+00 5276 5276 1.00000000000000e+00 5277 5277 1.03178973644449e+00 5277 4605 5.75738267860000e-09 5277 4629 2.68083483975976e-05 5277 4653 2.80088098136378e-06 5277 5205 1.38667055159876e-04 5277 5229 4.59222211420520e-02 5277 5253 1.83378625356760e-01 5277 5805 1.48757014544797e-04 5277 5829 5.71113368287830e-02 5277 5853 6.74357737899612e-01 5277 5877 4.31840613477265e-01 5277 5901 1.48846185431154e-02 5277 6405 6.07076150326429e-06 5277 6429 2.48600030779952e-03 5277 6453 4.82735193069488e-02 5277 6477 9.43953024244535e-02 5277 6501 9.22890593949159e-03 5277 7029 4.13083515611090e-07 5277 7053 1.28664970767149e-04 5277 7077 1.95371943844946e-04 5277 7101 1.25052203376219e-06 5277 15264 -1.42105665122836e-02 5277 15288 -1.70854902386417e-01 5277 15312 -5.14197856185756e-01 5277 15336 -2.89759613634650e-01 5277 15360 -4.39367443243418e-02 5277 15672 -7.39950019853679e-03 5277 15696 -9.08396678635025e-02 5277 15720 -2.75622480796982e-01 5277 15744 -1.54266916353449e-01 5277 15768 -2.32563123210234e-02 5277 16080 -8.40619835414287e-05 5277 16104 -1.54634762008399e-03 5277 16128 -5.29244362974382e-03 5277 16152 -2.68203129603541e-03 5277 16176 -3.67982902529285e-04 5278 5278 1.00000000000000e+00 5279 5279 1.00000000000000e+00 5280 5280 1.00000000000000e+00 5281 5281 1.00000000000000e+00 5282 5282 1.00000000000000e+00 5283 5283 1.00000000000000e+00 5284 5284 1.00000000000000e+00 5285 5285 1.00000000000000e+00 5286 5286 1.00000000000000e+00 5287 5287 1.00000000000000e+00 5288 5288 1.00000000000000e+00 5289 5289 1.00000000000000e+00 5290 5290 1.00000000000000e+00 5291 5291 1.00000000000000e+00 5292 5292 1.00000000000000e+00 5293 5293 1.00000000000000e+00 5294 5294 1.00000000000000e+00 5295 5295 1.00000000000000e+00 5296 5296 1.00000000000000e+00 5297 5297 1.00000000000000e+00 5298 5298 1.00000000000000e+00 5299 5299 1.00000000000000e+00 5300 5300 1.00000000000000e+00 5301 5301 1.00000000000000e+00 5302 5302 1.00000000000000e+00 5303 5303 1.00000000000000e+00 5304 5304 1.00000000000000e+00 5305 5305 1.00000000000000e+00 5306 5306 1.00000000000000e+00 5307 5307 1.00000000000000e+00 5308 5308 1.00000000000000e+00 5309 5309 1.00000000000000e+00 5310 5310 1.00000000000000e+00 5311 5311 1.00000000000000e+00 5312 5312 1.00000000000000e+00 5313 5313 1.00000000000000e+00 5314 5314 1.00000000000000e+00 5315 5315 1.00000000000000e+00 5316 5316 1.00000000000000e+00 5317 5317 1.00000000000000e+00 5318 5318 1.00000000000000e+00 5319 5319 1.00000000000000e+00 5320 5320 1.00000000000000e+00 5321 5321 1.00000000000000e+00 5322 5322 1.00000000000000e+00 5323 5323 1.00000000000000e+00 5324 5324 1.00000000000000e+00 5325 5325 1.00000000000000e+00 5326 5326 1.00000000000000e+00 5327 5327 1.00000000000000e+00 5328 5328 1.00000000000000e+00 5329 5329 1.00000000000000e+00 5330 5330 1.00000000000000e+00 5331 5331 1.00000000000000e+00 5332 5332 1.00000000000000e+00 5333 5333 1.00000000000000e+00 5334 5334 1.00000000000000e+00 5335 5335 1.00000000000000e+00 5336 5336 1.00000000000000e+00 5337 5337 1.00000000000000e+00 5338 5338 1.00000000000000e+00 5339 5339 1.00000000000000e+00 5340 5340 1.00000000000000e+00 5341 5341 1.00000000000000e+00 5342 5342 1.00000000000000e+00 5343 5343 1.00000000000000e+00 5344 5344 1.00000000000000e+00 5345 5345 1.00000000000000e+00 5346 5346 1.00000000000000e+00 5347 5347 1.00000000000000e+00 5348 5348 1.00000000000000e+00 5349 5349 1.00000000000000e+00 5350 5350 1.00000000000000e+00 5351 5351 1.00000000000000e+00 5352 5352 1.00000000000000e+00 5353 5353 1.00000000000000e+00 5354 5354 1.00000000000000e+00 5355 5355 1.00000000000000e+00 5356 5356 1.00000000000000e+00 5357 5357 1.00000000000000e+00 5358 5358 1.00000000000000e+00 5359 5359 1.00000000000000e+00 5360 5360 1.00000000000000e+00 5361 5361 1.00000000000000e+00 5362 5362 1.00000000000000e+00 5363 5363 1.00000000000000e+00 5364 5364 1.00000000000000e+00 5365 5365 1.00000000000000e+00 5366 5366 1.00000000000000e+00 5367 5367 1.00000000000000e+00 5368 5368 1.00000000000000e+00 5369 5369 1.00000000000000e+00 5370 5370 1.00000000000000e+00 5371 5371 1.00000000000000e+00 5372 5372 1.00000000000000e+00 5373 5373 1.00000000000000e+00 5374 5374 1.00000000000000e+00 5375 5375 1.00000000000000e+00 5376 5376 1.00000000000000e+00 5377 5377 1.00000000000000e+00 5378 5378 1.00000000000000e+00 5379 5379 1.00000000000000e+00 5380 5380 1.00000000000000e+00 5381 5381 1.00000000000000e+00 5382 5382 1.00000000000000e+00 5383 5383 1.00000000000000e+00 5384 5384 1.00000000000000e+00 5385 5385 1.00000000000000e+00 5386 5386 1.00000000000000e+00 5387 5387 1.00000000000000e+00 5388 5388 1.00000000000000e+00 5389 5389 1.00000000000000e+00 5390 5390 1.00000000000000e+00 5391 5391 1.00000000000000e+00 5392 5392 1.00000000000000e+00 5393 5393 1.00000000000000e+00 5394 5394 1.00000000000000e+00 5395 5395 1.00000000000000e+00 5396 5396 1.00000000000000e+00 5397 5397 1.00000000000000e+00 5398 5398 1.00000000000000e+00 5399 5399 1.00000000000000e+00 5400 5400 1.00000000000000e+00 5401 5401 1.00000000000000e+00 5402 5402 1.00000000000000e+00 5403 5403 1.00000000000000e+00 5404 5404 1.00000000000000e+00 5405 5405 1.00000000000000e+00 5406 5406 1.00000000000000e+00 5407 5407 1.00000000000000e+00 5408 5408 1.00000000000000e+00 5409 5409 1.00000000000000e+00 5410 5410 1.00000000000000e+00 5411 5411 1.00000000000000e+00 5412 5412 1.00000000000000e+00 5413 5413 1.00000000000000e+00 5414 5414 1.00000000000000e+00 5415 5415 1.00000000000000e+00 5416 5416 1.00000000000000e+00 5417 5417 1.00000000000000e+00 5418 5418 1.00000000000000e+00 5419 5419 1.00000000000000e+00 5420 5420 1.00000000000000e+00 5421 5421 1.00000000000000e+00 5422 5422 1.00000000000000e+00 5423 5423 1.00000000000000e+00 5424 5424 1.00000000000000e+00 5425 5425 1.00000000000000e+00 5426 5426 1.00000000000000e+00 5427 5427 1.00000000000000e+00 5428 5428 1.00000000000000e+00 5429 5429 1.00000000000000e+00 5430 5430 1.00000000000000e+00 5431 5431 1.00000000000000e+00 5432 5432 1.00000000000000e+00 5433 5433 1.00000000000000e+00 5434 5434 1.00000000000000e+00 5435 5435 1.00000000000000e+00 5436 5436 1.00000000000000e+00 5437 5437 1.00000000000000e+00 5438 5438 1.00000000000000e+00 5439 5439 1.00000000000000e+00 5440 5440 1.00000000000000e+00 5441 5441 1.00000000000000e+00 5442 5442 1.00000000000000e+00 5443 5443 1.00000000000000e+00 5444 5444 1.00000000000000e+00 5445 5445 1.00000000000000e+00 5446 5446 1.00000000000000e+00 5447 5447 1.00000000000000e+00 5448 5448 1.00000000000000e+00 5449 5449 1.00000000000000e+00 5450 5450 1.00000000000000e+00 5451 5451 1.00000000000000e+00 5452 5452 1.00000000000000e+00 5453 5453 1.00000000000000e+00 5454 5454 1.00000000000000e+00 5455 5455 1.00000000000000e+00 5456 5456 1.00000000000000e+00 5457 5457 1.00000000000000e+00 5458 5458 1.00000000000000e+00 5459 5459 1.00000000000000e+00 5460 5460 1.00000000000000e+00 5461 5461 1.00000000000000e+00 5462 5462 1.00000000000000e+00 5463 5463 1.00000000000000e+00 5464 5464 1.00000000000000e+00 5465 5465 1.00000000000000e+00 5466 5466 1.00000000000000e+00 5467 5467 1.00000000000000e+00 5468 5468 1.00000000000000e+00 5469 5469 1.00000000000000e+00 5470 5470 1.00000000000000e+00 5471 5471 1.00000000000000e+00 5472 5472 1.00000000000000e+00 5473 5473 1.00000000000000e+00 5474 5474 1.00000000000000e+00 5475 5475 1.00000000000000e+00 5476 5476 1.00000000000000e+00 5477 5477 1.00000000000000e+00 5478 5478 1.00000000000000e+00 5479 5479 1.00000000000000e+00 5480 5480 1.00000000000000e+00 5481 5481 1.00000000000000e+00 5482 5482 1.00000000000000e+00 5483 5483 1.00000000000000e+00 hypre-2.33.0/src/test/TEST_ij/data/tucker21935/IJ.A.00001000066400000000000000000020174551477326011500216360ustar00rootroot000000000000005484 10967 5484 10967 5484 5484 1.00000000000000e+00 5485 5485 1.00000000000000e+00 5486 5486 1.00000000000000e+00 5487 5487 1.00000000000000e+00 5488 5488 1.00000000000000e+00 5489 5489 1.00000000000000e+00 5490 5490 1.00000000000000e+00 5491 5491 1.00000000000000e+00 5492 5492 1.00000000000000e+00 5493 5493 1.00000000000000e+00 5494 5494 1.00000000000000e+00 5495 5495 1.00000000000000e+00 5496 5496 1.00000000000000e+00 5497 5497 1.00000000000000e+00 5498 5498 1.00000000000000e+00 5499 5499 1.00000000000000e+00 5500 5500 1.00000000000000e+00 5501 5501 1.00000000000000e+00 5502 5502 1.00000000000000e+00 5503 5503 1.00000000000000e+00 5504 5504 1.00000000000000e+00 5505 5505 1.00000000000000e+00 5506 5506 1.00000000000000e+00 5507 5507 1.00000000000000e+00 5508 5508 1.00000000000000e+00 5509 5509 1.00000000000000e+00 5510 5510 1.00000000000000e+00 5511 5511 1.00000000000000e+00 5512 5512 1.00000000000000e+00 5513 5513 1.00000000000000e+00 5514 5514 1.00000000000000e+00 5515 5515 1.00000000000000e+00 5516 5516 1.00000000000000e+00 5517 5517 1.00000000000000e+00 5518 5518 1.00000000000000e+00 5519 5519 1.00000000000000e+00 5520 5520 1.00000000000000e+00 5521 5521 1.00000000000000e+00 5522 5522 1.00000000000000e+00 5523 5523 1.00000000000000e+00 5524 5524 1.00000000000000e+00 5525 5525 1.00000000000000e+00 5526 5526 1.00000000000000e+00 5527 5527 1.00000000000000e+00 5528 5528 1.00000000000000e+00 5529 5529 1.00000000000000e+00 5530 5530 1.00000000000000e+00 5531 5531 1.00000000000000e+00 5532 5532 1.00000000000000e+00 5533 5533 1.00000000000000e+00 5534 5534 1.00000000000000e+00 5535 5535 1.00000000000000e+00 5536 5536 1.00000000000000e+00 5537 5537 1.00000000000000e+00 5538 5538 1.00000000000000e+00 5539 5539 1.00000000000000e+00 5540 5540 1.00000000000000e+00 5541 5541 1.00000000000000e+00 5542 5542 1.00000000000000e+00 5543 5543 1.00000000000000e+00 5544 5544 1.00000000000000e+00 5545 5545 1.00000000000000e+00 5546 5546 1.00000000000000e+00 5547 5547 1.00000000000000e+00 5548 5548 1.00000000000000e+00 5549 5549 1.00000000000000e+00 5550 5550 1.00000000000000e+00 5551 5551 1.00000000000000e+00 5552 5552 1.00000000000000e+00 5553 5553 1.00000000000000e+00 5554 5554 1.00000000000000e+00 5555 5555 1.00000000000000e+00 5556 5556 1.00000000000000e+00 5557 5557 1.00000000000000e+00 5558 5558 1.00000000000000e+00 5559 5559 1.00000000000000e+00 5560 5560 1.00000000000000e+00 5561 5561 1.00000000000000e+00 5562 5562 1.00000000000000e+00 5563 5563 1.00000000000000e+00 5564 5564 1.00000000000000e+00 5565 4389 6.84807729967536e-04 5565 4413 7.12317907240384e-04 5565 4437 4.08628167584000e-09 5565 4965 5.96412141363904e-03 5565 4989 2.51332964486052e-01 5565 5013 6.99586949078867e-02 5565 5037 6.46479002001122e-05 5565 5565 1.87999395128717e+00 5565 5589 3.00812933496051e+00 5565 5613 2.29394337282817e-01 5565 5637 4.20437398965698e-04 5565 6141 1.67498720578736e-03 5565 6165 2.24680920254790e+00 5565 6189 2.93990643686117e+00 5565 6213 7.91253656423209e-02 5565 6237 9.38864787359718e-05 5565 6741 3.63532297866496e-03 5565 6765 1.92744512039674e-01 5565 6789 1.26642207232515e-01 5565 6813 4.48672969599088e-03 5565 7341 2.00195419374265e-06 5565 7365 2.73392609382702e-04 5565 7389 2.27061860767543e-04 5565 7413 1.44666009939139e-06 5565 17448 -2.26063108285774e-02 5565 17472 -1.17009061321144e-02 5565 17496 -1.13643062235917e-04 5565 17856 -3.91858603018188e-01 5565 17880 -2.18132430886971e-01 5565 17904 -6.34375125082210e-03 5565 18264 -1.95058358179336e+00 5565 18288 -1.08493774795168e+00 5565 18312 -3.13274163014294e-02 5565 18672 -3.21770864406448e+00 5565 18696 -1.73811843761454e+00 5565 18720 -3.69326044520842e-02 5565 19080 -8.31443655203374e-01 5565 19104 -4.48334279241382e-01 5565 19128 -9.31784332562705e-03 5565 19488 -2.72999557635261e-02 5565 19512 -1.51031657139670e-02 5565 19536 -4.15196523486831e-04 5566 5566 1.00000000000000e+00 5567 5567 1.00000000000000e+00 5568 5568 1.00000000000000e+00 5569 5569 1.00000000000000e+00 5570 5570 1.00000000000000e+00 5571 5571 1.00000000000000e+00 5572 5572 1.00000000000000e+00 5573 5573 1.00000000000000e+00 5574 5574 1.00000000000000e+00 5575 5575 1.00000000000000e+00 5576 5576 1.00000000000000e+00 5577 5577 1.00000000000000e+00 5578 5578 1.00000000000000e+00 5579 5579 1.00000000000000e+00 5580 5580 1.00000000000000e+00 5581 5581 1.00000000000000e+00 5582 5582 1.00000000000000e+00 5583 5583 1.00000000000000e+00 5584 5584 1.00000000000000e+00 5585 5585 1.00000000000000e+00 5586 5586 1.00000000000000e+00 5587 5587 1.00000000000000e+00 5588 5588 1.00000000000000e+00 5589 3789 5.88890614340000e-09 5589 3813 4.05234314351900e-08 5589 4389 1.07199625704486e-01 5589 4413 2.26802376575180e-01 5589 4437 6.97895973065605e-03 5589 4461 1.31669194616127e-06 5589 4965 5.92060211873675e-02 5589 4989 8.41036131317700e+00 5589 5013 5.59124452074484e+00 5589 5037 1.05217503878584e-01 5589 5061 1.35092304002419e-04 5589 5589 2.50014043927913e+01 5589 5565 3.00812933496051e+00 5589 5613 7.59651806450859e+00 5589 5637 2.76348776783459e-01 5589 5661 7.57288505340474e-04 5589 6141 9.81314367921062e-04 5589 6165 4.59301705652267e+00 5589 6189 9.74156077354714e+00 5589 6213 2.18313486092391e+00 5589 6237 1.34764034047411e-01 5589 6261 4.63231239090587e-05 5589 6741 2.12411346181328e-03 5589 6765 2.69689879613932e-01 5589 6789 3.65589698849336e-01 5589 6813 1.05567678610662e-01 5589 6837 6.21683783583436e-03 5589 6861 8.53127317558100e-08 5589 7341 1.18392864123253e-06 5589 7365 2.02409678011765e-04 5589 7389 2.83309791446211e-04 5589 7413 2.51116470786617e-04 5589 7437 1.01551698587118e-06 5589 7461 5.21894530000000e-13 5589 7989 3.80000000000000e-19 5589 8013 4.40000000000000e-19 5589 17040 -8.48984408304495e-02 5589 17064 -5.65856354692896e-02 5589 17088 -4.21211943045388e-03 5589 17112 -4.66156117325989e-05 5589 17448 -2.49861912557888e+00 5589 17472 -1.73985483446226e+00 5589 17496 -1.70527780808149e-01 5589 17520 -8.17707393505380e-03 5589 17856 -1.11286651487522e+01 5589 17880 -8.15239410774455e+00 5589 17904 -9.67865603429273e-01 5589 17928 -6.14995665721261e-02 5589 17952 -5.41995950758400e-07 5589 18264 -1.31480554177425e+01 5589 18288 -1.05430018435051e+01 5589 18312 -1.62177710123620e+00 5589 18336 -1.31335544505487e-01 5589 18360 -2.39915213309624e-06 5589 18672 -7.85719513899019e+00 5589 18696 -5.50103384768722e+00 5589 18720 -6.38758052884531e-01 5589 18744 -5.10221569510300e-02 5589 18768 -1.46666927100900e-06 5589 19080 -1.42258422170922e+00 5589 19104 -9.00313035298752e-01 5589 19128 -7.39964518854127e-02 5589 19152 -5.38291298606242e-03 5589 19176 -2.31168330062650e-07 5589 19488 -1.60538004493392e-02 5589 19512 -9.46517302950717e-03 5589 19536 -4.10935087373680e-04 5589 19560 -7.46393400000000e-14 5590 5590 1.00000000000000e+00 5591 5591 1.00000000000000e+00 5592 5592 1.00000000000000e+00 5593 5593 1.00000000000000e+00 5594 5594 1.00000000000000e+00 5595 5595 1.00000000000000e+00 5596 5596 1.00000000000000e+00 5597 5597 1.00000000000000e+00 5598 5598 1.00000000000000e+00 5599 5599 1.00000000000000e+00 5600 5600 1.00000000000000e+00 5601 5601 1.00000000000000e+00 5602 5602 1.00000000000000e+00 5603 5603 1.00000000000000e+00 5604 5604 1.00000000000000e+00 5605 5605 1.00000000000000e+00 5606 5606 1.00000000000000e+00 5607 5607 1.00000000000000e+00 5608 5608 1.00000000000000e+00 5609 5609 1.00000000000000e+00 5610 5610 1.00000000000000e+00 5611 5611 1.00000000000000e+00 5612 5612 1.00000000000000e+00 5613 3789 3.75230044358600e-08 5613 3813 1.19958834153309e-04 5613 3837 1.28078995586533e-04 5613 3861 1.08879937028275e-06 5613 4389 9.52927344201592e-02 5613 4413 3.91337936004920e-01 5613 4437 9.18742608481252e-02 5613 4461 4.00256385214300e-03 5613 4485 2.79430157966997e-06 5613 4965 1.04734868936986e-02 5613 4989 3.98787308235858e+00 5613 5013 6.71549843465456e+00 5613 5037 2.38090503758765e+00 5613 5061 1.36104287771051e-01 5613 5085 2.62739118781422e-04 5613 5613 1.59550388736787e+01 5613 5565 2.29394337282817e-01 5613 5589 7.59651806450859e+00 5613 5637 6.56471963283404e+00 5613 5661 2.81822420274195e-01 5613 5685 5.56133606008067e-04 5613 6141 4.47785888509600e-08 5613 6165 1.34864340673856e-01 5613 6189 2.30610993286473e+00 5613 6213 6.41976470167598e+00 5613 6237 2.49741496761035e+00 5613 6261 1.20227799418495e-01 5613 6285 1.59114016612103e-05 5613 6741 1.55053844990900e-08 5613 6765 5.64636705605440e-03 5613 6789 9.38903743213104e-02 5613 6813 3.22180068646858e-01 5613 6837 1.30553376912940e-01 5613 6861 4.01865511835699e-03 5613 6885 7.94031900597660e-07 5613 7341 1.81280000000000e-16 5613 7365 3.96083470000000e-13 5613 7389 1.16427669681290e-04 5613 7413 5.43624149202168e-04 5613 7437 8.34240246487315e-05 5613 7461 1.22408211906470e-06 5613 16632 -3.57181806112185e-04 5613 16656 -2.60936372640850e-03 5613 16680 -5.08853050101885e-03 5613 16704 -1.21570673088845e-03 5613 16728 -8.76502208940866e-06 5613 17040 -1.56683939199436e-01 5613 17064 -3.49286089514230e-01 5613 17088 -4.36925577003898e-01 5613 17112 -1.15666008616456e-01 5613 17136 -5.05902499824330e-03 5613 17448 -1.71003083767366e+00 5613 17472 -3.32914583511335e+00 5613 17496 -3.48549779286624e+00 5613 17520 -9.54578846059258e-01 5613 17544 -5.53882674114008e-02 5613 17568 -1.05957427505539e-05 5613 17856 -4.85138247369462e+00 5613 17880 -9.17219547194401e+00 5613 17904 -8.73478129569122e+00 5613 17928 -2.45398170369836e+00 5613 17952 -1.66742076918551e-01 5613 17976 -5.77838800737355e-05 5613 18264 -2.47152522189262e+00 5613 18288 -5.81223872309199e+00 5613 18312 -6.10453891104451e+00 5613 18336 -1.72986038849148e+00 5613 18360 -1.17769960030617e-01 5613 18384 -7.21993790366338e-05 5613 18672 -4.08749207963302e-01 5613 18696 -1.13270057768639e+00 5613 18720 -1.23592080630087e+00 5613 18744 -3.40186827062606e-01 5613 18768 -2.11921539795365e-02 5613 18792 -1.54009090715200e-05 5613 19080 -1.68082945346771e-02 5613 19104 -4.59803680636693e-02 5613 19128 -4.35511837740988e-02 5613 19152 -9.40248882104703e-03 5613 19176 -1.52153242486526e-04 5613 19488 -1.64223745000000e-12 5613 19512 -6.23034231000000e-12 5613 19536 -1.54549245000000e-12 5614 5614 1.00000000000000e+00 5615 5615 1.00000000000000e+00 5616 5616 1.00000000000000e+00 5617 5617 1.00000000000000e+00 5618 5618 1.00000000000000e+00 5619 5619 1.00000000000000e+00 5620 5620 1.00000000000000e+00 5621 5621 1.00000000000000e+00 5622 5622 1.00000000000000e+00 5623 5623 1.00000000000000e+00 5624 5624 1.00000000000000e+00 5625 5625 1.00000000000000e+00 5626 5626 1.00000000000000e+00 5627 5627 1.00000000000000e+00 5628 5628 1.00000000000000e+00 5629 5629 1.00000000000000e+00 5630 5630 1.00000000000000e+00 5631 5631 1.00000000000000e+00 5632 5632 1.00000000000000e+00 5633 5633 1.00000000000000e+00 5634 5634 1.00000000000000e+00 5635 5635 1.00000000000000e+00 5636 5636 1.00000000000000e+00 5637 3789 5.61618000186800e-08 5637 3813 2.34927877494182e-04 5637 3837 4.71482473101207e-04 5637 3861 2.10763663817745e-05 5637 3885 8.42870972887720e-07 5637 4389 3.56458842680582e-03 5637 4413 9.66358510578611e-02 5637 4437 3.19722565471041e-01 5637 4461 1.29959229577417e-01 5637 4485 4.93536473027629e-03 5637 4509 4.10056075839950e-07 5637 4965 2.18137199729478e-05 5637 4989 9.43923886567082e-02 5637 5013 2.39184467225705e+00 5637 5037 6.44362061844826e+00 5637 5061 2.38740455251694e+00 5637 5085 1.06238221895662e-01 5637 5109 3.16321383374538e-04 5637 5637 1.55068125774854e+01 5637 5565 4.20437398965698e-04 5637 5589 2.76348776783459e-01 5637 5613 6.56471963283404e+00 5637 5661 5.68740314343212e+00 5637 5685 2.74627686916370e-01 5637 5709 2.80163312061418e-04 5637 6141 4.22030000000000e-16 5637 6165 1.97291361919331e-04 5637 6189 1.41675838469122e-01 5637 6213 2.48928706355115e+00 5637 6237 5.78776746291141e+00 5637 6261 2.14319633633399e+00 5637 6285 1.07044420043834e-01 5637 6309 3.57994833680473e-05 5637 6741 1.50650000000000e-16 5637 6765 1.54657054999062e-06 5637 6789 4.36077583164108e-03 5637 6813 1.28294801162542e-01 5637 6837 2.78594960790360e-01 5637 6861 1.04998272549907e-01 5637 6885 3.05267476070686e-03 5637 6909 1.89681802581380e-06 5637 7389 1.67959048382320e-06 5637 7413 3.05226841770275e-05 5637 7437 3.76580666462597e-04 5637 7461 2.90316706081261e-04 5637 7485 1.37306196538332e-06 5637 16248 -6.36605257387310e-07 5637 16272 -1.71530090327611e-05 5637 16296 -5.96109218410207e-05 5637 16320 -1.67984462863557e-05 5637 16344 -5.47964570785970e-07 5637 16632 -6.75108151057735e-04 5637 16656 -2.75544390262802e-02 5637 16680 -1.32485464574336e-01 5637 16704 -1.56845308931475e-01 5637 16728 -4.20503355344793e-02 5637 16752 -2.41400275343918e-03 5637 17040 -1.67149292436564e-02 5637 17064 -4.28266688460056e-01 5637 17088 -1.87406138757866e+00 5637 17112 -2.05289357518910e+00 5637 17136 -5.99376677632776e-01 5637 17160 -4.71831589024726e-02 5637 17184 -2.76739317972472e-05 5637 17448 -7.54624655077900e-02 5637 17472 -1.66495891798112e+00 5637 17496 -6.98854935785902e+00 5637 17520 -7.39535321592706e+00 5637 17544 -2.25808474336955e+00 5637 17568 -2.01108282090793e-01 5637 17592 -2.81844181765467e-04 5637 17856 -8.98711480908165e-02 5637 17880 -1.82669002690140e+00 5637 17904 -7.47852153566612e+00 5637 17928 -7.77456076509330e+00 5637 17952 -2.44933938889463e+00 5637 17976 -2.35359211128363e-01 5637 18000 -7.15434311001538e-04 5637 18264 -2.24860482368026e-02 5637 18288 -5.57018387595858e-01 5637 18312 -2.35758391105404e+00 5637 18336 -2.39601445015478e+00 5637 18360 -7.15791459635713e-01 5637 18384 -6.29703485864395e-02 5637 18408 -1.83814698169986e-04 5637 18672 -9.39185922044165e-04 5637 18696 -4.82939482475489e-02 5637 18720 -2.21176604075135e-01 5637 18744 -2.16482774683166e-01 5637 18768 -5.64564483220393e-02 5637 18792 -3.60383670497819e-03 5637 18816 -3.16656089837683e-06 5637 19080 -4.41669362790000e-09 5637 19104 -8.87003356679482e-05 5637 19128 -3.83180860003058e-04 5637 19152 -2.02465739836171e-04 5637 19176 -2.84457677356835e-05 5638 5638 1.00000000000000e+00 5639 5639 1.00000000000000e+00 5640 5640 1.00000000000000e+00 5641 5641 1.00000000000000e+00 5642 5642 1.00000000000000e+00 5643 5643 1.00000000000000e+00 5644 5644 1.00000000000000e+00 5645 5645 1.00000000000000e+00 5646 5646 1.00000000000000e+00 5647 5647 1.00000000000000e+00 5648 5648 1.00000000000000e+00 5649 5649 1.00000000000000e+00 5650 5650 1.00000000000000e+00 5651 5651 1.00000000000000e+00 5652 5652 1.00000000000000e+00 5653 5653 1.00000000000000e+00 5654 5654 1.00000000000000e+00 5655 5655 1.00000000000000e+00 5656 5656 1.00000000000000e+00 5657 5657 1.00000000000000e+00 5658 5658 1.00000000000000e+00 5659 5659 1.00000000000000e+00 5660 5660 1.00000000000000e+00 5661 3789 1.65361740000000e-13 5661 3813 3.01784208052619e-06 5661 3837 1.01435749871596e-04 5661 3861 5.42606048985633e-04 5661 3885 1.33659463189934e-04 5661 4389 4.13226415410000e-10 5661 4413 6.61404141397720e-03 5661 4437 1.33641182211232e-01 5661 4461 3.01419830152279e-01 5661 4485 8.99707006266845e-02 5661 4509 5.39569286250705e-03 5661 4533 6.72456755290744e-06 5661 4989 6.65602558937116e-05 5661 5013 1.24157463156090e-01 5661 5037 2.39295414762298e+00 5661 5061 5.50681995523432e+00 5661 5085 2.25961989461752e+00 5661 5109 1.00146710530681e-01 5661 5133 2.46473168732270e-04 5661 5661 1.42155940525200e+01 5661 5589 7.57288505340474e-04 5661 5613 2.81822420274195e-01 5661 5637 5.68740314343212e+00 5661 5685 5.17797855006935e+00 5661 5709 2.82210798877976e-01 5661 5733 1.40080260134690e-04 5661 6189 1.65828879302890e-04 5661 6213 1.24288913731445e-01 5661 6237 2.15188580318620e+00 5661 6261 5.19496917949438e+00 5661 6285 2.08683207293720e+00 5661 6309 1.00625901988247e-01 5661 6333 7.84494215473652e-05 5661 6789 7.38583222521842e-06 5661 6813 3.81948091007359e-03 5661 6837 9.20977706503654e-02 5661 6861 2.80488210935187e-01 5661 6885 1.06392574754094e-01 5661 6909 2.37454150425827e-03 5661 6933 1.59094207830700e-06 5661 7413 1.84048516669520e-07 5661 7437 1.56645013647059e-04 5661 7461 1.84292133188979e-04 5661 7485 1.06435412031523e-04 5661 7509 1.13484136129365e-05 5661 16248 -2.55024749279354e-06 5661 16272 -2.24873890229679e-03 5661 16296 -1.68136550660145e-02 5661 16320 -3.45663066015175e-02 5661 16344 -1.14567772184783e-02 5661 16368 -8.99956012314765e-04 5661 16632 -1.98860187077000e-09 5661 16656 -8.22518959263143e-03 5661 16680 -1.53167292222670e-01 5661 16704 -6.98575913356125e-01 5661 16728 -9.93116571711667e-01 5661 16752 -3.52156070294230e-01 5661 16776 -3.58048723393150e-02 5661 16800 -2.31930704160451e-05 5661 17040 -8.94809260414000e-09 5661 17064 -5.14144086384409e-02 5661 17088 -9.05256029698995e-01 5661 17112 -3.93415720552649e+00 5661 17136 -5.24984454072547e+00 5661 17160 -1.93651044840103e+00 5661 17184 -2.15879675201223e-01 5661 17208 -7.57131174518666e-04 5661 17448 -5.96334235505000e-09 5661 17472 -8.46843250636792e-02 5661 17496 -1.52988192885985e+00 5661 17520 -6.59932721052840e+00 5661 17544 -8.57804786423762e+00 5661 17568 -3.29949882568259e+00 5661 17592 -3.98034187425594e-01 5661 17616 -2.84679740778396e-03 5661 17856 -9.93685121070000e-10 5661 17880 -2.75991069040430e-02 5661 17904 -6.49578675580656e-01 5661 17928 -2.99873944324042e+00 5661 17952 -3.96244886125039e+00 5661 17976 -1.47822609499832e+00 5661 18000 -1.70937578879021e-01 5661 18024 -1.32903395665438e-03 5661 18288 -2.26300359808555e-03 5661 18312 -8.64757018219492e-02 5661 18336 -4.30138184579638e-01 5661 18360 -5.70727423507642e-01 5661 18384 -2.00674644131226e-01 5661 18408 -2.12466860893380e-02 5661 18432 -1.66168765949973e-04 5661 18696 -3.20764573755020e-07 5661 18720 -1.50947173666035e-03 5661 18744 -7.59144487802216e-03 5661 18768 -7.75557904544802e-03 5661 18792 -1.61402046852438e-03 5661 18816 -1.39127671343209e-05 5662 5662 1.00000000000000e+00 5663 5663 1.00000000000000e+00 5664 5664 1.00000000000000e+00 5665 5665 1.00000000000000e+00 5666 5666 1.00000000000000e+00 5667 5667 1.00000000000000e+00 5668 5668 1.00000000000000e+00 5669 5669 1.00000000000000e+00 5670 5670 1.00000000000000e+00 5671 5671 1.00000000000000e+00 5672 5672 1.00000000000000e+00 5673 5673 1.00000000000000e+00 5674 5674 1.00000000000000e+00 5675 5675 1.00000000000000e+00 5676 5676 1.00000000000000e+00 5677 5677 1.00000000000000e+00 5678 5678 1.00000000000000e+00 5679 5679 1.00000000000000e+00 5680 5680 1.00000000000000e+00 5681 5681 1.00000000000000e+00 5682 5682 1.00000000000000e+00 5683 5683 1.00000000000000e+00 5684 5684 1.00000000000000e+00 5685 3837 6.98380998805092e-06 5685 3861 2.64738694593930e-04 5685 3885 1.52045374293928e-04 5685 3909 9.19256200499717e-05 5685 3933 1.74930753381091e-06 5685 4437 5.78011380667543e-03 5685 4461 1.03986644421699e-01 5685 4485 2.94052596094355e-01 5685 4509 1.04894232584914e-01 5685 4533 2.66749886865829e-03 5685 4557 1.29078208718040e-05 5685 5013 1.31358384121015e-04 5685 5037 9.21548851110123e-02 5685 5061 2.25780169589532e+00 5685 5085 5.23127818559829e+00 5685 5109 2.14309867129194e+00 5685 5133 1.09523577382535e-01 5685 5157 1.20323550370871e-04 5685 5685 1.38340505320784e+01 5685 5613 5.56133606008066e-04 5685 5637 2.74627686916370e-01 5685 5661 5.17797855006935e+00 5685 5709 5.14992565412798e+00 5685 5733 2.80952884632898e-01 5685 5757 1.79724268891035e-04 5685 6213 7.72839565029886e-05 5685 6237 1.09974090606847e-01 5685 6261 2.09507042579205e+00 5685 6285 5.17540769465826e+00 5685 6309 2.03413071720506e+00 5685 6333 9.01462639339680e-02 5685 6357 1.52487309262471e-04 5685 6813 2.33286633743796e-06 5685 6837 4.96537002526922e-03 5685 6861 9.57663978761791e-02 5685 6885 2.40930019848202e-01 5685 6909 1.11890756819089e-01 5685 6933 3.29078610576372e-03 5685 6957 2.21431704970470e-07 5685 7413 8.10624600000000e-14 5685 7437 2.12450364950000e-10 5685 7461 5.24284476533349e-05 5685 7485 5.57366312412021e-04 5685 7509 1.26060474670819e-04 5685 7533 6.71275600306698e-06 5685 15888 -3.13185518468507e-05 5685 15912 -9.54445888291217e-04 5685 15936 -3.53912977336373e-03 5685 15960 -1.59366967251031e-03 5685 15984 -1.91124497901625e-04 5685 16272 -1.05007272993043e-03 5685 16296 -3.91570541987386e-02 5685 16320 -2.32535662013761e-01 5685 16344 -4.23340971250767e-01 5685 16368 -1.78671550878460e-01 5685 16392 -2.18011093323529e-02 5685 16416 -1.27615079143267e-05 5685 16680 -1.29970123836128e-02 5685 16704 -3.72818880152220e-01 5685 16728 -2.01599738264802e+00 5685 16752 -3.39171852619204e+00 5685 16776 -1.48988839847489e+00 5685 16800 -1.98152836711837e-01 5685 16824 -1.49333307771918e-03 5685 17088 -3.85963268737251e-02 5685 17112 -1.01643732635627e+00 5685 17136 -5.25957862952243e+00 5685 17160 -8.46920094647177e+00 5685 17184 -3.84397367768762e+00 5685 17208 -5.44017519973798e-01 5685 17232 -6.99137529405221e-03 5685 17496 -1.82366467804069e-02 5685 17520 -6.65735053161055e-01 5685 17544 -3.65852053446200e+00 5685 17568 -6.03043027825399e+00 5685 17592 -2.71989718090500e+00 5685 17616 -3.86242857738424e-01 5685 17640 -6.28028490483834e-03 5685 17904 -2.36917694260555e-03 5685 17928 -1.34841749520498e-01 5685 17952 -7.80770559015170e-01 5685 17976 -1.30220261752322e+00 5685 18000 -5.54442084415404e-01 5685 18024 -7.39127451110982e-02 5685 18048 -1.21000740674986e-03 5685 18312 -2.45216359375905e-06 5685 18336 -6.01949539313820e-03 5685 18360 -3.76488888679948e-02 5685 18384 -6.19881299017583e-02 5685 18408 -1.97985618629703e-02 5685 18432 -1.54822597046122e-03 5685 18456 -1.35451214863840e-07 5685 18744 -7.91806544230000e-10 5685 18768 -3.72328364354000e-09 5685 18792 -3.01603641067000e-09 5685 18816 -5.56057466610000e-10 5686 5686 1.00000000000000e+00 5687 5687 1.00000000000000e+00 5688 5688 1.00000000000000e+00 5689 5689 1.00000000000000e+00 5690 5690 1.00000000000000e+00 5691 5691 1.00000000000000e+00 5692 5692 1.00000000000000e+00 5693 5693 1.00000000000000e+00 5694 5694 1.00000000000000e+00 5695 5695 1.00000000000000e+00 5696 5696 1.00000000000000e+00 5697 5697 1.00000000000000e+00 5698 5698 1.00000000000000e+00 5699 5699 1.00000000000000e+00 5700 5700 1.00000000000000e+00 5701 5701 1.00000000000000e+00 5702 5702 1.00000000000000e+00 5703 5703 1.00000000000000e+00 5704 5704 1.00000000000000e+00 5705 5705 1.00000000000000e+00 5706 5706 1.00000000000000e+00 5707 5707 1.00000000000000e+00 5708 5708 1.00000000000000e+00 5709 3861 2.40795486257654e-06 5709 3885 1.86724261971482e-04 5709 3909 6.35178349373478e-04 5709 3933 1.97278770701293e-05 5709 3957 5.63269850000790e-07 5709 4437 1.51877667859400e-08 5709 4461 4.70380571098778e-03 5709 4485 1.13586382165692e-01 5709 4509 2.61254999604077e-01 5709 4533 1.19507368978337e-01 5709 4557 4.30756462080179e-03 5709 4581 1.01551698587120e-06 5709 5037 1.76444125597529e-04 5709 5061 8.63918164591274e-02 5709 5085 2.15224436646039e+00 5709 5109 5.35940821716823e+00 5709 5133 2.13680044591839e+00 5709 5157 1.14020590599329e-01 5709 5181 8.34240246487340e-05 5709 5709 1.36726238031768e+01 5709 5637 2.80163312061418e-04 5709 5661 2.82210798877976e-01 5709 5685 5.14992565412798e+00 5709 5733 5.12682007264041e+00 5709 5757 2.81305087752589e-01 5709 5781 3.76580666462584e-04 5709 6237 7.71464689415067e-05 5709 6261 1.07957058569067e-01 5709 6285 2.02653932949449e+00 5709 6309 5.11958293841722e+00 5709 6333 2.12534457488612e+00 5709 6357 8.13110836323441e-02 5709 6381 1.56645013647053e-04 5709 6837 5.53908622508738e-06 5709 6861 2.64740635360718e-03 5709 6885 1.08772846312620e-01 5709 6909 2.51563538065896e-01 5709 6933 9.78293108358415e-02 5709 6957 4.89545672319198e-03 5709 6981 2.12450364950000e-10 5709 7461 2.00372158358374e-06 5709 7485 3.31206932007271e-05 5709 7509 2.87450017846346e-04 5709 7533 2.09551952060579e-04 5709 7557 4.07861261643045e-06 5709 15528 -5.82139999520657e-06 5709 15552 -2.73146508523374e-05 5709 15576 -2.19376034812510e-05 5709 15600 -4.02905087151112e-06 5709 15888 -2.65552428960322e-05 5709 15912 -6.95654844075536e-03 5709 15936 -5.91529245750127e-02 5709 15960 -1.44363945467570e-01 5709 15984 -7.41832630423739e-02 5709 16008 -1.06321116976911e-02 5709 16032 -4.68288025480883e-06 5709 16296 -3.08070724295743e-03 5709 16320 -1.43723768517552e-01 5709 16344 -9.41794062802636e-01 5709 16368 -1.93483237870043e+00 5709 16392 -1.01903277723736e+00 5709 16416 -1.58796974729021e-01 5709 16440 -1.95098127036774e-03 5709 16704 -1.39338207108133e-02 5709 16728 -5.94848422720122e-01 5709 16752 -3.67439368781378e+00 5709 16776 -7.13291989148017e+00 5709 16800 -3.82742487958766e+00 5709 16824 -6.27007469647813e-01 5709 16848 -1.23074871066053e-02 5709 17112 -1.10223094013719e-02 5709 17136 -6.28313393694452e-01 5709 17160 -3.99347476231917e+00 5709 17184 -7.82063470981180e+00 5709 17208 -4.28272850225017e+00 5709 17232 -7.35882102626052e-01 5709 17256 -2.04237157877315e-02 5709 17520 -2.05148678363376e-03 5709 17544 -1.85183137996139e-01 5709 17568 -1.24030980514066e+00 5709 17592 -2.48901865479227e+00 5709 17616 -1.29828131778269e+00 5709 17640 -2.12078387164962e-01 5709 17664 -5.35878571918439e-03 5709 17928 -1.05416003024271e-05 5709 17952 -1.53834825153156e-02 5709 17976 -1.12540250718599e-01 5709 18000 -2.34465262564612e-01 5709 18024 -1.09225360996484e-01 5709 18048 -1.52511482932413e-02 5709 18072 -1.96245122556973e-04 5709 18360 -4.34911550910311e-05 5709 18384 -2.69100304160322e-04 5709 18408 -4.24155580695297e-04 5709 18432 -9.56224454740982e-05 5709 18456 -1.21690419475120e-07 5710 5710 1.00000000000000e+00 5711 5711 1.00000000000000e+00 5712 5712 1.00000000000000e+00 5713 5713 1.00000000000000e+00 5714 5714 1.00000000000000e+00 5715 5715 1.00000000000000e+00 5716 5716 1.00000000000000e+00 5717 5717 1.00000000000000e+00 5718 5718 1.00000000000000e+00 5719 5719 1.00000000000000e+00 5720 5720 1.00000000000000e+00 5721 5721 1.00000000000000e+00 5722 5722 1.00000000000000e+00 5723 5723 1.00000000000000e+00 5724 5724 1.00000000000000e+00 5725 5725 1.00000000000000e+00 5726 5726 1.00000000000000e+00 5727 5727 1.00000000000000e+00 5728 5728 1.00000000000000e+00 5729 5729 1.00000000000000e+00 5730 5730 1.00000000000000e+00 5731 5731 1.00000000000000e+00 5732 5732 1.00000000000000e+00 5733 3885 1.40334369341953e-05 5733 3909 1.17189641502778e-04 5733 3933 4.54537256974676e-04 5733 3957 1.46665177000229e-04 5733 4461 7.22147823010720e-07 5733 4485 3.00569983360125e-03 5733 4509 1.24287728839431e-01 5733 4533 2.93701725343253e-01 5733 4557 1.03318965213879e-01 5733 4581 6.21683783583442e-03 5733 4605 8.25552108883434e-06 5733 5061 1.25135402336310e-04 5733 5085 9.81329879921890e-02 5733 5109 2.13949290794890e+00 5733 5133 5.46392976673377e+00 5733 5157 2.31147641763552e+00 5733 5181 1.30553376912942e-01 5733 5205 1.11714081298826e-04 5733 5733 1.39656075658925e+01 5733 5661 1.40080260134690e-04 5733 5685 2.80952884632898e-01 5733 5709 5.12682007264041e+00 5733 5757 5.35035677744411e+00 5733 5781 2.78594960790360e-01 5733 5805 6.00232747143518e-04 5733 6261 1.62005155421059e-04 5733 6285 1.02519668862684e-01 5733 6309 2.12226312376195e+00 5733 6333 5.01444778180917e+00 5733 6357 2.15568720645532e+00 5733 6381 9.20977706503652e-02 5733 6405 8.84933336397282e-05 5733 6861 1.21535498385409e-05 5733 6885 3.45602568546587e-03 5733 6909 8.52217717989005e-02 5733 6933 2.78473549213861e-01 5733 6957 1.01104182244150e-01 5733 6981 4.96537002526924e-03 5733 7485 9.31527367732900e-08 5733 7509 1.11059283569016e-04 5733 7533 2.49408950444565e-04 5733 7557 1.76905947185151e-04 5733 7581 5.53908622508734e-06 5733 15528 -3.92140677873932e-04 5733 15552 -8.39152786425455e-03 5733 15576 -3.18464976229817e-02 5733 15600 -2.34736856990420e-02 5733 15624 -4.16543717404546e-03 5733 15648 -7.35209993245780e-07 5733 15912 -6.49930412057389e-04 5733 15936 -4.81042644266786e-02 5733 15960 -3.90543641669718e-01 5733 15984 -9.86091564195395e-01 5733 16008 -6.46169679302493e-01 5733 16032 -1.16903644012219e-01 5733 16056 -1.95469579268319e-03 5733 16320 -3.82397426018655e-03 5733 16344 -2.95079386881862e-01 5733 16368 -2.22780410194090e+00 5733 16392 -5.27554891058874e+00 5733 16416 -3.42870701505587e+00 5733 16440 -6.49732174719313e-01 5733 16464 -1.83378568091768e-02 5733 16728 -5.56934197282919e-03 5733 16752 -5.08138615513806e-01 5733 16776 -3.75690140381853e+00 5733 16800 -8.67746750985504e+00 5733 16824 -5.69463606063275e+00 5733 16848 -1.14612630496385e+00 5733 16872 -4.65170820385606e-02 5733 17136 -1.31385706373233e-03 5733 17160 -2.18693144643843e-01 5733 17184 -1.73159753784729e+00 5733 17208 -4.15319957528701e+00 5733 17232 -2.63136498869214e+00 5733 17256 -5.14869724059536e-01 5733 17280 -2.03097815182609e-02 5733 17544 -2.24011129438340e-05 5733 17568 -2.92174748183979e-02 5733 17592 -2.51669427949051e-01 5733 17616 -6.28655875378816e-01 5733 17640 -3.73523759437002e-01 5733 17664 -6.87655032636447e-02 5733 17688 -2.44491993247954e-03 5733 17976 -4.48079598200323e-04 5733 18000 -4.43884181165068e-03 5733 18024 -1.13536029586754e-02 5733 18048 -3.92424215915950e-03 5733 18072 -3.19429685077527e-04 5734 5734 1.00000000000000e+00 5735 5735 1.00000000000000e+00 5736 5736 1.00000000000000e+00 5737 5737 1.00000000000000e+00 5738 5738 1.00000000000000e+00 5739 5739 1.00000000000000e+00 5740 5740 1.00000000000000e+00 5741 5741 1.00000000000000e+00 5742 5742 1.00000000000000e+00 5743 5743 1.00000000000000e+00 5744 5744 1.00000000000000e+00 5745 5745 1.00000000000000e+00 5746 5746 1.00000000000000e+00 5747 5747 1.00000000000000e+00 5748 5748 1.00000000000000e+00 5749 5749 1.00000000000000e+00 5750 5750 1.00000000000000e+00 5751 5751 1.00000000000000e+00 5752 5752 1.00000000000000e+00 5753 5753 1.00000000000000e+00 5754 5754 1.00000000000000e+00 5755 5755 1.00000000000000e+00 5756 5756 1.00000000000000e+00 5757 3333 4.20640000000000e-16 5757 3357 1.17839000000000e-15 5757 3909 8.73668005157790e-06 5757 3933 2.67866754088802e-04 5757 3957 2.69575548313876e-04 5757 3981 9.38864787359752e-05 5757 4005 1.23556813447244e-06 5757 4485 2.19066051226412e-06 5757 4509 2.88298668641234e-03 5757 4533 1.20361755725486e-01 5757 4557 3.57259474892100e-01 5757 4581 1.34764034047412e-01 5757 4605 2.91387883519292e-03 5757 4629 4.55670212600404e-06 5757 4653 2.69600000000000e-17 5757 5085 6.03166389497410e-05 5757 5109 1.08523138370519e-01 5757 5133 2.30005723638079e+00 5757 5157 6.06166136081314e+00 5757 5181 2.49741496761038e+00 5757 5205 1.45180600441261e-01 5757 5229 2.22694656811323e-04 5757 5253 1.94460000000000e-16 5757 5757 1.45485484512117e+01 5757 5685 1.79724268891035e-04 5757 5709 2.81305087752589e-01 5757 5733 5.35035677744411e+00 5757 5781 5.78776746291127e+00 5757 5805 2.82925116133224e-01 5757 5829 6.78079290028163e-04 5757 6285 2.84168131865536e-04 5757 6309 9.45590627379137e-02 5757 6333 2.15151970522623e+00 5757 6357 5.27654782800344e+00 5757 6381 2.15188580318619e+00 5757 6405 1.09787995396201e-01 5757 6429 4.54682972154241e-05 5757 6885 1.36098486988972e-06 5757 6909 5.38660454727590e-03 5757 6933 9.29174454274840e-02 5757 6957 2.51306149652814e-01 5757 6981 1.09974090606846e-01 5757 7005 5.24590795012676e-03 5757 7029 2.14304096016500e-08 5757 7485 3.51291980000000e-13 5757 7509 3.82862373842000e-09 5757 7533 6.59455841648079e-05 5757 7557 5.25146915451599e-04 5757 7581 7.71464689415051e-05 5757 7605 4.62919780307240e-07 5757 7629 1.11133603000000e-12 5757 15144 -1.23322260600600e-08 5757 15168 -2.76167595293297e-04 5757 15192 -1.52847645058492e-03 5757 15216 -1.97210171975275e-03 5757 15240 -4.24068021415259e-04 5757 15264 -1.92421531558400e-08 5757 15528 -5.95594804659699e-05 5757 15552 -1.27081830126300e-02 5757 15576 -1.45112262225359e-01 5757 15600 -4.56776305238469e-01 5757 15624 -3.51322853426498e-01 5757 15648 -7.03796648728689e-02 5757 15672 -1.69124856312048e-03 5757 15936 -7.09749042147115e-04 5757 15960 -1.27093248179569e-01 5757 15984 -1.24236010428431e+00 5757 16008 -3.59514649502361e+00 5757 16032 -2.73881420483962e+00 5757 16056 -5.91340677496699e-01 5757 16080 -2.47456816655720e-02 5757 16104 -6.02256811617600e-08 5757 16344 -1.97908944809921e-03 5757 16368 -3.54816042167562e-01 5757 16392 -3.17368962354507e+00 5757 16416 -8.66875421797876e+00 5757 16440 -6.61043386329516e+00 5757 16464 -1.52417843992882e+00 5757 16488 -8.46942034598107e-02 5757 16512 -3.81408583499220e-07 5757 16752 -6.05453066284458e-04 5757 16776 -2.26074176801015e-01 5757 16800 -2.14962332383441e+00 5757 16824 -6.07799992998208e+00 5757 16848 -4.66363090861391e+00 5757 16872 -1.08618188199010e+00 5757 16896 -6.23693251947756e-02 5757 16920 -6.22249116570490e-07 5757 17160 -3.34854865003058e-05 5757 17184 -4.32773454137623e-02 5757 17208 -4.52262731923127e-01 5757 17232 -1.33485408307050e+00 5757 17256 -9.83374149245021e-01 5757 17280 -2.18551967117538e-01 5757 17304 -1.13664813412542e-02 5757 17328 -1.40505858852180e-07 5757 17592 -1.55307223477496e-03 5757 17616 -2.16988591599805e-02 5757 17640 -7.01592677812311e-02 5757 17664 -4.21980672869890e-02 5757 17688 -6.94726832043423e-03 5757 17712 -7.18384143752443e-05 5757 18000 -3.17062769720000e-09 5757 18024 -3.06112379000400e-08 5757 18048 -7.48855361421700e-08 5757 18072 -1.79287271112400e-08 5758 5758 1.00000000000000e+00 5759 5759 1.00000000000000e+00 5760 5760 1.00000000000000e+00 5761 5761 1.00000000000000e+00 5762 5762 1.00000000000000e+00 5763 5763 1.00000000000000e+00 5764 5764 1.00000000000000e+00 5765 5765 1.00000000000000e+00 5766 5766 1.00000000000000e+00 5767 5767 1.00000000000000e+00 5768 5768 1.00000000000000e+00 5769 5769 1.00000000000000e+00 5770 5770 1.00000000000000e+00 5771 5771 1.00000000000000e+00 5772 5772 1.00000000000000e+00 5773 5773 1.00000000000000e+00 5774 5774 1.00000000000000e+00 5775 5775 1.00000000000000e+00 5776 5776 1.00000000000000e+00 5777 5777 1.00000000000000e+00 5778 5778 1.00000000000000e+00 5779 5779 1.00000000000000e+00 5780 5780 1.00000000000000e+00 5781 3333 1.50650000000000e-16 5781 3357 4.22030000000000e-16 5781 3933 1.54657054999065e-06 5781 3957 1.97291361919338e-04 5781 3981 4.20437398965708e-04 5781 4005 2.18137199729476e-05 5781 4509 1.67959048382325e-06 5781 4533 4.36077583164111e-03 5781 4557 1.41675838469124e-01 5781 4581 2.76348776783462e-01 5781 4605 9.43923886567084e-02 5781 4629 3.56458842680596e-03 5781 4653 5.61618000186900e-08 5781 5109 3.05226841770284e-05 5781 5133 1.28294801162544e-01 5781 5157 2.48928706355118e+00 5781 5181 6.56471963283418e+00 5781 5205 2.39184467225707e+00 5781 5229 9.66358510578628e-02 5781 5253 2.34927877494202e-04 5781 5781 1.55068125774854e+01 5781 5709 3.76580666462584e-04 5781 5733 2.78594960790360e-01 5781 5757 5.78776746291127e+00 5781 5805 6.44362061844831e+00 5781 5829 3.19722565471035e-01 5781 5853 4.71482473101217e-04 5781 6309 2.90316706081250e-04 5781 6333 1.04998272549906e-01 5781 6357 2.14319633633396e+00 5781 6381 5.68740314343221e+00 5781 6405 2.38740455251700e+00 5781 6429 1.29959229577415e-01 5781 6453 2.10763663817741e-05 5781 6909 1.37306196538331e-06 5781 6933 3.05267476070688e-03 5781 6957 1.07044420043833e-01 5781 6981 2.74627686916368e-01 5781 7005 1.06238221895664e-01 5781 7029 4.93536473027632e-03 5781 7053 8.42870972887730e-07 5781 7533 1.89681802581378e-06 5781 7557 3.57994833680467e-05 5781 7581 2.80163312061428e-04 5781 7605 3.16321383374553e-04 5781 7629 4.10056075839960e-07 5781 15144 -4.41669362790000e-09 5781 15168 -9.39185922044201e-04 5781 15192 -2.24860482368024e-02 5781 15216 -8.98711480908158e-02 5781 15240 -7.54624655077920e-02 5781 15264 -1.67149292436572e-02 5781 15288 -6.75108151057794e-04 5781 15552 -8.87003356679501e-05 5781 15576 -4.82939482475493e-02 5781 15600 -5.57018387595870e-01 5781 15624 -1.82669002690145e+00 5781 15648 -1.66495891798113e+00 5781 15672 -4.28266688460054e-01 5781 15696 -2.75544390262795e-02 5781 15720 -6.36605257387370e-07 5781 15960 -3.83180860003066e-04 5781 15984 -2.21176604075137e-01 5781 16008 -2.35758391105407e+00 5781 16032 -7.47852153566625e+00 5781 16056 -6.98854935785907e+00 5781 16080 -1.87406138757865e+00 5781 16104 -1.32485464574332e-01 5781 16128 -1.71530090327614e-05 5781 16368 -2.02465739836176e-04 5781 16392 -2.16482774683169e-01 5781 16416 -2.39601445015473e+00 5781 16440 -7.77456076509314e+00 5781 16464 -7.39535321592722e+00 5781 16488 -2.05289357518915e+00 5781 16512 -1.56845308931475e-01 5781 16536 -5.96109218410210e-05 5781 16776 -2.84457677356845e-05 5781 16800 -5.64564483220394e-02 5781 16824 -7.15791459635699e-01 5781 16848 -2.44933938889458e+00 5781 16872 -2.25808474336958e+00 5781 16896 -5.99376677632788e-01 5781 16920 -4.20503355344799e-02 5781 16944 -1.67984462863558e-05 5781 17208 -3.60383670497804e-03 5781 17232 -6.29703485864394e-02 5781 17256 -2.35359211128364e-01 5781 17280 -2.01108282090790e-01 5781 17304 -4.71831589024721e-02 5781 17328 -2.41400275343929e-03 5781 17352 -5.47964570785970e-07 5781 17616 -3.16656089837681e-06 5781 17640 -1.83814698169984e-04 5781 17664 -7.15434311001531e-04 5781 17688 -2.81844181765463e-04 5781 17712 -2.76739317972466e-05 5782 5782 1.00000000000000e+00 5783 5783 1.00000000000000e+00 5784 5784 1.00000000000000e+00 5785 5785 1.00000000000000e+00 5786 5786 1.00000000000000e+00 5787 5787 1.00000000000000e+00 5788 5788 1.00000000000000e+00 5789 5789 1.00000000000000e+00 5790 5790 1.00000000000000e+00 5791 5791 1.00000000000000e+00 5792 5792 1.00000000000000e+00 5793 5793 1.00000000000000e+00 5794 5794 1.00000000000000e+00 5795 5795 1.00000000000000e+00 5796 5796 1.00000000000000e+00 5797 5797 1.00000000000000e+00 5798 5798 1.00000000000000e+00 5799 5799 1.00000000000000e+00 5800 5800 1.00000000000000e+00 5801 5801 1.00000000000000e+00 5802 5802 1.00000000000000e+00 5803 5803 1.00000000000000e+00 5804 5804 1.00000000000000e+00 5805 3957 7.77337397786230e-07 5805 3981 6.46479002001113e-05 5805 4005 1.13653088228281e-05 5805 4533 5.57780449472120e-07 5805 4557 4.47462327059547e-03 5805 4581 1.05217503878585e-01 5805 4605 2.68021749546518e-01 5805 4629 6.68679335058819e-02 5805 4653 8.29054817407610e-05 5805 5133 1.86095276753436e-05 5805 5157 1.37978003661640e-01 5805 5181 2.38090503758767e+00 5805 5205 5.30068757924905e+00 5805 5229 2.47430333521989e+00 5805 5253 1.15120413221383e-01 5805 5277 1.48757014544797e-04 5805 5805 1.69611461768894e+01 5805 5733 6.00232747143518e-04 5805 5757 2.82925116133224e-01 5805 5781 6.44362061844831e+00 5805 5829 6.38956406917389e+00 5805 5853 2.84023234766742e-01 5805 5877 3.73082498911614e-04 5805 6333 1.80679317919317e-04 5805 6357 1.18382376377733e-01 5805 6381 2.39295414762304e+00 5805 6405 6.29112857326273e+00 5805 6429 2.61139860278928e+00 5805 6453 1.35101238191710e-01 5805 6477 4.77661153452617e-05 5805 6933 2.33359908483912e-06 5805 6957 4.38303943466945e-03 5805 6981 9.21548851110135e-02 5805 7005 3.12738875079129e-01 5805 7029 1.22356735855197e-01 5805 7053 3.35210990307854e-03 5805 7077 3.03133255660095e-06 5805 7557 3.05027687506100e-08 5805 7581 1.76444125597537e-04 5805 7605 2.74904578863927e-04 5805 7629 9.68204573979332e-05 5805 7653 6.81126937739488e-06 5805 15168 -3.26042166295244e-06 5805 15192 -1.03974540170886e-02 5805 15216 -1.55218139672086e-01 5805 15240 -6.68819689456894e-01 5805 15264 -9.47053835614488e-01 5805 15288 -2.77611194666467e-01 5805 15312 -1.84717084370417e-02 5805 15336 -1.33099563758210e-07 5805 15576 -1.90559154330361e-05 5805 15600 -7.89606507668578e-02 5805 15624 -1.01464558466502e+00 5805 15648 -3.94528752716490e+00 5805 15672 -5.10178297208434e+00 5805 15696 -1.56020234216355e+00 5805 15720 -1.23074941957588e-01 5805 15744 -1.43016294015586e-04 5805 15984 -2.73173367878578e-05 5805 16008 -1.67675406492193e-01 5805 16032 -2.31875979400017e+00 5805 16056 -8.83501779089219e+00 5805 16080 -1.02349311736184e+01 5805 16104 -3.24277390371013e+00 5805 16128 -2.94623651010291e-01 5805 16152 -6.20042783016770e-04 5805 16392 -6.01422878122634e-06 5805 16416 -6.27299216796506e-02 5805 16440 -1.05198764373597e+00 5805 16464 -4.21473093150745e+00 5805 16488 -4.72026243498160e+00 5805 16512 -1.46587366422927e+00 5805 16536 -1.30904245935948e-01 5805 16560 -3.42380297403756e-04 5805 16824 -6.31400259870865e-03 5805 16848 -1.43978339114227e-01 5805 16872 -6.12047630761590e-01 5805 16896 -6.58101042165483e-01 5805 16920 -1.94900128605115e-01 5805 16944 -1.62013567064916e-02 5805 16968 -4.99741004108008e-05 5805 17232 -2.12273103108982e-05 5805 17256 -2.68360686543634e-03 5805 17280 -1.21795169504231e-02 5805 17304 -9.66017648426725e-03 5805 17328 -1.79342829018032e-03 5805 17352 -7.48228670978536e-06 5806 5806 1.00000000000000e+00 5807 5807 1.00000000000000e+00 5808 5808 1.00000000000000e+00 5809 5809 1.00000000000000e+00 5810 5810 1.00000000000000e+00 5811 5811 1.00000000000000e+00 5812 5812 1.00000000000000e+00 5813 5813 1.00000000000000e+00 5814 5814 1.00000000000000e+00 5815 5815 1.00000000000000e+00 5816 5816 1.00000000000000e+00 5817 5817 1.00000000000000e+00 5818 5818 1.00000000000000e+00 5819 5819 1.00000000000000e+00 5820 5820 1.00000000000000e+00 5821 5821 1.00000000000000e+00 5822 5822 1.00000000000000e+00 5823 5823 1.00000000000000e+00 5824 5824 1.00000000000000e+00 5825 5825 1.00000000000000e+00 5826 5826 1.00000000000000e+00 5827 5827 1.00000000000000e+00 5828 5828 1.00000000000000e+00 5829 3957 1.83791670000000e-12 5829 3981 4.08628167584000e-09 5829 4005 1.02677524531000e-09 5829 4557 8.30405258521000e-09 5829 4581 6.97895973065629e-03 5829 4605 1.54296983896814e-01 5829 4629 1.62292688555026e-01 5829 4653 8.16320942124753e-04 5829 5157 8.08979821477038e-05 5829 5181 9.18742608481268e-02 5829 5205 2.75103404825551e+00 5829 5229 9.48469133812500e+00 5829 5253 4.37323350928703e+00 5829 5277 5.71113368287830e-02 5829 5829 1.66107668831673e+01 5829 5757 6.78079290028162e-04 5829 5781 3.19722565471035e-01 5829 5805 6.38956406917389e+00 5829 5853 8.30042343340762e+00 5829 5877 3.98093749650472e-01 5829 5901 7.09412875459569e-05 5829 6357 9.36342827745058e-05 5829 6381 1.33641182211230e-01 5829 6405 2.63300019074904e+00 5829 6429 6.43803972467936e+00 5829 6453 2.30136421296788e+00 5829 6477 1.06494160843872e-01 5829 6501 1.20547285967305e-04 5829 6957 5.17030619608320e-07 5829 6981 5.78011380667545e-03 5829 7005 1.12349617391643e-01 5829 7029 3.08047702966230e-01 5829 7053 1.63787166671296e-01 5829 7077 3.82984705123423e-03 5829 7101 1.85443126627629e-06 5829 7557 1.07492419000000e-12 5829 7581 1.51877667859400e-08 5829 7605 4.76842667935613e-05 5829 7629 6.38231870733005e-04 5829 7653 2.12410211905647e-04 5829 7677 7.44503075326120e-06 5829 8253 1.16118000000000e-15 5829 8277 1.61450000000000e-16 5829 15192 -1.63349069221820e-07 5829 15216 -3.85260548717763e-02 5829 15240 -8.02167487971888e-01 5829 15264 -4.33414068707053e+00 5829 15288 -7.62575536054912e+00 5829 15312 -2.36081159036057e+00 5829 15336 -1.65636733875931e-01 5829 15360 -3.39183723660182e-04 5829 15600 -2.10202261173670e-07 5829 15624 -6.90657784007971e-02 5829 15648 -1.62540162070137e+00 5829 15672 -7.61855577416965e+00 5829 15696 -1.02980360621154e+01 5829 15720 -3.50368766140374e+00 5829 15744 -3.45089594634302e-01 5829 15768 -1.97299421219392e-03 5829 16008 -3.67222075893600e-08 5829 16032 -4.79131606910222e-02 5829 16056 -1.23817040319277e+00 5829 16080 -5.68289186565247e+00 5829 16104 -7.16654941689187e+00 5829 16128 -2.74934680092522e+00 5829 16152 -3.35634600221829e-01 5829 16176 -2.80648045101120e-03 5829 16440 -9.38575092160597e-03 5829 16464 -2.85679637321192e-01 5829 16488 -1.35589596977103e+00 5829 16512 -1.73717993124602e+00 5829 16536 -6.47334861429494e-01 5829 16560 -7.56563029286538e-02 5829 16584 -6.16935639697806e-04 5829 16848 -8.49783613857499e-05 5829 16872 -1.24654553297145e-02 5829 16896 -6.57338060232606e-02 5829 16920 -8.21777190579347e-02 5829 16944 -2.30088250458344e-02 5829 16968 -1.46560958747291e-03 5829 16992 -1.82286164144400e-08 5829 17280 -9.85236182442100e-08 5829 17304 -4.31404717765010e-07 5829 17328 -2.47764597396870e-07 5829 17352 -3.73102447881600e-08 5830 5830 1.00000000000000e+00 5831 5831 1.00000000000000e+00 5832 5832 1.00000000000000e+00 5833 5833 1.00000000000000e+00 5834 5834 1.00000000000000e+00 5835 5835 1.00000000000000e+00 5836 5836 1.00000000000000e+00 5837 5837 1.00000000000000e+00 5838 5838 1.00000000000000e+00 5839 5839 1.00000000000000e+00 5840 5840 1.00000000000000e+00 5841 5841 1.00000000000000e+00 5842 5842 1.00000000000000e+00 5843 5843 1.00000000000000e+00 5844 5844 1.00000000000000e+00 5845 5845 1.00000000000000e+00 5846 5846 1.00000000000000e+00 5847 5847 1.00000000000000e+00 5848 5848 1.00000000000000e+00 5849 5849 1.00000000000000e+00 5850 5850 1.00000000000000e+00 5851 5851 1.00000000000000e+00 5852 5852 1.00000000000000e+00 5853 4605 9.74515294596671e-03 5853 4629 2.29883960010649e-02 5853 4653 5.01825510064348e-04 5853 5181 1.28078995586542e-04 5853 5205 1.65911619907656e-01 5853 5229 6.37363411517367e+00 5853 5253 8.47559702554776e+00 5853 5277 6.74357737899612e-01 5853 5853 2.52133658919632e+01 5853 5781 4.71482473101217e-04 5853 5805 2.84023234766742e-01 5853 5829 8.30042343340762e+00 5853 5877 9.91943451262268e+00 5853 5901 3.21523235303128e-01 5853 5925 4.59011807340410e-05 5853 6381 1.01435749871593e-04 5853 6405 1.41458480609625e-01 5853 6429 2.28682142390913e+00 5853 6453 5.81461242173254e+00 5853 6477 3.76737230205427e+00 5853 6501 2.45504972402715e-01 5853 6525 1.80194811187155e-04 5853 6981 6.98380998805095e-06 5853 7005 3.14962360091581e-03 5853 7029 1.59134713973785e-01 5853 7053 3.88254869960634e-01 5853 7077 1.37148490235058e-01 5853 7101 2.98352467610302e-03 5853 7125 7.09230616116300e-07 5853 7605 2.33546346859170e-06 5853 7629 7.38617469010416e-05 5853 7653 4.30184941148632e-04 5853 7677 2.94496133374715e-04 5853 7701 5.17938663274501e-06 5853 8253 1.70813000000000e-15 5853 8277 2.37500000000000e-16 5853 15240 -6.91058902851688e-02 5853 15264 -2.55228025707651e+00 5853 15288 -1.16470936735665e+01 5853 15312 -1.31344205713101e+01 5853 15336 -6.32291240333017e+00 5853 15360 -9.88607456833721e-01 5853 15384 -7.07189490284731e-03 5853 15648 -5.86754948615242e-02 5853 15672 -1.92125528213327e+00 5853 15696 -9.05696095074184e+00 5853 15720 -1.16102424187961e+01 5853 15744 -5.92201974611276e+00 5853 15768 -9.48787970187871e-01 5853 15792 -8.34695865135725e-03 5853 16056 -7.88893963817192e-03 5853 16080 -3.17162331399189e-01 5853 16104 -1.76103804557894e+00 5853 16128 -2.92410451374053e+00 5853 16152 -1.39480511332754e+00 5853 16176 -2.02228954966398e-01 5853 16200 -1.65556807285416e-03 5853 16464 -2.68364539589378e-04 5853 16488 -3.63021842950993e-02 5853 16512 -2.28262293221438e-01 5853 16536 -4.02728245207735e-01 5853 16560 -1.63888366341908e-01 5853 16584 -1.94860308560996e-02 5853 16608 -7.56520811581507e-05 5853 16896 -1.43822464621434e-04 5853 16920 -7.66819923937588e-04 5853 16944 -9.09969541231176e-04 5853 16968 -1.91637324661207e-04 5853 16992 -2.68148023391800e-08 5854 5854 1.00000000000000e+00 5855 5855 1.00000000000000e+00 5856 5856 1.00000000000000e+00 5857 5857 1.00000000000000e+00 5858 5858 1.00000000000000e+00 5859 5859 1.00000000000000e+00 5860 5860 1.00000000000000e+00 5861 5861 1.00000000000000e+00 5862 5862 1.00000000000000e+00 5863 5863 1.00000000000000e+00 5864 5864 1.00000000000000e+00 5865 5865 1.00000000000000e+00 5866 5866 1.00000000000000e+00 5867 5867 1.00000000000000e+00 5868 5868 1.00000000000000e+00 5869 5869 1.00000000000000e+00 5870 5870 1.00000000000000e+00 5871 5871 1.00000000000000e+00 5872 5872 1.00000000000000e+00 5873 5873 1.00000000000000e+00 5874 5874 1.00000000000000e+00 5875 5875 1.00000000000000e+00 5876 5876 1.00000000000000e+00 5877 4605 1.07430315361200e-08 5877 4629 4.99765527714198e-05 5877 4653 5.22093285751313e-06 5877 5205 2.73574244309962e-04 5877 5229 1.56701631720266e-01 5877 5253 1.35780839835573e+00 5877 5277 4.31840613477265e-01 5877 5877 2.09499843293977e+01 5877 5805 3.73082498911614e-04 5877 5829 3.98093749650472e-01 5877 5853 9.91943451262268e+00 5877 5901 2.93723459434141e+00 5877 5925 1.06727575900907e-02 5877 6405 1.72881141110551e-04 5877 6429 1.02944973256482e-01 5877 6453 3.09914208319473e+00 5877 6477 1.09723187831808e+01 5877 6501 4.64065275503852e+00 5877 6525 4.36793967859327e-02 5877 7005 1.78071334005424e-05 5877 7029 5.91766666038595e-03 5877 7053 1.15026971954086e-01 5877 7077 2.82792704146786e-01 5877 7101 1.27181616251690e-01 5877 7125 2.13706456323191e-04 5877 7629 1.80315251593800e-08 5877 7653 1.55156966072372e-04 5877 7677 2.53629710191415e-04 5877 7701 1.74314569669891e-05 5877 15264 -2.65905112531985e-02 5877 15288 -9.84383496535976e-01 5877 15312 -6.70591694751850e+00 5877 15336 -1.47080981867767e+01 5877 15360 -7.86715197249487e+00 5877 15384 -1.27202318270225e+00 5877 15672 -1.42217084326022e-02 5877 15696 -6.32999049357056e-01 5877 15720 -4.52174059881944e+00 5877 15744 -1.01045841424142e+01 5877 15768 -5.11981516898468e+00 5877 15792 -8.20147575343343e-01 5877 16080 -2.64700801715137e-04 5877 16104 -4.67880445595033e-02 5877 16128 -3.82150713253358e-01 5877 16152 -8.81159512977729e-01 5877 16176 -3.64114134599598e-01 5877 16200 -5.34115908914603e-02 5877 16512 -1.76545037455340e-03 5877 16536 -1.29804131789673e-02 5877 16560 -2.56556343381753e-02 5877 16584 -6.78156064318184e-03 5877 16608 -2.15737240607034e-04 5878 5878 1.00000000000000e+00 5879 5879 1.00000000000000e+00 5880 5880 1.00000000000000e+00 5881 5881 1.00000000000000e+00 5882 5882 1.00000000000000e+00 5883 5883 1.00000000000000e+00 5884 5884 1.00000000000000e+00 5885 5885 1.00000000000000e+00 5886 5886 1.00000000000000e+00 5887 5887 1.00000000000000e+00 5888 5888 1.00000000000000e+00 5889 5889 1.00000000000000e+00 5890 5890 1.00000000000000e+00 5891 5891 1.00000000000000e+00 5892 5892 1.00000000000000e+00 5893 5893 1.00000000000000e+00 5894 5894 1.00000000000000e+00 5895 5895 1.00000000000000e+00 5896 5896 1.00000000000000e+00 5897 5897 1.00000000000000e+00 5898 5898 1.00000000000000e+00 5899 5899 1.00000000000000e+00 5900 5900 1.00000000000000e+00 5901 5253 1.18136420444717e-02 5901 5277 1.48846185431154e-02 5901 5901 2.89240257957885e+00 5901 5829 7.09412875459569e-05 5901 5853 3.21523235303128e-01 5901 5877 2.93723459434141e+00 5901 5925 2.46870374499721e-02 5901 6429 2.54420757694272e-04 5901 6453 1.29727964301459e-01 5901 6477 3.18335899755218e+00 5901 6501 4.66704907915619e+00 5901 6525 1.19790234883616e-01 5901 7029 1.16629760528206e-06 5901 7053 4.32657486010460e-03 5901 7077 1.45416647043232e-01 5901 7101 2.17844836818978e-01 5901 7125 9.64122588329177e-04 5901 7629 8.34516350000000e-13 5901 7653 4.80711473217600e-08 5901 7677 8.82040844097404e-06 5901 7701 1.01894477122356e-05 5901 15312 -2.11153262788658e-01 5901 15336 -1.81449700885244e+00 5901 15360 -4.54030951783693e+00 5901 15384 -1.86912480621190e+00 5901 15720 -1.22950809007931e-01 5901 15744 -1.03543496275690e+00 5901 15768 -2.63427490152788e+00 5901 15792 -1.21722609796368e+00 5901 16128 -4.96490615160433e-03 5901 16152 -3.66291396137368e-02 5901 16176 -1.04039244321091e-01 5901 16200 -8.07620712877373e-02 5901 16536 -2.30301308694400e-07 5901 16560 -1.19463980016851e-06 5901 16584 -1.32403957025804e-06 5901 16608 -2.73434565390910e-07 5902 5902 1.00000000000000e+00 5903 5903 1.00000000000000e+00 5904 5904 1.00000000000000e+00 5905 5905 1.00000000000000e+00 5906 5906 1.00000000000000e+00 5907 5907 1.00000000000000e+00 5908 5908 1.00000000000000e+00 5909 5909 1.00000000000000e+00 5910 5910 1.00000000000000e+00 5911 5911 1.00000000000000e+00 5912 5912 1.00000000000000e+00 5913 5913 1.00000000000000e+00 5914 5914 1.00000000000000e+00 5915 5915 1.00000000000000e+00 5916 5916 1.00000000000000e+00 5917 5917 1.00000000000000e+00 5918 5918 1.00000000000000e+00 5919 5919 1.00000000000000e+00 5920 5920 1.00000000000000e+00 5921 5921 1.00000000000000e+00 5922 5922 1.00000000000000e+00 5923 5923 1.00000000000000e+00 5924 5924 1.00000000000000e+00 5925 5925 1.00118062439057e+00 5925 5853 4.59011807340410e-05 5925 5877 1.06727575900907e-02 5925 5901 2.46870374499721e-02 5925 6453 7.20900767794638e-05 5925 6477 2.33776633015677e-02 5925 6501 1.09822659070734e-01 5925 6525 6.14289272445810e-03 5925 7053 4.55990495249544e-06 5925 7077 2.79091754131930e-03 5925 7101 7.20909761037743e-03 5925 7125 5.45386769826301e-05 5925 7677 2.84965056096480e-07 5925 7701 3.38261348833650e-07 5925 15336 -4.53057394300022e-03 5925 15360 -4.69807489686183e-02 5925 15384 -6.22474803362350e-02 5925 15744 -2.35827455065943e-03 5925 15768 -2.76749461282620e-02 5925 15792 -3.88419704019079e-02 5925 16152 -2.65678797598056e-05 5925 16176 -1.19559189827223e-03 5925 16200 -2.20520863822583e-03 5926 5926 1.00000000000000e+00 5927 5927 1.00000000000000e+00 5928 5928 1.00000000000000e+00 5929 5929 1.00000000000000e+00 5930 5930 1.00000000000000e+00 5931 5931 1.00000000000000e+00 5932 5932 1.00000000000000e+00 5933 5933 1.00000000000000e+00 5934 5934 1.00000000000000e+00 5935 5935 1.00000000000000e+00 5936 5936 1.00000000000000e+00 5937 5937 1.00000000000000e+00 5938 5938 1.00000000000000e+00 5939 5939 1.00000000000000e+00 5940 5940 1.00000000000000e+00 5941 5941 1.00000000000000e+00 5942 5942 1.00000000000000e+00 5943 5943 1.00000000000000e+00 5944 5944 1.00000000000000e+00 5945 5945 1.00000000000000e+00 5946 5946 1.00000000000000e+00 5947 5947 1.00000000000000e+00 5948 5948 1.00000000000000e+00 5949 5949 1.00000000000000e+00 5950 5950 1.00000000000000e+00 5951 5951 1.00000000000000e+00 5952 5952 1.00000000000000e+00 5953 5953 1.00000000000000e+00 5954 5954 1.00000000000000e+00 5955 5955 1.00000000000000e+00 5956 5956 1.00000000000000e+00 5957 5957 1.00000000000000e+00 5958 5958 1.00000000000000e+00 5959 5959 1.00000000000000e+00 5960 5960 1.00000000000000e+00 5961 5961 1.00000000000000e+00 5962 5962 1.00000000000000e+00 5963 5963 1.00000000000000e+00 5964 5964 1.00000000000000e+00 5965 5965 1.00000000000000e+00 5966 5966 1.00000000000000e+00 5967 5967 1.00000000000000e+00 5968 5968 1.00000000000000e+00 5969 5969 1.00000000000000e+00 5970 5970 1.00000000000000e+00 5971 5971 1.00000000000000e+00 5972 5972 1.00000000000000e+00 5973 5973 1.00000000000000e+00 5974 5974 1.00000000000000e+00 5975 5975 1.00000000000000e+00 5976 5976 1.00000000000000e+00 5977 5977 1.00000000000000e+00 5978 5978 1.00000000000000e+00 5979 5979 1.00000000000000e+00 5980 5980 1.00000000000000e+00 5981 5981 1.00000000000000e+00 5982 5982 1.00000000000000e+00 5983 5983 1.00000000000000e+00 5984 5984 1.00000000000000e+00 5985 5985 1.00000000000000e+00 5986 5986 1.00000000000000e+00 5987 5987 1.00000000000000e+00 5988 5988 1.00000000000000e+00 5989 5989 1.00000000000000e+00 5990 5990 1.00000000000000e+00 5991 5991 1.00000000000000e+00 5992 5992 1.00000000000000e+00 5993 5993 1.00000000000000e+00 5994 5994 1.00000000000000e+00 5995 5995 1.00000000000000e+00 5996 5996 1.00000000000000e+00 5997 5997 1.00000000000000e+00 5998 5998 1.00000000000000e+00 5999 5999 1.00000000000000e+00 6000 6000 1.00000000000000e+00 6001 6001 1.00000000000000e+00 6002 6002 1.00000000000000e+00 6003 6003 1.00000000000000e+00 6004 6004 1.00000000000000e+00 6005 6005 1.00000000000000e+00 6006 6006 1.00000000000000e+00 6007 6007 1.00000000000000e+00 6008 6008 1.00000000000000e+00 6009 6009 1.00000000000000e+00 6010 6010 1.00000000000000e+00 6011 6011 1.00000000000000e+00 6012 6012 1.00000000000000e+00 6013 6013 1.00000000000000e+00 6014 6014 1.00000000000000e+00 6015 6015 1.00000000000000e+00 6016 6016 1.00000000000000e+00 6017 6017 1.00000000000000e+00 6018 6018 1.00000000000000e+00 6019 6019 1.00000000000000e+00 6020 6020 1.00000000000000e+00 6021 6021 1.00000000000000e+00 6022 6022 1.00000000000000e+00 6023 6023 1.00000000000000e+00 6024 6024 1.00000000000000e+00 6025 6025 1.00000000000000e+00 6026 6026 1.00000000000000e+00 6027 6027 1.00000000000000e+00 6028 6028 1.00000000000000e+00 6029 6029 1.00000000000000e+00 6030 6030 1.00000000000000e+00 6031 6031 1.00000000000000e+00 6032 6032 1.00000000000000e+00 6033 6033 1.00000000000000e+00 6034 6034 1.00000000000000e+00 6035 6035 1.00000000000000e+00 6036 6036 1.00000000000000e+00 6037 6037 1.00000000000000e+00 6038 6038 1.00000000000000e+00 6039 6039 1.00000000000000e+00 6040 6040 1.00000000000000e+00 6041 6041 1.00000000000000e+00 6042 6042 1.00000000000000e+00 6043 6043 1.00000000000000e+00 6044 6044 1.00000000000000e+00 6045 6045 1.00000000000000e+00 6046 6046 1.00000000000000e+00 6047 6047 1.00000000000000e+00 6048 6048 1.00000000000000e+00 6049 6049 1.00000000000000e+00 6050 6050 1.00000000000000e+00 6051 6051 1.00000000000000e+00 6052 6052 1.00000000000000e+00 6053 6053 1.00000000000000e+00 6054 6054 1.00000000000000e+00 6055 6055 1.00000000000000e+00 6056 6056 1.00000000000000e+00 6057 6057 1.00000000000000e+00 6058 6058 1.00000000000000e+00 6059 6059 1.00000000000000e+00 6060 6060 1.00000000000000e+00 6061 6061 1.00000000000000e+00 6062 6062 1.00000000000000e+00 6063 6063 1.00000000000000e+00 6064 6064 1.00000000000000e+00 6065 6065 1.00000000000000e+00 6066 6066 1.00000000000000e+00 6067 6067 1.00000000000000e+00 6068 6068 1.00000000000000e+00 6069 6069 1.00000000000000e+00 6070 6070 1.00000000000000e+00 6071 6071 1.00000000000000e+00 6072 6072 1.00000000000000e+00 6073 6073 1.00000000000000e+00 6074 6074 1.00000000000000e+00 6075 6075 1.00000000000000e+00 6076 6076 1.00000000000000e+00 6077 6077 1.00000000000000e+00 6078 6078 1.00000000000000e+00 6079 6079 1.00000000000000e+00 6080 6080 1.00000000000000e+00 6081 6081 1.00000000000000e+00 6082 6082 1.00000000000000e+00 6083 6083 1.00000000000000e+00 6084 6084 1.00000000000000e+00 6085 6085 1.00000000000000e+00 6086 6086 1.00000000000000e+00 6087 6087 1.00000000000000e+00 6088 6088 1.00000000000000e+00 6089 6089 1.00000000000000e+00 6090 6090 1.00000000000000e+00 6091 6091 1.00000000000000e+00 6092 6092 1.00000000000000e+00 6093 6093 1.00000000000000e+00 6094 6094 1.00000000000000e+00 6095 6095 1.00000000000000e+00 6096 6096 1.00000000000000e+00 6097 6097 1.00000000000000e+00 6098 6098 1.00000000000000e+00 6099 6099 1.00000000000000e+00 6100 6100 1.00000000000000e+00 6101 6101 1.00000000000000e+00 6102 6102 1.00000000000000e+00 6103 6103 1.00000000000000e+00 6104 6104 1.00000000000000e+00 6105 6105 1.00000000000000e+00 6106 6106 1.00000000000000e+00 6107 6107 1.00000000000000e+00 6108 6108 1.00000000000000e+00 6109 6109 1.00000000000000e+00 6110 6110 1.00000000000000e+00 6111 6111 1.00000000000000e+00 6112 6112 1.00000000000000e+00 6113 6113 1.00000000000000e+00 6114 6114 1.00000000000000e+00 6115 6115 1.00000000000000e+00 6116 6116 1.00000000000000e+00 6117 6117 1.00000000000000e+00 6118 6118 1.00000000000000e+00 6119 6119 1.00000000000000e+00 6120 6120 1.00000000000000e+00 6121 6121 1.00000000000000e+00 6122 6122 1.00000000000000e+00 6123 6123 1.00000000000000e+00 6124 6124 1.00000000000000e+00 6125 6125 1.00000000000000e+00 6126 6126 1.00000000000000e+00 6127 6127 1.00000000000000e+00 6128 6128 1.00000000000000e+00 6129 6129 1.00000000000000e+00 6130 6130 1.00000000000000e+00 6131 6131 1.00000000000000e+00 6132 6132 1.00000000000000e+00 6133 6133 1.00000000000000e+00 6134 6134 1.00000000000000e+00 6135 6135 1.00000000000000e+00 6136 6136 1.00000000000000e+00 6137 6137 1.00000000000000e+00 6138 6138 1.00000000000000e+00 6139 6139 1.00000000000000e+00 6140 6140 1.00000000000000e+00 6141 4965 1.57623610900000e-11 6141 4989 4.36402672700000e-11 6141 6141 1.00509671531337e+00 6141 5565 1.67498720578736e-03 6141 5589 9.81314367921062e-04 6141 5613 4.47785888509600e-08 6141 5637 4.22030000000000e-16 6141 6165 1.57248436422905e-01 6141 6189 4.60996910959747e-02 6141 6213 6.26332162683871e-05 6141 6237 1.17839000000000e-15 6141 6717 2.16381754700000e-11 6141 6741 5.97228003931995e-02 6141 6765 3.02172057297916e-01 6141 6789 3.21160075323171e-02 6141 6813 1.00310287655639e-04 6141 7317 1.47384460888300e-07 6141 7341 1.55949680715277e-02 6141 7365 3.70617261712402e-02 6141 7389 1.60503283768703e-03 6141 7413 1.32826164813375e-06 6141 7917 2.60784759250900e-08 6141 7941 4.17426610680265e-06 6141 7965 6.61673559220358e-06 6141 7989 3.07268247464816e-06 6141 8565 3.85400000000000e-17 6141 8589 6.35000000000000e-18 6141 18264 -4.04614909029321e-06 6141 18288 -2.02792477156878e-06 6141 18312 -1.38577897776000e-09 6141 18672 -3.37372744046831e-02 6141 18696 -1.77902210357914e-02 6141 18720 -2.63309666699975e-04 6141 19080 -1.72731756794411e-01 6141 19104 -9.11000637037529e-02 6141 19128 -1.35262437329919e-03 6141 19488 -1.85121313218598e-01 6141 19512 -9.76740571613008e-02 6141 19536 -1.46097158628627e-03 6141 19896 -3.79506224605999e-02 6141 19920 -2.00238148159732e-02 6141 19944 -2.99572453049499e-04 6141 20304 -2.68177621415987e-05 6141 20328 -1.35540959531500e-05 6141 20352 -4.14899663859000e-08 6142 6142 1.00000000000000e+00 6143 6143 1.00000000000000e+00 6144 6144 1.00000000000000e+00 6145 6145 1.00000000000000e+00 6146 6146 1.00000000000000e+00 6147 6147 1.00000000000000e+00 6148 6148 1.00000000000000e+00 6149 6149 1.00000000000000e+00 6150 6150 1.00000000000000e+00 6151 6151 1.00000000000000e+00 6152 6152 1.00000000000000e+00 6153 6153 1.00000000000000e+00 6154 6154 1.00000000000000e+00 6155 6155 1.00000000000000e+00 6156 6156 1.00000000000000e+00 6157 6157 1.00000000000000e+00 6158 6158 1.00000000000000e+00 6159 6159 1.00000000000000e+00 6160 6160 1.00000000000000e+00 6161 6161 1.00000000000000e+00 6162 6162 1.00000000000000e+00 6163 6163 1.00000000000000e+00 6164 6164 1.00000000000000e+00 6165 4389 2.65320809328760e-07 6165 4413 2.76965240371850e-07 6165 4437 1.83791670000000e-12 6165 4965 2.08212736614834e-03 6165 4989 6.52643325329198e-02 6165 5013 9.82793053106720e-03 6165 5037 7.77337397786210e-07 6165 6165 1.65352612376486e+01 6165 5565 2.24680920254790e+00 6165 5589 4.59301705652267e+00 6165 5613 1.34864340673856e-01 6165 5637 1.97291361919331e-04 6165 6141 1.57248436422905e-01 6165 6189 1.20747408504982e+01 6165 6213 2.53180377174192e-01 6165 6237 2.69575548313870e-04 6165 6717 3.19243961200000e-11 6165 6741 7.56157576803351e-01 6165 6765 9.26996687393087e+00 6165 6789 3.20527510274175e+00 6165 6813 8.83750882412685e-02 6165 6837 1.46665177000228e-04 6165 7317 2.17449701422410e-07 6165 7341 1.33556506834830e-01 6165 7365 4.11150698402188e-01 6165 7389 1.01082040273076e-01 6165 7413 4.31287933667568e-03 6165 7437 5.63269850000800e-07 6165 7917 3.84760914064400e-08 6165 7941 6.16672890543078e-06 6165 7965 1.84499564047509e-04 6165 7989 2.14991453078890e-04 6165 8013 9.75132400737221e-06 6165 8565 6.14500000000000e-17 6165 8589 1.01200000000000e-17 6165 17448 -8.84884528789615e-06 6165 17472 -5.06717717815102e-06 6165 17496 -1.83644152629410e-07 6165 17856 -1.09415256228249e-01 6165 17880 -6.76799247529317e-02 6165 17904 -3.70637046823065e-03 6165 18264 -2.73110193042545e+00 6165 18288 -1.58757384800458e+00 6165 18312 -6.49202412504737e-02 6165 18336 -3.99843198830981e-04 6165 18672 -1.14939187741037e+01 6165 18696 -6.80856023493010e+00 6165 18720 -3.17500633505509e-01 6165 18744 -3.81933610700287e-03 6165 19080 -1.14588221436150e+01 6165 19104 -7.40748823356977e+00 6165 19128 -5.14460043694646e-01 6165 19152 -9.42561470530939e-03 6165 19488 -3.50736818545118e+00 6165 19512 -2.26455304050102e+00 6165 19536 -1.56376062952831e-01 6165 19560 -2.80363635072946e-03 6165 19896 -3.24429347867775e-01 6165 19920 -1.97918336106530e-01 6165 19944 -1.07430284427304e-02 6165 19968 -1.45918259762629e-04 6165 20304 -3.95711006277205e-05 6165 20328 -2.00170805911738e-05 6165 20352 -6.61515078038700e-08 6166 6166 1.00000000000000e+00 6167 6167 1.00000000000000e+00 6168 6168 1.00000000000000e+00 6169 6169 1.00000000000000e+00 6170 6170 1.00000000000000e+00 6171 6171 1.00000000000000e+00 6172 6172 1.00000000000000e+00 6173 6173 1.00000000000000e+00 6174 6174 1.00000000000000e+00 6175 6175 1.00000000000000e+00 6176 6176 1.00000000000000e+00 6177 6177 1.00000000000000e+00 6178 6178 1.00000000000000e+00 6179 6179 1.00000000000000e+00 6180 6180 1.00000000000000e+00 6181 6181 1.00000000000000e+00 6182 6182 1.00000000000000e+00 6183 6183 1.00000000000000e+00 6184 6184 1.00000000000000e+00 6185 6185 1.00000000000000e+00 6186 6186 1.00000000000000e+00 6187 6187 1.00000000000000e+00 6188 6188 1.00000000000000e+00 6189 4389 2.15051154370615e-04 6189 4413 2.50863875796689e-04 6189 4437 8.30405258521000e-09 6189 4965 9.08688838913267e-03 6189 4989 3.62451739099545e-01 6189 5013 1.22248691713117e-01 6189 5037 4.47462327059541e-03 6189 5061 1.56403018457281e-05 6189 6189 2.08251633581958e+01 6189 5565 2.93990643686117e+00 6189 5589 9.74156077354714e+00 6189 5613 2.30610993286473e+00 6189 5637 1.41675838469122e-01 6189 5661 1.65828879302890e-04 6189 6141 4.60996910959747e-02 6189 6165 1.20747408504982e+01 6189 6213 5.48682765881335e+00 6189 6237 3.57259474892096e-01 6189 6261 3.16858225254110e-04 6189 6741 1.27588687451474e-01 6189 6765 4.15240925190611e+00 6189 6789 5.95013494598463e+00 6189 6813 2.54478197047024e+00 6189 6837 1.03318965213877e-01 6189 6861 1.28308173330615e-04 6189 7341 8.70653938089619e-03 6189 7365 1.01036021558391e-01 6189 7389 3.38445502301248e-01 6189 7413 1.41882974823338e-01 6189 7437 4.30756462080162e-03 6189 7461 7.04711743687000e-09 6189 7941 1.50853894583000e-09 6189 7965 1.14998784692892e-04 6189 7989 3.89714704487470e-04 6189 8013 1.44147466930781e-04 6189 8037 1.29078208718035e-05 6189 17448 -9.58767802584513e-03 6189 17472 -1.99678375256179e-02 6189 17496 -1.02084568245076e-02 6189 17520 -1.58120002869856e-03 6189 17856 -6.14318709256880e-01 6189 17880 -9.00428623635597e-01 6189 17904 -4.38209835369883e-01 6189 17928 -7.35160147784654e-02 6189 17952 -3.14289429538524e-04 6189 18264 -5.21913909453373e+00 6189 18288 -5.95229647679295e+00 6189 18312 -2.61950144724895e+00 6189 18336 -4.68654027442260e-01 6189 18360 -5.50462311142646e-03 6189 18672 -1.30472690748127e+01 6189 18696 -1.24786044584955e+01 6189 18720 -4.91357092063526e+00 6189 18744 -9.34677063180274e-01 6189 18768 -1.87272890764828e-02 6189 19080 -6.32062101669712e+00 6189 19104 -6.90326339321341e+00 6189 19128 -2.77314972883565e+00 6189 19152 -4.95781694150880e-01 6189 19176 -9.94001768869147e-03 6189 19488 -9.31015863958348e-01 6189 19512 -1.14792032596768e+00 6189 19536 -4.57856882564994e-01 6189 19560 -7.60852993516103e-02 6189 19584 -1.42313807385477e-03 6189 19896 -2.06081244686777e-02 6189 19920 -2.25678303861425e-02 6189 19944 -5.20445063742397e-03 6189 19968 -4.57831467629250e-04 6190 6190 1.00000000000000e+00 6191 6191 1.00000000000000e+00 6192 6192 1.00000000000000e+00 6193 6193 1.00000000000000e+00 6194 6194 1.00000000000000e+00 6195 6195 1.00000000000000e+00 6196 6196 1.00000000000000e+00 6197 6197 1.00000000000000e+00 6198 6198 1.00000000000000e+00 6199 6199 1.00000000000000e+00 6200 6200 1.00000000000000e+00 6201 6201 1.00000000000000e+00 6202 6202 1.00000000000000e+00 6203 6203 1.00000000000000e+00 6204 6204 1.00000000000000e+00 6205 6205 1.00000000000000e+00 6206 6206 1.00000000000000e+00 6207 6207 1.00000000000000e+00 6208 6208 1.00000000000000e+00 6209 6209 1.00000000000000e+00 6210 6210 1.00000000000000e+00 6211 6211 1.00000000000000e+00 6212 6212 1.00000000000000e+00 6213 3789 3.96000000000000e-17 6213 3813 2.85680000000000e-16 6213 4389 1.96678742491974e-04 6213 4413 3.22067592846329e-04 6213 4437 8.08979821477044e-05 6213 4461 2.47633161065664e-06 6213 4965 6.51068255958192e-04 6213 4989 1.07149062964958e-01 6213 5013 3.04211210513150e-01 6213 5037 1.37978003661636e-01 6213 5061 2.81609474262592e-03 6213 5085 7.46695746236242e-06 6213 6213 1.67148947905028e+01 6213 5565 7.91253656423208e-02 6213 5589 2.18313486092391e+00 6213 5613 6.41976470167598e+00 6213 5637 2.48928706355115e+00 6213 5661 1.24288913731445e-01 6213 5685 7.72839565029886e-05 6213 6141 6.26332162683871e-05 6213 6165 2.53180377174192e-01 6213 6189 5.48682765881335e+00 6213 6237 6.06166136081306e+00 6213 6261 2.80845679566270e-01 6213 6285 3.83618832664595e-04 6213 6741 2.13322127890803e-04 6213 6765 1.02243790726411e-01 6213 6789 2.52076813096791e+00 6213 6813 6.10174473440780e+00 6213 6837 2.31147641763547e+00 6213 6861 8.98139243420842e-02 6213 6885 1.21338636937127e-04 6213 7341 6.93965276951370e-07 6213 7365 5.85510262322284e-03 6213 7389 1.33750852826007e-01 6213 7413 2.77770045261548e-01 6213 7437 1.14020590599326e-01 6213 7461 5.51968148406407e-03 6213 7941 2.19544460000000e-13 6213 7965 1.66357890694850e-07 6213 7989 3.45354354387659e-05 6213 8013 6.20724038309009e-04 6213 8037 1.20323550370870e-04 6213 8061 1.40034993139733e-06 6213 17040 -2.82679919691200e-08 6213 17064 -2.23427793991182e-04 6213 17088 -1.04604514369131e-03 6213 17112 -8.34346672447790e-04 6213 17136 -1.52757987606121e-04 6213 17448 -1.46458338405462e-02 6213 17472 -1.30866721526175e-01 6213 17496 -3.59725190023994e-01 6213 17520 -1.98962185579801e-01 6213 17544 -3.06138592859692e-02 6213 17568 -1.86508968564509e-04 6213 17856 -1.68324535039269e-01 6213 17880 -1.35404939750061e+00 6213 17904 -3.53361738223854e+00 6213 17928 -1.98400933919514e+00 6213 17952 -3.28645579300925e-01 6213 17976 -6.87824803542511e-03 6213 18264 -5.13545222136775e-01 6213 18288 -3.99618407387605e+00 6213 18312 -1.02624281112436e+01 6213 18336 -5.86868412923071e+00 6213 18360 -1.02406696179594e+00 6213 18384 -3.06819938875630e-02 6213 18672 -3.54401329386655e-01 6213 18696 -3.00685097530552e+00 6213 18720 -8.10899043378002e+00 6213 18744 -4.74306814100725e+00 6213 18768 -8.56623399539264e-01 6213 18792 -3.00451118904866e-02 6213 19080 -7.96440172054076e-02 6213 19104 -7.34540317333673e-01 6213 19128 -2.01546910711482e+00 6213 19152 -1.11422845009594e+00 6213 19176 -1.90496251634996e-01 6213 19200 -6.15205480232559e-03 6213 19488 -4.92885197545329e-03 6213 19512 -5.10251812906418e-02 6213 19536 -1.37572068971867e-01 6213 19560 -6.09726191576294e-02 6213 19584 -7.58954126479085e-03 6213 19608 -4.63546319988546e-05 6213 19896 -2.93151783220580e-07 6213 19920 -2.38387544049821e-06 6213 19944 -5.13822501368408e-06 6213 19968 -1.21126830761588e-06 6214 6214 1.00000000000000e+00 6215 6215 1.00000000000000e+00 6216 6216 1.00000000000000e+00 6217 6217 1.00000000000000e+00 6218 6218 1.00000000000000e+00 6219 6219 1.00000000000000e+00 6220 6220 1.00000000000000e+00 6221 6221 1.00000000000000e+00 6222 6222 1.00000000000000e+00 6223 6223 1.00000000000000e+00 6224 6224 1.00000000000000e+00 6225 6225 1.00000000000000e+00 6226 6226 1.00000000000000e+00 6227 6227 1.00000000000000e+00 6228 6228 1.00000000000000e+00 6229 6229 1.00000000000000e+00 6230 6230 1.00000000000000e+00 6231 6231 1.00000000000000e+00 6232 6232 1.00000000000000e+00 6233 6233 1.00000000000000e+00 6234 6234 1.00000000000000e+00 6235 6235 1.00000000000000e+00 6236 6236 1.00000000000000e+00 6237 3789 2.69600000000000e-17 6237 3813 1.94460000000000e-16 6237 4389 4.55670212600412e-06 6237 4413 2.22694656811325e-04 6237 4437 6.78079290028163e-04 6237 4461 4.54682972154229e-05 6237 4485 2.14304096016500e-08 6237 4509 1.11133603000000e-12 6237 4965 1.23556813447242e-06 6237 4989 2.91387883519289e-03 6237 5013 1.45180600441257e-01 6237 5037 2.82925116133218e-01 6237 5061 1.09787995396197e-01 6237 5085 5.24590795012682e-03 6237 5109 4.62919780307250e-07 6237 6237 1.45485484512117e+01 6237 5565 9.38864787359718e-05 6237 5589 1.34764034047411e-01 6237 5613 2.49741496761035e+00 6237 5637 5.78776746291141e+00 6237 5661 2.15188580318620e+00 6237 5685 1.09974090606847e-01 6237 5709 7.71464689415067e-05 6237 6141 1.17839000000000e-15 6237 6165 2.69575548313870e-04 6237 6189 3.57259474892096e-01 6237 6213 6.06166136081306e+00 6237 6261 5.27654782800350e+00 6237 6285 2.51306149652815e-01 6237 6309 5.25146915451604e-04 6237 6741 4.20640000000000e-16 6237 6765 2.67866754088798e-04 6237 6789 1.20361755725483e-01 6237 6813 2.30005723638074e+00 6237 6837 5.35035677744415e+00 6237 6861 2.15151970522629e+00 6237 6885 9.29174454274847e-02 6237 6909 6.59455841648084e-05 6237 7365 8.73668005157809e-06 6237 7389 2.88298668641225e-03 6237 7413 1.08523138370516e-01 6237 7437 2.81305087752587e-01 6237 7461 9.45590627379141e-02 6237 7485 5.38660454727592e-03 6237 7509 3.82862373842000e-09 6237 7989 2.19066051226402e-06 6237 8013 6.03166389497405e-05 6237 8037 1.79724268891034e-04 6237 8061 2.84168131865531e-04 6237 8085 1.36098486988969e-06 6237 8109 3.51291980000000e-13 6237 16680 -6.02256811617600e-08 6237 16704 -3.81408583499220e-07 6237 16728 -6.22249116570460e-07 6237 16752 -1.40505858852180e-07 6237 17040 -1.92421531558400e-08 6237 17064 -1.69124856312049e-03 6237 17088 -2.47456816655711e-02 6237 17112 -8.46942034598075e-02 6237 17136 -6.23693251947759e-02 6237 17160 -1.13664813412545e-02 6237 17184 -7.18384143752460e-05 6237 17448 -4.24068021415266e-04 6237 17472 -7.03796648728665e-02 6237 17496 -5.91340677496694e-01 6237 17520 -1.52417843992884e+00 6237 17544 -1.08618188199010e+00 6237 17568 -2.18551967117538e-01 6237 17592 -6.94726832043429e-03 6237 17856 -1.97210171975277e-03 6237 17880 -3.51322853426487e-01 6237 17904 -2.73881420483961e+00 6237 17928 -6.61043386329524e+00 6237 17952 -4.66363090861395e+00 6237 17976 -9.83374149245025e-01 6237 18000 -4.21980672869893e-02 6237 18024 -1.79287271112400e-08 6237 18264 -1.52847645058489e-03 6237 18288 -4.56776305238464e-01 6237 18312 -3.59514649502357e+00 6237 18336 -8.66875421797871e+00 6237 18360 -6.07799992998220e+00 6237 18384 -1.33485408307054e+00 6237 18408 -7.01592677812315e-02 6237 18432 -7.48855361421700e-08 6237 18672 -2.76167595293286e-04 6237 18696 -1.45112262225358e-01 6237 18720 -1.24236010428429e+00 6237 18744 -3.17368962354501e+00 6237 18768 -2.14962332383442e+00 6237 18792 -4.52262731923135e-01 6237 18816 -2.16988591599805e-02 6237 18840 -3.06112379000400e-08 6237 19080 -1.23322260600600e-08 6237 19104 -1.27081830126297e-02 6237 19128 -1.27093248179565e-01 6237 19152 -3.54816042167551e-01 6237 19176 -2.26074176801012e-01 6237 19200 -4.32773454137620e-02 6237 19224 -1.55307223477492e-03 6237 19248 -3.17062769720000e-09 6237 19512 -5.95594804659713e-05 6237 19536 -7.09749042147098e-04 6237 19560 -1.97908944809913e-03 6237 19584 -6.05453066284443e-04 6237 19608 -3.34854865003076e-05 6238 6238 1.00000000000000e+00 6239 6239 1.00000000000000e+00 6240 6240 1.00000000000000e+00 6241 6241 1.00000000000000e+00 6242 6242 1.00000000000000e+00 6243 6243 1.00000000000000e+00 6244 6244 1.00000000000000e+00 6245 6245 1.00000000000000e+00 6246 6246 1.00000000000000e+00 6247 6247 1.00000000000000e+00 6248 6248 1.00000000000000e+00 6249 6249 1.00000000000000e+00 6250 6250 1.00000000000000e+00 6251 6251 1.00000000000000e+00 6252 6252 1.00000000000000e+00 6253 6253 1.00000000000000e+00 6254 6254 1.00000000000000e+00 6255 6255 1.00000000000000e+00 6256 6256 1.00000000000000e+00 6257 6257 1.00000000000000e+00 6258 6258 1.00000000000000e+00 6259 6259 1.00000000000000e+00 6260 6260 1.00000000000000e+00 6261 4413 7.65518854573805e-06 6261 4437 9.36342827745027e-05 6261 4461 2.76673039955496e-04 6261 4485 1.76641060064218e-04 6261 4509 2.29509986312700e-08 6261 4989 2.76280475736864e-06 6261 5013 2.98338614606087e-03 6261 5037 1.18382376377729e-01 6261 5061 2.90694425790977e-01 6261 5085 8.59626371374436e-02 6261 5109 4.42976897962892e-03 6261 5133 2.33219156354420e-06 6261 6261 1.36444800739708e+01 6261 5589 4.63231239090587e-05 6261 5613 1.20227799418495e-01 6261 5637 2.14319633633399e+00 6261 5661 5.19496917949438e+00 6261 5685 2.09507042579205e+00 6261 5709 1.07957058569067e-01 6261 5733 1.62005155421059e-04 6261 6189 3.16858225254110e-04 6261 6213 2.80845679566270e-01 6261 6237 5.27654782800350e+00 6261 6285 5.17337010637295e+00 6261 6309 2.37311790284684e-01 6261 6333 5.56335941560820e-04 6261 6789 2.41938520180963e-04 6261 6813 1.03852201314302e-01 6261 6837 2.15568720645538e+00 6261 6861 5.03563186199639e+00 6261 6885 2.02145129931115e+00 6261 6909 1.05587349081563e-01 6261 6933 1.66984562117837e-05 6261 7389 4.70536121254536e-06 6261 7413 5.11135706757781e-03 6261 7437 8.13110836323444e-02 6261 7461 2.70606731348374e-01 6261 7485 1.04108481663571e-01 6261 7509 3.85851679879770e-03 6261 7533 3.53353347430290e-07 6261 8013 5.23284682600000e-11 6261 8037 1.52487309262468e-04 6261 8061 3.78755041462749e-04 6261 8085 7.05197533765978e-05 6261 8109 7.26515781837230e-07 6261 16680 -1.03954862092585e-05 6261 16704 -1.94381303127229e-03 6261 16728 -1.02953049434358e-02 6261 16752 -1.26258116673755e-02 6261 16776 -2.75454565147807e-03 6261 16800 -1.96401349981372e-05 6261 17064 -6.02398997712603e-05 6261 17088 -1.72064983002767e-02 6261 17112 -1.90167096788184e-01 6261 17136 -6.13801984343057e-01 6261 17160 -5.59277921064767e-01 6261 17184 -1.30268316315285e-01 6261 17208 -5.60266975200139e-03 6261 17472 -3.83203401246169e-04 6261 17496 -1.26225497284194e-01 6261 17520 -1.29413504051999e+00 6261 17544 -3.97166244870866e+00 6261 17568 -3.51256895453249e+00 6261 17592 -8.64674467026414e-01 6261 17616 -4.94199897693984e-02 6261 17640 -3.38983153372560e-06 6261 17880 -6.29502914319947e-04 6261 17904 -2.64974126596216e-01 6261 17928 -2.64139157095848e+00 6261 17952 -7.93340222138178e+00 6261 17976 -6.94373649909142e+00 6261 18000 -1.80327671377134e+00 6261 18024 -1.24081197234279e-01 6261 18048 -1.62498969958989e-05 6261 18288 -1.43395025777826e-04 6261 18312 -1.28155566331302e-01 6261 18336 -1.40261292381427e+00 6261 18360 -4.40199915461416e+00 6261 18384 -3.78016253433073e+00 6261 18408 -9.64335460689663e-01 6261 18432 -6.46742273828283e-02 6261 18456 -1.41521149777115e-05 6261 18696 -2.87805904174350e-07 6261 18720 -1.85885487822356e-02 6261 18744 -2.32391335660983e-01 6261 18768 -7.65783553595152e-01 6261 18792 -6.27511702787331e-01 6261 18816 -1.52428787925998e-01 6261 18840 -9.35970523369881e-03 6261 18864 -2.69057086099646e-06 6261 19128 -2.50271011591095e-04 6261 19152 -5.97175117773273e-03 6261 19176 -2.21346096836278e-02 6261 19200 -1.29819148068436e-02 6261 19224 -2.01993850345177e-03 6261 19248 -4.56708922212469e-06 6262 6262 1.00000000000000e+00 6263 6263 1.00000000000000e+00 6264 6264 1.00000000000000e+00 6265 6265 1.00000000000000e+00 6266 6266 1.00000000000000e+00 6267 6267 1.00000000000000e+00 6268 6268 1.00000000000000e+00 6269 6269 1.00000000000000e+00 6270 6270 1.00000000000000e+00 6271 6271 1.00000000000000e+00 6272 6272 1.00000000000000e+00 6273 6273 1.00000000000000e+00 6274 6274 1.00000000000000e+00 6275 6275 1.00000000000000e+00 6276 6276 1.00000000000000e+00 6277 6277 1.00000000000000e+00 6278 6278 1.00000000000000e+00 6279 6279 1.00000000000000e+00 6280 6280 1.00000000000000e+00 6281 6281 1.00000000000000e+00 6282 6282 1.00000000000000e+00 6283 6283 1.00000000000000e+00 6284 6284 1.00000000000000e+00 6285 4437 5.17030619608310e-07 6285 4461 3.16588033027809e-04 6285 4485 2.80445054406418e-04 6285 4509 3.99813715338224e-05 6285 4533 1.93816942058847e-06 6285 5013 9.53315919924650e-07 6285 5037 4.38303943466953e-03 6285 5061 9.94207410797819e-02 6285 5085 2.70682180385703e-01 6285 5109 1.06063705484242e-01 6285 5133 2.99554152661755e-03 6285 5157 1.40034993139732e-06 6285 6285 1.32034534890934e+01 6285 5613 1.59114016612103e-05 6285 5637 1.07044420043834e-01 6285 5661 2.08683207293720e+00 6285 5685 5.17540769465826e+00 6285 5709 2.02653932949449e+00 6285 5733 1.02519668862684e-01 6285 5757 2.84168131865536e-04 6285 6213 3.83618832664595e-04 6285 6237 2.51306149652815e-01 6285 6261 5.17337010637295e+00 6285 6309 5.12142788929223e+00 6285 6333 2.47676792294821e-01 6285 6357 3.78755041462756e-04 6285 6789 1.27120000000000e-16 6285 6813 2.24058402351051e-04 6285 6837 1.01104182244151e-01 6285 6861 2.02226749522321e+00 6285 6885 5.09616803122629e+00 6285 6909 1.94392165227318e+00 6285 6933 1.05200073412956e-01 6285 6957 2.44191106880425e-05 6285 7389 8.29700000000000e-17 6285 7413 1.45607376990150e-07 6285 7437 4.89545672319201e-03 6285 7461 9.95804102733944e-02 6285 7485 2.35758953438194e-01 6285 7509 1.04203715562111e-01 6285 7533 3.20501286228353e-03 6285 7557 1.29402964269486e-06 6285 8013 2.42173700000000e-14 6285 8037 2.21431704970470e-07 6285 8061 2.44191106880425e-05 6285 8085 4.29967431666138e-04 6285 8109 1.99496121906747e-04 6285 8133 1.15867545269000e-06 6285 8709 6.70440000000000e-16 6285 8733 2.39720000000000e-16 6285 16320 -3.38155601221632e-05 6285 16344 -3.25705673696310e-04 6285 16368 -7.98683687606907e-04 6285 16392 -2.02821011824109e-04 6285 16416 -3.09439465411296e-06 6285 16680 -7.74689897242050e-07 6285 16704 -2.61242579381695e-03 6285 16728 -4.94140797644577e-02 6285 16752 -2.06892058201994e-01 6285 16776 -2.35972834052834e-01 6285 16800 -6.23061972031638e-02 6285 16824 -3.48186344649801e-03 6285 17088 -2.09075466857393e-05 6285 17112 -4.08970490628928e-02 6285 17136 -5.74376861200483e-01 6285 17160 -2.14744083978137e+00 6285 17184 -2.30931516770856e+00 6285 17208 -6.59599075902195e-01 6285 17232 -4.94282254897333e-02 6285 17256 -2.21422910102272e-05 6285 17496 -7.26598831971732e-05 6285 17520 -1.43215743617080e-01 6285 17544 -1.83374722468627e+00 6285 17568 -6.53788922342882e+00 6285 17592 -6.82542888510073e+00 6285 17616 -2.04795403555764e+00 6285 17640 -1.75776519637665e-01 6285 17664 -1.47971231592431e-04 6285 17904 -2.04089667481575e-05 6285 17928 -1.06356067585759e-01 6285 17952 -1.50118703445927e+00 6285 17976 -5.55216590365651e+00 6285 18000 -5.79840393114080e+00 6285 18024 -1.76536172072492e+00 6285 18048 -1.56910533252355e-01 6285 18072 -2.59752650159813e-04 6285 18312 -6.50044912846590e-07 6285 18336 -2.14258727932296e-02 6285 18360 -3.62480097222252e-01 6285 18384 -1.41063348630125e+00 6285 18408 -1.43848699559362e+00 6285 18432 -4.15890163972256e-01 6285 18456 -3.36791333816439e-02 6285 18480 -5.94104233255154e-05 6285 18744 -6.52984975638917e-04 6285 18768 -2.17405842911069e-02 6285 18792 -9.43825694898244e-02 6285 18816 -8.88788763992183e-02 6285 18840 -2.07758257319012e-02 6285 18864 -8.90212526518233e-04 6285 18888 -2.08894349837000e-09 6285 19152 -9.21392776400000e-11 6285 19176 -2.63632843519911e-06 6285 19200 -1.09340842857504e-05 6285 19224 -4.19657041456247e-06 6285 19248 -3.90152634118480e-07 6286 6286 1.00000000000000e+00 6287 6287 1.00000000000000e+00 6288 6288 1.00000000000000e+00 6289 6289 1.00000000000000e+00 6290 6290 1.00000000000000e+00 6291 6291 1.00000000000000e+00 6292 6292 1.00000000000000e+00 6293 6293 1.00000000000000e+00 6294 6294 1.00000000000000e+00 6295 6295 1.00000000000000e+00 6296 6296 1.00000000000000e+00 6297 6297 1.00000000000000e+00 6298 6298 1.00000000000000e+00 6299 6299 1.00000000000000e+00 6300 6300 1.00000000000000e+00 6301 6301 1.00000000000000e+00 6302 6302 1.00000000000000e+00 6303 6303 1.00000000000000e+00 6304 6304 1.00000000000000e+00 6305 6305 1.00000000000000e+00 6306 6306 1.00000000000000e+00 6307 6307 1.00000000000000e+00 6308 6308 1.00000000000000e+00 6309 4437 1.07492419000000e-12 6309 4461 3.90695406012370e-07 6309 4485 8.43467389934002e-05 6309 4509 5.34088471120003e-04 6309 4533 6.51738304218107e-05 6309 4557 7.04711743687000e-09 6309 4581 5.21894530000000e-13 6309 5037 3.05027687506100e-08 6309 5061 5.12001329153911e-03 6309 5085 1.09060475920185e-01 6309 5109 2.50889615789968e-01 6309 5133 9.54297444868264e-02 6309 5157 5.51968148406408e-03 6309 5181 1.22408211906465e-06 6309 6309 1.32156586210116e+01 6309 5637 3.57994833680473e-05 6309 5661 1.00625901988247e-01 6309 5685 2.03413071720506e+00 6309 5709 5.11958293841722e+00 6309 5733 2.12226312376195e+00 6309 5757 9.45590627379138e-02 6309 5781 2.90316706081250e-04 6309 6237 5.25146915451604e-04 6309 6261 2.37311790284684e-01 6309 6285 5.12142788929223e+00 6309 6333 5.01207283480078e+00 6309 6357 2.70606731348373e-01 6309 6381 1.84292133188973e-04 6309 6813 1.22830000000000e-16 6309 6837 1.76905947185153e-04 6309 6861 1.10241595057533e-01 6309 6885 1.94522732471998e+00 6309 6909 4.98296884704721e+00 6309 6933 2.00834264652637e+00 6309 6957 9.95804102733940e-02 6309 6981 5.24284476533345e-05 6309 7413 1.86000000000000e-17 6309 7437 4.07861261643046e-06 6309 7461 2.51568580534586e-03 6309 7485 9.82611695325461e-02 6309 7509 2.62012914802079e-01 6309 7533 9.76298792981403e-02 6309 7557 2.51568580534585e-03 6309 7581 2.00372158358373e-06 6309 8061 1.29402964269485e-06 6309 8085 9.44854427778995e-05 6309 8109 2.30005939103817e-04 6309 8133 2.09858096953743e-04 6309 8157 5.76185385784561e-06 6309 8709 1.87511000000000e-15 6309 8733 6.70440000000000e-16 6309 15960 -3.47987915137000e-08 6309 15984 -1.44862846263400e-07 6309 16008 -5.74695123481400e-08 6309 16032 -5.66768020861000e-09 6309 16320 -8.79221394985299e-05 6309 16344 -7.63644529673730e-03 6309 16368 -4.55087334551126e-02 6309 16392 -7.39694930109535e-02 6309 16416 -2.25121796792208e-02 6309 16440 -1.55759882964487e-03 6309 16704 -2.22255490871320e-07 6309 16728 -1.20177584135244e-02 6309 16752 -2.24619371477821e-01 6309 16776 -9.98666130461227e-01 6309 16800 -1.33991019064061e+00 6309 16824 -4.46824974409305e-01 6309 16848 -4.17062818071602e-02 6309 16872 -2.95151509768484e-05 6309 17112 -9.73631128109040e-07 6309 17136 -6.33960961775750e-02 6309 17160 -1.07520244867281e+00 6309 17184 -4.54342432343412e+00 6309 17208 -5.80227885164795e+00 6309 17232 -2.02056147413533e+00 6309 17256 -2.08634239809660e-01 6309 17280 -4.98462211108425e-04 6309 17520 -5.60692149366310e-07 6309 17544 -7.95778024835329e-02 6309 17568 -1.41055889312211e+00 6309 17592 -5.99220336649914e+00 6309 17616 -7.56571605479389e+00 6309 17640 -2.74137618073188e+00 6309 17664 -3.05397524757639e-01 6309 17688 -1.58782338679894e-03 6309 17928 -8.46091646237500e-08 6309 17952 -2.19885461768134e-02 6309 17976 -4.97254905233337e-01 6309 18000 -2.23326814143203e+00 6309 18024 -2.80557560879687e+00 6309 18048 -9.74542059803761e-01 6309 18072 -1.02094554323801e-01 6309 18096 -5.27208835272877e-04 6309 18360 -1.33629378071348e-03 6309 18384 -5.29520423692181e-02 6309 18408 -2.57273709859606e-01 6309 18432 -3.18730314473021e-01 6309 18456 -1.01881284312103e-01 6309 18480 -9.23046608098402e-03 6309 18504 -3.67018070179616e-05 6309 18768 -3.49041330603600e-08 6309 18792 -3.88327097074184e-04 6309 18816 -1.81437017932960e-03 6309 18840 -1.43453473503937e-03 6309 18864 -2.61608722558179e-04 6309 18888 -5.84238235270000e-09 6310 6310 1.00000000000000e+00 6311 6311 1.00000000000000e+00 6312 6312 1.00000000000000e+00 6313 6313 1.00000000000000e+00 6314 6314 1.00000000000000e+00 6315 6315 1.00000000000000e+00 6316 6316 1.00000000000000e+00 6317 6317 1.00000000000000e+00 6318 6318 1.00000000000000e+00 6319 6319 1.00000000000000e+00 6320 6320 1.00000000000000e+00 6321 6321 1.00000000000000e+00 6322 6322 1.00000000000000e+00 6323 6323 1.00000000000000e+00 6324 6324 1.00000000000000e+00 6325 6325 1.00000000000000e+00 6326 6326 1.00000000000000e+00 6327 6327 1.00000000000000e+00 6328 6328 1.00000000000000e+00 6329 6329 1.00000000000000e+00 6330 6330 1.00000000000000e+00 6331 6331 1.00000000000000e+00 6332 6332 1.00000000000000e+00 6333 4485 5.31858846635916e-06 6333 4509 1.78814708764559e-04 6333 4533 2.93336389137457e-04 6333 4557 1.28308173330619e-04 6333 4581 8.53127317558100e-08 6333 5085 4.96671538245728e-03 6333 5109 1.03347535291058e-01 6333 5133 2.86213876935506e-01 6333 5157 8.98139243420832e-02 6333 5181 4.01865511835701e-03 6333 5205 1.30211113888131e-05 6333 6333 1.35061797798593e+01 6333 5661 7.84494215473652e-05 6333 5685 9.01462639339680e-02 6333 5709 2.12534457488612e+00 6333 5733 5.01444778180917e+00 6333 5757 2.15151970522623e+00 6333 5781 1.04998272549906e-01 6333 5805 1.80679317919317e-04 6333 6261 5.56335941560820e-04 6333 6285 2.47676792294821e-01 6333 6309 5.01207283480078e+00 6333 6357 5.03563186199633e+00 6333 6381 2.80488210935187e-01 6333 6405 1.38422994045985e-04 6333 6861 8.99998833830974e-05 6333 6885 1.07567458814670e-01 6333 6909 2.01957827044320e+00 6333 6933 4.97708104918746e+00 6333 6957 2.02226749522320e+00 6333 6981 9.57663978761783e-02 6333 7005 1.17724328222052e-04 6333 7461 5.76185385784568e-06 6333 7485 4.46279463381609e-03 6333 7509 8.32621938773886e-02 6333 7533 2.55684893376081e-01 6333 7557 1.10241595057533e-01 6333 7581 2.64740635360721e-03 6333 7605 7.87821774847080e-07 6333 8109 1.14629817987542e-04 6333 8133 3.17936008973020e-04 6333 8157 8.99998833830992e-05 6333 8181 1.21535498385414e-05 6333 15960 -4.06769525242702e-04 6333 15984 -4.83582745070669e-03 6333 16008 -1.37345708174827e-02 6333 16032 -5.17996492292173e-03 6333 16056 -4.92803893296462e-04 6333 16344 -2.69918411505039e-03 6333 16368 -7.37384779871932e-02 6333 16392 -3.95378165876486e-01 6333 16416 -6.56082329760192e-01 6333 16440 -2.58902342369887e-01 6333 16464 -2.95734225758221e-02 6333 16488 -2.02242391247015e-05 6333 16752 -2.16163911218316e-02 6333 16776 -5.34791752860120e-01 6333 16800 -2.69588979393633e+00 6333 16824 -4.18131636633917e+00 6333 16848 -1.71860913009058e+00 6333 16872 -2.13828212972154e-01 6333 16896 -1.17815807475608e-03 6333 17160 -4.78374423681398e-02 6333 17184 -1.14368139928722e+00 6333 17208 -5.60361692656965e+00 6333 17232 -8.39721704319991e+00 6333 17256 -3.58766882084470e+00 6333 17280 -4.78760119398730e-01 6333 17304 -4.92164144620346e-03 6333 17568 -1.82588596240220e-02 6333 17592 -6.00080589743590e-01 6333 17616 -3.12316738344967e+00 6333 17640 -4.76234705419661e+00 6333 17664 -1.99343558131643e+00 6333 17688 -2.60977235824409e-01 6333 17712 -3.14675205445592e-03 6333 17976 -1.86222575103135e-03 6333 18000 -9.93778601987013e-02 6333 18024 -5.46152839053621e-01 6333 18048 -8.36607401537234e-01 6333 18072 -3.30604382240391e-01 6333 18096 -4.04287971817126e-02 6333 18120 -5.12372734049663e-04 6333 18384 -6.46536115564740e-07 6333 18408 -2.89134898941355e-03 6333 18432 -1.65572343303867e-02 6333 18456 -2.31392107675321e-02 6333 18480 -5.97874547333357e-03 6333 18504 -2.44302264716894e-04 6334 6334 1.00000000000000e+00 6335 6335 1.00000000000000e+00 6336 6336 1.00000000000000e+00 6337 6337 1.00000000000000e+00 6338 6338 1.00000000000000e+00 6339 6339 1.00000000000000e+00 6340 6340 1.00000000000000e+00 6341 6341 1.00000000000000e+00 6342 6342 1.00000000000000e+00 6343 6343 1.00000000000000e+00 6344 6344 1.00000000000000e+00 6345 6345 1.00000000000000e+00 6346 6346 1.00000000000000e+00 6347 6347 1.00000000000000e+00 6348 6348 1.00000000000000e+00 6349 6349 1.00000000000000e+00 6350 6350 1.00000000000000e+00 6351 6351 1.00000000000000e+00 6352 6352 1.00000000000000e+00 6353 6353 1.00000000000000e+00 6354 6354 1.00000000000000e+00 6355 6355 1.00000000000000e+00 6356 6356 1.00000000000000e+00 6357 4509 4.70536121254552e-06 6357 4533 2.41938520180969e-04 6357 4557 3.16858225254116e-04 6357 4581 4.63231239090605e-05 6357 4605 2.76280475736875e-06 6357 5085 5.23284682600000e-11 6357 5109 5.11135706757784e-03 6357 5133 1.03852201314301e-01 6357 5157 2.80845679566269e-01 6357 5181 1.20227799418492e-01 6357 5205 2.98338614606087e-03 6357 5229 7.65518854573800e-06 6357 6357 1.36444800739708e+01 6357 5685 1.52487309262471e-04 6357 5709 8.13110836323441e-02 6357 5733 2.15568720645532e+00 6357 5757 5.27654782800344e+00 6357 5781 2.14319633633396e+00 6357 5805 1.18382376377733e-01 6357 5829 9.36342827745058e-05 6357 6285 3.78755041462756e-04 6357 6309 2.70606731348373e-01 6357 6333 5.03563186199633e+00 6357 6381 5.19496917949433e+00 6357 6405 2.90694425790976e-01 6357 6429 2.76673039955508e-04 6357 6885 7.05197533765977e-05 6357 6909 1.04108481663570e-01 6357 6933 2.02145129931113e+00 6357 6957 5.17337010637290e+00 6357 6981 2.09507042579201e+00 6357 7005 8.59626371374431e-02 6357 7029 1.76641060064226e-04 6357 7485 7.26515781837240e-07 6357 7509 3.85851679879768e-03 6357 7533 1.05587349081563e-01 6357 7557 2.37311790284684e-01 6357 7581 1.07957058569066e-01 6357 7605 4.42976897962895e-03 6357 7629 2.29509986312700e-08 6357 8109 3.53353347430290e-07 6357 8133 1.66984562117843e-05 6357 8157 5.56335941560844e-04 6357 8181 1.62005155421065e-04 6357 8205 2.33219156354422e-06 6357 15576 -2.87805904174350e-07 6357 15600 -1.43395025777831e-04 6357 15624 -6.29502914319969e-04 6357 15648 -3.83203401246173e-04 6357 15672 -6.02398997712599e-05 6357 15960 -2.50271011591103e-04 6357 15984 -1.85885487822359e-02 6357 16008 -1.28155566331301e-01 6357 16032 -2.64974126596210e-01 6357 16056 -1.26225497284196e-01 6357 16080 -1.72064983002776e-02 6357 16104 -1.03954862092585e-05 6357 16368 -5.97175117773279e-03 6357 16392 -2.32391335660979e-01 6357 16416 -1.40261292381425e+00 6357 16440 -2.64139157095846e+00 6357 16464 -1.29413504051998e+00 6357 16488 -1.90167096788185e-01 6357 16512 -1.94381303127237e-03 6357 16776 -2.21346096836279e-02 6357 16800 -7.65783553595130e-01 6357 16824 -4.40199915461408e+00 6357 16848 -7.93340222138178e+00 6357 16872 -3.97166244870862e+00 6357 16896 -6.13801984343046e-01 6357 16920 -1.02953049434362e-02 6357 17184 -1.29819148068438e-02 6357 17208 -6.27511702787324e-01 6357 17232 -3.78016253433069e+00 6357 17256 -6.94373649909137e+00 6357 17280 -3.51256895453244e+00 6357 17304 -5.59277921064756e-01 6357 17328 -1.26258116673756e-02 6357 17592 -2.01993850345182e-03 6357 17616 -1.52428787925998e-01 6357 17640 -9.64335460689657e-01 6357 17664 -1.80327671377133e+00 6357 17688 -8.64674467026406e-01 6357 17712 -1.30268316315284e-01 6357 17736 -2.75454565147808e-03 6357 18000 -4.56708922212480e-06 6357 18024 -9.35970523369878e-03 6357 18048 -6.46742273828280e-02 6357 18072 -1.24081197234279e-01 6357 18096 -4.94199897693993e-02 6357 18120 -5.60266975200163e-03 6357 18144 -1.96401349981375e-05 6357 18432 -2.69057086099650e-06 6357 18456 -1.41521149777116e-05 6357 18480 -1.62498969958988e-05 6357 18504 -3.38983153372556e-06 6358 6358 1.00000000000000e+00 6359 6359 1.00000000000000e+00 6360 6360 1.00000000000000e+00 6361 6361 1.00000000000000e+00 6362 6362 1.00000000000000e+00 6363 6363 1.00000000000000e+00 6364 6364 1.00000000000000e+00 6365 6365 1.00000000000000e+00 6366 6366 1.00000000000000e+00 6367 6367 1.00000000000000e+00 6368 6368 1.00000000000000e+00 6369 6369 1.00000000000000e+00 6370 6370 1.00000000000000e+00 6371 6371 1.00000000000000e+00 6372 6372 1.00000000000000e+00 6373 6373 1.00000000000000e+00 6374 6374 1.00000000000000e+00 6375 6375 1.00000000000000e+00 6376 6376 1.00000000000000e+00 6377 6377 1.00000000000000e+00 6378 6378 1.00000000000000e+00 6379 6379 1.00000000000000e+00 6380 6380 1.00000000000000e+00 6381 4533 7.38583222521854e-06 6381 4557 1.65828879302896e-04 6381 4581 7.57288505340502e-04 6381 4605 6.65602558937131e-05 6381 4629 4.13226415410000e-10 6381 4653 1.65361740000000e-13 6381 5109 1.84048516669520e-07 6381 5133 3.81948091007362e-03 6381 5157 1.24288913731442e-01 6381 5181 2.81822420274195e-01 6381 5205 1.24157463156090e-01 6381 5229 6.61404141397703e-03 6381 5253 3.01784208052608e-06 6381 6381 1.42155940525201e+01 6381 5709 1.56645013647053e-04 6381 5733 9.20977706503652e-02 6381 5757 2.15188580318619e+00 6381 5781 5.68740314343221e+00 6381 5805 2.39295414762304e+00 6381 5829 1.33641182211230e-01 6381 5853 1.01435749871593e-04 6381 6309 1.84292133188973e-04 6381 6333 2.80488210935187e-01 6381 6357 5.19496917949433e+00 6381 6405 5.50681995523443e+00 6381 6429 3.01419830152280e-01 6381 6453 5.42606048985635e-04 6381 6909 1.06435412031522e-04 6381 6933 1.06392574754093e-01 6381 6957 2.08683207293716e+00 6381 6981 5.17797855006936e+00 6381 7005 2.25961989461759e+00 6381 7029 8.99707006266858e-02 6381 7053 1.33659463189934e-04 6381 7509 1.13484136129364e-05 6381 7533 2.37454150425829e-03 6381 7557 1.00625901988246e-01 6381 7581 2.82210798877977e-01 6381 7605 1.00146710530683e-01 6381 7629 5.39569286250711e-03 6381 8133 1.59094207830707e-06 6381 8157 7.84494215473683e-05 6381 8181 1.40080260134692e-04 6381 8205 2.46473168732274e-04 6381 8229 6.72456755290754e-06 6381 15216 -9.93685121070000e-10 6381 15240 -5.96334235505000e-09 6381 15264 -8.94809260414000e-09 6381 15288 -1.98860187077000e-09 6381 15576 -3.20764573755020e-07 6381 15600 -2.26300359808564e-03 6381 15624 -2.75991069040432e-02 6381 15648 -8.46843250636784e-02 6381 15672 -5.14144086384395e-02 6381 15696 -8.22518959263112e-03 6381 15720 -2.55024749279378e-06 6381 15984 -1.50947173666037e-03 6381 16008 -8.64757018219475e-02 6381 16032 -6.49578675580661e-01 6381 16056 -1.52988192885990e+00 6381 16080 -9.05256029699004e-01 6381 16104 -1.53167292222669e-01 6381 16128 -2.24873890229680e-03 6381 16392 -7.59144487802220e-03 6381 16416 -4.30138184579631e-01 6381 16440 -2.99873944324043e+00 6381 16464 -6.59932721052856e+00 6381 16488 -3.93415720552657e+00 6381 16512 -6.98575913356135e-01 6381 16536 -1.68136550660147e-02 6381 16800 -7.75557904544779e-03 6381 16824 -5.70727423507643e-01 6381 16848 -3.96244886125038e+00 6381 16872 -8.57804786423755e+00 6381 16896 -5.24984454072558e+00 6381 16920 -9.93116571711702e-01 6381 16944 -3.45663066015178e-02 6381 17208 -1.61402046852431e-03 6381 17232 -2.00674644131226e-01 6381 17256 -1.47822609499831e+00 6381 17280 -3.29949882568253e+00 6381 17304 -1.93651044840105e+00 6381 17328 -3.52156070294240e-01 6381 17352 -1.14567772184785e-02 6381 17616 -1.39127671343208e-05 6381 17640 -2.12466860893378e-02 6381 17664 -1.70937578879019e-01 6381 17688 -3.98034187425587e-01 6381 17712 -2.15879675201222e-01 6381 17736 -3.58048723393153e-02 6381 17760 -8.99956012314778e-04 6381 18048 -1.66168765949972e-04 6381 18072 -1.32903395665440e-03 6381 18096 -2.84679740778408e-03 6381 18120 -7.57131174518698e-04 6381 18144 -2.31930704160455e-05 6382 6382 1.00000000000000e+00 6383 6383 1.00000000000000e+00 6384 6384 1.00000000000000e+00 6385 6385 1.00000000000000e+00 6386 6386 1.00000000000000e+00 6387 6387 1.00000000000000e+00 6388 6388 1.00000000000000e+00 6389 6389 1.00000000000000e+00 6390 6390 1.00000000000000e+00 6391 6391 1.00000000000000e+00 6392 6392 1.00000000000000e+00 6393 6393 1.00000000000000e+00 6394 6394 1.00000000000000e+00 6395 6395 1.00000000000000e+00 6396 6396 1.00000000000000e+00 6397 6397 1.00000000000000e+00 6398 6398 1.00000000000000e+00 6399 6399 1.00000000000000e+00 6400 6400 1.00000000000000e+00 6401 6401 1.00000000000000e+00 6402 6402 1.00000000000000e+00 6403 6403 1.00000000000000e+00 6404 6404 1.00000000000000e+00 6405 4557 1.56403018457287e-05 6405 4581 1.35092304002422e-04 6405 4605 1.93413419972703e-04 6405 4629 1.64562920078725e-04 6405 4653 1.62635643746720e-07 6405 5133 1.62962235055491e-06 6405 5157 2.81609474262595e-03 6405 5181 1.36104287771051e-01 6405 5205 3.70222890871767e-01 6405 5229 1.14640260342687e-01 6405 5253 3.27777054418457e-03 6405 5277 6.07076150326429e-06 6405 6405 1.52368589982420e+01 6405 5733 8.84933336397282e-05 6405 5757 1.09787995396201e-01 6405 5781 2.38740455251700e+00 6405 5805 6.29112857326273e+00 6405 5829 2.63300019074904e+00 6405 5853 1.41458480609625e-01 6405 5877 1.72881141110551e-04 6405 6333 1.38422994045985e-04 6405 6357 2.90694425790976e-01 6405 6381 5.50681995523443e+00 6405 6429 6.01317879021491e+00 6405 6453 3.05741013405657e-01 6405 6477 8.42968691652785e-04 6405 6933 2.33697018029735e-04 6405 6957 9.94207410797815e-02 6405 6981 2.25780169589539e+00 6405 7005 5.42353049705159e+00 6405 7029 2.32069493927856e+00 6405 7053 1.17467751532462e-01 6405 7077 7.51344158719148e-05 6405 7533 6.86885643072775e-06 6405 7557 5.12001329153911e-03 6405 7581 8.63918164591287e-02 6405 7605 2.82601434453935e-01 6405 7629 1.17330424634126e-01 6405 7653 5.70101788762027e-03 6405 7677 2.19087640160000e-10 6405 8181 1.25135402336312e-04 6405 8205 5.00161568839055e-04 6405 8229 8.91005421407028e-05 6405 8253 2.74962501930975e-06 6405 8277 7.79578600000000e-14 6405 15216 -1.25824412478921e-05 6405 15240 -1.83203537140749e-03 6405 15264 -8.36244219545068e-03 6405 15288 -6.67400920711649e-03 6405 15312 -1.22365447471564e-03 6405 15336 -1.54286544133720e-07 6405 15600 -2.47411633771688e-04 6405 15624 -2.92956316988240e-02 6405 15648 -2.75908869197922e-01 6405 15672 -7.67651190101414e-01 6405 15696 -5.23272904718816e-01 6405 15720 -9.94144917254071e-02 6405 15744 -2.45483860613432e-03 6405 16008 -1.78015374464237e-03 6405 16032 -2.16006340598431e-01 6405 16056 -1.86663739218363e+00 6405 16080 -4.91376916156046e+00 6405 16104 -3.40661737920491e+00 6405 16128 -6.94820792058696e-01 6405 16152 -2.67986772911741e-02 6405 16176 -6.13896168510000e-10 6405 16416 -3.43551708160314e-03 6405 16440 -4.57991835894893e-01 6405 16464 -3.73729413925666e+00 6405 16488 -9.44829471250618e+00 6405 16512 -6.73991693558087e+00 6405 16536 -1.48312847787425e+00 6405 16560 -7.66304469585031e-02 6405 16584 -3.15286122116000e-09 6405 16824 -8.94813647991456e-04 6405 16848 -2.30669445532564e-01 6405 16872 -2.02840327989391e+00 6405 16896 -5.35935612814163e+00 6405 16920 -3.78383013424043e+00 6405 16944 -8.23602821426855e-01 6405 16968 -4.19819363012443e-02 6405 16992 -3.40300235706000e-09 6405 17232 -2.60766096089583e-05 6405 17256 -3.61825963381644e-02 6405 17280 -3.49928920340785e-01 6405 17304 -9.67683053614513e-01 6405 17328 -6.48829834041641e-01 6405 17352 -1.34270192548721e-01 6405 17376 -6.25604395553282e-03 6405 17400 -6.97276547140000e-10 6405 17664 -8.71566016129867e-04 6405 17688 -1.07863231621519e-02 6405 17712 -3.19984746935321e-02 6405 17736 -1.50083400241687e-02 6405 17760 -1.93303940305554e-03 6405 17784 -1.59177904572115e-06 6406 6406 1.00000000000000e+00 6407 6407 1.00000000000000e+00 6408 6408 1.00000000000000e+00 6409 6409 1.00000000000000e+00 6410 6410 1.00000000000000e+00 6411 6411 1.00000000000000e+00 6412 6412 1.00000000000000e+00 6413 6413 1.00000000000000e+00 6414 6414 1.00000000000000e+00 6415 6415 1.00000000000000e+00 6416 6416 1.00000000000000e+00 6417 6417 1.00000000000000e+00 6418 6418 1.00000000000000e+00 6419 6419 1.00000000000000e+00 6420 6420 1.00000000000000e+00 6421 6421 1.00000000000000e+00 6422 6422 1.00000000000000e+00 6423 6423 1.00000000000000e+00 6424 6424 1.00000000000000e+00 6425 6425 1.00000000000000e+00 6426 6426 1.00000000000000e+00 6427 6427 1.00000000000000e+00 6428 6428 1.00000000000000e+00 6429 4581 1.31669194616130e-06 6429 4605 3.05165715246779e-04 6429 4629 3.80183219577239e-04 6429 4653 8.78103357304650e-07 6429 5157 2.47633161065664e-06 6429 5181 4.00256385214289e-03 6429 5205 1.30468906119894e-01 6429 5229 2.56110343441907e-01 6429 5253 9.56967206476602e-02 6429 5277 2.48600030779952e-03 6429 6429 1.66152374232953e+01 6429 5757 4.54682972154241e-05 6429 5781 1.29959229577415e-01 6429 5805 2.61139860278928e+00 6429 5829 6.43803972467936e+00 6429 5853 2.28682142390913e+00 6429 5877 1.02944973256482e-01 6429 5901 2.54420757694272e-04 6429 6357 2.76673039955508e-04 6429 6381 3.01419830152280e-01 6429 6405 6.01317879021491e+00 6429 6453 7.22470846299943e+00 6429 6477 3.44526895845705e-01 6429 6501 5.98389187080616e-04 6429 6957 3.16588033027823e-04 6429 6981 1.03986644421700e-01 6429 7005 2.31426725984316e+00 6429 7029 6.32140157665042e+00 6429 7053 2.77588105773608e+00 6429 7077 1.58330381854054e-01 6429 7101 3.87416569810706e-05 6429 7557 3.90695406012380e-07 6429 7581 4.70380571098784e-03 6429 7605 1.13542902326334e-01 6429 7629 2.91682199132938e-01 6429 7653 1.38803384818389e-01 6429 7677 7.20183881084092e-03 6429 7701 2.08930460891830e-07 6429 8181 7.22147823010730e-07 6429 8205 1.87607910286075e-05 6429 8229 4.67153324025474e-04 6429 8253 2.62041531254356e-04 6429 8277 1.65821052232080e-07 6429 8301 3.55340800000000e-14 6429 8853 1.01200000000000e-17 6429 8877 6.35000000000000e-18 6429 15216 -2.87059089138055e-06 6429 15240 -4.12660314887467e-03 6429 15264 -5.14093378669885e-02 6429 15288 -1.70767136446982e-01 6429 15312 -1.43634132019868e-01 6429 15336 -3.17314047065672e-02 6429 15360 -1.21583139608410e-03 6429 15624 -2.63403151354002e-04 6429 15648 -8.48036522135795e-02 6429 15672 -8.31720144615564e-01 6429 15696 -2.49991636289086e+00 6429 15720 -2.25180646794107e+00 6429 15744 -5.66300017826288e-01 6429 15768 -3.39913024247168e-02 6429 15792 -3.45535269833850e-07 6429 16032 -1.04490660266624e-03 6429 16056 -3.19772793067175e-01 6429 16080 -3.01355636355895e+00 6429 16104 -8.89099175463575e+00 6429 16128 -8.19445174042308e+00 6429 16152 -2.15460430129389e+00 6429 16176 -1.44954846646002e-01 6429 16200 -3.90079655830218e-06 6429 16440 -3.89332230272228e-04 6429 16464 -2.40577424961977e-01 6429 16488 -2.46519311509011e+00 6429 16512 -7.59830514439935e+00 6429 16536 -6.94499300146942e+00 6429 16560 -1.87921702765301e+00 6429 16584 -1.38745469119401e-01 6429 16608 -1.04201598584573e-05 6429 16848 -3.43528606209371e-05 6429 16872 -5.22627933309477e-02 6429 16896 -6.07890324229403e-01 6429 16920 -1.97095422806588e+00 6429 16944 -1.71506375002891e+00 6429 16968 -4.41673679756457e-01 6429 16992 -3.00750972078247e-02 6429 17016 -2.51866616999208e-06 6429 17280 -2.45335414009301e-03 6429 17304 -3.97012792058168e-02 6429 17328 -1.41157639159403e-01 6429 17352 -1.07211408631075e-01 6429 17376 -2.20016673822270e-02 6429 17400 -7.12208246196802e-04 6429 17424 -2.67275633000000e-12 6429 17688 -5.23645026792810e-07 6429 17712 -1.38112665047087e-05 6429 17736 -4.77885378091531e-05 6429 17760 -1.33092751663792e-05 6429 17784 -3.98147192210430e-07 6430 6430 1.00000000000000e+00 6431 6431 1.00000000000000e+00 6432 6432 1.00000000000000e+00 6433 6433 1.00000000000000e+00 6434 6434 1.00000000000000e+00 6435 6435 1.00000000000000e+00 6436 6436 1.00000000000000e+00 6437 6437 1.00000000000000e+00 6438 6438 1.00000000000000e+00 6439 6439 1.00000000000000e+00 6440 6440 1.00000000000000e+00 6441 6441 1.00000000000000e+00 6442 6442 1.00000000000000e+00 6443 6443 1.00000000000000e+00 6444 6444 1.00000000000000e+00 6445 6445 1.00000000000000e+00 6446 6446 1.00000000000000e+00 6447 6447 1.00000000000000e+00 6448 6448 1.00000000000000e+00 6449 6449 1.00000000000000e+00 6450 6450 1.00000000000000e+00 6451 6451 1.00000000000000e+00 6452 6452 1.00000000000000e+00 6453 4605 1.43358216180987e-06 6453 4629 1.11277923894421e-05 6453 4653 8.97612361523940e-07 6453 5181 1.08879937028275e-06 6453 5205 3.49349886848909e-03 6453 5229 1.11544915246484e-01 6453 5253 2.78118470954539e-01 6453 5277 4.82735193069488e-02 6453 6453 1.85107007957694e+01 6453 5781 2.10763663817741e-05 6453 5805 1.35101238191710e-01 6453 5829 2.30136421296788e+00 6453 5853 5.81461242173254e+00 6453 5877 3.09914208319473e+00 6453 5901 1.29727964301459e-01 6453 5925 7.20900767794638e-05 6453 6381 5.42606048985635e-04 6453 6405 3.05741013405657e-01 6453 6429 7.22470846299943e+00 6453 6477 6.98081283453348e+00 6453 6501 2.79777465397478e-01 6453 6525 3.54827271089049e-04 6453 6981 2.64738694593930e-04 6453 7005 1.30017308321321e-01 6453 7029 2.77392916116137e+00 6453 7053 7.60940118776601e+00 6453 7077 2.64884504318029e+00 6453 7101 9.08790737019994e-02 6453 7125 3.19208832744815e-06 6453 7581 2.40795486257654e-06 6453 7605 3.37533779248329e-03 6453 7629 1.29158141991548e-01 6453 7653 3.83651946384642e-01 6453 7677 1.04720627674972e-01 6453 7701 2.93365015021251e-03 6453 8205 1.07354659163103e-06 6453 8229 1.40199035422927e-04 6453 8253 2.67258390988052e-04 6453 8277 2.33188526392939e-04 6453 8301 1.91012521360000e-10 6453 8853 6.14500000000000e-17 6453 8877 3.85400000000000e-17 6453 15240 -1.96369108521831e-05 6453 15264 -2.05692093069998e-02 6453 15288 -3.00034719279318e-01 6453 15312 -1.28138291463894e+00 6453 15336 -1.79324213756294e+00 6453 15360 -4.70523537717537e-01 6453 15384 -2.04644255858374e-02 6453 15648 -9.55235986069353e-05 6453 15672 -1.13112689805217e-01 6453 15696 -1.43888709538294e+00 6453 15720 -5.48334295921232e+00 6453 15744 -6.75754988964383e+00 6453 15768 -1.79211733908770e+00 6453 15792 -9.39954658147401e-02 6453 16056 -8.75407316449945e-05 6453 16080 -1.94606147503335e-01 6453 16104 -2.67231919083988e+00 6453 16128 -1.00015592700934e+01 6453 16152 -1.09547396060214e+01 6453 16176 -2.84276194806438e+00 6453 16200 -1.57084032693362e-01 6453 16464 -1.69759551982028e-05 6453 16488 -6.35762543224481e-02 6453 16512 -1.01738905164713e+00 6453 16536 -3.98187100407165e+00 6453 16560 -4.28313906253422e+00 6453 16584 -1.10467050991724e+00 6453 16608 -6.09452274392248e-02 6453 16896 -5.15015269182187e-03 6453 16920 -1.09952822002810e-01 6453 16944 -4.60405244955105e-01 6453 16968 -4.87379513125258e-01 6453 16992 -1.24457816678190e-01 6453 17016 -6.72695047920784e-03 6453 17304 -8.75431199719505e-06 6453 17328 -9.44207889060278e-04 6453 17352 -4.02285784986320e-03 6453 17376 -2.41855455161585e-03 6453 17400 -3.77341038477286e-04 6453 17424 -1.62243194400000e-11 6454 6454 1.00000000000000e+00 6455 6455 1.00000000000000e+00 6456 6456 1.00000000000000e+00 6457 6457 1.00000000000000e+00 6458 6458 1.00000000000000e+00 6459 6459 1.00000000000000e+00 6460 6460 1.00000000000000e+00 6461 6461 1.00000000000000e+00 6462 6462 1.00000000000000e+00 6463 6463 1.00000000000000e+00 6464 6464 1.00000000000000e+00 6465 6465 1.00000000000000e+00 6466 6466 1.00000000000000e+00 6467 6467 1.00000000000000e+00 6468 6468 1.00000000000000e+00 6469 6469 1.00000000000000e+00 6470 6470 1.00000000000000e+00 6471 6471 1.00000000000000e+00 6472 6472 1.00000000000000e+00 6473 6473 1.00000000000000e+00 6474 6474 1.00000000000000e+00 6475 6475 1.00000000000000e+00 6476 6476 1.00000000000000e+00 6477 4605 2.76977475000000e-12 6477 4629 1.26524962030200e-08 6477 4653 1.31921271842000e-09 6477 5205 1.44369951344170e-07 6477 5229 8.22857654823547e-03 6477 5253 1.48862480811000e-01 6477 5277 9.43953024244535e-02 6477 6477 1.87919716657745e+01 6477 5805 4.77661153452617e-05 6477 5829 1.06494160843872e-01 6477 5853 3.76737230205427e+00 6477 5877 1.09723187831808e+01 6477 5901 3.18335899755218e+00 6477 5925 2.33776633015677e-02 6477 6405 8.42968691652785e-04 6477 6429 3.44526895845705e-01 6477 6453 6.98081283453348e+00 6477 6501 1.07535791920088e+01 6477 6525 1.30411080783787e-01 6477 7005 1.53185448900641e-04 6477 7029 1.65476629083147e-01 6477 7053 2.68222047618868e+00 6477 7077 7.14083795988902e+00 6477 7101 3.15491505639734e+00 6477 7125 2.07534537618306e-03 6477 7605 2.13656657686152e-06 6477 7629 7.60696239971761e-03 6477 7653 9.86337930065506e-02 6477 7677 4.95673214491808e-01 6477 7701 1.02332936930004e-01 6477 8253 1.59825900986153e-04 6477 8277 3.47698256597034e-04 6477 8301 2.22990279934000e-09 6477 15264 -7.22506791617711e-06 6477 15288 -7.14390121570572e-02 6477 15312 -1.63815643084329e+00 6477 15336 -7.14013593441152e+00 6477 15360 -8.54372163120876e+00 6477 15384 -2.77159021881347e+00 6477 15672 -5.73103372691881e-06 6477 15696 -1.07496598483683e-01 6477 15720 -2.39548250059452e+00 6477 15744 -9.88798952076274e+00 6477 15768 -1.13396010740795e+01 6477 15792 -5.32072509956977e+00 6477 16080 -6.05285648237220e-07 6477 16104 -5.51496939522462e-02 6477 16128 -1.32287667106873e+00 6477 16152 -5.27654274785916e+00 6477 16176 -5.66071931761925e+00 6477 16200 -3.43113164804846e+00 6477 16512 -9.50245677540132e-03 6477 16536 -2.65653515247335e-01 6477 16560 -1.07744492518088e+00 6477 16584 -1.10367230428959e+00 6477 16608 -6.50483221529839e-01 6477 16920 -4.71154979898955e-05 6477 16944 -8.24395122984934e-03 6477 16968 -3.82846590392054e-02 6477 16992 -3.30507753107734e-02 6477 17016 -7.88146601817168e-03 6478 6478 1.00000000000000e+00 6479 6479 1.00000000000000e+00 6480 6480 1.00000000000000e+00 6481 6481 1.00000000000000e+00 6482 6482 1.00000000000000e+00 6483 6483 1.00000000000000e+00 6484 6484 1.00000000000000e+00 6485 6485 1.00000000000000e+00 6486 6486 1.00000000000000e+00 6487 6487 1.00000000000000e+00 6488 6488 1.00000000000000e+00 6489 6489 1.00000000000000e+00 6490 6490 1.00000000000000e+00 6491 6491 1.00000000000000e+00 6492 6492 1.00000000000000e+00 6493 6493 1.00000000000000e+00 6494 6494 1.00000000000000e+00 6495 6495 1.00000000000000e+00 6496 6496 1.00000000000000e+00 6497 6497 1.00000000000000e+00 6498 6498 1.00000000000000e+00 6499 6499 1.00000000000000e+00 6500 6500 1.00000000000000e+00 6501 5253 7.34843574811701e-03 6501 5277 9.22890593949159e-03 6501 6501 2.23335933073406e+01 6501 5829 1.20547285967305e-04 6501 5853 2.45504972402715e-01 6501 5877 4.64065275503852e+00 6501 5901 4.66704907915619e+00 6501 5925 1.09822659070734e-01 6501 6429 5.98389187080616e-04 6501 6453 2.79777465397478e-01 6501 6477 1.07535791920088e+01 6501 6525 6.14209279220208e-01 6501 7029 1.08990327590333e-04 6501 7053 1.09481969201774e-01 6501 7077 4.49687532096013e+00 6501 7101 4.86555311739395e+00 6501 7125 8.11544335798985e-03 6501 7629 1.13169651915079e-06 6501 7653 7.50438699090512e-03 6501 7677 2.76648894908256e-01 6501 7701 7.50878594565642e-02 6501 8253 2.36590348617504e-06 6501 8277 7.67643334023922e-06 6501 8301 1.09086417370000e-10 6501 15312 -1.34917509756817e-01 6501 15336 -2.47118942806333e+00 6501 15360 -1.09051654129365e+01 6501 15384 -8.01986008310702e+00 6501 15720 -9.62596793221488e-02 6501 15744 -1.81132176135845e+00 6501 15768 -1.07635608328284e+01 6501 15792 -1.13506209985234e+01 6501 16128 -8.94430899049745e-03 6501 16152 -2.20635404010206e-01 6501 16176 -2.45302092463149e+00 6501 16200 -3.59414605494446e+00 6501 16536 -1.92627463307750e-04 6501 16560 -1.51639929481643e-02 6501 16584 -2.52264035490331e-01 6501 16608 -4.03388434389513e-01 6501 16968 -1.30936415916661e-05 6501 16992 -9.97392066839201e-05 6501 17016 -1.07822922226178e-04 6502 6502 1.00000000000000e+00 6503 6503 1.00000000000000e+00 6504 6504 1.00000000000000e+00 6505 6505 1.00000000000000e+00 6506 6506 1.00000000000000e+00 6507 6507 1.00000000000000e+00 6508 6508 1.00000000000000e+00 6509 6509 1.00000000000000e+00 6510 6510 1.00000000000000e+00 6511 6511 1.00000000000000e+00 6512 6512 1.00000000000000e+00 6513 6513 1.00000000000000e+00 6514 6514 1.00000000000000e+00 6515 6515 1.00000000000000e+00 6516 6516 1.00000000000000e+00 6517 6517 1.00000000000000e+00 6518 6518 1.00000000000000e+00 6519 6519 1.00000000000000e+00 6520 6520 1.00000000000000e+00 6521 6521 1.00000000000000e+00 6522 6522 1.00000000000000e+00 6523 6523 1.00000000000000e+00 6524 6524 1.00000000000000e+00 6525 6525 1.03255630443834e+00 6525 5853 1.80194811187155e-04 6525 5877 4.36793967859327e-02 6525 5901 1.19790234883616e-01 6525 5925 6.14289272445810e-03 6525 6453 3.54827271089049e-04 6525 6477 1.30411080783787e-01 6525 6501 6.14209279220208e-01 6525 7053 3.30881342016362e-05 6525 7077 3.06976858560474e-02 6525 7101 6.52632710066779e-02 6525 7125 3.16146648534755e-04 6525 7677 3.44776521549182e-06 6525 7701 4.09279816281571e-06 6525 15336 -1.70855648037468e-02 6525 15360 -2.25383879039402e-01 6525 15384 -3.31168804452576e-01 6525 15744 -9.21270429339994e-03 6525 15768 -1.61524079405973e-01 6525 15792 -2.58559228758146e-01 6525 16152 -1.91406254721875e-04 6525 16176 -1.39520399675063e-02 6525 16200 -2.65642361519594e-02 6526 6526 1.00000000000000e+00 6527 6527 1.00000000000000e+00 6528 6528 1.00000000000000e+00 6529 6529 1.00000000000000e+00 6530 6530 1.00000000000000e+00 6531 6531 1.00000000000000e+00 6532 6532 1.00000000000000e+00 6533 6533 1.00000000000000e+00 6534 6534 1.00000000000000e+00 6535 6535 1.00000000000000e+00 6536 6536 1.00000000000000e+00 6537 6537 1.00000000000000e+00 6538 6538 1.00000000000000e+00 6539 6539 1.00000000000000e+00 6540 6540 1.00000000000000e+00 6541 6541 1.00000000000000e+00 6542 6542 1.00000000000000e+00 6543 6543 1.00000000000000e+00 6544 6544 1.00000000000000e+00 6545 6545 1.00000000000000e+00 6546 6546 1.00000000000000e+00 6547 6547 1.00000000000000e+00 6548 6548 1.00000000000000e+00 6549 6549 1.00000000000000e+00 6550 6550 1.00000000000000e+00 6551 6551 1.00000000000000e+00 6552 6552 1.00000000000000e+00 6553 6553 1.00000000000000e+00 6554 6554 1.00000000000000e+00 6555 6555 1.00000000000000e+00 6556 6556 1.00000000000000e+00 6557 6557 1.00000000000000e+00 6558 6558 1.00000000000000e+00 6559 6559 1.00000000000000e+00 6560 6560 1.00000000000000e+00 6561 6561 1.00000000000000e+00 6562 6562 1.00000000000000e+00 6563 6563 1.00000000000000e+00 6564 6564 1.00000000000000e+00 6565 6565 1.00000000000000e+00 6566 6566 1.00000000000000e+00 6567 6567 1.00000000000000e+00 6568 6568 1.00000000000000e+00 6569 6569 1.00000000000000e+00 6570 6570 1.00000000000000e+00 6571 6571 1.00000000000000e+00 6572 6572 1.00000000000000e+00 6573 6573 1.00000000000000e+00 6574 6574 1.00000000000000e+00 6575 6575 1.00000000000000e+00 6576 6576 1.00000000000000e+00 6577 6577 1.00000000000000e+00 6578 6578 1.00000000000000e+00 6579 6579 1.00000000000000e+00 6580 6580 1.00000000000000e+00 6581 6581 1.00000000000000e+00 6582 6582 1.00000000000000e+00 6583 6583 1.00000000000000e+00 6584 6584 1.00000000000000e+00 6585 6585 1.00000000000000e+00 6586 6586 1.00000000000000e+00 6587 6587 1.00000000000000e+00 6588 6588 1.00000000000000e+00 6589 6589 1.00000000000000e+00 6590 6590 1.00000000000000e+00 6591 6591 1.00000000000000e+00 6592 6592 1.00000000000000e+00 6593 6593 1.00000000000000e+00 6594 6594 1.00000000000000e+00 6595 6595 1.00000000000000e+00 6596 6596 1.00000000000000e+00 6597 6597 1.00000000000000e+00 6598 6598 1.00000000000000e+00 6599 6599 1.00000000000000e+00 6600 6600 1.00000000000000e+00 6601 6601 1.00000000000000e+00 6602 6602 1.00000000000000e+00 6603 6603 1.00000000000000e+00 6604 6604 1.00000000000000e+00 6605 6605 1.00000000000000e+00 6606 6606 1.00000000000000e+00 6607 6607 1.00000000000000e+00 6608 6608 1.00000000000000e+00 6609 6609 1.00000000000000e+00 6610 6610 1.00000000000000e+00 6611 6611 1.00000000000000e+00 6612 6612 1.00000000000000e+00 6613 6613 1.00000000000000e+00 6614 6614 1.00000000000000e+00 6615 6615 1.00000000000000e+00 6616 6616 1.00000000000000e+00 6617 6617 1.00000000000000e+00 6618 6618 1.00000000000000e+00 6619 6619 1.00000000000000e+00 6620 6620 1.00000000000000e+00 6621 6621 1.00000000000000e+00 6622 6622 1.00000000000000e+00 6623 6623 1.00000000000000e+00 6624 6624 1.00000000000000e+00 6625 6625 1.00000000000000e+00 6626 6626 1.00000000000000e+00 6627 6627 1.00000000000000e+00 6628 6628 1.00000000000000e+00 6629 6629 1.00000000000000e+00 6630 6630 1.00000000000000e+00 6631 6631 1.00000000000000e+00 6632 6632 1.00000000000000e+00 6633 6633 1.00000000000000e+00 6634 6634 1.00000000000000e+00 6635 6635 1.00000000000000e+00 6636 6636 1.00000000000000e+00 6637 6637 1.00000000000000e+00 6638 6638 1.00000000000000e+00 6639 6639 1.00000000000000e+00 6640 6640 1.00000000000000e+00 6641 6641 1.00000000000000e+00 6642 6642 1.00000000000000e+00 6643 6643 1.00000000000000e+00 6644 6644 1.00000000000000e+00 6645 6645 1.00000000000000e+00 6646 6646 1.00000000000000e+00 6647 6647 1.00000000000000e+00 6648 6648 1.00000000000000e+00 6649 6649 1.00000000000000e+00 6650 6650 1.00000000000000e+00 6651 6651 1.00000000000000e+00 6652 6652 1.00000000000000e+00 6653 6653 1.00000000000000e+00 6654 6654 1.00000000000000e+00 6655 6655 1.00000000000000e+00 6656 6656 1.00000000000000e+00 6657 6657 1.00000000000000e+00 6658 6658 1.00000000000000e+00 6659 6659 1.00000000000000e+00 6660 6660 1.00000000000000e+00 6661 6661 1.00000000000000e+00 6662 6662 1.00000000000000e+00 6663 6663 1.00000000000000e+00 6664 6664 1.00000000000000e+00 6665 6665 1.00000000000000e+00 6666 6666 1.00000000000000e+00 6667 6667 1.00000000000000e+00 6668 6668 1.00000000000000e+00 6669 6669 1.00000000000000e+00 6670 6670 1.00000000000000e+00 6671 6671 1.00000000000000e+00 6672 6672 1.00000000000000e+00 6673 6673 1.00000000000000e+00 6674 6674 1.00000000000000e+00 6675 6675 1.00000000000000e+00 6676 6676 1.00000000000000e+00 6677 6677 1.00000000000000e+00 6678 6678 1.00000000000000e+00 6679 6679 1.00000000000000e+00 6680 6680 1.00000000000000e+00 6681 6681 1.00000000000000e+00 6682 6682 1.00000000000000e+00 6683 6683 1.00000000000000e+00 6684 6684 1.00000000000000e+00 6685 6685 1.00000000000000e+00 6686 6686 1.00000000000000e+00 6687 6687 1.00000000000000e+00 6688 6688 1.00000000000000e+00 6689 6689 1.00000000000000e+00 6690 6690 1.00000000000000e+00 6691 6691 1.00000000000000e+00 6692 6692 1.00000000000000e+00 6693 6693 1.00000000000000e+00 6694 6694 1.00000000000000e+00 6695 6695 1.00000000000000e+00 6696 6696 1.00000000000000e+00 6697 6697 1.00000000000000e+00 6698 6698 1.00000000000000e+00 6699 6699 1.00000000000000e+00 6700 6700 1.00000000000000e+00 6701 6701 1.00000000000000e+00 6702 6702 1.00000000000000e+00 6703 6703 1.00000000000000e+00 6704 6704 1.00000000000000e+00 6705 6705 1.00000000000000e+00 6706 6706 1.00000000000000e+00 6707 6707 1.00000000000000e+00 6708 6708 1.00000000000000e+00 6709 6709 1.00000000000000e+00 6710 6710 1.00000000000000e+00 6711 6711 1.00000000000000e+00 6712 6712 1.00000000000000e+00 6713 6713 1.00000000000000e+00 6714 6714 1.00000000000000e+00 6715 6715 1.00000000000000e+00 6716 6716 1.00000000000000e+00 6717 6717 1.00000000000106e+00 6717 6141 2.16381754700000e-11 6717 6165 3.19243961200000e-11 6717 6741 8.87085011605740e-07 6717 6765 8.87219725627870e-07 6717 6789 8.85453302770000e-10 6717 7317 1.23430727922280e-07 6717 7341 4.40213679917620e-06 6717 7365 1.86054858380128e-06 6717 7389 9.32791876860000e-10 6717 7917 1.65206772175220e-07 6717 7941 1.47101733658930e-06 6717 7965 1.76934258518440e-07 6717 7989 7.31269937100000e-11 6717 8517 1.09086417370000e-10 6717 8541 2.22990279934000e-09 6717 8565 1.91012521360000e-10 6717 8589 3.55340800000000e-14 6717 19488 -6.28923985187290e-07 6717 19512 -3.15062376914740e-07 6717 19536 -1.71538377450000e-10 6717 19896 -2.99407615582719e-06 6717 19920 -1.50043593642063e-06 6717 19944 -9.70816716290000e-10 6717 20304 -2.54244484549936e-06 6717 20328 -1.27580809196146e-06 6717 20352 -1.31019120337000e-09 6717 20712 -4.78380215078020e-07 6717 20736 -2.40186428761680e-07 6717 20760 -2.84663206480000e-10 6718 6718 1.00000000000000e+00 6719 6719 1.00000000000000e+00 6720 6720 1.00000000000000e+00 6721 6721 1.00000000000000e+00 6722 6722 1.00000000000000e+00 6723 6723 1.00000000000000e+00 6724 6724 1.00000000000000e+00 6725 6725 1.00000000000000e+00 6726 6726 1.00000000000000e+00 6727 6727 1.00000000000000e+00 6728 6728 1.00000000000000e+00 6729 6729 1.00000000000000e+00 6730 6730 1.00000000000000e+00 6731 6731 1.00000000000000e+00 6732 6732 1.00000000000000e+00 6733 6733 1.00000000000000e+00 6734 6734 1.00000000000000e+00 6735 6735 1.00000000000000e+00 6736 6736 1.00000000000000e+00 6737 6737 1.00000000000000e+00 6738 6738 1.00000000000000e+00 6739 6739 1.00000000000000e+00 6740 6740 1.00000000000000e+00 6741 4965 5.45496585000000e-12 6741 4989 1.51028246000000e-11 6741 6741 3.46517180999951e+00 6741 5565 3.63532297866496e-03 6741 5589 2.12411346181328e-03 6741 5613 1.55053844990900e-08 6741 5637 1.50650000000000e-16 6741 6141 5.97228003931995e-02 6741 6165 7.56157576803351e-01 6741 6189 1.27588687451474e-01 6741 6213 2.13322127890803e-04 6741 6237 4.20640000000000e-16 6741 6717 8.87085011605740e-07 6741 6765 5.54000696248029e+00 6741 6789 2.74020269122420e-01 6741 6813 4.39095393213610e-04 6741 7317 1.38154135506727e-02 6741 7341 4.34538569436148e+00 6741 7365 3.62600246314900e+00 6741 7389 8.90814666278415e-02 6741 7413 2.27667645083756e-05 6741 7917 1.20671885798247e-02 6741 7941 2.74929435139290e-01 6741 7965 1.36090564095540e-01 6741 7989 4.58947816494331e-03 6741 8013 2.46575223213160e-07 6741 8517 7.67643334023879e-06 6741 8541 3.47698256597015e-04 6741 8565 2.33188526392926e-04 6741 8589 1.65821052232080e-07 6741 8613 7.79578600000000e-14 6741 9165 2.37500000000000e-16 6741 9189 1.61450000000000e-16 6741 18264 -1.40028719608416e-06 6741 18288 -7.01874925208510e-07 6741 18312 -4.94664904690000e-10 6741 18672 -7.35208925300149e-02 6741 18696 -3.98978040899679e-02 6741 18720 -8.96387949988702e-04 6741 19080 -9.91396379203772e-01 6741 19104 -5.54951980889222e-01 6741 19128 -1.69311411195078e-02 6741 19152 -4.00202380170110e-07 6741 19488 -3.93265630313751e+00 6741 19512 -2.21730298722638e+00 6741 19536 -7.17232553767054e-02 6741 19560 -4.35062775778442e-06 6741 19896 -5.00898442642436e+00 6741 19920 -2.79768642905908e+00 6741 19944 -8.38121177760741e-02 6741 19968 -1.13997207202419e-05 6741 20304 -1.19951607928589e+00 6741 20328 -6.70418245275494e-01 6741 20352 -2.01988474371417e-02 6741 20376 -2.75079980372752e-06 6741 20712 -3.24275802740579e-02 6741 20736 -1.86238563130753e-02 6741 20760 -6.88591247467957e-04 6741 20784 -2.45391655890000e-10 6742 6742 1.00000000000000e+00 6743 6743 1.00000000000000e+00 6744 6744 1.00000000000000e+00 6745 6745 1.00000000000000e+00 6746 6746 1.00000000000000e+00 6747 6747 1.00000000000000e+00 6748 6748 1.00000000000000e+00 6749 6749 1.00000000000000e+00 6750 6750 1.00000000000000e+00 6751 6751 1.00000000000000e+00 6752 6752 1.00000000000000e+00 6753 6753 1.00000000000000e+00 6754 6754 1.00000000000000e+00 6755 6755 1.00000000000000e+00 6756 6756 1.00000000000000e+00 6757 6757 1.00000000000000e+00 6758 6758 1.00000000000000e+00 6759 6759 1.00000000000000e+00 6760 6760 1.00000000000000e+00 6761 6761 1.00000000000000e+00 6762 6762 1.00000000000000e+00 6763 6763 1.00000000000000e+00 6764 6764 1.00000000000000e+00 6765 4965 4.57242407563110e-07 6765 4989 1.26615946688092e-06 6765 6765 2.55581485016706e+01 6765 5565 1.92744512039673e-01 6765 5589 2.69689879613932e-01 6765 5613 5.64636705605440e-03 6765 5637 1.54657054999062e-06 6765 6141 3.02172057297916e-01 6765 6165 9.26996687393087e+00 6765 6189 4.15240925190611e+00 6765 6213 1.02243790726411e-01 6765 6237 2.67866754088798e-04 6765 6717 8.87219725627870e-07 6765 6741 5.54000696248029e+00 6765 6789 6.20292311079303e+00 6765 6813 3.19728559420906e-01 6765 6837 4.54537256974681e-04 6765 7317 8.35456992673660e-03 6765 7341 5.44645677899677e+00 6765 7365 8.40787723111205e+00 6765 7389 2.14495058601446e+00 6765 7413 1.46585707143297e-01 6765 7437 1.97278770701292e-05 6765 7917 4.31692185634901e-03 6765 7941 2.50073467614362e-01 6765 7965 3.37952987363556e-01 6765 7989 1.20597050544893e-01 6765 8013 4.53171246542365e-03 6765 8037 1.74930753381088e-06 6765 8517 2.36590348617491e-06 6765 8541 1.59825900986144e-04 6765 8565 2.67258390988049e-04 6765 8589 2.62041531254365e-04 6765 8613 2.74962501930974e-06 6765 9165 1.70813000000000e-15 6765 9189 1.16118000000000e-15 6765 18264 -1.24451148894911e-01 6765 18288 -8.86963956974809e-02 6765 18312 -9.12151484469939e-03 6765 18336 -4.19575438955588e-04 6765 18672 -2.26850405724510e+00 6765 18696 -1.88437508933345e+00 6765 18720 -3.02877918445016e-01 6765 18744 -2.38431983512811e-02 6765 18768 -2.45870515439580e-07 6765 19080 -9.88947253249624e+00 6765 19104 -8.42168416152380e+00 6765 19128 -1.52603805139535e+00 6765 19152 -1.43573546139144e-01 6765 19176 -4.68209319752302e-05 6765 19488 -1.36483898526968e+01 6765 19512 -1.11982184290233e+01 6765 19536 -2.17167163998993e+00 6765 19560 -2.48937627752007e-01 6765 19584 -1.93029350231710e-04 6765 19896 -7.28706157576650e+00 6765 19920 -5.46128485173952e+00 6765 19944 -8.51279404173897e-01 6765 19968 -8.96751616157913e-02 6765 19992 -8.35721701630051e-05 6765 20304 -1.18740850620942e+00 6765 20328 -8.34970990283429e-01 6765 20352 -1.01470518843151e-01 6765 20376 -8.79520094271818e-03 6765 20400 -9.43368006238332e-06 6765 20712 -9.65306573404738e-03 6765 20736 -6.21525660309202e-03 6765 20760 -3.96784765631872e-04 6765 20784 -1.76489563238000e-09 6766 6766 1.00000000000000e+00 6767 6767 1.00000000000000e+00 6768 6768 1.00000000000000e+00 6769 6769 1.00000000000000e+00 6770 6770 1.00000000000000e+00 6771 6771 1.00000000000000e+00 6772 6772 1.00000000000000e+00 6773 6773 1.00000000000000e+00 6774 6774 1.00000000000000e+00 6775 6775 1.00000000000000e+00 6776 6776 1.00000000000000e+00 6777 6777 1.00000000000000e+00 6778 6778 1.00000000000000e+00 6779 6779 1.00000000000000e+00 6780 6780 1.00000000000000e+00 6781 6781 1.00000000000000e+00 6782 6782 1.00000000000000e+00 6783 6783 1.00000000000000e+00 6784 6784 1.00000000000000e+00 6785 6785 1.00000000000000e+00 6786 6786 1.00000000000000e+00 6787 6787 1.00000000000000e+00 6788 6788 1.00000000000000e+00 6789 4965 1.24828921303143e-06 6789 4989 1.57546452617895e-04 6789 5013 1.17729495477171e-04 6789 5037 5.57780449472110e-07 6789 6789 1.64581799012995e+01 6789 5565 1.26642207232515e-01 6789 5589 3.65589698849336e-01 6789 5613 9.38903743213104e-02 6789 5637 4.36077583164108e-03 6789 5661 7.38583222521842e-06 6789 6141 3.21160075323171e-02 6789 6165 3.20527510274175e+00 6789 6189 5.95013494598463e+00 6789 6213 2.52076813096791e+00 6789 6237 1.20361755725483e-01 6789 6261 2.41938520180963e-04 6789 6285 1.27120000000000e-16 6789 6717 8.85453302770000e-10 6789 6741 2.74020269122420e-01 6789 6765 6.20292311079303e+00 6789 6813 6.54732452314674e+00 6789 6837 2.93701725343242e-01 6789 6861 2.93336389137450e-04 6789 6885 8.37030000000000e-16 6789 7317 9.01164771458647e-06 6789 7341 1.18442951526061e-01 6789 7365 2.20243939165181e+00 6789 7389 6.56258203238990e+00 6789 7413 2.43971202276567e+00 6789 7437 1.19507368978332e-01 6789 7461 6.51738304218140e-05 6789 7917 1.76345157057951e-06 6789 7941 5.34094459172504e-03 6789 7965 1.03910226659848e-01 6789 7989 3.24085759625737e-01 6789 8013 1.32107227727700e-01 6789 8037 2.66749886865825e-03 6789 8061 1.93816942058855e-06 6789 8565 1.40199035422931e-04 6789 8589 4.67153324025481e-04 6789 8613 8.91005421407023e-05 6789 8637 6.72456755290733e-06 6789 17856 -3.08469849872074e-04 6789 17880 -3.41592650809732e-03 6789 17904 -9.14157579495082e-03 6789 17928 -2.60171715117956e-03 6789 17952 -1.04917510642632e-04 6789 18264 -1.37927352900204e-01 6789 18288 -3.74380593890009e-01 6789 18312 -5.76961529729763e-01 6789 18336 -1.82793376238334e-01 6789 18360 -1.36571193791506e-02 6789 18384 -2.67149432083500e-08 6789 18672 -1.14051294456303e+00 6789 18696 -3.15244129814919e+00 6789 18720 -4.32881999660597e+00 6789 18744 -1.41134525042509e+00 6789 18768 -1.19803551127474e-01 6789 18792 -1.74967604472405e-04 6789 19080 -2.69515405120270e+00 6789 19104 -7.85669670876060e+00 6789 19128 -1.02216097184029e+01 6789 19152 -3.40775270230959e+00 6789 19176 -3.13158933648098e-01 6789 19200 -8.50483332369755e-04 6789 19488 -1.33921351264526e+00 6789 19512 -4.42373616499346e+00 6789 19536 -6.39325921400946e+00 6789 19560 -2.16294920165834e+00 6789 19584 -1.98701968048531e-01 6789 19608 -7.78915299212615e-04 6789 19896 -2.12057904827480e-01 6789 19920 -8.00085278224094e-01 6789 19944 -1.20828029646936e+00 6789 19968 -3.96364039902618e-01 6789 19992 -3.39204386699661e-02 6789 20016 -1.51013638628261e-04 6789 20304 -6.82991249166325e-03 6789 20328 -3.21841845409029e-02 6789 20352 -3.98639657652787e-02 6789 20376 -9.44696404610521e-03 6789 20400 -2.48574860122958e-04 6790 6790 1.00000000000000e+00 6791 6791 1.00000000000000e+00 6792 6792 1.00000000000000e+00 6793 6793 1.00000000000000e+00 6794 6794 1.00000000000000e+00 6795 6795 1.00000000000000e+00 6796 6796 1.00000000000000e+00 6797 6797 1.00000000000000e+00 6798 6798 1.00000000000000e+00 6799 6799 1.00000000000000e+00 6800 6800 1.00000000000000e+00 6801 6801 1.00000000000000e+00 6802 6802 1.00000000000000e+00 6803 6803 1.00000000000000e+00 6804 6804 1.00000000000000e+00 6805 6805 1.00000000000000e+00 6806 6806 1.00000000000000e+00 6807 6807 1.00000000000000e+00 6808 6808 1.00000000000000e+00 6809 6809 1.00000000000000e+00 6810 6810 1.00000000000000e+00 6811 6811 1.00000000000000e+00 6812 6812 1.00000000000000e+00 6813 4965 9.84462529829330e-07 6813 4989 2.11681717864968e-04 6813 5013 4.19351447657609e-04 6813 5037 1.86095276753439e-05 6813 5061 1.62962235055496e-06 6813 6813 1.52048834911816e+01 6813 5565 4.48672969599088e-03 6813 5589 1.05567678610662e-01 6813 5613 3.22180068646858e-01 6813 5637 1.28294801162542e-01 6813 5661 3.81948091007359e-03 6813 5685 2.33286633743796e-06 6813 6141 1.00310287655639e-04 6813 6165 8.83750882412685e-02 6813 6189 2.54478197047024e+00 6813 6213 6.10174473440780e+00 6813 6237 2.30005723638074e+00 6813 6261 1.03852201314302e-01 6813 6285 2.24058402351051e-04 6813 6309 1.22830000000000e-16 6813 6741 4.39095393213610e-04 6813 6765 3.19728559420907e-01 6813 6789 6.54732452314674e+00 6813 6837 5.46392976673366e+00 6813 6861 2.86213876935507e-01 6813 6885 2.33536006397607e-04 6813 6909 1.87940000000000e-16 6813 7341 6.44276186536662e-05 6813 7365 1.48638855963737e-01 6813 7389 2.44145806955094e+00 6813 7413 5.76486307275872e+00 6813 7437 2.13680044591841e+00 6813 7461 9.54297444868273e-02 6813 7485 1.15050029531136e-04 6813 7941 1.89409891545972e-06 6813 7965 4.53064416783982e-03 6813 7989 1.29265031934991e-01 6813 8013 2.67067283445570e-01 6813 8037 1.09523577382538e-01 6813 8061 2.99554152661755e-03 6813 8085 8.44175032531240e-07 6813 8565 1.07354659163104e-06 6813 8589 1.87607910286074e-05 6813 8613 5.00161568839039e-04 6813 8637 2.46473168732267e-04 6813 8661 2.33219156354420e-06 6813 17472 -3.64761453425580e-07 6813 17496 -4.38145079191064e-05 6813 17520 -1.77369989909068e-04 6813 17544 -7.26889822415083e-05 6813 17568 -7.58338003402606e-06 6813 17856 -3.37059951672540e-04 6813 17880 -2.42284408096523e-02 6813 17904 -1.36403831570532e-01 6813 17928 -2.07628844917460e-01 6813 17952 -7.08050616192474e-02 6813 17976 -6.56477375214337e-03 6813 18000 -6.64224849700000e-11 6813 18264 -9.34229118965531e-03 6813 18288 -3.40415392059884e-01 6813 18312 -1.72365237570308e+00 6813 18336 -2.40623175819992e+00 6813 18360 -8.81184445223626e-01 6813 18384 -9.59646298107557e-02 6813 18408 -3.19949948932858e-04 6813 18672 -4.00258339285648e-02 6813 18696 -1.25135147236014e+00 6813 18720 -6.06421539807080e+00 6813 18744 -8.08169379493093e+00 6813 18768 -3.07599406256259e+00 6813 18792 -3.62324339704618e-01 6813 18816 -2.16668756254664e-03 6813 19080 -3.89639863280268e-02 6813 19104 -1.28251347224221e+00 6813 19128 -6.17588936427211e+00 6813 19152 -8.01336539963230e+00 6813 19176 -3.09628035087761e+00 6813 19200 -3.81038440366006e-01 6813 19224 -3.87791204741474e-03 6813 19488 -8.19121310477237e-03 6813 19512 -3.59609790199516e-01 6813 19536 -1.79075268972267e+00 6813 19560 -2.32104302524854e+00 6813 19584 -8.49994985456517e-01 6813 19608 -9.71852575256471e-02 6813 19632 -9.28518009400147e-04 6813 19896 -1.19661164935186e-04 6813 19920 -2.67245997549204e-02 6813 19944 -1.44830657291900e-01 6813 19968 -1.90281153849867e-01 6813 19992 -6.02435661366238e-02 6813 20016 -5.16812501595168e-03 6813 20040 -1.04073115619178e-05 6813 20328 -2.56465629442634e-05 6813 20352 -1.18646387859604e-04 6813 20376 -8.98871072744660e-05 6813 20400 -1.60601360825507e-05 6814 6814 1.00000000000000e+00 6815 6815 1.00000000000000e+00 6816 6816 1.00000000000000e+00 6817 6817 1.00000000000000e+00 6818 6818 1.00000000000000e+00 6819 6819 1.00000000000000e+00 6820 6820 1.00000000000000e+00 6821 6821 1.00000000000000e+00 6822 6822 1.00000000000000e+00 6823 6823 1.00000000000000e+00 6824 6824 1.00000000000000e+00 6825 6825 1.00000000000000e+00 6826 6826 1.00000000000000e+00 6827 6827 1.00000000000000e+00 6828 6828 1.00000000000000e+00 6829 6829 1.00000000000000e+00 6830 6830 1.00000000000000e+00 6831 6831 1.00000000000000e+00 6832 6832 1.00000000000000e+00 6833 6833 1.00000000000000e+00 6834 6834 1.00000000000000e+00 6835 6835 1.00000000000000e+00 6836 6836 1.00000000000000e+00 6837 4989 8.25552108883428e-06 6837 5013 1.11714081298827e-04 6837 5037 6.00232747143536e-04 6837 5061 8.84933336397303e-05 6837 6837 1.39656075658925e+01 6837 5589 6.21683783583436e-03 6837 5613 1.30553376912940e-01 6837 5637 2.78594960790360e-01 6837 5661 9.20977706503654e-02 6837 5685 4.96537002526922e-03 6837 5709 5.53908622508738e-06 6837 6165 1.46665177000228e-04 6837 6189 1.03318965213877e-01 6837 6213 2.31147641763547e+00 6837 6237 5.35035677744415e+00 6837 6261 2.15568720645538e+00 6837 6285 1.01104182244151e-01 6837 6309 1.76905947185153e-04 6837 6765 4.54537256974681e-04 6837 6789 2.93701725343242e-01 6837 6813 5.46392976673366e+00 6837 6861 5.01444778180920e+00 6837 6885 2.78473549213862e-01 6837 6909 2.49408950444565e-04 6837 7365 1.17189641502779e-04 6837 7389 1.24287728839427e-01 6837 7413 2.13949290794893e+00 6837 7437 5.12682007264057e+00 6837 7461 2.12226312376197e+00 6837 7485 8.52217717988993e-02 6837 7509 1.11059283569015e-04 6837 7965 1.40334369341951e-05 6837 7989 3.00569983360122e-03 6837 8013 9.81329879921941e-02 6837 8037 2.80952884632940e-01 6837 8061 1.02519668862700e-01 6837 8085 3.45602568546582e-03 6837 8109 9.31527367732900e-08 6837 8589 7.22147823010710e-07 6837 8613 1.25135402336308e-04 6837 8637 1.40080260134697e-04 6837 8661 1.62005155421068e-04 6837 8685 1.21535498385411e-05 6837 17472 -7.35209993245750e-07 6837 17496 -1.95469579268325e-03 6837 17520 -1.83378568091769e-02 6837 17544 -4.65170820385603e-02 6837 17568 -2.03097815182608e-02 6837 17592 -2.44491993247956e-03 6837 17880 -4.16543717404543e-03 6837 17904 -1.16903644012217e-01 6837 17928 -6.49732174719315e-01 6837 17952 -1.14612630496388e+00 6837 17976 -5.14869724059545e-01 6837 18000 -6.87655032636452e-02 6837 18024 -3.19429685077528e-04 6837 18288 -2.34736856990417e-02 6837 18312 -6.46169679302480e-01 6837 18336 -3.42870701505585e+00 6837 18360 -5.69463606063286e+00 6837 18384 -2.63136498869216e+00 6837 18408 -3.73523759437001e-01 6837 18432 -3.92424215915943e-03 6837 18696 -3.18464976229811e-02 6837 18720 -9.86091564195365e-01 6837 18744 -5.27554891058864e+00 6837 18768 -8.67746750985503e+00 6837 18792 -4.15319957528700e+00 6837 18816 -6.28655875378812e-01 6837 18840 -1.13536029586752e-02 6837 19104 -8.39152786425444e-03 6837 19128 -3.90543641669703e-01 6837 19152 -2.22780410194087e+00 6837 19176 -3.75690140381861e+00 6837 19200 -1.73159753784740e+00 6837 19224 -2.51669427949074e-01 6837 19248 -4.43884181165065e-03 6837 19512 -3.92140677873941e-04 6837 19536 -4.81042644266766e-02 6837 19560 -2.95079386881859e-01 6837 19584 -5.08138615513831e-01 6837 19608 -2.18693144643874e-01 6837 19632 -2.92174748184043e-02 6837 19656 -4.48079598200331e-04 6837 19944 -6.49930412057381e-04 6837 19968 -3.82397426018649e-03 6837 19992 -5.56934197282910e-03 6837 20016 -1.31385706373231e-03 6837 20040 -2.24011129438342e-05 6838 6838 1.00000000000000e+00 6839 6839 1.00000000000000e+00 6840 6840 1.00000000000000e+00 6841 6841 1.00000000000000e+00 6842 6842 1.00000000000000e+00 6843 6843 1.00000000000000e+00 6844 6844 1.00000000000000e+00 6845 6845 1.00000000000000e+00 6846 6846 1.00000000000000e+00 6847 6847 1.00000000000000e+00 6848 6848 1.00000000000000e+00 6849 6849 1.00000000000000e+00 6850 6850 1.00000000000000e+00 6851 6851 1.00000000000000e+00 6852 6852 1.00000000000000e+00 6853 6853 1.00000000000000e+00 6854 6854 1.00000000000000e+00 6855 6855 1.00000000000000e+00 6856 6856 1.00000000000000e+00 6857 6857 1.00000000000000e+00 6858 6858 1.00000000000000e+00 6859 6859 1.00000000000000e+00 6860 6860 1.00000000000000e+00 6861 5013 1.30211113888135e-05 6861 5037 1.80679317919321e-04 6861 5061 1.38422994045988e-04 6861 5085 1.17724328222055e-04 6861 5109 7.87821774847100e-07 6861 6861 1.35061797798593e+01 6861 5589 8.53127317558100e-08 6861 5613 4.01865511835699e-03 6861 5637 1.04998272549907e-01 6861 5661 2.80488210935187e-01 6861 5685 9.57663978761791e-02 6861 5709 2.64740635360718e-03 6861 5733 1.21535498385409e-05 6861 6189 1.28308173330615e-04 6861 6213 8.98139243420842e-02 6861 6237 2.15151970522629e+00 6861 6261 5.03563186199639e+00 6861 6285 2.02226749522321e+00 6861 6309 1.10241595057533e-01 6861 6333 8.99998833830974e-05 6861 6789 2.93336389137450e-04 6861 6813 2.86213876935507e-01 6861 6837 5.01444778180920e+00 6861 6885 4.97708104918747e+00 6861 6909 2.55684893376081e-01 6861 6933 3.17936008973021e-04 6861 7389 1.78814708764568e-04 6861 7413 1.03347535291059e-01 6861 7437 2.12534457488609e+00 6861 7461 5.01207283480071e+00 6861 7485 2.01957827044318e+00 6861 7509 8.32621938773882e-02 6861 7533 1.14629817987541e-04 6861 7989 5.31858846635944e-06 6861 8013 4.96671538245732e-03 6861 8037 9.01462639339668e-02 6861 8061 2.47676792294817e-01 6861 8085 1.07567458814668e-01 6861 8109 4.46279463381609e-03 6861 8637 7.84494215473662e-05 6861 8661 5.56335941560830e-04 6861 8685 8.99998833830986e-05 6861 8709 5.76185385784570e-06 6861 17112 -2.02242391247020e-05 6861 17136 -1.17815807475611e-03 6861 17160 -4.92164144620354e-03 6861 17184 -3.14675205445586e-03 6861 17208 -5.12372734049640e-04 6861 17496 -4.92803893296477e-04 6861 17520 -2.95734225758219e-02 6861 17544 -2.13828212972153e-01 6861 17568 -4.78760119398734e-01 6861 17592 -2.60977235824411e-01 6861 17616 -4.04287971817127e-02 6861 17640 -2.44302264716897e-04 6861 17904 -5.17996492292174e-03 6861 17928 -2.58902342369891e-01 6861 17952 -1.71860913009061e+00 6861 17976 -3.58766882084473e+00 6861 18000 -1.99343558131644e+00 6861 18024 -3.30604382240392e-01 6861 18048 -5.97874547333352e-03 6861 18312 -1.37345708174825e-02 6861 18336 -6.56082329760212e-01 6861 18360 -4.18131636633926e+00 6861 18384 -8.39721704319996e+00 6861 18408 -4.76234705419661e+00 6861 18432 -8.36607401537234e-01 6861 18456 -2.31392107675319e-02 6861 18720 -4.83582745070658e-03 6861 18744 -3.95378165876490e-01 6861 18768 -2.69588979393633e+00 6861 18792 -5.60361692656959e+00 6861 18816 -3.12316738344963e+00 6861 18840 -5.46152839053614e-01 6861 18864 -1.65572343303867e-02 6861 19128 -4.06769525242688e-04 6861 19152 -7.37384779871934e-02 6861 19176 -5.34791752860116e-01 6861 19200 -1.14368139928720e+00 6861 19224 -6.00080589743577e-01 6861 19248 -9.93778601986994e-02 6861 19272 -2.89134898941356e-03 6861 19560 -2.69918411505053e-03 6861 19584 -2.16163911218320e-02 6861 19608 -4.78374423681392e-02 6861 19632 -1.82588596240220e-02 6861 19656 -1.86222575103139e-03 6861 19680 -6.46536115564740e-07 6862 6862 1.00000000000000e+00 6863 6863 1.00000000000000e+00 6864 6864 1.00000000000000e+00 6865 6865 1.00000000000000e+00 6866 6866 1.00000000000000e+00 6867 6867 1.00000000000000e+00 6868 6868 1.00000000000000e+00 6869 6869 1.00000000000000e+00 6870 6870 1.00000000000000e+00 6871 6871 1.00000000000000e+00 6872 6872 1.00000000000000e+00 6873 6873 1.00000000000000e+00 6874 6874 1.00000000000000e+00 6875 6875 1.00000000000000e+00 6876 6876 1.00000000000000e+00 6877 6877 1.00000000000000e+00 6878 6878 1.00000000000000e+00 6879 6879 1.00000000000000e+00 6880 6880 1.00000000000000e+00 6881 6881 1.00000000000000e+00 6882 6882 1.00000000000000e+00 6883 6883 1.00000000000000e+00 6884 6884 1.00000000000000e+00 6885 5037 2.33359908483914e-06 6885 5061 2.33697018029741e-04 6885 5085 4.91919438840005e-04 6885 5109 1.58758229703413e-05 6885 5133 8.44175032531260e-07 6885 6885 1.30625624573197e+01 6885 5613 7.94031900597660e-07 6885 5637 3.05267476070686e-03 6885 5661 1.06392574754094e-01 6885 5685 2.40930019848202e-01 6885 5709 1.08772846312620e-01 6885 5733 3.45602568546587e-03 6885 5757 1.36098486988972e-06 6885 6213 1.21338636937127e-04 6885 6237 9.29174454274847e-02 6885 6261 2.02145129931115e+00 6885 6285 5.09616803122629e+00 6885 6309 1.94522732471998e+00 6885 6333 1.07567458814670e-01 6885 6357 7.05197533765977e-05 6885 6789 8.37030000000000e-16 6885 6813 2.33536006397607e-04 6885 6837 2.78473549213862e-01 6885 6861 4.97708104918747e+00 6885 6909 4.95787514450108e+00 6885 6933 2.43852730636461e-01 6885 6957 4.29967431666142e-04 6885 7389 5.46280000000000e-16 6885 7413 2.12636592359750e-04 6885 7437 9.78293108358399e-02 6885 7461 2.00834264652635e+00 6885 7485 4.96244048857827e+00 6885 7509 2.02259967515321e+00 6885 7533 8.43200148895843e-02 6885 7557 9.44854427779006e-05 6885 8013 2.57973066677049e-06 6885 8037 3.29078610576365e-03 6885 8061 1.05200073412954e-01 6885 8085 2.43852730636460e-01 6885 8109 9.42274113557096e-02 6885 8133 5.55556324055004e-03 6885 8637 1.59094207830703e-06 6885 8661 1.66984562117840e-05 6885 8685 3.17936008973027e-04 6885 8709 2.09858096953750e-04 6885 8733 1.15867545269004e-06 6885 16752 -1.22463021456102e-05 6885 16776 -6.59348435444707e-05 6885 16800 -8.00448419937305e-05 6885 16824 -1.69496349620301e-05 6885 17112 -9.82651904440210e-06 6885 17136 -4.85672977793055e-03 6885 17160 -5.25159046809858e-02 6885 17184 -1.55713479595498e-01 6885 17208 -1.05165732007160e-01 6885 17232 -1.84595574985241e-02 6885 17256 -1.27258756124396e-04 6885 17520 -9.85286141680775e-04 6885 17544 -9.46399802028858e-02 6885 17568 -7.75414771434272e-01 6885 17592 -1.96287925132751e+00 6885 17616 -1.32125388491844e+00 6885 17640 -2.53821298188305e-01 6885 17664 -7.04436337218164e-03 6885 17928 -4.15438031221892e-03 6885 17952 -3.76017434900472e-01 6885 17976 -2.88002145247029e+00 6885 18000 -6.90984690437406e+00 6885 18024 -4.66386840319997e+00 6885 18048 -9.41744134857344e-01 6885 18072 -3.60917035854071e-02 6885 18336 -2.38851479682783e-03 6885 18360 -3.63297660228323e-01 6885 18384 -2.89436506660370e+00 6885 18408 -7.08479211929128e+00 6885 18432 -4.81535243342509e+00 6885 18456 -1.00780222794440e+00 6885 18480 -4.61905750663568e-02 6885 18744 -3.60635957870881e-04 6885 18768 -9.77203966759713e-02 6885 18792 -8.34174209426216e-01 6885 18816 -2.12020356069701e+00 6885 18840 -1.37644441535068e+00 6885 18864 -2.74213120676921e-01 6885 18888 -1.12740152964936e-02 6885 19152 -6.06677257560000e-10 6885 19176 -6.88640208816345e-03 6885 19200 -6.74916128452624e-02 6885 19224 -1.83173325846020e-01 6885 19248 -1.06320221811238e-01 6885 19272 -1.79537556714430e-02 6885 19296 -3.62720964486766e-04 6885 19584 -8.91149563795797e-06 6885 19608 -8.04923988436113e-05 6885 19632 -1.88632296335792e-04 6885 19656 -4.61869584146426e-05 6885 19680 -3.35135530715780e-07 6886 6886 1.00000000000000e+00 6887 6887 1.00000000000000e+00 6888 6888 1.00000000000000e+00 6889 6889 1.00000000000000e+00 6890 6890 1.00000000000000e+00 6891 6891 1.00000000000000e+00 6892 6892 1.00000000000000e+00 6893 6893 1.00000000000000e+00 6894 6894 1.00000000000000e+00 6895 6895 1.00000000000000e+00 6896 6896 1.00000000000000e+00 6897 6897 1.00000000000000e+00 6898 6898 1.00000000000000e+00 6899 6899 1.00000000000000e+00 6900 6900 1.00000000000000e+00 6901 6901 1.00000000000000e+00 6902 6902 1.00000000000000e+00 6903 6903 1.00000000000000e+00 6904 6904 1.00000000000000e+00 6905 6905 1.00000000000000e+00 6906 6906 1.00000000000000e+00 6907 6907 1.00000000000000e+00 6908 6908 1.00000000000000e+00 6909 5061 6.86885643072792e-06 6909 5085 7.84963079505855e-05 6909 5109 3.84182544807877e-04 6909 5133 1.15050029531138e-04 6909 6909 1.30555747118988e+01 6909 5637 1.89681802581380e-06 6909 5661 2.37454150425827e-03 6909 5685 1.11890756819089e-01 6909 5709 2.51563538065896e-01 6909 5733 8.52217717989005e-02 6909 5757 5.38660454727590e-03 6909 5781 1.37306196538331e-06 6909 6237 6.59455841648084e-05 6909 6261 1.05587349081563e-01 6909 6285 1.94392165227318e+00 6909 6309 4.98296884704721e+00 6909 6333 2.01957827044320e+00 6909 6357 1.04108481663570e-01 6909 6381 1.06435412031522e-04 6909 6813 1.87940000000000e-16 6909 6837 2.49408950444565e-04 6909 6861 2.55684893376081e-01 6909 6885 4.95787514450108e+00 6909 6933 4.96244048857830e+00 6909 6957 2.35758953438193e-01 6909 6981 5.57366312412018e-04 6909 7413 2.84600000000000e-17 6909 7437 2.09551952060577e-04 6909 7461 9.76298792981398e-02 6909 7485 2.01810107737033e+00 6909 7509 4.82079811148037e+00 6909 7533 2.01810107737034e+00 6909 7557 9.82611695325452e-02 6909 7581 3.31206932007269e-05 6909 8037 6.71275600306681e-06 6909 8061 3.20501286228353e-03 6909 8085 8.43200148895841e-02 6909 8109 2.72468734328648e-01 6909 8133 9.42274113557098e-02 6909 8157 4.46279463381606e-03 6909 8181 9.31527367732900e-08 6909 8661 3.53353347430300e-07 6909 8685 1.14629817987545e-04 6909 8709 2.30005939103824e-04 6909 8733 1.99496121906751e-04 6909 8757 7.26515781837250e-07 6909 8781 3.51291980000000e-13 6909 16752 -2.10501275725719e-04 6909 16776 -7.22537427582622e-03 6909 16800 -3.16680109148218e-02 6909 16824 -3.01220400623413e-02 6909 16848 -6.09418934663189e-03 6909 16872 -4.25390998073086e-05 6909 17136 -1.53172366412974e-04 6909 17160 -2.93382054589836e-02 6909 17184 -3.03095516402851e-01 6909 17208 -9.24693753917579e-01 6909 17232 -7.69802226468801e-01 6909 17256 -1.69941020545760e-01 6909 17280 -6.53347571849010e-03 6909 17544 -8.00980653817310e-04 6909 17568 -1.75026824014733e-01 6909 17592 -1.66908141813580e+00 6909 17616 -4.82545053729425e+00 6909 17640 -3.94652603057979e+00 6909 17664 -9.17064794435828e-01 6909 17688 -4.68504653711725e-02 6909 17712 -6.25027141297620e-07 6909 17952 -9.06390528705473e-04 6909 17976 -2.84162572146214e-01 6909 18000 -2.67868645090644e+00 6909 18024 -7.65930322967343e+00 6909 18048 -6.27649976772462e+00 6909 18072 -1.53990166618198e+00 6909 18096 -9.59262161090050e-02 6909 18120 -2.75579249208742e-06 6909 18360 -1.88504826688788e-04 6909 18384 -1.10295881093751e-01 6909 18408 -1.14383406827339e+00 6909 18432 -3.42674317775809e+00 6909 18456 -2.72455878059633e+00 6909 18480 -6.46991543310082e-01 6909 18504 -3.79318522441511e-02 6909 18528 -1.64776284888537e-06 6909 18768 -5.34096308434300e-08 6909 18792 -1.27531411453204e-02 6909 18816 -1.52427932049991e-01 6909 18840 -4.82708299194572e-01 6909 18864 -3.62722235630271e-01 6909 18888 -8.08640652260132e-02 6909 18912 -4.14430081245736e-03 6909 18936 -2.55683926896940e-07 6909 19200 -1.03213653480996e-04 6909 19224 -2.06384177255707e-03 6909 19248 -7.05238029109584e-03 6909 19272 -3.03185917096310e-03 6909 19296 -3.45218003082504e-04 6910 6910 1.00000000000000e+00 6911 6911 1.00000000000000e+00 6912 6912 1.00000000000000e+00 6913 6913 1.00000000000000e+00 6914 6914 1.00000000000000e+00 6915 6915 1.00000000000000e+00 6916 6916 1.00000000000000e+00 6917 6917 1.00000000000000e+00 6918 6918 1.00000000000000e+00 6919 6919 1.00000000000000e+00 6920 6920 1.00000000000000e+00 6921 6921 1.00000000000000e+00 6922 6922 1.00000000000000e+00 6923 6923 1.00000000000000e+00 6924 6924 1.00000000000000e+00 6925 6925 1.00000000000000e+00 6926 6926 1.00000000000000e+00 6927 6927 1.00000000000000e+00 6928 6928 1.00000000000000e+00 6929 6929 1.00000000000000e+00 6930 6930 1.00000000000000e+00 6931 6931 1.00000000000000e+00 6932 6932 1.00000000000000e+00 6933 4509 5.46280000000000e-16 6933 4533 8.37030000000000e-16 6933 5085 2.57973066677054e-06 6933 5109 2.12636592359754e-04 6933 5133 2.33536006397605e-04 6933 5157 1.21338636937123e-04 6933 5181 7.94031900597660e-07 6933 6933 1.30625624573197e+01 6933 5661 1.59094207830700e-06 6933 5685 3.29078610576372e-03 6933 5709 9.78293108358415e-02 6933 5733 2.78473549213861e-01 6933 5757 9.29174454274840e-02 6933 5781 3.05267476070688e-03 6933 5805 2.33359908483912e-06 6933 6261 1.66984562117837e-05 6933 6285 1.05200073412956e-01 6933 6309 2.00834264652637e+00 6933 6333 4.97708104918746e+00 6933 6357 2.02145129931113e+00 6933 6381 1.06392574754093e-01 6933 6405 2.33697018029735e-04 6933 6861 3.17936008973021e-04 6933 6885 2.43852730636461e-01 6933 6909 4.96244048857830e+00 6933 6957 5.09616803122628e+00 6933 6981 2.40930019848205e-01 6933 7005 4.91919438839994e-04 6933 7461 2.09858096953741e-04 6933 7485 9.42274113557097e-02 6933 7509 2.02259967515323e+00 6933 7533 4.95787514450105e+00 6933 7557 1.94522732471997e+00 6933 7581 1.08772846312623e-01 6933 7605 1.58758229703415e-05 6933 8061 1.15867545268999e-06 6933 8085 5.55556324055003e-03 6933 8109 8.43200148895844e-02 6933 8133 2.43852730636458e-01 6933 8157 1.07567458814667e-01 6933 8181 3.45602568546578e-03 6933 8205 8.44175032531270e-07 6933 8709 9.44854427779014e-05 6933 8733 4.29967431666146e-04 6933 8757 7.05197533765987e-05 6933 8781 1.36098486988972e-06 6933 16368 -6.06677257560000e-10 6933 16392 -3.60635957870867e-04 6933 16416 -2.38851479682778e-03 6933 16440 -4.15438031221894e-03 6933 16464 -9.85286141680783e-04 6933 16488 -9.82651904440186e-06 6933 16752 -8.91149563795812e-06 6933 16776 -6.88640208816359e-03 6933 16800 -9.77203966759714e-02 6933 16824 -3.63297660228320e-01 6933 16848 -3.76017434900469e-01 6933 16872 -9.46399802028848e-02 6933 16896 -4.85672977793043e-03 6933 17160 -8.04923988436111e-05 6933 17184 -6.74916128452639e-02 6933 17208 -8.34174209426219e-01 6933 17232 -2.89436506660368e+00 6933 17256 -2.88002145247027e+00 6933 17280 -7.75414771434272e-01 6933 17304 -5.25159046809868e-02 6933 17328 -1.22463021456104e-05 6933 17568 -1.88632296335788e-04 6933 17592 -1.83173325846024e-01 6933 17616 -2.12020356069703e+00 6933 17640 -7.08479211929127e+00 6933 17664 -6.90984690437403e+00 6933 17688 -1.96287925132752e+00 6933 17712 -1.55713479595503e-01 6933 17736 -6.59348435444717e-05 6933 17976 -4.61869584146417e-05 6933 18000 -1.06320221811239e-01 6933 18024 -1.37644441535069e+00 6933 18048 -4.81535243342511e+00 6933 18072 -4.66386840319994e+00 6933 18096 -1.32125388491842e+00 6933 18120 -1.05165732007158e-01 6933 18144 -8.00448419937311e-05 6933 18384 -3.35135530715780e-07 6933 18408 -1.79537556714428e-02 6933 18432 -2.74213120676922e-01 6933 18456 -1.00780222794441e+00 6933 18480 -9.41744134857338e-01 6933 18504 -2.53821298188300e-01 6933 18528 -1.84595574985232e-02 6933 18552 -1.69496349620302e-05 6933 18816 -3.62720964486749e-04 6933 18840 -1.12740152964935e-02 6933 18864 -4.61905750663568e-02 6933 18888 -3.60917035854073e-02 6933 18912 -7.04436337218170e-03 6933 18936 -1.27258756124398e-04 6934 6934 1.00000000000000e+00 6935 6935 1.00000000000000e+00 6936 6936 1.00000000000000e+00 6937 6937 1.00000000000000e+00 6938 6938 1.00000000000000e+00 6939 6939 1.00000000000000e+00 6940 6940 1.00000000000000e+00 6941 6941 1.00000000000000e+00 6942 6942 1.00000000000000e+00 6943 6943 1.00000000000000e+00 6944 6944 1.00000000000000e+00 6945 6945 1.00000000000000e+00 6946 6946 1.00000000000000e+00 6947 6947 1.00000000000000e+00 6948 6948 1.00000000000000e+00 6949 6949 1.00000000000000e+00 6950 6950 1.00000000000000e+00 6951 6951 1.00000000000000e+00 6952 6952 1.00000000000000e+00 6953 6953 1.00000000000000e+00 6954 6954 1.00000000000000e+00 6955 6955 1.00000000000000e+00 6956 6956 1.00000000000000e+00 6957 4509 8.29700000000000e-17 6957 4533 1.27120000000000e-16 6957 5085 2.42173700000000e-14 6957 5109 1.45607376990150e-07 6957 5133 2.24058402351042e-04 6957 5157 3.83618832664588e-04 6957 5181 1.59114016612105e-05 6957 5205 9.53315919924690e-07 6957 6957 1.32034534890934e+01 6957 5685 2.21431704970470e-07 6957 5709 4.89545672319198e-03 6957 5733 1.01104182244150e-01 6957 5757 2.51306149652814e-01 6957 5781 1.07044420043833e-01 6957 5805 4.38303943466945e-03 6957 5829 5.17030619608320e-07 6957 6285 2.44191106880425e-05 6957 6309 9.95804102733940e-02 6957 6333 2.02226749522320e+00 6957 6357 5.17337010637290e+00 6957 6381 2.08683207293716e+00 6957 6405 9.94207410797815e-02 6957 6429 3.16588033027823e-04 6957 6885 4.29967431666142e-04 6957 6909 2.35758953438193e-01 6957 6933 5.09616803122628e+00 6957 6981 5.17540769465824e+00 6957 7005 2.70682180385705e-01 6957 7029 2.80445054406429e-04 6957 7461 6.70440000000000e-16 6957 7485 1.99496121906749e-04 6957 7509 1.04203715562110e-01 6957 7533 1.94392165227317e+00 6957 7557 5.12142788929234e+00 6957 7581 2.02653932949454e+00 6957 7605 1.06063705484243e-01 6957 7629 3.99813715338231e-05 6957 8061 2.39720000000000e-16 6957 8085 1.15867545269001e-06 6957 8109 3.20501286228349e-03 6957 8133 1.05200073412952e-01 6957 8157 2.47676792294816e-01 6957 8181 1.02519668862684e-01 6957 8205 2.99554152661753e-03 6957 8229 1.93816942058851e-06 6957 8709 1.29402964269487e-06 6957 8733 2.44191106880429e-05 6957 8757 3.78755041462758e-04 6957 8781 2.84168131865538e-04 6957 8805 1.40034993139733e-06 6957 16008 -6.50044912846570e-07 6957 16032 -2.04089667481583e-05 6957 16056 -7.26598831971766e-05 6957 16080 -2.09075466857402e-05 6957 16104 -7.74689897242060e-07 6957 16368 -9.21392776400000e-11 6957 16392 -6.52984975638891e-04 6957 16416 -2.14258727932297e-02 6957 16440 -1.06356067585759e-01 6957 16464 -1.43215743617077e-01 6957 16488 -4.08970490628926e-02 6957 16512 -2.61242579381708e-03 6957 16776 -2.63632843519916e-06 6957 16800 -2.17405842911066e-02 6957 16824 -3.62480097222250e-01 6957 16848 -1.50118703445925e+00 6957 16872 -1.83374722468623e+00 6957 16896 -5.74376861200477e-01 6957 16920 -4.94140797644584e-02 6957 16944 -3.38155601221637e-05 6957 17184 -1.09340842857506e-05 6957 17208 -9.43825694898239e-02 6957 17232 -1.41063348630124e+00 6957 17256 -5.55216590365646e+00 6957 17280 -6.53788922342876e+00 6957 17304 -2.14744083978136e+00 6957 17328 -2.06892058201996e-01 6957 17352 -3.25705673696316e-04 6957 17592 -4.19657041456257e-06 6957 17616 -8.88788763992180e-02 6957 17640 -1.43848699559362e+00 6957 17664 -5.79840393114081e+00 6957 17688 -6.82542888510088e+00 6957 17712 -2.30931516770862e+00 6957 17736 -2.35972834052837e-01 6957 17760 -7.98683687606921e-04 6957 18000 -3.90152634118490e-07 6957 18024 -2.07758257319012e-02 6957 18048 -4.15890163972253e-01 6957 18072 -1.76536172072492e+00 6957 18096 -2.04795403555766e+00 6957 18120 -6.59599075902204e-01 6957 18144 -6.23061972031647e-02 6957 18168 -2.02821011824113e-04 6957 18432 -8.90212526518244e-04 6957 18456 -3.36791333816436e-02 6957 18480 -1.56910533252352e-01 6957 18504 -1.75776519637657e-01 6957 18528 -4.94282254897317e-02 6957 18552 -3.48186344649802e-03 6957 18576 -3.09439465411297e-06 6957 18840 -2.08894349837000e-09 6957 18864 -5.94104233255159e-05 6957 18888 -2.59752650159816e-04 6957 18912 -1.47971231592433e-04 6957 18936 -2.21422910102276e-05 6958 6958 1.00000000000000e+00 6959 6959 1.00000000000000e+00 6960 6960 1.00000000000000e+00 6961 6961 1.00000000000000e+00 6962 6962 1.00000000000000e+00 6963 6963 1.00000000000000e+00 6964 6964 1.00000000000000e+00 6965 6965 1.00000000000000e+00 6966 6966 1.00000000000000e+00 6967 6967 1.00000000000000e+00 6968 6968 1.00000000000000e+00 6969 6969 1.00000000000000e+00 6970 6970 1.00000000000000e+00 6971 6971 1.00000000000000e+00 6972 6972 1.00000000000000e+00 6973 6973 1.00000000000000e+00 6974 6974 1.00000000000000e+00 6975 6975 1.00000000000000e+00 6976 6976 1.00000000000000e+00 6977 6977 1.00000000000000e+00 6978 6978 1.00000000000000e+00 6979 6979 1.00000000000000e+00 6980 6980 1.00000000000000e+00 6981 5109 8.10624600000000e-14 6981 5133 2.33286633743798e-06 6981 5157 7.72839565029899e-05 6981 5181 5.56133606008093e-04 6981 5205 1.31358384121021e-04 6981 6981 1.38340505320785e+01 6981 5709 2.12450364950000e-10 6981 5733 4.96537002526924e-03 6981 5757 1.09974090606846e-01 6981 5781 2.74627686916368e-01 6981 5805 9.21548851110135e-02 6981 5829 5.78011380667545e-03 6981 5853 6.98380998805095e-06 6981 6309 5.24284476533345e-05 6981 6333 9.57663978761783e-02 6981 6357 2.09507042579201e+00 6981 6381 5.17797855006936e+00 6981 6405 2.25780169589539e+00 6981 6429 1.03986644421700e-01 6981 6453 2.64738694593930e-04 6981 6909 5.57366312412018e-04 6981 6933 2.40930019848205e-01 6981 6957 5.17540769465824e+00 6981 7005 5.23127818559840e+00 6981 7029 2.94052596094359e-01 6981 7053 1.52045374293927e-04 6981 7509 1.26060474670818e-04 6981 7533 1.11890756819092e-01 6981 7557 2.03413071720511e+00 6981 7581 5.14992565412804e+00 6981 7605 2.14309867129197e+00 6981 7629 1.04894232584916e-01 6981 7653 9.19256200499704e-05 6981 8109 6.71275600306666e-06 6981 8133 3.29078610576361e-03 6981 8157 9.01462639339692e-02 6981 8181 2.80952884632903e-01 6981 8205 1.09523577382529e-01 6981 8229 2.66749886865830e-03 6981 8253 1.74930753381089e-06 6981 8733 2.21431704970470e-07 6981 8757 1.52487309262472e-04 6981 8781 1.79724268891036e-04 6981 8805 1.20323550370873e-04 6981 8829 1.29078208718043e-05 6981 16008 -2.45216359375897e-06 6981 16032 -2.36917694260567e-03 6981 16056 -1.82366467804074e-02 6981 16080 -3.85963268737253e-02 6981 16104 -1.29970123836128e-02 6981 16128 -1.05007272993043e-03 6981 16392 -7.91806544230000e-10 6981 16416 -6.01949539313826e-03 6981 16440 -1.34841749520496e-01 6981 16464 -6.65735053161056e-01 6981 16488 -1.01643732635630e+00 6981 16512 -3.72818880152230e-01 6981 16536 -3.91570541987390e-02 6981 16560 -3.13185518468501e-05 6981 16800 -3.72328364354000e-09 6981 16824 -3.76488888679949e-02 6981 16848 -7.80770559015156e-01 6981 16872 -3.65852053446198e+00 6981 16896 -5.25957862952256e+00 6981 16920 -2.01599738264807e+00 6981 16944 -2.32535662013764e-01 6981 16968 -9.54445888291205e-04 6981 17208 -3.01603641067000e-09 6981 17232 -6.19881299017579e-02 6981 17256 -1.30220261752319e+00 6981 17280 -6.03043027825392e+00 6981 17304 -8.46920094647183e+00 6981 17328 -3.39171852619209e+00 6981 17352 -4.23340971250773e-01 6981 17376 -3.53912977336370e-03 6981 17616 -5.56057466610000e-10 6981 17640 -1.97985618629701e-02 6981 17664 -5.54442084415409e-01 6981 17688 -2.71989718090503e+00 6981 17712 -3.84397367768766e+00 6981 17736 -1.48988839847491e+00 6981 17760 -1.78671550878463e-01 6981 17784 -1.59366967251032e-03 6981 18048 -1.54822597046121e-03 6981 18072 -7.39127451111007e-02 6981 18096 -3.86242857738437e-01 6981 18120 -5.44017519973809e-01 6981 18144 -1.98152836711840e-01 6981 18168 -2.18011093323533e-02 6981 18192 -1.91124497901628e-04 6981 18456 -1.35451214863830e-07 6981 18480 -1.21000740674980e-03 6981 18504 -6.28028490483812e-03 6981 18528 -6.99137529405218e-03 6981 18552 -1.49333307771918e-03 6981 18576 -1.27615079143267e-05 6982 6982 1.00000000000000e+00 6983 6983 1.00000000000000e+00 6984 6984 1.00000000000000e+00 6985 6985 1.00000000000000e+00 6986 6986 1.00000000000000e+00 6987 6987 1.00000000000000e+00 6988 6988 1.00000000000000e+00 6989 6989 1.00000000000000e+00 6990 6990 1.00000000000000e+00 6991 6991 1.00000000000000e+00 6992 6992 1.00000000000000e+00 6993 6993 1.00000000000000e+00 6994 6994 1.00000000000000e+00 6995 6995 1.00000000000000e+00 6996 6996 1.00000000000000e+00 6997 6997 1.00000000000000e+00 6998 6998 1.00000000000000e+00 6999 6999 1.00000000000000e+00 7000 7000 1.00000000000000e+00 7001 7001 1.00000000000000e+00 7002 7002 1.00000000000000e+00 7003 7003 1.00000000000000e+00 7004 7004 1.00000000000000e+00 7005 5157 7.46695746236279e-06 7005 5181 2.62739118781434e-04 7005 5205 1.66440736458125e-04 7005 5229 1.09163930156518e-04 7005 5253 1.82413221143836e-06 7005 7005 1.43612580844073e+01 7005 5757 5.24590795012676e-03 7005 5781 1.06238221895664e-01 7005 5805 3.12738875079129e-01 7005 5829 1.12349617391643e-01 7005 5853 3.14962360091581e-03 7005 5877 1.78071334005424e-05 7005 6333 1.17724328222052e-04 7005 6357 8.59626371374431e-02 7005 6381 2.25961989461759e+00 7005 6405 5.42353049705159e+00 7005 6429 2.31426725984316e+00 7005 6453 1.30017308321321e-01 7005 6477 1.53185448900642e-04 7005 6933 4.91919438839994e-04 7005 6957 2.70682180385705e-01 7005 6981 5.23127818559840e+00 7005 7029 5.58574866139339e+00 7005 7053 3.25771669079221e-01 7005 7077 2.31229553062048e-04 7005 7533 7.84963079505863e-05 7005 7557 1.09060475920186e-01 7005 7581 2.15224436646042e+00 7005 7605 5.50028633803769e+00 7005 7629 2.28425795486038e+00 7005 7653 1.04668459507657e-01 7005 7677 1.93604114647185e-04 7005 8133 2.57973066677058e-06 7005 8157 4.96671538245737e-03 7005 8181 9.81329879921907e-02 7005 8205 2.67067283445568e-01 7005 8229 1.32107227727701e-01 7005 8253 4.53171246542376e-03 7005 8277 2.46575223213160e-07 7005 8733 2.42173700000000e-14 7005 8757 5.23284682600000e-11 7005 8781 6.03166389497422e-05 7005 8805 6.20724038309046e-04 7005 8829 1.44147466930790e-04 7005 8853 9.75132400737259e-06 7005 9429 4.40000000000000e-19 7005 15648 -4.27068489809029e-05 7005 15672 -1.17783345955640e-03 7005 15696 -4.35560139697713e-03 7005 15720 -2.14648723749308e-03 7005 15744 -2.84870293465072e-04 7005 16032 -1.06285179056377e-03 7005 16056 -4.20474139306109e-02 7005 16080 -2.53257024583947e-01 7005 16104 -4.69701797998808e-01 7005 16128 -2.12494015931442e-01 7005 16152 -2.79573555867765e-02 7005 16176 -2.30368090416415e-05 7005 16440 -1.19319310724472e-02 7005 16464 -3.78249300822861e-01 7005 16488 -2.10508368685635e+00 7005 16512 -3.64519484217998e+00 7005 16536 -1.69477015015131e+00 7005 16560 -2.38646796391967e-01 7005 16584 -2.05883233787824e-03 7005 16848 -3.37284796292217e-02 7005 16872 -9.90842359720003e-01 7005 16896 -5.31142189658318e+00 7005 16920 -8.86448444529007e+00 7005 16944 -4.23415220768883e+00 7005 16968 -6.31129289373409e-01 7005 16992 -9.62297346308554e-03 7005 17256 -1.54562329970986e-02 7005 17280 -6.40927707820464e-01 7005 17304 -3.64136977461599e+00 7005 17328 -6.23407982509971e+00 7005 17352 -2.98627124706643e+00 7005 17376 -4.52565793524380e-01 7005 17400 -8.89962435477893e-03 7005 17664 -1.94985337928620e-03 7005 17688 -1.28438112447600e-01 7005 17712 -7.66829074925678e-01 7005 17736 -1.32965709172449e+00 7005 17760 -6.02940997111874e-01 7005 17784 -8.66559427129925e-02 7005 17808 -1.73381330431116e-03 7005 18072 -1.58029534922605e-06 7005 18096 -5.56833331860751e-03 7005 18120 -3.57113108533599e-02 7005 18144 -6.10846835017315e-02 7005 18168 -2.01656095848383e-02 7005 18192 -1.67656038496184e-03 7005 18216 -1.54264278491790e-07 7005 18504 -1.78107971630000e-10 7005 18528 -8.44638357170000e-10 7005 18552 -7.06933854300000e-10 7005 18576 -1.32206470670000e-10 7006 7006 1.00000000000000e+00 7007 7007 1.00000000000000e+00 7008 7008 1.00000000000000e+00 7009 7009 1.00000000000000e+00 7010 7010 1.00000000000000e+00 7011 7011 1.00000000000000e+00 7012 7012 1.00000000000000e+00 7013 7013 1.00000000000000e+00 7014 7014 1.00000000000000e+00 7015 7015 1.00000000000000e+00 7016 7016 1.00000000000000e+00 7017 7017 1.00000000000000e+00 7018 7018 1.00000000000000e+00 7019 7019 1.00000000000000e+00 7020 7020 1.00000000000000e+00 7021 7021 1.00000000000000e+00 7022 7022 1.00000000000000e+00 7023 7023 1.00000000000000e+00 7024 7024 1.00000000000000e+00 7025 7025 1.00000000000000e+00 7026 7026 1.00000000000000e+00 7027 7027 1.00000000000000e+00 7028 7028 1.00000000000000e+00 7029 5181 2.79430157966992e-06 7029 5205 2.20082275981342e-04 7029 5229 7.01342460993407e-04 7029 5253 1.81715951490790e-05 7029 5277 4.13083515611090e-07 7029 7029 1.58390083592947e+01 7029 5757 2.14304096016500e-08 7029 5781 4.93536473027632e-03 7029 5805 1.22356735855197e-01 7029 5829 3.08047702966230e-01 7029 5853 1.59134713973785e-01 7029 5877 5.91766666038595e-03 7029 5901 1.16629760528206e-06 7029 6357 1.76641060064226e-04 7029 6381 8.99707006266858e-02 7029 6405 2.32069493927856e+00 7029 6429 6.32140157665042e+00 7029 6453 2.77392916116137e+00 7029 6477 1.65476629083147e-01 7029 6501 1.08990327590333e-04 7029 6957 2.80445054406429e-04 7029 6981 2.94052596094359e-01 7029 7005 5.58574866139339e+00 7029 7053 6.72471884021635e+00 7029 7077 3.90074702897635e-01 7029 7101 3.90821018534088e-04 7029 7557 8.43467389934015e-05 7029 7581 1.13586382165693e-01 7029 7605 2.27567422516409e+00 7029 7629 6.07253200657614e+00 7029 7653 2.69560330541544e+00 7029 7677 9.51566419060007e-02 7029 7701 1.60494948635371e-04 7029 8157 5.31858846635926e-06 7029 8181 3.00569983360125e-03 7029 8205 1.29265031934992e-01 7029 8229 3.24085759625745e-01 7029 8253 1.20597050544896e-01 7029 8277 4.58947816494345e-03 7029 8301 7.31269937100000e-11 7029 8781 2.19066051226416e-06 7029 8805 3.45354354387681e-05 7029 8829 3.89714704487485e-04 7029 8853 2.14991453078896e-04 7029 8877 3.07268247464820e-06 7029 9429 3.80000000000000e-19 7029 15288 -4.23031447744470e-06 7029 15312 -2.19178452599109e-05 7029 15336 -2.42166638779730e-05 7029 15360 -4.99658735013208e-06 7029 15648 -3.48101433441648e-05 7029 15672 -8.02865271787057e-03 7029 15696 -7.55358123396634e-02 7029 15720 -2.00180555053650e-01 7029 15744 -1.10018885673374e-01 7029 15768 -1.65362016833954e-02 7029 15792 -4.61831190340905e-06 7029 16056 -3.21498529089220e-03 7029 16080 -1.55321867795444e-01 7029 16104 -1.09956716241355e+00 7029 16128 -2.47405737344558e+00 7029 16152 -1.43097519682750e+00 7029 16176 -2.34219438433409e-01 7029 16200 -2.16046850008652e-03 7029 16464 -1.42016680674158e-02 7029 16488 -6.26267686291776e-01 7029 16512 -4.10122884318582e+00 7029 16536 -8.63045626787847e+00 7029 16560 -5.11917555376173e+00 7029 16584 -8.76028072878799e-01 7029 16608 -1.29413237855627e-02 7029 16872 -1.05393873554722e-02 7029 16896 -6.39847535218470e-01 7029 16920 -4.25765599427588e+00 7029 16944 -8.88021871768787e+00 7029 16968 -5.30453705292577e+00 7029 16992 -9.36190402441613e-01 7029 17016 -1.97720813716516e-02 7029 17280 -1.89638474168433e-03 7029 17304 -1.85449956010227e-01 7029 17328 -1.30451795486918e+00 7029 17352 -2.79102250318823e+00 7029 17376 -1.59016329279607e+00 7029 17400 -2.68460388411377e-01 7029 17424 -4.98947752019868e-03 7029 17688 -8.12642191870762e-06 7029 17712 -1.51559787944263e-02 7029 17736 -1.18129358804485e-01 7029 17760 -2.65399292796337e-01 7029 17784 -1.36848367689047e-01 7029 17808 -2.03872129237756e-02 7029 17832 -1.55188264107731e-04 7029 18120 -3.89310030356533e-05 7029 18144 -2.50664090970474e-04 7029 18168 -4.18824570894592e-04 7029 18192 -9.54730890178464e-05 7029 18216 -1.33252547496470e-07 7030 7030 1.00000000000000e+00 7031 7031 1.00000000000000e+00 7032 7032 1.00000000000000e+00 7033 7033 1.00000000000000e+00 7034 7034 1.00000000000000e+00 7035 7035 1.00000000000000e+00 7036 7036 1.00000000000000e+00 7037 7037 1.00000000000000e+00 7038 7038 1.00000000000000e+00 7039 7039 1.00000000000000e+00 7040 7040 1.00000000000000e+00 7041 7041 1.00000000000000e+00 7042 7042 1.00000000000000e+00 7043 7043 1.00000000000000e+00 7044 7044 1.00000000000000e+00 7045 7045 1.00000000000000e+00 7046 7046 1.00000000000000e+00 7047 7047 1.00000000000000e+00 7048 7048 1.00000000000000e+00 7049 7049 1.00000000000000e+00 7050 7050 1.00000000000000e+00 7051 7051 1.00000000000000e+00 7052 7052 1.00000000000000e+00 7053 5205 1.53658882619257e-05 7053 5229 9.87647472616876e-05 7053 5253 3.23989771589693e-04 7053 5277 1.28664970767149e-04 7053 7053 1.81406348468673e+01 7053 5781 8.42870972887730e-07 7053 5805 3.35210990307854e-03 7053 5829 1.63787166671296e-01 7053 5853 3.88254869960634e-01 7053 5877 1.15026971954086e-01 7053 5901 4.32657486010460e-03 7053 5925 4.55990495249544e-06 7053 6381 1.33659463189935e-04 7053 6405 1.17467751532462e-01 7053 6429 2.77588105773608e+00 7053 6453 7.60940118776601e+00 7053 6477 2.68222047618868e+00 7053 6501 1.09481969201774e-01 7053 6525 3.30881342016362e-05 7053 6981 1.52045374293927e-04 7053 7005 3.25771669079221e-01 7053 7029 6.72471884021635e+00 7053 7077 5.96431524939501e+00 7053 7101 2.98235611124602e-01 7053 7125 5.18496828096280e-07 7053 7581 1.86724261971480e-04 7053 7605 1.19649369036844e-01 7053 7629 2.67314736954824e+00 7053 7653 6.00181058392055e+00 7053 7677 2.68265796979807e+00 7053 7701 5.66352263340678e-02 7053 8181 1.40334369341952e-05 7053 8205 4.53064416783995e-03 7053 8229 1.03910226659848e-01 7053 8253 3.37952987363564e-01 7053 8277 1.36090564095546e-01 7053 8301 1.76934258518450e-07 7053 8805 1.66357890694850e-07 7053 8829 1.14998784692895e-04 7053 8853 1.84499564047511e-04 7053 8877 6.61673559220372e-06 7053 15288 -2.44065315422981e-04 7053 15312 -8.02848167035954e-03 7053 15336 -3.10803560498744e-02 7053 15360 -1.75666651323257e-02 7053 15384 -2.63702574884974e-03 7053 15672 -7.09905820190994e-04 7053 15696 -6.28594643042408e-02 7053 15720 -5.38961450759771e-01 7053 15744 -1.33316206270335e+00 7053 15768 -6.38508544939169e-01 7053 15792 -1.17498240106754e-01 7053 16080 -4.05950296912952e-03 7053 16104 -3.75923620321782e-01 7053 16128 -3.06527398950036e+00 7053 16152 -7.34164664187943e+00 7053 16176 -3.72278010225788e+00 7053 16200 -7.56106341981174e-01 7053 16488 -5.60829570506782e-03 7053 16512 -6.03687179371130e-01 7053 16536 -4.89729124264450e+00 7053 16560 -1.18093709731944e+01 7053 16584 -6.68777816209331e+00 7053 16608 -1.51207846681767e+00 7053 16896 -1.29536421402410e-03 7053 16920 -2.45488223812449e-01 7053 16944 -2.11930396500521e+00 7053 16968 -5.28864690628285e+00 7053 16992 -2.99889266328810e+00 7053 17016 -7.35724208401044e-01 7053 17304 -1.88711314146376e-05 7053 17328 -3.11108491462266e-02 7053 17352 -2.92463126461177e-01 7053 17376 -7.58041586363661e-01 7053 17400 -4.08296859121547e-01 7053 17424 -1.03422884076191e-01 7053 17736 -4.73461040574706e-04 7053 17760 -5.36026349040991e-03 7053 17784 -1.45815447323941e-02 7053 17808 -4.43604484561137e-03 7053 17832 -2.42406379375070e-04 7054 7054 1.00000000000000e+00 7055 7055 1.00000000000000e+00 7056 7056 1.00000000000000e+00 7057 7057 1.00000000000000e+00 7058 7058 1.00000000000000e+00 7059 7059 1.00000000000000e+00 7060 7060 1.00000000000000e+00 7061 7061 1.00000000000000e+00 7062 7062 1.00000000000000e+00 7063 7063 1.00000000000000e+00 7064 7064 1.00000000000000e+00 7065 7065 1.00000000000000e+00 7066 7066 1.00000000000000e+00 7067 7067 1.00000000000000e+00 7068 7068 1.00000000000000e+00 7069 7069 1.00000000000000e+00 7070 7070 1.00000000000000e+00 7071 7071 1.00000000000000e+00 7072 7072 1.00000000000000e+00 7073 7073 1.00000000000000e+00 7074 7074 1.00000000000000e+00 7075 7075 1.00000000000000e+00 7076 7076 1.00000000000000e+00 7077 5229 5.17228162006526e-06 7077 5253 2.39044322190822e-04 7077 5277 1.95371943844946e-04 7077 7077 2.74181977528594e+01 7077 5805 3.03133255660095e-06 7077 5829 3.82984705123423e-03 7077 5853 1.37148490235058e-01 7077 5877 2.82792704146786e-01 7077 5901 1.45416647043232e-01 7077 5925 2.79091754131930e-03 7077 6405 7.51344158719148e-05 7077 6429 1.58330381854054e-01 7077 6453 2.64884504318029e+00 7077 6477 7.14083795988902e+00 7077 6501 4.49687532096013e+00 7077 6525 3.06976858560474e-02 7077 7005 2.31229553062048e-04 7077 7029 3.90074702897635e-01 7077 7053 5.96431524939501e+00 7077 7101 9.52331039881157e+00 7077 7125 1.07228177540032e-03 7077 7605 3.60350842428249e-04 7077 7629 1.10751375218820e-01 7077 7653 3.14714061325168e+00 7077 7677 9.78199297230561e+00 7077 7701 9.54978556178062e-01 7077 8205 1.89409891545966e-06 7077 8229 5.34094459172518e-03 7077 8253 2.50073467614373e-01 7077 8277 2.74929435139304e-01 7077 8301 1.47101733658939e-06 7077 8805 2.19544460000000e-13 7077 8829 1.50853894583000e-09 7077 8853 6.16672890543108e-06 7077 8877 4.17426610680285e-06 7077 15288 -3.47011381079177e-05 7077 15312 -1.25654930568490e-02 7077 15336 -1.11494712416164e-01 7077 15360 -4.98997919341120e-01 7077 15384 -5.40869660850698e-01 7077 15696 -7.25522370285950e-04 7077 15720 -1.60508309066113e-01 7077 15744 -1.13078752502031e+00 7077 15768 -4.72007968522755e+00 7077 15792 -5.62748706111411e+00 7077 16104 -2.41565249248573e-03 7077 16128 -5.04462076015971e-01 7077 16152 -3.33774787695749e+00 7077 16176 -1.32830061635961e+01 7077 16200 -1.60834728731340e+01 7077 16512 -7.23038149697049e-04 7077 16536 -3.15687715384824e-01 7077 16560 -2.41236416441370e+00 7077 16584 -9.03319033806791e+00 7077 16608 -9.31757742472469e+00 7077 16920 -3.40800829606924e-05 7077 16944 -5.81648819907573e-02 7077 16968 -5.06189018822975e-01 7077 16992 -1.99097178969357e+00 7077 17016 -1.94760161133882e+00 7077 17352 -1.81463814625538e-03 7077 17376 -2.09752511183681e-02 7077 17400 -1.16854240285127e-01 7077 17424 -1.34062314544317e-01 7077 17760 -1.96062915748000e-09 7077 17784 -1.44727600551000e-08 7077 17808 -2.84816028581600e-08 7077 17832 -6.63024342517000e-09 7078 7078 1.00000000000000e+00 7079 7079 1.00000000000000e+00 7080 7080 1.00000000000000e+00 7081 7081 1.00000000000000e+00 7082 7082 1.00000000000000e+00 7083 7083 1.00000000000000e+00 7084 7084 1.00000000000000e+00 7085 7085 1.00000000000000e+00 7086 7086 1.00000000000000e+00 7087 7087 1.00000000000000e+00 7088 7088 1.00000000000000e+00 7089 7089 1.00000000000000e+00 7090 7090 1.00000000000000e+00 7091 7091 1.00000000000000e+00 7092 7092 1.00000000000000e+00 7093 7093 1.00000000000000e+00 7094 7094 1.00000000000000e+00 7095 7095 1.00000000000000e+00 7096 7096 1.00000000000000e+00 7097 7097 1.00000000000000e+00 7098 7098 1.00000000000000e+00 7099 7099 1.00000000000000e+00 7100 7100 1.00000000000000e+00 7101 5253 1.36192251944497e-06 7101 5277 1.25052203376219e-06 7101 7101 6.56924940955730e+00 7101 5829 1.85443126627629e-06 7101 5853 2.98352467610302e-03 7101 5877 1.27181616251690e-01 7101 5901 2.17844836818978e-01 7101 5925 7.20909761037743e-03 7101 6429 3.87416569810706e-05 7101 6453 9.08790737019994e-02 7101 6477 3.15491505639733e+00 7101 6501 4.86555311739395e+00 7101 6525 6.52632710066779e-02 7101 7029 3.90821018534088e-04 7101 7053 2.98235611124602e-01 7101 7077 9.52331039881157e+00 7101 7125 1.95729919479398e-03 7101 7629 2.98307779105637e-04 7101 7653 1.55044360737329e-01 7101 7677 1.82785208832571e+00 7101 7701 3.57682624143023e-01 7101 8229 1.76345157057958e-06 7101 8253 4.31692185634925e-03 7101 8277 1.20671885798253e-02 7101 8301 1.65206772175230e-07 7101 8853 3.84760914064500e-08 7101 8877 2.60784759250900e-08 7101 15312 -8.02216756130956e-05 7101 15336 -4.22648233034794e-02 7101 15360 -6.43859071509886e-01 7101 15384 -9.93950143461355e-01 7101 15720 -3.56454239513509e-04 7101 15744 -1.42656758267412e-01 7101 15768 -3.05351420152953e+00 7101 15792 -5.11769890541450e+00 7101 16128 -2.24151561366785e-04 7101 16152 -1.49049353647891e-01 7101 16176 -4.43068966198729e+00 7101 16200 -7.82386178903486e+00 7101 16536 -3.60143894674450e-05 7101 16560 -4.35226319330424e-02 7101 16584 -1.30109975791997e+00 7101 16608 -2.29847746643479e+00 7101 16968 -3.42397024350178e-03 7101 16992 -8.67773264820844e-02 7101 17016 -1.49586861259656e-01 7101 17376 -2.30239133829016e-06 7101 17400 -3.88025594488432e-04 7101 17424 -7.59934449608832e-04 7102 7102 1.00000000000000e+00 7103 7103 1.00000000000000e+00 7104 7104 1.00000000000000e+00 7105 7105 1.00000000000000e+00 7106 7106 1.00000000000000e+00 7107 7107 1.00000000000000e+00 7108 7108 1.00000000000000e+00 7109 7109 1.00000000000000e+00 7110 7110 1.00000000000000e+00 7111 7111 1.00000000000000e+00 7112 7112 1.00000000000000e+00 7113 7113 1.00000000000000e+00 7114 7114 1.00000000000000e+00 7115 7115 1.00000000000000e+00 7116 7116 1.00000000000000e+00 7117 7117 1.00000000000000e+00 7118 7118 1.00000000000000e+00 7119 7119 1.00000000000000e+00 7120 7120 1.00000000000000e+00 7121 7121 1.00000000000000e+00 7122 7122 1.00000000000000e+00 7123 7123 1.00000000000000e+00 7124 7124 1.00000000000000e+00 7125 7125 1.00000435929869e+00 7125 5853 7.09230616116300e-07 7125 5877 2.13706456323191e-04 7125 5901 9.64122588329177e-04 7125 5925 5.45386769826301e-05 7125 6453 3.19208832744815e-06 7125 6477 2.07534537618306e-03 7125 6501 8.11544335798984e-03 7125 6525 3.16146648534755e-04 7125 7053 5.18496828096280e-07 7125 7077 1.07228177540032e-03 7125 7101 1.95729919479399e-03 7125 7677 1.28205453431010e-07 7125 7701 1.52197706490320e-07 7125 15336 -4.97899102435202e-05 7125 15360 -1.89434110109514e-03 7125 15384 -3.44015283048563e-03 7125 15744 -3.51333413334760e-05 7125 15768 -2.70507787134003e-03 7125 15792 -5.16422235334572e-03 7125 16152 -2.92525320334740e-06 7125 16176 -5.02259234512130e-04 7125 16200 -9.84041696600829e-04 7126 7126 1.00000000000000e+00 7127 7127 1.00000000000000e+00 7128 7128 1.00000000000000e+00 7129 7129 1.00000000000000e+00 7130 7130 1.00000000000000e+00 7131 7131 1.00000000000000e+00 7132 7132 1.00000000000000e+00 7133 7133 1.00000000000000e+00 7134 7134 1.00000000000000e+00 7135 7135 1.00000000000000e+00 7136 7136 1.00000000000000e+00 7137 7137 1.00000000000000e+00 7138 7138 1.00000000000000e+00 7139 7139 1.00000000000000e+00 7140 7140 1.00000000000000e+00 7141 7141 1.00000000000000e+00 7142 7142 1.00000000000000e+00 7143 7143 1.00000000000000e+00 7144 7144 1.00000000000000e+00 7145 7145 1.00000000000000e+00 7146 7146 1.00000000000000e+00 7147 7147 1.00000000000000e+00 7148 7148 1.00000000000000e+00 7149 7149 1.00000000000000e+00 7150 7150 1.00000000000000e+00 7151 7151 1.00000000000000e+00 7152 7152 1.00000000000000e+00 7153 7153 1.00000000000000e+00 7154 7154 1.00000000000000e+00 7155 7155 1.00000000000000e+00 7156 7156 1.00000000000000e+00 7157 7157 1.00000000000000e+00 7158 7158 1.00000000000000e+00 7159 7159 1.00000000000000e+00 7160 7160 1.00000000000000e+00 7161 7161 1.00000000000000e+00 7162 7162 1.00000000000000e+00 7163 7163 1.00000000000000e+00 7164 7164 1.00000000000000e+00 7165 7165 1.00000000000000e+00 7166 7166 1.00000000000000e+00 7167 7167 1.00000000000000e+00 7168 7168 1.00000000000000e+00 7169 7169 1.00000000000000e+00 7170 7170 1.00000000000000e+00 7171 7171 1.00000000000000e+00 7172 7172 1.00000000000000e+00 7173 7173 1.00000000000000e+00 7174 7174 1.00000000000000e+00 7175 7175 1.00000000000000e+00 7176 7176 1.00000000000000e+00 7177 7177 1.00000000000000e+00 7178 7178 1.00000000000000e+00 7179 7179 1.00000000000000e+00 7180 7180 1.00000000000000e+00 7181 7181 1.00000000000000e+00 7182 7182 1.00000000000000e+00 7183 7183 1.00000000000000e+00 7184 7184 1.00000000000000e+00 7185 7185 1.00000000000000e+00 7186 7186 1.00000000000000e+00 7187 7187 1.00000000000000e+00 7188 7188 1.00000000000000e+00 7189 7189 1.00000000000000e+00 7190 7190 1.00000000000000e+00 7191 7191 1.00000000000000e+00 7192 7192 1.00000000000000e+00 7193 7193 1.00000000000000e+00 7194 7194 1.00000000000000e+00 7195 7195 1.00000000000000e+00 7196 7196 1.00000000000000e+00 7197 7197 1.00000000000000e+00 7198 7198 1.00000000000000e+00 7199 7199 1.00000000000000e+00 7200 7200 1.00000000000000e+00 7201 7201 1.00000000000000e+00 7202 7202 1.00000000000000e+00 7203 7203 1.00000000000000e+00 7204 7204 1.00000000000000e+00 7205 7205 1.00000000000000e+00 7206 7206 1.00000000000000e+00 7207 7207 1.00000000000000e+00 7208 7208 1.00000000000000e+00 7209 7209 1.00000000000000e+00 7210 7210 1.00000000000000e+00 7211 7211 1.00000000000000e+00 7212 7212 1.00000000000000e+00 7213 7213 1.00000000000000e+00 7214 7214 1.00000000000000e+00 7215 7215 1.00000000000000e+00 7216 7216 1.00000000000000e+00 7217 7217 1.00000000000000e+00 7218 7218 1.00000000000000e+00 7219 7219 1.00000000000000e+00 7220 7220 1.00000000000000e+00 7221 7221 1.00000000000000e+00 7222 7222 1.00000000000000e+00 7223 7223 1.00000000000000e+00 7224 7224 1.00000000000000e+00 7225 7225 1.00000000000000e+00 7226 7226 1.00000000000000e+00 7227 7227 1.00000000000000e+00 7228 7228 1.00000000000000e+00 7229 7229 1.00000000000000e+00 7230 7230 1.00000000000000e+00 7231 7231 1.00000000000000e+00 7232 7232 1.00000000000000e+00 7233 7233 1.00000000000000e+00 7234 7234 1.00000000000000e+00 7235 7235 1.00000000000000e+00 7236 7236 1.00000000000000e+00 7237 7237 1.00000000000000e+00 7238 7238 1.00000000000000e+00 7239 7239 1.00000000000000e+00 7240 7240 1.00000000000000e+00 7241 7241 1.00000000000000e+00 7242 7242 1.00000000000000e+00 7243 7243 1.00000000000000e+00 7244 7244 1.00000000000000e+00 7245 7245 1.00000000000000e+00 7246 7246 1.00000000000000e+00 7247 7247 1.00000000000000e+00 7248 7248 1.00000000000000e+00 7249 7249 1.00000000000000e+00 7250 7250 1.00000000000000e+00 7251 7251 1.00000000000000e+00 7252 7252 1.00000000000000e+00 7253 7253 1.00000000000000e+00 7254 7254 1.00000000000000e+00 7255 7255 1.00000000000000e+00 7256 7256 1.00000000000000e+00 7257 7257 1.00000000000000e+00 7258 7258 1.00000000000000e+00 7259 7259 1.00000000000000e+00 7260 7260 1.00000000000000e+00 7261 7261 1.00000000000000e+00 7262 7262 1.00000000000000e+00 7263 7263 1.00000000000000e+00 7264 7264 1.00000000000000e+00 7265 7265 1.00000000000000e+00 7266 7266 1.00000000000000e+00 7267 7267 1.00000000000000e+00 7268 7268 1.00000000000000e+00 7269 7269 1.00000000000000e+00 7270 7270 1.00000000000000e+00 7271 7271 1.00000000000000e+00 7272 7272 1.00000000000000e+00 7273 7273 1.00000000000000e+00 7274 7274 1.00000000000000e+00 7275 7275 1.00000000000000e+00 7276 7276 1.00000000000000e+00 7277 7277 1.00000000000000e+00 7278 7278 1.00000000000000e+00 7279 7279 1.00000000000000e+00 7280 7280 1.00000000000000e+00 7281 7281 1.00000000000000e+00 7282 7282 1.00000000000000e+00 7283 7283 1.00000000000000e+00 7284 7284 1.00000000000000e+00 7285 7285 1.00000000000000e+00 7286 7286 1.00000000000000e+00 7287 7287 1.00000000000000e+00 7288 7288 1.00000000000000e+00 7289 7289 1.00000000000000e+00 7290 7290 1.00000000000000e+00 7291 7291 1.00000000000000e+00 7292 7292 1.00000000000000e+00 7293 7293 1.00000000000000e+00 7294 7294 1.00000000000000e+00 7295 7295 1.00000000000000e+00 7296 7296 1.00000000000000e+00 7297 7297 1.00000000000000e+00 7298 7298 1.00000000000000e+00 7299 7299 1.00000000000000e+00 7300 7300 1.00000000000000e+00 7301 7301 1.00000000000000e+00 7302 7302 1.00000000000000e+00 7303 7303 1.00000000000000e+00 7304 7304 1.00000000000000e+00 7305 7305 1.00000000000000e+00 7306 7306 1.00000000000000e+00 7307 7307 1.00000000000000e+00 7308 7308 1.00000000000000e+00 7309 7309 1.00000000000000e+00 7310 7310 1.00000000000000e+00 7311 7311 1.00000000000000e+00 7312 7312 1.00000000000000e+00 7313 7313 1.00000000000000e+00 7314 7314 1.00000000000000e+00 7315 7315 1.00000000000000e+00 7316 7316 1.00000000000000e+00 7317 7317 1.05242261230147e+00 7317 6141 1.47384460888300e-07 7317 6165 2.17449701422410e-07 7317 6717 1.23430727922280e-07 7317 6741 1.38154135506727e-02 7317 6765 8.35456992673660e-03 7317 6789 9.01164771458647e-06 7317 7341 5.82260908100774e-01 7317 7365 9.79813381742695e-02 7317 7389 1.51134942095427e-04 7317 7893 1.52197706490310e-07 7317 7917 3.57682624143009e-01 7317 7941 9.54978556178021e-01 7317 7965 5.66352263340650e-02 7317 7989 1.60494948635362e-04 7317 8493 4.09279816281544e-06 7317 8517 7.50878594565614e-02 7317 8541 1.02332936930000e-01 7317 8565 2.93365015021248e-03 7317 8589 2.08930460891820e-07 7317 9093 3.38261348833630e-07 7317 9117 1.01894477122349e-05 7317 9141 1.74314569669890e-05 7317 9165 5.17938663274502e-06 7317 19488 -4.29215165363153e-03 7317 19512 -2.18156224160914e-03 7317 19536 -1.01389756552503e-05 7317 19896 -1.22992818690725e-01 7317 19920 -6.68357069655286e-02 7317 19944 -1.52551360576176e-03 7317 20304 -5.65787260988338e-01 7317 20328 -3.07481855106383e-01 7317 20352 -7.02520703206106e-03 7317 20712 -6.58684771145486e-01 7317 20736 -3.49593855422105e-01 7317 20760 -5.78613424267481e-03 7317 21120 -1.38468320828474e-01 7317 21144 -7.30006766659686e-02 7317 21168 -1.07614750049477e-03 7317 21528 -6.75149496405286e-05 7317 21552 -3.45539493907758e-05 7317 21576 -2.27564163003280e-07 7318 7318 1.00000000000000e+00 7319 7319 1.00000000000000e+00 7320 7320 1.00000000000000e+00 7321 7321 1.00000000000000e+00 7322 7322 1.00000000000000e+00 7323 7323 1.00000000000000e+00 7324 7324 1.00000000000000e+00 7325 7325 1.00000000000000e+00 7326 7326 1.00000000000000e+00 7327 7327 1.00000000000000e+00 7328 7328 1.00000000000000e+00 7329 7329 1.00000000000000e+00 7330 7330 1.00000000000000e+00 7331 7331 1.00000000000000e+00 7332 7332 1.00000000000000e+00 7333 7333 1.00000000000000e+00 7334 7334 1.00000000000000e+00 7335 7335 1.00000000000000e+00 7336 7336 1.00000000000000e+00 7337 7337 1.00000000000000e+00 7338 7338 1.00000000000000e+00 7339 7339 1.00000000000000e+00 7340 7340 1.00000000000000e+00 7341 7341 2.13447489157978e+01 7341 5565 2.00195419374265e-06 7341 5589 1.18392864123253e-06 7341 5613 1.81280000000000e-16 7341 6141 1.55949680715277e-02 7341 6165 1.33556506834830e-01 7341 6189 8.70653938089619e-03 7341 6213 6.93965276951370e-07 7341 6717 4.40213679917620e-06 7341 6741 4.34538569436148e+00 7341 6765 5.44645677899677e+00 7341 6789 1.18442951526061e-01 7341 6813 6.44276186536662e-05 7341 7317 5.82260908100774e-01 7341 7365 1.12062297642625e+01 7341 7389 2.61946729281430e-01 7341 7413 4.72542549108692e-04 7341 7893 1.28205453431010e-07 7341 7917 1.82785208832565e+00 7341 7941 9.78199297230528e+00 7341 7965 2.68265796979796e+00 7341 7989 9.51566419059959e-02 7341 8013 1.93604114647191e-04 7341 8493 3.44776521549160e-06 7341 8517 2.76648894908246e-01 7341 8541 4.95673214491788e-01 7341 8565 1.04720627674968e-01 7341 8589 7.20183881084083e-03 7341 8613 2.19087640160000e-10 7341 9093 2.84965056096460e-07 7341 9117 8.82040844097349e-06 7341 9141 2.53629710191410e-04 7341 9165 2.94496133374696e-04 7341 9189 7.44503075326058e-06 7341 18672 -4.16008843137160e-05 7341 18696 -2.89818847393736e-05 7341 18720 -2.33755502357590e-06 7341 19080 -1.98570423981029e-01 7341 19104 -1.24352589445776e-01 7341 19128 -7.17949674489160e-03 7341 19152 -4.68162706606922e-06 7341 19488 -3.71267255159004e+00 7341 19512 -2.29622406868495e+00 7341 19536 -1.34464897613045e-01 7341 19560 -2.36456528890262e-03 7341 19896 -1.38577901086794e+01 7341 19920 -8.81234700362071e+00 7341 19944 -5.98577294457393e-01 7341 19968 -1.62745062553765e-02 7341 20304 -1.13558941478981e+01 7341 20328 -8.06189223988921e+00 7341 20352 -7.93553797255175e-01 7341 20376 -3.02687018809982e-02 7341 20712 -3.99767481908075e+00 7341 20736 -2.68385561620018e+00 7341 20760 -2.26898724073111e-01 7341 20784 -8.39440981508334e-03 7341 21120 -5.03800392544239e-01 7341 21144 -2.98294215297023e-01 7341 21168 -1.46556642943469e-02 7341 21192 -3.76985077331571e-04 7341 21528 -5.68909072862892e-05 7341 21552 -2.91886673369855e-05 7341 21576 -2.12346769668840e-07 7342 7342 1.00000000000000e+00 7343 7343 1.00000000000000e+00 7344 7344 1.00000000000000e+00 7345 7345 1.00000000000000e+00 7346 7346 1.00000000000000e+00 7347 7347 1.00000000000000e+00 7348 7348 1.00000000000000e+00 7349 7349 1.00000000000000e+00 7350 7350 1.00000000000000e+00 7351 7351 1.00000000000000e+00 7352 7352 1.00000000000000e+00 7353 7353 1.00000000000000e+00 7354 7354 1.00000000000000e+00 7355 7355 1.00000000000000e+00 7356 7356 1.00000000000000e+00 7357 7357 1.00000000000000e+00 7358 7358 1.00000000000000e+00 7359 7359 1.00000000000000e+00 7360 7360 1.00000000000000e+00 7361 7361 1.00000000000000e+00 7362 7362 1.00000000000000e+00 7363 7363 1.00000000000000e+00 7364 7364 1.00000000000000e+00 7365 7365 1.79804363934441e+01 7365 5565 2.73392609382702e-04 7365 5589 2.02409678011765e-04 7365 5613 3.96083470000000e-13 7365 6141 3.70617261712402e-02 7365 6165 4.11150698402188e-01 7365 6189 1.01036021558391e-01 7365 6213 5.85510262322284e-03 7365 6237 8.73668005157809e-06 7365 6717 1.86054858380128e-06 7365 6741 3.62600246314900e+00 7365 6765 8.40787723111205e+00 7365 6789 2.20243939165181e+00 7365 6813 1.48638855963737e-01 7365 6837 1.17189641502779e-04 7365 7317 9.79813381742695e-02 7365 7341 1.12062297642625e+01 7365 7389 6.03243372310644e+00 7365 7413 3.28037469003477e-01 7365 7437 6.35178349373469e-04 7365 7917 1.55044360737320e-01 7365 7941 3.14714061325150e+00 7365 7965 6.00181058392055e+00 7365 7989 2.69560330541537e+00 7365 8013 1.04668459507657e-01 7365 8037 9.19256200499704e-05 7365 8517 7.50438699090499e-03 7365 8541 9.86337930066167e-02 7365 8565 3.83651946384808e-01 7365 8589 1.38803384818398e-01 7365 8613 5.70101788762022e-03 7365 9117 4.80711473218400e-08 7365 9141 1.55156966074483e-04 7365 9165 4.30184941155473e-04 7365 9189 2.12410211905863e-04 7365 9213 6.81126937739475e-06 7365 18672 -8.66206699074853e-03 7365 18696 -2.67141945964826e-02 7365 18720 -2.05626619650524e-02 7365 18744 -3.81608675529018e-03 7365 18768 -4.73650354579930e-07 7365 19080 -5.86323053563021e-01 7365 19104 -9.28686431603779e-01 7365 19128 -6.43339735310626e-01 7365 19152 -1.31722113288671e-01 7365 19176 -1.98398564923313e-03 7365 19488 -4.42153745514164e+00 7365 19512 -5.85915587839813e+00 7365 19536 -3.63348164739563e+00 7365 19560 -7.70581711034168e-01 7365 19584 -1.95621366677707e-02 7365 19896 -9.81224485046657e+00 7365 19920 -1.17788140657166e+01 7365 19944 -6.52746285474585e+00 7365 19968 -1.42191071427143e+00 7365 19992 -5.17816687505490e-02 7365 20304 -3.96155814643469e+00 7365 20328 -5.66644235563031e+00 7365 20352 -3.34211054867202e+00 7365 20376 -7.08432062787719e-01 7365 20400 -2.46988284185831e-02 7365 20712 -4.83551374784479e-01 7365 20736 -8.37895207133302e-01 7365 20760 -5.12343280474946e-01 7365 20784 -1.04269346786878e-01 7365 20808 -3.26638239810655e-03 7365 21120 -1.19215732302672e-02 7365 21144 -1.53507695888778e-02 7365 21168 -5.05501392377792e-03 7365 21192 -6.38658904575269e-04 7366 7366 1.00000000000000e+00 7367 7367 1.00000000000000e+00 7368 7368 1.00000000000000e+00 7369 7369 1.00000000000000e+00 7370 7370 1.00000000000000e+00 7371 7371 1.00000000000000e+00 7372 7372 1.00000000000000e+00 7373 7373 1.00000000000000e+00 7374 7374 1.00000000000000e+00 7375 7375 1.00000000000000e+00 7376 7376 1.00000000000000e+00 7377 7377 1.00000000000000e+00 7378 7378 1.00000000000000e+00 7379 7379 1.00000000000000e+00 7380 7380 1.00000000000000e+00 7381 7381 1.00000000000000e+00 7382 7382 1.00000000000000e+00 7383 7383 1.00000000000000e+00 7384 7384 1.00000000000000e+00 7385 7385 1.00000000000000e+00 7386 7386 1.00000000000000e+00 7387 7387 1.00000000000000e+00 7388 7388 1.00000000000000e+00 7389 4965 4.86770000000000e-16 7389 4989 1.43269000000000e-15 7389 7389 1.66019127419812e+01 7389 5565 2.27061860767543e-04 7389 5589 2.83309791446211e-04 7389 5613 1.16427669681290e-04 7389 5637 1.67959048382320e-06 7389 6141 1.60503283768703e-03 7389 6165 1.01082040273076e-01 7389 6189 3.38445502301248e-01 7389 6213 1.33750852826007e-01 7389 6237 2.88298668641225e-03 7389 6261 4.70536121254536e-06 7389 6285 8.29700000000000e-17 7389 6717 9.32791876860000e-10 7389 6741 8.90814666278415e-02 7389 6765 2.14495058601446e+00 7389 6789 6.56258203238990e+00 7389 6813 2.44145806955094e+00 7389 6837 1.24287728839427e-01 7389 6861 1.78814708764568e-04 7389 6885 5.46280000000000e-16 7389 7317 1.51134942095427e-04 7389 7341 2.61946729281430e-01 7389 7365 6.03243372310644e+00 7389 7413 6.05533313607153e+00 7389 7437 2.61254999604072e-01 7389 7461 5.34088471120026e-04 7389 7917 2.98307779105620e-04 7389 7941 1.10751375218813e-01 7389 7965 2.67314736954827e+00 7389 7989 6.07253200657607e+00 7389 8013 2.28425795486038e+00 7389 8037 1.04894232584914e-01 7389 8061 3.99813715338226e-05 7389 8517 1.13169651915072e-06 7389 8541 7.60696239971752e-03 7389 8565 1.29158141991547e-01 7389 8589 2.91682199132936e-01 7389 8613 1.17330424634126e-01 7389 8637 5.39569286250715e-03 7389 8661 2.29509986312700e-08 7389 9117 8.34516350000000e-13 7389 9141 1.80315251593800e-08 7389 9165 7.38617469010401e-05 7389 9189 6.38231870732993e-04 7389 9213 9.68204573979322e-05 7389 9237 4.10056075839960e-07 7389 9261 1.11133603000000e-12 7389 18264 -2.84904636177000e-09 7389 18288 -3.11177468058388e-04 7389 18312 -1.64331298995031e-03 7389 18336 -1.90576692073226e-03 7389 18360 -3.98715594254569e-04 7389 18384 -1.74352105968200e-08 7389 18672 -1.05376172650656e-02 7389 18696 -1.30571047099532e-01 7389 18720 -4.22827509282699e-01 7389 18744 -2.97980555261437e-01 7389 18768 -5.66160552656295e-02 7389 18792 -1.25262710500993e-03 7389 19080 -9.96338200064888e-02 7389 19104 -1.16968533203042e+00 7389 19128 -3.73623591502844e+00 7389 19152 -2.64775831761194e+00 7389 19176 -5.43816655026169e-01 7389 19200 -2.16090931874467e-02 7389 19224 -5.76558717979400e-08 7389 19488 -2.75221263027280e-01 7389 19512 -3.15212942479745e+00 7389 19536 -1.00058294587789e+01 7389 19560 -7.17876805185171e+00 7389 19584 -1.56150964536205e+00 7389 19608 -7.96429948358928e-02 7389 19632 -3.91749617691150e-07 7389 19896 -1.98215657855370e-01 7389 19920 -2.34143120142435e+00 7389 19944 -7.42284113932565e+00 7389 19968 -5.34832249232644e+00 7389 19992 -1.18550249725812e+00 7389 20016 -6.46783074102998e-02 7389 20040 -7.02160393795440e-07 7389 20304 -4.16778281377548e-02 7389 20328 -5.39531734989157e-01 7389 20352 -1.74396899578497e+00 7389 20376 -1.19479722097738e+00 7389 20400 -2.51340603069217e-01 7389 20424 -1.23920601170133e-02 7389 20448 -1.61126130499370e-07 7389 20712 -1.73196606922705e-03 7389 20736 -3.12514410067259e-02 7389 20760 -1.08175470687361e-01 7389 20784 -6.10196194821581e-02 7389 20808 -9.54620552641494e-03 7389 20832 -9.92519568879595e-05 7389 21120 -7.90465775745000e-09 7389 21144 -1.26266347100430e-07 7389 21168 -3.86495522040040e-07 7389 21192 -9.46477160706500e-08 7390 7390 1.00000000000000e+00 7391 7391 1.00000000000000e+00 7392 7392 1.00000000000000e+00 7393 7393 1.00000000000000e+00 7394 7394 1.00000000000000e+00 7395 7395 1.00000000000000e+00 7396 7396 1.00000000000000e+00 7397 7397 1.00000000000000e+00 7398 7398 1.00000000000000e+00 7399 7399 1.00000000000000e+00 7400 7400 1.00000000000000e+00 7401 7401 1.00000000000000e+00 7402 7402 1.00000000000000e+00 7403 7403 1.00000000000000e+00 7404 7404 1.00000000000000e+00 7405 7405 1.00000000000000e+00 7406 7406 1.00000000000000e+00 7407 7407 1.00000000000000e+00 7408 7408 1.00000000000000e+00 7409 7409 1.00000000000000e+00 7410 7410 1.00000000000000e+00 7411 7411 1.00000000000000e+00 7412 7412 1.00000000000000e+00 7413 4965 1.82940000000000e-16 7413 4989 5.38430000000000e-16 7413 7413 1.44213860298005e+01 7413 5565 1.44666009939139e-06 7413 5589 2.51116470786617e-04 7413 5613 5.43624149202169e-04 7413 5637 3.05226841770275e-05 7413 5661 1.84048516669520e-07 7413 5685 8.10624600000000e-14 7413 6141 1.32826164813375e-06 7413 6165 4.31287933667568e-03 7413 6189 1.41882974823338e-01 7413 6213 2.77770045261548e-01 7413 6237 1.08523138370516e-01 7413 6261 5.11135706757781e-03 7413 6285 1.45607376990150e-07 7413 6309 1.86000000000000e-17 7413 6741 2.27667645083755e-05 7413 6765 1.46585707143297e-01 7413 6789 2.43971202276567e+00 7413 6813 5.76486307275872e+00 7413 6837 2.13949290794893e+00 7413 6861 1.03347535291059e-01 7413 6885 2.12636592359750e-04 7413 6909 2.84600000000000e-17 7413 7341 4.72542549108692e-04 7413 7365 3.28037469003477e-01 7413 7389 6.05533313607153e+00 7413 7437 5.35940821716833e+00 7413 7461 2.50889615789969e-01 7413 7485 3.84182544807869e-04 7413 7941 3.60350842428261e-04 7413 7965 1.19649369036845e-01 7413 7989 2.27567422516408e+00 7413 8013 5.50028633803761e+00 7413 8037 2.14309867129194e+00 7413 8061 1.06063705484242e-01 7413 8085 1.58758229703411e-05 7413 8541 2.13656657686150e-06 7413 8565 3.37533779248327e-03 7413 8589 1.13542902326335e-01 7413 8613 2.82601434453938e-01 7413 8637 1.00146710530683e-01 7413 8661 4.42976897962898e-03 7413 8685 7.87821774847090e-07 7413 9165 2.33546346859166e-06 7413 9189 4.76842667935607e-05 7413 9213 2.74904578863928e-04 7413 9237 3.16321383374554e-04 7413 9261 4.62919780307250e-07 7413 17904 -3.49414465273940e-07 7413 17928 -3.41322157762283e-06 7413 17952 -8.41167939047529e-06 7413 17976 -2.01560395289946e-06 7413 18000 -1.00590931000000e-11 7413 18264 -1.07073187650000e-09 7413 18288 -1.11687003265815e-03 7413 18312 -2.33917155530072e-02 7413 18336 -9.55746831137999e-02 7413 18360 -9.45460057249810e-02 7413 18384 -2.10748455066421e-02 7413 18408 -5.78508518996021e-04 7413 18672 -7.22152185415616e-05 7413 18696 -4.73116659948555e-02 7413 18720 -5.02981888970391e-01 7413 18744 -1.58350204718119e+00 7413 18768 -1.44359395821836e+00 7413 18792 -3.57021004769816e-01 7413 18816 -1.99554679510907e-02 7413 18840 -4.19734577819630e-07 7413 19080 -3.09682943183141e-04 7413 19104 -2.23748796928774e-01 7413 19128 -2.18514483610325e+00 7413 19152 -6.49493602195014e+00 7413 19176 -5.76875780633062e+00 7413 19200 -1.49717127446901e+00 7413 19224 -1.01039043382732e-01 7413 19248 -1.54190474932792e-05 7413 19488 -1.55563455594225e-04 7413 19512 -2.52605295670648e-01 7413 19536 -2.57969505935664e+00 7413 19560 -7.84475762036908e+00 7413 19584 -6.93663822977322e+00 7413 19608 -1.86500071194450e+00 7413 19632 -1.39874140180185e-01 7413 19656 -5.60742176785086e-05 7413 19896 -2.08381299950425e-05 7413 19920 -7.02222855708134e-02 7413 19944 -8.20278751359086e-01 7413 19968 -2.65973954927666e+00 7413 19992 -2.30331252695496e+00 7413 20016 -5.92579518169752e-01 7413 20040 -4.05088426167662e-02 7413 20064 -1.65162946727460e-05 7413 20328 -4.76276778342322e-03 7413 20352 -7.51061278934850e-02 7413 20376 -2.70400200659878e-01 7413 20400 -2.24374614877639e-01 7413 20424 -5.20208389584623e-02 7413 20448 -2.65351095419149e-03 7413 20472 -6.94046372686330e-07 7413 20736 -5.59793347357087e-06 7413 20760 -2.81280434771752e-04 7413 20784 -1.08121285912413e-03 7413 20808 -4.19129189440229e-04 7413 20832 -4.00601221406902e-05 7414 7414 1.00000000000000e+00 7415 7415 1.00000000000000e+00 7416 7416 1.00000000000000e+00 7417 7417 1.00000000000000e+00 7418 7418 1.00000000000000e+00 7419 7419 1.00000000000000e+00 7420 7420 1.00000000000000e+00 7421 7421 1.00000000000000e+00 7422 7422 1.00000000000000e+00 7423 7423 1.00000000000000e+00 7424 7424 1.00000000000000e+00 7425 7425 1.00000000000000e+00 7426 7426 1.00000000000000e+00 7427 7427 1.00000000000000e+00 7428 7428 1.00000000000000e+00 7429 7429 1.00000000000000e+00 7430 7430 1.00000000000000e+00 7431 7431 1.00000000000000e+00 7432 7432 1.00000000000000e+00 7433 7433 1.00000000000000e+00 7434 7434 1.00000000000000e+00 7435 7435 1.00000000000000e+00 7436 7436 1.00000000000000e+00 7437 7437 1.36726238031769e+01 7437 5589 1.01551698587118e-06 7437 5613 8.34240246487315e-05 7437 5637 3.76580666462597e-04 7437 5661 1.56645013647059e-04 7437 5685 2.12450364950000e-10 7437 6165 5.63269850000800e-07 7437 6189 4.30756462080162e-03 7437 6213 1.14020590599326e-01 7437 6237 2.81305087752587e-01 7437 6261 8.13110836323444e-02 7437 6285 4.89545672319201e-03 7437 6309 4.07861261643046e-06 7437 6765 1.97278770701292e-05 7437 6789 1.19507368978332e-01 7437 6813 2.13680044591841e+00 7437 6837 5.12682007264057e+00 7437 6861 2.12534457488609e+00 7437 6885 9.78293108358399e-02 7437 6909 2.09551952060577e-04 7437 7365 6.35178349373469e-04 7437 7389 2.61254999604072e-01 7437 7413 5.35940821716833e+00 7437 7461 5.11958293841724e+00 7437 7485 2.51563538065903e-01 7437 7509 2.87450017846340e-04 7437 7965 1.86724261971479e-04 7437 7989 1.13586382165691e-01 7437 8013 2.15224436646039e+00 7437 8037 5.14992565412800e+00 7437 8061 2.02653932949459e+00 7437 8085 1.08772846312633e-01 7437 8109 3.31206932007268e-05 7437 8565 2.40795486257655e-06 7437 8589 4.70380571098790e-03 7437 8613 8.63918164591289e-02 7437 8637 2.82210798877978e-01 7437 8661 1.07957058569068e-01 7437 8685 2.64740635360737e-03 7437 8709 2.00372158358373e-06 7437 9189 1.51877667859400e-08 7437 9213 1.76444125597537e-04 7437 9237 2.80163312061426e-04 7437 9261 7.71464689415058e-05 7437 9285 5.53908622508739e-06 7437 17904 -4.68288025480875e-06 7437 17928 -1.95098127036782e-03 7437 17952 -1.23074871066057e-02 7437 17976 -2.04237157877317e-02 7437 18000 -5.35878571918443e-03 7437 18024 -1.96245122556974e-04 7437 18288 -4.02905087151103e-06 7437 18312 -1.06321116976907e-02 7437 18336 -1.58796974729019e-01 7437 18360 -6.27007469647809e-01 7437 18384 -7.35882102626040e-01 7437 18408 -2.12078387164958e-01 7437 18432 -1.52511482932409e-02 7437 18456 -1.21690419475120e-07 7437 18696 -2.19376034812508e-05 7437 18720 -7.41832630423710e-02 7437 18744 -1.01903277723736e+00 7437 18768 -3.82742487958769e+00 7437 18792 -4.28272850225013e+00 7437 18816 -1.29828131778270e+00 7437 18840 -1.09225360996490e-01 7437 18864 -9.56224454740975e-05 7437 19104 -2.73146508523378e-05 7437 19128 -1.44363945467564e-01 7437 19152 -1.93483237870046e+00 7437 19176 -7.13291989148037e+00 7437 19200 -7.82063470981179e+00 7437 19224 -2.48901865479237e+00 7437 19248 -2.34465262564643e-01 7437 19272 -4.24155580695294e-04 7437 19512 -5.82139999520669e-06 7437 19536 -5.91529245750109e-02 7437 19560 -9.41794062802636e-01 7437 19584 -3.67439368781381e+00 7437 19608 -3.99347476231918e+00 7437 19632 -1.24030980514069e+00 7437 19656 -1.12540250718606e-01 7437 19680 -2.69100304160322e-04 7437 19944 -6.95654844075527e-03 7437 19968 -1.43723768517551e-01 7437 19992 -5.94848422720118e-01 7437 20016 -6.28313393694458e-01 7437 20040 -1.85183137996140e-01 7437 20064 -1.53834825153154e-02 7437 20088 -4.34911550910312e-05 7437 20352 -2.65552428960317e-05 7437 20376 -3.08070724295751e-03 7437 20400 -1.39338207108137e-02 7437 20424 -1.10223094013724e-02 7437 20448 -2.05148678363387e-03 7437 20472 -1.05416003024272e-05 7438 7438 1.00000000000000e+00 7439 7439 1.00000000000000e+00 7440 7440 1.00000000000000e+00 7441 7441 1.00000000000000e+00 7442 7442 1.00000000000000e+00 7443 7443 1.00000000000000e+00 7444 7444 1.00000000000000e+00 7445 7445 1.00000000000000e+00 7446 7446 1.00000000000000e+00 7447 7447 1.00000000000000e+00 7448 7448 1.00000000000000e+00 7449 7449 1.00000000000000e+00 7450 7450 1.00000000000000e+00 7451 7451 1.00000000000000e+00 7452 7452 1.00000000000000e+00 7453 7453 1.00000000000000e+00 7454 7454 1.00000000000000e+00 7455 7455 1.00000000000000e+00 7456 7456 1.00000000000000e+00 7457 7457 1.00000000000000e+00 7458 7458 1.00000000000000e+00 7459 7459 1.00000000000000e+00 7460 7460 1.00000000000000e+00 7461 7461 1.32156586210115e+01 7461 5589 5.21894530000000e-13 7461 5613 1.22408211906470e-06 7461 5637 2.90316706081261e-04 7461 5661 1.84292133188979e-04 7461 5685 5.24284476533349e-05 7461 5709 2.00372158358374e-06 7461 6189 7.04711743687000e-09 7461 6213 5.51968148406407e-03 7461 6237 9.45590627379141e-02 7461 6261 2.70606731348374e-01 7461 6285 9.95804102733944e-02 7461 6309 2.51568580534586e-03 7461 6333 5.76185385784568e-06 7461 6789 6.51738304218140e-05 7461 6813 9.54297444868273e-02 7461 6837 2.12226312376197e+00 7461 6861 5.01207283480071e+00 7461 6885 2.00834264652635e+00 7461 6909 9.76298792981398e-02 7461 6933 2.09858096953741e-04 7461 6957 6.70440000000000e-16 7461 7389 5.34088471120026e-04 7461 7413 2.50889615789969e-01 7461 7437 5.11958293841724e+00 7461 7485 4.98296884704715e+00 7461 7509 2.62012914802079e-01 7461 7533 2.30005939103818e-04 7461 7557 1.87511000000000e-15 7461 7989 8.43467389933999e-05 7461 8013 1.09060475920185e-01 7461 8037 2.03413071720506e+00 7461 8061 5.12142788929226e+00 7461 8085 1.94522732471998e+00 7461 8109 9.82611695325464e-02 7461 8133 9.44854427779038e-05 7461 8589 3.90695406012380e-07 7461 8613 5.12001329153914e-03 7461 8637 1.00625901988247e-01 7461 8661 2.37311790284683e-01 7461 8685 1.10241595057532e-01 7461 8709 2.51568580534584e-03 7461 8733 1.29402964269488e-06 7461 9189 1.07492419000000e-12 7461 9213 3.05027687506100e-08 7461 9237 3.57994833680469e-05 7461 9261 5.25146915451604e-04 7461 9285 1.76905947185153e-04 7461 9309 4.07861261643040e-06 7461 9885 1.22830000000000e-16 7461 9909 1.86000000000000e-17 7461 17544 -2.95151509768486e-05 7461 17568 -4.98462211108428e-04 7461 17592 -1.58782338679894e-03 7461 17616 -5.27208835272881e-04 7461 17640 -3.67018070179620e-05 7461 17904 -5.66768020861000e-09 7461 17928 -1.55759882964494e-03 7461 17952 -4.17062818071607e-02 7461 17976 -2.08634239809661e-01 7461 18000 -3.05397524757640e-01 7461 18024 -1.02094554323801e-01 7461 18048 -9.23046608098390e-03 7461 18072 -5.84238235270000e-09 7461 18312 -5.74695123481400e-08 7461 18336 -2.25121796792210e-02 7461 18360 -4.46824974409302e-01 7461 18384 -2.02056147413531e+00 7461 18408 -2.74137618073184e+00 7461 18432 -9.74542059803753e-01 7461 18456 -1.01881284312103e-01 7461 18480 -2.61608722558192e-04 7461 18720 -1.44862846263390e-07 7461 18744 -7.39694930109536e-02 7461 18768 -1.33991019064059e+00 7461 18792 -5.80227885164784e+00 7461 18816 -7.56571605479376e+00 7461 18840 -2.80557560879685e+00 7461 18864 -3.18730314473022e-01 7461 18888 -1.43453473503941e-03 7461 19128 -3.47987915137000e-08 7461 19152 -4.55087334551140e-02 7461 19176 -9.98666130461218e-01 7461 19200 -4.54342432343407e+00 7461 19224 -5.99220336649916e+00 7461 19248 -2.23326814143203e+00 7461 19272 -2.57273709859605e-01 7461 19296 -1.81437017932958e-03 7461 19560 -7.63644529673767e-03 7461 19584 -2.24619371477821e-01 7461 19608 -1.07520244867280e+00 7461 19632 -1.41055889312212e+00 7461 19656 -4.97254905233339e-01 7461 19680 -5.29520423692178e-02 7461 19704 -3.88327097074177e-04 7461 19968 -8.79221394985284e-05 7461 19992 -1.20177584135245e-02 7461 20016 -6.33960961775753e-02 7461 20040 -7.95778024835319e-02 7461 20064 -2.19885461768131e-02 7461 20088 -1.33629378071348e-03 7461 20112 -3.49041330603600e-08 7461 20400 -2.22255490871340e-07 7461 20424 -9.73631128109090e-07 7461 20448 -5.60692149366320e-07 7461 20472 -8.46091646237500e-08 7462 7462 1.00000000000000e+00 7463 7463 1.00000000000000e+00 7464 7464 1.00000000000000e+00 7465 7465 1.00000000000000e+00 7466 7466 1.00000000000000e+00 7467 7467 1.00000000000000e+00 7468 7468 1.00000000000000e+00 7469 7469 1.00000000000000e+00 7470 7470 1.00000000000000e+00 7471 7471 1.00000000000000e+00 7472 7472 1.00000000000000e+00 7473 7473 1.00000000000000e+00 7474 7474 1.00000000000000e+00 7475 7475 1.00000000000000e+00 7476 7476 1.00000000000000e+00 7477 7477 1.00000000000000e+00 7478 7478 1.00000000000000e+00 7479 7479 1.00000000000000e+00 7480 7480 1.00000000000000e+00 7481 7481 1.00000000000000e+00 7482 7482 1.00000000000000e+00 7483 7483 1.00000000000000e+00 7484 7484 1.00000000000000e+00 7485 7485 1.30555747118988e+01 7485 5637 1.37306196538332e-06 7485 5661 1.06435412031523e-04 7485 5685 5.57366312412021e-04 7485 5709 3.31206932007271e-05 7485 5733 9.31527367732900e-08 7485 5757 3.51291980000000e-13 7485 6237 5.38660454727592e-03 7485 6261 1.04108481663571e-01 7485 6285 2.35758953438194e-01 7485 6309 9.82611695325461e-02 7485 6333 4.46279463381609e-03 7485 6357 7.26515781837240e-07 7485 6813 1.15050029531136e-04 7485 6837 8.52217717988993e-02 7485 6861 2.01957827044318e+00 7485 6885 4.96244048857827e+00 7485 6909 2.01810107737033e+00 7485 6933 9.42274113557097e-02 7485 6957 1.99496121906749e-04 7485 7413 3.84182544807869e-04 7485 7437 2.51563538065903e-01 7485 7461 4.98296884704715e+00 7485 7509 4.82079811148042e+00 7485 7533 2.72468734328648e-01 7485 7557 2.30005939103819e-04 7485 8013 7.84963079505842e-05 7485 8037 1.11890756819090e-01 7485 8061 1.94392165227317e+00 7485 8085 4.95787514450112e+00 7485 8109 2.01810107737038e+00 7485 8133 8.43200148895854e-02 7485 8157 1.14629817987543e-04 7485 8613 6.86885643072780e-06 7485 8637 2.37454150425827e-03 7485 8661 1.05587349081562e-01 7485 8685 2.55684893376080e-01 7485 8709 9.76298792981412e-02 7485 8733 3.20501286228352e-03 7485 8757 3.53353347430290e-07 7485 9237 1.89681802581380e-06 7485 9261 6.59455841648086e-05 7485 9285 2.49408950444562e-04 7485 9309 2.09551952060575e-04 7485 9333 6.71275600306683e-06 7485 9885 1.87940000000000e-16 7485 9909 2.84600000000000e-17 7485 17184 -6.25027141297650e-07 7485 17208 -2.75579249208753e-06 7485 17232 -1.64776284888538e-06 7485 17256 -2.55683926896930e-07 7485 17544 -4.25390998073089e-05 7485 17568 -6.53347571849014e-03 7485 17592 -4.68504653711729e-02 7485 17616 -9.59262161090060e-02 7485 17640 -3.79318522441513e-02 7485 17664 -4.14430081245733e-03 7485 17952 -6.09418934663193e-03 7485 17976 -1.69941020545760e-01 7485 18000 -9.17064794435828e-01 7485 18024 -1.53990166618198e+00 7485 18048 -6.46991543310079e-01 7485 18072 -8.08640652260130e-02 7485 18096 -3.45218003082495e-04 7485 18360 -3.01220400623413e-02 7485 18384 -7.69802226468799e-01 7485 18408 -3.94652603057977e+00 7485 18432 -6.27649976772458e+00 7485 18456 -2.72455878059634e+00 7485 18480 -3.62722235630275e-01 7485 18504 -3.03185917096305e-03 7485 18768 -3.16680109148213e-02 7485 18792 -9.24693753917562e-01 7485 18816 -4.82545053729419e+00 7485 18840 -7.65930322967344e+00 7485 18864 -3.42674317775816e+00 7485 18888 -4.82708299194590e-01 7485 18912 -7.05238029109575e-03 7485 19176 -7.22537427582608e-03 7485 19200 -3.03095516402849e-01 7485 19224 -1.66908141813579e+00 7485 19248 -2.67868645090644e+00 7485 19272 -1.14383406827340e+00 7485 19296 -1.52427932049994e-01 7485 19320 -2.06384177255705e-03 7485 19584 -2.10501275725715e-04 7485 19608 -2.93382054589841e-02 7485 19632 -1.75026824014734e-01 7485 19656 -2.84162572146212e-01 7485 19680 -1.10295881093749e-01 7485 19704 -1.27531411453202e-02 7485 19728 -1.03213653480996e-04 7485 20016 -1.53172366412971e-04 7485 20040 -8.00980653817300e-04 7485 20064 -9.06390528705472e-04 7485 20088 -1.88504826688788e-04 7485 20112 -5.34096308434300e-08 7486 7486 1.00000000000000e+00 7487 7487 1.00000000000000e+00 7488 7488 1.00000000000000e+00 7489 7489 1.00000000000000e+00 7490 7490 1.00000000000000e+00 7491 7491 1.00000000000000e+00 7492 7492 1.00000000000000e+00 7493 7493 1.00000000000000e+00 7494 7494 1.00000000000000e+00 7495 7495 1.00000000000000e+00 7496 7496 1.00000000000000e+00 7497 7497 1.00000000000000e+00 7498 7498 1.00000000000000e+00 7499 7499 1.00000000000000e+00 7500 7500 1.00000000000000e+00 7501 7501 1.00000000000000e+00 7502 7502 1.00000000000000e+00 7503 7503 1.00000000000000e+00 7504 7504 1.00000000000000e+00 7505 7505 1.00000000000000e+00 7506 7506 1.00000000000000e+00 7507 7507 1.00000000000000e+00 7508 7508 1.00000000000000e+00 7509 7509 1.31472905222685e+01 7509 5661 1.13484136129365e-05 7509 5685 1.26060474670819e-04 7509 5709 2.87450017846346e-04 7509 5733 1.11059283569016e-04 7509 5757 3.82862373842000e-09 7509 6237 3.82862373842000e-09 7509 6261 3.85851679879770e-03 7509 6285 1.04203715562111e-01 7509 6309 2.62012914802079e-01 7509 6333 8.32621938773885e-02 7509 6357 3.85851679879768e-03 7509 6381 1.13484136129364e-05 7509 6837 1.11059283569015e-04 7509 6861 8.32621938773882e-02 7509 6885 2.02259967515321e+00 7509 6909 4.82079811148037e+00 7509 6933 2.02259967515323e+00 7509 6957 1.04203715562110e-01 7509 6981 1.26060474670818e-04 7509 7437 2.87450017846340e-04 7509 7461 2.62012914802079e-01 7509 7485 4.82079811148042e+00 7509 7533 4.82079811148048e+00 7509 7557 2.62012914802081e-01 7509 7581 2.87450017846335e-04 7509 8037 1.26060474670818e-04 7509 8061 1.04203715562112e-01 7509 8085 2.02259967515333e+00 7509 8109 4.82079811148057e+00 7509 8133 2.02259967515330e+00 7509 8157 8.32621938773911e-02 7509 8181 1.11059283569015e-04 7509 8637 1.13484136129364e-05 7509 8661 3.85851679879765e-03 7509 8685 8.32621938773912e-02 7509 8709 2.62012914802083e-01 7509 8733 1.04203715562111e-01 7509 8757 3.85851679879775e-03 7509 8781 3.82862373842000e-09 7509 9261 3.82862373842000e-09 7509 9285 1.11059283569014e-04 7509 9309 2.87450017846340e-04 7509 9333 1.26060474670821e-04 7509 9357 1.13484136129366e-05 7509 17184 -3.08191473876543e-04 7509 17208 -5.17490449004992e-03 7509 17232 -1.73529761959176e-02 7509 17256 -9.04705997000787e-03 7509 17280 -1.27623034386603e-03 7509 17568 -1.27623034386604e-03 7509 17592 -5.45870460972286e-02 7509 17616 -3.57157477180801e-01 7509 17640 -7.34647396722995e-01 7509 17664 -3.71678060230641e-01 7509 17688 -5.45870460972280e-02 7509 17712 -3.08191473876528e-04 7509 17976 -9.04705997000791e-03 7509 18000 -3.71678060230642e-01 7509 18024 -2.28807743415274e+00 7509 18048 -4.42023205069238e+00 7509 18072 -2.28807743415277e+00 7509 18096 -3.57157477180807e-01 7509 18120 -5.17490449004993e-03 7509 18384 -1.73529761959176e-02 7509 18408 -7.34647396722989e-01 7509 18432 -4.42023205069236e+00 7509 18456 -8.29821941083528e+00 7509 18480 -4.42023205069251e+00 7509 18504 -7.34647396723027e-01 7509 18528 -1.73529761959179e-02 7509 18792 -5.17490449004990e-03 7509 18816 -3.57157477180800e-01 7509 18840 -2.28807743415279e+00 7509 18864 -4.42023205069257e+00 7509 18888 -2.28807743415282e+00 7509 18912 -3.71678060230651e-01 7509 18936 -9.04705997000804e-03 7509 19200 -3.08191473876535e-04 7509 19224 -5.45870460972288e-02 7509 19248 -3.71678060230656e-01 7509 19272 -7.34647396723042e-01 7509 19296 -3.57157477180811e-01 7509 19320 -5.45870460972284e-02 7509 19344 -1.27623034386605e-03 7509 19632 -1.27623034386603e-03 7509 19656 -9.04705997000780e-03 7509 19680 -1.73529761959173e-02 7509 19704 -5.17490449004984e-03 7509 19728 -3.08191473876536e-04 7510 7510 1.00000000000000e+00 7511 7511 1.00000000000000e+00 7512 7512 1.00000000000000e+00 7513 7513 1.00000000000000e+00 7514 7514 1.00000000000000e+00 7515 7515 1.00000000000000e+00 7516 7516 1.00000000000000e+00 7517 7517 1.00000000000000e+00 7518 7518 1.00000000000000e+00 7519 7519 1.00000000000000e+00 7520 7520 1.00000000000000e+00 7521 7521 1.00000000000000e+00 7522 7522 1.00000000000000e+00 7523 7523 1.00000000000000e+00 7524 7524 1.00000000000000e+00 7525 7525 1.00000000000000e+00 7526 7526 1.00000000000000e+00 7527 7527 1.00000000000000e+00 7528 7528 1.00000000000000e+00 7529 7529 1.00000000000000e+00 7530 7530 1.00000000000000e+00 7531 7531 1.00000000000000e+00 7532 7532 1.00000000000000e+00 7533 5109 2.84600000000000e-17 7533 5133 1.87940000000000e-16 7533 7533 1.30555747118987e+01 7533 5685 6.71275600306698e-06 7533 5709 2.09551952060579e-04 7533 5733 2.49408950444565e-04 7533 5757 6.59455841648079e-05 7533 5781 1.89681802581378e-06 7533 6261 3.53353347430290e-07 7533 6285 3.20501286228353e-03 7533 6309 9.76298792981403e-02 7533 6333 2.55684893376081e-01 7533 6357 1.05587349081563e-01 7533 6381 2.37454150425829e-03 7533 6405 6.86885643072775e-06 7533 6861 1.14629817987541e-04 7533 6885 8.43200148895843e-02 7533 6909 2.01810107737034e+00 7533 6933 4.95787514450105e+00 7533 6957 1.94392165227317e+00 7533 6981 1.11890756819092e-01 7533 7005 7.84963079505863e-05 7533 7461 2.30005939103818e-04 7533 7485 2.72468734328648e-01 7533 7509 4.82079811148047e+00 7533 7557 4.98296884704709e+00 7533 7581 2.51563538065893e-01 7533 7605 3.84182544807881e-04 7533 8061 1.99496121906756e-04 7533 8085 9.42274113557110e-02 7533 8109 2.01810107737035e+00 7533 8133 4.96244048857833e+00 7533 8157 2.01957827044318e+00 7533 8181 8.52217717988976e-02 7533 8205 1.15050029531139e-04 7533 8661 7.26515781837260e-07 7533 8685 4.46279463381611e-03 7533 8709 9.82611695325460e-02 7533 8733 2.35758953438197e-01 7533 8757 1.04108481663572e-01 7533 8781 5.38660454727596e-03 7533 9261 3.51291980000000e-13 7533 9285 9.31527367732900e-08 7533 9309 3.31206932007275e-05 7533 9333 5.57366312412029e-04 7533 9357 1.06435412031524e-04 7533 9381 1.37306196538333e-06 7533 16800 -5.34096308434300e-08 7533 16824 -1.88504826688786e-04 7533 16848 -9.06390528705463e-04 7533 16872 -8.00980653817294e-04 7533 16896 -1.53172366412970e-04 7533 17184 -1.03213653480999e-04 7533 17208 -1.27531411453204e-02 7533 17232 -1.10295881093750e-01 7533 17256 -2.84162572146213e-01 7533 17280 -1.75026824014737e-01 7533 17304 -2.93382054589848e-02 7533 17328 -2.10501275725722e-04 7533 17592 -2.06384177255707e-03 7533 17616 -1.52427932049992e-01 7533 17640 -1.14383406827339e+00 7533 17664 -2.67868645090642e+00 7533 17688 -1.66908141813578e+00 7533 17712 -3.03095516402849e-01 7533 17736 -7.22537427582627e-03 7533 18000 -7.05238029109580e-03 7533 18024 -4.82708299194577e-01 7533 18048 -3.42674317775810e+00 7533 18072 -7.65930322967335e+00 7533 18096 -4.82545053729412e+00 7533 18120 -9.24693753917552e-01 7533 18144 -3.16680109148220e-02 7533 18408 -3.03185917096303e-03 7533 18432 -3.62722235630272e-01 7533 18456 -2.72455878059634e+00 7533 18480 -6.27649976772464e+00 7533 18504 -3.94652603057980e+00 7533 18528 -7.69802226468803e-01 7533 18552 -3.01220400623416e-02 7533 18816 -3.45218003082488e-04 7533 18840 -8.08640652260136e-02 7533 18864 -6.46991543310086e-01 7533 18888 -1.53990166618200e+00 7533 18912 -9.17064794435841e-01 7533 18936 -1.69941020545763e-01 7533 18960 -6.09418934663197e-03 7533 19248 -4.14430081245748e-03 7533 19272 -3.79318522441517e-02 7533 19296 -9.59262161090056e-02 7533 19320 -4.68504653711731e-02 7533 19344 -6.53347571849024e-03 7533 19368 -4.25390998073094e-05 7533 19656 -2.55683926896930e-07 7533 19680 -1.64776284888536e-06 7533 19704 -2.75579249208747e-06 7533 19728 -6.25027141297640e-07 7534 7534 1.00000000000000e+00 7535 7535 1.00000000000000e+00 7536 7536 1.00000000000000e+00 7537 7537 1.00000000000000e+00 7538 7538 1.00000000000000e+00 7539 7539 1.00000000000000e+00 7540 7540 1.00000000000000e+00 7541 7541 1.00000000000000e+00 7542 7542 1.00000000000000e+00 7543 7543 1.00000000000000e+00 7544 7544 1.00000000000000e+00 7545 7545 1.00000000000000e+00 7546 7546 1.00000000000000e+00 7547 7547 1.00000000000000e+00 7548 7548 1.00000000000000e+00 7549 7549 1.00000000000000e+00 7550 7550 1.00000000000000e+00 7551 7551 1.00000000000000e+00 7552 7552 1.00000000000000e+00 7553 7553 1.00000000000000e+00 7554 7554 1.00000000000000e+00 7555 7555 1.00000000000000e+00 7556 7556 1.00000000000000e+00 7557 5109 1.86000000000000e-17 7557 5133 1.22830000000000e-16 7557 7557 1.32156586210115e+01 7557 5709 4.07861261643045e-06 7557 5733 1.76905947185151e-04 7557 5757 5.25146915451599e-04 7557 5781 3.57994833680467e-05 7557 5805 3.05027687506100e-08 7557 5829 1.07492419000000e-12 7557 6285 1.29402964269486e-06 7557 6309 2.51568580534585e-03 7557 6333 1.10241595057533e-01 7557 6357 2.37311790284684e-01 7557 6381 1.00625901988246e-01 7557 6405 5.12001329153911e-03 7557 6429 3.90695406012380e-07 7557 6885 9.44854427779006e-05 7557 6909 9.82611695325452e-02 7557 6933 1.94522732471997e+00 7557 6957 5.12142788929234e+00 7557 6981 2.03413071720511e+00 7557 7005 1.09060475920186e-01 7557 7029 8.43467389934015e-05 7557 7461 1.87511000000000e-15 7557 7485 2.30005939103819e-04 7557 7509 2.62012914802081e-01 7557 7533 4.98296884704709e+00 7557 7581 5.11958293841729e+00 7557 7605 2.50889615789972e-01 7557 7629 5.34088471120013e-04 7557 8061 6.70440000000000e-16 7557 8085 2.09858096953744e-04 7557 8109 9.76298792981412e-02 7557 8133 2.00834264652635e+00 7557 8157 5.01207283480075e+00 7557 8181 2.12226312376188e+00 7557 8205 9.54297444868246e-02 7557 8229 6.51738304218118e-05 7557 8685 5.76185385784564e-06 7557 8709 2.51568580534590e-03 7557 8733 9.95804102733956e-02 7557 8757 2.70606731348377e-01 7557 8781 9.45590627379150e-02 7557 8805 5.51968148406412e-03 7557 8829 7.04711743687000e-09 7557 9309 2.00372158358377e-06 7557 9333 5.24284476533356e-05 7557 9357 1.84292133188979e-04 7557 9381 2.90316706081261e-04 7557 9405 1.22408211906470e-06 7557 9429 5.21894530000000e-13 7557 16440 -8.46091646237400e-08 7557 16464 -5.60692149366310e-07 7557 16488 -9.73631128109080e-07 7557 16512 -2.22255490871330e-07 7557 16800 -3.49041330603600e-08 7557 16824 -1.33629378071347e-03 7557 16848 -2.19885461768129e-02 7557 16872 -7.95778024835313e-02 7557 16896 -6.33960961775749e-02 7557 16920 -1.20177584135245e-02 7557 16944 -8.79221394985312e-05 7557 17208 -3.88327097074182e-04 7557 17232 -5.29520423692178e-02 7557 17256 -4.97254905233345e-01 7557 17280 -1.41055889312214e+00 7557 17304 -1.07520244867283e+00 7557 17328 -2.24619371477825e-01 7557 17352 -7.63644529673744e-03 7557 17616 -1.81437017932960e-03 7557 17640 -2.57273709859605e-01 7557 17664 -2.23326814143205e+00 7557 17688 -5.99220336649925e+00 7557 17712 -4.54342432343419e+00 7557 17736 -9.98666130461241e-01 7557 17760 -4.55087334551132e-02 7557 17784 -3.47987915136900e-08 7557 18024 -1.43453473503938e-03 7557 18048 -3.18730314473018e-01 7557 18072 -2.80557560879681e+00 7557 18096 -7.56571605479370e+00 7557 18120 -5.80227885164792e+00 7557 18144 -1.33991019064062e+00 7557 18168 -7.39694930109539e-02 7557 18192 -1.44862846263390e-07 7557 18432 -2.61608722558182e-04 7557 18456 -1.01881284312102e-01 7557 18480 -9.74542059803748e-01 7557 18504 -2.74137618073184e+00 7557 18528 -2.02056147413533e+00 7557 18552 -4.46824974409309e-01 7557 18576 -2.25121796792212e-02 7557 18600 -5.74695123481400e-08 7557 18840 -5.84238235270000e-09 7557 18864 -9.23046608098409e-03 7557 18888 -1.02094554323802e-01 7557 18912 -3.05397524757645e-01 7557 18936 -2.08634239809663e-01 7557 18960 -4.17062818071609e-02 7557 18984 -1.55759882964493e-03 7557 19008 -5.66768020861000e-09 7557 19272 -3.67018070179617e-05 7557 19296 -5.27208835272886e-04 7557 19320 -1.58782338679897e-03 7557 19344 -4.98462211108435e-04 7557 19368 -2.95151509768490e-05 7558 7558 1.00000000000000e+00 7559 7559 1.00000000000000e+00 7560 7560 1.00000000000000e+00 7561 7561 1.00000000000000e+00 7562 7562 1.00000000000000e+00 7563 7563 1.00000000000000e+00 7564 7564 1.00000000000000e+00 7565 7565 1.00000000000000e+00 7566 7566 1.00000000000000e+00 7567 7567 1.00000000000000e+00 7568 7568 1.00000000000000e+00 7569 7569 1.00000000000000e+00 7570 7570 1.00000000000000e+00 7571 7571 1.00000000000000e+00 7572 7572 1.00000000000000e+00 7573 7573 1.00000000000000e+00 7574 7574 1.00000000000000e+00 7575 7575 1.00000000000000e+00 7576 7576 1.00000000000000e+00 7577 7577 1.00000000000000e+00 7578 7578 1.00000000000000e+00 7579 7579 1.00000000000000e+00 7580 7580 1.00000000000000e+00 7581 7581 1.36726238031770e+01 7581 5733 5.53908622508734e-06 7581 5757 7.71464689415051e-05 7581 5781 2.80163312061428e-04 7581 5805 1.76444125597537e-04 7581 5829 1.51877667859400e-08 7581 6309 2.00372158358373e-06 7581 6333 2.64740635360721e-03 7581 6357 1.07957058569066e-01 7581 6381 2.82210798877977e-01 7581 6405 8.63918164591287e-02 7581 6429 4.70380571098784e-03 7581 6453 2.40795486257654e-06 7581 6909 3.31206932007269e-05 7581 6933 1.08772846312623e-01 7581 6957 2.02653932949454e+00 7581 6981 5.14992565412804e+00 7581 7005 2.15224436646042e+00 7581 7029 1.13586382165693e-01 7581 7053 1.86724261971480e-04 7581 7509 2.87450017846335e-04 7581 7533 2.51563538065893e-01 7581 7557 5.11958293841729e+00 7581 7605 5.35940821716831e+00 7581 7629 2.61254999604079e-01 7581 7653 6.35178349373470e-04 7581 8109 2.09551952060577e-04 7581 8133 9.78293108358406e-02 7581 8157 2.12534457488613e+00 7581 8181 5.12682007264041e+00 7581 8205 2.13680044591831e+00 7581 8229 1.19507368978339e-01 7581 8253 1.97278770701271e-05 7581 8709 4.07861261643052e-06 7581 8733 4.89545672319204e-03 7581 8757 8.13110836323451e-02 7581 8781 2.81305087752589e-01 7581 8805 1.14020590599322e-01 7581 8829 4.30756462080172e-03 7581 8853 5.63269850000800e-07 7581 9333 2.12450364950000e-10 7581 9357 1.56645013647059e-04 7581 9381 3.76580666462597e-04 7581 9405 8.34240246487300e-05 7581 9429 1.01551698587119e-06 7581 16440 -1.05416003024268e-05 7581 16464 -2.05148678363386e-03 7581 16488 -1.10223094013724e-02 7581 16512 -1.39338207108135e-02 7581 16536 -3.08070724295746e-03 7581 16560 -2.65552428960317e-05 7581 16824 -4.34911550910307e-05 7581 16848 -1.53834825153153e-02 7581 16872 -1.85183137996139e-01 7581 16896 -6.28313393694458e-01 7581 16920 -5.94848422720130e-01 7581 16944 -1.43723768517554e-01 7581 16968 -6.95654844075527e-03 7581 17232 -2.69100304160320e-04 7581 17256 -1.12540250718600e-01 7581 17280 -1.24030980514067e+00 7581 17304 -3.99347476231921e+00 7581 17328 -3.67439368781383e+00 7581 17352 -9.41794062802648e-01 7581 17376 -5.91529245750130e-02 7581 17400 -5.82139999520664e-06 7581 17640 -4.24155580695295e-04 7581 17664 -2.34465262564620e-01 7581 17688 -2.48901865479233e+00 7581 17712 -7.82063470981192e+00 7581 17736 -7.13291989148029e+00 7581 17760 -1.93483237870046e+00 7581 17784 -1.44363945467572e-01 7581 17808 -2.73146508523377e-05 7581 18048 -9.56224454740977e-05 7581 18072 -1.09225360996483e-01 7581 18096 -1.29828131778270e+00 7581 18120 -4.28272850225021e+00 7581 18144 -3.82742487958770e+00 7581 18168 -1.01903277723736e+00 7581 18192 -7.41832630423723e-02 7581 18216 -2.19376034812510e-05 7581 18456 -1.21690419475120e-07 7581 18480 -1.52511482932406e-02 7581 18504 -2.12078387164960e-01 7581 18528 -7.35882102626055e-01 7581 18552 -6.27007469647816e-01 7581 18576 -1.58796974729020e-01 7581 18600 -1.06321116976905e-02 7581 18624 -4.02905087151109e-06 7581 18888 -1.96245122556977e-04 7581 18912 -5.35878571918446e-03 7581 18936 -2.04237157877318e-02 7581 18960 -1.23074871066057e-02 7581 18984 -1.95098127036781e-03 7581 19008 -4.68288025480874e-06 7582 7582 1.00000000000000e+00 7583 7583 1.00000000000000e+00 7584 7584 1.00000000000000e+00 7585 7585 1.00000000000000e+00 7586 7586 1.00000000000000e+00 7587 7587 1.00000000000000e+00 7588 7588 1.00000000000000e+00 7589 7589 1.00000000000000e+00 7590 7590 1.00000000000000e+00 7591 7591 1.00000000000000e+00 7592 7592 1.00000000000000e+00 7593 7593 1.00000000000000e+00 7594 7594 1.00000000000000e+00 7595 7595 1.00000000000000e+00 7596 7596 1.00000000000000e+00 7597 7597 1.00000000000000e+00 7598 7598 1.00000000000000e+00 7599 7599 1.00000000000000e+00 7600 7600 1.00000000000000e+00 7601 7601 1.00000000000000e+00 7602 7602 1.00000000000000e+00 7603 7603 1.00000000000000e+00 7604 7604 1.00000000000000e+00 7605 7605 1.44213860298007e+01 7605 5757 4.62919780307240e-07 7605 5781 3.16321383374553e-04 7605 5805 2.74904578863927e-04 7605 5829 4.76842667935613e-05 7605 5853 2.33546346859170e-06 7605 6333 7.87821774847080e-07 7605 6357 4.42976897962895e-03 7605 6381 1.00146710530683e-01 7605 6405 2.82601434453935e-01 7605 6429 1.13542902326334e-01 7605 6453 3.37533779248329e-03 7605 6477 2.13656657686152e-06 7605 6933 1.58758229703415e-05 7605 6957 1.06063705484243e-01 7605 6981 2.14309867129197e+00 7605 7005 5.50028633803769e+00 7605 7029 2.27567422516409e+00 7605 7053 1.19649369036844e-01 7605 7077 3.60350842428250e-04 7605 7533 3.84182544807881e-04 7605 7557 2.50889615789972e-01 7605 7581 5.35940821716831e+00 7605 7629 6.05533313607161e+00 7605 7653 3.28037469003484e-01 7605 7677 4.72542549108677e-04 7605 8109 2.84600000000000e-17 7605 8133 2.12636592359755e-04 7605 8157 1.03347535291059e-01 7605 8181 2.13949290794892e+00 7605 8205 5.76486307275885e+00 7605 8229 2.43971202276572e+00 7605 8253 1.46585707143286e-01 7605 8277 2.27667645083757e-05 7605 8709 1.86000000000000e-17 7605 8733 1.45607376990150e-07 7605 8757 5.11135706757785e-03 7605 8781 1.08523138370515e-01 7605 8805 2.77770045261544e-01 7605 8829 1.41882974823338e-01 7605 8853 4.31287933667565e-03 7605 8877 1.32826164813373e-06 7605 9333 8.10624600000000e-14 7605 9357 1.84048516669520e-07 7605 9381 3.05226841770271e-05 7605 9405 5.43624149202171e-04 7605 9429 2.51116470786621e-04 7605 9453 1.44666009939136e-06 7605 10029 5.38430000000000e-16 7605 10053 1.82940000000000e-16 7605 16080 -4.00601221406906e-05 7605 16104 -4.19129189440235e-04 7605 16128 -1.08121285912415e-03 7605 16152 -2.81280434771757e-04 7605 16176 -5.59793347357092e-06 7605 16440 -6.94046372686300e-07 7605 16464 -2.65351095419148e-03 7605 16488 -5.20208389584616e-02 7605 16512 -2.24374614877637e-01 7605 16536 -2.70400200659878e-01 7605 16560 -7.51061278934845e-02 7605 16584 -4.76276778342307e-03 7605 16848 -1.65162946727458e-05 7605 16872 -4.05088426167660e-02 7605 16896 -5.92579518169758e-01 7605 16920 -2.30331252695498e+00 7605 16944 -2.65973954927667e+00 7605 16968 -8.20278751359092e-01 7605 16992 -7.02222855708147e-02 7605 17016 -2.08381299950427e-05 7605 17256 -5.60742176785082e-05 7605 17280 -1.39874140180185e-01 7605 17304 -1.86500071194453e+00 7605 17328 -6.93663822977334e+00 7605 17352 -7.84475762036918e+00 7605 17376 -2.57969505935669e+00 7605 17400 -2.52605295670655e-01 7605 17424 -1.55563455594225e-04 7605 17664 -1.54190474932791e-05 7605 17688 -1.01039043382734e-01 7605 17712 -1.49717127446900e+00 7605 17736 -5.76875780633061e+00 7605 17760 -6.49493602195037e+00 7605 17784 -2.18514483610331e+00 7605 17808 -2.23748796928774e-01 7605 17832 -3.09682943183135e-04 7605 18072 -4.19734577819640e-07 7605 18096 -1.99554679510914e-02 7605 18120 -3.57021004769812e-01 7605 18144 -1.44359395821835e+00 7605 18168 -1.58350204718124e+00 7605 18192 -5.02981888970404e-01 7605 18216 -4.73116659948551e-02 7605 18240 -7.22152185415600e-05 7605 18504 -5.78508518996036e-04 7605 18528 -2.10748455066424e-02 7605 18552 -9.45460057249813e-02 7605 18576 -9.55746831137985e-02 7605 18600 -2.33917155530069e-02 7605 18624 -1.11687003265816e-03 7605 18648 -1.07073187650000e-09 7605 18912 -1.00590931000000e-11 7605 18936 -2.01560395289946e-06 7605 18960 -8.41167939047528e-06 7605 18984 -3.41322157762282e-06 7605 19008 -3.49414465273940e-07 7606 7606 1.00000000000000e+00 7607 7607 1.00000000000000e+00 7608 7608 1.00000000000000e+00 7609 7609 1.00000000000000e+00 7610 7610 1.00000000000000e+00 7611 7611 1.00000000000000e+00 7612 7612 1.00000000000000e+00 7613 7613 1.00000000000000e+00 7614 7614 1.00000000000000e+00 7615 7615 1.00000000000000e+00 7616 7616 1.00000000000000e+00 7617 7617 1.00000000000000e+00 7618 7618 1.00000000000000e+00 7619 7619 1.00000000000000e+00 7620 7620 1.00000000000000e+00 7621 7621 1.00000000000000e+00 7622 7622 1.00000000000000e+00 7623 7623 1.00000000000000e+00 7624 7624 1.00000000000000e+00 7625 7625 1.00000000000000e+00 7626 7626 1.00000000000000e+00 7627 7627 1.00000000000000e+00 7628 7628 1.00000000000000e+00 7629 7629 1.66019127419814e+01 7629 5757 1.11133603000000e-12 7629 5781 4.10056075839960e-07 7629 5805 9.68204573979332e-05 7629 5829 6.38231870733005e-04 7629 5853 7.38617469010416e-05 7629 5877 1.80315251593800e-08 7629 5901 8.34516350000000e-13 7629 6357 2.29509986312700e-08 7629 6381 5.39569286250711e-03 7629 6405 1.17330424634126e-01 7629 6429 2.91682199132938e-01 7629 6453 1.29158141991548e-01 7629 6477 7.60696239971761e-03 7629 6501 1.13169651915079e-06 7629 6957 3.99813715338231e-05 7629 6981 1.04894232584916e-01 7629 7005 2.28425795486038e+00 7629 7029 6.07253200657614e+00 7629 7053 2.67314736954824e+00 7629 7077 1.10751375218820e-01 7629 7101 2.98307779105637e-04 7629 7557 5.34088471120013e-04 7629 7581 2.61254999604079e-01 7629 7605 6.05533313607161e+00 7629 7653 6.03243372310656e+00 7629 7677 2.61946729281471e-01 7629 7701 1.51134942095439e-04 7629 8133 5.46280000000000e-16 7629 8157 1.78814708764562e-04 7629 8181 1.24287728839433e-01 7629 8205 2.44145806955100e+00 7629 8229 6.56258203239002e+00 7629 8253 2.14495058601448e+00 7629 8277 8.90814666278486e-02 7629 8301 9.32791876860000e-10 7629 8733 8.29700000000000e-17 7629 8757 4.70536121254527e-06 7629 8781 2.88298668641229e-03 7629 8805 1.33750852826007e-01 7629 8829 3.38445502301245e-01 7629 8853 1.01082040273075e-01 7629 8877 1.60503283768704e-03 7629 9381 1.67959048382321e-06 7629 9405 1.16427669681291e-04 7629 9429 2.83309791446209e-04 7629 9453 2.27061860767540e-04 7629 10029 1.43269000000000e-15 7629 10053 4.86770000000000e-16 7629 15720 -9.46477160706600e-08 7629 15744 -3.86495522040070e-07 7629 15768 -1.26266347100440e-07 7629 15792 -7.90465775745000e-09 7629 16080 -9.92519568879605e-05 7629 16104 -9.54620552641513e-03 7629 16128 -6.10196194821591e-02 7629 16152 -1.08175470687362e-01 7629 16176 -3.12514410067265e-02 7629 16200 -1.73196606922714e-03 7629 16464 -1.61126130499370e-07 7629 16488 -1.23920601170131e-02 7629 16512 -2.51340603069217e-01 7629 16536 -1.19479722097737e+00 7629 16560 -1.74396899578495e+00 7629 16584 -5.39531734989179e-01 7629 16608 -4.16778281377626e-02 7629 16872 -7.02160393795440e-07 7629 16896 -6.46783074102996e-02 7629 16920 -1.18550249725812e+00 7629 16944 -5.34832249232643e+00 7629 16968 -7.42284113932560e+00 7629 16992 -2.34143120142445e+00 7629 17016 -1.98215657855400e-01 7629 17280 -3.91749617691150e-07 7629 17304 -7.96429948358947e-02 7629 17328 -1.56150964536206e+00 7629 17352 -7.17876805185179e+00 7629 17376 -1.00058294587791e+01 7629 17400 -3.15212942479755e+00 7629 17424 -2.75221263027290e-01 7629 17688 -5.76558717979400e-08 7629 17712 -2.16090931874471e-02 7629 17736 -5.43816655026184e-01 7629 17760 -2.64775831761201e+00 7629 17784 -3.73623591502851e+00 7629 17808 -1.16968533203044e+00 7629 17832 -9.96338200064888e-02 7629 18120 -1.25262710500989e-03 7629 18144 -5.66160552656326e-02 7629 18168 -2.97980555261449e-01 7629 18192 -4.22827509282699e-01 7629 18216 -1.30571047099530e-01 7629 18240 -1.05376172650654e-02 7629 18528 -1.74352105968200e-08 7629 18552 -3.98715594254561e-04 7629 18576 -1.90576692073224e-03 7629 18600 -1.64331298995032e-03 7629 18624 -3.11177468058393e-04 7629 18648 -2.84904636177000e-09 7630 7630 1.00000000000000e+00 7631 7631 1.00000000000000e+00 7632 7632 1.00000000000000e+00 7633 7633 1.00000000000000e+00 7634 7634 1.00000000000000e+00 7635 7635 1.00000000000000e+00 7636 7636 1.00000000000000e+00 7637 7637 1.00000000000000e+00 7638 7638 1.00000000000000e+00 7639 7639 1.00000000000000e+00 7640 7640 1.00000000000000e+00 7641 7641 1.00000000000000e+00 7642 7642 1.00000000000000e+00 7643 7643 1.00000000000000e+00 7644 7644 1.00000000000000e+00 7645 7645 1.00000000000000e+00 7646 7646 1.00000000000000e+00 7647 7647 1.00000000000000e+00 7648 7648 1.00000000000000e+00 7649 7649 1.00000000000000e+00 7650 7650 1.00000000000000e+00 7651 7651 1.00000000000000e+00 7652 7652 1.00000000000000e+00 7653 7653 1.79804363934452e+01 7653 5805 6.81126937739488e-06 7653 5829 2.12410211905647e-04 7653 5853 4.30184941148632e-04 7653 5877 1.55156966072372e-04 7653 5901 4.80711473217600e-08 7653 6405 5.70101788762027e-03 7653 6429 1.38803384818389e-01 7653 6453 3.83651946384642e-01 7653 6477 9.86337930065506e-02 7653 6501 7.50438699090512e-03 7653 6981 9.19256200499704e-05 7653 7005 1.04668459507657e-01 7653 7029 2.69560330541544e+00 7653 7053 6.00181058392055e+00 7653 7077 3.14714061325168e+00 7653 7101 1.55044360737329e-01 7653 7581 6.35178349373470e-04 7653 7605 3.28037469003484e-01 7653 7629 6.03243372310656e+00 7653 7677 1.12062297642634e+01 7653 7701 9.79813381742757e-02 7653 8181 1.17189641502778e-04 7653 8205 1.48638855963741e-01 7653 8229 2.20243939165186e+00 7653 8253 8.40787723111244e+00 7653 8277 3.62600246314926e+00 7653 8301 1.86054858380149e-06 7653 8781 8.73668005157801e-06 7653 8805 5.85510262322277e-03 7653 8829 1.01036021558391e-01 7653 8853 4.11150698402194e-01 7653 8877 3.70617261712408e-02 7653 9405 3.96083470000000e-13 7653 9429 2.02409678011768e-04 7653 9453 2.73392609382709e-04 7653 15720 -6.38658904564122e-04 7653 15744 -5.05501392373332e-03 7653 15768 -1.53507695888668e-02 7653 15792 -1.19215732302675e-02 7653 16104 -3.26638239810661e-03 7653 16128 -1.04269346786835e-01 7653 16152 -5.12343280474778e-01 7653 16176 -8.37895207133297e-01 7653 16200 -4.83551374784505e-01 7653 16512 -2.46988284185834e-02 7653 16536 -7.08432062787704e-01 7653 16560 -3.34211054867200e+00 7653 16584 -5.66644235563060e+00 7653 16608 -3.96155814643503e+00 7653 16920 -5.17816687505491e-02 7653 16944 -1.42191071427140e+00 7653 16968 -6.52746285474579e+00 7653 16992 -1.17788140657173e+01 7653 17016 -9.81224485046757e+00 7653 17328 -1.95621366677708e-02 7653 17352 -7.70581711034177e-01 7653 17376 -3.63348164739568e+00 7653 17400 -5.85915587839834e+00 7653 17424 -4.42153745514192e+00 7653 17736 -1.98398564923313e-03 7653 17760 -1.31722113288675e-01 7653 17784 -6.43339735310644e-01 7653 17808 -9.28686431603791e-01 7653 17832 -5.86323053563030e-01 7653 18144 -4.73650354579960e-07 7653 18168 -3.81608675529014e-03 7653 18192 -2.05626619650522e-02 7653 18216 -2.67141945964822e-02 7653 18240 -8.66206699074860e-03 7654 7654 1.00000000000000e+00 7655 7655 1.00000000000000e+00 7656 7656 1.00000000000000e+00 7657 7657 1.00000000000000e+00 7658 7658 1.00000000000000e+00 7659 7659 1.00000000000000e+00 7660 7660 1.00000000000000e+00 7661 7661 1.00000000000000e+00 7662 7662 1.00000000000000e+00 7663 7663 1.00000000000000e+00 7664 7664 1.00000000000000e+00 7665 7665 1.00000000000000e+00 7666 7666 1.00000000000000e+00 7667 7667 1.00000000000000e+00 7668 7668 1.00000000000000e+00 7669 7669 1.00000000000000e+00 7670 7670 1.00000000000000e+00 7671 7671 1.00000000000000e+00 7672 7672 1.00000000000000e+00 7673 7673 1.00000000000000e+00 7674 7674 1.00000000000000e+00 7675 7675 1.00000000000000e+00 7676 7676 1.00000000000000e+00 7677 7677 2.13447489157982e+01 7677 5829 7.44503075326120e-06 7677 5853 2.94496133374715e-04 7677 5877 2.53629710191415e-04 7677 5901 8.82040844097404e-06 7677 5925 2.84965056096480e-07 7677 6405 2.19087640160000e-10 7677 6429 7.20183881084092e-03 7677 6453 1.04720627674972e-01 7677 6477 4.95673214491808e-01 7677 6501 2.76648894908256e-01 7677 6525 3.44776521549182e-06 7677 7005 1.93604114647185e-04 7677 7029 9.51566419060007e-02 7677 7053 2.68265796979807e+00 7677 7077 9.78199297230561e+00 7677 7101 1.82785208832571e+00 7677 7125 1.28205453431010e-07 7677 7605 4.72542549108677e-04 7677 7629 2.61946729281471e-01 7677 7653 1.12062297642634e+01 7677 7701 5.82260908100787e-01 7677 8205 6.44276186536669e-05 7677 8229 1.18442951526063e-01 7677 8253 5.44645677899699e+00 7677 8277 4.34538569436165e+00 7677 8301 4.40213679917635e-06 7677 8805 6.93965276951360e-07 7677 8829 8.70653938089633e-03 7677 8853 1.33556506834832e-01 7677 8877 1.55949680715280e-02 7677 9405 1.81280000000000e-16 7677 9429 1.18392864123259e-06 7677 9453 2.00195419374276e-06 7677 15336 -2.12346769668840e-07 7677 15360 -2.91886673369874e-05 7677 15384 -5.68909072862929e-05 7677 15720 -3.76985077331602e-04 7677 15744 -1.46556642943470e-02 7677 15768 -2.98294215297033e-01 7677 15792 -5.03800392544258e-01 7677 16128 -8.39440981508353e-03 7677 16152 -2.26898724073119e-01 7677 16176 -2.68385561620026e+00 7677 16200 -3.99767481908086e+00 7677 16536 -3.02687018809984e-02 7677 16560 -7.93553797255210e-01 7677 16584 -8.06189223988948e+00 7677 16608 -1.13558941478984e+01 7677 16944 -1.62745062553763e-02 7677 16968 -5.98577294457413e-01 7677 16992 -8.81234700362108e+00 7677 17016 -1.38577901086800e+01 7677 17352 -2.36456528890254e-03 7677 17376 -1.34464897613048e-01 7677 17400 -2.29622406868504e+00 7677 17424 -3.71267255159020e+00 7677 17760 -4.68162706606940e-06 7677 17784 -7.17949674489168e-03 7677 17808 -1.24352589445778e-01 7677 17832 -1.98570423981032e-01 7677 18192 -2.33755502357585e-06 7677 18216 -2.89818847393745e-05 7677 18240 -4.16008843137181e-05 7678 7678 1.00000000000000e+00 7679 7679 1.00000000000000e+00 7680 7680 1.00000000000000e+00 7681 7681 1.00000000000000e+00 7682 7682 1.00000000000000e+00 7683 7683 1.00000000000000e+00 7684 7684 1.00000000000000e+00 7685 7685 1.00000000000000e+00 7686 7686 1.00000000000000e+00 7687 7687 1.00000000000000e+00 7688 7688 1.00000000000000e+00 7689 7689 1.00000000000000e+00 7690 7690 1.00000000000000e+00 7691 7691 1.00000000000000e+00 7692 7692 1.00000000000000e+00 7693 7693 1.00000000000000e+00 7694 7694 1.00000000000000e+00 7695 7695 1.00000000000000e+00 7696 7696 1.00000000000000e+00 7697 7697 1.00000000000000e+00 7698 7698 1.00000000000000e+00 7699 7699 1.00000000000000e+00 7700 7700 1.00000000000000e+00 7701 7701 1.05242261230147e+00 7701 5853 5.17938663274501e-06 7701 5877 1.74314569669891e-05 7701 5901 1.01894477122356e-05 7701 5925 3.38261348833650e-07 7701 6429 2.08930460891830e-07 7701 6453 2.93365015021251e-03 7701 6477 1.02332936930004e-01 7701 6501 7.50878594565642e-02 7701 6525 4.09279816281571e-06 7701 7029 1.60494948635371e-04 7701 7053 5.66352263340678e-02 7701 7077 9.54978556178062e-01 7701 7101 3.57682624143023e-01 7701 7125 1.52197706490320e-07 7701 7629 1.51134942095439e-04 7701 7653 9.79813381742757e-02 7701 7677 5.82260908100787e-01 7701 8229 9.01164771458686e-06 7701 8253 8.35456992673703e-03 7701 8277 1.38154135506734e-02 7701 8301 1.23430727922290e-07 7701 8853 2.17449701422420e-07 7701 8877 1.47384460888310e-07 7701 15336 -2.27564163003280e-07 7701 15360 -3.45539493907780e-05 7701 15384 -6.75149496405330e-05 7701 15744 -1.07614750049477e-03 7701 15768 -7.30006766659712e-02 7701 15792 -1.38468320828479e-01 7701 16152 -5.78613424267488e-03 7701 16176 -3.49593855422119e-01 7701 16200 -6.58684771145513e-01 7701 16560 -7.02520703206139e-03 7701 16584 -3.07481855106399e-01 7701 16608 -5.65787260988367e-01 7701 16968 -1.52551360576185e-03 7701 16992 -6.68357069655323e-02 7701 17016 -1.22992818690732e-01 7701 17376 -1.01389756552506e-05 7701 17400 -2.18156224160925e-03 7701 17424 -4.29215165363174e-03 7702 7702 1.00000000000000e+00 7703 7703 1.00000000000000e+00 7704 7704 1.00000000000000e+00 7705 7705 1.00000000000000e+00 7706 7706 1.00000000000000e+00 7707 7707 1.00000000000000e+00 7708 7708 1.00000000000000e+00 7709 7709 1.00000000000000e+00 7710 7710 1.00000000000000e+00 7711 7711 1.00000000000000e+00 7712 7712 1.00000000000000e+00 7713 7713 1.00000000000000e+00 7714 7714 1.00000000000000e+00 7715 7715 1.00000000000000e+00 7716 7716 1.00000000000000e+00 7717 7717 1.00000000000000e+00 7718 7718 1.00000000000000e+00 7719 7719 1.00000000000000e+00 7720 7720 1.00000000000000e+00 7721 7721 1.00000000000000e+00 7722 7722 1.00000000000000e+00 7723 7723 1.00000000000000e+00 7724 7724 1.00000000000000e+00 7725 7725 1.00000000000000e+00 7726 7726 1.00000000000000e+00 7727 7727 1.00000000000000e+00 7728 7728 1.00000000000000e+00 7729 7729 1.00000000000000e+00 7730 7730 1.00000000000000e+00 7731 7731 1.00000000000000e+00 7732 7732 1.00000000000000e+00 7733 7733 1.00000000000000e+00 7734 7734 1.00000000000000e+00 7735 7735 1.00000000000000e+00 7736 7736 1.00000000000000e+00 7737 7737 1.00000000000000e+00 7738 7738 1.00000000000000e+00 7739 7739 1.00000000000000e+00 7740 7740 1.00000000000000e+00 7741 7741 1.00000000000000e+00 7742 7742 1.00000000000000e+00 7743 7743 1.00000000000000e+00 7744 7744 1.00000000000000e+00 7745 7745 1.00000000000000e+00 7746 7746 1.00000000000000e+00 7747 7747 1.00000000000000e+00 7748 7748 1.00000000000000e+00 7749 7749 1.00000000000000e+00 7750 7750 1.00000000000000e+00 7751 7751 1.00000000000000e+00 7752 7752 1.00000000000000e+00 7753 7753 1.00000000000000e+00 7754 7754 1.00000000000000e+00 7755 7755 1.00000000000000e+00 7756 7756 1.00000000000000e+00 7757 7757 1.00000000000000e+00 7758 7758 1.00000000000000e+00 7759 7759 1.00000000000000e+00 7760 7760 1.00000000000000e+00 7761 7761 1.00000000000000e+00 7762 7762 1.00000000000000e+00 7763 7763 1.00000000000000e+00 7764 7764 1.00000000000000e+00 7765 7765 1.00000000000000e+00 7766 7766 1.00000000000000e+00 7767 7767 1.00000000000000e+00 7768 7768 1.00000000000000e+00 7769 7769 1.00000000000000e+00 7770 7770 1.00000000000000e+00 7771 7771 1.00000000000000e+00 7772 7772 1.00000000000000e+00 7773 7773 1.00000000000000e+00 7774 7774 1.00000000000000e+00 7775 7775 1.00000000000000e+00 7776 7776 1.00000000000000e+00 7777 7777 1.00000000000000e+00 7778 7778 1.00000000000000e+00 7779 7779 1.00000000000000e+00 7780 7780 1.00000000000000e+00 7781 7781 1.00000000000000e+00 7782 7782 1.00000000000000e+00 7783 7783 1.00000000000000e+00 7784 7784 1.00000000000000e+00 7785 7785 1.00000000000000e+00 7786 7786 1.00000000000000e+00 7787 7787 1.00000000000000e+00 7788 7788 1.00000000000000e+00 7789 7789 1.00000000000000e+00 7790 7790 1.00000000000000e+00 7791 7791 1.00000000000000e+00 7792 7792 1.00000000000000e+00 7793 7793 1.00000000000000e+00 7794 7794 1.00000000000000e+00 7795 7795 1.00000000000000e+00 7796 7796 1.00000000000000e+00 7797 7797 1.00000000000000e+00 7798 7798 1.00000000000000e+00 7799 7799 1.00000000000000e+00 7800 7800 1.00000000000000e+00 7801 7801 1.00000000000000e+00 7802 7802 1.00000000000000e+00 7803 7803 1.00000000000000e+00 7804 7804 1.00000000000000e+00 7805 7805 1.00000000000000e+00 7806 7806 1.00000000000000e+00 7807 7807 1.00000000000000e+00 7808 7808 1.00000000000000e+00 7809 7809 1.00000000000000e+00 7810 7810 1.00000000000000e+00 7811 7811 1.00000000000000e+00 7812 7812 1.00000000000000e+00 7813 7813 1.00000000000000e+00 7814 7814 1.00000000000000e+00 7815 7815 1.00000000000000e+00 7816 7816 1.00000000000000e+00 7817 7817 1.00000000000000e+00 7818 7818 1.00000000000000e+00 7819 7819 1.00000000000000e+00 7820 7820 1.00000000000000e+00 7821 7821 1.00000000000000e+00 7822 7822 1.00000000000000e+00 7823 7823 1.00000000000000e+00 7824 7824 1.00000000000000e+00 7825 7825 1.00000000000000e+00 7826 7826 1.00000000000000e+00 7827 7827 1.00000000000000e+00 7828 7828 1.00000000000000e+00 7829 7829 1.00000000000000e+00 7830 7830 1.00000000000000e+00 7831 7831 1.00000000000000e+00 7832 7832 1.00000000000000e+00 7833 7833 1.00000000000000e+00 7834 7834 1.00000000000000e+00 7835 7835 1.00000000000000e+00 7836 7836 1.00000000000000e+00 7837 7837 1.00000000000000e+00 7838 7838 1.00000000000000e+00 7839 7839 1.00000000000000e+00 7840 7840 1.00000000000000e+00 7841 7841 1.00000000000000e+00 7842 7842 1.00000000000000e+00 7843 7843 1.00000000000000e+00 7844 7844 1.00000000000000e+00 7845 7845 1.00000000000000e+00 7846 7846 1.00000000000000e+00 7847 7847 1.00000000000000e+00 7848 7848 1.00000000000000e+00 7849 7849 1.00000000000000e+00 7850 7850 1.00000000000000e+00 7851 7851 1.00000000000000e+00 7852 7852 1.00000000000000e+00 7853 7853 1.00000000000000e+00 7854 7854 1.00000000000000e+00 7855 7855 1.00000000000000e+00 7856 7856 1.00000000000000e+00 7857 7857 1.00000000000000e+00 7858 7858 1.00000000000000e+00 7859 7859 1.00000000000000e+00 7860 7860 1.00000000000000e+00 7861 7861 1.00000000000000e+00 7862 7862 1.00000000000000e+00 7863 7863 1.00000000000000e+00 7864 7864 1.00000000000000e+00 7865 7865 1.00000000000000e+00 7866 7866 1.00000000000000e+00 7867 7867 1.00000000000000e+00 7868 7868 1.00000000000000e+00 7869 7869 1.00000000000000e+00 7870 7870 1.00000000000000e+00 7871 7871 1.00000000000000e+00 7872 7872 1.00000000000000e+00 7873 7873 1.00000000000000e+00 7874 7874 1.00000000000000e+00 7875 7875 1.00000000000000e+00 7876 7876 1.00000000000000e+00 7877 7877 1.00000000000000e+00 7878 7878 1.00000000000000e+00 7879 7879 1.00000000000000e+00 7880 7880 1.00000000000000e+00 7881 7881 1.00000000000000e+00 7882 7882 1.00000000000000e+00 7883 7883 1.00000000000000e+00 7884 7884 1.00000000000000e+00 7885 7885 1.00000000000000e+00 7886 7886 1.00000000000000e+00 7887 7887 1.00000000000000e+00 7888 7888 1.00000000000000e+00 7889 7889 1.00000000000000e+00 7890 7890 1.00000000000000e+00 7891 7891 1.00000000000000e+00 7892 7892 1.00000000000000e+00 7893 7893 1.00000435929869e+00 7893 7317 1.52197706490310e-07 7893 7341 1.28205453431010e-07 7893 7917 1.95729919479386e-03 7893 7941 1.07228177540025e-03 7893 7965 5.18496828096260e-07 7893 8493 3.16146648534742e-04 7893 8517 8.11544335798943e-03 7893 8541 2.07534537618295e-03 7893 8565 3.19208832744806e-06 7893 9093 5.45386769826279e-05 7893 9117 9.64122588329139e-04 7893 9141 2.13706456323185e-04 7893 9165 7.09230616116290e-07 7893 20712 -9.84041696600765e-04 7893 20736 -5.02259234512098e-04 7893 20760 -2.92525320334731e-06 7893 21120 -5.16422235334541e-03 7893 21144 -2.70507787133987e-03 7893 21168 -3.51333413334755e-05 7893 21528 -3.44015283048547e-03 7893 21552 -1.89434110109506e-03 7893 21576 -4.97899102435199e-05 7894 7894 1.00000000000000e+00 7895 7895 1.00000000000000e+00 7896 7896 1.00000000000000e+00 7897 7897 1.00000000000000e+00 7898 7898 1.00000000000000e+00 7899 7899 1.00000000000000e+00 7900 7900 1.00000000000000e+00 7901 7901 1.00000000000000e+00 7902 7902 1.00000000000000e+00 7903 7903 1.00000000000000e+00 7904 7904 1.00000000000000e+00 7905 7905 1.00000000000000e+00 7906 7906 1.00000000000000e+00 7907 7907 1.00000000000000e+00 7908 7908 1.00000000000000e+00 7909 7909 1.00000000000000e+00 7910 7910 1.00000000000000e+00 7911 7911 1.00000000000000e+00 7912 7912 1.00000000000000e+00 7913 7913 1.00000000000000e+00 7914 7914 1.00000000000000e+00 7915 7915 1.00000000000000e+00 7916 7916 1.00000000000000e+00 7917 7917 6.56924940955705e+00 7917 6141 2.60784759250900e-08 7917 6165 3.84760914064400e-08 7917 6717 1.65206772175220e-07 7917 6741 1.20671885798247e-02 7917 6765 4.31692185634901e-03 7917 6789 1.76345157057951e-06 7917 7317 3.57682624143009e-01 7917 7341 1.82785208832565e+00 7917 7365 1.55044360737320e-01 7917 7389 2.98307779105620e-04 7917 7893 1.95729919479386e-03 7917 7941 9.52331039881120e+00 7917 7965 2.98235611124594e-01 7917 7989 3.90821018534066e-04 7917 8493 6.52632710066741e-02 7917 8517 4.86555311739368e+00 7917 8541 3.15491505639718e+00 7917 8565 9.08790737019986e-02 7917 8589 3.87416569810678e-05 7917 9093 7.20909761037705e-03 7917 9117 2.17844836818968e-01 7917 9141 1.27181616251686e-01 7917 9165 2.98352467610294e-03 7917 9189 1.85443126627622e-06 7917 9741 1.25052203376217e-06 7917 9765 1.36192251944495e-06 7917 19488 -7.59934449608795e-04 7917 19512 -3.88025594488413e-04 7917 19536 -2.30239133829009e-06 7917 19896 -1.49586861259648e-01 7917 19920 -8.67773264820795e-02 7917 19944 -3.42397024350159e-03 7917 20304 -2.29847746643470e+00 7917 20328 -1.30109975791992e+00 7917 20352 -4.35226319330417e-02 7917 20376 -3.60143894674420e-05 7917 20712 -7.82386178903454e+00 7917 20736 -4.43068966198713e+00 7917 20760 -1.49049353647890e-01 7917 20784 -2.24151561366772e-04 7917 21120 -5.11769890541422e+00 7917 21144 -3.05351420152938e+00 7917 21168 -1.42656758267409e-01 7917 21192 -3.56454239513502e-04 7917 21528 -9.93950143461296e-01 7917 21552 -6.43859071509853e-01 7917 21576 -4.22648233034785e-02 7917 21600 -8.02216756130946e-05 7918 7918 1.00000000000000e+00 7919 7919 1.00000000000000e+00 7920 7920 1.00000000000000e+00 7921 7921 1.00000000000000e+00 7922 7922 1.00000000000000e+00 7923 7923 1.00000000000000e+00 7924 7924 1.00000000000000e+00 7925 7925 1.00000000000000e+00 7926 7926 1.00000000000000e+00 7927 7927 1.00000000000000e+00 7928 7928 1.00000000000000e+00 7929 7929 1.00000000000000e+00 7930 7930 1.00000000000000e+00 7931 7931 1.00000000000000e+00 7932 7932 1.00000000000000e+00 7933 7933 1.00000000000000e+00 7934 7934 1.00000000000000e+00 7935 7935 1.00000000000000e+00 7936 7936 1.00000000000000e+00 7937 7937 1.00000000000000e+00 7938 7938 1.00000000000000e+00 7939 7939 1.00000000000000e+00 7940 7940 1.00000000000000e+00 7941 7941 2.74181977528583e+01 7941 6141 4.17426610680265e-06 7941 6165 6.16672890543078e-06 7941 6189 1.50853894583000e-09 7941 6213 2.19544460000000e-13 7941 6717 1.47101733658930e-06 7941 6741 2.74929435139290e-01 7941 6765 2.50073467614362e-01 7941 6789 5.34094459172504e-03 7941 6813 1.89409891545972e-06 7941 7317 9.54978556178021e-01 7941 7341 9.78199297230528e+00 7941 7365 3.14714061325150e+00 7941 7389 1.10751375218813e-01 7941 7413 3.60350842428261e-04 7941 7893 1.07228177540025e-03 7941 7917 9.52331039881120e+00 7941 7965 5.96431524939470e+00 7941 7989 3.90074702897607e-01 7941 8013 2.31229553062051e-04 7941 8493 3.06976858560455e-02 7941 8517 4.49687532095992e+00 7941 8541 7.14083795988871e+00 7941 8565 2.64884504318010e+00 7941 8589 1.58330381854045e-01 7941 8613 7.51344158719125e-05 7941 9093 2.79091754131914e-03 7941 9117 1.45416647043225e-01 7941 9141 2.82792704146777e-01 7941 9165 1.37148490235051e-01 7941 9189 3.82984705123400e-03 7941 9213 3.03133255660085e-06 7941 9741 1.95371943844944e-04 7941 9765 2.39044322190820e-04 7941 9789 5.17228162006529e-06 7941 19080 -6.63024342517000e-09 7941 19104 -2.84816028581600e-08 7941 19128 -1.44727600551000e-08 7941 19152 -1.96062915748000e-09 7941 19488 -1.34062314544311e-01 7941 19512 -1.16854240285122e-01 7941 19536 -2.09752511183679e-02 7941 19560 -1.81463814625544e-03 7941 19896 -1.94760161133871e+00 7941 19920 -1.99097178969344e+00 7941 19944 -5.06189018822952e-01 7941 19968 -5.81648819907571e-02 7941 19992 -3.40800829606917e-05 7941 20304 -9.31757742472421e+00 7941 20328 -9.03319033806739e+00 7941 20352 -2.41236416441358e+00 7941 20376 -3.15687715384813e-01 7941 20400 -7.23038149697026e-04 7941 20712 -1.60834728731334e+01 7941 20736 -1.32830061635957e+01 7941 20760 -3.33774787695733e+00 7941 20784 -5.04462076015934e-01 7941 20808 -2.41565249248564e-03 7941 21120 -5.62748706111386e+00 7941 21144 -4.72007968522739e+00 7941 21168 -1.13078752502027e+00 7941 21192 -1.60508309066103e-01 7941 21216 -7.25522370285930e-04 7941 21528 -5.40869660850665e-01 7941 21552 -4.98997919341096e-01 7941 21576 -1.11494712416162e-01 7941 21600 -1.25654930568489e-02 7941 21624 -3.47011381079179e-05 7942 7942 1.00000000000000e+00 7943 7943 1.00000000000000e+00 7944 7944 1.00000000000000e+00 7945 7945 1.00000000000000e+00 7946 7946 1.00000000000000e+00 7947 7947 1.00000000000000e+00 7948 7948 1.00000000000000e+00 7949 7949 1.00000000000000e+00 7950 7950 1.00000000000000e+00 7951 7951 1.00000000000000e+00 7952 7952 1.00000000000000e+00 7953 7953 1.00000000000000e+00 7954 7954 1.00000000000000e+00 7955 7955 1.00000000000000e+00 7956 7956 1.00000000000000e+00 7957 7957 1.00000000000000e+00 7958 7958 1.00000000000000e+00 7959 7959 1.00000000000000e+00 7960 7960 1.00000000000000e+00 7961 7961 1.00000000000000e+00 7962 7962 1.00000000000000e+00 7963 7963 1.00000000000000e+00 7964 7964 1.00000000000000e+00 7965 7965 1.81406348468670e+01 7965 6141 6.61673559220358e-06 7965 6165 1.84499564047509e-04 7965 6189 1.14998784692892e-04 7965 6213 1.66357890694850e-07 7965 6717 1.76934258518440e-07 7965 6741 1.36090564095540e-01 7965 6765 3.37952987363556e-01 7965 6789 1.03910226659848e-01 7965 6813 4.53064416783982e-03 7965 6837 1.40334369341951e-05 7965 7317 5.66352263340650e-02 7965 7341 2.68265796979796e+00 7965 7365 6.00181058392055e+00 7965 7389 2.67314736954827e+00 7965 7413 1.19649369036845e-01 7965 7437 1.86724261971479e-04 7965 7893 5.18496828096260e-07 7965 7917 2.98235611124594e-01 7965 7941 5.96431524939469e+00 7965 7989 6.72471884021618e+00 7965 8013 3.25771669079228e-01 7965 8037 1.52045374293927e-04 7965 8493 3.30881342016351e-05 7965 8517 1.09481969201773e-01 7965 8541 2.68222047618851e+00 7965 8565 7.60940118776554e+00 7965 8589 2.77588105773608e+00 7965 8613 1.17467751532466e-01 7965 8637 1.33659463189933e-04 7965 9093 4.55990495249529e-06 7965 9117 4.32657486010449e-03 7965 9141 1.15026971954080e-01 7965 9165 3.88254869960613e-01 7965 9189 1.63787166671290e-01 7965 9213 3.35210990307821e-03 7965 9237 8.42870972887720e-07 7965 9741 1.28664970767148e-04 7965 9765 3.23989771589693e-04 7965 9789 9.87647472616856e-05 7965 9813 1.53658882619252e-05 7965 19080 -2.42406379375067e-04 7965 19104 -4.43604484561122e-03 7965 19128 -1.45815447323936e-02 7965 19152 -5.36026349040978e-03 7965 19176 -4.73461040574706e-04 7965 19488 -1.03422884076187e-01 7965 19512 -4.08296859121543e-01 7965 19536 -7.58041586363677e-01 7965 19560 -2.92463126461181e-01 7965 19584 -3.11108491462266e-02 7965 19608 -1.88711314146379e-05 7965 19896 -7.35724208401009e-01 7965 19920 -2.99889266328804e+00 7965 19944 -5.28864690628290e+00 7965 19968 -2.11930396500525e+00 7965 19992 -2.45488223812455e-01 7965 20016 -1.29536421402409e-03 7965 20304 -1.51207846681759e+00 7965 20328 -6.68777816209307e+00 7965 20352 -1.18093709731942e+01 7965 20376 -4.89729124264455e+00 7965 20400 -6.03687179371153e-01 7965 20424 -5.60829570506775e-03 7965 20712 -7.56106341981151e-01 7965 20736 -3.72278010225773e+00 7965 20760 -7.34164664187904e+00 7965 20784 -3.06527398950025e+00 7965 20808 -3.75923620321779e-01 7965 20832 -4.05950296912941e-03 7965 21120 -1.17498240106752e-01 7965 21144 -6.38508544939145e-01 7965 21168 -1.33316206270325e+00 7965 21192 -5.38961450759740e-01 7965 21216 -6.28594643042386e-02 7965 21240 -7.09905820190969e-04 7965 21528 -2.63702574884965e-03 7965 21552 -1.75666651323252e-02 7965 21576 -3.10803560498739e-02 7965 21600 -8.02848167035946e-03 7965 21624 -2.44065315422982e-04 7966 7966 1.00000000000000e+00 7967 7967 1.00000000000000e+00 7968 7968 1.00000000000000e+00 7969 7969 1.00000000000000e+00 7970 7970 1.00000000000000e+00 7971 7971 1.00000000000000e+00 7972 7972 1.00000000000000e+00 7973 7973 1.00000000000000e+00 7974 7974 1.00000000000000e+00 7975 7975 1.00000000000000e+00 7976 7976 1.00000000000000e+00 7977 7977 1.00000000000000e+00 7978 7978 1.00000000000000e+00 7979 7979 1.00000000000000e+00 7980 7980 1.00000000000000e+00 7981 7981 1.00000000000000e+00 7982 7982 1.00000000000000e+00 7983 7983 1.00000000000000e+00 7984 7984 1.00000000000000e+00 7985 7985 1.00000000000000e+00 7986 7986 1.00000000000000e+00 7987 7987 1.00000000000000e+00 7988 7988 1.00000000000000e+00 7989 7989 1.58390083592944e+01 7989 5589 3.80000000000000e-19 7989 6141 3.07268247464817e-06 7989 6165 2.14991453078890e-04 7989 6189 3.89714704487470e-04 7989 6213 3.45354354387659e-05 7989 6237 2.19066051226402e-06 7989 6717 7.31269937100000e-11 7989 6741 4.58947816494330e-03 7989 6765 1.20597050544893e-01 7989 6789 3.24085759625736e-01 7989 6813 1.29265031934991e-01 7989 6837 3.00569983360122e-03 7989 6861 5.31858846635944e-06 7989 7317 1.60494948635362e-04 7989 7341 9.51566419059959e-02 7989 7365 2.69560330541537e+00 7989 7389 6.07253200657607e+00 7989 7413 2.27567422516408e+00 7989 7437 1.13586382165691e-01 7989 7461 8.43467389933999e-05 7989 7917 3.90821018534066e-04 7989 7941 3.90074702897607e-01 7989 7965 6.72471884021618e+00 7989 8013 5.58574866139341e+00 7989 8037 2.94052596094360e-01 7989 8061 2.80445054406429e-04 7989 8517 1.08990327590325e-04 7989 8541 1.65476629083135e-01 7989 8565 2.77392916116126e+00 7989 8589 6.32140157665028e+00 7989 8613 2.32069493927854e+00 7989 8637 8.99707006266861e-02 7989 8661 1.76641060064227e-04 7989 9117 1.16629760528204e-06 7989 9141 5.91766666038560e-03 7989 9165 1.59134713973779e-01 7989 9189 3.08047702966219e-01 7989 9213 1.22356735855191e-01 7989 9237 4.93536473027622e-03 7989 9261 2.14304096016500e-08 7989 9741 4.13083515611090e-07 7989 9765 1.81715951490786e-05 7989 9789 7.01342460993384e-04 7989 9813 2.20082275981338e-04 7989 9837 2.79430157966995e-06 7989 18696 -1.33252547496470e-07 7989 18720 -9.54730890178402e-05 7989 18744 -4.18824570894568e-04 7989 18768 -2.50664090970473e-04 7989 18792 -3.89310030356546e-05 7989 19080 -1.55188264107729e-04 7989 19104 -2.03872129237748e-02 7989 19128 -1.36848367689043e-01 7989 19152 -2.65399292796336e-01 7989 19176 -1.18129358804483e-01 7989 19200 -1.51559787944259e-02 7989 19224 -8.12642191870767e-06 7989 19488 -4.98947752019853e-03 7989 19512 -2.68460388411370e-01 7989 19536 -1.59016329279604e+00 7989 19560 -2.79102250318822e+00 7989 19584 -1.30451795486918e+00 7989 19608 -1.85449956010226e-01 7989 19632 -1.89638474168434e-03 7989 19896 -1.97720813716509e-02 7989 19920 -9.36190402441585e-01 7989 19944 -5.30453705292566e+00 7989 19968 -8.88021871768782e+00 7989 19992 -4.25765599427589e+00 7989 20016 -6.39847535218475e-01 7989 20040 -1.05393873554722e-02 7989 20304 -1.29413237855621e-02 7989 20328 -8.76028072878747e-01 7989 20352 -5.11917555376150e+00 7989 20376 -8.63045626787830e+00 7989 20400 -4.10122884318578e+00 7989 20424 -6.26267686291771e-01 7989 20448 -1.42016680674156e-02 7989 20712 -2.16046850008640e-03 7989 20736 -2.34219438433392e-01 7989 20760 -1.43097519682742e+00 7989 20784 -2.47405737344551e+00 7989 20808 -1.09956716241353e+00 7989 20832 -1.55321867795442e-01 7989 20856 -3.21498529089213e-03 7989 21120 -4.61831190340906e-06 7989 21144 -1.65362016833941e-02 7989 21168 -1.10018885673367e-01 7989 21192 -2.00180555053642e-01 7989 21216 -7.55358123396607e-02 7989 21240 -8.02865271787030e-03 7989 21264 -3.48101433441661e-05 7989 21552 -4.99658735013202e-06 7989 21576 -2.42166638779728e-05 7989 21600 -2.19178452599109e-05 7989 21624 -4.23031447744472e-06 7990 7990 1.00000000000000e+00 7991 7991 1.00000000000000e+00 7992 7992 1.00000000000000e+00 7993 7993 1.00000000000000e+00 7994 7994 1.00000000000000e+00 7995 7995 1.00000000000000e+00 7996 7996 1.00000000000000e+00 7997 7997 1.00000000000000e+00 7998 7998 1.00000000000000e+00 7999 7999 1.00000000000000e+00 8000 8000 1.00000000000000e+00 8001 8001 1.00000000000000e+00 8002 8002 1.00000000000000e+00 8003 8003 1.00000000000000e+00 8004 8004 1.00000000000000e+00 8005 8005 1.00000000000000e+00 8006 8006 1.00000000000000e+00 8007 8007 1.00000000000000e+00 8008 8008 1.00000000000000e+00 8009 8009 1.00000000000000e+00 8010 8010 1.00000000000000e+00 8011 8011 1.00000000000000e+00 8012 8012 1.00000000000000e+00 8013 8013 1.43612580844073e+01 8013 5589 4.40000000000000e-19 8013 6165 9.75132400737221e-06 8013 6189 1.44147466930781e-04 8013 6213 6.20724038309009e-04 8013 6237 6.03166389497405e-05 8013 6261 5.23284682600000e-11 8013 6285 2.42173700000000e-14 8013 6741 2.46575223213160e-07 8013 6765 4.53171246542365e-03 8013 6789 1.32107227727700e-01 8013 6813 2.67067283445570e-01 8013 6837 9.81329879921941e-02 8013 6861 4.96671538245732e-03 8013 6885 2.57973066677049e-06 8013 7341 1.93604114647191e-04 8013 7365 1.04668459507657e-01 8013 7389 2.28425795486038e+00 8013 7413 5.50028633803761e+00 8013 7437 2.15224436646039e+00 8013 7461 1.09060475920185e-01 8013 7485 7.84963079505842e-05 8013 7941 2.31229553062051e-04 8013 7965 3.25771669079228e-01 8013 7989 5.58574866139341e+00 8013 8037 5.23127818559839e+00 8013 8061 2.70682180385706e-01 8013 8085 4.91919438839997e-04 8013 8541 1.53185448900637e-04 8013 8565 1.30017308321319e-01 8013 8589 2.31426725984315e+00 8013 8613 5.42353049705159e+00 8013 8637 2.25961989461760e+00 8013 8661 8.59626371374448e-02 8013 8685 1.17724328222053e-04 8013 9141 1.78071334005418e-05 8013 9165 3.14962360091572e-03 8013 9189 1.12349617391641e-01 8013 9213 3.12738875079109e-01 8013 9237 1.06238221895660e-01 8013 9261 5.24590795012684e-03 8013 9765 1.82413221143829e-06 8013 9789 1.09163930156516e-04 8013 9813 1.66440736458122e-04 8013 9837 2.62739118781417e-04 8013 9861 7.46695746236228e-06 8013 18336 -1.32206470670000e-10 8013 18360 -7.06933854300000e-10 8013 18384 -8.44638357170000e-10 8013 18408 -1.78107971630000e-10 8013 18696 -1.54264278491790e-07 8013 18720 -1.67656038496173e-03 8013 18744 -2.01656095848383e-02 8013 18768 -6.10846835017330e-02 8013 18792 -3.57113108533596e-02 8013 18816 -5.56833331860731e-03 8013 18840 -1.58029534922601e-06 8013 19104 -1.73381330431109e-03 8013 19128 -8.66559427129917e-02 8013 19152 -6.02940997111866e-01 8013 19176 -1.32965709172447e+00 8013 19200 -7.66829074925672e-01 8013 19224 -1.28438112447599e-01 8013 19248 -1.94985337928621e-03 8013 19512 -8.89962435477872e-03 8013 19536 -4.52565793524378e-01 8013 19560 -2.98627124706641e+00 8013 19584 -6.23407982509963e+00 8013 19608 -3.64136977461597e+00 8013 19632 -6.40927707820468e-01 8013 19656 -1.54562329970989e-02 8013 19920 -9.62297346308573e-03 8013 19944 -6.31129289373409e-01 8013 19968 -4.23415220768884e+00 8013 19992 -8.86448444529013e+00 8013 20016 -5.31142189658321e+00 8013 20040 -9.90842359720009e-01 8013 20064 -3.37284796292226e-02 8013 20328 -2.05883233787831e-03 8013 20352 -2.38646796391965e-01 8013 20376 -1.69477015015130e+00 8013 20400 -3.64519484217998e+00 8013 20424 -2.10508368685634e+00 8013 20448 -3.78249300822858e-01 8013 20472 -1.19319310724472e-02 8013 20736 -2.30368090416413e-05 8013 20760 -2.79573555867760e-02 8013 20784 -2.12494015931439e-01 8013 20808 -4.69701797998803e-01 8013 20832 -2.53257024583943e-01 8013 20856 -4.20474139306097e-02 8013 20880 -1.06285179056370e-03 8013 21168 -2.84870293465062e-04 8013 21192 -2.14648723749300e-03 8013 21216 -4.35560139697698e-03 8013 21240 -1.17783345955637e-03 8013 21264 -4.27068489809045e-05 8014 8014 1.00000000000000e+00 8015 8015 1.00000000000000e+00 8016 8016 1.00000000000000e+00 8017 8017 1.00000000000000e+00 8018 8018 1.00000000000000e+00 8019 8019 1.00000000000000e+00 8020 8020 1.00000000000000e+00 8021 8021 1.00000000000000e+00 8022 8022 1.00000000000000e+00 8023 8023 1.00000000000000e+00 8024 8024 1.00000000000000e+00 8025 8025 1.00000000000000e+00 8026 8026 1.00000000000000e+00 8027 8027 1.00000000000000e+00 8028 8028 1.00000000000000e+00 8029 8029 1.00000000000000e+00 8030 8030 1.00000000000000e+00 8031 8031 1.00000000000000e+00 8032 8032 1.00000000000000e+00 8033 8033 1.00000000000000e+00 8034 8034 1.00000000000000e+00 8035 8035 1.00000000000000e+00 8036 8036 1.00000000000000e+00 8037 8037 1.38340505320785e+01 8037 6189 1.29078208718035e-05 8037 6213 1.20323550370870e-04 8037 6237 1.79724268891034e-04 8037 6261 1.52487309262468e-04 8037 6285 2.21431704970470e-07 8037 6765 1.74930753381088e-06 8037 6789 2.66749886865825e-03 8037 6813 1.09523577382538e-01 8037 6837 2.80952884632940e-01 8037 6861 9.01462639339668e-02 8037 6885 3.29078610576365e-03 8037 6909 6.71275600306681e-06 8037 7365 9.19256200499704e-05 8037 7389 1.04894232584914e-01 8037 7413 2.14309867129194e+00 8037 7437 5.14992565412800e+00 8037 7461 2.03413071720506e+00 8037 7485 1.11890756819090e-01 8037 7509 1.26060474670818e-04 8037 7965 1.52045374293927e-04 8037 7989 2.94052596094360e-01 8037 8013 5.23127818559839e+00 8037 8061 5.17540769465823e+00 8037 8085 2.40930019848203e-01 8037 8109 5.57366312412017e-04 8037 8565 2.64738694593928e-04 8037 8589 1.03986644421701e-01 8037 8613 2.25780169589540e+00 8037 8637 5.17797855006944e+00 8037 8661 2.09507042579204e+00 8037 8685 9.57663978761793e-02 8037 8709 5.24284476533347e-05 8037 9165 6.98380998805087e-06 8037 9189 5.78011380667533e-03 8037 9213 9.21548851110089e-02 8037 9237 2.74627686916336e-01 8037 9261 1.09974090606849e-01 8037 9285 4.96537002526934e-03 8037 9309 2.12450364950000e-10 8037 9813 1.31358384121013e-04 8037 9837 5.56133606008056e-04 8037 9861 7.72839565029905e-05 8037 9885 2.33286633743804e-06 8037 9909 8.10624600000000e-14 8037 18336 -1.27615079143266e-05 8037 18360 -1.49333307771915e-03 8037 18384 -6.99137529405206e-03 8037 18408 -6.28028490483819e-03 8037 18432 -1.21000740674983e-03 8037 18456 -1.35451214863840e-07 8037 18720 -1.91124497901616e-04 8037 18744 -2.18011093323540e-02 8037 18768 -1.98152836711839e-01 8037 18792 -5.44017519973793e-01 8037 18816 -3.86242857738427e-01 8037 18840 -7.39127451110992e-02 8037 18864 -1.54822597046121e-03 8037 19128 -1.59366967251027e-03 8037 19152 -1.78671550878463e-01 8037 19176 -1.48988839847490e+00 8037 19200 -3.84397367768761e+00 8037 19224 -2.71989718090500e+00 8037 19248 -5.54442084415405e-01 8037 19272 -1.97985618629702e-02 8037 19296 -5.56057466610000e-10 8037 19536 -3.53912977336368e-03 8037 19560 -4.23340971250763e-01 8037 19584 -3.39171852619205e+00 8037 19608 -8.46920094647185e+00 8037 19632 -6.03043027825396e+00 8037 19656 -1.30220261752320e+00 8037 19680 -6.19881299017586e-02 8037 19704 -3.01603641067000e-09 8037 19944 -9.54445888291204e-04 8037 19968 -2.32535662013764e-01 8037 19992 -2.01599738264807e+00 8037 20016 -5.25957862952259e+00 8037 20040 -3.65852053446204e+00 8037 20064 -7.80770559015173e-01 8037 20088 -3.76488888679956e-02 8037 20112 -3.72328364354000e-09 8037 20352 -3.13185518468501e-05 8037 20376 -3.91570541987395e-02 8037 20400 -3.72818880152232e-01 8037 20424 -1.01643732635631e+00 8037 20448 -6.65735053161066e-01 8037 20472 -1.34841749520500e-01 8037 20496 -6.01949539313841e-03 8037 20520 -7.91806544230000e-10 8037 20784 -1.05007272993042e-03 8037 20808 -1.29970123836126e-02 8037 20832 -3.85963268737243e-02 8037 20856 -1.82366467804065e-02 8037 20880 -2.36917694260551e-03 8037 20904 -2.45216359375918e-06 8038 8038 1.00000000000000e+00 8039 8039 1.00000000000000e+00 8040 8040 1.00000000000000e+00 8041 8041 1.00000000000000e+00 8042 8042 1.00000000000000e+00 8043 8043 1.00000000000000e+00 8044 8044 1.00000000000000e+00 8045 8045 1.00000000000000e+00 8046 8046 1.00000000000000e+00 8047 8047 1.00000000000000e+00 8048 8048 1.00000000000000e+00 8049 8049 1.00000000000000e+00 8050 8050 1.00000000000000e+00 8051 8051 1.00000000000000e+00 8052 8052 1.00000000000000e+00 8053 8053 1.00000000000000e+00 8054 8054 1.00000000000000e+00 8055 8055 1.00000000000000e+00 8056 8056 1.00000000000000e+00 8057 8057 1.00000000000000e+00 8058 8058 1.00000000000000e+00 8059 8059 1.00000000000000e+00 8060 8060 1.00000000000000e+00 8061 8061 1.32034534890934e+01 8061 6213 1.40034993139733e-06 8061 6237 2.84168131865531e-04 8061 6261 3.78755041462749e-04 8061 6285 2.44191106880425e-05 8061 6309 1.29402964269485e-06 8061 6789 1.93816942058855e-06 8061 6813 2.99554152661755e-03 8061 6837 1.02519668862700e-01 8061 6861 2.47676792294817e-01 8061 6885 1.05200073412954e-01 8061 6909 3.20501286228353e-03 8061 6933 1.15867545268999e-06 8061 6957 2.39720000000000e-16 8061 7389 3.99813715338226e-05 8061 7413 1.06063705484242e-01 8061 7437 2.02653932949459e+00 8061 7461 5.12142788929226e+00 8061 7485 1.94392165227317e+00 8061 7509 1.04203715562112e-01 8061 7533 1.99496121906756e-04 8061 7557 6.70440000000000e-16 8061 7989 2.80445054406429e-04 8061 8013 2.70682180385706e-01 8061 8037 5.17540769465823e+00 8061 8085 5.09616803122627e+00 8061 8109 2.35758953438192e-01 8061 8133 4.29967431666151e-04 8061 8589 3.16588033027824e-04 8061 8613 9.94207410797834e-02 8061 8637 2.08683207293719e+00 8061 8661 5.17337010637295e+00 8061 8685 2.02226749522321e+00 8061 8709 9.95804102733936e-02 8061 8733 2.44191106880423e-05 8061 9189 5.17030619608300e-07 8061 9213 4.38303943466957e-03 8061 9237 1.07044420043825e-01 8061 9261 2.51306149652820e-01 8061 9285 1.01104182244151e-01 8061 9309 4.89545672319202e-03 8061 9333 2.21431704970470e-07 8061 9813 9.53315919924630e-07 8061 9837 1.59114016612106e-05 8061 9861 3.83618832664601e-04 8061 9885 2.24058402351051e-04 8061 9909 1.45607376990160e-07 8061 9933 2.42173700000000e-14 8061 10485 1.27120000000000e-16 8061 10509 8.29700000000000e-17 8061 17976 -2.21422910102273e-05 8061 18000 -1.47971231592430e-04 8061 18024 -2.59752650159810e-04 8061 18048 -5.94104233255147e-05 8061 18072 -2.08894349837000e-09 8061 18336 -3.09439465411294e-06 8061 18360 -3.48186344649793e-03 8061 18384 -4.94282254897321e-02 8061 18408 -1.75776519637661e-01 8061 18432 -1.56910533252355e-01 8061 18456 -3.36791333816442e-02 8061 18480 -8.90212526518275e-04 8061 18744 -2.02821011824119e-04 8061 18768 -6.23061972031627e-02 8061 18792 -6.59599075902192e-01 8061 18816 -2.04795403555765e+00 8061 18840 -1.76536172072492e+00 8061 18864 -4.15890163972254e-01 8061 18888 -2.07758257319011e-02 8061 18912 -3.90152634118480e-07 8061 19152 -7.98683687606945e-04 8061 19176 -2.35972834052831e-01 8061 19200 -2.30931516770857e+00 8061 19224 -6.82542888510078e+00 8061 19248 -5.79840393114079e+00 8061 19272 -1.43848699559361e+00 8061 19296 -8.88788763992173e-02 8061 19320 -4.19657041456259e-06 8061 19560 -3.25705673696318e-04 8061 19584 -2.06892058201995e-01 8061 19608 -2.14744083978136e+00 8061 19632 -6.53788922342877e+00 8061 19656 -5.55216590365650e+00 8061 19680 -1.41063348630125e+00 8061 19704 -9.43825694898244e-02 8061 19728 -1.09340842857508e-05 8061 19968 -3.38155601221626e-05 8061 19992 -4.94140797644586e-02 8061 20016 -5.74376861200484e-01 8061 20040 -1.83374722468626e+00 8061 20064 -1.50118703445927e+00 8061 20088 -3.62480097222255e-01 8061 20112 -2.17405842911069e-02 8061 20136 -2.63632843519922e-06 8061 20400 -2.61242579381709e-03 8061 20424 -4.08970490628936e-02 8061 20448 -1.43215743617082e-01 8061 20472 -1.06356067585762e-01 8061 20496 -2.14258727932303e-02 8061 20520 -6.52984975638916e-04 8061 20544 -9.21392776400000e-11 8061 20808 -7.74689897242040e-07 8061 20832 -2.09075466857389e-05 8061 20856 -7.26598831971718e-05 8061 20880 -2.04089667481573e-05 8061 20904 -6.50044912846620e-07 8062 8062 1.00000000000000e+00 8063 8063 1.00000000000000e+00 8064 8064 1.00000000000000e+00 8065 8065 1.00000000000000e+00 8066 8066 1.00000000000000e+00 8067 8067 1.00000000000000e+00 8068 8068 1.00000000000000e+00 8069 8069 1.00000000000000e+00 8070 8070 1.00000000000000e+00 8071 8071 1.00000000000000e+00 8072 8072 1.00000000000000e+00 8073 8073 1.00000000000000e+00 8074 8074 1.00000000000000e+00 8075 8075 1.00000000000000e+00 8076 8076 1.00000000000000e+00 8077 8077 1.00000000000000e+00 8078 8078 1.00000000000000e+00 8079 8079 1.00000000000000e+00 8080 8080 1.00000000000000e+00 8081 8081 1.00000000000000e+00 8082 8082 1.00000000000000e+00 8083 8083 1.00000000000000e+00 8084 8084 1.00000000000000e+00 8085 8085 1.30625624573197e+01 8085 6237 1.36098486988969e-06 8085 6261 7.05197533765978e-05 8085 6285 4.29967431666138e-04 8085 6309 9.44854427778995e-05 8085 6813 8.44175032531240e-07 8085 6837 3.45602568546582e-03 8085 6861 1.07567458814668e-01 8085 6885 2.43852730636460e-01 8085 6909 8.43200148895841e-02 8085 6933 5.55556324055003e-03 8085 6957 1.15867545269001e-06 8085 7413 1.58758229703411e-05 8085 7437 1.08772846312633e-01 8085 7461 1.94522732471998e+00 8085 7485 4.95787514450112e+00 8085 7509 2.02259967515333e+00 8085 7533 9.42274113557110e-02 8085 7557 2.09858096953744e-04 8085 8013 4.91919438839997e-04 8085 8037 2.40930019848203e-01 8085 8061 5.09616803122627e+00 8085 8109 4.96244048857834e+00 8085 8133 2.43852730636461e-01 8085 8157 3.17936008973022e-04 8085 8613 2.33697018029737e-04 8085 8637 1.06392574754094e-01 8085 8661 2.02145129931115e+00 8085 8685 4.97708104918744e+00 8085 8709 2.00834264652634e+00 8085 8733 1.05200073412954e-01 8085 8757 1.66984562117836e-05 8085 9213 2.33359908483919e-06 8085 9237 3.05267476070694e-03 8085 9261 9.29174454274852e-02 8085 9285 2.78473549213862e-01 8085 9309 9.78293108358420e-02 8085 9333 3.29078610576367e-03 8085 9357 1.59094207830698e-06 8085 9837 7.94031900597680e-07 8085 9861 1.21338636937128e-04 8085 9885 2.33536006397612e-04 8085 9909 2.12636592359758e-04 8085 9933 2.57973066677049e-06 8085 10485 8.37030000000000e-16 8085 10509 5.46280000000000e-16 8085 17976 -1.27258756124397e-04 8085 18000 -7.04436337218156e-03 8085 18024 -3.60917035854068e-02 8085 18048 -4.61905750663567e-02 8085 18072 -1.12740152964935e-02 8085 18096 -3.62720964486756e-04 8085 18360 -1.69496349620297e-05 8085 18384 -1.84595574985236e-02 8085 18408 -2.53821298188303e-01 8085 18432 -9.41744134857352e-01 8085 18456 -1.00780222794443e+00 8085 18480 -2.74213120676928e-01 8085 18504 -1.79537556714427e-02 8085 18528 -3.35135530715790e-07 8085 18768 -8.00448419937289e-05 8085 18792 -1.05165732007159e-01 8085 18816 -1.32125388491843e+00 8085 18840 -4.66386840320000e+00 8085 18864 -4.81535243342520e+00 8085 18888 -1.37644441535070e+00 8085 18912 -1.06320221811237e-01 8085 18936 -4.61869584146412e-05 8085 19176 -6.59348435444695e-05 8085 19200 -1.55713479595500e-01 8085 19224 -1.96287925132751e+00 8085 19248 -6.90984690437402e+00 8085 19272 -7.08479211929123e+00 8085 19296 -2.12020356069701e+00 8085 19320 -1.83173325846021e-01 8085 19344 -1.88632296335786e-04 8085 19584 -1.22463021456099e-05 8085 19608 -5.25159046809861e-02 8085 19632 -7.75414771434271e-01 8085 19656 -2.88002145247028e+00 8085 19680 -2.89436506660368e+00 8085 19704 -8.34174209426217e-01 8085 19728 -6.74916128452636e-02 8085 19752 -8.04923988436100e-05 8085 20016 -4.85672977793047e-03 8085 20040 -9.46399802028857e-02 8085 20064 -3.76017434900473e-01 8085 20088 -3.63297660228324e-01 8085 20112 -9.77203966759727e-02 8085 20136 -6.88640208816373e-03 8085 20160 -8.91149563795798e-06 8085 20424 -9.82651904440218e-06 8085 20448 -9.85286141680809e-04 8085 20472 -4.15438031221905e-03 8085 20496 -2.38851479682786e-03 8085 20520 -3.60635957870881e-04 8085 20544 -6.06677257560000e-10 8086 8086 1.00000000000000e+00 8087 8087 1.00000000000000e+00 8088 8088 1.00000000000000e+00 8089 8089 1.00000000000000e+00 8090 8090 1.00000000000000e+00 8091 8091 1.00000000000000e+00 8092 8092 1.00000000000000e+00 8093 8093 1.00000000000000e+00 8094 8094 1.00000000000000e+00 8095 8095 1.00000000000000e+00 8096 8096 1.00000000000000e+00 8097 8097 1.00000000000000e+00 8098 8098 1.00000000000000e+00 8099 8099 1.00000000000000e+00 8100 8100 1.00000000000000e+00 8101 8101 1.00000000000000e+00 8102 8102 1.00000000000000e+00 8103 8103 1.00000000000000e+00 8104 8104 1.00000000000000e+00 8105 8105 1.00000000000000e+00 8106 8106 1.00000000000000e+00 8107 8107 1.00000000000000e+00 8108 8108 1.00000000000000e+00 8109 8109 1.30555747118988e+01 8109 6237 3.51291980000000e-13 8109 6261 7.26515781837230e-07 8109 6285 1.99496121906747e-04 8109 6309 2.30005939103817e-04 8109 6333 1.14629817987542e-04 8109 6357 3.53353347430290e-07 8109 6837 9.31527367732900e-08 8109 6861 4.46279463381609e-03 8109 6885 9.42274113557096e-02 8109 6909 2.72468734328648e-01 8109 6933 8.43200148895844e-02 8109 6957 3.20501286228349e-03 8109 6981 6.71275600306666e-06 8109 7437 3.31206932007268e-05 8109 7461 9.82611695325464e-02 8109 7485 2.01810107737038e+00 8109 7509 4.82079811148057e+00 8109 7533 2.01810107737035e+00 8109 7557 9.76298792981412e-02 8109 7581 2.09551952060577e-04 8109 7605 2.84600000000000e-17 8109 8037 5.57366312412017e-04 8109 8061 2.35758953438192e-01 8109 8085 4.96244048857834e+00 8109 8133 4.95787514450109e+00 8109 8157 2.55684893376085e-01 8109 8181 2.49408950444568e-04 8109 8205 1.87940000000000e-16 8109 8637 1.06435412031522e-04 8109 8661 1.04108481663570e-01 8109 8685 2.01957827044317e+00 8109 8709 4.98296884704714e+00 8109 8733 1.94392165227317e+00 8109 8757 1.05587349081564e-01 8109 8781 6.59455841648092e-05 8109 9237 1.37306196538332e-06 8109 9261 5.38660454727596e-03 8109 9285 8.52217717988987e-02 8109 9309 2.51563538065893e-01 8109 9333 1.11890756819087e-01 8109 9357 2.37454150425827e-03 8109 9381 1.89681802581382e-06 8109 9885 1.15050029531140e-04 8109 9909 3.84182544807878e-04 8109 9933 7.84963079505847e-05 8109 9957 6.86885643072803e-06 8109 17616 -3.45218003082492e-04 8109 17640 -3.03185917096303e-03 8109 17664 -7.05238029109572e-03 8109 17688 -2.06384177255703e-03 8109 17712 -1.03213653480994e-04 8109 17976 -2.55683926896930e-07 8109 18000 -4.14430081245728e-03 8109 18024 -8.08640652260128e-02 8109 18048 -3.62722235630272e-01 8109 18072 -4.82708299194579e-01 8109 18096 -1.52427932049993e-01 8109 18120 -1.27531411453205e-02 8109 18144 -5.34096308434300e-08 8109 18384 -1.64776284888537e-06 8109 18408 -3.79318522441511e-02 8109 18432 -6.46991543310090e-01 8109 18456 -2.72455878059637e+00 8109 18480 -3.42674317775812e+00 8109 18504 -1.14383406827340e+00 8109 18528 -1.10295881093752e-01 8109 18552 -1.88504826688790e-04 8109 18792 -2.75579249208747e-06 8109 18816 -9.59262161090063e-02 8109 18840 -1.53990166618202e+00 8109 18864 -6.27649976772474e+00 8109 18888 -7.65930322967342e+00 8109 18912 -2.67868645090644e+00 8109 18936 -2.84162572146217e-01 8109 18960 -9.06390528705483e-04 8109 19200 -6.25027141297630e-07 8109 19224 -4.68504653711728e-02 8109 19248 -9.17064794435832e-01 8109 19272 -3.94652603057978e+00 8109 19296 -4.82545053729418e+00 8109 19320 -1.66908141813578e+00 8109 19344 -1.75026824014732e-01 8109 19368 -8.00980653817322e-04 8109 19632 -6.53347571849009e-03 8109 19656 -1.69941020545758e-01 8109 19680 -7.69802226468793e-01 8109 19704 -9.24693753917565e-01 8109 19728 -3.03095516402847e-01 8109 19752 -2.93382054589833e-02 8109 19776 -1.53172366412976e-04 8109 20040 -4.25390998073090e-05 8109 20064 -6.09418934663195e-03 8109 20088 -3.01220400623416e-02 8109 20112 -3.16680109148224e-02 8109 20136 -7.22537427582635e-03 8109 20160 -2.10501275725715e-04 8110 8110 1.00000000000000e+00 8111 8111 1.00000000000000e+00 8112 8112 1.00000000000000e+00 8113 8113 1.00000000000000e+00 8114 8114 1.00000000000000e+00 8115 8115 1.00000000000000e+00 8116 8116 1.00000000000000e+00 8117 8117 1.00000000000000e+00 8118 8118 1.00000000000000e+00 8119 8119 1.00000000000000e+00 8120 8120 1.00000000000000e+00 8121 8121 1.00000000000000e+00 8122 8122 1.00000000000000e+00 8123 8123 1.00000000000000e+00 8124 8124 1.00000000000000e+00 8125 8125 1.00000000000000e+00 8126 8126 1.00000000000000e+00 8127 8127 1.00000000000000e+00 8128 8128 1.00000000000000e+00 8129 8129 1.00000000000000e+00 8130 8130 1.00000000000000e+00 8131 8131 1.00000000000000e+00 8132 8132 1.00000000000000e+00 8133 8133 1.30625624573199e+01 8133 6285 1.15867545269000e-06 8133 6309 2.09858096953743e-04 8133 6333 3.17936008973020e-04 8133 6357 1.66984562117843e-05 8133 6381 1.59094207830707e-06 8133 6885 5.55556324055004e-03 8133 6909 9.42274113557098e-02 8133 6933 2.43852730636458e-01 8133 6957 1.05200073412952e-01 8133 6981 3.29078610576361e-03 8133 7005 2.57973066677058e-06 8133 7461 9.44854427779038e-05 8133 7485 8.43200148895854e-02 8133 7509 2.02259967515330e+00 8133 7533 4.96244048857833e+00 8133 7557 2.00834264652635e+00 8133 7581 9.78293108358406e-02 8133 7605 2.12636592359755e-04 8133 7629 5.46280000000000e-16 8133 8061 4.29967431666151e-04 8133 8085 2.43852730636461e-01 8133 8109 4.95787514450109e+00 8133 8157 4.97708104918752e+00 8133 8181 2.78473549213862e-01 8133 8205 2.33536006397610e-04 8133 8229 8.37030000000000e-16 8133 8661 7.05197533765968e-05 8133 8685 1.07567458814668e-01 8133 8709 1.94522732471998e+00 8133 8733 5.09616803122634e+00 8133 8757 2.02145129931117e+00 8133 8781 9.29174454274854e-02 8133 8805 1.21338636937128e-04 8133 9261 1.36098486988975e-06 8133 9285 3.45602568546580e-03 8133 9309 1.08772846312618e-01 8133 9333 2.40930019848202e-01 8133 9357 1.06392574754095e-01 8133 9381 3.05267476070691e-03 8133 9405 7.94031900597670e-07 8133 9885 8.44175032531250e-07 8133 9909 1.58758229703412e-05 8133 9933 4.91919438840013e-04 8133 9957 2.33697018029744e-04 8133 9981 2.33359908483914e-06 8133 17232 -3.35135530715780e-07 8133 17256 -4.61869584146437e-05 8133 17280 -1.88632296335796e-04 8133 17304 -8.04923988436137e-05 8133 17328 -8.91149563795828e-06 8133 17616 -3.62720964486753e-04 8133 17640 -1.79537556714427e-02 8133 17664 -1.06320221811236e-01 8133 17688 -1.83173325846016e-01 8133 17712 -6.74916128452622e-02 8133 17736 -6.88640208816362e-03 8133 17760 -6.06677257560000e-10 8133 18024 -1.12740152964935e-02 8133 18048 -2.74213120676923e-01 8133 18072 -1.37644441535069e+00 8133 18096 -2.12020356069702e+00 8133 18120 -8.34174209426221e-01 8133 18144 -9.77203966759724e-02 8133 18168 -3.60635957870881e-04 8133 18432 -4.61905750663570e-02 8133 18456 -1.00780222794441e+00 8133 18480 -4.81535243342516e+00 8133 18504 -7.08479211929137e+00 8133 18528 -2.89436506660373e+00 8133 18552 -3.63297660228326e-01 8133 18576 -2.38851479682785e-03 8133 18840 -3.60917035854080e-02 8133 18864 -9.41744134857346e-01 8133 18888 -4.66386840319999e+00 8133 18912 -6.90984690437414e+00 8133 18936 -2.88002145247032e+00 8133 18960 -3.76017434900476e-01 8133 18984 -4.15438031221900e-03 8133 19248 -7.04436337218187e-03 8133 19272 -2.53821298188303e-01 8133 19296 -1.32125388491843e+00 8133 19320 -1.96287925132751e+00 8133 19344 -7.75414771434278e-01 8133 19368 -9.46399802028869e-02 8133 19392 -9.85286141680794e-04 8133 19656 -1.27258756124394e-04 8133 19680 -1.84595574985236e-02 8133 19704 -1.05165732007158e-01 8133 19728 -1.55713479595496e-01 8133 19752 -5.25159046809857e-02 8133 19776 -4.85672977793062e-03 8133 19800 -9.82651904440193e-06 8133 20088 -1.69496349620305e-05 8133 20112 -8.00448419937318e-05 8133 20136 -6.59348435444703e-05 8133 20160 -1.22463021456100e-05 8134 8134 1.00000000000000e+00 8135 8135 1.00000000000000e+00 8136 8136 1.00000000000000e+00 8137 8137 1.00000000000000e+00 8138 8138 1.00000000000000e+00 8139 8139 1.00000000000000e+00 8140 8140 1.00000000000000e+00 8141 8141 1.00000000000000e+00 8142 8142 1.00000000000000e+00 8143 8143 1.00000000000000e+00 8144 8144 1.00000000000000e+00 8145 8145 1.00000000000000e+00 8146 8146 1.00000000000000e+00 8147 8147 1.00000000000000e+00 8148 8148 1.00000000000000e+00 8149 8149 1.00000000000000e+00 8150 8150 1.00000000000000e+00 8151 8151 1.00000000000000e+00 8152 8152 1.00000000000000e+00 8153 8153 1.00000000000000e+00 8154 8154 1.00000000000000e+00 8155 8155 1.00000000000000e+00 8156 8156 1.00000000000000e+00 8157 8157 1.35061797798595e+01 8157 6309 5.76185385784561e-06 8157 6333 8.99998833830992e-05 8157 6357 5.56335941560844e-04 8157 6381 7.84494215473683e-05 8157 6909 4.46279463381606e-03 8157 6933 1.07567458814667e-01 8157 6957 2.47676792294816e-01 8157 6981 9.01462639339692e-02 8157 7005 4.96671538245737e-03 8157 7029 5.31858846635926e-06 8157 7485 1.14629817987543e-04 8157 7509 8.32621938773911e-02 8157 7533 2.01957827044318e+00 8157 7557 5.01207283480075e+00 8157 7581 2.12534457488613e+00 8157 7605 1.03347535291059e-01 8157 7629 1.78814708764562e-04 8157 8085 3.17936008973022e-04 8157 8109 2.55684893376085e-01 8157 8133 4.97708104918752e+00 8157 8181 5.01444778180917e+00 8157 8205 2.86213876935508e-01 8157 8229 2.93336389137444e-04 8157 8685 8.99998833830966e-05 8157 8709 1.10241595057534e-01 8157 8733 2.02226749522323e+00 8157 8757 5.03563186199643e+00 8157 8781 2.15151970522629e+00 8157 8805 8.98139243420841e-02 8157 8829 1.28308173330614e-04 8157 9285 1.21535498385407e-05 8157 9309 2.64740635360718e-03 8157 9333 9.57663978761802e-02 8157 9357 2.80488210935191e-01 8157 9381 1.04998272549908e-01 8157 9405 4.01865511835702e-03 8157 9429 8.53127317558100e-08 8157 9909 7.87821774847120e-07 8157 9933 1.17724328222056e-04 8157 9957 1.38422994045989e-04 8157 9981 1.80679317919328e-04 8157 10005 1.30211113888141e-05 8157 17232 -6.46536115564740e-07 8157 17256 -1.86222575103144e-03 8157 17280 -1.82588596240225e-02 8157 17304 -4.78374423681407e-02 8157 17328 -2.16163911218320e-02 8157 17352 -2.69918411505044e-03 8157 17640 -2.89134898941351e-03 8157 17664 -9.93778601986976e-02 8157 17688 -6.00080589743577e-01 8157 17712 -1.14368139928723e+00 8157 17736 -5.34791752860124e-01 8157 17760 -7.37384779871936e-02 8157 17784 -4.06769525242680e-04 8157 18048 -1.65572343303866e-02 8157 18072 -5.46152839053609e-01 8157 18096 -3.12316738344963e+00 8157 18120 -5.60361692656968e+00 8157 18144 -2.69588979393636e+00 8157 18168 -3.95378165876492e-01 8157 18192 -4.83582745070654e-03 8157 18456 -2.31392107675323e-02 8157 18480 -8.36607401537243e-01 8157 18504 -4.76234705419666e+00 8157 18528 -8.39721704320002e+00 8157 18552 -4.18131636633928e+00 8157 18576 -6.56082329760212e-01 8157 18600 -1.37345708174825e-02 8157 18864 -5.97874547333361e-03 8157 18888 -3.30604382240397e-01 8157 18912 -1.99343558131646e+00 8157 18936 -3.58766882084476e+00 8157 18960 -1.71860913009062e+00 8157 18984 -2.58902342369894e-01 8157 19008 -5.17996492292182e-03 8157 19272 -2.44302264716895e-04 8157 19296 -4.04287971817133e-02 8157 19320 -2.60977235824414e-01 8157 19344 -4.78760119398739e-01 8157 19368 -2.13828212972157e-01 8157 19392 -2.95734225758226e-02 8157 19416 -4.92803893296500e-04 8157 19704 -5.12372734049634e-04 8157 19728 -3.14675205445585e-03 8157 19752 -4.92164144620360e-03 8157 19776 -1.17815807475612e-03 8157 19800 -2.02242391247017e-05 8158 8158 1.00000000000000e+00 8159 8159 1.00000000000000e+00 8160 8160 1.00000000000000e+00 8161 8161 1.00000000000000e+00 8162 8162 1.00000000000000e+00 8163 8163 1.00000000000000e+00 8164 8164 1.00000000000000e+00 8165 8165 1.00000000000000e+00 8166 8166 1.00000000000000e+00 8167 8167 1.00000000000000e+00 8168 8168 1.00000000000000e+00 8169 8169 1.00000000000000e+00 8170 8170 1.00000000000000e+00 8171 8171 1.00000000000000e+00 8172 8172 1.00000000000000e+00 8173 8173 1.00000000000000e+00 8174 8174 1.00000000000000e+00 8175 8175 1.00000000000000e+00 8176 8176 1.00000000000000e+00 8177 8177 1.00000000000000e+00 8178 8178 1.00000000000000e+00 8179 8179 1.00000000000000e+00 8180 8180 1.00000000000000e+00 8181 8181 1.39656075658925e+01 8181 6333 1.21535498385414e-05 8181 6357 1.62005155421065e-04 8181 6381 1.40080260134692e-04 8181 6405 1.25135402336312e-04 8181 6429 7.22147823010730e-07 8181 6909 9.31527367732900e-08 8181 6933 3.45602568546578e-03 8181 6957 1.02519668862684e-01 8181 6981 2.80952884632903e-01 8181 7005 9.81329879921907e-02 8181 7029 3.00569983360125e-03 8181 7053 1.40334369341952e-05 8181 7509 1.11059283569015e-04 8181 7533 8.52217717988976e-02 8181 7557 2.12226312376188e+00 8181 7581 5.12682007264041e+00 8181 7605 2.13949290794892e+00 8181 7629 1.24287728839433e-01 8181 7653 1.17189641502778e-04 8181 8109 2.49408950444568e-04 8181 8133 2.78473549213862e-01 8181 8157 5.01444778180917e+00 8181 8205 5.46392976673361e+00 8181 8229 2.93701725343250e-01 8181 8253 4.54537256974539e-04 8181 8709 1.76905947185155e-04 8181 8733 1.01104182244151e-01 8181 8757 2.15568720645538e+00 8181 8781 5.35035677744414e+00 8181 8805 2.31147641763538e+00 8181 8829 1.03318965213877e-01 8181 8853 1.46665177000229e-04 8181 9309 5.53908622508744e-06 8181 9333 4.96537002526930e-03 8181 9357 9.20977706503669e-02 8181 9381 2.78594960790361e-01 8181 9405 1.30553376912941e-01 8181 9429 6.21683783583451e-03 8181 9957 8.84933336397340e-05 8181 9981 6.00232747143563e-04 8181 10005 1.11714081298831e-04 8181 10029 8.25552108883452e-06 8181 16872 -2.24011129438341e-05 8181 16896 -1.31385706373235e-03 8181 16920 -5.56934197282925e-03 8181 16944 -3.82397426018653e-03 8181 16968 -6.49930412057381e-04 8181 17256 -4.48079598200343e-04 8181 17280 -2.92174748183984e-02 8181 17304 -2.18693144643847e-01 8181 17328 -5.08138615513815e-01 8181 17352 -2.95079386881867e-01 8181 17376 -4.81042644266794e-02 8181 17400 -3.92140677873937e-04 8181 17664 -4.43884181165063e-03 8181 17688 -2.51669427949046e-01 8181 17712 -1.73159753784728e+00 8181 17736 -3.75690140381855e+00 8181 17760 -2.22780410194089e+00 8181 17784 -3.90543641669712e-01 8181 17808 -8.39152786425451e-03 8181 18072 -1.13536029586749e-02 8181 18096 -6.28655875378790e-01 8181 18120 -4.15319957528692e+00 8181 18144 -8.67746750985505e+00 8181 18168 -5.27554891058860e+00 8181 18192 -9.86091564195355e-01 8181 18216 -3.18464976229816e-02 8181 18480 -3.92424215915939e-03 8181 18504 -3.73523759436999e-01 8181 18528 -2.63136498869216e+00 8181 18552 -5.69463606063287e+00 8181 18576 -3.42870701505584e+00 8181 18600 -6.46169679302478e-01 8181 18624 -2.34736856990423e-02 8181 18888 -3.19429685077532e-04 8181 18912 -6.87655032636457e-02 8181 18936 -5.14869724059548e-01 8181 18960 -1.14612630496388e+00 8181 18984 -6.49732174719316e-01 8181 19008 -1.16903644012218e-01 8181 19032 -4.16543717404555e-03 8181 19320 -2.44491993247958e-03 8181 19344 -2.03097815182611e-02 8181 19368 -4.65170820385612e-02 8181 19392 -1.83378568091775e-02 8181 19416 -1.95469579268333e-03 8181 19440 -7.35209993245760e-07 8182 8182 1.00000000000000e+00 8183 8183 1.00000000000000e+00 8184 8184 1.00000000000000e+00 8185 8185 1.00000000000000e+00 8186 8186 1.00000000000000e+00 8187 8187 1.00000000000000e+00 8188 8188 1.00000000000000e+00 8189 8189 1.00000000000000e+00 8190 8190 1.00000000000000e+00 8191 8191 1.00000000000000e+00 8192 8192 1.00000000000000e+00 8193 8193 1.00000000000000e+00 8194 8194 1.00000000000000e+00 8195 8195 1.00000000000000e+00 8196 8196 1.00000000000000e+00 8197 8197 1.00000000000000e+00 8198 8198 1.00000000000000e+00 8199 8199 1.00000000000000e+00 8200 8200 1.00000000000000e+00 8201 8201 1.00000000000000e+00 8202 8202 1.00000000000000e+00 8203 8203 1.00000000000000e+00 8204 8204 1.00000000000000e+00 8205 8205 1.52048834911817e+01 8205 6357 2.33219156354422e-06 8205 6381 2.46473168732274e-04 8205 6405 5.00161568839055e-04 8205 6429 1.87607910286075e-05 8205 6453 1.07354659163103e-06 8205 6933 8.44175032531270e-07 8205 6957 2.99554152661753e-03 8205 6981 1.09523577382529e-01 8205 7005 2.67067283445567e-01 8205 7029 1.29265031934992e-01 8205 7053 4.53064416783995e-03 8205 7077 1.89409891545966e-06 8205 7533 1.15050029531139e-04 8205 7557 9.54297444868246e-02 8205 7581 2.13680044591831e+00 8205 7605 5.76486307275885e+00 8205 7629 2.44145806955100e+00 8205 7653 1.48638855963741e-01 8205 7677 6.44276186536669e-05 8205 8109 1.87940000000000e-16 8205 8133 2.33536006397610e-04 8205 8157 2.86213876935508e-01 8205 8181 5.46392976673361e+00 8205 8229 6.54732452314670e+00 8205 8253 3.19728559420826e-01 8205 8277 4.39095393213604e-04 8205 8709 1.22830000000000e-16 8205 8733 2.24058402351051e-04 8205 8757 1.03852201314302e-01 8205 8781 2.30005723638072e+00 8205 8805 6.10174473440770e+00 8205 8829 2.54478197047026e+00 8205 8853 8.83750882412685e-02 8205 8877 1.00310287655636e-04 8205 9333 2.33286633743801e-06 8205 9357 3.81948091007359e-03 8205 9381 1.28294801162543e-01 8205 9405 3.22180068646864e-01 8205 9429 1.05567678610665e-01 8205 9453 4.48672969599103e-03 8205 9957 1.62962235055504e-06 8205 9981 1.86095276753446e-05 8205 10005 4.19351447657620e-04 8205 10029 2.11681717864973e-04 8205 10053 9.84462529829350e-07 8205 16512 -1.60601360825507e-05 8205 16536 -8.98871072744653e-05 8205 16560 -1.18646387859601e-04 8205 16584 -2.56465629442626e-05 8205 16872 -1.04073115619178e-05 8205 16896 -5.16812501595184e-03 8205 16920 -6.02435661366244e-02 8205 16944 -1.90281153849868e-01 8205 16968 -1.44830657291904e-01 8205 16992 -2.67245997549215e-02 8205 17016 -1.19661164935188e-04 8205 17280 -9.28518009400178e-04 8205 17304 -9.71852575256383e-02 8205 17328 -8.49994985456503e-01 8205 17352 -2.32104302524862e+00 8205 17376 -1.79075268972270e+00 8205 17400 -3.59609790199517e-01 8205 17424 -8.19121310477220e-03 8205 17688 -3.87791204741487e-03 8205 17712 -3.81038440365969e-01 8205 17736 -3.09628035087754e+00 8205 17760 -8.01336539963256e+00 8205 17784 -6.17588936427217e+00 8205 17808 -1.28251347224221e+00 8205 17832 -3.89639863280264e-02 8205 18096 -2.16668756254670e-03 8205 18120 -3.62324339704612e-01 8205 18144 -3.07599406256256e+00 8205 18168 -8.08169379493091e+00 8205 18192 -6.06421539807084e+00 8205 18216 -1.25135147236016e+00 8205 18240 -4.00258339285658e-02 8205 18504 -3.19949948932867e-04 8205 18528 -9.59646298107564e-02 8205 18552 -8.81184445223622e-01 8205 18576 -2.40623175819990e+00 8205 18600 -1.72365237570309e+00 8205 18624 -3.40415392059891e-01 8205 18648 -9.34229118965563e-03 8205 18912 -6.64224849700000e-11 8205 18936 -6.56477375214336e-03 8205 18960 -7.08050616192473e-02 8205 18984 -2.07628844917461e-01 8205 19008 -1.36403831570535e-01 8205 19032 -2.42284408096530e-02 8205 19056 -3.37059951672547e-04 8205 19344 -7.58338003402621e-06 8205 19368 -7.26889822415109e-05 8205 19392 -1.77369989909076e-04 8205 19416 -4.38145079191083e-05 8205 19440 -3.64761453425580e-07 8206 8206 1.00000000000000e+00 8207 8207 1.00000000000000e+00 8208 8208 1.00000000000000e+00 8209 8209 1.00000000000000e+00 8210 8210 1.00000000000000e+00 8211 8211 1.00000000000000e+00 8212 8212 1.00000000000000e+00 8213 8213 1.00000000000000e+00 8214 8214 1.00000000000000e+00 8215 8215 1.00000000000000e+00 8216 8216 1.00000000000000e+00 8217 8217 1.00000000000000e+00 8218 8218 1.00000000000000e+00 8219 8219 1.00000000000000e+00 8220 8220 1.00000000000000e+00 8221 8221 1.00000000000000e+00 8222 8222 1.00000000000000e+00 8223 8223 1.00000000000000e+00 8224 8224 1.00000000000000e+00 8225 8225 1.00000000000000e+00 8226 8226 1.00000000000000e+00 8227 8227 1.00000000000000e+00 8228 8228 1.00000000000000e+00 8229 8229 1.64581799012992e+01 8229 6381 6.72456755290754e-06 8229 6405 8.91005421407028e-05 8229 6429 4.67153324025474e-04 8229 6453 1.40199035422927e-04 8229 6957 1.93816942058851e-06 8229 6981 2.66749886865830e-03 8229 7005 1.32107227727701e-01 8229 7029 3.24085759625745e-01 8229 7053 1.03910226659848e-01 8229 7077 5.34094459172518e-03 8229 7101 1.76345157057958e-06 8229 7557 6.51738304218118e-05 8229 7581 1.19507368978339e-01 8229 7605 2.43971202276572e+00 8229 7629 6.56258203239002e+00 8229 7653 2.20243939165186e+00 8229 7677 1.18442951526063e-01 8229 7701 9.01164771458686e-06 8229 8133 8.37030000000000e-16 8229 8157 2.93336389137444e-04 8229 8181 2.93701725343250e-01 8229 8205 6.54732452314670e+00 8229 8253 6.20292311079286e+00 8229 8277 2.74020269122410e-01 8229 8301 8.85453302770000e-10 8229 8733 1.27120000000000e-16 8229 8757 2.41938520180960e-04 8229 8781 1.20361755725483e-01 8229 8805 2.52076813096791e+00 8229 8829 5.95013494598462e+00 8229 8853 3.20527510274180e+00 8229 8877 3.21160075323183e-02 8229 9357 7.38583222521840e-06 8229 9381 4.36077583164119e-03 8229 9405 9.38903743213126e-02 8229 9429 3.65589698849345e-01 8229 9453 1.26642207232518e-01 8229 9981 5.57780449472130e-07 8229 10005 1.17729495477173e-04 8229 10029 1.57546452617899e-04 8229 10053 1.24828921303145e-06 8229 16512 -2.48574860122958e-04 8229 16536 -9.44696404610493e-03 8229 16560 -3.98639657652778e-02 8229 16584 -3.21841845409034e-02 8229 16608 -6.82991249166350e-03 8229 16896 -1.51013638628266e-04 8229 16920 -3.39204386699661e-02 8229 16944 -3.96364039902625e-01 8229 16968 -1.20828029646939e+00 8229 16992 -8.00085278224110e-01 8229 17016 -2.12057904827484e-01 8229 17304 -7.78915299212628e-04 8229 17328 -1.98701968048535e-01 8229 17352 -2.16294920165838e+00 8229 17376 -6.39325921400955e+00 8229 17400 -4.42373616499349e+00 8229 17424 -1.33921351264528e+00 8229 17712 -8.50483332369737e-04 8229 17736 -3.13158933648115e-01 8229 17760 -3.40775270230962e+00 8229 17784 -1.02216097184028e+01 8229 17808 -7.85669670876051e+00 8229 17832 -2.69515405120276e+00 8229 18120 -1.74967604472399e-04 8229 18144 -1.19803551127477e-01 8229 18168 -1.41134525042509e+00 8229 18192 -4.32881999660595e+00 8229 18216 -3.15244129814920e+00 8229 18240 -1.14051294456305e+00 8229 18528 -2.67149432083500e-08 8229 18552 -1.36571193791504e-02 8229 18576 -1.82793376238335e-01 8229 18600 -5.76961529729772e-01 8229 18624 -3.74380593890018e-01 8229 18648 -1.37927352900207e-01 8229 18960 -1.04917510642632e-04 8229 18984 -2.60171715117962e-03 8229 19008 -9.14157579495108e-03 8229 19032 -3.41592650809741e-03 8229 19056 -3.08469849872081e-04 8230 8230 1.00000000000000e+00 8231 8231 1.00000000000000e+00 8232 8232 1.00000000000000e+00 8233 8233 1.00000000000000e+00 8234 8234 1.00000000000000e+00 8235 8235 1.00000000000000e+00 8236 8236 1.00000000000000e+00 8237 8237 1.00000000000000e+00 8238 8238 1.00000000000000e+00 8239 8239 1.00000000000000e+00 8240 8240 1.00000000000000e+00 8241 8241 1.00000000000000e+00 8242 8242 1.00000000000000e+00 8243 8243 1.00000000000000e+00 8244 8244 1.00000000000000e+00 8245 8245 1.00000000000000e+00 8246 8246 1.00000000000000e+00 8247 8247 1.00000000000000e+00 8248 8248 1.00000000000000e+00 8249 8249 1.00000000000000e+00 8250 8250 1.00000000000000e+00 8251 8251 1.00000000000000e+00 8252 8252 1.00000000000000e+00 8253 8253 2.55581485016710e+01 8253 5829 1.16118000000000e-15 8253 5853 1.70813000000000e-15 8253 6405 2.74962501930975e-06 8253 6429 2.62041531254356e-04 8253 6453 2.67258390988052e-04 8253 6477 1.59825900986153e-04 8253 6501 2.36590348617504e-06 8253 6981 1.74930753381089e-06 8253 7005 4.53171246542376e-03 8253 7029 1.20597050544896e-01 8253 7053 3.37952987363564e-01 8253 7077 2.50073467614373e-01 8253 7101 4.31692185634925e-03 8253 7581 1.97278770701271e-05 8253 7605 1.46585707143286e-01 8253 7629 2.14495058601447e+00 8253 7653 8.40787723111244e+00 8253 7677 5.44645677899699e+00 8253 7701 8.35456992673703e-03 8253 8181 4.54537256974539e-04 8253 8205 3.19728559420826e-01 8253 8229 6.20292311079286e+00 8253 8277 5.54000696248000e+00 8253 8301 8.87219725627910e-07 8253 8781 2.67866754088779e-04 8253 8805 1.02243790726399e-01 8253 8829 4.15240925190618e+00 8253 8853 9.26996687393122e+00 8253 8877 3.02172057297925e-01 8253 9381 1.54657054999064e-06 8253 9405 5.64636705605456e-03 8253 9429 2.69689879613938e-01 8253 9453 1.92744512039679e-01 8253 10029 1.26615946688093e-06 8253 10053 4.57242407563120e-07 8253 16128 -1.76489563238000e-09 8253 16152 -3.96784765631894e-04 8253 16176 -6.21525660309237e-03 8253 16200 -9.65306573404792e-03 8253 16512 -9.43368006238333e-06 8253 16536 -8.79520094271789e-03 8253 16560 -1.01470518843152e-01 8253 16584 -8.34970990283466e-01 8253 16608 -1.18740850620948e+00 8253 16920 -8.35721701630052e-05 8253 16944 -8.96751616157923e-02 8253 16968 -8.51279404173907e-01 8253 16992 -5.46128485173967e+00 8253 17016 -7.28706157576676e+00 8253 17328 -1.93029350231710e-04 8253 17352 -2.48937627752005e-01 8253 17376 -2.17167163998992e+00 8253 17400 -1.11982184290234e+01 8253 17424 -1.36483898526971e+01 8253 17736 -4.68209319752302e-05 8253 17760 -1.43573546139108e-01 8253 17784 -1.52603805139518e+00 8253 17808 -8.42168416152389e+00 8253 17832 -9.88947253249662e+00 8253 18144 -2.45870515439590e-07 8253 18168 -2.38431983512716e-02 8253 18192 -3.02877918444975e-01 8253 18216 -1.88437508933348e+00 8253 18240 -2.26850405724519e+00 8253 18576 -4.19575438955593e-04 8253 18600 -9.12151484469968e-03 8253 18624 -8.86963956974827e-02 8253 18648 -1.24451148894913e-01 8254 8254 1.00000000000000e+00 8255 8255 1.00000000000000e+00 8256 8256 1.00000000000000e+00 8257 8257 1.00000000000000e+00 8258 8258 1.00000000000000e+00 8259 8259 1.00000000000000e+00 8260 8260 1.00000000000000e+00 8261 8261 1.00000000000000e+00 8262 8262 1.00000000000000e+00 8263 8263 1.00000000000000e+00 8264 8264 1.00000000000000e+00 8265 8265 1.00000000000000e+00 8266 8266 1.00000000000000e+00 8267 8267 1.00000000000000e+00 8268 8268 1.00000000000000e+00 8269 8269 1.00000000000000e+00 8270 8270 1.00000000000000e+00 8271 8271 1.00000000000000e+00 8272 8272 1.00000000000000e+00 8273 8273 1.00000000000000e+00 8274 8274 1.00000000000000e+00 8275 8275 1.00000000000000e+00 8276 8276 1.00000000000000e+00 8277 8277 3.46517180999936e+00 8277 5829 1.61450000000000e-16 8277 5853 2.37500000000000e-16 8277 6405 7.79578600000000e-14 8277 6429 1.65821052232080e-07 8277 6453 2.33188526392939e-04 8277 6477 3.47698256597034e-04 8277 6501 7.67643334023922e-06 8277 7005 2.46575223213160e-07 8277 7029 4.58947816494345e-03 8277 7053 1.36090564095546e-01 8277 7077 2.74929435139304e-01 8277 7101 1.20671885798253e-02 8277 7605 2.27667645083757e-05 8277 7629 8.90814666278486e-02 8277 7653 3.62600246314926e+00 8277 7677 4.34538569436165e+00 8277 7701 1.38154135506734e-02 8277 8205 4.39095393213604e-04 8277 8229 2.74020269122410e-01 8277 8253 5.54000696248000e+00 8277 8301 8.87085011605780e-07 8277 8781 4.20640000000000e-16 8277 8805 2.13322127890798e-04 8277 8829 1.27588687451476e-01 8277 8853 7.56157576803318e-01 8277 8877 5.97228003931940e-02 8277 9381 1.50650000000000e-16 8277 9405 1.55053844990900e-08 8277 9429 2.12411346181340e-03 8277 9453 3.63532297866516e-03 8277 10029 1.51028246000000e-11 8277 10053 5.45496585000000e-12 8277 16128 -2.45391655890000e-10 8277 16152 -6.88591247467996e-04 8277 16176 -1.86238563130763e-02 8277 16200 -3.24275802740597e-02 8277 16536 -2.75079980372742e-06 8277 16560 -2.01988474371424e-02 8277 16584 -6.70418245275526e-01 8277 16608 -1.19951607928595e+00 8277 16944 -1.13997207202415e-05 8277 16968 -8.38121177760765e-02 8277 16992 -2.79768642905916e+00 8277 17016 -5.00898442642449e+00 8277 17352 -4.35062775778439e-06 8277 17376 -7.17232553767065e-02 8277 17400 -2.21730298722626e+00 8277 17424 -3.93265630313728e+00 8277 17760 -4.00202380170130e-07 8277 17784 -1.69311411195079e-02 8277 17808 -5.54951980889194e-01 8277 17832 -9.91396379203716e-01 8277 18192 -8.96387949988683e-04 8277 18216 -3.98978040899698e-02 8277 18240 -7.35208925300189e-02 8277 18600 -4.94664904690000e-10 8277 18624 -7.01874925208520e-07 8277 18648 -1.40028719608418e-06 8278 8278 1.00000000000000e+00 8279 8279 1.00000000000000e+00 8280 8280 1.00000000000000e+00 8281 8281 1.00000000000000e+00 8282 8282 1.00000000000000e+00 8283 8283 1.00000000000000e+00 8284 8284 1.00000000000000e+00 8285 8285 1.00000000000000e+00 8286 8286 1.00000000000000e+00 8287 8287 1.00000000000000e+00 8288 8288 1.00000000000000e+00 8289 8289 1.00000000000000e+00 8290 8290 1.00000000000000e+00 8291 8291 1.00000000000000e+00 8292 8292 1.00000000000000e+00 8293 8293 1.00000000000000e+00 8294 8294 1.00000000000000e+00 8295 8295 1.00000000000000e+00 8296 8296 1.00000000000000e+00 8297 8297 1.00000000000000e+00 8298 8298 1.00000000000000e+00 8299 8299 1.00000000000000e+00 8300 8300 1.00000000000000e+00 8301 8301 1.00000000000106e+00 8301 6429 3.55340800000000e-14 8301 6453 1.91012521360000e-10 8301 6477 2.22990279934000e-09 8301 6501 1.09086417370000e-10 8301 7029 7.31269937100000e-11 8301 7053 1.76934258518450e-07 8301 7077 1.47101733658939e-06 8301 7101 1.65206772175230e-07 8301 7629 9.32791876860000e-10 8301 7653 1.86054858380149e-06 8301 7677 4.40213679917635e-06 8301 7701 1.23430727922290e-07 8301 8229 8.85453302770000e-10 8301 8253 8.87219725627910e-07 8301 8277 8.87085011605780e-07 8301 8853 3.19243961200000e-11 8301 8877 2.16381754700000e-11 8301 16152 -2.84663206480000e-10 8301 16176 -2.40186428761700e-07 8301 16200 -4.78380215078050e-07 8301 16560 -1.31019120337000e-09 8301 16584 -1.27580809196153e-06 8301 16608 -2.54244484549950e-06 8301 16968 -9.70816716290000e-10 8301 16992 -1.50043593642070e-06 8301 17016 -2.99407615582734e-06 8301 17376 -1.71538377450000e-10 8301 17400 -3.15062376914750e-07 8301 17424 -6.28923985187320e-07 8302 8302 1.00000000000000e+00 8303 8303 1.00000000000000e+00 8304 8304 1.00000000000000e+00 8305 8305 1.00000000000000e+00 8306 8306 1.00000000000000e+00 8307 8307 1.00000000000000e+00 8308 8308 1.00000000000000e+00 8309 8309 1.00000000000000e+00 8310 8310 1.00000000000000e+00 8311 8311 1.00000000000000e+00 8312 8312 1.00000000000000e+00 8313 8313 1.00000000000000e+00 8314 8314 1.00000000000000e+00 8315 8315 1.00000000000000e+00 8316 8316 1.00000000000000e+00 8317 8317 1.00000000000000e+00 8318 8318 1.00000000000000e+00 8319 8319 1.00000000000000e+00 8320 8320 1.00000000000000e+00 8321 8321 1.00000000000000e+00 8322 8322 1.00000000000000e+00 8323 8323 1.00000000000000e+00 8324 8324 1.00000000000000e+00 8325 8325 1.00000000000000e+00 8326 8326 1.00000000000000e+00 8327 8327 1.00000000000000e+00 8328 8328 1.00000000000000e+00 8329 8329 1.00000000000000e+00 8330 8330 1.00000000000000e+00 8331 8331 1.00000000000000e+00 8332 8332 1.00000000000000e+00 8333 8333 1.00000000000000e+00 8334 8334 1.00000000000000e+00 8335 8335 1.00000000000000e+00 8336 8336 1.00000000000000e+00 8337 8337 1.00000000000000e+00 8338 8338 1.00000000000000e+00 8339 8339 1.00000000000000e+00 8340 8340 1.00000000000000e+00 8341 8341 1.00000000000000e+00 8342 8342 1.00000000000000e+00 8343 8343 1.00000000000000e+00 8344 8344 1.00000000000000e+00 8345 8345 1.00000000000000e+00 8346 8346 1.00000000000000e+00 8347 8347 1.00000000000000e+00 8348 8348 1.00000000000000e+00 8349 8349 1.00000000000000e+00 8350 8350 1.00000000000000e+00 8351 8351 1.00000000000000e+00 8352 8352 1.00000000000000e+00 8353 8353 1.00000000000000e+00 8354 8354 1.00000000000000e+00 8355 8355 1.00000000000000e+00 8356 8356 1.00000000000000e+00 8357 8357 1.00000000000000e+00 8358 8358 1.00000000000000e+00 8359 8359 1.00000000000000e+00 8360 8360 1.00000000000000e+00 8361 8361 1.00000000000000e+00 8362 8362 1.00000000000000e+00 8363 8363 1.00000000000000e+00 8364 8364 1.00000000000000e+00 8365 8365 1.00000000000000e+00 8366 8366 1.00000000000000e+00 8367 8367 1.00000000000000e+00 8368 8368 1.00000000000000e+00 8369 8369 1.00000000000000e+00 8370 8370 1.00000000000000e+00 8371 8371 1.00000000000000e+00 8372 8372 1.00000000000000e+00 8373 8373 1.00000000000000e+00 8374 8374 1.00000000000000e+00 8375 8375 1.00000000000000e+00 8376 8376 1.00000000000000e+00 8377 8377 1.00000000000000e+00 8378 8378 1.00000000000000e+00 8379 8379 1.00000000000000e+00 8380 8380 1.00000000000000e+00 8381 8381 1.00000000000000e+00 8382 8382 1.00000000000000e+00 8383 8383 1.00000000000000e+00 8384 8384 1.00000000000000e+00 8385 8385 1.00000000000000e+00 8386 8386 1.00000000000000e+00 8387 8387 1.00000000000000e+00 8388 8388 1.00000000000000e+00 8389 8389 1.00000000000000e+00 8390 8390 1.00000000000000e+00 8391 8391 1.00000000000000e+00 8392 8392 1.00000000000000e+00 8393 8393 1.00000000000000e+00 8394 8394 1.00000000000000e+00 8395 8395 1.00000000000000e+00 8396 8396 1.00000000000000e+00 8397 8397 1.00000000000000e+00 8398 8398 1.00000000000000e+00 8399 8399 1.00000000000000e+00 8400 8400 1.00000000000000e+00 8401 8401 1.00000000000000e+00 8402 8402 1.00000000000000e+00 8403 8403 1.00000000000000e+00 8404 8404 1.00000000000000e+00 8405 8405 1.00000000000000e+00 8406 8406 1.00000000000000e+00 8407 8407 1.00000000000000e+00 8408 8408 1.00000000000000e+00 8409 8409 1.00000000000000e+00 8410 8410 1.00000000000000e+00 8411 8411 1.00000000000000e+00 8412 8412 1.00000000000000e+00 8413 8413 1.00000000000000e+00 8414 8414 1.00000000000000e+00 8415 8415 1.00000000000000e+00 8416 8416 1.00000000000000e+00 8417 8417 1.00000000000000e+00 8418 8418 1.00000000000000e+00 8419 8419 1.00000000000000e+00 8420 8420 1.00000000000000e+00 8421 8421 1.00000000000000e+00 8422 8422 1.00000000000000e+00 8423 8423 1.00000000000000e+00 8424 8424 1.00000000000000e+00 8425 8425 1.00000000000000e+00 8426 8426 1.00000000000000e+00 8427 8427 1.00000000000000e+00 8428 8428 1.00000000000000e+00 8429 8429 1.00000000000000e+00 8430 8430 1.00000000000000e+00 8431 8431 1.00000000000000e+00 8432 8432 1.00000000000000e+00 8433 8433 1.00000000000000e+00 8434 8434 1.00000000000000e+00 8435 8435 1.00000000000000e+00 8436 8436 1.00000000000000e+00 8437 8437 1.00000000000000e+00 8438 8438 1.00000000000000e+00 8439 8439 1.00000000000000e+00 8440 8440 1.00000000000000e+00 8441 8441 1.00000000000000e+00 8442 8442 1.00000000000000e+00 8443 8443 1.00000000000000e+00 8444 8444 1.00000000000000e+00 8445 8445 1.00000000000000e+00 8446 8446 1.00000000000000e+00 8447 8447 1.00000000000000e+00 8448 8448 1.00000000000000e+00 8449 8449 1.00000000000000e+00 8450 8450 1.00000000000000e+00 8451 8451 1.00000000000000e+00 8452 8452 1.00000000000000e+00 8453 8453 1.00000000000000e+00 8454 8454 1.00000000000000e+00 8455 8455 1.00000000000000e+00 8456 8456 1.00000000000000e+00 8457 8457 1.00000000000000e+00 8458 8458 1.00000000000000e+00 8459 8459 1.00000000000000e+00 8460 8460 1.00000000000000e+00 8461 8461 1.00000000000000e+00 8462 8462 1.00000000000000e+00 8463 8463 1.00000000000000e+00 8464 8464 1.00000000000000e+00 8465 8465 1.00000000000000e+00 8466 8466 1.00000000000000e+00 8467 8467 1.00000000000000e+00 8468 8468 1.00000000000000e+00 8469 8469 1.00000000000000e+00 8470 8470 1.00000000000000e+00 8471 8471 1.00000000000000e+00 8472 8472 1.00000000000000e+00 8473 8473 1.00000000000000e+00 8474 8474 1.00000000000000e+00 8475 8475 1.00000000000000e+00 8476 8476 1.00000000000000e+00 8477 8477 1.00000000000000e+00 8478 8478 1.00000000000000e+00 8479 8479 1.00000000000000e+00 8480 8480 1.00000000000000e+00 8481 8481 1.00000000000000e+00 8482 8482 1.00000000000000e+00 8483 8483 1.00000000000000e+00 8484 8484 1.00000000000000e+00 8485 8485 1.00000000000000e+00 8486 8486 1.00000000000000e+00 8487 8487 1.00000000000000e+00 8488 8488 1.00000000000000e+00 8489 8489 1.00000000000000e+00 8490 8490 1.00000000000000e+00 8491 8491 1.00000000000000e+00 8492 8492 1.00000000000000e+00 8493 8493 1.03255630443834e+00 8493 7317 4.09279816281544e-06 8493 7341 3.44776521549160e-06 8493 7893 3.16146648534742e-04 8493 7917 6.52632710066741e-02 8493 7941 3.06976858560455e-02 8493 7965 3.30881342016351e-05 8493 8517 6.14209279220184e-01 8493 8541 1.30411080783782e-01 8493 8565 3.54827271089042e-04 8493 9093 6.14289272445787e-03 8493 9117 1.19790234883612e-01 8493 9141 4.36793967859321e-02 8493 9165 1.80194811187154e-04 8493 20712 -2.65642361519577e-02 8493 20736 -1.39520399675054e-02 8493 20760 -1.91406254721869e-04 8493 21120 -2.58559228758133e-01 8493 21144 -1.61524079405966e-01 8493 21168 -9.21270429339987e-03 8493 21528 -3.31168804452563e-01 8493 21552 -2.25383879039395e-01 8493 21576 -1.70855648037467e-02 8494 8494 1.00000000000000e+00 8495 8495 1.00000000000000e+00 8496 8496 1.00000000000000e+00 8497 8497 1.00000000000000e+00 8498 8498 1.00000000000000e+00 8499 8499 1.00000000000000e+00 8500 8500 1.00000000000000e+00 8501 8501 1.00000000000000e+00 8502 8502 1.00000000000000e+00 8503 8503 1.00000000000000e+00 8504 8504 1.00000000000000e+00 8505 8505 1.00000000000000e+00 8506 8506 1.00000000000000e+00 8507 8507 1.00000000000000e+00 8508 8508 1.00000000000000e+00 8509 8509 1.00000000000000e+00 8510 8510 1.00000000000000e+00 8511 8511 1.00000000000000e+00 8512 8512 1.00000000000000e+00 8513 8513 1.00000000000000e+00 8514 8514 1.00000000000000e+00 8515 8515 1.00000000000000e+00 8516 8516 1.00000000000000e+00 8517 8517 2.23335933073397e+01 8517 6717 1.09086417370000e-10 8517 6741 7.67643334023879e-06 8517 6765 2.36590348617491e-06 8517 7317 7.50878594565614e-02 8517 7341 2.76648894908246e-01 8517 7365 7.50438699090499e-03 8517 7389 1.13169651915072e-06 8517 7893 8.11544335798943e-03 8517 7917 4.86555311739368e+00 8517 7941 4.49687532095992e+00 8517 7965 1.09481969201773e-01 8517 7989 1.08990327590325e-04 8517 8493 6.14209279220184e-01 8517 8541 1.07535791920085e+01 8517 8565 2.79777465397472e-01 8517 8589 5.98389187080596e-04 8517 9093 1.09822659070730e-01 8517 9117 4.66704907915610e+00 8517 9141 4.64065275503846e+00 8517 9165 2.45504972402709e-01 8517 9189 1.20547285967303e-04 8517 9741 9.22890593949134e-03 8517 9765 7.34843574811682e-03 8517 19896 -1.07822922226171e-04 8517 19920 -9.97392066839145e-05 8517 19944 -1.30936415916653e-05 8517 20304 -4.03388434389498e-01 8517 20328 -2.52264035490324e-01 8517 20352 -1.51639929481643e-02 8517 20376 -1.92627463307734e-04 8517 20712 -3.59414605494428e+00 8517 20736 -2.45302092463139e+00 8517 20760 -2.20635404010201e-01 8517 20784 -8.94430899049728e-03 8517 21120 -1.13506209985228e+01 8517 21144 -1.07635608328280e+01 8517 21168 -1.81132176135842e+00 8517 21192 -9.62596793221467e-02 8517 21528 -8.01986008310673e+00 8517 21552 -1.09051654129363e+01 8517 21576 -2.47118942806330e+00 8517 21600 -1.34917509756813e-01 8518 8518 1.00000000000000e+00 8519 8519 1.00000000000000e+00 8520 8520 1.00000000000000e+00 8521 8521 1.00000000000000e+00 8522 8522 1.00000000000000e+00 8523 8523 1.00000000000000e+00 8524 8524 1.00000000000000e+00 8525 8525 1.00000000000000e+00 8526 8526 1.00000000000000e+00 8527 8527 1.00000000000000e+00 8528 8528 1.00000000000000e+00 8529 8529 1.00000000000000e+00 8530 8530 1.00000000000000e+00 8531 8531 1.00000000000000e+00 8532 8532 1.00000000000000e+00 8533 8533 1.00000000000000e+00 8534 8534 1.00000000000000e+00 8535 8535 1.00000000000000e+00 8536 8536 1.00000000000000e+00 8537 8537 1.00000000000000e+00 8538 8538 1.00000000000000e+00 8539 8539 1.00000000000000e+00 8540 8540 1.00000000000000e+00 8541 8541 1.87919716657742e+01 8541 6717 2.22990279934000e-09 8541 6741 3.47698256597015e-04 8541 6765 1.59825900986144e-04 8541 7317 1.02332936930000e-01 8541 7341 4.95673214491788e-01 8541 7365 9.86337930066167e-02 8541 7389 7.60696239971752e-03 8541 7413 2.13656657686150e-06 8541 7893 2.07534537618295e-03 8541 7917 3.15491505639718e+00 8541 7941 7.14083795988871e+00 8541 7965 2.68222047618851e+00 8541 7989 1.65476629083135e-01 8541 8013 1.53185448900637e-04 8541 8493 1.30411080783782e-01 8541 8517 1.07535791920085e+01 8541 8565 6.98081283453317e+00 8541 8589 3.44526895845683e-01 8541 8613 8.42968691652756e-04 8541 9093 2.33776633015670e-02 8541 9117 3.18335899755214e+00 8541 9141 1.09723187831807e+01 8541 9165 3.76737230205425e+00 8541 9189 1.06494160843871e-01 8541 9213 4.77661153452600e-05 8541 9741 9.43953024244516e-02 8541 9765 1.48862480810999e-01 8541 9789 8.22857654823549e-03 8541 9813 1.44369951344170e-07 8541 10365 1.31921271842000e-09 8541 10389 1.26524962030200e-08 8541 10413 2.76977475000000e-12 8541 19896 -7.88146601817124e-03 8541 19920 -3.30507753107719e-02 8541 19944 -3.82846590392048e-02 8541 19968 -8.24395122984927e-03 8541 19992 -4.71154979898946e-05 8541 20304 -6.50483221529814e-01 8541 20328 -1.10367230428954e+00 8541 20352 -1.07744492518081e+00 8541 20376 -2.65653515247318e-01 8541 20400 -9.50245677540098e-03 8541 20712 -3.43113164804832e+00 8541 20736 -5.66071931761901e+00 8541 20760 -5.27654274785888e+00 8541 20784 -1.32287667106866e+00 8541 20808 -5.51496939522450e-02 8541 20832 -6.05285648237200e-07 8541 21120 -5.32072509956953e+00 8541 21144 -1.13396010740792e+01 8541 21168 -9.88798952076265e+00 8541 21192 -2.39548250059451e+00 8541 21216 -1.07496598483683e-01 8541 21240 -5.73103372691886e-06 8541 21528 -2.77159021881339e+00 8541 21552 -8.54372163120864e+00 8541 21576 -7.14013593441141e+00 8541 21600 -1.63815643084327e+00 8541 21624 -7.14390121570574e-02 8541 21648 -7.22506791617730e-06 8542 8542 1.00000000000000e+00 8543 8543 1.00000000000000e+00 8544 8544 1.00000000000000e+00 8545 8545 1.00000000000000e+00 8546 8546 1.00000000000000e+00 8547 8547 1.00000000000000e+00 8548 8548 1.00000000000000e+00 8549 8549 1.00000000000000e+00 8550 8550 1.00000000000000e+00 8551 8551 1.00000000000000e+00 8552 8552 1.00000000000000e+00 8553 8553 1.00000000000000e+00 8554 8554 1.00000000000000e+00 8555 8555 1.00000000000000e+00 8556 8556 1.00000000000000e+00 8557 8557 1.00000000000000e+00 8558 8558 1.00000000000000e+00 8559 8559 1.00000000000000e+00 8560 8560 1.00000000000000e+00 8561 8561 1.00000000000000e+00 8562 8562 1.00000000000000e+00 8563 8563 1.00000000000000e+00 8564 8564 1.00000000000000e+00 8565 8565 1.85107007957682e+01 8565 6141 3.85400000000000e-17 8565 6165 6.14500000000000e-17 8565 6717 1.91012521360000e-10 8565 6741 2.33188526392926e-04 8565 6765 2.67258390988049e-04 8565 6789 1.40199035422931e-04 8565 6813 1.07354659163104e-06 8565 7317 2.93365015021248e-03 8565 7341 1.04720627674968e-01 8565 7365 3.83651946384808e-01 8565 7389 1.29158141991547e-01 8565 7413 3.37533779248327e-03 8565 7437 2.40795486257655e-06 8565 7893 3.19208832744806e-06 8565 7917 9.08790737019986e-02 8565 7941 2.64884504318010e+00 8565 7965 7.60940118776554e+00 8565 7989 2.77392916116126e+00 8565 8013 1.30017308321319e-01 8565 8037 2.64738694593928e-04 8565 8493 3.54827271089042e-04 8565 8517 2.79777465397472e-01 8565 8541 6.98081283453317e+00 8565 8589 7.22470846299902e+00 8565 8613 3.05741013405648e-01 8565 8637 5.42606048985630e-04 8565 9093 7.20900767794627e-05 8565 9117 1.29727964301457e-01 8565 9141 3.09914208319468e+00 8565 9165 5.81461242173245e+00 8565 9189 2.30136421296780e+00 8565 9213 1.35101238191691e-01 8565 9237 2.10763663817746e-05 8565 9741 4.82735193069485e-02 8565 9765 2.78118470954539e-01 8565 9789 1.11544915246483e-01 8565 9813 3.49349886848900e-03 8565 9837 1.08879937028277e-06 8565 10365 8.97612361523960e-07 8565 10389 1.11277923894422e-05 8565 10413 1.43358216180982e-06 8565 19488 -1.62243194400000e-11 8565 19512 -3.77341038477298e-04 8565 19536 -2.41855455161590e-03 8565 19560 -4.02285784986320e-03 8565 19584 -9.44207889060278e-04 8565 19608 -8.75431199719518e-06 8565 19896 -6.72695047920747e-03 8565 19920 -1.24457816678187e-01 8565 19944 -4.87379513125253e-01 8565 19968 -4.60405244955097e-01 8565 19992 -1.09952822002808e-01 8565 20016 -5.15015269182182e-03 8565 20304 -6.09452274392234e-02 8565 20328 -1.10467050991718e+00 8565 20352 -4.28313906253398e+00 8565 20376 -3.98187100407150e+00 8565 20400 -1.01738905164710e+00 8565 20424 -6.35762543224464e-02 8565 20448 -1.69759551982035e-05 8565 20712 -1.57084032693361e-01 8565 20736 -2.84276194806417e+00 8565 20760 -1.09547396060205e+01 8565 20784 -1.00015592700930e+01 8565 20808 -2.67231919083980e+00 8565 20832 -1.94606147503329e-01 8565 20856 -8.75407316449964e-05 8565 21120 -9.39954658147383e-02 8565 21144 -1.79211733908763e+00 8565 21168 -6.75754988964355e+00 8565 21192 -5.48334295921220e+00 8565 21216 -1.43888709538291e+00 8565 21240 -1.13112689805214e-01 8565 21264 -9.55235986069331e-05 8565 21528 -2.04644255858369e-02 8565 21552 -4.70523537717527e-01 8565 21576 -1.79324213756291e+00 8565 21600 -1.28138291463894e+00 8565 21624 -3.00034719279317e-01 8565 21648 -2.05692093069996e-02 8565 21672 -1.96369108521824e-05 8566 8566 1.00000000000000e+00 8567 8567 1.00000000000000e+00 8568 8568 1.00000000000000e+00 8569 8569 1.00000000000000e+00 8570 8570 1.00000000000000e+00 8571 8571 1.00000000000000e+00 8572 8572 1.00000000000000e+00 8573 8573 1.00000000000000e+00 8574 8574 1.00000000000000e+00 8575 8575 1.00000000000000e+00 8576 8576 1.00000000000000e+00 8577 8577 1.00000000000000e+00 8578 8578 1.00000000000000e+00 8579 8579 1.00000000000000e+00 8580 8580 1.00000000000000e+00 8581 8581 1.00000000000000e+00 8582 8582 1.00000000000000e+00 8583 8583 1.00000000000000e+00 8584 8584 1.00000000000000e+00 8585 8585 1.00000000000000e+00 8586 8586 1.00000000000000e+00 8587 8587 1.00000000000000e+00 8588 8588 1.00000000000000e+00 8589 8589 1.66152374232946e+01 8589 6141 6.35000000000000e-18 8589 6165 1.01200000000000e-17 8589 6717 3.55340800000000e-14 8589 6741 1.65821052232080e-07 8589 6765 2.62041531254365e-04 8589 6789 4.67153324025481e-04 8589 6813 1.87607910286074e-05 8589 6837 7.22147823010710e-07 8589 7317 2.08930460891820e-07 8589 7341 7.20183881084083e-03 8589 7365 1.38803384818398e-01 8589 7389 2.91682199132936e-01 8589 7413 1.13542902326335e-01 8589 7437 4.70380571098790e-03 8589 7461 3.90695406012380e-07 8589 7917 3.87416569810678e-05 8589 7941 1.58330381854045e-01 8589 7965 2.77588105773608e+00 8589 7989 6.32140157665028e+00 8589 8013 2.31426725984315e+00 8589 8037 1.03986644421701e-01 8589 8061 3.16588033027825e-04 8589 8517 5.98389187080596e-04 8589 8541 3.44526895845683e-01 8589 8565 7.22470846299902e+00 8589 8613 6.01317879021483e+00 8589 8637 3.01419830152276e-01 8589 8661 2.76673039955506e-04 8589 9117 2.54420757694269e-04 8589 9141 1.02944973256481e-01 8589 9165 2.28682142390904e+00 8589 9189 6.43803972467902e+00 8589 9213 2.61139860278913e+00 8589 9237 1.29959229577416e-01 8589 9261 4.54682972154234e-05 8589 9741 2.48600030779952e-03 8589 9765 9.56967206476587e-02 8589 9789 2.56110343441903e-01 8589 9813 1.30468906119896e-01 8589 9837 4.00256385214307e-03 8589 9861 2.47633161065679e-06 8589 10365 8.78103357304630e-07 8589 10389 3.80183219577225e-04 8589 10413 3.05165715246769e-04 8589 10437 1.31669194616133e-06 8589 19128 -3.98147192210430e-07 8589 19152 -1.33092751663788e-05 8589 19176 -4.77885378091516e-05 8589 19200 -1.38112665047084e-05 8589 19224 -5.23645026792820e-07 8589 19488 -2.67275633000000e-12 8589 19512 -7.12208246196826e-04 8589 19536 -2.20016673822271e-02 8589 19560 -1.07211408631075e-01 8589 19584 -1.41157639159405e-01 8589 19608 -3.97012792058173e-02 8589 19632 -2.45335414009302e-03 8589 19896 -2.51866616999194e-06 8589 19920 -3.00750972078245e-02 8589 19944 -4.41673679756451e-01 8589 19968 -1.71506375002889e+00 8589 19992 -1.97095422806587e+00 8589 20016 -6.07890324229398e-01 8589 20040 -5.22627933309468e-02 8589 20064 -3.43528606209348e-05 8589 20304 -1.04201598584567e-05 8589 20328 -1.38745469119397e-01 8589 20352 -1.87921702765295e+00 8589 20376 -6.94499300146922e+00 8589 20400 -7.59830514439921e+00 8589 20424 -2.46519311509008e+00 8589 20448 -2.40577424961976e-01 8589 20472 -3.89332230272238e-04 8589 20712 -3.90079655830205e-06 8589 20736 -1.44954846645992e-01 8589 20760 -2.15460430129376e+00 8589 20784 -8.19445174042265e+00 8589 20808 -8.89099175463546e+00 8589 20832 -3.01355636355893e+00 8589 20856 -3.19772793067185e-01 8589 20880 -1.04490660266631e-03 8589 21120 -3.45535269833850e-07 8589 21144 -3.39913024247143e-02 8589 21168 -5.66300017826257e-01 8589 21192 -2.25180646794097e+00 8589 21216 -2.49991636289078e+00 8589 21240 -8.31720144615557e-01 8589 21264 -8.48036522135815e-02 8589 21288 -2.63403151354021e-04 8589 21552 -1.21583139608409e-03 8589 21576 -3.17314047065673e-02 8589 21600 -1.43634132019867e-01 8589 21624 -1.70767136446979e-01 8589 21648 -5.14093378669872e-02 8589 21672 -4.12660314887453e-03 8589 21696 -2.87059089138052e-06 8590 8590 1.00000000000000e+00 8591 8591 1.00000000000000e+00 8592 8592 1.00000000000000e+00 8593 8593 1.00000000000000e+00 8594 8594 1.00000000000000e+00 8595 8595 1.00000000000000e+00 8596 8596 1.00000000000000e+00 8597 8597 1.00000000000000e+00 8598 8598 1.00000000000000e+00 8599 8599 1.00000000000000e+00 8600 8600 1.00000000000000e+00 8601 8601 1.00000000000000e+00 8602 8602 1.00000000000000e+00 8603 8603 1.00000000000000e+00 8604 8604 1.00000000000000e+00 8605 8605 1.00000000000000e+00 8606 8606 1.00000000000000e+00 8607 8607 1.00000000000000e+00 8608 8608 1.00000000000000e+00 8609 8609 1.00000000000000e+00 8610 8610 1.00000000000000e+00 8611 8611 1.00000000000000e+00 8612 8612 1.00000000000000e+00 8613 8613 1.52368589982418e+01 8613 6741 7.79578600000000e-14 8613 6765 2.74962501930974e-06 8613 6789 8.91005421407023e-05 8613 6813 5.00161568839039e-04 8613 6837 1.25135402336308e-04 8613 7341 2.19087640160000e-10 8613 7365 5.70101788762022e-03 8613 7389 1.17330424634126e-01 8613 7413 2.82601434453938e-01 8613 7437 8.63918164591289e-02 8613 7461 5.12001329153914e-03 8613 7485 6.86885643072780e-06 8613 7941 7.51344158719125e-05 8613 7965 1.17467751532465e-01 8613 7989 2.32069493927854e+00 8613 8013 5.42353049705159e+00 8613 8037 2.25780169589540e+00 8613 8061 9.94207410797834e-02 8613 8085 2.33697018029737e-04 8613 8541 8.42968691652756e-04 8613 8565 3.05741013405648e-01 8613 8589 6.01317879021483e+00 8613 8637 5.50681995523434e+00 8613 8661 2.90694425790978e-01 8613 8685 1.38422994045989e-04 8613 9141 1.72881141110545e-04 8613 9165 1.41458480609620e-01 8613 9189 2.63300019074901e+00 8613 9213 6.29112857326259e+00 8613 9237 2.38740455251692e+00 8613 9261 1.09787995396197e-01 8613 9285 8.84933336397349e-05 8613 9741 6.07076150326415e-06 8613 9765 3.27777054418449e-03 8613 9789 1.14640260342689e-01 8613 9813 3.70222890871785e-01 8613 9837 1.36104287771057e-01 8613 9861 2.81609474262597e-03 8613 9885 1.62962235055505e-06 8613 10365 1.62635643746720e-07 8613 10389 1.64562920078719e-04 8613 10413 1.93413419972700e-04 8613 10437 1.35092304002420e-04 8613 10461 1.56403018457278e-05 8613 19128 -1.59177904572115e-06 8613 19152 -1.93303940305548e-03 8613 19176 -1.50083400241685e-02 8613 19200 -3.19984746935322e-02 8613 19224 -1.07863231621519e-02 8613 19248 -8.71566016129873e-04 8613 19512 -6.97276547140000e-10 8613 19536 -6.25604395553281e-03 8613 19560 -1.34270192548722e-01 8613 19584 -6.48829834041647e-01 8613 19608 -9.67683053614519e-01 8613 19632 -3.49928920340790e-01 8613 19656 -3.61825963381655e-02 8613 19680 -2.60766096089590e-05 8613 19920 -3.40300235706000e-09 8613 19944 -4.19819363012439e-02 8613 19968 -8.23602821426857e-01 8613 19992 -3.78383013424044e+00 8613 20016 -5.35935612814161e+00 8613 20040 -2.02840327989389e+00 8613 20064 -2.30669445532562e-01 8613 20088 -8.94813647991526e-04 8613 20328 -3.15286122116000e-09 8613 20352 -7.66304469585017e-02 8613 20376 -1.48312847787424e+00 8613 20400 -6.73991693558079e+00 8613 20424 -9.44829471250603e+00 8613 20448 -3.73729413925654e+00 8613 20472 -4.57991835894871e-01 8613 20496 -3.43551708160339e-03 8613 20736 -6.13896168510000e-10 8613 20760 -2.67986772911734e-02 8613 20784 -6.94820792058679e-01 8613 20808 -3.40661737920487e+00 8613 20832 -4.91376916156050e+00 8613 20856 -1.86663739218365e+00 8613 20880 -2.16006340598433e-01 8613 20904 -1.78015374464238e-03 8613 21168 -2.45483860613423e-03 8613 21192 -9.94144917254037e-02 8613 21216 -5.23272904718809e-01 8613 21240 -7.67651190101436e-01 8613 21264 -2.75908869197936e-01 8613 21288 -2.92956316988260e-02 8613 21312 -2.47411633771673e-04 8613 21576 -1.54286544133720e-07 8613 21600 -1.22365447471562e-03 8613 21624 -6.67400920711631e-03 8613 21648 -8.36244219545040e-03 8613 21672 -1.83203537140742e-03 8613 21696 -1.25824412478920e-05 8614 8614 1.00000000000000e+00 8615 8615 1.00000000000000e+00 8616 8616 1.00000000000000e+00 8617 8617 1.00000000000000e+00 8618 8618 1.00000000000000e+00 8619 8619 1.00000000000000e+00 8620 8620 1.00000000000000e+00 8621 8621 1.00000000000000e+00 8622 8622 1.00000000000000e+00 8623 8623 1.00000000000000e+00 8624 8624 1.00000000000000e+00 8625 8625 1.00000000000000e+00 8626 8626 1.00000000000000e+00 8627 8627 1.00000000000000e+00 8628 8628 1.00000000000000e+00 8629 8629 1.00000000000000e+00 8630 8630 1.00000000000000e+00 8631 8631 1.00000000000000e+00 8632 8632 1.00000000000000e+00 8633 8633 1.00000000000000e+00 8634 8634 1.00000000000000e+00 8635 8635 1.00000000000000e+00 8636 8636 1.00000000000000e+00 8637 8637 1.42155940525201e+01 8637 6789 6.72456755290733e-06 8637 6813 2.46473168732267e-04 8637 6837 1.40080260134697e-04 8637 6861 7.84494215473662e-05 8637 6885 1.59094207830703e-06 8637 7389 5.39569286250715e-03 8637 7413 1.00146710530683e-01 8637 7437 2.82210798877978e-01 8637 7461 1.00625901988247e-01 8637 7485 2.37454150425827e-03 8637 7509 1.13484136129364e-05 8637 7965 1.33659463189933e-04 8637 7989 8.99707006266861e-02 8637 8013 2.25961989461760e+00 8637 8037 5.17797855006944e+00 8637 8061 2.08683207293719e+00 8637 8085 1.06392574754094e-01 8637 8109 1.06435412031522e-04 8637 8565 5.42606048985630e-04 8637 8589 3.01419830152276e-01 8637 8613 5.50681995523434e+00 8637 8661 5.19496917949446e+00 8637 8685 2.80488210935193e-01 8637 8709 1.84292133188979e-04 8637 9165 1.01435749871596e-04 8637 9189 1.33641182211231e-01 8637 9213 2.39295414762293e+00 8637 9237 5.68740314343198e+00 8637 9261 2.15188580318627e+00 8637 9285 9.20977706503677e-02 8637 9309 1.56645013647059e-04 8637 9765 3.01784208052619e-06 8637 9789 6.61404141397737e-03 8637 9813 1.24157463156096e-01 8637 9837 2.81822420274204e-01 8637 9861 1.24288913731450e-01 8637 9885 3.81948091007352e-03 8637 9909 1.84048516669520e-07 8637 10365 1.65361740000000e-13 8637 10389 4.13226415410000e-10 8637 10413 6.65602558937122e-05 8637 10437 7.57288505340460e-04 8637 10461 1.65828879302887e-04 8637 10485 7.38583222521824e-06 8637 18768 -2.31930704160447e-05 8637 18792 -7.57131174518678e-04 8637 18816 -2.84679740778401e-03 8637 18840 -1.32903395665439e-03 8637 18864 -1.66168765949972e-04 8637 19152 -8.99956012314750e-04 8637 19176 -3.58048723393153e-02 8637 19200 -2.15879675201223e-01 8637 19224 -3.98034187425589e-01 8637 19248 -1.70937578879020e-01 8637 19272 -2.12466860893380e-02 8637 19296 -1.39127671343209e-05 8637 19560 -1.14567772184785e-02 8637 19584 -3.52156070294241e-01 8637 19608 -1.93651044840107e+00 8637 19632 -3.29949882568259e+00 8637 19656 -1.47822609499834e+00 8637 19680 -2.00674644131230e-01 8637 19704 -1.61402046852437e-03 8637 19968 -3.45663066015182e-02 8637 19992 -9.93116571711704e-01 8637 20016 -5.24984454072561e+00 8637 20040 -8.57804786423769e+00 8637 20064 -3.96244886125048e+00 8637 20088 -5.70727423507661e-01 8637 20112 -7.75557904544798e-03 8637 20376 -1.68136550660147e-02 8637 20400 -6.98575913356126e-01 8637 20424 -3.93415720552648e+00 8637 20448 -6.59932721052835e+00 8637 20472 -2.99873944324048e+00 8637 20496 -4.30138184579657e-01 8637 20520 -7.59144487802201e-03 8637 20784 -2.24873890229678e-03 8637 20808 -1.53167292222668e-01 8637 20832 -9.05256029698987e-01 8637 20856 -1.52988192885985e+00 8637 20880 -6.49578675580671e-01 8637 20904 -8.64757018219528e-02 8637 20928 -1.50947173666031e-03 8637 21192 -2.55024749279369e-06 8637 21216 -8.22518959263143e-03 8637 21240 -5.14144086384422e-02 8637 21264 -8.46843250636841e-02 8637 21288 -2.75991069040440e-02 8637 21312 -2.26300359808550e-03 8637 21336 -3.20764573755030e-07 8637 21624 -1.98860187077000e-09 8637 21648 -8.94809260414000e-09 8637 21672 -5.96334235505000e-09 8637 21696 -9.93685121070000e-10 8638 8638 1.00000000000000e+00 8639 8639 1.00000000000000e+00 8640 8640 1.00000000000000e+00 8641 8641 1.00000000000000e+00 8642 8642 1.00000000000000e+00 8643 8643 1.00000000000000e+00 8644 8644 1.00000000000000e+00 8645 8645 1.00000000000000e+00 8646 8646 1.00000000000000e+00 8647 8647 1.00000000000000e+00 8648 8648 1.00000000000000e+00 8649 8649 1.00000000000000e+00 8650 8650 1.00000000000000e+00 8651 8651 1.00000000000000e+00 8652 8652 1.00000000000000e+00 8653 8653 1.00000000000000e+00 8654 8654 1.00000000000000e+00 8655 8655 1.00000000000000e+00 8656 8656 1.00000000000000e+00 8657 8657 1.00000000000000e+00 8658 8658 1.00000000000000e+00 8659 8659 1.00000000000000e+00 8660 8660 1.00000000000000e+00 8661 8661 1.36444800739710e+01 8661 6813 2.33219156354420e-06 8661 6837 1.62005155421068e-04 8661 6861 5.56335941560830e-04 8661 6885 1.66984562117840e-05 8661 6909 3.53353347430300e-07 8661 7389 2.29509986312700e-08 8661 7413 4.42976897962898e-03 8661 7437 1.07957058569068e-01 8661 7461 2.37311790284683e-01 8661 7485 1.05587349081562e-01 8661 7509 3.85851679879765e-03 8661 7533 7.26515781837260e-07 8661 7989 1.76641060064227e-04 8661 8013 8.59626371374448e-02 8661 8037 2.09507042579204e+00 8661 8061 5.17337010637295e+00 8661 8085 2.02145129931115e+00 8661 8109 1.04108481663570e-01 8661 8133 7.05197533765968e-05 8661 8589 2.76673039955506e-04 8661 8613 2.90694425790978e-01 8661 8637 5.19496917949446e+00 8661 8685 5.03563186199641e+00 8661 8709 2.70606731348375e-01 8661 8733 3.78755041462763e-04 8661 9189 9.36342827745027e-05 8661 9213 1.18382376377729e-01 8661 9237 2.14319633633400e+00 8661 9261 5.27654782800361e+00 8661 9285 2.15568720645538e+00 8661 9309 8.13110836323455e-02 8661 9333 1.52487309262474e-04 8661 9789 7.65518854573857e-06 8661 9813 2.98338614606095e-03 8661 9837 1.20227799418500e-01 8661 9861 2.80845679566271e-01 8661 9885 1.03852201314301e-01 8661 9909 5.11135706757790e-03 8661 9933 5.23284682600000e-11 8661 10413 2.76280475736858e-06 8661 10437 4.63231239090577e-05 8661 10461 3.16858225254104e-04 8661 10485 2.41938520180964e-04 8661 10509 4.70536121254547e-06 8661 18408 -3.38983153372562e-06 8661 18432 -1.62498969958991e-05 8661 18456 -1.41521149777120e-05 8661 18480 -2.69057086099659e-06 8661 18768 -1.96401349981369e-05 8661 18792 -5.60266975200149e-03 8661 18816 -4.94199897693987e-02 8661 18840 -1.24081197234278e-01 8661 18864 -6.46742273828275e-02 8661 18888 -9.35970523369866e-03 8661 18912 -4.56708922212470e-06 8661 19176 -2.75454565147809e-03 8661 19200 -1.30268316315284e-01 8661 19224 -8.64674467026409e-01 8661 19248 -1.80327671377134e+00 8661 19272 -9.64335460689662e-01 8661 19296 -1.52428787925998e-01 8661 19320 -2.01993850345186e-03 8661 19584 -1.26258116673757e-02 8661 19608 -5.59277921064762e-01 8661 19632 -3.51256895453248e+00 8661 19656 -6.94373649909147e+00 8661 19680 -3.78016253433075e+00 8661 19704 -6.27511702787334e-01 8661 19728 -1.29819148068440e-02 8661 19992 -1.02953049434362e-02 8661 20016 -6.13801984343060e-01 8661 20040 -3.97166244870871e+00 8661 20064 -7.93340222138199e+00 8661 20088 -4.40199915461421e+00 8661 20112 -7.65783553595153e-01 8661 20136 -2.21346096836282e-02 8661 20400 -1.94381303127238e-03 8661 20424 -1.90167096788184e-01 8661 20448 -1.29413504052001e+00 8661 20472 -2.64139157095857e+00 8661 20496 -1.40261292381429e+00 8661 20520 -2.32391335660982e-01 8661 20544 -5.97175117773285e-03 8661 20808 -1.03954862092583e-05 8661 20832 -1.72064983002764e-02 8661 20856 -1.26225497284196e-01 8661 20880 -2.64974126596227e-01 8661 20904 -1.28155566331303e-01 8661 20928 -1.85885487822351e-02 8661 20952 -2.50271011591101e-04 8661 21240 -6.02398997712644e-05 8661 21264 -3.83203401246182e-04 8661 21288 -6.29502914319938e-04 8661 21312 -1.43395025777822e-04 8661 21336 -2.87805904174350e-07 8662 8662 1.00000000000000e+00 8663 8663 1.00000000000000e+00 8664 8664 1.00000000000000e+00 8665 8665 1.00000000000000e+00 8666 8666 1.00000000000000e+00 8667 8667 1.00000000000000e+00 8668 8668 1.00000000000000e+00 8669 8669 1.00000000000000e+00 8670 8670 1.00000000000000e+00 8671 8671 1.00000000000000e+00 8672 8672 1.00000000000000e+00 8673 8673 1.00000000000000e+00 8674 8674 1.00000000000000e+00 8675 8675 1.00000000000000e+00 8676 8676 1.00000000000000e+00 8677 8677 1.00000000000000e+00 8678 8678 1.00000000000000e+00 8679 8679 1.00000000000000e+00 8680 8680 1.00000000000000e+00 8681 8681 1.00000000000000e+00 8682 8682 1.00000000000000e+00 8683 8683 1.00000000000000e+00 8684 8684 1.00000000000000e+00 8685 8685 1.35061797798594e+01 8685 6837 1.21535498385411e-05 8685 6861 8.99998833830986e-05 8685 6885 3.17936008973027e-04 8685 6909 1.14629817987545e-04 8685 7413 7.87821774847090e-07 8685 7437 2.64740635360737e-03 8685 7461 1.10241595057532e-01 8685 7485 2.55684893376080e-01 8685 7509 8.32621938773912e-02 8685 7533 4.46279463381611e-03 8685 7557 5.76185385784564e-06 8685 8013 1.17724328222053e-04 8685 8037 9.57663978761793e-02 8685 8061 2.02226749522321e+00 8685 8085 4.97708104918744e+00 8685 8109 2.01957827044317e+00 8685 8133 1.07567458814668e-01 8685 8157 8.99998833830966e-05 8685 8613 1.38422994045989e-04 8685 8637 2.80488210935193e-01 8685 8661 5.03563186199641e+00 8685 8709 5.01207283480080e+00 8685 8733 2.47676792294818e-01 8685 8757 5.56335941560814e-04 8685 9213 1.80679317919330e-04 8685 9237 1.04998272549909e-01 8685 9261 2.15151970522629e+00 8685 9285 5.01444778180920e+00 8685 9309 2.12534457488616e+00 8685 9333 9.01462639339635e-02 8685 9357 7.84494215473642e-05 8685 9813 1.30211113888142e-05 8685 9837 4.01865511835696e-03 8685 9861 8.98139243420839e-02 8685 9885 2.86213876935511e-01 8685 9909 1.03347535291060e-01 8685 9933 4.96671538245732e-03 8685 10437 8.53127317558100e-08 8685 10461 1.28308173330616e-04 8685 10485 2.93336389137456e-04 8685 10509 1.78814708764567e-04 8685 10533 5.31858846635943e-06 8685 18408 -2.44302264716898e-04 8685 18432 -5.97874547333376e-03 8685 18456 -2.31392107675328e-02 8685 18480 -1.65572343303868e-02 8685 18504 -2.89134898941353e-03 8685 18528 -6.46536115564750e-07 8685 18792 -5.12372734049650e-04 8685 18816 -4.04287971817125e-02 8685 18840 -3.30604382240390e-01 8685 18864 -8.36607401537227e-01 8685 18888 -5.46152839053613e-01 8685 18912 -9.93778601986993e-02 8685 18936 -1.86222575103133e-03 8685 19200 -3.14675205445588e-03 8685 19224 -2.60977235824410e-01 8685 19248 -1.99343558131643e+00 8685 19272 -4.76234705419659e+00 8685 19296 -3.12316738344965e+00 8685 19320 -6.00080589743586e-01 8685 19344 -1.82588596240218e-02 8685 19608 -4.92164144620347e-03 8685 19632 -4.78760119398735e-01 8685 19656 -3.58766882084474e+00 8685 19680 -8.39721704320000e+00 8685 19704 -5.60361692656973e+00 8685 19728 -1.14368139928724e+00 8685 19752 -4.78374423681392e-02 8685 20016 -1.17815807475609e-03 8685 20040 -2.13828212972158e-01 8685 20064 -1.71860913009062e+00 8685 20088 -4.18131636633928e+00 8685 20112 -2.69588979393638e+00 8685 20136 -5.34791752860129e-01 8685 20160 -2.16163911218320e-02 8685 20424 -2.02242391247022e-05 8685 20448 -2.95734225758230e-02 8685 20472 -2.58902342369895e-01 8685 20496 -6.56082329760212e-01 8685 20520 -3.95378165876494e-01 8685 20544 -7.37384779871945e-02 8685 20568 -2.69918411505052e-03 8685 20856 -4.92803893296505e-04 8685 20880 -5.17996492292177e-03 8685 20904 -1.37345708174822e-02 8685 20928 -4.83582745070654e-03 8685 20952 -4.06769525242698e-04 8686 8686 1.00000000000000e+00 8687 8687 1.00000000000000e+00 8688 8688 1.00000000000000e+00 8689 8689 1.00000000000000e+00 8690 8690 1.00000000000000e+00 8691 8691 1.00000000000000e+00 8692 8692 1.00000000000000e+00 8693 8693 1.00000000000000e+00 8694 8694 1.00000000000000e+00 8695 8695 1.00000000000000e+00 8696 8696 1.00000000000000e+00 8697 8697 1.00000000000000e+00 8698 8698 1.00000000000000e+00 8699 8699 1.00000000000000e+00 8700 8700 1.00000000000000e+00 8701 8701 1.00000000000000e+00 8702 8702 1.00000000000000e+00 8703 8703 1.00000000000000e+00 8704 8704 1.00000000000000e+00 8705 8705 1.00000000000000e+00 8706 8706 1.00000000000000e+00 8707 8707 1.00000000000000e+00 8708 8708 1.00000000000000e+00 8709 8709 1.32156586210115e+01 8709 6285 6.70440000000000e-16 8709 6309 1.87511000000000e-15 8709 6861 5.76185385784570e-06 8709 6885 2.09858096953750e-04 8709 6909 2.30005939103824e-04 8709 6933 9.44854427779014e-05 8709 6957 1.29402964269487e-06 8709 7437 2.00372158358373e-06 8709 7461 2.51568580534584e-03 8709 7485 9.76298792981412e-02 8709 7509 2.62012914802083e-01 8709 7533 9.82611695325460e-02 8709 7557 2.51568580534590e-03 8709 7581 4.07861261643052e-06 8709 7605 1.86000000000000e-17 8709 8037 5.24284476533347e-05 8709 8061 9.95804102733936e-02 8709 8085 2.00834264652634e+00 8709 8109 4.98296884704714e+00 8709 8133 1.94522732471998e+00 8709 8157 1.10241595057534e-01 8709 8181 1.76905947185154e-04 8709 8205 1.22830000000000e-16 8709 8637 1.84292133188979e-04 8709 8661 2.70606731348375e-01 8709 8685 5.01207283480080e+00 8709 8733 5.12142788929219e+00 8709 8757 2.37311790284686e-01 8709 8781 5.25146915451610e-04 8709 9237 2.90316706081261e-04 8709 9261 9.45590627379155e-02 8709 9285 2.12226312376190e+00 8709 9309 5.11958293841721e+00 8709 9333 2.03413071720501e+00 8709 9357 1.00625901988250e-01 8709 9381 3.57994833680478e-05 8709 9837 1.22408211906470e-06 8709 9861 5.51968148406416e-03 8709 9885 9.54297444868284e-02 8709 9909 2.50889615789971e-01 8709 9933 1.09060475920188e-01 8709 9957 5.12001329153937e-03 8709 9981 3.05027687506100e-08 8709 10437 5.21894530000000e-13 8709 10461 7.04711743687000e-09 8709 10485 6.51738304218139e-05 8709 10509 5.34088471120028e-04 8709 10533 8.43467389934029e-05 8709 10557 3.90695406012390e-07 8709 10581 1.07492419000000e-12 8709 18024 -5.84238235270000e-09 8709 18048 -2.61608722558184e-04 8709 18072 -1.43453473503939e-03 8709 18096 -1.81437017932963e-03 8709 18120 -3.88327097074189e-04 8709 18144 -3.49041330603600e-08 8709 18408 -3.67018070179621e-05 8709 18432 -9.23046608098434e-03 8709 18456 -1.01881284312104e-01 8709 18480 -3.18730314473020e-01 8709 18504 -2.57273709859609e-01 8709 18528 -5.29520423692189e-02 8709 18552 -1.33629378071350e-03 8709 18816 -5.27208835272879e-04 8709 18840 -1.02094554323801e-01 8709 18864 -9.74542059803753e-01 8709 18888 -2.80557560879684e+00 8709 18912 -2.23326814143202e+00 8709 18936 -4.97254905233339e-01 8709 18960 -2.19885461768137e-02 8709 18984 -8.46091646237500e-08 8709 19224 -1.58782338679893e-03 8709 19248 -3.05397524757637e-01 8709 19272 -2.74137618073184e+00 8709 19296 -7.56571605479377e+00 8709 19320 -5.99220336649907e+00 8709 19344 -1.41055889312210e+00 8709 19368 -7.95778024835346e-02 8709 19392 -5.60692149366310e-07 8709 19632 -4.98462211108425e-04 8709 19656 -2.08634239809660e-01 8709 19680 -2.02056147413534e+00 8709 19704 -5.80227885164798e+00 8709 19728 -4.54342432343409e+00 8709 19752 -1.07520244867281e+00 8709 19776 -6.33960961775780e-02 8709 19800 -9.73631128109060e-07 8709 20040 -2.95151509768487e-05 8709 20064 -4.17062818071608e-02 8709 20088 -4.46824974409313e-01 8709 20112 -1.33991019064063e+00 8709 20136 -9.98666130461230e-01 8709 20160 -2.24619371477823e-01 8709 20184 -1.20177584135251e-02 8709 20208 -2.22255490871330e-07 8709 20472 -1.55759882964493e-03 8709 20496 -2.25121796792213e-02 8709 20520 -7.39694930109547e-02 8709 20544 -4.55087334551143e-02 8709 20568 -7.63644529673767e-03 8709 20592 -8.79221394985321e-05 8709 20880 -5.66768020861000e-09 8709 20904 -5.74695123481400e-08 8709 20928 -1.44862846263400e-07 8709 20952 -3.47987915137000e-08 8710 8710 1.00000000000000e+00 8711 8711 1.00000000000000e+00 8712 8712 1.00000000000000e+00 8713 8713 1.00000000000000e+00 8714 8714 1.00000000000000e+00 8715 8715 1.00000000000000e+00 8716 8716 1.00000000000000e+00 8717 8717 1.00000000000000e+00 8718 8718 1.00000000000000e+00 8719 8719 1.00000000000000e+00 8720 8720 1.00000000000000e+00 8721 8721 1.00000000000000e+00 8722 8722 1.00000000000000e+00 8723 8723 1.00000000000000e+00 8724 8724 1.00000000000000e+00 8725 8725 1.00000000000000e+00 8726 8726 1.00000000000000e+00 8727 8727 1.00000000000000e+00 8728 8728 1.00000000000000e+00 8729 8729 1.00000000000000e+00 8730 8730 1.00000000000000e+00 8731 8731 1.00000000000000e+00 8732 8732 1.00000000000000e+00 8733 8733 1.32034534890934e+01 8733 6285 2.39720000000000e-16 8733 6309 6.70440000000000e-16 8733 6885 1.15867545269004e-06 8733 6909 1.99496121906751e-04 8733 6933 4.29967431666146e-04 8733 6957 2.44191106880429e-05 8733 6981 2.21431704970470e-07 8733 7005 2.42173700000000e-14 8733 7461 1.29402964269488e-06 8733 7485 3.20501286228352e-03 8733 7509 1.04203715562111e-01 8733 7533 2.35758953438197e-01 8733 7557 9.95804102733956e-02 8733 7581 4.89545672319204e-03 8733 7605 1.45607376990150e-07 8733 7629 8.29700000000000e-17 8733 8061 2.44191106880423e-05 8733 8085 1.05200073412954e-01 8733 8109 1.94392165227317e+00 8733 8133 5.09616803122634e+00 8733 8157 2.02226749522323e+00 8733 8181 1.01104182244151e-01 8733 8205 2.24058402351051e-04 8733 8229 1.27120000000000e-16 8733 8661 3.78755041462763e-04 8733 8685 2.47676792294818e-01 8733 8709 5.12142788929219e+00 8733 8757 5.17337010637301e+00 8733 8781 2.51306149652818e-01 8733 8805 3.83618832664598e-04 8733 9261 2.84168131865542e-04 8733 9285 1.02519668862682e-01 8733 9309 2.02653932949449e+00 8733 9333 5.17540769465832e+00 8733 9357 2.08683207293720e+00 8733 9381 1.07044420043823e-01 8733 9405 1.59114016612106e-05 8733 9861 1.40034993139735e-06 8733 9885 2.99554152661755e-03 8733 9909 1.06063705484245e-01 8733 9933 2.70682180385715e-01 8733 9957 9.94207410797824e-02 8733 9981 4.38303943466947e-03 8733 10005 9.53315919924660e-07 8733 10485 1.93816942058856e-06 8733 10509 3.99813715338238e-05 8733 10533 2.80445054406424e-04 8733 10557 3.16588033027814e-04 8733 10581 5.17030619608320e-07 8733 17664 -3.90152634118470e-07 8733 17688 -4.19657041456251e-06 8733 17712 -1.09340842857506e-05 8733 17736 -2.63632843519918e-06 8733 17760 -9.21392776400000e-11 8733 18024 -2.08894349837000e-09 8733 18048 -8.90212526518251e-04 8733 18072 -2.07758257319015e-02 8733 18096 -8.88788763992195e-02 8733 18120 -9.43825694898251e-02 8733 18144 -2.17405842911070e-02 8733 18168 -6.52984975638916e-04 8733 18432 -5.94104233255175e-05 8733 18456 -3.36791333816438e-02 8733 18480 -4.15890163972259e-01 8733 18504 -1.43848699559364e+00 8733 18528 -1.41063348630127e+00 8733 18552 -3.62480097222256e-01 8733 18576 -2.14258727932300e-02 8733 18600 -6.50044912846620e-07 8733 18840 -2.59752650159821e-04 8733 18864 -1.56910533252354e-01 8733 18888 -1.76536172072493e+00 8733 18912 -5.79840393114085e+00 8733 18936 -5.55216590365657e+00 8733 18960 -1.50118703445928e+00 8733 18984 -1.06356067585760e-01 8733 19008 -2.04089667481579e-05 8733 19248 -1.47971231592432e-04 8733 19272 -1.75776519637661e-01 8733 19296 -2.04795403555762e+00 8733 19320 -6.82542888510070e+00 8733 19344 -6.53788922342889e+00 8733 19368 -1.83374722468628e+00 8733 19392 -1.43215743617078e-01 8733 19416 -7.26598831971743e-05 8733 19656 -2.21422910102269e-05 8733 19680 -4.94282254897328e-02 8733 19704 -6.59599075902187e-01 8733 19728 -2.30931516770855e+00 8733 19752 -2.14744083978141e+00 8733 19776 -5.74376861200495e-01 8733 19800 -4.08970490628925e-02 8733 19824 -2.09075466857397e-05 8733 20088 -3.48186344649808e-03 8733 20112 -6.23061972031633e-02 8733 20136 -2.35972834052833e-01 8733 20160 -2.06892058202002e-01 8733 20184 -4.94140797644601e-02 8733 20208 -2.61242579381700e-03 8733 20232 -7.74689897242070e-07 8733 20496 -3.09439465411300e-06 8733 20520 -2.02821011824119e-04 8733 20544 -7.98683687606945e-04 8733 20568 -3.25705673696323e-04 8733 20592 -3.38155601221640e-05 8734 8734 1.00000000000000e+00 8735 8735 1.00000000000000e+00 8736 8736 1.00000000000000e+00 8737 8737 1.00000000000000e+00 8738 8738 1.00000000000000e+00 8739 8739 1.00000000000000e+00 8740 8740 1.00000000000000e+00 8741 8741 1.00000000000000e+00 8742 8742 1.00000000000000e+00 8743 8743 1.00000000000000e+00 8744 8744 1.00000000000000e+00 8745 8745 1.00000000000000e+00 8746 8746 1.00000000000000e+00 8747 8747 1.00000000000000e+00 8748 8748 1.00000000000000e+00 8749 8749 1.00000000000000e+00 8750 8750 1.00000000000000e+00 8751 8751 1.00000000000000e+00 8752 8752 1.00000000000000e+00 8753 8753 1.00000000000000e+00 8754 8754 1.00000000000000e+00 8755 8755 1.00000000000000e+00 8756 8756 1.00000000000000e+00 8757 8757 1.36444800739710e+01 8757 6909 7.26515781837250e-07 8757 6933 7.05197533765987e-05 8757 6957 3.78755041462758e-04 8757 6981 1.52487309262472e-04 8757 7005 5.23284682600000e-11 8757 7485 3.53353347430290e-07 8757 7509 3.85851679879775e-03 8757 7533 1.04108481663572e-01 8757 7557 2.70606731348377e-01 8757 7581 8.13110836323451e-02 8757 7605 5.11135706757785e-03 8757 7629 4.70536121254527e-06 8757 8085 1.66984562117836e-05 8757 8109 1.05587349081564e-01 8757 8133 2.02145129931117e+00 8757 8157 5.03563186199643e+00 8757 8181 2.15568720645538e+00 8757 8205 1.03852201314302e-01 8757 8229 2.41938520180960e-04 8757 8685 5.56335941560813e-04 8757 8709 2.37311790284686e-01 8757 8733 5.17337010637301e+00 8757 8781 5.27654782800357e+00 8757 8805 2.80845679566273e-01 8757 8829 3.16858225254108e-04 8757 9285 1.62005155421057e-04 8757 9309 1.07957058569069e-01 8757 9333 2.09507042579206e+00 8757 9357 5.19496917949436e+00 8757 9381 2.14319633633398e+00 8757 9405 1.20227799418499e-01 8757 9429 4.63231239090595e-05 8757 9885 2.33219156354427e-06 8757 9909 4.42976897962916e-03 8757 9933 8.59626371374441e-02 8757 9957 2.90694425790975e-01 8757 9981 1.18382376377731e-01 8757 10005 2.98338614606096e-03 8757 10029 2.76280475736869e-06 8757 10509 2.29509986312700e-08 8757 10533 1.76641060064222e-04 8757 10557 2.76673039955497e-04 8757 10581 9.36342827745039e-05 8757 10605 7.65518854573810e-06 8757 17664 -4.56708922212459e-06 8757 17688 -2.01993850345182e-03 8757 17712 -1.29819148068438e-02 8757 17736 -2.21346096836280e-02 8757 17760 -5.97175117773276e-03 8757 17784 -2.50271011591090e-04 8757 18048 -2.69057086099652e-06 8757 18072 -9.35970523369895e-03 8757 18096 -1.52428787926000e-01 8757 18120 -6.27511702787335e-01 8757 18144 -7.65783553595153e-01 8757 18168 -2.32391335660983e-01 8757 18192 -1.85885487822355e-02 8757 18216 -2.87805904174350e-07 8757 18456 -1.41521149777116e-05 8757 18480 -6.46742273828293e-02 8757 18504 -9.64335460689672e-01 8757 18528 -3.78016253433076e+00 8757 18552 -4.40199915461420e+00 8757 18576 -1.40261292381429e+00 8757 18600 -1.28155566331304e-01 8757 18624 -1.43395025777828e-04 8757 18864 -1.62498969958988e-05 8757 18888 -1.24081197234281e-01 8757 18912 -1.80327671377137e+00 8757 18936 -6.94373649909150e+00 8757 18960 -7.93340222138191e+00 8757 18984 -2.64139157095854e+00 8757 19008 -2.64974126596226e-01 8757 19032 -6.29502914319957e-04 8757 19272 -3.38983153372558e-06 8757 19296 -4.94199897693986e-02 8757 19320 -8.64674467026424e-01 8757 19344 -3.51256895453253e+00 8757 19368 -3.97166244870867e+00 8757 19392 -1.29413504052000e+00 8757 19416 -1.26225497284198e-01 8757 19440 -3.83203401246173e-04 8757 19704 -5.60266975200132e-03 8757 19728 -1.30268316315287e-01 8757 19752 -5.59277921064774e-01 8757 19776 -6.13801984343052e-01 8757 19800 -1.90167096788183e-01 8757 19824 -1.72064983002770e-02 8757 19848 -6.02398997712607e-05 8757 20112 -1.96401349981369e-05 8757 20136 -2.75454565147822e-03 8757 20160 -1.26258116673761e-02 8757 20184 -1.02953049434361e-02 8757 20208 -1.94381303127232e-03 8757 20232 -1.03954862092587e-05 8758 8758 1.00000000000000e+00 8759 8759 1.00000000000000e+00 8760 8760 1.00000000000000e+00 8761 8761 1.00000000000000e+00 8762 8762 1.00000000000000e+00 8763 8763 1.00000000000000e+00 8764 8764 1.00000000000000e+00 8765 8765 1.00000000000000e+00 8766 8766 1.00000000000000e+00 8767 8767 1.00000000000000e+00 8768 8768 1.00000000000000e+00 8769 8769 1.00000000000000e+00 8770 8770 1.00000000000000e+00 8771 8771 1.00000000000000e+00 8772 8772 1.00000000000000e+00 8773 8773 1.00000000000000e+00 8774 8774 1.00000000000000e+00 8775 8775 1.00000000000000e+00 8776 8776 1.00000000000000e+00 8777 8777 1.00000000000000e+00 8778 8778 1.00000000000000e+00 8779 8779 1.00000000000000e+00 8780 8780 1.00000000000000e+00 8781 8781 1.45485484512119e+01 8781 6909 3.51291980000000e-13 8781 6933 1.36098486988972e-06 8781 6957 2.84168131865538e-04 8781 6981 1.79724268891036e-04 8781 7005 6.03166389497422e-05 8781 7029 2.19066051226416e-06 8781 7509 3.82862373842000e-09 8781 7533 5.38660454727596e-03 8781 7557 9.45590627379150e-02 8781 7581 2.81305087752589e-01 8781 7605 1.08523138370515e-01 8781 7629 2.88298668641229e-03 8781 7653 8.73668005157801e-06 8781 8109 6.59455841648092e-05 8781 8133 9.29174454274854e-02 8781 8157 2.15151970522629e+00 8781 8181 5.35035677744414e+00 8781 8205 2.30005723638072e+00 8781 8229 1.20361755725483e-01 8781 8253 2.67866754088779e-04 8781 8277 4.20640000000000e-16 8781 8709 5.25146915451610e-04 8781 8733 2.51306149652818e-01 8781 8757 5.27654782800358e+00 8781 8805 6.06166136081308e+00 8781 8829 3.57259474892104e-01 8781 8853 2.69575548313874e-04 8781 8877 1.17839000000000e-15 8781 9309 7.71464689415076e-05 8781 9333 1.09974090606847e-01 8781 9357 2.15188580318626e+00 8781 9381 5.78776746291150e+00 8781 9405 2.49741496761040e+00 8781 9429 1.34764034047414e-01 8781 9453 9.38864787359738e-05 8781 9909 4.62919780307240e-07 8781 9933 5.24590795012676e-03 8781 9957 1.09787995396199e-01 8781 9981 2.82925116133225e-01 8781 10005 1.45180600441259e-01 8781 10029 2.91387883519293e-03 8781 10053 1.23556813447244e-06 8781 10509 1.11133603000000e-12 8781 10533 2.14304096016500e-08 8781 10557 4.54682972154234e-05 8781 10581 6.78079290028168e-04 8781 10605 2.22694656811326e-04 8781 10629 4.55670212600414e-06 8781 11205 1.94460000000000e-16 8781 11229 2.69600000000000e-17 8781 17304 -3.34854865003064e-05 8781 17328 -6.05453066284470e-04 8781 17352 -1.97908944809925e-03 8781 17376 -7.09749042147127e-04 8781 17400 -5.95594804659707e-05 8781 17664 -3.17062769720000e-09 8781 17688 -1.55307223477496e-03 8781 17712 -4.32773454137625e-02 8781 17736 -2.26074176801012e-01 8781 17760 -3.54816042167546e-01 8781 17784 -1.27093248179564e-01 8781 17808 -1.27081830126299e-02 8781 17832 -1.23322260600600e-08 8781 18072 -3.06112379000400e-08 8781 18096 -2.16988591599808e-02 8781 18120 -4.52262731923137e-01 8781 18144 -2.14962332383442e+00 8781 18168 -3.17368962354499e+00 8781 18192 -1.24236010428430e+00 8781 18216 -1.45112262225361e-01 8781 18240 -2.76167595293292e-04 8781 18480 -7.48855361421800e-08 8781 18504 -7.01592677812320e-02 8781 18528 -1.33485408307054e+00 8781 18552 -6.07799992998221e+00 8781 18576 -8.66875421797874e+00 8781 18600 -3.59514649502362e+00 8781 18624 -4.56776305238476e-01 8781 18648 -1.52847645058491e-03 8781 18888 -1.79287271112400e-08 8781 18912 -4.21980672869897e-02 8781 18936 -9.83374149245038e-01 8781 18960 -4.66363090861404e+00 8781 18984 -6.61043386329543e+00 8781 19008 -2.73881420483968e+00 8781 19032 -3.51322853426494e-01 8781 19056 -1.97210171975278e-03 8781 19320 -6.94726832043437e-03 8781 19344 -2.18551967117541e-01 8781 19368 -1.08618188199012e+00 8781 19392 -1.52417843992889e+00 8781 19416 -5.91340677496710e-01 8781 19440 -7.03796648728676e-02 8781 19464 -4.24068021415267e-04 8781 19728 -7.18384143752472e-05 8781 19752 -1.13664813412543e-02 8781 19776 -6.23693251947754e-02 8781 19800 -8.46942034598083e-02 8781 19824 -2.47456816655714e-02 8781 19848 -1.69124856312050e-03 8781 19872 -1.92421531558400e-08 8781 20160 -1.40505858852180e-07 8781 20184 -6.22249116570470e-07 8781 20208 -3.81408583499220e-07 8781 20232 -6.02256811617600e-08 8782 8782 1.00000000000000e+00 8783 8783 1.00000000000000e+00 8784 8784 1.00000000000000e+00 8785 8785 1.00000000000000e+00 8786 8786 1.00000000000000e+00 8787 8787 1.00000000000000e+00 8788 8788 1.00000000000000e+00 8789 8789 1.00000000000000e+00 8790 8790 1.00000000000000e+00 8791 8791 1.00000000000000e+00 8792 8792 1.00000000000000e+00 8793 8793 1.00000000000000e+00 8794 8794 1.00000000000000e+00 8795 8795 1.00000000000000e+00 8796 8796 1.00000000000000e+00 8797 8797 1.00000000000000e+00 8798 8798 1.00000000000000e+00 8799 8799 1.00000000000000e+00 8800 8800 1.00000000000000e+00 8801 8801 1.00000000000000e+00 8802 8802 1.00000000000000e+00 8803 8803 1.00000000000000e+00 8804 8804 1.00000000000000e+00 8805 8805 1.67148947905030e+01 8805 6957 1.40034993139733e-06 8805 6981 1.20323550370873e-04 8805 7005 6.20724038309046e-04 8805 7029 3.45354354387681e-05 8805 7053 1.66357890694850e-07 8805 7077 2.19544460000000e-13 8805 7557 5.51968148406412e-03 8805 7581 1.14020590599322e-01 8805 7605 2.77770045261544e-01 8805 7629 1.33750852826007e-01 8805 7653 5.85510262322277e-03 8805 7677 6.93965276951360e-07 8805 8133 1.21338636937128e-04 8805 8157 8.98139243420841e-02 8805 8181 2.31147641763538e+00 8805 8205 6.10174473440770e+00 8805 8229 2.52076813096791e+00 8805 8253 1.02243790726399e-01 8805 8277 2.13322127890798e-04 8805 8733 3.83618832664598e-04 8805 8757 2.80845679566273e-01 8805 8781 6.06166136081308e+00 8805 8829 5.48682765881346e+00 8805 8853 2.53180377174199e-01 8805 8877 6.26332162683858e-05 8805 9333 7.72839565029901e-05 8805 9357 1.24288913731449e-01 8805 9381 2.48928706355120e+00 8805 9405 6.41976470167613e+00 8805 9429 2.18313486092396e+00 8805 9453 7.91253656423229e-02 8805 9933 7.46695746236253e-06 8805 9957 2.81609474262600e-03 8805 9981 1.37978003661638e-01 8805 10005 3.04211210513153e-01 8805 10029 1.07149062964959e-01 8805 10053 6.51068255958206e-04 8805 10557 2.47633161065666e-06 8805 10581 8.08979821477049e-05 8805 10605 3.22067592846329e-04 8805 10629 1.96678742491974e-04 8805 11205 2.85680000000000e-16 8805 11229 3.96000000000000e-17 8805 16944 -1.21126830761592e-06 8805 16968 -5.13822501368428e-06 8805 16992 -2.38387544049827e-06 8805 17016 -2.93151783220590e-07 8805 17304 -4.63546319988530e-05 8805 17328 -7.58954126479133e-03 8805 17352 -6.09726191576311e-02 8805 17376 -1.37572068971866e-01 8805 17400 -5.10251812906411e-02 8805 17424 -4.92885197545318e-03 8805 17712 -6.15205480232564e-03 8805 17736 -1.90496251634988e-01 8805 17760 -1.11422845009591e+00 8805 17784 -2.01546910711483e+00 8805 17808 -7.34540317333682e-01 8805 17832 -7.96440172054091e-02 8805 18120 -3.00451118904868e-02 8805 18144 -8.56623399539223e-01 8805 18168 -4.74306814100711e+00 8805 18192 -8.10899043378011e+00 8805 18216 -3.00685097530558e+00 8805 18240 -3.54401329386665e-01 8805 18528 -3.06819938875630e-02 8805 18552 -1.02406696179593e+00 8805 18576 -5.86868412923072e+00 8805 18600 -1.02624281112438e+01 8805 18624 -3.99618407387615e+00 8805 18648 -5.13545222136786e-01 8805 18936 -6.87824803542512e-03 8805 18960 -3.28645579300930e-01 8805 18984 -1.98400933919518e+00 8805 19008 -3.53361738223862e+00 8805 19032 -1.35404939750064e+00 8805 19056 -1.68324535039271e-01 8805 19344 -1.86508968564513e-04 8805 19368 -3.06138592859706e-02 8805 19392 -1.98962185579807e-01 8805 19416 -3.59725190024001e-01 8805 19440 -1.30866721526177e-01 8805 19464 -1.46458338405462e-02 8805 19776 -1.52757987606123e-04 8805 19800 -8.34346672447800e-04 8805 19824 -1.04604514369132e-03 8805 19848 -2.23427793991183e-04 8805 19872 -2.82679919691200e-08 8806 8806 1.00000000000000e+00 8807 8807 1.00000000000000e+00 8808 8808 1.00000000000000e+00 8809 8809 1.00000000000000e+00 8810 8810 1.00000000000000e+00 8811 8811 1.00000000000000e+00 8812 8812 1.00000000000000e+00 8813 8813 1.00000000000000e+00 8814 8814 1.00000000000000e+00 8815 8815 1.00000000000000e+00 8816 8816 1.00000000000000e+00 8817 8817 1.00000000000000e+00 8818 8818 1.00000000000000e+00 8819 8819 1.00000000000000e+00 8820 8820 1.00000000000000e+00 8821 8821 1.00000000000000e+00 8822 8822 1.00000000000000e+00 8823 8823 1.00000000000000e+00 8824 8824 1.00000000000000e+00 8825 8825 1.00000000000000e+00 8826 8826 1.00000000000000e+00 8827 8827 1.00000000000000e+00 8828 8828 1.00000000000000e+00 8829 8829 2.08251633581962e+01 8829 6981 1.29078208718043e-05 8829 7005 1.44147466930790e-04 8829 7029 3.89714704487485e-04 8829 7053 1.14998784692895e-04 8829 7077 1.50853894583000e-09 8829 7557 7.04711743687000e-09 8829 7581 4.30756462080172e-03 8829 7605 1.41882974823338e-01 8829 7629 3.38445502301245e-01 8829 7653 1.01036021558391e-01 8829 7677 8.70653938089633e-03 8829 8157 1.28308173330614e-04 8829 8181 1.03318965213877e-01 8829 8205 2.54478197047026e+00 8829 8229 5.95013494598462e+00 8829 8253 4.15240925190618e+00 8829 8277 1.27588687451476e-01 8829 8757 3.16858225254108e-04 8829 8781 3.57259474892104e-01 8829 8805 5.48682765881346e+00 8829 8853 1.20747408504984e+01 8829 8877 4.60996910959770e-02 8829 9357 1.65828879302893e-04 8829 9381 1.41675838469126e-01 8829 9405 2.30610993286478e+00 8829 9429 9.74156077354733e+00 8829 9453 2.93990643686121e+00 8829 9957 1.56403018457284e-05 8829 9981 4.47462327059546e-03 8829 10005 1.22248691713119e-01 8829 10029 3.62451739099552e-01 8829 10053 9.08688838913288e-03 8829 10581 8.30405258521000e-09 8829 10605 2.50863875796688e-04 8829 10629 2.15051154370613e-04 8829 16944 -4.57831467629268e-04 8829 16968 -5.20445063742408e-03 8829 16992 -2.25678303861428e-02 8829 17016 -2.06081244686780e-02 8829 17328 -1.42313807385487e-03 8829 17352 -7.60852993516102e-02 8829 17376 -4.57856882564988e-01 8829 17400 -1.14792032596768e+00 8829 17424 -9.31015863958384e-01 8829 17736 -9.94001768869176e-03 8829 17760 -4.95781694150881e-01 8829 17784 -2.77314972883565e+00 8829 17808 -6.90326339321349e+00 8829 17832 -6.32062101669730e+00 8829 18144 -1.87272890764825e-02 8829 18168 -9.34677063180284e-01 8829 18192 -4.91357092063534e+00 8829 18216 -1.24786044584958e+01 8829 18240 -1.30472690748129e+01 8829 18552 -5.50462311142637e-03 8829 18576 -4.68654027442270e-01 8829 18600 -2.61950144724901e+00 8829 18624 -5.95229647679309e+00 8829 18648 -5.21913909453383e+00 8829 18960 -3.14289429538523e-04 8829 18984 -7.35160147784674e-02 8829 19008 -4.38209835369894e-01 8829 19032 -9.00428623635615e-01 8829 19056 -6.14318709256893e-01 8829 19392 -1.58120002869859e-03 8829 19416 -1.02084568245077e-02 8829 19440 -1.99678375256180e-02 8829 19464 -9.58767802584510e-03 8830 8830 1.00000000000000e+00 8831 8831 1.00000000000000e+00 8832 8832 1.00000000000000e+00 8833 8833 1.00000000000000e+00 8834 8834 1.00000000000000e+00 8835 8835 1.00000000000000e+00 8836 8836 1.00000000000000e+00 8837 8837 1.00000000000000e+00 8838 8838 1.00000000000000e+00 8839 8839 1.00000000000000e+00 8840 8840 1.00000000000000e+00 8841 8841 1.00000000000000e+00 8842 8842 1.00000000000000e+00 8843 8843 1.00000000000000e+00 8844 8844 1.00000000000000e+00 8845 8845 1.00000000000000e+00 8846 8846 1.00000000000000e+00 8847 8847 1.00000000000000e+00 8848 8848 1.00000000000000e+00 8849 8849 1.00000000000000e+00 8850 8850 1.00000000000000e+00 8851 8851 1.00000000000000e+00 8852 8852 1.00000000000000e+00 8853 8853 1.65352612376491e+01 8853 6429 1.01200000000000e-17 8853 6453 6.14500000000000e-17 8853 7005 9.75132400737259e-06 8853 7029 2.14991453078896e-04 8853 7053 1.84499564047511e-04 8853 7077 6.16672890543108e-06 8853 7101 3.84760914064500e-08 8853 7581 5.63269850000800e-07 8853 7605 4.31287933667565e-03 8853 7629 1.01082040273075e-01 8853 7653 4.11150698402194e-01 8853 7677 1.33556506834832e-01 8853 7701 2.17449701422420e-07 8853 8181 1.46665177000229e-04 8853 8205 8.83750882412685e-02 8853 8229 3.20527510274180e+00 8853 8253 9.26996687393122e+00 8853 8277 7.56157576803318e-01 8853 8301 3.19243961200000e-11 8853 8781 2.69575548313874e-04 8853 8805 2.53180377174199e-01 8853 8829 1.20747408504984e+01 8853 8877 1.57248436422913e-01 8853 9381 1.97291361919335e-04 8853 9405 1.34864340673859e-01 8853 9429 4.59301705652275e+00 8853 9453 2.24680920254793e+00 8853 9981 7.77337397786230e-07 8853 10005 9.82793053106743e-03 8853 10029 6.52643325329213e-02 8853 10053 2.08212736614839e-03 8853 10581 1.83791670000000e-12 8853 10605 2.76965240371850e-07 8853 10629 2.65320809328760e-07 8853 16560 -6.61515078038800e-08 8853 16584 -2.00170805911748e-05 8853 16608 -3.95711006277224e-05 8853 16944 -1.45918259762635e-04 8853 16968 -1.07430284427305e-02 8853 16992 -1.97918336106533e-01 8853 17016 -3.24429347867781e-01 8853 17352 -2.80363635072946e-03 8853 17376 -1.56376062952829e-01 8853 17400 -2.26455304050108e+00 8853 17424 -3.50736818545131e+00 8853 17760 -9.42561470530932e-03 8853 17784 -5.14460043694639e-01 8853 17808 -7.40748823356999e+00 8853 17832 -1.14588221436155e+01 8853 18168 -3.81933610700287e-03 8853 18192 -3.17500633505514e-01 8853 18216 -6.80856023493023e+00 8853 18240 -1.14939187741039e+01 8853 18576 -3.99843198830987e-04 8853 18600 -6.49202412504758e-02 8853 18624 -1.58757384800461e+00 8853 18648 -2.73110193042549e+00 8853 19008 -3.70637046823073e-03 8853 19032 -6.76799247529333e-02 8853 19056 -1.09415256228251e-01 8853 19416 -1.83644152629420e-07 8853 19440 -5.06717717815100e-06 8853 19464 -8.84884528789609e-06 8854 8854 1.00000000000000e+00 8855 8855 1.00000000000000e+00 8856 8856 1.00000000000000e+00 8857 8857 1.00000000000000e+00 8858 8858 1.00000000000000e+00 8859 8859 1.00000000000000e+00 8860 8860 1.00000000000000e+00 8861 8861 1.00000000000000e+00 8862 8862 1.00000000000000e+00 8863 8863 1.00000000000000e+00 8864 8864 1.00000000000000e+00 8865 8865 1.00000000000000e+00 8866 8866 1.00000000000000e+00 8867 8867 1.00000000000000e+00 8868 8868 1.00000000000000e+00 8869 8869 1.00000000000000e+00 8870 8870 1.00000000000000e+00 8871 8871 1.00000000000000e+00 8872 8872 1.00000000000000e+00 8873 8873 1.00000000000000e+00 8874 8874 1.00000000000000e+00 8875 8875 1.00000000000000e+00 8876 8876 1.00000000000000e+00 8877 8877 1.00509671531337e+00 8877 6429 6.35000000000000e-18 8877 6453 3.85400000000000e-17 8877 7029 3.07268247464820e-06 8877 7053 6.61673559220372e-06 8877 7077 4.17426610680285e-06 8877 7101 2.60784759250900e-08 8877 7605 1.32826164813373e-06 8877 7629 1.60503283768704e-03 8877 7653 3.70617261712408e-02 8877 7677 1.55949680715280e-02 8877 7701 1.47384460888310e-07 8877 8205 1.00310287655636e-04 8877 8229 3.21160075323183e-02 8877 8253 3.02172057297925e-01 8877 8277 5.97228003931940e-02 8877 8301 2.16381754700000e-11 8877 8781 1.17839000000000e-15 8877 8805 6.26332162683858e-05 8877 8829 4.60996910959770e-02 8877 8853 1.57248436422913e-01 8877 9381 4.22030000000000e-16 8877 9405 4.47785888509600e-08 8877 9429 9.81314367921115e-04 8877 9453 1.67498720578745e-03 8877 10029 4.36402672700000e-11 8877 10053 1.57623610900000e-11 8877 16560 -4.14899663859000e-08 8877 16584 -1.35540959531506e-05 8877 16608 -2.68177621416000e-05 8877 16968 -2.99572453049502e-04 8877 16992 -2.00238148159735e-02 8877 17016 -3.79506224606006e-02 8877 17376 -1.46097158628628e-03 8877 17400 -9.76740571613031e-02 8877 17424 -1.85121313218602e-01 8877 17784 -1.35262437329917e-03 8877 17808 -9.11000637037568e-02 8877 17832 -1.72731756794419e-01 8877 18192 -2.63309666699969e-04 8877 18216 -1.77902210357923e-02 8877 18240 -3.37372744046849e-02 8877 18600 -1.38577897776000e-09 8877 18624 -2.02792477156881e-06 8877 18648 -4.04614909029327e-06 8878 8878 1.00000000000000e+00 8879 8879 1.00000000000000e+00 8880 8880 1.00000000000000e+00 8881 8881 1.00000000000000e+00 8882 8882 1.00000000000000e+00 8883 8883 1.00000000000000e+00 8884 8884 1.00000000000000e+00 8885 8885 1.00000000000000e+00 8886 8886 1.00000000000000e+00 8887 8887 1.00000000000000e+00 8888 8888 1.00000000000000e+00 8889 8889 1.00000000000000e+00 8890 8890 1.00000000000000e+00 8891 8891 1.00000000000000e+00 8892 8892 1.00000000000000e+00 8893 8893 1.00000000000000e+00 8894 8894 1.00000000000000e+00 8895 8895 1.00000000000000e+00 8896 8896 1.00000000000000e+00 8897 8897 1.00000000000000e+00 8898 8898 1.00000000000000e+00 8899 8899 1.00000000000000e+00 8900 8900 1.00000000000000e+00 8901 8901 1.00000000000000e+00 8902 8902 1.00000000000000e+00 8903 8903 1.00000000000000e+00 8904 8904 1.00000000000000e+00 8905 8905 1.00000000000000e+00 8906 8906 1.00000000000000e+00 8907 8907 1.00000000000000e+00 8908 8908 1.00000000000000e+00 8909 8909 1.00000000000000e+00 8910 8910 1.00000000000000e+00 8911 8911 1.00000000000000e+00 8912 8912 1.00000000000000e+00 8913 8913 1.00000000000000e+00 8914 8914 1.00000000000000e+00 8915 8915 1.00000000000000e+00 8916 8916 1.00000000000000e+00 8917 8917 1.00000000000000e+00 8918 8918 1.00000000000000e+00 8919 8919 1.00000000000000e+00 8920 8920 1.00000000000000e+00 8921 8921 1.00000000000000e+00 8922 8922 1.00000000000000e+00 8923 8923 1.00000000000000e+00 8924 8924 1.00000000000000e+00 8925 8925 1.00000000000000e+00 8926 8926 1.00000000000000e+00 8927 8927 1.00000000000000e+00 8928 8928 1.00000000000000e+00 8929 8929 1.00000000000000e+00 8930 8930 1.00000000000000e+00 8931 8931 1.00000000000000e+00 8932 8932 1.00000000000000e+00 8933 8933 1.00000000000000e+00 8934 8934 1.00000000000000e+00 8935 8935 1.00000000000000e+00 8936 8936 1.00000000000000e+00 8937 8937 1.00000000000000e+00 8938 8938 1.00000000000000e+00 8939 8939 1.00000000000000e+00 8940 8940 1.00000000000000e+00 8941 8941 1.00000000000000e+00 8942 8942 1.00000000000000e+00 8943 8943 1.00000000000000e+00 8944 8944 1.00000000000000e+00 8945 8945 1.00000000000000e+00 8946 8946 1.00000000000000e+00 8947 8947 1.00000000000000e+00 8948 8948 1.00000000000000e+00 8949 8949 1.00000000000000e+00 8950 8950 1.00000000000000e+00 8951 8951 1.00000000000000e+00 8952 8952 1.00000000000000e+00 8953 8953 1.00000000000000e+00 8954 8954 1.00000000000000e+00 8955 8955 1.00000000000000e+00 8956 8956 1.00000000000000e+00 8957 8957 1.00000000000000e+00 8958 8958 1.00000000000000e+00 8959 8959 1.00000000000000e+00 8960 8960 1.00000000000000e+00 8961 8961 1.00000000000000e+00 8962 8962 1.00000000000000e+00 8963 8963 1.00000000000000e+00 8964 8964 1.00000000000000e+00 8965 8965 1.00000000000000e+00 8966 8966 1.00000000000000e+00 8967 8967 1.00000000000000e+00 8968 8968 1.00000000000000e+00 8969 8969 1.00000000000000e+00 8970 8970 1.00000000000000e+00 8971 8971 1.00000000000000e+00 8972 8972 1.00000000000000e+00 8973 8973 1.00000000000000e+00 8974 8974 1.00000000000000e+00 8975 8975 1.00000000000000e+00 8976 8976 1.00000000000000e+00 8977 8977 1.00000000000000e+00 8978 8978 1.00000000000000e+00 8979 8979 1.00000000000000e+00 8980 8980 1.00000000000000e+00 8981 8981 1.00000000000000e+00 8982 8982 1.00000000000000e+00 8983 8983 1.00000000000000e+00 8984 8984 1.00000000000000e+00 8985 8985 1.00000000000000e+00 8986 8986 1.00000000000000e+00 8987 8987 1.00000000000000e+00 8988 8988 1.00000000000000e+00 8989 8989 1.00000000000000e+00 8990 8990 1.00000000000000e+00 8991 8991 1.00000000000000e+00 8992 8992 1.00000000000000e+00 8993 8993 1.00000000000000e+00 8994 8994 1.00000000000000e+00 8995 8995 1.00000000000000e+00 8996 8996 1.00000000000000e+00 8997 8997 1.00000000000000e+00 8998 8998 1.00000000000000e+00 8999 8999 1.00000000000000e+00 9000 9000 1.00000000000000e+00 9001 9001 1.00000000000000e+00 9002 9002 1.00000000000000e+00 9003 9003 1.00000000000000e+00 9004 9004 1.00000000000000e+00 9005 9005 1.00000000000000e+00 9006 9006 1.00000000000000e+00 9007 9007 1.00000000000000e+00 9008 9008 1.00000000000000e+00 9009 9009 1.00000000000000e+00 9010 9010 1.00000000000000e+00 9011 9011 1.00000000000000e+00 9012 9012 1.00000000000000e+00 9013 9013 1.00000000000000e+00 9014 9014 1.00000000000000e+00 9015 9015 1.00000000000000e+00 9016 9016 1.00000000000000e+00 9017 9017 1.00000000000000e+00 9018 9018 1.00000000000000e+00 9019 9019 1.00000000000000e+00 9020 9020 1.00000000000000e+00 9021 9021 1.00000000000000e+00 9022 9022 1.00000000000000e+00 9023 9023 1.00000000000000e+00 9024 9024 1.00000000000000e+00 9025 9025 1.00000000000000e+00 9026 9026 1.00000000000000e+00 9027 9027 1.00000000000000e+00 9028 9028 1.00000000000000e+00 9029 9029 1.00000000000000e+00 9030 9030 1.00000000000000e+00 9031 9031 1.00000000000000e+00 9032 9032 1.00000000000000e+00 9033 9033 1.00000000000000e+00 9034 9034 1.00000000000000e+00 9035 9035 1.00000000000000e+00 9036 9036 1.00000000000000e+00 9037 9037 1.00000000000000e+00 9038 9038 1.00000000000000e+00 9039 9039 1.00000000000000e+00 9040 9040 1.00000000000000e+00 9041 9041 1.00000000000000e+00 9042 9042 1.00000000000000e+00 9043 9043 1.00000000000000e+00 9044 9044 1.00000000000000e+00 9045 9045 1.00000000000000e+00 9046 9046 1.00000000000000e+00 9047 9047 1.00000000000000e+00 9048 9048 1.00000000000000e+00 9049 9049 1.00000000000000e+00 9050 9050 1.00000000000000e+00 9051 9051 1.00000000000000e+00 9052 9052 1.00000000000000e+00 9053 9053 1.00000000000000e+00 9054 9054 1.00000000000000e+00 9055 9055 1.00000000000000e+00 9056 9056 1.00000000000000e+00 9057 9057 1.00000000000000e+00 9058 9058 1.00000000000000e+00 9059 9059 1.00000000000000e+00 9060 9060 1.00000000000000e+00 9061 9061 1.00000000000000e+00 9062 9062 1.00000000000000e+00 9063 9063 1.00000000000000e+00 9064 9064 1.00000000000000e+00 9065 9065 1.00000000000000e+00 9066 9066 1.00000000000000e+00 9067 9067 1.00000000000000e+00 9068 9068 1.00000000000000e+00 9069 9069 1.00000000000000e+00 9070 9070 1.00000000000000e+00 9071 9071 1.00000000000000e+00 9072 9072 1.00000000000000e+00 9073 9073 1.00000000000000e+00 9074 9074 1.00000000000000e+00 9075 9075 1.00000000000000e+00 9076 9076 1.00000000000000e+00 9077 9077 1.00000000000000e+00 9078 9078 1.00000000000000e+00 9079 9079 1.00000000000000e+00 9080 9080 1.00000000000000e+00 9081 9081 1.00000000000000e+00 9082 9082 1.00000000000000e+00 9083 9083 1.00000000000000e+00 9084 9084 1.00000000000000e+00 9085 9085 1.00000000000000e+00 9086 9086 1.00000000000000e+00 9087 9087 1.00000000000000e+00 9088 9088 1.00000000000000e+00 9089 9089 1.00000000000000e+00 9090 9090 1.00000000000000e+00 9091 9091 1.00000000000000e+00 9092 9092 1.00000000000000e+00 9093 9093 1.00118062439057e+00 9093 7317 3.38261348833630e-07 9093 7341 2.84965056096460e-07 9093 7893 5.45386769826279e-05 9093 7917 7.20909761037705e-03 9093 7941 2.79091754131914e-03 9093 7965 4.55990495249529e-06 9093 8493 6.14289272445787e-03 9093 8517 1.09822659070730e-01 9093 8541 2.33776633015670e-02 9093 8565 7.20900767794627e-05 9093 9117 2.46870374499713e-02 9093 9141 1.06727575900906e-02 9093 9165 4.59011807340407e-05 9093 20712 -2.20520863822568e-03 9093 20736 -1.19559189827216e-03 9093 20760 -2.65678797598047e-05 9093 21120 -3.88419704019062e-02 9093 21144 -2.76749461282611e-02 9093 21168 -2.35827455065941e-03 9093 21528 -6.22474803362327e-02 9093 21552 -4.69807489686170e-02 9093 21576 -4.53057394300020e-03 9094 9094 1.00000000000000e+00 9095 9095 1.00000000000000e+00 9096 9096 1.00000000000000e+00 9097 9097 1.00000000000000e+00 9098 9098 1.00000000000000e+00 9099 9099 1.00000000000000e+00 9100 9100 1.00000000000000e+00 9101 9101 1.00000000000000e+00 9102 9102 1.00000000000000e+00 9103 9103 1.00000000000000e+00 9104 9104 1.00000000000000e+00 9105 9105 1.00000000000000e+00 9106 9106 1.00000000000000e+00 9107 9107 1.00000000000000e+00 9108 9108 1.00000000000000e+00 9109 9109 1.00000000000000e+00 9110 9110 1.00000000000000e+00 9111 9111 1.00000000000000e+00 9112 9112 1.00000000000000e+00 9113 9113 1.00000000000000e+00 9114 9114 1.00000000000000e+00 9115 9115 1.00000000000000e+00 9116 9116 1.00000000000000e+00 9117 9117 2.89240257957883e+00 9117 7317 1.01894477122349e-05 9117 7341 8.82040844097349e-06 9117 7365 4.80711473218400e-08 9117 7389 8.34516350000000e-13 9117 7893 9.64122588329139e-04 9117 7917 2.17844836818968e-01 9117 7941 1.45416647043225e-01 9117 7965 4.32657486010449e-03 9117 7989 1.16629760528204e-06 9117 8493 1.19790234883612e-01 9117 8517 4.66704907915610e+00 9117 8541 3.18335899755214e+00 9117 8565 1.29727964301457e-01 9117 8589 2.54420757694269e-04 9117 9093 2.46870374499713e-02 9117 9141 2.93723459434137e+00 9117 9165 3.21523235303120e-01 9117 9189 7.09412875459559e-05 9117 9741 1.48846185431150e-02 9117 9765 1.18136420444714e-02 9117 20304 -2.73434565390910e-07 9117 20328 -1.32403957025803e-06 9117 20352 -1.19463980016843e-06 9117 20376 -2.30301308694380e-07 9117 20712 -8.07620712877326e-02 9117 20736 -1.04039244321087e-01 9117 20760 -3.66291396137360e-02 9117 20784 -4.96490615160427e-03 9117 21120 -1.21722609796364e+00 9117 21144 -2.63427490152784e+00 9117 21168 -1.03543496275688e+00 9117 21192 -1.22950809007928e-01 9117 21528 -1.86912480621186e+00 9117 21552 -4.54030951783689e+00 9117 21576 -1.81449700885241e+00 9117 21600 -2.11153262788652e-01 9118 9118 1.00000000000000e+00 9119 9119 1.00000000000000e+00 9120 9120 1.00000000000000e+00 9121 9121 1.00000000000000e+00 9122 9122 1.00000000000000e+00 9123 9123 1.00000000000000e+00 9124 9124 1.00000000000000e+00 9125 9125 1.00000000000000e+00 9126 9126 1.00000000000000e+00 9127 9127 1.00000000000000e+00 9128 9128 1.00000000000000e+00 9129 9129 1.00000000000000e+00 9130 9130 1.00000000000000e+00 9131 9131 1.00000000000000e+00 9132 9132 1.00000000000000e+00 9133 9133 1.00000000000000e+00 9134 9134 1.00000000000000e+00 9135 9135 1.00000000000000e+00 9136 9136 1.00000000000000e+00 9137 9137 1.00000000000000e+00 9138 9138 1.00000000000000e+00 9139 9139 1.00000000000000e+00 9140 9140 1.00000000000000e+00 9141 9141 2.09499843293973e+01 9141 7317 1.74314569669890e-05 9141 7341 2.53629710191410e-04 9141 7365 1.55156966074483e-04 9141 7389 1.80315251593800e-08 9141 7893 2.13706456323185e-04 9141 7917 1.27181616251686e-01 9141 7941 2.82792704146777e-01 9141 7965 1.15026971954080e-01 9141 7989 5.91766666038560e-03 9141 8013 1.78071334005418e-05 9141 8493 4.36793967859321e-02 9141 8517 4.64065275503846e+00 9141 8541 1.09723187831807e+01 9141 8565 3.09914208319468e+00 9141 8589 1.02944973256481e-01 9141 8613 1.72881141110545e-04 9141 9093 1.06727575900906e-02 9141 9117 2.93723459434137e+00 9141 9165 9.91943451262257e+00 9141 9189 3.98093749650474e-01 9141 9213 3.73082498911614e-04 9141 9741 4.31840613477259e-01 9141 9765 1.35780839835572e+00 9141 9789 1.56701631720268e-01 9141 9813 2.73574244309968e-04 9141 10365 5.22093285751330e-06 9141 10389 4.99765527714214e-05 9141 10413 1.07430315361200e-08 9141 20304 -2.15737240607035e-04 9141 20328 -6.78156064318135e-03 9141 20352 -2.56556343381732e-02 9141 20376 -1.29804131789666e-02 9141 20400 -1.76545037455334e-03 9141 20712 -5.34115908914581e-02 9141 20736 -3.64114134599589e-01 9141 20760 -8.81159512977710e-01 9141 20784 -3.82150713253353e-01 9141 20808 -4.67880445595032e-02 9141 20832 -2.64700801715131e-04 9141 21120 -8.20147575343329e-01 9141 21144 -5.11981516898460e+00 9141 21168 -1.01045841424140e+01 9141 21192 -4.52174059881939e+00 9141 21216 -6.32999049357058e-01 9141 21240 -1.42217084326026e-02 9141 21528 -1.27202318270223e+00 9141 21552 -7.86715197249476e+00 9141 21576 -1.47080981867763e+01 9141 21600 -6.70591694751842e+00 9141 21624 -9.84383496535981e-01 9141 21648 -2.65905112531993e-02 9142 9142 1.00000000000000e+00 9143 9143 1.00000000000000e+00 9144 9144 1.00000000000000e+00 9145 9145 1.00000000000000e+00 9146 9146 1.00000000000000e+00 9147 9147 1.00000000000000e+00 9148 9148 1.00000000000000e+00 9149 9149 1.00000000000000e+00 9150 9150 1.00000000000000e+00 9151 9151 1.00000000000000e+00 9152 9152 1.00000000000000e+00 9153 9153 1.00000000000000e+00 9154 9154 1.00000000000000e+00 9155 9155 1.00000000000000e+00 9156 9156 1.00000000000000e+00 9157 9157 1.00000000000000e+00 9158 9158 1.00000000000000e+00 9159 9159 1.00000000000000e+00 9160 9160 1.00000000000000e+00 9161 9161 1.00000000000000e+00 9162 9162 1.00000000000000e+00 9163 9163 1.00000000000000e+00 9164 9164 1.00000000000000e+00 9165 9165 2.52133658919633e+01 9165 6741 2.37500000000000e-16 9165 6765 1.70813000000000e-15 9165 7317 5.17938663274502e-06 9165 7341 2.94496133374696e-04 9165 7365 4.30184941155473e-04 9165 7389 7.38617469010402e-05 9165 7413 2.33546346859166e-06 9165 7893 7.09230616116290e-07 9165 7917 2.98352467610294e-03 9165 7941 1.37148490235051e-01 9165 7965 3.88254869960613e-01 9165 7989 1.59134713973779e-01 9165 8013 3.14962360091572e-03 9165 8037 6.98380998805087e-06 9165 8493 1.80194811187154e-04 9165 8517 2.45504972402709e-01 9165 8541 3.76737230205425e+00 9165 8565 5.81461242173245e+00 9165 8589 2.28682142390904e+00 9165 8613 1.41458480609620e-01 9165 8637 1.01435749871596e-04 9165 9093 4.59011807340407e-05 9165 9117 3.21523235303120e-01 9165 9141 9.91943451262257e+00 9165 9189 8.30042343340759e+00 9165 9213 2.84023234766722e-01 9165 9237 4.71482473101218e-04 9165 9741 6.74357737899612e-01 9165 9765 8.47559702554792e+00 9165 9789 6.37363411517381e+00 9165 9813 1.65911619907654e-01 9165 9837 1.28078995586539e-04 9165 10365 5.01825510064360e-04 9165 10389 2.29883960010649e-02 9165 10413 9.74515294596663e-03 9165 19920 -2.68148023391800e-08 9165 19944 -1.91637324661204e-04 9165 19968 -9.09969541231160e-04 9165 19992 -7.66819923937578e-04 9165 20016 -1.43822464621433e-04 9165 20304 -7.56520811581509e-05 9165 20328 -1.94860308560980e-02 9165 20352 -1.63888366341898e-01 9165 20376 -4.02728245207720e-01 9165 20400 -2.28262293221430e-01 9165 20424 -3.63021842950981e-02 9165 20448 -2.68364539589388e-04 9165 20712 -1.65556807285412e-03 9165 20736 -2.02228954966389e-01 9165 20760 -1.39480511332750e+00 9165 20784 -2.92410451374048e+00 9165 20808 -1.76103804557890e+00 9165 20832 -3.17162331399180e-01 9165 20856 -7.88893963817172e-03 9165 21120 -8.34695865135706e-03 9165 21144 -9.48787970187852e-01 9165 21168 -5.92201974611269e+00 9165 21192 -1.16102424187961e+01 9165 21216 -9.05696095074192e+00 9165 21240 -1.92125528213328e+00 9165 21264 -5.86754948615230e-02 9165 21528 -7.07189490284724e-03 9165 21552 -9.88607456833696e-01 9165 21576 -6.32291240333007e+00 9165 21600 -1.31344205713102e+01 9165 21624 -1.16470936735668e+01 9165 21648 -2.55228025707658e+00 9165 21672 -6.91058902851681e-02 9166 9166 1.00000000000000e+00 9167 9167 1.00000000000000e+00 9168 9168 1.00000000000000e+00 9169 9169 1.00000000000000e+00 9170 9170 1.00000000000000e+00 9171 9171 1.00000000000000e+00 9172 9172 1.00000000000000e+00 9173 9173 1.00000000000000e+00 9174 9174 1.00000000000000e+00 9175 9175 1.00000000000000e+00 9176 9176 1.00000000000000e+00 9177 9177 1.00000000000000e+00 9178 9178 1.00000000000000e+00 9179 9179 1.00000000000000e+00 9180 9180 1.00000000000000e+00 9181 9181 1.00000000000000e+00 9182 9182 1.00000000000000e+00 9183 9183 1.00000000000000e+00 9184 9184 1.00000000000000e+00 9185 9185 1.00000000000000e+00 9186 9186 1.00000000000000e+00 9187 9187 1.00000000000000e+00 9188 9188 1.00000000000000e+00 9189 9189 1.66107668831667e+01 9189 6741 1.61450000000000e-16 9189 6765 1.16118000000000e-15 9189 7341 7.44503075326058e-06 9189 7365 2.12410211905863e-04 9189 7389 6.38231870732993e-04 9189 7413 4.76842667935607e-05 9189 7437 1.51877667859400e-08 9189 7461 1.07492419000000e-12 9189 7917 1.85443126627622e-06 9189 7941 3.82984705123400e-03 9189 7965 1.63787166671290e-01 9189 7989 3.08047702966219e-01 9189 8013 1.12349617391641e-01 9189 8037 5.78011380667533e-03 9189 8061 5.17030619608300e-07 9189 8517 1.20547285967303e-04 9189 8541 1.06494160843871e-01 9189 8565 2.30136421296780e+00 9189 8589 6.43803972467902e+00 9189 8613 2.63300019074901e+00 9189 8637 1.33641182211231e-01 9189 8661 9.36342827745027e-05 9189 9117 7.09412875459559e-05 9189 9141 3.98093749650474e-01 9189 9165 8.30042343340759e+00 9189 9213 6.38956406917380e+00 9189 9237 3.19722565471048e-01 9189 9261 6.78079290028203e-04 9189 9741 5.71113368287837e-02 9189 9765 4.37323350928711e+00 9189 9789 9.48469133812496e+00 9189 9813 2.75103404825546e+00 9189 9837 9.18742608481290e-02 9189 9861 8.08979821477098e-05 9189 10365 8.16320942124758e-04 9189 10389 1.62292688555024e-01 9189 10413 1.54296983896813e-01 9189 10437 6.97895973065628e-03 9189 10461 8.30405258521000e-09 9189 11013 1.02677524531000e-09 9189 11037 4.08628167584000e-09 9189 11061 1.83791670000000e-12 9189 19560 -3.73102447881600e-08 9189 19584 -2.47764597396870e-07 9189 19608 -4.31404717765020e-07 9189 19632 -9.85236182442100e-08 9189 19920 -1.82286164144400e-08 9189 19944 -1.46560958747288e-03 9189 19968 -2.30088250458341e-02 9189 19992 -8.21777190579337e-02 9189 20016 -6.57338060232593e-02 9189 20040 -1.24654553297142e-02 9189 20064 -8.49783613857441e-05 9189 20328 -6.16935639697755e-04 9189 20352 -7.56563029286511e-02 9189 20376 -6.47334861429464e-01 9189 20400 -1.73717993124594e+00 9189 20424 -1.35589596977103e+00 9189 20448 -2.85679637321201e-01 9189 20472 -9.38575092160662e-03 9189 20736 -2.80648045101099e-03 9189 20760 -3.35634600221818e-01 9189 20784 -2.74934680092509e+00 9189 20808 -7.16654941689153e+00 9189 20832 -5.68289186565247e+00 9189 20856 -1.23817040319280e+00 9189 20880 -4.79131606910248e-02 9189 20904 -3.67222075893600e-08 9189 21144 -1.97299421219385e-03 9189 21168 -3.45089594634300e-01 9189 21192 -3.50368766140368e+00 9189 21216 -1.02980360621152e+01 9189 21240 -7.61855577416950e+00 9189 21264 -1.62540162070135e+00 9189 21288 -6.90657784007974e-02 9189 21312 -2.10202261173670e-07 9189 21552 -3.39183723660178e-04 9189 21576 -1.65636733875931e-01 9189 21600 -2.36081159036061e+00 9189 21624 -7.62575536054923e+00 9189 21648 -4.33414068707059e+00 9189 21672 -8.02167487971877e-01 9189 21696 -3.85260548717765e-02 9189 21720 -1.63349069221820e-07 9190 9190 1.00000000000000e+00 9191 9191 1.00000000000000e+00 9192 9192 1.00000000000000e+00 9193 9193 1.00000000000000e+00 9194 9194 1.00000000000000e+00 9195 9195 1.00000000000000e+00 9196 9196 1.00000000000000e+00 9197 9197 1.00000000000000e+00 9198 9198 1.00000000000000e+00 9199 9199 1.00000000000000e+00 9200 9200 1.00000000000000e+00 9201 9201 1.00000000000000e+00 9202 9202 1.00000000000000e+00 9203 9203 1.00000000000000e+00 9204 9204 1.00000000000000e+00 9205 9205 1.00000000000000e+00 9206 9206 1.00000000000000e+00 9207 9207 1.00000000000000e+00 9208 9208 1.00000000000000e+00 9209 9209 1.00000000000000e+00 9210 9210 1.00000000000000e+00 9211 9211 1.00000000000000e+00 9212 9212 1.00000000000000e+00 9213 9213 1.69611461768898e+01 9213 7365 6.81126937739475e-06 9213 7389 9.68204573979322e-05 9213 7413 2.74904578863928e-04 9213 7437 1.76444125597537e-04 9213 7461 3.05027687506100e-08 9213 7941 3.03133255660085e-06 9213 7965 3.35210990307821e-03 9213 7989 1.22356735855191e-01 9213 8013 3.12738875079109e-01 9213 8037 9.21548851110089e-02 9213 8061 4.38303943466957e-03 9213 8085 2.33359908483919e-06 9213 8541 4.77661153452600e-05 9213 8565 1.35101238191691e-01 9213 8589 2.61139860278913e+00 9213 8613 6.29112857326259e+00 9213 8637 2.39295414762293e+00 9213 8661 1.18382376377729e-01 9213 8685 1.80679317919330e-04 9213 9141 3.73082498911614e-04 9213 9165 2.84023234766722e-01 9213 9189 6.38956406917380e+00 9213 9237 6.44362061844847e+00 9213 9261 2.82925116133220e-01 9213 9285 6.00232747143569e-04 9213 9741 1.48757014544798e-04 9213 9765 1.15120413221381e-01 9213 9789 2.47430333521984e+00 9213 9813 5.30068757924913e+00 9213 9837 2.38090503758773e+00 9213 9861 1.37978003661634e-01 9213 9885 1.86095276753447e-05 9213 10365 8.29054817407601e-05 9213 10389 6.68679335058813e-02 9213 10413 2.68021749546517e-01 9213 10437 1.05217503878585e-01 9213 10461 4.47462327059536e-03 9213 10485 5.57780449472120e-07 9213 11013 1.13653088228283e-05 9213 11037 6.46479002001124e-05 9213 11061 7.77337397786240e-07 9213 19560 -7.48228670978547e-06 9213 19584 -1.79342829018033e-03 9213 19608 -9.66017648426737e-03 9213 19632 -1.21795169504234e-02 9213 19656 -2.68360686543643e-03 9213 19680 -2.12273103108987e-05 9213 19944 -4.99741004107998e-05 9213 19968 -1.62013567064914e-02 9213 19992 -1.94900128605103e-01 9213 20016 -6.58101042165434e-01 9213 20040 -6.12047630761552e-01 9213 20064 -1.43978339114222e-01 9213 20088 -6.31400259870918e-03 9213 20352 -3.42380297403747e-04 9213 20376 -1.30904245935936e-01 9213 20400 -1.46587366422920e+00 9213 20424 -4.72026243498148e+00 9213 20448 -4.21473093150741e+00 9213 20472 -1.05198764373597e+00 9213 20496 -6.27299216796503e-02 9213 20520 -6.01422878122641e-06 9213 20760 -6.20042783016749e-04 9213 20784 -2.94623651010246e-01 9213 20808 -3.24277390371000e+00 9213 20832 -1.02349311736186e+01 9213 20856 -8.83501779089264e+00 9213 20880 -2.31875979400024e+00 9213 20904 -1.67675406492184e-01 9213 20928 -2.73173367878581e-05 9213 21168 -1.43016294015581e-04 9213 21192 -1.23074941957576e-01 9213 21216 -1.56020234216349e+00 9213 21240 -5.10178297208434e+00 9213 21264 -3.94528752716499e+00 9213 21288 -1.01464558466504e+00 9213 21312 -7.89606507668563e-02 9213 21336 -1.90559154330363e-05 9213 21576 -1.33099563758210e-07 9213 21600 -1.84717084370415e-02 9213 21624 -2.77611194666461e-01 9213 21648 -9.47053835614475e-01 9213 21672 -6.68819689456887e-01 9213 21696 -1.55218139672086e-01 9213 21720 -1.03974540170888e-02 9213 21744 -3.26042166295247e-06 9214 9214 1.00000000000000e+00 9215 9215 1.00000000000000e+00 9216 9216 1.00000000000000e+00 9217 9217 1.00000000000000e+00 9218 9218 1.00000000000000e+00 9219 9219 1.00000000000000e+00 9220 9220 1.00000000000000e+00 9221 9221 1.00000000000000e+00 9222 9222 1.00000000000000e+00 9223 9223 1.00000000000000e+00 9224 9224 1.00000000000000e+00 9225 9225 1.00000000000000e+00 9226 9226 1.00000000000000e+00 9227 9227 1.00000000000000e+00 9228 9228 1.00000000000000e+00 9229 9229 1.00000000000000e+00 9230 9230 1.00000000000000e+00 9231 9231 1.00000000000000e+00 9232 9232 1.00000000000000e+00 9233 9233 1.00000000000000e+00 9234 9234 1.00000000000000e+00 9235 9235 1.00000000000000e+00 9236 9236 1.00000000000000e+00 9237 9237 1.55068125774855e+01 9237 7389 4.10056075839960e-07 9237 7413 3.16321383374554e-04 9237 7437 2.80163312061426e-04 9237 7461 3.57994833680469e-05 9237 7485 1.89681802581380e-06 9237 7965 8.42870972887720e-07 9237 7989 4.93536473027622e-03 9237 8013 1.06238221895660e-01 9237 8037 2.74627686916336e-01 9237 8061 1.07044420043825e-01 9237 8085 3.05267476070694e-03 9237 8109 1.37306196538332e-06 9237 8565 2.10763663817746e-05 9237 8589 1.29959229577416e-01 9237 8613 2.38740455251692e+00 9237 8637 5.68740314343198e+00 9237 8661 2.14319633633400e+00 9237 8685 1.04998272549909e-01 9237 8709 2.90316706081261e-04 9237 9165 4.71482473101218e-04 9237 9189 3.19722565471048e-01 9237 9213 6.44362061844847e+00 9237 9261 5.78776746291149e+00 9237 9285 2.78594960790357e-01 9237 9309 3.76580666462597e-04 9237 9765 2.34927877494194e-04 9237 9789 9.66358510578650e-02 9237 9813 2.39184467225713e+00 9237 9837 6.56471963283403e+00 9237 9861 2.48928706355115e+00 9237 9885 1.28294801162541e-01 9237 9909 3.05226841770282e-05 9237 10365 5.61618000186800e-08 9237 10389 3.56458842680593e-03 9237 10413 9.43923886567089e-02 9237 10437 2.76348776783459e-01 9237 10461 1.41675838469124e-01 9237 10485 4.36077583164116e-03 9237 10509 1.67959048382326e-06 9237 11013 2.18137199729480e-05 9237 11037 4.20437398965713e-04 9237 11061 1.97291361919340e-04 9237 11085 1.54657054999068e-06 9237 11661 4.22030000000000e-16 9237 11685 1.50650000000000e-16 9237 19200 -2.76739317972467e-05 9237 19224 -2.81844181765466e-04 9237 19248 -7.15434311001539e-04 9237 19272 -1.83814698169986e-04 9237 19296 -3.16656089837684e-06 9237 19560 -5.47964570785980e-07 9237 19584 -2.41400275343930e-03 9237 19608 -4.71831589024664e-02 9237 19632 -2.01108282090769e-01 9237 19656 -2.35359211128363e-01 9237 19680 -6.29703485864411e-02 9237 19704 -3.60383670497818e-03 9237 19968 -1.67984462863557e-05 9237 19992 -4.20503355344792e-02 9237 20016 -5.99376677632743e-01 9237 20040 -2.25808474336944e+00 9237 20064 -2.44933938889466e+00 9237 20088 -7.15791459635724e-01 9237 20112 -5.64564483220383e-02 9237 20136 -2.84457677356842e-05 9237 20376 -5.96109218410204e-05 9237 20400 -1.56845308931473e-01 9237 20424 -2.05289357518908e+00 9237 20448 -7.39535321592705e+00 9237 20472 -7.77456076509341e+00 9237 20496 -2.39601445015480e+00 9237 20520 -2.16482774683163e-01 9237 20544 -2.02465739836177e-04 9237 20784 -1.71530090327612e-05 9237 20808 -1.32485464574335e-01 9237 20832 -1.87406138757872e+00 9237 20856 -6.98854935785926e+00 9237 20880 -7.47852153566612e+00 9237 20904 -2.35758391105403e+00 9237 20928 -2.21176604075138e-01 9237 20952 -3.83180860003073e-04 9237 21192 -6.36605257387350e-07 9237 21216 -2.75544390262804e-02 9237 21240 -4.28266688460076e-01 9237 21264 -1.66495891798119e+00 9237 21288 -1.82669002690140e+00 9237 21312 -5.57018387595856e-01 9237 21336 -4.82939482475499e-02 9237 21360 -8.87003356679518e-05 9237 21624 -6.75108151057770e-04 9237 21648 -1.67149292436570e-02 9237 21672 -7.54624655077917e-02 9237 21696 -8.98711480908170e-02 9237 21720 -2.24860482368028e-02 9237 21744 -9.39185922044208e-04 9237 21768 -4.41669362790000e-09 9238 9238 1.00000000000000e+00 9239 9239 1.00000000000000e+00 9240 9240 1.00000000000000e+00 9241 9241 1.00000000000000e+00 9242 9242 1.00000000000000e+00 9243 9243 1.00000000000000e+00 9244 9244 1.00000000000000e+00 9245 9245 1.00000000000000e+00 9246 9246 1.00000000000000e+00 9247 9247 1.00000000000000e+00 9248 9248 1.00000000000000e+00 9249 9249 1.00000000000000e+00 9250 9250 1.00000000000000e+00 9251 9251 1.00000000000000e+00 9252 9252 1.00000000000000e+00 9253 9253 1.00000000000000e+00 9254 9254 1.00000000000000e+00 9255 9255 1.00000000000000e+00 9256 9256 1.00000000000000e+00 9257 9257 1.00000000000000e+00 9258 9258 1.00000000000000e+00 9259 9259 1.00000000000000e+00 9260 9260 1.00000000000000e+00 9261 9261 1.45485484512118e+01 9261 7389 1.11133603000000e-12 9261 7413 4.62919780307250e-07 9261 7437 7.71464689415058e-05 9261 7461 5.25146915451604e-04 9261 7485 6.59455841648086e-05 9261 7509 3.82862373842000e-09 9261 7533 3.51291980000000e-13 9261 7989 2.14304096016500e-08 9261 8013 5.24590795012684e-03 9261 8037 1.09974090606849e-01 9261 8061 2.51306149652820e-01 9261 8085 9.29174454274852e-02 9261 8109 5.38660454727596e-03 9261 8133 1.36098486988975e-06 9261 8589 4.54682972154234e-05 9261 8613 1.09787995396197e-01 9261 8637 2.15188580318627e+00 9261 8661 5.27654782800361e+00 9261 8685 2.15151970522629e+00 9261 8709 9.45590627379155e-02 9261 8733 2.84168131865542e-04 9261 9189 6.78079290028203e-04 9261 9213 2.82925116133220e-01 9261 9237 5.78776746291149e+00 9261 9285 5.35035677744414e+00 9261 9309 2.81305087752592e-01 9261 9333 1.79724268891040e-04 9261 9765 1.94460000000000e-16 9261 9789 2.22694656811340e-04 9261 9813 1.45180600441255e-01 9261 9837 2.49741496761035e+00 9261 9861 6.06166136081304e+00 9261 9885 2.30005723638076e+00 9261 9909 1.08523138370518e-01 9261 9933 6.03166389497417e-05 9261 10365 2.69600000000000e-17 9261 10389 4.55670212600412e-06 9261 10413 2.91387883519288e-03 9261 10437 1.34764034047412e-01 9261 10461 3.57259474892104e-01 9261 10485 1.20361755725486e-01 9261 10509 2.88298668641233e-03 9261 10533 2.19066051226410e-06 9261 11013 1.23556813447246e-06 9261 11037 9.38864787359760e-05 9261 11061 2.69575548313881e-04 9261 11085 2.67866754088808e-04 9261 11109 8.73668005157836e-06 9261 11661 1.17839000000000e-15 9261 11685 4.20640000000000e-16 9261 18840 -1.79287271112400e-08 9261 18864 -7.48855361421700e-08 9261 18888 -3.06112379000400e-08 9261 18912 -3.17062769720000e-09 9261 19200 -7.18384143752448e-05 9261 19224 -6.94726832043430e-03 9261 19248 -4.21980672869894e-02 9261 19272 -7.01592677812317e-02 9261 19296 -2.16988591599808e-02 9261 19320 -1.55307223477499e-03 9261 19584 -1.40505858852180e-07 9261 19608 -1.13664813412546e-02 9261 19632 -2.18551967117544e-01 9261 19656 -9.83374149245046e-01 9261 19680 -1.33485408307054e+00 9261 19704 -4.52262731923139e-01 9261 19728 -4.32773454137629e-02 9261 19752 -3.34854865003075e-05 9261 19992 -6.22249116570490e-07 9261 20016 -6.23693251947759e-02 9261 20040 -1.08618188199013e+00 9261 20064 -4.66363090861408e+00 9261 20088 -6.07799992998220e+00 9261 20112 -2.14962332383443e+00 9261 20136 -2.26074176801017e-01 9261 20160 -6.05453066284460e-04 9261 20400 -3.81408583499220e-07 9261 20424 -8.46942034598062e-02 9261 20448 -1.52417843992889e+00 9261 20472 -6.61043386329544e+00 9261 20496 -8.66875421797863e+00 9261 20520 -3.17368962354501e+00 9261 20544 -3.54816042167559e-01 9261 20568 -1.97908944809920e-03 9261 20808 -6.02256811617600e-08 9261 20832 -2.47456816655712e-02 9261 20856 -5.91340677496702e-01 9261 20880 -2.73881420483964e+00 9261 20904 -3.59514649502357e+00 9261 20928 -1.24236010428430e+00 9261 20952 -1.27093248179569e-01 9261 20976 -7.09749042147122e-04 9261 21240 -1.69124856312060e-03 9261 21264 -7.03796648728656e-02 9261 21288 -3.51322853426484e-01 9261 21312 -4.56776305238471e-01 9261 21336 -1.45112262225362e-01 9261 21360 -1.27081830126302e-02 9261 21384 -5.95594804659731e-05 9261 21648 -1.92421531558400e-08 9261 21672 -4.24068021415266e-04 9261 21696 -1.97210171975279e-03 9261 21720 -1.52847645058494e-03 9261 21744 -2.76167595293299e-04 9261 21768 -1.23322260600600e-08 9262 9262 1.00000000000000e+00 9263 9263 1.00000000000000e+00 9264 9264 1.00000000000000e+00 9265 9265 1.00000000000000e+00 9266 9266 1.00000000000000e+00 9267 9267 1.00000000000000e+00 9268 9268 1.00000000000000e+00 9269 9269 1.00000000000000e+00 9270 9270 1.00000000000000e+00 9271 9271 1.00000000000000e+00 9272 9272 1.00000000000000e+00 9273 9273 1.00000000000000e+00 9274 9274 1.00000000000000e+00 9275 9275 1.00000000000000e+00 9276 9276 1.00000000000000e+00 9277 9277 1.00000000000000e+00 9278 9278 1.00000000000000e+00 9279 9279 1.00000000000000e+00 9280 9280 1.00000000000000e+00 9281 9281 1.00000000000000e+00 9282 9282 1.00000000000000e+00 9283 9283 1.00000000000000e+00 9284 9284 1.00000000000000e+00 9285 9285 1.39656075658926e+01 9285 7437 5.53908622508739e-06 9285 7461 1.76905947185153e-04 9285 7485 2.49408950444562e-04 9285 7509 1.11059283569014e-04 9285 7533 9.31527367732900e-08 9285 8037 4.96537002526934e-03 9285 8061 1.01104182244151e-01 9285 8085 2.78473549213862e-01 9285 8109 8.52217717988987e-02 9285 8133 3.45602568546580e-03 9285 8157 1.21535498385407e-05 9285 8613 8.84933336397349e-05 9285 8637 9.20977706503677e-02 9285 8661 2.15568720645538e+00 9285 8685 5.01444778180920e+00 9285 8709 2.12226312376190e+00 9285 8733 1.02519668862682e-01 9285 8757 1.62005155421057e-04 9285 9213 6.00232747143569e-04 9285 9237 2.78594960790357e-01 9285 9261 5.35035677744414e+00 9285 9309 5.12682007264049e+00 9285 9333 2.80952884632892e-01 9285 9357 1.40080260134692e-04 9285 9813 1.11714081298831e-04 9285 9837 1.30553376912939e-01 9285 9861 2.31147641763548e+00 9285 9885 5.46392976673388e+00 9285 9909 2.13949290794903e+00 9285 9933 9.81329879921933e-02 9285 9957 1.25135402336313e-04 9285 10413 8.25552108883444e-06 9285 10437 6.21683783583451e-03 9285 10461 1.03318965213880e-01 9285 10485 2.93701725343275e-01 9285 10509 1.24287728839448e-01 9285 10533 3.00569983360132e-03 9285 10557 7.22147823010740e-07 9285 11061 1.46665177000233e-04 9285 11085 4.54537256974696e-04 9285 11109 1.17189641502781e-04 9285 11133 1.40334369341953e-05 9285 18840 -3.19429685077522e-04 9285 18864 -3.92424215915942e-03 9285 18888 -1.13536029586752e-02 9285 18912 -4.43884181165060e-03 9285 18936 -4.48079598200317e-04 9285 19224 -2.44491993247956e-03 9285 19248 -6.87655032636453e-02 9285 19272 -3.73523759437000e-01 9285 19296 -6.28655875378798e-01 9285 19320 -2.51669427949044e-01 9285 19344 -2.92174748183974e-02 9285 19368 -2.24011129438353e-05 9285 19632 -2.03097815182612e-02 9285 19656 -5.14869724059547e-01 9285 19680 -2.63136498869216e+00 9285 19704 -4.15319957528697e+00 9285 19728 -1.73159753784729e+00 9285 19752 -2.18693144643847e-01 9285 19776 -1.31385706373236e-03 9285 20040 -4.65170820385618e-02 9285 20064 -1.14612630496388e+00 9285 20088 -5.69463606063288e+00 9285 20112 -8.67746750985515e+00 9285 20136 -3.75690140381865e+00 9285 20160 -5.08138615513834e-01 9285 20184 -5.56934197282932e-03 9285 20448 -1.83378568091777e-02 9285 20472 -6.49732174719309e-01 9285 20496 -3.42870701505584e+00 9285 20520 -5.27554891058876e+00 9285 20544 -2.22780410194104e+00 9285 20568 -2.95079386881896e-01 9285 20592 -3.82397426018658e-03 9285 20856 -1.95469579268335e-03 9285 20880 -1.16903644012216e-01 9285 20904 -6.46169679302477e-01 9285 20928 -9.86091564195394e-01 9285 20952 -3.90543641669745e-01 9285 20976 -4.81042644266857e-02 9285 21000 -6.49930412057389e-04 9285 21264 -7.35209993245730e-07 9285 21288 -4.16543717404551e-03 9285 21312 -2.34736856990423e-02 9285 21336 -3.18464976229823e-02 9285 21360 -8.39152786425476e-03 9285 21384 -3.92140677873953e-04 9286 9286 1.00000000000000e+00 9287 9287 1.00000000000000e+00 9288 9288 1.00000000000000e+00 9289 9289 1.00000000000000e+00 9290 9290 1.00000000000000e+00 9291 9291 1.00000000000000e+00 9292 9292 1.00000000000000e+00 9293 9293 1.00000000000000e+00 9294 9294 1.00000000000000e+00 9295 9295 1.00000000000000e+00 9296 9296 1.00000000000000e+00 9297 9297 1.00000000000000e+00 9298 9298 1.00000000000000e+00 9299 9299 1.00000000000000e+00 9300 9300 1.00000000000000e+00 9301 9301 1.00000000000000e+00 9302 9302 1.00000000000000e+00 9303 9303 1.00000000000000e+00 9304 9304 1.00000000000000e+00 9305 9305 1.00000000000000e+00 9306 9306 1.00000000000000e+00 9307 9307 1.00000000000000e+00 9308 9308 1.00000000000000e+00 9309 9309 1.36726238031770e+01 9309 7461 4.07861261643040e-06 9309 7485 2.09551952060575e-04 9309 7509 2.87450017846340e-04 9309 7533 3.31206932007275e-05 9309 7557 2.00372158358377e-06 9309 8037 2.12450364950000e-10 9309 8061 4.89545672319202e-03 9309 8085 9.78293108358420e-02 9309 8109 2.51563538065893e-01 9309 8133 1.08772846312618e-01 9309 8157 2.64740635360718e-03 9309 8181 5.53908622508744e-06 9309 8637 1.56645013647059e-04 9309 8661 8.13110836323455e-02 9309 8685 2.12534457488616e+00 9309 8709 5.11958293841721e+00 9309 8733 2.02653932949449e+00 9309 8757 1.07957058569069e-01 9309 8781 7.71464689415076e-05 9309 9237 3.76580666462597e-04 9309 9261 2.81305087752592e-01 9309 9285 5.12682007264049e+00 9309 9333 5.14992565412798e+00 9309 9357 2.82210798877989e-01 9309 9381 2.80163312061419e-04 9309 9837 8.34240246487332e-05 9309 9861 1.14020590599328e-01 9309 9885 2.13680044591844e+00 9309 9909 5.35940821716841e+00 9309 9933 2.15224436646047e+00 9309 9957 8.63918164591308e-02 9309 9981 1.76444125597532e-04 9309 10437 1.01551698587122e-06 9309 10461 4.30756462080175e-03 9309 10485 1.19507368978336e-01 9309 10509 2.61254999604079e-01 9309 10533 1.13586382165694e-01 9309 10557 4.70380571098789e-03 9309 10581 1.51877667859400e-08 9309 11061 5.63269850000820e-07 9309 11085 1.97278770701296e-05 9309 11109 6.35178349373478e-04 9309 11133 1.86724261971482e-04 9309 11157 2.40795486257657e-06 9309 18456 -1.21690419475120e-07 9309 18480 -9.56224454740996e-05 9309 18504 -4.24155580695303e-04 9309 18528 -2.69100304160325e-04 9309 18552 -4.34911550910315e-05 9309 18840 -1.96245122556971e-04 9309 18864 -1.52511482932409e-02 9309 18888 -1.09225360996482e-01 9309 18912 -2.34465262564610e-01 9309 18936 -1.12540250718600e-01 9309 18960 -1.53834825153159e-02 9309 18984 -1.05416003024269e-05 9309 19248 -5.35878571918443e-03 9309 19272 -2.12078387164964e-01 9309 19296 -1.29828131778269e+00 9309 19320 -2.48901865479225e+00 9309 19344 -1.24030980514068e+00 9309 19368 -1.85183137996147e-01 9309 19392 -2.05148678363380e-03 9309 19656 -2.04237157877317e-02 9309 19680 -7.35882102626065e-01 9309 19704 -4.28272850225022e+00 9309 19728 -7.82063470981181e+00 9309 19752 -3.99347476231928e+00 9309 19776 -6.28313393694483e-01 9309 19800 -1.10223094013722e-02 9309 20064 -1.23074871066057e-02 9309 20088 -6.27007469647823e-01 9309 20112 -3.82742487958775e+00 9309 20136 -7.13291989148040e+00 9309 20160 -3.67439368781390e+00 9309 20184 -5.94848422720141e-01 9309 20208 -1.39338207108136e-02 9309 20472 -1.95098127036781e-03 9309 20496 -1.58796974729022e-01 9309 20520 -1.01903277723737e+00 9309 20544 -1.93483237870048e+00 9309 20568 -9.41794062802659e-01 9309 20592 -1.43723768517555e-01 9309 20616 -3.08070724295751e-03 9309 20880 -4.68288025480863e-06 9309 20904 -1.06321116976910e-02 9309 20928 -7.41832630423731e-02 9309 20952 -1.44363945467569e-01 9309 20976 -5.91529245750124e-02 9309 21000 -6.95654844075536e-03 9309 21024 -2.65552428960322e-05 9309 21312 -4.02905087151119e-06 9309 21336 -2.19376034812516e-05 9309 21360 -2.73146508523387e-05 9309 21384 -5.82139999520688e-06 9310 9310 1.00000000000000e+00 9311 9311 1.00000000000000e+00 9312 9312 1.00000000000000e+00 9313 9313 1.00000000000000e+00 9314 9314 1.00000000000000e+00 9315 9315 1.00000000000000e+00 9316 9316 1.00000000000000e+00 9317 9317 1.00000000000000e+00 9318 9318 1.00000000000000e+00 9319 9319 1.00000000000000e+00 9320 9320 1.00000000000000e+00 9321 9321 1.00000000000000e+00 9322 9322 1.00000000000000e+00 9323 9323 1.00000000000000e+00 9324 9324 1.00000000000000e+00 9325 9325 1.00000000000000e+00 9326 9326 1.00000000000000e+00 9327 9327 1.00000000000000e+00 9328 9328 1.00000000000000e+00 9329 9329 1.00000000000000e+00 9330 9330 1.00000000000000e+00 9331 9331 1.00000000000000e+00 9332 9332 1.00000000000000e+00 9333 9333 1.38340505320788e+01 9333 7485 6.71275600306683e-06 9333 7509 1.26060474670821e-04 9333 7533 5.57366312412029e-04 9333 7557 5.24284476533356e-05 9333 7581 2.12450364950000e-10 9333 7605 8.10624600000000e-14 9333 8061 2.21431704970470e-07 9333 8085 3.29078610576367e-03 9333 8109 1.11890756819087e-01 9333 8133 2.40930019848202e-01 9333 8157 9.57663978761802e-02 9333 8181 4.96537002526930e-03 9333 8205 2.33286633743801e-06 9333 8661 1.52487309262474e-04 9333 8685 9.01462639339635e-02 9333 8709 2.03413071720501e+00 9333 8733 5.17540769465832e+00 9333 8757 2.09507042579206e+00 9333 8781 1.09974090606847e-01 9333 8805 7.72839565029901e-05 9333 9261 1.79724268891040e-04 9333 9285 2.80952884632892e-01 9333 9309 5.14992565412798e+00 9333 9357 5.17797855006936e+00 9333 9381 2.74627686916332e-01 9333 9405 5.56133606008075e-04 9333 9861 1.20323550370873e-04 9333 9885 1.09523577382539e-01 9333 9909 2.14309867129201e+00 9333 9933 5.23127818559847e+00 9333 9957 2.25780169589536e+00 9333 9981 9.21548851110135e-02 9333 10005 1.31358384121017e-04 9333 10461 1.29078208718039e-05 9333 10485 2.66749886865831e-03 9333 10509 1.04894232584917e-01 9333 10533 2.94052596094362e-01 9333 10557 1.03986644421698e-01 9333 10581 5.78011380667552e-03 9333 11085 1.74930753381091e-06 9333 11109 9.19256200499717e-05 9333 11133 1.52045374293928e-04 9333 11157 2.64738694593928e-04 9333 11181 6.98380998805087e-06 9333 18096 -5.56057466610000e-10 9333 18120 -3.01603641067000e-09 9333 18144 -3.72328364354000e-09 9333 18168 -7.91806544230000e-10 9333 18456 -1.35451214863830e-07 9333 18480 -1.54822597046124e-03 9333 18504 -1.97985618629705e-02 9333 18528 -6.19881299017590e-02 9333 18552 -3.76488888679954e-02 9333 18576 -6.01949539313832e-03 9333 18600 -2.45216359375916e-06 9333 18864 -1.21000740674983e-03 9333 18888 -7.39127451110974e-02 9333 18912 -5.54442084415406e-01 9333 18936 -1.30220261752323e+00 9333 18960 -7.80770559015170e-01 9333 18984 -1.34841749520497e-01 9333 19008 -2.36917694260559e-03 9333 19272 -6.28028490483826e-03 9333 19296 -3.86242857738413e-01 9333 19320 -2.71989718090498e+00 9333 19344 -6.03043027825411e+00 9333 19368 -3.65852053446203e+00 9333 19392 -6.65735053161053e-01 9333 19416 -1.82366467804072e-02 9333 19680 -6.99137529405230e-03 9333 19704 -5.44017519973765e-01 9333 19728 -3.84397367768757e+00 9333 19752 -8.46920094647210e+00 9333 19776 -5.25957862952257e+00 9333 19800 -1.01643732635629e+00 9333 19824 -3.85963268737258e-02 9333 20088 -1.49333307771921e-03 9333 20112 -1.98152836711833e-01 9333 20136 -1.48988839847490e+00 9333 20160 -3.39171852619217e+00 9333 20184 -2.01599738264808e+00 9333 20208 -3.72818880152228e-01 9333 20232 -1.29970123836129e-02 9333 20496 -1.27615079143268e-05 9333 20520 -2.18011093323539e-02 9333 20544 -1.78671550878467e-01 9333 20568 -4.23340971250778e-01 9333 20592 -2.32535662013767e-01 9333 20616 -3.91570541987394e-02 9333 20640 -1.05007272993042e-03 9333 20928 -1.91124497901623e-04 9333 20952 -1.59366967251031e-03 9333 20976 -3.53912977336373e-03 9333 21000 -9.54445888291218e-04 9333 21024 -3.13185518468507e-05 9334 9334 1.00000000000000e+00 9335 9335 1.00000000000000e+00 9336 9336 1.00000000000000e+00 9337 9337 1.00000000000000e+00 9338 9338 1.00000000000000e+00 9339 9339 1.00000000000000e+00 9340 9340 1.00000000000000e+00 9341 9341 1.00000000000000e+00 9342 9342 1.00000000000000e+00 9343 9343 1.00000000000000e+00 9344 9344 1.00000000000000e+00 9345 9345 1.00000000000000e+00 9346 9346 1.00000000000000e+00 9347 9347 1.00000000000000e+00 9348 9348 1.00000000000000e+00 9349 9349 1.00000000000000e+00 9350 9350 1.00000000000000e+00 9351 9351 1.00000000000000e+00 9352 9352 1.00000000000000e+00 9353 9353 1.00000000000000e+00 9354 9354 1.00000000000000e+00 9355 9355 1.00000000000000e+00 9356 9356 1.00000000000000e+00 9357 9357 1.42155940525200e+01 9357 7509 1.13484136129366e-05 9357 7533 1.06435412031524e-04 9357 7557 1.84292133188979e-04 9357 7581 1.56645013647059e-04 9357 7605 1.84048516669520e-07 9357 8085 1.59094207830698e-06 9357 8109 2.37454150425827e-03 9357 8133 1.06392574754095e-01 9357 8157 2.80488210935191e-01 9357 8181 9.20977706503669e-02 9357 8205 3.81948091007359e-03 9357 8229 7.38583222521840e-06 9357 8685 7.84494215473642e-05 9357 8709 1.00625901988250e-01 9357 8733 2.08683207293720e+00 9357 8757 5.19496917949436e+00 9357 8781 2.15188580318626e+00 9357 8805 1.24288913731449e-01 9357 8829 1.65828879302893e-04 9357 9285 1.40080260134692e-04 9357 9309 2.82210798877989e-01 9357 9333 5.17797855006936e+00 9357 9381 5.68740314343214e+00 9357 9405 2.81822420274204e-01 9357 9429 7.57288505340487e-04 9357 9885 2.46473168732277e-04 9357 9909 1.00146710530685e-01 9357 9933 2.25961989461756e+00 9357 9957 5.50681995523441e+00 9357 9981 2.39295414762304e+00 9357 10005 1.24157463156091e-01 9357 10029 6.65602558937124e-05 9357 10485 6.72456755290762e-06 9357 10509 5.39569286250718e-03 9357 10533 8.99707006266862e-02 9357 10557 3.01419830152242e-01 9357 10581 1.33641182211229e-01 9357 10605 6.61404141397696e-03 9357 10629 4.13226415410000e-10 9357 11133 1.33659463189933e-04 9357 11157 5.42606048985629e-04 9357 11181 1.01435749871591e-04 9357 11205 3.01784208052601e-06 9357 11229 1.65361740000000e-13 9357 18096 -1.39127671343210e-05 9357 18120 -1.61402046852438e-03 9357 18144 -7.75557904544801e-03 9357 18168 -7.59144487802214e-03 9357 18192 -1.50947173666034e-03 9357 18216 -3.20764573755030e-07 9357 18480 -1.66168765949975e-04 9357 18504 -2.12466860893382e-02 9357 18528 -2.00674644131229e-01 9357 18552 -5.70727423507654e-01 9357 18576 -4.30138184579653e-01 9357 18600 -8.64757018219526e-02 9357 18624 -2.26300359808559e-03 9357 18888 -1.32903395665438e-03 9357 18912 -1.70937578879024e-01 9357 18936 -1.47822609499833e+00 9357 18960 -3.96244886125040e+00 9357 18984 -2.99873944324051e+00 9357 19008 -6.49578675580681e-01 9357 19032 -2.75991069040432e-02 9357 19056 -9.93685121070000e-10 9357 19296 -2.84679740778393e-03 9357 19320 -3.98034187425601e-01 9357 19344 -3.29949882568257e+00 9357 19368 -8.57804786423748e+00 9357 19392 -6.59932721052855e+00 9357 19416 -1.52988192885990e+00 9357 19440 -8.46843250636792e-02 9357 19464 -5.96334235505000e-09 9357 19704 -7.57131174518657e-04 9357 19728 -2.15879675201232e-01 9357 19752 -1.93651044840107e+00 9357 19776 -5.24984454072550e+00 9357 19800 -3.93415720552657e+00 9357 19824 -9.05256029699007e-01 9357 19848 -5.14144086384390e-02 9357 19872 -8.94809260414000e-09 9357 20112 -2.31930704160447e-05 9357 20136 -3.58048723393170e-02 9357 20160 -3.52156070294242e-01 9357 20184 -9.93116571711688e-01 9357 20208 -6.98575913356137e-01 9357 20232 -1.53167292222670e-01 9357 20256 -8.22518959263092e-03 9357 20280 -1.98860187077000e-09 9357 20544 -8.99956012314788e-04 9357 20568 -1.14567772184786e-02 9357 20592 -3.45663066015183e-02 9357 20616 -1.68136550660147e-02 9357 20640 -2.24873890229678e-03 9357 20664 -2.55024749279373e-06 9358 9358 1.00000000000000e+00 9359 9359 1.00000000000000e+00 9360 9360 1.00000000000000e+00 9361 9361 1.00000000000000e+00 9362 9362 1.00000000000000e+00 9363 9363 1.00000000000000e+00 9364 9364 1.00000000000000e+00 9365 9365 1.00000000000000e+00 9366 9366 1.00000000000000e+00 9367 9367 1.00000000000000e+00 9368 9368 1.00000000000000e+00 9369 9369 1.00000000000000e+00 9370 9370 1.00000000000000e+00 9371 9371 1.00000000000000e+00 9372 9372 1.00000000000000e+00 9373 9373 1.00000000000000e+00 9374 9374 1.00000000000000e+00 9375 9375 1.00000000000000e+00 9376 9376 1.00000000000000e+00 9377 9377 1.00000000000000e+00 9378 9378 1.00000000000000e+00 9379 9379 1.00000000000000e+00 9380 9380 1.00000000000000e+00 9381 9381 1.55068125774855e+01 9381 7533 1.37306196538333e-06 9381 7557 2.90316706081261e-04 9381 7581 3.76580666462597e-04 9381 7605 3.05226841770271e-05 9381 7629 1.67959048382321e-06 9381 8109 1.89681802581382e-06 9381 8133 3.05267476070691e-03 9381 8157 1.04998272549908e-01 9381 8181 2.78594960790361e-01 9381 8205 1.28294801162543e-01 9381 8229 4.36077583164119e-03 9381 8253 1.54657054999064e-06 9381 8277 1.50650000000000e-16 9381 8709 3.57994833680478e-05 9381 8733 1.07044420043823e-01 9381 8757 2.14319633633398e+00 9381 8781 5.78776746291150e+00 9381 8805 2.48928706355120e+00 9381 8829 1.41675838469126e-01 9381 8853 1.97291361919335e-04 9381 8877 4.22030000000000e-16 9381 9309 2.80163312061419e-04 9381 9333 2.74627686916332e-01 9381 9357 5.68740314343214e+00 9381 9405 6.56471963283415e+00 9381 9429 2.76348776783463e-01 9381 9453 4.20437398965705e-04 9381 9909 3.16321383374544e-04 9381 9933 1.06238221895661e-01 9381 9957 2.38740455251695e+00 9381 9981 6.44362061844830e+00 9381 10005 2.39184467225707e+00 9381 10029 9.43923886567093e-02 9381 10053 2.18137199729480e-05 9381 10509 4.10056075839960e-07 9381 10533 4.93536473027638e-03 9381 10557 1.29959229577403e-01 9381 10581 3.19722565471032e-01 9381 10605 9.66358510578623e-02 9381 10629 3.56458842680593e-03 9381 11133 8.42870972887720e-07 9381 11157 2.10763663817737e-05 9381 11181 4.71482473101208e-04 9381 11205 2.34927877494198e-04 9381 11229 5.61618000186800e-08 9381 17736 -2.84457677356829e-05 9381 17760 -2.02465739836170e-04 9381 17784 -3.83180860003062e-04 9381 17808 -8.87003356679494e-05 9381 17832 -4.41669362790000e-09 9381 18096 -3.16656089837685e-06 9381 18120 -3.60383670497818e-03 9381 18144 -5.64564483220392e-02 9381 18168 -2.16482774683167e-01 9381 18192 -2.21176604075140e-01 9381 18216 -4.82939482475503e-02 9381 18240 -9.39185922044185e-04 9381 18504 -1.83814698169988e-04 9381 18528 -6.29703485864404e-02 9381 18552 -7.15791459635722e-01 9381 18576 -2.39601445015481e+00 9381 18600 -2.35758391105408e+00 9381 18624 -5.57018387595869e-01 9381 18648 -2.24860482368027e-02 9381 18912 -7.15434311001545e-04 9381 18936 -2.35359211128359e-01 9381 18960 -2.44933938889464e+00 9381 18984 -7.77456076509343e+00 9381 19008 -7.47852153566624e+00 9381 19032 -1.82669002690143e+00 9381 19056 -8.98711480908172e-02 9381 19320 -2.81844181765471e-04 9381 19344 -2.01108282090764e-01 9381 19368 -2.25808474336946e+00 9381 19392 -7.39535321592714e+00 9381 19416 -6.98854935785908e+00 9381 19440 -1.66495891798114e+00 9381 19464 -7.54624655077918e-02 9381 19728 -2.76739317972477e-05 9381 19752 -4.71831589024651e-02 9381 19776 -5.99376677632753e-01 9381 19800 -2.05289357518911e+00 9381 19824 -1.87406138757865e+00 9381 19848 -4.28266688460054e-01 9381 19872 -1.67149292436570e-02 9381 20160 -2.41400275343922e-03 9381 20184 -4.20503355344801e-02 9381 20208 -1.56845308931476e-01 9381 20232 -1.32485464574330e-01 9381 20256 -2.75544390262789e-02 9381 20280 -6.75108151057785e-04 9381 20568 -5.47964570785980e-07 9381 20592 -1.67984462863557e-05 9381 20616 -5.96109218410203e-05 9381 20640 -1.71530090327612e-05 9381 20664 -6.36605257387360e-07 9382 9382 1.00000000000000e+00 9383 9383 1.00000000000000e+00 9384 9384 1.00000000000000e+00 9385 9385 1.00000000000000e+00 9386 9386 1.00000000000000e+00 9387 9387 1.00000000000000e+00 9388 9388 1.00000000000000e+00 9389 9389 1.00000000000000e+00 9390 9390 1.00000000000000e+00 9391 9391 1.00000000000000e+00 9392 9392 1.00000000000000e+00 9393 9393 1.00000000000000e+00 9394 9394 1.00000000000000e+00 9395 9395 1.00000000000000e+00 9396 9396 1.00000000000000e+00 9397 9397 1.00000000000000e+00 9398 9398 1.00000000000000e+00 9399 9399 1.00000000000000e+00 9400 9400 1.00000000000000e+00 9401 9401 1.00000000000000e+00 9402 9402 1.00000000000000e+00 9403 9403 1.00000000000000e+00 9404 9404 1.00000000000000e+00 9405 9405 1.59550388736789e+01 9405 7557 1.22408211906470e-06 9405 7581 8.34240246487300e-05 9405 7605 5.43624149202171e-04 9405 7629 1.16427669681291e-04 9405 7653 3.96083470000000e-13 9405 7677 1.81280000000000e-16 9405 8133 7.94031900597670e-07 9405 8157 4.01865511835702e-03 9405 8181 1.30553376912941e-01 9405 8205 3.22180068646864e-01 9405 8229 9.38903743213126e-02 9405 8253 5.64636705605456e-03 9405 8277 1.55053844990900e-08 9405 8733 1.59114016612106e-05 9405 8757 1.20227799418499e-01 9405 8781 2.49741496761040e+00 9405 8805 6.41976470167613e+00 9405 8829 2.30610993286478e+00 9405 8853 1.34864340673859e-01 9405 8877 4.47785888509600e-08 9405 9333 5.56133606008075e-04 9405 9357 2.81822420274204e-01 9405 9381 6.56471963283415e+00 9405 9429 7.59651806450866e+00 9405 9453 2.29394337282821e-01 9405 9933 2.62739118781426e-04 9405 9957 1.36104287771052e-01 9405 9981 2.38090503758767e+00 9405 10005 6.71549843465461e+00 9405 10029 3.98787308235858e+00 9405 10053 1.04734868936986e-02 9405 10533 2.79430157966990e-06 9405 10557 4.00256385214283e-03 9405 10581 9.18742608481266e-02 9405 10605 3.91337936004934e-01 9405 10629 9.52927344201621e-02 9405 11157 1.08879937028273e-06 9405 11181 1.28078995586540e-04 9405 11205 1.19958834153317e-04 9405 11229 3.75230044358600e-08 9405 17376 -1.54549245000000e-12 9405 17400 -6.23034231000000e-12 9405 17424 -1.64223745000000e-12 9405 17736 -1.52153242486523e-04 9405 17760 -9.40248882104714e-03 9405 17784 -4.35511837740995e-02 9405 17808 -4.59803680636706e-02 9405 17832 -1.68082945346775e-02 9405 18120 -1.54009090715200e-05 9405 18144 -2.11921539795365e-02 9405 18168 -3.40186827062613e-01 9405 18192 -1.23592080630090e+00 9405 18216 -1.13270057768641e+00 9405 18240 -4.08749207963311e-01 9405 18528 -7.21993790366340e-05 9405 18552 -1.17769960030618e-01 9405 18576 -1.72986038849152e+00 9405 18600 -6.10453891104466e+00 9405 18624 -5.81223872309208e+00 9405 18648 -2.47152522189264e+00 9405 18936 -5.77838800737363e-05 9405 18960 -1.66742076918557e-01 9405 18984 -2.45398170369842e+00 9405 19008 -8.73478129569136e+00 9405 19032 -9.17219547194408e+00 9405 19056 -4.85138247369461e+00 9405 19344 -1.05957427505541e-05 9405 19368 -5.53882674114027e-02 9405 19392 -9.54578846059274e-01 9405 19416 -3.48549779286629e+00 9405 19440 -3.32914583511339e+00 9405 19464 -1.71003083767368e+00 9405 19776 -5.05902499824337e-03 9405 19800 -1.15666008616457e-01 9405 19824 -4.36925577003901e-01 9405 19848 -3.49286089514239e-01 9405 19872 -1.56683939199442e-01 9405 20184 -8.76502208940883e-06 9405 20208 -1.21570673088838e-03 9405 20232 -5.08853050101858e-03 9405 20256 -2.60936372640854e-03 9405 20280 -3.57181806112211e-04 9406 9406 1.00000000000000e+00 9407 9407 1.00000000000000e+00 9408 9408 1.00000000000000e+00 9409 9409 1.00000000000000e+00 9410 9410 1.00000000000000e+00 9411 9411 1.00000000000000e+00 9412 9412 1.00000000000000e+00 9413 9413 1.00000000000000e+00 9414 9414 1.00000000000000e+00 9415 9415 1.00000000000000e+00 9416 9416 1.00000000000000e+00 9417 9417 1.00000000000000e+00 9418 9418 1.00000000000000e+00 9419 9419 1.00000000000000e+00 9420 9420 1.00000000000000e+00 9421 9421 1.00000000000000e+00 9422 9422 1.00000000000000e+00 9423 9423 1.00000000000000e+00 9424 9424 1.00000000000000e+00 9425 9425 1.00000000000000e+00 9426 9426 1.00000000000000e+00 9427 9427 1.00000000000000e+00 9428 9428 1.00000000000000e+00 9429 9429 2.50014043927917e+01 9429 7005 4.40000000000000e-19 9429 7029 3.80000000000000e-19 9429 7557 5.21894530000000e-13 9429 7581 1.01551698587119e-06 9429 7605 2.51116470786621e-04 9429 7629 2.83309791446209e-04 9429 7653 2.02409678011768e-04 9429 7677 1.18392864123259e-06 9429 8157 8.53127317558100e-08 9429 8181 6.21683783583451e-03 9429 8205 1.05567678610665e-01 9429 8229 3.65589698849345e-01 9429 8253 2.69689879613938e-01 9429 8277 2.12411346181340e-03 9429 8757 4.63231239090595e-05 9429 8781 1.34764034047414e-01 9429 8805 2.18313486092396e+00 9429 8829 9.74156077354733e+00 9429 8853 4.59301705652275e+00 9429 8877 9.81314367921115e-04 9429 9357 7.57288505340487e-04 9429 9381 2.76348776783463e-01 9429 9405 7.59651806450866e+00 9429 9453 3.00812933496056e+00 9429 9957 1.35092304002420e-04 9429 9981 1.05217503878586e-01 9429 10005 5.59124452074484e+00 9429 10029 8.41036131317700e+00 9429 10053 5.92060211873684e-02 9429 10557 1.31669194616130e-06 9429 10581 6.97895973065632e-03 9429 10605 2.26802376575187e-01 9429 10629 1.07199625704488e-01 9429 11205 4.05234314351900e-08 9429 11229 5.88890614340000e-09 9429 17352 -7.46393400000000e-14 9429 17376 -4.10935087373671e-04 9429 17400 -9.46517302950756e-03 9429 17424 -1.60538004493400e-02 9429 17736 -2.31168330062640e-07 9429 17760 -5.38291298606250e-03 9429 17784 -7.39964518854148e-02 9429 17808 -9.00313035298770e-01 9429 17832 -1.42258422170924e+00 9429 18144 -1.46666927100898e-06 9429 18168 -5.10221569510311e-02 9429 18192 -6.38758052884548e-01 9429 18216 -5.50103384768733e+00 9429 18240 -7.85719513899032e+00 9429 18552 -2.39915213309623e-06 9429 18576 -1.31335544505490e-01 9429 18600 -1.62177710123623e+00 9429 18624 -1.05430018435053e+01 9429 18648 -1.31480554177427e+01 9429 18960 -5.41995950758400e-07 9429 18984 -6.14995665721275e-02 9429 19008 -9.67865603429286e-01 9429 19032 -8.15239410774458e+00 9429 19056 -1.11286651487522e+01 9429 19392 -8.17707393505394e-03 9429 19416 -1.70527780808150e-01 9429 19440 -1.73985483446227e+00 9429 19464 -2.49861912557889e+00 9429 19800 -4.66156117325992e-05 9429 19824 -4.21211943045400e-03 9429 19848 -5.65856354692920e-02 9429 19872 -8.48984408304536e-02 9430 9430 1.00000000000000e+00 9431 9431 1.00000000000000e+00 9432 9432 1.00000000000000e+00 9433 9433 1.00000000000000e+00 9434 9434 1.00000000000000e+00 9435 9435 1.00000000000000e+00 9436 9436 1.00000000000000e+00 9437 9437 1.00000000000000e+00 9438 9438 1.00000000000000e+00 9439 9439 1.00000000000000e+00 9440 9440 1.00000000000000e+00 9441 9441 1.00000000000000e+00 9442 9442 1.00000000000000e+00 9443 9443 1.00000000000000e+00 9444 9444 1.00000000000000e+00 9445 9445 1.00000000000000e+00 9446 9446 1.00000000000000e+00 9447 9447 1.00000000000000e+00 9448 9448 1.00000000000000e+00 9449 9449 1.00000000000000e+00 9450 9450 1.00000000000000e+00 9451 9451 1.00000000000000e+00 9452 9452 1.00000000000000e+00 9453 9453 1.87999395128718e+00 9453 7605 1.44666009939136e-06 9453 7629 2.27061860767540e-04 9453 7653 2.73392609382709e-04 9453 7677 2.00195419374276e-06 9453 8205 4.48672969599103e-03 9453 8229 1.26642207232518e-01 9453 8253 1.92744512039679e-01 9453 8277 3.63532297866516e-03 9453 8781 9.38864787359738e-05 9453 8805 7.91253656423229e-02 9453 8829 2.93990643686121e+00 9453 8853 2.24680920254793e+00 9453 8877 1.67498720578745e-03 9453 9381 4.20437398965705e-04 9453 9405 2.29394337282822e-01 9453 9429 3.00812933496056e+00 9453 9981 6.46479002001124e-05 9453 10005 6.99586949078870e-02 9453 10029 2.51332964486056e-01 9453 10053 5.96412141363918e-03 9453 10581 4.08628167584000e-09 9453 10605 7.12317907240379e-04 9453 10629 6.84807729967531e-04 9453 17376 -4.15196523486821e-04 9453 17400 -1.51031657139677e-02 9453 17424 -2.72999557635276e-02 9453 17784 -9.31784332562728e-03 9453 17808 -4.48334279241390e-01 9453 17832 -8.31443655203389e-01 9453 18192 -3.69326044520854e-02 9453 18216 -1.73811843761457e+00 9453 18240 -3.21770864406453e+00 9453 18600 -3.13274163014302e-02 9453 18624 -1.08493774795171e+00 9453 18648 -1.95058358179340e+00 9453 19008 -6.34375125082223e-03 9453 19032 -2.18132430886975e-01 9453 19056 -3.91858603018194e-01 9453 19416 -1.13643062235917e-04 9453 19440 -1.17009061321144e-02 9453 19464 -2.26063108285773e-02 9454 9454 1.00000000000000e+00 9455 9455 1.00000000000000e+00 9456 9456 1.00000000000000e+00 9457 9457 1.00000000000000e+00 9458 9458 1.00000000000000e+00 9459 9459 1.00000000000000e+00 9460 9460 1.00000000000000e+00 9461 9461 1.00000000000000e+00 9462 9462 1.00000000000000e+00 9463 9463 1.00000000000000e+00 9464 9464 1.00000000000000e+00 9465 9465 1.00000000000000e+00 9466 9466 1.00000000000000e+00 9467 9467 1.00000000000000e+00 9468 9468 1.00000000000000e+00 9469 9469 1.00000000000000e+00 9470 9470 1.00000000000000e+00 9471 9471 1.00000000000000e+00 9472 9472 1.00000000000000e+00 9473 9473 1.00000000000000e+00 9474 9474 1.00000000000000e+00 9475 9475 1.00000000000000e+00 9476 9476 1.00000000000000e+00 9477 9477 1.00000000000000e+00 9478 9478 1.00000000000000e+00 9479 9479 1.00000000000000e+00 9480 9480 1.00000000000000e+00 9481 9481 1.00000000000000e+00 9482 9482 1.00000000000000e+00 9483 9483 1.00000000000000e+00 9484 9484 1.00000000000000e+00 9485 9485 1.00000000000000e+00 9486 9486 1.00000000000000e+00 9487 9487 1.00000000000000e+00 9488 9488 1.00000000000000e+00 9489 9489 1.00000000000000e+00 9490 9490 1.00000000000000e+00 9491 9491 1.00000000000000e+00 9492 9492 1.00000000000000e+00 9493 9493 1.00000000000000e+00 9494 9494 1.00000000000000e+00 9495 9495 1.00000000000000e+00 9496 9496 1.00000000000000e+00 9497 9497 1.00000000000000e+00 9498 9498 1.00000000000000e+00 9499 9499 1.00000000000000e+00 9500 9500 1.00000000000000e+00 9501 9501 1.00000000000000e+00 9502 9502 1.00000000000000e+00 9503 9503 1.00000000000000e+00 9504 9504 1.00000000000000e+00 9505 9505 1.00000000000000e+00 9506 9506 1.00000000000000e+00 9507 9507 1.00000000000000e+00 9508 9508 1.00000000000000e+00 9509 9509 1.00000000000000e+00 9510 9510 1.00000000000000e+00 9511 9511 1.00000000000000e+00 9512 9512 1.00000000000000e+00 9513 9513 1.00000000000000e+00 9514 9514 1.00000000000000e+00 9515 9515 1.00000000000000e+00 9516 9516 1.00000000000000e+00 9517 9517 1.00000000000000e+00 9518 9518 1.00000000000000e+00 9519 9519 1.00000000000000e+00 9520 9520 1.00000000000000e+00 9521 9521 1.00000000000000e+00 9522 9522 1.00000000000000e+00 9523 9523 1.00000000000000e+00 9524 9524 1.00000000000000e+00 9525 9525 1.00000000000000e+00 9526 9526 1.00000000000000e+00 9527 9527 1.00000000000000e+00 9528 9528 1.00000000000000e+00 9529 9529 1.00000000000000e+00 9530 9530 1.00000000000000e+00 9531 9531 1.00000000000000e+00 9532 9532 1.00000000000000e+00 9533 9533 1.00000000000000e+00 9534 9534 1.00000000000000e+00 9535 9535 1.00000000000000e+00 9536 9536 1.00000000000000e+00 9537 9537 1.00000000000000e+00 9538 9538 1.00000000000000e+00 9539 9539 1.00000000000000e+00 9540 9540 1.00000000000000e+00 9541 9541 1.00000000000000e+00 9542 9542 1.00000000000000e+00 9543 9543 1.00000000000000e+00 9544 9544 1.00000000000000e+00 9545 9545 1.00000000000000e+00 9546 9546 1.00000000000000e+00 9547 9547 1.00000000000000e+00 9548 9548 1.00000000000000e+00 9549 9549 1.00000000000000e+00 9550 9550 1.00000000000000e+00 9551 9551 1.00000000000000e+00 9552 9552 1.00000000000000e+00 9553 9553 1.00000000000000e+00 9554 9554 1.00000000000000e+00 9555 9555 1.00000000000000e+00 9556 9556 1.00000000000000e+00 9557 9557 1.00000000000000e+00 9558 9558 1.00000000000000e+00 9559 9559 1.00000000000000e+00 9560 9560 1.00000000000000e+00 9561 9561 1.00000000000000e+00 9562 9562 1.00000000000000e+00 9563 9563 1.00000000000000e+00 9564 9564 1.00000000000000e+00 9565 9565 1.00000000000000e+00 9566 9566 1.00000000000000e+00 9567 9567 1.00000000000000e+00 9568 9568 1.00000000000000e+00 9569 9569 1.00000000000000e+00 9570 9570 1.00000000000000e+00 9571 9571 1.00000000000000e+00 9572 9572 1.00000000000000e+00 9573 9573 1.00000000000000e+00 9574 9574 1.00000000000000e+00 9575 9575 1.00000000000000e+00 9576 9576 1.00000000000000e+00 9577 9577 1.00000000000000e+00 9578 9578 1.00000000000000e+00 9579 9579 1.00000000000000e+00 9580 9580 1.00000000000000e+00 9581 9581 1.00000000000000e+00 9582 9582 1.00000000000000e+00 9583 9583 1.00000000000000e+00 9584 9584 1.00000000000000e+00 9585 9585 1.00000000000000e+00 9586 9586 1.00000000000000e+00 9587 9587 1.00000000000000e+00 9588 9588 1.00000000000000e+00 9589 9589 1.00000000000000e+00 9590 9590 1.00000000000000e+00 9591 9591 1.00000000000000e+00 9592 9592 1.00000000000000e+00 9593 9593 1.00000000000000e+00 9594 9594 1.00000000000000e+00 9595 9595 1.00000000000000e+00 9596 9596 1.00000000000000e+00 9597 9597 1.00000000000000e+00 9598 9598 1.00000000000000e+00 9599 9599 1.00000000000000e+00 9600 9600 1.00000000000000e+00 9601 9601 1.00000000000000e+00 9602 9602 1.00000000000000e+00 9603 9603 1.00000000000000e+00 9604 9604 1.00000000000000e+00 9605 9605 1.00000000000000e+00 9606 9606 1.00000000000000e+00 9607 9607 1.00000000000000e+00 9608 9608 1.00000000000000e+00 9609 9609 1.00000000000000e+00 9610 9610 1.00000000000000e+00 9611 9611 1.00000000000000e+00 9612 9612 1.00000000000000e+00 9613 9613 1.00000000000000e+00 9614 9614 1.00000000000000e+00 9615 9615 1.00000000000000e+00 9616 9616 1.00000000000000e+00 9617 9617 1.00000000000000e+00 9618 9618 1.00000000000000e+00 9619 9619 1.00000000000000e+00 9620 9620 1.00000000000000e+00 9621 9621 1.00000000000000e+00 9622 9622 1.00000000000000e+00 9623 9623 1.00000000000000e+00 9624 9624 1.00000000000000e+00 9625 9625 1.00000000000000e+00 9626 9626 1.00000000000000e+00 9627 9627 1.00000000000000e+00 9628 9628 1.00000000000000e+00 9629 9629 1.00000000000000e+00 9630 9630 1.00000000000000e+00 9631 9631 1.00000000000000e+00 9632 9632 1.00000000000000e+00 9633 9633 1.00000000000000e+00 9634 9634 1.00000000000000e+00 9635 9635 1.00000000000000e+00 9636 9636 1.00000000000000e+00 9637 9637 1.00000000000000e+00 9638 9638 1.00000000000000e+00 9639 9639 1.00000000000000e+00 9640 9640 1.00000000000000e+00 9641 9641 1.00000000000000e+00 9642 9642 1.00000000000000e+00 9643 9643 1.00000000000000e+00 9644 9644 1.00000000000000e+00 9645 9645 1.00000000000000e+00 9646 9646 1.00000000000000e+00 9647 9647 1.00000000000000e+00 9648 9648 1.00000000000000e+00 9649 9649 1.00000000000000e+00 9650 9650 1.00000000000000e+00 9651 9651 1.00000000000000e+00 9652 9652 1.00000000000000e+00 9653 9653 1.00000000000000e+00 9654 9654 1.00000000000000e+00 9655 9655 1.00000000000000e+00 9656 9656 1.00000000000000e+00 9657 9657 1.00000000000000e+00 9658 9658 1.00000000000000e+00 9659 9659 1.00000000000000e+00 9660 9660 1.00000000000000e+00 9661 9661 1.00000000000000e+00 9662 9662 1.00000000000000e+00 9663 9663 1.00000000000000e+00 9664 9664 1.00000000000000e+00 9665 9665 1.00000000000000e+00 9666 9666 1.00000000000000e+00 9667 9667 1.00000000000000e+00 9668 9668 1.00000000000000e+00 9669 9669 1.00000000000000e+00 9670 9670 1.00000000000000e+00 9671 9671 1.00000000000000e+00 9672 9672 1.00000000000000e+00 9673 9673 1.00000000000000e+00 9674 9674 1.00000000000000e+00 9675 9675 1.00000000000000e+00 9676 9676 1.00000000000000e+00 9677 9677 1.00000000000000e+00 9678 9678 1.00000000000000e+00 9679 9679 1.00000000000000e+00 9680 9680 1.00000000000000e+00 9681 9681 1.00000000000000e+00 9682 9682 1.00000000000000e+00 9683 9683 1.00000000000000e+00 9684 9684 1.00000000000000e+00 9685 9685 1.00000000000000e+00 9686 9686 1.00000000000000e+00 9687 9687 1.00000000000000e+00 9688 9688 1.00000000000000e+00 9689 9689 1.00000000000000e+00 9690 9690 1.00000000000000e+00 9691 9691 1.00000000000000e+00 9692 9692 1.00000000000000e+00 9693 9693 1.00000000000000e+00 9694 9694 1.00000000000000e+00 9695 9695 1.00000000000000e+00 9696 9696 1.00000000000000e+00 9697 9697 1.00000000000000e+00 9698 9698 1.00000000000000e+00 9699 9699 1.00000000000000e+00 9700 9700 1.00000000000000e+00 9701 9701 1.00000000000000e+00 9702 9702 1.00000000000000e+00 9703 9703 1.00000000000000e+00 9704 9704 1.00000000000000e+00 9705 9705 1.00000000000000e+00 9706 9706 1.00000000000000e+00 9707 9707 1.00000000000000e+00 9708 9708 1.00000000000000e+00 9709 9709 1.00000000000000e+00 9710 9710 1.00000000000000e+00 9711 9711 1.00000000000000e+00 9712 9712 1.00000000000000e+00 9713 9713 1.00000000000000e+00 9714 9714 1.00000000000000e+00 9715 9715 1.00000000000000e+00 9716 9716 1.00000000000000e+00 9717 9717 1.00000000000000e+00 9718 9718 1.00000000000000e+00 9719 9719 1.00000000000000e+00 9720 9720 1.00000000000000e+00 9721 9721 1.00000000000000e+00 9722 9722 1.00000000000000e+00 9723 9723 1.00000000000000e+00 9724 9724 1.00000000000000e+00 9725 9725 1.00000000000000e+00 9726 9726 1.00000000000000e+00 9727 9727 1.00000000000000e+00 9728 9728 1.00000000000000e+00 9729 9729 1.00000000000000e+00 9730 9730 1.00000000000000e+00 9731 9731 1.00000000000000e+00 9732 9732 1.00000000000000e+00 9733 9733 1.00000000000000e+00 9734 9734 1.00000000000000e+00 9735 9735 1.00000000000000e+00 9736 9736 1.00000000000000e+00 9737 9737 1.00000000000000e+00 9738 9738 1.00000000000000e+00 9739 9739 1.00000000000000e+00 9740 9740 1.00000000000000e+00 9741 9741 1.03178973644449e+00 9741 7917 1.25052203376217e-06 9741 7941 1.95371943844944e-04 9741 7965 1.28664970767148e-04 9741 7989 4.13083515611090e-07 9741 8517 9.22890593949134e-03 9741 8541 9.43953024244516e-02 9741 8565 4.82735193069485e-02 9741 8589 2.48600030779952e-03 9741 8613 6.07076150326415e-06 9741 9117 1.48846185431150e-02 9741 9141 4.31840613477259e-01 9741 9165 6.74357737899612e-01 9741 9189 5.71113368287837e-02 9741 9213 1.48757014544798e-04 9741 9765 1.83378625356761e-01 9741 9789 4.59222211420531e-02 9741 9813 1.38667055159880e-04 9741 10365 2.80088098136387e-06 9741 10389 2.68083483975985e-05 9741 10413 5.75738267860000e-09 9741 20736 -3.67982902529280e-04 9741 20760 -2.68203129603540e-03 9741 20784 -5.29244362974384e-03 9741 20808 -1.54634762008399e-03 9741 20832 -8.40619835414268e-05 9741 21144 -2.32563123210228e-02 9741 21168 -1.54266916353447e-01 9741 21192 -2.75622480796982e-01 9741 21216 -9.08396678635035e-02 9741 21240 -7.39950019853701e-03 9741 21552 -4.39367443243407e-02 9741 21576 -2.89759613634646e-01 9741 21600 -5.14197856185756e-01 9741 21624 -1.70854902386419e-01 9741 21648 -1.42105665122840e-02 9742 9742 1.00000000000000e+00 9743 9743 1.00000000000000e+00 9744 9744 1.00000000000000e+00 9745 9745 1.00000000000000e+00 9746 9746 1.00000000000000e+00 9747 9747 1.00000000000000e+00 9748 9748 1.00000000000000e+00 9749 9749 1.00000000000000e+00 9750 9750 1.00000000000000e+00 9751 9751 1.00000000000000e+00 9752 9752 1.00000000000000e+00 9753 9753 1.00000000000000e+00 9754 9754 1.00000000000000e+00 9755 9755 1.00000000000000e+00 9756 9756 1.00000000000000e+00 9757 9757 1.00000000000000e+00 9758 9758 1.00000000000000e+00 9759 9759 1.00000000000000e+00 9760 9760 1.00000000000000e+00 9761 9761 1.00000000000000e+00 9762 9762 1.00000000000000e+00 9763 9763 1.00000000000000e+00 9764 9764 1.00000000000000e+00 9765 9765 6.60889732475977e+00 9765 7917 1.36192251944495e-06 9765 7941 2.39044322190820e-04 9765 7965 3.23989771589693e-04 9765 7989 1.81715951490786e-05 9765 8013 1.82413221143829e-06 9765 8517 7.34843574811681e-03 9765 8541 1.48862480810999e-01 9765 8565 2.78118470954539e-01 9765 8589 9.56967206476587e-02 9765 8613 3.27777054418449e-03 9765 8637 3.01784208052619e-06 9765 9117 1.18136420444714e-02 9765 9141 1.35780839835572e+00 9765 9165 8.47559702554791e+00 9765 9189 4.37323350928711e+00 9765 9213 1.15120413221381e-01 9765 9237 2.34927877494194e-04 9765 9261 1.94460000000000e-16 9765 9741 1.83378625356761e-01 9765 9789 6.11383506306135e+00 9765 9813 3.28881041915940e-01 9765 9837 1.19958834153315e-04 9765 9861 2.85680000000000e-16 9765 10365 6.42960599027289e-04 9765 10389 6.30109354465536e-02 9765 10413 3.01114647711885e-02 9765 10437 4.05234314351900e-08 9765 20352 -2.63635274781210e-07 9765 20376 -4.51231632600853e-05 9765 20400 -1.86284564303333e-04 9765 20424 -8.30543836998000e-05 9765 20448 -9.74644038470989e-06 9765 20736 -4.01571096527221e-04 9765 20760 -1.42858512538457e-02 9765 20784 -8.56064705006723e-02 9765 20808 -1.57674992663909e-01 9765 20832 -6.26822243240927e-02 9765 20856 -7.04889861285721e-03 9765 20880 -1.37368931380000e-10 9765 21144 -1.88624550732973e-02 9765 21168 -4.17890200362026e-01 9765 21192 -2.51925394366349e+00 9765 21216 -4.99269484568011e+00 9765 21240 -1.64156849315702e+00 9765 21264 -1.27735214090194e-01 9765 21288 -1.55434573406250e-07 9765 21552 -3.49139124709041e-02 9765 21576 -7.35786296464277e-01 9765 21600 -4.44043579606702e+00 9765 21624 -8.88650814138471e+00 9765 21648 -2.84652083002161e+00 9765 21672 -2.06381545340390e-01 9765 21696 -3.09907564292870e-07 9766 9766 1.00000000000000e+00 9767 9767 1.00000000000000e+00 9768 9768 1.00000000000000e+00 9769 9769 1.00000000000000e+00 9770 9770 1.00000000000000e+00 9771 9771 1.00000000000000e+00 9772 9772 1.00000000000000e+00 9773 9773 1.00000000000000e+00 9774 9774 1.00000000000000e+00 9775 9775 1.00000000000000e+00 9776 9776 1.00000000000000e+00 9777 9777 1.00000000000000e+00 9778 9778 1.00000000000000e+00 9779 9779 1.00000000000000e+00 9780 9780 1.00000000000000e+00 9781 9781 1.00000000000000e+00 9782 9782 1.00000000000000e+00 9783 9783 1.00000000000000e+00 9784 9784 1.00000000000000e+00 9785 9785 1.00000000000000e+00 9786 9786 1.00000000000000e+00 9787 9787 1.00000000000000e+00 9788 9788 1.00000000000000e+00 9789 9789 2.32800694414847e+01 9789 7941 5.17228162006529e-06 9789 7965 9.87647472616856e-05 9789 7989 7.01342460993384e-04 9789 8013 1.09163930156516e-04 9789 8541 8.22857654823549e-03 9789 8565 1.11544915246483e-01 9789 8589 2.56110343441903e-01 9789 8613 1.14640260342689e-01 9789 8637 6.61404141397737e-03 9789 8661 7.65518854573857e-06 9789 9141 1.56701631720268e-01 9789 9165 6.37363411517381e+00 9789 9189 9.48469133812496e+00 9789 9213 2.47430333521984e+00 9789 9237 9.66358510578650e-02 9789 9261 2.22694656811340e-04 9789 9741 4.59222211420531e-02 9789 9765 6.11383506306135e+00 9789 9813 1.00664315766853e+01 9789 9837 3.91337936004934e-01 9789 9861 3.22067592846332e-04 9789 10365 3.30908086177552e-03 9789 10389 1.31811892162331e+00 9789 10413 2.82246097617274e+00 9789 10437 2.26802376575187e-01 9789 10461 2.50863875796693e-04 9789 11013 1.81867178720744e-04 9789 11037 7.12317907240400e-04 9789 11061 2.76965240371860e-07 9789 20352 -5.30610853420250e-07 9789 20376 -2.12602681745384e-03 9789 20400 -2.22660675726958e-02 9789 20424 -6.04023209590331e-02 9789 20448 -2.65648743547455e-02 9789 20472 -3.19873872226592e-03 9789 20760 -2.27056743930507e-03 9789 20784 -8.82386895391241e-02 9789 20808 -5.87225973957992e-01 9789 20832 -1.20726376709725e+00 9789 20856 -4.87838300554059e-01 9789 20880 -5.62077263860393e-02 9789 20904 -3.54822158744667e-04 9789 21168 -3.23742370319458e-02 9789 21192 -1.42156879861833e+00 9789 21216 -7.22856710572123e+00 9789 21240 -1.01403827040806e+01 9789 21264 -4.98769432682709e+00 9789 21288 -7.88820640174529e-01 9789 21312 -1.30329133732080e-02 9789 21576 -4.88682978709450e-02 9789 21600 -2.28074346771659e+00 9789 21624 -1.09254701506266e+01 9789 21648 -1.34003793834157e+01 9789 21672 -7.25120728299913e+00 9789 21696 -1.26735440242570e+00 9789 21720 -2.35820716352034e-02 9790 9790 1.00000000000000e+00 9791 9791 1.00000000000000e+00 9792 9792 1.00000000000000e+00 9793 9793 1.00000000000000e+00 9794 9794 1.00000000000000e+00 9795 9795 1.00000000000000e+00 9796 9796 1.00000000000000e+00 9797 9797 1.00000000000000e+00 9798 9798 1.00000000000000e+00 9799 9799 1.00000000000000e+00 9800 9800 1.00000000000000e+00 9801 9801 1.00000000000000e+00 9802 9802 1.00000000000000e+00 9803 9803 1.00000000000000e+00 9804 9804 1.00000000000000e+00 9805 9805 1.00000000000000e+00 9806 9806 1.00000000000000e+00 9807 9807 1.00000000000000e+00 9808 9808 1.00000000000000e+00 9809 9809 1.00000000000000e+00 9810 9810 1.00000000000000e+00 9811 9811 1.00000000000000e+00 9812 9812 1.00000000000000e+00 9813 9813 2.33744226411700e+01 9813 7965 1.53658882619252e-05 9813 7989 2.20082275981338e-04 9813 8013 1.66440736458122e-04 9813 8037 1.31358384121013e-04 9813 8061 9.53315919924630e-07 9813 8541 1.44369951344170e-07 9813 8565 3.49349886848900e-03 9813 8589 1.30468906119896e-01 9813 8613 3.70222890871785e-01 9813 8637 1.24157463156096e-01 9813 8661 2.98338614606095e-03 9813 8685 1.30211113888142e-05 9813 9141 2.73574244309968e-04 9813 9165 1.65911619907654e-01 9813 9189 2.75103404825546e+00 9813 9213 5.30068757924913e+00 9813 9237 2.39184467225713e+00 9813 9261 1.45180600441255e-01 9813 9285 1.11714081298831e-04 9813 9741 1.38667055159880e-04 9813 9765 3.28881041915940e-01 9813 9789 1.00664315766853e+01 9813 9837 6.71549843465464e+00 9813 9861 3.04211210513148e-01 9813 9885 4.19351447657620e-04 9813 10365 7.01132519780417e-04 9813 10389 1.66127993386265e+00 9813 10413 1.08522054118622e+01 9813 10437 5.59124452074495e+00 9813 10461 1.22248691713121e-01 9813 10485 1.17729495477175e-04 9813 11013 1.17535898769438e-02 9813 11037 6.99586949078888e-02 9813 11061 9.82793053106761e-03 9813 19992 -1.80659238066755e-05 9813 20016 -1.21445491145510e-03 9813 20040 -5.13431393213628e-03 9813 20064 -3.33212378989244e-03 9813 20088 -5.47483143416012e-04 9813 20376 -5.31919679444246e-04 9813 20400 -3.78886813069682e-02 9813 20424 -2.74822116270501e-01 9813 20448 -6.13134529254272e-01 9813 20472 -3.41170327114193e-01 9813 20496 -5.38648376009507e-02 9813 20520 -3.69013968260158e-04 9813 20784 -4.50836102338893e-03 9813 20808 -2.94052989407066e-01 9813 20832 -1.87862984396721e+00 9813 20856 -3.72294246617883e+00 9813 20880 -2.24353417678795e+00 9813 20904 -3.92717788799683e-01 9813 20928 -6.49201867337139e-03 9813 21192 -1.38478634824624e-02 9813 21216 -9.00513750001270e-01 9813 21240 -5.86735061115207e+00 9813 21264 -1.21491661808584e+01 9813 21288 -8.15750338257103e+00 9813 21312 -1.55811480797783e+00 9813 21336 -3.65312941816135e-02 9813 21600 -9.96711146675259e-03 9813 21624 -7.26009893525002e-01 9813 21648 -5.61186521115565e+00 9813 21672 -1.36812044076590e+01 9813 21696 -9.15748002497590e+00 9813 21720 -1.71458500707124e+00 9813 21744 -3.72128208243914e-02 9814 9814 1.00000000000000e+00 9815 9815 1.00000000000000e+00 9816 9816 1.00000000000000e+00 9817 9817 1.00000000000000e+00 9818 9818 1.00000000000000e+00 9819 9819 1.00000000000000e+00 9820 9820 1.00000000000000e+00 9821 9821 1.00000000000000e+00 9822 9822 1.00000000000000e+00 9823 9823 1.00000000000000e+00 9824 9824 1.00000000000000e+00 9825 9825 1.00000000000000e+00 9826 9826 1.00000000000000e+00 9827 9827 1.00000000000000e+00 9828 9828 1.00000000000000e+00 9829 9829 1.00000000000000e+00 9830 9830 1.00000000000000e+00 9831 9831 1.00000000000000e+00 9832 9832 1.00000000000000e+00 9833 9833 1.00000000000000e+00 9834 9834 1.00000000000000e+00 9835 9835 1.00000000000000e+00 9836 9836 1.00000000000000e+00 9837 9837 1.59550388736787e+01 9837 7989 2.79430157966995e-06 9837 8013 2.62739118781417e-04 9837 8037 5.56133606008056e-04 9837 8061 1.59114016612106e-05 9837 8085 7.94031900597680e-07 9837 8565 1.08879937028277e-06 9837 8589 4.00256385214307e-03 9837 8613 1.36104287771057e-01 9837 8637 2.81822420274205e-01 9837 8661 1.20227799418500e-01 9837 8685 4.01865511835696e-03 9837 8709 1.22408211906470e-06 9837 9165 1.28078995586539e-04 9837 9189 9.18742608481290e-02 9837 9213 2.38090503758773e+00 9837 9237 6.56471963283403e+00 9837 9261 2.49741496761035e+00 9837 9285 1.30553376912939e-01 9837 9309 8.34240246487332e-05 9837 9765 1.19958834153315e-04 9837 9789 3.91337936004934e-01 9837 9813 6.71549843465464e+00 9837 9861 6.41976470167607e+00 9837 9885 3.22180068646864e-01 9837 9909 5.43624149202188e-04 9837 10365 3.75230044358600e-08 9837 10389 9.52927344201623e-02 9837 10413 3.98787308235866e+00 9837 10437 7.59651806450879e+00 9837 10461 2.30610993286482e+00 9837 10485 9.38903743213149e-02 9837 10509 1.16427669681294e-04 9837 11013 1.04734868936989e-02 9837 11037 2.29394337282826e-01 9837 11061 1.34864340673861e-01 9837 11085 5.64636705605473e-03 9837 11109 3.96083470000000e-13 9837 11661 4.47785888509600e-08 9837 11685 1.55053844990900e-08 9837 11709 1.81280000000000e-16 9837 19632 -1.05957427505543e-05 9837 19656 -5.77838800737370e-05 9837 19680 -7.21993790366341e-05 9837 19704 -1.54009090715200e-05 9837 19992 -8.76502208940850e-06 9837 20016 -5.05902499824320e-03 9837 20040 -5.53882674114023e-02 9837 20064 -1.66742076918558e-01 9837 20088 -1.17769960030617e-01 9837 20112 -2.11921539795360e-02 9837 20136 -1.52153242486529e-04 9837 20400 -1.21570673088845e-03 9837 20424 -1.15666008616462e-01 9837 20448 -9.54578846059280e-01 9837 20472 -2.45398170369837e+00 9837 20496 -1.72986038849149e+00 9837 20520 -3.40186827062610e-01 9837 20544 -9.40248882104740e-03 9837 20808 -5.08853050101887e-03 9837 20832 -4.36925577003924e-01 9837 20856 -3.48549779286631e+00 9837 20880 -8.73478129569114e+00 9837 20904 -6.10453891104458e+00 9837 20928 -1.23592080630090e+00 9837 20952 -4.35511837741008e-02 9837 20976 -1.54549245000000e-12 9837 21216 -2.60936372640858e-03 9837 21240 -3.49286089514245e-01 9837 21264 -3.32914583511341e+00 9837 21288 -9.17219547194407e+00 9837 21312 -5.81223872309214e+00 9837 21336 -1.13270057768643e+00 9837 21360 -4.59803680636722e-02 9837 21384 -6.23034231000000e-12 9837 21624 -3.57181806112203e-04 9837 21648 -1.56683939199441e-01 9837 21672 -1.71003083767370e+00 9837 21696 -4.85138247369471e+00 9837 21720 -2.47152522189269e+00 9837 21744 -4.08749207963319e-01 9837 21768 -1.68082945346777e-02 9837 21792 -1.64223745000000e-12 9838 9838 1.00000000000000e+00 9839 9839 1.00000000000000e+00 9840 9840 1.00000000000000e+00 9841 9841 1.00000000000000e+00 9842 9842 1.00000000000000e+00 9843 9843 1.00000000000000e+00 9844 9844 1.00000000000000e+00 9845 9845 1.00000000000000e+00 9846 9846 1.00000000000000e+00 9847 9847 1.00000000000000e+00 9848 9848 1.00000000000000e+00 9849 9849 1.00000000000000e+00 9850 9850 1.00000000000000e+00 9851 9851 1.00000000000000e+00 9852 9852 1.00000000000000e+00 9853 9853 1.00000000000000e+00 9854 9854 1.00000000000000e+00 9855 9855 1.00000000000000e+00 9856 9856 1.00000000000000e+00 9857 9857 1.00000000000000e+00 9858 9858 1.00000000000000e+00 9859 9859 1.00000000000000e+00 9860 9860 1.00000000000000e+00 9861 9861 1.67148947905031e+01 9861 8013 7.46695746236228e-06 9861 8037 7.72839565029905e-05 9861 8061 3.83618832664601e-04 9861 8085 1.21338636937128e-04 9861 8589 2.47633161065679e-06 9861 8613 2.81609474262597e-03 9861 8637 1.24288913731450e-01 9861 8661 2.80845679566271e-01 9861 8685 8.98139243420839e-02 9861 8709 5.51968148406416e-03 9861 8733 1.40034993139735e-06 9861 9189 8.08979821477098e-05 9861 9213 1.37978003661634e-01 9861 9237 2.48928706355115e+00 9861 9261 6.06166136081304e+00 9861 9285 2.31147641763548e+00 9861 9309 1.14020590599328e-01 9861 9333 1.20323550370873e-04 9861 9765 2.85680000000000e-16 9861 9789 3.22067592846332e-04 9861 9813 3.04211210513148e-01 9861 9837 6.41976470167607e+00 9861 9885 6.10174473440797e+00 9861 9909 2.77770045261556e-01 9861 9933 6.20724038309029e-04 9861 10365 3.96000000000000e-17 9861 10389 1.96678742491976e-04 9861 10413 1.07149062964961e-01 9861 10437 2.18313486092399e+00 9861 10461 5.48682765881358e+00 9861 10485 2.52076813096799e+00 9861 10509 1.33750852826011e-01 9861 10533 3.45354354387671e-05 9861 11013 6.51068255958219e-04 9861 11037 7.91253656423249e-02 9861 11061 2.53180377174207e-01 9861 11085 1.02243790726413e-01 9861 11109 5.85510262322295e-03 9861 11133 1.66357890694850e-07 9861 11661 6.26332162683858e-05 9861 11685 2.13322127890798e-04 9861 11709 6.93965276951360e-07 9861 11733 2.19544460000000e-13 9861 19632 -1.86508968564515e-04 9861 19656 -6.87824803542513e-03 9861 19680 -3.06819938875631e-02 9861 19704 -3.00451118904870e-02 9861 19728 -6.15205480232570e-03 9861 19752 -4.63546319988544e-05 9861 20016 -1.52757987606118e-04 9861 20040 -3.06138592859709e-02 9861 20064 -3.28645579300927e-01 9861 20088 -1.02406696179593e+00 9861 20112 -8.56623399539274e-01 9861 20136 -1.90496251635001e-01 9861 20160 -7.58954126479111e-03 9861 20424 -8.34346672447792e-04 9861 20448 -1.98962185579805e-01 9861 20472 -1.98400933919515e+00 9861 20496 -5.86868412923070e+00 9861 20520 -4.74306814100734e+00 9861 20544 -1.11422845009598e+00 9861 20568 -6.09726191576314e-02 9861 20592 -1.21126830761592e-06 9861 20832 -1.04604514369137e-03 9861 20856 -3.59725190023989e-01 9861 20880 -3.53361738223855e+00 9861 20904 -1.02624281112438e+01 9861 20928 -8.10899043378030e+00 9861 20952 -2.01546910711490e+00 9861 20976 -1.37572068971871e-01 9861 21000 -5.13822501368427e-06 9861 21240 -2.23427793991197e-04 9861 21264 -1.30866721526174e-01 9861 21288 -1.35404939750063e+00 9861 21312 -3.99618407387618e+00 9861 21336 -3.00685097530566e+00 9861 21360 -7.34540317333704e-01 9861 21384 -5.10251812906424e-02 9861 21408 -2.38387544049828e-06 9861 21648 -2.82679919691200e-08 9861 21672 -1.46458338405462e-02 9861 21696 -1.68324535039274e-01 9861 21720 -5.13545222136799e-01 9861 21744 -3.54401329386676e-01 9861 21768 -7.96440172054113e-02 9861 21792 -4.92885197545318e-03 9861 21816 -2.93151783220590e-07 9862 9862 1.00000000000000e+00 9863 9863 1.00000000000000e+00 9864 9864 1.00000000000000e+00 9865 9865 1.00000000000000e+00 9866 9866 1.00000000000000e+00 9867 9867 1.00000000000000e+00 9868 9868 1.00000000000000e+00 9869 9869 1.00000000000000e+00 9870 9870 1.00000000000000e+00 9871 9871 1.00000000000000e+00 9872 9872 1.00000000000000e+00 9873 9873 1.00000000000000e+00 9874 9874 1.00000000000000e+00 9875 9875 1.00000000000000e+00 9876 9876 1.00000000000000e+00 9877 9877 1.00000000000000e+00 9878 9878 1.00000000000000e+00 9879 9879 1.00000000000000e+00 9880 9880 1.00000000000000e+00 9881 9881 1.00000000000000e+00 9882 9882 1.00000000000000e+00 9883 9883 1.00000000000000e+00 9884 9884 1.00000000000000e+00 9885 9885 1.52048834911820e+01 9885 7461 1.22830000000000e-16 9885 7485 1.87940000000000e-16 9885 8037 2.33286633743804e-06 9885 8061 2.24058402351051e-04 9885 8085 2.33536006397612e-04 9885 8109 1.15050029531140e-04 9885 8133 8.44175032531250e-07 9885 8613 1.62962235055505e-06 9885 8637 3.81948091007352e-03 9885 8661 1.03852201314301e-01 9885 8685 2.86213876935511e-01 9885 8709 9.54297444868284e-02 9885 8733 2.99554152661755e-03 9885 8757 2.33219156354427e-06 9885 9213 1.86095276753447e-05 9885 9237 1.28294801162541e-01 9885 9261 2.30005723638076e+00 9885 9285 5.46392976673388e+00 9885 9309 2.13680044591844e+00 9885 9333 1.09523577382539e-01 9885 9357 2.46473168732277e-04 9885 9813 4.19351447657620e-04 9885 9837 3.22180068646864e-01 9885 9861 6.10174473440797e+00 9885 9909 5.76486307275887e+00 9885 9933 2.67067283445575e-01 9885 9957 5.00161568839060e-04 9885 10413 2.11681717864977e-04 9885 10437 1.05567678610667e-01 9885 10461 2.54478197047033e+00 9885 10485 6.54732452314687e+00 9885 10509 2.44145806955102e+00 9885 10533 1.29265031934993e-01 9885 10557 1.87607910286078e-05 9885 11013 9.84462529829370e-07 9885 11037 4.48672969599122e-03 9885 11061 8.83750882412705e-02 9885 11085 3.19728559420914e-01 9885 11109 1.48638855963742e-01 9885 11133 4.53064416783996e-03 9885 11157 1.07354659163106e-06 9885 11661 1.00310287655637e-04 9885 11685 4.39095393213606e-04 9885 11709 6.44276186536676e-05 9885 11733 1.89409891545976e-06 9885 19248 -6.64224849700000e-11 9885 19272 -3.19949948932872e-04 9885 19296 -2.16668756254669e-03 9885 19320 -3.87791204741476e-03 9885 19344 -9.28518009400151e-04 9885 19368 -1.04073115619183e-05 9885 19632 -7.58338003402632e-06 9885 19656 -6.56477375214336e-03 9885 19680 -9.59646298107570e-02 9885 19704 -3.62324339704623e-01 9885 19728 -3.81038440366007e-01 9885 19752 -9.71852575256478e-02 9885 19776 -5.16812501595190e-03 9885 20040 -7.26889822415117e-05 9885 20064 -7.08050616192463e-02 9885 20088 -8.81184445223634e-01 9885 20112 -3.07599406256265e+00 9885 20136 -3.09628035087767e+00 9885 20160 -8.49994985456533e-01 9885 20184 -6.02435661366252e-02 9885 20208 -1.60601360825510e-05 9885 20448 -1.77369989909078e-04 9885 20472 -2.07628844917457e-01 9885 20496 -2.40623175819995e+00 9885 20520 -8.08169379493113e+00 9885 20544 -8.01336539963254e+00 9885 20568 -2.32104302524861e+00 9885 20592 -1.90281153849870e-01 9885 20616 -8.98871072744678e-05 9885 20856 -4.38145079191087e-05 9885 20880 -1.36403831570533e-01 9885 20904 -1.72365237570312e+00 9885 20928 -6.06421539807101e+00 9885 20952 -6.17588936427231e+00 9885 20976 -1.79075268972273e+00 9885 21000 -1.44830657291904e-01 9885 21024 -1.18646387859606e-04 9885 21264 -3.64761453425570e-07 9885 21288 -2.42284408096528e-02 9885 21312 -3.40415392059897e-01 9885 21336 -1.25135147236020e+00 9885 21360 -1.28251347224225e+00 9885 21384 -3.59609790199526e-01 9885 21408 -2.67245997549214e-02 9885 21432 -2.56465629442638e-05 9885 21696 -3.37059951672555e-04 9885 21720 -9.34229118965601e-03 9885 21744 -4.00258339285672e-02 9885 21768 -3.89639863280268e-02 9885 21792 -8.19121310477222e-03 9885 21816 -1.19661164935189e-04 9886 9886 1.00000000000000e+00 9887 9887 1.00000000000000e+00 9888 9888 1.00000000000000e+00 9889 9889 1.00000000000000e+00 9890 9890 1.00000000000000e+00 9891 9891 1.00000000000000e+00 9892 9892 1.00000000000000e+00 9893 9893 1.00000000000000e+00 9894 9894 1.00000000000000e+00 9895 9895 1.00000000000000e+00 9896 9896 1.00000000000000e+00 9897 9897 1.00000000000000e+00 9898 9898 1.00000000000000e+00 9899 9899 1.00000000000000e+00 9900 9900 1.00000000000000e+00 9901 9901 1.00000000000000e+00 9902 9902 1.00000000000000e+00 9903 9903 1.00000000000000e+00 9904 9904 1.00000000000000e+00 9905 9905 1.00000000000000e+00 9906 9906 1.00000000000000e+00 9907 9907 1.00000000000000e+00 9908 9908 1.00000000000000e+00 9909 9909 1.44213860298008e+01 9909 7461 1.86000000000000e-17 9909 7485 2.84600000000000e-17 9909 8037 8.10624600000000e-14 9909 8061 1.45607376990160e-07 9909 8085 2.12636592359758e-04 9909 8109 3.84182544807878e-04 9909 8133 1.58758229703412e-05 9909 8157 7.87821774847120e-07 9909 8637 1.84048516669520e-07 9909 8661 5.11135706757790e-03 9909 8685 1.03347535291060e-01 9909 8709 2.50889615789971e-01 9909 8733 1.06063705484245e-01 9909 8757 4.42976897962916e-03 9909 8781 4.62919780307240e-07 9909 9237 3.05226841770282e-05 9909 9261 1.08523138370518e-01 9909 9285 2.13949290794903e+00 9909 9309 5.35940821716841e+00 9909 9333 2.14309867129201e+00 9909 9357 1.00146710530685e-01 9909 9381 3.16321383374544e-04 9909 9837 5.43624149202188e-04 9909 9861 2.77770045261556e-01 9909 9885 5.76486307275887e+00 9909 9933 5.50028633803776e+00 9909 9957 2.82601434453939e-01 9909 9981 2.74904578863921e-04 9909 10413 5.38430000000000e-16 9909 10437 2.51116470786627e-04 9909 10461 1.41882974823343e-01 9909 10485 2.43971202276573e+00 9909 10509 6.05533313607166e+00 9909 10533 2.27567422516412e+00 9909 10557 1.13542902326336e-01 9909 10581 4.76842667935611e-05 9909 11013 1.82940000000000e-16 9909 11037 1.44666009939136e-06 9909 11061 4.31287933667580e-03 9909 11085 1.46585707143302e-01 9909 11109 3.28037469003487e-01 9909 11133 1.19649369036847e-01 9909 11157 3.37533779248334e-03 9909 11181 2.33546346859171e-06 9909 11661 1.32826164813374e-06 9909 11685 2.27667645083759e-05 9909 11709 4.72542549108700e-04 9909 11733 3.60350842428268e-04 9909 11757 2.13656657686164e-06 9909 18888 -4.19734577819610e-07 9909 18912 -1.54190474932796e-05 9909 18936 -5.60742176785103e-05 9909 18960 -1.65162946727463e-05 9909 18984 -6.94046372686310e-07 9909 19248 -1.00590931000000e-11 9909 19272 -5.78508518996045e-04 9909 19296 -1.99554679510908e-02 9909 19320 -1.01039043382733e-01 9909 19344 -1.39874140180191e-01 9909 19368 -4.05088426167672e-02 9909 19392 -2.65351095419140e-03 9909 19656 -2.01560395289946e-06 9909 19680 -2.10748455066426e-02 9909 19704 -3.57021004769817e-01 9909 19728 -1.49717127446903e+00 9909 19752 -1.86500071194457e+00 9909 19776 -5.92579518169768e-01 9909 19800 -5.20208389584619e-02 9909 19824 -4.00601221406901e-05 9909 20064 -8.41167939047527e-06 9909 20088 -9.45460057249828e-02 9909 20112 -1.44359395821837e+00 9909 20136 -5.76875780633070e+00 9909 20160 -6.93663822977343e+00 9909 20184 -2.30331252695501e+00 9909 20208 -2.24374614877640e-01 9909 20232 -4.19129189440235e-04 9909 20472 -3.41322157762279e-06 9909 20496 -9.55746831138020e-02 9909 20520 -1.58350204718123e+00 9909 20544 -6.49493602195031e+00 9909 20568 -7.84475762036924e+00 9909 20592 -2.65973954927671e+00 9909 20616 -2.70400200659883e-01 9909 20640 -1.08121285912416e-03 9909 20880 -3.49414465273930e-07 9909 20904 -2.33917155530079e-02 9909 20928 -5.02981888970408e-01 9909 20952 -2.18514483610331e+00 9909 20976 -2.57969505935670e+00 9909 21000 -8.20278751359103e-01 9909 21024 -7.51061278934865e-02 9909 21048 -2.81280434771760e-04 9909 21312 -1.11687003265819e-03 9909 21336 -4.73116659948570e-02 9909 21360 -2.23748796928781e-01 9909 21384 -2.52605295670657e-01 9909 21408 -7.02222855708155e-02 9909 21432 -4.76276778342330e-03 9909 21456 -5.59793347357133e-06 9909 21720 -1.07073187650000e-09 9909 21744 -7.22152185415601e-05 9909 21768 -3.09682943183136e-04 9909 21792 -1.55563455594226e-04 9909 21816 -2.08381299950429e-05 9910 9910 1.00000000000000e+00 9911 9911 1.00000000000000e+00 9912 9912 1.00000000000000e+00 9913 9913 1.00000000000000e+00 9914 9914 1.00000000000000e+00 9915 9915 1.00000000000000e+00 9916 9916 1.00000000000000e+00 9917 9917 1.00000000000000e+00 9918 9918 1.00000000000000e+00 9919 9919 1.00000000000000e+00 9920 9920 1.00000000000000e+00 9921 9921 1.00000000000000e+00 9922 9922 1.00000000000000e+00 9923 9923 1.00000000000000e+00 9924 9924 1.00000000000000e+00 9925 9925 1.00000000000000e+00 9926 9926 1.00000000000000e+00 9927 9927 1.00000000000000e+00 9928 9928 1.00000000000000e+00 9929 9929 1.00000000000000e+00 9930 9930 1.00000000000000e+00 9931 9931 1.00000000000000e+00 9932 9932 1.00000000000000e+00 9933 9933 1.43612580844074e+01 9933 8061 2.42173700000000e-14 9933 8085 2.57973066677049e-06 9933 8109 7.84963079505847e-05 9933 8133 4.91919438840013e-04 9933 8157 1.17724328222056e-04 9933 8661 5.23284682600000e-11 9933 8685 4.96671538245732e-03 9933 8709 1.09060475920188e-01 9933 8733 2.70682180385715e-01 9933 8757 8.59626371374441e-02 9933 8781 5.24590795012676e-03 9933 8805 7.46695746236253e-06 9933 9261 6.03166389497417e-05 9933 9285 9.81329879921933e-02 9933 9309 2.15224436646047e+00 9933 9333 5.23127818559847e+00 9933 9357 2.25961989461756e+00 9933 9381 1.06238221895661e-01 9933 9405 2.62739118781426e-04 9933 9861 6.20724038309029e-04 9933 9885 2.67067283445575e-01 9933 9909 5.50028633803776e+00 9933 9957 5.42353049705157e+00 9933 9981 3.12738875079131e-01 9933 10005 1.66440736458122e-04 9933 10437 4.40000000000000e-19 9933 10461 1.44147466930786e-04 9933 10485 1.32107227727702e-01 9933 10509 2.28425795486042e+00 9933 10533 5.58574866139347e+00 9933 10557 2.31426725984315e+00 9933 10581 1.12349617391642e-01 9933 10605 1.09163930156516e-04 9933 11061 9.75132400737256e-06 9933 11085 4.53171246542379e-03 9933 11109 1.04668459507660e-01 9933 11133 3.25771669079225e-01 9933 11157 1.30017308321321e-01 9933 11181 3.14962360091577e-03 9933 11205 1.82413221143832e-06 9933 11685 2.46575223213170e-07 9933 11709 1.93604114647195e-04 9933 11733 2.31229553062058e-04 9933 11757 1.53185448900642e-04 9933 11781 1.78071334005424e-05 9933 18888 -1.58029534922596e-06 9933 18912 -1.94985337928628e-03 9933 18936 -1.54562329970989e-02 9933 18960 -3.37284796292220e-02 9933 18984 -1.19319310724471e-02 9933 19008 -1.06285179056373e-03 9933 19272 -1.78107971630000e-10 9933 19296 -5.56833331860732e-03 9933 19320 -1.28438112447604e-01 9933 19344 -6.40927707820481e-01 9933 19368 -9.90842359719990e-01 9933 19392 -3.78249300822858e-01 9933 19416 -4.20474139306113e-02 9933 19440 -4.27068489809019e-05 9933 19680 -8.44638357170000e-10 9933 19704 -3.57113108533596e-02 9933 19728 -7.66829074925700e-01 9933 19752 -3.64136977461606e+00 9933 19776 -5.31142189658314e+00 9933 19800 -2.10508368685634e+00 9933 19824 -2.53257024583949e-01 9933 19848 -1.17783345955638e-03 9933 20088 -7.06933854300000e-10 9933 20112 -6.10846835017329e-02 9933 20136 -1.32965709172451e+00 9933 20160 -6.23407982509980e+00 9933 20184 -8.86448444529016e+00 9933 20208 -3.64519484217998e+00 9933 20232 -4.69701797998805e-01 9933 20256 -4.35560139697704e-03 9933 20496 -1.32206470670000e-10 9933 20520 -2.01656095848385e-02 9933 20544 -6.02940997111881e-01 9933 20568 -2.98627124706647e+00 9933 20592 -4.23415220768890e+00 9933 20616 -1.69477015015132e+00 9933 20640 -2.12494015931441e-01 9933 20664 -2.14648723749305e-03 9933 20928 -1.67656038496179e-03 9933 20952 -8.66559427129932e-02 9933 20976 -4.52565793524386e-01 9933 21000 -6.31129289373421e-01 9933 21024 -2.38646796391970e-01 9933 21048 -2.79573555867766e-02 9933 21072 -2.84870293465071e-04 9933 21336 -1.54264278491790e-07 9933 21360 -1.73381330431115e-03 9933 21384 -8.89962435477900e-03 9933 21408 -9.62297346308592e-03 9933 21432 -2.05883233787835e-03 9933 21456 -2.30368090416432e-05 9934 9934 1.00000000000000e+00 9935 9935 1.00000000000000e+00 9936 9936 1.00000000000000e+00 9937 9937 1.00000000000000e+00 9938 9938 1.00000000000000e+00 9939 9939 1.00000000000000e+00 9940 9940 1.00000000000000e+00 9941 9941 1.00000000000000e+00 9942 9942 1.00000000000000e+00 9943 9943 1.00000000000000e+00 9944 9944 1.00000000000000e+00 9945 9945 1.00000000000000e+00 9946 9946 1.00000000000000e+00 9947 9947 1.00000000000000e+00 9948 9948 1.00000000000000e+00 9949 9949 1.00000000000000e+00 9950 9950 1.00000000000000e+00 9951 9951 1.00000000000000e+00 9952 9952 1.00000000000000e+00 9953 9953 1.00000000000000e+00 9954 9954 1.00000000000000e+00 9955 9955 1.00000000000000e+00 9956 9956 1.00000000000000e+00 9957 9957 1.52368589982420e+01 9957 8109 6.86885643072803e-06 9957 8133 2.33697018029744e-04 9957 8157 1.38422994045989e-04 9957 8181 8.84933336397340e-05 9957 8205 1.62962235055504e-06 9957 8709 5.12001329153937e-03 9957 8733 9.94207410797824e-02 9957 8757 2.90694425790975e-01 9957 8781 1.09787995396199e-01 9957 8805 2.81609474262600e-03 9957 8829 1.56403018457284e-05 9957 9285 1.25135402336313e-04 9957 9309 8.63918164591308e-02 9957 9333 2.25780169589536e+00 9957 9357 5.50681995523441e+00 9957 9381 2.38740455251695e+00 9957 9405 1.36104287771052e-01 9957 9429 1.35092304002420e-04 9957 9885 5.00161568839060e-04 9957 9909 2.82601434453939e-01 9957 9933 5.42353049705157e+00 9957 9981 6.29112857326265e+00 9957 10005 3.70222890871764e-01 9957 10029 1.93413419972701e-04 9957 10485 8.91005421407044e-05 9957 10509 1.17330424634128e-01 9957 10533 2.32069493927855e+00 9957 10557 6.01317879021471e+00 9957 10581 2.63300019074896e+00 9957 10605 1.14640260342685e-01 9957 10629 1.64562920078723e-04 9957 11085 2.74962501930980e-06 9957 11109 5.70101788762034e-03 9957 11133 1.17467751532462e-01 9957 11157 3.05741013405653e-01 9957 11181 1.41458480609622e-01 9957 11205 3.27777054418452e-03 9957 11229 1.62635643746720e-07 9957 11685 7.79578600000000e-14 9957 11709 2.19087640160000e-10 9957 11733 7.51344158719147e-05 9957 11757 8.42968691652782e-04 9957 11781 1.72881141110550e-04 9957 11805 6.07076150326421e-06 9957 18528 -2.60766096089586e-05 9957 18552 -8.94813647991517e-04 9957 18576 -3.43551708160337e-03 9957 18600 -1.78015374464241e-03 9957 18624 -2.47411633771683e-04 9957 18912 -8.71566016129902e-04 9957 18936 -3.61825963381648e-02 9957 18960 -2.30669445532562e-01 9957 18984 -4.57991835894882e-01 9957 19008 -2.16006340598430e-01 9957 19032 -2.92956316988243e-02 9957 19056 -1.25824412478920e-05 9957 19320 -1.07863231621524e-02 9957 19344 -3.49928920340783e-01 9957 19368 -2.02840327989389e+00 9957 19392 -3.73729413925663e+00 9957 19416 -1.86663739218361e+00 9957 19440 -2.75908869197920e-01 9957 19464 -1.83203537140746e-03 9957 19728 -3.19984746935336e-02 9957 19752 -9.67683053614502e-01 9957 19776 -5.35935612814158e+00 9957 19800 -9.44829471250622e+00 9957 19824 -4.91376916156041e+00 9957 19848 -7.67651190101397e-01 9957 19872 -8.36244219545056e-03 9957 20136 -1.50083400241692e-02 9957 20160 -6.48829834041644e-01 9957 20184 -3.78383013424043e+00 9957 20208 -6.73991693558084e+00 9957 20232 -3.40661737920486e+00 9957 20256 -5.23272904718805e-01 9957 20280 -6.67400920711639e-03 9957 20544 -1.93303940305556e-03 9957 20568 -1.34270192548723e-01 9957 20592 -8.23602821426861e-01 9957 20616 -1.48312847787425e+00 9957 20640 -6.94820792058686e-01 9957 20664 -9.94144917254053e-02 9957 20688 -1.22365447471563e-03 9957 20952 -1.59177904572117e-06 9957 20976 -6.25604395553294e-03 9957 21000 -4.19819363012449e-02 9957 21024 -7.66304469585035e-02 9957 21048 -2.67986772911742e-02 9957 21072 -2.45483860613431e-03 9957 21096 -1.54286544133730e-07 9957 21384 -6.97276547140000e-10 9957 21408 -3.40300235706000e-09 9957 21432 -3.15286122116000e-09 9957 21456 -6.13896168510000e-10 9958 9958 1.00000000000000e+00 9959 9959 1.00000000000000e+00 9960 9960 1.00000000000000e+00 9961 9961 1.00000000000000e+00 9962 9962 1.00000000000000e+00 9963 9963 1.00000000000000e+00 9964 9964 1.00000000000000e+00 9965 9965 1.00000000000000e+00 9966 9966 1.00000000000000e+00 9967 9967 1.00000000000000e+00 9968 9968 1.00000000000000e+00 9969 9969 1.00000000000000e+00 9970 9970 1.00000000000000e+00 9971 9971 1.00000000000000e+00 9972 9972 1.00000000000000e+00 9973 9973 1.00000000000000e+00 9974 9974 1.00000000000000e+00 9975 9975 1.00000000000000e+00 9976 9976 1.00000000000000e+00 9977 9977 1.00000000000000e+00 9978 9978 1.00000000000000e+00 9979 9979 1.00000000000000e+00 9980 9980 1.00000000000000e+00 9981 9981 1.69611461768892e+01 9981 8133 2.33359908483914e-06 9981 8157 1.80679317919328e-04 9981 8181 6.00232747143563e-04 9981 8205 1.86095276753446e-05 9981 8229 5.57780449472130e-07 9981 8709 3.05027687506100e-08 9981 8733 4.38303943466947e-03 9981 8757 1.18382376377731e-01 9981 8781 2.82925116133224e-01 9981 8805 1.37978003661638e-01 9981 8829 4.47462327059546e-03 9981 8853 7.77337397786230e-07 9981 9309 1.76444125597532e-04 9981 9333 9.21548851110135e-02 9981 9357 2.39295414762304e+00 9981 9381 6.44362061844830e+00 9981 9405 2.38090503758767e+00 9981 9429 1.05217503878586e-01 9981 9453 6.46479002001124e-05 9981 9909 2.74904578863921e-04 9981 9933 3.12738875079131e-01 9981 9957 6.29112857326265e+00 9981 10005 5.30068757924900e+00 9981 10029 2.68021749546518e-01 9981 10053 1.13653088228283e-05 9981 10509 9.68204573979326e-05 9981 10533 1.22356735855193e-01 9981 10557 2.61139860278906e+00 9981 10581 6.38956406917364e+00 9981 10605 2.47430333521985e+00 9981 10629 6.68679335058815e-02 9981 11109 6.81126937739491e-06 9981 11133 3.35210990307824e-03 9981 11157 1.35101238191692e-01 9981 11181 2.84023234766724e-01 9981 11205 1.15120413221381e-01 9981 11229 8.29054817407590e-05 9981 11733 3.03133255660094e-06 9981 11757 4.77661153452616e-05 9981 11781 3.73082498911604e-04 9981 11805 1.48757014544792e-04 9981 18168 -6.01422878122647e-06 9981 18192 -2.73173367878583e-05 9981 18216 -1.90559154330360e-05 9981 18240 -3.26042166295239e-06 9981 18528 -2.12273103108984e-05 9981 18552 -6.31400259870912e-03 9981 18576 -6.27299216796516e-02 9981 18600 -1.67675406492190e-01 9981 18624 -7.89606507668578e-02 9981 18648 -1.03974540170889e-02 9981 18936 -2.68360686543636e-03 9981 18960 -1.43978339114226e-01 9981 18984 -1.05198764373597e+00 9981 19008 -2.31875979400018e+00 9981 19032 -1.01464558466502e+00 9981 19056 -1.55218139672086e-01 9981 19344 -1.21795169504231e-02 9981 19368 -6.12047630761578e-01 9981 19392 -4.21473093150740e+00 9981 19416 -8.83501779089221e+00 9981 19440 -3.94528752716489e+00 9981 19464 -6.68819689456890e-01 9981 19752 -9.66017648426708e-03 9981 19776 -6.58101042165486e-01 9981 19800 -4.72026243498156e+00 9981 19824 -1.02349311736182e+01 9981 19848 -5.10178297208426e+00 9981 19872 -9.47053835614473e-01 9981 20160 -1.79342829018027e-03 9981 20184 -1.94900128605116e-01 9981 20208 -1.46587366422923e+00 9981 20232 -3.24277390370992e+00 9981 20256 -1.56020234216348e+00 9981 20280 -2.77611194666462e-01 9981 20568 -7.48228670978547e-06 9981 20592 -1.62013567064914e-02 9981 20616 -1.30904245935937e-01 9981 20640 -2.94623651010250e-01 9981 20664 -1.23074941957577e-01 9981 20688 -1.84717084370413e-02 9981 21000 -4.99741004108010e-05 9981 21024 -3.42380297403756e-04 9981 21048 -6.20042783016768e-04 9981 21072 -1.43016294015585e-04 9981 21096 -1.33099563758220e-07 9982 9982 1.00000000000000e+00 9983 9983 1.00000000000000e+00 9984 9984 1.00000000000000e+00 9985 9985 1.00000000000000e+00 9986 9986 1.00000000000000e+00 9987 9987 1.00000000000000e+00 9988 9988 1.00000000000000e+00 9989 9989 1.00000000000000e+00 9990 9990 1.00000000000000e+00 9991 9991 1.00000000000000e+00 9992 9992 1.00000000000000e+00 9993 9993 1.00000000000000e+00 9994 9994 1.00000000000000e+00 9995 9995 1.00000000000000e+00 9996 9996 1.00000000000000e+00 9997 9997 1.00000000000000e+00 9998 9998 1.00000000000000e+00 9999 9999 1.00000000000000e+00 10000 10000 1.00000000000000e+00 10001 10001 1.00000000000000e+00 10002 10002 1.00000000000000e+00 10003 10003 1.00000000000000e+00 10004 10004 1.00000000000000e+00 10005 10005 2.33744226411700e+01 10005 8157 1.30211113888141e-05 10005 8181 1.11714081298831e-04 10005 8205 4.19351447657620e-04 10005 8229 1.17729495477173e-04 10005 8733 9.53315919924660e-07 10005 8757 2.98338614606096e-03 10005 8781 1.45180600441259e-01 10005 8805 3.04211210513153e-01 10005 8829 1.22248691713119e-01 10005 8853 9.82793053106743e-03 10005 9333 1.31358384121017e-04 10005 9357 1.24157463156091e-01 10005 9381 2.39184467225707e+00 10005 9405 6.71549843465461e+00 10005 9429 5.59124452074484e+00 10005 9453 6.99586949078870e-02 10005 9933 1.66440736458121e-04 10005 9957 3.70222890871764e-01 10005 9981 5.30068757924900e+00 10005 10029 1.08522054118621e+01 10005 10053 1.17535898769434e-02 10005 10533 2.20082275981338e-04 10005 10557 1.30468906119891e-01 10005 10581 2.75103404825547e+00 10005 10605 1.00664315766853e+01 10005 10629 1.66127993386266e+00 10005 11133 1.53658882619254e-05 10005 11157 3.49349886848903e-03 10005 11181 1.65911619907652e-01 10005 11205 3.28881041915935e-01 10005 11229 7.01132519780404e-04 10005 11757 1.44369951344170e-07 10005 11781 2.73574244309951e-04 10005 11805 1.38667055159870e-04 10005 18168 -3.69013968260162e-04 10005 18192 -6.49201867337128e-03 10005 18216 -3.65312941816127e-02 10005 18240 -3.72128208243907e-02 10005 18552 -5.47483143416006e-04 10005 18576 -5.38648376009527e-02 10005 18600 -3.92717788799691e-01 10005 18624 -1.55811480797781e+00 10005 18648 -1.71458500707119e+00 10005 18960 -3.33212378989246e-03 10005 18984 -3.41170327114193e-01 10005 19008 -2.24353417678795e+00 10005 19032 -8.15750338257097e+00 10005 19056 -9.15748002497577e+00 10005 19368 -5.13431393213643e-03 10005 19392 -6.13134529254241e-01 10005 19416 -3.72294246617871e+00 10005 19440 -1.21491661808584e+01 10005 19464 -1.36812044076590e+01 10005 19776 -1.21445491145514e-03 10005 19800 -2.74822116270485e-01 10005 19824 -1.87862984396716e+00 10005 19848 -5.86735061115209e+00 10005 19872 -5.61186521115555e+00 10005 20184 -1.80659238066762e-05 10005 20208 -3.78886813069660e-02 10005 20232 -2.94052989407060e-01 10005 20256 -9.00513750001273e-01 10005 20280 -7.26009893524992e-01 10005 20616 -5.31919679444254e-04 10005 20640 -4.50836102338898e-03 10005 20664 -1.38478634824622e-02 10005 20688 -9.96711146675204e-03 10006 10006 1.00000000000000e+00 10007 10007 1.00000000000000e+00 10008 10008 1.00000000000000e+00 10009 10009 1.00000000000000e+00 10010 10010 1.00000000000000e+00 10011 10011 1.00000000000000e+00 10012 10012 1.00000000000000e+00 10013 10013 1.00000000000000e+00 10014 10014 1.00000000000000e+00 10015 10015 1.00000000000000e+00 10016 10016 1.00000000000000e+00 10017 10017 1.00000000000000e+00 10018 10018 1.00000000000000e+00 10019 10019 1.00000000000000e+00 10020 10020 1.00000000000000e+00 10021 10021 1.00000000000000e+00 10022 10022 1.00000000000000e+00 10023 10023 1.00000000000000e+00 10024 10024 1.00000000000000e+00 10025 10025 1.00000000000000e+00 10026 10026 1.00000000000000e+00 10027 10027 1.00000000000000e+00 10028 10028 1.00000000000000e+00 10029 10029 1.12846611172944e+01 10029 7605 5.38430000000000e-16 10029 7629 1.43269000000000e-15 10029 8181 8.25552108883452e-06 10029 8205 2.11681717864973e-04 10029 8229 1.57546452617899e-04 10029 8253 1.26615946688093e-06 10029 8277 1.51028246000000e-11 10029 8757 2.76280475736869e-06 10029 8781 2.91387883519293e-03 10029 8805 1.07149062964959e-01 10029 8829 3.62451739099552e-01 10029 8853 6.52643325329213e-02 10029 8877 4.36402672700000e-11 10029 9357 6.65602558937124e-05 10029 9381 9.43923886567093e-02 10029 9405 3.98787308235858e+00 10029 9429 8.41036131317700e+00 10029 9453 2.51332964486056e-01 10029 9957 1.93413419972701e-04 10029 9981 2.68021749546518e-01 10029 10005 1.08522054118621e+01 10029 10053 2.27218828907758e-02 10029 10557 3.05165715246775e-04 10029 10581 1.54296983896813e-01 10029 10605 2.82246097617276e+00 10029 10629 7.68476838705032e-01 10029 11157 1.43358216180985e-06 10029 11181 9.74515294596646e-03 10029 11205 3.01114647711880e-02 10029 11229 7.80904127106635e-05 10029 11757 2.76977475000000e-12 10029 11781 1.07430315361200e-08 10029 11805 5.75738267860000e-09 10029 17784 -7.29284455996000e-09 10029 17808 -4.28709318978561e-06 10029 17832 -8.52313646765147e-06 10029 18168 -5.18385731630746e-05 10029 18192 -8.98842633280545e-03 10029 18216 -1.51606456257916e-01 10029 18240 -2.41641731088433e-01 10029 18576 -6.79448506998601e-04 10029 18600 -1.03095708974913e-01 10029 18624 -2.02506210321664e+00 10029 18648 -3.34611990479085e+00 10029 18984 -1.97260203679888e-03 10029 19008 -3.02145747279519e-01 10029 19032 -6.55683928723492e+00 10029 19056 -1.10499459964699e+01 10029 19392 -6.01640639348692e-04 10029 19416 -1.67023864717951e-01 10029 19440 -4.37787045752165e+00 10029 19464 -7.60221651864070e+00 10029 19800 -3.23866062505972e-05 10029 19824 -3.06935392903594e-02 10029 19848 -8.79965056906134e-01 10029 19872 -1.54591739054227e+00 10029 20232 -1.52616840616765e-03 10029 20256 -3.73800305753866e-02 10029 20280 -6.40768823075997e-02 10029 20640 -2.15379764853000e-09 10029 20664 -1.80427590875900e-07 10029 20688 -3.45778598212060e-07 10030 10030 1.00000000000000e+00 10031 10031 1.00000000000000e+00 10032 10032 1.00000000000000e+00 10033 10033 1.00000000000000e+00 10034 10034 1.00000000000000e+00 10035 10035 1.00000000000000e+00 10036 10036 1.00000000000000e+00 10037 10037 1.00000000000000e+00 10038 10038 1.00000000000000e+00 10039 10039 1.00000000000000e+00 10040 10040 1.00000000000000e+00 10041 10041 1.00000000000000e+00 10042 10042 1.00000000000000e+00 10043 10043 1.00000000000000e+00 10044 10044 1.00000000000000e+00 10045 10045 1.00000000000000e+00 10046 10046 1.00000000000000e+00 10047 10047 1.00000000000000e+00 10048 10048 1.00000000000000e+00 10049 10049 1.00000000000000e+00 10050 10050 1.00000000000000e+00 10051 10051 1.00000000000000e+00 10052 10052 1.00000000000000e+00 10053 10053 1.00019295784113e+00 10053 7605 1.82940000000000e-16 10053 7629 4.86770000000000e-16 10053 8205 9.84462529829350e-07 10053 8229 1.24828921303145e-06 10053 8253 4.57242407563120e-07 10053 8277 5.45496585000000e-12 10053 8781 1.23556813447244e-06 10053 8805 6.51068255958206e-04 10053 8829 9.08688838913288e-03 10053 8853 2.08212736614839e-03 10053 8877 1.57623610900000e-11 10053 9381 2.18137199729480e-05 10053 9405 1.04734868936986e-02 10053 9429 5.92060211873684e-02 10053 9453 5.96412141363918e-03 10053 9981 1.13653088228283e-05 10053 10005 1.17535898769434e-02 10053 10029 2.27218828907758e-02 10053 10581 1.02677524531000e-09 10053 10605 1.81867178720739e-04 10053 10629 1.74906230975332e-04 10053 17784 -2.47779430879000e-09 10053 17808 -1.54782487178360e-06 10053 17832 -3.07830518340567e-06 10053 18192 -5.18975087942558e-05 10053 18216 -4.00184406382047e-03 10053 18240 -7.64040556608115e-03 10053 18600 -2.27316425110596e-04 10053 18624 -1.89372668443837e-02 10053 18648 -3.62833187129931e-02 10053 19008 -1.30941825009838e-04 10053 19032 -1.58080846130475e-02 10053 19056 -3.06995764510260e-02 10053 19416 -1.97635568482043e-05 10053 19440 -2.95310796217853e-03 10053 19464 -5.76787102641962e-03 10054 10054 1.00000000000000e+00 10055 10055 1.00000000000000e+00 10056 10056 1.00000000000000e+00 10057 10057 1.00000000000000e+00 10058 10058 1.00000000000000e+00 10059 10059 1.00000000000000e+00 10060 10060 1.00000000000000e+00 10061 10061 1.00000000000000e+00 10062 10062 1.00000000000000e+00 10063 10063 1.00000000000000e+00 10064 10064 1.00000000000000e+00 10065 10065 1.00000000000000e+00 10066 10066 1.00000000000000e+00 10067 10067 1.00000000000000e+00 10068 10068 1.00000000000000e+00 10069 10069 1.00000000000000e+00 10070 10070 1.00000000000000e+00 10071 10071 1.00000000000000e+00 10072 10072 1.00000000000000e+00 10073 10073 1.00000000000000e+00 10074 10074 1.00000000000000e+00 10075 10075 1.00000000000000e+00 10076 10076 1.00000000000000e+00 10077 10077 1.00000000000000e+00 10078 10078 1.00000000000000e+00 10079 10079 1.00000000000000e+00 10080 10080 1.00000000000000e+00 10081 10081 1.00000000000000e+00 10082 10082 1.00000000000000e+00 10083 10083 1.00000000000000e+00 10084 10084 1.00000000000000e+00 10085 10085 1.00000000000000e+00 10086 10086 1.00000000000000e+00 10087 10087 1.00000000000000e+00 10088 10088 1.00000000000000e+00 10089 10089 1.00000000000000e+00 10090 10090 1.00000000000000e+00 10091 10091 1.00000000000000e+00 10092 10092 1.00000000000000e+00 10093 10093 1.00000000000000e+00 10094 10094 1.00000000000000e+00 10095 10095 1.00000000000000e+00 10096 10096 1.00000000000000e+00 10097 10097 1.00000000000000e+00 10098 10098 1.00000000000000e+00 10099 10099 1.00000000000000e+00 10100 10100 1.00000000000000e+00 10101 10101 1.00000000000000e+00 10102 10102 1.00000000000000e+00 10103 10103 1.00000000000000e+00 10104 10104 1.00000000000000e+00 10105 10105 1.00000000000000e+00 10106 10106 1.00000000000000e+00 10107 10107 1.00000000000000e+00 10108 10108 1.00000000000000e+00 10109 10109 1.00000000000000e+00 10110 10110 1.00000000000000e+00 10111 10111 1.00000000000000e+00 10112 10112 1.00000000000000e+00 10113 10113 1.00000000000000e+00 10114 10114 1.00000000000000e+00 10115 10115 1.00000000000000e+00 10116 10116 1.00000000000000e+00 10117 10117 1.00000000000000e+00 10118 10118 1.00000000000000e+00 10119 10119 1.00000000000000e+00 10120 10120 1.00000000000000e+00 10121 10121 1.00000000000000e+00 10122 10122 1.00000000000000e+00 10123 10123 1.00000000000000e+00 10124 10124 1.00000000000000e+00 10125 10125 1.00000000000000e+00 10126 10126 1.00000000000000e+00 10127 10127 1.00000000000000e+00 10128 10128 1.00000000000000e+00 10129 10129 1.00000000000000e+00 10130 10130 1.00000000000000e+00 10131 10131 1.00000000000000e+00 10132 10132 1.00000000000000e+00 10133 10133 1.00000000000000e+00 10134 10134 1.00000000000000e+00 10135 10135 1.00000000000000e+00 10136 10136 1.00000000000000e+00 10137 10137 1.00000000000000e+00 10138 10138 1.00000000000000e+00 10139 10139 1.00000000000000e+00 10140 10140 1.00000000000000e+00 10141 10141 1.00000000000000e+00 10142 10142 1.00000000000000e+00 10143 10143 1.00000000000000e+00 10144 10144 1.00000000000000e+00 10145 10145 1.00000000000000e+00 10146 10146 1.00000000000000e+00 10147 10147 1.00000000000000e+00 10148 10148 1.00000000000000e+00 10149 10149 1.00000000000000e+00 10150 10150 1.00000000000000e+00 10151 10151 1.00000000000000e+00 10152 10152 1.00000000000000e+00 10153 10153 1.00000000000000e+00 10154 10154 1.00000000000000e+00 10155 10155 1.00000000000000e+00 10156 10156 1.00000000000000e+00 10157 10157 1.00000000000000e+00 10158 10158 1.00000000000000e+00 10159 10159 1.00000000000000e+00 10160 10160 1.00000000000000e+00 10161 10161 1.00000000000000e+00 10162 10162 1.00000000000000e+00 10163 10163 1.00000000000000e+00 10164 10164 1.00000000000000e+00 10165 10165 1.00000000000000e+00 10166 10166 1.00000000000000e+00 10167 10167 1.00000000000000e+00 10168 10168 1.00000000000000e+00 10169 10169 1.00000000000000e+00 10170 10170 1.00000000000000e+00 10171 10171 1.00000000000000e+00 10172 10172 1.00000000000000e+00 10173 10173 1.00000000000000e+00 10174 10174 1.00000000000000e+00 10175 10175 1.00000000000000e+00 10176 10176 1.00000000000000e+00 10177 10177 1.00000000000000e+00 10178 10178 1.00000000000000e+00 10179 10179 1.00000000000000e+00 10180 10180 1.00000000000000e+00 10181 10181 1.00000000000000e+00 10182 10182 1.00000000000000e+00 10183 10183 1.00000000000000e+00 10184 10184 1.00000000000000e+00 10185 10185 1.00000000000000e+00 10186 10186 1.00000000000000e+00 10187 10187 1.00000000000000e+00 10188 10188 1.00000000000000e+00 10189 10189 1.00000000000000e+00 10190 10190 1.00000000000000e+00 10191 10191 1.00000000000000e+00 10192 10192 1.00000000000000e+00 10193 10193 1.00000000000000e+00 10194 10194 1.00000000000000e+00 10195 10195 1.00000000000000e+00 10196 10196 1.00000000000000e+00 10197 10197 1.00000000000000e+00 10198 10198 1.00000000000000e+00 10199 10199 1.00000000000000e+00 10200 10200 1.00000000000000e+00 10201 10201 1.00000000000000e+00 10202 10202 1.00000000000000e+00 10203 10203 1.00000000000000e+00 10204 10204 1.00000000000000e+00 10205 10205 1.00000000000000e+00 10206 10206 1.00000000000000e+00 10207 10207 1.00000000000000e+00 10208 10208 1.00000000000000e+00 10209 10209 1.00000000000000e+00 10210 10210 1.00000000000000e+00 10211 10211 1.00000000000000e+00 10212 10212 1.00000000000000e+00 10213 10213 1.00000000000000e+00 10214 10214 1.00000000000000e+00 10215 10215 1.00000000000000e+00 10216 10216 1.00000000000000e+00 10217 10217 1.00000000000000e+00 10218 10218 1.00000000000000e+00 10219 10219 1.00000000000000e+00 10220 10220 1.00000000000000e+00 10221 10221 1.00000000000000e+00 10222 10222 1.00000000000000e+00 10223 10223 1.00000000000000e+00 10224 10224 1.00000000000000e+00 10225 10225 1.00000000000000e+00 10226 10226 1.00000000000000e+00 10227 10227 1.00000000000000e+00 10228 10228 1.00000000000000e+00 10229 10229 1.00000000000000e+00 10230 10230 1.00000000000000e+00 10231 10231 1.00000000000000e+00 10232 10232 1.00000000000000e+00 10233 10233 1.00000000000000e+00 10234 10234 1.00000000000000e+00 10235 10235 1.00000000000000e+00 10236 10236 1.00000000000000e+00 10237 10237 1.00000000000000e+00 10238 10238 1.00000000000000e+00 10239 10239 1.00000000000000e+00 10240 10240 1.00000000000000e+00 10241 10241 1.00000000000000e+00 10242 10242 1.00000000000000e+00 10243 10243 1.00000000000000e+00 10244 10244 1.00000000000000e+00 10245 10245 1.00000000000000e+00 10246 10246 1.00000000000000e+00 10247 10247 1.00000000000000e+00 10248 10248 1.00000000000000e+00 10249 10249 1.00000000000000e+00 10250 10250 1.00000000000000e+00 10251 10251 1.00000000000000e+00 10252 10252 1.00000000000000e+00 10253 10253 1.00000000000000e+00 10254 10254 1.00000000000000e+00 10255 10255 1.00000000000000e+00 10256 10256 1.00000000000000e+00 10257 10257 1.00000000000000e+00 10258 10258 1.00000000000000e+00 10259 10259 1.00000000000000e+00 10260 10260 1.00000000000000e+00 10261 10261 1.00000000000000e+00 10262 10262 1.00000000000000e+00 10263 10263 1.00000000000000e+00 10264 10264 1.00000000000000e+00 10265 10265 1.00000000000000e+00 10266 10266 1.00000000000000e+00 10267 10267 1.00000000000000e+00 10268 10268 1.00000000000000e+00 10269 10269 1.00000000000000e+00 10270 10270 1.00000000000000e+00 10271 10271 1.00000000000000e+00 10272 10272 1.00000000000000e+00 10273 10273 1.00000000000000e+00 10274 10274 1.00000000000000e+00 10275 10275 1.00000000000000e+00 10276 10276 1.00000000000000e+00 10277 10277 1.00000000000000e+00 10278 10278 1.00000000000000e+00 10279 10279 1.00000000000000e+00 10280 10280 1.00000000000000e+00 10281 10281 1.00000000000000e+00 10282 10282 1.00000000000000e+00 10283 10283 1.00000000000000e+00 10284 10284 1.00000000000000e+00 10285 10285 1.00000000000000e+00 10286 10286 1.00000000000000e+00 10287 10287 1.00000000000000e+00 10288 10288 1.00000000000000e+00 10289 10289 1.00000000000000e+00 10290 10290 1.00000000000000e+00 10291 10291 1.00000000000000e+00 10292 10292 1.00000000000000e+00 10293 10293 1.00000000000000e+00 10294 10294 1.00000000000000e+00 10295 10295 1.00000000000000e+00 10296 10296 1.00000000000000e+00 10297 10297 1.00000000000000e+00 10298 10298 1.00000000000000e+00 10299 10299 1.00000000000000e+00 10300 10300 1.00000000000000e+00 10301 10301 1.00000000000000e+00 10302 10302 1.00000000000000e+00 10303 10303 1.00000000000000e+00 10304 10304 1.00000000000000e+00 10305 10305 1.00000000000000e+00 10306 10306 1.00000000000000e+00 10307 10307 1.00000000000000e+00 10308 10308 1.00000000000000e+00 10309 10309 1.00000000000000e+00 10310 10310 1.00000000000000e+00 10311 10311 1.00000000000000e+00 10312 10312 1.00000000000000e+00 10313 10313 1.00000000000000e+00 10314 10314 1.00000000000000e+00 10315 10315 1.00000000000000e+00 10316 10316 1.00000000000000e+00 10317 10317 1.00000000000000e+00 10318 10318 1.00000000000000e+00 10319 10319 1.00000000000000e+00 10320 10320 1.00000000000000e+00 10321 10321 1.00000000000000e+00 10322 10322 1.00000000000000e+00 10323 10323 1.00000000000000e+00 10324 10324 1.00000000000000e+00 10325 10325 1.00000000000000e+00 10326 10326 1.00000000000000e+00 10327 10327 1.00000000000000e+00 10328 10328 1.00000000000000e+00 10329 10329 1.00000000000000e+00 10330 10330 1.00000000000000e+00 10331 10331 1.00000000000000e+00 10332 10332 1.00000000000000e+00 10333 10333 1.00000000000000e+00 10334 10334 1.00000000000000e+00 10335 10335 1.00000000000000e+00 10336 10336 1.00000000000000e+00 10337 10337 1.00000000000000e+00 10338 10338 1.00000000000000e+00 10339 10339 1.00000000000000e+00 10340 10340 1.00000000000000e+00 10341 10341 1.00000000000000e+00 10342 10342 1.00000000000000e+00 10343 10343 1.00000000000000e+00 10344 10344 1.00000000000000e+00 10345 10345 1.00000000000000e+00 10346 10346 1.00000000000000e+00 10347 10347 1.00000000000000e+00 10348 10348 1.00000000000000e+00 10349 10349 1.00000000000000e+00 10350 10350 1.00000000000000e+00 10351 10351 1.00000000000000e+00 10352 10352 1.00000000000000e+00 10353 10353 1.00000000000000e+00 10354 10354 1.00000000000000e+00 10355 10355 1.00000000000000e+00 10356 10356 1.00000000000000e+00 10357 10357 1.00000000000000e+00 10358 10358 1.00000000000000e+00 10359 10359 1.00000000000000e+00 10360 10360 1.00000000000000e+00 10361 10361 1.00000000000000e+00 10362 10362 1.00000000000000e+00 10363 10363 1.00000000000000e+00 10364 10364 1.00000000000000e+00 10365 10365 1.00000068632295e+00 10365 8541 1.31921271842000e-09 10365 8565 8.97612361523960e-07 10365 8589 8.78103357304630e-07 10365 8613 1.62635643746720e-07 10365 8637 1.65361740000000e-13 10365 9141 5.22093285751330e-06 10365 9165 5.01825510064360e-04 10365 9189 8.16320942124758e-04 10365 9213 8.29054817407601e-05 10365 9237 5.61618000186800e-08 10365 9261 2.69600000000000e-17 10365 9741 2.80088098136387e-06 10365 9765 6.42960599027289e-04 10365 9789 3.30908086177552e-03 10365 9813 7.01132519780417e-04 10365 9837 3.75230044358600e-08 10365 9861 3.96000000000000e-17 10365 10389 1.54671107146396e-04 10365 10413 7.80904127106650e-05 10365 10437 5.88890614340000e-09 10365 20784 -2.00903761667800e-07 10365 20808 -2.54630692488362e-06 10365 20832 -7.17169031686482e-06 10365 20856 -1.74276804760179e-06 10365 20880 -1.90423473400000e-11 10365 21192 -8.45132164331575e-05 10365 21216 -6.07278449815382e-04 10365 21240 -1.16143813803571e-03 10365 21264 -2.69315925168939e-04 10365 21288 -2.25852715468000e-08 10365 21600 -1.67620106534640e-04 10365 21624 -1.19673275115658e-03 10365 21648 -2.27267444385346e-03 10365 21672 -5.26432474004665e-04 10365 21696 -4.50372466621900e-08 10366 10366 1.00000000000000e+00 10367 10367 1.00000000000000e+00 10368 10368 1.00000000000000e+00 10369 10369 1.00000000000000e+00 10370 10370 1.00000000000000e+00 10371 10371 1.00000000000000e+00 10372 10372 1.00000000000000e+00 10373 10373 1.00000000000000e+00 10374 10374 1.00000000000000e+00 10375 10375 1.00000000000000e+00 10376 10376 1.00000000000000e+00 10377 10377 1.00000000000000e+00 10378 10378 1.00000000000000e+00 10379 10379 1.00000000000000e+00 10380 10380 1.00000000000000e+00 10381 10381 1.00000000000000e+00 10382 10382 1.00000000000000e+00 10383 10383 1.00000000000000e+00 10384 10384 1.00000000000000e+00 10385 10385 1.00000000000000e+00 10386 10386 1.00000000000000e+00 10387 10387 1.00000000000000e+00 10388 10388 1.00000000000000e+00 10389 10389 1.21320765838514e+00 10389 8541 1.26524962030200e-08 10389 8565 1.11277923894422e-05 10389 8589 3.80183219577225e-04 10389 8613 1.64562920078719e-04 10389 8637 4.13226415410000e-10 10389 9141 4.99765527714214e-05 10389 9165 2.29883960010649e-02 10389 9189 1.62292688555024e-01 10389 9213 6.68679335058813e-02 10389 9237 3.56458842680593e-03 10389 9261 4.55670212600412e-06 10389 9741 2.68083483975985e-05 10389 9765 6.30109354465536e-02 10389 9789 1.31811892162331e+00 10389 9813 1.66127993386265e+00 10389 9837 9.52927344201623e-02 10389 9861 1.96678742491976e-04 10389 10365 1.54671107146396e-04 10389 10413 7.68476838705028e-01 10389 10437 1.07199625704489e-01 10389 10461 2.15051154370618e-04 10389 11013 1.74906230975337e-04 10389 11037 6.84807729967551e-04 10389 11061 2.65320809328760e-07 10389 20784 -2.69616545916967e-06 10389 20808 -1.90946386181226e-03 10389 20832 -1.07855649151752e-02 10389 20856 -1.48604071463110e-02 10389 20880 -4.02463253813658e-03 10389 20904 -2.09120147080729e-04 10389 21192 -8.11888108207384e-04 10389 21216 -7.27606402896131e-02 10389 21240 -4.56253711353306e-01 10389 21264 -7.91085148021612e-01 10389 21288 -2.25446163389854e-01 10389 21312 -1.20141728929727e-02 10389 21600 -1.60490305820058e-03 10389 21624 -1.32155033546540e-01 10389 21648 -8.37008468300407e-01 10389 21672 -1.47814744601904e+00 10389 21696 -4.22719899012753e-01 10389 21720 -2.25645047563803e-02 10390 10390 1.00000000000000e+00 10391 10391 1.00000000000000e+00 10392 10392 1.00000000000000e+00 10393 10393 1.00000000000000e+00 10394 10394 1.00000000000000e+00 10395 10395 1.00000000000000e+00 10396 10396 1.00000000000000e+00 10397 10397 1.00000000000000e+00 10398 10398 1.00000000000000e+00 10399 10399 1.00000000000000e+00 10400 10400 1.00000000000000e+00 10401 10401 1.00000000000000e+00 10402 10402 1.00000000000000e+00 10403 10403 1.00000000000000e+00 10404 10404 1.00000000000000e+00 10405 10405 1.00000000000000e+00 10406 10406 1.00000000000000e+00 10407 10407 1.00000000000000e+00 10408 10408 1.00000000000000e+00 10409 10409 1.00000000000000e+00 10410 10410 1.00000000000000e+00 10411 10411 1.00000000000000e+00 10412 10412 1.00000000000000e+00 10413 10413 1.12846611172946e+01 10413 8541 2.76977475000000e-12 10413 8565 1.43358216180982e-06 10413 8589 3.05165715246769e-04 10413 8613 1.93413419972700e-04 10413 8637 6.65602558937122e-05 10413 8661 2.76280475736859e-06 10413 9141 1.07430315361200e-08 10413 9165 9.74515294596662e-03 10413 9189 1.54296983896813e-01 10413 9213 2.68021749546517e-01 10413 9237 9.43923886567089e-02 10413 9261 2.91387883519288e-03 10413 9285 8.25552108883444e-06 10413 9741 5.75738267860000e-09 10413 9765 3.01114647711885e-02 10413 9789 2.82246097617274e+00 10413 9813 1.08522054118622e+01 10413 9837 3.98787308235866e+00 10413 9861 1.07149062964961e-01 10413 9885 2.11681717864977e-04 10413 9909 5.38430000000000e-16 10413 10365 7.80904127106650e-05 10413 10389 7.68476838705028e-01 10413 10437 8.41036131317721e+00 10413 10461 3.62451739099559e-01 10413 10485 1.57546452617902e-04 10413 10509 1.43269000000000e-15 10413 11013 2.27218828907764e-02 10413 11037 2.51332964486061e-01 10413 11061 6.52643325329225e-02 10413 11085 1.26615946688091e-06 10413 11661 4.36402672700000e-11 10413 11685 1.51028246000000e-11 10413 20424 -3.23866062505992e-05 10413 20448 -6.01640639348681e-04 10413 20472 -1.97260203679881e-03 10413 20496 -6.79448506998580e-04 10413 20520 -5.18385731630741e-05 10413 20784 -2.15379764853000e-09 10413 20808 -1.52616840616761e-03 10413 20832 -3.06935392903593e-02 10413 20856 -1.67023864717951e-01 10413 20880 -3.02145747279519e-01 10413 20904 -1.03095708974914e-01 10413 20928 -8.98842633280566e-03 10413 20952 -7.29284455996000e-09 10413 21192 -1.80427590875920e-07 10413 21216 -3.73800305753871e-02 10413 21240 -8.79965056906130e-01 10413 21264 -4.37787045752166e+00 10413 21288 -6.55683928723505e+00 10413 21312 -2.02506210321669e+00 10413 21336 -1.51606456257919e-01 10413 21360 -4.28709318978553e-06 10413 21600 -3.45778598212090e-07 10413 21624 -6.40768823076009e-02 10413 21648 -1.54591739054227e+00 10413 21672 -7.60221651864072e+00 10413 21696 -1.10499459964702e+01 10413 21720 -3.34611990479093e+00 10413 21744 -2.41641731088438e-01 10413 21768 -8.52313646765131e-06 10414 10414 1.00000000000000e+00 10415 10415 1.00000000000000e+00 10416 10416 1.00000000000000e+00 10417 10417 1.00000000000000e+00 10418 10418 1.00000000000000e+00 10419 10419 1.00000000000000e+00 10420 10420 1.00000000000000e+00 10421 10421 1.00000000000000e+00 10422 10422 1.00000000000000e+00 10423 10423 1.00000000000000e+00 10424 10424 1.00000000000000e+00 10425 10425 1.00000000000000e+00 10426 10426 1.00000000000000e+00 10427 10427 1.00000000000000e+00 10428 10428 1.00000000000000e+00 10429 10429 1.00000000000000e+00 10430 10430 1.00000000000000e+00 10431 10431 1.00000000000000e+00 10432 10432 1.00000000000000e+00 10433 10433 1.00000000000000e+00 10434 10434 1.00000000000000e+00 10435 10435 1.00000000000000e+00 10436 10436 1.00000000000000e+00 10437 10437 2.50014043927921e+01 10437 8589 1.31669194616133e-06 10437 8613 1.35092304002420e-04 10437 8637 7.57288505340460e-04 10437 8661 4.63231239090577e-05 10437 8685 8.53127317558100e-08 10437 8709 5.21894530000000e-13 10437 9189 6.97895973065628e-03 10437 9213 1.05217503878585e-01 10437 9237 2.76348776783459e-01 10437 9261 1.34764034047412e-01 10437 9285 6.21683783583451e-03 10437 9309 1.01551698587122e-06 10437 9765 4.05234314351900e-08 10437 9789 2.26802376575187e-01 10437 9813 5.59124452074495e+00 10437 9837 7.59651806450879e+00 10437 9861 2.18313486092399e+00 10437 9885 1.05567678610667e-01 10437 9909 2.51116470786627e-04 10437 9933 4.40000000000000e-19 10437 10365 5.88890614340000e-09 10437 10389 1.07199625704489e-01 10437 10413 8.41036131317721e+00 10437 10461 9.74156077354739e+00 10437 10485 3.65589698849351e-01 10437 10509 2.83309791446212e-04 10437 10533 3.80000000000000e-19 10437 11013 5.92060211873697e-02 10437 11037 3.00812933496058e+00 10437 11061 4.59301705652270e+00 10437 11085 2.69689879613938e-01 10437 11109 2.02409678011774e-04 10437 11661 9.81314367921176e-04 10437 11685 2.12411346181353e-03 10437 11709 1.18392864123266e-06 10437 20064 -5.41995950758390e-07 10437 20088 -2.39915213309620e-06 10437 20112 -1.46666927100900e-06 10437 20136 -2.31168330062650e-07 10437 20424 -4.66156117326021e-05 10437 20448 -8.17707393505363e-03 10437 20472 -6.14995665721259e-02 10437 20496 -1.31335544505489e-01 10437 20520 -5.10221569510314e-02 10437 20544 -5.38291298606264e-03 10437 20568 -7.46393400000000e-14 10437 20832 -4.21211943045402e-03 10437 20856 -1.70527780808149e-01 10437 20880 -9.67865603429284e-01 10437 20904 -1.62177710123625e+00 10437 20928 -6.38758052884564e-01 10437 20952 -7.39964518854176e-02 10437 20976 -4.10935087373672e-04 10437 21240 -5.65856354692916e-02 10437 21264 -1.73985483446230e+00 10437 21288 -8.15239410774474e+00 10437 21312 -1.05430018435055e+01 10437 21336 -5.50103384768736e+00 10437 21360 -9.00313035298769e-01 10437 21384 -9.46517302950805e-03 10437 21648 -8.48984408304527e-02 10437 21672 -2.49861912557894e+00 10437 21696 -1.11286651487525e+01 10437 21720 -1.31480554177430e+01 10437 21744 -7.85719513899028e+00 10437 21768 -1.42258422170923e+00 10437 21792 -1.60538004493410e-02 10438 10438 1.00000000000000e+00 10439 10439 1.00000000000000e+00 10440 10440 1.00000000000000e+00 10441 10441 1.00000000000000e+00 10442 10442 1.00000000000000e+00 10443 10443 1.00000000000000e+00 10444 10444 1.00000000000000e+00 10445 10445 1.00000000000000e+00 10446 10446 1.00000000000000e+00 10447 10447 1.00000000000000e+00 10448 10448 1.00000000000000e+00 10449 10449 1.00000000000000e+00 10450 10450 1.00000000000000e+00 10451 10451 1.00000000000000e+00 10452 10452 1.00000000000000e+00 10453 10453 1.00000000000000e+00 10454 10454 1.00000000000000e+00 10455 10455 1.00000000000000e+00 10456 10456 1.00000000000000e+00 10457 10457 1.00000000000000e+00 10458 10458 1.00000000000000e+00 10459 10459 1.00000000000000e+00 10460 10460 1.00000000000000e+00 10461 10461 2.08251633581964e+01 10461 8613 1.56403018457278e-05 10461 8637 1.65828879302887e-04 10461 8661 3.16858225254104e-04 10461 8685 1.28308173330616e-04 10461 8709 7.04711743687000e-09 10461 9189 8.30405258521000e-09 10461 9213 4.47462327059536e-03 10461 9237 1.41675838469124e-01 10461 9261 3.57259474892104e-01 10461 9285 1.03318965213880e-01 10461 9309 4.30756462080175e-03 10461 9333 1.29078208718039e-05 10461 9789 2.50863875796693e-04 10461 9813 1.22248691713121e-01 10461 9837 2.30610993286482e+00 10461 9861 5.48682765881358e+00 10461 9885 2.54478197047033e+00 10461 9909 1.41882974823343e-01 10461 9933 1.44147466930786e-04 10461 10389 2.15051154370618e-04 10461 10413 3.62451739099559e-01 10461 10437 9.74156077354739e+00 10461 10485 5.95013494598476e+00 10461 10509 3.38445502301254e-01 10461 10533 3.89714704487484e-04 10461 11013 9.08688838913305e-03 10461 11037 2.93990643686119e+00 10461 11061 1.20747408504985e+01 10461 11085 4.15240925190634e+00 10461 11109 1.01036021558392e-01 10461 11133 1.14998784692895e-04 10461 11661 4.60996910959797e-02 10461 11685 1.27588687451486e-01 10461 11709 8.70653938089642e-03 10461 11733 1.50853894583000e-09 10461 20064 -3.14289429538516e-04 10461 20088 -5.50462311142653e-03 10461 20112 -1.87272890764832e-02 10461 20136 -9.94001768869176e-03 10461 20160 -1.42313807385482e-03 10461 20448 -1.58120002869853e-03 10461 20472 -7.35160147784665e-02 10461 20496 -4.68654027442273e-01 10461 20520 -9.34677063180309e-01 10461 20544 -4.95781694150897e-01 10461 20568 -7.60852993516128e-02 10461 20592 -4.57831467629266e-04 10461 20856 -1.02084568245075e-02 10461 20880 -4.38209835369893e-01 10461 20904 -2.61950144724905e+00 10461 20928 -4.91357092063549e+00 10461 20952 -2.77314972883573e+00 10461 20976 -4.57856882565000e-01 10461 21000 -5.20445063742411e-03 10461 21264 -1.99678375256180e-02 10461 21288 -9.00428623635632e-01 10461 21312 -5.95229647679319e+00 10461 21336 -1.24786044584959e+01 10461 21360 -6.90326339321363e+00 10461 21384 -1.14792032596771e+00 10461 21408 -2.25678303861431e-02 10461 21672 -9.58767802584526e-03 10461 21696 -6.14318709256905e-01 10461 21720 -5.21913909453384e+00 10461 21744 -1.30472690748128e+01 10461 21768 -6.32062101669744e+00 10461 21792 -9.31015863958428e-01 10461 21816 -2.06081244686783e-02 10462 10462 1.00000000000000e+00 10463 10463 1.00000000000000e+00 10464 10464 1.00000000000000e+00 10465 10465 1.00000000000000e+00 10466 10466 1.00000000000000e+00 10467 10467 1.00000000000000e+00 10468 10468 1.00000000000000e+00 10469 10469 1.00000000000000e+00 10470 10470 1.00000000000000e+00 10471 10471 1.00000000000000e+00 10472 10472 1.00000000000000e+00 10473 10473 1.00000000000000e+00 10474 10474 1.00000000000000e+00 10475 10475 1.00000000000000e+00 10476 10476 1.00000000000000e+00 10477 10477 1.00000000000000e+00 10478 10478 1.00000000000000e+00 10479 10479 1.00000000000000e+00 10480 10480 1.00000000000000e+00 10481 10481 1.00000000000000e+00 10482 10482 1.00000000000000e+00 10483 10483 1.00000000000000e+00 10484 10484 1.00000000000000e+00 10485 10485 1.64581799012995e+01 10485 8061 1.27120000000000e-16 10485 8085 8.37030000000000e-16 10485 8637 7.38583222521824e-06 10485 8661 2.41938520180964e-04 10485 8685 2.93336389137456e-04 10485 8709 6.51738304218139e-05 10485 8733 1.93816942058856e-06 10485 9213 5.57780449472120e-07 10485 9237 4.36077583164116e-03 10485 9261 1.20361755725486e-01 10485 9285 2.93701725343275e-01 10485 9309 1.19507368978336e-01 10485 9333 2.66749886865831e-03 10485 9357 6.72456755290762e-06 10485 9813 1.17729495477175e-04 10485 9837 9.38903743213149e-02 10485 9861 2.52076813096799e+00 10485 9885 6.54732452314687e+00 10485 9909 2.43971202276573e+00 10485 9933 1.32107227727702e-01 10485 9957 8.91005421407044e-05 10485 10413 1.57546452617902e-04 10485 10437 3.65589698849351e-01 10485 10461 5.95013494598476e+00 10485 10509 6.56258203239007e+00 10485 10533 3.24085759625745e-01 10485 10557 4.67153324025490e-04 10485 11013 1.24828921303147e-06 10485 11037 1.26642207232519e-01 10485 11061 3.20527510274188e+00 10485 11085 6.20292311079316e+00 10485 11109 2.20243939165187e+00 10485 11133 1.03910226659851e-01 10485 11157 1.40199035422934e-04 10485 11661 3.21160075323196e-02 10485 11685 2.74020269122430e-01 10485 11709 1.18442951526064e-01 10485 11733 5.34094459172515e-03 10485 12285 8.85453302770000e-10 10485 12309 9.01164771458703e-06 10485 12333 1.76345157057961e-06 10485 19680 -2.67149432083500e-08 10485 19704 -1.74967604472405e-04 10485 19728 -8.50483332369760e-04 10485 19752 -7.78915299212640e-04 10485 19776 -1.51013638628267e-04 10485 20064 -1.04917510642629e-04 10485 20088 -1.36571193791509e-02 10485 20112 -1.19803551127478e-01 10485 20136 -3.13158933648108e-01 10485 20160 -1.98701968048535e-01 10485 20184 -3.39204386699666e-02 10485 20208 -2.48574860122963e-04 10485 20472 -2.60171715117959e-03 10485 20496 -1.82793376238340e-01 10485 20520 -1.41134525042513e+00 10485 20544 -3.40775270230967e+00 10485 20568 -2.16294920165840e+00 10485 20592 -3.96364039902628e-01 10485 20616 -9.44696404610537e-03 10485 20880 -9.14157579495100e-03 10485 20904 -5.76961529729787e-01 10485 20928 -4.32881999660609e+00 10485 20952 -1.02216097184031e+01 10485 20976 -6.39325921400962e+00 10485 21000 -1.20828029646940e+00 10485 21024 -3.98639657652794e-02 10485 21288 -3.41592650809742e-03 10485 21312 -3.74380593890030e-01 10485 21336 -3.15244129814928e+00 10485 21360 -7.85669670876064e+00 10485 21384 -4.42373616499353e+00 10485 21408 -8.00085278224114e-01 10485 21432 -3.21841845409035e-02 10485 21696 -3.08469849872088e-04 10485 21720 -1.37927352900208e-01 10485 21744 -1.14051294456307e+00 10485 21768 -2.69515405120284e+00 10485 21792 -1.33921351264531e+00 10485 21816 -2.12057904827486e-01 10485 21840 -6.82991249166345e-03 10486 10486 1.00000000000000e+00 10487 10487 1.00000000000000e+00 10488 10488 1.00000000000000e+00 10489 10489 1.00000000000000e+00 10490 10490 1.00000000000000e+00 10491 10491 1.00000000000000e+00 10492 10492 1.00000000000000e+00 10493 10493 1.00000000000000e+00 10494 10494 1.00000000000000e+00 10495 10495 1.00000000000000e+00 10496 10496 1.00000000000000e+00 10497 10497 1.00000000000000e+00 10498 10498 1.00000000000000e+00 10499 10499 1.00000000000000e+00 10500 10500 1.00000000000000e+00 10501 10501 1.00000000000000e+00 10502 10502 1.00000000000000e+00 10503 10503 1.00000000000000e+00 10504 10504 1.00000000000000e+00 10505 10505 1.00000000000000e+00 10506 10506 1.00000000000000e+00 10507 10507 1.00000000000000e+00 10508 10508 1.00000000000000e+00 10509 10509 1.66019127419816e+01 10509 8061 8.29700000000000e-17 10509 8085 5.46280000000000e-16 10509 8661 4.70536121254547e-06 10509 8685 1.78814708764567e-04 10509 8709 5.34088471120028e-04 10509 8733 3.99813715338238e-05 10509 8757 2.29509986312700e-08 10509 8781 1.11133603000000e-12 10509 9237 1.67959048382326e-06 10509 9261 2.88298668641233e-03 10509 9285 1.24287728839448e-01 10509 9309 2.61254999604079e-01 10509 9333 1.04894232584917e-01 10509 9357 5.39569286250718e-03 10509 9381 4.10056075839960e-07 10509 9837 1.16427669681294e-04 10509 9861 1.33750852826011e-01 10509 9885 2.44145806955102e+00 10509 9909 6.05533313607166e+00 10509 9933 2.28425795486042e+00 10509 9957 1.17330424634128e-01 10509 9981 9.68204573979326e-05 10509 10413 1.43269000000000e-15 10509 10437 2.83309791446212e-04 10509 10461 3.38445502301254e-01 10509 10485 6.56258203239007e+00 10509 10533 6.07253200657621e+00 10509 10557 2.91682199132944e-01 10509 10581 6.38231870733007e-04 10509 11013 4.86770000000000e-16 10509 11037 2.27061860767542e-04 10509 11061 1.01082040273076e-01 10509 11085 2.14495058601454e+00 10509 11109 6.03243372310670e+00 10509 11133 2.67314736954836e+00 10509 11157 1.29158141991555e-01 10509 11181 7.38617469010419e-05 10509 11661 1.60503283768706e-03 10509 11685 8.90814666278496e-02 10509 11709 2.61946729281470e-01 10509 11733 1.10751375218823e-01 10509 11757 7.60696239971812e-03 10509 11781 1.80315251593800e-08 10509 12285 9.32791876860000e-10 10509 12309 1.51134942095437e-04 10509 12333 2.98307779105633e-04 10509 12357 1.13169651915077e-06 10509 12381 8.34516350000000e-13 10509 19320 -5.76558717979500e-08 10509 19344 -3.91749617691160e-07 10509 19368 -7.02160393795420e-07 10509 19392 -1.61126130499370e-07 10509 19680 -1.74352105968200e-08 10509 19704 -1.25262710500993e-03 10509 19728 -2.16090931874474e-02 10509 19752 -7.96429948358956e-02 10509 19776 -6.46783074103005e-02 10509 19800 -1.23920601170133e-02 10509 19824 -9.92519568879595e-05 10509 20088 -3.98715594254578e-04 10509 20112 -5.66160552656313e-02 10509 20136 -5.43816655026182e-01 10509 20160 -1.56150964536208e+00 10509 20184 -1.18550249725814e+00 10509 20208 -2.51340603069221e-01 10509 20232 -9.54620552641516e-03 10509 20496 -1.90576692073231e-03 10509 20520 -2.97980555261447e-01 10509 20544 -2.64775831761201e+00 10509 20568 -7.17876805185186e+00 10509 20592 -5.34832249232655e+00 10509 20616 -1.19479722097741e+00 10509 20640 -6.10196194821610e-02 10509 20664 -9.46477160706500e-08 10509 20904 -1.64331298995037e-03 10509 20928 -4.22827509282712e-01 10509 20952 -3.73623591502856e+00 10509 20976 -1.00058294587792e+01 10509 21000 -7.42284113932584e+00 10509 21024 -1.74396899578504e+00 10509 21048 -1.08175470687369e-01 10509 21072 -3.86495522040050e-07 10509 21312 -3.11177468058401e-04 10509 21336 -1.30571047099534e-01 10509 21360 -1.16968533203045e+00 10509 21384 -3.15212942479756e+00 10509 21408 -2.34143120142450e+00 10509 21432 -5.39531734989198e-01 10509 21456 -3.12514410067282e-02 10509 21480 -1.26266347100440e-07 10509 21720 -2.84904636177000e-09 10509 21744 -1.05376172650655e-02 10509 21768 -9.96338200064896e-02 10509 21792 -2.75221263027292e-01 10509 21816 -1.98215657855399e-01 10509 21840 -4.16778281377620e-02 10509 21864 -1.73196606922712e-03 10509 21888 -7.90465775745000e-09 10510 10510 1.00000000000000e+00 10511 10511 1.00000000000000e+00 10512 10512 1.00000000000000e+00 10513 10513 1.00000000000000e+00 10514 10514 1.00000000000000e+00 10515 10515 1.00000000000000e+00 10516 10516 1.00000000000000e+00 10517 10517 1.00000000000000e+00 10518 10518 1.00000000000000e+00 10519 10519 1.00000000000000e+00 10520 10520 1.00000000000000e+00 10521 10521 1.00000000000000e+00 10522 10522 1.00000000000000e+00 10523 10523 1.00000000000000e+00 10524 10524 1.00000000000000e+00 10525 10525 1.00000000000000e+00 10526 10526 1.00000000000000e+00 10527 10527 1.00000000000000e+00 10528 10528 1.00000000000000e+00 10529 10529 1.00000000000000e+00 10530 10530 1.00000000000000e+00 10531 10531 1.00000000000000e+00 10532 10532 1.00000000000000e+00 10533 10533 1.58390083592948e+01 10533 8685 5.31858846635943e-06 10533 8709 8.43467389934029e-05 10533 8733 2.80445054406424e-04 10533 8757 1.76641060064222e-04 10533 8781 2.14304096016500e-08 10533 9261 2.19066051226410e-06 10533 9285 3.00569983360132e-03 10533 9309 1.13586382165694e-01 10533 9333 2.94052596094362e-01 10533 9357 8.99707006266862e-02 10533 9381 4.93536473027638e-03 10533 9405 2.79430157966990e-06 10533 9861 3.45354354387671e-05 10533 9885 1.29265031934993e-01 10533 9909 2.27567422516412e+00 10533 9933 5.58574866139347e+00 10533 9957 2.32069493927855e+00 10533 9981 1.22356735855193e-01 10533 10005 2.20082275981338e-04 10533 10437 3.80000000000000e-19 10533 10461 3.89714704487484e-04 10533 10485 3.24085759625745e-01 10533 10509 6.07253200657621e+00 10533 10557 6.32140157665043e+00 10533 10581 3.08047702966224e-01 10533 10605 7.01342460993393e-04 10533 11061 2.14991453078897e-04 10533 11085 1.20597050544896e-01 10533 11109 2.69560330541548e+00 10533 11133 6.72471884021658e+00 10533 11157 2.77392916116140e+00 10533 11181 1.59134713973784e-01 10533 11205 1.81715951490790e-05 10533 11661 3.07268247464823e-06 10533 11685 4.58947816494339e-03 10533 11709 9.51566419060030e-02 10533 11733 3.90074702897652e-01 10533 11757 1.65476629083145e-01 10533 11781 5.91766666038578e-03 10533 11805 4.13083515611120e-07 10533 12285 7.31269937100000e-11 10533 12309 1.60494948635369e-04 10533 12333 3.90821018534082e-04 10533 12357 1.08990327590328e-04 10533 12381 1.16629760528223e-06 10533 19320 -8.12642191870804e-06 10533 19344 -1.89638474168428e-03 10533 19368 -1.05393873554721e-02 10533 19392 -1.42016680674160e-02 10533 19416 -3.21498529089224e-03 10533 19440 -3.48101433441640e-05 10533 19704 -3.89310030356545e-05 10533 19728 -1.51559787944265e-02 10533 19752 -1.85449956010229e-01 10533 19776 -6.39847535218475e-01 10533 19800 -6.26267686291773e-01 10533 19824 -1.55321867795443e-01 10533 19848 -8.02865271787041e-03 10533 20112 -2.50664090970476e-04 10533 20136 -1.18129358804486e-01 10533 20160 -1.30451795486920e+00 10533 20184 -4.25765599427593e+00 10533 20208 -4.10122884318582e+00 10533 20232 -1.09956716241355e+00 10533 20256 -7.55358123396626e-02 10533 20280 -4.23031447744498e-06 10533 20520 -4.18824570894582e-04 10533 20544 -2.65399292796340e-01 10533 20568 -2.79102250318827e+00 10533 20592 -8.88021871768801e+00 10533 20616 -8.63045626787857e+00 10533 20640 -2.47405737344559e+00 10533 20664 -2.00180555053648e-01 10533 20688 -2.19178452599128e-05 10533 20928 -9.54730890178436e-05 10533 20952 -1.36848367689047e-01 10533 20976 -1.59016329279607e+00 10533 21000 -5.30453705292584e+00 10533 21024 -5.11917555376193e+00 10533 21048 -1.43097519682753e+00 10533 21072 -1.10018885673370e-01 10533 21096 -2.42166638779766e-05 10533 21336 -1.33252547496480e-07 10533 21360 -2.03872129237755e-02 10533 21384 -2.68460388411376e-01 10533 21408 -9.36190402441622e-01 10533 21432 -8.76028072878844e-01 10533 21456 -2.34219438433417e-01 10533 21480 -1.65362016833945e-02 10533 21504 -4.99658735013291e-06 10533 21768 -1.55188264107733e-04 10533 21792 -4.98947752019862e-03 10533 21816 -1.97720813716513e-02 10533 21840 -1.29413237855625e-02 10533 21864 -2.16046850008649e-03 10533 21888 -4.61831190340914e-06 10534 10534 1.00000000000000e+00 10535 10535 1.00000000000000e+00 10536 10536 1.00000000000000e+00 10537 10537 1.00000000000000e+00 10538 10538 1.00000000000000e+00 10539 10539 1.00000000000000e+00 10540 10540 1.00000000000000e+00 10541 10541 1.00000000000000e+00 10542 10542 1.00000000000000e+00 10543 10543 1.00000000000000e+00 10544 10544 1.00000000000000e+00 10545 10545 1.00000000000000e+00 10546 10546 1.00000000000000e+00 10547 10547 1.00000000000000e+00 10548 10548 1.00000000000000e+00 10549 10549 1.00000000000000e+00 10550 10550 1.00000000000000e+00 10551 10551 1.00000000000000e+00 10552 10552 1.00000000000000e+00 10553 10553 1.00000000000000e+00 10554 10554 1.00000000000000e+00 10555 10555 1.00000000000000e+00 10556 10556 1.00000000000000e+00 10557 10557 1.66152374232951e+01 10557 8709 3.90695406012390e-07 10557 8733 3.16588033027814e-04 10557 8757 2.76673039955497e-04 10557 8781 4.54682972154234e-05 10557 8805 2.47633161065666e-06 10557 9285 7.22147823010740e-07 10557 9309 4.70380571098789e-03 10557 9333 1.03986644421698e-01 10557 9357 3.01419830152242e-01 10557 9381 1.29959229577403e-01 10557 9405 4.00256385214283e-03 10557 9429 1.31669194616130e-06 10557 9885 1.87607910286078e-05 10557 9909 1.13542902326336e-01 10557 9933 2.31426725984315e+00 10557 9957 6.01317879021471e+00 10557 9981 2.61139860278906e+00 10557 10005 1.30468906119891e-01 10557 10029 3.05165715246775e-04 10557 10485 4.67153324025490e-04 10557 10509 2.91682199132944e-01 10557 10533 6.32140157665043e+00 10557 10581 6.43803972467912e+00 10557 10605 2.56110343441903e-01 10557 10629 3.80183219577233e-04 10557 11061 1.01200000000000e-17 10557 11085 2.62041531254369e-04 10557 11109 1.38803384818406e-01 10557 11133 2.77588105773611e+00 10557 11157 7.22470846299940e+00 10557 11181 2.28682142390914e+00 10557 11205 9.56967206476604e-02 10557 11229 8.78103357304630e-07 10557 11661 6.35000000000000e-18 10557 11685 1.65821052232090e-07 10557 11709 7.20183881084140e-03 10557 11733 1.58330381854052e-01 10557 11757 3.44526895845701e-01 10557 11781 1.02944973256488e-01 10557 11805 2.48600030779962e-03 10557 12285 3.55340800000000e-14 10557 12309 2.08930460891830e-07 10557 12333 3.87416569810695e-05 10557 12357 5.98389187080676e-04 10557 12381 2.54420757694314e-04 10557 18960 -3.43528606209360e-05 10557 18984 -3.89332230272227e-04 10557 19008 -1.04490660266625e-03 10557 19032 -2.63403151354005e-04 10557 19056 -2.87059089138052e-06 10557 19320 -5.23645026792840e-07 10557 19344 -2.45335414009294e-03 10557 19368 -5.22627933309404e-02 10557 19392 -2.40577424961947e-01 10557 19416 -3.19772793067162e-01 10557 19440 -8.48036522135777e-02 10557 19464 -4.12660314887462e-03 10557 19728 -1.38112665047090e-05 10557 19752 -3.97012792058170e-02 10557 19776 -6.07890324229372e-01 10557 19800 -2.46519311508997e+00 10557 19824 -3.01355636355886e+00 10557 19848 -8.31720144615548e-01 10557 19872 -5.14093378669878e-02 10557 20136 -4.77885378091536e-05 10557 20160 -1.41157639159405e-01 10557 20184 -1.97095422806587e+00 10557 20208 -7.59830514439925e+00 10557 20232 -8.89099175463561e+00 10557 20256 -2.49991636289083e+00 10557 20280 -1.70767136446982e-01 10557 20544 -1.33092751663793e-05 10557 20568 -1.07211408631077e-01 10557 20592 -1.71506375002892e+00 10557 20616 -6.94499300146942e+00 10557 20640 -8.19445174042303e+00 10557 20664 -2.25180646794109e+00 10557 20688 -1.43634132019874e-01 10557 20952 -3.98147192210440e-07 10557 20976 -2.20016673822275e-02 10557 21000 -4.41673679756468e-01 10557 21024 -1.87921702765304e+00 10557 21048 -2.15460430129387e+00 10557 21072 -5.66300017826290e-01 10557 21096 -3.17314047065696e-02 10557 21384 -7.12208246196838e-04 10557 21408 -3.00750972078268e-02 10557 21432 -1.38745469119407e-01 10557 21456 -1.44954846645998e-01 10557 21480 -3.39913024247160e-02 10557 21504 -1.21583139608431e-03 10557 21792 -2.67275633000000e-12 10557 21816 -2.51866616999205e-06 10557 21840 -1.04201598584571e-05 10557 21864 -3.90079655830218e-06 10557 21888 -3.45535269833860e-07 10558 10558 1.00000000000000e+00 10559 10559 1.00000000000000e+00 10560 10560 1.00000000000000e+00 10561 10561 1.00000000000000e+00 10562 10562 1.00000000000000e+00 10563 10563 1.00000000000000e+00 10564 10564 1.00000000000000e+00 10565 10565 1.00000000000000e+00 10566 10566 1.00000000000000e+00 10567 10567 1.00000000000000e+00 10568 10568 1.00000000000000e+00 10569 10569 1.00000000000000e+00 10570 10570 1.00000000000000e+00 10571 10571 1.00000000000000e+00 10572 10572 1.00000000000000e+00 10573 10573 1.00000000000000e+00 10574 10574 1.00000000000000e+00 10575 10575 1.00000000000000e+00 10576 10576 1.00000000000000e+00 10577 10577 1.00000000000000e+00 10578 10578 1.00000000000000e+00 10579 10579 1.00000000000000e+00 10580 10580 1.00000000000000e+00 10581 10581 1.66107668831668e+01 10581 8709 1.07492419000000e-12 10581 8733 5.17030619608320e-07 10581 8757 9.36342827745039e-05 10581 8781 6.78079290028168e-04 10581 8805 8.08979821477049e-05 10581 8829 8.30405258521000e-09 10581 8853 1.83791670000000e-12 10581 9309 1.51877667859400e-08 10581 9333 5.78011380667552e-03 10581 9357 1.33641182211229e-01 10581 9381 3.19722565471032e-01 10581 9405 9.18742608481266e-02 10581 9429 6.97895973065632e-03 10581 9453 4.08628167584000e-09 10581 9909 4.76842667935611e-05 10581 9933 1.12349617391642e-01 10581 9957 2.63300019074896e+00 10581 9981 6.38956406917364e+00 10581 10005 2.75103404825547e+00 10581 10029 1.54296983896813e-01 10581 10053 1.02677524531000e-09 10581 10509 6.38231870733007e-04 10581 10533 3.08047702966224e-01 10581 10557 6.43803972467912e+00 10581 10605 9.48469133812474e+00 10581 10629 1.62292688555022e-01 10581 11085 1.16118000000000e-15 10581 11109 2.12410211905868e-04 10581 11133 1.63787166671295e-01 10581 11157 2.30136421296787e+00 10581 11181 8.30042343340740e+00 10581 11205 4.37323350928686e+00 10581 11229 8.16320942124727e-04 10581 11685 1.61450000000000e-16 10581 11709 7.44503075326079e-06 10581 11733 3.82984705123414e-03 10581 11757 1.06494160843875e-01 10581 11781 3.98093749650452e-01 10581 11805 5.71113368287785e-02 10581 12333 1.85443126627644e-06 10581 12357 1.20547285967324e-04 10581 12381 7.09412875459686e-05 10581 18600 -3.67222075893600e-08 10581 18624 -2.10202261173670e-07 10581 18648 -1.63349069221820e-07 10581 18960 -8.49783613857471e-05 10581 18984 -9.38575092160608e-03 10581 19008 -4.79131606910226e-02 10581 19032 -6.90657784007970e-02 10581 19056 -3.85260548717767e-02 10581 19344 -9.85236182442100e-08 10581 19368 -1.24654553297146e-02 10581 19392 -2.85679637321188e-01 10581 19416 -1.23817040319275e+00 10581 19440 -1.62540162070135e+00 10581 19464 -8.02167487971875e-01 10581 19752 -4.31404717765000e-07 10581 19776 -6.57338060232611e-02 10581 19800 -1.35589596977100e+00 10581 19824 -5.68289186565232e+00 10581 19848 -7.61855577416950e+00 10581 19872 -4.33414068707041e+00 10581 20160 -2.47764597396870e-07 10581 20184 -8.21777190579342e-02 10581 20208 -1.73717993124595e+00 10581 20232 -7.16654941689160e+00 10581 20256 -1.02980360621151e+01 10581 20280 -7.62575536054883e+00 10581 20568 -3.73102447881600e-08 10581 20592 -2.30088250458343e-02 10581 20616 -6.47334861429477e-01 10581 20640 -2.74934680092517e+00 10581 20664 -3.50368766140370e+00 10581 20688 -2.36081159036046e+00 10581 21000 -1.46560958747292e-03 10581 21024 -7.56563029286534e-02 10581 21048 -3.35634600221831e-01 10581 21072 -3.45089594634309e-01 10581 21096 -1.65636733875920e-01 10581 21408 -1.82286164144400e-08 10581 21432 -6.16935639697773e-04 10581 21456 -2.80648045101112e-03 10581 21480 -1.97299421219411e-03 10581 21504 -3.39183723660238e-04 10582 10582 1.00000000000000e+00 10583 10583 1.00000000000000e+00 10584 10584 1.00000000000000e+00 10585 10585 1.00000000000000e+00 10586 10586 1.00000000000000e+00 10587 10587 1.00000000000000e+00 10588 10588 1.00000000000000e+00 10589 10589 1.00000000000000e+00 10590 10590 1.00000000000000e+00 10591 10591 1.00000000000000e+00 10592 10592 1.00000000000000e+00 10593 10593 1.00000000000000e+00 10594 10594 1.00000000000000e+00 10595 10595 1.00000000000000e+00 10596 10596 1.00000000000000e+00 10597 10597 1.00000000000000e+00 10598 10598 1.00000000000000e+00 10599 10599 1.00000000000000e+00 10600 10600 1.00000000000000e+00 10601 10601 1.00000000000000e+00 10602 10602 1.00000000000000e+00 10603 10603 1.00000000000000e+00 10604 10604 1.00000000000000e+00 10605 10605 2.32800694414842e+01 10605 8757 7.65518854573810e-06 10605 8781 2.22694656811326e-04 10605 8805 3.22067592846329e-04 10605 8829 2.50863875796688e-04 10605 8853 2.76965240371850e-07 10605 9357 6.61404141397696e-03 10605 9381 9.66358510578624e-02 10605 9405 3.91337936004934e-01 10605 9429 2.26802376575187e-01 10605 9453 7.12317907240379e-04 10605 9933 1.09163930156516e-04 10605 9957 1.14640260342685e-01 10605 9981 2.47430333521985e+00 10605 10005 1.00664315766853e+01 10605 10029 2.82246097617276e+00 10605 10053 1.81867178720739e-04 10605 10533 7.01342460993393e-04 10605 10557 2.56110343441903e-01 10605 10581 9.48469133812474e+00 10605 10629 1.31811892162331e+00 10605 11133 9.87647472616887e-05 10605 11157 1.11544915246483e-01 10605 11181 6.37363411517340e+00 10605 11205 6.11383506306097e+00 10605 11229 3.30908086177543e-03 10605 11733 5.17228162006560e-06 10605 11757 8.22857654823490e-03 10605 11781 1.56701631720252e-01 10605 11805 4.59222211420490e-02 10605 18600 -3.54822158744668e-04 10605 18624 -1.30329133732077e-02 10605 18648 -2.35820716352027e-02 10605 18984 -3.19873872226573e-03 10605 19008 -5.62077263860385e-02 10605 19032 -7.88820640174533e-01 10605 19056 -1.26735440242571e+00 10605 19392 -2.65648743547438e-02 10605 19416 -4.87838300554057e-01 10605 19440 -4.98769432682711e+00 10605 19464 -7.25120728299913e+00 10605 19800 -6.04023209590295e-02 10605 19824 -1.20726376709726e+00 10605 19848 -1.01403827040805e+01 10605 19872 -1.34003793834150e+01 10605 20208 -2.22660675726951e-02 10605 20232 -5.87225973957996e-01 10605 20256 -7.22856710572093e+00 10605 20280 -1.09254701506259e+01 10605 20616 -2.12602681745387e-03 10605 20640 -8.82386895391254e-02 10605 20664 -1.42156879861824e+00 10605 20688 -2.28074346771641e+00 10605 21024 -5.30610853420270e-07 10605 21048 -2.27056743930521e-03 10605 21072 -3.23742370319432e-02 10605 21096 -4.88682978709389e-02 10606 10606 1.00000000000000e+00 10607 10607 1.00000000000000e+00 10608 10608 1.00000000000000e+00 10609 10609 1.00000000000000e+00 10610 10610 1.00000000000000e+00 10611 10611 1.00000000000000e+00 10612 10612 1.00000000000000e+00 10613 10613 1.00000000000000e+00 10614 10614 1.00000000000000e+00 10615 10615 1.00000000000000e+00 10616 10616 1.00000000000000e+00 10617 10617 1.00000000000000e+00 10618 10618 1.00000000000000e+00 10619 10619 1.00000000000000e+00 10620 10620 1.00000000000000e+00 10621 10621 1.00000000000000e+00 10622 10622 1.00000000000000e+00 10623 10623 1.00000000000000e+00 10624 10624 1.00000000000000e+00 10625 10625 1.00000000000000e+00 10626 10626 1.00000000000000e+00 10627 10627 1.00000000000000e+00 10628 10628 1.00000000000000e+00 10629 10629 1.21320765838514e+00 10629 8781 4.55670212600414e-06 10629 8805 1.96678742491974e-04 10629 8829 2.15051154370613e-04 10629 8853 2.65320809328760e-07 10629 9357 4.13226415410000e-10 10629 9381 3.56458842680593e-03 10629 9405 9.52927344201621e-02 10629 9429 1.07199625704488e-01 10629 9453 6.84807729967531e-04 10629 9957 1.64562920078723e-04 10629 9981 6.68679335058815e-02 10629 10005 1.66127993386266e+00 10629 10029 7.68476838705032e-01 10629 10053 1.74906230975332e-04 10629 10557 3.80183219577233e-04 10629 10581 1.62292688555022e-01 10629 10605 1.31811892162331e+00 10629 11157 1.11277923894418e-05 10629 11181 2.29883960010643e-02 10629 11205 6.30109354465522e-02 10629 11229 1.54671107146393e-04 10629 11757 1.26524962030200e-08 10629 11781 4.99765527714176e-05 10629 11805 2.68083483975965e-05 10629 18600 -2.09120147080730e-04 10629 18624 -1.20141728929724e-02 10629 18648 -2.25645047563796e-02 10629 19008 -4.02463253813658e-03 10629 19032 -2.25446163389855e-01 10629 19056 -4.22719899012753e-01 10629 19416 -1.48604071463110e-02 10629 19440 -7.91085148021617e-01 10629 19464 -1.47814744601905e+00 10629 19824 -1.07855649151753e-02 10629 19848 -4.56253711353303e-01 10629 19872 -8.37008468300378e-01 10629 20232 -1.90946386181230e-03 10629 20256 -7.27606402896118e-02 10629 20280 -1.32155033546538e-01 10629 20640 -2.69616545916969e-06 10629 20664 -8.11888108207324e-04 10629 20688 -1.60490305820046e-03 10630 10630 1.00000000000000e+00 10631 10631 1.00000000000000e+00 10632 10632 1.00000000000000e+00 10633 10633 1.00000000000000e+00 10634 10634 1.00000000000000e+00 10635 10635 1.00000000000000e+00 10636 10636 1.00000000000000e+00 10637 10637 1.00000000000000e+00 10638 10638 1.00000000000000e+00 10639 10639 1.00000000000000e+00 10640 10640 1.00000000000000e+00 10641 10641 1.00000000000000e+00 10642 10642 1.00000000000000e+00 10643 10643 1.00000000000000e+00 10644 10644 1.00000000000000e+00 10645 10645 1.00000000000000e+00 10646 10646 1.00000000000000e+00 10647 10647 1.00000000000000e+00 10648 10648 1.00000000000000e+00 10649 10649 1.00000000000000e+00 10650 10650 1.00000000000000e+00 10651 10651 1.00000000000000e+00 10652 10652 1.00000000000000e+00 10653 10653 1.00000000000000e+00 10654 10654 1.00000000000000e+00 10655 10655 1.00000000000000e+00 10656 10656 1.00000000000000e+00 10657 10657 1.00000000000000e+00 10658 10658 1.00000000000000e+00 10659 10659 1.00000000000000e+00 10660 10660 1.00000000000000e+00 10661 10661 1.00000000000000e+00 10662 10662 1.00000000000000e+00 10663 10663 1.00000000000000e+00 10664 10664 1.00000000000000e+00 10665 10665 1.00000000000000e+00 10666 10666 1.00000000000000e+00 10667 10667 1.00000000000000e+00 10668 10668 1.00000000000000e+00 10669 10669 1.00000000000000e+00 10670 10670 1.00000000000000e+00 10671 10671 1.00000000000000e+00 10672 10672 1.00000000000000e+00 10673 10673 1.00000000000000e+00 10674 10674 1.00000000000000e+00 10675 10675 1.00000000000000e+00 10676 10676 1.00000000000000e+00 10677 10677 1.00000000000000e+00 10678 10678 1.00000000000000e+00 10679 10679 1.00000000000000e+00 10680 10680 1.00000000000000e+00 10681 10681 1.00000000000000e+00 10682 10682 1.00000000000000e+00 10683 10683 1.00000000000000e+00 10684 10684 1.00000000000000e+00 10685 10685 1.00000000000000e+00 10686 10686 1.00000000000000e+00 10687 10687 1.00000000000000e+00 10688 10688 1.00000000000000e+00 10689 10689 1.00000000000000e+00 10690 10690 1.00000000000000e+00 10691 10691 1.00000000000000e+00 10692 10692 1.00000000000000e+00 10693 10693 1.00000000000000e+00 10694 10694 1.00000000000000e+00 10695 10695 1.00000000000000e+00 10696 10696 1.00000000000000e+00 10697 10697 1.00000000000000e+00 10698 10698 1.00000000000000e+00 10699 10699 1.00000000000000e+00 10700 10700 1.00000000000000e+00 10701 10701 1.00000000000000e+00 10702 10702 1.00000000000000e+00 10703 10703 1.00000000000000e+00 10704 10704 1.00000000000000e+00 10705 10705 1.00000000000000e+00 10706 10706 1.00000000000000e+00 10707 10707 1.00000000000000e+00 10708 10708 1.00000000000000e+00 10709 10709 1.00000000000000e+00 10710 10710 1.00000000000000e+00 10711 10711 1.00000000000000e+00 10712 10712 1.00000000000000e+00 10713 10713 1.00000000000000e+00 10714 10714 1.00000000000000e+00 10715 10715 1.00000000000000e+00 10716 10716 1.00000000000000e+00 10717 10717 1.00000000000000e+00 10718 10718 1.00000000000000e+00 10719 10719 1.00000000000000e+00 10720 10720 1.00000000000000e+00 10721 10721 1.00000000000000e+00 10722 10722 1.00000000000000e+00 10723 10723 1.00000000000000e+00 10724 10724 1.00000000000000e+00 10725 10725 1.00000000000000e+00 10726 10726 1.00000000000000e+00 10727 10727 1.00000000000000e+00 10728 10728 1.00000000000000e+00 10729 10729 1.00000000000000e+00 10730 10730 1.00000000000000e+00 10731 10731 1.00000000000000e+00 10732 10732 1.00000000000000e+00 10733 10733 1.00000000000000e+00 10734 10734 1.00000000000000e+00 10735 10735 1.00000000000000e+00 10736 10736 1.00000000000000e+00 10737 10737 1.00000000000000e+00 10738 10738 1.00000000000000e+00 10739 10739 1.00000000000000e+00 10740 10740 1.00000000000000e+00 10741 10741 1.00000000000000e+00 10742 10742 1.00000000000000e+00 10743 10743 1.00000000000000e+00 10744 10744 1.00000000000000e+00 10745 10745 1.00000000000000e+00 10746 10746 1.00000000000000e+00 10747 10747 1.00000000000000e+00 10748 10748 1.00000000000000e+00 10749 10749 1.00000000000000e+00 10750 10750 1.00000000000000e+00 10751 10751 1.00000000000000e+00 10752 10752 1.00000000000000e+00 10753 10753 1.00000000000000e+00 10754 10754 1.00000000000000e+00 10755 10755 1.00000000000000e+00 10756 10756 1.00000000000000e+00 10757 10757 1.00000000000000e+00 10758 10758 1.00000000000000e+00 10759 10759 1.00000000000000e+00 10760 10760 1.00000000000000e+00 10761 10761 1.00000000000000e+00 10762 10762 1.00000000000000e+00 10763 10763 1.00000000000000e+00 10764 10764 1.00000000000000e+00 10765 10765 1.00000000000000e+00 10766 10766 1.00000000000000e+00 10767 10767 1.00000000000000e+00 10768 10768 1.00000000000000e+00 10769 10769 1.00000000000000e+00 10770 10770 1.00000000000000e+00 10771 10771 1.00000000000000e+00 10772 10772 1.00000000000000e+00 10773 10773 1.00000000000000e+00 10774 10774 1.00000000000000e+00 10775 10775 1.00000000000000e+00 10776 10776 1.00000000000000e+00 10777 10777 1.00000000000000e+00 10778 10778 1.00000000000000e+00 10779 10779 1.00000000000000e+00 10780 10780 1.00000000000000e+00 10781 10781 1.00000000000000e+00 10782 10782 1.00000000000000e+00 10783 10783 1.00000000000000e+00 10784 10784 1.00000000000000e+00 10785 10785 1.00000000000000e+00 10786 10786 1.00000000000000e+00 10787 10787 1.00000000000000e+00 10788 10788 1.00000000000000e+00 10789 10789 1.00000000000000e+00 10790 10790 1.00000000000000e+00 10791 10791 1.00000000000000e+00 10792 10792 1.00000000000000e+00 10793 10793 1.00000000000000e+00 10794 10794 1.00000000000000e+00 10795 10795 1.00000000000000e+00 10796 10796 1.00000000000000e+00 10797 10797 1.00000000000000e+00 10798 10798 1.00000000000000e+00 10799 10799 1.00000000000000e+00 10800 10800 1.00000000000000e+00 10801 10801 1.00000000000000e+00 10802 10802 1.00000000000000e+00 10803 10803 1.00000000000000e+00 10804 10804 1.00000000000000e+00 10805 10805 1.00000000000000e+00 10806 10806 1.00000000000000e+00 10807 10807 1.00000000000000e+00 10808 10808 1.00000000000000e+00 10809 10809 1.00000000000000e+00 10810 10810 1.00000000000000e+00 10811 10811 1.00000000000000e+00 10812 10812 1.00000000000000e+00 10813 10813 1.00000000000000e+00 10814 10814 1.00000000000000e+00 10815 10815 1.00000000000000e+00 10816 10816 1.00000000000000e+00 10817 10817 1.00000000000000e+00 10818 10818 1.00000000000000e+00 10819 10819 1.00000000000000e+00 10820 10820 1.00000000000000e+00 10821 10821 1.00000000000000e+00 10822 10822 1.00000000000000e+00 10823 10823 1.00000000000000e+00 10824 10824 1.00000000000000e+00 10825 10825 1.00000000000000e+00 10826 10826 1.00000000000000e+00 10827 10827 1.00000000000000e+00 10828 10828 1.00000000000000e+00 10829 10829 1.00000000000000e+00 10830 10830 1.00000000000000e+00 10831 10831 1.00000000000000e+00 10832 10832 1.00000000000000e+00 10833 10833 1.00000000000000e+00 10834 10834 1.00000000000000e+00 10835 10835 1.00000000000000e+00 10836 10836 1.00000000000000e+00 10837 10837 1.00000000000000e+00 10838 10838 1.00000000000000e+00 10839 10839 1.00000000000000e+00 10840 10840 1.00000000000000e+00 10841 10841 1.00000000000000e+00 10842 10842 1.00000000000000e+00 10843 10843 1.00000000000000e+00 10844 10844 1.00000000000000e+00 10845 10845 1.00000000000000e+00 10846 10846 1.00000000000000e+00 10847 10847 1.00000000000000e+00 10848 10848 1.00000000000000e+00 10849 10849 1.00000000000000e+00 10850 10850 1.00000000000000e+00 10851 10851 1.00000000000000e+00 10852 10852 1.00000000000000e+00 10853 10853 1.00000000000000e+00 10854 10854 1.00000000000000e+00 10855 10855 1.00000000000000e+00 10856 10856 1.00000000000000e+00 10857 10857 1.00000000000000e+00 10858 10858 1.00000000000000e+00 10859 10859 1.00000000000000e+00 10860 10860 1.00000000000000e+00 10861 10861 1.00000000000000e+00 10862 10862 1.00000000000000e+00 10863 10863 1.00000000000000e+00 10864 10864 1.00000000000000e+00 10865 10865 1.00000000000000e+00 10866 10866 1.00000000000000e+00 10867 10867 1.00000000000000e+00 10868 10868 1.00000000000000e+00 10869 10869 1.00000000000000e+00 10870 10870 1.00000000000000e+00 10871 10871 1.00000000000000e+00 10872 10872 1.00000000000000e+00 10873 10873 1.00000000000000e+00 10874 10874 1.00000000000000e+00 10875 10875 1.00000000000000e+00 10876 10876 1.00000000000000e+00 10877 10877 1.00000000000000e+00 10878 10878 1.00000000000000e+00 10879 10879 1.00000000000000e+00 10880 10880 1.00000000000000e+00 10881 10881 1.00000000000000e+00 10882 10882 1.00000000000000e+00 10883 10883 1.00000000000000e+00 10884 10884 1.00000000000000e+00 10885 10885 1.00000000000000e+00 10886 10886 1.00000000000000e+00 10887 10887 1.00000000000000e+00 10888 10888 1.00000000000000e+00 10889 10889 1.00000000000000e+00 10890 10890 1.00000000000000e+00 10891 10891 1.00000000000000e+00 10892 10892 1.00000000000000e+00 10893 10893 1.00000000000000e+00 10894 10894 1.00000000000000e+00 10895 10895 1.00000000000000e+00 10896 10896 1.00000000000000e+00 10897 10897 1.00000000000000e+00 10898 10898 1.00000000000000e+00 10899 10899 1.00000000000000e+00 10900 10900 1.00000000000000e+00 10901 10901 1.00000000000000e+00 10902 10902 1.00000000000000e+00 10903 10903 1.00000000000000e+00 10904 10904 1.00000000000000e+00 10905 10905 1.00000000000000e+00 10906 10906 1.00000000000000e+00 10907 10907 1.00000000000000e+00 10908 10908 1.00000000000000e+00 10909 10909 1.00000000000000e+00 10910 10910 1.00000000000000e+00 10911 10911 1.00000000000000e+00 10912 10912 1.00000000000000e+00 10913 10913 1.00000000000000e+00 10914 10914 1.00000000000000e+00 10915 10915 1.00000000000000e+00 10916 10916 1.00000000000000e+00 10917 10917 1.00000000000000e+00 10918 10918 1.00000000000000e+00 10919 10919 1.00000000000000e+00 10920 10920 1.00000000000000e+00 10921 10921 1.00000000000000e+00 10922 10922 1.00000000000000e+00 10923 10923 1.00000000000000e+00 10924 10924 1.00000000000000e+00 10925 10925 1.00000000000000e+00 10926 10926 1.00000000000000e+00 10927 10927 1.00000000000000e+00 10928 10928 1.00000000000000e+00 10929 10929 1.00000000000000e+00 10930 10930 1.00000000000000e+00 10931 10931 1.00000000000000e+00 10932 10932 1.00000000000000e+00 10933 10933 1.00000000000000e+00 10934 10934 1.00000000000000e+00 10935 10935 1.00000000000000e+00 10936 10936 1.00000000000000e+00 10937 10937 1.00000000000000e+00 10938 10938 1.00000000000000e+00 10939 10939 1.00000000000000e+00 10940 10940 1.00000000000000e+00 10941 10941 1.00000000000000e+00 10942 10942 1.00000000000000e+00 10943 10943 1.00000000000000e+00 10944 10944 1.00000000000000e+00 10945 10945 1.00000000000000e+00 10946 10946 1.00000000000000e+00 10947 10947 1.00000000000000e+00 10948 10948 1.00000000000000e+00 10949 10949 1.00000000000000e+00 10950 10950 1.00000000000000e+00 10951 10951 1.00000000000000e+00 10952 10952 1.00000000000000e+00 10953 10953 1.00000000000000e+00 10954 10954 1.00000000000000e+00 10955 10955 1.00000000000000e+00 10956 10956 1.00000000000000e+00 10957 10957 1.00000000000000e+00 10958 10958 1.00000000000000e+00 10959 10959 1.00000000000000e+00 10960 10960 1.00000000000000e+00 10961 10961 1.00000000000000e+00 10962 10962 1.00000000000000e+00 10963 10963 1.00000000000000e+00 10964 10964 1.00000000000000e+00 10965 10965 1.00000000000000e+00 10966 10966 1.00000000000000e+00 10967 10967 1.00000000000000e+00 hypre-2.33.0/src/test/TEST_ij/data/tucker21935/IJ.A.00002000066400000000000000000011347051477326011500216340ustar00rootroot0000000000000010968 16451 10968 16451 10968 10968 1.00000000000000e+00 10969 10969 1.00000000000000e+00 10970 10970 1.00000000000000e+00 10971 10971 1.00000000000000e+00 10972 10972 1.00000000000000e+00 10973 10973 1.00000000000000e+00 10974 10974 1.00000000000000e+00 10975 10975 1.00000000000000e+00 10976 10976 1.00000000000000e+00 10977 10977 1.00000000000000e+00 10978 10978 1.00000000000000e+00 10979 10979 1.00000000000000e+00 10980 10980 1.00000000000000e+00 10981 10981 1.00000000000000e+00 10982 10982 1.00000000000000e+00 10983 10983 1.00000000000000e+00 10984 10984 1.00000000000000e+00 10985 10985 1.00000000000000e+00 10986 10986 1.00000000000000e+00 10987 10987 1.00000000000000e+00 10988 10988 1.00000000000000e+00 10989 10989 1.00000000000000e+00 10990 10990 1.00000000000000e+00 10991 10991 1.00000000000000e+00 10992 10992 1.00000000000000e+00 10993 10993 1.00000000000000e+00 10994 10994 1.00000000000000e+00 10995 10995 1.00000000000000e+00 10996 10996 1.00000000000000e+00 10997 10997 1.00000000000000e+00 10998 10998 1.00000000000000e+00 10999 10999 1.00000000000000e+00 11000 11000 1.00000000000000e+00 11001 11001 1.00000000000000e+00 11002 11002 1.00000000000000e+00 11003 11003 1.00000000000000e+00 11004 11004 1.00000000000000e+00 11005 11005 1.00000000000000e+00 11006 11006 1.00000000000000e+00 11007 11007 1.00000000000000e+00 11008 11008 1.00000000000000e+00 11009 11009 1.00000000000000e+00 11010 11010 1.00000000000000e+00 11011 11011 1.00000000000000e+00 11012 11012 1.00000000000000e+00 11013 9189 1.02677524531000e-09 11013 9213 1.13653088228283e-05 11013 9237 2.18137199729480e-05 11013 9261 1.23556813447246e-06 11013 9789 1.81867178720744e-04 11013 9813 1.17535898769438e-02 11013 9837 1.04734868936989e-02 11013 9861 6.51068255958219e-04 11013 9885 9.84462529829370e-07 11013 9909 1.82940000000000e-16 11013 10389 1.74906230975337e-04 11013 10413 2.27218828907764e-02 11013 10437 5.92060211873697e-02 11013 10461 9.08688838913305e-03 11013 10485 1.24828921303147e-06 11013 10509 4.86770000000000e-16 11013 11013 1.00019295784113e+00 11013 11037 5.96412141363928e-03 11013 11061 2.08212736614843e-03 11013 11085 4.57242407563110e-07 11013 11661 1.57623610900000e-11 11013 11685 5.45496585000000e-12 11013 20856 -1.97635568482042e-05 11013 20880 -1.30941825009839e-04 11013 20904 -2.27316425110601e-04 11013 20928 -5.18975087942571e-05 11013 20952 -2.47779430879000e-09 11013 21264 -2.95310796217861e-03 11013 21288 -1.58080846130479e-02 11013 21312 -1.89372668443841e-02 11013 21336 -4.00184406382054e-03 11013 21360 -1.54782487178357e-06 11013 21672 -5.76787102641979e-03 11013 21696 -3.06995764510268e-02 11013 21720 -3.62833187129939e-02 11013 21744 -7.64040556608129e-03 11013 21768 -3.07830518340561e-06 11014 11014 1.00000000000000e+00 11015 11015 1.00000000000000e+00 11016 11016 1.00000000000000e+00 11017 11017 1.00000000000000e+00 11018 11018 1.00000000000000e+00 11019 11019 1.00000000000000e+00 11020 11020 1.00000000000000e+00 11021 11021 1.00000000000000e+00 11022 11022 1.00000000000000e+00 11023 11023 1.00000000000000e+00 11024 11024 1.00000000000000e+00 11025 11025 1.00000000000000e+00 11026 11026 1.00000000000000e+00 11027 11027 1.00000000000000e+00 11028 11028 1.00000000000000e+00 11029 11029 1.00000000000000e+00 11030 11030 1.00000000000000e+00 11031 11031 1.00000000000000e+00 11032 11032 1.00000000000000e+00 11033 11033 1.00000000000000e+00 11034 11034 1.00000000000000e+00 11035 11035 1.00000000000000e+00 11036 11036 1.00000000000000e+00 11037 9189 4.08628167584000e-09 11037 9213 6.46479002001124e-05 11037 9237 4.20437398965713e-04 11037 9261 9.38864787359760e-05 11037 9789 7.12317907240400e-04 11037 9813 6.99586949078888e-02 11037 9837 2.29394337282826e-01 11037 9861 7.91253656423249e-02 11037 9885 4.48672969599122e-03 11037 9909 1.44666009939136e-06 11037 10389 6.84807729967551e-04 11037 10413 2.51332964486061e-01 11037 10437 3.00812933496058e+00 11037 10461 2.93990643686119e+00 11037 10485 1.26642207232519e-01 11037 10509 2.27061860767542e-04 11037 11037 1.87999395128718e+00 11037 11013 5.96412141363928e-03 11037 11061 2.24680920254791e+00 11037 11085 1.92744512039683e-01 11037 11109 2.73392609382720e-04 11037 11661 1.67498720578755e-03 11037 11685 3.63532297866538e-03 11037 11709 2.00195419374288e-06 11037 20856 -1.13643062235917e-04 11037 20880 -6.34375125082238e-03 11037 20904 -3.13274163014311e-02 11037 20928 -3.69326044520869e-02 11037 20952 -9.31784332562762e-03 11037 20976 -4.15196523486822e-04 11037 21264 -1.17009061321147e-02 11037 21288 -2.18132430886979e-01 11037 21312 -1.08493774795171e+00 11037 21336 -1.73811843761455e+00 11037 21360 -4.48334279241388e-01 11037 21384 -1.51031657139685e-02 11037 21672 -2.26063108285779e-02 11037 21696 -3.91858603018202e-01 11037 21720 -1.95058358179340e+00 11037 21744 -3.21770864406448e+00 11037 21768 -8.31443655203383e-01 11037 21792 -2.72999557635293e-02 11038 11038 1.00000000000000e+00 11039 11039 1.00000000000000e+00 11040 11040 1.00000000000000e+00 11041 11041 1.00000000000000e+00 11042 11042 1.00000000000000e+00 11043 11043 1.00000000000000e+00 11044 11044 1.00000000000000e+00 11045 11045 1.00000000000000e+00 11046 11046 1.00000000000000e+00 11047 11047 1.00000000000000e+00 11048 11048 1.00000000000000e+00 11049 11049 1.00000000000000e+00 11050 11050 1.00000000000000e+00 11051 11051 1.00000000000000e+00 11052 11052 1.00000000000000e+00 11053 11053 1.00000000000000e+00 11054 11054 1.00000000000000e+00 11055 11055 1.00000000000000e+00 11056 11056 1.00000000000000e+00 11057 11057 1.00000000000000e+00 11058 11058 1.00000000000000e+00 11059 11059 1.00000000000000e+00 11060 11060 1.00000000000000e+00 11061 9189 1.83791670000000e-12 11061 9213 7.77337397786240e-07 11061 9237 1.97291361919340e-04 11061 9261 2.69575548313881e-04 11061 9285 1.46665177000233e-04 11061 9309 5.63269850000820e-07 11061 9789 2.76965240371860e-07 11061 9813 9.82793053106761e-03 11061 9837 1.34864340673861e-01 11061 9861 2.53180377174207e-01 11061 9885 8.83750882412706e-02 11061 9909 4.31287933667580e-03 11061 9933 9.75132400737256e-06 11061 10389 2.65320809328760e-07 11061 10413 6.52643325329225e-02 11061 10437 4.59301705652270e+00 11061 10461 1.20747408504985e+01 11061 10485 3.20527510274188e+00 11061 10509 1.01082040273076e-01 11061 10533 2.14991453078897e-04 11061 10557 1.01200000000000e-17 11061 11061 1.65352612376495e+01 11061 11013 2.08212736614843e-03 11061 11037 2.24680920254791e+00 11061 11085 9.26996687393163e+00 11061 11109 4.11150698402198e-01 11061 11133 1.84499564047513e-04 11061 11157 6.14500000000000e-17 11061 11661 1.57248436422921e-01 11061 11685 7.56157576803397e-01 11061 11709 1.33556506834834e-01 11061 11733 6.16672890543132e-06 11061 12285 3.19243961200000e-11 11061 12309 2.17449701422430e-07 11061 12333 3.84760914064500e-08 11061 20496 -3.99843198830997e-04 11061 20520 -3.81933610700300e-03 11061 20544 -9.42561470530969e-03 11061 20568 -2.80363635072955e-03 11061 20592 -1.45918259762635e-04 11061 20856 -1.83644152629410e-07 11061 20880 -3.70637046823082e-03 11061 20904 -6.49202412504783e-02 11061 20928 -3.17500633505523e-01 11061 20952 -5.14460043694643e-01 11061 20976 -1.56376062952830e-01 11061 21000 -1.07430284427306e-02 11061 21024 -6.61515078038800e-08 11061 21264 -5.06717717815112e-06 11061 21288 -6.76799247529346e-02 11061 21312 -1.58757384800460e+00 11061 21336 -6.80856023493025e+00 11061 21360 -7.40748823357025e+00 11061 21384 -2.26455304050115e+00 11061 21408 -1.97918336106535e-01 11061 21432 -2.00170805911756e-05 11061 21672 -8.84884528789634e-06 11061 21696 -1.09415256228253e-01 11061 21720 -2.73110193042546e+00 11061 21744 -1.14939187741039e+01 11061 21768 -1.14588221436160e+01 11061 21792 -3.50736818545146e+00 11061 21816 -3.24429347867784e-01 11061 21840 -3.95711006277240e-05 11062 11062 1.00000000000000e+00 11063 11063 1.00000000000000e+00 11064 11064 1.00000000000000e+00 11065 11065 1.00000000000000e+00 11066 11066 1.00000000000000e+00 11067 11067 1.00000000000000e+00 11068 11068 1.00000000000000e+00 11069 11069 1.00000000000000e+00 11070 11070 1.00000000000000e+00 11071 11071 1.00000000000000e+00 11072 11072 1.00000000000000e+00 11073 11073 1.00000000000000e+00 11074 11074 1.00000000000000e+00 11075 11075 1.00000000000000e+00 11076 11076 1.00000000000000e+00 11077 11077 1.00000000000000e+00 11078 11078 1.00000000000000e+00 11079 11079 1.00000000000000e+00 11080 11080 1.00000000000000e+00 11081 11081 1.00000000000000e+00 11082 11082 1.00000000000000e+00 11083 11083 1.00000000000000e+00 11084 11084 1.00000000000000e+00 11085 9237 1.54657054999068e-06 11085 9261 2.67866754088808e-04 11085 9285 4.54537256974696e-04 11085 9309 1.97278770701296e-05 11085 9333 1.74930753381091e-06 11085 9837 5.64636705605473e-03 11085 9861 1.02243790726413e-01 11085 9885 3.19728559420914e-01 11085 9909 1.46585707143302e-01 11085 9933 4.53171246542379e-03 11085 9957 2.74962501930980e-06 11085 10413 1.26615946688091e-06 11085 10437 2.69689879613938e-01 11085 10461 4.15240925190634e+00 11085 10485 6.20292311079316e+00 11085 10509 2.14495058601454e+00 11085 10533 1.20597050544896e-01 11085 10557 2.62041531254369e-04 11085 10581 1.16118000000000e-15 11085 11085 2.55581485016717e+01 11085 11013 4.57242407563110e-07 11085 11037 1.92744512039683e-01 11085 11061 9.26996687393163e+00 11085 11109 8.40787723111261e+00 11085 11133 3.37952987363567e-01 11085 11157 2.67258390988057e-04 11085 11181 1.70813000000000e-15 11085 11661 3.02172057297933e-01 11085 11685 5.54000696248055e+00 11085 11709 5.44645677899715e+00 11085 11733 2.50073467614380e-01 11085 11757 1.59825900986152e-04 11085 12285 8.87219725627950e-07 11085 12309 8.35456992673731e-03 11085 12333 4.31692185634936e-03 11085 12357 2.36590348617509e-06 11085 20112 -2.45870515439590e-07 11085 20136 -4.68209319752308e-05 11085 20160 -1.93029350231713e-04 11085 20184 -8.35721701630065e-05 11085 20208 -9.43368006238351e-06 11085 20496 -4.19575438955604e-04 11085 20520 -2.38431983512818e-02 11085 20544 -1.43573546139148e-01 11085 20568 -2.48937627752015e-01 11085 20592 -8.96751616157939e-02 11085 20616 -8.79520094271833e-03 11085 20640 -1.76489563238000e-09 11085 20904 -9.12151484470005e-03 11085 20928 -3.02877918445017e-01 11085 20952 -1.52603805139536e+00 11085 20976 -2.17167163998999e+00 11085 21000 -8.51279404173917e-01 11085 21024 -1.01470518843153e-01 11085 21048 -3.96784765631889e-04 11085 21312 -8.86963956974830e-02 11085 21336 -1.88437508933354e+00 11085 21360 -8.42168416152418e+00 11085 21384 -1.11982184290237e+01 11085 21408 -5.46128485173979e+00 11085 21432 -8.34970990283484e-01 11085 21456 -6.21525660309246e-03 11085 21720 -1.24451148894911e-01 11085 21744 -2.26850405724528e+00 11085 21768 -9.88947253249705e+00 11085 21792 -1.36483898526973e+01 11085 21816 -7.28706157576696e+00 11085 21840 -1.18740850620952e+00 11085 21864 -9.65306573404814e-03 11086 11086 1.00000000000000e+00 11087 11087 1.00000000000000e+00 11088 11088 1.00000000000000e+00 11089 11089 1.00000000000000e+00 11090 11090 1.00000000000000e+00 11091 11091 1.00000000000000e+00 11092 11092 1.00000000000000e+00 11093 11093 1.00000000000000e+00 11094 11094 1.00000000000000e+00 11095 11095 1.00000000000000e+00 11096 11096 1.00000000000000e+00 11097 11097 1.00000000000000e+00 11098 11098 1.00000000000000e+00 11099 11099 1.00000000000000e+00 11100 11100 1.00000000000000e+00 11101 11101 1.00000000000000e+00 11102 11102 1.00000000000000e+00 11103 11103 1.00000000000000e+00 11104 11104 1.00000000000000e+00 11105 11105 1.00000000000000e+00 11106 11106 1.00000000000000e+00 11107 11107 1.00000000000000e+00 11108 11108 1.00000000000000e+00 11109 9261 8.73668005157836e-06 11109 9285 1.17189641502781e-04 11109 9309 6.35178349373478e-04 11109 9333 9.19256200499717e-05 11109 9837 3.96083470000000e-13 11109 9861 5.85510262322295e-03 11109 9885 1.48638855963742e-01 11109 9909 3.28037469003487e-01 11109 9933 1.04668459507660e-01 11109 9957 5.70101788762034e-03 11109 9981 6.81126937739491e-06 11109 10437 2.02409678011774e-04 11109 10461 1.01036021558392e-01 11109 10485 2.20243939165187e+00 11109 10509 6.03243372310670e+00 11109 10533 2.69560330541548e+00 11109 10557 1.38803384818406e-01 11109 10581 2.12410211905868e-04 11109 11109 1.79804363934455e+01 11109 11037 2.73392609382720e-04 11109 11061 4.11150698402198e-01 11109 11085 8.40787723111261e+00 11109 11133 6.00181058392082e+00 11109 11157 3.83651946384836e-01 11109 11181 4.30184941155486e-04 11109 11661 3.70617261712412e-02 11109 11685 3.62600246314944e+00 11109 11709 1.12062297642637e+01 11109 11733 3.14714061325170e+00 11109 11757 9.86337930066215e-02 11109 11781 1.55156966074487e-04 11109 12285 1.86054858380156e-06 11109 12309 9.79813381742778e-02 11109 12333 1.55044360737332e-01 11109 12357 7.50438699090538e-03 11109 12381 4.80711473218400e-08 11109 20112 -4.73650354579940e-07 11109 20136 -1.98398564923316e-03 11109 20160 -1.95621366677711e-02 11109 20184 -5.17816687505501e-02 11109 20208 -2.46988284185836e-02 11109 20232 -3.26638239810662e-03 11109 20520 -3.81608675529030e-03 11109 20544 -1.31722113288676e-01 11109 20568 -7.70581711034190e-01 11109 20592 -1.42191071427146e+00 11109 20616 -7.08432062787755e-01 11109 20640 -1.04269346786886e-01 11109 20664 -6.38658904575288e-04 11109 20928 -2.05626619650528e-02 11109 20952 -6.43339735310646e-01 11109 20976 -3.63348164739573e+00 11109 21000 -6.52746285474599e+00 11109 21024 -3.34211054867218e+00 11109 21048 -5.12343280474981e-01 11109 21072 -5.05501392377803e-03 11109 21336 -2.67141945964825e-02 11109 21360 -9.28686431603799e-01 11109 21384 -5.85915587839840e+00 11109 21408 -1.17788140657174e+01 11109 21432 -5.66644235563066e+00 11109 21456 -8.37895207133347e-01 11109 21480 -1.53507695888783e-02 11109 21744 -8.66206699074882e-03 11109 21768 -5.86323053563036e-01 11109 21792 -4.42153745514200e+00 11109 21816 -9.81224485046785e+00 11109 21840 -3.96155814643512e+00 11109 21864 -4.83551374784512e-01 11109 21888 -1.19215732302678e-02 11110 11110 1.00000000000000e+00 11111 11111 1.00000000000000e+00 11112 11112 1.00000000000000e+00 11113 11113 1.00000000000000e+00 11114 11114 1.00000000000000e+00 11115 11115 1.00000000000000e+00 11116 11116 1.00000000000000e+00 11117 11117 1.00000000000000e+00 11118 11118 1.00000000000000e+00 11119 11119 1.00000000000000e+00 11120 11120 1.00000000000000e+00 11121 11121 1.00000000000000e+00 11122 11122 1.00000000000000e+00 11123 11123 1.00000000000000e+00 11124 11124 1.00000000000000e+00 11125 11125 1.00000000000000e+00 11126 11126 1.00000000000000e+00 11127 11127 1.00000000000000e+00 11128 11128 1.00000000000000e+00 11129 11129 1.00000000000000e+00 11130 11130 1.00000000000000e+00 11131 11131 1.00000000000000e+00 11132 11132 1.00000000000000e+00 11133 9285 1.40334369341953e-05 11133 9309 1.86724261971482e-04 11133 9333 1.52045374293928e-04 11133 9357 1.33659463189933e-04 11133 9381 8.42870972887720e-07 11133 9861 1.66357890694850e-07 11133 9885 4.53064416783996e-03 11133 9909 1.19649369036847e-01 11133 9933 3.25771669079225e-01 11133 9957 1.17467751532462e-01 11133 9981 3.35210990307824e-03 11133 10005 1.53658882619254e-05 11133 10461 1.14998784692895e-04 11133 10485 1.03910226659851e-01 11133 10509 2.67314736954836e+00 11133 10533 6.72471884021658e+00 11133 10557 2.77588105773611e+00 11133 10581 1.63787166671295e-01 11133 10605 9.87647472616887e-05 11133 11133 1.81406348468679e+01 11133 11061 1.84499564047513e-04 11133 11085 3.37952987363567e-01 11133 11109 6.00181058392082e+00 11133 11157 7.60940118776593e+00 11133 11181 3.88254869960630e-01 11133 11205 3.23989771589726e-04 11133 11661 6.61673559220383e-06 11133 11685 1.36090564095548e-01 11133 11709 2.68265796979808e+00 11133 11733 5.96431524939496e+00 11133 11757 2.68222047618861e+00 11133 11781 1.15026971954092e-01 11133 11805 1.28664970767168e-04 11133 12285 1.76934258518450e-07 11133 12309 5.66352263340686e-02 11133 12333 2.98235611124608e-01 11133 12357 1.09481969201778e-01 11133 12381 4.32657486010509e-03 11133 12933 5.18496828096320e-07 11133 12957 3.30881342016391e-05 11133 12981 4.55990495249583e-06 11133 19752 -1.88711314146378e-05 11133 19776 -1.29536421402409e-03 11133 19800 -5.60829570506776e-03 11133 19824 -4.05950296912945e-03 11133 19848 -7.09905820190979e-04 11133 20136 -4.73461040574712e-04 11133 20160 -3.11108491462272e-02 11133 20184 -2.45488223812452e-01 11133 20208 -6.03687179371132e-01 11133 20232 -3.75923620321781e-01 11133 20256 -6.28594643042406e-02 11133 20280 -2.44065315422997e-04 11133 20544 -5.36026349040993e-03 11133 20568 -2.92463126461187e-01 11133 20592 -2.11930396500530e+00 11133 20616 -4.89729124264465e+00 11133 20640 -3.06527398950034e+00 11133 20664 -5.38961450759760e-01 11133 20688 -8.02848167036077e-03 11133 20952 -1.45815447323941e-02 11133 20976 -7.58041586363691e-01 11133 21000 -5.28864690628313e+00 11133 21024 -1.18093709731950e+01 11133 21048 -7.34164664187936e+00 11133 21072 -1.33316206270331e+00 11133 21096 -3.10803560498793e-02 11133 21360 -4.43604484561137e-03 11133 21384 -4.08296859121552e-01 11133 21408 -2.99889266328815e+00 11133 21432 -6.68777816209343e+00 11133 21456 -3.72278010225788e+00 11133 21480 -6.38508544939168e-01 11133 21504 -1.75666651323277e-02 11133 21768 -2.42406379375072e-04 11133 21792 -1.03422884076192e-01 11133 21816 -7.35724208401048e-01 11133 21840 -1.51207846681767e+00 11133 21864 -7.56106341981185e-01 11133 21888 -1.17498240106757e-01 11133 21912 -2.63702574884997e-03 11134 11134 1.00000000000000e+00 11135 11135 1.00000000000000e+00 11136 11136 1.00000000000000e+00 11137 11137 1.00000000000000e+00 11138 11138 1.00000000000000e+00 11139 11139 1.00000000000000e+00 11140 11140 1.00000000000000e+00 11141 11141 1.00000000000000e+00 11142 11142 1.00000000000000e+00 11143 11143 1.00000000000000e+00 11144 11144 1.00000000000000e+00 11145 11145 1.00000000000000e+00 11146 11146 1.00000000000000e+00 11147 11147 1.00000000000000e+00 11148 11148 1.00000000000000e+00 11149 11149 1.00000000000000e+00 11150 11150 1.00000000000000e+00 11151 11151 1.00000000000000e+00 11152 11152 1.00000000000000e+00 11153 11153 1.00000000000000e+00 11154 11154 1.00000000000000e+00 11155 11155 1.00000000000000e+00 11156 11156 1.00000000000000e+00 11157 9309 2.40795486257658e-06 11157 9333 2.64738694593928e-04 11157 9357 5.42606048985629e-04 11157 9381 2.10763663817737e-05 11157 9405 1.08879937028273e-06 11157 9885 1.07354659163106e-06 11157 9909 3.37533779248334e-03 11157 9933 1.30017308321321e-01 11157 9957 3.05741013405653e-01 11157 9981 1.35101238191692e-01 11157 10005 3.49349886848903e-03 11157 10029 1.43358216180985e-06 11157 10485 1.40199035422934e-04 11157 10509 1.29158141991555e-01 11157 10533 2.77392916116140e+00 11157 10557 7.22470846299940e+00 11157 10581 2.30136421296787e+00 11157 10605 1.11544915246483e-01 11157 10629 1.11277923894418e-05 11157 11157 1.85107007957694e+01 11157 11061 6.14500000000000e-17 11157 11085 2.67258390988057e-04 11157 11109 3.83651946384836e-01 11157 11133 7.60940118776593e+00 11157 11181 5.81461242173274e+00 11157 11205 2.78118470954529e-01 11157 11229 8.97612361523910e-07 11157 11661 3.85400000000000e-17 11157 11685 2.33188526392936e-04 11157 11709 1.04720627674973e-01 11157 11733 2.64884504318024e+00 11157 11757 6.98081283453382e+00 11157 11781 3.09914208319482e+00 11157 11805 4.82735193069447e-02 11157 12285 1.91012521360000e-10 11157 12309 2.93365015021255e-03 11157 12333 9.08790737020028e-02 11157 12357 2.79777465397493e-01 11157 12381 1.29727964301456e-01 11157 12933 3.19208832744835e-06 11157 12957 3.54827271089055e-04 11157 12981 7.20900767794635e-05 11157 19392 -1.69759551982024e-05 11157 19416 -8.75407316449926e-05 11157 19440 -9.55235986069338e-05 11157 19464 -1.96369108521828e-05 11157 19752 -8.75431199719517e-06 11157 19776 -5.15015269182182e-03 11157 19800 -6.35762543224470e-02 11157 19824 -1.94606147503332e-01 11157 19848 -1.13112689805215e-01 11157 19872 -2.05692093069994e-02 11157 20160 -9.44207889060297e-04 11157 20184 -1.09952822002811e-01 11157 20208 -1.01738905164712e+00 11157 20232 -2.67231919083987e+00 11157 20256 -1.43888709538295e+00 11157 20280 -3.00034719279313e-01 11157 20568 -4.02285784986329e-03 11157 20592 -4.60405244955113e-01 11157 20616 -3.98187100407165e+00 11157 20640 -1.00015592700934e+01 11157 20664 -5.48334295921252e+00 11157 20688 -1.28138291463893e+00 11157 20976 -2.41855455161594e-03 11157 21000 -4.87379513125287e-01 11157 21024 -4.28313906253423e+00 11157 21048 -1.09547396060211e+01 11157 21072 -6.75754988964425e+00 11157 21096 -1.79324213756294e+00 11157 21384 -3.77341038477304e-04 11157 21408 -1.24457816678196e-01 11157 21432 -1.10467050991725e+00 11157 21456 -2.84276194806433e+00 11157 21480 -1.79211733908782e+00 11157 21504 -4.70523537717542e-01 11157 21792 -1.62243194400000e-11 11157 21816 -6.72695047920776e-03 11157 21840 -6.09452274392252e-02 11157 21864 -1.57084032693365e-01 11157 21888 -9.39954658147455e-02 11157 21912 -2.04644255858383e-02 11158 11158 1.00000000000000e+00 11159 11159 1.00000000000000e+00 11160 11160 1.00000000000000e+00 11161 11161 1.00000000000000e+00 11162 11162 1.00000000000000e+00 11163 11163 1.00000000000000e+00 11164 11164 1.00000000000000e+00 11165 11165 1.00000000000000e+00 11166 11166 1.00000000000000e+00 11167 11167 1.00000000000000e+00 11168 11168 1.00000000000000e+00 11169 11169 1.00000000000000e+00 11170 11170 1.00000000000000e+00 11171 11171 1.00000000000000e+00 11172 11172 1.00000000000000e+00 11173 11173 1.00000000000000e+00 11174 11174 1.00000000000000e+00 11175 11175 1.00000000000000e+00 11176 11176 1.00000000000000e+00 11177 11177 1.00000000000000e+00 11178 11178 1.00000000000000e+00 11179 11179 1.00000000000000e+00 11180 11180 1.00000000000000e+00 11181 9333 6.98380998805087e-06 11181 9357 1.01435749871591e-04 11181 9381 4.71482473101208e-04 11181 9405 1.28078995586540e-04 11181 9909 2.33546346859171e-06 11181 9933 3.14962360091577e-03 11181 9957 1.41458480609622e-01 11181 9981 2.84023234766724e-01 11181 10005 1.65911619907652e-01 11181 10029 9.74515294596646e-03 11181 10509 7.38617469010419e-05 11181 10533 1.59134713973784e-01 11181 10557 2.28682142390914e+00 11181 10581 8.30042343340740e+00 11181 10605 6.37363411517340e+00 11181 10629 2.29883960010643e-02 11181 11181 2.52133658919617e+01 11181 11085 1.70813000000000e-15 11181 11109 4.30184941155486e-04 11181 11133 3.88254869960630e-01 11181 11157 5.81461242173274e+00 11181 11205 8.47559702554716e+00 11181 11229 5.01825510064327e-04 11181 11685 2.37500000000000e-16 11181 11709 2.94496133374704e-04 11181 11733 1.37148490235065e-01 11181 11757 3.76737230205428e+00 11181 11781 9.91943451262152e+00 11181 11805 6.74357737899526e-01 11181 12309 5.17938663274511e-06 11181 12333 2.98352467610327e-03 11181 12357 2.45504972402688e-01 11181 12381 3.21523235303077e-01 11181 12933 7.09230616116300e-07 11181 12957 1.80194811187148e-04 11181 12981 4.59011807340390e-05 11181 19392 -2.68364539589372e-04 11181 19416 -7.88893963817180e-03 11181 19440 -5.86754948615230e-02 11181 19464 -6.91058902851671e-02 11181 19776 -1.43822464621433e-04 11181 19800 -3.63021842950985e-02 11181 19824 -3.17162331399183e-01 11181 19848 -1.92125528213321e+00 11181 19872 -2.55228025707641e+00 11181 20184 -7.66819923937583e-04 11181 20208 -2.28262293221435e-01 11181 20232 -1.76103804557894e+00 11181 20256 -9.05696095074154e+00 11181 20280 -1.16470936735658e+01 11181 20592 -9.09969541231178e-04 11181 20616 -4.02728245207732e-01 11181 20640 -2.92410451374061e+00 11181 20664 -1.16102424187957e+01 11181 20688 -1.31344205713088e+01 11181 21000 -1.91637324661208e-04 11181 21024 -1.63888366341903e-01 11181 21048 -1.39480511332762e+00 11181 21072 -5.92201974611267e+00 11181 21096 -6.32291240332932e+00 11181 21408 -2.68148023391800e-08 11181 21432 -1.94860308560985e-02 11181 21456 -2.02228954966414e-01 11181 21480 -9.48787970187869e-01 11181 21504 -9.88607456833578e-01 11181 21840 -7.56520811581522e-05 11181 21864 -1.65556807285428e-03 11181 21888 -8.34695865135758e-03 11181 21912 -7.07189490284714e-03 11182 11182 1.00000000000000e+00 11183 11183 1.00000000000000e+00 11184 11184 1.00000000000000e+00 11185 11185 1.00000000000000e+00 11186 11186 1.00000000000000e+00 11187 11187 1.00000000000000e+00 11188 11188 1.00000000000000e+00 11189 11189 1.00000000000000e+00 11190 11190 1.00000000000000e+00 11191 11191 1.00000000000000e+00 11192 11192 1.00000000000000e+00 11193 11193 1.00000000000000e+00 11194 11194 1.00000000000000e+00 11195 11195 1.00000000000000e+00 11196 11196 1.00000000000000e+00 11197 11197 1.00000000000000e+00 11198 11198 1.00000000000000e+00 11199 11199 1.00000000000000e+00 11200 11200 1.00000000000000e+00 11201 11201 1.00000000000000e+00 11202 11202 1.00000000000000e+00 11203 11203 1.00000000000000e+00 11204 11204 1.00000000000000e+00 11205 8781 1.94460000000000e-16 11205 8805 2.85680000000000e-16 11205 9357 3.01784208052601e-06 11205 9381 2.34927877494198e-04 11205 9405 1.19958834153317e-04 11205 9429 4.05234314351900e-08 11205 9933 1.82413221143832e-06 11205 9957 3.27777054418452e-03 11205 9981 1.15120413221381e-01 11205 10005 3.28881041915935e-01 11205 10029 3.01114647711880e-02 11205 10533 1.81715951490790e-05 11205 10557 9.56967206476604e-02 11205 10581 4.37323350928686e+00 11205 10605 6.11383506306097e+00 11205 10629 6.30109354465522e-02 11205 11205 6.60889732475931e+00 11205 11133 3.23989771589726e-04 11205 11157 2.78118470954529e-01 11205 11181 8.47559702554716e+00 11205 11229 6.42960599027254e-04 11205 11733 2.39044322190859e-04 11205 11757 1.48862480810981e-01 11205 11781 1.35780839835555e+00 11205 11805 1.83378625356739e-01 11205 12333 1.36192251944519e-06 11205 12357 7.34843574811564e-03 11205 12381 1.18136420444695e-02 11205 19008 -1.37368931380000e-10 11205 19032 -1.55434573406260e-07 11205 19056 -3.09907564292870e-07 11205 19392 -9.74644038470928e-06 11205 19416 -7.04889861285736e-03 11205 19440 -1.27735214090192e-01 11205 19464 -2.06381545340386e-01 11205 19800 -8.30543836997982e-05 11205 19824 -6.26822243240935e-02 11205 19848 -1.64156849315694e+00 11205 19872 -2.84652083002141e+00 11205 20208 -1.86284564303335e-04 11205 20232 -1.57674992663912e-01 11205 20256 -4.99269484567977e+00 11205 20280 -8.88650814138403e+00 11205 20616 -4.51231632600859e-05 11205 20640 -8.56064705006757e-02 11205 20664 -2.51925394366327e+00 11205 20688 -4.44043579606656e+00 11205 21024 -2.63635274781210e-07 11205 21048 -1.42858512538468e-02 11205 21072 -4.17890200361980e-01 11205 21096 -7.35786296464176e-01 11205 21456 -4.01571096527292e-04 11205 21480 -1.88624550732948e-02 11205 21504 -3.49139124708985e-02 11206 11206 1.00000000000000e+00 11207 11207 1.00000000000000e+00 11208 11208 1.00000000000000e+00 11209 11209 1.00000000000000e+00 11210 11210 1.00000000000000e+00 11211 11211 1.00000000000000e+00 11212 11212 1.00000000000000e+00 11213 11213 1.00000000000000e+00 11214 11214 1.00000000000000e+00 11215 11215 1.00000000000000e+00 11216 11216 1.00000000000000e+00 11217 11217 1.00000000000000e+00 11218 11218 1.00000000000000e+00 11219 11219 1.00000000000000e+00 11220 11220 1.00000000000000e+00 11221 11221 1.00000000000000e+00 11222 11222 1.00000000000000e+00 11223 11223 1.00000000000000e+00 11224 11224 1.00000000000000e+00 11225 11225 1.00000000000000e+00 11226 11226 1.00000000000000e+00 11227 11227 1.00000000000000e+00 11228 11228 1.00000000000000e+00 11229 8781 2.69600000000000e-17 11229 8805 3.96000000000000e-17 11229 9357 1.65361740000000e-13 11229 9381 5.61618000186800e-08 11229 9405 3.75230044358600e-08 11229 9429 5.88890614340000e-09 11229 9957 1.62635643746720e-07 11229 9981 8.29054817407590e-05 11229 10005 7.01132519780404e-04 11229 10029 7.80904127106635e-05 11229 10557 8.78103357304630e-07 11229 10581 8.16320942124727e-04 11229 10605 3.30908086177543e-03 11229 10629 1.54671107146393e-04 11229 11229 1.00000068632295e+00 11229 11157 8.97612361523910e-07 11229 11181 5.01825510064327e-04 11229 11205 6.42960599027254e-04 11229 11757 1.31921271842000e-09 11229 11781 5.22093285751291e-06 11229 11805 2.80088098136366e-06 11229 19008 -1.90423473400000e-11 11229 19032 -2.25852715468000e-08 11229 19056 -4.50372466621900e-08 11229 19416 -1.74276804760183e-06 11229 19440 -2.69315925168934e-04 11229 19464 -5.26432474004655e-04 11229 19824 -7.17169031686497e-06 11229 19848 -1.16143813803568e-03 11229 19872 -2.27267444385331e-03 11229 20232 -2.54630692488367e-06 11229 20256 -6.07278449815352e-04 11229 20280 -1.19673275115652e-03 11229 20640 -2.00903761667800e-07 11229 20664 -8.45132164331512e-05 11229 20688 -1.67620106534628e-04 11230 11230 1.00000000000000e+00 11231 11231 1.00000000000000e+00 11232 11232 1.00000000000000e+00 11233 11233 1.00000000000000e+00 11234 11234 1.00000000000000e+00 11235 11235 1.00000000000000e+00 11236 11236 1.00000000000000e+00 11237 11237 1.00000000000000e+00 11238 11238 1.00000000000000e+00 11239 11239 1.00000000000000e+00 11240 11240 1.00000000000000e+00 11241 11241 1.00000000000000e+00 11242 11242 1.00000000000000e+00 11243 11243 1.00000000000000e+00 11244 11244 1.00000000000000e+00 11245 11245 1.00000000000000e+00 11246 11246 1.00000000000000e+00 11247 11247 1.00000000000000e+00 11248 11248 1.00000000000000e+00 11249 11249 1.00000000000000e+00 11250 11250 1.00000000000000e+00 11251 11251 1.00000000000000e+00 11252 11252 1.00000000000000e+00 11253 11253 1.00000000000000e+00 11254 11254 1.00000000000000e+00 11255 11255 1.00000000000000e+00 11256 11256 1.00000000000000e+00 11257 11257 1.00000000000000e+00 11258 11258 1.00000000000000e+00 11259 11259 1.00000000000000e+00 11260 11260 1.00000000000000e+00 11261 11261 1.00000000000000e+00 11262 11262 1.00000000000000e+00 11263 11263 1.00000000000000e+00 11264 11264 1.00000000000000e+00 11265 11265 1.00000000000000e+00 11266 11266 1.00000000000000e+00 11267 11267 1.00000000000000e+00 11268 11268 1.00000000000000e+00 11269 11269 1.00000000000000e+00 11270 11270 1.00000000000000e+00 11271 11271 1.00000000000000e+00 11272 11272 1.00000000000000e+00 11273 11273 1.00000000000000e+00 11274 11274 1.00000000000000e+00 11275 11275 1.00000000000000e+00 11276 11276 1.00000000000000e+00 11277 11277 1.00000000000000e+00 11278 11278 1.00000000000000e+00 11279 11279 1.00000000000000e+00 11280 11280 1.00000000000000e+00 11281 11281 1.00000000000000e+00 11282 11282 1.00000000000000e+00 11283 11283 1.00000000000000e+00 11284 11284 1.00000000000000e+00 11285 11285 1.00000000000000e+00 11286 11286 1.00000000000000e+00 11287 11287 1.00000000000000e+00 11288 11288 1.00000000000000e+00 11289 11289 1.00000000000000e+00 11290 11290 1.00000000000000e+00 11291 11291 1.00000000000000e+00 11292 11292 1.00000000000000e+00 11293 11293 1.00000000000000e+00 11294 11294 1.00000000000000e+00 11295 11295 1.00000000000000e+00 11296 11296 1.00000000000000e+00 11297 11297 1.00000000000000e+00 11298 11298 1.00000000000000e+00 11299 11299 1.00000000000000e+00 11300 11300 1.00000000000000e+00 11301 11301 1.00000000000000e+00 11302 11302 1.00000000000000e+00 11303 11303 1.00000000000000e+00 11304 11304 1.00000000000000e+00 11305 11305 1.00000000000000e+00 11306 11306 1.00000000000000e+00 11307 11307 1.00000000000000e+00 11308 11308 1.00000000000000e+00 11309 11309 1.00000000000000e+00 11310 11310 1.00000000000000e+00 11311 11311 1.00000000000000e+00 11312 11312 1.00000000000000e+00 11313 11313 1.00000000000000e+00 11314 11314 1.00000000000000e+00 11315 11315 1.00000000000000e+00 11316 11316 1.00000000000000e+00 11317 11317 1.00000000000000e+00 11318 11318 1.00000000000000e+00 11319 11319 1.00000000000000e+00 11320 11320 1.00000000000000e+00 11321 11321 1.00000000000000e+00 11322 11322 1.00000000000000e+00 11323 11323 1.00000000000000e+00 11324 11324 1.00000000000000e+00 11325 11325 1.00000000000000e+00 11326 11326 1.00000000000000e+00 11327 11327 1.00000000000000e+00 11328 11328 1.00000000000000e+00 11329 11329 1.00000000000000e+00 11330 11330 1.00000000000000e+00 11331 11331 1.00000000000000e+00 11332 11332 1.00000000000000e+00 11333 11333 1.00000000000000e+00 11334 11334 1.00000000000000e+00 11335 11335 1.00000000000000e+00 11336 11336 1.00000000000000e+00 11337 11337 1.00000000000000e+00 11338 11338 1.00000000000000e+00 11339 11339 1.00000000000000e+00 11340 11340 1.00000000000000e+00 11341 11341 1.00000000000000e+00 11342 11342 1.00000000000000e+00 11343 11343 1.00000000000000e+00 11344 11344 1.00000000000000e+00 11345 11345 1.00000000000000e+00 11346 11346 1.00000000000000e+00 11347 11347 1.00000000000000e+00 11348 11348 1.00000000000000e+00 11349 11349 1.00000000000000e+00 11350 11350 1.00000000000000e+00 11351 11351 1.00000000000000e+00 11352 11352 1.00000000000000e+00 11353 11353 1.00000000000000e+00 11354 11354 1.00000000000000e+00 11355 11355 1.00000000000000e+00 11356 11356 1.00000000000000e+00 11357 11357 1.00000000000000e+00 11358 11358 1.00000000000000e+00 11359 11359 1.00000000000000e+00 11360 11360 1.00000000000000e+00 11361 11361 1.00000000000000e+00 11362 11362 1.00000000000000e+00 11363 11363 1.00000000000000e+00 11364 11364 1.00000000000000e+00 11365 11365 1.00000000000000e+00 11366 11366 1.00000000000000e+00 11367 11367 1.00000000000000e+00 11368 11368 1.00000000000000e+00 11369 11369 1.00000000000000e+00 11370 11370 1.00000000000000e+00 11371 11371 1.00000000000000e+00 11372 11372 1.00000000000000e+00 11373 11373 1.00000000000000e+00 11374 11374 1.00000000000000e+00 11375 11375 1.00000000000000e+00 11376 11376 1.00000000000000e+00 11377 11377 1.00000000000000e+00 11378 11378 1.00000000000000e+00 11379 11379 1.00000000000000e+00 11380 11380 1.00000000000000e+00 11381 11381 1.00000000000000e+00 11382 11382 1.00000000000000e+00 11383 11383 1.00000000000000e+00 11384 11384 1.00000000000000e+00 11385 11385 1.00000000000000e+00 11386 11386 1.00000000000000e+00 11387 11387 1.00000000000000e+00 11388 11388 1.00000000000000e+00 11389 11389 1.00000000000000e+00 11390 11390 1.00000000000000e+00 11391 11391 1.00000000000000e+00 11392 11392 1.00000000000000e+00 11393 11393 1.00000000000000e+00 11394 11394 1.00000000000000e+00 11395 11395 1.00000000000000e+00 11396 11396 1.00000000000000e+00 11397 11397 1.00000000000000e+00 11398 11398 1.00000000000000e+00 11399 11399 1.00000000000000e+00 11400 11400 1.00000000000000e+00 11401 11401 1.00000000000000e+00 11402 11402 1.00000000000000e+00 11403 11403 1.00000000000000e+00 11404 11404 1.00000000000000e+00 11405 11405 1.00000000000000e+00 11406 11406 1.00000000000000e+00 11407 11407 1.00000000000000e+00 11408 11408 1.00000000000000e+00 11409 11409 1.00000000000000e+00 11410 11410 1.00000000000000e+00 11411 11411 1.00000000000000e+00 11412 11412 1.00000000000000e+00 11413 11413 1.00000000000000e+00 11414 11414 1.00000000000000e+00 11415 11415 1.00000000000000e+00 11416 11416 1.00000000000000e+00 11417 11417 1.00000000000000e+00 11418 11418 1.00000000000000e+00 11419 11419 1.00000000000000e+00 11420 11420 1.00000000000000e+00 11421 11421 1.00000000000000e+00 11422 11422 1.00000000000000e+00 11423 11423 1.00000000000000e+00 11424 11424 1.00000000000000e+00 11425 11425 1.00000000000000e+00 11426 11426 1.00000000000000e+00 11427 11427 1.00000000000000e+00 11428 11428 1.00000000000000e+00 11429 11429 1.00000000000000e+00 11430 11430 1.00000000000000e+00 11431 11431 1.00000000000000e+00 11432 11432 1.00000000000000e+00 11433 11433 1.00000000000000e+00 11434 11434 1.00000000000000e+00 11435 11435 1.00000000000000e+00 11436 11436 1.00000000000000e+00 11437 11437 1.00000000000000e+00 11438 11438 1.00000000000000e+00 11439 11439 1.00000000000000e+00 11440 11440 1.00000000000000e+00 11441 11441 1.00000000000000e+00 11442 11442 1.00000000000000e+00 11443 11443 1.00000000000000e+00 11444 11444 1.00000000000000e+00 11445 11445 1.00000000000000e+00 11446 11446 1.00000000000000e+00 11447 11447 1.00000000000000e+00 11448 11448 1.00000000000000e+00 11449 11449 1.00000000000000e+00 11450 11450 1.00000000000000e+00 11451 11451 1.00000000000000e+00 11452 11452 1.00000000000000e+00 11453 11453 1.00000000000000e+00 11454 11454 1.00000000000000e+00 11455 11455 1.00000000000000e+00 11456 11456 1.00000000000000e+00 11457 11457 1.00000000000000e+00 11458 11458 1.00000000000000e+00 11459 11459 1.00000000000000e+00 11460 11460 1.00000000000000e+00 11461 11461 1.00000000000000e+00 11462 11462 1.00000000000000e+00 11463 11463 1.00000000000000e+00 11464 11464 1.00000000000000e+00 11465 11465 1.00000000000000e+00 11466 11466 1.00000000000000e+00 11467 11467 1.00000000000000e+00 11468 11468 1.00000000000000e+00 11469 11469 1.00000000000000e+00 11470 11470 1.00000000000000e+00 11471 11471 1.00000000000000e+00 11472 11472 1.00000000000000e+00 11473 11473 1.00000000000000e+00 11474 11474 1.00000000000000e+00 11475 11475 1.00000000000000e+00 11476 11476 1.00000000000000e+00 11477 11477 1.00000000000000e+00 11478 11478 1.00000000000000e+00 11479 11479 1.00000000000000e+00 11480 11480 1.00000000000000e+00 11481 11481 1.00000000000000e+00 11482 11482 1.00000000000000e+00 11483 11483 1.00000000000000e+00 11484 11484 1.00000000000000e+00 11485 11485 1.00000000000000e+00 11486 11486 1.00000000000000e+00 11487 11487 1.00000000000000e+00 11488 11488 1.00000000000000e+00 11489 11489 1.00000000000000e+00 11490 11490 1.00000000000000e+00 11491 11491 1.00000000000000e+00 11492 11492 1.00000000000000e+00 11493 11493 1.00000000000000e+00 11494 11494 1.00000000000000e+00 11495 11495 1.00000000000000e+00 11496 11496 1.00000000000000e+00 11497 11497 1.00000000000000e+00 11498 11498 1.00000000000000e+00 11499 11499 1.00000000000000e+00 11500 11500 1.00000000000000e+00 11501 11501 1.00000000000000e+00 11502 11502 1.00000000000000e+00 11503 11503 1.00000000000000e+00 11504 11504 1.00000000000000e+00 11505 11505 1.00000000000000e+00 11506 11506 1.00000000000000e+00 11507 11507 1.00000000000000e+00 11508 11508 1.00000000000000e+00 11509 11509 1.00000000000000e+00 11510 11510 1.00000000000000e+00 11511 11511 1.00000000000000e+00 11512 11512 1.00000000000000e+00 11513 11513 1.00000000000000e+00 11514 11514 1.00000000000000e+00 11515 11515 1.00000000000000e+00 11516 11516 1.00000000000000e+00 11517 11517 1.00000000000000e+00 11518 11518 1.00000000000000e+00 11519 11519 1.00000000000000e+00 11520 11520 1.00000000000000e+00 11521 11521 1.00000000000000e+00 11522 11522 1.00000000000000e+00 11523 11523 1.00000000000000e+00 11524 11524 1.00000000000000e+00 11525 11525 1.00000000000000e+00 11526 11526 1.00000000000000e+00 11527 11527 1.00000000000000e+00 11528 11528 1.00000000000000e+00 11529 11529 1.00000000000000e+00 11530 11530 1.00000000000000e+00 11531 11531 1.00000000000000e+00 11532 11532 1.00000000000000e+00 11533 11533 1.00000000000000e+00 11534 11534 1.00000000000000e+00 11535 11535 1.00000000000000e+00 11536 11536 1.00000000000000e+00 11537 11537 1.00000000000000e+00 11538 11538 1.00000000000000e+00 11539 11539 1.00000000000000e+00 11540 11540 1.00000000000000e+00 11541 11541 1.00000000000000e+00 11542 11542 1.00000000000000e+00 11543 11543 1.00000000000000e+00 11544 11544 1.00000000000000e+00 11545 11545 1.00000000000000e+00 11546 11546 1.00000000000000e+00 11547 11547 1.00000000000000e+00 11548 11548 1.00000000000000e+00 11549 11549 1.00000000000000e+00 11550 11550 1.00000000000000e+00 11551 11551 1.00000000000000e+00 11552 11552 1.00000000000000e+00 11553 11553 1.00000000000000e+00 11554 11554 1.00000000000000e+00 11555 11555 1.00000000000000e+00 11556 11556 1.00000000000000e+00 11557 11557 1.00000000000000e+00 11558 11558 1.00000000000000e+00 11559 11559 1.00000000000000e+00 11560 11560 1.00000000000000e+00 11561 11561 1.00000000000000e+00 11562 11562 1.00000000000000e+00 11563 11563 1.00000000000000e+00 11564 11564 1.00000000000000e+00 11565 11565 1.00000000000000e+00 11566 11566 1.00000000000000e+00 11567 11567 1.00000000000000e+00 11568 11568 1.00000000000000e+00 11569 11569 1.00000000000000e+00 11570 11570 1.00000000000000e+00 11571 11571 1.00000000000000e+00 11572 11572 1.00000000000000e+00 11573 11573 1.00000000000000e+00 11574 11574 1.00000000000000e+00 11575 11575 1.00000000000000e+00 11576 11576 1.00000000000000e+00 11577 11577 1.00000000000000e+00 11578 11578 1.00000000000000e+00 11579 11579 1.00000000000000e+00 11580 11580 1.00000000000000e+00 11581 11581 1.00000000000000e+00 11582 11582 1.00000000000000e+00 11583 11583 1.00000000000000e+00 11584 11584 1.00000000000000e+00 11585 11585 1.00000000000000e+00 11586 11586 1.00000000000000e+00 11587 11587 1.00000000000000e+00 11588 11588 1.00000000000000e+00 11589 11589 1.00000000000000e+00 11590 11590 1.00000000000000e+00 11591 11591 1.00000000000000e+00 11592 11592 1.00000000000000e+00 11593 11593 1.00000000000000e+00 11594 11594 1.00000000000000e+00 11595 11595 1.00000000000000e+00 11596 11596 1.00000000000000e+00 11597 11597 1.00000000000000e+00 11598 11598 1.00000000000000e+00 11599 11599 1.00000000000000e+00 11600 11600 1.00000000000000e+00 11601 11601 1.00000000000000e+00 11602 11602 1.00000000000000e+00 11603 11603 1.00000000000000e+00 11604 11604 1.00000000000000e+00 11605 11605 1.00000000000000e+00 11606 11606 1.00000000000000e+00 11607 11607 1.00000000000000e+00 11608 11608 1.00000000000000e+00 11609 11609 1.00000000000000e+00 11610 11610 1.00000000000000e+00 11611 11611 1.00000000000000e+00 11612 11612 1.00000000000000e+00 11613 11613 1.00000000000000e+00 11614 11614 1.00000000000000e+00 11615 11615 1.00000000000000e+00 11616 11616 1.00000000000000e+00 11617 11617 1.00000000000000e+00 11618 11618 1.00000000000000e+00 11619 11619 1.00000000000000e+00 11620 11620 1.00000000000000e+00 11621 11621 1.00000000000000e+00 11622 11622 1.00000000000000e+00 11623 11623 1.00000000000000e+00 11624 11624 1.00000000000000e+00 11625 11625 1.00000000000000e+00 11626 11626 1.00000000000000e+00 11627 11627 1.00000000000000e+00 11628 11628 1.00000000000000e+00 11629 11629 1.00000000000000e+00 11630 11630 1.00000000000000e+00 11631 11631 1.00000000000000e+00 11632 11632 1.00000000000000e+00 11633 11633 1.00000000000000e+00 11634 11634 1.00000000000000e+00 11635 11635 1.00000000000000e+00 11636 11636 1.00000000000000e+00 11637 11637 1.00000000000000e+00 11638 11638 1.00000000000000e+00 11639 11639 1.00000000000000e+00 11640 11640 1.00000000000000e+00 11641 11641 1.00000000000000e+00 11642 11642 1.00000000000000e+00 11643 11643 1.00000000000000e+00 11644 11644 1.00000000000000e+00 11645 11645 1.00000000000000e+00 11646 11646 1.00000000000000e+00 11647 11647 1.00000000000000e+00 11648 11648 1.00000000000000e+00 11649 11649 1.00000000000000e+00 11650 11650 1.00000000000000e+00 11651 11651 1.00000000000000e+00 11652 11652 1.00000000000000e+00 11653 11653 1.00000000000000e+00 11654 11654 1.00000000000000e+00 11655 11655 1.00000000000000e+00 11656 11656 1.00000000000000e+00 11657 11657 1.00000000000000e+00 11658 11658 1.00000000000000e+00 11659 11659 1.00000000000000e+00 11660 11660 1.00000000000000e+00 11661 9237 4.22030000000000e-16 11661 9261 1.17839000000000e-15 11661 9837 4.47785888509600e-08 11661 9861 6.26332162683858e-05 11661 9885 1.00310287655637e-04 11661 9909 1.32826164813374e-06 11661 10413 4.36402672700000e-11 11661 10437 9.81314367921176e-04 11661 10461 4.60996910959797e-02 11661 10485 3.21160075323196e-02 11661 10509 1.60503283768706e-03 11661 10533 3.07268247464823e-06 11661 10557 6.35000000000000e-18 11661 11661 1.00509671531337e+00 11661 11013 1.57623610900000e-11 11661 11037 1.67498720578755e-03 11661 11061 1.57248436422921e-01 11661 11085 3.02172057297933e-01 11661 11109 3.70617261712412e-02 11661 11133 6.61673559220383e-06 11661 11157 3.85400000000000e-17 11661 11685 5.97228003932015e-02 11661 11709 1.55949680715281e-02 11661 11733 4.17426610680301e-06 11661 12285 2.16381754700000e-11 11661 12309 1.47384460888310e-07 11661 12333 2.60784759250900e-08 11661 20904 -1.38577897776000e-09 11661 20928 -2.63309666699969e-04 11661 20952 -1.35262437329917e-03 11661 20976 -1.46097158628629e-03 11661 21000 -2.99572453049506e-04 11661 21024 -4.14899663859000e-08 11661 21312 -2.02792477156877e-06 11661 21336 -1.77902210357934e-02 11661 21360 -9.11000637037612e-02 11661 21384 -9.76740571613049e-02 11661 21408 -2.00238148159737e-02 11661 21432 -1.35540959531512e-05 11661 21720 -4.04614909029319e-06 11661 21744 -3.37372744046870e-02 11661 21768 -1.72731756794428e-01 11661 21792 -1.85121313218606e-01 11661 21816 -3.79506224606009e-02 11661 21840 -2.68177621416010e-05 11662 11662 1.00000000000000e+00 11663 11663 1.00000000000000e+00 11664 11664 1.00000000000000e+00 11665 11665 1.00000000000000e+00 11666 11666 1.00000000000000e+00 11667 11667 1.00000000000000e+00 11668 11668 1.00000000000000e+00 11669 11669 1.00000000000000e+00 11670 11670 1.00000000000000e+00 11671 11671 1.00000000000000e+00 11672 11672 1.00000000000000e+00 11673 11673 1.00000000000000e+00 11674 11674 1.00000000000000e+00 11675 11675 1.00000000000000e+00 11676 11676 1.00000000000000e+00 11677 11677 1.00000000000000e+00 11678 11678 1.00000000000000e+00 11679 11679 1.00000000000000e+00 11680 11680 1.00000000000000e+00 11681 11681 1.00000000000000e+00 11682 11682 1.00000000000000e+00 11683 11683 1.00000000000000e+00 11684 11684 1.00000000000000e+00 11685 9237 1.50650000000000e-16 11685 9261 4.20640000000000e-16 11685 9837 1.55053844990900e-08 11685 9861 2.13322127890798e-04 11685 9885 4.39095393213606e-04 11685 9909 2.27667645083759e-05 11685 9933 2.46575223213170e-07 11685 9957 7.79578600000000e-14 11685 10413 1.51028246000000e-11 11685 10437 2.12411346181353e-03 11685 10461 1.27588687451486e-01 11685 10485 2.74020269122430e-01 11685 10509 8.90814666278496e-02 11685 10533 4.58947816494339e-03 11685 10557 1.65821052232090e-07 11685 10581 1.61450000000000e-16 11685 11685 3.46517180999967e+00 11685 11013 5.45496585000000e-12 11685 11037 3.63532297866538e-03 11685 11061 7.56157576803397e-01 11685 11085 5.54000696248055e+00 11685 11109 3.62600246314944e+00 11685 11133 1.36090564095548e-01 11685 11157 2.33188526392936e-04 11685 11181 2.37500000000000e-16 11685 11661 5.97228003932015e-02 11685 11709 4.34538569436183e+00 11685 11733 2.74929435139312e-01 11685 11757 3.47698256597035e-04 11685 12285 8.87085011605820e-07 11685 12309 1.38154135506738e-02 11685 12333 1.20671885798256e-02 11685 12357 7.67643334023939e-06 11685 20544 -4.00202380170130e-07 11685 20568 -4.35062775778452e-06 11685 20592 -1.13997207202421e-05 11685 20616 -2.75079980372756e-06 11685 20640 -2.45391655890000e-10 11685 20904 -4.94664904690000e-10 11685 20928 -8.96387949988684e-04 11685 20952 -1.69311411195081e-02 11685 20976 -7.17232553767068e-02 11685 21000 -8.38121177760756e-02 11685 21024 -2.01988474371421e-02 11685 21048 -6.88591247467987e-04 11685 21312 -7.01874925208500e-07 11685 21336 -3.98978040899721e-02 11685 21360 -5.54951980889249e-01 11685 21384 -2.21730298722647e+00 11685 21408 -2.79768642905928e+00 11685 21432 -6.70418245275547e-01 11685 21456 -1.86238563130767e-02 11685 21720 -1.40028719608415e-06 11685 21744 -7.35208925300235e-02 11685 21768 -9.91396379203825e-01 11685 21792 -3.93265630313768e+00 11685 21816 -5.00898442642475e+00 11685 21840 -1.19951607928600e+00 11685 21864 -3.24275802740605e-02 11686 11686 1.00000000000000e+00 11687 11687 1.00000000000000e+00 11688 11688 1.00000000000000e+00 11689 11689 1.00000000000000e+00 11690 11690 1.00000000000000e+00 11691 11691 1.00000000000000e+00 11692 11692 1.00000000000000e+00 11693 11693 1.00000000000000e+00 11694 11694 1.00000000000000e+00 11695 11695 1.00000000000000e+00 11696 11696 1.00000000000000e+00 11697 11697 1.00000000000000e+00 11698 11698 1.00000000000000e+00 11699 11699 1.00000000000000e+00 11700 11700 1.00000000000000e+00 11701 11701 1.00000000000000e+00 11702 11702 1.00000000000000e+00 11703 11703 1.00000000000000e+00 11704 11704 1.00000000000000e+00 11705 11705 1.00000000000000e+00 11706 11706 1.00000000000000e+00 11707 11707 1.00000000000000e+00 11708 11708 1.00000000000000e+00 11709 9837 1.81280000000000e-16 11709 9861 6.93965276951360e-07 11709 9885 6.44276186536676e-05 11709 9909 4.72542549108700e-04 11709 9933 1.93604114647195e-04 11709 9957 2.19087640160000e-10 11709 10437 1.18392864123266e-06 11709 10461 8.70653938089642e-03 11709 10485 1.18442951526064e-01 11709 10509 2.61946729281470e-01 11709 10533 9.51566419060030e-02 11709 10557 7.20183881084140e-03 11709 10581 7.44503075326079e-06 11709 11709 2.13447489157988e+01 11709 11037 2.00195419374288e-06 11709 11061 1.33556506834834e-01 11709 11085 5.44645677899715e+00 11709 11109 1.12062297642637e+01 11709 11133 2.68265796979808e+00 11709 11157 1.04720627674973e-01 11709 11181 2.94496133374704e-04 11709 11661 1.55949680715281e-02 11709 11685 4.34538569436183e+00 11709 11733 9.78199297230575e+00 11709 11757 4.95673214491815e-01 11709 11781 2.53629710191415e-04 11709 12285 4.40213679917649e-06 11709 12309 5.82260908100801e-01 11709 12333 1.82785208832576e+00 11709 12357 2.76648894908264e-01 11709 12381 8.82040844097468e-06 11709 12933 1.28205453431020e-07 11709 12957 3.44776521549207e-06 11709 12981 2.84965056096500e-07 11709 20544 -4.68162706606939e-06 11709 20568 -2.36456528890266e-03 11709 20592 -1.62745062553772e-02 11709 20616 -3.02687018810005e-02 11709 20640 -8.39440981508395e-03 11709 20664 -3.76985077331582e-04 11709 20928 -2.33755502357585e-06 11709 20952 -7.17949674489176e-03 11709 20976 -1.34464897613047e-01 11709 21000 -5.98577294457409e-01 11709 21024 -7.93553797255210e-01 11709 21048 -2.26898724073120e-01 11709 21072 -1.46556642943472e-02 11709 21096 -2.12346769668860e-07 11709 21336 -2.89818847393758e-05 11709 21360 -1.24352589445779e-01 11709 21384 -2.29622406868509e+00 11709 21408 -8.81234700362130e+00 11709 21432 -8.06189223988961e+00 11709 21456 -2.68385561620031e+00 11709 21480 -2.98294215297041e-01 11709 21504 -2.91886673369895e-05 11709 21744 -4.16008843137206e-05 11709 21768 -1.98570423981034e-01 11709 21792 -3.71267255159031e+00 11709 21816 -1.38577901086805e+01 11709 21840 -1.13558941478987e+01 11709 21864 -3.99767481908096e+00 11709 21888 -5.03800392544273e-01 11709 21912 -5.68909072862970e-05 11710 11710 1.00000000000000e+00 11711 11711 1.00000000000000e+00 11712 11712 1.00000000000000e+00 11713 11713 1.00000000000000e+00 11714 11714 1.00000000000000e+00 11715 11715 1.00000000000000e+00 11716 11716 1.00000000000000e+00 11717 11717 1.00000000000000e+00 11718 11718 1.00000000000000e+00 11719 11719 1.00000000000000e+00 11720 11720 1.00000000000000e+00 11721 11721 1.00000000000000e+00 11722 11722 1.00000000000000e+00 11723 11723 1.00000000000000e+00 11724 11724 1.00000000000000e+00 11725 11725 1.00000000000000e+00 11726 11726 1.00000000000000e+00 11727 11727 1.00000000000000e+00 11728 11728 1.00000000000000e+00 11729 11729 1.00000000000000e+00 11730 11730 1.00000000000000e+00 11731 11731 1.00000000000000e+00 11732 11732 1.00000000000000e+00 11733 9861 2.19544460000000e-13 11733 9885 1.89409891545976e-06 11733 9909 3.60350842428268e-04 11733 9933 2.31229553062058e-04 11733 9957 7.51344158719147e-05 11733 9981 3.03133255660094e-06 11733 10461 1.50853894583000e-09 11733 10485 5.34094459172515e-03 11733 10509 1.10751375218823e-01 11733 10533 3.90074702897652e-01 11733 10557 1.58330381854052e-01 11733 10581 3.82984705123414e-03 11733 10605 5.17228162006560e-06 11733 11733 2.74181977528599e+01 11733 11061 6.16672890543132e-06 11733 11085 2.50073467614380e-01 11733 11109 3.14714061325170e+00 11733 11133 5.96431524939496e+00 11733 11157 2.64884504318024e+00 11733 11181 1.37148490235065e-01 11733 11205 2.39044322190859e-04 11733 11661 4.17426610680301e-06 11733 11685 2.74929435139312e-01 11733 11709 9.78199297230575e+00 11733 11757 7.14083795988917e+00 11733 11781 2.82792704146813e-01 11733 11805 1.95371943844978e-04 11733 12285 1.47101733658942e-06 11733 12309 9.54978556178088e-01 11733 12333 9.52331039881188e+00 11733 12357 4.49687532096037e+00 11733 12381 1.45416647043242e-01 11733 12933 1.07228177540040e-03 11733 12957 3.06976858560494e-02 11733 12981 2.79091754131947e-03 11733 20184 -3.40800829606925e-05 11733 20208 -7.23038149697048e-04 11733 20232 -2.41565249248572e-03 11733 20256 -7.25522370285958e-04 11733 20280 -3.47011381079200e-05 11733 20544 -1.96062915748000e-09 11733 20568 -1.81463814625547e-03 11733 20592 -5.81648819907614e-02 11733 20616 -3.15687715384833e-01 11733 20640 -5.04462076015953e-01 11733 20664 -1.60508309066116e-01 11733 20688 -1.25654930568511e-02 11733 20952 -1.44727600551000e-08 11733 20976 -2.09752511183683e-02 11733 21000 -5.06189018822980e-01 11733 21024 -2.41236416441370e+00 11733 21048 -3.33774787695744e+00 11733 21072 -1.13078752502035e+00 11733 21096 -1.11494712416177e-01 11733 21360 -2.84816028581600e-08 11733 21384 -1.16854240285129e-01 11733 21408 -1.99097178969356e+00 11733 21432 -9.03319033806789e+00 11733 21456 -1.32830061635964e+01 11733 21480 -4.72007968522776e+00 11733 21504 -4.98997919341157e-01 11733 21768 -6.63024342517000e-09 11733 21792 -1.34062314544322e-01 11733 21816 -1.94760161133886e+00 11733 21840 -9.31757742472487e+00 11733 21864 -1.60834728731345e+01 11733 21888 -5.62748706111437e+00 11733 21912 -5.40869660850736e-01 11734 11734 1.00000000000000e+00 11735 11735 1.00000000000000e+00 11736 11736 1.00000000000000e+00 11737 11737 1.00000000000000e+00 11738 11738 1.00000000000000e+00 11739 11739 1.00000000000000e+00 11740 11740 1.00000000000000e+00 11741 11741 1.00000000000000e+00 11742 11742 1.00000000000000e+00 11743 11743 1.00000000000000e+00 11744 11744 1.00000000000000e+00 11745 11745 1.00000000000000e+00 11746 11746 1.00000000000000e+00 11747 11747 1.00000000000000e+00 11748 11748 1.00000000000000e+00 11749 11749 1.00000000000000e+00 11750 11750 1.00000000000000e+00 11751 11751 1.00000000000000e+00 11752 11752 1.00000000000000e+00 11753 11753 1.00000000000000e+00 11754 11754 1.00000000000000e+00 11755 11755 1.00000000000000e+00 11756 11756 1.00000000000000e+00 11757 9909 2.13656657686164e-06 11757 9933 1.53185448900642e-04 11757 9957 8.42968691652782e-04 11757 9981 4.77661153452615e-05 11757 10005 1.44369951344170e-07 11757 10029 2.76977475000000e-12 11757 10509 7.60696239971812e-03 11757 10533 1.65476629083145e-01 11757 10557 3.44526895845701e-01 11757 10581 1.06494160843875e-01 11757 10605 8.22857654823490e-03 11757 10629 1.26524962030200e-08 11757 11757 1.87919716657752e+01 11757 11085 1.59825900986152e-04 11757 11109 9.86337930066215e-02 11757 11133 2.68222047618861e+00 11757 11157 6.98081283453382e+00 11757 11181 3.76737230205428e+00 11757 11205 1.48862480810981e-01 11757 11229 1.31921271842000e-09 11757 11685 3.47698256597035e-04 11757 11709 4.95673214491815e-01 11757 11733 7.14083795988917e+00 11757 11781 1.09723187831802e+01 11757 11805 9.43953024244384e-02 11757 12285 2.22990279934000e-09 11757 12309 1.02332936930006e-01 11757 12333 3.15491505639749e+00 11757 12357 1.07535791920089e+01 11757 12381 3.18335899755204e+00 11757 12933 2.07534537618316e-03 11757 12957 1.30411080783787e-01 11757 12981 2.33776633015672e-02 11757 19824 -6.05285648237210e-07 11757 19848 -5.73103372691863e-06 11757 19872 -7.22506791617681e-06 11757 20184 -4.71154979898957e-05 11757 20208 -9.50245677540129e-03 11757 20232 -5.51496939522473e-02 11757 20256 -1.07496598483684e-01 11757 20280 -7.14390121570512e-02 11757 20592 -8.24395122984993e-03 11757 20616 -2.65653515247327e-01 11757 20640 -1.32287667106875e+00 11757 20664 -2.39548250059466e+00 11757 20688 -1.63815643084313e+00 11757 21000 -3.82846590392077e-02 11757 21024 -1.07744492518084e+00 11757 21048 -5.27654274785924e+00 11757 21072 -9.88798952076332e+00 11757 21096 -7.14013593441091e+00 11757 21408 -3.30507753107737e-02 11757 21432 -1.10367230428958e+00 11757 21456 -5.66071931761937e+00 11757 21480 -1.13396010740800e+01 11757 21504 -8.54372163120845e+00 11757 21816 -7.88146601817165e-03 11757 21840 -6.50483221529850e-01 11757 21864 -3.43113164804858e+00 11757 21888 -5.32072509957004e+00 11757 21912 -2.77159021881346e+00 11758 11758 1.00000000000000e+00 11759 11759 1.00000000000000e+00 11760 11760 1.00000000000000e+00 11761 11761 1.00000000000000e+00 11762 11762 1.00000000000000e+00 11763 11763 1.00000000000000e+00 11764 11764 1.00000000000000e+00 11765 11765 1.00000000000000e+00 11766 11766 1.00000000000000e+00 11767 11767 1.00000000000000e+00 11768 11768 1.00000000000000e+00 11769 11769 1.00000000000000e+00 11770 11770 1.00000000000000e+00 11771 11771 1.00000000000000e+00 11772 11772 1.00000000000000e+00 11773 11773 1.00000000000000e+00 11774 11774 1.00000000000000e+00 11775 11775 1.00000000000000e+00 11776 11776 1.00000000000000e+00 11777 11777 1.00000000000000e+00 11778 11778 1.00000000000000e+00 11779 11779 1.00000000000000e+00 11780 11780 1.00000000000000e+00 11781 9933 1.78071334005424e-05 11781 9957 1.72881141110550e-04 11781 9981 3.73082498911604e-04 11781 10005 2.73574244309951e-04 11781 10029 1.07430315361200e-08 11781 10509 1.80315251593800e-08 11781 10533 5.91766666038578e-03 11781 10557 1.02944973256488e-01 11781 10581 3.98093749650452e-01 11781 10605 1.56701631720252e-01 11781 10629 4.99765527714176e-05 11781 11781 2.09499843293948e+01 11781 11109 1.55156966074487e-04 11781 11133 1.15026971954092e-01 11781 11157 3.09914208319482e+00 11781 11181 9.91943451262152e+00 11781 11205 1.35780839835555e+00 11781 11229 5.22093285751291e-06 11781 11709 2.53629710191415e-04 11781 11733 2.82792704146813e-01 11781 11757 1.09723187831802e+01 11781 11805 4.31840613477196e-01 11781 12309 1.74314569669896e-05 11781 12333 1.27181616251696e-01 11781 12357 4.64065275503826e+00 11781 12381 2.93723459434113e+00 11781 12933 2.13706456323187e-04 11781 12957 4.36793967859309e-02 11781 12981 1.06727575900902e-02 11781 19824 -2.64700801715133e-04 11781 19848 -1.42217084326016e-02 11781 19872 -2.65905112531973e-02 11781 20208 -1.76545037455339e-03 11781 20232 -4.67880445595058e-02 11781 20256 -6.32999049357007e-01 11781 20280 -9.84383496535862e-01 11781 20616 -1.29804131789670e-02 11781 20640 -3.82150713253396e-01 11781 20664 -4.52174059881908e+00 11781 20688 -6.70591694751751e+00 11781 21024 -2.56556343381740e-02 11781 21048 -8.81159512977845e-01 11781 21072 -1.01045841424134e+01 11781 21096 -1.47080981867743e+01 11781 21432 -6.78156064318154e-03 11781 21456 -3.64114134599640e-01 11781 21480 -5.11981516898445e+00 11781 21504 -7.86715197249411e+00 11781 21840 -2.15737240607039e-04 11781 21864 -5.34115908914647e-02 11781 21888 -8.20147575343330e-01 11781 21912 -1.27202318270219e+00 11782 11782 1.00000000000000e+00 11783 11783 1.00000000000000e+00 11784 11784 1.00000000000000e+00 11785 11785 1.00000000000000e+00 11786 11786 1.00000000000000e+00 11787 11787 1.00000000000000e+00 11788 11788 1.00000000000000e+00 11789 11789 1.00000000000000e+00 11790 11790 1.00000000000000e+00 11791 11791 1.00000000000000e+00 11792 11792 1.00000000000000e+00 11793 11793 1.00000000000000e+00 11794 11794 1.00000000000000e+00 11795 11795 1.00000000000000e+00 11796 11796 1.00000000000000e+00 11797 11797 1.00000000000000e+00 11798 11798 1.00000000000000e+00 11799 11799 1.00000000000000e+00 11800 11800 1.00000000000000e+00 11801 11801 1.00000000000000e+00 11802 11802 1.00000000000000e+00 11803 11803 1.00000000000000e+00 11804 11804 1.00000000000000e+00 11805 9957 6.07076150326421e-06 11805 9981 1.48757014544792e-04 11805 10005 1.38667055159870e-04 11805 10029 5.75738267860000e-09 11805 10533 4.13083515611120e-07 11805 10557 2.48600030779962e-03 11805 10581 5.71113368287785e-02 11805 10605 4.59222211420490e-02 11805 10629 2.68083483975965e-05 11805 11805 1.03178973644449e+00 11805 11133 1.28664970767168e-04 11805 11157 4.82735193069447e-02 11805 11181 6.74357737899526e-01 11805 11205 1.83378625356739e-01 11805 11229 2.80088098136366e-06 11805 11733 1.95371943844978e-04 11805 11757 9.43953024244384e-02 11805 11781 4.31840613477196e-01 11805 12333 1.25052203376239e-06 11805 12357 9.22890593948986e-03 11805 12381 1.48846185431126e-02 11805 19824 -8.40619835414275e-05 11805 19848 -7.39950019853648e-03 11805 19872 -1.42105665122830e-02 11805 20232 -1.54634762008407e-03 11805 20256 -9.08396678634940e-02 11805 20280 -1.70854902386400e-01 11805 20640 -5.29244362974420e-03 11805 20664 -2.75622480796949e-01 11805 20688 -5.14197856185687e-01 11805 21048 -2.68203129603574e-03 11805 21072 -1.54266916353426e-01 11805 21096 -2.89759613634602e-01 11805 21456 -3.67982902529346e-04 11805 21480 -2.32563123210195e-02 11805 21504 -4.39367443243335e-02 11806 11806 1.00000000000000e+00 11807 11807 1.00000000000000e+00 11808 11808 1.00000000000000e+00 11809 11809 1.00000000000000e+00 11810 11810 1.00000000000000e+00 11811 11811 1.00000000000000e+00 11812 11812 1.00000000000000e+00 11813 11813 1.00000000000000e+00 11814 11814 1.00000000000000e+00 11815 11815 1.00000000000000e+00 11816 11816 1.00000000000000e+00 11817 11817 1.00000000000000e+00 11818 11818 1.00000000000000e+00 11819 11819 1.00000000000000e+00 11820 11820 1.00000000000000e+00 11821 11821 1.00000000000000e+00 11822 11822 1.00000000000000e+00 11823 11823 1.00000000000000e+00 11824 11824 1.00000000000000e+00 11825 11825 1.00000000000000e+00 11826 11826 1.00000000000000e+00 11827 11827 1.00000000000000e+00 11828 11828 1.00000000000000e+00 11829 11829 1.00000000000000e+00 11830 11830 1.00000000000000e+00 11831 11831 1.00000000000000e+00 11832 11832 1.00000000000000e+00 11833 11833 1.00000000000000e+00 11834 11834 1.00000000000000e+00 11835 11835 1.00000000000000e+00 11836 11836 1.00000000000000e+00 11837 11837 1.00000000000000e+00 11838 11838 1.00000000000000e+00 11839 11839 1.00000000000000e+00 11840 11840 1.00000000000000e+00 11841 11841 1.00000000000000e+00 11842 11842 1.00000000000000e+00 11843 11843 1.00000000000000e+00 11844 11844 1.00000000000000e+00 11845 11845 1.00000000000000e+00 11846 11846 1.00000000000000e+00 11847 11847 1.00000000000000e+00 11848 11848 1.00000000000000e+00 11849 11849 1.00000000000000e+00 11850 11850 1.00000000000000e+00 11851 11851 1.00000000000000e+00 11852 11852 1.00000000000000e+00 11853 11853 1.00000000000000e+00 11854 11854 1.00000000000000e+00 11855 11855 1.00000000000000e+00 11856 11856 1.00000000000000e+00 11857 11857 1.00000000000000e+00 11858 11858 1.00000000000000e+00 11859 11859 1.00000000000000e+00 11860 11860 1.00000000000000e+00 11861 11861 1.00000000000000e+00 11862 11862 1.00000000000000e+00 11863 11863 1.00000000000000e+00 11864 11864 1.00000000000000e+00 11865 11865 1.00000000000000e+00 11866 11866 1.00000000000000e+00 11867 11867 1.00000000000000e+00 11868 11868 1.00000000000000e+00 11869 11869 1.00000000000000e+00 11870 11870 1.00000000000000e+00 11871 11871 1.00000000000000e+00 11872 11872 1.00000000000000e+00 11873 11873 1.00000000000000e+00 11874 11874 1.00000000000000e+00 11875 11875 1.00000000000000e+00 11876 11876 1.00000000000000e+00 11877 11877 1.00000000000000e+00 11878 11878 1.00000000000000e+00 11879 11879 1.00000000000000e+00 11880 11880 1.00000000000000e+00 11881 11881 1.00000000000000e+00 11882 11882 1.00000000000000e+00 11883 11883 1.00000000000000e+00 11884 11884 1.00000000000000e+00 11885 11885 1.00000000000000e+00 11886 11886 1.00000000000000e+00 11887 11887 1.00000000000000e+00 11888 11888 1.00000000000000e+00 11889 11889 1.00000000000000e+00 11890 11890 1.00000000000000e+00 11891 11891 1.00000000000000e+00 11892 11892 1.00000000000000e+00 11893 11893 1.00000000000000e+00 11894 11894 1.00000000000000e+00 11895 11895 1.00000000000000e+00 11896 11896 1.00000000000000e+00 11897 11897 1.00000000000000e+00 11898 11898 1.00000000000000e+00 11899 11899 1.00000000000000e+00 11900 11900 1.00000000000000e+00 11901 11901 1.00000000000000e+00 11902 11902 1.00000000000000e+00 11903 11903 1.00000000000000e+00 11904 11904 1.00000000000000e+00 11905 11905 1.00000000000000e+00 11906 11906 1.00000000000000e+00 11907 11907 1.00000000000000e+00 11908 11908 1.00000000000000e+00 11909 11909 1.00000000000000e+00 11910 11910 1.00000000000000e+00 11911 11911 1.00000000000000e+00 11912 11912 1.00000000000000e+00 11913 11913 1.00000000000000e+00 11914 11914 1.00000000000000e+00 11915 11915 1.00000000000000e+00 11916 11916 1.00000000000000e+00 11917 11917 1.00000000000000e+00 11918 11918 1.00000000000000e+00 11919 11919 1.00000000000000e+00 11920 11920 1.00000000000000e+00 11921 11921 1.00000000000000e+00 11922 11922 1.00000000000000e+00 11923 11923 1.00000000000000e+00 11924 11924 1.00000000000000e+00 11925 11925 1.00000000000000e+00 11926 11926 1.00000000000000e+00 11927 11927 1.00000000000000e+00 11928 11928 1.00000000000000e+00 11929 11929 1.00000000000000e+00 11930 11930 1.00000000000000e+00 11931 11931 1.00000000000000e+00 11932 11932 1.00000000000000e+00 11933 11933 1.00000000000000e+00 11934 11934 1.00000000000000e+00 11935 11935 1.00000000000000e+00 11936 11936 1.00000000000000e+00 11937 11937 1.00000000000000e+00 11938 11938 1.00000000000000e+00 11939 11939 1.00000000000000e+00 11940 11940 1.00000000000000e+00 11941 11941 1.00000000000000e+00 11942 11942 1.00000000000000e+00 11943 11943 1.00000000000000e+00 11944 11944 1.00000000000000e+00 11945 11945 1.00000000000000e+00 11946 11946 1.00000000000000e+00 11947 11947 1.00000000000000e+00 11948 11948 1.00000000000000e+00 11949 11949 1.00000000000000e+00 11950 11950 1.00000000000000e+00 11951 11951 1.00000000000000e+00 11952 11952 1.00000000000000e+00 11953 11953 1.00000000000000e+00 11954 11954 1.00000000000000e+00 11955 11955 1.00000000000000e+00 11956 11956 1.00000000000000e+00 11957 11957 1.00000000000000e+00 11958 11958 1.00000000000000e+00 11959 11959 1.00000000000000e+00 11960 11960 1.00000000000000e+00 11961 11961 1.00000000000000e+00 11962 11962 1.00000000000000e+00 11963 11963 1.00000000000000e+00 11964 11964 1.00000000000000e+00 11965 11965 1.00000000000000e+00 11966 11966 1.00000000000000e+00 11967 11967 1.00000000000000e+00 11968 11968 1.00000000000000e+00 11969 11969 1.00000000000000e+00 11970 11970 1.00000000000000e+00 11971 11971 1.00000000000000e+00 11972 11972 1.00000000000000e+00 11973 11973 1.00000000000000e+00 11974 11974 1.00000000000000e+00 11975 11975 1.00000000000000e+00 11976 11976 1.00000000000000e+00 11977 11977 1.00000000000000e+00 11978 11978 1.00000000000000e+00 11979 11979 1.00000000000000e+00 11980 11980 1.00000000000000e+00 11981 11981 1.00000000000000e+00 11982 11982 1.00000000000000e+00 11983 11983 1.00000000000000e+00 11984 11984 1.00000000000000e+00 11985 11985 1.00000000000000e+00 11986 11986 1.00000000000000e+00 11987 11987 1.00000000000000e+00 11988 11988 1.00000000000000e+00 11989 11989 1.00000000000000e+00 11990 11990 1.00000000000000e+00 11991 11991 1.00000000000000e+00 11992 11992 1.00000000000000e+00 11993 11993 1.00000000000000e+00 11994 11994 1.00000000000000e+00 11995 11995 1.00000000000000e+00 11996 11996 1.00000000000000e+00 11997 11997 1.00000000000000e+00 11998 11998 1.00000000000000e+00 11999 11999 1.00000000000000e+00 12000 12000 1.00000000000000e+00 12001 12001 1.00000000000000e+00 12002 12002 1.00000000000000e+00 12003 12003 1.00000000000000e+00 12004 12004 1.00000000000000e+00 12005 12005 1.00000000000000e+00 12006 12006 1.00000000000000e+00 12007 12007 1.00000000000000e+00 12008 12008 1.00000000000000e+00 12009 12009 1.00000000000000e+00 12010 12010 1.00000000000000e+00 12011 12011 1.00000000000000e+00 12012 12012 1.00000000000000e+00 12013 12013 1.00000000000000e+00 12014 12014 1.00000000000000e+00 12015 12015 1.00000000000000e+00 12016 12016 1.00000000000000e+00 12017 12017 1.00000000000000e+00 12018 12018 1.00000000000000e+00 12019 12019 1.00000000000000e+00 12020 12020 1.00000000000000e+00 12021 12021 1.00000000000000e+00 12022 12022 1.00000000000000e+00 12023 12023 1.00000000000000e+00 12024 12024 1.00000000000000e+00 12025 12025 1.00000000000000e+00 12026 12026 1.00000000000000e+00 12027 12027 1.00000000000000e+00 12028 12028 1.00000000000000e+00 12029 12029 1.00000000000000e+00 12030 12030 1.00000000000000e+00 12031 12031 1.00000000000000e+00 12032 12032 1.00000000000000e+00 12033 12033 1.00000000000000e+00 12034 12034 1.00000000000000e+00 12035 12035 1.00000000000000e+00 12036 12036 1.00000000000000e+00 12037 12037 1.00000000000000e+00 12038 12038 1.00000000000000e+00 12039 12039 1.00000000000000e+00 12040 12040 1.00000000000000e+00 12041 12041 1.00000000000000e+00 12042 12042 1.00000000000000e+00 12043 12043 1.00000000000000e+00 12044 12044 1.00000000000000e+00 12045 12045 1.00000000000000e+00 12046 12046 1.00000000000000e+00 12047 12047 1.00000000000000e+00 12048 12048 1.00000000000000e+00 12049 12049 1.00000000000000e+00 12050 12050 1.00000000000000e+00 12051 12051 1.00000000000000e+00 12052 12052 1.00000000000000e+00 12053 12053 1.00000000000000e+00 12054 12054 1.00000000000000e+00 12055 12055 1.00000000000000e+00 12056 12056 1.00000000000000e+00 12057 12057 1.00000000000000e+00 12058 12058 1.00000000000000e+00 12059 12059 1.00000000000000e+00 12060 12060 1.00000000000000e+00 12061 12061 1.00000000000000e+00 12062 12062 1.00000000000000e+00 12063 12063 1.00000000000000e+00 12064 12064 1.00000000000000e+00 12065 12065 1.00000000000000e+00 12066 12066 1.00000000000000e+00 12067 12067 1.00000000000000e+00 12068 12068 1.00000000000000e+00 12069 12069 1.00000000000000e+00 12070 12070 1.00000000000000e+00 12071 12071 1.00000000000000e+00 12072 12072 1.00000000000000e+00 12073 12073 1.00000000000000e+00 12074 12074 1.00000000000000e+00 12075 12075 1.00000000000000e+00 12076 12076 1.00000000000000e+00 12077 12077 1.00000000000000e+00 12078 12078 1.00000000000000e+00 12079 12079 1.00000000000000e+00 12080 12080 1.00000000000000e+00 12081 12081 1.00000000000000e+00 12082 12082 1.00000000000000e+00 12083 12083 1.00000000000000e+00 12084 12084 1.00000000000000e+00 12085 12085 1.00000000000000e+00 12086 12086 1.00000000000000e+00 12087 12087 1.00000000000000e+00 12088 12088 1.00000000000000e+00 12089 12089 1.00000000000000e+00 12090 12090 1.00000000000000e+00 12091 12091 1.00000000000000e+00 12092 12092 1.00000000000000e+00 12093 12093 1.00000000000000e+00 12094 12094 1.00000000000000e+00 12095 12095 1.00000000000000e+00 12096 12096 1.00000000000000e+00 12097 12097 1.00000000000000e+00 12098 12098 1.00000000000000e+00 12099 12099 1.00000000000000e+00 12100 12100 1.00000000000000e+00 12101 12101 1.00000000000000e+00 12102 12102 1.00000000000000e+00 12103 12103 1.00000000000000e+00 12104 12104 1.00000000000000e+00 12105 12105 1.00000000000000e+00 12106 12106 1.00000000000000e+00 12107 12107 1.00000000000000e+00 12108 12108 1.00000000000000e+00 12109 12109 1.00000000000000e+00 12110 12110 1.00000000000000e+00 12111 12111 1.00000000000000e+00 12112 12112 1.00000000000000e+00 12113 12113 1.00000000000000e+00 12114 12114 1.00000000000000e+00 12115 12115 1.00000000000000e+00 12116 12116 1.00000000000000e+00 12117 12117 1.00000000000000e+00 12118 12118 1.00000000000000e+00 12119 12119 1.00000000000000e+00 12120 12120 1.00000000000000e+00 12121 12121 1.00000000000000e+00 12122 12122 1.00000000000000e+00 12123 12123 1.00000000000000e+00 12124 12124 1.00000000000000e+00 12125 12125 1.00000000000000e+00 12126 12126 1.00000000000000e+00 12127 12127 1.00000000000000e+00 12128 12128 1.00000000000000e+00 12129 12129 1.00000000000000e+00 12130 12130 1.00000000000000e+00 12131 12131 1.00000000000000e+00 12132 12132 1.00000000000000e+00 12133 12133 1.00000000000000e+00 12134 12134 1.00000000000000e+00 12135 12135 1.00000000000000e+00 12136 12136 1.00000000000000e+00 12137 12137 1.00000000000000e+00 12138 12138 1.00000000000000e+00 12139 12139 1.00000000000000e+00 12140 12140 1.00000000000000e+00 12141 12141 1.00000000000000e+00 12142 12142 1.00000000000000e+00 12143 12143 1.00000000000000e+00 12144 12144 1.00000000000000e+00 12145 12145 1.00000000000000e+00 12146 12146 1.00000000000000e+00 12147 12147 1.00000000000000e+00 12148 12148 1.00000000000000e+00 12149 12149 1.00000000000000e+00 12150 12150 1.00000000000000e+00 12151 12151 1.00000000000000e+00 12152 12152 1.00000000000000e+00 12153 12153 1.00000000000000e+00 12154 12154 1.00000000000000e+00 12155 12155 1.00000000000000e+00 12156 12156 1.00000000000000e+00 12157 12157 1.00000000000000e+00 12158 12158 1.00000000000000e+00 12159 12159 1.00000000000000e+00 12160 12160 1.00000000000000e+00 12161 12161 1.00000000000000e+00 12162 12162 1.00000000000000e+00 12163 12163 1.00000000000000e+00 12164 12164 1.00000000000000e+00 12165 12165 1.00000000000000e+00 12166 12166 1.00000000000000e+00 12167 12167 1.00000000000000e+00 12168 12168 1.00000000000000e+00 12169 12169 1.00000000000000e+00 12170 12170 1.00000000000000e+00 12171 12171 1.00000000000000e+00 12172 12172 1.00000000000000e+00 12173 12173 1.00000000000000e+00 12174 12174 1.00000000000000e+00 12175 12175 1.00000000000000e+00 12176 12176 1.00000000000000e+00 12177 12177 1.00000000000000e+00 12178 12178 1.00000000000000e+00 12179 12179 1.00000000000000e+00 12180 12180 1.00000000000000e+00 12181 12181 1.00000000000000e+00 12182 12182 1.00000000000000e+00 12183 12183 1.00000000000000e+00 12184 12184 1.00000000000000e+00 12185 12185 1.00000000000000e+00 12186 12186 1.00000000000000e+00 12187 12187 1.00000000000000e+00 12188 12188 1.00000000000000e+00 12189 12189 1.00000000000000e+00 12190 12190 1.00000000000000e+00 12191 12191 1.00000000000000e+00 12192 12192 1.00000000000000e+00 12193 12193 1.00000000000000e+00 12194 12194 1.00000000000000e+00 12195 12195 1.00000000000000e+00 12196 12196 1.00000000000000e+00 12197 12197 1.00000000000000e+00 12198 12198 1.00000000000000e+00 12199 12199 1.00000000000000e+00 12200 12200 1.00000000000000e+00 12201 12201 1.00000000000000e+00 12202 12202 1.00000000000000e+00 12203 12203 1.00000000000000e+00 12204 12204 1.00000000000000e+00 12205 12205 1.00000000000000e+00 12206 12206 1.00000000000000e+00 12207 12207 1.00000000000000e+00 12208 12208 1.00000000000000e+00 12209 12209 1.00000000000000e+00 12210 12210 1.00000000000000e+00 12211 12211 1.00000000000000e+00 12212 12212 1.00000000000000e+00 12213 12213 1.00000000000000e+00 12214 12214 1.00000000000000e+00 12215 12215 1.00000000000000e+00 12216 12216 1.00000000000000e+00 12217 12217 1.00000000000000e+00 12218 12218 1.00000000000000e+00 12219 12219 1.00000000000000e+00 12220 12220 1.00000000000000e+00 12221 12221 1.00000000000000e+00 12222 12222 1.00000000000000e+00 12223 12223 1.00000000000000e+00 12224 12224 1.00000000000000e+00 12225 12225 1.00000000000000e+00 12226 12226 1.00000000000000e+00 12227 12227 1.00000000000000e+00 12228 12228 1.00000000000000e+00 12229 12229 1.00000000000000e+00 12230 12230 1.00000000000000e+00 12231 12231 1.00000000000000e+00 12232 12232 1.00000000000000e+00 12233 12233 1.00000000000000e+00 12234 12234 1.00000000000000e+00 12235 12235 1.00000000000000e+00 12236 12236 1.00000000000000e+00 12237 12237 1.00000000000000e+00 12238 12238 1.00000000000000e+00 12239 12239 1.00000000000000e+00 12240 12240 1.00000000000000e+00 12241 12241 1.00000000000000e+00 12242 12242 1.00000000000000e+00 12243 12243 1.00000000000000e+00 12244 12244 1.00000000000000e+00 12245 12245 1.00000000000000e+00 12246 12246 1.00000000000000e+00 12247 12247 1.00000000000000e+00 12248 12248 1.00000000000000e+00 12249 12249 1.00000000000000e+00 12250 12250 1.00000000000000e+00 12251 12251 1.00000000000000e+00 12252 12252 1.00000000000000e+00 12253 12253 1.00000000000000e+00 12254 12254 1.00000000000000e+00 12255 12255 1.00000000000000e+00 12256 12256 1.00000000000000e+00 12257 12257 1.00000000000000e+00 12258 12258 1.00000000000000e+00 12259 12259 1.00000000000000e+00 12260 12260 1.00000000000000e+00 12261 12261 1.00000000000000e+00 12262 12262 1.00000000000000e+00 12263 12263 1.00000000000000e+00 12264 12264 1.00000000000000e+00 12265 12265 1.00000000000000e+00 12266 12266 1.00000000000000e+00 12267 12267 1.00000000000000e+00 12268 12268 1.00000000000000e+00 12269 12269 1.00000000000000e+00 12270 12270 1.00000000000000e+00 12271 12271 1.00000000000000e+00 12272 12272 1.00000000000000e+00 12273 12273 1.00000000000000e+00 12274 12274 1.00000000000000e+00 12275 12275 1.00000000000000e+00 12276 12276 1.00000000000000e+00 12277 12277 1.00000000000000e+00 12278 12278 1.00000000000000e+00 12279 12279 1.00000000000000e+00 12280 12280 1.00000000000000e+00 12281 12281 1.00000000000000e+00 12282 12282 1.00000000000000e+00 12283 12283 1.00000000000000e+00 12284 12284 1.00000000000000e+00 12285 10485 8.85453302770000e-10 12285 10509 9.32791876860000e-10 12285 10533 7.31269937100000e-11 12285 10557 3.55340800000000e-14 12285 12285 1.00000000000106e+00 12285 11061 3.19243961200000e-11 12285 11085 8.87219725627950e-07 12285 11109 1.86054858380156e-06 12285 11133 1.76934258518450e-07 12285 11157 1.91012521360000e-10 12285 11661 2.16381754700000e-11 12285 11685 8.87085011605820e-07 12285 11709 4.40213679917649e-06 12285 11733 1.47101733658942e-06 12285 11757 2.22990279934000e-09 12285 12309 1.23430727922290e-07 12285 12333 1.65206772175230e-07 12285 12357 1.09086417370000e-10 12285 20976 -1.71538377450000e-10 12285 21000 -9.70816716290000e-10 12285 21024 -1.31019120337000e-09 12285 21048 -2.84663206480000e-10 12285 21384 -3.15062376914760e-07 12285 21408 -1.50043593642075e-06 12285 21432 -1.27580809196157e-06 12285 21456 -2.40186428761700e-07 12285 21792 -6.28923985187350e-07 12285 21816 -2.99407615582745e-06 12285 21840 -2.54244484549957e-06 12285 21864 -4.78380215078060e-07 12286 12286 1.00000000000000e+00 12287 12287 1.00000000000000e+00 12288 12288 1.00000000000000e+00 12289 12289 1.00000000000000e+00 12290 12290 1.00000000000000e+00 12291 12291 1.00000000000000e+00 12292 12292 1.00000000000000e+00 12293 12293 1.00000000000000e+00 12294 12294 1.00000000000000e+00 12295 12295 1.00000000000000e+00 12296 12296 1.00000000000000e+00 12297 12297 1.00000000000000e+00 12298 12298 1.00000000000000e+00 12299 12299 1.00000000000000e+00 12300 12300 1.00000000000000e+00 12301 12301 1.00000000000000e+00 12302 12302 1.00000000000000e+00 12303 12303 1.00000000000000e+00 12304 12304 1.00000000000000e+00 12305 12305 1.00000000000000e+00 12306 12306 1.00000000000000e+00 12307 12307 1.00000000000000e+00 12308 12308 1.00000000000000e+00 12309 10485 9.01164771458703e-06 12309 10509 1.51134942095437e-04 12309 10533 1.60494948635369e-04 12309 10557 2.08930460891830e-07 12309 12309 1.05242261230147e+00 12309 11061 2.17449701422430e-07 12309 11085 8.35456992673731e-03 12309 11109 9.79813381742778e-02 12309 11133 5.66352263340686e-02 12309 11157 2.93365015021255e-03 12309 11181 5.17938663274511e-06 12309 11661 1.47384460888310e-07 12309 11685 1.38154135506738e-02 12309 11709 5.82260908100801e-01 12309 11733 9.54978556178088e-01 12309 11757 1.02332936930006e-01 12309 11781 1.74314569669896e-05 12309 12285 1.23430727922290e-07 12309 12333 3.57682624143033e-01 12309 12357 7.50878594565664e-02 12309 12381 1.01894477122363e-05 12309 12933 1.52197706490330e-07 12309 12957 4.09279816281600e-06 12309 12981 3.38261348833680e-07 12309 20976 -1.01389756552504e-05 12309 21000 -1.52551360576183e-03 12309 21024 -7.02520703206134e-03 12309 21048 -5.78613424267495e-03 12309 21072 -1.07614750049479e-03 12309 21096 -2.27564163003300e-07 12309 21384 -2.18156224160933e-03 12309 21408 -6.68357069655338e-02 12309 21432 -3.07481855106406e-01 12309 21456 -3.49593855422128e-01 12309 21480 -7.30006766659733e-02 12309 21504 -3.45539493907805e-05 12309 21792 -4.29215165363190e-03 12309 21816 -1.22992818690735e-01 12309 21840 -5.65787260988382e-01 12309 21864 -6.58684771145532e-01 12309 21888 -1.38468320828483e-01 12309 21912 -6.75149496405379e-05 12310 12310 1.00000000000000e+00 12311 12311 1.00000000000000e+00 12312 12312 1.00000000000000e+00 12313 12313 1.00000000000000e+00 12314 12314 1.00000000000000e+00 12315 12315 1.00000000000000e+00 12316 12316 1.00000000000000e+00 12317 12317 1.00000000000000e+00 12318 12318 1.00000000000000e+00 12319 12319 1.00000000000000e+00 12320 12320 1.00000000000000e+00 12321 12321 1.00000000000000e+00 12322 12322 1.00000000000000e+00 12323 12323 1.00000000000000e+00 12324 12324 1.00000000000000e+00 12325 12325 1.00000000000000e+00 12326 12326 1.00000000000000e+00 12327 12327 1.00000000000000e+00 12328 12328 1.00000000000000e+00 12329 12329 1.00000000000000e+00 12330 12330 1.00000000000000e+00 12331 12331 1.00000000000000e+00 12332 12332 1.00000000000000e+00 12333 10485 1.76345157057961e-06 12333 10509 2.98307779105633e-04 12333 10533 3.90821018534082e-04 12333 10557 3.87416569810695e-05 12333 10581 1.85443126627644e-06 12333 12333 6.56924940955753e+00 12333 11061 3.84760914064500e-08 12333 11085 4.31692185634936e-03 12333 11109 1.55044360737332e-01 12333 11133 2.98235611124608e-01 12333 11157 9.08790737020028e-02 12333 11181 2.98352467610327e-03 12333 11205 1.36192251944519e-06 12333 11661 2.60784759250900e-08 12333 11685 1.20671885798256e-02 12333 11709 1.82785208832576e+00 12333 11733 9.52331039881188e+00 12333 11757 3.15491505639749e+00 12333 11781 1.27181616251696e-01 12333 11805 1.25052203376239e-06 12333 12285 1.65206772175230e-07 12333 12309 3.57682624143033e-01 12333 12357 4.86555311739424e+00 12333 12381 2.17844836818987e-01 12333 12933 1.95729919479411e-03 12333 12957 6.52632710066810e-02 12333 12981 7.20909761037764e-03 12333 20616 -3.60143894674430e-05 12333 20640 -2.24151561366790e-04 12333 20664 -3.56454239513560e-04 12333 20688 -8.02216756131089e-05 12333 20976 -2.30239133829013e-06 12333 21000 -3.42397024350174e-03 12333 21024 -4.35226319330428e-02 12333 21048 -1.49049353647895e-01 12333 21072 -1.42656758267422e-01 12333 21096 -4.22648233034809e-02 12333 21384 -3.88025594488446e-04 12333 21408 -8.67773264820860e-02 12333 21432 -1.30109975792000e+00 12333 21456 -4.43068966198744e+00 12333 21480 -3.05351420152970e+00 12333 21504 -6.43859071509918e-01 12333 21792 -7.59934449608862e-04 12333 21816 -1.49586861259660e-01 12333 21840 -2.29847746643486e+00 12333 21864 -7.82386178903512e+00 12333 21888 -5.11769890541479e+00 12333 21912 -9.93950143461411e-01 12334 12334 1.00000000000000e+00 12335 12335 1.00000000000000e+00 12336 12336 1.00000000000000e+00 12337 12337 1.00000000000000e+00 12338 12338 1.00000000000000e+00 12339 12339 1.00000000000000e+00 12340 12340 1.00000000000000e+00 12341 12341 1.00000000000000e+00 12342 12342 1.00000000000000e+00 12343 12343 1.00000000000000e+00 12344 12344 1.00000000000000e+00 12345 12345 1.00000000000000e+00 12346 12346 1.00000000000000e+00 12347 12347 1.00000000000000e+00 12348 12348 1.00000000000000e+00 12349 12349 1.00000000000000e+00 12350 12350 1.00000000000000e+00 12351 12351 1.00000000000000e+00 12352 12352 1.00000000000000e+00 12353 12353 1.00000000000000e+00 12354 12354 1.00000000000000e+00 12355 12355 1.00000000000000e+00 12356 12356 1.00000000000000e+00 12357 10509 1.13169651915077e-06 12357 10533 1.08990327590328e-04 12357 10557 5.98389187080676e-04 12357 10581 1.20547285967324e-04 12357 12357 2.23335933073408e+01 12357 11085 2.36590348617509e-06 12357 11109 7.50438699090538e-03 12357 11133 1.09481969201778e-01 12357 11157 2.79777465397493e-01 12357 11181 2.45504972402688e-01 12357 11205 7.34843574811565e-03 12357 11685 7.67643334023939e-06 12357 11709 2.76648894908264e-01 12357 11733 4.49687532096037e+00 12357 11757 1.07535791920089e+01 12357 11781 4.64065275503827e+00 12357 11805 9.22890593948986e-03 12357 12285 1.09086417370000e-10 12357 12309 7.50878594565664e-02 12357 12333 4.86555311739424e+00 12357 12381 4.66704907915603e+00 12357 12933 8.11544335799004e-03 12357 12957 6.14209279220201e-01 12357 12981 1.09822659070731e-01 12357 20616 -1.92627463307740e-04 12357 20640 -8.94430899049876e-03 12357 20664 -9.62596793221420e-02 12357 20688 -1.34917509756794e-01 12357 21000 -1.30936415916659e-05 12357 21024 -1.51639929481646e-02 12357 21048 -2.20635404010224e-01 12357 21072 -1.81132176135842e+00 12357 21096 -2.47118942806316e+00 12357 21408 -9.97392066839205e-05 12357 21432 -2.52264035490338e-01 12357 21456 -2.45302092463163e+00 12357 21480 -1.07635608328286e+01 12357 21504 -1.09051654129362e+01 12357 21816 -1.07822922226180e-04 12357 21840 -4.03388434389524e-01 12357 21864 -3.59414605494466e+00 12357 21888 -1.13506209985239e+01 12357 21912 -8.01986008310696e+00 12358 12358 1.00000000000000e+00 12359 12359 1.00000000000000e+00 12360 12360 1.00000000000000e+00 12361 12361 1.00000000000000e+00 12362 12362 1.00000000000000e+00 12363 12363 1.00000000000000e+00 12364 12364 1.00000000000000e+00 12365 12365 1.00000000000000e+00 12366 12366 1.00000000000000e+00 12367 12367 1.00000000000000e+00 12368 12368 1.00000000000000e+00 12369 12369 1.00000000000000e+00 12370 12370 1.00000000000000e+00 12371 12371 1.00000000000000e+00 12372 12372 1.00000000000000e+00 12373 12373 1.00000000000000e+00 12374 12374 1.00000000000000e+00 12375 12375 1.00000000000000e+00 12376 12376 1.00000000000000e+00 12377 12377 1.00000000000000e+00 12378 12378 1.00000000000000e+00 12379 12379 1.00000000000000e+00 12380 12380 1.00000000000000e+00 12381 10509 8.34516350000000e-13 12381 10533 1.16629760528223e-06 12381 10557 2.54420757694314e-04 12381 10581 7.09412875459686e-05 12381 12381 2.89240257957875e+00 12381 11109 4.80711473218400e-08 12381 11133 4.32657486010509e-03 12381 11157 1.29727964301456e-01 12381 11181 3.21523235303077e-01 12381 11205 1.18136420444695e-02 12381 11709 8.82040844097468e-06 12381 11733 1.45416647043242e-01 12381 11757 3.18335899755204e+00 12381 11781 2.93723459434113e+00 12381 11805 1.48846185431126e-02 12381 12309 1.01894477122363e-05 12381 12333 2.17844836818987e-01 12381 12357 4.66704907915603e+00 12381 12933 9.64122588329163e-04 12381 12957 1.19790234883613e-01 12381 12981 2.46870374499712e-02 12381 20616 -2.30301308694390e-07 12381 20640 -4.96490615160516e-03 12381 20664 -1.22950809007915e-01 12381 20688 -2.11153262788619e-01 12381 21024 -1.19463980016846e-06 12381 21048 -3.66291396137415e-02 12381 21072 -1.03543496275681e+00 12381 21096 -1.81449700885224e+00 12381 21432 -1.32403957025805e-06 12381 21456 -1.04039244321100e-01 12381 21480 -2.63427490152779e+00 12381 21504 -4.54030951783670e+00 12381 21840 -2.73434565390920e-07 12381 21864 -8.07620712877434e-02 12381 21888 -1.21722609796367e+00 12381 21912 -1.86912480621183e+00 12382 12382 1.00000000000000e+00 12383 12383 1.00000000000000e+00 12384 12384 1.00000000000000e+00 12385 12385 1.00000000000000e+00 12386 12386 1.00000000000000e+00 12387 12387 1.00000000000000e+00 12388 12388 1.00000000000000e+00 12389 12389 1.00000000000000e+00 12390 12390 1.00000000000000e+00 12391 12391 1.00000000000000e+00 12392 12392 1.00000000000000e+00 12393 12393 1.00000000000000e+00 12394 12394 1.00000000000000e+00 12395 12395 1.00000000000000e+00 12396 12396 1.00000000000000e+00 12397 12397 1.00000000000000e+00 12398 12398 1.00000000000000e+00 12399 12399 1.00000000000000e+00 12400 12400 1.00000000000000e+00 12401 12401 1.00000000000000e+00 12402 12402 1.00000000000000e+00 12403 12403 1.00000000000000e+00 12404 12404 1.00000000000000e+00 12405 12405 1.00000000000000e+00 12406 12406 1.00000000000000e+00 12407 12407 1.00000000000000e+00 12408 12408 1.00000000000000e+00 12409 12409 1.00000000000000e+00 12410 12410 1.00000000000000e+00 12411 12411 1.00000000000000e+00 12412 12412 1.00000000000000e+00 12413 12413 1.00000000000000e+00 12414 12414 1.00000000000000e+00 12415 12415 1.00000000000000e+00 12416 12416 1.00000000000000e+00 12417 12417 1.00000000000000e+00 12418 12418 1.00000000000000e+00 12419 12419 1.00000000000000e+00 12420 12420 1.00000000000000e+00 12421 12421 1.00000000000000e+00 12422 12422 1.00000000000000e+00 12423 12423 1.00000000000000e+00 12424 12424 1.00000000000000e+00 12425 12425 1.00000000000000e+00 12426 12426 1.00000000000000e+00 12427 12427 1.00000000000000e+00 12428 12428 1.00000000000000e+00 12429 12429 1.00000000000000e+00 12430 12430 1.00000000000000e+00 12431 12431 1.00000000000000e+00 12432 12432 1.00000000000000e+00 12433 12433 1.00000000000000e+00 12434 12434 1.00000000000000e+00 12435 12435 1.00000000000000e+00 12436 12436 1.00000000000000e+00 12437 12437 1.00000000000000e+00 12438 12438 1.00000000000000e+00 12439 12439 1.00000000000000e+00 12440 12440 1.00000000000000e+00 12441 12441 1.00000000000000e+00 12442 12442 1.00000000000000e+00 12443 12443 1.00000000000000e+00 12444 12444 1.00000000000000e+00 12445 12445 1.00000000000000e+00 12446 12446 1.00000000000000e+00 12447 12447 1.00000000000000e+00 12448 12448 1.00000000000000e+00 12449 12449 1.00000000000000e+00 12450 12450 1.00000000000000e+00 12451 12451 1.00000000000000e+00 12452 12452 1.00000000000000e+00 12453 12453 1.00000000000000e+00 12454 12454 1.00000000000000e+00 12455 12455 1.00000000000000e+00 12456 12456 1.00000000000000e+00 12457 12457 1.00000000000000e+00 12458 12458 1.00000000000000e+00 12459 12459 1.00000000000000e+00 12460 12460 1.00000000000000e+00 12461 12461 1.00000000000000e+00 12462 12462 1.00000000000000e+00 12463 12463 1.00000000000000e+00 12464 12464 1.00000000000000e+00 12465 12465 1.00000000000000e+00 12466 12466 1.00000000000000e+00 12467 12467 1.00000000000000e+00 12468 12468 1.00000000000000e+00 12469 12469 1.00000000000000e+00 12470 12470 1.00000000000000e+00 12471 12471 1.00000000000000e+00 12472 12472 1.00000000000000e+00 12473 12473 1.00000000000000e+00 12474 12474 1.00000000000000e+00 12475 12475 1.00000000000000e+00 12476 12476 1.00000000000000e+00 12477 12477 1.00000000000000e+00 12478 12478 1.00000000000000e+00 12479 12479 1.00000000000000e+00 12480 12480 1.00000000000000e+00 12481 12481 1.00000000000000e+00 12482 12482 1.00000000000000e+00 12483 12483 1.00000000000000e+00 12484 12484 1.00000000000000e+00 12485 12485 1.00000000000000e+00 12486 12486 1.00000000000000e+00 12487 12487 1.00000000000000e+00 12488 12488 1.00000000000000e+00 12489 12489 1.00000000000000e+00 12490 12490 1.00000000000000e+00 12491 12491 1.00000000000000e+00 12492 12492 1.00000000000000e+00 12493 12493 1.00000000000000e+00 12494 12494 1.00000000000000e+00 12495 12495 1.00000000000000e+00 12496 12496 1.00000000000000e+00 12497 12497 1.00000000000000e+00 12498 12498 1.00000000000000e+00 12499 12499 1.00000000000000e+00 12500 12500 1.00000000000000e+00 12501 12501 1.00000000000000e+00 12502 12502 1.00000000000000e+00 12503 12503 1.00000000000000e+00 12504 12504 1.00000000000000e+00 12505 12505 1.00000000000000e+00 12506 12506 1.00000000000000e+00 12507 12507 1.00000000000000e+00 12508 12508 1.00000000000000e+00 12509 12509 1.00000000000000e+00 12510 12510 1.00000000000000e+00 12511 12511 1.00000000000000e+00 12512 12512 1.00000000000000e+00 12513 12513 1.00000000000000e+00 12514 12514 1.00000000000000e+00 12515 12515 1.00000000000000e+00 12516 12516 1.00000000000000e+00 12517 12517 1.00000000000000e+00 12518 12518 1.00000000000000e+00 12519 12519 1.00000000000000e+00 12520 12520 1.00000000000000e+00 12521 12521 1.00000000000000e+00 12522 12522 1.00000000000000e+00 12523 12523 1.00000000000000e+00 12524 12524 1.00000000000000e+00 12525 12525 1.00000000000000e+00 12526 12526 1.00000000000000e+00 12527 12527 1.00000000000000e+00 12528 12528 1.00000000000000e+00 12529 12529 1.00000000000000e+00 12530 12530 1.00000000000000e+00 12531 12531 1.00000000000000e+00 12532 12532 1.00000000000000e+00 12533 12533 1.00000000000000e+00 12534 12534 1.00000000000000e+00 12535 12535 1.00000000000000e+00 12536 12536 1.00000000000000e+00 12537 12537 1.00000000000000e+00 12538 12538 1.00000000000000e+00 12539 12539 1.00000000000000e+00 12540 12540 1.00000000000000e+00 12541 12541 1.00000000000000e+00 12542 12542 1.00000000000000e+00 12543 12543 1.00000000000000e+00 12544 12544 1.00000000000000e+00 12545 12545 1.00000000000000e+00 12546 12546 1.00000000000000e+00 12547 12547 1.00000000000000e+00 12548 12548 1.00000000000000e+00 12549 12549 1.00000000000000e+00 12550 12550 1.00000000000000e+00 12551 12551 1.00000000000000e+00 12552 12552 1.00000000000000e+00 12553 12553 1.00000000000000e+00 12554 12554 1.00000000000000e+00 12555 12555 1.00000000000000e+00 12556 12556 1.00000000000000e+00 12557 12557 1.00000000000000e+00 12558 12558 1.00000000000000e+00 12559 12559 1.00000000000000e+00 12560 12560 1.00000000000000e+00 12561 12561 1.00000000000000e+00 12562 12562 1.00000000000000e+00 12563 12563 1.00000000000000e+00 12564 12564 1.00000000000000e+00 12565 12565 1.00000000000000e+00 12566 12566 1.00000000000000e+00 12567 12567 1.00000000000000e+00 12568 12568 1.00000000000000e+00 12569 12569 1.00000000000000e+00 12570 12570 1.00000000000000e+00 12571 12571 1.00000000000000e+00 12572 12572 1.00000000000000e+00 12573 12573 1.00000000000000e+00 12574 12574 1.00000000000000e+00 12575 12575 1.00000000000000e+00 12576 12576 1.00000000000000e+00 12577 12577 1.00000000000000e+00 12578 12578 1.00000000000000e+00 12579 12579 1.00000000000000e+00 12580 12580 1.00000000000000e+00 12581 12581 1.00000000000000e+00 12582 12582 1.00000000000000e+00 12583 12583 1.00000000000000e+00 12584 12584 1.00000000000000e+00 12585 12585 1.00000000000000e+00 12586 12586 1.00000000000000e+00 12587 12587 1.00000000000000e+00 12588 12588 1.00000000000000e+00 12589 12589 1.00000000000000e+00 12590 12590 1.00000000000000e+00 12591 12591 1.00000000000000e+00 12592 12592 1.00000000000000e+00 12593 12593 1.00000000000000e+00 12594 12594 1.00000000000000e+00 12595 12595 1.00000000000000e+00 12596 12596 1.00000000000000e+00 12597 12597 1.00000000000000e+00 12598 12598 1.00000000000000e+00 12599 12599 1.00000000000000e+00 12600 12600 1.00000000000000e+00 12601 12601 1.00000000000000e+00 12602 12602 1.00000000000000e+00 12603 12603 1.00000000000000e+00 12604 12604 1.00000000000000e+00 12605 12605 1.00000000000000e+00 12606 12606 1.00000000000000e+00 12607 12607 1.00000000000000e+00 12608 12608 1.00000000000000e+00 12609 12609 1.00000000000000e+00 12610 12610 1.00000000000000e+00 12611 12611 1.00000000000000e+00 12612 12612 1.00000000000000e+00 12613 12613 1.00000000000000e+00 12614 12614 1.00000000000000e+00 12615 12615 1.00000000000000e+00 12616 12616 1.00000000000000e+00 12617 12617 1.00000000000000e+00 12618 12618 1.00000000000000e+00 12619 12619 1.00000000000000e+00 12620 12620 1.00000000000000e+00 12621 12621 1.00000000000000e+00 12622 12622 1.00000000000000e+00 12623 12623 1.00000000000000e+00 12624 12624 1.00000000000000e+00 12625 12625 1.00000000000000e+00 12626 12626 1.00000000000000e+00 12627 12627 1.00000000000000e+00 12628 12628 1.00000000000000e+00 12629 12629 1.00000000000000e+00 12630 12630 1.00000000000000e+00 12631 12631 1.00000000000000e+00 12632 12632 1.00000000000000e+00 12633 12633 1.00000000000000e+00 12634 12634 1.00000000000000e+00 12635 12635 1.00000000000000e+00 12636 12636 1.00000000000000e+00 12637 12637 1.00000000000000e+00 12638 12638 1.00000000000000e+00 12639 12639 1.00000000000000e+00 12640 12640 1.00000000000000e+00 12641 12641 1.00000000000000e+00 12642 12642 1.00000000000000e+00 12643 12643 1.00000000000000e+00 12644 12644 1.00000000000000e+00 12645 12645 1.00000000000000e+00 12646 12646 1.00000000000000e+00 12647 12647 1.00000000000000e+00 12648 12648 1.00000000000000e+00 12649 12649 1.00000000000000e+00 12650 12650 1.00000000000000e+00 12651 12651 1.00000000000000e+00 12652 12652 1.00000000000000e+00 12653 12653 1.00000000000000e+00 12654 12654 1.00000000000000e+00 12655 12655 1.00000000000000e+00 12656 12656 1.00000000000000e+00 12657 12657 1.00000000000000e+00 12658 12658 1.00000000000000e+00 12659 12659 1.00000000000000e+00 12660 12660 1.00000000000000e+00 12661 12661 1.00000000000000e+00 12662 12662 1.00000000000000e+00 12663 12663 1.00000000000000e+00 12664 12664 1.00000000000000e+00 12665 12665 1.00000000000000e+00 12666 12666 1.00000000000000e+00 12667 12667 1.00000000000000e+00 12668 12668 1.00000000000000e+00 12669 12669 1.00000000000000e+00 12670 12670 1.00000000000000e+00 12671 12671 1.00000000000000e+00 12672 12672 1.00000000000000e+00 12673 12673 1.00000000000000e+00 12674 12674 1.00000000000000e+00 12675 12675 1.00000000000000e+00 12676 12676 1.00000000000000e+00 12677 12677 1.00000000000000e+00 12678 12678 1.00000000000000e+00 12679 12679 1.00000000000000e+00 12680 12680 1.00000000000000e+00 12681 12681 1.00000000000000e+00 12682 12682 1.00000000000000e+00 12683 12683 1.00000000000000e+00 12684 12684 1.00000000000000e+00 12685 12685 1.00000000000000e+00 12686 12686 1.00000000000000e+00 12687 12687 1.00000000000000e+00 12688 12688 1.00000000000000e+00 12689 12689 1.00000000000000e+00 12690 12690 1.00000000000000e+00 12691 12691 1.00000000000000e+00 12692 12692 1.00000000000000e+00 12693 12693 1.00000000000000e+00 12694 12694 1.00000000000000e+00 12695 12695 1.00000000000000e+00 12696 12696 1.00000000000000e+00 12697 12697 1.00000000000000e+00 12698 12698 1.00000000000000e+00 12699 12699 1.00000000000000e+00 12700 12700 1.00000000000000e+00 12701 12701 1.00000000000000e+00 12702 12702 1.00000000000000e+00 12703 12703 1.00000000000000e+00 12704 12704 1.00000000000000e+00 12705 12705 1.00000000000000e+00 12706 12706 1.00000000000000e+00 12707 12707 1.00000000000000e+00 12708 12708 1.00000000000000e+00 12709 12709 1.00000000000000e+00 12710 12710 1.00000000000000e+00 12711 12711 1.00000000000000e+00 12712 12712 1.00000000000000e+00 12713 12713 1.00000000000000e+00 12714 12714 1.00000000000000e+00 12715 12715 1.00000000000000e+00 12716 12716 1.00000000000000e+00 12717 12717 1.00000000000000e+00 12718 12718 1.00000000000000e+00 12719 12719 1.00000000000000e+00 12720 12720 1.00000000000000e+00 12721 12721 1.00000000000000e+00 12722 12722 1.00000000000000e+00 12723 12723 1.00000000000000e+00 12724 12724 1.00000000000000e+00 12725 12725 1.00000000000000e+00 12726 12726 1.00000000000000e+00 12727 12727 1.00000000000000e+00 12728 12728 1.00000000000000e+00 12729 12729 1.00000000000000e+00 12730 12730 1.00000000000000e+00 12731 12731 1.00000000000000e+00 12732 12732 1.00000000000000e+00 12733 12733 1.00000000000000e+00 12734 12734 1.00000000000000e+00 12735 12735 1.00000000000000e+00 12736 12736 1.00000000000000e+00 12737 12737 1.00000000000000e+00 12738 12738 1.00000000000000e+00 12739 12739 1.00000000000000e+00 12740 12740 1.00000000000000e+00 12741 12741 1.00000000000000e+00 12742 12742 1.00000000000000e+00 12743 12743 1.00000000000000e+00 12744 12744 1.00000000000000e+00 12745 12745 1.00000000000000e+00 12746 12746 1.00000000000000e+00 12747 12747 1.00000000000000e+00 12748 12748 1.00000000000000e+00 12749 12749 1.00000000000000e+00 12750 12750 1.00000000000000e+00 12751 12751 1.00000000000000e+00 12752 12752 1.00000000000000e+00 12753 12753 1.00000000000000e+00 12754 12754 1.00000000000000e+00 12755 12755 1.00000000000000e+00 12756 12756 1.00000000000000e+00 12757 12757 1.00000000000000e+00 12758 12758 1.00000000000000e+00 12759 12759 1.00000000000000e+00 12760 12760 1.00000000000000e+00 12761 12761 1.00000000000000e+00 12762 12762 1.00000000000000e+00 12763 12763 1.00000000000000e+00 12764 12764 1.00000000000000e+00 12765 12765 1.00000000000000e+00 12766 12766 1.00000000000000e+00 12767 12767 1.00000000000000e+00 12768 12768 1.00000000000000e+00 12769 12769 1.00000000000000e+00 12770 12770 1.00000000000000e+00 12771 12771 1.00000000000000e+00 12772 12772 1.00000000000000e+00 12773 12773 1.00000000000000e+00 12774 12774 1.00000000000000e+00 12775 12775 1.00000000000000e+00 12776 12776 1.00000000000000e+00 12777 12777 1.00000000000000e+00 12778 12778 1.00000000000000e+00 12779 12779 1.00000000000000e+00 12780 12780 1.00000000000000e+00 12781 12781 1.00000000000000e+00 12782 12782 1.00000000000000e+00 12783 12783 1.00000000000000e+00 12784 12784 1.00000000000000e+00 12785 12785 1.00000000000000e+00 12786 12786 1.00000000000000e+00 12787 12787 1.00000000000000e+00 12788 12788 1.00000000000000e+00 12789 12789 1.00000000000000e+00 12790 12790 1.00000000000000e+00 12791 12791 1.00000000000000e+00 12792 12792 1.00000000000000e+00 12793 12793 1.00000000000000e+00 12794 12794 1.00000000000000e+00 12795 12795 1.00000000000000e+00 12796 12796 1.00000000000000e+00 12797 12797 1.00000000000000e+00 12798 12798 1.00000000000000e+00 12799 12799 1.00000000000000e+00 12800 12800 1.00000000000000e+00 12801 12801 1.00000000000000e+00 12802 12802 1.00000000000000e+00 12803 12803 1.00000000000000e+00 12804 12804 1.00000000000000e+00 12805 12805 1.00000000000000e+00 12806 12806 1.00000000000000e+00 12807 12807 1.00000000000000e+00 12808 12808 1.00000000000000e+00 12809 12809 1.00000000000000e+00 12810 12810 1.00000000000000e+00 12811 12811 1.00000000000000e+00 12812 12812 1.00000000000000e+00 12813 12813 1.00000000000000e+00 12814 12814 1.00000000000000e+00 12815 12815 1.00000000000000e+00 12816 12816 1.00000000000000e+00 12817 12817 1.00000000000000e+00 12818 12818 1.00000000000000e+00 12819 12819 1.00000000000000e+00 12820 12820 1.00000000000000e+00 12821 12821 1.00000000000000e+00 12822 12822 1.00000000000000e+00 12823 12823 1.00000000000000e+00 12824 12824 1.00000000000000e+00 12825 12825 1.00000000000000e+00 12826 12826 1.00000000000000e+00 12827 12827 1.00000000000000e+00 12828 12828 1.00000000000000e+00 12829 12829 1.00000000000000e+00 12830 12830 1.00000000000000e+00 12831 12831 1.00000000000000e+00 12832 12832 1.00000000000000e+00 12833 12833 1.00000000000000e+00 12834 12834 1.00000000000000e+00 12835 12835 1.00000000000000e+00 12836 12836 1.00000000000000e+00 12837 12837 1.00000000000000e+00 12838 12838 1.00000000000000e+00 12839 12839 1.00000000000000e+00 12840 12840 1.00000000000000e+00 12841 12841 1.00000000000000e+00 12842 12842 1.00000000000000e+00 12843 12843 1.00000000000000e+00 12844 12844 1.00000000000000e+00 12845 12845 1.00000000000000e+00 12846 12846 1.00000000000000e+00 12847 12847 1.00000000000000e+00 12848 12848 1.00000000000000e+00 12849 12849 1.00000000000000e+00 12850 12850 1.00000000000000e+00 12851 12851 1.00000000000000e+00 12852 12852 1.00000000000000e+00 12853 12853 1.00000000000000e+00 12854 12854 1.00000000000000e+00 12855 12855 1.00000000000000e+00 12856 12856 1.00000000000000e+00 12857 12857 1.00000000000000e+00 12858 12858 1.00000000000000e+00 12859 12859 1.00000000000000e+00 12860 12860 1.00000000000000e+00 12861 12861 1.00000000000000e+00 12862 12862 1.00000000000000e+00 12863 12863 1.00000000000000e+00 12864 12864 1.00000000000000e+00 12865 12865 1.00000000000000e+00 12866 12866 1.00000000000000e+00 12867 12867 1.00000000000000e+00 12868 12868 1.00000000000000e+00 12869 12869 1.00000000000000e+00 12870 12870 1.00000000000000e+00 12871 12871 1.00000000000000e+00 12872 12872 1.00000000000000e+00 12873 12873 1.00000000000000e+00 12874 12874 1.00000000000000e+00 12875 12875 1.00000000000000e+00 12876 12876 1.00000000000000e+00 12877 12877 1.00000000000000e+00 12878 12878 1.00000000000000e+00 12879 12879 1.00000000000000e+00 12880 12880 1.00000000000000e+00 12881 12881 1.00000000000000e+00 12882 12882 1.00000000000000e+00 12883 12883 1.00000000000000e+00 12884 12884 1.00000000000000e+00 12885 12885 1.00000000000000e+00 12886 12886 1.00000000000000e+00 12887 12887 1.00000000000000e+00 12888 12888 1.00000000000000e+00 12889 12889 1.00000000000000e+00 12890 12890 1.00000000000000e+00 12891 12891 1.00000000000000e+00 12892 12892 1.00000000000000e+00 12893 12893 1.00000000000000e+00 12894 12894 1.00000000000000e+00 12895 12895 1.00000000000000e+00 12896 12896 1.00000000000000e+00 12897 12897 1.00000000000000e+00 12898 12898 1.00000000000000e+00 12899 12899 1.00000000000000e+00 12900 12900 1.00000000000000e+00 12901 12901 1.00000000000000e+00 12902 12902 1.00000000000000e+00 12903 12903 1.00000000000000e+00 12904 12904 1.00000000000000e+00 12905 12905 1.00000000000000e+00 12906 12906 1.00000000000000e+00 12907 12907 1.00000000000000e+00 12908 12908 1.00000000000000e+00 12909 12909 1.00000000000000e+00 12910 12910 1.00000000000000e+00 12911 12911 1.00000000000000e+00 12912 12912 1.00000000000000e+00 12913 12913 1.00000000000000e+00 12914 12914 1.00000000000000e+00 12915 12915 1.00000000000000e+00 12916 12916 1.00000000000000e+00 12917 12917 1.00000000000000e+00 12918 12918 1.00000000000000e+00 12919 12919 1.00000000000000e+00 12920 12920 1.00000000000000e+00 12921 12921 1.00000000000000e+00 12922 12922 1.00000000000000e+00 12923 12923 1.00000000000000e+00 12924 12924 1.00000000000000e+00 12925 12925 1.00000000000000e+00 12926 12926 1.00000000000000e+00 12927 12927 1.00000000000000e+00 12928 12928 1.00000000000000e+00 12929 12929 1.00000000000000e+00 12930 12930 1.00000000000000e+00 12931 12931 1.00000000000000e+00 12932 12932 1.00000000000000e+00 12933 12933 1.00000435929869e+00 12933 11133 5.18496828096320e-07 12933 11157 3.19208832744835e-06 12933 11181 7.09230616116300e-07 12933 11709 1.28205453431020e-07 12933 11733 1.07228177540040e-03 12933 11757 2.07534537618316e-03 12933 11781 2.13706456323187e-04 12933 12309 1.52197706490330e-07 12933 12333 1.95729919479411e-03 12933 12357 8.11544335799004e-03 12933 12381 9.64122588329163e-04 12933 12957 3.16146648534752e-04 12933 12981 5.45386769826291e-05 12933 21048 -2.92525320334765e-06 12933 21072 -3.51333413334758e-05 12933 21096 -4.97899102435181e-05 12933 21456 -5.02259234512167e-04 12933 21480 -2.70507787134015e-03 12933 21504 -1.89434110109513e-03 12933 21864 -9.84041696600900e-04 12933 21888 -5.16422235334597e-03 12933 21912 -3.44015283048563e-03 12934 12934 1.00000000000000e+00 12935 12935 1.00000000000000e+00 12936 12936 1.00000000000000e+00 12937 12937 1.00000000000000e+00 12938 12938 1.00000000000000e+00 12939 12939 1.00000000000000e+00 12940 12940 1.00000000000000e+00 12941 12941 1.00000000000000e+00 12942 12942 1.00000000000000e+00 12943 12943 1.00000000000000e+00 12944 12944 1.00000000000000e+00 12945 12945 1.00000000000000e+00 12946 12946 1.00000000000000e+00 12947 12947 1.00000000000000e+00 12948 12948 1.00000000000000e+00 12949 12949 1.00000000000000e+00 12950 12950 1.00000000000000e+00 12951 12951 1.00000000000000e+00 12952 12952 1.00000000000000e+00 12953 12953 1.00000000000000e+00 12954 12954 1.00000000000000e+00 12955 12955 1.00000000000000e+00 12956 12956 1.00000000000000e+00 12957 12957 1.03255630443834e+00 12957 11133 3.30881342016390e-05 12957 11157 3.54827271089055e-04 12957 11181 1.80194811187148e-04 12957 11709 3.44776521549207e-06 12957 11733 3.06976858560494e-02 12957 11757 1.30411080783787e-01 12957 11781 4.36793967859309e-02 12957 12309 4.09279816281600e-06 12957 12333 6.52632710066810e-02 12957 12357 6.14209279220201e-01 12957 12381 1.19790234883613e-01 12957 12933 3.16146648534752e-04 12957 12981 6.14289272445794e-03 12957 21048 -1.91406254721892e-04 12957 21072 -9.21270429339958e-03 12957 21096 -1.70855648037459e-02 12957 21456 -1.39520399675073e-02 12957 21480 -1.61524079405973e-01 12957 21504 -2.25383879039395e-01 12957 21864 -2.65642361519613e-02 12957 21888 -2.58559228758149e-01 12957 21912 -3.31168804452569e-01 12958 12958 1.00000000000000e+00 12959 12959 1.00000000000000e+00 12960 12960 1.00000000000000e+00 12961 12961 1.00000000000000e+00 12962 12962 1.00000000000000e+00 12963 12963 1.00000000000000e+00 12964 12964 1.00000000000000e+00 12965 12965 1.00000000000000e+00 12966 12966 1.00000000000000e+00 12967 12967 1.00000000000000e+00 12968 12968 1.00000000000000e+00 12969 12969 1.00000000000000e+00 12970 12970 1.00000000000000e+00 12971 12971 1.00000000000000e+00 12972 12972 1.00000000000000e+00 12973 12973 1.00000000000000e+00 12974 12974 1.00000000000000e+00 12975 12975 1.00000000000000e+00 12976 12976 1.00000000000000e+00 12977 12977 1.00000000000000e+00 12978 12978 1.00000000000000e+00 12979 12979 1.00000000000000e+00 12980 12980 1.00000000000000e+00 12981 12981 1.00118062439057e+00 12981 11133 4.55990495249583e-06 12981 11157 7.20900767794635e-05 12981 11181 4.59011807340390e-05 12981 11709 2.84965056096500e-07 12981 11733 2.79091754131947e-03 12981 11757 2.33776633015672e-02 12981 11781 1.06727575900902e-02 12981 12309 3.38261348833680e-07 12981 12333 7.20909761037764e-03 12981 12357 1.09822659070731e-01 12981 12381 2.46870374499712e-02 12981 12933 5.45386769826291e-05 12981 12957 6.14289272445794e-03 12981 21048 -2.65678797598079e-05 12981 21072 -2.35827455065933e-03 12981 21096 -4.53057394300000e-03 12981 21456 -1.19559189827232e-03 12981 21480 -2.76749461282615e-02 12981 21504 -4.69807489686166e-02 12981 21864 -2.20520863822599e-03 12981 21888 -3.88419704019076e-02 12981 21912 -6.22474803362333e-02 12982 12982 1.00000000000000e+00 12983 12983 1.00000000000000e+00 12984 12984 1.00000000000000e+00 12985 12985 1.00000000000000e+00 12986 12986 1.00000000000000e+00 12987 12987 1.00000000000000e+00 12988 12988 1.00000000000000e+00 12989 12989 1.00000000000000e+00 12990 12990 1.00000000000000e+00 12991 12991 1.00000000000000e+00 12992 12992 1.00000000000000e+00 12993 12993 1.00000000000000e+00 12994 12994 1.00000000000000e+00 12995 12995 1.00000000000000e+00 12996 12996 1.00000000000000e+00 12997 12997 1.00000000000000e+00 12998 12998 1.00000000000000e+00 12999 12999 1.00000000000000e+00 13000 13000 1.00000000000000e+00 13001 13001 1.00000000000000e+00 13002 13002 1.00000000000000e+00 13003 13003 1.00000000000000e+00 13004 13004 1.00000000000000e+00 13005 13005 1.00000000000000e+00 13006 13006 1.00000000000000e+00 13007 13007 1.00000000000000e+00 13008 13008 1.00000000000000e+00 13009 13009 1.00000000000000e+00 13010 13010 1.00000000000000e+00 13011 13011 1.00000000000000e+00 13012 13012 1.00000000000000e+00 13013 13013 1.00000000000000e+00 13014 13014 1.00000000000000e+00 13015 13015 1.00000000000000e+00 13016 13016 1.00000000000000e+00 13017 13017 1.00000000000000e+00 13018 13018 1.00000000000000e+00 13019 13019 1.00000000000000e+00 13020 13020 1.00000000000000e+00 13021 13021 1.00000000000000e+00 13022 13022 1.00000000000000e+00 13023 13023 1.00000000000000e+00 13024 13024 1.00000000000000e+00 13025 13025 1.00000000000000e+00 13026 13026 1.00000000000000e+00 13027 13027 1.00000000000000e+00 13028 13028 1.00000000000000e+00 13029 13029 1.00000000000000e+00 13030 13030 1.00000000000000e+00 13031 13031 1.00000000000000e+00 13032 13032 1.00000000000000e+00 13033 13033 1.00000000000000e+00 13034 13034 1.00000000000000e+00 13035 13035 1.00000000000000e+00 13036 13036 1.00000000000000e+00 13037 13037 1.00000000000000e+00 13038 13038 1.00000000000000e+00 13039 13039 1.00000000000000e+00 13040 13040 1.00000000000000e+00 13041 13041 1.00000000000000e+00 13042 13042 1.00000000000000e+00 13043 13043 1.00000000000000e+00 13044 13044 1.00000000000000e+00 13045 13045 1.00000000000000e+00 13046 13046 1.00000000000000e+00 13047 13047 1.00000000000000e+00 13048 13048 1.00000000000000e+00 13049 13049 1.00000000000000e+00 13050 13050 1.00000000000000e+00 13051 13051 1.00000000000000e+00 13052 13052 1.00000000000000e+00 13053 13053 1.00000000000000e+00 13054 13054 1.00000000000000e+00 13055 13055 1.00000000000000e+00 13056 13056 1.00000000000000e+00 13057 13057 1.00000000000000e+00 13058 13058 1.00000000000000e+00 13059 13059 1.00000000000000e+00 13060 13060 1.00000000000000e+00 13061 13061 1.00000000000000e+00 13062 13062 1.00000000000000e+00 13063 13063 1.00000000000000e+00 13064 13064 1.00000000000000e+00 13065 13065 1.00000000000000e+00 13066 13066 1.00000000000000e+00 13067 13067 1.00000000000000e+00 13068 13068 1.00000000000000e+00 13069 13069 1.00000000000000e+00 13070 13070 1.00000000000000e+00 13071 13071 1.00000000000000e+00 13072 13072 1.00000000000000e+00 13073 13073 1.00000000000000e+00 13074 13074 1.00000000000000e+00 13075 13075 1.00000000000000e+00 13076 13076 1.00000000000000e+00 13077 13077 1.00000000000000e+00 13078 13078 1.00000000000000e+00 13079 13079 1.00000000000000e+00 13080 13080 1.00000000000000e+00 13081 13081 1.00000000000000e+00 13082 13082 1.00000000000000e+00 13083 13083 1.00000000000000e+00 13084 13084 1.00000000000000e+00 13085 13085 1.00000000000000e+00 13086 13086 1.00000000000000e+00 13087 13087 1.00000000000000e+00 13088 13088 1.00000000000000e+00 13089 13089 1.00000000000000e+00 13090 13090 1.00000000000000e+00 13091 13091 1.00000000000000e+00 13092 13092 1.00000000000000e+00 13093 13093 1.00000000000000e+00 13094 13094 1.00000000000000e+00 13095 13095 1.00000000000000e+00 13096 13096 1.00000000000000e+00 13097 13097 1.00000000000000e+00 13098 13098 1.00000000000000e+00 13099 13099 1.00000000000000e+00 13100 13100 1.00000000000000e+00 13101 13101 1.00000000000000e+00 13102 13102 1.00000000000000e+00 13103 13103 1.00000000000000e+00 13104 13104 1.00000000000000e+00 13105 13105 1.00000000000000e+00 13106 13106 1.00000000000000e+00 13107 13107 1.00000000000000e+00 13108 13108 1.00000000000000e+00 13109 13109 1.00000000000000e+00 13110 13110 1.00000000000000e+00 13111 13111 1.00000000000000e+00 13112 13112 1.00000000000000e+00 13113 13113 1.00000000000000e+00 13114 13114 1.00000000000000e+00 13115 13115 1.00000000000000e+00 13116 13116 1.00000000000000e+00 13117 13117 1.00000000000000e+00 13118 13118 1.00000000000000e+00 13119 13119 1.00000000000000e+00 13120 13120 1.00000000000000e+00 13121 13121 1.00000000000000e+00 13122 13122 1.00000000000000e+00 13123 13123 1.00000000000000e+00 13124 13124 1.00000000000000e+00 13125 13125 1.00000000000000e+00 13126 13126 1.00000000000000e+00 13127 13127 1.00000000000000e+00 13128 13128 1.00000000000000e+00 13129 13129 1.00000000000000e+00 13130 13130 1.00000000000000e+00 13131 13131 1.00000000000000e+00 13132 13132 1.00000000000000e+00 13133 13133 1.00000000000000e+00 13134 13134 1.00000000000000e+00 13135 13135 1.00000000000000e+00 13136 13136 1.00000000000000e+00 13137 13137 1.00000000000000e+00 13138 13138 1.00000000000000e+00 13139 13139 1.00000000000000e+00 13140 13140 1.00000000000000e+00 13141 13141 1.00000000000000e+00 13142 13142 1.00000000000000e+00 13143 13143 1.00000000000000e+00 13144 13144 1.00000000000000e+00 13145 13145 1.00000000000000e+00 13146 13146 1.00000000000000e+00 13147 13147 1.00000000000000e+00 13148 13148 1.00000000000000e+00 13149 13149 1.00000000000000e+00 13150 13150 1.00000000000000e+00 13151 13151 1.00000000000000e+00 13152 13152 1.00000000000000e+00 13153 13153 1.00000000000000e+00 13154 13154 1.00000000000000e+00 13155 13155 1.00000000000000e+00 13156 13156 1.00000000000000e+00 13157 13157 1.00000000000000e+00 13158 13158 1.00000000000000e+00 13159 13159 1.00000000000000e+00 13160 13160 1.00000000000000e+00 13161 13161 1.00000000000000e+00 13162 13162 1.00000000000000e+00 13163 13163 1.00000000000000e+00 13164 13164 1.00000000000000e+00 13165 13165 1.00000000000000e+00 13166 13166 1.00000000000000e+00 13167 13167 1.00000000000000e+00 13168 13168 1.00000000000000e+00 13169 13169 1.00000000000000e+00 13170 13170 1.00000000000000e+00 13171 13171 1.00000000000000e+00 13172 13172 1.00000000000000e+00 13173 13173 1.00000000000000e+00 13174 13174 1.00000000000000e+00 13175 13175 1.00000000000000e+00 13176 13176 1.00000000000000e+00 13177 13177 1.00000000000000e+00 13178 13178 1.00000000000000e+00 13179 13179 1.00000000000000e+00 13180 13180 1.00000000000000e+00 13181 13181 1.00000000000000e+00 13182 13182 1.00000000000000e+00 13183 13183 1.00000000000000e+00 13184 13184 1.00000000000000e+00 13185 13185 1.00000000000000e+00 13186 13186 1.00000000000000e+00 13187 13187 1.00000000000000e+00 13188 13188 1.00000000000000e+00 13189 13189 1.00000000000000e+00 13190 13190 1.00000000000000e+00 13191 13191 1.00000000000000e+00 13192 13192 1.00000000000000e+00 13193 13193 1.00000000000000e+00 13194 13194 1.00000000000000e+00 13195 13195 1.00000000000000e+00 13196 13196 1.00000000000000e+00 13197 13197 1.00000000000000e+00 13198 13198 1.00000000000000e+00 13199 13199 1.00000000000000e+00 13200 13200 1.00000000000000e+00 13201 13201 1.00000000000000e+00 13202 13202 1.00000000000000e+00 13203 13203 1.00000000000000e+00 13204 13204 1.00000000000000e+00 13205 13205 1.00000000000000e+00 13206 13206 1.00000000000000e+00 13207 13207 1.00000000000000e+00 13208 13208 1.00000000000000e+00 13209 13209 1.00000000000000e+00 13210 13210 1.00000000000000e+00 13211 13211 1.00000000000000e+00 13212 13212 1.00000000000000e+00 13213 13213 1.00000000000000e+00 13214 13214 1.00000000000000e+00 13215 13215 1.00000000000000e+00 13216 13216 1.00000000000000e+00 13217 13217 1.00000000000000e+00 13218 13218 1.00000000000000e+00 13219 13219 1.00000000000000e+00 13220 13220 1.00000000000000e+00 13221 13221 1.00000000000000e+00 13222 13222 1.00000000000000e+00 13223 13223 1.00000000000000e+00 13224 13224 1.00000000000000e+00 13225 13225 1.00000000000000e+00 13226 13226 1.00000000000000e+00 13227 13227 1.00000000000000e+00 13228 13228 1.00000000000000e+00 13229 13229 1.00000000000000e+00 13230 13230 1.00000000000000e+00 13231 13231 1.00000000000000e+00 13232 13232 1.00000000000000e+00 13233 13233 1.00000000000000e+00 13234 13234 1.00000000000000e+00 13235 13235 1.00000000000000e+00 13236 13236 1.00000000000000e+00 13237 13237 1.00000000000000e+00 13238 13238 1.00000000000000e+00 13239 13239 1.00000000000000e+00 13240 13240 1.00000000000000e+00 13241 13241 1.00000000000000e+00 13242 13242 1.00000000000000e+00 13243 13243 1.00000000000000e+00 13244 13244 1.00000000000000e+00 13245 13245 1.00000000000000e+00 13246 13246 1.00000000000000e+00 13247 13247 1.00000000000000e+00 13248 13248 1.00000000000000e+00 13249 13249 1.00000000000000e+00 13250 13250 1.00000000000000e+00 13251 13251 1.00000000000000e+00 13252 13252 1.00000000000000e+00 13253 13253 1.00000000000000e+00 13254 13254 1.00000000000000e+00 13255 13255 1.00000000000000e+00 13256 13256 1.00000000000000e+00 13257 13257 1.00000000000000e+00 13258 13258 1.00000000000000e+00 13259 13259 1.00000000000000e+00 13260 13260 1.00000000000000e+00 13261 13261 1.00000000000000e+00 13262 13262 1.00000000000000e+00 13263 13263 1.00000000000000e+00 13264 13264 1.00000000000000e+00 13265 13265 1.00000000000000e+00 13266 13266 1.00000000000000e+00 13267 13267 1.00000000000000e+00 13268 13268 1.00000000000000e+00 13269 13269 1.00000000000000e+00 13270 13270 1.00000000000000e+00 13271 13271 1.00000000000000e+00 13272 13272 1.00000000000000e+00 13273 13273 1.00000000000000e+00 13274 13274 1.00000000000000e+00 13275 13275 1.00000000000000e+00 13276 13276 1.00000000000000e+00 13277 13277 1.00000000000000e+00 13278 13278 1.00000000000000e+00 13279 13279 1.00000000000000e+00 13280 13280 1.00000000000000e+00 13281 13281 1.00000000000000e+00 13282 13282 1.00000000000000e+00 13283 13283 1.00000000000000e+00 13284 13284 1.00000000000000e+00 13285 13285 1.00000000000000e+00 13286 13286 1.00000000000000e+00 13287 13287 1.00000000000000e+00 13288 13288 1.00000000000000e+00 13289 13289 1.00000000000000e+00 13290 13290 1.00000000000000e+00 13291 13291 1.00000000000000e+00 13292 13292 1.00000000000000e+00 13293 13293 1.00000000000000e+00 13294 13294 1.00000000000000e+00 13295 13295 1.00000000000000e+00 13296 13296 1.00000000000000e+00 13297 13297 1.00000000000000e+00 13298 13298 1.00000000000000e+00 13299 13299 1.00000000000000e+00 13300 13300 1.00000000000000e+00 13301 13301 1.00000000000000e+00 13302 13302 1.00000000000000e+00 13303 13303 1.00000000000000e+00 13304 13304 1.00000000000000e+00 13305 13305 1.00000000000000e+00 13306 13306 1.00000000000000e+00 13307 13307 1.00000000000000e+00 13308 13308 1.00000000000000e+00 13309 13309 1.00000000000000e+00 13310 13310 1.00000000000000e+00 13311 13311 1.00000000000000e+00 13312 13312 1.00000000000000e+00 13313 13313 1.00000000000000e+00 13314 13314 1.00000000000000e+00 13315 13315 1.00000000000000e+00 13316 13316 1.00000000000000e+00 13317 13317 1.00000000000000e+00 13318 13318 1.00000000000000e+00 13319 13319 1.00000000000000e+00 13320 13320 1.00000000000000e+00 13321 13321 1.00000000000000e+00 13322 13322 1.00000000000000e+00 13323 13323 1.00000000000000e+00 13324 13324 1.00000000000000e+00 13325 13325 1.00000000000000e+00 13326 13326 1.00000000000000e+00 13327 13327 1.00000000000000e+00 13328 13328 1.00000000000000e+00 13329 13329 1.00000000000000e+00 13330 13330 1.00000000000000e+00 13331 13331 1.00000000000000e+00 13332 13332 1.00000000000000e+00 13333 13333 1.00000000000000e+00 13334 13334 1.00000000000000e+00 13335 13335 1.00000000000000e+00 13336 13336 1.00000000000000e+00 13337 13337 1.00000000000000e+00 13338 13338 1.00000000000000e+00 13339 13339 1.00000000000000e+00 13340 13340 1.00000000000000e+00 13341 13341 1.00000000000000e+00 13342 13342 1.00000000000000e+00 13343 13343 1.00000000000000e+00 13344 13344 1.00000000000000e+00 13345 13345 1.00000000000000e+00 13346 13346 1.00000000000000e+00 13347 13347 1.00000000000000e+00 13348 13348 1.00000000000000e+00 13349 13349 1.00000000000000e+00 13350 13350 1.00000000000000e+00 13351 13351 1.00000000000000e+00 13352 13352 1.00000000000000e+00 13353 13353 1.00000000000000e+00 13354 13354 1.00000000000000e+00 13355 13355 1.00000000000000e+00 13356 13356 1.00000000000000e+00 13357 13357 1.00000000000000e+00 13358 13358 1.00000000000000e+00 13359 13359 1.00000000000000e+00 13360 13360 1.00000000000000e+00 13361 13361 1.00000000000000e+00 13362 13362 1.00000000000000e+00 13363 13363 1.00000000000000e+00 13364 13364 1.00000000000000e+00 13365 13365 1.00000000000000e+00 13366 13366 1.00000000000000e+00 13367 13367 1.00000000000000e+00 13368 13368 1.00000000000000e+00 13369 13369 1.00000000000000e+00 13370 13370 1.00000000000000e+00 13371 13371 1.00000000000000e+00 13372 13372 1.00000000000000e+00 13373 13373 1.00000000000000e+00 13374 13374 1.00000000000000e+00 13375 13375 1.00000000000000e+00 13376 13376 1.00000000000000e+00 13377 13377 1.00000000000000e+00 13378 13378 1.00000000000000e+00 13379 13379 1.00000000000000e+00 13380 13380 1.00000000000000e+00 13381 13381 1.00000000000000e+00 13382 13382 1.00000000000000e+00 13383 13383 1.00000000000000e+00 13384 13384 1.00000000000000e+00 13385 13385 1.00000000000000e+00 13386 13386 1.00000000000000e+00 13387 13387 1.00000000000000e+00 13388 13388 1.00000000000000e+00 13389 13389 1.00000000000000e+00 13390 13390 1.00000000000000e+00 13391 13391 1.00000000000000e+00 13392 13392 1.00000000000000e+00 13393 13393 1.00000000000000e+00 13394 13394 1.00000000000000e+00 13395 13395 1.00000000000000e+00 13396 13396 1.00000000000000e+00 13397 13397 1.00000000000000e+00 13398 13398 1.00000000000000e+00 13399 13399 1.00000000000000e+00 13400 13400 1.00000000000000e+00 13401 13401 1.00000000000000e+00 13402 13402 1.00000000000000e+00 13403 13403 1.00000000000000e+00 13404 13404 1.00000000000000e+00 13405 13405 1.00000000000000e+00 13406 13406 1.00000000000000e+00 13407 13407 1.00000000000000e+00 13408 13408 1.00000000000000e+00 13409 13409 1.00000000000000e+00 13410 13410 1.00000000000000e+00 13411 13411 1.00000000000000e+00 13412 13412 1.00000000000000e+00 13413 13413 1.00000000000000e+00 13414 13414 1.00000000000000e+00 13415 13415 1.00000000000000e+00 13416 13416 1.00000000000000e+00 13417 13417 1.00000000000000e+00 13418 13418 1.00000000000000e+00 13419 13419 1.00000000000000e+00 13420 13420 1.00000000000000e+00 13421 13421 1.00000000000000e+00 13422 13422 1.00000000000000e+00 13423 13423 1.00000000000000e+00 13424 13424 1.00000000000000e+00 13425 13425 1.00000000000000e+00 13426 13426 1.00000000000000e+00 13427 13427 1.00000000000000e+00 13428 13428 1.00000000000000e+00 13429 13429 1.00000000000000e+00 13430 13430 1.00000000000000e+00 13431 13431 1.00000000000000e+00 13432 13432 1.00000000000000e+00 13433 13433 1.00000000000000e+00 13434 13434 1.00000000000000e+00 13435 13435 1.00000000000000e+00 13436 13436 1.00000000000000e+00 13437 13437 1.00000000000000e+00 13438 13438 1.00000000000000e+00 13439 13439 1.00000000000000e+00 13440 13440 1.00000000000000e+00 13441 13441 1.00000000000000e+00 13442 13442 1.00000000000000e+00 13443 13443 1.00000000000000e+00 13444 13444 1.00000000000000e+00 13445 13445 1.00000000000000e+00 13446 13446 1.00000000000000e+00 13447 13447 1.00000000000000e+00 13448 13448 1.00000000000000e+00 13449 13449 1.00000000000000e+00 13450 13450 1.00000000000000e+00 13451 13451 1.00000000000000e+00 13452 13452 1.00000000000000e+00 13453 13453 1.00000000000000e+00 13454 13454 1.00000000000000e+00 13455 13455 1.00000000000000e+00 13456 13456 1.00000000000000e+00 13457 13457 1.00000000000000e+00 13458 13458 1.00000000000000e+00 13459 13459 1.00000000000000e+00 13460 13460 1.00000000000000e+00 13461 13461 1.00000000000000e+00 13462 13462 1.00000000000000e+00 13463 13463 1.00000000000000e+00 13464 13464 1.00000000000000e+00 13465 13465 1.00000000000000e+00 13466 13466 1.00000000000000e+00 13467 13467 1.00000000000000e+00 13468 13468 1.00000000000000e+00 13469 13469 1.00000000000000e+00 13470 13470 1.00000000000000e+00 13471 13471 1.00000000000000e+00 13472 13472 1.00000000000000e+00 13473 13473 1.00000000000000e+00 13474 13474 1.00000000000000e+00 13475 13475 1.00000000000000e+00 13476 13476 1.00000000000000e+00 13477 13477 1.00000000000000e+00 13478 13478 1.00000000000000e+00 13479 13479 1.00000000000000e+00 13480 13480 1.00000000000000e+00 13481 13481 1.00000000000000e+00 13482 13482 1.00000000000000e+00 13483 13483 1.00000000000000e+00 13484 13484 1.00000000000000e+00 13485 13485 1.00000000000000e+00 13486 13486 1.00000000000000e+00 13487 13487 1.00000000000000e+00 13488 13488 1.00000000000000e+00 13489 13489 1.00000000000000e+00 13490 13490 1.00000000000000e+00 13491 13491 1.00000000000000e+00 13492 13492 1.00000000000000e+00 13493 13493 1.00000000000000e+00 13494 13494 1.00000000000000e+00 13495 13495 1.00000000000000e+00 13496 13496 1.00000000000000e+00 13497 13497 1.00000000000000e+00 13498 13498 1.00000000000000e+00 13499 13499 1.00000000000000e+00 13500 13500 1.00000000000000e+00 13501 13501 1.00000000000000e+00 13502 13502 1.00000000000000e+00 13503 13503 1.00000000000000e+00 13504 13504 1.00000000000000e+00 13505 13505 1.00000000000000e+00 13506 13506 1.00000000000000e+00 13507 13507 1.00000000000000e+00 13508 13508 1.00000000000000e+00 13509 13509 1.00000000000000e+00 13510 13510 1.00000000000000e+00 13511 13511 1.00000000000000e+00 13512 13512 1.00000000000000e+00 13513 13513 1.00000000000000e+00 13514 13514 1.00000000000000e+00 13515 13515 1.00000000000000e+00 13516 13516 1.00000000000000e+00 13517 13517 1.00000000000000e+00 13518 13518 1.00000000000000e+00 13519 13519 1.00000000000000e+00 13520 13520 1.00000000000000e+00 13521 13521 1.00000000000000e+00 13522 13522 1.00000000000000e+00 13523 13523 1.00000000000000e+00 13524 13524 1.00000000000000e+00 13525 13525 1.00000000000000e+00 13526 13526 1.00000000000000e+00 13527 13527 1.00000000000000e+00 13528 13528 1.00000000000000e+00 13529 13529 1.00000000000000e+00 13530 13530 1.00000000000000e+00 13531 13531 1.00000000000000e+00 13532 13532 1.00000000000000e+00 13533 13533 1.00000000000000e+00 13534 13534 1.00000000000000e+00 13535 13535 1.00000000000000e+00 13536 13536 1.00000000000000e+00 13537 13537 1.00000000000000e+00 13538 13538 1.00000000000000e+00 13539 13539 1.00000000000000e+00 13540 13540 1.00000000000000e+00 13541 13541 1.00000000000000e+00 13542 13542 1.00000000000000e+00 13543 13543 1.00000000000000e+00 13544 13544 1.00000000000000e+00 13545 13545 1.00000000000000e+00 13546 13546 1.00000000000000e+00 13547 13547 1.00000000000000e+00 13548 13548 1.00000000000000e+00 13549 13549 1.00000000000000e+00 13550 13550 1.00000000000000e+00 13551 13551 1.00000000000000e+00 13552 13552 1.00000000000000e+00 13553 13553 1.00000000000000e+00 13554 13554 1.00000000000000e+00 13555 13555 1.00000000000000e+00 13556 13556 1.00000000000000e+00 13557 13557 1.00000000000000e+00 13558 13558 1.00000000000000e+00 13559 13559 1.00000000000000e+00 13560 13560 1.00000000000000e+00 13561 13561 1.00000000000000e+00 13562 13562 1.00000000000000e+00 13563 13563 1.00000000000000e+00 13564 13564 1.00000000000000e+00 13565 13565 1.00000000000000e+00 13566 13566 1.00000000000000e+00 13567 13567 1.00000000000000e+00 13568 13568 1.00000000000000e+00 13569 13569 1.00000000000000e+00 13570 13570 1.00000000000000e+00 13571 13571 1.00000000000000e+00 13572 13572 1.00000000000000e+00 13573 13573 1.00000000000000e+00 13574 13574 1.00000000000000e+00 13575 13575 1.00000000000000e+00 13576 13576 1.00000000000000e+00 13577 13577 1.00000000000000e+00 13578 13578 1.00000000000000e+00 13579 13579 1.00000000000000e+00 13580 13580 1.00000000000000e+00 13581 13581 1.00000000000000e+00 13582 13582 1.00000000000000e+00 13583 13583 1.00000000000000e+00 13584 13584 1.00000000000000e+00 13585 13585 1.00000000000000e+00 13586 13586 1.00000000000000e+00 13587 13587 1.00000000000000e+00 13588 13588 1.00000000000000e+00 13589 13589 1.00000000000000e+00 13590 13590 1.00000000000000e+00 13591 13591 1.00000000000000e+00 13592 13592 1.00000000000000e+00 13593 13593 1.00000000000000e+00 13594 13594 1.00000000000000e+00 13595 13595 1.00000000000000e+00 13596 13596 1.00000000000000e+00 13597 13597 1.00000000000000e+00 13598 13598 1.00000000000000e+00 13599 13599 1.00000000000000e+00 13600 13600 1.00000000000000e+00 13601 13601 1.00000000000000e+00 13602 13602 1.00000000000000e+00 13603 13603 1.00000000000000e+00 13604 13604 1.00000000000000e+00 13605 13605 1.00000000000000e+00 13606 13606 1.00000000000000e+00 13607 13607 1.00000000000000e+00 13608 13608 1.00000000000000e+00 13609 13609 1.00000000000000e+00 13610 13610 1.00000000000000e+00 13611 13611 1.00000000000000e+00 13612 13612 1.00000000000000e+00 13613 13613 1.00000000000000e+00 13614 13614 1.00000000000000e+00 13615 13615 1.00000000000000e+00 13616 13616 1.00000000000000e+00 13617 13617 1.00000000000000e+00 13618 13618 1.00000000000000e+00 13619 13619 1.00000000000000e+00 13620 13620 1.00000000000000e+00 13621 13621 1.00000000000000e+00 13622 13622 1.00000000000000e+00 13623 13623 1.00000000000000e+00 13624 13624 1.00000000000000e+00 13625 13625 1.00000000000000e+00 13626 13626 1.00000000000000e+00 13627 13627 1.00000000000000e+00 13628 13628 1.00000000000000e+00 13629 13629 1.00000000000000e+00 13630 13630 1.00000000000000e+00 13631 13631 1.00000000000000e+00 13632 13632 1.00000000000000e+00 13633 13633 1.00000000000000e+00 13634 13634 1.00000000000000e+00 13635 13635 1.00000000000000e+00 13636 13636 1.00000000000000e+00 13637 13637 1.00000000000000e+00 13638 13638 1.00000000000000e+00 13639 13639 1.00000000000000e+00 13640 13640 1.00000000000000e+00 13641 13641 1.00000000000000e+00 13642 13642 1.00000000000000e+00 13643 13643 1.00000000000000e+00 13644 13644 1.00000000000000e+00 13645 13645 1.00000000000000e+00 13646 13646 1.00000000000000e+00 13647 13647 1.00000000000000e+00 13648 13648 1.00000000000000e+00 13649 13649 1.00000000000000e+00 13650 13650 1.00000000000000e+00 13651 13651 1.00000000000000e+00 13652 13652 1.00000000000000e+00 13653 13653 1.00000000000000e+00 13654 13654 1.00000000000000e+00 13655 13655 1.00000000000000e+00 13656 13656 1.00000000000000e+00 13657 13657 1.00000000000000e+00 13658 13658 1.00000000000000e+00 13659 13659 1.00000000000000e+00 13660 13660 1.00000000000000e+00 13661 13661 1.00000000000000e+00 13662 13662 1.00000000000000e+00 13663 13663 1.00000000000000e+00 13664 13664 1.00000000000000e+00 13665 13665 1.00000000000000e+00 13666 13666 1.00000000000000e+00 13667 13667 1.00000000000000e+00 13668 13668 1.00000000000000e+00 13669 13669 1.00000000000000e+00 13670 13670 1.00000000000000e+00 13671 13671 1.00000000000000e+00 13672 13672 1.00000000000000e+00 13673 13673 1.00000000000000e+00 13674 13674 1.00000000000000e+00 13675 13675 1.00000000000000e+00 13676 13676 1.00000000000000e+00 13677 13677 1.00000000000000e+00 13678 13678 1.00000000000000e+00 13679 13679 1.00000000000000e+00 13680 13680 1.00000000000000e+00 13681 13681 1.00000000000000e+00 13682 13682 1.00000000000000e+00 13683 13683 1.00000000000000e+00 13684 13684 1.00000000000000e+00 13685 13685 1.00000000000000e+00 13686 13686 1.00000000000000e+00 13687 13687 1.00000000000000e+00 13688 13688 1.00000000000000e+00 13689 13689 1.00000000000000e+00 13690 13690 1.00000000000000e+00 13691 13691 1.00000000000000e+00 13692 13692 1.00000000000000e+00 13693 13693 1.00000000000000e+00 13694 13694 1.00000000000000e+00 13695 13695 1.00000000000000e+00 13696 13696 1.00000000000000e+00 13697 13697 1.00000000000000e+00 13698 13698 1.00000000000000e+00 13699 13699 1.00000000000000e+00 13700 13700 1.00000000000000e+00 13701 13701 1.00000000000000e+00 13702 13702 1.00000000000000e+00 13703 13703 1.00000000000000e+00 13704 13704 1.00000000000000e+00 13705 13705 1.00000000000000e+00 13706 13706 1.00000000000000e+00 13707 13707 1.00000000000000e+00 13708 13708 1.00000000000000e+00 13709 13709 1.00000000000000e+00 13710 13710 1.00000000000000e+00 13711 13711 1.00000000000000e+00 13712 13712 1.00000000000000e+00 13713 13713 1.00000000000000e+00 13714 13714 1.00000000000000e+00 13715 13715 1.00000000000000e+00 13716 13716 1.00000000000000e+00 13717 13717 1.00000000000000e+00 13718 13718 1.00000000000000e+00 13719 13719 1.00000000000000e+00 13720 13720 1.00000000000000e+00 13721 13721 1.00000000000000e+00 13722 13722 1.00000000000000e+00 13723 13723 1.00000000000000e+00 13724 13724 1.00000000000000e+00 13725 13725 1.00000000000000e+00 13726 13726 1.00000000000000e+00 13727 13727 1.00000000000000e+00 13728 13728 1.00000000000000e+00 13729 13729 1.00000000000000e+00 13730 13730 1.00000000000000e+00 13731 13731 1.00000000000000e+00 13732 13732 1.00000000000000e+00 13733 13733 1.00000000000000e+00 13734 13734 1.00000000000000e+00 13735 13735 1.00000000000000e+00 13736 13736 1.00000000000000e+00 13737 13737 1.00000000000000e+00 13738 13738 1.00000000000000e+00 13739 13739 1.00000000000000e+00 13740 13740 1.00000000000000e+00 13741 13741 1.00000000000000e+00 13742 13742 1.00000000000000e+00 13743 13743 1.00000000000000e+00 13744 13744 1.00000000000000e+00 13745 13745 1.00000000000000e+00 13746 13746 1.00000000000000e+00 13747 13747 1.00000000000000e+00 13748 13748 1.00000000000000e+00 13749 13749 1.00000000000000e+00 13750 13750 1.00000000000000e+00 13751 13751 1.00000000000000e+00 13752 13752 1.00000000000000e+00 13753 13753 1.00000000000000e+00 13754 13754 1.00000000000000e+00 13755 13755 1.00000000000000e+00 13756 13756 1.00000000000000e+00 13757 13757 1.00000000000000e+00 13758 13758 1.00000000000000e+00 13759 13759 1.00000000000000e+00 13760 13760 1.00000000000000e+00 13761 13761 1.00000000000000e+00 13762 13762 1.00000000000000e+00 13763 13763 1.00000000000000e+00 13764 13764 1.00000000000000e+00 13765 13765 1.00000000000000e+00 13766 13766 1.00000000000000e+00 13767 13767 1.00000000000000e+00 13768 13768 1.00000000000000e+00 13769 13769 1.00000000000000e+00 13770 13770 1.00000000000000e+00 13771 13771 1.00000000000000e+00 13772 13772 1.00000000000000e+00 13773 13773 1.00000000000000e+00 13774 13774 1.00000000000000e+00 13775 13775 1.00000000000000e+00 13776 13776 1.00000000000000e+00 13777 13777 1.00000000000000e+00 13778 13778 1.00000000000000e+00 13779 13779 1.00000000000000e+00 13780 13780 1.00000000000000e+00 13781 13781 1.00000000000000e+00 13782 13782 1.00000000000000e+00 13783 13783 1.00000000000000e+00 13784 13784 1.00000000000000e+00 13785 13785 1.00000000000000e+00 13786 13786 1.00000000000000e+00 13787 13787 1.00000000000000e+00 13788 13788 1.00000000000000e+00 13789 13789 1.00000000000000e+00 13790 13790 1.00000000000000e+00 13791 13791 1.00000000000000e+00 13792 13792 1.00000000000000e+00 13793 13793 1.00000000000000e+00 13794 13794 1.00000000000000e+00 13795 13795 1.00000000000000e+00 13796 13796 1.00000000000000e+00 13797 13797 1.00000000000000e+00 13798 13798 1.00000000000000e+00 13799 13799 1.00000000000000e+00 13800 13800 1.00000000000000e+00 13801 13801 1.00000000000000e+00 13802 13802 1.00000000000000e+00 13803 13803 1.00000000000000e+00 13804 13804 1.00000000000000e+00 13805 13805 1.00000000000000e+00 13806 13806 1.00000000000000e+00 13807 13807 1.00000000000000e+00 13808 13808 1.00000000000000e+00 13809 13809 1.00000000000000e+00 13810 13810 1.00000000000000e+00 13811 13811 1.00000000000000e+00 13812 13812 1.00000000000000e+00 13813 13813 1.00000000000000e+00 13814 13814 1.00000000000000e+00 13815 13815 1.00000000000000e+00 13816 13816 1.00000000000000e+00 13817 13817 1.00000000000000e+00 13818 13818 1.00000000000000e+00 13819 13819 1.00000000000000e+00 13820 13820 1.00000000000000e+00 13821 13821 1.00000000000000e+00 13822 13822 1.00000000000000e+00 13823 13823 1.00000000000000e+00 13824 13824 1.00000000000000e+00 13825 13825 1.00000000000000e+00 13826 13826 1.00000000000000e+00 13827 13827 1.00000000000000e+00 13828 13828 1.00000000000000e+00 13829 13829 1.00000000000000e+00 13830 13830 1.00000000000000e+00 13831 13831 1.00000000000000e+00 13832 13832 1.00000000000000e+00 13833 13833 1.00000000000000e+00 13834 13834 1.00000000000000e+00 13835 13835 1.00000000000000e+00 13836 13836 1.00000000000000e+00 13837 13837 1.00000000000000e+00 13838 13838 1.00000000000000e+00 13839 13839 1.00000000000000e+00 13840 13840 1.00000000000000e+00 13841 13841 1.00000000000000e+00 13842 13842 1.00000000000000e+00 13843 13843 1.00000000000000e+00 13844 13844 1.00000000000000e+00 13845 13845 1.00000000000000e+00 13846 13846 1.00000000000000e+00 13847 13847 1.00000000000000e+00 13848 13848 1.00000000000000e+00 13849 13849 1.00000000000000e+00 13850 13850 1.00000000000000e+00 13851 13851 1.00000000000000e+00 13852 13852 1.00000000000000e+00 13853 13853 1.00000000000000e+00 13854 13854 1.00000000000000e+00 13855 13855 1.00000000000000e+00 13856 13856 1.00000000000000e+00 13857 13857 1.00000000000000e+00 13858 13858 1.00000000000000e+00 13859 13859 1.00000000000000e+00 13860 13860 1.00000000000000e+00 13861 13861 1.00000000000000e+00 13862 13862 1.00000000000000e+00 13863 13863 1.00000000000000e+00 13864 13864 1.00000000000000e+00 13865 13865 1.00000000000000e+00 13866 13866 1.00000000000000e+00 13867 13867 1.00000000000000e+00 13868 13868 1.00000000000000e+00 13869 13869 1.00000000000000e+00 13870 13870 1.00000000000000e+00 13871 13871 1.00000000000000e+00 13872 13872 1.00000000000000e+00 13873 13873 1.00000000000000e+00 13874 13874 1.00000000000000e+00 13875 13875 1.00000000000000e+00 13876 13876 1.00000000000000e+00 13877 13877 1.00000000000000e+00 13878 13878 1.00000000000000e+00 13879 13879 1.00000000000000e+00 13880 13880 1.00000000000000e+00 13881 13881 1.00000000000000e+00 13882 13882 1.00000000000000e+00 13883 13883 1.00000000000000e+00 13884 13884 1.00000000000000e+00 13885 13885 1.00000000000000e+00 13886 13886 1.00000000000000e+00 13887 13887 1.00000000000000e+00 13888 13888 1.00000000000000e+00 13889 13889 1.00000000000000e+00 13890 13890 1.00000000000000e+00 13891 13891 1.00000000000000e+00 13892 13892 1.00000000000000e+00 13893 13893 1.00000000000000e+00 13894 13894 1.00000000000000e+00 13895 13895 1.00000000000000e+00 13896 13896 1.00000000000000e+00 13897 13897 1.00000000000000e+00 13898 13898 1.00000000000000e+00 13899 13899 1.00000000000000e+00 13900 13900 1.00000000000000e+00 13901 13901 1.00000000000000e+00 13902 13902 1.00000000000000e+00 13903 13903 1.00000000000000e+00 13904 13904 1.00000000000000e+00 13905 13905 1.00000000000000e+00 13906 13906 1.00000000000000e+00 13907 13907 1.00000000000000e+00 13908 13908 1.00000000000000e+00 13909 13909 1.00000000000000e+00 13910 13910 1.00000000000000e+00 13911 13911 1.00000000000000e+00 13912 13912 1.00000000000000e+00 13913 13913 1.00000000000000e+00 13914 13914 1.00000000000000e+00 13915 13915 1.00000000000000e+00 13916 13916 1.00000000000000e+00 13917 13917 1.00000000000000e+00 13918 13918 1.00000000000000e+00 13919 13919 1.00000000000000e+00 13920 13920 1.00000000000000e+00 13921 13921 1.00000000000000e+00 13922 13922 1.00000000000000e+00 13923 13923 1.00000000000000e+00 13924 13924 1.00000000000000e+00 13925 13925 1.00000000000000e+00 13926 13926 1.00000000000000e+00 13927 13927 1.00000000000000e+00 13928 13928 1.00000000000000e+00 13929 13929 1.00000000000000e+00 13930 13930 1.00000000000000e+00 13931 13931 1.00000000000000e+00 13932 13932 1.00000000000000e+00 13933 13933 1.00000000000000e+00 13934 13934 1.00000000000000e+00 13935 13935 1.00000000000000e+00 13936 13936 1.00000000000000e+00 13937 13937 1.00000000000000e+00 13938 13938 1.00000000000000e+00 13939 13939 1.00000000000000e+00 13940 13940 1.00000000000000e+00 13941 13941 1.00000000000000e+00 13942 13942 1.00000000000000e+00 13943 13943 1.00000000000000e+00 13944 13944 1.00000000000000e+00 13945 13945 1.00000000000000e+00 13946 13946 1.00000000000000e+00 13947 13947 1.00000000000000e+00 13948 13948 1.00000000000000e+00 13949 13949 1.00000000000000e+00 13950 13950 1.00000000000000e+00 13951 13951 1.00000000000000e+00 13952 13952 1.00000000000000e+00 13953 13953 1.00000000000000e+00 13954 13954 1.00000000000000e+00 13955 13955 1.00000000000000e+00 13956 13956 1.00000000000000e+00 13957 13957 1.00000000000000e+00 13958 13958 1.00000000000000e+00 13959 13959 1.00000000000000e+00 13960 13960 1.00000000000000e+00 13961 13961 1.00000000000000e+00 13962 13962 1.00000000000000e+00 13963 13963 1.00000000000000e+00 13964 13964 1.00000000000000e+00 13965 13965 1.00000000000000e+00 13966 13966 1.00000000000000e+00 13967 13967 1.00000000000000e+00 13968 13968 1.00000000000000e+00 13969 13969 1.00000000000000e+00 13970 13970 1.00000000000000e+00 13971 13971 1.00000000000000e+00 13972 13972 1.00000000000000e+00 13973 13973 1.00000000000000e+00 13974 13974 1.00000000000000e+00 13975 13975 1.00000000000000e+00 13976 13976 1.00000000000000e+00 13977 13977 1.00000000000000e+00 13978 13978 1.00000000000000e+00 13979 13979 1.00000000000000e+00 13980 13980 1.00000000000000e+00 13981 13981 1.00000000000000e+00 13982 13982 1.00000000000000e+00 13983 13983 1.00000000000000e+00 13984 13984 1.00000000000000e+00 13985 13985 1.00000000000000e+00 13986 13986 1.00000000000000e+00 13987 13987 1.00000000000000e+00 13988 13988 1.00000000000000e+00 13989 13989 1.00000000000000e+00 13990 13990 1.00000000000000e+00 13991 13991 1.00000000000000e+00 13992 13992 1.00000000000000e+00 13993 13993 1.00000000000000e+00 13994 13994 1.00000000000000e+00 13995 13995 1.00000000000000e+00 13996 13996 1.00000000000000e+00 13997 13997 1.00000000000000e+00 13998 13998 1.00000000000000e+00 13999 13999 1.00000000000000e+00 14000 14000 1.00000000000000e+00 14001 14001 1.00000000000000e+00 14002 14002 1.00000000000000e+00 14003 14003 1.00000000000000e+00 14004 14004 1.00000000000000e+00 14005 14005 1.00000000000000e+00 14006 14006 1.00000000000000e+00 14007 14007 1.00000000000000e+00 14008 14008 1.00000000000000e+00 14009 14009 1.00000000000000e+00 14010 14010 1.00000000000000e+00 14011 14011 1.00000000000000e+00 14012 14012 1.00000000000000e+00 14013 14013 1.00000000000000e+00 14014 14014 1.00000000000000e+00 14015 14015 1.00000000000000e+00 14016 14016 1.00000000000000e+00 14017 14017 1.00000000000000e+00 14018 14018 1.00000000000000e+00 14019 14019 1.00000000000000e+00 14020 14020 1.00000000000000e+00 14021 14021 1.00000000000000e+00 14022 14022 1.00000000000000e+00 14023 14023 1.00000000000000e+00 14024 14024 1.00000000000000e+00 14025 14025 1.00000000000000e+00 14026 14026 1.00000000000000e+00 14027 14027 1.00000000000000e+00 14028 14028 1.00000000000000e+00 14029 14029 1.00000000000000e+00 14030 14030 1.00000000000000e+00 14031 14031 1.00000000000000e+00 14032 14032 1.00000000000000e+00 14033 14033 1.00000000000000e+00 14034 14034 1.00000000000000e+00 14035 14035 1.00000000000000e+00 14036 14036 1.00000000000000e+00 14037 14037 1.00000000000000e+00 14038 14038 1.00000000000000e+00 14039 14039 1.00000000000000e+00 14040 14040 1.00000000000000e+00 14041 14041 1.00000000000000e+00 14042 14042 1.00000000000000e+00 14043 14043 1.00000000000000e+00 14044 14044 1.00000000000000e+00 14045 14045 1.00000000000000e+00 14046 14046 1.00000000000000e+00 14047 14047 1.00000000000000e+00 14048 14048 1.00000000000000e+00 14049 14049 1.00000000000000e+00 14050 14050 1.00000000000000e+00 14051 14051 1.00000000000000e+00 14052 14052 1.00000000000000e+00 14053 14053 1.00000000000000e+00 14054 14054 1.00000000000000e+00 14055 14055 1.00000000000000e+00 14056 14056 1.00000000000000e+00 14057 14057 1.00000000000000e+00 14058 14058 1.00000000000000e+00 14059 14059 1.00000000000000e+00 14060 14060 1.00000000000000e+00 14061 14061 1.00000000000000e+00 14062 14062 1.00000000000000e+00 14063 14063 1.00000000000000e+00 14064 14064 1.00000000000000e+00 14065 14065 1.00000000000000e+00 14066 14066 1.00000000000000e+00 14067 14067 1.00000000000000e+00 14068 14068 1.00000000000000e+00 14069 14069 1.00000000000000e+00 14070 14070 1.00000000000000e+00 14071 14071 1.00000000000000e+00 14072 14072 1.00000000000000e+00 14073 14073 1.00000000000000e+00 14074 14074 1.00000000000000e+00 14075 14075 1.00000000000000e+00 14076 14076 1.00000000000000e+00 14077 14077 1.00000000000000e+00 14078 14078 1.00000000000000e+00 14079 14079 1.00000000000000e+00 14080 14080 1.00000000000000e+00 14081 14081 1.00000000000000e+00 14082 14082 1.00000000000000e+00 14083 14083 1.00000000000000e+00 14084 14084 1.00000000000000e+00 14085 14085 1.00000000000000e+00 14086 14086 1.00000000000000e+00 14087 14087 1.00000000000000e+00 14088 14088 1.00000000000000e+00 14089 14089 1.00000000000000e+00 14090 14090 1.00000000000000e+00 14091 14091 1.00000000000000e+00 14092 14092 1.00000000000000e+00 14093 14093 1.00000000000000e+00 14094 14094 1.00000000000000e+00 14095 14095 1.00000000000000e+00 14096 14096 1.00000000000000e+00 14097 14097 1.00000000000000e+00 14098 14098 1.00000000000000e+00 14099 14099 1.00000000000000e+00 14100 14100 1.00000000000000e+00 14101 14101 1.00000000000000e+00 14102 14102 1.00000000000000e+00 14103 14103 1.00000000000000e+00 14104 14104 1.00000000000000e+00 14105 14105 1.00000000000000e+00 14106 14106 1.00000000000000e+00 14107 14107 1.00000000000000e+00 14108 14108 1.00000000000000e+00 14109 14109 1.00000000000000e+00 14110 14110 1.00000000000000e+00 14111 14111 1.00000000000000e+00 14112 14112 1.00000000000000e+00 14113 14113 1.00000000000000e+00 14114 14114 1.00000000000000e+00 14115 14115 1.00000000000000e+00 14116 14116 1.00000000000000e+00 14117 14117 1.00000000000000e+00 14118 14118 1.00000000000000e+00 14119 14119 1.00000000000000e+00 14120 14120 1.00000000000000e+00 14121 14121 1.00000000000000e+00 14122 14122 1.00000000000000e+00 14123 14123 1.00000000000000e+00 14124 14124 1.00000000000000e+00 14125 14125 1.00000000000000e+00 14126 14126 1.00000000000000e+00 14127 14127 1.00000000000000e+00 14128 14128 1.00000000000000e+00 14129 14129 1.00000000000000e+00 14130 14130 1.00000000000000e+00 14131 14131 1.00000000000000e+00 14132 14132 1.00000000000000e+00 14133 14133 1.00000000000000e+00 14134 14134 1.00000000000000e+00 14135 14135 1.00000000000000e+00 14136 14136 1.00000000000000e+00 14137 14137 1.00000000000000e+00 14138 14138 1.00000000000000e+00 14139 14139 1.00000000000000e+00 14140 14140 1.00000000000000e+00 14141 14141 1.00000000000000e+00 14142 14142 1.00000000000000e+00 14143 14143 1.00000000000000e+00 14144 14144 1.00000000000000e+00 14145 14145 1.00000000000000e+00 14146 14146 1.00000000000000e+00 14147 14147 1.00000000000000e+00 14148 14148 1.00000000000000e+00 14149 14149 1.00000000000000e+00 14150 14150 1.00000000000000e+00 14151 14151 1.00000000000000e+00 14152 14152 1.00000000000000e+00 14153 14153 1.00000000000000e+00 14154 14154 1.00000000000000e+00 14155 14155 1.00000000000000e+00 14156 14156 1.00000000000000e+00 14157 14157 1.00000000000000e+00 14158 14158 1.00000000000000e+00 14159 14159 1.00000000000000e+00 14160 14160 1.00000000000000e+00 14161 14161 1.00000000000000e+00 14162 14162 1.00000000000000e+00 14163 14163 1.00000000000000e+00 14164 14164 1.00000000000000e+00 14165 14165 1.00000000000000e+00 14166 14166 1.00000000000000e+00 14167 14167 1.00000000000000e+00 14168 14168 1.00000000000000e+00 14169 14169 1.00000000000000e+00 14170 14170 1.00000000000000e+00 14171 14171 1.00000000000000e+00 14172 14172 1.00000000000000e+00 14173 14173 1.00000000000000e+00 14174 14174 1.00000000000000e+00 14175 14175 1.00000000000000e+00 14176 14176 1.00000000000000e+00 14177 14177 1.00000000000000e+00 14178 14178 1.00000000000000e+00 14179 14179 1.00000000000000e+00 14180 14180 1.00000000000000e+00 14181 14181 1.00000000000000e+00 14182 14182 1.00000000000000e+00 14183 14183 1.00000000000000e+00 14184 14184 1.00000000000000e+00 14185 14185 1.00000000000000e+00 14186 14186 1.00000000000000e+00 14187 14187 1.00000000000000e+00 14188 14188 1.00000000000000e+00 14189 14189 1.00000000000000e+00 14190 14190 1.00000000000000e+00 14191 14191 1.00000000000000e+00 14192 14192 1.00000000000000e+00 14193 14193 1.00000000000000e+00 14194 14194 1.00000000000000e+00 14195 14195 1.00000000000000e+00 14196 14196 1.00000000000000e+00 14197 14197 1.00000000000000e+00 14198 14198 1.00000000000000e+00 14199 14199 1.00000000000000e+00 14200 14200 1.00000000000000e+00 14201 14201 1.00000000000000e+00 14202 14202 1.00000000000000e+00 14203 14203 1.00000000000000e+00 14204 14204 1.00000000000000e+00 14205 14205 1.00000000000000e+00 14206 14206 1.00000000000000e+00 14207 14207 1.00000000000000e+00 14208 14208 1.00000000000000e+00 14209 14209 1.00000000000000e+00 14210 14210 1.00000000000000e+00 14211 14211 1.00000000000000e+00 14212 14212 1.00000000000000e+00 14213 14213 1.00000000000000e+00 14214 14214 1.00000000000000e+00 14215 14215 1.00000000000000e+00 14216 14216 1.00000000000000e+00 14217 14217 1.00000000000000e+00 14218 14218 1.00000000000000e+00 14219 14219 1.00000000000000e+00 14220 14220 1.00000000000000e+00 14221 14221 1.00000000000000e+00 14222 14222 1.00000000000000e+00 14223 14223 1.00000000000000e+00 14224 14224 1.00000000000000e+00 14225 14225 1.00000000000000e+00 14226 14226 1.00000000000000e+00 14227 14227 1.00000000000000e+00 14228 14228 1.00000000000000e+00 14229 14229 1.00000000000000e+00 14230 14230 1.00000000000000e+00 14231 14231 1.00000000000000e+00 14232 14232 1.00000000000000e+00 14233 14233 1.00000000000000e+00 14234 14234 1.00000000000000e+00 14235 14235 1.00000000000000e+00 14236 14236 1.00000000000000e+00 14237 14237 1.00000000000000e+00 14238 14238 1.00000000000000e+00 14239 14239 1.00000000000000e+00 14240 14240 1.00000000000000e+00 14241 14241 1.00000000000000e+00 14242 14242 1.00000000000000e+00 14243 14243 1.00000000000000e+00 14244 14244 1.00000000000000e+00 14245 14245 1.00000000000000e+00 14246 14246 1.00000000000000e+00 14247 14247 1.00000000000000e+00 14248 14248 1.00000000000000e+00 14249 14249 1.00000000000000e+00 14250 14250 1.00000000000000e+00 14251 14251 1.00000000000000e+00 14252 14252 1.00000000000000e+00 14253 14253 1.00000000000000e+00 14254 14254 1.00000000000000e+00 14255 14255 1.00000000000000e+00 14256 14256 1.00000000000000e+00 14257 14257 1.00000000000000e+00 14258 14258 1.00000000000000e+00 14259 14259 1.00000000000000e+00 14260 14260 1.00000000000000e+00 14261 14261 1.00000000000000e+00 14262 14262 1.00000000000000e+00 14263 14263 1.00000000000000e+00 14264 14264 1.00000000000000e+00 14265 14265 1.00000000000000e+00 14266 14266 1.00000000000000e+00 14267 14267 1.00000000000000e+00 14268 14268 1.00000000000000e+00 14269 14269 1.00000000000000e+00 14270 14270 1.00000000000000e+00 14271 14271 1.00000000000000e+00 14272 14272 1.00000000000000e+00 14273 14273 1.00000000000000e+00 14274 14274 1.00000000000000e+00 14275 14275 1.00000000000000e+00 14276 14276 1.00000000000000e+00 14277 14277 1.00000000000000e+00 14278 14278 1.00000000000000e+00 14279 14279 1.00000000000000e+00 14280 14280 1.00000000000000e+00 14281 14281 1.00000000000000e+00 14282 14282 1.00000000000000e+00 14283 14283 1.00000000000000e+00 14284 14284 1.00000000000000e+00 14285 14285 1.00000000000000e+00 14286 14286 1.00000000000000e+00 14287 14287 1.00000000000000e+00 14288 14288 1.00000000000000e+00 14289 14289 1.00000000000000e+00 14290 14290 1.00000000000000e+00 14291 14291 1.00000000000000e+00 14292 14292 1.00000000000000e+00 14293 14293 1.00000000000000e+00 14294 14294 1.00000000000000e+00 14295 14295 1.00000000000000e+00 14296 14296 1.00000000000000e+00 14297 14297 1.00000000000000e+00 14298 14298 1.00000000000000e+00 14299 14299 1.00000000000000e+00 14300 14300 1.00000000000000e+00 14301 14301 1.00000000000000e+00 14302 14302 1.00000000000000e+00 14303 14303 1.00000000000000e+00 14304 14304 1.00000000000000e+00 14305 14305 1.00000000000000e+00 14306 14306 1.00000000000000e+00 14307 14307 1.00000000000000e+00 14308 14308 1.00000000000000e+00 14309 14309 1.00000000000000e+00 14310 14310 1.00000000000000e+00 14311 14311 1.00000000000000e+00 14312 14312 1.00000000000000e+00 14313 14313 1.00000000000000e+00 14314 14314 1.00000000000000e+00 14315 14315 1.00000000000000e+00 14316 14316 1.00000000000000e+00 14317 14317 1.00000000000000e+00 14318 14318 1.00000000000000e+00 14319 14319 1.00000000000000e+00 14320 14320 1.00000000000000e+00 14321 14321 1.00000000000000e+00 14322 14322 1.00000000000000e+00 14323 14323 1.00000000000000e+00 14324 14324 1.00000000000000e+00 14325 14325 1.00000000000000e+00 14326 14326 1.00000000000000e+00 14327 14327 1.00000000000000e+00 14328 14328 1.00000000000000e+00 14329 14329 1.00000000000000e+00 14330 14330 1.00000000000000e+00 14331 14331 1.00000000000000e+00 14332 14332 1.00000000000000e+00 14333 14333 1.00000000000000e+00 14334 14334 1.00000000000000e+00 14335 14335 1.00000000000000e+00 14336 14336 1.00000000000000e+00 14337 14337 1.00000000000000e+00 14338 14338 1.00000000000000e+00 14339 14339 1.00000000000000e+00 14340 14340 1.00000000000000e+00 14341 14341 1.00000000000000e+00 14342 14342 1.00000000000000e+00 14343 14343 1.00000000000000e+00 14344 14344 1.00000000000000e+00 14345 14345 1.00000000000000e+00 14346 14346 1.00000000000000e+00 14347 14347 1.00000000000000e+00 14348 14348 1.00000000000000e+00 14349 14349 1.00000000000000e+00 14350 14350 1.00000000000000e+00 14351 14351 1.00000000000000e+00 14352 14352 1.00000000000000e+00 14353 14353 1.00000000000000e+00 14354 14354 1.00000000000000e+00 14355 14355 1.00000000000000e+00 14356 14356 1.00000000000000e+00 14357 14357 1.00000000000000e+00 14358 14358 1.00000000000000e+00 14359 14359 1.00000000000000e+00 14360 14360 1.00000000000000e+00 14361 14361 1.00000000000000e+00 14362 14362 1.00000000000000e+00 14363 14363 1.00000000000000e+00 14364 14364 1.00000000000000e+00 14365 14365 1.00000000000000e+00 14366 14366 1.00000000000000e+00 14367 14367 1.00000000000000e+00 14368 14368 1.00000000000000e+00 14369 14369 1.00000000000000e+00 14370 14370 1.00000000000000e+00 14371 14371 1.00000000000000e+00 14372 14372 1.00000000000000e+00 14373 14373 1.00000000000000e+00 14374 14374 1.00000000000000e+00 14375 14375 1.00000000000000e+00 14376 14376 1.00000000000000e+00 14377 14377 1.00000000000000e+00 14378 14378 1.00000000000000e+00 14379 14379 1.00000000000000e+00 14380 14380 1.00000000000000e+00 14381 14381 1.00000000000000e+00 14382 14382 1.00000000000000e+00 14383 14383 1.00000000000000e+00 14384 14384 1.00000000000000e+00 14385 14385 1.00000000000000e+00 14386 14386 1.00000000000000e+00 14387 14387 1.00000000000000e+00 14388 14388 1.00000000000000e+00 14389 14389 1.00000000000000e+00 14390 14390 1.00000000000000e+00 14391 14391 1.00000000000000e+00 14392 14392 1.00000000000000e+00 14393 14393 1.00000000000000e+00 14394 14394 1.00000000000000e+00 14395 14395 1.00000000000000e+00 14396 14396 1.00000000000000e+00 14397 14397 1.00000000000000e+00 14398 14398 1.00000000000000e+00 14399 14399 1.00000000000000e+00 14400 14400 1.00000000000000e+00 14401 14401 1.00000000000000e+00 14402 14402 1.00000000000000e+00 14403 14403 1.00000000000000e+00 14404 14404 1.00000000000000e+00 14405 14405 1.00000000000000e+00 14406 14406 1.00000000000000e+00 14407 14407 1.00000000000000e+00 14408 14408 1.00000000000000e+00 14409 14409 1.00000000000000e+00 14410 14410 1.00000000000000e+00 14411 14411 1.00000000000000e+00 14412 14412 1.00000000000000e+00 14413 14413 1.00000000000000e+00 14414 14414 1.00000000000000e+00 14415 14415 1.00000000000000e+00 14416 14416 1.00000000000000e+00 14417 14417 1.00000000000000e+00 14418 14418 1.00000000000000e+00 14419 14419 1.00000000000000e+00 14420 14420 1.00000000000000e+00 14421 14421 1.00000000000000e+00 14422 14422 1.00000000000000e+00 14423 14423 1.00000000000000e+00 14424 14424 1.00000000000000e+00 14425 14425 1.00000000000000e+00 14426 14426 1.00000000000000e+00 14427 14427 1.00000000000000e+00 14428 14428 1.00000000000000e+00 14429 14429 1.00000000000000e+00 14430 14430 1.00000000000000e+00 14431 14431 1.00000000000000e+00 14432 14432 1.00000000000000e+00 14433 14433 1.00000000000000e+00 14434 14434 1.00000000000000e+00 14435 14435 1.00000000000000e+00 14436 14436 1.00000000000000e+00 14437 14437 1.00000000000000e+00 14438 14438 1.00000000000000e+00 14439 14439 1.00000000000000e+00 14440 14440 1.00000000000000e+00 14441 14441 1.00000000000000e+00 14442 14442 1.00000000000000e+00 14443 14443 1.00000000000000e+00 14444 14444 1.00000000000000e+00 14445 14445 1.00000000000000e+00 14446 14446 1.00000000000000e+00 14447 14447 1.00000000000000e+00 14448 14448 1.00000000000000e+00 14449 14449 1.00000000000000e+00 14450 14450 1.00000000000000e+00 14451 14451 1.00000000000000e+00 14452 14452 1.00000000000000e+00 14453 14453 1.00000000000000e+00 14454 14454 1.00000000000000e+00 14455 14455 1.00000000000000e+00 14456 14456 1.00000000000000e+00 14457 14457 1.00000000000000e+00 14458 14458 1.00000000000000e+00 14459 14459 1.00000000000000e+00 14460 14460 1.00000000000000e+00 14461 14461 1.00000000000000e+00 14462 14462 1.00000000000000e+00 14463 14463 1.00000000000000e+00 14464 14464 1.00000000000000e+00 14465 14465 1.00000000000000e+00 14466 14466 1.00000000000000e+00 14467 14467 1.00000000000000e+00 14468 14468 1.00000000000000e+00 14469 14469 1.00000000000000e+00 14470 14470 1.00000000000000e+00 14471 14471 1.00000000000000e+00 14472 14472 1.00000000000000e+00 14473 14473 1.00000000000000e+00 14474 14474 1.00000000000000e+00 14475 14475 1.00000000000000e+00 14476 14476 1.00000000000000e+00 14477 14477 1.00000000000000e+00 14478 14478 1.00000000000000e+00 14479 14479 1.00000000000000e+00 14480 14480 1.00000000000000e+00 14481 14481 1.00000000000000e+00 14482 14482 1.00000000000000e+00 14483 14483 1.00000000000000e+00 14484 14484 1.00000000000000e+00 14485 14485 1.00000000000000e+00 14486 14486 1.00000000000000e+00 14487 14487 1.00000000000000e+00 14488 14488 1.00000000000000e+00 14489 14489 1.00000000000000e+00 14490 14490 1.00000000000000e+00 14491 14491 1.00000000000000e+00 14492 14492 1.00000000000000e+00 14493 14493 1.00000000000000e+00 14494 14494 1.00000000000000e+00 14495 14495 1.00000000000000e+00 14496 14496 1.00000000000000e+00 14497 14497 1.00000000000000e+00 14498 14498 1.00000000000000e+00 14499 14499 1.00000000000000e+00 14500 14500 1.00000000000000e+00 14501 14501 1.00000000000000e+00 14502 14502 1.00000000000000e+00 14503 14503 1.00000000000000e+00 14504 14504 1.00000000000000e+00 14505 14505 1.00000000000000e+00 14506 14506 1.00000000000000e+00 14507 14507 1.00000000000000e+00 14508 14508 1.00000000000000e+00 14509 14509 1.00000000000000e+00 14510 14510 1.00000000000000e+00 14511 14511 1.00000000000000e+00 14512 14512 1.00000000000000e+00 14513 14513 1.00000000000000e+00 14514 14514 1.00000000000000e+00 14515 14515 1.00000000000000e+00 14516 14516 1.00000000000000e+00 14517 14517 1.00000000000000e+00 14518 14518 1.00000000000000e+00 14519 14519 1.00000000000000e+00 14520 14520 1.00000000000000e+00 14521 14521 1.00000000000000e+00 14522 14522 1.00000000000000e+00 14523 14523 1.00000000000000e+00 14524 14524 1.00000000000000e+00 14525 14525 1.00000000000000e+00 14526 14526 1.00000000000000e+00 14527 14527 1.00000000000000e+00 14528 14528 1.00000000000000e+00 14529 14529 1.00000000000000e+00 14530 14530 1.00000000000000e+00 14531 14531 1.00000000000000e+00 14532 14532 1.00000000000000e+00 14533 14533 1.00000000000000e+00 14534 14534 1.00000000000000e+00 14535 14535 1.00000000000000e+00 14536 14536 1.00000000000000e+00 14537 14537 1.00000000000000e+00 14538 14538 1.00000000000000e+00 14539 14539 1.00000000000000e+00 14540 14540 1.00000000000000e+00 14541 14541 1.00000000000000e+00 14542 14542 1.00000000000000e+00 14543 14543 1.00000000000000e+00 14544 14544 1.00000000000000e+00 14545 14545 1.00000000000000e+00 14546 14546 1.00000000000000e+00 14547 14547 1.00000000000000e+00 14548 14548 1.00000000000000e+00 14549 14549 1.00000000000000e+00 14550 14550 1.00000000000000e+00 14551 14551 1.00000000000000e+00 14552 14552 1.00000000000000e+00 14553 14553 1.00000000000000e+00 14554 14554 1.00000000000000e+00 14555 14555 1.00000000000000e+00 14556 14556 1.00000000000000e+00 14557 14557 1.00000000000000e+00 14558 14558 1.00000000000000e+00 14559 14559 1.00000000000000e+00 14560 14560 1.00000000000000e+00 14561 14561 1.00000000000000e+00 14562 14562 1.00000000000000e+00 14563 14563 1.00000000000000e+00 14564 14564 1.00000000000000e+00 14565 14565 1.00000000000000e+00 14566 14566 1.00000000000000e+00 14567 14567 1.00000000000000e+00 14568 14568 1.00000000000000e+00 14569 14569 1.00000000000000e+00 14570 14570 1.00000000000000e+00 14571 14571 1.00000000000000e+00 14572 14572 1.00000000000000e+00 14573 14573 1.00000000000000e+00 14574 14574 1.00000000000000e+00 14575 14575 1.00000000000000e+00 14576 14576 1.00000000000000e+00 14577 14577 1.00000000000000e+00 14578 14578 1.00000000000000e+00 14579 14579 1.00000000000000e+00 14580 14580 1.00000000000000e+00 14581 14581 1.00000000000000e+00 14582 14582 1.00000000000000e+00 14583 14583 1.00000000000000e+00 14584 14584 1.00000000000000e+00 14585 14585 1.00000000000000e+00 14586 14586 1.00000000000000e+00 14587 14587 1.00000000000000e+00 14588 14588 1.00000000000000e+00 14589 14589 1.00000000000000e+00 14590 14590 1.00000000000000e+00 14591 14591 1.00000000000000e+00 14592 14592 1.00000000000000e+00 14593 14593 1.00000000000000e+00 14594 14594 1.00000000000000e+00 14595 14595 1.00000000000000e+00 14596 14596 1.00000000000000e+00 14597 14597 1.00000000000000e+00 14598 14598 1.00000000000000e+00 14599 14599 1.00000000000000e+00 14600 14600 1.00000000000000e+00 14601 14601 1.00000000000000e+00 14602 14602 1.00000000000000e+00 14603 14603 1.00000000000000e+00 14604 14604 1.00000000000000e+00 14605 14605 1.00000000000000e+00 14606 14606 1.00000000000000e+00 14607 14607 1.00000000000000e+00 14608 14608 1.00000000000000e+00 14609 14609 1.00000000000000e+00 14610 14610 1.00000000000000e+00 14611 14611 1.00000000000000e+00 14612 14612 1.00000000000000e+00 14613 14613 1.00000000000000e+00 14614 14614 1.00000000000000e+00 14615 14615 1.00000000000000e+00 14616 14616 1.00000000000000e+00 14617 14617 1.00000000000000e+00 14618 14618 1.00000000000000e+00 14619 14619 1.00000000000000e+00 14620 14620 1.00000000000000e+00 14621 14621 1.00000000000000e+00 14622 14622 1.00000000000000e+00 14623 14623 1.00000000000000e+00 14624 14624 1.00000000000000e+00 14625 14625 1.00000000000000e+00 14626 14626 1.00000000000000e+00 14627 14627 1.00000000000000e+00 14628 14628 1.00000000000000e+00 14629 14629 1.00000000000000e+00 14630 14630 1.00000000000000e+00 14631 14631 1.00000000000000e+00 14632 14632 1.00000000000000e+00 14633 14633 1.00000000000000e+00 14634 14634 1.00000000000000e+00 14635 14635 1.00000000000000e+00 14636 14636 1.00000000000000e+00 14637 14637 1.00000000000000e+00 14638 14638 1.00000000000000e+00 14639 14639 1.00000000000000e+00 14640 14640 1.00000000000000e+00 14641 14641 1.00000000000000e+00 14642 14642 1.00000000000000e+00 14643 14643 1.00000000000000e+00 14644 14644 1.00000000000000e+00 14645 14645 1.00000000000000e+00 14646 14646 1.00000000000000e+00 14647 14647 1.00000000000000e+00 14648 14648 1.00000000000000e+00 14649 14649 1.00000000000000e+00 14650 14650 1.00000000000000e+00 14651 14651 1.00000000000000e+00 14652 14652 1.00000000000000e+00 14653 14653 1.00000000000000e+00 14654 14654 1.00000000000000e+00 14655 14655 1.00000000000000e+00 14656 14656 1.00000000000000e+00 14657 14657 1.00000000000000e+00 14658 14658 1.00000000000000e+00 14659 14659 1.00000000000000e+00 14660 14660 1.00000000000000e+00 14661 14661 1.00000000000000e+00 14662 14662 1.00000000000000e+00 14663 14663 1.00000000000000e+00 14664 14664 1.00000000000000e+00 14665 14665 1.00000000000000e+00 14666 14666 1.00000000000000e+00 14667 14667 1.00000000000000e+00 14668 14668 1.00000000000000e+00 14669 14669 1.00000000000000e+00 14670 14670 1.00000000000000e+00 14671 14671 1.00000000000000e+00 14672 14672 1.00000000000000e+00 14673 14673 1.00000000000000e+00 14674 14674 1.00000000000000e+00 14675 14675 1.00000000000000e+00 14676 14676 1.00000000000000e+00 14677 14677 1.00000000000000e+00 14678 14678 1.00000000000000e+00 14679 14679 1.00000000000000e+00 14680 14680 1.00000000000000e+00 14681 14681 1.00000000000000e+00 14682 14682 1.00000000000000e+00 14683 14683 1.00000000000000e+00 14684 14684 1.00000000000000e+00 14685 14685 1.00000000000000e+00 14686 14686 1.00000000000000e+00 14687 14687 1.00000000000000e+00 14688 14688 1.00000000000000e+00 14689 14689 1.00000000000000e+00 14690 14690 1.00000000000000e+00 14691 14691 1.00000000000000e+00 14692 14692 1.00000000000000e+00 14693 14693 1.00000000000000e+00 14694 14694 1.00000000000000e+00 14695 14695 1.00000000000000e+00 14696 14696 1.00000000000000e+00 14697 14697 1.00000000000000e+00 14698 14698 1.00000000000000e+00 14699 14699 1.00000000000000e+00 14700 14700 1.00000000000000e+00 14701 14701 1.00000000000000e+00 14702 14702 1.00000000000000e+00 14703 14703 1.00000000000000e+00 14704 14704 1.00000000000000e+00 14705 14705 1.00000000000000e+00 14706 14706 1.00000000000000e+00 14707 14707 1.00000000000000e+00 14708 14708 1.00000000000000e+00 14709 14709 1.00000000000000e+00 14710 14710 1.00000000000000e+00 14711 14711 1.00000000000000e+00 14712 14712 1.00000000000000e+00 14713 14713 1.00000000000000e+00 14714 14714 1.00000000000000e+00 14715 14715 1.00000000000000e+00 14716 14716 1.00000000000000e+00 14717 14717 1.00000000000000e+00 14718 14718 1.00000000000000e+00 14719 14719 1.00000000000000e+00 14720 14720 1.00000000000000e+00 14721 14721 1.00000000000000e+00 14722 14722 1.00000000000000e+00 14723 14723 1.00000000000000e+00 14724 14724 1.00000000000000e+00 14725 14725 1.00000000000000e+00 14726 14726 1.00000000000000e+00 14727 14727 1.00000000000000e+00 14728 14728 1.00000000000000e+00 14729 14729 1.00000000000000e+00 14730 14730 1.00000000000000e+00 14731 14731 1.00000000000000e+00 14732 14732 1.00000000000000e+00 14733 14733 1.00000000000000e+00 14734 14734 1.00000000000000e+00 14735 14735 1.00000000000000e+00 14736 14736 1.00000000000000e+00 14737 14737 1.00000000000000e+00 14738 14738 1.00000000000000e+00 14739 14739 1.00000000000000e+00 14740 14740 1.00000000000000e+00 14741 14741 1.00000000000000e+00 14742 14742 1.00000000000000e+00 14743 14743 1.00000000000000e+00 14744 14744 1.00000000000000e+00 14745 14745 1.00000000000000e+00 14746 14746 1.00000000000000e+00 14747 14747 1.00000000000000e+00 14748 14748 1.00000000000000e+00 14749 14749 1.00000000000000e+00 14750 14750 1.00000000000000e+00 14751 14751 1.00000000000000e+00 14752 14752 1.00000000000000e+00 14753 14753 1.00000000000000e+00 14754 14754 1.00000000000000e+00 14755 14755 1.00000000000000e+00 14756 14756 1.00000000000000e+00 14757 14757 1.00000000000000e+00 14758 14758 1.00000000000000e+00 14759 14759 1.00000000000000e+00 14760 14760 1.00000000000000e+00 14761 14761 1.00000000000000e+00 14762 14762 1.00000000000000e+00 14763 14763 1.00000000000000e+00 14764 14764 1.00000000000000e+00 14765 14765 1.00000000000000e+00 14766 14766 1.00000000000000e+00 14767 14767 1.00000000000000e+00 14768 14768 1.00000000000000e+00 14769 14769 1.00000000000000e+00 14770 14770 1.00000000000000e+00 14771 14771 1.00000000000000e+00 14772 14772 1.00000000000000e+00 14773 14773 1.00000000000000e+00 14774 14774 1.00000000000000e+00 14775 14775 1.00000000000000e+00 14776 14776 1.00000000000000e+00 14777 14777 1.00000000000000e+00 14778 14778 1.00000000000000e+00 14779 14779 1.00000000000000e+00 14780 14780 1.00000000000000e+00 14781 14781 1.00000000000000e+00 14782 14782 1.00000000000000e+00 14783 14783 1.00000000000000e+00 14784 14784 1.00000000000000e+00 14785 14785 1.00000000000000e+00 14786 14786 1.00000000000000e+00 14787 14787 1.00000000000000e+00 14788 14788 1.00000000000000e+00 14789 14789 1.00000000000000e+00 14790 14790 1.00000000000000e+00 14791 14791 1.00000000000000e+00 14792 14792 1.00000000000000e+00 14793 14793 1.00000000000000e+00 14794 14794 1.00000000000000e+00 14795 14795 1.00000000000000e+00 14796 14796 1.00000000000000e+00 14797 14797 1.00000000000000e+00 14798 14798 1.00000000000000e+00 14799 14799 1.00000000000000e+00 14800 14800 1.00000000000000e+00 14801 14801 1.00000000000000e+00 14802 14802 1.00000000000000e+00 14803 14803 1.00000000000000e+00 14804 14804 1.00000000000000e+00 14805 14805 1.00000000000000e+00 14806 14806 1.00000000000000e+00 14807 14807 1.00000000000000e+00 14808 14808 1.00000000000000e+00 14809 14809 1.00000000000000e+00 14810 14810 1.00000000000000e+00 14811 14811 1.00000000000000e+00 14812 14812 1.00000000000000e+00 14813 14813 1.00000000000000e+00 14814 14814 1.00000000000000e+00 14815 14815 1.00000000000000e+00 14816 14816 1.00000000000000e+00 14817 14817 1.00000000000000e+00 14818 14818 1.00000000000000e+00 14819 14819 1.00000000000000e+00 14820 14820 1.00000000000000e+00 14821 14821 1.00000000000000e+00 14822 14822 1.00000000000000e+00 14823 14823 1.00000000000000e+00 14824 14824 1.00000000000000e+00 14825 14825 1.00000000000000e+00 14826 14826 1.00000000000000e+00 14827 14827 1.00000000000000e+00 14828 14828 1.00000000000000e+00 14829 14829 1.00000000000000e+00 14830 14830 1.00000000000000e+00 14831 14831 1.00000000000000e+00 14832 14832 1.00000000000000e+00 14833 14833 1.00000000000000e+00 14834 14834 1.00000000000000e+00 14835 14835 1.00000000000000e+00 14836 14836 1.00000000000000e+00 14837 14837 1.00000000000000e+00 14838 14838 1.00000000000000e+00 14839 14839 1.00000000000000e+00 14840 14840 1.00000000000000e+00 14841 14841 1.00000000000000e+00 14842 14842 1.00000000000000e+00 14843 14843 1.00000000000000e+00 14844 14844 1.00000000000000e+00 14845 14845 1.00000000000000e+00 14846 14846 1.00000000000000e+00 14847 14847 1.00000000000000e+00 14848 14848 1.00000000000000e+00 14849 14849 1.00000000000000e+00 14850 14850 1.00000000000000e+00 14851 14851 1.00000000000000e+00 14852 14852 1.00000000000000e+00 14853 14853 1.00000000000000e+00 14854 14854 1.00000000000000e+00 14855 14855 1.00000000000000e+00 14856 14856 1.00000000000000e+00 14857 14857 1.00000000000000e+00 14858 14858 1.00000000000000e+00 14859 14859 1.00000000000000e+00 14860 14860 1.00000000000000e+00 14861 14861 1.00000000000000e+00 14862 14862 1.00000000000000e+00 14863 14863 1.00000000000000e+00 14864 14864 1.00000000000000e+00 14865 14865 1.00000000000000e+00 14866 14866 1.00000000000000e+00 14867 14867 1.00000000000000e+00 14868 14868 1.00000000000000e+00 14869 14869 1.00000000000000e+00 14870 14870 1.00000000000000e+00 14871 14871 1.00000000000000e+00 14872 14872 1.00000000000000e+00 14873 14873 1.00000000000000e+00 14874 14874 1.00000000000000e+00 14875 14875 1.00000000000000e+00 14876 14876 1.00000000000000e+00 14877 14877 1.00000000000000e+00 14878 14878 1.00000000000000e+00 14879 14879 1.00000000000000e+00 14880 14880 1.00000000000000e+00 14881 14881 1.00000000000000e+00 14882 14882 1.00000000000000e+00 14883 14883 1.00000000000000e+00 14884 14884 1.00000000000000e+00 14885 14885 1.00000000000000e+00 14886 14886 1.00000000000000e+00 14887 14887 1.00000000000000e+00 14888 14888 1.00000000000000e+00 14889 14889 1.00000000000000e+00 14890 14890 1.00000000000000e+00 14891 14891 1.00000000000000e+00 14892 14892 1.00000000000000e+00 14893 14893 1.00000000000000e+00 14894 14894 1.00000000000000e+00 14895 14895 1.00000000000000e+00 14896 14896 1.00000000000000e+00 14897 14897 1.00000000000000e+00 14898 14898 1.00000000000000e+00 14899 14899 1.00000000000000e+00 14900 14900 1.00000000000000e+00 14901 14901 1.00000000000000e+00 14902 14902 1.00000000000000e+00 14903 14903 1.00000000000000e+00 14904 14904 1.00000000000000e+00 14905 14905 1.00000000000000e+00 14906 14906 1.00000000000000e+00 14907 14907 1.00000000000000e+00 14908 14908 1.00000000000000e+00 14909 14909 1.00000000000000e+00 14910 14910 1.00000000000000e+00 14911 14911 1.00000000000000e+00 14912 14912 1.00000000000000e+00 14913 14913 1.00000000000000e+00 14914 14914 1.00000000000000e+00 14915 14915 1.00000000000000e+00 14916 14916 1.00000000000000e+00 14917 14917 1.00000000000000e+00 14918 14918 1.00000000000000e+00 14919 14919 1.00000000000000e+00 14920 14920 1.00000000000000e+00 14921 14921 1.00000000000000e+00 14922 14922 1.00000000000000e+00 14923 14923 1.00000000000000e+00 14924 14924 1.00000000000000e+00 14925 14925 1.00000000000000e+00 14926 14926 1.00000000000000e+00 14927 14927 1.00000000000000e+00 14928 14928 1.00000000000000e+00 14929 14929 1.00000000000000e+00 14930 14930 1.00000000000000e+00 14931 14931 1.00000000000000e+00 14932 14932 1.00000000000000e+00 14933 14933 1.00000000000000e+00 14934 14934 1.00000000000000e+00 14935 14935 1.00000000000000e+00 14936 14936 1.00000000000000e+00 14937 14937 1.00000000000000e+00 14938 14938 1.00000000000000e+00 14939 14939 1.00000000000000e+00 14940 14940 1.00000000000000e+00 14941 14941 1.00000000000000e+00 14942 14942 1.00000000000000e+00 14943 14943 1.00000000000000e+00 14944 14944 1.00000000000000e+00 14945 14945 1.00000000000000e+00 14946 14946 1.00000000000000e+00 14947 14947 1.00000000000000e+00 14948 14948 1.00000000000000e+00 14949 14949 1.00000000000000e+00 14950 14950 1.00000000000000e+00 14951 14951 1.00000000000000e+00 14952 14952 1.00000000000000e+00 14953 14953 1.00000000000000e+00 14954 14954 1.00000000000000e+00 14955 14955 1.00000000000000e+00 14956 14956 1.00000000000000e+00 14957 14957 1.00000000000000e+00 14958 14958 1.00000000000000e+00 14959 14959 1.00000000000000e+00 14960 14960 1.00000000000000e+00 14961 14961 1.00000000000000e+00 14962 14962 1.00000000000000e+00 14963 14963 1.00000000000000e+00 14964 14964 1.00000000000000e+00 14965 14965 1.00000000000000e+00 14966 14966 1.00000000000000e+00 14967 14967 1.00000000000000e+00 14968 14968 1.00000000000000e+00 14969 14969 1.00000000000000e+00 14970 14970 1.00000000000000e+00 14971 14971 1.00000000000000e+00 14972 14972 1.00000000000000e+00 14973 14973 1.00000000000000e+00 14974 14974 1.00000000000000e+00 14975 14975 1.00000000000000e+00 14976 14976 1.00000000000000e+00 14977 14977 1.00000000000000e+00 14978 14978 1.00000000000000e+00 14979 14979 1.00000000000000e+00 14980 14980 1.00000000000000e+00 14981 14981 1.00000000000000e+00 14982 14982 1.00000000000000e+00 14983 14983 1.00000000000000e+00 14984 14984 1.00000000000000e+00 14985 14985 1.00000000000000e+00 14986 14986 1.00000000000000e+00 14987 14987 1.00000000000000e+00 14988 14988 1.00000000000000e+00 14989 14989 1.00000000000000e+00 14990 14990 1.00000000000000e+00 14991 14991 1.00000000000000e+00 14992 14992 1.00000000000000e+00 14993 14993 1.00000000000000e+00 14994 14994 1.00000000000000e+00 14995 14995 1.00000000000000e+00 14996 14996 1.00000000000000e+00 14997 14997 1.00000000000000e+00 14998 14998 1.00000000000000e+00 14999 14999 1.00000000000000e+00 15000 2037 -6.22474803362324e-02 15000 2061 -3.31168804452562e-01 15000 2085 -3.44015283048547e-03 15000 2637 -1.86912480621183e+00 15000 2661 -8.01986008310668e+00 15000 2685 -9.93950143461300e-01 15000 2709 -6.75149496405289e-05 15000 3237 -1.27202318270220e+00 15000 3261 -2.77159021881337e+00 15000 3285 -5.40869660850670e-01 15000 3309 -5.68909072862895e-05 15000 3837 -7.07189490284714e-03 15000 3861 -2.04644255858374e-02 15000 3885 -2.63702574884978e-03 15000 15000 4.75728965237749e+00 15000 15024 3.45137496366532e+00 15000 15048 4.49351467850451e-01 15000 15408 4.00158194817474e+00 15000 15432 2.97669063250814e+00 15000 15456 2.78828473834503e-01 15000 15816 6.06553463424571e-01 15000 15840 3.57429471621563e-01 15000 15864 1.54722114026508e-02 15001 15001 1.00000000000000e+00 15002 15002 1.00000000000000e+00 15003 15003 1.00000000000000e+00 15004 15004 1.00000000000000e+00 15005 15005 1.00000000000000e+00 15006 15006 1.00000000000000e+00 15007 15007 1.00000000000000e+00 15008 15008 1.00000000000000e+00 15009 15009 1.00000000000000e+00 15010 15010 1.00000000000000e+00 15011 15011 1.00000000000000e+00 15012 15012 1.00000000000000e+00 15013 15013 1.00000000000000e+00 15014 15014 1.00000000000000e+00 15015 15015 1.00000000000000e+00 15016 15016 1.00000000000000e+00 15017 15017 1.00000000000000e+00 15018 15018 1.00000000000000e+00 15019 15019 1.00000000000000e+00 15020 15020 1.00000000000000e+00 15021 15021 1.00000000000000e+00 15022 15022 1.00000000000000e+00 15023 15023 1.00000000000000e+00 15024 2037 -3.88419704019061e-02 15024 2061 -2.58559228758133e-01 15024 2085 -5.16422235334543e-03 15024 2637 -1.21722609796363e+00 15024 2661 -1.13506209985229e+01 15024 2685 -5.11769890541419e+00 15024 2709 -1.38468320828470e-01 15024 3237 -8.20147575343321e-01 15024 3261 -5.32072509956956e+00 15024 3285 -5.62748706111379e+00 15024 3309 -5.03800392544225e-01 15024 3837 -8.34695865135725e-03 15024 3861 -9.39954658147409e-02 15024 3885 -1.17498240106751e-01 15024 3909 -1.19215732302669e-02 15024 4461 -3.45535269833850e-07 15024 4485 -4.61831190340904e-06 15024 4509 -7.90465775745000e-09 15024 15024 9.75447987253463e+00 15024 15000 3.45137496366532e+00 15024 15048 4.74889323458441e+00 15024 15072 7.37871840795652e-01 15024 15408 2.97669063250813e+00 15024 15432 5.81606050191948e+00 15024 15456 2.81178010326741e+00 15024 15480 4.24116551982347e-01 15024 15816 3.57429471621563e-01 15024 15840 4.11091590186327e-01 15024 15864 1.24952424564341e-01 15024 15888 1.57658947384345e-02 15025 15025 1.00000000000000e+00 15026 15026 1.00000000000000e+00 15027 15027 1.00000000000000e+00 15028 15028 1.00000000000000e+00 15029 15029 1.00000000000000e+00 15030 15030 1.00000000000000e+00 15031 15031 1.00000000000000e+00 15032 15032 1.00000000000000e+00 15033 15033 1.00000000000000e+00 15034 15034 1.00000000000000e+00 15035 15035 1.00000000000000e+00 15036 15036 1.00000000000000e+00 15037 15037 1.00000000000000e+00 15038 15038 1.00000000000000e+00 15039 15039 1.00000000000000e+00 15040 15040 1.00000000000000e+00 15041 15041 1.00000000000000e+00 15042 15042 1.00000000000000e+00 15043 15043 1.00000000000000e+00 15044 15044 1.00000000000000e+00 15045 15045 1.00000000000000e+00 15046 15046 1.00000000000000e+00 15047 15047 1.00000000000000e+00 15048 2037 -2.20520863822570e-03 15048 2061 -2.65642361519578e-02 15048 2085 -9.84041696600769e-04 15048 2637 -8.07620712877337e-02 15048 2661 -3.59414605494425e+00 15048 2685 -7.82386178903436e+00 15048 2709 -6.58684771145473e-01 15048 2733 -4.78380215078030e-07 15048 3237 -5.34115908914601e-02 15048 3261 -3.43113164804828e+00 15048 3285 -1.60834728731331e+01 15048 3309 -3.99767481908073e+00 15048 3333 -3.24275802740584e-02 15048 3837 -1.65556807285418e-03 15048 3861 -1.57084032693361e-01 15048 3885 -7.56106341981153e-01 15048 3909 -4.83551374784487e-01 15048 3933 -9.65306573404754e-03 15048 4461 -3.90079655830210e-06 15048 4485 -2.16046850008645e-03 15048 4509 -1.73196606922709e-03 15048 15048 1.36913543179813e+01 15048 15000 4.49351467850451e-01 15048 15024 4.74889323458441e+00 15048 15072 4.69570095278423e+00 15048 15096 4.36053397400406e-01 15048 15408 2.78828473834503e-01 15048 15432 2.81178010326741e+00 15048 15456 7.35333930796889e+00 15048 15480 2.85105021759667e+00 15048 15504 2.88646002416820e-01 15048 15816 1.54722114026508e-02 15048 15840 1.24952424564341e-01 15048 15864 2.87903471136636e-01 15048 15888 1.43771354629872e-01 15048 15912 2.01769439190334e-02 15049 15049 1.00000000000000e+00 15050 15050 1.00000000000000e+00 15051 15051 1.00000000000000e+00 15052 15052 1.00000000000000e+00 15053 15053 1.00000000000000e+00 15054 15054 1.00000000000000e+00 15055 15055 1.00000000000000e+00 15056 15056 1.00000000000000e+00 15057 15057 1.00000000000000e+00 15058 15058 1.00000000000000e+00 15059 15059 1.00000000000000e+00 15060 15060 1.00000000000000e+00 15061 15061 1.00000000000000e+00 15062 15062 1.00000000000000e+00 15063 15063 1.00000000000000e+00 15064 15064 1.00000000000000e+00 15065 15065 1.00000000000000e+00 15066 15066 1.00000000000000e+00 15067 15067 1.00000000000000e+00 15068 15068 1.00000000000000e+00 15069 15069 1.00000000000000e+00 15070 15070 1.00000000000000e+00 15071 15071 1.00000000000000e+00 15072 2637 -2.73434565390910e-07 15072 2661 -4.03388434389487e-01 15072 2685 -2.29847746643466e+00 15072 2709 -5.65787260988341e-01 15072 2733 -2.54244484549938e-06 15072 3237 -2.15737240607034e-04 15072 3261 -6.50483221529800e-01 15072 3285 -9.31757742472425e+00 15072 3309 -1.13558941478981e+01 15072 3333 -1.19951607928587e+00 15072 3357 -2.68177621415981e-05 15072 3837 -7.56520811581506e-05 15072 3861 -6.09452274392239e-02 15072 3885 -1.51207846681762e+00 15072 3909 -3.96155814643469e+00 15072 3933 -1.18740850620940e+00 15072 3957 -3.95711006277197e-05 15072 4461 -1.04201598584569e-05 15072 4485 -1.29413237855623e-02 15072 4509 -4.16778281377553e-02 15072 4533 -6.82991249166330e-03 15072 15072 9.51025959481667e+00 15072 15024 7.37871840795652e-01 15072 15048 4.69570095278423e+00 15072 15096 4.92634717205970e+00 15072 15120 7.95533395614517e-01 15072 15432 4.24116551982347e-01 15072 15456 2.85105021759667e+00 15072 15480 5.50134950102235e+00 15072 15504 2.99017165115069e+00 15072 15528 4.58896910370851e-01 15072 15840 1.57658947384345e-02 15072 15864 1.43771354629872e-01 15072 15888 3.56062772461138e-01 15072 15912 1.50570875748810e-01 15072 15936 1.74657750181691e-02 15073 15073 1.00000000000000e+00 15074 15074 1.00000000000000e+00 15075 15075 1.00000000000000e+00 15076 15076 1.00000000000000e+00 15077 15077 1.00000000000000e+00 15078 15078 1.00000000000000e+00 15079 15079 1.00000000000000e+00 15080 15080 1.00000000000000e+00 15081 15081 1.00000000000000e+00 15082 15082 1.00000000000000e+00 15083 15083 1.00000000000000e+00 15084 15084 1.00000000000000e+00 15085 15085 1.00000000000000e+00 15086 15086 1.00000000000000e+00 15087 15087 1.00000000000000e+00 15088 15088 1.00000000000000e+00 15089 15089 1.00000000000000e+00 15090 15090 1.00000000000000e+00 15091 15091 1.00000000000000e+00 15092 15092 1.00000000000000e+00 15093 15093 1.00000000000000e+00 15094 15094 1.00000000000000e+00 15095 15095 1.00000000000000e+00 15096 2661 -1.07822922226173e-04 15096 2685 -1.49586861259650e-01 15096 2709 -1.22992818690726e-01 15096 2733 -2.99407615582715e-06 15096 3261 -7.88146601817142e-03 15096 3285 -1.94760161133873e+00 15096 3309 -1.38577901086792e+01 15096 3333 -5.00898442642425e+00 15096 3357 -3.79506224605989e-02 15096 3861 -6.72695047920763e-03 15096 3885 -7.35724208401014e-01 15096 3909 -9.81224485046643e+00 15096 3933 -7.28706157576636e+00 15096 3957 -3.24429347867767e-01 15096 4461 -2.51866616999200e-06 15096 4485 -1.97720813716512e-02 15096 4509 -1.98215657855372e-01 15096 4533 -2.12057904827481e-01 15096 4557 -2.06081244686773e-02 15096 5109 -2.08381299950430e-05 15096 5133 -1.19661164935190e-04 15096 5157 -2.93151783220590e-07 15096 15096 1.46474152274484e+01 15096 15048 4.36053397400406e-01 15096 15072 4.92634717205970e+00 15096 15120 5.11344358332090e+00 15096 15144 4.82827500215708e-01 15096 15456 2.88646002416820e-01 15096 15480 2.99017165115069e+00 15096 15504 7.92551584905643e+00 15096 15528 3.01366476430732e+00 15096 15552 2.94519280705977e-01 15096 15864 2.01769439190334e-02 15096 15888 1.50570875748810e-01 15096 15912 3.14802352952060e-01 15096 15936 1.30555135041960e-01 15096 15960 1.51730087423209e-02 15097 15097 1.00000000000000e+00 15098 15098 1.00000000000000e+00 15099 15099 1.00000000000000e+00 15100 15100 1.00000000000000e+00 15101 15101 1.00000000000000e+00 15102 15102 1.00000000000000e+00 15103 15103 1.00000000000000e+00 15104 15104 1.00000000000000e+00 15105 15105 1.00000000000000e+00 15106 15106 1.00000000000000e+00 15107 15107 1.00000000000000e+00 15108 15108 1.00000000000000e+00 15109 15109 1.00000000000000e+00 15110 15110 1.00000000000000e+00 15111 15111 1.00000000000000e+00 15112 15112 1.00000000000000e+00 15113 15113 1.00000000000000e+00 15114 15114 1.00000000000000e+00 15115 15115 1.00000000000000e+00 15116 15116 1.00000000000000e+00 15117 15117 1.00000000000000e+00 15118 15118 1.00000000000000e+00 15119 15119 1.00000000000000e+00 15120 2685 -7.59934449608780e-04 15120 2709 -4.29215165363144e-03 15120 2733 -6.28923985187280e-07 15120 3285 -1.34062314544309e-01 15120 3309 -3.71267255158997e+00 15120 3333 -3.93265630313742e+00 15120 3357 -1.85121313218595e-01 15120 3861 -1.62243194400000e-11 15120 3885 -1.03422884076186e-01 15120 3909 -4.42153745514157e+00 15120 3933 -1.36483898526966e+01 15120 3957 -3.50736818545126e+00 15120 3981 -2.72999557635276e-02 15120 4461 -2.67275633000000e-12 15120 4485 -4.98947752019860e-03 15120 4509 -2.75221263027286e-01 15120 4533 -1.33921351264528e+00 15120 4557 -9.31015863958383e-01 15120 4581 -1.60538004493400e-02 15120 5109 -1.55563455594227e-04 15120 5133 -8.19121310477230e-03 15120 5157 -4.92885197545324e-03 15120 5181 -1.64223745000000e-12 15120 15120 1.00814082330134e+01 15120 15072 7.95533395614517e-01 15120 15096 5.11344358332090e+00 15120 15144 4.17384933665307e+00 15120 15168 5.60634833947561e-01 15120 15480 4.58896910370851e-01 15120 15504 3.01366476430732e+00 15120 15528 5.52408794703334e+00 15120 15552 2.58960730429125e+00 15120 15576 3.52882545366833e-01 15120 15888 1.74657750181691e-02 15120 15912 1.30555135041960e-01 15120 15936 2.80966808721890e-01 15120 15960 1.43623610275630e-01 15120 15984 2.07328938265866e-02 15121 15121 1.00000000000000e+00 15122 15122 1.00000000000000e+00 15123 15123 1.00000000000000e+00 15124 15124 1.00000000000000e+00 15125 15125 1.00000000000000e+00 15126 15126 1.00000000000000e+00 15127 15127 1.00000000000000e+00 15128 15128 1.00000000000000e+00 15129 15129 1.00000000000000e+00 15130 15130 1.00000000000000e+00 15131 15131 1.00000000000000e+00 15132 15132 1.00000000000000e+00 15133 15133 1.00000000000000e+00 15134 15134 1.00000000000000e+00 15135 15135 1.00000000000000e+00 15136 15136 1.00000000000000e+00 15137 15137 1.00000000000000e+00 15138 15138 1.00000000000000e+00 15139 15139 1.00000000000000e+00 15140 15140 1.00000000000000e+00 15141 15141 1.00000000000000e+00 15142 15142 1.00000000000000e+00 15143 15143 1.00000000000000e+00 15144 3285 -6.63024342517000e-09 15144 3309 -1.98570423981024e-01 15144 3333 -9.91396379203770e-01 15144 3357 -1.72731756794418e-01 15144 3885 -2.42406379375074e-04 15144 3909 -5.86323053563013e-01 15144 3933 -9.88947253249652e+00 15144 3957 -1.14588221436155e+01 15144 3981 -8.31443655203386e-01 15144 4005 -3.07830518340566e-06 15144 4485 -1.55188264107734e-04 15144 4509 -9.96338200064898e-02 15144 4533 -2.69515405120276e+00 15144 4557 -6.32062101669729e+00 15144 4581 -1.42258422170924e+00 15144 4605 -8.52313646765143e-06 15144 5109 -3.09682943183139e-04 15144 5133 -3.89639863280265e-02 15144 5157 -7.96440172054075e-02 15144 5181 -1.68082945346771e-02 15144 5757 -1.23322260600600e-08 15144 5781 -4.41669362790000e-09 15144 15144 1.12567841678208e+01 15144 15096 4.82827500215708e-01 15144 15120 4.17384933665307e+00 15144 15168 5.45773663356666e+00 15144 15192 8.03799324444103e-01 15144 15504 2.94519280705977e-01 15144 15528 2.58960730429125e+00 15144 15552 6.39329861863230e+00 15144 15576 3.22216462969519e+00 15144 15600 4.52658612056962e-01 15144 15912 1.51730087423209e-02 15144 15936 1.43623610275630e-01 15144 15960 3.61401867063395e-01 15144 15984 1.40941803689101e-01 15144 16008 1.45025570956886e-02 15145 15145 1.00000000000000e+00 15146 15146 1.00000000000000e+00 15147 15147 1.00000000000000e+00 15148 15148 1.00000000000000e+00 15149 15149 1.00000000000000e+00 15150 15150 1.00000000000000e+00 15151 15151 1.00000000000000e+00 15152 15152 1.00000000000000e+00 15153 15153 1.00000000000000e+00 15154 15154 1.00000000000000e+00 15155 15155 1.00000000000000e+00 15156 15156 1.00000000000000e+00 15157 15157 1.00000000000000e+00 15158 15158 1.00000000000000e+00 15159 15159 1.00000000000000e+00 15160 15160 1.00000000000000e+00 15161 15161 1.00000000000000e+00 15162 15162 1.00000000000000e+00 15163 15163 1.00000000000000e+00 15164 15164 1.00000000000000e+00 15165 15165 1.00000000000000e+00 15166 15166 1.00000000000000e+00 15167 15167 1.00000000000000e+00 15168 3309 -4.16008843137181e-05 15168 3333 -7.35208925300189e-02 15168 3357 -3.37372744046849e-02 15168 3909 -8.66206699074866e-03 15168 3933 -2.26850405724519e+00 15168 3957 -1.14939187741039e+01 15168 3981 -3.21770864406451e+00 15168 4005 -7.64040556608113e-03 15168 4509 -1.05376172650655e-02 15168 4533 -1.14051294456304e+00 15168 4557 -1.30472690748129e+01 15168 4581 -7.85719513899029e+00 15168 4605 -2.41641731088433e-01 15168 5109 -7.22152185415608e-05 15168 5133 -4.00258339285647e-02 15168 5157 -3.54401329386659e-01 15168 5181 -4.08749207963312e-01 15168 5205 -3.72128208243907e-02 15168 5757 -2.76167595293297e-04 15168 5781 -9.39185922044201e-04 15168 5805 -3.26042166295244e-06 15168 15168 1.48273894024812e+01 15168 15120 5.60634833947561e-01 15168 15144 5.45773663356666e+00 15168 15192 4.83905880748850e+00 15168 15216 4.05965377428022e-01 15168 15528 3.52882545366833e-01 15168 15552 3.22216462969519e+00 15168 15576 7.86066781462639e+00 15168 15600 2.87162435362044e+00 15168 15624 2.65247476348146e-01 15168 15936 2.07328938265866e-02 15168 15960 1.40941803689101e-01 15168 15984 2.70563746681643e-01 15168 16008 1.29169985678908e-01 15168 16032 1.77899393240385e-02 15169 15169 1.00000000000000e+00 15170 15170 1.00000000000000e+00 15171 15171 1.00000000000000e+00 15172 15172 1.00000000000000e+00 15173 15173 1.00000000000000e+00 15174 15174 1.00000000000000e+00 15175 15175 1.00000000000000e+00 15176 15176 1.00000000000000e+00 15177 15177 1.00000000000000e+00 15178 15178 1.00000000000000e+00 15179 15179 1.00000000000000e+00 15180 15180 1.00000000000000e+00 15181 15181 1.00000000000000e+00 15182 15182 1.00000000000000e+00 15183 15183 1.00000000000000e+00 15184 15184 1.00000000000000e+00 15185 15185 1.00000000000000e+00 15186 15186 1.00000000000000e+00 15187 15187 1.00000000000000e+00 15188 15188 1.00000000000000e+00 15189 15189 1.00000000000000e+00 15190 15190 1.00000000000000e+00 15191 15191 1.00000000000000e+00 15192 3333 -1.40028719608417e-06 15192 3357 -4.04614909029325e-06 15192 3933 -1.24451148894912e-01 15192 3957 -2.73110193042548e+00 15192 3981 -1.95058358179339e+00 15192 4005 -3.62833187129932e-02 15192 4509 -2.84904636177000e-09 15192 4533 -1.37927352900205e-01 15192 4557 -5.21913909453381e+00 15192 4581 -1.31480554177428e+01 15192 4605 -3.34611990479090e+00 15192 4629 -2.25645047563801e-02 15192 5109 -1.07073187650000e-09 15192 5133 -9.34229118965537e-03 15192 5157 -5.13545222136790e-01 15192 5181 -2.47152522189266e+00 15192 5205 -1.71458500707122e+00 15192 5229 -2.35820716352033e-02 15192 5757 -1.52847645058492e-03 15192 5781 -2.24860482368024e-02 15192 5805 -1.03974540170886e-02 15192 5829 -1.63349069221820e-07 15192 15192 9.05430117290746e+00 15192 15144 8.03799324444103e-01 15192 15168 4.83905880748850e+00 15192 15216 4.64408474817213e+00 15192 15240 7.55055809615010e-01 15192 15552 4.52658612056962e-01 15192 15576 2.87162435362044e+00 15192 15600 5.14231724303767e+00 15192 15624 2.84378594303401e+00 15192 15648 4.45699009410354e-01 15192 15960 1.45025570956886e-02 15192 15984 1.29169985678908e-01 15192 16008 3.18619044738261e-01 15192 16032 1.49069591127981e-01 15192 16056 1.94774584579568e-02 15193 15193 1.00000000000000e+00 15194 15194 1.00000000000000e+00 15195 15195 1.00000000000000e+00 15196 15196 1.00000000000000e+00 15197 15197 1.00000000000000e+00 15198 15198 1.00000000000000e+00 15199 15199 1.00000000000000e+00 15200 15200 1.00000000000000e+00 15201 15201 1.00000000000000e+00 15202 15202 1.00000000000000e+00 15203 15203 1.00000000000000e+00 15204 15204 1.00000000000000e+00 15205 15205 1.00000000000000e+00 15206 15206 1.00000000000000e+00 15207 15207 1.00000000000000e+00 15208 15208 1.00000000000000e+00 15209 15209 1.00000000000000e+00 15210 15210 1.00000000000000e+00 15211 15211 1.00000000000000e+00 15212 15212 1.00000000000000e+00 15213 15213 1.00000000000000e+00 15214 15214 1.00000000000000e+00 15215 15215 1.00000000000000e+00 15216 3957 -1.09415256228251e-01 15216 3981 -3.91858603018195e-01 15216 4005 -3.06995764510265e-02 15216 4533 -3.08469849872086e-04 15216 4557 -6.14318709256894e-01 15216 4581 -1.11286651487524e+01 15216 4605 -1.10499459964701e+01 15216 4629 -4.22719899012749e-01 15216 4653 -4.50372466621900e-08 15216 5133 -3.37059951672553e-04 15216 5157 -1.68324535039272e-01 15216 5181 -4.85138247369466e+00 15216 5205 -9.15748002497584e+00 15216 5229 -1.26735440242569e+00 15216 5253 -3.09907564292870e-07 15216 5757 -1.97210171975275e-03 15216 5781 -8.98711480908158e-02 15216 5805 -1.55218139672086e-01 15216 5829 -3.85260548717763e-02 15216 6381 -9.93685121070000e-10 15216 6405 -1.25824412478921e-05 15216 6429 -2.87059089138055e-06 15216 15216 1.41192821628462e+01 15216 15168 4.05965377428022e-01 15216 15192 4.64408474817213e+00 15216 15240 5.54991856477212e+00 15216 15264 6.32423831578019e-01 15216 15576 2.65247476348146e-01 15216 15600 2.84378594303400e+00 15216 15624 7.76021858978305e+00 15216 15648 3.23794388911826e+00 15216 15672 3.63786962869211e-01 15216 15984 1.77899393240385e-02 15216 16008 1.49069591127981e-01 15216 16032 3.43022145245691e-01 15216 16056 1.32281316209200e-01 15216 16080 1.35928705943433e-02 15217 15217 1.00000000000000e+00 15218 15218 1.00000000000000e+00 15219 15219 1.00000000000000e+00 15220 15220 1.00000000000000e+00 15221 15221 1.00000000000000e+00 15222 15222 1.00000000000000e+00 15223 15223 1.00000000000000e+00 15224 15224 1.00000000000000e+00 15225 15225 1.00000000000000e+00 15226 15226 1.00000000000000e+00 15227 15227 1.00000000000000e+00 15228 15228 1.00000000000000e+00 15229 15229 1.00000000000000e+00 15230 15230 1.00000000000000e+00 15231 15231 1.00000000000000e+00 15232 15232 1.00000000000000e+00 15233 15233 1.00000000000000e+00 15234 15234 1.00000000000000e+00 15235 15235 1.00000000000000e+00 15236 15236 1.00000000000000e+00 15237 15237 1.00000000000000e+00 15238 15238 1.00000000000000e+00 15239 15239 1.00000000000000e+00 15240 3957 -8.84884528789628e-06 15240 3981 -2.26063108285778e-02 15240 4005 -5.76787102641976e-03 15240 4557 -9.58767802584515e-03 15240 4581 -2.49861912557892e+00 15240 4605 -7.60221651864066e+00 15240 4629 -1.47814744601903e+00 15240 4653 -5.26432474004669e-04 15240 5157 -1.46458338405460e-02 15240 5181 -1.71003083767369e+00 15240 5205 -1.36812044076589e+01 15240 5229 -7.25120728299911e+00 15240 5253 -2.06381545340391e-01 15240 5757 -4.24068021415259e-04 15240 5781 -7.54624655077920e-02 15240 5805 -6.68819689456894e-01 15240 5829 -8.02167487971888e-01 15240 5853 -6.91058902851688e-02 15240 6381 -5.96334235505000e-09 15240 6405 -1.83203537140749e-03 15240 6429 -4.12660314887467e-03 15240 6453 -1.96369108521831e-05 15240 15240 1.23161012279492e+01 15240 15192 7.55055809615010e-01 15240 15216 5.54991856477212e+00 15240 15264 4.29875177865576e+00 15240 15288 4.42264113085922e-01 15240 15600 4.45699009410354e-01 15240 15624 3.23794388911827e+00 15240 15648 6.56077331714627e+00 15240 15672 2.63307945879096e+00 15240 15696 2.94482901828528e-01 15240 16008 1.94774584579568e-02 15240 16032 1.32281316209200e-01 15240 16056 2.57920772334754e-01 15240 16080 1.38201019846592e-01 15240 16104 2.09573843673048e-02 15241 15241 1.00000000000000e+00 15242 15242 1.00000000000000e+00 15243 15243 1.00000000000000e+00 15244 15244 1.00000000000000e+00 15245 15245 1.00000000000000e+00 15246 15246 1.00000000000000e+00 15247 15247 1.00000000000000e+00 15248 15248 1.00000000000000e+00 15249 15249 1.00000000000000e+00 15250 15250 1.00000000000000e+00 15251 15251 1.00000000000000e+00 15252 15252 1.00000000000000e+00 15253 15253 1.00000000000000e+00 15254 15254 1.00000000000000e+00 15255 15255 1.00000000000000e+00 15256 15256 1.00000000000000e+00 15257 15257 1.00000000000000e+00 15258 15258 1.00000000000000e+00 15259 15259 1.00000000000000e+00 15260 15260 1.00000000000000e+00 15261 15261 1.00000000000000e+00 15262 15262 1.00000000000000e+00 15263 15263 1.00000000000000e+00 15264 4581 -8.48984408304521e-02 15264 4605 -1.54591739054225e+00 15264 4629 -8.37008468300386e-01 15264 4653 -2.27267444385338e-03 15264 5157 -2.82679919691200e-08 15264 5181 -1.56683939199441e-01 15264 5205 -5.61186521115557e+00 15264 5229 -1.34003793834153e+01 15264 5253 -2.84652083002152e+00 15264 5277 -1.42105665122836e-02 15264 5757 -1.92421531558400e-08 15264 5781 -1.67149292436572e-02 15264 5805 -9.47053835614488e-01 15264 5829 -4.33414068707053e+00 15264 5853 -2.55228025707651e+00 15264 5877 -2.65905112531985e-02 15264 6381 -8.94809260414000e-09 15264 6405 -8.36244219545068e-03 15264 6429 -5.14093378669885e-02 15264 6453 -2.05692093069998e-02 15264 6477 -7.22506791617711e-06 15264 15264 9.57031379276868e+00 15264 15216 6.32423831578019e-01 15264 15240 4.29875177865576e+00 15264 15288 5.21571305960734e+00 15264 15312 8.61664151815914e-01 15264 15624 3.63786962869211e-01 15264 15648 2.63307945879096e+00 15264 15672 5.56573923087694e+00 15264 15696 3.13883496231916e+00 15264 15720 4.90225838751259e-01 15264 16032 1.35928705943433e-02 15264 16056 1.38201019846592e-01 15264 16080 3.65880666997878e-01 15264 16104 1.51708123575850e-01 15264 16128 1.69696465266578e-02 15265 15265 1.00000000000000e+00 15266 15266 1.00000000000000e+00 15267 15267 1.00000000000000e+00 15268 15268 1.00000000000000e+00 15269 15269 1.00000000000000e+00 15270 15270 1.00000000000000e+00 15271 15271 1.00000000000000e+00 15272 15272 1.00000000000000e+00 15273 15273 1.00000000000000e+00 15274 15274 1.00000000000000e+00 15275 15275 1.00000000000000e+00 15276 15276 1.00000000000000e+00 15277 15277 1.00000000000000e+00 15278 15278 1.00000000000000e+00 15279 15279 1.00000000000000e+00 15280 15280 1.00000000000000e+00 15281 15281 1.00000000000000e+00 15282 15282 1.00000000000000e+00 15283 15283 1.00000000000000e+00 15284 15284 1.00000000000000e+00 15285 15285 1.00000000000000e+00 15286 15286 1.00000000000000e+00 15287 15287 1.00000000000000e+00 15288 4605 -6.40768823076013e-02 15288 4629 -1.32155033546541e-01 15288 4653 -1.19673275115656e-03 15288 5181 -3.57181806112216e-04 15288 5205 -7.26009893525010e-01 15288 5229 -1.09254701506263e+01 15288 5253 -8.88650814138446e+00 15288 5277 -1.70854902386417e-01 15288 5781 -6.75108151057794e-04 15288 5805 -2.77611194666467e-01 15288 5829 -7.62575536054912e+00 15288 5853 -1.16470936735665e+01 15288 5877 -9.84383496535977e-01 15288 6381 -1.98860187077000e-09 15288 6405 -6.67400920711649e-03 15288 6429 -1.70767136446982e-01 15288 6453 -3.00034719279318e-01 15288 6477 -7.14390121570572e-02 15288 7029 -4.23031447744470e-06 15288 7053 -2.44065315422981e-04 15288 7077 -3.47011381079177e-05 15288 15288 1.56934120813321e+01 15288 15240 4.42264113085922e-01 15288 15264 5.21571305960734e+00 15288 15312 5.30474276403004e+00 15288 15336 4.64521539191594e-01 15288 15648 2.94482901828528e-01 15288 15672 3.13883496231916e+00 15288 15696 8.42373780668300e+00 15288 15720 3.10346929434225e+00 15288 15744 2.85641484834302e-01 15288 16056 2.09573843673048e-02 15288 16080 1.51708123575850e-01 15288 16104 3.07723361719116e-01 15288 16128 1.28885117807780e-01 15288 16152 1.52516329252871e-02 15289 15289 1.00000000000000e+00 15290 15290 1.00000000000000e+00 15291 15291 1.00000000000000e+00 15292 15292 1.00000000000000e+00 15293 15293 1.00000000000000e+00 15294 15294 1.00000000000000e+00 15295 15295 1.00000000000000e+00 15296 15296 1.00000000000000e+00 15297 15297 1.00000000000000e+00 15298 15298 1.00000000000000e+00 15299 15299 1.00000000000000e+00 15300 15300 1.00000000000000e+00 15301 15301 1.00000000000000e+00 15302 15302 1.00000000000000e+00 15303 15303 1.00000000000000e+00 15304 15304 1.00000000000000e+00 15305 15305 1.00000000000000e+00 15306 15306 1.00000000000000e+00 15307 15307 1.00000000000000e+00 15308 15308 1.00000000000000e+00 15309 15309 1.00000000000000e+00 15310 15310 1.00000000000000e+00 15311 15311 1.00000000000000e+00 15312 4605 -3.45778598212080e-07 15312 4629 -1.60490305820053e-03 15312 4653 -1.67620106534635e-04 15312 5205 -9.96711146675240e-03 15312 5229 -2.28074346771652e+00 15312 5253 -4.44043579606696e+00 15312 5277 -5.14197856185756e-01 15312 5805 -1.84717084370417e-02 15312 5829 -2.36081159036057e+00 15312 5853 -1.31344205713101e+01 15312 5877 -6.70591694751850e+00 15312 5901 -2.11153262788658e-01 15312 6405 -1.22365447471564e-03 15312 6429 -1.43634132019868e-01 15312 6453 -1.28138291463894e+00 15312 6477 -1.63815643084329e+00 15312 6501 -1.34917509756817e-01 15312 7029 -2.19178452599109e-05 15312 7053 -8.02848167035954e-03 15312 7077 -1.25654930568490e-02 15312 7101 -8.02216756130956e-05 15312 15312 9.92442391352000e+00 15312 15264 8.61664151815914e-01 15312 15288 5.30474276403004e+00 15312 15336 4.37974669532067e+00 15312 15360 6.30415134638574e-01 15312 15672 4.90225838751259e-01 15312 15696 3.10346929434225e+00 15312 15720 5.45879703285381e+00 15312 15744 2.73579568635200e+00 15312 15768 3.98307436753696e-01 15312 16080 1.69696465266578e-02 15312 16104 1.28885117807780e-01 15312 16128 2.84738593169654e-01 15312 16152 1.55977811054759e-01 15312 16176 2.37428198384026e-02 15313 15313 1.00000000000000e+00 15314 15314 1.00000000000000e+00 15315 15315 1.00000000000000e+00 15316 15316 1.00000000000000e+00 15317 15317 1.00000000000000e+00 15318 15318 1.00000000000000e+00 15319 15319 1.00000000000000e+00 15320 15320 1.00000000000000e+00 15321 15321 1.00000000000000e+00 15322 15322 1.00000000000000e+00 15323 15323 1.00000000000000e+00 15324 15324 1.00000000000000e+00 15325 15325 1.00000000000000e+00 15326 15326 1.00000000000000e+00 15327 15327 1.00000000000000e+00 15328 15328 1.00000000000000e+00 15329 15329 1.00000000000000e+00 15330 15330 1.00000000000000e+00 15331 15331 1.00000000000000e+00 15332 15332 1.00000000000000e+00 15333 15333 1.00000000000000e+00 15334 15334 1.00000000000000e+00 15335 15335 1.00000000000000e+00 15336 5229 -4.88682978709450e-02 15336 5253 -7.35786296464280e-01 15336 5277 -2.89759613634650e-01 15336 5805 -1.33099563758210e-07 15336 5829 -1.65636733875931e-01 15336 5853 -6.32291240333016e+00 15336 5877 -1.47080981867767e+01 15336 5901 -1.81449700885244e+00 15336 5925 -4.53057394300022e-03 15336 6405 -1.54286544133720e-07 15336 6429 -3.17314047065672e-02 15336 6453 -1.79324213756294e+00 15336 6477 -7.14013593441152e+00 15336 6501 -2.47118942806333e+00 15336 6525 -1.70855648037468e-02 15336 7029 -2.42166638779730e-05 15336 7053 -3.10803560498744e-02 15336 7077 -1.11494712416164e-01 15336 7101 -4.22648233034794e-02 15336 7125 -4.97899102435202e-05 15336 7677 -2.12346769668840e-07 15336 7701 -2.27564163003280e-07 15336 15336 1.21577171568334e+01 15336 15288 4.64521539191594e-01 15336 15312 4.37974669532067e+00 15336 15360 4.94787439225266e+00 15336 15384 6.06553463424591e-01 15336 15696 2.85641484834302e-01 15336 15720 2.73579568635200e+00 15336 15744 7.01598994451505e+00 15336 15768 3.02294763350108e+00 15336 15792 3.57429471621572e-01 15336 16104 1.52516329252871e-02 15336 16128 1.55977811054759e-01 15336 16152 4.10608961742379e-01 15336 16176 1.56860124964212e-01 15336 16200 1.54722114026505e-02 15337 15337 1.00000000000000e+00 15338 15338 1.00000000000000e+00 15339 15339 1.00000000000000e+00 15340 15340 1.00000000000000e+00 15341 15341 1.00000000000000e+00 15342 15342 1.00000000000000e+00 15343 15343 1.00000000000000e+00 15344 15344 1.00000000000000e+00 15345 15345 1.00000000000000e+00 15346 15346 1.00000000000000e+00 15347 15347 1.00000000000000e+00 15348 15348 1.00000000000000e+00 15349 15349 1.00000000000000e+00 15350 15350 1.00000000000000e+00 15351 15351 1.00000000000000e+00 15352 15352 1.00000000000000e+00 15353 15353 1.00000000000000e+00 15354 15354 1.00000000000000e+00 15355 15355 1.00000000000000e+00 15356 15356 1.00000000000000e+00 15357 15357 1.00000000000000e+00 15358 15358 1.00000000000000e+00 15359 15359 1.00000000000000e+00 15360 5253 -3.49139124709050e-02 15360 5277 -4.39367443243418e-02 15360 5829 -3.39183723660182e-04 15360 5853 -9.88607456833720e-01 15360 5877 -7.86715197249487e+00 15360 5901 -4.54030951783693e+00 15360 5925 -4.69807489686183e-02 15360 6429 -1.21583139608410e-03 15360 6453 -4.70523537717537e-01 15360 6477 -8.54372163120876e+00 15360 6501 -1.09051654129365e+01 15360 6525 -2.25383879039402e-01 15360 7029 -4.99658735013208e-06 15360 7053 -1.75666651323257e-02 15360 7077 -4.98997919341120e-01 15360 7101 -6.43859071509885e-01 15360 7125 -1.89434110109514e-03 15360 7677 -2.91886673369874e-05 15360 7701 -3.45539493907780e-05 15360 15360 1.21229545966703e+01 15360 15312 6.30415134638574e-01 15360 15336 4.94787439225266e+00 15360 15384 4.00158194817489e+00 15360 15720 3.98307436753696e-01 15360 15744 3.02294763350108e+00 15360 15768 6.89066535570985e+00 15360 15792 2.97669063250825e+00 15360 16128 2.37428198384026e-02 15360 16152 1.56860124964212e-01 15360 16176 3.79768016392767e-01 15360 16200 2.78828473834515e-01 15361 15361 1.00000000000000e+00 15362 15362 1.00000000000000e+00 15363 15363 1.00000000000000e+00 15364 15364 1.00000000000000e+00 15365 15365 1.00000000000000e+00 15366 15366 1.00000000000000e+00 15367 15367 1.00000000000000e+00 15368 15368 1.00000000000000e+00 15369 15369 1.00000000000000e+00 15370 15370 1.00000000000000e+00 15371 15371 1.00000000000000e+00 15372 15372 1.00000000000000e+00 15373 15373 1.00000000000000e+00 15374 15374 1.00000000000000e+00 15375 15375 1.00000000000000e+00 15376 15376 1.00000000000000e+00 15377 15377 1.00000000000000e+00 15378 15378 1.00000000000000e+00 15379 15379 1.00000000000000e+00 15380 15380 1.00000000000000e+00 15381 15381 1.00000000000000e+00 15382 15382 1.00000000000000e+00 15383 15383 1.00000000000000e+00 15384 5853 -7.07189490284731e-03 15384 5877 -1.27202318270225e+00 15384 5901 -1.86912480621190e+00 15384 5925 -6.22474803362350e-02 15384 6453 -2.04644255858374e-02 15384 6477 -2.77159021881347e+00 15384 6501 -8.01986008310702e+00 15384 6525 -3.31168804452576e-01 15384 7053 -2.63702574884974e-03 15384 7077 -5.40869660850698e-01 15384 7101 -9.93950143461355e-01 15384 7125 -3.44015283048563e-03 15384 7677 -5.68909072862929e-05 15384 7701 -6.75149496405330e-05 15384 15384 4.75728965237765e+00 15384 15336 6.06553463424591e-01 15384 15360 4.00158194817489e+00 15384 15744 3.57429471621572e-01 15384 15768 2.97669063250825e+00 15384 15792 3.45137496366549e+00 15384 16152 1.54722114026505e-02 15384 16176 2.78828473834515e-01 15384 16200 4.49351467850477e-01 15385 15385 1.00000000000000e+00 15386 15386 1.00000000000000e+00 15387 15387 1.00000000000000e+00 15388 15388 1.00000000000000e+00 15389 15389 1.00000000000000e+00 15390 15390 1.00000000000000e+00 15391 15391 1.00000000000000e+00 15392 15392 1.00000000000000e+00 15393 15393 1.00000000000000e+00 15394 15394 1.00000000000000e+00 15395 15395 1.00000000000000e+00 15396 15396 1.00000000000000e+00 15397 15397 1.00000000000000e+00 15398 15398 1.00000000000000e+00 15399 15399 1.00000000000000e+00 15400 15400 1.00000000000000e+00 15401 15401 1.00000000000000e+00 15402 15402 1.00000000000000e+00 15403 15403 1.00000000000000e+00 15404 15404 1.00000000000000e+00 15405 15405 1.00000000000000e+00 15406 15406 1.00000000000000e+00 15407 15407 1.00000000000000e+00 15408 2037 -4.69807489686164e-02 15408 2061 -2.25383879039393e-01 15408 2085 -1.89434110109505e-03 15408 2637 -4.54030951783678e+00 15408 2661 -1.09051654129362e+01 15408 2685 -6.43859071509858e-01 15408 2709 -3.45539493907760e-05 15408 3213 -4.39367443243404e-02 15408 3237 -7.86715197249462e+00 15408 3261 -8.54372163120853e+00 15408 3285 -4.98997919341108e-01 15408 3309 -2.91886673369857e-05 15408 3813 -3.49139124709039e-02 15408 3837 -9.88607456833689e-01 15408 3861 -4.70523537717523e-01 15408 3885 -1.75666651323256e-02 15408 4437 -3.39183723660170e-04 15408 4461 -1.21583139608406e-03 15408 4485 -4.99658735013190e-06 15408 15408 1.21229545966699e+01 15408 15000 4.00158194817474e+00 15408 15024 2.97669063250813e+00 15408 15048 2.78828473834503e-01 15408 15432 6.89066535570966e+00 15408 15456 3.79768016392764e-01 15408 15816 4.94787439225250e+00 15408 15840 3.02294763350099e+00 15408 15864 1.56860124964210e-01 15408 16224 6.30415134638554e-01 15408 16248 3.98307436753683e-01 15408 16272 2.37428198384017e-02 15409 15409 1.00000000000000e+00 15410 15410 1.00000000000000e+00 15411 15411 1.00000000000000e+00 15412 15412 1.00000000000000e+00 15413 15413 1.00000000000000e+00 15414 15414 1.00000000000000e+00 15415 15415 1.00000000000000e+00 15416 15416 1.00000000000000e+00 15417 15417 1.00000000000000e+00 15418 15418 1.00000000000000e+00 15419 15419 1.00000000000000e+00 15420 15420 1.00000000000000e+00 15421 15421 1.00000000000000e+00 15422 15422 1.00000000000000e+00 15423 15423 1.00000000000000e+00 15424 15424 1.00000000000000e+00 15425 15425 1.00000000000000e+00 15426 15426 1.00000000000000e+00 15427 15427 1.00000000000000e+00 15428 15428 1.00000000000000e+00 15429 15429 1.00000000000000e+00 15430 15430 1.00000000000000e+00 15431 15431 1.00000000000000e+00 15432 2037 -2.76749461282608e-02 15432 2061 -1.61524079405966e-01 15432 2085 -2.70507787133988e-03 15432 2637 -2.63427490152780e+00 15432 2661 -1.07635608328280e+01 15432 2685 -3.05351420152938e+00 15432 2709 -7.30006766659667e-02 15432 3213 -2.32563123210227e-02 15432 3237 -5.11981516898454e+00 15432 3261 -1.13396010740793e+01 15432 3285 -4.72007968522738e+00 15432 3309 -2.98294215297016e-01 15432 3813 -1.88624550732972e-02 15432 3837 -9.48787970187838e-01 15432 3861 -1.79211733908759e+00 15432 3885 -6.38508544939129e-01 15432 3909 -1.53507695888664e-02 15432 4437 -1.97299421219378e-03 15432 4461 -3.39913024247126e-02 15432 4485 -1.65362016833932e-02 15432 4509 -1.26266347100430e-07 15432 15432 1.02261200668354e+01 15432 15000 2.97669063250814e+00 15432 15024 5.81606050191948e+00 15432 15048 2.81178010326741e+00 15432 15072 4.24116551982347e-01 15432 15408 6.89066535570966e+00 15432 15456 3.37521270349812e+00 15432 15480 4.64035159481754e-01 15432 15816 3.02294763350099e+00 15432 15840 3.89559657381322e+00 15432 15864 1.37976453011178e+00 15432 15888 1.88081007563730e-01 15432 16224 3.98307436753683e-01 15432 16248 5.62807553266964e-01 15432 16272 2.19988707963599e-01 15432 16296 3.12543571524980e-02 15433 15433 1.00000000000000e+00 15434 15434 1.00000000000000e+00 15435 15435 1.00000000000000e+00 15436 15436 1.00000000000000e+00 15437 15437 1.00000000000000e+00 15438 15438 1.00000000000000e+00 15439 15439 1.00000000000000e+00 15440 15440 1.00000000000000e+00 15441 15441 1.00000000000000e+00 15442 15442 1.00000000000000e+00 15443 15443 1.00000000000000e+00 15444 15444 1.00000000000000e+00 15445 15445 1.00000000000000e+00 15446 15446 1.00000000000000e+00 15447 15447 1.00000000000000e+00 15448 15448 1.00000000000000e+00 15449 15449 1.00000000000000e+00 15450 15450 1.00000000000000e+00 15451 15451 1.00000000000000e+00 15452 15452 1.00000000000000e+00 15453 15453 1.00000000000000e+00 15454 15454 1.00000000000000e+00 15455 15455 1.00000000000000e+00 15456 2037 -1.19559189827217e-03 15456 2061 -1.39520399675055e-02 15456 2085 -5.02259234512101e-04 15456 2637 -1.04039244321090e-01 15456 2661 -2.45302092463139e+00 15456 2685 -4.43068966198704e+00 15456 2709 -3.49593855422099e-01 15456 2733 -2.40186428761690e-07 15456 3213 -3.67982902529272e-04 15456 3237 -3.64114134599591e-01 15456 3261 -5.66071931761898e+00 15456 3285 -1.32830061635956e+01 15456 3309 -2.68385561620018e+00 15456 3333 -1.86238563130756e-02 15456 3813 -4.01571096527211e-04 15456 3837 -2.02228954966383e-01 15456 3861 -2.84276194806406e+00 15456 3885 -3.72278010225770e+00 15456 3909 -8.37895207133275e-01 15456 3933 -6.21525660309214e-03 15456 4437 -2.80648045101085e-03 15456 4461 -1.44954846645986e-01 15456 4485 -2.34219438433393e-01 15456 4509 -3.12514410067268e-02 15456 5061 -6.13896168510000e-10 15456 5085 -2.30368090416419e-05 15456 5109 -5.59793347357103e-06 15456 15456 9.25883673882528e+00 15456 15000 2.78828473834503e-01 15456 15024 2.81178010326741e+00 15456 15048 7.35333930796889e+00 15456 15072 2.85105021759667e+00 15456 15096 2.88646002416820e-01 15456 15408 3.79768016392764e-01 15456 15432 3.37521270349812e+00 15456 15480 3.67416532082412e+00 15456 15504 4.54506170724262e-01 15456 15816 1.56860124964210e-01 15456 15840 1.37976453011177e+00 15456 15864 3.35768784025763e+00 15456 15888 1.51845040734963e+00 15456 15912 1.91531594273673e-01 15456 16224 2.37428198384017e-02 15456 16248 2.19988707963599e-01 15456 16272 5.51518488927754e-01 15456 16296 2.35841247207531e-01 15456 16320 2.77059546493849e-02 15457 15457 1.00000000000000e+00 15458 15458 1.00000000000000e+00 15459 15459 1.00000000000000e+00 15460 15460 1.00000000000000e+00 15461 15461 1.00000000000000e+00 15462 15462 1.00000000000000e+00 15463 15463 1.00000000000000e+00 15464 15464 1.00000000000000e+00 15465 15465 1.00000000000000e+00 15466 15466 1.00000000000000e+00 15467 15467 1.00000000000000e+00 15468 15468 1.00000000000000e+00 15469 15469 1.00000000000000e+00 15470 15470 1.00000000000000e+00 15471 15471 1.00000000000000e+00 15472 15472 1.00000000000000e+00 15473 15473 1.00000000000000e+00 15474 15474 1.00000000000000e+00 15475 15475 1.00000000000000e+00 15476 15476 1.00000000000000e+00 15477 15477 1.00000000000000e+00 15478 15478 1.00000000000000e+00 15479 15479 1.00000000000000e+00 15480 2637 -1.32403957025801e-06 15480 2661 -2.52264035490318e-01 15480 2685 -1.30109975791990e+00 15480 2709 -3.07481855106385e-01 15480 2733 -1.27580809196147e-06 15480 3237 -6.78156064318102e-03 15480 3261 -1.10367230428952e+00 15480 3285 -9.03319033806758e+00 15480 3309 -8.06189223988929e+00 15480 3333 -6.70418245275486e-01 15480 3357 -1.35540959531497e-05 15480 3837 -1.94860308560969e-02 15480 3861 -1.10467050991717e+00 15480 3885 -6.68777816209319e+00 15480 3909 -5.66644235563035e+00 15480 3933 -8.34970990283421e-01 15480 3957 -2.00170805911734e-05 15480 4437 -6.16935639697721e-04 15480 4461 -1.38745469119399e-01 15480 4485 -8.76028072878760e-01 15480 4509 -5.39531734989152e-01 15480 4533 -3.21841845409029e-02 15480 5061 -3.15286122116000e-09 15480 5085 -2.05883233787824e-03 15480 5109 -4.76276778342306e-03 15480 5133 -2.56465629442625e-05 15480 15480 9.23470004433134e+00 15480 15024 4.24116551982347e-01 15480 15048 2.85105021759667e+00 15480 15072 5.50134950102235e+00 15480 15096 2.99017165115069e+00 15480 15120 4.58896910370851e-01 15480 15432 4.64035159481754e-01 15480 15456 3.67416532082412e+00 15480 15504 3.81228929594174e+00 15480 15528 4.98566153261159e-01 15480 15840 1.88081007563730e-01 15480 15864 1.51845040734963e+00 15480 15888 3.42083700730071e+00 15480 15912 1.43912834252727e+00 15480 15936 1.68250491358141e-01 15480 16248 3.12543571524980e-02 15480 16272 2.35841247207531e-01 15480 16296 4.99146479364022e-01 15480 16320 2.09211209883004e-01 15480 16344 2.45968478213660e-02 15481 15481 1.00000000000000e+00 15482 15482 1.00000000000000e+00 15483 15483 1.00000000000000e+00 15484 15484 1.00000000000000e+00 15485 15485 1.00000000000000e+00 15486 15486 1.00000000000000e+00 15487 15487 1.00000000000000e+00 15488 15488 1.00000000000000e+00 15489 15489 1.00000000000000e+00 15490 15490 1.00000000000000e+00 15491 15491 1.00000000000000e+00 15492 15492 1.00000000000000e+00 15493 15493 1.00000000000000e+00 15494 15494 1.00000000000000e+00 15495 15495 1.00000000000000e+00 15496 15496 1.00000000000000e+00 15497 15497 1.00000000000000e+00 15498 15498 1.00000000000000e+00 15499 15499 1.00000000000000e+00 15500 15500 1.00000000000000e+00 15501 15501 1.00000000000000e+00 15502 15502 1.00000000000000e+00 15503 15503 1.00000000000000e+00 15504 2661 -9.97392066839166e-05 15504 2685 -8.67773264820810e-02 15504 2709 -6.68357069655295e-02 15504 2733 -1.50043593642060e-06 15504 3261 -3.30507753107728e-02 15504 3285 -1.99097178969350e+00 15504 3309 -8.81234700362064e+00 15504 3333 -2.79768642905903e+00 15504 3357 -2.00238148159727e-02 15504 3837 -2.68148023391800e-08 15504 3861 -1.24457816678191e-01 15504 3885 -2.99889266328806e+00 15504 3909 -1.17788140657166e+01 15504 3933 -5.46128485173948e+00 15504 3957 -1.97918336106527e-01 15504 4437 -1.82286164144400e-08 15504 4461 -3.00750972078252e-02 15504 4485 -9.36190402441567e-01 15504 4509 -2.34143120142432e+00 15504 4533 -8.00085278224091e-01 15504 4557 -2.25678303861427e-02 15504 5061 -3.40300235706000e-09 15504 5085 -9.62297346308543e-03 15504 5109 -7.02222855708120e-02 15504 5133 -2.67245997549201e-02 15504 5157 -2.38387544049822e-06 15504 15504 9.81721687035758e+00 15504 15048 2.88646002416820e-01 15504 15072 2.99017165115069e+00 15504 15096 7.92551584905643e+00 15504 15120 3.01366476430732e+00 15504 15144 2.94519280705977e-01 15504 15456 4.54506170724262e-01 15504 15480 3.81228929594174e+00 15504 15528 3.53687360286299e+00 15504 15552 3.85652247454578e-01 15504 15864 1.91531594273673e-01 15504 15888 1.43912834252727e+00 15504 15912 3.04811342980965e+00 15504 15936 1.33129786065526e+00 15504 15960 1.64573973805670e-01 15504 16272 2.77059546493849e-02 15504 16296 2.09211209883004e-01 15504 16320 4.47226004500338e-01 15504 16344 2.02269330121850e-01 15504 16368 2.59704847090965e-02 15505 15505 1.00000000000000e+00 15506 15506 1.00000000000000e+00 15507 15507 1.00000000000000e+00 15508 15508 1.00000000000000e+00 15509 15509 1.00000000000000e+00 15510 15510 1.00000000000000e+00 15511 15511 1.00000000000000e+00 15512 15512 1.00000000000000e+00 15513 15513 1.00000000000000e+00 15514 15514 1.00000000000000e+00 15515 15515 1.00000000000000e+00 15516 15516 1.00000000000000e+00 15517 15517 1.00000000000000e+00 15518 15518 1.00000000000000e+00 15519 15519 1.00000000000000e+00 15520 15520 1.00000000000000e+00 15521 15521 1.00000000000000e+00 15522 15522 1.00000000000000e+00 15523 15523 1.00000000000000e+00 15524 15524 1.00000000000000e+00 15525 15525 1.00000000000000e+00 15526 15526 1.00000000000000e+00 15527 15527 1.00000000000000e+00 15528 2685 -3.88025594488405e-04 15528 2709 -2.18156224160910e-03 15528 2733 -3.15062376914730e-07 15528 3285 -1.16854240285122e-01 15528 3309 -2.29622406868491e+00 15528 3333 -2.21730298722634e+00 15528 3357 -9.76740571612998e-02 15528 3861 -3.77341038477285e-04 15528 3885 -4.08296859121539e-01 15528 3909 -5.85915587839815e+00 15528 3933 -1.11982184290233e+01 15528 3957 -2.26455304050106e+00 15528 3981 -1.51031657139677e-02 15528 4461 -7.12208246196801e-04 15528 4485 -2.68460388411363e-01 15528 4509 -3.15212942479744e+00 15528 4533 -4.42373616499343e+00 15528 4557 -1.14792032596769e+00 15528 4581 -9.46517302950758e-03 15528 5061 -6.97276547140000e-10 15528 5085 -8.89962435477855e-03 15528 5109 -2.52605295670644e-01 15528 5133 -3.59609790199509e-01 15528 5157 -5.10251812906409e-02 15528 5181 -6.23034231000000e-12 15528 5709 -5.82139999520657e-06 15528 5733 -3.92140677873932e-04 15528 5757 -5.95594804659699e-05 15528 15528 8.16173749686313e+00 15528 15072 4.58896910370851e-01 15528 15096 3.01366476430732e+00 15528 15120 5.52408794703334e+00 15528 15144 2.58960730429125e+00 15528 15168 3.52882545366833e-01 15528 15480 4.98566153261159e-01 15528 15504 3.53687360286299e+00 15528 15552 3.51355052713259e+00 15528 15576 4.92735384328558e-01 15528 15888 1.68250491358141e-01 15528 15912 1.33129786065526e+00 15528 15936 2.98850003984698e+00 15528 15960 1.40655976561495e+00 15528 15984 1.87065967598063e-01 15528 16296 2.45968478213660e-02 15528 16320 2.02269330121850e-01 15528 16344 4.66158201239839e-01 15528 16368 2.08016331128103e-01 15528 16392 2.60335980729292e-02 15529 15529 1.00000000000000e+00 15530 15530 1.00000000000000e+00 15531 15531 1.00000000000000e+00 15532 15532 1.00000000000000e+00 15533 15533 1.00000000000000e+00 15534 15534 1.00000000000000e+00 15535 15535 1.00000000000000e+00 15536 15536 1.00000000000000e+00 15537 15537 1.00000000000000e+00 15538 15538 1.00000000000000e+00 15539 15539 1.00000000000000e+00 15540 15540 1.00000000000000e+00 15541 15541 1.00000000000000e+00 15542 15542 1.00000000000000e+00 15543 15543 1.00000000000000e+00 15544 15544 1.00000000000000e+00 15545 15545 1.00000000000000e+00 15546 15546 1.00000000000000e+00 15547 15547 1.00000000000000e+00 15548 15548 1.00000000000000e+00 15549 15549 1.00000000000000e+00 15550 15550 1.00000000000000e+00 15551 15551 1.00000000000000e+00 15552 3285 -2.84816028581600e-08 15552 3309 -1.24352589445774e-01 15552 3333 -5.54951980889222e-01 15552 3357 -9.11000637037561e-02 15552 3885 -4.43604484561120e-03 15552 3909 -9.28686431603785e-01 15552 3933 -8.42168416152394e+00 15552 3957 -7.40748823356999e+00 15552 3981 -4.48334279241388e-01 15552 4005 -1.54782487178359e-06 15552 4485 -2.03872129237745e-02 15552 4509 -1.16968533203041e+00 15552 4533 -7.85669670876051e+00 15552 4557 -6.90326339321347e+00 15552 4581 -9.00313035298760e-01 15552 4605 -4.28709318978558e-06 15552 5085 -1.73381330431106e-03 15552 5109 -2.23748796928769e-01 15552 5133 -1.28251347224220e+00 15552 5157 -7.34540317333676e-01 15552 5181 -4.59803680636695e-02 15552 5709 -2.73146508523374e-05 15552 5733 -8.39152786425455e-03 15552 5757 -1.27081830126300e-02 15552 5781 -8.87003356679501e-05 15552 15552 9.72287790042688e+00 15552 15096 2.94519280705977e-01 15552 15120 2.58960730429125e+00 15552 15144 6.39329861863230e+00 15552 15168 3.22216462969519e+00 15552 15192 4.52658612056962e-01 15552 15504 3.85652247454578e-01 15552 15528 3.51355052713259e+00 15552 15576 3.78477955217484e+00 15552 15600 4.53459503715140e-01 15552 15912 1.64573973805670e-01 15552 15936 1.40655976561495e+00 15552 15960 3.31201727714557e+00 15552 15984 1.36581515747559e+00 15552 16008 1.54387821770829e-01 15552 16320 2.59704847090965e-02 15552 16344 2.08016331128103e-01 15552 16368 4.66602452222982e-01 15552 16392 2.00511985679792e-01 15552 16416 2.40943983470187e-02 15553 15553 1.00000000000000e+00 15554 15554 1.00000000000000e+00 15555 15555 1.00000000000000e+00 15556 15556 1.00000000000000e+00 15557 15557 1.00000000000000e+00 15558 15558 1.00000000000000e+00 15559 15559 1.00000000000000e+00 15560 15560 1.00000000000000e+00 15561 15561 1.00000000000000e+00 15562 15562 1.00000000000000e+00 15563 15563 1.00000000000000e+00 15564 15564 1.00000000000000e+00 15565 15565 1.00000000000000e+00 15566 15566 1.00000000000000e+00 15567 15567 1.00000000000000e+00 15568 15568 1.00000000000000e+00 15569 15569 1.00000000000000e+00 15570 15570 1.00000000000000e+00 15571 15571 1.00000000000000e+00 15572 15572 1.00000000000000e+00 15573 15573 1.00000000000000e+00 15574 15574 1.00000000000000e+00 15575 15575 1.00000000000000e+00 15576 3309 -2.89818847393746e-05 15576 3333 -3.98978040899699e-02 15576 3357 -1.77902210357923e-02 15576 3909 -2.67141945964824e-02 15576 3933 -1.88437508933349e+00 15576 3957 -6.80856023493019e+00 15576 3981 -1.73811843761455e+00 15576 4005 -4.00184406382046e-03 15576 4485 -1.33252547496470e-07 15576 4509 -1.30571047099530e-01 15576 4533 -3.15244129814918e+00 15576 4557 -1.24786044584956e+01 15576 4581 -5.50103384768730e+00 15576 4605 -1.51606456257916e-01 15576 5085 -1.54264278491780e-07 15576 5109 -4.73116659948546e-02 15576 5133 -1.25135147236016e+00 15576 5157 -3.00685097530556e+00 15576 5181 -1.13270057768641e+00 15576 5205 -3.65312941816130e-02 15576 5709 -2.19376034812510e-05 15576 5733 -3.18464976229817e-02 15576 5757 -1.45112262225359e-01 15576 5781 -4.82939482475493e-02 15576 5805 -1.90559154330361e-05 15576 6357 -2.87805904174350e-07 15576 6381 -3.20764573755020e-07 15576 15576 9.15595174166997e+00 15576 15120 3.52882545366833e-01 15576 15144 3.22216462969519e+00 15576 15168 7.86066781462639e+00 15576 15192 2.87162435362044e+00 15576 15216 2.65247476348146e-01 15576 15528 4.92735384328558e-01 15576 15552 3.78477955217484e+00 15576 15600 3.44529520645660e+00 15576 15624 4.07864297898998e-01 15576 15936 1.87065967598063e-01 15576 15960 1.36581515747558e+00 15576 15984 2.83315650998109e+00 15576 16008 1.32109286328214e+00 15576 16032 1.75885394049701e-01 15576 16344 2.60335980729292e-02 15576 16368 2.00511985679792e-01 15576 16392 4.37725380813616e-01 15576 16416 2.01103230141622e-01 15576 16440 2.61814091883868e-02 15577 15577 1.00000000000000e+00 15578 15578 1.00000000000000e+00 15579 15579 1.00000000000000e+00 15580 15580 1.00000000000000e+00 15581 15581 1.00000000000000e+00 15582 15582 1.00000000000000e+00 15583 15583 1.00000000000000e+00 15584 15584 1.00000000000000e+00 15585 15585 1.00000000000000e+00 15586 15586 1.00000000000000e+00 15587 15587 1.00000000000000e+00 15588 15588 1.00000000000000e+00 15589 15589 1.00000000000000e+00 15590 15590 1.00000000000000e+00 15591 15591 1.00000000000000e+00 15592 15592 1.00000000000000e+00 15593 15593 1.00000000000000e+00 15594 15594 1.00000000000000e+00 15595 15595 1.00000000000000e+00 15596 15596 1.00000000000000e+00 15597 15597 1.00000000000000e+00 15598 15598 1.00000000000000e+00 15599 15599 1.00000000000000e+00 15600 3333 -7.01874925208510e-07 15600 3357 -2.02792477156880e-06 15600 3933 -8.86963956974814e-02 15600 3957 -1.58757384800460e+00 15600 3981 -1.08493774795170e+00 15600 4005 -1.89372668443837e-02 15600 4509 -3.11177468058395e-04 15600 4533 -3.74380593890012e-01 15600 4557 -5.95229647679307e+00 15600 4581 -1.05430018435054e+01 15600 4605 -2.02506210321666e+00 15600 4629 -1.20141728929726e-02 15600 5109 -1.11687003265817e-03 15600 5133 -3.40415392059889e-01 15600 5157 -3.99618407387613e+00 15600 5181 -5.81223872309210e+00 15600 5205 -1.55811480797781e+00 15600 5229 -1.30329133732079e-02 15600 5709 -4.02905087151112e-06 15600 5733 -2.34736856990420e-02 15600 5757 -4.56776305238469e-01 15600 5781 -5.57018387595870e-01 15600 5805 -7.89606507668578e-02 15600 5829 -2.10202261173670e-07 15600 6357 -1.43395025777831e-04 15600 6381 -2.26300359808564e-03 15600 6405 -2.47411633771688e-04 15600 15600 8.49983496383112e+00 15600 15144 4.52658612056962e-01 15600 15168 2.87162435362044e+00 15600 15192 5.14231724303767e+00 15600 15216 2.84378594303400e+00 15600 15240 4.45699009410354e-01 15600 15552 4.53459503715140e-01 15600 15576 3.44529520645660e+00 15600 15624 3.71364396652326e+00 15600 15648 5.20546693731802e-01 15600 15960 1.54387821770829e-01 15600 15984 1.32109286328214e+00 15600 16008 3.14651504285886e+00 15600 16032 1.41538524136981e+00 15600 16056 1.77960916292746e-01 15600 16368 2.40943983470187e-02 15600 16392 2.01103230141622e-01 15600 16416 4.68009715976438e-01 15600 16440 2.04776719214466e-01 15600 16464 2.50127706152297e-02 15601 15601 1.00000000000000e+00 15602 15602 1.00000000000000e+00 15603 15603 1.00000000000000e+00 15604 15604 1.00000000000000e+00 15605 15605 1.00000000000000e+00 15606 15606 1.00000000000000e+00 15607 15607 1.00000000000000e+00 15608 15608 1.00000000000000e+00 15609 15609 1.00000000000000e+00 15610 15610 1.00000000000000e+00 15611 15611 1.00000000000000e+00 15612 15612 1.00000000000000e+00 15613 15613 1.00000000000000e+00 15614 15614 1.00000000000000e+00 15615 15615 1.00000000000000e+00 15616 15616 1.00000000000000e+00 15617 15617 1.00000000000000e+00 15618 15618 1.00000000000000e+00 15619 15619 1.00000000000000e+00 15620 15620 1.00000000000000e+00 15621 15621 1.00000000000000e+00 15622 15622 1.00000000000000e+00 15623 15623 1.00000000000000e+00 15624 3957 -6.76799247529334e-02 15624 3981 -2.18132430886976e-01 15624 4005 -1.58080846130477e-02 15624 4533 -3.41592650809739e-03 15624 4557 -9.00428623635621e-01 15624 4581 -8.15239410774465e+00 15624 4605 -6.55683928723499e+00 15624 4629 -2.25446163389853e-01 15624 4653 -2.25852715468000e-08 15624 5133 -2.42284408096525e-02 15624 5157 -1.35404939750064e+00 15624 5181 -9.17219547194405e+00 15624 5205 -8.15750338257099e+00 15624 5229 -7.88820640174525e-01 15624 5253 -1.55434573406250e-07 15624 5733 -4.16543717404546e-03 15624 5757 -3.51322853426498e-01 15624 5781 -1.82669002690145e+00 15624 5805 -1.01464558466502e+00 15624 5829 -6.90657784007971e-02 15624 6357 -6.29502914319969e-04 15624 6381 -2.75991069040432e-02 15624 6405 -2.92956316988240e-02 15624 6429 -2.63403151354002e-04 15624 15624 1.01339764526105e+01 15624 15168 2.65247476348146e-01 15624 15192 2.84378594303401e+00 15624 15216 7.76021858978305e+00 15624 15240 3.23794388911827e+00 15624 15264 3.63786962869211e-01 15624 15576 4.07864297898998e-01 15624 15600 3.71364396652326e+00 15624 15648 3.67164699493718e+00 15624 15672 3.97365055002481e-01 15624 15984 1.75885394049701e-01 15624 16008 1.41538524136981e+00 15624 16032 3.17831707809936e+00 15624 16056 1.33207175863362e+00 15624 16080 1.55057023365655e-01 15624 16392 2.61814091883868e-02 15624 16416 2.04776719214466e-01 15624 16440 4.51557124279133e-01 15624 16464 2.00736623449201e-01 15624 16488 2.51713852470706e-02 15625 15625 1.00000000000000e+00 15626 15626 1.00000000000000e+00 15627 15627 1.00000000000000e+00 15628 15628 1.00000000000000e+00 15629 15629 1.00000000000000e+00 15630 15630 1.00000000000000e+00 15631 15631 1.00000000000000e+00 15632 15632 1.00000000000000e+00 15633 15633 1.00000000000000e+00 15634 15634 1.00000000000000e+00 15635 15635 1.00000000000000e+00 15636 15636 1.00000000000000e+00 15637 15637 1.00000000000000e+00 15638 15638 1.00000000000000e+00 15639 15639 1.00000000000000e+00 15640 15640 1.00000000000000e+00 15641 15641 1.00000000000000e+00 15642 15642 1.00000000000000e+00 15643 15643 1.00000000000000e+00 15644 15644 1.00000000000000e+00 15645 15645 1.00000000000000e+00 15646 15646 1.00000000000000e+00 15647 15647 1.00000000000000e+00 15648 3957 -5.06717717815108e-06 15648 3981 -1.17009061321146e-02 15648 4005 -2.95310796217859e-03 15648 4557 -1.99678375256178e-02 15648 4581 -1.73985483446228e+00 15648 4605 -4.37787045752163e+00 15648 4629 -7.91085148021607e-01 15648 4653 -2.69315925168941e-04 15648 5133 -3.64761453425590e-07 15648 5157 -1.30866721526178e-01 15648 5181 -3.32914583511338e+00 15648 5205 -1.21491661808585e+01 15648 5229 -4.98769432682711e+00 15648 5253 -1.27735214090195e-01 15648 5733 -7.35209993245780e-07 15648 5757 -7.03796648728689e-02 15648 5781 -1.66495891798113e+00 15648 5805 -3.94528752716490e+00 15648 5829 -1.62540162070137e+00 15648 5853 -5.86754948615242e-02 15648 6357 -3.83203401246173e-04 15648 6381 -8.46843250636784e-02 15648 6405 -2.75908869197922e-01 15648 6429 -8.48036522135795e-02 15648 6453 -9.55235986069353e-05 15648 7005 -4.27068489809029e-05 15648 7029 -3.48101433441648e-05 15648 15648 8.34560968819237e+00 15648 15192 4.45699009410354e-01 15648 15216 3.23794388911826e+00 15648 15240 6.56077331714627e+00 15648 15264 2.63307945879096e+00 15648 15288 2.94482901828528e-01 15648 15600 5.20546693731802e-01 15648 15624 3.67164699493718e+00 15648 15672 3.45834867769280e+00 15648 15696 4.67222114420705e-01 15648 16008 1.77960916292746e-01 15648 16032 1.33207175863362e+00 15648 16056 2.84901195706920e+00 15648 16080 1.38078276116629e+00 15648 16104 1.90138666925913e-01 15648 16416 2.50127706152297e-02 15648 16440 2.00736623449201e-01 15648 16464 4.54332216932532e-01 15648 16488 2.06994670444976e-01 15648 16512 2.65772823641734e-02 15649 15649 1.00000000000000e+00 15650 15650 1.00000000000000e+00 15651 15651 1.00000000000000e+00 15652 15652 1.00000000000000e+00 15653 15653 1.00000000000000e+00 15654 15654 1.00000000000000e+00 15655 15655 1.00000000000000e+00 15656 15656 1.00000000000000e+00 15657 15657 1.00000000000000e+00 15658 15658 1.00000000000000e+00 15659 15659 1.00000000000000e+00 15660 15660 1.00000000000000e+00 15661 15661 1.00000000000000e+00 15662 15662 1.00000000000000e+00 15663 15663 1.00000000000000e+00 15664 15664 1.00000000000000e+00 15665 15665 1.00000000000000e+00 15666 15666 1.00000000000000e+00 15667 15667 1.00000000000000e+00 15668 15668 1.00000000000000e+00 15669 15669 1.00000000000000e+00 15670 15670 1.00000000000000e+00 15671 15671 1.00000000000000e+00 15672 4581 -5.65856354692914e-02 15672 4605 -8.79965056906127e-01 15672 4629 -4.56253711353308e-01 15672 4653 -1.16143813803572e-03 15672 5157 -2.23427793991180e-04 15672 5181 -3.49286089514239e-01 15672 5205 -5.86735061115216e+00 15672 5229 -1.01403827040808e+01 15672 5253 -1.64156849315699e+00 15672 5277 -7.39950019853679e-03 15672 5757 -1.69124856312048e-03 15672 5781 -4.28266688460053e-01 15672 5805 -5.10178297208434e+00 15672 5829 -7.61855577416965e+00 15672 5853 -1.92125528213327e+00 15672 5877 -1.42217084326022e-02 15672 6357 -6.02398997712599e-05 15672 6381 -5.14144086384395e-02 15672 6405 -7.67651190101414e-01 15672 6429 -8.31720144615564e-01 15672 6453 -1.13112689805217e-01 15672 6477 -5.73103372691881e-06 15672 7005 -1.17783345955640e-03 15672 7029 -8.02865271787057e-03 15672 7053 -7.09905820190994e-04 15672 15672 9.38018160737747e+00 15672 15216 3.63786962869211e-01 15672 15240 2.63307945879096e+00 15672 15264 5.56573923087694e+00 15672 15288 3.13883496231916e+00 15672 15312 4.90225838751259e-01 15672 15624 3.97365055002481e-01 15672 15648 3.45834867769280e+00 15672 15696 3.89793934425677e+00 15672 15720 5.07262721643473e-01 15672 16032 1.55057023365655e-01 15672 16056 1.38078276116629e+00 15672 16080 3.36345328386550e+00 15672 16104 1.42526502644434e+00 15672 16128 1.66177589685169e-01 15672 16440 2.51713852470706e-02 15672 16464 2.06994670444976e-01 15672 16488 4.74982653968479e-01 15672 16512 2.04608133035231e-01 15672 16536 2.45747508946344e-02 15673 15673 1.00000000000000e+00 15674 15674 1.00000000000000e+00 15675 15675 1.00000000000000e+00 15676 15676 1.00000000000000e+00 15677 15677 1.00000000000000e+00 15678 15678 1.00000000000000e+00 15679 15679 1.00000000000000e+00 15680 15680 1.00000000000000e+00 15681 15681 1.00000000000000e+00 15682 15682 1.00000000000000e+00 15683 15683 1.00000000000000e+00 15684 15684 1.00000000000000e+00 15685 15685 1.00000000000000e+00 15686 15686 1.00000000000000e+00 15687 15687 1.00000000000000e+00 15688 15688 1.00000000000000e+00 15689 15689 1.00000000000000e+00 15690 15690 1.00000000000000e+00 15691 15691 1.00000000000000e+00 15692 15692 1.00000000000000e+00 15693 15693 1.00000000000000e+00 15694 15694 1.00000000000000e+00 15695 15695 1.00000000000000e+00 15696 4605 -3.73800305753875e-02 15696 4629 -7.27606402896137e-02 15696 4653 -6.07278449815373e-04 15696 5181 -2.60936372640858e-03 15696 5205 -9.00513750001290e-01 15696 5229 -7.22856710572116e+00 15696 5253 -4.99269484567999e+00 15696 5277 -9.08396678635025e-02 15696 5781 -2.75544390262795e-02 15696 5805 -1.56020234216355e+00 15696 5829 -1.02980360621154e+01 15696 5853 -9.05696095074184e+00 15696 5877 -6.32999049357056e-01 15696 6381 -8.22518959263112e-03 15696 6405 -5.23272904718816e-01 15696 6429 -2.49991636289086e+00 15696 6453 -1.43888709538293e+00 15696 6477 -1.07496598483683e-01 15696 7005 -4.35560139697713e-03 15696 7029 -7.55358123396634e-02 15696 7053 -6.28594643042408e-02 15696 7077 -7.25522370285950e-04 15696 15696 9.96801212356337e+00 15696 15240 2.94482901828528e-01 15696 15264 3.13883496231916e+00 15696 15288 8.42373780668300e+00 15696 15312 3.10346929434225e+00 15696 15336 2.85641484834302e-01 15696 15648 4.67222114420705e-01 15696 15672 3.89793934425677e+00 15696 15720 3.56739673796153e+00 15696 15744 3.84586462846898e-01 15696 16056 1.90138666925913e-01 15696 16080 1.42526502644434e+00 15696 16104 3.02295807149273e+00 15696 16128 1.36062223715692e+00 15696 16152 1.73977969604057e-01 15696 16464 2.65772823641734e-02 15696 16488 2.04608133035231e-01 15696 16512 4.48016156154050e-01 15696 16536 2.11270441481446e-01 15696 16560 2.82428594757272e-02 15697 15697 1.00000000000000e+00 15698 15698 1.00000000000000e+00 15699 15699 1.00000000000000e+00 15700 15700 1.00000000000000e+00 15701 15701 1.00000000000000e+00 15702 15702 1.00000000000000e+00 15703 15703 1.00000000000000e+00 15704 15704 1.00000000000000e+00 15705 15705 1.00000000000000e+00 15706 15706 1.00000000000000e+00 15707 15707 1.00000000000000e+00 15708 15708 1.00000000000000e+00 15709 15709 1.00000000000000e+00 15710 15710 1.00000000000000e+00 15711 15711 1.00000000000000e+00 15712 15712 1.00000000000000e+00 15713 15713 1.00000000000000e+00 15714 15714 1.00000000000000e+00 15715 15715 1.00000000000000e+00 15716 15716 1.00000000000000e+00 15717 15717 1.00000000000000e+00 15718 15718 1.00000000000000e+00 15719 15719 1.00000000000000e+00 15720 4605 -1.80427590875910e-07 15720 4629 -8.11888108207359e-04 15720 4653 -8.45132164331549e-05 15720 5205 -1.38478634824625e-02 15720 5229 -1.42156879861830e+00 15720 5253 -2.51925394366346e+00 15720 5277 -2.75622480796982e-01 15720 5781 -6.36605257387370e-07 15720 5805 -1.23074941957588e-01 15720 5829 -3.50368766140374e+00 15720 5853 -1.16102424187961e+01 15720 5877 -4.52174059881944e+00 15720 5901 -1.22950809007931e-01 15720 6381 -2.55024749279378e-06 15720 6405 -9.94144917254071e-02 15720 6429 -2.25180646794107e+00 15720 6453 -5.48334295921232e+00 15720 6477 -2.39548250059452e+00 15720 6501 -9.62596793221488e-02 15720 7005 -2.14648723749308e-03 15720 7029 -2.00180555053650e-01 15720 7053 -5.38961450759771e-01 15720 7077 -1.60508309066113e-01 15720 7101 -3.56454239513509e-04 15720 7629 -9.46477160706600e-08 15720 7653 -6.38658904564122e-04 15720 7677 -3.76985077331602e-04 15720 15720 8.22345368046100e+00 15720 15264 4.90225838751259e-01 15720 15288 3.10346929434225e+00 15720 15312 5.45879703285381e+00 15720 15336 2.73579568635200e+00 15720 15360 3.98307436753696e-01 15720 15672 5.07262721643473e-01 15720 15696 3.56739673796153e+00 15720 15744 3.78957606445559e+00 15720 15768 5.62807553266987e-01 15720 16080 1.66177589685169e-01 15720 16104 1.36062223715692e+00 15720 16128 3.16981381131377e+00 15720 16152 1.57586671027072e+00 15720 16176 2.19988707963619e-01 15720 16488 2.45747508946344e-02 15720 16512 2.11270441481446e-01 15720 16536 5.07714859658772e-01 15720 16560 2.37988866512918e-01 15720 16584 3.12543571525023e-02 15721 15721 1.00000000000000e+00 15722 15722 1.00000000000000e+00 15723 15723 1.00000000000000e+00 15724 15724 1.00000000000000e+00 15725 15725 1.00000000000000e+00 15726 15726 1.00000000000000e+00 15727 15727 1.00000000000000e+00 15728 15728 1.00000000000000e+00 15729 15729 1.00000000000000e+00 15730 15730 1.00000000000000e+00 15731 15731 1.00000000000000e+00 15732 15732 1.00000000000000e+00 15733 15733 1.00000000000000e+00 15734 15734 1.00000000000000e+00 15735 15735 1.00000000000000e+00 15736 15736 1.00000000000000e+00 15737 15737 1.00000000000000e+00 15738 15738 1.00000000000000e+00 15739 15739 1.00000000000000e+00 15740 15740 1.00000000000000e+00 15741 15741 1.00000000000000e+00 15742 15742 1.00000000000000e+00 15743 15743 1.00000000000000e+00 15744 5229 -3.23742370319457e-02 15744 5253 -4.17890200362028e-01 15744 5277 -1.54266916353449e-01 15744 5805 -1.43016294015586e-04 15744 5829 -3.45089594634302e-01 15744 5853 -5.92201974611276e+00 15744 5877 -1.01045841424142e+01 15744 5901 -1.03543496275690e+00 15744 5925 -2.35827455065943e-03 15744 6405 -2.45483860613432e-03 15744 6429 -5.66300017826288e-01 15744 6453 -6.75754988964383e+00 15744 6477 -9.88798952076274e+00 15744 6501 -1.81132176135845e+00 15744 6525 -9.21270429339994e-03 15744 7005 -2.84870293465072e-04 15744 7029 -1.10018885673374e-01 15744 7053 -1.33316206270335e+00 15744 7077 -1.13078752502031e+00 15744 7101 -1.42656758267412e-01 15744 7125 -3.51333413334760e-05 15744 7629 -3.86495522040070e-07 15744 7653 -5.05501392373332e-03 15744 7677 -1.46556642943470e-02 15744 7701 -1.07614750049477e-03 15744 15744 1.08005989053053e+01 15744 15288 2.85641484834302e-01 15744 15312 2.73579568635200e+00 15744 15336 7.01598994451505e+00 15744 15360 3.02294763350108e+00 15744 15384 3.57429471621572e-01 15744 15696 3.84586462846898e-01 15744 15720 3.78957606445559e+00 15744 15768 3.89559657381331e+00 15744 15792 4.11091590186328e-01 15744 16104 1.73977969604057e-01 15744 16128 1.57586671027073e+00 15744 16152 3.81874972158639e+00 15744 16176 1.37976453011185e+00 15744 16200 1.24952424564340e-01 15744 16512 2.82428594757272e-02 15744 16536 2.37988866512918e-01 15744 16560 5.44078468654198e-01 15744 16584 1.88081007563747e-01 15744 16608 1.57658947384345e-02 15745 15745 1.00000000000000e+00 15746 15746 1.00000000000000e+00 15747 15747 1.00000000000000e+00 15748 15748 1.00000000000000e+00 15749 15749 1.00000000000000e+00 15750 15750 1.00000000000000e+00 15751 15751 1.00000000000000e+00 15752 15752 1.00000000000000e+00 15753 15753 1.00000000000000e+00 15754 15754 1.00000000000000e+00 15755 15755 1.00000000000000e+00 15756 15756 1.00000000000000e+00 15757 15757 1.00000000000000e+00 15758 15758 1.00000000000000e+00 15759 15759 1.00000000000000e+00 15760 15760 1.00000000000000e+00 15761 15761 1.00000000000000e+00 15762 15762 1.00000000000000e+00 15763 15763 1.00000000000000e+00 15764 15764 1.00000000000000e+00 15765 15765 1.00000000000000e+00 15766 15766 1.00000000000000e+00 15767 15767 1.00000000000000e+00 15768 5253 -1.88624550732978e-02 15768 5277 -2.32563123210234e-02 15768 5829 -1.97299421219392e-03 15768 5853 -9.48787970187871e-01 15768 5877 -5.11981516898468e+00 15768 5901 -2.63427490152788e+00 15768 5925 -2.76749461282620e-02 15768 6429 -3.39913024247168e-02 15768 6453 -1.79211733908770e+00 15768 6477 -1.13396010740795e+01 15768 6501 -1.07635608328284e+01 15768 6525 -1.61524079405973e-01 15768 7029 -1.65362016833954e-02 15768 7053 -6.38508544939169e-01 15768 7077 -4.72007968522755e+00 15768 7101 -3.05351420152953e+00 15768 7125 -2.70507787134003e-03 15768 7629 -1.26266347100440e-07 15768 7653 -1.53507695888668e-02 15768 7677 -2.98294215297033e-01 15768 7701 -7.30006766659712e-02 15768 15768 1.02261200668356e+01 15768 15312 3.98307436753696e-01 15768 15336 3.02294763350108e+00 15768 15360 6.89066535570985e+00 15768 15384 2.97669063250825e+00 15768 15720 5.62807553266987e-01 15768 15744 3.89559657381331e+00 15768 15792 5.81606050191973e+00 15768 16128 2.19988707963619e-01 15768 16152 1.37976453011186e+00 15768 16176 3.37521270349820e+00 15768 16200 2.81178010326755e+00 15768 16536 3.12543571525023e-02 15768 16560 1.88081007563747e-01 15768 16584 4.64035159481771e-01 15768 16608 4.24116551982371e-01 15769 15769 1.00000000000000e+00 15770 15770 1.00000000000000e+00 15771 15771 1.00000000000000e+00 15772 15772 1.00000000000000e+00 15773 15773 1.00000000000000e+00 15774 15774 1.00000000000000e+00 15775 15775 1.00000000000000e+00 15776 15776 1.00000000000000e+00 15777 15777 1.00000000000000e+00 15778 15778 1.00000000000000e+00 15779 15779 1.00000000000000e+00 15780 15780 1.00000000000000e+00 15781 15781 1.00000000000000e+00 15782 15782 1.00000000000000e+00 15783 15783 1.00000000000000e+00 15784 15784 1.00000000000000e+00 15785 15785 1.00000000000000e+00 15786 15786 1.00000000000000e+00 15787 15787 1.00000000000000e+00 15788 15788 1.00000000000000e+00 15789 15789 1.00000000000000e+00 15790 15790 1.00000000000000e+00 15791 15791 1.00000000000000e+00 15792 5853 -8.34695865135725e-03 15792 5877 -8.20147575343343e-01 15792 5901 -1.21722609796368e+00 15792 5925 -3.88419704019079e-02 15792 6429 -3.45535269833850e-07 15792 6453 -9.39954658147401e-02 15792 6477 -5.32072509956977e+00 15792 6501 -1.13506209985234e+01 15792 6525 -2.58559228758146e-01 15792 7029 -4.61831190340905e-06 15792 7053 -1.17498240106754e-01 15792 7077 -5.62748706111411e+00 15792 7101 -5.11769890541450e+00 15792 7125 -5.16422235334572e-03 15792 7629 -7.90465775745000e-09 15792 7653 -1.19215732302675e-02 15792 7677 -5.03800392544258e-01 15792 7701 -1.38468320828479e-01 15792 15792 9.75447987253512e+00 15792 15336 3.57429471621572e-01 15792 15360 2.97669063250825e+00 15792 15384 3.45137496366549e+00 15792 15744 4.11091590186328e-01 15792 15768 5.81606050191973e+00 15792 16152 1.24952424564340e-01 15792 16176 2.81178010326755e+00 15792 16200 4.74889323458471e+00 15792 16560 1.57658947384345e-02 15792 16584 4.24116551982371e-01 15792 16608 7.37871840795700e-01 15793 15793 1.00000000000000e+00 15794 15794 1.00000000000000e+00 15795 15795 1.00000000000000e+00 15796 15796 1.00000000000000e+00 15797 15797 1.00000000000000e+00 15798 15798 1.00000000000000e+00 15799 15799 1.00000000000000e+00 15800 15800 1.00000000000000e+00 15801 15801 1.00000000000000e+00 15802 15802 1.00000000000000e+00 15803 15803 1.00000000000000e+00 15804 15804 1.00000000000000e+00 15805 15805 1.00000000000000e+00 15806 15806 1.00000000000000e+00 15807 15807 1.00000000000000e+00 15808 15808 1.00000000000000e+00 15809 15809 1.00000000000000e+00 15810 15810 1.00000000000000e+00 15811 15811 1.00000000000000e+00 15812 15812 1.00000000000000e+00 15813 15813 1.00000000000000e+00 15814 15814 1.00000000000000e+00 15815 15815 1.00000000000000e+00 15816 2037 -4.53057394300007e-03 15816 2061 -1.70855648037462e-02 15816 2085 -4.97899102435187e-05 15816 2637 -1.81449700885238e+00 15816 2661 -2.47118942806325e+00 15816 2685 -4.22648233034794e-02 15816 2709 -2.27564163003290e-07 15816 3213 -2.89759613634642e-01 15816 3237 -1.47080981867762e+01 15816 3261 -7.14013593441134e+00 15816 3285 -1.11494712416163e-01 15816 3309 -2.12346769668850e-07 15816 3813 -7.35786296464262e-01 15816 3837 -6.32291240332999e+00 15816 3861 -1.79324213756288e+00 15816 3885 -3.10803560498734e-02 15816 4413 -4.88682978709439e-02 15816 4437 -1.65636733875927e-01 15816 4461 -3.17314047065666e-02 15816 4485 -2.42166638779722e-05 15816 5037 -1.33099563758210e-07 15816 5061 -1.54286544133720e-07 15816 15816 1.21577171568330e+01 15816 15000 6.06553463424571e-01 15816 15024 3.57429471621563e-01 15816 15048 1.54722114026508e-02 15816 15408 4.94787439225250e+00 15816 15432 3.02294763350099e+00 15816 15456 1.56860124964210e-01 15816 15840 7.01598994451482e+00 15816 15864 4.10608961742365e-01 15816 16224 4.37974669532055e+00 15816 16248 2.73579568635192e+00 15816 16272 1.55977811054754e-01 15816 16632 4.64521539191584e-01 15816 16656 2.85641484834296e-01 15816 16680 1.52516329252869e-02 15817 15817 1.00000000000000e+00 15818 15818 1.00000000000000e+00 15819 15819 1.00000000000000e+00 15820 15820 1.00000000000000e+00 15821 15821 1.00000000000000e+00 15822 15822 1.00000000000000e+00 15823 15823 1.00000000000000e+00 15824 15824 1.00000000000000e+00 15825 15825 1.00000000000000e+00 15826 15826 1.00000000000000e+00 15827 15827 1.00000000000000e+00 15828 15828 1.00000000000000e+00 15829 15829 1.00000000000000e+00 15830 15830 1.00000000000000e+00 15831 15831 1.00000000000000e+00 15832 15832 1.00000000000000e+00 15833 15833 1.00000000000000e+00 15834 15834 1.00000000000000e+00 15835 15835 1.00000000000000e+00 15836 15836 1.00000000000000e+00 15837 15837 1.00000000000000e+00 15838 15838 1.00000000000000e+00 15839 15839 1.00000000000000e+00 15840 2037 -2.35827455065936e-03 15840 2061 -9.21270429339967e-03 15840 2085 -3.51333413334755e-05 15840 2637 -1.03543496275687e+00 15840 2661 -1.81132176135841e+00 15840 2685 -1.42656758267414e-01 15840 2709 -1.07614750049477e-03 15840 3213 -1.54266916353445e-01 15840 3237 -1.01045841424138e+01 15840 3261 -9.88798952076252e+00 15840 3285 -1.13078752502025e+00 15840 3309 -1.46556642943468e-02 15840 3813 -4.17890200362018e-01 15840 3837 -5.92201974611259e+00 15840 3861 -6.75754988964339e+00 15840 3885 -1.33316206270320e+00 15840 3909 -5.05501392373296e-03 15840 4413 -3.23742370319451e-02 15840 4437 -3.45089594634299e-01 15840 4461 -5.66300017826269e-01 15840 4485 -1.10018885673366e-01 15840 4509 -3.86495522040020e-07 15840 5037 -1.43016294015590e-04 15840 5061 -2.45483860613439e-03 15840 5085 -2.84870293465081e-04 15840 15840 1.08005989053049e+01 15840 15000 3.57429471621563e-01 15840 15024 4.11091590186327e-01 15840 15048 1.24952424564341e-01 15840 15072 1.57658947384345e-02 15840 15408 3.02294763350099e+00 15840 15432 3.89559657381322e+00 15840 15456 1.37976453011177e+00 15840 15480 1.88081007563730e-01 15840 15816 7.01598994451482e+00 15840 15864 3.81874972158606e+00 15840 15888 5.44078468654130e-01 15840 16224 2.73579568635192e+00 15840 16248 3.78957606445548e+00 15840 16272 1.57586671027065e+00 15840 16296 2.37988866512904e-01 15840 16632 2.85641484834296e-01 15840 16656 3.84586462846892e-01 15840 16680 1.73977969604060e-01 15840 16704 2.82428594757281e-02 15841 15841 1.00000000000000e+00 15842 15842 1.00000000000000e+00 15843 15843 1.00000000000000e+00 15844 15844 1.00000000000000e+00 15845 15845 1.00000000000000e+00 15846 15846 1.00000000000000e+00 15847 15847 1.00000000000000e+00 15848 15848 1.00000000000000e+00 15849 15849 1.00000000000000e+00 15850 15850 1.00000000000000e+00 15851 15851 1.00000000000000e+00 15852 15852 1.00000000000000e+00 15853 15853 1.00000000000000e+00 15854 15854 1.00000000000000e+00 15855 15855 1.00000000000000e+00 15856 15856 1.00000000000000e+00 15857 15857 1.00000000000000e+00 15858 15858 1.00000000000000e+00 15859 15859 1.00000000000000e+00 15860 15860 1.00000000000000e+00 15861 15861 1.00000000000000e+00 15862 15862 1.00000000000000e+00 15863 15863 1.00000000000000e+00 15864 2037 -2.65678797598061e-05 15864 2061 -1.91406254721879e-04 15864 2085 -2.92525320334745e-06 15864 2637 -3.66291396137364e-02 15864 2661 -2.20635404010207e-01 15864 2685 -1.49049353647891e-01 15864 2709 -5.78613424267483e-03 15864 2733 -2.84663206480000e-10 15864 3213 -2.68203129603534e-03 15864 3237 -8.81159512977690e-01 15864 3261 -5.27654274785870e+00 15864 3285 -3.33774787695725e+00 15864 3309 -2.26898724073114e-01 15864 3333 -6.88591247467974e-04 15864 3813 -1.42858512538454e-02 15864 3837 -1.39480511332749e+00 15864 3861 -1.09547396060201e+01 15864 3885 -7.34164664187888e+00 15864 3909 -5.12343280474780e-01 15864 3933 -3.96784765631882e-04 15864 4413 -2.27056743930503e-03 15864 4437 -3.35634600221834e-01 15864 4461 -2.15460430129381e+00 15864 4485 -1.43097519682743e+00 15864 4509 -1.08175470687364e-01 15864 5037 -6.20042783016785e-04 15864 5061 -2.67986772911736e-02 15864 5085 -2.79573555867753e-02 15864 5109 -2.81280434771745e-04 15864 15864 1.06033020384089e+01 15864 15000 1.54722114026508e-02 15864 15024 1.24952424564341e-01 15864 15048 2.87903471136636e-01 15864 15072 1.43771354629872e-01 15864 15096 2.01769439190334e-02 15864 15408 1.56860124964210e-01 15864 15432 1.37976453011178e+00 15864 15456 3.35768784025763e+00 15864 15480 1.51845040734963e+00 15864 15504 1.91531594273673e-01 15864 15816 4.10608961742365e-01 15864 15840 3.81874972158606e+00 15864 15888 4.12606418741692e+00 15864 15912 4.87437578200078e-01 15864 16224 1.55977811054754e-01 15864 16248 1.57586671027065e+00 15864 16272 4.17048493342239e+00 15864 16296 1.77869649869598e+00 15864 16320 2.06685258161086e-01 15864 16632 1.52516329252869e-02 15864 16656 1.73977969604060e-01 15864 16680 4.91102744427823e-01 15864 16704 2.08832877466459e-01 15864 16728 2.39653598908867e-02 15865 15865 1.00000000000000e+00 15866 15866 1.00000000000000e+00 15867 15867 1.00000000000000e+00 15868 15868 1.00000000000000e+00 15869 15869 1.00000000000000e+00 15870 15870 1.00000000000000e+00 15871 15871 1.00000000000000e+00 15872 15872 1.00000000000000e+00 15873 15873 1.00000000000000e+00 15874 15874 1.00000000000000e+00 15875 15875 1.00000000000000e+00 15876 15876 1.00000000000000e+00 15877 15877 1.00000000000000e+00 15878 15878 1.00000000000000e+00 15879 15879 1.00000000000000e+00 15880 15880 1.00000000000000e+00 15881 15881 1.00000000000000e+00 15882 15882 1.00000000000000e+00 15883 15883 1.00000000000000e+00 15884 15884 1.00000000000000e+00 15885 15885 1.00000000000000e+00 15886 15886 1.00000000000000e+00 15887 15887 1.00000000000000e+00 15888 2637 -1.19463980016838e-06 15888 2661 -1.51639929481642e-02 15888 2685 -4.35226319330419e-02 15888 2709 -7.02520703206120e-03 15888 2733 -1.31019120337000e-09 15888 3237 -2.56556343381720e-02 15888 3261 -1.07744492518077e+00 15888 3285 -2.41236416441363e+00 15888 3309 -7.93553797255192e-01 15888 3333 -2.01988474371420e-02 15888 3357 -4.14899663859000e-08 15888 3813 -2.63635274781220e-07 15888 3837 -1.63888366341900e-01 15888 3861 -4.28313906253394e+00 15888 3885 -1.18093709731944e+01 15888 3909 -3.34211054867200e+00 15888 3933 -1.01470518843150e-01 15888 3957 -6.61515078038700e-08 15888 4413 -5.30610853420280e-07 15888 4437 -7.56563029286552e-02 15888 4461 -1.87921702765295e+00 15888 4485 -5.11917555376152e+00 15888 4509 -1.74396899578495e+00 15888 4533 -3.98639657652776e-02 15888 5037 -3.42380297403751e-04 15888 5061 -7.66304469585001e-02 15888 5085 -2.38646796391964e-01 15888 5109 -7.51061278934855e-02 15888 5133 -1.18646387859601e-04 15888 5685 -3.13185518468507e-05 15888 5709 -2.65552428960322e-05 15888 15888 9.77556496807971e+00 15888 15024 1.57658947384345e-02 15888 15048 1.43771354629872e-01 15888 15072 3.56062772461138e-01 15888 15096 1.50570875748810e-01 15888 15120 1.74657750181691e-02 15888 15432 1.88081007563730e-01 15888 15456 1.51845040734963e+00 15888 15480 3.42083700730071e+00 15888 15504 1.43912834252727e+00 15888 15528 1.68250491358141e-01 15888 15840 5.44078468654130e-01 15888 15864 4.12606418741692e+00 15888 15912 3.67969130569640e+00 15888 15936 4.32485248224002e-01 15888 16248 2.37988866512904e-01 15888 16272 1.77869649869598e+00 15888 16296 3.72922002063173e+00 15888 16320 1.56380912680985e+00 15888 16344 1.84267023541371e-01 15888 16656 2.82428594757281e-02 15888 16680 2.08832877466459e-01 15888 16704 4.33158525793892e-01 15888 16728 1.81741071819453e-01 15888 16752 2.14699080639766e-02 15889 15889 1.00000000000000e+00 15890 15890 1.00000000000000e+00 15891 15891 1.00000000000000e+00 15892 15892 1.00000000000000e+00 15893 15893 1.00000000000000e+00 15894 15894 1.00000000000000e+00 15895 15895 1.00000000000000e+00 15896 15896 1.00000000000000e+00 15897 15897 1.00000000000000e+00 15898 15898 1.00000000000000e+00 15899 15899 1.00000000000000e+00 15900 15900 1.00000000000000e+00 15901 15901 1.00000000000000e+00 15902 15902 1.00000000000000e+00 15903 15903 1.00000000000000e+00 15904 15904 1.00000000000000e+00 15905 15905 1.00000000000000e+00 15906 15906 1.00000000000000e+00 15907 15907 1.00000000000000e+00 15908 15908 1.00000000000000e+00 15909 15909 1.00000000000000e+00 15910 15910 1.00000000000000e+00 15911 15911 1.00000000000000e+00 15912 2661 -1.30936415916657e-05 15912 2685 -3.42397024350168e-03 15912 2709 -1.52551360576180e-03 15912 2733 -9.70816716290000e-10 15912 3261 -3.82846590392059e-02 15912 3285 -5.06189018822970e-01 15912 3309 -5.98577294457400e-01 15912 3333 -8.38121177760752e-02 15912 3357 -2.99572453049507e-04 15912 3837 -1.91637324661198e-04 15912 3861 -4.87379513125262e-01 15912 3885 -5.28864690628289e+00 15912 3909 -6.52746285474573e+00 15912 3933 -8.51279404173898e-01 15912 3957 -1.07430284427307e-02 15912 4437 -1.46560958747284e-03 15912 4461 -4.41673679756449e-01 15912 4485 -5.30453705292561e+00 15912 4509 -7.42284113932549e+00 15912 4533 -1.20828029646931e+00 15912 4557 -5.20445063742404e-03 15912 5037 -4.99741004107984e-05 15912 5061 -4.19819363012440e-02 15912 5085 -6.31129289373418e-01 15912 5109 -8.20278751359089e-01 15912 5133 -1.44830657291899e-01 15912 5157 -5.13822501368402e-06 15912 5685 -9.54445888291217e-04 15912 5709 -6.95654844075536e-03 15912 5733 -6.49930412057389e-04 15912 15912 8.85982970989341e+00 15912 15048 2.01769439190334e-02 15912 15072 1.50570875748810e-01 15912 15096 3.14802352952060e-01 15912 15120 1.30555135041960e-01 15912 15144 1.51730087423209e-02 15912 15456 1.91531594273673e-01 15912 15480 1.43912834252727e+00 15912 15504 3.04811342980965e+00 15912 15528 1.33129786065526e+00 15912 15552 1.64573973805670e-01 15912 15864 4.87437578200078e-01 15912 15888 3.67969130569640e+00 15912 15936 3.54045363333212e+00 15912 15960 4.52628160109008e-01 15912 16272 2.06685258161086e-01 15912 16296 1.56380912680985e+00 15912 16320 3.34654915774404e+00 15912 16344 1.50343418584934e+00 15912 16368 1.91591522920960e-01 15912 16680 2.39653598908867e-02 15912 16704 1.81741071819453e-01 15912 16728 3.89411284935657e-01 15912 16752 1.73589216340481e-01 15912 16776 2.19273960211435e-02 15913 15913 1.00000000000000e+00 15914 15914 1.00000000000000e+00 15915 15915 1.00000000000000e+00 15916 15916 1.00000000000000e+00 15917 15917 1.00000000000000e+00 15918 15918 1.00000000000000e+00 15919 15919 1.00000000000000e+00 15920 15920 1.00000000000000e+00 15921 15921 1.00000000000000e+00 15922 15922 1.00000000000000e+00 15923 15923 1.00000000000000e+00 15924 15924 1.00000000000000e+00 15925 15925 1.00000000000000e+00 15926 15926 1.00000000000000e+00 15927 15927 1.00000000000000e+00 15928 15928 1.00000000000000e+00 15929 15929 1.00000000000000e+00 15930 15930 1.00000000000000e+00 15931 15931 1.00000000000000e+00 15932 15932 1.00000000000000e+00 15933 15933 1.00000000000000e+00 15934 15934 1.00000000000000e+00 15935 15935 1.00000000000000e+00 15936 2685 -2.30239133829011e-06 15936 2709 -1.01389756552504e-05 15936 2733 -1.71538377450000e-10 15936 3285 -2.09752511183678e-02 15936 3309 -1.34464897613046e-01 15936 3333 -7.17232553767070e-02 15936 3357 -1.46097158628630e-03 15936 3861 -2.41855455161586e-03 15936 3885 -7.58041586363656e-01 15936 3909 -3.63348164739559e+00 15936 3933 -2.17167163998994e+00 15936 3957 -1.56376062952831e-01 15936 3981 -4.15196523486826e-04 15936 4461 -2.20016673822274e-02 15936 4485 -1.59016329279602e+00 15936 4509 -1.00058294587787e+01 15936 4533 -6.39325921400920e+00 15936 4557 -4.57856882564987e-01 15936 4581 -4.10935087373676e-04 15936 5061 -6.25604395553294e-03 15936 5085 -4.52565793524384e-01 15936 5109 -2.57969505935665e+00 15936 5133 -1.79075268972266e+00 15936 5157 -1.37572068971864e-01 15936 5181 -1.54549245000000e-12 15936 5685 -3.53912977336373e-03 15936 5709 -5.91529245750127e-02 15936 5733 -4.81042644266786e-02 15936 5757 -7.09749042147114e-04 15936 15936 9.13287850138151e+00 15936 15072 1.74657750181691e-02 15936 15096 1.30555135041960e-01 15936 15120 2.80966808721890e-01 15936 15144 1.43623610275630e-01 15936 15168 2.07328938265866e-02 15936 15480 1.68250491358141e-01 15936 15504 1.33129786065526e+00 15936 15528 2.98850003984698e+00 15936 15552 1.40655976561495e+00 15936 15576 1.87065967598063e-01 15936 15888 4.32485248224002e-01 15936 15912 3.54045363333212e+00 15936 15960 3.64388340608840e+00 15936 15984 4.58342691413074e-01 15936 16296 1.84267023541371e-01 15936 16320 1.50343418584934e+00 15936 16344 3.43815469624700e+00 15936 16368 1.52005931556464e+00 15936 16392 1.88423305970196e-01 15936 16704 2.14699080639766e-02 15936 16728 1.73589216340481e-01 15936 16752 3.93380472821893e-01 15936 16776 1.71998497763053e-01 15936 16800 2.10722284196199e-02 15937 15937 1.00000000000000e+00 15938 15938 1.00000000000000e+00 15939 15939 1.00000000000000e+00 15940 15940 1.00000000000000e+00 15941 15941 1.00000000000000e+00 15942 15942 1.00000000000000e+00 15943 15943 1.00000000000000e+00 15944 15944 1.00000000000000e+00 15945 15945 1.00000000000000e+00 15946 15946 1.00000000000000e+00 15947 15947 1.00000000000000e+00 15948 15948 1.00000000000000e+00 15949 15949 1.00000000000000e+00 15950 15950 1.00000000000000e+00 15951 15951 1.00000000000000e+00 15952 15952 1.00000000000000e+00 15953 15953 1.00000000000000e+00 15954 15954 1.00000000000000e+00 15955 15955 1.00000000000000e+00 15956 15956 1.00000000000000e+00 15957 15957 1.00000000000000e+00 15958 15958 1.00000000000000e+00 15959 15959 1.00000000000000e+00 15960 3285 -1.44727600551000e-08 15960 3309 -7.17949674489180e-03 15960 3333 -1.69311411195082e-02 15960 3357 -1.35262437329919e-03 15960 3885 -1.45815447323934e-02 15960 3909 -6.43339735310622e-01 15960 3933 -1.52603805139534e+00 15960 3957 -5.14460043694642e-01 15960 3981 -9.31784332562704e-03 15960 4005 -2.47779430879000e-09 15960 4461 -3.98147192210440e-07 15960 4485 -1.36848367689043e-01 15960 4509 -3.73623591502840e+00 15960 4533 -1.02216097184026e+01 15960 4557 -2.77314972883564e+00 15960 4581 -7.39964518854133e-02 15960 4605 -7.29284455996000e-09 15960 5061 -1.59177904572117e-06 15960 5085 -8.66559427129929e-02 15960 5109 -2.18514483610328e+00 15960 5133 -6.17588936427211e+00 15960 5157 -2.01546910711484e+00 15960 5181 -4.35511837740995e-02 15960 5685 -1.59366967251031e-03 15960 5709 -1.44363945467570e-01 15960 5733 -3.90543641669718e-01 15960 5757 -1.27093248179569e-01 15960 5781 -3.83180860003066e-04 15960 6309 -3.47987915137000e-08 15960 6333 -4.06769525242702e-04 15960 6357 -2.50271011591103e-04 15960 15960 9.20734770868306e+00 15960 15096 1.51730087423209e-02 15960 15120 1.43623610275630e-01 15960 15144 3.61401867063395e-01 15960 15168 1.40941803689101e-01 15960 15192 1.45025570956886e-02 15960 15504 1.64573973805670e-01 15960 15528 1.40655976561495e+00 15960 15552 3.31201727714557e+00 15960 15576 1.36581515747558e+00 15960 15600 1.54387821770829e-01 15960 15912 4.52628160109008e-01 15960 15936 3.64388340608840e+00 15960 15984 3.51831670951067e+00 15960 16008 4.21236485964575e-01 15960 16320 1.91591522920960e-01 15960 16344 1.52005931556464e+00 15960 16368 3.38763623309859e+00 15960 16392 1.47878048249849e+00 15960 16416 1.81271814654422e-01 15960 16728 2.19273960211435e-02 15960 16752 1.71998497763053e-01 15960 16776 3.80306606051648e-01 15960 16800 1.69183134944827e-01 15960 16824 2.12235553165868e-02 15961 15961 1.00000000000000e+00 15962 15962 1.00000000000000e+00 15963 15963 1.00000000000000e+00 15964 15964 1.00000000000000e+00 15965 15965 1.00000000000000e+00 15966 15966 1.00000000000000e+00 15967 15967 1.00000000000000e+00 15968 15968 1.00000000000000e+00 15969 15969 1.00000000000000e+00 15970 15970 1.00000000000000e+00 15971 15971 1.00000000000000e+00 15972 15972 1.00000000000000e+00 15973 15973 1.00000000000000e+00 15974 15974 1.00000000000000e+00 15975 15975 1.00000000000000e+00 15976 15976 1.00000000000000e+00 15977 15977 1.00000000000000e+00 15978 15978 1.00000000000000e+00 15979 15979 1.00000000000000e+00 15980 15980 1.00000000000000e+00 15981 15981 1.00000000000000e+00 15982 15982 1.00000000000000e+00 15983 15983 1.00000000000000e+00 15984 3309 -2.33755502357588e-06 15984 3333 -8.96387949988693e-04 15984 3357 -2.63309666699972e-04 15984 3909 -2.05626619650520e-02 15984 3933 -3.02877918445012e-01 15984 3957 -3.17500633505508e-01 15984 3981 -3.69326044520844e-02 15984 4005 -5.18975087942567e-05 15984 4485 -9.54730890178446e-05 15984 4509 -4.22827509282693e-01 15984 4533 -4.32881999660594e+00 15984 4557 -4.91357092063532e+00 15984 4581 -6.38758052884543e-01 15984 4605 -8.98842633280559e-03 15984 5085 -1.67656038496181e-03 15984 5109 -5.02981888970402e-01 15984 5133 -6.06421539807091e+00 15984 5157 -8.10899043378017e+00 15984 5181 -1.23592080630089e+00 15984 5205 -6.49201867337133e-03 15984 5685 -1.91124497901625e-04 15984 5709 -7.41832630423739e-02 15984 5733 -9.86091564195395e-01 15984 5757 -1.24236010428431e+00 15984 5781 -2.21176604075137e-01 15984 5805 -2.73173367878578e-05 15984 6309 -1.44862846263400e-07 15984 6333 -4.83582745070669e-03 15984 6357 -1.85885487822359e-02 15984 6381 -1.50947173666037e-03 15984 15984 8.65632096176572e+00 15984 15120 2.07328938265866e-02 15984 15144 1.40941803689101e-01 15984 15168 2.70563746681643e-01 15984 15192 1.29169985678908e-01 15984 15216 1.77899393240385e-02 15984 15528 1.87065967598063e-01 15984 15552 1.36581515747559e+00 15984 15576 2.83315650998109e+00 15984 15600 1.32109286328214e+00 15984 15624 1.75885394049701e-01 15984 15936 4.58342691413074e-01 15984 15960 3.51831670951067e+00 15984 16008 3.51772392353504e+00 15984 16032 4.58194494919168e-01 15984 16344 1.88423305970196e-01 15984 16368 1.47878048249849e+00 15984 16392 3.27950601151832e+00 15984 16416 1.48802194292694e+00 15984 16440 1.90733671077308e-01 15984 16752 2.10722284196199e-02 15984 16776 1.69183134944827e-01 15984 16800 3.82151122065949e-01 15984 16824 1.70902255590108e-01 15984 16848 2.15020085809401e-02 15985 15985 1.00000000000000e+00 15986 15986 1.00000000000000e+00 15987 15987 1.00000000000000e+00 15988 15988 1.00000000000000e+00 15989 15989 1.00000000000000e+00 15990 15990 1.00000000000000e+00 15991 15991 1.00000000000000e+00 15992 15992 1.00000000000000e+00 15993 15993 1.00000000000000e+00 15994 15994 1.00000000000000e+00 15995 15995 1.00000000000000e+00 15996 15996 1.00000000000000e+00 15997 15997 1.00000000000000e+00 15998 15998 1.00000000000000e+00 15999 15999 1.00000000000000e+00 16000 16000 1.00000000000000e+00 16001 16001 1.00000000000000e+00 16002 16002 1.00000000000000e+00 16003 16003 1.00000000000000e+00 16004 16004 1.00000000000000e+00 16005 16005 1.00000000000000e+00 16006 16006 1.00000000000000e+00 16007 16007 1.00000000000000e+00 16008 3333 -4.94664904690000e-10 16008 3357 -1.38577897776000e-09 16008 3933 -9.12151484469943e-03 16008 3957 -6.49202412504744e-02 16008 3981 -3.13274163014303e-02 16008 4005 -2.27316425110599e-04 16008 4509 -1.64331298995035e-03 16008 4533 -5.76961529729774e-01 16008 4557 -2.61950144724899e+00 16008 4581 -1.62177710123623e+00 16008 4605 -1.03095708974912e-01 16008 4629 -2.09120147080725e-04 16008 5109 -2.33917155530080e-02 16008 5133 -1.72365237570311e+00 16008 5157 -1.02624281112437e+01 16008 5181 -6.10453891104462e+00 16008 5205 -3.92717788799692e-01 16008 5229 -3.54822158744661e-04 16008 5709 -1.06321116976911e-02 16008 5733 -6.46169679302493e-01 16008 5757 -3.59514649502361e+00 16008 5781 -2.35758391105407e+00 16008 5805 -1.67675406492193e-01 16008 5829 -3.67222075893600e-08 16008 6309 -5.74695123481400e-08 16008 6333 -1.37345708174827e-02 16008 6357 -1.28155566331301e-01 16008 6381 -8.64757018219475e-02 16008 6405 -1.78015374464237e-03 16008 6957 -6.50044912846570e-07 16008 6981 -2.45216359375897e-06 16008 16008 9.19275053062589e+00 16008 15144 1.45025570956886e-02 16008 15168 1.29169985678908e-01 16008 15192 3.18619044738261e-01 16008 15216 1.49069591127981e-01 16008 15240 1.94774584579568e-02 16008 15552 1.54387821770829e-01 16008 15576 1.32109286328214e+00 16008 15600 3.14651504285886e+00 16008 15624 1.41538524136981e+00 16008 15648 1.77960916292746e-01 16008 15960 4.21236485964575e-01 16008 15984 3.51772392353504e+00 16008 16032 3.59438648349406e+00 16008 16056 4.40402125954329e-01 16008 16368 1.81271814654422e-01 16008 16392 1.48802194292694e+00 16008 16416 3.41594298496312e+00 16008 16440 1.49466441659606e+00 16008 16464 1.82932433071703e-01 16008 16776 2.12235553165868e-02 16008 16800 1.70902255590108e-01 16008 16824 3.85976030264325e-01 16008 16848 1.68889384934545e-01 16008 16872 2.07203376526960e-02 16009 16009 1.00000000000000e+00 16010 16010 1.00000000000000e+00 16011 16011 1.00000000000000e+00 16012 16012 1.00000000000000e+00 16013 16013 1.00000000000000e+00 16014 16014 1.00000000000000e+00 16015 16015 1.00000000000000e+00 16016 16016 1.00000000000000e+00 16017 16017 1.00000000000000e+00 16018 16018 1.00000000000000e+00 16019 16019 1.00000000000000e+00 16020 16020 1.00000000000000e+00 16021 16021 1.00000000000000e+00 16022 16022 1.00000000000000e+00 16023 16023 1.00000000000000e+00 16024 16024 1.00000000000000e+00 16025 16025 1.00000000000000e+00 16026 16026 1.00000000000000e+00 16027 16027 1.00000000000000e+00 16028 16028 1.00000000000000e+00 16029 16029 1.00000000000000e+00 16030 16030 1.00000000000000e+00 16031 16031 1.00000000000000e+00 16032 3957 -3.70637046823079e-03 16032 3981 -6.34375125082232e-03 16032 4005 -1.30941825009837e-04 16032 4533 -9.14157579495089e-03 16032 4557 -4.38209835369890e-01 16032 4581 -9.67865603429280e-01 16032 4605 -3.02145747279514e-01 16032 4629 -4.02463253813659e-03 16032 4653 -1.90423473400000e-11 16032 5109 -3.49414465273950e-07 16032 5133 -1.36403831570534e-01 16032 5157 -3.53361738223860e+00 16032 5181 -8.73478129569143e+00 16032 5205 -2.24353417678795e+00 16032 5229 -5.62077263860387e-02 16032 5253 -1.37368931380000e-10 16032 5709 -4.68288025480883e-06 16032 5733 -1.16903644012219e-01 16032 5757 -2.73881420483962e+00 16032 5781 -7.47852153566625e+00 16032 5805 -2.31875979400017e+00 16032 5829 -4.79131606910222e-02 16032 6309 -5.66768020861000e-09 16032 6333 -5.17996492292173e-03 16032 6357 -2.64974126596210e-01 16032 6381 -6.49578675580661e-01 16032 6405 -2.16006340598431e-01 16032 6429 -1.04490660266624e-03 16032 6957 -2.04089667481583e-05 16032 6981 -2.36917694260567e-03 16032 7005 -1.06285179056377e-03 16032 16032 8.94270722031870e+00 16032 15168 1.77899393240385e-02 16032 15192 1.49069591127981e-01 16032 15216 3.43022145245691e-01 16032 15240 1.32281316209200e-01 16032 15264 1.35928705943433e-02 16032 15576 1.75885394049701e-01 16032 15600 1.41538524136981e+00 16032 15624 3.17831707809936e+00 16032 15648 1.33207175863362e+00 16032 15672 1.55057023365655e-01 16032 15984 4.58194494919168e-01 16032 16008 3.59438648349406e+00 16032 16056 3.51392334433735e+00 16032 16080 4.38078710129992e-01 16032 16392 1.90733671077308e-01 16032 16416 1.49466441659606e+00 16032 16440 3.30531284354298e+00 16032 16464 1.48237070556027e+00 16032 16488 1.87660243318361e-01 16032 16800 2.15020085809401e-02 16032 16824 1.68889384934545e-01 16032 16848 3.74771086606596e-01 16032 16872 1.69856052940863e-01 16032 16896 2.17436755825198e-02 16033 16033 1.00000000000000e+00 16034 16034 1.00000000000000e+00 16035 16035 1.00000000000000e+00 16036 16036 1.00000000000000e+00 16037 16037 1.00000000000000e+00 16038 16038 1.00000000000000e+00 16039 16039 1.00000000000000e+00 16040 16040 1.00000000000000e+00 16041 16041 1.00000000000000e+00 16042 16042 1.00000000000000e+00 16043 16043 1.00000000000000e+00 16044 16044 1.00000000000000e+00 16045 16045 1.00000000000000e+00 16046 16046 1.00000000000000e+00 16047 16047 1.00000000000000e+00 16048 16048 1.00000000000000e+00 16049 16049 1.00000000000000e+00 16050 16050 1.00000000000000e+00 16051 16051 1.00000000000000e+00 16052 16052 1.00000000000000e+00 16053 16053 1.00000000000000e+00 16054 16054 1.00000000000000e+00 16055 16055 1.00000000000000e+00 16056 3957 -1.83644152629410e-07 16056 3981 -1.13643062235915e-04 16056 4005 -1.97635568482039e-05 16056 4557 -1.02084568245078e-02 16056 4581 -1.70527780808149e-01 16056 4605 -1.67023864717950e-01 16056 4629 -1.48604071463111e-02 16056 4653 -1.74276804760186e-06 16056 5133 -4.38145079191052e-05 16056 5157 -3.59725190024005e-01 16056 5181 -3.48549779286629e+00 16056 5205 -3.72294246617872e+00 16056 5229 -4.87838300554062e-01 16056 5253 -7.04889861285746e-03 16056 5733 -1.95469579268319e-03 16056 5757 -5.91340677496699e-01 16056 5781 -6.98854935785907e+00 16056 5805 -8.83501779089219e+00 16056 5829 -1.23817040319277e+00 16056 5853 -7.88893963817192e-03 16056 6333 -4.92803893296462e-04 16056 6357 -1.26225497284196e-01 16056 6381 -1.52988192885990e+00 16056 6405 -1.86663739218363e+00 16056 6429 -3.19772793067175e-01 16056 6453 -8.75407316449945e-05 16056 6957 -7.26598831971766e-05 16056 6981 -1.82366467804074e-02 16056 7005 -4.20474139306109e-02 16056 7029 -3.21498529089220e-03 16056 16056 8.91745842228485e+00 16056 15192 1.94774584579568e-02 16056 15216 1.32281316209200e-01 16056 15240 2.57920772334754e-01 16056 15264 1.38201019846592e-01 16056 15288 2.09573843673048e-02 16056 15600 1.77960916292746e-01 16056 15624 1.33207175863362e+00 16056 15648 2.84901195706920e+00 16056 15672 1.38078276116629e+00 16056 15696 1.90138666925913e-01 16056 16008 4.40402125954329e-01 16056 16032 3.51392334433735e+00 16056 16080 3.62350257752149e+00 16056 16104 4.67796934250362e-01 16056 16416 1.82932433071703e-01 16056 16440 1.48237070556027e+00 16056 16464 3.37821758384738e+00 16056 16488 1.52152600400077e+00 16056 16512 1.92721257681826e-01 16056 16824 2.07203376526960e-02 16056 16848 1.69856052940863e-01 16056 16872 3.90222179029296e-01 16056 16896 1.73386830555212e-01 16056 16920 2.16030320562831e-02 16057 16057 1.00000000000000e+00 16058 16058 1.00000000000000e+00 16059 16059 1.00000000000000e+00 16060 16060 1.00000000000000e+00 16061 16061 1.00000000000000e+00 16062 16062 1.00000000000000e+00 16063 16063 1.00000000000000e+00 16064 16064 1.00000000000000e+00 16065 16065 1.00000000000000e+00 16066 16066 1.00000000000000e+00 16067 16067 1.00000000000000e+00 16068 16068 1.00000000000000e+00 16069 16069 1.00000000000000e+00 16070 16070 1.00000000000000e+00 16071 16071 1.00000000000000e+00 16072 16072 1.00000000000000e+00 16073 16073 1.00000000000000e+00 16074 16074 1.00000000000000e+00 16075 16075 1.00000000000000e+00 16076 16076 1.00000000000000e+00 16077 16077 1.00000000000000e+00 16078 16078 1.00000000000000e+00 16079 16079 1.00000000000000e+00 16080 4581 -4.21211943045404e-03 16080 4605 -3.06935392903597e-02 16080 4629 -1.07855649151755e-02 16080 4653 -7.17169031686507e-06 16080 5157 -1.04604514369131e-03 16080 5181 -4.36925577003898e-01 16080 5205 -1.87862984396718e+00 16080 5229 -1.20726376709728e+00 16080 5253 -6.26822243240944e-02 16080 5277 -8.40619835414287e-05 16080 5757 -2.47456816655720e-02 16080 5781 -1.87406138757865e+00 16080 5805 -1.02349311736184e+01 16080 5829 -5.68289186565247e+00 16080 5853 -3.17162331399189e-01 16080 5877 -2.64700801715137e-04 16080 6357 -1.72064983002776e-02 16080 6381 -9.05256029699004e-01 16080 6405 -4.91376916156046e+00 16080 6429 -3.01355636355895e+00 16080 6453 -1.94606147503335e-01 16080 6477 -6.05285648237220e-07 16080 6957 -2.09075466857402e-05 16080 6981 -3.85963268737253e-02 16080 7005 -2.53257024583947e-01 16080 7029 -1.55321867795444e-01 16080 7053 -4.05950296912952e-03 16080 7605 -4.00601221406906e-05 16080 7629 -9.92519568879605e-05 16080 16080 9.35462019827755e+00 16080 15216 1.35928705943433e-02 16080 15240 1.38201019846592e-01 16080 15264 3.65880666997878e-01 16080 15288 1.51708123575850e-01 16080 15312 1.69696465266578e-02 16080 15624 1.55057023365655e-01 16080 15648 1.38078276116629e+00 16080 15672 3.36345328386550e+00 16080 15696 1.42526502644434e+00 16080 15720 1.66177589685169e-01 16080 16032 4.38078710129992e-01 16080 16056 3.62350257752149e+00 16080 16104 3.59834989756739e+00 16080 16128 4.31790540141469e-01 16080 16440 1.87660243318361e-01 16080 16464 1.52152600400077e+00 16080 16488 3.45599888700882e+00 16080 16512 1.51007911385205e+00 16080 16536 1.84798520781182e-01 16080 16848 2.17436755825198e-02 16080 16872 1.73386830555212e-01 16080 16896 3.89017067783710e-01 16080 16920 1.72911645427777e-01 16080 16944 2.16248793006611e-02 16081 16081 1.00000000000000e+00 16082 16082 1.00000000000000e+00 16083 16083 1.00000000000000e+00 16084 16084 1.00000000000000e+00 16085 16085 1.00000000000000e+00 16086 16086 1.00000000000000e+00 16087 16087 1.00000000000000e+00 16088 16088 1.00000000000000e+00 16089 16089 1.00000000000000e+00 16090 16090 1.00000000000000e+00 16091 16091 1.00000000000000e+00 16092 16092 1.00000000000000e+00 16093 16093 1.00000000000000e+00 16094 16094 1.00000000000000e+00 16095 16095 1.00000000000000e+00 16096 16096 1.00000000000000e+00 16097 16097 1.00000000000000e+00 16098 16098 1.00000000000000e+00 16099 16099 1.00000000000000e+00 16100 16100 1.00000000000000e+00 16101 16101 1.00000000000000e+00 16102 16102 1.00000000000000e+00 16103 16103 1.00000000000000e+00 16104 4605 -1.52616840616767e-03 16104 4629 -1.90946386181233e-03 16104 4653 -2.54630692488370e-06 16104 5181 -5.08853050101870e-03 16104 5205 -2.94052989407066e-01 16104 5229 -5.87225973958005e-01 16104 5253 -1.57674992663913e-01 16104 5277 -1.54634762008399e-03 16104 5757 -6.02256811617600e-08 16104 5781 -1.32485464574332e-01 16104 5805 -3.24277390371013e+00 16104 5829 -7.16654941689187e+00 16104 5853 -1.76103804557894e+00 16104 5877 -4.67880445595033e-02 16104 6357 -1.03954862092585e-05 16104 6381 -1.53167292222669e-01 16104 6405 -3.40661737920491e+00 16104 6429 -8.89099175463575e+00 16104 6453 -2.67231919083988e+00 16104 6477 -5.51496939522462e-02 16104 6957 -7.74689897242060e-07 16104 6981 -1.29970123836128e-02 16104 7005 -4.69701797998808e-01 16104 7029 -1.09956716241355e+00 16104 7053 -3.75923620321782e-01 16104 7077 -2.41565249248573e-03 16104 7605 -4.19129189440235e-04 16104 7629 -9.54620552641513e-03 16104 7653 -3.26638239810661e-03 16104 16104 8.86754832094195e+00 16104 15240 2.09573843673048e-02 16104 15264 1.51708123575850e-01 16104 15288 3.07723361719116e-01 16104 15312 1.28885117807780e-01 16104 15336 1.52516329252871e-02 16104 15648 1.90138666925913e-01 16104 15672 1.42526502644434e+00 16104 15696 3.02295807149273e+00 16104 15720 1.36062223715692e+00 16104 15744 1.73977969604057e-01 16104 16056 4.67796934250362e-01 16104 16080 3.59834989756739e+00 16104 16128 3.69157313827719e+00 16104 16152 4.91102744427811e-01 16104 16464 1.92721257681826e-01 16104 16488 1.51007911385205e+00 16104 16512 3.35833046764726e+00 16104 16536 1.57452559299059e+00 16104 16560 2.08832877466460e-01 16104 16872 2.16030320562831e-02 16104 16896 1.72911645427777e-01 16104 16920 3.91566460757748e-01 16104 16944 1.82360956766196e-01 16104 16968 2.39653598908879e-02 16105 16105 1.00000000000000e+00 16106 16106 1.00000000000000e+00 16107 16107 1.00000000000000e+00 16108 16108 1.00000000000000e+00 16109 16109 1.00000000000000e+00 16110 16110 1.00000000000000e+00 16111 16111 1.00000000000000e+00 16112 16112 1.00000000000000e+00 16113 16113 1.00000000000000e+00 16114 16114 1.00000000000000e+00 16115 16115 1.00000000000000e+00 16116 16116 1.00000000000000e+00 16117 16117 1.00000000000000e+00 16118 16118 1.00000000000000e+00 16119 16119 1.00000000000000e+00 16120 16120 1.00000000000000e+00 16121 16121 1.00000000000000e+00 16122 16122 1.00000000000000e+00 16123 16123 1.00000000000000e+00 16124 16124 1.00000000000000e+00 16125 16125 1.00000000000000e+00 16126 16126 1.00000000000000e+00 16127 16127 1.00000000000000e+00 16128 4605 -2.15379764853000e-09 16128 4629 -2.69616545916973e-06 16128 4653 -2.00903761667810e-07 16128 5205 -4.50836102338906e-03 16128 5229 -8.82386895391259e-02 16128 5253 -8.56064705006728e-02 16128 5277 -5.29244362974382e-03 16128 5781 -1.71530090327614e-05 16128 5805 -2.94623651010291e-01 16128 5829 -2.74934680092522e+00 16128 5853 -2.92410451374053e+00 16128 5877 -3.82150713253358e-01 16128 5901 -4.96490615160433e-03 16128 6381 -2.24873890229680e-03 16128 6405 -6.94820792058696e-01 16128 6429 -8.19445174042308e+00 16128 6453 -1.00015592700934e+01 16128 6477 -1.32287667106873e+00 16128 6501 -8.94430899049745e-03 16128 6981 -1.05007272993043e-03 16128 7005 -2.12494015931442e-01 16128 7029 -2.47405737344558e+00 16128 7053 -3.06527398950036e+00 16128 7077 -5.04462076015971e-01 16128 7101 -2.24151561366785e-04 16128 7605 -1.08121285912415e-03 16128 7629 -6.10196194821591e-02 16128 7653 -1.04269346786835e-01 16128 7677 -8.39440981508353e-03 16128 8253 -1.76489563238000e-09 16128 8277 -2.45391655890000e-10 16128 16128 9.84095293991459e+00 16128 15264 1.69696465266578e-02 16128 15288 1.28885117807780e-01 16128 15312 2.84738593169654e-01 16128 15336 1.55977811054759e-01 16128 15360 2.37428198384026e-02 16128 15672 1.66177589685169e-01 16128 15696 1.36062223715692e+00 16128 15720 3.16981381131377e+00 16128 15744 1.57586671027073e+00 16128 15768 2.19988707963619e-01 16128 16080 4.31790540141469e-01 16128 16104 3.69157313827719e+00 16128 16152 4.17048493342262e+00 16128 16176 5.51518488927823e-01 16128 16488 1.84798520781182e-01 16128 16512 1.57452559299059e+00 16128 16536 3.76196580745217e+00 16128 16560 1.77869649869605e+00 16128 16584 2.35841247207546e-01 16128 16896 2.16248793006611e-02 16128 16920 1.82360956766196e-01 16128 16944 4.32776592204251e-01 16128 16968 2.06685258161089e-01 16128 16992 2.77059546493843e-02 16129 16129 1.00000000000000e+00 16130 16130 1.00000000000000e+00 16131 16131 1.00000000000000e+00 16132 16132 1.00000000000000e+00 16133 16133 1.00000000000000e+00 16134 16134 1.00000000000000e+00 16135 16135 1.00000000000000e+00 16136 16136 1.00000000000000e+00 16137 16137 1.00000000000000e+00 16138 16138 1.00000000000000e+00 16139 16139 1.00000000000000e+00 16140 16140 1.00000000000000e+00 16141 16141 1.00000000000000e+00 16142 16142 1.00000000000000e+00 16143 16143 1.00000000000000e+00 16144 16144 1.00000000000000e+00 16145 16145 1.00000000000000e+00 16146 16146 1.00000000000000e+00 16147 16147 1.00000000000000e+00 16148 16148 1.00000000000000e+00 16149 16149 1.00000000000000e+00 16150 16150 1.00000000000000e+00 16151 16151 1.00000000000000e+00 16152 5229 -2.27056743930506e-03 16152 5253 -1.42858512538457e-02 16152 5277 -2.68203129603541e-03 16152 5805 -6.20042783016770e-04 16152 5829 -3.35634600221829e-01 16152 5853 -1.39480511332754e+00 16152 5877 -8.81159512977729e-01 16152 5901 -3.66291396137368e-02 16152 5925 -2.65678797598056e-05 16152 6405 -2.67986772911741e-02 16152 6429 -2.15460430129389e+00 16152 6453 -1.09547396060214e+01 16152 6477 -5.27654274785916e+00 16152 6501 -2.20635404010206e-01 16152 6525 -1.91406254721875e-04 16152 7005 -2.79573555867765e-02 16152 7029 -1.43097519682750e+00 16152 7053 -7.34164664187943e+00 16152 7077 -3.33774787695749e+00 16152 7101 -1.49049353647891e-01 16152 7125 -2.92525320334740e-06 16152 7605 -2.81280434771757e-04 16152 7629 -1.08175470687362e-01 16152 7653 -5.12343280474778e-01 16152 7677 -2.26898724073119e-01 16152 7701 -5.78613424267488e-03 16152 8253 -3.96784765631894e-04 16152 8277 -6.88591247467996e-04 16152 8301 -2.84663206480000e-10 16152 16152 1.06033020384100e+01 16152 15288 1.52516329252871e-02 16152 15312 1.55977811054759e-01 16152 15336 4.10608961742379e-01 16152 15360 1.56860124964212e-01 16152 15384 1.54722114026505e-02 16152 15696 1.73977969604057e-01 16152 15720 1.57586671027072e+00 16152 15744 3.81874972158639e+00 16152 15768 1.37976453011186e+00 16152 15792 1.24952424564340e-01 16152 16104 4.91102744427811e-01 16152 16128 4.17048493342262e+00 16152 16176 3.35768784025791e+00 16152 16200 2.87903471136637e-01 16152 16512 2.08832877466460e-01 16152 16536 1.77869649869605e+00 16152 16560 4.12606418741716e+00 16152 16584 1.51845040734970e+00 16152 16608 1.43771354629874e-01 16152 16920 2.39653598908879e-02 16152 16944 2.06685258161089e-01 16152 16968 4.87437578200071e-01 16152 16992 1.91531594273673e-01 16152 17016 2.01769439190340e-02 16153 16153 1.00000000000000e+00 16154 16154 1.00000000000000e+00 16155 16155 1.00000000000000e+00 16156 16156 1.00000000000000e+00 16157 16157 1.00000000000000e+00 16158 16158 1.00000000000000e+00 16159 16159 1.00000000000000e+00 16160 16160 1.00000000000000e+00 16161 16161 1.00000000000000e+00 16162 16162 1.00000000000000e+00 16163 16163 1.00000000000000e+00 16164 16164 1.00000000000000e+00 16165 16165 1.00000000000000e+00 16166 16166 1.00000000000000e+00 16167 16167 1.00000000000000e+00 16168 16168 1.00000000000000e+00 16169 16169 1.00000000000000e+00 16170 16170 1.00000000000000e+00 16171 16171 1.00000000000000e+00 16172 16172 1.00000000000000e+00 16173 16173 1.00000000000000e+00 16174 16174 1.00000000000000e+00 16175 16175 1.00000000000000e+00 16176 5253 -4.01571096527226e-04 16176 5277 -3.67982902529285e-04 16176 5829 -2.80648045101120e-03 16176 5853 -2.02228954966398e-01 16176 5877 -3.64114134599598e-01 16176 5901 -1.04039244321091e-01 16176 5925 -1.19559189827223e-03 16176 6405 -6.13896168510000e-10 16176 6429 -1.44954846646002e-01 16176 6453 -2.84276194806438e+00 16176 6477 -5.66071931761925e+00 16176 6501 -2.45302092463149e+00 16176 6525 -1.39520399675063e-02 16176 7005 -2.30368090416415e-05 16176 7029 -2.34219438433409e-01 16176 7053 -3.72278010225788e+00 16176 7077 -1.32830061635961e+01 16176 7101 -4.43068966198729e+00 16176 7125 -5.02259234512130e-04 16176 7605 -5.59793347357092e-06 16176 7629 -3.12514410067265e-02 16176 7653 -8.37895207133297e-01 16176 7677 -2.68385561620026e+00 16176 7701 -3.49593855422119e-01 16176 8253 -6.21525660309237e-03 16176 8277 -1.86238563130763e-02 16176 8301 -2.40186428761700e-07 16176 16176 9.25883673882556e+00 16176 15312 2.37428198384026e-02 16176 15336 1.56860124964212e-01 16176 15360 3.79768016392767e-01 16176 15384 2.78828473834515e-01 16176 15720 2.19988707963619e-01 16176 15744 1.37976453011185e+00 16176 15768 3.37521270349820e+00 16176 15792 2.81178010326755e+00 16176 16128 5.51518488927823e-01 16176 16152 3.35768784025791e+00 16176 16200 7.35333930796930e+00 16176 16536 2.35841247207546e-01 16176 16560 1.51845040734970e+00 16176 16584 3.67416532082424e+00 16176 16608 2.85105021759681e+00 16176 16944 2.77059546493843e-02 16176 16968 1.91531594273673e-01 16176 16992 4.54506170724276e-01 16176 17016 2.88646002416831e-01 16177 16177 1.00000000000000e+00 16178 16178 1.00000000000000e+00 16179 16179 1.00000000000000e+00 16180 16180 1.00000000000000e+00 16181 16181 1.00000000000000e+00 16182 16182 1.00000000000000e+00 16183 16183 1.00000000000000e+00 16184 16184 1.00000000000000e+00 16185 16185 1.00000000000000e+00 16186 16186 1.00000000000000e+00 16187 16187 1.00000000000000e+00 16188 16188 1.00000000000000e+00 16189 16189 1.00000000000000e+00 16190 16190 1.00000000000000e+00 16191 16191 1.00000000000000e+00 16192 16192 1.00000000000000e+00 16193 16193 1.00000000000000e+00 16194 16194 1.00000000000000e+00 16195 16195 1.00000000000000e+00 16196 16196 1.00000000000000e+00 16197 16197 1.00000000000000e+00 16198 16198 1.00000000000000e+00 16199 16199 1.00000000000000e+00 16200 5853 -1.65556807285416e-03 16200 5877 -5.34115908914603e-02 16200 5901 -8.07620712877373e-02 16200 5925 -2.20520863822583e-03 16200 6429 -3.90079655830218e-06 16200 6453 -1.57084032693362e-01 16200 6477 -3.43113164804846e+00 16200 6501 -3.59414605494446e+00 16200 6525 -2.65642361519594e-02 16200 7029 -2.16046850008652e-03 16200 7053 -7.56106341981174e-01 16200 7077 -1.60834728731340e+01 16200 7101 -7.82386178903486e+00 16200 7125 -9.84041696600829e-04 16200 7629 -1.73196606922714e-03 16200 7653 -4.83551374784505e-01 16200 7677 -3.99767481908086e+00 16200 7701 -6.58684771145513e-01 16200 8253 -9.65306573404792e-03 16200 8277 -3.24275802740597e-02 16200 8301 -4.78380215078050e-07 16200 16200 1.36913543179821e+01 16200 15336 1.54722114026505e-02 16200 15360 2.78828473834515e-01 16200 15384 4.49351467850477e-01 16200 15744 1.24952424564340e-01 16200 15768 2.81178010326755e+00 16200 15792 4.74889323458471e+00 16200 16152 2.87903471136637e-01 16200 16176 7.35333930796930e+00 16200 16560 1.43771354629874e-01 16200 16584 2.85105021759681e+00 16200 16608 4.69570095278449e+00 16200 16968 2.01769439190340e-02 16200 16992 2.88646002416831e-01 16200 17016 4.36053397400423e-01 16201 16201 1.00000000000000e+00 16202 16202 1.00000000000000e+00 16203 16203 1.00000000000000e+00 16204 16204 1.00000000000000e+00 16205 16205 1.00000000000000e+00 16206 16206 1.00000000000000e+00 16207 16207 1.00000000000000e+00 16208 16208 1.00000000000000e+00 16209 16209 1.00000000000000e+00 16210 16210 1.00000000000000e+00 16211 16211 1.00000000000000e+00 16212 16212 1.00000000000000e+00 16213 16213 1.00000000000000e+00 16214 16214 1.00000000000000e+00 16215 16215 1.00000000000000e+00 16216 16216 1.00000000000000e+00 16217 16217 1.00000000000000e+00 16218 16218 1.00000000000000e+00 16219 16219 1.00000000000000e+00 16220 16220 1.00000000000000e+00 16221 16221 1.00000000000000e+00 16222 16222 1.00000000000000e+00 16223 16223 1.00000000000000e+00 16224 2637 -2.11153262788651e-01 16224 2661 -1.34917509756813e-01 16224 2685 -8.02216756130927e-05 16224 3213 -5.14197856185744e-01 16224 3237 -6.70591694751832e+00 16224 3261 -1.63815643084325e+00 16224 3285 -1.25654930568486e-02 16224 3789 -1.67620106534635e-04 16224 3813 -4.44043579606690e+00 16224 3837 -1.31344205713099e+01 16224 3861 -1.28138291463891e+00 16224 3885 -8.02848167035927e-03 16224 4389 -1.60490305820052e-03 16224 4413 -2.28074346771651e+00 16224 4437 -2.36081159036054e+00 16224 4461 -1.43634132019865e-01 16224 4485 -2.19178452599104e-05 16224 4989 -3.45778598212080e-07 16224 5013 -9.96711146675233e-03 16224 5037 -1.84717084370414e-02 16224 5061 -1.22365447471562e-03 16224 16224 9.92442391351981e+00 16224 15408 6.30415134638554e-01 16224 15432 3.98307436753683e-01 16224 15456 2.37428198384017e-02 16224 15816 4.37974669532055e+00 16224 15840 2.73579568635192e+00 16224 15864 1.55977811054754e-01 16224 16248 5.45879703285370e+00 16224 16272 2.84738593169649e-01 16224 16632 5.30474276402998e+00 16224 16656 3.10346929434222e+00 16224 16680 1.28885117807777e-01 16224 17040 8.61664151815911e-01 16224 17064 4.90225838751257e-01 16224 17088 1.69696465266574e-02 16225 16225 1.00000000000000e+00 16226 16226 1.00000000000000e+00 16227 16227 1.00000000000000e+00 16228 16228 1.00000000000000e+00 16229 16229 1.00000000000000e+00 16230 16230 1.00000000000000e+00 16231 16231 1.00000000000000e+00 16232 16232 1.00000000000000e+00 16233 16233 1.00000000000000e+00 16234 16234 1.00000000000000e+00 16235 16235 1.00000000000000e+00 16236 16236 1.00000000000000e+00 16237 16237 1.00000000000000e+00 16238 16238 1.00000000000000e+00 16239 16239 1.00000000000000e+00 16240 16240 1.00000000000000e+00 16241 16241 1.00000000000000e+00 16242 16242 1.00000000000000e+00 16243 16243 1.00000000000000e+00 16244 16244 1.00000000000000e+00 16245 16245 1.00000000000000e+00 16246 16246 1.00000000000000e+00 16247 16247 1.00000000000000e+00 16248 2637 -1.22950809007927e-01 16248 2661 -9.62596793221455e-02 16248 2685 -3.56454239513493e-04 16248 3213 -2.75622480796976e-01 16248 3237 -4.52174059881932e+00 16248 3261 -2.39548250059446e+00 16248 3285 -1.60508309066097e-01 16248 3309 -3.76985077331550e-04 16248 3789 -8.45132164331546e-05 16248 3813 -2.51925394366342e+00 16248 3837 -1.16102424187959e+01 16248 3861 -5.48334295921221e+00 16248 3885 -5.38961450759740e-01 16248 3909 -6.38658904564033e-04 16248 4389 -8.11888108207356e-04 16248 4413 -1.42156879861829e+00 16248 4437 -3.50368766140365e+00 16248 4461 -2.25180646794102e+00 16248 4485 -2.00180555053652e-01 16248 4509 -9.46477160706400e-08 16248 4989 -1.80427590875910e-07 16248 5013 -1.38478634824622e-02 16248 5037 -1.23074941957581e-01 16248 5061 -9.94144917253992e-02 16248 5085 -2.14648723749301e-03 16248 5637 -6.36605257387310e-07 16248 5661 -2.55024749279354e-06 16248 16248 8.22345368046088e+00 16248 15408 3.98307436753683e-01 16248 15432 5.62807553266964e-01 16248 15456 2.19988707963599e-01 16248 15480 3.12543571524980e-02 16248 15816 2.73579568635192e+00 16248 15840 3.78957606445548e+00 16248 15864 1.57586671027065e+00 16248 15888 2.37988866512904e-01 16248 16224 5.45879703285370e+00 16248 16272 3.16981381131378e+00 16248 16296 5.07714859658779e-01 16248 16632 3.10346929434222e+00 16248 16656 3.56739673796147e+00 16248 16680 1.36062223715688e+00 16248 16704 2.11270441481440e-01 16248 17040 4.90225838751257e-01 16248 17064 5.07262721643464e-01 16248 17088 1.66177589685158e-01 16248 17112 2.45747508946320e-02 16249 16249 1.00000000000000e+00 16250 16250 1.00000000000000e+00 16251 16251 1.00000000000000e+00 16252 16252 1.00000000000000e+00 16253 16253 1.00000000000000e+00 16254 16254 1.00000000000000e+00 16255 16255 1.00000000000000e+00 16256 16256 1.00000000000000e+00 16257 16257 1.00000000000000e+00 16258 16258 1.00000000000000e+00 16259 16259 1.00000000000000e+00 16260 16260 1.00000000000000e+00 16261 16261 1.00000000000000e+00 16262 16262 1.00000000000000e+00 16263 16263 1.00000000000000e+00 16264 16264 1.00000000000000e+00 16265 16265 1.00000000000000e+00 16266 16266 1.00000000000000e+00 16267 16267 1.00000000000000e+00 16268 16268 1.00000000000000e+00 16269 16269 1.00000000000000e+00 16270 16270 1.00000000000000e+00 16271 16271 1.00000000000000e+00 16272 2637 -4.96490615160415e-03 16272 2661 -8.94430899049704e-03 16272 2685 -2.24151561366762e-04 16272 3213 -5.29244362974372e-03 16272 3237 -3.82150713253347e-01 16272 3261 -1.32287667106862e+00 16272 3285 -5.04462076015912e-01 16272 3309 -8.39440981508346e-03 16272 3333 -2.45391655890000e-10 16272 3789 -2.00903761667800e-07 16272 3813 -8.56064705006712e-02 16272 3837 -2.92410451374053e+00 16272 3861 -1.00015592700933e+01 16272 3885 -3.06527398950026e+00 16272 3909 -1.04269346786835e-01 16272 3933 -1.76489563238000e-09 16272 4389 -2.69616545916967e-06 16272 4413 -8.82386895391234e-02 16272 4437 -2.74934680092513e+00 16272 4461 -8.19445174042288e+00 16272 4485 -2.47405737344552e+00 16272 4509 -6.10196194821578e-02 16272 4989 -2.15379764853000e-09 16272 5013 -4.50836102338880e-03 16272 5037 -2.94623651010266e-01 16272 5061 -6.94820792058661e-01 16272 5085 -2.12494015931437e-01 16272 5109 -1.08121285912410e-03 16272 5637 -1.71530090327611e-05 16272 5661 -2.24873890229679e-03 16272 5685 -1.05007272993043e-03 16272 16272 9.84095293991468e+00 16272 15408 2.37428198384017e-02 16272 15432 2.19988707963599e-01 16272 15456 5.51518488927754e-01 16272 15480 2.35841247207531e-01 16272 15504 2.77059546493849e-02 16272 15816 1.55977811054754e-01 16272 15840 1.57586671027065e+00 16272 15864 4.17048493342239e+00 16272 15888 1.77869649869598e+00 16272 15912 2.06685258161086e-01 16272 16224 2.84738593169649e-01 16272 16248 3.16981381131378e+00 16272 16296 3.76196580745213e+00 16272 16320 4.32776592204233e-01 16272 16632 1.28885117807777e-01 16272 16656 1.36062223715689e+00 16272 16680 3.69157313827709e+00 16272 16704 1.57452559299054e+00 16272 16728 1.82360956766191e-01 16272 17040 1.69696465266574e-02 16272 17064 1.66177589685158e-01 16272 17088 4.31790540141430e-01 16272 17112 1.84798520781172e-01 16272 17136 2.16248793006610e-02 16273 16273 1.00000000000000e+00 16274 16274 1.00000000000000e+00 16275 16275 1.00000000000000e+00 16276 16276 1.00000000000000e+00 16277 16277 1.00000000000000e+00 16278 16278 1.00000000000000e+00 16279 16279 1.00000000000000e+00 16280 16280 1.00000000000000e+00 16281 16281 1.00000000000000e+00 16282 16282 1.00000000000000e+00 16283 16283 1.00000000000000e+00 16284 16284 1.00000000000000e+00 16285 16285 1.00000000000000e+00 16286 16286 1.00000000000000e+00 16287 16287 1.00000000000000e+00 16288 16288 1.00000000000000e+00 16289 16289 1.00000000000000e+00 16290 16290 1.00000000000000e+00 16291 16291 1.00000000000000e+00 16292 16292 1.00000000000000e+00 16293 16293 1.00000000000000e+00 16294 16294 1.00000000000000e+00 16295 16295 1.00000000000000e+00 16296 2637 -2.30301308694370e-07 16296 2661 -1.92627463307723e-04 16296 2685 -3.60143894674400e-05 16296 3237 -1.29804131789667e-02 16296 3261 -2.65653515247310e-01 16296 3285 -3.15687715384813e-01 16296 3309 -3.02687018809988e-02 16296 3333 -2.75079980372742e-06 16296 3813 -4.51231632600826e-05 16296 3837 -4.02728245207740e-01 16296 3861 -3.98187100407156e+00 16296 3885 -4.89729124264456e+00 16296 3909 -7.08432062787709e-01 16296 3933 -8.79520094271789e-03 16296 4413 -2.12602681745371e-03 16296 4437 -6.47334861429473e-01 16296 4461 -6.94499300146922e+00 16296 4485 -8.63045626787820e+00 16296 4509 -1.19479722097738e+00 16296 4533 -9.44696404610494e-03 16296 5013 -5.31919679444214e-04 16296 5037 -1.30904245935941e-01 16296 5061 -1.48312847787423e+00 16296 5085 -1.69477015015129e+00 16296 5109 -2.70400200659882e-01 16296 5133 -8.98871072744665e-05 16296 5637 -5.96109218410207e-05 16296 5661 -1.68136550660145e-02 16296 5685 -3.91570541987386e-02 16296 5709 -3.08070724295743e-03 16296 16296 8.82054501110448e+00 16296 15432 3.12543571524980e-02 16296 15456 2.35841247207531e-01 16296 15480 4.99146479364022e-01 16296 15504 2.09211209883004e-01 16296 15528 2.45968478213660e-02 16296 15840 2.37988866512904e-01 16296 15864 1.77869649869598e+00 16296 15888 3.72922002063173e+00 16296 15912 1.56380912680985e+00 16296 15936 1.84267023541371e-01 16296 16248 5.07714859658779e-01 16296 16272 3.76196580745213e+00 16296 16320 3.28472507352777e+00 16296 16344 3.88404676177692e-01 16296 16656 2.11270441481440e-01 16296 16680 1.57452559299054e+00 16296 16704 3.29608257932726e+00 16296 16728 1.39759114541159e+00 16296 16752 1.67036829586704e-01 16296 17064 2.45747508946320e-02 16296 17088 1.84798520781172e-01 16296 17112 3.90862119037907e-01 16296 17136 1.67656714533441e-01 16296 17160 2.02892993326993e-02 16297 16297 1.00000000000000e+00 16298 16298 1.00000000000000e+00 16299 16299 1.00000000000000e+00 16300 16300 1.00000000000000e+00 16301 16301 1.00000000000000e+00 16302 16302 1.00000000000000e+00 16303 16303 1.00000000000000e+00 16304 16304 1.00000000000000e+00 16305 16305 1.00000000000000e+00 16306 16306 1.00000000000000e+00 16307 16307 1.00000000000000e+00 16308 16308 1.00000000000000e+00 16309 16309 1.00000000000000e+00 16310 16310 1.00000000000000e+00 16311 16311 1.00000000000000e+00 16312 16312 1.00000000000000e+00 16313 16313 1.00000000000000e+00 16314 16314 1.00000000000000e+00 16315 16315 1.00000000000000e+00 16316 16316 1.00000000000000e+00 16317 16317 1.00000000000000e+00 16318 16318 1.00000000000000e+00 16319 16319 1.00000000000000e+00 16320 3261 -8.24395122984949e-03 16320 3285 -5.81648819907583e-02 16320 3309 -1.62745062553764e-02 16320 3333 -1.13997207202415e-05 16320 3837 -9.09969541231139e-04 16320 3861 -4.60405244955091e-01 16320 3885 -2.11930396500524e+00 16320 3909 -1.42191071427140e+00 16320 3933 -8.96751616157894e-02 16320 3957 -1.45918259762627e-04 16320 4437 -2.30088250458341e-02 16320 4461 -1.71506375002887e+00 16320 4485 -8.88021871768787e+00 16320 4509 -5.34832249232646e+00 16320 4533 -3.96364039902606e-01 16320 4557 -4.57831467629243e-04 16320 5037 -1.62013567064915e-02 16320 5061 -8.23602821426849e-01 16320 5085 -4.23415220768885e+00 16320 5109 -2.65973954927669e+00 16320 5133 -1.90281153849869e-01 16320 5157 -1.21126830761586e-06 16320 5637 -1.67984462863557e-05 16320 5661 -3.45663066015175e-02 16320 5685 -2.32535662013761e-01 16320 5709 -1.43723768517552e-01 16320 5733 -3.82397426018655e-03 16320 6285 -3.38155601221632e-05 16320 6309 -8.79221394985299e-05 16320 16320 8.04427054762166e+00 16320 15456 2.77059546493849e-02 16320 15480 2.09211209883004e-01 16320 15504 4.47226004500338e-01 16320 15528 2.02269330121850e-01 16320 15552 2.59704847090965e-02 16320 15864 2.06685258161086e-01 16320 15888 1.56380912680985e+00 16320 15912 3.34654915774405e+00 16320 15936 1.50343418584934e+00 16320 15960 1.91591522920960e-01 16320 16272 4.32776592204233e-01 16320 16296 3.28472507352777e+00 16320 16344 3.14169525100730e+00 16320 16368 3.97019136574117e-01 16320 16680 1.82360956766191e-01 16320 16704 1.39759114541159e+00 16320 16728 3.02350107634498e+00 16320 16752 1.34235070311272e+00 16320 16776 1.68550846191473e-01 16320 17088 2.16248793006610e-02 16320 17112 1.67656714533441e-01 16320 17136 3.66463984150574e-01 16320 17160 1.61998459437696e-01 16320 17184 2.02103155267248e-02 16321 16321 1.00000000000000e+00 16322 16322 1.00000000000000e+00 16323 16323 1.00000000000000e+00 16324 16324 1.00000000000000e+00 16325 16325 1.00000000000000e+00 16326 16326 1.00000000000000e+00 16327 16327 1.00000000000000e+00 16328 16328 1.00000000000000e+00 16329 16329 1.00000000000000e+00 16330 16330 1.00000000000000e+00 16331 16331 1.00000000000000e+00 16332 16332 1.00000000000000e+00 16333 16333 1.00000000000000e+00 16334 16334 1.00000000000000e+00 16335 16335 1.00000000000000e+00 16336 16336 1.00000000000000e+00 16337 16337 1.00000000000000e+00 16338 16338 1.00000000000000e+00 16339 16339 1.00000000000000e+00 16340 16340 1.00000000000000e+00 16341 16341 1.00000000000000e+00 16342 16342 1.00000000000000e+00 16343 16343 1.00000000000000e+00 16344 3285 -1.81463814625538e-03 16344 3309 -2.36456528890254e-03 16344 3333 -4.35062775778430e-06 16344 3861 -4.02285784986327e-03 16344 3885 -2.92463126461179e-01 16344 3909 -7.70581711034155e-01 16344 3933 -2.48937627752003e-01 16344 3957 -2.80363635072941e-03 16344 4437 -3.73102447881600e-08 16344 4461 -1.07211408631076e-01 16344 4485 -2.79102250318825e+00 16344 4509 -7.17876805185175e+00 16344 4533 -2.16294920165829e+00 16344 4557 -7.60852993516091e-02 16344 4581 -7.46393400000000e-14 16344 5037 -7.48228670978528e-06 16344 5061 -1.34270192548720e-01 16344 5085 -2.98627124706644e+00 16344 5109 -7.84475762036920e+00 16344 5133 -2.32104302524860e+00 16344 5157 -6.09726191576301e-02 16344 5637 -5.47964570785970e-07 16344 5661 -1.14567772184783e-02 16344 5685 -4.23340971250767e-01 16344 5709 -9.41794062802636e-01 16344 5733 -2.95079386881862e-01 16344 5757 -1.97908944809921e-03 16344 6285 -3.25705673696310e-04 16344 6309 -7.63644529673730e-03 16344 6333 -2.69918411505039e-03 16344 16344 8.12365760161966e+00 16344 15480 2.45968478213660e-02 16344 15504 2.02269330121850e-01 16344 15528 4.66158201239839e-01 16344 15552 2.08016331128103e-01 16344 15576 2.60335980729292e-02 16344 15888 1.84267023541371e-01 16344 15912 1.50343418584934e+00 16344 15936 3.43815469624700e+00 16344 15960 1.52005931556464e+00 16344 15984 1.88423305970196e-01 16344 16296 3.88404676177692e-01 16344 16320 3.14169525100730e+00 16344 16368 3.11986350731988e+00 16344 16392 3.82946740255838e-01 16344 16704 1.67036829586704e-01 16344 16728 1.34235070311272e+00 16344 16752 3.02716923220478e+00 16344 16776 1.32747883898368e+00 16344 16800 1.63318863554444e-01 16344 17112 2.02892993326993e-02 16344 17136 1.61998459437696e-01 16344 17160 3.63411835229287e-01 16344 17184 1.59871211982864e-01 16344 17208 1.97574874689911e-02 16345 16345 1.00000000000000e+00 16346 16346 1.00000000000000e+00 16347 16347 1.00000000000000e+00 16348 16348 1.00000000000000e+00 16349 16349 1.00000000000000e+00 16350 16350 1.00000000000000e+00 16351 16351 1.00000000000000e+00 16352 16352 1.00000000000000e+00 16353 16353 1.00000000000000e+00 16354 16354 1.00000000000000e+00 16355 16355 1.00000000000000e+00 16356 16356 1.00000000000000e+00 16357 16357 1.00000000000000e+00 16358 16358 1.00000000000000e+00 16359 16359 1.00000000000000e+00 16360 16360 1.00000000000000e+00 16361 16361 1.00000000000000e+00 16362 16362 1.00000000000000e+00 16363 16363 1.00000000000000e+00 16364 16364 1.00000000000000e+00 16365 16365 1.00000000000000e+00 16366 16366 1.00000000000000e+00 16367 16367 1.00000000000000e+00 16368 3285 -1.96062915748000e-09 16368 3309 -4.68162706606915e-06 16368 3333 -4.00202380170110e-07 16368 3885 -5.36026349040975e-03 16368 3909 -1.31722113288670e-01 16368 3933 -1.43573546139141e-01 16368 3957 -9.42561470530920e-03 16368 4461 -1.33092751663790e-05 16368 4485 -2.65399292796339e-01 16368 4509 -2.64775831761198e+00 16368 4533 -3.40775270230956e+00 16368 4557 -4.95781694150880e-01 16368 4581 -5.38291298606254e-03 16368 5061 -1.93303940305551e-03 16368 5085 -6.02940997111873e-01 16368 5109 -6.49493602195029e+00 16368 5133 -8.01336539963254e+00 16368 5157 -1.11422845009597e+00 16368 5181 -9.40248882104724e-03 16368 5661 -8.99956012314765e-04 16368 5685 -1.78671550878460e-01 16368 5709 -1.93483237870043e+00 16368 5733 -2.22780410194090e+00 16368 5757 -3.54816042167562e-01 16368 5781 -2.02465739836176e-04 16368 6285 -7.98683687606907e-04 16368 6309 -4.55087334551126e-02 16368 6333 -7.37384779871932e-02 16368 6357 -5.97175117773279e-03 16368 6933 -6.06677257560000e-10 16368 6957 -9.21392776400000e-11 16368 16368 7.90720107965380e+00 16368 15504 2.59704847090965e-02 16368 15528 2.08016331128103e-01 16368 15552 4.66602452222982e-01 16368 15576 2.00511985679792e-01 16368 15600 2.40943983470187e-02 16368 15912 1.91591522920960e-01 16368 15936 1.52005931556464e+00 16368 15960 3.38763623309859e+00 16368 15984 1.47878048249849e+00 16368 16008 1.81271814654422e-01 16368 16320 3.97019136574117e-01 16368 16344 3.11986350731988e+00 16368 16392 3.06392335696756e+00 16368 16416 3.83034098986036e-01 16368 16728 1.68550846191473e-01 16368 16752 1.32747883898368e+00 16368 16776 2.94399814662349e+00 16368 16800 1.30265738846123e+00 16368 16824 1.62345483560861e-01 16368 17136 2.02103155267248e-02 16368 17160 1.59871211982864e-01 16368 17184 3.55692930604211e-01 16368 17208 1.56481212170478e-01 16368 17232 1.93628155736284e-02 16369 16369 1.00000000000000e+00 16370 16370 1.00000000000000e+00 16371 16371 1.00000000000000e+00 16372 16372 1.00000000000000e+00 16373 16373 1.00000000000000e+00 16374 16374 1.00000000000000e+00 16375 16375 1.00000000000000e+00 16376 16376 1.00000000000000e+00 16377 16377 1.00000000000000e+00 16378 16378 1.00000000000000e+00 16379 16379 1.00000000000000e+00 16380 16380 1.00000000000000e+00 16381 16381 1.00000000000000e+00 16382 16382 1.00000000000000e+00 16383 16383 1.00000000000000e+00 16384 16384 1.00000000000000e+00 16385 16385 1.00000000000000e+00 16386 16386 1.00000000000000e+00 16387 16387 1.00000000000000e+00 16388 16388 1.00000000000000e+00 16389 16389 1.00000000000000e+00 16390 16390 1.00000000000000e+00 16391 16391 1.00000000000000e+00 16392 3909 -3.81608675529010e-03 16392 3933 -2.38431983512806e-02 16392 3957 -3.81933610700285e-03 16392 4485 -4.18824570894584e-04 16392 4509 -2.97980555261444e-01 16392 4533 -1.41134525042510e+00 16392 4557 -9.34677063180291e-01 16392 4581 -5.10221569510306e-02 16392 4605 -5.18385731630734e-05 16392 5085 -2.01656095848379e-02 16392 5109 -1.58350204718123e+00 16392 5133 -8.08169379493117e+00 16392 5157 -4.74306814100736e+00 16392 5181 -3.40186827062610e-01 16392 5205 -3.69013968260154e-04 16392 5685 -2.18011093323529e-02 16392 5709 -1.01903277723736e+00 16392 5733 -5.27554891058874e+00 16392 5757 -3.17368962354507e+00 16392 5781 -2.16482774683169e-01 16392 5805 -6.01422878122634e-06 16392 6285 -2.02821011824109e-04 16392 6309 -7.39694930109535e-02 16392 6333 -3.95378165876486e-01 16392 6357 -2.32391335660979e-01 16392 6381 -7.59144487802220e-03 16392 6933 -3.60635957870867e-04 16392 6957 -6.52984975638891e-04 16392 6981 -7.91806544230000e-10 16392 16392 7.90139368247138e+00 16392 15528 2.60335980729292e-02 16392 15552 2.00511985679792e-01 16392 15576 4.37725380813616e-01 16392 15600 2.01103230141622e-01 16392 15624 2.61814091883868e-02 16392 15936 1.88423305970196e-01 16392 15960 1.47878048249849e+00 16392 15984 3.27950601151832e+00 16392 16008 1.48802194292694e+00 16392 16032 1.90733671077308e-01 16392 16344 3.82946740255838e-01 16392 16368 3.06392335696756e+00 16392 16416 3.09174182969907e+00 16392 16440 3.89901358438716e-01 16392 16752 1.63318863554444e-01 16392 16776 1.30265738846123e+00 16392 16800 2.92560588267318e+00 16392 16824 1.30841906282309e+00 16392 16848 1.64759282144908e-01 16392 17160 1.97574874689911e-02 16392 17184 1.56481212170478e-01 16392 17208 3.49250348602332e-01 16392 17232 1.56202510115661e-01 16392 17256 1.96878119552869e-02 16393 16393 1.00000000000000e+00 16394 16394 1.00000000000000e+00 16395 16395 1.00000000000000e+00 16396 16396 1.00000000000000e+00 16397 16397 1.00000000000000e+00 16398 16398 1.00000000000000e+00 16399 16399 1.00000000000000e+00 16400 16400 1.00000000000000e+00 16401 16401 1.00000000000000e+00 16402 16402 1.00000000000000e+00 16403 16403 1.00000000000000e+00 16404 16404 1.00000000000000e+00 16405 16405 1.00000000000000e+00 16406 16406 1.00000000000000e+00 16407 16407 1.00000000000000e+00 16408 16408 1.00000000000000e+00 16409 16409 1.00000000000000e+00 16410 16410 1.00000000000000e+00 16411 16411 1.00000000000000e+00 16412 16412 1.00000000000000e+00 16413 16413 1.00000000000000e+00 16414 16414 1.00000000000000e+00 16415 16415 1.00000000000000e+00 16416 3933 -4.19575438955597e-04 16416 3957 -3.99843198830990e-04 16416 4509 -1.90576692073232e-03 16416 4533 -1.82793376238339e-01 16416 4557 -4.68654027442267e-01 16416 4581 -1.31335544505488e-01 16416 4605 -6.79448506998607e-04 16416 5085 -1.32206470670000e-10 16416 5109 -9.55746831138025e-02 16416 5133 -2.40623175819998e+00 16416 5157 -5.86868412923079e+00 16416 5181 -1.72986038849151e+00 16416 5205 -5.38648376009536e-02 16416 5685 -1.27615079143267e-05 16416 5709 -1.58796974729021e-01 16416 5733 -3.42870701505587e+00 16416 5757 -8.66875421797876e+00 16416 5781 -2.39601445015473e+00 16416 5805 -6.27299216796506e-02 16416 6285 -3.09439465411296e-06 16416 6309 -2.25121796792208e-02 16416 6333 -6.56082329760192e-01 16416 6357 -1.40261292381425e+00 16416 6381 -4.30138184579631e-01 16416 6405 -3.43551708160314e-03 16416 6933 -2.38851479682778e-03 16416 6957 -2.14258727932297e-02 16416 6981 -6.01949539313826e-03 16416 16416 7.99757378523743e+00 16416 15552 2.40943983470187e-02 16416 15576 2.01103230141622e-01 16416 15600 4.68009715976438e-01 16416 15624 2.04776719214466e-01 16416 15648 2.50127706152297e-02 16416 15960 1.81271814654422e-01 16416 15984 1.48802194292694e+00 16416 16008 3.41594298496312e+00 16416 16032 1.49466441659606e+00 16416 16056 1.82932433071703e-01 16416 16368 3.83034098986036e-01 16416 16392 3.09174182969907e+00 16416 16440 3.06407723868170e+00 16416 16464 3.76117951231693e-01 16416 16776 1.62345483560861e-01 16416 16800 1.30841906282309e+00 16416 16824 2.95969446118355e+00 16416 16848 1.30383898179603e+00 16416 16872 1.61200463304095e-01 16416 17184 1.93628155736284e-02 16416 17208 1.56202510115661e-01 16416 17232 3.53947585031547e-01 16416 17256 1.57070360514459e-01 16416 17280 1.95797781733278e-02 16417 16417 1.00000000000000e+00 16418 16418 1.00000000000000e+00 16419 16419 1.00000000000000e+00 16420 16420 1.00000000000000e+00 16421 16421 1.00000000000000e+00 16422 16422 1.00000000000000e+00 16423 16423 1.00000000000000e+00 16424 16424 1.00000000000000e+00 16425 16425 1.00000000000000e+00 16426 16426 1.00000000000000e+00 16427 16427 1.00000000000000e+00 16428 16428 1.00000000000000e+00 16429 16429 1.00000000000000e+00 16430 16430 1.00000000000000e+00 16431 16431 1.00000000000000e+00 16432 16432 1.00000000000000e+00 16433 16433 1.00000000000000e+00 16434 16434 1.00000000000000e+00 16435 16435 1.00000000000000e+00 16436 16436 1.00000000000000e+00 16437 16437 1.00000000000000e+00 16438 16438 1.00000000000000e+00 16439 16439 1.00000000000000e+00 16440 4533 -2.60171715117958e-03 16440 4557 -7.35160147784661e-02 16440 4581 -6.14995665721276e-02 16440 4605 -1.97260203679892e-03 16440 5109 -3.41322157762277e-06 16440 5133 -2.07628844917463e-01 16440 5157 -1.98400933919516e+00 16440 5181 -2.45398170369841e+00 16440 5205 -3.41170327114196e-01 16440 5229 -3.19873872226569e-03 16440 5709 -1.95098127036774e-03 16440 5733 -6.49732174719313e-01 16440 5757 -6.61043386329516e+00 16440 5781 -7.77456076509314e+00 16440 5805 -1.05198764373597e+00 16440 5829 -9.38575092160597e-03 16440 6309 -1.55759882964487e-03 16440 6333 -2.58902342369887e-01 16440 6357 -2.64139157095846e+00 16440 6381 -2.99873944324043e+00 16440 6405 -4.57991835894893e-01 16440 6429 -3.89332230272228e-04 16440 6933 -4.15438031221894e-03 16440 6957 -1.06356067585759e-01 16440 6981 -1.34841749520496e-01 16440 7005 -1.19319310724472e-02 16440 7557 -8.46091646237400e-08 16440 7581 -1.05416003024268e-05 16440 7605 -6.94046372686300e-07 16440 16440 7.80038152703573e+00 16440 15576 2.61814091883868e-02 16440 15600 2.04776719214466e-01 16440 15624 4.51557124279133e-01 16440 15648 2.00736623449201e-01 16440 15672 2.51713852470706e-02 16440 15984 1.90733671077308e-01 16440 16008 1.49466441659606e+00 16440 16032 3.30531284354298e+00 16440 16056 1.48237070556027e+00 16440 16080 1.87660243318361e-01 16440 16392 3.89901358438716e-01 16440 16416 3.06407723868170e+00 16440 16464 3.07484360048556e+00 16440 16488 3.92592948889682e-01 16440 16800 1.64759282144908e-01 16440 16824 1.30383898179603e+00 16440 16848 2.90903241462974e+00 16440 16872 1.30506473169342e+00 16440 16896 1.65065719619256e-01 16440 17208 1.96878119552869e-02 16440 17232 1.57070360514459e-01 16440 17256 3.52487017050825e-01 16440 17280 1.56410129982488e-01 16440 17304 1.95227543222943e-02 16441 16441 1.00000000000000e+00 16442 16442 1.00000000000000e+00 16443 16443 1.00000000000000e+00 16444 16444 1.00000000000000e+00 16445 16445 1.00000000000000e+00 16446 16446 1.00000000000000e+00 16447 16447 1.00000000000000e+00 16448 16448 1.00000000000000e+00 16449 16449 1.00000000000000e+00 16450 16450 1.00000000000000e+00 16451 16451 1.00000000000000e+00 hypre-2.33.0/src/test/TEST_ij/data/tucker21935/IJ.A.00003000066400000000000000000020547351477326011500216420ustar00rootroot0000000000000016452 21935 16452 21935 16452 16452 1.00000000000000e+00 16453 16453 1.00000000000000e+00 16454 16454 1.00000000000000e+00 16455 16455 1.00000000000000e+00 16456 16456 1.00000000000000e+00 16457 16457 1.00000000000000e+00 16458 16458 1.00000000000000e+00 16459 16459 1.00000000000000e+00 16460 16460 1.00000000000000e+00 16461 16461 1.00000000000000e+00 16462 16462 1.00000000000000e+00 16463 16463 1.00000000000000e+00 16464 4557 -1.58120002869862e-03 16464 4581 -8.17707393505412e-03 16464 4605 -6.01640639348701e-04 16464 5133 -1.77369989909063e-04 16464 5157 -1.98962185579800e-01 16464 5181 -9.54578846059269e-01 16464 5205 -6.13134529254237e-01 16464 5229 -2.65648743547440e-02 16464 5253 -9.74644038470952e-06 16464 5733 -1.83378568091768e-02 16464 5757 -1.52417843992882e+00 16464 5781 -7.39535321592722e+00 16464 5805 -4.21473093150745e+00 16464 5829 -2.85679637321192e-01 16464 5853 -2.68364539589378e-04 16464 6333 -2.95734225758221e-02 16464 6357 -1.29413504051998e+00 16464 6381 -6.59932721052856e+00 16464 6405 -3.73729413925666e+00 16464 6429 -2.40577424961977e-01 16464 6453 -1.69759551982028e-05 16464 6933 -9.85286141680783e-04 16464 6957 -1.43215743617077e-01 16464 6981 -6.65735053161056e-01 16464 7005 -3.78249300822861e-01 16464 7029 -1.42016680674158e-02 16464 7557 -5.60692149366310e-07 16464 7581 -2.05148678363386e-03 16464 7605 -2.65351095419148e-03 16464 7629 -1.61126130499370e-07 16464 15600 2.50127706152297e-02 16464 15624 2.00736623449201e-01 16464 15648 4.54332216932532e-01 16464 15672 2.06994670444976e-01 16464 15696 2.65772823641734e-02 16464 16008 1.82932433071703e-01 16464 16032 1.48237070556027e+00 16464 16056 3.37821758384738e+00 16464 16080 1.52152600400077e+00 16464 16104 1.92721257681826e-01 16464 16416 3.76117951231693e-01 16464 16440 3.07484360048556e+00 16464 16464 8.05020205385287e+00 16464 16488 3.14075947710285e+00 16464 16512 3.92596920386014e-01 16464 16824 1.61200463304095e-01 16464 16848 1.30506473169342e+00 16464 16872 2.97014860592264e+00 16464 16896 1.33184939331856e+00 16464 16920 1.67896628710379e-01 16464 17232 1.95797781733278e-02 16464 17256 1.56410129982488e-01 16464 17280 3.52314972451348e-01 16464 17304 1.59575517774424e-01 16464 17328 2.03711251213117e-02 16465 16465 1.00000000000000e+00 16466 16466 1.00000000000000e+00 16467 16467 1.00000000000000e+00 16468 16468 1.00000000000000e+00 16469 16469 1.00000000000000e+00 16470 16470 1.00000000000000e+00 16471 16471 1.00000000000000e+00 16472 16472 1.00000000000000e+00 16473 16473 1.00000000000000e+00 16474 16474 1.00000000000000e+00 16475 16475 1.00000000000000e+00 16476 16476 1.00000000000000e+00 16477 16477 1.00000000000000e+00 16478 16478 1.00000000000000e+00 16479 16479 1.00000000000000e+00 16480 16480 1.00000000000000e+00 16481 16481 1.00000000000000e+00 16482 16482 1.00000000000000e+00 16483 16483 1.00000000000000e+00 16484 16484 1.00000000000000e+00 16485 16485 1.00000000000000e+00 16486 16486 1.00000000000000e+00 16487 16487 1.00000000000000e+00 16488 4581 -4.66156117325986e-05 16488 4605 -3.23866062505968e-05 16488 5157 -8.34346672447818e-04 16488 5181 -1.15666008616456e-01 16488 5205 -2.74822116270487e-01 16488 5229 -6.04023209590308e-02 16488 5253 -8.30543836998000e-05 16488 5757 -8.46942034598107e-02 16488 5781 -2.05289357518915e+00 16488 5805 -4.72026243498160e+00 16488 5829 -1.35589596977103e+00 16488 5853 -3.63021842950993e-02 16488 6333 -2.02242391247015e-05 16488 6357 -1.90167096788185e-01 16488 6381 -3.93415720552657e+00 16488 6405 -9.44829471250618e+00 16488 6429 -2.46519311509011e+00 16488 6453 -6.35762543224481e-02 16488 6933 -9.82651904440186e-06 16488 6957 -4.08970490628926e-02 16488 6981 -1.01643732635630e+00 16488 7005 -2.10508368685635e+00 16488 7029 -6.26267686291776e-01 16488 7053 -5.60829570506782e-03 16488 7557 -9.73631128109080e-07 16488 7581 -1.10223094013724e-02 16488 7605 -5.20208389584616e-02 16488 7629 -1.23920601170131e-02 16488 15624 2.51713852470706e-02 16488 15648 2.06994670444976e-01 16488 15672 4.74982653968479e-01 16488 15696 2.04608133035231e-01 16488 15720 2.45747508946344e-02 16488 16032 1.87660243318361e-01 16488 16056 1.52152600400077e+00 16488 16080 3.45599888700882e+00 16488 16104 1.51007911385205e+00 16488 16128 1.84798520781182e-01 16488 16440 3.92592948889682e-01 16488 16488 8.06500579410407e+00 16488 16464 3.14075947710285e+00 16488 16512 3.13383615769576e+00 16488 16536 3.90862119037911e-01 16488 16848 1.65065719619256e-01 16488 16872 1.33184939331856e+00 16488 16896 3.01906849351882e+00 16488 16920 1.34221337297530e+00 16488 16944 1.67656714533442e-01 16488 17256 1.95227543222943e-02 16488 17280 1.59575517774424e-01 16488 17304 3.65750055595980e-01 16488 17328 1.62641697816045e-01 16488 17352 2.02892993326995e-02 16489 16489 1.00000000000000e+00 16490 16490 1.00000000000000e+00 16491 16491 1.00000000000000e+00 16492 16492 1.00000000000000e+00 16493 16493 1.00000000000000e+00 16494 16494 1.00000000000000e+00 16495 16495 1.00000000000000e+00 16496 16496 1.00000000000000e+00 16497 16497 1.00000000000000e+00 16498 16498 1.00000000000000e+00 16499 16499 1.00000000000000e+00 16500 16500 1.00000000000000e+00 16501 16501 1.00000000000000e+00 16502 16502 1.00000000000000e+00 16503 16503 1.00000000000000e+00 16504 16504 1.00000000000000e+00 16505 16505 1.00000000000000e+00 16506 16506 1.00000000000000e+00 16507 16507 1.00000000000000e+00 16508 16508 1.00000000000000e+00 16509 16509 1.00000000000000e+00 16510 16510 1.00000000000000e+00 16511 16511 1.00000000000000e+00 16512 5181 -1.21570673088841e-03 16512 5205 -3.78886813069669e-02 16512 5229 -2.22660675726956e-02 16512 5253 -1.86284564303339e-04 16512 5757 -3.81408583499220e-07 16512 5781 -1.56845308931475e-01 16512 5805 -1.46587366422927e+00 16512 5829 -1.73717993124602e+00 16512 5853 -2.28262293221438e-01 16512 5877 -1.76545037455340e-03 16512 6357 -1.94381303127237e-03 16512 6381 -6.98575913356135e-01 16512 6405 -6.73991693558086e+00 16512 6429 -7.59830514439935e+00 16512 6453 -1.01738905164713e+00 16512 6477 -9.50245677540132e-03 16512 6957 -2.61242579381708e-03 16512 6981 -3.72818880152230e-01 16512 7005 -3.64519484217998e+00 16512 7029 -4.10122884318582e+00 16512 7053 -6.03687179371130e-01 16512 7077 -7.23038149697049e-04 16512 7557 -2.22255490871330e-07 16512 7581 -1.39338207108135e-02 16512 7605 -2.24374614877637e-01 16512 7629 -2.51340603069217e-01 16512 7653 -2.46988284185834e-02 16512 8205 -1.60601360825507e-05 16512 8229 -2.48574860122958e-04 16512 8253 -9.43368006238333e-06 16512 15648 2.65772823641734e-02 16512 15672 2.04608133035231e-01 16512 15696 4.48016156154050e-01 16512 15720 2.11270441481446e-01 16512 15744 2.82428594757272e-02 16512 16056 1.92721257681826e-01 16512 16080 1.51007911385205e+00 16512 16104 3.35833046764726e+00 16512 16128 1.57452559299059e+00 16512 16152 2.08832877466460e-01 16512 16512 8.07954935078675e+00 16512 16464 3.92596920386014e-01 16512 16488 3.13383615769576e+00 16512 16536 3.29608257932735e+00 16512 16560 4.33158525793909e-01 16512 16872 1.67896628710379e-01 16512 16896 1.34221337297530e+00 16512 16920 3.03214513306497e+00 16512 16944 1.39759114541161e+00 16512 16968 1.81741071819456e-01 16512 17280 2.03711251213117e-02 16512 17304 1.62641697816045e-01 16512 17328 3.66469822508480e-01 16512 17352 1.67036829586703e-01 16512 17376 2.14699080639762e-02 16513 16513 1.00000000000000e+00 16514 16514 1.00000000000000e+00 16515 16515 1.00000000000000e+00 16516 16516 1.00000000000000e+00 16517 16517 1.00000000000000e+00 16518 16518 1.00000000000000e+00 16519 16519 1.00000000000000e+00 16520 16520 1.00000000000000e+00 16521 16521 1.00000000000000e+00 16522 16522 1.00000000000000e+00 16523 16523 1.00000000000000e+00 16524 16524 1.00000000000000e+00 16525 16525 1.00000000000000e+00 16526 16526 1.00000000000000e+00 16527 16527 1.00000000000000e+00 16528 16528 1.00000000000000e+00 16529 16529 1.00000000000000e+00 16530 16530 1.00000000000000e+00 16531 16531 1.00000000000000e+00 16532 16532 1.00000000000000e+00 16533 16533 1.00000000000000e+00 16534 16534 1.00000000000000e+00 16535 16535 1.00000000000000e+00 16536 5205 -5.31919679444265e-04 16536 5229 -2.12602681745391e-03 16536 5253 -4.51231632600868e-05 16536 5781 -5.96109218410210e-05 16536 5805 -1.30904245935948e-01 16536 5829 -6.47334861429494e-01 16536 5853 -4.02728245207735e-01 16536 5877 -1.29804131789673e-02 16536 5901 -2.30301308694400e-07 16536 6381 -1.68136550660147e-02 16536 6405 -1.48312847787425e+00 16536 6429 -6.94499300146942e+00 16536 6453 -3.98187100407165e+00 16536 6477 -2.65653515247335e-01 16536 6501 -1.92627463307750e-04 16536 6981 -3.91570541987390e-02 16536 7005 -1.69477015015131e+00 16536 7029 -8.63045626787847e+00 16536 7053 -4.89729124264450e+00 16536 7077 -3.15687715384824e-01 16536 7101 -3.60143894674450e-05 16536 7581 -3.08070724295746e-03 16536 7605 -2.70400200659878e-01 16536 7629 -1.19479722097737e+00 16536 7653 -7.08432062787704e-01 16536 7677 -3.02687018809984e-02 16536 8205 -8.98871072744653e-05 16536 8229 -9.44696404610493e-03 16536 8253 -8.79520094271789e-03 16536 8277 -2.75079980372742e-06 16536 15672 2.45747508946344e-02 16536 15696 2.11270441481446e-01 16536 15720 5.07714859658772e-01 16536 15744 2.37988866512918e-01 16536 15768 3.12543571525023e-02 16536 16080 1.84798520781182e-01 16536 16104 1.57452559299059e+00 16536 16128 3.76196580745217e+00 16536 16152 1.77869649869605e+00 16536 16176 2.35841247207546e-01 16536 16536 8.82054501110475e+00 16536 16488 3.90862119037911e-01 16536 16512 3.29608257932735e+00 16536 16560 3.72922002063178e+00 16536 16584 4.99146479364018e-01 16536 16896 1.67656714533442e-01 16536 16920 1.39759114541161e+00 16536 16944 3.28472507352781e+00 16536 16968 1.56380912680985e+00 16536 16992 2.09211209883002e-01 16536 17304 2.02892993326995e-02 16536 17328 1.67036829586703e-01 16536 17352 3.88404676177685e-01 16536 17376 1.84267023541369e-01 16536 17400 2.45968478213661e-02 16537 16537 1.00000000000000e+00 16538 16538 1.00000000000000e+00 16539 16539 1.00000000000000e+00 16540 16540 1.00000000000000e+00 16541 16541 1.00000000000000e+00 16542 16542 1.00000000000000e+00 16543 16543 1.00000000000000e+00 16544 16544 1.00000000000000e+00 16545 16545 1.00000000000000e+00 16546 16546 1.00000000000000e+00 16547 16547 1.00000000000000e+00 16548 16548 1.00000000000000e+00 16549 16549 1.00000000000000e+00 16550 16550 1.00000000000000e+00 16551 16551 1.00000000000000e+00 16552 16552 1.00000000000000e+00 16553 16553 1.00000000000000e+00 16554 16554 1.00000000000000e+00 16555 16555 1.00000000000000e+00 16556 16556 1.00000000000000e+00 16557 16557 1.00000000000000e+00 16558 16558 1.00000000000000e+00 16559 16559 1.00000000000000e+00 16560 5229 -5.30610853420270e-07 16560 5253 -2.63635274781210e-07 16560 5805 -3.42380297403756e-04 16560 5829 -7.56563029286538e-02 16560 5853 -1.63888366341908e-01 16560 5877 -2.56556343381753e-02 16560 5901 -1.19463980016851e-06 16560 6405 -7.66304469585031e-02 16560 6429 -1.87921702765301e+00 16560 6453 -4.28313906253422e+00 16560 6477 -1.07744492518088e+00 16560 6501 -1.51639929481643e-02 16560 6981 -3.13185518468501e-05 16560 7005 -2.38646796391967e-01 16560 7029 -5.11917555376173e+00 16560 7053 -1.18093709731944e+01 16560 7077 -2.41236416441370e+00 16560 7101 -4.35226319330424e-02 16560 7581 -2.65552428960317e-05 16560 7605 -7.51061278934845e-02 16560 7629 -1.74396899578495e+00 16560 7653 -3.34211054867200e+00 16560 7677 -7.93553797255210e-01 16560 7701 -7.02520703206139e-03 16560 8205 -1.18646387859601e-04 16560 8229 -3.98639657652778e-02 16560 8253 -1.01470518843152e-01 16560 8277 -2.01988474371424e-02 16560 8301 -1.31019120337000e-09 16560 8853 -6.61515078038800e-08 16560 8877 -4.14899663859000e-08 16560 15696 2.82428594757272e-02 16560 15720 2.37988866512918e-01 16560 15744 5.44078468654198e-01 16560 15768 1.88081007563747e-01 16560 15792 1.57658947384345e-02 16560 16104 2.08832877466460e-01 16560 16128 1.77869649869605e+00 16560 16152 4.12606418741716e+00 16560 16176 1.51845040734970e+00 16560 16200 1.43771354629874e-01 16560 16560 9.77556496807966e+00 16560 16512 4.33158525793909e-01 16560 16536 3.72922002063178e+00 16560 16584 3.42083700730073e+00 16560 16608 3.56062772461148e-01 16560 16920 1.81741071819456e-01 16560 16944 1.56380912680985e+00 16560 16968 3.67969130569637e+00 16560 16992 1.43912834252728e+00 16560 17016 1.50570875748814e-01 16560 17328 2.14699080639762e-02 16560 17352 1.84267023541369e-01 16560 17376 4.32485248224003e-01 16560 17400 1.68250491358142e-01 16560 17424 1.74657750181695e-02 16561 16561 1.00000000000000e+00 16562 16562 1.00000000000000e+00 16563 16563 1.00000000000000e+00 16564 16564 1.00000000000000e+00 16565 16565 1.00000000000000e+00 16566 16566 1.00000000000000e+00 16567 16567 1.00000000000000e+00 16568 16568 1.00000000000000e+00 16569 16569 1.00000000000000e+00 16570 16570 1.00000000000000e+00 16571 16571 1.00000000000000e+00 16572 16572 1.00000000000000e+00 16573 16573 1.00000000000000e+00 16574 16574 1.00000000000000e+00 16575 16575 1.00000000000000e+00 16576 16576 1.00000000000000e+00 16577 16577 1.00000000000000e+00 16578 16578 1.00000000000000e+00 16579 16579 1.00000000000000e+00 16580 16580 1.00000000000000e+00 16581 16581 1.00000000000000e+00 16582 16582 1.00000000000000e+00 16583 16583 1.00000000000000e+00 16584 5829 -6.16935639697806e-04 16584 5853 -1.94860308560996e-02 16584 5877 -6.78156064318184e-03 16584 5901 -1.32403957025804e-06 16584 6405 -3.15286122116000e-09 16584 6429 -1.38745469119401e-01 16584 6453 -1.10467050991724e+00 16584 6477 -1.10367230428959e+00 16584 6501 -2.52264035490331e-01 16584 7005 -2.05883233787824e-03 16584 7029 -8.76028072878799e-01 16584 7053 -6.68777816209331e+00 16584 7077 -9.03319033806791e+00 16584 7101 -1.30109975791997e+00 16584 7605 -4.76276778342307e-03 16584 7629 -5.39531734989179e-01 16584 7653 -5.66644235563060e+00 16584 7677 -8.06189223988948e+00 16584 7701 -3.07481855106399e-01 16584 8205 -2.56465629442626e-05 16584 8229 -3.21841845409034e-02 16584 8253 -8.34970990283466e-01 16584 8277 -6.70418245275526e-01 16584 8301 -1.27580809196153e-06 16584 8853 -2.00170805911748e-05 16584 8877 -1.35540959531506e-05 16584 15720 3.12543571525023e-02 16584 15744 1.88081007563747e-01 16584 15768 4.64035159481771e-01 16584 15792 4.24116551982371e-01 16584 16128 2.35841247207546e-01 16584 16152 1.51845040734970e+00 16584 16176 3.67416532082424e+00 16584 16200 2.85105021759681e+00 16584 16584 9.23470004433160e+00 16584 16536 4.99146479364018e-01 16584 16560 3.42083700730073e+00 16584 16608 5.50134950102257e+00 16584 16944 2.09211209883002e-01 16584 16968 1.43912834252728e+00 16584 16992 3.81228929594187e+00 16584 17016 2.99017165115085e+00 16584 17352 2.45968478213661e-02 16584 17376 1.68250491358142e-01 16584 17400 4.98566153261178e-01 16584 17424 4.58896910370879e-01 16585 16585 1.00000000000000e+00 16586 16586 1.00000000000000e+00 16587 16587 1.00000000000000e+00 16588 16588 1.00000000000000e+00 16589 16589 1.00000000000000e+00 16590 16590 1.00000000000000e+00 16591 16591 1.00000000000000e+00 16592 16592 1.00000000000000e+00 16593 16593 1.00000000000000e+00 16594 16594 1.00000000000000e+00 16595 16595 1.00000000000000e+00 16596 16596 1.00000000000000e+00 16597 16597 1.00000000000000e+00 16598 16598 1.00000000000000e+00 16599 16599 1.00000000000000e+00 16600 16600 1.00000000000000e+00 16601 16601 1.00000000000000e+00 16602 16602 1.00000000000000e+00 16603 16603 1.00000000000000e+00 16604 16604 1.00000000000000e+00 16605 16605 1.00000000000000e+00 16606 16606 1.00000000000000e+00 16607 16607 1.00000000000000e+00 16608 5853 -7.56520811581507e-05 16608 5877 -2.15737240607035e-04 16608 5901 -2.73434565390910e-07 16608 6429 -1.04201598584573e-05 16608 6453 -6.09452274392248e-02 16608 6477 -6.50483221529839e-01 16608 6501 -4.03388434389513e-01 16608 7029 -1.29413237855627e-02 16608 7053 -1.51207846681767e+00 16608 7077 -9.31757742472469e+00 16608 7101 -2.29847746643479e+00 16608 7629 -4.16778281377626e-02 16608 7653 -3.96155814643503e+00 16608 7677 -1.13558941478984e+01 16608 7701 -5.65787260988367e-01 16608 8229 -6.82991249166350e-03 16608 8253 -1.18740850620948e+00 16608 8277 -1.19951607928595e+00 16608 8301 -2.54244484549950e-06 16608 8853 -3.95711006277224e-05 16608 8877 -2.68177621416000e-05 16608 15744 1.57658947384345e-02 16608 15768 4.24116551982371e-01 16608 15792 7.37871840795700e-01 16608 16152 1.43771354629874e-01 16608 16176 2.85105021759681e+00 16608 16200 4.69570095278449e+00 16608 16608 9.51025959481704e+00 16608 16560 3.56062772461148e-01 16608 16584 5.50134950102257e+00 16608 16968 1.50570875748814e-01 16608 16992 2.99017165115084e+00 16608 17016 4.92634717205998e+00 16608 17376 1.74657750181695e-02 16608 17400 4.58896910370879e-01 16608 17424 7.95533395614571e-01 16609 16609 1.00000000000000e+00 16610 16610 1.00000000000000e+00 16611 16611 1.00000000000000e+00 16612 16612 1.00000000000000e+00 16613 16613 1.00000000000000e+00 16614 16614 1.00000000000000e+00 16615 16615 1.00000000000000e+00 16616 16616 1.00000000000000e+00 16617 16617 1.00000000000000e+00 16618 16618 1.00000000000000e+00 16619 16619 1.00000000000000e+00 16620 16620 1.00000000000000e+00 16621 16621 1.00000000000000e+00 16622 16622 1.00000000000000e+00 16623 16623 1.00000000000000e+00 16624 16624 1.00000000000000e+00 16625 16625 1.00000000000000e+00 16626 16626 1.00000000000000e+00 16627 16627 1.00000000000000e+00 16628 16628 1.00000000000000e+00 16629 16629 1.00000000000000e+00 16630 16630 1.00000000000000e+00 16631 16631 1.00000000000000e+00 16632 3213 -1.70854902386414e-01 16632 3237 -9.84383496535956e-01 16632 3261 -7.14390121570557e-02 16632 3285 -3.47011381079172e-05 16632 3789 -1.19673275115655e-03 16632 3813 -8.88650814138442e+00 16632 3837 -1.16470936735664e+01 16632 3861 -3.00034719279312e-01 16632 3885 -2.44065315422977e-04 16632 4389 -1.32155033546539e-01 16632 4413 -1.09254701506262e+01 16632 4437 -7.62575536054902e+00 16632 4461 -1.70767136446978e-01 16632 4485 -4.23031447744463e-06 16632 4989 -6.40768823076001e-02 16632 5013 -7.26009893524988e-01 16632 5037 -2.77611194666452e-01 16632 5061 -6.67400920711623e-03 16632 5613 -3.57181806112185e-04 16632 5637 -6.75108151057735e-04 16632 5661 -1.98860187077000e-09 16632 15816 4.64521539191584e-01 16632 15840 2.85641484834296e-01 16632 15864 1.52516329252869e-02 16632 16224 5.30474276402998e+00 16632 16248 3.10346929434222e+00 16632 16272 1.28885117807777e-01 16632 16632 1.56934120813321e+01 16632 16656 8.42373780668294e+00 16632 16680 3.07723361719108e-01 16632 17040 5.21571305960729e+00 16632 17064 3.13883496231910e+00 16632 17088 1.51708123575842e-01 16632 17448 4.42264113085912e-01 16632 17472 2.94482901828517e-01 16632 17496 2.09573843673030e-02 16633 16633 1.00000000000000e+00 16634 16634 1.00000000000000e+00 16635 16635 1.00000000000000e+00 16636 16636 1.00000000000000e+00 16637 16637 1.00000000000000e+00 16638 16638 1.00000000000000e+00 16639 16639 1.00000000000000e+00 16640 16640 1.00000000000000e+00 16641 16641 1.00000000000000e+00 16642 16642 1.00000000000000e+00 16643 16643 1.00000000000000e+00 16644 16644 1.00000000000000e+00 16645 16645 1.00000000000000e+00 16646 16646 1.00000000000000e+00 16647 16647 1.00000000000000e+00 16648 16648 1.00000000000000e+00 16649 16649 1.00000000000000e+00 16650 16650 1.00000000000000e+00 16651 16651 1.00000000000000e+00 16652 16652 1.00000000000000e+00 16653 16653 1.00000000000000e+00 16654 16654 1.00000000000000e+00 16655 16655 1.00000000000000e+00 16656 3213 -9.08396678635010e-02 16656 3237 -6.32999049357043e-01 16656 3261 -1.07496598483682e-01 16656 3285 -7.25522370285966e-04 16656 3789 -6.07278449815367e-04 16656 3813 -4.99269484567996e+00 16656 3837 -9.05696095074172e+00 16656 3861 -1.43888709538292e+00 16656 3885 -6.28594643042423e-02 16656 4389 -7.27606402896119e-02 16656 4413 -7.22856710572103e+00 16656 4437 -1.02980360621150e+01 16656 4461 -2.49991636289071e+00 16656 4485 -7.55358123396616e-02 16656 4989 -3.73800305753864e-02 16656 5013 -9.00513750001239e-01 16656 5037 -1.56020234216348e+00 16656 5061 -5.23272904718788e-01 16656 5085 -4.35560139697675e-03 16656 5613 -2.60936372640850e-03 16656 5637 -2.75544390262802e-02 16656 5661 -8.22518959263143e-03 16656 15816 2.85641484834296e-01 16656 15840 3.84586462846892e-01 16656 15864 1.73977969604060e-01 16656 15888 2.82428594757281e-02 16656 16224 3.10346929434222e+00 16656 16248 3.56739673796147e+00 16656 16272 1.36062223715689e+00 16656 16296 2.11270441481440e-01 16656 16656 9.96801212356319e+00 16656 16632 8.42373780668294e+00 16656 16680 3.02295807149255e+00 16656 16704 4.48016156154014e-01 16656 17040 3.13883496231910e+00 16656 17064 3.89793934425661e+00 16656 17088 1.42526502644428e+00 16656 17112 2.04608133035225e-01 16656 17448 2.94482901828517e-01 16656 17472 4.67222114420675e-01 16656 17496 1.90138666925910e-01 16656 17520 2.65772823641744e-02 16657 16657 1.00000000000000e+00 16658 16658 1.00000000000000e+00 16659 16659 1.00000000000000e+00 16660 16660 1.00000000000000e+00 16661 16661 1.00000000000000e+00 16662 16662 1.00000000000000e+00 16663 16663 1.00000000000000e+00 16664 16664 1.00000000000000e+00 16665 16665 1.00000000000000e+00 16666 16666 1.00000000000000e+00 16667 16667 1.00000000000000e+00 16668 16668 1.00000000000000e+00 16669 16669 1.00000000000000e+00 16670 16670 1.00000000000000e+00 16671 16671 1.00000000000000e+00 16672 16672 1.00000000000000e+00 16673 16673 1.00000000000000e+00 16674 16674 1.00000000000000e+00 16675 16675 1.00000000000000e+00 16676 16676 1.00000000000000e+00 16677 16677 1.00000000000000e+00 16678 16678 1.00000000000000e+00 16679 16679 1.00000000000000e+00 16680 3213 -1.54634762008396e-03 16680 3237 -4.67880445595028e-02 16680 3261 -5.51496939522471e-02 16680 3285 -2.41565249248580e-03 16680 3789 -2.54630692488353e-06 16680 3813 -1.57674992663909e-01 16680 3837 -1.76103804557888e+00 16680 3861 -2.67231919083986e+00 16680 3885 -3.75923620321791e-01 16680 3909 -3.26638239810645e-03 16680 4389 -1.90946386181216e-03 16680 4413 -5.87225973957979e-01 16680 4437 -7.16654941689140e+00 16680 4461 -8.89099175463522e+00 16680 4485 -1.09956716241353e+00 16680 4509 -9.54620552641469e-03 16680 4989 -1.52616840616753e-03 16680 5013 -2.94052989407059e-01 16680 5037 -3.24277390371008e+00 16680 5061 -3.40661737920480e+00 16680 5085 -4.69701797998804e-01 16680 5109 -4.19129189440223e-04 16680 5613 -5.08853050101885e-03 16680 5637 -1.32485464574336e-01 16680 5661 -1.53167292222670e-01 16680 5685 -1.29970123836128e-02 16680 6237 -6.02256811617600e-08 16680 6261 -1.03954862092585e-05 16680 6285 -7.74689897242050e-07 16680 15816 1.52516329252869e-02 16680 15840 1.73977969604060e-01 16680 15864 4.91102744427823e-01 16680 15888 2.08832877466459e-01 16680 15912 2.39653598908867e-02 16680 16224 1.28885117807777e-01 16680 16248 1.36062223715688e+00 16680 16272 3.69157313827709e+00 16680 16296 1.57452559299054e+00 16680 16320 1.82360956766191e-01 16680 16680 8.86754832094137e+00 16680 16632 3.07723361719108e-01 16680 16656 3.02295807149255e+00 16680 16704 3.35833046764711e+00 16680 16728 3.91566460757746e-01 16680 17040 1.51708123575842e-01 16680 17064 1.42526502644428e+00 16680 17088 3.59834989756730e+00 16680 17112 1.51007911385202e+00 16680 17136 1.72911645427776e-01 16680 17448 2.09573843673030e-02 16680 17472 1.90138666925910e-01 16680 17496 4.67796934250376e-01 16680 17520 1.92721257681829e-01 16680 17544 2.16030320562830e-02 16681 16681 1.00000000000000e+00 16682 16682 1.00000000000000e+00 16683 16683 1.00000000000000e+00 16684 16684 1.00000000000000e+00 16685 16685 1.00000000000000e+00 16686 16686 1.00000000000000e+00 16687 16687 1.00000000000000e+00 16688 16688 1.00000000000000e+00 16689 16689 1.00000000000000e+00 16690 16690 1.00000000000000e+00 16691 16691 1.00000000000000e+00 16692 16692 1.00000000000000e+00 16693 16693 1.00000000000000e+00 16694 16694 1.00000000000000e+00 16695 16695 1.00000000000000e+00 16696 16696 1.00000000000000e+00 16697 16697 1.00000000000000e+00 16698 16698 1.00000000000000e+00 16699 16699 1.00000000000000e+00 16700 16700 1.00000000000000e+00 16701 16701 1.00000000000000e+00 16702 16702 1.00000000000000e+00 16703 16703 1.00000000000000e+00 16704 3237 -1.76545037455345e-03 16704 3261 -9.50245677540159e-03 16704 3285 -7.23038149697060e-04 16704 3813 -1.86284564303322e-04 16704 3837 -2.28262293221427e-01 16704 3861 -1.01738905164711e+00 16704 3885 -6.03687179371143e-01 16704 3909 -2.46988284185830e-02 16704 3933 -9.43368006238351e-06 16704 4413 -2.22660675726953e-02 16704 4437 -1.73717993124592e+00 16704 4461 -7.59830514439927e+00 16704 4485 -4.10122884318575e+00 16704 4509 -2.51340603069218e-01 16704 4533 -2.48574860122963e-04 16704 5013 -3.78886813069680e-02 16704 5037 -1.46587366422926e+00 16704 5061 -6.73991693558080e+00 16704 5085 -3.64519484217994e+00 16704 5109 -2.24374614877636e-01 16704 5133 -1.60601360825510e-05 16704 5613 -1.21570673088845e-03 16704 5637 -1.56845308931475e-01 16704 5661 -6.98575913356125e-01 16704 5685 -3.72818880152220e-01 16704 5709 -1.39338207108133e-02 16704 6237 -3.81408583499220e-07 16704 6261 -1.94381303127229e-03 16704 6285 -2.61242579381695e-03 16704 6309 -2.22255490871320e-07 16704 15840 2.82428594757281e-02 16704 15864 2.08832877466459e-01 16704 15888 4.33158525793892e-01 16704 15912 1.81741071819453e-01 16704 15936 2.14699080639766e-02 16704 16248 2.11270441481440e-01 16704 16272 1.57452559299054e+00 16704 16296 3.29608257932726e+00 16704 16320 1.39759114541159e+00 16704 16344 1.67036829586704e-01 16704 16704 8.07954935078667e+00 16704 16656 4.48016156154014e-01 16704 16680 3.35833046764711e+00 16704 16728 3.03214513306494e+00 16704 16752 3.66469822508475e-01 16704 17064 2.04608133035225e-01 16704 17088 1.51007911385202e+00 16704 17112 3.13383615769574e+00 16704 17136 1.34221337297528e+00 16704 17160 1.62641697816040e-01 16704 17472 2.65772823641744e-02 16704 17496 1.92721257681829e-01 16704 17520 3.92596920386013e-01 16704 17544 1.67896628710375e-01 16704 17568 2.03711251213107e-02 16705 16705 1.00000000000000e+00 16706 16706 1.00000000000000e+00 16707 16707 1.00000000000000e+00 16708 16708 1.00000000000000e+00 16709 16709 1.00000000000000e+00 16710 16710 1.00000000000000e+00 16711 16711 1.00000000000000e+00 16712 16712 1.00000000000000e+00 16713 16713 1.00000000000000e+00 16714 16714 1.00000000000000e+00 16715 16715 1.00000000000000e+00 16716 16716 1.00000000000000e+00 16717 16717 1.00000000000000e+00 16718 16718 1.00000000000000e+00 16719 16719 1.00000000000000e+00 16720 16720 1.00000000000000e+00 16721 16721 1.00000000000000e+00 16722 16722 1.00000000000000e+00 16723 16723 1.00000000000000e+00 16724 16724 1.00000000000000e+00 16725 16725 1.00000000000000e+00 16726 16726 1.00000000000000e+00 16727 16727 1.00000000000000e+00 16728 3261 -4.71154979898933e-05 16728 3285 -3.40800829606908e-05 16728 3837 -7.66819923937577e-04 16728 3861 -1.09952822002806e-01 16728 3885 -2.45488223812454e-01 16728 3909 -5.17816687505499e-02 16728 3933 -8.35721701630065e-05 16728 4437 -8.21777190579343e-02 16728 4461 -1.97095422806589e+00 16728 4485 -4.25765599427586e+00 16728 4509 -1.18550249725813e+00 16728 4533 -3.39204386699666e-02 16728 5013 -1.80659238066758e-05 16728 5037 -1.94900128605114e-01 16728 5061 -3.78383013424038e+00 16728 5085 -8.86448444528996e+00 16728 5109 -2.30331252695497e+00 16728 5133 -6.02435661366246e-02 16728 5613 -8.76502208940866e-06 16728 5637 -4.20503355344793e-02 16728 5661 -9.93116571711667e-01 16728 5685 -2.01599738264802e+00 16728 5709 -5.94848422720122e-01 16728 5733 -5.56934197282919e-03 16728 6237 -6.22249116570460e-07 16728 6261 -1.02953049434358e-02 16728 6285 -4.94140797644577e-02 16728 6309 -1.20177584135244e-02 16728 15864 2.39653598908867e-02 16728 15888 1.81741071819453e-01 16728 15912 3.89411284935657e-01 16728 15936 1.73589216340481e-01 16728 15960 2.19273960211435e-02 16728 16272 1.82360956766191e-01 16728 16296 1.39759114541159e+00 16728 16320 3.02350107634498e+00 16728 16344 1.34235070311272e+00 16728 16368 1.68550846191473e-01 16728 16728 7.61989303799175e+00 16728 16680 3.91566460757746e-01 16728 16704 3.03214513306494e+00 16728 16752 2.92511695842663e+00 16728 16776 3.64809417098168e-01 16728 17088 1.72911645427776e-01 16728 17112 1.34221337297528e+00 16728 17136 2.93408796318908e+00 16728 17160 1.28620340208262e+00 16728 17184 1.58909152704612e-01 16728 17496 2.16030320562830e-02 16728 17520 1.67896628710375e-01 16728 17544 3.67058006646683e-01 16728 17568 1.59552391082956e-01 16728 17592 1.95169726494283e-02 16729 16729 1.00000000000000e+00 16730 16730 1.00000000000000e+00 16731 16731 1.00000000000000e+00 16732 16732 1.00000000000000e+00 16733 16733 1.00000000000000e+00 16734 16734 1.00000000000000e+00 16735 16735 1.00000000000000e+00 16736 16736 1.00000000000000e+00 16737 16737 1.00000000000000e+00 16738 16738 1.00000000000000e+00 16739 16739 1.00000000000000e+00 16740 16740 1.00000000000000e+00 16741 16741 1.00000000000000e+00 16742 16742 1.00000000000000e+00 16743 16743 1.00000000000000e+00 16744 16744 1.00000000000000e+00 16745 16745 1.00000000000000e+00 16746 16746 1.00000000000000e+00 16747 16747 1.00000000000000e+00 16748 16748 1.00000000000000e+00 16749 16749 1.00000000000000e+00 16750 16750 1.00000000000000e+00 16751 16751 1.00000000000000e+00 16752 3861 -9.44207889060296e-04 16752 3885 -3.11108491462272e-02 16752 3909 -1.95621366677711e-02 16752 3933 -1.93029350231713e-04 16752 4437 -2.47764597396860e-07 16752 4461 -1.41157639159402e-01 16752 4485 -1.30451795486918e+00 16752 4509 -1.56150964536207e+00 16752 4533 -1.98701968048536e-01 16752 4557 -1.42313807385484e-03 16752 5037 -1.79342829018024e-03 16752 5061 -6.48829834041628e-01 16752 5085 -6.23407982509964e+00 16752 5109 -6.93663822977327e+00 16752 5133 -8.49994985456520e-01 16752 5157 -7.58954126479118e-03 16752 5637 -2.41400275343918e-03 16752 5661 -3.52156070294230e-01 16752 5685 -3.39171852619204e+00 16752 5709 -3.67439368781378e+00 16752 5733 -5.08138615513806e-01 16752 5757 -6.05453066284458e-04 16752 6237 -1.40505858852180e-07 16752 6261 -1.26258116673755e-02 16752 6285 -2.06892058201994e-01 16752 6309 -2.24619371477821e-01 16752 6333 -2.16163911218316e-02 16752 6885 -1.22463021456102e-05 16752 6909 -2.10501275725719e-04 16752 6933 -8.91149563795812e-06 16752 15888 2.14699080639766e-02 16752 15912 1.73589216340481e-01 16752 15936 3.93380472821893e-01 16752 15960 1.71998497763053e-01 16752 15984 2.10722284196199e-02 16752 16296 1.67036829586704e-01 16752 16320 1.34235070311272e+00 16752 16344 3.02716923220478e+00 16752 16368 1.32747883898368e+00 16752 16392 1.63318863554444e-01 16752 16752 7.55985454896849e+00 16752 16704 3.66469822508475e-01 16752 16728 2.92511695842663e+00 16752 16776 2.88497387994911e+00 16752 16800 3.56434052889094e-01 16752 17112 1.62641697816040e-01 16752 17136 1.28620340208262e+00 16752 17160 2.86118619082832e+00 16752 17184 1.25962880977218e+00 16752 17208 1.55998049738430e-01 16752 17520 2.03711251213107e-02 16752 17544 1.59552391082956e-01 16752 17568 3.51884712477780e-01 16752 17592 1.55035990460178e-01 16752 17616 1.92420249656163e-02 16753 16753 1.00000000000000e+00 16754 16754 1.00000000000000e+00 16755 16755 1.00000000000000e+00 16756 16756 1.00000000000000e+00 16757 16757 1.00000000000000e+00 16758 16758 1.00000000000000e+00 16759 16759 1.00000000000000e+00 16760 16760 1.00000000000000e+00 16761 16761 1.00000000000000e+00 16762 16762 1.00000000000000e+00 16763 16763 1.00000000000000e+00 16764 16764 1.00000000000000e+00 16765 16765 1.00000000000000e+00 16766 16766 1.00000000000000e+00 16767 16767 1.00000000000000e+00 16768 16768 1.00000000000000e+00 16769 16769 1.00000000000000e+00 16770 16770 1.00000000000000e+00 16771 16771 1.00000000000000e+00 16772 16772 1.00000000000000e+00 16773 16773 1.00000000000000e+00 16774 16774 1.00000000000000e+00 16775 16775 1.00000000000000e+00 16776 3885 -4.73461040574712e-04 16776 3909 -1.98398564923316e-03 16776 3933 -4.68209319752308e-05 16776 4461 -4.77885378091524e-05 16776 4485 -1.18129358804485e-01 16776 4509 -5.43816655026182e-01 16776 4533 -3.13158933648111e-01 16776 4557 -9.94001768869187e-03 16776 4581 -2.31168330062660e-07 16776 5061 -1.50083400241686e-02 16776 5085 -1.32965709172447e+00 16776 5109 -5.76875780633052e+00 16776 5133 -3.09628035087762e+00 16776 5157 -1.90496251635002e-01 16776 5181 -1.52153242486531e-04 16776 5661 -3.58048723393150e-02 16776 5685 -1.48988839847489e+00 16776 5709 -7.13291989148017e+00 16776 5733 -3.75690140381852e+00 16776 5757 -2.26074176801015e-01 16776 5781 -2.84457677356845e-05 16776 6261 -2.75454565147807e-03 16776 6285 -2.35972834052833e-01 16776 6309 -9.98666130461227e-01 16776 6333 -5.34791752860120e-01 16776 6357 -2.21346096836279e-02 16776 6885 -6.59348435444707e-05 16776 6909 -7.22537427582622e-03 16776 6933 -6.88640208816359e-03 16776 6957 -2.63632843519916e-06 16776 15912 2.19273960211435e-02 16776 15936 1.71998497763053e-01 16776 15960 3.80306606051648e-01 16776 15984 1.69183134944827e-01 16776 16008 2.12235553165868e-02 16776 16320 1.68550846191473e-01 16776 16344 1.32747883898368e+00 16776 16368 2.94399814662349e+00 16776 16392 1.30265738846123e+00 16776 16416 1.62345483560861e-01 16776 16776 7.41816968014227e+00 16776 16728 3.64809417098168e-01 16776 16752 2.88497387994911e+00 16776 16800 2.82739787882992e+00 16776 16824 3.50415416818372e-01 16776 17136 1.58909152704612e-01 16776 17160 1.25962880977218e+00 16776 17184 2.80987646010898e+00 16776 17208 1.24398624531148e+00 16776 17232 1.54998511589436e-01 16776 17544 1.95169726494283e-02 16776 17568 1.55035990460178e-01 16776 17592 3.46776184423020e-01 16776 17616 1.54515349157387e-01 16776 17640 1.93868123237305e-02 16777 16777 1.00000000000000e+00 16778 16778 1.00000000000000e+00 16779 16779 1.00000000000000e+00 16780 16780 1.00000000000000e+00 16781 16781 1.00000000000000e+00 16782 16782 1.00000000000000e+00 16783 16783 1.00000000000000e+00 16784 16784 1.00000000000000e+00 16785 16785 1.00000000000000e+00 16786 16786 1.00000000000000e+00 16787 16787 1.00000000000000e+00 16788 16788 1.00000000000000e+00 16789 16789 1.00000000000000e+00 16790 16790 1.00000000000000e+00 16791 16791 1.00000000000000e+00 16792 16792 1.00000000000000e+00 16793 16793 1.00000000000000e+00 16794 16794 1.00000000000000e+00 16795 16795 1.00000000000000e+00 16796 16796 1.00000000000000e+00 16797 16797 1.00000000000000e+00 16798 16798 1.00000000000000e+00 16799 16799 1.00000000000000e+00 16800 3909 -4.73650354579950e-07 16800 3933 -2.45870515439590e-07 16800 4485 -2.50664090970469e-04 16800 4509 -5.66160552656316e-02 16800 4533 -1.19803551127479e-01 16800 4557 -1.87272890764834e-02 16800 4581 -1.46666927100903e-06 16800 5085 -6.10846835017304e-02 16800 5109 -1.44359395821833e+00 16800 5133 -3.07599406256264e+00 16800 5157 -8.56623399539284e-01 16800 5181 -2.11921539795369e-02 16800 5661 -2.31930704160451e-05 16800 5685 -1.98152836711837e-01 16800 5709 -3.82742487958766e+00 16800 5733 -8.67746750985504e+00 16800 5757 -2.14962332383441e+00 16800 5781 -5.64564483220395e-02 16800 6261 -1.96401349981372e-05 16800 6285 -6.23061972031637e-02 16800 6309 -1.33991019064061e+00 16800 6333 -2.69588979393633e+00 16800 6357 -7.65783553595130e-01 16800 6381 -7.75557904544779e-03 16800 6885 -8.00448419937305e-05 16800 6909 -3.16680109148218e-02 16800 6933 -9.77203966759714e-02 16800 6957 -2.17405842911066e-02 16800 6981 -3.72328364354000e-09 16800 7533 -5.34096308434300e-08 16800 7557 -3.49041330603600e-08 16800 15936 2.10722284196199e-02 16800 15960 1.69183134944827e-01 16800 15984 3.82151122065949e-01 16800 16008 1.70902255590108e-01 16800 16032 2.15020085809401e-02 16800 16344 1.63318863554444e-01 16800 16368 1.30265738846123e+00 16800 16392 2.92560588267318e+00 16800 16416 1.30841906282309e+00 16800 16440 1.64759282144908e-01 16800 16800 7.31846347239756e+00 16800 16752 3.56434052889094e-01 16800 16776 2.82739787882992e+00 16800 16824 2.82319266893073e+00 16800 16848 3.55382750414297e-01 16800 17160 1.55998049738430e-01 16800 17184 1.24398624531148e+00 16800 17208 2.79022848518567e+00 16800 17232 1.23701104642259e+00 16800 17256 1.54254250016209e-01 16800 17568 1.92420249656163e-02 16800 17592 1.54515349157387e-01 16800 17616 3.48306772694070e-01 16800 17640 1.53050251489984e-01 16800 17664 1.88757505487653e-02 16801 16801 1.00000000000000e+00 16802 16802 1.00000000000000e+00 16803 16803 1.00000000000000e+00 16804 16804 1.00000000000000e+00 16805 16805 1.00000000000000e+00 16806 16806 1.00000000000000e+00 16807 16807 1.00000000000000e+00 16808 16808 1.00000000000000e+00 16809 16809 1.00000000000000e+00 16810 16810 1.00000000000000e+00 16811 16811 1.00000000000000e+00 16812 16812 1.00000000000000e+00 16813 16813 1.00000000000000e+00 16814 16814 1.00000000000000e+00 16815 16815 1.00000000000000e+00 16816 16816 1.00000000000000e+00 16817 16817 1.00000000000000e+00 16818 16818 1.00000000000000e+00 16819 16819 1.00000000000000e+00 16820 16820 1.00000000000000e+00 16821 16821 1.00000000000000e+00 16822 16822 1.00000000000000e+00 16823 16823 1.00000000000000e+00 16824 4509 -3.98715594254582e-04 16824 4533 -1.36571193791511e-02 16824 4557 -5.50462311142662e-03 16824 4581 -2.39915213309629e-06 16824 5085 -7.06933854300000e-10 16824 5109 -9.45460057249820e-02 16824 5133 -8.81184445223637e-01 16824 5157 -1.02406696179595e+00 16824 5181 -1.17769960030617e-01 16824 5205 -5.47483143415965e-04 16824 5685 -1.49333307771918e-03 16824 5709 -6.27007469647813e-01 16824 5733 -5.69463606063275e+00 16824 5757 -6.07799992998208e+00 16824 5781 -7.15791459635699e-01 16824 5805 -6.31400259870865e-03 16824 6285 -3.48186344649801e-03 16824 6309 -4.46824974409305e-01 16824 6333 -4.18131636633917e+00 16824 6357 -4.40199915461408e+00 16824 6381 -5.70727423507643e-01 16824 6405 -8.94813647991456e-04 16824 6885 -1.69496349620301e-05 16824 6909 -3.01220400623413e-02 16824 6933 -3.63297660228321e-01 16824 6957 -3.62480097222250e-01 16824 6981 -3.76488888679949e-02 16824 7533 -1.88504826688786e-04 16824 7557 -1.33629378071347e-03 16824 7581 -4.34911550910307e-05 16824 15960 2.12235553165868e-02 16824 15984 1.70902255590108e-01 16824 16008 3.85976030264325e-01 16824 16032 1.68889384934545e-01 16824 16056 2.07203376526960e-02 16824 16368 1.62345483560861e-01 16824 16392 1.30841906282309e+00 16824 16416 2.95969446118355e+00 16824 16440 1.30383898179603e+00 16824 16824 7.38973295076625e+00 16824 16464 1.61200463304095e-01 16824 16776 3.50415416818372e-01 16824 16800 2.82319266893073e+00 16824 16848 2.83430511093286e+00 16824 16872 3.53193527318905e-01 16824 17184 1.54998511589436e-01 16824 17208 1.23701104642259e+00 16824 17232 2.77817258011401e+00 16824 17256 1.23744127312553e+00 16824 17280 1.55106068265170e-01 16824 17592 1.93868123237305e-02 16824 17616 1.53050251489984e-01 16824 17640 3.40595559996941e-01 16824 17664 1.52289957766921e-01 16824 17688 1.91967388929648e-02 16825 16825 1.00000000000000e+00 16826 16826 1.00000000000000e+00 16827 16827 1.00000000000000e+00 16828 16828 1.00000000000000e+00 16829 16829 1.00000000000000e+00 16830 16830 1.00000000000000e+00 16831 16831 1.00000000000000e+00 16832 16832 1.00000000000000e+00 16833 16833 1.00000000000000e+00 16834 16834 1.00000000000000e+00 16835 16835 1.00000000000000e+00 16836 16836 1.00000000000000e+00 16837 16837 1.00000000000000e+00 16838 16838 1.00000000000000e+00 16839 16839 1.00000000000000e+00 16840 16840 1.00000000000000e+00 16841 16841 1.00000000000000e+00 16842 16842 1.00000000000000e+00 16843 16843 1.00000000000000e+00 16844 16844 1.00000000000000e+00 16845 16845 1.00000000000000e+00 16846 16846 1.00000000000000e+00 16847 16847 1.00000000000000e+00 16848 4533 -1.04917510642634e-04 16848 4557 -3.14289429538529e-04 16848 4581 -5.41995950758410e-07 16848 5109 -8.41167939047497e-06 16848 5133 -7.08050616192471e-02 16848 5157 -3.28645579300924e-01 16848 5181 -1.66742076918547e-01 16848 5205 -3.33212378989233e-03 16848 5709 -1.23074871066053e-02 16848 5733 -1.14612630496385e+00 16848 5757 -4.66363090861391e+00 16848 5781 -2.44933938889458e+00 16848 5805 -1.43978339114227e-01 16848 5829 -8.49783613857499e-05 16848 6309 -4.17062818071602e-02 16848 6333 -1.71860913009058e+00 16848 6357 -7.93340222138178e+00 16848 6381 -3.96244886125038e+00 16848 6405 -2.30669445532564e-01 16848 6429 -3.43528606209371e-05 16848 6909 -6.09418934663189e-03 16848 6933 -3.76017434900469e-01 16848 6957 -1.50118703445925e+00 16848 6981 -7.80770559015156e-01 16848 7005 -3.37284796292217e-02 16848 7533 -9.06390528705463e-04 16848 7557 -2.19885461768129e-02 16848 7581 -1.53834825153153e-02 16848 7605 -1.65162946727458e-05 16848 15984 2.15020085809401e-02 16848 16008 1.68889384934545e-01 16848 16032 3.74771086606596e-01 16848 16056 1.69856052940863e-01 16848 16080 2.17436755825198e-02 16848 16392 1.64759282144908e-01 16848 16416 1.30383898179603e+00 16848 16440 2.90903241462974e+00 16848 16848 7.36002245700799e+00 16848 16464 1.30506473169342e+00 16848 16488 1.65065719619256e-01 16848 16800 3.55382750414297e-01 16848 16824 2.83430511093286e+00 16848 16872 2.82694718723965e+00 16848 16896 3.53543269490995e-01 16848 17208 1.54254250016209e-01 16848 17232 1.23744127312553e+00 16848 17256 2.79178445855523e+00 16848 17280 1.24375673824566e+00 16848 17304 1.55833116296242e-01 16848 17616 1.88757505487653e-02 16848 17640 1.52289957766921e-01 16848 17664 3.45459097587969e-01 16848 17688 1.54529054578924e-01 16848 17712 1.94355247517661e-02 16849 16849 1.00000000000000e+00 16850 16850 1.00000000000000e+00 16851 16851 1.00000000000000e+00 16852 16852 1.00000000000000e+00 16853 16853 1.00000000000000e+00 16854 16854 1.00000000000000e+00 16855 16855 1.00000000000000e+00 16856 16856 1.00000000000000e+00 16857 16857 1.00000000000000e+00 16858 16858 1.00000000000000e+00 16859 16859 1.00000000000000e+00 16860 16860 1.00000000000000e+00 16861 16861 1.00000000000000e+00 16862 16862 1.00000000000000e+00 16863 16863 1.00000000000000e+00 16864 16864 1.00000000000000e+00 16865 16865 1.00000000000000e+00 16866 16866 1.00000000000000e+00 16867 16867 1.00000000000000e+00 16868 16868 1.00000000000000e+00 16869 16869 1.00000000000000e+00 16870 16870 1.00000000000000e+00 16871 16871 1.00000000000000e+00 16872 5133 -7.26889822415073e-05 16872 5157 -3.06138592859684e-02 16872 5181 -5.53882674114007e-02 16872 5205 -5.13431393213654e-03 16872 5733 -4.65170820385606e-02 16872 5757 -1.08618188199010e+00 16872 5781 -2.25808474336958e+00 16872 5805 -6.12047630761590e-01 16872 5829 -1.24654553297145e-02 16872 6309 -2.95151509768484e-05 16872 6333 -2.13828212972154e-01 16872 6357 -3.97166244870862e+00 16872 6381 -8.57804786423755e+00 16872 6405 -2.02840327989391e+00 16872 6429 -5.22627933309477e-02 16872 6909 -4.25390998073086e-05 16872 6933 -9.46399802028848e-02 16872 6957 -1.83374722468623e+00 16872 6981 -3.65852053446198e+00 16872 7005 -9.90842359720003e-01 16872 7029 -1.05393873554722e-02 16872 7533 -8.00980653817294e-04 16872 7557 -7.95778024835313e-02 16872 7581 -1.85183137996139e-01 16872 7605 -4.05088426167660e-02 16872 7629 -7.02160393795440e-07 16872 8181 -2.24011129438341e-05 16872 8205 -1.04073115619178e-05 16872 16008 2.07203376526960e-02 16872 16032 1.69856052940863e-01 16872 16056 3.90222179029296e-01 16872 16080 1.73386830555212e-01 16872 16104 2.16030320562831e-02 16872 16416 1.61200463304095e-01 16872 16440 1.30506473169342e+00 16872 16872 7.37694384582174e+00 16872 16464 2.97014860592264e+00 16872 16488 1.33184939331856e+00 16872 16512 1.67896628710379e-01 16872 16824 3.53193527318905e-01 16872 16848 2.82694718723965e+00 16872 16896 2.88240510455083e+00 16872 16920 3.67058006646698e-01 16872 17232 1.55106068265170e-01 16872 17256 1.24375673824566e+00 16872 17280 2.80798832008805e+00 16872 17304 1.26154202951682e+00 16872 17328 1.59552391082960e-01 16872 17640 1.91967388929648e-02 16872 17664 1.54529054578924e-01 16872 17688 3.49682107570650e-01 16872 17712 1.55809989604778e-01 16872 17736 1.95169726494284e-02 16873 16873 1.00000000000000e+00 16874 16874 1.00000000000000e+00 16875 16875 1.00000000000000e+00 16876 16876 1.00000000000000e+00 16877 16877 1.00000000000000e+00 16878 16878 1.00000000000000e+00 16879 16879 1.00000000000000e+00 16880 16880 1.00000000000000e+00 16881 16881 1.00000000000000e+00 16882 16882 1.00000000000000e+00 16883 16883 1.00000000000000e+00 16884 16884 1.00000000000000e+00 16885 16885 1.00000000000000e+00 16886 16886 1.00000000000000e+00 16887 16887 1.00000000000000e+00 16888 16888 1.00000000000000e+00 16889 16889 1.00000000000000e+00 16890 16890 1.00000000000000e+00 16891 16891 1.00000000000000e+00 16892 16892 1.00000000000000e+00 16893 16893 1.00000000000000e+00 16894 16894 1.00000000000000e+00 16895 16895 1.00000000000000e+00 16896 5157 -1.52757987606128e-04 16896 5181 -5.05902499824354e-03 16896 5205 -1.21445491145518e-03 16896 5757 -6.23693251947756e-02 16896 5781 -5.99376677632788e-01 16896 5805 -6.58101042165483e-01 16896 5829 -6.57338060232606e-02 16896 5853 -1.43822464621434e-04 16896 6333 -1.17815807475608e-03 16896 6357 -6.13801984343046e-01 16896 6381 -5.24984454072558e+00 16896 6405 -5.35935612814163e+00 16896 6429 -6.07890324229403e-01 16896 6453 -5.15015269182187e-03 16896 6933 -4.85672977793043e-03 16896 6957 -5.74376861200477e-01 16896 6981 -5.25957862952256e+00 16896 7005 -5.31142189658318e+00 16896 7029 -6.39847535218470e-01 16896 7053 -1.29536421402410e-03 16896 7533 -1.53172366412970e-04 16896 7557 -6.33960961775749e-02 16896 7581 -6.28313393694458e-01 16896 7605 -5.92579518169758e-01 16896 7629 -6.46783074102996e-02 16896 8181 -1.31385706373235e-03 16896 8205 -5.16812501595184e-03 16896 8229 -1.51013638628266e-04 16896 16032 2.17436755825198e-02 16896 16056 1.73386830555212e-01 16896 16080 3.89017067783710e-01 16896 16104 1.72911645427777e-01 16896 16128 2.16248793006611e-02 16896 16440 1.65065719619256e-01 16896 16896 7.59293535998898e+00 16896 16464 1.33184939331856e+00 16896 16488 3.01906849351882e+00 16896 16512 1.34221337297530e+00 16896 16536 1.67656714533442e-01 16896 16848 3.53543269490995e-01 16896 16872 2.88240510455083e+00 16896 16920 2.93408796318916e+00 16896 16944 3.66463984150578e-01 16896 17256 1.55833116296242e-01 16896 17280 1.26154202951682e+00 16896 17304 2.87066983306136e+00 16896 17328 1.28620340208265e+00 16896 17352 1.61998459437698e-01 16896 17664 1.94355247517661e-02 16896 17688 1.55809989604778e-01 16896 17712 3.51917402669346e-01 16896 17736 1.58909152704614e-01 16896 17760 2.02103155267251e-02 16897 16897 1.00000000000000e+00 16898 16898 1.00000000000000e+00 16899 16899 1.00000000000000e+00 16900 16900 1.00000000000000e+00 16901 16901 1.00000000000000e+00 16902 16902 1.00000000000000e+00 16903 16903 1.00000000000000e+00 16904 16904 1.00000000000000e+00 16905 16905 1.00000000000000e+00 16906 16906 1.00000000000000e+00 16907 16907 1.00000000000000e+00 16908 16908 1.00000000000000e+00 16909 16909 1.00000000000000e+00 16910 16910 1.00000000000000e+00 16911 16911 1.00000000000000e+00 16912 16912 1.00000000000000e+00 16913 16913 1.00000000000000e+00 16914 16914 1.00000000000000e+00 16915 16915 1.00000000000000e+00 16916 16916 1.00000000000000e+00 16917 16917 1.00000000000000e+00 16918 16918 1.00000000000000e+00 16919 16919 1.00000000000000e+00 16920 5181 -8.76502208940870e-06 16920 5205 -1.80659238066759e-05 16920 5757 -6.22249116570490e-07 16920 5781 -4.20503355344799e-02 16920 5805 -1.94900128605115e-01 16920 5829 -8.21777190579347e-02 16920 5853 -7.66819923937588e-04 16920 6357 -1.02953049434362e-02 16920 6381 -9.93116571711702e-01 16920 6405 -3.78383013424043e+00 16920 6429 -1.97095422806588e+00 16920 6453 -1.09952822002810e-01 16920 6477 -4.71154979898955e-05 16920 6957 -4.94140797644584e-02 16920 6981 -2.01599738264807e+00 16920 7005 -8.86448444529007e+00 16920 7029 -4.25765599427588e+00 16920 7053 -2.45488223812449e-01 16920 7077 -3.40800829606924e-05 16920 7557 -1.20177584135245e-02 16920 7581 -5.94848422720130e-01 16920 7605 -2.30331252695498e+00 16920 7629 -1.18550249725812e+00 16920 7653 -5.17816687505491e-02 16920 8181 -5.56934197282925e-03 16920 8205 -6.02435661366244e-02 16920 8229 -3.39204386699661e-02 16920 8253 -8.35721701630052e-05 16920 16056 2.16030320562831e-02 16920 16080 1.72911645427777e-01 16920 16104 3.91566460757748e-01 16920 16128 1.82360956766196e-01 16920 16152 2.39653598908879e-02 16920 16920 7.61989303799183e+00 16920 16464 1.67896628710379e-01 16920 16488 1.34221337297530e+00 16920 16512 3.03214513306497e+00 16920 16536 1.39759114541161e+00 16920 16560 1.81741071819456e-01 16920 16872 3.67058006646698e-01 16920 16896 2.93408796318916e+00 16920 16944 3.02350107634497e+00 16920 16968 3.89411284935651e-01 16920 17280 1.59552391082960e-01 16920 17304 1.28620340208265e+00 16920 17328 2.92511695842667e+00 16920 17352 1.34235070311272e+00 16920 17376 1.73589216340478e-01 16920 17688 1.95169726494284e-02 16920 17712 1.58909152704614e-01 16920 17736 3.64809417098173e-01 16920 17760 1.68550846191473e-01 16920 17784 2.19273960211432e-02 16921 16921 1.00000000000000e+00 16922 16922 1.00000000000000e+00 16923 16923 1.00000000000000e+00 16924 16924 1.00000000000000e+00 16925 16925 1.00000000000000e+00 16926 16926 1.00000000000000e+00 16927 16927 1.00000000000000e+00 16928 16928 1.00000000000000e+00 16929 16929 1.00000000000000e+00 16930 16930 1.00000000000000e+00 16931 16931 1.00000000000000e+00 16932 16932 1.00000000000000e+00 16933 16933 1.00000000000000e+00 16934 16934 1.00000000000000e+00 16935 16935 1.00000000000000e+00 16936 16936 1.00000000000000e+00 16937 16937 1.00000000000000e+00 16938 16938 1.00000000000000e+00 16939 16939 1.00000000000000e+00 16940 16940 1.00000000000000e+00 16941 16941 1.00000000000000e+00 16942 16942 1.00000000000000e+00 16943 16943 1.00000000000000e+00 16944 5781 -1.67984462863558e-05 16944 5805 -1.62013567064916e-02 16944 5829 -2.30088250458344e-02 16944 5853 -9.09969541231176e-04 16944 6381 -3.45663066015178e-02 16944 6405 -8.23602821426855e-01 16944 6429 -1.71506375002891e+00 16944 6453 -4.60405244955105e-01 16944 6477 -8.24395122984934e-03 16944 6957 -3.38155601221637e-05 16944 6981 -2.32535662013764e-01 16944 7005 -4.23415220768883e+00 16944 7029 -8.88021871768788e+00 16944 7053 -2.11930396500521e+00 16944 7077 -5.81648819907573e-02 16944 7557 -8.79221394985312e-05 16944 7581 -1.43723768517554e-01 16944 7605 -2.65973954927667e+00 16944 7629 -5.34832249232643e+00 16944 7653 -1.42191071427140e+00 16944 7677 -1.62745062553763e-02 16944 8181 -3.82397426018653e-03 16944 8205 -1.90281153849868e-01 16944 8229 -3.96364039902626e-01 16944 8253 -8.96751616157923e-02 16944 8277 -1.13997207202415e-05 16944 8805 -1.21126830761592e-06 16944 8829 -4.57831467629268e-04 16944 8853 -1.45918259762635e-04 16944 16080 2.16248793006611e-02 16944 16104 1.82360956766196e-01 16944 16128 4.32776592204251e-01 16944 16152 2.06685258161089e-01 16944 16176 2.77059546493843e-02 16944 16944 8.04427054762158e+00 16944 16488 1.67656714533442e-01 16944 16512 1.39759114541161e+00 16944 16536 3.28472507352781e+00 16944 16560 1.56380912680985e+00 16944 16584 2.09211209883002e-01 16944 16896 3.66463984150578e-01 16944 16920 3.02350107634497e+00 16944 16968 3.34654915774403e+00 16944 16992 4.47226004500340e-01 16944 17304 1.61998459437698e-01 16944 17328 1.34235070311272e+00 16944 17352 3.14169525100726e+00 16944 17376 1.50343418584935e+00 16944 17400 2.02269330121856e-01 16944 17712 2.02103155267251e-02 16944 17736 1.68550846191473e-01 16944 17760 3.97019136574115e-01 16944 17784 1.91591522920964e-01 16944 17808 2.59704847090979e-02 16945 16945 1.00000000000000e+00 16946 16946 1.00000000000000e+00 16947 16947 1.00000000000000e+00 16948 16948 1.00000000000000e+00 16949 16949 1.00000000000000e+00 16950 16950 1.00000000000000e+00 16951 16951 1.00000000000000e+00 16952 16952 1.00000000000000e+00 16953 16953 1.00000000000000e+00 16954 16954 1.00000000000000e+00 16955 16955 1.00000000000000e+00 16956 16956 1.00000000000000e+00 16957 16957 1.00000000000000e+00 16958 16958 1.00000000000000e+00 16959 16959 1.00000000000000e+00 16960 16960 1.00000000000000e+00 16961 16961 1.00000000000000e+00 16962 16962 1.00000000000000e+00 16963 16963 1.00000000000000e+00 16964 16964 1.00000000000000e+00 16965 16965 1.00000000000000e+00 16966 16966 1.00000000000000e+00 16967 16967 1.00000000000000e+00 16968 5805 -4.99741004108008e-05 16968 5829 -1.46560958747291e-03 16968 5853 -1.91637324661207e-04 16968 6405 -4.19819363012443e-02 16968 6429 -4.41673679756457e-01 16968 6453 -4.87379513125258e-01 16968 6477 -3.82846590392055e-02 16968 6501 -1.30936415916661e-05 16968 6981 -9.54445888291205e-04 16968 7005 -6.31129289373409e-01 16968 7029 -5.30453705292577e+00 16968 7053 -5.28864690628285e+00 16968 7077 -5.06189018822975e-01 16968 7101 -3.42397024350178e-03 16968 7581 -6.95654844075527e-03 16968 7605 -8.20278751359092e-01 16968 7629 -7.42284113932560e+00 16968 7653 -6.52746285474579e+00 16968 7677 -5.98577294457413e-01 16968 7701 -1.52551360576185e-03 16968 8181 -6.49930412057381e-04 16968 8205 -1.44830657291904e-01 16968 8229 -1.20828029646939e+00 16968 8253 -8.51279404173907e-01 16968 8277 -8.38121177760765e-02 16968 8301 -9.70816716290000e-10 16968 8805 -5.13822501368428e-06 16968 8829 -5.20445063742408e-03 16968 8853 -1.07430284427305e-02 16968 8877 -2.99572453049502e-04 16968 16104 2.39653598908879e-02 16968 16128 2.06685258161089e-01 16968 16152 4.87437578200071e-01 16968 16176 1.91531594273673e-01 16968 16200 2.01769439190340e-02 16968 16968 8.85982970989343e+00 16968 16512 1.81741071819456e-01 16968 16536 1.56380912680985e+00 16968 16560 3.67969130569637e+00 16968 16584 1.43912834252728e+00 16968 16608 1.50570875748814e-01 16968 16920 3.89411284935651e-01 16968 16944 3.34654915774403e+00 16968 16992 3.04811342980968e+00 16968 17016 3.14802352952066e-01 16968 17328 1.73589216340478e-01 16968 17352 1.50343418584935e+00 16968 17376 3.54045363333220e+00 16968 17400 1.33129786065528e+00 16968 17424 1.30555135041961e-01 16968 17736 2.19273960211432e-02 16968 17760 1.91591522920964e-01 16968 17784 4.52628160109030e-01 16968 17808 1.64573973805674e-01 16968 17832 1.51730087423207e-02 16969 16969 1.00000000000000e+00 16970 16970 1.00000000000000e+00 16971 16971 1.00000000000000e+00 16972 16972 1.00000000000000e+00 16973 16973 1.00000000000000e+00 16974 16974 1.00000000000000e+00 16975 16975 1.00000000000000e+00 16976 16976 1.00000000000000e+00 16977 16977 1.00000000000000e+00 16978 16978 1.00000000000000e+00 16979 16979 1.00000000000000e+00 16980 16980 1.00000000000000e+00 16981 16981 1.00000000000000e+00 16982 16982 1.00000000000000e+00 16983 16983 1.00000000000000e+00 16984 16984 1.00000000000000e+00 16985 16985 1.00000000000000e+00 16986 16986 1.00000000000000e+00 16987 16987 1.00000000000000e+00 16988 16988 1.00000000000000e+00 16989 16989 1.00000000000000e+00 16990 16990 1.00000000000000e+00 16991 16991 1.00000000000000e+00 16992 5829 -1.82286164144400e-08 16992 5853 -2.68148023391800e-08 16992 6405 -3.40300235706000e-09 16992 6429 -3.00750972078247e-02 16992 6453 -1.24457816678190e-01 16992 6477 -3.30507753107734e-02 16992 6501 -9.97392066839201e-05 16992 7005 -9.62297346308554e-03 16992 7029 -9.36190402441613e-01 16992 7053 -2.99889266328810e+00 16992 7077 -1.99097178969357e+00 16992 7101 -8.67773264820844e-02 16992 7605 -7.02222855708147e-02 16992 7629 -2.34143120142445e+00 16992 7653 -1.17788140657173e+01 16992 7677 -8.81234700362108e+00 16992 7701 -6.68357069655323e-02 16992 8205 -2.67245997549215e-02 16992 8229 -8.00085278224110e-01 16992 8253 -5.46128485173967e+00 16992 8277 -2.79768642905916e+00 16992 8301 -1.50043593642070e-06 16992 8805 -2.38387544049827e-06 16992 8829 -2.25678303861428e-02 16992 8853 -1.97918336106533e-01 16992 8877 -2.00238148159735e-02 16992 16128 2.77059546493843e-02 16992 16152 1.91531594273673e-01 16992 16176 4.54506170724276e-01 16992 16200 2.88646002416831e-01 16992 16992 9.81721687035791e+00 16992 16536 2.09211209883002e-01 16992 16560 1.43912834252728e+00 16992 16584 3.81228929594187e+00 16992 16608 2.99017165115084e+00 16992 16944 4.47226004500340e-01 16992 16968 3.04811342980968e+00 16992 17016 7.92551584905691e+00 16992 17352 2.02269330121856e-01 16992 17376 1.33129786065528e+00 16992 17400 3.53687360286308e+00 16992 17424 3.01366476430747e+00 16992 17760 2.59704847090979e-02 16992 17784 1.64573973805674e-01 16992 17808 3.85652247454580e-01 16992 17832 2.94519280705986e-01 16993 16993 1.00000000000000e+00 16994 16994 1.00000000000000e+00 16995 16995 1.00000000000000e+00 16996 16996 1.00000000000000e+00 16997 16997 1.00000000000000e+00 16998 16998 1.00000000000000e+00 16999 16999 1.00000000000000e+00 17000 17000 1.00000000000000e+00 17001 17001 1.00000000000000e+00 17002 17002 1.00000000000000e+00 17003 17003 1.00000000000000e+00 17004 17004 1.00000000000000e+00 17005 17005 1.00000000000000e+00 17006 17006 1.00000000000000e+00 17007 17007 1.00000000000000e+00 17008 17008 1.00000000000000e+00 17009 17009 1.00000000000000e+00 17010 17010 1.00000000000000e+00 17011 17011 1.00000000000000e+00 17012 17012 1.00000000000000e+00 17013 17013 1.00000000000000e+00 17014 17014 1.00000000000000e+00 17015 17015 1.00000000000000e+00 17016 6429 -2.51866616999208e-06 17016 6453 -6.72695047920784e-03 17016 6477 -7.88146601817168e-03 17016 6501 -1.07822922226178e-04 17016 7029 -1.97720813716516e-02 17016 7053 -7.35724208401044e-01 17016 7077 -1.94760161133882e+00 17016 7101 -1.49586861259656e-01 17016 7605 -2.08381299950427e-05 17016 7629 -1.98215657855400e-01 17016 7653 -9.81224485046757e+00 17016 7677 -1.38577901086800e+01 17016 7701 -1.22992818690732e-01 17016 8205 -1.19661164935188e-04 17016 8229 -2.12057904827484e-01 17016 8253 -7.28706157576676e+00 17016 8277 -5.00898442642449e+00 17016 8301 -2.99407615582734e-06 17016 8805 -2.93151783220590e-07 17016 8829 -2.06081244686780e-02 17016 8853 -3.24429347867781e-01 17016 8877 -3.79506224606006e-02 17016 16152 2.01769439190340e-02 17016 16176 2.88646002416831e-01 17016 16200 4.36053397400423e-01 17016 17016 1.46474152274493e+01 17016 16560 1.50570875748814e-01 17016 16584 2.99017165115085e+00 17016 16608 4.92634717205998e+00 17016 16968 3.14802352952066e-01 17016 16992 7.92551584905691e+00 17016 17376 1.30555135041961e-01 17016 17400 3.01366476430747e+00 17016 17424 5.11344358332120e+00 17016 17784 1.51730087423207e-02 17016 17808 2.94519280705986e-01 17016 17832 4.82827500215728e-01 17017 17017 1.00000000000000e+00 17018 17018 1.00000000000000e+00 17019 17019 1.00000000000000e+00 17020 17020 1.00000000000000e+00 17021 17021 1.00000000000000e+00 17022 17022 1.00000000000000e+00 17023 17023 1.00000000000000e+00 17024 17024 1.00000000000000e+00 17025 17025 1.00000000000000e+00 17026 17026 1.00000000000000e+00 17027 17027 1.00000000000000e+00 17028 17028 1.00000000000000e+00 17029 17029 1.00000000000000e+00 17030 17030 1.00000000000000e+00 17031 17031 1.00000000000000e+00 17032 17032 1.00000000000000e+00 17033 17033 1.00000000000000e+00 17034 17034 1.00000000000000e+00 17035 17035 1.00000000000000e+00 17036 17036 1.00000000000000e+00 17037 17037 1.00000000000000e+00 17038 17038 1.00000000000000e+00 17039 17039 1.00000000000000e+00 17040 3213 -1.42105665122835e-02 17040 3237 -2.65905112531984e-02 17040 3261 -7.22506791617707e-06 17040 3789 -2.27267444385334e-03 17040 3813 -2.84652083002149e+00 17040 3837 -2.55228025707649e+00 17040 3861 -2.05692093069995e-02 17040 4389 -8.37008468300366e-01 17040 4413 -1.34003793834150e+01 17040 4437 -4.33414068707040e+00 17040 4461 -5.14093378669864e-02 17040 4989 -1.54591739054221e+00 17040 5013 -5.61186521115540e+00 17040 5037 -9.47053835614428e-01 17040 5061 -8.36244219545003e-03 17040 5589 -8.48984408304495e-02 17040 5613 -1.56683939199436e-01 17040 5637 -1.67149292436564e-02 17040 5661 -8.94809260414000e-09 17040 6213 -2.82679919691200e-08 17040 6237 -1.92421531558400e-08 17040 16224 8.61664151815911e-01 17040 16248 4.90225838751257e-01 17040 16272 1.69696465266574e-02 17040 17040 9.57031379276851e+00 17040 16632 5.21571305960729e+00 17040 16656 3.13883496231910e+00 17040 16680 1.51708123575842e-01 17040 17064 5.56573923087675e+00 17040 17088 3.65880666997848e-01 17040 17448 4.29875177865565e+00 17040 17472 2.63307945879087e+00 17040 17496 1.38201019846583e-01 17040 17856 6.32423831578000e-01 17040 17880 3.63786962869199e-01 17040 17904 1.35928705943427e-02 17041 17041 1.00000000000000e+00 17042 17042 1.00000000000000e+00 17043 17043 1.00000000000000e+00 17044 17044 1.00000000000000e+00 17045 17045 1.00000000000000e+00 17046 17046 1.00000000000000e+00 17047 17047 1.00000000000000e+00 17048 17048 1.00000000000000e+00 17049 17049 1.00000000000000e+00 17050 17050 1.00000000000000e+00 17051 17051 1.00000000000000e+00 17052 17052 1.00000000000000e+00 17053 17053 1.00000000000000e+00 17054 17054 1.00000000000000e+00 17055 17055 1.00000000000000e+00 17056 17056 1.00000000000000e+00 17057 17057 1.00000000000000e+00 17058 17058 1.00000000000000e+00 17059 17059 1.00000000000000e+00 17060 17060 1.00000000000000e+00 17061 17061 1.00000000000000e+00 17062 17062 1.00000000000000e+00 17063 17063 1.00000000000000e+00 17064 3213 -7.39950019853676e-03 17064 3237 -1.42217084326021e-02 17064 3261 -5.73103372691874e-06 17064 3789 -1.16143813803570e-03 17064 3813 -1.64156849315697e+00 17064 3837 -1.92125528213324e+00 17064 3861 -1.13112689805212e-01 17064 3885 -7.09905820190926e-04 17064 4389 -4.56253711353295e-01 17064 4413 -1.01403827040803e+01 17064 4437 -7.61855577416926e+00 17064 4461 -8.31720144615531e-01 17064 4485 -8.02865271786982e-03 17064 4989 -8.79965056906100e-01 17064 5013 -5.86735061115188e+00 17064 5037 -5.10178297208419e+00 17064 5061 -7.67651190101427e-01 17064 5085 -1.17783345955631e-03 17064 5589 -5.65856354692896e-02 17064 5613 -3.49286089514230e-01 17064 5637 -4.28266688460056e-01 17064 5661 -5.14144086384409e-02 17064 6213 -2.23427793991182e-04 17064 6237 -1.69124856312049e-03 17064 6261 -6.02398997712603e-05 17064 16224 4.90225838751257e-01 17064 16248 5.07262721643464e-01 17064 16272 1.66177589685158e-01 17064 16296 2.45747508946320e-02 17064 17064 9.38018160737697e+00 17064 16632 3.13883496231910e+00 17064 16656 3.89793934425661e+00 17064 16680 1.42526502644428e+00 17064 16704 2.04608133035225e-01 17064 17040 5.56573923087675e+00 17064 17088 3.36345328386543e+00 17064 17112 4.74982653968493e-01 17064 17448 2.63307945879087e+00 17064 17472 3.45834867769262e+00 17064 17496 1.38078276116627e+00 17064 17520 2.06994670444980e-01 17064 17856 3.63786962869199e-01 17064 17880 3.97365055002468e-01 17064 17904 1.55057023365654e-01 17064 17928 2.51713852470707e-02 17065 17065 1.00000000000000e+00 17066 17066 1.00000000000000e+00 17067 17067 1.00000000000000e+00 17068 17068 1.00000000000000e+00 17069 17069 1.00000000000000e+00 17070 17070 1.00000000000000e+00 17071 17071 1.00000000000000e+00 17072 17072 1.00000000000000e+00 17073 17073 1.00000000000000e+00 17074 17074 1.00000000000000e+00 17075 17075 1.00000000000000e+00 17076 17076 1.00000000000000e+00 17077 17077 1.00000000000000e+00 17078 17078 1.00000000000000e+00 17079 17079 1.00000000000000e+00 17080 17080 1.00000000000000e+00 17081 17081 1.00000000000000e+00 17082 17082 1.00000000000000e+00 17083 17083 1.00000000000000e+00 17084 17084 1.00000000000000e+00 17085 17085 1.00000000000000e+00 17086 17086 1.00000000000000e+00 17087 17087 1.00000000000000e+00 17088 3213 -8.40619835414269e-05 17088 3237 -2.64700801715131e-04 17088 3261 -6.05285648237200e-07 17088 3789 -7.17169031686446e-06 17088 3813 -6.26822243240912e-02 17088 3837 -3.17162331399170e-01 17088 3861 -1.94606147503319e-01 17088 3885 -4.05950296912925e-03 17088 4389 -1.07855649151747e-02 17088 4413 -1.20726376709721e+00 17088 4437 -5.68289186565238e+00 17088 4461 -3.01355636355886e+00 17088 4485 -1.55321867795441e-01 17088 4509 -9.92519568879602e-05 17088 4989 -3.06935392903582e-02 17088 5013 -1.87862984396715e+00 17088 5037 -1.02349311736186e+01 17088 5061 -4.91376916156051e+00 17088 5085 -2.53257024583946e-01 17088 5109 -4.00601221406904e-05 17088 5589 -4.21211943045388e-03 17088 5613 -4.36925577003898e-01 17088 5637 -1.87406138757866e+00 17088 5661 -9.05256029698995e-01 17088 5685 -3.85963268737251e-02 17088 6213 -1.04604514369131e-03 17088 6237 -2.47456816655711e-02 17088 6261 -1.72064983002767e-02 17088 6285 -2.09075466857393e-05 17088 16224 1.69696465266574e-02 17088 16248 1.66177589685158e-01 17088 16272 4.31790540141430e-01 17088 16296 1.84798520781172e-01 17088 16320 2.16248793006610e-02 17088 17088 9.35462019827774e+00 17088 16632 1.51708123575842e-01 17088 16656 1.42526502644428e+00 17088 16680 3.59834989756730e+00 17088 16704 1.51007911385202e+00 17088 16728 1.72911645427776e-01 17088 17040 3.65880666997848e-01 17088 17064 3.36345328386543e+00 17088 17112 3.45599888700887e+00 17088 17136 3.89017067783708e-01 17088 17448 1.38201019846583e-01 17088 17472 1.38078276116627e+00 17088 17496 3.62350257752155e+00 17088 17520 1.52152600400077e+00 17088 17544 1.73386830555207e-01 17088 17856 1.35928705943427e-02 17088 17880 1.55057023365654e-01 17088 17904 4.38078710129993e-01 17088 17928 1.87660243318358e-01 17088 17952 2.17436755825188e-02 17089 17089 1.00000000000000e+00 17090 17090 1.00000000000000e+00 17091 17091 1.00000000000000e+00 17092 17092 1.00000000000000e+00 17093 17093 1.00000000000000e+00 17094 17094 1.00000000000000e+00 17095 17095 1.00000000000000e+00 17096 17096 1.00000000000000e+00 17097 17097 1.00000000000000e+00 17098 17098 1.00000000000000e+00 17099 17099 1.00000000000000e+00 17100 17100 1.00000000000000e+00 17101 17101 1.00000000000000e+00 17102 17102 1.00000000000000e+00 17103 17103 1.00000000000000e+00 17104 17104 1.00000000000000e+00 17105 17105 1.00000000000000e+00 17106 17106 1.00000000000000e+00 17107 17107 1.00000000000000e+00 17108 17108 1.00000000000000e+00 17109 17109 1.00000000000000e+00 17110 17110 1.00000000000000e+00 17111 17111 1.00000000000000e+00 17112 3813 -8.30543836997973e-05 17112 3837 -3.63021842950960e-02 17112 3861 -6.35762543224439e-02 17112 3885 -5.60829570506774e-03 17112 4413 -6.04023209590327e-02 17112 4437 -1.35589596977103e+00 17112 4461 -2.46519311509011e+00 17112 4485 -6.26267686291772e-01 17112 4509 -1.23920601170130e-02 17112 4989 -3.23866062505970e-05 17112 5013 -2.74822116270493e-01 17112 5037 -4.72026243498163e+00 17112 5061 -9.44829471250612e+00 17112 5085 -2.10508368685631e+00 17112 5109 -5.20208389584607e-02 17112 5589 -4.66156117325989e-05 17112 5613 -1.15666008616456e-01 17112 5637 -2.05289357518910e+00 17112 5661 -3.93415720552649e+00 17112 5685 -1.01643732635627e+00 17112 5709 -1.10223094013720e-02 17112 6213 -8.34346672447790e-04 17112 6237 -8.46942034598075e-02 17112 6261 -1.90167096788184e-01 17112 6285 -4.08970490628928e-02 17112 6309 -9.73631128109040e-07 17112 6861 -2.02242391247020e-05 17112 6885 -9.82651904440210e-06 17112 16248 2.45747508946320e-02 17112 16272 1.84798520781172e-01 17112 16296 3.90862119037907e-01 17112 16320 1.67656714533441e-01 17112 16344 2.02892993326993e-02 17112 17112 8.06500579410403e+00 17112 16656 2.04608133035225e-01 17112 16680 1.51007911385202e+00 17112 16704 3.13383615769574e+00 17112 16728 1.34221337297528e+00 17112 16752 1.62641697816040e-01 17112 17064 4.74982653968493e-01 17112 17088 3.45599888700887e+00 17112 17136 3.01906849351875e+00 17112 17160 3.65750055595965e-01 17112 17472 2.06994670444980e-01 17112 17496 1.52152600400077e+00 17112 17520 3.14075947710278e+00 17112 17544 1.33184939331853e+00 17112 17568 1.59575517774422e-01 17112 17880 2.51713852470707e-02 17112 17904 1.87660243318358e-01 17112 17928 3.92592948889666e-01 17112 17952 1.65065719619254e-01 17112 17976 1.95227543222948e-02 17113 17113 1.00000000000000e+00 17114 17114 1.00000000000000e+00 17115 17115 1.00000000000000e+00 17116 17116 1.00000000000000e+00 17117 17117 1.00000000000000e+00 17118 17118 1.00000000000000e+00 17119 17119 1.00000000000000e+00 17120 17120 1.00000000000000e+00 17121 17121 1.00000000000000e+00 17122 17122 1.00000000000000e+00 17123 17123 1.00000000000000e+00 17124 17124 1.00000000000000e+00 17125 17125 1.00000000000000e+00 17126 17126 1.00000000000000e+00 17127 17127 1.00000000000000e+00 17128 17128 1.00000000000000e+00 17129 17129 1.00000000000000e+00 17130 17130 1.00000000000000e+00 17131 17131 1.00000000000000e+00 17132 17132 1.00000000000000e+00 17133 17133 1.00000000000000e+00 17134 17134 1.00000000000000e+00 17135 17135 1.00000000000000e+00 17136 3837 -1.43822464621434e-04 17136 3861 -5.15015269182185e-03 17136 3885 -1.29536421402409e-03 17136 4437 -6.57338060232603e-02 17136 4461 -6.07890324229406e-01 17136 4485 -6.39847535218463e-01 17136 4509 -6.46783074102988e-02 17136 4533 -1.51013638628263e-04 17136 5013 -1.21445491145512e-03 17136 5037 -6.58101042165475e-01 17136 5061 -5.35935612814149e+00 17136 5085 -5.31142189658302e+00 17136 5109 -5.92579518169749e-01 17136 5133 -5.16812501595177e-03 17136 5613 -5.05902499824330e-03 17136 5637 -5.99376677632776e-01 17136 5661 -5.24984454072547e+00 17136 5685 -5.25957862952243e+00 17136 5709 -6.28313393694452e-01 17136 5733 -1.31385706373233e-03 17136 6213 -1.52757987606121e-04 17136 6237 -6.23693251947759e-02 17136 6261 -6.13801984343057e-01 17136 6285 -5.74376861200483e-01 17136 6309 -6.33960961775750e-02 17136 6861 -1.17815807475611e-03 17136 6885 -4.85672977793055e-03 17136 6909 -1.53172366412974e-04 17136 16272 2.16248793006610e-02 17136 16296 1.67656714533441e-01 17136 16320 3.66463984150574e-01 17136 16344 1.61998459437696e-01 17136 16368 2.02103155267248e-02 17136 17136 7.59293535998873e+00 17136 16680 1.72911645427776e-01 17136 16704 1.34221337297528e+00 17136 16728 2.93408796318908e+00 17136 16752 1.28620340208262e+00 17136 16776 1.58909152704612e-01 17136 17088 3.89017067783708e-01 17136 17112 3.01906849351875e+00 17136 17160 2.87066983306129e+00 17136 17184 3.51917402669344e-01 17136 17496 1.73386830555207e-01 17136 17520 1.33184939331853e+00 17136 17544 2.88240510455080e+00 17136 17568 1.26154202951682e+00 17136 17592 1.55809989604779e-01 17136 17904 2.17436755825188e-02 17136 17928 1.65065719619254e-01 17136 17952 3.53543269491002e-01 17136 17976 1.55833116296245e-01 17136 18000 1.94355247517665e-02 17137 17137 1.00000000000000e+00 17138 17138 1.00000000000000e+00 17139 17139 1.00000000000000e+00 17140 17140 1.00000000000000e+00 17141 17141 1.00000000000000e+00 17142 17142 1.00000000000000e+00 17143 17143 1.00000000000000e+00 17144 17144 1.00000000000000e+00 17145 17145 1.00000000000000e+00 17146 17146 1.00000000000000e+00 17147 17147 1.00000000000000e+00 17148 17148 1.00000000000000e+00 17149 17149 1.00000000000000e+00 17150 17150 1.00000000000000e+00 17151 17151 1.00000000000000e+00 17152 17152 1.00000000000000e+00 17153 17153 1.00000000000000e+00 17154 17154 1.00000000000000e+00 17155 17155 1.00000000000000e+00 17156 17156 1.00000000000000e+00 17157 17157 1.00000000000000e+00 17158 17158 1.00000000000000e+00 17159 17159 1.00000000000000e+00 17160 3861 -8.75431199719495e-06 17160 3885 -1.88711314146374e-05 17160 4437 -4.31404717765000e-07 17160 4461 -3.97012792058160e-02 17160 4485 -1.85449956010224e-01 17160 4509 -7.96429948358936e-02 17160 4533 -7.78915299212616e-04 17160 5037 -9.66017648426699e-03 17160 5061 -9.67683053614479e-01 17160 5085 -3.64136977461592e+00 17160 5109 -1.86500071194450e+00 17160 5133 -9.71852575256437e-02 17160 5157 -4.63546319988521e-05 17160 5637 -4.71831589024726e-02 17160 5661 -1.93651044840103e+00 17160 5685 -8.46920094647177e+00 17160 5709 -3.99347476231917e+00 17160 5733 -2.18693144643843e-01 17160 5757 -3.34854865003058e-05 17160 6237 -1.13664813412545e-02 17160 6261 -5.59277921064767e-01 17160 6285 -2.14744083978137e+00 17160 6309 -1.07520244867281e+00 17160 6333 -4.78374423681398e-02 17160 6861 -4.92164144620354e-03 17160 6885 -5.25159046809858e-02 17160 6909 -2.93382054589836e-02 17160 6933 -8.04923988436111e-05 17160 16296 2.02892993326993e-02 17160 16320 1.61998459437696e-01 17160 16344 3.63411835229287e-01 17160 16368 1.59871211982864e-01 17160 16392 1.97574874689911e-02 17160 17160 7.34294864953841e+00 17160 16704 1.62641697816040e-01 17160 16728 1.28620340208262e+00 17160 16752 2.86118619082832e+00 17160 16776 1.25962880977218e+00 17160 16800 1.55998049738430e-01 17160 17112 3.65750055595965e-01 17160 17136 2.87066983306129e+00 17160 17184 2.79375021560830e+00 17160 17208 3.46520151232717e-01 17160 17520 1.59575517774422e-01 17160 17544 1.26154202951682e+00 17160 17568 2.80506450856887e+00 17160 17592 1.23335658689082e+00 17160 17616 1.52529157117923e-01 17160 17928 1.95227543222948e-02 17160 17952 1.55833116296245e-01 17160 17976 3.49381414664424e-01 17160 18000 1.53303156262524e-01 17160 18024 1.88902643138646e-02 17161 17161 1.00000000000000e+00 17162 17162 1.00000000000000e+00 17163 17163 1.00000000000000e+00 17164 17164 1.00000000000000e+00 17165 17165 1.00000000000000e+00 17166 17166 1.00000000000000e+00 17167 17167 1.00000000000000e+00 17168 17168 1.00000000000000e+00 17169 17169 1.00000000000000e+00 17170 17170 1.00000000000000e+00 17171 17171 1.00000000000000e+00 17172 17172 1.00000000000000e+00 17173 17173 1.00000000000000e+00 17174 17174 1.00000000000000e+00 17175 17175 1.00000000000000e+00 17176 17176 1.00000000000000e+00 17177 17177 1.00000000000000e+00 17178 17178 1.00000000000000e+00 17179 17179 1.00000000000000e+00 17180 17180 1.00000000000000e+00 17181 17181 1.00000000000000e+00 17182 17182 1.00000000000000e+00 17183 17183 1.00000000000000e+00 17184 4461 -1.38112665047085e-05 17184 4485 -1.51559787944261e-02 17184 4509 -2.16090931874468e-02 17184 4533 -8.50483332369722e-04 17184 5061 -3.19984746935319e-02 17184 5085 -7.66829074925670e-01 17184 5109 -1.49717127446898e+00 17184 5133 -3.81038440365992e-01 17184 5157 -6.15205480232561e-03 17184 5637 -2.76739317972472e-05 17184 5661 -2.15879675201223e-01 17184 5685 -3.84397367768762e+00 17184 5709 -7.82063470981180e+00 17184 5733 -1.73159753784729e+00 17184 5757 -4.32773454137623e-02 17184 6237 -7.18384143752460e-05 17184 6261 -1.30268316315285e-01 17184 6285 -2.30931516770856e+00 17184 6309 -4.54342432343412e+00 17184 6333 -1.14368139928722e+00 17184 6357 -1.29819148068438e-02 17184 6861 -3.14675205445586e-03 17184 6885 -1.55713479595498e-01 17184 6909 -3.03095516402851e-01 17184 6933 -6.74916128452639e-02 17184 6957 -1.09340842857506e-05 17184 7485 -6.25027141297650e-07 17184 7509 -3.08191473876543e-04 17184 7533 -1.03213653480999e-04 17184 16320 2.02103155267248e-02 17184 16344 1.59871211982864e-01 17184 16368 3.55692930604211e-01 17184 16392 1.56481212170478e-01 17184 16416 1.93628155736284e-02 17184 17184 7.24442172701012e+00 17184 16728 1.58909152704612e-01 17184 16752 1.25962880977218e+00 17184 16776 2.80987646010898e+00 17184 16800 1.24398624531148e+00 17184 16824 1.54998511589436e-01 17184 17136 3.51917402669344e-01 17184 17160 2.79375021560830e+00 17184 17208 2.77880822339929e+00 17184 17232 3.48181904617091e-01 17184 17544 1.55809989604779e-01 17184 17568 1.23335658689082e+00 17184 17592 2.74834412024163e+00 17184 17616 1.21838709547178e+00 17184 17640 1.52067616750017e-01 17184 17952 1.94355247517665e-02 17184 17976 1.53303156262524e-01 17184 18000 3.40309845637373e-01 17184 18024 1.50081424710553e-01 17184 18048 1.86300918637737e-02 17185 17185 1.00000000000000e+00 17186 17186 1.00000000000000e+00 17187 17187 1.00000000000000e+00 17188 17188 1.00000000000000e+00 17189 17189 1.00000000000000e+00 17190 17190 1.00000000000000e+00 17191 17191 1.00000000000000e+00 17192 17192 1.00000000000000e+00 17193 17193 1.00000000000000e+00 17194 17194 1.00000000000000e+00 17195 17195 1.00000000000000e+00 17196 17196 1.00000000000000e+00 17197 17197 1.00000000000000e+00 17198 17198 1.00000000000000e+00 17199 17199 1.00000000000000e+00 17200 17200 1.00000000000000e+00 17201 17201 1.00000000000000e+00 17202 17202 1.00000000000000e+00 17203 17203 1.00000000000000e+00 17204 17204 1.00000000000000e+00 17205 17205 1.00000000000000e+00 17206 17206 1.00000000000000e+00 17207 17207 1.00000000000000e+00 17208 4485 -3.89310030356526e-05 17208 4509 -1.25262710500987e-03 17208 4533 -1.74967604472396e-04 17208 5085 -3.57113108533592e-02 17208 5109 -3.57021004769807e-01 17208 5133 -3.62324339704616e-01 17208 5157 -3.00451118904865e-02 17208 5181 -1.54009090715194e-05 17208 5661 -7.57131174518667e-04 17208 5685 -5.44017519973798e-01 17208 5709 -4.28272850225017e+00 17208 5733 -4.15319957528701e+00 17208 5757 -4.52262731923127e-01 17208 5781 -3.60383670497804e-03 17208 6261 -5.60266975200139e-03 17208 6285 -6.59599075902195e-01 17208 6309 -5.80227885164794e+00 17208 6333 -5.60361692656965e+00 17208 6357 -6.27511702787324e-01 17208 6381 -1.61402046852431e-03 17208 6861 -5.12372734049640e-04 17208 6885 -1.05165732007160e-01 17208 6909 -9.24693753917579e-01 17208 6933 -8.34174209426219e-01 17208 6957 -9.43825694898238e-02 17208 6981 -3.01603641067000e-09 17208 7485 -2.75579249208753e-06 17208 7509 -5.17490449004992e-03 17208 7533 -1.27531411453203e-02 17208 7557 -3.88327097074182e-04 17208 16344 1.97574874689911e-02 17208 16368 1.56481212170478e-01 17208 16392 3.49250348602332e-01 17208 16416 1.56202510115661e-01 17208 16440 1.96878119552869e-02 17208 17208 7.25784715332240e+00 17208 16752 1.55998049738430e-01 17208 16776 1.24398624531148e+00 17208 16800 2.79022848518567e+00 17208 16824 1.23701104642259e+00 17208 16848 1.54254250016209e-01 17208 17160 3.46520151232717e-01 17208 17184 2.77880822339929e+00 17208 17232 2.75439373133247e+00 17208 17256 3.40416528216012e-01 17208 17568 1.52529157117923e-01 17208 17592 1.21838709547178e+00 17208 17616 2.73598085723523e+00 17208 17640 1.20974979546801e+00 17208 17664 1.50369832116982e-01 17208 17976 1.88902643138646e-02 17208 18000 1.50081424710553e-01 17208 18024 3.35688441614723e-01 17208 18048 1.49387197377015e-01 17208 18072 1.87167074804801e-02 17209 17209 1.00000000000000e+00 17210 17210 1.00000000000000e+00 17211 17211 1.00000000000000e+00 17212 17212 1.00000000000000e+00 17213 17213 1.00000000000000e+00 17214 17214 1.00000000000000e+00 17215 17215 1.00000000000000e+00 17216 17216 1.00000000000000e+00 17217 17217 1.00000000000000e+00 17218 17218 1.00000000000000e+00 17219 17219 1.00000000000000e+00 17220 17220 1.00000000000000e+00 17221 17221 1.00000000000000e+00 17222 17222 1.00000000000000e+00 17223 17223 1.00000000000000e+00 17224 17224 1.00000000000000e+00 17225 17225 1.00000000000000e+00 17226 17226 1.00000000000000e+00 17227 17227 1.00000000000000e+00 17228 17228 1.00000000000000e+00 17229 17229 1.00000000000000e+00 17230 17230 1.00000000000000e+00 17231 17231 1.00000000000000e+00 17232 4509 -1.74352105968200e-08 17232 4533 -2.67149432083500e-08 17232 5085 -8.44638357170000e-10 17232 5109 -2.10748455066423e-02 17232 5133 -9.59646298107551e-02 17232 5157 -3.06819938875620e-02 17232 5181 -7.21993790366314e-05 17232 5685 -6.99137529405220e-03 17232 5709 -7.35882102626052e-01 17232 5733 -2.63136498869214e+00 17232 5757 -1.33485408307050e+00 17232 5781 -6.29703485864394e-02 17232 5805 -2.12273103108982e-05 17232 6285 -4.94282254897333e-02 17232 6309 -2.02056147413533e+00 17232 6333 -8.39721704319991e+00 17232 6357 -3.78016253433069e+00 17232 6381 -2.00674644131226e-01 17232 6405 -2.60766096089583e-05 17232 6885 -1.84595574985241e-02 17232 6909 -7.69802226468801e-01 17232 6933 -2.89436506660368e+00 17232 6957 -1.41063348630124e+00 17232 6981 -6.19881299017579e-02 17232 7485 -1.64776284888538e-06 17232 7509 -1.73529761959176e-02 17232 7533 -1.10295881093750e-01 17232 7557 -5.29520423692178e-02 17232 7581 -2.69100304160320e-04 17232 8133 -3.35135530715780e-07 17232 8157 -6.46536115564740e-07 17232 16368 1.93628155736284e-02 17232 16392 1.56202510115661e-01 17232 16416 3.53947585031547e-01 17232 16440 1.57070360514459e-01 17232 17232 7.14026111656749e+00 17232 16464 1.95797781733278e-02 17232 16776 1.54998511589436e-01 17232 16800 1.23701104642259e+00 17232 16824 2.77817258011401e+00 17232 16848 1.23744127312553e+00 17232 16872 1.55106068265170e-01 17232 17184 3.48181904617091e-01 17232 17208 2.75439373133247e+00 17232 17256 2.74332515484005e+00 17232 17280 3.45414760493986e-01 17232 17592 1.52067616750017e-01 17232 17616 1.20974979546801e+00 17232 17640 2.70952052632652e+00 17232 17664 1.20762171128691e+00 17232 17688 1.51535595704743e-01 17232 18000 1.86300918637737e-02 17232 18024 1.49387197377015e-01 17232 18048 3.36784571584676e-01 17232 18072 1.49615470054804e-01 17232 18096 1.86871600332210e-02 17233 17233 1.00000000000000e+00 17234 17234 1.00000000000000e+00 17235 17235 1.00000000000000e+00 17236 17236 1.00000000000000e+00 17237 17237 1.00000000000000e+00 17238 17238 1.00000000000000e+00 17239 17239 1.00000000000000e+00 17240 17240 1.00000000000000e+00 17241 17241 1.00000000000000e+00 17242 17242 1.00000000000000e+00 17243 17243 1.00000000000000e+00 17244 17244 1.00000000000000e+00 17245 17245 1.00000000000000e+00 17246 17246 1.00000000000000e+00 17247 17247 1.00000000000000e+00 17248 17248 1.00000000000000e+00 17249 17249 1.00000000000000e+00 17250 17250 1.00000000000000e+00 17251 17251 1.00000000000000e+00 17252 17252 1.00000000000000e+00 17253 17253 1.00000000000000e+00 17254 17254 1.00000000000000e+00 17255 17255 1.00000000000000e+00 17256 5109 -2.01560395289938e-06 17256 5133 -6.56477375214311e-03 17256 5157 -6.87824803542487e-03 17256 5181 -5.77838800737353e-05 17256 5709 -2.04237157877315e-02 17256 5733 -5.14869724059536e-01 17256 5757 -9.83374149245021e-01 17256 5781 -2.35359211128364e-01 17256 5805 -2.68360686543634e-03 17256 6285 -2.21422910102272e-05 17256 6309 -2.08634239809660e-01 17256 6333 -3.58766882084470e+00 17256 6357 -6.94373649909137e+00 17256 6381 -1.47822609499831e+00 17256 6405 -3.61825963381644e-02 17256 6885 -1.27258756124396e-04 17256 6909 -1.69941020545760e-01 17256 6933 -2.88002145247027e+00 17256 6957 -5.55216590365646e+00 17256 6981 -1.30220261752319e+00 17256 7005 -1.54562329970986e-02 17256 7485 -2.55683926896930e-07 17256 7509 -9.04705997000787e-03 17256 7533 -2.84162572146214e-01 17256 7557 -4.97254905233345e-01 17256 7581 -1.12540250718600e-01 17256 7605 -5.60742176785082e-05 17256 8133 -4.61869584146437e-05 17256 8157 -1.86222575103144e-03 17256 8181 -4.48079598200342e-04 17256 16392 1.96878119552869e-02 17256 16416 1.57070360514459e-01 17256 16440 3.52487017050825e-01 17256 17256 7.21643411078443e+00 17256 16464 1.56410129982488e-01 17256 16488 1.95227543222943e-02 17256 16800 1.54254250016209e-01 17256 16824 1.23744127312553e+00 17256 16848 2.79178445855523e+00 17256 16872 1.24375673824566e+00 17256 16896 1.55833116296242e-01 17256 17208 3.40416528216012e-01 17256 17232 2.74332515484005e+00 17256 17280 2.77918470063367e+00 17256 17304 3.49381414664417e-01 17256 17616 1.50369832116982e-01 17256 17640 1.20762171128691e+00 17256 17664 2.72824251965545e+00 17256 17688 1.21935500786909e+00 17256 17712 1.53303156262526e-01 17256 18024 1.87167074804801e-02 17256 18048 1.49615470054804e-01 17256 18072 3.36601532325881e-01 17256 18096 1.50309697388346e-01 17256 18120 1.88902643138654e-02 17257 17257 1.00000000000000e+00 17258 17258 1.00000000000000e+00 17259 17259 1.00000000000000e+00 17260 17260 1.00000000000000e+00 17261 17261 1.00000000000000e+00 17262 17262 1.00000000000000e+00 17263 17263 1.00000000000000e+00 17264 17264 1.00000000000000e+00 17265 17265 1.00000000000000e+00 17266 17266 1.00000000000000e+00 17267 17267 1.00000000000000e+00 17268 17268 1.00000000000000e+00 17269 17269 1.00000000000000e+00 17270 17270 1.00000000000000e+00 17271 17271 1.00000000000000e+00 17272 17272 1.00000000000000e+00 17273 17273 1.00000000000000e+00 17274 17274 1.00000000000000e+00 17275 17275 1.00000000000000e+00 17276 17276 1.00000000000000e+00 17277 17277 1.00000000000000e+00 17278 17278 1.00000000000000e+00 17279 17279 1.00000000000000e+00 17280 5133 -7.58338003402613e-06 17280 5157 -1.86508968564511e-04 17280 5181 -1.05957427505540e-05 17280 5733 -2.03097815182609e-02 17280 5757 -2.18551967117538e-01 17280 5781 -2.01108282090790e-01 17280 5805 -1.21795169504231e-02 17280 5829 -9.85236182442100e-08 17280 6309 -4.98462211108425e-04 17280 6333 -4.78760119398730e-01 17280 6357 -3.51256895453244e+00 17280 6381 -3.29949882568253e+00 17280 6405 -3.49928920340785e-01 17280 6429 -2.45335414009301e-03 17280 6909 -6.53347571849010e-03 17280 6933 -7.75414771434272e-01 17280 6957 -6.53788922342876e+00 17280 6981 -6.03043027825392e+00 17280 7005 -6.40927707820464e-01 17280 7029 -1.89638474168433e-03 17280 7509 -1.27623034386603e-03 17280 7533 -1.75026824014737e-01 17280 7557 -1.41055889312214e+00 17280 7581 -1.24030980514067e+00 17280 7605 -1.39874140180185e-01 17280 7629 -3.91749617691150e-07 17280 8133 -1.88632296335796e-04 17280 8157 -1.82588596240225e-02 17280 8181 -2.92174748183984e-02 17280 8205 -9.28518009400178e-04 17280 16416 1.95797781733278e-02 17280 16440 1.56410129982488e-01 17280 17280 7.28740210760266e+00 17280 16464 3.52314972451348e-01 17280 16488 1.59575517774424e-01 17280 16512 2.03711251213117e-02 17280 16824 1.55106068265170e-01 17280 16848 1.24375673824566e+00 17280 16872 2.80798832008805e+00 17280 16896 1.26154202951682e+00 17280 16920 1.59552391082960e-01 17280 17232 3.45414760493986e-01 17280 17256 2.77918470063367e+00 17280 17304 2.80506450856885e+00 17280 17328 3.51884712477783e-01 17280 17640 1.51535595704743e-01 17280 17664 1.21935500786909e+00 17280 17688 2.75942208636539e+00 17280 17712 1.23335658689084e+00 17280 17736 1.55035990460180e-01 17280 18048 1.86871600332210e-02 17280 18072 1.50309697388346e-01 17280 18096 3.40173414020684e-01 17280 18120 1.52529157117928e-01 17280 18144 1.92420249656166e-02 17281 17281 1.00000000000000e+00 17282 17282 1.00000000000000e+00 17283 17283 1.00000000000000e+00 17284 17284 1.00000000000000e+00 17285 17285 1.00000000000000e+00 17286 17286 1.00000000000000e+00 17287 17287 1.00000000000000e+00 17288 17288 1.00000000000000e+00 17289 17289 1.00000000000000e+00 17290 17290 1.00000000000000e+00 17291 17291 1.00000000000000e+00 17292 17292 1.00000000000000e+00 17293 17293 1.00000000000000e+00 17294 17294 1.00000000000000e+00 17295 17295 1.00000000000000e+00 17296 17296 1.00000000000000e+00 17297 17297 1.00000000000000e+00 17298 17298 1.00000000000000e+00 17299 17299 1.00000000000000e+00 17300 17300 1.00000000000000e+00 17301 17301 1.00000000000000e+00 17302 17302 1.00000000000000e+00 17303 17303 1.00000000000000e+00 17304 5757 -1.13664813412542e-02 17304 5781 -4.71831589024721e-02 17304 5805 -9.66017648426725e-03 17304 5829 -4.31404717765020e-07 17304 6333 -4.92164144620346e-03 17304 6357 -5.59277921064756e-01 17304 6381 -1.93651044840105e+00 17304 6405 -9.67683053614513e-01 17304 6429 -3.97012792058168e-02 17304 6453 -8.75431199719505e-06 17304 6933 -5.25159046809868e-02 17304 6957 -2.14744083978136e+00 17304 6981 -8.46920094647183e+00 17304 7005 -3.64136977461599e+00 17304 7029 -1.85449956010227e-01 17304 7053 -1.88711314146376e-05 17304 7533 -2.93382054589848e-02 17304 7557 -1.07520244867283e+00 17304 7581 -3.99347476231921e+00 17304 7605 -1.86500071194453e+00 17304 7629 -7.96429948358947e-02 17304 8133 -8.04923988436137e-05 17304 8157 -4.78374423681407e-02 17304 8181 -2.18693144643847e-01 17304 8205 -9.71852575256383e-02 17304 8229 -7.78915299212628e-04 17304 8781 -3.34854865003064e-05 17304 8805 -4.63546319988530e-05 17304 16440 1.95227543222943e-02 17304 17304 7.34294864953846e+00 17304 16464 1.59575517774424e-01 17304 16488 3.65750055595980e-01 17304 16512 1.62641697816045e-01 17304 16536 2.02892993326995e-02 17304 16848 1.55833116296242e-01 17304 16872 1.26154202951682e+00 17304 16896 2.87066983306136e+00 17304 16920 1.28620340208265e+00 17304 16944 1.61998459437698e-01 17304 17256 3.49381414664417e-01 17304 17280 2.80506450856885e+00 17304 17328 2.86118619082836e+00 17304 17352 3.63411835229292e-01 17304 17664 1.53303156262526e-01 17304 17688 1.23335658689084e+00 17304 17712 2.79375021560833e+00 17304 17736 1.25962880977220e+00 17304 17760 1.59871211982866e-01 17304 18072 1.88902643138654e-02 17304 18096 1.52529157117928e-01 17304 18120 3.46520151232723e-01 17304 18144 1.55998049738432e-01 17304 18168 1.97574874689915e-02 17305 17305 1.00000000000000e+00 17306 17306 1.00000000000000e+00 17307 17307 1.00000000000000e+00 17308 17308 1.00000000000000e+00 17309 17309 1.00000000000000e+00 17310 17310 1.00000000000000e+00 17311 17311 1.00000000000000e+00 17312 17312 1.00000000000000e+00 17313 17313 1.00000000000000e+00 17314 17314 1.00000000000000e+00 17315 17315 1.00000000000000e+00 17316 17316 1.00000000000000e+00 17317 17317 1.00000000000000e+00 17318 17318 1.00000000000000e+00 17319 17319 1.00000000000000e+00 17320 17320 1.00000000000000e+00 17321 17321 1.00000000000000e+00 17322 17322 1.00000000000000e+00 17323 17323 1.00000000000000e+00 17324 17324 1.00000000000000e+00 17325 17325 1.00000000000000e+00 17326 17326 1.00000000000000e+00 17327 17327 1.00000000000000e+00 17328 5757 -1.40505858852180e-07 17328 5781 -2.41400275343929e-03 17328 5805 -1.79342829018032e-03 17328 5829 -2.47764597396870e-07 17328 6357 -1.26258116673756e-02 17328 6381 -3.52156070294240e-01 17328 6405 -6.48829834041641e-01 17328 6429 -1.41157639159403e-01 17328 6453 -9.44207889060279e-04 17328 6933 -1.22463021456104e-05 17328 6957 -2.06892058201996e-01 17328 6981 -3.39171852619209e+00 17328 7005 -6.23407982509971e+00 17328 7029 -1.30451795486918e+00 17328 7053 -3.11108491462266e-02 17328 7533 -2.10501275725722e-04 17328 7557 -2.24619371477825e-01 17328 7581 -3.67439368781383e+00 17328 7605 -6.93663822977334e+00 17328 7629 -1.56150964536206e+00 17328 7653 -1.95621366677708e-02 17328 8133 -8.91149563795827e-06 17328 8157 -2.16163911218320e-02 17328 8181 -5.08138615513815e-01 17328 8205 -8.49994985456503e-01 17328 8229 -1.98701968048535e-01 17328 8253 -1.93029350231710e-04 17328 8781 -6.05453066284470e-04 17328 8805 -7.58954126479133e-03 17328 8829 -1.42313807385487e-03 17328 17328 7.55985454896858e+00 17328 16464 2.03711251213117e-02 17328 16488 1.62641697816045e-01 17328 16512 3.66469822508480e-01 17328 16536 1.67036829586703e-01 17328 16560 2.14699080639762e-02 17328 16872 1.59552391082960e-01 17328 16896 1.28620340208265e+00 17328 16920 2.92511695842667e+00 17328 16944 1.34235070311272e+00 17328 16968 1.73589216340478e-01 17328 17280 3.51884712477783e-01 17328 17304 2.86118619082836e+00 17328 17352 3.02716923220478e+00 17328 17376 3.93380472821888e-01 17328 17688 1.55035990460180e-01 17328 17712 1.25962880977220e+00 17328 17736 2.88497387994915e+00 17328 17760 1.32747883898370e+00 17328 17784 1.71998497763054e-01 17328 18096 1.92420249656166e-02 17328 18120 1.55998049738432e-01 17328 18144 3.56434052889101e-01 17328 18168 1.63318863554447e-01 17328 18192 2.10722284196203e-02 17329 17329 1.00000000000000e+00 17330 17330 1.00000000000000e+00 17331 17331 1.00000000000000e+00 17332 17332 1.00000000000000e+00 17333 17333 1.00000000000000e+00 17334 17334 1.00000000000000e+00 17335 17335 1.00000000000000e+00 17336 17336 1.00000000000000e+00 17337 17337 1.00000000000000e+00 17338 17338 1.00000000000000e+00 17339 17339 1.00000000000000e+00 17340 17340 1.00000000000000e+00 17341 17341 1.00000000000000e+00 17342 17342 1.00000000000000e+00 17343 17343 1.00000000000000e+00 17344 17344 1.00000000000000e+00 17345 17345 1.00000000000000e+00 17346 17346 1.00000000000000e+00 17347 17347 1.00000000000000e+00 17348 17348 1.00000000000000e+00 17349 17349 1.00000000000000e+00 17350 17350 1.00000000000000e+00 17351 17351 1.00000000000000e+00 17352 5781 -5.47964570785970e-07 17352 5805 -7.48228670978536e-06 17352 5829 -3.73102447881600e-08 17352 6381 -1.14567772184785e-02 17352 6405 -1.34270192548721e-01 17352 6429 -1.07211408631075e-01 17352 6453 -4.02285784986320e-03 17352 6957 -3.25705673696316e-04 17352 6981 -4.23340971250773e-01 17352 7005 -2.98627124706643e+00 17352 7029 -2.79102250318823e+00 17352 7053 -2.92463126461177e-01 17352 7077 -1.81463814625538e-03 17352 7557 -7.63644529673744e-03 17352 7581 -9.41794062802648e-01 17352 7605 -7.84475762036918e+00 17352 7629 -7.17876805185179e+00 17352 7653 -7.70581711034177e-01 17352 7677 -2.36456528890254e-03 17352 8157 -2.69918411505044e-03 17352 8181 -2.95079386881867e-01 17352 8205 -2.32104302524862e+00 17352 8229 -2.16294920165838e+00 17352 8253 -2.48937627752005e-01 17352 8277 -4.35062775778439e-06 17352 8781 -1.97908944809925e-03 17352 8805 -6.09726191576311e-02 17352 8829 -7.60852993516102e-02 17352 8853 -2.80363635072946e-03 17352 9429 -7.46393400000000e-14 17352 17352 8.12365760161962e+00 17352 16488 2.02892993326995e-02 17352 16512 1.67036829586703e-01 17352 16536 3.88404676177685e-01 17352 16560 1.84267023541369e-01 17352 16584 2.45968478213661e-02 17352 16896 1.61998459437698e-01 17352 16920 1.34235070311272e+00 17352 16944 3.14169525100726e+00 17352 16968 1.50343418584935e+00 17352 16992 2.02269330121856e-01 17352 17304 3.63411835229292e-01 17352 17328 3.02716923220478e+00 17352 17376 3.43815469624707e+00 17352 17400 4.66158201239862e-01 17352 17712 1.59871211982866e-01 17352 17736 1.32747883898370e+00 17352 17760 3.11986350731990e+00 17352 17784 1.52005931556467e+00 17352 17808 2.08016331128110e-01 17352 18120 1.97574874689915e-02 17352 18144 1.63318863554447e-01 17352 18168 3.82946740255845e-01 17352 18192 1.88423305970199e-01 17352 18216 2.60335980729295e-02 17353 17353 1.00000000000000e+00 17354 17354 1.00000000000000e+00 17355 17355 1.00000000000000e+00 17356 17356 1.00000000000000e+00 17357 17357 1.00000000000000e+00 17358 17358 1.00000000000000e+00 17359 17359 1.00000000000000e+00 17360 17360 1.00000000000000e+00 17361 17361 1.00000000000000e+00 17362 17362 1.00000000000000e+00 17363 17363 1.00000000000000e+00 17364 17364 1.00000000000000e+00 17365 17365 1.00000000000000e+00 17366 17366 1.00000000000000e+00 17367 17367 1.00000000000000e+00 17368 17368 1.00000000000000e+00 17369 17369 1.00000000000000e+00 17370 17370 1.00000000000000e+00 17371 17371 1.00000000000000e+00 17372 17372 1.00000000000000e+00 17373 17373 1.00000000000000e+00 17374 17374 1.00000000000000e+00 17375 17375 1.00000000000000e+00 17376 6405 -6.25604395553282e-03 17376 6429 -2.20016673822270e-02 17376 6453 -2.41855455161585e-03 17376 6981 -3.53912977336370e-03 17376 7005 -4.52565793524380e-01 17376 7029 -1.59016329279607e+00 17376 7053 -7.58041586363661e-01 17376 7077 -2.09752511183681e-02 17376 7101 -2.30239133829016e-06 17376 7581 -5.91529245750130e-02 17376 7605 -2.57969505935669e+00 17376 7629 -1.00058294587791e+01 17376 7653 -3.63348164739568e+00 17376 7677 -1.34464897613048e-01 17376 7701 -1.01389756552506e-05 17376 8181 -4.81042644266794e-02 17376 8205 -1.79075268972270e+00 17376 8229 -6.39325921400955e+00 17376 8253 -2.17167163998992e+00 17376 8277 -7.17232553767065e-02 17376 8301 -1.71538377450000e-10 17376 8781 -7.09749042147127e-04 17376 8805 -1.37572068971866e-01 17376 8829 -4.57856882564989e-01 17376 8853 -1.56376062952829e-01 17376 8877 -1.46097158628628e-03 17376 9405 -1.54549245000000e-12 17376 9429 -4.10935087373671e-04 17376 9453 -4.15196523486821e-04 17376 17376 9.13287850138186e+00 17376 16512 2.14699080639762e-02 17376 16536 1.84267023541369e-01 17376 16560 4.32485248224003e-01 17376 16584 1.68250491358142e-01 17376 16608 1.74657750181695e-02 17376 16920 1.73589216340478e-01 17376 16944 1.50343418584935e+00 17376 16968 3.54045363333220e+00 17376 16992 1.33129786065528e+00 17376 17016 1.30555135041961e-01 17376 17328 3.93380472821888e-01 17376 17352 3.43815469624707e+00 17376 17400 2.98850003984705e+00 17376 17424 2.80966808721886e-01 17376 17736 1.71998497763054e-01 17376 17760 1.52005931556467e+00 17376 17784 3.64388340608851e+00 17376 17808 1.40655976561497e+00 17376 17832 1.43623610275628e-01 17376 18144 2.10722284196203e-02 17376 18168 1.88423305970199e-01 17376 18192 4.58342691413079e-01 17376 18216 1.87065967598063e-01 17376 18240 2.07328938265863e-02 17377 17377 1.00000000000000e+00 17378 17378 1.00000000000000e+00 17379 17379 1.00000000000000e+00 17380 17380 1.00000000000000e+00 17381 17381 1.00000000000000e+00 17382 17382 1.00000000000000e+00 17383 17383 1.00000000000000e+00 17384 17384 1.00000000000000e+00 17385 17385 1.00000000000000e+00 17386 17386 1.00000000000000e+00 17387 17387 1.00000000000000e+00 17388 17388 1.00000000000000e+00 17389 17389 1.00000000000000e+00 17390 17390 1.00000000000000e+00 17391 17391 1.00000000000000e+00 17392 17392 1.00000000000000e+00 17393 17393 1.00000000000000e+00 17394 17394 1.00000000000000e+00 17395 17395 1.00000000000000e+00 17396 17396 1.00000000000000e+00 17397 17397 1.00000000000000e+00 17398 17398 1.00000000000000e+00 17399 17399 1.00000000000000e+00 17400 6405 -6.97276547140000e-10 17400 6429 -7.12208246196802e-04 17400 6453 -3.77341038477286e-04 17400 7005 -8.89962435477893e-03 17400 7029 -2.68460388411377e-01 17400 7053 -4.08296859121547e-01 17400 7077 -1.16854240285127e-01 17400 7101 -3.88025594488432e-04 17400 7581 -5.82139999520664e-06 17400 7605 -2.52605295670655e-01 17400 7629 -3.15212942479755e+00 17400 7653 -5.85915587839834e+00 17400 7677 -2.29622406868504e+00 17400 7701 -2.18156224160925e-03 17400 8181 -3.92140677873937e-04 17400 8205 -3.59609790199517e-01 17400 8229 -4.42373616499349e+00 17400 8253 -1.11982184290234e+01 17400 8277 -2.21730298722626e+00 17400 8301 -3.15062376914750e-07 17400 8781 -5.95594804659707e-05 17400 8805 -5.10251812906411e-02 17400 8829 -1.14792032596768e+00 17400 8853 -2.26455304050108e+00 17400 8877 -9.76740571613030e-02 17400 9405 -6.23034231000000e-12 17400 9429 -9.46517302950756e-03 17400 9453 -1.51031657139677e-02 17400 17400 8.16173749686319e+00 17400 16536 2.45968478213661e-02 17400 16560 1.68250491358142e-01 17400 16584 4.98566153261178e-01 17400 16608 4.58896910370879e-01 17400 16944 2.02269330121856e-01 17400 16968 1.33129786065528e+00 17400 16992 3.53687360286308e+00 17400 17016 3.01366476430747e+00 17400 17352 4.66158201239862e-01 17400 17376 2.98850003984705e+00 17400 17424 5.52408794703351e+00 17400 17760 2.08016331128110e-01 17400 17784 1.40655976561497e+00 17400 17808 3.51355052713259e+00 17400 17832 2.58960730429128e+00 17400 18168 2.60335980729295e-02 17400 18192 1.87065967598063e-01 17400 18216 4.92735384328554e-01 17400 18240 3.52882545366832e-01 17401 17401 1.00000000000000e+00 17402 17402 1.00000000000000e+00 17403 17403 1.00000000000000e+00 17404 17404 1.00000000000000e+00 17405 17405 1.00000000000000e+00 17406 17406 1.00000000000000e+00 17407 17407 1.00000000000000e+00 17408 17408 1.00000000000000e+00 17409 17409 1.00000000000000e+00 17410 17410 1.00000000000000e+00 17411 17411 1.00000000000000e+00 17412 17412 1.00000000000000e+00 17413 17413 1.00000000000000e+00 17414 17414 1.00000000000000e+00 17415 17415 1.00000000000000e+00 17416 17416 1.00000000000000e+00 17417 17417 1.00000000000000e+00 17418 17418 1.00000000000000e+00 17419 17419 1.00000000000000e+00 17420 17420 1.00000000000000e+00 17421 17421 1.00000000000000e+00 17422 17422 1.00000000000000e+00 17423 17423 1.00000000000000e+00 17424 6429 -2.67275633000000e-12 17424 6453 -1.62243194400000e-11 17424 7029 -4.98947752019868e-03 17424 7053 -1.03422884076191e-01 17424 7077 -1.34062314544317e-01 17424 7101 -7.59934449608832e-04 17424 7605 -1.55563455594225e-04 17424 7629 -2.75221263027290e-01 17424 7653 -4.42153745514192e+00 17424 7677 -3.71267255159020e+00 17424 7701 -4.29215165363174e-03 17424 8205 -8.19121310477220e-03 17424 8229 -1.33921351264528e+00 17424 8253 -1.36483898526971e+01 17424 8277 -3.93265630313728e+00 17424 8301 -6.28923985187320e-07 17424 8805 -4.92885197545318e-03 17424 8829 -9.31015863958384e-01 17424 8853 -3.50736818545131e+00 17424 8877 -1.85121313218602e-01 17424 9405 -1.64223745000000e-12 17424 9429 -1.60538004493400e-02 17424 9453 -2.72999557635276e-02 17424 17424 1.00814082330138e+01 17424 16560 1.74657750181695e-02 17424 16584 4.58896910370879e-01 17424 16608 7.95533395614571e-01 17424 16968 1.30555135041961e-01 17424 16992 3.01366476430747e+00 17424 17016 5.11344358332120e+00 17424 17376 2.80966808721886e-01 17424 17400 5.52408794703351e+00 17424 17784 1.43623610275628e-01 17424 17808 2.58960730429128e+00 17424 17832 4.17384933665315e+00 17424 18192 2.07328938265863e-02 17424 18216 3.52882545366832e-01 17424 18240 5.60634833947560e-01 17425 17425 1.00000000000000e+00 17426 17426 1.00000000000000e+00 17427 17427 1.00000000000000e+00 17428 17428 1.00000000000000e+00 17429 17429 1.00000000000000e+00 17430 17430 1.00000000000000e+00 17431 17431 1.00000000000000e+00 17432 17432 1.00000000000000e+00 17433 17433 1.00000000000000e+00 17434 17434 1.00000000000000e+00 17435 17435 1.00000000000000e+00 17436 17436 1.00000000000000e+00 17437 17437 1.00000000000000e+00 17438 17438 1.00000000000000e+00 17439 17439 1.00000000000000e+00 17440 17440 1.00000000000000e+00 17441 17441 1.00000000000000e+00 17442 17442 1.00000000000000e+00 17443 17443 1.00000000000000e+00 17444 17444 1.00000000000000e+00 17445 17445 1.00000000000000e+00 17446 17446 1.00000000000000e+00 17447 17447 1.00000000000000e+00 17448 3789 -5.26432474004659e-04 17448 3813 -2.06381545340387e-01 17448 3837 -6.91058902851671e-02 17448 3861 -1.96369108521814e-05 17448 4389 -1.47814744601899e+00 17448 4413 -7.25120728299891e+00 17448 4437 -8.02167487971855e-01 17448 4461 -4.12660314887432e-03 17448 4965 -5.76787102641967e-03 17448 4989 -7.60221651864047e+00 17448 5013 -1.36812044076585e+01 17448 5037 -6.68819689456864e-01 17448 5061 -1.83203537140733e-03 17448 5565 -2.26063108285775e-02 17448 5589 -2.49861912557888e+00 17448 5613 -1.71003083767366e+00 17448 5637 -7.54624655077900e-02 17448 5661 -5.96334235505000e-09 17448 6165 -8.84884528789615e-06 17448 6189 -9.58767802584513e-03 17448 6213 -1.46458338405462e-02 17448 6237 -4.24068021415266e-04 17448 17448 1.23161012279489e+01 17448 16632 4.42264113085912e-01 17448 16656 2.94482901828517e-01 17448 16680 2.09573843673030e-02 17448 17040 4.29875177865565e+00 17448 17064 2.63307945879087e+00 17448 17088 1.38201019846583e-01 17448 17472 6.56077331714608e+00 17448 17496 2.57920772334743e-01 17448 17856 5.54991856477199e+00 17448 17880 3.23794388911820e+00 17448 17904 1.32281316209199e-01 17448 18264 7.55055809614999e-01 17448 18288 4.45699009410349e-01 17448 18312 1.94774584579571e-02 17449 17449 1.00000000000000e+00 17450 17450 1.00000000000000e+00 17451 17451 1.00000000000000e+00 17452 17452 1.00000000000000e+00 17453 17453 1.00000000000000e+00 17454 17454 1.00000000000000e+00 17455 17455 1.00000000000000e+00 17456 17456 1.00000000000000e+00 17457 17457 1.00000000000000e+00 17458 17458 1.00000000000000e+00 17459 17459 1.00000000000000e+00 17460 17460 1.00000000000000e+00 17461 17461 1.00000000000000e+00 17462 17462 1.00000000000000e+00 17463 17463 1.00000000000000e+00 17464 17464 1.00000000000000e+00 17465 17465 1.00000000000000e+00 17466 17466 1.00000000000000e+00 17467 17467 1.00000000000000e+00 17468 17468 1.00000000000000e+00 17469 17469 1.00000000000000e+00 17470 17470 1.00000000000000e+00 17471 17471 1.00000000000000e+00 17472 3789 -2.69315925168935e-04 17472 3813 -1.27735214090191e-01 17472 3837 -5.86754948615213e-02 17472 3861 -9.55235986069291e-05 17472 4389 -7.91085148021584e-01 17472 4413 -4.98769432682692e+00 17472 4437 -1.62540162070129e+00 17472 4461 -8.48036522135806e-02 17472 4485 -3.48101433441661e-05 17472 4965 -2.95310796217855e-03 17472 4989 -4.37787045752153e+00 17472 5013 -1.21491661808581e+01 17472 5037 -3.94528752716482e+00 17472 5061 -2.75908869197928e-01 17472 5085 -4.27068489809045e-05 17472 5565 -1.17009061321144e-02 17472 5589 -1.73985483446226e+00 17472 5613 -3.32914583511335e+00 17472 5637 -1.66495891798112e+00 17472 5661 -8.46843250636792e-02 17472 6165 -5.06717717815103e-06 17472 6189 -1.99678375256179e-02 17472 6213 -1.30866721526175e-01 17472 6237 -7.03796648728665e-02 17472 6261 -3.83203401246169e-04 17472 6813 -3.64761453425580e-07 17472 6837 -7.35209993245750e-07 17472 17472 8.34560968819213e+00 17472 16632 2.94482901828517e-01 17472 16656 4.67222114420675e-01 17472 16680 1.90138666925910e-01 17472 16704 2.65772823641744e-02 17472 17040 2.63307945879087e+00 17472 17064 3.45834867769262e+00 17472 17088 1.38078276116627e+00 17472 17112 2.06994670444980e-01 17472 17448 6.56077331714608e+00 17472 17496 2.84901195706917e+00 17472 17520 4.54332216932535e-01 17472 17856 3.23794388911820e+00 17472 17880 3.67164699493713e+00 17472 17904 1.33207175863360e+00 17472 17928 2.00736623449198e-01 17472 18264 4.45699009410349e-01 17472 18288 5.20546693731803e-01 17472 18312 1.77960916292744e-01 17472 18336 2.50127706152287e-02 17473 17473 1.00000000000000e+00 17474 17474 1.00000000000000e+00 17475 17475 1.00000000000000e+00 17476 17476 1.00000000000000e+00 17477 17477 1.00000000000000e+00 17478 17478 1.00000000000000e+00 17479 17479 1.00000000000000e+00 17480 17480 1.00000000000000e+00 17481 17481 1.00000000000000e+00 17482 17482 1.00000000000000e+00 17483 17483 1.00000000000000e+00 17484 17484 1.00000000000000e+00 17485 17485 1.00000000000000e+00 17486 17486 1.00000000000000e+00 17487 17487 1.00000000000000e+00 17488 17488 1.00000000000000e+00 17489 17489 1.00000000000000e+00 17490 17490 1.00000000000000e+00 17491 17491 1.00000000000000e+00 17492 17492 1.00000000000000e+00 17493 17493 1.00000000000000e+00 17494 17494 1.00000000000000e+00 17495 17495 1.00000000000000e+00 17496 3789 -1.74276804760171e-06 17496 3813 -7.04889861285685e-03 17496 3837 -7.88893963817137e-03 17496 3861 -8.75407316449953e-05 17496 4389 -1.48604071463105e-02 17496 4413 -4.87838300554039e-01 17496 4437 -1.23817040319278e+00 17496 4461 -3.19772793067185e-01 17496 4485 -3.21498529089219e-03 17496 4965 -1.97635568482042e-05 17496 4989 -1.67023864717947e-01 17496 5013 -3.72294246617868e+00 17496 5037 -8.83501779089225e+00 17496 5061 -1.86663739218363e+00 17496 5085 -4.20474139306105e-02 17496 5565 -1.13643062235917e-04 17496 5589 -1.70527780808149e-01 17496 5613 -3.48549779286624e+00 17496 5637 -6.98854935785902e+00 17496 5661 -1.52988192885985e+00 17496 5685 -1.82366467804069e-02 17496 6165 -1.83644152629410e-07 17496 6189 -1.02084568245076e-02 17496 6213 -3.59725190023994e-01 17496 6237 -5.91340677496694e-01 17496 6261 -1.26225497284194e-01 17496 6285 -7.26598831971732e-05 17496 6813 -4.38145079191064e-05 17496 6837 -1.95469579268325e-03 17496 6861 -4.92803893296477e-04 17496 17496 8.91745842228487e+00 17496 16632 2.09573843673030e-02 17496 16656 1.90138666925910e-01 17496 16680 4.67796934250376e-01 17496 16704 1.92721257681829e-01 17496 16728 2.16030320562830e-02 17496 17040 1.38201019846583e-01 17496 17064 1.38078276116627e+00 17496 17088 3.62350257752155e+00 17496 17112 1.52152600400077e+00 17496 17136 1.73386830555207e-01 17496 17448 2.57920772334743e-01 17496 17472 2.84901195706917e+00 17496 17520 3.37821758384733e+00 17496 17544 3.90222179029280e-01 17496 17856 1.32281316209199e-01 17496 17880 1.33207175863361e+00 17496 17904 3.51392334433730e+00 17496 17928 1.48237070556025e+00 17496 17952 1.69856052940862e-01 17496 18264 1.94774584579571e-02 17496 18288 1.77960916292744e-01 17496 18312 4.40402125954314e-01 17496 18336 1.82932433071701e-01 17496 18360 2.07203376526966e-02 17497 17497 1.00000000000000e+00 17498 17498 1.00000000000000e+00 17499 17499 1.00000000000000e+00 17500 17500 1.00000000000000e+00 17501 17501 1.00000000000000e+00 17502 17502 1.00000000000000e+00 17503 17503 1.00000000000000e+00 17504 17504 1.00000000000000e+00 17505 17505 1.00000000000000e+00 17506 17506 1.00000000000000e+00 17507 17507 1.00000000000000e+00 17508 17508 1.00000000000000e+00 17509 17509 1.00000000000000e+00 17510 17510 1.00000000000000e+00 17511 17511 1.00000000000000e+00 17512 17512 1.00000000000000e+00 17513 17513 1.00000000000000e+00 17514 17514 1.00000000000000e+00 17515 17515 1.00000000000000e+00 17516 17516 1.00000000000000e+00 17517 17517 1.00000000000000e+00 17518 17518 1.00000000000000e+00 17519 17519 1.00000000000000e+00 17520 3813 -9.74644038470988e-06 17520 3837 -2.68364539589388e-04 17520 3861 -1.69759551982035e-05 17520 4413 -2.65648743547446e-02 17520 4437 -2.85679637321199e-01 17520 4461 -2.40577424961979e-01 17520 4485 -1.42016680674157e-02 17520 4509 -1.61126130499370e-07 17520 4989 -6.01640639348683e-04 17520 5013 -6.13134529254239e-01 17520 5037 -4.21473093150739e+00 17520 5061 -3.73729413925658e+00 17520 5085 -3.78249300822852e-01 17520 5109 -2.65351095419135e-03 17520 5589 -8.17707393505380e-03 17520 5613 -9.54578846059258e-01 17520 5637 -7.39535321592706e+00 17520 5661 -6.59932721052840e+00 17520 5685 -6.65735053161055e-01 17520 5709 -2.05148678363376e-03 17520 6189 -1.58120002869856e-03 17520 6213 -1.98962185579801e-01 17520 6237 -1.52417843992884e+00 17520 6261 -1.29413504051999e+00 17520 6285 -1.43215743617080e-01 17520 6309 -5.60692149366310e-07 17520 6813 -1.77369989909068e-04 17520 6837 -1.83378568091769e-02 17520 6861 -2.95734225758219e-02 17520 6885 -9.85286141680775e-04 17520 17520 8.05020205385262e+00 17520 16656 2.65772823641744e-02 17520 16680 1.92721257681829e-01 17520 16704 3.92596920386013e-01 17520 16728 1.67896628710375e-01 17520 16752 2.03711251213107e-02 17520 17064 2.06994670444980e-01 17520 17088 1.52152600400077e+00 17520 17112 3.14075947710278e+00 17520 17136 1.33184939331853e+00 17520 17160 1.59575517774422e-01 17520 17472 4.54332216932535e-01 17520 17496 3.37821758384733e+00 17520 17544 2.97014860592260e+00 17520 17568 3.52314972451355e-01 17520 17880 2.00736623449198e-01 17520 17904 1.48237070556025e+00 17520 17928 3.07484360048553e+00 17520 17952 1.30506473169342e+00 17520 17976 1.56410129982489e-01 17520 18288 2.50127706152287e-02 17520 18312 1.82932433071701e-01 17520 18336 3.76117951231702e-01 17520 18360 1.61200463304097e-01 17520 18384 1.95797781733276e-02 17521 17521 1.00000000000000e+00 17522 17522 1.00000000000000e+00 17523 17523 1.00000000000000e+00 17524 17524 1.00000000000000e+00 17525 17525 1.00000000000000e+00 17526 17526 1.00000000000000e+00 17527 17527 1.00000000000000e+00 17528 17528 1.00000000000000e+00 17529 17529 1.00000000000000e+00 17530 17530 1.00000000000000e+00 17531 17531 1.00000000000000e+00 17532 17532 1.00000000000000e+00 17533 17533 1.00000000000000e+00 17534 17534 1.00000000000000e+00 17535 17535 1.00000000000000e+00 17536 17536 1.00000000000000e+00 17537 17537 1.00000000000000e+00 17538 17538 1.00000000000000e+00 17539 17539 1.00000000000000e+00 17540 17540 1.00000000000000e+00 17541 17541 1.00000000000000e+00 17542 17542 1.00000000000000e+00 17543 17543 1.00000000000000e+00 17544 4437 -1.24654553297144e-02 17544 4461 -5.22627933309471e-02 17544 4485 -1.05393873554719e-02 17544 4509 -7.02160393795410e-07 17544 5013 -5.13431393213634e-03 17544 5037 -6.12047630761570e-01 17544 5061 -2.02840327989387e+00 17544 5085 -9.90842359719972e-01 17544 5109 -4.05088426167653e-02 17544 5133 -1.04073115619177e-05 17544 5613 -5.53882674114008e-02 17544 5637 -2.25808474336955e+00 17544 5661 -8.57804786423762e+00 17544 5685 -3.65852053446200e+00 17544 5709 -1.85183137996139e-01 17544 5733 -2.24011129438340e-05 17544 6213 -3.06138592859693e-02 17544 6237 -1.08618188199010e+00 17544 6261 -3.97166244870866e+00 17544 6285 -1.83374722468627e+00 17544 6309 -7.95778024835329e-02 17544 6813 -7.26889822415083e-05 17544 6837 -4.65170820385603e-02 17544 6861 -2.13828212972154e-01 17544 6885 -9.46399802028858e-02 17544 6909 -8.00980653817310e-04 17544 7461 -2.95151509768486e-05 17544 7485 -4.25390998073089e-05 17544 17544 7.37694384582184e+00 17544 16680 2.16030320562830e-02 17544 16704 1.67896628710375e-01 17544 16728 3.67058006646683e-01 17544 16752 1.59552391082956e-01 17544 16776 1.95169726494283e-02 17544 17088 1.73386830555207e-01 17544 17112 1.33184939331853e+00 17544 17136 2.88240510455080e+00 17544 17160 1.26154202951682e+00 17544 17184 1.55809989604779e-01 17544 17496 3.90222179029280e-01 17544 17520 2.97014860592260e+00 17544 17568 2.80798832008811e+00 17544 17592 3.49682107570658e-01 17544 17904 1.69856052940862e-01 17544 17928 1.30506473169342e+00 17544 17952 2.82694718723967e+00 17544 17976 1.24375673824568e+00 17544 18000 1.54529054578926e-01 17544 18312 2.07203376526966e-02 17544 18336 1.61200463304097e-01 17544 18360 3.53193527318903e-01 17544 18384 1.55106068265170e-01 17544 18408 1.91967388929650e-02 17545 17545 1.00000000000000e+00 17546 17546 1.00000000000000e+00 17547 17547 1.00000000000000e+00 17548 17548 1.00000000000000e+00 17549 17549 1.00000000000000e+00 17550 17550 1.00000000000000e+00 17551 17551 1.00000000000000e+00 17552 17552 1.00000000000000e+00 17553 17553 1.00000000000000e+00 17554 17554 1.00000000000000e+00 17555 17555 1.00000000000000e+00 17556 17556 1.00000000000000e+00 17557 17557 1.00000000000000e+00 17558 17558 1.00000000000000e+00 17559 17559 1.00000000000000e+00 17560 17560 1.00000000000000e+00 17561 17561 1.00000000000000e+00 17562 17562 1.00000000000000e+00 17563 17563 1.00000000000000e+00 17564 17564 1.00000000000000e+00 17565 17565 1.00000000000000e+00 17566 17566 1.00000000000000e+00 17567 17567 1.00000000000000e+00 17568 4437 -9.85236182442100e-08 17568 4461 -2.45335414009289e-03 17568 4485 -1.89638474168424e-03 17568 4509 -3.91749617691140e-07 17568 5037 -1.21795169504232e-02 17568 5061 -3.49928920340780e-01 17568 5085 -6.40927707820455e-01 17568 5109 -1.39874140180184e-01 17568 5133 -9.28518009400162e-04 17568 5613 -1.05957427505539e-05 17568 5637 -2.01108282090794e-01 17568 5661 -3.29949882568259e+00 17568 5685 -6.03043027825399e+00 17568 5709 -1.24030980514066e+00 17568 5733 -2.92174748183979e-02 17568 6213 -1.86508968564509e-04 17568 6237 -2.18551967117538e-01 17568 6261 -3.51256895453249e+00 17568 6285 -6.53788922342882e+00 17568 6309 -1.41055889312211e+00 17568 6333 -1.82588596240220e-02 17568 6813 -7.58338003402606e-06 17568 6837 -2.03097815182608e-02 17568 6861 -4.78760119398734e-01 17568 6885 -7.75414771434272e-01 17568 6909 -1.75026824014733e-01 17568 6933 -1.88632296335788e-04 17568 7461 -4.98462211108428e-04 17568 7485 -6.53347571849014e-03 17568 7509 -1.27623034386604e-03 17568 17568 7.28740210760278e+00 17568 16704 2.03711251213107e-02 17568 16728 1.59552391082956e-01 17568 16752 3.51884712477780e-01 17568 16776 1.55035990460178e-01 17568 16800 1.92420249656163e-02 17568 17112 1.59575517774422e-01 17568 17136 1.26154202951682e+00 17568 17160 2.80506450856887e+00 17568 17184 1.23335658689082e+00 17568 17208 1.52529157117923e-01 17568 17520 3.52314972451355e-01 17568 17544 2.80798832008811e+00 17568 17592 2.75942208636537e+00 17568 17616 3.40173414020670e-01 17568 17928 1.56410129982489e-01 17568 17952 1.24375673824568e+00 17568 17976 2.77918470063371e+00 17568 18000 1.21935500786909e+00 17568 18024 1.50309697388343e-01 17568 18336 1.95797781733276e-02 17568 18360 1.55106068265170e-01 17568 18384 3.45414760493988e-01 17568 18408 1.51535595704744e-01 17568 18432 1.86871600332211e-02 17569 17569 1.00000000000000e+00 17570 17570 1.00000000000000e+00 17571 17571 1.00000000000000e+00 17572 17572 1.00000000000000e+00 17573 17573 1.00000000000000e+00 17574 17574 1.00000000000000e+00 17575 17575 1.00000000000000e+00 17576 17576 1.00000000000000e+00 17577 17577 1.00000000000000e+00 17578 17578 1.00000000000000e+00 17579 17579 1.00000000000000e+00 17580 17580 1.00000000000000e+00 17581 17581 1.00000000000000e+00 17582 17582 1.00000000000000e+00 17583 17583 1.00000000000000e+00 17584 17584 1.00000000000000e+00 17585 17585 1.00000000000000e+00 17586 17586 1.00000000000000e+00 17587 17587 1.00000000000000e+00 17588 17588 1.00000000000000e+00 17589 17589 1.00000000000000e+00 17590 17590 1.00000000000000e+00 17591 17591 1.00000000000000e+00 17592 4461 -5.23645026792810e-07 17592 4485 -8.12642191870758e-06 17592 4509 -5.76558717979400e-08 17592 5061 -1.07863231621519e-02 17592 5085 -1.28438112447599e-01 17592 5109 -1.01039043382733e-01 17592 5133 -3.87791204741481e-03 17592 5637 -2.81844181765467e-04 17592 5661 -3.98034187425594e-01 17592 5685 -2.71989718090500e+00 17592 5709 -2.48901865479227e+00 17592 5733 -2.51669427949051e-01 17592 5757 -1.55307223477496e-03 17592 6237 -6.94726832043429e-03 17592 6261 -8.64674467026414e-01 17592 6285 -6.82542888510073e+00 17592 6309 -5.99220336649914e+00 17592 6333 -6.00080589743590e-01 17592 6357 -2.01993850345182e-03 17592 6837 -2.44491993247956e-03 17592 6861 -2.60977235824411e-01 17592 6885 -1.96287925132751e+00 17592 6909 -1.66908141813580e+00 17592 6933 -1.83173325846024e-01 17592 6957 -4.19657041456257e-06 17592 7461 -1.58782338679894e-03 17592 7485 -4.68504653711729e-02 17592 7509 -5.45870460972286e-02 17592 7533 -2.06384177255707e-03 17592 17592 7.12836795763660e+00 17592 16728 1.95169726494283e-02 17592 16752 1.55035990460178e-01 17592 16776 3.46776184423020e-01 17592 16800 1.54515349157387e-01 17592 16824 1.93868123237305e-02 17592 17136 1.55809989604779e-01 17592 17160 1.23335658689082e+00 17592 17184 2.74834412024163e+00 17592 17208 1.21838709547178e+00 17592 17232 1.52067616750017e-01 17592 17544 3.49682107570658e-01 17592 17568 2.75942208636537e+00 17592 17616 2.70433855902273e+00 17592 17640 3.35911225734997e-01 17592 17952 1.54529054578926e-01 17592 17976 1.21935500786909e+00 17592 18000 2.70777635461111e+00 17592 18024 1.19440735682797e+00 17592 18048 1.48292141818646e-01 17592 18360 1.91967388929650e-02 17592 18384 1.51535595704744e-01 17592 18408 3.36634243015390e-01 17592 18432 1.48520414496436e-01 17592 18456 1.84429435908879e-02 17593 17593 1.00000000000000e+00 17594 17594 1.00000000000000e+00 17595 17595 1.00000000000000e+00 17596 17596 1.00000000000000e+00 17597 17597 1.00000000000000e+00 17598 17598 1.00000000000000e+00 17599 17599 1.00000000000000e+00 17600 17600 1.00000000000000e+00 17601 17601 1.00000000000000e+00 17602 17602 1.00000000000000e+00 17603 17603 1.00000000000000e+00 17604 17604 1.00000000000000e+00 17605 17605 1.00000000000000e+00 17606 17606 1.00000000000000e+00 17607 17607 1.00000000000000e+00 17608 17608 1.00000000000000e+00 17609 17609 1.00000000000000e+00 17610 17610 1.00000000000000e+00 17611 17611 1.00000000000000e+00 17612 17612 1.00000000000000e+00 17613 17613 1.00000000000000e+00 17614 17614 1.00000000000000e+00 17615 17615 1.00000000000000e+00 17616 5085 -5.56833331860741e-03 17616 5109 -1.99554679510910e-02 17616 5133 -2.16668756254668e-03 17616 5661 -2.84679740778396e-03 17616 5685 -3.86242857738424e-01 17616 5709 -1.29828131778269e+00 17616 5733 -6.28655875378816e-01 17616 5757 -2.16988591599805e-02 17616 5781 -3.16656089837681e-06 17616 6261 -4.94199897693984e-02 17616 6285 -2.04795403555764e+00 17616 6309 -7.56571605479389e+00 17616 6333 -3.12316738344967e+00 17616 6357 -1.52428787925998e-01 17616 6381 -1.39127671343208e-05 17616 6861 -4.04287971817127e-02 17616 6885 -1.32125388491844e+00 17616 6909 -4.82545053729425e+00 17616 6933 -2.12020356069703e+00 17616 6957 -8.88788763992180e-02 17616 6981 -5.56057466610000e-10 17616 7461 -5.27208835272881e-04 17616 7485 -9.59262161090060e-02 17616 7509 -3.57157477180801e-01 17616 7533 -1.52427932049992e-01 17616 7557 -1.81437017932960e-03 17616 8109 -3.45218003082492e-04 17616 8133 -3.62720964486753e-04 17616 17616 7.05170990002158e+00 17616 16752 1.92420249656163e-02 17616 16776 1.54515349157387e-01 17616 16800 3.48306772694070e-01 17616 16824 1.53050251489984e-01 17616 16848 1.88757505487653e-02 17616 17160 1.52529157117923e-01 17616 17184 1.21838709547177e+00 17616 17208 2.73598085723523e+00 17616 17232 1.20974979546801e+00 17616 17256 1.50369832116982e-01 17616 17568 3.40173414020670e-01 17616 17592 2.70433855902272e+00 17616 17640 2.69147239990298e+00 17616 17664 3.36956874240736e-01 17616 17976 1.50309697388343e-01 17616 18000 1.19440735682797e+00 17616 18024 2.67230601242581e+00 17616 18048 1.19045675103090e+00 17616 18072 1.49322045939075e-01 17616 18384 1.86871600332211e-02 17616 18408 1.48520414496436e-01 17616 18432 3.32388061491717e-01 17616 18456 1.48226990380707e-01 17616 18480 1.86138040042888e-02 17617 17617 1.00000000000000e+00 17618 17618 1.00000000000000e+00 17619 17619 1.00000000000000e+00 17620 17620 1.00000000000000e+00 17621 17621 1.00000000000000e+00 17622 17622 1.00000000000000e+00 17623 17623 1.00000000000000e+00 17624 17624 1.00000000000000e+00 17625 17625 1.00000000000000e+00 17626 17626 1.00000000000000e+00 17627 17627 1.00000000000000e+00 17628 17628 1.00000000000000e+00 17629 17629 1.00000000000000e+00 17630 17630 1.00000000000000e+00 17631 17631 1.00000000000000e+00 17632 17632 1.00000000000000e+00 17633 17633 1.00000000000000e+00 17634 17634 1.00000000000000e+00 17635 17635 1.00000000000000e+00 17636 17636 1.00000000000000e+00 17637 17637 1.00000000000000e+00 17638 17638 1.00000000000000e+00 17639 17639 1.00000000000000e+00 17640 5085 -1.78107971630000e-10 17640 5109 -5.78508518996033e-04 17640 5133 -3.19949948932865e-04 17640 5685 -6.28028490483834e-03 17640 5709 -2.12078387164962e-01 17640 5733 -3.73523759437002e-01 17640 5757 -7.01592677812311e-02 17640 5781 -1.83814698169984e-04 17640 6261 -3.38983153372560e-06 17640 6285 -1.75776519637665e-01 17640 6309 -2.74137618073188e+00 17640 6333 -4.76234705419661e+00 17640 6357 -9.64335460689657e-01 17640 6381 -2.12466860893378e-02 17640 6861 -2.44302264716897e-04 17640 6885 -2.53821298188305e-01 17640 6909 -3.94652603057979e+00 17640 6933 -7.08479211929127e+00 17640 6957 -1.43848699559362e+00 17640 6981 -1.97985618629701e-02 17640 7461 -3.67018070179620e-05 17640 7485 -3.79318522441513e-02 17640 7509 -7.34647396722995e-01 17640 7533 -1.14383406827339e+00 17640 7557 -2.57273709859605e-01 17640 7581 -4.24155580695295e-04 17640 8109 -3.03185917096303e-03 17640 8133 -1.79537556714427e-02 17640 8157 -2.89134898941351e-03 17640 17640 7.06385545660237e+00 17640 16776 1.93868123237305e-02 17640 16800 1.53050251489984e-01 17640 16824 3.40595559996941e-01 17640 16848 1.52289957766921e-01 17640 16872 1.91967388929648e-02 17640 17184 1.52067616750017e-01 17640 17208 1.20974979546801e+00 17640 17232 2.70952052632652e+00 17640 17256 1.20762171128691e+00 17640 17280 1.51535595704743e-01 17640 17592 3.35911225734997e-01 17640 17616 2.69147239990299e+00 17640 17664 2.69436446902455e+00 17640 17688 3.36634243015388e-01 17640 18000 1.48292141818646e-01 17640 18024 1.19045675103090e+00 17640 18048 2.68596529134034e+00 17640 18072 1.19136984174206e+00 17640 18096 1.48520414496435e-01 17640 18408 1.84429435908879e-02 17640 18432 1.48226990380707e-01 17640 18456 3.34706751250396e-01 17640 18480 1.48226990380706e-01 17640 18504 1.84429435908877e-02 17641 17641 1.00000000000000e+00 17642 17642 1.00000000000000e+00 17643 17643 1.00000000000000e+00 17644 17644 1.00000000000000e+00 17645 17645 1.00000000000000e+00 17646 17646 1.00000000000000e+00 17647 17647 1.00000000000000e+00 17648 17648 1.00000000000000e+00 17649 17649 1.00000000000000e+00 17650 17650 1.00000000000000e+00 17651 17651 1.00000000000000e+00 17652 17652 1.00000000000000e+00 17653 17653 1.00000000000000e+00 17654 17654 1.00000000000000e+00 17655 17655 1.00000000000000e+00 17656 17656 1.00000000000000e+00 17657 17657 1.00000000000000e+00 17658 17658 1.00000000000000e+00 17659 17659 1.00000000000000e+00 17660 17660 1.00000000000000e+00 17661 17661 1.00000000000000e+00 17662 17662 1.00000000000000e+00 17663 17663 1.00000000000000e+00 17664 5109 -1.00590931000000e-11 17664 5133 -6.64224849700000e-11 17664 5709 -5.35878571918439e-03 17664 5733 -6.87655032636447e-02 17664 5757 -4.21980672869890e-02 17664 5781 -7.15434311001531e-04 17664 6285 -1.47971231592431e-04 17664 6309 -3.05397524757639e-01 17664 6333 -1.99343558131643e+00 17664 6357 -1.80327671377133e+00 17664 6381 -1.70937578879019e-01 17664 6405 -8.71566016129867e-04 17664 6885 -7.04436337218164e-03 17664 6909 -9.17064794435828e-01 17664 6933 -6.90984690437403e+00 17664 6957 -5.79840393114081e+00 17664 6981 -5.54442084415410e-01 17664 7005 -1.94985337928620e-03 17664 7485 -4.14430081245733e-03 17664 7509 -3.71678060230641e-01 17664 7533 -2.67868645090642e+00 17664 7557 -2.23326814143205e+00 17664 7581 -2.34465262564620e-01 17664 7605 -1.54190474932791e-05 17664 8109 -7.05238029109572e-03 17664 8133 -1.06320221811236e-01 17664 8157 -9.93778601986976e-02 17664 8181 -4.43884181165063e-03 17664 8733 -3.90152634118470e-07 17664 8757 -4.56708922212459e-06 17664 8781 -3.17062769720000e-09 17664 17664 7.06341460812455e+00 17664 16800 1.88757505487653e-02 17664 16824 1.52289957766921e-01 17664 16848 3.45459097587969e-01 17664 16872 1.54529054578924e-01 17664 16896 1.94355247517661e-02 17664 17208 1.50369832116982e-01 17664 17232 1.20762171128691e+00 17664 17256 2.72824251965545e+00 17664 17280 1.21935500786909e+00 17664 17304 1.53303156262526e-01 17664 17616 3.36956874240736e-01 17664 17640 2.69436446902455e+00 17664 17688 2.70777635461115e+00 17664 17712 3.40309845637385e-01 17664 18024 1.49322045939075e-01 17664 18048 1.19136984174206e+00 17664 18072 2.67573010259264e+00 17664 18096 1.19440735682796e+00 17664 18120 1.50081424710553e-01 17664 18432 1.86138040042888e-02 17664 18456 1.48226990380706e-01 17664 18480 3.32330993322265e-01 17664 18504 1.48292141818642e-01 17664 18528 1.86300918637728e-02 17665 17665 1.00000000000000e+00 17666 17666 1.00000000000000e+00 17667 17667 1.00000000000000e+00 17668 17668 1.00000000000000e+00 17669 17669 1.00000000000000e+00 17670 17670 1.00000000000000e+00 17671 17671 1.00000000000000e+00 17672 17672 1.00000000000000e+00 17673 17673 1.00000000000000e+00 17674 17674 1.00000000000000e+00 17675 17675 1.00000000000000e+00 17676 17676 1.00000000000000e+00 17677 17677 1.00000000000000e+00 17678 17678 1.00000000000000e+00 17679 17679 1.00000000000000e+00 17680 17680 1.00000000000000e+00 17681 17681 1.00000000000000e+00 17682 17682 1.00000000000000e+00 17683 17683 1.00000000000000e+00 17684 17684 1.00000000000000e+00 17685 17685 1.00000000000000e+00 17686 17686 1.00000000000000e+00 17687 17687 1.00000000000000e+00 17688 5733 -2.44491993247954e-03 17688 5757 -6.94726832043423e-03 17688 5781 -2.81844181765463e-04 17688 6309 -1.58782338679894e-03 17688 6333 -2.60977235824409e-01 17688 6357 -8.64674467026406e-01 17688 6381 -3.98034187425587e-01 17688 6405 -1.07863231621519e-02 17688 6429 -5.23645026792810e-07 17688 6909 -4.68504653711725e-02 17688 6933 -1.96287925132752e+00 17688 6957 -6.82542888510088e+00 17688 6981 -2.71989718090503e+00 17688 7005 -1.28438112447600e-01 17688 7029 -8.12642191870762e-06 17688 7509 -5.45870460972280e-02 17688 7533 -1.66908141813578e+00 17688 7557 -5.99220336649925e+00 17688 7581 -2.48901865479233e+00 17688 7605 -1.01039043382734e-01 17688 7629 -5.76558717979400e-08 17688 8109 -2.06384177255703e-03 17688 8133 -1.83173325846016e-01 17688 8157 -6.00080589743577e-01 17688 8181 -2.51669427949046e-01 17688 8205 -3.87791204741487e-03 17688 8733 -4.19657041456251e-06 17688 8757 -2.01993850345182e-03 17688 8781 -1.55307223477496e-03 17688 17688 7.12836795763680e+00 17688 16824 1.91967388929648e-02 17688 16848 1.54529054578924e-01 17688 16872 3.49682107570650e-01 17688 16896 1.55809989604778e-01 17688 16920 1.95169726494284e-02 17688 17232 1.51535595704743e-01 17688 17256 1.21935500786909e+00 17688 17280 2.75942208636539e+00 17688 17304 1.23335658689084e+00 17688 17328 1.55035990460180e-01 17688 17640 3.36634243015388e-01 17688 17664 2.70777635461115e+00 17688 17712 2.74834412024170e+00 17688 17736 3.46776184423025e-01 17688 18048 1.48520414496435e-01 17688 18072 1.19440735682796e+00 17688 18096 2.70433855902272e+00 17688 18120 1.21838709547178e+00 17688 18144 1.54515349157389e-01 17688 18456 1.84429435908877e-02 17688 18480 1.48292141818642e-01 17688 18504 3.35911225734983e-01 17688 18528 1.52067616750014e-01 17688 18552 1.93868123237306e-02 17689 17689 1.00000000000000e+00 17690 17690 1.00000000000000e+00 17691 17691 1.00000000000000e+00 17692 17692 1.00000000000000e+00 17693 17693 1.00000000000000e+00 17694 17694 1.00000000000000e+00 17695 17695 1.00000000000000e+00 17696 17696 1.00000000000000e+00 17697 17697 1.00000000000000e+00 17698 17698 1.00000000000000e+00 17699 17699 1.00000000000000e+00 17700 17700 1.00000000000000e+00 17701 17701 1.00000000000000e+00 17702 17702 1.00000000000000e+00 17703 17703 1.00000000000000e+00 17704 17704 1.00000000000000e+00 17705 17705 1.00000000000000e+00 17706 17706 1.00000000000000e+00 17707 17707 1.00000000000000e+00 17708 17708 1.00000000000000e+00 17709 17709 1.00000000000000e+00 17710 17710 1.00000000000000e+00 17711 17711 1.00000000000000e+00 17712 5757 -7.18384143752443e-05 17712 5781 -2.76739317972466e-05 17712 6333 -3.14675205445592e-03 17712 6357 -1.30268316315284e-01 17712 6381 -2.15879675201222e-01 17712 6405 -3.19984746935321e-02 17712 6429 -1.38112665047087e-05 17712 6909 -6.25027141297620e-07 17712 6933 -1.55713479595503e-01 17712 6957 -2.30931516770862e+00 17712 6981 -3.84397367768766e+00 17712 7005 -7.66829074925678e-01 17712 7029 -1.51559787944263e-02 17712 7509 -3.08191473876528e-04 17712 7533 -3.03095516402849e-01 17712 7557 -4.54342432343419e+00 17712 7581 -7.82063470981192e+00 17712 7605 -1.49717127446900e+00 17712 7629 -2.16090931874471e-02 17712 8109 -1.03213653480994e-04 17712 8133 -6.74916128452622e-02 17712 8157 -1.14368139928723e+00 17712 8181 -1.73159753784728e+00 17712 8205 -3.81038440365969e-01 17712 8229 -8.50483332369737e-04 17712 8733 -1.09340842857506e-05 17712 8757 -1.29819148068438e-02 17712 8781 -4.32773454137625e-02 17712 8805 -6.15205480232564e-03 17712 17712 7.24442172701023e+00 17712 16848 1.94355247517661e-02 17712 16872 1.55809989604778e-01 17712 16896 3.51917402669346e-01 17712 16920 1.58909152704614e-01 17712 16944 2.02103155267251e-02 17712 17256 1.53303156262526e-01 17712 17280 1.23335658689084e+00 17712 17304 2.79375021560833e+00 17712 17328 1.25962880977220e+00 17712 17352 1.59871211982866e-01 17712 17664 3.40309845637385e-01 17712 17688 2.74834412024170e+00 17712 17736 2.80987646010903e+00 17712 17760 3.55692930604217e-01 17712 18072 1.50081424710553e-01 17712 18096 1.21838709547178e+00 17712 18120 2.77880822339931e+00 17712 18144 1.24398624531149e+00 17712 18168 1.56481212170480e-01 17712 18480 1.86300918637728e-02 17712 18504 1.52067616750014e-01 17712 18528 3.48181904617092e-01 17712 18552 1.54998511589437e-01 17712 18576 1.93628155736285e-02 17713 17713 1.00000000000000e+00 17714 17714 1.00000000000000e+00 17715 17715 1.00000000000000e+00 17716 17716 1.00000000000000e+00 17717 17717 1.00000000000000e+00 17718 17718 1.00000000000000e+00 17719 17719 1.00000000000000e+00 17720 17720 1.00000000000000e+00 17721 17721 1.00000000000000e+00 17722 17722 1.00000000000000e+00 17723 17723 1.00000000000000e+00 17724 17724 1.00000000000000e+00 17725 17725 1.00000000000000e+00 17726 17726 1.00000000000000e+00 17727 17727 1.00000000000000e+00 17728 17728 1.00000000000000e+00 17729 17729 1.00000000000000e+00 17730 17730 1.00000000000000e+00 17731 17731 1.00000000000000e+00 17732 17732 1.00000000000000e+00 17733 17733 1.00000000000000e+00 17734 17734 1.00000000000000e+00 17735 17735 1.00000000000000e+00 17736 6357 -2.75454565147808e-03 17736 6381 -3.58048723393153e-02 17736 6405 -1.50083400241687e-02 17736 6429 -4.77885378091531e-05 17736 6933 -6.59348435444717e-05 17736 6957 -2.35972834052837e-01 17736 6981 -1.48988839847491e+00 17736 7005 -1.32965709172449e+00 17736 7029 -1.18129358804485e-01 17736 7053 -4.73461040574706e-04 17736 7533 -7.22537427582627e-03 17736 7557 -9.98666130461241e-01 17736 7581 -7.13291989148029e+00 17736 7605 -5.76875780633061e+00 17736 7629 -5.43816655026184e-01 17736 7653 -1.98398564923313e-03 17736 8133 -6.88640208816362e-03 17736 8157 -5.34791752860124e-01 17736 8181 -3.75690140381855e+00 17736 8205 -3.09628035087754e+00 17736 8229 -3.13158933648115e-01 17736 8253 -4.68209319752302e-05 17736 8733 -2.63632843519918e-06 17736 8757 -2.21346096836280e-02 17736 8781 -2.26074176801012e-01 17736 8805 -1.90496251634988e-01 17736 8829 -9.94001768869176e-03 17736 9381 -2.84457677356830e-05 17736 9405 -1.52153242486523e-04 17736 9429 -2.31168330062640e-07 17736 17736 7.41816968014238e+00 17736 16872 1.95169726494284e-02 17736 16896 1.58909152704614e-01 17736 16920 3.64809417098173e-01 17736 16944 1.68550846191473e-01 17736 16968 2.19273960211432e-02 17736 17280 1.55035990460180e-01 17736 17304 1.25962880977220e+00 17736 17328 2.88497387994915e+00 17736 17352 1.32747883898370e+00 17736 17376 1.71998497763054e-01 17736 17688 3.46776184423025e-01 17736 17712 2.80987646010903e+00 17736 17760 2.94399814662354e+00 17736 17784 3.80306606051653e-01 17736 18096 1.54515349157389e-01 17736 18120 1.24398624531149e+00 17736 18144 2.82739787882995e+00 17736 18168 1.30265738846123e+00 17736 18192 1.69183134944824e-01 17736 18504 1.93868123237306e-02 17736 18528 1.54998511589437e-01 17736 18552 3.50415416818372e-01 17736 18576 1.62345483560857e-01 17736 18600 2.12235553165857e-02 17737 17737 1.00000000000000e+00 17738 17738 1.00000000000000e+00 17739 17739 1.00000000000000e+00 17740 17740 1.00000000000000e+00 17741 17741 1.00000000000000e+00 17742 17742 1.00000000000000e+00 17743 17743 1.00000000000000e+00 17744 17744 1.00000000000000e+00 17745 17745 1.00000000000000e+00 17746 17746 1.00000000000000e+00 17747 17747 1.00000000000000e+00 17748 17748 1.00000000000000e+00 17749 17749 1.00000000000000e+00 17750 17750 1.00000000000000e+00 17751 17751 1.00000000000000e+00 17752 17752 1.00000000000000e+00 17753 17753 1.00000000000000e+00 17754 17754 1.00000000000000e+00 17755 17755 1.00000000000000e+00 17756 17756 1.00000000000000e+00 17757 17757 1.00000000000000e+00 17758 17758 1.00000000000000e+00 17759 17759 1.00000000000000e+00 17760 6381 -8.99956012314778e-04 17760 6405 -1.93303940305554e-03 17760 6429 -1.33092751663792e-05 17760 6957 -7.98683687606921e-04 17760 6981 -1.78671550878463e-01 17760 7005 -6.02940997111874e-01 17760 7029 -2.65399292796337e-01 17760 7053 -5.36026349040991e-03 17760 7077 -1.96062915748000e-09 17760 7557 -4.55087334551132e-02 17760 7581 -1.93483237870046e+00 17760 7605 -6.49493602195037e+00 17760 7629 -2.64775831761201e+00 17760 7653 -1.31722113288675e-01 17760 7677 -4.68162706606940e-06 17760 8133 -6.06677257560000e-10 17760 8157 -7.37384779871936e-02 17760 8181 -2.22780410194089e+00 17760 8205 -8.01336539963256e+00 17760 8229 -3.40775270230962e+00 17760 8253 -1.43573546139108e-01 17760 8277 -4.00202380170130e-07 17760 8733 -9.21392776400000e-11 17760 8757 -5.97175117773276e-03 17760 8781 -3.54816042167546e-01 17760 8805 -1.11422845009591e+00 17760 8829 -4.95781694150881e-01 17760 8853 -9.42561470530932e-03 17760 9381 -2.02465739836170e-04 17760 9405 -9.40248882104714e-03 17760 9429 -5.38291298606250e-03 17760 17760 7.90720107965390e+00 17760 16896 2.02103155267251e-02 17760 16920 1.68550846191473e-01 17760 16944 3.97019136574115e-01 17760 16968 1.91591522920964e-01 17760 16992 2.59704847090979e-02 17760 17304 1.59871211982866e-01 17760 17328 1.32747883898370e+00 17760 17352 3.11986350731990e+00 17760 17376 1.52005931556467e+00 17760 17400 2.08016331128110e-01 17760 17712 3.55692930604217e-01 17760 17736 2.94399814662354e+00 17760 17784 3.38763623309864e+00 17760 17808 4.66602452222989e-01 17760 18120 1.56481212170480e-01 17760 18144 1.30265738846123e+00 17760 18168 3.06392335696751e+00 17760 18192 1.47878048249848e+00 17760 18216 2.00511985679792e-01 17760 18528 1.93628155736285e-02 17760 18552 1.62345483560857e-01 17760 18576 3.83034098986018e-01 17760 18600 1.81271814654417e-01 17760 18624 2.40943983470185e-02 17761 17761 1.00000000000000e+00 17762 17762 1.00000000000000e+00 17763 17763 1.00000000000000e+00 17764 17764 1.00000000000000e+00 17765 17765 1.00000000000000e+00 17766 17766 1.00000000000000e+00 17767 17767 1.00000000000000e+00 17768 17768 1.00000000000000e+00 17769 17769 1.00000000000000e+00 17770 17770 1.00000000000000e+00 17771 17771 1.00000000000000e+00 17772 17772 1.00000000000000e+00 17773 17773 1.00000000000000e+00 17774 17774 1.00000000000000e+00 17775 17775 1.00000000000000e+00 17776 17776 1.00000000000000e+00 17777 17777 1.00000000000000e+00 17778 17778 1.00000000000000e+00 17779 17779 1.00000000000000e+00 17780 17780 1.00000000000000e+00 17781 17781 1.00000000000000e+00 17782 17782 1.00000000000000e+00 17783 17783 1.00000000000000e+00 17784 6405 -1.59177904572115e-06 17784 6429 -3.98147192210430e-07 17784 6981 -1.59366967251032e-03 17784 7005 -8.66559427129925e-02 17784 7029 -1.36848367689047e-01 17784 7053 -1.45815447323941e-02 17784 7077 -1.44727600551000e-08 17784 7557 -3.47987915136900e-08 17784 7581 -1.44363945467572e-01 17784 7605 -2.18514483610331e+00 17784 7629 -3.73623591502851e+00 17784 7653 -6.43339735310644e-01 17784 7677 -7.17949674489168e-03 17784 8157 -4.06769525242680e-04 17784 8181 -3.90543641669712e-01 17784 8205 -6.17588936427217e+00 17784 8229 -1.02216097184028e+01 17784 8253 -1.52603805139518e+00 17784 8277 -1.69311411195079e-02 17784 8757 -2.50271011591090e-04 17784 8781 -1.27093248179564e-01 17784 8805 -2.01546910711483e+00 17784 8829 -2.77314972883565e+00 17784 8853 -5.14460043694639e-01 17784 8877 -1.35262437329917e-03 17784 9381 -3.83180860003062e-04 17784 9405 -4.35511837740995e-02 17784 9429 -7.39964518854148e-02 17784 9453 -9.31784332562728e-03 17784 10029 -7.29284455996000e-09 17784 10053 -2.47779430879000e-09 17784 17784 9.20734770868317e+00 17784 16920 2.19273960211432e-02 17784 16944 1.91591522920964e-01 17784 16968 4.52628160109030e-01 17784 16992 1.64573973805674e-01 17784 17016 1.51730087423207e-02 17784 17328 1.71998497763054e-01 17784 17352 1.52005931556467e+00 17784 17376 3.64388340608851e+00 17784 17400 1.40655976561497e+00 17784 17424 1.43623610275628e-01 17784 17736 3.80306606051653e-01 17784 17760 3.38763623309864e+00 17784 17808 3.31201727714559e+00 17784 17832 3.61401867063391e-01 17784 18144 1.69183134944824e-01 17784 18168 1.47878048249848e+00 17784 18192 3.51831670951067e+00 17784 18216 1.36581515747559e+00 17784 18240 1.40941803689102e-01 17784 18552 2.12235553165857e-02 17784 18576 1.81271814654417e-01 17784 18600 4.21236485964572e-01 17784 18624 1.54387821770831e-01 17784 18648 1.45025570956891e-02 17785 17785 1.00000000000000e+00 17786 17786 1.00000000000000e+00 17787 17787 1.00000000000000e+00 17788 17788 1.00000000000000e+00 17789 17789 1.00000000000000e+00 17790 17790 1.00000000000000e+00 17791 17791 1.00000000000000e+00 17792 17792 1.00000000000000e+00 17793 17793 1.00000000000000e+00 17794 17794 1.00000000000000e+00 17795 17795 1.00000000000000e+00 17796 17796 1.00000000000000e+00 17797 17797 1.00000000000000e+00 17798 17798 1.00000000000000e+00 17799 17799 1.00000000000000e+00 17800 17800 1.00000000000000e+00 17801 17801 1.00000000000000e+00 17802 17802 1.00000000000000e+00 17803 17803 1.00000000000000e+00 17804 17804 1.00000000000000e+00 17805 17805 1.00000000000000e+00 17806 17806 1.00000000000000e+00 17807 17807 1.00000000000000e+00 17808 7005 -1.73381330431116e-03 17808 7029 -2.03872129237756e-02 17808 7053 -4.43604484561137e-03 17808 7077 -2.84816028581600e-08 17808 7581 -2.73146508523377e-05 17808 7605 -2.23748796928774e-01 17808 7629 -1.16968533203044e+00 17808 7653 -9.28686431603791e-01 17808 7677 -1.24352589445778e-01 17808 8181 -8.39152786425451e-03 17808 8205 -1.28251347224221e+00 17808 8229 -7.85669670876051e+00 17808 8253 -8.42168416152389e+00 17808 8277 -5.54951980889194e-01 17808 8781 -1.27081830126299e-02 17808 8805 -7.34540317333682e-01 17808 8829 -6.90326339321349e+00 17808 8853 -7.40748823356999e+00 17808 8877 -9.11000637037568e-02 17808 9381 -8.87003356679494e-05 17808 9405 -4.59803680636706e-02 17808 9429 -9.00313035298770e-01 17808 9453 -4.48334279241390e-01 17808 10029 -4.28709318978560e-06 17808 10053 -1.54782487178360e-06 17808 17808 9.72287790042684e+00 17808 16944 2.59704847090979e-02 17808 16968 1.64573973805674e-01 17808 16992 3.85652247454580e-01 17808 17016 2.94519280705986e-01 17808 17352 2.08016331128110e-01 17808 17376 1.40655976561497e+00 17808 17400 3.51355052713259e+00 17808 17424 2.58960730429128e+00 17808 17760 4.66602452222989e-01 17808 17784 3.31201727714559e+00 17808 17832 6.39329861863230e+00 17808 18168 2.00511985679792e-01 17808 18192 1.36581515747559e+00 17808 18216 3.78477955217486e+00 17808 18240 3.22216462969520e+00 17808 18576 2.40943983470185e-02 17808 18600 1.54387821770831e-01 17808 18624 4.53459503715149e-01 17808 18648 4.52658612056966e-01 17809 17809 1.00000000000000e+00 17810 17810 1.00000000000000e+00 17811 17811 1.00000000000000e+00 17812 17812 1.00000000000000e+00 17813 17813 1.00000000000000e+00 17814 17814 1.00000000000000e+00 17815 17815 1.00000000000000e+00 17816 17816 1.00000000000000e+00 17817 17817 1.00000000000000e+00 17818 17818 1.00000000000000e+00 17819 17819 1.00000000000000e+00 17820 17820 1.00000000000000e+00 17821 17821 1.00000000000000e+00 17822 17822 1.00000000000000e+00 17823 17823 1.00000000000000e+00 17824 17824 1.00000000000000e+00 17825 17825 1.00000000000000e+00 17826 17826 1.00000000000000e+00 17827 17827 1.00000000000000e+00 17828 17828 1.00000000000000e+00 17829 17829 1.00000000000000e+00 17830 17830 1.00000000000000e+00 17831 17831 1.00000000000000e+00 17832 7029 -1.55188264107731e-04 17832 7053 -2.42406379375070e-04 17832 7077 -6.63024342517000e-09 17832 7605 -3.09682943183135e-04 17832 7629 -9.96338200064888e-02 17832 7653 -5.86323053563030e-01 17832 7677 -1.98570423981032e-01 17832 8205 -3.89639863280264e-02 17832 8229 -2.69515405120276e+00 17832 8253 -9.88947253249662e+00 17832 8277 -9.91396379203716e-01 17832 8781 -1.23322260600600e-08 17832 8805 -7.96440172054091e-02 17832 8829 -6.32062101669730e+00 17832 8853 -1.14588221436155e+01 17832 8877 -1.72731756794419e-01 17832 9381 -4.41669362790000e-09 17832 9405 -1.68082945346775e-02 17832 9429 -1.42258422170924e+00 17832 9453 -8.31443655203389e-01 17832 10029 -8.52313646765147e-06 17832 10053 -3.07830518340567e-06 17832 17832 1.12567841678208e+01 17832 16968 1.51730087423207e-02 17832 16992 2.94519280705986e-01 17832 17016 4.82827500215728e-01 17832 17376 1.43623610275628e-01 17832 17400 2.58960730429128e+00 17832 17424 4.17384933665315e+00 17832 17784 3.61401867063391e-01 17832 17808 6.39329861863230e+00 17832 18192 1.40941803689102e-01 17832 18216 3.22216462969520e+00 17832 18240 5.45773663356667e+00 17832 18600 1.45025570956891e-02 17832 18624 4.52658612056966e-01 17832 18648 8.03799324444108e-01 17833 17833 1.00000000000000e+00 17834 17834 1.00000000000000e+00 17835 17835 1.00000000000000e+00 17836 17836 1.00000000000000e+00 17837 17837 1.00000000000000e+00 17838 17838 1.00000000000000e+00 17839 17839 1.00000000000000e+00 17840 17840 1.00000000000000e+00 17841 17841 1.00000000000000e+00 17842 17842 1.00000000000000e+00 17843 17843 1.00000000000000e+00 17844 17844 1.00000000000000e+00 17845 17845 1.00000000000000e+00 17846 17846 1.00000000000000e+00 17847 17847 1.00000000000000e+00 17848 17848 1.00000000000000e+00 17849 17849 1.00000000000000e+00 17850 17850 1.00000000000000e+00 17851 17851 1.00000000000000e+00 17852 17852 1.00000000000000e+00 17853 17853 1.00000000000000e+00 17854 17854 1.00000000000000e+00 17855 17855 1.00000000000000e+00 17856 3789 -4.50372466621900e-08 17856 3813 -3.09907564292860e-07 17856 4389 -4.22719899012738e-01 17856 4413 -1.26735440242565e+00 17856 4437 -3.85260548717751e-02 17856 4461 -2.87059089138043e-06 17856 4965 -3.06995764510260e-02 17856 4989 -1.10499459964699e+01 17856 5013 -9.15748002497568e+00 17856 5037 -1.55218139672082e-01 17856 5061 -1.25824412478916e-05 17856 5565 -3.91858603018188e-01 17856 5589 -1.11286651487522e+01 17856 5613 -4.85138247369462e+00 17856 5637 -8.98711480908165e-02 17856 5661 -9.93685121070000e-10 17856 6165 -1.09415256228249e-01 17856 6189 -6.14318709256880e-01 17856 6213 -1.68324535039269e-01 17856 6237 -1.97210171975277e-03 17856 6789 -3.08469849872074e-04 17856 6813 -3.37059951672540e-04 17856 17856 1.41192821628460e+01 17856 17040 6.32423831578000e-01 17856 17064 3.63786962869199e-01 17856 17088 1.35928705943427e-02 17856 17448 5.54991856477199e+00 17856 17472 3.23794388911820e+00 17856 17496 1.32281316209199e-01 17856 17880 7.76021858978296e+00 17856 17904 3.43022145245695e-01 17856 18264 4.64408474817205e+00 17856 18288 2.84378594303396e+00 17856 18312 1.49069591127980e-01 17856 18672 4.05965377428013e-01 17856 18696 2.65247476348139e-01 17856 18720 1.77899393240378e-02 17857 17857 1.00000000000000e+00 17858 17858 1.00000000000000e+00 17859 17859 1.00000000000000e+00 17860 17860 1.00000000000000e+00 17861 17861 1.00000000000000e+00 17862 17862 1.00000000000000e+00 17863 17863 1.00000000000000e+00 17864 17864 1.00000000000000e+00 17865 17865 1.00000000000000e+00 17866 17866 1.00000000000000e+00 17867 17867 1.00000000000000e+00 17868 17868 1.00000000000000e+00 17869 17869 1.00000000000000e+00 17870 17870 1.00000000000000e+00 17871 17871 1.00000000000000e+00 17872 17872 1.00000000000000e+00 17873 17873 1.00000000000000e+00 17874 17874 1.00000000000000e+00 17875 17875 1.00000000000000e+00 17876 17876 1.00000000000000e+00 17877 17877 1.00000000000000e+00 17878 17878 1.00000000000000e+00 17879 17879 1.00000000000000e+00 17880 3789 -2.25852715468000e-08 17880 3813 -1.55434573406250e-07 17880 4389 -2.25446163389847e-01 17880 4413 -7.88820640174501e-01 17880 4437 -6.90657784007949e-02 17880 4461 -2.63403151354003e-04 17880 4965 -1.58080846130474e-02 17880 4989 -6.55683928723491e+00 17880 5013 -8.15750338257090e+00 17880 5037 -1.01464558466501e+00 17880 5061 -2.92956316988241e-02 17880 5565 -2.18132430886971e-01 17880 5589 -8.15239410774455e+00 17880 5613 -9.17219547194401e+00 17880 5637 -1.82669002690140e+00 17880 5661 -2.75991069040430e-02 17880 6165 -6.76799247529317e-02 17880 6189 -9.00428623635597e-01 17880 6213 -1.35404939750061e+00 17880 6237 -3.51322853426487e-01 17880 6261 -6.29502914319947e-04 17880 6789 -3.41592650809732e-03 17880 6813 -2.42284408096523e-02 17880 6837 -4.16543717404543e-03 17880 17880 1.01339764526105e+01 17880 17040 3.63786962869199e-01 17880 17064 3.97365055002468e-01 17880 17088 1.55057023365654e-01 17880 17112 2.51713852470707e-02 17880 17448 3.23794388911820e+00 17880 17472 3.67164699493713e+00 17880 17496 1.33207175863361e+00 17880 17520 2.00736623449198e-01 17880 17856 7.76021858978296e+00 17880 17904 3.17831707809931e+00 17880 17928 4.51557124279117e-01 17880 18264 2.84378594303396e+00 17880 18288 3.71364396652321e+00 17880 18312 1.41538524136978e+00 17880 18336 2.04776719214462e-01 17880 18672 2.65247476348139e-01 17880 18696 4.07864297898985e-01 17880 18720 1.75885394049698e-01 17880 18744 2.61814091883867e-02 17881 17881 1.00000000000000e+00 17882 17882 1.00000000000000e+00 17883 17883 1.00000000000000e+00 17884 17884 1.00000000000000e+00 17885 17885 1.00000000000000e+00 17886 17886 1.00000000000000e+00 17887 17887 1.00000000000000e+00 17888 17888 1.00000000000000e+00 17889 17889 1.00000000000000e+00 17890 17890 1.00000000000000e+00 17891 17891 1.00000000000000e+00 17892 17892 1.00000000000000e+00 17893 17893 1.00000000000000e+00 17894 17894 1.00000000000000e+00 17895 17895 1.00000000000000e+00 17896 17896 1.00000000000000e+00 17897 17897 1.00000000000000e+00 17898 17898 1.00000000000000e+00 17899 17899 1.00000000000000e+00 17900 17900 1.00000000000000e+00 17901 17901 1.00000000000000e+00 17902 17902 1.00000000000000e+00 17903 17903 1.00000000000000e+00 17904 3789 -1.90423473400000e-11 17904 3813 -1.37368931380000e-10 17904 4389 -4.02463253813648e-03 17904 4413 -5.62077263860371e-02 17904 4437 -4.79131606910220e-02 17904 4461 -1.04490660266624e-03 17904 4965 -1.30941825009836e-04 17904 4989 -3.02145747279517e-01 17904 5013 -2.24353417678793e+00 17904 5037 -2.31875979400015e+00 17904 5061 -2.16006340598428e-01 17904 5085 -1.06285179056372e-03 17904 5565 -6.34375125082210e-03 17904 5589 -9.67865603429273e-01 17904 5613 -8.73478129569122e+00 17904 5637 -7.47852153566612e+00 17904 5661 -6.49578675580656e-01 17904 5685 -2.36917694260555e-03 17904 6165 -3.70637046823065e-03 17904 6189 -4.38209835369883e-01 17904 6213 -3.53361738223854e+00 17904 6237 -2.73881420483961e+00 17904 6261 -2.64974126596216e-01 17904 6285 -2.04089667481575e-05 17904 6789 -9.14157579495082e-03 17904 6813 -1.36403831570532e-01 17904 6837 -1.16903644012217e-01 17904 6861 -5.17996492292174e-03 17904 7413 -3.49414465273940e-07 17904 7437 -4.68288025480875e-06 17904 7461 -5.66768020861000e-09 17904 17904 8.94270722031846e+00 17904 17040 1.35928705943427e-02 17904 17064 1.55057023365654e-01 17904 17088 4.38078710129993e-01 17904 17112 1.87660243318358e-01 17904 17136 2.17436755825188e-02 17904 17448 1.32281316209199e-01 17904 17472 1.33207175863360e+00 17904 17496 3.51392334433730e+00 17904 17520 1.48237070556025e+00 17904 17544 1.69856052940862e-01 17904 17856 3.43022145245695e-01 17904 17880 3.17831707809931e+00 17904 17928 3.30531284354295e+00 17904 17952 3.74771086606604e-01 17904 18264 1.49069591127980e-01 17904 18288 1.41538524136978e+00 17904 18312 3.59438648349398e+00 17904 18336 1.49466441659605e+00 17904 18360 1.68889384934546e-01 17904 18672 1.77899393240378e-02 17904 18696 1.75885394049698e-01 17904 18720 4.58194494919164e-01 17904 18744 1.90733671077306e-01 17904 18768 2.15020085809398e-02 17905 17905 1.00000000000000e+00 17906 17906 1.00000000000000e+00 17907 17907 1.00000000000000e+00 17908 17908 1.00000000000000e+00 17909 17909 1.00000000000000e+00 17910 17910 1.00000000000000e+00 17911 17911 1.00000000000000e+00 17912 17912 1.00000000000000e+00 17913 17913 1.00000000000000e+00 17914 17914 1.00000000000000e+00 17915 17915 1.00000000000000e+00 17916 17916 1.00000000000000e+00 17917 17917 1.00000000000000e+00 17918 17918 1.00000000000000e+00 17919 17919 1.00000000000000e+00 17920 17920 1.00000000000000e+00 17921 17921 1.00000000000000e+00 17922 17922 1.00000000000000e+00 17923 17923 1.00000000000000e+00 17924 17924 1.00000000000000e+00 17925 17925 1.00000000000000e+00 17926 17926 1.00000000000000e+00 17927 17927 1.00000000000000e+00 17928 4413 -3.19873872226571e-03 17928 4437 -9.38575092160602e-03 17928 4461 -3.89332230272224e-04 17928 4989 -1.97260203679885e-03 17928 5013 -3.41170327114189e-01 17928 5037 -1.05198764373595e+00 17928 5061 -4.57991835894876e-01 17928 5085 -1.19319310724472e-02 17928 5109 -6.94046372686320e-07 17928 5589 -6.14995665721261e-02 17928 5613 -2.45398170369836e+00 17928 5637 -7.77456076509330e+00 17928 5661 -2.99873944324042e+00 17928 5685 -1.34841749520498e-01 17928 5709 -1.05416003024271e-05 17928 6189 -7.35160147784654e-02 17928 6213 -1.98400933919514e+00 17928 6237 -6.61043386329524e+00 17928 6261 -2.64139157095848e+00 17928 6285 -1.06356067585759e-01 17928 6309 -8.46091646237500e-08 17928 6789 -2.60171715117956e-03 17928 6813 -2.07628844917461e-01 17928 6837 -6.49732174719315e-01 17928 6861 -2.58902342369891e-01 17928 6885 -4.15438031221892e-03 17928 7413 -3.41322157762283e-06 17928 7437 -1.95098127036782e-03 17928 7461 -1.55759882964494e-03 17928 17928 7.80038152703585e+00 17928 17064 2.51713852470707e-02 17928 17088 1.87660243318358e-01 17928 17112 3.92592948889666e-01 17928 17136 1.65065719619254e-01 17928 17160 1.95227543222948e-02 17928 17472 2.00736623449198e-01 17928 17496 1.48237070556025e+00 17928 17520 3.07484360048553e+00 17928 17544 1.30506473169342e+00 17928 17568 1.56410129982489e-01 17928 17880 4.51557124279117e-01 17928 17904 3.30531284354295e+00 17928 17952 2.90903241462977e+00 17928 17976 3.52487017050824e-01 17928 18288 2.04776719214462e-01 17928 18312 1.49466441659605e+00 17928 18336 3.06407723868171e+00 17928 18360 1.30383898179604e+00 17928 18384 1.57070360514461e-01 17928 18696 2.61814091883867e-02 17928 18720 1.90733671077306e-01 17928 18744 3.89901358438711e-01 17928 18768 1.64759282144910e-01 17928 18792 1.96878119552877e-02 17929 17929 1.00000000000000e+00 17930 17930 1.00000000000000e+00 17931 17931 1.00000000000000e+00 17932 17932 1.00000000000000e+00 17933 17933 1.00000000000000e+00 17934 17934 1.00000000000000e+00 17935 17935 1.00000000000000e+00 17936 17936 1.00000000000000e+00 17937 17937 1.00000000000000e+00 17938 17938 1.00000000000000e+00 17939 17939 1.00000000000000e+00 17940 17940 1.00000000000000e+00 17941 17941 1.00000000000000e+00 17942 17942 1.00000000000000e+00 17943 17943 1.00000000000000e+00 17944 17944 1.00000000000000e+00 17945 17945 1.00000000000000e+00 17946 17946 1.00000000000000e+00 17947 17947 1.00000000000000e+00 17948 17948 1.00000000000000e+00 17949 17949 1.00000000000000e+00 17950 17950 1.00000000000000e+00 17951 17951 1.00000000000000e+00 17952 4437 -8.49783613857458e-05 17952 4461 -3.43528606209355e-05 17952 5013 -3.33212378989235e-03 17952 5037 -1.43978339114223e-01 17952 5061 -2.30669445532562e-01 17952 5085 -3.37284796292224e-02 17952 5109 -1.65162946727462e-05 17952 5589 -5.41995950758400e-07 17952 5613 -1.66742076918551e-01 17952 5637 -2.44933938889463e+00 17952 5661 -3.96244886125039e+00 17952 5685 -7.80770559015170e-01 17952 5709 -1.53834825153156e-02 17952 6189 -3.14289429538524e-04 17952 6213 -3.28645579300925e-01 17952 6237 -4.66363090861395e+00 17952 6261 -7.93340222138178e+00 17952 6285 -1.50118703445927e+00 17952 6309 -2.19885461768134e-02 17952 6789 -1.04917510642632e-04 17952 6813 -7.08050616192474e-02 17952 6837 -1.14612630496388e+00 17952 6861 -1.71860913009061e+00 17952 6885 -3.76017434900472e-01 17952 6909 -9.06390528705473e-04 17952 7413 -8.41167939047529e-06 17952 7437 -1.23074871066057e-02 17952 7461 -4.17062818071607e-02 17952 7485 -6.09418934663193e-03 17952 17952 7.36002245700798e+00 17952 17088 2.17436755825188e-02 17952 17112 1.65065719619254e-01 17952 17136 3.53543269491002e-01 17952 17160 1.55833116296245e-01 17952 17184 1.94355247517665e-02 17952 17496 1.69856052940862e-01 17952 17520 1.30506473169342e+00 17952 17544 2.82694718723967e+00 17952 17568 1.24375673824568e+00 17952 17592 1.54529054578926e-01 17952 17904 3.74771086606604e-01 17952 17928 2.90903241462977e+00 17952 17976 2.79178445855524e+00 17952 18000 3.45459097587972e-01 17952 18312 1.68889384934546e-01 17952 18336 1.30383898179604e+00 17952 18360 2.83430511093290e+00 17952 18384 1.23744127312555e+00 17952 18408 1.52289957766922e-01 17952 18720 2.15020085809398e-02 17952 18744 1.64759282144910e-01 17952 18768 3.55382750414309e-01 17952 18792 1.54254250016213e-01 17952 18816 1.88757505487655e-02 17953 17953 1.00000000000000e+00 17954 17954 1.00000000000000e+00 17955 17955 1.00000000000000e+00 17956 17956 1.00000000000000e+00 17957 17957 1.00000000000000e+00 17958 17958 1.00000000000000e+00 17959 17959 1.00000000000000e+00 17960 17960 1.00000000000000e+00 17961 17961 1.00000000000000e+00 17962 17962 1.00000000000000e+00 17963 17963 1.00000000000000e+00 17964 17964 1.00000000000000e+00 17965 17965 1.00000000000000e+00 17966 17966 1.00000000000000e+00 17967 17967 1.00000000000000e+00 17968 17968 1.00000000000000e+00 17969 17969 1.00000000000000e+00 17970 17970 1.00000000000000e+00 17971 17971 1.00000000000000e+00 17972 17972 1.00000000000000e+00 17973 17973 1.00000000000000e+00 17974 17974 1.00000000000000e+00 17975 17975 1.00000000000000e+00 17976 5037 -2.68360686543640e-03 17976 5061 -3.61825963381653e-02 17976 5085 -1.54562329970989e-02 17976 5109 -5.60742176785095e-05 17976 5613 -5.77838800737355e-05 17976 5637 -2.35359211128363e-01 17976 5661 -1.47822609499832e+00 17976 5685 -1.30220261752322e+00 17976 5709 -1.12540250718599e-01 17976 5733 -4.48079598200323e-04 17976 6213 -6.87824803542511e-03 17976 6237 -9.83374149245025e-01 17976 6261 -6.94373649909142e+00 17976 6285 -5.55216590365651e+00 17976 6309 -4.97254905233338e-01 17976 6333 -1.86222575103135e-03 17976 6813 -6.56477375214337e-03 17976 6837 -5.14869724059545e-01 17976 6861 -3.58766882084473e+00 17976 6885 -2.88002145247029e+00 17976 6909 -2.84162572146214e-01 17976 6933 -4.61869584146418e-05 17976 7413 -2.01560395289946e-06 17976 7437 -2.04237157877317e-02 17976 7461 -2.08634239809661e-01 17976 7485 -1.69941020545760e-01 17976 7509 -9.04705997000791e-03 17976 8061 -2.21422910102273e-05 17976 8085 -1.27258756124397e-04 17976 8109 -2.55683926896930e-07 17976 17976 7.21643411078448e+00 17976 17112 1.95227543222948e-02 17976 17136 1.55833116296245e-01 17976 17160 3.49381414664424e-01 17976 17184 1.53303156262524e-01 17976 17208 1.88902643138646e-02 17976 17520 1.56410129982489e-01 17976 17544 1.24375673824568e+00 17976 17568 2.77918470063371e+00 17976 17592 1.21935500786909e+00 17976 17616 1.50309697388343e-01 17976 17928 3.52487017050824e-01 17976 17952 2.79178445855524e+00 17976 18000 2.72824251965547e+00 17976 18024 3.36601532325882e-01 17976 18336 1.57070360514461e-01 17976 18360 1.23744127312555e+00 17976 18384 2.74332515484007e+00 17976 18408 1.20762171128692e+00 17976 18432 1.49615470054805e-01 17976 18744 1.96878119552877e-02 17976 18768 1.54254250016213e-01 17976 18792 3.40416528216015e-01 17976 18816 1.50369832116982e-01 17976 18840 1.87167074804801e-02 17977 17977 1.00000000000000e+00 17978 17978 1.00000000000000e+00 17979 17979 1.00000000000000e+00 17980 17980 1.00000000000000e+00 17981 17981 1.00000000000000e+00 17982 17982 1.00000000000000e+00 17983 17983 1.00000000000000e+00 17984 17984 1.00000000000000e+00 17985 17985 1.00000000000000e+00 17986 17986 1.00000000000000e+00 17987 17987 1.00000000000000e+00 17988 17988 1.00000000000000e+00 17989 17989 1.00000000000000e+00 17990 17990 1.00000000000000e+00 17991 17991 1.00000000000000e+00 17992 17992 1.00000000000000e+00 17993 17993 1.00000000000000e+00 17994 17994 1.00000000000000e+00 17995 17995 1.00000000000000e+00 17996 17996 1.00000000000000e+00 17997 17997 1.00000000000000e+00 17998 17998 1.00000000000000e+00 17999 17999 1.00000000000000e+00 18000 5061 -8.71566016129888e-04 18000 5085 -1.94985337928625e-03 18000 5109 -1.54190474932794e-05 18000 5637 -7.15434311001538e-04 18000 5661 -1.70937578879021e-01 18000 5685 -5.54442084415404e-01 18000 5709 -2.34465262564612e-01 18000 5733 -4.43884181165068e-03 18000 5757 -3.17062769720000e-09 18000 6237 -4.21980672869893e-02 18000 6261 -1.80327671377134e+00 18000 6285 -5.79840393114080e+00 18000 6309 -2.23326814143203e+00 18000 6333 -9.93778601987012e-02 18000 6357 -4.56708922212480e-06 18000 6813 -6.64224849700000e-11 18000 6837 -6.87655032636452e-02 18000 6861 -1.99343558131644e+00 18000 6885 -6.90984690437406e+00 18000 6909 -2.67868645090644e+00 18000 6933 -1.06320221811239e-01 18000 6957 -3.90152634118490e-07 18000 7413 -1.00590931000000e-11 18000 7437 -5.35878571918443e-03 18000 7461 -3.05397524757640e-01 18000 7485 -9.17064794435828e-01 18000 7509 -3.71678060230642e-01 18000 7533 -7.05238029109580e-03 18000 8061 -1.47971231592430e-04 18000 8085 -7.04436337218156e-03 18000 8109 -4.14430081245728e-03 18000 18000 7.06341460812457e+00 18000 17136 1.94355247517665e-02 18000 17160 1.53303156262524e-01 18000 17184 3.40309845637373e-01 18000 17208 1.50081424710553e-01 18000 17232 1.86300918637737e-02 18000 17544 1.54529054578926e-01 18000 17568 1.21935500786909e+00 18000 17592 2.70777635461111e+00 18000 17616 1.19440735682797e+00 18000 17640 1.48292141818646e-01 18000 17952 3.45459097587972e-01 18000 17976 2.72824251965547e+00 18000 18024 2.67573010259266e+00 18000 18048 3.32330993322269e-01 18000 18360 1.52289957766922e-01 18000 18384 1.20762171128692e+00 18000 18408 2.69436446902456e+00 18000 18432 1.19136984174206e+00 18000 18456 1.48226990380706e-01 18000 18768 1.88757505487655e-02 18000 18792 1.50369832116982e-01 18000 18816 3.36956874240736e-01 18000 18840 1.49322045939075e-01 18000 18864 1.86138040042886e-02 18001 18001 1.00000000000000e+00 18002 18002 1.00000000000000e+00 18003 18003 1.00000000000000e+00 18004 18004 1.00000000000000e+00 18005 18005 1.00000000000000e+00 18006 18006 1.00000000000000e+00 18007 18007 1.00000000000000e+00 18008 18008 1.00000000000000e+00 18009 18009 1.00000000000000e+00 18010 18010 1.00000000000000e+00 18011 18011 1.00000000000000e+00 18012 18012 1.00000000000000e+00 18013 18013 1.00000000000000e+00 18014 18014 1.00000000000000e+00 18015 18015 1.00000000000000e+00 18016 18016 1.00000000000000e+00 18017 18017 1.00000000000000e+00 18018 18018 1.00000000000000e+00 18019 18019 1.00000000000000e+00 18020 18020 1.00000000000000e+00 18021 18021 1.00000000000000e+00 18022 18022 1.00000000000000e+00 18023 18023 1.00000000000000e+00 18024 5085 -1.58029534922598e-06 18024 5109 -4.19734577819620e-07 18024 5661 -1.32903395665438e-03 18024 5685 -7.39127451110982e-02 18024 5709 -1.09225360996484e-01 18024 5733 -1.13536029586754e-02 18024 5757 -3.06112379000400e-08 18024 6237 -1.79287271112400e-08 18024 6261 -1.24081197234279e-01 18024 6285 -1.76536172072492e+00 18024 6309 -2.80557560879687e+00 18024 6333 -5.46152839053621e-01 18024 6357 -9.35970523369878e-03 18024 6837 -3.19429685077528e-04 18024 6861 -3.30604382240392e-01 18024 6885 -4.66386840319997e+00 18024 6909 -7.65930322967343e+00 18024 6933 -1.37644441535069e+00 18024 6957 -2.07758257319012e-02 18024 7437 -1.96245122556974e-04 18024 7461 -1.02094554323801e-01 18024 7485 -1.53990166618198e+00 18024 7509 -2.28807743415274e+00 18024 7533 -4.82708299194577e-01 18024 7557 -1.43453473503938e-03 18024 8061 -2.59752650159810e-04 18024 8085 -3.60917035854068e-02 18024 8109 -8.08640652260128e-02 18024 8133 -1.12740152964935e-02 18024 8709 -5.84238235270000e-09 18024 8733 -2.08894349837000e-09 18024 18024 6.98863844253899e+00 18024 17160 1.88902643138646e-02 18024 17184 1.50081424710553e-01 18024 17208 3.35688441614723e-01 18024 17232 1.49387197377015e-01 18024 17256 1.87167074804801e-02 18024 17568 1.50309697388343e-01 18024 17592 1.19440735682797e+00 18024 17616 2.67230601242582e+00 18024 17640 1.19045675103090e+00 18024 17664 1.49322045939075e-01 18024 17976 3.36601532325882e-01 18024 18000 2.67573010259266e+00 18024 18048 2.66828804151547e+00 18024 18072 3.34741017056585e-01 18024 18384 1.49615470054805e-01 18024 18408 1.19136984174206e+00 18024 18432 2.66851631419325e+00 18024 18456 1.18198395371120e+00 18024 18480 1.47268998047092e-01 18024 18792 1.87167074804801e-02 18024 18816 1.49322045939075e-01 18024 18840 3.34741017056581e-01 18024 18864 1.47268998047091e-01 18024 18888 1.82034455074842e-02 18025 18025 1.00000000000000e+00 18026 18026 1.00000000000000e+00 18027 18027 1.00000000000000e+00 18028 18028 1.00000000000000e+00 18029 18029 1.00000000000000e+00 18030 18030 1.00000000000000e+00 18031 18031 1.00000000000000e+00 18032 18032 1.00000000000000e+00 18033 18033 1.00000000000000e+00 18034 18034 1.00000000000000e+00 18035 18035 1.00000000000000e+00 18036 18036 1.00000000000000e+00 18037 18037 1.00000000000000e+00 18038 18038 1.00000000000000e+00 18039 18039 1.00000000000000e+00 18040 18040 1.00000000000000e+00 18041 18041 1.00000000000000e+00 18042 18042 1.00000000000000e+00 18043 18043 1.00000000000000e+00 18044 18044 1.00000000000000e+00 18045 18045 1.00000000000000e+00 18046 18046 1.00000000000000e+00 18047 18047 1.00000000000000e+00 18048 5685 -1.21000740674986e-03 18048 5709 -1.52511482932413e-02 18048 5733 -3.92424215915950e-03 18048 5757 -7.48855361421700e-08 18048 6261 -1.62498969958989e-05 18048 6285 -1.56910533252355e-01 18048 6309 -9.74542059803761e-01 18048 6333 -8.36607401537234e-01 18048 6357 -6.46742273828280e-02 18048 6381 -1.66168765949972e-04 18048 6861 -5.97874547333352e-03 18048 6885 -9.41744134857343e-01 18048 6909 -6.27649976772462e+00 18048 6933 -4.81535243342511e+00 18048 6957 -4.15890163972253e-01 18048 6981 -1.54822597046121e-03 18048 7461 -9.23046608098390e-03 18048 7485 -6.46991543310079e-01 18048 7509 -4.42023205069238e+00 18048 7533 -3.42674317775810e+00 18048 7557 -3.18730314473018e-01 18048 7581 -9.56224454740977e-05 18048 8061 -5.94104233255147e-05 18048 8085 -4.61905750663567e-02 18048 8109 -3.62722235630272e-01 18048 8133 -2.74213120676923e-01 18048 8157 -1.65572343303866e-02 18048 8709 -2.61608722558184e-04 18048 8733 -8.90212526518251e-04 18048 8757 -2.69057086099652e-06 18048 18048 7.02057532771956e+00 18048 17184 1.86300918637737e-02 18048 17208 1.49387197377015e-01 18048 17232 3.36784571584676e-01 18048 17256 1.49615470054804e-01 18048 17280 1.86871600332210e-02 18048 17592 1.48292141818646e-01 18048 17616 1.19045675103090e+00 18048 17640 2.68596529134034e+00 18048 17664 1.19136984174206e+00 18048 17688 1.48520414496435e-01 18048 18000 3.32330993322269e-01 18048 18024 2.66828804151547e+00 18048 18072 2.66851631419325e+00 18048 18096 3.32388061491714e-01 18048 18408 1.48226990380706e-01 18048 18432 1.18198395371121e+00 18048 18456 2.65275794951494e+00 18048 18480 1.18198395371121e+00 18048 18504 1.48226990380707e-01 18048 18816 1.86138040042886e-02 18048 18840 1.47268998047091e-01 18048 18864 3.28482736128325e-01 18048 18888 1.47268998047093e-01 18048 18912 1.86138040042889e-02 18049 18049 1.00000000000000e+00 18050 18050 1.00000000000000e+00 18051 18051 1.00000000000000e+00 18052 18052 1.00000000000000e+00 18053 18053 1.00000000000000e+00 18054 18054 1.00000000000000e+00 18055 18055 1.00000000000000e+00 18056 18056 1.00000000000000e+00 18057 18057 1.00000000000000e+00 18058 18058 1.00000000000000e+00 18059 18059 1.00000000000000e+00 18060 18060 1.00000000000000e+00 18061 18061 1.00000000000000e+00 18062 18062 1.00000000000000e+00 18063 18063 1.00000000000000e+00 18064 18064 1.00000000000000e+00 18065 18065 1.00000000000000e+00 18066 18066 1.00000000000000e+00 18067 18067 1.00000000000000e+00 18068 18068 1.00000000000000e+00 18069 18069 1.00000000000000e+00 18070 18070 1.00000000000000e+00 18071 18071 1.00000000000000e+00 18072 5709 -1.96245122556973e-04 18072 5733 -3.19429685077527e-04 18072 5757 -1.79287271112400e-08 18072 6285 -2.59752650159813e-04 18072 6309 -1.02094554323801e-01 18072 6333 -3.30604382240391e-01 18072 6357 -1.24081197234279e-01 18072 6381 -1.32903395665440e-03 18072 6885 -3.60917035854071e-02 18072 6909 -1.53990166618198e+00 18072 6933 -4.66386840319994e+00 18072 6957 -1.76536172072492e+00 18072 6981 -7.39127451111007e-02 18072 7005 -1.58029534922605e-06 18072 7461 -5.84238235270000e-09 18072 7485 -8.08640652260130e-02 18072 7509 -2.28807743415277e+00 18072 7533 -7.65930322967335e+00 18072 7557 -2.80557560879681e+00 18072 7581 -1.09225360996483e-01 18072 7605 -4.19734577819640e-07 18072 8061 -2.08894349837000e-09 18072 8085 -1.12740152964935e-02 18072 8109 -4.82708299194579e-01 18072 8133 -1.37644441535069e+00 18072 8157 -5.46152839053609e-01 18072 8181 -1.13536029586749e-02 18072 8709 -1.43453473503940e-03 18072 8733 -2.07758257319015e-02 18072 8757 -9.35970523369895e-03 18072 8781 -3.06112379000400e-08 18072 18072 6.98863844253893e+00 18072 17208 1.87167074804801e-02 18072 17232 1.49615470054804e-01 18072 17256 3.36601532325881e-01 18072 17280 1.50309697388346e-01 18072 17304 1.88902643138654e-02 18072 17616 1.49322045939075e-01 18072 17640 1.19136984174205e+00 18072 17664 2.67573010259264e+00 18072 17688 1.19440735682796e+00 18072 17712 1.50081424710553e-01 18072 18024 3.34741017056585e-01 18072 18048 2.66851631419325e+00 18072 18096 2.67230601242575e+00 18072 18120 3.35688441614710e-01 18072 18432 1.47268998047092e-01 18072 18456 1.18198395371121e+00 18072 18480 2.66828804151546e+00 18072 18504 1.19045675103089e+00 18072 18528 1.49387197377013e-01 18072 18840 1.82034455074842e-02 18072 18864 1.47268998047093e-01 18072 18888 3.34741017056588e-01 18072 18912 1.49322045939077e-01 18072 18936 1.87167074804804e-02 18073 18073 1.00000000000000e+00 18074 18074 1.00000000000000e+00 18075 18075 1.00000000000000e+00 18076 18076 1.00000000000000e+00 18077 18077 1.00000000000000e+00 18078 18078 1.00000000000000e+00 18079 18079 1.00000000000000e+00 18080 18080 1.00000000000000e+00 18081 18081 1.00000000000000e+00 18082 18082 1.00000000000000e+00 18083 18083 1.00000000000000e+00 18084 18084 1.00000000000000e+00 18085 18085 1.00000000000000e+00 18086 18086 1.00000000000000e+00 18087 18087 1.00000000000000e+00 18088 18088 1.00000000000000e+00 18089 18089 1.00000000000000e+00 18090 18090 1.00000000000000e+00 18091 18091 1.00000000000000e+00 18092 18092 1.00000000000000e+00 18093 18093 1.00000000000000e+00 18094 18094 1.00000000000000e+00 18095 18095 1.00000000000000e+00 18096 6309 -5.27208835272877e-04 18096 6333 -4.04287971817126e-02 18096 6357 -4.94199897693993e-02 18096 6381 -2.84679740778408e-03 18096 6909 -9.59262161090050e-02 18096 6933 -1.32125388491842e+00 18096 6957 -2.04795403555766e+00 18096 6981 -3.86242857738437e-01 18096 7005 -5.56833331860751e-03 18096 7485 -3.45218003082495e-04 18096 7509 -3.57157477180807e-01 18096 7533 -4.82545053729412e+00 18096 7557 -7.56571605479370e+00 18096 7581 -1.29828131778270e+00 18096 7605 -1.99554679510914e-02 18096 8085 -3.62720964486756e-04 18096 8109 -1.52427932049993e-01 18096 8133 -2.12020356069702e+00 18096 8157 -3.12316738344963e+00 18096 8181 -6.28655875378790e-01 18096 8205 -2.16668756254670e-03 18096 8709 -1.81437017932963e-03 18096 8733 -8.88788763992195e-02 18096 8757 -1.52428787926000e-01 18096 8781 -2.16988591599808e-02 18096 9333 -5.56057466610000e-10 18096 9357 -1.39127671343210e-05 18096 9381 -3.16656089837685e-06 18096 18096 7.05170990002137e+00 18096 17232 1.86871600332210e-02 18096 17256 1.50309697388346e-01 18096 17280 3.40173414020684e-01 18096 17304 1.52529157117928e-01 18096 17328 1.92420249656166e-02 18096 17640 1.48520414496435e-01 18096 17664 1.19440735682796e+00 18096 17688 2.70433855902272e+00 18096 17712 1.21838709547178e+00 18096 17736 1.54515349157389e-01 18096 18048 3.32388061491714e-01 18096 18072 2.67230601242575e+00 18096 18120 2.73598085723519e+00 18096 18144 3.48306772694073e-01 18096 18456 1.48226990380707e-01 18096 18480 1.19045675103089e+00 18096 18504 2.69147239990295e+00 18096 18528 1.20974979546800e+00 18096 18552 1.53050251489985e-01 18096 18864 1.86138040042889e-02 18096 18888 1.49322045939077e-01 18096 18912 3.36956874240741e-01 18096 18936 1.50369832116984e-01 18096 18960 1.88757505487656e-02 18097 18097 1.00000000000000e+00 18098 18098 1.00000000000000e+00 18099 18099 1.00000000000000e+00 18100 18100 1.00000000000000e+00 18101 18101 1.00000000000000e+00 18102 18102 1.00000000000000e+00 18103 18103 1.00000000000000e+00 18104 18104 1.00000000000000e+00 18105 18105 1.00000000000000e+00 18106 18106 1.00000000000000e+00 18107 18107 1.00000000000000e+00 18108 18108 1.00000000000000e+00 18109 18109 1.00000000000000e+00 18110 18110 1.00000000000000e+00 18111 18111 1.00000000000000e+00 18112 18112 1.00000000000000e+00 18113 18113 1.00000000000000e+00 18114 18114 1.00000000000000e+00 18115 18115 1.00000000000000e+00 18116 18116 1.00000000000000e+00 18117 18117 1.00000000000000e+00 18118 18118 1.00000000000000e+00 18119 18119 1.00000000000000e+00 18120 6333 -5.12372734049663e-04 18120 6357 -5.60266975200163e-03 18120 6381 -7.57131174518697e-04 18120 6909 -2.75579249208742e-06 18120 6933 -1.05165732007158e-01 18120 6957 -6.59599075902204e-01 18120 6981 -5.44017519973809e-01 18120 7005 -3.57113108533599e-02 18120 7029 -3.89310030356533e-05 18120 7509 -5.17490449004993e-03 18120 7533 -9.24693753917552e-01 18120 7557 -5.80227885164792e+00 18120 7581 -4.28272850225021e+00 18120 7605 -3.57021004769812e-01 18120 7629 -1.25262710500989e-03 18120 8109 -1.27531411453205e-02 18120 8133 -8.34174209426221e-01 18120 8157 -5.60361692656968e+00 18120 8181 -4.15319957528692e+00 18120 8205 -3.62324339704612e-01 18120 8229 -1.74967604472399e-04 18120 8709 -3.88327097074189e-04 18120 8733 -9.43825694898251e-02 18120 8757 -6.27511702787335e-01 18120 8781 -4.52262731923137e-01 18120 8805 -3.00451118904868e-02 18120 9333 -3.01603641067000e-09 18120 9357 -1.61402046852438e-03 18120 9381 -3.60383670497818e-03 18120 9405 -1.54009090715200e-05 18120 18120 7.25784715332243e+00 18120 17256 1.88902643138654e-02 18120 17280 1.52529157117928e-01 18120 17304 3.46520151232723e-01 18120 17328 1.55998049738432e-01 18120 17352 1.97574874689915e-02 18120 17664 1.50081424710553e-01 18120 17688 1.21838709547178e+00 18120 17712 2.77880822339931e+00 18120 17736 1.24398624531149e+00 18120 17760 1.56481212170480e-01 18120 18072 3.35688441614710e-01 18120 18096 2.73598085723519e+00 18120 18144 2.79022848518569e+00 18120 18168 3.49250348602335e-01 18120 18480 1.49387197377013e-01 18120 18504 1.20974979546800e+00 18120 18528 2.75439373133249e+00 18120 18552 1.23701104642261e+00 18120 18576 1.56202510115665e-01 18120 18888 1.87167074804804e-02 18120 18912 1.50369832116984e-01 18120 18936 3.40416528216017e-01 18120 18960 1.54254250016213e-01 18120 18984 1.96878119552877e-02 18121 18121 1.00000000000000e+00 18122 18122 1.00000000000000e+00 18123 18123 1.00000000000000e+00 18124 18124 1.00000000000000e+00 18125 18125 1.00000000000000e+00 18126 18126 1.00000000000000e+00 18127 18127 1.00000000000000e+00 18128 18128 1.00000000000000e+00 18129 18129 1.00000000000000e+00 18130 18130 1.00000000000000e+00 18131 18131 1.00000000000000e+00 18132 18132 1.00000000000000e+00 18133 18133 1.00000000000000e+00 18134 18134 1.00000000000000e+00 18135 18135 1.00000000000000e+00 18136 18136 1.00000000000000e+00 18137 18137 1.00000000000000e+00 18138 18138 1.00000000000000e+00 18139 18139 1.00000000000000e+00 18140 18140 1.00000000000000e+00 18141 18141 1.00000000000000e+00 18142 18142 1.00000000000000e+00 18143 18143 1.00000000000000e+00 18144 6357 -1.96401349981375e-05 18144 6381 -2.31930704160455e-05 18144 6933 -8.00448419937311e-05 18144 6957 -6.23061972031647e-02 18144 6981 -1.98152836711840e-01 18144 7005 -6.10846835017315e-02 18144 7029 -2.50664090970474e-04 18144 7533 -3.16680109148220e-02 18144 7557 -1.33991019064062e+00 18144 7581 -3.82742487958769e+00 18144 7605 -1.44359395821835e+00 18144 7629 -5.66160552656326e-02 18144 7653 -4.73650354579960e-07 18144 8109 -5.34096308434300e-08 18144 8133 -9.77203966759724e-02 18144 8157 -2.69588979393636e+00 18144 8181 -8.67746750985505e+00 18144 8205 -3.07599406256256e+00 18144 8229 -1.19803551127477e-01 18144 8253 -2.45870515439590e-07 18144 8709 -3.49041330603600e-08 18144 8733 -2.17405842911070e-02 18144 8757 -7.65783553595153e-01 18144 8781 -2.14962332383442e+00 18144 8805 -8.56623399539223e-01 18144 8829 -1.87272890764825e-02 18144 9333 -3.72328364354000e-09 18144 9357 -7.75557904544801e-03 18144 9381 -5.64564483220392e-02 18144 9405 -2.11921539795365e-02 18144 9429 -1.46666927100898e-06 18144 18144 7.31846347239759e+00 18144 17280 1.92420249656166e-02 18144 17304 1.55998049738432e-01 18144 17328 3.56434052889101e-01 18144 17352 1.63318863554447e-01 18144 17376 2.10722284196203e-02 18144 17688 1.54515349157389e-01 18144 17712 1.24398624531149e+00 18144 17736 2.82739787882995e+00 18144 17760 1.30265738846123e+00 18144 17784 1.69183134944824e-01 18144 18096 3.48306772694073e-01 18144 18120 2.79022848518569e+00 18144 18168 2.92560588267312e+00 18144 18192 3.82151122065931e-01 18144 18504 1.53050251489985e-01 18144 18528 1.23701104642261e+00 18144 18552 2.82319266893078e+00 18144 18576 1.30841906282308e+00 18144 18600 1.70902255590102e-01 18144 18912 1.88757505487656e-02 18144 18936 1.54254250016213e-01 18144 18960 3.55382750414309e-01 18144 18984 1.64759282144910e-01 18144 19008 2.15020085809397e-02 18145 18145 1.00000000000000e+00 18146 18146 1.00000000000000e+00 18147 18147 1.00000000000000e+00 18148 18148 1.00000000000000e+00 18149 18149 1.00000000000000e+00 18150 18150 1.00000000000000e+00 18151 18151 1.00000000000000e+00 18152 18152 1.00000000000000e+00 18153 18153 1.00000000000000e+00 18154 18154 1.00000000000000e+00 18155 18155 1.00000000000000e+00 18156 18156 1.00000000000000e+00 18157 18157 1.00000000000000e+00 18158 18158 1.00000000000000e+00 18159 18159 1.00000000000000e+00 18160 18160 1.00000000000000e+00 18161 18161 1.00000000000000e+00 18162 18162 1.00000000000000e+00 18163 18163 1.00000000000000e+00 18164 18164 1.00000000000000e+00 18165 18165 1.00000000000000e+00 18166 18166 1.00000000000000e+00 18167 18167 1.00000000000000e+00 18168 6957 -2.02821011824113e-04 18168 6981 -2.18011093323533e-02 18168 7005 -2.01656095848383e-02 18168 7029 -4.18824570894592e-04 18168 7557 -7.39694930109539e-02 18168 7581 -1.01903277723736e+00 18168 7605 -1.58350204718124e+00 18168 7629 -2.97980555261449e-01 18168 7653 -3.81608675529015e-03 18168 8133 -3.60635957870881e-04 18168 8157 -3.95378165876492e-01 18168 8181 -5.27554891058860e+00 18168 8205 -8.08169379493091e+00 18168 8229 -1.41134525042509e+00 18168 8253 -2.38431983512716e-02 18168 8733 -6.52984975638916e-04 18168 8757 -2.32391335660983e-01 18168 8781 -3.17368962354499e+00 18168 8805 -4.74306814100712e+00 18168 8829 -9.34677063180284e-01 18168 8853 -3.81933610700287e-03 18168 9333 -7.91806544230000e-10 18168 9357 -7.59144487802214e-03 18168 9381 -2.16482774683167e-01 18168 9405 -3.40186827062613e-01 18168 9429 -5.10221569510311e-02 18168 9981 -6.01422878122647e-06 18168 10005 -3.69013968260162e-04 18168 10029 -5.18385731630746e-05 18168 18168 7.90139368247109e+00 18168 17304 1.97574874689915e-02 18168 17328 1.63318863554447e-01 18168 17352 3.82946740255845e-01 18168 17376 1.88423305970199e-01 18168 17400 2.60335980729295e-02 18168 17712 1.56481212170480e-01 18168 17736 1.30265738846123e+00 18168 17760 3.06392335696752e+00 18168 17784 1.47878048249848e+00 18168 17808 2.00511985679792e-01 18168 18120 3.49250348602335e-01 18168 18144 2.92560588267312e+00 18168 18192 3.27950601151824e+00 18168 18216 4.37725380813614e-01 18168 18528 1.56202510115665e-01 18168 18552 1.30841906282308e+00 18168 18576 3.09174182969898e+00 18168 18600 1.48802194292692e+00 18168 18624 2.01103230141624e-01 18168 18936 1.96878119552877e-02 18168 18960 1.64759282144910e-01 18168 18984 3.89901358438711e-01 18168 19008 1.90733671077309e-01 18168 19032 2.61814091883874e-02 18169 18169 1.00000000000000e+00 18170 18170 1.00000000000000e+00 18171 18171 1.00000000000000e+00 18172 18172 1.00000000000000e+00 18173 18173 1.00000000000000e+00 18174 18174 1.00000000000000e+00 18175 18175 1.00000000000000e+00 18176 18176 1.00000000000000e+00 18177 18177 1.00000000000000e+00 18178 18178 1.00000000000000e+00 18179 18179 1.00000000000000e+00 18180 18180 1.00000000000000e+00 18181 18181 1.00000000000000e+00 18182 18182 1.00000000000000e+00 18183 18183 1.00000000000000e+00 18184 18184 1.00000000000000e+00 18185 18185 1.00000000000000e+00 18186 18186 1.00000000000000e+00 18187 18187 1.00000000000000e+00 18188 18188 1.00000000000000e+00 18189 18189 1.00000000000000e+00 18190 18190 1.00000000000000e+00 18191 18191 1.00000000000000e+00 18192 6981 -1.91124497901628e-04 18192 7005 -1.67656038496184e-03 18192 7029 -9.54730890178464e-05 18192 7557 -1.44862846263390e-07 18192 7581 -7.41832630423723e-02 18192 7605 -5.02981888970404e-01 18192 7629 -4.22827509282699e-01 18192 7653 -2.05626619650522e-02 18192 7677 -2.33755502357585e-06 18192 8157 -4.83582745070654e-03 18192 8181 -9.86091564195355e-01 18192 8205 -6.06421539807084e+00 18192 8229 -4.32881999660595e+00 18192 8253 -3.02877918444975e-01 18192 8277 -8.96387949988683e-04 18192 8757 -1.85885487822355e-02 18192 8781 -1.24236010428430e+00 18192 8805 -8.10899043378011e+00 18192 8829 -4.91357092063534e+00 18192 8853 -3.17500633505514e-01 18192 8877 -2.63309666699969e-04 18192 9357 -1.50947173666034e-03 18192 9381 -2.21176604075140e-01 18192 9405 -1.23592080630090e+00 18192 9429 -6.38758052884548e-01 18192 9453 -3.69326044520854e-02 18192 9981 -2.73173367878583e-05 18192 10005 -6.49201867337128e-03 18192 10029 -8.98842633280545e-03 18192 10053 -5.18975087942558e-05 18192 18192 8.65632096176568e+00 18192 17328 2.10722284196203e-02 18192 17352 1.88423305970199e-01 18192 17376 4.58342691413079e-01 18192 17400 1.87065967598063e-01 18192 17424 2.07328938265863e-02 18192 17736 1.69183134944824e-01 18192 17760 1.47878048249848e+00 18192 17784 3.51831670951067e+00 18192 17808 1.36581515747559e+00 18192 17832 1.40941803689102e-01 18192 18144 3.82151122065931e-01 18192 18168 3.27950601151824e+00 18192 18216 2.83315650998111e+00 18192 18240 2.70563746681651e-01 18192 18552 1.70902255590102e-01 18192 18576 1.48802194292692e+00 18192 18600 3.51772392353507e+00 18192 18624 1.32109286328215e+00 18192 18648 1.29169985678909e-01 18192 18960 2.15020085809397e-02 18192 18984 1.90733671077309e-01 18192 19008 4.58194494919177e-01 18192 19032 1.75885394049702e-01 18192 19056 1.77899393240382e-02 18193 18193 1.00000000000000e+00 18194 18194 1.00000000000000e+00 18195 18195 1.00000000000000e+00 18196 18196 1.00000000000000e+00 18197 18197 1.00000000000000e+00 18198 18198 1.00000000000000e+00 18199 18199 1.00000000000000e+00 18200 18200 1.00000000000000e+00 18201 18201 1.00000000000000e+00 18202 18202 1.00000000000000e+00 18203 18203 1.00000000000000e+00 18204 18204 1.00000000000000e+00 18205 18205 1.00000000000000e+00 18206 18206 1.00000000000000e+00 18207 18207 1.00000000000000e+00 18208 18208 1.00000000000000e+00 18209 18209 1.00000000000000e+00 18210 18210 1.00000000000000e+00 18211 18211 1.00000000000000e+00 18212 18212 1.00000000000000e+00 18213 18213 1.00000000000000e+00 18214 18214 1.00000000000000e+00 18215 18215 1.00000000000000e+00 18216 7005 -1.54264278491790e-07 18216 7029 -1.33252547496470e-07 18216 7581 -2.19376034812510e-05 18216 7605 -4.73116659948551e-02 18216 7629 -1.30571047099530e-01 18216 7653 -2.67141945964822e-02 18216 7677 -2.89818847393745e-05 18216 8181 -3.18464976229816e-02 18216 8205 -1.25135147236016e+00 18216 8229 -3.15244129814920e+00 18216 8253 -1.88437508933348e+00 18216 8277 -3.98978040899698e-02 18216 8757 -2.87805904174350e-07 18216 8781 -1.45112262225361e-01 18216 8805 -3.00685097530558e+00 18216 8829 -1.24786044584958e+01 18216 8853 -6.80856023493023e+00 18216 8877 -1.77902210357923e-02 18216 9357 -3.20764573755030e-07 18216 9381 -4.82939482475503e-02 18216 9405 -1.13270057768641e+00 18216 9429 -5.50103384768733e+00 18216 9453 -1.73811843761457e+00 18216 9981 -1.90559154330360e-05 18216 10005 -3.65312941816127e-02 18216 10029 -1.51606456257916e-01 18216 10053 -4.00184406382047e-03 18216 18216 9.15595174167010e+00 18216 17352 2.60335980729295e-02 18216 17376 1.87065967598063e-01 18216 17400 4.92735384328554e-01 18216 17424 3.52882545366832e-01 18216 17760 2.00511985679792e-01 18216 17784 1.36581515747559e+00 18216 17808 3.78477955217486e+00 18216 17832 3.22216462969520e+00 18216 18168 4.37725380813614e-01 18216 18192 2.83315650998111e+00 18216 18240 7.86066781462645e+00 18216 18576 2.01103230141624e-01 18216 18600 1.32109286328215e+00 18216 18624 3.44529520645662e+00 18216 18648 2.87162435362045e+00 18216 18984 2.61814091883874e-02 18216 19008 1.75885394049702e-01 18216 19032 4.07864297898995e-01 18216 19056 2.65247476348145e-01 18217 18217 1.00000000000000e+00 18218 18218 1.00000000000000e+00 18219 18219 1.00000000000000e+00 18220 18220 1.00000000000000e+00 18221 18221 1.00000000000000e+00 18222 18222 1.00000000000000e+00 18223 18223 1.00000000000000e+00 18224 18224 1.00000000000000e+00 18225 18225 1.00000000000000e+00 18226 18226 1.00000000000000e+00 18227 18227 1.00000000000000e+00 18228 18228 1.00000000000000e+00 18229 18229 1.00000000000000e+00 18230 18230 1.00000000000000e+00 18231 18231 1.00000000000000e+00 18232 18232 1.00000000000000e+00 18233 18233 1.00000000000000e+00 18234 18234 1.00000000000000e+00 18235 18235 1.00000000000000e+00 18236 18236 1.00000000000000e+00 18237 18237 1.00000000000000e+00 18238 18238 1.00000000000000e+00 18239 18239 1.00000000000000e+00 18240 7605 -7.22152185415600e-05 18240 7629 -1.05376172650654e-02 18240 7653 -8.66206699074860e-03 18240 7677 -4.16008843137181e-05 18240 8205 -4.00258339285658e-02 18240 8229 -1.14051294456305e+00 18240 8253 -2.26850405724519e+00 18240 8277 -7.35208925300189e-02 18240 8781 -2.76167595293292e-04 18240 8805 -3.54401329386665e-01 18240 8829 -1.30472690748129e+01 18240 8853 -1.14939187741039e+01 18240 8877 -3.37372744046849e-02 18240 9381 -9.39185922044185e-04 18240 9405 -4.08749207963311e-01 18240 9429 -7.85719513899032e+00 18240 9453 -3.21770864406453e+00 18240 9981 -3.26042166295239e-06 18240 10005 -3.72128208243907e-02 18240 10029 -2.41641731088433e-01 18240 10053 -7.64040556608115e-03 18240 18240 1.48273894024813e+01 18240 17376 2.07328938265863e-02 18240 17400 3.52882545366832e-01 18240 17424 5.60634833947560e-01 18240 17784 1.40941803689102e-01 18240 17808 3.22216462969520e+00 18240 17832 5.45773663356667e+00 18240 18192 2.70563746681651e-01 18240 18216 7.86066781462645e+00 18240 18600 1.29169985678909e-01 18240 18624 2.87162435362045e+00 18240 18648 4.83905880748852e+00 18240 19008 1.77899393240382e-02 18240 19032 2.65247476348145e-01 18240 19056 4.05965377428023e-01 18241 18241 1.00000000000000e+00 18242 18242 1.00000000000000e+00 18243 18243 1.00000000000000e+00 18244 18244 1.00000000000000e+00 18245 18245 1.00000000000000e+00 18246 18246 1.00000000000000e+00 18247 18247 1.00000000000000e+00 18248 18248 1.00000000000000e+00 18249 18249 1.00000000000000e+00 18250 18250 1.00000000000000e+00 18251 18251 1.00000000000000e+00 18252 18252 1.00000000000000e+00 18253 18253 1.00000000000000e+00 18254 18254 1.00000000000000e+00 18255 18255 1.00000000000000e+00 18256 18256 1.00000000000000e+00 18257 18257 1.00000000000000e+00 18258 18258 1.00000000000000e+00 18259 18259 1.00000000000000e+00 18260 18260 1.00000000000000e+00 18261 18261 1.00000000000000e+00 18262 18262 1.00000000000000e+00 18263 18263 1.00000000000000e+00 18264 4389 -2.25645047563798e-02 18264 4413 -2.35820716352029e-02 18264 4437 -1.63349069221820e-07 18264 4965 -3.62833187129925e-02 18264 4989 -3.34611990479084e+00 18264 5013 -1.71458500707120e+00 18264 5037 -1.03974540170888e-02 18264 5565 -1.95058358179336e+00 18264 5589 -1.31480554177425e+01 18264 5613 -2.47152522189262e+00 18264 5637 -2.24860482368026e-02 18264 6141 -4.04614909029321e-06 18264 6165 -2.73110193042545e+00 18264 6189 -5.21913909453373e+00 18264 6213 -5.13545222136775e-01 18264 6237 -1.52847645058489e-03 18264 6741 -1.40028719608416e-06 18264 6765 -1.24451148894911e-01 18264 6789 -1.37927352900204e-01 18264 6813 -9.34229118965531e-03 18264 7389 -2.84904636177000e-09 18264 7413 -1.07073187650000e-09 18264 18264 9.05430117290731e+00 18264 17448 7.55055809614999e-01 18264 17472 4.45699009410349e-01 18264 17496 1.94774584579571e-02 18264 17856 4.64408474817205e+00 18264 17880 2.84378594303396e+00 18264 17904 1.49069591127980e-01 18264 18288 5.14231724303756e+00 18264 18312 3.18619044738251e-01 18264 18672 4.83905880748844e+00 18264 18696 2.87162435362039e+00 18264 18720 1.29169985678906e-01 18264 19080 8.03799324444096e-01 18264 19104 4.52658612056958e-01 18264 19128 1.45025570956886e-02 18265 18265 1.00000000000000e+00 18266 18266 1.00000000000000e+00 18267 18267 1.00000000000000e+00 18268 18268 1.00000000000000e+00 18269 18269 1.00000000000000e+00 18270 18270 1.00000000000000e+00 18271 18271 1.00000000000000e+00 18272 18272 1.00000000000000e+00 18273 18273 1.00000000000000e+00 18274 18274 1.00000000000000e+00 18275 18275 1.00000000000000e+00 18276 18276 1.00000000000000e+00 18277 18277 1.00000000000000e+00 18278 18278 1.00000000000000e+00 18279 18279 1.00000000000000e+00 18280 18280 1.00000000000000e+00 18281 18281 1.00000000000000e+00 18282 18282 1.00000000000000e+00 18283 18283 1.00000000000000e+00 18284 18284 1.00000000000000e+00 18285 18285 1.00000000000000e+00 18286 18286 1.00000000000000e+00 18287 18287 1.00000000000000e+00 18288 4389 -1.20141728929724e-02 18288 4413 -1.30329133732078e-02 18288 4437 -2.10202261173670e-07 18288 4965 -1.89372668443833e-02 18288 4989 -2.02506210321663e+00 18288 5013 -1.55811480797780e+00 18288 5037 -7.89606507668570e-02 18288 5061 -2.47411633771678e-04 18288 5565 -1.08493774795168e+00 18288 5589 -1.05430018435051e+01 18288 5613 -5.81223872309198e+00 18288 5637 -5.57018387595858e-01 18288 5661 -2.26300359808555e-03 18288 6141 -2.02792477156878e-06 18288 6165 -1.58757384800458e+00 18288 6189 -5.95229647679295e+00 18288 6213 -3.99618407387605e+00 18288 6237 -4.56776305238464e-01 18288 6261 -1.43395025777826e-04 18288 6741 -7.01874925208510e-07 18288 6765 -8.86963956974809e-02 18288 6789 -3.74380593890009e-01 18288 6813 -3.40415392059884e-01 18288 6837 -2.34736856990417e-02 18288 7389 -3.11177468058388e-04 18288 7413 -1.11687003265815e-03 18288 7437 -4.02905087151103e-06 18288 18288 8.49983496383091e+00 18288 17448 4.45699009410349e-01 18288 17472 5.20546693731803e-01 18288 17496 1.77960916292744e-01 18288 17520 2.50127706152287e-02 18288 17856 2.84378594303396e+00 18288 17880 3.71364396652321e+00 18288 17904 1.41538524136978e+00 18288 17928 2.04776719214462e-01 18288 18264 5.14231724303756e+00 18288 18312 3.14651504285880e+00 18288 18336 4.68009715976434e-01 18288 18672 2.87162435362040e+00 18288 18696 3.44529520645654e+00 18288 18720 1.32109286328212e+00 18288 18744 2.01103230141620e-01 18288 19080 4.52658612056958e-01 18288 19104 4.53459503715138e-01 18288 19128 1.54387821770827e-01 18288 19152 2.40943983470182e-02 18289 18289 1.00000000000000e+00 18290 18290 1.00000000000000e+00 18291 18291 1.00000000000000e+00 18292 18292 1.00000000000000e+00 18293 18293 1.00000000000000e+00 18294 18294 1.00000000000000e+00 18295 18295 1.00000000000000e+00 18296 18296 1.00000000000000e+00 18297 18297 1.00000000000000e+00 18298 18298 1.00000000000000e+00 18299 18299 1.00000000000000e+00 18300 18300 1.00000000000000e+00 18301 18301 1.00000000000000e+00 18302 18302 1.00000000000000e+00 18303 18303 1.00000000000000e+00 18304 18304 1.00000000000000e+00 18305 18305 1.00000000000000e+00 18306 18306 1.00000000000000e+00 18307 18307 1.00000000000000e+00 18308 18308 1.00000000000000e+00 18309 18309 1.00000000000000e+00 18310 18310 1.00000000000000e+00 18311 18311 1.00000000000000e+00 18312 4389 -2.09120147080729e-04 18312 4413 -3.54822158744667e-04 18312 4437 -3.67222075893600e-08 18312 4965 -2.27316425110591e-04 18312 4989 -1.03095708974912e-01 18312 5013 -3.92717788799686e-01 18312 5037 -1.67675406492187e-01 18312 5061 -1.78015374464236e-03 18312 5565 -3.13274163014294e-02 18312 5589 -1.62177710123620e+00 18312 5613 -6.10453891104451e+00 18312 5637 -2.35758391105403e+00 18312 5661 -8.64757018219492e-02 18312 5685 -2.45216359375905e-06 18312 6141 -1.38577897776000e-09 18312 6165 -6.49202412504737e-02 18312 6189 -2.61950144724895e+00 18312 6213 -1.02624281112436e+01 18312 6237 -3.59514649502357e+00 18312 6261 -1.28155566331302e-01 18312 6285 -6.50044912846590e-07 18312 6741 -4.94664904690000e-10 18312 6765 -9.12151484469939e-03 18312 6789 -5.76961529729763e-01 18312 6813 -1.72365237570308e+00 18312 6837 -6.46169679302480e-01 18312 6861 -1.37345708174825e-02 18312 7389 -1.64331298995031e-03 18312 7413 -2.33917155530072e-02 18312 7437 -1.06321116976907e-02 18312 7461 -5.74695123481400e-08 18312 18312 9.19275053062581e+00 18312 17448 1.94774584579571e-02 18312 17472 1.77960916292744e-01 18312 17496 4.40402125954314e-01 18312 17520 1.82932433071701e-01 18312 17544 2.07203376526966e-02 18312 17856 1.49069591127980e-01 18312 17880 1.41538524136978e+00 18312 17904 3.59438648349398e+00 18312 17928 1.49466441659605e+00 18312 17952 1.68889384934546e-01 18312 18264 3.18619044738251e-01 18312 18288 3.14651504285880e+00 18312 18336 3.41594298496308e+00 18312 18360 3.85976030264319e-01 18312 18672 1.29169985678906e-01 18312 18696 1.32109286328212e+00 18312 18720 3.51772392353499e+00 18312 18744 1.48802194292691e+00 18312 18768 1.70902255590104e-01 18312 19080 1.45025570956886e-02 18312 19104 1.54387821770827e-01 18312 19128 4.21236485964566e-01 18312 19152 1.81271814654417e-01 18312 19176 2.12235553165861e-02 18313 18313 1.00000000000000e+00 18314 18314 1.00000000000000e+00 18315 18315 1.00000000000000e+00 18316 18316 1.00000000000000e+00 18317 18317 1.00000000000000e+00 18318 18318 1.00000000000000e+00 18319 18319 1.00000000000000e+00 18320 18320 1.00000000000000e+00 18321 18321 1.00000000000000e+00 18322 18322 1.00000000000000e+00 18323 18323 1.00000000000000e+00 18324 18324 1.00000000000000e+00 18325 18325 1.00000000000000e+00 18326 18326 1.00000000000000e+00 18327 18327 1.00000000000000e+00 18328 18328 1.00000000000000e+00 18329 18329 1.00000000000000e+00 18330 18330 1.00000000000000e+00 18331 18331 1.00000000000000e+00 18332 18332 1.00000000000000e+00 18333 18333 1.00000000000000e+00 18334 18334 1.00000000000000e+00 18335 18335 1.00000000000000e+00 18336 4989 -6.79448506998587e-04 18336 5013 -5.38648376009517e-02 18336 5037 -6.27299216796498e-02 18336 5061 -3.43551708160322e-03 18336 5589 -1.31335544505487e-01 18336 5613 -1.72986038849148e+00 18336 5637 -2.39601445015478e+00 18336 5661 -4.30138184579638e-01 18336 5685 -6.01949539313820e-03 18336 6165 -3.99843198830981e-04 18336 6189 -4.68654027442260e-01 18336 6213 -5.86868412923071e+00 18336 6237 -8.66875421797871e+00 18336 6261 -1.40261292381427e+00 18336 6285 -2.14258727932296e-02 18336 6765 -4.19575438955588e-04 18336 6789 -1.82793376238334e-01 18336 6813 -2.40623175819992e+00 18336 6837 -3.42870701505585e+00 18336 6861 -6.56082329760212e-01 18336 6885 -2.38851479682783e-03 18336 7389 -1.90576692073226e-03 18336 7413 -9.55746831137999e-02 18336 7437 -1.58796974729019e-01 18336 7461 -2.25121796792210e-02 18336 8013 -1.32206470670000e-10 18336 8037 -1.27615079143266e-05 18336 8061 -3.09439465411294e-06 18336 18336 7.99757378523735e+00 18336 17472 2.50127706152287e-02 18336 17496 1.82932433071701e-01 18336 17520 3.76117951231702e-01 18336 17544 1.61200463304097e-01 18336 17568 1.95797781733276e-02 18336 17880 2.04776719214462e-01 18336 17904 1.49466441659605e+00 18336 17928 3.06407723868171e+00 18336 17952 1.30383898179604e+00 18336 17976 1.57070360514461e-01 18336 18288 4.68009715976434e-01 18336 18312 3.41594298496308e+00 18336 18360 2.95969446118357e+00 18336 18384 3.53947585031560e-01 18336 18696 2.01103230141620e-01 18336 18720 1.48802194292691e+00 18336 18744 3.09174182969900e+00 18336 18768 1.30841906282309e+00 18336 18792 1.56202510115664e-01 18336 19104 2.40943983470182e-02 18336 19128 1.81271814654417e-01 18336 19152 3.83034098986024e-01 18336 19176 1.62345483560858e-01 18336 19200 1.93628155736283e-02 18337 18337 1.00000000000000e+00 18338 18338 1.00000000000000e+00 18339 18339 1.00000000000000e+00 18340 18340 1.00000000000000e+00 18341 18341 1.00000000000000e+00 18342 18342 1.00000000000000e+00 18343 18343 1.00000000000000e+00 18344 18344 1.00000000000000e+00 18345 18345 1.00000000000000e+00 18346 18346 1.00000000000000e+00 18347 18347 1.00000000000000e+00 18348 18348 1.00000000000000e+00 18349 18349 1.00000000000000e+00 18350 18350 1.00000000000000e+00 18351 18351 1.00000000000000e+00 18352 18352 1.00000000000000e+00 18353 18353 1.00000000000000e+00 18354 18354 1.00000000000000e+00 18355 18355 1.00000000000000e+00 18356 18356 1.00000000000000e+00 18357 18357 1.00000000000000e+00 18358 18358 1.00000000000000e+00 18359 18359 1.00000000000000e+00 18360 5013 -5.47483143415981e-04 18360 5037 -6.31400259870883e-03 18360 5061 -8.94813647991479e-04 18360 5589 -2.39915213309624e-06 18360 5613 -1.17769960030617e-01 18360 5637 -7.15791459635713e-01 18360 5661 -5.70727423507642e-01 18360 5685 -3.76488888679948e-02 18360 5709 -4.34911550910311e-05 18360 6189 -5.50462311142646e-03 18360 6213 -1.02406696179594e+00 18360 6237 -6.07799992998220e+00 18360 6261 -4.40199915461416e+00 18360 6285 -3.62480097222252e-01 18360 6309 -1.33629378071348e-03 18360 6789 -1.36571193791506e-02 18360 6813 -8.81184445223626e-01 18360 6837 -5.69463606063286e+00 18360 6861 -4.18131636633926e+00 18360 6885 -3.63297660228323e-01 18360 6909 -1.88504826688788e-04 18360 7389 -3.98715594254569e-04 18360 7413 -9.45460057249810e-02 18360 7437 -6.27007469647809e-01 18360 7461 -4.46824974409302e-01 18360 7485 -3.01220400623413e-02 18360 8013 -7.06933854300000e-10 18360 8037 -1.49333307771915e-03 18360 8061 -3.48186344649793e-03 18360 8085 -1.69496349620297e-05 18360 18360 7.38973295076644e+00 18360 17496 2.07203376526966e-02 18360 17520 1.61200463304097e-01 18360 17544 3.53193527318903e-01 18360 17568 1.55106068265170e-01 18360 17592 1.91967388929650e-02 18360 17904 1.68889384934546e-01 18360 17928 1.30383898179604e+00 18360 17952 2.83430511093290e+00 18360 17976 1.23744127312555e+00 18360 18000 1.52289957766922e-01 18360 18312 3.85976030264319e-01 18360 18336 2.95969446118357e+00 18360 18384 2.77817258011406e+00 18360 18408 3.40595559996942e-01 18360 18720 1.70902255590104e-01 18360 18744 1.30841906282309e+00 18360 18768 2.82319266893077e+00 18360 18792 1.23701104642260e+00 18360 18816 1.53050251489982e-01 18360 19128 2.12235553165861e-02 18360 19152 1.62345483560858e-01 18360 19176 3.50415416818369e-01 18360 19200 1.54998511589434e-01 18360 19224 1.93868123237301e-02 18361 18361 1.00000000000000e+00 18362 18362 1.00000000000000e+00 18363 18363 1.00000000000000e+00 18364 18364 1.00000000000000e+00 18365 18365 1.00000000000000e+00 18366 18366 1.00000000000000e+00 18367 18367 1.00000000000000e+00 18368 18368 1.00000000000000e+00 18369 18369 1.00000000000000e+00 18370 18370 1.00000000000000e+00 18371 18371 1.00000000000000e+00 18372 18372 1.00000000000000e+00 18373 18373 1.00000000000000e+00 18374 18374 1.00000000000000e+00 18375 18375 1.00000000000000e+00 18376 18376 1.00000000000000e+00 18377 18377 1.00000000000000e+00 18378 18378 1.00000000000000e+00 18379 18379 1.00000000000000e+00 18380 18380 1.00000000000000e+00 18381 18381 1.00000000000000e+00 18382 18382 1.00000000000000e+00 18383 18383 1.00000000000000e+00 18384 5037 -2.12273103108980e-05 18384 5061 -2.60766096089580e-05 18384 5613 -7.21993790366338e-05 18384 5637 -6.29703485864395e-02 18384 5661 -2.00674644131226e-01 18384 5685 -6.19881299017583e-02 18384 5709 -2.69100304160322e-04 18384 6213 -3.06819938875630e-02 18384 6237 -1.33485408307054e+00 18384 6261 -3.78016253433073e+00 18384 6285 -1.41063348630125e+00 18384 6309 -5.29520423692181e-02 18384 6333 -6.46536115564740e-07 18384 6789 -2.67149432083500e-08 18384 6813 -9.59646298107557e-02 18384 6837 -2.63136498869216e+00 18384 6861 -8.39721704319996e+00 18384 6885 -2.89436506660370e+00 18384 6909 -1.10295881093751e-01 18384 6933 -3.35135530715780e-07 18384 7389 -1.74352105968200e-08 18384 7413 -2.10748455066421e-02 18384 7437 -7.35882102626040e-01 18384 7461 -2.02056147413531e+00 18384 7485 -7.69802226468799e-01 18384 7509 -1.73529761959176e-02 18384 8013 -8.44638357170000e-10 18384 8037 -6.99137529405206e-03 18384 8061 -4.94282254897322e-02 18384 8085 -1.84595574985236e-02 18384 8109 -1.64776284888537e-06 18384 18384 7.14026111656753e+00 18384 17520 1.95797781733276e-02 18384 17544 1.55106068265170e-01 18384 17568 3.45414760493988e-01 18384 17592 1.51535595704744e-01 18384 17616 1.86871600332211e-02 18384 17928 1.57070360514461e-01 18384 17952 1.23744127312555e+00 18384 17976 2.74332515484007e+00 18384 18000 1.20762171128692e+00 18384 18024 1.49615470054805e-01 18384 18336 3.53947585031560e-01 18384 18360 2.77817258011406e+00 18384 18408 2.70952052632653e+00 18384 18432 3.36784571584677e-01 18384 18744 1.56202510115664e-01 18384 18768 1.23701104642260e+00 18384 18792 2.75439373133245e+00 18384 18816 1.20974979546800e+00 18384 18840 1.49387197377013e-01 18384 19152 1.93628155736283e-02 18384 19176 1.54998511589434e-01 18384 19200 3.48181904617084e-01 18384 19224 1.52067616750013e-01 18384 19248 1.86300918637732e-02 18385 18385 1.00000000000000e+00 18386 18386 1.00000000000000e+00 18387 18387 1.00000000000000e+00 18388 18388 1.00000000000000e+00 18389 18389 1.00000000000000e+00 18390 18390 1.00000000000000e+00 18391 18391 1.00000000000000e+00 18392 18392 1.00000000000000e+00 18393 18393 1.00000000000000e+00 18394 18394 1.00000000000000e+00 18395 18395 1.00000000000000e+00 18396 18396 1.00000000000000e+00 18397 18397 1.00000000000000e+00 18398 18398 1.00000000000000e+00 18399 18399 1.00000000000000e+00 18400 18400 1.00000000000000e+00 18401 18401 1.00000000000000e+00 18402 18402 1.00000000000000e+00 18403 18403 1.00000000000000e+00 18404 18404 1.00000000000000e+00 18405 18405 1.00000000000000e+00 18406 18406 1.00000000000000e+00 18407 18407 1.00000000000000e+00 18408 5637 -1.83814698169986e-04 18408 5661 -2.12466860893379e-02 18408 5685 -1.97985618629703e-02 18408 5709 -4.24155580695297e-04 18408 6237 -7.01592677812315e-02 18408 6261 -9.64335460689663e-01 18408 6285 -1.43848699559362e+00 18408 6309 -2.57273709859606e-01 18408 6333 -2.89134898941355e-03 18408 6813 -3.19949948932858e-04 18408 6837 -3.73523759437001e-01 18408 6861 -4.76234705419661e+00 18408 6885 -7.08479211929128e+00 18408 6909 -1.14383406827339e+00 18408 6933 -1.79537556714428e-02 18408 7413 -5.78508518996021e-04 18408 7437 -2.12078387164958e-01 18408 7461 -2.74137618073184e+00 18408 7485 -3.94652603057977e+00 18408 7509 -7.34647396722989e-01 18408 7533 -3.03185917096303e-03 18408 8013 -1.78107971630000e-10 18408 8037 -6.28028490483819e-03 18408 8061 -1.75776519637661e-01 18408 8085 -2.53821298188303e-01 18408 8109 -3.79318522441511e-02 18408 8661 -3.38983153372562e-06 18408 8685 -2.44302264716898e-04 18408 8709 -3.67018070179622e-05 18408 18408 7.06385545660238e+00 18408 17544 1.91967388929650e-02 18408 17568 1.51535595704744e-01 18408 17592 3.36634243015390e-01 18408 17616 1.48520414496436e-01 18408 17640 1.84429435908879e-02 18408 17952 1.52289957766922e-01 18408 17976 1.20762171128692e+00 18408 18000 2.69436446902456e+00 18408 18024 1.19136984174206e+00 18408 18048 1.48226990380706e-01 18408 18360 3.40595559996942e-01 18408 18384 2.70952052632653e+00 18408 18432 2.68596529134033e+00 18408 18456 3.34706751250393e-01 18408 18768 1.53050251489982e-01 18408 18792 1.20974979546800e+00 18408 18816 2.69147239990296e+00 18408 18840 1.19045675103089e+00 18408 18864 1.48226990380706e-01 18408 19176 1.93868123237301e-02 18408 19200 1.52067616750013e-01 18408 19224 3.35911225734989e-01 18408 19248 1.48292141818645e-01 18408 19272 1.84429435908880e-02 18409 18409 1.00000000000000e+00 18410 18410 1.00000000000000e+00 18411 18411 1.00000000000000e+00 18412 18412 1.00000000000000e+00 18413 18413 1.00000000000000e+00 18414 18414 1.00000000000000e+00 18415 18415 1.00000000000000e+00 18416 18416 1.00000000000000e+00 18417 18417 1.00000000000000e+00 18418 18418 1.00000000000000e+00 18419 18419 1.00000000000000e+00 18420 18420 1.00000000000000e+00 18421 18421 1.00000000000000e+00 18422 18422 1.00000000000000e+00 18423 18423 1.00000000000000e+00 18424 18424 1.00000000000000e+00 18425 18425 1.00000000000000e+00 18426 18426 1.00000000000000e+00 18427 18427 1.00000000000000e+00 18428 18428 1.00000000000000e+00 18429 18429 1.00000000000000e+00 18430 18430 1.00000000000000e+00 18431 18431 1.00000000000000e+00 18432 5661 -1.66168765949973e-04 18432 5685 -1.54822597046122e-03 18432 5709 -9.56224454740982e-05 18432 6237 -7.48855361421700e-08 18432 6261 -6.46742273828283e-02 18432 6285 -4.15890163972256e-01 18432 6309 -3.18730314473021e-01 18432 6333 -1.65572343303867e-02 18432 6357 -2.69057086099650e-06 18432 6837 -3.92424215915944e-03 18432 6861 -8.36607401537234e-01 18432 6885 -4.81535243342509e+00 18432 6909 -3.42674317775809e+00 18432 6933 -2.74213120676922e-01 18432 6957 -8.90212526518244e-04 18432 7437 -1.52511482932409e-02 18432 7461 -9.74542059803753e-01 18432 7485 -6.27649976772458e+00 18432 7509 -4.42023205069236e+00 18432 7533 -3.62722235630272e-01 18432 7557 -2.61608722558182e-04 18432 8037 -1.21000740674983e-03 18432 8061 -1.56910533252355e-01 18432 8085 -9.41744134857352e-01 18432 8109 -6.46991543310090e-01 18432 8133 -4.61905750663570e-02 18432 8661 -1.62498969958991e-05 18432 8685 -5.97874547333376e-03 18432 8709 -9.23046608098434e-03 18432 8733 -5.94104233255175e-05 18432 18432 7.02057532771950e+00 18432 17568 1.86871600332211e-02 18432 17592 1.48520414496436e-01 18432 17616 3.32388061491717e-01 18432 17640 1.48226990380707e-01 18432 17664 1.86138040042888e-02 18432 17976 1.49615470054805e-01 18432 18000 1.19136984174206e+00 18432 18024 2.66851631419325e+00 18432 18048 1.18198395371121e+00 18432 18072 1.47268998047092e-01 18432 18384 3.36784571584677e-01 18432 18408 2.68596529134033e+00 18432 18456 2.65275794951493e+00 18432 18480 3.28482736128326e-01 18432 18792 1.49387197377013e-01 18432 18816 1.19045675103089e+00 18432 18840 2.66828804151546e+00 18432 18864 1.18198395371122e+00 18432 18888 1.47268998047095e-01 18432 19200 1.86300918637732e-02 18432 19224 1.48292141818645e-01 18432 19248 3.32330993322271e-01 18432 19272 1.48226990380710e-01 18432 19296 1.86138040042894e-02 18433 18433 1.00000000000000e+00 18434 18434 1.00000000000000e+00 18435 18435 1.00000000000000e+00 18436 18436 1.00000000000000e+00 18437 18437 1.00000000000000e+00 18438 18438 1.00000000000000e+00 18439 18439 1.00000000000000e+00 18440 18440 1.00000000000000e+00 18441 18441 1.00000000000000e+00 18442 18442 1.00000000000000e+00 18443 18443 1.00000000000000e+00 18444 18444 1.00000000000000e+00 18445 18445 1.00000000000000e+00 18446 18446 1.00000000000000e+00 18447 18447 1.00000000000000e+00 18448 18448 1.00000000000000e+00 18449 18449 1.00000000000000e+00 18450 18450 1.00000000000000e+00 18451 18451 1.00000000000000e+00 18452 18452 1.00000000000000e+00 18453 18453 1.00000000000000e+00 18454 18454 1.00000000000000e+00 18455 18455 1.00000000000000e+00 18456 5685 -1.35451214863840e-07 18456 5709 -1.21690419475120e-07 18456 6261 -1.41521149777115e-05 18456 6285 -3.36791333816439e-02 18456 6309 -1.01881284312103e-01 18456 6333 -2.31392107675321e-02 18456 6357 -1.41521149777116e-05 18456 6861 -2.31392107675319e-02 18456 6885 -1.00780222794440e+00 18456 6909 -2.72455878059633e+00 18456 6933 -1.00780222794441e+00 18456 6957 -3.36791333816436e-02 18456 6981 -1.35451214863830e-07 18456 7437 -1.21690419475120e-07 18456 7461 -1.01881284312103e-01 18456 7485 -2.72455878059634e+00 18456 7509 -8.29821941083528e+00 18456 7533 -2.72455878059634e+00 18456 7557 -1.01881284312102e-01 18456 7581 -1.21690419475120e-07 18456 8037 -1.35451214863840e-07 18456 8061 -3.36791333816442e-02 18456 8085 -1.00780222794443e+00 18456 8109 -2.72455878059637e+00 18456 8133 -1.00780222794441e+00 18456 8157 -2.31392107675323e-02 18456 8661 -1.41521149777120e-05 18456 8685 -2.31392107675328e-02 18456 8709 -1.01881284312104e-01 18456 8733 -3.36791333816438e-02 18456 8757 -1.41521149777116e-05 18456 9309 -1.21690419475120e-07 18456 9333 -1.35451214863830e-07 18456 18456 6.92513728055421e+00 18456 17592 1.84429435908879e-02 18456 17616 1.48226990380707e-01 18456 17640 3.34706751250396e-01 18456 17664 1.48226990380706e-01 18456 17688 1.84429435908877e-02 18456 18000 1.48226990380706e-01 18456 18024 1.18198395371120e+00 18456 18048 2.65275794951494e+00 18456 18072 1.18198395371121e+00 18456 18096 1.48226990380707e-01 18456 18408 3.34706751250393e-01 18456 18432 2.65275794951493e+00 18456 18480 2.65275794951495e+00 18456 18504 3.34706751250399e-01 18456 18816 1.48226990380706e-01 18456 18840 1.18198395371122e+00 18456 18864 2.65275794951498e+00 18456 18888 1.18198395371122e+00 18456 18912 1.48226990380707e-01 18456 19224 1.84429435908880e-02 18456 19248 1.48226990380710e-01 18456 19272 3.34706751250407e-01 18456 19296 1.48226990380709e-01 18456 19320 1.84429435908878e-02 18457 18457 1.00000000000000e+00 18458 18458 1.00000000000000e+00 18459 18459 1.00000000000000e+00 18460 18460 1.00000000000000e+00 18461 18461 1.00000000000000e+00 18462 18462 1.00000000000000e+00 18463 18463 1.00000000000000e+00 18464 18464 1.00000000000000e+00 18465 18465 1.00000000000000e+00 18466 18466 1.00000000000000e+00 18467 18467 1.00000000000000e+00 18468 18468 1.00000000000000e+00 18469 18469 1.00000000000000e+00 18470 18470 1.00000000000000e+00 18471 18471 1.00000000000000e+00 18472 18472 1.00000000000000e+00 18473 18473 1.00000000000000e+00 18474 18474 1.00000000000000e+00 18475 18475 1.00000000000000e+00 18476 18476 1.00000000000000e+00 18477 18477 1.00000000000000e+00 18478 18478 1.00000000000000e+00 18479 18479 1.00000000000000e+00 18480 6285 -5.94104233255154e-05 18480 6309 -9.23046608098402e-03 18480 6333 -5.97874547333357e-03 18480 6357 -1.62498969958988e-05 18480 6885 -4.61905750663568e-02 18480 6909 -6.46991543310082e-01 18480 6933 -9.41744134857338e-01 18480 6957 -1.56910533252352e-01 18480 6981 -1.21000740674980e-03 18480 7461 -2.61608722558192e-04 18480 7485 -3.62722235630275e-01 18480 7509 -4.42023205069251e+00 18480 7533 -6.27649976772464e+00 18480 7557 -9.74542059803748e-01 18480 7581 -1.52511482932406e-02 18480 8061 -8.90212526518275e-04 18480 8085 -2.74213120676928e-01 18480 8109 -3.42674317775812e+00 18480 8133 -4.81535243342516e+00 18480 8157 -8.36607401537243e-01 18480 8181 -3.92424215915939e-03 18480 8661 -2.69057086099659e-06 18480 8685 -1.65572343303868e-02 18480 8709 -3.18730314473020e-01 18480 8733 -4.15890163972259e-01 18480 8757 -6.46742273828293e-02 18480 8781 -7.48855361421800e-08 18480 9309 -9.56224454740996e-05 18480 9333 -1.54822597046124e-03 18480 9357 -1.66168765949975e-04 18480 18480 7.02057532771960e+00 18480 17616 1.86138040042888e-02 18480 17640 1.48226990380706e-01 18480 17664 3.32330993322265e-01 18480 17688 1.48292141818642e-01 18480 17712 1.86300918637728e-02 18480 18024 1.47268998047092e-01 18480 18048 1.18198395371121e+00 18480 18072 2.66828804151546e+00 18480 18096 1.19045675103089e+00 18480 18120 1.49387197377013e-01 18480 18432 3.28482736128326e-01 18480 18456 2.65275794951495e+00 18480 18504 2.68596529134037e+00 18480 18528 3.36784571584681e-01 18480 18840 1.47268998047095e-01 18480 18864 1.18198395371122e+00 18480 18888 2.66851631419327e+00 18480 18912 1.19136984174207e+00 18480 18936 1.49615470054807e-01 18480 19248 1.86138040042894e-02 18480 19272 1.48226990380709e-01 18480 19296 3.32388061491716e-01 18480 19320 1.48520414496437e-01 18480 19344 1.86871600332214e-02 18481 18481 1.00000000000000e+00 18482 18482 1.00000000000000e+00 18483 18483 1.00000000000000e+00 18484 18484 1.00000000000000e+00 18485 18485 1.00000000000000e+00 18486 18486 1.00000000000000e+00 18487 18487 1.00000000000000e+00 18488 18488 1.00000000000000e+00 18489 18489 1.00000000000000e+00 18490 18490 1.00000000000000e+00 18491 18491 1.00000000000000e+00 18492 18492 1.00000000000000e+00 18493 18493 1.00000000000000e+00 18494 18494 1.00000000000000e+00 18495 18495 1.00000000000000e+00 18496 18496 1.00000000000000e+00 18497 18497 1.00000000000000e+00 18498 18498 1.00000000000000e+00 18499 18499 1.00000000000000e+00 18500 18500 1.00000000000000e+00 18501 18501 1.00000000000000e+00 18502 18502 1.00000000000000e+00 18503 18503 1.00000000000000e+00 18504 6309 -3.67018070179616e-05 18504 6333 -2.44302264716894e-04 18504 6357 -3.38983153372556e-06 18504 6909 -3.79318522441511e-02 18504 6933 -2.53821298188300e-01 18504 6957 -1.75776519637657e-01 18504 6981 -6.28028490483812e-03 18504 7005 -1.78107971630000e-10 18504 7485 -3.03185917096305e-03 18504 7509 -7.34647396723027e-01 18504 7533 -3.94652603057980e+00 18504 7557 -2.74137618073184e+00 18504 7581 -2.12078387164960e-01 18504 7605 -5.78508518996036e-04 18504 8085 -1.79537556714427e-02 18504 8109 -1.14383406827340e+00 18504 8133 -7.08479211929137e+00 18504 8157 -4.76234705419666e+00 18504 8181 -3.73523759436999e-01 18504 8205 -3.19949948932867e-04 18504 8685 -2.89134898941353e-03 18504 8709 -2.57273709859609e-01 18504 8733 -1.43848699559364e+00 18504 8757 -9.64335460689672e-01 18504 8781 -7.01592677812320e-02 18504 9309 -4.24155580695303e-04 18504 9333 -1.97985618629705e-02 18504 9357 -2.12466860893382e-02 18504 9381 -1.83814698169988e-04 18504 18504 7.06385545660245e+00 18504 17640 1.84429435908877e-02 18504 17664 1.48292141818642e-01 18504 17688 3.35911225734983e-01 18504 17712 1.52067616750014e-01 18504 17736 1.93868123237306e-02 18504 18048 1.48226990380707e-01 18504 18072 1.19045675103089e+00 18504 18096 2.69147239990295e+00 18504 18120 1.20974979546800e+00 18504 18144 1.53050251489985e-01 18504 18456 3.34706751250399e-01 18504 18480 2.68596529134037e+00 18504 18528 2.70952052632656e+00 18504 18552 3.40595559996945e-01 18504 18864 1.48226990380707e-01 18504 18888 1.19136984174207e+00 18504 18912 2.69436446902460e+00 18504 18936 1.20762171128693e+00 18504 18960 1.52289957766923e-01 18504 19272 1.84429435908878e-02 18504 19296 1.48520414496437e-01 18504 19320 3.36634243015395e-01 18504 19344 1.51535595704746e-01 18504 19368 1.91967388929652e-02 18505 18505 1.00000000000000e+00 18506 18506 1.00000000000000e+00 18507 18507 1.00000000000000e+00 18508 18508 1.00000000000000e+00 18509 18509 1.00000000000000e+00 18510 18510 1.00000000000000e+00 18511 18511 1.00000000000000e+00 18512 18512 1.00000000000000e+00 18513 18513 1.00000000000000e+00 18514 18514 1.00000000000000e+00 18515 18515 1.00000000000000e+00 18516 18516 1.00000000000000e+00 18517 18517 1.00000000000000e+00 18518 18518 1.00000000000000e+00 18519 18519 1.00000000000000e+00 18520 18520 1.00000000000000e+00 18521 18521 1.00000000000000e+00 18522 18522 1.00000000000000e+00 18523 18523 1.00000000000000e+00 18524 18524 1.00000000000000e+00 18525 18525 1.00000000000000e+00 18526 18526 1.00000000000000e+00 18527 18527 1.00000000000000e+00 18528 6909 -1.64776284888537e-06 18528 6933 -1.84595574985232e-02 18528 6957 -4.94282254897317e-02 18528 6981 -6.99137529405218e-03 18528 7005 -8.44638357170000e-10 18528 7509 -1.73529761959179e-02 18528 7533 -7.69802226468803e-01 18528 7557 -2.02056147413533e+00 18528 7581 -7.35882102626055e-01 18528 7605 -2.10748455066424e-02 18528 7629 -1.74352105968200e-08 18528 8085 -3.35135530715790e-07 18528 8109 -1.10295881093752e-01 18528 8133 -2.89436506660373e+00 18528 8157 -8.39721704320003e+00 18528 8181 -2.63136498869216e+00 18528 8205 -9.59646298107564e-02 18528 8229 -2.67149432083500e-08 18528 8685 -6.46536115564750e-07 18528 8709 -5.29520423692189e-02 18528 8733 -1.41063348630127e+00 18528 8757 -3.78016253433076e+00 18528 8781 -1.33485408307054e+00 18528 8805 -3.06819938875630e-02 18528 9309 -2.69100304160325e-04 18528 9333 -6.19881299017590e-02 18528 9357 -2.00674644131229e-01 18528 9381 -6.29703485864404e-02 18528 9405 -7.21993790366340e-05 18528 9957 -2.60766096089586e-05 18528 9981 -2.12273103108984e-05 18528 18528 7.14026111656758e+00 18528 17664 1.86300918637728e-02 18528 17688 1.52067616750014e-01 18528 17712 3.48181904617092e-01 18528 17736 1.54998511589437e-01 18528 17760 1.93628155736285e-02 18528 18072 1.49387197377013e-01 18528 18096 1.20974979546800e+00 18528 18120 2.75439373133249e+00 18528 18144 1.23701104642261e+00 18528 18168 1.56202510115665e-01 18528 18480 3.36784571584681e-01 18528 18504 2.70952052632656e+00 18528 18552 2.77817258011408e+00 18528 18576 3.53947585031560e-01 18528 18888 1.49615470054807e-01 18528 18912 1.20762171128693e+00 18528 18936 2.74332515484009e+00 18528 18960 1.23744127312556e+00 18528 18984 1.57070360514463e-01 18528 19296 1.86871600332214e-02 18528 19320 1.51535595704746e-01 18528 19344 3.45414760493992e-01 18528 19368 1.55106068265173e-01 18528 19392 1.95797781733280e-02 18529 18529 1.00000000000000e+00 18530 18530 1.00000000000000e+00 18531 18531 1.00000000000000e+00 18532 18532 1.00000000000000e+00 18533 18533 1.00000000000000e+00 18534 18534 1.00000000000000e+00 18535 18535 1.00000000000000e+00 18536 18536 1.00000000000000e+00 18537 18537 1.00000000000000e+00 18538 18538 1.00000000000000e+00 18539 18539 1.00000000000000e+00 18540 18540 1.00000000000000e+00 18541 18541 1.00000000000000e+00 18542 18542 1.00000000000000e+00 18543 18543 1.00000000000000e+00 18544 18544 1.00000000000000e+00 18545 18545 1.00000000000000e+00 18546 18546 1.00000000000000e+00 18547 18547 1.00000000000000e+00 18548 18548 1.00000000000000e+00 18549 18549 1.00000000000000e+00 18550 18550 1.00000000000000e+00 18551 18551 1.00000000000000e+00 18552 6933 -1.69496349620302e-05 18552 6957 -3.48186344649802e-03 18552 6981 -1.49333307771918e-03 18552 7005 -7.06933854300000e-10 18552 7533 -3.01220400623416e-02 18552 7557 -4.46824974409309e-01 18552 7581 -6.27007469647816e-01 18552 7605 -9.45460057249813e-02 18552 7629 -3.98715594254561e-04 18552 8109 -1.88504826688790e-04 18552 8133 -3.63297660228326e-01 18552 8157 -4.18131636633928e+00 18552 8181 -5.69463606063287e+00 18552 8205 -8.81184445223622e-01 18552 8229 -1.36571193791504e-02 18552 8709 -1.33629378071350e-03 18552 8733 -3.62480097222256e-01 18552 8757 -4.40199915461420e+00 18552 8781 -6.07799992998221e+00 18552 8805 -1.02406696179593e+00 18552 8829 -5.50462311142637e-03 18552 9309 -4.34911550910315e-05 18552 9333 -3.76488888679954e-02 18552 9357 -5.70727423507654e-01 18552 9381 -7.15791459635722e-01 18552 9405 -1.17769960030618e-01 18552 9429 -2.39915213309623e-06 18552 9957 -8.94813647991517e-04 18552 9981 -6.31400259870912e-03 18552 10005 -5.47483143416006e-04 18552 18552 7.38973295076645e+00 18552 17688 1.93868123237306e-02 18552 17712 1.54998511589437e-01 18552 17736 3.50415416818372e-01 18552 17760 1.62345483560857e-01 18552 17784 2.12235553165857e-02 18552 18096 1.53050251489985e-01 18552 18120 1.23701104642261e+00 18552 18144 2.82319266893078e+00 18552 18168 1.30841906282308e+00 18552 18192 1.70902255590102e-01 18552 18504 3.40595559996945e-01 18552 18528 2.77817258011408e+00 18552 18576 2.95969446118357e+00 18552 18600 3.85976030264319e-01 18552 18912 1.52289957766923e-01 18552 18936 1.23744127312556e+00 18552 18960 2.83430511093293e+00 18552 18984 1.30383898179606e+00 18552 19008 1.68889384934549e-01 18552 19320 1.91967388929652e-02 18552 19344 1.55106068265173e-01 18552 19368 3.53193527318910e-01 18552 19392 1.61200463304102e-01 18552 19416 2.07203376526976e-02 18553 18553 1.00000000000000e+00 18554 18554 1.00000000000000e+00 18555 18555 1.00000000000000e+00 18556 18556 1.00000000000000e+00 18557 18557 1.00000000000000e+00 18558 18558 1.00000000000000e+00 18559 18559 1.00000000000000e+00 18560 18560 1.00000000000000e+00 18561 18561 1.00000000000000e+00 18562 18562 1.00000000000000e+00 18563 18563 1.00000000000000e+00 18564 18564 1.00000000000000e+00 18565 18565 1.00000000000000e+00 18566 18566 1.00000000000000e+00 18567 18567 1.00000000000000e+00 18568 18568 1.00000000000000e+00 18569 18569 1.00000000000000e+00 18570 18570 1.00000000000000e+00 18571 18571 1.00000000000000e+00 18572 18572 1.00000000000000e+00 18573 18573 1.00000000000000e+00 18574 18574 1.00000000000000e+00 18575 18575 1.00000000000000e+00 18576 6957 -3.09439465411297e-06 18576 6981 -1.27615079143267e-05 18576 7005 -1.32206470670000e-10 18576 7557 -2.25121796792212e-02 18576 7581 -1.58796974729020e-01 18576 7605 -9.55746831137985e-02 18576 7629 -1.90576692073224e-03 18576 8133 -2.38851479682785e-03 18576 8157 -6.56082329760212e-01 18576 8181 -3.42870701505584e+00 18576 8205 -2.40623175819990e+00 18576 8229 -1.82793376238335e-01 18576 8253 -4.19575438955593e-04 18576 8733 -2.14258727932300e-02 18576 8757 -1.40261292381429e+00 18576 8781 -8.66875421797874e+00 18576 8805 -5.86868412923072e+00 18576 8829 -4.68654027442270e-01 18576 8853 -3.99843198830987e-04 18576 9333 -6.01949539313832e-03 18576 9357 -4.30138184579653e-01 18576 9381 -2.39601445015481e+00 18576 9405 -1.72986038849152e+00 18576 9429 -1.31335544505490e-01 18576 9957 -3.43551708160337e-03 18576 9981 -6.27299216796516e-02 18576 10005 -5.38648376009527e-02 18576 10029 -6.79448506998601e-04 18576 18576 7.99757378523735e+00 18576 17712 1.93628155736285e-02 18576 17736 1.62345483560857e-01 18576 17760 3.83034098986018e-01 18576 17784 1.81271814654417e-01 18576 17808 2.40943983470185e-02 18576 18120 1.56202510115665e-01 18576 18144 1.30841906282308e+00 18576 18168 3.09174182969898e+00 18576 18192 1.48802194292692e+00 18576 18216 2.01103230141624e-01 18576 18528 3.53947585031560e-01 18576 18552 2.95969446118357e+00 18576 18600 3.41594298496313e+00 18576 18624 4.68009715976447e-01 18576 18936 1.57070360514463e-01 18576 18960 1.30383898179606e+00 18576 18984 3.06407723868178e+00 18576 19008 1.49466441659608e+00 18576 19032 2.04776719214466e-01 18576 19344 1.95797781733280e-02 18576 19368 1.61200463304102e-01 18576 19392 3.76117951231718e-01 18576 19416 1.82932433071707e-01 18576 19440 2.50127706152292e-02 18577 18577 1.00000000000000e+00 18578 18578 1.00000000000000e+00 18579 18579 1.00000000000000e+00 18580 18580 1.00000000000000e+00 18581 18581 1.00000000000000e+00 18582 18582 1.00000000000000e+00 18583 18583 1.00000000000000e+00 18584 18584 1.00000000000000e+00 18585 18585 1.00000000000000e+00 18586 18586 1.00000000000000e+00 18587 18587 1.00000000000000e+00 18588 18588 1.00000000000000e+00 18589 18589 1.00000000000000e+00 18590 18590 1.00000000000000e+00 18591 18591 1.00000000000000e+00 18592 18592 1.00000000000000e+00 18593 18593 1.00000000000000e+00 18594 18594 1.00000000000000e+00 18595 18595 1.00000000000000e+00 18596 18596 1.00000000000000e+00 18597 18597 1.00000000000000e+00 18598 18598 1.00000000000000e+00 18599 18599 1.00000000000000e+00 18600 7557 -5.74695123481400e-08 18600 7581 -1.06321116976905e-02 18600 7605 -2.33917155530069e-02 18600 7629 -1.64331298995032e-03 18600 8157 -1.37345708174825e-02 18600 8181 -6.46169679302478e-01 18600 8205 -1.72365237570309e+00 18600 8229 -5.76961529729772e-01 18600 8253 -9.12151484469968e-03 18600 8277 -4.94664904690000e-10 18600 8733 -6.50044912846620e-07 18600 8757 -1.28155566331304e-01 18600 8781 -3.59514649502362e+00 18600 8805 -1.02624281112438e+01 18600 8829 -2.61950144724901e+00 18600 8853 -6.49202412504758e-02 18600 8877 -1.38577897776000e-09 18600 9333 -2.45216359375916e-06 18600 9357 -8.64757018219526e-02 18600 9381 -2.35758391105408e+00 18600 9405 -6.10453891104466e+00 18600 9429 -1.62177710123623e+00 18600 9453 -3.13274163014302e-02 18600 9957 -1.78015374464241e-03 18600 9981 -1.67675406492190e-01 18600 10005 -3.92717788799691e-01 18600 10029 -1.03095708974913e-01 18600 10053 -2.27316425110596e-04 18600 10581 -3.67222075893600e-08 18600 10605 -3.54822158744668e-04 18600 10629 -2.09120147080730e-04 18600 18600 9.19275053062602e+00 18600 17736 2.12235553165857e-02 18600 17760 1.81271814654417e-01 18600 17784 4.21236485964572e-01 18600 17808 1.54387821770831e-01 18600 17832 1.45025570956891e-02 18600 18144 1.70902255590102e-01 18600 18168 1.48802194292692e+00 18600 18192 3.51772392353507e+00 18600 18216 1.32109286328215e+00 18600 18240 1.29169985678909e-01 18600 18552 3.85976030264319e-01 18600 18576 3.41594298496313e+00 18600 18624 3.14651504285888e+00 18600 18648 3.18619044738257e-01 18600 18960 1.68889384934549e-01 18600 18984 1.49466441659608e+00 18600 19008 3.59438648349407e+00 18600 19032 1.41538524136981e+00 18600 19056 1.49069591127982e-01 18600 19368 2.07203376526976e-02 18600 19392 1.82932433071707e-01 18600 19416 4.40402125954322e-01 18600 19440 1.77960916292746e-01 18600 19464 1.94774584579572e-02 18601 18601 1.00000000000000e+00 18602 18602 1.00000000000000e+00 18603 18603 1.00000000000000e+00 18604 18604 1.00000000000000e+00 18605 18605 1.00000000000000e+00 18606 18606 1.00000000000000e+00 18607 18607 1.00000000000000e+00 18608 18608 1.00000000000000e+00 18609 18609 1.00000000000000e+00 18610 18610 1.00000000000000e+00 18611 18611 1.00000000000000e+00 18612 18612 1.00000000000000e+00 18613 18613 1.00000000000000e+00 18614 18614 1.00000000000000e+00 18615 18615 1.00000000000000e+00 18616 18616 1.00000000000000e+00 18617 18617 1.00000000000000e+00 18618 18618 1.00000000000000e+00 18619 18619 1.00000000000000e+00 18620 18620 1.00000000000000e+00 18621 18621 1.00000000000000e+00 18622 18622 1.00000000000000e+00 18623 18623 1.00000000000000e+00 18624 7581 -4.02905087151109e-06 18624 7605 -1.11687003265816e-03 18624 7629 -3.11177468058393e-04 18624 8181 -2.34736856990423e-02 18624 8205 -3.40415392059891e-01 18624 8229 -3.74380593890018e-01 18624 8253 -8.86963956974827e-02 18624 8277 -7.01874925208520e-07 18624 8757 -1.43395025777828e-04 18624 8781 -4.56776305238476e-01 18624 8805 -3.99618407387615e+00 18624 8829 -5.95229647679309e+00 18624 8853 -1.58757384800461e+00 18624 8877 -2.02792477156881e-06 18624 9357 -2.26300359808559e-03 18624 9381 -5.57018387595869e-01 18624 9405 -5.81223872309208e+00 18624 9429 -1.05430018435053e+01 18624 9453 -1.08493774795171e+00 18624 9957 -2.47411633771683e-04 18624 9981 -7.89606507668578e-02 18624 10005 -1.55811480797781e+00 18624 10029 -2.02506210321664e+00 18624 10053 -1.89372668443837e-02 18624 10581 -2.10202261173670e-07 18624 10605 -1.30329133732077e-02 18624 10629 -1.20141728929724e-02 18624 18624 8.49983496383107e+00 18624 17760 2.40943983470185e-02 18624 17784 1.54387821770831e-01 18624 17808 4.53459503715149e-01 18624 17832 4.52658612056966e-01 18624 18168 2.01103230141624e-01 18624 18192 1.32109286328215e+00 18624 18216 3.44529520645662e+00 18624 18240 2.87162435362045e+00 18624 18576 4.68009715976447e-01 18624 18600 3.14651504285888e+00 18624 18648 5.14231724303766e+00 18624 18984 2.04776719214466e-01 18624 19008 1.41538524136981e+00 18624 19032 3.71364396652325e+00 18624 19056 2.84378594303397e+00 18624 19392 2.50127706152292e-02 18624 19416 1.77960916292746e-01 18624 19440 5.20546693731804e-01 18624 19464 4.45699009410347e-01 18625 18625 1.00000000000000e+00 18626 18626 1.00000000000000e+00 18627 18627 1.00000000000000e+00 18628 18628 1.00000000000000e+00 18629 18629 1.00000000000000e+00 18630 18630 1.00000000000000e+00 18631 18631 1.00000000000000e+00 18632 18632 1.00000000000000e+00 18633 18633 1.00000000000000e+00 18634 18634 1.00000000000000e+00 18635 18635 1.00000000000000e+00 18636 18636 1.00000000000000e+00 18637 18637 1.00000000000000e+00 18638 18638 1.00000000000000e+00 18639 18639 1.00000000000000e+00 18640 18640 1.00000000000000e+00 18641 18641 1.00000000000000e+00 18642 18642 1.00000000000000e+00 18643 18643 1.00000000000000e+00 18644 18644 1.00000000000000e+00 18645 18645 1.00000000000000e+00 18646 18646 1.00000000000000e+00 18647 18647 1.00000000000000e+00 18648 7605 -1.07073187650000e-09 18648 7629 -2.84904636177000e-09 18648 8205 -9.34229118965563e-03 18648 8229 -1.37927352900207e-01 18648 8253 -1.24451148894913e-01 18648 8277 -1.40028719608418e-06 18648 8781 -1.52847645058491e-03 18648 8805 -5.13545222136786e-01 18648 8829 -5.21913909453383e+00 18648 8853 -2.73110193042549e+00 18648 8877 -4.04614909029327e-06 18648 9381 -2.24860482368027e-02 18648 9405 -2.47152522189264e+00 18648 9429 -1.31480554177427e+01 18648 9453 -1.95058358179340e+00 18648 9981 -1.03974540170889e-02 18648 10005 -1.71458500707119e+00 18648 10029 -3.34611990479085e+00 18648 10053 -3.62833187129931e-02 18648 10581 -1.63349069221820e-07 18648 10605 -2.35820716352027e-02 18648 10629 -2.25645047563796e-02 18648 18648 9.05430117290746e+00 18648 17784 1.45025570956891e-02 18648 17808 4.52658612056966e-01 18648 17832 8.03799324444108e-01 18648 18192 1.29169985678909e-01 18648 18216 2.87162435362045e+00 18648 18240 4.83905880748852e+00 18648 18600 3.18619044738257e-01 18648 18624 5.14231724303766e+00 18648 19008 1.49069591127982e-01 18648 19032 2.84378594303397e+00 18648 19056 4.64408474817206e+00 18648 19416 1.94774584579572e-02 18648 19440 4.45699009410347e-01 18648 19464 7.55055809614993e-01 18649 18649 1.00000000000000e+00 18650 18650 1.00000000000000e+00 18651 18651 1.00000000000000e+00 18652 18652 1.00000000000000e+00 18653 18653 1.00000000000000e+00 18654 18654 1.00000000000000e+00 18655 18655 1.00000000000000e+00 18656 18656 1.00000000000000e+00 18657 18657 1.00000000000000e+00 18658 18658 1.00000000000000e+00 18659 18659 1.00000000000000e+00 18660 18660 1.00000000000000e+00 18661 18661 1.00000000000000e+00 18662 18662 1.00000000000000e+00 18663 18663 1.00000000000000e+00 18664 18664 1.00000000000000e+00 18665 18665 1.00000000000000e+00 18666 18666 1.00000000000000e+00 18667 18667 1.00000000000000e+00 18668 18668 1.00000000000000e+00 18669 18669 1.00000000000000e+00 18670 18670 1.00000000000000e+00 18671 18671 1.00000000000000e+00 18672 4965 -7.64040556608097e-03 18672 4989 -2.41641731088428e-01 18672 5013 -3.72128208243898e-02 18672 5037 -3.26042166295232e-06 18672 5565 -3.21770864406448e+00 18672 5589 -7.85719513899019e+00 18672 5613 -4.08749207963302e-01 18672 5637 -9.39185922044165e-04 18672 6141 -3.37372744046831e-02 18672 6165 -1.14939187741037e+01 18672 6189 -1.30472690748127e+01 18672 6213 -3.54401329386655e-01 18672 6237 -2.76167595293286e-04 18672 6741 -7.35208925300149e-02 18672 6765 -2.26850405724510e+00 18672 6789 -1.14051294456303e+00 18672 6813 -4.00258339285648e-02 18672 7341 -4.16008843137160e-05 18672 7365 -8.66206699074853e-03 18672 7389 -1.05376172650656e-02 18672 7413 -7.22152185415616e-05 18672 18672 1.48273894024811e+01 18672 17856 4.05965377428013e-01 18672 17880 2.65247476348139e-01 18672 17904 1.77899393240378e-02 18672 18264 4.83905880748844e+00 18672 18288 2.87162435362040e+00 18672 18312 1.29169985678906e-01 18672 18696 7.86066781462631e+00 18672 18720 2.70563746681642e-01 18672 19080 5.45773663356651e+00 18672 19104 3.22216462969512e+00 18672 19128 1.40941803689102e-01 18672 19488 5.60634833947531e-01 18672 19512 3.52882545366819e-01 18672 19536 2.07328938265868e-02 18673 18673 1.00000000000000e+00 18674 18674 1.00000000000000e+00 18675 18675 1.00000000000000e+00 18676 18676 1.00000000000000e+00 18677 18677 1.00000000000000e+00 18678 18678 1.00000000000000e+00 18679 18679 1.00000000000000e+00 18680 18680 1.00000000000000e+00 18681 18681 1.00000000000000e+00 18682 18682 1.00000000000000e+00 18683 18683 1.00000000000000e+00 18684 18684 1.00000000000000e+00 18685 18685 1.00000000000000e+00 18686 18686 1.00000000000000e+00 18687 18687 1.00000000000000e+00 18688 18688 1.00000000000000e+00 18689 18689 1.00000000000000e+00 18690 18690 1.00000000000000e+00 18691 18691 1.00000000000000e+00 18692 18692 1.00000000000000e+00 18693 18693 1.00000000000000e+00 18694 18694 1.00000000000000e+00 18695 18695 1.00000000000000e+00 18696 4965 -4.00184406382038e-03 18696 4989 -1.51606456257912e-01 18696 5013 -3.65312941816119e-02 18696 5037 -1.90559154330356e-05 18696 5565 -1.73811843761454e+00 18696 5589 -5.50103384768722e+00 18696 5613 -1.13270057768639e+00 18696 5637 -4.82939482475489e-02 18696 5661 -3.20764573755020e-07 18696 6141 -1.77902210357914e-02 18696 6165 -6.80856023493010e+00 18696 6189 -1.24786044584955e+01 18696 6213 -3.00685097530552e+00 18696 6237 -1.45112262225358e-01 18696 6261 -2.87805904174350e-07 18696 6741 -3.98978040899679e-02 18696 6765 -1.88437508933345e+00 18696 6789 -3.15244129814919e+00 18696 6813 -1.25135147236014e+00 18696 6837 -3.18464976229811e-02 18696 7341 -2.89818847393736e-05 18696 7365 -2.67141945964826e-02 18696 7389 -1.30571047099532e-01 18696 7413 -4.73116659948555e-02 18696 7437 -2.19376034812508e-05 18696 7989 -1.33252547496470e-07 18696 8013 -1.54264278491790e-07 18696 18696 9.15595174166991e+00 18696 17856 2.65247476348139e-01 18696 17880 4.07864297898985e-01 18696 17904 1.75885394049698e-01 18696 17928 2.61814091883867e-02 18696 18264 2.87162435362039e+00 18696 18288 3.44529520645654e+00 18696 18312 1.32109286328212e+00 18696 18336 2.01103230141620e-01 18696 18672 7.86066781462631e+00 18696 18720 2.83315650998106e+00 18696 18744 4.37725380813608e-01 18696 19080 3.22216462969512e+00 18696 19104 3.78477955217482e+00 18696 19128 1.36581515747559e+00 18696 19152 2.00511985679792e-01 18696 19488 3.52882545366819e-01 18696 19512 4.92735384328554e-01 18696 19536 1.87065967598066e-01 18696 19560 2.60335980729298e-02 18697 18697 1.00000000000000e+00 18698 18698 1.00000000000000e+00 18699 18699 1.00000000000000e+00 18700 18700 1.00000000000000e+00 18701 18701 1.00000000000000e+00 18702 18702 1.00000000000000e+00 18703 18703 1.00000000000000e+00 18704 18704 1.00000000000000e+00 18705 18705 1.00000000000000e+00 18706 18706 1.00000000000000e+00 18707 18707 1.00000000000000e+00 18708 18708 1.00000000000000e+00 18709 18709 1.00000000000000e+00 18710 18710 1.00000000000000e+00 18711 18711 1.00000000000000e+00 18712 18712 1.00000000000000e+00 18713 18713 1.00000000000000e+00 18714 18714 1.00000000000000e+00 18715 18715 1.00000000000000e+00 18716 18716 1.00000000000000e+00 18717 18717 1.00000000000000e+00 18718 18718 1.00000000000000e+00 18719 18719 1.00000000000000e+00 18720 4965 -5.18975087942547e-05 18720 4989 -8.98842633280525e-03 18720 5013 -6.49201867337113e-03 18720 5037 -2.73173367878575e-05 18720 5565 -3.69326044520842e-02 18720 5589 -6.38758052884531e-01 18720 5613 -1.23592080630087e+00 18720 5637 -2.21176604075135e-01 18720 5661 -1.50947173666035e-03 18720 6141 -2.63309666699975e-04 18720 6165 -3.17500633505509e-01 18720 6189 -4.91357092063526e+00 18720 6213 -8.10899043378002e+00 18720 6237 -1.24236010428429e+00 18720 6261 -1.85885487822356e-02 18720 6741 -8.96387949988702e-04 18720 6765 -3.02877918445016e-01 18720 6789 -4.32881999660597e+00 18720 6813 -6.06421539807080e+00 18720 6837 -9.86091564195365e-01 18720 6861 -4.83582745070658e-03 18720 7341 -2.33755502357590e-06 18720 7365 -2.05626619650524e-02 18720 7389 -4.22827509282699e-01 18720 7413 -5.02981888970391e-01 18720 7437 -7.41832630423711e-02 18720 7461 -1.44862846263390e-07 18720 7989 -9.54730890178402e-05 18720 8013 -1.67656038496173e-03 18720 8037 -1.91124497901616e-04 18720 18720 8.65632096176558e+00 18720 17856 1.77899393240378e-02 18720 17880 1.75885394049698e-01 18720 17904 4.58194494919164e-01 18720 17928 1.90733671077306e-01 18720 17952 2.15020085809398e-02 18720 18264 1.29169985678906e-01 18720 18288 1.32109286328212e+00 18720 18312 3.51772392353499e+00 18720 18336 1.48802194292691e+00 18720 18360 1.70902255590104e-01 18720 18672 2.70563746681642e-01 18720 18696 2.83315650998106e+00 18720 18744 3.27950601151824e+00 18720 18768 3.82151122065936e-01 18720 19080 1.40941803689102e-01 18720 19104 1.36581515747559e+00 18720 19128 3.51831670951067e+00 18720 19152 1.47878048249846e+00 18720 19176 1.69183134944820e-01 18720 19488 2.07328938265868e-02 18720 19512 1.87065967598066e-01 18720 19536 4.58342691413082e-01 18720 19560 1.88423305970195e-01 18720 19584 2.10722284196189e-02 18721 18721 1.00000000000000e+00 18722 18722 1.00000000000000e+00 18723 18723 1.00000000000000e+00 18724 18724 1.00000000000000e+00 18725 18725 1.00000000000000e+00 18726 18726 1.00000000000000e+00 18727 18727 1.00000000000000e+00 18728 18728 1.00000000000000e+00 18729 18729 1.00000000000000e+00 18730 18730 1.00000000000000e+00 18731 18731 1.00000000000000e+00 18732 18732 1.00000000000000e+00 18733 18733 1.00000000000000e+00 18734 18734 1.00000000000000e+00 18735 18735 1.00000000000000e+00 18736 18736 1.00000000000000e+00 18737 18737 1.00000000000000e+00 18738 18738 1.00000000000000e+00 18739 18739 1.00000000000000e+00 18740 18740 1.00000000000000e+00 18741 18741 1.00000000000000e+00 18742 18742 1.00000000000000e+00 18743 18743 1.00000000000000e+00 18744 4989 -5.18385731630731e-05 18744 5013 -3.69013968260151e-04 18744 5037 -6.01422878122630e-06 18744 5589 -5.10221569510300e-02 18744 5613 -3.40186827062606e-01 18744 5637 -2.16482774683166e-01 18744 5661 -7.59144487802216e-03 18744 5685 -7.91806544230000e-10 18744 6165 -3.81933610700287e-03 18744 6189 -9.34677063180274e-01 18744 6213 -4.74306814100725e+00 18744 6237 -3.17368962354501e+00 18744 6261 -2.32391335660983e-01 18744 6285 -6.52984975638917e-04 18744 6765 -2.38431983512811e-02 18744 6789 -1.41134525042509e+00 18744 6813 -8.08169379493093e+00 18744 6837 -5.27554891058864e+00 18744 6861 -3.95378165876490e-01 18744 6885 -3.60635957870881e-04 18744 7365 -3.81608675529018e-03 18744 7389 -2.97980555261437e-01 18744 7413 -1.58350204718119e+00 18744 7437 -1.01903277723736e+00 18744 7461 -7.39694930109535e-02 18744 7989 -4.18824570894568e-04 18744 8013 -2.01656095848383e-02 18744 8037 -2.18011093323540e-02 18744 8061 -2.02821011824119e-04 18744 18744 7.90139368247117e+00 18744 17880 2.61814091883867e-02 18744 17904 1.90733671077306e-01 18744 17928 3.89901358438711e-01 18744 17952 1.64759282144910e-01 18744 17976 1.96878119552877e-02 18744 18288 2.01103230141620e-01 18744 18312 1.48802194292691e+00 18744 18336 3.09174182969900e+00 18744 18360 1.30841906282309e+00 18744 18384 1.56202510115664e-01 18744 18696 4.37725380813608e-01 18744 18720 3.27950601151824e+00 18744 18768 2.92560588267314e+00 18744 18792 3.49250348602333e-01 18744 19104 2.00511985679792e-01 18744 19128 1.47878048249847e+00 18744 19152 3.06392335696745e+00 18744 19176 1.30265738846122e+00 18744 19200 1.56481212170482e-01 18744 19512 2.60335980729298e-02 18744 19536 1.88423305970195e-01 18744 19560 3.82946740255824e-01 18744 19584 1.63318863554444e-01 18744 19608 1.97574874689921e-02 18745 18745 1.00000000000000e+00 18746 18746 1.00000000000000e+00 18747 18747 1.00000000000000e+00 18748 18748 1.00000000000000e+00 18749 18749 1.00000000000000e+00 18750 18750 1.00000000000000e+00 18751 18751 1.00000000000000e+00 18752 18752 1.00000000000000e+00 18753 18753 1.00000000000000e+00 18754 18754 1.00000000000000e+00 18755 18755 1.00000000000000e+00 18756 18756 1.00000000000000e+00 18757 18757 1.00000000000000e+00 18758 18758 1.00000000000000e+00 18759 18759 1.00000000000000e+00 18760 18760 1.00000000000000e+00 18761 18761 1.00000000000000e+00 18762 18762 1.00000000000000e+00 18763 18763 1.00000000000000e+00 18764 18764 1.00000000000000e+00 18765 18765 1.00000000000000e+00 18766 18766 1.00000000000000e+00 18767 18767 1.00000000000000e+00 18768 5589 -1.46666927100900e-06 18768 5613 -2.11921539795365e-02 18768 5637 -5.64564483220393e-02 18768 5661 -7.75557904544802e-03 18768 5685 -3.72328364354000e-09 18768 6189 -1.87272890764828e-02 18768 6213 -8.56623399539264e-01 18768 6237 -2.14962332383442e+00 18768 6261 -7.65783553595152e-01 18768 6285 -2.17405842911069e-02 18768 6309 -3.49041330603600e-08 18768 6765 -2.45870515439580e-07 18768 6789 -1.19803551127474e-01 18768 6813 -3.07599406256259e+00 18768 6837 -8.67746750985503e+00 18768 6861 -2.69588979393633e+00 18768 6885 -9.77203966759713e-02 18768 6909 -5.34096308434300e-08 18768 7365 -4.73650354579930e-07 18768 7389 -5.66160552656295e-02 18768 7413 -1.44359395821836e+00 18768 7437 -3.82742487958769e+00 18768 7461 -1.33991019064059e+00 18768 7485 -3.16680109148213e-02 18768 7989 -2.50664090970473e-04 18768 8013 -6.10846835017330e-02 18768 8037 -1.98152836711839e-01 18768 8061 -6.23061972031627e-02 18768 8085 -8.00448419937289e-05 18768 8637 -2.31930704160447e-05 18768 8661 -1.96401349981369e-05 18768 18768 7.31846347239754e+00 18768 17904 2.15020085809398e-02 18768 17928 1.64759282144910e-01 18768 17952 3.55382750414309e-01 18768 17976 1.54254250016213e-01 18768 18000 1.88757505487655e-02 18768 18312 1.70902255590104e-01 18768 18336 1.30841906282309e+00 18768 18360 2.82319266893077e+00 18768 18384 1.23701104642260e+00 18768 18408 1.53050251489982e-01 18768 18720 3.82151122065936e-01 18768 18744 2.92560588267314e+00 18768 18792 2.79022848518564e+00 18768 18816 3.48306772694064e-01 18768 19128 1.69183134944820e-01 18768 19152 1.30265738846122e+00 18768 19176 2.82739787882997e+00 18768 19200 1.24398624531148e+00 18768 19224 1.54515349157384e-01 18768 19536 2.10722284196189e-02 18768 19560 1.63318863554444e-01 18768 19584 3.56434052889109e-01 18768 19608 1.55998049738432e-01 18768 19632 1.92420249656160e-02 18769 18769 1.00000000000000e+00 18770 18770 1.00000000000000e+00 18771 18771 1.00000000000000e+00 18772 18772 1.00000000000000e+00 18773 18773 1.00000000000000e+00 18774 18774 1.00000000000000e+00 18775 18775 1.00000000000000e+00 18776 18776 1.00000000000000e+00 18777 18777 1.00000000000000e+00 18778 18778 1.00000000000000e+00 18779 18779 1.00000000000000e+00 18780 18780 1.00000000000000e+00 18781 18781 1.00000000000000e+00 18782 18782 1.00000000000000e+00 18783 18783 1.00000000000000e+00 18784 18784 1.00000000000000e+00 18785 18785 1.00000000000000e+00 18786 18786 1.00000000000000e+00 18787 18787 1.00000000000000e+00 18788 18788 1.00000000000000e+00 18789 18789 1.00000000000000e+00 18790 18790 1.00000000000000e+00 18791 18791 1.00000000000000e+00 18792 5613 -1.54009090715200e-05 18792 5637 -3.60383670497819e-03 18792 5661 -1.61402046852438e-03 18792 5685 -3.01603641067000e-09 18792 6213 -3.00451118904866e-02 18792 6237 -4.52262731923135e-01 18792 6261 -6.27511702787331e-01 18792 6285 -9.43825694898244e-02 18792 6309 -3.88327097074184e-04 18792 6789 -1.74967604472405e-04 18792 6813 -3.62324339704618e-01 18792 6837 -4.15319957528700e+00 18792 6861 -5.60361692656959e+00 18792 6885 -8.34174209426216e-01 18792 6909 -1.27531411453204e-02 18792 7389 -1.25262710500993e-03 18792 7413 -3.57021004769816e-01 18792 7437 -4.28272850225013e+00 18792 7461 -5.80227885164784e+00 18792 7485 -9.24693753917562e-01 18792 7509 -5.17490449004990e-03 18792 7989 -3.89310030356546e-05 18792 8013 -3.57113108533596e-02 18792 8037 -5.44017519973793e-01 18792 8061 -6.59599075902192e-01 18792 8085 -1.05165732007159e-01 18792 8109 -2.75579249208747e-06 18792 8637 -7.57131174518678e-04 18792 8661 -5.60266975200149e-03 18792 8685 -5.12372734049650e-04 18792 18792 7.25784715332229e+00 18792 17928 1.96878119552877e-02 18792 17952 1.54254250016213e-01 18792 17976 3.40416528216015e-01 18792 18000 1.50369832116982e-01 18792 18024 1.87167074804801e-02 18792 18336 1.56202510115664e-01 18792 18360 1.23701104642260e+00 18792 18384 2.75439373133245e+00 18792 18408 1.20974979546800e+00 18792 18432 1.49387197377013e-01 18792 18744 3.49250348602333e-01 18792 18768 2.79022848518564e+00 18792 18816 2.73598085723518e+00 18792 18840 3.35688441614716e-01 18792 19152 1.56481212170482e-01 18792 19176 1.24398624531148e+00 18792 19200 2.77880822339924e+00 18792 19224 1.21838709547176e+00 18792 19248 1.50081424710553e-01 18792 19560 1.97574874689921e-02 18792 19584 1.55998049738432e-01 18792 19608 3.46520151232713e-01 18792 19632 1.52529157117924e-01 18792 19656 1.88902643138649e-02 18793 18793 1.00000000000000e+00 18794 18794 1.00000000000000e+00 18795 18795 1.00000000000000e+00 18796 18796 1.00000000000000e+00 18797 18797 1.00000000000000e+00 18798 18798 1.00000000000000e+00 18799 18799 1.00000000000000e+00 18800 18800 1.00000000000000e+00 18801 18801 1.00000000000000e+00 18802 18802 1.00000000000000e+00 18803 18803 1.00000000000000e+00 18804 18804 1.00000000000000e+00 18805 18805 1.00000000000000e+00 18806 18806 1.00000000000000e+00 18807 18807 1.00000000000000e+00 18808 18808 1.00000000000000e+00 18809 18809 1.00000000000000e+00 18810 18810 1.00000000000000e+00 18811 18811 1.00000000000000e+00 18812 18812 1.00000000000000e+00 18813 18813 1.00000000000000e+00 18814 18814 1.00000000000000e+00 18815 18815 1.00000000000000e+00 18816 5637 -3.16656089837683e-06 18816 5661 -1.39127671343209e-05 18816 5685 -5.56057466610000e-10 18816 6237 -2.16988591599805e-02 18816 6261 -1.52428787925998e-01 18816 6285 -8.88788763992183e-02 18816 6309 -1.81437017932960e-03 18816 6813 -2.16668756254664e-03 18816 6837 -6.28655875378812e-01 18816 6861 -3.12316738344963e+00 18816 6885 -2.12020356069701e+00 18816 6909 -1.52427932049991e-01 18816 6933 -3.62720964486749e-04 18816 7413 -1.99554679510907e-02 18816 7437 -1.29828131778270e+00 18816 7461 -7.56571605479376e+00 18816 7485 -4.82545053729419e+00 18816 7509 -3.57157477180800e-01 18816 7533 -3.45218003082488e-04 18816 8013 -5.56833331860731e-03 18816 8037 -3.86242857738427e-01 18816 8061 -2.04795403555765e+00 18816 8085 -1.32125388491843e+00 18816 8109 -9.59262161090063e-02 18816 8637 -2.84679740778401e-03 18816 8661 -4.94199897693987e-02 18816 8685 -4.04287971817125e-02 18816 8709 -5.27208835272879e-04 18816 18816 7.05170990002146e+00 18816 17952 1.88757505487655e-02 18816 17976 1.50369832116982e-01 18816 18000 3.36956874240736e-01 18816 18024 1.49322045939075e-01 18816 18048 1.86138040042886e-02 18816 18360 1.53050251489982e-01 18816 18384 1.20974979546800e+00 18816 18408 2.69147239990296e+00 18816 18432 1.19045675103089e+00 18816 18456 1.48226990380706e-01 18816 18768 3.48306772694064e-01 18816 18792 2.73598085723518e+00 18816 18840 2.67230601242579e+00 18816 18864 3.32388061491718e-01 18816 19176 1.54515349157384e-01 18816 19200 1.21838709547176e+00 18816 19224 2.70433855902271e+00 18816 19248 1.19440735682797e+00 18816 19272 1.48520414496436e-01 18816 19584 1.92420249656160e-02 18816 19608 1.52529157117924e-01 18816 19632 3.40173414020676e-01 18816 19656 1.50309697388344e-01 18816 19680 1.86871600332210e-02 18817 18817 1.00000000000000e+00 18818 18818 1.00000000000000e+00 18819 18819 1.00000000000000e+00 18820 18820 1.00000000000000e+00 18821 18821 1.00000000000000e+00 18822 18822 1.00000000000000e+00 18823 18823 1.00000000000000e+00 18824 18824 1.00000000000000e+00 18825 18825 1.00000000000000e+00 18826 18826 1.00000000000000e+00 18827 18827 1.00000000000000e+00 18828 18828 1.00000000000000e+00 18829 18829 1.00000000000000e+00 18830 18830 1.00000000000000e+00 18831 18831 1.00000000000000e+00 18832 18832 1.00000000000000e+00 18833 18833 1.00000000000000e+00 18834 18834 1.00000000000000e+00 18835 18835 1.00000000000000e+00 18836 18836 1.00000000000000e+00 18837 18837 1.00000000000000e+00 18838 18838 1.00000000000000e+00 18839 18839 1.00000000000000e+00 18840 6237 -3.06112379000400e-08 18840 6261 -9.35970523369881e-03 18840 6285 -2.07758257319012e-02 18840 6309 -1.43453473503937e-03 18840 6837 -1.13536029586752e-02 18840 6861 -5.46152839053614e-01 18840 6885 -1.37644441535068e+00 18840 6909 -4.82708299194572e-01 18840 6933 -1.12740152964935e-02 18840 6957 -2.08894349837000e-09 18840 7413 -4.19734577819630e-07 18840 7437 -1.09225360996490e-01 18840 7461 -2.80557560879685e+00 18840 7485 -7.65930322967344e+00 18840 7509 -2.28807743415279e+00 18840 7533 -8.08640652260136e-02 18840 7557 -5.84238235270000e-09 18840 8013 -1.58029534922601e-06 18840 8037 -7.39127451110992e-02 18840 8061 -1.76536172072492e+00 18840 8085 -4.66386840320000e+00 18840 8109 -1.53990166618202e+00 18840 8133 -3.60917035854080e-02 18840 8637 -1.32903395665439e-03 18840 8661 -1.24081197234278e-01 18840 8685 -3.30604382240390e-01 18840 8709 -1.02094554323801e-01 18840 8733 -2.59752650159821e-04 18840 9261 -1.79287271112400e-08 18840 9285 -3.19429685077522e-04 18840 9309 -1.96245122556971e-04 18840 18840 6.98863844253901e+00 18840 17976 1.87167074804801e-02 18840 18000 1.49322045939075e-01 18840 18024 3.34741017056581e-01 18840 18048 1.47268998047091e-01 18840 18072 1.82034455074842e-02 18840 18384 1.49387197377013e-01 18840 18408 1.19045675103089e+00 18840 18432 2.66828804151546e+00 18840 18456 1.18198395371122e+00 18840 18480 1.47268998047095e-01 18840 18792 3.35688441614716e-01 18840 18816 2.67230601242579e+00 18840 18864 2.66851631419331e+00 18840 18888 3.34741017056595e-01 18840 19200 1.50081424710553e-01 18840 19224 1.19440735682797e+00 18840 19248 2.67573010259266e+00 18840 19272 1.19136984174207e+00 18840 19296 1.49322045939077e-01 18840 19608 1.88902643138649e-02 18840 19632 1.50309697388344e-01 18840 19656 3.36601532325880e-01 18840 19680 1.49615470054803e-01 18840 19704 1.87167074804798e-02 18841 18841 1.00000000000000e+00 18842 18842 1.00000000000000e+00 18843 18843 1.00000000000000e+00 18844 18844 1.00000000000000e+00 18845 18845 1.00000000000000e+00 18846 18846 1.00000000000000e+00 18847 18847 1.00000000000000e+00 18848 18848 1.00000000000000e+00 18849 18849 1.00000000000000e+00 18850 18850 1.00000000000000e+00 18851 18851 1.00000000000000e+00 18852 18852 1.00000000000000e+00 18853 18853 1.00000000000000e+00 18854 18854 1.00000000000000e+00 18855 18855 1.00000000000000e+00 18856 18856 1.00000000000000e+00 18857 18857 1.00000000000000e+00 18858 18858 1.00000000000000e+00 18859 18859 1.00000000000000e+00 18860 18860 1.00000000000000e+00 18861 18861 1.00000000000000e+00 18862 18862 1.00000000000000e+00 18863 18863 1.00000000000000e+00 18864 6261 -2.69057086099646e-06 18864 6285 -8.90212526518233e-04 18864 6309 -2.61608722558179e-04 18864 6861 -1.65572343303867e-02 18864 6885 -2.74213120676921e-01 18864 6909 -3.62722235630271e-01 18864 6933 -4.61905750663568e-02 18864 6957 -5.94104233255159e-05 18864 7437 -9.56224454740975e-05 18864 7461 -3.18730314473022e-01 18864 7485 -3.42674317775816e+00 18864 7509 -4.42023205069257e+00 18864 7533 -6.46991543310086e-01 18864 7557 -9.23046608098409e-03 18864 8037 -1.54822597046121e-03 18864 8061 -4.15890163972254e-01 18864 8085 -4.81535243342520e+00 18864 8109 -6.27649976772474e+00 18864 8133 -9.41744134857346e-01 18864 8157 -5.97874547333361e-03 18864 8637 -1.66168765949972e-04 18864 8661 -6.46742273828275e-02 18864 8685 -8.36607401537227e-01 18864 8709 -9.74542059803753e-01 18864 8733 -1.56910533252354e-01 18864 8757 -1.62498969958988e-05 18864 9261 -7.48855361421700e-08 18864 9285 -3.92424215915942e-03 18864 9309 -1.52511482932409e-02 18864 9333 -1.21000740674983e-03 18864 18864 7.02057532771972e+00 18864 18000 1.86138040042886e-02 18864 18024 1.47268998047091e-01 18864 18048 3.28482736128325e-01 18864 18072 1.47268998047093e-01 18864 18096 1.86138040042889e-02 18864 18408 1.48226990380706e-01 18864 18432 1.18198395371122e+00 18864 18456 2.65275794951498e+00 18864 18480 1.18198395371122e+00 18864 18504 1.48226990380707e-01 18864 18816 3.32388061491718e-01 18864 18840 2.66851631419331e+00 18864 18888 2.66828804151550e+00 18864 18912 3.32330993322267e-01 18864 19224 1.48520414496436e-01 18864 19248 1.19136984174207e+00 18864 19272 2.68596529134037e+00 18864 19296 1.19045675103090e+00 18864 19320 1.48292141818644e-01 18864 19632 1.86871600332210e-02 18864 19656 1.49615470054803e-01 18864 19680 3.36784571584672e-01 18864 19704 1.49387197377012e-01 18864 19728 1.86300918637733e-02 18865 18865 1.00000000000000e+00 18866 18866 1.00000000000000e+00 18867 18867 1.00000000000000e+00 18868 18868 1.00000000000000e+00 18869 18869 1.00000000000000e+00 18870 18870 1.00000000000000e+00 18871 18871 1.00000000000000e+00 18872 18872 1.00000000000000e+00 18873 18873 1.00000000000000e+00 18874 18874 1.00000000000000e+00 18875 18875 1.00000000000000e+00 18876 18876 1.00000000000000e+00 18877 18877 1.00000000000000e+00 18878 18878 1.00000000000000e+00 18879 18879 1.00000000000000e+00 18880 18880 1.00000000000000e+00 18881 18881 1.00000000000000e+00 18882 18882 1.00000000000000e+00 18883 18883 1.00000000000000e+00 18884 18884 1.00000000000000e+00 18885 18885 1.00000000000000e+00 18886 18886 1.00000000000000e+00 18887 18887 1.00000000000000e+00 18888 6285 -2.08894349837000e-09 18888 6309 -5.84238235270000e-09 18888 6885 -1.12740152964936e-02 18888 6909 -8.08640652260132e-02 18888 6933 -3.60917035854073e-02 18888 6957 -2.59752650159816e-04 18888 7461 -1.43453473503941e-03 18888 7485 -4.82708299194590e-01 18888 7509 -2.28807743415282e+00 18888 7533 -1.53990166618200e+00 18888 7557 -1.02094554323802e-01 18888 7581 -1.96245122556977e-04 18888 8061 -2.07758257319011e-02 18888 8085 -1.37644441535070e+00 18888 8109 -7.65930322967342e+00 18888 8133 -4.66386840319999e+00 18888 8157 -3.30604382240397e-01 18888 8181 -3.19429685077532e-04 18888 8661 -9.35970523369866e-03 18888 8685 -5.46152839053613e-01 18888 8709 -2.80557560879684e+00 18888 8733 -1.76536172072493e+00 18888 8757 -1.24081197234281e-01 18888 8781 -1.79287271112400e-08 18888 9261 -3.06112379000400e-08 18888 9285 -1.13536029586752e-02 18888 9309 -1.09225360996482e-01 18888 9333 -7.39127451110974e-02 18888 9357 -1.32903395665438e-03 18888 9909 -4.19734577819610e-07 18888 9933 -1.58029534922596e-06 18888 18888 6.98863844253897e+00 18888 18024 1.82034455074842e-02 18888 18048 1.47268998047093e-01 18888 18072 3.34741017056588e-01 18888 18096 1.49322045939077e-01 18888 18120 1.87167074804804e-02 18888 18432 1.47268998047095e-01 18888 18456 1.18198395371122e+00 18888 18480 2.66851631419327e+00 18888 18504 1.19136984174207e+00 18888 18528 1.49615470054807e-01 18888 18840 3.34741017056595e-01 18888 18864 2.66828804151550e+00 18888 18912 2.67573010259267e+00 18888 18936 3.36601532325887e-01 18888 19248 1.49322045939077e-01 18888 19272 1.19045675103090e+00 18888 19296 2.67230601242578e+00 18888 19320 1.19440735682796e+00 18888 19344 1.50309697388343e-01 18888 19656 1.87167074804798e-02 18888 19680 1.49387197377012e-01 18888 19704 3.35688441614716e-01 18888 19728 1.50081424710550e-01 18888 19752 1.88902643138643e-02 18889 18889 1.00000000000000e+00 18890 18890 1.00000000000000e+00 18891 18891 1.00000000000000e+00 18892 18892 1.00000000000000e+00 18893 18893 1.00000000000000e+00 18894 18894 1.00000000000000e+00 18895 18895 1.00000000000000e+00 18896 18896 1.00000000000000e+00 18897 18897 1.00000000000000e+00 18898 18898 1.00000000000000e+00 18899 18899 1.00000000000000e+00 18900 18900 1.00000000000000e+00 18901 18901 1.00000000000000e+00 18902 18902 1.00000000000000e+00 18903 18903 1.00000000000000e+00 18904 18904 1.00000000000000e+00 18905 18905 1.00000000000000e+00 18906 18906 1.00000000000000e+00 18907 18907 1.00000000000000e+00 18908 18908 1.00000000000000e+00 18909 18909 1.00000000000000e+00 18910 18910 1.00000000000000e+00 18911 18911 1.00000000000000e+00 18912 6909 -4.14430081245737e-03 18912 6933 -7.04436337218170e-03 18912 6957 -1.47971231592433e-04 18912 7485 -7.05238029109575e-03 18912 7509 -3.71678060230651e-01 18912 7533 -9.17064794435841e-01 18912 7557 -3.05397524757645e-01 18912 7581 -5.35878571918446e-03 18912 7605 -1.00590931000000e-11 18912 8061 -3.90152634118480e-07 18912 8085 -1.06320221811237e-01 18912 8109 -2.67868645090644e+00 18912 8133 -6.90984690437414e+00 18912 8157 -1.99343558131646e+00 18912 8181 -6.87655032636456e-02 18912 8205 -6.64224849700000e-11 18912 8661 -4.56708922212470e-06 18912 8685 -9.93778601986993e-02 18912 8709 -2.23326814143202e+00 18912 8733 -5.79840393114085e+00 18912 8757 -1.80327671377137e+00 18912 8781 -4.21980672869897e-02 18912 9261 -3.17062769720000e-09 18912 9285 -4.43884181165060e-03 18912 9309 -2.34465262564610e-01 18912 9333 -5.54442084415406e-01 18912 9357 -1.70937578879024e-01 18912 9381 -7.15434311001545e-04 18912 9909 -1.54190474932796e-05 18912 9933 -1.94985337928628e-03 18912 9957 -8.71566016129902e-04 18912 18912 7.06341460812464e+00 18912 18048 1.86138040042889e-02 18912 18072 1.49322045939077e-01 18912 18096 3.36956874240741e-01 18912 18120 1.50369832116984e-01 18912 18144 1.88757505487656e-02 18912 18456 1.48226990380707e-01 18912 18480 1.19136984174207e+00 18912 18504 2.69436446902460e+00 18912 18528 1.20762171128693e+00 18912 18552 1.52289957766923e-01 18912 18864 3.32330993322267e-01 18912 18888 2.67573010259267e+00 18912 18936 2.72824251965550e+00 18912 18960 3.45459097587975e-01 18912 19272 1.48292141818644e-01 18912 19296 1.19440735682796e+00 18912 19320 2.70777635461111e+00 18912 19344 1.21935500786910e+00 18912 19368 1.54529054578928e-01 18912 19680 1.86300918637733e-02 18912 19704 1.50081424710550e-01 18912 19728 3.40309845637370e-01 18912 19752 1.53303156262525e-01 18912 19776 1.94355247517668e-02 18913 18913 1.00000000000000e+00 18914 18914 1.00000000000000e+00 18915 18915 1.00000000000000e+00 18916 18916 1.00000000000000e+00 18917 18917 1.00000000000000e+00 18918 18918 1.00000000000000e+00 18919 18919 1.00000000000000e+00 18920 18920 1.00000000000000e+00 18921 18921 1.00000000000000e+00 18922 18922 1.00000000000000e+00 18923 18923 1.00000000000000e+00 18924 18924 1.00000000000000e+00 18925 18925 1.00000000000000e+00 18926 18926 1.00000000000000e+00 18927 18927 1.00000000000000e+00 18928 18928 1.00000000000000e+00 18929 18929 1.00000000000000e+00 18930 18930 1.00000000000000e+00 18931 18931 1.00000000000000e+00 18932 18932 1.00000000000000e+00 18933 18933 1.00000000000000e+00 18934 18934 1.00000000000000e+00 18935 18935 1.00000000000000e+00 18936 6909 -2.55683926896940e-07 18936 6933 -1.27258756124398e-04 18936 6957 -2.21422910102276e-05 18936 7509 -9.04705997000804e-03 18936 7533 -1.69941020545763e-01 18936 7557 -2.08634239809663e-01 18936 7581 -2.04237157877318e-02 18936 7605 -2.01560395289946e-06 18936 8085 -4.61869584146412e-05 18936 8109 -2.84162572146217e-01 18936 8133 -2.88002145247032e+00 18936 8157 -3.58766882084476e+00 18936 8181 -5.14869724059548e-01 18936 8205 -6.56477375214336e-03 18936 8685 -1.86222575103133e-03 18936 8709 -4.97254905233339e-01 18936 8733 -5.55216590365657e+00 18936 8757 -6.94373649909150e+00 18936 8781 -9.83374149245038e-01 18936 8805 -6.87824803542512e-03 18936 9285 -4.48079598200317e-04 18936 9309 -1.12540250718600e-01 18936 9333 -1.30220261752323e+00 18936 9357 -1.47822609499833e+00 18936 9381 -2.35359211128359e-01 18936 9405 -5.77838800737363e-05 18936 9909 -5.60742176785103e-05 18936 9933 -1.54562329970989e-02 18936 9957 -3.61825963381648e-02 18936 9981 -2.68360686543636e-03 18936 18936 7.21643411078454e+00 18936 18072 1.87167074804804e-02 18936 18096 1.50369832116984e-01 18936 18120 3.40416528216017e-01 18936 18144 1.54254250016213e-01 18936 18168 1.96878119552877e-02 18936 18480 1.49615470054807e-01 18936 18504 1.20762171128693e+00 18936 18528 2.74332515484009e+00 18936 18552 1.23744127312556e+00 18936 18576 1.57070360514463e-01 18936 18888 3.36601532325887e-01 18936 18912 2.72824251965550e+00 18936 18960 2.79178445855528e+00 18936 18984 3.52487017050829e-01 18936 19296 1.50309697388343e-01 18936 19320 1.21935500786910e+00 18936 19344 2.77918470063374e+00 18936 19368 1.24375673824569e+00 18936 19392 1.56410129982490e-01 18936 19704 1.88902643138643e-02 18936 19728 1.53303156262525e-01 18936 19752 3.49381414664428e-01 18936 19776 1.55833116296245e-01 18936 19800 1.95227543222945e-02 18937 18937 1.00000000000000e+00 18938 18938 1.00000000000000e+00 18939 18939 1.00000000000000e+00 18940 18940 1.00000000000000e+00 18941 18941 1.00000000000000e+00 18942 18942 1.00000000000000e+00 18943 18943 1.00000000000000e+00 18944 18944 1.00000000000000e+00 18945 18945 1.00000000000000e+00 18946 18946 1.00000000000000e+00 18947 18947 1.00000000000000e+00 18948 18948 1.00000000000000e+00 18949 18949 1.00000000000000e+00 18950 18950 1.00000000000000e+00 18951 18951 1.00000000000000e+00 18952 18952 1.00000000000000e+00 18953 18953 1.00000000000000e+00 18954 18954 1.00000000000000e+00 18955 18955 1.00000000000000e+00 18956 18956 1.00000000000000e+00 18957 18957 1.00000000000000e+00 18958 18958 1.00000000000000e+00 18959 18959 1.00000000000000e+00 18960 7533 -6.09418934663197e-03 18960 7557 -4.17062818071609e-02 18960 7581 -1.23074871066057e-02 18960 7605 -8.41167939047528e-06 18960 8109 -9.06390528705483e-04 18960 8133 -3.76017434900476e-01 18960 8157 -1.71860913009062e+00 18960 8181 -1.14612630496388e+00 18960 8205 -7.08050616192473e-02 18960 8229 -1.04917510642632e-04 18960 8709 -2.19885461768137e-02 18960 8733 -1.50118703445928e+00 18960 8757 -7.93340222138191e+00 18960 8781 -4.66363090861404e+00 18960 8805 -3.28645579300930e-01 18960 8829 -3.14289429538523e-04 18960 9309 -1.53834825153159e-02 18960 9333 -7.80770559015170e-01 18960 9357 -3.96244886125040e+00 18960 9381 -2.44933938889464e+00 18960 9405 -1.66742076918557e-01 18960 9429 -5.41995950758400e-07 18960 9909 -1.65162946727463e-05 18960 9933 -3.37284796292220e-02 18960 9957 -2.30669445532562e-01 18960 9981 -1.43978339114226e-01 18960 10005 -3.33212378989246e-03 18960 10557 -3.43528606209360e-05 18960 10581 -8.49783613857471e-05 18960 18960 7.36002245700809e+00 18960 18096 1.88757505487656e-02 18960 18120 1.54254250016213e-01 18960 18144 3.55382750414309e-01 18960 18168 1.64759282144910e-01 18960 18192 2.15020085809397e-02 18960 18504 1.52289957766923e-01 18960 18528 1.23744127312556e+00 18960 18552 2.83430511093293e+00 18960 18576 1.30383898179606e+00 18960 18600 1.68889384934549e-01 18960 18912 3.45459097587975e-01 18960 18936 2.79178445855528e+00 18960 18984 2.90903241462986e+00 18960 19008 3.74771086606620e-01 18960 19320 1.54529054578928e-01 18960 19344 1.24375673824569e+00 18960 19368 2.82694718723969e+00 18960 19392 1.30506473169344e+00 18960 19416 1.69856052940867e-01 18960 19728 1.94355247517668e-02 18960 19752 1.55833116296245e-01 18960 19776 3.53543269490997e-01 18960 19800 1.65065719619254e-01 18960 19824 2.17436755825191e-02 18961 18961 1.00000000000000e+00 18962 18962 1.00000000000000e+00 18963 18963 1.00000000000000e+00 18964 18964 1.00000000000000e+00 18965 18965 1.00000000000000e+00 18966 18966 1.00000000000000e+00 18967 18967 1.00000000000000e+00 18968 18968 1.00000000000000e+00 18969 18969 1.00000000000000e+00 18970 18970 1.00000000000000e+00 18971 18971 1.00000000000000e+00 18972 18972 1.00000000000000e+00 18973 18973 1.00000000000000e+00 18974 18974 1.00000000000000e+00 18975 18975 1.00000000000000e+00 18976 18976 1.00000000000000e+00 18977 18977 1.00000000000000e+00 18978 18978 1.00000000000000e+00 18979 18979 1.00000000000000e+00 18980 18980 1.00000000000000e+00 18981 18981 1.00000000000000e+00 18982 18982 1.00000000000000e+00 18983 18983 1.00000000000000e+00 18984 7557 -1.55759882964494e-03 18984 7581 -1.95098127036782e-03 18984 7605 -3.41322157762282e-06 18984 8133 -4.15438031221900e-03 18984 8157 -2.58902342369894e-01 18984 8181 -6.49732174719316e-01 18984 8205 -2.07628844917461e-01 18984 8229 -2.60171715117962e-03 18984 8709 -8.46091646237500e-08 18984 8733 -1.06356067585760e-01 18984 8757 -2.64139157095854e+00 18984 8781 -6.61043386329543e+00 18984 8805 -1.98400933919518e+00 18984 8829 -7.35160147784674e-02 18984 9309 -1.05416003024269e-05 18984 9333 -1.34841749520497e-01 18984 9357 -2.99873944324051e+00 18984 9381 -7.77456076509343e+00 18984 9405 -2.45398170369842e+00 18984 9429 -6.14995665721275e-02 18984 9909 -6.94046372686310e-07 18984 9933 -1.19319310724471e-02 18984 9957 -4.57991835894882e-01 18984 9981 -1.05198764373597e+00 18984 10005 -3.41170327114194e-01 18984 10029 -1.97260203679888e-03 18984 10557 -3.89332230272227e-04 18984 10581 -9.38575092160608e-03 18984 10605 -3.19873872226573e-03 18984 18984 7.80038152703611e+00 18984 18120 1.96878119552877e-02 18984 18144 1.64759282144910e-01 18984 18168 3.89901358438711e-01 18984 18192 1.90733671077309e-01 18984 18216 2.61814091883874e-02 18984 18528 1.57070360514463e-01 18984 18552 1.30383898179606e+00 18984 18576 3.06407723868178e+00 18984 18600 1.49466441659608e+00 18984 18624 2.04776719214466e-01 18984 18936 3.52487017050829e-01 18984 18960 2.90903241462986e+00 18984 19008 3.30531284354305e+00 18984 19032 4.51557124279125e-01 18984 19344 1.56410129982490e-01 18984 19368 1.30506473169344e+00 18984 19392 3.07484360048562e+00 18984 19416 1.48237070556028e+00 18984 19440 2.00736623449200e-01 18984 19752 1.95227543222945e-02 18984 19776 1.65065719619254e-01 18984 19800 3.92592948889671e-01 18984 19824 1.87660243318360e-01 18984 19848 2.51713852470709e-02 18985 18985 1.00000000000000e+00 18986 18986 1.00000000000000e+00 18987 18987 1.00000000000000e+00 18988 18988 1.00000000000000e+00 18989 18989 1.00000000000000e+00 18990 18990 1.00000000000000e+00 18991 18991 1.00000000000000e+00 18992 18992 1.00000000000000e+00 18993 18993 1.00000000000000e+00 18994 18994 1.00000000000000e+00 18995 18995 1.00000000000000e+00 18996 18996 1.00000000000000e+00 18997 18997 1.00000000000000e+00 18998 18998 1.00000000000000e+00 18999 18999 1.00000000000000e+00 19000 19000 1.00000000000000e+00 19001 19001 1.00000000000000e+00 19002 19002 1.00000000000000e+00 19003 19003 1.00000000000000e+00 19004 19004 1.00000000000000e+00 19005 19005 1.00000000000000e+00 19006 19006 1.00000000000000e+00 19007 19007 1.00000000000000e+00 19008 7557 -5.66768020861000e-09 19008 7581 -4.68288025480873e-06 19008 7605 -3.49414465273940e-07 19008 8157 -5.17996492292182e-03 19008 8181 -1.16903644012218e-01 19008 8205 -1.36403831570535e-01 19008 8229 -9.14157579495108e-03 19008 8733 -2.04089667481579e-05 19008 8757 -2.64974126596226e-01 19008 8781 -2.73881420483968e+00 19008 8805 -3.53361738223862e+00 19008 8829 -4.38209835369894e-01 19008 8853 -3.70637046823073e-03 19008 9333 -2.36917694260559e-03 19008 9357 -6.49578675580681e-01 19008 9381 -7.47852153566624e+00 19008 9405 -8.73478129569136e+00 19008 9429 -9.67865603429286e-01 19008 9453 -6.34375125082223e-03 19008 9933 -1.06285179056373e-03 19008 9957 -2.16006340598430e-01 19008 9981 -2.31875979400018e+00 19008 10005 -2.24353417678795e+00 19008 10029 -3.02145747279519e-01 19008 10053 -1.30941825009838e-04 19008 10557 -1.04490660266625e-03 19008 10581 -4.79131606910225e-02 19008 10605 -5.62077263860385e-02 19008 10629 -4.02463253813658e-03 19008 11205 -1.37368931380000e-10 19008 11229 -1.90423473400000e-11 19008 19008 8.94270722031861e+00 19008 18144 2.15020085809397e-02 19008 18168 1.90733671077309e-01 19008 18192 4.58194494919177e-01 19008 18216 1.75885394049702e-01 19008 18240 1.77899393240382e-02 19008 18552 1.68889384934549e-01 19008 18576 1.49466441659608e+00 19008 18600 3.59438648349407e+00 19008 18624 1.41538524136981e+00 19008 18648 1.49069591127982e-01 19008 18960 3.74771086606620e-01 19008 18984 3.30531284354305e+00 19008 19032 3.17831707809935e+00 19008 19056 3.43022145245697e-01 19008 19368 1.69856052940867e-01 19008 19392 1.48237070556028e+00 19008 19416 3.51392334433734e+00 19008 19440 1.33207175863362e+00 19008 19464 1.32281316209201e-01 19008 19776 2.17436755825191e-02 19008 19800 1.87660243318360e-01 19008 19824 4.38078710129996e-01 19008 19848 1.55057023365656e-01 19008 19872 1.35928705943431e-02 19009 19009 1.00000000000000e+00 19010 19010 1.00000000000000e+00 19011 19011 1.00000000000000e+00 19012 19012 1.00000000000000e+00 19013 19013 1.00000000000000e+00 19014 19014 1.00000000000000e+00 19015 19015 1.00000000000000e+00 19016 19016 1.00000000000000e+00 19017 19017 1.00000000000000e+00 19018 19018 1.00000000000000e+00 19019 19019 1.00000000000000e+00 19020 19020 1.00000000000000e+00 19021 19021 1.00000000000000e+00 19022 19022 1.00000000000000e+00 19023 19023 1.00000000000000e+00 19024 19024 1.00000000000000e+00 19025 19025 1.00000000000000e+00 19026 19026 1.00000000000000e+00 19027 19027 1.00000000000000e+00 19028 19028 1.00000000000000e+00 19029 19029 1.00000000000000e+00 19030 19030 1.00000000000000e+00 19031 19031 1.00000000000000e+00 19032 8181 -4.16543717404555e-03 19032 8205 -2.42284408096530e-02 19032 8229 -3.41592650809741e-03 19032 8757 -6.29502914319957e-04 19032 8781 -3.51322853426494e-01 19032 8805 -1.35404939750064e+00 19032 8829 -9.00428623635615e-01 19032 8853 -6.76799247529333e-02 19032 9357 -2.75991069040432e-02 19032 9381 -1.82669002690143e+00 19032 9405 -9.17219547194408e+00 19032 9429 -8.15239410774458e+00 19032 9453 -2.18132430886975e-01 19032 9957 -2.92956316988243e-02 19032 9981 -1.01464558466502e+00 19032 10005 -8.15750338257097e+00 19032 10029 -6.55683928723492e+00 19032 10053 -1.58080846130475e-02 19032 10557 -2.63403151354005e-04 19032 10581 -6.90657784007970e-02 19032 10605 -7.88820640174533e-01 19032 10629 -2.25446163389855e-01 19032 11205 -1.55434573406260e-07 19032 11229 -2.25852715468000e-08 19032 19032 1.01339764526106e+01 19032 18168 2.61814091883874e-02 19032 18192 1.75885394049702e-01 19032 18216 4.07864297898995e-01 19032 18240 2.65247476348145e-01 19032 18576 2.04776719214466e-01 19032 18600 1.41538524136981e+00 19032 18624 3.71364396652325e+00 19032 18648 2.84378594303397e+00 19032 18984 4.51557124279125e-01 19032 19008 3.17831707809935e+00 19032 19056 7.76021858978294e+00 19032 19392 2.00736623449200e-01 19032 19416 1.33207175863362e+00 19032 19440 3.67164699493719e+00 19032 19464 3.23794388911826e+00 19032 19800 2.51713852470709e-02 19032 19824 1.55057023365656e-01 19032 19848 3.97365055002482e-01 19032 19872 3.63786962869216e-01 19033 19033 1.00000000000000e+00 19034 19034 1.00000000000000e+00 19035 19035 1.00000000000000e+00 19036 19036 1.00000000000000e+00 19037 19037 1.00000000000000e+00 19038 19038 1.00000000000000e+00 19039 19039 1.00000000000000e+00 19040 19040 1.00000000000000e+00 19041 19041 1.00000000000000e+00 19042 19042 1.00000000000000e+00 19043 19043 1.00000000000000e+00 19044 19044 1.00000000000000e+00 19045 19045 1.00000000000000e+00 19046 19046 1.00000000000000e+00 19047 19047 1.00000000000000e+00 19048 19048 1.00000000000000e+00 19049 19049 1.00000000000000e+00 19050 19050 1.00000000000000e+00 19051 19051 1.00000000000000e+00 19052 19052 1.00000000000000e+00 19053 19053 1.00000000000000e+00 19054 19054 1.00000000000000e+00 19055 19055 1.00000000000000e+00 19056 8205 -3.37059951672547e-04 19056 8229 -3.08469849872081e-04 19056 8781 -1.97210171975278e-03 19056 8805 -1.68324535039271e-01 19056 8829 -6.14318709256893e-01 19056 8853 -1.09415256228251e-01 19056 9357 -9.93685121070000e-10 19056 9381 -8.98711480908172e-02 19056 9405 -4.85138247369461e+00 19056 9429 -1.11286651487522e+01 19056 9453 -3.91858603018194e-01 19056 9957 -1.25824412478920e-05 19056 9981 -1.55218139672086e-01 19056 10005 -9.15748002497577e+00 19056 10029 -1.10499459964699e+01 19056 10053 -3.06995764510260e-02 19056 10557 -2.87059089138052e-06 19056 10581 -3.85260548717767e-02 19056 10605 -1.26735440242571e+00 19056 10629 -4.22719899012753e-01 19056 11205 -3.09907564292870e-07 19056 11229 -4.50372466621900e-08 19056 19056 1.41192821628459e+01 19056 18192 1.77899393240382e-02 19056 18216 2.65247476348145e-01 19056 18240 4.05965377428023e-01 19056 18600 1.49069591127982e-01 19056 18624 2.84378594303397e+00 19056 18648 4.64408474817206e+00 19056 19008 3.43022145245697e-01 19056 19032 7.76021858978294e+00 19056 19416 1.32281316209201e-01 19056 19440 3.23794388911826e+00 19056 19464 5.54991856477209e+00 19056 19824 1.35928705943431e-02 19056 19848 3.63786962869216e-01 19056 19872 6.32423831578030e-01 19057 19057 1.00000000000000e+00 19058 19058 1.00000000000000e+00 19059 19059 1.00000000000000e+00 19060 19060 1.00000000000000e+00 19061 19061 1.00000000000000e+00 19062 19062 1.00000000000000e+00 19063 19063 1.00000000000000e+00 19064 19064 1.00000000000000e+00 19065 19065 1.00000000000000e+00 19066 19066 1.00000000000000e+00 19067 19067 1.00000000000000e+00 19068 19068 1.00000000000000e+00 19069 19069 1.00000000000000e+00 19070 19070 1.00000000000000e+00 19071 19071 1.00000000000000e+00 19072 19072 1.00000000000000e+00 19073 19073 1.00000000000000e+00 19074 19074 1.00000000000000e+00 19075 19075 1.00000000000000e+00 19076 19076 1.00000000000000e+00 19077 19077 1.00000000000000e+00 19078 19078 1.00000000000000e+00 19079 19079 1.00000000000000e+00 19080 4965 -3.07830518340563e-06 19080 4989 -8.52313646765136e-06 19080 5565 -8.31443655203374e-01 19080 5589 -1.42258422170922e+00 19080 5613 -1.68082945346771e-02 19080 5637 -4.41669362790000e-09 19080 6141 -1.72731756794411e-01 19080 6165 -1.14588221436150e+01 19080 6189 -6.32062101669712e+00 19080 6213 -7.96440172054076e-02 19080 6237 -1.23322260600600e-08 19080 6741 -9.91396379203772e-01 19080 6765 -9.88947253249624e+00 19080 6789 -2.69515405120270e+00 19080 6813 -3.89639863280268e-02 19080 7341 -1.98570423981029e-01 19080 7365 -5.86323053563021e-01 19080 7389 -9.96338200064888e-02 19080 7413 -3.09682943183141e-04 19080 7941 -6.63024342517000e-09 19080 7965 -2.42406379375067e-04 19080 7989 -1.55188264107729e-04 19080 19080 1.12567841678203e+01 19080 18264 8.03799324444096e-01 19080 18288 4.52658612056958e-01 19080 18312 1.45025570956886e-02 19080 18672 5.45773663356651e+00 19080 18696 3.22216462969512e+00 19080 18720 1.40941803689102e-01 19080 19104 6.39329861863208e+00 19080 19128 3.61401867063397e-01 19080 19488 4.17384933665300e+00 19080 19512 2.58960730429121e+00 19080 19536 1.43623610275629e-01 19080 19896 4.82827500215720e-01 19080 19920 2.94519280705982e-01 19080 19944 1.51730087423205e-02 19081 19081 1.00000000000000e+00 19082 19082 1.00000000000000e+00 19083 19083 1.00000000000000e+00 19084 19084 1.00000000000000e+00 19085 19085 1.00000000000000e+00 19086 19086 1.00000000000000e+00 19087 19087 1.00000000000000e+00 19088 19088 1.00000000000000e+00 19089 19089 1.00000000000000e+00 19090 19090 1.00000000000000e+00 19091 19091 1.00000000000000e+00 19092 19092 1.00000000000000e+00 19093 19093 1.00000000000000e+00 19094 19094 1.00000000000000e+00 19095 19095 1.00000000000000e+00 19096 19096 1.00000000000000e+00 19097 19097 1.00000000000000e+00 19098 19098 1.00000000000000e+00 19099 19099 1.00000000000000e+00 19100 19100 1.00000000000000e+00 19101 19101 1.00000000000000e+00 19102 19102 1.00000000000000e+00 19103 19103 1.00000000000000e+00 19104 4965 -1.54782487178358e-06 19104 4989 -4.28709318978555e-06 19104 5565 -4.48334279241382e-01 19104 5589 -9.00313035298752e-01 19104 5613 -4.59803680636693e-02 19104 5637 -8.87003356679482e-05 19104 6141 -9.11000637037529e-02 19104 6165 -7.40748823356977e+00 19104 6189 -6.90326339321341e+00 19104 6213 -7.34540317333673e-01 19104 6237 -1.27081830126297e-02 19104 6741 -5.54951980889222e-01 19104 6765 -8.42168416152380e+00 19104 6789 -7.85669670876060e+00 19104 6813 -1.28251347224221e+00 19104 6837 -8.39152786425444e-03 19104 7341 -1.24352589445776e-01 19104 7365 -9.28686431603779e-01 19104 7389 -1.16968533203042e+00 19104 7413 -2.23748796928774e-01 19104 7437 -2.73146508523378e-05 19104 7941 -2.84816028581600e-08 19104 7965 -4.43604484561122e-03 19104 7989 -2.03872129237748e-02 19104 8013 -1.73381330431109e-03 19104 19104 9.72287790042682e+00 19104 18264 4.52658612056958e-01 19104 18288 4.53459503715138e-01 19104 18312 1.54387821770827e-01 19104 18336 2.40943983470182e-02 19104 18672 3.22216462969512e+00 19104 18696 3.78477955217482e+00 19104 18720 1.36581515747559e+00 19104 18744 2.00511985679792e-01 19104 19080 6.39329861863208e+00 19104 19128 3.31201727714562e+00 19104 19152 4.66602452222991e-01 19104 19488 2.58960730429121e+00 19104 19512 3.51355052713257e+00 19104 19536 1.40655976561496e+00 19104 19560 2.08016331128107e-01 19104 19896 2.94519280705982e-01 19104 19920 3.85652247454574e-01 19104 19944 1.64573973805669e-01 19104 19968 2.59704847090969e-02 19105 19105 1.00000000000000e+00 19106 19106 1.00000000000000e+00 19107 19107 1.00000000000000e+00 19108 19108 1.00000000000000e+00 19109 19109 1.00000000000000e+00 19110 19110 1.00000000000000e+00 19111 19111 1.00000000000000e+00 19112 19112 1.00000000000000e+00 19113 19113 1.00000000000000e+00 19114 19114 1.00000000000000e+00 19115 19115 1.00000000000000e+00 19116 19116 1.00000000000000e+00 19117 19117 1.00000000000000e+00 19118 19118 1.00000000000000e+00 19119 19119 1.00000000000000e+00 19120 19120 1.00000000000000e+00 19121 19121 1.00000000000000e+00 19122 19122 1.00000000000000e+00 19123 19123 1.00000000000000e+00 19124 19124 1.00000000000000e+00 19125 19125 1.00000000000000e+00 19126 19126 1.00000000000000e+00 19127 19127 1.00000000000000e+00 19128 4965 -2.47779430879000e-09 19128 4989 -7.29284455996000e-09 19128 5565 -9.31784332562705e-03 19128 5589 -7.39964518854127e-02 19128 5613 -4.35511837740988e-02 19128 5637 -3.83180860003058e-04 19128 6141 -1.35262437329919e-03 19128 6165 -5.14460043694646e-01 19128 6189 -2.77314972883565e+00 19128 6213 -2.01546910711482e+00 19128 6237 -1.27093248179565e-01 19128 6261 -2.50271011591095e-04 19128 6741 -1.69311411195078e-02 19128 6765 -1.52603805139535e+00 19128 6789 -1.02216097184029e+01 19128 6813 -6.17588936427211e+00 19128 6837 -3.90543641669703e-01 19128 6861 -4.06769525242688e-04 19128 7341 -7.17949674489160e-03 19128 7365 -6.43339735310626e-01 19128 7389 -3.73623591502844e+00 19128 7413 -2.18514483610325e+00 19128 7437 -1.44363945467564e-01 19128 7461 -3.47987915137000e-08 19128 7941 -1.44727600551000e-08 19128 7965 -1.45815447323936e-02 19128 7989 -1.36848367689043e-01 19128 8013 -8.66559427129917e-02 19128 8037 -1.59366967251027e-03 19128 8589 -3.98147192210430e-07 19128 8613 -1.59177904572115e-06 19128 19128 9.20734770868319e+00 19128 18264 1.45025570956886e-02 19128 18288 1.54387821770827e-01 19128 18312 4.21236485964566e-01 19128 18336 1.81271814654417e-01 19128 18360 2.12235553165861e-02 19128 18672 1.40941803689102e-01 19128 18696 1.36581515747559e+00 19128 18720 3.51831670951067e+00 19128 18744 1.47878048249847e+00 19128 18768 1.69183134944820e-01 19128 19080 3.61401867063397e-01 19128 19104 3.31201727714562e+00 19128 19152 3.38763623309856e+00 19128 19176 3.80306606051632e-01 19128 19488 1.43623610275629e-01 19128 19512 1.40655976561496e+00 19128 19536 3.64388340608846e+00 19128 19560 1.52005931556464e+00 19128 19584 1.71998497763048e-01 19128 19896 1.51730087423205e-02 19128 19920 1.64573973805669e-01 19128 19944 4.52628160109014e-01 19128 19968 1.91591522920960e-01 19128 19992 2.19273960211432e-02 19129 19129 1.00000000000000e+00 19130 19130 1.00000000000000e+00 19131 19131 1.00000000000000e+00 19132 19132 1.00000000000000e+00 19133 19133 1.00000000000000e+00 19134 19134 1.00000000000000e+00 19135 19135 1.00000000000000e+00 19136 19136 1.00000000000000e+00 19137 19137 1.00000000000000e+00 19138 19138 1.00000000000000e+00 19139 19139 1.00000000000000e+00 19140 19140 1.00000000000000e+00 19141 19141 1.00000000000000e+00 19142 19142 1.00000000000000e+00 19143 19143 1.00000000000000e+00 19144 19144 1.00000000000000e+00 19145 19145 1.00000000000000e+00 19146 19146 1.00000000000000e+00 19147 19147 1.00000000000000e+00 19148 19148 1.00000000000000e+00 19149 19149 1.00000000000000e+00 19150 19150 1.00000000000000e+00 19151 19151 1.00000000000000e+00 19152 5589 -5.38291298606242e-03 19152 5613 -9.40248882104703e-03 19152 5637 -2.02465739836171e-04 19152 6165 -9.42561470530939e-03 19152 6189 -4.95781694150880e-01 19152 6213 -1.11422845009594e+00 19152 6237 -3.54816042167551e-01 19152 6261 -5.97175117773273e-03 19152 6285 -9.21392776400000e-11 19152 6741 -4.00202380170110e-07 19152 6765 -1.43573546139144e-01 19152 6789 -3.40775270230960e+00 19152 6813 -8.01336539963230e+00 19152 6837 -2.22780410194087e+00 19152 6861 -7.37384779871934e-02 19152 6885 -6.06677257560000e-10 19152 7341 -4.68162706606922e-06 19152 7365 -1.31722113288671e-01 19152 7389 -2.64775831761194e+00 19152 7413 -6.49493602195014e+00 19152 7437 -1.93483237870046e+00 19152 7461 -4.55087334551140e-02 19152 7941 -1.96062915748000e-09 19152 7965 -5.36026349040977e-03 19152 7989 -2.65399292796336e-01 19152 8013 -6.02940997111866e-01 19152 8037 -1.78671550878463e-01 19152 8061 -7.98683687606945e-04 19152 8589 -1.33092751663788e-05 19152 8613 -1.93303940305548e-03 19152 8637 -8.99956012314750e-04 19152 19152 7.90720107965357e+00 19152 18288 2.40943983470182e-02 19152 18312 1.81271814654417e-01 19152 18336 3.83034098986024e-01 19152 18360 1.62345483560858e-01 19152 18384 1.93628155736283e-02 19152 18696 2.00511985679792e-01 19152 18720 1.47878048249846e+00 19152 18744 3.06392335696745e+00 19152 18768 1.30265738846122e+00 19152 18792 1.56481212170482e-01 19152 19104 4.66602452222991e-01 19152 19128 3.38763623309856e+00 19152 19176 2.94399814662349e+00 19152 19200 3.55692930604227e-01 19152 19512 2.08016331128107e-01 19152 19536 1.52005931556464e+00 19152 19560 3.11986350731981e+00 19152 19584 1.32747883898367e+00 19152 19608 1.59871211982866e-01 19152 19920 2.59704847090969e-02 19152 19944 1.91591522920960e-01 19152 19968 3.97019136574113e-01 19152 19992 1.68550846191471e-01 19152 20016 2.02103155267244e-02 19153 19153 1.00000000000000e+00 19154 19154 1.00000000000000e+00 19155 19155 1.00000000000000e+00 19156 19156 1.00000000000000e+00 19157 19157 1.00000000000000e+00 19158 19158 1.00000000000000e+00 19159 19159 1.00000000000000e+00 19160 19160 1.00000000000000e+00 19161 19161 1.00000000000000e+00 19162 19162 1.00000000000000e+00 19163 19163 1.00000000000000e+00 19164 19164 1.00000000000000e+00 19165 19165 1.00000000000000e+00 19166 19166 1.00000000000000e+00 19167 19167 1.00000000000000e+00 19168 19168 1.00000000000000e+00 19169 19169 1.00000000000000e+00 19170 19170 1.00000000000000e+00 19171 19171 1.00000000000000e+00 19172 19172 1.00000000000000e+00 19173 19173 1.00000000000000e+00 19174 19174 1.00000000000000e+00 19175 19175 1.00000000000000e+00 19176 5589 -2.31168330062650e-07 19176 5613 -1.52153242486526e-04 19176 5637 -2.84457677356835e-05 19176 6189 -9.94001768869147e-03 19176 6213 -1.90496251634996e-01 19176 6237 -2.26074176801012e-01 19176 6261 -2.21346096836278e-02 19176 6285 -2.63632843519911e-06 19176 6765 -4.68209319752302e-05 19176 6789 -3.13158933648098e-01 19176 6813 -3.09628035087761e+00 19176 6837 -3.75690140381861e+00 19176 6861 -5.34791752860116e-01 19176 6885 -6.88640208816345e-03 19176 7365 -1.98398564923313e-03 19176 7389 -5.43816655026169e-01 19176 7413 -5.76875780633062e+00 19176 7437 -7.13291989148037e+00 19176 7461 -9.98666130461218e-01 19176 7485 -7.22537427582608e-03 19176 7965 -4.73461040574706e-04 19176 7989 -1.18129358804483e-01 19176 8013 -1.32965709172447e+00 19176 8037 -1.48988839847490e+00 19176 8061 -2.35972834052831e-01 19176 8085 -6.59348435444695e-05 19176 8589 -4.77885378091516e-05 19176 8613 -1.50083400241685e-02 19176 8637 -3.58048723393153e-02 19176 8661 -2.75454565147809e-03 19176 19176 7.41816968014250e+00 19176 18312 2.12235553165861e-02 19176 18336 1.62345483560858e-01 19176 18360 3.50415416818369e-01 19176 18384 1.54998511589434e-01 19176 18408 1.93868123237301e-02 19176 18720 1.69183134944820e-01 19176 18744 1.30265738846122e+00 19176 18768 2.82739787882997e+00 19176 18792 1.24398624531148e+00 19176 18816 1.54515349157384e-01 19176 19128 3.80306606051632e-01 19176 19152 2.94399814662349e+00 19176 19200 2.80987646010902e+00 19176 19224 3.46776184423014e-01 19176 19536 1.71998497763048e-01 19176 19560 1.32747883898367e+00 19176 19584 2.88497387994914e+00 19176 19608 1.25962880977219e+00 19176 19632 1.55035990460178e-01 19176 19944 2.19273960211432e-02 19176 19968 1.68550846191471e-01 19176 19992 3.64809417098163e-01 19176 20016 1.58909152704612e-01 19176 20040 1.95169726494285e-02 19177 19177 1.00000000000000e+00 19178 19178 1.00000000000000e+00 19179 19179 1.00000000000000e+00 19180 19180 1.00000000000000e+00 19181 19181 1.00000000000000e+00 19182 19182 1.00000000000000e+00 19183 19183 1.00000000000000e+00 19184 19184 1.00000000000000e+00 19185 19185 1.00000000000000e+00 19186 19186 1.00000000000000e+00 19187 19187 1.00000000000000e+00 19188 19188 1.00000000000000e+00 19189 19189 1.00000000000000e+00 19190 19190 1.00000000000000e+00 19191 19191 1.00000000000000e+00 19192 19192 1.00000000000000e+00 19193 19193 1.00000000000000e+00 19194 19194 1.00000000000000e+00 19195 19195 1.00000000000000e+00 19196 19196 1.00000000000000e+00 19197 19197 1.00000000000000e+00 19198 19198 1.00000000000000e+00 19199 19199 1.00000000000000e+00 19200 6213 -6.15205480232559e-03 19200 6237 -4.32773454137620e-02 19200 6261 -1.29819148068436e-02 19200 6285 -1.09340842857504e-05 19200 6789 -8.50483332369755e-04 19200 6813 -3.81038440366006e-01 19200 6837 -1.73159753784740e+00 19200 6861 -1.14368139928720e+00 19200 6885 -6.74916128452624e-02 19200 6909 -1.03213653480996e-04 19200 7389 -2.16090931874467e-02 19200 7413 -1.49717127446901e+00 19200 7437 -7.82063470981179e+00 19200 7461 -4.54342432343407e+00 19200 7485 -3.03095516402849e-01 19200 7509 -3.08191473876535e-04 19200 7989 -1.51559787944259e-02 19200 8013 -7.66829074925672e-01 19200 8037 -3.84397367768761e+00 19200 8061 -2.30931516770857e+00 19200 8085 -1.55713479595500e-01 19200 8109 -6.25027141297630e-07 19200 8589 -1.38112665047084e-05 19200 8613 -3.19984746935322e-02 19200 8637 -2.15879675201223e-01 19200 8661 -1.30268316315284e-01 19200 8685 -3.14675205445588e-03 19200 9237 -2.76739317972468e-05 19200 9261 -7.18384143752448e-05 19200 19200 7.24442172701005e+00 19200 18336 1.93628155736283e-02 19200 18360 1.54998511589434e-01 19200 18384 3.48181904617084e-01 19200 18408 1.52067616750013e-01 19200 18432 1.86300918637732e-02 19200 18744 1.56481212170482e-01 19200 18768 1.24398624531148e+00 19200 18792 2.77880822339924e+00 19200 18816 1.21838709547176e+00 19200 18840 1.50081424710553e-01 19200 19152 3.55692930604227e-01 19200 19176 2.80987646010902e+00 19200 19224 2.74834412024162e+00 19200 19248 3.40309845637378e-01 19200 19560 1.59871211982866e-01 19200 19584 1.25962880977219e+00 19200 19608 2.79375021560829e+00 19200 19632 1.23335658689082e+00 19200 19656 1.53303156262525e-01 19200 19968 2.02103155267244e-02 19200 19992 1.58909152704612e-01 19200 20016 3.51917402669347e-01 19200 20040 1.55809989604779e-01 19200 20064 1.94355247517662e-02 19201 19201 1.00000000000000e+00 19202 19202 1.00000000000000e+00 19203 19203 1.00000000000000e+00 19204 19204 1.00000000000000e+00 19205 19205 1.00000000000000e+00 19206 19206 1.00000000000000e+00 19207 19207 1.00000000000000e+00 19208 19208 1.00000000000000e+00 19209 19209 1.00000000000000e+00 19210 19210 1.00000000000000e+00 19211 19211 1.00000000000000e+00 19212 19212 1.00000000000000e+00 19213 19213 1.00000000000000e+00 19214 19214 1.00000000000000e+00 19215 19215 1.00000000000000e+00 19216 19216 1.00000000000000e+00 19217 19217 1.00000000000000e+00 19218 19218 1.00000000000000e+00 19219 19219 1.00000000000000e+00 19220 19220 1.00000000000000e+00 19221 19221 1.00000000000000e+00 19222 19222 1.00000000000000e+00 19223 19223 1.00000000000000e+00 19224 6237 -1.55307223477492e-03 19224 6261 -2.01993850345177e-03 19224 6285 -4.19657041456247e-06 19224 6813 -3.87791204741474e-03 19224 6837 -2.51669427949074e-01 19224 6861 -6.00080589743577e-01 19224 6885 -1.83173325846020e-01 19224 6909 -2.06384177255707e-03 19224 7389 -5.76558717979400e-08 19224 7413 -1.01039043382732e-01 19224 7437 -2.48901865479237e+00 19224 7461 -5.99220336649916e+00 19224 7485 -1.66908141813579e+00 19224 7509 -5.45870460972288e-02 19224 7989 -8.12642191870767e-06 19224 8013 -1.28438112447600e-01 19224 8037 -2.71989718090500e+00 19224 8061 -6.82542888510078e+00 19224 8085 -1.96287925132751e+00 19224 8109 -4.68504653711728e-02 19224 8589 -5.23645026792820e-07 19224 8613 -1.07863231621519e-02 19224 8637 -3.98034187425589e-01 19224 8661 -8.64674467026409e-01 19224 8685 -2.60977235824410e-01 19224 8709 -1.58782338679893e-03 19224 9237 -2.81844181765466e-04 19224 9261 -6.94726832043430e-03 19224 9285 -2.44491993247956e-03 19224 19224 7.12836795763667e+00 19224 18360 1.93868123237301e-02 19224 18384 1.52067616750013e-01 19224 18408 3.35911225734989e-01 19224 18432 1.48292141818645e-01 19224 18456 1.84429435908880e-02 19224 18768 1.54515349157384e-01 19224 18792 1.21838709547176e+00 19224 18816 2.70433855902271e+00 19224 18840 1.19440735682797e+00 19224 18864 1.48520414496436e-01 19224 19176 3.46776184423014e-01 19224 19200 2.74834412024163e+00 19224 19248 2.70777635461112e+00 19224 19272 3.36634243015388e-01 19224 19584 1.55035990460178e-01 19224 19608 1.23335658689082e+00 19224 19632 2.75942208636537e+00 19224 19656 1.21935500786909e+00 19224 19680 1.51535595704744e-01 19224 19992 1.95169726494285e-02 19224 20016 1.55809989604779e-01 19224 20040 3.49682107570653e-01 19224 20064 1.54529054578925e-01 19224 20088 1.91967388929650e-02 19225 19225 1.00000000000000e+00 19226 19226 1.00000000000000e+00 19227 19227 1.00000000000000e+00 19228 19228 1.00000000000000e+00 19229 19229 1.00000000000000e+00 19230 19230 1.00000000000000e+00 19231 19231 1.00000000000000e+00 19232 19232 1.00000000000000e+00 19233 19233 1.00000000000000e+00 19234 19234 1.00000000000000e+00 19235 19235 1.00000000000000e+00 19236 19236 1.00000000000000e+00 19237 19237 1.00000000000000e+00 19238 19238 1.00000000000000e+00 19239 19239 1.00000000000000e+00 19240 19240 1.00000000000000e+00 19241 19241 1.00000000000000e+00 19242 19242 1.00000000000000e+00 19243 19243 1.00000000000000e+00 19244 19244 1.00000000000000e+00 19245 19245 1.00000000000000e+00 19246 19246 1.00000000000000e+00 19247 19247 1.00000000000000e+00 19248 6237 -3.17062769720000e-09 19248 6261 -4.56708922212469e-06 19248 6285 -3.90152634118480e-07 19248 6837 -4.43884181165065e-03 19248 6861 -9.93778601986994e-02 19248 6885 -1.06320221811238e-01 19248 6909 -7.05238029109584e-03 19248 7413 -1.54190474932792e-05 19248 7437 -2.34465262564643e-01 19248 7461 -2.23326814143203e+00 19248 7485 -2.67868645090644e+00 19248 7509 -3.71678060230656e-01 19248 7533 -4.14430081245748e-03 19248 8013 -1.94985337928621e-03 19248 8037 -5.54442084415405e-01 19248 8061 -5.79840393114079e+00 19248 8085 -6.90984690437402e+00 19248 8109 -9.17064794435832e-01 19248 8133 -7.04436337218187e-03 19248 8613 -8.71566016129873e-04 19248 8637 -1.70937578879020e-01 19248 8661 -1.80327671377134e+00 19248 8685 -1.99343558131643e+00 19248 8709 -3.05397524757637e-01 19248 8733 -1.47971231592432e-04 19248 9237 -7.15434311001539e-04 19248 9261 -4.21980672869894e-02 19248 9285 -6.87655032636453e-02 19248 9309 -5.35878571918443e-03 19248 9885 -6.64224849700000e-11 19248 9909 -1.00590931000000e-11 19248 19248 7.06341460812454e+00 19248 18384 1.86300918637732e-02 19248 18408 1.48292141818645e-01 19248 18432 3.32330993322271e-01 19248 18456 1.48226990380710e-01 19248 18480 1.86138040042894e-02 19248 18792 1.50081424710553e-01 19248 18816 1.19440735682797e+00 19248 18840 2.67573010259266e+00 19248 18864 1.19136984174207e+00 19248 18888 1.49322045939077e-01 19248 19200 3.40309845637378e-01 19248 19224 2.70777635461112e+00 19248 19272 2.69436446902454e+00 19248 19296 3.36956874240732e-01 19248 19608 1.53303156262525e-01 19248 19632 1.21935500786909e+00 19248 19656 2.72824251965546e+00 19248 19680 1.20762171128691e+00 19248 19704 1.50369832116981e-01 19248 20016 1.94355247517662e-02 19248 20040 1.54529054578925e-01 19248 20064 3.45459097587972e-01 19248 20088 1.52289957766922e-01 19248 20112 1.88757505487655e-02 19249 19249 1.00000000000000e+00 19250 19250 1.00000000000000e+00 19251 19251 1.00000000000000e+00 19252 19252 1.00000000000000e+00 19253 19253 1.00000000000000e+00 19254 19254 1.00000000000000e+00 19255 19255 1.00000000000000e+00 19256 19256 1.00000000000000e+00 19257 19257 1.00000000000000e+00 19258 19258 1.00000000000000e+00 19259 19259 1.00000000000000e+00 19260 19260 1.00000000000000e+00 19261 19261 1.00000000000000e+00 19262 19262 1.00000000000000e+00 19263 19263 1.00000000000000e+00 19264 19264 1.00000000000000e+00 19265 19265 1.00000000000000e+00 19266 19266 1.00000000000000e+00 19267 19267 1.00000000000000e+00 19268 19268 1.00000000000000e+00 19269 19269 1.00000000000000e+00 19270 19270 1.00000000000000e+00 19271 19271 1.00000000000000e+00 19272 6861 -2.89134898941356e-03 19272 6885 -1.79537556714430e-02 19272 6909 -3.03185917096310e-03 19272 7437 -4.24155580695294e-04 19272 7461 -2.57273709859605e-01 19272 7485 -1.14383406827340e+00 19272 7509 -7.34647396723042e-01 19272 7533 -3.79318522441517e-02 19272 7557 -3.67018070179617e-05 19272 8037 -1.97985618629702e-02 19272 8061 -1.43848699559361e+00 19272 8085 -7.08479211929123e+00 19272 8109 -3.94652603057978e+00 19272 8133 -2.53821298188303e-01 19272 8157 -2.44302264716895e-04 19272 8637 -2.12466860893380e-02 19272 8661 -9.64335460689662e-01 19272 8685 -4.76234705419659e+00 19272 8709 -2.74137618073184e+00 19272 8733 -1.75776519637661e-01 19272 8757 -3.38983153372558e-06 19272 9237 -1.83814698169986e-04 19272 9261 -7.01592677812317e-02 19272 9285 -3.73523759437000e-01 19272 9309 -2.12078387164964e-01 19272 9333 -6.28028490483826e-03 19272 9885 -3.19949948932872e-04 19272 9909 -5.78508518996045e-04 19272 9933 -1.78107971630000e-10 19272 19272 7.06385545660231e+00 19272 18408 1.84429435908880e-02 19272 18432 1.48226990380710e-01 19272 18456 3.34706751250407e-01 19272 18480 1.48226990380709e-01 19272 18504 1.84429435908878e-02 19272 18816 1.48520414496436e-01 19272 18840 1.19136984174207e+00 19272 18864 2.68596529134037e+00 19272 18888 1.19045675103090e+00 19272 18912 1.48292141818644e-01 19272 19224 3.36634243015388e-01 19272 19248 2.69436446902454e+00 19272 19296 2.69147239990295e+00 19272 19320 3.35911225734991e-01 19272 19632 1.51535595704744e-01 19272 19656 1.20762171128691e+00 19272 19680 2.70952052632652e+00 19272 19704 1.20974979546801e+00 19272 19728 1.52067616750017e-01 19272 20040 1.91967388929650e-02 19272 20064 1.52289957766922e-01 19272 20088 3.40595559996944e-01 19272 20112 1.53050251489986e-01 19272 20136 1.93868123237310e-02 19273 19273 1.00000000000000e+00 19274 19274 1.00000000000000e+00 19275 19275 1.00000000000000e+00 19276 19276 1.00000000000000e+00 19277 19277 1.00000000000000e+00 19278 19278 1.00000000000000e+00 19279 19279 1.00000000000000e+00 19280 19280 1.00000000000000e+00 19281 19281 1.00000000000000e+00 19282 19282 1.00000000000000e+00 19283 19283 1.00000000000000e+00 19284 19284 1.00000000000000e+00 19285 19285 1.00000000000000e+00 19286 19286 1.00000000000000e+00 19287 19287 1.00000000000000e+00 19288 19288 1.00000000000000e+00 19289 19289 1.00000000000000e+00 19290 19290 1.00000000000000e+00 19291 19291 1.00000000000000e+00 19292 19292 1.00000000000000e+00 19293 19293 1.00000000000000e+00 19294 19294 1.00000000000000e+00 19295 19295 1.00000000000000e+00 19296 6885 -3.62720964486766e-04 19296 6909 -3.45218003082504e-04 19296 7461 -1.81437017932958e-03 19296 7485 -1.52427932049994e-01 19296 7509 -3.57157477180811e-01 19296 7533 -9.59262161090056e-02 19296 7557 -5.27208835272886e-04 19296 8037 -5.56057466610000e-10 19296 8061 -8.88788763992173e-02 19296 8085 -2.12020356069701e+00 19296 8109 -4.82545053729418e+00 19296 8133 -1.32125388491843e+00 19296 8157 -4.04287971817133e-02 19296 8637 -1.39127671343209e-05 19296 8661 -1.52428787925998e-01 19296 8685 -3.12316738344965e+00 19296 8709 -7.56571605479377e+00 19296 8733 -2.04795403555762e+00 19296 8757 -4.94199897693986e-02 19296 9237 -3.16656089837684e-06 19296 9261 -2.16988591599808e-02 19296 9285 -6.28655875378798e-01 19296 9309 -1.29828131778269e+00 19296 9333 -3.86242857738413e-01 19296 9357 -2.84679740778393e-03 19296 9885 -2.16668756254669e-03 19296 9909 -1.99554679510908e-02 19296 9933 -5.56833331860732e-03 19296 19296 7.05170990002147e+00 19296 18432 1.86138040042894e-02 19296 18456 1.48226990380709e-01 19296 18480 3.32388061491716e-01 19296 18504 1.48520414496437e-01 19296 18528 1.86871600332214e-02 19296 18840 1.49322045939077e-01 19296 18864 1.19045675103090e+00 19296 18888 2.67230601242578e+00 19296 18912 1.19440735682796e+00 19296 18936 1.50309697388343e-01 19296 19248 3.36956874240732e-01 19296 19272 2.69147239990295e+00 19296 19320 2.70433855902268e+00 19296 19344 3.40173414020667e-01 19296 19656 1.50369832116981e-01 19296 19680 1.20974979546801e+00 19296 19704 2.73598085723523e+00 19296 19728 1.21838709547177e+00 19296 19752 1.52529157117921e-01 19296 20064 1.88757505487655e-02 19296 20088 1.53050251489986e-01 19296 20112 3.48306772694077e-01 19296 20136 1.54515349157388e-01 19296 20160 1.92420249656160e-02 19297 19297 1.00000000000000e+00 19298 19298 1.00000000000000e+00 19299 19299 1.00000000000000e+00 19300 19300 1.00000000000000e+00 19301 19301 1.00000000000000e+00 19302 19302 1.00000000000000e+00 19303 19303 1.00000000000000e+00 19304 19304 1.00000000000000e+00 19305 19305 1.00000000000000e+00 19306 19306 1.00000000000000e+00 19307 19307 1.00000000000000e+00 19308 19308 1.00000000000000e+00 19309 19309 1.00000000000000e+00 19310 19310 1.00000000000000e+00 19311 19311 1.00000000000000e+00 19312 19312 1.00000000000000e+00 19313 19313 1.00000000000000e+00 19314 19314 1.00000000000000e+00 19315 19315 1.00000000000000e+00 19316 19316 1.00000000000000e+00 19317 19317 1.00000000000000e+00 19318 19318 1.00000000000000e+00 19319 19319 1.00000000000000e+00 19320 7485 -2.06384177255705e-03 19320 7509 -5.45870460972284e-02 19320 7533 -4.68504653711731e-02 19320 7557 -1.58782338679897e-03 19320 8061 -4.19657041456259e-06 19320 8085 -1.83173325846021e-01 19320 8109 -1.66908141813578e+00 19320 8133 -1.96287925132751e+00 19320 8157 -2.60977235824414e-01 19320 8181 -2.44491993247958e-03 19320 8661 -2.01993850345186e-03 19320 8685 -6.00080589743586e-01 19320 8709 -5.99220336649907e+00 19320 8733 -6.82542888510070e+00 19320 8757 -8.64674467026424e-01 19320 8781 -6.94726832043436e-03 19320 9261 -1.55307223477499e-03 19320 9285 -2.51669427949044e-01 19320 9309 -2.48901865479225e+00 19320 9333 -2.71989718090498e+00 19320 9357 -3.98034187425601e-01 19320 9381 -2.81844181765471e-04 19320 9885 -3.87791204741476e-03 19320 9909 -1.01039043382733e-01 19320 9933 -1.28438112447604e-01 19320 9957 -1.07863231621524e-02 19320 10509 -5.76558717979500e-08 19320 10533 -8.12642191870804e-06 19320 10557 -5.23645026792840e-07 19320 19320 7.12836795763654e+00 19320 18456 1.84429435908878e-02 19320 18480 1.48520414496437e-01 19320 18504 3.36634243015395e-01 19320 18528 1.51535595704746e-01 19320 18552 1.91967388929652e-02 19320 18864 1.48292141818644e-01 19320 18888 1.19440735682796e+00 19320 18912 2.70777635461111e+00 19320 18936 1.21935500786910e+00 19320 18960 1.54529054578928e-01 19320 19272 3.35911225734991e-01 19320 19296 2.70433855902268e+00 19320 19344 2.75942208636538e+00 19320 19368 3.49682107570664e-01 19320 19680 1.52067616750017e-01 19320 19704 1.21838709547177e+00 19320 19728 2.74834412024160e+00 19320 19752 1.23335658689084e+00 19320 19776 1.55809989604785e-01 19320 20088 1.93868123237310e-02 19320 20112 1.54515349157388e-01 19320 20136 3.46776184423016e-01 19320 20160 1.55035990460182e-01 19320 20184 1.95169726494294e-02 19321 19321 1.00000000000000e+00 19322 19322 1.00000000000000e+00 19323 19323 1.00000000000000e+00 19324 19324 1.00000000000000e+00 19325 19325 1.00000000000000e+00 19326 19326 1.00000000000000e+00 19327 19327 1.00000000000000e+00 19328 19328 1.00000000000000e+00 19329 19329 1.00000000000000e+00 19330 19330 1.00000000000000e+00 19331 19331 1.00000000000000e+00 19332 19332 1.00000000000000e+00 19333 19333 1.00000000000000e+00 19334 19334 1.00000000000000e+00 19335 19335 1.00000000000000e+00 19336 19336 1.00000000000000e+00 19337 19337 1.00000000000000e+00 19338 19338 1.00000000000000e+00 19339 19339 1.00000000000000e+00 19340 19340 1.00000000000000e+00 19341 19341 1.00000000000000e+00 19342 19342 1.00000000000000e+00 19343 19343 1.00000000000000e+00 19344 7509 -1.27623034386605e-03 19344 7533 -6.53347571849024e-03 19344 7557 -4.98462211108435e-04 19344 8085 -1.88632296335786e-04 19344 8109 -1.75026824014732e-01 19344 8133 -7.75414771434278e-01 19344 8157 -4.78760119398739e-01 19344 8181 -2.03097815182611e-02 19344 8205 -7.58338003402621e-06 19344 8685 -1.82588596240218e-02 19344 8709 -1.41055889312210e+00 19344 8733 -6.53788922342889e+00 19344 8757 -3.51256895453253e+00 19344 8781 -2.18551967117541e-01 19344 8805 -1.86508968564513e-04 19344 9285 -2.92174748183974e-02 19344 9309 -1.24030980514068e+00 19344 9333 -6.03043027825411e+00 19344 9357 -3.29949882568257e+00 19344 9381 -2.01108282090764e-01 19344 9405 -1.05957427505541e-05 19344 9885 -9.28518009400151e-04 19344 9909 -1.39874140180191e-01 19344 9933 -6.40927707820481e-01 19344 9957 -3.49928920340783e-01 19344 9981 -1.21795169504231e-02 19344 10509 -3.91749617691160e-07 19344 10533 -1.89638474168428e-03 19344 10557 -2.45335414009294e-03 19344 10581 -9.85236182442100e-08 19344 19344 7.28740210760287e+00 19344 18480 1.86871600332214e-02 19344 18504 1.51535595704746e-01 19344 18528 3.45414760493992e-01 19344 18552 1.55106068265173e-01 19344 18576 1.95797781733280e-02 19344 18888 1.50309697388343e-01 19344 18912 1.21935500786910e+00 19344 18936 2.77918470063374e+00 19344 18960 1.24375673824569e+00 19344 18984 1.56410129982490e-01 19344 19296 3.40173414020667e-01 19344 19320 2.75942208636538e+00 19344 19368 2.80798832008811e+00 19344 19392 3.52314972451350e-01 19344 19704 1.52529157117921e-01 19344 19728 1.23335658689084e+00 19344 19752 2.80506450856896e+00 19344 19776 1.26154202951684e+00 19344 19800 1.59575517774422e-01 19344 20112 1.92420249656160e-02 19344 20136 1.55035990460182e-01 19344 20160 3.51884712477798e-01 19344 20184 1.59552391082962e-01 19344 20208 2.03711251213111e-02 19345 19345 1.00000000000000e+00 19346 19346 1.00000000000000e+00 19347 19347 1.00000000000000e+00 19348 19348 1.00000000000000e+00 19349 19349 1.00000000000000e+00 19350 19350 1.00000000000000e+00 19351 19351 1.00000000000000e+00 19352 19352 1.00000000000000e+00 19353 19353 1.00000000000000e+00 19354 19354 1.00000000000000e+00 19355 19355 1.00000000000000e+00 19356 19356 1.00000000000000e+00 19357 19357 1.00000000000000e+00 19358 19358 1.00000000000000e+00 19359 19359 1.00000000000000e+00 19360 19360 1.00000000000000e+00 19361 19361 1.00000000000000e+00 19362 19362 1.00000000000000e+00 19363 19363 1.00000000000000e+00 19364 19364 1.00000000000000e+00 19365 19365 1.00000000000000e+00 19366 19366 1.00000000000000e+00 19367 19367 1.00000000000000e+00 19368 7533 -4.25390998073094e-05 19368 7557 -2.95151509768490e-05 19368 8109 -8.00980653817322e-04 19368 8133 -9.46399802028869e-02 19368 8157 -2.13828212972157e-01 19368 8181 -4.65170820385612e-02 19368 8205 -7.26889822415108e-05 19368 8709 -7.95778024835346e-02 19368 8733 -1.83374722468628e+00 19368 8757 -3.97166244870867e+00 19368 8781 -1.08618188199012e+00 19368 8805 -3.06138592859706e-02 19368 9285 -2.24011129438353e-05 19368 9309 -1.85183137996147e-01 19368 9333 -3.65852053446203e+00 19368 9357 -8.57804786423748e+00 19368 9381 -2.25808474336946e+00 19368 9405 -5.53882674114027e-02 19368 9885 -1.04073115619183e-05 19368 9909 -4.05088426167672e-02 19368 9933 -9.90842359719990e-01 19368 9957 -2.02840327989389e+00 19368 9981 -6.12047630761578e-01 19368 10005 -5.13431393213643e-03 19368 10509 -7.02160393795420e-07 19368 10533 -1.05393873554721e-02 19368 10557 -5.22627933309404e-02 19368 10581 -1.24654553297146e-02 19368 19368 7.37694384582178e+00 19368 18504 1.91967388929652e-02 19368 18528 1.55106068265173e-01 19368 18552 3.53193527318910e-01 19368 18576 1.61200463304102e-01 19368 18600 2.07203376526976e-02 19368 18912 1.54529054578928e-01 19368 18936 1.24375673824569e+00 19368 18960 2.82694718723969e+00 19368 18984 1.30506473169344e+00 19368 19008 1.69856052940867e-01 19368 19320 3.49682107570664e-01 19368 19344 2.80798832008811e+00 19368 19392 2.97014860592261e+00 19368 19416 3.90222179029286e-01 19368 19728 1.55809989604785e-01 19368 19752 1.26154202951684e+00 19368 19776 2.88240510455081e+00 19368 19800 1.33184939331854e+00 19368 19824 1.73386830555210e-01 19368 20136 1.95169726494294e-02 19368 20160 1.59552391082962e-01 19368 20184 3.67058006646690e-01 19368 20208 1.67896628710378e-01 19368 20232 2.16030320562834e-02 19369 19369 1.00000000000000e+00 19370 19370 1.00000000000000e+00 19371 19371 1.00000000000000e+00 19372 19372 1.00000000000000e+00 19373 19373 1.00000000000000e+00 19374 19374 1.00000000000000e+00 19375 19375 1.00000000000000e+00 19376 19376 1.00000000000000e+00 19377 19377 1.00000000000000e+00 19378 19378 1.00000000000000e+00 19379 19379 1.00000000000000e+00 19380 19380 1.00000000000000e+00 19381 19381 1.00000000000000e+00 19382 19382 1.00000000000000e+00 19383 19383 1.00000000000000e+00 19384 19384 1.00000000000000e+00 19385 19385 1.00000000000000e+00 19386 19386 1.00000000000000e+00 19387 19387 1.00000000000000e+00 19388 19388 1.00000000000000e+00 19389 19389 1.00000000000000e+00 19390 19390 1.00000000000000e+00 19391 19391 1.00000000000000e+00 19392 8133 -9.85286141680794e-04 19392 8157 -2.95734225758226e-02 19392 8181 -1.83378568091775e-02 19392 8205 -1.77369989909076e-04 19392 8709 -5.60692149366310e-07 19392 8733 -1.43215743617078e-01 19392 8757 -1.29413504052000e+00 19392 8781 -1.52417843992889e+00 19392 8805 -1.98962185579807e-01 19392 8829 -1.58120002869859e-03 19392 9309 -2.05148678363380e-03 19392 9333 -6.65735053161053e-01 19392 9357 -6.59932721052855e+00 19392 9381 -7.39535321592714e+00 19392 9405 -9.54578846059274e-01 19392 9429 -8.17707393505394e-03 19392 9909 -2.65351095419140e-03 19392 9933 -3.78249300822858e-01 19392 9957 -3.73729413925663e+00 19392 9981 -4.21473093150740e+00 19392 10005 -6.13134529254241e-01 19392 10029 -6.01640639348692e-04 19392 10509 -1.61126130499370e-07 19392 10533 -1.42016680674160e-02 19392 10557 -2.40577424961947e-01 19392 10581 -2.85679637321188e-01 19392 10605 -2.65648743547438e-02 19392 11157 -1.69759551982024e-05 19392 11181 -2.68364539589372e-04 19392 11205 -9.74644038470928e-06 19392 19392 8.05020205385271e+00 19392 18528 1.95797781733280e-02 19392 18552 1.61200463304102e-01 19392 18576 3.76117951231718e-01 19392 18600 1.82932433071707e-01 19392 18624 2.50127706152292e-02 19392 18936 1.56410129982490e-01 19392 18960 1.30506473169344e+00 19392 18984 3.07484360048562e+00 19392 19008 1.48237070556028e+00 19392 19032 2.00736623449200e-01 19392 19344 3.52314972451350e-01 19392 19368 2.97014860592261e+00 19392 19416 3.37821758384736e+00 19392 19440 4.54332216932536e-01 19392 19752 1.59575517774422e-01 19392 19776 1.33184939331854e+00 19392 19800 3.14075947710282e+00 19392 19824 1.52152600400075e+00 19392 19848 2.06994670444974e-01 19392 20160 2.03711251213111e-02 19392 20184 1.67896628710378e-01 19392 20208 3.92596920386018e-01 19392 20232 1.92721257681825e-01 19392 20256 2.65772823641727e-02 19393 19393 1.00000000000000e+00 19394 19394 1.00000000000000e+00 19395 19395 1.00000000000000e+00 19396 19396 1.00000000000000e+00 19397 19397 1.00000000000000e+00 19398 19398 1.00000000000000e+00 19399 19399 1.00000000000000e+00 19400 19400 1.00000000000000e+00 19401 19401 1.00000000000000e+00 19402 19402 1.00000000000000e+00 19403 19403 1.00000000000000e+00 19404 19404 1.00000000000000e+00 19405 19405 1.00000000000000e+00 19406 19406 1.00000000000000e+00 19407 19407 1.00000000000000e+00 19408 19408 1.00000000000000e+00 19409 19409 1.00000000000000e+00 19410 19410 1.00000000000000e+00 19411 19411 1.00000000000000e+00 19412 19412 1.00000000000000e+00 19413 19413 1.00000000000000e+00 19414 19414 1.00000000000000e+00 19415 19415 1.00000000000000e+00 19416 8157 -4.92803893296500e-04 19416 8181 -1.95469579268333e-03 19416 8205 -4.38145079191083e-05 19416 8733 -7.26598831971743e-05 19416 8757 -1.26225497284198e-01 19416 8781 -5.91340677496710e-01 19416 8805 -3.59725190024001e-01 19416 8829 -1.02084568245077e-02 19416 8853 -1.83644152629420e-07 19416 9333 -1.82366467804072e-02 19416 9357 -1.52988192885990e+00 19416 9381 -6.98854935785908e+00 19416 9405 -3.48549779286629e+00 19416 9429 -1.70527780808150e-01 19416 9453 -1.13643062235917e-04 19416 9933 -4.20474139306113e-02 19416 9957 -1.86663739218361e+00 19416 9981 -8.83501779089221e+00 19416 10005 -3.72294246617871e+00 19416 10029 -1.67023864717951e-01 19416 10053 -1.97635568482043e-05 19416 10533 -3.21498529089224e-03 19416 10557 -3.19772793067162e-01 19416 10581 -1.23817040319275e+00 19416 10605 -4.87838300554057e-01 19416 10629 -1.48604071463110e-02 19416 11157 -8.75407316449926e-05 19416 11181 -7.88893963817180e-03 19416 11205 -7.04889861285736e-03 19416 11229 -1.74276804760183e-06 19416 19416 8.91745842228491e+00 19416 18552 2.07203376526976e-02 19416 18576 1.82932433071707e-01 19416 18600 4.40402125954322e-01 19416 18624 1.77960916292746e-01 19416 18648 1.94774584579572e-02 19416 18960 1.69856052940867e-01 19416 18984 1.48237070556028e+00 19416 19008 3.51392334433734e+00 19416 19032 1.33207175863362e+00 19416 19056 1.32281316209201e-01 19416 19368 3.90222179029286e-01 19416 19392 3.37821758384736e+00 19416 19440 2.84901195706921e+00 19416 19464 2.57920772334751e-01 19416 19776 1.73386830555210e-01 19416 19800 1.52152600400075e+00 19416 19824 3.62350257752147e+00 19416 19848 1.38078276116628e+00 19416 19872 1.38201019846591e-01 19416 20184 2.16030320562834e-02 19416 20208 1.92721257681825e-01 19416 20232 4.67796934250352e-01 19416 20256 1.90138666925909e-01 19416 20280 2.09573843673046e-02 19417 19417 1.00000000000000e+00 19418 19418 1.00000000000000e+00 19419 19419 1.00000000000000e+00 19420 19420 1.00000000000000e+00 19421 19421 1.00000000000000e+00 19422 19422 1.00000000000000e+00 19423 19423 1.00000000000000e+00 19424 19424 1.00000000000000e+00 19425 19425 1.00000000000000e+00 19426 19426 1.00000000000000e+00 19427 19427 1.00000000000000e+00 19428 19428 1.00000000000000e+00 19429 19429 1.00000000000000e+00 19430 19430 1.00000000000000e+00 19431 19431 1.00000000000000e+00 19432 19432 1.00000000000000e+00 19433 19433 1.00000000000000e+00 19434 19434 1.00000000000000e+00 19435 19435 1.00000000000000e+00 19436 19436 1.00000000000000e+00 19437 19437 1.00000000000000e+00 19438 19438 1.00000000000000e+00 19439 19439 1.00000000000000e+00 19440 8181 -7.35209993245760e-07 19440 8205 -3.64761453425580e-07 19440 8757 -3.83203401246173e-04 19440 8781 -7.03796648728676e-02 19440 8805 -1.30866721526177e-01 19440 8829 -1.99678375256180e-02 19440 8853 -5.06717717815100e-06 19440 9357 -8.46843250636792e-02 19440 9381 -1.66495891798114e+00 19440 9405 -3.32914583511339e+00 19440 9429 -1.73985483446227e+00 19440 9453 -1.17009061321144e-02 19440 9933 -4.27068489809019e-05 19440 9957 -2.75908869197920e-01 19440 9981 -3.94528752716489e+00 19440 10005 -1.21491661808584e+01 19440 10029 -4.37787045752165e+00 19440 10053 -2.95310796217853e-03 19440 10533 -3.48101433441640e-05 19440 10557 -8.48036522135777e-02 19440 10581 -1.62540162070135e+00 19440 10605 -4.98769432682711e+00 19440 10629 -7.91085148021617e-01 19440 11157 -9.55235986069338e-05 19440 11181 -5.86754948615230e-02 19440 11205 -1.27735214090192e-01 19440 11229 -2.69315925168934e-04 19440 19440 8.34560968819238e+00 19440 18576 2.50127706152292e-02 19440 18600 1.77960916292746e-01 19440 18624 5.20546693731804e-01 19440 18648 4.45699009410347e-01 19440 18984 2.00736623449200e-01 19440 19008 1.33207175863362e+00 19440 19032 3.67164699493719e+00 19440 19056 3.23794388911826e+00 19440 19392 4.54332216932536e-01 19440 19416 2.84901195706921e+00 19440 19464 6.56077331714634e+00 19440 19800 2.06994670444974e-01 19440 19824 1.38078276116627e+00 19440 19848 3.45834867769277e+00 19440 19872 2.63307945879095e+00 19440 20208 2.65772823641727e-02 19440 20232 1.90138666925909e-01 19440 20256 4.67222114420697e-01 19440 20280 2.94482901828521e-01 19441 19441 1.00000000000000e+00 19442 19442 1.00000000000000e+00 19443 19443 1.00000000000000e+00 19444 19444 1.00000000000000e+00 19445 19445 1.00000000000000e+00 19446 19446 1.00000000000000e+00 19447 19447 1.00000000000000e+00 19448 19448 1.00000000000000e+00 19449 19449 1.00000000000000e+00 19450 19450 1.00000000000000e+00 19451 19451 1.00000000000000e+00 19452 19452 1.00000000000000e+00 19453 19453 1.00000000000000e+00 19454 19454 1.00000000000000e+00 19455 19455 1.00000000000000e+00 19456 19456 1.00000000000000e+00 19457 19457 1.00000000000000e+00 19458 19458 1.00000000000000e+00 19459 19459 1.00000000000000e+00 19460 19460 1.00000000000000e+00 19461 19461 1.00000000000000e+00 19462 19462 1.00000000000000e+00 19463 19463 1.00000000000000e+00 19464 8781 -4.24068021415267e-04 19464 8805 -1.46458338405462e-02 19464 8829 -9.58767802584510e-03 19464 8853 -8.84884528789608e-06 19464 9357 -5.96334235505000e-09 19464 9381 -7.54624655077918e-02 19464 9405 -1.71003083767368e+00 19464 9429 -2.49861912557889e+00 19464 9453 -2.26063108285773e-02 19464 9957 -1.83203537140746e-03 19464 9981 -6.68819689456890e-01 19464 10005 -1.36812044076590e+01 19464 10029 -7.60221651864070e+00 19464 10053 -5.76787102641962e-03 19464 10557 -4.12660314887462e-03 19464 10581 -8.02167487971875e-01 19464 10605 -7.25120728299913e+00 19464 10629 -1.47814744601905e+00 19464 11157 -1.96369108521828e-05 19464 11181 -6.91058902851671e-02 19464 11205 -2.06381545340386e-01 19464 11229 -5.26432474004655e-04 19464 19464 1.23161012279494e+01 19464 18600 1.94774584579572e-02 19464 18624 4.45699009410347e-01 19464 18648 7.55055809614993e-01 19464 19008 1.32281316209201e-01 19464 19032 3.23794388911826e+00 19464 19056 5.54991856477209e+00 19464 19416 2.57920772334751e-01 19464 19440 6.56077331714634e+00 19464 19824 1.38201019846591e-01 19464 19848 2.63307945879096e+00 19464 19872 4.29875177865576e+00 19464 20232 2.09573843673046e-02 19464 20256 2.94482901828521e-01 19464 20280 4.42264113085910e-01 19465 19465 1.00000000000000e+00 19466 19466 1.00000000000000e+00 19467 19467 1.00000000000000e+00 19468 19468 1.00000000000000e+00 19469 19469 1.00000000000000e+00 19470 19470 1.00000000000000e+00 19471 19471 1.00000000000000e+00 19472 19472 1.00000000000000e+00 19473 19473 1.00000000000000e+00 19474 19474 1.00000000000000e+00 19475 19475 1.00000000000000e+00 19476 19476 1.00000000000000e+00 19477 19477 1.00000000000000e+00 19478 19478 1.00000000000000e+00 19479 19479 1.00000000000000e+00 19480 19480 1.00000000000000e+00 19481 19481 1.00000000000000e+00 19482 19482 1.00000000000000e+00 19483 19483 1.00000000000000e+00 19484 19484 1.00000000000000e+00 19485 19485 1.00000000000000e+00 19486 19486 1.00000000000000e+00 19487 19487 1.00000000000000e+00 19488 5565 -2.72999557635261e-02 19488 5589 -1.60538004493392e-02 19488 5613 -1.64223745000000e-12 19488 6141 -1.85121313218598e-01 19488 6165 -3.50736818545118e+00 19488 6189 -9.31015863958348e-01 19488 6213 -4.92885197545329e-03 19488 6717 -6.28923985187290e-07 19488 6741 -3.93265630313751e+00 19488 6765 -1.36483898526968e+01 19488 6789 -1.33921351264526e+00 19488 6813 -8.19121310477236e-03 19488 7317 -4.29215165363153e-03 19488 7341 -3.71267255159004e+00 19488 7365 -4.42153745514164e+00 19488 7389 -2.75221263027280e-01 19488 7413 -1.55563455594225e-04 19488 7917 -7.59934449608795e-04 19488 7941 -1.34062314544311e-01 19488 7965 -1.03422884076187e-01 19488 7989 -4.98947752019853e-03 19488 8565 -1.62243194400000e-11 19488 8589 -2.67275633000000e-12 19488 19488 1.00814082330136e+01 19488 18672 5.60634833947531e-01 19488 18696 3.52882545366819e-01 19488 18720 2.07328938265868e-02 19488 19080 4.17384933665300e+00 19488 19104 2.58960730429121e+00 19488 19128 1.43623610275629e-01 19488 19512 5.52408794703340e+00 19488 19536 2.80966808721883e-01 19488 19896 5.11344358332101e+00 19488 19920 3.01366476430736e+00 19488 19944 1.30555135041958e-01 19488 20304 7.95533395614533e-01 19488 20328 4.58896910370858e-01 19488 20352 1.74657750181689e-02 19489 19489 1.00000000000000e+00 19490 19490 1.00000000000000e+00 19491 19491 1.00000000000000e+00 19492 19492 1.00000000000000e+00 19493 19493 1.00000000000000e+00 19494 19494 1.00000000000000e+00 19495 19495 1.00000000000000e+00 19496 19496 1.00000000000000e+00 19497 19497 1.00000000000000e+00 19498 19498 1.00000000000000e+00 19499 19499 1.00000000000000e+00 19500 19500 1.00000000000000e+00 19501 19501 1.00000000000000e+00 19502 19502 1.00000000000000e+00 19503 19503 1.00000000000000e+00 19504 19504 1.00000000000000e+00 19505 19505 1.00000000000000e+00 19506 19506 1.00000000000000e+00 19507 19507 1.00000000000000e+00 19508 19508 1.00000000000000e+00 19509 19509 1.00000000000000e+00 19510 19510 1.00000000000000e+00 19511 19511 1.00000000000000e+00 19512 5565 -1.51031657139670e-02 19512 5589 -9.46517302950717e-03 19512 5613 -6.23034231000000e-12 19512 6141 -9.76740571613008e-02 19512 6165 -2.26455304050102e+00 19512 6189 -1.14792032596768e+00 19512 6213 -5.10251812906418e-02 19512 6237 -5.95594804659713e-05 19512 6717 -3.15062376914740e-07 19512 6741 -2.21730298722638e+00 19512 6765 -1.11982184290233e+01 19512 6789 -4.42373616499346e+00 19512 6813 -3.59609790199516e-01 19512 6837 -3.92140677873941e-04 19512 7317 -2.18156224160914e-03 19512 7341 -2.29622406868495e+00 19512 7365 -5.85915587839813e+00 19512 7389 -3.15212942479745e+00 19512 7413 -2.52605295670648e-01 19512 7437 -5.82139999520669e-06 19512 7917 -3.88025594488413e-04 19512 7941 -1.16854240285122e-01 19512 7965 -4.08296859121543e-01 19512 7989 -2.68460388411370e-01 19512 8013 -8.89962435477872e-03 19512 8565 -3.77341038477298e-04 19512 8589 -7.12208246196826e-04 19512 8613 -6.97276547140000e-10 19512 19512 8.16173749686308e+00 19512 18672 3.52882545366819e-01 19512 18696 4.92735384328554e-01 19512 18720 1.87065967598066e-01 19512 18744 2.60335980729298e-02 19512 19080 2.58960730429121e+00 19512 19104 3.51355052713257e+00 19512 19128 1.40655976561496e+00 19512 19152 2.08016331128107e-01 19512 19488 5.52408794703340e+00 19512 19536 2.98850003984698e+00 19512 19560 4.66158201239847e-01 19512 19896 3.01366476430736e+00 19512 19920 3.53687360286299e+00 19512 19944 1.33129786065526e+00 19512 19968 2.02269330121855e-01 19512 20304 4.58896910370858e-01 19512 20328 4.98566153261160e-01 19512 20352 1.68250491358143e-01 19512 20376 2.45968478213669e-02 19513 19513 1.00000000000000e+00 19514 19514 1.00000000000000e+00 19515 19515 1.00000000000000e+00 19516 19516 1.00000000000000e+00 19517 19517 1.00000000000000e+00 19518 19518 1.00000000000000e+00 19519 19519 1.00000000000000e+00 19520 19520 1.00000000000000e+00 19521 19521 1.00000000000000e+00 19522 19522 1.00000000000000e+00 19523 19523 1.00000000000000e+00 19524 19524 1.00000000000000e+00 19525 19525 1.00000000000000e+00 19526 19526 1.00000000000000e+00 19527 19527 1.00000000000000e+00 19528 19528 1.00000000000000e+00 19529 19529 1.00000000000000e+00 19530 19530 1.00000000000000e+00 19531 19531 1.00000000000000e+00 19532 19532 1.00000000000000e+00 19533 19533 1.00000000000000e+00 19534 19534 1.00000000000000e+00 19535 19535 1.00000000000000e+00 19536 5565 -4.15196523486830e-04 19536 5589 -4.10935087373680e-04 19536 5613 -1.54549245000000e-12 19536 6141 -1.46097158628627e-03 19536 6165 -1.56376062952831e-01 19536 6189 -4.57856882564994e-01 19536 6213 -1.37572068971867e-01 19536 6237 -7.09749042147098e-04 19536 6717 -1.71538377450000e-10 19536 6741 -7.17232553767053e-02 19536 6765 -2.17167163998993e+00 19536 6789 -6.39325921400946e+00 19536 6813 -1.79075268972267e+00 19536 6837 -4.81042644266766e-02 19536 7317 -1.01389756552503e-05 19536 7341 -1.34464897613044e-01 19536 7365 -3.63348164739563e+00 19536 7389 -1.00058294587789e+01 19536 7413 -2.57969505935664e+00 19536 7437 -5.91529245750109e-02 19536 7917 -2.30239133829009e-06 19536 7941 -2.09752511183679e-02 19536 7965 -7.58041586363677e-01 19536 7989 -1.59016329279604e+00 19536 8013 -4.52565793524378e-01 19536 8037 -3.53912977336368e-03 19536 8565 -2.41855455161590e-03 19536 8589 -2.20016673822271e-02 19536 8613 -6.25604395553281e-03 19536 19536 9.13287850138161e+00 19536 18672 2.07328938265868e-02 19536 18696 1.87065967598066e-01 19536 18720 4.58342691413082e-01 19536 18744 1.88423305970195e-01 19536 18768 2.10722284196189e-02 19536 19080 1.43623610275629e-01 19536 19104 1.40655976561496e+00 19536 19128 3.64388340608846e+00 19536 19152 1.52005931556464e+00 19536 19176 1.71998497763048e-01 19536 19488 2.80966808721883e-01 19536 19512 2.98850003984698e+00 19536 19560 3.43815469624700e+00 19536 19584 3.93380472821887e-01 19536 19896 1.30555135041958e-01 19536 19920 1.33129786065527e+00 19536 19944 3.54045363333219e+00 19536 19968 1.50343418584935e+00 19536 19992 1.73589216340478e-01 19536 20304 1.74657750181689e-02 19536 20328 1.68250491358143e-01 19536 20352 4.32485248224015e-01 19536 20376 1.84267023541372e-01 19536 20400 2.14699080639762e-02 19537 19537 1.00000000000000e+00 19538 19538 1.00000000000000e+00 19539 19539 1.00000000000000e+00 19540 19540 1.00000000000000e+00 19541 19541 1.00000000000000e+00 19542 19542 1.00000000000000e+00 19543 19543 1.00000000000000e+00 19544 19544 1.00000000000000e+00 19545 19545 1.00000000000000e+00 19546 19546 1.00000000000000e+00 19547 19547 1.00000000000000e+00 19548 19548 1.00000000000000e+00 19549 19549 1.00000000000000e+00 19550 19550 1.00000000000000e+00 19551 19551 1.00000000000000e+00 19552 19552 1.00000000000000e+00 19553 19553 1.00000000000000e+00 19554 19554 1.00000000000000e+00 19555 19555 1.00000000000000e+00 19556 19556 1.00000000000000e+00 19557 19557 1.00000000000000e+00 19558 19558 1.00000000000000e+00 19559 19559 1.00000000000000e+00 19560 5589 -7.46393400000000e-14 19560 6165 -2.80363635072946e-03 19560 6189 -7.60852993516103e-02 19560 6213 -6.09726191576294e-02 19560 6237 -1.97908944809913e-03 19560 6741 -4.35062775778442e-06 19560 6765 -2.48937627752007e-01 19560 6789 -2.16294920165834e+00 19560 6813 -2.32104302524854e+00 19560 6837 -2.95079386881859e-01 19560 6861 -2.69918411505053e-03 19560 7341 -2.36456528890262e-03 19560 7365 -7.70581711034168e-01 19560 7389 -7.17876805185171e+00 19560 7413 -7.84475762036908e+00 19560 7437 -9.41794062802636e-01 19560 7461 -7.63644529673767e-03 19560 7941 -1.81463814625544e-03 19560 7965 -2.92463126461182e-01 19560 7989 -2.79102250318822e+00 19560 8013 -2.98627124706641e+00 19560 8037 -4.23340971250763e-01 19560 8061 -3.25705673696318e-04 19560 8565 -4.02285784986320e-03 19560 8589 -1.07211408631075e-01 19560 8613 -1.34270192548722e-01 19560 8637 -1.14567772184785e-02 19560 9189 -3.73102447881600e-08 19560 9213 -7.48228670978547e-06 19560 9237 -5.47964570785980e-07 19560 19560 8.12365760161957e+00 19560 18696 2.60335980729298e-02 19560 18720 1.88423305970195e-01 19560 18744 3.82946740255824e-01 19560 18768 1.63318863554444e-01 19560 18792 1.97574874689921e-02 19560 19104 2.08016331128107e-01 19560 19128 1.52005931556464e+00 19560 19152 3.11986350731981e+00 19560 19176 1.32747883898367e+00 19560 19200 1.59871211982866e-01 19560 19512 4.66158201239847e-01 19560 19536 3.43815469624700e+00 19560 19584 3.02716923220474e+00 19560 19608 3.63411835229283e-01 19560 19920 2.02269330121855e-01 19560 19944 1.50343418584935e+00 19560 19968 3.14169525100726e+00 19560 19992 1.34235070311271e+00 19560 20016 1.61998459437697e-01 19560 20328 2.45968478213669e-02 19560 20352 1.84267023541372e-01 19560 20376 3.88404676177686e-01 19560 20400 1.67036829586704e-01 19560 20424 2.02892993326998e-02 19561 19561 1.00000000000000e+00 19562 19562 1.00000000000000e+00 19563 19563 1.00000000000000e+00 19564 19564 1.00000000000000e+00 19565 19565 1.00000000000000e+00 19566 19566 1.00000000000000e+00 19567 19567 1.00000000000000e+00 19568 19568 1.00000000000000e+00 19569 19569 1.00000000000000e+00 19570 19570 1.00000000000000e+00 19571 19571 1.00000000000000e+00 19572 19572 1.00000000000000e+00 19573 19573 1.00000000000000e+00 19574 19574 1.00000000000000e+00 19575 19575 1.00000000000000e+00 19576 19576 1.00000000000000e+00 19577 19577 1.00000000000000e+00 19578 19578 1.00000000000000e+00 19579 19579 1.00000000000000e+00 19580 19580 1.00000000000000e+00 19581 19581 1.00000000000000e+00 19582 19582 1.00000000000000e+00 19583 19583 1.00000000000000e+00 19584 6189 -1.42313807385478e-03 19584 6213 -7.58954126479085e-03 19584 6237 -6.05453066284443e-04 19584 6765 -1.93029350231710e-04 19584 6789 -1.98701968048531e-01 19584 6813 -8.49994985456517e-01 19584 6837 -5.08138615513831e-01 19584 6861 -2.16163911218320e-02 19584 6885 -8.91149563795797e-06 19584 7365 -1.95621366677707e-02 19584 7389 -1.56150964536205e+00 19584 7413 -6.93663822977322e+00 19584 7437 -3.67439368781381e+00 19584 7461 -2.24619371477821e-01 19584 7485 -2.10501275725715e-04 19584 7965 -3.11108491462266e-02 19584 7989 -1.30451795486918e+00 19584 8013 -6.23407982509963e+00 19584 8037 -3.39171852619205e+00 19584 8061 -2.06892058201995e-01 19584 8085 -1.22463021456099e-05 19584 8565 -9.44207889060278e-04 19584 8589 -1.41157639159405e-01 19584 8613 -6.48829834041647e-01 19584 8637 -3.52156070294241e-01 19584 8661 -1.26258116673757e-02 19584 9189 -2.47764597396870e-07 19584 9213 -1.79342829018033e-03 19584 9237 -2.41400275343930e-03 19584 9261 -1.40505858852180e-07 19584 19584 7.55985454896843e+00 19584 18720 2.10722284196189e-02 19584 18744 1.63318863554444e-01 19584 18768 3.56434052889109e-01 19584 18792 1.55998049738432e-01 19584 18816 1.92420249656160e-02 19584 19128 1.71998497763048e-01 19584 19152 1.32747883898367e+00 19584 19176 2.88497387994914e+00 19584 19200 1.25962880977219e+00 19584 19224 1.55035990460178e-01 19584 19536 3.93380472821887e-01 19584 19560 3.02716923220474e+00 19584 19608 2.86118619082832e+00 19584 19632 3.51884712477784e-01 19584 19944 1.73589216340478e-01 19584 19968 1.34235070311271e+00 19584 19992 2.92511695842665e+00 19584 20016 1.28620340208265e+00 19584 20040 1.59552391082961e-01 19584 20352 2.14699080639762e-02 19584 20376 1.67036829586704e-01 19584 20400 3.66469822508484e-01 19584 20424 1.62641697816046e-01 19584 20448 2.03711251213117e-02 19585 19585 1.00000000000000e+00 19586 19586 1.00000000000000e+00 19587 19587 1.00000000000000e+00 19588 19588 1.00000000000000e+00 19589 19589 1.00000000000000e+00 19590 19590 1.00000000000000e+00 19591 19591 1.00000000000000e+00 19592 19592 1.00000000000000e+00 19593 19593 1.00000000000000e+00 19594 19594 1.00000000000000e+00 19595 19595 1.00000000000000e+00 19596 19596 1.00000000000000e+00 19597 19597 1.00000000000000e+00 19598 19598 1.00000000000000e+00 19599 19599 1.00000000000000e+00 19600 19600 1.00000000000000e+00 19601 19601 1.00000000000000e+00 19602 19602 1.00000000000000e+00 19603 19603 1.00000000000000e+00 19604 19604 1.00000000000000e+00 19605 19605 1.00000000000000e+00 19606 19606 1.00000000000000e+00 19607 19607 1.00000000000000e+00 19608 6213 -4.63546319988546e-05 19608 6237 -3.34854865003076e-05 19608 6789 -7.78915299212615e-04 19608 6813 -9.71852575256471e-02 19608 6837 -2.18693144643874e-01 19608 6861 -4.78374423681392e-02 19608 6885 -8.04923988436113e-05 19608 7389 -7.96429948358928e-02 19608 7413 -1.86500071194450e+00 19608 7437 -3.99347476231918e+00 19608 7461 -1.07520244867280e+00 19608 7485 -2.93382054589841e-02 19608 7965 -1.88711314146379e-05 19608 7989 -1.85449956010226e-01 19608 8013 -3.64136977461597e+00 19608 8037 -8.46920094647185e+00 19608 8061 -2.14744083978136e+00 19608 8085 -5.25159046809861e-02 19608 8565 -8.75431199719518e-06 19608 8589 -3.97012792058173e-02 19608 8613 -9.67683053614519e-01 19608 8637 -1.93651044840107e+00 19608 8661 -5.59277921064762e-01 19608 8685 -4.92164144620347e-03 19608 9189 -4.31404717765020e-07 19608 9213 -9.66017648426737e-03 19608 9237 -4.71831589024664e-02 19608 9261 -1.13664813412546e-02 19608 19608 7.34294864953847e+00 19608 18744 1.97574874689921e-02 19608 18768 1.55998049738432e-01 19608 18792 3.46520151232713e-01 19608 18816 1.52529157117924e-01 19608 18840 1.88902643138649e-02 19608 19152 1.59871211982866e-01 19608 19176 1.25962880977219e+00 19608 19200 2.79375021560829e+00 19608 19224 1.23335658689082e+00 19608 19248 1.53303156262525e-01 19608 19560 3.63411835229283e-01 19608 19584 2.86118619082832e+00 19608 19632 2.80506450856887e+00 19608 19656 3.49381414664419e-01 19608 19968 1.61998459437697e-01 19608 19992 1.28620340208265e+00 19608 20016 2.87066983306137e+00 19608 20040 1.26154202951684e+00 19608 20064 1.55833116296245e-01 19608 20376 2.02892993326998e-02 19608 20400 1.62641697816046e-01 19608 20424 3.65750055595983e-01 19608 20448 1.59575517774427e-01 19608 20472 1.95227543222949e-02 19609 19609 1.00000000000000e+00 19610 19610 1.00000000000000e+00 19611 19611 1.00000000000000e+00 19612 19612 1.00000000000000e+00 19613 19613 1.00000000000000e+00 19614 19614 1.00000000000000e+00 19615 19615 1.00000000000000e+00 19616 19616 1.00000000000000e+00 19617 19617 1.00000000000000e+00 19618 19618 1.00000000000000e+00 19619 19619 1.00000000000000e+00 19620 19620 1.00000000000000e+00 19621 19621 1.00000000000000e+00 19622 19622 1.00000000000000e+00 19623 19623 1.00000000000000e+00 19624 19624 1.00000000000000e+00 19625 19625 1.00000000000000e+00 19626 19626 1.00000000000000e+00 19627 19627 1.00000000000000e+00 19628 19628 1.00000000000000e+00 19629 19629 1.00000000000000e+00 19630 19630 1.00000000000000e+00 19631 19631 1.00000000000000e+00 19632 6813 -9.28518009400147e-04 19632 6837 -2.92174748184043e-02 19632 6861 -1.82588596240220e-02 19632 6885 -1.88632296335792e-04 19632 7389 -3.91749617691150e-07 19632 7413 -1.39874140180185e-01 19632 7437 -1.24030980514069e+00 19632 7461 -1.41055889312212e+00 19632 7485 -1.75026824014734e-01 19632 7509 -1.27623034386603e-03 19632 7989 -1.89638474168434e-03 19632 8013 -6.40927707820468e-01 19632 8037 -6.03043027825396e+00 19632 8061 -6.53788922342877e+00 19632 8085 -7.75414771434271e-01 19632 8109 -6.53347571849009e-03 19632 8589 -2.45335414009302e-03 19632 8613 -3.49928920340790e-01 19632 8637 -3.29949882568259e+00 19632 8661 -3.51256895453248e+00 19632 8685 -4.78760119398735e-01 19632 8709 -4.98462211108425e-04 19632 9189 -9.85236182442100e-08 19632 9213 -1.21795169504234e-02 19632 9237 -2.01108282090769e-01 19632 9261 -2.18551967117544e-01 19632 9285 -2.03097815182612e-02 19632 9837 -1.05957427505543e-05 19632 9861 -1.86508968564515e-04 19632 9885 -7.58338003402632e-06 19632 19632 7.28740210760271e+00 19632 18768 1.92420249656160e-02 19632 18792 1.52529157117924e-01 19632 18816 3.40173414020676e-01 19632 18840 1.50309697388344e-01 19632 18864 1.86871600332210e-02 19632 19176 1.55035990460178e-01 19632 19200 1.23335658689082e+00 19632 19224 2.75942208636537e+00 19632 19248 1.21935500786909e+00 19632 19272 1.51535595704744e-01 19632 19584 3.51884712477784e-01 19632 19608 2.80506450856887e+00 19632 19656 2.77918470063369e+00 19632 19680 3.45414760493990e-01 19632 19992 1.59552391082961e-01 19632 20016 1.26154202951684e+00 19632 20040 2.80798832008810e+00 19632 20064 1.24375673824569e+00 19632 20088 1.55106068265173e-01 19632 20400 2.03711251213117e-02 19632 20424 1.59575517774427e-01 19632 20448 3.52314972451359e-01 19632 20472 1.56410129982493e-01 19632 20496 1.95797781733282e-02 19633 19633 1.00000000000000e+00 19634 19634 1.00000000000000e+00 19635 19635 1.00000000000000e+00 19636 19636 1.00000000000000e+00 19637 19637 1.00000000000000e+00 19638 19638 1.00000000000000e+00 19639 19639 1.00000000000000e+00 19640 19640 1.00000000000000e+00 19641 19641 1.00000000000000e+00 19642 19642 1.00000000000000e+00 19643 19643 1.00000000000000e+00 19644 19644 1.00000000000000e+00 19645 19645 1.00000000000000e+00 19646 19646 1.00000000000000e+00 19647 19647 1.00000000000000e+00 19648 19648 1.00000000000000e+00 19649 19649 1.00000000000000e+00 19650 19650 1.00000000000000e+00 19651 19651 1.00000000000000e+00 19652 19652 1.00000000000000e+00 19653 19653 1.00000000000000e+00 19654 19654 1.00000000000000e+00 19655 19655 1.00000000000000e+00 19656 6837 -4.48079598200331e-04 19656 6861 -1.86222575103139e-03 19656 6885 -4.61869584146426e-05 19656 7413 -5.60742176785086e-05 19656 7437 -1.12540250718606e-01 19656 7461 -4.97254905233339e-01 19656 7485 -2.84162572146212e-01 19656 7509 -9.04705997000780e-03 19656 7533 -2.55683926896930e-07 19656 8013 -1.54562329970989e-02 19656 8037 -1.30220261752320e+00 19656 8061 -5.55216590365650e+00 19656 8085 -2.88002145247028e+00 19656 8109 -1.69941020545758e-01 19656 8133 -1.27258756124394e-04 19656 8613 -3.61825963381655e-02 19656 8637 -1.47822609499834e+00 19656 8661 -6.94373649909147e+00 19656 8685 -3.58766882084474e+00 19656 8709 -2.08634239809660e-01 19656 8733 -2.21422910102269e-05 19656 9213 -2.68360686543643e-03 19656 9237 -2.35359211128363e-01 19656 9261 -9.83374149245046e-01 19656 9285 -5.14869724059547e-01 19656 9309 -2.04237157877317e-02 19656 9837 -5.77838800737370e-05 19656 9861 -6.87824803542513e-03 19656 9885 -6.56477375214336e-03 19656 9909 -2.01560395289946e-06 19656 19656 7.21643411078449e+00 19656 18792 1.88902643138649e-02 19656 18816 1.50309697388344e-01 19656 18840 3.36601532325880e-01 19656 18864 1.49615470054803e-01 19656 18888 1.87167074804798e-02 19656 19200 1.53303156262525e-01 19656 19224 1.21935500786909e+00 19656 19248 2.72824251965546e+00 19656 19272 1.20762171128691e+00 19656 19296 1.50369832116981e-01 19656 19608 3.49381414664419e-01 19656 19632 2.77918470063369e+00 19656 19680 2.74332515484008e+00 19656 19704 3.40416528216016e-01 19656 20016 1.55833116296245e-01 19656 20040 1.24375673824568e+00 19656 20064 2.79178445855528e+00 19656 20088 1.23744127312556e+00 19656 20112 1.54254250016213e-01 19656 20424 1.95227543222949e-02 19656 20448 1.56410129982493e-01 19656 20472 3.52487017050835e-01 19656 20496 1.57070360514464e-01 19656 20520 1.96878119552877e-02 19657 19657 1.00000000000000e+00 19658 19658 1.00000000000000e+00 19659 19659 1.00000000000000e+00 19660 19660 1.00000000000000e+00 19661 19661 1.00000000000000e+00 19662 19662 1.00000000000000e+00 19663 19663 1.00000000000000e+00 19664 19664 1.00000000000000e+00 19665 19665 1.00000000000000e+00 19666 19666 1.00000000000000e+00 19667 19667 1.00000000000000e+00 19668 19668 1.00000000000000e+00 19669 19669 1.00000000000000e+00 19670 19670 1.00000000000000e+00 19671 19671 1.00000000000000e+00 19672 19672 1.00000000000000e+00 19673 19673 1.00000000000000e+00 19674 19674 1.00000000000000e+00 19675 19675 1.00000000000000e+00 19676 19676 1.00000000000000e+00 19677 19677 1.00000000000000e+00 19678 19678 1.00000000000000e+00 19679 19679 1.00000000000000e+00 19680 6861 -6.46536115564740e-07 19680 6885 -3.35135530715780e-07 19680 7437 -2.69100304160322e-04 19680 7461 -5.29520423692178e-02 19680 7485 -1.10295881093749e-01 19680 7509 -1.73529761959173e-02 19680 7533 -1.64776284888536e-06 19680 8037 -6.19881299017586e-02 19680 8061 -1.41063348630125e+00 19680 8085 -2.89436506660368e+00 19680 8109 -7.69802226468792e-01 19680 8133 -1.84595574985236e-02 19680 8613 -2.60766096089590e-05 19680 8637 -2.00674644131230e-01 19680 8661 -3.78016253433075e+00 19680 8685 -8.39721704320000e+00 19680 8709 -2.02056147413534e+00 19680 8733 -4.94282254897328e-02 19680 9213 -2.12273103108987e-05 19680 9237 -6.29703485864411e-02 19680 9261 -1.33485408307054e+00 19680 9285 -2.63136498869217e+00 19680 9309 -7.35882102626065e-01 19680 9333 -6.99137529405230e-03 19680 9837 -7.21993790366341e-05 19680 9861 -3.06819938875631e-02 19680 9885 -9.59646298107570e-02 19680 9909 -2.10748455066426e-02 19680 9933 -8.44638357170000e-10 19680 10485 -2.67149432083500e-08 19680 10509 -1.74352105968200e-08 19680 19680 7.14026111656756e+00 19680 18816 1.86871600332210e-02 19680 18840 1.49615470054803e-01 19680 18864 3.36784571584672e-01 19680 18888 1.49387197377012e-01 19680 18912 1.86300918637733e-02 19680 19224 1.51535595704744e-01 19680 19248 1.20762171128691e+00 19680 19272 2.70952052632652e+00 19680 19296 1.20974979546801e+00 19680 19320 1.52067616750017e-01 19680 19632 3.45414760493990e-01 19680 19656 2.74332515484008e+00 19680 19704 2.75439373133251e+00 19680 19728 3.48181904617097e-01 19680 20040 1.55106068265173e-01 19680 20064 1.23744127312556e+00 19680 20088 2.77817258011407e+00 19680 20112 1.23701104642262e+00 19680 20136 1.54998511589438e-01 19680 20448 1.95797781733282e-02 19680 20472 1.57070360514464e-01 19680 20496 3.53947585031560e-01 19680 20520 1.56202510115665e-01 19680 20544 1.93628155736287e-02 19681 19681 1.00000000000000e+00 19682 19682 1.00000000000000e+00 19683 19683 1.00000000000000e+00 19684 19684 1.00000000000000e+00 19685 19685 1.00000000000000e+00 19686 19686 1.00000000000000e+00 19687 19687 1.00000000000000e+00 19688 19688 1.00000000000000e+00 19689 19689 1.00000000000000e+00 19690 19690 1.00000000000000e+00 19691 19691 1.00000000000000e+00 19692 19692 1.00000000000000e+00 19693 19693 1.00000000000000e+00 19694 19694 1.00000000000000e+00 19695 19695 1.00000000000000e+00 19696 19696 1.00000000000000e+00 19697 19697 1.00000000000000e+00 19698 19698 1.00000000000000e+00 19699 19699 1.00000000000000e+00 19700 19700 1.00000000000000e+00 19701 19701 1.00000000000000e+00 19702 19702 1.00000000000000e+00 19703 19703 1.00000000000000e+00 19704 7461 -3.88327097074177e-04 19704 7485 -1.27531411453202e-02 19704 7509 -5.17490449004984e-03 19704 7533 -2.75579249208747e-06 19704 8037 -3.01603641067000e-09 19704 8061 -9.43825694898244e-02 19704 8085 -8.34174209426217e-01 19704 8109 -9.24693753917565e-01 19704 8133 -1.05165732007158e-01 19704 8157 -5.12372734049634e-04 19704 8637 -1.61402046852437e-03 19704 8661 -6.27511702787334e-01 19704 8685 -5.60361692656973e+00 19704 8709 -5.80227885164798e+00 19704 8733 -6.59599075902187e-01 19704 8757 -5.60266975200132e-03 19704 9237 -3.60383670497818e-03 19704 9261 -4.52262731923139e-01 19704 9285 -4.15319957528697e+00 19704 9309 -4.28272850225022e+00 19704 9333 -5.44017519973765e-01 19704 9357 -7.57131174518657e-04 19704 9837 -1.54009090715200e-05 19704 9861 -3.00451118904870e-02 19704 9885 -3.62324339704623e-01 19704 9909 -3.57021004769817e-01 19704 9933 -3.57113108533596e-02 19704 10485 -1.74967604472405e-04 19704 10509 -1.25262710500993e-03 19704 10533 -3.89310030356545e-05 19704 19704 7.25784715332251e+00 19704 18840 1.87167074804798e-02 19704 18864 1.49387197377012e-01 19704 18888 3.35688441614716e-01 19704 18912 1.50081424710550e-01 19704 18936 1.88902643138643e-02 19704 19248 1.50369832116981e-01 19704 19272 1.20974979546801e+00 19704 19296 2.73598085723523e+00 19704 19320 1.21838709547177e+00 19704 19344 1.52529157117921e-01 19704 19656 3.40416528216016e-01 19704 19680 2.75439373133251e+00 19704 19728 2.77880822339929e+00 19704 19752 3.46520151232713e-01 19704 20064 1.54254250016213e-01 19704 20088 1.23701104642262e+00 19704 20112 2.79022848518572e+00 19704 20136 1.24398624531150e+00 19704 20160 1.55998049738432e-01 19704 20472 1.96878119552877e-02 19704 20496 1.56202510115665e-01 19704 20520 3.49250348602338e-01 19704 20544 1.56481212170483e-01 19704 20568 1.97574874689921e-02 19705 19705 1.00000000000000e+00 19706 19706 1.00000000000000e+00 19707 19707 1.00000000000000e+00 19708 19708 1.00000000000000e+00 19709 19709 1.00000000000000e+00 19710 19710 1.00000000000000e+00 19711 19711 1.00000000000000e+00 19712 19712 1.00000000000000e+00 19713 19713 1.00000000000000e+00 19714 19714 1.00000000000000e+00 19715 19715 1.00000000000000e+00 19716 19716 1.00000000000000e+00 19717 19717 1.00000000000000e+00 19718 19718 1.00000000000000e+00 19719 19719 1.00000000000000e+00 19720 19720 1.00000000000000e+00 19721 19721 1.00000000000000e+00 19722 19722 1.00000000000000e+00 19723 19723 1.00000000000000e+00 19724 19724 1.00000000000000e+00 19725 19725 1.00000000000000e+00 19726 19726 1.00000000000000e+00 19727 19727 1.00000000000000e+00 19728 7485 -1.03213653480996e-04 19728 7509 -3.08191473876536e-04 19728 7533 -6.25027141297630e-07 19728 8061 -1.09340842857508e-05 19728 8085 -6.74916128452636e-02 19728 8109 -3.03095516402847e-01 19728 8133 -1.55713479595496e-01 19728 8157 -3.14675205445585e-03 19728 8661 -1.29819148068440e-02 19728 8685 -1.14368139928724e+00 19728 8709 -4.54342432343409e+00 19728 8733 -2.30931516770855e+00 19728 8757 -1.30268316315287e-01 19728 8781 -7.18384143752472e-05 19728 9261 -4.32773454137629e-02 19728 9285 -1.73159753784729e+00 19728 9309 -7.82063470981181e+00 19728 9333 -3.84397367768757e+00 19728 9357 -2.15879675201232e-01 19728 9381 -2.76739317972476e-05 19728 9861 -6.15205480232570e-03 19728 9885 -3.81038440366007e-01 19728 9909 -1.49717127446903e+00 19728 9933 -7.66829074925700e-01 19728 9957 -3.19984746935336e-02 19728 10485 -8.50483332369760e-04 19728 10509 -2.16090931874474e-02 19728 10533 -1.51559787944265e-02 19728 10557 -1.38112665047090e-05 19728 19728 7.24442172701008e+00 19728 18864 1.86300918637733e-02 19728 18888 1.50081424710550e-01 19728 18912 3.40309845637370e-01 19728 18936 1.53303156262525e-01 19728 18960 1.94355247517668e-02 19728 19272 1.52067616750017e-01 19728 19296 1.21838709547177e+00 19728 19320 2.74834412024160e+00 19728 19344 1.23335658689084e+00 19728 19368 1.55809989604785e-01 19728 19680 3.48181904617097e-01 19728 19704 2.77880822339929e+00 19728 19752 2.79375021560836e+00 19728 19776 3.51917402669363e-01 19728 20088 1.54998511589438e-01 19728 20112 1.24398624531150e+00 19728 20136 2.80987646010903e+00 19728 20160 1.25962880977222e+00 19728 20184 1.58909152704619e-01 19728 20496 1.93628155736287e-02 19728 20520 1.56481212170483e-01 19728 20544 3.55692930604228e-01 19728 20568 1.59871211982870e-01 19728 20592 2.02103155267253e-02 19729 19729 1.00000000000000e+00 19730 19730 1.00000000000000e+00 19731 19731 1.00000000000000e+00 19732 19732 1.00000000000000e+00 19733 19733 1.00000000000000e+00 19734 19734 1.00000000000000e+00 19735 19735 1.00000000000000e+00 19736 19736 1.00000000000000e+00 19737 19737 1.00000000000000e+00 19738 19738 1.00000000000000e+00 19739 19739 1.00000000000000e+00 19740 19740 1.00000000000000e+00 19741 19741 1.00000000000000e+00 19742 19742 1.00000000000000e+00 19743 19743 1.00000000000000e+00 19744 19744 1.00000000000000e+00 19745 19745 1.00000000000000e+00 19746 19746 1.00000000000000e+00 19747 19747 1.00000000000000e+00 19748 19748 1.00000000000000e+00 19749 19749 1.00000000000000e+00 19750 19750 1.00000000000000e+00 19751 19751 1.00000000000000e+00 19752 8085 -8.04923988436100e-05 19752 8109 -2.93382054589833e-02 19752 8133 -5.25159046809857e-02 19752 8157 -4.92164144620360e-03 19752 8685 -4.78374423681392e-02 19752 8709 -1.07520244867281e+00 19752 8733 -2.14744083978141e+00 19752 8757 -5.59277921064774e-01 19752 8781 -1.13664813412543e-02 19752 9261 -3.34854865003075e-05 19752 9285 -2.18693144643847e-01 19752 9309 -3.99347476231928e+00 19752 9333 -8.46920094647210e+00 19752 9357 -1.93651044840107e+00 19752 9381 -4.71831589024652e-02 19752 9861 -4.63546319988544e-05 19752 9885 -9.71852575256478e-02 19752 9909 -1.86500071194457e+00 19752 9933 -3.64136977461606e+00 19752 9957 -9.67683053614502e-01 19752 9981 -9.66017648426708e-03 19752 10485 -7.78915299212640e-04 19752 10509 -7.96429948358956e-02 19752 10533 -1.85449956010229e-01 19752 10557 -3.97012792058170e-02 19752 10581 -4.31404717765000e-07 19752 11133 -1.88711314146378e-05 19752 11157 -8.75431199719517e-06 19752 19752 7.34294864953871e+00 19752 18888 1.88902643138643e-02 19752 18912 1.53303156262525e-01 19752 18936 3.49381414664428e-01 19752 18960 1.55833116296245e-01 19752 18984 1.95227543222945e-02 19752 19296 1.52529157117921e-01 19752 19320 1.23335658689084e+00 19752 19344 2.80506450856896e+00 19752 19368 1.26154202951684e+00 19752 19392 1.59575517774422e-01 19752 19704 3.46520151232713e-01 19752 19728 2.79375021560836e+00 19752 19776 2.87066983306139e+00 19752 19800 3.65750055595972e-01 19752 20112 1.55998049738432e-01 19752 20136 1.25962880977222e+00 19752 20160 2.86118619082843e+00 19752 20184 1.28620340208266e+00 19752 20208 1.62641697816043e-01 19752 20520 1.97574874689921e-02 19752 20544 1.59871211982870e-01 19752 20568 3.63411835229297e-01 19752 20592 1.61998459437700e-01 19752 20616 2.02892993326998e-02 19753 19753 1.00000000000000e+00 19754 19754 1.00000000000000e+00 19755 19755 1.00000000000000e+00 19756 19756 1.00000000000000e+00 19757 19757 1.00000000000000e+00 19758 19758 1.00000000000000e+00 19759 19759 1.00000000000000e+00 19760 19760 1.00000000000000e+00 19761 19761 1.00000000000000e+00 19762 19762 1.00000000000000e+00 19763 19763 1.00000000000000e+00 19764 19764 1.00000000000000e+00 19765 19765 1.00000000000000e+00 19766 19766 1.00000000000000e+00 19767 19767 1.00000000000000e+00 19768 19768 1.00000000000000e+00 19769 19769 1.00000000000000e+00 19770 19770 1.00000000000000e+00 19771 19771 1.00000000000000e+00 19772 19772 1.00000000000000e+00 19773 19773 1.00000000000000e+00 19774 19774 1.00000000000000e+00 19775 19775 1.00000000000000e+00 19776 8109 -1.53172366412976e-04 19776 8133 -4.85672977793062e-03 19776 8157 -1.17815807475612e-03 19776 8709 -6.33960961775780e-02 19776 8733 -5.74376861200495e-01 19776 8757 -6.13801984343052e-01 19776 8781 -6.23693251947754e-02 19776 8805 -1.52757987606123e-04 19776 9285 -1.31385706373236e-03 19776 9309 -6.28313393694483e-01 19776 9333 -5.25957862952257e+00 19776 9357 -5.24984454072550e+00 19776 9381 -5.99376677632753e-01 19776 9405 -5.05902499824337e-03 19776 9885 -5.16812501595190e-03 19776 9909 -5.92579518169768e-01 19776 9933 -5.31142189658314e+00 19776 9957 -5.35935612814158e+00 19776 9981 -6.58101042165486e-01 19776 10005 -1.21445491145514e-03 19776 10485 -1.51013638628267e-04 19776 10509 -6.46783074103005e-02 19776 10533 -6.39847535218475e-01 19776 10557 -6.07890324229372e-01 19776 10581 -6.57338060232611e-02 19776 11133 -1.29536421402409e-03 19776 11157 -5.15015269182182e-03 19776 11181 -1.43822464621433e-04 19776 19776 7.59293535998886e+00 19776 18912 1.94355247517668e-02 19776 18936 1.55833116296245e-01 19776 18960 3.53543269490997e-01 19776 18984 1.65065719619254e-01 19776 19008 2.17436755825191e-02 19776 19320 1.55809989604785e-01 19776 19344 1.26154202951684e+00 19776 19368 2.88240510455081e+00 19776 19392 1.33184939331854e+00 19776 19416 1.73386830555210e-01 19776 19728 3.51917402669363e-01 19776 19752 2.87066983306139e+00 19776 19800 3.01906849351881e+00 19776 19824 3.89017067783714e-01 19776 20136 1.58909152704619e-01 19776 20160 1.28620340208266e+00 19776 20184 2.93408796318915e+00 19776 20208 1.34221337297530e+00 19776 20232 1.72911645427777e-01 19776 20544 2.02103155267253e-02 19776 20568 1.61998459437700e-01 19776 20592 3.66463984150582e-01 19776 20616 1.67656714533442e-01 19776 20640 2.16248793006608e-02 19777 19777 1.00000000000000e+00 19778 19778 1.00000000000000e+00 19779 19779 1.00000000000000e+00 19780 19780 1.00000000000000e+00 19781 19781 1.00000000000000e+00 19782 19782 1.00000000000000e+00 19783 19783 1.00000000000000e+00 19784 19784 1.00000000000000e+00 19785 19785 1.00000000000000e+00 19786 19786 1.00000000000000e+00 19787 19787 1.00000000000000e+00 19788 19788 1.00000000000000e+00 19789 19789 1.00000000000000e+00 19790 19790 1.00000000000000e+00 19791 19791 1.00000000000000e+00 19792 19792 1.00000000000000e+00 19793 19793 1.00000000000000e+00 19794 19794 1.00000000000000e+00 19795 19795 1.00000000000000e+00 19796 19796 1.00000000000000e+00 19797 19797 1.00000000000000e+00 19798 19798 1.00000000000000e+00 19799 19799 1.00000000000000e+00 19800 8133 -9.82651904440193e-06 19800 8157 -2.02242391247017e-05 19800 8709 -9.73631128109060e-07 19800 8733 -4.08970490628925e-02 19800 8757 -1.90167096788183e-01 19800 8781 -8.46942034598083e-02 19800 8805 -8.34346672447800e-04 19800 9309 -1.10223094013722e-02 19800 9333 -1.01643732635629e+00 19800 9357 -3.93415720552657e+00 19800 9381 -2.05289357518911e+00 19800 9405 -1.15666008616457e-01 19800 9429 -4.66156117325992e-05 19800 9909 -5.20208389584619e-02 19800 9933 -2.10508368685634e+00 19800 9957 -9.44829471250622e+00 19800 9981 -4.72026243498156e+00 19800 10005 -2.74822116270485e-01 19800 10029 -3.23866062505972e-05 19800 10509 -1.23920601170133e-02 19800 10533 -6.26267686291773e-01 19800 10557 -2.46519311508997e+00 19800 10581 -1.35589596977100e+00 19800 10605 -6.04023209590295e-02 19800 11133 -5.60829570506776e-03 19800 11157 -6.35762543224470e-02 19800 11181 -3.63021842950985e-02 19800 11205 -8.30543836997982e-05 19800 19800 8.06500579410412e+00 19800 18936 1.95227543222945e-02 19800 18960 1.65065719619254e-01 19800 18984 3.92592948889671e-01 19800 19008 1.87660243318360e-01 19800 19032 2.51713852470709e-02 19800 19344 1.59575517774422e-01 19800 19368 1.33184939331854e+00 19800 19392 3.14075947710282e+00 19800 19416 1.52152600400075e+00 19800 19440 2.06994670444974e-01 19800 19752 3.65750055595972e-01 19800 19776 3.01906849351881e+00 19800 19824 3.45599888700880e+00 19800 19848 4.74982653968468e-01 19800 20160 1.62641697816043e-01 19800 20184 1.34221337297530e+00 19800 20208 3.13383615769576e+00 19800 20232 1.51007911385203e+00 19800 20256 2.04608133035226e-01 19800 20568 2.02892993326998e-02 19800 20592 1.67656714533442e-01 19800 20616 3.90862119037907e-01 19800 20640 1.84798520781179e-01 19800 20664 2.45747508946339e-02 19801 19801 1.00000000000000e+00 19802 19802 1.00000000000000e+00 19803 19803 1.00000000000000e+00 19804 19804 1.00000000000000e+00 19805 19805 1.00000000000000e+00 19806 19806 1.00000000000000e+00 19807 19807 1.00000000000000e+00 19808 19808 1.00000000000000e+00 19809 19809 1.00000000000000e+00 19810 19810 1.00000000000000e+00 19811 19811 1.00000000000000e+00 19812 19812 1.00000000000000e+00 19813 19813 1.00000000000000e+00 19814 19814 1.00000000000000e+00 19815 19815 1.00000000000000e+00 19816 19816 1.00000000000000e+00 19817 19817 1.00000000000000e+00 19818 19818 1.00000000000000e+00 19819 19819 1.00000000000000e+00 19820 19820 1.00000000000000e+00 19821 19821 1.00000000000000e+00 19822 19822 1.00000000000000e+00 19823 19823 1.00000000000000e+00 19824 8733 -2.09075466857397e-05 19824 8757 -1.72064983002770e-02 19824 8781 -2.47456816655714e-02 19824 8805 -1.04604514369132e-03 19824 9333 -3.85963268737258e-02 19824 9357 -9.05256029699007e-01 19824 9381 -1.87406138757865e+00 19824 9405 -4.36925577003901e-01 19824 9429 -4.21211943045400e-03 19824 9909 -4.00601221406901e-05 19824 9933 -2.53257024583949e-01 19824 9957 -4.91376916156041e+00 19824 9981 -1.02349311736182e+01 19824 10005 -1.87862984396716e+00 19824 10029 -3.06935392903594e-02 19824 10509 -9.92519568879595e-05 19824 10533 -1.55321867795443e-01 19824 10557 -3.01355636355886e+00 19824 10581 -5.68289186565232e+00 19824 10605 -1.20726376709726e+00 19824 10629 -1.07855649151753e-02 19824 11133 -4.05950296912945e-03 19824 11157 -1.94606147503332e-01 19824 11181 -3.17162331399183e-01 19824 11205 -6.26822243240935e-02 19824 11229 -7.17169031686498e-06 19824 11757 -6.05285648237210e-07 19824 11781 -2.64700801715133e-04 19824 11805 -8.40619835414275e-05 19824 19824 9.35462019827739e+00 19824 18960 2.17436755825191e-02 19824 18984 1.87660243318360e-01 19824 19008 4.38078710129996e-01 19824 19032 1.55057023365656e-01 19824 19056 1.35928705943431e-02 19824 19368 1.73386830555210e-01 19824 19392 1.52152600400075e+00 19824 19416 3.62350257752147e+00 19824 19440 1.38078276116627e+00 19824 19464 1.38201019846591e-01 19824 19776 3.89017067783714e-01 19824 19800 3.45599888700880e+00 19824 19848 3.36345328386544e+00 19824 19872 3.65880666997873e-01 19824 20184 1.72911645427777e-01 19824 20208 1.51007911385203e+00 19824 20232 3.59834989756732e+00 19824 20256 1.42526502644431e+00 19824 20280 1.51708123575848e-01 19824 20592 2.16248793006608e-02 19824 20616 1.84798520781179e-01 19824 20640 4.31790540141460e-01 19824 20664 1.66177589685166e-01 19824 20688 1.69696465266575e-02 19825 19825 1.00000000000000e+00 19826 19826 1.00000000000000e+00 19827 19827 1.00000000000000e+00 19828 19828 1.00000000000000e+00 19829 19829 1.00000000000000e+00 19830 19830 1.00000000000000e+00 19831 19831 1.00000000000000e+00 19832 19832 1.00000000000000e+00 19833 19833 1.00000000000000e+00 19834 19834 1.00000000000000e+00 19835 19835 1.00000000000000e+00 19836 19836 1.00000000000000e+00 19837 19837 1.00000000000000e+00 19838 19838 1.00000000000000e+00 19839 19839 1.00000000000000e+00 19840 19840 1.00000000000000e+00 19841 19841 1.00000000000000e+00 19842 19842 1.00000000000000e+00 19843 19843 1.00000000000000e+00 19844 19844 1.00000000000000e+00 19845 19845 1.00000000000000e+00 19846 19846 1.00000000000000e+00 19847 19847 1.00000000000000e+00 19848 8757 -6.02398997712607e-05 19848 8781 -1.69124856312050e-03 19848 8805 -2.23427793991183e-04 19848 9357 -5.14144086384390e-02 19848 9381 -4.28266688460054e-01 19848 9405 -3.49286089514239e-01 19848 9429 -5.65856354692920e-02 19848 9933 -1.17783345955638e-03 19848 9957 -7.67651190101397e-01 19848 9981 -5.10178297208426e+00 19848 10005 -5.86735061115209e+00 19848 10029 -8.79965056906134e-01 19848 10533 -8.02865271787041e-03 19848 10557 -8.31720144615548e-01 19848 10581 -7.61855577416950e+00 19848 10605 -1.01403827040806e+01 19848 10629 -4.56253711353304e-01 19848 11133 -7.09905820190979e-04 19848 11157 -1.13112689805215e-01 19848 11181 -1.92125528213321e+00 19848 11205 -1.64156849315694e+00 19848 11229 -1.16143813803568e-03 19848 11757 -5.73103372691863e-06 19848 11781 -1.42217084326016e-02 19848 11805 -7.39950019853648e-03 19848 19848 9.38018160737733e+00 19848 18984 2.51713852470709e-02 19848 19008 1.55057023365656e-01 19848 19032 3.97365055002482e-01 19848 19056 3.63786962869216e-01 19848 19392 2.06994670444974e-01 19848 19416 1.38078276116628e+00 19848 19440 3.45834867769277e+00 19848 19464 2.63307945879096e+00 19848 19800 4.74982653968468e-01 19848 19824 3.36345328386544e+00 19848 19872 5.56573923087682e+00 19848 20208 2.04608133035226e-01 19848 20232 1.42526502644432e+00 19848 20256 3.89793934425668e+00 19848 20280 3.13883496231905e+00 19848 20616 2.45747508946339e-02 19848 20640 1.66177589685166e-01 19848 20664 5.07262721643460e-01 19848 20688 4.90225838751240e-01 19849 19849 1.00000000000000e+00 19850 19850 1.00000000000000e+00 19851 19851 1.00000000000000e+00 19852 19852 1.00000000000000e+00 19853 19853 1.00000000000000e+00 19854 19854 1.00000000000000e+00 19855 19855 1.00000000000000e+00 19856 19856 1.00000000000000e+00 19857 19857 1.00000000000000e+00 19858 19858 1.00000000000000e+00 19859 19859 1.00000000000000e+00 19860 19860 1.00000000000000e+00 19861 19861 1.00000000000000e+00 19862 19862 1.00000000000000e+00 19863 19863 1.00000000000000e+00 19864 19864 1.00000000000000e+00 19865 19865 1.00000000000000e+00 19866 19866 1.00000000000000e+00 19867 19867 1.00000000000000e+00 19868 19868 1.00000000000000e+00 19869 19869 1.00000000000000e+00 19870 19870 1.00000000000000e+00 19871 19871 1.00000000000000e+00 19872 8781 -1.92421531558400e-08 19872 8805 -2.82679919691200e-08 19872 9357 -8.94809260414000e-09 19872 9381 -1.67149292436570e-02 19872 9405 -1.56683939199442e-01 19872 9429 -8.48984408304536e-02 19872 9957 -8.36244219545056e-03 19872 9981 -9.47053835614473e-01 19872 10005 -5.61186521115555e+00 19872 10029 -1.54591739054227e+00 19872 10557 -5.14093378669878e-02 19872 10581 -4.33414068707041e+00 19872 10605 -1.34003793834150e+01 19872 10629 -8.37008468300378e-01 19872 11157 -2.05692093069994e-02 19872 11181 -2.55228025707641e+00 19872 11205 -2.84652083002141e+00 19872 11229 -2.27267444385331e-03 19872 11757 -7.22506791617681e-06 19872 11781 -2.65905112531973e-02 19872 11805 -1.42105665122830e-02 19872 19872 9.57031379276847e+00 19872 19008 1.35928705943431e-02 19872 19032 3.63786962869216e-01 19872 19056 6.32423831578030e-01 19872 19416 1.38201019846591e-01 19872 19440 2.63307945879095e+00 19872 19464 4.29875177865576e+00 19872 19824 3.65880666997873e-01 19872 19848 5.56573923087682e+00 19872 20232 1.51708123575848e-01 19872 20256 3.13883496231905e+00 19872 20280 5.21571305960715e+00 19872 20640 1.69696465266575e-02 19872 20664 4.90225838751240e-01 19872 20688 8.61664151815878e-01 19873 19873 1.00000000000000e+00 19874 19874 1.00000000000000e+00 19875 19875 1.00000000000000e+00 19876 19876 1.00000000000000e+00 19877 19877 1.00000000000000e+00 19878 19878 1.00000000000000e+00 19879 19879 1.00000000000000e+00 19880 19880 1.00000000000000e+00 19881 19881 1.00000000000000e+00 19882 19882 1.00000000000000e+00 19883 19883 1.00000000000000e+00 19884 19884 1.00000000000000e+00 19885 19885 1.00000000000000e+00 19886 19886 1.00000000000000e+00 19887 19887 1.00000000000000e+00 19888 19888 1.00000000000000e+00 19889 19889 1.00000000000000e+00 19890 19890 1.00000000000000e+00 19891 19891 1.00000000000000e+00 19892 19892 1.00000000000000e+00 19893 19893 1.00000000000000e+00 19894 19894 1.00000000000000e+00 19895 19895 1.00000000000000e+00 19896 6141 -3.79506224605999e-02 19896 6165 -3.24429347867775e-01 19896 6189 -2.06081244686777e-02 19896 6213 -2.93151783220580e-07 19896 6717 -2.99407615582719e-06 19896 6741 -5.00898442642436e+00 19896 6765 -7.28706157576650e+00 19896 6789 -2.12057904827480e-01 19896 6813 -1.19661164935186e-04 19896 7317 -1.22992818690725e-01 19896 7341 -1.38577901086794e+01 19896 7365 -9.81224485046657e+00 19896 7389 -1.98215657855370e-01 19896 7413 -2.08381299950425e-05 19896 7917 -1.49586861259648e-01 19896 7941 -1.94760161133871e+00 19896 7965 -7.35724208401009e-01 19896 7989 -1.97720813716509e-02 19896 8517 -1.07822922226171e-04 19896 8541 -7.88146601817124e-03 19896 8565 -6.72695047920747e-03 19896 8589 -2.51866616999194e-06 19896 19896 1.46474152274486e+01 19896 19080 4.82827500215720e-01 19896 19104 2.94519280705982e-01 19896 19128 1.51730087423205e-02 19896 19488 5.11344358332101e+00 19896 19512 3.01366476430736e+00 19896 19536 1.30555135041958e-01 19896 19920 7.92551584905654e+00 19896 19944 3.14802352952056e-01 19896 20304 4.92634717205973e+00 19896 20328 2.99017165115070e+00 19896 20352 1.50570875748807e-01 19896 20712 4.36053397400399e-01 19896 20736 2.88646002416814e-01 19896 20760 2.01769439190329e-02 19897 19897 1.00000000000000e+00 19898 19898 1.00000000000000e+00 19899 19899 1.00000000000000e+00 19900 19900 1.00000000000000e+00 19901 19901 1.00000000000000e+00 19902 19902 1.00000000000000e+00 19903 19903 1.00000000000000e+00 19904 19904 1.00000000000000e+00 19905 19905 1.00000000000000e+00 19906 19906 1.00000000000000e+00 19907 19907 1.00000000000000e+00 19908 19908 1.00000000000000e+00 19909 19909 1.00000000000000e+00 19910 19910 1.00000000000000e+00 19911 19911 1.00000000000000e+00 19912 19912 1.00000000000000e+00 19913 19913 1.00000000000000e+00 19914 19914 1.00000000000000e+00 19915 19915 1.00000000000000e+00 19916 19916 1.00000000000000e+00 19917 19917 1.00000000000000e+00 19918 19918 1.00000000000000e+00 19919 19919 1.00000000000000e+00 19920 6141 -2.00238148159732e-02 19920 6165 -1.97918336106530e-01 19920 6189 -2.25678303861425e-02 19920 6213 -2.38387544049821e-06 19920 6717 -1.50043593642062e-06 19920 6741 -2.79768642905908e+00 19920 6765 -5.46128485173952e+00 19920 6789 -8.00085278224094e-01 19920 6813 -2.67245997549204e-02 19920 7317 -6.68357069655286e-02 19920 7341 -8.81234700362071e+00 19920 7365 -1.17788140657166e+01 19920 7389 -2.34143120142435e+00 19920 7413 -7.02222855708134e-02 19920 7917 -8.67773264820795e-02 19920 7941 -1.99097178969344e+00 19920 7965 -2.99889266328804e+00 19920 7989 -9.36190402441585e-01 19920 8013 -9.62297346308573e-03 19920 8517 -9.97392066839145e-05 19920 8541 -3.30507753107719e-02 19920 8565 -1.24457816678187e-01 19920 8589 -3.00750972078245e-02 19920 8613 -3.40300235706000e-09 19920 9165 -2.68148023391800e-08 19920 9189 -1.82286164144400e-08 19920 19920 9.81721687035760e+00 19920 19080 2.94519280705982e-01 19920 19104 3.85652247454574e-01 19920 19128 1.64573973805669e-01 19920 19152 2.59704847090969e-02 19920 19488 3.01366476430736e+00 19920 19512 3.53687360286299e+00 19920 19536 1.33129786065527e+00 19920 19560 2.02269330121855e-01 19920 19896 7.92551584905654e+00 19920 19944 3.04811342980969e+00 19920 19968 4.47226004500351e-01 19920 20304 2.99017165115070e+00 19920 20328 3.81228929594170e+00 19920 20352 1.43912834252726e+00 19920 20376 2.09211209883004e-01 19920 20712 2.88646002416814e-01 19920 20736 4.54506170724252e-01 19920 20760 1.91531594273668e-01 19920 20784 2.77059546493841e-02 19921 19921 1.00000000000000e+00 19922 19922 1.00000000000000e+00 19923 19923 1.00000000000000e+00 19924 19924 1.00000000000000e+00 19925 19925 1.00000000000000e+00 19926 19926 1.00000000000000e+00 19927 19927 1.00000000000000e+00 19928 19928 1.00000000000000e+00 19929 19929 1.00000000000000e+00 19930 19930 1.00000000000000e+00 19931 19931 1.00000000000000e+00 19932 19932 1.00000000000000e+00 19933 19933 1.00000000000000e+00 19934 19934 1.00000000000000e+00 19935 19935 1.00000000000000e+00 19936 19936 1.00000000000000e+00 19937 19937 1.00000000000000e+00 19938 19938 1.00000000000000e+00 19939 19939 1.00000000000000e+00 19940 19940 1.00000000000000e+00 19941 19941 1.00000000000000e+00 19942 19942 1.00000000000000e+00 19943 19943 1.00000000000000e+00 19944 6141 -2.99572453049499e-04 19944 6165 -1.07430284427304e-02 19944 6189 -5.20445063742397e-03 19944 6213 -5.13822501368409e-06 19944 6717 -9.70816716290000e-10 19944 6741 -8.38121177760741e-02 19944 6765 -8.51279404173897e-01 19944 6789 -1.20828029646936e+00 19944 6813 -1.44830657291900e-01 19944 6837 -6.49930412057381e-04 19944 7317 -1.52551360576176e-03 19944 7341 -5.98577294457393e-01 19944 7365 -6.52746285474585e+00 19944 7389 -7.42284113932565e+00 19944 7413 -8.20278751359086e-01 19944 7437 -6.95654844075527e-03 19944 7917 -3.42397024350159e-03 19944 7941 -5.06189018822952e-01 19944 7965 -5.28864690628290e+00 19944 7989 -5.30453705292566e+00 19944 8013 -6.31129289373409e-01 19944 8037 -9.54445888291204e-04 19944 8517 -1.30936415916653e-05 19944 8541 -3.82846590392048e-02 19944 8565 -4.87379513125253e-01 19944 8589 -4.41673679756451e-01 19944 8613 -4.19819363012439e-02 19944 9165 -1.91637324661204e-04 19944 9189 -1.46560958747288e-03 19944 9213 -4.99741004107998e-05 19944 19944 8.85982970989361e+00 19944 19080 1.51730087423205e-02 19944 19104 1.64573973805669e-01 19944 19128 4.52628160109014e-01 19944 19152 1.91591522920960e-01 19944 19176 2.19273960211432e-02 19944 19488 1.30555135041958e-01 19944 19512 1.33129786065526e+00 19944 19536 3.54045363333219e+00 19944 19560 1.50343418584935e+00 19944 19584 1.73589216340478e-01 19944 19896 3.14802352952056e-01 19944 19920 3.04811342980969e+00 19944 19968 3.34654915774407e+00 19944 19992 3.89411284935650e-01 19944 20304 1.50570875748807e-01 19944 20328 1.43912834252726e+00 19944 20352 3.67969130569640e+00 19944 20376 1.56380912680985e+00 19944 20400 1.81741071819454e-01 19944 20712 2.01769439190329e-02 19944 20736 1.91531594273668e-01 19944 20760 4.87437578200066e-01 19944 20784 2.06685258161086e-01 19944 20808 2.39653598908874e-02 19945 19945 1.00000000000000e+00 19946 19946 1.00000000000000e+00 19947 19947 1.00000000000000e+00 19948 19948 1.00000000000000e+00 19949 19949 1.00000000000000e+00 19950 19950 1.00000000000000e+00 19951 19951 1.00000000000000e+00 19952 19952 1.00000000000000e+00 19953 19953 1.00000000000000e+00 19954 19954 1.00000000000000e+00 19955 19955 1.00000000000000e+00 19956 19956 1.00000000000000e+00 19957 19957 1.00000000000000e+00 19958 19958 1.00000000000000e+00 19959 19959 1.00000000000000e+00 19960 19960 1.00000000000000e+00 19961 19961 1.00000000000000e+00 19962 19962 1.00000000000000e+00 19963 19963 1.00000000000000e+00 19964 19964 1.00000000000000e+00 19965 19965 1.00000000000000e+00 19966 19966 1.00000000000000e+00 19967 19967 1.00000000000000e+00 19968 6165 -1.45918259762629e-04 19968 6189 -4.57831467629250e-04 19968 6213 -1.21126830761588e-06 19968 6741 -1.13997207202419e-05 19968 6765 -8.96751616157913e-02 19968 6789 -3.96364039902618e-01 19968 6813 -1.90281153849867e-01 19968 6837 -3.82397426018649e-03 19968 7341 -1.62745062553765e-02 19968 7365 -1.42191071427143e+00 19968 7389 -5.34832249232644e+00 19968 7413 -2.65973954927666e+00 19968 7437 -1.43723768517551e-01 19968 7461 -8.79221394985284e-05 19968 7941 -5.81648819907571e-02 19968 7965 -2.11930396500525e+00 19968 7989 -8.88021871768782e+00 19968 8013 -4.23415220768884e+00 19968 8037 -2.32535662013764e-01 19968 8061 -3.38155601221626e-05 19968 8541 -8.24395122984927e-03 19968 8565 -4.60405244955097e-01 19968 8589 -1.71506375002889e+00 19968 8613 -8.23602821426857e-01 19968 8637 -3.45663066015182e-02 19968 9165 -9.09969541231160e-04 19968 9189 -2.30088250458341e-02 19968 9213 -1.62013567064914e-02 19968 9237 -1.67984462863557e-05 19968 19968 8.04427054762158e+00 19968 19104 2.59704847090969e-02 19968 19128 1.91591522920960e-01 19968 19152 3.97019136574113e-01 19968 19176 1.68550846191471e-01 19968 19200 2.02103155267244e-02 19968 19512 2.02269330121855e-01 19968 19536 1.50343418584935e+00 19968 19560 3.14169525100726e+00 19968 19584 1.34235070311271e+00 19968 19608 1.61998459437697e-01 19968 19920 4.47226004500351e-01 19968 19944 3.34654915774407e+00 19968 19992 3.02350107634499e+00 19968 20016 3.66463984150582e-01 19968 20328 2.09211209883004e-01 19968 20352 1.56380912680985e+00 19968 20376 3.28472507352778e+00 19968 20400 1.39759114541160e+00 19968 20424 1.67656714533442e-01 19968 20736 2.77059546493841e-02 19968 20760 2.06685258161086e-01 19968 20784 4.32776592204243e-01 19968 20808 1.82360956766193e-01 19968 20832 2.16248793006608e-02 19969 19969 1.00000000000000e+00 19970 19970 1.00000000000000e+00 19971 19971 1.00000000000000e+00 19972 19972 1.00000000000000e+00 19973 19973 1.00000000000000e+00 19974 19974 1.00000000000000e+00 19975 19975 1.00000000000000e+00 19976 19976 1.00000000000000e+00 19977 19977 1.00000000000000e+00 19978 19978 1.00000000000000e+00 19979 19979 1.00000000000000e+00 19980 19980 1.00000000000000e+00 19981 19981 1.00000000000000e+00 19982 19982 1.00000000000000e+00 19983 19983 1.00000000000000e+00 19984 19984 1.00000000000000e+00 19985 19985 1.00000000000000e+00 19986 19986 1.00000000000000e+00 19987 19987 1.00000000000000e+00 19988 19988 1.00000000000000e+00 19989 19989 1.00000000000000e+00 19990 19990 1.00000000000000e+00 19991 19991 1.00000000000000e+00 19992 6765 -8.35721701630051e-05 19992 6789 -3.39204386699661e-02 19992 6813 -6.02435661366238e-02 19992 6837 -5.56934197282910e-03 19992 7365 -5.17816687505490e-02 19992 7389 -1.18550249725812e+00 19992 7413 -2.30331252695496e+00 19992 7437 -5.94848422720118e-01 19992 7461 -1.20177584135245e-02 19992 7941 -3.40800829606917e-05 19992 7965 -2.45488223812455e-01 19992 7989 -4.25765599427589e+00 19992 8013 -8.86448444529013e+00 19992 8037 -2.01599738264807e+00 19992 8061 -4.94140797644586e-02 19992 8541 -4.71154979898946e-05 19992 8565 -1.09952822002808e-01 19992 8589 -1.97095422806587e+00 19992 8613 -3.78383013424044e+00 19992 8637 -9.93116571711704e-01 19992 8661 -1.02953049434362e-02 19992 9165 -7.66819923937578e-04 19992 9189 -8.21777190579337e-02 19992 9213 -1.94900128605103e-01 19992 9237 -4.20503355344792e-02 19992 9261 -6.22249116570490e-07 19992 9813 -1.80659238066755e-05 19992 9837 -8.76502208940850e-06 19992 19992 7.61989303799189e+00 19992 19128 2.19273960211432e-02 19992 19152 1.68550846191471e-01 19992 19176 3.64809417098163e-01 19992 19200 1.58909152704612e-01 19992 19224 1.95169726494285e-02 19992 19536 1.73589216340478e-01 19992 19560 1.34235070311271e+00 19992 19584 2.92511695842665e+00 19992 19608 1.28620340208265e+00 19992 19632 1.59552391082961e-01 19992 19944 3.89411284935650e-01 19992 19968 3.02350107634499e+00 19992 20016 2.93408796318918e+00 19992 20040 3.67058006646699e-01 19992 20352 1.81741071819454e-01 19992 20376 1.39759114541160e+00 19992 20400 3.03214513306497e+00 19992 20424 1.34221337297529e+00 19992 20448 1.67896628710377e-01 19992 20760 2.39653598908874e-02 19992 20784 1.82360956766193e-01 19992 20808 3.91566460757743e-01 19992 20832 1.72911645427774e-01 19992 20856 2.16030320562826e-02 19993 19993 1.00000000000000e+00 19994 19994 1.00000000000000e+00 19995 19995 1.00000000000000e+00 19996 19996 1.00000000000000e+00 19997 19997 1.00000000000000e+00 19998 19998 1.00000000000000e+00 19999 19999 1.00000000000000e+00 20000 20000 1.00000000000000e+00 20001 20001 1.00000000000000e+00 20002 20002 1.00000000000000e+00 20003 20003 1.00000000000000e+00 20004 20004 1.00000000000000e+00 20005 20005 1.00000000000000e+00 20006 20006 1.00000000000000e+00 20007 20007 1.00000000000000e+00 20008 20008 1.00000000000000e+00 20009 20009 1.00000000000000e+00 20010 20010 1.00000000000000e+00 20011 20011 1.00000000000000e+00 20012 20012 1.00000000000000e+00 20013 20013 1.00000000000000e+00 20014 20014 1.00000000000000e+00 20015 20015 1.00000000000000e+00 20016 6789 -1.51013638628261e-04 20016 6813 -5.16812501595168e-03 20016 6837 -1.31385706373231e-03 20016 7389 -6.46783074102998e-02 20016 7413 -5.92579518169752e-01 20016 7437 -6.28313393694458e-01 20016 7461 -6.33960961775753e-02 20016 7485 -1.53172366412972e-04 20016 7965 -1.29536421402409e-03 20016 7989 -6.39847535218475e-01 20016 8013 -5.31142189658321e+00 20016 8037 -5.25957862952259e+00 20016 8061 -5.74376861200484e-01 20016 8085 -4.85672977793047e-03 20016 8565 -5.15015269182182e-03 20016 8589 -6.07890324229398e-01 20016 8613 -5.35935612814161e+00 20016 8637 -5.24984454072561e+00 20016 8661 -6.13801984343060e-01 20016 8685 -1.17815807475609e-03 20016 9165 -1.43822464621433e-04 20016 9189 -6.57338060232593e-02 20016 9213 -6.58101042165434e-01 20016 9237 -5.99376677632743e-01 20016 9261 -6.23693251947758e-02 20016 9813 -1.21445491145510e-03 20016 9837 -5.05902499824320e-03 20016 9861 -1.52757987606118e-04 20016 20016 7.59293535998900e+00 20016 19152 2.02103155267244e-02 20016 19176 1.58909152704612e-01 20016 19200 3.51917402669347e-01 20016 19224 1.55809989604779e-01 20016 19248 1.94355247517662e-02 20016 19560 1.61998459437697e-01 20016 19584 1.28620340208265e+00 20016 19608 2.87066983306137e+00 20016 19632 1.26154202951684e+00 20016 19656 1.55833116296245e-01 20016 19968 3.66463984150582e-01 20016 19992 2.93408796318918e+00 20016 20040 2.88240510455087e+00 20016 20064 3.53543269491004e-01 20016 20376 1.67656714533442e-01 20016 20400 1.34221337297529e+00 20016 20424 3.01906849351879e+00 20016 20448 1.33184939331854e+00 20016 20472 1.65065719619253e-01 20016 20784 2.16248793006608e-02 20016 20808 1.72911645427774e-01 20016 20832 3.89017067783700e-01 20016 20856 1.73386830555204e-01 20016 20880 2.17436755825183e-02 20017 20017 1.00000000000000e+00 20018 20018 1.00000000000000e+00 20019 20019 1.00000000000000e+00 20020 20020 1.00000000000000e+00 20021 20021 1.00000000000000e+00 20022 20022 1.00000000000000e+00 20023 20023 1.00000000000000e+00 20024 20024 1.00000000000000e+00 20025 20025 1.00000000000000e+00 20026 20026 1.00000000000000e+00 20027 20027 1.00000000000000e+00 20028 20028 1.00000000000000e+00 20029 20029 1.00000000000000e+00 20030 20030 1.00000000000000e+00 20031 20031 1.00000000000000e+00 20032 20032 1.00000000000000e+00 20033 20033 1.00000000000000e+00 20034 20034 1.00000000000000e+00 20035 20035 1.00000000000000e+00 20036 20036 1.00000000000000e+00 20037 20037 1.00000000000000e+00 20038 20038 1.00000000000000e+00 20039 20039 1.00000000000000e+00 20040 6813 -1.04073115619178e-05 20040 6837 -2.24011129438342e-05 20040 7389 -7.02160393795440e-07 20040 7413 -4.05088426167662e-02 20040 7437 -1.85183137996140e-01 20040 7461 -7.95778024835319e-02 20040 7485 -8.00980653817300e-04 20040 7989 -1.05393873554722e-02 20040 8013 -9.90842359720009e-01 20040 8037 -3.65852053446204e+00 20040 8061 -1.83374722468626e+00 20040 8085 -9.46399802028857e-02 20040 8109 -4.25390998073090e-05 20040 8589 -5.22627933309468e-02 20040 8613 -2.02840327989389e+00 20040 8637 -8.57804786423769e+00 20040 8661 -3.97166244870871e+00 20040 8685 -2.13828212972158e-01 20040 8709 -2.95151509768487e-05 20040 9189 -1.24654553297142e-02 20040 9213 -6.12047630761552e-01 20040 9237 -2.25808474336944e+00 20040 9261 -1.08618188199013e+00 20040 9285 -4.65170820385618e-02 20040 9813 -5.13431393213628e-03 20040 9837 -5.53882674114023e-02 20040 9861 -3.06138592859709e-02 20040 9885 -7.26889822415117e-05 20040 20040 7.37694384582190e+00 20040 19176 1.95169726494285e-02 20040 19200 1.55809989604779e-01 20040 19224 3.49682107570653e-01 20040 19248 1.54529054578925e-01 20040 19272 1.91967388929650e-02 20040 19584 1.59552391082961e-01 20040 19608 1.26154202951684e+00 20040 19632 2.80798832008810e+00 20040 19656 1.24375673824568e+00 20040 19680 1.55106068265173e-01 20040 19992 3.67058006646699e-01 20040 20016 2.88240510455087e+00 20040 20064 2.82694718723973e+00 20040 20088 3.53193527318915e-01 20040 20400 1.67896628710377e-01 20040 20424 1.33184939331854e+00 20040 20448 2.97014860592259e+00 20040 20472 1.30506473169344e+00 20040 20496 1.61200463304104e-01 20040 20808 2.16030320562826e-02 20040 20832 1.73386830555204e-01 20040 20856 3.90222179029274e-01 20040 20880 1.69856052940864e-01 20040 20904 2.07203376526978e-02 20041 20041 1.00000000000000e+00 20042 20042 1.00000000000000e+00 20043 20043 1.00000000000000e+00 20044 20044 1.00000000000000e+00 20045 20045 1.00000000000000e+00 20046 20046 1.00000000000000e+00 20047 20047 1.00000000000000e+00 20048 20048 1.00000000000000e+00 20049 20049 1.00000000000000e+00 20050 20050 1.00000000000000e+00 20051 20051 1.00000000000000e+00 20052 20052 1.00000000000000e+00 20053 20053 1.00000000000000e+00 20054 20054 1.00000000000000e+00 20055 20055 1.00000000000000e+00 20056 20056 1.00000000000000e+00 20057 20057 1.00000000000000e+00 20058 20058 1.00000000000000e+00 20059 20059 1.00000000000000e+00 20060 20060 1.00000000000000e+00 20061 20061 1.00000000000000e+00 20062 20062 1.00000000000000e+00 20063 20063 1.00000000000000e+00 20064 7413 -1.65162946727460e-05 20064 7437 -1.53834825153154e-02 20064 7461 -2.19885461768131e-02 20064 7485 -9.06390528705472e-04 20064 8013 -3.37284796292226e-02 20064 8037 -7.80770559015173e-01 20064 8061 -1.50118703445927e+00 20064 8085 -3.76017434900473e-01 20064 8109 -6.09418934663195e-03 20064 8589 -3.43528606209348e-05 20064 8613 -2.30669445532562e-01 20064 8637 -3.96244886125048e+00 20064 8661 -7.93340222138199e+00 20064 8685 -1.71860913009062e+00 20064 8709 -4.17062818071608e-02 20064 9189 -8.49783613857441e-05 20064 9213 -1.43978339114222e-01 20064 9237 -2.44933938889466e+00 20064 9261 -4.66363090861408e+00 20064 9285 -1.14612630496388e+00 20064 9309 -1.23074871066057e-02 20064 9813 -3.33212378989244e-03 20064 9837 -1.66742076918558e-01 20064 9861 -3.28645579300927e-01 20064 9885 -7.08050616192463e-02 20064 9909 -8.41167939047527e-06 20064 10437 -5.41995950758390e-07 20064 10461 -3.14289429538516e-04 20064 10485 -1.04917510642629e-04 20064 20064 7.36002245700817e+00 20064 19200 1.94355247517662e-02 20064 19224 1.54529054578925e-01 20064 19248 3.45459097587972e-01 20064 19272 1.52289957766922e-01 20064 19296 1.88757505487655e-02 20064 19608 1.55833116296245e-01 20064 19632 1.24375673824568e+00 20064 19656 2.79178445855528e+00 20064 19680 1.23744127312556e+00 20064 19704 1.54254250016213e-01 20064 20016 3.53543269491004e-01 20064 20040 2.82694718723973e+00 20064 20088 2.83430511093295e+00 20064 20112 3.55382750414308e-01 20064 20424 1.65065719619253e-01 20064 20448 1.30506473169344e+00 20064 20472 2.90903241462988e+00 20064 20496 1.30383898179606e+00 20064 20520 1.64759282144908e-01 20064 20832 2.17436755825183e-02 20064 20856 1.69856052940864e-01 20064 20880 3.74771086606622e-01 20064 20904 1.68889384934548e-01 20064 20928 2.15020085809392e-02 20065 20065 1.00000000000000e+00 20066 20066 1.00000000000000e+00 20067 20067 1.00000000000000e+00 20068 20068 1.00000000000000e+00 20069 20069 1.00000000000000e+00 20070 20070 1.00000000000000e+00 20071 20071 1.00000000000000e+00 20072 20072 1.00000000000000e+00 20073 20073 1.00000000000000e+00 20074 20074 1.00000000000000e+00 20075 20075 1.00000000000000e+00 20076 20076 1.00000000000000e+00 20077 20077 1.00000000000000e+00 20078 20078 1.00000000000000e+00 20079 20079 1.00000000000000e+00 20080 20080 1.00000000000000e+00 20081 20081 1.00000000000000e+00 20082 20082 1.00000000000000e+00 20083 20083 1.00000000000000e+00 20084 20084 1.00000000000000e+00 20085 20085 1.00000000000000e+00 20086 20086 1.00000000000000e+00 20087 20087 1.00000000000000e+00 20088 7437 -4.34911550910312e-05 20088 7461 -1.33629378071348e-03 20088 7485 -1.88504826688788e-04 20088 8037 -3.76488888679956e-02 20088 8061 -3.62480097222255e-01 20088 8085 -3.63297660228324e-01 20088 8109 -3.01220400623416e-02 20088 8133 -1.69496349620305e-05 20088 8613 -8.94813647991526e-04 20088 8637 -5.70727423507661e-01 20088 8661 -4.40199915461421e+00 20088 8685 -4.18131636633928e+00 20088 8709 -4.46824974409313e-01 20088 8733 -3.48186344649808e-03 20088 9213 -6.31400259870918e-03 20088 9237 -7.15791459635724e-01 20088 9261 -6.07799992998220e+00 20088 9285 -5.69463606063288e+00 20088 9309 -6.27007469647823e-01 20088 9333 -1.49333307771921e-03 20088 9813 -5.47483143416012e-04 20088 9837 -1.17769960030617e-01 20088 9861 -1.02406696179593e+00 20088 9885 -8.81184445223634e-01 20088 9909 -9.45460057249828e-02 20088 9933 -7.06933854300000e-10 20088 10437 -2.39915213309620e-06 20088 10461 -5.50462311142653e-03 20088 10485 -1.36571193791509e-02 20088 10509 -3.98715594254578e-04 20088 20088 7.38973295076645e+00 20088 19224 1.91967388929650e-02 20088 19248 1.52289957766922e-01 20088 19272 3.40595559996944e-01 20088 19296 1.53050251489986e-01 20088 19320 1.93868123237310e-02 20088 19632 1.55106068265173e-01 20088 19656 1.23744127312556e+00 20088 19680 2.77817258011407e+00 20088 19704 1.23701104642262e+00 20088 19728 1.54998511589438e-01 20088 20040 3.53193527318915e-01 20088 20064 2.83430511093295e+00 20088 20112 2.82319266893079e+00 20088 20136 3.50415416818376e-01 20088 20448 1.61200463304104e-01 20088 20472 1.30383898179606e+00 20088 20496 2.95969446118355e+00 20088 20520 1.30841906282309e+00 20088 20544 1.62345483560861e-01 20088 20856 2.07203376526978e-02 20088 20880 1.68889384934548e-01 20088 20904 3.85976030264312e-01 20088 20928 1.70902255590103e-01 20088 20952 2.12235553165866e-02 20089 20089 1.00000000000000e+00 20090 20090 1.00000000000000e+00 20091 20091 1.00000000000000e+00 20092 20092 1.00000000000000e+00 20093 20093 1.00000000000000e+00 20094 20094 1.00000000000000e+00 20095 20095 1.00000000000000e+00 20096 20096 1.00000000000000e+00 20097 20097 1.00000000000000e+00 20098 20098 1.00000000000000e+00 20099 20099 1.00000000000000e+00 20100 20100 1.00000000000000e+00 20101 20101 1.00000000000000e+00 20102 20102 1.00000000000000e+00 20103 20103 1.00000000000000e+00 20104 20104 1.00000000000000e+00 20105 20105 1.00000000000000e+00 20106 20106 1.00000000000000e+00 20107 20107 1.00000000000000e+00 20108 20108 1.00000000000000e+00 20109 20109 1.00000000000000e+00 20110 20110 1.00000000000000e+00 20111 20111 1.00000000000000e+00 20112 7461 -3.49041330603600e-08 20112 7485 -5.34096308434300e-08 20112 8037 -3.72328364354000e-09 20112 8061 -2.17405842911069e-02 20112 8085 -9.77203966759727e-02 20112 8109 -3.16680109148224e-02 20112 8133 -8.00448419937318e-05 20112 8637 -7.75557904544798e-03 20112 8661 -7.65783553595153e-01 20112 8685 -2.69588979393638e+00 20112 8709 -1.33991019064063e+00 20112 8733 -6.23061972031633e-02 20112 8757 -1.96401349981369e-05 20112 9237 -5.64564483220383e-02 20112 9261 -2.14962332383443e+00 20112 9285 -8.67746750985515e+00 20112 9309 -3.82742487958775e+00 20112 9333 -1.98152836711833e-01 20112 9357 -2.31930704160447e-05 20112 9837 -2.11921539795360e-02 20112 9861 -8.56623399539274e-01 20112 9885 -3.07599406256265e+00 20112 9909 -1.44359395821837e+00 20112 9933 -6.10846835017329e-02 20112 10437 -1.46666927100900e-06 20112 10461 -1.87272890764832e-02 20112 10485 -1.19803551127478e-01 20112 10509 -5.66160552656313e-02 20112 10533 -2.50664090970476e-04 20112 11085 -2.45870515439590e-07 20112 11109 -4.73650354579940e-07 20112 20112 7.31846347239766e+00 20112 19248 1.88757505487655e-02 20112 19272 1.53050251489986e-01 20112 19296 3.48306772694077e-01 20112 19320 1.54515349157388e-01 20112 19344 1.92420249656160e-02 20112 19656 1.54254250016213e-01 20112 19680 1.23701104642262e+00 20112 19704 2.79022848518572e+00 20112 19728 1.24398624531150e+00 20112 19752 1.55998049738432e-01 20112 20064 3.55382750414308e-01 20112 20088 2.82319266893079e+00 20112 20136 2.82739787883000e+00 20112 20160 3.56434052889109e-01 20112 20472 1.64759282144908e-01 20112 20496 1.30841906282309e+00 20112 20520 2.92560588267319e+00 20112 20544 1.30265738846125e+00 20112 20568 1.63318863554447e-01 20112 20880 2.15020085809392e-02 20112 20904 1.70902255590103e-01 20112 20928 3.82151122065945e-01 20112 20952 1.69183134944825e-01 20112 20976 2.10722284196196e-02 20113 20113 1.00000000000000e+00 20114 20114 1.00000000000000e+00 20115 20115 1.00000000000000e+00 20116 20116 1.00000000000000e+00 20117 20117 1.00000000000000e+00 20118 20118 1.00000000000000e+00 20119 20119 1.00000000000000e+00 20120 20120 1.00000000000000e+00 20121 20121 1.00000000000000e+00 20122 20122 1.00000000000000e+00 20123 20123 1.00000000000000e+00 20124 20124 1.00000000000000e+00 20125 20125 1.00000000000000e+00 20126 20126 1.00000000000000e+00 20127 20127 1.00000000000000e+00 20128 20128 1.00000000000000e+00 20129 20129 1.00000000000000e+00 20130 20130 1.00000000000000e+00 20131 20131 1.00000000000000e+00 20132 20132 1.00000000000000e+00 20133 20133 1.00000000000000e+00 20134 20134 1.00000000000000e+00 20135 20135 1.00000000000000e+00 20136 8061 -2.63632843519922e-06 20136 8085 -6.88640208816373e-03 20136 8109 -7.22537427582635e-03 20136 8133 -6.59348435444703e-05 20136 8661 -2.21346096836282e-02 20136 8685 -5.34791752860129e-01 20136 8709 -9.98666130461230e-01 20136 8733 -2.35972834052833e-01 20136 8757 -2.75454565147822e-03 20136 9237 -2.84457677356842e-05 20136 9261 -2.26074176801017e-01 20136 9285 -3.75690140381865e+00 20136 9309 -7.13291989148040e+00 20136 9333 -1.48988839847490e+00 20136 9357 -3.58048723393170e-02 20136 9837 -1.52153242486529e-04 20136 9861 -1.90496251635001e-01 20136 9885 -3.09628035087767e+00 20136 9909 -5.76875780633070e+00 20136 9933 -1.32965709172451e+00 20136 9957 -1.50083400241692e-02 20136 10437 -2.31168330062650e-07 20136 10461 -9.94001768869176e-03 20136 10485 -3.13158933648108e-01 20136 10509 -5.43816655026182e-01 20136 10533 -1.18129358804486e-01 20136 10557 -4.77885378091536e-05 20136 11085 -4.68209319752308e-05 20136 11109 -1.98398564923316e-03 20136 11133 -4.73461040574712e-04 20136 20136 7.41816968014253e+00 20136 19272 1.93868123237310e-02 20136 19296 1.54515349157388e-01 20136 19320 3.46776184423016e-01 20136 19344 1.55035990460182e-01 20136 19368 1.95169726494294e-02 20136 19680 1.54998511589438e-01 20136 19704 1.24398624531150e+00 20136 19728 2.80987646010903e+00 20136 19752 1.25962880977222e+00 20136 19776 1.58909152704619e-01 20136 20088 3.50415416818376e-01 20136 20112 2.82739787883000e+00 20136 20160 2.88497387994920e+00 20136 20184 3.64809417098178e-01 20136 20496 1.62345483560861e-01 20136 20520 1.30265738846125e+00 20136 20544 2.94399814662354e+00 20136 20568 1.32747883898370e+00 20136 20592 1.68550846191475e-01 20136 20904 2.12235553165866e-02 20136 20928 1.69183134944825e-01 20136 20952 3.80306606051644e-01 20136 20976 1.71998497763053e-01 20136 21000 2.19273960211435e-02 20137 20137 1.00000000000000e+00 20138 20138 1.00000000000000e+00 20139 20139 1.00000000000000e+00 20140 20140 1.00000000000000e+00 20141 20141 1.00000000000000e+00 20142 20142 1.00000000000000e+00 20143 20143 1.00000000000000e+00 20144 20144 1.00000000000000e+00 20145 20145 1.00000000000000e+00 20146 20146 1.00000000000000e+00 20147 20147 1.00000000000000e+00 20148 20148 1.00000000000000e+00 20149 20149 1.00000000000000e+00 20150 20150 1.00000000000000e+00 20151 20151 1.00000000000000e+00 20152 20152 1.00000000000000e+00 20153 20153 1.00000000000000e+00 20154 20154 1.00000000000000e+00 20155 20155 1.00000000000000e+00 20156 20156 1.00000000000000e+00 20157 20157 1.00000000000000e+00 20158 20158 1.00000000000000e+00 20159 20159 1.00000000000000e+00 20160 8085 -8.91149563795798e-06 20160 8109 -2.10501275725715e-04 20160 8133 -1.22463021456100e-05 20160 8685 -2.16163911218320e-02 20160 8709 -2.24619371477823e-01 20160 8733 -2.06892058202002e-01 20160 8757 -1.26258116673761e-02 20160 8781 -1.40505858852180e-07 20160 9261 -6.05453066284460e-04 20160 9285 -5.08138615513834e-01 20160 9309 -3.67439368781390e+00 20160 9333 -3.39171852619217e+00 20160 9357 -3.52156070294242e-01 20160 9381 -2.41400275343922e-03 20160 9861 -7.58954126479111e-03 20160 9885 -8.49994985456533e-01 20160 9909 -6.93663822977343e+00 20160 9933 -6.23407982509980e+00 20160 9957 -6.48829834041644e-01 20160 9981 -1.79342829018027e-03 20160 10461 -1.42313807385482e-03 20160 10485 -1.98701968048535e-01 20160 10509 -1.56150964536208e+00 20160 10533 -1.30451795486920e+00 20160 10557 -1.41157639159405e-01 20160 10581 -2.47764597396870e-07 20160 11085 -1.93029350231713e-04 20160 11109 -1.95621366677711e-02 20160 11133 -3.11108491462272e-02 20160 11157 -9.44207889060297e-04 20160 20160 7.55985454896867e+00 20160 19296 1.92420249656160e-02 20160 19320 1.55035990460182e-01 20160 19344 3.51884712477798e-01 20160 19368 1.59552391082962e-01 20160 19392 2.03711251213111e-02 20160 19704 1.55998049738432e-01 20160 19728 1.25962880977222e+00 20160 19752 2.86118619082843e+00 20160 19776 1.28620340208266e+00 20160 19800 1.62641697816043e-01 20160 20112 3.56434052889109e-01 20160 20136 2.88497387994920e+00 20160 20184 2.92511695842670e+00 20160 20208 3.66469822508484e-01 20160 20520 1.63318863554447e-01 20160 20544 1.32747883898370e+00 20160 20568 3.02716923220482e+00 20160 20592 1.34235070311274e+00 20160 20616 1.67036829586706e-01 20160 20928 2.10722284196196e-02 20160 20952 1.71998497763053e-01 20160 20976 3.93380472821893e-01 20160 21000 1.73589216340481e-01 20160 21024 2.14699080639767e-02 20161 20161 1.00000000000000e+00 20162 20162 1.00000000000000e+00 20163 20163 1.00000000000000e+00 20164 20164 1.00000000000000e+00 20165 20165 1.00000000000000e+00 20166 20166 1.00000000000000e+00 20167 20167 1.00000000000000e+00 20168 20168 1.00000000000000e+00 20169 20169 1.00000000000000e+00 20170 20170 1.00000000000000e+00 20171 20171 1.00000000000000e+00 20172 20172 1.00000000000000e+00 20173 20173 1.00000000000000e+00 20174 20174 1.00000000000000e+00 20175 20175 1.00000000000000e+00 20176 20176 1.00000000000000e+00 20177 20177 1.00000000000000e+00 20178 20178 1.00000000000000e+00 20179 20179 1.00000000000000e+00 20180 20180 1.00000000000000e+00 20181 20181 1.00000000000000e+00 20182 20182 1.00000000000000e+00 20183 20183 1.00000000000000e+00 20184 8709 -1.20177584135251e-02 20184 8733 -4.94140797644601e-02 20184 8757 -1.02953049434361e-02 20184 8781 -6.22249116570470e-07 20184 9285 -5.56934197282932e-03 20184 9309 -5.94848422720141e-01 20184 9333 -2.01599738264808e+00 20184 9357 -9.93116571711688e-01 20184 9381 -4.20503355344801e-02 20184 9405 -8.76502208940883e-06 20184 9885 -6.02435661366252e-02 20184 9909 -2.30331252695501e+00 20184 9933 -8.86448444529016e+00 20184 9957 -3.78383013424043e+00 20184 9981 -1.94900128605116e-01 20184 10005 -1.80659238066762e-05 20184 10485 -3.39204386699666e-02 20184 10509 -1.18550249725814e+00 20184 10533 -4.25765599427593e+00 20184 10557 -1.97095422806587e+00 20184 10581 -8.21777190579342e-02 20184 11085 -8.35721701630065e-05 20184 11109 -5.17816687505501e-02 20184 11133 -2.45488223812452e-01 20184 11157 -1.09952822002811e-01 20184 11181 -7.66819923937583e-04 20184 11733 -3.40800829606925e-05 20184 11757 -4.71154979898957e-05 20184 20184 7.61989303799190e+00 20184 19320 1.95169726494294e-02 20184 19344 1.59552391082962e-01 20184 19368 3.67058006646690e-01 20184 19392 1.67896628710378e-01 20184 19416 2.16030320562834e-02 20184 19728 1.58909152704619e-01 20184 19752 1.28620340208266e+00 20184 19776 2.93408796318915e+00 20184 19800 1.34221337297530e+00 20184 19824 1.72911645427777e-01 20184 20136 3.64809417098178e-01 20184 20160 2.92511695842670e+00 20184 20208 3.03214513306497e+00 20184 20232 3.91566460757745e-01 20184 20544 1.68550846191475e-01 20184 20568 1.34235070311274e+00 20184 20592 3.02350107634502e+00 20184 20616 1.39759114541162e+00 20184 20640 1.82360956766195e-01 20184 20952 2.19273960211435e-02 20184 20976 1.73589216340481e-01 20184 21000 3.89411284935658e-01 20184 21024 1.81741071819458e-01 20184 21048 2.39653598908880e-02 20185 20185 1.00000000000000e+00 20186 20186 1.00000000000000e+00 20187 20187 1.00000000000000e+00 20188 20188 1.00000000000000e+00 20189 20189 1.00000000000000e+00 20190 20190 1.00000000000000e+00 20191 20191 1.00000000000000e+00 20192 20192 1.00000000000000e+00 20193 20193 1.00000000000000e+00 20194 20194 1.00000000000000e+00 20195 20195 1.00000000000000e+00 20196 20196 1.00000000000000e+00 20197 20197 1.00000000000000e+00 20198 20198 1.00000000000000e+00 20199 20199 1.00000000000000e+00 20200 20200 1.00000000000000e+00 20201 20201 1.00000000000000e+00 20202 20202 1.00000000000000e+00 20203 20203 1.00000000000000e+00 20204 20204 1.00000000000000e+00 20205 20205 1.00000000000000e+00 20206 20206 1.00000000000000e+00 20207 20207 1.00000000000000e+00 20208 8709 -2.22255490871330e-07 20208 8733 -2.61242579381700e-03 20208 8757 -1.94381303127232e-03 20208 8781 -3.81408583499220e-07 20208 9309 -1.39338207108136e-02 20208 9333 -3.72818880152228e-01 20208 9357 -6.98575913356137e-01 20208 9381 -1.56845308931476e-01 20208 9405 -1.21570673088838e-03 20208 9885 -1.60601360825510e-05 20208 9909 -2.24374614877640e-01 20208 9933 -3.64519484217998e+00 20208 9957 -6.73991693558084e+00 20208 9981 -1.46587366422923e+00 20208 10005 -3.78886813069660e-02 20208 10485 -2.48574860122963e-04 20208 10509 -2.51340603069221e-01 20208 10533 -4.10122884318582e+00 20208 10557 -7.59830514439925e+00 20208 10581 -1.73717993124595e+00 20208 10605 -2.22660675726951e-02 20208 11085 -9.43368006238351e-06 20208 11109 -2.46988284185836e-02 20208 11133 -6.03687179371132e-01 20208 11157 -1.01738905164712e+00 20208 11181 -2.28262293221435e-01 20208 11205 -1.86284564303335e-04 20208 11733 -7.23038149697048e-04 20208 11757 -9.50245677540129e-03 20208 11781 -1.76545037455339e-03 20208 20208 8.07954935078669e+00 20208 19344 2.03711251213111e-02 20208 19368 1.67896628710378e-01 20208 19392 3.92596920386018e-01 20208 19416 1.92721257681825e-01 20208 19440 2.65772823641727e-02 20208 19752 1.62641697816043e-01 20208 19776 1.34221337297530e+00 20208 19800 3.13383615769576e+00 20208 19824 1.51007911385203e+00 20208 19848 2.04608133035226e-01 20208 20160 3.66469822508484e-01 20208 20184 3.03214513306497e+00 20208 20232 3.35833046764721e+00 20208 20256 4.48016156154042e-01 20208 20568 1.67036829586706e-01 20208 20592 1.39759114541162e+00 20208 20616 3.29608257932734e+00 20208 20640 1.57452559299057e+00 20208 20664 2.11270441481444e-01 20208 20976 2.14699080639767e-02 20208 21000 1.81741071819458e-01 20208 21024 4.33158525793911e-01 20208 21048 2.08832877466460e-01 20208 21072 2.82428594757271e-02 20209 20209 1.00000000000000e+00 20210 20210 1.00000000000000e+00 20211 20211 1.00000000000000e+00 20212 20212 1.00000000000000e+00 20213 20213 1.00000000000000e+00 20214 20214 1.00000000000000e+00 20215 20215 1.00000000000000e+00 20216 20216 1.00000000000000e+00 20217 20217 1.00000000000000e+00 20218 20218 1.00000000000000e+00 20219 20219 1.00000000000000e+00 20220 20220 1.00000000000000e+00 20221 20221 1.00000000000000e+00 20222 20222 1.00000000000000e+00 20223 20223 1.00000000000000e+00 20224 20224 1.00000000000000e+00 20225 20225 1.00000000000000e+00 20226 20226 1.00000000000000e+00 20227 20227 1.00000000000000e+00 20228 20228 1.00000000000000e+00 20229 20229 1.00000000000000e+00 20230 20230 1.00000000000000e+00 20231 20231 1.00000000000000e+00 20232 8733 -7.74689897242070e-07 20232 8757 -1.03954862092587e-05 20232 8781 -6.02256811617600e-08 20232 9333 -1.29970123836129e-02 20232 9357 -1.53167292222670e-01 20232 9381 -1.32485464574330e-01 20232 9405 -5.08853050101858e-03 20232 9909 -4.19129189440235e-04 20232 9933 -4.69701797998805e-01 20232 9957 -3.40661737920486e+00 20232 9981 -3.24277390370992e+00 20232 10005 -2.94052989407060e-01 20232 10029 -1.52616840616765e-03 20232 10509 -9.54620552641516e-03 20232 10533 -1.09956716241355e+00 20232 10557 -8.89099175463561e+00 20232 10581 -7.16654941689160e+00 20232 10605 -5.87225973957996e-01 20232 10629 -1.90946386181230e-03 20232 11109 -3.26638239810662e-03 20232 11133 -3.75923620321781e-01 20232 11157 -2.67231919083987e+00 20232 11181 -1.76103804557894e+00 20232 11205 -1.57674992663912e-01 20232 11229 -2.54630692488367e-06 20232 11733 -2.41565249248572e-03 20232 11757 -5.51496939522473e-02 20232 11781 -4.67880445595058e-02 20232 11805 -1.54634762008407e-03 20232 20232 8.86754832094181e+00 20232 19368 2.16030320562834e-02 20232 19392 1.92721257681825e-01 20232 19416 4.67796934250352e-01 20232 19440 1.90138666925909e-01 20232 19464 2.09573843673046e-02 20232 19776 1.72911645427777e-01 20232 19800 1.51007911385203e+00 20232 19824 3.59834989756732e+00 20232 19848 1.42526502644432e+00 20232 19872 1.51708123575848e-01 20232 20184 3.91566460757745e-01 20232 20208 3.35833046764721e+00 20232 20256 3.02295807149268e+00 20232 20280 3.07723361719113e-01 20232 20592 1.82360956766195e-01 20232 20616 1.57452559299057e+00 20232 20640 3.69157313827716e+00 20232 20664 1.36062223715692e+00 20232 20688 1.28885117807783e-01 20232 21000 2.39653598908880e-02 20232 21024 2.08832877466460e-01 20232 21048 4.91102744427810e-01 20232 21072 1.73977969604061e-01 20232 21096 1.52516329252881e-02 20233 20233 1.00000000000000e+00 20234 20234 1.00000000000000e+00 20235 20235 1.00000000000000e+00 20236 20236 1.00000000000000e+00 20237 20237 1.00000000000000e+00 20238 20238 1.00000000000000e+00 20239 20239 1.00000000000000e+00 20240 20240 1.00000000000000e+00 20241 20241 1.00000000000000e+00 20242 20242 1.00000000000000e+00 20243 20243 1.00000000000000e+00 20244 20244 1.00000000000000e+00 20245 20245 1.00000000000000e+00 20246 20246 1.00000000000000e+00 20247 20247 1.00000000000000e+00 20248 20248 1.00000000000000e+00 20249 20249 1.00000000000000e+00 20250 20250 1.00000000000000e+00 20251 20251 1.00000000000000e+00 20252 20252 1.00000000000000e+00 20253 20253 1.00000000000000e+00 20254 20254 1.00000000000000e+00 20255 20255 1.00000000000000e+00 20256 9357 -8.22518959263092e-03 20256 9381 -2.75544390262789e-02 20256 9405 -2.60936372640854e-03 20256 9933 -4.35560139697704e-03 20256 9957 -5.23272904718805e-01 20256 9981 -1.56020234216348e+00 20256 10005 -9.00513750001273e-01 20256 10029 -3.73800305753866e-02 20256 10533 -7.55358123396626e-02 20256 10557 -2.49991636289083e+00 20256 10581 -1.02980360621151e+01 20256 10605 -7.22856710572093e+00 20256 10629 -7.27606402896119e-02 20256 11133 -6.28594643042406e-02 20256 11157 -1.43888709538295e+00 20256 11181 -9.05696095074154e+00 20256 11205 -4.99269484567977e+00 20256 11229 -6.07278449815352e-04 20256 11733 -7.25522370285957e-04 20256 11757 -1.07496598483684e-01 20256 11781 -6.32999049357007e-01 20256 11805 -9.08396678634940e-02 20256 20256 9.96801212356314e+00 20256 19392 2.65772823641727e-02 20256 19416 1.90138666925909e-01 20256 19440 4.67222114420697e-01 20256 19464 2.94482901828521e-01 20256 19800 2.04608133035226e-01 20256 19824 1.42526502644431e+00 20256 19848 3.89793934425668e+00 20256 19872 3.13883496231905e+00 20256 20208 4.48016156154042e-01 20256 20232 3.02295807149268e+00 20256 20280 8.42373780668266e+00 20256 20616 2.11270441481444e-01 20256 20640 1.36062223715692e+00 20256 20664 3.56739673796148e+00 20256 20688 3.10346929434207e+00 20256 21024 2.82428594757271e-02 20256 21048 1.73977969604061e-01 20256 21072 3.84586462846899e-01 20256 21096 2.85641484834276e-01 20257 20257 1.00000000000000e+00 20258 20258 1.00000000000000e+00 20259 20259 1.00000000000000e+00 20260 20260 1.00000000000000e+00 20261 20261 1.00000000000000e+00 20262 20262 1.00000000000000e+00 20263 20263 1.00000000000000e+00 20264 20264 1.00000000000000e+00 20265 20265 1.00000000000000e+00 20266 20266 1.00000000000000e+00 20267 20267 1.00000000000000e+00 20268 20268 1.00000000000000e+00 20269 20269 1.00000000000000e+00 20270 20270 1.00000000000000e+00 20271 20271 1.00000000000000e+00 20272 20272 1.00000000000000e+00 20273 20273 1.00000000000000e+00 20274 20274 1.00000000000000e+00 20275 20275 1.00000000000000e+00 20276 20276 1.00000000000000e+00 20277 20277 1.00000000000000e+00 20278 20278 1.00000000000000e+00 20279 20279 1.00000000000000e+00 20280 9357 -1.98860187077000e-09 20280 9381 -6.75108151057785e-04 20280 9405 -3.57181806112211e-04 20280 9957 -6.67400920711639e-03 20280 9981 -2.77611194666462e-01 20280 10005 -7.26009893524992e-01 20280 10029 -6.40768823075997e-02 20280 10533 -4.23031447744498e-06 20280 10557 -1.70767136446982e-01 20280 10581 -7.62575536054883e+00 20280 10605 -1.09254701506259e+01 20280 10629 -1.32155033546538e-01 20280 11133 -2.44065315422997e-04 20280 11157 -3.00034719279313e-01 20280 11181 -1.16470936735658e+01 20280 11205 -8.88650814138403e+00 20280 11229 -1.19673275115652e-03 20280 11733 -3.47011381079200e-05 20280 11757 -7.14390121570512e-02 20280 11781 -9.84383496535862e-01 20280 11805 -1.70854902386400e-01 20280 20280 1.56934120813315e+01 20280 19416 2.09573843673046e-02 20280 19440 2.94482901828521e-01 20280 19464 4.42264113085910e-01 20280 19824 1.51708123575848e-01 20280 19848 3.13883496231905e+00 20280 19872 5.21571305960715e+00 20280 20232 3.07723361719113e-01 20280 20256 8.42373780668266e+00 20280 20640 1.28885117807783e-01 20280 20664 3.10346929434207e+00 20280 20688 5.30474276402965e+00 20280 21048 1.52516329252881e-02 20280 21072 2.85641484834276e-01 20280 21096 4.64521539191535e-01 20281 20281 1.00000000000000e+00 20282 20282 1.00000000000000e+00 20283 20283 1.00000000000000e+00 20284 20284 1.00000000000000e+00 20285 20285 1.00000000000000e+00 20286 20286 1.00000000000000e+00 20287 20287 1.00000000000000e+00 20288 20288 1.00000000000000e+00 20289 20289 1.00000000000000e+00 20290 20290 1.00000000000000e+00 20291 20291 1.00000000000000e+00 20292 20292 1.00000000000000e+00 20293 20293 1.00000000000000e+00 20294 20294 1.00000000000000e+00 20295 20295 1.00000000000000e+00 20296 20296 1.00000000000000e+00 20297 20297 1.00000000000000e+00 20298 20298 1.00000000000000e+00 20299 20299 1.00000000000000e+00 20300 20300 1.00000000000000e+00 20301 20301 1.00000000000000e+00 20302 20302 1.00000000000000e+00 20303 20303 1.00000000000000e+00 20304 6141 -2.68177621415987e-05 20304 6165 -3.95711006277205e-05 20304 6717 -2.54244484549936e-06 20304 6741 -1.19951607928589e+00 20304 6765 -1.18740850620942e+00 20304 6789 -6.82991249166325e-03 20304 7317 -5.65787260988338e-01 20304 7341 -1.13558941478981e+01 20304 7365 -3.96155814643469e+00 20304 7389 -4.16778281377548e-02 20304 7917 -2.29847746643470e+00 20304 7941 -9.31757742472422e+00 20304 7965 -1.51207846681759e+00 20304 7989 -1.29413237855621e-02 20304 8517 -4.03388434389498e-01 20304 8541 -6.50483221529814e-01 20304 8565 -6.09452274392234e-02 20304 8589 -1.04201598584567e-05 20304 9117 -2.73434565390910e-07 20304 9141 -2.15737240607035e-04 20304 9165 -7.56520811581509e-05 20304 20304 9.51025959481658e+00 20304 19488 7.95533395614533e-01 20304 19512 4.58896910370858e-01 20304 19536 1.74657750181689e-02 20304 19896 4.92634717205973e+00 20304 19920 2.99017165115070e+00 20304 19944 1.50570875748807e-01 20304 20328 5.50134950102227e+00 20304 20352 3.56062772461130e-01 20304 20712 4.69570095278428e+00 20304 20736 2.85105021759669e+00 20304 20760 1.43771354629870e-01 20304 21120 7.37871840795673e-01 20304 21144 4.24116551982357e-01 20304 21168 1.57658947384346e-02 20305 20305 1.00000000000000e+00 20306 20306 1.00000000000000e+00 20307 20307 1.00000000000000e+00 20308 20308 1.00000000000000e+00 20309 20309 1.00000000000000e+00 20310 20310 1.00000000000000e+00 20311 20311 1.00000000000000e+00 20312 20312 1.00000000000000e+00 20313 20313 1.00000000000000e+00 20314 20314 1.00000000000000e+00 20315 20315 1.00000000000000e+00 20316 20316 1.00000000000000e+00 20317 20317 1.00000000000000e+00 20318 20318 1.00000000000000e+00 20319 20319 1.00000000000000e+00 20320 20320 1.00000000000000e+00 20321 20321 1.00000000000000e+00 20322 20322 1.00000000000000e+00 20323 20323 1.00000000000000e+00 20324 20324 1.00000000000000e+00 20325 20325 1.00000000000000e+00 20326 20326 1.00000000000000e+00 20327 20327 1.00000000000000e+00 20328 6141 -1.35540959531500e-05 20328 6165 -2.00170805911738e-05 20328 6717 -1.27580809196146e-06 20328 6741 -6.70418245275494e-01 20328 6765 -8.34970990283429e-01 20328 6789 -3.21841845409029e-02 20328 6813 -2.56465629442634e-05 20328 7317 -3.07481855106383e-01 20328 7341 -8.06189223988921e+00 20328 7365 -5.66644235563031e+00 20328 7389 -5.39531734989157e-01 20328 7413 -4.76276778342322e-03 20328 7917 -1.30109975791992e+00 20328 7941 -9.03319033806739e+00 20328 7965 -6.68777816209307e+00 20328 7989 -8.76028072878747e-01 20328 8013 -2.05883233787831e-03 20328 8517 -2.52264035490324e-01 20328 8541 -1.10367230428954e+00 20328 8565 -1.10467050991718e+00 20328 8589 -1.38745469119397e-01 20328 8613 -3.15286122116000e-09 20328 9117 -1.32403957025803e-06 20328 9141 -6.78156064318135e-03 20328 9165 -1.94860308560980e-02 20328 9189 -6.16935639697755e-04 20328 20328 9.23470004433118e+00 20328 19488 4.58896910370858e-01 20328 19512 4.98566153261160e-01 20328 19536 1.68250491358143e-01 20328 19560 2.45968478213669e-02 20328 19896 2.99017165115070e+00 20328 19920 3.81228929594170e+00 20328 19944 1.43912834252726e+00 20328 19968 2.09211209883004e-01 20328 20304 5.50134950102227e+00 20328 20352 3.42083700730064e+00 20328 20376 4.99146479364012e-01 20328 20712 2.85105021759669e+00 20328 20736 3.67416532082411e+00 20328 20760 1.51845040734964e+00 20328 20784 2.35841247207535e-01 20328 21120 4.24116551982357e-01 20328 21144 4.64035159481762e-01 20328 21168 1.88081007563737e-01 20328 21192 3.12543571524997e-02 20329 20329 1.00000000000000e+00 20330 20330 1.00000000000000e+00 20331 20331 1.00000000000000e+00 20332 20332 1.00000000000000e+00 20333 20333 1.00000000000000e+00 20334 20334 1.00000000000000e+00 20335 20335 1.00000000000000e+00 20336 20336 1.00000000000000e+00 20337 20337 1.00000000000000e+00 20338 20338 1.00000000000000e+00 20339 20339 1.00000000000000e+00 20340 20340 1.00000000000000e+00 20341 20341 1.00000000000000e+00 20342 20342 1.00000000000000e+00 20343 20343 1.00000000000000e+00 20344 20344 1.00000000000000e+00 20345 20345 1.00000000000000e+00 20346 20346 1.00000000000000e+00 20347 20347 1.00000000000000e+00 20348 20348 1.00000000000000e+00 20349 20349 1.00000000000000e+00 20350 20350 1.00000000000000e+00 20351 20351 1.00000000000000e+00 20352 6141 -4.14899663859000e-08 20352 6165 -6.61515078038700e-08 20352 6717 -1.31019120337000e-09 20352 6741 -2.01988474371417e-02 20352 6765 -1.01470518843151e-01 20352 6789 -3.98639657652787e-02 20352 6813 -1.18646387859604e-04 20352 7317 -7.02520703206106e-03 20352 7341 -7.93553797255174e-01 20352 7365 -3.34211054867202e+00 20352 7389 -1.74396899578497e+00 20352 7413 -7.51061278934850e-02 20352 7437 -2.65552428960317e-05 20352 7917 -4.35226319330417e-02 20352 7941 -2.41236416441358e+00 20352 7965 -1.18093709731942e+01 20352 7989 -5.11917555376150e+00 20352 8013 -2.38646796391965e-01 20352 8037 -3.13185518468501e-05 20352 8517 -1.51639929481643e-02 20352 8541 -1.07744492518081e+00 20352 8565 -4.28313906253398e+00 20352 8589 -1.87921702765295e+00 20352 8613 -7.66304469585017e-02 20352 9117 -1.19463980016843e-06 20352 9141 -2.56556343381732e-02 20352 9165 -1.63888366341898e-01 20352 9189 -7.56563029286511e-02 20352 9213 -3.42380297403747e-04 20352 9765 -2.63635274781210e-07 20352 9789 -5.30610853420250e-07 20352 20352 9.77556496807954e+00 20352 19488 1.74657750181689e-02 20352 19512 1.68250491358143e-01 20352 19536 4.32485248224015e-01 20352 19560 1.84267023541372e-01 20352 19584 2.14699080639762e-02 20352 19896 1.50570875748807e-01 20352 19920 1.43912834252726e+00 20352 19944 3.67969130569640e+00 20352 19968 1.56380912680985e+00 20352 19992 1.81741071819454e-01 20352 20304 3.56062772461130e-01 20352 20328 3.42083700730064e+00 20352 20376 3.72922002063173e+00 20352 20400 4.33158525793901e-01 20352 20712 1.43771354629870e-01 20352 20736 1.51845040734964e+00 20352 20760 4.12606418741697e+00 20352 20784 1.77869649869598e+00 20352 20808 2.08832877466454e-01 20352 21120 1.57658947384346e-02 20352 21144 1.88081007563737e-01 20352 21168 5.44078468654156e-01 20352 21192 2.37988866512904e-01 20352 21216 2.82428594757262e-02 20353 20353 1.00000000000000e+00 20354 20354 1.00000000000000e+00 20355 20355 1.00000000000000e+00 20356 20356 1.00000000000000e+00 20357 20357 1.00000000000000e+00 20358 20358 1.00000000000000e+00 20359 20359 1.00000000000000e+00 20360 20360 1.00000000000000e+00 20361 20361 1.00000000000000e+00 20362 20362 1.00000000000000e+00 20363 20363 1.00000000000000e+00 20364 20364 1.00000000000000e+00 20365 20365 1.00000000000000e+00 20366 20366 1.00000000000000e+00 20367 20367 1.00000000000000e+00 20368 20368 1.00000000000000e+00 20369 20369 1.00000000000000e+00 20370 20370 1.00000000000000e+00 20371 20371 1.00000000000000e+00 20372 20372 1.00000000000000e+00 20373 20373 1.00000000000000e+00 20374 20374 1.00000000000000e+00 20375 20375 1.00000000000000e+00 20376 6741 -2.75079980372752e-06 20376 6765 -8.79520094271818e-03 20376 6789 -9.44696404610521e-03 20376 6813 -8.98871072744660e-05 20376 7341 -3.02687018809982e-02 20376 7365 -7.08432062787719e-01 20376 7389 -1.19479722097738e+00 20376 7413 -2.70400200659878e-01 20376 7437 -3.08070724295751e-03 20376 7917 -3.60143894674420e-05 20376 7941 -3.15687715384813e-01 20376 7965 -4.89729124264455e+00 20376 7989 -8.63045626787830e+00 20376 8013 -1.69477015015130e+00 20376 8037 -3.91570541987395e-02 20376 8517 -1.92627463307734e-04 20376 8541 -2.65653515247318e-01 20376 8565 -3.98187100407150e+00 20376 8589 -6.94499300146922e+00 20376 8613 -1.48312847787424e+00 20376 8637 -1.68136550660147e-02 20376 9117 -2.30301308694380e-07 20376 9141 -1.29804131789666e-02 20376 9165 -4.02728245207720e-01 20376 9189 -6.47334861429464e-01 20376 9213 -1.30904245935936e-01 20376 9237 -5.96109218410204e-05 20376 9765 -4.51231632600853e-05 20376 9789 -2.12602681745384e-03 20376 9813 -5.31919679444246e-04 20376 20376 8.82054501110461e+00 20376 19512 2.45968478213669e-02 20376 19536 1.84267023541372e-01 20376 19560 3.88404676177686e-01 20376 19584 1.67036829586704e-01 20376 19608 2.02892993326998e-02 20376 19920 2.09211209883004e-01 20376 19944 1.56380912680985e+00 20376 19968 3.28472507352778e+00 20376 19992 1.39759114541160e+00 20376 20016 1.67656714533442e-01 20376 20328 4.99146479364012e-01 20376 20352 3.72922002063173e+00 20376 20400 3.29608257932730e+00 20376 20424 3.90862119037907e-01 20376 20736 2.35841247207535e-01 20376 20760 1.77869649869598e+00 20376 20784 3.76196580745206e+00 20376 20808 1.57452559299054e+00 20376 20832 1.84798520781177e-01 20376 21144 3.12543571524997e-02 20376 21168 2.37988866512904e-01 20376 21192 5.07714859658753e-01 20376 21216 2.11270441481439e-01 20376 21240 2.45747508946335e-02 20377 20377 1.00000000000000e+00 20378 20378 1.00000000000000e+00 20379 20379 1.00000000000000e+00 20380 20380 1.00000000000000e+00 20381 20381 1.00000000000000e+00 20382 20382 1.00000000000000e+00 20383 20383 1.00000000000000e+00 20384 20384 1.00000000000000e+00 20385 20385 1.00000000000000e+00 20386 20386 1.00000000000000e+00 20387 20387 1.00000000000000e+00 20388 20388 1.00000000000000e+00 20389 20389 1.00000000000000e+00 20390 20390 1.00000000000000e+00 20391 20391 1.00000000000000e+00 20392 20392 1.00000000000000e+00 20393 20393 1.00000000000000e+00 20394 20394 1.00000000000000e+00 20395 20395 1.00000000000000e+00 20396 20396 1.00000000000000e+00 20397 20397 1.00000000000000e+00 20398 20398 1.00000000000000e+00 20399 20399 1.00000000000000e+00 20400 6765 -9.43368006238332e-06 20400 6789 -2.48574860122958e-04 20400 6813 -1.60601360825507e-05 20400 7365 -2.46988284185831e-02 20400 7389 -2.51340603069217e-01 20400 7413 -2.24374614877639e-01 20400 7437 -1.39338207108137e-02 20400 7461 -2.22255490871340e-07 20400 7941 -7.23038149697026e-04 20400 7965 -6.03687179371153e-01 20400 7989 -4.10122884318578e+00 20400 8013 -3.64519484217998e+00 20400 8037 -3.72818880152232e-01 20400 8061 -2.61242579381709e-03 20400 8541 -9.50245677540098e-03 20400 8565 -1.01738905164710e+00 20400 8589 -7.59830514439921e+00 20400 8613 -6.73991693558079e+00 20400 8637 -6.98575913356126e-01 20400 8661 -1.94381303127238e-03 20400 9141 -1.76545037455334e-03 20400 9165 -2.28262293221430e-01 20400 9189 -1.73717993124594e+00 20400 9213 -1.46587366422920e+00 20400 9237 -1.56845308931473e-01 20400 9261 -3.81408583499220e-07 20400 9765 -1.86284564303333e-04 20400 9789 -2.22660675726958e-02 20400 9813 -3.78886813069682e-02 20400 9837 -1.21570673088845e-03 20400 20400 8.07954935078666e+00 20400 19536 2.14699080639762e-02 20400 19560 1.67036829586704e-01 20400 19584 3.66469822508484e-01 20400 19608 1.62641697816046e-01 20400 19632 2.03711251213117e-02 20400 19944 1.81741071819454e-01 20400 19968 1.39759114541160e+00 20400 19992 3.03214513306497e+00 20400 20016 1.34221337297529e+00 20400 20040 1.67896628710377e-01 20400 20352 4.33158525793901e-01 20400 20376 3.29608257932730e+00 20400 20424 3.13383615769572e+00 20400 20448 3.92596920386007e-01 20400 20760 2.08832877466454e-01 20400 20784 1.57452559299055e+00 20400 20808 3.35833046764719e+00 20400 20832 1.51007911385204e+00 20400 20856 1.92721257681828e-01 20400 21168 2.82428594757262e-02 20400 21192 2.11270441481439e-01 20400 21216 4.48016156154037e-01 20400 21240 2.04608133035232e-01 20400 21264 2.65772823641744e-02 20401 20401 1.00000000000000e+00 20402 20402 1.00000000000000e+00 20403 20403 1.00000000000000e+00 20404 20404 1.00000000000000e+00 20405 20405 1.00000000000000e+00 20406 20406 1.00000000000000e+00 20407 20407 1.00000000000000e+00 20408 20408 1.00000000000000e+00 20409 20409 1.00000000000000e+00 20410 20410 1.00000000000000e+00 20411 20411 1.00000000000000e+00 20412 20412 1.00000000000000e+00 20413 20413 1.00000000000000e+00 20414 20414 1.00000000000000e+00 20415 20415 1.00000000000000e+00 20416 20416 1.00000000000000e+00 20417 20417 1.00000000000000e+00 20418 20418 1.00000000000000e+00 20419 20419 1.00000000000000e+00 20420 20420 1.00000000000000e+00 20421 20421 1.00000000000000e+00 20422 20422 1.00000000000000e+00 20423 20423 1.00000000000000e+00 20424 7389 -1.23920601170133e-02 20424 7413 -5.20208389584623e-02 20424 7437 -1.10223094013724e-02 20424 7461 -9.73631128109090e-07 20424 7965 -5.60829570506775e-03 20424 7989 -6.26267686291771e-01 20424 8013 -2.10508368685634e+00 20424 8037 -1.01643732635631e+00 20424 8061 -4.08970490628936e-02 20424 8085 -9.82651904440218e-06 20424 8565 -6.35762543224464e-02 20424 8589 -2.46519311509008e+00 20424 8613 -9.44829471250603e+00 20424 8637 -3.93415720552648e+00 20424 8661 -1.90167096788184e-01 20424 8685 -2.02242391247022e-05 20424 9165 -3.63021842950981e-02 20424 9189 -1.35589596977103e+00 20424 9213 -4.72026243498148e+00 20424 9237 -2.05289357518908e+00 20424 9261 -8.46942034598062e-02 20424 9765 -8.30543836998000e-05 20424 9789 -6.04023209590331e-02 20424 9813 -2.74822116270502e-01 20424 9837 -1.15666008616462e-01 20424 9861 -8.34346672447792e-04 20424 10413 -3.23866062505992e-05 20424 10437 -4.66156117326021e-05 20424 20424 8.06500579410394e+00 20424 19560 2.02892993326998e-02 20424 19584 1.62641697816046e-01 20424 19608 3.65750055595983e-01 20424 19632 1.59575517774427e-01 20424 19656 1.95227543222949e-02 20424 19968 1.67656714533442e-01 20424 19992 1.34221337297529e+00 20424 20016 3.01906849351879e+00 20424 20040 1.33184939331854e+00 20424 20064 1.65065719619253e-01 20424 20376 3.90862119037907e-01 20424 20400 3.13383615769572e+00 20424 20448 3.14075947710273e+00 20424 20472 3.92592948889661e-01 20424 20784 1.84798520781177e-01 20424 20808 1.51007911385204e+00 20424 20832 3.45599888700886e+00 20424 20856 1.52152600400078e+00 20424 20880 1.87660243318363e-01 20424 21192 2.45747508946335e-02 20424 21216 2.04608133035232e-01 20424 21240 4.74982653968496e-01 20424 21264 2.06994670444987e-01 20424 21288 2.51713852470724e-02 20425 20425 1.00000000000000e+00 20426 20426 1.00000000000000e+00 20427 20427 1.00000000000000e+00 20428 20428 1.00000000000000e+00 20429 20429 1.00000000000000e+00 20430 20430 1.00000000000000e+00 20431 20431 1.00000000000000e+00 20432 20432 1.00000000000000e+00 20433 20433 1.00000000000000e+00 20434 20434 1.00000000000000e+00 20435 20435 1.00000000000000e+00 20436 20436 1.00000000000000e+00 20437 20437 1.00000000000000e+00 20438 20438 1.00000000000000e+00 20439 20439 1.00000000000000e+00 20440 20440 1.00000000000000e+00 20441 20441 1.00000000000000e+00 20442 20442 1.00000000000000e+00 20443 20443 1.00000000000000e+00 20444 20444 1.00000000000000e+00 20445 20445 1.00000000000000e+00 20446 20446 1.00000000000000e+00 20447 20447 1.00000000000000e+00 20448 7389 -1.61126130499370e-07 20448 7413 -2.65351095419149e-03 20448 7437 -2.05148678363387e-03 20448 7461 -5.60692149366320e-07 20448 7989 -1.42016680674155e-02 20448 8013 -3.78249300822858e-01 20448 8037 -6.65735053161066e-01 20448 8061 -1.43215743617082e-01 20448 8085 -9.85286141680809e-04 20448 8565 -1.69759551982035e-05 20448 8589 -2.40577424961976e-01 20448 8613 -3.73729413925654e+00 20448 8637 -6.59932721052835e+00 20448 8661 -1.29413504052001e+00 20448 8685 -2.95734225758230e-02 20448 9165 -2.68364539589388e-04 20448 9189 -2.85679637321201e-01 20448 9213 -4.21473093150741e+00 20448 9237 -7.39535321592705e+00 20448 9261 -1.52417843992889e+00 20448 9285 -1.83378568091777e-02 20448 9765 -9.74644038470989e-06 20448 9789 -2.65648743547455e-02 20448 9813 -6.13134529254272e-01 20448 9837 -9.54578846059280e-01 20448 9861 -1.98962185579805e-01 20448 9885 -1.77369989909078e-04 20448 10413 -6.01640639348681e-04 20448 10437 -8.17707393505363e-03 20448 10461 -1.58120002869853e-03 20448 20448 8.05020205385255e+00 20448 19584 2.03711251213117e-02 20448 19608 1.59575517774427e-01 20448 19632 3.52314972451359e-01 20448 19656 1.56410129982493e-01 20448 19680 1.95797781733282e-02 20448 19992 1.67896628710377e-01 20448 20016 1.33184939331854e+00 20448 20040 2.97014860592259e+00 20448 20064 1.30506473169344e+00 20448 20088 1.61200463304104e-01 20448 20400 3.92596920386007e-01 20448 20424 3.14075947710273e+00 20448 20472 3.07484360048559e+00 20448 20496 3.76117951231721e-01 20448 20808 1.92721257681828e-01 20448 20832 1.52152600400078e+00 20448 20856 3.37821758384741e+00 20448 20880 1.48237070556028e+00 20448 20904 1.82932433071704e-01 20448 21216 2.65772823641744e-02 20448 21240 2.06994670444987e-01 20448 21264 4.54332216932561e-01 20448 21288 2.00736623449202e-01 20448 21312 2.50127706152282e-02 20449 20449 1.00000000000000e+00 20450 20450 1.00000000000000e+00 20451 20451 1.00000000000000e+00 20452 20452 1.00000000000000e+00 20453 20453 1.00000000000000e+00 20454 20454 1.00000000000000e+00 20455 20455 1.00000000000000e+00 20456 20456 1.00000000000000e+00 20457 20457 1.00000000000000e+00 20458 20458 1.00000000000000e+00 20459 20459 1.00000000000000e+00 20460 20460 1.00000000000000e+00 20461 20461 1.00000000000000e+00 20462 20462 1.00000000000000e+00 20463 20463 1.00000000000000e+00 20464 20464 1.00000000000000e+00 20465 20465 1.00000000000000e+00 20466 20466 1.00000000000000e+00 20467 20467 1.00000000000000e+00 20468 20468 1.00000000000000e+00 20469 20469 1.00000000000000e+00 20470 20470 1.00000000000000e+00 20471 20471 1.00000000000000e+00 20472 7413 -6.94046372686330e-07 20472 7437 -1.05416003024272e-05 20472 7461 -8.46091646237500e-08 20472 8013 -1.19319310724472e-02 20472 8037 -1.34841749520500e-01 20472 8061 -1.06356067585762e-01 20472 8085 -4.15438031221905e-03 20472 8589 -3.89332230272238e-04 20472 8613 -4.57991835894871e-01 20472 8637 -2.99873944324048e+00 20472 8661 -2.64139157095857e+00 20472 8685 -2.58902342369895e-01 20472 8709 -1.55759882964494e-03 20472 9189 -9.38575092160662e-03 20472 9213 -1.05198764373597e+00 20472 9237 -7.77456076509341e+00 20472 9261 -6.61043386329543e+00 20472 9285 -6.49732174719309e-01 20472 9309 -1.95098127036781e-03 20472 9789 -3.19873872226592e-03 20472 9813 -3.41170327114193e-01 20472 9837 -2.45398170369837e+00 20472 9861 -1.98400933919515e+00 20472 9885 -2.07628844917457e-01 20472 9909 -3.41322157762279e-06 20472 10413 -1.97260203679881e-03 20472 10437 -6.14995665721259e-02 20472 10461 -7.35160147784665e-02 20472 10485 -2.60171715117959e-03 20472 20472 7.80038152703614e+00 20472 19608 1.95227543222949e-02 20472 19632 1.56410129982493e-01 20472 19656 3.52487017050835e-01 20472 19680 1.57070360514464e-01 20472 19704 1.96878119552877e-02 20472 20016 1.65065719619253e-01 20472 20040 1.30506473169344e+00 20472 20064 2.90903241462988e+00 20472 20088 1.30383898179606e+00 20472 20112 1.64759282144908e-01 20472 20424 3.92592948889661e-01 20472 20448 3.07484360048559e+00 20472 20496 3.06407723868175e+00 20472 20520 3.89901358438703e-01 20472 20832 1.87660243318363e-01 20472 20856 1.48237070556028e+00 20472 20880 3.30531284354300e+00 20472 20904 1.49466441659605e+00 20472 20928 1.90733671077306e-01 20472 21240 2.51713852470724e-02 20472 21264 2.00736623449202e-01 20472 21288 4.51557124279110e-01 20472 21312 2.04776719214461e-01 20472 21336 2.61814091883872e-02 20473 20473 1.00000000000000e+00 20474 20474 1.00000000000000e+00 20475 20475 1.00000000000000e+00 20476 20476 1.00000000000000e+00 20477 20477 1.00000000000000e+00 20478 20478 1.00000000000000e+00 20479 20479 1.00000000000000e+00 20480 20480 1.00000000000000e+00 20481 20481 1.00000000000000e+00 20482 20482 1.00000000000000e+00 20483 20483 1.00000000000000e+00 20484 20484 1.00000000000000e+00 20485 20485 1.00000000000000e+00 20486 20486 1.00000000000000e+00 20487 20487 1.00000000000000e+00 20488 20488 1.00000000000000e+00 20489 20489 1.00000000000000e+00 20490 20490 1.00000000000000e+00 20491 20491 1.00000000000000e+00 20492 20492 1.00000000000000e+00 20493 20493 1.00000000000000e+00 20494 20494 1.00000000000000e+00 20495 20495 1.00000000000000e+00 20496 8037 -6.01949539313841e-03 20496 8061 -2.14258727932303e-02 20496 8085 -2.38851479682786e-03 20496 8613 -3.43551708160339e-03 20496 8637 -4.30138184579657e-01 20496 8661 -1.40261292381429e+00 20496 8685 -6.56082329760212e-01 20496 8709 -2.25121796792213e-02 20496 8733 -3.09439465411300e-06 20496 9213 -6.27299216796503e-02 20496 9237 -2.39601445015480e+00 20496 9261 -8.66875421797863e+00 20496 9285 -3.42870701505584e+00 20496 9309 -1.58796974729022e-01 20496 9333 -1.27615079143268e-05 20496 9813 -5.38648376009507e-02 20496 9837 -1.72986038849149e+00 20496 9861 -5.86868412923070e+00 20496 9885 -2.40623175819995e+00 20496 9909 -9.55746831138020e-02 20496 9933 -1.32206470670000e-10 20496 10413 -6.79448506998580e-04 20496 10437 -1.31335544505489e-01 20496 10461 -4.68654027442273e-01 20496 10485 -1.82793376238340e-01 20496 10509 -1.90576692073231e-03 20496 11061 -3.99843198830997e-04 20496 11085 -4.19575438955604e-04 20496 20496 7.99757378523725e+00 20496 19632 1.95797781733282e-02 20496 19656 1.57070360514464e-01 20496 19680 3.53947585031560e-01 20496 19704 1.56202510115665e-01 20496 19728 1.93628155736287e-02 20496 20040 1.61200463304104e-01 20496 20064 1.30383898179606e+00 20496 20088 2.95969446118355e+00 20496 20112 1.30841906282309e+00 20496 20136 1.62345483560861e-01 20496 20448 3.76117951231721e-01 20496 20472 3.06407723868175e+00 20496 20520 3.09174182969901e+00 20496 20544 3.83034098986034e-01 20496 20856 1.82932433071704e-01 20496 20880 1.49466441659605e+00 20496 20904 3.41594298496309e+00 20496 20928 1.48802194292693e+00 20496 20952 1.81271814654423e-01 20496 21264 2.50127706152282e-02 20496 21288 2.04776719214461e-01 20496 21312 4.68009715976442e-01 20496 21336 2.01103230141625e-01 20496 21360 2.40943983470192e-02 20497 20497 1.00000000000000e+00 20498 20498 1.00000000000000e+00 20499 20499 1.00000000000000e+00 20500 20500 1.00000000000000e+00 20501 20501 1.00000000000000e+00 20502 20502 1.00000000000000e+00 20503 20503 1.00000000000000e+00 20504 20504 1.00000000000000e+00 20505 20505 1.00000000000000e+00 20506 20506 1.00000000000000e+00 20507 20507 1.00000000000000e+00 20508 20508 1.00000000000000e+00 20509 20509 1.00000000000000e+00 20510 20510 1.00000000000000e+00 20511 20511 1.00000000000000e+00 20512 20512 1.00000000000000e+00 20513 20513 1.00000000000000e+00 20514 20514 1.00000000000000e+00 20515 20515 1.00000000000000e+00 20516 20516 1.00000000000000e+00 20517 20517 1.00000000000000e+00 20518 20518 1.00000000000000e+00 20519 20519 1.00000000000000e+00 20520 8037 -7.91806544230000e-10 20520 8061 -6.52984975638916e-04 20520 8085 -3.60635957870881e-04 20520 8637 -7.59144487802201e-03 20520 8661 -2.32391335660982e-01 20520 8685 -3.95378165876494e-01 20520 8709 -7.39694930109547e-02 20520 8733 -2.02821011824119e-04 20520 9213 -6.01422878122641e-06 20520 9237 -2.16482774683163e-01 20520 9261 -3.17368962354501e+00 20520 9285 -5.27554891058876e+00 20520 9309 -1.01903277723737e+00 20520 9333 -2.18011093323539e-02 20520 9813 -3.69013968260158e-04 20520 9837 -3.40186827062610e-01 20520 9861 -4.74306814100734e+00 20520 9885 -8.08169379493113e+00 20520 9909 -1.58350204718123e+00 20520 9933 -2.01656095848385e-02 20520 10413 -5.18385731630741e-05 20520 10437 -5.10221569510314e-02 20520 10461 -9.34677063180309e-01 20520 10485 -1.41134525042513e+00 20520 10509 -2.97980555261447e-01 20520 10533 -4.18824570894582e-04 20520 11061 -3.81933610700300e-03 20520 11085 -2.38431983512818e-02 20520 11109 -3.81608675529030e-03 20520 20520 7.90139368247132e+00 20520 19656 1.96878119552877e-02 20520 19680 1.56202510115665e-01 20520 19704 3.49250348602338e-01 20520 19728 1.56481212170483e-01 20520 19752 1.97574874689921e-02 20520 20064 1.64759282144908e-01 20520 20088 1.30841906282309e+00 20520 20112 2.92560588267319e+00 20520 20136 1.30265738846125e+00 20520 20160 1.63318863554447e-01 20520 20472 3.89901358438703e-01 20520 20496 3.09174182969901e+00 20520 20544 3.06392335696754e+00 20520 20568 3.82946740255837e-01 20520 20880 1.90733671077306e-01 20520 20904 1.48802194292693e+00 20520 20928 3.27950601151834e+00 20520 20952 1.47878048249851e+00 20520 20976 1.88423305970201e-01 20520 21288 2.61814091883872e-02 20520 21312 2.01103230141625e-01 20520 21336 4.37725380813625e-01 20520 21360 2.00511985679799e-01 20520 21384 2.60335980729306e-02 20521 20521 1.00000000000000e+00 20522 20522 1.00000000000000e+00 20523 20523 1.00000000000000e+00 20524 20524 1.00000000000000e+00 20525 20525 1.00000000000000e+00 20526 20526 1.00000000000000e+00 20527 20527 1.00000000000000e+00 20528 20528 1.00000000000000e+00 20529 20529 1.00000000000000e+00 20530 20530 1.00000000000000e+00 20531 20531 1.00000000000000e+00 20532 20532 1.00000000000000e+00 20533 20533 1.00000000000000e+00 20534 20534 1.00000000000000e+00 20535 20535 1.00000000000000e+00 20536 20536 1.00000000000000e+00 20537 20537 1.00000000000000e+00 20538 20538 1.00000000000000e+00 20539 20539 1.00000000000000e+00 20540 20540 1.00000000000000e+00 20541 20541 1.00000000000000e+00 20542 20542 1.00000000000000e+00 20543 20543 1.00000000000000e+00 20544 8061 -9.21392776400000e-11 20544 8085 -6.06677257560000e-10 20544 8661 -5.97175117773285e-03 20544 8685 -7.37384779871945e-02 20544 8709 -4.55087334551142e-02 20544 8733 -7.98683687606945e-04 20544 9237 -2.02465739836177e-04 20544 9261 -3.54816042167559e-01 20544 9285 -2.22780410194104e+00 20544 9309 -1.93483237870048e+00 20544 9333 -1.78671550878467e-01 20544 9357 -8.99956012314788e-04 20544 9837 -9.40248882104740e-03 20544 9861 -1.11422845009598e+00 20544 9885 -8.01336539963254e+00 20544 9909 -6.49493602195031e+00 20544 9933 -6.02940997111881e-01 20544 9957 -1.93303940305556e-03 20544 10437 -5.38291298606264e-03 20544 10461 -4.95781694150897e-01 20544 10485 -3.40775270230967e+00 20544 10509 -2.64775831761201e+00 20544 10533 -2.65399292796340e-01 20544 10557 -1.33092751663793e-05 20544 11061 -9.42561470530969e-03 20544 11085 -1.43573546139148e-01 20544 11109 -1.31722113288676e-01 20544 11133 -5.36026349040993e-03 20544 11685 -4.00202380170130e-07 20544 11709 -4.68162706606939e-06 20544 11733 -1.96062915748000e-09 20544 20544 7.90720107965378e+00 20544 19680 1.93628155736287e-02 20544 19704 1.56481212170483e-01 20544 19728 3.55692930604228e-01 20544 19752 1.59871211982870e-01 20544 19776 2.02103155267253e-02 20544 20088 1.62345483560861e-01 20544 20112 1.30265738846125e+00 20544 20136 2.94399814662354e+00 20544 20160 1.32747883898370e+00 20544 20184 1.68550846191475e-01 20544 20496 3.83034098986034e-01 20544 20520 3.06392335696754e+00 20544 20568 3.11986350731989e+00 20544 20592 3.97019136574119e-01 20544 20904 1.81271814654423e-01 20544 20928 1.47878048249851e+00 20544 20952 3.38763623309867e+00 20544 20976 1.52005931556468e+00 20544 21000 1.91591522920965e-01 20544 21312 2.40943983470192e-02 20544 21336 2.00511985679799e-01 20544 21360 4.66602452223006e-01 20544 21384 2.08016331128114e-01 20544 21408 2.59704847090978e-02 20545 20545 1.00000000000000e+00 20546 20546 1.00000000000000e+00 20547 20547 1.00000000000000e+00 20548 20548 1.00000000000000e+00 20549 20549 1.00000000000000e+00 20550 20550 1.00000000000000e+00 20551 20551 1.00000000000000e+00 20552 20552 1.00000000000000e+00 20553 20553 1.00000000000000e+00 20554 20554 1.00000000000000e+00 20555 20555 1.00000000000000e+00 20556 20556 1.00000000000000e+00 20557 20557 1.00000000000000e+00 20558 20558 1.00000000000000e+00 20559 20559 1.00000000000000e+00 20560 20560 1.00000000000000e+00 20561 20561 1.00000000000000e+00 20562 20562 1.00000000000000e+00 20563 20563 1.00000000000000e+00 20564 20564 1.00000000000000e+00 20565 20565 1.00000000000000e+00 20566 20566 1.00000000000000e+00 20567 20567 1.00000000000000e+00 20568 8685 -2.69918411505052e-03 20568 8709 -7.63644529673767e-03 20568 8733 -3.25705673696323e-04 20568 9261 -1.97908944809920e-03 20568 9285 -2.95079386881896e-01 20568 9309 -9.41794062802659e-01 20568 9333 -4.23340971250778e-01 20568 9357 -1.14567772184786e-02 20568 9381 -5.47964570785980e-07 20568 9861 -6.09726191576314e-02 20568 9885 -2.32104302524861e+00 20568 9909 -7.84475762036924e+00 20568 9933 -2.98627124706647e+00 20568 9957 -1.34270192548723e-01 20568 9981 -7.48228670978547e-06 20568 10437 -7.46393400000000e-14 20568 10461 -7.60852993516128e-02 20568 10485 -2.16294920165840e+00 20568 10509 -7.17876805185186e+00 20568 10533 -2.79102250318827e+00 20568 10557 -1.07211408631077e-01 20568 10581 -3.73102447881600e-08 20568 11061 -2.80363635072955e-03 20568 11085 -2.48937627752015e-01 20568 11109 -7.70581711034190e-01 20568 11133 -2.92463126461187e-01 20568 11157 -4.02285784986329e-03 20568 11685 -4.35062775778452e-06 20568 11709 -2.36456528890266e-03 20568 11733 -1.81463814625547e-03 20568 20568 8.12365760161969e+00 20568 19704 1.97574874689921e-02 20568 19728 1.59871211982870e-01 20568 19752 3.63411835229297e-01 20568 19776 1.61998459437700e-01 20568 19800 2.02892993326998e-02 20568 20112 1.63318863554447e-01 20568 20136 1.32747883898370e+00 20568 20160 3.02716923220482e+00 20568 20184 1.34235070311274e+00 20568 20208 1.67036829586706e-01 20568 20520 3.82946740255837e-01 20568 20544 3.11986350731989e+00 20568 20592 3.14169525100731e+00 20568 20616 3.88404676177694e-01 20568 20928 1.88423305970201e-01 20568 20952 1.52005931556468e+00 20568 20976 3.43815469624709e+00 20568 21000 1.50343418584938e+00 20568 21024 1.84267023541376e-01 20568 21336 2.60335980729306e-02 20568 21360 2.08016331128114e-01 20568 21384 4.66158201239863e-01 20568 21408 2.02269330121860e-01 20568 21432 2.45968478213673e-02 20569 20569 1.00000000000000e+00 20570 20570 1.00000000000000e+00 20571 20571 1.00000000000000e+00 20572 20572 1.00000000000000e+00 20573 20573 1.00000000000000e+00 20574 20574 1.00000000000000e+00 20575 20575 1.00000000000000e+00 20576 20576 1.00000000000000e+00 20577 20577 1.00000000000000e+00 20578 20578 1.00000000000000e+00 20579 20579 1.00000000000000e+00 20580 20580 1.00000000000000e+00 20581 20581 1.00000000000000e+00 20582 20582 1.00000000000000e+00 20583 20583 1.00000000000000e+00 20584 20584 1.00000000000000e+00 20585 20585 1.00000000000000e+00 20586 20586 1.00000000000000e+00 20587 20587 1.00000000000000e+00 20588 20588 1.00000000000000e+00 20589 20589 1.00000000000000e+00 20590 20590 1.00000000000000e+00 20591 20591 1.00000000000000e+00 20592 8709 -8.79221394985321e-05 20592 8733 -3.38155601221640e-05 20592 9285 -3.82397426018658e-03 20592 9309 -1.43723768517555e-01 20592 9333 -2.32535662013767e-01 20592 9357 -3.45663066015183e-02 20592 9381 -1.67984462863557e-05 20592 9861 -1.21126830761592e-06 20592 9885 -1.90281153849870e-01 20592 9909 -2.65973954927671e+00 20592 9933 -4.23415220768890e+00 20592 9957 -8.23602821426861e-01 20592 9981 -1.62013567064914e-02 20592 10461 -4.57831467629266e-04 20592 10485 -3.96364039902628e-01 20592 10509 -5.34832249232655e+00 20592 10533 -8.88021871768801e+00 20592 10557 -1.71506375002892e+00 20592 10581 -2.30088250458343e-02 20592 11061 -1.45918259762635e-04 20592 11085 -8.96751616157939e-02 20592 11109 -1.42191071427146e+00 20592 11133 -2.11930396500530e+00 20592 11157 -4.60405244955113e-01 20592 11181 -9.09969541231178e-04 20592 11685 -1.13997207202421e-05 20592 11709 -1.62745062553772e-02 20592 11733 -5.81648819907614e-02 20592 11757 -8.24395122984993e-03 20592 20592 8.04427054762172e+00 20592 19728 2.02103155267253e-02 20592 19752 1.61998459437700e-01 20592 19776 3.66463984150582e-01 20592 19800 1.67656714533442e-01 20592 19824 2.16248793006608e-02 20592 20136 1.68550846191475e-01 20592 20160 1.34235070311274e+00 20592 20184 3.02350107634502e+00 20592 20208 1.39759114541162e+00 20592 20232 1.82360956766195e-01 20592 20544 3.97019136574119e-01 20592 20568 3.14169525100731e+00 20592 20616 3.28472507352786e+00 20592 20640 4.32776592204255e-01 20592 20952 1.91591522920965e-01 20592 20976 1.50343418584938e+00 20592 21000 3.34654915774414e+00 20592 21024 1.56380912680991e+00 20592 21048 2.06685258161097e-01 20592 21360 2.59704847090978e-02 20592 21384 2.02269330121860e-01 20592 21408 4.47226004500361e-01 20592 21432 2.09211209883015e-01 20592 21456 2.77059546493864e-02 20593 20593 1.00000000000000e+00 20594 20594 1.00000000000000e+00 20595 20595 1.00000000000000e+00 20596 20596 1.00000000000000e+00 20597 20597 1.00000000000000e+00 20598 20598 1.00000000000000e+00 20599 20599 1.00000000000000e+00 20600 20600 1.00000000000000e+00 20601 20601 1.00000000000000e+00 20602 20602 1.00000000000000e+00 20603 20603 1.00000000000000e+00 20604 20604 1.00000000000000e+00 20605 20605 1.00000000000000e+00 20606 20606 1.00000000000000e+00 20607 20607 1.00000000000000e+00 20608 20608 1.00000000000000e+00 20609 20609 1.00000000000000e+00 20610 20610 1.00000000000000e+00 20611 20611 1.00000000000000e+00 20612 20612 1.00000000000000e+00 20613 20613 1.00000000000000e+00 20614 20614 1.00000000000000e+00 20615 20615 1.00000000000000e+00 20616 9309 -3.08070724295751e-03 20616 9333 -3.91570541987394e-02 20616 9357 -1.68136550660147e-02 20616 9381 -5.96109218410203e-05 20616 9885 -8.98871072744678e-05 20616 9909 -2.70400200659883e-01 20616 9933 -1.69477015015132e+00 20616 9957 -1.48312847787425e+00 20616 9981 -1.30904245935937e-01 20616 10005 -5.31919679444254e-04 20616 10485 -9.44696404610537e-03 20616 10509 -1.19479722097741e+00 20616 10533 -8.63045626787857e+00 20616 10557 -6.94499300146942e+00 20616 10581 -6.47334861429477e-01 20616 10605 -2.12602681745387e-03 20616 11085 -8.79520094271833e-03 20616 11109 -7.08432062787755e-01 20616 11133 -4.89729124264465e+00 20616 11157 -3.98187100407164e+00 20616 11181 -4.02728245207732e-01 20616 11205 -4.51231632600859e-05 20616 11685 -2.75079980372756e-06 20616 11709 -3.02687018810005e-02 20616 11733 -3.15687715384833e-01 20616 11757 -2.65653515247327e-01 20616 11781 -1.29804131789670e-02 20616 12333 -3.60143894674430e-05 20616 12357 -1.92627463307740e-04 20616 12381 -2.30301308694390e-07 20616 20616 8.82054501110481e+00 20616 19752 2.02892993326998e-02 20616 19776 1.67656714533442e-01 20616 19800 3.90862119037907e-01 20616 19824 1.84798520781179e-01 20616 19848 2.45747508946339e-02 20616 20160 1.67036829586706e-01 20616 20184 1.39759114541162e+00 20616 20208 3.29608257932734e+00 20616 20232 1.57452559299057e+00 20616 20256 2.11270441481444e-01 20616 20568 3.88404676177694e-01 20616 20592 3.28472507352786e+00 20616 20640 3.76196580745217e+00 20616 20664 5.07714859658768e-01 20616 20976 1.84267023541376e-01 20616 21000 1.56380912680991e+00 20616 21024 3.72922002063192e+00 20616 21048 1.77869649869605e+00 20616 21072 2.37988866512911e-01 20616 21384 2.45968478213673e-02 20616 21408 2.09211209883015e-01 20616 21432 4.99146479364050e-01 20616 21456 2.35841247207548e-01 20616 21480 3.12543571525006e-02 20617 20617 1.00000000000000e+00 20618 20618 1.00000000000000e+00 20619 20619 1.00000000000000e+00 20620 20620 1.00000000000000e+00 20621 20621 1.00000000000000e+00 20622 20622 1.00000000000000e+00 20623 20623 1.00000000000000e+00 20624 20624 1.00000000000000e+00 20625 20625 1.00000000000000e+00 20626 20626 1.00000000000000e+00 20627 20627 1.00000000000000e+00 20628 20628 1.00000000000000e+00 20629 20629 1.00000000000000e+00 20630 20630 1.00000000000000e+00 20631 20631 1.00000000000000e+00 20632 20632 1.00000000000000e+00 20633 20633 1.00000000000000e+00 20634 20634 1.00000000000000e+00 20635 20635 1.00000000000000e+00 20636 20636 1.00000000000000e+00 20637 20637 1.00000000000000e+00 20638 20638 1.00000000000000e+00 20639 20639 1.00000000000000e+00 20640 9333 -1.05007272993042e-03 20640 9357 -2.24873890229678e-03 20640 9381 -1.71530090327612e-05 20640 9909 -1.08121285912416e-03 20640 9933 -2.12494015931441e-01 20640 9957 -6.94820792058686e-01 20640 9981 -2.94623651010250e-01 20640 10005 -4.50836102338898e-03 20640 10029 -2.15379764853000e-09 20640 10509 -6.10196194821610e-02 20640 10533 -2.47405737344559e+00 20640 10557 -8.19445174042303e+00 20640 10581 -2.74934680092517e+00 20640 10605 -8.82386895391254e-02 20640 10629 -2.69616545916969e-06 20640 11085 -1.76489563238000e-09 20640 11109 -1.04269346786886e-01 20640 11133 -3.06527398950034e+00 20640 11157 -1.00015592700934e+01 20640 11181 -2.92410451374061e+00 20640 11205 -8.56064705006757e-02 20640 11229 -2.00903761667800e-07 20640 11685 -2.45391655890000e-10 20640 11709 -8.39440981508395e-03 20640 11733 -5.04462076015953e-01 20640 11757 -1.32287667106875e+00 20640 11781 -3.82150713253396e-01 20640 11805 -5.29244362974420e-03 20640 12333 -2.24151561366790e-04 20640 12357 -8.94430899049876e-03 20640 12381 -4.96490615160515e-03 20640 20640 9.84095293991455e+00 20640 19776 2.16248793006608e-02 20640 19800 1.84798520781179e-01 20640 19824 4.31790540141460e-01 20640 19848 1.66177589685166e-01 20640 19872 1.69696465266575e-02 20640 20184 1.82360956766195e-01 20640 20208 1.57452559299057e+00 20640 20232 3.69157313827716e+00 20640 20256 1.36062223715692e+00 20640 20280 1.28885117807783e-01 20640 20592 4.32776592204255e-01 20640 20616 3.76196580745217e+00 20640 20664 3.16981381131383e+00 20640 20688 2.84738593169674e-01 20640 21000 2.06685258161097e-01 20640 21024 1.77869649869605e+00 20640 21048 4.17048493342253e+00 20640 21072 1.57586671027078e+00 20640 21096 1.55977811054779e-01 20640 21408 2.77059546493864e-02 20640 21432 2.35841247207548e-01 20640 21456 5.51518488927802e-01 20640 21480 2.19988707963628e-01 20640 21504 2.37428198384065e-02 20641 20641 1.00000000000000e+00 20642 20642 1.00000000000000e+00 20643 20643 1.00000000000000e+00 20644 20644 1.00000000000000e+00 20645 20645 1.00000000000000e+00 20646 20646 1.00000000000000e+00 20647 20647 1.00000000000000e+00 20648 20648 1.00000000000000e+00 20649 20649 1.00000000000000e+00 20650 20650 1.00000000000000e+00 20651 20651 1.00000000000000e+00 20652 20652 1.00000000000000e+00 20653 20653 1.00000000000000e+00 20654 20654 1.00000000000000e+00 20655 20655 1.00000000000000e+00 20656 20656 1.00000000000000e+00 20657 20657 1.00000000000000e+00 20658 20658 1.00000000000000e+00 20659 20659 1.00000000000000e+00 20660 20660 1.00000000000000e+00 20661 20661 1.00000000000000e+00 20662 20662 1.00000000000000e+00 20663 20663 1.00000000000000e+00 20664 9357 -2.55024749279373e-06 20664 9381 -6.36605257387360e-07 20664 9933 -2.14648723749305e-03 20664 9957 -9.94144917254053e-02 20664 9981 -1.23074941957577e-01 20664 10005 -1.38478634824622e-02 20664 10029 -1.80427590875900e-07 20664 10509 -9.46477160706500e-08 20664 10533 -2.00180555053648e-01 20664 10557 -2.25180646794109e+00 20664 10581 -3.50368766140370e+00 20664 10605 -1.42156879861824e+00 20664 10629 -8.11888108207324e-04 20664 11109 -6.38658904575288e-04 20664 11133 -5.38961450759760e-01 20664 11157 -5.48334295921252e+00 20664 11181 -1.16102424187957e+01 20664 11205 -2.51925394366327e+00 20664 11229 -8.45132164331512e-05 20664 11709 -3.76985077331582e-04 20664 11733 -1.60508309066116e-01 20664 11757 -2.39548250059466e+00 20664 11781 -4.52174059881908e+00 20664 11805 -2.75622480796949e-01 20664 12333 -3.56454239513560e-04 20664 12357 -9.62596793221420e-02 20664 12381 -1.22950809007915e-01 20664 20664 8.22345368046104e+00 20664 19800 2.45747508946339e-02 20664 19824 1.66177589685166e-01 20664 19848 5.07262721643460e-01 20664 19872 4.90225838751240e-01 20664 20208 2.11270441481444e-01 20664 20232 1.36062223715692e+00 20664 20256 3.56739673796148e+00 20664 20280 3.10346929434207e+00 20664 20616 5.07714859658768e-01 20664 20640 3.16981381131383e+00 20664 20688 5.45879703285333e+00 20664 21024 2.37988866512911e-01 20664 21048 1.57586671027077e+00 20664 21072 3.78957606445573e+00 20664 21096 2.73579568635172e+00 20664 21432 3.12543571525006e-02 20664 21456 2.19988707963628e-01 20664 21480 5.62807553267019e-01 20664 21504 3.98307436753654e-01 20665 20665 1.00000000000000e+00 20666 20666 1.00000000000000e+00 20667 20667 1.00000000000000e+00 20668 20668 1.00000000000000e+00 20669 20669 1.00000000000000e+00 20670 20670 1.00000000000000e+00 20671 20671 1.00000000000000e+00 20672 20672 1.00000000000000e+00 20673 20673 1.00000000000000e+00 20674 20674 1.00000000000000e+00 20675 20675 1.00000000000000e+00 20676 20676 1.00000000000000e+00 20677 20677 1.00000000000000e+00 20678 20678 1.00000000000000e+00 20679 20679 1.00000000000000e+00 20680 20680 1.00000000000000e+00 20681 20681 1.00000000000000e+00 20682 20682 1.00000000000000e+00 20683 20683 1.00000000000000e+00 20684 20684 1.00000000000000e+00 20685 20685 1.00000000000000e+00 20686 20686 1.00000000000000e+00 20687 20687 1.00000000000000e+00 20688 9957 -1.22365447471563e-03 20688 9981 -1.84717084370413e-02 20688 10005 -9.96711146675204e-03 20688 10029 -3.45778598212060e-07 20688 10533 -2.19178452599128e-05 20688 10557 -1.43634132019874e-01 20688 10581 -2.36081159036046e+00 20688 10605 -2.28074346771641e+00 20688 10629 -1.60490305820046e-03 20688 11133 -8.02848167036077e-03 20688 11157 -1.28138291463893e+00 20688 11181 -1.31344205713088e+01 20688 11205 -4.44043579606656e+00 20688 11229 -1.67620106534628e-04 20688 11733 -1.25654930568511e-02 20688 11757 -1.63815643084313e+00 20688 11781 -6.70591694751751e+00 20688 11805 -5.14197856185687e-01 20688 12333 -8.02216756131089e-05 20688 12357 -1.34917509756794e-01 20688 12381 -2.11153262788619e-01 20688 20688 9.92442391351890e+00 20688 19824 1.69696465266575e-02 20688 19848 4.90225838751240e-01 20688 19872 8.61664151815878e-01 20688 20232 1.28885117807783e-01 20688 20256 3.10346929434207e+00 20688 20280 5.30474276402965e+00 20688 20640 2.84738593169674e-01 20688 20664 5.45879703285333e+00 20688 21048 1.55977811054779e-01 20688 21072 2.73579568635173e+00 20688 21096 4.37974669531999e+00 20688 21456 2.37428198384065e-02 20688 21480 3.98307436753654e-01 20688 21504 6.30415134638462e-01 20689 20689 1.00000000000000e+00 20690 20690 1.00000000000000e+00 20691 20691 1.00000000000000e+00 20692 20692 1.00000000000000e+00 20693 20693 1.00000000000000e+00 20694 20694 1.00000000000000e+00 20695 20695 1.00000000000000e+00 20696 20696 1.00000000000000e+00 20697 20697 1.00000000000000e+00 20698 20698 1.00000000000000e+00 20699 20699 1.00000000000000e+00 20700 20700 1.00000000000000e+00 20701 20701 1.00000000000000e+00 20702 20702 1.00000000000000e+00 20703 20703 1.00000000000000e+00 20704 20704 1.00000000000000e+00 20705 20705 1.00000000000000e+00 20706 20706 1.00000000000000e+00 20707 20707 1.00000000000000e+00 20708 20708 1.00000000000000e+00 20709 20709 1.00000000000000e+00 20710 20710 1.00000000000000e+00 20711 20711 1.00000000000000e+00 20712 6717 -4.78380215078020e-07 20712 6741 -3.24275802740579e-02 20712 6765 -9.65306573404738e-03 20712 7317 -6.58684771145486e-01 20712 7341 -3.99767481908075e+00 20712 7365 -4.83551374784479e-01 20712 7389 -1.73196606922705e-03 20712 7893 -9.84041696600765e-04 20712 7917 -7.82386178903454e+00 20712 7941 -1.60834728731334e+01 20712 7965 -7.56106341981151e-01 20712 7989 -2.16046850008640e-03 20712 8493 -2.65642361519577e-02 20712 8517 -3.59414605494428e+00 20712 8541 -3.43113164804832e+00 20712 8565 -1.57084032693361e-01 20712 8589 -3.90079655830205e-06 20712 9093 -2.20520863822568e-03 20712 9117 -8.07620712877326e-02 20712 9141 -5.34115908914581e-02 20712 9165 -1.65556807285412e-03 20712 20712 1.36913543179816e+01 20712 19896 4.36053397400399e-01 20712 19920 2.88646002416814e-01 20712 19944 2.01769439190329e-02 20712 20304 4.69570095278428e+00 20712 20328 2.85105021759669e+00 20712 20352 1.43771354629870e-01 20712 20736 7.35333930796905e+00 20712 20760 2.87903471136636e-01 20712 21120 4.74889323458448e+00 20712 21144 2.81178010326743e+00 20712 21168 1.24952424564338e-01 20712 21528 4.49351467850448e-01 20712 21552 2.78828473834499e-01 20712 21576 1.54722114026500e-02 20713 20713 1.00000000000000e+00 20714 20714 1.00000000000000e+00 20715 20715 1.00000000000000e+00 20716 20716 1.00000000000000e+00 20717 20717 1.00000000000000e+00 20718 20718 1.00000000000000e+00 20719 20719 1.00000000000000e+00 20720 20720 1.00000000000000e+00 20721 20721 1.00000000000000e+00 20722 20722 1.00000000000000e+00 20723 20723 1.00000000000000e+00 20724 20724 1.00000000000000e+00 20725 20725 1.00000000000000e+00 20726 20726 1.00000000000000e+00 20727 20727 1.00000000000000e+00 20728 20728 1.00000000000000e+00 20729 20729 1.00000000000000e+00 20730 20730 1.00000000000000e+00 20731 20731 1.00000000000000e+00 20732 20732 1.00000000000000e+00 20733 20733 1.00000000000000e+00 20734 20734 1.00000000000000e+00 20735 20735 1.00000000000000e+00 20736 6717 -2.40186428761680e-07 20736 6741 -1.86238563130753e-02 20736 6765 -6.21525660309202e-03 20736 7317 -3.49593855422105e-01 20736 7341 -2.68385561620018e+00 20736 7365 -8.37895207133302e-01 20736 7389 -3.12514410067259e-02 20736 7413 -5.59793347357087e-06 20736 7893 -5.02259234512098e-04 20736 7917 -4.43068966198713e+00 20736 7941 -1.32830061635957e+01 20736 7965 -3.72278010225773e+00 20736 7989 -2.34219438433392e-01 20736 8013 -2.30368090416413e-05 20736 8493 -1.39520399675054e-02 20736 8517 -2.45302092463139e+00 20736 8541 -5.66071931761901e+00 20736 8565 -2.84276194806417e+00 20736 8589 -1.44954846645992e-01 20736 8613 -6.13896168510000e-10 20736 9093 -1.19559189827216e-03 20736 9117 -1.04039244321087e-01 20736 9141 -3.64114134599589e-01 20736 9165 -2.02228954966389e-01 20736 9189 -2.80648045101099e-03 20736 9741 -3.67982902529280e-04 20736 9765 -4.01571096527221e-04 20736 20736 9.25883673882538e+00 20736 19896 2.88646002416814e-01 20736 19920 4.54506170724252e-01 20736 19944 1.91531594273668e-01 20736 19968 2.77059546493841e-02 20736 20304 2.85105021759669e+00 20736 20328 3.67416532082411e+00 20736 20352 1.51845040734964e+00 20736 20376 2.35841247207535e-01 20736 20712 7.35333930796905e+00 20736 20760 3.35768784025774e+00 20736 20784 5.51518488927781e-01 20736 21120 2.81178010326743e+00 20736 21144 3.37521270349810e+00 20736 21168 1.37976453011180e+00 20736 21192 2.19988707963608e-01 20736 21528 2.78828473834499e-01 20736 21552 3.79768016392752e-01 20736 21576 1.56860124964209e-01 20736 21600 2.37428198384023e-02 20737 20737 1.00000000000000e+00 20738 20738 1.00000000000000e+00 20739 20739 1.00000000000000e+00 20740 20740 1.00000000000000e+00 20741 20741 1.00000000000000e+00 20742 20742 1.00000000000000e+00 20743 20743 1.00000000000000e+00 20744 20744 1.00000000000000e+00 20745 20745 1.00000000000000e+00 20746 20746 1.00000000000000e+00 20747 20747 1.00000000000000e+00 20748 20748 1.00000000000000e+00 20749 20749 1.00000000000000e+00 20750 20750 1.00000000000000e+00 20751 20751 1.00000000000000e+00 20752 20752 1.00000000000000e+00 20753 20753 1.00000000000000e+00 20754 20754 1.00000000000000e+00 20755 20755 1.00000000000000e+00 20756 20756 1.00000000000000e+00 20757 20757 1.00000000000000e+00 20758 20758 1.00000000000000e+00 20759 20759 1.00000000000000e+00 20760 6717 -2.84663206480000e-10 20760 6741 -6.88591247467957e-04 20760 6765 -3.96784765631872e-04 20760 7317 -5.78613424267481e-03 20760 7341 -2.26898724073111e-01 20760 7365 -5.12343280474946e-01 20760 7389 -1.08175470687361e-01 20760 7413 -2.81280434771752e-04 20760 7893 -2.92525320334731e-06 20760 7917 -1.49049353647890e-01 20760 7941 -3.33774787695733e+00 20760 7965 -7.34164664187904e+00 20760 7989 -1.43097519682742e+00 20760 8013 -2.79573555867760e-02 20760 8493 -1.91406254721869e-04 20760 8517 -2.20635404010202e-01 20760 8541 -5.27654274785888e+00 20760 8565 -1.09547396060205e+01 20760 8589 -2.15460430129376e+00 20760 8613 -2.67986772911734e-02 20760 9093 -2.65678797598047e-05 20760 9117 -3.66291396137360e-02 20760 9141 -8.81159512977710e-01 20760 9165 -1.39480511332750e+00 20760 9189 -3.35634600221818e-01 20760 9213 -6.20042783016749e-04 20760 9741 -2.68203129603540e-03 20760 9765 -1.42858512538457e-02 20760 9789 -2.27056743930507e-03 20760 20760 1.06033020384093e+01 20760 19896 2.01769439190329e-02 20760 19920 1.91531594273668e-01 20760 19944 4.87437578200066e-01 20760 19968 2.06685258161086e-01 20760 19992 2.39653598908874e-02 20760 20304 1.43771354629870e-01 20760 20328 1.51845040734964e+00 20760 20352 4.12606418741697e+00 20760 20376 1.77869649869598e+00 20760 20400 2.08832877466454e-01 20760 20712 2.87903471136636e-01 20760 20736 3.35768784025774e+00 20760 20784 4.17048493342239e+00 20760 20808 4.91102744427794e-01 20760 21120 1.24952424564338e-01 20760 21144 1.37976453011180e+00 20760 21168 3.81874972158620e+00 20760 21192 1.57586671027066e+00 20760 21216 1.73977969604054e-01 20760 21528 1.54722114026500e-02 20760 21552 1.56860124964209e-01 20760 21576 4.10608961742374e-01 20760 21600 1.55977811054758e-01 20760 21624 1.52516329252872e-02 20761 20761 1.00000000000000e+00 20762 20762 1.00000000000000e+00 20763 20763 1.00000000000000e+00 20764 20764 1.00000000000000e+00 20765 20765 1.00000000000000e+00 20766 20766 1.00000000000000e+00 20767 20767 1.00000000000000e+00 20768 20768 1.00000000000000e+00 20769 20769 1.00000000000000e+00 20770 20770 1.00000000000000e+00 20771 20771 1.00000000000000e+00 20772 20772 1.00000000000000e+00 20773 20773 1.00000000000000e+00 20774 20774 1.00000000000000e+00 20775 20775 1.00000000000000e+00 20776 20776 1.00000000000000e+00 20777 20777 1.00000000000000e+00 20778 20778 1.00000000000000e+00 20779 20779 1.00000000000000e+00 20780 20780 1.00000000000000e+00 20781 20781 1.00000000000000e+00 20782 20782 1.00000000000000e+00 20783 20783 1.00000000000000e+00 20784 6741 -2.45391655890000e-10 20784 6765 -1.76489563238000e-09 20784 7341 -8.39440981508334e-03 20784 7365 -1.04269346786878e-01 20784 7389 -6.10196194821581e-02 20784 7413 -1.08121285912413e-03 20784 7917 -2.24151561366772e-04 20784 7941 -5.04462076015934e-01 20784 7965 -3.06527398950025e+00 20784 7989 -2.47405737344551e+00 20784 8013 -2.12494015931439e-01 20784 8037 -1.05007272993042e-03 20784 8517 -8.94430899049728e-03 20784 8541 -1.32287667106866e+00 20784 8565 -1.00015592700930e+01 20784 8589 -8.19445174042265e+00 20784 8613 -6.94820792058679e-01 20784 8637 -2.24873890229678e-03 20784 9117 -4.96490615160427e-03 20784 9141 -3.82150713253353e-01 20784 9165 -2.92410451374048e+00 20784 9189 -2.74934680092509e+00 20784 9213 -2.94623651010246e-01 20784 9237 -1.71530090327612e-05 20784 9741 -5.29244362974384e-03 20784 9765 -8.56064705006723e-02 20784 9789 -8.82386895391241e-02 20784 9813 -4.50836102338893e-03 20784 10365 -2.00903761667800e-07 20784 10389 -2.69616545916967e-06 20784 10413 -2.15379764853000e-09 20784 20784 9.84095293991427e+00 20784 19920 2.77059546493841e-02 20784 19944 2.06685258161086e-01 20784 19968 4.32776592204243e-01 20784 19992 1.82360956766193e-01 20784 20016 2.16248793006608e-02 20784 20328 2.35841247207535e-01 20784 20352 1.77869649869598e+00 20784 20376 3.76196580745206e+00 20784 20400 1.57452559299055e+00 20784 20424 1.84798520781177e-01 20784 20736 5.51518488927781e-01 20784 20760 4.17048493342239e+00 20784 20808 3.69157313827707e+00 20784 20832 4.31790540141454e-01 20784 21144 2.19988707963608e-01 20784 21168 1.57586671027066e+00 20784 21192 3.16981381131369e+00 20784 21216 1.36062223715689e+00 20784 21240 1.66177589685164e-01 20784 21552 2.37428198384023e-02 20784 21576 1.55977811054758e-01 20784 21600 2.84738593169655e-01 20784 21624 1.28885117807778e-01 20784 21648 1.69696465266574e-02 20785 20785 1.00000000000000e+00 20786 20786 1.00000000000000e+00 20787 20787 1.00000000000000e+00 20788 20788 1.00000000000000e+00 20789 20789 1.00000000000000e+00 20790 20790 1.00000000000000e+00 20791 20791 1.00000000000000e+00 20792 20792 1.00000000000000e+00 20793 20793 1.00000000000000e+00 20794 20794 1.00000000000000e+00 20795 20795 1.00000000000000e+00 20796 20796 1.00000000000000e+00 20797 20797 1.00000000000000e+00 20798 20798 1.00000000000000e+00 20799 20799 1.00000000000000e+00 20800 20800 1.00000000000000e+00 20801 20801 1.00000000000000e+00 20802 20802 1.00000000000000e+00 20803 20803 1.00000000000000e+00 20804 20804 1.00000000000000e+00 20805 20805 1.00000000000000e+00 20806 20806 1.00000000000000e+00 20807 20807 1.00000000000000e+00 20808 7365 -3.26638239810655e-03 20808 7389 -9.54620552641494e-03 20808 7413 -4.19129189440229e-04 20808 7941 -2.41565249248564e-03 20808 7965 -3.75923620321779e-01 20808 7989 -1.09956716241353e+00 20808 8013 -4.69701797998803e-01 20808 8037 -1.29970123836126e-02 20808 8061 -7.74689897242040e-07 20808 8541 -5.51496939522450e-02 20808 8565 -2.67231919083980e+00 20808 8589 -8.89099175463546e+00 20808 8613 -3.40661737920487e+00 20808 8637 -1.53167292222668e-01 20808 8661 -1.03954862092583e-05 20808 9141 -4.67880445595032e-02 20808 9165 -1.76103804557890e+00 20808 9189 -7.16654941689153e+00 20808 9213 -3.24277390371000e+00 20808 9237 -1.32485464574335e-01 20808 9261 -6.02256811617600e-08 20808 9741 -1.54634762008399e-03 20808 9765 -1.57674992663909e-01 20808 9789 -5.87225973957992e-01 20808 9813 -2.94052989407066e-01 20808 9837 -5.08853050101887e-03 20808 10365 -2.54630692488362e-06 20808 10389 -1.90946386181226e-03 20808 10413 -1.52616840616761e-03 20808 20808 8.86754832094172e+00 20808 19944 2.39653598908874e-02 20808 19968 1.82360956766193e-01 20808 19992 3.91566460757743e-01 20808 20016 1.72911645427774e-01 20808 20040 2.16030320562826e-02 20808 20352 2.08832877466454e-01 20808 20376 1.57452559299054e+00 20808 20400 3.35833046764719e+00 20808 20424 1.51007911385204e+00 20808 20448 1.92721257681828e-01 20808 20760 4.91102744427794e-01 20808 20784 3.69157313827707e+00 20808 20832 3.59834989756740e+00 20808 20856 4.67796934250377e-01 20808 21168 1.73977969604054e-01 20808 21192 1.36062223715688e+00 20808 21216 3.02295807149264e+00 20808 21240 1.42526502644433e+00 20808 21264 1.90138666925914e-01 20808 21576 1.52516329252872e-02 20808 21600 1.28885117807778e-01 20808 21624 3.07723361719110e-01 20808 21648 1.51708123575846e-01 20808 21672 2.09573843673041e-02 20809 20809 1.00000000000000e+00 20810 20810 1.00000000000000e+00 20811 20811 1.00000000000000e+00 20812 20812 1.00000000000000e+00 20813 20813 1.00000000000000e+00 20814 20814 1.00000000000000e+00 20815 20815 1.00000000000000e+00 20816 20816 1.00000000000000e+00 20817 20817 1.00000000000000e+00 20818 20818 1.00000000000000e+00 20819 20819 1.00000000000000e+00 20820 20820 1.00000000000000e+00 20821 20821 1.00000000000000e+00 20822 20822 1.00000000000000e+00 20823 20823 1.00000000000000e+00 20824 20824 1.00000000000000e+00 20825 20825 1.00000000000000e+00 20826 20826 1.00000000000000e+00 20827 20827 1.00000000000000e+00 20828 20828 1.00000000000000e+00 20829 20829 1.00000000000000e+00 20830 20830 1.00000000000000e+00 20831 20831 1.00000000000000e+00 20832 7389 -9.92519568879595e-05 20832 7413 -4.00601221406902e-05 20832 7965 -4.05950296912941e-03 20832 7989 -1.55321867795442e-01 20832 8013 -2.53257024583943e-01 20832 8037 -3.85963268737243e-02 20832 8061 -2.09075466857389e-05 20832 8541 -6.05285648237200e-07 20832 8565 -1.94606147503329e-01 20832 8589 -3.01355636355893e+00 20832 8613 -4.91376916156050e+00 20832 8637 -9.05256029698987e-01 20832 8661 -1.72064983002764e-02 20832 9141 -2.64700801715131e-04 20832 9165 -3.17162331399180e-01 20832 9189 -5.68289186565247e+00 20832 9213 -1.02349311736186e+01 20832 9237 -1.87406138757872e+00 20832 9261 -2.47456816655712e-02 20832 9741 -8.40619835414268e-05 20832 9765 -6.26822243240927e-02 20832 9789 -1.20726376709725e+00 20832 9813 -1.87862984396721e+00 20832 9837 -4.36925577003924e-01 20832 9861 -1.04604514369137e-03 20832 10365 -7.17169031686482e-06 20832 10389 -1.07855649151752e-02 20832 10413 -3.06935392903593e-02 20832 10437 -4.21211943045402e-03 20832 20832 9.35462019827781e+00 20832 19968 2.16248793006608e-02 20832 19992 1.72911645427774e-01 20832 20016 3.89017067783700e-01 20832 20040 1.73386830555204e-01 20832 20064 2.17436755825183e-02 20832 20376 1.84798520781177e-01 20832 20400 1.51007911385204e+00 20832 20424 3.45599888700886e+00 20832 20448 1.52152600400078e+00 20832 20472 1.87660243318363e-01 20832 20784 4.31790540141454e-01 20832 20808 3.59834989756740e+00 20832 20856 3.62350257752166e+00 20832 20880 4.38078710130020e-01 20832 21192 1.66177589685164e-01 20832 21216 1.42526502644433e+00 20832 21240 3.36345328386552e+00 20832 21264 1.38078276116632e+00 20832 21288 1.55057023365662e-01 20832 21600 1.69696465266574e-02 20832 21624 1.51708123575846e-01 20832 21648 3.65880666997866e-01 20832 21672 1.38201019846589e-01 20832 21696 1.35928705943431e-02 20833 20833 1.00000000000000e+00 20834 20834 1.00000000000000e+00 20835 20835 1.00000000000000e+00 20836 20836 1.00000000000000e+00 20837 20837 1.00000000000000e+00 20838 20838 1.00000000000000e+00 20839 20839 1.00000000000000e+00 20840 20840 1.00000000000000e+00 20841 20841 1.00000000000000e+00 20842 20842 1.00000000000000e+00 20843 20843 1.00000000000000e+00 20844 20844 1.00000000000000e+00 20845 20845 1.00000000000000e+00 20846 20846 1.00000000000000e+00 20847 20847 1.00000000000000e+00 20848 20848 1.00000000000000e+00 20849 20849 1.00000000000000e+00 20850 20850 1.00000000000000e+00 20851 20851 1.00000000000000e+00 20852 20852 1.00000000000000e+00 20853 20853 1.00000000000000e+00 20854 20854 1.00000000000000e+00 20855 20855 1.00000000000000e+00 20856 7989 -3.21498529089213e-03 20856 8013 -4.20474139306097e-02 20856 8037 -1.82366467804065e-02 20856 8061 -7.26598831971718e-05 20856 8565 -8.75407316449964e-05 20856 8589 -3.19772793067185e-01 20856 8613 -1.86663739218365e+00 20856 8637 -1.52988192885985e+00 20856 8661 -1.26225497284196e-01 20856 8685 -4.92803893296505e-04 20856 9165 -7.88893963817172e-03 20856 9189 -1.23817040319280e+00 20856 9213 -8.83501779089264e+00 20856 9237 -6.98854935785926e+00 20856 9261 -5.91340677496702e-01 20856 9285 -1.95469579268335e-03 20856 9765 -7.04889861285721e-03 20856 9789 -4.87838300554059e-01 20856 9813 -3.72294246617883e+00 20856 9837 -3.48549779286631e+00 20856 9861 -3.59725190023989e-01 20856 9885 -4.38145079191087e-05 20856 10365 -1.74276804760179e-06 20856 10389 -1.48604071463110e-02 20856 10413 -1.67023864717951e-01 20856 10437 -1.70527780808149e-01 20856 10461 -1.02084568245075e-02 20856 11013 -1.97635568482042e-05 20856 11037 -1.13643062235917e-04 20856 11061 -1.83644152629410e-07 20856 20856 8.91745842228530e+00 20856 19992 2.16030320562826e-02 20856 20016 1.73386830555204e-01 20856 20040 3.90222179029274e-01 20856 20064 1.69856052940864e-01 20856 20088 2.07203376526978e-02 20856 20400 1.92721257681828e-01 20856 20424 1.52152600400078e+00 20856 20448 3.37821758384741e+00 20856 20472 1.48237070556028e+00 20856 20496 1.82932433071704e-01 20856 20808 4.67796934250377e-01 20856 20832 3.62350257752166e+00 20856 20880 3.51392334433738e+00 20856 20904 4.40402125954306e-01 20856 21216 1.90138666925914e-01 20856 21240 1.38078276116632e+00 20856 21264 2.84901195706931e+00 20856 21288 1.33207175863363e+00 20856 21312 1.77960916292741e-01 20856 21624 2.09573843673041e-02 20856 21648 1.38201019846589e-01 20856 21672 2.57920772334751e-01 20856 21696 1.32281316209201e-01 20856 21720 1.94774584579572e-02 20857 20857 1.00000000000000e+00 20858 20858 1.00000000000000e+00 20859 20859 1.00000000000000e+00 20860 20860 1.00000000000000e+00 20861 20861 1.00000000000000e+00 20862 20862 1.00000000000000e+00 20863 20863 1.00000000000000e+00 20864 20864 1.00000000000000e+00 20865 20865 1.00000000000000e+00 20866 20866 1.00000000000000e+00 20867 20867 1.00000000000000e+00 20868 20868 1.00000000000000e+00 20869 20869 1.00000000000000e+00 20870 20870 1.00000000000000e+00 20871 20871 1.00000000000000e+00 20872 20872 1.00000000000000e+00 20873 20873 1.00000000000000e+00 20874 20874 1.00000000000000e+00 20875 20875 1.00000000000000e+00 20876 20876 1.00000000000000e+00 20877 20877 1.00000000000000e+00 20878 20878 1.00000000000000e+00 20879 20879 1.00000000000000e+00 20880 8013 -1.06285179056370e-03 20880 8037 -2.36917694260551e-03 20880 8061 -2.04089667481573e-05 20880 8589 -1.04490660266631e-03 20880 8613 -2.16006340598433e-01 20880 8637 -6.49578675580671e-01 20880 8661 -2.64974126596227e-01 20880 8685 -5.17996492292177e-03 20880 8709 -5.66768020861000e-09 20880 9189 -4.79131606910248e-02 20880 9213 -2.31875979400024e+00 20880 9237 -7.47852153566612e+00 20880 9261 -2.73881420483964e+00 20880 9285 -1.16903644012216e-01 20880 9309 -4.68288025480863e-06 20880 9765 -1.37368931380000e-10 20880 9789 -5.62077263860393e-02 20880 9813 -2.24353417678795e+00 20880 9837 -8.73478129569114e+00 20880 9861 -3.53361738223855e+00 20880 9885 -1.36403831570533e-01 20880 9909 -3.49414465273930e-07 20880 10365 -1.90423473400000e-11 20880 10389 -4.02463253813658e-03 20880 10413 -3.02145747279519e-01 20880 10437 -9.67865603429284e-01 20880 10461 -4.38209835369893e-01 20880 10485 -9.14157579495100e-03 20880 11013 -1.30941825009839e-04 20880 11037 -6.34375125082238e-03 20880 11061 -3.70637046823082e-03 20880 20880 8.94270722031837e+00 20880 20016 2.17436755825183e-02 20880 20040 1.69856052940864e-01 20880 20064 3.74771086606622e-01 20880 20088 1.68889384934548e-01 20880 20112 2.15020085809392e-02 20880 20424 1.87660243318363e-01 20880 20448 1.48237070556028e+00 20880 20472 3.30531284354300e+00 20880 20496 1.49466441659605e+00 20880 20520 1.90733671077306e-01 20880 20832 4.38078710130020e-01 20880 20856 3.51392334433738e+00 20880 20904 3.59438648349399e+00 20880 20928 4.58194494919172e-01 20880 21240 1.55057023365662e-01 20880 21264 1.33207175863363e+00 20880 21288 3.17831707809929e+00 20880 21312 1.41538524136979e+00 20880 21336 1.75885394049703e-01 20880 21648 1.35928705943431e-02 20880 21672 1.32281316209201e-01 20880 21696 3.43022145245696e-01 20880 21720 1.49069591127983e-01 20880 21744 1.77899393240386e-02 20881 20881 1.00000000000000e+00 20882 20882 1.00000000000000e+00 20883 20883 1.00000000000000e+00 20884 20884 1.00000000000000e+00 20885 20885 1.00000000000000e+00 20886 20886 1.00000000000000e+00 20887 20887 1.00000000000000e+00 20888 20888 1.00000000000000e+00 20889 20889 1.00000000000000e+00 20890 20890 1.00000000000000e+00 20891 20891 1.00000000000000e+00 20892 20892 1.00000000000000e+00 20893 20893 1.00000000000000e+00 20894 20894 1.00000000000000e+00 20895 20895 1.00000000000000e+00 20896 20896 1.00000000000000e+00 20897 20897 1.00000000000000e+00 20898 20898 1.00000000000000e+00 20899 20899 1.00000000000000e+00 20900 20900 1.00000000000000e+00 20901 20901 1.00000000000000e+00 20902 20902 1.00000000000000e+00 20903 20903 1.00000000000000e+00 20904 8037 -2.45216359375918e-06 20904 8061 -6.50044912846620e-07 20904 8613 -1.78015374464238e-03 20904 8637 -8.64757018219528e-02 20904 8661 -1.28155566331303e-01 20904 8685 -1.37345708174822e-02 20904 8709 -5.74695123481400e-08 20904 9189 -3.67222075893600e-08 20904 9213 -1.67675406492184e-01 20904 9237 -2.35758391105403e+00 20904 9261 -3.59514649502357e+00 20904 9285 -6.46169679302477e-01 20904 9309 -1.06321116976910e-02 20904 9789 -3.54822158744667e-04 20904 9813 -3.92717788799683e-01 20904 9837 -6.10453891104458e+00 20904 9861 -1.02624281112438e+01 20904 9885 -1.72365237570312e+00 20904 9909 -2.33917155530079e-02 20904 10389 -2.09120147080729e-04 20904 10413 -1.03095708974914e-01 20904 10437 -1.62177710123625e+00 20904 10461 -2.61950144724905e+00 20904 10485 -5.76961529729787e-01 20904 10509 -1.64331298995037e-03 20904 11013 -2.27316425110601e-04 20904 11037 -3.13274163014311e-02 20904 11061 -6.49202412504783e-02 20904 11085 -9.12151484470005e-03 20904 11661 -1.38577897776000e-09 20904 11685 -4.94664904690000e-10 20904 20904 9.19275053062595e+00 20904 20040 2.07203376526978e-02 20904 20064 1.68889384934548e-01 20904 20088 3.85976030264312e-01 20904 20112 1.70902255590103e-01 20904 20136 2.12235553165866e-02 20904 20448 1.82932433071704e-01 20904 20472 1.49466441659605e+00 20904 20496 3.41594298496309e+00 20904 20520 1.48802194292693e+00 20904 20544 1.81271814654423e-01 20904 20856 4.40402125954306e-01 20904 20880 3.59438648349399e+00 20904 20928 3.51772392353510e+00 20904 20952 4.21236485964583e-01 20904 21264 1.77960916292741e-01 20904 21288 1.41538524136979e+00 20904 21312 3.14651504285889e+00 20904 21336 1.32109286328217e+00 20904 21360 1.54387821770836e-01 20904 21672 1.94774584579572e-02 20904 21696 1.49069591127983e-01 20904 21720 3.18619044738265e-01 20904 21744 1.29169985678914e-01 20904 21768 1.45025570956898e-02 20905 20905 1.00000000000000e+00 20906 20906 1.00000000000000e+00 20907 20907 1.00000000000000e+00 20908 20908 1.00000000000000e+00 20909 20909 1.00000000000000e+00 20910 20910 1.00000000000000e+00 20911 20911 1.00000000000000e+00 20912 20912 1.00000000000000e+00 20913 20913 1.00000000000000e+00 20914 20914 1.00000000000000e+00 20915 20915 1.00000000000000e+00 20916 20916 1.00000000000000e+00 20917 20917 1.00000000000000e+00 20918 20918 1.00000000000000e+00 20919 20919 1.00000000000000e+00 20920 20920 1.00000000000000e+00 20921 20921 1.00000000000000e+00 20922 20922 1.00000000000000e+00 20923 20923 1.00000000000000e+00 20924 20924 1.00000000000000e+00 20925 20925 1.00000000000000e+00 20926 20926 1.00000000000000e+00 20927 20927 1.00000000000000e+00 20928 8637 -1.50947173666031e-03 20928 8661 -1.85885487822351e-02 20928 8685 -4.83582745070654e-03 20928 8709 -1.44862846263400e-07 20928 9213 -2.73173367878581e-05 20928 9237 -2.21176604075138e-01 20928 9261 -1.24236010428430e+00 20928 9285 -9.86091564195393e-01 20928 9309 -7.41832630423731e-02 20928 9333 -1.91124497901623e-04 20928 9813 -6.49201867337139e-03 20928 9837 -1.23592080630090e+00 20928 9861 -8.10899043378030e+00 20928 9885 -6.06421539807101e+00 20928 9909 -5.02981888970408e-01 20928 9933 -1.67656038496179e-03 20928 10413 -8.98842633280566e-03 20928 10437 -6.38758052884564e-01 20928 10461 -4.91357092063549e+00 20928 10485 -4.32881999660609e+00 20928 10509 -4.22827509282712e-01 20928 10533 -9.54730890178436e-05 20928 11013 -5.18975087942571e-05 20928 11037 -3.69326044520869e-02 20928 11061 -3.17500633505523e-01 20928 11085 -3.02877918445017e-01 20928 11109 -2.05626619650528e-02 20928 11661 -2.63309666699969e-04 20928 11685 -8.96387949988684e-04 20928 11709 -2.33755502357585e-06 20928 20928 8.65632096176588e+00 20928 20064 2.15020085809392e-02 20928 20088 1.70902255590103e-01 20928 20112 3.82151122065945e-01 20928 20136 1.69183134944825e-01 20928 20160 2.10722284196196e-02 20928 20472 1.90733671077306e-01 20928 20496 1.48802194292693e+00 20928 20520 3.27950601151834e+00 20928 20544 1.47878048249851e+00 20928 20568 1.88423305970201e-01 20928 20880 4.58194494919172e-01 20928 20904 3.51772392353510e+00 20928 20952 3.51831670951079e+00 20928 20976 4.58342691413095e-01 20928 21288 1.75885394049703e-01 20928 21312 1.32109286328217e+00 20928 21336 2.83315650998120e+00 20928 21360 1.36581515747563e+00 20928 21384 1.87065967598068e-01 20928 21696 1.77899393240386e-02 20928 21720 1.29169985678914e-01 20928 21744 2.70563746681661e-01 20928 21768 1.40941803689104e-01 20928 21792 2.07328938265863e-02 20929 20929 1.00000000000000e+00 20930 20930 1.00000000000000e+00 20931 20931 1.00000000000000e+00 20932 20932 1.00000000000000e+00 20933 20933 1.00000000000000e+00 20934 20934 1.00000000000000e+00 20935 20935 1.00000000000000e+00 20936 20936 1.00000000000000e+00 20937 20937 1.00000000000000e+00 20938 20938 1.00000000000000e+00 20939 20939 1.00000000000000e+00 20940 20940 1.00000000000000e+00 20941 20941 1.00000000000000e+00 20942 20942 1.00000000000000e+00 20943 20943 1.00000000000000e+00 20944 20944 1.00000000000000e+00 20945 20945 1.00000000000000e+00 20946 20946 1.00000000000000e+00 20947 20947 1.00000000000000e+00 20948 20948 1.00000000000000e+00 20949 20949 1.00000000000000e+00 20950 20950 1.00000000000000e+00 20951 20951 1.00000000000000e+00 20952 8661 -2.50271011591101e-04 20952 8685 -4.06769525242698e-04 20952 8709 -3.47987915137000e-08 20952 9237 -3.83180860003073e-04 20952 9261 -1.27093248179569e-01 20952 9285 -3.90543641669745e-01 20952 9309 -1.44363945467569e-01 20952 9333 -1.59366967251031e-03 20952 9837 -4.35511837741008e-02 20952 9861 -2.01546910711490e+00 20952 9885 -6.17588936427231e+00 20952 9909 -2.18514483610331e+00 20952 9933 -8.66559427129932e-02 20952 9957 -1.59177904572117e-06 20952 10413 -7.29284455996000e-09 20952 10437 -7.39964518854176e-02 20952 10461 -2.77314972883573e+00 20952 10485 -1.02216097184031e+01 20952 10509 -3.73623591502856e+00 20952 10533 -1.36848367689047e-01 20952 10557 -3.98147192210440e-07 20952 11013 -2.47779430879000e-09 20952 11037 -9.31784332562762e-03 20952 11061 -5.14460043694643e-01 20952 11085 -1.52603805139536e+00 20952 11109 -6.43339735310646e-01 20952 11133 -1.45815447323941e-02 20952 11661 -1.35262437329917e-03 20952 11685 -1.69311411195081e-02 20952 11709 -7.17949674489176e-03 20952 11733 -1.44727600551000e-08 20952 20952 9.20734770868344e+00 20952 20088 2.12235553165866e-02 20952 20112 1.69183134944825e-01 20952 20136 3.80306606051644e-01 20952 20160 1.71998497763053e-01 20952 20184 2.19273960211435e-02 20952 20496 1.81271814654423e-01 20952 20520 1.47878048249851e+00 20952 20544 3.38763623309867e+00 20952 20568 1.52005931556468e+00 20952 20592 1.91591522920965e-01 20952 20904 4.21236485964583e-01 20952 20928 3.51831670951079e+00 20952 20976 3.64388340608857e+00 20952 21000 4.52628160109029e-01 20952 21312 1.54387821770836e-01 20952 21336 1.36581515747563e+00 20952 21360 3.31201727714566e+00 20952 21384 1.40655976561498e+00 20952 21408 1.64573973805675e-01 20952 21720 1.45025570956898e-02 20952 21744 1.40941803689104e-01 20952 21768 3.61401867063392e-01 20952 21792 1.43623610275629e-01 20952 21816 1.51730087423208e-02 20953 20953 1.00000000000000e+00 20954 20954 1.00000000000000e+00 20955 20955 1.00000000000000e+00 20956 20956 1.00000000000000e+00 20957 20957 1.00000000000000e+00 20958 20958 1.00000000000000e+00 20959 20959 1.00000000000000e+00 20960 20960 1.00000000000000e+00 20961 20961 1.00000000000000e+00 20962 20962 1.00000000000000e+00 20963 20963 1.00000000000000e+00 20964 20964 1.00000000000000e+00 20965 20965 1.00000000000000e+00 20966 20966 1.00000000000000e+00 20967 20967 1.00000000000000e+00 20968 20968 1.00000000000000e+00 20969 20969 1.00000000000000e+00 20970 20970 1.00000000000000e+00 20971 20971 1.00000000000000e+00 20972 20972 1.00000000000000e+00 20973 20973 1.00000000000000e+00 20974 20974 1.00000000000000e+00 20975 20975 1.00000000000000e+00 20976 9261 -7.09749042147122e-04 20976 9285 -4.81042644266857e-02 20976 9309 -5.91529245750124e-02 20976 9333 -3.53912977336373e-03 20976 9837 -1.54549245000000e-12 20976 9861 -1.37572068971871e-01 20976 9885 -1.79075268972273e+00 20976 9909 -2.57969505935670e+00 20976 9933 -4.52565793524386e-01 20976 9957 -6.25604395553294e-03 20976 10437 -4.10935087373672e-04 20976 10461 -4.57856882565000e-01 20976 10485 -6.39325921400962e+00 20976 10509 -1.00058294587792e+01 20976 10533 -1.59016329279607e+00 20976 10557 -2.20016673822275e-02 20976 11037 -4.15196523486822e-04 20976 11061 -1.56376062952830e-01 20976 11085 -2.17167163998999e+00 20976 11109 -3.63348164739573e+00 20976 11133 -7.58041586363691e-01 20976 11157 -2.41855455161594e-03 20976 11661 -1.46097158628629e-03 20976 11685 -7.17232553767068e-02 20976 11709 -1.34464897613047e-01 20976 11733 -2.09752511183683e-02 20976 12285 -1.71538377450000e-10 20976 12309 -1.01389756552504e-05 20976 12333 -2.30239133829013e-06 20976 20976 9.13287850138189e+00 20976 20112 2.10722284196196e-02 20976 20136 1.71998497763053e-01 20976 20160 3.93380472821893e-01 20976 20184 1.73589216340481e-01 20976 20208 2.14699080639767e-02 20976 20520 1.88423305970201e-01 20976 20544 1.52005931556468e+00 20976 20568 3.43815469624709e+00 20976 20592 1.50343418584938e+00 20976 20616 1.84267023541376e-01 20976 20928 4.58342691413095e-01 20976 20952 3.64388340608857e+00 20976 21000 3.54045363333228e+00 20976 21024 4.32485248224023e-01 20976 21336 1.87065967598068e-01 20976 21360 1.40655976561499e+00 20976 21384 2.98850003984707e+00 20976 21408 1.33129786065530e+00 20976 21432 1.68250491358146e-01 20976 21744 2.07328938265863e-02 20976 21768 1.43623610275629e-01 20976 21792 2.80966808721889e-01 20976 21816 1.30555135041960e-01 20976 21840 1.74657750181692e-02 20977 20977 1.00000000000000e+00 20978 20978 1.00000000000000e+00 20979 20979 1.00000000000000e+00 20980 20980 1.00000000000000e+00 20981 20981 1.00000000000000e+00 20982 20982 1.00000000000000e+00 20983 20983 1.00000000000000e+00 20984 20984 1.00000000000000e+00 20985 20985 1.00000000000000e+00 20986 20986 1.00000000000000e+00 20987 20987 1.00000000000000e+00 20988 20988 1.00000000000000e+00 20989 20989 1.00000000000000e+00 20990 20990 1.00000000000000e+00 20991 20991 1.00000000000000e+00 20992 20992 1.00000000000000e+00 20993 20993 1.00000000000000e+00 20994 20994 1.00000000000000e+00 20995 20995 1.00000000000000e+00 20996 20996 1.00000000000000e+00 20997 20997 1.00000000000000e+00 20998 20998 1.00000000000000e+00 20999 20999 1.00000000000000e+00 21000 9285 -6.49930412057389e-04 21000 9309 -6.95654844075536e-03 21000 9333 -9.54445888291218e-04 21000 9861 -5.13822501368427e-06 21000 9885 -1.44830657291904e-01 21000 9909 -8.20278751359103e-01 21000 9933 -6.31129289373421e-01 21000 9957 -4.19819363012449e-02 21000 9981 -4.99741004108010e-05 21000 10461 -5.20445063742411e-03 21000 10485 -1.20828029646940e+00 21000 10509 -7.42284113932584e+00 21000 10533 -5.30453705292584e+00 21000 10557 -4.41673679756468e-01 21000 10581 -1.46560958747292e-03 21000 11061 -1.07430284427306e-02 21000 11085 -8.51279404173917e-01 21000 11109 -6.52746285474599e+00 21000 11133 -5.28864690628313e+00 21000 11157 -4.87379513125287e-01 21000 11181 -1.91637324661208e-04 21000 11661 -2.99572453049506e-04 21000 11685 -8.38121177760756e-02 21000 11709 -5.98577294457409e-01 21000 11733 -5.06189018822980e-01 21000 11757 -3.82846590392077e-02 21000 12285 -9.70816716290000e-10 21000 12309 -1.52551360576183e-03 21000 12333 -3.42397024350174e-03 21000 12357 -1.30936415916659e-05 21000 21000 8.85982970989378e+00 21000 20136 2.19273960211435e-02 21000 20160 1.73589216340481e-01 21000 20184 3.89411284935658e-01 21000 20208 1.81741071819458e-01 21000 20232 2.39653598908880e-02 21000 20544 1.91591522920965e-01 21000 20568 1.50343418584938e+00 21000 20592 3.34654915774414e+00 21000 20616 1.56380912680991e+00 21000 20640 2.06685258161097e-01 21000 20952 4.52628160109029e-01 21000 20976 3.54045363333228e+00 21000 21024 3.67969130569658e+00 21000 21048 4.87437578200103e-01 21000 21360 1.64573973805675e-01 21000 21384 1.33129786065530e+00 21000 21408 3.04811342980975e+00 21000 21432 1.43912834252732e+00 21000 21456 1.91531594273680e-01 21000 21768 1.51730087423208e-02 21000 21792 1.30555135041960e-01 21000 21816 3.14802352952062e-01 21000 21840 1.50570875748812e-01 21000 21864 2.01769439190338e-02 21001 21001 1.00000000000000e+00 21002 21002 1.00000000000000e+00 21003 21003 1.00000000000000e+00 21004 21004 1.00000000000000e+00 21005 21005 1.00000000000000e+00 21006 21006 1.00000000000000e+00 21007 21007 1.00000000000000e+00 21008 21008 1.00000000000000e+00 21009 21009 1.00000000000000e+00 21010 21010 1.00000000000000e+00 21011 21011 1.00000000000000e+00 21012 21012 1.00000000000000e+00 21013 21013 1.00000000000000e+00 21014 21014 1.00000000000000e+00 21015 21015 1.00000000000000e+00 21016 21016 1.00000000000000e+00 21017 21017 1.00000000000000e+00 21018 21018 1.00000000000000e+00 21019 21019 1.00000000000000e+00 21020 21020 1.00000000000000e+00 21021 21021 1.00000000000000e+00 21022 21022 1.00000000000000e+00 21023 21023 1.00000000000000e+00 21024 9309 -2.65552428960322e-05 21024 9333 -3.13185518468507e-05 21024 9885 -1.18646387859606e-04 21024 9909 -7.51061278934865e-02 21024 9933 -2.38646796391970e-01 21024 9957 -7.66304469585035e-02 21024 9981 -3.42380297403756e-04 21024 10485 -3.98639657652794e-02 21024 10509 -1.74396899578504e+00 21024 10533 -5.11917555376193e+00 21024 10557 -1.87921702765304e+00 21024 10581 -7.56563029286534e-02 21024 10605 -5.30610853420270e-07 21024 11061 -6.61515078038800e-08 21024 11085 -1.01470518843153e-01 21024 11109 -3.34211054867218e+00 21024 11133 -1.18093709731950e+01 21024 11157 -4.28313906253423e+00 21024 11181 -1.63888366341903e-01 21024 11205 -2.63635274781210e-07 21024 11661 -4.14899663859000e-08 21024 11685 -2.01988474371421e-02 21024 11709 -7.93553797255210e-01 21024 11733 -2.41236416441370e+00 21024 11757 -1.07744492518084e+00 21024 11781 -2.56556343381740e-02 21024 12285 -1.31019120337000e-09 21024 12309 -7.02520703206134e-03 21024 12333 -4.35226319330428e-02 21024 12357 -1.51639929481646e-02 21024 12381 -1.19463980016846e-06 21024 21024 9.77556496808017e+00 21024 20160 2.14699080639767e-02 21024 20184 1.81741071819458e-01 21024 20208 4.33158525793911e-01 21024 20232 2.08832877466460e-01 21024 20256 2.82428594757271e-02 21024 20568 1.84267023541376e-01 21024 20592 1.56380912680991e+00 21024 20616 3.72922002063192e+00 21024 20640 1.77869649869605e+00 21024 20664 2.37988866512911e-01 21024 20976 4.32485248224023e-01 21024 21000 3.67969130569658e+00 21024 21048 4.12606418741718e+00 21024 21072 5.44078468654171e-01 21024 21384 1.68250491358146e-01 21024 21408 1.43912834252732e+00 21024 21432 3.42083700730084e+00 21024 21456 1.51845040734970e+00 21024 21480 1.88081007563742e-01 21024 21792 1.74657750181692e-02 21024 21816 1.50570875748812e-01 21024 21840 3.56062772461144e-01 21024 21864 1.43771354629874e-01 21024 21888 1.57658947384348e-02 21025 21025 1.00000000000000e+00 21026 21026 1.00000000000000e+00 21027 21027 1.00000000000000e+00 21028 21028 1.00000000000000e+00 21029 21029 1.00000000000000e+00 21030 21030 1.00000000000000e+00 21031 21031 1.00000000000000e+00 21032 21032 1.00000000000000e+00 21033 21033 1.00000000000000e+00 21034 21034 1.00000000000000e+00 21035 21035 1.00000000000000e+00 21036 21036 1.00000000000000e+00 21037 21037 1.00000000000000e+00 21038 21038 1.00000000000000e+00 21039 21039 1.00000000000000e+00 21040 21040 1.00000000000000e+00 21041 21041 1.00000000000000e+00 21042 21042 1.00000000000000e+00 21043 21043 1.00000000000000e+00 21044 21044 1.00000000000000e+00 21045 21045 1.00000000000000e+00 21046 21046 1.00000000000000e+00 21047 21047 1.00000000000000e+00 21048 9909 -2.81280434771760e-04 21048 9933 -2.79573555867766e-02 21048 9957 -2.67986772911742e-02 21048 9981 -6.20042783016768e-04 21048 10509 -1.08175470687369e-01 21048 10533 -1.43097519682753e+00 21048 10557 -2.15460430129387e+00 21048 10581 -3.35634600221831e-01 21048 10605 -2.27056743930521e-03 21048 11085 -3.96784765631889e-04 21048 11109 -5.12343280474981e-01 21048 11133 -7.34164664187936e+00 21048 11157 -1.09547396060211e+01 21048 11181 -1.39480511332762e+00 21048 11205 -1.42858512538468e-02 21048 11685 -6.88591247467987e-04 21048 11709 -2.26898724073120e-01 21048 11733 -3.33774787695744e+00 21048 11757 -5.27654274785924e+00 21048 11781 -8.81159512977845e-01 21048 11805 -2.68203129603574e-03 21048 12285 -2.84663206480000e-10 21048 12309 -5.78613424267495e-03 21048 12333 -1.49049353647895e-01 21048 12357 -2.20635404010224e-01 21048 12381 -3.66291396137415e-02 21048 12933 -2.92525320334765e-06 21048 12957 -1.91406254721892e-04 21048 12981 -2.65678797598079e-05 21048 21048 1.06033020384096e+01 21048 20184 2.39653598908880e-02 21048 20208 2.08832877466460e-01 21048 20232 4.91102744427810e-01 21048 20256 1.73977969604061e-01 21048 20280 1.52516329252881e-02 21048 20592 2.06685258161097e-01 21048 20616 1.77869649869605e+00 21048 20640 4.17048493342253e+00 21048 20664 1.57586671027077e+00 21048 20688 1.55977811054779e-01 21048 21000 4.87437578200103e-01 21048 21024 4.12606418741718e+00 21048 21072 3.81874972158654e+00 21048 21096 4.10608961742444e-01 21048 21408 1.91531594273680e-01 21048 21432 1.51845040734971e+00 21048 21456 3.35768784025785e+00 21048 21480 1.37976453011192e+00 21048 21504 1.56860124964233e-01 21048 21816 2.01769439190338e-02 21048 21840 1.43771354629874e-01 21048 21864 2.87903471136643e-01 21048 21888 1.24952424564347e-01 21048 21912 1.54722114026518e-02 21049 21049 1.00000000000000e+00 21050 21050 1.00000000000000e+00 21051 21051 1.00000000000000e+00 21052 21052 1.00000000000000e+00 21053 21053 1.00000000000000e+00 21054 21054 1.00000000000000e+00 21055 21055 1.00000000000000e+00 21056 21056 1.00000000000000e+00 21057 21057 1.00000000000000e+00 21058 21058 1.00000000000000e+00 21059 21059 1.00000000000000e+00 21060 21060 1.00000000000000e+00 21061 21061 1.00000000000000e+00 21062 21062 1.00000000000000e+00 21063 21063 1.00000000000000e+00 21064 21064 1.00000000000000e+00 21065 21065 1.00000000000000e+00 21066 21066 1.00000000000000e+00 21067 21067 1.00000000000000e+00 21068 21068 1.00000000000000e+00 21069 21069 1.00000000000000e+00 21070 21070 1.00000000000000e+00 21071 21071 1.00000000000000e+00 21072 9933 -2.84870293465071e-04 21072 9957 -2.45483860613431e-03 21072 9981 -1.43016294015585e-04 21072 10509 -3.86495522040050e-07 21072 10533 -1.10018885673370e-01 21072 10557 -5.66300017826290e-01 21072 10581 -3.45089594634309e-01 21072 10605 -3.23742370319432e-02 21072 11109 -5.05501392377803e-03 21072 11133 -1.33316206270331e+00 21072 11157 -6.75754988964425e+00 21072 11181 -5.92201974611267e+00 21072 11205 -4.17890200361980e-01 21072 11709 -1.46556642943472e-02 21072 11733 -1.13078752502035e+00 21072 11757 -9.88798952076332e+00 21072 11781 -1.01045841424134e+01 21072 11805 -1.54266916353426e-01 21072 12309 -1.07614750049479e-03 21072 12333 -1.42656758267422e-01 21072 12357 -1.81132176135842e+00 21072 12381 -1.03543496275681e+00 21072 12933 -3.51333413334758e-05 21072 12957 -9.21270429339958e-03 21072 12981 -2.35827455065932e-03 21072 21072 1.08005989053058e+01 21072 20208 2.82428594757271e-02 21072 20232 1.73977969604061e-01 21072 20256 3.84586462846899e-01 21072 20280 2.85641484834276e-01 21072 20616 2.37988866512911e-01 21072 20640 1.57586671027078e+00 21072 20664 3.78957606445573e+00 21072 20688 2.73579568635173e+00 21072 21024 5.44078468654171e-01 21072 21048 3.81874972158654e+00 21072 21096 7.01598994451433e+00 21072 21432 1.88081007563742e-01 21072 21456 1.37976453011191e+00 21072 21480 3.89559657381350e+00 21072 21504 3.02294763350087e+00 21072 21840 1.57658947384348e-02 21072 21864 1.24952424564347e-01 21072 21888 4.11091590186342e-01 21072 21912 3.57429471621562e-01 21073 21073 1.00000000000000e+00 21074 21074 1.00000000000000e+00 21075 21075 1.00000000000000e+00 21076 21076 1.00000000000000e+00 21077 21077 1.00000000000000e+00 21078 21078 1.00000000000000e+00 21079 21079 1.00000000000000e+00 21080 21080 1.00000000000000e+00 21081 21081 1.00000000000000e+00 21082 21082 1.00000000000000e+00 21083 21083 1.00000000000000e+00 21084 21084 1.00000000000000e+00 21085 21085 1.00000000000000e+00 21086 21086 1.00000000000000e+00 21087 21087 1.00000000000000e+00 21088 21088 1.00000000000000e+00 21089 21089 1.00000000000000e+00 21090 21090 1.00000000000000e+00 21091 21091 1.00000000000000e+00 21092 21092 1.00000000000000e+00 21093 21093 1.00000000000000e+00 21094 21094 1.00000000000000e+00 21095 21095 1.00000000000000e+00 21096 9957 -1.54286544133730e-07 21096 9981 -1.33099563758220e-07 21096 10533 -2.42166638779766e-05 21096 10557 -3.17314047065696e-02 21096 10581 -1.65636733875920e-01 21096 10605 -4.88682978709389e-02 21096 11133 -3.10803560498793e-02 21096 11157 -1.79324213756294e+00 21096 11181 -6.32291240332932e+00 21096 11205 -7.35786296464176e-01 21096 11709 -2.12346769668860e-07 21096 11733 -1.11494712416177e-01 21096 11757 -7.14013593441091e+00 21096 11781 -1.47080981867743e+01 21096 11805 -2.89759613634602e-01 21096 12309 -2.27564163003300e-07 21096 12333 -4.22648233034809e-02 21096 12357 -2.47118942806315e+00 21096 12381 -1.81449700885224e+00 21096 12933 -4.97899102435181e-05 21096 12957 -1.70855648037459e-02 21096 12981 -4.53057394299999e-03 21096 21096 1.21577171568315e+01 21096 20232 1.52516329252881e-02 21096 20256 2.85641484834276e-01 21096 20280 4.64521539191535e-01 21096 20640 1.55977811054779e-01 21096 20664 2.73579568635172e+00 21096 20688 4.37974669531999e+00 21096 21048 4.10608961742444e-01 21096 21072 7.01598994451433e+00 21096 21456 1.56860124964233e-01 21096 21480 3.02294763350087e+00 21096 21504 4.94787439225209e+00 21096 21864 1.54722114026518e-02 21096 21888 3.57429471621562e-01 21096 21912 6.06553463424562e-01 21097 21097 1.00000000000000e+00 21098 21098 1.00000000000000e+00 21099 21099 1.00000000000000e+00 21100 21100 1.00000000000000e+00 21101 21101 1.00000000000000e+00 21102 21102 1.00000000000000e+00 21103 21103 1.00000000000000e+00 21104 21104 1.00000000000000e+00 21105 21105 1.00000000000000e+00 21106 21106 1.00000000000000e+00 21107 21107 1.00000000000000e+00 21108 21108 1.00000000000000e+00 21109 21109 1.00000000000000e+00 21110 21110 1.00000000000000e+00 21111 21111 1.00000000000000e+00 21112 21112 1.00000000000000e+00 21113 21113 1.00000000000000e+00 21114 21114 1.00000000000000e+00 21115 21115 1.00000000000000e+00 21116 21116 1.00000000000000e+00 21117 21117 1.00000000000000e+00 21118 21118 1.00000000000000e+00 21119 21119 1.00000000000000e+00 21120 7317 -1.38468320828474e-01 21120 7341 -5.03800392544239e-01 21120 7365 -1.19215732302672e-02 21120 7389 -7.90465775745000e-09 21120 7893 -5.16422235334541e-03 21120 7917 -5.11769890541422e+00 21120 7941 -5.62748706111386e+00 21120 7965 -1.17498240106752e-01 21120 7989 -4.61831190340906e-06 21120 8493 -2.58559228758133e-01 21120 8517 -1.13506209985228e+01 21120 8541 -5.32072509956953e+00 21120 8565 -9.39954658147383e-02 21120 8589 -3.45535269833850e-07 21120 9093 -3.88419704019062e-02 21120 9117 -1.21722609796364e+00 21120 9141 -8.20147575343329e-01 21120 9165 -8.34695865135706e-03 21120 21120 9.75447987253461e+00 21120 20304 7.37871840795673e-01 21120 20328 4.24116551982357e-01 21120 20352 1.57658947384346e-02 21120 20712 4.74889323458448e+00 21120 20736 2.81178010326743e+00 21120 20760 1.24952424564338e-01 21120 21144 5.81606050191944e+00 21120 21168 4.11091590186319e-01 21120 21528 3.45137496366532e+00 21120 21552 2.97669063250815e+00 21120 21576 3.57429471621569e-01 21121 21121 1.00000000000000e+00 21122 21122 1.00000000000000e+00 21123 21123 1.00000000000000e+00 21124 21124 1.00000000000000e+00 21125 21125 1.00000000000000e+00 21126 21126 1.00000000000000e+00 21127 21127 1.00000000000000e+00 21128 21128 1.00000000000000e+00 21129 21129 1.00000000000000e+00 21130 21130 1.00000000000000e+00 21131 21131 1.00000000000000e+00 21132 21132 1.00000000000000e+00 21133 21133 1.00000000000000e+00 21134 21134 1.00000000000000e+00 21135 21135 1.00000000000000e+00 21136 21136 1.00000000000000e+00 21137 21137 1.00000000000000e+00 21138 21138 1.00000000000000e+00 21139 21139 1.00000000000000e+00 21140 21140 1.00000000000000e+00 21141 21141 1.00000000000000e+00 21142 21142 1.00000000000000e+00 21143 21143 1.00000000000000e+00 21144 7317 -7.30006766659686e-02 21144 7341 -2.98294215297023e-01 21144 7365 -1.53507695888778e-02 21144 7389 -1.26266347100430e-07 21144 7893 -2.70507787133987e-03 21144 7917 -3.05351420152937e+00 21144 7941 -4.72007968522739e+00 21144 7965 -6.38508544939145e-01 21144 7989 -1.65362016833941e-02 21144 8493 -1.61524079405966e-01 21144 8517 -1.07635608328280e+01 21144 8541 -1.13396010740792e+01 21144 8565 -1.79211733908763e+00 21144 8589 -3.39913024247143e-02 21144 9093 -2.76749461282611e-02 21144 9117 -2.63427490152784e+00 21144 9141 -5.11981516898460e+00 21144 9165 -9.48787970187852e-01 21144 9189 -1.97299421219385e-03 21144 9741 -2.32563123210228e-02 21144 9765 -1.88624550732973e-02 21144 21144 1.02261200668353e+01 21144 20304 4.24116551982357e-01 21144 20328 4.64035159481762e-01 21144 20352 1.88081007563737e-01 21144 20376 3.12543571524997e-02 21144 20712 2.81178010326743e+00 21144 20736 3.37521270349810e+00 21144 20760 1.37976453011180e+00 21144 20784 2.19988707963608e-01 21144 21120 5.81606050191944e+00 21144 21168 3.89559657381323e+00 21144 21192 5.62807553266975e-01 21144 21528 2.97669063250816e+00 21144 21552 6.89066535570974e+00 21144 21576 3.02294763350103e+00 21144 21600 3.98307436753687e-01 21145 21145 1.00000000000000e+00 21146 21146 1.00000000000000e+00 21147 21147 1.00000000000000e+00 21148 21148 1.00000000000000e+00 21149 21149 1.00000000000000e+00 21150 21150 1.00000000000000e+00 21151 21151 1.00000000000000e+00 21152 21152 1.00000000000000e+00 21153 21153 1.00000000000000e+00 21154 21154 1.00000000000000e+00 21155 21155 1.00000000000000e+00 21156 21156 1.00000000000000e+00 21157 21157 1.00000000000000e+00 21158 21158 1.00000000000000e+00 21159 21159 1.00000000000000e+00 21160 21160 1.00000000000000e+00 21161 21161 1.00000000000000e+00 21162 21162 1.00000000000000e+00 21163 21163 1.00000000000000e+00 21164 21164 1.00000000000000e+00 21165 21165 1.00000000000000e+00 21166 21166 1.00000000000000e+00 21167 21167 1.00000000000000e+00 21168 7317 -1.07614750049477e-03 21168 7341 -1.46556642943469e-02 21168 7365 -5.05501392377792e-03 21168 7389 -3.86495522040040e-07 21168 7893 -3.51333413334755e-05 21168 7917 -1.42656758267409e-01 21168 7941 -1.13078752502027e+00 21168 7965 -1.33316206270325e+00 21168 7989 -1.10018885673367e-01 21168 8013 -2.84870293465062e-04 21168 8493 -9.21270429339987e-03 21168 8517 -1.81132176135842e+00 21168 8541 -9.88798952076265e+00 21168 8565 -6.75754988964355e+00 21168 8589 -5.66300017826257e-01 21168 8613 -2.45483860613423e-03 21168 9093 -2.35827455065941e-03 21168 9117 -1.03543496275688e+00 21168 9141 -1.01045841424140e+01 21168 9165 -5.92201974611269e+00 21168 9189 -3.45089594634301e-01 21168 9213 -1.43016294015581e-04 21168 9741 -1.54266916353447e-01 21168 9765 -4.17890200362026e-01 21168 9789 -3.23742370319458e-02 21168 21168 1.08005989053051e+01 21168 20304 1.57658947384346e-02 21168 20328 1.88081007563737e-01 21168 20352 5.44078468654156e-01 21168 20376 2.37988866512904e-01 21168 20400 2.82428594757262e-02 21168 20712 1.24952424564338e-01 21168 20736 1.37976453011180e+00 21168 20760 3.81874972158620e+00 21168 20784 1.57586671027066e+00 21168 20808 1.73977969604054e-01 21168 21120 4.11091590186319e-01 21168 21144 3.89559657381323e+00 21168 21192 3.78957606445555e+00 21168 21216 3.84586462846898e-01 21168 21528 3.57429471621569e-01 21168 21552 3.02294763350103e+00 21168 21576 7.01598994451490e+00 21168 21600 2.73579568635197e+00 21168 21624 2.85641484834303e-01 21169 21169 1.00000000000000e+00 21170 21170 1.00000000000000e+00 21171 21171 1.00000000000000e+00 21172 21172 1.00000000000000e+00 21173 21173 1.00000000000000e+00 21174 21174 1.00000000000000e+00 21175 21175 1.00000000000000e+00 21176 21176 1.00000000000000e+00 21177 21177 1.00000000000000e+00 21178 21178 1.00000000000000e+00 21179 21179 1.00000000000000e+00 21180 21180 1.00000000000000e+00 21181 21181 1.00000000000000e+00 21182 21182 1.00000000000000e+00 21183 21183 1.00000000000000e+00 21184 21184 1.00000000000000e+00 21185 21185 1.00000000000000e+00 21186 21186 1.00000000000000e+00 21187 21187 1.00000000000000e+00 21188 21188 1.00000000000000e+00 21189 21189 1.00000000000000e+00 21190 21190 1.00000000000000e+00 21191 21191 1.00000000000000e+00 21192 7341 -3.76985077331571e-04 21192 7365 -6.38658904575269e-04 21192 7389 -9.46477160706500e-08 21192 7917 -3.56454239513502e-04 21192 7941 -1.60508309066103e-01 21192 7965 -5.38961450759740e-01 21192 7989 -2.00180555053642e-01 21192 8013 -2.14648723749300e-03 21192 8517 -9.62596793221467e-02 21192 8541 -2.39548250059451e+00 21192 8565 -5.48334295921220e+00 21192 8589 -2.25180646794097e+00 21192 8613 -9.94144917254037e-02 21192 8637 -2.55024749279370e-06 21192 9117 -1.22950809007928e-01 21192 9141 -4.52174059881939e+00 21192 9165 -1.16102424187961e+01 21192 9189 -3.50368766140368e+00 21192 9213 -1.23074941957576e-01 21192 9237 -6.36605257387350e-07 21192 9741 -2.75622480796982e-01 21192 9765 -2.51925394366349e+00 21192 9789 -1.42156879861833e+00 21192 9813 -1.38478634824624e-02 21192 10365 -8.45132164331575e-05 21192 10389 -8.11888108207384e-04 21192 10413 -1.80427590875920e-07 21192 21192 8.22345368046100e+00 21192 20328 3.12543571524997e-02 21192 20352 2.37988866512904e-01 21192 20376 5.07714859658753e-01 21192 20400 2.11270441481439e-01 21192 20424 2.45747508946335e-02 21192 20736 2.19988707963608e-01 21192 20760 1.57586671027066e+00 21192 20784 3.16981381131369e+00 21192 20808 1.36062223715688e+00 21192 20832 1.66177589685164e-01 21192 21144 5.62807553266975e-01 21192 21168 3.78957606445555e+00 21192 21216 3.56739673796153e+00 21192 21240 5.07262721643473e-01 21192 21552 3.98307436753687e-01 21192 21576 2.73579568635196e+00 21192 21600 5.45879703285382e+00 21192 21624 3.10346929434230e+00 21192 21648 4.90225838751271e-01 21193 21193 1.00000000000000e+00 21194 21194 1.00000000000000e+00 21195 21195 1.00000000000000e+00 21196 21196 1.00000000000000e+00 21197 21197 1.00000000000000e+00 21198 21198 1.00000000000000e+00 21199 21199 1.00000000000000e+00 21200 21200 1.00000000000000e+00 21201 21201 1.00000000000000e+00 21202 21202 1.00000000000000e+00 21203 21203 1.00000000000000e+00 21204 21204 1.00000000000000e+00 21205 21205 1.00000000000000e+00 21206 21206 1.00000000000000e+00 21207 21207 1.00000000000000e+00 21208 21208 1.00000000000000e+00 21209 21209 1.00000000000000e+00 21210 21210 1.00000000000000e+00 21211 21211 1.00000000000000e+00 21212 21212 1.00000000000000e+00 21213 21213 1.00000000000000e+00 21214 21214 1.00000000000000e+00 21215 21215 1.00000000000000e+00 21216 7941 -7.25522370285930e-04 21216 7965 -6.28594643042386e-02 21216 7989 -7.55358123396607e-02 21216 8013 -4.35560139697698e-03 21216 8541 -1.07496598483683e-01 21216 8565 -1.43888709538291e+00 21216 8589 -2.49991636289078e+00 21216 8613 -5.23272904718809e-01 21216 8637 -8.22518959263143e-03 21216 9141 -6.32999049357058e-01 21216 9165 -9.05696095074192e+00 21216 9189 -1.02980360621152e+01 21216 9213 -1.56020234216349e+00 21216 9237 -2.75544390262804e-02 21216 9741 -9.08396678635035e-02 21216 9765 -4.99269484568011e+00 21216 9789 -7.22856710572123e+00 21216 9813 -9.00513750001270e-01 21216 9837 -2.60936372640858e-03 21216 10365 -6.07278449815382e-04 21216 10389 -7.27606402896131e-02 21216 10413 -3.73800305753871e-02 21216 21216 9.96801212356335e+00 21216 20352 2.82428594757262e-02 21216 20376 2.11270441481439e-01 21216 20400 4.48016156154037e-01 21216 20424 2.04608133035232e-01 21216 20448 2.65772823641744e-02 21216 20760 1.73977969604054e-01 21216 20784 1.36062223715689e+00 21216 20808 3.02295807149264e+00 21216 20832 1.42526502644433e+00 21216 20856 1.90138666925914e-01 21216 21168 3.84586462846898e-01 21216 21192 3.56739673796153e+00 21216 21240 3.89793934425672e+00 21216 21264 4.67222114420693e-01 21216 21576 2.85641484834303e-01 21216 21600 3.10346929434230e+00 21216 21624 8.42373780668319e+00 21216 21648 3.13883496231922e+00 21216 21672 2.94482901828523e-01 21217 21217 1.00000000000000e+00 21218 21218 1.00000000000000e+00 21219 21219 1.00000000000000e+00 21220 21220 1.00000000000000e+00 21221 21221 1.00000000000000e+00 21222 21222 1.00000000000000e+00 21223 21223 1.00000000000000e+00 21224 21224 1.00000000000000e+00 21225 21225 1.00000000000000e+00 21226 21226 1.00000000000000e+00 21227 21227 1.00000000000000e+00 21228 21228 1.00000000000000e+00 21229 21229 1.00000000000000e+00 21230 21230 1.00000000000000e+00 21231 21231 1.00000000000000e+00 21232 21232 1.00000000000000e+00 21233 21233 1.00000000000000e+00 21234 21234 1.00000000000000e+00 21235 21235 1.00000000000000e+00 21236 21236 1.00000000000000e+00 21237 21237 1.00000000000000e+00 21238 21238 1.00000000000000e+00 21239 21239 1.00000000000000e+00 21240 7965 -7.09905820190969e-04 21240 7989 -8.02865271787030e-03 21240 8013 -1.17783345955637e-03 21240 8541 -5.73103372691886e-06 21240 8565 -1.13112689805214e-01 21240 8589 -8.31720144615557e-01 21240 8613 -7.67651190101436e-01 21240 8637 -5.14144086384422e-02 21240 8661 -6.02398997712644e-05 21240 9141 -1.42217084326026e-02 21240 9165 -1.92125528213328e+00 21240 9189 -7.61855577416950e+00 21240 9213 -5.10178297208434e+00 21240 9237 -4.28266688460076e-01 21240 9261 -1.69124856312060e-03 21240 9741 -7.39950019853701e-03 21240 9765 -1.64156849315702e+00 21240 9789 -1.01403827040806e+01 21240 9813 -5.86735061115207e+00 21240 9837 -3.49286089514245e-01 21240 9861 -2.23427793991197e-04 21240 10365 -1.16143813803571e-03 21240 10389 -4.56253711353306e-01 21240 10413 -8.79965056906130e-01 21240 10437 -5.65856354692916e-02 21240 21240 9.38018160737729e+00 21240 20376 2.45747508946335e-02 21240 20400 2.04608133035232e-01 21240 20424 4.74982653968496e-01 21240 20448 2.06994670444987e-01 21240 20472 2.51713852470724e-02 21240 20784 1.66177589685164e-01 21240 20808 1.42526502644433e+00 21240 20832 3.36345328386552e+00 21240 20856 1.38078276116632e+00 21240 20880 1.55057023365662e-01 21240 21192 5.07262721643473e-01 21240 21216 3.89793934425672e+00 21240 21264 3.45834867769275e+00 21240 21288 3.97365055002482e-01 21240 21600 4.90225838751271e-01 21240 21624 3.13883496231919e+00 21240 21648 5.56573923087704e+00 21240 21672 2.63307945879095e+00 21240 21696 3.63786962869213e-01 21241 21241 1.00000000000000e+00 21242 21242 1.00000000000000e+00 21243 21243 1.00000000000000e+00 21244 21244 1.00000000000000e+00 21245 21245 1.00000000000000e+00 21246 21246 1.00000000000000e+00 21247 21247 1.00000000000000e+00 21248 21248 1.00000000000000e+00 21249 21249 1.00000000000000e+00 21250 21250 1.00000000000000e+00 21251 21251 1.00000000000000e+00 21252 21252 1.00000000000000e+00 21253 21253 1.00000000000000e+00 21254 21254 1.00000000000000e+00 21255 21255 1.00000000000000e+00 21256 21256 1.00000000000000e+00 21257 21257 1.00000000000000e+00 21258 21258 1.00000000000000e+00 21259 21259 1.00000000000000e+00 21260 21260 1.00000000000000e+00 21261 21261 1.00000000000000e+00 21262 21262 1.00000000000000e+00 21263 21263 1.00000000000000e+00 21264 7989 -3.48101433441661e-05 21264 8013 -4.27068489809045e-05 21264 8565 -9.55235986069331e-05 21264 8589 -8.48036522135815e-02 21264 8613 -2.75908869197936e-01 21264 8637 -8.46843250636841e-02 21264 8661 -3.83203401246183e-04 21264 9165 -5.86754948615230e-02 21264 9189 -1.62540162070135e+00 21264 9213 -3.94528752716499e+00 21264 9237 -1.66495891798119e+00 21264 9261 -7.03796648728656e-02 21264 9285 -7.35209993245730e-07 21264 9765 -1.27735214090194e-01 21264 9789 -4.98769432682709e+00 21264 9813 -1.21491661808584e+01 21264 9837 -3.32914583511341e+00 21264 9861 -1.30866721526174e-01 21264 9885 -3.64761453425570e-07 21264 10365 -2.69315925168939e-04 21264 10389 -7.91085148021612e-01 21264 10413 -4.37787045752166e+00 21264 10437 -1.73985483446230e+00 21264 10461 -1.99678375256180e-02 21264 11013 -2.95310796217861e-03 21264 11037 -1.17009061321147e-02 21264 11061 -5.06717717815112e-06 21264 21264 8.34560968819238e+00 21264 20400 2.65772823641744e-02 21264 20424 2.06994670444987e-01 21264 20448 4.54332216932561e-01 21264 20472 2.00736623449202e-01 21264 20496 2.50127706152282e-02 21264 20808 1.90138666925914e-01 21264 20832 1.38078276116632e+00 21264 20856 2.84901195706931e+00 21264 20880 1.33207175863363e+00 21264 20904 1.77960916292741e-01 21264 21216 4.67222114420693e-01 21264 21240 3.45834867769275e+00 21264 21288 3.67164699493721e+00 21264 21312 5.20546693731807e-01 21264 21624 2.94482901828523e-01 21264 21648 2.63307945879099e+00 21264 21672 6.56077331714630e+00 21264 21696 3.23794388911829e+00 21264 21720 4.45699009410358e-01 21265 21265 1.00000000000000e+00 21266 21266 1.00000000000000e+00 21267 21267 1.00000000000000e+00 21268 21268 1.00000000000000e+00 21269 21269 1.00000000000000e+00 21270 21270 1.00000000000000e+00 21271 21271 1.00000000000000e+00 21272 21272 1.00000000000000e+00 21273 21273 1.00000000000000e+00 21274 21274 1.00000000000000e+00 21275 21275 1.00000000000000e+00 21276 21276 1.00000000000000e+00 21277 21277 1.00000000000000e+00 21278 21278 1.00000000000000e+00 21279 21279 1.00000000000000e+00 21280 21280 1.00000000000000e+00 21281 21281 1.00000000000000e+00 21282 21282 1.00000000000000e+00 21283 21283 1.00000000000000e+00 21284 21284 1.00000000000000e+00 21285 21285 1.00000000000000e+00 21286 21286 1.00000000000000e+00 21287 21287 1.00000000000000e+00 21288 8589 -2.63403151354021e-04 21288 8613 -2.92956316988260e-02 21288 8637 -2.75991069040440e-02 21288 8661 -6.29502914319938e-04 21288 9189 -6.90657784007974e-02 21288 9213 -1.01464558466504e+00 21288 9237 -1.82669002690140e+00 21288 9261 -3.51322853426484e-01 21288 9285 -4.16543717404551e-03 21288 9765 -1.55434573406250e-07 21288 9789 -7.88820640174529e-01 21288 9813 -8.15750338257103e+00 21288 9837 -9.17219547194407e+00 21288 9861 -1.35404939750063e+00 21288 9885 -2.42284408096528e-02 21288 10365 -2.25852715468000e-08 21288 10389 -2.25446163389854e-01 21288 10413 -6.55683928723505e+00 21288 10437 -8.15239410774474e+00 21288 10461 -9.00428623635632e-01 21288 10485 -3.41592650809742e-03 21288 11013 -1.58080846130479e-02 21288 11037 -2.18132430886979e-01 21288 11061 -6.76799247529346e-02 21288 21288 1.01339764526106e+01 21288 20424 2.51713852470724e-02 21288 20448 2.00736623449202e-01 21288 20472 4.51557124279110e-01 21288 20496 2.04776719214461e-01 21288 20520 2.61814091883872e-02 21288 20832 1.55057023365662e-01 21288 20856 1.33207175863363e+00 21288 20880 3.17831707809929e+00 21288 20904 1.41538524136979e+00 21288 20928 1.75885394049703e-01 21288 21240 3.97365055002482e-01 21288 21264 3.67164699493721e+00 21288 21312 3.71364396652329e+00 21288 21336 4.07864297899003e-01 21288 21648 3.63786962869213e-01 21288 21672 3.23794388911829e+00 21288 21696 7.76021858978311e+00 21288 21720 2.84378594303404e+00 21288 21744 2.65247476348150e-01 21289 21289 1.00000000000000e+00 21290 21290 1.00000000000000e+00 21291 21291 1.00000000000000e+00 21292 21292 1.00000000000000e+00 21293 21293 1.00000000000000e+00 21294 21294 1.00000000000000e+00 21295 21295 1.00000000000000e+00 21296 21296 1.00000000000000e+00 21297 21297 1.00000000000000e+00 21298 21298 1.00000000000000e+00 21299 21299 1.00000000000000e+00 21300 21300 1.00000000000000e+00 21301 21301 1.00000000000000e+00 21302 21302 1.00000000000000e+00 21303 21303 1.00000000000000e+00 21304 21304 1.00000000000000e+00 21305 21305 1.00000000000000e+00 21306 21306 1.00000000000000e+00 21307 21307 1.00000000000000e+00 21308 21308 1.00000000000000e+00 21309 21309 1.00000000000000e+00 21310 21310 1.00000000000000e+00 21311 21311 1.00000000000000e+00 21312 8613 -2.47411633771673e-04 21312 8637 -2.26300359808550e-03 21312 8661 -1.43395025777822e-04 21312 9189 -2.10202261173670e-07 21312 9213 -7.89606507668563e-02 21312 9237 -5.57018387595856e-01 21312 9261 -4.56776305238471e-01 21312 9285 -2.34736856990423e-02 21312 9309 -4.02905087151119e-06 21312 9789 -1.30329133732080e-02 21312 9813 -1.55811480797783e+00 21312 9837 -5.81223872309214e+00 21312 9861 -3.99618407387618e+00 21312 9885 -3.40415392059897e-01 21312 9909 -1.11687003265819e-03 21312 10389 -1.20141728929727e-02 21312 10413 -2.02506210321669e+00 21312 10437 -1.05430018435055e+01 21312 10461 -5.95229647679319e+00 21312 10485 -3.74380593890030e-01 21312 10509 -3.11177468058401e-04 21312 11013 -1.89372668443841e-02 21312 11037 -1.08493774795171e+00 21312 11061 -1.58757384800460e+00 21312 11085 -8.86963956974830e-02 21312 11661 -2.02792477156877e-06 21312 11685 -7.01874925208500e-07 21312 21312 8.49983496383122e+00 21312 20448 2.50127706152282e-02 21312 20472 2.04776719214461e-01 21312 20496 4.68009715976442e-01 21312 20520 2.01103230141625e-01 21312 20544 2.40943983470192e-02 21312 20856 1.77960916292741e-01 21312 20880 1.41538524136979e+00 21312 20904 3.14651504285889e+00 21312 20928 1.32109286328217e+00 21312 20952 1.54387821770836e-01 21312 21264 5.20546693731807e-01 21312 21288 3.71364396652329e+00 21312 21336 3.44529520645668e+00 21312 21360 4.53459503715156e-01 21312 21672 4.45699009410358e-01 21312 21696 2.84378594303404e+00 21312 21720 5.14231724303775e+00 21312 21744 2.87162435362045e+00 21312 21768 4.52658612056961e-01 21313 21313 1.00000000000000e+00 21314 21314 1.00000000000000e+00 21315 21315 1.00000000000000e+00 21316 21316 1.00000000000000e+00 21317 21317 1.00000000000000e+00 21318 21318 1.00000000000000e+00 21319 21319 1.00000000000000e+00 21320 21320 1.00000000000000e+00 21321 21321 1.00000000000000e+00 21322 21322 1.00000000000000e+00 21323 21323 1.00000000000000e+00 21324 21324 1.00000000000000e+00 21325 21325 1.00000000000000e+00 21326 21326 1.00000000000000e+00 21327 21327 1.00000000000000e+00 21328 21328 1.00000000000000e+00 21329 21329 1.00000000000000e+00 21330 21330 1.00000000000000e+00 21331 21331 1.00000000000000e+00 21332 21332 1.00000000000000e+00 21333 21333 1.00000000000000e+00 21334 21334 1.00000000000000e+00 21335 21335 1.00000000000000e+00 21336 8637 -3.20764573755030e-07 21336 8661 -2.87805904174350e-07 21336 9213 -1.90559154330363e-05 21336 9237 -4.82939482475499e-02 21336 9261 -1.45112262225362e-01 21336 9285 -3.18464976229823e-02 21336 9309 -2.19376034812516e-05 21336 9813 -3.65312941816135e-02 21336 9837 -1.13270057768643e+00 21336 9861 -3.00685097530566e+00 21336 9885 -1.25135147236020e+00 21336 9909 -4.73116659948570e-02 21336 9933 -1.54264278491790e-07 21336 10413 -1.51606456257919e-01 21336 10437 -5.50103384768736e+00 21336 10461 -1.24786044584959e+01 21336 10485 -3.15244129814928e+00 21336 10509 -1.30571047099534e-01 21336 10533 -1.33252547496480e-07 21336 11013 -4.00184406382054e-03 21336 11037 -1.73811843761455e+00 21336 11061 -6.80856023493025e+00 21336 11085 -1.88437508933354e+00 21336 11109 -2.67141945964825e-02 21336 11661 -1.77902210357934e-02 21336 11685 -3.98978040899721e-02 21336 11709 -2.89818847393758e-05 21336 21336 9.15595174167024e+00 21336 20472 2.61814091883872e-02 21336 20496 2.01103230141625e-01 21336 20520 4.37725380813625e-01 21336 20544 2.00511985679799e-01 21336 20568 2.60335980729306e-02 21336 20880 1.75885394049703e-01 21336 20904 1.32109286328217e+00 21336 20928 2.83315650998120e+00 21336 20952 1.36581515747563e+00 21336 20976 1.87065967598068e-01 21336 21288 4.07864297899003e-01 21336 21312 3.44529520645668e+00 21336 21360 3.78477955217493e+00 21336 21384 4.92735384328564e-01 21336 21696 2.65247476348150e-01 21336 21720 2.87162435362045e+00 21336 21744 7.86066781462640e+00 21336 21768 3.22216462969525e+00 21336 21792 3.52882545366849e-01 21337 21337 1.00000000000000e+00 21338 21338 1.00000000000000e+00 21339 21339 1.00000000000000e+00 21340 21340 1.00000000000000e+00 21341 21341 1.00000000000000e+00 21342 21342 1.00000000000000e+00 21343 21343 1.00000000000000e+00 21344 21344 1.00000000000000e+00 21345 21345 1.00000000000000e+00 21346 21346 1.00000000000000e+00 21347 21347 1.00000000000000e+00 21348 21348 1.00000000000000e+00 21349 21349 1.00000000000000e+00 21350 21350 1.00000000000000e+00 21351 21351 1.00000000000000e+00 21352 21352 1.00000000000000e+00 21353 21353 1.00000000000000e+00 21354 21354 1.00000000000000e+00 21355 21355 1.00000000000000e+00 21356 21356 1.00000000000000e+00 21357 21357 1.00000000000000e+00 21358 21358 1.00000000000000e+00 21359 21359 1.00000000000000e+00 21360 9237 -8.87003356679518e-05 21360 9261 -1.27081830126302e-02 21360 9285 -8.39152786425476e-03 21360 9309 -2.73146508523387e-05 21360 9837 -4.59803680636722e-02 21360 9861 -7.34540317333704e-01 21360 9885 -1.28251347224225e+00 21360 9909 -2.23748796928781e-01 21360 9933 -1.73381330431115e-03 21360 10413 -4.28709318978553e-06 21360 10437 -9.00313035298769e-01 21360 10461 -6.90326339321363e+00 21360 10485 -7.85669670876064e+00 21360 10509 -1.16968533203045e+00 21360 10533 -2.03872129237755e-02 21360 11013 -1.54782487178357e-06 21360 11037 -4.48334279241388e-01 21360 11061 -7.40748823357025e+00 21360 11085 -8.42168416152418e+00 21360 11109 -9.28686431603799e-01 21360 11133 -4.43604484561137e-03 21360 11661 -9.11000637037613e-02 21360 11685 -5.54951980889249e-01 21360 11709 -1.24352589445779e-01 21360 11733 -2.84816028581600e-08 21360 21360 9.72287790042700e+00 21360 20496 2.40943983470192e-02 21360 20520 2.00511985679799e-01 21360 20544 4.66602452223006e-01 21360 20568 2.08016331128114e-01 21360 20592 2.59704847090978e-02 21360 20904 1.54387821770836e-01 21360 20928 1.36581515747563e+00 21360 20952 3.31201727714566e+00 21360 20976 1.40655976561499e+00 21360 21000 1.64573973805675e-01 21360 21312 4.53459503715156e-01 21360 21336 3.78477955217493e+00 21360 21384 3.51355052713264e+00 21360 21408 3.85652247454584e-01 21360 21720 4.52658612056961e-01 21360 21744 3.22216462969525e+00 21360 21768 6.39329861863257e+00 21360 21792 2.58960730429136e+00 21360 21816 2.94519280705989e-01 21361 21361 1.00000000000000e+00 21362 21362 1.00000000000000e+00 21363 21363 1.00000000000000e+00 21364 21364 1.00000000000000e+00 21365 21365 1.00000000000000e+00 21366 21366 1.00000000000000e+00 21367 21367 1.00000000000000e+00 21368 21368 1.00000000000000e+00 21369 21369 1.00000000000000e+00 21370 21370 1.00000000000000e+00 21371 21371 1.00000000000000e+00 21372 21372 1.00000000000000e+00 21373 21373 1.00000000000000e+00 21374 21374 1.00000000000000e+00 21375 21375 1.00000000000000e+00 21376 21376 1.00000000000000e+00 21377 21377 1.00000000000000e+00 21378 21378 1.00000000000000e+00 21379 21379 1.00000000000000e+00 21380 21380 1.00000000000000e+00 21381 21381 1.00000000000000e+00 21382 21382 1.00000000000000e+00 21383 21383 1.00000000000000e+00 21384 9261 -5.95594804659731e-05 21384 9285 -3.92140677873953e-04 21384 9309 -5.82139999520688e-06 21384 9837 -6.23034231000000e-12 21384 9861 -5.10251812906424e-02 21384 9885 -3.59609790199526e-01 21384 9909 -2.52605295670657e-01 21384 9933 -8.89962435477900e-03 21384 9957 -6.97276547140000e-10 21384 10437 -9.46517302950805e-03 21384 10461 -1.14792032596771e+00 21384 10485 -4.42373616499353e+00 21384 10509 -3.15212942479756e+00 21384 10533 -2.68460388411376e-01 21384 10557 -7.12208246196838e-04 21384 11037 -1.51031657139685e-02 21384 11061 -2.26455304050115e+00 21384 11085 -1.11982184290237e+01 21384 11109 -5.85915587839840e+00 21384 11133 -4.08296859121552e-01 21384 11157 -3.77341038477304e-04 21384 11661 -9.76740571613049e-02 21384 11685 -2.21730298722647e+00 21384 11709 -2.29622406868509e+00 21384 11733 -1.16854240285129e-01 21384 12285 -3.15062376914760e-07 21384 12309 -2.18156224160933e-03 21384 12333 -3.88025594488446e-04 21384 21384 8.16173749686326e+00 21384 20520 2.60335980729306e-02 21384 20544 2.08016331128114e-01 21384 20568 4.66158201239863e-01 21384 20592 2.02269330121860e-01 21384 20616 2.45968478213673e-02 21384 20928 1.87065967598068e-01 21384 20952 1.40655976561498e+00 21384 20976 2.98850003984707e+00 21384 21000 1.33129786065530e+00 21384 21024 1.68250491358146e-01 21384 21336 4.92735384328564e-01 21384 21360 3.51355052713264e+00 21384 21408 3.53687360286311e+00 21384 21432 4.98566153261183e-01 21384 21744 3.52882545366849e-01 21384 21768 2.58960730429136e+00 21384 21792 5.52408794703359e+00 21384 21816 3.01366476430753e+00 21384 21840 4.58896910370893e-01 21385 21385 1.00000000000000e+00 21386 21386 1.00000000000000e+00 21387 21387 1.00000000000000e+00 21388 21388 1.00000000000000e+00 21389 21389 1.00000000000000e+00 21390 21390 1.00000000000000e+00 21391 21391 1.00000000000000e+00 21392 21392 1.00000000000000e+00 21393 21393 1.00000000000000e+00 21394 21394 1.00000000000000e+00 21395 21395 1.00000000000000e+00 21396 21396 1.00000000000000e+00 21397 21397 1.00000000000000e+00 21398 21398 1.00000000000000e+00 21399 21399 1.00000000000000e+00 21400 21400 1.00000000000000e+00 21401 21401 1.00000000000000e+00 21402 21402 1.00000000000000e+00 21403 21403 1.00000000000000e+00 21404 21404 1.00000000000000e+00 21405 21405 1.00000000000000e+00 21406 21406 1.00000000000000e+00 21407 21407 1.00000000000000e+00 21408 9861 -2.38387544049828e-06 21408 9885 -2.67245997549214e-02 21408 9909 -7.02222855708155e-02 21408 9933 -9.62297346308592e-03 21408 9957 -3.40300235706000e-09 21408 10461 -2.25678303861431e-02 21408 10485 -8.00085278224114e-01 21408 10509 -2.34143120142450e+00 21408 10533 -9.36190402441622e-01 21408 10557 -3.00750972078268e-02 21408 10581 -1.82286164144400e-08 21408 11061 -1.97918336106535e-01 21408 11085 -5.46128485173979e+00 21408 11109 -1.17788140657174e+01 21408 11133 -2.99889266328815e+00 21408 11157 -1.24457816678196e-01 21408 11181 -2.68148023391800e-08 21408 11661 -2.00238148159737e-02 21408 11685 -2.79768642905928e+00 21408 11709 -8.81234700362130e+00 21408 11733 -1.99097178969356e+00 21408 11757 -3.30507753107737e-02 21408 12285 -1.50043593642075e-06 21408 12309 -6.68357069655338e-02 21408 12333 -8.67773264820860e-02 21408 12357 -9.97392066839205e-05 21408 21408 9.81721687035799e+00 21408 20544 2.59704847090978e-02 21408 20568 2.02269330121860e-01 21408 20592 4.47226004500361e-01 21408 20616 2.09211209883015e-01 21408 20640 2.77059546493864e-02 21408 20952 1.64573973805675e-01 21408 20976 1.33129786065530e+00 21408 21000 3.04811342980975e+00 21408 21024 1.43912834252732e+00 21408 21048 1.91531594273680e-01 21408 21360 3.85652247454584e-01 21408 21384 3.53687360286311e+00 21408 21432 3.81228929594189e+00 21408 21456 4.54506170724276e-01 21408 21768 2.94519280705989e-01 21408 21792 3.01366476430754e+00 21408 21816 7.92551584905714e+00 21408 21840 2.99017165115092e+00 21408 21864 2.88646002416835e-01 21409 21409 1.00000000000000e+00 21410 21410 1.00000000000000e+00 21411 21411 1.00000000000000e+00 21412 21412 1.00000000000000e+00 21413 21413 1.00000000000000e+00 21414 21414 1.00000000000000e+00 21415 21415 1.00000000000000e+00 21416 21416 1.00000000000000e+00 21417 21417 1.00000000000000e+00 21418 21418 1.00000000000000e+00 21419 21419 1.00000000000000e+00 21420 21420 1.00000000000000e+00 21421 21421 1.00000000000000e+00 21422 21422 1.00000000000000e+00 21423 21423 1.00000000000000e+00 21424 21424 1.00000000000000e+00 21425 21425 1.00000000000000e+00 21426 21426 1.00000000000000e+00 21427 21427 1.00000000000000e+00 21428 21428 1.00000000000000e+00 21429 21429 1.00000000000000e+00 21430 21430 1.00000000000000e+00 21431 21431 1.00000000000000e+00 21432 9885 -2.56465629442638e-05 21432 9909 -4.76276778342330e-03 21432 9933 -2.05883233787835e-03 21432 9957 -3.15286122116000e-09 21432 10485 -3.21841845409035e-02 21432 10509 -5.39531734989198e-01 21432 10533 -8.76028072878844e-01 21432 10557 -1.38745469119407e-01 21432 10581 -6.16935639697773e-04 21432 11061 -2.00170805911756e-05 21432 11085 -8.34970990283484e-01 21432 11109 -5.66644235563066e+00 21432 11133 -6.68777816209343e+00 21432 11157 -1.10467050991725e+00 21432 11181 -1.94860308560985e-02 21432 11661 -1.35540959531512e-05 21432 11685 -6.70418245275547e-01 21432 11709 -8.06189223988961e+00 21432 11733 -9.03319033806789e+00 21432 11757 -1.10367230428958e+00 21432 11781 -6.78156064318154e-03 21432 12285 -1.27580809196157e-06 21432 12309 -3.07481855106406e-01 21432 12333 -1.30109975792000e+00 21432 12357 -2.52264035490338e-01 21432 12381 -1.32403957025805e-06 21432 21432 9.23470004433162e+00 21432 20568 2.45968478213673e-02 21432 20592 2.09211209883015e-01 21432 20616 4.99146479364050e-01 21432 20640 2.35841247207548e-01 21432 20664 3.12543571525006e-02 21432 20976 1.68250491358146e-01 21432 21000 1.43912834252732e+00 21432 21024 3.42083700730084e+00 21432 21048 1.51845040734971e+00 21432 21072 1.88081007563742e-01 21432 21384 4.98566153261183e-01 21432 21408 3.81228929594189e+00 21432 21456 3.67416532082428e+00 21432 21480 4.64035159481780e-01 21432 21792 4.58896910370893e-01 21432 21816 2.99017165115092e+00 21432 21840 5.50134950102266e+00 21432 21864 2.85105021759688e+00 21432 21888 4.24116551982383e-01 21433 21433 1.00000000000000e+00 21434 21434 1.00000000000000e+00 21435 21435 1.00000000000000e+00 21436 21436 1.00000000000000e+00 21437 21437 1.00000000000000e+00 21438 21438 1.00000000000000e+00 21439 21439 1.00000000000000e+00 21440 21440 1.00000000000000e+00 21441 21441 1.00000000000000e+00 21442 21442 1.00000000000000e+00 21443 21443 1.00000000000000e+00 21444 21444 1.00000000000000e+00 21445 21445 1.00000000000000e+00 21446 21446 1.00000000000000e+00 21447 21447 1.00000000000000e+00 21448 21448 1.00000000000000e+00 21449 21449 1.00000000000000e+00 21450 21450 1.00000000000000e+00 21451 21451 1.00000000000000e+00 21452 21452 1.00000000000000e+00 21453 21453 1.00000000000000e+00 21454 21454 1.00000000000000e+00 21455 21455 1.00000000000000e+00 21456 9909 -5.59793347357133e-06 21456 9933 -2.30368090416432e-05 21456 9957 -6.13896168510000e-10 21456 10509 -3.12514410067282e-02 21456 10533 -2.34219438433417e-01 21456 10557 -1.44954846645998e-01 21456 10581 -2.80648045101112e-03 21456 11085 -6.21525660309246e-03 21456 11109 -8.37895207133347e-01 21456 11133 -3.72278010225788e+00 21456 11157 -2.84276194806433e+00 21456 11181 -2.02228954966414e-01 21456 11205 -4.01571096527292e-04 21456 11685 -1.86238563130767e-02 21456 11709 -2.68385561620031e+00 21456 11733 -1.32830061635964e+01 21456 11757 -5.66071931761937e+00 21456 11781 -3.64114134599640e-01 21456 11805 -3.67982902529346e-04 21456 12285 -2.40186428761700e-07 21456 12309 -3.49593855422128e-01 21456 12333 -4.43068966198744e+00 21456 12357 -2.45302092463163e+00 21456 12381 -1.04039244321100e-01 21456 12933 -5.02259234512167e-04 21456 12957 -1.39520399675073e-02 21456 12981 -1.19559189827232e-03 21456 21456 9.25883673882573e+00 21456 20592 2.77059546493864e-02 21456 20616 2.35841247207548e-01 21456 20640 5.51518488927802e-01 21456 20664 2.19988707963628e-01 21456 20688 2.37428198384065e-02 21456 21000 1.91531594273680e-01 21456 21024 1.51845040734970e+00 21456 21048 3.35768784025785e+00 21456 21072 1.37976453011191e+00 21456 21096 1.56860124964233e-01 21456 21408 4.54506170724276e-01 21456 21432 3.67416532082428e+00 21456 21480 3.37521270349837e+00 21456 21504 3.79768016392801e-01 21456 21816 2.88646002416835e-01 21456 21840 2.85105021759687e+00 21456 21864 7.35333930796951e+00 21456 21888 2.81178010326768e+00 21456 21912 2.78828473834536e-01 21457 21457 1.00000000000000e+00 21458 21458 1.00000000000000e+00 21459 21459 1.00000000000000e+00 21460 21460 1.00000000000000e+00 21461 21461 1.00000000000000e+00 21462 21462 1.00000000000000e+00 21463 21463 1.00000000000000e+00 21464 21464 1.00000000000000e+00 21465 21465 1.00000000000000e+00 21466 21466 1.00000000000000e+00 21467 21467 1.00000000000000e+00 21468 21468 1.00000000000000e+00 21469 21469 1.00000000000000e+00 21470 21470 1.00000000000000e+00 21471 21471 1.00000000000000e+00 21472 21472 1.00000000000000e+00 21473 21473 1.00000000000000e+00 21474 21474 1.00000000000000e+00 21475 21475 1.00000000000000e+00 21476 21476 1.00000000000000e+00 21477 21477 1.00000000000000e+00 21478 21478 1.00000000000000e+00 21479 21479 1.00000000000000e+00 21480 10509 -1.26266347100440e-07 21480 10533 -1.65362016833945e-02 21480 10557 -3.39913024247160e-02 21480 10581 -1.97299421219411e-03 21480 11109 -1.53507695888783e-02 21480 11133 -6.38508544939168e-01 21480 11157 -1.79211733908782e+00 21480 11181 -9.48787970187869e-01 21480 11205 -1.88624550732948e-02 21480 11709 -2.98294215297041e-01 21480 11733 -4.72007968522777e+00 21480 11757 -1.13396010740800e+01 21480 11781 -5.11981516898445e+00 21480 11805 -2.32563123210195e-02 21480 12309 -7.30006766659733e-02 21480 12333 -3.05351420152970e+00 21480 12357 -1.07635608328286e+01 21480 12381 -2.63427490152779e+00 21480 12933 -2.70507787134015e-03 21480 12957 -1.61524079405973e-01 21480 12981 -2.76749461282615e-02 21480 21480 1.02261200668360e+01 21480 20616 3.12543571525006e-02 21480 20640 2.19988707963628e-01 21480 20664 5.62807553267019e-01 21480 20688 3.98307436753654e-01 21480 21024 1.88081007563742e-01 21480 21048 1.37976453011192e+00 21480 21072 3.89559657381350e+00 21480 21096 3.02294763350087e+00 21480 21432 4.64035159481780e-01 21480 21456 3.37521270349837e+00 21480 21504 6.89066535570968e+00 21480 21840 4.24116551982383e-01 21480 21864 2.81178010326768e+00 21480 21888 5.81606050192004e+00 21480 21912 2.97669063250826e+00 21481 21481 1.00000000000000e+00 21482 21482 1.00000000000000e+00 21483 21483 1.00000000000000e+00 21484 21484 1.00000000000000e+00 21485 21485 1.00000000000000e+00 21486 21486 1.00000000000000e+00 21487 21487 1.00000000000000e+00 21488 21488 1.00000000000000e+00 21489 21489 1.00000000000000e+00 21490 21490 1.00000000000000e+00 21491 21491 1.00000000000000e+00 21492 21492 1.00000000000000e+00 21493 21493 1.00000000000000e+00 21494 21494 1.00000000000000e+00 21495 21495 1.00000000000000e+00 21496 21496 1.00000000000000e+00 21497 21497 1.00000000000000e+00 21498 21498 1.00000000000000e+00 21499 21499 1.00000000000000e+00 21500 21500 1.00000000000000e+00 21501 21501 1.00000000000000e+00 21502 21502 1.00000000000000e+00 21503 21503 1.00000000000000e+00 21504 10533 -4.99658735013291e-06 21504 10557 -1.21583139608431e-03 21504 10581 -3.39183723660238e-04 21504 11133 -1.75666651323277e-02 21504 11157 -4.70523537717542e-01 21504 11181 -9.88607456833578e-01 21504 11205 -3.49139124708985e-02 21504 11709 -2.91886673369895e-05 21504 11733 -4.98997919341157e-01 21504 11757 -8.54372163120845e+00 21504 11781 -7.86715197249411e+00 21504 11805 -4.39367443243335e-02 21504 12309 -3.45539493907805e-05 21504 12333 -6.43859071509918e-01 21504 12357 -1.09051654129362e+01 21504 12381 -4.54030951783670e+00 21504 12933 -1.89434110109513e-03 21504 12957 -2.25383879039395e-01 21504 12981 -4.69807489686166e-02 21504 21504 1.21229545966697e+01 21504 20640 2.37428198384065e-02 21504 20664 3.98307436753654e-01 21504 20688 6.30415134638462e-01 21504 21048 1.56860124964233e-01 21504 21072 3.02294763350087e+00 21504 21096 4.94787439225209e+00 21504 21456 3.79768016392801e-01 21504 21480 6.89066535570968e+00 21504 21864 2.78828473834536e-01 21504 21888 2.97669063250825e+00 21504 21912 4.00158194817475e+00 21505 21505 1.00000000000000e+00 21506 21506 1.00000000000000e+00 21507 21507 1.00000000000000e+00 21508 21508 1.00000000000000e+00 21509 21509 1.00000000000000e+00 21510 21510 1.00000000000000e+00 21511 21511 1.00000000000000e+00 21512 21512 1.00000000000000e+00 21513 21513 1.00000000000000e+00 21514 21514 1.00000000000000e+00 21515 21515 1.00000000000000e+00 21516 21516 1.00000000000000e+00 21517 21517 1.00000000000000e+00 21518 21518 1.00000000000000e+00 21519 21519 1.00000000000000e+00 21520 21520 1.00000000000000e+00 21521 21521 1.00000000000000e+00 21522 21522 1.00000000000000e+00 21523 21523 1.00000000000000e+00 21524 21524 1.00000000000000e+00 21525 21525 1.00000000000000e+00 21526 21526 1.00000000000000e+00 21527 21527 1.00000000000000e+00 21528 7317 -6.75149496405286e-05 21528 7341 -5.68909072862892e-05 21528 7893 -3.44015283048548e-03 21528 7917 -9.93950143461296e-01 21528 7941 -5.40869660850665e-01 21528 7965 -2.63702574884965e-03 21528 8493 -3.31168804452563e-01 21528 8517 -8.01986008310673e+00 21528 8541 -2.77159021881339e+00 21528 8565 -2.04644255858369e-02 21528 9093 -6.22474803362327e-02 21528 9117 -1.86912480621186e+00 21528 9141 -1.27202318270223e+00 21528 9165 -7.07189490284724e-03 21528 21528 4.75728965237751e+00 21528 20712 4.49351467850448e-01 21528 20736 2.78828473834499e-01 21528 20760 1.54722114026500e-02 21528 21120 3.45137496366532e+00 21528 21144 2.97669063250816e+00 21528 21168 3.57429471621569e-01 21528 21552 4.00158194817481e+00 21528 21576 6.06553463424587e-01 21529 21529 1.00000000000000e+00 21530 21530 1.00000000000000e+00 21531 21531 1.00000000000000e+00 21532 21532 1.00000000000000e+00 21533 21533 1.00000000000000e+00 21534 21534 1.00000000000000e+00 21535 21535 1.00000000000000e+00 21536 21536 1.00000000000000e+00 21537 21537 1.00000000000000e+00 21538 21538 1.00000000000000e+00 21539 21539 1.00000000000000e+00 21540 21540 1.00000000000000e+00 21541 21541 1.00000000000000e+00 21542 21542 1.00000000000000e+00 21543 21543 1.00000000000000e+00 21544 21544 1.00000000000000e+00 21545 21545 1.00000000000000e+00 21546 21546 1.00000000000000e+00 21547 21547 1.00000000000000e+00 21548 21548 1.00000000000000e+00 21549 21549 1.00000000000000e+00 21550 21550 1.00000000000000e+00 21551 21551 1.00000000000000e+00 21552 7317 -3.45539493907758e-05 21552 7341 -2.91886673369855e-05 21552 7893 -1.89434110109506e-03 21552 7917 -6.43859071509853e-01 21552 7941 -4.98997919341096e-01 21552 7965 -1.75666651323252e-02 21552 7989 -4.99658735013202e-06 21552 8493 -2.25383879039395e-01 21552 8517 -1.09051654129363e+01 21552 8541 -8.54372163120864e+00 21552 8565 -4.70523537717527e-01 21552 8589 -1.21583139608409e-03 21552 9093 -4.69807489686170e-02 21552 9117 -4.54030951783689e+00 21552 9141 -7.86715197249476e+00 21552 9165 -9.88607456833696e-01 21552 9189 -3.39183723660178e-04 21552 9741 -4.39367443243407e-02 21552 9765 -3.49139124709041e-02 21552 21552 1.21229545966702e+01 21552 20712 2.78828473834499e-01 21552 20736 3.79768016392752e-01 21552 20760 1.56860124964209e-01 21552 20784 2.37428198384023e-02 21552 21120 2.97669063250815e+00 21552 21144 6.89066535570974e+00 21552 21168 3.02294763350103e+00 21552 21192 3.98307436753687e-01 21552 21528 4.00158194817481e+00 21552 21576 4.94787439225258e+00 21552 21600 6.30415134638558e-01 21553 21553 1.00000000000000e+00 21554 21554 1.00000000000000e+00 21555 21555 1.00000000000000e+00 21556 21556 1.00000000000000e+00 21557 21557 1.00000000000000e+00 21558 21558 1.00000000000000e+00 21559 21559 1.00000000000000e+00 21560 21560 1.00000000000000e+00 21561 21561 1.00000000000000e+00 21562 21562 1.00000000000000e+00 21563 21563 1.00000000000000e+00 21564 21564 1.00000000000000e+00 21565 21565 1.00000000000000e+00 21566 21566 1.00000000000000e+00 21567 21567 1.00000000000000e+00 21568 21568 1.00000000000000e+00 21569 21569 1.00000000000000e+00 21570 21570 1.00000000000000e+00 21571 21571 1.00000000000000e+00 21572 21572 1.00000000000000e+00 21573 21573 1.00000000000000e+00 21574 21574 1.00000000000000e+00 21575 21575 1.00000000000000e+00 21576 7317 -2.27564163003280e-07 21576 7341 -2.12346769668840e-07 21576 7893 -4.97899102435199e-05 21576 7917 -4.22648233034785e-02 21576 7941 -1.11494712416162e-01 21576 7965 -3.10803560498739e-02 21576 7989 -2.42166638779728e-05 21576 8493 -1.70855648037467e-02 21576 8517 -2.47118942806330e+00 21576 8541 -7.14013593441141e+00 21576 8565 -1.79324213756291e+00 21576 8589 -3.17314047065673e-02 21576 8613 -1.54286544133720e-07 21576 9093 -4.53057394300020e-03 21576 9117 -1.81449700885241e+00 21576 9141 -1.47080981867763e+01 21576 9165 -6.32291240333007e+00 21576 9189 -1.65636733875931e-01 21576 9213 -1.33099563758210e-07 21576 9741 -2.89759613634646e-01 21576 9765 -7.35786296464277e-01 21576 9789 -4.88682978709450e-02 21576 21576 1.21577171568331e+01 21576 20712 1.54722114026500e-02 21576 20736 1.56860124964209e-01 21576 20760 4.10608961742374e-01 21576 20784 1.55977811054758e-01 21576 20808 1.52516329252872e-02 21576 21120 3.57429471621569e-01 21576 21144 3.02294763350103e+00 21576 21168 7.01598994451490e+00 21576 21192 2.73579568635196e+00 21576 21216 2.85641484834303e-01 21576 21528 6.06553463424587e-01 21576 21552 4.94787439225258e+00 21576 21600 4.37974669532061e+00 21576 21624 4.64521539191595e-01 21577 21577 1.00000000000000e+00 21578 21578 1.00000000000000e+00 21579 21579 1.00000000000000e+00 21580 21580 1.00000000000000e+00 21581 21581 1.00000000000000e+00 21582 21582 1.00000000000000e+00 21583 21583 1.00000000000000e+00 21584 21584 1.00000000000000e+00 21585 21585 1.00000000000000e+00 21586 21586 1.00000000000000e+00 21587 21587 1.00000000000000e+00 21588 21588 1.00000000000000e+00 21589 21589 1.00000000000000e+00 21590 21590 1.00000000000000e+00 21591 21591 1.00000000000000e+00 21592 21592 1.00000000000000e+00 21593 21593 1.00000000000000e+00 21594 21594 1.00000000000000e+00 21595 21595 1.00000000000000e+00 21596 21596 1.00000000000000e+00 21597 21597 1.00000000000000e+00 21598 21598 1.00000000000000e+00 21599 21599 1.00000000000000e+00 21600 7917 -8.02216756130946e-05 21600 7941 -1.25654930568489e-02 21600 7965 -8.02848167035946e-03 21600 7989 -2.19178452599109e-05 21600 8517 -1.34917509756813e-01 21600 8541 -1.63815643084327e+00 21600 8565 -1.28138291463894e+00 21600 8589 -1.43634132019868e-01 21600 8613 -1.22365447471562e-03 21600 9117 -2.11153262788652e-01 21600 9141 -6.70591694751842e+00 21600 9165 -1.31344205713102e+01 21600 9189 -2.36081159036061e+00 21600 9213 -1.84717084370415e-02 21600 9741 -5.14197856185756e-01 21600 9765 -4.44043579606702e+00 21600 9789 -2.28074346771659e+00 21600 9813 -9.96711146675259e-03 21600 10365 -1.67620106534640e-04 21600 10389 -1.60490305820058e-03 21600 10413 -3.45778598212090e-07 21600 21600 9.92442391352002e+00 21600 20736 2.37428198384023e-02 21600 20760 1.55977811054758e-01 21600 20784 2.84738593169655e-01 21600 20808 1.28885117807778e-01 21600 20832 1.69696465266574e-02 21600 21144 3.98307436753687e-01 21600 21168 2.73579568635197e+00 21600 21192 5.45879703285382e+00 21600 21216 3.10346929434230e+00 21600 21240 4.90225838751271e-01 21600 21552 6.30415134638558e-01 21600 21576 4.37974669532061e+00 21600 21624 5.30474276403014e+00 21600 21648 8.61664151815941e-01 21601 21601 1.00000000000000e+00 21602 21602 1.00000000000000e+00 21603 21603 1.00000000000000e+00 21604 21604 1.00000000000000e+00 21605 21605 1.00000000000000e+00 21606 21606 1.00000000000000e+00 21607 21607 1.00000000000000e+00 21608 21608 1.00000000000000e+00 21609 21609 1.00000000000000e+00 21610 21610 1.00000000000000e+00 21611 21611 1.00000000000000e+00 21612 21612 1.00000000000000e+00 21613 21613 1.00000000000000e+00 21614 21614 1.00000000000000e+00 21615 21615 1.00000000000000e+00 21616 21616 1.00000000000000e+00 21617 21617 1.00000000000000e+00 21618 21618 1.00000000000000e+00 21619 21619 1.00000000000000e+00 21620 21620 1.00000000000000e+00 21621 21621 1.00000000000000e+00 21622 21622 1.00000000000000e+00 21623 21623 1.00000000000000e+00 21624 7941 -3.47011381079179e-05 21624 7965 -2.44065315422982e-04 21624 7989 -4.23031447744472e-06 21624 8541 -7.14390121570574e-02 21624 8565 -3.00034719279317e-01 21624 8589 -1.70767136446979e-01 21624 8613 -6.67400920711631e-03 21624 8637 -1.98860187077000e-09 21624 9141 -9.84383496535981e-01 21624 9165 -1.16470936735668e+01 21624 9189 -7.62575536054923e+00 21624 9213 -2.77611194666461e-01 21624 9237 -6.75108151057770e-04 21624 9741 -1.70854902386419e-01 21624 9765 -8.88650814138471e+00 21624 9789 -1.09254701506266e+01 21624 9813 -7.26009893525002e-01 21624 9837 -3.57181806112203e-04 21624 10365 -1.19673275115658e-03 21624 10389 -1.32155033546540e-01 21624 10413 -6.40768823076009e-02 21624 21624 1.56934120813326e+01 21624 20760 1.52516329252872e-02 21624 20784 1.28885117807778e-01 21624 20808 3.07723361719110e-01 21624 20832 1.51708123575846e-01 21624 20856 2.09573843673041e-02 21624 21168 2.85641484834303e-01 21624 21192 3.10346929434230e+00 21624 21216 8.42373780668319e+00 21624 21240 3.13883496231919e+00 21624 21264 2.94482901828523e-01 21624 21576 4.64521539191595e-01 21624 21600 5.30474276403014e+00 21624 21648 5.21571305960751e+00 21624 21672 4.42264113085918e-01 21625 21625 1.00000000000000e+00 21626 21626 1.00000000000000e+00 21627 21627 1.00000000000000e+00 21628 21628 1.00000000000000e+00 21629 21629 1.00000000000000e+00 21630 21630 1.00000000000000e+00 21631 21631 1.00000000000000e+00 21632 21632 1.00000000000000e+00 21633 21633 1.00000000000000e+00 21634 21634 1.00000000000000e+00 21635 21635 1.00000000000000e+00 21636 21636 1.00000000000000e+00 21637 21637 1.00000000000000e+00 21638 21638 1.00000000000000e+00 21639 21639 1.00000000000000e+00 21640 21640 1.00000000000000e+00 21641 21641 1.00000000000000e+00 21642 21642 1.00000000000000e+00 21643 21643 1.00000000000000e+00 21644 21644 1.00000000000000e+00 21645 21645 1.00000000000000e+00 21646 21646 1.00000000000000e+00 21647 21647 1.00000000000000e+00 21648 8541 -7.22506791617730e-06 21648 8565 -2.05692093069996e-02 21648 8589 -5.14093378669872e-02 21648 8613 -8.36244219545040e-03 21648 8637 -8.94809260414000e-09 21648 9141 -2.65905112531993e-02 21648 9165 -2.55228025707658e+00 21648 9189 -4.33414068707059e+00 21648 9213 -9.47053835614475e-01 21648 9237 -1.67149292436570e-02 21648 9261 -1.92421531558400e-08 21648 9741 -1.42105665122840e-02 21648 9765 -2.84652083002161e+00 21648 9789 -1.34003793834157e+01 21648 9813 -5.61186521115565e+00 21648 9837 -1.56683939199441e-01 21648 9861 -2.82679919691200e-08 21648 10365 -2.27267444385346e-03 21648 10389 -8.37008468300407e-01 21648 10413 -1.54591739054227e+00 21648 10437 -8.48984408304527e-02 21648 21648 9.57031379276926e+00 21648 20784 1.69696465266574e-02 21648 20808 1.51708123575846e-01 21648 20832 3.65880666997866e-01 21648 20856 1.38201019846589e-01 21648 20880 1.35928705943431e-02 21648 21192 4.90225838751271e-01 21648 21216 3.13883496231922e+00 21648 21240 5.56573923087704e+00 21648 21264 2.63307945879099e+00 21648 21288 3.63786962869213e-01 21648 21600 8.61664151815941e-01 21648 21624 5.21571305960751e+00 21648 21672 4.29875177865584e+00 21648 21696 6.32423831578024e-01 21649 21649 1.00000000000000e+00 21650 21650 1.00000000000000e+00 21651 21651 1.00000000000000e+00 21652 21652 1.00000000000000e+00 21653 21653 1.00000000000000e+00 21654 21654 1.00000000000000e+00 21655 21655 1.00000000000000e+00 21656 21656 1.00000000000000e+00 21657 21657 1.00000000000000e+00 21658 21658 1.00000000000000e+00 21659 21659 1.00000000000000e+00 21660 21660 1.00000000000000e+00 21661 21661 1.00000000000000e+00 21662 21662 1.00000000000000e+00 21663 21663 1.00000000000000e+00 21664 21664 1.00000000000000e+00 21665 21665 1.00000000000000e+00 21666 21666 1.00000000000000e+00 21667 21667 1.00000000000000e+00 21668 21668 1.00000000000000e+00 21669 21669 1.00000000000000e+00 21670 21670 1.00000000000000e+00 21671 21671 1.00000000000000e+00 21672 8565 -1.96369108521824e-05 21672 8589 -4.12660314887453e-03 21672 8613 -1.83203537140742e-03 21672 8637 -5.96334235505000e-09 21672 9165 -6.91058902851681e-02 21672 9189 -8.02167487971877e-01 21672 9213 -6.68819689456887e-01 21672 9237 -7.54624655077917e-02 21672 9261 -4.24068021415266e-04 21672 9765 -2.06381545340390e-01 21672 9789 -7.25120728299913e+00 21672 9813 -1.36812044076590e+01 21672 9837 -1.71003083767370e+00 21672 9861 -1.46458338405462e-02 21672 10365 -5.26432474004665e-04 21672 10389 -1.47814744601904e+00 21672 10413 -7.60221651864072e+00 21672 10437 -2.49861912557894e+00 21672 10461 -9.58767802584526e-03 21672 11013 -5.76787102641979e-03 21672 11037 -2.26063108285779e-02 21672 11061 -8.84884528789634e-06 21672 21672 1.23161012279493e+01 21672 20808 2.09573843673041e-02 21672 20832 1.38201019846589e-01 21672 20856 2.57920772334751e-01 21672 20880 1.32281316209201e-01 21672 20904 1.94774584579572e-02 21672 21216 2.94482901828523e-01 21672 21240 2.63307945879095e+00 21672 21264 6.56077331714630e+00 21672 21288 3.23794388911829e+00 21672 21312 4.45699009410358e-01 21672 21624 4.42264113085918e-01 21672 21648 4.29875177865584e+00 21672 21696 5.54991856477216e+00 21672 21720 7.55055809615015e-01 21673 21673 1.00000000000000e+00 21674 21674 1.00000000000000e+00 21675 21675 1.00000000000000e+00 21676 21676 1.00000000000000e+00 21677 21677 1.00000000000000e+00 21678 21678 1.00000000000000e+00 21679 21679 1.00000000000000e+00 21680 21680 1.00000000000000e+00 21681 21681 1.00000000000000e+00 21682 21682 1.00000000000000e+00 21683 21683 1.00000000000000e+00 21684 21684 1.00000000000000e+00 21685 21685 1.00000000000000e+00 21686 21686 1.00000000000000e+00 21687 21687 1.00000000000000e+00 21688 21688 1.00000000000000e+00 21689 21689 1.00000000000000e+00 21690 21690 1.00000000000000e+00 21691 21691 1.00000000000000e+00 21692 21692 1.00000000000000e+00 21693 21693 1.00000000000000e+00 21694 21694 1.00000000000000e+00 21695 21695 1.00000000000000e+00 21696 8589 -2.87059089138052e-06 21696 8613 -1.25824412478920e-05 21696 8637 -9.93685121070000e-10 21696 9189 -3.85260548717765e-02 21696 9213 -1.55218139672086e-01 21696 9237 -8.98711480908170e-02 21696 9261 -1.97210171975279e-03 21696 9765 -3.09907564292870e-07 21696 9789 -1.26735440242570e+00 21696 9813 -9.15748002497590e+00 21696 9837 -4.85138247369471e+00 21696 9861 -1.68324535039274e-01 21696 9885 -3.37059951672555e-04 21696 10365 -4.50372466621900e-08 21696 10389 -4.22719899012753e-01 21696 10413 -1.10499459964702e+01 21696 10437 -1.11286651487525e+01 21696 10461 -6.14318709256905e-01 21696 10485 -3.08469849872088e-04 21696 11013 -3.06995764510268e-02 21696 11037 -3.91858603018202e-01 21696 11061 -1.09415256228253e-01 21696 21696 1.41192821628463e+01 21696 20832 1.35928705943431e-02 21696 20856 1.32281316209201e-01 21696 20880 3.43022145245696e-01 21696 20904 1.49069591127983e-01 21696 20928 1.77899393240386e-02 21696 21240 3.63786962869213e-01 21696 21264 3.23794388911829e+00 21696 21288 7.76021858978311e+00 21696 21312 2.84378594303404e+00 21696 21336 2.65247476348150e-01 21696 21648 6.32423831578024e-01 21696 21672 5.54991856477216e+00 21696 21720 4.64408474817218e+00 21696 21744 4.05965377428030e-01 21697 21697 1.00000000000000e+00 21698 21698 1.00000000000000e+00 21699 21699 1.00000000000000e+00 21700 21700 1.00000000000000e+00 21701 21701 1.00000000000000e+00 21702 21702 1.00000000000000e+00 21703 21703 1.00000000000000e+00 21704 21704 1.00000000000000e+00 21705 21705 1.00000000000000e+00 21706 21706 1.00000000000000e+00 21707 21707 1.00000000000000e+00 21708 21708 1.00000000000000e+00 21709 21709 1.00000000000000e+00 21710 21710 1.00000000000000e+00 21711 21711 1.00000000000000e+00 21712 21712 1.00000000000000e+00 21713 21713 1.00000000000000e+00 21714 21714 1.00000000000000e+00 21715 21715 1.00000000000000e+00 21716 21716 1.00000000000000e+00 21717 21717 1.00000000000000e+00 21718 21718 1.00000000000000e+00 21719 21719 1.00000000000000e+00 21720 9189 -1.63349069221820e-07 21720 9213 -1.03974540170888e-02 21720 9237 -2.24860482368028e-02 21720 9261 -1.52847645058494e-03 21720 9789 -2.35820716352034e-02 21720 9813 -1.71458500707124e+00 21720 9837 -2.47152522189269e+00 21720 9861 -5.13545222136799e-01 21720 9885 -9.34229118965601e-03 21720 9909 -1.07073187650000e-09 21720 10389 -2.25645047563803e-02 21720 10413 -3.34611990479093e+00 21720 10437 -1.31480554177430e+01 21720 10461 -5.21913909453384e+00 21720 10485 -1.37927352900208e-01 21720 10509 -2.84904636177000e-09 21720 11013 -3.62833187129939e-02 21720 11037 -1.95058358179340e+00 21720 11061 -2.73110193042546e+00 21720 11085 -1.24451148894911e-01 21720 11661 -4.04614909029319e-06 21720 11685 -1.40028719608415e-06 21720 21720 9.05430117290759e+00 21720 20856 1.94774584579572e-02 21720 20880 1.49069591127983e-01 21720 20904 3.18619044738265e-01 21720 20928 1.29169985678914e-01 21720 20952 1.45025570956898e-02 21720 21264 4.45699009410358e-01 21720 21288 2.84378594303404e+00 21720 21312 5.14231724303775e+00 21720 21336 2.87162435362045e+00 21720 21360 4.52658612056961e-01 21720 21672 7.55055809615015e-01 21720 21696 4.64408474817218e+00 21720 21744 4.83905880748849e+00 21720 21768 8.03799324444094e-01 21721 21721 1.00000000000000e+00 21722 21722 1.00000000000000e+00 21723 21723 1.00000000000000e+00 21724 21724 1.00000000000000e+00 21725 21725 1.00000000000000e+00 21726 21726 1.00000000000000e+00 21727 21727 1.00000000000000e+00 21728 21728 1.00000000000000e+00 21729 21729 1.00000000000000e+00 21730 21730 1.00000000000000e+00 21731 21731 1.00000000000000e+00 21732 21732 1.00000000000000e+00 21733 21733 1.00000000000000e+00 21734 21734 1.00000000000000e+00 21735 21735 1.00000000000000e+00 21736 21736 1.00000000000000e+00 21737 21737 1.00000000000000e+00 21738 21738 1.00000000000000e+00 21739 21739 1.00000000000000e+00 21740 21740 1.00000000000000e+00 21741 21741 1.00000000000000e+00 21742 21742 1.00000000000000e+00 21743 21743 1.00000000000000e+00 21744 9213 -3.26042166295247e-06 21744 9237 -9.39185922044208e-04 21744 9261 -2.76167595293299e-04 21744 9813 -3.72128208243914e-02 21744 9837 -4.08749207963319e-01 21744 9861 -3.54401329386676e-01 21744 9885 -4.00258339285672e-02 21744 9909 -7.22152185415601e-05 21744 10413 -2.41641731088438e-01 21744 10437 -7.85719513899028e+00 21744 10461 -1.30472690748128e+01 21744 10485 -1.14051294456307e+00 21744 10509 -1.05376172650655e-02 21744 11013 -7.64040556608129e-03 21744 11037 -3.21770864406448e+00 21744 11061 -1.14939187741039e+01 21744 11085 -2.26850405724528e+00 21744 11109 -8.66206699074882e-03 21744 11661 -3.37372744046870e-02 21744 11685 -7.35208925300235e-02 21744 11709 -4.16008843137206e-05 21744 21744 1.48273894024811e+01 21744 20880 1.77899393240386e-02 21744 20904 1.29169985678914e-01 21744 20928 2.70563746681661e-01 21744 20952 1.40941803689104e-01 21744 20976 2.07328938265863e-02 21744 21288 2.65247476348150e-01 21744 21312 2.87162435362045e+00 21744 21336 7.86066781462640e+00 21744 21360 3.22216462969525e+00 21744 21384 3.52882545366849e-01 21744 21696 4.05965377428030e-01 21744 21720 4.83905880748849e+00 21744 21768 5.45773663356675e+00 21744 21792 5.60634833947594e-01 21745 21745 1.00000000000000e+00 21746 21746 1.00000000000000e+00 21747 21747 1.00000000000000e+00 21748 21748 1.00000000000000e+00 21749 21749 1.00000000000000e+00 21750 21750 1.00000000000000e+00 21751 21751 1.00000000000000e+00 21752 21752 1.00000000000000e+00 21753 21753 1.00000000000000e+00 21754 21754 1.00000000000000e+00 21755 21755 1.00000000000000e+00 21756 21756 1.00000000000000e+00 21757 21757 1.00000000000000e+00 21758 21758 1.00000000000000e+00 21759 21759 1.00000000000000e+00 21760 21760 1.00000000000000e+00 21761 21761 1.00000000000000e+00 21762 21762 1.00000000000000e+00 21763 21763 1.00000000000000e+00 21764 21764 1.00000000000000e+00 21765 21765 1.00000000000000e+00 21766 21766 1.00000000000000e+00 21767 21767 1.00000000000000e+00 21768 9237 -4.41669362790000e-09 21768 9261 -1.23322260600600e-08 21768 9837 -1.68082945346777e-02 21768 9861 -7.96440172054113e-02 21768 9885 -3.89639863280268e-02 21768 9909 -3.09682943183136e-04 21768 10413 -8.52313646765131e-06 21768 10437 -1.42258422170923e+00 21768 10461 -6.32062101669744e+00 21768 10485 -2.69515405120284e+00 21768 10509 -9.96338200064895e-02 21768 10533 -1.55188264107733e-04 21768 11013 -3.07830518340561e-06 21768 11037 -8.31443655203383e-01 21768 11061 -1.14588221436160e+01 21768 11085 -9.88947253249705e+00 21768 11109 -5.86323053563036e-01 21768 11133 -2.42406379375072e-04 21768 11661 -1.72731756794428e-01 21768 11685 -9.91396379203825e-01 21768 11709 -1.98570423981034e-01 21768 11733 -6.63024342517000e-09 21768 21768 1.12567841678213e+01 21768 20904 1.45025570956898e-02 21768 20928 1.40941803689104e-01 21768 20952 3.61401867063392e-01 21768 20976 1.43623610275629e-01 21768 21000 1.51730087423208e-02 21768 21312 4.52658612056961e-01 21768 21336 3.22216462969525e+00 21768 21360 6.39329861863257e+00 21768 21384 2.58960730429136e+00 21768 21408 2.94519280705989e-01 21768 21720 8.03799324444094e-01 21768 21744 5.45773663356675e+00 21768 21792 4.17384933665331e+00 21768 21816 4.82827500215733e-01 21769 21769 1.00000000000000e+00 21770 21770 1.00000000000000e+00 21771 21771 1.00000000000000e+00 21772 21772 1.00000000000000e+00 21773 21773 1.00000000000000e+00 21774 21774 1.00000000000000e+00 21775 21775 1.00000000000000e+00 21776 21776 1.00000000000000e+00 21777 21777 1.00000000000000e+00 21778 21778 1.00000000000000e+00 21779 21779 1.00000000000000e+00 21780 21780 1.00000000000000e+00 21781 21781 1.00000000000000e+00 21782 21782 1.00000000000000e+00 21783 21783 1.00000000000000e+00 21784 21784 1.00000000000000e+00 21785 21785 1.00000000000000e+00 21786 21786 1.00000000000000e+00 21787 21787 1.00000000000000e+00 21788 21788 1.00000000000000e+00 21789 21789 1.00000000000000e+00 21790 21790 1.00000000000000e+00 21791 21791 1.00000000000000e+00 21792 9837 -1.64223745000000e-12 21792 9861 -4.92885197545318e-03 21792 9885 -8.19121310477222e-03 21792 9909 -1.55563455594226e-04 21792 10437 -1.60538004493410e-02 21792 10461 -9.31015863958428e-01 21792 10485 -1.33921351264531e+00 21792 10509 -2.75221263027292e-01 21792 10533 -4.98947752019862e-03 21792 10557 -2.67275633000000e-12 21792 11037 -2.72999557635293e-02 21792 11061 -3.50736818545146e+00 21792 11085 -1.36483898526973e+01 21792 11109 -4.42153745514200e+00 21792 11133 -1.03422884076192e-01 21792 11157 -1.62243194400000e-11 21792 11661 -1.85121313218606e-01 21792 11685 -3.93265630313768e+00 21792 11709 -3.71267255159031e+00 21792 11733 -1.34062314544322e-01 21792 12285 -6.28923985187350e-07 21792 12309 -4.29215165363190e-03 21792 12333 -7.59934449608862e-04 21792 21792 1.00814082330139e+01 21792 20928 2.07328938265863e-02 21792 20952 1.43623610275629e-01 21792 20976 2.80966808721889e-01 21792 21000 1.30555135041960e-01 21792 21024 1.74657750181692e-02 21792 21336 3.52882545366849e-01 21792 21360 2.58960730429136e+00 21792 21384 5.52408794703359e+00 21792 21408 3.01366476430754e+00 21792 21432 4.58896910370893e-01 21792 21744 5.60634833947594e-01 21792 21768 4.17384933665331e+00 21792 21816 5.11344358332134e+00 21792 21840 7.95533395614602e-01 21793 21793 1.00000000000000e+00 21794 21794 1.00000000000000e+00 21795 21795 1.00000000000000e+00 21796 21796 1.00000000000000e+00 21797 21797 1.00000000000000e+00 21798 21798 1.00000000000000e+00 21799 21799 1.00000000000000e+00 21800 21800 1.00000000000000e+00 21801 21801 1.00000000000000e+00 21802 21802 1.00000000000000e+00 21803 21803 1.00000000000000e+00 21804 21804 1.00000000000000e+00 21805 21805 1.00000000000000e+00 21806 21806 1.00000000000000e+00 21807 21807 1.00000000000000e+00 21808 21808 1.00000000000000e+00 21809 21809 1.00000000000000e+00 21810 21810 1.00000000000000e+00 21811 21811 1.00000000000000e+00 21812 21812 1.00000000000000e+00 21813 21813 1.00000000000000e+00 21814 21814 1.00000000000000e+00 21815 21815 1.00000000000000e+00 21816 9861 -2.93151783220590e-07 21816 9885 -1.19661164935189e-04 21816 9909 -2.08381299950429e-05 21816 10461 -2.06081244686783e-02 21816 10485 -2.12057904827486e-01 21816 10509 -1.98215657855399e-01 21816 10533 -1.97720813716513e-02 21816 10557 -2.51866616999205e-06 21816 11061 -3.24429347867784e-01 21816 11085 -7.28706157576696e+00 21816 11109 -9.81224485046785e+00 21816 11133 -7.35724208401048e-01 21816 11157 -6.72695047920776e-03 21816 11661 -3.79506224606009e-02 21816 11685 -5.00898442642475e+00 21816 11709 -1.38577901086805e+01 21816 11733 -1.94760161133886e+00 21816 11757 -7.88146601817165e-03 21816 12285 -2.99407615582745e-06 21816 12309 -1.22992818690735e-01 21816 12333 -1.49586861259660e-01 21816 12357 -1.07822922226180e-04 21816 21816 1.46474152274498e+01 21816 20952 1.51730087423208e-02 21816 20976 1.30555135041960e-01 21816 21000 3.14802352952062e-01 21816 21024 1.50570875748812e-01 21816 21048 2.01769439190338e-02 21816 21360 2.94519280705989e-01 21816 21384 3.01366476430753e+00 21816 21408 7.92551584905714e+00 21816 21432 2.99017165115092e+00 21816 21456 2.88646002416835e-01 21816 21768 4.82827500215733e-01 21816 21792 5.11344358332134e+00 21816 21840 4.92634717206014e+00 21816 21864 4.36053397400433e-01 21817 21817 1.00000000000000e+00 21818 21818 1.00000000000000e+00 21819 21819 1.00000000000000e+00 21820 21820 1.00000000000000e+00 21821 21821 1.00000000000000e+00 21822 21822 1.00000000000000e+00 21823 21823 1.00000000000000e+00 21824 21824 1.00000000000000e+00 21825 21825 1.00000000000000e+00 21826 21826 1.00000000000000e+00 21827 21827 1.00000000000000e+00 21828 21828 1.00000000000000e+00 21829 21829 1.00000000000000e+00 21830 21830 1.00000000000000e+00 21831 21831 1.00000000000000e+00 21832 21832 1.00000000000000e+00 21833 21833 1.00000000000000e+00 21834 21834 1.00000000000000e+00 21835 21835 1.00000000000000e+00 21836 21836 1.00000000000000e+00 21837 21837 1.00000000000000e+00 21838 21838 1.00000000000000e+00 21839 21839 1.00000000000000e+00 21840 10485 -6.82991249166345e-03 21840 10509 -4.16778281377620e-02 21840 10533 -1.29413237855625e-02 21840 10557 -1.04201598584571e-05 21840 11061 -3.95711006277240e-05 21840 11085 -1.18740850620952e+00 21840 11109 -3.96155814643512e+00 21840 11133 -1.51207846681767e+00 21840 11157 -6.09452274392252e-02 21840 11181 -7.56520811581522e-05 21840 11661 -2.68177621416010e-05 21840 11685 -1.19951607928600e+00 21840 11709 -1.13558941478987e+01 21840 11733 -9.31757742472487e+00 21840 11757 -6.50483221529850e-01 21840 11781 -2.15737240607039e-04 21840 12285 -2.54244484549957e-06 21840 12309 -5.65787260988382e-01 21840 12333 -2.29847746643486e+00 21840 12357 -4.03388434389524e-01 21840 12381 -2.73434565390920e-07 21840 21840 9.51025959481725e+00 21840 20976 1.74657750181692e-02 21840 21000 1.50570875748812e-01 21840 21024 3.56062772461144e-01 21840 21048 1.43771354629874e-01 21840 21072 1.57658947384348e-02 21840 21384 4.58896910370893e-01 21840 21408 2.99017165115092e+00 21840 21432 5.50134950102266e+00 21840 21456 2.85105021759687e+00 21840 21480 4.24116551982383e-01 21840 21792 7.95533395614602e-01 21840 21816 4.92634717206014e+00 21840 21864 4.69570095278462e+00 21840 21888 7.37871840795721e-01 21841 21841 1.00000000000000e+00 21842 21842 1.00000000000000e+00 21843 21843 1.00000000000000e+00 21844 21844 1.00000000000000e+00 21845 21845 1.00000000000000e+00 21846 21846 1.00000000000000e+00 21847 21847 1.00000000000000e+00 21848 21848 1.00000000000000e+00 21849 21849 1.00000000000000e+00 21850 21850 1.00000000000000e+00 21851 21851 1.00000000000000e+00 21852 21852 1.00000000000000e+00 21853 21853 1.00000000000000e+00 21854 21854 1.00000000000000e+00 21855 21855 1.00000000000000e+00 21856 21856 1.00000000000000e+00 21857 21857 1.00000000000000e+00 21858 21858 1.00000000000000e+00 21859 21859 1.00000000000000e+00 21860 21860 1.00000000000000e+00 21861 21861 1.00000000000000e+00 21862 21862 1.00000000000000e+00 21863 21863 1.00000000000000e+00 21864 10509 -1.73196606922712e-03 21864 10533 -2.16046850008649e-03 21864 10557 -3.90079655830218e-06 21864 11085 -9.65306573404814e-03 21864 11109 -4.83551374784512e-01 21864 11133 -7.56106341981185e-01 21864 11157 -1.57084032693365e-01 21864 11181 -1.65556807285428e-03 21864 11685 -3.24275802740605e-02 21864 11709 -3.99767481908096e+00 21864 11733 -1.60834728731345e+01 21864 11757 -3.43113164804858e+00 21864 11781 -5.34115908914647e-02 21864 12285 -4.78380215078060e-07 21864 12309 -6.58684771145532e-01 21864 12333 -7.82386178903512e+00 21864 12357 -3.59414605494466e+00 21864 12381 -8.07620712877434e-02 21864 12933 -9.84041696600900e-04 21864 12957 -2.65642361519613e-02 21864 12981 -2.20520863822599e-03 21864 21864 1.36913543179825e+01 21864 21000 2.01769439190338e-02 21864 21024 1.43771354629874e-01 21864 21048 2.87903471136643e-01 21864 21072 1.24952424564347e-01 21864 21096 1.54722114026518e-02 21864 21408 2.88646002416835e-01 21864 21432 2.85105021759688e+00 21864 21456 7.35333930796951e+00 21864 21480 2.81178010326768e+00 21864 21504 2.78828473834536e-01 21864 21816 4.36053397400433e-01 21864 21840 4.69570095278462e+00 21864 21888 4.74889323458492e+00 21864 21912 4.49351467850510e-01 21865 21865 1.00000000000000e+00 21866 21866 1.00000000000000e+00 21867 21867 1.00000000000000e+00 21868 21868 1.00000000000000e+00 21869 21869 1.00000000000000e+00 21870 21870 1.00000000000000e+00 21871 21871 1.00000000000000e+00 21872 21872 1.00000000000000e+00 21873 21873 1.00000000000000e+00 21874 21874 1.00000000000000e+00 21875 21875 1.00000000000000e+00 21876 21876 1.00000000000000e+00 21877 21877 1.00000000000000e+00 21878 21878 1.00000000000000e+00 21879 21879 1.00000000000000e+00 21880 21880 1.00000000000000e+00 21881 21881 1.00000000000000e+00 21882 21882 1.00000000000000e+00 21883 21883 1.00000000000000e+00 21884 21884 1.00000000000000e+00 21885 21885 1.00000000000000e+00 21886 21886 1.00000000000000e+00 21887 21887 1.00000000000000e+00 21888 10509 -7.90465775745000e-09 21888 10533 -4.61831190340914e-06 21888 10557 -3.45535269833860e-07 21888 11109 -1.19215732302678e-02 21888 11133 -1.17498240106757e-01 21888 11157 -9.39954658147455e-02 21888 11181 -8.34695865135758e-03 21888 11709 -5.03800392544273e-01 21888 11733 -5.62748706111437e+00 21888 11757 -5.32072509957004e+00 21888 11781 -8.20147575343330e-01 21888 12309 -1.38468320828483e-01 21888 12333 -5.11769890541479e+00 21888 12357 -1.13506209985239e+01 21888 12381 -1.21722609796367e+00 21888 12933 -5.16422235334597e-03 21888 12957 -2.58559228758149e-01 21888 12981 -3.88419704019076e-02 21888 21888 9.75447987253565e+00 21888 21024 1.57658947384348e-02 21888 21048 1.24952424564347e-01 21888 21072 4.11091590186342e-01 21888 21096 3.57429471621562e-01 21888 21432 4.24116551982383e-01 21888 21456 2.81178010326768e+00 21888 21480 5.81606050192004e+00 21888 21504 2.97669063250825e+00 21888 21840 7.37871840795721e-01 21888 21864 4.74889323458492e+00 21888 21912 3.45137496366557e+00 21889 21889 1.00000000000000e+00 21890 21890 1.00000000000000e+00 21891 21891 1.00000000000000e+00 21892 21892 1.00000000000000e+00 21893 21893 1.00000000000000e+00 21894 21894 1.00000000000000e+00 21895 21895 1.00000000000000e+00 21896 21896 1.00000000000000e+00 21897 21897 1.00000000000000e+00 21898 21898 1.00000000000000e+00 21899 21899 1.00000000000000e+00 21900 21900 1.00000000000000e+00 21901 21901 1.00000000000000e+00 21902 21902 1.00000000000000e+00 21903 21903 1.00000000000000e+00 21904 21904 1.00000000000000e+00 21905 21905 1.00000000000000e+00 21906 21906 1.00000000000000e+00 21907 21907 1.00000000000000e+00 21908 21908 1.00000000000000e+00 21909 21909 1.00000000000000e+00 21910 21910 1.00000000000000e+00 21911 21911 1.00000000000000e+00 21912 11133 -2.63702574884997e-03 21912 11157 -2.04644255858383e-02 21912 11181 -7.07189490284714e-03 21912 11709 -5.68909072862970e-05 21912 11733 -5.40869660850735e-01 21912 11757 -2.77159021881346e+00 21912 11781 -1.27202318270219e+00 21912 12309 -6.75149496405379e-05 21912 12333 -9.93950143461411e-01 21912 12357 -8.01986008310696e+00 21912 12381 -1.86912480621183e+00 21912 12933 -3.44015283048563e-03 21912 12957 -3.31168804452569e-01 21912 12981 -6.22474803362333e-02 21912 21912 4.75728965237757e+00 21912 21048 1.54722114026518e-02 21912 21072 3.57429471621562e-01 21912 21096 6.06553463424562e-01 21912 21456 2.78828473834536e-01 21912 21480 2.97669063250826e+00 21912 21504 4.00158194817475e+00 21912 21864 4.49351467850510e-01 21912 21888 3.45137496366557e+00 21913 21913 1.00000000000000e+00 21914 21914 1.00000000000000e+00 21915 21915 1.00000000000000e+00 21916 21916 1.00000000000000e+00 21917 21917 1.00000000000000e+00 21918 21918 1.00000000000000e+00 21919 21919 1.00000000000000e+00 21920 21920 1.00000000000000e+00 21921 21921 1.00000000000000e+00 21922 21922 1.00000000000000e+00 21923 21923 1.00000000000000e+00 21924 21924 1.00000000000000e+00 21925 21925 1.00000000000000e+00 21926 21926 1.00000000000000e+00 21927 21927 1.00000000000000e+00 21928 21928 1.00000000000000e+00 21929 21929 1.00000000000000e+00 21930 21930 1.00000000000000e+00 21931 21931 1.00000000000000e+00 21932 21932 1.00000000000000e+00 21933 21933 1.00000000000000e+00 21934 21934 1.00000000000000e+00 21935 21935 1.00000000000000e+00 hypre-2.33.0/src/test/TEST_ij/default.jobs000077500000000000000000000012101477326011500202430ustar00rootroot00000000000000#!/bin/bash # Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) #============================================================================= # ij: Run default case (first old, then new), CF Jacobi, BoomerAMG #============================================================================= mpirun -np 1 ./ij -pmis1 -Pmx 0 -rlx 0 -xisone > default.out.0 mpirun -np 2 ./ij -P 1 1 2 -pmis1 -Pmx 0 -rlx 0 -xisone > default.out.1 mpirun -np 3 ./ij -P 1 1 3 -pmis1 -Pmx 0 -rlx 0 -xisone > default.out.2 hypre-2.33.0/src/test/TEST_ij/default.saved000066400000000000000000000010261477326011500204120ustar00rootroot00000000000000# Output file: default.out.0 Average Convergence Factor = 0.678738 Complexity: grid = 1.407000 operator = 3.252344 cycle = 6.499062 # Output file: default.out.1 Average Convergence Factor = 0.678738 Complexity: grid = 1.407000 operator = 3.252344 cycle = 6.499062 # Output file: default.out.2 Average Convergence Factor = 0.678738 Complexity: grid = 1.407000 operator = 3.252344 cycle = 6.499062 hypre-2.33.0/src/test/TEST_ij/default.saved.aurora000066400000000000000000000010261477326011500217020ustar00rootroot00000000000000# Output file: default.out.0 Average Convergence Factor = 0.670777 Complexity: grid = 1.413000 operator = 3.362344 cycle = 6.712031 # Output file: default.out.1 Average Convergence Factor = 0.670777 Complexity: grid = 1.413000 operator = 3.362344 cycle = 6.712031 # Output file: default.out.2 Average Convergence Factor = 0.670777 Complexity: grid = 1.413000 operator = 3.362344 cycle = 6.712031 hypre-2.33.0/src/test/TEST_ij/default.saved.lassen000066400000000000000000000010261477326011500216760ustar00rootroot00000000000000# Output file: default.out.0 Average Convergence Factor = 0.770311 Complexity: grid = 1.417000 operator = 3.197969 cycle = 6.392031 # Output file: default.out.1 Average Convergence Factor = 0.770311 Complexity: grid = 1.417000 operator = 3.197969 cycle = 6.392031 # Output file: default.out.2 Average Convergence Factor = 0.770311 Complexity: grid = 1.417000 operator = 3.197969 cycle = 6.392031 hypre-2.33.0/src/test/TEST_ij/default.saved.lassen_cpu000066400000000000000000000010261477326011500225450ustar00rootroot00000000000000# Output file: default.out.0 Average Convergence Factor = 0.678738 Complexity: grid = 1.407000 operator = 3.252344 cycle = 6.499062 # Output file: default.out.1 Average Convergence Factor = 0.678738 Complexity: grid = 1.407000 operator = 3.252344 cycle = 6.499062 # Output file: default.out.2 Average Convergence Factor = 0.678738 Complexity: grid = 1.407000 operator = 3.252344 cycle = 6.499062 hypre-2.33.0/src/test/TEST_ij/default.sh000077500000000000000000000033121477326011500177250ustar00rootroot00000000000000#!/bin/bash # Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) TNAME=`basename $0 .sh` RTOL=$1 ATOL=$2 #============================================================================= # IJ: Run 2 and 3 proc parallel case, weighted Jacobi, BoomerAMG # diffs it against 1 proc case #============================================================================= tail -17 ${TNAME}.out.0 | head -6 > ${TNAME}.testdata #============================================================================= tail -17 ${TNAME}.out.1 | head -6 > ${TNAME}.testdata.temp diff ${TNAME}.testdata ${TNAME}.testdata.temp >&2 #============================================================================= tail -17 ${TNAME}.out.2 | head -6 > ${TNAME}.testdata.temp diff ${TNAME}.testdata ${TNAME}.testdata.temp >&2 #============================================================================= # compare with baseline case #============================================================================= FILES="\ ${TNAME}.out.0\ ${TNAME}.out.1\ ${TNAME}.out.2\ " for i in $FILES do echo "# Output file: $i" tail -21 $i | head -6 done > ${TNAME}.out # Make sure that the output file is reasonable RUNCOUNT=`echo $FILES | wc -w` OUTCOUNT=`grep "Complexity" ${TNAME}.out | wc -l` if [ "$OUTCOUNT" != "$RUNCOUNT" ]; then echo "Incorrect number of runs in ${TNAME}.out" >&2 fi #============================================================================= # remove temporary files #============================================================================= rm -f ${TNAME}.testdata* hypre-2.33.0/src/test/TEST_ij/elast.jobs000077500000000000000000000065551477326011500177500ustar00rootroot00000000000000#!/bin/bash # Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) #============================================================================= # ij: Run 2D elasticity problem with different interpolation operators # 1: unknown approach (old default) # 2: hybrid approach (old default) # 3: GM variant 1 (old default) # 4: GM variant 2 Qmx=2 (old default) # 5: GM variant 2 Qtr=0.01 (old default) # 5: LN approach (old default) # 6: LN approach with 3 RBMs (2 more than needed) (old default) # 7: unknown approach with default settings # 8: hybrid approach with default settings # 9: GM variant 2 Qmx=2 with default settings # 10: classical block interpolation for nodal systems AMG # 11: classical block interpolation for nodal systems AMG with diagonal blocks #============================================================================= mpirun -np 2 ./ij -fromfile A -nf 2 -rlx 6 -solver 1 -falgout -interptype 0 -Pmx 0 -keepSS 1 > elast.out.0 mpirun -np 2 ./ij -fromfile A -nf 2 -rlx 6 -solver 1 -nodal 4 -falgout -interptype 0 -Pmx 0 -keepSS 1 > elast.out.1 mpirun -np 2 ./ij -fromfile A -rbm 1 rbm -nf 2 -interpvecvar 1 -nodal 1 -rlx 6 -solver 1 -falgout -interptype 0 -Pmx 0 -keepSS 1 > elast.out.2 mpirun -np 2 ./ij -fromfile A -rbm 1 rbm -nf 2 -interpvecvar 1 -nodal 4 -rlx 6 -solver 1 -falgout -interptype 0 -Pmx 0 -keepSS 1 -Qmx 2 > elast.out.3 mpirun -np 2 ./ij -fromfile A -rbm 1 rbm -nf 2 -interpvecvar 2 -nodal 3 -rlx 6 -solver 1 -falgout -interptype 0 -Pmx 0 -keepSS 1 -Qtr 0.01 > elast.out.4 mpirun -np 2 ./ij -fromfile A -rbm 1 rbm -nf 2 -interpvecvar 3 -nodal 6 -rlx 6 -solver 1 -falgout -interptype 0 -Pmx 0 -keepSS 1 > elast.out.5 mpirun -np 2 ./ij -fromfile A -rbm 3 rbm -nf 2 -interpvecvar 3 -nodal 6 -rlx 6 -solver 1 -falgout -interptype 0 -Pmx 0 -keepSS 1 > elast.out.6 mpirun -np 2 ./ij -fromfile A -nf 2 -rlx 6 -solver 1 > elast.out.7 mpirun -np 2 ./ij -fromfile A -nf 2 -rlx 6 -solver 1 -nodal 4 > elast.out.8 mpirun -np 2 ./ij -fromfile A -rbm 1 rbm -nf 2 -interpvecvar 2 -Qmx 2 -nodal 1 -rlx 6 -solver 1 > elast.out.9 mpirun -np 2 ./ij -fromfile A -nf 2 -rlx 26 -interptype 10 -solver 1 > elast.out.10 mpirun -np 2 ./ij -fromfile A -nf 2 -rlx 26 -interptype 11 -solver 1 > elast.out.11 mpirun -np 2 ./ij -fromfile A -nf 2 -rlx 6 -solver 1 -falgout -interptype 0 -Pmx 0 -keepSS 1 > elast.out.12 mpirun -np 2 ./ij -fromfile A -nf 2 -rlx 6 -solver 1 -nodal 4 -falgout -interptype 0 -Pmx 0 -keepSS 1 > elast.out.13 mpirun -np 2 ./ij -fromfile A -rbm 1 rbm -nf 2 -interpvecvar 1 -nodal 1 -rlx 6 -solver 1 > elast.out.14 mpirun -np 2 ./ij -fromfile A -rbm 1 rbm -nf 2 -interpvecvar 1 -nodal 4 -rlx 6 -solver 1 -Qmx 2 > elast.out.15 mpirun -np 2 ./ij -fromfile A -rbm 1 rbm -nf 2 -interpvecvar 2 -nodal 3 -rlx 6 -solver 1 -Qtr 0.01 > elast.out.16 mpirun -np 2 ./ij -fromfile A -rbm 1 rbm -nf 2 -interpvecvar 3 -nodal 6 -rlx 6 -solver 1 > elast.out.17 mpirun -np 2 ./ij -fromfile A -rbm 3 rbm -nf 2 -interpvecvar 3 -nodal 6 -rlx 6 -solver 1 > elast.out.18 mpirun -np 2 ./ij -fromfile A -rbm 1 rbm -nf 2 -interpvecvar 1 -nodal 1 -rlx 6 -solver 1 -interptype 17 > elast.out.19 mpirun -np 2 ./ij -fromfile A -rbm 1 rbm -nf 2 -interpvecvar 1 -nodal 4 -rlx 6 -solver 1 -Qmx 2 -interptype 16 -keepSS 1 > elast.out.20 hypre-2.33.0/src/test/TEST_ij/elast.saved000066400000000000000000000035021477326011500200770ustar00rootroot00000000000000# Output file: elast.out.0 Iterations = 15 Final Relative Residual Norm = 3.031448e-09 # Output file: elast.out.1 Iterations = 19 Final Relative Residual Norm = 5.280300e-09 # Output file: elast.out.2 Iterations = 17 Final Relative Residual Norm = 5.006926e-09 # Output file: elast.out.3 Iterations = 18 Final Relative Residual Norm = 1.915650e-09 # Output file: elast.out.4 Iterations = 18 Final Relative Residual Norm = 9.976830e-09 # Output file: elast.out.5 Iterations = 14 Final Relative Residual Norm = 7.212489e-09 # Output file: elast.out.6 Iterations = 14 Final Relative Residual Norm = 1.005958e-09 # Output file: elast.out.7 Iterations = 16 Final Relative Residual Norm = 1.876888e-09 # Output file: elast.out.8 Iterations = 19 Final Relative Residual Norm = 5.959655e-09 # Output file: elast.out.9 Iterations = 17 Final Relative Residual Norm = 1.448490e-09 # Output file: elast.out.10 Iterations = 23 Final Relative Residual Norm = 4.126014e-09 # Output file: elast.out.11 Iterations = 22 Final Relative Residual Norm = 2.695353e-09 # Output file: elast.out.12 Iterations = 15 Final Relative Residual Norm = 3.031448e-09 # Output file: elast.out.13 Iterations = 19 Final Relative Residual Norm = 5.280300e-09 # Output file: elast.out.14 Iterations = 17 Final Relative Residual Norm = 3.820100e-09 # Output file: elast.out.15 Iterations = 17 Final Relative Residual Norm = 6.460477e-09 # Output file: elast.out.16 Iterations = 18 Final Relative Residual Norm = 7.191439e-09 # Output file: elast.out.17 Iterations = 15 Final Relative Residual Norm = 3.102876e-09 # Output file: elast.out.18 Iterations = 14 Final Relative Residual Norm = 7.969926e-09 # Output file: elast.out.19 Iterations = 17 Final Relative Residual Norm = 3.080671e-09 # Output file: elast.out.20 Iterations = 20 Final Relative Residual Norm = 3.346178e-09 hypre-2.33.0/src/test/TEST_ij/elast.saved.aurora000066400000000000000000000035031477326011500213700ustar00rootroot00000000000000# Output file: elast.out.0 Iterations = 15 Final Relative Residual Norm = 3.696503e-09 # Output file: elast.out.1 Iterations = 19 Final Relative Residual Norm = 5.280301e-09 # Output file: elast.out.2 Iterations = 17 Final Relative Residual Norm = 5.006925e-09 # Output file: elast.out.3 Iterations = 18 Final Relative Residual Norm = 1.915650e-09 # Output file: elast.out.4 Iterations = 18 Final Relative Residual Norm = 9.702040e-09 # Output file: elast.out.5 Iterations = 15 Final Relative Residual Norm = 1.732501e-09 # Output file: elast.out.6 Iterations = 14 Final Relative Residual Norm = 7.197345e-10 # Output file: elast.out.7 Iterations = 18 Final Relative Residual Norm = 4.534614e-09 # Output file: elast.out.8 Iterations = 22 Final Relative Residual Norm = 9.819907e-09 # Output file: elast.out.9 Iterations = 20 Final Relative Residual Norm = 3.084274e-09 # Output file: elast.out.10 Iterations = 30 Final Relative Residual Norm = 7.596931e-09 # Output file: elast.out.11 Iterations = 24 Final Relative Residual Norm = 5.897597e-09 # Output file: elast.out.12 Iterations = 15 Final Relative Residual Norm = 3.696503e-09 # Output file: elast.out.13 Iterations = 19 Final Relative Residual Norm = 5.280301e-09 # Output file: elast.out.14 Iterations = 22 Final Relative Residual Norm = 3.824699e-09 # Output file: elast.out.15 Iterations = 22 Final Relative Residual Norm = 3.661821e-09 # Output file: elast.out.16 Iterations = 22 Final Relative Residual Norm = 2.580454e-09 # Output file: elast.out.17 Iterations = 17 Final Relative Residual Norm = 3.760837e-09 # Output file: elast.out.18 Iterations = 15 Final Relative Residual Norm = 7.375784e-09 # Output file: elast.out.19 Iterations = 22 Final Relative Residual Norm = 3.824699e-09 # Output file: elast.out.20 Iterations = 26 Final Relative Residual Norm = 3.261487e-09 hypre-2.33.0/src/test/TEST_ij/elast.saved.lassen000066400000000000000000000035031477326011500213640ustar00rootroot00000000000000# Output file: elast.out.0 Iterations = 15 Final Relative Residual Norm = 3.696508e-09 # Output file: elast.out.1 Iterations = 19 Final Relative Residual Norm = 5.280302e-09 # Output file: elast.out.2 Iterations = 17 Final Relative Residual Norm = 5.006925e-09 # Output file: elast.out.3 Iterations = 18 Final Relative Residual Norm = 1.982784e-09 # Output file: elast.out.4 Iterations = 18 Final Relative Residual Norm = 9.702037e-09 # Output file: elast.out.5 Iterations = 15 Final Relative Residual Norm = 1.733122e-09 # Output file: elast.out.6 Iterations = 14 Final Relative Residual Norm = 7.092333e-10 # Output file: elast.out.7 Iterations = 17 Final Relative Residual Norm = 3.595817e-09 # Output file: elast.out.8 Iterations = 21 Final Relative Residual Norm = 4.320022e-09 # Output file: elast.out.9 Iterations = 18 Final Relative Residual Norm = 3.131906e-09 # Output file: elast.out.10 Iterations = 30 Final Relative Residual Norm = 7.596939e-09 # Output file: elast.out.11 Iterations = 24 Final Relative Residual Norm = 5.897597e-09 # Output file: elast.out.12 Iterations = 15 Final Relative Residual Norm = 3.696508e-09 # Output file: elast.out.13 Iterations = 19 Final Relative Residual Norm = 5.280302e-09 # Output file: elast.out.14 Iterations = 21 Final Relative Residual Norm = 3.749017e-09 # Output file: elast.out.15 Iterations = 21 Final Relative Residual Norm = 2.497467e-09 # Output file: elast.out.16 Iterations = 21 Final Relative Residual Norm = 3.707944e-09 # Output file: elast.out.17 Iterations = 15 Final Relative Residual Norm = 6.340959e-09 # Output file: elast.out.18 Iterations = 15 Final Relative Residual Norm = 2.390385e-09 # Output file: elast.out.19 Iterations = 21 Final Relative Residual Norm = 3.749017e-09 # Output file: elast.out.20 Iterations = 29 Final Relative Residual Norm = 7.098349e-09 hypre-2.33.0/src/test/TEST_ij/elast.saved.lassen_cpu000066400000000000000000000035031477326011500222330ustar00rootroot00000000000000# Output file: elast.out.0 Iterations = 15 Final Relative Residual Norm = 3.031440e-09 # Output file: elast.out.1 Iterations = 19 Final Relative Residual Norm = 5.280300e-09 # Output file: elast.out.2 Iterations = 17 Final Relative Residual Norm = 5.006925e-09 # Output file: elast.out.3 Iterations = 18 Final Relative Residual Norm = 1.982784e-09 # Output file: elast.out.4 Iterations = 18 Final Relative Residual Norm = 9.976830e-09 # Output file: elast.out.5 Iterations = 14 Final Relative Residual Norm = 7.212489e-09 # Output file: elast.out.6 Iterations = 14 Final Relative Residual Norm = 1.032022e-09 # Output file: elast.out.7 Iterations = 16 Final Relative Residual Norm = 1.869415e-09 # Output file: elast.out.8 Iterations = 19 Final Relative Residual Norm = 5.947438e-09 # Output file: elast.out.9 Iterations = 17 Final Relative Residual Norm = 1.459105e-09 # Output file: elast.out.10 Iterations = 23 Final Relative Residual Norm = 4.126014e-09 # Output file: elast.out.11 Iterations = 22 Final Relative Residual Norm = 2.695354e-09 # Output file: elast.out.12 Iterations = 15 Final Relative Residual Norm = 3.031440e-09 # Output file: elast.out.13 Iterations = 19 Final Relative Residual Norm = 5.280300e-09 # Output file: elast.out.14 Iterations = 17 Final Relative Residual Norm = 3.806724e-09 # Output file: elast.out.15 Iterations = 17 Final Relative Residual Norm = 6.522765e-09 # Output file: elast.out.16 Iterations = 18 Final Relative Residual Norm = 7.070903e-09 # Output file: elast.out.17 Iterations = 15 Final Relative Residual Norm = 3.102875e-09 # Output file: elast.out.18 Iterations = 14 Final Relative Residual Norm = 7.848992e-09 # Output file: elast.out.19 Iterations = 17 Final Relative Residual Norm = 3.080671e-09 # Output file: elast.out.20 Iterations = 20 Final Relative Residual Norm = 3.155988e-09 hypre-2.33.0/src/test/TEST_ij/elast.sh000077500000000000000000000024661477326011500174220ustar00rootroot00000000000000#!/bin/bash # Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) TNAME=`basename $0 .sh` RTOL=$1 ATOL=$2 #============================================================================= # compare with baseline case #============================================================================= FILES="\ ${TNAME}.out.0\ ${TNAME}.out.1\ ${TNAME}.out.2\ ${TNAME}.out.3\ ${TNAME}.out.4\ ${TNAME}.out.5\ ${TNAME}.out.6\ ${TNAME}.out.7\ ${TNAME}.out.8\ ${TNAME}.out.9\ ${TNAME}.out.10\ ${TNAME}.out.11\ ${TNAME}.out.12\ ${TNAME}.out.13\ ${TNAME}.out.14\ ${TNAME}.out.15\ ${TNAME}.out.16\ ${TNAME}.out.17\ ${TNAME}.out.18\ ${TNAME}.out.19\ ${TNAME}.out.20\ " for i in $FILES do echo "# Output file: $i" tail -3 $i done > ${TNAME}.out # Make sure that the output file is reasonable RUNCOUNT=`echo $FILES | wc -w` OUTCOUNT=`grep "Iterations" ${TNAME}.out | wc -l` if [ "$OUTCOUNT" != "$RUNCOUNT" ]; then echo "Incorrect number of runs in ${TNAME}.out" >&2 fi #============================================================================= # remove temporary files #============================================================================= rm -f ${TNAME}.testdata* hypre-2.33.0/src/test/TEST_ij/fsai.jobs000077500000000000000000000160251477326011500175530ustar00rootroot00000000000000#!/bin/bash # Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) #============================================================================= # Instructions for new adding new regression tests: # # 1) Given a new scenario, add matching tests for FSAI as a preconditioner and # FSAI as a smoother to BoomerAMG, e.g., see fsai.out.0 and fsai.out.100 # #============================================================================= #============================================================================= # Preconditioner to Krylov methods #============================================================================= # Computes the full inverse of the lower Cholesky factor. Not practical, but it's a good sanity check. mpirun -np 1 ./ij -n 5 5 5 -solver 31 -fs_max_steps 125 -fs_max_step_size 1 -fs_kap_tol 0 > fsai.out.0 # The FSAI factor G is simply sqrt(1/D_A). This should give the same result as DS-PCG mpirun -np 1 ./ij -n 10 10 10 -solver 31 -fs_max_steps 0 -fs_max_step_size 0 -fs_kap_tol 0 > fsai.out.1 mpirun -np 1 ./ij -n 10 10 10 -solver 31 -fs_max_steps 0 -fs_max_step_size 1 -fs_kap_tol 0 > fsai.out.2 mpirun -np 1 ./ij -n 10 10 10 -solver 2 > fsai.out.3 # Test different setup combinations for FSAI mpirun -np 1 ./ij -n 10 10 10 -solver 31 -fs_max_steps 5 -fs_max_step_size 1 -fs_kap_tol 0 > fsai.out.4 mpirun -np 1 ./ij -n 10 10 10 -solver 31 -fs_max_steps 5 -fs_max_step_size 4 -fs_kap_tol 0 > fsai.out.5 mpirun -np 1 ./ij -n 10 10 10 -solver 31 -fs_max_steps 5 -fs_max_step_size 4 -fs_kap_tol 1e-3 > fsai.out.6 mpirun -np 1 ./ij -n 10 10 10 -solver 31 -fs_max_steps 5 -fs_max_step_size 4 -fs_kap_tol 1e-1 > fsai.out.7 # Test with larger problem stencils mpirun -np 1 ./ij -n 10 10 10 -27pt -solver 31 -fs_max_steps 5 -fs_max_step_size 3 -fs_kap_tol 0 > fsai.out.8 mpirun -np 2 ./ij -n 10 10 10 -P 2 1 1 -27pt -solver 31 -fs_max_steps 5 -fs_max_step_size 3 -fs_kap_tol 0 > fsai.out.9 mpirun -np 3 ./ij -n 10 10 10 -P 3 1 1 -27pt -solver 31 -fs_max_steps 5 -fs_max_step_size 3 -fs_kap_tol 0 > fsai.out.10 mpirun -np 1 ./ij -n 10 10 10 -sysL 3 -solver 31 -fs_max_steps 5 -fs_max_step_size 3 -fs_kap_tol 0 > fsai.out.11 mpirun -np 2 ./ij -n 10 10 10 -P 2 1 1 -sysL 3 -solver 31 -fs_max_steps 5 -fs_max_step_size 3 -fs_kap_tol 0 > fsai.out.12 mpirun -np 3 ./ij -n 10 10 10 -P 3 1 1 -sysL 3 -solver 31 -fs_max_steps 5 -fs_max_step_size 3 -fs_kap_tol 0 > fsai.out.13 # Test with linear elasticity problems mpirun -np 1 ./ij -fromfile data/beam_tet_dof459_np1/A.IJ -rhsfromfile data/beam_tet_dof459_np1/b.IJ \ -solver 31 -fs_max_steps 5 -fs_max_step_size 3 -fs_kap_tol 0 > fsai.out.14 mpirun -np 2 ./ij -fromfile data/beam_hex_dof459_np2/A.IJ -rhsfromfile data/beam_hex_dof459_np2/b.IJ \ -solver 31 -fs_max_steps 5 -fs_max_step_size 3 -fs_kap_tol 0 > fsai.out.15 mpirun -np 4 ./ij -fromfile data/beam_tet_dof2475_np4/A.IJ -rhsfromfile data/beam_tet_dof2475_np4/b.IJ \ -solver 31 -fs_max_steps 5 -fs_max_step_size 3 -fs_kap_tol 0 > fsai.out.16 mpirun -np 4 ./ij -fromfile data/beam_tet_dof2475_np4/A.IJ -rhsfromfile data/beam_tet_dof2475_np4/b.IJ \ -solver 31 -fs_max_steps 15 -fs_max_step_size 4 -fs_kap_tol 0 > fsai.out.17 mpirun -np 4 ./ij -fromfile data/beam_tet_dof2475_np4/A.IJ -rhsfromfile data/beam_tet_dof2475_np4/b.IJ \ -solver 31 > fsai.out.18 #============================================================================= # Complex smoother to BoomerAMG #============================================================================= # Computes the full inverse of the lower Cholesky factor. Not practical, but it's a good sanity check. mpirun -np 1 ./ij -n 5 5 5 -solver 1 -smtype 4 -smlv 25 -fs_max_steps 125 -fs_max_step_size 1 -fs_kap_tol 0 -fs_eig_max_iters 5 > fsai.out.100 # The FSAI factor G is simply sqrt(1/D_A). This should give the same result as BoomerAMG(Jac)-PCG mpirun -np 1 ./ij -n 10 10 10 -solver 1 -smtype 4 -smlv 4 -fs_max_steps 0 -fs_max_step_size 0 -fs_kap_tol 0 -fs_eig_max_iters 0 > fsai.out.101 mpirun -np 1 ./ij -n 10 10 10 -solver 1 -smtype 4 -smlv 4 -fs_max_steps 0 -fs_max_step_size 1 -fs_kap_tol 0 -fs_eig_max_iters 0 > fsai.out.102 mpirun -np 1 ./ij -n 10 10 10 -solver 1 -rlx 7 > fsai.out.103 # Test different setup combinations for FSAI mpirun -np 1 ./ij -n 10 10 10 -solver 1 -smtype 4 -smlv 25 -fs_max_steps 5 -fs_max_step_size 1 -fs_kap_tol 0 -fs_eig_max_iters 5 > fsai.out.104 mpirun -np 1 ./ij -n 10 10 10 -solver 1 -smtype 4 -smlv 25 -fs_max_steps 5 -fs_max_step_size 4 -fs_kap_tol 0 -fs_eig_max_iters 5 > fsai.out.105 mpirun -np 1 ./ij -n 10 10 10 -solver 1 -smtype 4 -smlv 25 -fs_max_steps 5 -fs_max_step_size 4 -fs_kap_tol 1e-3 -fs_eig_max_iters 5 > fsai.out.106 mpirun -np 1 ./ij -n 10 10 10 -solver 1 -smtype 4 -smlv 25 -fs_max_steps 5 -fs_max_step_size 4 -fs_kap_tol 1e-1 -fs_eig_max_iters 5 > fsai.out.107 # Test with larger problem stencils mpirun -np 1 ./ij -n 10 10 10 -27pt -solver 1 -smtype 4 -smlv 25 -fs_max_steps 5 -fs_max_step_size 3 -fs_kap_tol 0 -fs_eig_max_iters 5 > fsai.out.108 mpirun -np 2 ./ij -n 10 10 10 -P 2 1 1 -27pt -solver 1 -smtype 4 -smlv 25 -fs_max_steps 5 -fs_max_step_size 3 -fs_kap_tol 0 -fs_eig_max_iters 5 > fsai.out.109 mpirun -np 3 ./ij -n 10 10 10 -P 3 1 1 -27pt -solver 1 -smtype 4 -smlv 25 -fs_max_steps 5 -fs_max_step_size 3 -fs_kap_tol 0 -fs_eig_max_iters 5 > fsai.out.110 mpirun -np 1 ./ij -n 10 10 10 -sysL 3 -solver 1 -smtype 4 -smlv 25 -fs_max_steps 5 -fs_max_step_size 3 -fs_kap_tol 0 -fs_eig_max_iters 5 > fsai.out.111 mpirun -np 2 ./ij -n 10 10 10 -P 2 1 1 -sysL 3 -solver 1 -smtype 4 -smlv 25 -fs_max_steps 5 -fs_max_step_size 3 -fs_kap_tol 0 -fs_eig_max_iters 5 > fsai.out.112 mpirun -np 3 ./ij -n 10 10 10 -P 3 1 1 -sysL 3 -solver 1 -smtype 4 -smlv 25 -fs_max_steps 5 -fs_max_step_size 3 -fs_kap_tol 0 -fs_eig_max_iters 5 > fsai.out.113 # Test with linear elasticity problems mpirun -np 1 ./ij -fromfile data/beam_tet_dof459_np1/A.IJ -rhsfromfile data/beam_tet_dof459_np1/b.IJ \ -nf 3 -solver 1 -smtype 4 -smlv 25 -fs_max_steps 5 -fs_max_step_size 3 -fs_kap_tol 0 -fs_eig_max_iters 5 > fsai.out.114 mpirun -np 2 ./ij -fromfile data/beam_hex_dof459_np2/A.IJ -rhsfromfile data/beam_hex_dof459_np2/b.IJ \ -nf 3 -solver 1 -smtype 4 -smlv 25 -fs_max_steps 5 -fs_max_step_size 3 -fs_kap_tol 0 -fs_eig_max_iters 5 > fsai.out.115 mpirun -np 4 ./ij -fromfile data/beam_tet_dof2475_np4/A.IJ -rhsfromfile data/beam_tet_dof2475_np4/b.IJ \ -nf 3 -solver 1 -smtype 4 -smlv 25 -fs_max_steps 5 -fs_max_step_size 3 -fs_kap_tol 0 -fs_eig_max_iters 5 > fsai.out.116 mpirun -np 4 ./ij -fromfile data/beam_tet_dof2475_np4/A.IJ -rhsfromfile data/beam_tet_dof2475_np4/b.IJ \ -nf 3 -solver 1 -smtype 4 -smlv 25 -fs_max_steps 15 -fs_max_step_size 4 -fs_kap_tol 0 -fs_eig_max_iters 5 > fsai.out.117 mpirun -np 4 ./ij -fromfile data/beam_tet_dof2475_np4/A.IJ -rhsfromfile data/beam_tet_dof2475_np4/b.IJ \ -nf 3 -solver 1 -smtype 4 -smlv 25 > fsai.out.118 hypre-2.33.0/src/test/TEST_ij/fsai.saved000066400000000000000000000064211477326011500177140ustar00rootroot00000000000000# Output file: fsai.out.0 Iterations = 1 Final Relative Residual Norm = 2.761185e-15 # Output file: fsai.out.1 Iterations = 23 Final Relative Residual Norm = 8.691352e-09 # Output file: fsai.out.2 Iterations = 23 Final Relative Residual Norm = 8.691352e-09 # Output file: fsai.out.3 Iterations = 23 Final Relative Residual Norm = 8.691352e-09 # Output file: fsai.out.4 Iterations = 19 Final Relative Residual Norm = 8.939605e-09 # Output file: fsai.out.5 Iterations = 13 Final Relative Residual Norm = 9.676517e-09 # Output file: fsai.out.6 Iterations = 13 Final Relative Residual Norm = 4.048616e-09 # Output file: fsai.out.7 Iterations = 18 Final Relative Residual Norm = 8.582135e-09 # Output file: fsai.out.8 Iterations = 12 Final Relative Residual Norm = 5.755183e-09 # Output file: fsai.out.9 Iterations = 16 Final Relative Residual Norm = 4.809895e-09 # Output file: fsai.out.10 Iterations = 17 Final Relative Residual Norm = 9.601188e-09 # Output file: fsai.out.11 Iterations = 23 Final Relative Residual Norm = 6.857102e-09 # Output file: fsai.out.12 Iterations = 26 Final Relative Residual Norm = 7.063015e-09 # Output file: fsai.out.13 Iterations = 27 Final Relative Residual Norm = 5.145896e-09 # Output file: fsai.out.14 Iterations = 78 Final Relative Residual Norm = 3.787505e-09 # Output file: fsai.out.15 Iterations = 78 Final Relative Residual Norm = 5.414675e-09 # Output file: fsai.out.16 Iterations = 171 Final Relative Residual Norm = 4.941318e-09 # Output file: fsai.out.17 Iterations = 126 Final Relative Residual Norm = 9.030852e-09 # Output file: fsai.out.18 Iterations = 185 Final Relative Residual Norm = 4.894088e-09 # Output file: fsai.out.100 Iterations = 1 Final Relative Residual Norm = 8.370817e-16 # Output file: fsai.out.101 Iterations = 22 Final Relative Residual Norm = 7.480945e-09 # Output file: fsai.out.102 Iterations = 22 Final Relative Residual Norm = 7.480945e-09 # Output file: fsai.out.103 Iterations = 22 Final Relative Residual Norm = 7.480945e-09 # Output file: fsai.out.104 Iterations = 6 Final Relative Residual Norm = 1.781486e-09 # Output file: fsai.out.105 Iterations = 4 Final Relative Residual Norm = 6.366437e-09 # Output file: fsai.out.106 Iterations = 4 Final Relative Residual Norm = 7.562368e-09 # Output file: fsai.out.107 Iterations = 7 Final Relative Residual Norm = 5.412177e-09 # Output file: fsai.out.108 Iterations = 5 Final Relative Residual Norm = 4.839232e-10 # Output file: fsai.out.109 Iterations = 6 Final Relative Residual Norm = 9.585043e-09 # Output file: fsai.out.110 Iterations = 7 Final Relative Residual Norm = 1.636774e-09 # Output file: fsai.out.111 Iterations = 9 Final Relative Residual Norm = 1.190776e-09 # Output file: fsai.out.112 Iterations = 9 Final Relative Residual Norm = 9.352486e-09 # Output file: fsai.out.113 Iterations = 10 Final Relative Residual Norm = 1.877799e-09 # Output file: fsai.out.114 Iterations = 24 Final Relative Residual Norm = 1.913199e-09 # Output file: fsai.out.115 Iterations = 27 Final Relative Residual Norm = 8.714453e-09 # Output file: fsai.out.116 Iterations = 34 Final Relative Residual Norm = 1.456606e-09 # Output file: fsai.out.117 Iterations = 30 Final Relative Residual Norm = 2.318909e-09 # Output file: fsai.out.118 Iterations = 35 Final Relative Residual Norm = 2.996819e-09 hypre-2.33.0/src/test/TEST_ij/fsai.saved.aurora000066400000000000000000000064221477326011500212050ustar00rootroot00000000000000# Output file: fsai.out.0 Iterations = 1 Final Relative Residual Norm = 1.327968e-15 # Output file: fsai.out.1 Iterations = 23 Final Relative Residual Norm = 8.691352e-09 # Output file: fsai.out.2 Iterations = 23 Final Relative Residual Norm = 8.691352e-09 # Output file: fsai.out.3 Iterations = 23 Final Relative Residual Norm = 8.691352e-09 # Output file: fsai.out.4 Iterations = 19 Final Relative Residual Norm = 8.939605e-09 # Output file: fsai.out.5 Iterations = 13 Final Relative Residual Norm = 9.676517e-09 # Output file: fsai.out.6 Iterations = 13 Final Relative Residual Norm = 4.048616e-09 # Output file: fsai.out.7 Iterations = 18 Final Relative Residual Norm = 8.582135e-09 # Output file: fsai.out.8 Iterations = 12 Final Relative Residual Norm = 5.755183e-09 # Output file: fsai.out.9 Iterations = 16 Final Relative Residual Norm = 4.809895e-09 # Output file: fsai.out.10 Iterations = 17 Final Relative Residual Norm = 9.601188e-09 # Output file: fsai.out.11 Iterations = 23 Final Relative Residual Norm = 6.857102e-09 # Output file: fsai.out.12 Iterations = 26 Final Relative Residual Norm = 7.063015e-09 # Output file: fsai.out.13 Iterations = 27 Final Relative Residual Norm = 5.145896e-09 # Output file: fsai.out.14 Iterations = 78 Final Relative Residual Norm = 3.787405e-09 # Output file: fsai.out.15 Iterations = 78 Final Relative Residual Norm = 5.652639e-09 # Output file: fsai.out.16 Iterations = 171 Final Relative Residual Norm = 4.890543e-09 # Output file: fsai.out.17 Iterations = 126 Final Relative Residual Norm = 9.009656e-09 # Output file: fsai.out.18 Iterations = 184 Final Relative Residual Norm = 8.235568e-09 # Output file: fsai.out.100 Iterations = 1 Final Relative Residual Norm = 8.500568e-16 # Output file: fsai.out.101 Iterations = 21 Final Relative Residual Norm = 4.410327e-09 # Output file: fsai.out.102 Iterations = 21 Final Relative Residual Norm = 4.410327e-09 # Output file: fsai.out.103 Iterations = 21 Final Relative Residual Norm = 4.410327e-09 # Output file: fsai.out.104 Iterations = 6 Final Relative Residual Norm = 8.335263e-09 # Output file: fsai.out.105 Iterations = 5 Final Relative Residual Norm = 2.235485e-09 # Output file: fsai.out.106 Iterations = 5 Final Relative Residual Norm = 2.243140e-09 # Output file: fsai.out.107 Iterations = 7 Final Relative Residual Norm = 5.102038e-09 # Output file: fsai.out.108 Iterations = 5 Final Relative Residual Norm = 5.076365e-10 # Output file: fsai.out.109 Iterations = 6 Final Relative Residual Norm = 6.739539e-09 # Output file: fsai.out.110 Iterations = 7 Final Relative Residual Norm = 3.488908e-10 # Output file: fsai.out.111 Iterations = 9 Final Relative Residual Norm = 3.676980e-09 # Output file: fsai.out.112 Iterations = 10 Final Relative Residual Norm = 1.938122e-09 # Output file: fsai.out.113 Iterations = 10 Final Relative Residual Norm = 3.955283e-09 # Output file: fsai.out.114 Iterations = 25 Final Relative Residual Norm = 2.112909e-09 # Output file: fsai.out.115 Iterations = 27 Final Relative Residual Norm = 3.910858e-09 # Output file: fsai.out.116 Iterations = 37 Final Relative Residual Norm = 2.122027e-09 # Output file: fsai.out.117 Iterations = 33 Final Relative Residual Norm = 1.272242e-09 # Output file: fsai.out.118 Iterations = 38 Final Relative Residual Norm = 5.770945e-09 hypre-2.33.0/src/test/TEST_ij/fsai.saved.lassen000066400000000000000000000064221477326011500212010ustar00rootroot00000000000000# Output file: fsai.out.0 Iterations = 1 Final Relative Residual Norm = 1.228129e-15 # Output file: fsai.out.1 Iterations = 23 Final Relative Residual Norm = 8.691352e-09 # Output file: fsai.out.2 Iterations = 23 Final Relative Residual Norm = 8.691352e-09 # Output file: fsai.out.3 Iterations = 23 Final Relative Residual Norm = 8.691352e-09 # Output file: fsai.out.4 Iterations = 19 Final Relative Residual Norm = 8.939605e-09 # Output file: fsai.out.5 Iterations = 13 Final Relative Residual Norm = 9.676493e-09 # Output file: fsai.out.6 Iterations = 13 Final Relative Residual Norm = 4.052388e-09 # Output file: fsai.out.7 Iterations = 18 Final Relative Residual Norm = 8.582135e-09 # Output file: fsai.out.8 Iterations = 12 Final Relative Residual Norm = 4.959354e-09 # Output file: fsai.out.9 Iterations = 16 Final Relative Residual Norm = 4.823866e-09 # Output file: fsai.out.10 Iterations = 17 Final Relative Residual Norm = 9.617105e-09 # Output file: fsai.out.11 Iterations = 23 Final Relative Residual Norm = 6.181709e-09 # Output file: fsai.out.12 Iterations = 26 Final Relative Residual Norm = 6.972951e-09 # Output file: fsai.out.13 Iterations = 27 Final Relative Residual Norm = 5.307599e-09 # Output file: fsai.out.14 Iterations = 78 Final Relative Residual Norm = 3.771847e-09 # Output file: fsai.out.15 Iterations = 78 Final Relative Residual Norm = 5.076820e-09 # Output file: fsai.out.16 Iterations = 171 Final Relative Residual Norm = 5.063815e-09 # Output file: fsai.out.17 Iterations = 126 Final Relative Residual Norm = 8.488999e-09 # Output file: fsai.out.18 Iterations = 184 Final Relative Residual Norm = 7.904808e-09 # Output file: fsai.out.100 Iterations = 1 Final Relative Residual Norm = 9.870376e-16 # Output file: fsai.out.101 Iterations = 21 Final Relative Residual Norm = 7.992635e-09 # Output file: fsai.out.102 Iterations = 21 Final Relative Residual Norm = 7.992635e-09 # Output file: fsai.out.103 Iterations = 21 Final Relative Residual Norm = 7.992635e-09 # Output file: fsai.out.104 Iterations = 7 Final Relative Residual Norm = 3.296684e-10 # Output file: fsai.out.105 Iterations = 5 Final Relative Residual Norm = 1.829167e-09 # Output file: fsai.out.106 Iterations = 5 Final Relative Residual Norm = 1.901994e-09 # Output file: fsai.out.107 Iterations = 7 Final Relative Residual Norm = 7.069461e-09 # Output file: fsai.out.108 Iterations = 5 Final Relative Residual Norm = 3.267638e-10 # Output file: fsai.out.109 Iterations = 6 Final Relative Residual Norm = 8.879422e-09 # Output file: fsai.out.110 Iterations = 7 Final Relative Residual Norm = 9.454511e-10 # Output file: fsai.out.111 Iterations = 10 Final Relative Residual Norm = 1.114164e-09 # Output file: fsai.out.112 Iterations = 10 Final Relative Residual Norm = 2.738091e-09 # Output file: fsai.out.113 Iterations = 10 Final Relative Residual Norm = 4.476226e-09 # Output file: fsai.out.114 Iterations = 25 Final Relative Residual Norm = 2.054687e-09 # Output file: fsai.out.115 Iterations = 27 Final Relative Residual Norm = 2.533347e-09 # Output file: fsai.out.116 Iterations = 37 Final Relative Residual Norm = 1.700494e-09 # Output file: fsai.out.117 Iterations = 32 Final Relative Residual Norm = 7.611745e-09 # Output file: fsai.out.118 Iterations = 38 Final Relative Residual Norm = 6.230831e-09 hypre-2.33.0/src/test/TEST_ij/fsai.saved.lassen_cpu000066400000000000000000000064211477326011500220470ustar00rootroot00000000000000# Output file: fsai.out.0 Iterations = 1 Final Relative Residual Norm = 2.749303e-15 # Output file: fsai.out.1 Iterations = 23 Final Relative Residual Norm = 8.691352e-09 # Output file: fsai.out.2 Iterations = 23 Final Relative Residual Norm = 8.691352e-09 # Output file: fsai.out.3 Iterations = 23 Final Relative Residual Norm = 8.691352e-09 # Output file: fsai.out.4 Iterations = 19 Final Relative Residual Norm = 8.939605e-09 # Output file: fsai.out.5 Iterations = 13 Final Relative Residual Norm = 9.676493e-09 # Output file: fsai.out.6 Iterations = 13 Final Relative Residual Norm = 4.052388e-09 # Output file: fsai.out.7 Iterations = 18 Final Relative Residual Norm = 8.582135e-09 # Output file: fsai.out.8 Iterations = 12 Final Relative Residual Norm = 4.959354e-09 # Output file: fsai.out.9 Iterations = 16 Final Relative Residual Norm = 4.823866e-09 # Output file: fsai.out.10 Iterations = 17 Final Relative Residual Norm = 9.617105e-09 # Output file: fsai.out.11 Iterations = 23 Final Relative Residual Norm = 6.181709e-09 # Output file: fsai.out.12 Iterations = 26 Final Relative Residual Norm = 6.972951e-09 # Output file: fsai.out.13 Iterations = 27 Final Relative Residual Norm = 5.307599e-09 # Output file: fsai.out.14 Iterations = 78 Final Relative Residual Norm = 3.771384e-09 # Output file: fsai.out.15 Iterations = 78 Final Relative Residual Norm = 5.047449e-09 # Output file: fsai.out.16 Iterations = 171 Final Relative Residual Norm = 4.772278e-09 # Output file: fsai.out.17 Iterations = 126 Final Relative Residual Norm = 8.487749e-09 # Output file: fsai.out.18 Iterations = 184 Final Relative Residual Norm = 7.799267e-09 # Output file: fsai.out.100 Iterations = 1 Final Relative Residual Norm = 7.571037e-16 # Output file: fsai.out.101 Iterations = 22 Final Relative Residual Norm = 7.482225e-09 # Output file: fsai.out.102 Iterations = 22 Final Relative Residual Norm = 7.482225e-09 # Output file: fsai.out.103 Iterations = 22 Final Relative Residual Norm = 7.482225e-09 # Output file: fsai.out.104 Iterations = 6 Final Relative Residual Norm = 1.770040e-09 # Output file: fsai.out.105 Iterations = 4 Final Relative Residual Norm = 6.400389e-09 # Output file: fsai.out.106 Iterations = 4 Final Relative Residual Norm = 7.626472e-09 # Output file: fsai.out.107 Iterations = 7 Final Relative Residual Norm = 5.411192e-09 # Output file: fsai.out.108 Iterations = 5 Final Relative Residual Norm = 4.951758e-10 # Output file: fsai.out.109 Iterations = 6 Final Relative Residual Norm = 9.572177e-09 # Output file: fsai.out.110 Iterations = 7 Final Relative Residual Norm = 1.624844e-09 # Output file: fsai.out.111 Iterations = 9 Final Relative Residual Norm = 1.023579e-09 # Output file: fsai.out.112 Iterations = 9 Final Relative Residual Norm = 9.228804e-09 # Output file: fsai.out.113 Iterations = 10 Final Relative Residual Norm = 1.921603e-09 # Output file: fsai.out.114 Iterations = 24 Final Relative Residual Norm = 1.826448e-09 # Output file: fsai.out.115 Iterations = 27 Final Relative Residual Norm = 9.403460e-09 # Output file: fsai.out.116 Iterations = 34 Final Relative Residual Norm = 1.473745e-09 # Output file: fsai.out.117 Iterations = 30 Final Relative Residual Norm = 2.330513e-09 # Output file: fsai.out.118 Iterations = 35 Final Relative Residual Norm = 2.996136e-09 hypre-2.33.0/src/test/TEST_ij/fsai.sh000077500000000000000000000026511477326011500172300ustar00rootroot00000000000000#!/bin/bash # Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) TNAME=`basename $0 .sh` RTOL=$1 ATOL=$2 #============================================================================= # compare with baseline case #============================================================================= FILES="\ ${TNAME}.out.0\ ${TNAME}.out.1\ ${TNAME}.out.2\ ${TNAME}.out.3\ ${TNAME}.out.4\ ${TNAME}.out.5\ ${TNAME}.out.6\ ${TNAME}.out.7\ ${TNAME}.out.8\ ${TNAME}.out.9\ ${TNAME}.out.10\ ${TNAME}.out.11\ ${TNAME}.out.12\ ${TNAME}.out.13\ ${TNAME}.out.14\ ${TNAME}.out.15\ ${TNAME}.out.16\ ${TNAME}.out.17\ ${TNAME}.out.18\ ${TNAME}.out.100\ ${TNAME}.out.101\ ${TNAME}.out.102\ ${TNAME}.out.103\ ${TNAME}.out.104\ ${TNAME}.out.105\ ${TNAME}.out.106\ ${TNAME}.out.107\ ${TNAME}.out.108\ ${TNAME}.out.109\ ${TNAME}.out.110\ ${TNAME}.out.111\ ${TNAME}.out.112\ ${TNAME}.out.113\ ${TNAME}.out.114\ ${TNAME}.out.115\ ${TNAME}.out.116\ ${TNAME}.out.117\ ${TNAME}.out.118\ " for i in $FILES do echo "# Output file: $i" tail -3 $i done > ${TNAME}.out # Make sure that the output file is reasonable RUNCOUNT=`echo $FILES | wc -w` OUTCOUNT=`grep "Iterations" ${TNAME}.out | wc -l` if [ "$OUTCOUNT" != "$RUNCOUNT" ]; then echo "Incorrect number of runs in ${TNAME}.out" >&2 fi hypre-2.33.0/src/test/TEST_ij/ilu.jobs000077500000000000000000000055621477326011500174260ustar00rootroot00000000000000#!/bin/bash # Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) # # hypre_ILU tests # Tests ILU(0), ILUK and ILUK solvers sequentially # Tests Parallel combination of ILU solvers # Tests ILU-(Flex)GMRES # Test AMG with ILU as a complex smoother # mpirun -np 1 ./ij -solver 80 -ilu_type 0 -ilu_lfil 0 > ilu.out.300 mpirun -np 1 ./ij -solver 80 -ilu_type 0 -ilu_lfil 1 > ilu.out.301 mpirun -np 1 ./ij -solver 80 -ilu_type 1 -ilu_droptol 1.0e-2 -ilu_max_row_nnz 1000 > ilu.out.302 # parallel ILU # BJ mpirun -np 2 ./ij -solver 80 -ilu_type 0 -ilu_lfil 1 > ilu.out.303 mpirun -np 2 ./ij -solver 80 -ilu_type 1 -ilu_droptol 1.0e-2 -ilu_max_row_nnz 1000 > ilu.out.304 # GMRES+ILU mpirun -np 2 ./ij -solver 80 -ilu_type 10 -ilu_lfil 1 -ilu_schur_max_iter 5 > ilu.out.305 mpirun -np 2 ./ij -solver 80 -ilu_type 11 -ilu_droptol 1.0e-2 -ilu_max_row_nnz 1000 -ilu_schur_max_iter 5 > ilu.out.306 # NSH+ILU mpirun -np 2 ./ij -solver 80 -ilu_type 20 -ilu_lfil 1 -ilu_schur_max_iter 5 > ilu.out.307 mpirun -np 2 ./ij -solver 80 -ilu_type 21 -ilu_droptol 1.0e-2 -ilu_max_row_nnz 1000 -ilu_schur_max_iter 5 > ilu.out.308 # RAS+ILU mpirun -np 2 ./ij -solver 80 -ilu_type 30 -ilu_lfil 1 > ilu.out.309 mpirun -np 2 ./ij -solver 80 -ilu_type 31 -ilu_droptol 1.0e-2 -ilu_max_row_nnz 1000 > ilu.out.310 # ddPQ-GMRES+ILU mpirun -np 2 ./ij -solver 80 -ilu_type 40 -ilu_lfil 1 -ilu_schur_max_iter 5 > ilu.out.311 mpirun -np 2 ./ij -solver 80 -ilu_type 41 -ilu_droptol 1.0e-2 -ilu_max_row_nnz 1000 -ilu_schur_max_iter 5 > ilu.out.312 ## ILU-GMRES mpirun -np 2 ./ij -solver 81 -ilu_type 0 -ilu_lfil 0 > ilu.out.313 mpirun -np 2 ./ij -solver 81 -ilu_type 1 -ilu_droptol 1.0e-2 -ilu_max_row_nnz 1000 > ilu.out.314 mpirun -np 2 ./ij -solver 81 -ilu_type 30 -ilu_lfil 0 > ilu.out.315 mpirun -np 2 ./ij -solver 81 -ilu_type 31 -ilu_droptol 1.0e-2 -ilu_max_row_nnz 1000 > ilu.out.316 ## ILU-FlexGMRES mpirun -np 2 ./ij -solver 82 -ilu_type 10 -ilu_lfil 0 -ilu_schur_max_iter 5 > ilu.out.317 mpirun -np 2 ./ij -solver 82 -ilu_type 11 -ilu_droptol 1.0e-2 -ilu_max_row_nnz 1000 -ilu_schur_max_iter 5 > ilu.out.318 mpirun -np 2 ./ij -solver 82 -ilu_type 20 -ilu_lfil 0 -ilu_schur_max_iter 5 > ilu.out.319 mpirun -np 2 ./ij -solver 82 -ilu_type 21 -ilu_droptol 1.0e-2 -ilu_max_row_nnz 1000 -ilu_schur_max_iter 5 > ilu.out.320 mpirun -np 2 ./ij -solver 82 -ilu_type 40 -ilu_lfil 0 -ilu_schur_max_iter 5 > ilu.out.321 mpirun -np 2 ./ij -solver 82 -ilu_type 41 -ilu_droptol 1.0e-2 -ilu_max_row_nnz 1000 -ilu_schur_max_iter 5 > ilu.out.322 ## RAP-ILU mpirun -np 2 ./ij -solver 82 -ilu_type 50 -ilu_lfil 0 > ilu.out.323 ## ILU smoother for AMG mpirun -np 2 ./ij -solver 0 -smtype 5 -smlv 1 -ilu_type 30 > ilu.out.324 mpirun -np 2 ./ij -solver 0 -smtype 15 -smlv 1 -ilu_type 30 > ilu.out.325 hypre-2.33.0/src/test/TEST_ij/ilu.saved000066400000000000000000000052451477326011500175660ustar00rootroot00000000000000# Output file: solvers.out.300 hypre_ILU Iterations = 85 Final Relative Residual Norm = 9.266244e-09 # Output file: solvers.out.301 hypre_ILU Iterations = 40 Final Relative Residual Norm = 9.772377e-09 # Output file: solvers.out.302 hypre_ILU Iterations = 23 Final Relative Residual Norm = 5.512717e-09 # Output file: solvers.out.303 hypre_ILU Iterations = 64 Final Relative Residual Norm = 8.558467e-09 # Output file: solvers.out.304 hypre_ILU Iterations = 52 Final Relative Residual Norm = 9.189235e-09 # Output file: solvers.out.305 hypre_ILU Iterations = 38 Final Relative Residual Norm = 7.024121e-09 # Output file: solvers.out.306 hypre_ILU Iterations = 26 Final Relative Residual Norm = 7.556742e-09 # Output file: solvers.out.307 hypre_ILU Iterations = 38 Final Relative Residual Norm = 7.037599e-09 # Output file: solvers.out.308 hypre_ILU Iterations = 26 Final Relative Residual Norm = 7.593126e-09 # Output file: solvers.out.309 hypre_ILU Iterations = 49 Final Relative Residual Norm = 7.072947e-09 # Output file: solvers.out.310 hypre_ILU Iterations = 42 Final Relative Residual Norm = 6.699477e-09 # Output file: solvers.out.311 hypre_ILU Iterations = 36 Final Relative Residual Norm = 6.392185e-09 # Output file: solvers.out.312 hypre_ILU Iterations = 24 Final Relative Residual Norm = 5.953652e-09 # Output file: solvers.out.313 GMRES Iterations = 25 Final GMRES Relative Residual Norm = 3.968804e-09 # Output file: solvers.out.314 GMRES Iterations = 19 Final GMRES Relative Residual Norm = 7.026446e-09 # Output file: solvers.out.315 GMRES Iterations = 20 Final GMRES Relative Residual Norm = 7.908624e-09 # Output file: solvers.out.316 GMRES Iterations = 13 Final GMRES Relative Residual Norm = 7.969372e-09 # Output file: solvers.out.317 FlexGMRES Iterations = 17 Final FlexGMRES Relative Residual Norm = 9.152443e-09 # Output file: solvers.out.318 FlexGMRES Iterations = 9 Final FlexGMRES Relative Residual Norm = 5.768785e-09 # Output file: solvers.out.319 FlexGMRES Iterations = 17 Final FlexGMRES Relative Residual Norm = 9.133102e-09 # Output file: solvers.out.320 FlexGMRES Iterations = 9 Final FlexGMRES Relative Residual Norm = 6.299457e-09 # Output file: solvers.out.321 FlexGMRES Iterations = 17 Final FlexGMRES Relative Residual Norm = 4.489256e-09 # Output file: solvers.out.322 FlexGMRES Iterations = 8 Final FlexGMRES Relative Residual Norm = 3.082447e-09 # Output file: solvers.out.323 FlexGMRES Iterations = 18 Final FlexGMRES Relative Residual Norm = 4.133851e-09 # Output file: solvers.out.324 BoomerAMG Iterations = 8 Final Relative Residual Norm = 8.380440e-09 # Output file: solvers.out.325 BoomerAMG Iterations = 7 Final Relative Residual Norm = 7.074639e-09 hypre-2.33.0/src/test/TEST_ij/ilu.saved.aurora000066400000000000000000000050761477326011500210600ustar00rootroot00000000000000# Output file: ilu.out.300 hypre_ILU Iterations = 85 Final Relative Residual Norm = 9.266245e-09 # Output file: ilu.out.301 hypre_ILU Iterations = 40 Final Relative Residual Norm = 9.772377e-09 # Output file: ilu.out.302 hypre_ILU Iterations = 23 Final Relative Residual Norm = 5.512717e-09 # Output file: ilu.out.303 hypre_ILU Iterations = 64 Final Relative Residual Norm = 8.558468e-09 # Output file: ilu.out.304 hypre_ILU Iterations = 52 Final Relative Residual Norm = 9.189235e-09 # Output file: ilu.out.305 hypre_ILU Iterations = 39 Final Relative Residual Norm = 8.838452e-09 # Output file: ilu.out.306 hypre_ILU Iterations = 27 Final Relative Residual Norm = 6.194020e-09 # Output file: ilu.out.307 hypre_ILU Iterations = 39 Final Relative Residual Norm = 6.866281e-09 # Output file: ilu.out.308 hypre_ILU Iterations = 27 Final Relative Residual Norm = 9.107681e-09 # Output file: ilu.out.309 hypre_ILU Iterations = 49 Final Relative Residual Norm = 7.072947e-09 # Output file: ilu.out.310 hypre_ILU Iterations = 42 Final Relative Residual Norm = 6.699477e-09 # Output file: ilu.out.311 hypre_ILU Iterations = 36 Final Relative Residual Norm = 6.392185e-09 # Output file: ilu.out.312 hypre_ILU Iterations = 24 Final Relative Residual Norm = 5.953652e-09 # Output file: ilu.out.313 GMRES Iterations = 25 Final GMRES Relative Residual Norm = 3.968804e-09 # Output file: ilu.out.314 GMRES Iterations = 19 Final GMRES Relative Residual Norm = 7.026445e-09 # Output file: ilu.out.315 GMRES Iterations = 20 Final GMRES Relative Residual Norm = 7.908624e-09 # Output file: ilu.out.316 GMRES Iterations = 13 Final GMRES Relative Residual Norm = 7.969372e-09 # Output file: ilu.out.317 FlexGMRES Iterations = 17 Final FlexGMRES Relative Residual Norm = 7.140004e-09 # Output file: ilu.out.318 FlexGMRES Iterations = 9 Final FlexGMRES Relative Residual Norm = 9.362787e-09 # Output file: ilu.out.319 FlexGMRES Iterations = 17 Final FlexGMRES Relative Residual Norm = 8.299377e-09 # Output file: ilu.out.320 FlexGMRES Iterations = 9 Final FlexGMRES Relative Residual Norm = 3.716965e-09 # Output file: ilu.out.321 FlexGMRES Iterations = 17 Final FlexGMRES Relative Residual Norm = 4.489256e-09 # Output file: ilu.out.322 FlexGMRES Iterations = 8 Final FlexGMRES Relative Residual Norm = 3.082447e-09 # Output file: ilu.out.323 FlexGMRES Iterations = 18 Final FlexGMRES Relative Residual Norm = 3.782082e-09 # Output file: ilu.out.324 BoomerAMG Iterations = 10 Final Relative Residual Norm = 7.955485e-09 # Output file: ilu.out.325 BoomerAMG Iterations = 9 Final Relative Residual Norm = 2.327436e-09 hypre-2.33.0/src/test/TEST_ij/ilu.saved.lassen000066400000000000000000000052461477326011500210530ustar00rootroot00000000000000# Output file: solvers.out.300 hypre_ILU Iterations = 85 Final Relative Residual Norm = 9.266244e-09 # Output file: solvers.out.301 hypre_ILU Iterations = 40 Final Relative Residual Norm = 9.772377e-09 # Output file: solvers.out.302 hypre_ILU Iterations = 23 Final Relative Residual Norm = 5.512717e-09 # Output file: solvers.out.303 hypre_ILU Iterations = 64 Final Relative Residual Norm = 8.558467e-09 # Output file: solvers.out.304 hypre_ILU Iterations = 52 Final Relative Residual Norm = 9.189235e-09 # Output file: solvers.out.305 hypre_ILU Iterations = 39 Final Relative Residual Norm = 8.838452e-09 # Output file: solvers.out.306 hypre_ILU Iterations = 27 Final Relative Residual Norm = 6.194020e-09 # Output file: solvers.out.307 hypre_ILU Iterations = 39 Final Relative Residual Norm = 6.866281e-09 # Output file: solvers.out.308 hypre_ILU Iterations = 27 Final Relative Residual Norm = 9.107681e-09 # Output file: solvers.out.309 hypre_ILU Iterations = 49 Final Relative Residual Norm = 7.072947e-09 # Output file: solvers.out.310 hypre_ILU Iterations = 42 Final Relative Residual Norm = 6.699477e-09 # Output file: solvers.out.311 hypre_ILU Iterations = 35 Final Relative Residual Norm = 6.392185e-09 # Output file: solvers.out.312 hypre_ILU Iterations = 23 Final Relative Residual Norm = 5.953652e-09 # Output file: solvers.out.313 GMRES Iterations = 25 Final GMRES Relative Residual Norm = 3.968804e-09 # Output file: solvers.out.314 GMRES Iterations = 19 Final GMRES Relative Residual Norm = 7.026445e-09 # Output file: solvers.out.315 GMRES Iterations = 20 Final GMRES Relative Residual Norm = 7.908624e-09 # Output file: solvers.out.316 GMRES Iterations = 13 Final GMRES Relative Residual Norm = 7.969372e-09 # Output file: solvers.out.317 FlexGMRES Iterations = 17 Final FlexGMRES Relative Residual Norm = 7.140004e-09 # Output file: solvers.out.318 FlexGMRES Iterations = 9 Final FlexGMRES Relative Residual Norm = 9.362787e-09 # Output file: solvers.out.319 FlexGMRES Iterations = 17 Final FlexGMRES Relative Residual Norm = 8.299377e-09 # Output file: solvers.out.320 FlexGMRES Iterations = 9 Final FlexGMRES Relative Residual Norm = 3.716965e-09 # Output file: solvers.out.321 FlexGMRES Iterations = 17 Final FlexGMRES Relative Residual Norm = 4.489256e-09 # Output file: solvers.out.322 FlexGMRES Iterations = 9 Final FlexGMRES Relative Residual Norm = 3.082447e-09 # Output file: solvers.out.323 FlexGMRES Iterations = 18 Final FlexGMRES Relative Residual Norm = 3.782082e-09 # Output file: solvers.out.324 BoomerAMG Iterations = 11 Final Relative Residual Norm = 3.641397e-09 # Output file: solvers.out.325 BoomerAMG Iterations = 9 Final Relative Residual Norm = 3.551558e-09 hypre-2.33.0/src/test/TEST_ij/ilu.saved.lassen_cpu000066400000000000000000000050751477326011500217220ustar00rootroot00000000000000# Output file: ilu.out.300 hypre_ILU Iterations = 85 Final Relative Residual Norm = 9.266244e-09 # Output file: ilu.out.301 hypre_ILU Iterations = 40 Final Relative Residual Norm = 9.772377e-09 # Output file: ilu.out.302 hypre_ILU Iterations = 23 Final Relative Residual Norm = 5.512717e-09 # Output file: ilu.out.303 hypre_ILU Iterations = 64 Final Relative Residual Norm = 8.558467e-09 # Output file: ilu.out.304 hypre_ILU Iterations = 52 Final Relative Residual Norm = 9.189235e-09 # Output file: ilu.out.305 hypre_ILU Iterations = 38 Final Relative Residual Norm = 7.024121e-09 # Output file: ilu.out.306 hypre_ILU Iterations = 26 Final Relative Residual Norm = 7.556742e-09 # Output file: ilu.out.307 hypre_ILU Iterations = 38 Final Relative Residual Norm = 7.037599e-09 # Output file: ilu.out.308 hypre_ILU Iterations = 26 Final Relative Residual Norm = 7.593126e-09 # Output file: ilu.out.309 hypre_ILU Iterations = 49 Final Relative Residual Norm = 7.072947e-09 # Output file: ilu.out.310 hypre_ILU Iterations = 42 Final Relative Residual Norm = 6.699477e-09 # Output file: ilu.out.311 hypre_ILU Iterations = 36 Final Relative Residual Norm = 6.392185e-09 # Output file: ilu.out.312 hypre_ILU Iterations = 24 Final Relative Residual Norm = 5.953652e-09 # Output file: ilu.out.313 GMRES Iterations = 25 Final GMRES Relative Residual Norm = 3.968804e-09 # Output file: ilu.out.314 GMRES Iterations = 19 Final GMRES Relative Residual Norm = 7.026446e-09 # Output file: ilu.out.315 GMRES Iterations = 20 Final GMRES Relative Residual Norm = 7.908624e-09 # Output file: ilu.out.316 GMRES Iterations = 13 Final GMRES Relative Residual Norm = 7.969372e-09 # Output file: ilu.out.317 FlexGMRES Iterations = 17 Final FlexGMRES Relative Residual Norm = 9.152443e-09 # Output file: ilu.out.318 FlexGMRES Iterations = 9 Final FlexGMRES Relative Residual Norm = 5.768784e-09 # Output file: ilu.out.319 FlexGMRES Iterations = 17 Final FlexGMRES Relative Residual Norm = 9.133102e-09 # Output file: ilu.out.320 FlexGMRES Iterations = 9 Final FlexGMRES Relative Residual Norm = 6.299457e-09 # Output file: ilu.out.321 FlexGMRES Iterations = 17 Final FlexGMRES Relative Residual Norm = 4.489256e-09 # Output file: ilu.out.322 FlexGMRES Iterations = 8 Final FlexGMRES Relative Residual Norm = 3.082447e-09 # Output file: ilu.out.323 FlexGMRES Iterations = 18 Final FlexGMRES Relative Residual Norm = 4.133851e-09 # Output file: ilu.out.324 BoomerAMG Iterations = 8 Final Relative Residual Norm = 8.314480e-09 # Output file: ilu.out.325 BoomerAMG Iterations = 7 Final Relative Residual Norm = 7.035763e-09 hypre-2.33.0/src/test/TEST_ij/ilu.sh000077500000000000000000000023371477326011500171000ustar00rootroot00000000000000#!/bin/bash # Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) TNAME=`basename $0 .sh` RTOL=$1 ATOL=$2 FILES="\ ${TNAME}.out.300\ ${TNAME}.out.301\ ${TNAME}.out.302\ ${TNAME}.out.303\ ${TNAME}.out.304\ ${TNAME}.out.305\ ${TNAME}.out.306\ ${TNAME}.out.307\ ${TNAME}.out.308\ ${TNAME}.out.309\ ${TNAME}.out.310\ ${TNAME}.out.311\ ${TNAME}.out.312\ ${TNAME}.out.313\ ${TNAME}.out.314\ ${TNAME}.out.315\ ${TNAME}.out.316\ ${TNAME}.out.317\ ${TNAME}.out.318\ ${TNAME}.out.319\ ${TNAME}.out.320\ ${TNAME}.out.321\ ${TNAME}.out.322\ ${TNAME}.out.323\ ${TNAME}.out.324\ ${TNAME}.out.325\ " for i in $FILES do echo "# Output file: $i" tail -3 $i done > ${TNAME}.out # Make sure that the output file is reasonable RUNCOUNT=`echo $FILES | wc -w` OUTCOUNT=`grep "Iterations" ${TNAME}.out | wc -l` if [ "$OUTCOUNT" != "$RUNCOUNT" ]; then echo "Incorrect number of runs in ${TNAME}.out" >&2 fi #============================================================================= # remove temporary files #============================================================================= hypre-2.33.0/src/test/TEST_ij/interp.jobs000077500000000000000000000037041477326011500201320ustar00rootroot00000000000000#!/bin/bash # Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) #============================================================================= # ij: Run default case with different interpolation operators # 0: Extended+i interpolation # 1: FF interpolation # 2: standard interpolation # 3: Extended interpolation and truncation max 4 elmts per row # 4: FF interpolation and truncation max 4 elmts per row # 5: standard interpolation and truncation max 4 elmts per row # 6: Classical modified interpolation # 7: Mod Extended interpolation and truncation max 4 elmts per row # 8: Mod Extended+i interpolation and truncation max 4 elmts per row #============================================================================= mpirun -np 4 ./ij -rhsrand -n 15 15 10 -P 2 2 1 -Pmx 0 \ > interp.out.0 mpirun -np 4 ./ij -rhsrand -n 15 15 10 -P 2 2 1 -interptype 7 -Pmx 0\ > interp.out.1 mpirun -np 4 ./ij -rhsrand -n 15 15 10 -P 2 2 1 -interptype 8 -Pmx 0 \ > interp.out.2 mpirun -np 4 ./ij -rhsrand -n 15 15 10 -P 2 2 1 \ > interp.out.3 mpirun -np 4 ./ij -rhsrand -n 15 15 10 -P 2 2 1 -interptype 7 \ > interp.out.4 mpirun -np 4 ./ij -rhsrand -n 15 15 10 -P 2 2 1 -interptype 8 \ > interp.out.5 mpirun -np 4 ./ij -rhsrand -n 15 15 10 -P 2 2 1 -interptype 0 -Pmx 0 -falgout \ > interp.out.6 mpirun -np 4 ./ij -rhsrand -n 15 15 10 -P 2 2 1 -interptype 16 -Pmx 12 \ > interp.out.7 mpirun -np 4 ./ij -rhsrand -n 15 15 10 -P 2 2 1 -interptype 17 \ > interp.out.8 mpirun -np 4 ./ij -rhsrand -n 8 8 8 -sysL 2 -nf 2 -interptype 15 \ > interp.out.9 mpirun -np 4 ./ij -rhsrand -n 8 8 8 -sysL 2 -nf 2 -interptype 16 \ > interp.out.10 mpirun -np 4 ./ij -rhsrand -n 8 8 8 -sysL 2 -nf 2 -interptype 17 \ > interp.out.11 mpirun -np 4 ./ij -rhsrand -n 8 8 8 -sysL 2 -nf 2 -interptype 18 \ > interp.out.12 hypre-2.33.0/src/test/TEST_ij/interp.saved000066400000000000000000000043771477326011500203030ustar00rootroot00000000000000# Output file: interp.out.0 Average Convergence Factor = 0.199088 Complexity: grid = 1.571556 operator = 2.973333 cycle = 5.944218 # Output file: interp.out.1 Average Convergence Factor = 0.197964 Complexity: grid = 1.580000 operator = 2.885102 cycle = 5.765850 # Output file: interp.out.2 Average Convergence Factor = 0.181048 Complexity: grid = 1.572889 operator = 2.983469 cycle = 5.966327 # Output file: interp.out.3 Average Convergence Factor = 0.194063 Complexity: grid = 1.587556 operator = 2.684082 cycle = 5.365714 # Output file: interp.out.4 Average Convergence Factor = 0.195128 Complexity: grid = 1.588444 operator = 2.627483 cycle = 5.252517 # Output file: interp.out.5 Average Convergence Factor = 0.203482 Complexity: grid = 1.582667 operator = 2.662245 cycle = 5.324218 # Output file: interp.out.6 Average Convergence Factor = 0.166090 Complexity: grid = 1.713333 operator = 3.541020 cycle = 7.080340 # Output file: interp.out.7 Average Convergence Factor = 0.219604 Complexity: grid = 1.571556 operator = 2.958639 cycle = 5.916190 # Output file: interp.out.8 Average Convergence Factor = 0.194361 Complexity: grid = 1.586667 operator = 2.681224 cycle = 5.360748 # Output file: interp.out.9 Average Convergence Factor = 0.522598 Complexity: grid = 1.489258 operator = 2.126953 cycle = 4.251953 # Output file: interp.out.10 Average Convergence Factor = 0.467057 Complexity: grid = 1.474609 operator = 2.478906 cycle = 4.957109 # Output file: interp.out.11 Average Convergence Factor = 0.423068 Complexity: grid = 1.478516 operator = 2.503750 cycle = 5.005547 # Output file: interp.out.12 Average Convergence Factor = 0.428721 Complexity: grid = 1.479492 operator = 2.506016 cycle = 5.010078 hypre-2.33.0/src/test/TEST_ij/interp.saved.aurora000066400000000000000000000044001477326011500215560ustar00rootroot00000000000000# Output file: interp.out.0 Average Convergence Factor = 0.473381 Complexity: grid = 1.397778 operator = 3.521837 cycle = 7.043061 # Output file: interp.out.1 Average Convergence Factor = 0.474675 Complexity: grid = 1.400444 operator = 3.456939 cycle = 6.912177 # Output file: interp.out.2 Average Convergence Factor = 0.472783 Complexity: grid = 1.398667 operator = 3.508095 cycle = 7.015102 # Output file: interp.out.3 Average Convergence Factor = 0.469524 Complexity: grid = 1.410222 operator = 2.566327 cycle = 5.131565 # Output file: interp.out.4 Average Convergence Factor = 0.474961 Complexity: grid = 1.409778 operator = 2.539456 cycle = 5.075578 # Output file: interp.out.5 Average Convergence Factor = 0.484045 Complexity: grid = 1.403111 operator = 2.556667 cycle = 5.113061 # Output file: interp.out.6 Average Convergence Factor = 0.284534 Complexity: grid = 1.716889 operator = 3.594082 cycle = 7.186463 # Output file: interp.out.7 Average Convergence Factor = 0.508605 Complexity: grid = 1.412889 operator = 3.766871 cycle = 7.531293 # Output file: interp.out.8 Average Convergence Factor = 0.469524 Complexity: grid = 1.410222 operator = 2.566327 cycle = 5.131565 # Output file: interp.out.9 Average Convergence Factor = 0.795761 Complexity: grid = 1.460938 operator = 2.152031 cycle = 4.303359 # Output file: interp.out.10 Average Convergence Factor = 0.795949 Complexity: grid = 1.447266 operator = 2.585625 cycle = 5.170547 # Output file: interp.out.11 Average Convergence Factor = 0.764146 Complexity: grid = 1.429688 operator = 2.505000 cycle = 5.005000 # Output file: interp.out.12 Average Convergence Factor = 0.764224 Complexity: grid = 1.429688 operator = 2.502813 cycle = 5.000625 hypre-2.33.0/src/test/TEST_ij/interp.saved.lassen000066400000000000000000000043771477326011500215670ustar00rootroot00000000000000# Output file: interp.out.0 Average Convergence Factor = 0.468023 Complexity: grid = 1.400000 operator = 3.557007 cycle = 7.113401 # Output file: interp.out.1 Average Convergence Factor = 0.468239 Complexity: grid = 1.401778 operator = 3.477007 cycle = 6.952313 # Output file: interp.out.2 Average Convergence Factor = 0.472049 Complexity: grid = 1.399111 operator = 3.537415 cycle = 7.073741 # Output file: interp.out.3 Average Convergence Factor = 0.467056 Complexity: grid = 1.408889 operator = 2.556327 cycle = 5.110952 # Output file: interp.out.4 Average Convergence Factor = 0.468315 Complexity: grid = 1.406667 operator = 2.531361 cycle = 5.062109 # Output file: interp.out.5 Average Convergence Factor = 0.482765 Complexity: grid = 1.404444 operator = 2.561361 cycle = 5.122109 # Output file: interp.out.6 Average Convergence Factor = 0.284534 Complexity: grid = 1.716889 operator = 3.594082 cycle = 7.186463 # Output file: interp.out.7 Average Convergence Factor = 0.486438 Complexity: grid = 1.411556 operator = 3.768980 cycle = 7.536871 # Output file: interp.out.8 Average Convergence Factor = 0.467056 Complexity: grid = 1.408889 operator = 2.556327 cycle = 5.110952 # Output file: interp.out.9 Average Convergence Factor = 0.790196 Complexity: grid = 1.487305 operator = 2.181797 cycle = 4.363281 # Output file: interp.out.10 Average Convergence Factor = 0.797378 Complexity: grid = 1.471680 operator = 2.534453 cycle = 5.068203 # Output file: interp.out.11 Average Convergence Factor = 0.767811 Complexity: grid = 1.469727 operator = 2.535234 cycle = 5.070156 # Output file: interp.out.12 Average Convergence Factor = 0.767716 Complexity: grid = 1.465820 operator = 2.527891 cycle = 5.049453 hypre-2.33.0/src/test/TEST_ij/interp.saved.lassen_cpu000066400000000000000000000043771477326011500224360ustar00rootroot00000000000000# Output file: interp.out.0 Average Convergence Factor = 0.199088 Complexity: grid = 1.571556 operator = 2.973333 cycle = 5.944218 # Output file: interp.out.1 Average Convergence Factor = 0.197964 Complexity: grid = 1.580000 operator = 2.885102 cycle = 5.765850 # Output file: interp.out.2 Average Convergence Factor = 0.181048 Complexity: grid = 1.572889 operator = 2.983469 cycle = 5.966327 # Output file: interp.out.3 Average Convergence Factor = 0.194064 Complexity: grid = 1.587556 operator = 2.683946 cycle = 5.365442 # Output file: interp.out.4 Average Convergence Factor = 0.195128 Complexity: grid = 1.588444 operator = 2.627483 cycle = 5.252517 # Output file: interp.out.5 Average Convergence Factor = 0.203480 Complexity: grid = 1.582667 operator = 2.662245 cycle = 5.324218 # Output file: interp.out.6 Average Convergence Factor = 0.166090 Complexity: grid = 1.713333 operator = 3.541020 cycle = 7.080340 # Output file: interp.out.7 Average Convergence Factor = 0.219604 Complexity: grid = 1.571556 operator = 2.958639 cycle = 5.916190 # Output file: interp.out.8 Average Convergence Factor = 0.194359 Complexity: grid = 1.586667 operator = 2.681224 cycle = 5.360748 # Output file: interp.out.9 Average Convergence Factor = 0.522598 Complexity: grid = 1.489258 operator = 2.126953 cycle = 4.251953 # Output file: interp.out.10 Average Convergence Factor = 0.467547 Complexity: grid = 1.472656 operator = 2.464844 cycle = 4.928984 # Output file: interp.out.11 Average Convergence Factor = 0.423068 Complexity: grid = 1.478516 operator = 2.503750 cycle = 5.005547 # Output file: interp.out.12 Average Convergence Factor = 0.428721 Complexity: grid = 1.479492 operator = 2.506016 cycle = 5.010078 hypre-2.33.0/src/test/TEST_ij/interp.sh000077500000000000000000000022611477326011500176040ustar00rootroot00000000000000#!/bin/bash # Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) TNAME=`basename $0 .sh` RTOL=$1 ATOL=$2 #============================================================================= # compare with baseline case #============================================================================= FILES="\ ${TNAME}.out.0\ ${TNAME}.out.1\ ${TNAME}.out.2\ ${TNAME}.out.3\ ${TNAME}.out.4\ ${TNAME}.out.5\ ${TNAME}.out.6\ ${TNAME}.out.7\ ${TNAME}.out.8\ ${TNAME}.out.9\ ${TNAME}.out.10\ ${TNAME}.out.11\ ${TNAME}.out.12\ " for i in $FILES do echo "# Output file: $i" tail -21 $i | head -6 done > ${TNAME}.out # Make sure that the output file is reasonable RUNCOUNT=`echo $FILES | wc -w` OUTCOUNT=`grep "Complexity" ${TNAME}.out | wc -l` if [ "$OUTCOUNT" != "$RUNCOUNT" ]; then echo "Incorrect number of runs in ${TNAME}.out" >&2 fi #============================================================================= # remove temporary files #============================================================================= rm -f ${TNAME}.testdata* hypre-2.33.0/src/test/TEST_ij/io.jobs000077500000000000000000000057741477326011500172510ustar00rootroot00000000000000#!/bin/bash # Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) #============================================================================= # IJ input tests - Sequential #============================================================================= mpirun -np 1 ./ij -solver 2 -tol 1e-2 \ -frombinfile data/poisson_10x10x10_np1/IJ.A.i4f8 \ -rhsfrombinfile data/poisson_10x10x10_np1/IJ.b.i4f8 \ -x0frombinfile data/poisson_10x10x10_np1/IJ.x0.i4f8 > io.out.0 mpirun -np 1 ./ij -solver 2 -tol 1e-2 \ -frombinfile data/poisson_10x10x10_np1/IJ.A.i8f8 \ -rhsfrombinfile data/poisson_10x10x10_np1/IJ.b.i8f8 \ -x0frombinfile data/poisson_10x10x10_np1/IJ.x0.i8f8 > io.out.1 mpirun -np 1 ./ij -solver 2 -tol 1e-2 \ -frombinfile data/poisson_10x10x10_np1/IJ.A.i4f4 \ -rhsfrombinfile data/poisson_10x10x10_np1/IJ.b.i4f4 \ -x0frombinfile data/poisson_10x10x10_np1/IJ.x0.i4f4 > io.out.2 mpirun -np 1 ./ij -solver 2 -tol 1e-2 \ -frombinfile data/poisson_10x10x10_np1/IJ.A.i8f4 \ -rhsfrombinfile data/poisson_10x10x10_np1/IJ.b.i8f4 \ -x0frombinfile data/poisson_10x10x10_np1/IJ.x0.i8f4 > io.out.3 #============================================================================= # IJ output tests - Sequential #============================================================================= mpirun -np 1 ./ij -solver 2 -tol 1e-2 -printbin > io.out.50 mpirun -np 1 ./ij -solver 2 -tol 1e-2 -printbin \ -frombinfile IJ.out.A -rhsfrombinfile IJ.out.b \ -x0frombinfile IJ.out.x0 > io.out.51 #============================================================================= # IJ input tests - Parallel #============================================================================= mpirun -np 4 ./ij -solver 2 -tol 1e-2 \ -frombinfile data/poisson_10x10x10_np4/IJ.A.i4f8 \ -rhsfrombinfile data/poisson_10x10x10_np4/IJ.b.i4f8 \ -x0frombinfile data/poisson_10x10x10_np4/IJ.x0.i4f8 > io.out.100 mpirun -np 4 ./ij -solver 2 -tol 1e-2 \ -frombinfile data/poisson_10x10x10_np4/IJ.A.i8f8 \ -rhsfrombinfile data/poisson_10x10x10_np4/IJ.b.i8f8 \ -x0frombinfile data/poisson_10x10x10_np4/IJ.x0.i8f8 > io.out.101 mpirun -np 4 ./ij -solver 2 -tol 1e-2 \ -frombinfile data/poisson_10x10x10_np4/IJ.A.i4f4 \ -rhsfrombinfile data/poisson_10x10x10_np4/IJ.b.i4f4 \ -x0frombinfile data/poisson_10x10x10_np4/IJ.x0.i4f4 > io.out.102 mpirun -np 4 ./ij -solver 2 -tol 1e-2 \ -frombinfile data/poisson_10x10x10_np4/IJ.A.i8f4 \ -rhsfrombinfile data/poisson_10x10x10_np4/IJ.b.i8f4 \ -x0frombinfile data/poisson_10x10x10_np4/IJ.x0.i8f4 > io.out.103 #============================================================================= # IJ output tests - Sequential #============================================================================= mpirun -np 4 ./ij -solver 2 -tol 1e-2 -printbin > io.out.150 mpirun -np 4 ./ij -solver 2 -tol 1e-2 -printbin \ -frombinfile IJ.out.A -rhsfrombinfile IJ.out.b \ -x0frombinfile IJ.out.x0 > io.out.151 hypre-2.33.0/src/test/TEST_ij/io.saved000066400000000000000000000021051477326011500173740ustar00rootroot00000000000000# Output file: solvers.out.0 Iterations = 11 Final Relative Residual Norm = 6.733697e-03 # Output file: solvers.out.1 Iterations = 11 Final Relative Residual Norm = 6.733697e-03 # Output file: solvers.out.2 Iterations = 11 Final Relative Residual Norm = 6.733697e-03 # Output file: solvers.out.3 Iterations = 11 Final Relative Residual Norm = 6.733697e-03 # Output file: solvers.out.50 Iterations = 11 Final Relative Residual Norm = 6.733697e-03 # Output file: solvers.out.51 Iterations = 11 Final Relative Residual Norm = 6.733697e-03 # Output file: solvers.out.100 Iterations = 11 Final Relative Residual Norm = 6.733697e-03 # Output file: solvers.out.101 Iterations = 11 Final Relative Residual Norm = 6.733697e-03 # Output file: solvers.out.102 Iterations = 11 Final Relative Residual Norm = 6.733697e-03 # Output file: solvers.out.103 Iterations = 11 Final Relative Residual Norm = 6.733697e-03 # Output file: solvers.out.150 Iterations = 11 Final Relative Residual Norm = 6.733697e-03 # Output file: solvers.out.151 Iterations = 11 Final Relative Residual Norm = 6.733697e-03 hypre-2.33.0/src/test/TEST_ij/io.sh000077500000000000000000000020371477326011500167130ustar00rootroot00000000000000#!/bin/bash # Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) TNAME=`basename $0 .sh` RTOL=$1 ATOL=$2 FILES="\ ${TNAME}.out.0\ ${TNAME}.out.1\ ${TNAME}.out.2\ ${TNAME}.out.3\ ${TNAME}.out.50\ ${TNAME}.out.51\ ${TNAME}.out.100\ ${TNAME}.out.101\ ${TNAME}.out.102\ ${TNAME}.out.103\ ${TNAME}.out.150\ ${TNAME}.out.151\ " for i in $FILES do echo "# Output file: $i" tail -3 $i done > ${TNAME}.out # Make sure that the output file is reasonable RUNCOUNT=`echo $FILES | wc -w` OUTCOUNT=`grep "Iterations" ${TNAME}.out | wc -l` if [ "$OUTCOUNT" != "$RUNCOUNT" ]; then echo "Incorrect number of runs in ${TNAME}.out" >&2 fi #============================================================================= # remove temporary files #============================================================================= rm -rf IJ.out.A.0000?.bin IJ.out.b.0000?.bin IJ.out.x0.0000?.bin IJ.out.x.0000?.bin hypre-2.33.0/src/test/TEST_ij/lazy.jobs000077500000000000000000000012231477326011500176020ustar00rootroot00000000000000#!/bin/bash # Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) #============================================================================= # Test library lazy initialization (sequential and parallel) #============================================================================= mpirun -np 1 ./ij > lazy.out.1.a mpirun -np 1 ./ij -lazy_device_init 1 > lazy.out.1.b mpirun -np 4 ./ij > lazy.out.2.a mpirun -np 4 ./ij -lazy_device_init 1 > lazy.out.2.b hypre-2.33.0/src/test/TEST_ij/lazy.sh000077500000000000000000000017131477326011500172630ustar00rootroot00000000000000#!/bin/bash # Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) TNAME=`basename $0 .sh` tail -3 ${TNAME}.out.1.a | head -2 > ${TNAME}.testdata tail -3 ${TNAME}.out.1.b | head -2 > ${TNAME}.testdata.temp # Abuse HYPRE_NO_SAVED to skip the following diff with OMP if [ -z $HYPRE_NO_SAVED ]; then diff ${TNAME}.testdata ${TNAME}.testdata.temp >&2 fi tail -3 ${TNAME}.out.2.a | head -2 > ${TNAME}.testdata tail -3 ${TNAME}.out.2.b | head -2 > ${TNAME}.testdata.temp # Abuse HYPRE_NO_SAVED to skip the following diff with OMP if [ -z $HYPRE_NO_SAVED ]; then diff ${TNAME}.testdata ${TNAME}.testdata.temp >&2 fi #============================================================================= # remove temporary files #============================================================================= rm -f ${TNAME}.testdata* hypre-2.33.0/src/test/TEST_ij/matrix.jobs000077500000000000000000000051151477326011500201330ustar00rootroot00000000000000#!/bin/bash # Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) #============================================================================= # ij -falgout -interptype 0 -Pmx 0: tests different ways of generating IJMatrix #============================================================================= mpirun -np 2 ./ij -rhsrand > matrix.out.0 mpirun -np 2 ./ij -rhsrand -exact_size > matrix.out.1 mpirun -np 2 ./ij -rhsrand -storage_low > matrix.out.2 mpirun -np 4 ./ij -fromfile A_tstoffd -rhsfromfile b_tstoffd > matrix.out.3 mpirun -np 2 ./ij -test_ij -solver 2 -tol 0 -max_iter 5 -chunk 1 -add 1 > matrix.out.4 mpirun -np 2 ./ij -test_ij -solver 2 -tol 0 -max_iter 5 -chunk 1 -add 1 -off_proc 1 > matrix.out.5 mpirun -np 2 ./ij -test_ij -solver 2 -tol 0 -max_iter 5 -chunk 1 -off_proc 1 > matrix.out.6 mpirun -np 2 ./ij -test_ij -solver 2 -tol 0 -max_iter 5 -chunk 1 -off_proc 1 -omp 1 > matrix.out.7 mpirun -np 2 ./ij -test_ij -solver 2 -tol 0 -max_iter 5 -chunk 1 -off_proc 1 -omp 1 -add 1 > matrix.out.8 mpirun -np 2 ./ij -test_ij -solver 2 -tol 0 -max_iter 5 -chunk 1 -omp 1 -exact_size > matrix.out.9 mpirun -np 2 ./ij -test_ij -solver 2 -tol 0 -max_iter 5 -chunk 1 -omp 1 > matrix.out.10 mpirun -np 3 ./ij -fromfile test.A -rhsfromfile test.b > matrix.out.11 mpirun -np 2 ./ij -test_ij -solver 2 -tol 0 -max_iter 5 -chunk 1 -add 1 -check_constant 1 > matrix.out.12 #============================================================================= # Test matrix scaling. Solver: BJ-GMRES #============================================================================= # Sequential - Left scaling mpirun -np 1 ./ij -fromfile data/beam_tet_dof459_np1/A.IJ -solver 4 -tol 1e-2 -k 100 -test_scaling 1 > matrix.out.100 # Sequential - Right scaling mpirun -np 1 ./ij -fromfile data/beam_tet_dof459_np1/A.IJ -solver 4 -tol 1e-2 -k 100 -test_scaling 2 > matrix.out.101 # Sequential - Left and right scaling mpirun -np 1 ./ij -fromfile data/beam_tet_dof459_np1/A.IJ -solver 4 -tol 1e-2 -k 100 -test_scaling 3 > matrix.out.102 # Parallel - Left scaling mpirun -np 4 ./ij -fromfile data/beam_tet_dof2475_np4/A.IJ -solver 4 -tol 9e-1 -k 100 -test_scaling 1 > matrix.out.110 # Parallel - Right scaling mpirun -np 4 ./ij -fromfile data/beam_tet_dof2475_np4/A.IJ -solver 4 -tol 9e-1 -k 100 -test_scaling 2 > matrix.out.111 # Parallel - Left and right scaling mpirun -np 4 ./ij -fromfile data/beam_tet_dof2475_np4/A.IJ -solver 4 -tol 9e-1 -k 100 -test_scaling 3 > matrix.out.112 hypre-2.33.0/src/test/TEST_ij/matrix.saved000066400000000000000000000034271477326011500203010ustar00rootroot00000000000000# Output file: matrix.out.0 BoomerAMG Iterations = 11 Final Relative Residual Norm = 4.161327e-09 # Output file: matrix.out.1 BoomerAMG Iterations = 11 Final Relative Residual Norm = 4.161327e-09 # Output file: matrix.out.2 BoomerAMG Iterations = 11 Final Relative Residual Norm = 4.161327e-09 # Output file: matrix.out.3 BoomerAMG Iterations = 1 Final Relative Residual Norm = 0.000000e+00 # Output file: matrix.out.4 Iterations = 5 Final Relative Residual Norm = 3.515462e-01 # Output file: matrix.out.5 Iterations = 5 Final Relative Residual Norm = 4.233149e-01 # Output file: matrix.out.6 Iterations = 5 Final Relative Residual Norm = 3.515462e-01 # Output file: matrix.out.7 Iterations = 5 Final Relative Residual Norm = 3.515462e-01 # Output file: matrix.out.8 Iterations = 5 Final Relative Residual Norm = 4.233149e-01 # Output file: matrix.out.9 Iterations = 5 Final Relative Residual Norm = 3.515462e-01 # Output file: matrix.out.10 Iterations = 5 Final Relative Residual Norm = 3.515462e-01 # Output file: matrix.out.11 BoomerAMG Iterations = 8 Final Relative Residual Norm = 2.638706e-09 # Output file: matrix.out.12 Iterations = 5 Final Relative Residual Norm = 3.515462e-01 # Output file: matrix.out.100 GMRES Iterations = 79 Final GMRES Relative Residual Norm = 9.996735e-03 # Output file: matrix.out.101 GMRES Iterations = 79 Final GMRES Relative Residual Norm = 7.176706e-03 # Output file: matrix.out.102 GMRES Iterations = 74 Final GMRES Relative Residual Norm = 7.155117e-03 # Output file: matrix.out.110 GMRES Iterations = 13 Final GMRES Relative Residual Norm = 8.997992e-01 # Output file: matrix.out.111 GMRES Iterations = 35 Final GMRES Relative Residual Norm = 8.909955e-01 # Output file: matrix.out.112 GMRES Iterations = 6 Final GMRES Relative Residual Norm = 8.963555e-01hypre-2.33.0/src/test/TEST_ij/matrix.saved.aurora000066400000000000000000000034321477326011500215650ustar00rootroot00000000000000# Output file: matrix.out.0 BoomerAMG Iterations = 24 Final Relative Residual Norm = 6.703514e-09 # Output file: matrix.out.1 BoomerAMG Iterations = 24 Final Relative Residual Norm = 6.703514e-09 # Output file: matrix.out.2 BoomerAMG Iterations = 24 Final Relative Residual Norm = 6.703514e-09 # Output file: matrix.out.3 BoomerAMG Iterations = 1 Final Relative Residual Norm = 0.000000e+00 # Output file: matrix.out.4 Iterations = 5 Final Relative Residual Norm = 3.515462e-01 # Output file: matrix.out.5 Iterations = 5 Final Relative Residual Norm = 4.233149e-01 # Output file: matrix.out.6 Iterations = 5 Final Relative Residual Norm = 3.515462e-01 # Output file: matrix.out.7 Iterations = 5 Final Relative Residual Norm = 3.515462e-01 # Output file: matrix.out.8 Iterations = 5 Final Relative Residual Norm = 4.233149e-01 # Output file: matrix.out.9 Iterations = 5 Final Relative Residual Norm = 3.515462e-01 # Output file: matrix.out.10 Iterations = 5 Final Relative Residual Norm = 3.515462e-01 # Output file: matrix.out.11 BoomerAMG Iterations = 14 Final Relative Residual Norm = 3.055519e-09 # Output file: matrix.out.12 Iterations = 5 Final Relative Residual Norm = 3.515462e-01 # Output file: matrix.out.100 GMRES Iterations = 79 Final GMRES Relative Residual Norm = 9.996735e-03 # Output file: matrix.out.101 GMRES Iterations = 79 Final GMRES Relative Residual Norm = 7.176706e-03 # Output file: matrix.out.102 GMRES Iterations = 74 Final GMRES Relative Residual Norm = 7.155117e-03 # Output file: matrix.out.110 GMRES Iterations = 13 Final GMRES Relative Residual Norm = 8.997992e-01 # Output file: matrix.out.111 GMRES Iterations = 35 Final GMRES Relative Residual Norm = 8.909955e-01 # Output file: matrix.out.112 GMRES Iterations = 6 Final GMRES Relative Residual Norm = 8.963555e-01 hypre-2.33.0/src/test/TEST_ij/matrix.saved.lassen000066400000000000000000000034311477326011500215600ustar00rootroot00000000000000# Output file: matrix.out.0 BoomerAMG Iterations = 23 Final Relative Residual Norm = 8.600534e-09 # Output file: matrix.out.1 BoomerAMG Iterations = 23 Final Relative Residual Norm = 8.600534e-09 # Output file: matrix.out.2 BoomerAMG Iterations = 23 Final Relative Residual Norm = 8.600534e-09 # Output file: matrix.out.3 BoomerAMG Iterations = 1 Final Relative Residual Norm = 0.000000e+00 # Output file: matrix.out.4 Iterations = 5 Final Relative Residual Norm = 3.515462e-01 # Output file: matrix.out.5 Iterations = 5 Final Relative Residual Norm = 4.233149e-01 # Output file: matrix.out.6 Iterations = 5 Final Relative Residual Norm = 3.515462e-01 # Output file: matrix.out.7 Iterations = 5 Final Relative Residual Norm = 3.515462e-01 # Output file: matrix.out.8 Iterations = 5 Final Relative Residual Norm = 4.233149e-01 # Output file: matrix.out.9 Iterations = 5 Final Relative Residual Norm = 3.515462e-01 # Output file: matrix.out.10 Iterations = 5 Final Relative Residual Norm = 3.515462e-01 # Output file: matrix.out.11 BoomerAMG Iterations = 14 Final Relative Residual Norm = 3.055519e-09 # Output file: matrix.out.12 Iterations = 5 Final Relative Residual Norm = 3.515462e-01 # Output file: matrix.out.100 GMRES Iterations = 79 Final GMRES Relative Residual Norm = 9.996735e-03 # Output file: matrix.out.101 GMRES Iterations = 79 Final GMRES Relative Residual Norm = 7.176706e-03 # Output file: matrix.out.102 GMRES Iterations = 74 Final GMRES Relative Residual Norm = 7.155117e-03 # Output file: matrix.out.110 GMRES Iterations = 13 Final GMRES Relative Residual Norm = 8.997992e-01 # Output file: matrix.out.111 GMRES Iterations = 35 Final GMRES Relative Residual Norm = 8.909955e-01 # Output file: matrix.out.112 GMRES Iterations = 6 Final GMRES Relative Residual Norm = 8.963555e-01 hypre-2.33.0/src/test/TEST_ij/matrix.saved.lassen_cpu000066400000000000000000000034301477326011500224260ustar00rootroot00000000000000# Output file: matrix.out.0 BoomerAMG Iterations = 11 Final Relative Residual Norm = 4.156373e-09 # Output file: matrix.out.1 BoomerAMG Iterations = 11 Final Relative Residual Norm = 4.156373e-09 # Output file: matrix.out.2 BoomerAMG Iterations = 11 Final Relative Residual Norm = 4.156373e-09 # Output file: matrix.out.3 BoomerAMG Iterations = 1 Final Relative Residual Norm = 0.000000e+00 # Output file: matrix.out.4 Iterations = 5 Final Relative Residual Norm = 3.515462e-01 # Output file: matrix.out.5 Iterations = 5 Final Relative Residual Norm = 4.233149e-01 # Output file: matrix.out.6 Iterations = 5 Final Relative Residual Norm = 3.515462e-01 # Output file: matrix.out.7 Iterations = 5 Final Relative Residual Norm = 3.515462e-01 # Output file: matrix.out.8 Iterations = 5 Final Relative Residual Norm = 4.233149e-01 # Output file: matrix.out.9 Iterations = 5 Final Relative Residual Norm = 3.515462e-01 # Output file: matrix.out.10 Iterations = 5 Final Relative Residual Norm = 3.515462e-01 # Output file: matrix.out.11 BoomerAMG Iterations = 8 Final Relative Residual Norm = 2.638706e-09 # Output file: matrix.out.12 Iterations = 5 Final Relative Residual Norm = 3.515462e-01 # Output file: matrix.out.100 GMRES Iterations = 79 Final GMRES Relative Residual Norm = 9.996735e-03 # Output file: matrix.out.101 GMRES Iterations = 79 Final GMRES Relative Residual Norm = 7.176706e-03 # Output file: matrix.out.102 GMRES Iterations = 74 Final GMRES Relative Residual Norm = 7.155117e-03 # Output file: matrix.out.110 GMRES Iterations = 13 Final GMRES Relative Residual Norm = 8.997992e-01 # Output file: matrix.out.111 GMRES Iterations = 35 Final GMRES Relative Residual Norm = 8.909955e-01 # Output file: matrix.out.112 GMRES Iterations = 6 Final GMRES Relative Residual Norm = 8.963555e-01 hypre-2.33.0/src/test/TEST_ij/matrix.sh000077500000000000000000000036711477326011500176150ustar00rootroot00000000000000#!/bin/bash # Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) TNAME=`basename $0 .sh` RTOL=$1 ATOL=$2 #============================================================================= # IJ: tests different ways of generating IJMatrix diffs it against 1 proc case #============================================================================= tail -17 ${TNAME}.out.0 | head -6 > ${TNAME}.testdata #============================================================================= tail -17 ${TNAME}.out.1 | head -6 > ${TNAME}.testdata.temp diff ${TNAME}.testdata ${TNAME}.testdata.temp >&2 #============================================================================= tail -17 ${TNAME}.out.2 | head -6 > ${TNAME}.testdata.temp diff ${TNAME}.testdata ${TNAME}.testdata.temp >&2 #============================================================================= # compare with baseline case #============================================================================= FILES="\ ${TNAME}.out.0\ ${TNAME}.out.1\ ${TNAME}.out.2\ ${TNAME}.out.3\ ${TNAME}.out.4\ ${TNAME}.out.5\ ${TNAME}.out.6\ ${TNAME}.out.7\ ${TNAME}.out.8\ ${TNAME}.out.9\ ${TNAME}.out.10\ ${TNAME}.out.11\ ${TNAME}.out.12\ ${TNAME}.out.100\ ${TNAME}.out.101\ ${TNAME}.out.102\ ${TNAME}.out.110\ ${TNAME}.out.111\ ${TNAME}.out.112\ " for i in $FILES do echo "# Output file: $i" tail -3 $i done > ${TNAME}.out # Make sure that the output file is reasonable RUNCOUNT=`echo $FILES | wc -w` OUTCOUNT=`grep "Iterations" ${TNAME}.out | wc -l` if [ "$OUTCOUNT" != "$RUNCOUNT" ]; then echo "Incorrect number of runs in ${TNAME}.out" >&2 fi #============================================================================= # remove temporary files #============================================================================= rm -f ${TNAME}.testdata* hypre-2.33.0/src/test/TEST_ij/nonmixedint.jobs000077500000000000000000000012231477326011500211570ustar00rootroot00000000000000#!/bin/bash # Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) #============================================================================= # ij: cases that cannot run with mixed-int # 0: coarsening.out.10 # 1: solvers.out.6 # 2: solvers.out.7 #============================================================================= mpirun -np 8 ./ij -P 2 2 2 -cgc -interptype 0 -Pmx 0 > nonmixedint.out.0 mpirun -np 2 ./ij -solver 7 -rhsrand > nonmixedint.out.1 mpirun -np 2 ./ij -solver 8 -rhsrand > nonmixedint.out.2 hypre-2.33.0/src/test/TEST_ij/nonmixedint.saved000066400000000000000000000004601477326011500213230ustar00rootroot00000000000000# Output file: nonmixedint.out.0 BoomerAMG Iterations = 16 Final Relative Residual Norm = 3.804106e-09 # Output file: nonmixedint.out.1 GMRES Iterations = 32 Final GMRES Relative Residual Norm = 6.756785e-09 # Output file: nonmixedint.out.2 Iterations = 22 Final Relative Residual Norm = 9.936851e-09 hypre-2.33.0/src/test/TEST_ij/nonmixedint.saved.aurora000066400000000000000000000004601477326011500226130ustar00rootroot00000000000000# Output file: nonmixedint.out.0 BoomerAMG Iterations = 18 Final Relative Residual Norm = 4.636260e-09 # Output file: nonmixedint.out.1 GMRES Iterations = 32 Final GMRES Relative Residual Norm = 6.806870e-09 # Output file: nonmixedint.out.2 Iterations = 22 Final Relative Residual Norm = 9.936851e-09 hypre-2.33.0/src/test/TEST_ij/nonmixedint.saved.lassen000066400000000000000000000004601477326011500226070ustar00rootroot00000000000000# Output file: nonmixedint.out.0 BoomerAMG Iterations = 18 Final Relative Residual Norm = 4.636260e-09 # Output file: nonmixedint.out.1 GMRES Iterations = 32 Final GMRES Relative Residual Norm = 6.806870e-09 # Output file: nonmixedint.out.2 Iterations = 22 Final Relative Residual Norm = 9.936851e-09 hypre-2.33.0/src/test/TEST_ij/nonmixedint.saved.lassen_cpu000066400000000000000000000004601477326011500234560ustar00rootroot00000000000000# Output file: nonmixedint.out.0 BoomerAMG Iterations = 16 Final Relative Residual Norm = 3.804106e-09 # Output file: nonmixedint.out.1 GMRES Iterations = 32 Final GMRES Relative Residual Norm = 6.756785e-09 # Output file: nonmixedint.out.2 Iterations = 22 Final Relative Residual Norm = 9.936851e-09 hypre-2.33.0/src/test/TEST_ij/nonmixedint.sh000077500000000000000000000017721477326011500206450ustar00rootroot00000000000000#!/bin/bash # Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) TNAME=`basename $0 .sh` RTOL=$1 ATOL=$2 #============================================================================= # compare with baseline case #============================================================================= FILES="\ ${TNAME}.out.0\ ${TNAME}.out.1\ ${TNAME}.out.2\ " for i in $FILES do echo "# Output file: $i" tail -3 $i done > ${TNAME}.out # Make sure that the output file is reasonable RUNCOUNT=`echo $FILES | wc -w` OUTCOUNT=`grep "Iterations" ${TNAME}.out | wc -l` if [ "$OUTCOUNT" != "$RUNCOUNT" ]; then echo "Incorrect number of runs in ${TNAME}.out" >&2 fi #============================================================================= # remove temporary files #============================================================================= #rm -f ${TNAME}.testdata* hypre-2.33.0/src/test/TEST_ij/posneg.jobs000077500000000000000000000017651477326011500201310ustar00rootroot00000000000000#!/bin/bash # Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) ## Solve Ax=b and -Ax=b, convergence should be the same mpirun -np 2 ./ij -solver 0 -rhsrand -negA 0 > posneg.out.400.p mpirun -np 2 ./ij -solver 0 -rhsrand -negA 1 > posneg.out.400.n mpirun -np 3 ./ij -solver 3 -rhsrand -negA 0 > posneg.out.401.p mpirun -np 3 ./ij -solver 3 -rhsrand -negA 1 > posneg.out.401.n mpirun -np 4 ./ij -cheby_eig_est 10 -cheby_order 4 -cheby_variant 0 -cheby_scale 1 -rlx 16 -negA 0 > posneg.out.402.p mpirun -np 4 ./ij -cheby_eig_est 10 -cheby_order 4 -cheby_variant 0 -cheby_scale 1 -rlx 16 -negA 1 > posneg.out.402.n mpirun -np 4 ./ij -solver 3 -cheby_eig_est 0 -cheby_order 3 -cheby_variant 1 -cheby_scale 1 -rlx 16 -negA 0 > posneg.out.403.p mpirun -np 4 ./ij -solver 3 -cheby_eig_est 0 -cheby_order 3 -cheby_variant 1 -cheby_scale 1 -rlx 16 -negA 1 > posneg.out.403.n hypre-2.33.0/src/test/TEST_ij/posneg.sh000077500000000000000000000027541477326011500176050ustar00rootroot00000000000000#!/bin/bash # Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) TNAME=`basename $0 .sh` tail -3 ${TNAME}.out.400.p | head -2 > ${TNAME}.testdata tail -3 ${TNAME}.out.400.n | head -2 > ${TNAME}.testdata.temp # Abuse HYPRE_NO_SAVED to skip the following diff with OMP if [ -z $HYPRE_NO_SAVED ]; then diff ${TNAME}.testdata ${TNAME}.testdata.temp >&2 fi tail -3 ${TNAME}.out.401.p | head -2 > ${TNAME}.testdata tail -3 ${TNAME}.out.401.n | head -2 > ${TNAME}.testdata.temp # Abuse HYPRE_NO_SAVED to skip the following diff with OMP if [ -z $HYPRE_NO_SAVED ]; then diff ${TNAME}.testdata ${TNAME}.testdata.temp >&2 fi tail -3 ${TNAME}.out.402.p | head -2 > ${TNAME}.testdata tail -3 ${TNAME}.out.402.n | head -2 > ${TNAME}.testdata.temp # Abuse HYPRE_NO_SAVED to skip the following diff with OMP if [ -z $HYPRE_NO_SAVED ]; then diff ${TNAME}.testdata ${TNAME}.testdata.temp >&2 fi tail -3 ${TNAME}.out.403.p | head -2 > ${TNAME}.testdata tail -3 ${TNAME}.out.403.n | head -2 > ${TNAME}.testdata.temp # Abuse HYPRE_NO_SAVED to skip the following diff with OMP if [ -z $HYPRE_NO_SAVED ]; then diff ${TNAME}.testdata ${TNAME}.testdata.temp >&2 fi #============================================================================= # remove temporary files #============================================================================= rm -f ${TNAME}.testdata* hypre-2.33.0/src/test/TEST_ij/rbm.0.00000000066400000000000000000000305261477326011500172500ustar00rootroot000000000000000 503 0 5.57278212575353e-02 1 -5.06616556886684e-02 2 5.57278212575353e-02 3 -4.55954901198016e-02 4 5.57278212575353e-02 5 -4.05293245509347e-02 6 5.57278212575353e-02 7 -3.54631589820679e-02 8 5.57278212575353e-02 9 -3.03969934132010e-02 10 5.57278212575353e-02 11 -2.53308278443342e-02 12 5.57278212575353e-02 13 -2.02646622754674e-02 14 5.57278212575353e-02 15 -1.51984967066005e-02 16 5.57278212575353e-02 17 -1.01323311377337e-02 18 5.57278212575353e-02 19 -5.06616556886684e-03 20 5.57278212575353e-02 21 -2.49511339984447e-18 22 5.57278212575353e-02 23 5.06616556886683e-03 24 5.57278212575353e-02 25 1.01323311377337e-02 26 5.57278212575353e-02 27 1.51984967066005e-02 28 5.57278212575353e-02 29 2.02646622754674e-02 30 5.57278212575353e-02 31 2.53308278443342e-02 32 5.57278212575353e-02 33 3.03969934132010e-02 34 5.57278212575353e-02 35 3.54631589820679e-02 36 5.57278212575353e-02 37 4.05293245509347e-02 38 5.57278212575353e-02 39 4.55954901198016e-02 40 5.57278212575353e-02 41 5.06616556886684e-02 42 5.06616556886685e-02 43 -5.06616556886684e-02 44 5.06616556886685e-02 45 -4.55954901198016e-02 46 5.06616556886685e-02 47 -4.05293245509347e-02 48 5.06616556886685e-02 49 -3.54631589820679e-02 50 5.06616556886685e-02 51 -3.03969934132010e-02 52 5.06616556886685e-02 53 -2.53308278443342e-02 54 5.06616556886685e-02 55 -2.02646622754674e-02 56 5.06616556886685e-02 57 -1.51984967066005e-02 58 5.06616556886685e-02 59 -1.01323311377337e-02 60 5.06616556886685e-02 61 -5.06616556886684e-03 62 5.06616556886685e-02 63 -2.49511339984447e-18 64 5.06616556886685e-02 65 5.06616556886683e-03 66 5.06616556886685e-02 67 1.01323311377337e-02 68 5.06616556886685e-02 69 1.51984967066005e-02 70 5.06616556886685e-02 71 2.02646622754674e-02 72 5.06616556886685e-02 73 2.53308278443342e-02 74 5.06616556886685e-02 75 3.03969934132010e-02 76 5.06616556886685e-02 77 3.54631589820679e-02 78 5.06616556886685e-02 79 4.05293245509347e-02 80 5.06616556886685e-02 81 4.55954901198016e-02 82 5.06616556886685e-02 83 5.06616556886684e-02 84 4.55954901198016e-02 85 -5.06616556886684e-02 86 4.55954901198016e-02 87 -4.55954901198016e-02 88 4.55954901198016e-02 89 -4.05293245509347e-02 90 4.55954901198016e-02 91 -3.54631589820679e-02 92 4.55954901198016e-02 93 -3.03969934132010e-02 94 4.55954901198016e-02 95 -2.53308278443342e-02 96 4.55954901198016e-02 97 -2.02646622754674e-02 98 4.55954901198016e-02 99 -1.51984967066005e-02 100 4.55954901198016e-02 101 -1.01323311377337e-02 102 4.55954901198016e-02 103 -5.06616556886684e-03 104 4.55954901198016e-02 105 -2.49511339984447e-18 106 4.55954901198016e-02 107 5.06616556886683e-03 108 4.55954901198016e-02 109 1.01323311377337e-02 110 4.55954901198016e-02 111 1.51984967066005e-02 112 4.55954901198016e-02 113 2.02646622754674e-02 114 4.55954901198016e-02 115 2.53308278443342e-02 116 4.55954901198016e-02 117 3.03969934132010e-02 118 4.55954901198016e-02 119 3.54631589820679e-02 120 4.55954901198016e-02 121 4.05293245509347e-02 122 4.55954901198016e-02 123 4.55954901198016e-02 124 4.55954901198016e-02 125 5.06616556886684e-02 126 4.05293245509348e-02 127 -5.06616556886684e-02 128 4.05293245509348e-02 129 -4.55954901198016e-02 130 4.05293245509348e-02 131 -4.05293245509347e-02 132 4.05293245509348e-02 133 -3.54631589820679e-02 134 4.05293245509348e-02 135 -3.03969934132010e-02 136 4.05293245509348e-02 137 -2.53308278443342e-02 138 4.05293245509348e-02 139 -2.02646622754674e-02 140 4.05293245509348e-02 141 -1.51984967066005e-02 142 4.05293245509348e-02 143 -1.01323311377337e-02 144 4.05293245509348e-02 145 -5.06616556886684e-03 146 4.05293245509348e-02 147 -2.49511339984447e-18 148 4.05293245509348e-02 149 5.06616556886683e-03 150 4.05293245509348e-02 151 1.01323311377337e-02 152 4.05293245509348e-02 153 1.51984967066005e-02 154 4.05293245509348e-02 155 2.02646622754674e-02 156 4.05293245509348e-02 157 2.53308278443342e-02 158 4.05293245509348e-02 159 3.03969934132010e-02 160 4.05293245509348e-02 161 3.54631589820679e-02 162 4.05293245509348e-02 163 4.05293245509347e-02 164 4.05293245509348e-02 165 4.55954901198016e-02 166 4.05293245509348e-02 167 5.06616556886684e-02 168 3.54631589820680e-02 169 -5.06616556886684e-02 170 3.54631589820680e-02 171 -4.55954901198016e-02 172 3.54631589820680e-02 173 -4.05293245509347e-02 174 3.54631589820680e-02 175 -3.54631589820679e-02 176 3.54631589820680e-02 177 -3.03969934132010e-02 178 3.54631589820680e-02 179 -2.53308278443342e-02 180 3.54631589820680e-02 181 -2.02646622754674e-02 182 3.54631589820680e-02 183 -1.51984967066005e-02 184 3.54631589820680e-02 185 -1.01323311377337e-02 186 3.54631589820680e-02 187 -5.06616556886684e-03 188 3.54631589820680e-02 189 -2.49511339984447e-18 190 3.54631589820680e-02 191 5.06616556886683e-03 192 3.54631589820680e-02 193 1.01323311377337e-02 194 3.54631589820680e-02 195 1.51984967066005e-02 196 3.54631589820680e-02 197 2.02646622754674e-02 198 3.54631589820680e-02 199 2.53308278443342e-02 200 3.54631589820680e-02 201 3.03969934132010e-02 202 3.54631589820680e-02 203 3.54631589820679e-02 204 3.54631589820680e-02 205 4.05293245509347e-02 206 3.54631589820680e-02 207 4.55954901198016e-02 208 3.54631589820680e-02 209 5.06616556886684e-02 210 3.03969934132011e-02 211 -5.06616556886684e-02 212 3.03969934132011e-02 213 -4.55954901198016e-02 214 3.03969934132011e-02 215 -4.05293245509347e-02 216 3.03969934132011e-02 217 -3.54631589820679e-02 218 3.03969934132011e-02 219 -3.03969934132010e-02 220 3.03969934132011e-02 221 -2.53308278443342e-02 222 3.03969934132011e-02 223 -2.02646622754674e-02 224 3.03969934132011e-02 225 -1.51984967066005e-02 226 3.03969934132011e-02 227 -1.01323311377337e-02 228 3.03969934132011e-02 229 -5.06616556886684e-03 230 3.03969934132011e-02 231 -2.49511339984447e-18 232 3.03969934132011e-02 233 5.06616556886683e-03 234 3.03969934132011e-02 235 1.01323311377337e-02 236 3.03969934132011e-02 237 1.51984967066005e-02 238 3.03969934132011e-02 239 2.02646622754674e-02 240 3.03969934132011e-02 241 2.53308278443342e-02 242 3.03969934132011e-02 243 3.03969934132010e-02 244 3.03969934132011e-02 245 3.54631589820679e-02 246 3.03969934132011e-02 247 4.05293245509347e-02 248 3.03969934132011e-02 249 4.55954901198016e-02 250 3.03969934132011e-02 251 5.06616556886684e-02 252 2.53308278443343e-02 253 -5.06616556886684e-02 254 2.53308278443343e-02 255 -4.55954901198016e-02 256 2.53308278443343e-02 257 -4.05293245509347e-02 258 2.53308278443343e-02 259 -3.54631589820679e-02 260 2.53308278443343e-02 261 -3.03969934132010e-02 262 2.53308278443343e-02 263 -2.53308278443342e-02 264 2.53308278443343e-02 265 -2.02646622754674e-02 266 2.53308278443343e-02 267 -1.51984967066005e-02 268 2.53308278443343e-02 269 -1.01323311377337e-02 270 2.53308278443343e-02 271 -5.06616556886684e-03 272 2.53308278443343e-02 273 -2.49511339984447e-18 274 2.53308278443343e-02 275 5.06616556886683e-03 276 2.53308278443343e-02 277 1.01323311377337e-02 278 2.53308278443343e-02 279 1.51984967066005e-02 280 2.53308278443343e-02 281 2.02646622754674e-02 282 2.53308278443343e-02 283 2.53308278443342e-02 284 2.53308278443343e-02 285 3.03969934132010e-02 286 2.53308278443343e-02 287 3.54631589820679e-02 288 2.53308278443343e-02 289 4.05293245509347e-02 290 2.53308278443343e-02 291 4.55954901198016e-02 292 2.53308278443343e-02 293 5.06616556886684e-02 294 2.02646622754674e-02 295 -5.06616556886684e-02 296 2.02646622754674e-02 297 -4.55954901198016e-02 298 2.02646622754674e-02 299 -4.05293245509347e-02 300 2.02646622754674e-02 301 -3.54631589820679e-02 302 2.02646622754674e-02 303 -3.03969934132010e-02 304 2.02646622754674e-02 305 -2.53308278443342e-02 306 2.02646622754674e-02 307 -2.02646622754674e-02 308 2.02646622754674e-02 309 -1.51984967066005e-02 310 2.02646622754674e-02 311 -1.01323311377337e-02 312 2.02646622754674e-02 313 -5.06616556886684e-03 314 2.02646622754674e-02 315 -2.49511339984447e-18 316 2.02646622754674e-02 317 5.06616556886683e-03 318 2.02646622754674e-02 319 1.01323311377337e-02 320 2.02646622754674e-02 321 1.51984967066005e-02 322 2.02646622754674e-02 323 2.02646622754674e-02 324 2.02646622754674e-02 325 2.53308278443342e-02 326 2.02646622754674e-02 327 3.03969934132010e-02 328 2.02646622754674e-02 329 3.54631589820679e-02 330 2.02646622754674e-02 331 4.05293245509347e-02 332 2.02646622754674e-02 333 4.55954901198016e-02 334 2.02646622754674e-02 335 5.06616556886684e-02 336 1.51984967066006e-02 337 -5.06616556886684e-02 338 1.51984967066006e-02 339 -4.55954901198016e-02 340 1.51984967066006e-02 341 -4.05293245509347e-02 342 1.51984967066006e-02 343 -3.54631589820679e-02 344 1.51984967066006e-02 345 -3.03969934132010e-02 346 1.51984967066006e-02 347 -2.53308278443342e-02 348 1.51984967066006e-02 349 -2.02646622754674e-02 350 1.51984967066006e-02 351 -1.51984967066005e-02 352 1.51984967066006e-02 353 -1.01323311377337e-02 354 1.51984967066006e-02 355 -5.06616556886684e-03 356 1.51984967066006e-02 357 -2.49511339984447e-18 358 1.51984967066006e-02 359 5.06616556886683e-03 360 1.51984967066006e-02 361 1.01323311377337e-02 362 1.51984967066006e-02 363 1.51984967066005e-02 364 1.51984967066006e-02 365 2.02646622754674e-02 366 1.51984967066006e-02 367 2.53308278443342e-02 368 1.51984967066006e-02 369 3.03969934132010e-02 370 1.51984967066006e-02 371 3.54631589820679e-02 372 1.51984967066006e-02 373 4.05293245509347e-02 374 1.51984967066006e-02 375 4.55954901198016e-02 376 1.51984967066006e-02 377 5.06616556886684e-02 378 1.01323311377338e-02 379 -5.06616556886684e-02 380 1.01323311377338e-02 381 -4.55954901198016e-02 382 1.01323311377338e-02 383 -4.05293245509347e-02 384 1.01323311377338e-02 385 -3.54631589820679e-02 386 1.01323311377338e-02 387 -3.03969934132010e-02 388 1.01323311377338e-02 389 -2.53308278443342e-02 390 1.01323311377338e-02 391 -2.02646622754674e-02 392 1.01323311377338e-02 393 -1.51984967066005e-02 394 1.01323311377338e-02 395 -1.01323311377337e-02 396 1.01323311377338e-02 397 -5.06616556886684e-03 398 1.01323311377338e-02 399 -2.49511339984447e-18 400 1.01323311377338e-02 401 5.06616556886683e-03 402 1.01323311377338e-02 403 1.01323311377337e-02 404 1.01323311377338e-02 405 1.51984967066005e-02 406 1.01323311377338e-02 407 2.02646622754674e-02 408 1.01323311377338e-02 409 2.53308278443342e-02 410 1.01323311377338e-02 411 3.03969934132010e-02 412 1.01323311377338e-02 413 3.54631589820679e-02 414 1.01323311377338e-02 415 4.05293245509347e-02 416 1.01323311377338e-02 417 4.55954901198016e-02 418 1.01323311377338e-02 419 5.06616556886684e-02 420 5.06616556886691e-03 421 -5.06616556886684e-02 422 5.06616556886691e-03 423 -4.55954901198016e-02 424 5.06616556886691e-03 425 -4.05293245509347e-02 426 5.06616556886691e-03 427 -3.54631589820679e-02 428 5.06616556886691e-03 429 -3.03969934132010e-02 430 5.06616556886691e-03 431 -2.53308278443342e-02 432 5.06616556886691e-03 433 -2.02646622754674e-02 434 5.06616556886691e-03 435 -1.51984967066005e-02 436 5.06616556886691e-03 437 -1.01323311377337e-02 438 5.06616556886691e-03 439 -5.06616556886684e-03 440 5.06616556886691e-03 441 -2.49511339984447e-18 442 5.06616556886691e-03 443 5.06616556886683e-03 444 5.06616556886691e-03 445 1.01323311377337e-02 446 5.06616556886691e-03 447 1.51984967066005e-02 448 5.06616556886691e-03 449 2.02646622754674e-02 450 5.06616556886691e-03 451 2.53308278443342e-02 452 5.06616556886691e-03 453 3.03969934132010e-02 454 5.06616556886691e-03 455 3.54631589820679e-02 456 5.06616556886691e-03 457 4.05293245509347e-02 458 5.06616556886691e-03 459 4.55954901198016e-02 460 5.06616556886691e-03 461 5.06616556886684e-02 462 7.15836792709678e-17 463 -5.06616556886684e-02 464 7.15836792709678e-17 465 -4.55954901198016e-02 466 7.15836792709678e-17 467 -4.05293245509347e-02 468 7.15836792709678e-17 469 -3.54631589820679e-02 470 7.15836792709678e-17 471 -3.03969934132010e-02 472 7.15836792709678e-17 473 -2.53308278443342e-02 474 7.15836792709678e-17 475 -2.02646622754674e-02 476 7.15836792709678e-17 477 -1.51984967066005e-02 478 7.15836792709678e-17 479 -1.01323311377337e-02 480 7.15836792709678e-17 481 -5.06616556886684e-03 482 7.15836792709678e-17 483 -2.49511339984447e-18 484 7.15836792709678e-17 485 5.06616556886683e-03 486 7.15836792709678e-17 487 1.01323311377337e-02 488 7.15836792709678e-17 489 1.51984967066005e-02 490 7.15836792709678e-17 491 2.02646622754674e-02 492 7.15836792709678e-17 493 2.53308278443342e-02 494 7.15836792709678e-17 495 3.03969934132010e-02 496 7.15836792709678e-17 497 3.54631589820679e-02 498 7.15836792709678e-17 499 4.05293245509347e-02 500 7.15836792709678e-17 501 4.55954901198016e-02 502 7.15836792709678e-17 503 5.06616556886684e-02 hypre-2.33.0/src/test/TEST_ij/rbm.0.00001000066400000000000000000000272101477326011500172450ustar00rootroot00000000000000504 965 504 -5.06616556886676e-03 505 -5.06616556886684e-02 506 -5.06616556886676e-03 507 -4.55954901198016e-02 508 -5.06616556886676e-03 509 -4.05293245509347e-02 510 -5.06616556886676e-03 511 -3.54631589820679e-02 512 -5.06616556886676e-03 513 -3.03969934132010e-02 514 -5.06616556886676e-03 515 -2.53308278443342e-02 516 -5.06616556886676e-03 517 -2.02646622754674e-02 518 -5.06616556886676e-03 519 -1.51984967066005e-02 520 -5.06616556886676e-03 521 -1.01323311377337e-02 522 -5.06616556886676e-03 523 -5.06616556886684e-03 524 -5.06616556886676e-03 525 -2.49511339984447e-18 526 -5.06616556886676e-03 527 5.06616556886683e-03 528 -5.06616556886676e-03 529 1.01323311377337e-02 530 -5.06616556886676e-03 531 1.51984967066005e-02 532 -5.06616556886676e-03 533 2.02646622754674e-02 534 -5.06616556886676e-03 535 2.53308278443342e-02 536 -5.06616556886676e-03 537 3.03969934132010e-02 538 -5.06616556886676e-03 539 3.54631589820679e-02 540 -5.06616556886676e-03 541 4.05293245509347e-02 542 -5.06616556886676e-03 543 4.55954901198016e-02 544 -5.06616556886676e-03 545 5.06616556886684e-02 546 -1.01323311377336e-02 547 -5.06616556886684e-02 548 -1.01323311377336e-02 549 -4.55954901198016e-02 550 -1.01323311377336e-02 551 -4.05293245509347e-02 552 -1.01323311377336e-02 553 -3.54631589820679e-02 554 -1.01323311377336e-02 555 -3.03969934132010e-02 556 -1.01323311377336e-02 557 -2.53308278443342e-02 558 -1.01323311377336e-02 559 -2.02646622754674e-02 560 -1.01323311377336e-02 561 -1.51984967066005e-02 562 -1.01323311377336e-02 563 -1.01323311377337e-02 564 -1.01323311377336e-02 565 -5.06616556886684e-03 566 -1.01323311377336e-02 567 -2.49511339984447e-18 568 -1.01323311377336e-02 569 5.06616556886683e-03 570 -1.01323311377336e-02 571 1.01323311377337e-02 572 -1.01323311377336e-02 573 1.51984967066005e-02 574 -1.01323311377336e-02 575 2.02646622754674e-02 576 -1.01323311377336e-02 577 2.53308278443342e-02 578 -1.01323311377336e-02 579 3.03969934132010e-02 580 -1.01323311377336e-02 581 3.54631589820679e-02 582 -1.01323311377336e-02 583 4.05293245509347e-02 584 -1.01323311377336e-02 585 4.55954901198016e-02 586 -1.01323311377336e-02 587 5.06616556886684e-02 588 -1.51984967066005e-02 589 -5.06616556886684e-02 590 -1.51984967066005e-02 591 -4.55954901198016e-02 592 -1.51984967066005e-02 593 -4.05293245509347e-02 594 -1.51984967066005e-02 595 -3.54631589820679e-02 596 -1.51984967066005e-02 597 -3.03969934132010e-02 598 -1.51984967066005e-02 599 -2.53308278443342e-02 600 -1.51984967066005e-02 601 -2.02646622754674e-02 602 -1.51984967066005e-02 603 -1.51984967066005e-02 604 -1.51984967066005e-02 605 -1.01323311377337e-02 606 -1.51984967066005e-02 607 -5.06616556886684e-03 608 -1.51984967066005e-02 609 -2.49511339984447e-18 610 -1.51984967066005e-02 611 5.06616556886683e-03 612 -1.51984967066005e-02 613 1.01323311377337e-02 614 -1.51984967066005e-02 615 1.51984967066005e-02 616 -1.51984967066005e-02 617 2.02646622754674e-02 618 -1.51984967066005e-02 619 2.53308278443342e-02 620 -1.51984967066005e-02 621 3.03969934132010e-02 622 -1.51984967066005e-02 623 3.54631589820679e-02 624 -1.51984967066005e-02 625 4.05293245509347e-02 626 -1.51984967066005e-02 627 4.55954901198016e-02 628 -1.51984967066005e-02 629 5.06616556886684e-02 630 -2.02646622754673e-02 631 -5.06616556886684e-02 632 -2.02646622754673e-02 633 -4.55954901198016e-02 634 -2.02646622754673e-02 635 -4.05293245509347e-02 636 -2.02646622754673e-02 637 -3.54631589820679e-02 638 -2.02646622754673e-02 639 -3.03969934132010e-02 640 -2.02646622754673e-02 641 -2.53308278443342e-02 642 -2.02646622754673e-02 643 -2.02646622754674e-02 644 -2.02646622754673e-02 645 -1.51984967066005e-02 646 -2.02646622754673e-02 647 -1.01323311377337e-02 648 -2.02646622754673e-02 649 -5.06616556886684e-03 650 -2.02646622754673e-02 651 -2.49511339984447e-18 652 -2.02646622754673e-02 653 5.06616556886683e-03 654 -2.02646622754673e-02 655 1.01323311377337e-02 656 -2.02646622754673e-02 657 1.51984967066005e-02 658 -2.02646622754673e-02 659 2.02646622754674e-02 660 -2.02646622754673e-02 661 2.53308278443342e-02 662 -2.02646622754673e-02 663 3.03969934132010e-02 664 -2.02646622754673e-02 665 3.54631589820679e-02 666 -2.02646622754673e-02 667 4.05293245509347e-02 668 -2.02646622754673e-02 669 4.55954901198016e-02 670 -2.02646622754673e-02 671 5.06616556886684e-02 672 -2.53308278443341e-02 673 -5.06616556886684e-02 674 -2.53308278443341e-02 675 -4.55954901198016e-02 676 -2.53308278443341e-02 677 -4.05293245509347e-02 678 -2.53308278443341e-02 679 -3.54631589820679e-02 680 -2.53308278443341e-02 681 -3.03969934132010e-02 682 -2.53308278443341e-02 683 -2.53308278443342e-02 684 -2.53308278443341e-02 685 -2.02646622754674e-02 686 -2.53308278443341e-02 687 -1.51984967066005e-02 688 -2.53308278443341e-02 689 -1.01323311377337e-02 690 -2.53308278443341e-02 691 -5.06616556886684e-03 692 -2.53308278443341e-02 693 -2.49511339984447e-18 694 -2.53308278443341e-02 695 5.06616556886683e-03 696 -2.53308278443341e-02 697 1.01323311377337e-02 698 -2.53308278443341e-02 699 1.51984967066005e-02 700 -2.53308278443341e-02 701 2.02646622754674e-02 702 -2.53308278443341e-02 703 2.53308278443342e-02 704 -2.53308278443341e-02 705 3.03969934132010e-02 706 -2.53308278443341e-02 707 3.54631589820679e-02 708 -2.53308278443341e-02 709 4.05293245509347e-02 710 -2.53308278443341e-02 711 4.55954901198016e-02 712 -2.53308278443341e-02 713 5.06616556886684e-02 714 -3.03969934132010e-02 715 -5.06616556886684e-02 716 -3.03969934132010e-02 717 -4.55954901198016e-02 718 -3.03969934132010e-02 719 -4.05293245509347e-02 720 -3.03969934132010e-02 721 -3.54631589820679e-02 722 -3.03969934132010e-02 723 -3.03969934132010e-02 724 -3.03969934132010e-02 725 -2.53308278443342e-02 726 -3.03969934132010e-02 727 -2.02646622754674e-02 728 -3.03969934132010e-02 729 -1.51984967066005e-02 730 -3.03969934132010e-02 731 -1.01323311377337e-02 732 -3.03969934132010e-02 733 -5.06616556886684e-03 734 -3.03969934132010e-02 735 -2.49511339984447e-18 736 -3.03969934132010e-02 737 5.06616556886683e-03 738 -3.03969934132010e-02 739 1.01323311377337e-02 740 -3.03969934132010e-02 741 1.51984967066005e-02 742 -3.03969934132010e-02 743 2.02646622754674e-02 744 -3.03969934132010e-02 745 2.53308278443342e-02 746 -3.03969934132010e-02 747 3.03969934132010e-02 748 -3.03969934132010e-02 749 3.54631589820679e-02 750 -3.03969934132010e-02 751 4.05293245509347e-02 752 -3.03969934132010e-02 753 4.55954901198016e-02 754 -3.03969934132010e-02 755 5.06616556886684e-02 756 -3.54631589820678e-02 757 -5.06616556886684e-02 758 -3.54631589820678e-02 759 -4.55954901198016e-02 760 -3.54631589820678e-02 761 -4.05293245509347e-02 762 -3.54631589820678e-02 763 -3.54631589820679e-02 764 -3.54631589820678e-02 765 -3.03969934132010e-02 766 -3.54631589820678e-02 767 -2.53308278443342e-02 768 -3.54631589820678e-02 769 -2.02646622754674e-02 770 -3.54631589820678e-02 771 -1.51984967066005e-02 772 -3.54631589820678e-02 773 -1.01323311377337e-02 774 -3.54631589820678e-02 775 -5.06616556886684e-03 776 -3.54631589820678e-02 777 -2.49511339984447e-18 778 -3.54631589820678e-02 779 5.06616556886683e-03 780 -3.54631589820678e-02 781 1.01323311377337e-02 782 -3.54631589820678e-02 783 1.51984967066005e-02 784 -3.54631589820678e-02 785 2.02646622754674e-02 786 -3.54631589820678e-02 787 2.53308278443342e-02 788 -3.54631589820678e-02 789 3.03969934132010e-02 790 -3.54631589820678e-02 791 3.54631589820679e-02 792 -3.54631589820678e-02 793 4.05293245509347e-02 794 -3.54631589820678e-02 795 4.55954901198016e-02 796 -3.54631589820678e-02 797 5.06616556886684e-02 798 -4.05293245509347e-02 799 -5.06616556886684e-02 800 -4.05293245509347e-02 801 -4.55954901198016e-02 802 -4.05293245509347e-02 803 -4.05293245509347e-02 804 -4.05293245509347e-02 805 -3.54631589820679e-02 806 -4.05293245509347e-02 807 -3.03969934132010e-02 808 -4.05293245509347e-02 809 -2.53308278443342e-02 810 -4.05293245509347e-02 811 -2.02646622754674e-02 812 -4.05293245509347e-02 813 -1.51984967066005e-02 814 -4.05293245509347e-02 815 -1.01323311377337e-02 816 -4.05293245509347e-02 817 -5.06616556886684e-03 818 -4.05293245509347e-02 819 -2.49511339984447e-18 820 -4.05293245509347e-02 821 5.06616556886683e-03 822 -4.05293245509347e-02 823 1.01323311377337e-02 824 -4.05293245509347e-02 825 1.51984967066005e-02 826 -4.05293245509347e-02 827 2.02646622754674e-02 828 -4.05293245509347e-02 829 2.53308278443342e-02 830 -4.05293245509347e-02 831 3.03969934132010e-02 832 -4.05293245509347e-02 833 3.54631589820679e-02 834 -4.05293245509347e-02 835 4.05293245509347e-02 836 -4.05293245509347e-02 837 4.55954901198016e-02 838 -4.05293245509347e-02 839 5.06616556886684e-02 840 -4.55954901198015e-02 841 -5.06616556886684e-02 842 -4.55954901198015e-02 843 -4.55954901198016e-02 844 -4.55954901198015e-02 845 -4.05293245509347e-02 846 -4.55954901198015e-02 847 -3.54631589820679e-02 848 -4.55954901198015e-02 849 -3.03969934132010e-02 850 -4.55954901198015e-02 851 -2.53308278443342e-02 852 -4.55954901198015e-02 853 -2.02646622754674e-02 854 -4.55954901198015e-02 855 -1.51984967066005e-02 856 -4.55954901198015e-02 857 -1.01323311377337e-02 858 -4.55954901198015e-02 859 -5.06616556886684e-03 860 -4.55954901198015e-02 861 -2.49511339984447e-18 862 -4.55954901198015e-02 863 5.06616556886683e-03 864 -4.55954901198015e-02 865 1.01323311377337e-02 866 -4.55954901198015e-02 867 1.51984967066005e-02 868 -4.55954901198015e-02 869 2.02646622754674e-02 870 -4.55954901198015e-02 871 2.53308278443342e-02 872 -4.55954901198015e-02 873 3.03969934132010e-02 874 -4.55954901198015e-02 875 3.54631589820679e-02 876 -4.55954901198015e-02 877 4.05293245509347e-02 878 -4.55954901198015e-02 879 4.55954901198016e-02 880 -4.55954901198015e-02 881 5.06616556886684e-02 882 -5.06616556886683e-02 883 -5.06616556886684e-02 884 -5.06616556886683e-02 885 -4.55954901198016e-02 886 -5.06616556886683e-02 887 -4.05293245509347e-02 888 -5.06616556886683e-02 889 -3.54631589820679e-02 890 -5.06616556886683e-02 891 -3.03969934132010e-02 892 -5.06616556886683e-02 893 -2.53308278443342e-02 894 -5.06616556886683e-02 895 -2.02646622754674e-02 896 -5.06616556886683e-02 897 -1.51984967066005e-02 898 -5.06616556886683e-02 899 -1.01323311377337e-02 900 -5.06616556886683e-02 901 -5.06616556886684e-03 902 -5.06616556886683e-02 903 -2.49511339984447e-18 904 -5.06616556886683e-02 905 5.06616556886683e-03 906 -5.06616556886683e-02 907 1.01323311377337e-02 908 -5.06616556886683e-02 909 1.51984967066005e-02 910 -5.06616556886683e-02 911 2.02646622754674e-02 912 -5.06616556886683e-02 913 2.53308278443342e-02 914 -5.06616556886683e-02 915 3.03969934132010e-02 916 -5.06616556886683e-02 917 3.54631589820679e-02 918 -5.06616556886683e-02 919 4.05293245509347e-02 920 -5.06616556886683e-02 921 4.55954901198016e-02 922 -5.06616556886683e-02 923 5.06616556886684e-02 924 -5.57278212575352e-02 925 -5.06616556886684e-02 926 -5.57278212575352e-02 927 -4.55954901198016e-02 928 -5.57278212575352e-02 929 -4.05293245509347e-02 930 -5.57278212575352e-02 931 -3.54631589820679e-02 932 -5.57278212575352e-02 933 -3.03969934132010e-02 934 -5.57278212575352e-02 935 -2.53308278443342e-02 936 -5.57278212575352e-02 937 -2.02646622754674e-02 938 -5.57278212575352e-02 939 -1.51984967066005e-02 940 -5.57278212575352e-02 941 -1.01323311377337e-02 942 -5.57278212575352e-02 943 -5.06616556886684e-03 944 -5.57278212575352e-02 945 -2.49511339984447e-18 946 -5.57278212575352e-02 947 5.06616556886683e-03 948 -5.57278212575352e-02 949 1.01323311377337e-02 950 -5.57278212575352e-02 951 1.51984967066005e-02 952 -5.57278212575352e-02 953 2.02646622754674e-02 954 -5.57278212575352e-02 955 2.53308278443342e-02 956 -5.57278212575352e-02 957 3.03969934132010e-02 958 -5.57278212575352e-02 959 3.54631589820679e-02 960 -5.57278212575352e-02 961 4.05293245509347e-02 962 -5.57278212575352e-02 963 4.55954901198016e-02 964 -5.57278212575352e-02 965 5.06616556886684e-02 hypre-2.33.0/src/test/TEST_ij/rbm.1.00000000066400000000000000000000303221477326011500172430ustar00rootroot000000000000000 503 0 0.00000000000000e+00 1 4.55015755193289e-02 2 0.00000000000000e+00 3 4.55015755193289e-02 4 0.00000000000000e+00 5 4.55015755193289e-02 6 0.00000000000000e+00 7 4.55015755193289e-02 8 0.00000000000000e+00 9 4.55015755193289e-02 10 0.00000000000000e+00 11 4.55015755193289e-02 12 0.00000000000000e+00 13 4.55015755193289e-02 14 0.00000000000000e+00 15 4.55015755193289e-02 16 0.00000000000000e+00 17 4.55015755193289e-02 18 0.00000000000000e+00 19 4.55015755193289e-02 20 0.00000000000000e+00 21 4.55015755193289e-02 22 0.00000000000000e+00 23 4.55015755193289e-02 24 0.00000000000000e+00 25 4.55015755193289e-02 26 0.00000000000000e+00 27 4.55015755193289e-02 28 0.00000000000000e+00 29 4.55015755193289e-02 30 0.00000000000000e+00 31 4.55015755193289e-02 32 0.00000000000000e+00 33 4.55015755193289e-02 34 0.00000000000000e+00 35 4.55015755193289e-02 36 0.00000000000000e+00 37 4.55015755193289e-02 38 0.00000000000000e+00 39 4.55015755193289e-02 40 0.00000000000000e+00 41 4.55015755193289e-02 42 0.00000000000000e+00 43 4.55015755193289e-02 44 0.00000000000000e+00 45 4.55015755193289e-02 46 0.00000000000000e+00 47 4.55015755193289e-02 48 0.00000000000000e+00 49 4.55015755193289e-02 50 0.00000000000000e+00 51 4.55015755193289e-02 52 0.00000000000000e+00 53 4.55015755193289e-02 54 0.00000000000000e+00 55 4.55015755193289e-02 56 0.00000000000000e+00 57 4.55015755193289e-02 58 0.00000000000000e+00 59 4.55015755193289e-02 60 0.00000000000000e+00 61 4.55015755193289e-02 62 0.00000000000000e+00 63 4.55015755193289e-02 64 0.00000000000000e+00 65 4.55015755193289e-02 66 0.00000000000000e+00 67 4.55015755193289e-02 68 0.00000000000000e+00 69 4.55015755193289e-02 70 0.00000000000000e+00 71 4.55015755193289e-02 72 0.00000000000000e+00 73 4.55015755193289e-02 74 0.00000000000000e+00 75 4.55015755193289e-02 76 0.00000000000000e+00 77 4.55015755193289e-02 78 0.00000000000000e+00 79 4.55015755193289e-02 80 0.00000000000000e+00 81 4.55015755193289e-02 82 0.00000000000000e+00 83 4.55015755193289e-02 84 0.00000000000000e+00 85 4.55015755193289e-02 86 0.00000000000000e+00 87 4.55015755193289e-02 88 0.00000000000000e+00 89 4.55015755193289e-02 90 0.00000000000000e+00 91 4.55015755193289e-02 92 0.00000000000000e+00 93 4.55015755193289e-02 94 0.00000000000000e+00 95 4.55015755193289e-02 96 0.00000000000000e+00 97 4.55015755193289e-02 98 0.00000000000000e+00 99 4.55015755193289e-02 100 0.00000000000000e+00 101 4.55015755193289e-02 102 0.00000000000000e+00 103 4.55015755193289e-02 104 0.00000000000000e+00 105 4.55015755193289e-02 106 0.00000000000000e+00 107 4.55015755193289e-02 108 0.00000000000000e+00 109 4.55015755193289e-02 110 0.00000000000000e+00 111 4.55015755193289e-02 112 0.00000000000000e+00 113 4.55015755193289e-02 114 0.00000000000000e+00 115 4.55015755193289e-02 116 0.00000000000000e+00 117 4.55015755193289e-02 118 0.00000000000000e+00 119 4.55015755193289e-02 120 0.00000000000000e+00 121 4.55015755193289e-02 122 0.00000000000000e+00 123 4.55015755193289e-02 124 0.00000000000000e+00 125 4.55015755193289e-02 126 0.00000000000000e+00 127 4.55015755193289e-02 128 0.00000000000000e+00 129 4.55015755193289e-02 130 0.00000000000000e+00 131 4.55015755193289e-02 132 0.00000000000000e+00 133 4.55015755193289e-02 134 0.00000000000000e+00 135 4.55015755193289e-02 136 0.00000000000000e+00 137 4.55015755193289e-02 138 0.00000000000000e+00 139 4.55015755193289e-02 140 0.00000000000000e+00 141 4.55015755193289e-02 142 0.00000000000000e+00 143 4.55015755193289e-02 144 0.00000000000000e+00 145 4.55015755193289e-02 146 0.00000000000000e+00 147 4.55015755193289e-02 148 0.00000000000000e+00 149 4.55015755193289e-02 150 0.00000000000000e+00 151 4.55015755193289e-02 152 0.00000000000000e+00 153 4.55015755193289e-02 154 0.00000000000000e+00 155 4.55015755193289e-02 156 0.00000000000000e+00 157 4.55015755193289e-02 158 0.00000000000000e+00 159 4.55015755193289e-02 160 0.00000000000000e+00 161 4.55015755193289e-02 162 0.00000000000000e+00 163 4.55015755193289e-02 164 0.00000000000000e+00 165 4.55015755193289e-02 166 0.00000000000000e+00 167 4.55015755193289e-02 168 0.00000000000000e+00 169 4.55015755193289e-02 170 0.00000000000000e+00 171 4.55015755193289e-02 172 0.00000000000000e+00 173 4.55015755193289e-02 174 0.00000000000000e+00 175 4.55015755193289e-02 176 0.00000000000000e+00 177 4.55015755193289e-02 178 0.00000000000000e+00 179 4.55015755193289e-02 180 0.00000000000000e+00 181 4.55015755193289e-02 182 0.00000000000000e+00 183 4.55015755193289e-02 184 0.00000000000000e+00 185 4.55015755193289e-02 186 0.00000000000000e+00 187 4.55015755193289e-02 188 0.00000000000000e+00 189 4.55015755193289e-02 190 0.00000000000000e+00 191 4.55015755193289e-02 192 0.00000000000000e+00 193 4.55015755193289e-02 194 0.00000000000000e+00 195 4.55015755193289e-02 196 0.00000000000000e+00 197 4.55015755193289e-02 198 0.00000000000000e+00 199 4.55015755193289e-02 200 0.00000000000000e+00 201 4.55015755193289e-02 202 0.00000000000000e+00 203 4.55015755193289e-02 204 0.00000000000000e+00 205 4.55015755193289e-02 206 0.00000000000000e+00 207 4.55015755193289e-02 208 0.00000000000000e+00 209 4.55015755193289e-02 210 0.00000000000000e+00 211 4.55015755193289e-02 212 0.00000000000000e+00 213 4.55015755193289e-02 214 0.00000000000000e+00 215 4.55015755193289e-02 216 0.00000000000000e+00 217 4.55015755193289e-02 218 0.00000000000000e+00 219 4.55015755193289e-02 220 0.00000000000000e+00 221 4.55015755193289e-02 222 0.00000000000000e+00 223 4.55015755193289e-02 224 0.00000000000000e+00 225 4.55015755193289e-02 226 0.00000000000000e+00 227 4.55015755193289e-02 228 0.00000000000000e+00 229 4.55015755193289e-02 230 0.00000000000000e+00 231 4.55015755193289e-02 232 0.00000000000000e+00 233 4.55015755193289e-02 234 0.00000000000000e+00 235 4.55015755193289e-02 236 0.00000000000000e+00 237 4.55015755193289e-02 238 0.00000000000000e+00 239 4.55015755193289e-02 240 0.00000000000000e+00 241 4.55015755193289e-02 242 0.00000000000000e+00 243 4.55015755193289e-02 244 0.00000000000000e+00 245 4.55015755193289e-02 246 0.00000000000000e+00 247 4.55015755193289e-02 248 0.00000000000000e+00 249 4.55015755193289e-02 250 0.00000000000000e+00 251 4.55015755193289e-02 252 0.00000000000000e+00 253 4.55015755193289e-02 254 0.00000000000000e+00 255 4.55015755193289e-02 256 0.00000000000000e+00 257 4.55015755193289e-02 258 0.00000000000000e+00 259 4.55015755193289e-02 260 0.00000000000000e+00 261 4.55015755193289e-02 262 0.00000000000000e+00 263 4.55015755193289e-02 264 0.00000000000000e+00 265 4.55015755193289e-02 266 0.00000000000000e+00 267 4.55015755193289e-02 268 0.00000000000000e+00 269 4.55015755193289e-02 270 0.00000000000000e+00 271 4.55015755193289e-02 272 0.00000000000000e+00 273 4.55015755193289e-02 274 0.00000000000000e+00 275 4.55015755193289e-02 276 0.00000000000000e+00 277 4.55015755193289e-02 278 0.00000000000000e+00 279 4.55015755193289e-02 280 0.00000000000000e+00 281 4.55015755193289e-02 282 0.00000000000000e+00 283 4.55015755193289e-02 284 0.00000000000000e+00 285 4.55015755193289e-02 286 0.00000000000000e+00 287 4.55015755193289e-02 288 0.00000000000000e+00 289 4.55015755193289e-02 290 0.00000000000000e+00 291 4.55015755193289e-02 292 0.00000000000000e+00 293 4.55015755193289e-02 294 0.00000000000000e+00 295 4.55015755193289e-02 296 0.00000000000000e+00 297 4.55015755193289e-02 298 0.00000000000000e+00 299 4.55015755193289e-02 300 0.00000000000000e+00 301 4.55015755193289e-02 302 0.00000000000000e+00 303 4.55015755193289e-02 304 0.00000000000000e+00 305 4.55015755193289e-02 306 0.00000000000000e+00 307 4.55015755193289e-02 308 0.00000000000000e+00 309 4.55015755193289e-02 310 0.00000000000000e+00 311 4.55015755193289e-02 312 0.00000000000000e+00 313 4.55015755193289e-02 314 0.00000000000000e+00 315 4.55015755193289e-02 316 0.00000000000000e+00 317 4.55015755193289e-02 318 0.00000000000000e+00 319 4.55015755193289e-02 320 0.00000000000000e+00 321 4.55015755193289e-02 322 0.00000000000000e+00 323 4.55015755193289e-02 324 0.00000000000000e+00 325 4.55015755193289e-02 326 0.00000000000000e+00 327 4.55015755193289e-02 328 0.00000000000000e+00 329 4.55015755193289e-02 330 0.00000000000000e+00 331 4.55015755193289e-02 332 0.00000000000000e+00 333 4.55015755193289e-02 334 0.00000000000000e+00 335 4.55015755193289e-02 336 0.00000000000000e+00 337 4.55015755193289e-02 338 0.00000000000000e+00 339 4.55015755193289e-02 340 0.00000000000000e+00 341 4.55015755193289e-02 342 0.00000000000000e+00 343 4.55015755193289e-02 344 0.00000000000000e+00 345 4.55015755193289e-02 346 0.00000000000000e+00 347 4.55015755193289e-02 348 0.00000000000000e+00 349 4.55015755193289e-02 350 0.00000000000000e+00 351 4.55015755193289e-02 352 0.00000000000000e+00 353 4.55015755193289e-02 354 0.00000000000000e+00 355 4.55015755193289e-02 356 0.00000000000000e+00 357 4.55015755193289e-02 358 0.00000000000000e+00 359 4.55015755193289e-02 360 0.00000000000000e+00 361 4.55015755193289e-02 362 0.00000000000000e+00 363 4.55015755193289e-02 364 0.00000000000000e+00 365 4.55015755193289e-02 366 0.00000000000000e+00 367 4.55015755193289e-02 368 0.00000000000000e+00 369 4.55015755193289e-02 370 0.00000000000000e+00 371 4.55015755193289e-02 372 0.00000000000000e+00 373 4.55015755193289e-02 374 0.00000000000000e+00 375 4.55015755193289e-02 376 0.00000000000000e+00 377 4.55015755193289e-02 378 0.00000000000000e+00 379 4.55015755193289e-02 380 0.00000000000000e+00 381 4.55015755193289e-02 382 0.00000000000000e+00 383 4.55015755193289e-02 384 0.00000000000000e+00 385 4.55015755193289e-02 386 0.00000000000000e+00 387 4.55015755193289e-02 388 0.00000000000000e+00 389 4.55015755193289e-02 390 0.00000000000000e+00 391 4.55015755193289e-02 392 0.00000000000000e+00 393 4.55015755193289e-02 394 0.00000000000000e+00 395 4.55015755193289e-02 396 0.00000000000000e+00 397 4.55015755193289e-02 398 0.00000000000000e+00 399 4.55015755193289e-02 400 0.00000000000000e+00 401 4.55015755193289e-02 402 0.00000000000000e+00 403 4.55015755193289e-02 404 0.00000000000000e+00 405 4.55015755193289e-02 406 0.00000000000000e+00 407 4.55015755193289e-02 408 0.00000000000000e+00 409 4.55015755193289e-02 410 0.00000000000000e+00 411 4.55015755193289e-02 412 0.00000000000000e+00 413 4.55015755193289e-02 414 0.00000000000000e+00 415 4.55015755193289e-02 416 0.00000000000000e+00 417 4.55015755193289e-02 418 0.00000000000000e+00 419 4.55015755193289e-02 420 0.00000000000000e+00 421 4.55015755193289e-02 422 0.00000000000000e+00 423 4.55015755193289e-02 424 0.00000000000000e+00 425 4.55015755193289e-02 426 0.00000000000000e+00 427 4.55015755193289e-02 428 0.00000000000000e+00 429 4.55015755193289e-02 430 0.00000000000000e+00 431 4.55015755193289e-02 432 0.00000000000000e+00 433 4.55015755193289e-02 434 0.00000000000000e+00 435 4.55015755193289e-02 436 0.00000000000000e+00 437 4.55015755193289e-02 438 0.00000000000000e+00 439 4.55015755193289e-02 440 0.00000000000000e+00 441 4.55015755193289e-02 442 0.00000000000000e+00 443 4.55015755193289e-02 444 0.00000000000000e+00 445 4.55015755193289e-02 446 0.00000000000000e+00 447 4.55015755193289e-02 448 0.00000000000000e+00 449 4.55015755193289e-02 450 0.00000000000000e+00 451 4.55015755193289e-02 452 0.00000000000000e+00 453 4.55015755193289e-02 454 0.00000000000000e+00 455 4.55015755193289e-02 456 0.00000000000000e+00 457 4.55015755193289e-02 458 0.00000000000000e+00 459 4.55015755193289e-02 460 0.00000000000000e+00 461 4.55015755193289e-02 462 0.00000000000000e+00 463 4.55015755193289e-02 464 0.00000000000000e+00 465 4.55015755193289e-02 466 0.00000000000000e+00 467 4.55015755193289e-02 468 0.00000000000000e+00 469 4.55015755193289e-02 470 0.00000000000000e+00 471 4.55015755193289e-02 472 0.00000000000000e+00 473 4.55015755193289e-02 474 0.00000000000000e+00 475 4.55015755193289e-02 476 0.00000000000000e+00 477 4.55015755193289e-02 478 0.00000000000000e+00 479 4.55015755193289e-02 480 0.00000000000000e+00 481 4.55015755193289e-02 482 0.00000000000000e+00 483 4.55015755193289e-02 484 0.00000000000000e+00 485 4.55015755193289e-02 486 0.00000000000000e+00 487 4.55015755193289e-02 488 0.00000000000000e+00 489 4.55015755193289e-02 490 0.00000000000000e+00 491 4.55015755193289e-02 492 0.00000000000000e+00 493 4.55015755193289e-02 494 0.00000000000000e+00 495 4.55015755193289e-02 496 0.00000000000000e+00 497 4.55015755193289e-02 498 0.00000000000000e+00 499 4.55015755193289e-02 500 0.00000000000000e+00 501 4.55015755193289e-02 502 0.00000000000000e+00 503 4.55015755193289e-02 hypre-2.33.0/src/test/TEST_ij/rbm.1.00001000066400000000000000000000264501477326011500172530ustar00rootroot00000000000000504 965 504 0.00000000000000e+00 505 4.55015755193289e-02 506 0.00000000000000e+00 507 4.55015755193289e-02 508 0.00000000000000e+00 509 4.55015755193289e-02 510 0.00000000000000e+00 511 4.55015755193289e-02 512 0.00000000000000e+00 513 4.55015755193289e-02 514 0.00000000000000e+00 515 4.55015755193289e-02 516 0.00000000000000e+00 517 4.55015755193289e-02 518 0.00000000000000e+00 519 4.55015755193289e-02 520 0.00000000000000e+00 521 4.55015755193289e-02 522 0.00000000000000e+00 523 4.55015755193289e-02 524 0.00000000000000e+00 525 4.55015755193289e-02 526 0.00000000000000e+00 527 4.55015755193289e-02 528 0.00000000000000e+00 529 4.55015755193289e-02 530 0.00000000000000e+00 531 4.55015755193289e-02 532 0.00000000000000e+00 533 4.55015755193289e-02 534 0.00000000000000e+00 535 4.55015755193289e-02 536 0.00000000000000e+00 537 4.55015755193289e-02 538 0.00000000000000e+00 539 4.55015755193289e-02 540 0.00000000000000e+00 541 4.55015755193289e-02 542 0.00000000000000e+00 543 4.55015755193289e-02 544 0.00000000000000e+00 545 4.55015755193289e-02 546 0.00000000000000e+00 547 4.55015755193289e-02 548 0.00000000000000e+00 549 4.55015755193289e-02 550 0.00000000000000e+00 551 4.55015755193289e-02 552 0.00000000000000e+00 553 4.55015755193289e-02 554 0.00000000000000e+00 555 4.55015755193289e-02 556 0.00000000000000e+00 557 4.55015755193289e-02 558 0.00000000000000e+00 559 4.55015755193289e-02 560 0.00000000000000e+00 561 4.55015755193289e-02 562 0.00000000000000e+00 563 4.55015755193289e-02 564 0.00000000000000e+00 565 4.55015755193289e-02 566 0.00000000000000e+00 567 4.55015755193289e-02 568 0.00000000000000e+00 569 4.55015755193289e-02 570 0.00000000000000e+00 571 4.55015755193289e-02 572 0.00000000000000e+00 573 4.55015755193289e-02 574 0.00000000000000e+00 575 4.55015755193289e-02 576 0.00000000000000e+00 577 4.55015755193289e-02 578 0.00000000000000e+00 579 4.55015755193289e-02 580 0.00000000000000e+00 581 4.55015755193289e-02 582 0.00000000000000e+00 583 4.55015755193289e-02 584 0.00000000000000e+00 585 4.55015755193289e-02 586 0.00000000000000e+00 587 4.55015755193289e-02 588 0.00000000000000e+00 589 4.55015755193289e-02 590 0.00000000000000e+00 591 4.55015755193289e-02 592 0.00000000000000e+00 593 4.55015755193289e-02 594 0.00000000000000e+00 595 4.55015755193289e-02 596 0.00000000000000e+00 597 4.55015755193289e-02 598 0.00000000000000e+00 599 4.55015755193289e-02 600 0.00000000000000e+00 601 4.55015755193289e-02 602 0.00000000000000e+00 603 4.55015755193289e-02 604 0.00000000000000e+00 605 4.55015755193289e-02 606 0.00000000000000e+00 607 4.55015755193289e-02 608 0.00000000000000e+00 609 4.55015755193289e-02 610 0.00000000000000e+00 611 4.55015755193289e-02 612 0.00000000000000e+00 613 4.55015755193289e-02 614 0.00000000000000e+00 615 4.55015755193289e-02 616 0.00000000000000e+00 617 4.55015755193289e-02 618 0.00000000000000e+00 619 4.55015755193289e-02 620 0.00000000000000e+00 621 4.55015755193289e-02 622 0.00000000000000e+00 623 4.55015755193289e-02 624 0.00000000000000e+00 625 4.55015755193289e-02 626 0.00000000000000e+00 627 4.55015755193289e-02 628 0.00000000000000e+00 629 4.55015755193289e-02 630 0.00000000000000e+00 631 4.55015755193289e-02 632 0.00000000000000e+00 633 4.55015755193289e-02 634 0.00000000000000e+00 635 4.55015755193289e-02 636 0.00000000000000e+00 637 4.55015755193289e-02 638 0.00000000000000e+00 639 4.55015755193289e-02 640 0.00000000000000e+00 641 4.55015755193289e-02 642 0.00000000000000e+00 643 4.55015755193289e-02 644 0.00000000000000e+00 645 4.55015755193289e-02 646 0.00000000000000e+00 647 4.55015755193289e-02 648 0.00000000000000e+00 649 4.55015755193289e-02 650 0.00000000000000e+00 651 4.55015755193289e-02 652 0.00000000000000e+00 653 4.55015755193289e-02 654 0.00000000000000e+00 655 4.55015755193289e-02 656 0.00000000000000e+00 657 4.55015755193289e-02 658 0.00000000000000e+00 659 4.55015755193289e-02 660 0.00000000000000e+00 661 4.55015755193289e-02 662 0.00000000000000e+00 663 4.55015755193289e-02 664 0.00000000000000e+00 665 4.55015755193289e-02 666 0.00000000000000e+00 667 4.55015755193289e-02 668 0.00000000000000e+00 669 4.55015755193289e-02 670 0.00000000000000e+00 671 4.55015755193289e-02 672 0.00000000000000e+00 673 4.55015755193289e-02 674 0.00000000000000e+00 675 4.55015755193289e-02 676 0.00000000000000e+00 677 4.55015755193289e-02 678 0.00000000000000e+00 679 4.55015755193289e-02 680 0.00000000000000e+00 681 4.55015755193289e-02 682 0.00000000000000e+00 683 4.55015755193289e-02 684 0.00000000000000e+00 685 4.55015755193289e-02 686 0.00000000000000e+00 687 4.55015755193289e-02 688 0.00000000000000e+00 689 4.55015755193289e-02 690 0.00000000000000e+00 691 4.55015755193289e-02 692 0.00000000000000e+00 693 4.55015755193289e-02 694 0.00000000000000e+00 695 4.55015755193289e-02 696 0.00000000000000e+00 697 4.55015755193289e-02 698 0.00000000000000e+00 699 4.55015755193289e-02 700 0.00000000000000e+00 701 4.55015755193289e-02 702 0.00000000000000e+00 703 4.55015755193289e-02 704 0.00000000000000e+00 705 4.55015755193289e-02 706 0.00000000000000e+00 707 4.55015755193289e-02 708 0.00000000000000e+00 709 4.55015755193289e-02 710 0.00000000000000e+00 711 4.55015755193289e-02 712 0.00000000000000e+00 713 4.55015755193289e-02 714 0.00000000000000e+00 715 4.55015755193289e-02 716 0.00000000000000e+00 717 4.55015755193289e-02 718 0.00000000000000e+00 719 4.55015755193289e-02 720 0.00000000000000e+00 721 4.55015755193289e-02 722 0.00000000000000e+00 723 4.55015755193289e-02 724 0.00000000000000e+00 725 4.55015755193289e-02 726 0.00000000000000e+00 727 4.55015755193289e-02 728 0.00000000000000e+00 729 4.55015755193289e-02 730 0.00000000000000e+00 731 4.55015755193289e-02 732 0.00000000000000e+00 733 4.55015755193289e-02 734 0.00000000000000e+00 735 4.55015755193289e-02 736 0.00000000000000e+00 737 4.55015755193289e-02 738 0.00000000000000e+00 739 4.55015755193289e-02 740 0.00000000000000e+00 741 4.55015755193289e-02 742 0.00000000000000e+00 743 4.55015755193289e-02 744 0.00000000000000e+00 745 4.55015755193289e-02 746 0.00000000000000e+00 747 4.55015755193289e-02 748 0.00000000000000e+00 749 4.55015755193289e-02 750 0.00000000000000e+00 751 4.55015755193289e-02 752 0.00000000000000e+00 753 4.55015755193289e-02 754 0.00000000000000e+00 755 4.55015755193289e-02 756 0.00000000000000e+00 757 4.55015755193289e-02 758 0.00000000000000e+00 759 4.55015755193289e-02 760 0.00000000000000e+00 761 4.55015755193289e-02 762 0.00000000000000e+00 763 4.55015755193289e-02 764 0.00000000000000e+00 765 4.55015755193289e-02 766 0.00000000000000e+00 767 4.55015755193289e-02 768 0.00000000000000e+00 769 4.55015755193289e-02 770 0.00000000000000e+00 771 4.55015755193289e-02 772 0.00000000000000e+00 773 4.55015755193289e-02 774 0.00000000000000e+00 775 4.55015755193289e-02 776 0.00000000000000e+00 777 4.55015755193289e-02 778 0.00000000000000e+00 779 4.55015755193289e-02 780 0.00000000000000e+00 781 4.55015755193289e-02 782 0.00000000000000e+00 783 4.55015755193289e-02 784 0.00000000000000e+00 785 4.55015755193289e-02 786 0.00000000000000e+00 787 4.55015755193289e-02 788 0.00000000000000e+00 789 4.55015755193289e-02 790 0.00000000000000e+00 791 4.55015755193289e-02 792 0.00000000000000e+00 793 4.55015755193289e-02 794 0.00000000000000e+00 795 4.55015755193289e-02 796 0.00000000000000e+00 797 4.55015755193289e-02 798 0.00000000000000e+00 799 4.55015755193289e-02 800 0.00000000000000e+00 801 4.55015755193289e-02 802 0.00000000000000e+00 803 4.55015755193289e-02 804 0.00000000000000e+00 805 4.55015755193289e-02 806 0.00000000000000e+00 807 4.55015755193289e-02 808 0.00000000000000e+00 809 4.55015755193289e-02 810 0.00000000000000e+00 811 4.55015755193289e-02 812 0.00000000000000e+00 813 4.55015755193289e-02 814 0.00000000000000e+00 815 4.55015755193289e-02 816 0.00000000000000e+00 817 4.55015755193289e-02 818 0.00000000000000e+00 819 4.55015755193289e-02 820 0.00000000000000e+00 821 4.55015755193289e-02 822 0.00000000000000e+00 823 4.55015755193289e-02 824 0.00000000000000e+00 825 4.55015755193289e-02 826 0.00000000000000e+00 827 4.55015755193289e-02 828 0.00000000000000e+00 829 4.55015755193289e-02 830 0.00000000000000e+00 831 4.55015755193289e-02 832 0.00000000000000e+00 833 4.55015755193289e-02 834 0.00000000000000e+00 835 4.55015755193289e-02 836 0.00000000000000e+00 837 4.55015755193289e-02 838 0.00000000000000e+00 839 4.55015755193289e-02 840 0.00000000000000e+00 841 4.55015755193289e-02 842 0.00000000000000e+00 843 4.55015755193289e-02 844 0.00000000000000e+00 845 4.55015755193289e-02 846 0.00000000000000e+00 847 4.55015755193289e-02 848 0.00000000000000e+00 849 4.55015755193289e-02 850 0.00000000000000e+00 851 4.55015755193289e-02 852 0.00000000000000e+00 853 4.55015755193289e-02 854 0.00000000000000e+00 855 4.55015755193289e-02 856 0.00000000000000e+00 857 4.55015755193289e-02 858 0.00000000000000e+00 859 4.55015755193289e-02 860 0.00000000000000e+00 861 4.55015755193289e-02 862 0.00000000000000e+00 863 4.55015755193289e-02 864 0.00000000000000e+00 865 4.55015755193289e-02 866 0.00000000000000e+00 867 4.55015755193289e-02 868 0.00000000000000e+00 869 4.55015755193289e-02 870 0.00000000000000e+00 871 4.55015755193289e-02 872 0.00000000000000e+00 873 4.55015755193289e-02 874 0.00000000000000e+00 875 4.55015755193289e-02 876 0.00000000000000e+00 877 4.55015755193289e-02 878 0.00000000000000e+00 879 4.55015755193289e-02 880 0.00000000000000e+00 881 4.55015755193289e-02 882 0.00000000000000e+00 883 4.55015755193289e-02 884 0.00000000000000e+00 885 4.55015755193289e-02 886 0.00000000000000e+00 887 4.55015755193289e-02 888 0.00000000000000e+00 889 4.55015755193289e-02 890 0.00000000000000e+00 891 4.55015755193289e-02 892 0.00000000000000e+00 893 4.55015755193289e-02 894 0.00000000000000e+00 895 4.55015755193289e-02 896 0.00000000000000e+00 897 4.55015755193289e-02 898 0.00000000000000e+00 899 4.55015755193289e-02 900 0.00000000000000e+00 901 4.55015755193289e-02 902 0.00000000000000e+00 903 4.55015755193289e-02 904 0.00000000000000e+00 905 4.55015755193289e-02 906 0.00000000000000e+00 907 4.55015755193289e-02 908 0.00000000000000e+00 909 4.55015755193289e-02 910 0.00000000000000e+00 911 4.55015755193289e-02 912 0.00000000000000e+00 913 4.55015755193289e-02 914 0.00000000000000e+00 915 4.55015755193289e-02 916 0.00000000000000e+00 917 4.55015755193289e-02 918 0.00000000000000e+00 919 4.55015755193289e-02 920 0.00000000000000e+00 921 4.55015755193289e-02 922 0.00000000000000e+00 923 4.55015755193289e-02 924 0.00000000000000e+00 925 4.55015755193289e-02 926 0.00000000000000e+00 927 4.55015755193289e-02 928 0.00000000000000e+00 929 4.55015755193289e-02 930 0.00000000000000e+00 931 4.55015755193289e-02 932 0.00000000000000e+00 933 4.55015755193289e-02 934 0.00000000000000e+00 935 4.55015755193289e-02 936 0.00000000000000e+00 937 4.55015755193289e-02 938 0.00000000000000e+00 939 4.55015755193289e-02 940 0.00000000000000e+00 941 4.55015755193289e-02 942 0.00000000000000e+00 943 4.55015755193289e-02 944 0.00000000000000e+00 945 4.55015755193289e-02 946 0.00000000000000e+00 947 4.55015755193289e-02 948 0.00000000000000e+00 949 4.55015755193289e-02 950 0.00000000000000e+00 951 4.55015755193289e-02 952 0.00000000000000e+00 953 4.55015755193289e-02 954 0.00000000000000e+00 955 4.55015755193289e-02 956 0.00000000000000e+00 957 4.55015755193289e-02 958 0.00000000000000e+00 959 4.55015755193289e-02 960 0.00000000000000e+00 961 4.55015755193289e-02 962 0.00000000000000e+00 963 4.55015755193289e-02 964 0.00000000000000e+00 965 4.55015755193289e-02 hypre-2.33.0/src/test/TEST_ij/rbm.2.00000000066400000000000000000000303221477326011500172440ustar00rootroot000000000000000 503 0 4.55015755193289e-02 1 0.00000000000000e+00 2 4.55015755193289e-02 3 0.00000000000000e+00 4 4.55015755193289e-02 5 0.00000000000000e+00 6 4.55015755193289e-02 7 0.00000000000000e+00 8 4.55015755193289e-02 9 0.00000000000000e+00 10 4.55015755193289e-02 11 0.00000000000000e+00 12 4.55015755193289e-02 13 0.00000000000000e+00 14 4.55015755193289e-02 15 0.00000000000000e+00 16 4.55015755193289e-02 17 0.00000000000000e+00 18 4.55015755193289e-02 19 0.00000000000000e+00 20 4.55015755193289e-02 21 0.00000000000000e+00 22 4.55015755193289e-02 23 0.00000000000000e+00 24 4.55015755193289e-02 25 0.00000000000000e+00 26 4.55015755193289e-02 27 0.00000000000000e+00 28 4.55015755193289e-02 29 0.00000000000000e+00 30 4.55015755193289e-02 31 0.00000000000000e+00 32 4.55015755193289e-02 33 0.00000000000000e+00 34 4.55015755193289e-02 35 0.00000000000000e+00 36 4.55015755193289e-02 37 0.00000000000000e+00 38 4.55015755193289e-02 39 0.00000000000000e+00 40 4.55015755193289e-02 41 0.00000000000000e+00 42 4.55015755193289e-02 43 0.00000000000000e+00 44 4.55015755193289e-02 45 0.00000000000000e+00 46 4.55015755193289e-02 47 0.00000000000000e+00 48 4.55015755193289e-02 49 0.00000000000000e+00 50 4.55015755193289e-02 51 0.00000000000000e+00 52 4.55015755193289e-02 53 0.00000000000000e+00 54 4.55015755193289e-02 55 0.00000000000000e+00 56 4.55015755193289e-02 57 0.00000000000000e+00 58 4.55015755193289e-02 59 0.00000000000000e+00 60 4.55015755193289e-02 61 0.00000000000000e+00 62 4.55015755193289e-02 63 0.00000000000000e+00 64 4.55015755193289e-02 65 0.00000000000000e+00 66 4.55015755193289e-02 67 0.00000000000000e+00 68 4.55015755193289e-02 69 0.00000000000000e+00 70 4.55015755193289e-02 71 0.00000000000000e+00 72 4.55015755193289e-02 73 0.00000000000000e+00 74 4.55015755193289e-02 75 0.00000000000000e+00 76 4.55015755193289e-02 77 0.00000000000000e+00 78 4.55015755193289e-02 79 0.00000000000000e+00 80 4.55015755193289e-02 81 0.00000000000000e+00 82 4.55015755193289e-02 83 0.00000000000000e+00 84 4.55015755193289e-02 85 0.00000000000000e+00 86 4.55015755193289e-02 87 0.00000000000000e+00 88 4.55015755193289e-02 89 0.00000000000000e+00 90 4.55015755193289e-02 91 0.00000000000000e+00 92 4.55015755193289e-02 93 0.00000000000000e+00 94 4.55015755193289e-02 95 0.00000000000000e+00 96 4.55015755193289e-02 97 0.00000000000000e+00 98 4.55015755193289e-02 99 0.00000000000000e+00 100 4.55015755193289e-02 101 0.00000000000000e+00 102 4.55015755193289e-02 103 0.00000000000000e+00 104 4.55015755193289e-02 105 0.00000000000000e+00 106 4.55015755193289e-02 107 0.00000000000000e+00 108 4.55015755193289e-02 109 0.00000000000000e+00 110 4.55015755193289e-02 111 0.00000000000000e+00 112 4.55015755193289e-02 113 0.00000000000000e+00 114 4.55015755193289e-02 115 0.00000000000000e+00 116 4.55015755193289e-02 117 0.00000000000000e+00 118 4.55015755193289e-02 119 0.00000000000000e+00 120 4.55015755193289e-02 121 0.00000000000000e+00 122 4.55015755193289e-02 123 0.00000000000000e+00 124 4.55015755193289e-02 125 0.00000000000000e+00 126 4.55015755193289e-02 127 0.00000000000000e+00 128 4.55015755193289e-02 129 0.00000000000000e+00 130 4.55015755193289e-02 131 0.00000000000000e+00 132 4.55015755193289e-02 133 0.00000000000000e+00 134 4.55015755193289e-02 135 0.00000000000000e+00 136 4.55015755193289e-02 137 0.00000000000000e+00 138 4.55015755193289e-02 139 0.00000000000000e+00 140 4.55015755193289e-02 141 0.00000000000000e+00 142 4.55015755193289e-02 143 0.00000000000000e+00 144 4.55015755193289e-02 145 0.00000000000000e+00 146 4.55015755193289e-02 147 0.00000000000000e+00 148 4.55015755193289e-02 149 0.00000000000000e+00 150 4.55015755193289e-02 151 0.00000000000000e+00 152 4.55015755193289e-02 153 0.00000000000000e+00 154 4.55015755193289e-02 155 0.00000000000000e+00 156 4.55015755193289e-02 157 0.00000000000000e+00 158 4.55015755193289e-02 159 0.00000000000000e+00 160 4.55015755193289e-02 161 0.00000000000000e+00 162 4.55015755193289e-02 163 0.00000000000000e+00 164 4.55015755193289e-02 165 0.00000000000000e+00 166 4.55015755193289e-02 167 0.00000000000000e+00 168 4.55015755193289e-02 169 0.00000000000000e+00 170 4.55015755193289e-02 171 0.00000000000000e+00 172 4.55015755193289e-02 173 0.00000000000000e+00 174 4.55015755193289e-02 175 0.00000000000000e+00 176 4.55015755193289e-02 177 0.00000000000000e+00 178 4.55015755193289e-02 179 0.00000000000000e+00 180 4.55015755193289e-02 181 0.00000000000000e+00 182 4.55015755193289e-02 183 0.00000000000000e+00 184 4.55015755193289e-02 185 0.00000000000000e+00 186 4.55015755193289e-02 187 0.00000000000000e+00 188 4.55015755193289e-02 189 0.00000000000000e+00 190 4.55015755193289e-02 191 0.00000000000000e+00 192 4.55015755193289e-02 193 0.00000000000000e+00 194 4.55015755193289e-02 195 0.00000000000000e+00 196 4.55015755193289e-02 197 0.00000000000000e+00 198 4.55015755193289e-02 199 0.00000000000000e+00 200 4.55015755193289e-02 201 0.00000000000000e+00 202 4.55015755193289e-02 203 0.00000000000000e+00 204 4.55015755193289e-02 205 0.00000000000000e+00 206 4.55015755193289e-02 207 0.00000000000000e+00 208 4.55015755193289e-02 209 0.00000000000000e+00 210 4.55015755193289e-02 211 0.00000000000000e+00 212 4.55015755193289e-02 213 0.00000000000000e+00 214 4.55015755193289e-02 215 0.00000000000000e+00 216 4.55015755193289e-02 217 0.00000000000000e+00 218 4.55015755193289e-02 219 0.00000000000000e+00 220 4.55015755193289e-02 221 0.00000000000000e+00 222 4.55015755193289e-02 223 0.00000000000000e+00 224 4.55015755193289e-02 225 0.00000000000000e+00 226 4.55015755193289e-02 227 0.00000000000000e+00 228 4.55015755193289e-02 229 0.00000000000000e+00 230 4.55015755193289e-02 231 0.00000000000000e+00 232 4.55015755193289e-02 233 0.00000000000000e+00 234 4.55015755193289e-02 235 0.00000000000000e+00 236 4.55015755193289e-02 237 0.00000000000000e+00 238 4.55015755193289e-02 239 0.00000000000000e+00 240 4.55015755193289e-02 241 0.00000000000000e+00 242 4.55015755193289e-02 243 0.00000000000000e+00 244 4.55015755193289e-02 245 0.00000000000000e+00 246 4.55015755193289e-02 247 0.00000000000000e+00 248 4.55015755193289e-02 249 0.00000000000000e+00 250 4.55015755193289e-02 251 0.00000000000000e+00 252 4.55015755193289e-02 253 0.00000000000000e+00 254 4.55015755193289e-02 255 0.00000000000000e+00 256 4.55015755193289e-02 257 0.00000000000000e+00 258 4.55015755193289e-02 259 0.00000000000000e+00 260 4.55015755193289e-02 261 0.00000000000000e+00 262 4.55015755193289e-02 263 0.00000000000000e+00 264 4.55015755193289e-02 265 0.00000000000000e+00 266 4.55015755193289e-02 267 0.00000000000000e+00 268 4.55015755193289e-02 269 0.00000000000000e+00 270 4.55015755193289e-02 271 0.00000000000000e+00 272 4.55015755193289e-02 273 0.00000000000000e+00 274 4.55015755193289e-02 275 0.00000000000000e+00 276 4.55015755193289e-02 277 0.00000000000000e+00 278 4.55015755193289e-02 279 0.00000000000000e+00 280 4.55015755193289e-02 281 0.00000000000000e+00 282 4.55015755193289e-02 283 0.00000000000000e+00 284 4.55015755193289e-02 285 0.00000000000000e+00 286 4.55015755193289e-02 287 0.00000000000000e+00 288 4.55015755193289e-02 289 0.00000000000000e+00 290 4.55015755193289e-02 291 0.00000000000000e+00 292 4.55015755193289e-02 293 0.00000000000000e+00 294 4.55015755193289e-02 295 0.00000000000000e+00 296 4.55015755193289e-02 297 0.00000000000000e+00 298 4.55015755193289e-02 299 0.00000000000000e+00 300 4.55015755193289e-02 301 0.00000000000000e+00 302 4.55015755193289e-02 303 0.00000000000000e+00 304 4.55015755193289e-02 305 0.00000000000000e+00 306 4.55015755193289e-02 307 0.00000000000000e+00 308 4.55015755193289e-02 309 0.00000000000000e+00 310 4.55015755193289e-02 311 0.00000000000000e+00 312 4.55015755193289e-02 313 0.00000000000000e+00 314 4.55015755193289e-02 315 0.00000000000000e+00 316 4.55015755193289e-02 317 0.00000000000000e+00 318 4.55015755193289e-02 319 0.00000000000000e+00 320 4.55015755193289e-02 321 0.00000000000000e+00 322 4.55015755193289e-02 323 0.00000000000000e+00 324 4.55015755193289e-02 325 0.00000000000000e+00 326 4.55015755193289e-02 327 0.00000000000000e+00 328 4.55015755193289e-02 329 0.00000000000000e+00 330 4.55015755193289e-02 331 0.00000000000000e+00 332 4.55015755193289e-02 333 0.00000000000000e+00 334 4.55015755193289e-02 335 0.00000000000000e+00 336 4.55015755193289e-02 337 0.00000000000000e+00 338 4.55015755193289e-02 339 0.00000000000000e+00 340 4.55015755193289e-02 341 0.00000000000000e+00 342 4.55015755193289e-02 343 0.00000000000000e+00 344 4.55015755193289e-02 345 0.00000000000000e+00 346 4.55015755193289e-02 347 0.00000000000000e+00 348 4.55015755193289e-02 349 0.00000000000000e+00 350 4.55015755193289e-02 351 0.00000000000000e+00 352 4.55015755193289e-02 353 0.00000000000000e+00 354 4.55015755193289e-02 355 0.00000000000000e+00 356 4.55015755193289e-02 357 0.00000000000000e+00 358 4.55015755193289e-02 359 0.00000000000000e+00 360 4.55015755193289e-02 361 0.00000000000000e+00 362 4.55015755193289e-02 363 0.00000000000000e+00 364 4.55015755193289e-02 365 0.00000000000000e+00 366 4.55015755193289e-02 367 0.00000000000000e+00 368 4.55015755193289e-02 369 0.00000000000000e+00 370 4.55015755193289e-02 371 0.00000000000000e+00 372 4.55015755193289e-02 373 0.00000000000000e+00 374 4.55015755193289e-02 375 0.00000000000000e+00 376 4.55015755193289e-02 377 0.00000000000000e+00 378 4.55015755193289e-02 379 0.00000000000000e+00 380 4.55015755193289e-02 381 0.00000000000000e+00 382 4.55015755193289e-02 383 0.00000000000000e+00 384 4.55015755193289e-02 385 0.00000000000000e+00 386 4.55015755193289e-02 387 0.00000000000000e+00 388 4.55015755193289e-02 389 0.00000000000000e+00 390 4.55015755193289e-02 391 0.00000000000000e+00 392 4.55015755193289e-02 393 0.00000000000000e+00 394 4.55015755193289e-02 395 0.00000000000000e+00 396 4.55015755193289e-02 397 0.00000000000000e+00 398 4.55015755193289e-02 399 0.00000000000000e+00 400 4.55015755193289e-02 401 0.00000000000000e+00 402 4.55015755193289e-02 403 0.00000000000000e+00 404 4.55015755193289e-02 405 0.00000000000000e+00 406 4.55015755193289e-02 407 0.00000000000000e+00 408 4.55015755193289e-02 409 0.00000000000000e+00 410 4.55015755193289e-02 411 0.00000000000000e+00 412 4.55015755193289e-02 413 0.00000000000000e+00 414 4.55015755193289e-02 415 0.00000000000000e+00 416 4.55015755193289e-02 417 0.00000000000000e+00 418 4.55015755193289e-02 419 0.00000000000000e+00 420 4.55015755193289e-02 421 0.00000000000000e+00 422 4.55015755193289e-02 423 0.00000000000000e+00 424 4.55015755193289e-02 425 0.00000000000000e+00 426 4.55015755193289e-02 427 0.00000000000000e+00 428 4.55015755193289e-02 429 0.00000000000000e+00 430 4.55015755193289e-02 431 0.00000000000000e+00 432 4.55015755193289e-02 433 0.00000000000000e+00 434 4.55015755193289e-02 435 0.00000000000000e+00 436 4.55015755193289e-02 437 0.00000000000000e+00 438 4.55015755193289e-02 439 0.00000000000000e+00 440 4.55015755193289e-02 441 0.00000000000000e+00 442 4.55015755193289e-02 443 0.00000000000000e+00 444 4.55015755193289e-02 445 0.00000000000000e+00 446 4.55015755193289e-02 447 0.00000000000000e+00 448 4.55015755193289e-02 449 0.00000000000000e+00 450 4.55015755193289e-02 451 0.00000000000000e+00 452 4.55015755193289e-02 453 0.00000000000000e+00 454 4.55015755193289e-02 455 0.00000000000000e+00 456 4.55015755193289e-02 457 0.00000000000000e+00 458 4.55015755193289e-02 459 0.00000000000000e+00 460 4.55015755193289e-02 461 0.00000000000000e+00 462 4.55015755193289e-02 463 0.00000000000000e+00 464 4.55015755193289e-02 465 0.00000000000000e+00 466 4.55015755193289e-02 467 0.00000000000000e+00 468 4.55015755193289e-02 469 0.00000000000000e+00 470 4.55015755193289e-02 471 0.00000000000000e+00 472 4.55015755193289e-02 473 0.00000000000000e+00 474 4.55015755193289e-02 475 0.00000000000000e+00 476 4.55015755193289e-02 477 0.00000000000000e+00 478 4.55015755193289e-02 479 0.00000000000000e+00 480 4.55015755193289e-02 481 0.00000000000000e+00 482 4.55015755193289e-02 483 0.00000000000000e+00 484 4.55015755193289e-02 485 0.00000000000000e+00 486 4.55015755193289e-02 487 0.00000000000000e+00 488 4.55015755193289e-02 489 0.00000000000000e+00 490 4.55015755193289e-02 491 0.00000000000000e+00 492 4.55015755193289e-02 493 0.00000000000000e+00 494 4.55015755193289e-02 495 0.00000000000000e+00 496 4.55015755193289e-02 497 0.00000000000000e+00 498 4.55015755193289e-02 499 0.00000000000000e+00 500 4.55015755193289e-02 501 0.00000000000000e+00 502 4.55015755193289e-02 503 0.00000000000000e+00 hypre-2.33.0/src/test/TEST_ij/rbm.2.00001000066400000000000000000000264501477326011500172540ustar00rootroot00000000000000504 965 504 4.55015755193289e-02 505 0.00000000000000e+00 506 4.55015755193289e-02 507 0.00000000000000e+00 508 4.55015755193289e-02 509 0.00000000000000e+00 510 4.55015755193289e-02 511 0.00000000000000e+00 512 4.55015755193289e-02 513 0.00000000000000e+00 514 4.55015755193289e-02 515 0.00000000000000e+00 516 4.55015755193289e-02 517 0.00000000000000e+00 518 4.55015755193289e-02 519 0.00000000000000e+00 520 4.55015755193289e-02 521 0.00000000000000e+00 522 4.55015755193289e-02 523 0.00000000000000e+00 524 4.55015755193289e-02 525 0.00000000000000e+00 526 4.55015755193289e-02 527 0.00000000000000e+00 528 4.55015755193289e-02 529 0.00000000000000e+00 530 4.55015755193289e-02 531 0.00000000000000e+00 532 4.55015755193289e-02 533 0.00000000000000e+00 534 4.55015755193289e-02 535 0.00000000000000e+00 536 4.55015755193289e-02 537 0.00000000000000e+00 538 4.55015755193289e-02 539 0.00000000000000e+00 540 4.55015755193289e-02 541 0.00000000000000e+00 542 4.55015755193289e-02 543 0.00000000000000e+00 544 4.55015755193289e-02 545 0.00000000000000e+00 546 4.55015755193289e-02 547 0.00000000000000e+00 548 4.55015755193289e-02 549 0.00000000000000e+00 550 4.55015755193289e-02 551 0.00000000000000e+00 552 4.55015755193289e-02 553 0.00000000000000e+00 554 4.55015755193289e-02 555 0.00000000000000e+00 556 4.55015755193289e-02 557 0.00000000000000e+00 558 4.55015755193289e-02 559 0.00000000000000e+00 560 4.55015755193289e-02 561 0.00000000000000e+00 562 4.55015755193289e-02 563 0.00000000000000e+00 564 4.55015755193289e-02 565 0.00000000000000e+00 566 4.55015755193289e-02 567 0.00000000000000e+00 568 4.55015755193289e-02 569 0.00000000000000e+00 570 4.55015755193289e-02 571 0.00000000000000e+00 572 4.55015755193289e-02 573 0.00000000000000e+00 574 4.55015755193289e-02 575 0.00000000000000e+00 576 4.55015755193289e-02 577 0.00000000000000e+00 578 4.55015755193289e-02 579 0.00000000000000e+00 580 4.55015755193289e-02 581 0.00000000000000e+00 582 4.55015755193289e-02 583 0.00000000000000e+00 584 4.55015755193289e-02 585 0.00000000000000e+00 586 4.55015755193289e-02 587 0.00000000000000e+00 588 4.55015755193289e-02 589 0.00000000000000e+00 590 4.55015755193289e-02 591 0.00000000000000e+00 592 4.55015755193289e-02 593 0.00000000000000e+00 594 4.55015755193289e-02 595 0.00000000000000e+00 596 4.55015755193289e-02 597 0.00000000000000e+00 598 4.55015755193289e-02 599 0.00000000000000e+00 600 4.55015755193289e-02 601 0.00000000000000e+00 602 4.55015755193289e-02 603 0.00000000000000e+00 604 4.55015755193289e-02 605 0.00000000000000e+00 606 4.55015755193289e-02 607 0.00000000000000e+00 608 4.55015755193289e-02 609 0.00000000000000e+00 610 4.55015755193289e-02 611 0.00000000000000e+00 612 4.55015755193289e-02 613 0.00000000000000e+00 614 4.55015755193289e-02 615 0.00000000000000e+00 616 4.55015755193289e-02 617 0.00000000000000e+00 618 4.55015755193289e-02 619 0.00000000000000e+00 620 4.55015755193289e-02 621 0.00000000000000e+00 622 4.55015755193289e-02 623 0.00000000000000e+00 624 4.55015755193289e-02 625 0.00000000000000e+00 626 4.55015755193289e-02 627 0.00000000000000e+00 628 4.55015755193289e-02 629 0.00000000000000e+00 630 4.55015755193289e-02 631 0.00000000000000e+00 632 4.55015755193289e-02 633 0.00000000000000e+00 634 4.55015755193289e-02 635 0.00000000000000e+00 636 4.55015755193289e-02 637 0.00000000000000e+00 638 4.55015755193289e-02 639 0.00000000000000e+00 640 4.55015755193289e-02 641 0.00000000000000e+00 642 4.55015755193289e-02 643 0.00000000000000e+00 644 4.55015755193289e-02 645 0.00000000000000e+00 646 4.55015755193289e-02 647 0.00000000000000e+00 648 4.55015755193289e-02 649 0.00000000000000e+00 650 4.55015755193289e-02 651 0.00000000000000e+00 652 4.55015755193289e-02 653 0.00000000000000e+00 654 4.55015755193289e-02 655 0.00000000000000e+00 656 4.55015755193289e-02 657 0.00000000000000e+00 658 4.55015755193289e-02 659 0.00000000000000e+00 660 4.55015755193289e-02 661 0.00000000000000e+00 662 4.55015755193289e-02 663 0.00000000000000e+00 664 4.55015755193289e-02 665 0.00000000000000e+00 666 4.55015755193289e-02 667 0.00000000000000e+00 668 4.55015755193289e-02 669 0.00000000000000e+00 670 4.55015755193289e-02 671 0.00000000000000e+00 672 4.55015755193289e-02 673 0.00000000000000e+00 674 4.55015755193289e-02 675 0.00000000000000e+00 676 4.55015755193289e-02 677 0.00000000000000e+00 678 4.55015755193289e-02 679 0.00000000000000e+00 680 4.55015755193289e-02 681 0.00000000000000e+00 682 4.55015755193289e-02 683 0.00000000000000e+00 684 4.55015755193289e-02 685 0.00000000000000e+00 686 4.55015755193289e-02 687 0.00000000000000e+00 688 4.55015755193289e-02 689 0.00000000000000e+00 690 4.55015755193289e-02 691 0.00000000000000e+00 692 4.55015755193289e-02 693 0.00000000000000e+00 694 4.55015755193289e-02 695 0.00000000000000e+00 696 4.55015755193289e-02 697 0.00000000000000e+00 698 4.55015755193289e-02 699 0.00000000000000e+00 700 4.55015755193289e-02 701 0.00000000000000e+00 702 4.55015755193289e-02 703 0.00000000000000e+00 704 4.55015755193289e-02 705 0.00000000000000e+00 706 4.55015755193289e-02 707 0.00000000000000e+00 708 4.55015755193289e-02 709 0.00000000000000e+00 710 4.55015755193289e-02 711 0.00000000000000e+00 712 4.55015755193289e-02 713 0.00000000000000e+00 714 4.55015755193289e-02 715 0.00000000000000e+00 716 4.55015755193289e-02 717 0.00000000000000e+00 718 4.55015755193289e-02 719 0.00000000000000e+00 720 4.55015755193289e-02 721 0.00000000000000e+00 722 4.55015755193289e-02 723 0.00000000000000e+00 724 4.55015755193289e-02 725 0.00000000000000e+00 726 4.55015755193289e-02 727 0.00000000000000e+00 728 4.55015755193289e-02 729 0.00000000000000e+00 730 4.55015755193289e-02 731 0.00000000000000e+00 732 4.55015755193289e-02 733 0.00000000000000e+00 734 4.55015755193289e-02 735 0.00000000000000e+00 736 4.55015755193289e-02 737 0.00000000000000e+00 738 4.55015755193289e-02 739 0.00000000000000e+00 740 4.55015755193289e-02 741 0.00000000000000e+00 742 4.55015755193289e-02 743 0.00000000000000e+00 744 4.55015755193289e-02 745 0.00000000000000e+00 746 4.55015755193289e-02 747 0.00000000000000e+00 748 4.55015755193289e-02 749 0.00000000000000e+00 750 4.55015755193289e-02 751 0.00000000000000e+00 752 4.55015755193289e-02 753 0.00000000000000e+00 754 4.55015755193289e-02 755 0.00000000000000e+00 756 4.55015755193289e-02 757 0.00000000000000e+00 758 4.55015755193289e-02 759 0.00000000000000e+00 760 4.55015755193289e-02 761 0.00000000000000e+00 762 4.55015755193289e-02 763 0.00000000000000e+00 764 4.55015755193289e-02 765 0.00000000000000e+00 766 4.55015755193289e-02 767 0.00000000000000e+00 768 4.55015755193289e-02 769 0.00000000000000e+00 770 4.55015755193289e-02 771 0.00000000000000e+00 772 4.55015755193289e-02 773 0.00000000000000e+00 774 4.55015755193289e-02 775 0.00000000000000e+00 776 4.55015755193289e-02 777 0.00000000000000e+00 778 4.55015755193289e-02 779 0.00000000000000e+00 780 4.55015755193289e-02 781 0.00000000000000e+00 782 4.55015755193289e-02 783 0.00000000000000e+00 784 4.55015755193289e-02 785 0.00000000000000e+00 786 4.55015755193289e-02 787 0.00000000000000e+00 788 4.55015755193289e-02 789 0.00000000000000e+00 790 4.55015755193289e-02 791 0.00000000000000e+00 792 4.55015755193289e-02 793 0.00000000000000e+00 794 4.55015755193289e-02 795 0.00000000000000e+00 796 4.55015755193289e-02 797 0.00000000000000e+00 798 4.55015755193289e-02 799 0.00000000000000e+00 800 4.55015755193289e-02 801 0.00000000000000e+00 802 4.55015755193289e-02 803 0.00000000000000e+00 804 4.55015755193289e-02 805 0.00000000000000e+00 806 4.55015755193289e-02 807 0.00000000000000e+00 808 4.55015755193289e-02 809 0.00000000000000e+00 810 4.55015755193289e-02 811 0.00000000000000e+00 812 4.55015755193289e-02 813 0.00000000000000e+00 814 4.55015755193289e-02 815 0.00000000000000e+00 816 4.55015755193289e-02 817 0.00000000000000e+00 818 4.55015755193289e-02 819 0.00000000000000e+00 820 4.55015755193289e-02 821 0.00000000000000e+00 822 4.55015755193289e-02 823 0.00000000000000e+00 824 4.55015755193289e-02 825 0.00000000000000e+00 826 4.55015755193289e-02 827 0.00000000000000e+00 828 4.55015755193289e-02 829 0.00000000000000e+00 830 4.55015755193289e-02 831 0.00000000000000e+00 832 4.55015755193289e-02 833 0.00000000000000e+00 834 4.55015755193289e-02 835 0.00000000000000e+00 836 4.55015755193289e-02 837 0.00000000000000e+00 838 4.55015755193289e-02 839 0.00000000000000e+00 840 4.55015755193289e-02 841 0.00000000000000e+00 842 4.55015755193289e-02 843 0.00000000000000e+00 844 4.55015755193289e-02 845 0.00000000000000e+00 846 4.55015755193289e-02 847 0.00000000000000e+00 848 4.55015755193289e-02 849 0.00000000000000e+00 850 4.55015755193289e-02 851 0.00000000000000e+00 852 4.55015755193289e-02 853 0.00000000000000e+00 854 4.55015755193289e-02 855 0.00000000000000e+00 856 4.55015755193289e-02 857 0.00000000000000e+00 858 4.55015755193289e-02 859 0.00000000000000e+00 860 4.55015755193289e-02 861 0.00000000000000e+00 862 4.55015755193289e-02 863 0.00000000000000e+00 864 4.55015755193289e-02 865 0.00000000000000e+00 866 4.55015755193289e-02 867 0.00000000000000e+00 868 4.55015755193289e-02 869 0.00000000000000e+00 870 4.55015755193289e-02 871 0.00000000000000e+00 872 4.55015755193289e-02 873 0.00000000000000e+00 874 4.55015755193289e-02 875 0.00000000000000e+00 876 4.55015755193289e-02 877 0.00000000000000e+00 878 4.55015755193289e-02 879 0.00000000000000e+00 880 4.55015755193289e-02 881 0.00000000000000e+00 882 4.55015755193289e-02 883 0.00000000000000e+00 884 4.55015755193289e-02 885 0.00000000000000e+00 886 4.55015755193289e-02 887 0.00000000000000e+00 888 4.55015755193289e-02 889 0.00000000000000e+00 890 4.55015755193289e-02 891 0.00000000000000e+00 892 4.55015755193289e-02 893 0.00000000000000e+00 894 4.55015755193289e-02 895 0.00000000000000e+00 896 4.55015755193289e-02 897 0.00000000000000e+00 898 4.55015755193289e-02 899 0.00000000000000e+00 900 4.55015755193289e-02 901 0.00000000000000e+00 902 4.55015755193289e-02 903 0.00000000000000e+00 904 4.55015755193289e-02 905 0.00000000000000e+00 906 4.55015755193289e-02 907 0.00000000000000e+00 908 4.55015755193289e-02 909 0.00000000000000e+00 910 4.55015755193289e-02 911 0.00000000000000e+00 912 4.55015755193289e-02 913 0.00000000000000e+00 914 4.55015755193289e-02 915 0.00000000000000e+00 916 4.55015755193289e-02 917 0.00000000000000e+00 918 4.55015755193289e-02 919 0.00000000000000e+00 920 4.55015755193289e-02 921 0.00000000000000e+00 922 4.55015755193289e-02 923 0.00000000000000e+00 924 4.55015755193289e-02 925 0.00000000000000e+00 926 4.55015755193289e-02 927 0.00000000000000e+00 928 4.55015755193289e-02 929 0.00000000000000e+00 930 4.55015755193289e-02 931 0.00000000000000e+00 932 4.55015755193289e-02 933 0.00000000000000e+00 934 4.55015755193289e-02 935 0.00000000000000e+00 936 4.55015755193289e-02 937 0.00000000000000e+00 938 4.55015755193289e-02 939 0.00000000000000e+00 940 4.55015755193289e-02 941 0.00000000000000e+00 942 4.55015755193289e-02 943 0.00000000000000e+00 944 4.55015755193289e-02 945 0.00000000000000e+00 946 4.55015755193289e-02 947 0.00000000000000e+00 948 4.55015755193289e-02 949 0.00000000000000e+00 950 4.55015755193289e-02 951 0.00000000000000e+00 952 4.55015755193289e-02 953 0.00000000000000e+00 954 4.55015755193289e-02 955 0.00000000000000e+00 956 4.55015755193289e-02 957 0.00000000000000e+00 958 4.55015755193289e-02 959 0.00000000000000e+00 960 4.55015755193289e-02 961 0.00000000000000e+00 962 4.55015755193289e-02 963 0.00000000000000e+00 964 4.55015755193289e-02 965 0.00000000000000e+00 hypre-2.33.0/src/test/TEST_ij/schw.00000000066400000000000000000000142721477326011500172760ustar00rootroot000000000000001 50 1 50 1 1 4.00000000000000e+00 1 2 -1.00000000000000e+00 1 11 -1.00000000000000e+00 2 2 4.00000000000000e+00 2 1 -1.00000000000000e+00 2 3 -1.00000000000000e+00 2 12 -1.00000000000000e+00 3 3 4.00000000000000e+00 3 2 -1.00000000000000e+00 3 4 -1.00000000000000e+00 3 13 -1.00000000000000e+00 4 4 4.00000000000000e+00 4 3 -1.00000000000000e+00 4 5 -1.00000000000000e+00 4 14 -1.00000000000000e+00 5 5 4.00000000000000e+00 5 4 -1.00000000000000e+00 5 6 -1.00000000000000e+00 5 15 -1.00000000000000e+00 6 6 4.00000000000000e+00 6 5 -1.00000000000000e+00 6 7 -1.00000000000000e+00 6 16 -1.00000000000000e+00 7 7 4.00000000000000e+00 7 6 -1.00000000000000e+00 7 8 -1.00000000000000e+00 7 17 -1.00000000000000e+00 8 8 4.00000000000000e+00 8 7 -1.00000000000000e+00 8 9 -1.00000000000000e+00 8 18 -1.00000000000000e+00 9 9 4.00000000000000e+00 9 8 -1.00000000000000e+00 9 10 -1.00000000000000e+00 9 19 -1.00000000000000e+00 10 10 4.00000000000000e+00 10 9 -1.00000000000000e+00 10 20 -1.00000000000000e+00 11 11 4.00000000000000e+00 11 1 -1.00000000000000e+00 11 12 -1.00000000000000e+00 11 21 -1.00000000000000e+00 12 12 4.00000000000000e+00 12 2 -1.00000000000000e+00 12 11 -1.00000000000000e+00 12 13 -1.00000000000000e+00 12 22 -1.00000000000000e+00 13 13 4.00000000000000e+00 13 3 -1.00000000000000e+00 13 12 -1.00000000000000e+00 13 14 -1.00000000000000e+00 13 23 -1.00000000000000e+00 14 14 4.00000000000000e+00 14 4 -1.00000000000000e+00 14 13 -1.00000000000000e+00 14 15 -1.00000000000000e+00 14 24 -1.00000000000000e+00 15 15 4.00000000000000e+00 15 5 -1.00000000000000e+00 15 14 -1.00000000000000e+00 15 16 -1.00000000000000e+00 15 25 -1.00000000000000e+00 16 16 4.00000000000000e+00 16 6 -1.00000000000000e+00 16 15 -1.00000000000000e+00 16 17 -1.00000000000000e+00 16 26 -1.00000000000000e+00 17 17 4.00000000000000e+00 17 7 -1.00000000000000e+00 17 16 -1.00000000000000e+00 17 18 -1.00000000000000e+00 17 27 -1.00000000000000e+00 18 18 4.00000000000000e+00 18 8 -1.00000000000000e+00 18 17 -1.00000000000000e+00 18 19 -1.00000000000000e+00 18 28 -1.00000000000000e+00 19 19 4.00000000000000e+00 19 9 -1.00000000000000e+00 19 18 -1.00000000000000e+00 19 20 -1.00000000000000e+00 19 29 -1.00000000000000e+00 20 20 4.00000000000000e+00 20 10 -1.00000000000000e+00 20 19 -1.00000000000000e+00 20 30 -1.00000000000000e+00 21 21 4.00000000000000e+00 21 11 -1.00000000000000e+00 21 22 -1.00000000000000e+00 21 31 -1.00000000000000e+00 22 22 4.00000000000000e+00 22 12 -1.00000000000000e+00 22 21 -1.00000000000000e+00 22 23 -1.00000000000000e+00 22 32 -1.00000000000000e+00 23 23 4.00000000000000e+00 23 13 -1.00000000000000e+00 23 22 -1.00000000000000e+00 23 24 -1.00000000000000e+00 23 33 -1.00000000000000e+00 24 24 4.00000000000000e+00 24 14 -1.00000000000000e+00 24 23 -1.00000000000000e+00 24 25 -1.00000000000000e+00 24 34 -1.00000000000000e+00 25 25 4.00000000000000e+00 25 15 -1.00000000000000e+00 25 24 -1.00000000000000e+00 25 26 -1.00000000000000e+00 25 35 -1.00000000000000e+00 26 26 4.00000000000000e+00 26 16 -1.00000000000000e+00 26 25 -1.00000000000000e+00 26 27 -1.00000000000000e+00 26 36 -1.00000000000000e+00 27 27 4.00000000000000e+00 27 17 -1.00000000000000e+00 27 26 -1.00000000000000e+00 27 28 -1.00000000000000e+00 27 37 -1.00000000000000e+00 28 28 4.00000000000000e+00 28 18 -1.00000000000000e+00 28 27 -1.00000000000000e+00 28 29 -1.00000000000000e+00 28 38 -1.00000000000000e+00 29 29 4.00000000000000e+00 29 19 -1.00000000000000e+00 29 28 -1.00000000000000e+00 29 30 -1.00000000000000e+00 29 39 -1.00000000000000e+00 30 30 4.00000000000000e+00 30 20 -1.00000000000000e+00 30 29 -1.00000000000000e+00 30 40 -1.00000000000000e+00 31 31 4.00000000000000e+00 31 21 -1.00000000000000e+00 31 32 -1.00000000000000e+00 31 41 -1.00000000000000e+00 32 32 4.00000000000000e+00 32 22 -1.00000000000000e+00 32 31 -1.00000000000000e+00 32 33 -1.00000000000000e+00 32 42 -1.00000000000000e+00 33 33 4.00000000000000e+00 33 23 -1.00000000000000e+00 33 32 -1.00000000000000e+00 33 34 -1.00000000000000e+00 33 43 -1.00000000000000e+00 34 34 4.00000000000000e+00 34 24 -1.00000000000000e+00 34 33 -1.00000000000000e+00 34 35 -1.00000000000000e+00 34 44 -1.00000000000000e+00 35 35 4.00000000000000e+00 35 25 -1.00000000000000e+00 35 34 -1.00000000000000e+00 35 36 -1.00000000000000e+00 35 45 -1.00000000000000e+00 36 36 4.00000000000000e+00 36 26 -1.00000000000000e+00 36 35 -1.00000000000000e+00 36 37 -1.00000000000000e+00 36 46 -1.00000000000000e+00 37 37 4.00000000000000e+00 37 27 -1.00000000000000e+00 37 36 -1.00000000000000e+00 37 38 -1.00000000000000e+00 37 47 -1.00000000000000e+00 38 38 4.00000000000000e+00 38 28 -1.00000000000000e+00 38 37 -1.00000000000000e+00 38 39 -1.00000000000000e+00 38 48 -1.00000000000000e+00 39 39 4.00000000000000e+00 39 29 -1.00000000000000e+00 39 38 -1.00000000000000e+00 39 40 -1.00000000000000e+00 39 49 -1.00000000000000e+00 40 40 4.00000000000000e+00 40 30 -1.00000000000000e+00 40 39 -1.00000000000000e+00 40 50 -1.00000000000000e+00 41 41 4.00000000000000e+00 41 31 -1.00000000000000e+00 41 42 -1.00000000000000e+00 41 51 -1.00000000000000e+00 42 42 4.00000000000000e+00 42 32 -1.00000000000000e+00 42 41 -1.00000000000000e+00 42 43 -1.00000000000000e+00 42 52 -1.00000000000000e+00 43 43 4.00000000000000e+00 43 33 -1.00000000000000e+00 43 42 -1.00000000000000e+00 43 44 -1.00000000000000e+00 43 53 -1.00000000000000e+00 44 44 4.00000000000000e+00 44 34 -1.00000000000000e+00 44 43 -1.00000000000000e+00 44 45 -1.00000000000000e+00 44 54 -1.00000000000000e+00 45 45 4.00000000000000e+00 45 35 -1.00000000000000e+00 45 44 -1.00000000000000e+00 45 46 -1.00000000000000e+00 45 55 -1.00000000000000e+00 46 46 4.00000000000000e+00 46 36 -1.00000000000000e+00 46 45 -1.00000000000000e+00 46 47 -1.00000000000000e+00 46 56 -1.00000000000000e+00 47 47 4.00000000000000e+00 47 37 -1.00000000000000e+00 47 46 -1.00000000000000e+00 47 48 -1.00000000000000e+00 47 57 -1.00000000000000e+00 48 48 4.00000000000000e+00 48 38 -1.00000000000000e+00 48 47 -1.00000000000000e+00 48 49 -1.00000000000000e+00 48 58 -1.00000000000000e+00 49 49 4.00000000000000e+00 49 39 -1.00000000000000e+00 49 48 -1.00000000000000e+00 49 50 -1.00000000000000e+00 49 59 -1.00000000000000e+00 50 50 4.00000000000000e+00 50 40 -1.00000000000000e+00 50 49 -1.00000000000000e+00 50 60 -1.00000000000000e+00 hypre-2.33.0/src/test/TEST_ij/schw.00001000066400000000000000000000000141477326011500172640ustar00rootroot0000000000000051 50 51 50 hypre-2.33.0/src/test/TEST_ij/schw.00002000066400000000000000000000144121477326011500172740ustar00rootroot0000000000000051 100 51 100 51 51 4.00000000000000e+00 51 52 -1.00000000000000e+00 51 61 -1.00000000000000e+00 51 41 -1.00000000000000e+00 52 52 4.00000000000000e+00 52 51 -1.00000000000000e+00 52 53 -1.00000000000000e+00 52 62 -1.00000000000000e+00 52 42 -1.00000000000000e+00 53 53 4.00000000000000e+00 53 52 -1.00000000000000e+00 53 54 -1.00000000000000e+00 53 63 -1.00000000000000e+00 53 43 -1.00000000000000e+00 54 54 4.00000000000000e+00 54 53 -1.00000000000000e+00 54 55 -1.00000000000000e+00 54 64 -1.00000000000000e+00 54 44 -1.00000000000000e+00 55 55 4.00000000000000e+00 55 54 -1.00000000000000e+00 55 56 -1.00000000000000e+00 55 65 -1.00000000000000e+00 55 45 -1.00000000000000e+00 56 56 4.00000000000000e+00 56 55 -1.00000000000000e+00 56 57 -1.00000000000000e+00 56 66 -1.00000000000000e+00 56 46 -1.00000000000000e+00 57 57 4.00000000000000e+00 57 56 -1.00000000000000e+00 57 58 -1.00000000000000e+00 57 67 -1.00000000000000e+00 57 47 -1.00000000000000e+00 58 58 4.00000000000000e+00 58 57 -1.00000000000000e+00 58 59 -1.00000000000000e+00 58 68 -1.00000000000000e+00 58 48 -1.00000000000000e+00 59 59 4.00000000000000e+00 59 58 -1.00000000000000e+00 59 60 -1.00000000000000e+00 59 69 -1.00000000000000e+00 59 49 -1.00000000000000e+00 60 60 4.00000000000000e+00 60 59 -1.00000000000000e+00 60 70 -1.00000000000000e+00 60 50 -1.00000000000000e+00 61 61 4.00000000000000e+00 61 51 -1.00000000000000e+00 61 62 -1.00000000000000e+00 61 71 -1.00000000000000e+00 62 62 4.00000000000000e+00 62 52 -1.00000000000000e+00 62 61 -1.00000000000000e+00 62 63 -1.00000000000000e+00 62 72 -1.00000000000000e+00 63 63 4.00000000000000e+00 63 53 -1.00000000000000e+00 63 62 -1.00000000000000e+00 63 64 -1.00000000000000e+00 63 73 -1.00000000000000e+00 64 64 4.00000000000000e+00 64 54 -1.00000000000000e+00 64 63 -1.00000000000000e+00 64 65 -1.00000000000000e+00 64 74 -1.00000000000000e+00 65 65 4.00000000000000e+00 65 55 -1.00000000000000e+00 65 64 -1.00000000000000e+00 65 66 -1.00000000000000e+00 65 75 -1.00000000000000e+00 66 66 4.00000000000000e+00 66 56 -1.00000000000000e+00 66 65 -1.00000000000000e+00 66 67 -1.00000000000000e+00 66 76 -1.00000000000000e+00 67 67 4.00000000000000e+00 67 57 -1.00000000000000e+00 67 66 -1.00000000000000e+00 67 68 -1.00000000000000e+00 67 77 -1.00000000000000e+00 68 68 4.00000000000000e+00 68 58 -1.00000000000000e+00 68 67 -1.00000000000000e+00 68 69 -1.00000000000000e+00 68 78 -1.00000000000000e+00 69 69 4.00000000000000e+00 69 59 -1.00000000000000e+00 69 68 -1.00000000000000e+00 69 70 -1.00000000000000e+00 69 79 -1.00000000000000e+00 70 70 4.00000000000000e+00 70 60 -1.00000000000000e+00 70 69 -1.00000000000000e+00 70 80 -1.00000000000000e+00 71 71 4.00000000000000e+00 71 61 -1.00000000000000e+00 71 72 -1.00000000000000e+00 71 81 -1.00000000000000e+00 72 72 4.00000000000000e+00 72 62 -1.00000000000000e+00 72 71 -1.00000000000000e+00 72 73 -1.00000000000000e+00 72 82 -1.00000000000000e+00 73 73 4.00000000000000e+00 73 63 -1.00000000000000e+00 73 72 -1.00000000000000e+00 73 74 -1.00000000000000e+00 73 83 -1.00000000000000e+00 74 74 4.00000000000000e+00 74 64 -1.00000000000000e+00 74 73 -1.00000000000000e+00 74 75 -1.00000000000000e+00 74 84 -1.00000000000000e+00 75 75 4.00000000000000e+00 75 65 -1.00000000000000e+00 75 74 -1.00000000000000e+00 75 76 -1.00000000000000e+00 75 85 -1.00000000000000e+00 76 76 4.00000000000000e+00 76 66 -1.00000000000000e+00 76 75 -1.00000000000000e+00 76 77 -1.00000000000000e+00 76 86 -1.00000000000000e+00 77 77 4.00000000000000e+00 77 67 -1.00000000000000e+00 77 76 -1.00000000000000e+00 77 78 -1.00000000000000e+00 77 87 -1.00000000000000e+00 78 78 4.00000000000000e+00 78 68 -1.00000000000000e+00 78 77 -1.00000000000000e+00 78 79 -1.00000000000000e+00 78 88 -1.00000000000000e+00 79 79 4.00000000000000e+00 79 69 -1.00000000000000e+00 79 78 -1.00000000000000e+00 79 80 -1.00000000000000e+00 79 89 -1.00000000000000e+00 80 80 4.00000000000000e+00 80 70 -1.00000000000000e+00 80 79 -1.00000000000000e+00 80 90 -1.00000000000000e+00 81 81 4.00000000000000e+00 81 71 -1.00000000000000e+00 81 82 -1.00000000000000e+00 81 91 -1.00000000000000e+00 82 82 4.00000000000000e+00 82 72 -1.00000000000000e+00 82 81 -1.00000000000000e+00 82 83 -1.00000000000000e+00 82 92 -1.00000000000000e+00 83 83 4.00000000000000e+00 83 73 -1.00000000000000e+00 83 82 -1.00000000000000e+00 83 84 -1.00000000000000e+00 83 93 -1.00000000000000e+00 84 84 4.00000000000000e+00 84 74 -1.00000000000000e+00 84 83 -1.00000000000000e+00 84 85 -1.00000000000000e+00 84 94 -1.00000000000000e+00 85 85 4.00000000000000e+00 85 75 -1.00000000000000e+00 85 84 -1.00000000000000e+00 85 86 -1.00000000000000e+00 85 95 -1.00000000000000e+00 86 86 4.00000000000000e+00 86 76 -1.00000000000000e+00 86 85 -1.00000000000000e+00 86 87 -1.00000000000000e+00 86 96 -1.00000000000000e+00 87 87 4.00000000000000e+00 87 77 -1.00000000000000e+00 87 86 -1.00000000000000e+00 87 88 -1.00000000000000e+00 87 97 -1.00000000000000e+00 88 88 4.00000000000000e+00 88 78 -1.00000000000000e+00 88 87 -1.00000000000000e+00 88 89 -1.00000000000000e+00 88 98 -1.00000000000000e+00 89 89 4.00000000000000e+00 89 79 -1.00000000000000e+00 89 88 -1.00000000000000e+00 89 90 -1.00000000000000e+00 89 99 -1.00000000000000e+00 90 90 4.00000000000000e+00 90 80 -1.00000000000000e+00 90 89 -1.00000000000000e+00 90 100 -1.00000000000000e+00 91 91 4.00000000000000e+00 91 81 -1.00000000000000e+00 91 92 -1.00000000000000e+00 92 92 4.00000000000000e+00 92 82 -1.00000000000000e+00 92 91 -1.00000000000000e+00 92 93 -1.00000000000000e+00 93 93 4.00000000000000e+00 93 83 -1.00000000000000e+00 93 92 -1.00000000000000e+00 93 94 -1.00000000000000e+00 94 94 4.00000000000000e+00 94 84 -1.00000000000000e+00 94 93 -1.00000000000000e+00 94 95 -1.00000000000000e+00 95 95 4.00000000000000e+00 95 85 -1.00000000000000e+00 95 94 -1.00000000000000e+00 95 96 -1.00000000000000e+00 96 96 4.00000000000000e+00 96 86 -1.00000000000000e+00 96 95 -1.00000000000000e+00 96 97 -1.00000000000000e+00 97 97 4.00000000000000e+00 97 87 -1.00000000000000e+00 97 96 -1.00000000000000e+00 97 98 -1.00000000000000e+00 98 98 4.00000000000000e+00 98 88 -1.00000000000000e+00 98 97 -1.00000000000000e+00 98 99 -1.00000000000000e+00 99 99 4.00000000000000e+00 99 89 -1.00000000000000e+00 99 98 -1.00000000000000e+00 99 100 -1.00000000000000e+00 100 100 4.00000000000000e+00 100 90 -1.00000000000000e+00 100 99 -1.00000000000000e+00 hypre-2.33.0/src/test/TEST_ij/smoother.jobs000077500000000000000000000076201477326011500204720ustar00rootroot00000000000000#!/bin/bash # Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) #============================================================================= # ij: Run default case with different smoothers # 1: hybrid SOR on 3 procs # 2: hybrid scaled symGS on 4 procs. with scaled opt. outer wt on fine level # 3: hybrid GS on 4 procs with backward solve GS on up cycle # 4: hybrid GS, no CF-relaxation, on 4 procs # 5: hybrid SOR on 4 procs, determine a weight automatically # 6: use Schwarz smoothing on first level # 7: use Schwarz smoothing on first level with automatic weight determination # 8: use 3 level Schwarz smoothing with automatic weight determination # followed by SSOR with automatic weight determination # 9: CF Jacobi on 3 procs # 10: CF L1 Jacobi on 3 procs # 11: L1 Jacobi on 3 procs # 12: L1 Gauss-Seidel on 4 procs # 13: Polynomial (Chebyshev 2nd order) on 4 procs # 14: Polynomial (Chebyshev 3rd order) on 4 procs # 15: FCF Jacobi on 4 procs # 16: CG smoother on 4 procs # 17-20: Polynomial (Chebyshev 2nd order) with various options #============================================================================= mpirun -np 3 ./ij -rhsrand -n 15 30 10 -w 1.1 -owl 1.0 0 \ > smoother.out.0 mpirun -np 4 ./ij -rhsrand -n 15 15 10 -P 2 2 1 -rlx 6 -owl -10 0 \ > smoother.out.1 mpirun -np 4 ./ij -rhsrand -n 20 20 10 -P 2 2 1 -rlx_up 4 \ > smoother.out.2 mpirun -np 4 ./ij -rhsrand -n 20 20 10 -P 2 2 1 -CF 1 \ > smoother.out.3 mpirun -np 4 ./ij -rhsrand -solver 1 -rlx 6 -n 20 20 10 -P 2 2 1 \ -w -10 > smoother.out.4 mpirun -np 3 ./ij -rhsrand -fromfile schw -agg_nl 1 -smlv 1 > smoother.out.5 mpirun -np 4 ./ij -rhsrand -solver 1 -rlx 6 -n 20 20 10 -P 2 2 1 \ -sysL 2 -nf 2 -smlv 1 -smtype 6 -dom 1 -ov 0 -var 1 -ow -10 -sw -10 \ > smoother.out.6 mpirun -np 4 ./ij -rlx 6 -n 20 20 10 -P 2 2 1 -sysL 3 -nf 3 -smlv 3 \ -smtype 6 -dom 1 -ov 0 -w -10 -sw -10 \ > smoother.out.7 mpirun -np 3 ./ij -rhsrand -n 15 30 10 -rlx 0 -CF 1 \ > smoother.out.8 mpirun -np 3 ./ij -rhsrand -n 15 30 10 -rlx 18 -CF 1 \ > smoother.out.9 mpirun -np 3 ./ij -rhsrand -n 15 30 10 -rlx 18 \ > smoother.out.10 mpirun -np 4 ./ij -rhsrand -solver 1 -rlx 8 -n 20 20 10 -P 2 2 1 \ > smoother.out.11 mpirun -np 4 ./ij -rhsrand -solver 1 -rlx 88 -n 20 20 10 -P 2 2 1 \ > smoother.out.11.1 mpirun -np 4 ./ij -rhsrand -solver 1 -rlx 89 -n 20 20 10 -P 2 2 1 \ > smoother.out.11.2 mpirun -np 4 ./ij -rhsrand -solver 1 -rlx 16 -n 20 20 10 -P 2 2 1 \ > smoother.out.12 mpirun -np 4 ./ij -rhsrand -solver 1 -rlx 16 -cheby_order 3 -n 20 20 10 \ -P 2 2 1 > smoother.out.13 mpirun -np 4 ./ij -rhsrand -solver 1 -rlx 17 -n 20 20 10 -P 2 2 1 \ > smoother.out.14 mpirun -np 4 ./ij -rhsrand -solver 1 -rlx 15 -n 20 20 10 -P 2 2 1 \ > smoother.out.15 mpirun -np 4 ./ij -rhsrand -solver 1 -rlx 16 -cheby_scale 0 -n 20 20 20 \ -P 2 2 1 -27pt > smoother.out.16 mpirun -np 4 ./ij -rhsrand -solver 1 -rlx 16 -cheby_variant 1 -n 20 20 20 \ -P 2 2 1 > smoother.out.17 mpirun -np 4 ./ij -solver 3 -rlx 16 -cheby_eig_est 0 -n 40 40 20 \ -P 2 2 1 -difconv -a 10 10 10 > smoother.out.18 mpirun -np 4 ./ij -rhsrand -solver 1 -rlx 16 -rotate -alpha 60 -eps 0.1 -cheby_fraction 0.2 -n 200 200 1 \ -P 2 2 1 > smoother.out.19 mpirun -np 4 ./ij -solver 1 -rlx 16 -cheby_eig_est 5 -n 40 40 20 \ -P 2 2 1 -vardifconv -eps 0.1 > smoother.out.20 mpirun -np 4 ./ij -solver 1 -rlx 16 -cheby_eig_est 10 -cheby_scale 0 -n 40 40 20 -P 2 2 1 \ > smoother.out.21 mpirun -np 4 ./ij -solver 1 -rlx 16 -cheby_eig_est 10 -cheby_scale 1 -n 40 40 20 -P 2 2 1 \ > smoother.out.22 mpirun -np 4 ./ij -solver 1 -rlx 16 -cheby_eig_est 0 -cheby_scale 1 -n 40 40 20 -P 2 2 1 \ > smoother.out.23 mpirun -np 4 ./ij -solver 1 -rlx 16 -cheby_eig_est 0 -cheby_scale 0 -n 40 40 20 -P 2 2 1 \ > smoother.out.24 hypre-2.33.0/src/test/TEST_ij/smoother.saved000066400000000000000000000054761477326011500206430ustar00rootroot00000000000000# Output file: smoother.out.0 Average Convergence Factor = 0.239197 Complexity: grid = 1.608444 operator = 2.760673 cycle = 5.520808 # Output file: smoother.out.1 Average Convergence Factor = 0.114249 Complexity: grid = 1.587556 operator = 2.684082 cycle = 5.365714 # Output file: smoother.out.2 Average Convergence Factor = 0.200420 Complexity: grid = 1.601000 operator = 2.738485 cycle = 5.476364 # Output file: smoother.out.3 Average Convergence Factor = 0.120196 Complexity: grid = 1.601000 operator = 2.738485 cycle = 5.476364 # Output file: smoother.out.4 Iterations = 6 Final Relative Residual Norm = 5.846604e-09 # Output file: smoother.out.5 BoomerAMG Iterations = 17 Final Relative Residual Norm = 5.893051e-09 # Output file: smoother.out.6 Iterations = 10 Final Relative Residual Norm = 5.359205e-09 # Output file: smoother.out.7 BoomerAMG Iterations = 18 Final Relative Residual Norm = 7.334921e-09 # Output file: smoother.out.8 BoomerAMG Iterations = 11 Final Relative Residual Norm = 7.457693e-09 # Output file: smoother.out.9 BoomerAMG Iterations = 17 Final Relative Residual Norm = 4.979125e-09 # Output file: smoother.out.10 BoomerAMG Iterations = 23 Final Relative Residual Norm = 8.254191e-09 # Output file: smoother.out.11 Iterations = 6 Final Relative Residual Norm = 2.509163e-09 # Output file: smoother.out.11.1 Iterations = 6 Final Relative Residual Norm = 2.881634e-09 # Output file: smoother.out.11.2 Iterations = 6 Final Relative Residual Norm = 3.877871e-10 # Output file: smoother.out.12 Iterations = 6 Final Relative Residual Norm = 2.510130e-09 # Output file: smoother.out.13 Iterations = 5 Final Relative Residual Norm = 6.702200e-09 # Output file: smoother.out.14 Iterations = 6 Final Relative Residual Norm = 5.044385e-10 # Output file: smoother.out.15 Iterations = 15 Final Relative Residual Norm = 5.807749e-09 # Output file: smoother.out.16 Iterations = 6 Final Relative Residual Norm = 1.555966e-09 # Output file: smoother.out.17 Iterations = 7 Final Relative Residual Norm = 2.088732e-09 # Output file: smoother.out.18 GMRES Iterations = 11 Final GMRES Relative Residual Norm = 8.192864e-09 # Output file: smoother.out.19 Iterations = 6 Final Relative Residual Norm = 8.887087e-10 # Output file: smoother.out.20 Iterations = 11 Final Relative Residual Norm = 3.089502e-09 # Output file: smoother.out.21 Iterations = 8 Final Relative Residual Norm = 8.065309e-10 # Output file: smoother.out.22 Iterations = 7 Final Relative Residual Norm = 7.310897e-09 # Output file: smoother.out.23 Iterations = 8 Final Relative Residual Norm = 2.608713e-09 # Output file: smoother.out.24 Iterations = 9 Final Relative Residual Norm = 3.848198e-09 hypre-2.33.0/src/test/TEST_ij/smoother.saved.aurora000066400000000000000000000054761477326011500221330ustar00rootroot00000000000000# Output file: smoother.out.0 Average Convergence Factor = 0.431523 Complexity: grid = 1.421333 operator = 2.629966 cycle = 5.257845 # Output file: smoother.out.1 Average Convergence Factor = 0.110961 Complexity: grid = 1.410222 operator = 2.566327 cycle = 5.131565 # Output file: smoother.out.2 Average Convergence Factor = 0.212015 Complexity: grid = 1.391500 operator = 2.577045 cycle = 5.153750 # Output file: smoother.out.3 Average Convergence Factor = 0.412913 Complexity: grid = 1.391500 operator = 2.577045 cycle = 5.153750 # Output file: smoother.out.4 Iterations = 7 Final Relative Residual Norm = 1.278668e-09 # Output file: smoother.out.5 BoomerAMG Iterations = 15 Final Relative Residual Norm = 5.891292e-09 # Output file: smoother.out.6 Iterations = 12 Final Relative Residual Norm = 2.096851e-09 # Output file: smoother.out.7 BoomerAMG Iterations = 26 Final Relative Residual Norm = 6.720942e-09 # Output file: smoother.out.8 BoomerAMG Iterations = 16 Final Relative Residual Norm = 5.214696e-09 # Output file: smoother.out.9 BoomerAMG Iterations = 21 Final Relative Residual Norm = 6.303936e-09 # Output file: smoother.out.10 BoomerAMG Iterations = 25 Final Relative Residual Norm = 7.215178e-09 # Output file: smoother.out.11 Iterations = 6 Final Relative Residual Norm = 9.298524e-09 # Output file: smoother.out.11.1 Iterations = 7 Final Relative Residual Norm = 5.260748e-10 # Output file: smoother.out.11.2 Iterations = 6 Final Relative Residual Norm = 2.206219e-09 # Output file: smoother.out.12 Iterations = 7 Final Relative Residual Norm = 8.196976e-10 # Output file: smoother.out.13 Iterations = 6 Final Relative Residual Norm = 1.773257e-09 # Output file: smoother.out.14 Iterations = 7 Final Relative Residual Norm = 2.271932e-09 # Output file: smoother.out.15 Iterations = 11 Final Relative Residual Norm = 3.586129e-09 # Output file: smoother.out.16 Iterations = 6 Final Relative Residual Norm = 1.304969e-09 # Output file: smoother.out.17 Iterations = 8 Final Relative Residual Norm = 9.180516e-10 # Output file: smoother.out.18 GMRES Iterations = 11 Final GMRES Relative Residual Norm = 4.221402e-09 # Output file: smoother.out.19 Iterations = 8 Final Relative Residual Norm = 8.108092e-10 # Output file: smoother.out.20 Iterations = 12 Final Relative Residual Norm = 1.470318e-09 # Output file: smoother.out.21 Iterations = 8 Final Relative Residual Norm = 7.703209e-09 # Output file: smoother.out.22 Iterations = 8 Final Relative Residual Norm = 5.187397e-09 # Output file: smoother.out.23 Iterations = 9 Final Relative Residual Norm = 1.766467e-09 # Output file: smoother.out.24 Iterations = 9 Final Relative Residual Norm = 4.371789e-09 hypre-2.33.0/src/test/TEST_ij/smoother.saved.lassen000066400000000000000000000054761477326011500221270ustar00rootroot00000000000000# Output file: smoother.out.0 Average Convergence Factor = 0.431493 Complexity: grid = 1.408000 operator = 2.614613 cycle = 5.228687 # Output file: smoother.out.1 Average Convergence Factor = 0.113256 Complexity: grid = 1.408889 operator = 2.556327 cycle = 5.110952 # Output file: smoother.out.2 Average Convergence Factor = 0.224466 Complexity: grid = 1.405000 operator = 2.599848 cycle = 5.197424 # Output file: smoother.out.3 Average Convergence Factor = 0.421413 Complexity: grid = 1.405000 operator = 2.599848 cycle = 5.197424 # Output file: smoother.out.4 Iterations = 7 Final Relative Residual Norm = 1.555935e-09 # Output file: smoother.out.5 BoomerAMG Iterations = 16 Final Relative Residual Norm = 5.453527e-09 # Output file: smoother.out.6 Iterations = 12 Final Relative Residual Norm = 2.566134e-09 # Output file: smoother.out.7 BoomerAMG Iterations = 25 Final Relative Residual Norm = 7.315253e-09 # Output file: smoother.out.8 BoomerAMG Iterations = 17 Final Relative Residual Norm = 4.008618e-09 # Output file: smoother.out.9 BoomerAMG Iterations = 21 Final Relative Residual Norm = 5.801823e-09 # Output file: smoother.out.10 BoomerAMG Iterations = 25 Final Relative Residual Norm = 7.183351e-09 # Output file: smoother.out.11 Iterations = 7 Final Relative Residual Norm = 5.165447e-10 # Output file: smoother.out.11.1 Iterations = 7 Final Relative Residual Norm = 7.894184e-10 # Output file: smoother.out.11.2 Iterations = 6 Final Relative Residual Norm = 2.796467e-09 # Output file: smoother.out.12 Iterations = 7 Final Relative Residual Norm = 1.029948e-09 # Output file: smoother.out.13 Iterations = 6 Final Relative Residual Norm = 2.623731e-09 # Output file: smoother.out.14 Iterations = 7 Final Relative Residual Norm = 2.017716e-09 # Output file: smoother.out.15 Iterations = 11 Final Relative Residual Norm = 6.677405e-09 # Output file: smoother.out.16 Iterations = 6 Final Relative Residual Norm = 1.779789e-09 # Output file: smoother.out.17 Iterations = 8 Final Relative Residual Norm = 8.751128e-10 # Output file: smoother.out.18 GMRES Iterations = 11 Final GMRES Relative Residual Norm = 7.508329e-09 # Output file: smoother.out.19 Iterations = 8 Final Relative Residual Norm = 7.890622e-10 # Output file: smoother.out.20 Iterations = 12 Final Relative Residual Norm = 4.179250e-09 # Output file: smoother.out.21 Iterations = 8 Final Relative Residual Norm = 7.563157e-09 # Output file: smoother.out.22 Iterations = 8 Final Relative Residual Norm = 4.121892e-09 # Output file: smoother.out.23 Iterations = 9 Final Relative Residual Norm = 1.248089e-09 # Output file: smoother.out.24 Iterations = 9 Final Relative Residual Norm = 4.848620e-09 hypre-2.33.0/src/test/TEST_ij/smoother.saved.lassen_cpu000066400000000000000000000054761477326011500227760ustar00rootroot00000000000000# Output file: smoother.out.0 Average Convergence Factor = 0.239194 Complexity: grid = 1.608444 operator = 2.760808 cycle = 5.521077 # Output file: smoother.out.1 Average Convergence Factor = 0.114248 Complexity: grid = 1.587556 operator = 2.683946 cycle = 5.365442 # Output file: smoother.out.2 Average Convergence Factor = 0.200422 Complexity: grid = 1.601000 operator = 2.738333 cycle = 5.476061 # Output file: smoother.out.3 Average Convergence Factor = 0.120193 Complexity: grid = 1.601000 operator = 2.738333 cycle = 5.476061 # Output file: smoother.out.4 Iterations = 6 Final Relative Residual Norm = 5.847352e-09 # Output file: smoother.out.5 BoomerAMG Iterations = 17 Final Relative Residual Norm = 5.893051e-09 # Output file: smoother.out.6 Iterations = 10 Final Relative Residual Norm = 5.359240e-09 # Output file: smoother.out.7 BoomerAMG Iterations = 18 Final Relative Residual Norm = 7.391197e-09 # Output file: smoother.out.8 BoomerAMG Iterations = 11 Final Relative Residual Norm = 7.427657e-09 # Output file: smoother.out.9 BoomerAMG Iterations = 17 Final Relative Residual Norm = 4.933895e-09 # Output file: smoother.out.10 BoomerAMG Iterations = 23 Final Relative Residual Norm = 8.200305e-09 # Output file: smoother.out.11 Iterations = 6 Final Relative Residual Norm = 2.508901e-09 # Output file: smoother.out.11.1 Iterations = 6 Final Relative Residual Norm = 2.881660e-09 # Output file: smoother.out.11.2 Iterations = 6 Final Relative Residual Norm = 3.875555e-10 # Output file: smoother.out.12 Iterations = 6 Final Relative Residual Norm = 2.508759e-09 # Output file: smoother.out.13 Iterations = 5 Final Relative Residual Norm = 6.702046e-09 # Output file: smoother.out.14 Iterations = 6 Final Relative Residual Norm = 5.041183e-10 # Output file: smoother.out.15 Iterations = 15 Final Relative Residual Norm = 5.817439e-09 # Output file: smoother.out.16 Iterations = 6 Final Relative Residual Norm = 1.555966e-09 # Output file: smoother.out.17 Iterations = 7 Final Relative Residual Norm = 2.088773e-09 # Output file: smoother.out.18 GMRES Iterations = 11 Final GMRES Relative Residual Norm = 7.591488e-09 # Output file: smoother.out.19 Iterations = 6 Final Relative Residual Norm = 8.887235e-10 # Output file: smoother.out.20 Iterations = 11 Final Relative Residual Norm = 2.175824e-09 # Output file: smoother.out.21 Iterations = 8 Final Relative Residual Norm = 8.625152e-10 # Output file: smoother.out.22 Iterations = 7 Final Relative Residual Norm = 8.370996e-09 # Output file: smoother.out.23 Iterations = 8 Final Relative Residual Norm = 3.171595e-09 # Output file: smoother.out.24 Iterations = 9 Final Relative Residual Norm = 1.481290e-09 hypre-2.33.0/src/test/TEST_ij/smoother.sh000077500000000000000000000030201477326011500201350ustar00rootroot00000000000000#!/bin/bash # Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) TNAME=`basename $0 .sh` RTOL=$1 ATOL=$2 #============================================================================= # compare with baseline case #============================================================================= FILES="\ ${TNAME}.out.0\ ${TNAME}.out.1\ ${TNAME}.out.2\ ${TNAME}.out.3\ " for i in $FILES do echo "# Output file: $i" tail -21 $i | head -6 done > ${TNAME}.out FILES="\ ${TNAME}.out.4\ ${TNAME}.out.5\ ${TNAME}.out.6\ ${TNAME}.out.7\ ${TNAME}.out.8\ ${TNAME}.out.9\ ${TNAME}.out.10\ ${TNAME}.out.11\ ${TNAME}.out.11.1\ ${TNAME}.out.11.2\ ${TNAME}.out.12\ ${TNAME}.out.13\ ${TNAME}.out.14\ ${TNAME}.out.15\ ${TNAME}.out.16\ ${TNAME}.out.17\ ${TNAME}.out.18\ ${TNAME}.out.19\ ${TNAME}.out.20\ ${TNAME}.out.21\ ${TNAME}.out.22\ ${TNAME}.out.23\ ${TNAME}.out.24\ " for i in $FILES do echo "# Output file: $i" tail -3 $i done >> ${TNAME}.out # Make sure that the output file is reasonable RUNCOUNT=`echo $FILES | wc -w` OUTCOUNT=`grep "Iterations" ${TNAME}.out | wc -l` if [ "$OUTCOUNT" != "$RUNCOUNT" ]; then echo "Incorrect number of runs in ${TNAME}.out" >&2 fi #============================================================================= # remove temporary files #============================================================================= # rm -f ${TNAME}.testdata* hypre-2.33.0/src/test/TEST_ij/solvers.jobs000077500000000000000000000201051477326011500203200ustar00rootroot00000000000000#!/bin/bash # Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) #============================================================================= # ij: Run default case with different solvers # 1: BoomerAMG_PCG # 2: DS_PCG # 3: BoomerAMG_GMRES # 4: DS_GMRES # 5: BoomerAMG_CGNR # 6: DS_CGNR # 7: PILUT_GMRES # 8: ParaSails_PCG # 16: BoomerAMG_COGMRES # 17: DS_COGMRES # 20: Hybrid_PCG # ij: test systems AMG # unknown approach # hybrid approach with block smoother # nodal approach # more solvers: # 51: BoomerAMG_LGMRES # 50: DS_LGMRES # 61: BoomerAMG_FlexGMRES # 60: DS_FlexGMRES # #============================================================================= mpirun -np 2 ./ij -solver 1 -rhsrand > solvers.out.0 mpirun -np 2 ./ij -solver 2 -rhsrand > solvers.out.1 mpirun -np 2 ./ij -solver 3 -rhsrand > solvers.out.2 mpirun -np 2 ./ij -solver 4 -rhsrand > solvers.out.3 mpirun -np 2 ./ij -solver 5 -rhsrand -w 0.67 -ns 2 > solvers.out.4 mpirun -np 2 ./ij -solver 6 -rhsrand > solvers.out.5 #mpirun -np 2 ./ij -solver 7 -rhsrand > solvers.out.6 #mpirun -np 2 ./ij -solver 8 -rhsrand > solvers.out.7 mpirun -np 2 ./ij -solver 20 -rhsrand > solvers.out.8 mpirun -np 2 ./ij -solver 20 -cf 0.5 -rhsrand > solvers.out.9 mpirun -np 2 ./ij -solver 20 -cf 0.5 -rhsrand -solver_type 2 > solvers.out.10 mpirun -np 2 ./ij -solver 20 -cf 0.5 -rhsrand -solver_type 3 > solvers.out.11 mpirun -np 2 ./ij -solver 16 -rhsrand > solvers.out.12 mpirun -np 2 ./ij -solver 17 -rhsrand > solvers.out.13 mpirun -np 2 ./ij -solver 17 -rhsrand -cgs 2 > solvers.out.14 mpirun -np 2 ./ij -solver 17 -rhsrand -cgs 2 -unroll 8 > solvers.out.15 mpirun -np 2 ./ij -solver 17 -rhsrand -unroll 4 > solvers.out.16 mpirun -np 2 ./ij -solver 3 -rhsrand -check_residual > solvers.out.17 mpirun -np 2 ./ij -solver 4 -rhsrand -check_residual > solvers.out.18 mpirun -np 3 ./ij -n 23 29 31 -solver 1 -rhsrand -precon_cycles 2 -rlx 18 > solvers.out.19 mpirun -np 4 ./ij -n 23 29 31 -solver 3 -rhsrand -precon_cycles 3 -rlx 18 > solvers.out.20 mpirun -np 2 ./ij -n 23 29 31 -solver 0 -rhsrand -mu 2 -rlx 18 > solvers.out.21 mpirun -np 2 ./ij -n 23 29 31 -solver 3 -rhsrand -mu 2 -rlx 18 > solvers.out.22 mpirun -np 2 ./ij -n 23 29 31 -solver 0 -rhsrand -fmg -rlx 18 > solvers.out.23 mpirun -np 2 ./ij -n 23 29 31 -solver 3 -rhsrand -fmg -rlx 18 > solvers.out.24 #flexible CG vs CG; AMG with CG smoother mpirun -np 2 ./ij -solver 1 -rlx 15 -flex 1 > solvers.out.25 mpirun -np 2 ./ij -solver 1 -rlx 15 > solvers.out.26 #systems AMG run ...unknown approach, hybrid approach, nodal approach mpirun -np 2 ./ij -n 20 20 20 -sysL 2 -nf 2 > solvers.out.sysu mpirun -np 2 ./ij -n 20 20 20 -sysL 2 -nf 2 -nodal 1 -smtype 6 -smlv 10 -dom 1 -ov 0 > solvers.out.sysh mpirun -np 2 ./ij -n 20 20 20 -sysL 2 -nf 2 -interptype 10 -Pmx 6 > solvers.out.sysn #systems AMG using unknown approach and filtering mpirun -np 1 ./ij -solver 1 -n 8 8 8 -sysL 2 -nf 2 -ff 1 > solvers.out.27 mpirun -np 1 ./ij -solver 1 -n 8 8 8 -sysL 3 -nf 3 -ff 1 > solvers.out.28 mpirun -np 4 ./ij -solver 1 -n 8 8 8 -sysL 2 -nf 2 -ff 1 > solvers.out.29 mpirun -np 4 ./ij -solver 1 -n 8 8 8 -sysL 3 -nf 3 -ff 1 > solvers.out.30 #LGMRS and FlexGMRES mpirun -np 2 ./ij -solver 50 -rhsrand > solvers.out.101 mpirun -np 2 ./ij -solver 51 -rhsrand > solvers.out.102 mpirun -np 2 ./ij -solver 60 -rhsrand > solvers.out.103 mpirun -np 2 ./ij -solver 61 -rhsrand > solvers.out.104 #agglomerated coarse grid solve mpirun -np 8 ./ij -n 80 80 80 -P 2 2 2 -agg_nl 1 -seq_th 100 -solver 1 -rlx 6 > solvers.out.105 mpirun -np 8 ./ij -n 40 40 40 -P 2 2 2 -agg_nl 1 -seq_th 100 -solver 1 -rlx 6 -sysL 3 -nf 3 > solvers.out.107 #redundant coarse grid solve mpirun -np 8 ./ij -n 80 80 80 -P 2 2 2 -agg_nl 1 -seq_th 100 -solver 1 -rlx 6 -red 1 > solvers.out.106 mpirun -np 8 ./ij -n 40 40 40 -P 2 2 2 -agg_nl 1 -seq_th 100 -solver 1 -rlx 6 -sysL 3 -nf 3 -red 1 > solvers.out.108 #additive cycles mpirun -np 2 ./ij -n 20 20 20 -P 2 1 1 -agg_nl 1 -solver 1 -CF 0 -rlx 0 -w 0.7 -rlx_coarse 0 -ns_coarse 2 > solvers.out.109 mpirun -np 2 ./ij -n 20 20 20 -P 2 1 1 -agg_nl 1 -solver 1 -CF 0 -add_rlx 0 -add_w 0.7 -mult_add 0 > solvers.out.110 mpirun -np 4 ./ij -n 20 20 20 -P 2 2 1 -agg_nl 1 -solver 1 -simple 0 > solvers.out.111 mpirun -np 8 ./ij -n 20 20 20 -P 2 2 2 -agg_nl 1 -solver 3 -additive 1 > solvers.out.112 mpirun -np 8 ./ij -n 20 20 20 -P 2 2 2 -agg_nl 1 -solver 3 -mult_add 0 -add_Pmx 5 > solvers.out.113 mpirun -np 8 ./ij -n 20 20 20 -P 2 2 2 -agg_nl 1 -solver 3 -mult_add 0 -add_Pmx 5 -add_end 2 > solvers.out.118 mpirun -np 8 ./ij -n 20 20 20 -P 2 2 2 -agg_nl 1 -solver 3 -mult_add 0 -ns 2 > solvers.out.119 mpirun -np 8 ./ij -n 20 20 20 -P 2 2 2 -agg_nl 1 -solver 3 -mult_add 0 -ns 1 > solvers.out.121 mpirun -np 8 ./ij -n 20 20 20 -P 2 2 2 -agg_nl 1 -solver 3 -mult_add 0 -ns 2 -rap 1 > solvers.out.122 mpirun -np 8 ./ij -n 20 20 20 -P 2 2 2 -agg_nl 1 -solver 3 -rlx 18 -ns 2 -rlx_coarse 18 -ns_coarse 2 > solvers.out.120 #nonGalerkin version mpirun -np 8 ./ij -n 40 40 40 -P 2 2 2 -nongalerk_tol 1 0.03 > solvers.out.114 mpirun -np 8 ./ij -n 40 40 40 -P 2 2 2 -nongalerk_tol 3 0.0 0.01 0.05 > solvers.out.115 #RAP options mpirun -np 8 ./ij -n 40 40 40 -P 2 2 2 -solver 3 -rap 0 > solvers.out.116 mpirun -np 8 ./ij -n 40 40 40 -P 2 2 2 -solver 3 -rap 1 > solvers.out.117 # # MGR and MGR-PCG # # coarse grid solver checks (1-level MGR == AMG (or coarse grid solver)) # Also checks for keeping coarse nodes to coarsest level # coarse grid size in output should be ~ mgr_num_reserved_nodes mpirun -np 2 ./ij -solver 70 -mgr_nlevels 0 -mgr_bsize 2 -mgr_num_reserved_nodes 0 > solvers.out.200 mpirun -np 2 ./ij -solver 70 -mgr_nlevels 0 -mgr_bsize 2 -mgr_num_reserved_nodes 100 > solvers.out.201 mpirun -np 2 ./ij -solver 70 -mgr_nlevels 1 -mgr_bsize 1 -mgr_num_reserved_nodes 0 > solvers.out.202 mpirun -np 2 ./ij -solver 70 -mgr_nlevels 1 -mgr_bsize 1 -mgr_num_reserved_nodes 100 > solvers.out.203 # multi level MGR tests with different coarse grid type strategies # Fix non C points to F points with different F-relaxation methods (single/multilevel F-relaxation) # with/ without reserved coarse nodes mpirun -np 2 ./ij -solver 70 -mgr_nlevels 1 -mgr_bsize 2 -mgr_non_c_to_f 1 -mgr_frelax_method 0 -mgr_num_reserved_nodes 0 > solvers.out.204 mpirun -np 2 ./ij -solver 70 -mgr_nlevels 1 -mgr_bsize 2 -mgr_non_c_to_f 1 -mgr_frelax_method 0 -mgr_num_reserved_nodes 100 > solvers.out.205 mpirun -np 2 ./ij -solver 70 -mgr_nlevels 1 -mgr_bsize 2 -mgr_non_c_to_f 1 -mgr_frelax_method 1 -mgr_num_reserved_nodes 0 > solvers.out.206 mpirun -np 2 ./ij -solver 70 -mgr_nlevels 1 -mgr_bsize 2 -mgr_non_c_to_f 1 -mgr_frelax_method 1 -mgr_num_reserved_nodes 100 > solvers.out.207 # Not fixed non C points to F points with different F-relaxation methods (single/multilevel F-relaxation) # with/ without reserved coarse nodes mpirun -np 2 ./ij -solver 70 -mgr_nlevels 5 -mgr_bsize 2 -mgr_non_c_to_f 0 -mgr_frelax_method 0 -mgr_num_reserved_nodes 0 > solvers.out.208 mpirun -np 2 ./ij -solver 70 -mgr_nlevels 5 -mgr_bsize 2 -mgr_non_c_to_f 0 -mgr_frelax_method 0 -mgr_num_reserved_nodes 100 > solvers.out.209 mpirun -np 2 ./ij -solver 70 -mgr_nlevels 5 -mgr_bsize 2 -mgr_non_c_to_f 0 -mgr_frelax_method 1 -mgr_num_reserved_nodes 0 > solvers.out.210 mpirun -np 2 ./ij -solver 70 -mgr_nlevels 5 -mgr_bsize 2 -mgr_non_c_to_f 0 -mgr_frelax_method 1 -mgr_num_reserved_nodes 100 > solvers.out.211 # MGR-PCG tests mpirun -np 2 ./ij -solver 71 -mgr_nlevels 0 -mgr_bsize 2 -mgr_non_c_to_f 0 -mgr_frelax_method 0 -mgr_num_reserved_nodes 0 > solvers.out.212 mpirun -np 2 ./ij -solver 71 -mgr_nlevels 1 -mgr_bsize 2 -mgr_non_c_to_f 0 -mgr_frelax_method 0 -mgr_num_reserved_nodes 0 > solvers.out.213 ## Test relaxation methods 88 (L1 hybrid Symm. Gauss-Seidel with a convergent l1 term) and 89 (L1 Symm. hybrid Gauss-Seidel) mpirun -np 4 ./ij -fromfile data/tucker21935/IJ.A -solver 1 -rlx 88 > solvers.out.404 mpirun -np 4 ./ij -fromfile data/tucker21935/IJ.A -solver 1 -rlx 89 > solvers.out.405 hypre-2.33.0/src/test/TEST_ij/solvers.saved000066400000000000000000000162341477326011500204720ustar00rootroot00000000000000# Output file: solvers.out.0 Iterations = 7 Final Relative Residual Norm = 3.095059e-09 # Output file: solvers.out.1 Iterations = 41 Final Relative Residual Norm = 6.698760e-09 # Output file: solvers.out.2 GMRES Iterations = 7 Final GMRES Relative Residual Norm = 4.842561e-09 # Output file: solvers.out.3 GMRES Iterations = 93 Final GMRES Relative Residual Norm = 8.225661e-09 # Output file: solvers.out.4 Iterations = 9 Final Relative Residual Norm = 3.723663e-09 # Output file: solvers.out.5 Iterations = 196 Final Relative Residual Norm = 9.097622e-09 # Output file: solvers.out.8 Iterations = 41 PCG_Iterations = 0 DSCG_Iterations = 41 Final Relative Residual Norm = 6.698760e-09 # Output file: solvers.out.9 Iterations = 11 PCG_Iterations = 7 DSCG_Iterations = 4 Final Relative Residual Norm = 6.805037e-10 # Output file: solvers.out.10 Iterations = 9 PCG_Iterations = 7 DSCG_Iterations = 2 Final Relative Residual Norm = 4.842561e-09 # Output file: solvers.out.11 Iterations = 7 PCG_Iterations = 4 DSCG_Iterations = 3 Final Relative Residual Norm = 1.289995e-10 # Output file: solvers.out.12 COGMRES Iterations = 7 Final COGMRES Relative Residual Norm = 4.842561e-09 # Output file: solvers.out.13 COGMRES Iterations = 93 Final COGMRES Relative Residual Norm = 8.225661e-09 # Output file: solvers.out.14 COGMRES Iterations = 93 Final COGMRES Relative Residual Norm = 8.225661e-09 # Output file: solvers.out.15 COGMRES Iterations = 93 Final COGMRES Relative Residual Norm = 8.225661e-09 # Output file: solvers.out.16 COGMRES Iterations = 93 Final COGMRES Relative Residual Norm = 8.225662e-09 # Output file: solvers.out.17 index 19 value -2.653309e-11 GMRES Iterations = 7 Final GMRES Relative Residual Norm = 4.842561e-09 # Output file: solvers.out.18 index 19 value -7.497267e-11 GMRES Iterations = 93 Final GMRES Relative Residual Norm = 8.225661e-09 # Output file: solvers.out.19 Iterations = 8 Final Relative Residual Norm = 2.463625e-09 # Output file: solvers.out.20 GMRES Iterations = 7 Final GMRES Relative Residual Norm = 5.912905e-10 # Output file: solvers.out.21 BoomerAMG Iterations = 23 Final Relative Residual Norm = 5.120965e-09 # Output file: solvers.out.22 GMRES Iterations = 11 Final GMRES Relative Residual Norm = 7.241893e-09 # Output file: solvers.out.23 BoomerAMG Iterations = 15 Final Relative Residual Norm = 5.927198e-09 # Output file: solvers.out.24 GMRES Iterations = 9 Final GMRES Relative Residual Norm = 2.177357e-09 # Output file: solvers.out.25 Iterations = 9 Final Relative Residual Norm = 9.023254e-09 # Output file: solvers.out.26 Iterations = 18 Final Relative Residual Norm = 9.578132e-09 # Output file: solvers.out.sysh Average Convergence Factor = 0.119746 Complexity: grid = 1.613875 operator = 2.860205 cycle = 5.720112 # Output file: solvers.out.sysn Average Convergence Factor = 0.232267 Complexity: grid = 1.592000 operator = 2.633619 cycle = 11.267164 # Output file: solvers.out.sysu Average Convergence Factor = 0.419936 Complexity: grid = 1.614937 operator = 2.866563 cycle = 5.732747 # Output file: solvers.out.27 Iterations = 12 Final Relative Residual Norm = 5.893893e-09 # Output file: solvers.out.28 Iterations = 18 Final Relative Residual Norm = 3.448418e-09 # Output file: solvers.out.29 Iterations = 13 Final Relative Residual Norm = 4.536558e-09 # Output file: solvers.out.30 Iterations = 19 Final Relative Residual Norm = 3.853111e-09 # Output file: solvers.out.101 LGMRES Iterations = 83 Final LGMRES Relative Residual Norm = 8.591967e-09 # Output file: solvers.out.102 LGMRES Iterations = 7 Final LGMRES Relative Residual Norm = 4.842561e-09 # Output file: solvers.out.103 FlexGMRES Iterations = 93 Final FlexGMRES Relative Residual Norm = 8.225661e-09 # Output file: solvers.out.104 FlexGMRES Iterations = 7 Final FlexGMRES Relative Residual Norm = 4.842561e-09 # Output file: solvers.out.105 Iterations = 15 Final Relative Residual Norm = 3.104258e-09 # Output file: solvers.out.106 Iterations = 15 Final Relative Residual Norm = 3.104258e-09 # Output file: solvers.out.107 Iterations = 22 Final Relative Residual Norm = 4.329945e-09 # Output file: solvers.out.108 Iterations = 22 Final Relative Residual Norm = 4.329945e-09 # Output file: solvers.out.109 Iterations = 17 Final Relative Residual Norm = 6.163208e-09 # Output file: solvers.out.110 Iterations = 17 Final Relative Residual Norm = 6.163208e-09 # Output file: solvers.out.111 Iterations = 29 Final Relative Residual Norm = 8.452076e-09 # Output file: solvers.out.112 GMRES Iterations = 23 Final GMRES Relative Residual Norm = 3.979845e-09 # Output file: solvers.out.113 GMRES Iterations = 25 Final GMRES Relative Residual Norm = 8.744056e-09 # Output file: solvers.out.114 BoomerAMG Iterations = 16 Final Relative Residual Norm = 9.161445e-09 # Output file: solvers.out.115 BoomerAMG Iterations = 17 Final Relative Residual Norm = 5.102706e-09 # Output file: solvers.out.116 GMRES Iterations = 9 Final GMRES Relative Residual Norm = 9.500152e-09 # Output file: solvers.out.117 GMRES Iterations = 10 Final GMRES Relative Residual Norm = 1.006493e-09 # Output file: solvers.out.118 GMRES Iterations = 25 Final GMRES Relative Residual Norm = 9.464475e-09 # Output file: solvers.out.119 GMRES Iterations = 17 Final GMRES Relative Residual Norm = 3.995718e-09 # Output file: solvers.out.121 GMRES Iterations = 23 Final GMRES Relative Residual Norm = 9.269997e-09 # Output file: solvers.out.122 GMRES Iterations = 17 Final GMRES Relative Residual Norm = 3.995718e-09 # Output file: solvers.out.120 GMRES Iterations = 17 Final GMRES Relative Residual Norm = 3.995718e-09 # Output file: solvers.out.200 MGR Iterations = 6 Final Relative Residual Norm = 6.980274e-10 # Output file: solvers.out.201 MGR Iterations = 6 Final Relative Residual Norm = 5.136059e-09 # Output file: solvers.out.202 MGR Iterations = 6 Final Relative Residual Norm = 6.980274e-10 # Output file: solvers.out.203 MGR Iterations = 6 Final Relative Residual Norm = 5.136059e-09 # Output file: solvers.out.204 MGR Iterations = 74 Final Relative Residual Norm = 8.553484e-09 # Output file: solvers.out.205 MGR Iterations = 70 Final Relative Residual Norm = 9.518056e-09 # Output file: solvers.out.206 MGR Iterations = 52 Final Relative Residual Norm = 7.228497e-09 # Output file: solvers.out.207 MGR Iterations = 50 Final Relative Residual Norm = 7.963764e-09 # Output file: solvers.out.208 MGR Iterations = 15 Final Relative Residual Norm = 7.901013e-09 # Output file: solvers.out.209 MGR Iterations = 14 Final Relative Residual Norm = 7.561893e-09 # Output file: solvers.out.210 MGR Iterations = 22 Final Relative Residual Norm = 6.427895e-09 # Output file: solvers.out.211 MGR Iterations = 29 Final Relative Residual Norm = 5.923832e-09 # Output file: solvers.out.212 Iterations = 5 Final Relative Residual Norm = 1.371340e-09 # Output file: solvers.out.213 Iterations = 29 Final Relative Residual Norm = 5.204677e-09 # Output file: solvers.out.404 Iterations = 30 Final Relative Residual Norm = 8.259159e-09 # Output file: solvers.out.405 Iterations = 24 Final Relative Residual Norm = 6.793588e-09 hypre-2.33.0/src/test/TEST_ij/solvers.saved.aurora000066400000000000000000000162471477326011500217660ustar00rootroot00000000000000# Output file: solvers.out.0 Iterations = 11 Final Relative Residual Norm = 8.313179e-09 # Output file: solvers.out.1 Iterations = 41 Final Relative Residual Norm = 6.698760e-09 # Output file: solvers.out.2 GMRES Iterations = 12 Final GMRES Relative Residual Norm = 2.591429e-09 # Output file: solvers.out.3 GMRES Iterations = 93 Final GMRES Relative Residual Norm = 8.225661e-09 # Output file: solvers.out.4 Iterations = 9 Final Relative Residual Norm = 5.357266e-09 # Output file: solvers.out.5 Iterations = 196 Final Relative Residual Norm = 9.097622e-09 # Output file: solvers.out.8 Iterations = 41 PCG_Iterations = 0 DSCG_Iterations = 41 Final Relative Residual Norm = 6.698760e-09 # Output file: solvers.out.9 Iterations = 11 PCG_Iterations = 7 DSCG_Iterations = 4 Final Relative Residual Norm = 2.051260e-09 # Output file: solvers.out.10 Iterations = 10 PCG_Iterations = 8 DSCG_Iterations = 2 Final Relative Residual Norm = 7.391720e-10 # Output file: solvers.out.11 Iterations = 7 PCG_Iterations = 4 DSCG_Iterations = 3 Final Relative Residual Norm = 9.120827e-10 # Output file: solvers.out.12 COGMRES Iterations = 12 Final COGMRES Relative Residual Norm = 2.591429e-09 # Output file: solvers.out.13 COGMRES Iterations = 93 Final COGMRES Relative Residual Norm = 8.225661e-09 # Output file: solvers.out.14 COGMRES Iterations = 93 Final COGMRES Relative Residual Norm = 8.225662e-09 # Output file: solvers.out.15 COGMRES Iterations = 93 Final COGMRES Relative Residual Norm = 8.225662e-09 # Output file: solvers.out.16 COGMRES Iterations = 93 Final COGMRES Relative Residual Norm = 8.225661e-09 # Output file: solvers.out.17 index 19 value -9.448537e-11 GMRES Iterations = 12 Final GMRES Relative Residual Norm = 2.591429e-09 # Output file: solvers.out.18 index 19 value -7.497267e-11 GMRES Iterations = 93 Final GMRES Relative Residual Norm = 8.225661e-09 # Output file: solvers.out.19 Iterations = 8 Final Relative Residual Norm = 7.973874e-09 # Output file: solvers.out.20 GMRES Iterations = 7 Final GMRES Relative Residual Norm = 1.137542e-09 # Output file: solvers.out.21 BoomerAMG Iterations = 25 Final Relative Residual Norm = 7.040419e-09 # Output file: solvers.out.22 GMRES Iterations = 12 Final GMRES Relative Residual Norm = 5.729132e-09 # Output file: solvers.out.23 BoomerAMG Iterations = 17 Final Relative Residual Norm = 4.244345e-09 # Output file: solvers.out.24 GMRES Iterations = 10 Final GMRES Relative Residual Norm = 1.351898e-09 # Output file: solvers.out.25 Iterations = 10 Final Relative Residual Norm = 1.562615e-09 # Output file: solvers.out.26 Iterations = 15 Final Relative Residual Norm = 4.161298e-09 # Output file: solvers.out.sysh Average Convergence Factor = 0.206046 Complexity: grid = 1.388375 operator = 2.644981 cycle = 5.289944 # Output file: solvers.out.sysn Average Convergence Factor = 0.537936 Complexity: grid = 1.391500 operator = 2.082687 cycle = 10.165075 # Output file: solvers.out.sysu Average Convergence Factor = 0.773088 Complexity: grid = 1.384375 operator = 2.726847 cycle = 5.453526 # Output file: solvers.out.27 Iterations = 17 Final Relative Residual Norm = 5.745047e-09 # Output file: solvers.out.28 Iterations = 23 Final Relative Residual Norm = 9.165818e-09 # Output file: solvers.out.29 Iterations = 17 Final Relative Residual Norm = 9.344808e-09 # Output file: solvers.out.30 Iterations = 24 Final Relative Residual Norm = 6.006718e-09 # Output file: solvers.out.101 LGMRES Iterations = 83 Final LGMRES Relative Residual Norm = 8.591967e-09 # Output file: solvers.out.102 LGMRES Iterations = 13 Final LGMRES Relative Residual Norm = 2.506722e-09 # Output file: solvers.out.103 FlexGMRES Iterations = 93 Final FlexGMRES Relative Residual Norm = 8.225661e-09 # Output file: solvers.out.104 FlexGMRES Iterations = 12 Final FlexGMRES Relative Residual Norm = 2.591429e-09 # Output file: solvers.out.105 Iterations = 19 Final Relative Residual Norm = 3.770440e-09 # Output file: solvers.out.106 Iterations = 19 Final Relative Residual Norm = 3.770440e-09 # Output file: solvers.out.107 Iterations = 29 Final Relative Residual Norm = 7.980731e-09 # Output file: solvers.out.108 Iterations = 29 Final Relative Residual Norm = 7.980731e-09 # Output file: solvers.out.109 Iterations = 20 Final Relative Residual Norm = 8.472626e-09 # Output file: solvers.out.110 Iterations = 20 Final Relative Residual Norm = 8.472626e-09 # Output file: solvers.out.111 Iterations = 32 Final Relative Residual Norm = 7.550239e-09 # Output file: solvers.out.112 GMRES Iterations = 38 Final GMRES Relative Residual Norm = 8.733188e-09 # Output file: solvers.out.113 GMRES Iterations = 27 Final GMRES Relative Residual Norm = 5.801918e-09 # Output file: solvers.out.114 BoomerAMG Iterations = 35 Final Relative Residual Norm = 8.610293e-09 # Output file: solvers.out.115 BoomerAMG Iterations = 35 Final Relative Residual Norm = 5.954720e-09 # Output file: solvers.out.116 GMRES Iterations = 15 Final GMRES Relative Residual Norm = 3.189139e-09 # Output file: solvers.out.117 GMRES Iterations = 15 Final GMRES Relative Residual Norm = 3.189139e-09 # Output file: solvers.out.118 GMRES Iterations = 27 Final GMRES Relative Residual Norm = 7.132129e-09 # Output file: solvers.out.119 GMRES Iterations = 19 Final GMRES Relative Residual Norm = 9.374280e-09 # Output file: solvers.out.121 GMRES Iterations = 26 Final GMRES Relative Residual Norm = 4.243767e-09 # Output file: solvers.out.122 GMRES Iterations = 19 Final GMRES Relative Residual Norm = 9.374280e-09 # Output file: solvers.out.120 GMRES Iterations = 19 Final GMRES Relative Residual Norm = 9.374304e-09 # Output file: solvers.out.200 MGR Iterations = 9 Final Relative Residual Norm = 1.247303e-09 # Output file: solvers.out.201 MGR Iterations = 9 Final Relative Residual Norm = 3.708381e-09 # Output file: solvers.out.202 MGR Iterations = 9 Final Relative Residual Norm = 1.247303e-09 # Output file: solvers.out.203 MGR Iterations = 9 Final Relative Residual Norm = 3.708381e-09 # Output file: solvers.out.204 MGR Iterations = 74 Final Relative Residual Norm = 9.572092e-09 # Output file: solvers.out.205 MGR Iterations = 71 Final Relative Residual Norm = 8.439033e-09 # Output file: solvers.out.206 MGR Iterations = 52 Final Relative Residual Norm = 8.583644e-09 # Output file: solvers.out.207 MGR Iterations = 50 Final Relative Residual Norm = 9.909484e-09 # Output file: solvers.out.208 MGR Iterations = 16 Final Relative Residual Norm = 4.090193e-09 # Output file: solvers.out.209 MGR Iterations = 15 Final Relative Residual Norm = 7.976848e-09 # Output file: solvers.out.210 MGR Iterations = 22 Final Relative Residual Norm = 9.412142e-09 # Output file: solvers.out.211 MGR Iterations = 29 Final Relative Residual Norm = 9.128075e-09 # Output file: solvers.out.212 Iterations = 11 Final Relative Residual Norm = 6.598043e-09 # Output file: solvers.out.213 Iterations = 28 Final Relative Residual Norm = 9.579850e-09 # Output file: solvers.out.404 Iterations = 28 Final Relative Residual Norm = 8.560163e-09 # Output file: solvers.out.405 Iterations = 22 Final Relative Residual Norm = 7.991509e-09 hypre-2.33.0/src/test/TEST_ij/solvers.saved.lassen000066400000000000000000000162461477326011500217610ustar00rootroot00000000000000# Output file: solvers.out.0 Iterations = 11 Final Relative Residual Norm = 5.395554e-09 # Output file: solvers.out.1 Iterations = 41 Final Relative Residual Norm = 6.698760e-09 # Output file: solvers.out.2 GMRES Iterations = 11 Final GMRES Relative Residual Norm = 8.872614e-09 # Output file: solvers.out.3 GMRES Iterations = 93 Final GMRES Relative Residual Norm = 8.225661e-09 # Output file: solvers.out.4 Iterations = 10 Final Relative Residual Norm = 1.243936e-09 # Output file: solvers.out.5 Iterations = 196 Final Relative Residual Norm = 9.097622e-09 # Output file: solvers.out.8 Iterations = 41 PCG_Iterations = 0 DSCG_Iterations = 41 Final Relative Residual Norm = 6.698760e-09 # Output file: solvers.out.9 Iterations = 11 PCG_Iterations = 7 DSCG_Iterations = 4 Final Relative Residual Norm = 2.361078e-09 # Output file: solvers.out.10 Iterations = 10 PCG_Iterations = 8 DSCG_Iterations = 2 Final Relative Residual Norm = 7.996975e-10 # Output file: solvers.out.11 Iterations = 7 PCG_Iterations = 4 DSCG_Iterations = 3 Final Relative Residual Norm = 1.374567e-09 # Output file: solvers.out.12 COGMRES Iterations = 11 Final COGMRES Relative Residual Norm = 8.872614e-09 # Output file: solvers.out.13 COGMRES Iterations = 93 Final COGMRES Relative Residual Norm = 8.225661e-09 # Output file: solvers.out.14 COGMRES Iterations = 93 Final COGMRES Relative Residual Norm = 8.225661e-09 # Output file: solvers.out.15 COGMRES Iterations = 93 Final COGMRES Relative Residual Norm = 8.225662e-09 # Output file: solvers.out.16 COGMRES Iterations = 93 Final COGMRES Relative Residual Norm = 8.225662e-09 # Output file: solvers.out.17 index 19 value -8.373864e-12 GMRES Iterations = 11 Final GMRES Relative Residual Norm = 8.872614e-09 # Output file: solvers.out.18 index 19 value -7.497267e-11 GMRES Iterations = 93 Final GMRES Relative Residual Norm = 8.225661e-09 # Output file: solvers.out.19 Iterations = 8 Final Relative Residual Norm = 8.565049e-09 # Output file: solvers.out.20 GMRES Iterations = 7 Final GMRES Relative Residual Norm = 1.597168e-09 # Output file: solvers.out.21 BoomerAMG Iterations = 25 Final Relative Residual Norm = 7.139146e-09 # Output file: solvers.out.22 GMRES Iterations = 12 Final GMRES Relative Residual Norm = 5.069641e-09 # Output file: solvers.out.23 BoomerAMG Iterations = 17 Final Relative Residual Norm = 4.412175e-09 # Output file: solvers.out.24 GMRES Iterations = 9 Final GMRES Relative Residual Norm = 9.074692e-09 # Output file: solvers.out.25 Iterations = 10 Final Relative Residual Norm = 2.384986e-09 # Output file: solvers.out.26 Iterations = 15 Final Relative Residual Norm = 7.167937e-09 # Output file: solvers.out.sysh Average Convergence Factor = 0.205554 Complexity: grid = 1.401500 operator = 2.689142 cycle = 5.378265 # Output file: solvers.out.sysn Average Convergence Factor = 0.537935 Complexity: grid = 1.391500 operator = 2.082687 cycle = 10.165075 # Output file: solvers.out.sysu Average Convergence Factor = 0.773233 Complexity: grid = 1.395375 operator = 2.737043 cycle = 5.473918 # Output file: solvers.out.27 Iterations = 17 Final Relative Residual Norm = 4.472032e-09 # Output file: solvers.out.28 Iterations = 25 Final Relative Residual Norm = 4.134529e-09 # Output file: solvers.out.29 Iterations = 17 Final Relative Residual Norm = 7.555200e-09 # Output file: solvers.out.30 Iterations = 23 Final Relative Residual Norm = 8.408484e-09 # Output file: solvers.out.101 LGMRES Iterations = 83 Final LGMRES Relative Residual Norm = 8.591967e-09 # Output file: solvers.out.102 LGMRES Iterations = 12 Final LGMRES Relative Residual Norm = 9.399192e-09 # Output file: solvers.out.103 FlexGMRES Iterations = 93 Final FlexGMRES Relative Residual Norm = 8.225661e-09 # Output file: solvers.out.104 FlexGMRES Iterations = 11 Final FlexGMRES Relative Residual Norm = 8.872614e-09 # Output file: solvers.out.105 Iterations = 19 Final Relative Residual Norm = 4.250469e-09 # Output file: solvers.out.106 Iterations = 19 Final Relative Residual Norm = 4.250469e-09 # Output file: solvers.out.107 Iterations = 29 Final Relative Residual Norm = 7.512162e-09 # Output file: solvers.out.108 Iterations = 29 Final Relative Residual Norm = 7.512135e-09 # Output file: solvers.out.109 Iterations = 20 Final Relative Residual Norm = 8.005329e-09 # Output file: solvers.out.110 Iterations = 20 Final Relative Residual Norm = 8.005329e-09 # Output file: solvers.out.111 Iterations = 32 Final Relative Residual Norm = 6.308682e-09 # Output file: solvers.out.112 GMRES Iterations = 38 Final GMRES Relative Residual Norm = 7.222662e-09 # Output file: solvers.out.113 GMRES Iterations = 26 Final GMRES Relative Residual Norm = 6.954824e-09 # Output file: solvers.out.114 BoomerAMG Iterations = 34 Final Relative Residual Norm = 7.848170e-09 # Output file: solvers.out.115 BoomerAMG Iterations = 34 Final Relative Residual Norm = 9.839249e-09 # Output file: solvers.out.116 GMRES Iterations = 15 Final GMRES Relative Residual Norm = 2.830234e-09 # Output file: solvers.out.117 GMRES Iterations = 15 Final GMRES Relative Residual Norm = 2.830235e-09 # Output file: solvers.out.118 GMRES Iterations = 27 Final GMRES Relative Residual Norm = 5.532388e-09 # Output file: solvers.out.119 GMRES Iterations = 19 Final GMRES Relative Residual Norm = 5.040776e-09 # Output file: solvers.out.121 GMRES Iterations = 25 Final GMRES Relative Residual Norm = 7.473980e-09 # Output file: solvers.out.122 GMRES Iterations = 19 Final GMRES Relative Residual Norm = 5.040776e-09 # Output file: solvers.out.120 GMRES Iterations = 19 Final GMRES Relative Residual Norm = 5.041386e-09 # Output file: solvers.out.200 MGR Iterations = 8 Final Relative Residual Norm = 7.317392e-09 # Output file: solvers.out.201 MGR Iterations = 9 Final Relative Residual Norm = 1.802890e-09 # Output file: solvers.out.202 MGR Iterations = 8 Final Relative Residual Norm = 7.317392e-09 # Output file: solvers.out.203 MGR Iterations = 9 Final Relative Residual Norm = 1.802890e-09 # Output file: solvers.out.204 MGR Iterations = 74 Final Relative Residual Norm = 9.563442e-09 # Output file: solvers.out.205 MGR Iterations = 71 Final Relative Residual Norm = 8.505703e-09 # Output file: solvers.out.206 MGR Iterations = 52 Final Relative Residual Norm = 8.514201e-09 # Output file: solvers.out.207 MGR Iterations = 50 Final Relative Residual Norm = 9.941525e-09 # Output file: solvers.out.208 MGR Iterations = 16 Final Relative Residual Norm = 5.064272e-09 # Output file: solvers.out.209 MGR Iterations = 15 Final Relative Residual Norm = 7.693914e-09 # Output file: solvers.out.210 MGR Iterations = 23 Final Relative Residual Norm = 4.625304e-09 # Output file: solvers.out.211 MGR Iterations = 29 Final Relative Residual Norm = 8.665192e-09 # Output file: solvers.out.212 Iterations = 11 Final Relative Residual Norm = 3.738613e-09 # Output file: solvers.out.213 Iterations = 29 Final Relative Residual Norm = 5.268647e-09 # Output file: solvers.out.404 Iterations = 28 Final Relative Residual Norm = 8.548826e-09 # Output file: solvers.out.405 Iterations = 22 Final Relative Residual Norm = 7.996427e-09 hypre-2.33.0/src/test/TEST_ij/solvers.saved.lassen_cpu000066400000000000000000000162331477326011500226240ustar00rootroot00000000000000# Output file: solvers.out.0 Iterations = 7 Final Relative Residual Norm = 3.087349e-09 # Output file: solvers.out.1 Iterations = 41 Final Relative Residual Norm = 6.698760e-09 # Output file: solvers.out.2 GMRES Iterations = 7 Final GMRES Relative Residual Norm = 4.829641e-09 # Output file: solvers.out.3 GMRES Iterations = 93 Final GMRES Relative Residual Norm = 8.225662e-09 # Output file: solvers.out.4 Iterations = 9 Final Relative Residual Norm = 3.697151e-09 # Output file: solvers.out.5 Iterations = 196 Final Relative Residual Norm = 9.097622e-09 # Output file: solvers.out.8 Iterations = 41 PCG_Iterations = 0 DSCG_Iterations = 41 Final Relative Residual Norm = 6.698760e-09 # Output file: solvers.out.9 Iterations = 11 PCG_Iterations = 7 DSCG_Iterations = 4 Final Relative Residual Norm = 6.766130e-10 # Output file: solvers.out.10 Iterations = 9 PCG_Iterations = 7 DSCG_Iterations = 2 Final Relative Residual Norm = 4.829641e-09 # Output file: solvers.out.11 Iterations = 7 PCG_Iterations = 4 DSCG_Iterations = 3 Final Relative Residual Norm = 1.284758e-10 # Output file: solvers.out.12 COGMRES Iterations = 7 Final COGMRES Relative Residual Norm = 4.829641e-09 # Output file: solvers.out.13 COGMRES Iterations = 93 Final COGMRES Relative Residual Norm = 8.225662e-09 # Output file: solvers.out.14 COGMRES Iterations = 93 Final COGMRES Relative Residual Norm = 8.225662e-09 # Output file: solvers.out.15 COGMRES Iterations = 93 Final COGMRES Relative Residual Norm = 8.225662e-09 # Output file: solvers.out.16 COGMRES Iterations = 93 Final COGMRES Relative Residual Norm = 8.225662e-09 # Output file: solvers.out.17 index 19 value -2.647363e-11 GMRES Iterations = 7 Final GMRES Relative Residual Norm = 4.829641e-09 # Output file: solvers.out.18 index 19 value -7.497266e-11 GMRES Iterations = 93 Final GMRES Relative Residual Norm = 8.225662e-09 # Output file: solvers.out.19 Iterations = 8 Final Relative Residual Norm = 2.463498e-09 # Output file: solvers.out.20 GMRES Iterations = 7 Final GMRES Relative Residual Norm = 5.912905e-10 # Output file: solvers.out.21 BoomerAMG Iterations = 23 Final Relative Residual Norm = 5.119642e-09 # Output file: solvers.out.22 GMRES Iterations = 11 Final GMRES Relative Residual Norm = 7.238674e-09 # Output file: solvers.out.23 BoomerAMG Iterations = 15 Final Relative Residual Norm = 5.926430e-09 # Output file: solvers.out.24 GMRES Iterations = 9 Final GMRES Relative Residual Norm = 2.174161e-09 # Output file: solvers.out.25 Iterations = 9 Final Relative Residual Norm = 9.045045e-09 # Output file: solvers.out.26 Iterations = 18 Final Relative Residual Norm = 9.458475e-09 # Output file: solvers.out.sysh Average Convergence Factor = 0.119752 Complexity: grid = 1.613875 operator = 2.860093 cycle = 5.719888 # Output file: solvers.out.sysn Average Convergence Factor = 0.232267 Complexity: grid = 1.592000 operator = 2.633619 cycle = 11.267164 # Output file: solvers.out.sysu Average Convergence Factor = 0.419934 Complexity: grid = 1.614875 operator = 2.866222 cycle = 5.732066 # Output file: solvers.out.27 Iterations = 12 Final Relative Residual Norm = 5.876623e-09 # Output file: solvers.out.28 Iterations = 18 Final Relative Residual Norm = 3.457366e-09 # Output file: solvers.out.29 Iterations = 13 Final Relative Residual Norm = 4.536558e-09 # Output file: solvers.out.30 Iterations = 19 Final Relative Residual Norm = 3.853111e-09 # Output file: solvers.out.101 LGMRES Iterations = 83 Final LGMRES Relative Residual Norm = 8.591967e-09 # Output file: solvers.out.102 LGMRES Iterations = 7 Final LGMRES Relative Residual Norm = 4.829641e-09 # Output file: solvers.out.103 FlexGMRES Iterations = 93 Final FlexGMRES Relative Residual Norm = 8.225662e-09 # Output file: solvers.out.104 FlexGMRES Iterations = 7 Final FlexGMRES Relative Residual Norm = 4.829641e-09 # Output file: solvers.out.105 Iterations = 15 Final Relative Residual Norm = 2.852019e-09 # Output file: solvers.out.106 Iterations = 15 Final Relative Residual Norm = 2.852019e-09 # Output file: solvers.out.107 Iterations = 22 Final Relative Residual Norm = 4.376715e-09 # Output file: solvers.out.108 Iterations = 22 Final Relative Residual Norm = 4.376715e-09 # Output file: solvers.out.109 Iterations = 17 Final Relative Residual Norm = 6.163208e-09 # Output file: solvers.out.110 Iterations = 17 Final Relative Residual Norm = 6.163208e-09 # Output file: solvers.out.111 Iterations = 29 Final Relative Residual Norm = 8.452076e-09 # Output file: solvers.out.112 GMRES Iterations = 23 Final GMRES Relative Residual Norm = 3.979845e-09 # Output file: solvers.out.113 GMRES Iterations = 25 Final GMRES Relative Residual Norm = 8.744056e-09 # Output file: solvers.out.114 BoomerAMG Iterations = 16 Final Relative Residual Norm = 9.190895e-09 # Output file: solvers.out.115 BoomerAMG Iterations = 17 Final Relative Residual Norm = 4.095117e-09 # Output file: solvers.out.116 GMRES Iterations = 10 Final GMRES Relative Residual Norm = 8.606250e-10 # Output file: solvers.out.117 GMRES Iterations = 9 Final GMRES Relative Residual Norm = 9.119362e-09 # Output file: solvers.out.118 GMRES Iterations = 25 Final GMRES Relative Residual Norm = 9.464475e-09 # Output file: solvers.out.119 GMRES Iterations = 17 Final GMRES Relative Residual Norm = 3.995718e-09 # Output file: solvers.out.121 GMRES Iterations = 23 Final GMRES Relative Residual Norm = 9.269997e-09 # Output file: solvers.out.122 GMRES Iterations = 17 Final GMRES Relative Residual Norm = 3.995718e-09 # Output file: solvers.out.120 GMRES Iterations = 17 Final GMRES Relative Residual Norm = 3.995717e-09 # Output file: solvers.out.200 MGR Iterations = 6 Final Relative Residual Norm = 6.980274e-10 # Output file: solvers.out.201 MGR Iterations = 6 Final Relative Residual Norm = 5.136059e-09 # Output file: solvers.out.202 MGR Iterations = 6 Final Relative Residual Norm = 6.980274e-10 # Output file: solvers.out.203 MGR Iterations = 6 Final Relative Residual Norm = 5.136059e-09 # Output file: solvers.out.204 MGR Iterations = 74 Final Relative Residual Norm = 8.553484e-09 # Output file: solvers.out.205 MGR Iterations = 70 Final Relative Residual Norm = 9.518056e-09 # Output file: solvers.out.206 MGR Iterations = 52 Final Relative Residual Norm = 7.228497e-09 # Output file: solvers.out.207 MGR Iterations = 50 Final Relative Residual Norm = 7.963764e-09 # Output file: solvers.out.208 MGR Iterations = 15 Final Relative Residual Norm = 7.901013e-09 # Output file: solvers.out.209 MGR Iterations = 14 Final Relative Residual Norm = 7.561893e-09 # Output file: solvers.out.210 MGR Iterations = 22 Final Relative Residual Norm = 6.427895e-09 # Output file: solvers.out.211 MGR Iterations = 29 Final Relative Residual Norm = 5.923832e-09 # Output file: solvers.out.212 Iterations = 5 Final Relative Residual Norm = 1.371340e-09 # Output file: solvers.out.213 Iterations = 29 Final Relative Residual Norm = 5.204677e-09 # Output file: solvers.out.404 Iterations = 30 Final Relative Residual Norm = 8.259159e-09 # Output file: solvers.out.405 Iterations = 24 Final Relative Residual Norm = 6.793588e-09 hypre-2.33.0/src/test/TEST_ij/solvers.sh000077500000000000000000000112111477326011500177730ustar00rootroot00000000000000#!/bin/bash # Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) TNAME=`basename $0 .sh` RTOL=$1 ATOL=$2 #============================================================================= # IJ: Run multiplicative and mult_additive cycle and compare results # should be the same #============================================================================= tail -17 ${TNAME}.out.109 | head -6 > ${TNAME}.testdata #============================================================================= tail -17 ${TNAME}.out.110 | head -6 > ${TNAME}.testdata.temp diff ${TNAME}.testdata ${TNAME}.testdata.temp >&2 #============================================================================= # IJ: MGR case nlevels < 1 and bsize < 2 should be the same # compare results #============================================================================= tail -17 ${TNAME}.out.200 | head -6 > ${TNAME}.mgr_testdata #============================================================================= tail -17 ${TNAME}.out.202 | head -6 > ${TNAME}.mgr_testdata.temp diff ${TNAME}.mgr_testdata ${TNAME}.mgr_testdata.temp >&2 #============================================================================= # compare with baseline case #============================================================================= FILES="\ ${TNAME}.out.0\ ${TNAME}.out.1\ ${TNAME}.out.2\ ${TNAME}.out.3\ ${TNAME}.out.4\ ${TNAME}.out.5\ " #${TNAME}.out.6\ #${TNAME}.out.7\ for i in $FILES do echo "# Output file: $i" tail -3 $i done > ${TNAME}.out.a # Make sure that the output file is reasonable RUNCOUNT=`echo $FILES | wc -w` OUTCOUNT=`grep "Iterations" ${TNAME}.out.a | wc -l` if [ "$OUTCOUNT" != "$RUNCOUNT" ]; then echo "Incorrect number of runs in ${TNAME}.out" >&2 fi FILES="\ ${TNAME}.out.8\ ${TNAME}.out.9\ ${TNAME}.out.10\ ${TNAME}.out.11\ ${TNAME}.out.12\ ${TNAME}.out.13\ ${TNAME}.out.14\ ${TNAME}.out.15\ ${TNAME}.out.16\ ${TNAME}.out.17\ ${TNAME}.out.18\ ${TNAME}.out.19\ ${TNAME}.out.20\ ${TNAME}.out.21\ ${TNAME}.out.22\ ${TNAME}.out.23\ ${TNAME}.out.24\ ${TNAME}.out.25\ ${TNAME}.out.26 " for i in $FILES do echo "# Output file: $i" tail -5 $i done > ${TNAME}.out.b # Make sure that the output file is reasonable RUNCOUNT=`echo $FILES | wc -w` OUTCOUNT=`grep "Relative" ${TNAME}.out.b | wc -l` if [ "$OUTCOUNT" != "$RUNCOUNT" ]; then echo "Incorrect number of runs in ${TNAME}.out" >&2 fi FILES="\ ${TNAME}.out.sysh\ ${TNAME}.out.sysn\ ${TNAME}.out.sysu\ " for i in $FILES do echo "# Output file: $i" tail -21 $i | head -6 done > ${TNAME}.out.c # Make sure that the output file is reasonable RUNCOUNT=`echo $FILES | wc -w` OUTCOUNT=`grep "Complexity" ${TNAME}.out.c | wc -l` if [ "$OUTCOUNT" != "$RUNCOUNT" ]; then echo "Incorrect number of runs in ${TNAME}.out" >&2 fi FILES="\ ${TNAME}.out.27\ ${TNAME}.out.28\ ${TNAME}.out.29\ ${TNAME}.out.30\ ${TNAME}.out.101\ ${TNAME}.out.102\ ${TNAME}.out.103\ ${TNAME}.out.104\ ${TNAME}.out.105\ ${TNAME}.out.106\ ${TNAME}.out.107\ ${TNAME}.out.108\ ${TNAME}.out.109\ ${TNAME}.out.110\ ${TNAME}.out.111\ ${TNAME}.out.112\ ${TNAME}.out.113\ ${TNAME}.out.114\ ${TNAME}.out.115\ ${TNAME}.out.116\ ${TNAME}.out.117\ ${TNAME}.out.118\ ${TNAME}.out.119\ ${TNAME}.out.121\ ${TNAME}.out.122\ ${TNAME}.out.120\ " for i in $FILES do echo "# Output file: $i" tail -3 $i done > ${TNAME}.out.d # Make sure that the output file is reasonable RUNCOUNT=`echo $FILES | wc -w` OUTCOUNT=`grep "Iterations" ${TNAME}.out.d | wc -l` if [ "$OUTCOUNT" != "$RUNCOUNT" ]; then echo "Incorrect number of runs in ${TNAME}.out" >&2 fi FILES="\ ${TNAME}.out.200\ ${TNAME}.out.201\ ${TNAME}.out.202\ ${TNAME}.out.203\ ${TNAME}.out.204\ ${TNAME}.out.205\ ${TNAME}.out.206\ ${TNAME}.out.207\ ${TNAME}.out.208\ ${TNAME}.out.209\ ${TNAME}.out.210\ ${TNAME}.out.211\ ${TNAME}.out.212\ ${TNAME}.out.213\ ${TNAME}.out.404\ ${TNAME}.out.405\ " for i in $FILES do echo "# Output file: $i" tail -3 $i done > ${TNAME}.out.e # Make sure that the output file is reasonable RUNCOUNT=`echo $FILES | wc -w` OUTCOUNT=`grep "Iterations" ${TNAME}.out.e | wc -l` if [ "$OUTCOUNT" != "$RUNCOUNT" ]; then echo "Incorrect number of runs in ${TNAME}.out" >&2 fi # put all of the output files together cat ${TNAME}.out.[a-z] > ${TNAME}.out #============================================================================= # remove temporary files #============================================================================= rm -f ${TNAME}.testdata* rm -r ${TNAME}.mgr_testdata* hypre-2.33.0/src/test/TEST_ij/state.jobs000077500000000000000000000010011477326011500177350ustar00rootroot00000000000000#!/bin/bash # Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) #============================================================================= # Test library initialization (sequential and parallel) #============================================================================= mpirun -np 1 ./ij -test_init > state.out.1 mpirun -np 4 ./ij -test_init > state.out.100 hypre-2.33.0/src/test/TEST_ij/state.saved000066400000000000000000000006771477326011500201210ustar00rootroot00000000000000# Output file: state.out.1 hypre library has not been initialized or finalized yet hypre library has been initialized hypre library has been finalized hypre library has been re-initialized hypre library has been finalized # Output file: state.out.100 hypre library has not been initialized or finalized yet hypre library has been initialized hypre library has been finalized hypre library has been re-initialized hypre library has been finalized hypre-2.33.0/src/test/TEST_ij/state.saved.aurora000066400000000000000000000004101477326011500213720ustar00rootroot00000000000000# Output file: state.out.1 hypre library has been finalized hypre library has been re-initialized hypre library has been finalized # Output file: state.out.100 hypre library has been finalized hypre library has been re-initialized hypre library has been finalized hypre-2.33.0/src/test/TEST_ij/state.saved.lassen000066400000000000000000000006771477326011500214050ustar00rootroot00000000000000# Output file: state.out.1 hypre library has not been initialized or finalized yet hypre library has been initialized hypre library has been finalized hypre library has been re-initialized hypre library has been finalized # Output file: state.out.100 hypre library has not been initialized or finalized yet hypre library has been initialized hypre library has been finalized hypre library has been re-initialized hypre library has been finalized hypre-2.33.0/src/test/TEST_ij/state.saved.lassen_cpu000066400000000000000000000006771477326011500222540ustar00rootroot00000000000000# Output file: state.out.1 hypre library has not been initialized or finalized yet hypre library has been initialized hypre library has been finalized hypre library has been re-initialized hypre library has been finalized # Output file: state.out.100 hypre library has not been initialized or finalized yet hypre library has been initialized hypre library has been finalized hypre library has been re-initialized hypre library has been finalized hypre-2.33.0/src/test/TEST_ij/state.sh000077500000000000000000000010461477326011500174230ustar00rootroot00000000000000#!/bin/bash # Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) TNAME=`basename $0 .sh` #============================================================================= # Compare with baseline case #============================================================================= FILES="\ ${TNAME}.out.1\ ${TNAME}.out.100\ " for i in $FILES do echo "# Output file: $i" tail -3 $i done > ${TNAME}.out hypre-2.33.0/src/test/TEST_ij/test.A.00000000066400000000000000000000004051477326011500174610ustar00rootroot000000000000007 13 8 14 7 8 4.0 8 9 4.0 9 10 4.0 10 11 4.0 11 12 4.0 12 13 4.0 13 14 4.0 14 15 4.0 7 9 -1.0 7 10 -1.0 8 10 -1.0 9 9 -1.0 10 12 -1.0 12 20 -1.0 12 8 -1.0 13 15 -1.0 13 12 -1.0 14 20 -1.0 14 9 -1.0 16 17 2.0 19 21 -1.0 24 25 1.0 24 30 -2.0 17 30 -1.0 29 30 1.0 hypre-2.33.0/src/test/TEST_ij/test.A.00001000066400000000000000000000004131477326011500174610ustar00rootroot0000000000000014 22 15 23 15 16 5.0 16 17 5.0 17 18 5.0 18 19 5.0 19 20 5.0 20 21 5.0 21 22 5.0 22 23 5.0 7 9 -1.0 7 10 -1.0 8 10 -1.0 9 9 -1.0 10 12 -1.0 12 20 -1.0 12 8 -1.0 13 15 -1.0 13 12 -1.0 14 20 -1.0 14 9 -1.0 26 17 2.0 29 21 -1.0 24 25 1.0 24 30 -2.0 27 30 -1.0 9 30 1.0 hypre-2.33.0/src/test/TEST_ij/test.A.00002000066400000000000000000000004251477326011500174650ustar00rootroot0000000000000023 29 24 30 23 24 6.0 24 25 6.0 25 26 6.0 26 27 6.0 27 28 6.0 28 29 6.0 29 30 6.0 7 8 3.0 12 13 3.0 13 14 3.0 14 15 3.0 7 9 -1.0 7 10 -1.0 8 10 -1.0 9 9 -1.0 10 12 -1.0 12 20 -1.0 12 8 -1.0 13 15 -1.0 13 12 -1.0 14 20 -1.0 14 9 -1.0 26 17 -1.0 19 21 -1.0 22 25 -1.0 20 30 -2.0 hypre-2.33.0/src/test/TEST_ij/test.b.00000000066400000000000000000000001401477326011500175160ustar00rootroot000000000000008 14 8 1.0 9 2.0 10 3.0 11 4.0 12 5.0 13 4.0 14 3.0 15 2.0 17 1.0 20 1.0 25 1.0 18 1.0 30 1.0 hypre-2.33.0/src/test/TEST_ij/test.b.00001000066400000000000000000000002211477326011500175170ustar00rootroot0000000000000015 23 16 1.0 17 2.0 18 3.0 19 4.0 20 5.0 21 4.0 22 3.0 23 2.0 8 1.0 9 1.0 10 1.0 11 1.0 13 1.0 14 1.0 15 1.0 27 1.0 30 1.0 25 1.0 28 1.0 10 1.0 hypre-2.33.0/src/test/TEST_ij/test.b.00002000066400000000000000000000002271477326011500175260ustar00rootroot0000000000000024 30 24 1.0 25 2.0 26 3.0 27 4.0 28 3.0 29 2.0 30 1.0 8 1.0 13 1.0 14 1.0 15 1.0 8 1.0 9 1.0 10 1.0 11 1.0 13 1.0 14 1.0 15 1.0 20 1.0 23 1.0 21 1.0 hypre-2.33.0/src/test/TEST_ij/tst.00000000066400000000000000000000002751477326011500171420ustar00rootroot000000000000000 15 0 15 0 0 2.0 1 1 2.0 2 2 2.0 2 3 -1.0 3 2 -1.0 3 3 2.0 4 4 2.0 5 5 2.0 6 6 2.0 7 7 2.0 8 8 2.0 9 9 2.0 9 10 -1.0 10 10 2.0 11 11 2.0 12 12 2.0 13 13 2.0 14 13 -1.0 14 14 2.0 15 15 2.0 hypre-2.33.0/src/test/TEST_ij/tst.00001000066400000000000000000000003151477326011500171360ustar00rootroot0000000000000016 31 16 31 16 16 2.0 17 17 2.0 18 18 2.0 18 19 -1.0 19 18 -1.0 19 19 2.0 20 20 2.0 21 21 2.0 22 22 2.0 23 23 2.0 24 24 2.0 25 25 2.0 25 26 -1.0 26 26 2.0 27 27 2.0 28 28 2.0 29 29 2.0 30 30 2.0 31 31 2.0 hypre-2.33.0/src/test/TEST_ij/vector.jobs000077500000000000000000000060701477326011500201320ustar00rootroot00000000000000#!/bin/bash # Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) #============================================================================= # A. set/get: multi-component vector tests #============================================================================= mpirun -np 1 ./ij -test_multivec 1 -solver -2 -rhsisone -nc 2 > vector.out.A0 mpirun -np 1 ./ij -test_multivec 1 -solver -2 -rhsisone -nc 4 > vector.out.A1 mpirun -np 1 ./ij -test_multivec 1 -solver -2 -rhsisone -nc 7 > vector.out.A2 mpirun -np 2 ./ij -test_multivec 1 -solver -2 -rhsisone -nc 7 > vector.out.A3 mpirun -np 4 ./ij -test_multivec 1 -solver -2 -rhsisone -nc 7 > vector.out.A4 mpirun -np 1 ./ij -test_multivec 1 -solver -2 -rhsrand -nc 3 > vector.out.A5 mpirun -np 2 ./ij -test_multivec 1 -solver -2 -rhsrand -nc 3 > vector.out.A6 mpirun -np 1 ./ij -test_multivec 1 -solver -2 -rhszero -nc 2 > vector.out.A7 mpirun -np 2 ./ij -test_multivec 1 -solver -2 -rhszero -nc 2 > vector.out.A8 mpirun -np 1 ./ij -test_multivec 1 -solver -2 -xisone -nc 2 > vector.out.A9 mpirun -np 2 ./ij -test_multivec 1 -solver -2 -xisone -nc 2 > vector.out.A10 #============================================================================= # B. krylov solvers: multi-component vector tests #============================================================================= # Diagonal scaling (sequential) mpirun -np 1 ./ij -n 8 8 8 -solver 2 -rhsisone -nc 4 > vector.out.B0 mpirun -np 1 ./ij -n 8 8 8 -solver 4 -rhsisone -nc 4 > vector.out.B1 mpirun -np 1 ./ij -n 8 8 8 -solver 6 -rhsisone -nc 4 > vector.out.B2 mpirun -np 1 ./ij -n 8 8 8 -solver 10 -rhsisone -nc 4 > vector.out.B3 mpirun -np 1 ./ij -n 8 8 8 -solver 50 -rhsisone -nc 4 > vector.out.B4 mpirun -np 1 ./ij -n 8 8 8 -solver 60 -rhsisone -nc 4 > vector.out.B5 mpirun -np 1 ./ij -n 8 8 8 -solver 2 -rhsisone -nc 3 > vector.out.B6 mpirun -np 1 ./ij -n 8 8 8 -solver 2 -rhsisone -nc 7 > vector.out.B7 mpirun -np 1 ./ij -n 8 8 8 -solver 2 -rhsisone -nc 10 > vector.out.B8 mpirun -np 1 ./ij -n 8 8 8 -solver 2 -rhsisone -nc 15 > vector.out.B9 mpirun -np 1 ./ij -n 8 8 8 -solver 2 -rhsisone -nc 32 > vector.out.B10 # Diagonal scaling (parallel) mpirun -np 4 ./ij -n 8 8 8 -solver 2 -rhsisone -nc 6 > vector.out.B100 mpirun -np 4 ./ij -n 8 8 8 -solver 4 -rhsisone -nc 6 > vector.out.B101 mpirun -np 4 ./ij -n 8 8 8 -solver 6 -rhsisone -nc 6 > vector.out.B102 mpirun -np 4 ./ij -n 8 8 8 -solver 10 -rhsisone -nc 6 > vector.out.B103 mpirun -np 4 ./ij -n 8 8 8 -solver 50 -rhsisone -nc 6 > vector.out.B104 mpirun -np 4 ./ij -n 8 8 8 -solver 60 -rhsisone -nc 6 > vector.out.B105 mpirun -np 4 ./ij -n 8 8 8 -solver 2 -rhsisone -nc 3 > vector.out.B106 mpirun -np 4 ./ij -n 8 8 8 -solver 2 -rhsisone -nc 7 > vector.out.B107 mpirun -np 4 ./ij -n 8 8 8 -solver 2 -rhsisone -nc 10 > vector.out.B108 mpirun -np 4 ./ij -n 8 8 8 -solver 2 -rhsisone -nc 15 > vector.out.B109 mpirun -np 4 ./ij -n 8 8 8 -solver 2 -rhsisone -nc 32 > vector.out.B110 hypre-2.33.0/src/test/TEST_ij/vector.saved000066400000000000000000000055301477326011500202740ustar00rootroot00000000000000# Output file: vector.out.A0 Vector/Multivector error = 0.000000e+00 # Output file: vector.out.A1 Vector/Multivector error = 0.000000e+00 # Output file: vector.out.A2 Vector/Multivector error = 0.000000e+00 # Output file: vector.out.A3 Vector/Multivector error = 0.000000e+00 # Output file: vector.out.A4 Vector/Multivector error = 0.000000e+00 # Output file: vector.out.A5 Vector/Multivector error = 0.000000e+00 # Output file: vector.out.A6 Vector/Multivector error = 0.000000e+00 # Output file: vector.out.A7 Vector/Multivector error = 0.000000e+00 # Output file: vector.out.A8 Vector/Multivector error = 0.000000e+00 # Output file: vector.out.A9 Vector/Multivector error = 0.000000e+00 # Output file: vector.out.A10 Vector/Multivector error = 0.000000e+00 # Output file: vector.out.B0 Iterations = 18 Final Relative Residual Norm = 3.923978e-09 # Output file: vector.out.B1 GMRES Iterations = 54 Final GMRES Relative Residual Norm = 7.982372e-09 # Output file: vector.out.B2 Iterations = 202 Final Relative Residual Norm = 9.657758e-09 # Output file: vector.out.B3 BiCGSTAB Iterations = 12 Final BiCGSTAB Relative Residual Norm = 6.282586e-09 # Output file: vector.out.B4 LGMRES Iterations = 53 Final LGMRES Relative Residual Norm = 8.975949e-09 # Output file: vector.out.B5 FlexGMRES Iterations = 54 Final FlexGMRES Relative Residual Norm = 7.982372e-09 # Output file: vector.out.B6 Iterations = 18 Final Relative Residual Norm = 3.923978e-09 # Output file: vector.out.B7 Iterations = 18 Final Relative Residual Norm = 3.923978e-09 # Output file: vector.out.B8 Iterations = 18 Final Relative Residual Norm = 3.923978e-09 # Output file: vector.out.B9 Iterations = 18 Final Relative Residual Norm = 3.923978e-09 # Output file: vector.out.B10 Iterations = 18 Final Relative Residual Norm = 3.923978e-09 # Output file: vector.out.B100 Iterations = 18 Final Relative Residual Norm = 3.923978e-09 # Output file: vector.out.B101 GMRES Iterations = 54 Final GMRES Relative Residual Norm = 7.982371e-09 # Output file: vector.out.B102 Iterations = 202 Final Relative Residual Norm = 9.504933e-09 # Output file: vector.out.B103 BiCGSTAB Iterations = 12 Final BiCGSTAB Relative Residual Norm = 6.282586e-09 # Output file: vector.out.B104 LGMRES Iterations = 53 Final LGMRES Relative Residual Norm = 8.975947e-09 # Output file: vector.out.B105 FlexGMRES Iterations = 54 Final FlexGMRES Relative Residual Norm = 7.982371e-09 # Output file: vector.out.B106 Iterations = 18 Final Relative Residual Norm = 3.923978e-09 # Output file: vector.out.B107 Iterations = 18 Final Relative Residual Norm = 3.923978e-09 # Output file: vector.out.B108 Iterations = 18 Final Relative Residual Norm = 3.923978e-09 # Output file: vector.out.B109 Iterations = 18 Final Relative Residual Norm = 3.923978e-09 # Output file: vector.out.B110 Iterations = 18 Final Relative Residual Norm = 3.923978e-09 hypre-2.33.0/src/test/TEST_ij/vector.saved.aurora000066400000000000000000000055301477326011500215640ustar00rootroot00000000000000# Output file: vector.out.A0 Vector/Multivector error = 0.000000e+00 # Output file: vector.out.A1 Vector/Multivector error = 0.000000e+00 # Output file: vector.out.A2 Vector/Multivector error = 0.000000e+00 # Output file: vector.out.A3 Vector/Multivector error = 0.000000e+00 # Output file: vector.out.A4 Vector/Multivector error = 0.000000e+00 # Output file: vector.out.A5 Vector/Multivector error = 0.000000e+00 # Output file: vector.out.A6 Vector/Multivector error = 0.000000e+00 # Output file: vector.out.A7 Vector/Multivector error = 0.000000e+00 # Output file: vector.out.A8 Vector/Multivector error = 0.000000e+00 # Output file: vector.out.A9 Vector/Multivector error = 0.000000e+00 # Output file: vector.out.A10 Vector/Multivector error = 0.000000e+00 # Output file: vector.out.B0 Iterations = 18 Final Relative Residual Norm = 3.923978e-09 # Output file: vector.out.B1 GMRES Iterations = 54 Final GMRES Relative Residual Norm = 7.982371e-09 # Output file: vector.out.B2 Iterations = 202 Final Relative Residual Norm = 9.559932e-09 # Output file: vector.out.B3 BiCGSTAB Iterations = 12 Final BiCGSTAB Relative Residual Norm = 6.282586e-09 # Output file: vector.out.B4 LGMRES Iterations = 53 Final LGMRES Relative Residual Norm = 8.975949e-09 # Output file: vector.out.B5 FlexGMRES Iterations = 54 Final FlexGMRES Relative Residual Norm = 7.982371e-09 # Output file: vector.out.B6 Iterations = 18 Final Relative Residual Norm = 3.923978e-09 # Output file: vector.out.B7 Iterations = 18 Final Relative Residual Norm = 3.923978e-09 # Output file: vector.out.B8 Iterations = 18 Final Relative Residual Norm = 3.923978e-09 # Output file: vector.out.B9 Iterations = 18 Final Relative Residual Norm = 3.923978e-09 # Output file: vector.out.B10 Iterations = 18 Final Relative Residual Norm = 3.923978e-09 # Output file: vector.out.B100 Iterations = 18 Final Relative Residual Norm = 3.923978e-09 # Output file: vector.out.B101 GMRES Iterations = 54 Final GMRES Relative Residual Norm = 7.982371e-09 # Output file: vector.out.B102 Iterations = 202 Final Relative Residual Norm = 9.508045e-09 # Output file: vector.out.B103 BiCGSTAB Iterations = 12 Final BiCGSTAB Relative Residual Norm = 6.282586e-09 # Output file: vector.out.B104 LGMRES Iterations = 53 Final LGMRES Relative Residual Norm = 8.975948e-09 # Output file: vector.out.B105 FlexGMRES Iterations = 54 Final FlexGMRES Relative Residual Norm = 7.982371e-09 # Output file: vector.out.B106 Iterations = 18 Final Relative Residual Norm = 3.923978e-09 # Output file: vector.out.B107 Iterations = 18 Final Relative Residual Norm = 3.923978e-09 # Output file: vector.out.B108 Iterations = 18 Final Relative Residual Norm = 3.923978e-09 # Output file: vector.out.B109 Iterations = 18 Final Relative Residual Norm = 3.923978e-09 # Output file: vector.out.B110 Iterations = 18 Final Relative Residual Norm = 3.923978e-09 hypre-2.33.0/src/test/TEST_ij/vector.saved.lassen000066400000000000000000000055301477326011500215600ustar00rootroot00000000000000# Output file: vector.out.A0 Vector/Multivector error = 0.000000e+00 # Output file: vector.out.A1 Vector/Multivector error = 0.000000e+00 # Output file: vector.out.A2 Vector/Multivector error = 0.000000e+00 # Output file: vector.out.A3 Vector/Multivector error = 0.000000e+00 # Output file: vector.out.A4 Vector/Multivector error = 0.000000e+00 # Output file: vector.out.A5 Vector/Multivector error = 0.000000e+00 # Output file: vector.out.A6 Vector/Multivector error = 0.000000e+00 # Output file: vector.out.A7 Vector/Multivector error = 0.000000e+00 # Output file: vector.out.A8 Vector/Multivector error = 0.000000e+00 # Output file: vector.out.A9 Vector/Multivector error = 0.000000e+00 # Output file: vector.out.A10 Vector/Multivector error = 0.000000e+00 # Output file: vector.out.B0 Iterations = 18 Final Relative Residual Norm = 3.923978e-09 # Output file: vector.out.B1 GMRES Iterations = 54 Final GMRES Relative Residual Norm = 7.982372e-09 # Output file: vector.out.B2 Iterations = 202 Final Relative Residual Norm = 9.613027e-09 # Output file: vector.out.B3 BiCGSTAB Iterations = 12 Final BiCGSTAB Relative Residual Norm = 6.282586e-09 # Output file: vector.out.B4 LGMRES Iterations = 53 Final LGMRES Relative Residual Norm = 8.975949e-09 # Output file: vector.out.B5 FlexGMRES Iterations = 54 Final FlexGMRES Relative Residual Norm = 7.982372e-09 # Output file: vector.out.B6 Iterations = 18 Final Relative Residual Norm = 3.923978e-09 # Output file: vector.out.B7 Iterations = 18 Final Relative Residual Norm = 3.923978e-09 # Output file: vector.out.B8 Iterations = 18 Final Relative Residual Norm = 3.923978e-09 # Output file: vector.out.B9 Iterations = 18 Final Relative Residual Norm = 3.923978e-09 # Output file: vector.out.B10 Iterations = 18 Final Relative Residual Norm = 3.923978e-09 # Output file: vector.out.B100 Iterations = 18 Final Relative Residual Norm = 3.923978e-09 # Output file: vector.out.B101 GMRES Iterations = 54 Final GMRES Relative Residual Norm = 7.982371e-09 # Output file: vector.out.B102 Iterations = 202 Final Relative Residual Norm = 9.550922e-09 # Output file: vector.out.B103 BiCGSTAB Iterations = 12 Final BiCGSTAB Relative Residual Norm = 6.282586e-09 # Output file: vector.out.B104 LGMRES Iterations = 53 Final LGMRES Relative Residual Norm = 8.975948e-09 # Output file: vector.out.B105 FlexGMRES Iterations = 54 Final FlexGMRES Relative Residual Norm = 7.982371e-09 # Output file: vector.out.B106 Iterations = 18 Final Relative Residual Norm = 3.923978e-09 # Output file: vector.out.B107 Iterations = 18 Final Relative Residual Norm = 3.923978e-09 # Output file: vector.out.B108 Iterations = 18 Final Relative Residual Norm = 3.923978e-09 # Output file: vector.out.B109 Iterations = 18 Final Relative Residual Norm = 3.923978e-09 # Output file: vector.out.B110 Iterations = 18 Final Relative Residual Norm = 3.923978e-09 hypre-2.33.0/src/test/TEST_ij/vector.saved.lassen_cpu000066400000000000000000000055301477326011500224270ustar00rootroot00000000000000# Output file: vector.out.A0 Vector/Multivector error = 0.000000e+00 # Output file: vector.out.A1 Vector/Multivector error = 0.000000e+00 # Output file: vector.out.A2 Vector/Multivector error = 0.000000e+00 # Output file: vector.out.A3 Vector/Multivector error = 0.000000e+00 # Output file: vector.out.A4 Vector/Multivector error = 0.000000e+00 # Output file: vector.out.A5 Vector/Multivector error = 0.000000e+00 # Output file: vector.out.A6 Vector/Multivector error = 0.000000e+00 # Output file: vector.out.A7 Vector/Multivector error = 0.000000e+00 # Output file: vector.out.A8 Vector/Multivector error = 0.000000e+00 # Output file: vector.out.A9 Vector/Multivector error = 0.000000e+00 # Output file: vector.out.A10 Vector/Multivector error = 0.000000e+00 # Output file: vector.out.B0 Iterations = 18 Final Relative Residual Norm = 3.923978e-09 # Output file: vector.out.B1 GMRES Iterations = 54 Final GMRES Relative Residual Norm = 7.982370e-09 # Output file: vector.out.B2 Iterations = 202 Final Relative Residual Norm = 9.611457e-09 # Output file: vector.out.B3 BiCGSTAB Iterations = 12 Final BiCGSTAB Relative Residual Norm = 6.282586e-09 # Output file: vector.out.B4 LGMRES Iterations = 53 Final LGMRES Relative Residual Norm = 8.975949e-09 # Output file: vector.out.B5 FlexGMRES Iterations = 54 Final FlexGMRES Relative Residual Norm = 7.982370e-09 # Output file: vector.out.B6 Iterations = 18 Final Relative Residual Norm = 3.923978e-09 # Output file: vector.out.B7 Iterations = 18 Final Relative Residual Norm = 3.923978e-09 # Output file: vector.out.B8 Iterations = 18 Final Relative Residual Norm = 3.923978e-09 # Output file: vector.out.B9 Iterations = 18 Final Relative Residual Norm = 3.923978e-09 # Output file: vector.out.B10 Iterations = 18 Final Relative Residual Norm = 3.923978e-09 # Output file: vector.out.B100 Iterations = 18 Final Relative Residual Norm = 3.923978e-09 # Output file: vector.out.B101 GMRES Iterations = 54 Final GMRES Relative Residual Norm = 7.982371e-09 # Output file: vector.out.B102 Iterations = 202 Final Relative Residual Norm = 9.570265e-09 # Output file: vector.out.B103 BiCGSTAB Iterations = 12 Final BiCGSTAB Relative Residual Norm = 6.282586e-09 # Output file: vector.out.B104 LGMRES Iterations = 53 Final LGMRES Relative Residual Norm = 8.975946e-09 # Output file: vector.out.B105 FlexGMRES Iterations = 54 Final FlexGMRES Relative Residual Norm = 7.982371e-09 # Output file: vector.out.B106 Iterations = 18 Final Relative Residual Norm = 3.923978e-09 # Output file: vector.out.B107 Iterations = 18 Final Relative Residual Norm = 3.923978e-09 # Output file: vector.out.B108 Iterations = 18 Final Relative Residual Norm = 3.923978e-09 # Output file: vector.out.B109 Iterations = 18 Final Relative Residual Norm = 3.923978e-09 # Output file: vector.out.B110 Iterations = 18 Final Relative Residual Norm = 3.923978e-09 hypre-2.33.0/src/test/TEST_ij/vector.sh000077500000000000000000000037421477326011500176120ustar00rootroot00000000000000#!/bin/bash # Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) TNAME=`basename $0 .sh` RTOL=$1 ATOL=$2 #============================================================================= # A. set/get: multi-component vector tests #============================================================================= FILES="\ ${TNAME}.out.A0\ ${TNAME}.out.A1\ ${TNAME}.out.A2\ ${TNAME}.out.A3\ ${TNAME}.out.A4\ ${TNAME}.out.A5\ ${TNAME}.out.A6\ ${TNAME}.out.A7\ ${TNAME}.out.A8\ ${TNAME}.out.A9\ ${TNAME}.out.A10 " for i in $FILES do echo "# Output file: $i" tail -2 $i done > ${TNAME}.out.A # Make sure that the output file is reasonable RUNCOUNT=`echo $FILES | wc -w` OUTCOUNT=`grep "Vector/Multivector error" ${TNAME}.out.A | wc -l` if [ "$OUTCOUNT" != "$RUNCOUNT" ]; then echo "Incorrect number of runs in ${TNAME}.out.A" >&2 fi #============================================================================= # B. krylov solvers: multi-component vector tests #============================================================================= FILES="\ ${TNAME}.out.B0\ ${TNAME}.out.B1\ ${TNAME}.out.B2\ ${TNAME}.out.B3\ ${TNAME}.out.B4\ ${TNAME}.out.B5\ ${TNAME}.out.B6\ ${TNAME}.out.B7\ ${TNAME}.out.B8\ ${TNAME}.out.B9\ ${TNAME}.out.B10\ ${TNAME}.out.B100\ ${TNAME}.out.B101\ ${TNAME}.out.B102\ ${TNAME}.out.B103\ ${TNAME}.out.B104\ ${TNAME}.out.B105\ ${TNAME}.out.B106\ ${TNAME}.out.B107\ ${TNAME}.out.B108\ ${TNAME}.out.B109\ ${TNAME}.out.B110 " for i in $FILES do echo "# Output file: $i" tail -3 $i done > ${TNAME}.out.B # Make sure that the output file is reasonable RUNCOUNT=`echo $FILES | wc -w` OUTCOUNT=`grep "Iterations" ${TNAME}.out.B | wc -l` if [ "$OUTCOUNT" != "$RUNCOUNT" ]; then echo "Incorrect number of runs in ${TNAME}.out.B" >&2 fi # put all of the output files together cat ${TNAME}.out.[A-Z] > ${TNAME}.out hypre-2.33.0/src/test/TEST_ij/versioncheck.jobs000077500000000000000000000007021477326011500213070ustar00rootroot00000000000000#!/bin/bash # Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) #============================================================================= # Check the version header file variables #============================================================================= mpirun -np 1 ./ij > versioncheck.out.1 hypre-2.33.0/src/test/TEST_ij/versioncheck.sh000077500000000000000000000025001477326011500207620ustar00rootroot00000000000000#!/bin/bash # Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) TNAME=`basename $0 .sh` #============================================================================= # Check the HYPRE_DEVELOP variables #============================================================================= grep "Using HYPRE_DEVELOP_STRING" ${TNAME}.out.1 > ${TNAME}.testdata echo -n > ${TNAME}.testdatacheck if [ -d ../../../.git ]; then DEVSTRING=`git describe --match 'v*' --long --abbrev=9 2>/dev/null` DEVNUMBER=`echo $DEVSTRING | awk -F- '{print $2}'` DEVBRANCH=`git rev-parse --abbrev-ref HEAD` if [ -n "$DEVSTRING" ]; then if [ "$DEVBRANCH" != "master" ]; then echo "Using HYPRE_DEVELOP_STRING: $DEVSTRING (branch $DEVBRANCH; not the develop branch)" \ > ${TNAME}.testdatacheck else echo "Using HYPRE_DEVELOP_STRING: $DEVSTRING (branch $DEVBRANCH; the develop branch)" \ > ${TNAME}.testdatacheck fi fi fi diff ${TNAME}.testdata ${TNAME}.testdatacheck >&2 #============================================================================= # remove temporary files #============================================================================= rm -f ${TNAME}.testdata* hypre-2.33.0/src/test/TEST_lobpcg/000077500000000000000000000000001477326011500166075ustar00rootroot00000000000000hypre-2.33.0/src/test/TEST_lobpcg/ijdefault.jobs000077500000000000000000000051311477326011500214400ustar00rootroot00000000000000#!/bin/bash # Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) #============================================================================= # ij: LOBPCG cases #============================================================================= mpirun -np 2 ./ij -lobpcg -vrand 2 -seed 1 -tol 1.e-4 -vout 1 > ijdefault.out.vout.1 # use vectors computed by previous run as the initial mpirun -np 2 ./ij -lobpcg -vfromfile -seed 1 > ijdefault.out.vfromfile #============================================================================= # lobpcg: Run default case with all available PCG preconditioners # 1: BoomerAMG_PCG # 2: DS_PCG # 8: ParaSails_PCG # 12: Schwarz_PCG # 43: Euclid_PCG #============================================================================= #PCG run ...LOBPCG run for one eigenpair...LOBPCG for 5 eigenpairs mpirun -np 2 ./ij -solver 1 -tol 1.e-6 > ijdefault.out.1.lobpcg mpirun -np 2 ./ij -lobpcg -solver 1 -tol 1.e-6 -pcgitr 0 -seed 1 -vrand 1 > ijdefault.out.1.lobpcg.1 mpirun -np 2 ./ij -lobpcg -solver 1 -tol 1.e-6 -pcgitr 0 -seed 1 -vrand 5 > ijdefault.out.1.lobpcg.5 #PCG run ...LOBPCG run for one eigenpair...LOBPCG for 5 eigenpairs mpirun -np 2 ./ij -solver 2 -tol 1.e-6 > ijdefault.out.2.lobpcg mpirun -np 2 ./ij -lobpcg -solver 2 -tol 1.e-6 -pcgitr 20 -seed 1 -vrand 1 > ijdefault.out.2.lobpcg.1 mpirun -np 2 ./ij -lobpcg -solver 2 -tol 1.e-6 -pcgitr 20 -seed 1 -vrand 5 > ijdefault.out.2.lobpcg.5 #PCG run ...LOBPCG run for one eigenpair...LOBPCG for 5 eigenpairs #mpirun -np 2 ./ij -solver 8 -tol 1.e-6 > ijdefault.out.8.lobpcg #mpirun -np 2 ./ij -lobpcg -solver 8 -tol 1.e-6 -pcgitr 10 -seed 1 -vrand 1 > ijdefault.out.8.lobpcg.1 #mpirun -np 2 ./ij -lobpcg -solver 8 -tol 1.e-6 -pcgitr 10 -seed 1 -vrand 5 > ijdefault.out.8.lobpcg.5 #PCG run ...LOBPCG run for one eigenpair...LOBPCG for 5 eigenpairs mpirun -np 2 ./ij -solver 12 -tol 1.e-6 > ijdefault.out.12.lobpcg mpirun -np 2 ./ij -lobpcg -solver 12 -tol 1.e-6 -pcgitr 10 -seed 1 -vrand 1 > ijdefault.out.12.lobpcg.1 mpirun -np 2 ./ij -lobpcg -solver 12 -tol 1.e-6 -pcgitr 10 -seed 1 -vrand 5 > ijdefault.out.12.lobpcg.5 #PCG run ...LOBPCG run for one eigenpair...LOBPCG for 5 eigenpairs #mpirun -np 2 ./ij -solver 43 -tol 1.e-6 > ijdefault.out.43.lobpcg #mpirun -np 2 ./ij -lobpcg -solver 43 -tol 1.e-6 -pcgitr 10 -seed 1 -vrand 1 > ijdefault.out.43.lobpcg.1 #mpirun -np 2 ./ij -lobpcg -solver 43 -tol 1.e-6 -pcgitr 10 -seed 1 -vrand 5 > ijdefault.out.43.lobpcg.5 hypre-2.33.0/src/test/TEST_lobpcg/ijdefault.saved000066400000000000000000000066471477326011500216170ustar00rootroot00000000000000# Output file: ijdefault.out.vfromfile Eigenvalue lambda 2.43042158313017e-01 Eigenvalue lambda 4.79521039879691e-01 Residual 7.49244273224402e-08 Residual 3.13511569681941e-07 # Output file: ijdefault.out.vout.1 Eigenvalue lambda 2.43042159336231e-01 Eigenvalue lambda 4.79521040556425e-01 Residual 5.93138904669065e-05 Residual 3.00153697739346e-05 # Output file: ijdefault.out.1.lobpcg Iterations = 6 Final Relative Residual Norm = 1.767838e-07 # Output file: ijdefault.out.1.lobpcg.1 Eigenvalue lambda 2.43042158313720e-01 Residual 1.05888375241181e-06 # Output file: ijdefault.out.1.lobpcg.5 Eigenvalue lambda 2.43042158313047e-01 Eigenvalue lambda 4.79521039879730e-01 Eigenvalue lambda 4.79521039879862e-01 Eigenvalue lambda 4.79521039880011e-01 Eigenvalue lambda 7.15999921447447e-01 Residual 6.11700821362545e-07 Residual 7.03382889395189e-07 Residual 8.51024155852912e-07 Residual 8.72811391055883e-07 Residual 1.20346615548069e-06 # Output file: ijdefault.out.2.lobpcg Iterations = 20 Final Relative Residual Norm = 5.962015e-07 # Output file: ijdefault.out.2.lobpcg.1 Eigenvalue lambda 2.43042158313120e-01 Residual 4.63315030075101e-07 # Output file: ijdefault.out.2.lobpcg.5 Eigenvalue lambda 2.43042158313016e-01 Eigenvalue lambda 4.79521039879679e-01 Eigenvalue lambda 4.79521039879702e-01 Eigenvalue lambda 4.79521039879779e-01 Eigenvalue lambda 7.15999921447126e-01 Residual 1.43322942756939e-07 Residual 4.86471853062634e-07 Residual 3.80514535258685e-07 Residual 5.18360455474111e-07 Residual 1.02531463497084e-06 # Output file: ijdefault.out.8.lobpcg #Iterations = 15 #Final Relative Residual Norm = 6.352784e-07 # Output file: ijdefault.out.8.lobpcg.1 #Eigenvalue lambda 2.43042158313109e-01 #Residual 4.35799317942064e-07 # Output file: ijdefault.out.8.lobpcg.5 #Eigenvalue lambda 2.43042158313016e-01 #Eigenvalue lambda 4.79521039879678e-01 #Eigenvalue lambda 4.79521039879699e-01 #Eigenvalue lambda 4.79521039879799e-01 #Eigenvalue lambda 7.15999921446891e-01 #Residual 1.37749965131754e-07 #Residual 4.63010776375628e-07 #Residual 3.87579831562450e-07 #Residual 5.41642190641787e-07 #Residual 9.41630860798197e-07 # Output file: ijdefault.out.12.lobpcg Iterations = 13 Final Relative Residual Norm = 3.896456e-07 # Output file: ijdefault.out.12.lobpcg.1 Eigenvalue lambda 2.43042158313099e-01 Residual 3.94665203872263e-07 # Output file: ijdefault.out.12.lobpcg.5 Eigenvalue lambda 2.43042158313016e-01 Eigenvalue lambda 4.79521039879678e-01 Eigenvalue lambda 4.79521039879688e-01 Eigenvalue lambda 4.79521039879787e-01 Eigenvalue lambda 7.15999921447133e-01 Residual 1.36414438635337e-07 Residual 4.59821249520523e-07 Residual 3.78900179495246e-07 Residual 5.07942568509693e-07 Residual 1.11209031528658e-06 # Output file: ijdefault.out.43.lobpcg #Iterations = 9 #Final Relative Residual Norm = 5.971754e-07 # Output file: ijdefault.out.43.lobpcg.1 #Eigenvalue lambda 2.43042158313103e-01 #Residual 4.06686999057609e-07 # Output file: ijdefault.out.43.lobpcg.5 #Eigenvalue lambda 2.43042158313016e-01 #Eigenvalue lambda 4.79521039879682e-01 #Eigenvalue lambda 4.79521039879706e-01 #Eigenvalue lambda 4.79521039879825e-01 #Eigenvalue lambda 7.15999921446956e-01 #Residual 1.61376258673867e-07 #Residual 4.76948835732272e-07 #Residual 4.01718127440120e-07 #Residual 5.82137557078099e-07 #Residual 9.97061314149104e-07 hypre-2.33.0/src/test/TEST_lobpcg/ijdefault.sh000077500000000000000000000027121477326011500211170ustar00rootroot00000000000000#!/bin/bash # Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) TNAME=`basename $0 .sh` RTOL=$1 ATOL=$2 #============================================================================= # compare with baseline case #============================================================================= FILES="\ ${TNAME}.out.vfromfile\ ${TNAME}.out.vout.1\ " for i in $FILES do echo "# Output file: $i" tail -15 $i | head -5 done > ${TNAME}.out.a FILES="\ ${TNAME}.out.1.lobpcg\ ${TNAME}.out.2.lobpcg\ ${TNAME}.out.12.lobpcg\ " #${TNAME}.out.8.lobpcg\ #${TNAME}.out.43.lobpcg\ for i in $FILES do echo "# Output file: $i" tail -3 $i echo "# Output file: $i.1" tail -13 $i.1 | head -3 echo "# Output file: $i.5" tail -21 $i.5 | head -11 done > ${TNAME}.out.b # Make sure that the output file is reasonable RUNCOUNT=`echo $FILES | wc -w` OUTCOUNT=`grep "Iterations" ${TNAME}.out.b | wc -l` if [ "$OUTCOUNT" != "$RUNCOUNT" ]; then echo "Incorrect number of runs in ${TNAME}.out.b" >&2 fi # put all of the output files together cat ${TNAME}.out.[a-z] > ${TNAME}.out #============================================================================= # remove temporary files #============================================================================= rm -f ${TNAME}.testdata* rm -f residuals.txt values.txt vectors.[01].* hypre-2.33.0/src/test/TEST_lobpcg/ijoptions.jobs000077500000000000000000000056451477326011500215210ustar00rootroot00000000000000#!/bin/bash # Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) #============================================================================= # ij driver for eigenvalue solvers: # This script tests LOBPCG input options and defaults #=========================================================================== # All default parameters mpirun -np 2 ./ij -lobpcg -seed 1 > ijoptions.out.default #-solver none : no HYPRE preconditioner is used (default -solver 1) mpirun -np 2 ./ij -lobpcg -solver none -seed 1 > ijoptions.out.solver.none # maximum number of LOBPCG iterations (default 100) mpirun -np 2 ./ij -lobpcg -n 15 15 16 -vrand 2 -solver 2 -seed 1 > ijoptions.out.itr.100 # 2 iterations maximum mpirun -np 2 ./ij -lobpcg -n 15 15 16 -vrand 2 -solver 2 -seed 1 -itr 2 > ijoptions.out.itr.2 # -vrand 2 : compute 2 eigenpairs using random initial vectors (default 1) mpirun -np 2 ./ij -lobpcg -vrand 2 -seed 1 > ijoptions.out.vrand.2 #-seed 1 : use 1 as the seed for the pseudo-random number generator # (default seed is based on the time of the run) # The output files below should be identical, but different from ijoptions.out.default mpirun -np 2 ./ij -lobpcg -seed 1 > ijoptions.out.seed mpirun -np 2 ./ij -lobpcg -seed 1 > ijoptions.out.seed.repeat #no orthonormality check mpirun -np 2 ./ij -lobpcg -seed 1 > ijoptions.out.no_orthchk #-orthchk : check eigenvectors for orthonormality mpirun -np 2 ./ij -lobpcg -seed 1 -orthchk > ijoptions.out.orthchk #-verb 0 : no print mpirun -np 2 ./ij -lobpcg -seed 1 -verb 0 > ijoptions.out.verb.0 #-verb 1 : print initial eigenvalues and residuals, iteration number, number of # non-convergent eigenpairs and final eigenvalues and residuals (default) mpirun -np 2 ./ij -lobpcg -seed 1 > ijoptions.out.verb.1 #-verb 2 : print eigenvalues and residuals on each iteration mpirun -np 2 ./ij -lobpcg -seed 1 -verb 2 > ijoptions.out.verb.2 #-pcgitr 0 : the preconditioner is applied directly mpirun -np 2 ./ij -lobpcg -seed 1 -pcgitr 0 > ijoptions.out.pcgitr.0 #default number of inner iterations (1) mpirun -np 2 ./ij -lobpcg -seed 1 > ijoptions.out.pcgitr.1 #-pcgitr 2 : two inner iterations mpirun -np 2 ./ij -lobpcg -seed 1 -pcgitr 2 -pcgtol 0 > ijoptions.out.pcgitr.2 #default residual tolerance for inner iterations (0.01) mpirun -np 2 ./ij -lobpcg -solver 2 -seed 1 -pcgitr 1000 > ijoptions.out.pcgtol.01 #-pcgtol 0.05 mpirun -np 2 ./ij -lobpcg -solver 2 -seed 1 -pcgitr 1000 -pcgtol 0.05 > ijoptions.out.pcgtol.05 # -gen : generalized eigenvalue problem; A = B mpirun -np 2 ./ij -lobpcg -gen -seed 1 -orthchk > ijoptions.out.gen.1 # A: anizotropic Laplacian (cx = 0.1, cy = 1, cz = 10), B: Laplacian mpirun -np 2 ./ij -lobpcg -gen -seed 1 -c 0.1 1 10 -orthchk > ijoptions.out.gen.2 hypre-2.33.0/src/test/TEST_lobpcg/ijoptions.saved000066400000000000000000000037151477326011500216570ustar00rootroot00000000000000# ijoptions.out.default Eigenvalue lambda 2.43042158313015e-01 Residual 4.02732924449811e-08 # ijoptions.out.no_orthchk Eigenvalue lambda 2.43042158313015e-01 Residual 4.02732924449811e-08 # ijoptions.out.pcgitr.0 Eigenvalue lambda 2.43042158313015e-01 Residual 4.02732924449811e-08 # ijoptions.out.pcgitr.1 Eigenvalue lambda 2.43042158313015e-01 Residual 4.02732924449811e-08 # ijoptions.out.pcgitr.2 Eigenvalue lambda 2.43042158313017e-01 Residual 6.96799148131784e-08 # ijoptions.out.pcgtol.01 Eigenvalue lambda 2.43042158313017e-01 Residual 7.24629561469076e-08 # ijoptions.out.pcgtol.05 Eigenvalue lambda 2.43042158313023e-01 Residual 1.04744967224891e-07 # ijoptions.out.seed Eigenvalue lambda 2.43042158313015e-01 Residual 4.02732924449811e-08 # ijoptions.out.seed.repeat Eigenvalue lambda 2.43042158313015e-01 Residual 4.02732924449811e-08 # ijoptions.out.solver.none Eigenvalue lambda 2.43042158316676e-01 Residual 2.03104260070223e-06 # ijoptions.out.verb.1 Eigenvalue lambda 2.43042158313015e-01 Residual 4.02732924449811e-08 # ijoptions.out.gen.1 Eigenvalue lambda 1.00000000000000e+00 Residual 7.54364534145478e-16 # ijoptions.out.gen.2 Eigenvalue lambda 3.14395676812972e-01 Residual 2.50125397604763e-07 # ijoptions.out.orthchk Eigenvalue lambda 2.43042158313015e-01 Residual 4.02732924449811e-08 # ijoptions.out.itr.100 Eigenvalue lambda 2.11917767568658e-01 Residual 1.05202923460143e-07 Residual 1.21965976773690e-03 # ijoptions.out.itr.2 Eigenvalue lambda 2.32122316003068e+00 Residual 1.68566474191610e+00 Residual 1.58810659347606e+00 # ijoptions.out.vrand.2 Eigenvalue lambda 4.79521039879676e-01 Residual 1.22006034991590e-07 Residual 2.33712990248610e-07 # ijoptions.out.verb.2 Eigenvalue lambda 2.43042158313015e-01 Residual 4.027329e-08 ============================================= # ijoptions.out.verb.0 Complexity: grid = 1.555000 operator = 2.667344 hypre-2.33.0/src/test/TEST_lobpcg/ijoptions.sh000077500000000000000000000061431477326011500211700ustar00rootroot00000000000000#!/bin/bash # Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) TNAME=`basename $0 .sh` RTOL=$1 ATOL=$2 #============================================================================= # compare with baseline case #============================================================================= echo "# ${TNAME}.out.default" > ${TNAME}.out tail -13 ${TNAME}.out.default | head -3 >> ${TNAME}.out echo "# ${TNAME}.out.no_orthchk" >> ${TNAME}.out tail -13 ${TNAME}.out.no_orthchk | head -3 >> ${TNAME}.out echo "# ${TNAME}.out.pcgitr.0" >> ${TNAME}.out tail -13 ${TNAME}.out.pcgitr.0 | head -3 >> ${TNAME}.out echo "# ${TNAME}.out.pcgitr.1" >> ${TNAME}.out tail -13 ${TNAME}.out.pcgitr.1 | head -3 >> ${TNAME}.out echo "# ${TNAME}.out.pcgitr.2" >> ${TNAME}.out tail -13 ${TNAME}.out.pcgitr.2 | head -3 >> ${TNAME}.out echo "# ${TNAME}.out.pcgtol.01" >> ${TNAME}.out tail -13 ${TNAME}.out.pcgtol.01 | head -3 >> ${TNAME}.out echo "# ${TNAME}.out.pcgtol.05" >> ${TNAME}.out tail -13 ${TNAME}.out.pcgtol.05 | head -3 >> ${TNAME}.out echo "# ${TNAME}.out.seed" >> ${TNAME}.out tail -13 ${TNAME}.out.seed | head -3 >> ${TNAME}.out echo "# ${TNAME}.out.seed.repeat" >> ${TNAME}.out tail -13 ${TNAME}.out.seed.repeat | head -3 >> ${TNAME}.out echo "# ${TNAME}.out.solver.none" >> ${TNAME}.out tail -13 ${TNAME}.out.solver.none | head -3 >> ${TNAME}.out echo "# ${TNAME}.out.verb.1" >> ${TNAME}.out tail -13 ${TNAME}.out.verb.1 | head -3 >> ${TNAME}.out echo "# ${TNAME}.out.gen.1" >> ${TNAME}.out tail -14 ${TNAME}.out.gen.1 | head -3 >> ${TNAME}.out echo "# ${TNAME}.out.gen.2" >> ${TNAME}.out tail -14 ${TNAME}.out.gen.2 | head -3 >> ${TNAME}.out echo "# ${TNAME}.out.orthchk" >> ${TNAME}.out tail -14 ${TNAME}.out.orthchk | head -3 >> ${TNAME}.out echo "# ${TNAME}.out.itr.100" >> ${TNAME}.out tail -14 ${TNAME}.out.itr.100 | head -4 >> ${TNAME}.out echo "# ${TNAME}.out.itr.2" >> ${TNAME}.out tail -14 ${TNAME}.out.itr.2 | head -4 >> ${TNAME}.out echo "# ${TNAME}.out.vrand.2" >> ${TNAME}.out tail -14 ${TNAME}.out.vrand.2 | head -4 >> ${TNAME}.out echo "# ${TNAME}.out.verb.2" >> ${TNAME}.out tail -11 ${TNAME}.out.verb.2 | head -3 >> ${TNAME}.out # Make sure that the output file is reasonable RUNCOUNT=18 OUTCOUNT=`grep "Eigenvalue" ${TNAME}.out | wc -l | sed -e 's/^[[:space:]]*//'` if [ "$OUTCOUNT" != "$RUNCOUNT" ]; then echo "Incorrect number of runs in ${TNAME}.out" >&2 fi echo "# ${TNAME}.out.verb.0" >> ${TNAME}.out tail -40 ${TNAME}.out.verb.0 | head -2 >> ${TNAME}.out #============================================================================= # remove temporary files #============================================================================= # rm -f ${TNAME}.testdata* hypre-2.33.0/src/test/TEST_lobpcg/nonmixedint.jobs000077500000000000000000000021471477326011500220310ustar00rootroot00000000000000#!/bin/bash # Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) #============================================================================= # ij: LOBPCG cases # 0: ijdefault.out.8 # 1: ijdefault.out.43 #============================================================================= #PCG run ...LOBPCG run for one eigenpair...LOBPCG for 5 eigenpairs mpirun -np 2 ./ij -solver 8 -tol 1.e-6 > nonmixedint.out.0.lobpcg mpirun -np 2 ./ij -lobpcg -solver 8 -tol 1.e-6 -pcgitr 10 -seed 1 -vrand 1 > nonmixedint.out.0.lobpcg.1 mpirun -np 2 ./ij -lobpcg -solver 8 -tol 1.e-6 -pcgitr 10 -seed 1 -vrand 5 > nonmixedint.out.0.lobpcg.5 #PCG run ...LOBPCG run for one eigenpair...LOBPCG for 5 eigenpairs mpirun -np 2 ./ij -solver 43 -tol 1.e-6 > nonmixedint.out.1.lobpcg mpirun -np 2 ./ij -lobpcg -solver 43 -tol 1.e-6 -pcgitr 10 -seed 1 -vrand 1 > nonmixedint.out.1.lobpcg.1 mpirun -np 2 ./ij -lobpcg -solver 43 -tol 1.e-6 -pcgitr 10 -seed 1 -vrand 5 > nonmixedint.out.1.lobpcg.5 hypre-2.33.0/src/test/TEST_lobpcg/nonmixedint.saved000066400000000000000000000023401477326011500221660ustar00rootroot00000000000000# Output file: nonmixedint.out.0.lobpcg Iterations = 15 Final Relative Residual Norm = 6.352784e-07 # Output file: nonmixedint.out.0.lobpcg.1 Eigenvalue lambda 2.43042158313109e-01 Residual 4.35799317992281e-07 # Output file: nonmixedint.out.0.lobpcg.5 Eigenvalue lambda 2.43042158313016e-01 Eigenvalue lambda 4.79521039879681e-01 Eigenvalue lambda 4.79521039879696e-01 Eigenvalue lambda 4.79521039879797e-01 Eigenvalue lambda 7.15999921446900e-01 Residual 1.37749965201035e-07 Residual 4.62909573037802e-07 Residual 3.92243064406046e-07 Residual 5.41758662738602e-07 Residual 9.41628951499493e-07 # Output file: nonmixedint.out.1.lobpcg Iterations = 9 Final Relative Residual Norm = 5.971754e-07 # Output file: nonmixedint.out.1.lobpcg.1 Eigenvalue lambda 2.43042158313104e-01 Residual 4.06686998943146e-07 # Output file: nonmixedint.out.1.lobpcg.5 Eigenvalue lambda 2.43042158313016e-01 Eigenvalue lambda 4.79521039879676e-01 Eigenvalue lambda 4.79521039879713e-01 Eigenvalue lambda 4.79521039879829e-01 Eigenvalue lambda 7.15999921446991e-01 Residual 1.61376258584891e-07 Residual 4.77153868535215e-07 Residual 4.00095580278183e-07 Residual 5.82277072063708e-07 Residual 9.97050184991679e-07 hypre-2.33.0/src/test/TEST_lobpcg/nonmixedint.sh000077500000000000000000000022231477326011500215010ustar00rootroot00000000000000#!/bin/bash # Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) TNAME=`basename $0 .sh` RTOL=$1 ATOL=$2 #============================================================================= # compare with baseline case #============================================================================= FILES="\ ${TNAME}.out.0.lobpcg\ ${TNAME}.out.1.lobpcg\ " for i in $FILES do echo "# Output file: $i" tail -3 $i echo "# Output file: $i.1" tail -13 $i.1 | head -3 echo "# Output file: $i.5" tail -21 $i.5 | head -11 done > ${TNAME}.out # Make sure that the output file is reasonable RUNCOUNT=`echo $FILES | wc -w` OUTCOUNT=`grep "Iterations" ${TNAME}.out | wc -l` if [ "$OUTCOUNT" != "$RUNCOUNT" ]; then echo "Incorrect number of runs in ${TNAME}.out" >&2 fi #============================================================================= # remove temporary files #============================================================================= rm -f ${TNAME}.testdata* rm -f residuals.txt values.txt vectors.[01].* hypre-2.33.0/src/test/TEST_lobpcg/sstruct.in.default000066400000000000000000000054741477326011500223030ustar00rootroot00000000000000# Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) ########################################################### # GridCreate: ndim nparts GridCreate: 3 2 # GridSetExtents: part ilower(ndim) iupper(ndim) GridSetExtents: 0 (1- 1- 1-) (10+ 10+ 10+) GridSetExtents: 1 (1- 1- 1-) (10+ 10+ 10+) # GridSetVariables: part nvars vartypes[nvars] # CELL = 0 # NODE = 1 GridSetVariables: 0 2 [0 1] GridSetVariables: 1 2 [0 1] ########################################################### # StencilCreate: nstencils sizes[nstencils] StencilCreate: 2 [15 15] # StencilSetEntry: stencil_num entry offset[ndim] var value StencilSetEntry: 0 0 [ 0 0 0] 0 15.0 StencilSetEntry: 0 1 [-1 0 0] 0 -1.0 StencilSetEntry: 0 2 [ 1 0 0] 0 -1.0 StencilSetEntry: 0 3 [ 0 -1 0] 0 -1.0 StencilSetEntry: 0 4 [ 0 1 0] 0 -1.0 StencilSetEntry: 0 5 [ 0 0 -1] 0 -1.0 StencilSetEntry: 0 6 [ 0 0 1] 0 -1.0 StencilSetEntry: 0 7 [-1 -1 -1] 1 -1.0 StencilSetEntry: 0 8 [ 0 -1 -1] 1 -1.0 StencilSetEntry: 0 9 [-1 0 -1] 1 -1.0 StencilSetEntry: 0 10 [ 0 0 -1] 1 -1.0 StencilSetEntry: 0 11 [-1 -1 0] 1 -1.0 StencilSetEntry: 0 12 [ 0 -1 0] 1 -1.0 StencilSetEntry: 0 13 [-1 0 0] 1 -1.0 StencilSetEntry: 0 14 [ 0 0 0] 1 -1.0 # StencilSetEntry: stencil_num entry offset[ndim] var value StencilSetEntry: 1 0 [ 0 0 0] 1 15.0 StencilSetEntry: 1 1 [-1 0 0] 1 -1.0 StencilSetEntry: 1 2 [ 1 0 0] 1 -1.0 StencilSetEntry: 1 3 [ 0 -1 0] 1 -1.0 StencilSetEntry: 1 4 [ 0 1 0] 1 -1.0 StencilSetEntry: 1 5 [ 0 0 -1] 1 -1.0 StencilSetEntry: 1 6 [ 0 0 1] 1 -1.0 StencilSetEntry: 1 7 [ 0 0 0] 0 -1.0 StencilSetEntry: 1 8 [ 1 0 0] 0 -1.0 StencilSetEntry: 1 9 [ 0 1 0] 0 -1.0 StencilSetEntry: 1 10 [ 1 1 0] 0 -1.0 StencilSetEntry: 1 11 [ 0 0 1] 0 -1.0 StencilSetEntry: 1 12 [ 1 0 1] 0 -1.0 StencilSetEntry: 1 13 [ 0 1 1] 0 -1.0 StencilSetEntry: 1 14 [ 1 1 1] 0 -1.0 ########################################################### # GraphSetStencil: part var stencil_num GraphSetStencil: 0 0 0 GraphSetStencil: 0 1 1 GraphSetStencil: 1 0 0 GraphSetStencil: 1 1 1 # GraphAddEntries: \ # part ilower(ndim) iupper(ndim) stride[ndim] var \ # to_part to_ilower(ndim) to_iupper(ndim) to_stride[ndim] to_var \ # index_map[ndim] entry value GraphAddEntries: 0 (10+ 1- 1-) (10+ 10+ 10+) [1 1 1] 0 1 ( 1- 1- 1-) ( 1- 10+ 10+) [1 1 1] 0 [0 1 2] 15 -1.0 GraphAddEntries: 1 ( 1- 1- 1-) ( 1- 10+ 10+) [1 1 1] 0 0 (10+ 1- 1-) (10+ 10+ 10+) [1 1 1] 0 [0 1 2] 15 -1.0 ########################################################### # ProcessPoolCreate: num_pools ProcessPoolCreate: 1 # ProcessPoolSetPart: pool part ProcessPoolSetPart: 0 0 ProcessPoolSetPart: 0 1 ########################################################### hypre-2.33.0/src/test/TEST_lobpcg/sstruct.jobs000077500000000000000000000037771477326011500212160ustar00rootroot00000000000000#!/bin/bash # Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) #============================================================================= # Run default case with all available PCG preconditioners (solvers): # 10: SMG # 11: PFMG # 18: Diagonal scaling # 19: none #============================================================================= # PCG run... LOBPCG run for one eigenpair ... LOBPCG run for 4 eigenpairs mpirun -np 2 ./sstruct -P 1 1 2 -solver 10 -tol 1.e-6 > sstruct.out.10.lobpcg mpirun -np 2 ./sstruct -P 1 1 2 -lobpcg -solver 10 -tol 1.e-6 -pcgitr 0 -seed 1 -vrand 1 > sstruct.out.10.lobpcg.1 mpirun -np 2 ./sstruct -P 1 1 2 -lobpcg -solver 10 -tol 1.e-6 -pcgitr 0 -seed 1 -vrand 4 > sstruct.out.10.lobpcg.4 # PCG run... LOBPCG run for one eigenpair ... LOBPCG run for 4 eigenpairs mpirun -np 2 ./sstruct -P 1 1 2 -solver 11 -tol 1.e-6 > sstruct.out.11.lobpcg mpirun -np 2 ./sstruct -P 1 1 2 -lobpcg -solver 11 -tol 1.e-6 -pcgitr 0 -seed 1 -vrand 1 > sstruct.out.11.lobpcg.1 mpirun -np 2 ./sstruct -P 1 1 2 -lobpcg -solver 11 -tol 1.e-6 -pcgitr 0 -seed 1 -vrand 4 > sstruct.out.11.lobpcg.4 # PCG run... LOBPCG run for one eigenpair ... LOBPCG run for 4 eigenpairs mpirun -np 2 ./sstruct -P 1 1 2 -solver 18 > sstruct.out.18.lobpcg mpirun -np 2 ./sstruct -P 1 1 2 -lobpcg -solver 18 -tol 1.e-6 -pcgitr 10 -seed 1 -vrand 1 > sstruct.out.18.lobpcg.1 mpirun -np 2 ./sstruct -P 1 1 2 -lobpcg -solver 18 -tol 1.e-6 -pcgitr 10 -seed 1 -vrand 4 > sstruct.out.18.lobpcg.4 # PCG run... LOBPCG run for one eigenpair ... LOBPCG run for 4 eigenpairs mpirun -np 2 ./sstruct -P 1 1 2 -solver 19 > sstruct.out.19.lobpcg mpirun -np 2 ./sstruct -P 1 1 2 -lobpcg -solver 19 -tol 1.e-6 -pcgitr 10 -seed 1 -vrand 1 > sstruct.out.19.lobpcg.1 mpirun -np 2 ./sstruct -P 1 1 2 -lobpcg -solver 19 -tol 1.e-6 -pcgitr 10 -seed 1 -vrand 4 > sstruct.out.19.lobpcg.4 hypre-2.33.0/src/test/TEST_lobpcg/sstruct.saved000066400000000000000000000041741477326011500213500ustar00rootroot00000000000000# Output file: sstruct.out.10.lobpcg Iterations = 24 Final Relative Residual Norm = 6.429522e-07 # Output file: sstruct.out.10.lobpcg.1 Eigenvalue lambda 1.34880853089918e+00 Residual 1.40515754419491e-04 # Output file: sstruct.out.10.lobpcg.4 Eigenvalue lambda 1.34880848246852e+00 Eigenvalue lambda 1.36560847743334e+00 Eigenvalue lambda 1.47908699641636e+00 Eigenvalue lambda 1.49589925873578e+00 Residual 1.88411068757809e-06 Residual 1.92352730596892e-06 Residual 2.62402461132032e-06 Residual 5.33772292781341e-06 # Output file: sstruct.out.11.lobpcg Iterations = 24 Final Relative Residual Norm = 6.654613e-07 # Output file: sstruct.out.11.lobpcg.1 Eigenvalue lambda 1.34880853049719e+00 Residual 1.27609473238620e-04 # Output file: sstruct.out.11.lobpcg.4 Eigenvalue lambda 1.34880848246868e+00 Eigenvalue lambda 1.36560847743149e+00 Eigenvalue lambda 1.47908699638228e+00 Eigenvalue lambda 1.49589925867103e+00 Residual 2.34138563461796e-06 Residual 2.11050112612293e-06 Residual 2.34272528133832e-06 Residual 4.55132485053271e-06 # Output file: sstruct.out.18.lobpcg Iterations = 25 Final Relative Residual Norm = 9.124482e-07 # Output file: sstruct.out.18.lobpcg.1 Eigenvalue lambda 1.34880848247421e+00 Residual 1.68760664468992e-06 # Output file: sstruct.out.18.lobpcg.4 Eigenvalue lambda 1.34880848246833e+00 Eigenvalue lambda 1.36560847743301e+00 Eigenvalue lambda 1.47908699641137e+00 Eigenvalue lambda 1.49589925871590e+00 Residual 7.29467860779249e-07 Residual 9.62135023675930e-07 Residual 1.05238502112812e-06 Residual 1.42836272383011e-06 # Output file: sstruct.out.19.lobpcg Iterations = 25 Final Relative Residual Norm = 9.124482e-07 # Output file: sstruct.out.19.lobpcg.1 Eigenvalue lambda 1.34880848247421e+00 Residual 1.68760664640186e-06 # Output file: sstruct.out.19.lobpcg.4 Eigenvalue lambda 1.34880848246915e+00 Eigenvalue lambda 1.36560847743475e+00 Eigenvalue lambda 1.47908699641975e+00 Eigenvalue lambda 1.49589925875392e+00 Residual 7.29467866482847e-07 Residual 9.62135024900930e-07 Residual 1.05238500241244e-06 Residual 1.42836275555007e-06 hypre-2.33.0/src/test/TEST_lobpcg/sstruct.sh000077500000000000000000000022321477326011500206540ustar00rootroot00000000000000#!/bin/bash # Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) TNAME=`basename $0 .sh` RTOL=$1 ATOL=$2 #============================================================================= # compare with baseline case #============================================================================= FILES="\ ${TNAME}.out.10.lobpcg\ ${TNAME}.out.11.lobpcg\ ${TNAME}.out.18.lobpcg\ ${TNAME}.out.19.lobpcg\ " for i in $FILES do echo "# Output file: $i" tail -3 $i echo "# Output file: $i.1" tail -13 $i.1 | head -3 echo "# Output file: $i.4" tail -19 $i.4 | head -9 done > ${TNAME}.out # Make sure that the output file is reasonable RUNCOUNT=`echo $FILES | wc -w` OUTCOUNT=`grep "Iterations" ${TNAME}.out | wc -l` if [ "$OUTCOUNT" != "$RUNCOUNT" ]; then echo "Incorrect number of runs in ${TNAME}.out" >&2 fi #============================================================================= # remove temporary files #============================================================================= # rm -f ${TNAME}.testdata* hypre-2.33.0/src/test/TEST_lobpcg/struct.jobs000077500000000000000000000044031477326011500210160ustar00rootroot00000000000000#!/bin/bash # Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) #============================================================================= # Run default case with all available PCG preconditioners (solvers): # 10: SMG (default) # 11: PFMG # 17: 2-step Jacobi # 18: Diagonal scaling # 19: none #============================================================================= # PCG run... LOBPCG with one eigenpair .... LOBPCG with 5 eigenpairs mpirun -np 2 ./struct -solver 10 -tol 1.e-6 > struct.out.10.lobpcg mpirun -np 2 ./struct -lobpcg -solver 10 -tol 1.e-6 -pcgitr 0 -seed 1 -vrand 1 > struct.out.10.lobpcg.1 mpirun -np 2 ./struct -lobpcg -solver 10 -tol 1.e-6 -pcgitr 0 -seed 1 -vrand 5 > struct.out.10.lobpcg.5 # PCG run... LOBPCG with one eigenpair .... LOBPCG with 5 eigenpairs mpirun -np 2 ./struct -solver 11 -tol 1.e-6 > struct.out.11.lobpcg mpirun -np 2 ./struct -lobpcg -solver 11 -tol 1.e-6 -pcgitr 0 -seed 1 -vrand 1 > struct.out.11.lobpcg.1 mpirun -np 2 ./struct -lobpcg -solver 11 -tol 1.e-6 -pcgitr 0 -seed 1 -vrand 5 > struct.out.11.lobpcg.5 # PCG run... LOBPCG with one eigenpair .... LOBPCG with 5 eigenpairs mpirun -np 2 ./struct -solver 17 > struct.out.17.lobpcg mpirun -np 2 ./struct -lobpcg -solver 17 -tol 1.e-6 -pcgitr 10 -seed 1 -vrand 1 > struct.out.17.lobpcg.1 mpirun -np 2 ./struct -lobpcg -solver 17 -tol 1.e-6 -pcgitr 10 -pcgtol 0 -seed 1 -vrand 5 > struct.out.17.lobpcg.5 # PCG run... LOBPCG with one eigenpair .... LOBPCG with 5 eigenpairs mpirun -np 2 ./struct -solver 18 > struct.out.18.lobpcg mpirun -np 2 ./struct -lobpcg -solver 18 -tol 1.e-6 -pcgitr 10 -pcgtol 0 -seed 1 -vrand 1 > struct.out.18.lobpcg.1 mpirun -np 2 ./struct -lobpcg -solver 18 -tol 1.e-6 -pcgitr 10 -pcgtol 0 -seed 1 -vrand 5 > struct.out.18.lobpcg.5 # PCG run... LOBPCG with one eigenpair .... LOBPCG with 5 eigenpairs mpirun -np 2 ./struct -solver 19 > struct.out.19.lobpcg mpirun -np 2 ./struct -lobpcg -solver 19 -tol 1.e-6 -pcgitr 10 -pcgtol 0 -seed 1 -vrand 1 > struct.out.19.lobpcg.1 mpirun -np 2 ./struct -lobpcg -solver 19 -tol 1.e-6 -pcgitr 10 -pcgtol 0 -seed 1 -vrand 5 > struct.out.19.lobpcg.5 hypre-2.33.0/src/test/TEST_lobpcg/struct.saved000066400000000000000000000057671477326011500211760ustar00rootroot00000000000000# Output file: struct.out.10.lobpcg Iterations = 4 Final Relative Residual Norm = 1.355288e-07 # Output file: struct.out.10.lobpcg.1 Eigenvalue lambda 1.84366453091860e-01 Residual 4.52048636947317e-07 # Output file: struct.out.10.lobpcg.5 Eigenvalue lambda 1.84366453091770e-01 Eigenvalue lambda 2.50882493969728e-01 Eigenvalue lambda 3.60090369737200e-01 Eigenvalue lambda 4.20845334658571e-01 Eigenvalue lambda 4.20845334658890e-01 Residual 3.35930189890736e-07 Residual 3.11260814535858e-07 Residual 7.33053164875689e-07 Residual 5.14259223167152e-07 Residual 7.32161520953280e-07 # Output file: struct.out.11.lobpcg Iterations = 8 Final Relative Residual Norm = 4.807900e-07 # Output file: struct.out.11.lobpcg.1 Eigenvalue lambda 1.84366453092321e-01 Residual 1.05361158867902e-06 # Output file: struct.out.11.lobpcg.5 Eigenvalue lambda 1.84366453091757e-01 Eigenvalue lambda 2.50882493969850e-01 Eigenvalue lambda 3.60090369737248e-01 Eigenvalue lambda 4.20845334660032e-01 Eigenvalue lambda 4.20845334660335e-01 Residual 1.94648827548280e-07 Residual 1.22160192296946e-06 Residual 7.71834587887496e-07 Residual 1.28057007298605e-06 Residual 1.26140377965945e-06 # Output file: struct.out.17.lobpcg Iterations = 17 Final Relative Residual Norm = 8.241147e-07 # Output file: struct.out.17.lobpcg.1 Eigenvalue lambda 1.84366453091822e-01 Residual 2.74559569275018e-07 # Output file: struct.out.17.lobpcg.5 Eigenvalue lambda 1.84366453091761e-01 Eigenvalue lambda 2.50882493969754e-01 Eigenvalue lambda 3.60090369737181e-01 Eigenvalue lambda 4.20845334658550e-01 Eigenvalue lambda 4.20845334658985e-01 Residual 2.50212530703055e-07 Residual 1.21296920560361e-06 Residual 7.17050537726402e-07 Residual 8.69189255964679e-07 Residual 8.69185724273522e-07 # Output file: struct.out.18.lobpcg Iterations = 32 Final Relative Residual Norm = 8.259590e-07 # Output file: struct.out.18.lobpcg.1 Eigenvalue lambda 1.84366453091920e-01 Residual 4.04811751101852e-07 # Output file: struct.out.18.lobpcg.5 Eigenvalue lambda 1.84366453091760e-01 Eigenvalue lambda 2.50882493969440e-01 Eigenvalue lambda 3.60090369737180e-01 Eigenvalue lambda 4.20845334658791e-01 Eigenvalue lambda 4.20845334659400e-01 Residual 6.51620151548372e-07 Residual 1.04113397676966e-06 Residual 1.05795257133655e-06 Residual 1.01625954175797e-06 Residual 1.09288008877697e-06 # Output file: struct.out.19.lobpcg Iterations = 32 Final Relative Residual Norm = 8.259590e-07 # Output file: struct.out.19.lobpcg.1 Eigenvalue lambda 1.84366453091920e-01 Residual 4.04811751079993e-07 # Output file: struct.out.19.lobpcg.5 Eigenvalue lambda 1.84366453091760e-01 Eigenvalue lambda 2.50882493969706e-01 Eigenvalue lambda 3.60090369737178e-01 Eigenvalue lambda 4.20845334658819e-01 Eigenvalue lambda 4.20845334659484e-01 Residual 6.51620151941224e-07 Residual 1.04113396974827e-06 Residual 1.05795252287838e-06 Residual 1.01635836602686e-06 Residual 1.09013903468312e-06 hypre-2.33.0/src/test/TEST_lobpcg/struct.sh000077500000000000000000000022641477326011500204760ustar00rootroot00000000000000#!/bin/bash # Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) TNAME=`basename $0 .sh` RTOL=$1 ATOL=$2 #============================================================================= # compare with baseline case #============================================================================= FILES="\ ${TNAME}.out.10.lobpcg\ ${TNAME}.out.11.lobpcg\ ${TNAME}.out.17.lobpcg\ ${TNAME}.out.18.lobpcg\ ${TNAME}.out.19.lobpcg\ " for i in $FILES do echo "# Output file: $i" tail -3 $i echo "# Output file: $i.1" tail -13 $i.1 | head -3 echo "# Output file: $i.5" tail -21 $i.5 | head -11 done > ${TNAME}.out # Make sure that the output file is reasonable RUNCOUNT=`echo $FILES | wc -w` OUTCOUNT=`grep "Iterations" ${TNAME}.out | wc -l` if [ "$OUTCOUNT" != "$RUNCOUNT" ]; then echo "Incorrect number of runs in ${TNAME}.out" >&2 fi #============================================================================= # remove temporary files #============================================================================= # rm -f ${TNAME}.testdata* hypre-2.33.0/src/test/TEST_longdouble/000077500000000000000000000000001477326011500174735ustar00rootroot00000000000000hypre-2.33.0/src/test/TEST_longdouble/solvers_ij.jobs000077500000000000000000000076031477326011500225420ustar00rootroot00000000000000#!/bin/bash # Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) #============================================================================= # ij: Run default case with different solvers # 1: BoomerAMG_PCG # 2: DS_PCG # 3: BoomerAMG_GMRES # 4: DS_GMRES # 5: BoomerAMG_CGNR # 6: DS_CGNR # 7: PILUT_GMRES # 8: ParaSails_PCG # 20: Hybrid_PCG # # ij: test systems AMG # unknown approach # hybrid approach with block smoother # nodal approach # more solvers: # 51: BoomerAMG_LGMRES # 50: DS_LGMRES # 61: BoomerAMG_FlexGMRES # 60: DS_FlexGMRES # #============================================================================= mpirun -np 2 ./ij -solver 1 -tol 1.e-16 -rhsrand > solvers_ij.out.0 mpirun -np 2 ./ij -solver 2 -tol 1.e-16 -rhsrand > solvers_ij.out.1 mpirun -np 2 ./ij -solver 3 -tol 1.e-16 -rhsrand > solvers_ij.out.2 mpirun -np 2 ./ij -solver 4 -tol 1.e-16 -rhsrand > solvers_ij.out.3 mpirun -np 2 ./ij -solver 5 -tol 1.e-16 -rhsrand -w 0.67 -ns 2 > solvers_ij.out.4 mpirun -np 2 ./ij -solver 6 -tol 1.e-16 -rhsrand > solvers_ij.out.5 mpirun -np 2 ./ij -solver 7 -tol 1.e-16 -rhsrand > solvers_ij.out.6 mpirun -np 2 ./ij -solver 8 -tol 1.e-16 -rhsrand > solvers_ij.out.7 mpirun -np 2 ./ij -solver 20 -tol 1.e-16 -rhsrand > solvers_ij.out.8 mpirun -np 2 ./ij -solver 20 -tol 1.e-16 -cf 0.5 -rhsrand > solvers_ij.out.9 mpirun -np 2 ./ij -solver 20 -tol 1.e-16 -cf 0.5 -rhsrand -solver_type 2 > solvers_ij.out.10 mpirun -np 2 ./ij -solver 20 -tol 1.e-16 -cf 0.5 -rhsrand -solver_type 3 > solvers_ij.out.11 #systems AMG run ...unknown approach, hybrid approach, nodal approach mpirun -np 2 ./ij -n 20 20 20 -sysL 2 -nf 2 -tol 1.e-16 > solvers_ij.out.sysu mpirun -np 2 ./ij -n 20 20 20 -sysL 2 -nf 2 -nodal 1 -smtype 6 -smlv 10 -dom 1 -ov 0 -tol 1.e-16 > solvers_ij.out.sysh mpirun -np 2 ./ij -n 20 20 20 -sysL 2 -nf 2 -interptype 10 -Pmx 6 -tol 1.e-16 > solvers_ij.out.sysn #LGMRS and FlexGMRES mpirun -np 2 ./ij -solver 50 -tol 1.e-16 -rhsrand > solvers_ij.out.101 mpirun -np 2 ./ij -solver 51 -tol 1.e-16 -rhsrand > solvers_ij.out.102 mpirun -np 2 ./ij -solver 60 -tol 1.e-16 -rhsrand > solvers_ij.out.103 mpirun -np 2 ./ij -solver 61 -tol 1.e-16 -rhsrand > solvers_ij.out.104 #agglomerated coarse grid solve mpirun -np 8 ./ij -n 80 80 80 -P 2 2 2 -agg_nl 1 -seq_th 100 -solver 1 -rlx 6 -tol 1.e-16 > solvers_ij.out.105 mpirun -np 8 ./ij -n 40 40 40 -P 2 2 2 -agg_nl 1 -seq_th 100 -solver 1 -rlx 6 -sysL 3 -nf 3 -tol 1.e-16 > solvers_ij.out.107 #redundant coarse grid solve mpirun -np 8 ./ij -n 80 80 80 -P 2 2 2 -agg_nl 1 -seq_th 100 -solver 1 -rlx 6 -red 1 -tol 1.e-16 > solvers_ij.out.106 mpirun -np 8 ./ij -n 40 40 40 -P 2 2 2 -agg_nl 1 -seq_th 100 -solver 1 -rlx 6 -sysL 3 -nf 3 -red 1 -tol 1.e-16 > solvers_ij.out.108 #additive cycles mpirun -np 2 ./ij -n 20 20 20 -P 2 1 1 -agg_nl 1 -solver 1 -CF 0 -rlx 0 -w 0.7 -rlx_coarse 0 -ns_coarse 2 -tol 1.e-16 > solvers_ij.out.109 mpirun -np 2 ./ij -n 20 20 20 -P 2 1 1 -agg_nl 1 -solver 1 -CF 0 -add_rlx 0 -add_w 0.7 -mult_add 0 -tol 1.e-16 > solvers_ij.out.110 mpirun -np 4 ./ij -n 20 20 20 -P 2 2 1 -agg_nl 1 -solver 1 -simple 0 -tol 1.e-16 > solvers_ij.out.111 mpirun -np 8 ./ij -n 20 20 20 -P 2 2 2 -agg_nl 1 -solver 3 -additive 1 -tol 1.e-16 > solvers_ij.out.112 mpirun -np 8 ./ij -n 20 20 20 -P 2 2 2 -agg_nl 1 -solver 3 -mult_add 0 -add_Pmx 5 -tol 1.e-16 > solvers_ij.out.113 #nonGalerkin version mpirun -np 8 ./ij -n 40 40 40 -P 2 2 2 -nongalerk_tol 1 0.03 -tol 1.e-16 > solvers_ij.out.114 mpirun -np 8 ./ij -n 40 40 40 -P 2 2 2 -nongalerk_tol 3 0.0 0.01 0.05 -tol 1.e-16 > solvers_ij.out.115 #RAP options mpirun -np 8 ./ij -n 40 40 40 -P 2 2 2 -solver 3 -rap 0 -tol 1.e-16 > solvers_ij.out.116 mpirun -np 8 ./ij -n 40 40 40 -P 2 2 2 -solver 3 -rap 1 -tol 1.e-16 > solvers_ij.out.117 hypre-2.33.0/src/test/TEST_longdouble/solvers_ij.saved000066400000000000000000000070451477326011500227040ustar00rootroot00000000000000# Output file: solvers_ij.out.0 Iterations = 14 Final Relative Residual Norm = 7.837531e-18 # Output file: solvers_ij.out.1 Iterations = 65 Final Relative Residual Norm = 5.127733e-17 # Output file: solvers_ij.out.2 GMRES Iterations = 14 Final GMRES Relative Residual Norm = 2.081367e-17 # Output file: solvers_ij.out.3 GMRES Iterations = 199 Final GMRES Relative Residual Norm = 9.519631e-17 # Output file: solvers_ij.out.4 Iterations = 18 Final Relative Residual Norm = 2.567047e-17 # Output file: solvers_ij.out.5 Iterations = 375 Final Relative Residual Norm = 9.100420e-17 # Output file: solvers_ij.out.6 GMRES Iterations = 64 Final GMRES Relative Residual Norm = 8.111594e-17 # Output file: solvers_ij.out.7 Iterations = 42 Final Relative Residual Norm = 4.868667e-17 # Output file: solvers_ij.out.8 Iterations = 65 PCG_Iterations = 0 DSCG_Iterations = 65 Final Relative Residual Norm = 5.127733e-17 # Output file: solvers_ij.out.9 Iterations = 17 PCG_Iterations = 13 DSCG_Iterations = 4 Final Relative Residual Norm = 2.361559e-17 # Output file: solvers_ij.out.10 Iterations = 16 PCG_Iterations = 14 DSCG_Iterations = 2 Final Relative Residual Norm = 2.081367e-17 # Output file: solvers_ij.out.11 Iterations = 10 PCG_Iterations = 7 DSCG_Iterations = 3 Final Relative Residual Norm = 1.095097e-17 # Output file: solvers_ij.out.sysh Average Convergence Factor = 0.120656 Complexity: grid = 1.613875 operator = 2.860056 cycle = 5.719813 # Output file: solvers_ij.out.sysn Average Convergence Factor = 0.222219 Complexity: grid = 1.592000 operator = 2.633619 cycle = 11.267164 # Output file: solvers_ij.out.sysu Average Convergence Factor = 0.430732 Complexity: grid = 1.614937 operator = 2.866376 cycle = 5.732374 # Output file: solvers_ij.out.101 LGMRES Iterations = 174 Final LGMRES Relative Residual Norm = 9.552264e-17 # Output file: solvers_ij.out.102 LGMRES Iterations = 17 Final LGMRES Relative Residual Norm = 2.723270e-17 # Output file: solvers_ij.out.103 FlexGMRES Iterations = 199 Final FlexGMRES Relative Residual Norm = 9.519793e-17 # Output file: solvers_ij.out.104 FlexGMRES Iterations = 14 Final FlexGMRES Relative Residual Norm = 2.080779e-17 # Output file: solvers_ij.out.105 Iterations = 27 Final Relative Residual Norm = 4.117029e-17 # Output file: solvers_ij.out.106 Iterations = 27 Final Relative Residual Norm = 4.117029e-17 # Output file: solvers_ij.out.107 Iterations = 41 Final Relative Residual Norm = 5.530831e-17 # Output file: solvers_ij.out.108 Iterations = 41 Final Relative Residual Norm = 5.530831e-17 # Output file: solvers_ij.out.109 Iterations = 32 Final Relative Residual Norm = 8.814032e-17 # Output file: solvers_ij.out.110 Iterations = 32 Final Relative Residual Norm = 8.814032e-17 # Output file: solvers_ij.out.111 Iterations = 56 Final Relative Residual Norm = 8.514971e-17 # Output file: solvers_ij.out.112 GMRES Iterations = 43 Final GMRES Relative Residual Norm = 8.435563e-17 # Output file: solvers_ij.out.113 GMRES Iterations = 50 Final GMRES Relative Residual Norm = 7.198289e-17 # Output file: solvers_ij.out.114 BoomerAMG Iterations = 33 Final Relative Residual Norm = 7.715444e-17 # Output file: solvers_ij.out.115 BoomerAMG Iterations = 33 Final Relative Residual Norm = 7.295558e-17 # Output file: solvers_ij.out.116 GMRES Iterations = 18 Final GMRES Relative Residual Norm = 3.539225e-17 # Output file: solvers_ij.out.117 GMRES Iterations = 18 Final GMRES Relative Residual Norm = 3.377119e-17 hypre-2.33.0/src/test/TEST_longdouble/solvers_ij.sh000077500000000000000000000062351477326011500222170ustar00rootroot00000000000000#!/bin/bash # Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) TNAME=`basename $0 .sh` CONVTOL=$1 # Set default check tolerance if [ x$CONVTOL = "x" ]; then CONVTOL=0.0 fi #echo "tol = $CONVTOL" #============================================================================= # IJ: Run multiplicative and mult_additive cycle and compare results # should be the same #============================================================================= tail -17 ${TNAME}.out.109 | head -6 > ${TNAME}.testdata #============================================================================= tail -17 ${TNAME}.out.110 | head -6 > ${TNAME}.testdata.temp diff ${TNAME}.testdata ${TNAME}.testdata.temp >&2 #============================================================================= # compare with baseline case #============================================================================= FILES="\ ${TNAME}.out.0\ ${TNAME}.out.1\ ${TNAME}.out.2\ ${TNAME}.out.3\ ${TNAME}.out.4\ ${TNAME}.out.5\ ${TNAME}.out.6\ ${TNAME}.out.7\ " for i in $FILES do echo "# Output file: $i" tail -3 $i done > ${TNAME}.out.a # Make sure that the output file is reasonable RUNCOUNT=`echo $FILES | wc -w` OUTCOUNT=`grep "Iterations" ${TNAME}.out.a | wc -l` if [ "$OUTCOUNT" != "$RUNCOUNT" ]; then echo "Incorrect number of runs in ${TNAME}.out" >&2 fi FILES="\ ${TNAME}.out.8\ ${TNAME}.out.9\ ${TNAME}.out.10\ ${TNAME}.out.11\ " for i in $FILES do echo "# Output file: $i" tail -5 $i done > ${TNAME}.out.b # Make sure that the output file is reasonable RUNCOUNT=`echo $FILES | wc -w` OUTCOUNT=`grep "Relative" ${TNAME}.out.b | wc -l` if [ "$OUTCOUNT" != "$RUNCOUNT" ]; then echo "Incorrect number of runs in ${TNAME}.out" >&2 fi FILES="\ ${TNAME}.out.sysh\ ${TNAME}.out.sysn\ ${TNAME}.out.sysu\ " for i in $FILES do echo "# Output file: $i" tail -21 $i | head -6 done > ${TNAME}.out.c # Make sure that the output file is reasonable RUNCOUNT=`echo $FILES | wc -w` OUTCOUNT=`grep "Complexity" ${TNAME}.out.c | wc -l` if [ "$OUTCOUNT" != "$RUNCOUNT" ]; then echo "Incorrect number of runs in ${TNAME}.out" >&2 fi FILES="\ ${TNAME}.out.101\ ${TNAME}.out.102\ ${TNAME}.out.103\ ${TNAME}.out.104\ ${TNAME}.out.105\ ${TNAME}.out.106\ ${TNAME}.out.107\ ${TNAME}.out.108\ ${TNAME}.out.109\ ${TNAME}.out.110\ ${TNAME}.out.111\ ${TNAME}.out.112\ ${TNAME}.out.113\ ${TNAME}.out.114\ ${TNAME}.out.115\ ${TNAME}.out.116\ ${TNAME}.out.117\ " for i in $FILES do echo "# Output file: $i" tail -3 $i done > ${TNAME}.out.d # Make sure that the output file is reasonable RUNCOUNT=`echo $FILES | wc -w` OUTCOUNT=`grep "Iterations" ${TNAME}.out.d | wc -l` if [ "$OUTCOUNT" != "$RUNCOUNT" ]; then echo "Incorrect number of runs in ${TNAME}.out" >&2 fi # put all of the output files together cat ${TNAME}.out.[a-z] > ${TNAME}.out #============================================================================= # remove temporary files #============================================================================= rm -f ${TNAME}.testdata* hypre-2.33.0/src/test/TEST_longdouble/solvers_struct.jobs000066400000000000000000000057171477326011500234650ustar00rootroot00000000000000#!/bin/bash # Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) #============================================================================= # struct: Run SMG-CG, PFMG-CG, DSCG, CG, and Hybrid. #============================================================================= mpirun -np 3 ./struct -P 1 1 3 -solver 10 -tol 1.0e-16 > solvers_struct.out.0 mpirun -np 3 ./struct -P 1 3 1 -solver 11 -tol 1.0e-16 > solvers_struct.out.1 mpirun -np 3 ./struct -P 3 1 1 -solver 17 -tol 1.0e-16 > solvers_struct.out.2 mpirun -np 1 ./struct -P 1 1 1 -solver 18 -tol 1.0e-16 > solvers_struct.out.3 mpirun -np 1 ./struct -P 1 1 1 -solver 19 -tol 1.0e-16 > solvers_struct.out.4 #============================================================================= # Run default case with all available PCG preconditioners (solvers): # 10: SMG (default) # 11: PFMG # 17: 2-step Jacobi # 18: Diagonal scaling # 19: none #============================================================================= # PCG run... LOBPCG with one eigenpair .... LOBPCG with 5 eigenpairs mpirun -np 2 ./struct -solver 10 -tol 1.e-16 > solvers_struct.out.10.lobpcg mpirun -np 2 ./struct -lobpcg -solver 10 -tol 1.e-16 -pcgitr 0 -seed 1 -vrand 1 > solvers_struct.out.10.lobpcg.1 mpirun -np 2 ./struct -lobpcg -solver 10 -tol 1.e-16 -pcgitr 0 -seed 1 -vrand 5 > solvers_struct.out.10.lobpcg.5 # PCG run... LOBPCG with one eigenpair .... LOBPCG with 5 eigenpairs mpirun -np 2 ./struct -solver 11 -tol 1.e-16 > solvers_struct.out.11.lobpcg mpirun -np 2 ./struct -lobpcg -solver 11 -tol 1.e-16 -pcgitr 0 -seed 1 -vrand 1 > solvers_struct.out.11.lobpcg.1 mpirun -np 2 ./struct -lobpcg -solver 11 -tol 1.e-16 -pcgitr 0 -seed 1 -vrand 5 > solvers_struct.out.11.lobpcg.5 # PCG run... LOBPCG with one eigenpair .... LOBPCG with 5 eigenpairs mpirun -np 2 ./struct -solver 17 -tol 1.e-16 > solvers_struct.out.17.lobpcg mpirun -np 2 ./struct -lobpcg -solver 17 -tol 1.e-16 -pcgitr 10 -seed 1 -vrand 1 > solvers_struct.out.17.lobpcg.1 mpirun -np 2 ./struct -lobpcg -solver 17 -tol 1.e-16 -pcgitr 10 -seed 1 -vrand 5 > solvers_struct.out.17.lobpcg.5 # PCG run... LOBPCG with one eigenpair .... LOBPCG with 5 eigenpairs mpirun -np 2 ./struct -solver 18 -tol 1.e-16 > solvers_struct.out.18.lobpcg mpirun -np 2 ./struct -lobpcg -solver 18 -tol 1.e-16 -pcgitr 10 -seed 1 -vrand 1 > solvers_struct.out.18.lobpcg.1 mpirun -np 2 ./struct -lobpcg -solver 18 -tol 1.e-16 -pcgitr 10 -seed 1 -vrand 5 > solvers_struct.out.18.lobpcg.5 # PCG run... LOBPCG with one eigenpair .... LOBPCG with 5 eigenpairs mpirun -np 2 ./struct -solver 19 1.e-16 > solvers_struct.out.19.lobpcg mpirun -np 2 ./struct -lobpcg -solver 19 -tol 1.e-16 -pcgitr 10 -seed 1 -vrand 1 > solvers_struct.out.19.lobpcg.1 mpirun -np 2 ./struct -lobpcg -solver 19 -tol 1.e-16 -pcgitr 10 -seed 1 -vrand 5 > solvers_struct.out.19.lobpcg.5 hypre-2.33.0/src/test/TEST_longdouble/solvers_struct.saved000066400000000000000000000071251477326011500236250ustar00rootroot00000000000000# Output file: solvers_struct.out.0 Iterations = 10 Final Relative Residual Norm = 6.581106e-18 # Output file: solvers_struct.out.1 Iterations = 21 Final Relative Residual Norm = 1.596699e-17 # Output file: solvers_struct.out.2 Iterations = 38 Final Relative Residual Norm = 7.177049e-17 # Output file: solvers_struct.out.3 Iterations = 34 Final Relative Residual Norm = 3.265691e-18 # Output file: solvers_struct.out.4 Iterations = 34 Final Relative Residual Norm = 3.219688e-18 # Output file: solvers_struct.out.10.lobpcg Iterations = 9 Final Relative Residual Norm = 8.224720e-17 # Output file: solvers_struct.out.10.lobpcg.1 Eigenvalue lambda 1.84366453091756e-01 Residual 6.51777159501743e-08 # Output file: solvers_struct.out.10.lobpcg.5 Eigenvalue lambda 1.84366453091754e-01 Eigenvalue lambda 2.50882493969729e-01 Eigenvalue lambda 3.60090369737174e-01 Eigenvalue lambda 4.20845334658399e-01 Eigenvalue lambda 4.20845334658517e-01 Residual 3.01898591710117e-08 Residual 4.55422767371506e-08 Residual 3.17971068849731e-07 Residual 1.36018481189308e-07 Residual 3.39522268990133e-07 # Output file: solvers_struct.out.11.lobpcg Iterations = 20 Final Relative Residual Norm = 4.957736e-17 # Output file: solvers_struct.out.11.lobpcg.1 Eigenvalue lambda 1.84366453091756e-01 Residual 5.90808378148877e-08 # Output file: solvers_struct.out.11.lobpcg.5 Eigenvalue lambda 1.84366453091753e-01 Eigenvalue lambda 2.50882493969729e-01 Eigenvalue lambda 3.60090369737179e-01 Eigenvalue lambda 4.20845334658427e-01 Eigenvalue lambda 4.20845334658489e-01 Residual 3.21720429474187e-08 Residual 6.44224703497146e-08 Residual 2.42812454193411e-07 Residual 3.37502154312378e-07 Residual 3.28950912831126e-07 # Output file: solvers_struct.out.17.lobpcg Iterations = 34 Final Relative Residual Norm = 4.087402e-17 # Output file: solvers_struct.out.17.lobpcg.1 Eigenvalue lambda 1.84366453091770e-01 Residual 1.03034775753859e-07 # Output file: solvers_struct.out.17.lobpcg.5 Eigenvalue lambda 1.84366453091753e-01 Eigenvalue lambda 2.50882493969729e-01 Eigenvalue lambda 3.60090369737173e-01 Eigenvalue lambda 4.20845334658410e-01 Eigenvalue lambda 4.20845334658418e-01 Residual 2.01876274958806e-08 Residual 2.36598865456373e-07 Residual 1.80211166022567e-07 Residual 1.64172205059144e-07 Residual 1.88447274083737e-07 # Output file: solvers_struct.out.18.lobpcg Iterations = 59 Final Relative Residual Norm = 5.038238e-17 # Output file: solvers_struct.out.18.lobpcg.1 Eigenvalue lambda 1.84366453091755e-01 Residual 8.10727379998635e-08 # Output file: solvers_struct.out.18.lobpcg.5 Eigenvalue lambda 1.84366453091753e-01 Eigenvalue lambda 2.50882493969729e-01 Eigenvalue lambda 3.60090369737172e-01 Eigenvalue lambda 4.20845334658451e-01 Eigenvalue lambda 4.20845334658495e-01 Residual 9.97341733992902e-08 Residual 1.68228046062857e-07 Residual 1.17106600356615e-07 Residual 3.61346668971189e-07 Residual 3.12170077450817e-07 # Output file: solvers_struct.out.19.lobpcg Iterations = 32 Final Relative Residual Norm = 8.259590e-07 # Output file: solvers_struct.out.19.lobpcg.1 Eigenvalue lambda 1.84366453091755e-01 Residual 8.10727379998105e-08 # Output file: solvers_struct.out.19.lobpcg.5 Eigenvalue lambda 1.84366453091753e-01 Eigenvalue lambda 2.50882493969730e-01 Eigenvalue lambda 3.60090369737172e-01 Eigenvalue lambda 4.20845334658451e-01 Eigenvalue lambda 4.20845334658495e-01 Residual 9.97341733991334e-08 Residual 1.68228046056442e-07 Residual 1.17106600356972e-07 Residual 3.61346507824777e-07 Residual 3.12150570425402e-07 hypre-2.33.0/src/test/TEST_longdouble/solvers_struct.sh000077500000000000000000000033761477326011500231440ustar00rootroot00000000000000#!/bin/bash # Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) TNAME=`basename $0 .sh` CONVTOL=$1 # Set default check tolerance if [ x$CONVTOL = "x" ]; then CONVTOL=0.0 fi #echo "tol = $CONVTOL" #============================================================================= # compare with baseline case #============================================================================= FILES="\ ${TNAME}.out.0\ ${TNAME}.out.1\ ${TNAME}.out.2\ ${TNAME}.out.3\ ${TNAME}.out.4\ " for i in $FILES do echo "# Output file: $i" tail -3 $i done > ${TNAME}.out.a # Make sure that the output file is reasonable RUNCOUNT=`echo $FILES | wc -w` OUTCOUNT=`grep "Iterations" ${TNAME}.out.a | wc -l` if [ "$OUTCOUNT" != "$RUNCOUNT" ]; then echo "Incorrect number of runs in ${TNAME}.out" >&2 fi FILES="\ ${TNAME}.out.10.lobpcg\ ${TNAME}.out.11.lobpcg\ ${TNAME}.out.17.lobpcg\ ${TNAME}.out.18.lobpcg\ ${TNAME}.out.19.lobpcg\ " for i in $FILES do echo "# Output file: $i" tail -3 $i echo "# Output file: $i.1" tail -13 $i.1 | head -3 echo "# Output file: $i.5" tail -21 $i.5 | head -11 done > ${TNAME}.out.b # Make sure that the output file is reasonable RUNCOUNT=`echo $FILES | wc -w` OUTCOUNT=`grep "Iterations" ${TNAME}.out.b | wc -l` if [ "$OUTCOUNT" != "$RUNCOUNT" ]; then echo "Incorrect number of runs in ${TNAME}.out" >&2 fi # put all of the output files together cat ${TNAME}.out.[a-z] > ${TNAME}.out #============================================================================= # remove temporary files #============================================================================= # rm -f ${TNAME}.testdata* hypre-2.33.0/src/test/TEST_single/000077500000000000000000000000001477326011500166225ustar00rootroot00000000000000hypre-2.33.0/src/test/TEST_single/solvers_ij.jobs000077500000000000000000000075431477326011500216740ustar00rootroot00000000000000#!/bin/bash # Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) #============================================================================= # ij: Run default case with different solvers # 1: BoomerAMG_PCG # 2: DS_PCG # 3: BoomerAMG_GMRES # 4: DS_GMRES # 5: BoomerAMG_CGNR # 6: DS_CGNR # 7: PILUT_GMRES # 8: ParaSails_PCG # 20: Hybrid_PCG # # ij: test systems AMG # unknown approach # hybrid approach with block smoother # nodal approach # more solvers: # 51: BoomerAMG_LGMRES # 50: DS_LGMRES # 61: BoomerAMG_FlexGMRES # 60: DS_FlexGMRES # #============================================================================= mpirun -np 2 ./ij -solver 1 -tol 1.e-4 -rhsrand > solvers_ij.out.0 mpirun -np 2 ./ij -solver 2 -tol 1.e-4 -rhsrand > solvers_ij.out.1 mpirun -np 2 ./ij -solver 3 -tol 1.e-4 -rhsrand > solvers_ij.out.2 mpirun -np 2 ./ij -solver 4 -tol 1.e-4 -rhsrand > solvers_ij.out.3 mpirun -np 2 ./ij -solver 5 -tol 1.e-4 -rhsrand -w 0.67 -ns 2 > solvers_ij.out.4 mpirun -np 2 ./ij -solver 6 -tol 1.e-4 -rhsrand > solvers_ij.out.5 mpirun -np 2 ./ij -solver 7 -tol 1.e-4 -rhsrand > solvers_ij.out.6 mpirun -np 2 ./ij -solver 8 -tol 1.e-4 -rhsrand > solvers_ij.out.7 mpirun -np 2 ./ij -solver 20 -tol 1.e-4 -rhsrand > solvers_ij.out.8 mpirun -np 2 ./ij -solver 20 -tol 1.e-4 -cf 0.5 -rhsrand > solvers_ij.out.9 mpirun -np 2 ./ij -solver 20 -tol 1.e-4 -cf 0.5 -rhsrand -solver_type 2 > solvers_ij.out.10 mpirun -np 2 ./ij -solver 20 -tol 1.e-4 -cf 0.5 -rhsrand -solver_type 3 > solvers_ij.out.11 #systems AMG run ...unknown approach, hybrid approach, nodal approach mpirun -np 2 ./ij -n 20 20 20 -sysL 2 -nf 2 -tol 1.e-4 > solvers_ij.out.sysu mpirun -np 2 ./ij -n 20 20 20 -sysL 2 -nf 2 -nodal 1 -smtype 6 -smlv 10 -dom 1 -ov 0 -tol 1.e-4 > solvers_ij.out.sysh mpirun -np 2 ./ij -n 20 20 20 -sysL 2 -nf 2 -interptype 10 -Pmx 6 -tol 1.e-4 > solvers_ij.out.sysn #LGMRS and FlexGMRES mpirun -np 2 ./ij -solver 50 -tol 1.e-4 -rhsrand > solvers_ij.out.101 mpirun -np 2 ./ij -solver 51 -tol 1.e-4 -rhsrand > solvers_ij.out.102 mpirun -np 2 ./ij -solver 60 -tol 1.e-4 -rhsrand > solvers_ij.out.103 mpirun -np 2 ./ij -solver 61 -tol 1.e-4 -rhsrand > solvers_ij.out.104 #agglomerated coarse grid solve mpirun -np 8 ./ij -n 80 80 80 -P 2 2 2 -agg_nl 1 -seq_th 100 -solver 1 -rlx 6 -tol 1.e-4 > solvers_ij.out.105 mpirun -np 8 ./ij -n 40 40 40 -P 2 2 2 -agg_nl 1 -seq_th 100 -solver 1 -rlx 6 -sysL 3 -nf 3 -tol 1.e-4 > solvers_ij.out.107 #redundant coarse grid solve mpirun -np 8 ./ij -n 80 80 80 -P 2 2 2 -agg_nl 1 -seq_th 100 -solver 1 -rlx 6 -red 1 -tol 1.e-4 > solvers_ij.out.106 mpirun -np 8 ./ij -n 40 40 40 -P 2 2 2 -agg_nl 1 -seq_th 100 -solver 1 -rlx 6 -sysL 3 -nf 3 -red 1 -tol 1.e-4 > solvers_ij.out.108 #additive cycles mpirun -np 2 ./ij -n 20 20 20 -P 2 1 1 -agg_nl 1 -solver 1 -CF 0 -rlx 0 -w 0.7 -rlx_coarse 0 -ns_coarse 2 -tol 1.e-4 > solvers_ij.out.109 mpirun -np 2 ./ij -n 20 20 20 -P 2 1 1 -agg_nl 1 -solver 1 -CF 0 -add_rlx 0 -add_w 0.7 -mult_add 0 -tol 1.e-4 > solvers_ij.out.110 mpirun -np 4 ./ij -n 20 20 20 -P 2 2 1 -agg_nl 1 -solver 1 -simple 0 -tol 1.e-4 > solvers_ij.out.111 mpirun -np 8 ./ij -n 20 20 20 -P 2 2 2 -agg_nl 1 -solver 3 -additive 1 -tol 1.e-4 > solvers_ij.out.112 mpirun -np 8 ./ij -n 20 20 20 -P 2 2 2 -agg_nl 1 -solver 3 -mult_add 0 -add_Pmx 5 -tol 1.e-4 > solvers_ij.out.113 #nonGalerkin version mpirun -np 8 ./ij -n 40 40 40 -P 2 2 2 -nongalerk_tol 1 0.03 -tol 1.e-4 > solvers_ij.out.114 mpirun -np 8 ./ij -n 40 40 40 -P 2 2 2 -nongalerk_tol 3 0.0 0.01 0.05 -tol 1.e-4 > solvers_ij.out.115 #RAP options mpirun -np 8 ./ij -n 40 40 40 -P 2 2 2 -solver 3 -rap 0 -tol 1.e-4 > solvers_ij.out.116 mpirun -np 8 ./ij -n 40 40 40 -P 2 2 2 -solver 3 -rap 1 -tol 1.e-4 > solvers_ij.out.117 hypre-2.33.0/src/test/TEST_single/solvers_ij.saved000066400000000000000000000070201477326011500220240ustar00rootroot00000000000000# Output file: solvers_ij.out.0 Iterations = 4 Final Relative Residual Norm = 1.622018e-05 # Output file: solvers_ij.out.1 Iterations = 26 Final Relative Residual Norm = 7.193490e-05 # Output file: solvers_ij.out.2 GMRES Iterations = 4 Final GMRES Relative Residual Norm = 1.566565e-05 # Output file: solvers_ij.out.3 GMRES Iterations = 39 Final GMRES Relative Residual Norm = 9.040968e-05 # Output file: solvers_ij.out.4 Iterations = 5 Final Relative Residual Norm = 1.566357e-05 # Output file: solvers_ij.out.5 Iterations = 103 Final Relative Residual Norm = 8.784404e-05 # Output file: solvers_ij.out.6 GMRES Iterations = 15 Final GMRES Relative Residual Norm = 7.132032e-05 # Output file: solvers_ij.out.7 Iterations = 13 Final Relative Residual Norm = 7.750613e-05 # Output file: solvers_ij.out.8 Iterations = 26 PCG_Iterations = 0 DSCG_Iterations = 26 Final Relative Residual Norm = 7.193490e-05 # Output file: solvers_ij.out.9 Iterations = 7 PCG_Iterations = 3 DSCG_Iterations = 4 Final Relative Residual Norm = 6.677464e-05 # Output file: solvers_ij.out.10 Iterations = 6 PCG_Iterations = 4 DSCG_Iterations = 2 Final Relative Residual Norm = 1.566565e-05 # Output file: solvers_ij.out.11 Iterations = 5 PCG_Iterations = 2 DSCG_Iterations = 3 Final Relative Residual Norm = 9.153854e-06 # Output file: solvers_ij.out.sysh Average Convergence Factor = 0.119440 Complexity: grid = 1.613875 operator = 2.860317 cycle = 5.720336 # Output file: solvers_ij.out.sysn Average Convergence Factor = 0.241069 Complexity: grid = 1.592000 operator = 2.633619 cycle = 11.267164 # Output file: solvers_ij.out.sysu Average Convergence Factor = 0.413554 Complexity: grid = 1.614812 operator = 2.865126 cycle = 5.730247 # Output file: solvers_ij.out.101 LGMRES Iterations = 39 Final LGMRES Relative Residual Norm = 7.223135e-05 # Output file: solvers_ij.out.102 LGMRES Iterations = 4 Final LGMRES Relative Residual Norm = 1.566565e-05 # Output file: solvers_ij.out.103 FlexGMRES Iterations = 39 Final FlexGMRES Relative Residual Norm = 9.040783e-05 # Output file: solvers_ij.out.104 FlexGMRES Iterations = 4 Final FlexGMRES Relative Residual Norm = 1.566998e-05 # Output file: solvers_ij.out.105 Iterations = 9 Final Relative Residual Norm = 2.436053e-05 # Output file: solvers_ij.out.106 Iterations = 9 Final Relative Residual Norm = 2.436053e-05 # Output file: solvers_ij.out.107 Iterations = 12 Final Relative Residual Norm = 6.371622e-05 # Output file: solvers_ij.out.108 Iterations = 12 Final Relative Residual Norm = 6.371622e-05 # Output file: solvers_ij.out.109 Iterations = 9 Final Relative Residual Norm = 8.952618e-05 # Output file: solvers_ij.out.110 Iterations = 9 Final Relative Residual Norm = 8.952637e-05 # Output file: solvers_ij.out.111 Iterations = 15 Final Relative Residual Norm = 8.953385e-05 # Output file: solvers_ij.out.112 GMRES Iterations = 12 Final GMRES Relative Residual Norm = 5.912302e-05 # Output file: solvers_ij.out.113 GMRES Iterations = 13 Final GMRES Relative Residual Norm = 7.921693e-05 # Output file: solvers_ij.out.114 BoomerAMG Iterations = 9 Final Relative Residual Norm = 3.717217e-05 # Output file: solvers_ij.out.115 BoomerAMG Iterations = 9 Final Relative Residual Norm = 3.870274e-05 # Output file: solvers_ij.out.116 GMRES Iterations = 6 Final GMRES Relative Residual Norm = 3.071691e-05 # Output file: solvers_ij.out.117 GMRES Iterations = 6 Final GMRES Relative Residual Norm = 3.018834e-05 hypre-2.33.0/src/test/TEST_single/solvers_ij.saved.lassen000066400000000000000000000070261477326011500233160ustar00rootroot00000000000000# Output file: solvers_ij.out.0 Iterations = 6 Final Relative Residual Norm = 3.613604e-05 # Output file: solvers_ij.out.1 Iterations = 26 Final Relative Residual Norm = 7.193498e-05 # Output file: solvers_ij.out.2 GMRES Iterations = 6 Final GMRES Relative Residual Norm = 4.896985e-05 # Output file: solvers_ij.out.3 GMRES Iterations = 39 Final GMRES Relative Residual Norm = 9.047663e-05 # Output file: solvers_ij.out.4 Iterations = 5 Final Relative Residual Norm = 1.712172e-05 # Output file: solvers_ij.out.5 Iterations = 103 Final Relative Residual Norm = 8.784411e-05 # Output file: solvers_ij.out.6 GMRES Iterations = 15 Final GMRES Relative Residual Norm = 7.132540e-05 # Output file: solvers_ij.out.7 Iterations = 13 Final Relative Residual Norm = 7.750618e-05 # Output file: solvers_ij.out.8 Iterations = 26 PCG_Iterations = 0 DSCG_Iterations = 26 Final Relative Residual Norm = 7.193498e-05 # Output file: solvers_ij.out.9 Iterations = 7 PCG_Iterations = 3 DSCG_Iterations = 4 Final Relative Residual Norm = 7.681886e-05 # Output file: solvers_ij.out.10 Iterations = 6 PCG_Iterations = 4 DSCG_Iterations = 2 Final Relative Residual Norm = 2.434827e-05 # Output file: solvers_ij.out.11 Iterations = 5 PCG_Iterations = 2 DSCG_Iterations = 3 Final Relative Residual Norm = 1.167394e-05 # Output file: solvers_ij.out.sysh Average Convergence Factor = 0.203916 Complexity: grid = 1.393625 operator = 2.648489 cycle = 5.296959 # Output file: solvers_ij.out.sysn Average Convergence Factor = 0.533108 Complexity: grid = 1.390750 operator = 2.080112 cycle = 10.160150 # Output file: solvers_ij.out.sysu Average Convergence Factor = 0.738350 Complexity: grid = 1.392063 operator = 2.742309 cycle = 5.484450 # Output file: solvers_ij.out.101 LGMRES Iterations = 39 Final LGMRES Relative Residual Norm = 7.221823e-05 # Output file: solvers_ij.out.102 LGMRES Iterations = 6 Final LGMRES Relative Residual Norm = 4.896985e-05 # Output file: solvers_ij.out.103 FlexGMRES Iterations = 39 Final FlexGMRES Relative Residual Norm = 9.047555e-05 # Output file: solvers_ij.out.104 FlexGMRES Iterations = 6 Final FlexGMRES Relative Residual Norm = 4.897068e-05 # Output file: solvers_ij.out.105 Iterations = 11 Final Relative Residual Norm = 4.008468e-05 # Output file: solvers_ij.out.106 Iterations = 11 Final Relative Residual Norm = 4.008468e-05 # Output file: solvers_ij.out.107 Iterations = 16 Final Relative Residual Norm = 6.769229e-05 # Output file: solvers_ij.out.108 Iterations = 16 Final Relative Residual Norm = 6.769223e-05 # Output file: solvers_ij.out.109 Iterations = 11 Final Relative Residual Norm = 7.168816e-05 # Output file: solvers_ij.out.110 Iterations = 11 Final Relative Residual Norm = 7.168804e-05 # Output file: solvers_ij.out.111 Iterations = 17 Final Relative Residual Norm = 7.756728e-05 # Output file: solvers_ij.out.112 GMRES Iterations = 21 Final GMRES Relative Residual Norm = 7.639248e-05 # Output file: solvers_ij.out.113 GMRES Iterations = 14 Final GMRES Relative Residual Norm = 9.875665e-05 # Output file: solvers_ij.out.114 BoomerAMG Iterations = 17 Final Relative Residual Norm = 8.243789e-05 # Output file: solvers_ij.out.115 BoomerAMG Iterations = 17 Final Relative Residual Norm = 8.901364e-05 # Output file: solvers_ij.out.116 GMRES Iterations = 8 Final GMRES Relative Residual Norm = 8.284889e-05 # Output file: solvers_ij.out.117 GMRES Iterations = 8 Final GMRES Relative Residual Norm = 8.300778e-05 hypre-2.33.0/src/test/TEST_single/solvers_ij.sh000077500000000000000000000063401477326011500213430ustar00rootroot00000000000000#!/bin/bash # Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) TNAME=`basename $0 .sh` CONVTOL=$1 # Set default check tolerance if [ x$CONVTOL = "x" ]; then CONVTOL=0.0 fi #echo "tol = $CONVTOL" #============================================================================= # IJ: Run multiplicative and mult_additive cycle and compare results # should be the same #============================================================================= tail -17 ${TNAME}.out.109 | head -3 > ${TNAME}.testdata #============================================================================= tail -17 ${TNAME}.out.110 | head -3 > ${TNAME}.testdata.temp #diff ${TNAME}.testdata ${TNAME}.testdata.temp >&2 ../runcheck.sh ${TNAME}.testdata ${TNAME}.testdata.temp 1.e-4 >&2 #============================================================================= # compare with baseline case #============================================================================= FILES="\ ${TNAME}.out.0\ ${TNAME}.out.1\ ${TNAME}.out.2\ ${TNAME}.out.3\ ${TNAME}.out.4\ ${TNAME}.out.5\ ${TNAME}.out.6\ ${TNAME}.out.7\ " for i in $FILES do echo "# Output file: $i" tail -3 $i done > ${TNAME}.out.a # Make sure that the output file is reasonable RUNCOUNT=`echo $FILES | wc -w` OUTCOUNT=`grep "Iterations" ${TNAME}.out.a | wc -l` if [ "$OUTCOUNT" != "$RUNCOUNT" ]; then echo "Incorrect number of runs in ${TNAME}.out" >&2 fi FILES="\ ${TNAME}.out.8\ ${TNAME}.out.9\ ${TNAME}.out.10\ ${TNAME}.out.11\ " for i in $FILES do echo "# Output file: $i" tail -5 $i done > ${TNAME}.out.b # Make sure that the output file is reasonable RUNCOUNT=`echo $FILES | wc -w` OUTCOUNT=`grep "Relative" ${TNAME}.out.b | wc -l` if [ "$OUTCOUNT" != "$RUNCOUNT" ]; then echo "Incorrect number of runs in ${TNAME}.out" >&2 fi FILES="\ ${TNAME}.out.sysh\ ${TNAME}.out.sysn\ ${TNAME}.out.sysu\ " for i in $FILES do echo "# Output file: $i" tail -21 $i | head -6 done > ${TNAME}.out.c # Make sure that the output file is reasonable RUNCOUNT=`echo $FILES | wc -w` OUTCOUNT=`grep "Complexity" ${TNAME}.out.c | wc -l` if [ "$OUTCOUNT" != "$RUNCOUNT" ]; then echo "Incorrect number of runs in ${TNAME}.out" >&2 fi FILES="\ ${TNAME}.out.101\ ${TNAME}.out.102\ ${TNAME}.out.103\ ${TNAME}.out.104\ ${TNAME}.out.105\ ${TNAME}.out.106\ ${TNAME}.out.107\ ${TNAME}.out.108\ ${TNAME}.out.109\ ${TNAME}.out.110\ ${TNAME}.out.111\ ${TNAME}.out.112\ ${TNAME}.out.113\ ${TNAME}.out.114\ ${TNAME}.out.115\ ${TNAME}.out.116\ ${TNAME}.out.117\ " for i in $FILES do echo "# Output file: $i" tail -3 $i done > ${TNAME}.out.d # Make sure that the output file is reasonable RUNCOUNT=`echo $FILES | wc -w` OUTCOUNT=`grep "Iterations" ${TNAME}.out.d | wc -l` if [ "$OUTCOUNT" != "$RUNCOUNT" ]; then echo "Incorrect number of runs in ${TNAME}.out" >&2 fi # put all of the output files together cat ${TNAME}.out.[a-z] > ${TNAME}.out #============================================================================= # remove temporary files #============================================================================= rm -f ${TNAME}.testdata* hypre-2.33.0/src/test/TEST_single/solvers_struct.jobs000077500000000000000000000056531477326011500226160ustar00rootroot00000000000000#!/bin/bash # Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) #============================================================================= # struct: Run SMG-CG, PFMG-CG, DSCG, CG, and Hybrid. #============================================================================= mpirun -np 3 ./struct -P 1 1 3 -solver 10 -tol 1.0e-4 > solvers_struct.out.0 mpirun -np 3 ./struct -P 1 3 1 -solver 11 -tol 1.0e-4 > solvers_struct.out.1 mpirun -np 3 ./struct -P 3 1 1 -solver 17 -tol 1.0e-4 > solvers_struct.out.2 mpirun -np 1 ./struct -P 1 1 1 -solver 18 -tol 1.0e-4 > solvers_struct.out.3 mpirun -np 1 ./struct -P 1 1 1 -solver 19 -tol 1.0e-4 > solvers_struct.out.4 #============================================================================= # Run default case with all available PCG preconditioners (solvers): # 10: SMG (default) # 11: PFMG # 17: 2-step Jacobi # 18: Diagonal scaling # 19: none #============================================================================= # PCG run... LOBPCG with one eigenpair .... LOBPCG with 3 eigenpairs mpirun -np 2 ./struct -solver 10 -tol 1.e-4 > solvers_struct.out.10.lobpcg mpirun -np 2 ./struct -lobpcg -solver 10 -tol 1.e-4 -pcgitr 0 -seed 1 -vrand 1 > solvers_struct.out.10.lobpcg.1 mpirun -np 2 ./struct -lobpcg -solver 10 -tol 1.e-4 -pcgitr 0 -seed 1 -vrand 3 > solvers_struct.out.10.lobpcg.3 # PCG run... LOBPCG with one eigenpair .... LOBPCG with 3 eigenpairs mpirun -np 2 ./struct -solver 11 -tol 1.e-4 > solvers_struct.out.11.lobpcg mpirun -np 2 ./struct -lobpcg -solver 11 -tol 1.e-4 -pcgitr 0 -seed 1 -vrand 1 > solvers_struct.out.11.lobpcg.1 mpirun -np 2 ./struct -lobpcg -solver 11 -tol 1.e-4 -pcgitr 0 -seed 1 -vrand 3 > solvers_struct.out.11.lobpcg.3 # PCG run... LOBPCG with one eigenpair .... LOBPCG with 3 eigenpairs mpirun -np 2 ./struct -solver 17 > solvers_struct.out.17.lobpcg mpirun -np 2 ./struct -lobpcg -solver 17 -tol 1.e-4 -pcgitr 10 -seed 1 -vrand 1 > solvers_struct.out.17.lobpcg.1 mpirun -np 2 ./struct -lobpcg -solver 17 -tol 1.e-4 -pcgitr 10 -seed 1 -vrand 3 > solvers_struct.out.17.lobpcg.3 # PCG run... LOBPCG with one eigenpair .... LOBPCG with 3 eigenpairs mpirun -np 2 ./struct -solver 18 > solvers_struct.out.18.lobpcg mpirun -np 2 ./struct -lobpcg -solver 18 -tol 1.e-4 -pcgitr 10 -seed 1 -vrand 1 > solvers_struct.out.18.lobpcg.1 mpirun -np 2 ./struct -lobpcg -solver 18 -tol 1.e-4 -pcgitr 10 -seed 1 -vrand 3 > solvers_struct.out.18.lobpcg.3 # PCG run... LOBPCG with one eigenpair .... LOBPCG with 3 eigenpairs mpirun -np 2 ./struct -solver 19 -tol 1.e-4 > solvers_struct.out.19.lobpcg mpirun -np 2 ./struct -lobpcg -solver 19 -tol 1.e-4 -pcgitr 10 -seed 1 -vrand 1 > solvers_struct.out.19.lobpcg.1 mpirun -np 2 ./struct -lobpcg -solver 19 -tol 1.e-4 -pcgitr 10 -seed 1 -vrand 3 > solvers_struct.out.19.lobpcg.3 hypre-2.33.0/src/test/TEST_single/solvers_struct.saved000066400000000000000000000072301477326011500227510ustar00rootroot00000000000000# Output file: solvers_struct.out.0 Iterations = 3 Final Relative Residual Norm = 3.246673e-05 # Output file: solvers_struct.out.1 Iterations = 6 Final Relative Residual Norm = 2.055850e-05 # Output file: solvers_struct.out.2 Iterations = 16 Final Relative Residual Norm = 5.377689e-05 # Output file: solvers_struct.out.3 Iterations = 16 Final Relative Residual Norm = 3.726248e-05 # Output file: solvers_struct.out.4 Iterations = 16 Final Relative Residual Norm = 3.718718e-05 # Output file: solvers_struct.out.10.lobpcg Iterations = 3 Final Relative Residual Norm = 6.275783e-06 # Output file: solvers_struct.out.10.lobpcg.1 Eigenvalue lambda 1.84366211295128e-01 Residual 2.48430933424970e-05 # Output file: solvers_struct.out.10.lobpcg.3 Iteration 10 bsize 2 maxres 4.35155990999192e-04 Iteration 11 bsize 1 maxres 2.05302669201046e-04 Iteration 12 bsize 1 maxres 8.52039884193800e-05 Eigenvalue lambda 1.84366419911385e-01 Eigenvalue lambda 2.50882804393768e-01 Eigenvalue lambda 3.60089868307114e-01 Residual 7.40827381378040e-05 Residual 4.10445172747131e-05 Residual 8.52039884193800e-05 # Output file: solvers_struct.out.11.lobpcg Iterations = 6 Final Relative Residual Norm = 2.112817e-05 # Output file: solvers_struct.out.11.lobpcg.1 Eigenvalue lambda 1.84366181492805e-01 Residual 3.16434197884519e-05 # Output file: solvers_struct.out.11.lobpcg.3 Iteration 11 bsize 2 maxres 6.89531618263572e-04 Iteration 12 bsize 2 maxres 2.52014782745391e-04 Iteration 13 bsize 1 maxres 7.00048913131468e-05 Eigenvalue lambda 1.84366345405579e-01 Eigenvalue lambda 2.50880867242813e-01 Eigenvalue lambda 3.60090494155884e-01 Residual 5.61281849513762e-05 Residual 2.61230034084292e-05 Residual 7.00048913131468e-05 # Output file: solvers_struct.out.17.lobpcg Iterations = 20 Final Relative Residual Norm = 4.194806e-07 # Output file: solvers_struct.out.17.lobpcg.1 Eigenvalue lambda 1.84366390109062e-01 Residual 1.95900083781453e-05 # Output file: solvers_struct.out.17.lobpcg.3 Iteration 10 bsize 2 maxres 3.62457707524300e-04 Iteration 11 bsize 1 maxres 1.69860562891699e-04 Iteration 12 bsize 1 maxres 7.12833571014926e-05 Eigenvalue lambda 1.84366583824158e-01 Eigenvalue lambda 2.50883996486664e-01 Eigenvalue lambda 3.60090583562851e-01 Residual 5.53683385078330e-05 Residual 3.08582348225173e-05 Residual 7.12833571014926e-05 # Output file: solvers_struct.out.18.lobpcg Iterations = 33 Final Relative Residual Norm = 8.027236e-07 # Output file: solvers_struct.out.18.lobpcg.1 Eigenvalue lambda 1.84366077184677e-01 Residual 4.44860852439888e-05 # Output file: solvers_struct.out.18.lobpcg.3 Iteration 10 bsize 2 maxres 5.79534214921296e-04 Iteration 11 bsize 1 maxres 1.98537352844141e-04 Iteration 12 bsize 1 maxres 9.26745269680396e-05 Eigenvalue lambda 1.84366509318352e-01 Eigenvalue lambda 2.50894546508789e-01 Eigenvalue lambda 3.60091388225555e-01 Residual 9.26745269680396e-05 Residual 8.93285541678779e-05 Residual 5.54441285203211e-05 # Output file: solvers_struct.out.19.lobpcg Iterations = 25 Final Relative Residual Norm = 7.712499e-05 # Output file: solvers_struct.out.19.lobpcg.1 Eigenvalue lambda 1.84366524219513e-01 Residual 4.43533899670001e-05 # Output file: solvers_struct.out.19.lobpcg.3 Iteration 10 bsize 2 maxres 5.82181091886014e-04 Iteration 11 bsize 1 maxres 1.99127141968347e-04 Iteration 12 bsize 1 maxres 9.26545544643886e-05 Eigenvalue lambda 1.84366345405579e-01 Eigenvalue lambda 2.50889092683792e-01 Eigenvalue lambda 3.60089659690857e-01 Residual 9.26545544643886e-05 Residual 8.75688710948452e-05 Residual 5.51430639461614e-05 hypre-2.33.0/src/test/TEST_single/solvers_struct.saved.lassen000066400000000000000000000072301477326011500242350ustar00rootroot00000000000000# Output file: solvers_struct.out.0 Iterations = 3 Final Relative Residual Norm = 3.246689e-05 # Output file: solvers_struct.out.1 Iterations = 6 Final Relative Residual Norm = 2.055851e-05 # Output file: solvers_struct.out.2 Iterations = 16 Final Relative Residual Norm = 5.377654e-05 # Output file: solvers_struct.out.3 Iterations = 16 Final Relative Residual Norm = 3.718371e-05 # Output file: solvers_struct.out.4 Iterations = 16 Final Relative Residual Norm = 3.718370e-05 # Output file: solvers_struct.out.10.lobpcg Iterations = 3 Final Relative Residual Norm = 6.275833e-06 # Output file: solvers_struct.out.10.lobpcg.1 Eigenvalue lambda 1.84366509318352e-01 Residual 2.48082087637158e-05 # Output file: solvers_struct.out.10.lobpcg.3 Iteration 10 bsize 2 maxres 4.33511973824352e-04 Iteration 11 bsize 1 maxres 2.04666575882584e-04 Iteration 12 bsize 1 maxres 8.50733777042478e-05 Eigenvalue lambda 1.84366509318352e-01 Eigenvalue lambda 2.50882238149643e-01 Eigenvalue lambda 3.60091090202332e-01 Residual 7.41478434065357e-05 Residual 4.07401748816483e-05 Residual 8.50733777042478e-05 # Output file: solvers_struct.out.11.lobpcg Iterations = 6 Final Relative Residual Norm = 2.112819e-05 # Output file: solvers_struct.out.11.lobpcg.1 Eigenvalue lambda 1.84366583824158e-01 Residual 3.15948745992500e-05 # Output file: solvers_struct.out.11.lobpcg.3 Iteration 11 bsize 2 maxres 6.90118235070258e-04 Iteration 12 bsize 2 maxres 2.52081663347781e-04 Iteration 13 bsize 1 maxres 7.02887409715913e-05 Eigenvalue lambda 1.84366479516029e-01 Eigenvalue lambda 2.50883370637894e-01 Eigenvalue lambda 3.60090911388397e-01 Residual 5.58231040486135e-05 Residual 2.60377983067883e-05 Residual 7.02887409715913e-05 # Output file: solvers_struct.out.17.lobpcg Iterations = 17 Final Relative Residual Norm = 8.241194e-07 # Output file: solvers_struct.out.17.lobpcg.1 Eigenvalue lambda 1.84366509318352e-01 Residual 1.95705306396121e-05 # Output file: solvers_struct.out.17.lobpcg.3 Iteration 10 bsize 2 maxres 3.62064485670999e-04 Iteration 11 bsize 1 maxres 1.69921870110556e-04 Iteration 12 bsize 1 maxres 7.11168977431953e-05 Eigenvalue lambda 1.84366405010223e-01 Eigenvalue lambda 2.50881940126419e-01 Eigenvalue lambda 3.60090613365173e-01 Residual 5.52630408492405e-05 Residual 3.09487622871529e-05 Residual 7.11168977431953e-05 # Output file: solvers_struct.out.18.lobpcg Iterations = 32 Final Relative Residual Norm = 8.266953e-07 # Output file: solvers_struct.out.18.lobpcg.1 Eigenvalue lambda 1.84366241097450e-01 Residual 4.44491524831392e-05 # Output file: solvers_struct.out.18.lobpcg.3 Iteration 10 bsize 2 maxres 5.81342901568860e-04 Iteration 11 bsize 1 maxres 1.98838606593199e-04 Iteration 12 bsize 1 maxres 9.27079236134887e-05 Eigenvalue lambda 1.84366494417191e-01 Eigenvalue lambda 2.50879585742950e-01 Eigenvalue lambda 3.60090494155884e-01 Residual 9.27079236134887e-05 Residual 8.72101882123388e-05 Residual 5.49681753909681e-05 # Output file: solvers_struct.out.19.lobpcg Iterations = 25 Final Relative Residual Norm = 7.712439e-05 # Output file: solvers_struct.out.19.lobpcg.1 Eigenvalue lambda 1.84366539120674e-01 Residual 4.44510842498858e-05 # Output file: solvers_struct.out.19.lobpcg.3 Iteration 10 bsize 2 maxres 5.81450236495584e-04 Iteration 11 bsize 1 maxres 1.98705645743757e-04 Iteration 12 bsize 1 maxres 9.26581269595772e-05 Eigenvalue lambda 1.84366509318352e-01 Eigenvalue lambda 2.50874906778336e-01 Eigenvalue lambda 3.60090017318726e-01 Residual 9.26581269595772e-05 Residual 8.80578954820521e-05 Residual 5.49828182556666e-05 hypre-2.33.0/src/test/TEST_single/solvers_struct.sh000077500000000000000000000033761477326011500222730ustar00rootroot00000000000000#!/bin/bash # Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) TNAME=`basename $0 .sh` CONVTOL=$1 # Set default check tolerance if [ x$CONVTOL = "x" ]; then CONVTOL=0.0 fi #echo "tol = $CONVTOL" #============================================================================= # compare with baseline case #============================================================================= FILES="\ ${TNAME}.out.0\ ${TNAME}.out.1\ ${TNAME}.out.2\ ${TNAME}.out.3\ ${TNAME}.out.4\ " for i in $FILES do echo "# Output file: $i" tail -3 $i done > ${TNAME}.out.a # Make sure that the output file is reasonable RUNCOUNT=`echo $FILES | wc -w` OUTCOUNT=`grep "Iterations" ${TNAME}.out.a | wc -l` if [ "$OUTCOUNT" != "$RUNCOUNT" ]; then echo "Incorrect number of runs in ${TNAME}.out" >&2 fi FILES="\ ${TNAME}.out.10.lobpcg\ ${TNAME}.out.11.lobpcg\ ${TNAME}.out.17.lobpcg\ ${TNAME}.out.18.lobpcg\ ${TNAME}.out.19.lobpcg\ " for i in $FILES do echo "# Output file: $i" tail -3 $i echo "# Output file: $i.1" tail -13 $i.1 | head -3 echo "# Output file: $i.3" tail -21 $i.3 | head -11 done > ${TNAME}.out.b # Make sure that the output file is reasonable RUNCOUNT=`echo $FILES | wc -w` OUTCOUNT=`grep "Iterations" ${TNAME}.out.b | wc -l` if [ "$OUTCOUNT" != "$RUNCOUNT" ]; then echo "Incorrect number of runs in ${TNAME}.out" >&2 fi # put all of the output files together cat ${TNAME}.out.[a-z] > ${TNAME}.out #============================================================================= # remove temporary files #============================================================================= # rm -f ${TNAME}.testdata* hypre-2.33.0/src/test/TEST_sstruct/000077500000000000000000000000001477326011500170505ustar00rootroot00000000000000hypre-2.33.0/src/test/TEST_sstruct/.psrc000066400000000000000000000002131477326011500200140ustar00rootroot00000000000000insure++.report_file insure.log insure++.report_overwrite false insure++.summarize leaks outstanding insure++.suppress EXPR_NULL,PARM_NULL hypre-2.33.0/src/test/TEST_sstruct/addtovalues.jobs000077500000000000000000000023101477326011500222410ustar00rootroot00000000000000# Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) #============================================================================= # runs same solver for a direct setup of a matrix and an addtovalue setup # of the same matrix #============================================================================= mpirun -np 1 ./sstruct -in sstruct.in.addtoval_cellcentre -solver 11 \ > addtovalues.out.0 mpirun -np 1 ./sstruct -in sstruct.in.noaddtoval_cellcentre -solver 11 \ > addtovalues.out.1 mpirun -np 1 ./sstruct -in sstruct.in.addtoval_edges -solver 20 \ > addtovalues.out.2 mpirun -np 1 ./sstruct -in sstruct.in.noaddtoval_edges -solver 20 \ > addtovalues.out.3 mpirun -np 2 ./sstruct -in sstruct.in.addtoval_cellcentre -P 2 1 1 -solver 11 \ > addtovalues.out.4 mpirun -np 2 ./sstruct -in sstruct.in.noaddtoval_cellcentre -P 2 1 1 -solver 11 \ > addtovalues.out.5 mpirun -np 2 ./sstruct -in sstruct.in.addtoval_edges -P 2 1 1 -solver 20 \ > addtovalues.out.6 mpirun -np 2 ./sstruct -in sstruct.in.noaddtoval_edges -P 2 1 1 -solver 20 \ > addtovalues.out.7 hypre-2.33.0/src/test/TEST_sstruct/addtovalues.saved000066400000000000000000000013561477326011500224140ustar00rootroot00000000000000# Output file: addtovalues.out.0 Iterations = 9 Final Relative Residual Norm = 7.226958e-07 # Output file: addtovalues.out.1 Iterations = 9 Final Relative Residual Norm = 7.226958e-07 # Output file: addtovalues.out.2 Iterations = 34 Final Relative Residual Norm = 5.437407e-07 # Output file: addtovalues.out.3 Iterations = 34 Final Relative Residual Norm = 5.437407e-07 # Output file: addtovalues.out.4 Iterations = 11 Final Relative Residual Norm = 9.051371e-07 # Output file: addtovalues.out.5 Iterations = 11 Final Relative Residual Norm = 9.051371e-07 # Output file: addtovalues.out.6 Iterations = 44 Final Relative Residual Norm = 8.778287e-07 # Output file: addtovalues.out.7 Iterations = 44 Final Relative Residual Norm = 8.778287e-07 hypre-2.33.0/src/test/TEST_sstruct/addtovalues.saved.lassen000066400000000000000000000013561477326011500237000ustar00rootroot00000000000000# Output file: addtovalues.out.0 Iterations = 9 Final Relative Residual Norm = 7.226958e-07 # Output file: addtovalues.out.1 Iterations = 9 Final Relative Residual Norm = 7.226958e-07 # Output file: addtovalues.out.2 Iterations = 83 Final Relative Residual Norm = 9.421346e-07 # Output file: addtovalues.out.3 Iterations = 83 Final Relative Residual Norm = 9.421346e-07 # Output file: addtovalues.out.4 Iterations = 11 Final Relative Residual Norm = 9.051371e-07 # Output file: addtovalues.out.5 Iterations = 11 Final Relative Residual Norm = 9.051371e-07 # Output file: addtovalues.out.6 Iterations = 92 Final Relative Residual Norm = 8.697370e-07 # Output file: addtovalues.out.7 Iterations = 92 Final Relative Residual Norm = 8.697370e-07 hypre-2.33.0/src/test/TEST_sstruct/addtovalues.saved.lassen_cpu000066400000000000000000000013561477326011500245470ustar00rootroot00000000000000# Output file: addtovalues.out.0 Iterations = 9 Final Relative Residual Norm = 7.226958e-07 # Output file: addtovalues.out.1 Iterations = 9 Final Relative Residual Norm = 7.226958e-07 # Output file: addtovalues.out.2 Iterations = 34 Final Relative Residual Norm = 5.437407e-07 # Output file: addtovalues.out.3 Iterations = 34 Final Relative Residual Norm = 5.437407e-07 # Output file: addtovalues.out.4 Iterations = 11 Final Relative Residual Norm = 9.051371e-07 # Output file: addtovalues.out.5 Iterations = 11 Final Relative Residual Norm = 9.051371e-07 # Output file: addtovalues.out.6 Iterations = 44 Final Relative Residual Norm = 8.778287e-07 # Output file: addtovalues.out.7 Iterations = 44 Final Relative Residual Norm = 8.778287e-07 hypre-2.33.0/src/test/TEST_sstruct/addtovalues.sh000077500000000000000000000042711477326011500217260ustar00rootroot00000000000000#!/bin/bash # Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) TNAME=`basename $0 .sh` RTOL=$1 ATOL=$2 #============================================================================= # sstruct: Test addtovalue routine. Compares the solutions obtained using # different formations of the matrix- one with setvalues and the other with # addtovalues #============================================================================= tail -3 ${TNAME}.out.0 > ${TNAME}.testdata tail -3 ${TNAME}.out.1 > ${TNAME}.testdata.temp diff ${TNAME}.testdata ${TNAME}.testdata.temp >&2 #============================================================================= tail -3 ${TNAME}.out.2 > ${TNAME}.testdata tail -3 ${TNAME}.out.3 > ${TNAME}.testdata.temp diff ${TNAME}.testdata ${TNAME}.testdata.temp >&2 #============================================================================= tail -3 ${TNAME}.out.4 > ${TNAME}.testdata tail -3 ${TNAME}.out.5 > ${TNAME}.testdata.temp diff ${TNAME}.testdata ${TNAME}.testdata.temp >&2 #============================================================================= tail -3 ${TNAME}.out.6 > ${TNAME}.testdata tail -3 ${TNAME}.out.7 > ${TNAME}.testdata.temp diff ${TNAME}.testdata ${TNAME}.testdata.temp >&2 #============================================================================= # compare with baseline case #============================================================================= FILES="\ ${TNAME}.out.0\ ${TNAME}.out.1\ ${TNAME}.out.2\ ${TNAME}.out.3\ ${TNAME}.out.4\ ${TNAME}.out.5\ ${TNAME}.out.6\ ${TNAME}.out.7\ " for i in $FILES do echo "# Output file: $i" tail -3 $i done > ${TNAME}.out # Make sure that the output file is reasonable RUNCOUNT=`echo $FILES | wc -w` OUTCOUNT=`grep "Iterations" ${TNAME}.out | wc -l` if [ "$OUTCOUNT" != "$RUNCOUNT" ]; then echo "Incorrect number of runs in ${TNAME}.out" >&2 fi #============================================================================= # remove temporary files #============================================================================= rm -f ${TNAME}.testdata* hypre-2.33.0/src/test/TEST_sstruct/amr2d.jobs000077500000000000000000000027461477326011500207500ustar00rootroot00000000000000#!/bin/bash # Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) #============================================================================= #============================================================================= mpirun -np 1 ./sstruct -in sstruct.in.amr.2Db -solver 18 -r 2 1 1 \ > amr2d.out.0 mpirun -np 2 ./sstruct -in sstruct.in.amr.2Db -solver 18 -P 2 1 1 \ > amr2d.out.1 mpirun -np 1 ./sstruct -in sstruct.in.amr.2Db -solver 20 -r 2 1 1 \ > amr2d.out.2 mpirun -np 2 ./sstruct -in sstruct.in.amr.2Db -solver 20 -P 2 1 1 \ > amr2d.out.3 mpirun -np 1 ./sstruct -in sstruct.in.amr.2Dc -solver 18 -r 2 1 1 \ > amr2d.out.4 mpirun -np 2 ./sstruct -in sstruct.in.amr.2Dc -solver 18 -P 2 1 1 \ > amr2d.out.5 mpirun -np 1 ./sstruct -in sstruct.in.amr.2Dc -solver 20 -r 2 1 1 \ > amr2d.out.6 mpirun -np 2 ./sstruct -in sstruct.in.amr.2Dc -solver 20 -P 2 1 1 \ > amr2d.out.7 mpirun -np 6 ./sstruct -in sstruct.in.amr.2De -solver 18 -P 6 1 1 \ > amr2d.out.8 mpirun -np 1 ./sstruct -in sstruct.in.amr.graphadd -solver 20 -r 2 1 1 \ > amr2d.out.10 mpirun -np 2 ./sstruct -in sstruct.in.amr.graphadd -solver 20 -P 2 1 1 \ > amr2d.out.11 mpirun -np 1 ./sstruct -in sstruct.in.amr.graphadd -solver 28 -r 1 2 1 -pooldist 0 \ > amr2d.out.12 mpirun -np 4 ./sstruct -in sstruct.in.amr.graphadd -solver 28 -P 1 2 1 -pooldist 1 \ > amr2d.out.13 hypre-2.33.0/src/test/TEST_sstruct/amr2d.saved000066400000000000000000000021661477326011500211060ustar00rootroot00000000000000# Output file: amr2d.out.0 Iterations = 19 Final Relative Residual Norm = 8.188904e-07 # Output file: amr2d.out.1 Iterations = 19 Final Relative Residual Norm = 8.188904e-07 # Output file: amr2d.out.2 Iterations = 5 Final Relative Residual Norm = 1.746768e-07 # Output file: amr2d.out.3 Iterations = 5 Final Relative Residual Norm = 3.155589e-07 # Output file: amr2d.out.4 Iterations = 20 Final Relative Residual Norm = 8.510163e-07 # Output file: amr2d.out.5 Iterations = 20 Final Relative Residual Norm = 8.510163e-07 # Output file: amr2d.out.6 Iterations = 5 Final Relative Residual Norm = 1.646222e-07 # Output file: amr2d.out.7 Iterations = 5 Final Relative Residual Norm = 4.675292e-07 # Output file: amr2d.out.8 Iterations = 21 Final Relative Residual Norm = 5.392338e-07 # Output file: amr2d.out.10 Iterations = 6 Final Relative Residual Norm = 6.135506e-07 # Output file: amr2d.out.11 Iterations = 6 Final Relative Residual Norm = 1.744213e-07 # Output file: amr2d.out.12 Iterations = 18 Final Relative Residual Norm = 5.252407e-07 # Output file: amr2d.out.13 Iterations = 18 Final Relative Residual Norm = 5.252407e-07 hypre-2.33.0/src/test/TEST_sstruct/amr2d.saved.lassen000066400000000000000000000021661477326011500223720ustar00rootroot00000000000000# Output file: amr2d.out.0 Iterations = 19 Final Relative Residual Norm = 8.188904e-07 # Output file: amr2d.out.1 Iterations = 19 Final Relative Residual Norm = 8.188904e-07 # Output file: amr2d.out.2 Iterations = 7 Final Relative Residual Norm = 2.345061e-07 # Output file: amr2d.out.3 Iterations = 7 Final Relative Residual Norm = 4.180192e-07 # Output file: amr2d.out.4 Iterations = 20 Final Relative Residual Norm = 8.510163e-07 # Output file: amr2d.out.5 Iterations = 20 Final Relative Residual Norm = 8.510163e-07 # Output file: amr2d.out.6 Iterations = 7 Final Relative Residual Norm = 4.464926e-07 # Output file: amr2d.out.7 Iterations = 7 Final Relative Residual Norm = 5.993784e-07 # Output file: amr2d.out.8 Iterations = 21 Final Relative Residual Norm = 5.392338e-07 # Output file: amr2d.out.10 Iterations = 8 Final Relative Residual Norm = 6.330324e-07 # Output file: amr2d.out.11 Iterations = 8 Final Relative Residual Norm = 2.085852e-07 # Output file: amr2d.out.12 Iterations = 18 Final Relative Residual Norm = 5.252407e-07 # Output file: amr2d.out.13 Iterations = 18 Final Relative Residual Norm = 5.252407e-07 hypre-2.33.0/src/test/TEST_sstruct/amr2d.saved.lassen_cpu000066400000000000000000000021661477326011500232410ustar00rootroot00000000000000# Output file: amr2d.out.0 Iterations = 19 Final Relative Residual Norm = 8.188904e-07 # Output file: amr2d.out.1 Iterations = 19 Final Relative Residual Norm = 8.188904e-07 # Output file: amr2d.out.2 Iterations = 5 Final Relative Residual Norm = 1.746768e-07 # Output file: amr2d.out.3 Iterations = 5 Final Relative Residual Norm = 3.155589e-07 # Output file: amr2d.out.4 Iterations = 20 Final Relative Residual Norm = 8.510163e-07 # Output file: amr2d.out.5 Iterations = 20 Final Relative Residual Norm = 8.510163e-07 # Output file: amr2d.out.6 Iterations = 5 Final Relative Residual Norm = 1.646222e-07 # Output file: amr2d.out.7 Iterations = 5 Final Relative Residual Norm = 4.675292e-07 # Output file: amr2d.out.8 Iterations = 21 Final Relative Residual Norm = 5.392338e-07 # Output file: amr2d.out.10 Iterations = 6 Final Relative Residual Norm = 6.135506e-07 # Output file: amr2d.out.11 Iterations = 6 Final Relative Residual Norm = 1.744213e-07 # Output file: amr2d.out.12 Iterations = 18 Final Relative Residual Norm = 5.252407e-07 # Output file: amr2d.out.13 Iterations = 18 Final Relative Residual Norm = 5.252407e-07 hypre-2.33.0/src/test/TEST_sstruct/amr2d.sh000077500000000000000000000027261477326011500204230ustar00rootroot00000000000000#!/bin/bash # Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) TNAME=`basename $0 .sh` RTOL=$1 ATOL=$2 #============================================================================= #============================================================================= tail -3 ${TNAME}.out.12 > ${TNAME}.testdata tail -3 ${TNAME}.out.13 > ${TNAME}.testdata.temp diff ${TNAME}.testdata ${TNAME}.testdata.temp >&2 #============================================================================= # compare with baseline case #============================================================================= FILES="\ ${TNAME}.out.0\ ${TNAME}.out.1\ ${TNAME}.out.2\ ${TNAME}.out.3\ ${TNAME}.out.4\ ${TNAME}.out.5\ ${TNAME}.out.6\ ${TNAME}.out.7\ ${TNAME}.out.8\ ${TNAME}.out.10\ ${TNAME}.out.11\ ${TNAME}.out.12\ ${TNAME}.out.13\ " for i in $FILES do echo "# Output file: $i" tail -3 $i done > ${TNAME}.out # Make sure that the output file is reasonable RUNCOUNT=`echo $FILES | wc -w` OUTCOUNT=`grep "Iterations" ${TNAME}.out | wc -l` if [ "$OUTCOUNT" != "$RUNCOUNT" ]; then echo "Incorrect number of runs in ${TNAME}.out" >&2 fi #============================================================================= # remove temporary files #============================================================================= rm -f ${TNAME}.testdata* hypre-2.33.0/src/test/TEST_sstruct/cube.jobs000077500000000000000000000007471477326011500206600ustar00rootroot00000000000000#!/bin/bash # Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) mpirun -np 1 ./sstruct -in sstruct.in.cube -r 10 10 10 -rhsone -solver 28 \ > cube.out.0 mpirun -np 1 ./sstruct -in sstruct.in.bcube -r 10 10 10 -rhsone -solver 28 \ > cube.out.1 mpirun -np 2 ./sstruct -in sstruct.in.pcube -r 10 10 10 -rhsone -solver 28 \ > cube.out.2 hypre-2.33.0/src/test/TEST_sstruct/cube.saved000066400000000000000000000004051477326011500210110ustar00rootroot00000000000000# Output file: cube.out.0 Iterations = 41 Final Relative Residual Norm = 8.606818e-07 # Output file: cube.out.1 Iterations = 41 Final Relative Residual Norm = 8.606818e-07 # Output file: cube.out.2 Iterations = 41 Final Relative Residual Norm = 8.606818e-07 hypre-2.33.0/src/test/TEST_sstruct/cube.saved.lassen000066400000000000000000000004051477326011500222750ustar00rootroot00000000000000# Output file: cube.out.0 Iterations = 41 Final Relative Residual Norm = 8.606818e-07 # Output file: cube.out.1 Iterations = 41 Final Relative Residual Norm = 8.606818e-07 # Output file: cube.out.2 Iterations = 41 Final Relative Residual Norm = 8.606818e-07 hypre-2.33.0/src/test/TEST_sstruct/cube.saved.lassen_cpu000066400000000000000000000004051477326011500231440ustar00rootroot00000000000000# Output file: cube.out.0 Iterations = 41 Final Relative Residual Norm = 8.606818e-07 # Output file: cube.out.1 Iterations = 41 Final Relative Residual Norm = 8.606818e-07 # Output file: cube.out.2 Iterations = 41 Final Relative Residual Norm = 8.606818e-07 hypre-2.33.0/src/test/TEST_sstruct/cube.sh000077500000000000000000000032311477326011500203240ustar00rootroot00000000000000#!/bin/bash # Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) TNAME=`basename $0 .sh` RTOL=$1 ATOL=$2 #============================================================================= # sstruct: Test SetNeighborBox by comparing one-part problem # against equivalent multi-part problems #============================================================================= tail -3 ${TNAME}.out.0 > ${TNAME}.testdata #============================================================================= tail -3 ${TNAME}.out.1 > ${TNAME}.testdata.temp diff ${TNAME}.testdata ${TNAME}.testdata.temp >&2 #============================================================================= tail -3 ${TNAME}.out.2 > ${TNAME}.testdata.temp diff ${TNAME}.testdata ${TNAME}.testdata.temp >&2 #============================================================================= # compare with baseline case #============================================================================= FILES="\ ${TNAME}.out.0\ ${TNAME}.out.1\ ${TNAME}.out.2\ " for i in $FILES do echo "# Output file: $i" tail -3 $i done > ${TNAME}.out # Make sure that the output file is reasonable RUNCOUNT=`echo $FILES | wc -w` OUTCOUNT=`grep "Iterations" ${TNAME}.out | wc -l` if [ "$OUTCOUNT" != "$RUNCOUNT" ]; then echo "Incorrect number of runs in ${TNAME}.out" >&2 fi #============================================================================= # remove temporary files #============================================================================= rm -f ${TNAME}.testdata* hypre-2.33.0/src/test/TEST_sstruct/cycred.jobs000077500000000000000000000106151477326011500212060ustar00rootroot00000000000000#!/bin/bash # Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) #============================================================================= # 3D #============================================================================= # These should all give final residuals of 0 mpirun -np 1 ./sstruct -in sstruct.in.cycred-3Dx -solver 205 -crtdim 0 -cri 0 0 0 -crs 1 1 1 -r 3 3 3 -P 1 1 1 > cycred.out.3Dx.1 mpirun -np 5 ./sstruct -in sstruct.in.cycred-3Dx -solver 205 -crtdim 0 -cri 0 0 0 -crs 1 1 1 -r 1 5 5 -P 5 1 1 > cycred.out.3Dx.2 mpirun -np 8 ./sstruct -in sstruct.in.cycred-3Dx -solver 205 -crtdim 0 -cri 0 0 0 -crs 1 1 1 -r 2 2 2 -P 2 2 2 > cycred.out.3Dx.3 mpirun -np 1 ./sstruct -in sstruct.in.cycred-3Dy -solver 205 -crtdim 1 -cri 0 0 0 -crs 1 1 1 -r 3 3 3 -P 1 1 1 > cycred.out.3Dy.1 mpirun -np 5 ./sstruct -in sstruct.in.cycred-3Dy -solver 205 -crtdim 1 -cri 0 0 0 -crs 1 1 1 -r 5 1 5 -P 1 5 1 > cycred.out.3Dy.2 mpirun -np 8 ./sstruct -in sstruct.in.cycred-3Dy -solver 205 -crtdim 1 -cri 0 0 0 -crs 1 1 1 -r 2 2 2 -P 2 2 2 > cycred.out.3Dy.3 mpirun -np 1 ./sstruct -in sstruct.in.cycred-3Dz -solver 205 -crtdim 2 -cri 0 0 0 -crs 1 1 1 -r 3 3 3 -P 1 1 1 > cycred.out.3Dz.1 mpirun -np 5 ./sstruct -in sstruct.in.cycred-3Dz -solver 205 -crtdim 2 -cri 0 0 0 -crs 1 1 1 -r 5 5 1 -P 1 1 5 > cycred.out.3Dz.2 mpirun -np 8 ./sstruct -in sstruct.in.cycred-3Dz -solver 205 -crtdim 2 -cri 0 0 0 -crs 1 1 1 -r 2 2 2 -P 2 2 2 > cycred.out.3Dz.3 # These should all give the same nonzero final residuals mpirun -np 1 ./sstruct -in sstruct.in.cycred-3Dx -solver 205 -crtdim 0 -cri 0 0 1 -crs 1 1 3 -r 4 4 4 -P 1 1 1 > cycred.out.3Dx.5 mpirun -np 4 ./sstruct -in sstruct.in.cycred-3Dx -solver 205 -crtdim 0 -cri 0 1 0 -crs 1 3 1 -r 1 4 4 -P 4 1 1 > cycred.out.3Dx.6 mpirun -np 1 ./sstruct -in sstruct.in.cycred-3Dy -solver 205 -crtdim 1 -cri 0 0 1 -crs 1 1 3 -r 4 4 4 -P 1 1 1 > cycred.out.3Dy.5 mpirun -np 4 ./sstruct -in sstruct.in.cycred-3Dy -solver 205 -crtdim 1 -cri 1 0 0 -crs 3 1 1 -r 4 1 4 -P 1 4 1 > cycred.out.3Dy.6 mpirun -np 1 ./sstruct -in sstruct.in.cycred-3Dz -solver 205 -crtdim 2 -cri 0 1 0 -crs 1 3 1 -r 4 4 4 -P 1 1 1 > cycred.out.3Dz.5 mpirun -np 4 ./sstruct -in sstruct.in.cycred-3Dz -solver 205 -crtdim 2 -cri 1 0 0 -crs 3 1 1 -r 4 4 1 -P 1 1 4 > cycred.out.3Dz.6 #============================================================================= # 2D #============================================================================= # These should all give final residuals of 0 mpirun -np 1 ./sstruct -in sstruct.in.cycred-2Dx -solver 205 -crtdim 0 -cri 0 0 0 -crs 1 1 1 -r 3 3 1 -P 1 1 1 > cycred.out.2Dx.1 mpirun -np 5 ./sstruct -in sstruct.in.cycred-2Dx -solver 205 -crtdim 0 -cri 0 0 0 -crs 1 1 1 -r 1 5 1 -P 5 1 1 > cycred.out.2Dx.2 mpirun -np 4 ./sstruct -in sstruct.in.cycred-2Dx -solver 205 -crtdim 0 -cri 0 0 0 -crs 1 1 1 -r 2 2 1 -P 2 2 1 > cycred.out.2Dx.3 mpirun -np 1 ./sstruct -in sstruct.in.cycred-2Dy -solver 205 -crtdim 1 -cri 0 0 0 -crs 1 1 1 -r 3 3 1 -P 1 1 1 > cycred.out.2Dy.1 mpirun -np 5 ./sstruct -in sstruct.in.cycred-2Dy -solver 205 -crtdim 1 -cri 0 0 0 -crs 1 1 1 -r 5 1 1 -P 1 5 1 > cycred.out.2Dy.2 mpirun -np 4 ./sstruct -in sstruct.in.cycred-2Dy -solver 205 -crtdim 1 -cri 0 0 0 -crs 1 1 1 -r 2 2 1 -P 2 2 1 > cycred.out.2Dy.3 # These should all give the same nonzero final residuals mpirun -np 1 ./sstruct -in sstruct.in.cycred-2Dx -solver 205 -crtdim 0 -cri 0 1 0 -crs 1 3 1 -r 4 4 1 -P 1 1 1 > cycred.out.2Dx.5 mpirun -np 4 ./sstruct -in sstruct.in.cycred-2Dx -solver 205 -crtdim 0 -cri 0 1 0 -crs 1 3 1 -r 1 4 1 -P 4 1 1 > cycred.out.2Dx.6 mpirun -np 1 ./sstruct -in sstruct.in.cycred-2Dy -solver 205 -crtdim 1 -cri 1 0 0 -crs 3 1 1 -r 4 4 1 -P 1 1 1 > cycred.out.2Dy.5 mpirun -np 4 ./sstruct -in sstruct.in.cycred-2Dy -solver 205 -crtdim 1 -cri 1 0 0 -crs 3 1 1 -r 4 1 1 -P 1 4 1 > cycred.out.2Dy.6 #============================================================================= # 1D #============================================================================= # These should all give final residuals of 0 mpirun -np 1 ./sstruct -in sstruct.in.cycred-1Dx -solver 205 -crtdim 0 -cri 0 0 0 -crs 1 1 1 -r 3 1 1 -P 1 1 1 > cycred.out.1Dx.1 mpirun -np 5 ./sstruct -in sstruct.in.cycred-1Dx -solver 205 -crtdim 0 -cri 0 0 0 -crs 1 1 1 -r 1 1 1 -P 5 1 1 > cycred.out.1Dx.2 hypre-2.33.0/src/test/TEST_sstruct/cycred.saved000066400000000000000000000040371477326011500213510ustar00rootroot00000000000000# Output file: cycred.out.3Dx.1 Final Relative Residual Norm = 0.000000e+00 # Output file: cycred.out.3Dx.2 Final Relative Residual Norm = 0.000000e+00 # Output file: cycred.out.3Dx.3 Final Relative Residual Norm = 0.000000e+00 # Output file: cycred.out.3Dy.1 Final Relative Residual Norm = 0.000000e+00 # Output file: cycred.out.3Dy.2 Final Relative Residual Norm = 0.000000e+00 # Output file: cycred.out.3Dy.3 Final Relative Residual Norm = 0.000000e+00 # Output file: cycred.out.3Dz.1 Final Relative Residual Norm = 0.000000e+00 # Output file: cycred.out.3Dz.2 Final Relative Residual Norm = 0.000000e+00 # Output file: cycred.out.3Dz.3 Final Relative Residual Norm = 0.000000e+00 # Output file: cycred.out.2Dx.1 Final Relative Residual Norm = 0.000000e+00 # Output file: cycred.out.2Dx.2 Final Relative Residual Norm = 0.000000e+00 # Output file: cycred.out.2Dx.3 Final Relative Residual Norm = 0.000000e+00 # Output file: cycred.out.2Dy.1 Final Relative Residual Norm = 0.000000e+00 # Output file: cycred.out.2Dy.2 Final Relative Residual Norm = 0.000000e+00 # Output file: cycred.out.2Dy.3 Final Relative Residual Norm = 0.000000e+00 # Output file: cycred.out.1Dx.1 Final Relative Residual Norm = 0.000000e+00 # Output file: cycred.out.1Dx.2 Final Relative Residual Norm = 0.000000e+00 # Output file: cycred.out.3Dx.5 Final Relative Residual Norm = 3.200000e+02 # Output file: cycred.out.3Dx.6 Final Relative Residual Norm = 3.200000e+02 # Output file: cycred.out.3Dy.5 Final Relative Residual Norm = 3.200000e+02 # Output file: cycred.out.3Dy.6 Final Relative Residual Norm = 3.200000e+02 # Output file: cycred.out.3Dz.5 Final Relative Residual Norm = 3.200000e+02 # Output file: cycred.out.3Dz.6 Final Relative Residual Norm = 3.200000e+02 # Output file: cycred.out.2Dx.5 Final Relative Residual Norm = 2.000000e+01 # Output file: cycred.out.2Dx.6 Final Relative Residual Norm = 2.000000e+01 # Output file: cycred.out.2Dy.5 Final Relative Residual Norm = 2.000000e+01 # Output file: cycred.out.2Dy.6 Final Relative Residual Norm = 2.000000e+01 hypre-2.33.0/src/test/TEST_sstruct/cycred.saved.lassen000066400000000000000000000040371477326011500226350ustar00rootroot00000000000000# Output file: cycred.out.3Dx.1 Final Relative Residual Norm = 0.000000e+00 # Output file: cycred.out.3Dx.2 Final Relative Residual Norm = 0.000000e+00 # Output file: cycred.out.3Dx.3 Final Relative Residual Norm = 0.000000e+00 # Output file: cycred.out.3Dy.1 Final Relative Residual Norm = 0.000000e+00 # Output file: cycred.out.3Dy.2 Final Relative Residual Norm = 0.000000e+00 # Output file: cycred.out.3Dy.3 Final Relative Residual Norm = 0.000000e+00 # Output file: cycred.out.3Dz.1 Final Relative Residual Norm = 0.000000e+00 # Output file: cycred.out.3Dz.2 Final Relative Residual Norm = 0.000000e+00 # Output file: cycred.out.3Dz.3 Final Relative Residual Norm = 0.000000e+00 # Output file: cycred.out.2Dx.1 Final Relative Residual Norm = 0.000000e+00 # Output file: cycred.out.2Dx.2 Final Relative Residual Norm = 0.000000e+00 # Output file: cycred.out.2Dx.3 Final Relative Residual Norm = 0.000000e+00 # Output file: cycred.out.2Dy.1 Final Relative Residual Norm = 0.000000e+00 # Output file: cycred.out.2Dy.2 Final Relative Residual Norm = 0.000000e+00 # Output file: cycred.out.2Dy.3 Final Relative Residual Norm = 0.000000e+00 # Output file: cycred.out.1Dx.1 Final Relative Residual Norm = 0.000000e+00 # Output file: cycred.out.1Dx.2 Final Relative Residual Norm = 0.000000e+00 # Output file: cycred.out.3Dx.5 Final Relative Residual Norm = 3.200000e+02 # Output file: cycred.out.3Dx.6 Final Relative Residual Norm = 3.200000e+02 # Output file: cycred.out.3Dy.5 Final Relative Residual Norm = 3.200000e+02 # Output file: cycred.out.3Dy.6 Final Relative Residual Norm = 3.200000e+02 # Output file: cycred.out.3Dz.5 Final Relative Residual Norm = 3.200000e+02 # Output file: cycred.out.3Dz.6 Final Relative Residual Norm = 3.200000e+02 # Output file: cycred.out.2Dx.5 Final Relative Residual Norm = 2.000000e+01 # Output file: cycred.out.2Dx.6 Final Relative Residual Norm = 2.000000e+01 # Output file: cycred.out.2Dy.5 Final Relative Residual Norm = 2.000000e+01 # Output file: cycred.out.2Dy.6 Final Relative Residual Norm = 2.000000e+01 hypre-2.33.0/src/test/TEST_sstruct/cycred.saved.lassen_cpu000066400000000000000000000040371477326011500235040ustar00rootroot00000000000000# Output file: cycred.out.3Dx.1 Final Relative Residual Norm = 0.000000e+00 # Output file: cycred.out.3Dx.2 Final Relative Residual Norm = 0.000000e+00 # Output file: cycred.out.3Dx.3 Final Relative Residual Norm = 0.000000e+00 # Output file: cycred.out.3Dy.1 Final Relative Residual Norm = 0.000000e+00 # Output file: cycred.out.3Dy.2 Final Relative Residual Norm = 0.000000e+00 # Output file: cycred.out.3Dy.3 Final Relative Residual Norm = 0.000000e+00 # Output file: cycred.out.3Dz.1 Final Relative Residual Norm = 0.000000e+00 # Output file: cycred.out.3Dz.2 Final Relative Residual Norm = 0.000000e+00 # Output file: cycred.out.3Dz.3 Final Relative Residual Norm = 0.000000e+00 # Output file: cycred.out.2Dx.1 Final Relative Residual Norm = 0.000000e+00 # Output file: cycred.out.2Dx.2 Final Relative Residual Norm = 0.000000e+00 # Output file: cycred.out.2Dx.3 Final Relative Residual Norm = 0.000000e+00 # Output file: cycred.out.2Dy.1 Final Relative Residual Norm = 0.000000e+00 # Output file: cycred.out.2Dy.2 Final Relative Residual Norm = 0.000000e+00 # Output file: cycred.out.2Dy.3 Final Relative Residual Norm = 0.000000e+00 # Output file: cycred.out.1Dx.1 Final Relative Residual Norm = 0.000000e+00 # Output file: cycred.out.1Dx.2 Final Relative Residual Norm = 0.000000e+00 # Output file: cycred.out.3Dx.5 Final Relative Residual Norm = 3.200000e+02 # Output file: cycred.out.3Dx.6 Final Relative Residual Norm = 3.200000e+02 # Output file: cycred.out.3Dy.5 Final Relative Residual Norm = 3.200000e+02 # Output file: cycred.out.3Dy.6 Final Relative Residual Norm = 3.200000e+02 # Output file: cycred.out.3Dz.5 Final Relative Residual Norm = 3.200000e+02 # Output file: cycred.out.3Dz.6 Final Relative Residual Norm = 3.200000e+02 # Output file: cycred.out.2Dx.5 Final Relative Residual Norm = 2.000000e+01 # Output file: cycred.out.2Dx.6 Final Relative Residual Norm = 2.000000e+01 # Output file: cycred.out.2Dy.5 Final Relative Residual Norm = 2.000000e+01 # Output file: cycred.out.2Dy.6 Final Relative Residual Norm = 2.000000e+01 hypre-2.33.0/src/test/TEST_sstruct/cycred.sh000077500000000000000000000052541477326011500206660ustar00rootroot00000000000000#!/bin/bash # Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) TNAME=`basename $0 .sh` RTOL=$1 ATOL=$2 #============================================================================= #============================================================================= FILES3D0="\ ${TNAME}.out.3Dx.1\ ${TNAME}.out.3Dx.2\ ${TNAME}.out.3Dx.3\ ${TNAME}.out.3Dy.1\ ${TNAME}.out.3Dy.2\ ${TNAME}.out.3Dy.3\ ${TNAME}.out.3Dz.1\ ${TNAME}.out.3Dz.2\ ${TNAME}.out.3Dz.3\ " FILES3D="\ ${TNAME}.out.3Dx.5\ ${TNAME}.out.3Dx.6\ ${TNAME}.out.3Dy.5\ ${TNAME}.out.3Dy.6\ ${TNAME}.out.3Dz.5\ ${TNAME}.out.3Dz.6\ " FILES2D0="\ ${TNAME}.out.2Dx.1\ ${TNAME}.out.2Dx.2\ ${TNAME}.out.2Dx.3\ ${TNAME}.out.2Dy.1\ ${TNAME}.out.2Dy.2\ ${TNAME}.out.2Dy.3\ " FILES2D="\ ${TNAME}.out.2Dx.5\ ${TNAME}.out.2Dx.6\ ${TNAME}.out.2Dy.5\ ${TNAME}.out.2Dy.6\ " FILES1D0="\ ${TNAME}.out.1Dx.1\ ${TNAME}.out.1Dx.2\ " #============================================================================= # Check that the zero residual files are all zero #============================================================================= tail -2 ${TNAME}.out.3Dx.1 > ${TNAME}.testdata for i in $FILES3D0 $FILES2D0 $FILES1D0 do tail -2 $i > ${TNAME}.testdata.temp diff ${TNAME}.testdata ${TNAME}.testdata.temp >&2 done #============================================================================= # Check that the nonzero residual files are all the same #============================================================================= tail -2 ${TNAME}.out.3Dx.5 > ${TNAME}.testdata for i in $FILES3D do tail -2 $i > ${TNAME}.testdata.temp diff ${TNAME}.testdata ${TNAME}.testdata.temp >&2 done tail -2 ${TNAME}.out.2Dx.5 > ${TNAME}.testdata for i in $FILES2D do tail -2 $i > ${TNAME}.testdata.temp diff ${TNAME}.testdata ${TNAME}.testdata.temp >&2 done #============================================================================= # compare with baseline case #============================================================================= for i in $FILES3D0 $FILES2D0 $FILES1D0 $FILES3D $FILES2D do echo "# Output file: $i" tail -2 $i done > ${TNAME}.out # Make sure that the output file is reasonable RUNCOUNT=`echo $FILES | wc -w` OUTCOUNT=`grep "Iterations" ${TNAME}.out | wc -l` if [ "$OUTCOUNT" != "$RUNCOUNT" ]; then echo "Incorrect number of runs in ${TNAME}.out" >&2 fi #============================================================================= # remove temporary files #============================================================================= rm -f ${TNAME}.testdata* hypre-2.33.0/src/test/TEST_sstruct/default2d.jobs000077500000000000000000000016141477326011500216060ustar00rootroot00000000000000#!/bin/bash # Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) #============================================================================= # sstruct: Run base 2d case #============================================================================= mpirun -np 1 ./sstruct -in sstruct.in.default_2D -r 2 2 1 -solver 19 \ > default2d.out.0 #============================================================================= # sstruct: Run various blockings and distributions of default problem #============================================================================= mpirun -np 1 ./sstruct -in sstruct.in.default_2D -b 2 2 1 -solver 19 \ > default2d.out.1 mpirun -np 2 ./sstruct -in sstruct.in.default_2D -P 1 2 1 -r 2 1 1 -solver 19 \ > default2d.out.2 hypre-2.33.0/src/test/TEST_sstruct/default2d.saved000066400000000000000000000004241477326011500217460ustar00rootroot00000000000000# Output file: default2d.out.0 Iterations = 23 Final Relative Residual Norm = 6.824328e-07 # Output file: default2d.out.1 Iterations = 23 Final Relative Residual Norm = 6.824328e-07 # Output file: default2d.out.2 Iterations = 23 Final Relative Residual Norm = 6.824328e-07 hypre-2.33.0/src/test/TEST_sstruct/default2d.saved.lassen000066400000000000000000000004241477326011500232320ustar00rootroot00000000000000# Output file: default2d.out.0 Iterations = 23 Final Relative Residual Norm = 6.824328e-07 # Output file: default2d.out.1 Iterations = 23 Final Relative Residual Norm = 6.824328e-07 # Output file: default2d.out.2 Iterations = 23 Final Relative Residual Norm = 6.824328e-07 hypre-2.33.0/src/test/TEST_sstruct/default2d.saved.lassen_cpu000066400000000000000000000004241477326011500241010ustar00rootroot00000000000000# Output file: default2d.out.0 Iterations = 23 Final Relative Residual Norm = 6.824328e-07 # Output file: default2d.out.1 Iterations = 23 Final Relative Residual Norm = 6.824328e-07 # Output file: default2d.out.2 Iterations = 23 Final Relative Residual Norm = 6.824328e-07 hypre-2.33.0/src/test/TEST_sstruct/default2d.sh000077500000000000000000000031611477326011500212620ustar00rootroot00000000000000#!/bin/bash # Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) TNAME=`basename $0 .sh` RTOL=$1 ATOL=$2 #============================================================================= # sstruct: Test various blockings and distributions of default problem #============================================================================= tail -3 ${TNAME}.out.0 > ${TNAME}.testdata #============================================================================= tail -3 ${TNAME}.out.1 > ${TNAME}.testdata.temp diff ${TNAME}.testdata ${TNAME}.testdata.temp >&2 #============================================================================= tail -3 ${TNAME}.out.2 > ${TNAME}.testdata.temp diff ${TNAME}.testdata ${TNAME}.testdata.temp >&2 #============================================================================= # compare with baseline case #============================================================================= FILES="\ ${TNAME}.out.0\ ${TNAME}.out.1\ ${TNAME}.out.2\ " for i in $FILES do echo "# Output file: $i" tail -3 $i done > ${TNAME}.out # Make sure that the output file is reasonable RUNCOUNT=`echo $FILES | wc -w` OUTCOUNT=`grep "Iterations" ${TNAME}.out | wc -l` if [ "$OUTCOUNT" != "$RUNCOUNT" ]; then echo "Incorrect number of runs in ${TNAME}.out" >&2 fi #============================================================================= # remove temporary files #============================================================================= rm -f ${TNAME}.testdata* hypre-2.33.0/src/test/TEST_sstruct/default3d.jobs000077500000000000000000000016211477326011500216050ustar00rootroot00000000000000#!/bin/bash # Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) #============================================================================= # sstruct: Run base 3d case #============================================================================= mpirun -np 1 ./sstruct -r 2 2 2 -solver 19 \ > default3d.out.0 #============================================================================= # sstruct: Run various blockings and distributions of default problem #============================================================================= mpirun -np 1 ./sstruct -b 2 2 2 -solver 19 \ > default3d.out.1 mpirun -np 2 ./sstruct -P 2 1 1 -b 1 2 1 -r 1 1 2 -solver 19 \ > default3d.out.2 mpirun -np 4 ./sstruct -P 2 1 2 -r 1 2 1 -solver 19 \ > default3d.out.3 hypre-2.33.0/src/test/TEST_sstruct/default3d.saved000066400000000000000000000005601477326011500217500ustar00rootroot00000000000000# Output file: default3d.out.0 Iterations = 27 Final Relative Residual Norm = 8.732652e-07 # Output file: default3d.out.1 Iterations = 27 Final Relative Residual Norm = 8.732652e-07 # Output file: default3d.out.2 Iterations = 27 Final Relative Residual Norm = 8.732652e-07 # Output file: default3d.out.3 Iterations = 27 Final Relative Residual Norm = 8.732652e-07 hypre-2.33.0/src/test/TEST_sstruct/default3d.saved.lassen000066400000000000000000000005601477326011500232340ustar00rootroot00000000000000# Output file: default3d.out.0 Iterations = 27 Final Relative Residual Norm = 8.732652e-07 # Output file: default3d.out.1 Iterations = 27 Final Relative Residual Norm = 8.732652e-07 # Output file: default3d.out.2 Iterations = 27 Final Relative Residual Norm = 8.732652e-07 # Output file: default3d.out.3 Iterations = 27 Final Relative Residual Norm = 8.732652e-07 hypre-2.33.0/src/test/TEST_sstruct/default3d.saved.lassen_cpu000066400000000000000000000005601477326011500241030ustar00rootroot00000000000000# Output file: default3d.out.0 Iterations = 27 Final Relative Residual Norm = 8.732652e-07 # Output file: default3d.out.1 Iterations = 27 Final Relative Residual Norm = 8.732652e-07 # Output file: default3d.out.2 Iterations = 27 Final Relative Residual Norm = 8.732652e-07 # Output file: default3d.out.3 Iterations = 27 Final Relative Residual Norm = 8.732652e-07 hypre-2.33.0/src/test/TEST_sstruct/default3d.sh000077500000000000000000000034621477326011500212670ustar00rootroot00000000000000#!/bin/bash # Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) TNAME=`basename $0 .sh` RTOL=$1 ATOL=$2 #============================================================================= # sstruct: Test various blockings and distributions of default problem #============================================================================= tail -3 ${TNAME}.out.0 > ${TNAME}.testdata #============================================================================= tail -3 ${TNAME}.out.1 > ${TNAME}.testdata.temp diff ${TNAME}.testdata ${TNAME}.testdata.temp >&2 #============================================================================= tail -3 ${TNAME}.out.2 > ${TNAME}.testdata.temp diff ${TNAME}.testdata ${TNAME}.testdata.temp >&2 #============================================================================= tail -3 ${TNAME}.out.3 > ${TNAME}.testdata.temp diff ${TNAME}.testdata ${TNAME}.testdata.temp >&2 #============================================================================= # compare with baseline case #============================================================================= FILES="\ ${TNAME}.out.0\ ${TNAME}.out.1\ ${TNAME}.out.2\ ${TNAME}.out.3\ " for i in $FILES do echo "# Output file: $i" tail -3 $i done > ${TNAME}.out # Make sure that the output file is reasonable RUNCOUNT=`echo $FILES | wc -w` OUTCOUNT=`grep "Iterations" ${TNAME}.out | wc -l` if [ "$OUTCOUNT" != "$RUNCOUNT" ]; then echo "Incorrect number of runs in ${TNAME}.out" >&2 fi #============================================================================= # remove temporary files #============================================================================= rm -f ${TNAME}.testdata* hypre-2.33.0/src/test/TEST_sstruct/emptyProc.jobs000077500000000000000000000172301477326011500217170ustar00rootroot00000000000000# Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) #============================================================================= # sstruct: Run 3d problem with one proc empty. Two types of tests: # struct solvers and sys_pfmg require the first part to be full # => compare runs with two refinements # other solvers: switch the empty proc, run 1= proc 2 empty # run 2= proc 1 empty #============================================================================= ##### ##### mpirun -np 2 ./sstruct -in sstruct.in.emptyProc1 -r 1 1 1 -rhsone -solver 3 \ > emptyProc.out.00 mpirun -np 2 ./sstruct -in sstruct.in.emptyProc1 -rhsone -solver 10 \ > emptyProc.out.01 mpirun -np 2 ./sstruct -in sstruct.in.emptyProc1 -rhsone -solver 11 \ > emptyProc.out.02 mpirun -np 2 ./sstruct -in sstruct.in.emptyProc1 -r 1 1 1 -rhsone -solver 13 \ > emptyProc.out.03 mpirun -np 2 ./sstruct -in sstruct.in.emptyProc1 -rhsone -solver 18 \ > emptyProc.out.04 mpirun -np 2 ./sstruct -in sstruct.in.emptyProc1 -rhsone -solver 20 \ > emptyProc.out.05 #mpirun -np 2 ./sstruct -in sstruct.in.emptyProc1 -rhsone -solver 22 \ # > emptyProc.out.06 mpirun -np 2 ./sstruct -in sstruct.in.emptyProc1 -rhsone -solver 28 \ > emptyProc.out.08 mpirun -np 2 ./sstruct -in sstruct.in.emptyProc1 -rhsone -solver 30 \ > emptyProc.out.09 mpirun -np 2 ./sstruct -in sstruct.in.emptyProc1 -rhsone -solver 31 \ > emptyProc.out.10 mpirun -np 2 ./sstruct -in sstruct.in.emptyProc1 -rhsone -solver 38 \ > emptyProc.out.11 mpirun -np 2 ./sstruct -in sstruct.in.emptyProc1 -rhsone -solver 40 \ > emptyProc.out.12 #mpirun -np 2 ./sstruct -in sstruct.in.emptyProc1 -rhsone -solver 42 \ # > emptyProc.out.14 mpirun -np 2 ./sstruct -in sstruct.in.emptyProc1 -rhsone -solver 50 \ > emptyProc.out.15 mpirun -np 2 ./sstruct -in sstruct.in.emptyProc1 -rhsone -solver 51 \ > emptyProc.out.16 mpirun -np 2 ./sstruct -in sstruct.in.emptyProc1 -rhsone -solver 58 \ > emptyProc.out.17 mpirun -np 2 ./sstruct -in sstruct.in.emptyProc1 -rhsone -solver 60 \ > emptyProc.out.18 #mpirun -np 2 ./sstruct -in sstruct.in.emptyProc1 -rhsone -solver 62 \ # > emptyProc.out.20 mpirun -np 2 ./sstruct -in sstruct.in.emptyProc1 -rhsone -solver 120 \ > emptyProc.out.21 mpirun -np 2 ./sstruct -in sstruct.in.emptyProc1 -r 1 1 1 -rhsone -solver 200 \ > emptyProc.out.22 mpirun -np 2 ./sstruct -in sstruct.in.emptyProc1 -r 1 1 1 -rhsone -solver 201 \ > emptyProc.out.23 mpirun -np 2 ./sstruct -in sstruct.in.emptyProc1 -r 1 1 1 -rhsone -solver 203 \ > emptyProc.out.24 mpirun -np 2 ./sstruct -in sstruct.in.emptyProc1 -r 1 1 1 -rhsone -solver 210 \ > emptyProc.out.25 mpirun -np 2 ./sstruct -in sstruct.in.emptyProc1 -r 1 1 1 -rhsone -solver 211 \ > emptyProc.out.26 mpirun -np 2 ./sstruct -in sstruct.in.emptyProc1 -r 1 1 1 -rhsone -solver 217 \ > emptyProc.out.27 mpirun -np 2 ./sstruct -in sstruct.in.emptyProc1 -r 1 1 1 -rhsone -solver 218 \ > emptyProc.out.28 mpirun -np 2 ./sstruct -in sstruct.in.emptyProc1 -r 1 1 1 -rhsone -solver 220 \ > emptyProc.out.29 mpirun -np 2 ./sstruct -in sstruct.in.emptyProc1 -r 1 1 1 -rhsone -solver 221 \ > emptyProc.out.30 mpirun -np 2 ./sstruct -in sstruct.in.emptyProc1 -r 1 1 1 -rhsone -solver 230 \ > emptyProc.out.31 mpirun -np 2 ./sstruct -in sstruct.in.emptyProc1 -r 1 1 1 -rhsone -solver 231 \ > emptyProc.out.32 mpirun -np 2 ./sstruct -in sstruct.in.emptyProc1 -r 1 1 1 -rhsone -solver 237 \ > emptyProc.out.33 mpirun -np 2 ./sstruct -in sstruct.in.emptyProc1 -r 1 1 1 -rhsone -solver 238 \ > emptyProc.out.34 mpirun -np 2 ./sstruct -in sstruct.in.emptyProc1 -r 1 1 1 -rhsone -solver 240 \ > emptyProc.out.35 mpirun -np 2 ./sstruct -in sstruct.in.emptyProc1 -r 1 1 1 -rhsone -solver 241 \ > emptyProc.out.36 mpirun -np 2 ./sstruct -in sstruct.in.emptyProc1 -r 1 1 1 -rhsone -solver 247 \ > emptyProc.out.37 mpirun -np 2 ./sstruct -in sstruct.in.emptyProc1 -r 1 1 1 -rhsone -solver 248 \ > emptyProc.out.38 #============================================================================= # run 2 #============================================================================= mpirun -np 2 ./sstruct -in sstruct.in.emptyProc2 -r 2 2 2 -rhsone -solver 3 \ > emptyProc.out.100 mpirun -np 2 ./sstruct -in sstruct.in.emptyProc3 -rhsone -solver 10 \ > emptyProc.out.101 mpirun -np 2 ./sstruct -in sstruct.in.emptyProc3 -rhsone -solver 11 \ > emptyProc.out.102 mpirun -np 2 ./sstruct -in sstruct.in.emptyProc2 -r 2 2 2 -rhsone -solver 13 \ > emptyProc.out.103 mpirun -np 2 ./sstruct -in sstruct.in.emptyProc3 -rhsone -solver 18 \ > emptyProc.out.104 mpirun -np 2 ./sstruct -in sstruct.in.emptyProc3 -rhsone -solver 20 \ > emptyProc.out.105 #mpirun -np 2 ./sstruct -in sstruct.in.emptyProc3 -rhsone -solver 22 \ # > emptyProc.out.106 mpirun -np 2 ./sstruct -in sstruct.in.emptyProc3 -rhsone -solver 28 \ > emptyProc.out.108 mpirun -np 2 ./sstruct -in sstruct.in.emptyProc3 -rhsone -solver 30 \ > emptyProc.out.109 mpirun -np 2 ./sstruct -in sstruct.in.emptyProc3 -rhsone -solver 31 \ > emptyProc.out.110 mpirun -np 2 ./sstruct -in sstruct.in.emptyProc3 -rhsone -solver 38 \ > emptyProc.out.111 mpirun -np 2 ./sstruct -in sstruct.in.emptyProc3 -rhsone -solver 40 \ > emptyProc.out.112 #mpirun -np 2 ./sstruct -in sstruct.in.emptyProc3 -rhsone -solver 42 \ # > emptyProc.out.114 mpirun -np 2 ./sstruct -in sstruct.in.emptyProc3 -rhsone -solver 50 \ > emptyProc.out.115 mpirun -np 2 ./sstruct -in sstruct.in.emptyProc3 -rhsone -solver 51 \ > emptyProc.out.116 mpirun -np 2 ./sstruct -in sstruct.in.emptyProc3 -rhsone -solver 58 \ > emptyProc.out.117 mpirun -np 2 ./sstruct -in sstruct.in.emptyProc3 -rhsone -solver 60 \ > emptyProc.out.118 #mpirun -np 2 ./sstruct -in sstruct.in.emptyProc3 -rhsone -solver 62 \ # > emptyProc.out.120 mpirun -np 2 ./sstruct -in sstruct.in.emptyProc3 -rhsone -solver 120 \ > emptyProc.out.121 mpirun -np 2 ./sstruct -in sstruct.in.emptyProc2 -r 2 2 2 -rhsone -solver 200 \ > emptyProc.out.122 mpirun -np 2 ./sstruct -in sstruct.in.emptyProc2 -r 2 2 2 -rhsone -solver 201 \ > emptyProc.out.123 mpirun -np 2 ./sstruct -in sstruct.in.emptyProc2 -r 2 2 2 -rhsone -solver 203 \ > emptyProc.out.124 mpirun -np 2 ./sstruct -in sstruct.in.emptyProc2 -r 2 2 2 -rhsone -solver 210 \ > emptyProc.out.125 mpirun -np 2 ./sstruct -in sstruct.in.emptyProc2 -r 2 2 2 -rhsone -solver 211 \ > emptyProc.out.126 mpirun -np 2 ./sstruct -in sstruct.in.emptyProc2 -r 2 2 2 -rhsone -solver 217 \ > emptyProc.out.127 mpirun -np 2 ./sstruct -in sstruct.in.emptyProc2 -r 2 2 2 -rhsone -solver 218 \ > emptyProc.out.128 mpirun -np 2 ./sstruct -in sstruct.in.emptyProc2 -r 2 2 2 -rhsone -solver 220 \ > emptyProc.out.129 mpirun -np 2 ./sstruct -in sstruct.in.emptyProc2 -r 2 2 2 -rhsone -solver 221 \ > emptyProc.out.130 mpirun -np 2 ./sstruct -in sstruct.in.emptyProc2 -r 2 2 2 -rhsone -solver 230 \ > emptyProc.out.131 mpirun -np 2 ./sstruct -in sstruct.in.emptyProc2 -r 2 2 2 -rhsone -solver 231 \ > emptyProc.out.132 mpirun -np 2 ./sstruct -in sstruct.in.emptyProc2 -r 2 2 2 -rhsone -solver 237 \ > emptyProc.out.133 mpirun -np 2 ./sstruct -in sstruct.in.emptyProc2 -r 2 2 2 -rhsone -solver 238 \ > emptyProc.out.134 mpirun -np 2 ./sstruct -in sstruct.in.emptyProc2 -r 2 2 2 -rhsone -solver 240 \ > emptyProc.out.135 mpirun -np 2 ./sstruct -in sstruct.in.emptyProc2 -r 2 2 2 -rhsone -solver 241 \ > emptyProc.out.136 mpirun -np 2 ./sstruct -in sstruct.in.emptyProc2 -r 2 2 2 -rhsone -solver 247 \ > emptyProc.out.137 mpirun -np 2 ./sstruct -in sstruct.in.emptyProc2 -r 2 2 2 -rhsone -solver 248 \ > emptyProc.out.138 hypre-2.33.0/src/test/TEST_sstruct/emptyProc.saved000066400000000000000000000064111477326011500220600ustar00rootroot00000000000000# Output file: emptyProc.out.00 Iterations = 16 Final Relative Residual Norm = 4.728437e-07 # Output file: emptyProc.out.01 Iterations = 4 Final Relative Residual Norm = 1.228720e-07 # Output file: emptyProc.out.02 Iterations = 27 Final Relative Residual Norm = 9.010838e-07 # Output file: emptyProc.out.03 Iterations = 7 Final Relative Residual Norm = 8.654509e-07 # Output file: emptyProc.out.04 Iterations = 20 Final Relative Residual Norm = 5.962015e-07 # Output file: emptyProc.out.05 Iterations = 6 Final Relative Residual Norm = 2.350489e-07 # Output file: emptyProc.out.06 #Iterations = 15 #Final Relative Residual Norm = 6.369593e-07 # Output file: emptyProc.out.08 Iterations = 20 Final Relative Residual Norm = 5.962015e-07 # Output file: emptyProc.out.09 Iterations = 4 Final Relative Residual Norm = 1.175679e-07 # Output file: emptyProc.out.10 Iterations = 9 Final Relative Residual Norm = 8.346689e-07 # Output file: emptyProc.out.11 Iterations = 64 Final Relative Residual Norm = 9.962554e-07 # Output file: emptyProc.out.12 Iterations = 6 Final Relative Residual Norm = 3.354751e-07 # Output file: emptyProc.out.14 #Iterations = 17 #Final Relative Residual Norm = 6.043891e-07 # Output file: emptyProc.out.15 Iterations = 2 Final Relative Residual Norm = 1.699553e-07 # Output file: emptyProc.out.16 Iterations = 5 Final Relative Residual Norm = 8.505453e-07 # Output file: emptyProc.out.17 Iterations = 14 Final Relative Residual Norm = 6.421347e-07 # Output file: emptyProc.out.18 Iterations = 3 Final Relative Residual Norm = 8.029310e-07 # Output file: emptyProc.out.20 #Iterations = 8 #Final Relative Residual Norm = 7.771825e-07 # Output file: emptyProc.out.21 Iterations = 20 Final Relative Residual Norm = 5.962015e-07 # Output file: emptyProc.out.22 Iterations = 5 Final Relative Residual Norm = 1.375560e-07 # Output file: emptyProc.out.23 Iterations = 16 Final Relative Residual Norm = 9.983250e-07 # Output file: emptyProc.out.24 Iterations = 16 Final Relative Residual Norm = 9.983250e-07 # Output file: emptyProc.out.25 Iterations = 4 Final Relative Residual Norm = 1.228720e-07 # Output file: emptyProc.out.26 Iterations = 13 Final Relative Residual Norm = 7.358735e-07 # Output file: emptyProc.out.27 Iterations = 11 Final Relative Residual Norm = 5.333915e-07 # Output file: emptyProc.out.28 Iterations = 20 Final Relative Residual Norm = 5.962015e-07 # Output file: emptyProc.out.29 Iterations = 20 Final Relative Residual Norm = 5.962015e-07 # Output file: emptyProc.out.30 Iterations = 20 Final Relative Residual Norm = 5.962015e-07 # Output file: emptyProc.out.31 Iterations = 4 Final Relative Residual Norm = 1.175679e-07 # Output file: emptyProc.out.32 Iterations = 9 Final Relative Residual Norm = 3.889426e-07 # Output file: emptyProc.out.33 Iterations = 20 Final Relative Residual Norm = 7.280287e-07 # Output file: emptyProc.out.34 Iterations = 64 Final Relative Residual Norm = 9.962554e-07 # Output file: emptyProc.out.35 Iterations = 2 Final Relative Residual Norm = 1.699553e-07 # Output file: emptyProc.out.36 Iterations = 5 Final Relative Residual Norm = 8.876781e-08 # Output file: emptyProc.out.37 Iterations = 8 Final Relative Residual Norm = 2.986671e-08 # Output file: emptyProc.out.38 Iterations = 14 Final Relative Residual Norm = 6.421347e-07 hypre-2.33.0/src/test/TEST_sstruct/emptyProc.saved.lassen000066400000000000000000000057551477326011500233560ustar00rootroot00000000000000# Output file: emptyProc.out.00 Iterations = 16 Final Relative Residual Norm = 4.728437e-07 # Output file: emptyProc.out.01 Iterations = 4 Final Relative Residual Norm = 1.228720e-07 # Output file: emptyProc.out.02 Iterations = 27 Final Relative Residual Norm = 9.010838e-07 # Output file: emptyProc.out.03 Iterations = 7 Final Relative Residual Norm = 8.654509e-07 # Output file: emptyProc.out.04 Iterations = 20 Final Relative Residual Norm = 5.962015e-07 # Output file: emptyProc.out.05 Iterations = 9 Final Relative Residual Norm = 6.100240e-07 # Output file: emptyProc.out.08 Iterations = 20 Final Relative Residual Norm = 5.962015e-07 # Output file: emptyProc.out.09 Iterations = 4 Final Relative Residual Norm = 1.175679e-07 # Output file: emptyProc.out.10 Iterations = 9 Final Relative Residual Norm = 8.346689e-07 # Output file: emptyProc.out.11 Iterations = 64 Final Relative Residual Norm = 9.962554e-07 # Output file: emptyProc.out.12 Iterations = 9 Final Relative Residual Norm = 7.982121e-07 # Output file: emptyProc.out.15 Iterations = 2 Final Relative Residual Norm = 1.699553e-07 # Output file: emptyProc.out.16 Iterations = 5 Final Relative Residual Norm = 8.505453e-07 # Output file: emptyProc.out.17 Iterations = 14 Final Relative Residual Norm = 6.421347e-07 # Output file: emptyProc.out.18 Iterations = 5 Final Relative Residual Norm = 6.241458e-07 # Output file: emptyProc.out.21 Iterations = 20 Final Relative Residual Norm = 5.962015e-07 # Output file: emptyProc.out.22 Iterations = 5 Final Relative Residual Norm = 1.375560e-07 # Output file: emptyProc.out.23 Iterations = 16 Final Relative Residual Norm = 9.983250e-07 # Output file: emptyProc.out.24 Iterations = 16 Final Relative Residual Norm = 9.983250e-07 # Output file: emptyProc.out.25 Iterations = 4 Final Relative Residual Norm = 1.228720e-07 # Output file: emptyProc.out.26 Iterations = 13 Final Relative Residual Norm = 7.358735e-07 # Output file: emptyProc.out.27 Iterations = 11 Final Relative Residual Norm = 5.333915e-07 # Output file: emptyProc.out.28 Iterations = 20 Final Relative Residual Norm = 5.962015e-07 # Output file: emptyProc.out.29 Iterations = 20 Final Relative Residual Norm = 5.962015e-07 # Output file: emptyProc.out.30 Iterations = 20 Final Relative Residual Norm = 5.962015e-07 # Output file: emptyProc.out.31 Iterations = 4 Final Relative Residual Norm = 1.175679e-07 # Output file: emptyProc.out.32 Iterations = 9 Final Relative Residual Norm = 3.889426e-07 # Output file: emptyProc.out.33 Iterations = 20 Final Relative Residual Norm = 7.280287e-07 # Output file: emptyProc.out.34 Iterations = 64 Final Relative Residual Norm = 9.962554e-07 # Output file: emptyProc.out.35 Iterations = 2 Final Relative Residual Norm = 1.699553e-07 # Output file: emptyProc.out.36 Iterations = 5 Final Relative Residual Norm = 8.876781e-08 # Output file: emptyProc.out.37 Iterations = 8 Final Relative Residual Norm = 2.986671e-08 # Output file: emptyProc.out.38 Iterations = 14 Final Relative Residual Norm = 6.421347e-07 hypre-2.33.0/src/test/TEST_sstruct/emptyProc.saved.lassen_cpu000066400000000000000000000057551477326011500242250ustar00rootroot00000000000000# Output file: emptyProc.out.00 Iterations = 16 Final Relative Residual Norm = 4.728437e-07 # Output file: emptyProc.out.01 Iterations = 4 Final Relative Residual Norm = 1.228720e-07 # Output file: emptyProc.out.02 Iterations = 27 Final Relative Residual Norm = 9.010838e-07 # Output file: emptyProc.out.03 Iterations = 7 Final Relative Residual Norm = 8.654509e-07 # Output file: emptyProc.out.04 Iterations = 20 Final Relative Residual Norm = 5.962015e-07 # Output file: emptyProc.out.05 Iterations = 6 Final Relative Residual Norm = 2.139764e-07 # Output file: emptyProc.out.08 Iterations = 20 Final Relative Residual Norm = 5.962015e-07 # Output file: emptyProc.out.09 Iterations = 4 Final Relative Residual Norm = 1.175679e-07 # Output file: emptyProc.out.10 Iterations = 9 Final Relative Residual Norm = 8.346689e-07 # Output file: emptyProc.out.11 Iterations = 64 Final Relative Residual Norm = 9.962554e-07 # Output file: emptyProc.out.12 Iterations = 6 Final Relative Residual Norm = 3.079649e-07 # Output file: emptyProc.out.15 Iterations = 2 Final Relative Residual Norm = 1.699553e-07 # Output file: emptyProc.out.16 Iterations = 5 Final Relative Residual Norm = 8.505453e-07 # Output file: emptyProc.out.17 Iterations = 14 Final Relative Residual Norm = 6.421347e-07 # Output file: emptyProc.out.18 Iterations = 3 Final Relative Residual Norm = 6.839240e-07 # Output file: emptyProc.out.21 Iterations = 20 Final Relative Residual Norm = 5.962015e-07 # Output file: emptyProc.out.22 Iterations = 5 Final Relative Residual Norm = 1.375560e-07 # Output file: emptyProc.out.23 Iterations = 16 Final Relative Residual Norm = 9.983250e-07 # Output file: emptyProc.out.24 Iterations = 16 Final Relative Residual Norm = 9.983250e-07 # Output file: emptyProc.out.25 Iterations = 4 Final Relative Residual Norm = 1.228720e-07 # Output file: emptyProc.out.26 Iterations = 13 Final Relative Residual Norm = 7.358735e-07 # Output file: emptyProc.out.27 Iterations = 11 Final Relative Residual Norm = 5.333915e-07 # Output file: emptyProc.out.28 Iterations = 20 Final Relative Residual Norm = 5.962015e-07 # Output file: emptyProc.out.29 Iterations = 20 Final Relative Residual Norm = 5.962015e-07 # Output file: emptyProc.out.30 Iterations = 20 Final Relative Residual Norm = 5.962015e-07 # Output file: emptyProc.out.31 Iterations = 4 Final Relative Residual Norm = 1.175679e-07 # Output file: emptyProc.out.32 Iterations = 9 Final Relative Residual Norm = 3.889426e-07 # Output file: emptyProc.out.33 Iterations = 20 Final Relative Residual Norm = 7.280287e-07 # Output file: emptyProc.out.34 Iterations = 64 Final Relative Residual Norm = 9.962554e-07 # Output file: emptyProc.out.35 Iterations = 2 Final Relative Residual Norm = 1.699553e-07 # Output file: emptyProc.out.36 Iterations = 5 Final Relative Residual Norm = 8.876781e-08 # Output file: emptyProc.out.37 Iterations = 8 Final Relative Residual Norm = 2.986671e-08 # Output file: emptyProc.out.38 Iterations = 14 Final Relative Residual Norm = 6.421347e-07 hypre-2.33.0/src/test/TEST_sstruct/emptyProc.sh000077500000000000000000000030061477326011500213700ustar00rootroot00000000000000#!/bin/bash # Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) TNAME=`basename $0 .sh` RTOL=$1 ATOL=$2 #============================================================================= # sstruct: Test various empty proc problems #============================================================================= TNUMS="\ 00 01 02 03 04 05 08 09\ 10 11 12 15 16 17 18 \ 21 22 23 24 25 26 27 28 29\ 30 31 32 33 34 35 36 37 38 \ " # 06 14 20 for i in $TNUMS do tail -3 ${TNAME}.out.${i} > ${TNAME}.testdata tail -3 ${TNAME}.out.1${i} > ${TNAME}.testdata.temp (../runcheck.sh ${TNAME}.testdata ${TNAME}.testdata.temp $RTOL $ATOL) >&2 done #============================================================================= # compare with baseline case #============================================================================= for i in $TNUMS do echo "# Output file: ${TNAME}.out.${i}" tail -3 ${TNAME}.out.${i} done > ${TNAME}.out # Make sure that the output file is reasonable RUNCOUNT=`echo $TNUMS | wc -w` OUTCOUNT=`grep "Iterations" ${TNAME}.out | wc -l` if [ "$OUTCOUNT" != "$RUNCOUNT" ]; then echo "Incorrect number of runs in ${TNAME}.out" >&2 fi #============================================================================= # remove temporary files #============================================================================= rm -f ${TNAME}.testdata* hypre-2.33.0/src/test/TEST_sstruct/io.jobs000066400000000000000000000101231477326011500203330ustar00rootroot00000000000000#!/bin/bash # Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) #============================================================================= # Sequential I/O tests #============================================================================= mpirun -np 1 ./sstruct -in sstruct.in.block -r 6 6 6 -solver 18 -print > io.out.0P mpirun -np 1 ./sstruct -fromfile sstruct.out.A -rhsfromfile sstruct.out.b -x0fromfile sstruct.out.x0 -solver 18 -print > io.out.0R mpirun -np 1 ./sstruct -in sstruct.in.amr.2D -r 8 8 1 -solver 18 -print > io.out.1P mpirun -np 1 ./sstruct -fromfile sstruct.out.A -rhsfromfile sstruct.out.b -x0fromfile sstruct.out.x0 -solver 18 -print > io.out.1R mpirun -np 1 ./sstruct -in sstruct.in.amr.graphadd -r 3 3 1 -solver 18 -print > io.out.2P mpirun -np 1 ./sstruct -fromfile sstruct.out.A -rhsfromfile sstruct.out.b -x0fromfile sstruct.out.x0 -solver 18 -print > io.out.2R mpirun -np 1 ./sstruct -in sstruct.in.laps -r 4 4 1 -solver 18 -print > io.out.3P mpirun -np 1 ./sstruct -fromfile sstruct.out.A -rhsfromfile sstruct.out.b -x0fromfile sstruct.out.x0 -solver 18 -print > io.out.3R mpirun -np 1 ./sstruct -in sstruct.in.miller_3blk -r 4 4 1 -solver 18 -print > io.out.4P mpirun -np 1 ./sstruct -fromfile sstruct.out.A -rhsfromfile sstruct.out.b -x0fromfile sstruct.out.x0 -solver 18 -print > io.out.4R mpirun -np 1 ./sstruct -in sstruct.in.marinak -solver 18 -tol 1e-3 -print > io.out.5P mpirun -np 1 ./sstruct -fromfile sstruct.out.A -rhsfromfile sstruct.out.b -x0fromfile sstruct.out.x0 -solver 18 -print -tol 1e-3 > io.out.5R mpirun -np 1 ./sstruct -in sstruct.in.p7iso -r 2 2 2 -solver 18 -print > io.out.6P mpirun -np 1 ./sstruct -fromfile sstruct.out.A -rhsfromfile sstruct.out.b -x0fromfile sstruct.out.x0 -solver 18 -print > io.out.6R mpirun -np 1 ./sstruct -in sstruct.in.symm3 -r 4 4 4 -solver 18 -print > io.out.7P mpirun -np 1 ./sstruct -fromfile sstruct.out.A -rhsfromfile sstruct.out.b -x0fromfile sstruct.out.x0 -solver 18 -print > io.out.7R #============================================================================= # Parallel I/O tests #============================================================================= mpirun -np 8 ./sstruct -in ../TEST_sstruct/sstruct.in.block -r 3 3 3 -P 2 2 2 -solver 18 -print > io.out.100P mpirun -np 8 ./sstruct -fromfile sstruct.out.A -rhsfromfile sstruct.out.b -x0fromfile sstruct.out.x0 -solver 18 -print > io.out.100R mpirun -np 4 ./sstruct -in sstruct.in.amr.2D -r 4 4 1 -P 2 2 1 -solver 18 -print > io.out.101P mpirun -np 4 ./sstruct -fromfile sstruct.out.A -rhsfromfile sstruct.out.b -x0fromfile sstruct.out.x0 -solver 18 -print > io.out.101R mpirun -np 2 ./sstruct -in sstruct.in.amr.graphadd -r 3 3 1 -pooldist 1 -solver 18 -print > io.out.102P mpirun -np 2 ./sstruct -fromfile sstruct.out.A -rhsfromfile sstruct.out.b -x0fromfile sstruct.out.x0 -solver 18 -print > io.out.102R mpirun -np 4 ./sstruct -in sstruct.in.laps -r 2 2 1 -P 2 2 1 -solver 18 -print > io.out.103P mpirun -np 4 ./sstruct -fromfile sstruct.out.A -rhsfromfile sstruct.out.b -x0fromfile sstruct.out.x0 -solver 18 -print > io.out.103R mpirun -np 4 ./sstruct -in sstruct.in.miller_3blk -r 2 2 1 -P 2 2 1 -solver 18 -print > io.out.104P mpirun -np 4 ./sstruct -fromfile sstruct.out.A -rhsfromfile sstruct.out.b -x0fromfile sstruct.out.x0 -solver 18 -print > io.out.104R mpirun -np 8 ./sstruct -in sstruct.in.marinak -pooldist 1 -solver 18 -tol 1e-3 -print > io.out.105P mpirun -np 8 ./sstruct -fromfile sstruct.out.A -rhsfromfile sstruct.out.b -x0fromfile sstruct.out.x0 -solver 18 -print -tol 1e-3 > io.out.105R mpirun -np 8 ./sstruct -in sstruct.in.p7iso -P 2 2 2 -solver 18 -print > io.out.106P mpirun -np 8 ./sstruct -fromfile sstruct.out.A -rhsfromfile sstruct.out.b -x0fromfile sstruct.out.x0 -solver 18 -print > io.out.106R mpirun -np 8 ./sstruct -in sstruct.in.symm3 -r 2 2 2 -P 2 2 2 -solver 18 -print > io.out.107P mpirun -np 8 ./sstruct -fromfile sstruct.out.A -rhsfromfile sstruct.out.b -x0fromfile sstruct.out.x0 -solver 18 -print > io.out.107R hypre-2.33.0/src/test/TEST_sstruct/io.saved000066400000000000000000000053361477326011500205120ustar00rootroot00000000000000# Output file: io.out.0P Iterations = 40 Final Relative Residual Norm = 6.360366e-07 # Output file: io.out.0R Iterations = 40 Final Relative Residual Norm = 6.360366e-07 # Output file: io.out.1P Iterations = 20 Final Relative Residual Norm = 8.532200e-07 # Output file: io.out.1R Iterations = 20 Final Relative Residual Norm = 8.532200e-07 # Output file: io.out.2P Iterations = 23 Final Relative Residual Norm = 8.435286e-07 # Output file: io.out.2R Iterations = 23 Final Relative Residual Norm = 8.435286e-07 # Output file: io.out.3P Iterations = 92 Final Relative Residual Norm = 7.654048e-07 # Output file: io.out.3R Iterations = 92 Final Relative Residual Norm = 7.654048e-07 # Output file: io.out.4P Iterations = 65 Final Relative Residual Norm = 9.321074e-07 # Output file: io.out.4R Iterations = 65 Final Relative Residual Norm = 9.321074e-07 # Output file: io.out.5P Iterations = 64 Final Relative Residual Norm = 9.708691e-04 # Output file: io.out.5R Iterations = 64 Final Relative Residual Norm = 9.708691e-04 # Output file: io.out.6P Iterations = 60 Final Relative Residual Norm = 8.657637e-07 # Output file: io.out.6R Iterations = 60 Final Relative Residual Norm = 8.657637e-07 # Output file: io.out.7P Iterations = 27 Final Relative Residual Norm = 4.507162e-07 # Output file: io.out.7R Iterations = 27 Final Relative Residual Norm = 4.507162e-07 # Output file: io.out.100P Iterations = 40 Final Relative Residual Norm = 6.360366e-07 # Output file: io.out.100R Iterations = 40 Final Relative Residual Norm = 6.360366e-07 # Output file: io.out.101P Iterations = 20 Final Relative Residual Norm = 8.532200e-07 # Output file: io.out.101R Iterations = 20 Final Relative Residual Norm = 8.532200e-07 # Output file: io.out.102P Iterations = 23 Final Relative Residual Norm = 8.435286e-07 # Output file: io.out.102R Iterations = 23 Final Relative Residual Norm = 8.435286e-07 # Output file: io.out.103P Iterations = 92 Final Relative Residual Norm = 7.654048e-07 # Output file: io.out.103R Iterations = 92 Final Relative Residual Norm = 7.654048e-07 # Output file: io.out.104P Iterations = 65 Final Relative Residual Norm = 9.321074e-07 # Output file: io.out.104R Iterations = 65 Final Relative Residual Norm = 9.321074e-07 # Output file: io.out.105P Iterations = 64 Final Relative Residual Norm = 9.708691e-04 # Output file: io.out.105R Iterations = 64 Final Relative Residual Norm = 9.708691e-04 # Output file: io.out.106P Iterations = 60 Final Relative Residual Norm = 8.657637e-07 # Output file: io.out.106R Iterations = 60 Final Relative Residual Norm = 8.657637e-07 # Output file: io.out.107P Iterations = 27 Final Relative Residual Norm = 4.507162e-07 # Output file: io.out.107R Iterations = 27 Final Relative Residual Norm = 4.507162e-07hypre-2.33.0/src/test/TEST_sstruct/io.saved.lassen000066400000000000000000000053401477326011500217710ustar00rootroot00000000000000# Output file: io.out.0P Iterations = 40 Final Relative Residual Norm = 6.360366e-07 # Output file: io.out.0R Iterations = 40 Final Relative Residual Norm = 6.360366e-07 # Output file: io.out.1P Iterations = 20 Final Relative Residual Norm = 8.532200e-07 # Output file: io.out.1R Iterations = 20 Final Relative Residual Norm = 8.532200e-07 # Output file: io.out.2P Iterations = 23 Final Relative Residual Norm = 8.435286e-07 # Output file: io.out.2R Iterations = 23 Final Relative Residual Norm = 8.435286e-07 # Output file: io.out.3P Iterations = 92 Final Relative Residual Norm = 7.654048e-07 # Output file: io.out.3R Iterations = 92 Final Relative Residual Norm = 7.654048e-07 # Output file: io.out.4P Iterations = 65 Final Relative Residual Norm = 9.321074e-07 # Output file: io.out.4R Iterations = 65 Final Relative Residual Norm = 9.321074e-07 # Output file: io.out.5P Iterations = 64 Final Relative Residual Norm = 9.708691e-04 # Output file: io.out.5R Iterations = 64 Final Relative Residual Norm = 9.708691e-04 # Output file: io.out.6P Iterations = 60 Final Relative Residual Norm = 8.657637e-07 # Output file: io.out.6R Iterations = 60 Final Relative Residual Norm = 8.657637e-07 # Output file: io.out.7P Iterations = 27 Final Relative Residual Norm = 4.507162e-07 # Output file: io.out.7R Iterations = 27 Final Relative Residual Norm = 4.507162e-07 # Output file: io.out.100P Iterations = 40 Final Relative Residual Norm = 6.360366e-07 # Output file: io.out.100R Iterations = 40 Final Relative Residual Norm = 6.360366e-07 # Output file: io.out.101P Iterations = 20 Final Relative Residual Norm = 8.532200e-07 # Output file: io.out.101R Iterations = 20 Final Relative Residual Norm = 8.532200e-07 # Output file: io.out.102P Iterations = 23 Final Relative Residual Norm = 8.435286e-07 # Output file: io.out.102R Iterations = 23 Final Relative Residual Norm = 8.435286e-07 # Output file: io.out.103P Iterations = 92 Final Relative Residual Norm = 7.654048e-07 # Output file: io.out.103R Iterations = 92 Final Relative Residual Norm = 7.654048e-07 # Output file: io.out.104P Iterations = 65 Final Relative Residual Norm = 9.321074e-07 # Output file: io.out.104R Iterations = 65 Final Relative Residual Norm = 9.321074e-07 # Output file: io.out.105P Iterations = 64 Final Relative Residual Norm = 9.708691e-04 # Output file: io.out.105R Iterations = 64 Final Relative Residual Norm = 9.708691e-04 # Output file: io.out.106P Iterations = 60 Final Relative Residual Norm = 8.657637e-07 # Output file: io.out.106R Iterations = 60 Final Relative Residual Norm = 8.657637e-07 # Output file: io.out.107P Iterations = 27 Final Relative Residual Norm = 4.507162e-07 # Output file: io.out.107R Iterations = 27 Final Relative Residual Norm = 4.507162e-07 hypre-2.33.0/src/test/TEST_sstruct/io.saved.lassen_cpu000066400000000000000000000053401477326011500226400ustar00rootroot00000000000000# Output file: io.out.0P Iterations = 40 Final Relative Residual Norm = 6.360366e-07 # Output file: io.out.0R Iterations = 40 Final Relative Residual Norm = 6.360366e-07 # Output file: io.out.1P Iterations = 20 Final Relative Residual Norm = 8.532200e-07 # Output file: io.out.1R Iterations = 20 Final Relative Residual Norm = 8.532200e-07 # Output file: io.out.2P Iterations = 23 Final Relative Residual Norm = 8.435286e-07 # Output file: io.out.2R Iterations = 23 Final Relative Residual Norm = 8.435286e-07 # Output file: io.out.3P Iterations = 92 Final Relative Residual Norm = 7.654048e-07 # Output file: io.out.3R Iterations = 92 Final Relative Residual Norm = 7.654048e-07 # Output file: io.out.4P Iterations = 65 Final Relative Residual Norm = 9.321074e-07 # Output file: io.out.4R Iterations = 65 Final Relative Residual Norm = 9.321074e-07 # Output file: io.out.5P Iterations = 64 Final Relative Residual Norm = 9.708691e-04 # Output file: io.out.5R Iterations = 64 Final Relative Residual Norm = 9.708691e-04 # Output file: io.out.6P Iterations = 60 Final Relative Residual Norm = 8.657637e-07 # Output file: io.out.6R Iterations = 60 Final Relative Residual Norm = 8.657637e-07 # Output file: io.out.7P Iterations = 27 Final Relative Residual Norm = 4.507162e-07 # Output file: io.out.7R Iterations = 27 Final Relative Residual Norm = 4.507162e-07 # Output file: io.out.100P Iterations = 40 Final Relative Residual Norm = 6.360366e-07 # Output file: io.out.100R Iterations = 40 Final Relative Residual Norm = 6.360366e-07 # Output file: io.out.101P Iterations = 20 Final Relative Residual Norm = 8.532200e-07 # Output file: io.out.101R Iterations = 20 Final Relative Residual Norm = 8.532200e-07 # Output file: io.out.102P Iterations = 23 Final Relative Residual Norm = 8.435286e-07 # Output file: io.out.102R Iterations = 23 Final Relative Residual Norm = 8.435286e-07 # Output file: io.out.103P Iterations = 92 Final Relative Residual Norm = 7.654048e-07 # Output file: io.out.103R Iterations = 92 Final Relative Residual Norm = 7.654048e-07 # Output file: io.out.104P Iterations = 65 Final Relative Residual Norm = 9.321074e-07 # Output file: io.out.104R Iterations = 65 Final Relative Residual Norm = 9.321074e-07 # Output file: io.out.105P Iterations = 64 Final Relative Residual Norm = 9.708691e-04 # Output file: io.out.105R Iterations = 64 Final Relative Residual Norm = 9.708691e-04 # Output file: io.out.106P Iterations = 60 Final Relative Residual Norm = 8.657637e-07 # Output file: io.out.106R Iterations = 60 Final Relative Residual Norm = 8.657637e-07 # Output file: io.out.107P Iterations = 27 Final Relative Residual Norm = 4.507162e-07 # Output file: io.out.107R Iterations = 27 Final Relative Residual Norm = 4.507162e-07 hypre-2.33.0/src/test/TEST_sstruct/io.sh000077500000000000000000000025241477326011500200210ustar00rootroot00000000000000#!/bin/bash # Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) TNAME=`basename $0 .sh` RTOL=$1 ATOL=$2 #============================================================================= # compare with baseline case #============================================================================= FILES="\ ${TNAME}.out.0P\ ${TNAME}.out.0R\ ${TNAME}.out.1P\ ${TNAME}.out.1R\ ${TNAME}.out.2P\ ${TNAME}.out.2R\ ${TNAME}.out.3P\ ${TNAME}.out.3R\ ${TNAME}.out.4P\ ${TNAME}.out.4R\ ${TNAME}.out.5P\ ${TNAME}.out.5R\ ${TNAME}.out.6P\ ${TNAME}.out.6R\ ${TNAME}.out.7P\ ${TNAME}.out.7R\ ${TNAME}.out.100P\ ${TNAME}.out.100R\ ${TNAME}.out.101P\ ${TNAME}.out.101R\ ${TNAME}.out.102P\ ${TNAME}.out.102R\ ${TNAME}.out.103P\ ${TNAME}.out.103R\ ${TNAME}.out.104P\ ${TNAME}.out.104R\ ${TNAME}.out.105P\ ${TNAME}.out.105R\ ${TNAME}.out.106P\ ${TNAME}.out.106R\ ${TNAME}.out.107P\ ${TNAME}.out.107R\ " for i in $FILES do echo "# Output file: $i" tail -3 $i done > ${TNAME}.out # Make sure that the output file is reasonable RUNCOUNT=`echo $FILES | wc -w` OUTCOUNT=`grep "Iterations" ${TNAME}.out | wc -l` if [ "$OUTCOUNT" != "$RUNCOUNT" ]; then echo "Incorrect number of runs in ${TNAME}.out" >&2 fi hypre-2.33.0/src/test/TEST_sstruct/maxwell.jobs000077500000000000000000000013021477326011500213770ustar00rootroot00000000000000# Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) #============================================================================= # no test comparison at this time #============================================================================= mpirun -np 1 ./maxwell_unscaled -in sstruct.in.maxwell3d_unscaled -solver 1 \ > maxwell.out.0 mpirun -np 2 ./maxwell_unscaled -in sstruct.in.maxwell3d_unscaled -solver 1 \ -P 2 1 1 > maxwell.out.1 mpirun -np 2 ./maxwell_unscaled -in sstruct.in.maxwell3d_unscaled -solver 1 \ -P 2 1 1 -r 2 3 1 > maxwell.out.2 hypre-2.33.0/src/test/TEST_sstruct/maxwell.saved000066400000000000000000000004161477326011500215460ustar00rootroot00000000000000# Output file: maxwell.out.0 Iterations = 10 Final Relative Residual Norm = 2.477002e-09 # Output file: maxwell.out.1 Iterations = 10 Final Relative Residual Norm = 3.772486e-09 # Output file: maxwell.out.2 Iterations = 10 Final Relative Residual Norm = 7.155830e-09 hypre-2.33.0/src/test/TEST_sstruct/maxwell.saved.lassen000066400000000000000000000004161477326011500230320ustar00rootroot00000000000000# Output file: maxwell.out.0 Iterations = 10 Final Relative Residual Norm = 2.480102e-09 # Output file: maxwell.out.1 Iterations = 10 Final Relative Residual Norm = 3.782219e-09 # Output file: maxwell.out.2 Iterations = 10 Final Relative Residual Norm = 7.164797e-09 hypre-2.33.0/src/test/TEST_sstruct/maxwell.saved.lassen_cpu000066400000000000000000000004161477326011500237010ustar00rootroot00000000000000# Output file: maxwell.out.0 Iterations = 10 Final Relative Residual Norm = 2.476905e-09 # Output file: maxwell.out.1 Iterations = 10 Final Relative Residual Norm = 3.773173e-09 # Output file: maxwell.out.2 Iterations = 10 Final Relative Residual Norm = 7.155215e-09 hypre-2.33.0/src/test/TEST_sstruct/maxwell.sh000077500000000000000000000036441477326011500210670ustar00rootroot00000000000000#!/bin/bash # Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) TNAME=`basename $0 .sh` RTOL=$1 ATOL=$2 #============================================================================= # no test comparison for now. Just a holder file with fake tests. Hard to # develop tests because of the coarsening scheme. #============================================================================= tail -3 ${TNAME}.out.0 > ${TNAME}.testdata tail -3 ${TNAME}.out.0 > ${TNAME}.testdata.temp (../runcheck.sh ${TNAME}.testdata ${TNAME}.testdata.temp $RTOL $ATOL) >&2 #============================================================================= tail -3 ${TNAME}.out.1 > ${TNAME}.testdata tail -3 ${TNAME}.out.1 > ${TNAME}.testdata.temp (../runcheck.sh ${TNAME}.testdata ${TNAME}.testdata.temp $RTOL $ATOL) >&2 #============================================================================= tail -3 ${TNAME}.out.2 > ${TNAME}.testdata tail -3 ${TNAME}.out.2 > ${TNAME}.testdata.temp (../runcheck.sh ${TNAME}.testdata ${TNAME}.testdata.temp $RTOL $ATOL) >&2 #============================================================================= # compare with baseline case #============================================================================= FILES="\ ${TNAME}.out.0\ ${TNAME}.out.1\ ${TNAME}.out.2\ " for i in $FILES do echo "# Output file: $i" tail -3 $i done > ${TNAME}.out # Make sure that the output file is reasonable RUNCOUNT=`echo $FILES | wc -w` OUTCOUNT=`grep "Iterations" ${TNAME}.out | wc -l` if [ "$OUTCOUNT" != "$RUNCOUNT" ]; then echo "Incorrect number of runs in ${TNAME}.out" >&2 fi #============================================================================= # remove temporary files #============================================================================= rm -f ${TNAME}.testdata* hypre-2.33.0/src/test/TEST_sstruct/miller.jobs000077500000000000000000000026431477326011500212230ustar00rootroot00000000000000#!/bin/bash # Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) #============================================================================= # sstruct: Run all of the solvers #============================================================================= mpirun -np 2 ./sstruct -in sstruct.in.miller_2blk -r 5 10 1 -P 2 1 1 \ -solver 11 > miller.out.0 mpirun -np 2 ./sstruct -in sstruct.in.miller_2blk -r 5 10 1 -P 2 1 1 \ -solver 20 -old_default > miller.out.1 mpirun -np 2 ./sstruct -in sstruct.in.miller_2blk1 -r 5 10 1 -P 2 1 1 \ -solver 11 > miller.out.2 mpirun -np 2 ./sstruct -in sstruct.in.miller_2blk1 -r 5 10 1 -P 2 1 1 \ -solver 20 > miller.out.3 mpirun -np 2 ./sstruct -in sstruct.in.miller_2stk -r 5 10 1 -P 2 1 1 \ -solver 11 > miller.out.4 mpirun -np 2 ./sstruct -in sstruct.in.miller_2stk -r 5 10 1 -P 2 1 1 \ -solver 20 -old_default > miller.out.5 mpirun -np 2 ./sstruct -in sstruct.in.miller_3blk -r 5 10 1 -P 2 1 1 \ -solver 11 > miller.out.6 mpirun -np 2 ./sstruct -in sstruct.in.miller_3blk -r 5 10 1 -P 2 1 1 \ -solver 20 -old_default > miller.out.7 mpirun -np 2 ./sstruct -in sstruct.in.miller_diag -r 10 20 1 -P 2 1 1 \ -solver 11 > miller.out.8 mpirun -np 2 ./sstruct -in sstruct.in.miller_diag -r 10 20 1 -P 2 1 1 \ -solver 20 > miller.out.9 hypre-2.33.0/src/test/TEST_sstruct/miller.saved000066400000000000000000000015641477326011500213660ustar00rootroot00000000000000# Output file: miller.out.0 Iterations = 16 Final Relative Residual Norm = 8.455333e-07 # Output file: miller.out.1 Iterations = 6 Final Relative Residual Norm = 9.625406e-08 # Output file: miller.out.2 Iterations = 15 Final Relative Residual Norm = 6.496892e-07 # Output file: miller.out.3 Iterations = 5 Final Relative Residual Norm = 4.230245e-07 # Output file: miller.out.4 Iterations = 18 Final Relative Residual Norm = 3.006677e-07 # Output file: miller.out.5 Iterations = 6 Final Relative Residual Norm = 8.758757e-08 # Output file: miller.out.6 Iterations = 37 Final Relative Residual Norm = 6.181674e-07 # Output file: miller.out.7 Iterations = 5 Final Relative Residual Norm = 8.323418e-07 # Output file: miller.out.8 Iterations = 3 Final Relative Residual Norm = 4.822192e-07 # Output file: miller.out.9 Iterations = 2 Final Relative Residual Norm = 2.571870e-07 hypre-2.33.0/src/test/TEST_sstruct/miller.saved.lassen000066400000000000000000000015641477326011500226520ustar00rootroot00000000000000# Output file: miller.out.0 Iterations = 16 Final Relative Residual Norm = 8.455333e-07 # Output file: miller.out.1 Iterations = 7 Final Relative Residual Norm = 3.361152e-07 # Output file: miller.out.2 Iterations = 15 Final Relative Residual Norm = 6.496892e-07 # Output file: miller.out.3 Iterations = 9 Final Relative Residual Norm = 4.304655e-07 # Output file: miller.out.4 Iterations = 18 Final Relative Residual Norm = 3.006677e-07 # Output file: miller.out.5 Iterations = 7 Final Relative Residual Norm = 1.958737e-07 # Output file: miller.out.6 Iterations = 37 Final Relative Residual Norm = 6.181674e-07 # Output file: miller.out.7 Iterations = 7 Final Relative Residual Norm = 7.661617e-07 # Output file: miller.out.8 Iterations = 3 Final Relative Residual Norm = 4.822192e-07 # Output file: miller.out.9 Iterations = 2 Final Relative Residual Norm = 2.571870e-07 hypre-2.33.0/src/test/TEST_sstruct/miller.saved.lassen_cpu000066400000000000000000000015641477326011500235210ustar00rootroot00000000000000# Output file: miller.out.0 Iterations = 16 Final Relative Residual Norm = 8.455333e-07 # Output file: miller.out.1 Iterations = 6 Final Relative Residual Norm = 9.625406e-08 # Output file: miller.out.2 Iterations = 15 Final Relative Residual Norm = 6.496892e-07 # Output file: miller.out.3 Iterations = 5 Final Relative Residual Norm = 4.213555e-07 # Output file: miller.out.4 Iterations = 18 Final Relative Residual Norm = 3.006677e-07 # Output file: miller.out.5 Iterations = 6 Final Relative Residual Norm = 8.758757e-08 # Output file: miller.out.6 Iterations = 37 Final Relative Residual Norm = 6.181674e-07 # Output file: miller.out.7 Iterations = 5 Final Relative Residual Norm = 8.323418e-07 # Output file: miller.out.8 Iterations = 3 Final Relative Residual Norm = 4.822192e-07 # Output file: miller.out.9 Iterations = 2 Final Relative Residual Norm = 2.571870e-07 hypre-2.33.0/src/test/TEST_sstruct/miller.sh000077500000000000000000000021621477326011500206740ustar00rootroot00000000000000#!/bin/bash # Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) TNAME=`basename $0 .sh` RTOL=$1 ATOL=$2 #============================================================================= # compare with baseline case #============================================================================= FILES="\ ${TNAME}.out.0\ ${TNAME}.out.1\ ${TNAME}.out.2\ ${TNAME}.out.3\ ${TNAME}.out.4\ ${TNAME}.out.5\ ${TNAME}.out.6\ ${TNAME}.out.7\ ${TNAME}.out.8\ ${TNAME}.out.9\ " for i in $FILES do echo "# Output file: $i" tail -3 $i done > ${TNAME}.out # Make sure that the output file is reasonable RUNCOUNT=`echo $FILES | wc -w` OUTCOUNT=`grep "Iterations" ${TNAME}.out | wc -l` if [ "$OUTCOUNT" != "$RUNCOUNT" ]; then echo "Incorrect number of runs in ${TNAME}.out" >&2 fi #============================================================================= # remove temporary files #============================================================================= # rm -f ${TNAME}.testdata* hypre-2.33.0/src/test/TEST_sstruct/neighborpart.jobs000077500000000000000000000037741477326011500224310ustar00rootroot00000000000000#!/bin/bash # Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) mpirun -np 1 ./sstruct -in sstruct.in.fe_node1_2D -solver 8 -rhsone \ > neighborpart.out.0 mpirun -np 2 ./sstruct -in sstruct.in.fe_node2_2D -solver 8 -rhsone \ > neighborpart.out.1 mpirun -np 2 ./sstruct -in sstruct.in.fe_node2_2D_coord -solver 8 -rhsone \ > neighborpart.out.2 mpirun -np 1 ./struct -n 5 5 1 -d 2 -solver 8 \ > neighborpart.out.3 mpirun -np 2 ./sstruct -in sstruct.in.fe_all2_2D -solver 8 -rhsone \ > neighborpart.out.10 mpirun -np 2 ./sstruct -in sstruct.in.fe_all2_2D_coord -solver 8 -rhsone \ > neighborpart.out.11 mpirun -np 2 ./sstruct -in sstruct.in.fe_all2_3D -solver 8 -rhsone \ > neighborpart.out.20 mpirun -np 2 ./sstruct -in sstruct.in.fe_all2_3D_coord -solver 8 -rhsone \ > neighborpart.out.21 mpirun -np 2 ./sstruct -in sstruct.in.fe_all2_2D -r 2 1 1 -solver 8 -rhsone \ > neighborpart.out.30 mpirun -np 2 ./sstruct -in sstruct.in.fe_all2_2D -b 2 1 1 -solver 8 -rhsone \ > neighborpart.out.31 mpirun -np 4 ./sstruct -in sstruct.in.fe_all2_2D -P 2 1 1 -solver 8 -rhsone \ > neighborpart.out.32 mpirun -np 1 ./sstruct -in sstruct.in.fe_all3_3D -solver 8 -rhsone \ > neighborpart.out.40 mpirun -np 1 ./sstruct -in sstruct.in.fe_all3_3D_coord -solver 8 -rhsone \ > neighborpart.out.41 mpirun -np 1 ./sstruct -in sstruct.in.fe_all3_3D -r 1 1 2 -solver 8 -rhsone \ > neighborpart.out.50 mpirun -np 1 ./sstruct -in sstruct.in.fe_all3_3D -b 1 1 2 -solver 8 -rhsone \ > neighborpart.out.51 mpirun -np 2 ./sstruct -in sstruct.in.fe_all3_3D -P 1 1 2 -solver 8 -rhsone \ > neighborpart.out.52 mpirun -np 2 ./sstruct -in sstruct.in.fe_all2_2D -solver 28 -rhsone \ > neighborpart.out.60 mpirun -np 2 ./sstruct -in sstruct.in.fe_all2_2Ds -solver 28 -rhsone \ > neighborpart.out.61 mpirun -np 2 ./sstruct -in sstruct.in.fe_all2_2Dss -solver 28 -rhsone \ > neighborpart.out.62 hypre-2.33.0/src/test/TEST_sstruct/neighborpart.saved000066400000000000000000000034311477326011500225610ustar00rootroot00000000000000# Output file: neighborpart.out.0 Iterations = 96 Final Relative Residual Norm = 9.348679e-07 # Output file: neighborpart.out.1 Iterations = 96 Final Relative Residual Norm = 9.348679e-07 # Output file: neighborpart.out.2 Iterations = 96 Final Relative Residual Norm = 9.348679e-07 # Output file: neighborpart.out.3 Iterations = 96 Final Relative Residual Norm = 9.348679e-07 # Output file: neighborpart.out.10 Iterations = 16 Final Relative Residual Norm = 4.551724e-07 # Output file: neighborpart.out.11 Iterations = 16 Final Relative Residual Norm = 4.551724e-07 # Output file: neighborpart.out.20 Iterations = 48 Final Relative Residual Norm = 8.933706e-07 # Output file: neighborpart.out.21 Iterations = 48 Final Relative Residual Norm = 8.933706e-07 # Output file: neighborpart.out.30 Iterations = 16 Final Relative Residual Norm = 4.498034e-07 # Output file: neighborpart.out.31 Iterations = 16 Final Relative Residual Norm = 4.498034e-07 # Output file: neighborpart.out.32 Iterations = 16 Final Relative Residual Norm = 4.498034e-07 # Output file: neighborpart.out.40 Iterations = 48 Final Relative Residual Norm = 8.804864e-07 # Output file: neighborpart.out.41 Iterations = 48 Final Relative Residual Norm = 8.804864e-07 # Output file: neighborpart.out.50 Iterations = 48 Final Relative Residual Norm = 8.604821e-07 # Output file: neighborpart.out.51 Iterations = 48 Final Relative Residual Norm = 8.604821e-07 # Output file: neighborpart.out.52 Iterations = 48 Final Relative Residual Norm = 8.604821e-07 # Output file: neighborpart.out.60 Iterations = 5 Final Relative Residual Norm = 5.456678e-18 # Output file: neighborpart.out.61 Iterations = 5 Final Relative Residual Norm = 5.456678e-18 # Output file: neighborpart.out.62 Iterations = 5 Final Relative Residual Norm = 5.456678e-18 hypre-2.33.0/src/test/TEST_sstruct/neighborpart.saved.lassen000066400000000000000000000034311477326011500240450ustar00rootroot00000000000000# Output file: neighborpart.out.0 Iterations = 96 Final Relative Residual Norm = 9.348679e-07 # Output file: neighborpart.out.1 Iterations = 96 Final Relative Residual Norm = 9.348679e-07 # Output file: neighborpart.out.2 Iterations = 96 Final Relative Residual Norm = 9.348679e-07 # Output file: neighborpart.out.3 Iterations = 96 Final Relative Residual Norm = 9.348679e-07 # Output file: neighborpart.out.10 Iterations = 16 Final Relative Residual Norm = 4.551724e-07 # Output file: neighborpart.out.11 Iterations = 16 Final Relative Residual Norm = 4.551724e-07 # Output file: neighborpart.out.20 Iterations = 48 Final Relative Residual Norm = 8.933706e-07 # Output file: neighborpart.out.21 Iterations = 48 Final Relative Residual Norm = 8.933706e-07 # Output file: neighborpart.out.30 Iterations = 16 Final Relative Residual Norm = 4.498034e-07 # Output file: neighborpart.out.31 Iterations = 16 Final Relative Residual Norm = 4.498034e-07 # Output file: neighborpart.out.32 Iterations = 16 Final Relative Residual Norm = 4.498034e-07 # Output file: neighborpart.out.40 Iterations = 48 Final Relative Residual Norm = 8.804864e-07 # Output file: neighborpart.out.41 Iterations = 48 Final Relative Residual Norm = 8.804864e-07 # Output file: neighborpart.out.50 Iterations = 48 Final Relative Residual Norm = 8.604821e-07 # Output file: neighborpart.out.51 Iterations = 48 Final Relative Residual Norm = 8.604821e-07 # Output file: neighborpart.out.52 Iterations = 48 Final Relative Residual Norm = 8.604821e-07 # Output file: neighborpart.out.60 Iterations = 5 Final Relative Residual Norm = 3.281199e-18 # Output file: neighborpart.out.61 Iterations = 5 Final Relative Residual Norm = 3.281199e-18 # Output file: neighborpart.out.62 Iterations = 5 Final Relative Residual Norm = 3.281199e-18 hypre-2.33.0/src/test/TEST_sstruct/neighborpart.saved.lassen_cpu000066400000000000000000000034311477326011500247140ustar00rootroot00000000000000# Output file: neighborpart.out.0 Iterations = 96 Final Relative Residual Norm = 9.348679e-07 # Output file: neighborpart.out.1 Iterations = 96 Final Relative Residual Norm = 9.348679e-07 # Output file: neighborpart.out.2 Iterations = 96 Final Relative Residual Norm = 9.348679e-07 # Output file: neighborpart.out.3 Iterations = 96 Final Relative Residual Norm = 9.348679e-07 # Output file: neighborpart.out.10 Iterations = 16 Final Relative Residual Norm = 4.551724e-07 # Output file: neighborpart.out.11 Iterations = 16 Final Relative Residual Norm = 4.551724e-07 # Output file: neighborpart.out.20 Iterations = 48 Final Relative Residual Norm = 8.933706e-07 # Output file: neighborpart.out.21 Iterations = 48 Final Relative Residual Norm = 8.933706e-07 # Output file: neighborpart.out.30 Iterations = 16 Final Relative Residual Norm = 4.498034e-07 # Output file: neighborpart.out.31 Iterations = 16 Final Relative Residual Norm = 4.498034e-07 # Output file: neighborpart.out.32 Iterations = 16 Final Relative Residual Norm = 4.498034e-07 # Output file: neighborpart.out.40 Iterations = 48 Final Relative Residual Norm = 8.804864e-07 # Output file: neighborpart.out.41 Iterations = 48 Final Relative Residual Norm = 8.804864e-07 # Output file: neighborpart.out.50 Iterations = 48 Final Relative Residual Norm = 8.604821e-07 # Output file: neighborpart.out.51 Iterations = 48 Final Relative Residual Norm = 8.604821e-07 # Output file: neighborpart.out.52 Iterations = 48 Final Relative Residual Norm = 8.604821e-07 # Output file: neighborpart.out.60 Iterations = 5 Final Relative Residual Norm = 6.242460e-18 # Output file: neighborpart.out.61 Iterations = 5 Final Relative Residual Norm = 6.242460e-18 # Output file: neighborpart.out.62 Iterations = 5 Final Relative Residual Norm = 6.242460e-18 hypre-2.33.0/src/test/TEST_sstruct/neighborpart.sh000077500000000000000000000057701477326011500221040ustar00rootroot00000000000000#!/bin/bash # Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) TNAME=`basename $0 .sh` RTOL=$1 ATOL=$2 #============================================================================= # Test SetNeighborPart by comparing one-part problem against # equivalent multi-part problems #============================================================================= tail -3 ${TNAME}.out.0 > ${TNAME}.testdata for i in 1 2 3 do tail -3 ${TNAME}.out.$i > ${TNAME}.testdata.temp (../runcheck.sh ${TNAME}.testdata ${TNAME}.testdata.temp $RTOL $ATOL) >&2 done #============================================================================= # Test SetNeighborPart by comparing multi-part problems #============================================================================= tail -3 ${TNAME}.out.10 > ${TNAME}.testdata tail -3 ${TNAME}.out.11 > ${TNAME}.testdata.temp (../runcheck.sh ${TNAME}.testdata ${TNAME}.testdata.temp $RTOL $ATOL) >&2 tail -3 ${TNAME}.out.20 > ${TNAME}.testdata tail -3 ${TNAME}.out.21 > ${TNAME}.testdata.temp (../runcheck.sh ${TNAME}.testdata ${TNAME}.testdata.temp $RTOL $ATOL) >&2 tail -3 ${TNAME}.out.30 > ${TNAME}.testdata for i in 31 32 do tail -3 ${TNAME}.out.$i > ${TNAME}.testdata.temp (../runcheck.sh ${TNAME}.testdata ${TNAME}.testdata.temp $RTOL $ATOL) >&2 done tail -3 ${TNAME}.out.40 > ${TNAME}.testdata tail -3 ${TNAME}.out.41 > ${TNAME}.testdata.temp (../runcheck.sh ${TNAME}.testdata ${TNAME}.testdata.temp $RTOL $ATOL) >&2 tail -3 ${TNAME}.out.50 > ${TNAME}.testdata for i in 51 52 do tail -3 ${TNAME}.out.$i > ${TNAME}.testdata.temp (../runcheck.sh ${TNAME}.testdata ${TNAME}.testdata.temp $RTOL $ATOL) >&2 done tail -3 ${TNAME}.out.60 > ${TNAME}.testdata for i in 61 62 do tail -3 ${TNAME}.out.$i > ${TNAME}.testdata.temp (../runcheck.sh ${TNAME}.testdata ${TNAME}.testdata.temp $RTOL $ATOL) >&2 done #============================================================================= # compare with baseline case #============================================================================= FILES="\ ${TNAME}.out.0\ ${TNAME}.out.1\ ${TNAME}.out.2\ ${TNAME}.out.3\ ${TNAME}.out.10\ ${TNAME}.out.11\ ${TNAME}.out.20\ ${TNAME}.out.21\ ${TNAME}.out.30\ ${TNAME}.out.31\ ${TNAME}.out.32\ ${TNAME}.out.40\ ${TNAME}.out.41\ ${TNAME}.out.50\ ${TNAME}.out.51\ ${TNAME}.out.52\ ${TNAME}.out.60\ ${TNAME}.out.61\ ${TNAME}.out.62\ " for i in $FILES do echo "# Output file: $i" tail -3 $i done > ${TNAME}.out # Make sure that the output file is reasonable RUNCOUNT=`echo $FILES | wc -w` OUTCOUNT=`grep "Iterations" ${TNAME}.out | wc -l` if [ "$OUTCOUNT" != "$RUNCOUNT" ]; then echo "Incorrect number of runs in ${TNAME}.out" >&2 fi #============================================================================= # remove temporary files #============================================================================= rm -f ${TNAME}.testdata* hypre-2.33.0/src/test/TEST_sstruct/neumann.jobs000077500000000000000000000036601477326011500214000ustar00rootroot00000000000000#!/bin/bash # Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) #============================================================================= # sstruct: Run base 3d cases #============================================================================= # Neumann in x, y, and z mpirun -np 1 ./sstruct -in sstruct.in.neumann -r 6 6 6 -solver 200 > neumann.out.0 mpirun -np 1 ./sstruct -in sstruct.in.neumann -r 6 6 6 -solver 201 > neumann.out.1 # Neumann in y and z (Dirichlet in x) mpirun -np 1 ./sstruct -in sstruct.in.neumann-yz -r 6 6 6 -solver 200 > neumann.out.10 mpirun -np 1 ./sstruct -in sstruct.in.neumann-yz -r 6 6 6 -solver 201 > neumann.out.11 # All Dirichlet just for fun mpirun -np 1 ./sstruct -in sstruct.in.dirichlet -r 6 6 6 -solver 200 > neumann.out.20 mpirun -np 1 ./sstruct -in sstruct.in.dirichlet -r 6 6 6 -solver 201 > neumann.out.21 #============================================================================= # sstruct: Run various blockings and distributions #============================================================================= # Neumann in x, y, and z mpirun -np 4 ./sstruct -in sstruct.in.neumann -P 2 2 1 -b 1 3 2 -r 3 1 3 -solver 200 > neumann.out.2 mpirun -np 3 ./sstruct -in sstruct.in.neumann -P 1 1 3 -b 6 1 1 -r 1 6 2 -solver 201 > neumann.out.3 # Neumann in y and z (Dirichlet in x) mpirun -np 4 ./sstruct -in sstruct.in.neumann-yz -P 2 2 1 -b 1 3 2 -r 3 1 3 -solver 200 > neumann.out.12 mpirun -np 3 ./sstruct -in sstruct.in.neumann-yz -P 1 1 3 -b 6 1 1 -r 1 6 2 -solver 201 > neumann.out.13 # All Dirichlet just for fun mpirun -np 4 ./sstruct -in sstruct.in.dirichlet -P 2 2 1 -b 1 3 2 -r 3 1 3 -solver 200 > neumann.out.22 mpirun -np 3 ./sstruct -in sstruct.in.dirichlet -P 1 1 3 -b 6 1 1 -r 1 6 2 -solver 201 > neumann.out.23 hypre-2.33.0/src/test/TEST_sstruct/neumann.saved000066400000000000000000000020721477326011500215360ustar00rootroot00000000000000# Output file: neumann.out.0 Iterations = 6 Final Relative Residual Norm = 2.366245e-07 # Output file: neumann.out.1 Iterations = 22 Final Relative Residual Norm = 8.557340e-07 # Output file: neumann.out.2 Iterations = 6 Final Relative Residual Norm = 2.366245e-07 # Output file: neumann.out.3 Iterations = 22 Final Relative Residual Norm = 8.557340e-07 # Output file: neumann.out.10 Iterations = 6 Final Relative Residual Norm = 1.060090e-07 # Output file: neumann.out.11 Iterations = 17 Final Relative Residual Norm = 9.831767e-07 # Output file: neumann.out.12 Iterations = 6 Final Relative Residual Norm = 1.060090e-07 # Output file: neumann.out.13 Iterations = 17 Final Relative Residual Norm = 9.831767e-07 # Output file: neumann.out.20 Iterations = 4 Final Relative Residual Norm = 7.968831e-07 # Output file: neumann.out.21 Iterations = 16 Final Relative Residual Norm = 7.270873e-07 # Output file: neumann.out.22 Iterations = 4 Final Relative Residual Norm = 7.968831e-07 # Output file: neumann.out.23 Iterations = 16 Final Relative Residual Norm = 7.270873e-07 hypre-2.33.0/src/test/TEST_sstruct/neumann.saved.lassen000066400000000000000000000020721477326011500230220ustar00rootroot00000000000000# Output file: neumann.out.0 Iterations = 6 Final Relative Residual Norm = 2.366245e-07 # Output file: neumann.out.1 Iterations = 22 Final Relative Residual Norm = 8.557340e-07 # Output file: neumann.out.2 Iterations = 6 Final Relative Residual Norm = 2.366245e-07 # Output file: neumann.out.3 Iterations = 22 Final Relative Residual Norm = 8.557340e-07 # Output file: neumann.out.10 Iterations = 6 Final Relative Residual Norm = 1.060090e-07 # Output file: neumann.out.11 Iterations = 17 Final Relative Residual Norm = 9.831767e-07 # Output file: neumann.out.12 Iterations = 6 Final Relative Residual Norm = 1.060090e-07 # Output file: neumann.out.13 Iterations = 17 Final Relative Residual Norm = 9.831767e-07 # Output file: neumann.out.20 Iterations = 4 Final Relative Residual Norm = 7.968831e-07 # Output file: neumann.out.21 Iterations = 16 Final Relative Residual Norm = 7.270873e-07 # Output file: neumann.out.22 Iterations = 4 Final Relative Residual Norm = 7.968831e-07 # Output file: neumann.out.23 Iterations = 16 Final Relative Residual Norm = 7.270873e-07 hypre-2.33.0/src/test/TEST_sstruct/neumann.saved.lassen_cpu000066400000000000000000000020721477326011500236710ustar00rootroot00000000000000# Output file: neumann.out.0 Iterations = 6 Final Relative Residual Norm = 2.366245e-07 # Output file: neumann.out.1 Iterations = 22 Final Relative Residual Norm = 8.557340e-07 # Output file: neumann.out.2 Iterations = 6 Final Relative Residual Norm = 2.366245e-07 # Output file: neumann.out.3 Iterations = 22 Final Relative Residual Norm = 8.557340e-07 # Output file: neumann.out.10 Iterations = 6 Final Relative Residual Norm = 1.060090e-07 # Output file: neumann.out.11 Iterations = 17 Final Relative Residual Norm = 9.831767e-07 # Output file: neumann.out.12 Iterations = 6 Final Relative Residual Norm = 1.060090e-07 # Output file: neumann.out.13 Iterations = 17 Final Relative Residual Norm = 9.831767e-07 # Output file: neumann.out.20 Iterations = 4 Final Relative Residual Norm = 7.968831e-07 # Output file: neumann.out.21 Iterations = 16 Final Relative Residual Norm = 7.270873e-07 # Output file: neumann.out.22 Iterations = 4 Final Relative Residual Norm = 7.968831e-07 # Output file: neumann.out.23 Iterations = 16 Final Relative Residual Norm = 7.270873e-07 hypre-2.33.0/src/test/TEST_sstruct/neumann.sh000077500000000000000000000044541477326011500210570ustar00rootroot00000000000000#!/bin/bash # Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) TNAME=`basename $0 .sh` RTOL=$1 ATOL=$2 #============================================================================= # sstruct: Test various blockings and distributions of default problem #============================================================================= tail -3 ${TNAME}.out.0 > ${TNAME}.testdata tail -3 ${TNAME}.out.2 > ${TNAME}.testdata.temp diff ${TNAME}.testdata ${TNAME}.testdata.temp >&2 tail -3 ${TNAME}.out.10 > ${TNAME}.testdata tail -3 ${TNAME}.out.12 > ${TNAME}.testdata.temp diff ${TNAME}.testdata ${TNAME}.testdata.temp >&2 tail -3 ${TNAME}.out.20 > ${TNAME}.testdata tail -3 ${TNAME}.out.22 > ${TNAME}.testdata.temp diff ${TNAME}.testdata ${TNAME}.testdata.temp >&2 #============================================================================= tail -3 ${TNAME}.out.1 > ${TNAME}.testdata tail -3 ${TNAME}.out.3 > ${TNAME}.testdata.temp diff ${TNAME}.testdata ${TNAME}.testdata.temp >&2 tail -3 ${TNAME}.out.11 > ${TNAME}.testdata tail -3 ${TNAME}.out.13 > ${TNAME}.testdata.temp diff ${TNAME}.testdata ${TNAME}.testdata.temp >&2 tail -3 ${TNAME}.out.21 > ${TNAME}.testdata tail -3 ${TNAME}.out.23 > ${TNAME}.testdata.temp diff ${TNAME}.testdata ${TNAME}.testdata.temp >&2 #============================================================================= # compare with baseline case #============================================================================= FILES="\ ${TNAME}.out.0\ ${TNAME}.out.1\ ${TNAME}.out.2\ ${TNAME}.out.3\ ${TNAME}.out.10\ ${TNAME}.out.11\ ${TNAME}.out.12\ ${TNAME}.out.13\ ${TNAME}.out.20\ ${TNAME}.out.21\ ${TNAME}.out.22\ ${TNAME}.out.23\ " for i in $FILES do echo "# Output file: $i" tail -3 $i done > ${TNAME}.out # Make sure that the output file is reasonable RUNCOUNT=`echo $FILES | wc -w` OUTCOUNT=`grep "Iterations" ${TNAME}.out | wc -l` if [ "$OUTCOUNT" != "$RUNCOUNT" ]; then echo "Incorrect number of runs in ${TNAME}.out" >&2 fi #============================================================================= # remove temporary files #============================================================================= rm -f ${TNAME}.testdata* hypre-2.33.0/src/test/TEST_sstruct/nonmixedint.jobs000077500000000000000000000026301477326011500222670ustar00rootroot00000000000000#!/bin/bash # Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) #============================================================================= # sstruct: cases that cannot run with mixed-int # 0: solvers.out.5 # 1: solvers.out.6 # 2: solvers.out.12 # 3: solvers.out.13 # 4: emptyProc.out.06 # 5: emptyProc.out.14 # 6: emptyProc.out.20 # 14: emptyProc.out.106 # 15: emptyProc.out.114 # 16: emptyProc.out.120 #============================================================================= mpirun -np 2 ./sstruct -P 1 1 2 -solver 21 > nonmixedint.out.0 mpirun -np 2 ./sstruct -P 1 1 2 -solver 22 > nonmixedint.out.1 mpirun -np 2 ./sstruct -P 1 1 2 -solver 41 > nonmixedint.out.2 mpirun -np 2 ./sstruct -P 1 1 2 -solver 42 > nonmixedint.out.3 mpirun -np 2 ./sstruct -in sstruct.in.emptyProc1 -rhsone -solver 22 > nonmixedint.out.4 mpirun -np 2 ./sstruct -in sstruct.in.emptyProc3 -rhsone -solver 22 > nonmixedint.out.14 mpirun -np 2 ./sstruct -in sstruct.in.emptyProc1 -rhsone -solver 42 > nonmixedint.out.5 mpirun -np 2 ./sstruct -in sstruct.in.emptyProc3 -rhsone -solver 42 > nonmixedint.out.15 mpirun -np 2 ./sstruct -in sstruct.in.emptyProc1 -rhsone -solver 62 > nonmixedint.out.6 mpirun -np 2 ./sstruct -in sstruct.in.emptyProc3 -rhsone -solver 62 > nonmixedint.out.16 hypre-2.33.0/src/test/TEST_sstruct/nonmixedint.saved000066400000000000000000000012161477326011500224300ustar00rootroot00000000000000# Output file: nonmixedint.out.0 Iterations = 7 Final Relative Residual Norm = 2.672054e-07 # Output file: nonmixedint.out.1 Iterations = 25 Final Relative Residual Norm = 9.124482e-07 # Output file: nonmixedint.out.2 Iterations = 7 Final Relative Residual Norm = 3.319145e-07 # Output file: nonmixedint.out.3 Iterations = 31 Final Relative Residual Norm = 7.336388e-07 # Output file: nonmixedint.out.4 Iterations = 15 Final Relative Residual Norm = 6.369593e-07 # Output file: nonmixedint.out.5 Iterations = 17 Final Relative Residual Norm = 6.043891e-07 # Output file: nonmixedint.out.6 Iterations = 8 Final Relative Residual Norm = 7.771825e-07 hypre-2.33.0/src/test/TEST_sstruct/nonmixedint.saved.lassen000066400000000000000000000012171477326011500237150ustar00rootroot00000000000000# Output file: nonmixedint.out.0 Iterations = 7 Final Relative Residual Norm = 2.672054e-07 # Output file: nonmixedint.out.1 Iterations = 25 Final Relative Residual Norm = 9.124482e-07 # Output file: nonmixedint.out.2 Iterations = 7 Final Relative Residual Norm = 3.319145e-07 # Output file: nonmixedint.out.3 Iterations = 31 Final Relative Residual Norm = 7.336388e-07 # Output file: nonmixedint.out.4 Iterations = 15 Final Relative Residual Norm = 6.369593e-07 # Output file: nonmixedint.out.5 Iterations = 17 Final Relative Residual Norm = 6.043891e-07 # Output file: nonmixedint.out.6 Iterations = 8 Final Relative Residual Norm = 7.771825e-07 hypre-2.33.0/src/test/TEST_sstruct/nonmixedint.saved.lassen_cpu000066400000000000000000000012171477326011500245640ustar00rootroot00000000000000# Output file: nonmixedint.out.0 Iterations = 7 Final Relative Residual Norm = 2.672054e-07 # Output file: nonmixedint.out.1 Iterations = 25 Final Relative Residual Norm = 9.124482e-07 # Output file: nonmixedint.out.2 Iterations = 7 Final Relative Residual Norm = 3.319145e-07 # Output file: nonmixedint.out.3 Iterations = 31 Final Relative Residual Norm = 7.336388e-07 # Output file: nonmixedint.out.4 Iterations = 15 Final Relative Residual Norm = 6.369593e-07 # Output file: nonmixedint.out.5 Iterations = 17 Final Relative Residual Norm = 6.043891e-07 # Output file: nonmixedint.out.6 Iterations = 8 Final Relative Residual Norm = 7.771825e-07 hypre-2.33.0/src/test/TEST_sstruct/nonmixedint.sh000077500000000000000000000027441477326011500217520ustar00rootroot00000000000000#!/bin/bash # Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) TNAME=`basename $0 .sh` RTOL=$1 ATOL=$2 #============================================================================= # sstruct: Test various empty proc problems #============================================================================= TNUMS="4 5 6" for i in $TNUMS do tail -3 ${TNAME}.out.${i} > ${TNAME}.testdata tail -3 ${TNAME}.out.1${i} > ${TNAME}.testdata.temp (../runcheck.sh ${TNAME}.testdata ${TNAME}.testdata.temp $RTOL $ATOL) >&2 done #============================================================================= # compare with baseline case #============================================================================= FILES="\ ${TNAME}.out.0\ ${TNAME}.out.1\ ${TNAME}.out.2\ ${TNAME}.out.3\ ${TNAME}.out.4\ ${TNAME}.out.5\ ${TNAME}.out.6\ " for i in $FILES do echo "# Output file: $i" tail -3 $i done > ${TNAME}.out # Make sure that the output file is reasonable RUNCOUNT=`echo $FILES | wc -w` OUTCOUNT=`grep "Iterations" ${TNAME}.out | wc -l` if [ "$OUTCOUNT" != "$RUNCOUNT" ]; then echo "Incorrect number of runs in ${TNAME}.out" >&2 fi #============================================================================= # remove temporary files #============================================================================= rm -f ${TNAME}.testdata* hypre-2.33.0/src/test/TEST_sstruct/periodic.jobs000077500000000000000000000107511477326011500215340ustar00rootroot00000000000000#!/bin/bash # Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) #============================================================================= # Check SetNeighborBox for periodic problems (2D) #============================================================================= mpirun -np 1 ./sstruct -in sstruct.in.periodic.2D -r 20 20 1 -solver 11 > periodic.out.20 mpirun -np 2 ./sstruct -in sstruct.in.periodic.2D -r 20 10 1 -P 1 2 1 -solver 11 > periodic.out.21 #============================================================================= # Check SetNeighborBox for periodic problems (3D) #============================================================================= mpirun -np 1 ./sstruct -in sstruct.in.periodic -r 20 20 20 -solver 11 > periodic.out.30 mpirun -np 2 ./sstruct -in sstruct.in.periodic -r 20 20 10 -P 1 1 2 -solver 11 > periodic.out.31 #============================================================================= # Check SysPFMG for power-of-two and non-power-of-two systems #============================================================================= # power-of-two mpirun -np 1 ./sstruct -in sstruct.in.laps.periodic -r 16 16 1 -P 1 1 1 -solver 3 > periodic.out.40 mpirun -np 2 ./sstruct -in sstruct.in.laps.periodic -r 8 16 1 -P 2 1 1 -solver 3 > periodic.out.41 mpirun -np 2 ./sstruct -in sstruct.in.laps.periodic -r 16 8 1 -P 1 2 1 -solver 3 > periodic.out.42 # non-power-of-two mpirun -np 1 ./sstruct -in sstruct.in.laps.periodic -r 22 22 1 -P 1 1 1 -solver 3 > periodic.out.50 mpirun -np 2 ./sstruct -in sstruct.in.laps.periodic -r 11 22 1 -P 2 1 1 -solver 3 > periodic.out.51 mpirun -np 2 ./sstruct -in sstruct.in.laps.periodic -r 22 11 1 -P 1 2 1 -solver 3 > periodic.out.52 #============================================================================= # Check PFMG, SMG, and SysPFMG for problems with period larger than the grid #============================================================================= # First check that sstruct and struct are the same here mpirun -np 2 ./struct -d 2 -n 8 16 1 -P 2 1 1 -p 16 0 0 -istart 0 0 0 -solver 0 > periodic.out.60 mpirun -np 2 ./sstruct -in sstruct.in.periodic.bigA -r 1 2 1 -P 2 1 1 -rhsone -solver 200 > periodic.out.61 mpirun -np 2 ./struct -d 2 -n 8 16 1 -P 2 1 1 -p 16 0 0 -istart 0 0 0 -solver 1 > periodic.out.62 mpirun -np 2 ./sstruct -in sstruct.in.periodic.bigA -r 1 2 1 -P 2 1 1 -rhsone -solver 201 > periodic.out.63 mpirun -np 2 ./sstruct -in sstruct.in.periodic.bigB -r 3 6 1 -P 2 1 1 -rhsone -solver 200 > periodic.out.65 mpirun -np 2 ./sstruct -in sstruct.in.periodic.bigB -r 3 6 1 -P 2 1 1 -rhsone -solver 201 > periodic.out.66 mpirun -np 2 ./sstruct -in sstruct.in.periodic.bigB -r 3 6 1 -P 2 1 1 -rhsone -solver 3 > periodic.out.67 #============================================================================= # Check that reverse communication used to AddValues still works #============================================================================= mpirun -np 2 ./sstruct -in sstruct.in.periodic.add -solver 218 -P 1 1 2 > periodic.out.70 #============================================================================= # Check SetPeriodic for node/cell problems and STRUCT, SSTRUCT, PARCSR types #============================================================================= mpirun -np 6 ./sstruct -in sstruct.in.periodic.cellA -P 1 6 1 -solver 218 > periodic.out.80 mpirun -np 6 ./sstruct -in sstruct.in.periodic.cellA -P 1 6 1 -solver 18 > periodic.out.81 mpirun -np 6 ./sstruct -in sstruct.in.periodic.cellA -P 1 6 1 -solver 28 > periodic.out.82 mpirun -np 6 ./sstruct -in sstruct.in.periodic.cellB -P 1 6 1 -solver 218 > periodic.out.83 mpirun -np 6 ./sstruct -in sstruct.in.periodic.cellB -P 1 6 1 -solver 18 > periodic.out.84 mpirun -np 6 ./sstruct -in sstruct.in.periodic.cellB -P 1 6 1 -solver 28 > periodic.out.85 mpirun -np 6 ./sstruct -in sstruct.in.periodic.nodeA -P 1 6 1 -solver 218 > periodic.out.90 mpirun -np 6 ./sstruct -in sstruct.in.periodic.nodeA -P 1 6 1 -solver 18 > periodic.out.91 mpirun -np 6 ./sstruct -in sstruct.in.periodic.nodeA -P 1 6 1 -solver 28 > periodic.out.92 mpirun -np 6 ./sstruct -in sstruct.in.periodic.nodeB -P 1 6 1 -solver 218 > periodic.out.93 mpirun -np 6 ./sstruct -in sstruct.in.periodic.nodeB -P 1 6 1 -solver 18 > periodic.out.94 mpirun -np 6 ./sstruct -in sstruct.in.periodic.nodeB -P 1 6 1 -solver 28 > periodic.out.95 hypre-2.33.0/src/test/TEST_sstruct/periodic.saved000066400000000000000000000053051477326011500216750ustar00rootroot00000000000000# Output file: periodic.out.20 Iterations = 22 Final Relative Residual Norm = 8.597337e-07 # Output file: periodic.out.21 Iterations = 22 Final Relative Residual Norm = 8.597337e-07 # Output file: periodic.out.30 Iterations = 25 Final Relative Residual Norm = 7.560049e-07 # Output file: periodic.out.31 Iterations = 25 Final Relative Residual Norm = 7.560049e-07 # Output file: periodic.out.40 Iterations = 13 Final Relative Residual Norm = 3.737885e-07 # Output file: periodic.out.41 Iterations = 13 Final Relative Residual Norm = 3.737885e-07 # Output file: periodic.out.42 Iterations = 13 Final Relative Residual Norm = 3.737885e-07 # Output file: periodic.out.50 Iterations = 12 Final Relative Residual Norm = 8.626903e-07 # Output file: periodic.out.51 Iterations = 12 Final Relative Residual Norm = 8.626903e-07 # Output file: periodic.out.52 Iterations = 12 Final Relative Residual Norm = 8.626903e-07 # Output file: periodic.out.60 Iterations = 1 Final Relative Residual Norm = 9.132217e-15 # Output file: periodic.out.61 Iterations = 1 Final Relative Residual Norm = 9.132217e-15 # Output file: periodic.out.62 Iterations = 15 Final Relative Residual Norm = 4.630743e-07 # Output file: periodic.out.63 Iterations = 15 Final Relative Residual Norm = 4.630743e-07 # Output file: periodic.out.65 Iterations = 6 Final Relative Residual Norm = 9.221005e-07 # Output file: periodic.out.66 Iterations = 15 Final Relative Residual Norm = 5.012817e-07 # Output file: periodic.out.67 Iterations = 15 Final Relative Residual Norm = 5.012817e-07 # Output file: periodic.out.70 Iterations = 69 Final Relative Residual Norm = 8.673863e-07 # Output file: periodic.out.80 Iterations = 46 Final Relative Residual Norm = 7.750679e-07 # Output file: periodic.out.81 Iterations = 46 Final Relative Residual Norm = 7.750679e-07 # Output file: periodic.out.82 Iterations = 46 Final Relative Residual Norm = 7.750679e-07 # Output file: periodic.out.83 Iterations = 46 Final Relative Residual Norm = 7.750679e-07 # Output file: periodic.out.84 Iterations = 46 Final Relative Residual Norm = 7.750679e-07 # Output file: periodic.out.85 Iterations = 46 Final Relative Residual Norm = 7.750679e-07 # Output file: periodic.out.90 Iterations = 48 Final Relative Residual Norm = 8.594333e-07 # Output file: periodic.out.91 Iterations = 48 Final Relative Residual Norm = 8.594333e-07 # Output file: periodic.out.92 Iterations = 48 Final Relative Residual Norm = 8.594333e-07 # Output file: periodic.out.93 Iterations = 48 Final Relative Residual Norm = 8.594333e-07 # Output file: periodic.out.94 Iterations = 48 Final Relative Residual Norm = 8.594333e-07 # Output file: periodic.out.95 Iterations = 48 Final Relative Residual Norm = 8.594333e-07 hypre-2.33.0/src/test/TEST_sstruct/periodic.saved.lassen000066400000000000000000000053051477326011500231610ustar00rootroot00000000000000# Output file: periodic.out.20 Iterations = 22 Final Relative Residual Norm = 8.597337e-07 # Output file: periodic.out.21 Iterations = 22 Final Relative Residual Norm = 8.597337e-07 # Output file: periodic.out.30 Iterations = 25 Final Relative Residual Norm = 7.560049e-07 # Output file: periodic.out.31 Iterations = 25 Final Relative Residual Norm = 7.560049e-07 # Output file: periodic.out.40 Iterations = 13 Final Relative Residual Norm = 3.737885e-07 # Output file: periodic.out.41 Iterations = 13 Final Relative Residual Norm = 3.737885e-07 # Output file: periodic.out.42 Iterations = 13 Final Relative Residual Norm = 3.737885e-07 # Output file: periodic.out.50 Iterations = 12 Final Relative Residual Norm = 8.626903e-07 # Output file: periodic.out.51 Iterations = 12 Final Relative Residual Norm = 8.626903e-07 # Output file: periodic.out.52 Iterations = 12 Final Relative Residual Norm = 8.626903e-07 # Output file: periodic.out.60 Iterations = 1 Final Relative Residual Norm = 1.015323e-14 # Output file: periodic.out.61 Iterations = 1 Final Relative Residual Norm = 1.015323e-14 # Output file: periodic.out.62 Iterations = 15 Final Relative Residual Norm = 4.630743e-07 # Output file: periodic.out.63 Iterations = 15 Final Relative Residual Norm = 4.630743e-07 # Output file: periodic.out.65 Iterations = 6 Final Relative Residual Norm = 9.221005e-07 # Output file: periodic.out.66 Iterations = 15 Final Relative Residual Norm = 5.012817e-07 # Output file: periodic.out.67 Iterations = 15 Final Relative Residual Norm = 5.012817e-07 # Output file: periodic.out.70 Iterations = 69 Final Relative Residual Norm = 8.673863e-07 # Output file: periodic.out.80 Iterations = 46 Final Relative Residual Norm = 7.750679e-07 # Output file: periodic.out.81 Iterations = 46 Final Relative Residual Norm = 7.750679e-07 # Output file: periodic.out.82 Iterations = 46 Final Relative Residual Norm = 7.750679e-07 # Output file: periodic.out.83 Iterations = 46 Final Relative Residual Norm = 7.750679e-07 # Output file: periodic.out.84 Iterations = 46 Final Relative Residual Norm = 7.750679e-07 # Output file: periodic.out.85 Iterations = 46 Final Relative Residual Norm = 7.750679e-07 # Output file: periodic.out.90 Iterations = 48 Final Relative Residual Norm = 8.594333e-07 # Output file: periodic.out.91 Iterations = 48 Final Relative Residual Norm = 8.594333e-07 # Output file: periodic.out.92 Iterations = 48 Final Relative Residual Norm = 8.594333e-07 # Output file: periodic.out.93 Iterations = 48 Final Relative Residual Norm = 8.594333e-07 # Output file: periodic.out.94 Iterations = 48 Final Relative Residual Norm = 8.594333e-07 # Output file: periodic.out.95 Iterations = 48 Final Relative Residual Norm = 8.594333e-07 hypre-2.33.0/src/test/TEST_sstruct/periodic.saved.lassen_cpu000066400000000000000000000053051477326011500240300ustar00rootroot00000000000000# Output file: periodic.out.20 Iterations = 22 Final Relative Residual Norm = 8.597337e-07 # Output file: periodic.out.21 Iterations = 22 Final Relative Residual Norm = 8.597337e-07 # Output file: periodic.out.30 Iterations = 25 Final Relative Residual Norm = 7.560049e-07 # Output file: periodic.out.31 Iterations = 25 Final Relative Residual Norm = 7.560049e-07 # Output file: periodic.out.40 Iterations = 13 Final Relative Residual Norm = 3.737885e-07 # Output file: periodic.out.41 Iterations = 13 Final Relative Residual Norm = 3.737885e-07 # Output file: periodic.out.42 Iterations = 13 Final Relative Residual Norm = 3.737885e-07 # Output file: periodic.out.50 Iterations = 12 Final Relative Residual Norm = 8.626903e-07 # Output file: periodic.out.51 Iterations = 12 Final Relative Residual Norm = 8.626903e-07 # Output file: periodic.out.52 Iterations = 12 Final Relative Residual Norm = 8.626903e-07 # Output file: periodic.out.60 Iterations = 1 Final Relative Residual Norm = 1.015323e-14 # Output file: periodic.out.61 Iterations = 1 Final Relative Residual Norm = 1.015323e-14 # Output file: periodic.out.62 Iterations = 15 Final Relative Residual Norm = 4.630743e-07 # Output file: periodic.out.63 Iterations = 15 Final Relative Residual Norm = 4.630743e-07 # Output file: periodic.out.65 Iterations = 6 Final Relative Residual Norm = 9.221005e-07 # Output file: periodic.out.66 Iterations = 15 Final Relative Residual Norm = 5.012817e-07 # Output file: periodic.out.67 Iterations = 15 Final Relative Residual Norm = 5.012817e-07 # Output file: periodic.out.70 Iterations = 69 Final Relative Residual Norm = 8.673863e-07 # Output file: periodic.out.80 Iterations = 46 Final Relative Residual Norm = 7.750679e-07 # Output file: periodic.out.81 Iterations = 46 Final Relative Residual Norm = 7.750679e-07 # Output file: periodic.out.82 Iterations = 46 Final Relative Residual Norm = 7.750679e-07 # Output file: periodic.out.83 Iterations = 46 Final Relative Residual Norm = 7.750679e-07 # Output file: periodic.out.84 Iterations = 46 Final Relative Residual Norm = 7.750679e-07 # Output file: periodic.out.85 Iterations = 46 Final Relative Residual Norm = 7.750679e-07 # Output file: periodic.out.90 Iterations = 48 Final Relative Residual Norm = 8.594333e-07 # Output file: periodic.out.91 Iterations = 48 Final Relative Residual Norm = 8.594333e-07 # Output file: periodic.out.92 Iterations = 48 Final Relative Residual Norm = 8.594333e-07 # Output file: periodic.out.93 Iterations = 48 Final Relative Residual Norm = 8.594333e-07 # Output file: periodic.out.94 Iterations = 48 Final Relative Residual Norm = 8.594333e-07 # Output file: periodic.out.95 Iterations = 48 Final Relative Residual Norm = 8.594333e-07 hypre-2.33.0/src/test/TEST_sstruct/periodic.sh000077500000000000000000000104561477326011500212130ustar00rootroot00000000000000#!/bin/bash # Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) TNAME=`basename $0 .sh` RTOL=$1 ATOL=$2 #============================================================================= # Check SetNeighborBox for ${TNAME} problems (2D) #============================================================================= tail -3 ${TNAME}.out.20 > ${TNAME}.testdata tail -3 ${TNAME}.out.21 > ${TNAME}.testdata.temp (../runcheck.sh ${TNAME}.testdata ${TNAME}.testdata.temp $RTOL $ATOL) >&2 #============================================================================= # Check SetNeighborBox for ${TNAME} problems (3D) #============================================================================= tail -3 ${TNAME}.out.30 > ${TNAME}.testdata tail -3 ${TNAME}.out.31 > ${TNAME}.testdata.temp (../runcheck.sh ${TNAME}.testdata ${TNAME}.testdata.temp $RTOL $ATOL) >&2 #============================================================================= # Check SysPFMG for power-of-two and non-power-of-two systems #============================================================================= tail -3 ${TNAME}.out.40 > ${TNAME}.testdata tail -3 ${TNAME}.out.41 > ${TNAME}.testdata.temp (../runcheck.sh ${TNAME}.testdata ${TNAME}.testdata.temp $RTOL $ATOL) >&2 tail -3 ${TNAME}.out.42 > ${TNAME}.testdata.temp (../runcheck.sh ${TNAME}.testdata ${TNAME}.testdata.temp $RTOL $ATOL) >&2 tail -3 ${TNAME}.out.50 > ${TNAME}.testdata tail -3 ${TNAME}.out.51 > ${TNAME}.testdata.temp (../runcheck.sh ${TNAME}.testdata ${TNAME}.testdata.temp $RTOL $ATOL) >&2 tail -3 ${TNAME}.out.52 > ${TNAME}.testdata.temp (../runcheck.sh ${TNAME}.testdata ${TNAME}.testdata.temp $RTOL $ATOL) >&2 #============================================================================= # Check PFMG, SMG, and SysPFMG for problems with period larger than the grid #============================================================================= # First check that sstruct and struct are the same here tail -3 ${TNAME}.out.60 > ${TNAME}.testdata tail -3 ${TNAME}.out.61 > ${TNAME}.testdata.temp (../runcheck.sh ${TNAME}.testdata ${TNAME}.testdata.temp $RTOL $ATOL) >&2 tail -3 ${TNAME}.out.62 > ${TNAME}.testdata tail -3 ${TNAME}.out.63 > ${TNAME}.testdata.temp (../runcheck.sh ${TNAME}.testdata ${TNAME}.testdata.temp $RTOL $ATOL) >&2 # Also check that PFMG and SysPFMG are the same tail -3 ${TNAME}.out.66 > ${TNAME}.testdata tail -3 ${TNAME}.out.67 > ${TNAME}.testdata.temp (../runcheck.sh ${TNAME}.testdata ${TNAME}.testdata.temp $RTOL $ATOL) >&2 #============================================================================= # Check that reverse communication used to AddValues still works #============================================================================= #============================================================================= # Check SetPeriodic for node/cell problems and STRUCT, SSTRUCT, PARCSR types #============================================================================= tail -3 ${TNAME}.out.80 > ${TNAME}.testdata TNUM="81 82 83 84 85" for i in $TNUM do tail -3 ${TNAME}.out.$i > ${TNAME}.testdata.temp (../runcheck.sh ${TNAME}.testdata ${TNAME}.testdata.temp $RTOL $ATOL) >&2 done tail -3 ${TNAME}.out.90 > ${TNAME}.testdata TNUM="91 92 93 94 95" for i in $TNUM do tail -3 ${TNAME}.out.$i > ${TNAME}.testdata.temp (../runcheck.sh ${TNAME}.testdata ${TNAME}.testdata.temp $RTOL $ATOL) >&2 done #============================================================================= # compare with baseline case #============================================================================= TNUM="\ 20 21\ 30 31\ 40 41 42\ 50 51 52\ 60 61 62 63 65 66 67\ 70\ 80 81 82 83 84 85\ 90 91 92 93 94 95\ " for i in $TNUM do FILE="${TNAME}.out.$i" echo "# Output file: ${FILE}" tail -3 ${FILE} done > ${TNAME}.out # Make sure that the output file is reasonable RUNCOUNT=`echo $TNUM | wc -w` OUTCOUNT=`grep "Iterations" ${TNAME}.out | wc -l` if [ "$OUTCOUNT" != "$RUNCOUNT" ]; then echo "Incorrect number of runs in ${TNAME}.out" >&2 fi #============================================================================= # remove temporary files #============================================================================= rm -f ${TNAME}.testdata* hypre-2.33.0/src/test/TEST_sstruct/sharedpart.jobs000077500000000000000000000022701477326011500220700ustar00rootroot00000000000000#!/bin/bash # Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) # These produce the same rel residual mpirun -np 1 ./sstruct -in sstruct.in.reduced3D -solver 28 \ > sharedpart.out.0 mpirun -np 3 ./sstruct -in sstruct.in.reduced3D -solver 28 -pooldist 1 \ > sharedpart.out.1 mpirun -np 1 ./sstruct -in sstruct.in.reduced3D-4 -solver 28 \ > sharedpart.out.2 mpirun -np 3 ./sstruct -in sstruct.in.reduced3D-4 -solver 28 -pooldist 1 \ > sharedpart.out.3 # These produce the same rel residual mpirun -np 1 ./sstruct -in sstruct.in.enhanced3D -solver 28 \ > sharedpart.out.10 mpirun -np 7 ./sstruct -in sstruct.in.enhanced3D -solver 28 -pooldist 1 \ > sharedpart.out.11 # Check AMG mpirun -np 3 ./sstruct -in sstruct.in.reduced3D -solver 20 -pooldist 1 \ > sharedpart.out.50 mpirun -np 7 ./sstruct -in sstruct.in.enhanced3D -solver 20 -pooldist 1 \ > sharedpart.out.51 mpirun -np 3 ./sstruct -in sstruct.in.reduced3D-4 -solver 20 -pooldist 1 \ > sharedpart.out.52 mpirun -np 5 ./sstruct -in sstruct.in.fe_rhombus5 -solver 20 \ > sharedpart.out.53 hypre-2.33.0/src/test/TEST_sstruct/sharedpart.saved000066400000000000000000000016441477326011500222360ustar00rootroot00000000000000# Output file: sharedpart.out.0 Iterations = 17 Final Relative Residual Norm = 8.509105e-07 # Output file: sharedpart.out.1 Iterations = 17 Final Relative Residual Norm = 8.509105e-07 # Output file: sharedpart.out.2 Iterations = 17 Final Relative Residual Norm = 8.509105e-07 # Output file: sharedpart.out.3 Iterations = 17 Final Relative Residual Norm = 8.509105e-07 # Output file: sharedpart.out.10 Iterations = 18 Final Relative Residual Norm = 4.922026e-07 # Output file: sharedpart.out.11 Iterations = 18 Final Relative Residual Norm = 4.922026e-07 # Output file: sharedpart.out.50 Iterations = 5 Final Relative Residual Norm = 1.476647e-07 # Output file: sharedpart.out.51 Iterations = 5 Final Relative Residual Norm = 1.593675e-07 # Output file: sharedpart.out.52 Iterations = 5 Final Relative Residual Norm = 1.482436e-07 # Output file: sharedpart.out.53 Iterations = 7 Final Relative Residual Norm = 2.557686e-07 hypre-2.33.0/src/test/TEST_sstruct/sharedpart.saved.lassen000066400000000000000000000016451477326011500235230ustar00rootroot00000000000000# Output file: sharedpart.out.0 Iterations = 17 Final Relative Residual Norm = 8.509105e-07 # Output file: sharedpart.out.1 Iterations = 17 Final Relative Residual Norm = 8.509105e-07 # Output file: sharedpart.out.2 Iterations = 17 Final Relative Residual Norm = 8.509105e-07 # Output file: sharedpart.out.3 Iterations = 17 Final Relative Residual Norm = 8.509105e-07 # Output file: sharedpart.out.10 Iterations = 18 Final Relative Residual Norm = 4.922026e-07 # Output file: sharedpart.out.11 Iterations = 18 Final Relative Residual Norm = 4.922026e-07 # Output file: sharedpart.out.50 Iterations = 7 Final Relative Residual Norm = 6.613426e-07 # Output file: sharedpart.out.51 Iterations = 7 Final Relative Residual Norm = 6.078964e-07 # Output file: sharedpart.out.52 Iterations = 7 Final Relative Residual Norm = 6.613426e-07 # Output file: sharedpart.out.53 Iterations = 11 Final Relative Residual Norm = 1.984668e-07 hypre-2.33.0/src/test/TEST_sstruct/sharedpart.saved.lassen_cpu000066400000000000000000000016441477326011500243710ustar00rootroot00000000000000# Output file: sharedpart.out.0 Iterations = 17 Final Relative Residual Norm = 8.509105e-07 # Output file: sharedpart.out.1 Iterations = 17 Final Relative Residual Norm = 8.509105e-07 # Output file: sharedpart.out.2 Iterations = 17 Final Relative Residual Norm = 8.509105e-07 # Output file: sharedpart.out.3 Iterations = 17 Final Relative Residual Norm = 8.509105e-07 # Output file: sharedpart.out.10 Iterations = 18 Final Relative Residual Norm = 4.922026e-07 # Output file: sharedpart.out.11 Iterations = 18 Final Relative Residual Norm = 4.922026e-07 # Output file: sharedpart.out.50 Iterations = 5 Final Relative Residual Norm = 1.476576e-07 # Output file: sharedpart.out.51 Iterations = 5 Final Relative Residual Norm = 1.593654e-07 # Output file: sharedpart.out.52 Iterations = 5 Final Relative Residual Norm = 1.482297e-07 # Output file: sharedpart.out.53 Iterations = 7 Final Relative Residual Norm = 2.557686e-07 hypre-2.33.0/src/test/TEST_sstruct/sharedpart.sh000077500000000000000000000034411477326011500215460ustar00rootroot00000000000000#!/bin/bash # Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) TNAME=`basename $0 .sh` RTOL=$1 ATOL=$2 #============================================================================= #============================================================================= tail -3 ${TNAME}.out.0 > ${TNAME}.testdata for i in 1 2 3 do tail -3 ${TNAME}.out.$i > ${TNAME}.testdata.temp (../runcheck.sh ${TNAME}.testdata ${TNAME}.testdata.temp $RTOL $ATOL) >&2 done #============================================================================= #============================================================================= tail -3 ${TNAME}.out.10 > ${TNAME}.testdata tail -3 ${TNAME}.out.11 > ${TNAME}.testdata.temp (../runcheck.sh ${TNAME}.testdata ${TNAME}.testdata.temp $RTOL $ATOL) >&2 #============================================================================= # compare with baseline case #============================================================================= FILES="\ ${TNAME}.out.0\ ${TNAME}.out.1\ ${TNAME}.out.2\ ${TNAME}.out.3\ ${TNAME}.out.10\ ${TNAME}.out.11\ ${TNAME}.out.50\ ${TNAME}.out.51\ ${TNAME}.out.52\ ${TNAME}.out.53\ " for i in $FILES do echo "# Output file: $i" tail -3 $i done > ${TNAME}.out # Make sure that the output file is reasonable RUNCOUNT=`echo $FILES | wc -w` OUTCOUNT=`grep "Iterations" ${TNAME}.out | wc -l` if [ "$OUTCOUNT" != "$RUNCOUNT" ]; then echo "Incorrect number of runs in ${TNAME}.out" >&2 fi #============================================================================= # remove temporary files #============================================================================= rm -f ${TNAME}.testdata* hypre-2.33.0/src/test/TEST_sstruct/solvers.jobs000077500000000000000000000032701477326011500214310ustar00rootroot00000000000000#!/bin/bash # Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) #============================================================================= # sstruct: Run all of the solvers #============================================================================= mpirun -np 2 ./sstruct -P 1 1 2 -solver 10 > solvers.out.0 mpirun -np 2 ./sstruct -P 1 1 2 -solver 11 > solvers.out.1 mpirun -np 2 ./sstruct -P 1 1 2 -solver 18 > solvers.out.2 mpirun -np 2 ./sstruct -P 1 1 2 -solver 19 > solvers.out.3 mpirun -np 2 ./sstruct -P 1 1 2 -solver 20 > solvers.out.4 #mpirun -np 2 ./sstruct -P 1 1 2 -solver 21 > solvers.out.5 #mpirun -np 2 ./sstruct -P 1 1 2 -solver 22 > solvers.out.6 mpirun -np 2 ./sstruct -P 1 1 2 -solver 30 > solvers.out.7 mpirun -np 2 ./sstruct -P 1 1 2 -solver 31 > solvers.out.8 mpirun -np 2 ./sstruct -P 1 1 2 -solver 38 > solvers.out.9 mpirun -np 2 ./sstruct -P 1 1 2 -solver 39 > solvers.out.10 mpirun -np 2 ./sstruct -P 1 1 2 -solver 40 > solvers.out.11 #mpirun -np 2 ./sstruct -P 1 1 2 -solver 41 > solvers.out.12 #mpirun -np 2 ./sstruct -P 1 1 2 -solver 42 > solvers.out.13 mpirun -np 2 ./sstruct -in sstruct.in.laps -P 2 1 1 -solver 3 > solvers.out.14 mpirun -np 1 ./sstruct -in sstruct.in.marinak -P 1 1 1 -solver 20 > solvers.out.15 mpirun -np 2 ./sstruct -P 1 1 2 -solver 70 > solvers.out.16 mpirun -np 2 ./sstruct -P 1 1 2 -solver 71 > solvers.out.17 mpirun -np 2 ./sstruct -P 1 1 2 -solver 78 > solvers.out.18 mpirun -np 2 ./sstruct -P 1 1 2 -solver 80 > solvers.out.19 mpirun -np 2 ./sstruct -P 1 1 2 -solver 90 > solvers.out.20 hypre-2.33.0/src/test/TEST_sstruct/solvers.saved000066400000000000000000000035561477326011500216020ustar00rootroot00000000000000# Output file: solvers.out.0 Iterations = 24 Final Relative Residual Norm = 6.429522e-07 # Output file: solvers.out.1 Iterations = 24 Final Relative Residual Norm = 6.654613e-07 # Output file: solvers.out.2 Iterations = 25 Final Relative Residual Norm = 9.124482e-07 # Output file: solvers.out.3 Iterations = 25 Final Relative Residual Norm = 9.124482e-07 # Output file: solvers.out.4 Iterations = 4 Final Relative Residual Norm = 9.533464e-07 # Output file: solvers.out.5 #Iterations = 7 #Final Relative Residual Norm = 2.672054e-07 # Output file: solvers.out.6 #Iterations = 25 #Final Relative Residual Norm = 9.124482e-07 # Output file: solvers.out.7 Iterations = 28 Final Relative Residual Norm = 7.409212e-07 # Output file: solvers.out.8 Iterations = 28 Final Relative Residual Norm = 7.485693e-07 # Output file: solvers.out.9 Iterations = 30 Final Relative Residual Norm = 9.036190e-07 # Output file: solvers.out.10 Iterations = 30 Final Relative Residual Norm = 9.036190e-07 # Output file: solvers.out.11 Iterations = 4 Final Relative Residual Norm = 9.340817e-07 # Output file: solvers.out.12 #Iterations = 7 #Final Relative Residual Norm = 3.319145e-07 # Output file: solvers.out.13 #Iterations = 31 #Final Relative Residual Norm = 7.336388e-07 # Output file: solvers.out.14 Iterations = 11 Final Relative Residual Norm = 8.131824e-07 # Output file: solvers.out.15 Iterations = 5 Final Relative Residual Norm = 4.012141e-07 # Output file: solvers.out.16 Iterations = 28 Final Relative Residual Norm = 7.409212e-07 # Output file: solvers.out.17 Iterations = 28 Final Relative Residual Norm = 7.485693e-07 # Output file: solvers.out.18 Iterations = 30 Final Relative Residual Norm = 9.036190e-07 # Output file: solvers.out.19 Iterations = 4 Final Relative Residual Norm = 9.340817e-07 # Output file: solvers.out.20 Iterations = 4 Final Relative Residual Norm = 9.340817e-07 hypre-2.33.0/src/test/TEST_sstruct/solvers.saved.lassen000066400000000000000000000027761477326011500230710ustar00rootroot00000000000000# Output file: solvers.out.0 Iterations = 24 Final Relative Residual Norm = 6.429522e-07 # Output file: solvers.out.1 Iterations = 24 Final Relative Residual Norm = 6.654613e-07 # Output file: solvers.out.2 Iterations = 25 Final Relative Residual Norm = 9.124482e-07 # Output file: solvers.out.3 Iterations = 25 Final Relative Residual Norm = 9.124482e-07 # Output file: solvers.out.4 Iterations = 8 Final Relative Residual Norm = 3.394170e-07 # Output file: solvers.out.7 Iterations = 28 Final Relative Residual Norm = 7.409212e-07 # Output file: solvers.out.8 Iterations = 28 Final Relative Residual Norm = 7.485693e-07 # Output file: solvers.out.9 Iterations = 30 Final Relative Residual Norm = 9.036190e-07 # Output file: solvers.out.10 Iterations = 30 Final Relative Residual Norm = 9.036190e-07 # Output file: solvers.out.11 Iterations = 8 Final Relative Residual Norm = 4.151604e-07 # Output file: solvers.out.14 Iterations = 11 Final Relative Residual Norm = 8.131824e-07 # Output file: solvers.out.15 Iterations = 9 Final Relative Residual Norm = 6.612411e-07 # Output file: solvers.out.16 Iterations = 28 Final Relative Residual Norm = 7.409212e-07 # Output file: solvers.out.17 Iterations = 28 Final Relative Residual Norm = 7.485693e-07 # Output file: solvers.out.18 Iterations = 30 Final Relative Residual Norm = 9.036190e-07 # Output file: solvers.out.19 Iterations = 8 Final Relative Residual Norm = 4.151604e-07 # Output file: solvers.out.20 Iterations = 8 Final Relative Residual Norm = 3.335606e-07 hypre-2.33.0/src/test/TEST_sstruct/solvers.saved.lassen_cpu000066400000000000000000000027761477326011500237400ustar00rootroot00000000000000# Output file: solvers.out.0 Iterations = 24 Final Relative Residual Norm = 6.429522e-07 # Output file: solvers.out.1 Iterations = 24 Final Relative Residual Norm = 6.654613e-07 # Output file: solvers.out.2 Iterations = 25 Final Relative Residual Norm = 9.124482e-07 # Output file: solvers.out.3 Iterations = 25 Final Relative Residual Norm = 9.124482e-07 # Output file: solvers.out.4 Iterations = 4 Final Relative Residual Norm = 9.533500e-07 # Output file: solvers.out.7 Iterations = 28 Final Relative Residual Norm = 7.409212e-07 # Output file: solvers.out.8 Iterations = 28 Final Relative Residual Norm = 7.485693e-07 # Output file: solvers.out.9 Iterations = 30 Final Relative Residual Norm = 9.036190e-07 # Output file: solvers.out.10 Iterations = 30 Final Relative Residual Norm = 9.036190e-07 # Output file: solvers.out.11 Iterations = 4 Final Relative Residual Norm = 9.340843e-07 # Output file: solvers.out.14 Iterations = 11 Final Relative Residual Norm = 8.131824e-07 # Output file: solvers.out.15 Iterations = 5 Final Relative Residual Norm = 3.553535e-07 # Output file: solvers.out.16 Iterations = 28 Final Relative Residual Norm = 7.409212e-07 # Output file: solvers.out.17 Iterations = 28 Final Relative Residual Norm = 7.485693e-07 # Output file: solvers.out.18 Iterations = 30 Final Relative Residual Norm = 9.036190e-07 # Output file: solvers.out.19 Iterations = 4 Final Relative Residual Norm = 9.340843e-07 # Output file: solvers.out.20 Iterations = 4 Final Relative Residual Norm = 9.340843e-07 hypre-2.33.0/src/test/TEST_sstruct/solvers.sh000077500000000000000000000024741477326011500211130ustar00rootroot00000000000000#!/bin/bash # Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) TNAME=`basename $0 .sh` RTOL=$1 ATOL=$2 #============================================================================= # compare with baseline case #============================================================================= FILES="\ ${TNAME}.out.0\ ${TNAME}.out.1\ ${TNAME}.out.2\ ${TNAME}.out.3\ ${TNAME}.out.4\ ${TNAME}.out.7\ ${TNAME}.out.8\ ${TNAME}.out.9\ ${TNAME}.out.10\ ${TNAME}.out.11\ ${TNAME}.out.14\ ${TNAME}.out.15\ ${TNAME}.out.16\ ${TNAME}.out.17\ ${TNAME}.out.18\ ${TNAME}.out.19\ ${TNAME}.out.20\ " # ${TNAME}.out.5\ # ${TNAME}.out.6\ # ${TNAME}.out.12\ # ${TNAME}.out.13\ for i in $FILES do echo "# Output file: $i" tail -3 $i done > ${TNAME}.out # Make sure that the output file is reasonable RUNCOUNT=`echo $FILES | wc -w` OUTCOUNT=`grep "Iterations" ${TNAME}.out | wc -l` if [ "$OUTCOUNT" != "$RUNCOUNT" ]; then echo "Incorrect number of runs in ${TNAME}.out" >&2 fi #============================================================================= # remove temporary files #============================================================================= # rm -f ${TNAME}.testdata* hypre-2.33.0/src/test/TEST_sstruct/sstruct.in.19aniso000066400000000000000000000057631477326011500224040ustar00rootroot00000000000000# Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) ########################################################### # GridCreate: ndim nparts GridCreate: 3 1 # GridSetExtents: part ilower(ndim) iupper(ndim) GridSetExtents: 0 (1- 1- 1-) (8+ 4+ 4+) # GridSetVariables: part nvars vartypes[nvars] # CELL = 0 GridSetVariables: 0 1 [0] # GridSetPeriodic: part periodic[ndim] GridSetPeriodic: 0 [0 0 4] ########################################################### # StencilCreate: nstencils sizes[nstencils] StencilCreate: 1 [19] # StencilSetEntry: stencil_num entry offset[ndim] var value StencilSetEntry: 0 0 [ 1 1 0 ] 0 0.0 StencilSetEntry: 0 1 [ 1 0 0 ] 0 100.0 StencilSetEntry: 0 2 [ 1 -1 0 ] 0 0.0 StencilSetEntry: 0 3 [ 0 -1 0 ] 0 10000.0 StencilSetEntry: 0 4 [ -1 -1 0 ] 0 0.0 StencilSetEntry: 0 5 [ -1 0 0 ] 0 100.0 StencilSetEntry: 0 6 [ -1 1 0 ] 0 0.0 StencilSetEntry: 0 7 [ 0 1 0 ] 0 10000.0 StencilSetEntry: 0 8 [ 0 0 0 ] 0 -20208.0 StencilSetEntry: 0 9 [ 1 0 -1 ] 0 0.0 StencilSetEntry: 0 10 [ 0 -1 -1 ] 0 0.0 StencilSetEntry: 0 11 [ -1 0 -1 ] 0 0.0 StencilSetEntry: 0 12 [ 0 1 -1 ] 0 0.0 StencilSetEntry: 0 13 [ 0 0 -1 ] 0 4.0 StencilSetEntry: 0 14 [ 1 0 1 ] 0 0.0 StencilSetEntry: 0 15 [ 0 -1 1 ] 0 0.0 StencilSetEntry: 0 16 [ -1 0 1 ] 0 0.0 StencilSetEntry: 0 17 [ 0 1 1 ] 0 0.0 StencilSetEntry: 0 18 [ 0 0 1 ] 0 4.0 ########################################################### # GraphSetStencil: part var stencil_num GraphSetStencil: 0 0 0 ########################################################### # Neumann in both x and y # MatrixSetValues: \ # part ilower(ndim) iupper(ndim) stride[ndim] var entry value # west MatrixSetValues: 0 (1- 1- 1-) (1- 4+ 4+) [1 1 1] 0 5 0.0 MatrixSetValues: 0 (1- 1- 1-) (1- 4+ 4+) [1 1 1] 0 8 -20108.0 # east MatrixSetValues: 0 (8+ 1- 1-) (8+ 4+ 4+) [1 1 1] 0 1 0.0 MatrixSetValues: 0 (8+ 1- 1-) (8+ 4+ 4+) [1 1 1] 0 8 -20108.0 # south MatrixSetValues: 0 (1- 1- 1-) (8+ 1- 4+) [1 1 1] 0 3 0.0 MatrixSetValues: 0 (1- 1- 1-) (8+ 1- 4+) [1 1 1] 0 8 -10208.0 # north MatrixSetValues: 0 (1- 4+ 1-) (8+ 4+ 4+) [1 1 1] 0 7 0.0 MatrixSetValues: 0 (1- 4+ 1-) (8+ 4+ 4+) [1 1 1] 0 8 -10208.0 # lower #MatrixSetValues: 0 (1- 1- 1-) (8+ 4+ 1-) [1 1 1] 0 13 0.0 # upper #MatrixSetValues: 0 (1- 1- 4+) (8+ 4+ 4+) [1 1 1] 0 18 0.0 MatrixSetValues: 0 (1- 1- 1-) (1- 1- 4+) [1 1 1] 0 8 -10108.0 MatrixSetValues: 0 (8+ 1- 1-) (8+ 1- 4+) [1 1 1] 0 8 -10108.0 MatrixSetValues: 0 (1- 4+ 1-) (1- 4+ 4+) [1 1 1] 0 8 -10108.0 MatrixSetValues: 0 (8+ 4+ 1-) (8+ 4+ 4+) [1 1 1] 0 8 -10108.0 ########################################################### # ProcessPoolCreate: num_pools ProcessPoolCreate: 1 # ProcessPoolSetPart: pool part ProcessPoolSetPart: 0 0 ########################################################### hypre-2.33.0/src/test/TEST_sstruct/sstruct.in.19iso000066400000000000000000000056071477326011500220620ustar00rootroot00000000000000# Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) ########################################################### # GridCreate: ndim nparts GridCreate: 3 1 # GridSetExtents: part ilower(ndim) iupper(ndim) GridSetExtents: 0 (1- 1- 1-) (8+ 4+ 4+) # GridSetVariables: part nvars vartypes[nvars] # CELL = 0 GridSetVariables: 0 1 [0] # GridSetPeriodic: part periodic[ndim] GridSetPeriodic: 0 [0 0 4] ########################################################### # StencilCreate: nstencils sizes[nstencils] StencilCreate: 1 [19] # StencilSetEntry: stencil_num entry offset[ndim] var value StencilSetEntry: 0 0 [ 1 1 0 ] 0 0.0 StencilSetEntry: 0 1 [ 1 0 0 ] 0 1.0 StencilSetEntry: 0 2 [ 1 -1 0 ] 0 0.0 StencilSetEntry: 0 3 [ 0 -1 0 ] 0 1.0 StencilSetEntry: 0 4 [ -1 -1 0 ] 0 0.0 StencilSetEntry: 0 5 [ -1 0 0 ] 0 1.0 StencilSetEntry: 0 6 [ -1 1 0 ] 0 0.0 StencilSetEntry: 0 7 [ 0 1 0 ] 0 1.0 StencilSetEntry: 0 8 [ 0 0 0 ] 0 -6.0 StencilSetEntry: 0 9 [ 1 0 -1 ] 0 0.0 StencilSetEntry: 0 10 [ 0 -1 -1 ] 0 0.0 StencilSetEntry: 0 11 [ -1 0 -1 ] 0 0.0 StencilSetEntry: 0 12 [ 0 1 -1 ] 0 0.0 StencilSetEntry: 0 13 [ 0 0 -1 ] 0 1.0 StencilSetEntry: 0 14 [ 1 0 1 ] 0 0.0 StencilSetEntry: 0 15 [ 0 -1 1 ] 0 0.0 StencilSetEntry: 0 16 [ -1 0 1 ] 0 0.0 StencilSetEntry: 0 17 [ 0 1 1 ] 0 0.0 StencilSetEntry: 0 18 [ 0 0 1 ] 0 1.0 ########################################################### # GraphSetStencil: part var stencil_num GraphSetStencil: 0 0 0 ########################################################### # Neumann in both x and y # MatrixSetValues: \ # part ilower(ndim) iupper(ndim) stride[ndim] var entry value # west MatrixSetValues: 0 (1- 1- 1-) (1- 4+ 4+) [1 1 1] 0 5 0.0 MatrixSetValues: 0 (1- 1- 1-) (1- 4+ 4+) [1 1 1] 0 8 -5.0 # east MatrixSetValues: 0 (8+ 1- 1-) (8+ 4+ 4+) [1 1 1] 0 1 0.0 MatrixSetValues: 0 (8+ 1- 1-) (8+ 4+ 4+) [1 1 1] 0 8 -5.0 # south MatrixSetValues: 0 (1- 1- 1-) (8+ 1- 4+) [1 1 1] 0 3 0.0 MatrixSetValues: 0 (1- 1- 1-) (8+ 1- 4+) [1 1 1] 0 8 -5.0 # north MatrixSetValues: 0 (1- 4+ 1-) (8+ 4+ 4+) [1 1 1] 0 7 0.0 MatrixSetValues: 0 (1- 4+ 1-) (8+ 4+ 4+) [1 1 1] 0 8 -5.0 # lower #MatrixSetValues: 0 (1- 1- 1-) (8+ 4+ 1-) [1 1 1] 0 13 0.0 # upper #MatrixSetValues: 0 (1- 1- 4+) (8+ 4+ 4+) [1 1 1] 0 18 0.0 MatrixSetValues: 0 (1- 1- 1-) (1- 1- 4+) [1 1 1] 0 8 -4.0 MatrixSetValues: 0 (8+ 1- 1-) (8+ 1- 4+) [1 1 1] 0 8 -4.0 MatrixSetValues: 0 (1- 4+ 1-) (1- 4+ 4+) [1 1 1] 0 8 -4.0 MatrixSetValues: 0 (8+ 4+ 1-) (8+ 4+ 4+) [1 1 1] 0 8 -4.0 ########################################################### # ProcessPoolCreate: num_pools ProcessPoolCreate: 1 # ProcessPoolSetPart: pool part ProcessPoolSetPart: 0 0 ########################################################### hypre-2.33.0/src/test/TEST_sstruct/sstruct.in.7aniso000066400000000000000000000046041477326011500223120ustar00rootroot00000000000000# Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) ########################################################### # GridCreate: ndim nparts GridCreate: 3 1 # GridSetExtents: part ilower(ndim) iupper(ndim) GridSetExtents: 0 (1- 1- 1-) (8+ 4+ 4+) # GridSetVariables: part nvars vartypes[nvars] # CELL = 0 GridSetVariables: 0 1 [0] # GridSetPeriodic: part periodic[ndim] GridSetPeriodic: 0 [0 0 4] ########################################################### # StencilCreate: nstencils sizes[nstencils] StencilCreate: 1 [7] # StencilSetEntry: stencil_num entry offset[ndim] var value StencilSetEntry: 0 0 [ 0 0 0] 0 -20208.0 StencilSetEntry: 0 1 [-1 0 0] 0 100.0 StencilSetEntry: 0 2 [ 1 0 0] 0 100.0 StencilSetEntry: 0 3 [ 0 -1 0] 0 10000.0 StencilSetEntry: 0 4 [ 0 1 0] 0 10000.0 StencilSetEntry: 0 5 [ 0 0 -1] 0 4.0 StencilSetEntry: 0 6 [ 0 0 1] 0 4.0 ########################################################### # GraphSetStencil: part var stencil_num GraphSetStencil: 0 0 0 ########################################################### # MatrixSetValues: \ # part ilower(ndim) iupper(ndim) stride[ndim] var entry value # west MatrixSetValues: 0 (1- 1- 1-) (1- 4+ 4+) [1 1 1] 0 1 0.0 MatrixSetValues: 0 (1- 1- 1-) (1- 4+ 4+) [1 1 1] 0 0 -20108.0 # east MatrixSetValues: 0 (8+ 1- 1-) (8+ 4+ 4+) [1 1 1] 0 2 0.0 MatrixSetValues: 0 (8+ 1- 1-) (8+ 4+ 4+) [1 1 1] 0 0 -20108.0 # south MatrixSetValues: 0 (1- 1- 1-) (8+ 1- 4+) [1 1 1] 0 3 0.0 MatrixSetValues: 0 (1- 1- 1-) (8+ 1- 4+) [1 1 1] 0 0 -10208.0 # north MatrixSetValues: 0 (1- 4+ 1-) (8+ 4+ 4+) [1 1 1] 0 4 0.0 MatrixSetValues: 0 (1- 4+ 1-) (8+ 4+ 4+) [1 1 1] 0 0 -10208.0 # lower #MatrixSetValues: 0 (1- 1- 1-) (8+ 4+ 1-) [1 1 1] 0 5 0.0 # upper #MatrixSetValues: 0 (1- 1- 4+) (8+ 4+ 4+) [1 1 1] 0 6 0.0 MatrixSetValues: 0 (1- 1- 1-) (1- 1- 4+) [1 1 1] 0 0 -10108.0 MatrixSetValues: 0 (8+ 1- 1-) (8+ 1- 4+) [1 1 1] 0 0 -10108.0 MatrixSetValues: 0 (1- 4+ 1-) (1- 4+ 4+) [1 1 1] 0 0 -10108.0 MatrixSetValues: 0 (8+ 4+ 1-) (8+ 4+ 4+) [1 1 1] 0 0 -10108.0 ########################################################### # ProcessPoolCreate: num_pools ProcessPoolCreate: 1 # ProcessPoolSetPart: pool part ProcessPoolSetPart: 0 0 ########################################################### hypre-2.33.0/src/test/TEST_sstruct/sstruct.in.7iso000066400000000000000000000045101477326011500217670ustar00rootroot00000000000000# Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) ########################################################### # GridCreate: ndim nparts GridCreate: 3 1 # GridSetExtents: part ilower(ndim) iupper(ndim) GridSetExtents: 0 (1- 1- 1-) (8+ 4+ 4+) # GridSetVariables: part nvars vartypes[nvars] # CELL = 0 GridSetVariables: 0 1 [0] # GridSetPeriodic: part periodic[ndim] GridSetPeriodic: 0 [0 0 4] ########################################################### # StencilCreate: nstencils sizes[nstencils] StencilCreate: 1 [7] # StencilSetEntry: stencil_num entry offset[ndim] var value StencilSetEntry: 0 0 [ 0 0 0] 0 -6.0 StencilSetEntry: 0 1 [-1 0 0] 0 1.0 StencilSetEntry: 0 2 [ 1 0 0] 0 1.0 StencilSetEntry: 0 3 [ 0 -1 0] 0 1.0 StencilSetEntry: 0 4 [ 0 1 0] 0 1.0 StencilSetEntry: 0 5 [ 0 0 -1] 0 1.0 StencilSetEntry: 0 6 [ 0 0 1] 0 1.0 ########################################################### # GraphSetStencil: part var stencil_num GraphSetStencil: 0 0 0 ########################################################### # MatrixSetValues: \ # part ilower(ndim) iupper(ndim) stride[ndim] var entry value # west MatrixSetValues: 0 (1- 1- 1-) (1- 4+ 4+) [1 1 1] 0 1 0.0 MatrixSetValues: 0 (1- 1- 1-) (1- 4+ 4+) [1 1 1] 0 0 -5.0 # east MatrixSetValues: 0 (8+ 1- 1-) (8+ 4+ 4+) [1 1 1] 0 2 0.0 MatrixSetValues: 0 (8+ 1- 1-) (8+ 4+ 4+) [1 1 1] 0 0 -5.0 # south MatrixSetValues: 0 (1- 1- 1-) (8+ 1- 4+) [1 1 1] 0 3 0.0 MatrixSetValues: 0 (1- 1- 1-) (8+ 1- 4+) [1 1 1] 0 0 -5.0 # north MatrixSetValues: 0 (1- 4+ 1-) (8+ 4+ 4+) [1 1 1] 0 4 0.0 MatrixSetValues: 0 (1- 4+ 1-) (8+ 4+ 4+) [1 1 1] 0 0 -5.0 # lower #MatrixSetValues: 0 (1- 1- 1-) (8+ 4+ 1-) [1 1 1] 0 5 0.0 # upper #MatrixSetValues: 0 (1- 1- 4+) (8+ 4+ 4+) [1 1 1] 0 6 0.0 MatrixSetValues: 0 (1- 1- 1-) (1- 1- 4+) [1 1 1] 0 0 -4.0 MatrixSetValues: 0 (8+ 1- 1-) (8+ 1- 4+) [1 1 1] 0 0 -4.0 MatrixSetValues: 0 (1- 4+ 1-) (1- 4+ 4+) [1 1 1] 0 0 -4.0 MatrixSetValues: 0 (8+ 4+ 1-) (8+ 4+ 4+) [1 1 1] 0 0 -4.0 ########################################################### # ProcessPoolCreate: num_pools ProcessPoolCreate: 1 # ProcessPoolSetPart: pool part ProcessPoolSetPart: 0 0 ########################################################### hypre-2.33.0/src/test/TEST_sstruct/sstruct.in.7zero-x000066400000000000000000000035611477326011500224260ustar00rootroot00000000000000# Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) ########################################################### # GridCreate: ndim nparts GridCreate: 3 1 # GridSetExtents: part ilower(ndim) iupper(ndim) GridSetExtents: 0 (1- 1- 1-) (4+ 4+ 4+) # GridSetVariables: part nvars vartypes[nvars] # CELL = 0 GridSetVariables: 0 1 [0] # GridSetPeriodic: part periodic[ndim] GridSetPeriodic: 0 [0 0 0] ########################################################### # StencilCreate: nstencils sizes[nstencils] StencilCreate: 1 [7] # StencilSetEntry: stencil_num entry offset[ndim] var value StencilSetEntry: 0 0 [ 0 0 0] 0 4.0 StencilSetEntry: 0 1 [-1 0 0] 0 0.0 StencilSetEntry: 0 2 [ 1 0 0] 0 0.0 StencilSetEntry: 0 3 [ 0 -1 0] 0 -1.0 StencilSetEntry: 0 4 [ 0 1 0] 0 -1.0 StencilSetEntry: 0 5 [ 0 0 -1] 0 -1.0 StencilSetEntry: 0 6 [ 0 0 1] 0 -1.0 ########################################################### # GraphSetStencil: part var stencil_num GraphSetStencil: 0 0 0 ########################################################### # MatrixSetValues: \ # part ilower(ndim) iupper(ndim) stride[ndim] var entry value # west MatrixSetValues: 0 (1- 1- 1-) (1- 4+ 4+) [1 1 1] 0 1 0.0 # east MatrixSetValues: 0 (4+ 1- 1-) (4+ 4+ 4+) [1 1 1] 0 2 0.0 # south MatrixSetValues: 0 (1- 1- 1-) (4+ 1- 4+) [1 1 1] 0 3 0.0 # north MatrixSetValues: 0 (1- 4+ 1-) (4+ 4+ 4+) [1 1 1] 0 4 0.0 # lower MatrixSetValues: 0 (1- 1- 1-) (4+ 4+ 1-) [1 1 1] 0 5 0.0 # upper MatrixSetValues: 0 (1- 1- 4+) (4+ 4+ 4+) [1 1 1] 0 6 0.0 ########################################################### # ProcessPoolCreate: num_pools ProcessPoolCreate: 1 # ProcessPoolSetPart: pool part ProcessPoolSetPart: 0 0 ########################################################### hypre-2.33.0/src/test/TEST_sstruct/sstruct.in.7zero-y000066400000000000000000000035611477326011500224270ustar00rootroot00000000000000# Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) ########################################################### # GridCreate: ndim nparts GridCreate: 3 1 # GridSetExtents: part ilower(ndim) iupper(ndim) GridSetExtents: 0 (1- 1- 1-) (4+ 4+ 4+) # GridSetVariables: part nvars vartypes[nvars] # CELL = 0 GridSetVariables: 0 1 [0] # GridSetPeriodic: part periodic[ndim] GridSetPeriodic: 0 [0 0 0] ########################################################### # StencilCreate: nstencils sizes[nstencils] StencilCreate: 1 [7] # StencilSetEntry: stencil_num entry offset[ndim] var value StencilSetEntry: 0 0 [ 0 0 0] 0 4.0 StencilSetEntry: 0 1 [-1 0 0] 0 -1.0 StencilSetEntry: 0 2 [ 1 0 0] 0 -1.0 StencilSetEntry: 0 3 [ 0 -1 0] 0 0.0 StencilSetEntry: 0 4 [ 0 1 0] 0 0.0 StencilSetEntry: 0 5 [ 0 0 -1] 0 -1.0 StencilSetEntry: 0 6 [ 0 0 1] 0 -1.0 ########################################################### # GraphSetStencil: part var stencil_num GraphSetStencil: 0 0 0 ########################################################### # MatrixSetValues: \ # part ilower(ndim) iupper(ndim) stride[ndim] var entry value # west MatrixSetValues: 0 (1- 1- 1-) (1- 4+ 4+) [1 1 1] 0 1 0.0 # east MatrixSetValues: 0 (4+ 1- 1-) (4+ 4+ 4+) [1 1 1] 0 2 0.0 # south MatrixSetValues: 0 (1- 1- 1-) (4+ 1- 4+) [1 1 1] 0 3 0.0 # north MatrixSetValues: 0 (1- 4+ 1-) (4+ 4+ 4+) [1 1 1] 0 4 0.0 # lower MatrixSetValues: 0 (1- 1- 1-) (4+ 4+ 1-) [1 1 1] 0 5 0.0 # upper MatrixSetValues: 0 (1- 1- 4+) (4+ 4+ 4+) [1 1 1] 0 6 0.0 ########################################################### # ProcessPoolCreate: num_pools ProcessPoolCreate: 1 # ProcessPoolSetPart: pool part ProcessPoolSetPart: 0 0 ########################################################### hypre-2.33.0/src/test/TEST_sstruct/sstruct.in.7zero-z000066400000000000000000000035611477326011500224300ustar00rootroot00000000000000# Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) ########################################################### # GridCreate: ndim nparts GridCreate: 3 1 # GridSetExtents: part ilower(ndim) iupper(ndim) GridSetExtents: 0 (1- 1- 1-) (4+ 4+ 4+) # GridSetVariables: part nvars vartypes[nvars] # CELL = 0 GridSetVariables: 0 1 [0] # GridSetPeriodic: part periodic[ndim] GridSetPeriodic: 0 [0 0 0] ########################################################### # StencilCreate: nstencils sizes[nstencils] StencilCreate: 1 [7] # StencilSetEntry: stencil_num entry offset[ndim] var value StencilSetEntry: 0 0 [ 0 0 0] 0 4.0 StencilSetEntry: 0 1 [-1 0 0] 0 -1.0 StencilSetEntry: 0 2 [ 1 0 0] 0 -1.0 StencilSetEntry: 0 3 [ 0 -1 0] 0 -1.0 StencilSetEntry: 0 4 [ 0 1 0] 0 -1.0 StencilSetEntry: 0 5 [ 0 0 -1] 0 0.0 StencilSetEntry: 0 6 [ 0 0 1] 0 0.0 ########################################################### # GraphSetStencil: part var stencil_num GraphSetStencil: 0 0 0 ########################################################### # MatrixSetValues: \ # part ilower(ndim) iupper(ndim) stride[ndim] var entry value # west MatrixSetValues: 0 (1- 1- 1-) (1- 4+ 4+) [1 1 1] 0 1 0.0 # east MatrixSetValues: 0 (4+ 1- 1-) (4+ 4+ 4+) [1 1 1] 0 2 0.0 # south MatrixSetValues: 0 (1- 1- 1-) (4+ 1- 4+) [1 1 1] 0 3 0.0 # north MatrixSetValues: 0 (1- 4+ 1-) (4+ 4+ 4+) [1 1 1] 0 4 0.0 # lower MatrixSetValues: 0 (1- 1- 1-) (4+ 4+ 1-) [1 1 1] 0 5 0.0 # upper MatrixSetValues: 0 (1- 1- 4+) (4+ 4+ 4+) [1 1 1] 0 6 0.0 ########################################################### # ProcessPoolCreate: num_pools ProcessPoolCreate: 1 # ProcessPoolSetPart: pool part ProcessPoolSetPart: 0 0 ########################################################### hypre-2.33.0/src/test/TEST_sstruct/sstruct.in.addtoval_cellcentre000066400000000000000000000031271477326011500251070ustar00rootroot00000000000000# Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) ########################################################### # GridCreate: ndim nparts GridCreate: 3 1 # GridSetExtents: part ilower(ndim) iupper(ndim) GridSetExtents: 0 (1- 1- 1-) (4+ 4+ 4+) # GridSetVariables: part nvars vartypes[nvars] # CELL = 0 GridSetVariables: 0 1 [0] ########################################################### # StencilCreate: nstencils sizes[nstencils] StencilCreate: 1 [7] # StencilSetEntry: stencil_num entry offset[ndim] var value StencilSetEntry: 0 0 [ 0 0 0] 0 0.0 StencilSetEntry: 0 1 [-1 0 0] 0 0.0 StencilSetEntry: 0 2 [ 1 0 0] 0 0.0 StencilSetEntry: 0 3 [ 0 1 0] 0 0.0 StencilSetEntry: 0 4 [ 0 -1 0] 0 0.0 StencilSetEntry: 0 5 [ 0 0 1] 0 0.0 StencilSetEntry: 0 6 [ 0 0 -1] 0 0.0 ########################################################### # GraphSetStencil: part var stencil_num GraphSetStencil: 0 0 0 ########################################################### # MatrixAddToValues: \ # part ilower(ndim) iupper(ndim) var nentries entries[nentries] values[nentries] MatrixAddToValues: 0 (1- 1- 1-) (4+ 4+ 4+) 0 4 [0 1 2 3] [6.0 -1.0 -1.0 -1.0] MatrixAddToValues: 0 (1- 1- 1-) (4+ 4+ 4+) 0 3 [ 4 5 6] [ -1.0 -1.0 -1.0] ########################################################### # ProcessPoolCreate: num_pools ProcessPoolCreate: 1 # ProcessPoolSetPart: pool part ProcessPoolSetPart: 0 0 ########################################################### hypre-2.33.0/src/test/TEST_sstruct/sstruct.in.addtoval_edges000066400000000000000000000137431477326011500240630ustar00rootroot00000000000000# Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) ########################################################### # GridCreate: ndim nparts GridCreate: 3 1 # GridSetExtents: part ilower(ndim) iupper(ndim) GridSetExtents: 0 (1- 1- 1-) (4+ 4+ 4+) # GridSetVariables: part nvars vartypes[nvars] # XEDGE = 5 # YEDGE = 6 # ZEDGE = 7 GridSetVariables: 0 3 [5 6 7] ########################################################### # StencilCreate: nstencils sizes[nstencils] StencilCreate: 3 [33 33 33] # StencilSetEntry: stencil_num entry offset[ndim] var value StencilSetEntry: 0 0 [ 0 0 0] 0 0.0 StencilSetEntry: 0 1 [ 0 1 0] 0 0.0 StencilSetEntry: 0 2 [ 0 1 1] 0 0.0 StencilSetEntry: 0 3 [ 0 0 1] 0 0.0 StencilSetEntry: 0 4 [ 0 -1 0] 0 -1.305555556 StencilSetEntry: 0 5 [ 0 -1 1] 0 -1.326388889 StencilSetEntry: 0 6 [ 0 0 -1] 0 -1.305555556 StencilSetEntry: 0 7 [ 0 1 -1] 0 -1.326388889 StencilSetEntry: 0 8 [ 0 -1 -1] 0 -1.326388889 StencilSetEntry: 0 9 [ 0 0 0] 1 -2.666666667 StencilSetEntry: 0 10 [-1 0 0] 1 2.666666667 StencilSetEntry: 0 11 [ 0 0 -1] 1 -0.666666667 StencilSetEntry: 0 12 [-1 0 -1] 1 0.666666667 StencilSetEntry: 0 13 [ 0 0 1] 1 -0.666666667 StencilSetEntry: 0 14 [-1 0 1] 1 0.666666667 StencilSetEntry: 0 15 [ 0 1 0] 1 2.666666667 StencilSetEntry: 0 16 [-1 1 0] 1 -2.666666667 StencilSetEntry: 0 17 [ 0 1 1] 1 0.666666667 StencilSetEntry: 0 18 [-1 1 1] 1 -0.666666667 StencilSetEntry: 0 19 [ 0 1 -1] 1 0.666666667 StencilSetEntry: 0 20 [-1 1 -1] 1 -0.666666667 StencilSetEntry: 0 21 [ 0 0 0] 2 -2.666666667 StencilSetEntry: 0 22 [-1 0 0] 2 2.666666667 StencilSetEntry: 0 23 [-1 -1 0] 2 0.666666667 StencilSetEntry: 0 24 [ 0 -1 0] 2 -0.666666667 StencilSetEntry: 0 25 [ 0 0 1] 2 2.666666667 StencilSetEntry: 0 26 [-1 0 1] 2 -2.666666667 StencilSetEntry: 0 27 [-1 -1 1] 2 -0.666666667 StencilSetEntry: 0 28 [ 0 -1 1] 2 0.666666667 StencilSetEntry: 0 29 [ 0 1 0] 2 -0.666666667 StencilSetEntry: 0 30 [-1 1 0] 2 0.666666667 StencilSetEntry: 0 31 [-1 1 1] 2 -0.666666667 StencilSetEntry: 0 32 [ 0 1 1] 2 0.666666667 StencilSetEntry: 1 0 [ 0 0 0] 1 10.77777778 StencilSetEntry: 1 1 [-1 0 0] 1 -1.305555556 StencilSetEntry: 1 2 [ 0 0 -1] 1 -1.305555556 StencilSetEntry: 1 3 [-1 0 -1] 1 -1.326388889 StencilSetEntry: 1 4 [ 1 0 0] 1 -1.305555556 StencilSetEntry: 1 5 [ 1 0 -1] 1 -1.326388889 StencilSetEntry: 1 6 [ 0 0 1] 1 -1.305555556 StencilSetEntry: 1 7 [-1 0 1] 1 -1.326388889 StencilSetEntry: 1 8 [ 1 0 1] 1 -1.326388889 StencilSetEntry: 1 9 [ 0 0 0] 0 -2.666666667 StencilSetEntry: 1 10 [ 0 -1 0] 0 2.666666667 StencilSetEntry: 1 11 [ 0 -1 -1] 0 0.666666667 StencilSetEntry: 1 12 [ 0 0 -1] 0 -0.666666667 StencilSetEntry: 1 13 [ 1 0 0] 0 2.666666667 StencilSetEntry: 1 14 [ 1 -1 0] 0 -2.666666667 StencilSetEntry: 1 15 [ 1 0 -1] 0 0.666666667 StencilSetEntry: 1 16 [ 1 -1 -1] 0 -0.666666667 StencilSetEntry: 1 17 [ 0 -1 1] 0 0.666666667 StencilSetEntry: 1 18 [ 0 0 1] 0 -0.666666667 StencilSetEntry: 1 19 [ 1 -1 1] 0 -0.666666667 StencilSetEntry: 1 20 [ 1 0 1] 0 0.666666667 StencilSetEntry: 1 21 [ 0 0 0] 2 -2.666666667 StencilSetEntry: 1 22 [ 0 -1 0] 2 2.666666667 StencilSetEntry: 1 23 [-1 0 0] 2 -0.666666667 StencilSetEntry: 1 24 [-1 -1 0] 2 0.666666667 StencilSetEntry: 1 25 [ 1 -1 0] 2 0.666666667 StencilSetEntry: 1 26 [ 1 0 0] 2 -0.666666667 StencilSetEntry: 1 27 [ 0 0 1] 2 2.666666667 StencilSetEntry: 1 28 [ 0 -1 1] 2 -2.666666667 StencilSetEntry: 1 29 [-1 -1 1] 2 -0.666666667 StencilSetEntry: 1 30 [-1 0 1] 2 0.666666667 StencilSetEntry: 1 31 [ 1 -1 1] 2 -0.666666667 StencilSetEntry: 1 32 [ 1 0 1] 2 0.666666667 StencilSetEntry: 2 0 [ 0 0 0] 2 10.77777778 StencilSetEntry: 2 1 [-1 0 0] 2 -1.305555556 StencilSetEntry: 2 2 [ 0 -1 0] 2 -1.305555556 StencilSetEntry: 2 3 [-1 -1 0] 2 -1.326388889 StencilSetEntry: 2 4 [ 1 0 0] 2 -1.305555556 StencilSetEntry: 2 5 [ 1 -1 0] 2 -1.326388889 StencilSetEntry: 2 6 [ 0 1 0] 2 -1.305555556 StencilSetEntry: 2 7 [-1 1 0] 2 -1.326388889 StencilSetEntry: 2 8 [ 1 1 0] 2 -1.326388889 StencilSetEntry: 2 9 [ 0 0 0] 0 -2.666666667 StencilSetEntry: 2 10 [ 0 0 -1] 0 2.666666667 StencilSetEntry: 2 11 [ 0 -1 0] 0 -0.666666667 StencilSetEntry: 2 12 [ 0 -1 -1] 0 0.666666667 StencilSetEntry: 2 13 [ 1 0 0] 0 2.666666667 StencilSetEntry: 2 14 [ 1 0 -1] 0 -2.666666667 StencilSetEntry: 2 15 [ 1 -1 -1] 0 -0.666666667 StencilSetEntry: 2 16 [ 1 -1 0] 0 0.666666667 StencilSetEntry: 2 17 [ 0 1 0] 0 -0.666666667 StencilSetEntry: 2 18 [ 0 1 -1] 0 0.666666667 StencilSetEntry: 2 19 [ 1 1 0] 0 0.666666667 StencilSetEntry: 2 20 [ 1 1 -1] 0 -0.666666667 StencilSetEntry: 2 21 [ 0 0 0] 1 -2.666666667 StencilSetEntry: 2 22 [ 0 0 -1] 1 2.666666667 StencilSetEntry: 2 23 [-1 0 0] 1 -0.666666667 StencilSetEntry: 2 24 [-1 0 -1] 1 0.666666667 StencilSetEntry: 2 25 [ 1 0 0] 1 -0.666666667 StencilSetEntry: 2 26 [ 1 0 -1] 1 0.666666667 StencilSetEntry: 2 27 [ 0 1 0] 1 2.666666667 StencilSetEntry: 2 28 [ 0 1 -1] 1 -2.666666667 StencilSetEntry: 2 29 [-1 1 0] 1 0.666666667 StencilSetEntry: 2 30 [-1 1 -1] 1 -0.666666667 StencilSetEntry: 2 31 [ 1 1 0] 1 0.666666667 StencilSetEntry: 2 32 [ 1 1 -1] 1 -0.666666667 ########################################################### # GraphSetStencil: part var stencil_num GraphSetStencil: 0 0 0 GraphSetStencil: 0 1 1 GraphSetStencil: 0 2 2 ########################################################### # MatrixAddToValues: \ # part ilower(ndim) iupper(ndim) var nentries entries[nentries] values[nentries] MatrixAddToValues: 0 (1- 1- 1- : 0 -1 -1) (4+ 4+ 4+) 0 4 [0 1 2 3] [10.77777778 -1.305555556 -1.326388889 -1.305555556] ########################################################### # ProcessPoolCreate: num_pools ProcessPoolCreate: 1 # ProcessPoolSetPart: pool part ProcessPoolSetPart: 0 0 ########################################################### hypre-2.33.0/src/test/TEST_sstruct/sstruct.in.amr.2D000066400000000000000000000034251477326011500221350ustar00rootroot00000000000000# Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) ########################################################### # GridCreate: ndim nparts GridCreate: 2 2 # GridSetExtents: part ilower(ndim) iupper(ndim) #GridSetExtents: 0 (0- 0-) (15+ 15+) #GridSetExtents: 1 (12- 12-) (19+ 19+) GridSetExtents: 0 (0- 0-) (7+ 15+) GridSetExtents: 1 (6- 12-) (13+ 19+) # GridSetVariables: part nvars vartypes[nvars] # NODE = 1 GridSetVariables: 0 1 [1] GridSetVariables: 1 1 [1] ########################################################### # StencilCreate: nstencils sizes[nstencils] StencilCreate: 1 [5] # StencilSetEntry: stencil_num entry offset[ndim] var value StencilSetEntry: 0 0 [ 0 0] 0 5.0 StencilSetEntry: 0 1 [-1 0] 0 -1.0 StencilSetEntry: 0 2 [ 1 0] 0 -1.0 StencilSetEntry: 0 3 [ 0 -1] 0 -1.0 StencilSetEntry: 0 4 [ 0 1] 0 -1.0 ########################################################### # GraphSetStencil: part var stencil_num GraphSetStencil: 0 0 0 GraphSetStencil: 1 0 0 # GraphAddEntries: \ # part ilower(ndim) iupper(ndim) stride[ndim] var \ # to_part to_ilower(ndim) to_iupper(ndim) to_stride[ndim] to_var \ # index_map[ndim] entry value GraphAddEntries: 1 (6- 12- : -1 -1) (13+ 12- : 0 -1) [2 1] 0 0 (3- 5+ : -1 -1) (6+ 5+ : 0 -1) [1 1] 0 [0 1] 5 -1.0 GraphAddEntries: 0 (3- 5+ : -1 -1) (6+ 5+ : 0 -1) [1 1] 0 1 (6- 12- : -1 -1) (13+ 12- : 0 1) [2 1] 0 [0 1] 5 -1.0 ########################################################### # ProcessPoolCreate: num_pools ProcessPoolCreate: 1 # ProcessPoolSetPart: pool part ProcessPoolSetPart: 0 0 ProcessPoolSetPart: 0 1 ########################################################### hypre-2.33.0/src/test/TEST_sstruct/sstruct.in.amr.2Db000066400000000000000000000034241477326011500222760ustar00rootroot00000000000000# Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) ########################################################### # GridCreate: ndim nparts GridCreate: 2 2 # GridSetExtents: part ilower(ndim) iupper(ndim) #GridSetExtents: 0 (0- 0-) (15+ 15+) #GridSetExtents: 1 (12- 12-) (19+ 19+) GridSetExtents: 0 (0- 0-) (7+ 15+) GridSetExtents: 1 (6- 12-) (13+ 19+) # GridSetVariables: part nvars vartypes[nvars] # NODE = 1 GridSetVariables: 0 1 [1] GridSetVariables: 1 1 [1] ########################################################### # StencilCreate: nstencils sizes[nstencils] StencilCreate: 1 [5] # StencilSetEntry: stencil_num entry offset[ndim] var value StencilSetEntry: 0 0 [ 0 0] 0 5.0 StencilSetEntry: 0 1 [-1 0] 0 -1.0 StencilSetEntry: 0 2 [ 1 0] 0 -1.0 StencilSetEntry: 0 3 [ 0 -1] 0 -1.0 StencilSetEntry: 0 4 [ 0 1] 0 -1.0 ########################################################### # GraphSetStencil: part var stencil_num GraphSetStencil: 0 0 0 GraphSetStencil: 1 0 0 # GraphAddEntries: \ # part ilower(ndim) iupper(ndim) stride[ndim] var \ # to_part to_ilower(ndim) to_iupper(ndim) to_stride[ndim] to_var \ # index_map[ndim] entry value GraphAddEntries: 1 (13+ 12- : 0 -1) (13+ 19+ : 0 0) [1 2] 0 0 ( 6+ 5- : 1 0) ( 6+ 9+ : 1 0) [1 1] 0 [0 1] 5 -1.0 GraphAddEntries: 0 ( 6+ 5- : 1 0) ( 6+ 9+ : 1 0) [1 1] 0 1 (13+ 12- : 0 -1) (13+ 19+ : 0 0) [1 2] 0 [0 1] 5 -1.0 ########################################################### # ProcessPoolCreate: num_pools ProcessPoolCreate: 1 # ProcessPoolSetPart: pool part ProcessPoolSetPart: 0 0 ProcessPoolSetPart: 0 1 ########################################################### hypre-2.33.0/src/test/TEST_sstruct/sstruct.in.amr.2Dc000066400000000000000000000034171477326011500223010ustar00rootroot00000000000000# Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) ########################################################### # GridCreate: ndim nparts GridCreate: 2 2 # GridSetExtents: part ilower(ndim) iupper(ndim) #GridSetExtents: 0 (0- 0-) (15+ 15+) #GridSetExtents: 1 (12- 12-) (19+ 19+) GridSetExtents: 0 (0- 0-) (7+ 15+) GridSetExtents: 1 (6- 12-) (13+ 19+) # GridSetVariables: part nvars vartypes[nvars] # CELL = 0 GridSetVariables: 0 1 [0] GridSetVariables: 1 1 [0] ########################################################### # StencilCreate: nstencils sizes[nstencils] StencilCreate: 1 [5] # StencilSetEntry: stencil_num entry offset[ndim] var value StencilSetEntry: 0 0 [ 0 0] 0 5.0 StencilSetEntry: 0 1 [-1 0] 0 -1.0 StencilSetEntry: 0 2 [ 1 0] 0 -1.0 StencilSetEntry: 0 3 [ 0 -1] 0 -1.0 StencilSetEntry: 0 4 [ 0 1] 0 -1.0 ########################################################### # GraphSetStencil: part var stencil_num GraphSetStencil: 0 0 0 GraphSetStencil: 1 0 0 # GraphAddEntries: \ # part ilower(ndim) iupper(ndim) stride[ndim] var \ # to_part to_ilower(ndim) to_iupper(ndim) to_stride[ndim] to_var \ # index_map[ndim] entry value GraphAddEntries: 1 (6- 12- : 0 0) (13+ 12- :-1 0) [2 1] 0 0 (3- 5+ : 0 0) (6+ 5+ : 0 0) [1 1] 0 [0 1] 5 -1.0 GraphAddEntries: 0 (3- 5+ : 0 0) (6+ 5+ : 0 0) [1 1] 0 1 (6- 12- : 0 0) (13+ 12-: -1 0) [2 1] 0 [0 1] 5 -1.0 ########################################################### # ProcessPoolCreate: num_pools ProcessPoolCreate: 1 # ProcessPoolSetPart: pool part ProcessPoolSetPart: 0 0 ProcessPoolSetPart: 0 1 ########################################################### hypre-2.33.0/src/test/TEST_sstruct/sstruct.in.amr.2De000066400000000000000000000041161477326011500223000ustar00rootroot00000000000000# Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) #this is for testing the AP portion of GraphAddEntries #(if you do not redo the BoxManagers, then this will not #work) ########################################################### # GridCreate: ndim nparts GridCreate: 2 3 # GridSetExtents: part ilower(ndim) iupper(ndim) #GridSetExtents: 0 (0- 0-) (15+ 15+) #GridSetExtents: 1 (12- 12-) (19+ 19+) GridSetExtents: 0 (0- 0-) (7+ 15+) GridSetExtents: 1 (6- 12-) (13+ 19+) GridSetExtents: 2 (20- 30-) (30+ 40+) # GridSetVariables: part nvars vartypes[nvars] # CELL = 0 GridSetVariables: 0 1 [0] GridSetVariables: 1 1 [0] GridSetVariables: 2 1 [0] ########################################################### # StencilCreate: nstencils sizes[nstencils] StencilCreate: 1 [5] # StencilSetEntry: stencil_num entry offset[ndim] var value StencilSetEntry: 0 0 [ 0 0] 0 5.0 StencilSetEntry: 0 1 [-1 0] 0 -1.0 StencilSetEntry: 0 2 [ 1 0] 0 -1.0 StencilSetEntry: 0 3 [ 0 -1] 0 -1.0 StencilSetEntry: 0 4 [ 0 1] 0 -1.0 ########################################################### # GraphSetStencil: part var stencil_num GraphSetStencil: 0 0 0 GraphSetStencil: 1 0 0 GraphSetStencil: 2 0 0 # GraphAddEntries: \ # part ilower(ndim) iupper(ndim) stride[ndim] var \ # to_part to_ilower(ndim) to_iupper(ndim) to_stride[ndim] to_var \ # index_map[ndim] entry value GraphAddEntries: 1 (6- 12- : 0 0) (13+ 12- :-1 0) [2 1] 0 0 (3- 5+ : 0 0) (6+ 5+ : 0 0) [1 1] 0 [0 1] 5 -1.0 GraphAddEntries: 0 (3- 5+ : 0 0) (6+ 5+ : 0 0) [1 1] 0 1 (6- 12- : 0 0) (13+ 12-: -1 0) [2 1] 0 [0 1] 5 -1.0 GraphAddEntries: 0 (0- 0+ : 0 0) (0+ 0+ : 0 0) [1 1] 0 2 (30- 40- : 0 0) (30+ 40-: -1 0) [2 1] 0 [0 1] 5 -1.0 ########################################################### # ProcessPoolCreate: num_pools ProcessPoolCreate: 1 # ProcessPoolSetPart: pool part ProcessPoolSetPart: 0 0 ProcessPoolSetPart: 0 1 ########################################################### hypre-2.33.0/src/test/TEST_sstruct/sstruct.in.amr.graphadd000066400000000000000000000101101477326011500234270ustar00rootroot00000000000000# Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) ############################################################################## # # This is a simple example that tests GraphAddEntries() when data is shared by # multiple processors. # # ************************************************* # * | | | | | | |(9,9)* # * | | | | | | | * # part 1 --> *-----|-----|-----|-----|-----|-----|-----|-----* # * | | | | | | | * # * | | | | | | | * # *************-----|-----|-----|-----|-----|-----|-----|-----* # * * | | | | | | | * # * * | | | | | | | * # * *-----|-----|-----|-----|-----|-----|-----|-----* # * * | | | | | | | * # * * | | | | | | | * # *-----------*-----|-----|-----|-----|-----|-----|-----|-----* # * * | | |(5,5)| | | | * # * * | | | | | | | * # * *-----|-----|-----|-----|-----|-----|-----|-----* # * * | | | | | | | * # * * | | | | | | | * # *-----------*-----|-----|-----|-----|-----|-----|-----|-----* # * * | | | | | | | * # * * | | | | | | | * # * *-----|-----|-----|-----|-----|-----|-----|-----* # * * | | | | | | | * # * *(2,2)| | | | | | | * # *-----------************************************************* # * | | | * # * | | | * # * | | | * <-- part 0 # * | | | * # *(0,0) | | | * # ************************************************* # ############################################################################## # GridCreate: ndim nparts GridCreate: 2 2 # GridSetExtents: part ilower(ndim) iupper(ndim) GridSetExtents: 0 (0- 0-) (3+ 3+) GridSetExtents: 1 (2- 2-) (9+ 9+) # GridSetVariables: part nvars vartypes[nvars] # NODE = 1 GridSetVariables: 0 1 [1] GridSetVariables: 1 1 [1] ########################################################### # (note: Stencil and FEMStencil cannot be used together) # StencilCreate: nstencils sizes[nstencils] StencilCreate: 1 [5] # StencilSetEntry: stencil_num entry offset[ndim] var value StencilSetEntry: 0 0 [ 0 0] 0 5.0 StencilSetEntry: 0 1 [-1 0] 0 -1.0 StencilSetEntry: 0 2 [ 1 0] 0 -1.0 StencilSetEntry: 0 3 [ 0 -1] 0 -1.0 StencilSetEntry: 0 4 [ 0 1] 0 -1.0 # RhsSet: value RhsSet: 1.0 ########################################################### # GraphSetStencil: part var stencil_num GraphSetStencil: 0 0 0 GraphSetStencil: 1 0 0 # GraphAddEntries: \ # part ilower(ndim) iupper(ndim) stride[ndim] var \ # to_part to_ilower(ndim) to_iupper(ndim) to_stride[ndim] to_var \ # index_map[ndim] entry value # (note: this could be made to work with FEMStencil, but 'entry' needs to change) GraphAddEntries: 0 (1- 1- : -1 -1) (2+ 2+ : 0 0) [1 1] 0 1 (2- 2- : -1 -1) (5+ 5+ : 0 0) [2 2] 0 [0 1] 5 -0.5 ########################################################### # ProcessPoolCreate: num_pools ProcessPoolCreate: 1 # ProcessPoolSetPart: pool part ProcessPoolSetPart: 0 0 ProcessPoolSetPart: 0 1 # ProcessPoolCreate: num_pools ProcessPoolCreate: 2 # ProcessPoolSetPart: pool part ProcessPoolSetPart: 0 0 ProcessPoolSetPart: 1 1 ########################################################### hypre-2.33.0/src/test/TEST_sstruct/sstruct.in.bcube000066400000000000000000000035411477326011500221710ustar00rootroot00000000000000# Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) ########################################################### # GridCreate: ndim nparts GridCreate: 3 2 # GridSetExtents: part ilower(ndim) iupper(ndim) GridSetExtents: 0 (1- 1- 1-) (2+ 2+ 1+) GridSetExtents: 1 (1- 1- 1-) (2+ 2+ 1+) # GridSetVariables: part nvars vartypes[nvars] # CELL = 0 GridSetVariables: 0 1 [0] GridSetVariables: 1 1 [0] # GridSetNeighborPart: part ilower(ndim) iupper(ndim) \ # nbor_part nbor_ilower(ndim) nbor_iupper(ndim) \ # index_map[ndim] index_dir[ndim] GridSetNeighborPart: 0 (0- 0- 2-) (3+ 3+ 2-) 1 (0- 0- 1-) (3+ 3+ 1-) [0 1 2] [1 1 1] GridSetNeighborPart: 1 (0- 0- 0+) (3+ 3+ 0+) 0 (0- 0- 1+) (3+ 3+ 1+) [0 1 2] [1 1 1] # extra call for testing GridSetNeighborPart: 0 (2- 2- 2-) (3+ 3+ 2-) 1 (2- 2- 1-) (3+ 3+ 1-) [0 1 2] [1 1 1] ########################################################### # StencilCreate: nstencils sizes[nstencils] StencilCreate: 1 [7] # StencilSetEntry: stencil_num entry offset[ndim] var value StencilSetEntry: 0 0 [ 0 0 0] 0 6.0 StencilSetEntry: 0 1 [-1 0 0] 0 -1.0 StencilSetEntry: 0 2 [ 1 0 0] 0 -1.0 StencilSetEntry: 0 3 [ 0 -1 0] 0 -1.0 StencilSetEntry: 0 4 [ 0 1 0] 0 -1.0 StencilSetEntry: 0 5 [ 0 0 -1] 0 -1.0 StencilSetEntry: 0 6 [ 0 0 1] 0 -1.0 ########################################################### # GraphSetStencil: part var stencil_num GraphSetStencil: 0 0 0 GraphSetStencil: 1 0 0 ########################################################### # ProcessPoolCreate: num_pools ProcessPoolCreate: 1 # ProcessPoolSetPart: pool part ProcessPoolSetPart: 0 0 ProcessPoolSetPart: 0 1 ########################################################### hypre-2.33.0/src/test/TEST_sstruct/sstruct.in.bcube-fem000066400000000000000000000035101477326011500227320ustar00rootroot00000000000000# Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) ########################################################### # GridCreate: ndim nparts GridCreate: 3 2 # GridSetExtents: part ilower(ndim) iupper(ndim) GridSetExtents: 0 (1- 1- 1-) (2+ 2+ 1+) GridSetExtents: 1 (1- 1- 1-) (2+ 2+ 1+) # GridSetVariables: part nvars vartypes[nvars] # NODE = 1 GridSetVariables: 0 1 [1] GridSetVariables: 1 1 [1] # GridSetSharedPart: part ilower(ndim) iupper(ndim) offset[ndim] \ # spart silower(ndim) siupper(ndim) soffset[ndim] \ # index_map[ndim] index_dir[ndim] GridSetSharedPart: 0 (0- 0- 1+) (3+ 3+ 1+) [0 0 1] 1 (0- 0- 1-) (3+ 3+ 1-) [0 0 -1] [0 1 2] [1 1 1] GridSetSharedPart: 1 (0- 0- 1-) (3+ 3+ 1-) [0 0 -1] 0 (0- 0- 1+) (3+ 3+ 1+) [0 0 1] [0 1 2] [1 1 1] ########################################################### # FEMStencilCreate: size FEMStencilCreate: 8 # FEMStencilSetRow: row offset[ndim] var values[size] FEMStencilSetRow: 0 [-1 -1 -1] 0 [ 4 -1 -1 0 -1 0 0 0 ] FEMStencilSetRow: 1 [ 0 -1 -1] 0 [ -1 4 0 -1 0 -1 0 0 ] FEMStencilSetRow: 2 [-1 0 -1] 0 [ -1 0 4 -1 0 0 -1 0 ] FEMStencilSetRow: 3 [ 0 0 -1] 0 [ 0 -1 -1 4 0 0 0 -1 ] FEMStencilSetRow: 4 [-1 -1 0] 0 [ -1 0 0 0 4 -1 -1 0 ] FEMStencilSetRow: 5 [ 0 -1 0] 0 [ 0 -1 0 0 -1 4 0 -1 ] FEMStencilSetRow: 6 [-1 0 0] 0 [ 0 0 -1 0 -1 0 4 -1 ] FEMStencilSetRow: 7 [ 0 0 0] 0 [ 0 0 0 -1 0 -1 -1 4 ] ########################################################### # ProcessPoolCreate: num_pools ProcessPoolCreate: 1 # ProcessPoolSetPart: pool part ProcessPoolSetPart: 0 0 ProcessPoolSetPart: 0 1 ########################################################### hypre-2.33.0/src/test/TEST_sstruct/sstruct.in.block000066400000000000000000000033651477326011500222070ustar00rootroot00000000000000# Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) ########################################################### # GridCreate: ndim nparts GridCreate: 3 2 # GridSetExtents: part ilower(ndim) iupper(ndim) GridSetExtents: 0 (1- 1- 1-) (1+ 2+ 2+) GridSetExtents: 1 (1- 1- 1-) (2+ 1+ 2+) # GridSetVariables: part nvars vartypes[nvars] # CELL = 0 GridSetVariables: 0 1 [0] GridSetVariables: 1 1 [0] # GridSetNeighborPart: part ilower(ndim) iupper(ndim) \ # nbor_part nbor_ilower(ndim) nbor_iupper(ndim) \ # index_map[ndim] index_dir[ndim] GridSetNeighborPart: 0 (2- 1- 1-) (2- 2+ 2+) 1 (2+ 1- 1-) (1- 1- 2+) [1 0 2] [1 -1 1] GridSetNeighborPart: 1 (1- 0+ 1-) (2+ 0+ 2+) 0 (1+ 2+ 1-) (1+ 1- 2+) [1 0 2] [-1 1 1] ########################################################### # StencilCreate: nstencils sizes[nstencils] StencilCreate: 1 [7] # StencilSetEntry: stencil_num entry offset[ndim] var value StencilSetEntry: 0 0 [ 0 0 0] 0 6.0 StencilSetEntry: 0 1 [-1 0 0] 0 -1.0 StencilSetEntry: 0 2 [ 1 0 0] 0 -1.0 StencilSetEntry: 0 3 [ 0 -1 0] 0 -1.0 StencilSetEntry: 0 4 [ 0 1 0] 0 -1.0 StencilSetEntry: 0 5 [ 0 0 -1] 0 -1.0 StencilSetEntry: 0 6 [ 0 0 1] 0 -1.0 ########################################################### # GraphSetStencil: part var stencil_num GraphSetStencil: 0 0 0 GraphSetStencil: 1 0 0 ########################################################### # ProcessPoolCreate: num_pools ProcessPoolCreate: 1 # ProcessPoolSetPart: pool part ProcessPoolSetPart: 0 0 ProcessPoolSetPart: 0 1 ########################################################### hypre-2.33.0/src/test/TEST_sstruct/sstruct.in.cube000066400000000000000000000034001477326011500220210ustar00rootroot00000000000000# Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) ########################################################### # GridCreate: ndim nparts GridCreate: 3 1 # GridSetExtents: part ilower(ndim) iupper(ndim) GridSetExtents: 0 (1- 1- 1-) (2+ 2+ 2+) # GridSetVariables: part nvars vartypes[nvars] # CELL = 0 GridSetVariables: 0 1 [0] ########################################################### # StencilCreate: nstencils sizes[nstencils] StencilCreate: 1 [7] # StencilSetEntry: stencil_num entry offset[ndim] var value StencilSetEntry: 0 0 [ 0 0 0] 0 6.0 StencilSetEntry: 0 1 [-1 0 0] 0 -1.0 StencilSetEntry: 0 2 [ 1 0 0] 0 -1.0 StencilSetEntry: 0 3 [ 0 -1 0] 0 -1.0 StencilSetEntry: 0 4 [ 0 1 0] 0 -1.0 StencilSetEntry: 0 5 [ 0 0 -1] 0 -1.0 StencilSetEntry: 0 6 [ 0 0 1] 0 -1.0 ########################################################### # GraphSetStencil: part var stencil_num GraphSetStencil: 0 0 0 ########################################################### # MatrixSetValues: \ # part ilower(ndim) iupper(ndim) stride[ndim] var entry value MatrixSetValues: 0 (1- 1- 1-) (1- 2+ 2+) [1 1 1] 0 1 0.0 MatrixSetValues: 0 (2+ 1- 1-) (2+ 2+ 2+) [1 1 1] 0 2 0.0 MatrixSetValues: 0 (1- 1- 1-) (2+ 1- 2+) [1 1 1] 0 3 0.0 MatrixSetValues: 0 (1- 2+ 1-) (2+ 2+ 2+) [1 1 1] 0 4 0.0 MatrixSetValues: 0 (1- 1- 1-) (2+ 2+ 1-) [1 1 1] 0 5 0.0 MatrixSetValues: 0 (1- 1- 2+) (2+ 2+ 2+) [1 1 1] 0 6 0.0 ########################################################### # ProcessPoolCreate: num_pools ProcessPoolCreate: 1 # ProcessPoolSetPart: pool part ProcessPoolSetPart: 0 0 ########################################################### hypre-2.33.0/src/test/TEST_sstruct/sstruct.in.cube-fem000066400000000000000000000026511477326011500225750ustar00rootroot00000000000000# Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) ########################################################### # GridCreate: ndim nparts GridCreate: 3 1 # GridSetExtents: part ilower(ndim) iupper(ndim) GridSetExtents: 0 (1- 1- 1-) (2+ 2+ 2+) # GridSetVariables: part nvars vartypes[nvars] # NODE = 1 GridSetVariables: 0 1 [1] ########################################################### # FEMStencilCreate: size FEMStencilCreate: 8 # FEMStencilSetRow: row offset[ndim] var values[size] FEMStencilSetRow: 0 [-1 -1 -1] 0 [ 4 -1 -1 0 -1 0 0 0 ] FEMStencilSetRow: 1 [ 0 -1 -1] 0 [ -1 4 0 -1 0 -1 0 0 ] FEMStencilSetRow: 2 [-1 0 -1] 0 [ -1 0 4 -1 0 0 -1 0 ] FEMStencilSetRow: 3 [ 0 0 -1] 0 [ 0 -1 -1 4 0 0 0 -1 ] FEMStencilSetRow: 4 [-1 -1 0] 0 [ -1 0 0 0 4 -1 -1 0 ] FEMStencilSetRow: 5 [ 0 -1 0] 0 [ 0 -1 0 0 -1 4 0 -1 ] FEMStencilSetRow: 6 [-1 0 0] 0 [ 0 0 -1 0 -1 0 4 -1 ] FEMStencilSetRow: 7 [ 0 0 0] 0 [ 0 0 0 -1 0 -1 -1 4 ] # FEMRhsSet: values[size] FEMRhsSet: [ 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 ] ########################################################### # ProcessPoolCreate: num_pools ProcessPoolCreate: 1 # ProcessPoolSetPart: pool part ProcessPoolSetPart: 0 0 ########################################################### hypre-2.33.0/src/test/TEST_sstruct/sstruct.in.cube21000066400000000000000000000045071477326011500221750ustar00rootroot00000000000000# Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) ########################################################### # GridCreate: ndim nparts GridCreate: 3 1 # GridSetExtents: part ilower(ndim) iupper(ndim) GridSetExtents: 0 (1- 1- 1-) (2+ 2+ 2+) # GridSetVariables: part nvars vartypes[nvars] # CELL = 0 GridSetVariables: 0 1 [0] ########################################################### # StencilCreate: nstencils sizes[nstencils] StencilCreate: 1 [21] # StencilSetEntry: stencil_num entry offset[ndim] var value StencilSetEntry: 0 0 [ 0 0 0] 0 32.0 StencilSetEntry: 0 1 [-1 -1 0] 0 -2.0 StencilSetEntry: 0 2 [ 1 -1 0] 0 -2.0 StencilSetEntry: 0 3 [-1 1 0] 0 -2.0 StencilSetEntry: 0 4 [ 1 1 0] 0 -2.0 StencilSetEntry: 0 5 [-1 0 -1] 0 -2.0 StencilSetEntry: 0 6 [ 1 0 -1] 0 -2.0 StencilSetEntry: 0 7 [ 0 -1 -1] 0 -2.0 StencilSetEntry: 0 8 [-1 -1 -1] 0 -1.0 StencilSetEntry: 0 9 [ 1 -1 -1] 0 -1.0 StencilSetEntry: 0 10 [ 0 1 -1] 0 -2.0 StencilSetEntry: 0 11 [-1 1 -1] 0 -1.0 StencilSetEntry: 0 12 [ 1 1 -1] 0 -1.0 StencilSetEntry: 0 13 [-1 0 1] 0 -2.0 StencilSetEntry: 0 14 [ 1 0 1] 0 -2.0 StencilSetEntry: 0 15 [ 0 -1 1] 0 -2.0 StencilSetEntry: 0 16 [-1 -1 1] 0 -1.0 StencilSetEntry: 0 17 [ 1 -1 1] 0 -1.0 StencilSetEntry: 0 18 [ 0 1 1] 0 -2.0 StencilSetEntry: 0 19 [-1 1 1] 0 -1.0 StencilSetEntry: 0 20 [ 1 1 1] 0 -1.0 ########################################################### # GraphSetStencil: part var stencil_num GraphSetStencil: 0 0 0 ########################################################### # MatrixSetValues: \ # part ilower(ndim) iupper(ndim) stride[ndim] var entry value MatrixSetValues: 0 (1- 1- 1-) (1- 2+ 2+) [1 1 1] 0 1 0.0 MatrixSetValues: 0 (2+ 1- 1-) (2+ 2+ 2+) [1 1 1] 0 2 0.0 MatrixSetValues: 0 (1- 1- 1-) (2+ 1- 2+) [1 1 1] 0 3 0.0 MatrixSetValues: 0 (1- 2+ 1-) (2+ 2+ 2+) [1 1 1] 0 4 0.0 MatrixSetValues: 0 (1- 1- 1-) (2+ 2+ 1-) [1 1 1] 0 5 0.0 MatrixSetValues: 0 (1- 1- 2+) (2+ 2+ 2+) [1 1 1] 0 6 0.0 ########################################################### # ProcessPoolCreate: num_pools ProcessPoolCreate: 1 # ProcessPoolSetPart: pool part ProcessPoolSetPart: 0 0 ########################################################### hypre-2.33.0/src/test/TEST_sstruct/sstruct.in.cubes2_aniso000066400000000000000000000060701477326011500234650ustar00rootroot00000000000000# Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) ############################################################ # GridCreate: ndim nparts GridCreate: 3 2 # GridSetExtents: part ilower(ndim) iupper(ndim) GridSetExtents: 0 (0- 0- 0-) (1+ 1+ 1+) GridSetExtents: 1 (0- 0- 0-) (1+ 1+ 1+) # GridSetVariables: part nvars vartypes[nvars] GridSetVariables: 0 1 [0] GridSetVariables: 1 1 [0] # GridSetNeighborPart: part ilower(ndim) iupper(ndim) # nbor_part nbor_ilower(ndim) nbor_iupper(ndim) # index_map[ndim] index_dir[ndim] # East neighbors GridSetNeighborPart: 0 (1+ 0- 0- : 1 0 0) (1+ 1+ 1+ : 1 0 0) 1 (0- 0- 0-) (0- 1+ 1+) [0 1 2] [1 1 1] # West neighbors GridSetNeighborPart: 1 (0- 0- 0- : -1 0 0) (0- 1+ 1+ : -1 0 0) 0 (1+ 0- 0-) (1+ 1+ 1+) [0 1 2] [1 1 1] ############################################################ # StencilCreate: nstencils sizes[nstencils] StencilCreate: 2 [7 7] # StencilSetEntry: stencil_num entry offset[ndim] var value StencilSetEntry: 0 0 [ 0 0 0] 0 24.0 StencilSetEntry: 0 1 [-1 0 0] 0 -1.0 StencilSetEntry: 0 2 [ 1 0 0] 0 -1.0 StencilSetEntry: 0 3 [ 0 -1 0] 0 -10.0 StencilSetEntry: 0 4 [ 0 1 0] 0 -10.0 StencilSetEntry: 0 5 [ 0 0 -1] 0 -1.0 StencilSetEntry: 0 6 [ 0 0 1] 0 -1.0 # StencilSetEntry: stencil_num entry offset[ndim] var value StencilSetEntry: 1 0 [ 0 0 0] 0 14.0 StencilSetEntry: 1 1 [-1 0 0] 0 -1.0 StencilSetEntry: 1 2 [ 1 0 0] 0 -1.0 StencilSetEntry: 1 3 [ 0 -1 0] 0 -1.0 StencilSetEntry: 1 4 [ 0 1 0] 0 -1.0 StencilSetEntry: 1 5 [ 0 0 -1] 0 -5.0 StencilSetEntry: 1 6 [ 0 0 1] 0 -5.0 ############################################################ # GraphSetStencil: part var stencil_num GraphSetStencil: 0 0 0 GraphSetStencil: 1 0 1 ############################################################ # MatrixSetValues: boundary conditions # part ilower(ndim) iupper(ndim) stride[ndim] var entry value # Top BCs MatrixSetValues: 0 (0- 0- 1+) (1+ 1+ 1+) [1 1 1] 0 6 0.0 MatrixSetValues: 1 (0- 0- 1+) (1+ 1+ 1+) [1 1 1] 0 6 0.0 # Bottom BCs MatrixSetValues: 0 (0- 0- 0-) (1+ 1+ 0-) [1 1 1] 0 5 0.0 MatrixSetValues: 1 (0- 0- 0-) (1+ 1+ 0-) [1 1 1] 0 5 0.0 # North BCs MatrixSetValues: 0 (0- 1+ 0-) (1+ 1+ 1+) [1 1 1] 0 4 0.0 MatrixSetValues: 1 (0- 1+ 0-) (1+ 1+ 1+) [1 1 1] 0 4 0.0 # South BCs MatrixSetValues: 0 (0- 0- 0-) (1+ 0- 1+) [1 1 1] 0 3 0.0 MatrixSetValues: 1 (0- 0- 0-) (1+ 0- 1+) [1 1 1] 0 3 0.0 # East BCs MatrixSetValues: 1 (1+ 0- 0-) (1+ 1+ 1+) [1 1 1] 0 2 0.0 # West BCs MatrixSetValues: 0 (0- 0- 0-) (0- 1+ 1+) [1 1 1] 0 1 0.0 ############################################################ # ProcessPoolCreate: num_pools ProcessPoolCreate: 2 # ProcessPoolSetPart: pool part ProcessPoolSetPart: 0 0 ProcessPoolSetPart: 1 1 # ProcessPoolCreate: num_pools ProcessPoolCreate: 1 # ProcessPoolSetPart: pool part ProcessPoolSetPart: 0 0 ProcessPoolSetPart: 0 1 ############################################################ hypre-2.33.0/src/test/TEST_sstruct/sstruct.in.cubes4_27pt000066400000000000000000000301271477326011500231520ustar00rootroot00000000000000# Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) ############################################################ # GridCreate: ndim nparts GridCreate: 3 4 # GridSetExtents: part ilower(ndim) iupper(ndim) GridSetExtents: 0 (0- 0- 0-) (1+ 1+ 3+) GridSetExtents: 1 (0- 0- 0-) (1+ 1+ 3+) GridSetExtents: 2 (0- 0- 0-) (1+ 1+ 3+) GridSetExtents: 3 (0- 0- 0-) (1+ 1+ 3+) # GridSetVariables: part nvars vartypes[nvars] GridSetVariables: 0 1 [0] GridSetVariables: 1 1 [0] GridSetVariables: 2 1 [0] GridSetVariables: 3 1 [0] # GridSetNeighborPart: part ilower(ndim) iupper(ndim) # nbor_part nbor_ilower(ndim) nbor_iupper(ndim) # index_map[ndim] index_dir[ndim] # North neighbors GridSetNeighborPart: 0 (0- 1+ 0- : 0 1 0) (1+ 1+ 3+ : 0 1 0) 2 (0- 0- 0-) (1+ 0- 3+) [0 1 2] [1 1 1] GridSetNeighborPart: 1 (0- 1+ 0- : 0 1 0) (1+ 1+ 3+ : 0 1 0) 3 (0- 0- 0-) (1+ 0- 3+) [0 1 2] [1 1 1] # South neighbors GridSetNeighborPart: 2 (0- 0- 0- : 0 -1 0) (1+ 0- 3+ : 0 -1 0) 0 (0- 1+ 0-) (1+ 1+ 3+) [0 1 2] [1 1 1] GridSetNeighborPart: 3 (0- 0- 0- : 0 -1 0) (1+ 0- 3+ : 0 -1 0) 1 (0- 1+ 0-) (1+ 1+ 3+) [0 1 2] [1 1 1] # East neighbors GridSetNeighborPart: 0 (1+ 0- 0- : 1 0 0) (1+ 1+ 3+ : 1 0 0) 1 (0- 0- 0-) (0- 1+ 3+) [0 1 2] [1 1 1] GridSetNeighborPart: 2 (1+ 0- 0- : 1 0 0) (1+ 1+ 3+ : 1 0 0) 3 (0- 0- 0-) (0- 1+ 3+) [0 1 2] [1 1 1] # West neighbors GridSetNeighborPart: 1 (0- 0- 0- : -1 0 0) (0- 1+ 3+ : -1 0 0) 0 (1+ 0- 0-) (1+ 1+ 3+) [0 1 2] [1 1 1] GridSetNeighborPart: 3 (0- 0- 0- : -1 0 0) (0- 1+ 3+ : -1 0 0) 2 (1+ 0- 0-) (1+ 1+ 3+) [0 1 2] [1 1 1] ############################################################ ############################################################ # StencilCreate: nstencils sizes[nstencils] StencilCreate: 1 [27] # StencilSetEntry: stencil_num entry offset[ndim] var value StencilSetEntry: 0 0 [ 0 0 0] 0 26.0 StencilSetEntry: 0 1 [-1 0 0] 0 -1.0 StencilSetEntry: 0 2 [ 1 0 0] 0 -1.0 StencilSetEntry: 0 3 [-1 -1 0] 0 -1.0 StencilSetEntry: 0 4 [ 0 -1 0] 0 -1.0 StencilSetEntry: 0 5 [ 1 -1 0] 0 -1.0 StencilSetEntry: 0 6 [-1 1 0] 0 -1.0 StencilSetEntry: 0 7 [ 0 1 0] 0 -1.0 StencilSetEntry: 0 8 [ 1 1 0] 0 -1.0 StencilSetEntry: 0 9 [ 0 0 -1] 0 -1.0 StencilSetEntry: 0 10 [-1 0 -1] 0 -1.0 StencilSetEntry: 0 11 [ 1 0 -1] 0 -1.0 StencilSetEntry: 0 12 [-1 -1 -1] 0 -1.0 StencilSetEntry: 0 13 [ 0 -1 -1] 0 -1.0 StencilSetEntry: 0 14 [ 1 -1 -1] 0 -1.0 StencilSetEntry: 0 15 [-1 1 -1] 0 -1.0 StencilSetEntry: 0 16 [ 0 1 -1] 0 -1.0 StencilSetEntry: 0 17 [ 1 1 -1] 0 -1.0 StencilSetEntry: 0 18 [ 0 0 1] 0 -1.0 StencilSetEntry: 0 19 [-1 0 1] 0 -1.0 StencilSetEntry: 0 20 [ 1 0 1] 0 -1.0 StencilSetEntry: 0 21 [-1 -1 1] 0 -1.0 StencilSetEntry: 0 22 [ 0 -1 1] 0 -1.0 StencilSetEntry: 0 23 [ 1 -1 1] 0 -1.0 StencilSetEntry: 0 24 [-1 1 1] 0 -1.0 StencilSetEntry: 0 25 [ 0 1 1] 0 -1.0 StencilSetEntry: 0 26 [ 1 1 1] 0 -1.0 ############################################################ # GraphSetStencil: part var stencil_num GraphSetStencil: 0 0 0 GraphSetStencil: 1 0 0 GraphSetStencil: 2 0 0 GraphSetStencil: 3 0 0 ############################################################ # MatrixSetValues: boundary conditions # part ilower(ndim) iupper(ndim) stride[ndim] var entry value # Top BCs MatrixSetValues: 0 (0- 0- 3+) (1+ 1+ 3+) [1 1 1] 0 18 0.0 MatrixSetValues: 0 (0- 0- 3+) (1+ 1+ 3+) [1 1 1] 0 19 0.0 MatrixSetValues: 0 (0- 0- 3+) (1+ 1+ 3+) [1 1 1] 0 20 0.0 MatrixSetValues: 0 (0- 0- 3+) (1+ 1+ 3+) [1 1 1] 0 21 0.0 MatrixSetValues: 0 (0- 0- 3+) (1+ 1+ 3+) [1 1 1] 0 22 0.0 MatrixSetValues: 0 (0- 0- 3+) (1+ 1+ 3+) [1 1 1] 0 23 0.0 MatrixSetValues: 0 (0- 0- 3+) (1+ 1+ 3+) [1 1 1] 0 24 0.0 MatrixSetValues: 0 (0- 0- 3+) (1+ 1+ 3+) [1 1 1] 0 25 0.0 MatrixSetValues: 0 (0- 0- 3+) (1+ 1+ 3+) [1 1 1] 0 26 0.0 MatrixSetValues: 1 (0- 0- 3+) (1+ 1+ 3+) [1 1 1] 0 18 0.0 MatrixSetValues: 1 (0- 0- 3+) (1+ 1+ 3+) [1 1 1] 0 19 0.0 MatrixSetValues: 1 (0- 0- 3+) (1+ 1+ 3+) [1 1 1] 0 20 0.0 MatrixSetValues: 1 (0- 0- 3+) (1+ 1+ 3+) [1 1 1] 0 21 0.0 MatrixSetValues: 1 (0- 0- 3+) (1+ 1+ 3+) [1 1 1] 0 22 0.0 MatrixSetValues: 1 (0- 0- 3+) (1+ 1+ 3+) [1 1 1] 0 23 0.0 MatrixSetValues: 1 (0- 0- 3+) (1+ 1+ 3+) [1 1 1] 0 24 0.0 MatrixSetValues: 1 (0- 0- 3+) (1+ 1+ 3+) [1 1 1] 0 25 0.0 MatrixSetValues: 1 (0- 0- 3+) (1+ 1+ 3+) [1 1 1] 0 26 0.0 MatrixSetValues: 2 (0- 0- 3+) (1+ 1+ 3+) [1 1 1] 0 18 0.0 MatrixSetValues: 2 (0- 0- 3+) (1+ 1+ 3+) [1 1 1] 0 19 0.0 MatrixSetValues: 2 (0- 0- 3+) (1+ 1+ 3+) [1 1 1] 0 20 0.0 MatrixSetValues: 2 (0- 0- 3+) (1+ 1+ 3+) [1 1 1] 0 21 0.0 MatrixSetValues: 2 (0- 0- 3+) (1+ 1+ 3+) [1 1 1] 0 22 0.0 MatrixSetValues: 2 (0- 0- 3+) (1+ 1+ 3+) [1 1 1] 0 23 0.0 MatrixSetValues: 2 (0- 0- 3+) (1+ 1+ 3+) [1 1 1] 0 24 0.0 MatrixSetValues: 2 (0- 0- 3+) (1+ 1+ 3+) [1 1 1] 0 25 0.0 MatrixSetValues: 2 (0- 0- 3+) (1+ 1+ 3+) [1 1 1] 0 26 0.0 MatrixSetValues: 3 (0- 0- 3+) (1+ 1+ 3+) [1 1 1] 0 18 0.0 MatrixSetValues: 3 (0- 0- 3+) (1+ 1+ 3+) [1 1 1] 0 19 0.0 MatrixSetValues: 3 (0- 0- 3+) (1+ 1+ 3+) [1 1 1] 0 20 0.0 MatrixSetValues: 3 (0- 0- 3+) (1+ 1+ 3+) [1 1 1] 0 21 0.0 MatrixSetValues: 3 (0- 0- 3+) (1+ 1+ 3+) [1 1 1] 0 22 0.0 MatrixSetValues: 3 (0- 0- 3+) (1+ 1+ 3+) [1 1 1] 0 23 0.0 MatrixSetValues: 3 (0- 0- 3+) (1+ 1+ 3+) [1 1 1] 0 24 0.0 MatrixSetValues: 3 (0- 0- 3+) (1+ 1+ 3+) [1 1 1] 0 25 0.0 MatrixSetValues: 3 (0- 0- 3+) (1+ 1+ 3+) [1 1 1] 0 26 0.0 # Bottom BCs MatrixSetValues: 0 (0- 0- 0-) (1+ 1+ 0-) [1 1 1] 0 9 0.0 MatrixSetValues: 0 (0- 0- 0-) (1+ 1+ 0-) [1 1 1] 0 10 0.0 MatrixSetValues: 0 (0- 0- 0-) (1+ 1+ 0-) [1 1 1] 0 11 0.0 MatrixSetValues: 0 (0- 0- 0-) (1+ 1+ 0-) [1 1 1] 0 12 0.0 MatrixSetValues: 0 (0- 0- 0-) (1+ 1+ 0-) [1 1 1] 0 13 0.0 MatrixSetValues: 0 (0- 0- 0-) (1+ 1+ 0-) [1 1 1] 0 14 0.0 MatrixSetValues: 0 (0- 0- 0-) (1+ 1+ 0-) [1 1 1] 0 15 0.0 MatrixSetValues: 0 (0- 0- 0-) (1+ 1+ 0-) [1 1 1] 0 16 0.0 MatrixSetValues: 0 (0- 0- 0-) (1+ 1+ 0-) [1 1 1] 0 17 0.0 MatrixSetValues: 1 (0- 0- 0-) (1+ 1+ 0-) [1 1 1] 0 9 0.0 MatrixSetValues: 1 (0- 0- 0-) (1+ 1+ 0-) [1 1 1] 0 10 0.0 MatrixSetValues: 1 (0- 0- 0-) (1+ 1+ 0-) [1 1 1] 0 11 0.0 MatrixSetValues: 1 (0- 0- 0-) (1+ 1+ 0-) [1 1 1] 0 12 0.0 MatrixSetValues: 1 (0- 0- 0-) (1+ 1+ 0-) [1 1 1] 0 13 0.0 MatrixSetValues: 1 (0- 0- 0-) (1+ 1+ 0-) [1 1 1] 0 14 0.0 MatrixSetValues: 1 (0- 0- 0-) (1+ 1+ 0-) [1 1 1] 0 15 0.0 MatrixSetValues: 1 (0- 0- 0-) (1+ 1+ 0-) [1 1 1] 0 16 0.0 MatrixSetValues: 1 (0- 0- 0-) (1+ 1+ 0-) [1 1 1] 0 17 0.0 MatrixSetValues: 2 (0- 0- 0-) (1+ 1+ 0-) [1 1 1] 0 9 0.0 MatrixSetValues: 2 (0- 0- 0-) (1+ 1+ 0-) [1 1 1] 0 10 0.0 MatrixSetValues: 2 (0- 0- 0-) (1+ 1+ 0-) [1 1 1] 0 11 0.0 MatrixSetValues: 2 (0- 0- 0-) (1+ 1+ 0-) [1 1 1] 0 12 0.0 MatrixSetValues: 2 (0- 0- 0-) (1+ 1+ 0-) [1 1 1] 0 13 0.0 MatrixSetValues: 2 (0- 0- 0-) (1+ 1+ 0-) [1 1 1] 0 14 0.0 MatrixSetValues: 2 (0- 0- 0-) (1+ 1+ 0-) [1 1 1] 0 15 0.0 MatrixSetValues: 2 (0- 0- 0-) (1+ 1+ 0-) [1 1 1] 0 16 0.0 MatrixSetValues: 2 (0- 0- 0-) (1+ 1+ 0-) [1 1 1] 0 17 0.0 MatrixSetValues: 3 (0- 0- 0-) (1+ 1+ 0-) [1 1 1] 0 9 0.0 MatrixSetValues: 3 (0- 0- 0-) (1+ 1+ 0-) [1 1 1] 0 10 0.0 MatrixSetValues: 3 (0- 0- 0-) (1+ 1+ 0-) [1 1 1] 0 11 0.0 MatrixSetValues: 3 (0- 0- 0-) (1+ 1+ 0-) [1 1 1] 0 12 0.0 MatrixSetValues: 3 (0- 0- 0-) (1+ 1+ 0-) [1 1 1] 0 13 0.0 MatrixSetValues: 3 (0- 0- 0-) (1+ 1+ 0-) [1 1 1] 0 14 0.0 MatrixSetValues: 3 (0- 0- 0-) (1+ 1+ 0-) [1 1 1] 0 15 0.0 MatrixSetValues: 3 (0- 0- 0-) (1+ 1+ 0-) [1 1 1] 0 16 0.0 MatrixSetValues: 3 (0- 0- 0-) (1+ 1+ 0-) [1 1 1] 0 17 0.0 # North BCs MatrixSetValues: 2 (0- 1+ 0-) (1+ 1+ 3+) [1 1 1] 0 6 0.0 MatrixSetValues: 2 (0- 1+ 0-) (1+ 1+ 3+) [1 1 1] 0 7 0.0 MatrixSetValues: 2 (0- 1+ 0-) (1+ 1+ 3+) [1 1 1] 0 8 0.0 MatrixSetValues: 2 (0- 1+ 0-) (1+ 1+ 3+) [1 1 1] 0 15 0.0 MatrixSetValues: 2 (0- 1+ 0-) (1+ 1+ 3+) [1 1 1] 0 16 0.0 MatrixSetValues: 2 (0- 1+ 0-) (1+ 1+ 3+) [1 1 1] 0 17 0.0 MatrixSetValues: 2 (0- 1+ 0-) (1+ 1+ 3+) [1 1 1] 0 24 0.0 MatrixSetValues: 2 (0- 1+ 0-) (1+ 1+ 3+) [1 1 1] 0 25 0.0 MatrixSetValues: 2 (0- 1+ 0-) (1+ 1+ 3+) [1 1 1] 0 26 0.0 MatrixSetValues: 3 (0- 1+ 0-) (1+ 1+ 3+) [1 1 1] 0 6 0.0 MatrixSetValues: 3 (0- 1+ 0-) (1+ 1+ 3+) [1 1 1] 0 7 0.0 MatrixSetValues: 3 (0- 1+ 0-) (1+ 1+ 3+) [1 1 1] 0 8 0.0 MatrixSetValues: 3 (0- 1+ 0-) (1+ 1+ 3+) [1 1 1] 0 15 0.0 MatrixSetValues: 3 (0- 1+ 0-) (1+ 1+ 3+) [1 1 1] 0 16 0.0 MatrixSetValues: 3 (0- 1+ 0-) (1+ 1+ 3+) [1 1 1] 0 17 0.0 MatrixSetValues: 3 (0- 1+ 0-) (1+ 1+ 3+) [1 1 1] 0 24 0.0 MatrixSetValues: 3 (0- 1+ 0-) (1+ 1+ 3+) [1 1 1] 0 25 0.0 MatrixSetValues: 3 (0- 1+ 0-) (1+ 1+ 3+) [1 1 1] 0 26 0.0 # South BCs MatrixSetValues: 0 (0- 0- 0-) (1+ 0- 3+) [1 1 1] 0 3 0.0 MatrixSetValues: 0 (0- 0- 0-) (1+ 0- 3+) [1 1 1] 0 4 0.0 MatrixSetValues: 0 (0- 0- 0-) (1+ 0- 3+) [1 1 1] 0 5 0.0 MatrixSetValues: 0 (0- 0- 0-) (1+ 0- 3+) [1 1 1] 0 12 0.0 MatrixSetValues: 0 (0- 0- 0-) (1+ 0- 3+) [1 1 1] 0 13 0.0 MatrixSetValues: 0 (0- 0- 0-) (1+ 0- 3+) [1 1 1] 0 14 0.0 MatrixSetValues: 0 (0- 0- 0-) (1+ 0- 3+) [1 1 1] 0 21 0.0 MatrixSetValues: 0 (0- 0- 0-) (1+ 0- 3+) [1 1 1] 0 22 0.0 MatrixSetValues: 0 (0- 0- 0-) (1+ 0- 3+) [1 1 1] 0 23 0.0 MatrixSetValues: 1 (0- 0- 0-) (1+ 0- 3+) [1 1 1] 0 3 0.0 MatrixSetValues: 1 (0- 0- 0-) (1+ 0- 3+) [1 1 1] 0 4 0.0 MatrixSetValues: 1 (0- 0- 0-) (1+ 0- 3+) [1 1 1] 0 5 0.0 MatrixSetValues: 1 (0- 0- 0-) (1+ 0- 3+) [1 1 1] 0 12 0.0 MatrixSetValues: 1 (0- 0- 0-) (1+ 0- 3+) [1 1 1] 0 13 0.0 MatrixSetValues: 1 (0- 0- 0-) (1+ 0- 3+) [1 1 1] 0 14 0.0 MatrixSetValues: 1 (0- 0- 0-) (1+ 0- 3+) [1 1 1] 0 21 0.0 MatrixSetValues: 1 (0- 0- 0-) (1+ 0- 3+) [1 1 1] 0 22 0.0 MatrixSetValues: 1 (0- 0- 0-) (1+ 0- 3+) [1 1 1] 0 23 0.0 # East BCs MatrixSetValues: 1 (1+ 0- 0-) (1+ 1+ 3+) [1 1 1] 0 2 0.0 MatrixSetValues: 1 (1+ 0- 0-) (1+ 1+ 3+) [1 1 1] 0 5 0.0 MatrixSetValues: 1 (1+ 0- 0-) (1+ 1+ 3+) [1 1 1] 0 8 0.0 MatrixSetValues: 1 (1+ 0- 0-) (1+ 1+ 3+) [1 1 1] 0 11 0.0 MatrixSetValues: 1 (1+ 0- 0-) (1+ 1+ 3+) [1 1 1] 0 14 0.0 MatrixSetValues: 1 (1+ 0- 0-) (1+ 1+ 3+) [1 1 1] 0 17 0.0 MatrixSetValues: 1 (1+ 0- 0-) (1+ 1+ 3+) [1 1 1] 0 20 0.0 MatrixSetValues: 1 (1+ 0- 0-) (1+ 1+ 3+) [1 1 1] 0 23 0.0 MatrixSetValues: 1 (1+ 0- 0-) (1+ 1+ 3+) [1 1 1] 0 26 0.0 MatrixSetValues: 3 (1+ 0- 0-) (1+ 1+ 3+) [1 1 1] 0 2 0.0 MatrixSetValues: 3 (1+ 0- 0-) (1+ 1+ 3+) [1 1 1] 0 5 0.0 MatrixSetValues: 3 (1+ 0- 0-) (1+ 1+ 3+) [1 1 1] 0 8 0.0 MatrixSetValues: 3 (1+ 0- 0-) (1+ 1+ 3+) [1 1 1] 0 11 0.0 MatrixSetValues: 3 (1+ 0- 0-) (1+ 1+ 3+) [1 1 1] 0 14 0.0 MatrixSetValues: 3 (1+ 0- 0-) (1+ 1+ 3+) [1 1 1] 0 17 0.0 MatrixSetValues: 3 (1+ 0- 0-) (1+ 1+ 3+) [1 1 1] 0 20 0.0 MatrixSetValues: 3 (1+ 0- 0-) (1+ 1+ 3+) [1 1 1] 0 23 0.0 MatrixSetValues: 3 (1+ 0- 0-) (1+ 1+ 3+) [1 1 1] 0 26 0.0 # West BCs MatrixSetValues: 0 (0- 0- 0-) (0- 1+ 3+) [1 1 1] 0 1 0.0 MatrixSetValues: 0 (0- 0- 0-) (0- 1+ 3+) [1 1 1] 0 3 0.0 MatrixSetValues: 0 (0- 0- 0-) (0- 1+ 3+) [1 1 1] 0 6 0.0 MatrixSetValues: 0 (0- 0- 0-) (0- 1+ 3+) [1 1 1] 0 10 0.0 MatrixSetValues: 0 (0- 0- 0-) (0- 1+ 3+) [1 1 1] 0 12 0.0 MatrixSetValues: 0 (0- 0- 0-) (0- 1+ 3+) [1 1 1] 0 15 0.0 MatrixSetValues: 0 (0- 0- 0-) (0- 1+ 3+) [1 1 1] 0 19 0.0 MatrixSetValues: 0 (0- 0- 0-) (0- 1+ 3+) [1 1 1] 0 21 0.0 MatrixSetValues: 0 (0- 0- 0-) (0- 1+ 3+) [1 1 1] 0 24 0.0 MatrixSetValues: 2 (0- 0- 0-) (0- 1+ 3+) [1 1 1] 0 1 0.0 MatrixSetValues: 2 (0- 0- 0-) (0- 1+ 3+) [1 1 1] 0 3 0.0 MatrixSetValues: 2 (0- 0- 0-) (0- 1+ 3+) [1 1 1] 0 6 0.0 MatrixSetValues: 2 (0- 0- 0-) (0- 1+ 3+) [1 1 1] 0 10 0.0 MatrixSetValues: 2 (0- 0- 0-) (0- 1+ 3+) [1 1 1] 0 12 0.0 MatrixSetValues: 2 (0- 0- 0-) (0- 1+ 3+) [1 1 1] 0 15 0.0 MatrixSetValues: 2 (0- 0- 0-) (0- 1+ 3+) [1 1 1] 0 19 0.0 MatrixSetValues: 2 (0- 0- 0-) (0- 1+ 3+) [1 1 1] 0 21 0.0 MatrixSetValues: 2 (0- 0- 0-) (0- 1+ 3+) [1 1 1] 0 24 0.0 ############################################################ # ProcessPoolCreate: num_pools ProcessPoolCreate: 4 # ProcessPoolSetPart: pool part ProcessPoolSetPart: 0 0 ProcessPoolSetPart: 1 1 ProcessPoolSetPart: 2 2 ProcessPoolSetPart: 3 3 # ProcessPoolCreate: num_pools ProcessPoolCreate: 1 # ProcessPoolSetPart: pool part ProcessPoolSetPart: 0 0 ProcessPoolSetPart: 0 1 ProcessPoolSetPart: 0 2 ProcessPoolSetPart: 0 3 ############################################################ hypre-2.33.0/src/test/TEST_sstruct/sstruct.in.cycred-1Dx000066400000000000000000000031551477326011500230150ustar00rootroot00000000000000# Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) ########################################################### # GridCreate: ndim nparts GridCreate: 1 1 # GridSetExtents: part ilower(ndim) iupper(ndim) GridSetExtents: 0 (1-) (4+) # GridSetVariables: part nvars vartypes[nvars] # CELL = 0 GridSetVariables: 0 1 [0] ########################################################### # StencilCreate: nstencils sizes[nstencils] StencilCreate: 1 [3] # StencilSetEntry: stencil_num entry offset[ndim] var value StencilSetEntry: 0 0 [ 0] 0 2.0 StencilSetEntry: 0 1 [-1] 0 -1.0 StencilSetEntry: 0 2 [ 1] 0 -1.0 # RhsSet: value RhsSet: 0.0 ########################################################### # GraphSetStencil: part var stencil_num GraphSetStencil: 0 0 0 ########################################################### # MatrixSetValues: \ # part ilower(ndim) iupper(ndim) stride[ndim] var entry value # west MatrixSetValues: 0 (1-) (1-) [1 1] 0 1 0.0 # east MatrixSetValues: 0 (4+) (4+) [1 1] 0 2 0.0 ########################################################### # This should result in a solution of all ones # RhsAddToValues: \ # part ilower(ndim) iupper(ndim) var value # west RhsAddToValues: 0 (1-) (1-) 0 1.0 # east RhsAddToValues: 0 (4+) (4+) 0 1.0 ########################################################### # ProcessPoolCreate: num_pools ProcessPoolCreate: 1 # ProcessPoolSetPart: pool part ProcessPoolSetPart: 0 0 ########################################################### hypre-2.33.0/src/test/TEST_sstruct/sstruct.in.cycred-2Dx000066400000000000000000000032241477326011500230130ustar00rootroot00000000000000# Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) ########################################################### # GridCreate: ndim nparts GridCreate: 2 1 # GridSetExtents: part ilower(ndim) iupper(ndim) GridSetExtents: 0 (1- 1-) (4+ 4+) # GridSetVariables: part nvars vartypes[nvars] # CELL = 0 GridSetVariables: 0 1 [0] ########################################################### # StencilCreate: nstencils sizes[nstencils] StencilCreate: 1 [3] # StencilSetEntry: stencil_num entry offset[ndim] var value StencilSetEntry: 0 0 [ 0 0] 0 2.0 StencilSetEntry: 0 1 [-1 0] 0 -1.0 StencilSetEntry: 0 2 [ 1 0] 0 -1.0 # RhsSet: value RhsSet: 0.0 ########################################################### # GraphSetStencil: part var stencil_num GraphSetStencil: 0 0 0 ########################################################### # MatrixSetValues: \ # part ilower(ndim) iupper(ndim) stride[ndim] var entry value # west MatrixSetValues: 0 (1- 1-) (1- 4+) [1 1] 0 1 0.0 # east MatrixSetValues: 0 (4+ 1-) (4+ 4+) [1 1] 0 2 0.0 ########################################################### # This should result in a solution of all ones # RhsAddToValues: \ # part ilower(ndim) iupper(ndim) var value # west RhsAddToValues: 0 (1- 1-) (1- 4+) 0 1.0 # east RhsAddToValues: 0 (4+ 1-) (4+ 4+) 0 1.0 ########################################################### # ProcessPoolCreate: num_pools ProcessPoolCreate: 1 # ProcessPoolSetPart: pool part ProcessPoolSetPart: 0 0 ########################################################### hypre-2.33.0/src/test/TEST_sstruct/sstruct.in.cycred-2Dy000066400000000000000000000032251477326011500230150ustar00rootroot00000000000000# Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) ########################################################### # GridCreate: ndim nparts GridCreate: 2 1 # GridSetExtents: part ilower(ndim) iupper(ndim) GridSetExtents: 0 (1- 1-) (4+ 4+) # GridSetVariables: part nvars vartypes[nvars] # CELL = 0 GridSetVariables: 0 1 [0] ########################################################### # StencilCreate: nstencils sizes[nstencils] StencilCreate: 1 [3] # StencilSetEntry: stencil_num entry offset[ndim] var value StencilSetEntry: 0 0 [0 0] 0 2.0 StencilSetEntry: 0 1 [0 -1] 0 -1.0 StencilSetEntry: 0 2 [0 1] 0 -1.0 # RhsSet: value RhsSet: 0.0 ########################################################### # GraphSetStencil: part var stencil_num GraphSetStencil: 0 0 0 ########################################################### # MatrixSetValues: \ # part ilower(ndim) iupper(ndim) stride[ndim] var entry value # south MatrixSetValues: 0 (1- 1-) (4+ 1-) [1 1] 0 1 0.0 # north MatrixSetValues: 0 (1- 4+) (4+ 4+) [1 1] 0 2 0.0 ########################################################### # This should result in a solution of all ones # RhsAddToValues: \ # part ilower(ndim) iupper(ndim) var value # south RhsAddToValues: 0 (1- 1-) (4+ 1-) 0 1.0 # north RhsAddToValues: 0 (1- 4+) (4+ 4+) 0 1.0 ########################################################### # ProcessPoolCreate: num_pools ProcessPoolCreate: 1 # ProcessPoolSetPart: pool part ProcessPoolSetPart: 0 0 ########################################################### hypre-2.33.0/src/test/TEST_sstruct/sstruct.in.cycred-3Dx000066400000000000000000000032771477326011500230240ustar00rootroot00000000000000# Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) ########################################################### # GridCreate: ndim nparts GridCreate: 3 1 # GridSetExtents: part ilower(ndim) iupper(ndim) GridSetExtents: 0 (1- 1- 1-) (4+ 4+ 4+) # GridSetVariables: part nvars vartypes[nvars] # CELL = 0 GridSetVariables: 0 1 [0] ########################################################### # StencilCreate: nstencils sizes[nstencils] StencilCreate: 1 [3] # StencilSetEntry: stencil_num entry offset[ndim] var value StencilSetEntry: 0 0 [ 0 0 0] 0 2.0 StencilSetEntry: 0 1 [-1 0 0] 0 -1.0 StencilSetEntry: 0 2 [ 1 0 0] 0 -1.0 # RhsSet: value RhsSet: 0.0 ########################################################### # GraphSetStencil: part var stencil_num GraphSetStencil: 0 0 0 ########################################################### # MatrixSetValues: \ # part ilower(ndim) iupper(ndim) stride[ndim] var entry value # west MatrixSetValues: 0 (1- 1- 1-) (1- 4+ 4+) [1 1 1] 0 1 0.0 # east MatrixSetValues: 0 (4+ 1- 1-) (4+ 4+ 4+) [1 1 1] 0 2 0.0 ########################################################### # This should result in a solution of all ones # RhsAddToValues: \ # part ilower(ndim) iupper(ndim) var value # west RhsAddToValues: 0 (1- 1- 1-) (1- 4+ 4+) 0 1.0 # east RhsAddToValues: 0 (4+ 1- 1-) (4+ 4+ 4+) 0 1.0 ########################################################### # ProcessPoolCreate: num_pools ProcessPoolCreate: 1 # ProcessPoolSetPart: pool part ProcessPoolSetPart: 0 0 ########################################################### hypre-2.33.0/src/test/TEST_sstruct/sstruct.in.cycred-3Dy000066400000000000000000000033001477326011500230100ustar00rootroot00000000000000# Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) ########################################################### # GridCreate: ndim nparts GridCreate: 3 1 # GridSetExtents: part ilower(ndim) iupper(ndim) GridSetExtents: 0 (1- 1- 1-) (4+ 4+ 4+) # GridSetVariables: part nvars vartypes[nvars] # CELL = 0 GridSetVariables: 0 1 [0] ########################################################### # StencilCreate: nstencils sizes[nstencils] StencilCreate: 1 [3] # StencilSetEntry: stencil_num entry offset[ndim] var value StencilSetEntry: 0 0 [0 0 0] 0 2.0 StencilSetEntry: 0 1 [0 -1 0] 0 -1.0 StencilSetEntry: 0 2 [0 1 0] 0 -1.0 # RhsSet: value RhsSet: 0.0 ########################################################### # GraphSetStencil: part var stencil_num GraphSetStencil: 0 0 0 ########################################################### # MatrixSetValues: \ # part ilower(ndim) iupper(ndim) stride[ndim] var entry value # south MatrixSetValues: 0 (1- 1- 1-) (4+ 1- 4+) [1 1 1] 0 1 0.0 # north MatrixSetValues: 0 (1- 4+ 1-) (4+ 4+ 4+) [1 1 1] 0 2 0.0 ########################################################### # This should result in a solution of all ones # RhsAddToValues: \ # part ilower(ndim) iupper(ndim) var value # south RhsAddToValues: 0 (1- 1- 1-) (4+ 1- 4+) 0 1.0 # north RhsAddToValues: 0 (1- 4+ 1-) (4+ 4+ 4+) 0 1.0 ########################################################### # ProcessPoolCreate: num_pools ProcessPoolCreate: 1 # ProcessPoolSetPart: pool part ProcessPoolSetPart: 0 0 ########################################################### hypre-2.33.0/src/test/TEST_sstruct/sstruct.in.cycred-3Dz000066400000000000000000000033001477326011500230110ustar00rootroot00000000000000# Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) ########################################################### # GridCreate: ndim nparts GridCreate: 3 1 # GridSetExtents: part ilower(ndim) iupper(ndim) GridSetExtents: 0 (1- 1- 1-) (4+ 4+ 4+) # GridSetVariables: part nvars vartypes[nvars] # CELL = 0 GridSetVariables: 0 1 [0] ########################################################### # StencilCreate: nstencils sizes[nstencils] StencilCreate: 1 [3] # StencilSetEntry: stencil_num entry offset[ndim] var value StencilSetEntry: 0 0 [0 0 0] 0 2.0 StencilSetEntry: 0 1 [0 0 -1] 0 -1.0 StencilSetEntry: 0 2 [0 0 1] 0 -1.0 # RhsSet: value RhsSet: 0.0 ########################################################### # GraphSetStencil: part var stencil_num GraphSetStencil: 0 0 0 ########################################################### # MatrixSetValues: \ # part ilower(ndim) iupper(ndim) stride[ndim] var entry value # lower MatrixSetValues: 0 (1- 1- 1-) (4+ 4+ 1-) [1 1 1] 0 1 0.0 # upper MatrixSetValues: 0 (1- 1- 4+) (4+ 4+ 4+) [1 1 1] 0 2 0.0 ########################################################### # This should result in a solution of all ones # RhsAddToValues: \ # part ilower(ndim) iupper(ndim) var value # lower RhsAddToValues: 0 (1- 1- 1-) (4+ 4+ 1-) 0 1.0 # upper RhsAddToValues: 0 (1- 1- 4+) (4+ 4+ 4+) 0 1.0 ########################################################### # ProcessPoolCreate: num_pools ProcessPoolCreate: 1 # ProcessPoolSetPart: pool part ProcessPoolSetPart: 0 0 ########################################################### hypre-2.33.0/src/test/TEST_sstruct/sstruct.in.default000066400000000000000000000054741477326011500225440ustar00rootroot00000000000000# Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) ########################################################### # GridCreate: ndim nparts GridCreate: 3 2 # GridSetExtents: part ilower(ndim) iupper(ndim) GridSetExtents: 0 (1- 1- 1-) (10+ 10+ 10+) GridSetExtents: 1 (1- 1- 1-) (10+ 10+ 10+) # GridSetVariables: part nvars vartypes[nvars] # CELL = 0 # NODE = 1 GridSetVariables: 0 2 [0 1] GridSetVariables: 1 2 [0 1] ########################################################### # StencilCreate: nstencils sizes[nstencils] StencilCreate: 2 [15 15] # StencilSetEntry: stencil_num entry offset[ndim] var value StencilSetEntry: 0 0 [ 0 0 0] 0 15.0 StencilSetEntry: 0 1 [-1 0 0] 0 -1.0 StencilSetEntry: 0 2 [ 1 0 0] 0 -1.0 StencilSetEntry: 0 3 [ 0 -1 0] 0 -1.0 StencilSetEntry: 0 4 [ 0 1 0] 0 -1.0 StencilSetEntry: 0 5 [ 0 0 -1] 0 -1.0 StencilSetEntry: 0 6 [ 0 0 1] 0 -1.0 StencilSetEntry: 0 7 [-1 -1 -1] 1 -1.0 StencilSetEntry: 0 8 [ 0 -1 -1] 1 -1.0 StencilSetEntry: 0 9 [-1 0 -1] 1 -1.0 StencilSetEntry: 0 10 [ 0 0 -1] 1 -1.0 StencilSetEntry: 0 11 [-1 -1 0] 1 -1.0 StencilSetEntry: 0 12 [ 0 -1 0] 1 -1.0 StencilSetEntry: 0 13 [-1 0 0] 1 -1.0 StencilSetEntry: 0 14 [ 0 0 0] 1 -1.0 # StencilSetEntry: stencil_num entry offset[ndim] var value StencilSetEntry: 1 0 [ 0 0 0] 1 15.0 StencilSetEntry: 1 1 [-1 0 0] 1 -1.0 StencilSetEntry: 1 2 [ 1 0 0] 1 -1.0 StencilSetEntry: 1 3 [ 0 -1 0] 1 -1.0 StencilSetEntry: 1 4 [ 0 1 0] 1 -1.0 StencilSetEntry: 1 5 [ 0 0 -1] 1 -1.0 StencilSetEntry: 1 6 [ 0 0 1] 1 -1.0 StencilSetEntry: 1 7 [ 0 0 0] 0 -1.0 StencilSetEntry: 1 8 [ 1 0 0] 0 -1.0 StencilSetEntry: 1 9 [ 0 1 0] 0 -1.0 StencilSetEntry: 1 10 [ 1 1 0] 0 -1.0 StencilSetEntry: 1 11 [ 0 0 1] 0 -1.0 StencilSetEntry: 1 12 [ 1 0 1] 0 -1.0 StencilSetEntry: 1 13 [ 0 1 1] 0 -1.0 StencilSetEntry: 1 14 [ 1 1 1] 0 -1.0 ########################################################### # GraphSetStencil: part var stencil_num GraphSetStencil: 0 0 0 GraphSetStencil: 0 1 1 GraphSetStencil: 1 0 0 GraphSetStencil: 1 1 1 # GraphAddEntries: \ # part ilower(ndim) iupper(ndim) stride[ndim] var \ # to_part to_ilower(ndim) to_iupper(ndim) to_stride[ndim] to_var \ # index_map[ndim] entry value GraphAddEntries: 0 (10+ 1- 1-) (10+ 10+ 10+) [1 1 1] 0 1 ( 1- 1- 1-) ( 1- 10+ 10+) [1 1 1] 0 [0 1 2] 15 -1.0 GraphAddEntries: 1 ( 1- 1- 1-) ( 1- 10+ 10+) [1 1 1] 0 0 (10+ 1- 1-) (10+ 10+ 10+) [1 1 1] 0 [0 1 2] 15 -1.0 ########################################################### # ProcessPoolCreate: num_pools ProcessPoolCreate: 1 # ProcessPoolSetPart: pool part ProcessPoolSetPart: 0 0 ProcessPoolSetPart: 0 1 ########################################################### hypre-2.33.0/src/test/TEST_sstruct/sstruct.in.default_2D000066400000000000000000000043541477326011500230650ustar00rootroot00000000000000# Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) ########################################################### # GridCreate: ndim nparts GridCreate: 2 2 # GridSetExtents: part ilower(ndim) iupper(ndim) GridSetExtents: 0 (1- 1-) (10+ 10+) GridSetExtents: 1 (1- 1-) (10+ 10+) # GridSetVariables: part nvars vartypes[nvars] # CELL = 0 # NODE = 1 GridSetVariables: 0 2 [0 1] GridSetVariables: 1 2 [0 1] ########################################################### # StencilCreate: nstencils sizes[nstencils] StencilCreate: 2 [9 9] # StencilSetEntry: stencil_num entry offset[ndim] var value StencilSetEntry: 0 0 [ 0 0] 0 9.0 StencilSetEntry: 0 1 [-1 0] 0 -1.0 StencilSetEntry: 0 2 [ 1 0] 0 -1.0 StencilSetEntry: 0 3 [ 0 -1] 0 -1.0 StencilSetEntry: 0 4 [ 0 1] 0 -1.0 StencilSetEntry: 0 5 [-1 -1] 1 -1.0 StencilSetEntry: 0 6 [ 0 -1] 1 -1.0 StencilSetEntry: 0 7 [-1 0] 1 -1.0 StencilSetEntry: 0 8 [ 0 0] 1 -1.0 # StencilSetEntry: stencil_num entry offset[ndim] var value StencilSetEntry: 1 0 [ 0 0] 1 9.0 StencilSetEntry: 1 1 [-1 0] 1 -1.0 StencilSetEntry: 1 2 [ 1 0] 1 -1.0 StencilSetEntry: 1 3 [ 0 -1] 1 -1.0 StencilSetEntry: 1 4 [ 0 1] 1 -1.0 StencilSetEntry: 1 5 [ 0 0] 0 -1.0 StencilSetEntry: 1 6 [ 1 0] 0 -1.0 StencilSetEntry: 1 7 [ 0 1] 0 -1.0 StencilSetEntry: 1 8 [ 1 1] 0 -1.0 ########################################################### # GraphSetStencil: part var stencil_num GraphSetStencil: 0 0 0 GraphSetStencil: 0 1 1 GraphSetStencil: 1 0 0 GraphSetStencil: 1 1 1 # GraphAddEntries: \ # part ilower(ndim) iupper(ndim) stride[ndim] var \ # to_part to_ilower(ndim) to_iupper(ndim) to_stride[ndim] to_var \ # index_map[ndim] entry value GraphAddEntries: 0 (10+ 1-) (10+ 10+) [1 1] 0 1 ( 1- 1-) ( 1- 10+) [1 1] 0 [0 1] 9 -1.0 GraphAddEntries: 1 ( 1- 1-) ( 1- 10+) [1 1] 0 0 (10+ 1-) (10+ 10+) [1 1] 0 [0 1] 9 -1.0 ########################################################### # ProcessPoolCreate: num_pools ProcessPoolCreate: 1 # ProcessPoolSetPart: pool part ProcessPoolSetPart: 0 0 ProcessPoolSetPart: 0 1 ########################################################### hypre-2.33.0/src/test/TEST_sstruct/sstruct.in.dirichlet000066400000000000000000000041501477326011500230550ustar00rootroot00000000000000# Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) ########################################################### # GridCreate: ndim nparts GridCreate: 3 1 # GridSetExtents: part ilower(ndim) iupper(ndim) GridSetExtents: 0 (1- 1- 1-) (2+ 2+ 2+) # GridSetVariables: part nvars vartypes[nvars] # CELL = 0 GridSetVariables: 0 1 [0] ########################################################### # StencilCreate: nstencils sizes[nstencils] StencilCreate: 1 [7] # StencilSetEntry: stencil_num entry offset[ndim] var value StencilSetEntry: 0 0 [ 0 0 0] 0 6.0 StencilSetEntry: 0 1 [-1 0 0] 0 -1.0 StencilSetEntry: 0 2 [ 1 0 0] 0 -1.0 StencilSetEntry: 0 3 [ 0 -1 0] 0 -1.0 StencilSetEntry: 0 4 [ 0 1 0] 0 -1.0 StencilSetEntry: 0 5 [ 0 0 -1] 0 -1.0 StencilSetEntry: 0 6 [ 0 0 1] 0 -1.0 ########################################################### # GraphSetStencil: part var stencil_num GraphSetStencil: 0 0 0 ########################################################### # MatrixSetValues: \ # part ilower(ndim) iupper(ndim) stride[ndim] var entry value MatrixSetValues: 0 (1- 1- 1-) (1- 2+ 2+) [1 1 1] 0 1 0.0 # MatrixSetValues: 0 (1- 1- 1-) (1- 2+ 2+) [1 1 1] 0 0 5.0 MatrixSetValues: 0 (2+ 1- 1-) (2+ 2+ 2+) [1 1 1] 0 2 0.0 # MatrixSetValues: 0 (2+ 1- 1-) (2+ 2+ 2+) [1 1 1] 0 0 5.0 MatrixSetValues: 0 (1- 1- 1-) (2+ 1- 2+) [1 1 1] 0 3 0.0 # MatrixSetValues: 0 (1- 1- 1-) (2+ 1- 2+) [1 1 1] 0 0 5.0 MatrixSetValues: 0 (1- 2+ 1-) (2+ 2+ 2+) [1 1 1] 0 4 0.0 # MatrixSetValues: 0 (1- 2+ 1-) (2+ 2+ 2+) [1 1 1] 0 0 5.0 MatrixSetValues: 0 (1- 1- 1-) (2+ 2+ 1-) [1 1 1] 0 5 0.0 # MatrixSetValues: 0 (1- 1- 1-) (2+ 2+ 1-) [1 1 1] 0 0 5.0 MatrixSetValues: 0 (1- 1- 2+) (2+ 2+ 2+) [1 1 1] 0 6 0.0 # MatrixSetValues: 0 (1- 1- 2+) (2+ 2+ 2+) [1 1 1] 0 0 5.0 ########################################################### # ProcessPoolCreate: num_pools ProcessPoolCreate: 1 # ProcessPoolSetPart: pool part ProcessPoolSetPart: 0 0 ########################################################### hypre-2.33.0/src/test/TEST_sstruct/sstruct.in.emptyProc1000066400000000000000000000025351477326011500231560ustar00rootroot00000000000000# Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) ########################################################### # GridCreate: ndim nparts GridCreate: 3 2 # GridSetExtents: part ilower(ndim) iupper(ndim) GridSetExtents: 0 (2- 2- 2-) (11+ 11+ 11+) GridSetExtents: 1 (2- 2- 2-) (11+ 11+ 11+) # GridSetVariables: part nvars vartypes[nvars] # CELL = 0 GridSetVariables: 0 1 [0] ########################################################### # StencilCreate: nstencils sizes[nstencils] StencilCreate: 1 [7] # StencilSetEntry: stencil_num entry offset[ndim] var value StencilSetEntry: 0 0 [ 0 0 0] 0 6.0 StencilSetEntry: 0 1 [-1 0 0] 0 -1.0 StencilSetEntry: 0 2 [ 1 0 0] 0 -1.0 StencilSetEntry: 0 3 [ 0 -1 0] 0 -1.0 StencilSetEntry: 0 4 [ 0 1 0] 0 -1.0 StencilSetEntry: 0 5 [ 0 0 -1] 0 -1.0 StencilSetEntry: 0 6 [ 0 0 1] 0 -1.0 ########################################################### # GraphSetStencil: part var stencil_num GraphSetStencil: 0 0 0 ########################################################### # ProcessPoolCreate: num_pools ProcessPoolCreate: 2 # ProcessPoolSetPart: pool part ProcessPoolSetPart: 0 0 ProcessPoolSetPart: 1 1 ########################################################### hypre-2.33.0/src/test/TEST_sstruct/sstruct.in.emptyProc2000066400000000000000000000025271477326011500231600ustar00rootroot00000000000000# Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) ########################################################### # GridCreate: ndim nparts GridCreate: 3 2 # GridSetExtents: part ilower(ndim) iupper(ndim) GridSetExtents: 0 (1- 1- 1-) (5+ 5+ 5+) GridSetExtents: 1 (1- 1- 1-) (5+ 5+ 5+) # GridSetVariables: part nvars vartypes[nvars] # CELL = 0 GridSetVariables: 0 1 [0] ########################################################### # StencilCreate: nstencils sizes[nstencils] StencilCreate: 1 [7] # StencilSetEntry: stencil_num entry offset[ndim] var value StencilSetEntry: 0 0 [ 0 0 0] 0 6.0 StencilSetEntry: 0 1 [-1 0 0] 0 -1.0 StencilSetEntry: 0 2 [ 1 0 0] 0 -1.0 StencilSetEntry: 0 3 [ 0 -1 0] 0 -1.0 StencilSetEntry: 0 4 [ 0 1 0] 0 -1.0 StencilSetEntry: 0 5 [ 0 0 -1] 0 -1.0 StencilSetEntry: 0 6 [ 0 0 1] 0 -1.0 ########################################################### # GraphSetStencil: part var stencil_num GraphSetStencil: 0 0 0 ########################################################### # ProcessPoolCreate: num_pools ProcessPoolCreate: 2 # ProcessPoolSetPart: pool part ProcessPoolSetPart: 0 0 ProcessPoolSetPart: 1 1 ########################################################### hypre-2.33.0/src/test/TEST_sstruct/sstruct.in.emptyProc3000066400000000000000000000025351477326011500231600ustar00rootroot00000000000000# Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) ########################################################### # GridCreate: ndim nparts GridCreate: 3 2 # GridSetExtents: part ilower(ndim) iupper(ndim) GridSetExtents: 0 (2- 2- 2-) (11+ 11+ 11+) GridSetExtents: 1 (2- 2- 2-) (11+ 11+ 11+) # GridSetVariables: part nvars vartypes[nvars] # CELL = 0 GridSetVariables: 1 1 [0] ########################################################### # StencilCreate: nstencils sizes[nstencils] StencilCreate: 1 [7] # StencilSetEntry: stencil_num entry offset[ndim] var value StencilSetEntry: 0 0 [ 0 0 0] 0 6.0 StencilSetEntry: 0 1 [-1 0 0] 0 -1.0 StencilSetEntry: 0 2 [ 1 0 0] 0 -1.0 StencilSetEntry: 0 3 [ 0 -1 0] 0 -1.0 StencilSetEntry: 0 4 [ 0 1 0] 0 -1.0 StencilSetEntry: 0 5 [ 0 0 -1] 0 -1.0 StencilSetEntry: 0 6 [ 0 0 1] 0 -1.0 ########################################################### # GraphSetStencil: part var stencil_num GraphSetStencil: 1 0 0 ########################################################### # ProcessPoolCreate: num_pools ProcessPoolCreate: 2 # ProcessPoolSetPart: pool part ProcessPoolSetPart: 0 0 ProcessPoolSetPart: 1 1 ########################################################### hypre-2.33.0/src/test/TEST_sstruct/sstruct.in.enhanced3D000066400000000000000000000143131477326011500230440ustar00rootroot00000000000000# Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) ########################################################### # This example came from Rob Rieben and has both reduced and enhanced # connectivity points. The k,z axis points "into the page". # # ------------------------------- # | / /| # | part 3 / / | # | / / | # | / part / | # | j / 4 / | # | | / / | # | ---i / / | # --------------/ / | # | | / part | # | part 1 | j i / 5 | # | | | / / /| # | | |/ / / | # | | / / | # | j | / i / | # | | | / / / | # | ---i |/ j---/ / | # ------------------------| part | # | | | 6 | # | part 0 | part 2 | | # | | | | # | j | j | j | # | | | | | | | # | ---i | ---i | ---i | # -------------------------------- # ########################################################### # GridCreate: ndim nparts GridCreate: 3 7 # GridSetExtents: part ilower(ndim) iupper(ndim) GridSetExtents: 0 (2- 2- 2-) (8+ 8+ 8+) GridSetExtents: 1 (2- 2- 2-) (8+ 8+ 8+) GridSetExtents: 2 (2- 2- 2-) (8+ 8+ 8+) GridSetExtents: 3 (2- 2- 2-) (8+ 8+ 8+) GridSetExtents: 4 (2- 2- 2-) (8+ 8+ 8+) GridSetExtents: 5 (2- 2- 2-) (8+ 8+ 8+) GridSetExtents: 6 (2- 2- 2-) (8+ 8+ 8+) # GridSetVariables: part nvars vartypes[nvars] # NODE = 1 # XFACE = 2 # YFACE = 3 GridSetVariables: 0 1 [1] GridSetVariables: 1 1 [1] GridSetVariables: 2 1 [1] GridSetVariables: 3 1 [1] GridSetVariables: 4 1 [1] GridSetVariables: 5 1 [1] GridSetVariables: 6 1 [1] # GridSetSharedPart: part ilower(ndim) iupper(ndim) offset[ndim] \ # spart silower(ndim) siupper(ndim) soffset[ndim] \ # index_map[ndim] index_dir[ndim] GridSetSharedPart: 0 (2- 8+ 2-) (8+ 8+ 8+) [0 1 0] 1 (2- 2- 2-) (8+ 2- 8+) [0 -1 0] [0 1 2] [1 1 1] GridSetSharedPart: 0 (8+ 2- 2-) (8+ 8+ 8+) [1 0 0] 2 (2- 2- 2-) (2- 8+ 8+) [-1 0 0] [0 1 2] [1 1 1] GridSetSharedPart: 0 (8+ 8+ 2-) (8+ 8+ 8+) [1 1 0] 4 (2- 2- 2-) (2- 2- 8+) [-1 -1 0] [0 1 2] [1 1 1] GridSetSharedPart: 0 (8+ 8+ 2-) (8+ 8+ 8+) [1 1 0] 5 (2- 8+ 2-) (2- 8+ 8+) [-1 1 0] [1 0 2] [-1 1 1] GridSetSharedPart: 1 (2- 2- 2-) (8+ 2- 8+) [0 -1 0] 0 (2- 8+ 2-) (8+ 8+ 8+) [0 1 0] [0 1 2] [1 1 1] GridSetSharedPart: 1 (2- 8+ 2-) (8+ 8+ 8+) [0 1 0] 3 (2- 2- 2-) (8+ 2- 8+) [0 -1 0] [0 1 2] [1 1 1] GridSetSharedPart: 1 (8+ 2- 2-) (8+ 8+ 8+) [1 0 0] 4 (2- 2- 2-) (2- 8+ 8+) [-1 0 0] [0 1 2] [1 1 1] GridSetSharedPart: 1 (8+ 2- 2-) (8+ 2- 8+) [1 -1 0] 2 (2- 8- 2-) (2- 8+ 8+) [-1 1 0] [0 1 2] [1 1 1] GridSetSharedPart: 1 (8+ 2- 2-) (8+ 2- 8+) [1 -1 0] 5 (2- 8- 2-) (2- 8+ 8+) [-1 1 0] [0 1 2] [1 1 1] GridSetSharedPart: 2 (2- 2- 2-) (2- 8+ 8+) [-1 0 0] 0 (8+ 2- 2-) (8+ 8+ 8+) [1 0 0] [0 1 2] [1 1 1] GridSetSharedPart: 2 (8+ 2- 2-) (8+ 8+ 8+) [1 0 0] 6 (2- 2- 2-) (2- 8+ 8+) [-1 0 0] [0 1 2] [1 1 1] GridSetSharedPart: 2 (2- 8+ 2-) (8+ 8+ 8+) [0 1 0] 5 (2- 2- 2-) (2- 8+ 8+) [-1 0 0] [1 0 2] [-1 1 1] GridSetSharedPart: 2 (2- 8- 2-) (2- 8+ 8+) [-1 1 0] 1 (8+ 2- 2-) (8+ 2- 8+) [1 -1 0] [0 1 2] [1 1 1] GridSetSharedPart: 2 (2- 8- 2-) (2- 8+ 8+) [-1 1 0] 4 (2- 2- 2-) (2- 2- 8+) [-1 -1 0] [1 0 2] [-1 1 1] GridSetSharedPart: 3 (2- 2- 2-) (8+ 2- 8+) [0 -1 0] 1 (2- 8+ 2-) (8+ 8+ 8+) [0 1 0] [0 1 2] [1 1 1] GridSetSharedPart: 3 (8+ 2- 2-) (8+ 8+ 8+) [1 0 0] 4 (2- 8+ 2-) (8+ 8+ 8+) [0 1 0] [1 0 2] [-1 1 1] GridSetSharedPart: 4 (2- 2- 2-) (2- 8+ 8+) [-1 0 0] 1 (8+ 2- 2-) (8+ 8+ 8+) [1 0 0] [0 1 2] [1 1 1] GridSetSharedPart: 4 (2- 8+ 2-) (8+ 8+ 8+) [0 1 0] 3 (8+ 2- 2-) (8+ 8+ 8+) [1 0 0] [1 0 2] [1 -1 1] GridSetSharedPart: 4 (2- 2- 2-) (8+ 2- 8+) [0 -1 0] 5 (2- 8+ 2-) (8+ 8+ 8+) [0 1 0] [0 1 2] [1 1 1] GridSetSharedPart: 4 (2- 2- 2-) (2- 2- 8+) [-1 -1 0] 0 (8+ 8+ 2-) (8+ 8+ 8+) [1 1 0] [0 1 2] [1 1 1] GridSetSharedPart: 4 (2- 2- 2-) (2- 2- 8+) [-1 -1 0] 2 (2- 8- 2-) (2- 8+ 8+) [-1 1 0] [1 0 2] [1 -1 1] GridSetSharedPart: 5 (2- 2- 2-) (2- 8+ 8+) [-1 0 0] 2 (2- 8+ 2-) (8+ 8+ 8+) [0 1 0] [1 0 2] [1 -1 1] GridSetSharedPart: 5 (2- 8+ 2-) (8+ 8+ 8+) [0 1 0] 4 (2- 2- 2-) (8+ 2- 8+) [0 -1 0] [0 1 2] [1 1 1] GridSetSharedPart: 5 (2- 2- 2-) (8+ 2- 8+) [0 -1 0] 6 (2- 8+ 2-) (8+ 8+ 8+) [0 1 0] [0 1 2] [1 1 1] GridSetSharedPart: 5 (2- 8+ 2-) (2- 8+ 8+) [-1 1 0] 0 (8+ 8+ 2-) (8+ 8+ 8+) [1 1 0] [1 0 2] [1 -1 1] GridSetSharedPart: 5 (2- 8- 2-) (2- 8+ 8+) [-1 1 0] 1 (8+ 2- 2-) (8+ 2- 8+) [1 -1 0] [0 1 2] [1 1 1] GridSetSharedPart: 6 (2- 2- 2-) (2- 8+ 8+) [-1 0 0] 2 (8+ 2- 2-) (8+ 8+ 8+) [1 0 0] [0 1 2] [1 1 1] GridSetSharedPart: 6 (2- 8+ 2-) (8+ 8+ 8+) [0 1 0] 5 (2- 2- 2-) (8+ 2- 8+) [0 -1 0] [0 1 2] [1 1 1] ########################################################### # FEMStencilCreate: size FEMStencilCreate: 8 # FEMStencilSetRow: row offset[ndim] var values[size] FEMStencilSetRow: 0 [-1 -1 -1] 0 [ 4 -1 -1 0 -1 0 0 0 ] FEMStencilSetRow: 1 [ 0 -1 -1] 0 [ -1 4 0 -1 0 -1 0 0 ] FEMStencilSetRow: 2 [-1 0 -1] 0 [ -1 0 4 -1 0 0 -1 0 ] FEMStencilSetRow: 3 [ 0 0 -1] 0 [ 0 -1 -1 4 0 0 0 -1 ] FEMStencilSetRow: 4 [-1 -1 0] 0 [ -1 0 0 0 4 -1 -1 0 ] FEMStencilSetRow: 5 [ 0 -1 0] 0 [ 0 -1 0 0 -1 4 0 -1 ] FEMStencilSetRow: 6 [-1 0 0] 0 [ 0 0 -1 0 -1 0 4 -1 ] FEMStencilSetRow: 7 [ 0 0 0] 0 [ 0 0 0 -1 0 -1 -1 4 ] ########################################################### # ProcessPoolCreate: num_pools ProcessPoolCreate: 1 # ProcessPoolSetPart: pool part ProcessPoolSetPart: 0 0 ProcessPoolSetPart: 0 1 ProcessPoolSetPart: 0 2 ProcessPoolSetPart: 0 3 ProcessPoolSetPart: 0 4 ProcessPoolSetPart: 0 5 ProcessPoolSetPart: 0 6 # ProcessPoolCreate: num_pools ProcessPoolCreate: 7 # ProcessPoolSetPart: pool part ProcessPoolSetPart: 0 0 ProcessPoolSetPart: 1 1 ProcessPoolSetPart: 2 2 ProcessPoolSetPart: 3 3 ProcessPoolSetPart: 4 4 ProcessPoolSetPart: 5 5 ProcessPoolSetPart: 6 6 ########################################################### hypre-2.33.0/src/test/TEST_sstruct/sstruct.in.fe_all2_2D000066400000000000000000000046171477326011500227470ustar00rootroot00000000000000# Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) ########################################################### # In this example, the x/y coordinates are as follows # # x > # --------------------------------- # ^ | | | | (4,2) | # y --------------------------------- <- part 1 # | (1,1) | | | | # ================================= # ^ | | | | (4,2) | # y --------------------------------- <- part 0 # | (1,1) | | | | # --------------------------------- # x > # ########################################################### # GridCreate: ndim nparts GridCreate: 2 2 # GridSetExtents: part ilower(ndim) iupper(ndim) GridSetExtents: 0 (1- 1-) (4+ 2+) GridSetExtents: 1 (1- 1-) (4+ 2+) # GridSetVariables: part nvars vartypes[nvars] # NODE = 1 # XFACE = 2 # YFACE = 3 GridSetVariables: 0 3 [1 2 3] GridSetVariables: 1 3 [1 2 3] # GridSetNeighborPart: part ilower(ndim) iupper(ndim) \ # nbor_part nbor_ilower(ndim) nbor_iupper(ndim) \ # index_map[ndim] index_dir[ndim] GridSetNeighborPart: 0 (1- 3-) (4+ 3-) 1 (1- 1-) (4+ 1-) [0 1] [1 1] GridSetNeighborPart: 1 (1- 0+) (4+ 0+) 0 (1- 2+) (4+ 2+) [0 1] [1 1] ########################################################### # FEMStencilCreate: size FEMStencilCreate: 8 # FEMStencilSetRow: row offset[ndim] var values[size] FEMStencilSetRow: 0 [-1 -1] 0 [ 1.0 -0.2 -0.2 0.0 0.0 0.0 0.0 0.0 ] FEMStencilSetRow: 1 [ 0 -1] 0 [ -0.2 1.0 0.0 -0.2 0.0 0.0 0.0 0.0 ] FEMStencilSetRow: 2 [-1 0] 0 [ -0.2 0.0 1.0 -0.2 0.0 0.0 0.0 0.0 ] FEMStencilSetRow: 3 [ 0 0] 0 [ 0.0 -0.2 -0.2 1.0 0.0 0.0 0.0 0.0 ] FEMStencilSetRow: 4 [-1 0] 1 [ 0.0 0.0 0.0 0.0 10.0 -4.0 0.0 0.0 ] FEMStencilSetRow: 5 [ 0 0] 1 [ 0.0 0.0 0.0 0.0 -4.0 10.0 0.0 0.0 ] FEMStencilSetRow: 6 [ 0 -1] 2 [ 0.0 0.0 0.0 0.0 0.0 0.0 10.0 -4.0 ] FEMStencilSetRow: 7 [ 0 0] 2 [ 0.0 0.0 0.0 0.0 0.0 0.0 -4.0 10.0 ] ########################################################### # ProcessPoolCreate: num_pools ProcessPoolCreate: 2 # ProcessPoolSetPart: pool part ProcessPoolSetPart: 0 0 ProcessPoolSetPart: 1 1 ########################################################### hypre-2.33.0/src/test/TEST_sstruct/sstruct.in.fe_all2_2D_coord000066400000000000000000000046211477326011500241300ustar00rootroot00000000000000# Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) ########################################################### # In this example, the x/y coordinates are as follows # # < y # --------------------------------- # ^ | (2,4) | | | | # x --------------------------------- <- part 1 # | | | | (1,1) | # ================================= # ^ | | | | (4,2) | # y --------------------------------- <- part 0 # | (1,1) | | | | # --------------------------------- # x > # ########################################################### # GridCreate: ndim nparts GridCreate: 2 2 # GridSetExtents: part ilower(ndim) iupper(ndim) GridSetExtents: 0 (1- 1-) (4+ 2+) GridSetExtents: 1 (1- 1-) (2+ 4+) # GridSetVariables: part nvars vartypes[nvars] # NODE = 1 # XFACE = 2 # YFACE = 3 GridSetVariables: 0 3 [1 2 3] GridSetVariables: 1 3 [1 2 3] # GridSetNeighborPart: part ilower(ndim) iupper(ndim) \ # nbor_part nbor_ilower(ndim) nbor_iupper(ndim) \ # index_map[ndim] index_dir[ndim] GridSetNeighborPart: 0 (1- 3-) (4+ 3-) 1 (1- 4+) (1- 1-) [1 0] [-1 1] GridSetNeighborPart: 1 (0+ 1-) (0+ 4+) 0 (4+ 2+) (1- 2+) [1 0] [ 1 -1] ########################################################### # FEMStencilCreate: size FEMStencilCreate: 8 # FEMStencilSetRow: row offset[ndim] var values[size] FEMStencilSetRow: 0 [-1 -1] 0 [ 1.0 -0.2 -0.2 0.0 0.0 0.0 0.0 0.0 ] FEMStencilSetRow: 1 [ 0 -1] 0 [ -0.2 1.0 0.0 -0.2 0.0 0.0 0.0 0.0 ] FEMStencilSetRow: 2 [-1 0] 0 [ -0.2 0.0 1.0 -0.2 0.0 0.0 0.0 0.0 ] FEMStencilSetRow: 3 [ 0 0] 0 [ 0.0 -0.2 -0.2 1.0 0.0 0.0 0.0 0.0 ] FEMStencilSetRow: 4 [-1 0] 1 [ 0.0 0.0 0.0 0.0 10.0 -4.0 0.0 0.0 ] FEMStencilSetRow: 5 [ 0 0] 1 [ 0.0 0.0 0.0 0.0 -4.0 10.0 0.0 0.0 ] FEMStencilSetRow: 6 [ 0 -1] 2 [ 0.0 0.0 0.0 0.0 0.0 0.0 10.0 -4.0 ] FEMStencilSetRow: 7 [ 0 0] 2 [ 0.0 0.0 0.0 0.0 0.0 0.0 -4.0 10.0 ] ########################################################### # ProcessPoolCreate: num_pools ProcessPoolCreate: 2 # ProcessPoolSetPart: pool part ProcessPoolSetPart: 0 0 ProcessPoolSetPart: 1 1 ########################################################### hypre-2.33.0/src/test/TEST_sstruct/sstruct.in.fe_all2_2Ds000066400000000000000000000046451477326011500231330ustar00rootroot00000000000000# Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) ########################################################### # In this example, the x/y coordinates are as follows # # x > # --------------------------------- # ^ | | | | (4,2) | # y --------------------------------- <- part 1 # | (1,1) | | | | # ================================= # ^ | | | | (4,2) | # y --------------------------------- <- part 0 # | (1,1) | | | | # --------------------------------- # x > # ########################################################### # GridCreate: ndim nparts GridCreate: 2 2 # GridSetExtents: part ilower(ndim) iupper(ndim) GridSetExtents: 0 (1- 1-) (4+ 2+) GridSetExtents: 1 (1- 1-) (4+ 2+) # GridSetVariables: part nvars vartypes[nvars] # NODE = 1 # XFACE = 2 # YFACE = 3 GridSetVariables: 0 3 [1 2 3] GridSetVariables: 1 3 [1 2 3] # GridSetSharedPart: part ilower(ndim) iupper(ndim) offset[ndim] \ # spart silower(ndim) siupper(ndim) soffset[ndim] \ # index_map[ndim] index_dir[ndim] GridSetSharedPart: 0 (1- 3-) (4+ 3-) [0 0] 1 (1- 1-) (4+ 1-) [0 0] [0 1] [1 1] GridSetSharedPart: 1 (1- 0+) (4+ 0+) [0 0] 0 (1- 2+) (4+ 2+) [0 0] [0 1] [1 1] ########################################################### # FEMStencilCreate: size FEMStencilCreate: 8 # FEMStencilSetRow: row offset[ndim] var values[size] FEMStencilSetRow: 0 [-1 -1] 0 [ 1.0 -0.2 -0.2 0.0 0.0 0.0 0.0 0.0 ] FEMStencilSetRow: 1 [ 0 -1] 0 [ -0.2 1.0 0.0 -0.2 0.0 0.0 0.0 0.0 ] FEMStencilSetRow: 2 [-1 0] 0 [ -0.2 0.0 1.0 -0.2 0.0 0.0 0.0 0.0 ] FEMStencilSetRow: 3 [ 0 0] 0 [ 0.0 -0.2 -0.2 1.0 0.0 0.0 0.0 0.0 ] FEMStencilSetRow: 4 [-1 0] 1 [ 0.0 0.0 0.0 0.0 10.0 -4.0 0.0 0.0 ] FEMStencilSetRow: 5 [ 0 0] 1 [ 0.0 0.0 0.0 0.0 -4.0 10.0 0.0 0.0 ] FEMStencilSetRow: 6 [ 0 -1] 2 [ 0.0 0.0 0.0 0.0 0.0 0.0 10.0 -4.0 ] FEMStencilSetRow: 7 [ 0 0] 2 [ 0.0 0.0 0.0 0.0 0.0 0.0 -4.0 10.0 ] ########################################################### # ProcessPoolCreate: num_pools ProcessPoolCreate: 2 # ProcessPoolSetPart: pool part ProcessPoolSetPart: 0 0 ProcessPoolSetPart: 1 1 ########################################################### hypre-2.33.0/src/test/TEST_sstruct/sstruct.in.fe_all2_2Dss000066400000000000000000000046511477326011500233130ustar00rootroot00000000000000# Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) ########################################################### # In this example, the x/y coordinates are as follows # # x > # --------------------------------- # ^ | | | | (4,2) | # y --------------------------------- <- part 1 # | (1,1) | | | | # ================================= # ^ | | | | (4,2) | # y --------------------------------- <- part 0 # | (1,1) | | | | # --------------------------------- # x > # ########################################################### # GridCreate: ndim nparts GridCreate: 2 2 # GridSetExtents: part ilower(ndim) iupper(ndim) GridSetExtents: 0 (1- 1-) (4+ 2+) GridSetExtents: 1 (1- 1-) (4+ 2+) # GridSetVariables: part nvars vartypes[nvars] # NODE = 1 # XFACE = 2 # YFACE = 3 GridSetVariables: 0 3 [1 2 3] GridSetVariables: 1 3 [1 2 3] # GridSetSharedPart: part ilower(ndim) iupper(ndim) offset[ndim] \ # spart silower(ndim) siupper(ndim) soffset[ndim] \ # index_map[ndim] index_dir[ndim] GridSetSharedPart: 0 (1- 2+) (4+ 2+) [0 1] 1 (1- 1-) (4+ 1-) [0 -1] [0 1] [1 1] GridSetSharedPart: 1 (1- 1-) (4+ 1-) [0 -1] 0 (1- 2+) (4+ 2+) [0 1] [0 1] [1 1] ########################################################### # FEMStencilCreate: size FEMStencilCreate: 8 # FEMStencilSetRow: row offset[ndim] var values[size] FEMStencilSetRow: 0 [-1 -1] 0 [ 1.0 -0.2 -0.2 0.0 0.0 0.0 0.0 0.0 ] FEMStencilSetRow: 1 [ 0 -1] 0 [ -0.2 1.0 0.0 -0.2 0.0 0.0 0.0 0.0 ] FEMStencilSetRow: 2 [-1 0] 0 [ -0.2 0.0 1.0 -0.2 0.0 0.0 0.0 0.0 ] FEMStencilSetRow: 3 [ 0 0] 0 [ 0.0 -0.2 -0.2 1.0 0.0 0.0 0.0 0.0 ] FEMStencilSetRow: 4 [-1 0] 1 [ 0.0 0.0 0.0 0.0 10.0 -4.0 0.0 0.0 ] FEMStencilSetRow: 5 [ 0 0] 1 [ 0.0 0.0 0.0 0.0 -4.0 10.0 0.0 0.0 ] FEMStencilSetRow: 6 [ 0 -1] 2 [ 0.0 0.0 0.0 0.0 0.0 0.0 10.0 -4.0 ] FEMStencilSetRow: 7 [ 0 0] 2 [ 0.0 0.0 0.0 0.0 0.0 0.0 -4.0 10.0 ] ########################################################### # ProcessPoolCreate: num_pools ProcessPoolCreate: 2 # ProcessPoolSetPart: pool part ProcessPoolSetPart: 0 0 ProcessPoolSetPart: 1 1 ########################################################### hypre-2.33.0/src/test/TEST_sstruct/sstruct.in.fe_all2_3D000066400000000000000000000116331477326011500227440ustar00rootroot00000000000000# Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) ########################################################### # In this example, the x/y/z coordinates are as follows # # x > # --------------------------------- # ^ | | | | (4,2) | # y --------------------------------- <- part 1 # | (1,1) | | | | # ================================= # ^ | | | | (4,2) | # y --------------------------------- <- part 0 # | (1,1) | | | | # --------------------------------- # x > # # z: cells 1 -> 4 "into the page" # ########################################################### # GridCreate: ndim nparts GridCreate: 3 2 # GridSetExtents: part ilower(ndim) iupper(ndim) GridSetExtents: 0 (1- 1- 1-) (4+ 2+ 4+) GridSetExtents: 1 (1- 1- 1-) (4+ 2+ 4+) # GridSetVariables: part nvars vartypes[nvars] # NODE = 1 # XFACE = 2 # YFACE = 3 # ZFACE = 4 # XEDGE = 5 # YEDGE = 6 # ZEDGE = 7 GridSetVariables: 0 7 [1 2 3 4 5 6 7] GridSetVariables: 1 7 [1 2 3 4 5 6 7] # GridSetNeighborPart: part ilower(ndim) iupper(ndim) \ # nbor_part nbor_ilower(ndim) nbor_iupper(ndim) \ # index_map[ndim] index_dir[ndim] GridSetNeighborPart: 0 (1- 3- 1-) (4+ 3- 4+) 1 (1- 1- 1-) (4+ 1- 4+) [0 1 2] [1 1 1] GridSetNeighborPart: 1 (1- 0+ 1-) (4+ 0+ 4+) 0 (1- 2+ 1-) (4+ 2+ 4+) [0 1 2] [1 1 1] ########################################################### # FEMStencilCreate: size FEMStencilCreate: 26 # FEMStencilSetRow: row offset[ndim] var values[size] FEMStencilSetRow: 0 [-1 -1 -1] 0 [ 4 -1 -1 0 -1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ] FEMStencilSetRow: 1 [ 0 -1 -1] 0 [ -1 4 0 -1 0 -1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ] FEMStencilSetRow: 2 [-1 0 -1] 0 [ -1 0 4 -1 0 0 -1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ] FEMStencilSetRow: 3 [ 0 0 -1] 0 [ 0 -1 -1 4 0 0 0 -1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ] FEMStencilSetRow: 4 [-1 -1 0] 0 [ -1 0 0 0 4 -1 -1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ] FEMStencilSetRow: 5 [ 0 -1 0] 0 [ 0 -1 0 0 -1 4 0 -1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ] FEMStencilSetRow: 6 [-1 0 0] 0 [ 0 0 -1 0 -1 0 4 -1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ] FEMStencilSetRow: 7 [ 0 0 0] 0 [ 0 0 0 -1 0 -1 -1 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ] FEMStencilSetRow: 8 [-1 0 0] 1 [ 0 0 0 0 0 0 0 0 5 -2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ] FEMStencilSetRow: 9 [ 0 0 0] 1 [ 0 0 0 0 0 0 0 0 -2 5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ] FEMStencilSetRow: 10 [ 0 -1 0] 2 [ 0 0 0 0 0 0 0 0 0 0 5 -2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ] FEMStencilSetRow: 11 [ 0 0 0] 2 [ 0 0 0 0 0 0 0 0 0 0 -2 5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ] FEMStencilSetRow: 12 [ 0 0 -1] 3 [ 0 0 0 0 0 0 0 0 0 0 0 0 5 -2 0 0 0 0 0 0 0 0 0 0 0 0 ] FEMStencilSetRow: 13 [ 0 0 0] 3 [ 0 0 0 0 0 0 0 0 0 0 0 0 -2 5 0 0 0 0 0 0 0 0 0 0 0 0 ] FEMStencilSetRow: 14 [ 0 -1 -1] 4 [ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 8 -3 -3 0 0 0 0 0 0 0 0 0 ] FEMStencilSetRow: 15 [ 0 0 -1] 4 [ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -3 8 0 -3 0 0 0 0 0 0 0 0 ] FEMStencilSetRow: 16 [ 0 -1 0] 4 [ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -3 0 8 -3 0 0 0 0 0 0 0 0 ] FEMStencilSetRow: 17 [ 0 0 0] 4 [ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -3 -3 8 0 0 0 0 0 0 0 0 ] FEMStencilSetRow: 18 [-1 0 -1] 5 [ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 8 -3 -3 0 0 0 0 0 ] FEMStencilSetRow: 19 [ 0 0 -1] 5 [ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -3 8 0 -3 0 0 0 0 ] FEMStencilSetRow: 20 [-1 0 0] 5 [ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -3 0 8 -3 0 0 0 0 ] FEMStencilSetRow: 21 [ 0 0 0] 5 [ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -3 -3 8 0 0 0 0 ] FEMStencilSetRow: 22 [-1 -1 0] 6 [ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 8 -3 -3 0 ] FEMStencilSetRow: 23 [ 0 -1 0] 6 [ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -3 8 0 -3 ] FEMStencilSetRow: 24 [-1 0 0] 6 [ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -3 0 8 -3 ] FEMStencilSetRow: 25 [ 0 0 0] 6 [ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -3 -3 8 ] ########################################################### # ProcessPoolCreate: num_pools ProcessPoolCreate: 2 # ProcessPoolSetPart: pool part ProcessPoolSetPart: 0 0 ProcessPoolSetPart: 1 1 ########################################################### hypre-2.33.0/src/test/TEST_sstruct/sstruct.in.fe_all2_3D_coord000066400000000000000000000117041477326011500241310ustar00rootroot00000000000000# Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) ########################################################### # In this example, the x/y/z coordinates are as follows # # y: cells 1 -> 4 "into the page" # # < z # --------------------------------- # ^ | (2,4) | | | | # x --------------------------------- <- part 1 # | | | | (1,1) | # ================================= # ^ | | | | (4,2) | # y --------------------------------- <- part 0 # | (1,1) | | | | # --------------------------------- # x > # # z: cells 1 -> 4 "into the page" # ########################################################### # GridCreate: ndim nparts GridCreate: 3 2 # GridSetExtents: part ilower(ndim) iupper(ndim) GridSetExtents: 0 (1- 1- 1-) (4+ 2+ 4+) GridSetExtents: 1 (1- 1- 1-) (2+ 4+ 4+) # GridSetVariables: part nvars vartypes[nvars] # NODE = 1 # XFACE = 2 # YFACE = 3 # ZFACE = 4 # XEDGE = 5 # YEDGE = 6 # ZEDGE = 7 GridSetVariables: 0 7 [1 2 3 4 5 6 7] GridSetVariables: 1 7 [1 2 3 4 5 6 7] # GridSetNeighborPart: part ilower(ndim) iupper(ndim) \ # nbor_part nbor_ilower(ndim) nbor_iupper(ndim) \ # index_map[ndim] index_dir[ndim] GridSetNeighborPart: 0 (1- 3- 1-) (4+ 3- 4+) 1 (1- 1- 4+) (1- 4+ 1-) [2 0 1] [-1 1 1] GridSetNeighborPart: 1 (0+ 1- 1-) (0+ 4+ 4+) 0 (4+ 2+ 1-) (1- 2+ 4+) [1 2 0] [ 1 1 -1] ########################################################### # FEMStencilCreate: size FEMStencilCreate: 26 # FEMStencilSetRow: row offset[ndim] var values[size] FEMStencilSetRow: 0 [-1 -1 -1] 0 [ 4 -1 -1 0 -1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ] FEMStencilSetRow: 1 [ 0 -1 -1] 0 [ -1 4 0 -1 0 -1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ] FEMStencilSetRow: 2 [-1 0 -1] 0 [ -1 0 4 -1 0 0 -1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ] FEMStencilSetRow: 3 [ 0 0 -1] 0 [ 0 -1 -1 4 0 0 0 -1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ] FEMStencilSetRow: 4 [-1 -1 0] 0 [ -1 0 0 0 4 -1 -1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ] FEMStencilSetRow: 5 [ 0 -1 0] 0 [ 0 -1 0 0 -1 4 0 -1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ] FEMStencilSetRow: 6 [-1 0 0] 0 [ 0 0 -1 0 -1 0 4 -1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ] FEMStencilSetRow: 7 [ 0 0 0] 0 [ 0 0 0 -1 0 -1 -1 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ] FEMStencilSetRow: 8 [-1 0 0] 1 [ 0 0 0 0 0 0 0 0 5 -2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ] FEMStencilSetRow: 9 [ 0 0 0] 1 [ 0 0 0 0 0 0 0 0 -2 5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ] FEMStencilSetRow: 10 [ 0 -1 0] 2 [ 0 0 0 0 0 0 0 0 0 0 5 -2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ] FEMStencilSetRow: 11 [ 0 0 0] 2 [ 0 0 0 0 0 0 0 0 0 0 -2 5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ] FEMStencilSetRow: 12 [ 0 0 -1] 3 [ 0 0 0 0 0 0 0 0 0 0 0 0 5 -2 0 0 0 0 0 0 0 0 0 0 0 0 ] FEMStencilSetRow: 13 [ 0 0 0] 3 [ 0 0 0 0 0 0 0 0 0 0 0 0 -2 5 0 0 0 0 0 0 0 0 0 0 0 0 ] FEMStencilSetRow: 14 [ 0 -1 -1] 4 [ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 8 -3 -3 0 0 0 0 0 0 0 0 0 ] FEMStencilSetRow: 15 [ 0 0 -1] 4 [ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -3 8 0 -3 0 0 0 0 0 0 0 0 ] FEMStencilSetRow: 16 [ 0 -1 0] 4 [ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -3 0 8 -3 0 0 0 0 0 0 0 0 ] FEMStencilSetRow: 17 [ 0 0 0] 4 [ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -3 -3 8 0 0 0 0 0 0 0 0 ] FEMStencilSetRow: 18 [-1 0 -1] 5 [ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 8 -3 -3 0 0 0 0 0 ] FEMStencilSetRow: 19 [ 0 0 -1] 5 [ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -3 8 0 -3 0 0 0 0 ] FEMStencilSetRow: 20 [-1 0 0] 5 [ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -3 0 8 -3 0 0 0 0 ] FEMStencilSetRow: 21 [ 0 0 0] 5 [ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -3 -3 8 0 0 0 0 ] FEMStencilSetRow: 22 [-1 -1 0] 6 [ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 8 -3 -3 0 ] FEMStencilSetRow: 23 [ 0 -1 0] 6 [ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -3 8 0 -3 ] FEMStencilSetRow: 24 [-1 0 0] 6 [ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -3 0 8 -3 ] FEMStencilSetRow: 25 [ 0 0 0] 6 [ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -3 -3 8 ] ########################################################### # ProcessPoolCreate: num_pools ProcessPoolCreate: 2 # ProcessPoolSetPart: pool part ProcessPoolSetPart: 0 0 ProcessPoolSetPart: 1 1 ########################################################### hypre-2.33.0/src/test/TEST_sstruct/sstruct.in.fe_all3_3D000066400000000000000000000131721477326011500227450ustar00rootroot00000000000000# Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) ########################################################### # In this example, the x/y/z coordinates are as follows # # x > # --------------------------------- ----------------- # ^ | | | | (4,2) | | | (2,4) | # pt 1 -> y --------------------------------- ----------------- # | (1,1) | | | | | | | ^ # ================================= ----------------- y <- pt 2 # ^ | | | | (4,2) | | | | # pt 0 -> y --------------------------------- ----------------- # | (1,1) | | | | | (1,1) | | # --------------------------------- ----------------- # x > x > # # z: cells 1 -> 4 "into the page" # ########################################################### # GridCreate: ndim nparts GridCreate: 3 3 # GridSetExtents: part ilower(ndim) iupper(ndim) GridSetExtents: 0 (1- 1- 1-) (4+ 2+ 4+) GridSetExtents: 1 (1- 1- 1-) (4+ 2+ 4+) GridSetExtents: 2 (1- 1- 1-) (2+ 4+ 4+) # GridSetVariables: part nvars vartypes[nvars] # NODE = 1 # XFACE = 2 # YFACE = 3 # ZFACE = 4 # XEDGE = 5 # YEDGE = 6 # ZEDGE = 7 GridSetVariables: 0 7 [1 2 3 4 5 6 7] GridSetVariables: 1 7 [1 2 3 4 5 6 7] GridSetVariables: 2 7 [1 2 3 4 5 6 7] # GridSetNeighborPart: part ilower(ndim) iupper(ndim) \ # nbor_part nbor_ilower(ndim) nbor_iupper(ndim) \ # index_map[ndim] index_dir[ndim] GridSetNeighborPart: 0 (1- 3- 1-) (4+ 3- 4+) 1 (1- 1- 1-) (4+ 1- 4+) [0 1 2] [ 1 1 1] GridSetNeighborPart: 1 (1- 0+ 1-) (4+ 0+ 4+) 0 (1- 2+ 1-) (4+ 2+ 4+) [0 1 2] [ 1 1 1] GridSetNeighborPart: 0 (5- 1- 1-) (5- 4+ 4+) 2 (1- 1- 1-) (1- 4+ 4+) [0 1 2] [ 1 1 1] GridSetNeighborPart: 2 (0+ 1- 1-) (0+ 4+ 4+) 0 (4+ 1- 1-) (4+ 4+ 4+) [0 1 2] [ 1 1 1] GridSetNeighborPart: 1 (5- 1- 1-) (5- 2+ 4+) 2 (1- 3- 1-) (1- 4+ 4+) [0 1 2] [ 1 1 1] GridSetNeighborPart: 2 (0+ 3- 1-) (0+ 4+ 4+) 1 (4+ 1- 1-) (4+ 2+ 4+) [0 1 2] [ 1 1 1] ########################################################### # FEMStencilCreate: size FEMStencilCreate: 26 # FEMStencilSetRow: row offset[ndim] var values[size] FEMStencilSetRow: 0 [-1 -1 -1] 0 [ 4 -1 -1 0 -1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ] FEMStencilSetRow: 1 [ 0 -1 -1] 0 [ -1 4 0 -1 0 -1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ] FEMStencilSetRow: 2 [-1 0 -1] 0 [ -1 0 4 -1 0 0 -1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ] FEMStencilSetRow: 3 [ 0 0 -1] 0 [ 0 -1 -1 4 0 0 0 -1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ] FEMStencilSetRow: 4 [-1 -1 0] 0 [ -1 0 0 0 4 -1 -1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ] FEMStencilSetRow: 5 [ 0 -1 0] 0 [ 0 -1 0 0 -1 4 0 -1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ] FEMStencilSetRow: 6 [-1 0 0] 0 [ 0 0 -1 0 -1 0 4 -1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ] FEMStencilSetRow: 7 [ 0 0 0] 0 [ 0 0 0 -1 0 -1 -1 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ] FEMStencilSetRow: 8 [-1 0 0] 1 [ 0 0 0 0 0 0 0 0 5 -2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ] FEMStencilSetRow: 9 [ 0 0 0] 1 [ 0 0 0 0 0 0 0 0 -2 5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ] FEMStencilSetRow: 10 [ 0 -1 0] 2 [ 0 0 0 0 0 0 0 0 0 0 5 -2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ] FEMStencilSetRow: 11 [ 0 0 0] 2 [ 0 0 0 0 0 0 0 0 0 0 -2 5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ] FEMStencilSetRow: 12 [ 0 0 -1] 3 [ 0 0 0 0 0 0 0 0 0 0 0 0 5 -2 0 0 0 0 0 0 0 0 0 0 0 0 ] FEMStencilSetRow: 13 [ 0 0 0] 3 [ 0 0 0 0 0 0 0 0 0 0 0 0 -2 5 0 0 0 0 0 0 0 0 0 0 0 0 ] FEMStencilSetRow: 14 [ 0 -1 -1] 4 [ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 8 -3 -3 0 0 0 0 0 0 0 0 0 ] FEMStencilSetRow: 15 [ 0 0 -1] 4 [ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -3 8 0 -3 0 0 0 0 0 0 0 0 ] FEMStencilSetRow: 16 [ 0 -1 0] 4 [ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -3 0 8 -3 0 0 0 0 0 0 0 0 ] FEMStencilSetRow: 17 [ 0 0 0] 4 [ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -3 -3 8 0 0 0 0 0 0 0 0 ] FEMStencilSetRow: 18 [-1 0 -1] 5 [ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 8 -3 -3 0 0 0 0 0 ] FEMStencilSetRow: 19 [ 0 0 -1] 5 [ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -3 8 0 -3 0 0 0 0 ] FEMStencilSetRow: 20 [-1 0 0] 5 [ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -3 0 8 -3 0 0 0 0 ] FEMStencilSetRow: 21 [ 0 0 0] 5 [ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -3 -3 8 0 0 0 0 ] FEMStencilSetRow: 22 [-1 -1 0] 6 [ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 8 -3 -3 0 ] FEMStencilSetRow: 23 [ 0 -1 0] 6 [ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -3 8 0 -3 ] FEMStencilSetRow: 24 [-1 0 0] 6 [ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -3 0 8 -3 ] FEMStencilSetRow: 25 [ 0 0 0] 6 [ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -3 -3 8 ] ########################################################### # ProcessPoolCreate: num_pools ProcessPoolCreate: 1 # ProcessPoolSetPart: pool part ProcessPoolSetPart: 0 0 ProcessPoolSetPart: 0 1 ProcessPoolSetPart: 0 2 ########################################################### hypre-2.33.0/src/test/TEST_sstruct/sstruct.in.fe_all3_3D_coord000066400000000000000000000132451477326011500241340ustar00rootroot00000000000000# Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) ########################################################### # In this example, the x/y/z coordinates are as follows # # y: cells 1 -> 4 "into the page" # # < z # --------------------------------- ----------------- # ^ | (2,4) | | | | | | (2,4) | # pt 1 -> x --------------------------------- ----------------- # | | | | (1,1) | | | | ^ # ================================= ----------------- y <- pt 2 # ^ | | | | (4,2) | | | | # pt 0 -> y --------------------------------- ----------------- # | (1,1) | | | | | (1,1) | | # --------------------------------- ----------------- # x > x > # # z: cells 1 -> 4 "into the page" # ########################################################### # GridCreate: ndim nparts GridCreate: 3 3 # GridSetExtents: part ilower(ndim) iupper(ndim) GridSetExtents: 0 (1- 1- 1-) (4+ 2+ 4+) GridSetExtents: 1 (1- 1- 1-) (2+ 4+ 4+) GridSetExtents: 2 (1- 1- 1-) (2+ 4+ 4+) # GridSetVariables: part nvars vartypes[nvars] # NODE = 1 # XFACE = 2 # YFACE = 3 # ZFACE = 4 # XEDGE = 5 # YEDGE = 6 # ZEDGE = 7 GridSetVariables: 0 7 [1 2 3 4 5 6 7] GridSetVariables: 1 7 [1 2 3 4 5 6 7] GridSetVariables: 2 7 [1 2 3 4 5 6 7] # GridSetNeighborPart: part ilower(ndim) iupper(ndim) \ # nbor_part nbor_ilower(ndim) nbor_iupper(ndim) \ # index_map[ndim] index_dir[ndim] GridSetNeighborPart: 0 (1- 3- 1-) (4+ 3- 4+) 1 (1- 1- 1-) (1- 4+ 4+) [2 0 1] [-1 1 1] GridSetNeighborPart: 1 (0+ 1- 1-) (0+ 4+ 4+) 0 (1- 2+ 1-) (4+ 2+ 4+) [1 2 0] [ 1 1 -1] GridSetNeighborPart: 0 (5- 1- 1-) (5- 4+ 4+) 2 (1- 1- 1-) (1- 4+ 4+) [0 1 2] [ 1 1 1] GridSetNeighborPart: 2 (0+ 1- 1-) (0+ 4+ 4+) 0 (4+ 1- 1-) (4+ 4+ 4+) [0 1 2] [ 1 1 1] GridSetNeighborPart: 1 (1- 1- 0+) (2+ 4+ 0+) 2 (1- 3- 1-) (1- 4+ 4+) [1 2 0] [ 1 1 -1] GridSetNeighborPart: 2 (0+ 3- 1-) (0+ 4+ 4+) 1 (1- 1- 1-) (2+ 4+ 1-) [2 0 1] [-1 1 1] ########################################################### # FEMStencilCreate: size FEMStencilCreate: 26 # FEMStencilSetRow: row offset[ndim] var values[size] FEMStencilSetRow: 0 [-1 -1 -1] 0 [ 4 -1 -1 0 -1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ] FEMStencilSetRow: 1 [ 0 -1 -1] 0 [ -1 4 0 -1 0 -1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ] FEMStencilSetRow: 2 [-1 0 -1] 0 [ -1 0 4 -1 0 0 -1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ] FEMStencilSetRow: 3 [ 0 0 -1] 0 [ 0 -1 -1 4 0 0 0 -1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ] FEMStencilSetRow: 4 [-1 -1 0] 0 [ -1 0 0 0 4 -1 -1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ] FEMStencilSetRow: 5 [ 0 -1 0] 0 [ 0 -1 0 0 -1 4 0 -1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ] FEMStencilSetRow: 6 [-1 0 0] 0 [ 0 0 -1 0 -1 0 4 -1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ] FEMStencilSetRow: 7 [ 0 0 0] 0 [ 0 0 0 -1 0 -1 -1 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ] FEMStencilSetRow: 8 [-1 0 0] 1 [ 0 0 0 0 0 0 0 0 5 -2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ] FEMStencilSetRow: 9 [ 0 0 0] 1 [ 0 0 0 0 0 0 0 0 -2 5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ] FEMStencilSetRow: 10 [ 0 -1 0] 2 [ 0 0 0 0 0 0 0 0 0 0 5 -2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ] FEMStencilSetRow: 11 [ 0 0 0] 2 [ 0 0 0 0 0 0 0 0 0 0 -2 5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ] FEMStencilSetRow: 12 [ 0 0 -1] 3 [ 0 0 0 0 0 0 0 0 0 0 0 0 5 -2 0 0 0 0 0 0 0 0 0 0 0 0 ] FEMStencilSetRow: 13 [ 0 0 0] 3 [ 0 0 0 0 0 0 0 0 0 0 0 0 -2 5 0 0 0 0 0 0 0 0 0 0 0 0 ] FEMStencilSetRow: 14 [ 0 -1 -1] 4 [ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 8 -3 -3 0 0 0 0 0 0 0 0 0 ] FEMStencilSetRow: 15 [ 0 0 -1] 4 [ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -3 8 0 -3 0 0 0 0 0 0 0 0 ] FEMStencilSetRow: 16 [ 0 -1 0] 4 [ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -3 0 8 -3 0 0 0 0 0 0 0 0 ] FEMStencilSetRow: 17 [ 0 0 0] 4 [ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -3 -3 8 0 0 0 0 0 0 0 0 ] FEMStencilSetRow: 18 [-1 0 -1] 5 [ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 8 -3 -3 0 0 0 0 0 ] FEMStencilSetRow: 19 [ 0 0 -1] 5 [ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -3 8 0 -3 0 0 0 0 ] FEMStencilSetRow: 20 [-1 0 0] 5 [ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -3 0 8 -3 0 0 0 0 ] FEMStencilSetRow: 21 [ 0 0 0] 5 [ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -3 -3 8 0 0 0 0 ] FEMStencilSetRow: 22 [-1 -1 0] 6 [ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 8 -3 -3 0 ] FEMStencilSetRow: 23 [ 0 -1 0] 6 [ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -3 8 0 -3 ] FEMStencilSetRow: 24 [-1 0 0] 6 [ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -3 0 8 -3 ] FEMStencilSetRow: 25 [ 0 0 0] 6 [ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -3 -3 8 ] ########################################################### # ProcessPoolCreate: num_pools ProcessPoolCreate: 1 # ProcessPoolSetPart: pool part ProcessPoolSetPart: 0 0 ProcessPoolSetPart: 0 1 ProcessPoolSetPart: 0 2 ########################################################### hypre-2.33.0/src/test/TEST_sstruct/sstruct.in.fe_node1_2D000066400000000000000000000044471477326011500231240ustar00rootroot00000000000000# Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) ########################################################### # In this example, the x/y coordinates are as follows # # # --------------------------------- # | | | | (4,4) | # --------------------------------- # ^ | | | | | # y --------------------------------- <- part 0 # | | | | | # --------------------------------- # | (1,1) | | | | # --------------------------------- # x > # ########################################################### # GridCreate: ndim nparts GridCreate: 2 1 # GridSetExtents: part ilower(ndim) iupper(ndim) GridSetExtents: 0 (1- 1-) (4+ 4+) # GridSetVariables: part nvars vartypes[nvars] # NODE = 1 GridSetVariables: 0 1 [1] ########################################################### # FEMStencilCreate: size FEMStencilCreate: 4 # FEMStencilSetRow: row offset[ndim] var values[size] FEMStencilSetRow: 0 [-1 -1] 0 [ 1.0 -0.5 -0.5 0.0 ] FEMStencilSetRow: 1 [ 0 -1] 0 [ -0.5 1.0 0.0 -0.5 ] FEMStencilSetRow: 2 [-1 0] 0 [ -0.5 0.0 1.0 -0.5 ] FEMStencilSetRow: 3 [ 0 0] 0 [ 0.0 -0.5 -0.5 1.0 ] ########################################################### # FEMMatrixAddToValues: \ # part ilower(ndim) iupper(ndim) nrows rows[nrows] ncols cols[ncols] \ # values[nrows*ncols] FEMMatrixAddToValues: 0 (1- 1-) (4+ 1-) 2 [0 1] 2 [0 1] [ 1.0 -0.5 -0.5 1.0 ] FEMMatrixAddToValues: 0 (1- 4+) (4+ 4+) 2 [2 3] 2 [2 3] [ 1.0 -0.5 -0.5 1.0 ] FEMMatrixAddToValues: 0 (1- 1-) (1- 4+) 2 [0 2] 2 [0 2] [ 1.0 -0.5 -0.5 1.0 ] FEMMatrixAddToValues: 0 (4+ 1-) (4+ 4+) 2 [1 3] 2 [1 3] [ 1.0 -0.5 -0.5 1.0 ] FEMMatrixAddToValues: 0 (1- 1-) (1- 1-) 1 [0] 1 [0] [ 1.0 ] FEMMatrixAddToValues: 0 (4+ 1-) (4+ 1-) 1 [1] 1 [1] [ 1.0 ] FEMMatrixAddToValues: 0 (1- 4+) (1- 4+) 1 [2] 1 [2] [ 1.0 ] FEMMatrixAddToValues: 0 (4+ 4+) (4+ 4+) 1 [3] 1 [3] [ 1.0 ] ########################################################### # ProcessPoolCreate: num_pools ProcessPoolCreate: 1 # ProcessPoolSetPart: pool part ProcessPoolSetPart: 0 0 ########################################################### hypre-2.33.0/src/test/TEST_sstruct/sstruct.in.fe_node2_2D000066400000000000000000000057041477326011500231220ustar00rootroot00000000000000# Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) ########################################################### # In this example, the x/y coordinates are as follows # # x > # --------------------------------- # ^ | | | | (4,2) | # y --------------------------------- <- part 1 # | (1,1) | | | | # ================================= # ^ | | | | (4,2) | # y --------------------------------- <- part 0 # | (1,1) | | | | # --------------------------------- # x > # ########################################################### # GridCreate: ndim nparts GridCreate: 2 2 # GridSetExtents: part ilower(ndim) iupper(ndim) GridSetExtents: 0 (1- 1-) (4+ 2+) GridSetExtents: 1 (1- 1-) (4+ 2+) # GridSetVariables: part nvars vartypes[nvars] # NODE = 1 GridSetVariables: 0 1 [1] GridSetVariables: 1 1 [1] # GridSetNeighborPart: part ilower(ndim) iupper(ndim) \ # nbor_part nbor_ilower(ndim) nbor_iupper(ndim) \ # index_map[ndim] index_dir[ndim] GridSetNeighborPart: 0 (1- 3-) (4+ 3-) 1 (1- 1-) (4+ 1-) [0 1] [1 1] GridSetNeighborPart: 1 (1- 0+) (4+ 0+) 0 (1- 2+) (4+ 2+) [0 1] [1 1] ########################################################### # FEMStencilCreate: size FEMStencilCreate: 4 # FEMStencilSetRow: row offset[ndim] var values[size] FEMStencilSetRow: 0 [-1 -1] 0 [ 1.0 -0.5 -0.5 0.0 ] FEMStencilSetRow: 1 [ 0 -1] 0 [ -0.5 1.0 0.0 -0.5 ] FEMStencilSetRow: 2 [-1 0] 0 [ -0.5 0.0 1.0 -0.5 ] FEMStencilSetRow: 3 [ 0 0] 0 [ 0.0 -0.5 -0.5 1.0 ] ########################################################### # FEMMatrixAddToValues: \ # part ilower(ndim) iupper(ndim) nrows rows[nrows] ncols cols[ncols] \ # values[nrows*ncols] # lower part (s, w, e, sw, se) FEMMatrixAddToValues: 0 (1- 1-) (4+ 1-) 2 [0 1] 2 [0 1] [ 1.0 -0.5 -0.5 1.0 ] FEMMatrixAddToValues: 0 (1- 1-) (1- 2+) 2 [0 2] 2 [0 2] [ 1.0 -0.5 -0.5 1.0 ] FEMMatrixAddToValues: 0 (4+ 1-) (4+ 2+) 2 [1 3] 2 [1 3] [ 1.0 -0.5 -0.5 1.0 ] FEMMatrixAddToValues: 0 (1- 1-) (1- 1-) 1 [0] 1 [0] [ 1.0 ] FEMMatrixAddToValues: 0 (4+ 1-) (4+ 1-) 1 [1] 1 [1] [ 1.0 ] # upper part (n, w, e, nw, ne) FEMMatrixAddToValues: 1 (1- 2+) (4+ 2+) 2 [2 3] 2 [2 3] [ 1.0 -0.5 -0.5 1.0 ] FEMMatrixAddToValues: 1 (1- 1-) (1- 2+) 2 [0 2] 2 [0 2] [ 1.0 -0.5 -0.5 1.0 ] FEMMatrixAddToValues: 1 (4+ 1-) (4+ 2+) 2 [1 3] 2 [1 3] [ 1.0 -0.5 -0.5 1.0 ] FEMMatrixAddToValues: 1 (1- 2+) (1- 2+) 1 [2] 1 [2] [ 1.0 ] FEMMatrixAddToValues: 1 (4+ 2+) (4+ 2+) 1 [3] 1 [3] [ 1.0 ] ########################################################### # ProcessPoolCreate: num_pools ProcessPoolCreate: 2 # ProcessPoolSetPart: pool part ProcessPoolSetPart: 0 0 ProcessPoolSetPart: 1 1 ########################################################### hypre-2.33.0/src/test/TEST_sstruct/sstruct.in.fe_node2_2D_coord000066400000000000000000000057061477326011500243120ustar00rootroot00000000000000# Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) ########################################################### # In this example, the x/y coordinates are as follows # # < y # --------------------------------- # ^ | (2,4) | | | | # x --------------------------------- <- part 1 # | | | | (1,1) | # ================================= # ^ | | | | (4,2) | # y --------------------------------- <- part 0 # | (1,1) | | | | # --------------------------------- # x > # ########################################################### # GridCreate: ndim nparts GridCreate: 2 2 # GridSetExtents: part ilower(ndim) iupper(ndim) GridSetExtents: 0 (1- 1-) (4+ 2+) GridSetExtents: 1 (1- 1-) (2+ 4+) # GridSetVariables: part nvars vartypes[nvars] # NODE = 1 GridSetVariables: 0 1 [1] GridSetVariables: 1 1 [1] # GridSetNeighborPart: part ilower(ndim) iupper(ndim) \ # nbor_part nbor_ilower(ndim) nbor_iupper(ndim) \ # index_map[ndim] index_dir[ndim] GridSetNeighborPart: 0 (1- 3-) (4+ 3-) 1 (1- 4+) (1- 1-) [1 0] [-1 1] GridSetNeighborPart: 1 (0+ 1-) (0+ 4+) 0 (4+ 2+) (1- 2+) [1 0] [ 1 -1] ########################################################### # FEMStencilCreate: size FEMStencilCreate: 4 # FEMStencilSetRow: row offset[ndim] var values[size] FEMStencilSetRow: 0 [-1 -1] 0 [ 1.0 -0.5 -0.5 0.0 ] FEMStencilSetRow: 1 [ 0 -1] 0 [ -0.5 1.0 0.0 -0.5 ] FEMStencilSetRow: 2 [-1 0] 0 [ -0.5 0.0 1.0 -0.5 ] FEMStencilSetRow: 3 [ 0 0] 0 [ 0.0 -0.5 -0.5 1.0 ] ########################################################### # FEMMatrixAddToValues: \ # part ilower(ndim) iupper(ndim) nrows rows[nrows] ncols cols[ncols] \ # values[nrows*ncols] # lower part (s, w, e, sw, se) FEMMatrixAddToValues: 0 (1- 1-) (4+ 1-) 2 [0 1] 2 [0 1] [ 1.0 -0.5 -0.5 1.0 ] FEMMatrixAddToValues: 0 (1- 1-) (1- 2+) 2 [0 2] 2 [0 2] [ 1.0 -0.5 -0.5 1.0 ] FEMMatrixAddToValues: 0 (4+ 1-) (4+ 2+) 2 [1 3] 2 [1 3] [ 1.0 -0.5 -0.5 1.0 ] FEMMatrixAddToValues: 0 (1- 1-) (1- 1-) 1 [0] 1 [0] [ 1.0 ] FEMMatrixAddToValues: 0 (4+ 1-) (4+ 1-) 1 [1] 1 [1] [ 1.0 ] # upper part (e, n, s, ne, se) FEMMatrixAddToValues: 1 (2+ 1-) (2+ 4+) 2 [1 3] 2 [1 3] [ 1.0 -0.5 -0.5 1.0 ] FEMMatrixAddToValues: 1 (1- 4+) (2+ 4+) 2 [2 3] 2 [2 3] [ 1.0 -0.5 -0.5 1.0 ] FEMMatrixAddToValues: 1 (1- 1-) (2+ 1-) 2 [0 1] 2 [0 1] [ 1.0 -0.5 -0.5 1.0 ] FEMMatrixAddToValues: 1 (2+ 4+) (2+ 4+) 1 [3] 1 [3] [ 1.0 ] FEMMatrixAddToValues: 1 (2+ 1-) (2+ 1-) 1 [1] 1 [1] [ 1.0 ] ########################################################### # ProcessPoolCreate: num_pools ProcessPoolCreate: 2 # ProcessPoolSetPart: pool part ProcessPoolSetPart: 0 0 ProcessPoolSetPart: 1 1 ########################################################### hypre-2.33.0/src/test/TEST_sstruct/sstruct.in.fe_rhombus5000066400000000000000000000110241477326011500233220ustar00rootroot00000000000000# Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) ########################################################### # # This is a 2D enhanced connectivity nodal FEM example # for 5 rhombus-shaped parts rotated about the origin. # ########################################################### # GridCreate: ndim nparts GridCreate: 2 5 # GridSetExtents: part ilower(ndim) iupper(ndim) GridSetExtents: 0 (1- 1-) (10+ 10+) GridSetExtents: 1 (1- 1-) (10+ 10+) GridSetExtents: 2 (1- 1-) (10+ 10+) GridSetExtents: 3 (1- 1-) (10+ 10+) GridSetExtents: 4 (1- 1-) (10+ 10+) # GridSetVariables: part nvars vartypes[nvars] # NODE = 1 GridSetVariables: 0 1 [1] GridSetVariables: 1 1 [1] GridSetVariables: 2 1 [1] GridSetVariables: 3 1 [1] GridSetVariables: 4 1 [1] # GridSetSharedPart: part ilower(ndim) iupper(ndim) offset[ndim] \ # spart silower(ndim) siupper(ndim) soffset[ndim] \ # index_map[ndim] index_dir[ndim] GridSetSharedPart: 0 (1- 0+) (10+ 0+) [0 0] 4 (1- 1-) ( 1- 10+) [0 0] [1 0] [ 1 -1] GridSetSharedPart: 0 (0+ 1-) ( 0+ 10+) [0 0] 1 (1- 1-) (10+ 1-) [0 0] [1 0] [-1 1] GridSetSharedPart: 0 (1- 1-) (1- 1-) [-1 -1] 2 (1-1-) (1- 1-) [-1 -1] [0 1] [1 1] GridSetSharedPart: 0 (1- 1-) (1- 1-) [-1 -1] 3 (1-1-) (1- 1-) [-1 -1] [0 1] [1 1] GridSetSharedPart: 1 (1- 0+) (10+ 0+) [0 0] 0 (1- 1-) ( 1- 10+) [0 0] [1 0] [ 1 -1] GridSetSharedPart: 1 (0+ 1-) ( 0+ 10+) [0 0] 2 (1- 1-) (10+ 1-) [0 0] [1 0] [-1 1] GridSetSharedPart: 1 (1- 1-) (1- 1-) [-1 -1] 3 (1-1-) (1- 1-) [-1 -1] [0 1] [1 1] GridSetSharedPart: 1 (1- 1-) (1- 1-) [-1 -1] 4 (1-1-) (1- 1-) [-1 -1] [0 1] [1 1] GridSetSharedPart: 2 (1- 0+) (10+ 0+) [0 0] 1 (1- 1-) ( 1- 10+) [0 0] [1 0] [ 1 -1] GridSetSharedPart: 2 (0+ 1-) ( 0+ 10+) [0 0] 3 (1- 1-) (10+ 1-) [0 0] [1 0] [-1 1] GridSetSharedPart: 2 (1- 1-) (1- 1-) [-1 -1] 4 (1-1-) (1- 1-) [-1 -1] [0 1] [1 1] GridSetSharedPart: 2 (1- 1-) (1- 1-) [-1 -1] 0 (1-1-) (1- 1-) [-1 -1] [0 1] [1 1] GridSetSharedPart: 3 (1- 0+) (10+ 0+) [0 0] 2 (1- 1-) ( 1- 10+) [0 0] [1 0] [ 1 -1] GridSetSharedPart: 3 (0+ 1-) ( 0+ 10+) [0 0] 4 (1- 1-) (10+ 1-) [0 0] [1 0] [-1 1] GridSetSharedPart: 3 (1- 1-) (1- 1-) [-1 -1] 0 (1-1-) (1- 1-) [-1 -1] [0 1] [1 1] GridSetSharedPart: 3 (1- 1-) (1- 1-) [-1 -1] 1 (1-1-) (1- 1-) [-1 -1] [0 1] [1 1] GridSetSharedPart: 4 (1- 0+) (10+ 0+) [0 0] 3 (1- 1-) ( 1- 10+) [0 0] [1 0] [ 1 -1] GridSetSharedPart: 4 (0+ 1-) ( 0+ 10+) [0 0] 0 (1- 1-) (10+ 1-) [0 0] [1 0] [-1 1] GridSetSharedPart: 4 (1- 1-) (1- 1-) [-1 -1] 1 (1-1-) (1- 1-) [-1 -1] [0 1] [1 1] GridSetSharedPart: 4 (1- 1-) (1- 1-) [-1 -1] 2 (1-1-) (1- 1-) [-1 -1] [0 1] [1 1] ########################################################### # FEMStencilCreate: size FEMStencilCreate: 4 # FEMStencilSetRow: row offset[ndim] var values[size] FEMStencilSetRow: 0 [-1 -1] 0 [ 0.538514968042 -0.175243704040 -0.188027559963 -0.175243704040] FEMStencilSetRow: 1 [ 0 -1] 0 [-0.175243704040 0.863434664275 -0.175243704040 -0.512947256196] FEMStencilSetRow: 2 [ 0 0] 0 [-0.188027559963 -0.175243704040 0.538514968042 -0.175243704040] FEMStencilSetRow: 3 [-1 0] 0 [-0.175243704040 -0.512947256196 -0.175243704040 0.863434664275] # FEMRhsSet: values[size] FEMRhsSet: [ 0.00237764 0.00237764 0.00237764 0.00237764] ########################################################### # Implement boundary conditions by adding a big value to the diagonal. # MatrixAddToValues: \ # part ilower(ndim) iupper(ndim) var nentries entries[nentries] values[nentries] MatrixAddToValues: 0 (10+ 0+) (10+ 10+) 0 1 [0] [1000000000000.0] MatrixAddToValues: 0 (0+ 10+) (10+ 10+) 0 1 [0] [1000000000000.0] MatrixAddToValues: 1 (10+ 0+) (10+ 10+) 0 1 [0] [1000000000000.0] MatrixAddToValues: 1 (0+ 10+) (10+ 10+) 0 1 [0] [1000000000000.0] MatrixAddToValues: 2 (10+ 0+) (10+ 10+) 0 1 [0] [1000000000000.0] MatrixAddToValues: 2 (0+ 10+) (10+ 10+) 0 1 [0] [1000000000000.0] MatrixAddToValues: 3 (10+ 0+) (10+ 10+) 0 1 [0] [1000000000000.0] MatrixAddToValues: 3 (0+ 10+) (10+ 10+) 0 1 [0] [1000000000000.0] MatrixAddToValues: 4 (10+ 0+) (10+ 10+) 0 1 [0] [1000000000000.0] MatrixAddToValues: 4 (0+ 10+) (10+ 10+) 0 1 [0] [1000000000000.0] ########################################################### # ProcessPoolCreate: num_pools ProcessPoolCreate: 5 # ProcessPoolSetPart: pool part ProcessPoolSetPart: 0 0 ProcessPoolSetPart: 1 1 ProcessPoolSetPart: 2 2 ProcessPoolSetPart: 3 3 ProcessPoolSetPart: 4 4 ########################################################### hypre-2.33.0/src/test/TEST_sstruct/sstruct.in.laps000066400000000000000000000037621477326011500220550ustar00rootroot00000000000000# Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) ########################################################### # GridCreate: ndim nparts GridCreate: 2 1 # GridSetExtents: part ilower(ndim) iupper(ndim) GridSetExtents: 0 (0- 0-) (7+ 7+) # GridSetVariables: part nvars vartypes[nvars] # CELL = 0 GridSetVariables: 0 2 [0 0] ########################################################### # StencilCreate: nstencils sizes[nstencils] StencilCreate: 2 [6 6] # StencilSetEntry: stencil_num entry offset[ndim] var value StencilSetEntry: 0 0 [ 0 0] 0 4.0 StencilSetEntry: 0 1 [-1 0] 0 -1.0 StencilSetEntry: 0 2 [ 1 0] 0 -1.0 StencilSetEntry: 0 3 [ 0 -1] 0 -1.0 StencilSetEntry: 0 4 [ 0 1] 0 -1.0 StencilSetEntry: 0 5 [ 0 0] 1 1.0e-5 StencilSetEntry: 1 0 [ 0 0] 1 4.0 StencilSetEntry: 1 1 [-1 0] 1 -1.0 StencilSetEntry: 1 2 [ 1 0] 1 -1.0 StencilSetEntry: 1 3 [ 0 -1] 1 -1.0 StencilSetEntry: 1 4 [ 0 1] 1 -1.0 StencilSetEntry: 1 5 [ 0 0] 0 1.0e-5 ########################################################### # GraphSetStencil: part var stencil_num GraphSetStencil: 0 0 0 GraphSetStencil: 0 1 1 ########################################################### # MatrixSetValues: \ # part ilower(ndim) iupper(ndim) stride[ndim] var entry value MatrixSetValues: 0 (0- 0-) (0- 7+) [1 1] 0 1 0.0 MatrixSetValues: 0 (0- 0-) (0- 7+) [1 1] 1 1 0.0 MatrixSetValues: 0 (7+ 0-) (7+ 7+) [1 1] 0 2 0.0 MatrixSetValues: 0 (7+ 0-) (7+ 7+) [1 1] 1 2 0.0 MatrixSetValues: 0 (0- 0-) (7+ 0-) [1 1] 0 3 0.0 MatrixSetValues: 0 (0- 0-) (7+ 0-) [1 1] 1 3 0.0 MatrixSetValues: 0 (0- 7+) (7+ 7+) [1 1] 0 4 0.0 MatrixSetValues: 0 (0- 7+) (7+ 7+) [1 1] 1 4 0.0 ########################################################### # ProcessPoolCreate: num_pools ProcessPoolCreate: 1 # ProcessPoolSetPart: pool part ProcessPoolSetPart: 0 0 ########################################################### hypre-2.33.0/src/test/TEST_sstruct/sstruct.in.laps.periodic000066400000000000000000000035571477326011500236540ustar00rootroot00000000000000# Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) ########################################################### # GridCreate: ndim nparts GridCreate: 2 1 # GridSetExtents: part ilower(ndim) iupper(ndim) GridSetExtents: 0 (0- 0-) (7+ 7+) # GridSetVariables: part nvars vartypes[nvars] # CELL = 0 GridSetVariables: 0 2 [0 0] # GridSetPeriodic: part periodic[ndim] GridSetPeriodic: 0 [8 0] ########################################################### # StencilCreate: nstencils sizes[nstencils] StencilCreate: 2 [6 6] # StencilSetEntry: stencil_num entry offset[ndim] var value StencilSetEntry: 0 0 [ 0 0] 0 4.0 StencilSetEntry: 0 1 [-1 0] 0 -1.0 StencilSetEntry: 0 2 [ 1 0] 0 -1.0 StencilSetEntry: 0 3 [ 0 -1] 0 -1.0 StencilSetEntry: 0 4 [ 0 1] 0 -1.0 StencilSetEntry: 0 5 [ 0 0] 1 1.0e-5 StencilSetEntry: 1 0 [ 0 0] 1 4.0 StencilSetEntry: 1 1 [-1 0] 1 -1.0 StencilSetEntry: 1 2 [ 1 0] 1 -1.0 StencilSetEntry: 1 3 [ 0 -1] 1 -1.0 StencilSetEntry: 1 4 [ 0 1] 1 -1.0 StencilSetEntry: 1 5 [ 0 0] 0 1.0e-5 ########################################################### # GraphSetStencil: part var stencil_num GraphSetStencil: 0 0 0 GraphSetStencil: 0 1 1 ########################################################### # MatrixSetValues: \ # part ilower(ndim) iupper(ndim) stride[ndim] var entry value MatrixSetValues: 0 (0- 0-) (7+ 0-) [1 1] 0 3 0.0 MatrixSetValues: 0 (0- 0-) (7+ 0-) [1 1] 1 3 0.0 MatrixSetValues: 0 (0- 7+) (7+ 7+) [1 1] 0 4 0.0 MatrixSetValues: 0 (0- 7+) (7+ 7+) [1 1] 1 4 0.0 ########################################################### # ProcessPoolCreate: num_pools ProcessPoolCreate: 1 # ProcessPoolSetPart: pool part ProcessPoolSetPart: 0 0 ########################################################### hypre-2.33.0/src/test/TEST_sstruct/sstruct.in.marinak000066400000000000000000000116531477326011500225360ustar00rootroot00000000000000# Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) ########################################################### # GridCreate: ndim nparts GridCreate: 3 8 # GridSetExtents: part ilower(ndim) iupper(ndim) GridSetExtents: 0 (2- 2- 2-) (57+ 2+ 36+) GridSetExtents: 1 (2- 2- 2-) (57+ 2+ 12+) GridSetExtents: 2 (2- 2- 2-) (23+ 2+ 36+) GridSetExtents: 3 (2- 2- 2-) (57+ 2+ 12+) GridSetExtents: 4 (2- 2- 2-) (20+ 2+ 12+) GridSetExtents: 5 (2- 2- 2-) (12+ 2+ 7+) GridSetExtents: 6 (2- 2- 2-) (20+ 2+ 7+) GridSetExtents: 7 (2- 2- 2-) (12+ 2+ 7+) # GridSetVariables: part nvars vartypes[nvars] # CELL = 0 GridSetVariables: 0 1 [0] GridSetVariables: 1 1 [0] GridSetVariables: 2 1 [0] GridSetVariables: 3 1 [0] GridSetVariables: 4 1 [0] GridSetVariables: 5 1 [0] GridSetVariables: 6 1 [0] GridSetVariables: 7 1 [0] # GridSetNeighborPart: part ilower(ndim) iupper(ndim) \ # nbor_part nbor_ilower(ndim) nbor_iupper(ndim) \ # index_map[ndim] index_dir[ndim] GridSetNeighborPart: 0 (1- 1- 1-) (1- 3+ 37+) 2 (23+ 1- 1-) (23+ 3+ 37+) [0 1 2] [1 1 1] GridSetNeighborPart: 0 (1- 1- 1-) (58+ 3+ 1-) 1 (1- 1- 12+) (58+ 3+ 12+) [0 1 2] [1 1 1] GridSetNeighborPart: 1 (1- 1- 13+) (58+ 3+ 13+) 0 (1- 1- 2-) (58+ 3+ 2-) [0 1 2] [1 1 1] GridSetNeighborPart: 1 (1- 1- 1- ) (1- 3+ 13+ ) 2 (12- 1- 2-) (24+ 3+ 2-) [2 1 0] [1 1 1] GridSetNeighborPart: 1 (1- 1- 1- ) (58+ 3+ 1- ) 3 (58+ 1- 2-) (1- 3+ 2-) [0 1 2] [-1 1 1] GridSetNeighborPart: 1 (58+ 1- 1- ) (58+ 3+ 12+ ) 7 (1- 1- 7+) (12+ 3+ 7+) [2 1 0] [1 1 1] GridSetNeighborPart: 2 (24+ 1- 1-) (24+ 3+ 37+) 0 (2- 1- 1-) (2- 3+ 37+) [0 1 2] [1 1 1] GridSetNeighborPart: 2 (12- 1- 1-) (24+ 3+ 1-) 1 (2- 1- 1-) (2- 3+ 13+) [2 1 0] [1 1 1] GridSetNeighborPart: 2 (1- 1- 1-) (13+ 3+ 1-) 3 (57+ 1- 13+) (57+ 3+ 1-) [2 1 0] [-1 1 1] GridSetNeighborPart: 3 (1- 1- 1-) (58+ 3+ 1-) 1 (58+ 1- 2-) (1- 3+ 2-) [0 1 2] [-1 1 1] GridSetNeighborPart: 3 (58+ 1- 1-) (58+ 3+ 13+) 2 (13+ 1- 2-) (1- 3+ 2-) [2 1 0] [1 1 -1] GridSetNeighborPart: 3 (1- 1- 1-) (1- 3+ 13+) 4 (20+ 1- 1-) (20+ 3+ 13+) [0 1 2] [1 1 1] GridSetNeighborPart: 4 (21+ 1- 1-) (21+ 3+ 13+) 3 (2- 1- 1-) (2- 3+ 13+) [0 1 2] [1 1 1] GridSetNeighborPart: 4 (1- 1- 1-) (1- 3+ 13+) 5 (13+ 1- 7+) (1- 3+ 7+) [2 1 0] [1 1 -1] GridSetNeighborPart: 4 (1- 1- 1-) (21+ 3+ 1-) 6 (1- 1- 7+) (21+ 3+ 7+) [0 1 2] [1 1 1] GridSetNeighborPart: 5 (1- 1- 8+) (13+ 3+ 8+) 4 (2- 1- 13+) (2- 3+ 1-) [2 1 0] [-1 1 1] GridSetNeighborPart: 5 (13+ 1- 1-) (13+ 3+ 8+) 6 (2- 1- 1-) (2- 3+ 8+) [0 1 2] [1 1 1] GridSetNeighborPart: 6 (1- 1- 8+) (21+ 3+ 8+) 4 (1- 1- 2-) (21+ 3+ 2-) [0 1 2] [1 1 1] GridSetNeighborPart: 6 (1- 1- 1-) (1- 3+ 8+) 5 (12+ 1- 1-) (12+ 3+ 8+) [0 1 2] [1 1 1] GridSetNeighborPart: 6 (21+ 1- 1-) (21+ 3+ 8+) 7 (2- 1- 1-) (2- 3+ 8+) [0 1 2] [1 1 1] GridSetNeighborPart: 7 (1- 1- 8+) (12+ 3+ 8+) 1 (57+ 1- 1-) (57+ 3+ 12+) [2 1 0] [1 1 1] GridSetNeighborPart: 7 (1- 1- 1-) (1- 3+ 8+) 6 (20+ 1- 1-) (20+ 3+ 8+) [0 1 2] [1 1 1] ########################################################### # StencilCreate: nstencils sizes[nstencils] StencilCreate: 1 [19] # StencilSetEntry: stencil_num entry offset[ndim] var value StencilSetEntry: 0 0 [ 0 0 0] 0 8.0 StencilSetEntry: 0 1 [-1 0 0] 0 -1.0 StencilSetEntry: 0 2 [ 1 0 0] 0 -1.0 StencilSetEntry: 0 3 [ 0 0 -1] 0 -1.0 StencilSetEntry: 0 4 [ 0 0 1] 0 -1.0 StencilSetEntry: 0 5 [ 1 0 1] 0 -1.0 StencilSetEntry: 0 6 [ 1 0 -1] 0 -1.0 StencilSetEntry: 0 7 [-1 0 1] 0 -1.0 StencilSetEntry: 0 8 [-1 0 -1] 0 -1.0 StencilSetEntry: 0 9 [ 0 -1 0] 0 0.0 StencilSetEntry: 0 10 [-1 -1 0] 0 0.0 StencilSetEntry: 0 11 [ 1 -1 0] 0 0.0 StencilSetEntry: 0 12 [ 0 -1 -1] 0 0.0 StencilSetEntry: 0 13 [ 0 -1 1] 0 0.0 StencilSetEntry: 0 14 [ 0 1 0] 0 0.0 StencilSetEntry: 0 15 [-1 1 0] 0 0.0 StencilSetEntry: 0 16 [ 1 1 0] 0 0.0 StencilSetEntry: 0 17 [ 0 1 -1] 0 0.0 StencilSetEntry: 0 18 [ 0 1 1] 0 0.0 ########################################################### # GraphSetStencil: part var stencil_num GraphSetStencil: 0 0 0 GraphSetStencil: 1 0 0 GraphSetStencil: 2 0 0 GraphSetStencil: 3 0 0 GraphSetStencil: 4 0 0 GraphSetStencil: 5 0 0 GraphSetStencil: 6 0 0 GraphSetStencil: 7 0 0 ########################################################### # ProcessPoolCreate: num_pools ProcessPoolCreate: 1 # ProcessPoolSetPart: pool part ProcessPoolSetPart: 0 0 ProcessPoolSetPart: 0 1 ProcessPoolSetPart: 0 2 ProcessPoolSetPart: 0 3 ProcessPoolSetPart: 0 4 ProcessPoolSetPart: 0 5 ProcessPoolSetPart: 0 6 ProcessPoolSetPart: 0 7 # ProcessPoolCreate: num_pools ProcessPoolCreate: 8 # ProcessPoolSetPart: pool part ProcessPoolSetPart: 0 0 ProcessPoolSetPart: 1 1 ProcessPoolSetPart: 2 2 ProcessPoolSetPart: 3 3 ProcessPoolSetPart: 4 4 ProcessPoolSetPart: 5 5 ProcessPoolSetPart: 6 6 ProcessPoolSetPart: 7 7 ########################################################### hypre-2.33.0/src/test/TEST_sstruct/sstruct.in.maxwell3d_unscaled000066400000000000000000000162721477326011500246740ustar00rootroot00000000000000# Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) ########################################################### # GridCreate: ndim nparts GridCreate: 3 1 # GridSetExtents: part ilower(ndim) iupper(ndim) GridSetExtents: 0 (1- 1- 1-) (16+ 16+ 16+) # GridSetVariables: part nvars vartypes[nvars] # XEDGE = 5 # YEDGE = 6 # ZEDGE = 7 GridSetVariables: 0 3 [5 6 7] ########################################################### # StencilCreate: nstencils sizes[nstencils] StencilCreate: 6 [33 33 33 9 9 9] # StencilSetEntry: stencil_num entry offset[ndim] var value StencilSetEntry: 0 0 [ 0 0 0] 0 2.666666667 StencilSetEntry: 0 1 [ 0 1 0] 0 -0.333333333 StencilSetEntry: 0 2 [ 0 1 1] 0 -0.333333333 StencilSetEntry: 0 3 [ 0 0 1] 0 -0.333333333 StencilSetEntry: 0 4 [ 0 -1 0] 0 -0.333333333 StencilSetEntry: 0 5 [ 0 -1 1] 0 -0.333333333 StencilSetEntry: 0 6 [ 0 0 -1] 0 -0.333333333 StencilSetEntry: 0 7 [ 0 1 -1] 0 -0.333333333 StencilSetEntry: 0 8 [ 0 -1 -1] 0 -0.333333333 StencilSetEntry: 0 9 [ 0 0 0] 1 -0.6666666667 StencilSetEntry: 0 10 [-1 0 0] 1 0.6666666667 StencilSetEntry: 0 11 [ 0 0 -1] 1 -0.1666666667 StencilSetEntry: 0 12 [-1 0 -1] 1 0.1666666667 StencilSetEntry: 0 13 [ 0 0 1] 1 -0.1666666667 StencilSetEntry: 0 14 [-1 0 1] 1 0.1666666667 StencilSetEntry: 0 15 [ 0 1 0] 1 0.6666666667 StencilSetEntry: 0 16 [-1 1 0] 1 -0.6666666667 StencilSetEntry: 0 17 [ 0 1 1] 1 0.1666666667 StencilSetEntry: 0 18 [-1 1 1] 1 -0.1666666667 StencilSetEntry: 0 19 [ 0 1 -1] 1 0.1666666667 StencilSetEntry: 0 20 [-1 1 -1] 1 -0.1666666667 StencilSetEntry: 0 21 [ 0 0 0] 2 -0.6666666667 StencilSetEntry: 0 22 [-1 0 0] 2 0.6666666667 StencilSetEntry: 0 23 [-1 -1 0] 2 0.1666666667 StencilSetEntry: 0 24 [ 0 -1 0] 2 -0.1666666667 StencilSetEntry: 0 25 [ 0 0 1] 2 0.6666666667 StencilSetEntry: 0 26 [-1 0 1] 2 -0.6666666667 StencilSetEntry: 0 27 [-1 -1 1] 2 -0.1666666667 StencilSetEntry: 0 28 [ 0 -1 1] 2 0.1666666667 StencilSetEntry: 0 29 [ 0 1 0] 2 -0.1666666667 StencilSetEntry: 0 30 [-1 1 0] 2 0.1666666667 StencilSetEntry: 0 31 [-1 1 1] 2 -0.1666666667 StencilSetEntry: 0 32 [ 0 1 1] 2 0.1666666667 StencilSetEntry: 1 0 [ 0 0 0] 1 2.666666667 StencilSetEntry: 1 1 [-1 0 0] 1 -0.333333333 StencilSetEntry: 1 2 [ 0 0 -1] 1 -0.333333333 StencilSetEntry: 1 3 [-1 0 -1] 1 -0.333333333 StencilSetEntry: 1 4 [ 1 0 0] 1 -0.333333333 StencilSetEntry: 1 5 [ 1 0 -1] 1 -0.333333333 StencilSetEntry: 1 6 [ 0 0 1] 1 -0.333333333 StencilSetEntry: 1 7 [-1 0 1] 1 -0.333333333 StencilSetEntry: 1 8 [ 1 0 1] 1 -0.333333333 StencilSetEntry: 1 9 [ 0 0 0] 0 -0.6666666667 StencilSetEntry: 1 10 [ 0 -1 0] 0 0.6666666667 StencilSetEntry: 1 11 [ 0 -1 -1] 0 0.1666666667 StencilSetEntry: 1 12 [ 0 0 -1] 0 -0.1666666667 StencilSetEntry: 1 13 [ 1 0 0] 0 0.6666666667 StencilSetEntry: 1 14 [ 1 -1 0] 0 -0.6666666667 StencilSetEntry: 1 15 [ 1 0 -1] 0 0.1666666667 StencilSetEntry: 1 16 [ 1 -1 -1] 0 -0.1666666667 StencilSetEntry: 1 17 [ 0 -1 1] 0 0.1666666667 StencilSetEntry: 1 18 [ 0 0 1] 0 -0.1666666667 StencilSetEntry: 1 19 [ 1 -1 1] 0 -0.1666666667 StencilSetEntry: 1 20 [ 1 0 1] 0 0.1666666667 StencilSetEntry: 1 21 [ 0 0 0] 2 -0.6666666667 StencilSetEntry: 1 22 [ 0 -1 0] 2 0.6666666667 StencilSetEntry: 1 23 [-1 0 0] 2 -0.1666666667 StencilSetEntry: 1 24 [-1 -1 0] 2 0.1666666667 StencilSetEntry: 1 25 [ 1 -1 0] 2 0.1666666667 StencilSetEntry: 1 26 [ 1 0 0] 2 -0.1666666667 StencilSetEntry: 1 27 [ 0 0 1] 2 0.6666666667 StencilSetEntry: 1 28 [ 0 -1 1] 2 -0.6666666667 StencilSetEntry: 1 29 [-1 -1 1] 2 -0.1666666667 StencilSetEntry: 1 30 [-1 0 1] 2 0.1666666667 StencilSetEntry: 1 31 [ 1 -1 1] 2 -0.1666666667 StencilSetEntry: 1 32 [ 1 0 1] 2 0.1666666667 StencilSetEntry: 2 0 [ 0 0 0] 2 2.666666667 StencilSetEntry: 2 1 [-1 0 0] 2 -0.333333333 StencilSetEntry: 2 2 [ 0 -1 0] 2 -0.333333333 StencilSetEntry: 2 3 [-1 -1 0] 2 -0.333333333 StencilSetEntry: 2 4 [ 1 0 0] 2 -0.333333333 StencilSetEntry: 2 5 [ 1 -1 0] 2 -0.333333333 StencilSetEntry: 2 6 [ 0 1 0] 2 -0.333333333 StencilSetEntry: 2 7 [-1 1 0] 2 -0.333333333 StencilSetEntry: 2 8 [ 1 1 0] 2 -0.333333333 StencilSetEntry: 2 9 [ 0 0 0] 0 -0.6666666667 StencilSetEntry: 2 10 [ 0 0 -1] 0 0.6666666667 StencilSetEntry: 2 11 [ 0 -1 0] 0 -0.1666666667 StencilSetEntry: 2 12 [ 0 -1 -1] 0 0.1666666667 StencilSetEntry: 2 13 [ 1 0 0] 0 0.6666666667 StencilSetEntry: 2 14 [ 1 0 -1] 0 -0.6666666667 StencilSetEntry: 2 15 [ 1 -1 -1] 0 -0.1666666667 StencilSetEntry: 2 16 [ 1 -1 0] 0 0.1666666667 StencilSetEntry: 2 17 [ 0 1 0] 0 -0.1666666667 StencilSetEntry: 2 18 [ 0 1 -1] 0 0.1666666667 StencilSetEntry: 2 19 [ 1 1 0] 0 0.1666666667 StencilSetEntry: 2 20 [ 1 1 -1] 0 -0.1666666667 StencilSetEntry: 2 21 [ 0 0 0] 1 -0.6666666667 StencilSetEntry: 2 22 [ 0 0 -1] 1 0.6666666667 StencilSetEntry: 2 23 [-1 0 0] 1 -0.1666666667 StencilSetEntry: 2 24 [-1 0 -1] 1 0.1666666667 StencilSetEntry: 2 25 [ 1 0 0] 1 -0.1666666667 StencilSetEntry: 2 26 [ 1 0 -1] 1 0.1666666667 StencilSetEntry: 2 27 [ 0 1 0] 1 0.6666666667 StencilSetEntry: 2 28 [ 0 1 -1] 1 -0.6666666667 StencilSetEntry: 2 29 [-1 1 0] 1 0.1666666667 StencilSetEntry: 2 30 [-1 1 -1] 1 -0.1666666667 StencilSetEntry: 2 31 [ 1 1 0] 1 0.1666666667 StencilSetEntry: 2 32 [ 1 1 -1] 1 -0.1666666667 StencilSetEntry: 3 0 [ 0 0 0] 0 0.444444444 StencilSetEntry: 3 1 [ 0 1 0] 0 0.111111111 StencilSetEntry: 3 2 [ 0 1 1] 0 0.02777777777778 StencilSetEntry: 3 3 [ 0 0 1] 0 0.111111111 StencilSetEntry: 3 4 [ 0 -1 0] 0 0.111111111 StencilSetEntry: 3 5 [ 0 -1 1] 0 0.02777777777778 StencilSetEntry: 3 6 [ 0 0 -1] 0 0.111111111 StencilSetEntry: 3 7 [ 0 1 -1] 0 0.02777777777778 StencilSetEntry: 3 8 [ 0 -1 -1] 0 0.02777777777778 StencilSetEntry: 4 0 [ 0 0 0] 1 0.444444444 StencilSetEntry: 4 1 [-1 0 0] 1 0.111111111 StencilSetEntry: 4 2 [ 0 0 -1] 1 0.111111111 StencilSetEntry: 4 3 [-1 0 -1] 1 0.02777777777778 StencilSetEntry: 4 4 [ 1 0 0] 1 0.111111111 StencilSetEntry: 4 5 [ 1 0 -1] 1 0.02777777777778 StencilSetEntry: 4 6 [ 0 0 1] 1 0.111111111 StencilSetEntry: 4 7 [-1 0 1] 1 0.02777777777778 StencilSetEntry: 4 8 [ 1 0 1] 1 0.02777777777778 StencilSetEntry: 5 0 [ 0 0 0] 2 0.44444444444 StencilSetEntry: 5 1 [-1 0 0] 2 0.111111111 StencilSetEntry: 5 2 [ 0 -1 0] 2 0.111111111 StencilSetEntry: 5 3 [-1 -1 0] 2 0.02777777777778 StencilSetEntry: 5 4 [ 1 0 0] 2 0.111111111 StencilSetEntry: 5 5 [ 1 -1 0] 2 0.02777777777778 StencilSetEntry: 5 6 [ 0 1 0] 2 0.111111111 StencilSetEntry: 5 7 [-1 1 0] 2 0.02777777777778 StencilSetEntry: 5 8 [ 1 1 0] 2 0.02777777777778 ########################################################### # GraphSetStencil: part var stencil_num GraphSetStencil: 0 0 0 GraphSetStencil: 0 1 1 GraphSetStencil: 0 2 2 # rfactor:\ # rfactor(ndim) rfactor: [2 2 2] ########################################################### # ProcessPoolCreate: num_pools ProcessPoolCreate: 1 # ProcessPoolSetPart: pool part ProcessPoolSetPart: 0 0 ########################################################### hypre-2.33.0/src/test/TEST_sstruct/sstruct.in.miller_2blk000066400000000000000000000050011477326011500233000ustar00rootroot00000000000000# Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) ########################################################### # # ----------------------------- # | | | # | part 0 | part 1 | # | | | # | j | j | # | | | | | # | ---i | ---i | # ----------------------------- # ########################################################### # GridCreate: ndim nparts GridCreate: 2 2 # GridSetExtents: part ilower(ndim) iupper(ndim) GridSetExtents: 0 (2- 2-) (13+ 3+) GridSetExtents: 1 (2- 2-) (13+ 3+) # GridSetVariables: part nvars vartypes[nvars] # CELL = 0 GridSetVariables: 0 1 [0] GridSetVariables: 1 1 [0] # GridSetNeighborPart: part ilower(ndim) iupper(ndim) \ # nbor_part nbor_ilower(ndim) nbor_iupper(ndim) \ # index_map[ndim] index_dir[ndim] GridSetNeighborPart: 0 (14- 1+) (14- 4-) 1 (2- 1+) (2- 4-) [0 1] [1 1] GridSetNeighborPart: 1 (1+ 1+) (1+ 4-) 0 (13+ 1+) (13+ 4-) [0 1] [1 1] ########################################################### # StencilCreate: nstencils sizes[nstencils] StencilCreate: 1 [5] # StencilSetEntry: stencil_num entry offset[ndim] var value StencilSetEntry: 0 0 [ 0 0] 0 4.0 StencilSetEntry: 0 1 [-1 0] 0 -1.0 StencilSetEntry: 0 2 [ 1 0] 0 -1.0 StencilSetEntry: 0 3 [ 0 -1] 0 -1.0 StencilSetEntry: 0 4 [ 0 1] 0 -1.0 ########################################################### # GraphSetStencil: part var stencil_num GraphSetStencil: 0 0 0 GraphSetStencil: 1 0 0 ########################################################### # MatrixSetValues: \ # part ilower(ndim) iupper(ndim) stride[ndim] var entry value MatrixSetValues: 0 ( 2- 2-) ( 2- 3+) [1 1] 0 1 0.0 #MatrixSetValues: 0 (13+ 2-) (13+ 3+) [1 1] 0 2 0.0 MatrixSetValues: 0 ( 2- 2-) (13+ 2-) [1 1] 0 3 0.0 MatrixSetValues: 0 ( 2- 3+) (13+ 3+) [1 1] 0 4 0.0 #MatrixSetValues: 1 ( 2- 2-) ( 2- 3+) [1 1] 0 1 0.0 MatrixSetValues: 1 (13+ 2-) (13+ 3+) [1 1] 0 2 0.0 MatrixSetValues: 1 ( 2- 2-) (13+ 2-) [1 1] 0 3 0.0 MatrixSetValues: 1 ( 2- 3+) (13+ 3+) [1 1] 0 4 0.0 ########################################################### # ProcessPoolCreate: num_pools ProcessPoolCreate: 1 # ProcessPoolSetPart: pool part ProcessPoolSetPart: 0 0 ProcessPoolSetPart: 0 1 ########################################################### hypre-2.33.0/src/test/TEST_sstruct/sstruct.in.miller_2blk1000066400000000000000000000070621477326011500233720ustar00rootroot00000000000000# Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) ########################################################### # # ----------------------------- # | | | # | part 0 | part 1 | # | | | # | j | j | # | | | | | # | ---i | ---i | # ----------------------------- # ########################################################### # GridCreate: ndim nparts GridCreate: 2 2 # GridSetExtents: part ilower(ndim) iupper(ndim) GridSetExtents: 0 (2- 2-) (13+ 3+) GridSetExtents: 1 (2- 2-) (13+ 3+) # GridSetVariables: part nvars vartypes[nvars] # CELL = 0 GridSetVariables: 0 1 [0] GridSetVariables: 1 1 [0] # GridSetNeighborPart: part ilower(ndim) iupper(ndim) \ # nbor_part nbor_ilower(ndim) nbor_iupper(ndim) \ # index_map[ndim] index_dir[ndim] GridSetNeighborPart: 0 (14- 1+) (14- 4-) 1 (2- 1+) (2- 4-) [0 1] [1 1] GridSetNeighborPart: 0 (14- 3+) (14- 3-) 1 (2- 3+) (2- 3-) [0 1] [1 1] GridSetNeighborPart: 1 (1+ 1+) (1+ 4-) 0 (13+ 1+) (13+ 4-) [0 1] [1 1] ########################################################### # StencilCreate: nstencils sizes[nstencils] StencilCreate: 1 [9] # StencilSetEntry: stencil_num entry offset[ndim] var value StencilSetEntry: 0 0 [-1 -1] 0 -1.0 StencilSetEntry: 0 1 [-1 0] 0 -1.0 StencilSetEntry: 0 2 [-1 1] 0 -1.0 StencilSetEntry: 0 3 [ 0 1] 0 -1.0 StencilSetEntry: 0 4 [ 1 1] 0 -1.0 StencilSetEntry: 0 5 [ 1 0] 0 -1.0 StencilSetEntry: 0 6 [ 1 -1] 0 -1.0 StencilSetEntry: 0 7 [ 0 -1] 0 -1.0 StencilSetEntry: 0 8 [ 0 0] 0 8.0 ########################################################### # GraphSetStencil: part var stencil_num GraphSetStencil: 0 0 0 GraphSetStencil: 1 0 0 ########################################################### # MatrixSetValues: \ # part ilower(ndim) iupper(ndim) stride[ndim] var entry value MatrixSetValues: 0 ( 2- 2-) ( 2- 3+) [1 1] 0 0 0.0 MatrixSetValues: 0 ( 2- 2-) ( 2- 3+) [1 1] 0 1 0.0 MatrixSetValues: 0 ( 2- 2-) ( 2- 3+) [1 1] 0 2 0.0 #MatrixSetValues: 0 (13+ 2-) (13+ 3+) [1 1] 0 4 0.0 #MatrixSetValues: 0 (13+ 2-) (13+ 3+) [1 1] 0 5 0.0 #MatrixSetValues: 0 (13+ 2-) (13+ 3+) [1 1] 0 6 0.0 MatrixSetValues: 0 ( 2- 2-) (13+ 2-) [1 1] 0 0 0.0 MatrixSetValues: 0 ( 2- 2-) (13+ 2-) [1 1] 0 6 0.0 MatrixSetValues: 0 ( 2- 2-) (13+ 2-) [1 1] 0 7 0.0 MatrixSetValues: 0 ( 2- 3+) (13+ 3+) [1 1] 0 2 0.0 MatrixSetValues: 0 ( 2- 3+) (13+ 3+) [1 1] 0 3 0.0 MatrixSetValues: 0 ( 2- 3+) (13+ 3+) [1 1] 0 4 0.0 #MatrixSetValues: 1 ( 2- 2-) ( 2- 3+) [1 1] 0 0 0.0 #MatrixSetValues: 1 ( 2- 2-) ( 2- 3+) [1 1] 0 1 0.0 #MatrixSetValues: 1 ( 2- 2-) ( 2- 3+) [1 1] 0 2 0.0 MatrixSetValues: 1 (13+ 2-) (13+ 3+) [1 1] 0 4 0.0 MatrixSetValues: 1 (13+ 2-) (13+ 3+) [1 1] 0 5 0.0 MatrixSetValues: 1 (13+ 2-) (13+ 3+) [1 1] 0 6 0.0 MatrixSetValues: 1 ( 2- 2-) (13+ 2-) [1 1] 0 0 0.0 MatrixSetValues: 1 ( 2- 2-) (13+ 2-) [1 1] 0 6 0.0 MatrixSetValues: 1 ( 2- 2-) (13+ 2-) [1 1] 0 7 0.0 MatrixSetValues: 1 ( 2- 3+) (13+ 3+) [1 1] 0 2 0.0 MatrixSetValues: 1 ( 2- 3+) (13+ 3+) [1 1] 0 3 0.0 MatrixSetValues: 1 ( 2- 3+) (13+ 3+) [1 1] 0 4 0.0 ########################################################### # ProcessPoolCreate: num_pools ProcessPoolCreate: 1 # ProcessPoolSetPart: pool part ProcessPoolSetPart: 0 0 ProcessPoolSetPart: 0 1 ########################################################### hypre-2.33.0/src/test/TEST_sstruct/sstruct.in.miller_2stk000066400000000000000000000047641477326011500233500ustar00rootroot00000000000000# Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) ########################################################### # # --------------- # | | # | part 1 | # | | # | j | # | | | # | ---i | # --------------- # | | # | part 0 | # | | # | j | # | | | # | ---i | # --------------- # ########################################################### # GridCreate: ndim nparts GridCreate: 2 2 # GridSetExtents: part ilower(ndim) iupper(ndim) GridSetExtents: 0 (2- 2-) (3+ 3+) GridSetExtents: 1 (2- 2-) (3+ 3+) # GridSetVariables: part nvars vartypes[nvars] # CELL = 0 GridSetVariables: 0 1 [0] GridSetVariables: 1 1 [0] # GridSetNeighborPart: part ilower(ndim) iupper(ndim) \ # nbor_part nbor_ilower(ndim) nbor_iupper(ndim) \ # index_map[ndim] index_dir[ndim] GridSetNeighborPart: 0 (1+ 4-) (4- 4-) 1 (1+ 2-) (4- 2-) [0 1] [1 1] GridSetNeighborPart: 1 (1+ 1+) (4- 1+) 0 (1+ 3+) (4- 3+) [0 1] [1 1] ########################################################### # StencilCreate: nstencils sizes[nstencils] StencilCreate: 1 [5] # StencilSetEntry: stencil_num entry offset[ndim] var value StencilSetEntry: 0 0 [-1 0] 0 -1.0 StencilSetEntry: 0 1 [ 0 1] 0 -1.0 StencilSetEntry: 0 2 [ 1 0] 0 -1.0 StencilSetEntry: 0 3 [ 0 -1] 0 -1.0 StencilSetEntry: 0 4 [ 0 0] 0 4.0 ########################################################### # GraphSetStencil: part var stencil_num GraphSetStencil: 0 0 0 GraphSetStencil: 1 0 0 ########################################################### # MatrixSetValues: \ # part ilower(ndim) iupper(ndim) stride[ndim] var entry value MatrixSetValues: 0 (2- 2-) (2- 3+) [1 1] 0 0 0.0 MatrixSetValues: 0 (3+ 2-) (3+ 3+) [1 1] 0 2 0.0 MatrixSetValues: 0 (2- 2-) (3+ 2-) [1 1] 0 3 0.0 #MatrixSetValues: 0 (2- 3+) (3+ 3+) [1 1] 0 1 0.0 MatrixSetValues: 1 (2- 2-) (2- 3+) [1 1] 0 0 0.0 MatrixSetValues: 1 (3+ 2-) (3+ 3+) [1 1] 0 2 0.0 #MatrixSetValues: 1 (2- 2-) (3+ 2-) [1 1] 0 3 0.0 MatrixSetValues: 1 (2- 3+) (3+ 3+) [1 1] 0 1 0.0 ########################################################### # ProcessPoolCreate: num_pools ProcessPoolCreate: 1 # ProcessPoolSetPart: pool part ProcessPoolSetPart: 0 0 ProcessPoolSetPart: 0 1 ########################################################### hypre-2.33.0/src/test/TEST_sstruct/sstruct.in.miller_3blk000066400000000000000000000115431477326011500233110ustar00rootroot00000000000000# Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) ########################################################### # # -------------------------------- # | /| # | / | # | / | # | part 1 / | # | / | # | j / | # | | / | # | ---i / | # --------------- part 2 | # | | | # | part 0 | | # | | | # | j | j | # | | | | | # | ---i | ---i | # -------------------------------- # ########################################################### # GridCreate: ndim nparts GridCreate: 2 3 # GridSetExtents: part ilower(ndim) iupper(ndim) GridSetExtents: 0 (2- 2-) (6+ 6+) GridSetExtents: 1 (2- 2-) (6+ 6+) GridSetExtents: 2 (2- 2-) (6+ 6+) # GridSetVariables: part nvars vartypes[nvars] # CELL = 0 GridSetVariables: 0 1 [0] GridSetVariables: 1 1 [0] GridSetVariables: 2 1 [0] # GridSetNeighborPart: part ilower(ndim) iupper(ndim) \ # nbor_part nbor_ilower(ndim) nbor_iupper(ndim) \ # index_map[ndim] index_dir[ndim] GridSetNeighborPart: 0 (1+ 7-) (7- 7-) 1 (1+ 2-) (7- 2-) [0 1] [1 1] GridSetNeighborPart: 0 (7- 1+) (7- 7-) 2 (2- 1+) (2- 7-) [0 1] [1 1] GridSetNeighborPart: 1 (1+ 1+) (7- 1+) 0 (1+ 6+) (7- 6+) [0 1] [1 1] GridSetNeighborPart: 1 (7- 1+) (7- 7-) 2 (1+ 6+) (7- 6+) [1 0] [1 1] GridSetNeighborPart: 2 (1+ 1+) (1+ 7-) 0 (6+ 1+) (6+ 7-) [0 1] [1 1] GridSetNeighborPart: 2 (1+ 7-) (7- 7-) 1 (6+ 1+) (6+ 7-) [1 0] [1 1] ########################################################### # StencilCreate: nstencils sizes[nstencils] StencilCreate: 1 [9] # StencilSetEntry: stencil_num entry offset[ndim] var value StencilSetEntry: 0 0 [-1 -1] 0 -1.0 StencilSetEntry: 0 1 [-1 0] 0 -1.0 StencilSetEntry: 0 2 [-1 1] 0 -1.0 StencilSetEntry: 0 3 [ 0 1] 0 -1.0 StencilSetEntry: 0 4 [ 1 1] 0 -1.0 StencilSetEntry: 0 5 [ 1 0] 0 -1.0 StencilSetEntry: 0 6 [ 1 -1] 0 -1.0 StencilSetEntry: 0 7 [ 0 -1] 0 -1.0 StencilSetEntry: 0 8 [ 0 0] 0 8.0 ########################################################### # GraphSetStencil: part var stencil_num GraphSetStencil: 0 0 0 GraphSetStencil: 1 0 0 GraphSetStencil: 2 0 0 ########################################################### # MatrixSetValues: \ # part ilower(ndim) iupper(ndim) stride[ndim] var entry value MatrixSetValues: 0 (2- 2-) (2- 6+) [1 1] 0 0 0.0 MatrixSetValues: 0 (2- 2-) (2- 6+) [1 1] 0 1 0.0 MatrixSetValues: 0 (2- 2-) (2- 6+) [1 1] 0 2 0.0 #MatrixSetValues: 0 (6+ 2-) (6+ 6+) [1 1] 0 4 0.0 #MatrixSetValues: 0 (6+ 2-) (6+ 6+) [1 1] 0 5 0.0 #MatrixSetValues: 0 (6+ 2-) (6+ 6+) [1 1] 0 6 0.0 MatrixSetValues: 0 (2- 2-) (6+ 2-) [1 1] 0 0 0.0 MatrixSetValues: 0 (2- 2-) (6+ 2-) [1 1] 0 6 0.0 MatrixSetValues: 0 (2- 2-) (6+ 2-) [1 1] 0 7 0.0 #MatrixSetValues: 0 (2- 6+) (6+ 6+) [1 1] 0 2 0.0 #MatrixSetValues: 0 (2- 6+) (6+ 6+) [1 1] 0 3 0.0 #MatrixSetValues: 0 (2- 6+) (6+ 6+) [1 1] 0 4 0.0 MatrixSetValues: 1 (2- 2-) (2- 6+) [1 1] 0 0 0.0 MatrixSetValues: 1 (2- 2-) (2- 6+) [1 1] 0 1 0.0 MatrixSetValues: 1 (2- 2-) (2- 6+) [1 1] 0 2 0.0 #MatrixSetValues: 1 (6+ 2-) (6+ 6+) [1 1] 0 4 0.0 #MatrixSetValues: 1 (6+ 2-) (6+ 6+) [1 1] 0 5 0.0 #MatrixSetValues: 1 (6+ 2-) (6+ 6+) [1 1] 0 6 0.0 #MatrixSetValues: 1 (2- 2-) (6+ 2-) [1 1] 0 0 0.0 #MatrixSetValues: 1 (2- 2-) (6+ 2-) [1 1] 0 6 0.0 #MatrixSetValues: 1 (2- 2-) (6+ 2-) [1 1] 0 7 0.0 MatrixSetValues: 1 (2- 6+) (6+ 6+) [1 1] 0 2 0.0 MatrixSetValues: 1 (2- 6+) (6+ 6+) [1 1] 0 3 0.0 MatrixSetValues: 1 (2- 6+) (6+ 6+) [1 1] 0 4 0.0 #MatrixSetValues: 2 (2- 2-) (2- 6+) [1 1] 0 0 0.0 #MatrixSetValues: 2 (2- 2-) (2- 6+) [1 1] 0 1 0.0 #MatrixSetValues: 2 (2- 2-) (2- 6+) [1 1] 0 2 0.0 MatrixSetValues: 2 (6+ 2-) (6+ 6+) [1 1] 0 4 0.0 MatrixSetValues: 2 (6+ 2-) (6+ 6+) [1 1] 0 5 0.0 MatrixSetValues: 2 (6+ 2-) (6+ 6+) [1 1] 0 6 0.0 MatrixSetValues: 2 (2- 2-) (6+ 2-) [1 1] 0 0 0.0 MatrixSetValues: 2 (2- 2-) (6+ 2-) [1 1] 0 6 0.0 MatrixSetValues: 2 (2- 2-) (6+ 2-) [1 1] 0 7 0.0 #MatrixSetValues: 2 (2- 6+) (6+ 6+) [1 1] 0 2 0.0 #MatrixSetValues: 2 (2- 6+) (6+ 6+) [1 1] 0 3 0.0 #MatrixSetValues: 2 (2- 6+) (6+ 6+) [1 1] 0 4 0.0 ########################################################### # ProcessPoolCreate: num_pools ProcessPoolCreate: 1 # ProcessPoolSetPart: pool part ProcessPoolSetPart: 0 0 ProcessPoolSetPart: 0 1 ProcessPoolSetPart: 0 2 # ProcessPoolCreate: num_pools ProcessPoolCreate: 3 # ProcessPoolSetPart: pool part ProcessPoolSetPart: 0 0 ProcessPoolSetPart: 1 1 ProcessPoolSetPart: 2 2 ########################################################### hypre-2.33.0/src/test/TEST_sstruct/sstruct.in.miller_diag000066400000000000000000000030131477326011500233530ustar00rootroot00000000000000# Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) ########################################################### # GridCreate: ndim nparts GridCreate: 2 1 # GridSetExtents: part ilower(ndim) iupper(ndim) GridSetExtents: 0 (0- 0-) (0+ 0+) # GridSetVariables: part nvars vartypes[nvars] # CELL = 0 GridSetVariables: 0 1 [0] ########################################################### # StencilCreate: nstencils sizes[nstencils] StencilCreate: 1 [5] # StencilSetEntry: stencil_num entry offset[ndim] var value StencilSetEntry: 0 0 [ 0 0] 0 400.0 StencilSetEntry: 0 1 [-1 0] 0 -1.0 StencilSetEntry: 0 2 [ 1 0] 0 -1.0 StencilSetEntry: 0 3 [ 0 -1] 0 -1.0 StencilSetEntry: 0 4 [ 0 1] 0 -1.0 ########################################################### # GraphSetStencil: part var stencil_num GraphSetStencil: 0 0 0 ########################################################### # MatrixSetValues: \ # part ilower(ndim) iupper(ndim) stride[ndim] var entry value MatrixSetValues: 0 (0- 0-) (0- 0+) [1 1] 0 1 0.0 MatrixSetValues: 0 (0+ 0-) (0+ 0+) [1 1] 0 2 0.0 MatrixSetValues: 0 (0- 0-) (0+ 0-) [1 1] 0 3 0.0 MatrixSetValues: 0 (0- 0+) (0+ 0+) [1 1] 0 4 0.0 ########################################################### # ProcessPoolCreate: num_pools ProcessPoolCreate: 1 # ProcessPoolSetPart: pool part ProcessPoolSetPart: 0 0 ########################################################### hypre-2.33.0/src/test/TEST_sstruct/sstruct.in.neumann000066400000000000000000000063251477326011500225550ustar00rootroot00000000000000# Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) ########################################################### # GridCreate: ndim nparts GridCreate: 3 1 # GridSetExtents: part ilower(ndim) iupper(ndim) GridSetExtents: 0 (1- 1- 1-) (2+ 2+ 2+) # GridSetVariables: part nvars vartypes[nvars] # CELL = 0 GridSetVariables: 0 1 [0] ########################################################### # StencilCreate: nstencils sizes[nstencils] StencilCreate: 1 [7] # StencilSetEntry: stencil_num entry offset[ndim] var value StencilSetEntry: 0 0 [ 0 0 0] 0 6.0 StencilSetEntry: 0 1 [-1 0 0] 0 -1.0 StencilSetEntry: 0 2 [ 1 0 0] 0 -1.0 StencilSetEntry: 0 3 [ 0 -1 0] 0 -1.0 StencilSetEntry: 0 4 [ 0 1 0] 0 -1.0 StencilSetEntry: 0 5 [ 0 0 -1] 0 -1.0 StencilSetEntry: 0 6 [ 0 0 1] 0 -1.0 ########################################################### # GraphSetStencil: part var stencil_num GraphSetStencil: 0 0 0 ########################################################### # MatrixSetValues: \ # part ilower(ndim) iupper(ndim) stride[ndim] var entry value MatrixSetValues: 0 (1- 1- 1-) (1- 2+ 2+) [1 1 1] 0 1 0.0 MatrixSetValues: 0 (1- 1- 1-) (1- 2+ 2+) [1 1 1] 0 0 5.0 MatrixSetValues: 0 (2+ 1- 1-) (2+ 2+ 2+) [1 1 1] 0 2 0.0 MatrixSetValues: 0 (2+ 1- 1-) (2+ 2+ 2+) [1 1 1] 0 0 5.0 MatrixSetValues: 0 (1- 1- 1-) (2+ 1- 2+) [1 1 1] 0 3 0.0 MatrixSetValues: 0 (1- 1- 1-) (2+ 1- 2+) [1 1 1] 0 0 5.0 MatrixSetValues: 0 (1- 2+ 1-) (2+ 2+ 2+) [1 1 1] 0 4 0.0 MatrixSetValues: 0 (1- 2+ 1-) (2+ 2+ 2+) [1 1 1] 0 0 5.0 MatrixSetValues: 0 (1- 1- 1-) (2+ 2+ 1-) [1 1 1] 0 5 0.0 MatrixSetValues: 0 (1- 1- 1-) (2+ 2+ 1-) [1 1 1] 0 0 5.0 MatrixSetValues: 0 (1- 1- 2+) (2+ 2+ 2+) [1 1 1] 0 6 0.0 MatrixSetValues: 0 (1- 1- 2+) (2+ 2+ 2+) [1 1 1] 0 0 5.0 MatrixSetValues: 0 (1- 2+ 2+) (2+ 2+ 2+) [1 1 1] 0 0 4.0 MatrixSetValues: 0 (2+ 1- 2+) (2+ 2+ 2+) [1 1 1] 0 0 4.0 MatrixSetValues: 0 (2+ 2+ 1-) (2+ 2+ 2+) [1 1 1] 0 0 4.0 MatrixSetValues: 0 (1- 1- 1-) (1- 1- 2+) [1 1 1] 0 0 4.0 MatrixSetValues: 0 (1- 1- 2+) (1- 2+ 2+) [1 1 1] 0 0 4.0 MatrixSetValues: 0 (1- 1- 2+) (2+ 1- 2+) [1 1 1] 0 0 4.0 MatrixSetValues: 0 (1- 2+ 1-) (1- 2+ 2+) [1 1 1] 0 0 4.0 MatrixSetValues: 0 (1- 1- 1-) (1- 2+ 1-) [1 1 1] 0 0 4.0 MatrixSetValues: 0 (1- 2+ 1-) (2+ 2+ 1-) [1 1 1] 0 0 4.0 MatrixSetValues: 0 (2+ 1- 1-) (2+ 1- 2+) [1 1 1] 0 0 4.0 MatrixSetValues: 0 (1- 1- 1-) (2+ 1- 1-) [1 1 1] 0 0 4.0 MatrixSetValues: 0 (2+ 1- 1-) (2+ 2+ 1-) [1 1 1] 0 0 4.0 MatrixSetValues: 0 (1- 1- 1-) (1- 1- 1-) [1 1 1] 0 0 3.0 MatrixSetValues: 0 (2+ 1- 1-) (2+ 1- 1-) [1 1 1] 0 0 3.0 MatrixSetValues: 0 (1- 2+ 1-) (1- 2+ 1-) [1 1 1] 0 0 3.0 MatrixSetValues: 0 (2+ 2+ 1-) (2+ 2+ 1-) [1 1 1] 0 0 3.0 MatrixSetValues: 0 (1- 1- 2+) (1- 1- 2+) [1 1 1] 0 0 3.0 MatrixSetValues: 0 (2+ 1- 2+) (2+ 1- 2+) [1 1 1] 0 0 3.0 MatrixSetValues: 0 (1- 2+ 2+) (1- 2+ 2+) [1 1 1] 0 0 3.0 MatrixSetValues: 0 (2+ 2+ 2+) (2+ 2+ 2+) [1 1 1] 0 0 3.0 ########################################################### # ProcessPoolCreate: num_pools ProcessPoolCreate: 1 # ProcessPoolSetPart: pool part ProcessPoolSetPart: 0 0 ########################################################### hypre-2.33.0/src/test/TEST_sstruct/sstruct.in.neumann-yz000066400000000000000000000063311477326011500232120ustar00rootroot00000000000000# Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) ########################################################### # GridCreate: ndim nparts GridCreate: 3 1 # GridSetExtents: part ilower(ndim) iupper(ndim) GridSetExtents: 0 (1- 1- 1-) (2+ 2+ 2+) # GridSetVariables: part nvars vartypes[nvars] # CELL = 0 GridSetVariables: 0 1 [0] ########################################################### # StencilCreate: nstencils sizes[nstencils] StencilCreate: 1 [7] # StencilSetEntry: stencil_num entry offset[ndim] var value StencilSetEntry: 0 0 [ 0 0 0] 0 6.0 StencilSetEntry: 0 1 [-1 0 0] 0 -1.0 StencilSetEntry: 0 2 [ 1 0 0] 0 -1.0 StencilSetEntry: 0 3 [ 0 -1 0] 0 -1.0 StencilSetEntry: 0 4 [ 0 1 0] 0 -1.0 StencilSetEntry: 0 5 [ 0 0 -1] 0 -1.0 StencilSetEntry: 0 6 [ 0 0 1] 0 -1.0 ########################################################### # GraphSetStencil: part var stencil_num GraphSetStencil: 0 0 0 ########################################################### # MatrixSetValues: \ # part ilower(ndim) iupper(ndim) stride[ndim] var entry value MatrixSetValues: 0 (1- 1- 1-) (1- 2+ 2+) [1 1 1] 0 1 0.0 # MatrixSetValues: 0 (1- 1- 1-) (1- 2+ 2+) [1 1 1] 0 0 5.0 MatrixSetValues: 0 (2+ 1- 1-) (2+ 2+ 2+) [1 1 1] 0 2 0.0 # MatrixSetValues: 0 (2+ 1- 1-) (2+ 2+ 2+) [1 1 1] 0 0 5.0 MatrixSetValues: 0 (1- 1- 1-) (2+ 1- 2+) [1 1 1] 0 3 0.0 MatrixSetValues: 0 (1- 1- 1-) (2+ 1- 2+) [1 1 1] 0 0 5.0 MatrixSetValues: 0 (1- 2+ 1-) (2+ 2+ 2+) [1 1 1] 0 4 0.0 MatrixSetValues: 0 (1- 2+ 1-) (2+ 2+ 2+) [1 1 1] 0 0 5.0 MatrixSetValues: 0 (1- 1- 1-) (2+ 2+ 1-) [1 1 1] 0 5 0.0 MatrixSetValues: 0 (1- 1- 1-) (2+ 2+ 1-) [1 1 1] 0 0 5.0 MatrixSetValues: 0 (1- 1- 2+) (2+ 2+ 2+) [1 1 1] 0 6 0.0 MatrixSetValues: 0 (1- 1- 2+) (2+ 2+ 2+) [1 1 1] 0 0 5.0 MatrixSetValues: 0 (1- 2+ 2+) (2+ 2+ 2+) [1 1 1] 0 0 4.0 MatrixSetValues: 0 (2+ 1- 2+) (2+ 2+ 2+) [1 1 1] 0 0 5.0 MatrixSetValues: 0 (2+ 2+ 1-) (2+ 2+ 2+) [1 1 1] 0 0 5.0 MatrixSetValues: 0 (1- 1- 1-) (1- 1- 2+) [1 1 1] 0 0 5.0 MatrixSetValues: 0 (1- 1- 2+) (1- 2+ 2+) [1 1 1] 0 0 5.0 MatrixSetValues: 0 (1- 1- 2+) (2+ 1- 2+) [1 1 1] 0 0 4.0 MatrixSetValues: 0 (1- 2+ 1-) (1- 2+ 2+) [1 1 1] 0 0 5.0 MatrixSetValues: 0 (1- 1- 1-) (1- 2+ 1-) [1 1 1] 0 0 5.0 MatrixSetValues: 0 (1- 2+ 1-) (2+ 2+ 1-) [1 1 1] 0 0 4.0 MatrixSetValues: 0 (2+ 1- 1-) (2+ 1- 2+) [1 1 1] 0 0 5.0 MatrixSetValues: 0 (1- 1- 1-) (2+ 1- 1-) [1 1 1] 0 0 4.0 MatrixSetValues: 0 (2+ 1- 1-) (2+ 2+ 1-) [1 1 1] 0 0 5.0 MatrixSetValues: 0 (1- 1- 1-) (1- 1- 1-) [1 1 1] 0 0 4.0 MatrixSetValues: 0 (2+ 1- 1-) (2+ 1- 1-) [1 1 1] 0 0 4.0 MatrixSetValues: 0 (1- 2+ 1-) (1- 2+ 1-) [1 1 1] 0 0 4.0 MatrixSetValues: 0 (2+ 2+ 1-) (2+ 2+ 1-) [1 1 1] 0 0 4.0 MatrixSetValues: 0 (1- 1- 2+) (1- 1- 2+) [1 1 1] 0 0 4.0 MatrixSetValues: 0 (2+ 1- 2+) (2+ 1- 2+) [1 1 1] 0 0 4.0 MatrixSetValues: 0 (1- 2+ 2+) (1- 2+ 2+) [1 1 1] 0 0 4.0 MatrixSetValues: 0 (2+ 2+ 2+) (2+ 2+ 2+) [1 1 1] 0 0 4.0 ########################################################### # ProcessPoolCreate: num_pools ProcessPoolCreate: 1 # ProcessPoolSetPart: pool part ProcessPoolSetPart: 0 0 ########################################################### hypre-2.33.0/src/test/TEST_sstruct/sstruct.in.noaddtoval_cellcentre000066400000000000000000000024261477326011500254450ustar00rootroot00000000000000# Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) ########################################################### # GridCreate: ndim nparts GridCreate: 3 1 # GridSetExtents: part ilower(ndim) iupper(ndim) GridSetExtents: 0 (1- 1- 1-) (4+ 4+ 4+) # GridSetVariables: part nvars vartypes[nvars] # CELL = 0 GridSetVariables: 0 1 [0] ########################################################### # StencilCreate: nstencils sizes[nstencils] StencilCreate: 1 [7] # StencilSetEntry: stencil_num entry offset[ndim] var value StencilSetEntry: 0 0 [ 0 0 0] 0 6.0 StencilSetEntry: 0 1 [-1 0 0] 0 -1.0 StencilSetEntry: 0 2 [ 1 0 0] 0 -1.0 StencilSetEntry: 0 3 [ 0 1 0] 0 -1.0 StencilSetEntry: 0 4 [ 0 -1 0] 0 -1.0 StencilSetEntry: 0 5 [ 0 0 1] 0 -1.0 StencilSetEntry: 0 6 [ 0 0 -1] 0 -1.0 ########################################################### # GraphSetStencil: part var stencil_num GraphSetStencil: 0 0 0 ########################################################### # ProcessPoolCreate: num_pools ProcessPoolCreate: 1 # ProcessPoolSetPart: pool part ProcessPoolSetPart: 0 0 ########################################################### hypre-2.33.0/src/test/TEST_sstruct/sstruct.in.noaddtoval_edges000066400000000000000000000133451477326011500244160ustar00rootroot00000000000000# Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) ########################################################### # GridCreate: ndim nparts GridCreate: 3 1 # GridSetExtents: part ilower(ndim) iupper(ndim) GridSetExtents: 0 (1- 1- 1-) (4+ 4+ 4+) # GridSetVariables: part nvars vartypes[nvars] # XEDGE = 5 # YEDGE = 6 # ZEDGE = 7 GridSetVariables: 0 3 [5 6 7] ########################################################### # StencilCreate: nstencils sizes[nstencils] StencilCreate: 3 [33 33 33] # StencilSetEntry: stencil_num entry offset[ndim] var value StencilSetEntry: 0 0 [ 0 0 0] 0 10.77777778 StencilSetEntry: 0 1 [ 0 1 0] 0 -1.305555556 StencilSetEntry: 0 2 [ 0 1 1] 0 -1.326388889 StencilSetEntry: 0 3 [ 0 0 1] 0 -1.305555556 StencilSetEntry: 0 4 [ 0 -1 0] 0 -1.305555556 StencilSetEntry: 0 5 [ 0 -1 1] 0 -1.326388889 StencilSetEntry: 0 6 [ 0 0 -1] 0 -1.305555556 StencilSetEntry: 0 7 [ 0 1 -1] 0 -1.326388889 StencilSetEntry: 0 8 [ 0 -1 -1] 0 -1.326388889 StencilSetEntry: 0 9 [ 0 0 0] 1 -2.666666667 StencilSetEntry: 0 10 [-1 0 0] 1 2.666666667 StencilSetEntry: 0 11 [ 0 0 -1] 1 -0.666666667 StencilSetEntry: 0 12 [-1 0 -1] 1 0.666666667 StencilSetEntry: 0 13 [ 0 0 1] 1 -0.666666667 StencilSetEntry: 0 14 [-1 0 1] 1 0.666666667 StencilSetEntry: 0 15 [ 0 1 0] 1 2.666666667 StencilSetEntry: 0 16 [-1 1 0] 1 -2.666666667 StencilSetEntry: 0 17 [ 0 1 1] 1 0.666666667 StencilSetEntry: 0 18 [-1 1 1] 1 -0.666666667 StencilSetEntry: 0 19 [ 0 1 -1] 1 0.666666667 StencilSetEntry: 0 20 [-1 1 -1] 1 -0.666666667 StencilSetEntry: 0 21 [ 0 0 0] 2 -2.666666667 StencilSetEntry: 0 22 [-1 0 0] 2 2.666666667 StencilSetEntry: 0 23 [-1 -1 0] 2 0.666666667 StencilSetEntry: 0 24 [ 0 -1 0] 2 -0.666666667 StencilSetEntry: 0 25 [ 0 0 1] 2 2.666666667 StencilSetEntry: 0 26 [-1 0 1] 2 -2.666666667 StencilSetEntry: 0 27 [-1 -1 1] 2 -0.666666667 StencilSetEntry: 0 28 [ 0 -1 1] 2 0.666666667 StencilSetEntry: 0 29 [ 0 1 0] 2 -0.666666667 StencilSetEntry: 0 30 [-1 1 0] 2 0.666666667 StencilSetEntry: 0 31 [-1 1 1] 2 -0.666666667 StencilSetEntry: 0 32 [ 0 1 1] 2 0.666666667 StencilSetEntry: 1 0 [ 0 0 0] 1 10.77777778 StencilSetEntry: 1 1 [-1 0 0] 1 -1.305555556 StencilSetEntry: 1 2 [ 0 0 -1] 1 -1.305555556 StencilSetEntry: 1 3 [-1 0 -1] 1 -1.326388889 StencilSetEntry: 1 4 [ 1 0 0] 1 -1.305555556 StencilSetEntry: 1 5 [ 1 0 -1] 1 -1.326388889 StencilSetEntry: 1 6 [ 0 0 1] 1 -1.305555556 StencilSetEntry: 1 7 [-1 0 1] 1 -1.326388889 StencilSetEntry: 1 8 [ 1 0 1] 1 -1.326388889 StencilSetEntry: 1 9 [ 0 0 0] 0 -2.666666667 StencilSetEntry: 1 10 [ 0 -1 0] 0 2.666666667 StencilSetEntry: 1 11 [ 0 -1 -1] 0 0.666666667 StencilSetEntry: 1 12 [ 0 0 -1] 0 -0.666666667 StencilSetEntry: 1 13 [ 1 0 0] 0 2.666666667 StencilSetEntry: 1 14 [ 1 -1 0] 0 -2.666666667 StencilSetEntry: 1 15 [ 1 0 -1] 0 0.666666667 StencilSetEntry: 1 16 [ 1 -1 -1] 0 -0.666666667 StencilSetEntry: 1 17 [ 0 -1 1] 0 0.666666667 StencilSetEntry: 1 18 [ 0 0 1] 0 -0.666666667 StencilSetEntry: 1 19 [ 1 -1 1] 0 -0.666666667 StencilSetEntry: 1 20 [ 1 0 1] 0 0.666666667 StencilSetEntry: 1 21 [ 0 0 0] 2 -2.666666667 StencilSetEntry: 1 22 [ 0 -1 0] 2 2.666666667 StencilSetEntry: 1 23 [-1 0 0] 2 -0.666666667 StencilSetEntry: 1 24 [-1 -1 0] 2 0.666666667 StencilSetEntry: 1 25 [ 1 -1 0] 2 0.666666667 StencilSetEntry: 1 26 [ 1 0 0] 2 -0.666666667 StencilSetEntry: 1 27 [ 0 0 1] 2 2.666666667 StencilSetEntry: 1 28 [ 0 -1 1] 2 -2.666666667 StencilSetEntry: 1 29 [-1 -1 1] 2 -0.666666667 StencilSetEntry: 1 30 [-1 0 1] 2 0.666666667 StencilSetEntry: 1 31 [ 1 -1 1] 2 -0.666666667 StencilSetEntry: 1 32 [ 1 0 1] 2 0.666666667 StencilSetEntry: 2 0 [ 0 0 0] 2 10.77777778 StencilSetEntry: 2 1 [-1 0 0] 2 -1.305555556 StencilSetEntry: 2 2 [ 0 -1 0] 2 -1.305555556 StencilSetEntry: 2 3 [-1 -1 0] 2 -1.326388889 StencilSetEntry: 2 4 [ 1 0 0] 2 -1.305555556 StencilSetEntry: 2 5 [ 1 -1 0] 2 -1.326388889 StencilSetEntry: 2 6 [ 0 1 0] 2 -1.305555556 StencilSetEntry: 2 7 [-1 1 0] 2 -1.326388889 StencilSetEntry: 2 8 [ 1 1 0] 2 -1.326388889 StencilSetEntry: 2 9 [ 0 0 0] 0 -2.666666667 StencilSetEntry: 2 10 [ 0 0 -1] 0 2.666666667 StencilSetEntry: 2 11 [ 0 -1 0] 0 -0.666666667 StencilSetEntry: 2 12 [ 0 -1 -1] 0 0.666666667 StencilSetEntry: 2 13 [ 1 0 0] 0 2.666666667 StencilSetEntry: 2 14 [ 1 0 -1] 0 -2.666666667 StencilSetEntry: 2 15 [ 1 -1 -1] 0 -0.666666667 StencilSetEntry: 2 16 [ 1 -1 0] 0 0.666666667 StencilSetEntry: 2 17 [ 0 1 0] 0 -0.666666667 StencilSetEntry: 2 18 [ 0 1 -1] 0 0.666666667 StencilSetEntry: 2 19 [ 1 1 0] 0 0.666666667 StencilSetEntry: 2 20 [ 1 1 -1] 0 -0.666666667 StencilSetEntry: 2 21 [ 0 0 0] 1 -2.666666667 StencilSetEntry: 2 22 [ 0 0 -1] 1 2.666666667 StencilSetEntry: 2 23 [-1 0 0] 1 -0.666666667 StencilSetEntry: 2 24 [-1 0 -1] 1 0.666666667 StencilSetEntry: 2 25 [ 1 0 0] 1 -0.666666667 StencilSetEntry: 2 26 [ 1 0 -1] 1 0.666666667 StencilSetEntry: 2 27 [ 0 1 0] 1 2.666666667 StencilSetEntry: 2 28 [ 0 1 -1] 1 -2.666666667 StencilSetEntry: 2 29 [-1 1 0] 1 0.666666667 StencilSetEntry: 2 30 [-1 1 -1] 1 -0.666666667 StencilSetEntry: 2 31 [ 1 1 0] 1 0.666666667 StencilSetEntry: 2 32 [ 1 1 -1] 1 -0.666666667 ########################################################### # GraphSetStencil: part var stencil_num GraphSetStencil: 0 0 0 GraphSetStencil: 0 1 1 GraphSetStencil: 0 2 2 ########################################################### # ProcessPoolCreate: num_pools ProcessPoolCreate: 1 # ProcessPoolSetPart: pool part ProcessPoolSetPart: 0 0 ########################################################### hypre-2.33.0/src/test/TEST_sstruct/sstruct.in.p19aniso000066400000000000000000000057531477326011500225630ustar00rootroot00000000000000# Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) ########################################################### # GridCreate: ndim nparts GridCreate: 3 1 # GridSetExtents: part ilower(ndim) iupper(ndim) GridSetExtents: 0 (1- 1- 1-) (8+ 4+ 4+) # GridSetVariables: part nvars vartypes[nvars] # CELL = 0 GridSetVariables: 0 1 [0] # GridSetPeriodic: part periodic[ndim] GridSetPeriodic: 0 [0 0 4] ########################################################### # StencilCreate: nstencils sizes[nstencils] StencilCreate: 1 [19] # StencilSetEntry: stencil_num entry offset[ndim] var value StencilSetEntry: 0 0 [ 1 1 0 ] 0 0.0 StencilSetEntry: 0 1 [ 1 0 0 ] 0 -100.0 StencilSetEntry: 0 2 [ 1 -1 0 ] 0 0.0 StencilSetEntry: 0 3 [ 0 -1 0 ] 0 -10000.0 StencilSetEntry: 0 4 [ -1 -1 0 ] 0 0.0 StencilSetEntry: 0 5 [ -1 0 0 ] 0 -100.0 StencilSetEntry: 0 6 [ -1 1 0 ] 0 0.0 StencilSetEntry: 0 7 [ 0 1 0 ] 0 -10000.0 StencilSetEntry: 0 8 [ 0 0 0 ] 0 20208.0 StencilSetEntry: 0 9 [ 1 0 -1 ] 0 0.0 StencilSetEntry: 0 10 [ 0 -1 -1 ] 0 0.0 StencilSetEntry: 0 11 [ -1 0 -1 ] 0 0.0 StencilSetEntry: 0 12 [ 0 1 -1 ] 0 0.0 StencilSetEntry: 0 13 [ 0 0 -1 ] 0 -4.0 StencilSetEntry: 0 14 [ 1 0 1 ] 0 0.0 StencilSetEntry: 0 15 [ 0 -1 1 ] 0 0.0 StencilSetEntry: 0 16 [ -1 0 1 ] 0 0.0 StencilSetEntry: 0 17 [ 0 1 1 ] 0 0.0 StencilSetEntry: 0 18 [ 0 0 1 ] 0 -4.0 ########################################################### # GraphSetStencil: part var stencil_num GraphSetStencil: 0 0 0 ########################################################### # Neumann in both x and y # MatrixSetValues: \ # part ilower(ndim) iupper(ndim) stride[ndim] var entry value # west MatrixSetValues: 0 (1- 1- 1-) (1- 4+ 4+) [1 1 1] 0 5 0.0 MatrixSetValues: 0 (1- 1- 1-) (1- 4+ 4+) [1 1 1] 0 8 20108.0 # east MatrixSetValues: 0 (8+ 1- 1-) (8+ 4+ 4+) [1 1 1] 0 1 0.0 MatrixSetValues: 0 (8+ 1- 1-) (8+ 4+ 4+) [1 1 1] 0 8 20108.0 # south MatrixSetValues: 0 (1- 1- 1-) (8+ 1- 4+) [1 1 1] 0 3 0.0 MatrixSetValues: 0 (1- 1- 1-) (8+ 1- 4+) [1 1 1] 0 8 10208.0 # north MatrixSetValues: 0 (1- 4+ 1-) (8+ 4+ 4+) [1 1 1] 0 7 0.0 MatrixSetValues: 0 (1- 4+ 1-) (8+ 4+ 4+) [1 1 1] 0 8 10208.0 # lower #MatrixSetValues: 0 (1- 1- 1-) (8+ 4+ 1-) [1 1 1] 0 13 0.0 # upper #MatrixSetValues: 0 (1- 1- 4+) (8+ 4+ 4+) [1 1 1] 0 18 0.0 MatrixSetValues: 0 (1- 1- 1-) (1- 1- 4+) [1 1 1] 0 8 10108.0 MatrixSetValues: 0 (8+ 1- 1-) (8+ 1- 4+) [1 1 1] 0 8 10108.0 MatrixSetValues: 0 (1- 4+ 1-) (1- 4+ 4+) [1 1 1] 0 8 10108.0 MatrixSetValues: 0 (8+ 4+ 1-) (8+ 4+ 4+) [1 1 1] 0 8 10108.0 ########################################################### # ProcessPoolCreate: num_pools ProcessPoolCreate: 1 # ProcessPoolSetPart: pool part ProcessPoolSetPart: 0 0 ########################################################### hypre-2.33.0/src/test/TEST_sstruct/sstruct.in.p19iso000066400000000000000000000055771477326011500222500ustar00rootroot00000000000000# Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) ########################################################### # GridCreate: ndim nparts GridCreate: 3 1 # GridSetExtents: part ilower(ndim) iupper(ndim) GridSetExtents: 0 (1- 1- 1-) (8+ 4+ 4+) # GridSetVariables: part nvars vartypes[nvars] # CELL = 0 GridSetVariables: 0 1 [0] # GridSetPeriodic: part periodic[ndim] GridSetPeriodic: 0 [0 0 4] ########################################################### # StencilCreate: nstencils sizes[nstencils] StencilCreate: 1 [19] # StencilSetEntry: stencil_num entry offset[ndim] var value StencilSetEntry: 0 0 [ 1 1 0 ] 0 0.0 StencilSetEntry: 0 1 [ 1 0 0 ] 0 -1.0 StencilSetEntry: 0 2 [ 1 -1 0 ] 0 0.0 StencilSetEntry: 0 3 [ 0 -1 0 ] 0 -1.0 StencilSetEntry: 0 4 [ -1 -1 0 ] 0 0.0 StencilSetEntry: 0 5 [ -1 0 0 ] 0 -1.0 StencilSetEntry: 0 6 [ -1 1 0 ] 0 0.0 StencilSetEntry: 0 7 [ 0 1 0 ] 0 -1.0 StencilSetEntry: 0 8 [ 0 0 0 ] 0 6.0 StencilSetEntry: 0 9 [ 1 0 -1 ] 0 0.0 StencilSetEntry: 0 10 [ 0 -1 -1 ] 0 0.0 StencilSetEntry: 0 11 [ -1 0 -1 ] 0 0.0 StencilSetEntry: 0 12 [ 0 1 -1 ] 0 0.0 StencilSetEntry: 0 13 [ 0 0 -1 ] 0 -1.0 StencilSetEntry: 0 14 [ 1 0 1 ] 0 0.0 StencilSetEntry: 0 15 [ 0 -1 1 ] 0 0.0 StencilSetEntry: 0 16 [ -1 0 1 ] 0 0.0 StencilSetEntry: 0 17 [ 0 1 1 ] 0 0.0 StencilSetEntry: 0 18 [ 0 0 1 ] 0 -1.0 ########################################################### # GraphSetStencil: part var stencil_num GraphSetStencil: 0 0 0 ########################################################### # Neumann in both x and y # MatrixSetValues: \ # part ilower(ndim) iupper(ndim) stride[ndim] var entry value # west MatrixSetValues: 0 (1- 1- 1-) (1- 4+ 4+) [1 1 1] 0 5 0.0 MatrixSetValues: 0 (1- 1- 1-) (1- 4+ 4+) [1 1 1] 0 8 5.0 # east MatrixSetValues: 0 (8+ 1- 1-) (8+ 4+ 4+) [1 1 1] 0 1 0.0 MatrixSetValues: 0 (8+ 1- 1-) (8+ 4+ 4+) [1 1 1] 0 8 5.0 # south MatrixSetValues: 0 (1- 1- 1-) (8+ 1- 4+) [1 1 1] 0 3 0.0 MatrixSetValues: 0 (1- 1- 1-) (8+ 1- 4+) [1 1 1] 0 8 5.0 # north MatrixSetValues: 0 (1- 4+ 1-) (8+ 4+ 4+) [1 1 1] 0 7 0.0 MatrixSetValues: 0 (1- 4+ 1-) (8+ 4+ 4+) [1 1 1] 0 8 5.0 # lower #MatrixSetValues: 0 (1- 1- 1-) (8+ 4+ 1-) [1 1 1] 0 13 0.0 # upper #MatrixSetValues: 0 (1- 1- 4+) (8+ 4+ 4+) [1 1 1] 0 18 0.0 MatrixSetValues: 0 (1- 1- 1-) (1- 1- 4+) [1 1 1] 0 8 4.0 MatrixSetValues: 0 (8+ 1- 1-) (8+ 1- 4+) [1 1 1] 0 8 4.0 MatrixSetValues: 0 (1- 4+ 1-) (1- 4+ 4+) [1 1 1] 0 8 4.0 MatrixSetValues: 0 (8+ 4+ 1-) (8+ 4+ 4+) [1 1 1] 0 8 4.0 ########################################################### # ProcessPoolCreate: num_pools ProcessPoolCreate: 1 # ProcessPoolSetPart: pool part ProcessPoolSetPart: 0 0 ########################################################### hypre-2.33.0/src/test/TEST_sstruct/sstruct.in.p7aniso000066400000000000000000000045741477326011500225000ustar00rootroot00000000000000# Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) ########################################################### # GridCreate: ndim nparts GridCreate: 3 1 # GridSetExtents: part ilower(ndim) iupper(ndim) GridSetExtents: 0 (1- 1- 1-) (8+ 4+ 4+) # GridSetVariables: part nvars vartypes[nvars] # CELL = 0 GridSetVariables: 0 1 [0] # GridSetPeriodic: part periodic[ndim] GridSetPeriodic: 0 [0 0 4] ########################################################### # StencilCreate: nstencils sizes[nstencils] StencilCreate: 1 [7] # StencilSetEntry: stencil_num entry offset[ndim] var value StencilSetEntry: 0 0 [ 0 0 0] 0 20208.0 StencilSetEntry: 0 1 [-1 0 0] 0 -100.0 StencilSetEntry: 0 2 [ 1 0 0] 0 -100.0 StencilSetEntry: 0 3 [ 0 -1 0] 0 -10000.0 StencilSetEntry: 0 4 [ 0 1 0] 0 -10000.0 StencilSetEntry: 0 5 [ 0 0 -1] 0 -4.0 StencilSetEntry: 0 6 [ 0 0 1] 0 -4.0 ########################################################### # GraphSetStencil: part var stencil_num GraphSetStencil: 0 0 0 ########################################################### # MatrixSetValues: \ # part ilower(ndim) iupper(ndim) stride[ndim] var entry value # west MatrixSetValues: 0 (1- 1- 1-) (1- 4+ 4+) [1 1 1] 0 1 0.0 MatrixSetValues: 0 (1- 1- 1-) (1- 4+ 4+) [1 1 1] 0 0 20108.0 # east MatrixSetValues: 0 (8+ 1- 1-) (8+ 4+ 4+) [1 1 1] 0 2 0.0 MatrixSetValues: 0 (8+ 1- 1-) (8+ 4+ 4+) [1 1 1] 0 0 20108.0 # south MatrixSetValues: 0 (1- 1- 1-) (8+ 1- 4+) [1 1 1] 0 3 0.0 MatrixSetValues: 0 (1- 1- 1-) (8+ 1- 4+) [1 1 1] 0 0 10208.0 # north MatrixSetValues: 0 (1- 4+ 1-) (8+ 4+ 4+) [1 1 1] 0 4 0.0 MatrixSetValues: 0 (1- 4+ 1-) (8+ 4+ 4+) [1 1 1] 0 0 10208.0 # lower #MatrixSetValues: 0 (1- 1- 1-) (8+ 4+ 1-) [1 1 1] 0 5 0.0 # upper #MatrixSetValues: 0 (1- 1- 4+) (8+ 4+ 4+) [1 1 1] 0 6 0.0 MatrixSetValues: 0 (1- 1- 1-) (1- 1- 4+) [1 1 1] 0 0 10108.0 MatrixSetValues: 0 (8+ 1- 1-) (8+ 1- 4+) [1 1 1] 0 0 10108.0 MatrixSetValues: 0 (1- 4+ 1-) (1- 4+ 4+) [1 1 1] 0 0 10108.0 MatrixSetValues: 0 (8+ 4+ 1-) (8+ 4+ 4+) [1 1 1] 0 0 10108.0 ########################################################### # ProcessPoolCreate: num_pools ProcessPoolCreate: 1 # ProcessPoolSetPart: pool part ProcessPoolSetPart: 0 0 ########################################################### hypre-2.33.0/src/test/TEST_sstruct/sstruct.in.p7iso000066400000000000000000000045001477326011500221460ustar00rootroot00000000000000# Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) ########################################################### # GridCreate: ndim nparts GridCreate: 3 1 # GridSetExtents: part ilower(ndim) iupper(ndim) GridSetExtents: 0 (1- 1- 1-) (8+ 4+ 4+) # GridSetVariables: part nvars vartypes[nvars] # CELL = 0 GridSetVariables: 0 1 [0] # GridSetPeriodic: part periodic[ndim] GridSetPeriodic: 0 [0 0 4] ########################################################### # StencilCreate: nstencils sizes[nstencils] StencilCreate: 1 [7] # StencilSetEntry: stencil_num entry offset[ndim] var value StencilSetEntry: 0 0 [ 0 0 0] 0 6.0 StencilSetEntry: 0 1 [-1 0 0] 0 -1.0 StencilSetEntry: 0 2 [ 1 0 0] 0 -1.0 StencilSetEntry: 0 3 [ 0 -1 0] 0 -1.0 StencilSetEntry: 0 4 [ 0 1 0] 0 -1.0 StencilSetEntry: 0 5 [ 0 0 -1] 0 -1.0 StencilSetEntry: 0 6 [ 0 0 1] 0 -1.0 ########################################################### # GraphSetStencil: part var stencil_num GraphSetStencil: 0 0 0 ########################################################### # MatrixSetValues: \ # part ilower(ndim) iupper(ndim) stride[ndim] var entry value # west MatrixSetValues: 0 (1- 1- 1-) (1- 4+ 4+) [1 1 1] 0 1 0.0 MatrixSetValues: 0 (1- 1- 1-) (1- 4+ 4+) [1 1 1] 0 0 5.0 # east MatrixSetValues: 0 (8+ 1- 1-) (8+ 4+ 4+) [1 1 1] 0 2 0.0 MatrixSetValues: 0 (8+ 1- 1-) (8+ 4+ 4+) [1 1 1] 0 0 5.0 # south MatrixSetValues: 0 (1- 1- 1-) (8+ 1- 4+) [1 1 1] 0 3 0.0 MatrixSetValues: 0 (1- 1- 1-) (8+ 1- 4+) [1 1 1] 0 0 5.0 # north MatrixSetValues: 0 (1- 4+ 1-) (8+ 4+ 4+) [1 1 1] 0 4 0.0 MatrixSetValues: 0 (1- 4+ 1-) (8+ 4+ 4+) [1 1 1] 0 0 5.0 # lower #MatrixSetValues: 0 (1- 1- 1-) (8+ 4+ 1-) [1 1 1] 0 5 0.0 # upper #MatrixSetValues: 0 (1- 1- 4+) (8+ 4+ 4+) [1 1 1] 0 6 0.0 MatrixSetValues: 0 (1- 1- 1-) (1- 1- 4+) [1 1 1] 0 0 4.0 MatrixSetValues: 0 (8+ 1- 1-) (8+ 1- 4+) [1 1 1] 0 0 4.0 MatrixSetValues: 0 (1- 4+ 1-) (1- 4+ 4+) [1 1 1] 0 0 4.0 MatrixSetValues: 0 (8+ 4+ 1-) (8+ 4+ 4+) [1 1 1] 0 0 4.0 ########################################################### # ProcessPoolCreate: num_pools ProcessPoolCreate: 1 # ProcessPoolSetPart: pool part ProcessPoolSetPart: 0 0 ########################################################### hypre-2.33.0/src/test/TEST_sstruct/sstruct.in.pcube000066400000000000000000000035411477326011500222070ustar00rootroot00000000000000# Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) ########################################################### # GridCreate: ndim nparts GridCreate: 3 2 # GridSetExtents: part ilower(ndim) iupper(ndim) GridSetExtents: 0 (1- 1- 1-) (2+ 2+ 1+) GridSetExtents: 1 (1- 1- 1-) (2+ 2+ 1+) # GridSetVariables: part nvars vartypes[nvars] # CELL = 0 GridSetVariables: 0 1 [0] GridSetVariables: 1 1 [0] # GridSetNeighborPart: part ilower(ndim) iupper(ndim) \ # nbor_part nbor_ilower(ndim) nbor_iupper(ndim) \ # index_map[ndim] index_dir[ndim] GridSetNeighborPart: 0 (0- 0- 2-) (3+ 3+ 2-) 1 (0- 0- 1-) (3+ 3+ 1-) [0 1 2] [1 1 1] GridSetNeighborPart: 1 (0- 0- 0+) (3+ 3+ 0+) 0 (0- 0- 1+) (3+ 3+ 1+) [0 1 2] [1 1 1] # extra call for testing GridSetNeighborPart: 0 (2- 2- 2-) (3+ 3+ 2-) 1 (2- 2- 1-) (3+ 3+ 1-) [0 1 2] [1 1 1] ########################################################### # StencilCreate: nstencils sizes[nstencils] StencilCreate: 1 [7] # StencilSetEntry: stencil_num entry offset[ndim] var value StencilSetEntry: 0 0 [ 0 0 0] 0 6.0 StencilSetEntry: 0 1 [-1 0 0] 0 -1.0 StencilSetEntry: 0 2 [ 1 0 0] 0 -1.0 StencilSetEntry: 0 3 [ 0 -1 0] 0 -1.0 StencilSetEntry: 0 4 [ 0 1 0] 0 -1.0 StencilSetEntry: 0 5 [ 0 0 -1] 0 -1.0 StencilSetEntry: 0 6 [ 0 0 1] 0 -1.0 ########################################################### # GraphSetStencil: part var stencil_num GraphSetStencil: 0 0 0 GraphSetStencil: 1 0 0 ########################################################### # ProcessPoolCreate: num_pools ProcessPoolCreate: 2 # ProcessPoolSetPart: pool part ProcessPoolSetPart: 0 0 ProcessPoolSetPart: 1 1 ########################################################### hypre-2.33.0/src/test/TEST_sstruct/sstruct.in.periodic000066400000000000000000000042761477326011500227150ustar00rootroot00000000000000# Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) ########################################################### # GridCreate: ndim nparts GridCreate: 3 1 # GridSetExtents: part ilower(ndim) iupper(ndim) GridSetExtents: 0 (1- 1- 1-) (2+ 2+ 2+) # GridSetVariables: part nvars vartypes[nvars] # CELL = 0 GridSetVariables: 0 1 [0] # GridSetNeighborPart: part ilower(ndim) iupper(ndim) \ # nbor_part nbor_ilower(ndim) nbor_iupper(ndim) \ # index_map[ndim] index_dir[ndim] GridSetNeighborPart: 0 (1- 1- 3-) (2+ 2+ 3-) 0 (1- 1- 1-) (2+ 2+ 1-) [0 1 2] [1 1 1] GridSetNeighborPart: 0 (1- 1- 0+) (2+ 2+ 0+) 0 (1- 1- 2+) (2+ 2+ 2+) [0 1 2] [1 1 1] ########################################################### # StencilCreate: nstencils sizes[nstencils] StencilCreate: 1 [7] # StencilSetEntry: stencil_num entry offset[ndim] var value StencilSetEntry: 0 0 [ 0 0 0] 0 6.0 StencilSetEntry: 0 1 [-1 0 0] 0 -1.0 StencilSetEntry: 0 2 [ 1 0 0] 0 -1.0 StencilSetEntry: 0 3 [ 0 -1 0] 0 -1.0 StencilSetEntry: 0 4 [ 0 1 0] 0 -1.0 StencilSetEntry: 0 5 [ 0 0 -1] 0 -1.0 StencilSetEntry: 0 6 [ 0 0 1] 0 -1.0 ########################################################### # GraphSetStencil: part var stencil_num GraphSetStencil: 0 0 0 ########################################################### # MatrixSetSymmetric: part var to_var symmetric MatrixSetSymmetric: -1 -1 -1 1 # MatrixSetValues: \ # part ilower(ndim) iupper(ndim) stride[ndim] var entry value MatrixSetValues: 0 (1- 1- 1-) (1- 2+ 2+) [1 1 1] 0 1 0.0 MatrixSetValues: 0 (2+ 1- 1-) (2+ 2+ 2+) [1 1 1] 0 2 0.0 MatrixSetValues: 0 (1- 1- 1-) (2+ 1- 2+) [1 1 1] 0 3 0.0 MatrixSetValues: 0 (1- 2+ 1-) (2+ 2+ 2+) [1 1 1] 0 4 0.0 #MatrixSetValues: 0 (1- 1- 1-) (2+ 2+ 1-) [1 1 1] 0 5 0.0 #MatrixSetValues: 0 (1- 1- 2+) (2+ 2+ 2+) [1 1 1] 0 6 0.0 ########################################################### # ProcessPoolCreate: num_pools ProcessPoolCreate: 1 # ProcessPoolSetPart: pool part ProcessPoolSetPart: 0 0 ########################################################### hypre-2.33.0/src/test/TEST_sstruct/sstruct.in.periodic.2D000066400000000000000000000036471477326011500231620ustar00rootroot00000000000000# Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) ########################################################### # GridCreate: ndim nparts GridCreate: 2 1 # GridSetExtents: part ilower(ndim) iupper(ndim) GridSetExtents: 0 (1- 1-) (2+ 2+) # GridSetVariables: part nvars vartypes[nvars] # CELL = 0 GridSetVariables: 0 1 [0] # GridSetNeighborPart: part ilower(ndim) iupper(ndim) \ # nbor_part nbor_ilower(ndim) nbor_iupper(ndim) \ # index_map[ndim] index_dir[ndim] GridSetNeighborPart: 0 (1- 3-) (2+ 3-) 0 (1- 1-) (2+ 1-) [0 1] [1 1] GridSetNeighborPart: 0 (1- 0+) (2+ 0+) 0 (1- 2+) (2+ 2+) [0 1] [1 1] ########################################################### # StencilCreate: nstencils sizes[nstencils] StencilCreate: 1 [5] # StencilSetEntry: stencil_num entry offset[ndim] var value StencilSetEntry: 0 0 [ 0 0] 0 4.0 StencilSetEntry: 0 1 [-1 0] 0 -1.0 StencilSetEntry: 0 2 [ 1 0] 0 -1.0 StencilSetEntry: 0 3 [ 0 -1] 0 -1.0 StencilSetEntry: 0 4 [ 0 1] 0 -1.0 ########################################################### # GraphSetStencil: part var stencil_num GraphSetStencil: 0 0 0 ########################################################### # MatrixSetSymmetric: part var to_var symmetric MatrixSetSymmetric: -1 -1 -1 1 # MatrixSetValues: \ # part ilower(ndim) iupper(ndim) stride[ndim] var entry value MatrixSetValues: 0 (1- 1-) (1- 2+) [1 1] 0 1 0.0 MatrixSetValues: 0 (2+ 1-) (2+ 2+) [1 1] 0 2 0.0 #MatrixSetValues: 0 (1- 1-) (2+ 1-) [1 1] 0 3 0.0 #MatrixSetValues: 0 (1- 2+) (2+ 2+) [1 1] 0 4 0.0 ########################################################### # ProcessPoolCreate: num_pools ProcessPoolCreate: 1 # ProcessPoolSetPart: pool part ProcessPoolSetPart: 0 0 ########################################################### hypre-2.33.0/src/test/TEST_sstruct/sstruct.in.periodic.add000066400000000000000000000032321477326011500234330ustar00rootroot00000000000000# Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) ########################################################### # GridCreate: ndim nparts GridCreate: 3 1 # GridSetExtents: part ilower(ndim) iupper(ndim) GridSetExtents: 0 (0- 0- 0-) (15+ 15+ 15+) # GridSetVariables: part nvars vartypes[nvars] # ZFACE = 4 GridSetVariables: 0 1 [4] # GridSetPeriodic: part periodic[ndim] GridSetPeriodic: 0 [0 0 16] ########################################################### # StencilCreate: nstencils sizes[nstencils] StencilCreate: 1 [7] # StencilSetEntry: stencil_num entry offset[ndim] var value StencilSetEntry: 0 0 [ 0 0 0] 0 6.0 StencilSetEntry: 0 1 [-1 0 0] 0 -1.0 StencilSetEntry: 0 2 [ 1 0 0] 0 -1.0 StencilSetEntry: 0 3 [ 0 -1 0] 0 -1.0 StencilSetEntry: 0 4 [ 0 1 0] 0 -1.0 StencilSetEntry: 0 5 [ 0 0 -1] 0 -1.0 StencilSetEntry: 0 6 [ 0 0 1] 0 -1.0 ########################################################### # GraphSetStencil: part var stencil_num GraphSetStencil: 0 0 0 ########################################################### # MatrixSetValues: \ # part ilower(ndim) iupper(ndim) stride[ndim] var entry value # MatrixAddToValues: \ # part ilower(ndim) iupper(ndim) var nentries entries[nentries] values[nentries] MatrixAddToValues: 0 (0- 0- 15+) (15+ 15+ 15+) 0 1 [0] [10.0] ########################################################### # ProcessPoolCreate: num_pools ProcessPoolCreate: 1 # ProcessPoolSetPart: pool part ProcessPoolSetPart: 0 0 ########################################################### hypre-2.33.0/src/test/TEST_sstruct/sstruct.in.periodic.bigA000066400000000000000000000033041477326011500235450ustar00rootroot00000000000000# Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) ########################################################### # GridCreate: ndim nparts GridCreate: 2 1 # GridSetExtents: part ilower(ndim) iupper(ndim) GridSetExtents: 0 (0- 0-) (7+ 7+) # GridSetVariables: part nvars vartypes[nvars] # CELL = 0 GridSetVariables: 0 1 [0] # GridSetPeriodic: part periodic[ndim] GridSetPeriodic: 0 [8 0] ########################################################### # StencilCreate: nstencils sizes[nstencils] StencilCreate: 1 [5] # StencilSetEntry: stencil_num entry offset[ndim] var value StencilSetEntry: 0 0 [-1 0] 0 -1.0 StencilSetEntry: 0 1 [ 0 -1] 0 -1.0 StencilSetEntry: 0 2 [ 0 0] 0 4.0 StencilSetEntry: 0 3 [ 1 0] 0 -1.0 StencilSetEntry: 0 4 [ 0 1] 0 -1.0 ########################################################### # GraphSetStencil: part var stencil_num GraphSetStencil: 0 0 0 ########################################################### # MatrixSetSymmetric: part var to_var symmetric # ('-1' means "all", e.g. "all parts") MatrixSetSymmetric: -1 -1 -1 1 # MatrixSetValues: \ # part ilower(ndim) iupper(ndim) stride[ndim] var entry value #MatrixSetValues: 0 (0- 0-) (0- 7+) [1 1] 0 0 0.0 #MatrixSetValues: 0 (7+ 0-) (7+ 7+) [1 1] 0 3 0.0 MatrixSetValues: 0 (0- 0-) (7+ 0-) [1 1] 0 1 0.0 MatrixSetValues: 0 (0- 7+) (7+ 7+) [1 1] 0 4 0.0 ########################################################### # ProcessPoolCreate: num_pools ProcessPoolCreate: 1 # ProcessPoolSetPart: pool part ProcessPoolSetPart: 0 0 ########################################################### hypre-2.33.0/src/test/TEST_sstruct/sstruct.in.periodic.bigB000066400000000000000000000033031477326011500235450ustar00rootroot00000000000000# Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) ########################################################### # GridCreate: ndim nparts GridCreate: 2 1 # GridSetExtents: part ilower(ndim) iupper(ndim) GridSetExtents: 0 (0- 0-) (7+ 7+) # GridSetVariables: part nvars vartypes[nvars] # CELL = 0 GridSetVariables: 0 1 [0] # GridSetPeriodic: part periodic[ndim] GridSetPeriodic: 0 [16 0] ########################################################### # StencilCreate: nstencils sizes[nstencils] StencilCreate: 1 [5] # StencilSetEntry: stencil_num entry offset[ndim] var value StencilSetEntry: 0 0 [-1 0] 0 -1.0 StencilSetEntry: 0 1 [ 0 -1] 0 -1.0 StencilSetEntry: 0 2 [ 0 0] 0 4.0 StencilSetEntry: 0 3 [ 1 0] 0 -1.0 StencilSetEntry: 0 4 [ 0 1] 0 -1.0 ########################################################### # GraphSetStencil: part var stencil_num GraphSetStencil: 0 0 0 ########################################################### # MatrixSetSymmetric: part var to_var symmetric # ('-1' means "all", e.g. "all parts") MatrixSetSymmetric: -1 -1 -1 1 # MatrixSetValues: \ # part ilower(ndim) iupper(ndim) stride[ndim] var entry value MatrixSetValues: 0 (0- 0-) (0- 7+) [1 1] 0 0 0.0 MatrixSetValues: 0 (7+ 0-) (7+ 7+) [1 1] 0 3 0.0 MatrixSetValues: 0 (0- 0-) (7+ 0-) [1 1] 0 1 0.0 MatrixSetValues: 0 (0- 7+) (7+ 7+) [1 1] 0 4 0.0 ########################################################### # ProcessPoolCreate: num_pools ProcessPoolCreate: 1 # ProcessPoolSetPart: pool part ProcessPoolSetPart: 0 0 ########################################################### hypre-2.33.0/src/test/TEST_sstruct/sstruct.in.periodic.cellA000066400000000000000000000033211477326011500237220ustar00rootroot00000000000000# Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) ########################################################### # GridCreate: ndim nparts GridCreate: 2 1 # GridSetExtents: part ilower(ndim) iupper(ndim) GridSetExtents: 0 (0- 0-) (7+ 7+) # GridSetVariables: part nvars vartypes[nvars] # CELL = 0 GridSetVariables: 0 1 [0] # GridSetPeriodic: part periodic[ndim] GridSetPeriodic: 0 [0 8] ########################################################### # StencilCreate: nstencils sizes[nstencils] StencilCreate: 1 [5] # StencilSetEntry: stencil_num entry offset[ndim] var value StencilSetEntry: 0 0 [-1 0] 0 -1.0 StencilSetEntry: 0 1 [ 0 -1] 0 -1.0 StencilSetEntry: 0 2 [ 0 0] 0 4.0 StencilSetEntry: 0 3 [ 1 0] 0 -1.0 StencilSetEntry: 0 4 [ 0 1] 0 -1.0 ########################################################### # GraphSetStencil: part var stencil_num GraphSetStencil: 0 0 0 ########################################################### # MatrixSetSymmetric: part var to_var symmetric # ('-1' means "all", e.g. "all parts") #MatrixSetSymmetric: -1 -1 -1 1 # MatrixSetValues: \ # part ilower(ndim) iupper(ndim) stride[ndim] var entry value MatrixSetValues: 0 ( 0- 0-) ( 0- 7+) [1 1] 0 0 0.0 MatrixSetValues: 0 ( 7+ 0-) ( 7+ 7+) [1 1] 0 3 0.0 #MatrixSetValues: 0 ( 0- 0-) (7+ 0-) [1 1] 0 1 0.0 #MatrixSetValues: 0 ( 0- 7+) (7+ 7+) [1 1] 0 4 0.0 ########################################################### # ProcessPoolCreate: num_pools ProcessPoolCreate: 1 # ProcessPoolSetPart: pool part ProcessPoolSetPart: 0 0 ########################################################### hypre-2.33.0/src/test/TEST_sstruct/sstruct.in.periodic.cellB000066400000000000000000000036501477326011500237300ustar00rootroot00000000000000# Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) ########################################################### # GridCreate: ndim nparts GridCreate: 2 1 # GridSetExtents: part ilower(ndim) iupper(ndim) GridSetExtents: 0 (0- 0-) (7+ 7+) # GridSetVariables: part nvars vartypes[nvars] # CELL = 0 GridSetVariables: 0 1 [0] # GridSetPeriodic: part periodic[ndim] GridSetPeriodic: 0 [0 8] ########################################################### # StencilCreate: nstencils sizes[nstencils] StencilCreate: 1 [5] # StencilSetEntry: stencil_num entry offset[ndim] var value StencilSetEntry: 0 0 [-1 0] 0 -1.0 StencilSetEntry: 0 1 [ 0 -1] 0 -1.0 StencilSetEntry: 0 2 [ 0 0] 0 4.0 StencilSetEntry: 0 3 [ 1 0] 0 -1.0 StencilSetEntry: 0 4 [ 0 1] 0 -1.0 ########################################################### # GraphSetStencil: part var stencil_num GraphSetStencil: 0 0 0 ########################################################### # MatrixSetSymmetric: part var to_var symmetric # ('-1' means "all", e.g. "all parts") #MatrixSetSymmetric: -1 -1 -1 1 # MatrixSetValues: \ # part ilower(ndim) iupper(ndim) stride[ndim] var entry value MatrixSetValues: 0 ( 0- 0-) ( 0- 7+) [1 1] 0 0 0.0 MatrixSetValues: 0 ( 7+ 0-) ( 7+ 7+) [1 1] 0 3 0.0 MatrixSetValues: 0 ( 0- 0-) (7+ 0-) [1 1] 0 1 0.0 MatrixSetValues: 0 ( 0- 7+) (7+ 7+) [1 1] 0 4 0.0 # MatrixAddToValues: \ # part ilower(ndim) iupper(ndim) var nentries entries[nentries] values[nentries] MatrixAddToValues: 0 ( 0- 0-) (7+ 0-) 0 1 [1] [-1.0] MatrixAddToValues: 0 ( 0- 7+) (7+ 7+) 0 1 [4] [-1.0] ########################################################### # ProcessPoolCreate: num_pools ProcessPoolCreate: 1 # ProcessPoolSetPart: pool part ProcessPoolSetPart: 0 0 ########################################################### hypre-2.33.0/src/test/TEST_sstruct/sstruct.in.periodic.nodeA000066400000000000000000000033211477326011500237300ustar00rootroot00000000000000# Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) ########################################################### # GridCreate: ndim nparts GridCreate: 2 1 # GridSetExtents: part ilower(ndim) iupper(ndim) GridSetExtents: 0 (0- 0-) (7+ 7+) # GridSetVariables: part nvars vartypes[nvars] # NODE = 1 GridSetVariables: 0 1 [1] # GridSetPeriodic: part periodic[ndim] GridSetPeriodic: 0 [0 8] ########################################################### # StencilCreate: nstencils sizes[nstencils] StencilCreate: 1 [5] # StencilSetEntry: stencil_num entry offset[ndim] var value StencilSetEntry: 0 0 [-1 0] 0 -1.0 StencilSetEntry: 0 1 [ 0 -1] 0 -1.0 StencilSetEntry: 0 2 [ 0 0] 0 4.0 StencilSetEntry: 0 3 [ 1 0] 0 -1.0 StencilSetEntry: 0 4 [ 0 1] 0 -1.0 ########################################################### # GraphSetStencil: part var stencil_num GraphSetStencil: 0 0 0 ########################################################### # MatrixSetSymmetric: part var to_var symmetric # ('-1' means "all", e.g. "all parts") #MatrixSetSymmetric: -1 -1 -1 1 # MatrixSetValues: \ # part ilower(ndim) iupper(ndim) stride[ndim] var entry value MatrixSetValues: 0 (-1+ -1+) (-1+ 7+) [1 1] 0 0 0.0 MatrixSetValues: 0 ( 7+ -1+) ( 7+ 7+) [1 1] 0 3 0.0 #MatrixSetValues: 0 (-1+ -1+) (7+ -1+) [1 1] 0 1 0.0 #MatrixSetValues: 0 (-1+ 7+) (7+ 7+) [1 1] 0 4 0.0 ########################################################### # ProcessPoolCreate: num_pools ProcessPoolCreate: 1 # ProcessPoolSetPart: pool part ProcessPoolSetPart: 0 0 ########################################################### hypre-2.33.0/src/test/TEST_sstruct/sstruct.in.periodic.nodeB000066400000000000000000000037041477326011500237360ustar00rootroot00000000000000# Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) ########################################################### # GridCreate: ndim nparts GridCreate: 2 1 # GridSetExtents: part ilower(ndim) iupper(ndim) GridSetExtents: 0 (0- 0-) (7+ 7+) # GridSetVariables: part nvars vartypes[nvars] # NODE = 1 GridSetVariables: 0 1 [1] # GridSetPeriodic: part periodic[ndim] GridSetPeriodic: 0 [0 8] ########################################################### # StencilCreate: nstencils sizes[nstencils] StencilCreate: 1 [5] # StencilSetEntry: stencil_num entry offset[ndim] var value StencilSetEntry: 0 0 [-1 0] 0 -1.0 StencilSetEntry: 0 1 [ 0 -1] 0 -1.0 StencilSetEntry: 0 2 [ 0 0] 0 4.0 StencilSetEntry: 0 3 [ 1 0] 0 -1.0 StencilSetEntry: 0 4 [ 0 1] 0 -1.0 ########################################################### # GraphSetStencil: part var stencil_num GraphSetStencil: 0 0 0 ########################################################### # MatrixSetSymmetric: part var to_var symmetric # ('-1' means "all", e.g. "all parts") #MatrixSetSymmetric: -1 -1 -1 1 # MatrixSetValues: \ # part ilower(ndim) iupper(ndim) stride[ndim] var entry value MatrixSetValues: 0 (-1+ -1+) (-1+ 7+) [1 1] 0 0 0.0 MatrixSetValues: 0 ( 7+ -1+) ( 7+ 7+) [1 1] 0 3 0.0 MatrixSetValues: 0 (-1+ -1+) (7+ -1+) [1 1] 0 1 0.0 MatrixSetValues: 0 (-1+ 7+ : 0 -1) (7+ 7+ : 0 -1) [1 1] 0 4 0.0 # MatrixAddToValues: \ # part ilower(ndim) iupper(ndim) var nentries entries[nentries] values[nentries] MatrixAddToValues: 0 (-1+ -1+) (7+ -1+) 0 1 [1] [-1.0] MatrixAddToValues: 0 (-1+ 7+ : 0 -1) (7+ 7+ : 0 -1) 0 1 [4] [-1.0] ########################################################### # ProcessPoolCreate: num_pools ProcessPoolCreate: 1 # ProcessPoolSetPart: pool part ProcessPoolSetPart: 0 0 ########################################################### hypre-2.33.0/src/test/TEST_sstruct/sstruct.in.reduced3D000066400000000000000000000065031477326011500227140ustar00rootroot00000000000000# Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) ########################################################### # This example came from Rob Rieben and has one reduced connectivity point. # The k,z axis points "into the page". # # -------------------------------- # | /| # | / | # | / | # | part 1 / | # | / | # | j / | # | | / | # | ---i / | # --------------- part 2 | # | | | # | part 0 | | # | | | # | j | ---j | # | | | | | # | ---i | i | # -------------------------------- # ########################################################### # GridCreate: ndim nparts GridCreate: 3 3 # GridSetExtents: part ilower(ndim) iupper(ndim) GridSetExtents: 0 (2- 2- 2-) (11+ 11+ 11+) GridSetExtents: 1 (2- 2- 2-) (11+ 31+ 11+) GridSetExtents: 2 (2- 2- 2-) (11+ 31+ 11+) # GridSetVariables: part nvars vartypes[nvars] # NODE = 1 # XFACE = 2 # YFACE = 3 GridSetVariables: 0 1 [1] GridSetVariables: 1 1 [1] GridSetVariables: 2 1 [1] # GridSetSharedPart: part ilower(ndim) iupper(ndim) offset[ndim] \ # spart silower(ndim) siupper(ndim) soffset[ndim] \ # index_map[ndim] index_dir[ndim] GridSetSharedPart: 0 (2- 11+ 2-) (11+ 11+ 11+) [0 1 0] 1 (2- 2- 2-) (11+ 2- 11+) [0 -1 0] [0 1 2] [1 1 1] GridSetSharedPart: 0 (11+ 2- 2-) (11+ 11+ 11+) [1 0 0] 2 (2- 2- 2-) (11+ 2- 11+) [0 -1 0] [1 0 2] [1 -1 1] GridSetSharedPart: 1 (2- 2- 2-) (11+ 2- 11+) [0 -1 0] 0 (2- 11+ 2-) (11+ 11+ 11+) [0 1 0] [0 1 2] [1 1 1] GridSetSharedPart: 1 (11+ 2- 2-) (11+ 31+ 11+) [1 0 0] 2 (2- 2- 2-) (2- 31+ 11+) [-1 0 0] [0 1 2] [1 1 1] GridSetSharedPart: 2 (2- 2- 2-) (11+ 2- 11+) [0 -1 0] 0 (11+ 2- 2-) (11+ 11+ 11+) [1 0 0] [1 0 2] [-1 1 1] GridSetSharedPart: 2 (2- 2- 2-) (2- 31+ 11+) [-1 0 0] 1 (11+ 2- 2-) (11+ 31+ 11+) [1 0 0] [0 1 2] [1 1 1] ########################################################### # FEMStencilCreate: size FEMStencilCreate: 8 # FEMStencilSetRow: row offset[ndim] var values[size] FEMStencilSetRow: 0 [-1 -1 -1] 0 [ 4 -1 -1 0 -1 0 0 0 ] FEMStencilSetRow: 1 [ 0 -1 -1] 0 [ -1 4 0 -1 0 -1 0 0 ] FEMStencilSetRow: 2 [-1 0 -1] 0 [ -1 0 4 -1 0 0 -1 0 ] FEMStencilSetRow: 3 [ 0 0 -1] 0 [ 0 -1 -1 4 0 0 0 -1 ] FEMStencilSetRow: 4 [-1 -1 0] 0 [ -1 0 0 0 4 -1 -1 0 ] FEMStencilSetRow: 5 [ 0 -1 0] 0 [ 0 -1 0 0 -1 4 0 -1 ] FEMStencilSetRow: 6 [-1 0 0] 0 [ 0 0 -1 0 -1 0 4 -1 ] FEMStencilSetRow: 7 [ 0 0 0] 0 [ 0 0 0 -1 0 -1 -1 4 ] ########################################################### # ProcessPoolCreate: num_pools ProcessPoolCreate: 1 # ProcessPoolSetPart: pool part ProcessPoolSetPart: 0 0 ProcessPoolSetPart: 0 1 ProcessPoolSetPart: 0 2 # ProcessPoolCreate: num_pools ProcessPoolCreate: 3 # ProcessPoolSetPart: pool part ProcessPoolSetPart: 0 0 ProcessPoolSetPart: 1 1 ProcessPoolSetPart: 2 2 ########################################################### hypre-2.33.0/src/test/TEST_sstruct/sstruct.in.reduced3D-4000066400000000000000000000066161477326011500230620ustar00rootroot00000000000000# Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) ########################################################### # This example came from Rob Rieben and has one reduced connectivity point. # The k,z axis points "into the page". Part 1 is divided into 2 boxes. # # -------------------------------- # | /| # | part 1 / | # | / | # | . . . . . . . . . . . / | # | / | # | j part 1 / | # | | / | # | ---i / | # --------------- part 2 | # | | | # | part 0 | | # | | | # | j | ---j | # | | | | | # | ---i | i | # -------------------------------- # ########################################################### # GridCreate: ndim nparts GridCreate: 3 3 # GridSetExtents: part ilower(ndim) iupper(ndim) GridSetExtents: 0 (2- 2- 2-) (11+ 11+ 11+) GridSetExtents: 1 (2- 2- 2-) (11+ 31+ 6+) GridSetExtents: 1 (2- 2- 7-) (11+ 31+ 11+) GridSetExtents: 2 (2- 2- 2-) (11+ 31+ 11+) # GridSetVariables: part nvars vartypes[nvars] # NODE = 1 # XFACE = 2 # YFACE = 3 GridSetVariables: 0 1 [1] GridSetVariables: 1 1 [1] GridSetVariables: 2 1 [1] # GridSetSharedPart: part ilower(ndim) iupper(ndim) offset[ndim] \ # spart silower(ndim) siupper(ndim) soffset[ndim] \ # index_map[ndim] index_dir[ndim] GridSetSharedPart: 0 (2- 11+ 2-) (11+ 11+ 11+) [0 1 0] 1 (2- 2- 2-) (11+ 2- 11+) [0 -1 0] [0 1 2] [1 1 1] GridSetSharedPart: 0 (11+ 2- 2-) (11+ 11+ 11+) [1 0 0] 2 (2- 2- 2-) (11+ 2- 11+) [0 -1 0] [1 0 2] [1 -1 1] GridSetSharedPart: 1 (2- 2- 2-) (11+ 2- 11+) [0 -1 0] 0 (2- 11+ 2-) (11+ 11+ 11+) [0 1 0] [0 1 2] [1 1 1] GridSetSharedPart: 1 (11+ 2- 2-) (11+ 31+ 11+) [1 0 0] 2 (2- 2- 2-) (2- 31+ 11+) [-1 0 0] [0 1 2] [1 1 1] GridSetSharedPart: 2 (2- 2- 2-) (11+ 2- 11+) [0 -1 0] 0 (11+ 2- 2-) (11+ 11+ 11+) [1 0 0] [1 0 2] [-1 1 1] GridSetSharedPart: 2 (2- 2- 2-) (2- 31+ 11+) [-1 0 0] 1 (11+ 2- 2-) (11+ 31+ 11+) [1 0 0] [0 1 2] [1 1 1] ########################################################### # FEMStencilCreate: size FEMStencilCreate: 8 # FEMStencilSetRow: row offset[ndim] var values[size] FEMStencilSetRow: 0 [-1 -1 -1] 0 [ 4 -1 -1 0 -1 0 0 0 ] FEMStencilSetRow: 1 [ 0 -1 -1] 0 [ -1 4 0 -1 0 -1 0 0 ] FEMStencilSetRow: 2 [-1 0 -1] 0 [ -1 0 4 -1 0 0 -1 0 ] FEMStencilSetRow: 3 [ 0 0 -1] 0 [ 0 -1 -1 4 0 0 0 -1 ] FEMStencilSetRow: 4 [-1 -1 0] 0 [ -1 0 0 0 4 -1 -1 0 ] FEMStencilSetRow: 5 [ 0 -1 0] 0 [ 0 -1 0 0 -1 4 0 -1 ] FEMStencilSetRow: 6 [-1 0 0] 0 [ 0 0 -1 0 -1 0 4 -1 ] FEMStencilSetRow: 7 [ 0 0 0] 0 [ 0 0 0 -1 0 -1 -1 4 ] ########################################################### # ProcessPoolCreate: num_pools ProcessPoolCreate: 1 # ProcessPoolSetPart: pool part ProcessPoolSetPart: 0 0 ProcessPoolSetPart: 0 1 ProcessPoolSetPart: 0 2 # ProcessPoolCreate: num_pools ProcessPoolCreate: 3 # ProcessPoolSetPart: pool part ProcessPoolSetPart: 0 0 ProcessPoolSetPart: 1 1 ProcessPoolSetPart: 2 2 ########################################################### hypre-2.33.0/src/test/TEST_sstruct/sstruct.in.struct000066400000000000000000000034501477326011500224340ustar00rootroot00000000000000# Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) ########################################################### # GridCreate: ndim nparts GridCreate: 3 1 # GridSetExtents: part ilower(ndim) iupper(ndim) GridSetExtents: 0 (-2- -2- -2-) (8+ 8+ 8+) # GridSetVariables: part nvars vartypes[nvars] # NODE = 1 GridSetVariables: 0 1 [1] ########################################################### # StencilCreate: nstencils sizes[nstencils] StencilCreate: 1 [7] # StencilSetEntry: stencil_num entry offset[ndim] var value StencilSetEntry: 0 0 [-1 0 0] 0 -1.0 StencilSetEntry: 0 1 [ 0 -1 0] 0 -1.0 StencilSetEntry: 0 2 [ 0 0 -1] 0 -1.0 StencilSetEntry: 0 3 [ 0 0 0] 0 6.0 StencilSetEntry: 0 4 [ 1 0 0] 0 -1.0 StencilSetEntry: 0 5 [ 0 1 0] 0 -1.0 StencilSetEntry: 0 6 [ 0 0 1] 0 -1.0 ########################################################### # GraphSetStencil: part var stencil_num GraphSetStencil: 0 0 0 ########################################################### # MatrixSetValues: \ # part ilower(ndim) iupper(ndim) stride[ndim] var entry value MatrixSetValues: 0 (-3- -3- -3-) (8+ 8+ -3-) [1 1 1] 0 2 0.0 MatrixSetValues: 0 (-3- -3- 8+) (8+ 8+ 8+) [1 1 1] 0 6 0.0 MatrixSetValues: 0 (-3- -3- -3-) (-3- 8+ 8+) [1 1 1] 0 0 0.0 MatrixSetValues: 0 ( 8+ -3- -3-) ( 8+ 8+ 8+) [1 1 1] 0 4 0.0 MatrixSetValues: 0 (-3- -3- -3-) (8+ -3- 8+) [1 1 1] 0 1 0.0 MatrixSetValues: 0 (-3- 8+ -3-) (8+ 8+ 8+) [1 1 1] 0 5 0.0 ########################################################### # ProcessPoolCreate: num_pools ProcessPoolCreate: 1 # ProcessPoolSetPart: pool part ProcessPoolSetPart: 0 0 ########################################################### hypre-2.33.0/src/test/TEST_sstruct/sstruct.in.symm0000066400000000000000000000034001477326011500221500ustar00rootroot00000000000000# Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) ########################################################### # GridCreate: ndim nparts GridCreate: 3 1 # GridSetExtents: part ilower(ndim) iupper(ndim) GridSetExtents: 0 (1- 1- 1-) (2+ 2+ 2+) # GridSetVariables: part nvars vartypes[nvars] # CELL = 0 GridSetVariables: 0 1 [0] ########################################################### # StencilCreate: nstencils sizes[nstencils] StencilCreate: 1 [7] # StencilSetEntry: stencil_num entry offset[ndim] var value StencilSetEntry: 0 0 [ 0 0 0] 0 6.0 StencilSetEntry: 0 1 [-1 0 0] 0 -1.0 StencilSetEntry: 0 2 [ 1 0 0] 0 -1.0 StencilSetEntry: 0 3 [ 0 -1 0] 0 -1.0 StencilSetEntry: 0 4 [ 0 1 0] 0 -1.0 StencilSetEntry: 0 5 [ 0 0 -1] 0 -1.0 StencilSetEntry: 0 6 [ 0 0 1] 0 -1.0 ########################################################### # GraphSetStencil: part var stencil_num GraphSetStencil: 0 0 0 ########################################################### # MatrixSetValues: \ # part ilower(ndim) iupper(ndim) stride[ndim] var entry value MatrixSetValues: 0 (1- 1- 1-) (1- 2+ 2+) [1 1 1] 0 1 0.0 MatrixSetValues: 0 (2+ 1- 1-) (2+ 2+ 2+) [1 1 1] 0 2 0.0 MatrixSetValues: 0 (1- 1- 1-) (2+ 1- 2+) [1 1 1] 0 3 0.0 MatrixSetValues: 0 (1- 2+ 1-) (2+ 2+ 2+) [1 1 1] 0 4 0.0 MatrixSetValues: 0 (1- 1- 1-) (2+ 2+ 1-) [1 1 1] 0 5 0.0 MatrixSetValues: 0 (1- 1- 2+) (2+ 2+ 2+) [1 1 1] 0 6 0.0 ########################################################### # ProcessPoolCreate: num_pools ProcessPoolCreate: 1 # ProcessPoolSetPart: pool part ProcessPoolSetPart: 0 0 ########################################################### hypre-2.33.0/src/test/TEST_sstruct/sstruct.in.symm0.2D000066400000000000000000000030111477326011500224120ustar00rootroot00000000000000# Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) ########################################################### # GridCreate: ndim nparts GridCreate: 2 1 # GridSetExtents: part ilower(ndim) iupper(ndim) GridSetExtents: 0 (1- 1-) (2+ 2+) # GridSetVariables: part nvars vartypes[nvars] # CELL = 0 GridSetVariables: 0 1 [0] ########################################################### # StencilCreate: nstencils sizes[nstencils] StencilCreate: 1 [5] # StencilSetEntry: stencil_num entry offset[ndim] var value StencilSetEntry: 0 0 [ 0 0] 0 4.0 StencilSetEntry: 0 1 [-1 0] 0 -1.0 StencilSetEntry: 0 2 [ 1 0] 0 -1.0 StencilSetEntry: 0 3 [ 0 -1] 0 -1.0 StencilSetEntry: 0 4 [ 0 1] 0 -1.0 ########################################################### # GraphSetStencil: part var stencil_num GraphSetStencil: 0 0 0 ########################################################### # MatrixSetValues: \ # part ilower(ndim) iupper(ndim) stride[ndim] var entry value MatrixSetValues: 0 (1- 1-) (1- 2+) [1 1] 0 1 0.0 MatrixSetValues: 0 (2+ 1-) (2+ 2+) [1 1] 0 2 0.0 MatrixSetValues: 0 (1- 1-) (2+ 1-) [1 1] 0 3 0.0 MatrixSetValues: 0 (1- 2+) (2+ 2+) [1 1] 0 4 0.0 ########################################################### # ProcessPoolCreate: num_pools ProcessPoolCreate: 1 # ProcessPoolSetPart: pool part ProcessPoolSetPart: 0 0 ########################################################### hypre-2.33.0/src/test/TEST_sstruct/sstruct.in.symm1000066400000000000000000000035211477326011500221550ustar00rootroot00000000000000# Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) ########################################################### # GridCreate: ndim nparts GridCreate: 3 1 # GridSetExtents: part ilower(ndim) iupper(ndim) GridSetExtents: 0 (1- 1- 1-) (2+ 2+ 2+) # GridSetVariables: part nvars vartypes[nvars] # CELL = 0 GridSetVariables: 0 1 [0] ########################################################### # StencilCreate: nstencils sizes[nstencils] StencilCreate: 1 [7] # StencilSetEntry: stencil_num entry offset[ndim] var value StencilSetEntry: 0 0 [ 0 0 0] 0 6.0 StencilSetEntry: 0 1 [-1 0 0] 0 -1.0 StencilSetEntry: 0 2 [ 1 0 0] 0 -1.0 StencilSetEntry: 0 3 [ 0 -1 0] 0 -1.0 StencilSetEntry: 0 4 [ 0 1 0] 0 -1.0 StencilSetEntry: 0 5 [ 0 0 -1] 0 -1.0 StencilSetEntry: 0 6 [ 0 0 1] 0 -1.0 ########################################################### # GraphSetStencil: part var stencil_num GraphSetStencil: 0 0 0 ########################################################### # MatrixSetSymmetric: part var to_var symmetric MatrixSetSymmetric: -1 -1 -1 1 # MatrixSetValues: \ # part ilower(ndim) iupper(ndim) stride[ndim] var entry value MatrixSetValues: 0 (1- 1- 1-) (1- 2+ 2+) [1 1 1] 0 1 0.0 MatrixSetValues: 0 (2+ 1- 1-) (2+ 2+ 2+) [1 1 1] 0 2 0.0 MatrixSetValues: 0 (1- 1- 1-) (2+ 1- 2+) [1 1 1] 0 3 0.0 MatrixSetValues: 0 (1- 2+ 1-) (2+ 2+ 2+) [1 1 1] 0 4 0.0 MatrixSetValues: 0 (1- 1- 1-) (2+ 2+ 1-) [1 1 1] 0 5 0.0 MatrixSetValues: 0 (1- 1- 2+) (2+ 2+ 2+) [1 1 1] 0 6 0.0 ########################################################### # ProcessPoolCreate: num_pools ProcessPoolCreate: 1 # ProcessPoolSetPart: pool part ProcessPoolSetPart: 0 0 ########################################################### hypre-2.33.0/src/test/TEST_sstruct/sstruct.in.symm1.2D000066400000000000000000000031321477326011500224170ustar00rootroot00000000000000# Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) ########################################################### # GridCreate: ndim nparts GridCreate: 2 1 # GridSetExtents: part ilower(ndim) iupper(ndim) GridSetExtents: 0 (1- 1-) (2+ 2+) # GridSetVariables: part nvars vartypes[nvars] # CELL = 0 GridSetVariables: 0 1 [0] ########################################################### # StencilCreate: nstencils sizes[nstencils] StencilCreate: 1 [5] # StencilSetEntry: stencil_num entry offset[ndim] var value StencilSetEntry: 0 0 [ 0 0] 0 4.0 StencilSetEntry: 0 1 [-1 0] 0 -1.0 StencilSetEntry: 0 2 [ 1 0] 0 -1.0 StencilSetEntry: 0 3 [ 0 -1] 0 -1.0 StencilSetEntry: 0 4 [ 0 1] 0 -1.0 ########################################################### # GraphSetStencil: part var stencil_num GraphSetStencil: 0 0 0 ########################################################### # MatrixSetSymmetric: part var to_var symmetric MatrixSetSymmetric: -1 -1 -1 1 # MatrixSetValues: \ # part ilower(ndim) iupper(ndim) stride[ndim] var entry value MatrixSetValues: 0 (1- 1-) (1- 2+) [1 1] 0 1 0.0 MatrixSetValues: 0 (2+ 1-) (2+ 2+) [1 1] 0 2 0.0 MatrixSetValues: 0 (1- 1-) (2+ 1-) [1 1] 0 3 0.0 MatrixSetValues: 0 (1- 2+) (2+ 2+) [1 1] 0 4 0.0 ########################################################### # ProcessPoolCreate: num_pools ProcessPoolCreate: 1 # ProcessPoolSetPart: pool part ProcessPoolSetPart: 0 0 ########################################################### hypre-2.33.0/src/test/TEST_sstruct/sstruct.in.symm2000066400000000000000000000032171477326011500221600ustar00rootroot00000000000000# Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) ########################################################### # GridCreate: ndim nparts GridCreate: 3 1 # GridSetExtents: part ilower(ndim) iupper(ndim) GridSetExtents: 0 (1- 1- 1-) (2+ 2+ 2+) # GridSetVariables: part nvars vartypes[nvars] # CELL = 0 GridSetVariables: 0 1 [0] ########################################################### # StencilCreate: nstencils sizes[nstencils] StencilCreate: 1 [5] # StencilSetEntry: stencil_num entry offset[ndim] var value StencilSetEntry: 0 0 [ 0 0 0] 0 6.0 StencilSetEntry: 0 1 [-1 0 0] 0 -1.0 StencilSetEntry: 0 2 [ 0 -1 0] 0 -1.0 StencilSetEntry: 0 3 [ 0 0 -1] 0 -1.0 StencilSetEntry: 0 4 [ 0 0 1] 0 -1.0 ########################################################### # GraphSetStencil: part var stencil_num GraphSetStencil: 0 0 0 ########################################################### # MatrixSetSymmetric: part var to_var symmetric MatrixSetSymmetric: -1 -1 -1 1 # MatrixSetValues: \ # part ilower(ndim) iupper(ndim) stride[ndim] var entry value MatrixSetValues: 0 (1- 1- 1-) (1- 2+ 2+) [1 1 1] 0 1 0.0 MatrixSetValues: 0 (1- 1- 1-) (2+ 1- 2+) [1 1 1] 0 2 0.0 MatrixSetValues: 0 (1- 1- 1-) (2+ 2+ 1-) [1 1 1] 0 3 0.0 MatrixSetValues: 0 (1- 1- 2+) (2+ 2+ 2+) [1 1 1] 0 4 0.0 ########################################################### # ProcessPoolCreate: num_pools ProcessPoolCreate: 1 # ProcessPoolSetPart: pool part ProcessPoolSetPart: 0 0 ########################################################### hypre-2.33.0/src/test/TEST_sstruct/sstruct.in.symm2.2D000066400000000000000000000030041477326011500224160ustar00rootroot00000000000000# Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) ########################################################### # GridCreate: ndim nparts GridCreate: 2 1 # GridSetExtents: part ilower(ndim) iupper(ndim) GridSetExtents: 0 (1- 1-) (2+ 2+) # GridSetVariables: part nvars vartypes[nvars] # CELL = 0 GridSetVariables: 0 1 [0] ########################################################### # StencilCreate: nstencils sizes[nstencils] StencilCreate: 1 [4] # StencilSetEntry: stencil_num entry offset[ndim] var value StencilSetEntry: 0 0 [ 0 0] 0 4.0 StencilSetEntry: 0 1 [-1 0] 0 -1.0 StencilSetEntry: 0 2 [ 1 0] 0 -1.0 StencilSetEntry: 0 3 [ 0 -1] 0 -1.0 ########################################################### # GraphSetStencil: part var stencil_num GraphSetStencil: 0 0 0 ########################################################### # MatrixSetSymmetric: part var to_var symmetric MatrixSetSymmetric: -1 -1 -1 1 # MatrixSetValues: \ # part ilower(ndim) iupper(ndim) stride[ndim] var entry value MatrixSetValues: 0 (1- 1-) (1- 2+) [1 1] 0 1 0.0 MatrixSetValues: 0 (2+ 1-) (2+ 2+) [1 1] 0 2 0.0 MatrixSetValues: 0 (1- 1-) (2+ 1-) [1 1] 0 3 0.0 ########################################################### # ProcessPoolCreate: num_pools ProcessPoolCreate: 1 # ProcessPoolSetPart: pool part ProcessPoolSetPart: 0 0 ########################################################### hypre-2.33.0/src/test/TEST_sstruct/sstruct.in.symm3000066400000000000000000000030561477326011500221620ustar00rootroot00000000000000# Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) ########################################################### # GridCreate: ndim nparts GridCreate: 3 1 # GridSetExtents: part ilower(ndim) iupper(ndim) GridSetExtents: 0 (1- 1- 1-) (2+ 2+ 2+) # GridSetVariables: part nvars vartypes[nvars] # CELL = 0 GridSetVariables: 0 1 [0] ########################################################### # StencilCreate: nstencils sizes[nstencils] StencilCreate: 1 [4] # StencilSetEntry: stencil_num entry offset[ndim] var value StencilSetEntry: 0 0 [ 0 0 0] 0 6.0 StencilSetEntry: 0 1 [-1 0 0] 0 -1.0 StencilSetEntry: 0 2 [ 0 -1 0] 0 -1.0 StencilSetEntry: 0 3 [ 0 0 -1] 0 -1.0 ########################################################### # GraphSetStencil: part var stencil_num GraphSetStencil: 0 0 0 ########################################################### # MatrixSetSymmetric: part var to_var symmetric MatrixSetSymmetric: -1 -1 -1 1 # MatrixSetValues: \ # part ilower(ndim) iupper(ndim) stride[ndim] var entry value MatrixSetValues: 0 (1- 1- 1-) (1- 2+ 2+) [1 1 1] 0 1 0.0 MatrixSetValues: 0 (1- 1- 1-) (2+ 1- 2+) [1 1 1] 0 2 0.0 MatrixSetValues: 0 (1- 1- 1-) (2+ 2+ 1-) [1 1 1] 0 3 0.0 ########################################################### # ProcessPoolCreate: num_pools ProcessPoolCreate: 1 # ProcessPoolSetPart: pool part ProcessPoolSetPart: 0 0 ########################################################### hypre-2.33.0/src/test/TEST_sstruct/sstruct.in.symm3.2D000066400000000000000000000026561477326011500224330ustar00rootroot00000000000000# Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) ########################################################### # GridCreate: ndim nparts GridCreate: 2 1 # GridSetExtents: part ilower(ndim) iupper(ndim) GridSetExtents: 0 (1- 1-) (2+ 2+) # GridSetVariables: part nvars vartypes[nvars] # CELL = 0 GridSetVariables: 0 1 [0] ########################################################### # StencilCreate: nstencils sizes[nstencils] StencilCreate: 1 [3] # StencilSetEntry: stencil_num entry offset[ndim] var value StencilSetEntry: 0 0 [ 0 0] 0 4.0 StencilSetEntry: 0 1 [-1 0] 0 -1.0 StencilSetEntry: 0 2 [ 0 -1] 0 -1.0 ########################################################### # GraphSetStencil: part var stencil_num GraphSetStencil: 0 0 0 ########################################################### # MatrixSetSymmetric: part var to_var symmetric MatrixSetSymmetric: -1 -1 -1 1 # MatrixSetValues: \ # part ilower(ndim) iupper(ndim) stride[ndim] var entry value MatrixSetValues: 0 (1- 1-) (1- 2+) [1 1] 0 1 0.0 MatrixSetValues: 0 (1- 1-) (2+ 1-) [1 1] 0 2 0.0 ########################################################### # ProcessPoolCreate: num_pools ProcessPoolCreate: 1 # ProcessPoolSetPart: pool part ProcessPoolSetPart: 0 0 ########################################################### hypre-2.33.0/src/test/TEST_sstruct/sstruct.in.wide.2D000066400000000000000000000044061477326011500223060ustar00rootroot00000000000000# Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) ########################################################### # GridCreate: ndim nparts GridCreate: 2 1 # GridSetNumGhost: numghost[2*ndim] GridSetNumGhost: [3 3 3 3] # GridSetExtents: part ilower(ndim) iupper(ndim) GridSetExtents: 0 (1- 1-) (2+ 2+) # GridSetVariables: part nvars vartypes[nvars] # CELL = 0 GridSetVariables: 0 1 [0] ########################################################### # StencilCreate: nstencils sizes[nstencils] StencilCreate: 1 [13] # StencilSetEntry: stencil_num entry offset[ndim] var value StencilSetEntry: 0 0 [ 0 0] 0 12.0 StencilSetEntry: 0 1 [-1 0] 0 -1.0 StencilSetEntry: 0 2 [ 1 0] 0 -1.0 StencilSetEntry: 0 3 [ 0 -1] 0 -1.0 StencilSetEntry: 0 4 [ 0 1] 0 -1.0 StencilSetEntry: 0 5 [-2 0] 0 -1.0 StencilSetEntry: 0 6 [ 2 0] 0 -1.0 StencilSetEntry: 0 7 [ 0 -2] 0 -1.0 StencilSetEntry: 0 8 [ 0 2] 0 -1.0 StencilSetEntry: 0 9 [-3 0] 0 -1.0 StencilSetEntry: 0 10 [ 3 0] 0 -1.0 StencilSetEntry: 0 11 [ 0 -3] 0 -1.0 StencilSetEntry: 0 12 [ 0 3] 0 -1.0 ########################################################### # GraphSetStencil: part var stencil_num GraphSetStencil: 0 0 0 ########################################################### # MatrixSetValues: \ # part ilower(ndim) iupper(ndim) stride[ndim] var entry value MatrixSetValues: 0 (1- 1-) (1- 2+) [1 1] 0 1 0.0 MatrixSetValues: 0 (2+ 1-) (2+ 2+) [1 1] 0 2 0.0 MatrixSetValues: 0 (1- 1-) (2+ 1-) [1 1] 0 3 0.0 MatrixSetValues: 0 (1- 2+) (2+ 2+) [1 1] 0 4 0.0 MatrixSetValues: 0 (1- 1-) (1- 2+) [1 1] 0 5 0.0 MatrixSetValues: 0 (2+ 1-) (2+ 2+) [1 1] 0 6 0.0 MatrixSetValues: 0 (1- 1-) (2+ 1-) [1 1] 0 7 0.0 MatrixSetValues: 0 (1- 2+) (2+ 2+) [1 1] 0 8 0.0 MatrixSetValues: 0 (1- 1-) (1- 2+) [1 1] 0 9 0.0 MatrixSetValues: 0 (2+ 1-) (2+ 2+) [1 1] 0 10 0.0 MatrixSetValues: 0 (1- 1-) (2+ 1-) [1 1] 0 11 0.0 MatrixSetValues: 0 (1- 2+) (2+ 2+) [1 1] 0 12 0.0 ########################################################### # ProcessPoolCreate: num_pools ProcessPoolCreate: 1 # ProcessPoolSetPart: pool part ProcessPoolSetPart: 0 0 ########################################################### hypre-2.33.0/src/test/TEST_sstruct/sstruct_struct.jobs000077500000000000000000000043771477326011500230600ustar00rootroot00000000000000#!/bin/bash # Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) #============================================================================= # Compare the struct solvers called from sstruct & struct interfaces #============================================================================= mpirun -np 1 ./struct -n 12 12 12 -solver 1 -istart -3 -3 -3 -relax 1 -rap 1 \ > sstruct_struct.out.1 mpirun -np 1 ./sstruct -in sstruct.in.struct -solver 201 -relax 1 -rap 1 -rhsone \ > sstruct_struct.out.201 mpirun -np 1 ./struct -n 12 12 12 -solver 0 -istart -3 -3 -3 -relax 1 \ > sstruct_struct.out.0 mpirun -np 1 ./sstruct -in sstruct.in.struct -solver 200 -relax 1 -rhsone \ > sstruct_struct.out.200 # Compare 2D struct run to 3D run with coefficients zeroed out in one dimension mpirun -np 1 ./struct -d 2 -n 40 40 1 -solver 1 -istart 10 10 10 \ > sstruct_struct.out.2D mpirun -np 1 ./sstruct -in sstruct.in.7zero-x -r 10 10 10 -solver 201 -rhsone \ > sstruct_struct.out.3Dx mpirun -np 1 ./sstruct -in sstruct.in.7zero-y -r 10 10 10 -solver 201 -rhsone \ > sstruct_struct.out.3Dy mpirun -np 1 ./sstruct -in sstruct.in.7zero-z -r 10 10 10 -solver 201 -rhsone \ > sstruct_struct.out.3Dz #============================================================================= # Compare 19pt, 7pt, positive, and negative definite #============================================================================= mpirun -np 2 ./sstruct -in sstruct.in.19aniso -P 2 1 1 -solver 201 \ > sstruct_struct.out.10 mpirun -np 2 ./sstruct -in sstruct.in.p19aniso -P 2 1 1 -solver 201 \ > sstruct_struct.out.11 mpirun -np 2 ./sstruct -in sstruct.in.7aniso -P 2 1 1 -solver 201 \ > sstruct_struct.out.12 mpirun -np 2 ./sstruct -in sstruct.in.p7aniso -P 2 1 1 -solver 201 \ > sstruct_struct.out.13 mpirun -np 2 ./sstruct -in sstruct.in.19iso -P 2 1 1 -solver 201 \ > sstruct_struct.out.15 mpirun -np 2 ./sstruct -in sstruct.in.p19iso -P 2 1 1 -solver 201 \ > sstruct_struct.out.16 mpirun -np 2 ./sstruct -in sstruct.in.7iso -P 2 1 1 -solver 201 \ > sstruct_struct.out.17 mpirun -np 2 ./sstruct -in sstruct.in.p7iso -P 2 1 1 -solver 201 \ > sstruct_struct.out.18 hypre-2.33.0/src/test/TEST_sstruct/sstruct_struct.saved000066400000000000000000000030351477326011500232100ustar00rootroot00000000000000# Output file: sstruct_struct.out.0 Iterations = 5 Final Relative Residual Norm = 2.753739e-07 # Output file: sstruct_struct.out.1 Iterations = 16 Final Relative Residual Norm = 6.891627e-07 # Output file: sstruct_struct.out.200 Iterations = 5 Final Relative Residual Norm = 2.753739e-07 # Output file: sstruct_struct.out.201 Iterations = 16 Final Relative Residual Norm = 6.891627e-07 # Output file: sstruct_struct.out.2D Iterations = 15 Final Relative Residual Norm = 3.544959e-07 # Output file: sstruct_struct.out.3Dx Iterations = 15 Final Relative Residual Norm = 3.544959e-07 # Output file: sstruct_struct.out.3Dy Iterations = 15 Final Relative Residual Norm = 3.544959e-07 # Output file: sstruct_struct.out.3Dz Iterations = 15 Final Relative Residual Norm = 3.544959e-07 # Output file: sstruct_struct.out.10 Iterations = 8 Final Relative Residual Norm = 3.476646e-07 # Output file: sstruct_struct.out.11 Iterations = 8 Final Relative Residual Norm = 3.476646e-07 # Output file: sstruct_struct.out.12 Iterations = 8 Final Relative Residual Norm = 3.476646e-07 # Output file: sstruct_struct.out.13 Iterations = 8 Final Relative Residual Norm = 3.476646e-07 # Output file: sstruct_struct.out.15 Iterations = 23 Final Relative Residual Norm = 9.655301e-07 # Output file: sstruct_struct.out.16 Iterations = 23 Final Relative Residual Norm = 9.655301e-07 # Output file: sstruct_struct.out.17 Iterations = 23 Final Relative Residual Norm = 9.655301e-07 # Output file: sstruct_struct.out.18 Iterations = 23 Final Relative Residual Norm = 9.655301e-07 hypre-2.33.0/src/test/TEST_sstruct/sstruct_struct.saved.lassen000066400000000000000000000030351477326011500244740ustar00rootroot00000000000000# Output file: sstruct_struct.out.0 Iterations = 5 Final Relative Residual Norm = 2.753739e-07 # Output file: sstruct_struct.out.1 Iterations = 16 Final Relative Residual Norm = 6.891627e-07 # Output file: sstruct_struct.out.200 Iterations = 5 Final Relative Residual Norm = 2.753739e-07 # Output file: sstruct_struct.out.201 Iterations = 16 Final Relative Residual Norm = 6.891627e-07 # Output file: sstruct_struct.out.2D Iterations = 15 Final Relative Residual Norm = 3.544959e-07 # Output file: sstruct_struct.out.3Dx Iterations = 15 Final Relative Residual Norm = 3.544959e-07 # Output file: sstruct_struct.out.3Dy Iterations = 15 Final Relative Residual Norm = 3.544959e-07 # Output file: sstruct_struct.out.3Dz Iterations = 15 Final Relative Residual Norm = 3.544959e-07 # Output file: sstruct_struct.out.10 Iterations = 8 Final Relative Residual Norm = 3.476646e-07 # Output file: sstruct_struct.out.11 Iterations = 8 Final Relative Residual Norm = 3.476646e-07 # Output file: sstruct_struct.out.12 Iterations = 8 Final Relative Residual Norm = 3.476646e-07 # Output file: sstruct_struct.out.13 Iterations = 8 Final Relative Residual Norm = 3.476646e-07 # Output file: sstruct_struct.out.15 Iterations = 23 Final Relative Residual Norm = 9.655301e-07 # Output file: sstruct_struct.out.16 Iterations = 23 Final Relative Residual Norm = 9.655301e-07 # Output file: sstruct_struct.out.17 Iterations = 23 Final Relative Residual Norm = 9.655301e-07 # Output file: sstruct_struct.out.18 Iterations = 23 Final Relative Residual Norm = 9.655301e-07 hypre-2.33.0/src/test/TEST_sstruct/sstruct_struct.saved.lassen_cpu000066400000000000000000000030351477326011500253430ustar00rootroot00000000000000# Output file: sstruct_struct.out.0 Iterations = 5 Final Relative Residual Norm = 2.753739e-07 # Output file: sstruct_struct.out.1 Iterations = 16 Final Relative Residual Norm = 6.891627e-07 # Output file: sstruct_struct.out.200 Iterations = 5 Final Relative Residual Norm = 2.753739e-07 # Output file: sstruct_struct.out.201 Iterations = 16 Final Relative Residual Norm = 6.891627e-07 # Output file: sstruct_struct.out.2D Iterations = 15 Final Relative Residual Norm = 3.544959e-07 # Output file: sstruct_struct.out.3Dx Iterations = 15 Final Relative Residual Norm = 3.544959e-07 # Output file: sstruct_struct.out.3Dy Iterations = 15 Final Relative Residual Norm = 3.544959e-07 # Output file: sstruct_struct.out.3Dz Iterations = 15 Final Relative Residual Norm = 3.544959e-07 # Output file: sstruct_struct.out.10 Iterations = 8 Final Relative Residual Norm = 3.476646e-07 # Output file: sstruct_struct.out.11 Iterations = 8 Final Relative Residual Norm = 3.476646e-07 # Output file: sstruct_struct.out.12 Iterations = 8 Final Relative Residual Norm = 3.476646e-07 # Output file: sstruct_struct.out.13 Iterations = 8 Final Relative Residual Norm = 3.476646e-07 # Output file: sstruct_struct.out.15 Iterations = 23 Final Relative Residual Norm = 9.655301e-07 # Output file: sstruct_struct.out.16 Iterations = 23 Final Relative Residual Norm = 9.655301e-07 # Output file: sstruct_struct.out.17 Iterations = 23 Final Relative Residual Norm = 9.655301e-07 # Output file: sstruct_struct.out.18 Iterations = 23 Final Relative Residual Norm = 9.655301e-07 hypre-2.33.0/src/test/TEST_sstruct/sstruct_struct.sh000077500000000000000000000061471477326011500225320ustar00rootroot00000000000000#!/bin/bash # Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) TNAME=`basename $0 .sh` RTOL=$1 ATOL=$2 #============================================================================= # Compare the struct solvers called from sstruct & struct interfaces #============================================================================= tail -3 ${TNAME}.out.0 > ${TNAME}.testdata tail -3 ${TNAME}.out.200 > ${TNAME}.testdata.temp diff ${TNAME}.testdata ${TNAME}.testdata.temp >&2 #============================================================================= tail -3 ${TNAME}.out.1 > ${TNAME}.testdata tail -3 ${TNAME}.out.201 > ${TNAME}.testdata.temp diff ${TNAME}.testdata ${TNAME}.testdata.temp >&2 #============================================================================= tail -3 ${TNAME}.out.2D > ${TNAME}.testdata tail -3 ${TNAME}.out.3Dx > ${TNAME}.testdata.temp diff ${TNAME}.testdata ${TNAME}.testdata.temp >&2 tail -3 ${TNAME}.out.3Dy > ${TNAME}.testdata.temp diff ${TNAME}.testdata ${TNAME}.testdata.temp >&2 tail -3 ${TNAME}.out.3Dz > ${TNAME}.testdata.temp diff ${TNAME}.testdata ${TNAME}.testdata.temp >&2 #============================================================================= # Compare 19pt, 7pt, positive, and negative definite #============================================================================= tail -3 ${TNAME}.out.10 > ${TNAME}.testdata tail -3 ${TNAME}.out.11 > ${TNAME}.testdata.temp diff ${TNAME}.testdata ${TNAME}.testdata.temp >&2 tail -3 ${TNAME}.out.12 > ${TNAME}.testdata.temp diff ${TNAME}.testdata ${TNAME}.testdata.temp >&2 tail -3 ${TNAME}.out.13 > ${TNAME}.testdata.temp diff ${TNAME}.testdata ${TNAME}.testdata.temp >&2 tail -3 ${TNAME}.out.15 > ${TNAME}.testdata tail -3 ${TNAME}.out.16 > ${TNAME}.testdata.temp diff ${TNAME}.testdata ${TNAME}.testdata.temp >&2 tail -3 ${TNAME}.out.17 > ${TNAME}.testdata.temp diff ${TNAME}.testdata ${TNAME}.testdata.temp >&2 tail -3 ${TNAME}.out.18 > ${TNAME}.testdata.temp diff ${TNAME}.testdata ${TNAME}.testdata.temp >&2 #============================================================================= # compare with baseline case #============================================================================= FILES="\ ${TNAME}.out.0\ ${TNAME}.out.1\ ${TNAME}.out.200\ ${TNAME}.out.201\ ${TNAME}.out.2D\ ${TNAME}.out.3Dx\ ${TNAME}.out.3Dy\ ${TNAME}.out.3Dz\ ${TNAME}.out.10\ ${TNAME}.out.11\ ${TNAME}.out.12\ ${TNAME}.out.13\ ${TNAME}.out.15\ ${TNAME}.out.16\ ${TNAME}.out.17\ ${TNAME}.out.18\ " for i in $FILES do echo "# Output file: $i" tail -3 $i done > ${TNAME}.out # Make sure that the output file is reasonable RUNCOUNT=`echo $FILES | wc -w` OUTCOUNT=`grep "Iterations" ${TNAME}.out | wc -l` if [ "$OUTCOUNT" != "$RUNCOUNT" ]; then echo "Incorrect number of runs in ${TNAME}.out" >&2 fi #============================================================================= # remove temporary files #============================================================================= rm -f ${TNAME}.testdata* hypre-2.33.0/src/test/TEST_sstruct/symm.jobs000077500000000000000000000041151477326011500207200ustar00rootroot00000000000000#!/bin/bash # Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) #============================================================================= # sstruct: Check SetSymmetric for HYPRE_SSTRUCT data type (2D) #============================================================================= mpirun -np 1 ./sstruct -in sstruct.in.symm0.2D -r 10 10 10 -solver 18 \ > symm.out.20 mpirun -np 1 ./sstruct -in sstruct.in.symm1.2D -r 10 10 10 -solver 18 \ > symm.out.21 mpirun -np 1 ./sstruct -in sstruct.in.symm2.2D -r 10 10 10 -solver 18 \ > symm.out.22 mpirun -np 1 ./sstruct -in sstruct.in.symm3.2D -r 10 10 10 -solver 18 \ > symm.out.23 #============================================================================= # sstruct: Check SetSymmetric for HYPRE_PARCSR data type (2D) #============================================================================= mpirun -np 1 ./sstruct -in sstruct.in.symm0.2D -r 10 10 10 -solver 28 \ > symm.out.24 mpirun -np 1 ./sstruct -in sstruct.in.symm1.2D -r 10 10 10 -solver 28 \ > symm.out.25 #============================================================================= # sstruct: Check SetSymmetric for HYPRE_SSTRUCT data type (3D) #============================================================================= mpirun -np 1 ./sstruct -in sstruct.in.symm0 -r 10 10 10 -solver 18 \ > symm.out.30 mpirun -np 1 ./sstruct -in sstruct.in.symm1 -r 10 10 10 -solver 18 \ > symm.out.31 mpirun -np 1 ./sstruct -in sstruct.in.symm2 -r 10 10 10 -solver 18 \ > symm.out.32 mpirun -np 1 ./sstruct -in sstruct.in.symm3 -r 10 10 10 -solver 18 \ > symm.out.33 #============================================================================= # sstruct: Check SetSymmetric for HYPRE_PARCSR data type (3D) #============================================================================= mpirun -np 1 ./sstruct -in sstruct.in.symm0 -r 10 10 10 -solver 28 \ > symm.out.34 mpirun -np 1 ./sstruct -in sstruct.in.symm1 -r 10 10 10 -solver 28 \ > symm.out.35 hypre-2.33.0/src/test/TEST_sstruct/symm.saved000066400000000000000000000020401477326011500210550ustar00rootroot00000000000000# Output file: symm.out.20 Iterations = 54 Final Relative Residual Norm = 7.004841e-07 # Output file: symm.out.21 Iterations = 54 Final Relative Residual Norm = 7.004841e-07 # Output file: symm.out.22 Iterations = 54 Final Relative Residual Norm = 7.004841e-07 # Output file: symm.out.23 Iterations = 54 Final Relative Residual Norm = 7.004841e-07 # Output file: symm.out.24 Iterations = 54 Final Relative Residual Norm = 7.004841e-07 # Output file: symm.out.25 Iterations = 54 Final Relative Residual Norm = 7.004841e-07 # Output file: symm.out.30 Iterations = 63 Final Relative Residual Norm = 9.483596e-07 # Output file: symm.out.31 Iterations = 63 Final Relative Residual Norm = 9.483596e-07 # Output file: symm.out.32 Iterations = 63 Final Relative Residual Norm = 9.483596e-07 # Output file: symm.out.33 Iterations = 63 Final Relative Residual Norm = 9.483596e-07 # Output file: symm.out.34 Iterations = 63 Final Relative Residual Norm = 9.483596e-07 # Output file: symm.out.35 Iterations = 63 Final Relative Residual Norm = 9.483596e-07 hypre-2.33.0/src/test/TEST_sstruct/symm.saved.lassen000066400000000000000000000020401477326011500223410ustar00rootroot00000000000000# Output file: symm.out.20 Iterations = 54 Final Relative Residual Norm = 7.004841e-07 # Output file: symm.out.21 Iterations = 54 Final Relative Residual Norm = 7.004841e-07 # Output file: symm.out.22 Iterations = 54 Final Relative Residual Norm = 7.004841e-07 # Output file: symm.out.23 Iterations = 54 Final Relative Residual Norm = 7.004841e-07 # Output file: symm.out.24 Iterations = 54 Final Relative Residual Norm = 7.004841e-07 # Output file: symm.out.25 Iterations = 54 Final Relative Residual Norm = 7.004841e-07 # Output file: symm.out.30 Iterations = 63 Final Relative Residual Norm = 9.483596e-07 # Output file: symm.out.31 Iterations = 63 Final Relative Residual Norm = 9.483596e-07 # Output file: symm.out.32 Iterations = 63 Final Relative Residual Norm = 9.483596e-07 # Output file: symm.out.33 Iterations = 63 Final Relative Residual Norm = 9.483596e-07 # Output file: symm.out.34 Iterations = 63 Final Relative Residual Norm = 9.483596e-07 # Output file: symm.out.35 Iterations = 63 Final Relative Residual Norm = 9.483596e-07 hypre-2.33.0/src/test/TEST_sstruct/symm.saved.lassen_cpu000066400000000000000000000020401477326011500232100ustar00rootroot00000000000000# Output file: symm.out.20 Iterations = 54 Final Relative Residual Norm = 7.004841e-07 # Output file: symm.out.21 Iterations = 54 Final Relative Residual Norm = 7.004841e-07 # Output file: symm.out.22 Iterations = 54 Final Relative Residual Norm = 7.004841e-07 # Output file: symm.out.23 Iterations = 54 Final Relative Residual Norm = 7.004841e-07 # Output file: symm.out.24 Iterations = 54 Final Relative Residual Norm = 7.004841e-07 # Output file: symm.out.25 Iterations = 54 Final Relative Residual Norm = 7.004841e-07 # Output file: symm.out.30 Iterations = 63 Final Relative Residual Norm = 9.483596e-07 # Output file: symm.out.31 Iterations = 63 Final Relative Residual Norm = 9.483596e-07 # Output file: symm.out.32 Iterations = 63 Final Relative Residual Norm = 9.483596e-07 # Output file: symm.out.33 Iterations = 63 Final Relative Residual Norm = 9.483596e-07 # Output file: symm.out.34 Iterations = 63 Final Relative Residual Norm = 9.483596e-07 # Output file: symm.out.35 Iterations = 63 Final Relative Residual Norm = 9.483596e-07 hypre-2.33.0/src/test/TEST_sstruct/symm.sh000077500000000000000000000064441477326011500204040ustar00rootroot00000000000000#!/bin/bash # Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) TNAME=`basename $0 .sh` RTOL=$1 ATOL=$2 #============================================================================= # sstruct: Check SetSymmetric for HYPRE_SSTRUCT data type (2D) #============================================================================= tail -3 ${TNAME}.out.20 > ${TNAME}.testdata tail -3 ${TNAME}.out.21 > ${TNAME}.testdata.temp diff ${TNAME}.testdata ${TNAME}.testdata.temp >&2 #============================================================================= tail -3 ${TNAME}.out.22 > ${TNAME}.testdata.temp diff ${TNAME}.testdata ${TNAME}.testdata.temp >&2 #============================================================================= tail -3 ${TNAME}.out.23 > ${TNAME}.testdata.temp diff ${TNAME}.testdata ${TNAME}.testdata.temp >&2 #============================================================================= # sstruct: Check SetSymmetric for HYPRE_PARCSR data type (2D) #============================================================================= tail -3 ${TNAME}.out.24 > ${TNAME}.testdata tail -3 ${TNAME}.out.25 > ${TNAME}.testdata.temp diff ${TNAME}.testdata ${TNAME}.testdata.temp >&2 #============================================================================= # sstruct: Check SetSymmetric for HYPRE_SSTRUCT data type (3D) #============================================================================= tail -3 ${TNAME}.out.30 > ${TNAME}.testdata tail -3 ${TNAME}.out.31 > ${TNAME}.testdata.temp diff ${TNAME}.testdata ${TNAME}.testdata.temp >&2 #============================================================================= tail -3 ${TNAME}.out.32 > ${TNAME}.testdata.temp diff ${TNAME}.testdata ${TNAME}.testdata.temp >&2 #============================================================================= tail -3 ${TNAME}.out.33 > ${TNAME}.testdata.temp diff ${TNAME}.testdata ${TNAME}.testdata.temp >&2 #============================================================================= # sstruct: Check SetSymmetric for HYPRE_PARCSR data type (3D) #============================================================================= tail -3 ${TNAME}.out.34 > ${TNAME}.testdata tail -3 ${TNAME}.out.35 > ${TNAME}.testdata.temp diff ${TNAME}.testdata ${TNAME}.testdata.temp >&2 #============================================================================= # compare with baseline case #============================================================================= FILES="\ ${TNAME}.out.20\ ${TNAME}.out.21\ ${TNAME}.out.22\ ${TNAME}.out.23\ ${TNAME}.out.24\ ${TNAME}.out.25\ ${TNAME}.out.30\ ${TNAME}.out.31\ ${TNAME}.out.32\ ${TNAME}.out.33\ ${TNAME}.out.34\ ${TNAME}.out.35\ " for i in $FILES do echo "# Output file: $i" tail -3 $i done > ${TNAME}.out # Make sure that the output file is reasonable RUNCOUNT=`echo $FILES | wc -w` OUTCOUNT=`grep "Iterations" ${TNAME}.out | wc -l` if [ "$OUTCOUNT" != "$RUNCOUNT" ]; then echo "Incorrect number of runs in ${TNAME}.out" >&2 fi #============================================================================= # remove temporary files #============================================================================= rm -f ${TNAME}.testdata* hypre-2.33.0/src/test/TEST_sstruct/versioncheck.jobs000077500000000000000000000007071477326011500224210ustar00rootroot00000000000000#!/bin/bash # Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) #============================================================================= # Check the version header file variables #============================================================================= mpirun -np 1 ./sstruct > versioncheck.out.1 hypre-2.33.0/src/test/TEST_sstruct/versioncheck.sh000077500000000000000000000025001477326011500220670ustar00rootroot00000000000000#!/bin/bash # Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) TNAME=`basename $0 .sh` #============================================================================= # Check the HYPRE_DEVELOP variables #============================================================================= grep "Using HYPRE_DEVELOP_STRING" ${TNAME}.out.1 > ${TNAME}.testdata echo -n > ${TNAME}.testdatacheck if [ -d ../../../.git ]; then DEVSTRING=`git describe --match 'v*' --long --abbrev=9 2>/dev/null` DEVNUMBER=`echo $DEVSTRING | awk -F- '{print $2}'` DEVBRANCH=`git rev-parse --abbrev-ref HEAD` if [ -n "$DEVSTRING" ]; then if [ "$DEVBRANCH" != "master" ]; then echo "Using HYPRE_DEVELOP_STRING: $DEVSTRING (branch $DEVBRANCH; not the develop branch)" \ > ${TNAME}.testdatacheck else echo "Using HYPRE_DEVELOP_STRING: $DEVSTRING (branch $DEVBRANCH; the develop branch)" \ > ${TNAME}.testdatacheck fi fi fi diff ${TNAME}.testdata ${TNAME}.testdatacheck >&2 #============================================================================= # remove temporary files #============================================================================= rm -f ${TNAME}.testdata* hypre-2.33.0/src/test/TEST_sstruct/wide.jobs000077500000000000000000000006121477326011500206610ustar00rootroot00000000000000#!/bin/bash # Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) mpirun -np 1 ./sstruct -in sstruct.in.wide.2D -r 10 10 1 -P 1 1 1 -solver 239 > wide.out.1 mpirun -np 4 ./sstruct -in sstruct.in.wide.2D -r 5 5 1 -P 2 2 1 -solver 239 > wide.out.4 hypre-2.33.0/src/test/TEST_sstruct/wide.saved000066400000000000000000000002561477326011500210270ustar00rootroot00000000000000# Output file: wide.out.1 Iterations = 49 Final Relative Residual Norm = 9.478906e-07 # Output file: wide.out.4 Iterations = 49 Final Relative Residual Norm = 9.478906e-07 hypre-2.33.0/src/test/TEST_sstruct/wide.saved.lassen000066400000000000000000000002561477326011500223130ustar00rootroot00000000000000# Output file: wide.out.1 Iterations = 49 Final Relative Residual Norm = 9.478906e-07 # Output file: wide.out.4 Iterations = 49 Final Relative Residual Norm = 9.478906e-07 hypre-2.33.0/src/test/TEST_sstruct/wide.saved.lassen_cpu000066400000000000000000000002561477326011500231620ustar00rootroot00000000000000# Output file: wide.out.1 Iterations = 49 Final Relative Residual Norm = 9.478906e-07 # Output file: wide.out.4 Iterations = 49 Final Relative Residual Norm = 9.478906e-07 hypre-2.33.0/src/test/TEST_sstruct/wide.sh000077500000000000000000000024631477326011500203440ustar00rootroot00000000000000#!/bin/bash # Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) TNAME=`basename $0 .sh` RTOL=$1 ATOL=$2 #============================================================================= # sstruct: Test wide stencils #============================================================================= tail -3 ${TNAME}.out.1 > ${TNAME}.testdata tail -3 ${TNAME}.out.4 > ${TNAME}.testdata.temp diff ${TNAME}.testdata ${TNAME}.testdata.temp >&2 #============================================================================= # compare with baseline case #============================================================================= FILES="\ ${TNAME}.out.1\ ${TNAME}.out.4\ " for i in $FILES do echo "# Output file: $i" tail -3 $i done > ${TNAME}.out # Make sure that the output file is reasonable RUNCOUNT=`echo $FILES | wc -w` OUTCOUNT=`grep "Iterations" ${TNAME}.out | wc -l` if [ "$OUTCOUNT" != "$RUNCOUNT" ]; then echo "Incorrect number of runs in ${TNAME}.out" >&2 fi #============================================================================= # remove temporary files #============================================================================= rm -f ${TNAME}.testdata* hypre-2.33.0/src/test/TEST_sstruct/zcube.jobs000077500000000000000000000006151477326011500210440ustar00rootroot00000000000000#!/bin/bash # Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) mpirun -np 1 ./sstruct -in zsstruct.in.cube -r 10 10 10 -rhsone -solver 28 \ > zcube.out.0 mpirun -np 1 ./sstruct -in zsstruct.in.bcube -r 10 10 10 -rhsone -solver 28 \ > zcube.out.1 hypre-2.33.0/src/test/TEST_sstruct/zcube.saved000066400000000000000000000002601477326011500212020ustar00rootroot00000000000000# Output file: zcube.out.0 Iterations = 43 Final Relative Residual Norm = 9.942224e-07 # Output file: zcube.out.1 Iterations = 43 Final Relative Residual Norm = 9.942224e-07 hypre-2.33.0/src/test/TEST_sstruct/zcube.saved.lassen000066400000000000000000000002601477326011500224660ustar00rootroot00000000000000# Output file: zcube.out.0 Iterations = 43 Final Relative Residual Norm = 9.942224e-07 # Output file: zcube.out.1 Iterations = 43 Final Relative Residual Norm = 9.942224e-07 hypre-2.33.0/src/test/TEST_sstruct/zcube.saved.lassen_cpu000066400000000000000000000002601477326011500233350ustar00rootroot00000000000000# Output file: zcube.out.0 Iterations = 43 Final Relative Residual Norm = 9.942224e-07 # Output file: zcube.out.1 Iterations = 43 Final Relative Residual Norm = 9.942224e-07 hypre-2.33.0/src/test/TEST_sstruct/zcube.sh000077500000000000000000000026041477326011500205210ustar00rootroot00000000000000#!/bin/bash # Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) TNAME=`basename $0 .sh` RTOL=$1 ATOL=$2 #============================================================================= # sstruct: Test SetNeighborBox by comparing one-part problem # against equivalent multi-part problems #============================================================================= tail -3 ${TNAME}.out.0 > ${TNAME}.testdata tail -3 ${TNAME}.out.1 > ${TNAME}.testdata.temp diff ${TNAME}.testdata ${TNAME}.testdata.temp >&2 #============================================================================= # compare with baseline case #============================================================================= FILES="\ ${TNAME}.out.0\ ${TNAME}.out.1\ " for i in $FILES do echo "# Output file: $i" tail -3 $i done > ${TNAME}.out # Make sure that the output file is reasonable RUNCOUNT=`echo $FILES | wc -w` OUTCOUNT=`grep "Iterations" ${TNAME}.out | wc -l` if [ "$OUTCOUNT" != "$RUNCOUNT" ]; then echo "Incorrect number of runs in ${TNAME}.out" >&2 fi #============================================================================= # remove temporary files #============================================================================= rm -f ${TNAME}.testdata* hypre-2.33.0/src/test/TEST_sstruct/zsstruct.in.bcube000066400000000000000000000033631477326011500223650ustar00rootroot00000000000000# Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) ########################################################### # GridCreate: ndim nparts GridCreate: 3 2 # GridSetExtents: part ilower(ndim) iupper(ndim) GridSetExtents: 0 (1- 1- 1-) (2+ 2+ 1+) GridSetExtents: 1 (1- 1- 1-) (2+ 2+ 1+) # GridSetVariables: part nvars vartypes[nvars] # NODE = 1 GridSetVariables: 0 1 [1] GridSetVariables: 1 1 [1] # GridSetNeighborPart: part ilower(ndim) iupper(ndim) \ # nbor_part nbor_ilower(ndim) nbor_iupper(ndim) \ # index_map[ndim] index_dir[ndim] GridSetNeighborPart: 0 (0- 0- 2-) (3+ 3+ 2-) 1 (0- 0- 1-) (3+ 3+ 1-) [0 1 2] [1 1 1] GridSetNeighborPart: 1 (0- 0- 0+) (3+ 3+ 0+) 0 (0- 0- 1+) (3+ 3+ 1+) [0 1 2] [1 1 1] ########################################################### # StencilCreate: nstencils sizes[nstencils] StencilCreate: 1 [7] # StencilSetEntry: stencil_num entry offset[ndim] var value StencilSetEntry: 0 0 [ 0 0 0] 0 6.0 StencilSetEntry: 0 1 [-1 0 0] 0 -1.0 StencilSetEntry: 0 2 [ 1 0 0] 0 -1.0 StencilSetEntry: 0 3 [ 0 -1 0] 0 -1.0 StencilSetEntry: 0 4 [ 0 1 0] 0 -1.0 StencilSetEntry: 0 5 [ 0 0 -1] 0 -1.0 StencilSetEntry: 0 6 [ 0 0 1] 0 -1.0 ########################################################### # GraphSetStencil: part var stencil_num GraphSetStencil: 0 0 0 GraphSetStencil: 1 0 0 ########################################################### # ProcessPoolCreate: num_pools ProcessPoolCreate: 1 # ProcessPoolSetPart: pool part ProcessPoolSetPart: 0 0 ProcessPoolSetPart: 0 1 ########################################################### hypre-2.33.0/src/test/TEST_sstruct/zsstruct.in.cube000066400000000000000000000024271477326011500222230ustar00rootroot00000000000000# Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) ########################################################### # GridCreate: ndim nparts GridCreate: 3 1 # GridSetExtents: part ilower(ndim) iupper(ndim) GridSetExtents: 0 (1- 1- 1-) (2+ 2+ 2+) # GridSetVariables: part nvars vartypes[nvars] # NODE = 1 GridSetVariables: 0 1 [1] ########################################################### # StencilCreate: nstencils sizes[nstencils] StencilCreate: 1 [7] # StencilSetEntry: stencil_num entry offset[ndim] var value StencilSetEntry: 0 0 [ 0 0 0] 0 6.0 StencilSetEntry: 0 1 [-1 0 0] 0 -1.0 StencilSetEntry: 0 2 [ 1 0 0] 0 -1.0 StencilSetEntry: 0 3 [ 0 -1 0] 0 -1.0 StencilSetEntry: 0 4 [ 0 1 0] 0 -1.0 StencilSetEntry: 0 5 [ 0 0 -1] 0 -1.0 StencilSetEntry: 0 6 [ 0 0 1] 0 -1.0 ########################################################### # GraphSetStencil: part var stencil_num GraphSetStencil: 0 0 0 ########################################################### # ProcessPoolCreate: num_pools ProcessPoolCreate: 1 # ProcessPoolSetPart: pool part ProcessPoolSetPart: 0 0 ########################################################### hypre-2.33.0/src/test/TEST_struct/000077500000000000000000000000001477326011500166655ustar00rootroot00000000000000hypre-2.33.0/src/test/TEST_struct/.psrc000066400000000000000000000002131477326011500176310ustar00rootroot00000000000000insure++.report_file insure.log insure++.report_overwrite false insure++.summarize leaks outstanding insure++.suppress EXPR_NULL,PARM_NULL hypre-2.33.0/src/test/TEST_struct/cgpfmg3d.jobs000077500000000000000000000014251477326011500212430ustar00rootroot00000000000000#!/bin/bash # Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) #============================================================================= # struct: Run CG+PFMG with skip base 3d case #============================================================================= mpirun -np 1 ./struct -n 12 12 12 -solver 11 -skip 1 \ > cgpfmg3d.out.0 #============================================================================= # struct: Run CG+PFMG with skip parallel and blocking #============================================================================= mpirun -np 8 ./struct -n 3 3 3 -b 2 2 2 -P 2 2 2 -solver 11 -skip 1 \ > cgpfmg3d.out.1 hypre-2.33.0/src/test/TEST_struct/cgpfmg3d.saved000066400000000000000000000002641477326011500214050ustar00rootroot00000000000000# Output file: cgpfmg3d.out.0 Iterations = 9 Final Relative Residual Norm = 4.287624e-07 # Output file: cgpfmg3d.out.1 Iterations = 9 Final Relative Residual Norm = 4.287624e-07 hypre-2.33.0/src/test/TEST_struct/cgpfmg3d.saved.florentia000066400000000000000000000002641477326011500233670ustar00rootroot00000000000000# Output file: cgpfmg3d.out.0 Iterations = 9 Final Relative Residual Norm = 4.287624e-07 # Output file: cgpfmg3d.out.1 Iterations = 9 Final Relative Residual Norm = 4.287624e-07 hypre-2.33.0/src/test/TEST_struct/cgpfmg3d.saved.lassen000066400000000000000000000002641477326011500226710ustar00rootroot00000000000000# Output file: cgpfmg3d.out.0 Iterations = 9 Final Relative Residual Norm = 4.287624e-07 # Output file: cgpfmg3d.out.1 Iterations = 9 Final Relative Residual Norm = 4.287624e-07 hypre-2.33.0/src/test/TEST_struct/cgpfmg3d.saved.lassen_cpu000066400000000000000000000002641477326011500235400ustar00rootroot00000000000000# Output file: cgpfmg3d.out.0 Iterations = 9 Final Relative Residual Norm = 4.287624e-07 # Output file: cgpfmg3d.out.1 Iterations = 9 Final Relative Residual Norm = 4.287624e-07 hypre-2.33.0/src/test/TEST_struct/cgpfmg3d.saved.tioga000066400000000000000000000002641477326011500225070ustar00rootroot00000000000000# Output file: cgpfmg3d.out.0 Iterations = 9 Final Relative Residual Norm = 4.287624e-07 # Output file: cgpfmg3d.out.1 Iterations = 9 Final Relative Residual Norm = 4.287624e-07 hypre-2.33.0/src/test/TEST_struct/cgpfmg3d.sh000077500000000000000000000025561477326011500207260ustar00rootroot00000000000000#!/bin/bash # Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) TNAME=`basename $0 .sh` RTOL=$1 ATOL=$2 #============================================================================= # struct: Test CG+PFMG with skip parallel and blocking by diffing against # base 3d case #============================================================================= tail -3 ${TNAME}.out.0 > ${TNAME}.testdata tail -3 ${TNAME}.out.1 > ${TNAME}.testdata.temp diff ${TNAME}.testdata ${TNAME}.testdata.temp >&2 #============================================================================= # compare with baseline case #============================================================================= FILES="\ ${TNAME}.out.0\ ${TNAME}.out.1\ " for i in $FILES do echo "# Output file: $i" tail -3 $i done > ${TNAME}.out # Make sure that the output file is reasonable RUNCOUNT=`echo $FILES | wc -w` OUTCOUNT=`grep "Iterations" ${TNAME}.out | wc -l` if [ "$OUTCOUNT" != "$RUNCOUNT" ]; then echo "Incorrect number of runs in ${TNAME}.out" >&2 fi #============================================================================= # remove temporary files #============================================================================= rm -f ${TNAME}.testdata* hypre-2.33.0/src/test/TEST_struct/emptyproc.jobs000077500000000000000000000074201477326011500215740ustar00rootroot00000000000000#!/bin/bash # Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) #============================================================================= # Test solvers with some processors having no data #============================================================================= # SMG mpirun -np 4 ./struct -n 12 12 12 -P 2 1 2 -solver 0 > emptyproc.out.00a mpirun -np 6 ./struct -n 12 12 12 -P 2 1 2 -solver 0 > emptyproc.out.00a.a mpirun -np 7 ./struct -n 6 6 6 -b 2 2 2 -P 2 1 2 -solver 0 > emptyproc.out.00a.b # PFMG mpirun -np 4 ./struct -n 12 12 12 -P 2 2 1 -solver 1 > emptyproc.out.01a mpirun -np 6 ./struct -n 12 12 12 -P 2 2 1 -solver 1 > emptyproc.out.01a.a mpirun -np 7 ./struct -n 6 6 6 -b 2 2 2 -P 2 2 1 -solver 1 > emptyproc.out.01a.b # non-Galerkin mpirun -np 4 ./struct -n 12 12 12 -P 2 2 1 -rap 1 -skip 1 -relax 2 -solver 1 \ > emptyproc.out.01b mpirun -np 7 ./struct -n 12 12 12 -P 2 2 1 -rap 1 -skip 1 -relax 2 -solver 1 \ > emptyproc.out.01b.a # PFMG constant 3 mpirun -np 4 ./struct -n 12 12 12 -P 2 2 1 -solver 3 > emptyproc.out.03a mpirun -np 6 ./struct -n 12 12 12 -P 2 2 1 -solver 3 > emptyproc.out.03a.a mpirun -np 7 ./struct -n 6 6 6 -b 2 2 2 -P 2 2 1 -solver 3 > emptyproc.out.03a.b # non-Galerkin mpirun -np 4 ./struct -n 12 12 12 -P 2 2 1 -rap 1 -skip 1 -relax 2 -solver 3 \ > emptyproc.out.03b mpirun -np 7 ./struct -n 12 12 12 -P 2 2 1 -rap 1 -skip 1 -relax 2 -solver 3 \ > emptyproc.out.03b.a # PFMG constant 4 mpirun -np 4 ./struct -n 12 12 12 -P 2 2 1 -solver 4 > emptyproc.out.04a mpirun -np 6 ./struct -n 12 12 12 -P 2 2 1 -solver 4 > emptyproc.out.04a.a mpirun -np 7 ./struct -n 6 6 6 -b 2 2 2 -P 2 2 1 -solver 4 > emptyproc.out.04a.b # non-Galerkin mpirun -np 4 ./struct -n 12 12 12 -P 2 2 1 -rap 1 -skip 1 -relax 2 -solver 4 \ > emptyproc.out.04b mpirun -np 7 ./struct -n 12 12 12 -P 2 2 1 -rap 1 -skip 1 -relax 2 -solver 4 \ > emptyproc.out.04b.a # PFMG-CG mpirun -np 4 ./struct -n 12 12 12 -P 2 2 1 -solver 11 > emptyproc.out.11a mpirun -np 7 ./struct -n 12 12 12 -P 2 2 1 -solver 11 > emptyproc.out.11a.a # PFMG-CG constant 3 mpirun -np 4 ./struct -n 12 12 12 -P 2 2 1 -solver 13 > emptyproc.out.13a mpirun -np 7 ./struct -n 12 12 12 -P 2 2 1 -solver 13 > emptyproc.out.13a.a # PFMG-CG constant 4 mpirun -np 4 ./struct -n 12 12 12 -P 2 2 1 -solver 14 > emptyproc.out.14a mpirun -np 7 ./struct -n 12 12 12 -P 2 2 1 -solver 14 > emptyproc.out.14a.a # Jacobi-CG mpirun -np 4 ./struct -n 10 10 10 -P 1 2 2 -solver 17 > emptyproc.out.17a mpirun -np 7 ./struct -n 10 10 10 -P 1 2 2 -solver 17 > emptyproc.out.17a.a # DS-CG mpirun -np 4 ./struct -n 11 11 11 -P 1 2 2 -solver 18 > emptyproc.out.18a mpirun -np 7 ./struct -n 11 11 11 -P 1 2 2 -solver 18 > emptyproc.out.18a.a # Hybrid PFMG mpirun -np 4 ./struct -n 10 10 10 -P 1 2 2 -solver 21 > emptyproc.out.21a mpirun -np 7 ./struct -n 10 10 10 -P 1 2 2 -solver 21 > emptyproc.out.21a.a # PFMG-GMRES mpirun -np 4 ./struct -n 11 11 11 -P 2 2 1 -solver 31 > emptyproc.out.31a mpirun -np 7 ./struct -n 11 11 11 -P 2 2 1 -solver 31 > emptyproc.out.31a.a # PFMG-BiCGSTAB mpirun -np 4 ./struct -n 11 11 11 -P 2 2 1 -solver 41 > emptyproc.out.41a mpirun -np 7 ./struct -n 11 11 11 -P 2 2 1 -solver 41 > emptyproc.out.41a.a # PFMG-LGMRES mpirun -np 4 ./struct -n 11 11 11 -P 2 2 1 -solver 51 > emptyproc.out.51a mpirun -np 7 ./struct -n 11 11 11 -P 2 2 1 -solver 51 > emptyproc.out.51a.a # PFMG-FlexGMRES mpirun -np 4 ./struct -n 11 11 11 -P 2 2 1 -solver 61 > emptyproc.out.61a mpirun -np 7 ./struct -n 11 11 11 -P 2 2 1 -solver 61 > emptyproc.out.61a.a hypre-2.33.0/src/test/TEST_struct/emptyproc.saved000066400000000000000000000030671477326011500217410ustar00rootroot00000000000000# Output file: emptyproc.out.00a Iterations = 6 Final Relative Residual Norm = 1.883632e-07 # Output file: emptyproc.out.01a Iterations = 16 Final Relative Residual Norm = 5.557193e-07 # Output file: emptyproc.out.01b Iterations = 17 Final Relative Residual Norm = 6.926794e-07 # Output file: emptyproc.out.03a Iterations = 23 Final Relative Residual Norm = 9.157321e-07 # Output file: emptyproc.out.03b Iterations = 20 Final Relative Residual Norm = 6.594761e-07 # Output file: emptyproc.out.04a Iterations = 15 Final Relative Residual Norm = 9.712834e-07 # Output file: emptyproc.out.04b Iterations = 15 Final Relative Residual Norm = 9.646051e-07 # Output file: emptyproc.out.11a Iterations = 8 Final Relative Residual Norm = 9.301342e-07 # Output file: emptyproc.out.13a Iterations = 11 Final Relative Residual Norm = 3.054686e-07 # Output file: emptyproc.out.14a Iterations = 8 Final Relative Residual Norm = 6.561630e-07 # Output file: emptyproc.out.17a Iterations = 20 Final Relative Residual Norm = 6.766509e-07 # Output file: emptyproc.out.18a Iterations = 42 Final Relative Residual Norm = 7.820632e-07 # Output file: emptyproc.out.21a Iterations = 11 Final Relative Residual Norm = 5.851154e-07 # Output file: emptyproc.out.31a Iterations = 9 Final Relative Residual Norm = 1.848351e-07 # Output file: emptyproc.out.41a Iterations = 5 Final Relative Residual Norm = 1.853522e-07 # Output file: emptyproc.out.51a Iterations = 9 Final Relative Residual Norm = 1.848351e-07 # Output file: emptyproc.out.61a Iterations = 9 Final Relative Residual Norm = 1.848351e-07 hypre-2.33.0/src/test/TEST_struct/emptyproc.saved.florentia000066400000000000000000000030671477326011500237230ustar00rootroot00000000000000# Output file: emptyproc.out.00a Iterations = 6 Final Relative Residual Norm = 1.883632e-07 # Output file: emptyproc.out.01a Iterations = 16 Final Relative Residual Norm = 5.557193e-07 # Output file: emptyproc.out.01b Iterations = 17 Final Relative Residual Norm = 6.926794e-07 # Output file: emptyproc.out.03a Iterations = 23 Final Relative Residual Norm = 9.157321e-07 # Output file: emptyproc.out.03b Iterations = 20 Final Relative Residual Norm = 6.594761e-07 # Output file: emptyproc.out.04a Iterations = 15 Final Relative Residual Norm = 9.712834e-07 # Output file: emptyproc.out.04b Iterations = 15 Final Relative Residual Norm = 9.646051e-07 # Output file: emptyproc.out.11a Iterations = 8 Final Relative Residual Norm = 9.301342e-07 # Output file: emptyproc.out.13a Iterations = 11 Final Relative Residual Norm = 3.054686e-07 # Output file: emptyproc.out.14a Iterations = 8 Final Relative Residual Norm = 6.561630e-07 # Output file: emptyproc.out.17a Iterations = 20 Final Relative Residual Norm = 6.766509e-07 # Output file: emptyproc.out.18a Iterations = 42 Final Relative Residual Norm = 7.820632e-07 # Output file: emptyproc.out.21a Iterations = 11 Final Relative Residual Norm = 5.851154e-07 # Output file: emptyproc.out.31a Iterations = 9 Final Relative Residual Norm = 1.848351e-07 # Output file: emptyproc.out.41a Iterations = 5 Final Relative Residual Norm = 1.853522e-07 # Output file: emptyproc.out.51a Iterations = 9 Final Relative Residual Norm = 1.848351e-07 # Output file: emptyproc.out.61a Iterations = 9 Final Relative Residual Norm = 1.848351e-07 hypre-2.33.0/src/test/TEST_struct/emptyproc.saved.lassen000066400000000000000000000030671477326011500232250ustar00rootroot00000000000000# Output file: emptyproc.out.00a Iterations = 6 Final Relative Residual Norm = 1.883632e-07 # Output file: emptyproc.out.01a Iterations = 16 Final Relative Residual Norm = 5.557193e-07 # Output file: emptyproc.out.01b Iterations = 17 Final Relative Residual Norm = 6.926794e-07 # Output file: emptyproc.out.03a Iterations = 23 Final Relative Residual Norm = 9.157321e-07 # Output file: emptyproc.out.03b Iterations = 20 Final Relative Residual Norm = 6.594761e-07 # Output file: emptyproc.out.04a Iterations = 15 Final Relative Residual Norm = 9.712834e-07 # Output file: emptyproc.out.04b Iterations = 15 Final Relative Residual Norm = 9.646051e-07 # Output file: emptyproc.out.11a Iterations = 8 Final Relative Residual Norm = 9.301342e-07 # Output file: emptyproc.out.13a Iterations = 11 Final Relative Residual Norm = 3.054686e-07 # Output file: emptyproc.out.14a Iterations = 8 Final Relative Residual Norm = 6.561630e-07 # Output file: emptyproc.out.17a Iterations = 20 Final Relative Residual Norm = 6.766509e-07 # Output file: emptyproc.out.18a Iterations = 42 Final Relative Residual Norm = 7.820632e-07 # Output file: emptyproc.out.21a Iterations = 11 Final Relative Residual Norm = 5.851154e-07 # Output file: emptyproc.out.31a Iterations = 9 Final Relative Residual Norm = 1.848351e-07 # Output file: emptyproc.out.41a Iterations = 5 Final Relative Residual Norm = 1.853522e-07 # Output file: emptyproc.out.51a Iterations = 9 Final Relative Residual Norm = 1.848351e-07 # Output file: emptyproc.out.61a Iterations = 9 Final Relative Residual Norm = 1.848351e-07 hypre-2.33.0/src/test/TEST_struct/emptyproc.saved.lassen_cpu000066400000000000000000000030671477326011500240740ustar00rootroot00000000000000# Output file: emptyproc.out.00a Iterations = 6 Final Relative Residual Norm = 1.883632e-07 # Output file: emptyproc.out.01a Iterations = 16 Final Relative Residual Norm = 5.557193e-07 # Output file: emptyproc.out.01b Iterations = 17 Final Relative Residual Norm = 6.926794e-07 # Output file: emptyproc.out.03a Iterations = 23 Final Relative Residual Norm = 9.157321e-07 # Output file: emptyproc.out.03b Iterations = 20 Final Relative Residual Norm = 6.594761e-07 # Output file: emptyproc.out.04a Iterations = 15 Final Relative Residual Norm = 9.712834e-07 # Output file: emptyproc.out.04b Iterations = 15 Final Relative Residual Norm = 9.646051e-07 # Output file: emptyproc.out.11a Iterations = 8 Final Relative Residual Norm = 9.301342e-07 # Output file: emptyproc.out.13a Iterations = 11 Final Relative Residual Norm = 3.054686e-07 # Output file: emptyproc.out.14a Iterations = 8 Final Relative Residual Norm = 6.561630e-07 # Output file: emptyproc.out.17a Iterations = 20 Final Relative Residual Norm = 6.766509e-07 # Output file: emptyproc.out.18a Iterations = 42 Final Relative Residual Norm = 7.820632e-07 # Output file: emptyproc.out.21a Iterations = 11 Final Relative Residual Norm = 5.851154e-07 # Output file: emptyproc.out.31a Iterations = 9 Final Relative Residual Norm = 1.848351e-07 # Output file: emptyproc.out.41a Iterations = 5 Final Relative Residual Norm = 1.853522e-07 # Output file: emptyproc.out.51a Iterations = 9 Final Relative Residual Norm = 1.848351e-07 # Output file: emptyproc.out.61a Iterations = 9 Final Relative Residual Norm = 1.848351e-07 hypre-2.33.0/src/test/TEST_struct/emptyproc.saved.tioga000066400000000000000000000030671477326011500230430ustar00rootroot00000000000000# Output file: emptyproc.out.00a Iterations = 6 Final Relative Residual Norm = 1.883632e-07 # Output file: emptyproc.out.01a Iterations = 16 Final Relative Residual Norm = 5.557193e-07 # Output file: emptyproc.out.01b Iterations = 17 Final Relative Residual Norm = 6.926794e-07 # Output file: emptyproc.out.03a Iterations = 23 Final Relative Residual Norm = 9.157321e-07 # Output file: emptyproc.out.03b Iterations = 20 Final Relative Residual Norm = 6.594761e-07 # Output file: emptyproc.out.04a Iterations = 15 Final Relative Residual Norm = 9.712834e-07 # Output file: emptyproc.out.04b Iterations = 15 Final Relative Residual Norm = 9.646051e-07 # Output file: emptyproc.out.11a Iterations = 8 Final Relative Residual Norm = 9.301342e-07 # Output file: emptyproc.out.13a Iterations = 11 Final Relative Residual Norm = 3.054686e-07 # Output file: emptyproc.out.14a Iterations = 8 Final Relative Residual Norm = 6.561630e-07 # Output file: emptyproc.out.17a Iterations = 20 Final Relative Residual Norm = 6.766509e-07 # Output file: emptyproc.out.18a Iterations = 42 Final Relative Residual Norm = 7.820632e-07 # Output file: emptyproc.out.21a Iterations = 11 Final Relative Residual Norm = 5.851154e-07 # Output file: emptyproc.out.31a Iterations = 9 Final Relative Residual Norm = 1.848351e-07 # Output file: emptyproc.out.41a Iterations = 5 Final Relative Residual Norm = 1.853522e-07 # Output file: emptyproc.out.51a Iterations = 9 Final Relative Residual Norm = 1.848351e-07 # Output file: emptyproc.out.61a Iterations = 9 Final Relative Residual Norm = 1.848351e-07 hypre-2.33.0/src/test/TEST_struct/emptyproc.sh000077500000000000000000000032231477326011500212460ustar00rootroot00000000000000#!/bin/bash # Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) TNAME=`basename $0 .sh` RTOL=$1 ATOL=$2 FILES="\ ${TNAME}.out.00a\ ${TNAME}.out.01a\ ${TNAME}.out.01b\ ${TNAME}.out.03a\ ${TNAME}.out.03b\ ${TNAME}.out.04a\ ${TNAME}.out.04b\ ${TNAME}.out.11a\ ${TNAME}.out.13a\ ${TNAME}.out.14a\ ${TNAME}.out.17a\ ${TNAME}.out.18a\ ${TNAME}.out.21a\ ${TNAME}.out.31a\ ${TNAME}.out.41a\ ${TNAME}.out.51a\ ${TNAME}.out.61a\ " #============================================================================= # check results when there are processors with no data #============================================================================= for i in $FILES do tail -3 $i > ${TNAME}.testdata for j in $i.* do tail -3 $j > ${TNAME}.testdata.temp diff ${TNAME}.testdata ${TNAME}.testdata.temp >&2 done done #============================================================================= # compare with baseline case #============================================================================= for i in $FILES do echo "# Output file: $i" tail -3 $i done > ${TNAME}.out # Make sure that the output file is reasonable RUNCOUNT=`echo $FILES | wc -w` OUTCOUNT=`grep "Iterations" ${TNAME}.out | wc -l` if [ "$OUTCOUNT" != "$RUNCOUNT" ]; then echo "Incorrect number of runs in ${TNAME}.out" >&2 fi #============================================================================= # remove temporary files #============================================================================= rm -f ${TNAME}.testdata* hypre-2.33.0/src/test/TEST_struct/hybrid.jobs000077500000000000000000000013441477326011500210320ustar00rootroot00000000000000#!/bin/bash # Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) #============================================================================= # struct: Run Hybrid without the switch #============================================================================= mpirun -np 1 ./struct -P 1 1 1 -solver 20 > hybrid.out.0 mpirun -np 1 ./struct -P 1 1 1 -solver 21 > hybrid.out.1 mpirun -np 1 ./struct -P 1 1 1 -solver 25 > hybrid.out.2 mpirun -np 1 ./struct -P 1 1 1 -solver 20 -solver_type 2 -cf 0.5 > hybrid.out.3 mpirun -np 1 ./struct -P 1 1 1 -solver 21 -solver_type 2 -cf 0.5 > hybrid.out.4 hypre-2.33.0/src/test/TEST_struct/hybrid.saved000066400000000000000000000006741477326011500212010ustar00rootroot00000000000000# Output file: hybrid.out.0 Iterations = 20 Final Relative Residual Norm = 5.962015e-07 # Output file: hybrid.out.1 Iterations = 20 Final Relative Residual Norm = 5.962015e-07 # Output file: hybrid.out.2 Iterations = 20 Final Relative Residual Norm = 5.962015e-07 # Output file: hybrid.out.3 Iterations = 6 Final Relative Residual Norm = 1.175679e-07 # Output file: hybrid.out.4 Iterations = 10 Final Relative Residual Norm = 3.092333e-07 hypre-2.33.0/src/test/TEST_struct/hybrid.saved.florentia000066400000000000000000000006741477326011500231630ustar00rootroot00000000000000# Output file: hybrid.out.0 Iterations = 20 Final Relative Residual Norm = 5.962015e-07 # Output file: hybrid.out.1 Iterations = 20 Final Relative Residual Norm = 5.962015e-07 # Output file: hybrid.out.2 Iterations = 20 Final Relative Residual Norm = 5.962015e-07 # Output file: hybrid.out.3 Iterations = 6 Final Relative Residual Norm = 1.175679e-07 # Output file: hybrid.out.4 Iterations = 10 Final Relative Residual Norm = 3.092333e-07 hypre-2.33.0/src/test/TEST_struct/hybrid.saved.lassen000066400000000000000000000006741477326011500224650ustar00rootroot00000000000000# Output file: hybrid.out.0 Iterations = 20 Final Relative Residual Norm = 5.962015e-07 # Output file: hybrid.out.1 Iterations = 20 Final Relative Residual Norm = 5.962015e-07 # Output file: hybrid.out.2 Iterations = 20 Final Relative Residual Norm = 5.962015e-07 # Output file: hybrid.out.3 Iterations = 6 Final Relative Residual Norm = 1.175679e-07 # Output file: hybrid.out.4 Iterations = 10 Final Relative Residual Norm = 3.092333e-07 hypre-2.33.0/src/test/TEST_struct/hybrid.saved.lassen_cpu000066400000000000000000000006741477326011500233340ustar00rootroot00000000000000# Output file: hybrid.out.0 Iterations = 20 Final Relative Residual Norm = 5.962015e-07 # Output file: hybrid.out.1 Iterations = 20 Final Relative Residual Norm = 5.962015e-07 # Output file: hybrid.out.2 Iterations = 20 Final Relative Residual Norm = 5.962015e-07 # Output file: hybrid.out.3 Iterations = 6 Final Relative Residual Norm = 1.175679e-07 # Output file: hybrid.out.4 Iterations = 10 Final Relative Residual Norm = 3.092333e-07 hypre-2.33.0/src/test/TEST_struct/hybrid.saved.tioga000066400000000000000000000006741477326011500223030ustar00rootroot00000000000000# Output file: hybrid.out.0 Iterations = 20 Final Relative Residual Norm = 5.962015e-07 # Output file: hybrid.out.1 Iterations = 20 Final Relative Residual Norm = 5.962015e-07 # Output file: hybrid.out.2 Iterations = 20 Final Relative Residual Norm = 5.962015e-07 # Output file: hybrid.out.3 Iterations = 6 Final Relative Residual Norm = 1.175679e-07 # Output file: hybrid.out.4 Iterations = 10 Final Relative Residual Norm = 3.092333e-07 hypre-2.33.0/src/test/TEST_struct/hybrid.sh000077500000000000000000000020341477326011500205040ustar00rootroot00000000000000#!/bin/bash # Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) TNAME=`basename $0 .sh` RTOL=$1 ATOL=$2 #============================================================================= # compare with baseline case #============================================================================= FILES="\ ${TNAME}.out.0\ ${TNAME}.out.1\ ${TNAME}.out.2\ ${TNAME}.out.3\ ${TNAME}.out.4\ " for i in $FILES do echo "# Output file: $i" tail -3 $i done > ${TNAME}.out # Make sure that the output file is reasonable RUNCOUNT=`echo $FILES | wc -w` OUTCOUNT=`grep "Iterations" ${TNAME}.out | wc -l` if [ "$OUTCOUNT" != "$RUNCOUNT" ]; then echo "Incorrect number of runs in ${TNAME}.out" >&2 fi #============================================================================= # remove temporary files #============================================================================= # rm -f ${TNAME}.testdata hypre-2.33.0/src/test/TEST_struct/hybridswitch.jobs000077500000000000000000000016701477326011500222560ustar00rootroot00000000000000#!/bin/bash # Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) #============================================================================= # struct: Run Hybrid with the switch #============================================================================= mpirun -np 1 ./struct -n 30 30 30 -P 1 1 1 -solver 20 > hybridswitch.out.0 mpirun -np 1 ./struct -n 30 30 30 -P 1 1 1 -solver 21 > hybridswitch.out.1 mpirun -np 1 ./struct -n 30 30 30 -P 1 1 1 -solver 25 > hybridswitch.out.2 mpirun -np 3 ./struct -P 1 1 3 -solver 30 > hybridswitch.out.3 mpirun -np 3 ./struct -P 1 3 1 -solver 31 > hybridswitch.out.4 mpirun -np 3 ./struct -P 3 1 1 -solver 37 > hybridswitch.out.5 mpirun -np 1 ./struct -P 1 1 1 -solver 38 > hybridswitch.out.6 mpirun -np 1 ./struct -P 1 1 1 -solver 39 > hybridswitch.out.7 hypre-2.33.0/src/test/TEST_struct/hybridswitch.saved000066400000000000000000000013641477326011500224200ustar00rootroot00000000000000# Output file: hybridswitch.out.0 Iterations = 6 Final Relative Residual Norm = 8.777304e-07 # Output file: hybridswitch.out.1 Iterations = 11 Final Relative Residual Norm = 4.303572e-07 # Output file: hybridswitch.out.2 Iterations = 6 Final Relative Residual Norm = 8.777304e-07 # Output file: hybridswitch.out.3 Iterations = 4 Final Relative Residual Norm = 7.591871e-07 # Output file: hybridswitch.out.4 Iterations = 8 Final Relative Residual Norm = 7.771813e-07 # Output file: hybridswitch.out.5 Iterations = 36 Final Relative Residual Norm = 9.833457e-07 # Output file: hybridswitch.out.6 Iterations = 64 Final Relative Residual Norm = 9.962554e-07 # Output file: hybridswitch.out.7 Iterations = 64 Final Relative Residual Norm = 9.962554e-07 hypre-2.33.0/src/test/TEST_struct/hybridswitch.saved.florentia000066400000000000000000000013641477326011500244020ustar00rootroot00000000000000# Output file: hybridswitch.out.0 Iterations = 6 Final Relative Residual Norm = 8.777304e-07 # Output file: hybridswitch.out.1 Iterations = 11 Final Relative Residual Norm = 4.303572e-07 # Output file: hybridswitch.out.2 Iterations = 6 Final Relative Residual Norm = 8.777304e-07 # Output file: hybridswitch.out.3 Iterations = 4 Final Relative Residual Norm = 7.591871e-07 # Output file: hybridswitch.out.4 Iterations = 8 Final Relative Residual Norm = 7.771813e-07 # Output file: hybridswitch.out.5 Iterations = 36 Final Relative Residual Norm = 9.833457e-07 # Output file: hybridswitch.out.6 Iterations = 64 Final Relative Residual Norm = 9.962554e-07 # Output file: hybridswitch.out.7 Iterations = 64 Final Relative Residual Norm = 9.962554e-07 hypre-2.33.0/src/test/TEST_struct/hybridswitch.saved.lassen000066400000000000000000000013641477326011500237040ustar00rootroot00000000000000# Output file: hybridswitch.out.0 Iterations = 6 Final Relative Residual Norm = 8.777304e-07 # Output file: hybridswitch.out.1 Iterations = 11 Final Relative Residual Norm = 4.303572e-07 # Output file: hybridswitch.out.2 Iterations = 6 Final Relative Residual Norm = 8.777304e-07 # Output file: hybridswitch.out.3 Iterations = 4 Final Relative Residual Norm = 7.591871e-07 # Output file: hybridswitch.out.4 Iterations = 8 Final Relative Residual Norm = 7.771813e-07 # Output file: hybridswitch.out.5 Iterations = 36 Final Relative Residual Norm = 9.833457e-07 # Output file: hybridswitch.out.6 Iterations = 64 Final Relative Residual Norm = 9.962554e-07 # Output file: hybridswitch.out.7 Iterations = 64 Final Relative Residual Norm = 9.962554e-07 hypre-2.33.0/src/test/TEST_struct/hybridswitch.saved.lassen_cpu000066400000000000000000000013641477326011500245530ustar00rootroot00000000000000# Output file: hybridswitch.out.0 Iterations = 6 Final Relative Residual Norm = 8.777304e-07 # Output file: hybridswitch.out.1 Iterations = 11 Final Relative Residual Norm = 4.303572e-07 # Output file: hybridswitch.out.2 Iterations = 6 Final Relative Residual Norm = 8.777304e-07 # Output file: hybridswitch.out.3 Iterations = 4 Final Relative Residual Norm = 7.591871e-07 # Output file: hybridswitch.out.4 Iterations = 8 Final Relative Residual Norm = 7.771813e-07 # Output file: hybridswitch.out.5 Iterations = 36 Final Relative Residual Norm = 9.833457e-07 # Output file: hybridswitch.out.6 Iterations = 64 Final Relative Residual Norm = 9.962554e-07 # Output file: hybridswitch.out.7 Iterations = 64 Final Relative Residual Norm = 9.962554e-07 hypre-2.33.0/src/test/TEST_struct/hybridswitch.saved.tioga000066400000000000000000000013641477326011500235220ustar00rootroot00000000000000# Output file: hybridswitch.out.0 Iterations = 6 Final Relative Residual Norm = 8.777304e-07 # Output file: hybridswitch.out.1 Iterations = 11 Final Relative Residual Norm = 4.303572e-07 # Output file: hybridswitch.out.2 Iterations = 6 Final Relative Residual Norm = 8.777304e-07 # Output file: hybridswitch.out.3 Iterations = 4 Final Relative Residual Norm = 7.591871e-07 # Output file: hybridswitch.out.4 Iterations = 8 Final Relative Residual Norm = 7.771813e-07 # Output file: hybridswitch.out.5 Iterations = 36 Final Relative Residual Norm = 9.833457e-07 # Output file: hybridswitch.out.6 Iterations = 64 Final Relative Residual Norm = 9.962554e-07 # Output file: hybridswitch.out.7 Iterations = 64 Final Relative Residual Norm = 9.962554e-07 hypre-2.33.0/src/test/TEST_struct/hybridswitch.sh000077500000000000000000000021171477326011500217300ustar00rootroot00000000000000#!/bin/bash # Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) TNAME=`basename $0 .sh` RTOL=$1 ATOL=$2 #============================================================================= # compare with baseline case #============================================================================= FILES="\ ${TNAME}.out.0\ ${TNAME}.out.1\ ${TNAME}.out.2\ ${TNAME}.out.3\ ${TNAME}.out.4\ ${TNAME}.out.5\ ${TNAME}.out.6\ ${TNAME}.out.7\ " for i in $FILES do echo "# Output file: $i" tail -3 $i done > ${TNAME}.out # Make sure that the output file is reasonable RUNCOUNT=`echo $FILES | wc -w` OUTCOUNT=`grep "Iterations" ${TNAME}.out | wc -l` if [ "$OUTCOUNT" != "$RUNCOUNT" ]; then echo "Incorrect number of runs in ${TNAME}.out" >&2 fi #============================================================================= # remove temporary files #============================================================================= # rm -f ${TNAME}.testdata hypre-2.33.0/src/test/TEST_struct/lazy.jobs000066400000000000000000000012431477326011500205230ustar00rootroot00000000000000#!/bin/bash # Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) #============================================================================= # Test library lazy initialization (sequential and parallel) #============================================================================= mpirun -np 1 ./struct > lazy.out.1.a mpirun -np 1 ./struct -lazy_device_init 1 > lazy.out.1.b mpirun -np 4 ./struct > lazy.out.2.a mpirun -np 4 ./struct -lazy_device_init 1 > lazy.out.2.b hypre-2.33.0/src/test/TEST_struct/lazy.sh000077500000000000000000000014071477326011500202050ustar00rootroot00000000000000#!/bin/bash # Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) TNAME=`basename $0 .sh` tail -3 ${TNAME}.out.1.a | head -2 > ${TNAME}.testdata tail -3 ${TNAME}.out.1.b | head -2 > ${TNAME}.testdata.temp diff ${TNAME}.testdata ${TNAME}.testdata.temp >&2 tail -3 ${TNAME}.out.2.a | head -2 > ${TNAME}.testdata tail -3 ${TNAME}.out.2.b | head -2 > ${TNAME}.testdata.temp diff ${TNAME}.testdata ${TNAME}.testdata.temp >&2 #============================================================================= # remove temporary files #============================================================================= rm -f ${TNAME}.testdata* hypre-2.33.0/src/test/TEST_struct/migrate.jobs000077500000000000000000000015111477326011500211750ustar00rootroot00000000000000#!/bin/bash # Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) # 1D mpirun -np 4 ./struct_migrate -d 1 -P 4 1 1 > migrate.out.10 mpirun -np 4 ./struct_migrate -d 1 -P 4 1 1 -b 2 1 1 > migrate.out.11 mpirun -np 5 ./struct_migrate -d 1 -P 4 1 1 -b 2 1 1 > migrate.out.12 # 2D mpirun -np 4 ./struct_migrate -d 2 -P 2 2 1 > migrate.out.20 mpirun -np 4 ./struct_migrate -d 2 -P 2 2 1 -b 2 2 1 > migrate.out.21 mpirun -np 5 ./struct_migrate -d 2 -P 2 2 1 -b 2 2 1 > migrate.out.22 # 3D mpirun -np 8 ./struct_migrate -P 2 2 2 > migrate.out.30 mpirun -np 8 ./struct_migrate -P 2 2 2 -b 2 2 2 > migrate.out.31 mpirun -np 9 ./struct_migrate -P 2 2 2 -b 2 2 2 > migrate.out.32 hypre-2.33.0/src/test/TEST_struct/migrate.saved000066400000000000000000000007571477326011500213520ustar00rootroot00000000000000# Output file: migrate.out.10 Check = 0 (success = 0) # Output file: migrate.out.11 Check = 0 (success = 0) # Output file: migrate.out.12 Check = 0 (success = 0) # Output file: migrate.out.20 Check = 0 (success = 0) # Output file: migrate.out.21 Check = 0 (success = 0) # Output file: migrate.out.22 Check = 0 (success = 0) # Output file: migrate.out.30 Check = 0 (success = 0) # Output file: migrate.out.31 Check = 0 (success = 0) # Output file: migrate.out.32 Check = 0 (success = 0) hypre-2.33.0/src/test/TEST_struct/migrate.saved.florentia000066400000000000000000000007571477326011500233340ustar00rootroot00000000000000# Output file: migrate.out.10 Check = 0 (success = 0) # Output file: migrate.out.11 Check = 0 (success = 0) # Output file: migrate.out.12 Check = 0 (success = 0) # Output file: migrate.out.20 Check = 0 (success = 0) # Output file: migrate.out.21 Check = 0 (success = 0) # Output file: migrate.out.22 Check = 0 (success = 0) # Output file: migrate.out.30 Check = 0 (success = 0) # Output file: migrate.out.31 Check = 0 (success = 0) # Output file: migrate.out.32 Check = 0 (success = 0) hypre-2.33.0/src/test/TEST_struct/migrate.saved.lassen000066400000000000000000000007571477326011500226360ustar00rootroot00000000000000# Output file: migrate.out.10 Check = 0 (success = 0) # Output file: migrate.out.11 Check = 0 (success = 0) # Output file: migrate.out.12 Check = 0 (success = 0) # Output file: migrate.out.20 Check = 0 (success = 0) # Output file: migrate.out.21 Check = 0 (success = 0) # Output file: migrate.out.22 Check = 0 (success = 0) # Output file: migrate.out.30 Check = 0 (success = 0) # Output file: migrate.out.31 Check = 0 (success = 0) # Output file: migrate.out.32 Check = 0 (success = 0) hypre-2.33.0/src/test/TEST_struct/migrate.saved.lassen_cpu000066400000000000000000000007571477326011500235050ustar00rootroot00000000000000# Output file: migrate.out.10 Check = 0 (success = 0) # Output file: migrate.out.11 Check = 0 (success = 0) # Output file: migrate.out.12 Check = 0 (success = 0) # Output file: migrate.out.20 Check = 0 (success = 0) # Output file: migrate.out.21 Check = 0 (success = 0) # Output file: migrate.out.22 Check = 0 (success = 0) # Output file: migrate.out.30 Check = 0 (success = 0) # Output file: migrate.out.31 Check = 0 (success = 0) # Output file: migrate.out.32 Check = 0 (success = 0) hypre-2.33.0/src/test/TEST_struct/migrate.saved.tioga000066400000000000000000000007571477326011500224540ustar00rootroot00000000000000# Output file: migrate.out.10 Check = 0 (success = 0) # Output file: migrate.out.11 Check = 0 (success = 0) # Output file: migrate.out.12 Check = 0 (success = 0) # Output file: migrate.out.20 Check = 0 (success = 0) # Output file: migrate.out.21 Check = 0 (success = 0) # Output file: migrate.out.22 Check = 0 (success = 0) # Output file: migrate.out.30 Check = 0 (success = 0) # Output file: migrate.out.31 Check = 0 (success = 0) # Output file: migrate.out.32 Check = 0 (success = 0) hypre-2.33.0/src/test/TEST_struct/migrate.sh000077500000000000000000000021121477326011500206500ustar00rootroot00000000000000#!/bin/bash # Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) TNAME=`basename $0 .sh` RTOL=$1 ATOL=$2 #============================================================================= # compare with baseline case #============================================================================= FILES="\ ${TNAME}.out.10\ ${TNAME}.out.11\ ${TNAME}.out.12\ ${TNAME}.out.20\ ${TNAME}.out.21\ ${TNAME}.out.22\ ${TNAME}.out.30\ ${TNAME}.out.31\ ${TNAME}.out.32\ " for i in $FILES do echo "# Output file: $i" tail -2 $i done > ${TNAME}.out # Make sure that the output file is reasonable RUNCOUNT=`echo $FILES | wc -w` OUTCOUNT=`grep "Check" ${TNAME}.out | wc -l` if [ "$OUTCOUNT" != "$RUNCOUNT" ]; then echo "Incorrect number of runs in ${TNAME}.out" >&2 fi #============================================================================= # remove temporary files #============================================================================= hypre-2.33.0/src/test/TEST_struct/parflow.jobs000077500000000000000000000027241477326011500212260ustar00rootroot00000000000000#!/bin/bash # Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) #============================================================================= # struct: Run base 3d case #============================================================================= mpirun -np 1 ./struct -n 16 16 16 -c 2.0 3.0 40 -solver 1 -p 16 16 0 \ > parflow.out.0 #============================================================================= # struct: Run parallel and blocking #============================================================================= mpirun -np 8 ./struct -n 8 8 8 -P 2 2 2 -c 2.0 3.0 40 -solver 1 -p 16 16 0 \ > parflow.out.1 mpirun -np 8 ./struct -n 4 4 4 -b 2 2 2 -P 2 2 2 -c 2.0 3.0 40 -solver 1 \ -p 16 16 0 > parflow.out.2 #============================================================================= # struct: Run base 2d case #============================================================================= mpirun -np 1 ./struct -d 2 -n 80 80 1 -solver 1 \ > parflow.out.3 #============================================================================= # struct: Run parallel and blocking #============================================================================= mpirun -np 8 ./struct -d 2 -n 10 80 1 -P 8 1 1 -solver 1 \ > parflow.out.4 mpirun -np 4 ./struct -d 2 -n 10 10 1 -b 4 4 1 -P 2 2 1 -solver 1 \ > parflow.out.5 hypre-2.33.0/src/test/TEST_struct/parflow.saved000066400000000000000000000010341477326011500213610ustar00rootroot00000000000000# Output file: parflow.out.0 Iterations = 10 Final Relative Residual Norm = 8.112584e-07 # Output file: parflow.out.1 Iterations = 10 Final Relative Residual Norm = 8.112584e-07 # Output file: parflow.out.2 Iterations = 10 Final Relative Residual Norm = 8.112584e-07 # Output file: parflow.out.3 Iterations = 15 Final Relative Residual Norm = 9.466307e-07 # Output file: parflow.out.4 Iterations = 15 Final Relative Residual Norm = 9.466307e-07 # Output file: parflow.out.5 Iterations = 15 Final Relative Residual Norm = 9.466307e-07 hypre-2.33.0/src/test/TEST_struct/parflow.saved.florentia000066400000000000000000000010341477326011500233430ustar00rootroot00000000000000# Output file: parflow.out.0 Iterations = 10 Final Relative Residual Norm = 8.112584e-07 # Output file: parflow.out.1 Iterations = 10 Final Relative Residual Norm = 8.112584e-07 # Output file: parflow.out.2 Iterations = 10 Final Relative Residual Norm = 8.112584e-07 # Output file: parflow.out.3 Iterations = 15 Final Relative Residual Norm = 9.466307e-07 # Output file: parflow.out.4 Iterations = 15 Final Relative Residual Norm = 9.466307e-07 # Output file: parflow.out.5 Iterations = 15 Final Relative Residual Norm = 9.466307e-07 hypre-2.33.0/src/test/TEST_struct/parflow.saved.lassen000066400000000000000000000010341477326011500226450ustar00rootroot00000000000000# Output file: parflow.out.0 Iterations = 10 Final Relative Residual Norm = 8.112584e-07 # Output file: parflow.out.1 Iterations = 10 Final Relative Residual Norm = 8.112584e-07 # Output file: parflow.out.2 Iterations = 10 Final Relative Residual Norm = 8.112584e-07 # Output file: parflow.out.3 Iterations = 15 Final Relative Residual Norm = 9.466307e-07 # Output file: parflow.out.4 Iterations = 15 Final Relative Residual Norm = 9.466307e-07 # Output file: parflow.out.5 Iterations = 15 Final Relative Residual Norm = 9.466307e-07 hypre-2.33.0/src/test/TEST_struct/parflow.saved.lassen_cpu000066400000000000000000000010341477326011500235140ustar00rootroot00000000000000# Output file: parflow.out.0 Iterations = 10 Final Relative Residual Norm = 8.112584e-07 # Output file: parflow.out.1 Iterations = 10 Final Relative Residual Norm = 8.112584e-07 # Output file: parflow.out.2 Iterations = 10 Final Relative Residual Norm = 8.112584e-07 # Output file: parflow.out.3 Iterations = 15 Final Relative Residual Norm = 9.466307e-07 # Output file: parflow.out.4 Iterations = 15 Final Relative Residual Norm = 9.466307e-07 # Output file: parflow.out.5 Iterations = 15 Final Relative Residual Norm = 9.466307e-07 hypre-2.33.0/src/test/TEST_struct/parflow.saved.tioga000066400000000000000000000010341477326011500224630ustar00rootroot00000000000000# Output file: parflow.out.0 Iterations = 10 Final Relative Residual Norm = 8.112584e-07 # Output file: parflow.out.1 Iterations = 10 Final Relative Residual Norm = 8.112584e-07 # Output file: parflow.out.2 Iterations = 10 Final Relative Residual Norm = 8.112584e-07 # Output file: parflow.out.3 Iterations = 15 Final Relative Residual Norm = 9.466307e-07 # Output file: parflow.out.4 Iterations = 15 Final Relative Residual Norm = 9.466307e-07 # Output file: parflow.out.5 Iterations = 15 Final Relative Residual Norm = 9.466307e-07 hypre-2.33.0/src/test/TEST_struct/parflow.sh000077500000000000000000000041661477326011500207050ustar00rootroot00000000000000#!/bin/bash # Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) TNAME=`basename $0 .sh` RTOL=$1 ATOL=$2 #============================================================================= # struct: Test parallel and blocking by diffing against base 3d case #============================================================================= tail -3 ${TNAME}.out.0 > ${TNAME}.testdata tail -3 ${TNAME}.out.1 > ${TNAME}.testdata.temp diff ${TNAME}.testdata ${TNAME}.testdata.temp >&2 #============================================================================= tail -3 ${TNAME}.out.2 > ${TNAME}.testdata.temp diff ${TNAME}.testdata ${TNAME}.testdata.temp >&2 #============================================================================= # struct: Test parallel and blocking by diffing against base 2d case #============================================================================= tail -3 ${TNAME}.out.3 > ${TNAME}.testdata tail -3 ${TNAME}.out.4 > ${TNAME}.testdata.temp diff ${TNAME}.testdata ${TNAME}.testdata.temp >&2 #============================================================================= tail -3 ${TNAME}.out.5 > ${TNAME}.testdata.temp diff ${TNAME}.testdata ${TNAME}.testdata.temp >&2 #============================================================================= # compare with baseline case #============================================================================= FILES="\ ${TNAME}.out.0\ ${TNAME}.out.1\ ${TNAME}.out.2\ ${TNAME}.out.3\ ${TNAME}.out.4\ ${TNAME}.out.5\ " for i in $FILES do echo "# Output file: $i" tail -3 $i done > ${TNAME}.out # Make sure that the output file is reasonable RUNCOUNT=`echo $FILES | wc -w` OUTCOUNT=`grep "Iterations" ${TNAME}.out | wc -l` if [ "$OUTCOUNT" != "$RUNCOUNT" ]; then echo "Incorrect number of runs in ${TNAME}.out" >&2 fi #============================================================================= # remove temporary files #============================================================================= rm -f ${TNAME}.testdata* hypre-2.33.0/src/test/TEST_struct/periodic.jobs000077500000000000000000000041361477326011500213510ustar00rootroot00000000000000#!/bin/bash # Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) #============================================================================= # Check PFMG for power-of-two and non-power-of-two systems #============================================================================= # power-of-two mpirun -np 1 ./struct -n 16 16 16 -p 16 16 0 -P 1 1 1 -solver 1 > periodic.out.10 mpirun -np 2 ./struct -n 8 16 16 -p 16 16 0 -P 2 1 1 -solver 1 > periodic.out.11 mpirun -np 4 ./struct -n 8 8 16 -p 16 16 0 -P 2 2 1 -solver 1 > periodic.out.12 mpirun -np 4 ./struct -n 16 8 8 -p 16 16 0 -P 1 2 2 -solver 1 > periodic.out.13 mpirun -np 1 ./struct -n 16 16 16 -p 16 0 16 -P 1 1 1 -skip 1 -rap 1 -solver 1 \ > periodic.out.20 mpirun -np 2 ./struct -n 8 16 16 -p 16 0 16 -P 2 1 1 -skip 1 -rap 1 -solver 1 \ > periodic.out.21 # non-power-of-two mpirun -np 1 ./struct -n 20 20 20 -p 0 20 20 -P 1 1 1 -solver 1 > periodic.out.30 mpirun -np 2 ./struct -n 10 20 20 -p 0 20 20 -P 2 1 1 -solver 1 > periodic.out.31 mpirun -np 4 ./struct -n 10 20 10 -p 0 20 20 -P 2 1 2 -solver 1 > periodic.out.32 mpirun -np 4 ./struct -n 20 10 10 -p 0 20 20 -P 1 2 2 -solver 1 > periodic.out.33 mpirun -np 1 ./struct -n 20 20 20 -p 20 0 20 -P 1 1 1 -skip 1 -rap 1 -solver 1 \ > periodic.out.40 mpirun -np 2 ./struct -n 20 20 10 -p 20 0 20 -P 1 1 2 -skip 1 -rap 1 -solver 1 \ > periodic.out.41 #============================================================================= # Check SMG #============================================================================= # power-of-two mpirun -np 1 ./struct -n 16 16 16 -p 16 0 16 -P 1 1 1 -solver 0 > periodic.out.50 mpirun -np 2 ./struct -n 8 16 16 -p 16 0 16 -P 2 1 1 -solver 0 > periodic.out.51 mpirun -np 4 ./struct -n 8 8 16 -p 16 0 16 -P 2 2 1 -solver 0 > periodic.out.52 mpirun -np 4 ./struct -n 16 8 8 -p 16 0 16 -P 1 2 2 -solver 0 > periodic.out.53 # non-power-of-two mpirun -np 3 ./struct -n 10 10 10 -p 0 0 30 -P 1 1 3 -solver 0 > periodic.out.60 hypre-2.33.0/src/test/TEST_struct/periodic.saved000066400000000000000000000030271477326011500215110ustar00rootroot00000000000000# Output file: periodic.out.10 Iterations = 16 Final Relative Residual Norm = 5.765014e-07 # Output file: periodic.out.11 Iterations = 16 Final Relative Residual Norm = 5.765014e-07 # Output file: periodic.out.12 Iterations = 16 Final Relative Residual Norm = 5.765014e-07 # Output file: periodic.out.13 Iterations = 16 Final Relative Residual Norm = 5.765014e-07 # Output file: periodic.out.20 Iterations = 23 Final Relative Residual Norm = 6.111317e-07 # Output file: periodic.out.21 Iterations = 23 Final Relative Residual Norm = 6.111317e-07 # Output file: periodic.out.30 Iterations = 21 Final Relative Residual Norm = 4.973134e-07 # Output file: periodic.out.31 Iterations = 21 Final Relative Residual Norm = 4.973134e-07 # Output file: periodic.out.32 Iterations = 21 Final Relative Residual Norm = 4.973134e-07 # Output file: periodic.out.33 Iterations = 21 Final Relative Residual Norm = 4.973134e-07 # Output file: periodic.out.40 Iterations = 43 Final Relative Residual Norm = 8.515463e-07 # Output file: periodic.out.41 Iterations = 43 Final Relative Residual Norm = 8.515463e-07 # Output file: periodic.out.50 Iterations = 7 Final Relative Residual Norm = 3.701014e-07 # Output file: periodic.out.51 Iterations = 7 Final Relative Residual Norm = 3.701014e-07 # Output file: periodic.out.52 Iterations = 7 Final Relative Residual Norm = 3.701014e-07 # Output file: periodic.out.53 Iterations = 7 Final Relative Residual Norm = 3.701014e-07 # Output file: periodic.out.60 Iterations = 10 Final Relative Residual Norm = 1.565392e-07 hypre-2.33.0/src/test/TEST_struct/periodic.saved.florentia000066400000000000000000000030271477326011500234730ustar00rootroot00000000000000# Output file: periodic.out.10 Iterations = 16 Final Relative Residual Norm = 5.765014e-07 # Output file: periodic.out.11 Iterations = 16 Final Relative Residual Norm = 5.765014e-07 # Output file: periodic.out.12 Iterations = 16 Final Relative Residual Norm = 5.765014e-07 # Output file: periodic.out.13 Iterations = 16 Final Relative Residual Norm = 5.765014e-07 # Output file: periodic.out.20 Iterations = 23 Final Relative Residual Norm = 6.111317e-07 # Output file: periodic.out.21 Iterations = 23 Final Relative Residual Norm = 6.111317e-07 # Output file: periodic.out.30 Iterations = 21 Final Relative Residual Norm = 4.973134e-07 # Output file: periodic.out.31 Iterations = 21 Final Relative Residual Norm = 4.973134e-07 # Output file: periodic.out.32 Iterations = 21 Final Relative Residual Norm = 4.973134e-07 # Output file: periodic.out.33 Iterations = 21 Final Relative Residual Norm = 4.973134e-07 # Output file: periodic.out.40 Iterations = 43 Final Relative Residual Norm = 8.515463e-07 # Output file: periodic.out.41 Iterations = 43 Final Relative Residual Norm = 8.515463e-07 # Output file: periodic.out.50 Iterations = 7 Final Relative Residual Norm = 3.701014e-07 # Output file: periodic.out.51 Iterations = 7 Final Relative Residual Norm = 3.701014e-07 # Output file: periodic.out.52 Iterations = 7 Final Relative Residual Norm = 3.701014e-07 # Output file: periodic.out.53 Iterations = 7 Final Relative Residual Norm = 3.701014e-07 # Output file: periodic.out.60 Iterations = 10 Final Relative Residual Norm = 1.565392e-07 hypre-2.33.0/src/test/TEST_struct/periodic.saved.lassen000066400000000000000000000030271477326011500227750ustar00rootroot00000000000000# Output file: periodic.out.10 Iterations = 16 Final Relative Residual Norm = 5.765014e-07 # Output file: periodic.out.11 Iterations = 16 Final Relative Residual Norm = 5.765014e-07 # Output file: periodic.out.12 Iterations = 16 Final Relative Residual Norm = 5.765014e-07 # Output file: periodic.out.13 Iterations = 16 Final Relative Residual Norm = 5.765014e-07 # Output file: periodic.out.20 Iterations = 23 Final Relative Residual Norm = 6.111317e-07 # Output file: periodic.out.21 Iterations = 23 Final Relative Residual Norm = 6.111317e-07 # Output file: periodic.out.30 Iterations = 21 Final Relative Residual Norm = 4.973134e-07 # Output file: periodic.out.31 Iterations = 21 Final Relative Residual Norm = 4.973134e-07 # Output file: periodic.out.32 Iterations = 21 Final Relative Residual Norm = 4.973134e-07 # Output file: periodic.out.33 Iterations = 21 Final Relative Residual Norm = 4.973134e-07 # Output file: periodic.out.40 Iterations = 43 Final Relative Residual Norm = 8.515463e-07 # Output file: periodic.out.41 Iterations = 43 Final Relative Residual Norm = 8.515463e-07 # Output file: periodic.out.50 Iterations = 7 Final Relative Residual Norm = 3.701014e-07 # Output file: periodic.out.51 Iterations = 7 Final Relative Residual Norm = 3.701014e-07 # Output file: periodic.out.52 Iterations = 7 Final Relative Residual Norm = 3.701014e-07 # Output file: periodic.out.53 Iterations = 7 Final Relative Residual Norm = 3.701014e-07 # Output file: periodic.out.60 Iterations = 10 Final Relative Residual Norm = 1.565392e-07 hypre-2.33.0/src/test/TEST_struct/periodic.saved.lassen_cpu000066400000000000000000000030301477326011500236360ustar00rootroot00000000000000# Output file: periodic.out.10 Iterations = 16 Final Relative Residual Norm = 5.765014e-07 # Output file: periodic.out.11 Iterations = 16 Final Relative Residual Norm = 5.765014e-07 # Output file: periodic.out.12 Iterations = 16 Final Relative Residual Norm = 5.765014e-07 # Output file: periodic.out.13 Iterations = 16 Final Relative Residual Norm = 5.765014e-07 # Output file: periodic.out.20 Iterations = 23 Final Relative Residual Norm = 6.111317e-07 # Output file: periodic.out.21 Iterations = 23 Final Relative Residual Norm = 6.111317e-07 # Output file: periodic.out.30 Iterations = 21 Final Relative Residual Norm = 4.973134e-07 # Output file: periodic.out.31 Iterations = 21 Final Relative Residual Norm = 4.973134e-07 # Output file: periodic.out.32 Iterations = 21 Final Relative Residual Norm = 4.973134e-07 # Output file: periodic.out.33 Iterations = 21 Final Relative Residual Norm = 4.973134e-07 # Output file: periodic.out.40 Iterations = 43 Final Relative Residual Norm = 8.515463e-07 # Output file: periodic.out.41 Iterations = 43 Final Relative Residual Norm = 8.515463e-07 # Output file: periodic.out.50 Iterations = 7 Final Relative Residual Norm = 3.701014e-07 # Output file: periodic.out.51 Iterations = 7 Final Relative Residual Norm = 3.701014e-07 # Output file: periodic.out.52 Iterations = 7 Final Relative Residual Norm = 3.701014e-07 # Output file: periodic.out.53 Iterations = 7 Final Relative Residual Norm = 3.701014e-07 # Output file: periodic.out.60 Iterations = 10 Final Relative Residual Norm = 1.565392e-07 hypre-2.33.0/src/test/TEST_struct/periodic.saved.tioga000066400000000000000000000030301477326011500226050ustar00rootroot00000000000000# Output file: periodic.out.10 Iterations = 16 Final Relative Residual Norm = 5.765014e-07 # Output file: periodic.out.11 Iterations = 16 Final Relative Residual Norm = 5.765014e-07 # Output file: periodic.out.12 Iterations = 16 Final Relative Residual Norm = 5.765014e-07 # Output file: periodic.out.13 Iterations = 16 Final Relative Residual Norm = 5.765014e-07 # Output file: periodic.out.20 Iterations = 23 Final Relative Residual Norm = 6.111317e-07 # Output file: periodic.out.21 Iterations = 23 Final Relative Residual Norm = 6.111317e-07 # Output file: periodic.out.30 Iterations = 21 Final Relative Residual Norm = 4.973134e-07 # Output file: periodic.out.31 Iterations = 21 Final Relative Residual Norm = 4.973134e-07 # Output file: periodic.out.32 Iterations = 21 Final Relative Residual Norm = 4.973134e-07 # Output file: periodic.out.33 Iterations = 21 Final Relative Residual Norm = 4.973134e-07 # Output file: periodic.out.40 Iterations = 43 Final Relative Residual Norm = 8.515463e-07 # Output file: periodic.out.41 Iterations = 43 Final Relative Residual Norm = 8.515463e-07 # Output file: periodic.out.50 Iterations = 7 Final Relative Residual Norm = 3.701014e-07 # Output file: periodic.out.51 Iterations = 7 Final Relative Residual Norm = 3.701014e-07 # Output file: periodic.out.52 Iterations = 7 Final Relative Residual Norm = 3.701014e-07 # Output file: periodic.out.53 Iterations = 7 Final Relative Residual Norm = 3.701014e-07 # Output file: periodic.out.60 Iterations = 10 Final Relative Residual Norm = 1.565392e-07 hypre-2.33.0/src/test/TEST_struct/periodic.sh000077500000000000000000000056701477326011500210320ustar00rootroot00000000000000#!/bin/bash # Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) TNAME=`basename $0 .sh` RTOL=$1 ATOL=$2 #============================================================================= # Check PFMG for power-of-two and non-power-of-two systems #============================================================================= tail -3 ${TNAME}.out.10 > ${TNAME}.testdata tail -3 ${TNAME}.out.11 > ${TNAME}.testdata.temp diff ${TNAME}.testdata ${TNAME}.testdata.temp >&2 tail -3 ${TNAME}.out.12 > ${TNAME}.testdata.temp diff ${TNAME}.testdata ${TNAME}.testdata.temp >&2 tail -3 ${TNAME}.out.13 > ${TNAME}.testdata.temp diff ${TNAME}.testdata ${TNAME}.testdata.temp >&2 tail -3 ${TNAME}.out.20 > ${TNAME}.testdata tail -3 ${TNAME}.out.21 > ${TNAME}.testdata.temp diff ${TNAME}.testdata ${TNAME}.testdata.temp >&2 tail -3 ${TNAME}.out.30 > ${TNAME}.testdata tail -3 ${TNAME}.out.31 > ${TNAME}.testdata.temp diff ${TNAME}.testdata ${TNAME}.testdata.temp >&2 tail -3 ${TNAME}.out.32 > ${TNAME}.testdata.temp diff ${TNAME}.testdata ${TNAME}.testdata.temp >&2 tail -3 ${TNAME}.out.33 > ${TNAME}.testdata.temp diff ${TNAME}.testdata ${TNAME}.testdata.temp >&2 tail -3 ${TNAME}.out.40 > ${TNAME}.testdata tail -3 ${TNAME}.out.41 > ${TNAME}.testdata.temp diff ${TNAME}.testdata ${TNAME}.testdata.temp >&2 #============================================================================= # Check SMG for power-of-two systems #============================================================================= tail -3 ${TNAME}.out.50 > ${TNAME}.testdata tail -3 ${TNAME}.out.51 > ${TNAME}.testdata.temp diff ${TNAME}.testdata ${TNAME}.testdata.temp >&2 tail -3 ${TNAME}.out.52 > ${TNAME}.testdata.temp diff ${TNAME}.testdata ${TNAME}.testdata.temp >&2 tail -3 ${TNAME}.out.53 > ${TNAME}.testdata.temp diff ${TNAME}.testdata ${TNAME}.testdata.temp >&2 #============================================================================= # compare with baseline case #============================================================================= FILES="\ ${TNAME}.out.10\ ${TNAME}.out.11\ ${TNAME}.out.12\ ${TNAME}.out.13\ ${TNAME}.out.20\ ${TNAME}.out.21\ ${TNAME}.out.30\ ${TNAME}.out.31\ ${TNAME}.out.32\ ${TNAME}.out.33\ ${TNAME}.out.40\ ${TNAME}.out.41\ ${TNAME}.out.50\ ${TNAME}.out.51\ ${TNAME}.out.52\ ${TNAME}.out.53\ ${TNAME}.out.60\ " for i in $FILES do echo "# Output file: $i" tail -3 $i done > ${TNAME}.out # Make sure that the output file is reasonable RUNCOUNT=`echo $FILES | wc -w` OUTCOUNT=`grep "Iterations" ${TNAME}.out | wc -l` if [ "$OUTCOUNT" != "$RUNCOUNT" ]; then echo "Incorrect number of runs in ${TNAME}.out" >&2 fi #============================================================================= # remove temporary files #============================================================================= rm -f ${TNAME}.testdata* hypre-2.33.0/src/test/TEST_struct/pfmgbase1d.jobs000077500000000000000000000011001477326011500215500ustar00rootroot00000000000000#!/bin/bash # Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) #============================================================================= # struct: Run PFMG 1d run as 2d and 3d #============================================================================= mpirun -np 1 ./struct -n 12 1 1 -c 1 0 0 -d 2 -solver 1 \ > pfmgbase1d.out.0 mpirun -np 2 ./struct -n 2 1 1 -P 2 1 1 -b 3 1 1 -c 1 0 0 -solver 1 \ > pfmgbase1d.out.1 hypre-2.33.0/src/test/TEST_struct/pfmgbase1d.saved000066400000000000000000000002701477326011500217210ustar00rootroot00000000000000# Output file: pfmgbase1d.out.0 Iterations = 9 Final Relative Residual Norm = 2.021867e-07 # Output file: pfmgbase1d.out.1 Iterations = 9 Final Relative Residual Norm = 2.021867e-07 hypre-2.33.0/src/test/TEST_struct/pfmgbase1d.saved.florentia000066400000000000000000000002701477326011500237030ustar00rootroot00000000000000# Output file: pfmgbase1d.out.0 Iterations = 9 Final Relative Residual Norm = 2.021867e-07 # Output file: pfmgbase1d.out.1 Iterations = 9 Final Relative Residual Norm = 2.021867e-07 hypre-2.33.0/src/test/TEST_struct/pfmgbase1d.saved.lassen000066400000000000000000000002701477326011500232050ustar00rootroot00000000000000# Output file: pfmgbase1d.out.0 Iterations = 9 Final Relative Residual Norm = 2.021867e-07 # Output file: pfmgbase1d.out.1 Iterations = 9 Final Relative Residual Norm = 2.021867e-07 hypre-2.33.0/src/test/TEST_struct/pfmgbase1d.saved.lassen_cpu000066400000000000000000000002701477326011500240540ustar00rootroot00000000000000# Output file: pfmgbase1d.out.0 Iterations = 9 Final Relative Residual Norm = 2.021867e-07 # Output file: pfmgbase1d.out.1 Iterations = 9 Final Relative Residual Norm = 2.021867e-07 hypre-2.33.0/src/test/TEST_struct/pfmgbase1d.saved.tioga000066400000000000000000000002701477326011500230230ustar00rootroot00000000000000# Output file: pfmgbase1d.out.0 Iterations = 9 Final Relative Residual Norm = 2.021867e-07 # Output file: pfmgbase1d.out.1 Iterations = 9 Final Relative Residual Norm = 2.021867e-07 hypre-2.33.0/src/test/TEST_struct/pfmgbase1d.sh000077500000000000000000000025351477326011500212420ustar00rootroot00000000000000#!/bin/bash # Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) TNAME=`basename $0 .sh` RTOL=$1 ATOL=$2 #============================================================================= # struct: Test PFMG 1d run as 2d and 3d by diffing against each other. #============================================================================= tail -3 ${TNAME}.out.0 > ${TNAME}.testdata tail -3 ${TNAME}.out.1 > ${TNAME}.testdata.temp diff ${TNAME}.testdata ${TNAME}.testdata.temp >&2 #============================================================================= # compare with baseline case #============================================================================= FILES="\ ${TNAME}.out.0\ ${TNAME}.out.1\ " for i in $FILES do echo "# Output file: $i" tail -3 $i done > ${TNAME}.out # Make sure that the output file is reasonable RUNCOUNT=`echo $FILES | wc -w` OUTCOUNT=`grep "Iterations" ${TNAME}.out | wc -l` if [ "$OUTCOUNT" != "$RUNCOUNT" ]; then echo "Incorrect number of runs in ${TNAME}.out" >&2 fi #============================================================================= # remove temporary files #============================================================================= rm -f ${TNAME}.testdata* hypre-2.33.0/src/test/TEST_struct/pfmgbase2d.jobs000077500000000000000000000024711477326011500215650ustar00rootroot00000000000000#!/bin/bash # Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) #============================================================================= # struct: Run PFMG base "true" 2d case #============================================================================= mpirun -np 1 ./struct -n 12 12 1 -d 2 -solver 1 -relax 1 \ > pfmgbase2d.out.0 #============================================================================= # struct: Run PFMG parallel and blocking #============================================================================= mpirun -np 3 ./struct -n 4 12 1 -P 3 1 1 -d 2 -solver 1 -relax 1 \ > pfmgbase2d.out.1 mpirun -np 3 ./struct -n 4 4 1 -P 1 3 1 -b 3 1 1 -d 2 -solver 1 -relax 1 \ > pfmgbase2d.out.2 #============================================================================= # struct: Run PFMG 2d run as 3d #============================================================================= mpirun -np 4 ./struct -n 3 1 12 -P 4 1 1 -c 1 0 1 -solver 1 -relax 1 \ > pfmgbase2d.out.3 mpirun -np 2 ./struct -n 1 12 6 -P 1 1 2 -c 0 1 1 -solver 1 -relax 1 \ > pfmgbase2d.out.4 mpirun -np 3 ./struct -n 12 4 1 -P 1 3 1 -c 1 1 0 -solver 1 -relax 1 \ > pfmgbase2d.out.5 hypre-2.33.0/src/test/TEST_struct/pfmgbase2d.saved000066400000000000000000000010561477326011500217250ustar00rootroot00000000000000# Output file: pfmgbase2d.out.0 Iterations = 13 Final Relative Residual Norm = 3.655647e-07 # Output file: pfmgbase2d.out.1 Iterations = 13 Final Relative Residual Norm = 3.655647e-07 # Output file: pfmgbase2d.out.2 Iterations = 13 Final Relative Residual Norm = 3.655647e-07 # Output file: pfmgbase2d.out.3 Iterations = 13 Final Relative Residual Norm = 3.655647e-07 # Output file: pfmgbase2d.out.4 Iterations = 13 Final Relative Residual Norm = 3.655647e-07 # Output file: pfmgbase2d.out.5 Iterations = 13 Final Relative Residual Norm = 3.655647e-07 hypre-2.33.0/src/test/TEST_struct/pfmgbase2d.saved.florentia000066400000000000000000000010561477326011500237070ustar00rootroot00000000000000# Output file: pfmgbase2d.out.0 Iterations = 13 Final Relative Residual Norm = 3.655647e-07 # Output file: pfmgbase2d.out.1 Iterations = 13 Final Relative Residual Norm = 3.655647e-07 # Output file: pfmgbase2d.out.2 Iterations = 13 Final Relative Residual Norm = 3.655647e-07 # Output file: pfmgbase2d.out.3 Iterations = 13 Final Relative Residual Norm = 3.655647e-07 # Output file: pfmgbase2d.out.4 Iterations = 13 Final Relative Residual Norm = 3.655647e-07 # Output file: pfmgbase2d.out.5 Iterations = 13 Final Relative Residual Norm = 3.655647e-07 hypre-2.33.0/src/test/TEST_struct/pfmgbase2d.saved.lassen000066400000000000000000000010561477326011500232110ustar00rootroot00000000000000# Output file: pfmgbase2d.out.0 Iterations = 13 Final Relative Residual Norm = 3.655647e-07 # Output file: pfmgbase2d.out.1 Iterations = 13 Final Relative Residual Norm = 3.655647e-07 # Output file: pfmgbase2d.out.2 Iterations = 13 Final Relative Residual Norm = 3.655647e-07 # Output file: pfmgbase2d.out.3 Iterations = 13 Final Relative Residual Norm = 3.655647e-07 # Output file: pfmgbase2d.out.4 Iterations = 13 Final Relative Residual Norm = 3.655647e-07 # Output file: pfmgbase2d.out.5 Iterations = 13 Final Relative Residual Norm = 3.655647e-07 hypre-2.33.0/src/test/TEST_struct/pfmgbase2d.saved.lassen_cpu000066400000000000000000000010561477326011500240600ustar00rootroot00000000000000# Output file: pfmgbase2d.out.0 Iterations = 13 Final Relative Residual Norm = 3.655647e-07 # Output file: pfmgbase2d.out.1 Iterations = 13 Final Relative Residual Norm = 3.655647e-07 # Output file: pfmgbase2d.out.2 Iterations = 13 Final Relative Residual Norm = 3.655647e-07 # Output file: pfmgbase2d.out.3 Iterations = 13 Final Relative Residual Norm = 3.655647e-07 # Output file: pfmgbase2d.out.4 Iterations = 13 Final Relative Residual Norm = 3.655647e-07 # Output file: pfmgbase2d.out.5 Iterations = 13 Final Relative Residual Norm = 3.655647e-07 hypre-2.33.0/src/test/TEST_struct/pfmgbase2d.saved.tioga000066400000000000000000000010561477326011500230270ustar00rootroot00000000000000# Output file: pfmgbase2d.out.0 Iterations = 13 Final Relative Residual Norm = 3.655647e-07 # Output file: pfmgbase2d.out.1 Iterations = 13 Final Relative Residual Norm = 3.655647e-07 # Output file: pfmgbase2d.out.2 Iterations = 13 Final Relative Residual Norm = 3.655647e-07 # Output file: pfmgbase2d.out.3 Iterations = 13 Final Relative Residual Norm = 3.655647e-07 # Output file: pfmgbase2d.out.4 Iterations = 13 Final Relative Residual Norm = 3.655647e-07 # Output file: pfmgbase2d.out.5 Iterations = 13 Final Relative Residual Norm = 3.655647e-07 hypre-2.33.0/src/test/TEST_struct/pfmgbase2d.sh000077500000000000000000000041611477326011500212400ustar00rootroot00000000000000#!/bin/bash # Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) TNAME=`basename $0 .sh` RTOL=$1 ATOL=$2 #============================================================================= # struct: Test parallel and blocking by diffing against base "true" 2d case #============================================================================= tail -3 ${TNAME}.out.0 > ${TNAME}.testdata tail -3 ${TNAME}.out.1 > ${TNAME}.testdata.temp diff ${TNAME}.testdata ${TNAME}.testdata.temp >&2 #============================================================================= tail -3 ${TNAME}.out.2 > ${TNAME}.testdata.temp diff ${TNAME}.testdata ${TNAME}.testdata.temp >&2 #============================================================================= tail -3 ${TNAME}.out.3 > ${TNAME}.testdata.temp diff ${TNAME}.testdata ${TNAME}.testdata.temp >&2 #============================================================================= tail -3 ${TNAME}.out.4 > ${TNAME}.testdata.temp diff ${TNAME}.testdata ${TNAME}.testdata.temp >&2 #============================================================================= tail -3 ${TNAME}.out.5 > ${TNAME}.testdata.temp diff ${TNAME}.testdata ${TNAME}.testdata.temp >&2 #============================================================================= # compare with baseline case #============================================================================= FILES="\ ${TNAME}.out.0\ ${TNAME}.out.1\ ${TNAME}.out.2\ ${TNAME}.out.3\ ${TNAME}.out.4\ ${TNAME}.out.5\ " for i in $FILES do echo "# Output file: $i" tail -3 $i done > ${TNAME}.out # Make sure that the output file is reasonable RUNCOUNT=`echo $FILES | wc -w` OUTCOUNT=`grep "Iterations" ${TNAME}.out | wc -l` if [ "$OUTCOUNT" != "$RUNCOUNT" ]; then echo "Incorrect number of runs in ${TNAME}.out" >&2 fi #============================================================================= # remove temporary files #============================================================================= rm -f ${TNAME}.testdata* hypre-2.33.0/src/test/TEST_struct/pfmgbase3d.jobs000077500000000000000000000024271477326011500215670ustar00rootroot00000000000000#!/bin/bash # Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) #============================================================================= # struct: Run PFMG base 3d case #============================================================================= mpirun -np 1 ./struct -n 12 12 12 -c 2.0 3.0 40 -solver 1 \ > pfmgbase3d.out.0 #============================================================================= # struct: Run PFMG parallel and blocking #============================================================================= mpirun -np 8 ./struct -n 6 6 6 -P 2 2 2 -c 2.0 3.0 40 -solver 1 \ > pfmgbase3d.out.1 mpirun -np 4 ./struct -n 3 12 12 -P 4 1 1 -c 2.0 3.0 40 -solver 1 \ > pfmgbase3d.out.2 mpirun -np 4 ./struct -n 12 3 12 -P 1 4 1 -c 2.0 3.0 40 -solver 1 \ > pfmgbase3d.out.3 mpirun -np 4 ./struct -n 12 12 3 -P 1 1 4 -c 2.0 3.0 40 -solver 1 \ > pfmgbase3d.out.4 mpirun -np 1 ./struct -n 3 4 3 -b 4 3 4 -c 2.0 3.0 40 -solver 1 \ > pfmgbase3d.out.5 mpirun -np 8 ./struct -n 3 3 3 -b 2 2 2 -P 2 2 2 -c 2.0 3.0 40 -solver 1 \ > pfmgbase3d.out.6 mpirun -np 1 ./struct -n 6 6 6 -b 2 2 2 -c 2.0 3.0 40 -solver 1 \ > pfmgbase3d.out.7 hypre-2.33.0/src/test/TEST_struct/pfmgbase3d.saved000066400000000000000000000013501477326011500217230ustar00rootroot00000000000000# Output file: pfmgbase3d.out.0 Iterations = 10 Final Relative Residual Norm = 3.298941e-07 # Output file: pfmgbase3d.out.1 Iterations = 10 Final Relative Residual Norm = 3.298941e-07 # Output file: pfmgbase3d.out.2 Iterations = 10 Final Relative Residual Norm = 3.298941e-07 # Output file: pfmgbase3d.out.3 Iterations = 10 Final Relative Residual Norm = 3.298941e-07 # Output file: pfmgbase3d.out.4 Iterations = 10 Final Relative Residual Norm = 3.298941e-07 # Output file: pfmgbase3d.out.5 Iterations = 10 Final Relative Residual Norm = 3.298941e-07 # Output file: pfmgbase3d.out.6 Iterations = 10 Final Relative Residual Norm = 3.298941e-07 # Output file: pfmgbase3d.out.7 Iterations = 10 Final Relative Residual Norm = 3.298941e-07 hypre-2.33.0/src/test/TEST_struct/pfmgbase3d.saved.florentia000066400000000000000000000013501477326011500237050ustar00rootroot00000000000000# Output file: pfmgbase3d.out.0 Iterations = 10 Final Relative Residual Norm = 3.298941e-07 # Output file: pfmgbase3d.out.1 Iterations = 10 Final Relative Residual Norm = 3.298941e-07 # Output file: pfmgbase3d.out.2 Iterations = 10 Final Relative Residual Norm = 3.298941e-07 # Output file: pfmgbase3d.out.3 Iterations = 10 Final Relative Residual Norm = 3.298941e-07 # Output file: pfmgbase3d.out.4 Iterations = 10 Final Relative Residual Norm = 3.298941e-07 # Output file: pfmgbase3d.out.5 Iterations = 10 Final Relative Residual Norm = 3.298941e-07 # Output file: pfmgbase3d.out.6 Iterations = 10 Final Relative Residual Norm = 3.298941e-07 # Output file: pfmgbase3d.out.7 Iterations = 10 Final Relative Residual Norm = 3.298941e-07 hypre-2.33.0/src/test/TEST_struct/pfmgbase3d.saved.lassen000066400000000000000000000013501477326011500232070ustar00rootroot00000000000000# Output file: pfmgbase3d.out.0 Iterations = 10 Final Relative Residual Norm = 3.298941e-07 # Output file: pfmgbase3d.out.1 Iterations = 10 Final Relative Residual Norm = 3.298941e-07 # Output file: pfmgbase3d.out.2 Iterations = 10 Final Relative Residual Norm = 3.298941e-07 # Output file: pfmgbase3d.out.3 Iterations = 10 Final Relative Residual Norm = 3.298941e-07 # Output file: pfmgbase3d.out.4 Iterations = 10 Final Relative Residual Norm = 3.298941e-07 # Output file: pfmgbase3d.out.5 Iterations = 10 Final Relative Residual Norm = 3.298941e-07 # Output file: pfmgbase3d.out.6 Iterations = 10 Final Relative Residual Norm = 3.298941e-07 # Output file: pfmgbase3d.out.7 Iterations = 10 Final Relative Residual Norm = 3.298941e-07 hypre-2.33.0/src/test/TEST_struct/pfmgbase3d.saved.lassen_cpu000066400000000000000000000013501477326011500240560ustar00rootroot00000000000000# Output file: pfmgbase3d.out.0 Iterations = 10 Final Relative Residual Norm = 3.298941e-07 # Output file: pfmgbase3d.out.1 Iterations = 10 Final Relative Residual Norm = 3.298941e-07 # Output file: pfmgbase3d.out.2 Iterations = 10 Final Relative Residual Norm = 3.298941e-07 # Output file: pfmgbase3d.out.3 Iterations = 10 Final Relative Residual Norm = 3.298941e-07 # Output file: pfmgbase3d.out.4 Iterations = 10 Final Relative Residual Norm = 3.298941e-07 # Output file: pfmgbase3d.out.5 Iterations = 10 Final Relative Residual Norm = 3.298941e-07 # Output file: pfmgbase3d.out.6 Iterations = 10 Final Relative Residual Norm = 3.298941e-07 # Output file: pfmgbase3d.out.7 Iterations = 10 Final Relative Residual Norm = 3.298941e-07 hypre-2.33.0/src/test/TEST_struct/pfmgbase3d.saved.tioga000066400000000000000000000013501477326011500230250ustar00rootroot00000000000000# Output file: pfmgbase3d.out.0 Iterations = 10 Final Relative Residual Norm = 3.298941e-07 # Output file: pfmgbase3d.out.1 Iterations = 10 Final Relative Residual Norm = 3.298941e-07 # Output file: pfmgbase3d.out.2 Iterations = 10 Final Relative Residual Norm = 3.298941e-07 # Output file: pfmgbase3d.out.3 Iterations = 10 Final Relative Residual Norm = 3.298941e-07 # Output file: pfmgbase3d.out.4 Iterations = 10 Final Relative Residual Norm = 3.298941e-07 # Output file: pfmgbase3d.out.5 Iterations = 10 Final Relative Residual Norm = 3.298941e-07 # Output file: pfmgbase3d.out.6 Iterations = 10 Final Relative Residual Norm = 3.298941e-07 # Output file: pfmgbase3d.out.7 Iterations = 10 Final Relative Residual Norm = 3.298941e-07 hypre-2.33.0/src/test/TEST_struct/pfmgbase3d.sh000077500000000000000000000047671477326011500212550ustar00rootroot00000000000000#!/bin/bash # Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) TNAME=`basename $0 .sh` RTOL=$1 ATOL=$2 #============================================================================= # struct: Test PFMG parallel and blocking by diffing against base 3d case #============================================================================= tail -3 ${TNAME}.out.0 > ${TNAME}.testdata tail -3 ${TNAME}.out.1 > ${TNAME}.testdata.temp diff ${TNAME}.testdata ${TNAME}.testdata.temp >&2 #============================================================================= tail -3 ${TNAME}.out.2 > ${TNAME}.testdata.temp diff ${TNAME}.testdata ${TNAME}.testdata.temp >&2 #============================================================================= tail -3 ${TNAME}.out.3 > ${TNAME}.testdata.temp diff ${TNAME}.testdata ${TNAME}.testdata.temp >&2 #============================================================================= tail -3 ${TNAME}.out.4 > ${TNAME}.testdata.temp diff ${TNAME}.testdata ${TNAME}.testdata.temp >&2 #============================================================================= tail -3 ${TNAME}.out.5 > ${TNAME}.testdata.temp diff ${TNAME}.testdata ${TNAME}.testdata.temp >&2 #============================================================================= tail -3 ${TNAME}.out.6 > ${TNAME}.testdata.temp diff ${TNAME}.testdata ${TNAME}.testdata.temp >&2 #============================================================================= tail -3 ${TNAME}.out.7 > ${TNAME}.testdata.temp diff ${TNAME}.testdata ${TNAME}.testdata.temp >&2 #============================================================================= # compare with baseline case #============================================================================= FILES="\ ${TNAME}.out.0\ ${TNAME}.out.1\ ${TNAME}.out.2\ ${TNAME}.out.3\ ${TNAME}.out.4\ ${TNAME}.out.5\ ${TNAME}.out.6\ ${TNAME}.out.7\ " for i in $FILES do echo "# Output file: $i" tail -3 $i done > ${TNAME}.out # Make sure that the output file is reasonable RUNCOUNT=`echo $FILES | wc -w` OUTCOUNT=`grep "Iterations" ${TNAME}.out | wc -l` if [ "$OUTCOUNT" != "$RUNCOUNT" ]; then echo "Incorrect number of runs in ${TNAME}.out" >&2 fi #============================================================================= # remove temporary files #============================================================================= rm -f ${TNAME}.testdata* hypre-2.33.0/src/test/TEST_struct/pfmgconstcoeffmp.jobs000077500000000000000000000052211477326011500231070ustar00rootroot00000000000000#!/bin/bash # Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) #============================================================================= # Make sure that the constant case and variable diag case give the same results #============================================================================= #2D mpirun -np 1 ./struct -d 2 -n 15 15 1 -istart -7 -7 0 -solver 3 -skip 1 -rap 1 > pfmgconstcoeffmp.out.10 mpirun -np 1 ./struct -d 2 -n 15 15 1 -istart -7 -7 0 -solver 4 -skip 1 -rap 1 > pfmgconstcoeffmp.out.11 mpirun -np 1 ./struct -d 2 -n 15 15 1 -istart -7 -7 0 -solver 3 -skip 1 -rap 1 -relax 2 > pfmgconstcoeffmp.out.12 mpirun -np 1 ./struct -d 2 -n 15 15 1 -istart -7 -7 0 -solver 4 -skip 1 -rap 1 -relax 2 > pfmgconstcoeffmp.out.13 # 3D mpirun -np 1 ./struct -n 15 15 15 -istart -7 -7 -7 -solver 3 -skip 1 -rap 1 > pfmgconstcoeffmp.out.20 mpirun -np 1 ./struct -n 15 15 15 -istart -7 -7 -7 -solver 4 -skip 1 -rap 1 > pfmgconstcoeffmp.out.21 mpirun -np 1 ./struct -n 15 15 15 -istart -7 -7 -7 -solver 3 -skip 1 -rap 1 -relax 2 > pfmgconstcoeffmp.out.22 mpirun -np 1 ./struct -n 15 15 15 -istart -7 -7 -7 -solver 4 -skip 1 -rap 1 -relax 2 > pfmgconstcoeffmp.out.23 #============================================================================= # Make sure that serial vs parallel give the same results #============================================================================= mpirun -np 1 ./struct -n 20 20 20 -P 1 1 1 -solver 3 -skip 1 -rap 1 > pfmgconstcoeffmp.out.30 mpirun -np 2 ./struct -n 10 20 20 -P 2 1 1 -solver 3 -skip 1 -rap 1 > pfmgconstcoeffmp.out.31 mpirun -np 1 ./struct -n 20 20 20 -P 1 1 1 -solver 3 > pfmgconstcoeffmp.out.32 mpirun -np 2 ./struct -n 10 20 20 -P 2 1 1 -solver 3 > pfmgconstcoeffmp.out.33 mpirun -np 1 ./struct -n 20 20 20 -P 1 1 1 -solver 3 -relax 2 > pfmgconstcoeffmp.out.34 mpirun -np 2 ./struct -n 10 20 20 -P 2 1 1 -solver 3 -relax 2 > pfmgconstcoeffmp.out.35 mpirun -np 1 ./struct -n 20 20 20 -P 1 1 1 -solver 4 -skip 1 -rap 1 > pfmgconstcoeffmp.out.40 mpirun -np 2 ./struct -n 10 20 20 -P 2 1 1 -solver 4 -skip 1 -rap 1 > pfmgconstcoeffmp.out.41 mpirun -np 1 ./struct -n 20 20 20 -P 1 1 1 -solver 4 > pfmgconstcoeffmp.out.42 mpirun -np 2 ./struct -n 10 20 20 -P 2 1 1 -solver 4 > pfmgconstcoeffmp.out.43 mpirun -np 1 ./struct -n 20 20 20 -P 1 1 1 -solver 4 -relax 2 > pfmgconstcoeffmp.out.44 mpirun -np 2 ./struct -n 10 20 20 -P 2 1 1 -solver 4 -relax 2 > pfmgconstcoeffmp.out.45 hypre-2.33.0/src/test/TEST_struct/pfmgconstcoeffmp.saved000066400000000000000000000037221477326011500232550ustar00rootroot00000000000000# Output file: pfmgconstcoeffmp.out.10 Iterations = 13 Final Relative Residual Norm = 5.378609e-07 # Output file: pfmgconstcoeffmp.out.11 Iterations = 13 Final Relative Residual Norm = 5.378609e-07 # Output file: pfmgconstcoeffmp.out.12 Iterations = 12 Final Relative Residual Norm = 3.999260e-07 # Output file: pfmgconstcoeffmp.out.13 Iterations = 12 Final Relative Residual Norm = 3.999260e-07 # Output file: pfmgconstcoeffmp.out.20 Iterations = 19 Final Relative Residual Norm = 5.033356e-07 # Output file: pfmgconstcoeffmp.out.21 Iterations = 19 Final Relative Residual Norm = 5.033356e-07 # Output file: pfmgconstcoeffmp.out.22 Iterations = 15 Final Relative Residual Norm = 8.833880e-07 # Output file: pfmgconstcoeffmp.out.23 Iterations = 15 Final Relative Residual Norm = 8.833880e-07 # Output file: pfmgconstcoeffmp.out.30 Iterations = 200 Final Relative Residual Norm = 1.095973e+00 # Output file: pfmgconstcoeffmp.out.31 Iterations = 200 Final Relative Residual Norm = 1.095973e+00 # Output file: pfmgconstcoeffmp.out.32 Iterations = 43 Final Relative Residual Norm = 9.925149e-07 # Output file: pfmgconstcoeffmp.out.33 Iterations = 43 Final Relative Residual Norm = 9.925149e-07 # Output file: pfmgconstcoeffmp.out.34 Iterations = 14 Final Relative Residual Norm = 5.920399e-07 # Output file: pfmgconstcoeffmp.out.35 Iterations = 14 Final Relative Residual Norm = 5.920399e-07 # Output file: pfmgconstcoeffmp.out.40 Iterations = 18 Final Relative Residual Norm = 8.028630e-07 # Output file: pfmgconstcoeffmp.out.41 Iterations = 18 Final Relative Residual Norm = 8.028630e-07 # Output file: pfmgconstcoeffmp.out.42 Iterations = 16 Final Relative Residual Norm = 6.371573e-07 # Output file: pfmgconstcoeffmp.out.43 Iterations = 16 Final Relative Residual Norm = 6.371573e-07 # Output file: pfmgconstcoeffmp.out.44 Iterations = 13 Final Relative Residual Norm = 9.856117e-07 # Output file: pfmgconstcoeffmp.out.45 Iterations = 13 Final Relative Residual Norm = 9.856117e-07 hypre-2.33.0/src/test/TEST_struct/pfmgconstcoeffmp.saved.florentia000066400000000000000000000037221477326011500252370ustar00rootroot00000000000000# Output file: pfmgconstcoeffmp.out.10 Iterations = 13 Final Relative Residual Norm = 5.378609e-07 # Output file: pfmgconstcoeffmp.out.11 Iterations = 13 Final Relative Residual Norm = 5.378609e-07 # Output file: pfmgconstcoeffmp.out.12 Iterations = 12 Final Relative Residual Norm = 3.999260e-07 # Output file: pfmgconstcoeffmp.out.13 Iterations = 12 Final Relative Residual Norm = 3.999260e-07 # Output file: pfmgconstcoeffmp.out.20 Iterations = 19 Final Relative Residual Norm = 5.033356e-07 # Output file: pfmgconstcoeffmp.out.21 Iterations = 19 Final Relative Residual Norm = 5.033356e-07 # Output file: pfmgconstcoeffmp.out.22 Iterations = 15 Final Relative Residual Norm = 8.833880e-07 # Output file: pfmgconstcoeffmp.out.23 Iterations = 15 Final Relative Residual Norm = 8.833880e-07 # Output file: pfmgconstcoeffmp.out.30 Iterations = 200 Final Relative Residual Norm = 1.095973e+00 # Output file: pfmgconstcoeffmp.out.31 Iterations = 200 Final Relative Residual Norm = 1.095973e+00 # Output file: pfmgconstcoeffmp.out.32 Iterations = 43 Final Relative Residual Norm = 9.925149e-07 # Output file: pfmgconstcoeffmp.out.33 Iterations = 43 Final Relative Residual Norm = 9.925149e-07 # Output file: pfmgconstcoeffmp.out.34 Iterations = 14 Final Relative Residual Norm = 5.920399e-07 # Output file: pfmgconstcoeffmp.out.35 Iterations = 14 Final Relative Residual Norm = 5.920399e-07 # Output file: pfmgconstcoeffmp.out.40 Iterations = 18 Final Relative Residual Norm = 8.028630e-07 # Output file: pfmgconstcoeffmp.out.41 Iterations = 18 Final Relative Residual Norm = 8.028630e-07 # Output file: pfmgconstcoeffmp.out.42 Iterations = 16 Final Relative Residual Norm = 6.371573e-07 # Output file: pfmgconstcoeffmp.out.43 Iterations = 16 Final Relative Residual Norm = 6.371573e-07 # Output file: pfmgconstcoeffmp.out.44 Iterations = 13 Final Relative Residual Norm = 9.856117e-07 # Output file: pfmgconstcoeffmp.out.45 Iterations = 13 Final Relative Residual Norm = 9.856117e-07 hypre-2.33.0/src/test/TEST_struct/pfmgconstcoeffmp.saved.lassen000066400000000000000000000037221477326011500245410ustar00rootroot00000000000000# Output file: pfmgconstcoeffmp.out.10 Iterations = 13 Final Relative Residual Norm = 5.378609e-07 # Output file: pfmgconstcoeffmp.out.11 Iterations = 13 Final Relative Residual Norm = 5.378609e-07 # Output file: pfmgconstcoeffmp.out.12 Iterations = 12 Final Relative Residual Norm = 3.999260e-07 # Output file: pfmgconstcoeffmp.out.13 Iterations = 12 Final Relative Residual Norm = 3.999260e-07 # Output file: pfmgconstcoeffmp.out.20 Iterations = 19 Final Relative Residual Norm = 5.033356e-07 # Output file: pfmgconstcoeffmp.out.21 Iterations = 19 Final Relative Residual Norm = 5.033356e-07 # Output file: pfmgconstcoeffmp.out.22 Iterations = 15 Final Relative Residual Norm = 8.833880e-07 # Output file: pfmgconstcoeffmp.out.23 Iterations = 15 Final Relative Residual Norm = 8.833880e-07 # Output file: pfmgconstcoeffmp.out.30 Iterations = 200 Final Relative Residual Norm = 1.095973e+00 # Output file: pfmgconstcoeffmp.out.31 Iterations = 200 Final Relative Residual Norm = 1.095973e+00 # Output file: pfmgconstcoeffmp.out.32 Iterations = 43 Final Relative Residual Norm = 9.925149e-07 # Output file: pfmgconstcoeffmp.out.33 Iterations = 43 Final Relative Residual Norm = 9.925149e-07 # Output file: pfmgconstcoeffmp.out.34 Iterations = 14 Final Relative Residual Norm = 5.920399e-07 # Output file: pfmgconstcoeffmp.out.35 Iterations = 14 Final Relative Residual Norm = 5.920399e-07 # Output file: pfmgconstcoeffmp.out.40 Iterations = 18 Final Relative Residual Norm = 8.028630e-07 # Output file: pfmgconstcoeffmp.out.41 Iterations = 18 Final Relative Residual Norm = 8.028630e-07 # Output file: pfmgconstcoeffmp.out.42 Iterations = 16 Final Relative Residual Norm = 6.371573e-07 # Output file: pfmgconstcoeffmp.out.43 Iterations = 16 Final Relative Residual Norm = 6.371573e-07 # Output file: pfmgconstcoeffmp.out.44 Iterations = 13 Final Relative Residual Norm = 9.856117e-07 # Output file: pfmgconstcoeffmp.out.45 Iterations = 13 Final Relative Residual Norm = 9.856117e-07 hypre-2.33.0/src/test/TEST_struct/pfmgconstcoeffmp.saved.lassen_cpu000066400000000000000000000037221477326011500254100ustar00rootroot00000000000000# Output file: pfmgconstcoeffmp.out.10 Iterations = 13 Final Relative Residual Norm = 5.378609e-07 # Output file: pfmgconstcoeffmp.out.11 Iterations = 13 Final Relative Residual Norm = 5.378609e-07 # Output file: pfmgconstcoeffmp.out.12 Iterations = 12 Final Relative Residual Norm = 3.999260e-07 # Output file: pfmgconstcoeffmp.out.13 Iterations = 12 Final Relative Residual Norm = 3.999260e-07 # Output file: pfmgconstcoeffmp.out.20 Iterations = 19 Final Relative Residual Norm = 5.033356e-07 # Output file: pfmgconstcoeffmp.out.21 Iterations = 19 Final Relative Residual Norm = 5.033356e-07 # Output file: pfmgconstcoeffmp.out.22 Iterations = 15 Final Relative Residual Norm = 8.833880e-07 # Output file: pfmgconstcoeffmp.out.23 Iterations = 15 Final Relative Residual Norm = 8.833880e-07 # Output file: pfmgconstcoeffmp.out.30 Iterations = 200 Final Relative Residual Norm = 1.095973e+00 # Output file: pfmgconstcoeffmp.out.31 Iterations = 200 Final Relative Residual Norm = 1.095973e+00 # Output file: pfmgconstcoeffmp.out.32 Iterations = 43 Final Relative Residual Norm = 9.925149e-07 # Output file: pfmgconstcoeffmp.out.33 Iterations = 43 Final Relative Residual Norm = 9.925149e-07 # Output file: pfmgconstcoeffmp.out.34 Iterations = 14 Final Relative Residual Norm = 5.920399e-07 # Output file: pfmgconstcoeffmp.out.35 Iterations = 14 Final Relative Residual Norm = 5.920399e-07 # Output file: pfmgconstcoeffmp.out.40 Iterations = 18 Final Relative Residual Norm = 8.028630e-07 # Output file: pfmgconstcoeffmp.out.41 Iterations = 18 Final Relative Residual Norm = 8.028630e-07 # Output file: pfmgconstcoeffmp.out.42 Iterations = 16 Final Relative Residual Norm = 6.371573e-07 # Output file: pfmgconstcoeffmp.out.43 Iterations = 16 Final Relative Residual Norm = 6.371573e-07 # Output file: pfmgconstcoeffmp.out.44 Iterations = 13 Final Relative Residual Norm = 9.856117e-07 # Output file: pfmgconstcoeffmp.out.45 Iterations = 13 Final Relative Residual Norm = 9.856117e-07 hypre-2.33.0/src/test/TEST_struct/pfmgconstcoeffmp.saved.tioga000066400000000000000000000037221477326011500243570ustar00rootroot00000000000000# Output file: pfmgconstcoeffmp.out.10 Iterations = 13 Final Relative Residual Norm = 5.378609e-07 # Output file: pfmgconstcoeffmp.out.11 Iterations = 13 Final Relative Residual Norm = 5.378609e-07 # Output file: pfmgconstcoeffmp.out.12 Iterations = 12 Final Relative Residual Norm = 3.999260e-07 # Output file: pfmgconstcoeffmp.out.13 Iterations = 12 Final Relative Residual Norm = 3.999260e-07 # Output file: pfmgconstcoeffmp.out.20 Iterations = 19 Final Relative Residual Norm = 5.033356e-07 # Output file: pfmgconstcoeffmp.out.21 Iterations = 19 Final Relative Residual Norm = 5.033356e-07 # Output file: pfmgconstcoeffmp.out.22 Iterations = 15 Final Relative Residual Norm = 8.833880e-07 # Output file: pfmgconstcoeffmp.out.23 Iterations = 15 Final Relative Residual Norm = 8.833880e-07 # Output file: pfmgconstcoeffmp.out.30 Iterations = 200 Final Relative Residual Norm = 1.095973e+00 # Output file: pfmgconstcoeffmp.out.31 Iterations = 200 Final Relative Residual Norm = 1.095973e+00 # Output file: pfmgconstcoeffmp.out.32 Iterations = 43 Final Relative Residual Norm = 9.925149e-07 # Output file: pfmgconstcoeffmp.out.33 Iterations = 43 Final Relative Residual Norm = 9.925149e-07 # Output file: pfmgconstcoeffmp.out.34 Iterations = 14 Final Relative Residual Norm = 5.920399e-07 # Output file: pfmgconstcoeffmp.out.35 Iterations = 14 Final Relative Residual Norm = 5.920399e-07 # Output file: pfmgconstcoeffmp.out.40 Iterations = 18 Final Relative Residual Norm = 8.028630e-07 # Output file: pfmgconstcoeffmp.out.41 Iterations = 18 Final Relative Residual Norm = 8.028630e-07 # Output file: pfmgconstcoeffmp.out.42 Iterations = 16 Final Relative Residual Norm = 6.371573e-07 # Output file: pfmgconstcoeffmp.out.43 Iterations = 16 Final Relative Residual Norm = 6.371573e-07 # Output file: pfmgconstcoeffmp.out.44 Iterations = 13 Final Relative Residual Norm = 9.856117e-07 # Output file: pfmgconstcoeffmp.out.45 Iterations = 13 Final Relative Residual Norm = 9.856117e-07 hypre-2.33.0/src/test/TEST_struct/pfmgconstcoeffmp.sh000077500000000000000000000062501477326011500225670ustar00rootroot00000000000000#!/bin/bash # Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) TNAME=`basename $0 .sh` RTOL=$1 ATOL=$2 #============================================================================= # Make sure that the constant case and variable diag case give the same results #============================================================================= #2D tail -3 ${TNAME}.out.10 > ${TNAME}.testdata tail -3 ${TNAME}.out.11 > ${TNAME}.testdata.temp diff ${TNAME}.testdata ${TNAME}.testdata.temp >&2 tail -3 ${TNAME}.out.12 > ${TNAME}.testdata tail -3 ${TNAME}.out.13 > ${TNAME}.testdata.temp diff ${TNAME}.testdata ${TNAME}.testdata.temp >&2 # 3D test tail -3 ${TNAME}.out.20 > ${TNAME}.testdata tail -3 ${TNAME}.out.21 > ${TNAME}.testdata.temp diff ${TNAME}.testdata ${TNAME}.testdata.temp >&2 tail -3 ${TNAME}.out.22 > ${TNAME}.testdata tail -3 ${TNAME}.out.23 > ${TNAME}.testdata.temp diff ${TNAME}.testdata ${TNAME}.testdata.temp >&2 #============================================================================= # Make sure that serial vs parallel give the same results #============================================================================= tail -3 ${TNAME}.out.30 > ${TNAME}.testdata tail -3 ${TNAME}.out.31 > ${TNAME}.testdata.temp diff ${TNAME}.testdata ${TNAME}.testdata.temp >&2 tail -3 ${TNAME}.out.32 > ${TNAME}.testdata tail -3 ${TNAME}.out.33 > ${TNAME}.testdata.temp diff ${TNAME}.testdata ${TNAME}.testdata.temp >&2 tail -3 ${TNAME}.out.34 > ${TNAME}.testdata tail -3 ${TNAME}.out.35 > ${TNAME}.testdata.temp diff ${TNAME}.testdata ${TNAME}.testdata.temp >&2 tail -3 ${TNAME}.out.40 > ${TNAME}.testdata tail -3 ${TNAME}.out.41 > ${TNAME}.testdata.temp diff ${TNAME}.testdata ${TNAME}.testdata.temp >&2 tail -3 ${TNAME}.out.42 > ${TNAME}.testdata tail -3 ${TNAME}.out.43 > ${TNAME}.testdata.temp diff ${TNAME}.testdata ${TNAME}.testdata.temp >&2 tail -3 ${TNAME}.out.44 > ${TNAME}.testdata tail -3 ${TNAME}.out.45 > ${TNAME}.testdata.temp diff ${TNAME}.testdata ${TNAME}.testdata.temp >&2 #============================================================================= # compare with baseline case #============================================================================= FILES="\ ${TNAME}.out.10\ ${TNAME}.out.11\ ${TNAME}.out.12\ ${TNAME}.out.13\ ${TNAME}.out.20\ ${TNAME}.out.21\ ${TNAME}.out.22\ ${TNAME}.out.23\ ${TNAME}.out.30\ ${TNAME}.out.31\ ${TNAME}.out.32\ ${TNAME}.out.33\ ${TNAME}.out.34\ ${TNAME}.out.35\ ${TNAME}.out.40\ ${TNAME}.out.41\ ${TNAME}.out.42\ ${TNAME}.out.43\ ${TNAME}.out.44\ ${TNAME}.out.45\ " for i in $FILES do echo "# Output file: $i" tail -3 $i done > ${TNAME}.out # Make sure that the output file is reasonable RUNCOUNT=`echo $FILES | wc -w` OUTCOUNT=`grep "Iterations" ${TNAME}.out | wc -l` if [ "$OUTCOUNT" != "$RUNCOUNT" ]; then echo "Incorrect number of runs in ${TNAME}.out" >&2 fi #============================================================================= # remove temporary files #============================================================================= rm -f ${TNAME}.testdata* hypre-2.33.0/src/test/TEST_struct/pfmgorient.jobs000077500000000000000000000012421477326011500217200ustar00rootroot00000000000000#!/bin/bash # Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) #============================================================================= # struct: Run PFMG 1d solve of the same problem in different orientations #============================================================================= mpirun -np 1 ./struct -n 10 10 10 -c 1 1 256 -solver 1 \ > pfmgorient.out.0 mpirun -np 1 ./struct -n 10 10 10 -c 1 256 1 -solver 1 \ > pfmgorient.out.1 mpirun -np 1 ./struct -n 10 10 10 -c 256 1 1 -solver 1 \ > pfmgorient.out.2 hypre-2.33.0/src/test/TEST_struct/pfmgorient.saved000066400000000000000000000004241477326011500220630ustar00rootroot00000000000000# Output file: pfmgorient.out.0 Iterations = 9 Final Relative Residual Norm = 1.987658e-07 # Output file: pfmgorient.out.1 Iterations = 9 Final Relative Residual Norm = 1.987658e-07 # Output file: pfmgorient.out.2 Iterations = 9 Final Relative Residual Norm = 1.987658e-07 hypre-2.33.0/src/test/TEST_struct/pfmgorient.saved.florentia000066400000000000000000000004241477326011500240450ustar00rootroot00000000000000# Output file: pfmgorient.out.0 Iterations = 9 Final Relative Residual Norm = 1.987658e-07 # Output file: pfmgorient.out.1 Iterations = 9 Final Relative Residual Norm = 1.987658e-07 # Output file: pfmgorient.out.2 Iterations = 9 Final Relative Residual Norm = 1.987658e-07 hypre-2.33.0/src/test/TEST_struct/pfmgorient.saved.lassen000066400000000000000000000004241477326011500233470ustar00rootroot00000000000000# Output file: pfmgorient.out.0 Iterations = 9 Final Relative Residual Norm = 1.987658e-07 # Output file: pfmgorient.out.1 Iterations = 9 Final Relative Residual Norm = 1.987658e-07 # Output file: pfmgorient.out.2 Iterations = 9 Final Relative Residual Norm = 1.987658e-07 hypre-2.33.0/src/test/TEST_struct/pfmgorient.saved.lassen_cpu000066400000000000000000000004241477326011500242160ustar00rootroot00000000000000# Output file: pfmgorient.out.0 Iterations = 9 Final Relative Residual Norm = 1.987658e-07 # Output file: pfmgorient.out.1 Iterations = 9 Final Relative Residual Norm = 1.987658e-07 # Output file: pfmgorient.out.2 Iterations = 9 Final Relative Residual Norm = 1.987658e-07 hypre-2.33.0/src/test/TEST_struct/pfmgorient.saved.tioga000066400000000000000000000004241477326011500231650ustar00rootroot00000000000000# Output file: pfmgorient.out.0 Iterations = 9 Final Relative Residual Norm = 1.987658e-07 # Output file: pfmgorient.out.1 Iterations = 9 Final Relative Residual Norm = 1.987658e-07 # Output file: pfmgorient.out.2 Iterations = 9 Final Relative Residual Norm = 1.987658e-07 hypre-2.33.0/src/test/TEST_struct/pfmgorient.sh000077500000000000000000000030461477326011500214010ustar00rootroot00000000000000#!/bin/bash # Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) TNAME=`basename $0 .sh` RTOL=$1 ATOL=$2 #============================================================================= # struct: Test PFMG 1d solve of the same problem in different orientations #============================================================================= tail -3 ${TNAME}.out.0 > ${TNAME}.testdata tail -3 ${TNAME}.out.1 > ${TNAME}.testdata.temp diff ${TNAME}.testdata ${TNAME}.testdata.temp >&2 #============================================================================= tail -3 ${TNAME}.out.2 > ${TNAME}.testdata.temp diff ${TNAME}.testdata ${TNAME}.testdata.temp >&2 #============================================================================= # compare with baseline case #============================================================================= FILES="\ ${TNAME}.out.0\ ${TNAME}.out.1\ ${TNAME}.out.2\ " for i in $FILES do echo "# Output file: $i" tail -3 $i done > ${TNAME}.out # Make sure that the output file is reasonable RUNCOUNT=`echo $FILES | wc -w` OUTCOUNT=`grep "Iterations" ${TNAME}.out | wc -l` if [ "$OUTCOUNT" != "$RUNCOUNT" ]; then echo "Incorrect number of runs in ${TNAME}.out" >&2 fi #============================================================================= # remove temporary files #============================================================================= rm -f ${TNAME}.testdata* hypre-2.33.0/src/test/TEST_struct/pfmgtest1d.jobs000077500000000000000000000012601477326011500216240ustar00rootroot00000000000000#!/bin/bash # Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) #============================================================================= # struct: Run PFMG 1d run as 2d and 3d in different configurations. #============================================================================= mpirun -np 1 ./struct -n 1 12 1 -c 0 1 0 -d 2 -solver 1 \ > pfmgtest1d.out.0 mpirun -np 3 ./struct -n 1 2 1 -P 1 3 1 -b 1 2 1 -c 0 1 0 -solver 1 \ > pfmgtest1d.out.1 mpirun -np 4 ./struct -n 1 1 3 -P 1 1 4 -c 0 0 1 -solver 1 \ > pfmgtest1d.out.2 hypre-2.33.0/src/test/TEST_struct/pfmgtest1d.saved000066400000000000000000000004241477326011500217670ustar00rootroot00000000000000# Output file: pfmgtest1d.out.0 Iterations = 9 Final Relative Residual Norm = 2.021867e-07 # Output file: pfmgtest1d.out.1 Iterations = 9 Final Relative Residual Norm = 2.021867e-07 # Output file: pfmgtest1d.out.2 Iterations = 9 Final Relative Residual Norm = 2.021867e-07 hypre-2.33.0/src/test/TEST_struct/pfmgtest1d.saved.florentia000066400000000000000000000004241477326011500237510ustar00rootroot00000000000000# Output file: pfmgtest1d.out.0 Iterations = 9 Final Relative Residual Norm = 2.021867e-07 # Output file: pfmgtest1d.out.1 Iterations = 9 Final Relative Residual Norm = 2.021867e-07 # Output file: pfmgtest1d.out.2 Iterations = 9 Final Relative Residual Norm = 2.021867e-07 hypre-2.33.0/src/test/TEST_struct/pfmgtest1d.saved.lassen000066400000000000000000000004241477326011500232530ustar00rootroot00000000000000# Output file: pfmgtest1d.out.0 Iterations = 9 Final Relative Residual Norm = 2.021867e-07 # Output file: pfmgtest1d.out.1 Iterations = 9 Final Relative Residual Norm = 2.021867e-07 # Output file: pfmgtest1d.out.2 Iterations = 9 Final Relative Residual Norm = 2.021867e-07 hypre-2.33.0/src/test/TEST_struct/pfmgtest1d.saved.lassen_cpu000066400000000000000000000004241477326011500241220ustar00rootroot00000000000000# Output file: pfmgtest1d.out.0 Iterations = 9 Final Relative Residual Norm = 2.021867e-07 # Output file: pfmgtest1d.out.1 Iterations = 9 Final Relative Residual Norm = 2.021867e-07 # Output file: pfmgtest1d.out.2 Iterations = 9 Final Relative Residual Norm = 2.021867e-07 hypre-2.33.0/src/test/TEST_struct/pfmgtest1d.saved.tioga000066400000000000000000000004241477326011500230710ustar00rootroot00000000000000# Output file: pfmgtest1d.out.0 Iterations = 9 Final Relative Residual Norm = 2.021867e-07 # Output file: pfmgtest1d.out.1 Iterations = 9 Final Relative Residual Norm = 2.021867e-07 # Output file: pfmgtest1d.out.2 Iterations = 9 Final Relative Residual Norm = 2.021867e-07 hypre-2.33.0/src/test/TEST_struct/pfmgtest1d.sh000077500000000000000000000017731477326011500213120ustar00rootroot00000000000000#!/bin/bash # Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) TNAME=`basename $0 .sh` RTOL=$1 ATOL=$2 #============================================================================= # compare with baseline case #============================================================================= FILES="\ ${TNAME}.out.0\ ${TNAME}.out.1\ ${TNAME}.out.2\ " for i in $FILES do echo "# Output file: $i" tail -3 $i done > ${TNAME}.out # Make sure that the output file is reasonable RUNCOUNT=`echo $FILES | wc -w` OUTCOUNT=`grep "Iterations" ${TNAME}.out | wc -l` if [ "$OUTCOUNT" != "$RUNCOUNT" ]; then echo "Incorrect number of runs in ${TNAME}.out" >&2 fi #============================================================================= # remove temporary files #============================================================================= # rm -f ${TNAME}.testdata* hypre-2.33.0/src/test/TEST_struct/pfmgvcycle.jobs000077500000000000000000000010521477326011500217040ustar00rootroot00000000000000#!/bin/bash # Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) #============================================================================= # struct: Run PFMG V(1,0) and V(0,1) cycles. #============================================================================= mpirun -np 3 ./struct -P 1 1 3 -v 1 0 -solver 1 \ > pfmgvcycle.out.0 mpirun -np 3 ./struct -P 1 1 3 -v 0 1 -solver 1 \ > pfmgvcycle.out.1 hypre-2.33.0/src/test/TEST_struct/pfmgvcycle.saved000066400000000000000000000002721477326011500220510ustar00rootroot00000000000000# Output file: pfmgvcycle.out.0 Iterations = 30 Final Relative Residual Norm = 8.360175e-07 # Output file: pfmgvcycle.out.1 Iterations = 30 Final Relative Residual Norm = 7.107142e-07 hypre-2.33.0/src/test/TEST_struct/pfmgvcycle.saved.florentia000066400000000000000000000002721477326011500240330ustar00rootroot00000000000000# Output file: pfmgvcycle.out.0 Iterations = 30 Final Relative Residual Norm = 8.360175e-07 # Output file: pfmgvcycle.out.1 Iterations = 30 Final Relative Residual Norm = 7.107142e-07 hypre-2.33.0/src/test/TEST_struct/pfmgvcycle.saved.lassen000066400000000000000000000002721477326011500233350ustar00rootroot00000000000000# Output file: pfmgvcycle.out.0 Iterations = 30 Final Relative Residual Norm = 8.360175e-07 # Output file: pfmgvcycle.out.1 Iterations = 30 Final Relative Residual Norm = 7.107142e-07 hypre-2.33.0/src/test/TEST_struct/pfmgvcycle.saved.lassen_cpu000066400000000000000000000002721477326011500242040ustar00rootroot00000000000000# Output file: pfmgvcycle.out.0 Iterations = 30 Final Relative Residual Norm = 8.360175e-07 # Output file: pfmgvcycle.out.1 Iterations = 30 Final Relative Residual Norm = 7.107142e-07 hypre-2.33.0/src/test/TEST_struct/pfmgvcycle.saved.tioga000066400000000000000000000002721477326011500231530ustar00rootroot00000000000000# Output file: pfmgvcycle.out.0 Iterations = 30 Final Relative Residual Norm = 8.360175e-07 # Output file: pfmgvcycle.out.1 Iterations = 30 Final Relative Residual Norm = 7.107142e-07 hypre-2.33.0/src/test/TEST_struct/pfmgvcycle.sh000077500000000000000000000017521477326011500213700ustar00rootroot00000000000000#!/bin/bash # Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) TNAME=`basename $0 .sh` RTOL=$1 ATOL=$2 #============================================================================= # compare with baseline case #============================================================================= FILES="\ ${TNAME}.out.0\ ${TNAME}.out.1\ " for i in $FILES do echo "# Output file: $i" tail -3 $i done > ${TNAME}.out # Make sure that the output file is reasonable RUNCOUNT=`echo $FILES | wc -w` OUTCOUNT=`grep "Iterations" ${TNAME}.out | wc -l` if [ "$OUTCOUNT" != "$RUNCOUNT" ]; then echo "Incorrect number of runs in ${TNAME}.out" >&2 fi #============================================================================= # remove temporary files #============================================================================= # rm -f ${TNAME}.testdata* hypre-2.33.0/src/test/TEST_struct/psmgbase3d.jobs000077500000000000000000000020031477326011500215720ustar00rootroot00000000000000#!/bin/bash # Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) #============================================================================= # struct: Run Periodic SMG base 3d case #============================================================================= mpirun -np 1 ./struct -n 8 8 8 -p 0 8 8 -solver 0 \ > psmgbase3d.out.0 #============================================================================= # struct: Run Periodic SMG parallel and blocking #============================================================================= mpirun -np 1 ./struct -n 4 4 4 -P 1 1 1 -p 0 8 8 -b 2 2 2 -solver 0 \ > psmgbase3d.out.1 mpirun -np 4 ./struct -n 2 8 8 -P 4 1 1 -p 0 8 8 -solver 0 \ > psmgbase3d.out.2 mpirun -np 4 ./struct -n 8 2 8 -P 1 4 1 -p 0 8 8 -solver 0 \ > psmgbase3d.out.3 mpirun -np 4 ./struct -n 8 8 2 -P 1 1 4 -p 0 8 8 -solver 0 \ > psmgbase3d.out.4 hypre-2.33.0/src/test/TEST_struct/psmgbase3d.saved000066400000000000000000000007141477326011500217430ustar00rootroot00000000000000# Output file: psmgbase3d.out.0 Iterations = 6 Final Relative Residual Norm = 7.016404e-07 # Output file: psmgbase3d.out.1 Iterations = 6 Final Relative Residual Norm = 7.016404e-07 # Output file: psmgbase3d.out.2 Iterations = 6 Final Relative Residual Norm = 7.016404e-07 # Output file: psmgbase3d.out.3 Iterations = 6 Final Relative Residual Norm = 7.016404e-07 # Output file: psmgbase3d.out.4 Iterations = 6 Final Relative Residual Norm = 7.016404e-07 hypre-2.33.0/src/test/TEST_struct/psmgbase3d.saved.florentia000066400000000000000000000007141477326011500237250ustar00rootroot00000000000000# Output file: psmgbase3d.out.0 Iterations = 6 Final Relative Residual Norm = 7.016404e-07 # Output file: psmgbase3d.out.1 Iterations = 6 Final Relative Residual Norm = 7.016404e-07 # Output file: psmgbase3d.out.2 Iterations = 6 Final Relative Residual Norm = 7.016404e-07 # Output file: psmgbase3d.out.3 Iterations = 6 Final Relative Residual Norm = 7.016404e-07 # Output file: psmgbase3d.out.4 Iterations = 6 Final Relative Residual Norm = 7.016404e-07 hypre-2.33.0/src/test/TEST_struct/psmgbase3d.saved.lassen000066400000000000000000000007141477326011500232270ustar00rootroot00000000000000# Output file: psmgbase3d.out.0 Iterations = 6 Final Relative Residual Norm = 7.016404e-07 # Output file: psmgbase3d.out.1 Iterations = 6 Final Relative Residual Norm = 7.016404e-07 # Output file: psmgbase3d.out.2 Iterations = 6 Final Relative Residual Norm = 7.016404e-07 # Output file: psmgbase3d.out.3 Iterations = 6 Final Relative Residual Norm = 7.016404e-07 # Output file: psmgbase3d.out.4 Iterations = 6 Final Relative Residual Norm = 7.016404e-07 hypre-2.33.0/src/test/TEST_struct/psmgbase3d.saved.lassen_cpu000066400000000000000000000007141477326011500240760ustar00rootroot00000000000000# Output file: psmgbase3d.out.0 Iterations = 6 Final Relative Residual Norm = 7.016404e-07 # Output file: psmgbase3d.out.1 Iterations = 6 Final Relative Residual Norm = 7.016404e-07 # Output file: psmgbase3d.out.2 Iterations = 6 Final Relative Residual Norm = 7.016404e-07 # Output file: psmgbase3d.out.3 Iterations = 6 Final Relative Residual Norm = 7.016404e-07 # Output file: psmgbase3d.out.4 Iterations = 6 Final Relative Residual Norm = 7.016404e-07 hypre-2.33.0/src/test/TEST_struct/psmgbase3d.saved.tioga000066400000000000000000000007141477326011500230450ustar00rootroot00000000000000# Output file: psmgbase3d.out.0 Iterations = 6 Final Relative Residual Norm = 7.016404e-07 # Output file: psmgbase3d.out.1 Iterations = 6 Final Relative Residual Norm = 7.016404e-07 # Output file: psmgbase3d.out.2 Iterations = 6 Final Relative Residual Norm = 7.016404e-07 # Output file: psmgbase3d.out.3 Iterations = 6 Final Relative Residual Norm = 7.016404e-07 # Output file: psmgbase3d.out.4 Iterations = 6 Final Relative Residual Norm = 7.016404e-07 hypre-2.33.0/src/test/TEST_struct/psmgbase3d.sh000077500000000000000000000036461477326011500212650ustar00rootroot00000000000000#!/bin/bash # Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) TNAME=`basename $0 .sh` RTOL=$1 ATOL=$2 #============================================================================= # struct: Test parallel and blocking by diffing against base 3d case #============================================================================= tail -3 ${TNAME}.out.0 > ${TNAME}.testdata tail -3 ${TNAME}.out.1 > ${TNAME}.testdata.temp diff ${TNAME}.testdata ${TNAME}.testdata.temp >&2 #============================================================================= tail -3 ${TNAME}.out.2 > ${TNAME}.testdata.temp diff ${TNAME}.testdata ${TNAME}.testdata.temp >&2 #============================================================================= tail -3 ${TNAME}.out.3 > ${TNAME}.testdata.temp diff ${TNAME}.testdata ${TNAME}.testdata.temp >&2 #============================================================================= tail -3 ${TNAME}.out.4 > ${TNAME}.testdata.temp diff ${TNAME}.testdata ${TNAME}.testdata.temp >&2 #============================================================================= # compare with baseline case #============================================================================= FILES="\ ${TNAME}.out.0\ ${TNAME}.out.1\ ${TNAME}.out.2\ ${TNAME}.out.3\ ${TNAME}.out.4\ " for i in $FILES do echo "# Output file: $i" tail -3 $i done > ${TNAME}.out # Make sure that the output file is reasonable RUNCOUNT=`echo $FILES | wc -w` OUTCOUNT=`grep "Iterations" ${TNAME}.out | wc -l` if [ "$OUTCOUNT" != "$RUNCOUNT" ]; then echo "Incorrect number of runs in ${TNAME}.out" >&2 fi #============================================================================= # remove temporary files #============================================================================= rm -f ${TNAME}.testdata* hypre-2.33.0/src/test/TEST_struct/psmgtest3d.jobs000077500000000000000000000017131477326011500216460ustar00rootroot00000000000000#!/bin/bash # Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) #============================================================================= # struct: Run Periodic SMG base 3d case (periodic in x), test parallel # and blocking, and run a full periodic case. # Note: driver sets up right hand size for full periodic case that # satifies compatibility condition, it (the rhs) is dependent on blocking # and parallel partitioning. Thus results will differ with number of # blocks and processors. #============================================================================= mpirun -np 1 ./struct -n 8 8 8 -p 8 0 0 -solver 0 \ > psmgtest3d.out.0 mpirun -np 8 ./struct -n 2 2 2 -P 2 2 2 -p 8 0 0 -b 2 2 2 -solver 0 \ > psmgtest3d.out.1 mpirun -np 4 ./struct -n 4 8 4 -P 2 1 2 -p 8 8 8 -solver 0 \ > psmgtest3d.out.2 hypre-2.33.0/src/test/TEST_struct/psmgtest3d.saved000066400000000000000000000002701477326011500220050ustar00rootroot00000000000000# Output file: psmgtest3d.out.0 Iterations = 5 Final Relative Residual Norm = 6.944705e-08 # Output file: psmgtest3d.out.1 Iterations = 5 Final Relative Residual Norm = 6.944705e-08 hypre-2.33.0/src/test/TEST_struct/psmgtest3d.saved.florentia000066400000000000000000000002701477326011500237670ustar00rootroot00000000000000# Output file: psmgtest3d.out.0 Iterations = 5 Final Relative Residual Norm = 6.944705e-08 # Output file: psmgtest3d.out.1 Iterations = 5 Final Relative Residual Norm = 6.944705e-08 hypre-2.33.0/src/test/TEST_struct/psmgtest3d.saved.lassen000066400000000000000000000002701477326011500232710ustar00rootroot00000000000000# Output file: psmgtest3d.out.0 Iterations = 5 Final Relative Residual Norm = 6.944705e-08 # Output file: psmgtest3d.out.1 Iterations = 5 Final Relative Residual Norm = 6.944705e-08 hypre-2.33.0/src/test/TEST_struct/psmgtest3d.saved.lassen_cpu000066400000000000000000000002701477326011500241400ustar00rootroot00000000000000# Output file: psmgtest3d.out.0 Iterations = 5 Final Relative Residual Norm = 6.944705e-08 # Output file: psmgtest3d.out.1 Iterations = 5 Final Relative Residual Norm = 6.944705e-08 hypre-2.33.0/src/test/TEST_struct/psmgtest3d.saved.tioga000066400000000000000000000002701477326011500231070ustar00rootroot00000000000000# Output file: psmgtest3d.out.0 Iterations = 5 Final Relative Residual Norm = 6.944705e-08 # Output file: psmgtest3d.out.1 Iterations = 5 Final Relative Residual Norm = 6.944705e-08 hypre-2.33.0/src/test/TEST_struct/psmgtest3d.sh000077500000000000000000000031641477326011500213250ustar00rootroot00000000000000#!/bin/bash # Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) TNAME=`basename $0 .sh` RTOL=$1 ATOL=$2 #============================================================================= # struct: Test Periodic SMG base 3d case (periodic in x), test parallel and # blocking, and run a full periodic case. Note: driver sets up right hand size # for full periodic case that satifies compatibility condition, it (the rhs) is # dependent on blocking and parallel partitioning. Thus results will differ with # number of blocks and processors. #============================================================================= tail -3 ${TNAME}.out.0 > ${TNAME}.testdata tail -3 ${TNAME}.out.1 > ${TNAME}.testdata.temp diff ${TNAME}.testdata ${TNAME}.testdata.temp >&2 #============================================================================= # compare with baseline case #============================================================================= FILES="\ ${TNAME}.out.0\ ${TNAME}.out.1\ " for i in $FILES do echo "# Output file: $i" tail -3 $i done > ${TNAME}.out # Make sure that the output file is reasonable RUNCOUNT=`echo $FILES | wc -w` OUTCOUNT=`grep "Iterations" ${TNAME}.out | wc -l` if [ "$OUTCOUNT" != "$RUNCOUNT" ]; then echo "Incorrect number of runs in ${TNAME}.out" >&2 fi #============================================================================= # remove temporary files #============================================================================= rm -f ${TNAME}.testdata* hypre-2.33.0/src/test/TEST_struct/smgbase1d.jobs000077500000000000000000000010731477326011500214160ustar00rootroot00000000000000#!/bin/bash # Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) #============================================================================= # struct: Test 1d run as 2d and 3d #============================================================================= mpirun -np 1 ./struct -n 12 1 1 -c 1 0 0 -d 2 -solver 0 \ > smgbase1d.out.0 mpirun -np 2 ./struct -n 2 1 1 -P 2 1 1 -b 3 1 1 -c 1 0 0 -solver 0 \ > smgbase1d.out.1 hypre-2.33.0/src/test/TEST_struct/smgbase1d.saved000066400000000000000000000002661477326011500215630ustar00rootroot00000000000000# Output file: smgbase1d.out.0 Iterations = 1 Final Relative Residual Norm = 0.000000e+00 # Output file: smgbase1d.out.1 Iterations = 1 Final Relative Residual Norm = 0.000000e+00 hypre-2.33.0/src/test/TEST_struct/smgbase1d.saved.florentia000066400000000000000000000002661477326011500235450ustar00rootroot00000000000000# Output file: smgbase1d.out.0 Iterations = 1 Final Relative Residual Norm = 0.000000e+00 # Output file: smgbase1d.out.1 Iterations = 1 Final Relative Residual Norm = 0.000000e+00 hypre-2.33.0/src/test/TEST_struct/smgbase1d.saved.lassen000066400000000000000000000002661477326011500230470ustar00rootroot00000000000000# Output file: smgbase1d.out.0 Iterations = 1 Final Relative Residual Norm = 0.000000e+00 # Output file: smgbase1d.out.1 Iterations = 1 Final Relative Residual Norm = 0.000000e+00 hypre-2.33.0/src/test/TEST_struct/smgbase1d.saved.lassen_cpu000066400000000000000000000002661477326011500237160ustar00rootroot00000000000000# Output file: smgbase1d.out.0 Iterations = 1 Final Relative Residual Norm = 0.000000e+00 # Output file: smgbase1d.out.1 Iterations = 1 Final Relative Residual Norm = 0.000000e+00 hypre-2.33.0/src/test/TEST_struct/smgbase1d.saved.tioga000066400000000000000000000002661477326011500226650ustar00rootroot00000000000000# Output file: smgbase1d.out.0 Iterations = 1 Final Relative Residual Norm = 0.000000e+00 # Output file: smgbase1d.out.1 Iterations = 1 Final Relative Residual Norm = 0.000000e+00 hypre-2.33.0/src/test/TEST_struct/smgbase1d.sh000077500000000000000000000025301477326011500210720ustar00rootroot00000000000000#!/bin/bash # Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) TNAME=`basename $0 .sh` RTOL=$1 ATOL=$2 #============================================================================= # struct: Test 1d run as 2d and 3d by diffing against each other. #============================================================================= tail -3 ${TNAME}.out.0 > ${TNAME}.testdata tail -3 ${TNAME}.out.1 > ${TNAME}.testdata.temp diff ${TNAME}.testdata ${TNAME}.testdata.temp >&2 #============================================================================= # compare with baseline case #============================================================================= FILES="\ ${TNAME}.out.0\ ${TNAME}.out.1\ " for i in $FILES do echo "# Output file: $i" tail -3 $i done > ${TNAME}.out # Make sure that the output file is reasonable RUNCOUNT=`echo $FILES | wc -w` OUTCOUNT=`grep "Iterations" ${TNAME}.out | wc -l` if [ "$OUTCOUNT" != "$RUNCOUNT" ]; then echo "Incorrect number of runs in ${TNAME}.out" >&2 fi #============================================================================= # remove temporary files #============================================================================= rm -f ${TNAME}.testdata* hypre-2.33.0/src/test/TEST_struct/smgbase2d.jobs000077500000000000000000000017431477326011500214230ustar00rootroot00000000000000#!/bin/bash # Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) #============================================================================= # struct: Run base "true" 2d case #============================================================================= mpirun -np 1 ./struct -n 12 12 1 -d 2 -solver 0 \ > smgbase2d.out.0 #============================================================================= # struct: Test parallel and blocking #============================================================================= mpirun -np 3 ./struct -n 4 12 1 -P 3 1 1 -d 2 -solver 0 \ > smgbase2d.out.1 mpirun -np 3 ./struct -n 4 4 1 -P 1 3 1 -b 3 1 1 -d 2 -solver 0 \ > smgbase2d.out.2 mpirun -np 4 ./struct -n 3 1 12 -P 4 1 1 -c 1 0 1 -solver 0 \ > smgbase2d.out.3 mpirun -np 2 ./struct -n 1 12 6 -P 1 1 2 -c 0 1 1 -solver 0 \ > smgbase2d.out.4 hypre-2.33.0/src/test/TEST_struct/smgbase2d.saved000066400000000000000000000007071477326011500215640ustar00rootroot00000000000000# Output file: smgbase2d.out.0 Iterations = 5 Final Relative Residual Norm = 2.468039e-07 # Output file: smgbase2d.out.1 Iterations = 5 Final Relative Residual Norm = 2.468039e-07 # Output file: smgbase2d.out.2 Iterations = 5 Final Relative Residual Norm = 2.468039e-07 # Output file: smgbase2d.out.3 Iterations = 5 Final Relative Residual Norm = 2.468039e-07 # Output file: smgbase2d.out.4 Iterations = 5 Final Relative Residual Norm = 2.468039e-07 hypre-2.33.0/src/test/TEST_struct/smgbase2d.saved.florentia000066400000000000000000000007071477326011500235460ustar00rootroot00000000000000# Output file: smgbase2d.out.0 Iterations = 5 Final Relative Residual Norm = 2.468039e-07 # Output file: smgbase2d.out.1 Iterations = 5 Final Relative Residual Norm = 2.468039e-07 # Output file: smgbase2d.out.2 Iterations = 5 Final Relative Residual Norm = 2.468039e-07 # Output file: smgbase2d.out.3 Iterations = 5 Final Relative Residual Norm = 2.468039e-07 # Output file: smgbase2d.out.4 Iterations = 5 Final Relative Residual Norm = 2.468039e-07 hypre-2.33.0/src/test/TEST_struct/smgbase2d.saved.lassen000066400000000000000000000007071477326011500230500ustar00rootroot00000000000000# Output file: smgbase2d.out.0 Iterations = 5 Final Relative Residual Norm = 2.468039e-07 # Output file: smgbase2d.out.1 Iterations = 5 Final Relative Residual Norm = 2.468039e-07 # Output file: smgbase2d.out.2 Iterations = 5 Final Relative Residual Norm = 2.468039e-07 # Output file: smgbase2d.out.3 Iterations = 5 Final Relative Residual Norm = 2.468039e-07 # Output file: smgbase2d.out.4 Iterations = 5 Final Relative Residual Norm = 2.468039e-07 hypre-2.33.0/src/test/TEST_struct/smgbase2d.saved.lassen_cpu000066400000000000000000000007071477326011500237170ustar00rootroot00000000000000# Output file: smgbase2d.out.0 Iterations = 5 Final Relative Residual Norm = 2.468039e-07 # Output file: smgbase2d.out.1 Iterations = 5 Final Relative Residual Norm = 2.468039e-07 # Output file: smgbase2d.out.2 Iterations = 5 Final Relative Residual Norm = 2.468039e-07 # Output file: smgbase2d.out.3 Iterations = 5 Final Relative Residual Norm = 2.468039e-07 # Output file: smgbase2d.out.4 Iterations = 5 Final Relative Residual Norm = 2.468039e-07 hypre-2.33.0/src/test/TEST_struct/smgbase2d.saved.tioga000066400000000000000000000007071477326011500226660ustar00rootroot00000000000000# Output file: smgbase2d.out.0 Iterations = 5 Final Relative Residual Norm = 2.468039e-07 # Output file: smgbase2d.out.1 Iterations = 5 Final Relative Residual Norm = 2.468039e-07 # Output file: smgbase2d.out.2 Iterations = 5 Final Relative Residual Norm = 2.468039e-07 # Output file: smgbase2d.out.3 Iterations = 5 Final Relative Residual Norm = 2.468039e-07 # Output file: smgbase2d.out.4 Iterations = 5 Final Relative Residual Norm = 2.468039e-07 hypre-2.33.0/src/test/TEST_struct/smgbase2d.sh000077500000000000000000000036551477326011500211040ustar00rootroot00000000000000#!/bin/bash # Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) TNAME=`basename $0 .sh` RTOL=$1 ATOL=$2 #============================================================================= # struct: Test parallel and blocking by diffing against base "true" 2d case #============================================================================= tail -3 ${TNAME}.out.0 > ${TNAME}.testdata tail -3 ${TNAME}.out.1 > ${TNAME}.testdata.temp diff ${TNAME}.testdata ${TNAME}.testdata.temp >&2 #============================================================================= tail -3 ${TNAME}.out.2 > ${TNAME}.testdata.temp diff ${TNAME}.testdata ${TNAME}.testdata.temp >&2 #============================================================================= tail -3 ${TNAME}.out.3 > ${TNAME}.testdata.temp diff ${TNAME}.testdata ${TNAME}.testdata.temp >&2 #============================================================================= tail -3 ${TNAME}.out.4 > ${TNAME}.testdata.temp diff ${TNAME}.testdata ${TNAME}.testdata.temp >&2 #============================================================================= # compare with baseline case #============================================================================= FILES="\ ${TNAME}.out.0\ ${TNAME}.out.1\ ${TNAME}.out.2\ ${TNAME}.out.3\ ${TNAME}.out.4\ " for i in $FILES do echo "# Output file: $i" tail -3 $i done > ${TNAME}.out # Make sure that the output file is reasonable RUNCOUNT=`echo $FILES | wc -w` OUTCOUNT=`grep "Iterations" ${TNAME}.out | wc -l` if [ "$OUTCOUNT" != "$RUNCOUNT" ]; then echo "Incorrect number of runs in ${TNAME}.out" >&2 fi #============================================================================= # remove temporary files #============================================================================= rm -f ${TNAME}.testdata* hypre-2.33.0/src/test/TEST_struct/smgbase3d.jobs000077500000000000000000000021171477326011500214200ustar00rootroot00000000000000#!/bin/bash # Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) #============================================================================= # struct: Run base 3d case #============================================================================= mpirun -np 1 ./struct -n 12 12 12 -c 2.0 3.0 40 -solver 0 > smgbase3d.out.0 #============================================================================= # struct: Test parallel and blocking #============================================================================= mpirun -np 8 ./struct -n 6 6 6 -P 2 2 2 -c 2.0 3.0 40 -solver 0 \ > smgbase3d.out.1 mpirun -np 4 ./struct -n 3 12 12 -P 4 1 1 -c 2.0 3.0 40 -solver 0 \ > smgbase3d.out.2 mpirun -np 4 ./struct -n 12 3 12 -P 1 4 1 -c 2.0 3.0 40 -solver 0 \ > smgbase3d.out.3 mpirun -np 4 ./struct -n 12 12 3 -P 1 1 4 -c 2.0 3.0 40 -solver 0 \ > smgbase3d.out.4 mpirun -np 1 ./struct -n 6 6 6 -b 2 2 2 -c 2.0 3.0 40 -solver 0 \ > smgbase3d.out.5 hypre-2.33.0/src/test/TEST_struct/smgbase3d.saved000066400000000000000000000010421477326011500215560ustar00rootroot00000000000000# Output file: smgbase3d.out.0 Iterations = 4 Final Relative Residual Norm = 8.971901e-07 # Output file: smgbase3d.out.1 Iterations = 4 Final Relative Residual Norm = 8.971901e-07 # Output file: smgbase3d.out.2 Iterations = 4 Final Relative Residual Norm = 8.971901e-07 # Output file: smgbase3d.out.3 Iterations = 4 Final Relative Residual Norm = 8.971901e-07 # Output file: smgbase3d.out.4 Iterations = 4 Final Relative Residual Norm = 8.971901e-07 # Output file: smgbase3d.out.5 Iterations = 4 Final Relative Residual Norm = 8.971901e-07 hypre-2.33.0/src/test/TEST_struct/smgbase3d.saved.florentia000066400000000000000000000010421477326011500235400ustar00rootroot00000000000000# Output file: smgbase3d.out.0 Iterations = 4 Final Relative Residual Norm = 8.971901e-07 # Output file: smgbase3d.out.1 Iterations = 4 Final Relative Residual Norm = 8.971901e-07 # Output file: smgbase3d.out.2 Iterations = 4 Final Relative Residual Norm = 8.971901e-07 # Output file: smgbase3d.out.3 Iterations = 4 Final Relative Residual Norm = 8.971901e-07 # Output file: smgbase3d.out.4 Iterations = 4 Final Relative Residual Norm = 8.971901e-07 # Output file: smgbase3d.out.5 Iterations = 4 Final Relative Residual Norm = 8.971901e-07 hypre-2.33.0/src/test/TEST_struct/smgbase3d.saved.lassen000066400000000000000000000010421477326011500230420ustar00rootroot00000000000000# Output file: smgbase3d.out.0 Iterations = 4 Final Relative Residual Norm = 8.971901e-07 # Output file: smgbase3d.out.1 Iterations = 4 Final Relative Residual Norm = 8.971901e-07 # Output file: smgbase3d.out.2 Iterations = 4 Final Relative Residual Norm = 8.971901e-07 # Output file: smgbase3d.out.3 Iterations = 4 Final Relative Residual Norm = 8.971901e-07 # Output file: smgbase3d.out.4 Iterations = 4 Final Relative Residual Norm = 8.971901e-07 # Output file: smgbase3d.out.5 Iterations = 4 Final Relative Residual Norm = 8.971901e-07 hypre-2.33.0/src/test/TEST_struct/smgbase3d.saved.lassen_cpu000066400000000000000000000010421477326011500237110ustar00rootroot00000000000000# Output file: smgbase3d.out.0 Iterations = 4 Final Relative Residual Norm = 8.971901e-07 # Output file: smgbase3d.out.1 Iterations = 4 Final Relative Residual Norm = 8.971901e-07 # Output file: smgbase3d.out.2 Iterations = 4 Final Relative Residual Norm = 8.971901e-07 # Output file: smgbase3d.out.3 Iterations = 4 Final Relative Residual Norm = 8.971901e-07 # Output file: smgbase3d.out.4 Iterations = 4 Final Relative Residual Norm = 8.971901e-07 # Output file: smgbase3d.out.5 Iterations = 4 Final Relative Residual Norm = 8.971901e-07 hypre-2.33.0/src/test/TEST_struct/smgbase3d.saved.tioga000066400000000000000000000010421477326011500226600ustar00rootroot00000000000000# Output file: smgbase3d.out.0 Iterations = 4 Final Relative Residual Norm = 8.971901e-07 # Output file: smgbase3d.out.1 Iterations = 4 Final Relative Residual Norm = 8.971901e-07 # Output file: smgbase3d.out.2 Iterations = 4 Final Relative Residual Norm = 8.971901e-07 # Output file: smgbase3d.out.3 Iterations = 4 Final Relative Residual Norm = 8.971901e-07 # Output file: smgbase3d.out.4 Iterations = 4 Final Relative Residual Norm = 8.971901e-07 # Output file: smgbase3d.out.5 Iterations = 4 Final Relative Residual Norm = 8.971901e-07 hypre-2.33.0/src/test/TEST_struct/smgbase3d.sh000077500000000000000000000041521477326011500210760ustar00rootroot00000000000000#!/bin/bash # Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) TNAME=`basename $0 .sh` RTOL=$1 ATOL=$2 #============================================================================= # struct: Test parallel and blocking by diffing against base 3d case #============================================================================= tail -3 ${TNAME}.out.0 > ${TNAME}.testdata tail -3 ${TNAME}.out.1 > ${TNAME}.testdata.temp diff ${TNAME}.testdata ${TNAME}.testdata.temp >&2 #============================================================================= tail -3 ${TNAME}.out.2 > ${TNAME}.testdata.temp diff ${TNAME}.testdata ${TNAME}.testdata.temp >&2 #============================================================================= tail -3 ${TNAME}.out.3 > ${TNAME}.testdata.temp diff ${TNAME}.testdata ${TNAME}.testdata.temp >&2 #============================================================================= tail -3 ${TNAME}.out.4 > ${TNAME}.testdata.temp diff ${TNAME}.testdata ${TNAME}.testdata.temp >&2 #============================================================================= tail -3 ${TNAME}.out.5 > ${TNAME}.testdata.temp diff ${TNAME}.testdata ${TNAME}.testdata.temp >&2 #============================================================================= # compare with baseline case #============================================================================= FILES="\ ${TNAME}.out.0\ ${TNAME}.out.1\ ${TNAME}.out.2\ ${TNAME}.out.3\ ${TNAME}.out.4\ ${TNAME}.out.5\ " for i in $FILES do echo "# Output file: $i" tail -3 $i done > ${TNAME}.out # Make sure that the output file is reasonable RUNCOUNT=`echo $FILES | wc -w` OUTCOUNT=`grep "Iterations" ${TNAME}.out | wc -l` if [ "$OUTCOUNT" != "$RUNCOUNT" ]; then echo "Incorrect number of runs in ${TNAME}.out" >&2 fi #============================================================================= # remove temporary files #============================================================================= rm -f ${TNAME}.testdata* hypre-2.33.0/src/test/TEST_struct/smgtest1d.jobs000077500000000000000000000012511477326011500214610ustar00rootroot00000000000000#!/bin/bash # Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) #============================================================================= # struct: Test 1d run as 2d and 3d in different configurations. #============================================================================= mpirun -np 1 ./struct -n 1 12 1 -c 0 1 0 -d 2 -solver 0 \ > smgtest1d.out.0 mpirun -np 3 ./struct -n 1 2 1 -P 1 3 1 -b 1 2 1 -c 0 1 0 -solver 0 \ > smgtest1d.out.1 mpirun -np 4 ./struct -n 1 1 3 -P 1 1 4 -c 0 0 1 -solver 0 \ > smgtest1d.out.2 hypre-2.33.0/src/test/TEST_struct/smgtest1d.saved000066400000000000000000000004211477326011500216210ustar00rootroot00000000000000# Output file: smgtest1d.out.0 Iterations = 1 Final Relative Residual Norm = 0.000000e+00 # Output file: smgtest1d.out.1 Iterations = 1 Final Relative Residual Norm = 0.000000e+00 # Output file: smgtest1d.out.2 Iterations = 1 Final Relative Residual Norm = 0.000000e+00 hypre-2.33.0/src/test/TEST_struct/smgtest1d.saved.florentia000066400000000000000000000004211477326011500236030ustar00rootroot00000000000000# Output file: smgtest1d.out.0 Iterations = 1 Final Relative Residual Norm = 0.000000e+00 # Output file: smgtest1d.out.1 Iterations = 1 Final Relative Residual Norm = 0.000000e+00 # Output file: smgtest1d.out.2 Iterations = 1 Final Relative Residual Norm = 0.000000e+00 hypre-2.33.0/src/test/TEST_struct/smgtest1d.saved.lassen000066400000000000000000000004211477326011500231050ustar00rootroot00000000000000# Output file: smgtest1d.out.0 Iterations = 1 Final Relative Residual Norm = 0.000000e+00 # Output file: smgtest1d.out.1 Iterations = 1 Final Relative Residual Norm = 0.000000e+00 # Output file: smgtest1d.out.2 Iterations = 1 Final Relative Residual Norm = 0.000000e+00 hypre-2.33.0/src/test/TEST_struct/smgtest1d.saved.lassen_cpu000066400000000000000000000004211477326011500237540ustar00rootroot00000000000000# Output file: smgtest1d.out.0 Iterations = 1 Final Relative Residual Norm = 0.000000e+00 # Output file: smgtest1d.out.1 Iterations = 1 Final Relative Residual Norm = 0.000000e+00 # Output file: smgtest1d.out.2 Iterations = 1 Final Relative Residual Norm = 0.000000e+00 hypre-2.33.0/src/test/TEST_struct/smgtest1d.saved.tioga000066400000000000000000000004211477326011500227230ustar00rootroot00000000000000# Output file: smgtest1d.out.0 Iterations = 1 Final Relative Residual Norm = 0.000000e+00 # Output file: smgtest1d.out.1 Iterations = 1 Final Relative Residual Norm = 0.000000e+00 # Output file: smgtest1d.out.2 Iterations = 1 Final Relative Residual Norm = 0.000000e+00 hypre-2.33.0/src/test/TEST_struct/smgtest1d.sh000077500000000000000000000017731477326011500211470ustar00rootroot00000000000000#!/bin/bash # Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) TNAME=`basename $0 .sh` RTOL=$1 ATOL=$2 #============================================================================= # compare with baseline case #============================================================================= FILES="\ ${TNAME}.out.0\ ${TNAME}.out.1\ ${TNAME}.out.2\ " for i in $FILES do echo "# Output file: $i" tail -3 $i done > ${TNAME}.out # Make sure that the output file is reasonable RUNCOUNT=`echo $FILES | wc -w` OUTCOUNT=`grep "Iterations" ${TNAME}.out | wc -l` if [ "$OUTCOUNT" != "$RUNCOUNT" ]; then echo "Incorrect number of runs in ${TNAME}.out" >&2 fi #============================================================================= # remove temporary files #============================================================================= # rm -f ${TNAME}.testdata* hypre-2.33.0/src/test/TEST_struct/smgvcycle.jobs000077500000000000000000000007171477326011500215500ustar00rootroot00000000000000#!/bin/bash # Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) #============================================================================= # struct: Test V(1,0) cycle. #============================================================================= mpirun -np 3 ./struct -P 1 1 3 -v 1 0 -solver 0 > smgvcycle.out.0 hypre-2.33.0/src/test/TEST_struct/smgvcycle.saved000066400000000000000000000001331477326011500217020ustar00rootroot00000000000000# Output file: smgvcycle.out.0 Iterations = 7 Final Relative Residual Norm = 3.621850e-07 hypre-2.33.0/src/test/TEST_struct/smgvcycle.saved.florentia000066400000000000000000000001331477326011500236640ustar00rootroot00000000000000# Output file: smgvcycle.out.0 Iterations = 7 Final Relative Residual Norm = 3.621850e-07 hypre-2.33.0/src/test/TEST_struct/smgvcycle.saved.lassen000066400000000000000000000001331477326011500231660ustar00rootroot00000000000000# Output file: smgvcycle.out.0 Iterations = 7 Final Relative Residual Norm = 3.621850e-07 hypre-2.33.0/src/test/TEST_struct/smgvcycle.saved.lassen_cpu000066400000000000000000000001331477326011500240350ustar00rootroot00000000000000# Output file: smgvcycle.out.0 Iterations = 7 Final Relative Residual Norm = 3.621850e-07 hypre-2.33.0/src/test/TEST_struct/smgvcycle.saved.tioga000066400000000000000000000001331477326011500230040ustar00rootroot00000000000000# Output file: smgvcycle.out.0 Iterations = 7 Final Relative Residual Norm = 3.621850e-07 hypre-2.33.0/src/test/TEST_struct/smgvcycle.sh000077500000000000000000000017311477326011500212220ustar00rootroot00000000000000#!/bin/bash # Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) TNAME=`basename $0 .sh` RTOL=$1 ATOL=$2 #============================================================================= # compare with baseline case #============================================================================= FILES="\ ${TNAME}.out.0\ " for i in $FILES do echo "# Output file: $i" tail -3 $i done > ${TNAME}.out # Make sure that the output file is reasonable RUNCOUNT=`echo $FILES | wc -w` OUTCOUNT=`grep "Iterations" ${TNAME}.out | wc -l` if [ "$OUTCOUNT" != "$RUNCOUNT" ]; then echo "Incorrect number of runs in ${TNAME}.out" >&2 fi #============================================================================= # remove temporary files #============================================================================= # rm -f ${TNAME}.testdata* hypre-2.33.0/src/test/TEST_struct/solvers.jobs000077500000000000000000000013101477326011500212370ustar00rootroot00000000000000#!/bin/bash # Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) #============================================================================= # struct: Run SMG-CG, PFMG-CG, DSCG, CG, and Hybrid. #============================================================================= mpirun -np 3 ./struct -P 1 1 3 -solver 10 > solvers.out.0 mpirun -np 3 ./struct -P 1 3 1 -solver 11 > solvers.out.1 mpirun -np 3 ./struct -P 3 1 1 -solver 17 > solvers.out.2 mpirun -np 1 ./struct -P 1 1 1 -solver 18 > solvers.out.3 mpirun -np 1 ./struct -P 1 1 1 -solver 19 > solvers.out.4 hypre-2.33.0/src/test/TEST_struct/solvers.saved000066400000000000000000000007001477326011500214030ustar00rootroot00000000000000# Output file: solvers.out.0 Iterations = 4 Final Relative Residual Norm = 7.846564e-07 # Output file: solvers.out.1 Iterations = 8 Final Relative Residual Norm = 5.298596e-07 # Output file: solvers.out.2 Iterations = 20 Final Relative Residual Norm = 6.913376e-07 # Output file: solvers.out.3 Iterations = 20 Final Relative Residual Norm = 5.962015e-07 # Output file: solvers.out.4 Iterations = 20 Final Relative Residual Norm = 5.962015e-07 hypre-2.33.0/src/test/TEST_struct/solvers.saved.florentia000066400000000000000000000007001477326011500233650ustar00rootroot00000000000000# Output file: solvers.out.0 Iterations = 4 Final Relative Residual Norm = 7.846564e-07 # Output file: solvers.out.1 Iterations = 8 Final Relative Residual Norm = 5.298596e-07 # Output file: solvers.out.2 Iterations = 20 Final Relative Residual Norm = 6.913376e-07 # Output file: solvers.out.3 Iterations = 20 Final Relative Residual Norm = 5.962015e-07 # Output file: solvers.out.4 Iterations = 20 Final Relative Residual Norm = 5.962015e-07 hypre-2.33.0/src/test/TEST_struct/solvers.saved.lassen000066400000000000000000000007001477326011500226670ustar00rootroot00000000000000# Output file: solvers.out.0 Iterations = 4 Final Relative Residual Norm = 7.846564e-07 # Output file: solvers.out.1 Iterations = 8 Final Relative Residual Norm = 5.298596e-07 # Output file: solvers.out.2 Iterations = 20 Final Relative Residual Norm = 6.913376e-07 # Output file: solvers.out.3 Iterations = 20 Final Relative Residual Norm = 5.962015e-07 # Output file: solvers.out.4 Iterations = 20 Final Relative Residual Norm = 5.962015e-07 hypre-2.33.0/src/test/TEST_struct/solvers.saved.lassen_cpu000066400000000000000000000007001477326011500235360ustar00rootroot00000000000000# Output file: solvers.out.0 Iterations = 4 Final Relative Residual Norm = 7.846564e-07 # Output file: solvers.out.1 Iterations = 8 Final Relative Residual Norm = 5.298596e-07 # Output file: solvers.out.2 Iterations = 20 Final Relative Residual Norm = 6.913376e-07 # Output file: solvers.out.3 Iterations = 20 Final Relative Residual Norm = 5.962015e-07 # Output file: solvers.out.4 Iterations = 20 Final Relative Residual Norm = 5.962015e-07 hypre-2.33.0/src/test/TEST_struct/solvers.saved.tioga000066400000000000000000000007001477326011500225050ustar00rootroot00000000000000# Output file: solvers.out.0 Iterations = 4 Final Relative Residual Norm = 7.846564e-07 # Output file: solvers.out.1 Iterations = 8 Final Relative Residual Norm = 5.298596e-07 # Output file: solvers.out.2 Iterations = 20 Final Relative Residual Norm = 6.913376e-07 # Output file: solvers.out.3 Iterations = 20 Final Relative Residual Norm = 5.962015e-07 # Output file: solvers.out.4 Iterations = 20 Final Relative Residual Norm = 5.962015e-07 hypre-2.33.0/src/test/TEST_struct/solvers.sh000077500000000000000000000020351477326011500207210ustar00rootroot00000000000000#!/bin/bash # Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) TNAME=`basename $0 .sh` RTOL=$1 ATOL=$2 #============================================================================= # compare with baseline case #============================================================================= FILES="\ ${TNAME}.out.0\ ${TNAME}.out.1\ ${TNAME}.out.2\ ${TNAME}.out.3\ ${TNAME}.out.4\ " for i in $FILES do echo "# Output file: $i" tail -3 $i done > ${TNAME}.out # Make sure that the output file is reasonable RUNCOUNT=`echo $FILES | wc -w` OUTCOUNT=`grep "Iterations" ${TNAME}.out | wc -l` if [ "$OUTCOUNT" != "$RUNCOUNT" ]; then echo "Incorrect number of runs in ${TNAME}.out" >&2 fi #============================================================================= # remove temporary files #============================================================================= # rm -f ${TNAME}.testdata* hypre-2.33.0/src/test/TEST_struct/vcpfmgRedBlackGS.jobs000077500000000000000000000052661477326011500226640ustar00rootroot00000000000000#!/bin/bash # Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) #============================================================================= # struct: Run PFMG RedBlack Gauss-Seidel tests. Nonsymmetric GS. #============================================================================= mpirun -np 1 ./struct -n 12 12 1 -d 2 -solver 1 -relax 3 -istart 1 2 0\ > vcpfmgRedBlackGS.out.0 #============================================================================= # struct: Run PFMG parallel and blocking #============================================================================= mpirun -np 3 ./struct -n 4 12 1 -P 3 1 1 -d 2 -solver 1 -relax 3 -istart 1 2 0\ > vcpfmgRedBlackGS.out.1 mpirun -np 3 ./struct -n 4 4 1 -P 1 3 1 -b 3 1 1 -d 2 -solver 1 -relax 3 \ -istart 1 2 0> vcpfmgRedBlackGS.out.2 #============================================================================= # struct: Run PFMG 2d run as 3d #============================================================================= mpirun -np 4 ./struct -n 3 1 12 -P 4 1 1 -c 1 0 1 -solver 1 -relax 3 -istart 1 0 2\ > vcpfmgRedBlackGS.out.3 mpirun -np 2 ./struct -n 1 12 6 -P 1 1 2 -c 0 1 1 -solver 1 -relax 3 -istart 0 1 2\ > vcpfmgRedBlackGS.out.4 mpirun -np 3 ./struct -n 12 4 1 -P 1 3 1 -c 1 1 0 -solver 1 -relax 3 -istart 1 2 0\ > vcpfmgRedBlackGS.out.5 #============================================================================= # struct: Run PFMG RedBlack Gauss-Seidel tests. Symmetric GS #============================================================================= mpirun -np 1 ./struct -n 12 12 1 -d 2 -solver 1 -relax 2 -istart 1 2 0\ > vcpfmgRedBlackGS.out.6 #============================================================================= # struct: Run PFMG parallel and blocking #============================================================================= mpirun -np 3 ./struct -n 4 12 1 -P 3 1 1 -d 2 -solver 1 -relax 2 -istart 1 2 0\ > vcpfmgRedBlackGS.out.7 mpirun -np 3 ./struct -n 4 4 1 -P 1 3 1 -b 3 1 1 -d 2 -solver 1 -relax 2 \ -istart 1 2 0> vcpfmgRedBlackGS.out.8 #============================================================================= # struct: Run PFMG 2d run as 3d #============================================================================= mpirun -np 4 ./struct -n 3 1 12 -P 4 1 1 -c 1 0 1 -solver 1 -relax 2 -istart 1 0 2\ > vcpfmgRedBlackGS.out.9 mpirun -np 2 ./struct -n 1 12 6 -P 1 1 2 -c 0 1 1 -solver 1 -relax 2 -istart 0 1 2\ > vcpfmgRedBlackGS.out.10 mpirun -np 3 ./struct -n 12 4 1 -P 1 3 1 -c 1 1 0 -solver 1 -relax 2 -istart 1 2 0\ > vcpfmgRedBlackGS.out.11 hypre-2.33.0/src/test/TEST_struct/vcpfmgRedBlackGS.saved000066400000000000000000000022401477326011500230130ustar00rootroot00000000000000# Output file: vcpfmgRedBlackGS.out.0 Iterations = 5 Final Relative Residual Norm = 3.344527e-07 # Output file: vcpfmgRedBlackGS.out.1 Iterations = 5 Final Relative Residual Norm = 3.344527e-07 # Output file: vcpfmgRedBlackGS.out.2 Iterations = 5 Final Relative Residual Norm = 3.344527e-07 # Output file: vcpfmgRedBlackGS.out.3 Iterations = 5 Final Relative Residual Norm = 3.344527e-07 # Output file: vcpfmgRedBlackGS.out.4 Iterations = 5 Final Relative Residual Norm = 3.344527e-07 # Output file: vcpfmgRedBlackGS.out.5 Iterations = 5 Final Relative Residual Norm = 3.344527e-07 # Output file: vcpfmgRedBlackGS.out.6 Iterations = 10 Final Relative Residual Norm = 5.540991e-07 # Output file: vcpfmgRedBlackGS.out.7 Iterations = 10 Final Relative Residual Norm = 5.540991e-07 # Output file: vcpfmgRedBlackGS.out.8 Iterations = 10 Final Relative Residual Norm = 5.540991e-07 # Output file: vcpfmgRedBlackGS.out.9 Iterations = 10 Final Relative Residual Norm = 5.540991e-07 # Output file: vcpfmgRedBlackGS.out.10 Iterations = 10 Final Relative Residual Norm = 5.540991e-07 # Output file: vcpfmgRedBlackGS.out.11 Iterations = 10 Final Relative Residual Norm = 5.540991e-07 hypre-2.33.0/src/test/TEST_struct/vcpfmgRedBlackGS.saved.florentia000066400000000000000000000022401477326011500247750ustar00rootroot00000000000000# Output file: vcpfmgRedBlackGS.out.0 Iterations = 5 Final Relative Residual Norm = 3.344527e-07 # Output file: vcpfmgRedBlackGS.out.1 Iterations = 5 Final Relative Residual Norm = 3.344527e-07 # Output file: vcpfmgRedBlackGS.out.2 Iterations = 5 Final Relative Residual Norm = 3.344527e-07 # Output file: vcpfmgRedBlackGS.out.3 Iterations = 5 Final Relative Residual Norm = 3.344527e-07 # Output file: vcpfmgRedBlackGS.out.4 Iterations = 5 Final Relative Residual Norm = 3.344527e-07 # Output file: vcpfmgRedBlackGS.out.5 Iterations = 5 Final Relative Residual Norm = 3.344527e-07 # Output file: vcpfmgRedBlackGS.out.6 Iterations = 10 Final Relative Residual Norm = 5.540991e-07 # Output file: vcpfmgRedBlackGS.out.7 Iterations = 10 Final Relative Residual Norm = 5.540991e-07 # Output file: vcpfmgRedBlackGS.out.8 Iterations = 10 Final Relative Residual Norm = 5.540991e-07 # Output file: vcpfmgRedBlackGS.out.9 Iterations = 10 Final Relative Residual Norm = 5.540991e-07 # Output file: vcpfmgRedBlackGS.out.10 Iterations = 10 Final Relative Residual Norm = 5.540991e-07 # Output file: vcpfmgRedBlackGS.out.11 Iterations = 10 Final Relative Residual Norm = 5.540991e-07 hypre-2.33.0/src/test/TEST_struct/vcpfmgRedBlackGS.saved.lassen000066400000000000000000000022401477326011500242770ustar00rootroot00000000000000# Output file: vcpfmgRedBlackGS.out.0 Iterations = 5 Final Relative Residual Norm = 3.344527e-07 # Output file: vcpfmgRedBlackGS.out.1 Iterations = 5 Final Relative Residual Norm = 3.344527e-07 # Output file: vcpfmgRedBlackGS.out.2 Iterations = 5 Final Relative Residual Norm = 3.344527e-07 # Output file: vcpfmgRedBlackGS.out.3 Iterations = 5 Final Relative Residual Norm = 3.344527e-07 # Output file: vcpfmgRedBlackGS.out.4 Iterations = 5 Final Relative Residual Norm = 3.344527e-07 # Output file: vcpfmgRedBlackGS.out.5 Iterations = 5 Final Relative Residual Norm = 3.344527e-07 # Output file: vcpfmgRedBlackGS.out.6 Iterations = 10 Final Relative Residual Norm = 5.540991e-07 # Output file: vcpfmgRedBlackGS.out.7 Iterations = 10 Final Relative Residual Norm = 5.540991e-07 # Output file: vcpfmgRedBlackGS.out.8 Iterations = 10 Final Relative Residual Norm = 5.540991e-07 # Output file: vcpfmgRedBlackGS.out.9 Iterations = 10 Final Relative Residual Norm = 5.540991e-07 # Output file: vcpfmgRedBlackGS.out.10 Iterations = 10 Final Relative Residual Norm = 5.540991e-07 # Output file: vcpfmgRedBlackGS.out.11 Iterations = 10 Final Relative Residual Norm = 5.540991e-07 hypre-2.33.0/src/test/TEST_struct/vcpfmgRedBlackGS.saved.lassen_cpu000066400000000000000000000022401477326011500251460ustar00rootroot00000000000000# Output file: vcpfmgRedBlackGS.out.0 Iterations = 5 Final Relative Residual Norm = 3.344527e-07 # Output file: vcpfmgRedBlackGS.out.1 Iterations = 5 Final Relative Residual Norm = 3.344527e-07 # Output file: vcpfmgRedBlackGS.out.2 Iterations = 5 Final Relative Residual Norm = 3.344527e-07 # Output file: vcpfmgRedBlackGS.out.3 Iterations = 5 Final Relative Residual Norm = 3.344527e-07 # Output file: vcpfmgRedBlackGS.out.4 Iterations = 5 Final Relative Residual Norm = 3.344527e-07 # Output file: vcpfmgRedBlackGS.out.5 Iterations = 5 Final Relative Residual Norm = 3.344527e-07 # Output file: vcpfmgRedBlackGS.out.6 Iterations = 10 Final Relative Residual Norm = 5.540991e-07 # Output file: vcpfmgRedBlackGS.out.7 Iterations = 10 Final Relative Residual Norm = 5.540991e-07 # Output file: vcpfmgRedBlackGS.out.8 Iterations = 10 Final Relative Residual Norm = 5.540991e-07 # Output file: vcpfmgRedBlackGS.out.9 Iterations = 10 Final Relative Residual Norm = 5.540991e-07 # Output file: vcpfmgRedBlackGS.out.10 Iterations = 10 Final Relative Residual Norm = 5.540991e-07 # Output file: vcpfmgRedBlackGS.out.11 Iterations = 10 Final Relative Residual Norm = 5.540991e-07 hypre-2.33.0/src/test/TEST_struct/vcpfmgRedBlackGS.saved.tioga000066400000000000000000000022401477326011500241150ustar00rootroot00000000000000# Output file: vcpfmgRedBlackGS.out.0 Iterations = 5 Final Relative Residual Norm = 3.344527e-07 # Output file: vcpfmgRedBlackGS.out.1 Iterations = 5 Final Relative Residual Norm = 3.344527e-07 # Output file: vcpfmgRedBlackGS.out.2 Iterations = 5 Final Relative Residual Norm = 3.344527e-07 # Output file: vcpfmgRedBlackGS.out.3 Iterations = 5 Final Relative Residual Norm = 3.344527e-07 # Output file: vcpfmgRedBlackGS.out.4 Iterations = 5 Final Relative Residual Norm = 3.344527e-07 # Output file: vcpfmgRedBlackGS.out.5 Iterations = 5 Final Relative Residual Norm = 3.344527e-07 # Output file: vcpfmgRedBlackGS.out.6 Iterations = 10 Final Relative Residual Norm = 5.540991e-07 # Output file: vcpfmgRedBlackGS.out.7 Iterations = 10 Final Relative Residual Norm = 5.540991e-07 # Output file: vcpfmgRedBlackGS.out.8 Iterations = 10 Final Relative Residual Norm = 5.540991e-07 # Output file: vcpfmgRedBlackGS.out.9 Iterations = 10 Final Relative Residual Norm = 5.540991e-07 # Output file: vcpfmgRedBlackGS.out.10 Iterations = 10 Final Relative Residual Norm = 5.540991e-07 # Output file: vcpfmgRedBlackGS.out.11 Iterations = 10 Final Relative Residual Norm = 5.540991e-07 hypre-2.33.0/src/test/TEST_struct/vcpfmgRedBlackGS.sh000077500000000000000000000063531477326011500223370ustar00rootroot00000000000000#!/bin/bash # Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) TNAME=`basename $0 .sh` RTOL=$1 ATOL=$2 #============================================================================= # struct: Test parallel and blocking by diffing against base "true" 2d case #============================================================================= tail -3 ${TNAME}.out.0 > ${TNAME}.testdata tail -3 ${TNAME}.out.1 > ${TNAME}.testdata.temp diff ${TNAME}.testdata ${TNAME}.testdata.temp >&2 #============================================================================= tail -3 ${TNAME}.out.2 > ${TNAME}.testdata.temp diff ${TNAME}.testdata ${TNAME}.testdata.temp >&2 #============================================================================= tail -3 ${TNAME}.out.3 > ${TNAME}.testdata.temp diff ${TNAME}.testdata ${TNAME}.testdata.temp >&2 #============================================================================= tail -3 ${TNAME}.out.4 > ${TNAME}.testdata.temp diff ${TNAME}.testdata ${TNAME}.testdata.temp >&2 #============================================================================= tail -3 ${TNAME}.out.5 > ${TNAME}.testdata.temp diff ${TNAME}.testdata ${TNAME}.testdata.temp >&2 #============================================================================= # struct: symmetric GS #============================================================================= tail -3 ${TNAME}.out.6 > ${TNAME}.testdata tail -3 ${TNAME}.out.7 > ${TNAME}.testdata.temp diff ${TNAME}.testdata ${TNAME}.testdata.temp >&2 #============================================================================= tail -3 ${TNAME}.out.8 > ${TNAME}.testdata.temp diff ${TNAME}.testdata ${TNAME}.testdata.temp >&2 #============================================================================= tail -3 ${TNAME}.out.9 > ${TNAME}.testdata.temp diff ${TNAME}.testdata ${TNAME}.testdata.temp >&2 #============================================================================= tail -3 ${TNAME}.out.10 > ${TNAME}.testdata.temp diff ${TNAME}.testdata ${TNAME}.testdata.temp >&2 #============================================================================= tail -3 ${TNAME}.out.11 > ${TNAME}.testdata.temp diff ${TNAME}.testdata ${TNAME}.testdata.temp >&2 #============================================================================= # compare with baseline case #============================================================================= FILES="\ ${TNAME}.out.0\ ${TNAME}.out.1\ ${TNAME}.out.2\ ${TNAME}.out.3\ ${TNAME}.out.4\ ${TNAME}.out.5\ ${TNAME}.out.6\ ${TNAME}.out.7\ ${TNAME}.out.8\ ${TNAME}.out.9\ ${TNAME}.out.10\ ${TNAME}.out.11\ " for i in $FILES do echo "# Output file: $i" tail -3 $i done > ${TNAME}.out # Make sure that the output file is reasonable RUNCOUNT=`echo $FILES | wc -w` OUTCOUNT=`grep "Iterations" ${TNAME}.out | wc -l` if [ "$OUTCOUNT" != "$RUNCOUNT" ]; then echo "Incorrect number of runs in ${TNAME}.out" >&2 fi #============================================================================= # remove temporary files #============================================================================= rm -f ${TNAME}.testdata* hypre-2.33.0/src/test/TEST_struct/vdpfmgRedBlackGS.jobs000077500000000000000000000053051477326011500226570ustar00rootroot00000000000000#!/bin/bash # Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) #============================================================================= # struct: Run variable diag. PFMG RedBlack Gauss-Seidel tests. Nonsymmetric GS. #============================================================================= mpirun -np 1 ./struct -n 15 12 1 -d 2 -solver 4 -relax 3 -istart 1 2 0\ > vdpfmgRedBlackGS.out.0 #============================================================================= # struct: Run PFMG parallel and blocking #============================================================================= mpirun -np 3 ./struct -n 5 12 1 -P 3 1 1 -d 2 -solver 4 -relax 3 -istart 1 2 0\ > vdpfmgRedBlackGS.out.1 mpirun -np 3 ./struct -n 3 4 1 -P 1 3 1 -b 5 1 1 -d 2 -solver 4 -relax 3 \ -istart 1 2 0> vdpfmgRedBlackGS.out.2 #============================================================================= # struct: Run PFMG 2d run as 3d #============================================================================= mpirun -np 5 ./struct -n 3 1 12 -P 5 1 1 -c 1 0 1 -solver 4 -relax 3 -istart 1 0 2\ > vdpfmgRedBlackGS.out.3 mpirun -np 2 ./struct -n 1 15 6 -P 1 1 2 -c 0 1 1 -solver 4 -relax 3 -istart 0 1 2\ > vdpfmgRedBlackGS.out.4 mpirun -np 3 ./struct -n 15 4 1 -P 1 3 1 -c 1 1 0 -solver 4 -relax 3 -istart 1 2 0\ > vdpfmgRedBlackGS.out.5 #============================================================================= # struct: Run PFMG RedBlack Gauss-Seidel tests. Symmetric GS #============================================================================= mpirun -np 1 ./struct -n 15 12 1 -d 2 -solver 4 -relax 2 -istart 1 2 0\ > vdpfmgRedBlackGS.out.6 #============================================================================= # struct: Run PFMG parallel and blocking #============================================================================= mpirun -np 3 ./struct -n 5 12 1 -P 3 1 1 -d 2 -solver 4 -relax 2 -istart 1 2 0\ > vdpfmgRedBlackGS.out.7 mpirun -np 3 ./struct -n 5 4 1 -P 1 3 1 -b 3 1 1 -d 2 -solver 4 -relax 2 \ -istart 1 2 0> vdpfmgRedBlackGS.out.8 #============================================================================= # struct: Run PFMG 2d run as 3d #============================================================================= mpirun -np 5 ./struct -n 3 1 12 -P 5 1 1 -c 1 0 1 -solver 4 -relax 2 -istart 1 0 2\ > vdpfmgRedBlackGS.out.9 mpirun -np 2 ./struct -n 1 15 6 -P 1 1 2 -c 0 1 1 -solver 4 -relax 2 -istart 0 1 2\ > vdpfmgRedBlackGS.out.10 mpirun -np 3 ./struct -n 15 4 1 -P 1 3 1 -c 1 1 0 -solver 4 -relax 2 -istart 1 2 0\ > vdpfmgRedBlackGS.out.11 hypre-2.33.0/src/test/TEST_struct/vdpfmgRedBlackGS.saved000066400000000000000000000022321477326011500230150ustar00rootroot00000000000000# Output file: vdpfmgRedBlackGS.out.0 Iterations = 5 Final Relative Residual Norm = 1.616480e-07 # Output file: vdpfmgRedBlackGS.out.1 Iterations = 5 Final Relative Residual Norm = 1.616480e-07 # Output file: vdpfmgRedBlackGS.out.2 Iterations = 5 Final Relative Residual Norm = 1.616480e-07 # Output file: vdpfmgRedBlackGS.out.3 Iterations = 5 Final Relative Residual Norm = 1.616480e-07 # Output file: vdpfmgRedBlackGS.out.4 Iterations = 5 Final Relative Residual Norm = 1.616480e-07 # Output file: vdpfmgRedBlackGS.out.5 Iterations = 5 Final Relative Residual Norm = 1.616480e-07 # Output file: vdpfmgRedBlackGS.out.6 Iterations = 9 Final Relative Residual Norm = 8.392336e-07 # Output file: vdpfmgRedBlackGS.out.7 Iterations = 9 Final Relative Residual Norm = 8.392336e-07 # Output file: vdpfmgRedBlackGS.out.8 Iterations = 9 Final Relative Residual Norm = 8.392336e-07 # Output file: vdpfmgRedBlackGS.out.9 Iterations = 9 Final Relative Residual Norm = 8.392336e-07 # Output file: vdpfmgRedBlackGS.out.10 Iterations = 9 Final Relative Residual Norm = 8.392336e-07 # Output file: vdpfmgRedBlackGS.out.11 Iterations = 9 Final Relative Residual Norm = 8.392336e-07 hypre-2.33.0/src/test/TEST_struct/vdpfmgRedBlackGS.saved.florentia000066400000000000000000000022321477326011500247770ustar00rootroot00000000000000# Output file: vdpfmgRedBlackGS.out.0 Iterations = 5 Final Relative Residual Norm = 1.616480e-07 # Output file: vdpfmgRedBlackGS.out.1 Iterations = 5 Final Relative Residual Norm = 1.616480e-07 # Output file: vdpfmgRedBlackGS.out.2 Iterations = 5 Final Relative Residual Norm = 1.616480e-07 # Output file: vdpfmgRedBlackGS.out.3 Iterations = 5 Final Relative Residual Norm = 1.616480e-07 # Output file: vdpfmgRedBlackGS.out.4 Iterations = 5 Final Relative Residual Norm = 1.616480e-07 # Output file: vdpfmgRedBlackGS.out.5 Iterations = 5 Final Relative Residual Norm = 1.616480e-07 # Output file: vdpfmgRedBlackGS.out.6 Iterations = 9 Final Relative Residual Norm = 8.392336e-07 # Output file: vdpfmgRedBlackGS.out.7 Iterations = 9 Final Relative Residual Norm = 8.392336e-07 # Output file: vdpfmgRedBlackGS.out.8 Iterations = 9 Final Relative Residual Norm = 8.392336e-07 # Output file: vdpfmgRedBlackGS.out.9 Iterations = 9 Final Relative Residual Norm = 8.392336e-07 # Output file: vdpfmgRedBlackGS.out.10 Iterations = 9 Final Relative Residual Norm = 8.392336e-07 # Output file: vdpfmgRedBlackGS.out.11 Iterations = 9 Final Relative Residual Norm = 8.392336e-07 hypre-2.33.0/src/test/TEST_struct/vdpfmgRedBlackGS.saved.lassen000066400000000000000000000022321477326011500243010ustar00rootroot00000000000000# Output file: vdpfmgRedBlackGS.out.0 Iterations = 5 Final Relative Residual Norm = 1.616480e-07 # Output file: vdpfmgRedBlackGS.out.1 Iterations = 5 Final Relative Residual Norm = 1.616480e-07 # Output file: vdpfmgRedBlackGS.out.2 Iterations = 5 Final Relative Residual Norm = 1.616480e-07 # Output file: vdpfmgRedBlackGS.out.3 Iterations = 5 Final Relative Residual Norm = 1.616480e-07 # Output file: vdpfmgRedBlackGS.out.4 Iterations = 5 Final Relative Residual Norm = 1.616480e-07 # Output file: vdpfmgRedBlackGS.out.5 Iterations = 5 Final Relative Residual Norm = 1.616480e-07 # Output file: vdpfmgRedBlackGS.out.6 Iterations = 9 Final Relative Residual Norm = 8.392336e-07 # Output file: vdpfmgRedBlackGS.out.7 Iterations = 9 Final Relative Residual Norm = 8.392336e-07 # Output file: vdpfmgRedBlackGS.out.8 Iterations = 9 Final Relative Residual Norm = 8.392336e-07 # Output file: vdpfmgRedBlackGS.out.9 Iterations = 9 Final Relative Residual Norm = 8.392336e-07 # Output file: vdpfmgRedBlackGS.out.10 Iterations = 9 Final Relative Residual Norm = 8.392336e-07 # Output file: vdpfmgRedBlackGS.out.11 Iterations = 9 Final Relative Residual Norm = 8.392336e-07 hypre-2.33.0/src/test/TEST_struct/vdpfmgRedBlackGS.saved.lassen_cpu000066400000000000000000000022321477326011500251500ustar00rootroot00000000000000# Output file: vdpfmgRedBlackGS.out.0 Iterations = 5 Final Relative Residual Norm = 1.616480e-07 # Output file: vdpfmgRedBlackGS.out.1 Iterations = 5 Final Relative Residual Norm = 1.616480e-07 # Output file: vdpfmgRedBlackGS.out.2 Iterations = 5 Final Relative Residual Norm = 1.616480e-07 # Output file: vdpfmgRedBlackGS.out.3 Iterations = 5 Final Relative Residual Norm = 1.616480e-07 # Output file: vdpfmgRedBlackGS.out.4 Iterations = 5 Final Relative Residual Norm = 1.616480e-07 # Output file: vdpfmgRedBlackGS.out.5 Iterations = 5 Final Relative Residual Norm = 1.616480e-07 # Output file: vdpfmgRedBlackGS.out.6 Iterations = 9 Final Relative Residual Norm = 8.392336e-07 # Output file: vdpfmgRedBlackGS.out.7 Iterations = 9 Final Relative Residual Norm = 8.392336e-07 # Output file: vdpfmgRedBlackGS.out.8 Iterations = 9 Final Relative Residual Norm = 8.392336e-07 # Output file: vdpfmgRedBlackGS.out.9 Iterations = 9 Final Relative Residual Norm = 8.392336e-07 # Output file: vdpfmgRedBlackGS.out.10 Iterations = 9 Final Relative Residual Norm = 8.392336e-07 # Output file: vdpfmgRedBlackGS.out.11 Iterations = 9 Final Relative Residual Norm = 8.392336e-07 hypre-2.33.0/src/test/TEST_struct/vdpfmgRedBlackGS.saved.tioga000066400000000000000000000022321477326011500241170ustar00rootroot00000000000000# Output file: vdpfmgRedBlackGS.out.0 Iterations = 5 Final Relative Residual Norm = 1.616480e-07 # Output file: vdpfmgRedBlackGS.out.1 Iterations = 5 Final Relative Residual Norm = 1.616480e-07 # Output file: vdpfmgRedBlackGS.out.2 Iterations = 5 Final Relative Residual Norm = 1.616480e-07 # Output file: vdpfmgRedBlackGS.out.3 Iterations = 5 Final Relative Residual Norm = 1.616480e-07 # Output file: vdpfmgRedBlackGS.out.4 Iterations = 5 Final Relative Residual Norm = 1.616480e-07 # Output file: vdpfmgRedBlackGS.out.5 Iterations = 5 Final Relative Residual Norm = 1.616480e-07 # Output file: vdpfmgRedBlackGS.out.6 Iterations = 9 Final Relative Residual Norm = 8.392336e-07 # Output file: vdpfmgRedBlackGS.out.7 Iterations = 9 Final Relative Residual Norm = 8.392336e-07 # Output file: vdpfmgRedBlackGS.out.8 Iterations = 9 Final Relative Residual Norm = 8.392336e-07 # Output file: vdpfmgRedBlackGS.out.9 Iterations = 9 Final Relative Residual Norm = 8.392336e-07 # Output file: vdpfmgRedBlackGS.out.10 Iterations = 9 Final Relative Residual Norm = 8.392336e-07 # Output file: vdpfmgRedBlackGS.out.11 Iterations = 9 Final Relative Residual Norm = 8.392336e-07 hypre-2.33.0/src/test/TEST_struct/vdpfmgRedBlackGS.sh000077500000000000000000000063531477326011500223400ustar00rootroot00000000000000#!/bin/bash # Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) TNAME=`basename $0 .sh` RTOL=$1 ATOL=$2 #============================================================================= # struct: Test parallel and blocking by diffing against base "true" 2d case #============================================================================= tail -3 ${TNAME}.out.0 > ${TNAME}.testdata tail -3 ${TNAME}.out.1 > ${TNAME}.testdata.temp diff ${TNAME}.testdata ${TNAME}.testdata.temp >&2 #============================================================================= tail -3 ${TNAME}.out.2 > ${TNAME}.testdata.temp diff ${TNAME}.testdata ${TNAME}.testdata.temp >&2 #============================================================================= tail -3 ${TNAME}.out.3 > ${TNAME}.testdata.temp diff ${TNAME}.testdata ${TNAME}.testdata.temp >&2 #============================================================================= tail -3 ${TNAME}.out.4 > ${TNAME}.testdata.temp diff ${TNAME}.testdata ${TNAME}.testdata.temp >&2 #============================================================================= tail -3 ${TNAME}.out.5 > ${TNAME}.testdata.temp diff ${TNAME}.testdata ${TNAME}.testdata.temp >&2 #============================================================================= # struct: symmetric GS #============================================================================= tail -3 ${TNAME}.out.6 > ${TNAME}.testdata tail -3 ${TNAME}.out.7 > ${TNAME}.testdata.temp diff ${TNAME}.testdata ${TNAME}.testdata.temp >&2 #============================================================================= tail -3 ${TNAME}.out.8 > ${TNAME}.testdata.temp diff ${TNAME}.testdata ${TNAME}.testdata.temp >&2 #============================================================================= tail -3 ${TNAME}.out.9 > ${TNAME}.testdata.temp diff ${TNAME}.testdata ${TNAME}.testdata.temp >&2 #============================================================================= tail -3 ${TNAME}.out.10 > ${TNAME}.testdata.temp diff ${TNAME}.testdata ${TNAME}.testdata.temp >&2 #============================================================================= tail -3 ${TNAME}.out.11 > ${TNAME}.testdata.temp diff ${TNAME}.testdata ${TNAME}.testdata.temp >&2 #============================================================================= # compare with baseline case #============================================================================= FILES="\ ${TNAME}.out.0\ ${TNAME}.out.1\ ${TNAME}.out.2\ ${TNAME}.out.3\ ${TNAME}.out.4\ ${TNAME}.out.5\ ${TNAME}.out.6\ ${TNAME}.out.7\ ${TNAME}.out.8\ ${TNAME}.out.9\ ${TNAME}.out.10\ ${TNAME}.out.11\ " for i in $FILES do echo "# Output file: $i" tail -3 $i done > ${TNAME}.out # Make sure that the output file is reasonable RUNCOUNT=`echo $FILES | wc -w` OUTCOUNT=`grep "Iterations" ${TNAME}.out | wc -l` if [ "$OUTCOUNT" != "$RUNCOUNT" ]; then echo "Incorrect number of runs in ${TNAME}.out" >&2 fi #============================================================================= # remove temporary files #============================================================================= rm -f ${TNAME}.testdata* hypre-2.33.0/src/test/TEST_struct/versioncheck.jobs000077500000000000000000000007061477326011500222350ustar00rootroot00000000000000#!/bin/bash # Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) #============================================================================= # Check the version header file variables #============================================================================= mpirun -np 1 ./struct > versioncheck.out.1 hypre-2.33.0/src/test/TEST_struct/versioncheck.sh000077500000000000000000000025001477326011500217040ustar00rootroot00000000000000#!/bin/bash # Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) TNAME=`basename $0 .sh` #============================================================================= # Check the HYPRE_DEVELOP variables #============================================================================= grep "Using HYPRE_DEVELOP_STRING" ${TNAME}.out.1 > ${TNAME}.testdata echo -n > ${TNAME}.testdatacheck if [ -d ../../../.git ]; then DEVSTRING=`git describe --match 'v*' --long --abbrev=9 2>/dev/null` DEVNUMBER=`echo $DEVSTRING | awk -F- '{print $2}'` DEVBRANCH=`git rev-parse --abbrev-ref HEAD` if [ -n "$DEVSTRING" ]; then if [ "$DEVBRANCH" != "master" ]; then echo "Using HYPRE_DEVELOP_STRING: $DEVSTRING (branch $DEVBRANCH; not the develop branch)" \ > ${TNAME}.testdatacheck else echo "Using HYPRE_DEVELOP_STRING: $DEVSTRING (branch $DEVBRANCH; the develop branch)" \ > ${TNAME}.testdatacheck fi fi fi diff ${TNAME}.testdata ${TNAME}.testdatacheck >&2 #============================================================================= # remove temporary files #============================================================================= rm -f ${TNAME}.testdata* hypre-2.33.0/src/test/TEST_superlu/000077500000000000000000000000001477326011500170405ustar00rootroot00000000000000hypre-2.33.0/src/test/TEST_superlu/sludist.jobs000077500000000000000000000012731477326011500214140ustar00rootroot00000000000000#!/bin/bash # Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) #============================================================================= # ij: Run various cases using SuperLU_Dist as a coarse grid solve #============================================================================= mpirun -np 1 ./ij -n 20 20 30 -dslu_th 2000 \ > sludist.out.0 mpirun -np 4 ./ij -solver 1 -n 40 50 30 -P 2 2 1 -dslu_th 8000 -agg_nl 1 -tol 1.e-7 \ > sludist.out.1 mpirun -np 8 ./ij -solver 3 -n 50 50 50 -P 2 2 2 -dslu_th 4000 -tol 1.e-7 \ > sludist.out.2 hypre-2.33.0/src/test/TEST_superlu/sludist.saved000066400000000000000000000004511477326011500215530ustar00rootroot00000000000000# Output file: sludist.out.0 BoomerAMG Iterations = 11 Final Relative Residual Norm = 3.002886e-09 # Output file: sludist.out.1 Iterations = 13 Final Relative Residual Norm = 3.172597e-08 # Output file: sludist.out.2 GMRES Iterations = 8 Final GMRES Relative Residual Norm = 5.950181e-08 hypre-2.33.0/src/test/TEST_superlu/sludist.sh000077500000000000000000000017541477326011500210750ustar00rootroot00000000000000#!/bin/bash # Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) TNAME=`basename $0 .sh` #============================================================================= # compare with baseline case #============================================================================= FILES="\ ${TNAME}.out.0\ ${TNAME}.out.1\ ${TNAME}.out.2\ " for i in $FILES do echo "# Output file: $i" tail -5 $i done > ${TNAME}.out # Make sure that the output file is reasonable RUNCOUNT=`echo $FILES | wc -w` OUTCOUNT=`grep "Iterations" ${TNAME}.out | wc -l` if [ "$OUTCOUNT" != "$RUNCOUNT" ]; then echo "Incorrect number of runs in ${TNAME}.out" >&2 fi #============================================================================= # remove temporary files #============================================================================= # rm -f ${TNAME}.testdata* hypre-2.33.0/src/test/TEST_timing/000077500000000000000000000000001477326011500166305ustar00rootroot00000000000000hypre-2.33.0/src/test/TEST_timing/efficiency.jobs000077500000000000000000000027231477326011500216220ustar00rootroot00000000000000#!/bin/bash # Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) #============================================================================= # struct: timing and parallel scaling efficiency test #============================================================================= #============================================================================= # Perform as a single psub process, throw away the first test in # each configuration #============================================================================= #BATCH mpirun -np 1 ./struct -n 30 30 30 -solver 11 mpirun -np 1 ./struct -n 30 30 30 -solver 11 > efficiency.out.0 mpirun -np 1 ./struct -n 30 30 30 -solver 11 > efficiency.out.1 mpirun -np 1 ./struct -n 30 30 30 -solver 11 > efficiency.out.2 #END #BATCH mpirun -np 8 ./struct -n 30 30 30 -P 2 2 2 -solver 11 mpirun -np 8 ./struct -n 30 30 30 -P 2 2 2 -solver 11 > efficiency.out.3 mpirun -np 8 ./struct -n 30 30 30 -P 2 2 2 -solver 11 > efficiency.out.4 mpirun -np 8 ./struct -n 30 30 30 -P 2 2 2 -solver 11 > efficiency.out.5 #END #BATCH mpirun -np 64 ./struct -n 30 30 30 -P 4 4 4 -solver 11 mpirun -np 64 ./struct -n 30 30 30 -P 4 4 4 -solver 11 > efficiency.out.6 mpirun -np 64 ./struct -n 30 30 30 -P 4 4 4 -solver 11 > efficiency.out.7 mpirun -np 64 ./struct -n 30 30 30 -P 4 4 4 -solver 11 > efficiency.out.8 #END hypre-2.33.0/src/test/TEST_timing/efficiency.sh000077500000000000000000000043611477326011500212770ustar00rootroot00000000000000#!/bin/bash # Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) #============================================================================= # struct: timing and parallel scaling efficiency test #============================================================================= ##float Time1 Time1A Time1B Time1C ##float Time8 Time8A Time8B Time8C ##float Time64 Time64A Time64B Time64C ##float Eff1 Eff2 # # extract cpu clock times from solver phase, and calculate average # Time1A=$(grep "cpu clock time" efficiency.out.0 | tail -1 | awk '{print $6}') Time1B=$(grep "cpu clock time" efficiency.out.1 | tail -1 | awk '{print $6}') Time1C=$(grep "cpu clock time" efficiency.out.2 | tail -1 | awk '{print $6}') ((Time1 = (Time1A + Time1B Time1C) / 3.0)) Time8A=$(grep "cpu clock time" efficiency.out.3 | tail -1 | awk '{print $6}') Time8B=$(grep "cpu clock time" efficiency.out.4 | tail -1 | awk '{print $6}') Time8C=$(grep "cpu clock time" efficiency.out.5 | tail -1 | awk '{print $6}') ((Time8 = (Time8A + Time8B Time8C) / 3.0)) Time64A=$(grep "cpu clock time" efficiency.out.6 | tail -1 | awk '{print $6}') Time64B=$(grep "cpu clock time" efficiency.out.7 | tail -1 | awk '{print $6}') Time64C=$(grep "cpu clock time" efficiency.out.8 | tail -1 | awk '{print $6}') ((Time64 = (Time64A + Time64B Time64C) / 3.0)) # # Calculate parallel scaling efficiency # ##((Eff1 = Time1 / Time64)) ##((Eff2 = Time8 / Time64)) Eff1=$(awk '{print $Time1/$Time64}') Eff2=$(awk '{print $Time8/$Time64}') awk '{if ($Eff1 < 0.30) print "Failure:T1/T64 is less than 30% ($Time1/$Time64=$Eff1)" > &2}' awk '{if ($Eff2 < 0.90) print "Failure:T8/T64 is less than 90% ($Time8/$Time64=$Eff2)" > &2}' echo "1 node results ($Time1A, $Time1B, $Time1C) Avg=$Time1" >> efficiency.log echo "8 node results ($Time8A, $Time8B, $Time8C) Avg=$Time8" >> efficiency.log echo "64 node results ($Time64A, $Time64B, $Time64C) Avg=$Time64" >> efficiency.log echo "T1/T64=$Eff1 T8/T64=$Eff2" >> efficiency.log #rm -f efficiency.out.0 efficiency.out.1 efficiency.out.2 #rm -f efficiency.out.3 efficiency.out.4 efficiency.out.5 #rm -f efficiency.out.6 efficiency.out.7 efficiency.out.8 hypre-2.33.0/src/test/ams_driver.c000066400000000000000000000746661477326011500170240ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /* This test driver performs the following operations: 1. Read a linear system corresponding to a parallel finite element discretization of Maxwell's equations. 2. Call the AMS solver in HYPRE to solve that linear system. */ /* hypre/AMS prototypes */ #include "_hypre_parcsr_ls.h" #include "_hypre_IJ_mv.h" #include "HYPRE.h" #if defined(HYPRE_USING_CUSPARSE) #define DISABLE_CUSPARSE_DEPRECATED #include #endif void CheckIfFileExists(char *file) { FILE *test; if (!(test = fopen(file, "r"))) { hypre_MPI_Finalize(); hypre_printf("Can't find the input file \"%s\"\n", file); exit(1); } fclose(test); } void AMSDriverMatrixRead(const char *file, HYPRE_ParCSRMatrix *A) { FILE *test; char file0[100]; sprintf(file0, "%s.D.0", file); if (!(test = fopen(file0, "r"))) { sprintf(file0, "%s.00000", file); if (!(test = fopen(file0, "r"))) { hypre_MPI_Finalize(); hypre_printf("Can't find the input file \"%s\"\n", file); exit(1); } else /* Read in IJ format*/ { HYPRE_IJMatrix ij_A; void *object; HYPRE_IJMatrixRead(file, hypre_MPI_COMM_WORLD, HYPRE_PARCSR, &ij_A); HYPRE_IJMatrixGetObject(ij_A, &object); *A = (HYPRE_ParCSRMatrix) object; hypre_IJMatrixObject((hypre_IJMatrix *)ij_A) = NULL; HYPRE_IJMatrixDestroy(ij_A); } } else /* Read in ParCSR format*/ { HYPRE_ParCSRMatrixRead(hypre_MPI_COMM_WORLD, file, A); } fclose(test); } void AMSDriverVectorRead(const char *file, HYPRE_ParVector *x) { FILE *test; char file0[100]; sprintf(file0, "%s.0", file); if (!(test = fopen(file0, "r"))) { sprintf(file0, "%s.00000", file); if (!(test = fopen(file0, "r"))) { hypre_MPI_Finalize(); hypre_printf("Can't find the input file \"%s\"\n", file); exit(1); } else /* Read in IJ format*/ { HYPRE_IJVector ij_x; void *object; HYPRE_IJVectorRead(file, hypre_MPI_COMM_WORLD, HYPRE_PARCSR, &ij_x); HYPRE_IJVectorGetObject(ij_x, &object); *x = (HYPRE_ParVector) object; hypre_IJVectorObject((hypre_IJVector *)ij_x) = NULL; HYPRE_IJVectorDestroy(ij_x); } } else /* Read in ParCSR format*/ { HYPRE_ParVectorRead(hypre_MPI_COMM_WORLD, file, x); } fclose(test); } hypre_int main (hypre_int argc, char *argv[]) { HYPRE_Int num_procs, myid; HYPRE_Int time_index; HYPRE_Int solver_id; HYPRE_Int maxit, pcg_maxit, cycle_type, rlx_type, coarse_rlx_type, rlx_sweeps, dim; HYPRE_Real rlx_weight, rlx_omega; HYPRE_Int amg_coarsen_type, amg_rlx_type, amg_agg_levels, amg_interp_type, amg_Pmax; HYPRE_Int h1_method, singular_problem, coordinates; HYPRE_Real tol, theta; HYPRE_Real rtol; HYPRE_Int rr; HYPRE_Int zero_cond; HYPRE_Int blockSize; HYPRE_Solver solver, precond; HYPRE_ParCSRMatrix A = 0, G = 0, Aalpha = 0, Abeta = 0, M = 0; HYPRE_ParVector x0 = 0, b = 0; HYPRE_ParVector Gx = 0, Gy = 0, Gz = 0; HYPRE_ParVector x = 0, y = 0, z = 0; HYPRE_ParVector interior_nodes = 0; /* default execution policy and memory space */ #if defined(HYPRE_TEST_USING_HOST) HYPRE_MemoryLocation memory_location = HYPRE_MEMORY_HOST; HYPRE_ExecutionPolicy default_exec_policy = HYPRE_EXEC_HOST; #else HYPRE_MemoryLocation memory_location = HYPRE_MEMORY_DEVICE; HYPRE_ExecutionPolicy default_exec_policy = HYPRE_EXEC_DEVICE; #endif /* Initialize MPI */ hypre_MPI_Init(&argc, &argv); hypre_MPI_Comm_size(hypre_MPI_COMM_WORLD, &num_procs); hypre_MPI_Comm_rank(hypre_MPI_COMM_WORLD, &myid); /*----------------------------------------------------------------- * GPU Device binding * Must be done before HYPRE_Initialize() and should not be changed after *-----------------------------------------------------------------*/ hypre_bind_device_id(-1, myid, num_procs, hypre_MPI_COMM_WORLD); /*----------------------------------------------------------- * Initialize : must be the first HYPRE function to call *-----------------------------------------------------------*/ HYPRE_Initialize(); HYPRE_DeviceInitialize(); /* default memory location */ HYPRE_SetMemoryLocation(memory_location); /* default execution policy */ HYPRE_SetExecutionPolicy(default_exec_policy); #if defined(HYPRE_USING_GPU) #if defined(HYPRE_USING_CUSPARSE) && CUSPARSE_VERSION >= 11000 /* CUSPARSE_SPMV_ALG_DEFAULT doesn't provide deterministic results */ HYPRE_SetSpMVUseVendor(0); #endif /* use vendor implementation for SpGEMM */ HYPRE_SetSpGemmUseVendor(0); #if defined(HYPRE_USING_SYCL) HYPRE_SetSpGemmUseVendor(1); #endif /* use cuRand for PMIS */ HYPRE_SetUseGpuRand(1); #endif /* Set defaults */ solver_id = 3; maxit = 200; pcg_maxit = 50; tol = 1e-6; dim = 3; coordinates = 0; h1_method = 0; singular_problem = 0; rlx_sweeps = 1; rlx_weight = 1.0; rlx_omega = 1.0; if (hypre_GetExecPolicy1(memory_location) == HYPRE_EXEC_DEVICE) { cycle_type = 1; amg_coarsen_type = 8; amg_agg_levels = 1; amg_rlx_type = 18; coarse_rlx_type = 18, rlx_type = 1; /* PMIS */ } else { cycle_type = 1; amg_coarsen_type = 10; amg_agg_levels = 1; amg_rlx_type = 8; coarse_rlx_type = 8, rlx_type = 2; /* HMIS-1 */ } /* cycle_type = 1; amg_coarsen_type = 10; amg_agg_levels = 0; amg_rlx_type = 3; */ /* HMIS-0 */ /* cycle_type = 1; amg_coarsen_type = 8; amg_agg_levels = 1; amg_rlx_type = 3; */ /* PMIS-1 */ /* cycle_type = 1; amg_coarsen_type = 8; amg_agg_levels = 0; amg_rlx_type = 3; */ /* PMIS-0 */ /* cycle_type = 7; amg_coarsen_type = 6; amg_agg_levels = 0; amg_rlx_type = 6; */ /* Falgout-0 */ amg_interp_type = 6; amg_Pmax = 4; /* long-range interpolation */ /* amg_interp_type = 0; amg_Pmax = 0; */ /* standard interpolation */ theta = 0.25; blockSize = 5; rtol = 0; rr = 0; zero_cond = 0; /* Parse command line */ { HYPRE_Int arg_index = 0; HYPRE_Int print_usage = 0; while (arg_index < argc) { if ( strcmp(argv[arg_index], "-solver") == 0 ) { arg_index++; solver_id = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-maxit") == 0 ) { arg_index++; maxit = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-pcg_maxit") == 0 ) { arg_index++; pcg_maxit = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-tol") == 0 ) { arg_index++; tol = (HYPRE_Real)atof(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-type") == 0 ) { arg_index++; cycle_type = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-rlx") == 0 ) { arg_index++; rlx_type = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-rlxn") == 0 ) { arg_index++; rlx_sweeps = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-rlxw") == 0 ) { arg_index++; rlx_weight = (HYPRE_Real)atof(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-rlxo") == 0 ) { arg_index++; rlx_omega = (HYPRE_Real)atof(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-ctype") == 0 ) { arg_index++; amg_coarsen_type = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-amgrlx") == 0 ) { arg_index++; amg_rlx_type = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-crlx") == 0 ) { arg_index++; coarse_rlx_type = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-agg") == 0 ) { arg_index++; amg_agg_levels = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-itype") == 0 ) { arg_index++; amg_interp_type = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-pmax") == 0 ) { arg_index++; amg_Pmax = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-dim") == 0 ) { arg_index++; dim = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-coord") == 0 ) { arg_index++; coordinates = 1; } else if ( strcmp(argv[arg_index], "-h1") == 0 ) { arg_index++; h1_method = 1; } else if ( strcmp(argv[arg_index], "-sing") == 0 ) { arg_index++; singular_problem = 1; } else if ( strcmp(argv[arg_index], "-theta") == 0 ) { arg_index++; theta = (HYPRE_Real)atof(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-bsize") == 0 ) { arg_index++; blockSize = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-rtol") == 0 ) { arg_index++; rtol = (HYPRE_Real)atof(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-rr") == 0 ) { arg_index++; rr = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-zc") == 0 ) { arg_index++; zero_cond = 1; } else if ( strcmp(argv[arg_index], "-help") == 0 ) { print_usage = 1; break; } else { arg_index++; } } if (argc == 1) { print_usage = 1; } if ((print_usage) && (myid == 0)) { hypre_printf(" \n"); hypre_printf("Usage: mpirun -np %s [] \n", argv[0]); hypre_printf(" \n"); hypre_printf(" Hypre solvers options: \n"); hypre_printf(" -solver : solver ID \n"); hypre_printf(" 0 - AMG \n"); hypre_printf(" 1 - AMG-PCG \n"); hypre_printf(" 2 - AMS \n"); hypre_printf(" 3 - AMS-PCG (default) \n"); hypre_printf(" 4 - DS-PCG \n"); hypre_printf(" 5 - AME eigensolver \n"); hypre_printf(" -maxit : maximum number of iterations (200) \n"); hypre_printf(" -pcg_maxit : maximum number of PCG iterations (50) \n"); hypre_printf(" -tol : convergence tolerance (1e-6) \n"); hypre_printf(" \n"); hypre_printf(" AMS solver options: \n"); hypre_printf(" -dim : space dimension \n"); hypre_printf(" -type : 3-level cycle type (0-8, 11-14) \n"); hypre_printf(" -theta : BoomerAMG threshold (0.25) \n"); hypre_printf(" -ctype : BoomerAMG coarsening type \n"); hypre_printf(" -agg : Levels of BoomerAMG agg. coarsening \n"); hypre_printf(" -amgrlx : BoomerAMG relaxation type \n"); hypre_printf(" -itype : BoomerAMG interpolation type \n"); hypre_printf(" -pmax : BoomerAMG interpolation truncation \n"); hypre_printf(" -rlx : relaxation type \n"); hypre_printf(" -rlxn : number of relaxation sweeps \n"); hypre_printf(" -rlxw : damping parameter (usually <=1) \n"); hypre_printf(" -rlxo : SOR parameter (usuallyin (0,2)) \n"); hypre_printf(" -coord : use coordinate vectors \n"); hypre_printf(" -h1 : use block-diag Poisson solves \n"); hypre_printf(" -sing : curl-curl only (singular) problem \n"); hypre_printf(" \n"); hypre_printf(" AME eigensolver options: \n"); hypre_printf(" -bsize : number of eigenvalues to compute \n"); hypre_printf(" \n"); } if (print_usage) { hypre_MPI_Finalize(); return (0); } } /* RL: XXX force to use l1-jac for GPU * TODO: change it back when GPU SpTrSV is fixed */ if (hypre_GetExecPolicy1(memory_location) == HYPRE_EXEC_DEVICE) { amg_rlx_type = 18; } AMSDriverMatrixRead("mfem.A", &A); AMSDriverVectorRead("mfem.x0", &x0); AMSDriverVectorRead("mfem.b", &b); AMSDriverMatrixRead("mfem.G", &G); /* Vectors Gx, Gy and Gz */ if (!coordinates) { AMSDriverVectorRead("mfem.Gx", &Gx); AMSDriverVectorRead("mfem.Gy", &Gy); if (dim == 3) { AMSDriverVectorRead("mfem.Gz", &Gz); } } /* Vectors x, y and z */ if (coordinates) { AMSDriverVectorRead("mfem.x", &x); AMSDriverVectorRead("mfem.y", &y); if (dim == 3) { AMSDriverVectorRead("mfem.z", &z); } } /* Poisson matrices */ if (h1_method) { AMSDriverMatrixRead("mfem.Aalpha", &Aalpha); AMSDriverMatrixRead("mfem.Abeta", &Abeta); } if (zero_cond) { AMSDriverVectorRead("mfem.inodes", &interior_nodes); } if (!myid) { hypre_printf("Problem size: %d\n\n", hypre_ParCSRMatrixGlobalNumRows((hypre_ParCSRMatrix*)A)); } hypre_ParCSRMatrixMigrate(A, hypre_HandleMemoryLocation(hypre_handle())); hypre_ParCSRMatrixMigrate(G, hypre_HandleMemoryLocation(hypre_handle())); hypre_ParCSRMatrixMigrate(Aalpha, hypre_HandleMemoryLocation(hypre_handle())); hypre_ParCSRMatrixMigrate(Abeta, hypre_HandleMemoryLocation(hypre_handle())); hypre_ParVectorMigrate(x0, hypre_HandleMemoryLocation(hypre_handle())); hypre_ParVectorMigrate(b, hypre_HandleMemoryLocation(hypre_handle())); hypre_ParVectorMigrate(Gx, hypre_HandleMemoryLocation(hypre_handle())); hypre_ParVectorMigrate(Gy, hypre_HandleMemoryLocation(hypre_handle())); hypre_ParVectorMigrate(Gz, hypre_HandleMemoryLocation(hypre_handle())); hypre_ParVectorMigrate(x, hypre_HandleMemoryLocation(hypre_handle())); hypre_ParVectorMigrate(y, hypre_HandleMemoryLocation(hypre_handle())); hypre_ParVectorMigrate(z, hypre_HandleMemoryLocation(hypre_handle())); hypre_ParVectorMigrate(interior_nodes, hypre_HandleMemoryLocation(hypre_handle())); hypre_MPI_Barrier(hypre_MPI_COMM_WORLD); /* AMG */ if (solver_id == 0) { HYPRE_Int num_iterations; HYPRE_Real final_res_norm; /* Start timing */ time_index = hypre_InitializeTiming("BoomerAMG Setup"); hypre_BeginTiming(time_index); /* Create solver */ HYPRE_BoomerAMGCreate(&solver); /* Set some parameters (See Reference Manual for more parameters) */ HYPRE_BoomerAMGSetPrintLevel(solver, 3); /* print solve info + parameters */ HYPRE_BoomerAMGSetCoarsenType(solver, 6); /* Falgout coarsening */ HYPRE_BoomerAMGSetRelaxType(solver, rlx_type); /* G-S/Jacobi hybrid relaxation */ HYPRE_BoomerAMGSetNumSweeps(solver, 1); /* Sweeeps on each level */ HYPRE_BoomerAMGSetMaxLevels(solver, 20); /* maximum number of levels */ HYPRE_BoomerAMGSetTol(solver, tol); /* conv. tolerance */ HYPRE_BoomerAMGSetMaxIter(solver, maxit); /* maximum number of iterations */ HYPRE_BoomerAMGSetStrongThreshold(solver, theta); HYPRE_BoomerAMGSetup(solver, A, b, x0); /* Finalize setup timing */ hypre_EndTiming(time_index); hypre_PrintTiming("Setup phase times", hypre_MPI_COMM_WORLD); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); /* Start timing again */ time_index = hypre_InitializeTiming("BoomerAMG Solve"); hypre_BeginTiming(time_index); /* Solve */ HYPRE_BoomerAMGSolve(solver, A, b, x0); /* Finalize solve timing */ hypre_EndTiming(time_index); hypre_PrintTiming("Solve phase times", hypre_MPI_COMM_WORLD); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); /* Run info - needed logging turned on */ HYPRE_BoomerAMGGetNumIterations(solver, &num_iterations); HYPRE_BoomerAMGGetFinalRelativeResidualNorm(solver, &final_res_norm); if (myid == 0) { hypre_printf("\n"); hypre_printf("Iterations = %d\n", num_iterations); hypre_printf("Final Relative Residual Norm = %e\n", final_res_norm); hypre_printf("\n"); } /* Destroy solver */ HYPRE_BoomerAMGDestroy(solver); } /* AMS */ if (solver_id == 2) { /* Start timing */ time_index = hypre_InitializeTiming("AMS Setup"); hypre_BeginTiming(time_index); /* Create solver */ HYPRE_AMSCreate(&solver); /* Set AMS parameters */ HYPRE_AMSSetDimension(solver, dim); HYPRE_AMSSetMaxIter(solver, maxit); HYPRE_AMSSetTol(solver, tol); HYPRE_AMSSetCycleType(solver, cycle_type); HYPRE_AMSSetPrintLevel(solver, 1); HYPRE_AMSSetDiscreteGradient(solver, G); /* Vectors Gx, Gy and Gz */ if (!coordinates) { HYPRE_AMSSetEdgeConstantVectors(solver, Gx, Gy, Gz); } /* Vectors x, y and z */ if (coordinates) { HYPRE_AMSSetCoordinateVectors(solver, x, y, z); } /* Poisson matrices */ if (h1_method) { HYPRE_AMSSetAlphaPoissonMatrix(solver, Aalpha); HYPRE_AMSSetBetaPoissonMatrix(solver, Abeta); } if (singular_problem) { HYPRE_AMSSetBetaPoissonMatrix(solver, NULL); } /* Smoothing and AMG options */ HYPRE_AMSSetSmoothingOptions(solver, rlx_type, rlx_sweeps, rlx_weight, rlx_omega); HYPRE_AMSSetAlphaAMGOptions(solver, amg_coarsen_type, amg_agg_levels, amg_rlx_type, theta, amg_interp_type, amg_Pmax); HYPRE_AMSSetBetaAMGOptions(solver, amg_coarsen_type, amg_agg_levels, amg_rlx_type, theta, amg_interp_type, amg_Pmax); HYPRE_AMSSetAlphaAMGCoarseRelaxType(solver, coarse_rlx_type); HYPRE_AMSSetBetaAMGCoarseRelaxType(solver, coarse_rlx_type); HYPRE_AMSSetup(solver, A, b, x0); /* Finalize setup timing */ hypre_EndTiming(time_index); hypre_PrintTiming("Setup phase times", hypre_MPI_COMM_WORLD); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); /* Start timing again */ time_index = hypre_InitializeTiming("AMS Solve"); hypre_BeginTiming(time_index); /* Solve */ HYPRE_AMSSolve(solver, A, b, x0); /* Finalize solve timing */ hypre_EndTiming(time_index); hypre_PrintTiming("Solve phase times", hypre_MPI_COMM_WORLD); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); /* Destroy solver */ HYPRE_AMSDestroy(solver); } /* PCG solvers */ else if (solver_id == 1 || solver_id == 3 || solver_id == 4) { HYPRE_Int num_iterations; HYPRE_Real final_res_norm; /* Start timing */ if (solver_id == 1) { time_index = hypre_InitializeTiming("BoomerAMG-PCG Setup"); } else if (solver_id == 3) { time_index = hypre_InitializeTiming("AMS-PCG Setup"); } else if (solver_id == 4) { time_index = hypre_InitializeTiming("DS-PCG Setup"); } hypre_BeginTiming(time_index); /* Create solver */ HYPRE_ParCSRPCGCreate(hypre_MPI_COMM_WORLD, &solver); /* Set some parameters (See Reference Manual for more parameters) */ HYPRE_PCGSetMaxIter(solver, maxit); /* max iterations */ HYPRE_PCGSetTol(solver, tol); /* conv. tolerance */ HYPRE_PCGSetTwoNorm(solver, 0); /* use the two norm as the stopping criteria */ HYPRE_PCGSetPrintLevel(solver, 2); /* print solve info */ HYPRE_PCGSetLogging(solver, 1); /* needed to get run info later */ /* PCG with AMG preconditioner */ if (solver_id == 1) { /* Now set up the AMG preconditioner and specify any parameters */ HYPRE_BoomerAMGCreate(&precond); HYPRE_BoomerAMGSetPrintLevel(precond, 1); /* print amg solution info */ HYPRE_BoomerAMGSetCoarsenType(precond, 6); /* Falgout coarsening */ HYPRE_BoomerAMGSetRelaxType(precond, rlx_type); /* Sym G.S./Jacobi hybrid */ HYPRE_BoomerAMGSetNumSweeps(precond, 1); /* Sweeeps on each level */ HYPRE_BoomerAMGSetMaxLevels(precond, 20); /* maximum number of levels */ HYPRE_BoomerAMGSetTol(precond, 0.0); /* conv. tolerance (if needed) */ HYPRE_BoomerAMGSetMaxIter(precond, 1); /* do only one iteration! */ HYPRE_BoomerAMGSetStrongThreshold(precond, theta); /* Set the PCG preconditioner */ HYPRE_PCGSetPrecond(solver, (HYPRE_PtrToSolverFcn) HYPRE_BoomerAMGSolve, (HYPRE_PtrToSolverFcn) HYPRE_BoomerAMGSetup, precond); } /* PCG with AMS preconditioner */ if (solver_id == 3) { /* Now set up the AMS preconditioner and specify any parameters */ HYPRE_AMSCreate(&precond); HYPRE_AMSSetDimension(precond, dim); HYPRE_AMSSetMaxIter(precond, 1); HYPRE_AMSSetTol(precond, 0.0); HYPRE_AMSSetCycleType(precond, cycle_type); HYPRE_AMSSetPrintLevel(precond, 0); HYPRE_AMSSetDiscreteGradient(precond, G); if (zero_cond) { HYPRE_AMSSetInteriorNodes(precond, interior_nodes); HYPRE_AMSSetProjectionFrequency(precond, 5); } HYPRE_PCGSetResidualTol(solver, rtol); HYPRE_PCGSetRecomputeResidualP(solver, rr); /* Vectors Gx, Gy and Gz */ if (!coordinates) { HYPRE_AMSSetEdgeConstantVectors(precond, Gx, Gy, Gz); } /* Vectors x, y and z */ if (coordinates) { HYPRE_AMSSetCoordinateVectors(precond, x, y, z); } /* Poisson matrices */ if (h1_method) { HYPRE_AMSSetAlphaPoissonMatrix(precond, Aalpha); HYPRE_AMSSetBetaPoissonMatrix(precond, Abeta); } if (singular_problem) { HYPRE_AMSSetBetaPoissonMatrix(precond, NULL); } /* Smoothing and AMG options */ HYPRE_AMSSetSmoothingOptions(precond, rlx_type, rlx_sweeps, rlx_weight, rlx_omega); HYPRE_AMSSetAlphaAMGOptions(precond, amg_coarsen_type, amg_agg_levels, amg_rlx_type, theta, amg_interp_type, amg_Pmax); HYPRE_AMSSetBetaAMGOptions(precond, amg_coarsen_type, amg_agg_levels, amg_rlx_type, theta, amg_interp_type, amg_Pmax); HYPRE_AMSSetAlphaAMGCoarseRelaxType(precond, coarse_rlx_type); HYPRE_AMSSetBetaAMGCoarseRelaxType(precond, coarse_rlx_type); /* Set the PCG preconditioner */ HYPRE_PCGSetPrecond(solver, (HYPRE_PtrToSolverFcn) HYPRE_AMSSolve, (HYPRE_PtrToSolverFcn) HYPRE_AMSSetup, precond); } /* PCG with diagonal scaling preconditioner */ else if (solver_id == 4) { /* Set the PCG preconditioner */ HYPRE_PCGSetPrecond(solver, (HYPRE_PtrToSolverFcn) HYPRE_ParCSRDiagScale, (HYPRE_PtrToSolverFcn) HYPRE_ParCSRDiagScaleSetup, NULL); } /* Setup */ HYPRE_ParCSRPCGSetup(solver, A, b, x0); /* Finalize setup timing */ hypre_EndTiming(time_index); hypre_PrintTiming("Setup phase times", hypre_MPI_COMM_WORLD); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); /* Start timing again */ if (solver_id == 1) { time_index = hypre_InitializeTiming("BoomerAMG-PCG Solve"); } else if (solver_id == 3) { time_index = hypre_InitializeTiming("AMS-PCG Solve"); } else if (solver_id == 4) { time_index = hypre_InitializeTiming("DS-PCG Solve"); } hypre_BeginTiming(time_index); /* Solve */ HYPRE_ParCSRPCGSolve(solver, A, b, x0); /* Finalize solve timing */ hypre_EndTiming(time_index); hypre_PrintTiming("Solve phase times", hypre_MPI_COMM_WORLD); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); /* Run info - needed logging turned on */ HYPRE_PCGGetNumIterations(solver, &num_iterations); HYPRE_PCGGetFinalRelativeResidualNorm(solver, &final_res_norm); if (myid == 0) { hypre_printf("\n"); hypre_printf("Iterations = %d\n", num_iterations); hypre_printf("Final Relative Residual Norm = %e\n", final_res_norm); hypre_printf("\n"); } /* Destroy solver and preconditioner */ HYPRE_ParCSRPCGDestroy(solver); if (solver_id == 1) { HYPRE_BoomerAMGDestroy(precond); } else if (solver_id == 3) { HYPRE_AMSDestroy(precond); } } if (solver_id == 5) { AMSDriverMatrixRead("mfem.M", &M); hypre_ParCSRMatrixMigrate(M, hypre_HandleMemoryLocation(hypre_handle())); time_index = hypre_InitializeTiming("AME Setup"); hypre_BeginTiming(time_index); /* Create AMS preconditioner and specify any parameters */ HYPRE_AMSCreate(&precond); HYPRE_AMSSetDimension(precond, dim); HYPRE_AMSSetMaxIter(precond, 1); HYPRE_AMSSetTol(precond, 0.0); HYPRE_AMSSetCycleType(precond, cycle_type); HYPRE_AMSSetPrintLevel(precond, 0); HYPRE_AMSSetDiscreteGradient(precond, G); /* Vectors Gx, Gy and Gz */ if (!coordinates) { HYPRE_AMSSetEdgeConstantVectors(precond, Gx, Gy, Gz); } /* Vectors x, y and z */ if (coordinates) { HYPRE_AMSSetCoordinateVectors(precond, x, y, z); } /* Poisson matrices */ if (h1_method) { HYPRE_AMSSetAlphaPoissonMatrix(precond, Aalpha); HYPRE_AMSSetBetaPoissonMatrix(precond, Abeta); } if (singular_problem) { HYPRE_AMSSetBetaPoissonMatrix(precond, NULL); } /* Smoothing and AMG options */ HYPRE_AMSSetSmoothingOptions(precond, rlx_type, rlx_sweeps, rlx_weight, rlx_omega); HYPRE_AMSSetAlphaAMGOptions(precond, amg_coarsen_type, amg_agg_levels, amg_rlx_type, theta, amg_interp_type, amg_Pmax); HYPRE_AMSSetBetaAMGOptions(precond, amg_coarsen_type, amg_agg_levels, amg_rlx_type, theta, amg_interp_type, amg_Pmax); HYPRE_AMSSetAlphaAMGCoarseRelaxType(precond, coarse_rlx_type); HYPRE_AMSSetBetaAMGCoarseRelaxType(precond, coarse_rlx_type); /* Set up the AMS preconditioner */ HYPRE_AMSSetup(precond, A, b, x0); /* Create AME object */ HYPRE_AMECreate(&solver); /* Set main parameters */ HYPRE_AMESetAMSSolver(solver, precond); HYPRE_AMESetMassMatrix(solver, M); HYPRE_AMESetBlockSize(solver, blockSize); /* Set additional parameters */ HYPRE_AMESetMaxIter(solver, maxit); /* max iterations */ HYPRE_AMESetMaxPCGIter(solver, pcg_maxit); /* max iterations */ HYPRE_AMESetTol(solver, tol); /* conv. tolerance */ if (myid == 0) { HYPRE_AMESetPrintLevel(solver, 1); /* print solve info */ } else { HYPRE_AMESetPrintLevel(solver, 0); } /* Setup */ HYPRE_AMESetup(solver); /* Finalize setup timing */ hypre_EndTiming(time_index); hypre_PrintTiming("Setup phase times", hypre_MPI_COMM_WORLD); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); time_index = hypre_InitializeTiming("AME Solve"); hypre_BeginTiming(time_index); /* Solve */ HYPRE_AMESolve(solver); /* Finalize solve timing */ hypre_EndTiming(time_index); hypre_PrintTiming("Solve phase times", hypre_MPI_COMM_WORLD); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); /* Destroy solver and preconditioner */ HYPRE_AMEDestroy(solver); HYPRE_AMSDestroy(precond); } /* Save the solution */ /* HYPRE_ParVectorPrint(x0,"x.ams"); */ /* Clean-up */ HYPRE_ParCSRMatrixDestroy(A); HYPRE_ParVectorDestroy(x0); HYPRE_ParVectorDestroy(b); HYPRE_ParCSRMatrixDestroy(G); if (M) { HYPRE_ParCSRMatrixDestroy(M); } if (Gx) { HYPRE_ParVectorDestroy(Gx); } if (Gy) { HYPRE_ParVectorDestroy(Gy); } if (Gz) { HYPRE_ParVectorDestroy(Gz); } if (x) { HYPRE_ParVectorDestroy(x); } if (y) { HYPRE_ParVectorDestroy(y); } if (z) { HYPRE_ParVectorDestroy(z); } if (Aalpha) { HYPRE_ParCSRMatrixDestroy(Aalpha); } if (Abeta) { HYPRE_ParCSRMatrixDestroy(Abeta); } if (zero_cond) { HYPRE_ParVectorDestroy(interior_nodes); } /* Finalize Hypre */ HYPRE_Finalize(); /* Finalize MPI */ hypre_MPI_Finalize(); if (HYPRE_GetError() && !myid) { hypre_fprintf(stderr, "hypre_error_flag = %d\n", HYPRE_GetError()); } return 0; } hypre-2.33.0/src/test/checktest.sh000077500000000000000000000034371477326011500170250ustar00rootroot00000000000000#!/bin/bash # Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) # Echo usage information case $1 in -h|-help) cat < #include #include /* #include */ #include "_hypre_utilities.h" #include "_hypre_parcsr_mv.h" #include "HYPRE_parcsr_ls.h" /* #include "_hypre_parcsr_ls.h" #include "HYPRE.h" #include "HYPRE_parcsr_mv.h" #include "HYPRE_krylov.h" */ /*some debugging tools*/ #define mydebug 0 #define mpip_on 0 /*time an allgather in addition to the current commpkg - since the allgather happens outside of the communication package.*/ #define time_gather 1 /* for timing multiple commpkg setup (if you want the time to be larger in the hopes of getting smaller stds - often not effective) */ #define LOOP2 1 HYPRE_Int myBuildParLaplacian (HYPRE_Int argc, char *argv [], HYPRE_Int arg_index, HYPRE_ParCSRMatrix *A_ptr, HYPRE_Int parmprint ); HYPRE_Int myBuildParLaplacian27pt (HYPRE_Int argc, char *argv [], HYPRE_Int arg_index, HYPRE_ParCSRMatrix *A_ptr, HYPRE_Int parmprint ); void stats_mo(HYPRE_Real*, HYPRE_Int, HYPRE_Real *, HYPRE_Real *); /*==========================================================================*/ /*------------------------------------------------------------------ * * This tests an alternate comm package for ij * * options: * -laplacian 3D 7pt stencil * -27pt 3D 27pt laplacian * -fromonecsrfile read matrix from a csr file * -commpkg 1 = new comm. package * 2 =old * 3 = both (default) * -loop number of times to loop (default is 0) * -verbose print more error checking * -noparmprint don't print the parameters *-------------------------------------------------------------------*/ HYPRE_Int main( HYPRE_Int argc, char *argv[] ) { HYPRE_Int num_procs, myid; HYPRE_Int verbose = 0, build_matrix_type = 1; HYPRE_Int index, matrix_arg_index, commpkg_flag = 3; HYPRE_Int i, k, ierr = 0; HYPRE_Int row_start, row_end; HYPRE_Int col_start, col_end, global_num_rows; HYPRE_Int *row_part, *col_part; char *csrfilename; HYPRE_Int preload = 0, loop = 0, loop2 = LOOP2; HYPRE_Int bcast_rows[2], *info; hypre_ParCSRMatrix *parcsr_A, *small_A; HYPRE_ParCSRMatrix A_temp, A_temp_small; hypre_CSRMatrix *A_CSR; hypre_ParCSRCommPkg *comm_pkg; HYPRE_Int nx, ny, nz; HYPRE_Int P, Q, R; HYPRE_Int p, q, r; HYPRE_Real values[4]; hypre_ParVector *x_new; hypre_ParVector *y_new, *y; HYPRE_Int *row_starts; HYPRE_Real ans; HYPRE_Real start_time, end_time, total_time, *loop_times; HYPRE_Real T_avg, T_std; HYPRE_Int noparmprint = 0; #if mydebug HYPRE_Int j, tmp_int; #endif /*----------------------------------------------------------- * Initialize MPI *-----------------------------------------------------------*/ hypre_MPI_Init(&argc, &argv); hypre_MPI_Comm_size(hypre_MPI_COMM_WORLD, &num_procs ); hypre_MPI_Comm_rank(hypre_MPI_COMM_WORLD, &myid ); /*----------------------------------------------------------- * default - is 27pt laplace *-----------------------------------------------------------*/ build_matrix_type = 2; matrix_arg_index = argc; /*----------------------------------------------------------- * Parse command line *-----------------------------------------------------------*/ index = 1; while ( index < argc) { if ( strcmp(argv[index], "-verbose") == 0 ) { index++; verbose = 1; } else if ( strcmp(argv[index], "-fromonecsrfile") == 0 ) { index++; build_matrix_type = 1; matrix_arg_index = index; /*this tells where the name is*/ } else if ( strcmp(argv[index], "-commpkg") == 0 ) { index++; commpkg_flag = atoi(argv[index++]); } else if ( strcmp(argv[index], "-laplacian") == 0 ) { index++; build_matrix_type = 2; matrix_arg_index = index; } else if ( strcmp(argv[index], "-27pt") == 0 ) { index++; build_matrix_type = 4; matrix_arg_index = index; } #if 0 else if ( strcmp(argv[index], "-nopreload") == 0 ) { index++; preload = 0; } #endif else if ( strcmp(argv[index], "-loop") == 0 ) { index++; loop = atoi(argv[index++]); } else if ( strcmp(argv[index], "-noparmprint") == 0 ) { index++; noparmprint = 1; } else { index++; /*hypre_printf("Warning: Unrecogized option '%s'\n",argv[index++] );*/ } } /*----------------------------------------------------------- * Setup the Matrix problem *-----------------------------------------------------------*/ /*----------------------------------------------------------- * Get actual partitioning- * read in an actual csr matrix. *-----------------------------------------------------------*/ if (build_matrix_type == 1) /*read in a csr matrix from one file */ { if (matrix_arg_index < argc) { csrfilename = argv[matrix_arg_index]; } else { hypre_printf("Error: No filename specified \n"); exit(1); } if (myid == 0) { /*hypre_printf(" FromFile: %s\n", csrfilename);*/ A_CSR = hypre_CSRMatrixRead(csrfilename); } row_part = NULL; col_part = NULL; parcsr_A = hypre_CSRMatrixToParCSRMatrix(hypre_MPI_COMM_WORLD, A_CSR, row_part, col_part); if (myid == 0) { hypre_CSRMatrixDestroy(A_CSR); } } else if (build_matrix_type == 2) { myBuildParLaplacian(argc, argv, matrix_arg_index, &A_temp, !noparmprint); parcsr_A = (hypre_ParCSRMatrix *) A_temp; } else if (build_matrix_type == 4) { myBuildParLaplacian27pt(argc, argv, matrix_arg_index, &A_temp, !noparmprint); parcsr_A = (hypre_ParCSRMatrix *) A_temp; } /*----------------------------------------------------------- * create a small problem so that timings are more accurate - * code gets run twice (small laplace) *-----------------------------------------------------------*/ /*this is no longer being used - preload = 0 is set at the beginning */ if (preload == 1) { /*hypre_printf("preload!\n");*/ values[1] = -1; values[2] = -1; values[3] = -1; values[0] = - 6.0 ; nx = 2; ny = num_procs; nz = 2; P = 1; Q = num_procs; R = 1; p = myid % P; q = (( myid - p) / P) % Q; r = ( myid - p - P * q) / ( P * Q ); A_temp_small = (HYPRE_ParCSRMatrix) GenerateLaplacian(hypre_MPI_COMM_WORLD, nx, ny, nz, P, Q, R, p, q, r, values); small_A = (hypre_ParCSRMatrix *) A_temp_small; /*do comm packages*/ hypre_NewCommPkgCreate(small_A); hypre_NewCommPkgDestroy(small_A); hypre_MatvecCommPkgCreate(small_A); hypre_ParCSRMatrixDestroy(small_A); } /*----------------------------------------------------------- * Prepare for timing *-----------------------------------------------------------*/ /* instead of preloading, let's not time the first one if more than one*/ if (!loop) { loop = 1; /* and don't do any timings */ } else { loop += 1; if (loop < 2) { loop = 2; } } loop_times = hypre_CTAlloc(HYPRE_Real, loop, HYPRE_MEMORY_HOST); /******************************************************************************************/ hypre_MPI_Barrier(hypre_MPI_COMM_WORLD); if (commpkg_flag == 1 || commpkg_flag == 3 ) { /*----------------------------------------------------------- * Create new comm package *-----------------------------------------------------------*/ if (!myid) { hypre_printf("********************************************************\n" ); } /*do loop times*/ for (i = 0; i < loop; i++) { loop_times[i] = 0.0; for (k = 0; k < loop2; k++) { hypre_MPI_Barrier(hypre_MPI_COMM_WORLD); start_time = hypre_MPI_Wtime(); #if mpip_on if (i == (loop - 1)) { hypre_MPI_Pcontrol(1); } #endif hypre_NewCommPkgCreate(parcsr_A); #if mpip_on if (i == (loop - 1)) { hypre_MPI_Pcontrol(0); } #endif end_time = hypre_MPI_Wtime(); end_time = end_time - start_time; hypre_MPI_Allreduce(&end_time, &total_time, 1, HYPRE_MPI_REAL, hypre_MPI_MAX, hypre_MPI_COMM_WORLD); loop_times[i] += total_time; if ( !((i + 1) == loop && (k + 1) == loop2)) { hypre_NewCommPkgDestroy(parcsr_A); } }/*end of loop2 */ } /*end of loop*/ /* calculate the avg and std. */ if (loop > 1) { /* calculate the avg and std. */ stats_mo(loop_times, loop, &T_avg, &T_std); if (!myid) { hypre_printf(" NewCommPkgCreate: AVG. wall clock time = %f seconds\n", T_avg); } if (!myid) { hypre_printf(" STD. for %d runs = %f\n", loop - 1, T_std); } if (!myid) { hypre_printf(" (Note: avg./std. timings exclude run 0.)\n"); } if (!myid) { hypre_printf("********************************************************\n" ); } for (i = 0; i < loop; i++) { if (!myid) { hypre_printf(" run %d = %f sec.\n", i, loop_times[i]); } } if (!myid) { hypre_printf("********************************************************\n" ); } } else { if (!myid) { hypre_printf("********************************************************\n" ); } if (!myid) { hypre_printf(" NewCommPkgCreate:\n"); } if (!myid) { hypre_printf(" run time = %f sec.\n", loop_times[0]); } if (!myid) { hypre_printf("********************************************************\n" ); } } /*----------------------------------------------------------- * Verbose printing *-----------------------------------------------------------*/ /*some verification*/ global_num_rows = hypre_ParCSRMatrixGlobalNumRows(parcsr_A); if (verbose) { ierr = hypre_ParCSRMatrixGetLocalRange( parcsr_A, &row_start, &row_end, &col_start, &col_end ); comm_pkg = hypre_ParCSRMatrixCommPkg(parcsr_A); hypre_printf("myid = %i, my ACTUAL local range: [%i, %i]\n", myid, row_start, row_end); ierr = hypre_GetAssumedPartitionRowRange( myid, global_num_rows, &row_start, &row_end); hypre_printf("myid = %i, my assumed local range: [%i, %i]\n", myid, row_start, row_end); hypre_printf("myid = %d, num_recvs = %d\n", myid, hypre_ParCSRCommPkgNumRecvs(comm_pkg) ); #if mydebug for (i = 0; i < hypre_ParCSRCommPkgNumRecvs(comm_pkg); i++) { hypre_printf("myid = %d, recv proc = %d, vec_starts = [%d : %d]\n", myid, hypre_ParCSRCommPkgRecvProcs(comm_pkg)[i], hypre_ParCSRCommPkgRecvVecStarts(comm_pkg)[i], hypre_ParCSRCommPkgRecvVecStarts(comm_pkg)[i + 1] - 1); } #endif hypre_printf("myid = %d, num_sends = %d\n", myid, hypre_ParCSRCommPkgNumSends(comm_pkg) ); #if mydebug for (i = 0; i < hypre_ParCSRCommPkgNumSends(comm_pkg) ; i++) { tmp_int = hypre_ParCSRCommPkgSendMapStarts(comm_pkg)[i + 1] - hypre_ParCSRCommPkgSendMapStarts(comm_pkg)[i]; index = hypre_ParCSRCommPkgSendMapStarts(comm_pkg)[i]; for (j = 0; j < tmp_int; j++) { hypre_printf("myid = %d, send proc = %d, send element = %d\n", myid, hypre_ParCSRCommPkgSendProcs(comm_pkg)[i], hypre_ParCSRCommPkgSendMapElmts(comm_pkg)[index + j]); } } #endif } /*----------------------------------------------------------- * To verify correctness (if commpkg_flag = 3) *-----------------------------------------------------------*/ if (commpkg_flag == 3 ) { /*do a matvec - we are assuming a square matrix */ row_starts = hypre_ParCSRMatrixRowStarts(parcsr_A); x_new = hypre_ParVectorCreate(hypre_MPI_COMM_WORLD, global_num_rows, row_starts); hypre_ParVectorInitialize(x_new); hypre_ParVectorSetRandomValues(x_new, 1); y_new = hypre_ParVectorCreate(hypre_MPI_COMM_WORLD, global_num_rows, row_starts); hypre_ParVectorInitialize(y_new); hypre_ParVectorSetConstantValues(y_new, 0.0); /*y = 1.0*A*x+1.0*y */ hypre_ParCSRMatrixMatvec (1.0, parcsr_A, x_new, 1.0, y_new); } /*----------------------------------------------------------- * Clean up after MyComm *-----------------------------------------------------------*/ hypre_NewCommPkgDestroy(parcsr_A); } /******************************************************************************************/ /******************************************************************************************/ hypre_MPI_Barrier(hypre_MPI_COMM_WORLD); if (commpkg_flag > 1 ) { /*----------------------------------------------------------- * Set up standard comm package *-----------------------------------------------------------*/ bcast_rows[0] = 23; bcast_rows[1] = 1789; if (!myid) { hypre_printf("********************************************************\n" ); } /*do loop times*/ for (i = 0; i < loop; i++) { loop_times[i] = 0.0; for (k = 0; k < loop2; k++) { hypre_MPI_Barrier(hypre_MPI_COMM_WORLD); start_time = hypre_MPI_Wtime(); #if time_gather info = hypre_CTAlloc(HYPRE_Int, num_procs, HYPRE_MEMORY_HOST); hypre_MPI_Allgather(bcast_rows, 1, HYPRE_MPI_INT, info, 1, HYPRE_MPI_INT, hypre_MPI_COMM_WORLD); #endif hypre_MatvecCommPkgCreate(parcsr_A); end_time = hypre_MPI_Wtime(); end_time = end_time - start_time; hypre_MPI_Allreduce(&end_time, &total_time, 1, HYPRE_MPI_REAL, hypre_MPI_MAX, hypre_MPI_COMM_WORLD); loop_times[i] += total_time; if ( !((i + 1) == loop && (k + 1) == loop2)) { hypre_MatvecCommPkgDestroy(hypre_ParCSRMatrixCommPkg(parcsr_A)); } }/* end of loop 2*/ } /*end of loop*/ /* calculate the avg and std. */ if (loop > 1) { stats_mo(loop_times, loop, &T_avg, &T_std); if (!myid) { hypre_printf("Current CommPkgCreate: AVG. wall clock time = %f seconds\n", T_avg); } if (!myid) { hypre_printf(" STD. for %d runs = %f\n", loop - 1, T_std); } if (!myid) { hypre_printf(" (Note: avg./std. timings exclude run 0.)\n"); } if (!myid) { hypre_printf("********************************************************\n" ); } for (i = 0; i < loop; i++) { if (!myid) { hypre_printf(" run %d = %f sec.\n", i, loop_times[i]); } } if (!myid) { hypre_printf("********************************************************\n" ); } } else { if (!myid) { hypre_printf("********************************************************\n" ); } if (!myid) { hypre_printf(" Current CommPkgCreate:\n"); } if (!myid) { hypre_printf(" run time = %f sec.\n", loop_times[0]); } if (!myid) { hypre_printf("********************************************************\n" ); } } /*----------------------------------------------------------- * Verbose printing *-----------------------------------------------------------*/ /*some verification*/ if (verbose) { ierr = hypre_ParCSRMatrixGetLocalRange( parcsr_A, &row_start, &row_end, &col_start, &col_end ); comm_pkg = hypre_ParCSRMatrixCommPkg(parcsr_A); hypre_printf("myid = %i, std - my local range: [%i, %i]\n", myid, row_start, row_end); ierr = hypre_ParCSRMatrixGetLocalRange( parcsr_A, &row_start, &row_end, &col_start, &col_end ); hypre_printf("myid = %d, std - num_recvs = %d\n", myid, hypre_ParCSRCommPkgNumRecvs(comm_pkg) ); #if mydebug for (i = 0; i < hypre_ParCSRCommPkgNumRecvs(comm_pkg); i++) { hypre_printf("myid = %d, std - recv proc = %d, vec_starts = [%d : %d]\n", myid, hypre_ParCSRCommPkgRecvProcs(comm_pkg)[i], hypre_ParCSRCommPkgRecvVecStarts(comm_pkg)[i], hypre_ParCSRCommPkgRecvVecStarts(comm_pkg)[i + 1] - 1); } #endif hypre_printf("myid = %d, std - num_sends = %d\n", myid, hypre_ParCSRCommPkgNumSends(comm_pkg)); #if mydebug for (i = 0; i < hypre_ParCSRCommPkgNumSends(comm_pkg) ; i++) { tmp_int = hypre_ParCSRCommPkgSendMapStarts(comm_pkg)[i + 1] - hypre_ParCSRCommPkgSendMapStarts(comm_pkg)[i]; index = hypre_ParCSRCommPkgSendMapStarts(comm_pkg)[i]; for (j = 0; j < tmp_int; j++) { hypre_printf("myid = %d, std - send proc = %d, send element = %d\n", myid, hypre_ParCSRCommPkgSendProcs(comm_pkg)[i], hypre_ParCSRCommPkgSendMapElmts(comm_pkg)[index + j]); } } #endif } /*----------------------------------------------------------- * Verify correctness *-----------------------------------------------------------*/ if (commpkg_flag == 3 ) { global_num_rows = hypre_ParCSRMatrixGlobalNumRows(parcsr_A); row_starts = hypre_ParCSRMatrixRowStarts(parcsr_A); y = hypre_ParVectorCreate(hypre_MPI_COMM_WORLD, global_num_rows, row_starts); hypre_ParVectorInitialize(y); hypre_ParVectorSetConstantValues(y, 0.0); hypre_ParCSRMatrixMatvec (1.0, parcsr_A, x_new, 1.0, y); } } /*----------------------------------------------------------- * Compare matvecs for both comm packages (3) *-----------------------------------------------------------*/ if (commpkg_flag == 3 ) { /*make sure that y and y_new are the same - now y_new should=0*/ hypre_ParVectorAxpy( -1.0, y, y_new ); hypre_ParVectorSetRandomValues(y, 1); ans = hypre_ParVectorInnerProd( y, y_new ); if (!myid) { if ( fabs(ans) > 1e-8 ) { hypre_printf("!!!!! WARNING !!!!! should be zero if correct = %6.10f\n", ans); } else { hypre_printf("Matvecs match ( should be zero = %6.10f )\n", ans); } } } /*----------------------------------------------------------- * Clean up *-----------------------------------------------------------*/ hypre_ParCSRMatrixDestroy(parcsr_A); /*this calls the standard comm package destroy - but we'll destroy ours separately until it is incorporated */ if (commpkg_flag == 3 ) { hypre_ParVectorDestroy(x_new); hypre_ParVectorDestroy(y); hypre_ParVectorDestroy(y_new); } hypre_MPI_Finalize(); return (ierr); } /*------------------------------------ * Calculate the average and STD * throw away 1st timing *------------------------------------*/ void stats_mo(HYPRE_Real array[], HYPRE_Int n, HYPRE_Real *Tavg, HYPRE_Real *Tstd) { HYPRE_Int i; HYPRE_Real atmp, tmp = 0.0; HYPRE_Real avg = 0.0, std; for (i = 1; i < n; i++) { atmp = array[i]; avg += atmp; tmp += atmp * atmp; } n = n - 1; avg = avg / (HYPRE_Real) n; tmp = tmp / (HYPRE_Real) n; tmp = fabs(tmp - avg * avg); std = hypre_sqrt(tmp); *Tavg = avg; *Tstd = std; } /*These next two functions are from ij.c in linear_solvers/tests */ /*---------------------------------------------------------------------- * Build 27-point laplacian in 3D, * Parameters given in command line. *----------------------------------------------------------------------*/ HYPRE_Int myBuildParLaplacian27pt( HYPRE_Int argc, char *argv[], HYPRE_Int arg_index, HYPRE_ParCSRMatrix *A_ptr, HYPRE_Int parmprint ) { HYPRE_Int nx, ny, nz; HYPRE_Int P, Q, R; HYPRE_ParCSRMatrix A; HYPRE_Int num_procs, myid; HYPRE_Int p, q, r; HYPRE_Real *values; /*----------------------------------------------------------- * Initialize some stuff *-----------------------------------------------------------*/ hypre_MPI_Comm_size(hypre_MPI_COMM_WORLD, &num_procs ); hypre_MPI_Comm_rank(hypre_MPI_COMM_WORLD, &myid ); /*----------------------------------------------------------- * Set defaults *-----------------------------------------------------------*/ nx = 10; ny = 10; nz = 10; P = 1; Q = num_procs; R = 1; /*----------------------------------------------------------- * Parse command line *-----------------------------------------------------------*/ arg_index = 0; while (arg_index < argc) { if ( strcmp(argv[arg_index], "-n") == 0 ) { arg_index++; nx = atoi(argv[arg_index++]); ny = atoi(argv[arg_index++]); nz = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-P") == 0 ) { arg_index++; P = atoi(argv[arg_index++]); Q = atoi(argv[arg_index++]); R = atoi(argv[arg_index++]); } else { arg_index++; } } /*----------------------------------------------------------- * Check a few things *-----------------------------------------------------------*/ if ((P * Q * R) != num_procs) { hypre_printf("Error: Invalid number of processors or processor topology \n"); exit(1); } /*----------------------------------------------------------- * Print driver parameters *-----------------------------------------------------------*/ if (myid == 0 && parmprint) { hypre_printf(" Laplacian_27pt:\n"); hypre_printf(" (nx, ny, nz) = (%d, %d, %d)\n", nx, ny, nz); hypre_printf(" (Px, Py, Pz) = (%d, %d, %d)\n\n", P, Q, R); } /*----------------------------------------------------------- * Set up the grid structure *-----------------------------------------------------------*/ /* compute p,q,r from P,Q,R and myid */ p = myid % P; q = (( myid - p) / P) % Q; r = ( myid - p - P * q) / ( P * Q ); /*----------------------------------------------------------- * Generate the matrix *-----------------------------------------------------------*/ values = hypre_CTAlloc(HYPRE_Real, 2, HYPRE_MEMORY_HOST); values[0] = 26.0; if (nx == 1 || ny == 1 || nz == 1) { values[0] = 8.0; } if (nx * ny == 1 || nx * nz == 1 || ny * nz == 1) { values[0] = 2.0; } values[1] = -1.; A = (HYPRE_ParCSRMatrix) GenerateLaplacian27pt(hypre_MPI_COMM_WORLD, nx, ny, nz, P, Q, R, p, q, r, values); hypre_TFree(values, HYPRE_MEMORY_HOST); *A_ptr = A; return (0); } /*---------------------------------------------------------------------- * Build standard 7-point laplacian in 3D with grid and anisotropy. * Parameters given in command line. *----------------------------------------------------------------------*/ HYPRE_Int myBuildParLaplacian( HYPRE_Int argc, char *argv[], HYPRE_Int arg_index, HYPRE_ParCSRMatrix *A_ptr, HYPRE_Int parmprint ) { HYPRE_Int nx, ny, nz; HYPRE_Int P, Q, R; HYPRE_Real cx, cy, cz; HYPRE_ParCSRMatrix A; HYPRE_Int num_procs, myid; HYPRE_Int p, q, r; HYPRE_Real *values; /*----------------------------------------------------------- * Initialize some stuff *-----------------------------------------------------------*/ hypre_MPI_Comm_size(hypre_MPI_COMM_WORLD, &num_procs ); hypre_MPI_Comm_rank(hypre_MPI_COMM_WORLD, &myid ); /*----------------------------------------------------------- * Set defaults *-----------------------------------------------------------*/ nx = 10; ny = 10; nz = 10; P = 1; Q = num_procs; R = 1; cx = 1.; cy = 1.; cz = 1.; /*----------------------------------------------------------- * Parse command line *-----------------------------------------------------------*/ arg_index = 0; while (arg_index < argc) { if ( strcmp(argv[arg_index], "-n") == 0 ) { arg_index++; nx = atoi(argv[arg_index++]); ny = atoi(argv[arg_index++]); nz = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-P") == 0 ) { arg_index++; P = atoi(argv[arg_index++]); Q = atoi(argv[arg_index++]); R = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-c") == 0 ) { arg_index++; cx = (HYPRE_Real)atof(argv[arg_index++]); cy = (HYPRE_Real)atof(argv[arg_index++]); cz = (HYPRE_Real)atof(argv[arg_index++]); } else { arg_index++; } } /*----------------------------------------------------------- * Check a few things *-----------------------------------------------------------*/ if ((P * Q * R) != num_procs) { hypre_printf("Error: Invalid number of processors or processor topology \n"); exit(1); } /*----------------------------------------------------------- * Print driver parameters *-----------------------------------------------------------*/ if (myid == 0 && parmprint) { hypre_printf(" Laplacian:\n"); hypre_printf(" (nx, ny, nz) = (%d, %d, %d)\n", nx, ny, nz); hypre_printf(" (Px, Py, Pz) = (%d, %d, %d)\n", P, Q, R); hypre_printf(" (cx, cy, cz) = (%f, %f, %f)\n\n", cx, cy, cz); } /*----------------------------------------------------------- * Set up the grid structure *-----------------------------------------------------------*/ /* compute p,q,r from P,Q,R and myid */ p = myid % P; q = (( myid - p) / P) % Q; r = ( myid - p - P * q) / ( P * Q ); /*----------------------------------------------------------- * Generate the matrix *-----------------------------------------------------------*/ values = hypre_CTAlloc(HYPRE_Real, 4, HYPRE_MEMORY_HOST); values[1] = -cx; values[2] = -cy; values[3] = -cz; values[0] = 0.; if (nx > 1) { values[0] += 2.0 * cx; } if (ny > 1) { values[0] += 2.0 * cy; } if (nz > 1) { values[0] += 2.0 * cz; } A = (HYPRE_ParCSRMatrix) GenerateLaplacian(hypre_MPI_COMM_WORLD, nx, ny, nz, P, Q, R, p, q, r, values); hypre_TFree(values, HYPRE_MEMORY_HOST); *A_ptr = A; return (0); } hypre-2.33.0/src/test/ex1_for.c000066400000000000000000000347171477326011500162250ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /* Example 1 Interface: Structured interface (Struct) Compile with: make ex1 (may need to edit HYPRE_DIR in Makefile) Sample run: mpirun -np 2 ex1 Description: This is a two processor example. Each processor owns one box in the grid. For reference, the two grid boxes are those in the example diagram in the struct interface chapter of the User's Manual. Note that in this example code, we have used the two boxes shown in the diagram as belonging to processor 0 (and given one box to each processor). The solver is PCG with no preconditioner. We recommend viewing examples 1-4 sequentially for a nice overview/tutorial of the struct interface. */ /* Struct linear solvers header */ #include "HYPRE_struct_ls.h" #ifdef HYPRE_FORTRAN #include "fortran.h" #include "hypre_struct_fortran_test.h" #endif HYPRE_Int main (HYPRE_Int argc, char *argv[]) { HYPRE_Int i, j, myid; #ifdef HYPRE_FORTRAN hypre_F90_Obj grid; hypre_F90_Obj stencil; hypre_F90_Obj A; hypre_F90_Obj b; hypre_F90_Obj x; hypre_F90_Obj solver; HYPRE_Int temp_COMM; HYPRE_Int one = 1; HYPRE_Int two = 2; HYPRE_Int five = 5; HYPRE_Real tol = 1.e-6; #else HYPRE_StructGrid grid; HYPRE_StructStencil stencil; HYPRE_StructMatrix A; HYPRE_StructVector b; HYPRE_StructVector x; HYPRE_StructSolver solver; #endif /* Initialize MPI */ hypre_MPI_Init(&argc, &argv); hypre_MPI_Comm_rank(hypre_MPI_COMM_WORLD, &myid); /* 1. Set up a grid. Each processor describes the piece of the grid that it owns. */ { /* Create an empty 2D grid object */ #ifdef HYPRE_FORTRAN temp_COMM = (HYPRE_Int) hypre_MPI_COMM_WORLD; HYPRE_StructGridCreate(&temp_COMM, &two, &grid); #else HYPRE_StructGridCreate(hypre_MPI_COMM_WORLD, 2, &grid); #endif /* Add boxes to the grid */ if (myid == 0) { HYPRE_Int ilower[2] = {-3, 1}, iupper[2] = {-1, 2}; #ifdef HYPRE_FORTRAN HYPRE_StructGridSetExtents(&grid, &ilower[0], &iupper[0]); #else HYPRE_StructGridSetExtents(grid, ilower, iupper); #endif } else if (myid == 1) { HYPRE_Int ilower[2] = {0, 1}, iupper[2] = {2, 4}; #ifdef HYPRE_FORTRAN HYPRE_StructGridSetExtents(&grid, &ilower[0], &iupper[0]); #else HYPRE_StructGridSetExtents(grid, ilower, iupper); #endif } /* This is a collective call finalizing the grid assembly. The grid is now ``ready to be used'' */ #ifdef HYPRE_FORTRAN HYPRE_StructGridAssemble(&grid); #else HYPRE_StructGridAssemble(grid); #endif } /* 2. Define the discretization stencil */ { /* Create an empty 2D, 5-pt stencil object */ #ifdef HYPRE_FORTRAN HYPRE_StructStencilCreate(&two, &five, &stencil); #else HYPRE_StructStencilCreate(2, 5, &stencil); #endif /* Define the geometry of the stencil. Each represents a relative offset (in the index space). */ { HYPRE_Int entry; HYPRE_Int offsets[5][2] = {{0, 0}, {-1, 0}, {1, 0}, {0, -1}, {0, 1}}; /* Assign each of the 5 stencil entries */ #ifdef HYPRE_FORTRAN for (entry = 0; entry < 5; entry++) { HYPRE_StructStencilSetElement(&stencil, &entry, offsets[entry]); } #else for (entry = 0; entry < 5; entry++) { HYPRE_StructStencilSetElement(stencil, entry, offsets[entry]); } #endif } } /* 3. Set up a Struct Matrix */ { /* Create an empty matrix object */ #ifdef HYPRE_FORTRAN HYPRE_StructMatrixCreate(&temp_COMM, &grid, &stencil, &A); #else HYPRE_StructMatrixCreate(hypre_MPI_COMM_WORLD, grid, stencil, &A); #endif /* Indicate that the matrix coefficients are ready to be set */ #ifdef HYPRE_FORTRAN HYPRE_StructMatrixInitialize(&A); #else HYPRE_StructMatrixInitialize(A); #endif /* Set the matrix coefficients. Each processor assigns coefficients for the boxes in the grid that it owns. Note that the coefficients associated with each stencil entry may vary from grid point to grid point if desired. Here, we first set the same stencil entries for each grid point. Then we make modifications to grid points near the boundary. */ if (myid == 0) { HYPRE_Int ilower[2] = {-3, 1}, iupper[2] = {-1, 2}; HYPRE_Int stencil_indices[5] = {0, 1, 2, 3, 4}; /* labels for the stencil entries - these correspond to the offsets defined above */ HYPRE_Int nentries = 5; HYPRE_Int nvalues = 30; /* 6 grid points, each with 5 stencil entries */ HYPRE_Real values[30]; /* We have 6 grid points, each with 5 stencil entries */ for (i = 0; i < nvalues; i += nentries) { values[i] = 4.0; for (j = 1; j < nentries; j++) { values[i + j] = -1.0; } } #ifdef HYPRE_FORTRAN HYPRE_StructMatrixSetBoxValues(&A, &ilower[0], &iupper[0], &nentries, &stencil_indices[0], &values[0]); #else HYPRE_StructMatrixSetBoxValues(A, ilower, iupper, nentries, stencil_indices, values); #endif } else if (myid == 1) { HYPRE_Int ilower[2] = {0, 1}, iupper[2] = {2, 4}; HYPRE_Int stencil_indices[5] = {0, 1, 2, 3, 4}; HYPRE_Int nentries = 5; HYPRE_Int nvalues = 60; /* 12 grid points, each with 5 stencil entries */ HYPRE_Real values[60]; for (i = 0; i < nvalues; i += nentries) { values[i] = 4.0; for (j = 1; j < nentries; j++) { values[i + j] = -1.0; } } #ifdef HYPRE_FORTRAN HYPRE_StructMatrixSetBoxValues(&A, &ilower[0], &iupper[0], &nentries, &stencil_indices[0], &values[0]); #else HYPRE_StructMatrixSetBoxValues(A, ilower, iupper, nentries, stencil_indices, values); #endif } /* Set the coefficients reaching outside of the boundary to 0 */ if (myid == 0) { HYPRE_Real values[3]; for (i = 0; i < 3; i++) { values[i] = 0.0; } { /* values below our box */ HYPRE_Int ilower[2] = {-3, 1}, iupper[2] = {-1, 1}; HYPRE_Int stencil_indices[1] = {3}; #ifdef HYPRE_FORTRAN HYPRE_StructMatrixSetBoxValues(&A, &ilower[0], &iupper[0], &one, &stencil_indices[0], &values[0]); #else HYPRE_StructMatrixSetBoxValues(A, ilower, iupper, 1, stencil_indices, values); #endif } { /* values to the left of our box */ HYPRE_Int ilower[2] = {-3, 1}, iupper[2] = {-3, 2}; HYPRE_Int stencil_indices[1] = {1}; #ifdef HYPRE_FORTRAN HYPRE_StructMatrixSetBoxValues(&A, &ilower[0], &iupper[0], &one, &stencil_indices[0], &values[0]); #else HYPRE_StructMatrixSetBoxValues(A, ilower, iupper, 1, stencil_indices, values); #endif } { /* values above our box */ HYPRE_Int ilower[2] = {-3, 2}, iupper[2] = {-1, 2}; HYPRE_Int stencil_indices[1] = {4}; #ifdef HYPRE_FORTRAN HYPRE_StructMatrixSetBoxValues(&A, &ilower[0], &iupper[0], &one, &stencil_indices[0], &values[0]); #else HYPRE_StructMatrixSetBoxValues(A, ilower, iupper, 1, stencil_indices, values); #endif } } else if (myid == 1) { HYPRE_Real values[4]; for (i = 0; i < 4; i++) { values[i] = 0.0; } { /* values below our box */ HYPRE_Int ilower[2] = {0, 1}, iupper[2] = {2, 1}; HYPRE_Int stencil_indices[1] = {3}; #ifdef HYPRE_FORTRAN HYPRE_StructMatrixSetBoxValues(&A, &ilower[0], &iupper[0], &one, &stencil_indices[0], &values[0]); #else HYPRE_StructMatrixSetBoxValues(A, ilower, iupper, 1, stencil_indices, values); #endif } { /* values to the right of our box (that do not border the other box on proc. 0) */ HYPRE_Int ilower[2] = {2, 1}, iupper[2] = {2, 4}; HYPRE_Int stencil_indices[1] = {2}; #ifdef HYPRE_FORTRAN HYPRE_StructMatrixSetBoxValues(&A, &ilower[0], &iupper[0], &one, &stencil_indices[0], &values[0]); #else HYPRE_StructMatrixSetBoxValues(A, ilower, iupper, 1, stencil_indices, values); #endif } { /* values above our box */ HYPRE_Int ilower[2] = {0, 4}, iupper[2] = {2, 4}; HYPRE_Int stencil_indices[1] = {4}; #ifdef HYPRE_FORTRAN HYPRE_StructMatrixSetBoxValues(&A, &ilower[0], &iupper[0], &one, &stencil_indices[0], &values[0]); #else HYPRE_StructMatrixSetBoxValues(A, ilower, iupper, 1, stencil_indices, values); #endif } { /* values to the left of our box */ HYPRE_Int ilower[2] = {0, 3}, iupper[2] = {0, 4}; HYPRE_Int stencil_indices[1] = {1}; #ifdef HYPRE_FORTRAN HYPRE_StructMatrixSetBoxValues(&A, &ilower[0], &iupper[0], &one, &stencil_indices[0], &values[0]); #else HYPRE_StructMatrixSetBoxValues(A, ilower, iupper, 1, stencil_indices, values); #endif } } /* This is a collective call finalizing the matrix assembly. The matrix is now ``ready to be used'' */ #ifdef HYPRE_FORTRAN HYPRE_StructMatrixAssemble(&A); #else HYPRE_StructMatrixAssemble(A); #endif } /* 4. Set up Struct Vectors for b and x. Each processor sets the vectors corresponding to its boxes. */ { /* Create an empty vector object */ #ifdef HYPRE_FORTRAN HYPRE_StructVectorCreate(&temp_COMM, &grid, &b); HYPRE_StructVectorCreate(&temp_COMM, &grid, &x); #else HYPRE_StructVectorCreate(hypre_MPI_COMM_WORLD, grid, &b); HYPRE_StructVectorCreate(hypre_MPI_COMM_WORLD, grid, &x); #endif /* Indicate that the vector coefficients are ready to be set */ #ifdef HYPRE_FORTRAN HYPRE_StructVectorInitialize(&b); HYPRE_StructVectorInitialize(&x); #else HYPRE_StructVectorInitialize(b); HYPRE_StructVectorInitialize(x); #endif /* Set the vector coefficients */ if (myid == 0) { HYPRE_Int ilower[2] = {-3, 1}, iupper[2] = {-1, 2}; HYPRE_Real values[6]; /* 6 grid points */ for (i = 0; i < 6; i ++) { values[i] = 1.0; } #ifdef HYPRE_FORTRAN HYPRE_StructVectorSetBoxValues(&b, &ilower[0], &iupper[0], &values[0]); #else HYPRE_StructVectorSetBoxValues(b, ilower, iupper, values); #endif for (i = 0; i < 6; i ++) { values[i] = 0.0; } #ifdef HYPRE_FORTRAN HYPRE_StructVectorSetBoxValues(&x, &ilower[0], &iupper[0], &values[0]); #else HYPRE_StructVectorSetBoxValues(x, ilower, iupper, values); #endif } else if (myid == 1) { HYPRE_Int ilower[2] = {0, 1}, iupper[2] = {2, 4}; HYPRE_Real values[12]; /* 12 grid points */ for (i = 0; i < 12; i ++) { values[i] = 1.0; } #ifdef HYPRE_FORTRAN HYPRE_StructVectorSetBoxValues(&b, &ilower[0], &iupper[0], &values[0]); #else HYPRE_StructVectorSetBoxValues(b, ilower, iupper, values); #endif for (i = 0; i < 12; i ++) { values[i] = 0.0; } #ifdef HYPRE_FORTRAN HYPRE_StructVectorSetBoxValues(&x, &ilower[0], &iupper[0], &values[0]); #else HYPRE_StructVectorSetBoxValues(x, ilower, iupper, values); #endif } /* This is a collective call finalizing the vector assembly. The vectors are now ``ready to be used'' */ #ifdef HYPRE_FORTRAN HYPRE_StructVectorAssemble(&b); HYPRE_StructVectorAssemble(&x); #else HYPRE_StructVectorAssemble(b); HYPRE_StructVectorAssemble(x); #endif } /* 5. Set up and use a solver (See the Reference Manual for descriptions of all of the options.) */ { /* Create an empty PCG Struct solver */ #ifdef HYPRE_FORTRAN HYPRE_StructPCGCreate(&temp_COMM, &solver); #else HYPRE_StructPCGCreate(hypre_MPI_COMM_WORLD, &solver); #endif /* Set some parameters */ #ifdef HYPRE_FORTRAN HYPRE_StructPCGSetTol(&solver, &tol); /* convergence tolerance */ HYPRE_StructPCGSetPrintLevel(&solver, &two); /* amount of info. printed */ #else HYPRE_StructPCGSetTol(solver, 1.0e-06); /* convergence tolerance */ HYPRE_StructPCGSetPrintLevel(solver, 2); /* amount of info. printed */ #endif /* Setup and solve */ #ifdef HYPRE_FORTRAN HYPRE_StructPCGSetup(&solver, &A, &b, &x); HYPRE_StructPCGSolve(&solver, &A, &b, &x); #else HYPRE_StructPCGSetup(solver, A, b, x); HYPRE_StructPCGSolve(solver, A, b, x); #endif } /* Free memory */ #ifdef HYPRE_FORTRAN HYPRE_StructGridDestroy(&grid); HYPRE_StructStencilDestroy(&stencil); HYPRE_StructMatrixDestroy(&A); HYPRE_StructVectorDestroy(&b); HYPRE_StructVectorDestroy(&x); HYPRE_StructPCGDestroy(&solver); #else HYPRE_StructGridDestroy(grid); HYPRE_StructStencilDestroy(stencil); HYPRE_StructMatrixDestroy(A); HYPRE_StructVectorDestroy(b); HYPRE_StructVectorDestroy(x); HYPRE_StructPCGDestroy(solver); #endif /* Finalize MPI */ hypre_MPI_Finalize(); return (0); } hypre-2.33.0/src/test/ex3_for.c000066400000000000000000000470771477326011500162320ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /* Example 3 Interface: Structured interface (Struct) Compile with: make ex3 Sample run: mpirun -np 16 ex3 -n 33 -solver 0 -v 1 1 To see options: ex3 -help Description: This code solves a system corresponding to a discretization of the Laplace equation with zero boundary conditions on the unit square. The domain is split into an N x N processor grid. Thus, the given number of processors should be a perfect square. Each processor's piece of the grid has n x n cells with n x n nodes connected by the standard 5-point stencil. Note that the struct interface assumes a cell-centered grid, and, therefore, the nodes are not shared. This example demonstrates more features than the previous two struct examples (Example 1 and Example 2). Two solvers are available. To incorporate the boundary conditions, we do the following: Let x_i and x_b be the interior and boundary parts of the solution vector x. We can split the matrix A as A = [A_ii A_ib; A_bi A_bb]. Let u_0 be the Dirichlet B.C. We can simply say that x_b = u_0. If b_i is the right-hand side, then we just need to solve in the interior: A_ii x_i = b_i - A_ib u_0. For this partitcular example, u_0 = 0, so we are just solving A_ii x_i = b_i. We recommend viewing examples 1 and 2 before viewing this example. */ #include #include "_hypre_utilities.h" #include "HYPRE_struct_ls.h" #ifdef HYPRE_FORTRAN #include "HYPRE_config.h" #include "fortran.h" #include "hypre_struct_fortran_test.h" #endif HYPRE_Int main (HYPRE_Int argc, char *argv[]) { HYPRE_Int i, j; HYPRE_Int myid, num_procs; HYPRE_Int n, N, pi, pj; HYPRE_Real h, h2; HYPRE_Int ilower[2], iupper[2]; HYPRE_Int solver_id; HYPRE_Int n_pre, n_post; #ifdef HYPRE_FORTRAN hypre_F90_Obj grid; hypre_F90_Obj stencil; hypre_F90_Obj A; hypre_F90_Obj b; hypre_F90_Obj x; hypre_F90_Obj solver; hypre_F90_Obj precond; HYPRE_Int temp_COMM; HYPRE_Int precond_id; HYPRE_Int zero = 0; HYPRE_Int one = 1; HYPRE_Int two = 2; HYPRE_Int five = 5; HYPRE_Int fifty = 50; HYPRE_Real zero_dot = 0.0; HYPRE_Real tol = 1.e-6; #else HYPRE_StructGrid grid; HYPRE_StructStencil stencil; HYPRE_StructMatrix A; HYPRE_StructVector b; HYPRE_StructVector x; HYPRE_StructSolver solver; HYPRE_StructSolver precond; #endif HYPRE_Int num_iterations; HYPRE_Real final_res_norm; HYPRE_Int print_solution; /* Initialize MPI */ hypre_MPI_Init(&argc, &argv); hypre_MPI_Comm_rank(hypre_MPI_COMM_WORLD, &myid); hypre_MPI_Comm_size(hypre_MPI_COMM_WORLD, &num_procs); /* Set defaults */ n = 33; solver_id = 0; n_pre = 1; n_post = 1; print_solution = 0; /* Parse command line */ { HYPRE_Int arg_index = 0; HYPRE_Int print_usage = 0; while (arg_index < argc) { if ( strcmp(argv[arg_index], "-n") == 0 ) { arg_index++; n = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-solver") == 0 ) { arg_index++; solver_id = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-v") == 0 ) { arg_index++; n_pre = atoi(argv[arg_index++]); n_post = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-print_solution") == 0 ) { arg_index++; print_solution = 1; } else if ( strcmp(argv[arg_index], "-help") == 0 ) { print_usage = 1; break; } else { arg_index++; } } if ((print_usage) && (myid == 0)) { hypre_printf("\n"); hypre_printf("Usage: %s []\n", argv[0]); hypre_printf("\n"); hypre_printf(" -n : problem size per procesor (default: 8)\n"); hypre_printf(" -solver : solver ID\n"); hypre_printf(" 0 - PCG with SMG precond (default)\n"); hypre_printf(" 1 - SMG\n"); hypre_printf(" -v : number of pre and post relaxations (default: 1 1)\n"); hypre_printf(" -print_solution : print the solution vector\n"); hypre_printf("\n"); } if (print_usage) { hypre_MPI_Finalize(); return (0); } } /* Figure out the processor grid (N x N). The local problem size for the interior nodes is indicated by n (n x n). pi and pj indicate position in the processor grid. */ N = hypre_sqrt(num_procs); h = 1.0 / (N * n + 1); /* note that when calculating h we must remember to count the bounday nodes */ h2 = h * h; pj = myid / N; pi = myid - pj * N; /* Figure out the extents of each processor's piece of the grid. */ ilower[0] = pi * n; ilower[1] = pj * n; iupper[0] = ilower[0] + n - 1; iupper[1] = ilower[1] + n - 1; /* 1. Set up a grid */ { #ifdef HYPRE_FORTRAN temp_COMM = (HYPRE_Int) hypre_MPI_COMM_WORLD; /* Create an empty 2D grid object */ HYPRE_StructGridCreate(&temp_COMM, &two, &grid); /* Add a new box to the grid */ HYPRE_StructGridSetExtents(&grid, &ilower[0], &iupper[0]); /* This is a collective call finalizing the grid assembly. The grid is now ``ready to be used'' */ HYPRE_StructGridAssemble(&grid); #else /* Create an empty 2D grid object */ HYPRE_StructGridCreate(hypre_MPI_COMM_WORLD, 2, &grid); /* Add a new box to the grid */ HYPRE_StructGridSetExtents(grid, ilower, iupper); /* This is a collective call finalizing the grid assembly. The grid is now ``ready to be used'' */ HYPRE_StructGridAssemble(grid); #endif } /* 2. Define the discretization stencil */ { #ifdef HYPRE_FORTRAN /* Create an empty 2D, 5-pt stencil object */ HYPRE_StructStencilCreate(&two, &five, &stencil); /* Define the geometry of the stencil */ { HYPRE_Int entry; HYPRE_Int offsets[5][2] = {{0, 0}, {-1, 0}, {1, 0}, {0, -1}, {0, 1}}; for (entry = 0; entry < 5; entry++) { HYPRE_StructStencilSetElement(&stencil, &entry, offsets[entry]); } } #else /* Create an empty 2D, 5-pt stencil object */ HYPRE_StructStencilCreate(2, 5, &stencil); /* Define the geometry of the stencil */ { HYPRE_Int entry; HYPRE_Int offsets[5][2] = {{0, 0}, {-1, 0}, {1, 0}, {0, -1}, {0, 1}}; for (entry = 0; entry < 5; entry++) { HYPRE_StructStencilSetElement(stencil, entry, offsets[entry]); } } #endif } /* 3. Set up a Struct Matrix */ { HYPRE_Int nentries = 5; HYPRE_Int nvalues = nentries * n * n; HYPRE_Real *values; HYPRE_Int stencil_indices[5]; #ifdef HYPRE_FORTRAN temp_COMM = (HYPRE_Int) hypre_MPI_COMM_WORLD; /* Create an empty matrix object */ HYPRE_StructMatrixCreate(&temp_COMM, &grid, &stencil, &A); /* Indicate that the matrix coefficients are ready to be set */ HYPRE_StructMatrixInitialize(&A); values = hypre_CTAlloc(HYPRE_Real, nvalues, HYPRE_MEMORY_HOST); for (j = 0; j < nentries; j++) { stencil_indices[j] = j; } /* Set the standard stencil at each grid point, we will fix the boundaries later */ for (i = 0; i < nvalues; i += nentries) { values[i] = 4.0; for (j = 1; j < nentries; j++) { values[i + j] = -1.0; } } HYPRE_StructMatrixSetBoxValues(&A, ilower, iupper, &nentries, stencil_indices, values); hypre_TFree(values, HYPRE_MEMORY_HOST); #else /* Create an empty matrix object */ HYPRE_StructMatrixCreate(hypre_MPI_COMM_WORLD, grid, stencil, &A); /* Indicate that the matrix coefficients are ready to be set */ HYPRE_StructMatrixInitialize(A); values = hypre_CTAlloc(HYPRE_Real, nvalues, HYPRE_MEMORY_HOST); for (j = 0; j < nentries; j++) { stencil_indices[j] = j; } /* Set the standard stencil at each grid point, we will fix the boundaries later */ for (i = 0; i < nvalues; i += nentries) { values[i] = 4.0; for (j = 1; j < nentries; j++) { values[i + j] = -1.0; } } HYPRE_StructMatrixSetBoxValues(A, ilower, iupper, nentries, stencil_indices, values); hypre_TFree(values, HYPRE_MEMORY_HOST); #endif } /* 4. Incorporate the zero boundary conditions: go along each edge of the domain and set the stencil entry that reaches to the boundary to zero.*/ { HYPRE_Int bc_ilower[2]; HYPRE_Int bc_iupper[2]; HYPRE_Int nentries = 1; HYPRE_Int nvalues = nentries * n; /* number of stencil entries times the length of one side of my grid box */ HYPRE_Real *values; HYPRE_Int stencil_indices[1]; values = hypre_CTAlloc(HYPRE_Real, nvalues, HYPRE_MEMORY_HOST); for (j = 0; j < nvalues; j++) { values[j] = 0.0; } /* Recall: pi and pj describe position in the processor grid */ if (pj == 0) { /* bottom row of grid points */ bc_ilower[0] = pi * n; bc_ilower[1] = pj * n; bc_iupper[0] = bc_ilower[0] + n - 1; bc_iupper[1] = bc_ilower[1]; stencil_indices[0] = 3; #ifdef HYPRE_FORTRAN HYPRE_StructMatrixSetBoxValues(&A, bc_ilower, bc_iupper, &nentries, stencil_indices, values); #else HYPRE_StructMatrixSetBoxValues(A, bc_ilower, bc_iupper, nentries, stencil_indices, values); #endif } if (pj == N - 1) { /* upper row of grid points */ bc_ilower[0] = pi * n; bc_ilower[1] = pj * n + n - 1; bc_iupper[0] = bc_ilower[0] + n - 1; bc_iupper[1] = bc_ilower[1]; stencil_indices[0] = 4; #ifdef HYPRE_FORTRAN HYPRE_StructMatrixSetBoxValues(&A, bc_ilower, bc_iupper, &nentries, stencil_indices, values); #else HYPRE_StructMatrixSetBoxValues(A, bc_ilower, bc_iupper, nentries, stencil_indices, values); #endif } if (pi == 0) { /* left row of grid points */ bc_ilower[0] = pi * n; bc_ilower[1] = pj * n; bc_iupper[0] = bc_ilower[0]; bc_iupper[1] = bc_ilower[1] + n - 1; stencil_indices[0] = 1; #ifdef HYPRE_FORTRAN HYPRE_StructMatrixSetBoxValues(&A, bc_ilower, bc_iupper, &nentries, stencil_indices, values); #else HYPRE_StructMatrixSetBoxValues(A, bc_ilower, bc_iupper, nentries, stencil_indices, values); #endif } if (pi == N - 1) { /* right row of grid points */ bc_ilower[0] = pi * n + n - 1; bc_ilower[1] = pj * n; bc_iupper[0] = bc_ilower[0]; bc_iupper[1] = bc_ilower[1] + n - 1; stencil_indices[0] = 2; #ifdef HYPRE_FORTRAN HYPRE_StructMatrixSetBoxValues(&A, bc_ilower, bc_iupper, &nentries, stencil_indices, values); #else HYPRE_StructMatrixSetBoxValues(A, bc_ilower, bc_iupper, nentries, stencil_indices, values); #endif } hypre_TFree(values, HYPRE_MEMORY_HOST); } /* This is a collective call finalizing the matrix assembly. The matrix is now ``ready to be used'' */ #ifdef HYPRE_FORTRAN HYPRE_StructMatrixAssemble(&A); #else HYPRE_StructMatrixAssemble(A); #endif /* 5. Set up Struct Vectors for b and x */ { HYPRE_Int nvalues = n * n; HYPRE_Real *values; values = hypre_CTAlloc(HYPRE_Real, nvalues, HYPRE_MEMORY_HOST); /* Create an empty vector object */ #ifdef HYPRE_FORTRAN temp_COMM = (HYPRE_Int) hypre_MPI_COMM_WORLD; HYPRE_StructVectorCreate(&temp_COMM, &grid, &b); HYPRE_StructVectorCreate(&temp_COMM, &grid, &x); #else HYPRE_StructVectorCreate(hypre_MPI_COMM_WORLD, grid, &b); HYPRE_StructVectorCreate(hypre_MPI_COMM_WORLD, grid, &x); #endif /* Indicate that the vector coefficients are ready to be set */ #ifdef HYPRE_FORTRAN HYPRE_StructVectorInitialize(&b); HYPRE_StructVectorInitialize(&x); #else HYPRE_StructVectorInitialize(b); HYPRE_StructVectorInitialize(x); #endif /* Set the values */ for (i = 0; i < nvalues; i ++) { values[i] = h2; } #ifdef HYPRE_FORTRAN HYPRE_StructVectorSetBoxValues(&b, ilower, iupper, values); #else HYPRE_StructVectorSetBoxValues(b, ilower, iupper, values); #endif for (i = 0; i < nvalues; i ++) { values[i] = 0.0; } #ifdef HYPRE_FORTRAN HYPRE_StructVectorSetBoxValues(&x, ilower, iupper, values); #else HYPRE_StructVectorSetBoxValues(x, ilower, iupper, values); #endif hypre_TFree(values, HYPRE_MEMORY_HOST); /* This is a collective call finalizing the vector assembly. The vector is now ``ready to be used'' */ #ifdef HYPRE_FORTRAN HYPRE_StructVectorAssemble(&b); HYPRE_StructVectorAssemble(&x); #else HYPRE_StructVectorAssemble(b); HYPRE_StructVectorAssemble(x); #endif } /* 6. Set up and use a struct solver (Solver options can be found in the Reference Manual.) */ if (solver_id == 0) { #ifdef HYPRE_FORTRAN temp_COMM = (HYPRE_Int) hypre_MPI_COMM_WORLD; HYPRE_StructPCGCreate(&temp_COMM, &solver); HYPRE_StructPCGSetMaxIter(&solver, &fifty ); HYPRE_StructPCGSetTol(&solver, &tol ); HYPRE_StructPCGSetTwoNorm(&solver, &one ); HYPRE_StructPCGSetRelChange(&solver, &zero ); HYPRE_StructPCGSetPrintLevel(&solver, &two ); /* print each CG iteration */ HYPRE_StructPCGSetLogging(&solver, &one); /* Use symmetric SMG as preconditioner */ HYPRE_StructSMGCreate(&temp_COMM, &precond); HYPRE_StructSMGSetMemoryUse(&precond, &zero); HYPRE_StructSMGSetMaxIter(&precond, &one); HYPRE_StructSMGSetTol(&precond, &zero_dot); HYPRE_StructSMGSetZeroGuess(&precond); HYPRE_StructSMGSetNumPreRelax(&precond, &one); HYPRE_StructSMGSetNumPostRelax(&precond, &one); /* Set the preconditioner and solve */ precond_id = 0; HYPRE_StructPCGSetPrecond(&solver, &precond_id, &precond); HYPRE_StructPCGSetup(&solver, &A, &b, &x); HYPRE_StructPCGSolve(&solver, &A, &b, &x); /* Get some info on the run */ HYPRE_StructPCGGetNumIterations(&solver, &num_iterations); HYPRE_StructPCGGetFinalRelativeResidualNorm(&solver, &final_res_norm); /* Clean up */ HYPRE_StructPCGDestroy(&solver); #else HYPRE_StructPCGCreate(hypre_MPI_COMM_WORLD, &solver); HYPRE_StructPCGSetMaxIter(solver, 50 ); HYPRE_StructPCGSetTol(solver, 1.0e-06 ); HYPRE_StructPCGSetTwoNorm(solver, 1 ); HYPRE_StructPCGSetRelChange(solver, 0 ); HYPRE_StructPCGSetPrintLevel(solver, 2 ); /* print each CG iteration */ HYPRE_StructPCGSetLogging(solver, 1); /* Use symmetric SMG as preconditioner */ HYPRE_StructSMGCreate(hypre_MPI_COMM_WORLD, &precond); HYPRE_StructSMGSetMemoryUse(precond, 0); HYPRE_StructSMGSetMaxIter(precond, 1); HYPRE_StructSMGSetTol(precond, 0.0); HYPRE_StructSMGSetZeroGuess(precond); HYPRE_StructSMGSetNumPreRelax(precond, 1); HYPRE_StructSMGSetNumPostRelax(precond, 1); /* Set the preconditioner and solve */ HYPRE_StructPCGSetPrecond(solver, HYPRE_StructSMGSolve, HYPRE_StructSMGSetup, precond); HYPRE_StructPCGSetup(solver, A, b, x); HYPRE_StructPCGSolve(solver, A, b, x); /* Get some info on the run */ HYPRE_StructPCGGetNumIterations(solver, &num_iterations); HYPRE_StructPCGGetFinalRelativeResidualNorm(solver, &final_res_norm); /* Clean up */ HYPRE_StructPCGDestroy(solver); #endif } if (solver_id == 1) { #ifdef HYPRE_FORTRAN temp_COMM = (HYPRE_Int) hypre_MPI_COMM_WORLD; HYPRE_StructSMGCreate(&temp_COMM, &solver); HYPRE_StructSMGSetMemoryUse(&solver, &zero); HYPRE_StructSMGSetMaxIter(&solver, &fifty); HYPRE_StructSMGSetTol(&solver, &tol); HYPRE_StructSMGSetRelChange(&solver, &zero); HYPRE_StructSMGSetNumPreRelax(&solver, &n_pre); HYPRE_StructSMGSetNumPostRelax(&solver, &n_post); /* Logging must be on to get iterations and residual norm info below */ HYPRE_StructSMGSetLogging(&solver, &one); /* Setup and solve */ HYPRE_StructSMGSetup(&solver, &A, &b, &x); HYPRE_StructSMGSolve(&solver, &A, &b, &x); /* Get some info on the run */ HYPRE_StructSMGGetNumIterations(&solver, &num_iterations); HYPRE_StructSMGGetFinalRelativeResidualNorm(&solver, &final_res_norm); /* Clean up */ HYPRE_StructSMGDestroy(&solver); #else HYPRE_StructSMGCreate(hypre_MPI_COMM_WORLD, &solver); HYPRE_StructSMGSetMemoryUse(solver, 0); HYPRE_StructSMGSetMaxIter(solver, 50); HYPRE_StructSMGSetTol(solver, 1.0e-06); HYPRE_StructSMGSetRelChange(solver, 0); HYPRE_StructSMGSetNumPreRelax(solver, n_pre); HYPRE_StructSMGSetNumPostRelax(solver, n_post); /* Logging must be on to get iterations and residual norm info below */ HYPRE_StructSMGSetLogging(solver, 1); /* Setup and solve */ HYPRE_StructSMGSetup(solver, A, b, x); HYPRE_StructSMGSolve(solver, A, b, x); /* Get some info on the run */ HYPRE_StructSMGGetNumIterations(solver, &num_iterations); HYPRE_StructSMGGetFinalRelativeResidualNorm(solver, &final_res_norm); /* Clean up */ HYPRE_StructSMGDestroy(solver); #endif } /* Print the solution and other info */ #ifdef HYPRE_FORTRAN if (print_solution) { HYPRE_StructVectorPrint(&x, &zero); } #else if (print_solution) { HYPRE_StructVectorPrint("struct.out.x", x, 0); } #endif if (myid == 0) { hypre_printf("\n"); hypre_printf("Iterations = %d\n", num_iterations); hypre_printf("Final Relative Residual Norm = %g\n", final_res_norm); hypre_printf("\n"); } /* Free memory */ #ifdef HYPRE_FORTRAN HYPRE_StructGridDestroy(&grid); HYPRE_StructStencilDestroy(&stencil); HYPRE_StructMatrixDestroy(&A); HYPRE_StructVectorDestroy(&b); HYPRE_StructVectorDestroy(&x); #else HYPRE_StructGridDestroy(grid); HYPRE_StructStencilDestroy(stencil); HYPRE_StructMatrixDestroy(A); HYPRE_StructVectorDestroy(b); HYPRE_StructVectorDestroy(x); #endif /* Finalize MPI */ hypre_MPI_Finalize(); return (0); } hypre-2.33.0/src/test/ex5_for.c000066400000000000000000000516431477326011500162260ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /* Example 5 Interface: Linear-Algebraic (IJ) Compile with: make ex5 Sample run: mpirun -np 4 ex5 Description: This example solves the 2-D Laplacian problem with zero boundary conditions on an nxn grid. The number of unknowns is N=n^2. The standard 5-point stencil is used, and we solve for the interior nodes only. This example solves the same problem as Example 3. Available solvers are AMG, PCG, and PCG with AMG or Parasails preconditioners. */ #include #include "_hypre_utilities.h" #include "HYPRE_krylov.h" #include "HYPRE.h" #include "HYPRE_parcsr_ls.h" #ifdef HYPRE_FORTRAN #include "fortran.h" #include "hypre_ij_fortran_test.h" #include "hypre_parcsr_fortran_test.h" #endif HYPRE_Int main (HYPRE_Int argc, char *argv[]) { HYPRE_Int i; HYPRE_Int myid, num_procs; HYPRE_Int N, n; HYPRE_Int ilower, iupper; HYPRE_Int local_size, extra; HYPRE_Int solver_id; HYPRE_Int print_solution; HYPRE_Real h, h2; #ifdef HYPRE_FORTRAN hypre_F90_Obj A; hypre_F90_Obj parcsr_A; hypre_F90_Obj b; hypre_F90_Obj par_b; hypre_F90_Obj x; hypre_F90_Obj par_x; hypre_F90_Obj solver, precond; hypre_F90_Obj long_temp_COMM; HYPRE_Int temp_COMM; HYPRE_Int precond_id; HYPRE_Int one = 1; HYPRE_Int two = 2; HYPRE_Int three = 3; HYPRE_Int six = 6; HYPRE_Int twenty = 20; HYPRE_Int thousand = 1000; HYPRE_Int hypre_type = HYPRE_PARCSR; HYPRE_Real oo1 = 1.e-3; HYPRE_Real tol = 1.e-7; #else HYPRE_IJMatrix A; HYPRE_ParCSRMatrix parcsr_A; HYPRE_IJVector b; HYPRE_ParVector par_b; HYPRE_IJVector x; HYPRE_ParVector par_x; HYPRE_Solver solver, precond; #endif /* Initialize MPI */ hypre_MPI_Init(&argc, &argv); hypre_MPI_Comm_rank(hypre_MPI_COMM_WORLD, &myid); hypre_MPI_Comm_size(hypre_MPI_COMM_WORLD, &num_procs); /* Default problem parameters */ n = 33; solver_id = 0; print_solution = 0; /* Parse command line */ { HYPRE_Int arg_index = 0; HYPRE_Int print_usage = 0; while (arg_index < argc) { if ( strcmp(argv[arg_index], "-n") == 0 ) { arg_index++; n = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-solver") == 0 ) { arg_index++; solver_id = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-print_solution") == 0 ) { arg_index++; print_solution = 1; } else if ( strcmp(argv[arg_index], "-help") == 0 ) { print_usage = 1; break; } else { arg_index++; } } if ((print_usage) && (myid == 0)) { hypre_printf("\n"); hypre_printf("Usage: %s []\n", argv[0]); hypre_printf("\n"); hypre_printf(" -n : problem size in each direction (default: 33)\n"); hypre_printf(" -solver : solver ID\n"); hypre_printf(" 0 - AMG (default) \n"); hypre_printf(" 1 - AMG-PCG\n"); hypre_printf(" 8 - ParaSails-PCG\n"); hypre_printf(" 50 - PCG\n"); hypre_printf(" -print_solution : print the solution vector\n"); hypre_printf("\n"); } if (print_usage) { hypre_MPI_Finalize(); return (0); } } /* Preliminaries: want at least one processor per row */ if (n * n < num_procs) { n = hypre_sqrt(num_procs) + 1; } N = n * n; /* global number of rows */ h = 1.0 / (n + 1); /* mesh size*/ h2 = h * h; /* Each processor knows only of its own rows - the range is denoted by ilower and upper. Here we partition the rows. We account for the fact that N may not divide evenly by the number of processors. */ local_size = N / num_procs; extra = N - local_size * num_procs; ilower = local_size * myid; ilower += hypre_min(myid, extra); iupper = local_size * (myid + 1); iupper += hypre_min(myid + 1, extra); iupper = iupper - 1; /* How many rows do I have? */ local_size = iupper - ilower + 1; /* Create the matrix. Note that this is a square matrix, so we indicate the row partition size twice (since number of rows = number of cols) */ #ifdef HYPRE_FORTRAN long_temp_COMM = (hypre_F90_Obj) hypre_MPI_COMM_WORLD; temp_COMM = (HYPRE_Int) hypre_MPI_COMM_WORLD; HYPRE_IJMatrixCreate(&long_temp_COMM, &ilower, &iupper, &ilower, &iupper, &A); #else HYPRE_IJMatrixCreate(hypre_MPI_COMM_WORLD, ilower, iupper, ilower, iupper, &A); #endif /* Choose a parallel csr format storage (see the User's Manual) */ #ifdef HYPRE_FORTRAN HYPRE_IJMatrixSetObjectType(&A, &hypre_type); #else HYPRE_IJMatrixSetObjectType(A, HYPRE_PARCSR); #endif /* Initialize before setting coefficients */ #ifdef HYPRE_FORTRAN HYPRE_IJMatrixInitialize(&A); #else HYPRE_IJMatrixInitialize(A); #endif /* Now go through my local rows and set the matrix entries. Each row has at most 5 entries. For example, if n=3: A = [M -I 0; -I M -I; 0 -I M] M = [4 -1 0; -1 4 -1; 0 -1 4] Note that here we are setting one row at a time, though one could set all the rows together (see the User's Manual). */ { HYPRE_Int nnz; HYPRE_Real values[5]; HYPRE_Int cols[5]; for (i = ilower; i <= iupper; i++) { nnz = 0; /* The left identity block:position i-n */ if ((i - n) >= 0) { cols[nnz] = i - n; values[nnz] = -1.0; nnz++; } /* The left -1: position i-1 */ if (i % n) { cols[nnz] = i - 1; values[nnz] = -1.0; nnz++; } /* Set the diagonal: position i */ cols[nnz] = i; values[nnz] = 4.0; nnz++; /* The right -1: position i+1 */ if ((i + 1) % n) { cols[nnz] = i + 1; values[nnz] = -1.0; nnz++; } /* The right identity block:position i+n */ if ((i + n) < N) { cols[nnz] = i + n; values[nnz] = -1.0; nnz++; } /* Set the values for row i */ #ifdef HYPRE_FORTRAN HYPRE_IJMatrixSetValues(&A, &one, &nnz, &i, &cols[0], &values[0]); #else HYPRE_IJMatrixSetValues(A, 1, &nnz, &i, cols, values); #endif } } /* Assemble after setting the coefficients */ #ifdef HYPRE_FORTRAN HYPRE_IJMatrixAssemble(&A); #else HYPRE_IJMatrixAssemble(A); #endif /* Get the parcsr matrix object to use */ #ifdef HYPRE_FORTRAN HYPRE_IJMatrixGetObject(&A, &parcsr_A); HYPRE_IJMatrixGetObject(&A, &parcsr_A); #else HYPRE_IJMatrixGetObject(A, (void**) &parcsr_A); HYPRE_IJMatrixGetObject(A, (void**) &parcsr_A); #endif /* Create the rhs and solution */ #ifdef HYPRE_FORTRAN HYPRE_IJVectorCreate(&temp_COMM, &ilower, &iupper, &b); HYPRE_IJVectorSetObjectType(&b, &hypre_type); HYPRE_IJVectorInitialize(&b); #else HYPRE_IJVectorCreate(hypre_MPI_COMM_WORLD, ilower, iupper, &b); HYPRE_IJVectorSetObjectType(b, HYPRE_PARCSR); HYPRE_IJVectorInitialize(b); #endif #ifdef HYPRE_FORTRAN HYPRE_IJVectorCreate(&temp_COMM, &ilower, &iupper, &x); HYPRE_IJVectorSetObjectType(&x, &hypre_type); HYPRE_IJVectorInitialize(&x); #else HYPRE_IJVectorCreate(hypre_MPI_COMM_WORLD, ilower, iupper, &x); HYPRE_IJVectorSetObjectType(x, HYPRE_PARCSR); HYPRE_IJVectorInitialize(x); #endif /* Set the rhs values to h^2 and the solution to zero */ { HYPRE_Real *rhs_values, *x_values; HYPRE_Int *rows; rhs_values = hypre_CTAlloc(HYPRE_Real, local_size, HYPRE_MEMORY_HOST); x_values = hypre_CTAlloc(HYPRE_Real, local_size, HYPRE_MEMORY_HOST); rows = hypre_CTAlloc(HYPRE_Int, local_size, HYPRE_MEMORY_HOST); for (i = 0; i < local_size; i++) { rhs_values[i] = h2; x_values[i] = 0.0; rows[i] = ilower + i; } #ifdef HYPRE_FORTRAN HYPRE_IJVectorSetValues(&b, &local_size, &rows[0], &rhs_values[0]); HYPRE_IJVectorSetValues(&x, &local_size, &rows[0], &x_values[0]); #else HYPRE_IJVectorSetValues(b, local_size, rows, rhs_values); HYPRE_IJVectorSetValues(x, local_size, rows, x_values); #endif hypre_TFree(x_values, HYPRE_MEMORY_HOST); hypre_TFree(rhs_values, HYPRE_MEMORY_HOST); hypre_TFree(rows, HYPRE_MEMORY_HOST); } #ifdef HYPRE_FORTRAN HYPRE_IJVectorAssemble(&b); HYPRE_IJVectorGetObject(&b, &par_b); #else HYPRE_IJVectorAssemble(b); HYPRE_IJVectorGetObject(b, (void **) &par_b); #endif #ifdef HYPRE_FORTRAN HYPRE_IJVectorAssemble(&x); HYPRE_IJVectorGetObject(&x, &par_x); #else HYPRE_IJVectorAssemble(x); HYPRE_IJVectorGetObject(x, (void **) &par_x); #endif /* Choose a solver and solve the system */ /* AMG */ if (solver_id == 0) { HYPRE_Int num_iterations; HYPRE_Real final_res_norm; /* Create solver */ #ifdef HYPRE_FORTRAN HYPRE_BoomerAMGCreate(&solver); #else HYPRE_BoomerAMGCreate(&solver); #endif /* Set some parameters (See Reference Manual for more parameters) */ #ifdef HYPRE_FORTRAN HYPRE_BoomerAMGSetPrintLevel(&solver, &three); /* print solve info + parameters */ HYPRE_BoomerAMGSetCoarsenType(&solver, &six); /* Falgout coarsening */ HYPRE_BoomerAMGSetRelaxType(&solver, &three); /* G-S/Jacobi hybrid relaxation */ HYPRE_BoomerAMGSetNumSweeps(&solver, &one); /* Sweeeps on each level */ HYPRE_BoomerAMGSetMaxLevels(&solver, &twenty); /* maximum number of levels */ HYPRE_BoomerAMGSetTol(&solver, &tol); /* conv. tolerance */ #else HYPRE_BoomerAMGSetPrintLevel(solver, 3); /* print solve info + parameters */ HYPRE_BoomerAMGSetCoarsenType(solver, 6); /* Falgout coarsening */ HYPRE_BoomerAMGSetRelaxType(solver, 3); /* G-S/Jacobi hybrid relaxation */ HYPRE_BoomerAMGSetNumSweeps(solver, 1); /* Sweeeps on each level */ HYPRE_BoomerAMGSetMaxLevels(solver, 20); /* maximum number of levels */ HYPRE_BoomerAMGSetTol(solver, 1e-7); /* conv. tolerance */ #endif /* Now setup and solve! */ #ifdef HYPRE_FORTRAN HYPRE_BoomerAMGSetup(&solver, &parcsr_A, &par_b, &par_x); HYPRE_BoomerAMGSolve(&solver, &parcsr_A, &par_b, &par_x); #else HYPRE_BoomerAMGSetup(solver, parcsr_A, par_b, par_x); HYPRE_BoomerAMGSolve(solver, parcsr_A, par_b, par_x); #endif /* Run info - needed logging turned on */ #ifdef HYPRE_FORTRAN HYPRE_BoomerAMGGetNumIterations(&solver, &num_iterations); HYPRE_BoomerAMGGetFinalRelativeResidualNorm(&solver, &final_res_norm); #else HYPRE_BoomerAMGGetNumIterations(solver, &num_iterations); HYPRE_BoomerAMGGetFinalRelativeResidualNorm(solver, &final_res_norm); #endif if (myid == 0) { hypre_printf("\n"); hypre_printf("Iterations = %d\n", num_iterations); hypre_printf("Final Relative Residual Norm = %e\n", final_res_norm); hypre_printf("\n"); } /* Destroy solver */ #ifdef HYPRE_FORTRAN HYPRE_BoomerAMGDestroy(&solver); #else HYPRE_BoomerAMGDestroy(solver); #endif } /* PCG */ else if (solver_id == 50) { HYPRE_Int num_iterations; HYPRE_Real final_res_norm; /* Create solver */ #ifdef HYPRE_FORTRAN HYPRE_ParCSRPCGCreate(&temp_COMM, &solver); #else HYPRE_ParCSRPCGCreate(hypre_MPI_COMM_WORLD, &solver); #endif /* Set some parameters (See Reference Manual for more parameters) */ #ifdef HYPRE_FORTRAN HYPRE_ParCSRPCGSetMaxIter(&solver, &thousand); /* max iterations */ HYPRE_ParCSRPCGSetTol(&solver, &tol); /* conv. tolerance */ HYPRE_ParCSRPCGSetTwoNorm(&solver, &one); /* use the two norm as the stopping criteria */ HYPRE_ParCSRPCGSetPrintLevel(&solver, &two); /* prints out the iteration info */ #else HYPRE_PCGSetMaxIter(solver, 1000); /* max iterations */ HYPRE_PCGSetTol(solver, 1e-7); /* conv. tolerance */ HYPRE_PCGSetTwoNorm(solver, 1); /* use the two norm as the stopping criteria */ HYPRE_PCGSetPrintLevel(solver, 2); /* prints out the iteration info */ HYPRE_PCGSetLogging(solver, 1); /* needed to get run info later */ #endif /* Now setup and solve! */ #ifdef HYPRE_FORTRAN HYPRE_ParCSRPCGSetup(&solver, &parcsr_A, &par_b, &par_x); HYPRE_ParCSRPCGSolve(&solver, &parcsr_A, &par_b, &par_x); #else HYPRE_ParCSRPCGSetup(solver, parcsr_A, par_b, par_x); HYPRE_ParCSRPCGSolve(solver, parcsr_A, par_b, par_x); #endif /* Run info - needed logging turned on */ #ifdef HYPRE_FORTRAN HYPRE_ParCSRPCGGetNumIterations(&solver, &num_iterations); HYPRE_ParCSRPCGGetFinalRelativeResidualNorm(&solver, &final_res_norm); #else HYPRE_PCGGetNumIterations(solver, &num_iterations); HYPRE_PCGGetFinalRelativeResidualNorm(solver, &final_res_norm); #endif if (myid == 0) { hypre_printf("\n"); hypre_printf("Iterations = %d\n", num_iterations); hypre_printf("Final Relative Residual Norm = %e\n", final_res_norm); hypre_printf("\n"); } /* Destroy solver */ #ifdef HYPRE_FORTRAN HYPRE_ParCSRPCGDestroy(&solver); #else HYPRE_ParCSRPCGDestroy(solver); #endif } /* PCG with AMG preconditioner */ else if (solver_id == 1) { HYPRE_Int num_iterations; HYPRE_Real final_res_norm; /* Create solver */ #ifdef HYPRE_FORTRAN HYPRE_ParCSRPCGCreate(&temp_COMM, &solver); #else HYPRE_ParCSRPCGCreate(hypre_MPI_COMM_WORLD, &solver); #endif /* Set some parameters (See Reference Manual for more parameters) */ #ifdef HYPRE_FORTRAN HYPRE_ParCSRPCGSetMaxIter(&solver, &thousand); /* max iterations */ HYPRE_ParCSRPCGSetTol(&solver, &tol); /* conv. tolerance */ HYPRE_ParCSRPCGSetTwoNorm(&solver, &one); /* use the two norm as the stopping criteria */ HYPRE_ParCSRPCGSetPrintLevel(&solver, &two); /* print solve info */ #else HYPRE_PCGSetMaxIter(solver, 1000); /* max iterations */ HYPRE_PCGSetTol(solver, 1e-7); /* conv. tolerance */ HYPRE_PCGSetTwoNorm(solver, 1); /* use the two norm as the stopping criteria */ HYPRE_PCGSetPrintLevel(solver, 2); /* print solve info */ HYPRE_PCGSetLogging(solver, 1); /* needed to get run info later */ #endif /* Now set up the AMG preconditioner and specify any parameters */ #ifdef HYPRE_FORTRAN HYPRE_BoomerAMGCreate(&precond); HYPRE_BoomerAMGSetPrintLevel(&precond, &one); /* print amg solution info*/ HYPRE_BoomerAMGSetCoarsenType(&precond, &six); HYPRE_BoomerAMGSetRelaxType(&precond, &three); HYPRE_BoomerAMGSetNumSweeps(&precond, &one); HYPRE_BoomerAMGSetTol(&precond, &oo1); #else HYPRE_BoomerAMGCreate(&precond); HYPRE_BoomerAMGSetPrintLevel(precond, 1); /* print amg solution info*/ HYPRE_BoomerAMGSetCoarsenType(precond, 6); HYPRE_BoomerAMGSetRelaxType(precond, 3); HYPRE_BoomerAMGSetNumSweeps(precond, 1); HYPRE_BoomerAMGSetTol(precond, 1e-3); #endif /* Set the PCG preconditioner */ #ifdef HYPRE_FORTRAN precond_id = 2; HYPRE_ParCSRPCGSetPrecond(&solver, &precond_id, &precond); #else HYPRE_PCGSetPrecond(solver, (HYPRE_PtrToSolverFcn) HYPRE_BoomerAMGSolve, (HYPRE_PtrToSolverFcn) HYPRE_BoomerAMGSetup, precond); #endif /* Now setup and solve! */ #ifdef HYPRE_FORTRAN HYPRE_ParCSRPCGSetup(&solver, &parcsr_A, &par_b, &par_x); HYPRE_ParCSRPCGSolve(&solver, &parcsr_A, &par_b, &par_x); #else HYPRE_ParCSRPCGSetup(solver, parcsr_A, par_b, par_x); HYPRE_ParCSRPCGSolve(solver, parcsr_A, par_b, par_x); #endif /* Run info - needed logging turned on */ #ifdef HYPRE_FORTRAN HYPRE_ParCSRPCGGetNumIterations(&solver, &num_iterations); HYPRE_ParCSRPCGGetFinalRelativeResidualNorm(&solver, &final_res_norm); #else HYPRE_PCGGetNumIterations(solver, &num_iterations); HYPRE_PCGGetFinalRelativeResidualNorm(solver, &final_res_norm); #endif if (myid == 0) { hypre_printf("\n"); hypre_printf("Iterations = %d\n", num_iterations); hypre_printf("Final Relative Residual Norm = %e\n", final_res_norm); hypre_printf("\n"); } /* Destroy solver and preconditioner */ #ifdef HYPRE_FORTRAN HYPRE_ParCSRPCGDestroy(&solver); HYPRE_BoomerAMGDestroy(&precond); #else HYPRE_ParCSRPCGDestroy(solver); HYPRE_BoomerAMGDestroy(precond); #endif } /* PCG with Parasails Preconditioner */ else if (solver_id == 8) { HYPRE_Int num_iterations; HYPRE_Real final_res_norm; HYPRE_Int sai_max_levels = 1; HYPRE_Real sai_threshold = 0.1; HYPRE_Real sai_filter = 0.05; HYPRE_Int sai_sym = 1; /* Create solver */ #ifdef HYPRE_FORTRAN HYPRE_ParCSRPCGCreate(&temp_COMM, &solver); #else HYPRE_ParCSRPCGCreate(hypre_MPI_COMM_WORLD, &solver); #endif /* Set some parameters (See Reference Manual for more parameters) */ #ifdef HYPRE_FORTRAN HYPRE_ParCSRPCGSetMaxIter(&solver, &thousand); /* max iterations */ HYPRE_ParCSRPCGSetTol(&solver, &tol); /* conv. tolerance */ HYPRE_ParCSRPCGSetTwoNorm(&solver, &one); /* use the two norm as the stopping criteria */ HYPRE_ParCSRPCGSetPrintLevel(&solver, &two); /* print solve info */ #else HYPRE_PCGSetMaxIter(solver, 1000); /* max iterations */ HYPRE_PCGSetTol(solver, 1e-7); /* conv. tolerance */ HYPRE_PCGSetTwoNorm(solver, 1); /* use the two norm as the stopping criteria */ HYPRE_PCGSetPrintLevel(solver, 2); /* print solve info */ HYPRE_PCGSetLogging(solver, 1); /* needed to get run info later */ #endif /* Now set up the ParaSails preconditioner and specify any parameters */ #ifdef HYPRE_FORTRAN HYPRE_ParaSailsCreate(&temp_COMM, &precond); #else HYPRE_ParaSailsCreate(hypre_MPI_COMM_WORLD, &precond); #endif /* Set some parameters (See Reference Manual for more parameters) */ #ifdef HYPRE_FORTRAN HYPRE_ParaSailsSetParams(&precond, &sai_threshold, &sai_max_levels); HYPRE_ParaSailsSetFilter(&precond, &sai_filter); HYPRE_ParaSailsSetSym(&precond, &sai_sym); HYPRE_ParaSailsSetLogging(&precond, &three); #else HYPRE_ParaSailsSetParams(precond, sai_threshold, sai_max_levels); HYPRE_ParaSailsSetFilter(precond, sai_filter); HYPRE_ParaSailsSetSym(precond, sai_sym); HYPRE_ParaSailsSetLogging(precond, 3); #endif /* Set the PCG preconditioner */ #ifdef HYPRE_FORTRAN precond_id = 4; HYPRE_ParCSRPCGSetPrecond(&solver, &precond_id, &precond); #else HYPRE_PCGSetPrecond(solver, (HYPRE_PtrToSolverFcn) HYPRE_ParaSailsSolve, (HYPRE_PtrToSolverFcn) HYPRE_ParaSailsSetup, precond); #endif /* Now setup and solve! */ #ifdef HYPRE_FORTRAN HYPRE_ParCSRPCGSetup(&solver, &parcsr_A, &par_b, &par_x); HYPRE_ParCSRPCGSolve(&solver, &parcsr_A, &par_b, &par_x); #else HYPRE_ParCSRPCGSetup(solver, parcsr_A, par_b, par_x); HYPRE_ParCSRPCGSolve(solver, parcsr_A, par_b, par_x); #endif /* Run info - needed logging turned on */ #ifdef HYPRE_FORTRAN HYPRE_ParCSRPCGGetNumIterations(&solver, &num_iterations); HYPRE_ParCSRPCGGetFinalRelativeResidualNorm(&solver, &final_res_norm); #else HYPRE_PCGGetNumIterations(solver, &num_iterations); HYPRE_PCGGetFinalRelativeResidualNorm(solver, &final_res_norm); #endif if (myid == 0) { hypre_printf("\n"); hypre_printf("Iterations = %d\n", num_iterations); hypre_printf("Final Relative Residual Norm = %e\n", final_res_norm); hypre_printf("\n"); } /* Destory solver and preconditioner */ #ifdef HYPRE_FORTRAN HYPRE_ParCSRPCGDestroy(&solver); HYPRE_ParaSailsDestroy(&precond); #else HYPRE_ParCSRPCGDestroy(solver); HYPRE_ParaSailsDestroy(precond); #endif } else { if (myid == 0) { hypre_printf("Invalid solver id specified.\n"); } } /* Print the solution */ #ifdef HYPRE_FORTRAN if (print_solution) { HYPRE_IJVectorPrint(&x, "ij.out.x"); } #else if (print_solution) { HYPRE_IJVectorPrint(x, "ij.out.x"); } #endif /* Clean up */ #ifdef HYPRE_FORTRAN HYPRE_IJMatrixDestroy(&A); HYPRE_IJVectorDestroy(&b); HYPRE_IJVectorDestroy(&x); #else HYPRE_IJMatrixDestroy(A); HYPRE_IJVectorDestroy(b); HYPRE_IJVectorDestroy(x); #endif /* Finalize MPI*/ hypre_MPI_Finalize(); return (0); } hypre-2.33.0/src/test/ex6_for.c000066400000000000000000000636701477326011500162320ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /* Example 6 Interface: Semi-Structured interface (SStruct) Compile with: make ex6 Sample run: mpirun -np 2 ex6 Description: This is a two processor example and is the same problem as is solved with the structured interface in Example 2. (The grid boxes are exactly those in the example diagram in the struct interface chapter of the User's Manual. Processor 0 owns two boxes and processor 1 owns one box.) This is the simplest sstruct example, and it demonstrates how the semi-structured interface can be used for structured problems. There is one part and one variable. The solver is PCG with SMG preconditioner. We use a structured solver for this example. */ #include /* SStruct linear solvers headers */ #include "HYPRE_sstruct_ls.h" /* include fortran headers */ #ifdef HYPRE_FORTRAN #include "fortran.h" #include "hypre_struct_fortran_test.h" #include "hypre_sstruct_fortran_test.h" #endif HYPRE_Int main (HYPRE_Int argc, char *argv[]) { HYPRE_Int myid, num_procs; /* We are using struct solvers for this example */ #ifdef HYPRE_FORTRAN hypre_F90_Obj grid; hypre_F90_Obj graph; hypre_F90_Obj stencil; hypre_F90_Obj A; hypre_F90_Obj b; hypre_F90_Obj x; hypre_F90_Obj solver; hypre_F90_Obj precond; hypre_F90_Obj long_temp_COMM; HYPRE_Int temp_COMM; HYPRE_Int precond_id; HYPRE_Int hypre_var_cell = HYPRE_SSTRUCT_VARIABLE_CELL; HYPRE_Int one = 1; HYPRE_Int two = 2; HYPRE_Int five = 5; HYPRE_Int fifty = 50; HYPRE_Real tol = 1.e-6; HYPRE_Real zerodot = 0.; #else HYPRE_SStructGrid grid; HYPRE_SStructGraph graph; HYPRE_SStructStencil stencil; HYPRE_SStructMatrix A; HYPRE_SStructVector b; HYPRE_SStructVector x; HYPRE_StructSolver solver; HYPRE_StructSolver precond; #endif HYPRE_Int object_type; /* Initialize MPI */ hypre_MPI_Init(&argc, &argv); hypre_MPI_Comm_rank(hypre_MPI_COMM_WORLD, &myid); hypre_MPI_Comm_size(hypre_MPI_COMM_WORLD, &num_procs); if (num_procs != 2) { if (myid == 0) { hypre_printf("Must run with 2 processors!\n"); } hypre_MPI_Finalize(); return (0); } #ifdef HYPRE_FORTRAN temp_COMM = (HYPRE_Int) hypre_MPI_COMM_WORLD; long_temp_COMM = (hypre_F90_Obj) hypre_MPI_COMM_WORLD; #endif /* 1. Set up the 2D grid. This gives the index space in each part. Here we only use one part and one variable. (So the part id is 0 and the variable id is 0) */ { HYPRE_Int ndim = 2; HYPRE_Int nparts = 1; HYPRE_Int part = 0; /* Create an empty 2D grid object */ #ifdef HYPRE_FORTRAN HYPRE_SStructGridCreate(&temp_COMM, &ndim, &nparts, &grid); #else HYPRE_SStructGridCreate(hypre_MPI_COMM_WORLD, ndim, nparts, &grid); #endif /* Set the extents of the grid - each processor sets its grid boxes. Each part has its own relative index space numbering, but in this example all boxes belong to the same part. */ /* Processor 0 owns two boxes in the grid. */ if (myid == 0) { /* Add a new box to the grid */ { HYPRE_Int ilower[2] = {-3, 1}; HYPRE_Int iupper[2] = {-1, 2}; #ifdef HYPRE_FORTRAN HYPRE_SStructGridSetExtents(&grid, &part, &ilower[0], &iupper[0]); #else HYPRE_SStructGridSetExtents(grid, part, ilower, iupper); #endif } /* Add a new box to the grid */ { HYPRE_Int ilower[2] = {0, 1}; HYPRE_Int iupper[2] = {2, 4}; #ifdef HYPRE_FORTRAN HYPRE_SStructGridSetExtents(&grid, &part, &ilower[0], &iupper[0]); #else HYPRE_SStructGridSetExtents(grid, part, ilower, iupper); #endif } } /* Processor 1 owns one box in the grid. */ else if (myid == 1) { /* Add a new box to the grid */ { HYPRE_Int ilower[2] = {3, 1}; HYPRE_Int iupper[2] = {6, 4}; #ifdef HYPRE_FORTRAN HYPRE_SStructGridSetExtents(&grid, &part, &ilower[0], &iupper[0]); #else HYPRE_SStructGridSetExtents(grid, part, ilower, iupper); #endif } } /* Set the variable type and number of variables on each part. */ { HYPRE_Int i; HYPRE_Int nvars = 1; #ifdef HYPRE_FORTRAN hypre_F90_Obj vartypes[1] = {HYPRE_SSTRUCT_VARIABLE_CELL}; #else HYPRE_SStructVariable vartypes[1] = {HYPRE_SSTRUCT_VARIABLE_CELL}; #endif for (i = 0; i < nparts; i++) #ifdef HYPRE_FORTRAN HYPRE_SStructGridSetVariables(&grid, &i, &nvars, &vartypes[0]); #else HYPRE_SStructGridSetVariables(grid, i, nvars, vartypes); #endif } /* Now the grid is ready to use */ #ifdef HYPRE_FORTRAN HYPRE_SStructGridAssemble(&grid); #else HYPRE_SStructGridAssemble(grid); #endif } /* 2. Define the discretization stencil(s) */ { /* Create an empty 2D, 5-pt stencil object */ #ifdef HYPRE_FORTRAN HYPRE_SStructStencilCreate(&two, &five, &stencil); #else HYPRE_SStructStencilCreate(2, 5, &stencil); #endif /* Define the geometry of the stencil. Each represents a relative offset (in the index space). */ { HYPRE_Int entry; HYPRE_Int offsets[5][2] = {{0, 0}, {-1, 0}, {1, 0}, {0, -1}, {0, 1}}; HYPRE_Int var = 0; /* Assign numerical values to the offsets so that we can easily refer to them - the last argument indicates the variable for which we are assigning this stencil - we are just using one variable in this example so it is the first one (0) */ for (entry = 0; entry < 5; entry++) #ifdef HYPRE_FORTRAN HYPRE_SStructStencilSetEntry(&stencil, &entry, &offsets[entry][0], &var); #else HYPRE_SStructStencilSetEntry(stencil, entry, offsets[entry], var); #endif } } /* 3. Set up the Graph - this determines the non-zero structure of the matrix and allows non-stencil relationships between the parts */ { HYPRE_Int var = 0; HYPRE_Int part = 0; /* Create the graph object */ #ifdef HYPRE_FORTRAN HYPRE_SStructGraphCreate(&temp_COMM, &grid, &graph); #else HYPRE_SStructGraphCreate(hypre_MPI_COMM_WORLD, grid, &graph); #endif /* Now we need to tell the graph which stencil to use for each variable on each part (we only have one variable and one part) */ #ifdef HYPRE_FORTRAN HYPRE_SStructGraphSetStencil(&graph, &part, &var, &stencil); #else HYPRE_SStructGraphSetStencil(graph, part, var, stencil); #endif /* Here we could establish connections between parts if we had more than one part using the graph. For example, we could use HYPRE_GraphAddEntries() routine or HYPRE_GridSetNeighborBox() */ /* Assemble the graph */ #ifdef HYPRE_FORTRAN HYPRE_SStructGraphAssemble(&graph); #else HYPRE_SStructGraphAssemble(graph); #endif } /* 4. Set up a SStruct Matrix */ { HYPRE_Int i, j; HYPRE_Int part = 0; HYPRE_Int var = 0; /* Create the empty matrix object */ #ifdef HYPRE_FORTRAN HYPRE_SStructMatrixCreate(&temp_COMM, &graph, &A); #else HYPRE_SStructMatrixCreate(hypre_MPI_COMM_WORLD, graph, &A); #endif /* Set the object type (by default HYPRE_SSTRUCT). This determines the data structure used to store the matrix. If you want to use unstructured solvers, e.g. BoomerAMG, the object type should be HYPRE_PARCSR. If the problem is purely structured (with one part), you may want to use HYPRE_STRUCT to access the structured solvers. Here we have a purely structured example. */ object_type = HYPRE_STRUCT; #ifdef HYPRE_FORTRAN HYPRE_SStructMatrixSetObjectType(&A, &object_type); #else HYPRE_SStructMatrixSetObjectType(A, object_type); #endif /* Get ready to set values */ #ifdef HYPRE_FORTRAN HYPRE_SStructMatrixInitialize(&A); #else HYPRE_SStructMatrixInitialize(A); #endif /* Each processor must set the stencil values for their boxes on each part. In this example, we only set stencil entries and therefore use HYPRE_SStructMatrixSetBoxValues. If we need to set non-stencil entries, we have to use HYPRE_SStructMatrixSetValues (shown in a later example). */ if (myid == 0) { /* Set the matrix coefficients for some set of stencil entries over all the gridpoints in my first box (account for boundary grid points later) */ { HYPRE_Int ilower[2] = {-3, 1}; HYPRE_Int iupper[2] = {-1, 2}; HYPRE_Int nentries = 5; HYPRE_Int nvalues = 30; /* 6 grid points, each with 5 stencil entries */ HYPRE_Real values[30]; HYPRE_Int stencil_indices[5]; for (j = 0; j < nentries; j++) /* label the stencil indices - these correspond to the offsets defined above */ { stencil_indices[j] = j; } for (i = 0; i < nvalues; i += nentries) { values[i] = 4.0; for (j = 1; j < nentries; j++) { values[i + j] = -1.0; } } #ifdef HYPRE_FORTRAN HYPRE_SStructMatrixSetBoxValues(&A, &part, &ilower[0], &iupper[0], &var, &nentries, &stencil_indices[0], &values[0]); #else HYPRE_SStructMatrixSetBoxValues(A, part, ilower, iupper, var, nentries, stencil_indices, values); #endif } /* Set the matrix coefficients for some set of stencil entries over the gridpoints in my second box */ { HYPRE_Int ilower[2] = {0, 1}; HYPRE_Int iupper[2] = {2, 4}; HYPRE_Int nentries = 5; HYPRE_Int nvalues = 60; /* 12 grid points, each with 5 stencil entries */ HYPRE_Real values[60]; HYPRE_Int stencil_indices[5]; for (j = 0; j < nentries; j++) { stencil_indices[j] = j; } for (i = 0; i < nvalues; i += nentries) { values[i] = 4.0; for (j = 1; j < nentries; j++) { values[i + j] = -1.0; } } #ifdef HYPRE_FORTRAN HYPRE_SStructMatrixSetBoxValues(&A, &part, &ilower[0], &iupper[0], &var, &nentries, &stencil_indices[0], &values[0]); #else HYPRE_SStructMatrixSetBoxValues(A, part, ilower, iupper, var, nentries, stencil_indices, values); #endif } } else if (myid == 1) { /* Set the matrix coefficients for some set of stencil entries over the gridpoints in my box */ { HYPRE_Int ilower[2] = {3, 1}; HYPRE_Int iupper[2] = {6, 4}; HYPRE_Int nentries = 5; HYPRE_Int nvalues = 80; /* 16 grid points, each with 5 stencil entries */ HYPRE_Real values[80]; HYPRE_Int stencil_indices[5]; for (j = 0; j < nentries; j++) { stencil_indices[j] = j; } for (i = 0; i < nvalues; i += nentries) { values[i] = 4.0; for (j = 1; j < nentries; j++) { values[i + j] = -1.0; } } #ifdef HYPRE_FORTRAN HYPRE_SStructMatrixSetBoxValues(&A, &part, &ilower[0], &iupper[0], &var, &nentries, &stencil_indices[0], &values[0]); #else HYPRE_SStructMatrixSetBoxValues(A, part, ilower, iupper, var, nentries, stencil_indices, values); #endif } } /* For each box, set any coefficients that reach ouside of the boundary to 0 */ if (myid == 0) { HYPRE_Int maxnvalues = 6; HYPRE_Real values[6]; for (i = 0; i < maxnvalues; i++) { values[i] = 0.0; } { /* Values below our first AND second box */ HYPRE_Int ilower[2] = {-3, 1}; HYPRE_Int iupper[2] = { 2, 1}; HYPRE_Int stencil_indices[1] = {3}; #ifdef HYPRE_FORTRAN HYPRE_SStructMatrixSetBoxValues(&A, &part, &ilower[0], &iupper[0], &var, &one, &stencil_indices[0], &values[0]); #else HYPRE_SStructMatrixSetBoxValues(A, part, ilower, iupper, var, 1, stencil_indices, values); #endif } { /* Values to the left of our first box */ HYPRE_Int ilower[2] = {-3, 1}; HYPRE_Int iupper[2] = {-3, 2}; HYPRE_Int stencil_indices[1] = {1}; #ifdef HYPRE_FORTRAN HYPRE_SStructMatrixSetBoxValues(&A, &part, &ilower[0], &iupper[0], &var, &one, &stencil_indices[0], &values[0]); #else HYPRE_SStructMatrixSetBoxValues(A, part, ilower, iupper, var, 1, stencil_indices, values); #endif } { /* Values above our first box */ HYPRE_Int ilower[2] = {-3, 2}; HYPRE_Int iupper[2] = {-1, 2}; HYPRE_Int stencil_indices[1] = {4}; #ifdef HYPRE_FORTRAN HYPRE_SStructMatrixSetBoxValues(&A, &part, &ilower[0], &iupper[0], &var, &one, &stencil_indices[0], &values[0]); #else HYPRE_SStructMatrixSetBoxValues(A, part, ilower, iupper, var, 1, stencil_indices, values); #endif } { /* Values to the left of our second box (that do not border the first box). */ HYPRE_Int ilower[2] = { 0, 3}; HYPRE_Int iupper[2] = { 0, 4}; HYPRE_Int stencil_indices[1] = {1}; #ifdef HYPRE_FORTRAN HYPRE_SStructMatrixSetBoxValues(&A, &part, &ilower[0], &iupper[0], &var, &one, &stencil_indices[0], &values[0]); #else HYPRE_SStructMatrixSetBoxValues(A, part, ilower, iupper, var, 1, stencil_indices, values); #endif } { /* Values above our second box */ HYPRE_Int ilower[2] = { 0, 4}; HYPRE_Int iupper[2] = { 2, 4}; HYPRE_Int stencil_indices[1] = {4}; #ifdef HYPRE_FORTRAN HYPRE_SStructMatrixSetBoxValues(&A, &part, &ilower[0], &iupper[0], &var, &one, &stencil_indices[0], &values[0]); #else HYPRE_SStructMatrixSetBoxValues(A, part, ilower, iupper, var, 1, stencil_indices, values); #endif } } else if (myid == 1) { HYPRE_Int maxnvalues = 4; HYPRE_Real values[4]; for (i = 0; i < maxnvalues; i++) { values[i] = 0.0; } { /* Values below our box */ HYPRE_Int ilower[2] = { 3, 1}; HYPRE_Int iupper[2] = { 6, 1}; HYPRE_Int stencil_indices[1] = {3}; #ifdef HYPRE_FORTRAN HYPRE_SStructMatrixSetBoxValues(&A, &part, &ilower[0], &iupper[0], &var, &one, &stencil_indices[0], &values[0]); #else HYPRE_SStructMatrixSetBoxValues(A, part, ilower, iupper, var, 1, stencil_indices, values); #endif } { /* Values to the right of our box */ HYPRE_Int ilower[2] = { 6, 1}; HYPRE_Int iupper[2] = { 6, 4}; HYPRE_Int stencil_indices[1] = {2}; #ifdef HYPRE_FORTRAN HYPRE_SStructMatrixSetBoxValues(&A, &part, &ilower[0], &iupper[0], &var, &one, &stencil_indices[0], &values[0]); #else HYPRE_SStructMatrixSetBoxValues(A, part, ilower, iupper, var, 1, stencil_indices, values); #endif } { /* Values above our box */ HYPRE_Int ilower[2] = { 3, 4}; HYPRE_Int iupper[2] = { 6, 4}; HYPRE_Int stencil_indices[1] = {4}; #ifdef HYPRE_FORTRAN HYPRE_SStructMatrixSetBoxValues(&A, &part, &ilower[0], &iupper[0], &var, &one, &stencil_indices[0], &values[0]); #else HYPRE_SStructMatrixSetBoxValues(A, part, ilower, iupper, var, 1, stencil_indices, values); #endif } } /* This is a collective call finalizing the matrix assembly. The matrix is now ``ready to be used'' */ #ifdef HYPRE_FORTRAN HYPRE_SStructMatrixAssemble(&A); #else HYPRE_SStructMatrixAssemble(A); #endif } /* 5. Set up SStruct Vectors for b and x */ { HYPRE_Int i; /* We have one part and one variable. */ HYPRE_Int part = 0; HYPRE_Int var = 0; /* Create an empty vector object */ #ifdef HYPRE_FORTRAN HYPRE_SStructVectorCreate(&temp_COMM, &grid, &b); HYPRE_SStructVectorCreate(&temp_COMM, &grid, &x); #else HYPRE_SStructVectorCreate(hypre_MPI_COMM_WORLD, grid, &b); HYPRE_SStructVectorCreate(hypre_MPI_COMM_WORLD, grid, &x); #endif /* As with the matrix, set the object type for the vectors to be the struct type */ object_type = HYPRE_STRUCT; #ifdef HYPRE_FORTRAN HYPRE_SStructVectorSetObjectType(&b, &object_type); HYPRE_SStructVectorSetObjectType(&x, &object_type); #else HYPRE_SStructVectorSetObjectType(b, object_type); HYPRE_SStructVectorSetObjectType(x, object_type); #endif /* Indicate that the vector coefficients are ready to be set */ #ifdef HYPRE_FORTRAN HYPRE_SStructVectorInitialize(&b); HYPRE_SStructVectorInitialize(&x); #else HYPRE_SStructVectorInitialize(b); HYPRE_SStructVectorInitialize(x); #endif if (myid == 0) { /* Set the vector coefficients over the gridpoints in my first box */ { HYPRE_Int ilower[2] = {-3, 1}; HYPRE_Int iupper[2] = {-1, 2}; HYPRE_Int nvalues = 6; /* 6 grid points */ HYPRE_Real values[6]; for (i = 0; i < nvalues; i ++) { values[i] = 1.0; } #ifdef HYPRE_FORTRAN HYPRE_SStructVectorSetBoxValues(&b, &part, &ilower[0], &iupper[0], &var, &values[0]); #else HYPRE_SStructVectorSetBoxValues(b, part, ilower, iupper, var, values); #endif for (i = 0; i < nvalues; i ++) { values[i] = 0.0; } #ifdef HYPRE_FORTRAN HYPRE_SStructVectorSetBoxValues(&x, &part, &ilower[0], &iupper[0], &var, &values[0]); #else HYPRE_SStructVectorSetBoxValues(x, part, ilower, iupper, var, values); #endif } /* Set the vector coefficients over the gridpoints in my second box */ { HYPRE_Int ilower[2] = { 0, 1}; HYPRE_Int iupper[2] = { 2, 4}; HYPRE_Int nvalues = 12; /* 12 grid points */ HYPRE_Real values[12]; for (i = 0; i < nvalues; i ++) { values[i] = 1.0; } #ifdef HYPRE_FORTRAN HYPRE_SStructVectorSetBoxValues(&b, &part, &ilower[0], &iupper[0], &var, &values[0]); #else HYPRE_SStructVectorSetBoxValues(b, part, ilower, iupper, var, values); #endif for (i = 0; i < nvalues; i ++) { values[i] = 0.0; } #ifdef HYPRE_FORTRAN HYPRE_SStructVectorSetBoxValues(&x, &part, &ilower[0], &iupper[0], &var, &values[0]); #else HYPRE_SStructVectorSetBoxValues(x, part, ilower, iupper, var, values); #endif } } else if (myid == 1) { /* Set the vector coefficients over the gridpoints in my box */ { HYPRE_Int ilower[2] = { 3, 1}; HYPRE_Int iupper[2] = { 6, 4}; HYPRE_Int nvalues = 16; /* 16 grid points */ HYPRE_Real values[16]; for (i = 0; i < nvalues; i ++) { values[i] = 1.0; } #ifdef HYPRE_FORTRAN HYPRE_SStructVectorSetBoxValues(&b, &part, &ilower[0], &iupper[0], &var, &values[0]); #else HYPRE_SStructVectorSetBoxValues(b, part, ilower, iupper, var, values); #endif for (i = 0; i < nvalues; i ++) { values[i] = 0.0; } #ifdef HYPRE_FORTRAN HYPRE_SStructVectorSetBoxValues(&x, &part, &ilower[0], &iupper[0], &var, &values[0]); #else HYPRE_SStructVectorSetBoxValues(x, part, ilower, iupper, var, values); #endif } } /* This is a collective call finalizing the vector assembly. The vectors are now ``ready to be used'' */ #ifdef HYPRE_FORTRAN HYPRE_SStructVectorAssemble(&b); HYPRE_SStructVectorAssemble(&x); #else HYPRE_SStructVectorAssemble(b); HYPRE_SStructVectorAssemble(x); #endif } /* 6. Set up and use a solver (See the Reference Manual for descriptions of all of the options.) */ { #ifdef HYPRE_FORTRAN hypre_F90_Obj sA; hypre_F90_Obj sb; hypre_F90_Obj sx; #else HYPRE_StructMatrix sA; HYPRE_StructVector sb; HYPRE_StructVector sx; #endif /* Because we are using a struct solver, we need to get the object of the matrix and vectors to pass in to the struct solvers */ #ifdef HYPRE_FORTRAN HYPRE_SStructMatrixGetObject(&A, &sA); HYPRE_SStructVectorGetObject(&b, &sb); HYPRE_SStructVectorGetObject(&x, &sx); #else HYPRE_SStructMatrixGetObject(A, (void **) &sA); HYPRE_SStructVectorGetObject(b, (void **) &sb); HYPRE_SStructVectorGetObject(x, (void **) &sx); #endif /* Create an empty PCG Struct solver */ #ifdef HYPRE_FORTRAN HYPRE_StructPCGCreate(&temp_COMM, &solver); #else HYPRE_StructPCGCreate(hypre_MPI_COMM_WORLD, &solver); #endif /* Set PCG parameters */ #ifdef HYPRE_FORTRAN HYPRE_StructPCGSetTol(&solver, &tol); HYPRE_StructPCGSetPrintLevel(&solver, &two); HYPRE_StructPCGSetMaxIter(&solver, &fifty); #else HYPRE_StructPCGSetTol(solver, 1.0e-06); HYPRE_StructPCGSetPrintLevel(solver, 2); HYPRE_StructPCGSetMaxIter(solver, 50); #endif /* Create the Struct SMG solver for use as a preconditioner */ #ifdef HYPRE_FORTRAN HYPRE_StructSMGCreate(&temp_COMM, &precond); #else HYPRE_StructSMGCreate(hypre_MPI_COMM_WORLD, &precond); #endif /* Set SMG parameters */ #ifdef HYPRE_FORTRAN HYPRE_StructSMGSetMaxIter(&precond, &one); HYPRE_StructSMGSetTol(&precond, &zerodot); HYPRE_StructSMGSetZeroGuess(&precond); HYPRE_StructSMGSetNumPreRelax(&precond, &one); HYPRE_StructSMGSetNumPostRelax(&precond, &one); #else HYPRE_StructSMGSetMaxIter(precond, 1); HYPRE_StructSMGSetTol(precond, 0.0); HYPRE_StructSMGSetZeroGuess(precond); HYPRE_StructSMGSetNumPreRelax(precond, 1); HYPRE_StructSMGSetNumPostRelax(precond, 1); #endif /* Set preconditioner and solve */ #ifdef HYPRE_FORTRAN precond_id = 0; HYPRE_StructPCGSetPrecond(&solver, &precond_id, &precond); HYPRE_StructPCGSetup(&solver, &sA, &sb, &sx); HYPRE_StructPCGSolve(&solver, &sA, &sb, &sx); #else HYPRE_StructPCGSetPrecond(solver, HYPRE_StructSMGSolve, HYPRE_StructSMGSetup, precond); HYPRE_StructPCGSetup(solver, sA, sb, sx); HYPRE_StructPCGSolve(solver, sA, sb, sx); #endif } /* Free memory */ #ifdef HYPRE_FORTRAN HYPRE_SStructGridDestroy(&grid); HYPRE_SStructStencilDestroy(&stencil); HYPRE_SStructGraphDestroy(&graph); HYPRE_SStructMatrixDestroy(&A); HYPRE_SStructVectorDestroy(&b); HYPRE_SStructVectorDestroy(&x); HYPRE_StructPCGDestroy(&solver); HYPRE_StructSMGDestroy(&precond); #else HYPRE_SStructGridDestroy(grid); HYPRE_SStructStencilDestroy(stencil); HYPRE_SStructGraphDestroy(graph); HYPRE_SStructMatrixDestroy(A); HYPRE_SStructVectorDestroy(b); HYPRE_SStructVectorDestroy(x); HYPRE_StructPCGDestroy(solver); HYPRE_StructSMGDestroy(precond); #endif /* Finalize MPI */ hypre_MPI_Finalize(); return (0); } hypre-2.33.0/src/test/ex7_for.c000066400000000000000000001611631477326011500162270ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /* Example 7 -- FORTRAN Test Version Interface: SStructured interface (SStruct) Compile with: make ex7 Sample run: mpirun -np 16 ex7_for -n 33 -solver 10 -K 3 -B 0 -C 1 -U0 2 -F 4 To see options: ex7 -help Description: This example uses the sstruct interface to solve the same problem as was solved in Example 4 with the struct interface. Therefore, there is only one part and one variable. This code solves the convection-reaction-diffusion problem div (-K grad u + B u) + C u = F in the unit square with boundary condition u = U0. The domain is split into N x N processor grid. Thus, the given number of processors should be a perfect square. Each processor has a n x n grid, with nodes connected by a 5-point stencil. We use cell-centered variables, and, therefore, the nodes are not shared. To incorporate the boundary conditions, we do the following: Let x_i and x_b be the interior and boundary parts of the solution vector x. If we split the matrix A as A = [A_ii A_ib; A_bi A_bb], then we solve [A_ii 0; 0 I] [x_i ; x_b] = [b_i - A_ib u_0; u_0]. Note that this differs from Example 3 in that we are actually solving for the boundary conditions (so they may not be exact as in ex3, where we only solved for the interior). This approach is useful for more general types of b.c. As in the previous example (Example 6), we use a structured solver. A number of structured solvers are available. More information can be found in the Solvers and Preconditioners chapter of the User's Manual. */ #include #include "_hypre_utilities.h" #include "HYPRE_krylov.h" #include "HYPRE_sstruct_ls.h" #ifdef M_PI #define PI M_PI #else #define PI 3.14159265358979 #endif /* Macro to evaluate a function F in the grid point (i,j) */ #define Eval(F,i,j) (F( (ilower[0]+(i))*h, (ilower[1]+(j))*h )) #define bcEval(F,i,j) (F( (bc_ilower[0]+(i))*h, (bc_ilower[1]+(j))*h )) #ifdef HYPRE_FORTRAN #include "fortran.h" #include "hypre_struct_fortran_test.h" #include "hypre_sstruct_fortran_test.h" #endif HYPRE_Int optionK, optionB, optionC, optionU0, optionF; /* Diffusion coefficient */ HYPRE_Real K(HYPRE_Real x, HYPRE_Real y) { switch (optionK) { case 0: return 1.0; case 1: return x * x + exp(y); case 2: if ((fabs(x - 0.5) < 0.25) && (fabs(y - 0.5) < 0.25)) { return 100.0; } else { return 1.0; } case 3: if (((x - 0.5) * (x - 0.5) + (y - 0.5) * (y - 0.5)) < 0.0625) { return 10.0; } else { return 1.0; } default: return 1.0; } } /* Convection vector, first component */ HYPRE_Real B1(HYPRE_Real x, HYPRE_Real y) { switch (optionB) { case 0: return 0.0; case 1: return -0.1; case 2: return 0.25; case 3: return 1.0; default: return 0.0; } } /* Convection vector, second component */ HYPRE_Real B2(HYPRE_Real x, HYPRE_Real y) { switch (optionB) { case 0: return 0.0; case 1: return 0.1; case 2: return -0.25; case 3: return 1.0; default: return 0.0; } } /* Reaction coefficient */ HYPRE_Real C(HYPRE_Real x, HYPRE_Real y) { switch (optionC) { case 0: return 0.0; case 1: return 10.0; case 2: return 100.0; default: return 0.0; } } /* Boundary condition */ HYPRE_Real U0(HYPRE_Real x, HYPRE_Real y) { switch (optionU0) { case 0: return 0.0; case 1: return (x + y) / 100; case 2: return (hypre_sin(5 * PI * x) + hypre_sin(5 * PI * y)) / 1000; default: return 0.0; } } /* Right-hand side */ HYPRE_Real F(HYPRE_Real x, HYPRE_Real y) { switch (optionF) { case 0: return 1.0; case 1: return 0.0; case 2: return 2 * PI * PI * hypre_sin(PI * x) * hypre_sin(PI * y); case 3: if ((fabs(x - 0.5) < 0.25) && (fabs(y - 0.5) < 0.25)) { return -1.0; } else { return 1.0; } case 4: if (((x - 0.5) * (x - 0.5) + (y - 0.5) * (y - 0.5)) < 0.0625) { return -1.0; } else { return 1.0; } default: return 1.0; } } HYPRE_Int main (HYPRE_Int argc, char *argv[]) { HYPRE_Int i, j, k; HYPRE_Int myid, num_procs; HYPRE_Int n, N, pi, pj; HYPRE_Real h, h2; HYPRE_Int ilower[2], iupper[2]; HYPRE_Int solver_id; HYPRE_Int n_pre, n_post; HYPRE_Int rap, relax, skip, sym; HYPRE_Int time_index; HYPRE_Int object_type; HYPRE_Int num_iterations; HYPRE_Real final_res_norm; HYPRE_Int print_solution; /* We are using struct solvers for this example */ #ifdef HYPRE_FORTRAN hypre_F90_Obj grid; hypre_F90_Obj stencil; hypre_F90_Obj graph; hypre_F90_Obj A; hypre_F90_Obj b; hypre_F90_Obj x; hypre_F90_Obj solver; hypre_F90_Obj precond; HYPRE_Int precond_id; hypre_F90_Obj long_temp_COMM; HYPRE_Int temp_COMM; HYPRE_Int zero = 0; HYPRE_Int one = 1; HYPRE_Int two = 2; HYPRE_Int three = 3; HYPRE_Int five = 5; HYPRE_Int fifty = 50; HYPRE_Int twohundred = 200; HYPRE_Int fivehundred = 500; HYPRE_Real zerodot = 0.; HYPRE_Real tol = 1.e-6; #else HYPRE_SStructGrid grid; HYPRE_SStructStencil stencil; HYPRE_SStructGraph graph; HYPRE_SStructMatrix A; HYPRE_SStructVector b; HYPRE_SStructVector x; HYPRE_StructSolver solver; HYPRE_StructSolver precond; #endif /* Initialize MPI */ hypre_MPI_Init(&argc, &argv); hypre_MPI_Comm_rank(hypre_MPI_COMM_WORLD, &myid); hypre_MPI_Comm_size(hypre_MPI_COMM_WORLD, &num_procs); /* Set default parameters */ n = 33; optionK = 0; optionB = 0; optionC = 0; optionU0 = 0; optionF = 0; solver_id = 10; n_pre = 1; n_post = 1; rap = 0; relax = 1; skip = 0; sym = 0; print_solution = 0; /* Parse command line */ { HYPRE_Int arg_index = 0; HYPRE_Int print_usage = 0; while (arg_index < argc) { if ( strcmp(argv[arg_index], "-n") == 0 ) { arg_index++; n = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-K") == 0 ) { arg_index++; optionK = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-B") == 0 ) { arg_index++; optionB = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-C") == 0 ) { arg_index++; optionC = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-U0") == 0 ) { arg_index++; optionU0 = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-F") == 0 ) { arg_index++; optionF = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-solver") == 0 ) { arg_index++; solver_id = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-v") == 0 ) { arg_index++; n_pre = atoi(argv[arg_index++]); n_post = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-rap") == 0 ) { arg_index++; rap = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-relax") == 0 ) { arg_index++; relax = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-skip") == 0 ) { arg_index++; skip = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-sym") == 0 ) { arg_index++; sym = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-print_solution") == 0 ) { arg_index++; print_solution = 1; } else if ( strcmp(argv[arg_index], "-help") == 0 ) { print_usage = 1; break; } else { arg_index++; } } if ((print_usage) && (myid == 0)) { hypre_printf("\n"); hypre_printf("Usage: %s []\n", argv[0]); hypre_printf("\n"); hypre_printf(" -n : problem size per processor (default: 8)\n"); hypre_printf(" -K : choice for the diffusion coefficient (default: 1.0)\n"); hypre_printf(" -B : choice for the convection vector (default: 0.0)\n"); hypre_printf(" -C : choice for the reaction coefficient (default: 0.0)\n"); hypre_printf(" -U0 : choice for the boundary condition (default: 0.0)\n"); hypre_printf(" -F : choice for the right-hand side (default: 1.0) \n"); hypre_printf(" -solver : solver ID\n"); hypre_printf(" 0 - SMG \n"); hypre_printf(" 1 - PFMG\n"); hypre_printf(" 10 - CG with SMG precond (default)\n"); hypre_printf(" 11 - CG with PFMG precond\n"); hypre_printf(" 17 - CG with 2-step Jacobi\n"); hypre_printf(" 18 - CG with diagonal scaling\n"); hypre_printf(" 19 - CG\n"); hypre_printf(" 30 - GMRES with SMG precond\n"); hypre_printf(" 31 - GMRES with PFMG precond\n"); hypre_printf(" 37 - GMRES with 2-step Jacobi\n"); hypre_printf(" 38 - GMRES with diagonal scaling\n"); hypre_printf(" 39 - GMRES\n"); hypre_printf(" -v : number of pre and post relaxations\n"); hypre_printf(" -rap : coarse grid operator type\n"); hypre_printf(" 0 - Galerkin (default)\n"); hypre_printf(" 1 - non-Galerkin ParFlow operators\n"); hypre_printf(" 2 - Galerkin, general operators\n"); hypre_printf(" -relax : relaxation type\n"); hypre_printf(" 0 - Jacobi\n"); hypre_printf(" 1 - Weighted Jacobi (default)\n"); hypre_printf(" 2 - R/B Gauss-Seidel\n"); hypre_printf(" 3 - R/B Gauss-Seidel (nonsymmetric)\n"); hypre_printf(" -skip : skip levels in PFMG (0 or 1)\n"); hypre_printf(" -sym : symmetric storage (1) or not (0)\n"); hypre_printf(" -print_solution : print the solution vector\n"); hypre_printf("\n"); } if (print_usage) { hypre_MPI_Finalize(); return (0); } } /* Convection produces non-symmetric matrices */ if (optionB && sym) { optionB = 0; } /* Figure out the processor grid (N x N). The local problem size is indicated by n (n x n). pi and pj indicate position in the processor grid. */ N = hypre_sqrt(num_procs); h = 1.0 / (N * n - 1); h2 = h * h; pj = myid / N; pi = myid - pj * N; /* Define the nodes owned by the current processor (each processor's piece of the global grid) */ ilower[0] = pi * n; ilower[1] = pj * n; iupper[0] = ilower[0] + n - 1; iupper[1] = ilower[1] + n - 1; /* 1. Set up a 2D grid */ { HYPRE_Int ndim = 2; HYPRE_Int nparts = 1; HYPRE_Int nvars = 1; HYPRE_Int part = 0; HYPRE_Int i; /* Create an empty 2D grid object */ #ifdef HYPRE_FORTRAN temp_COMM = (HYPRE_Int) hypre_MPI_COMM_WORLD; long_temp_COMM = (hypre_F90_Obj) hypre_MPI_COMM_WORLD; HYPRE_SStructGridCreate(&temp_COMM, &ndim, &nparts, &grid); #else HYPRE_SStructGridCreate(hypre_MPI_COMM_WORLD, ndim, nparts, &grid); #endif /* Add a new box to the grid */ #ifdef HYPRE_FORTRAN HYPRE_SStructGridSetExtents(&grid, &part, &ilower[0], &iupper[0]); #else HYPRE_SStructGridSetExtents(grid, part, ilower, iupper); #endif /* Set the variable type for each part */ { #ifdef HYPRE_FORTRAN hypre_F90_Obj vartypes[1] = {HYPRE_SSTRUCT_VARIABLE_CELL}; #else HYPRE_SStructVariable vartypes[1] = {HYPRE_SSTRUCT_VARIABLE_CELL}; #endif for (i = 0; i < nparts; i++) #ifdef HYPRE_FORTRAN HYPRE_SStructGridSetVariables(&grid, &i, &nvars, &vartypes[0]); #else HYPRE_SStructGridSetVariables(grid, i, nvars, vartypes); #endif } /* This is a collective call finalizing the grid assembly. The grid is now ``ready to be used'' */ #ifdef HYPRE_FORTRAN HYPRE_SStructGridAssemble(&grid); #else HYPRE_SStructGridAssemble(grid); #endif } /* 2. Define the discretization stencil */ { HYPRE_Int ndim = 2; HYPRE_Int var = 0; if (sym == 0) { /* Define the geometry of the stencil */ HYPRE_Int offsets[5][2] = {{0, 0}, {-1, 0}, {1, 0}, {0, -1}, {0, 1}}; /* Create an empty 2D, 5-pt stencil object */ #ifdef HYPRE_FORTRAN HYPRE_SStructStencilCreate(&ndim, &five, &stencil); #else HYPRE_SStructStencilCreate(ndim, 5, &stencil); #endif /* Assign stencil entries */ for (i = 0; i < 5; i++) #ifdef HYPRE_FORTRAN HYPRE_SStructStencilSetEntry(&stencil, &i, offsets[i], &var); #else HYPRE_SStructStencilSetEntry(stencil, i, offsets[i], var); #endif } else /* Symmetric storage */ { /* Define the geometry of the stencil */ HYPRE_Int offsets[3][2] = {{0, 0}, {1, 0}, {0, 1}}; /* Create an empty 2D, 3-pt stencil object */ #ifdef HYPRE_FORTRAN HYPRE_SStructStencilCreate(&ndim, &three, &stencil); #else HYPRE_SStructStencilCreate(ndim, 3, &stencil); #endif /* Assign stencil entries */ for (i = 0; i < 3; i++) #ifdef HYPRE_FORTRAN HYPRE_SStructStencilSetEntry(&stencil, &i, offsets[i], &var); #else HYPRE_SStructStencilSetEntry(stencil, i, offsets[i], var); #endif } } /* 3. Set up the Graph - this determines the non-zero structure of the matrix */ { HYPRE_Int var = 0; HYPRE_Int part = 0; /* Create the graph object */ #ifdef HYPRE_FORTRAN HYPRE_SStructGraphCreate(&temp_COMM, &grid, &graph); #else HYPRE_SStructGraphCreate(hypre_MPI_COMM_WORLD, grid, &graph); #endif /* Now we need to tell the graph which stencil to use for each variable on each part (we only have one variable and one part)*/ #ifdef HYPRE_FORTRAN HYPRE_SStructGraphSetStencil(&graph, &part, &var, &stencil); #else HYPRE_SStructGraphSetStencil(graph, part, var, stencil); #endif /* Here we could establish connections between parts if we had more than one part. */ /* Assemble the graph */ #ifdef HYPRE_FORTRAN HYPRE_SStructGraphAssemble(&graph); #else HYPRE_SStructGraphAssemble(graph); #endif } /* 4. Set up SStruct Vectors for b and x */ { HYPRE_Real *values; /* We have one part and one variable. */ HYPRE_Int part = 0; HYPRE_Int var = 0; /* Create an empty vector object */ #ifdef HYPRE_FORTRAN HYPRE_SStructVectorCreate(&temp_COMM, &grid, &b); HYPRE_SStructVectorCreate(&temp_COMM, &grid, &x); #else HYPRE_SStructVectorCreate(hypre_MPI_COMM_WORLD, grid, &b); HYPRE_SStructVectorCreate(hypre_MPI_COMM_WORLD, grid, &x); #endif /* Set the object type (by default HYPRE_SSTRUCT). This determines the data structure used to store the matrix. If you want to use unstructured solvers, e.g. BoomerAMG, the object type should be HYPRE_PARCSR. If the problem is purely structured (with one part), you may want to use HYPRE_STRUCT to access the structured solvers. Here we have a purely structured example. */ object_type = HYPRE_STRUCT; #ifdef HYPRE_FORTRAN HYPRE_SStructVectorSetObjectType(&b, &object_type); HYPRE_SStructVectorSetObjectType(&x, &object_type); #else HYPRE_SStructVectorSetObjectType(b, object_type); HYPRE_SStructVectorSetObjectType(x, object_type); #endif /* Indicate that the vector coefficients are ready to be set */ #ifdef HYPRE_FORTRAN HYPRE_SStructVectorInitialize(&b); HYPRE_SStructVectorInitialize(&x); #else HYPRE_SStructVectorInitialize(b); HYPRE_SStructVectorInitialize(x); #endif values = hypre_CTAlloc(HYPRE_Real, (n * n), HYPRE_MEMORY_HOST); /* Set the values of b in left-to-right, bottom-to-top order */ for (k = 0, j = 0; j < n; j++) for (i = 0; i < n; i++, k++) { values[k] = h2 * Eval(F, i, j); } #ifdef HYPRE_FORTRAN HYPRE_SStructVectorSetBoxValues(&b, &part, &ilower[0], &iupper[0], &var, &values[0]); #else HYPRE_SStructVectorSetBoxValues(b, part, ilower, iupper, var, values); #endif /* Set x = 0 */ for (i = 0; i < (n * n); i ++) { values[i] = 0.0; } #ifdef HYPRE_FORTRAN HYPRE_SStructVectorSetBoxValues(&x, &part, &ilower[0], &iupper[0], &var, &values[0]); #else HYPRE_SStructVectorSetBoxValues(x, part, ilower, iupper, var, values); #endif hypre_TFree(values, HYPRE_MEMORY_HOST); /* Assembling is postponed since the vectors will be further modified */ } /* 4. Set up a SStruct Matrix */ { /* We have one part and one variable. */ HYPRE_Int part = 0; HYPRE_Int var = 0; /* Create an empty matrix object */ #ifdef HYPRE_FORTRAN HYPRE_SStructMatrixCreate(&temp_COMM, &graph, &A); #else HYPRE_SStructMatrixCreate(hypre_MPI_COMM_WORLD, graph, &A); #endif /* Use symmetric storage? The function below is for symmetric stencil entries (use HYPRE_SStructMatrixSetNSSymmetric for non-stencil entries) */ #ifdef HYPRE_FORTRAN HYPRE_SStructMatrixSetSymmetric(&A, &part, &var, &var, &sym); #else HYPRE_SStructMatrixSetSymmetric(A, part, var, var, sym); #endif /* As with the vectors, set the object type for the vectors to be the struct type */ object_type = HYPRE_STRUCT; #ifdef HYPRE_FORTRAN HYPRE_SStructMatrixSetObjectType(&A, &object_type); #else HYPRE_SStructMatrixSetObjectType(A, object_type); #endif /* Indicate that the matrix coefficients are ready to be set */ #ifdef HYPRE_FORTRAN HYPRE_SStructMatrixInitialize(&A); #else HYPRE_SStructMatrixInitialize(A); #endif /* Set the stencil values in the interior. Here we set the values at every node. We will modify the boundary nodes later. */ if (sym == 0) { HYPRE_Int stencil_indices[5] = {0, 1, 2, 3, 4}; /* labels correspond to the offsets */ HYPRE_Real *values; values = hypre_CTAlloc(HYPRE_Real, 5 * (n * n), HYPRE_MEMORY_HOST); /* The order is left-to-right, bottom-to-top */ for (k = 0, j = 0; j < n; j++) for (i = 0; i < n; i++, k += 5) { values[k + 1] = - Eval(K, i - 0.5, j) - Eval(B1, i - 0.5, j); values[k + 2] = - Eval(K, i + 0.5, j) + Eval(B1, i + 0.5, j); values[k + 3] = - Eval(K, i, j - 0.5) - Eval(B2, i, j - 0.5); values[k + 4] = - Eval(K, i, j + 0.5) + Eval(B2, i, j + 0.5); values[k] = h2 * Eval(C, i, j) + Eval(K, i - 0.5, j) + Eval(K, i + 0.5, j) + Eval(K, i, j - 0.5) + Eval(K, i, j + 0.5) - Eval(B1, i - 0.5, j) + Eval(B1, i + 0.5, j) - Eval(B2, i, j - 0.5) + Eval(B2, i, j + 0.5); } #ifdef HYPRE_FORTRAN HYPRE_SStructMatrixSetBoxValues(&A, &part, &ilower[0], &iupper[0], &var, &five, &stencil_indices[0], &values[0]); #else HYPRE_SStructMatrixSetBoxValues(A, part, ilower, iupper, var, 5, stencil_indices, values); #endif hypre_TFree(values, HYPRE_MEMORY_HOST); } else /* Symmetric storage */ { HYPRE_Int stencil_indices[3] = {0, 1, 2}; HYPRE_Real *values; values = hypre_CTAlloc(HYPRE_Real, 3 * (n * n), HYPRE_MEMORY_HOST); /* The order is left-to-right, bottom-to-top */ for (k = 0, j = 0; j < n; j++) for (i = 0; i < n; i++, k += 3) { values[k + 1] = - Eval(K, i + 0.5, j); values[k + 2] = - Eval(K, i, j + 0.5); values[k] = h2 * Eval(C, i, j) + Eval(K, i + 0.5, j) + Eval(K, i, j + 0.5) + Eval(K, i - 0.5, j) + Eval(K, i, j - 0.5); } #ifdef HYPRE_FORTRAN HYPRE_SStructMatrixSetBoxValues(&A, &part, &ilower[0], &iupper[0], &var, &three, &stencil_indices[0], &values[0]); #else HYPRE_SStructMatrixSetBoxValues(A, part, ilower, iupper, var, 3, stencil_indices, values); #endif hypre_TFree(values, HYPRE_MEMORY_HOST); } } /* 5. Set the boundary conditions, while eliminating the coefficients reaching ouside of the domain boundary. We must modify the matrix stencil and the corresponding rhs entries. */ { HYPRE_Int bc_ilower[2]; HYPRE_Int bc_iupper[2]; HYPRE_Int stencil_indices[5] = {0, 1, 2, 3, 4}; HYPRE_Real *values, *bvalues; HYPRE_Int nentries; /* We have one part and one variable. */ HYPRE_Int part = 0; HYPRE_Int var = 0; if (sym == 0) { nentries = 5; } else { nentries = 3; } values = hypre_CTAlloc(HYPRE_Real, nentries * n, HYPRE_MEMORY_HOST); bvalues = hypre_CTAlloc(HYPRE_Real, n, HYPRE_MEMORY_HOST); /* The stencil at the boundary nodes is 1-0-0-0-0. Because we have I x_b = u_0; */ for (i = 0; i < nentries * n; i += nentries) { values[i] = 1.0; for (j = 1; j < nentries; j++) { values[i + j] = 0.0; } } /* Processors at y = 0 */ if (pj == 0) { bc_ilower[0] = pi * n; bc_ilower[1] = pj * n; bc_iupper[0] = bc_ilower[0] + n - 1; bc_iupper[1] = bc_ilower[1]; /* Modify the matrix */ #ifdef HYPRE_FORTRAN HYPRE_SStructMatrixSetBoxValues(&A, &part, &bc_ilower[0], &bc_iupper[0], &var, &nentries, &stencil_indices[0], &values[0]); #else HYPRE_SStructMatrixSetBoxValues(A, part, bc_ilower, bc_iupper, var, nentries, stencil_indices, values); #endif /* Put the boundary conditions in b */ for (i = 0; i < n; i++) { bvalues[i] = bcEval(U0, i, 0); } #ifdef HYPRE_FORTRAN HYPRE_SStructVectorSetBoxValues(&b, &part, &bc_ilower[0], &bc_iupper[0], &var, &bvalues[0]); #else HYPRE_SStructVectorSetBoxValues(b, part, bc_ilower, bc_iupper, var, bvalues); #endif } /* Processors at y = 1 */ if (pj == N - 1) { bc_ilower[0] = pi * n; bc_ilower[1] = pj * n + n - 1; bc_iupper[0] = bc_ilower[0] + n - 1; bc_iupper[1] = bc_ilower[1]; /* Modify the matrix */ #ifdef HYPRE_FORTRAN HYPRE_SStructMatrixSetBoxValues(&A, &part, &bc_ilower[0], &bc_iupper[0], &var, &nentries, &stencil_indices[0], &values[0]); #else HYPRE_SStructMatrixSetBoxValues(A, part, bc_ilower, bc_iupper, var, nentries, stencil_indices, values); #endif /* Put the boundary conditions in b */ for (i = 0; i < n; i++) { bvalues[i] = bcEval(U0, i, 0); } #ifdef HYPRE_FORTRAN HYPRE_SStructVectorSetBoxValues(&b, &part, &bc_ilower[0], &bc_iupper[0], &var, &bvalues[0]); #else HYPRE_SStructVectorSetBoxValues(b, part, bc_ilower, bc_iupper, var, bvalues); #endif } /* Processors at x = 0 */ if (pi == 0) { bc_ilower[0] = pi * n; bc_ilower[1] = pj * n; bc_iupper[0] = bc_ilower[0]; bc_iupper[1] = bc_ilower[1] + n - 1; /* Modify the matrix */ #ifdef HYPRE_FORTRAN HYPRE_SStructMatrixSetBoxValues(&A, &part, &bc_ilower[0], &bc_iupper[0], &var, &nentries, &stencil_indices[0], &values[0]); #else HYPRE_SStructMatrixSetBoxValues(A, part, bc_ilower, bc_iupper, var, nentries, stencil_indices, values); #endif /* Put the boundary conditions in b */ for (j = 0; j < n; j++) { bvalues[j] = bcEval(U0, 0, j); } #ifdef HYPRE_FORTRAN HYPRE_SStructVectorSetBoxValues(&b, &part, &bc_ilower[0], &bc_iupper[0], &var, &bvalues[0]); #else HYPRE_SStructVectorSetBoxValues(b, part, bc_ilower, bc_iupper, var, bvalues); #endif } /* Processors at x = 1 */ if (pi == N - 1) { bc_ilower[0] = pi * n + n - 1; bc_ilower[1] = pj * n; bc_iupper[0] = bc_ilower[0]; bc_iupper[1] = bc_ilower[1] + n - 1; /* Modify the matrix */ #ifdef HYPRE_FORTRAN HYPRE_SStructMatrixSetBoxValues(&A, &part, &bc_ilower[0], &bc_iupper[0], &var, &nentries, &stencil_indices[0], &values[0]); #else HYPRE_SStructMatrixSetBoxValues(A, part, bc_ilower, bc_iupper, var, nentries, stencil_indices, values); #endif /* Put the boundary conditions in b */ for (j = 0; j < n; j++) { bvalues[j] = bcEval(U0, 0, j); } #ifdef HYPRE_FORTRAN HYPRE_SStructVectorSetBoxValues(&b, &part, &bc_ilower[0], &bc_iupper[0], &var, &bvalues[0]); #else HYPRE_SStructVectorSetBoxValues(b, part, bc_ilower, bc_iupper, var, bvalues); #endif } /* Recall that the system we are solving is: [A_ii 0; 0 I] [x_i ; x_b] = [b_i - A_ib u_0; u_0]. This requires removing the connections between the interior and boundary nodes that we have set up when we set the 5pt stencil at each node. We adjust for removing these connections by appropriately modifying the rhs. For the symm ordering scheme, just do the top and right boundary */ /* Processors at y = 0, neighbors of boundary nodes */ if (pj == 0) { bc_ilower[0] = pi * n; bc_ilower[1] = pj * n + 1; bc_iupper[0] = bc_ilower[0] + n - 1; bc_iupper[1] = bc_ilower[1]; stencil_indices[0] = 3; /* Modify the matrix */ for (i = 0; i < n; i++) { bvalues[i] = 0.0; } if (sym == 0) #ifdef HYPRE_FORTRAN HYPRE_SStructMatrixSetBoxValues(&A, &part, &bc_ilower[0], &bc_iupper[0], &var, &one, &stencil_indices[0], &bvalues[0]); #else HYPRE_SStructMatrixSetBoxValues(A, part, bc_ilower, bc_iupper, var, 1, stencil_indices, bvalues); #endif /* Eliminate the boundary conditions in b */ for (i = 0; i < n; i++) { bvalues[i] = bcEval(U0, i, -1) * (bcEval(K, i, -0.5) + bcEval(B2, i, -0.5)); } if (pi == 0) { bvalues[0] = 0.0; } if (pi == N - 1) { bvalues[n - 1] = 0.0; } /* Note the use of AddToBoxValues (because we have already set values at these nodes) */ #ifdef HYPRE_FORTRAN HYPRE_SStructVectorAddToBoxValues(&b, &part, &bc_ilower[0], &bc_iupper[0], &var, &bvalues[0]); #else HYPRE_SStructVectorAddToBoxValues(b, part, bc_ilower, bc_iupper, var, bvalues); #endif } /* Processors at x = 0, neighbors of boundary nodes */ if (pi == 0) { bc_ilower[0] = pi * n + 1; bc_ilower[1] = pj * n; bc_iupper[0] = bc_ilower[0]; bc_iupper[1] = bc_ilower[1] + n - 1; stencil_indices[0] = 1; /* Modify the matrix */ for (j = 0; j < n; j++) { bvalues[j] = 0.0; } if (sym == 0) #ifdef HYPRE_FORTRAN HYPRE_SStructMatrixSetBoxValues(&A, &part, &bc_ilower[0], &bc_iupper[0], &var, &one, &stencil_indices[0], &bvalues[0]); #else HYPRE_SStructMatrixSetBoxValues(A, part, bc_ilower, bc_iupper, var, 1, stencil_indices, bvalues); #endif /* Eliminate the boundary conditions in b */ for (j = 0; j < n; j++) { bvalues[j] = bcEval(U0, -1, j) * (bcEval(K, -0.5, j) + bcEval(B1, -0.5, j)); } if (pj == 0) { bvalues[0] = 0.0; } if (pj == N - 1) { bvalues[n - 1] = 0.0; } #ifdef HYPRE_FORTRAN HYPRE_SStructVectorAddToBoxValues(&b, &part, &bc_ilower[0], &bc_iupper[0], &var, &bvalues[0]); #else HYPRE_SStructVectorAddToBoxValues(b, part, bc_ilower, bc_iupper, var, bvalues); #endif } /* Processors at y = 1, neighbors of boundary nodes */ if (pj == N - 1) { bc_ilower[0] = pi * n; bc_ilower[1] = pj * n + (n - 1) - 1; bc_iupper[0] = bc_ilower[0] + n - 1; bc_iupper[1] = bc_ilower[1]; if (sym == 0) { stencil_indices[0] = 4; } else { stencil_indices[0] = 2; } /* Modify the matrix */ for (i = 0; i < n; i++) { bvalues[i] = 0.0; } #ifdef HYPRE_FORTRAN HYPRE_SStructMatrixSetBoxValues(&A, &part, &bc_ilower[0], &bc_iupper[0], &var, &one, &stencil_indices[0], &bvalues[0]); #else HYPRE_SStructMatrixSetBoxValues(A, part, bc_ilower, bc_iupper, var, 1, stencil_indices, bvalues); #endif /* Eliminate the boundary conditions in b */ for (i = 0; i < n; i++) { bvalues[i] = bcEval(U0, i, 1) * (bcEval(K, i, 0.5) + bcEval(B2, i, 0.5)); } if (pi == 0) { bvalues[0] = 0.0; } if (pi == N - 1) { bvalues[n - 1] = 0.0; } #ifdef HYPRE_FORTRAN HYPRE_SStructVectorAddToBoxValues(&b, &part, &bc_ilower[0], &bc_iupper[0], &var, &bvalues[0]); #else HYPRE_SStructVectorAddToBoxValues(b, part, bc_ilower, bc_iupper, var, bvalues); #endif } /* Processors at x = 1, neighbors of boundary nodes */ if (pi == N - 1) { bc_ilower[0] = pi * n + (n - 1) - 1; bc_ilower[1] = pj * n; bc_iupper[0] = bc_ilower[0]; bc_iupper[1] = bc_ilower[1] + n - 1; if (sym == 0) { stencil_indices[0] = 2; } else { stencil_indices[0] = 1; } /* Modify the matrix */ for (j = 0; j < n; j++) { bvalues[j] = 0.0; } #ifdef HYPRE_FORTRAN HYPRE_SStructMatrixSetBoxValues(&A, &part, &bc_ilower[0], &bc_iupper[0], &var, &one, &stencil_indices[0], &bvalues[0]); #else HYPRE_SStructMatrixSetBoxValues(A, part, bc_ilower, bc_iupper, var, 1, stencil_indices, bvalues); #endif /* Eliminate the boundary conditions in b */ for (j = 0; j < n; j++) { bvalues[j] = bcEval(U0, 1, j) * (bcEval(K, 0.5, j) + bcEval(B1, 0.5, j)); } if (pj == 0) { bvalues[0] = 0.0; } if (pj == N - 1) { bvalues[n - 1] = 0.0; } #ifdef HYPRE_FORTRAN HYPRE_SStructVectorAddToBoxValues(&b, &part, &bc_ilower[0], &bc_iupper[0], &var, &bvalues[0]); #else HYPRE_SStructVectorAddToBoxValues(b, part, bc_ilower, bc_iupper, var, bvalues); #endif } hypre_TFree(values, HYPRE_MEMORY_HOST); hypre_TFree(bvalues, HYPRE_MEMORY_HOST); } /* Finalize the vector and matrix assembly */ #ifdef HYPRE_FORTRAN HYPRE_SStructMatrixAssemble(&A); HYPRE_SStructVectorAssemble(&b); HYPRE_SStructVectorAssemble(&x); #else HYPRE_SStructMatrixAssemble(A); HYPRE_SStructVectorAssemble(b); HYPRE_SStructVectorAssemble(x); #endif /* 6. Set up and use a solver */ { #ifdef HYPRE_FORTRAN hypre_F90_Obj sA; hypre_F90_Obj sb; hypre_F90_Obj sx; #else HYPRE_StructMatrix sA; HYPRE_StructVector sb; HYPRE_StructVector sx; #endif /* Because we are using a struct solver, we need to get the object of the matrix and vectors to pass in to the struct solvers */ #ifdef HYPRE_FORTRAN HYPRE_SStructMatrixGetObject(&A, &sA); HYPRE_SStructVectorGetObject(&b, &sb); HYPRE_SStructVectorGetObject(&x, &sx); #else HYPRE_SStructMatrixGetObject(A, (void **) &sA); HYPRE_SStructVectorGetObject(b, (void **) &sb); HYPRE_SStructVectorGetObject(x, (void **) &sx); #endif if (solver_id == 0) /* SMG */ { /* Start timing */ time_index = hypre_InitializeTiming("SMG Setup"); hypre_BeginTiming(time_index); /* Options and setup */ #ifdef HYPRE_FORTRAN HYPRE_StructSMGCreate(&temp_COMM, &solver); HYPRE_StructSMGSetMemoryUse(&solver, &zero); HYPRE_StructSMGSetMaxIter(&solver, &fifty); HYPRE_StructSMGSetTol(&solver, &tol); HYPRE_StructSMGSetRelChange(&solver, &zero); HYPRE_StructSMGSetNumPreRelax(&solver, &n_pre); HYPRE_StructSMGSetNumPostRelax(&solver, &n_post); HYPRE_StructSMGSetPrintLevel(&solver, &one); HYPRE_StructSMGSetLogging(&solver, &one); HYPRE_StructSMGSetup(&solver, &sA, &sb, &sx); #else HYPRE_StructSMGCreate(hypre_MPI_COMM_WORLD, &solver); HYPRE_StructSMGSetMemoryUse(solver, 0); HYPRE_StructSMGSetMaxIter(solver, 50); HYPRE_StructSMGSetTol(solver, 1.0e-06); HYPRE_StructSMGSetRelChange(solver, 0); HYPRE_StructSMGSetNumPreRelax(solver, n_pre); HYPRE_StructSMGSetNumPostRelax(solver, n_post); HYPRE_StructSMGSetPrintLevel(solver, 1); HYPRE_StructSMGSetLogging(solver, 1); HYPRE_StructSMGSetup(solver, sA, sb, sx); #endif /* Finalize current timing */ hypre_EndTiming(time_index); hypre_PrintTiming("Setup phase times", hypre_MPI_COMM_WORLD); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); /* Start timing again */ time_index = hypre_InitializeTiming("SMG Solve"); hypre_BeginTiming(time_index); /* Solve */ #ifdef HYPRE_FORTRAN HYPRE_StructSMGSolve(&solver, &sA, &sb, &sx); #else HYPRE_StructSMGSolve(solver, sA, sb, sx); #endif hypre_EndTiming(time_index); /* Finalize current timing */ hypre_PrintTiming("Solve phase times", hypre_MPI_COMM_WORLD); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); /* Get info and release memory */ #ifdef HYPRE_FORTRAN HYPRE_StructSMGGetNumIterations(&solver, &num_iterations); HYPRE_StructSMGGetFinalRelativeResidualNorm(&solver, &final_res_norm); HYPRE_StructSMGDestroy(&solver); #else HYPRE_StructSMGGetNumIterations(solver, &num_iterations); HYPRE_StructSMGGetFinalRelativeResidualNorm(solver, &final_res_norm); HYPRE_StructSMGDestroy(solver); #endif } if (solver_id == 1) /* PFMG */ { /* Start timing */ time_index = hypre_InitializeTiming("PFMG Setup"); hypre_BeginTiming(time_index); /* Options and setup */ #ifdef HYPRE_FORTRAN HYPRE_StructPFMGCreate(&temp_COMM, &solver); HYPRE_StructPFMGSetMaxIter(&solver, &fifty); HYPRE_StructPFMGSetTol(&solver, &tol); HYPRE_StructPFMGSetRelChange(&solver, &zero); HYPRE_StructPFMGSetRAPType(&solver, &rap); HYPRE_StructPFMGSetRelaxType(&solver, &relax); HYPRE_StructPFMGSetNumPreRelax(&solver, &n_pre); HYPRE_StructPFMGSetNumPostRelax(&solver, &n_post); HYPRE_StructPFMGSetSkipRelax(&solver, &skip); HYPRE_StructPFMGSetPrintLevel(&solver, &one); HYPRE_StructPFMGSetLogging(&solver, &one); HYPRE_StructPFMGSetup(&solver, &sA, &sb, &sx); #else HYPRE_StructPFMGCreate(hypre_MPI_COMM_WORLD, &solver); HYPRE_StructPFMGSetMaxIter(solver, 50); HYPRE_StructPFMGSetTol(solver, 1.0e-06); HYPRE_StructPFMGSetRelChange(solver, 0); HYPRE_StructPFMGSetRAPType(solver, rap); HYPRE_StructPFMGSetRelaxType(solver, relax); HYPRE_StructPFMGSetNumPreRelax(solver, n_pre); HYPRE_StructPFMGSetNumPostRelax(solver, n_post); HYPRE_StructPFMGSetSkipRelax(solver, skip); HYPRE_StructPFMGSetPrintLevel(solver, 1); HYPRE_StructPFMGSetLogging(solver, 1); HYPRE_StructPFMGSetup(solver, sA, sb, sx); #endif /* Finalize current timing */ hypre_EndTiming(time_index); hypre_PrintTiming("Setup phase times", hypre_MPI_COMM_WORLD); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); /* Start timing again */ time_index = hypre_InitializeTiming("PFMG Solve"); hypre_BeginTiming(time_index); /* Solve */ #ifdef HYPRE_FORTRAN HYPRE_StructPFMGSolve(&solver, &sA, &sb, &sx); #else HYPRE_StructPFMGSolve(solver, sA, sb, sx); #endif /* Finalize current timing */ hypre_EndTiming(time_index); hypre_PrintTiming("Solve phase times", hypre_MPI_COMM_WORLD); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); /* Get info and release memory */ #ifdef HYPRE_FORTRAN HYPRE_StructPFMGGetNumIterations(&solver, &num_iterations); HYPRE_StructPFMGGetFinalRelativeResidualNorm(&solver, &final_res_norm); HYPRE_StructPFMGDestroy(&solver); #else HYPRE_StructPFMGGetNumIterations(solver, &num_iterations); HYPRE_StructPFMGGetFinalRelativeResidualNorm(solver, &final_res_norm); HYPRE_StructPFMGDestroy(solver); #endif } /* Preconditioned CG */ if ((solver_id > 9) && (solver_id < 20)) { time_index = hypre_InitializeTiming("PCG Setup"); hypre_BeginTiming(time_index); #ifdef HYPRE_FORTRAN HYPRE_StructPCGCreate(&temp_COMM, &solver); HYPRE_StructPCGSetMaxIter(&solver, &twohundred ); HYPRE_StructPCGSetTol(&solver, &tol ); HYPRE_StructPCGSetTwoNorm(&solver, &one ); HYPRE_StructPCGSetRelChange(&solver, &zero ); HYPRE_StructPCGSetPrintLevel(&solver, &two ); #else HYPRE_StructPCGCreate(hypre_MPI_COMM_WORLD, &solver); HYPRE_StructPCGSetMaxIter(solver, 200 ); HYPRE_StructPCGSetTol(solver, 1.0e-06 ); HYPRE_StructPCGSetTwoNorm(solver, 1 ); HYPRE_StructPCGSetRelChange(solver, 0 ); HYPRE_StructPCGSetPrintLevel(solver, 2 ); #endif if (solver_id == 10) { /* use symmetric SMG as preconditioner */ #ifdef HYPRE_FORTRAN HYPRE_StructSMGCreate(&temp_COMM, &precond); HYPRE_StructSMGSetMemoryUse(&precond, &zero); HYPRE_StructSMGSetMaxIter(&precond, &one); HYPRE_StructSMGSetTol(&precond, &zerodot); HYPRE_StructSMGSetZeroGuess(&precond); HYPRE_StructSMGSetNumPreRelax(&precond, &n_pre); HYPRE_StructSMGSetNumPostRelax(&precond, &n_post); HYPRE_StructSMGSetPrintLevel(&precond, &zero); HYPRE_StructSMGSetLogging(&precond, &zero); precond_id = 0; HYPRE_StructPCGSetPrecond(&solver, &precond_id, &precond); #else HYPRE_StructSMGCreate(hypre_MPI_COMM_WORLD, &precond); HYPRE_StructSMGSetMemoryUse(precond, 0); HYPRE_StructSMGSetMaxIter(precond, 1); HYPRE_StructSMGSetTol(precond, 0.0); HYPRE_StructSMGSetZeroGuess(precond); HYPRE_StructSMGSetNumPreRelax(precond, n_pre); HYPRE_StructSMGSetNumPostRelax(precond, n_post); HYPRE_StructSMGSetPrintLevel(precond, 0); HYPRE_StructSMGSetLogging(precond, 0); HYPRE_StructPCGSetPrecond(solver, HYPRE_StructSMGSolve, HYPRE_StructSMGSetup, precond); #endif } else if (solver_id == 11) { /* use symmetric PFMG as preconditioner */ #ifdef HYPRE_FORTRAN HYPRE_StructPFMGCreate(&temp_COMM, &precond); HYPRE_StructPFMGSetMaxIter(&precond, &one); HYPRE_StructPFMGSetTol(&precond, &zerodot); HYPRE_StructPFMGSetZeroGuess(&precond); HYPRE_StructPFMGSetRAPType(&precond, &rap); HYPRE_StructPFMGSetRelaxType(&precond, &relax); HYPRE_StructPFMGSetNumPreRelax(&precond, &n_pre); HYPRE_StructPFMGSetNumPostRelax(&precond, &n_post); HYPRE_StructPFMGSetSkipRelax(&precond, &skip); HYPRE_StructPFMGSetPrintLevel(&precond, &zero); HYPRE_StructPFMGSetLogging(&precond, &zero); precond_id = 1; HYPRE_StructPCGSetPrecond(&solver, &precond_id, &precond); #else HYPRE_StructPFMGCreate(hypre_MPI_COMM_WORLD, &precond); HYPRE_StructPFMGSetMaxIter(precond, 1); HYPRE_StructPFMGSetTol(precond, 0.0); HYPRE_StructPFMGSetZeroGuess(precond); HYPRE_StructPFMGSetRAPType(precond, rap); HYPRE_StructPFMGSetRelaxType(precond, relax); HYPRE_StructPFMGSetNumPreRelax(precond, n_pre); HYPRE_StructPFMGSetNumPostRelax(precond, n_post); HYPRE_StructPFMGSetSkipRelax(precond, skip); HYPRE_StructPFMGSetPrintLevel(precond, 0); HYPRE_StructPFMGSetLogging(precond, 0); HYPRE_StructPCGSetPrecond(solver, HYPRE_StructPFMGSolve, HYPRE_StructPFMGSetup, precond); #endif } else if (solver_id == 17) { /* use two-step Jacobi as preconditioner */ #ifdef HYPRE_FORTRAN HYPRE_StructJacobiCreate(&temp_COMM, &precond); HYPRE_StructJacobiSetMaxIter(&precond, &two); HYPRE_StructJacobiSetTol(&precond, &zerodot); HYPRE_StructJacobiSetZeroGuess(&precond); precond_id = 7; HYPRE_StructPCGSetPrecond(&solver, &precond_id, &precond); #else HYPRE_StructJacobiCreate(hypre_MPI_COMM_WORLD, &precond); HYPRE_StructJacobiSetMaxIter(precond, 2); HYPRE_StructJacobiSetTol(precond, 0.0); HYPRE_StructJacobiSetZeroGuess(precond); HYPRE_StructPCGSetPrecond( solver, HYPRE_StructJacobiSolve, HYPRE_StructJacobiSetup, precond); #endif } else if (solver_id == 18) { /* use diagonal scaling as preconditioner */ #ifdef HYPRE_FORTRAN precond_id = 8; HYPRE_StructPCGSetPrecond(&solver, &precond_id, &precond); #else precond = NULL; HYPRE_StructPCGSetPrecond(solver, HYPRE_StructDiagScale, HYPRE_StructDiagScaleSetup, precond); #endif } /* PCG Setup */ #ifdef HYPRE_FORTRAN HYPRE_StructPCGSetup(&solver, &sA, &sb, &sx ); #else HYPRE_StructPCGSetup(solver, sA, sb, sx ); #endif hypre_EndTiming(time_index); hypre_PrintTiming("Setup phase times", hypre_MPI_COMM_WORLD); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); time_index = hypre_InitializeTiming("PCG Solve"); hypre_BeginTiming(time_index); /* PCG Solve */ #ifdef HYPRE_FORTRAN HYPRE_StructPCGSolve(&solver, &sA, &sb, &sx ); #else HYPRE_StructPCGSolve(solver, sA, sb, sx); #endif hypre_EndTiming(time_index); hypre_PrintTiming("Solve phase times", hypre_MPI_COMM_WORLD); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); /* Get info and release memory */ #ifdef HYPRE_FORTRAN HYPRE_StructPCGGetNumIterations(&solver, &num_iterations ); HYPRE_StructPCGGetFinalRelativeResidualNorm(&solver, &final_res_norm ); HYPRE_StructPCGDestroy(&solver); #else HYPRE_StructPCGGetNumIterations( solver, &num_iterations ); HYPRE_StructPCGGetFinalRelativeResidualNorm( solver, &final_res_norm ); HYPRE_StructPCGDestroy(solver); #endif if (solver_id == 10) { #ifdef HYPRE_FORTRAN HYPRE_StructSMGDestroy(&precond); #else HYPRE_StructSMGDestroy(precond); #endif } else if (solver_id == 11 ) { #ifdef HYPRE_FORTRAN HYPRE_StructPFMGDestroy(&precond); #else HYPRE_StructPFMGDestroy(precond); #endif } else if (solver_id == 17) { #ifdef HYPRE_FORTRAN HYPRE_StructJacobiDestroy(&precond); #else HYPRE_StructJacobiDestroy(precond); #endif } } /* Preconditioned GMRES */ if ((solver_id > 29) && (solver_id < 40)) { time_index = hypre_InitializeTiming("GMRES Setup"); hypre_BeginTiming(time_index); #ifdef HYPRE_FORTRAN HYPRE_StructGMRESCreate(&temp_COMM, &solver); #else HYPRE_StructGMRESCreate(hypre_MPI_COMM_WORLD, &solver); #endif /* Note that GMRES can be used with all the interfaces - not just the struct. So here we demonstrate the more generic GMRES interface functions. Since we have chosen a struct solver then we must type cast to the more generic HYPRE_Solver when setting options with these generic functions. Note that one could declare the solver to be type HYPRE_Solver, and then the casting would not be necessary.*/ /* Using struct GMRES routines to test FORTRAN Interface --3/3/2006 */ #ifdef HYPRE_FORTRAN HYPRE_StructGMRESSetMaxIter(&solver, &fivehundred ); HYPRE_StructGMRESSetTol(&solver, &tol ); HYPRE_StructGMRESSetPrintLevel(&solver, &two ); HYPRE_StructGMRESSetLogging(&solver, &one ); #else HYPRE_StructGMRESSetMaxIter(solver, 500 ); HYPRE_StructGMRESSetTol(solver, 1.0e-6 ); HYPRE_StructGMRESSetPrintLevel(solver, 2 ); HYPRE_StructGMRESSetLogging(solver, 1 ); #endif if (solver_id == 30) { /* use symmetric SMG as preconditioner */ #ifdef HYPRE_FORTRAN HYPRE_StructSMGCreate(&temp_COMM, &precond); HYPRE_StructSMGSetMemoryUse(&precond, &zero); HYPRE_StructSMGSetMaxIter(&precond, &one); HYPRE_StructSMGSetTol(&precond, &zerodot); HYPRE_StructSMGSetZeroGuess(&precond); HYPRE_StructSMGSetNumPreRelax(&precond, &n_pre); HYPRE_StructSMGSetNumPostRelax(&precond, &n_post); HYPRE_StructSMGSetPrintLevel(&precond, &zero); HYPRE_StructSMGSetLogging(&precond, &zero); precond_id = 0; HYPRE_StructGMRESSetPrecond(&solver, &precond_id, &precond); #else HYPRE_StructSMGCreate(hypre_MPI_COMM_WORLD, &precond); HYPRE_StructSMGSetMemoryUse(precond, 0); HYPRE_StructSMGSetMaxIter(precond, 1); HYPRE_StructSMGSetTol(precond, 0.0); HYPRE_StructSMGSetZeroGuess(precond); HYPRE_StructSMGSetNumPreRelax(precond, n_pre); HYPRE_StructSMGSetNumPostRelax(precond, n_post); HYPRE_StructSMGSetPrintLevel(precond, 0); HYPRE_StructSMGSetLogging(precond, 0); HYPRE_StructGMRESSetPrecond(solver, HYPRE_StructSMGSolve, HYPRE_StructSMGSetup, precond); #endif } else if (solver_id == 31) { /* use symmetric PFMG as preconditioner */ #ifdef HYPRE_FORTRAN HYPRE_StructPFMGCreate(&temp_COMM, &precond); HYPRE_StructPFMGSetMaxIter(&precond, &one); HYPRE_StructPFMGSetTol(&precond, &zerodot); HYPRE_StructPFMGSetZeroGuess(&precond); HYPRE_StructPFMGSetRAPType(&precond, &rap); HYPRE_StructPFMGSetRelaxType(&precond, &relax); HYPRE_StructPFMGSetNumPreRelax(&precond, &n_pre); HYPRE_StructPFMGSetNumPostRelax(&precond, &n_post); HYPRE_StructPFMGSetSkipRelax(&precond, &skip); HYPRE_StructPFMGSetPrintLevel(&precond, &zero); HYPRE_StructPFMGSetLogging(&precond, &zero); precond_id = 1; HYPRE_StructGMRESSetPrecond(&solver, &precond_id, &precond); #else HYPRE_StructPFMGCreate(hypre_MPI_COMM_WORLD, &precond); HYPRE_StructPFMGSetMaxIter(precond, 1); HYPRE_StructPFMGSetTol(precond, 0.0); HYPRE_StructPFMGSetZeroGuess(precond); HYPRE_StructPFMGSetRAPType(precond, rap); HYPRE_StructPFMGSetRelaxType(precond, relax); HYPRE_StructPFMGSetNumPreRelax(precond, n_pre); HYPRE_StructPFMGSetNumPostRelax(precond, n_post); HYPRE_StructPFMGSetSkipRelax(precond, skip); HYPRE_StructPFMGSetPrintLevel(precond, 0); HYPRE_StructPFMGSetLogging(precond, 0); HYPRE_StructGMRESSetPrecond( solver, HYPRE_StructPFMGSolve, HYPRE_StructPFMGSetup, precond); #endif } else if (solver_id == 37) { /* use two-step Jacobi as preconditioner */ #ifdef HYPRE_FORTRAN HYPRE_StructJacobiCreate(&temp_COMM, &precond); HYPRE_StructJacobiSetMaxIter(&precond, &two); HYPRE_StructJacobiSetTol(&precond, &zerodot); HYPRE_StructJacobiSetZeroGuess(&precond); precond_id = 7; HYPRE_StructGMRESSetPrecond(&solver, &precond_id, &precond); #else HYPRE_StructJacobiCreate(hypre_MPI_COMM_WORLD, &precond); HYPRE_StructJacobiSetMaxIter(precond, 2); HYPRE_StructJacobiSetTol(precond, 0.0); HYPRE_StructJacobiSetZeroGuess(precond); HYPRE_StructGMRESSetPrecond( solver, HYPRE_StructJacobiSolve, HYPRE_StructJacobiSetup, precond); #endif } else if (solver_id == 38) { /* use diagonal scaling as preconditioner */ #ifdef HYPRE_FORTRAN precond_id = 8; HYPRE_StructGMRESSetPrecond(&solver, &precond_id, &precond); #else precond = NULL; HYPRE_StructGMRESSetPrecond( solver, HYPRE_StructDiagScale, HYPRE_StructDiagScaleSetup, precond); #endif } /* GMRES Setup */ #ifdef HYPRE_FORTRAN HYPRE_StructGMRESSetup(&solver, &sA, &sb, &sx ); #else HYPRE_StructGMRESSetup(solver, sA, sb, sx ); #endif hypre_EndTiming(time_index); hypre_PrintTiming("Setup phase times", hypre_MPI_COMM_WORLD); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); time_index = hypre_InitializeTiming("GMRES Solve"); hypre_BeginTiming(time_index); /* GMRES Solve */ #ifdef HYPRE_FORTRAN HYPRE_StructGMRESSolve(&solver, &sA, &sb, &sx ); #else HYPRE_StructGMRESSolve(solver, sA, sb, sx); #endif hypre_EndTiming(time_index); hypre_PrintTiming("Solve phase times", hypre_MPI_COMM_WORLD); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); /* Get info and release memory */ #ifdef HYPRE_FORTRAN HYPRE_StructGMRESGetNumIterations(&solver, &num_iterations); HYPRE_StructGMRESGetFinalRelativeResidualNorm(&solver, &final_res_norm); HYPRE_StructGMRESDestroy(&solver); #else HYPRE_StructGMRESGetNumIterations(solver, &num_iterations); HYPRE_StructGMRESGetFinalRelativeResidualNorm(solver, &final_res_norm); HYPRE_StructGMRESDestroy(solver); #endif if (solver_id == 30) { #ifdef HYPRE_FORTRAN HYPRE_StructSMGDestroy(&precond); #else HYPRE_StructSMGDestroy(precond); #endif } else if (solver_id == 31) { #ifdef HYPRE_FORTRAN HYPRE_StructPFMGDestroy(&precond); #else HYPRE_StructPFMGDestroy(precond); #endif } else if (solver_id == 37) { #ifdef HYPRE_FORTRAN HYPRE_StructJacobiDestroy(&precond); #else HYPRE_StructJacobiDestroy(precond); #endif } } } /* Print the solution and other info */ if (print_solution) #ifdef HYPRE_FORTRAN HYPRE_SStructVectorPrint("sstruct.out.x", &x, &zero); #else HYPRE_SStructVectorPrint("sstruct.out.x", x, 0); #endif if (myid == 0) { hypre_printf("\n"); hypre_printf("Iterations = %d\n", num_iterations); hypre_printf("Final Relative Residual Norm = %e\n", final_res_norm); hypre_printf("\n"); } /* Free memory */ #ifdef HYPRE_FORTRAN HYPRE_SStructGridDestroy(&grid); HYPRE_SStructStencilDestroy(&stencil); HYPRE_SStructGraphDestroy(&graph); HYPRE_SStructMatrixDestroy(&A); HYPRE_SStructVectorDestroy(&b); HYPRE_SStructVectorDestroy(&x); #else HYPRE_SStructGridDestroy(grid); HYPRE_SStructStencilDestroy(stencil); HYPRE_SStructGraphDestroy(graph); HYPRE_SStructMatrixDestroy(A); HYPRE_SStructVectorDestroy(b); HYPRE_SStructVectorDestroy(x); #endif /* Finalize MPI */ hypre_MPI_Finalize(); return (0); } hypre-2.33.0/src/test/f77_ij.f000066400000000000000000001067631477326011500157530ustar00rootroot00000000000000! Copyright (c) 1998 Lawrence Livermore National Security, LLC and other ! HYPRE Project Developers. See the top-level COPYRIGHT file for details. ! ! SPDX-License-Identifier: (Apache-2.0 OR MIT) !----------------------------------------------------------------------- ! Test driver for unstructured matrix interface (structured storage) !----------------------------------------------------------------------- !----------------------------------------------------------------------- ! Standard 7-point laplacian in 3D with grid and anisotropy determined ! as user settings. !----------------------------------------------------------------------- program test implicit none include 'mpif.h' integer MAXZONS, MAXBLKS, MAXDIM, MAXLEVELS integer HYPRE_PARCSR parameter (MAXZONS=4194304) parameter (MAXBLKS=32) parameter (MAXDIM=3) parameter (MAXLEVELS=25) parameter (HYPRE_PARCSR=5555) integer num_procs, myid integer dim integer nx, ny, nz integer Px, Py, Pz integer bx, by, bz double precision cx, cy, cz integer n_pre, n_post integer solver_id integer precond_id integer setup_type integer debug_flag, ioutdat, k_dim integer nlevels integer zero, one parameter (zero = 0, one = 1) integer maxiter, num_iterations integer generate_matrix, generate_rhs character matfile(32), vecfile(32) character*31 matfile_str, vecfile_str double precision tol, pc_tol, convtol parameter (pc_tol = 0.0) double precision final_res_norm ! parameters for BoomerAMG integer hybrid, coarsen_type, measure_type integer cycle_type integer smooth_num_sweep integer*8 num_grid_sweeps ! integer*8 num_grid_sweeps2(4) integer*8 grid_relax_type integer*8 grid_relax_points integer*8 relax_weights double precision strong_threshold, trunc_factor, drop_tol double precision max_row_sum data max_row_sum /1.0/ ! parameters for ParaSails double precision sai_threshold double precision sai_filter integer*8 A, A_storage integer*8 b, b_storage integer*8 x, x_storage integer*8 solver integer*8 precond integer*8 precond_gotten integer*8 row_starts double precision values(4) integer p, q, r integer ierr integer i integer first_local_row, last_local_row integer first_local_col, last_local_col integer indices(MAXZONS) double precision vals(MAXZONS) ! integer dof_func(1000), j !----------------------------------------------------------------------- ! Initialize MPI !----------------------------------------------------------------------- call MPI_INIT(ierr) call MPI_COMM_RANK(MPI_COMM_WORLD, myid, ierr) call MPI_COMM_SIZE(MPI_COMM_WORLD, num_procs, ierr) !----------------------------------------------------------------------- ! Set defaults !----------------------------------------------------------------------- dim = 3 nx = 10 ny = 10 nz = 10 Px = num_procs Py = 1 Pz = 1 bx = 1 by = 1 bz = 1 cx = 1.0 cy = 1.0 cz = 1.0 n_pre = 1 n_post = 1 solver_id = 3 !----------------------------------------------------------------------- ! Read options !----------------------------------------------------------------------- ! open( 5, file='parcsr_linear_solver.in', status='old') ! ! read( 5, *) dim ! ! read( 5, *) nx ! read( 5, *) ny ! read( 5, *) nz ! ! read( 5, *) Px ! read( 5, *) Py ! read( 5, *) Pz ! ! read( 5, *) bx ! read( 5, *) by ! read( 5, *) bz ! ! read( 5, *) cx ! read( 5, *) cy ! read( 5, *) cz ! ! read( 5, *) n_pre ! read( 5, *) n_post ! ! write(6,*) 'Generate matrix? !0 yes, 0 no (from file)' read(5,*) generate_matrix if (generate_matrix .eq. 0) then ! write(6,*) 'What file to use for matrix (<= 31 chars)?' read(5,*) matfile_str i = 1 100 if (matfile_str(i:i) .ne. ' ') then matfile(i) = matfile_str(i:i) else goto 200 endif i = i + 1 goto 100 200 matfile(i) = char(0) endif ! write(6,*) 'Generate right-hand side? !0 yes, 0 no (from file)' read(5,*) generate_rhs if (generate_rhs .eq. 0) then ! write(6,*) ! & 'What file to use for right-hand side (<= 31 chars)?' read(5,*) vecfile_str i = 1 300 if (vecfile_str(i:i) .ne. ' ') then vecfile(i) = vecfile_str(i:i) else goto 400 endif i = i + 1 goto 300 400 vecfile(i) = char(0) endif ! write(6,*) 'What solver_id?' ! write(6,*) '0 AMG, 1 AMG-PCG, 2 DS-PCG, 3 AMG-GMRES, 4 DS-GMRES,' ! write(6,*) '5 AMG-CGNR, 6 DS-CGNR, 7 PILUT-GMRES, 8 ParaSails-GMRES,' ! write(6,*) '9 AMG-BiCGSTAB, 10 DS-BiCGSTAB' read(5,*) solver_id if (solver_id .eq. 7) then ! write(6,*) 'What drop tolerance? <0 do not drop' read(5,*) drop_tol endif ! write(6,*) 'What relative residual norm tolerance?' read(5,*) tol ! close( 5 ) !----------------------------------------------------------------------- ! Check a few things !----------------------------------------------------------------------- if ((Px*Py*Pz) .ne. num_procs) then print *, 'Error: Invalid number of processors or topology' stop endif if ((dim .lt. 1) .or. (dim .gt. 3)) then print *, 'Error: Invalid problem dimension' stop endif if ((nx*ny*nz) .gt. MAXZONS) then print *, 'Error: Invalid number of zones' stop endif if ((bx*by*bz) .gt. MAXBLKS) then print *, 'Error: Invalid number of blocks' stop endif !----------------------------------------------------------------------- ! Print driver parameters !----------------------------------------------------------------------- if (myid .eq. 0) then print *, 'Running with these driver parameters:' print *, ' (nx, ny, nz) = (', nx, ',', ny, ',', nz, ')' print *, ' (Px, Py, Pz) = (', Px, ',', Py, ',', Pz, ')' print *, ' (bx, by, bz) = (', bx, ',', by, ',', bz, ')' print *, ' (cx, cy, cz) = (', cx, ',', cy, ',', cz, ')' print *, ' (n_pre, n_post) = (', n_pre, ',', n_post, ')' print *, ' dim = ', dim endif !----------------------------------------------------------------------- ! Compute some grid and processor information !----------------------------------------------------------------------- if (dim .eq. 1) then ! compute p from Px and myid p = mod(myid,Px) elseif (dim .eq. 2) then ! compute p,q from Px, Py and myid p = mod(myid,Px) q = mod(((myid - p)/Px),Py) elseif (dim .eq. 3) then ! compute p,q,r from Px,Py,Pz and myid p = mod(myid,Px) q = mod((( myid - p)/Px),Py) r = (myid - (p + Px*q))/(Px*Py) endif !---------------------------------------------------------------------- ! Set up the matrix !----------------------------------------------------------------------- values(2) = -cx values(3) = -cy values(4) = -cz values(1) = 0.0 if (nx .gt. 1) values(1) = values(1) + 2d0*cx if (ny .gt. 1) values(1) = values(1) + 2d0*cy if (nz .gt. 1) values(1) = values(1) + 2d0*cz ! Generate a Dirichlet Laplacian if (generate_matrix .eq. 0) then call HYPRE_IJMatrixRead(matfile, MPI_COMM_WORLD, & HYPRE_PARCSR, A, ierr) call HYPRE_IJMatrixGetObject(A, A_storage, ierr) call HYPRE_ParCSRMatrixGetLocalRange(A_storage, & first_local_row, last_local_row, & first_local_col, last_local_col, ierr) else call HYPRE_GenerateLaplacian(MPI_COMM_WORLD, nx, ny, nz, & Px, Py, Pz, p, q, r, values, & A_storage, ierr) call HYPRE_ParCSRMatrixGetLocalRange(A_storage, & first_local_row, last_local_row, & first_local_col, last_local_col, ierr) call HYPRE_IJMatrixCreate(MPI_COMM_WORLD, & first_local_row, last_local_row, & first_local_col, last_local_col, A, ierr) call HYPRE_IJMatrixSetObject(A, A_storage, ierr) call HYPRE_IJMatrixSetObjectType(A, HYPRE_PARCSR, ierr) endif matfile(1) = 'd' matfile(2) = 'r' matfile(3) = 'i' matfile(4) = 'v' matfile(5) = 'e' matfile(6) = 'r' matfile(7) = '.' matfile(8) = 'o' matfile(9) = 'u' matfile(10) = 't' matfile(11) = '.' matfile(12) = 'A' matfile(13) = char(0) call HYPRE_IJMatrixPrint(A, matfile, ierr) call hypre_ParCSRMatrixRowStarts(A_storage, row_starts, ierr) !----------------------------------------------------------------------- ! Set up the rhs and initial guess !----------------------------------------------------------------------- if (generate_rhs .eq. 0) then call HYPRE_IJVectorRead(vecfile, MPI_COMM_WORLD, & HYPRE_PARCSR, b, ierr) call HYPRE_IJVectorGetObject(b, b_storage, ierr) else call HYPRE_IJVectorCreate(MPI_COMM_WORLD, first_local_col, & last_local_col, b, ierr) call HYPRE_IJVectorSetObjectType(b, HYPRE_PARCSR, ierr) call HYPRE_IJVectorInitialize(b, ierr) ! Set up a Dirichlet 0 problem do i = 1, last_local_col - first_local_col + 1 indices(i) = first_local_col - 1 + i vals(i) = 1. enddo call HYPRE_IJVectorSetValues(b, & last_local_col - first_local_col + 1, indices, vals, ierr) call HYPRE_IJVectorGetObject(b, b_storage, ierr) vecfile(1) = 'd' vecfile(2) = 'r' vecfile(3) = 'i' vecfile(4) = 'v' vecfile(5) = 'e' vecfile(6) = 'r' vecfile(7) = '.' vecfile(8) = 'o' vecfile(9) = 'u' vecfile(10) = 't' vecfile(11) = '.' vecfile(12) = 'b' vecfile(13) = char(0) call HYPRE_IJVectorPrint(b, vecfile, ierr) endif call HYPRE_IJVectorCreate(MPI_COMM_WORLD, first_local_col, & last_local_col, x, ierr) call HYPRE_IJVectorSetObjectType(x, HYPRE_PARCSR, ierr) call HYPRE_IJVectorInitialize(x, ierr) do i = 1, last_local_col - first_local_col + 1 indices(i) = first_local_col - 1 + i vals(i) = 0. enddo call HYPRE_IJVectorSetValues(x, & last_local_col - first_local_col + 1, indices, vals, ierr) ! Choose a nonzero initial guess call HYPRE_IJVectorGetObject(x, x_storage, ierr) vecfile(1) = 'd' vecfile(2) = 'r' vecfile(3) = 'i' vecfile(4) = 'v' vecfile(5) = 'e' vecfile(6) = 'r' vecfile(7) = '.' vecfile(8) = 'o' vecfile(9) = 'u' vecfile(10) = 't' vecfile(11) = '.' vecfile(12) = 'x' vecfile(13) = '0' vecfile(14) = char(0) call HYPRE_IJVectorPrint(x, vecfile, ierr) !----------------------------------------------------------------------- ! Solve the linear system !----------------------------------------------------------------------- ! General solver parameters, passing hard coded constants ! will break the interface. maxiter = 100 convtol = 0.9 debug_flag = 0 ioutdat = 1 if (solver_id .eq. 0) then ! Set defaults for BoomerAMG maxiter = 500 coarsen_type = 6 hybrid = 1 measure_type = 0 strong_threshold = 0.25 trunc_factor = 0.0 cycle_type = 1 smooth_num_sweep = 1 print *, 'Solver: AMG' call HYPRE_BoomerAMGCreate(solver, ierr) call HYPRE_BoomerAMGSetCoarsenType(solver, & (hybrid*coarsen_type), ierr) call HYPRE_BoomerAMGSetMeasureType(solver, measure_type, ierr) call HYPRE_BoomerAMGSetTol(solver, tol, ierr) call HYPRE_BoomerAMGSetStrongThrshld(solver, & strong_threshold, ierr) call HYPRE_BoomerAMGSetTruncFactor(solver, trunc_factor, ierr) call HYPRE_BoomerAMGSetPrintLevel(solver, ioutdat,ierr) call HYPRE_BoomerAMGSetPrintFileName(solver,"test.out.log",ierr) call HYPRE_BoomerAMGSetMaxIter(solver, maxiter, ierr) call HYPRE_BoomerAMGSetCycleType(solver, cycle_type, ierr) ! RDF: Used this to test the fortran interface for SetDofFunc ! do i = 1, 1000/2 ! j = 2*i-1 ! dof_func(j) = 0 ! j = j + 1 ! dof_func(j) = 1 ! enddo ! call HYPRE_BoomerAMGSetNumFunctions(solver, 2, ierr) ! call HYPRE_BoomerAMGSetDofFunc(solver, dof_func, ierr) ! call HYPRE_BoomerAMGInitGridRelaxatn(num_grid_sweeps, ! & grid_relax_type, ! & grid_relax_points, ! & coarsen_type, ! & relax_weights, ! & MAXLEVELS,ierr) ! num_grid_sweeps2(1) = 1 ! num_grid_sweeps2(2) = 1 ! num_grid_sweeps2(3) = 1 ! num_grid_sweeps2(4) = 1 ! call HYPRE_BoomerAMGSetNumGridSweeps(solver, ! & num_grid_sweeps2, ierr) ! call HYPRE_BoomerAMGSetGridRelaxType(solver, ! & grid_relax_type, ierr) ! call HYPRE_BoomerAMGSetRelaxWeight(solver, ! & relax_weights, ierr) ! call HYPRE_BoomerAMGSetSmoothOption(solver, smooth_option, ! & ierr) ! call HYPRE_BoomerAMGSetSmoothNumSwp(solver, smooth_num_sweep, ! & ierr) ! call HYPRE_BoomerAMGSetGridRelaxPnts(solver, ! & grid_relax_points, ! & ierr) call HYPRE_BoomerAMGSetMaxLevels(solver, MAXLEVELS, ierr) call HYPRE_BoomerAMGSetMaxRowSum(solver, max_row_sum, & ierr) call HYPRE_BoomerAMGSetDebugFlag(solver, debug_flag, ierr) call HYPRE_BoomerAMGSetup(solver, A_storage, b_storage, & x_storage, ierr) call HYPRE_BoomerAMGSolve(solver, A_storage, b_storage, & x_storage, ierr) call HYPRE_BoomerAMGGetNumIterations(solver, num_iterations, & ierr) call HYPRE_BoomerAMGGetFinalReltvRes(solver, final_res_norm, & ierr) call HYPRE_BoomerAMGDestroy(solver, ierr) endif if (solver_id .eq. 3 .or. solver_id .eq. 4 .or. & solver_id .eq. 7 .or. solver_id .eq. 8) then maxiter = 100 k_dim = 5 ! Solve the system using preconditioned GMRES call HYPRE_ParCSRGMRESCreate(MPI_COMM_WORLD, solver, ierr) call HYPRE_ParCSRGMRESSetKDim(solver, k_dim, ierr) call HYPRE_ParCSRGMRESSetMaxIter(solver, maxiter, ierr) call HYPRE_ParCSRGMRESSetTol(solver, tol, ierr) call HYPRE_ParCSRGMRESSetLogging(solver, one, ierr) if (solver_id .eq. 4) then print *, 'Solver: DS-GMRES' precond_id = 1 precond = 0 call HYPRE_ParCSRGMRESSetPrecond(solver, precond_id, & precond, ierr) else if (solver_id .eq. 3) then print *, 'Solver: AMG-GMRES' precond_id = 2 ! Set defaults for BoomerAMG maxiter = 1 coarsen_type = 6 hybrid = 1 measure_type = 0 setup_type = 1 strong_threshold = 0.25 trunc_factor = 0.0 cycle_type = 1 smooth_num_sweep = 1 call HYPRE_BoomerAMGCreate(precond, ierr) call HYPRE_BoomerAMGSetTol(precond, pc_tol, ierr) call HYPRE_BoomerAMGSetCoarsenType(precond, & hybrid*coarsen_type, ierr) call HYPRE_BoomerAMGSetMeasureType(precond, measure_type, & ierr) call HYPRE_BoomerAMGSetStrongThrshld(precond, & strong_threshold, ierr) call HYPRE_BoomerAMGSetTruncFactor(precond, trunc_factor, & ierr) call HYPRE_BoomerAMGSetPrintLevel(precond, ioutdat, ierr) call HYPRE_BoomerAMGSetPrintFileName(precond, "test.out.log", & ierr) call HYPRE_BoomerAMGSetMaxIter(precond, maxiter, ierr) call HYPRE_BoomerAMGSetCycleType(precond, cycle_type, ierr) call HYPRE_BoomerAMGInitGridRelaxatn(num_grid_sweeps, & grid_relax_type, & grid_relax_points, & coarsen_type, & relax_weights, & MAXLEVELS,ierr) call HYPRE_BoomerAMGSetNumGridSweeps(precond, & num_grid_sweeps, ierr) call HYPRE_BoomerAMGSetGridRelaxType(precond, & grid_relax_type, ierr) call HYPRE_BoomerAMGSetRelaxWeight(precond, & relax_weights, ierr) ! call HYPRE_BoomerAMGSetSmoothOption(precond, smooth_option, ! & ierr) ! call HYPRE_BoomerAMGSetSmoothNumSwp(precond, smooth_num_sweep, ! & ierr) call HYPRE_BoomerAMGSetGridRelaxPnts(precond, & grid_relax_points, ierr) call HYPRE_BoomerAMGSetMaxLevels(precond, & MAXLEVELS, ierr) call HYPRE_BoomerAMGSetMaxRowSum(precond, max_row_sum, & ierr) call HYPRE_ParCSRGMRESSetPrecond(solver, precond_id, & precond, ierr) call HYPRE_BoomerAMGSetSetupType(precond,setup_type,ierr) else if (solver_id .eq. 7) then print *, 'Solver: Pilut-GMRES' precond_id = 3 call HYPRE_ParCSRPilutCreate(MPI_COMM_WORLD, & precond, ierr) if (ierr .ne. 0) write(6,*) 'ParCSRPilutCreate error' call HYPRE_ParCSRGMRESSetPrecond(solver, precond_id, & precond, ierr) if (drop_tol .ge. 0.) & call HYPRE_ParCSRPilutSetDropToleran(precond, & drop_tol, ierr) else if (solver_id .eq. 8) then print *, 'Solver: ParaSails-GMRES' precond_id = 4 call HYPRE_ParaSailsCreate(MPI_COMM_WORLD, precond, & ierr) call HYPRE_ParCSRGMRESSetPrecond(solver, precond_id, & precond, ierr) sai_threshold = 0.1 nlevels = 1 sai_filter = 0.1 call HYPRE_ParaSailsSetParams(precond, sai_threshold, & nlevels, ierr) call HYPRE_ParaSailsSetFilter(precond, sai_filter, ierr) call HYPRE_ParaSailsSetLogging(precond, ioutdat, ierr) endif call HYPRE_ParCSRGMRESGetPrecond(solver, precond_gotten, & ierr) if (precond_gotten .ne. precond) then print *, 'HYPRE_ParCSRGMRESGetPrecond got bad precond' stop else print *, 'HYPRE_ParCSRGMRESGetPrecond got good precond' endif call HYPRE_ParCSRGMRESSetup(solver, A_storage, b_storage, & x_storage, ierr) call HYPRE_ParCSRGMRESSolve(solver, A_storage, b_storage, & x_storage, ierr) call HYPRE_ParCSRGMRESGetNumIteratio(solver, & num_iterations, ierr) call HYPRE_ParCSRGMRESGetFinalRelati(solver, & final_res_norm, ierr) if (solver_id .eq. 3) then call HYPRE_BoomerAMGDestroy(precond, ierr) else if (solver_id .eq. 7) then call HYPRE_ParCSRPilutDestroy(precond, ierr) else if (solver_id .eq. 8) then call HYPRE_ParaSailsDestroy(precond, ierr) endif call HYPRE_ParCSRGMRESDestroy(solver, ierr) endif if (solver_id .eq. 1 .or. solver_id .eq. 2) then maxiter = 500 call HYPRE_ParCSRPCGCreate(MPI_COMM_WORLD, solver, ierr) call HYPRE_ParCSRPCGSetMaxIter(solver, maxiter, ierr) call HYPRE_ParCSRPCGSetTol(solver, tol, ierr) call HYPRE_ParCSRPCGSetTwoNorm(solver, one, ierr) call HYPRE_ParCSRPCGSetRelChange(solver, zero, ierr) call HYPRE_ParCSRPCGSetPrintLevel(solver, one, ierr) if (solver_id .eq. 2) then print *, 'Solver: DS-PCG' precond_id = 1 precond = 0 call HYPRE_ParCSRPCGSetPrecond(solver, precond_id, & precond, ierr) else if (solver_id .eq. 1) then print *, 'Solver: AMG-PCG' precond_id = 2 ! Set defaults for BoomerAMG maxiter = 1 coarsen_type = 6 hybrid = 1 measure_type = 0 setup_type = 1 strong_threshold = 0.25 trunc_factor = 0.0 cycle_type = 1 smooth_num_sweep = 1 call HYPRE_BoomerAMGCreate(precond, ierr) call HYPRE_BoomerAMGSetTol(precond, pc_tol, ierr) call HYPRE_BoomerAMGSetCoarsenType(precond, & (hybrid*coarsen_type), & ierr) call HYPRE_BoomerAMGSetMeasureType(precond, measure_type, & ierr) call HYPRE_BoomerAMGSetStrongThrshld(precond, & strong_threshold, & ierr) call HYPRE_BoomerAMGSetTruncFactor(precond, trunc_factor, & ierr) call HYPRE_BoomerAMGSetPrintLevel(precond, ioutdat,ierr) call HYPRE_BoomerAMGSetPrintFileName(precond, "test.out.log", & ierr) call HYPRE_BoomerAMGSetMaxIter(precond, maxiter, ierr) call HYPRE_BoomerAMGSetCycleType(precond, cycle_type, ierr) call HYPRE_BoomerAMGInitGridRelaxatn(num_grid_sweeps, & grid_relax_type, & grid_relax_points, & coarsen_type, & relax_weights, & MAXLEVELS, ierr) call HYPRE_BoomerAMGSetNumGridSweeps(precond, & num_grid_sweeps, ierr) call HYPRE_BoomerAMGSetGridRelaxType(precond, & grid_relax_type, ierr) call HYPRE_BoomerAMGSetRelaxWeight(precond, & relax_weights, ierr) ! call HYPRE_BoomerAMGSetSmoothOption(precond, smooth_option, ! & ierr) ! call HYPRE_BoomerAMGSetSmoothNumSwp(precond, ! & smooth_num_sweep, ! & ierr) call HYPRE_BoomerAMGSetGridRelaxPnts(precond, & grid_relax_points, ierr) call HYPRE_BoomerAMGSetMaxLevels(precond, MAXLEVELS, ierr) call HYPRE_BoomerAMGSetMaxRowSum(precond, max_row_sum, & ierr) call HYPRE_ParCSRPCGSetPrecond(solver, precond_id, & precond, ierr) endif call HYPRE_ParCSRPCGGetPrecond(solver,precond_gotten,ierr) if (precond_gotten .ne. precond) then print *, 'HYPRE_ParCSRPCGGetPrecond got bad precond' stop else print *, 'HYPRE_ParCSRPCGGetPrecond got good precond' endif call HYPRE_ParCSRPCGSetup(solver, A_storage, b_storage, & x_storage, ierr) call HYPRE_ParCSRPCGSolve(solver, A_storage, b_storage, & x_storage, ierr) call HYPRE_ParCSRPCGGetNumIterations(solver, num_iterations, & ierr) call HYPRE_ParCSRPCGGetFinalRelative(solver, final_res_norm, & ierr) if (solver_id .eq. 1) then call HYPRE_BoomerAMGDestroy(precond, ierr) endif call HYPRE_ParCSRPCGDestroy(solver, ierr) endif if (solver_id .eq. 5 .or. solver_id .eq. 6) then maxiter = 1000 call HYPRE_ParCSRCGNRCreate(MPI_COMM_WORLD, solver, ierr) call HYPRE_ParCSRCGNRSetMaxIter(solver, maxiter, ierr) call HYPRE_ParCSRCGNRSetTol(solver, tol, ierr) call HYPRE_ParCSRCGNRSetLogging(solver, one, ierr) if (solver_id .eq. 6) then print *, 'Solver: DS-CGNR' precond_id = 1 precond = 0 call HYPRE_ParCSRCGNRSetPrecond(solver, precond_id, & precond, ierr) else if (solver_id .eq. 5) then print *, 'Solver: AMG-CGNR' precond_id = 2 ! Set defaults for BoomerAMG maxiter = 1 coarsen_type = 6 hybrid = 1 measure_type = 0 setup_type = 1 strong_threshold = 0.25 trunc_factor = 0.0 cycle_type = 1 smooth_num_sweep = 1 call HYPRE_BoomerAMGCreate(precond, ierr) call HYPRE_BoomerAMGSetTol(precond, pc_tol, ierr) call HYPRE_BoomerAMGSetCoarsenType(precond, & (hybrid*coarsen_type), & ierr) call HYPRE_BoomerAMGSetMeasureType(precond, measure_type, & ierr) call HYPRE_BoomerAMGSetStrongThrshld(precond, & strong_threshold, ierr) call HYPRE_BoomerAMGSetTruncFactor(precond, trunc_factor, & ierr) call HYPRE_BoomerAMGSetPrintLevel(precond, ioutdat,ierr) call HYPRE_BoomerAMGSetPrintFileName(precond, "test.out.log", & ierr) call HYPRE_BoomerAMGSetMaxIter(precond, maxiter, ierr) call HYPRE_BoomerAMGSetCycleType(precond, cycle_type, ierr) call HYPRE_BoomerAMGInitGridRelaxatn(num_grid_sweeps, & grid_relax_type, & grid_relax_points, & coarsen_type, & relax_weights, & MAXLEVELS,ierr) call HYPRE_BoomerAMGSetNumGridSweeps(precond, & num_grid_sweeps, ierr) call HYPRE_BoomerAMGSetGridRelaxType(precond, & grid_relax_type, ierr) call HYPRE_BoomerAMGSetRelaxWeight(precond, & relax_weights, ierr) ! call HYPRE_BoomerAMGSetSmoothOption(precond, smooth_option, ! & ierr) ! call HYPRE_BoomerAMGSetSmoothNumSwp(precond, smooth_num_sweep, ! & ierr) call HYPRE_BoomerAMGSetGridRelaxPnts(precond, & grid_relax_points, & ierr) call HYPRE_BoomerAMGSetMaxLevels(precond, MAXLEVELS, ierr) call HYPRE_BoomerAMGSetMaxRowSum(precond, max_row_sum, & ierr) call HYPRE_ParCSRCGNRSetPrecond(solver, precond_id, precond, & ierr) endif call HYPRE_ParCSRCGNRGetPrecond(solver,precond_gotten,ierr) if (precond_gotten .ne. precond) then print *, 'HYPRE_ParCSRCGNRGetPrecond got bad precond' stop else print *, 'HYPRE_ParCSRCGNRGetPrecond got good precond' endif call HYPRE_ParCSRCGNRSetup(solver, A_storage, b_storage, & x_storage, ierr) call HYPRE_ParCSRCGNRSolve(solver, A_storage, b_storage, & x_storage, ierr) call HYPRE_ParCSRCGNRGetNumIteration(solver, num_iterations, & ierr) call HYPRE_ParCSRCGNRGetFinalRelativ(solver, final_res_norm, & ierr) if (solver_id .eq. 5) then call HYPRE_BoomerAMGDestroy(precond, ierr) endif call HYPRE_ParCSRCGNRDestroy(solver, ierr) endif if (solver_id .eq. 9 .or. solver_id .eq. 10) then maxiter = 1000 call HYPRE_ParCSRBiCGSTABCreate(MPI_COMM_WORLD, solver, ierr) call HYPRE_ParCSRBiCGSTABSetMaxIter(solver, maxiter, ierr) call HYPRE_ParCSRBiCGSTABSetTol(solver, tol, ierr) call HYPRE_ParCSRBiCGSTABSetLogging(solver, one, ierr) if (solver_id .eq. 10) then print *, 'Solver: DS-BiCGSTAB' precond_id = 1 precond = 0 call HYPRE_ParCSRBiCGSTABSetPrecond(solver, precond_id, & precond, ierr) else if (solver_id .eq. 9) then print *, 'Solver: AMG-BiCGSTAB' precond_id = 2 ! Set defaults for BoomerAMG maxiter = 1 coarsen_type = 6 hybrid = 1 measure_type = 0 setup_type = 1 strong_threshold = 0.25 trunc_factor = 0.0 cycle_type = 1 smooth_num_sweep = 1 call HYPRE_BoomerAMGCreate(precond, ierr) call HYPRE_BoomerAMGSetTol(precond, pc_tol, ierr) call HYPRE_BoomerAMGSetCoarsenType(precond, & (hybrid*coarsen_type), & ierr) call HYPRE_BoomerAMGSetMeasureType(precond, measure_type, & ierr) call HYPRE_BoomerAMGSetStrongThrshld(precond, & strong_threshold, & ierr) call HYPRE_BoomerAMGSetTruncFactor(precond, trunc_factor, & ierr) call HYPRE_BoomerAMGSetPrintLevel(precond, ioutdat,ierr) call HYPRE_BoomerAMGSetPrintFileName(precond, "test.out.log", & ierr) call HYPRE_BoomerAMGSetMaxIter(precond, maxiter, ierr) call HYPRE_BoomerAMGSetCycleType(precond, cycle_type, ierr) call HYPRE_BoomerAMGInitGridRelaxatn(num_grid_sweeps, & grid_relax_type, & grid_relax_points, & coarsen_type, & relax_weights, & MAXLEVELS, ierr) call HYPRE_BoomerAMGSetNumGridSweeps(precond, & num_grid_sweeps, ierr) call HYPRE_BoomerAMGSetGridRelaxType(precond, & grid_relax_type, ierr) call HYPRE_BoomerAMGSetRelaxWeight(precond, & relax_weights, ierr) ! call HYPRE_BoomerAMGSetSmoothOption(precond, smooth_option, ! & ierr) ! call HYPRE_BoomerAMGSetSmoothNumSwp(precond, smooth_num_sweep, ! & ierr) call HYPRE_BoomerAMGSetGridRelaxPnts(precond, & grid_relax_points, ierr) call HYPRE_BoomerAMGSetMaxLevels(precond, MAXLEVELS, ierr) call HYPRE_BoomerAMGSetMaxRowSum(precond, max_row_sum, & ierr) call HYPRE_ParCSRBiCGSTABSetPrecond(solver, precond_id, & precond, & ierr) endif call HYPRE_ParCSRBiCGSTABGetPrecond(solver,precond_gotten,ierr) if (precond_gotten .ne. precond) then print *, 'HYPRE_ParCSRBiCGSTABGetPrecond got bad precond' stop else print *, 'HYPRE_ParCSRBiCGSTABGetPrecond got good precond' endif call HYPRE_ParCSRBiCGSTABSetup(solver, A_storage, b_storage, & x_storage, ierr) call HYPRE_ParCSRBiCGSTABSolve(solver, A_storage, b_storage, & x_storage, ierr) call HYPRE_ParCSRBiCGSTABGetNumIter(solver, & num_iterations, & ierr) call HYPRE_ParCSRBiCGSTABGetFinalRel(solver, & final_res_norm, & ierr) if (solver_id .eq. 9) then call HYPRE_BoomerAMGDestroy(precond, ierr) endif call HYPRE_ParCSRBiCGSTABDestroy(solver, ierr) endif !----------------------------------------------------------------------- ! Print the solution and other info !----------------------------------------------------------------------- vecfile(1) = 'd' vecfile(2) = 'r' vecfile(3) = 'i' vecfile(4) = 'v' vecfile(5) = 'e' vecfile(6) = 'r' vecfile(7) = '.' vecfile(8) = 'o' vecfile(9) = 'u' vecfile(10) = 't' vecfile(11) = '.' vecfile(12) = 'x' vecfile(13) = char(0) call HYPRE_IJVectorPrint(x, vecfile, ierr) if (myid .eq. 0) then print *, 'Iterations = ', num_iterations print *, 'Final Residual Norm = ', final_res_norm endif !----------------------------------------------------------------------- ! Finalize things !----------------------------------------------------------------------- call HYPRE_ParCSRMatrixDestroy(A_storage, ierr) call HYPRE_IJVectorDestroy(b, ierr) call HYPRE_IJVectorDestroy(x, ierr) ! Finalize MPI call MPI_FINALIZE(ierr) stop end hypre-2.33.0/src/test/f77_struct.f000066400000000000000000001044401477326011500166630ustar00rootroot00000000000000! Copyright (c) 1998 Lawrence Livermore National Security, LLC and other ! HYPRE Project Developers. See the top-level COPYRIGHT file for details. ! ! SPDX-License-Identifier: (Apache-2.0 OR MIT) !----------------------------------------------------------------------- ! Test driver for structured matrix interface (structured storage) !----------------------------------------------------------------------- !----------------------------------------------------------------------- ! Standard 7-point laplacian in 3D with grid and anisotropy determined ! as user settings. !----------------------------------------------------------------------- program test implicit none include 'mpif.h' integer MAXZONS integer MAXBLKS integer MAXDIM parameter (MAXZONS=4194304) parameter (MAXBLKS=32) parameter (MAXDIM=3) integer num_procs, myid logical file_exists integer dim integer nx, ny, nz integer Px, Py, Pz integer bx, by, bz double precision cx, cy, cz integer n_pre, n_post integer slvr_id integer prec_id integer zero, one integer prec_iter integer slvr_iter integer dscg_iter double precision slvr_tol double precision prec_tol double precision convtol integer num_iterations double precision final_res_norm ! HYPRE_StructMatrix A ! HYPRE_StructVector b ! HYPRE_StructVector x integer*8 A integer*8 b integer*8 x ! HYPRE_StructSolver solver ! HYPRE_StructSolver precond integer*8 solver integer*8 precond ! HYPRE_StructGrid grid ! HYPRE_StructStencil stencil integer*8 grid integer*8 stencil double precision dxyz(3) integer A_num_ghost(6) integer iupper(3,MAXBLKS), ilower(3,MAXBLKS) integer istart(3) integer offsets(3,MAXDIM+1) integer stencil_indices(MAXDIM+1) double precision values((MAXDIM+1)*MAXZONS) integer p, q, r integer nblocks, volume integer i, s, d integer ix, iy, iz, ib integer ierr data A_num_ghost / 0, 0, 0, 0, 0, 0 / data zero / 0 / data one / 1 / !----------------------------------------------------------------------- ! Initialize MPI !----------------------------------------------------------------------- call MPI_INIT(ierr) call MPI_COMM_RANK(MPI_COMM_WORLD, myid, ierr) call MPI_COMM_SIZE(MPI_COMM_WORLD, num_procs, ierr) !----------------------------------------------------------------------- ! Set defaults !----------------------------------------------------------------------- dim = 3 nx = 10 ny = 10 nz = 10 Px = num_procs Py = 1 Pz = 1 bx = 1 by = 1 bz = 1 cx = 1.0 cy = 1.0 cz = 1.0 n_pre = 1 n_post = 1 slvr_id = 1 istart(1) = -3 istart(2) = -3 istart(3) = -3 !----------------------------------------------------------------------- ! Read options !----------------------------------------------------------------------- inquire(file='struct_linear_solver.in', exist=file_exists) if (file_exists) then open(5, file='struct_linear_solver.in', status='old') read(5, *) dim read(5, *) nx read(5, *) ny read(5, *) nz read(5, *) Px read(5, *) Py read(5, *) Pz read(5, *) bx read(5, *) by read(5, *) bz read(5, *) cx read(5, *) cy read(5, *) cz read(5, *) n_pre read(5, *) n_post read(5, *) slvr_id close(5) endif !----------------------------------------------------------------------- ! Check a few things !----------------------------------------------------------------------- if ((Px*Py*Pz) .ne. num_procs) then print *, 'Error: Invalid number of processors or topology' stop endif if ((dim .lt. 1) .or. (dim .gt. 3)) then print *, 'Error: Invalid problem dimension' stop endif if ((nx*ny*nz) .gt. MAXZONS) then print *, 'Error: Invalid number of zones' stop endif if ((bx*by*bz) .gt. MAXBLKS) then print *, 'Error: Invalid number of blocks' stop endif !----------------------------------------------------------------------- ! Print driver parameters !----------------------------------------------------------------------- if (myid .eq. 0) then write(*,*) write(*,'(a)') 'Running with these driver parameters:' write(*,'(3x,a,i0,a,i0,a,i0,a)') '(nx, ny, nz) = (', & nx, ', ', ny, ', ', nz, ')' write(*,'(3x,a,i0,a,i0,a,i0,a)') '(Px, Py, Pz) = (', & Px, ', ', Py, ', ', Pz, ')' write(*,'(3x,a,i0,a,i0,a,i0,a)') '(bx, by, bz) = (', & bx, ', ', by, ', ', bz, ')' write(*,'(3x,a,f0.1,a,f0.1,a,f0.1,a)') '(cx, cy, cz) = (', & cx, ', ', cy, ', ', cz, ')' write(*,'(3x,a,i0,a,i0,a)') '(n_pre, n_post) = (', & n_pre, ', ', n_post, ')' write(*,'(3x,a,i0)') 'dim = ', dim write(*,'(3x,a,i0)') 'solver ID = ', slvr_id write(*,*) endif !----------------------------------------------------------------------- ! Set up dxyz for PFMG solver !----------------------------------------------------------------------- dxyz(1) = dsqrt(1.d0 / cx) dxyz(2) = dsqrt(1.d0 / cy) dxyz(3) = dsqrt(1.d0 / cz) !----------------------------------------------------------------------- ! Compute some grid and processor information !----------------------------------------------------------------------- if (dim .eq. 1) then volume = nx nblocks = bx ! compute p from Px and myid p = mod(myid,Px) elseif (dim .eq. 2) then volume = nx*ny nblocks = bx*by ! compute p,q from Px, Py and myid p = mod(myid,Px) q = mod(((myid - p)/Px),Py) elseif (dim .eq. 3) then volume = nx*ny*nz nblocks = bx*by*bz ! compute p,q,r from Px,Py,Pz and myid p = mod(myid,Px) q = mod((( myid - p)/Px),Py) r = (myid - (p + Px*q))/(Px*Py) endif !---------------------------------------------------------------------- ! Compute ilower and iupper from (p,q,r), (bx,by,bz), and (nx,ny,nz) ! and set up the grid structure. !---------------------------------------------------------------------- ib = 1 if (dim .eq. 1) then do ix=0,bx-1 ilower(1,ib) = istart(1) + nx*(bx*p+ix) iupper(1,ib) = istart(1) + nx*(bx*p+ix+1)-1 ib = ib + 1 enddo elseif (dim .eq. 2) then do iy=0,by-1 do ix=0,bx-1 ilower(1,ib) = istart(1) + nx*(bx*p+ix) iupper(1,ib) = istart(1) + nx*(bx*p+ix+1)-1 ilower(2,ib) = istart(2) + ny*(by*q+iy) iupper(2,ib) = istart(2) + ny*(by*q+iy+1)-1 ib = ib + 1 enddo enddo elseif (dim .eq. 3) then do iz=0,bz-1 do iy=0,by-1 do ix=0,bx-1 ilower(1,ib) = istart(1) + nx*(bx*p+ix) iupper(1,ib) = istart(1) + nx*(bx*p+ix+1)-1 ilower(2,ib) = istart(2) + ny*(by*q+iy) iupper(2,ib) = istart(2) + ny*(by*q+iy+1)-1 ilower(3,ib) = istart(3) + nz*(bz*r+iz) iupper(3,ib) = istart(3) + nz*(bz*r+iz+1)-1 ib = ib + 1 enddo enddo enddo endif call HYPRE_StructGridCreate(MPI_COMM_WORLD, dim, grid, ierr) do ib=1,nblocks call HYPRE_StructGridSetExtents(grid, ilower(1,ib), & iupper(1,ib), ierr) enddo call HYPRE_StructGridAssemble(grid, ierr) !---------------------------------------------------------------------- ! Compute the offsets and set up the stencil structure. !---------------------------------------------------------------------- if (dim .eq. 1) then offsets(1,1) = -1 offsets(1,2) = 0 elseif (dim .eq. 2) then offsets(1,1) = -1 offsets(2,1) = 0 offsets(1,2) = 0 offsets(2,2) = -1 offsets(1,3) = 0 offsets(2,3) = 0 elseif (dim .eq. 3) then offsets(1,1) = -1 offsets(2,1) = 0 offsets(3,1) = 0 offsets(1,2) = 0 offsets(2,2) = -1 offsets(3,2) = 0 offsets(1,3) = 0 offsets(2,3) = 0 offsets(3,3) = -1 offsets(1,4) = 0 offsets(2,4) = 0 offsets(3,4) = 0 endif call HYPRE_StructStencilCreate(dim, (dim+1), stencil, ierr) do s=1,dim+1 call HYPRE_StructStencilSetElement(stencil, (s - 1), & offsets(1,s), ierr) enddo !----------------------------------------------------------------------- ! Set up the matrix structure !----------------------------------------------------------------------- do i=1,dim A_num_ghost(2*i - 1) = 1 A_num_ghost(2*i) = 1 enddo call HYPRE_StructMatrixCreate(MPI_COMM_WORLD, grid, stencil, & A, ierr) call HYPRE_StructMatrixSetSymmetric(A, 1, ierr) call HYPRE_StructMatrixSetNumGhost(A, A_num_ghost, ierr) call HYPRE_StructMatrixInitialize(A, ierr) !----------------------------------------------------------------------- ! Set the coefficients for the grid !----------------------------------------------------------------------- do s=1,(dim + 1) stencil_indices(s) = s - 1 enddo do i=1,(dim + 1)*volume,(dim + 1) if (dim .eq. 1) then values(i ) = -cx values(i+1) = 2.0*(cx) elseif (dim .eq. 2) then values(i ) = -cx values(i+1) = -cy values(i+2) = 2.0*(cx+cy) elseif (dim .eq. 3) then values(i ) = -cx values(i+1) = -cy values(i+2) = -cz values(i+3) = 2.0*(cx+cy+cz) endif enddo do ib=1,nblocks call HYPRE_StructMatrixSetBoxValues(A, ilower(1,ib), & iupper(1,ib), (dim+1), stencil_indices, values, ierr) enddo !----------------------------------------------------------------------- ! Zero out stencils reaching to real boundary !----------------------------------------------------------------------- do i=1,volume values(i) = 0.0 enddo do d=1,dim do ib=1,nblocks if( ilower(d,ib) .eq. istart(d) ) then i = iupper(d,ib) iupper(d,ib) = istart(d) stencil_indices(1) = d - 1 call HYPRE_StructMatrixSetBoxValues(A, ilower(1,ib), & iupper(1,ib), 1, stencil_indices, values, ierr) iupper(d,ib) = i endif enddo enddo call HYPRE_StructMatrixAssemble(A, ierr) ! call HYPRE_StructMatrixPrint(A, zero, ierr) ! call HYPRE_StructMatrixPrint("driver.out.A", A, zero, ierr) !----------------------------------------------------------------------- ! Set up the rhs and initial guess !----------------------------------------------------------------------- call HYPRE_StructVectorCreate(MPI_COMM_WORLD, grid, b, ierr) call HYPRE_StructVectorInitialize(b, ierr) do i=1,volume values(i) = 1.0 enddo do ib=1,nblocks call HYPRE_StructVectorSetBoxValues(b, ilower(1,ib), & iupper(1,ib), values, ierr) enddo call HYPRE_StructVectorAssemble(b, ierr) ! call HYPRE_StructVectorPrint("driver.out.b", b, zero, ierr) call HYPRE_StructVectorCreate(MPI_COMM_WORLD, grid, x, ierr) call HYPRE_StructVectorInitialize(x, ierr) do i=1,volume values(i) = 0.0 enddo do ib=1,nblocks call HYPRE_StructVectorSetBoxValues(x, ilower(1,ib), & iupper(1,ib), values, ierr) enddo call HYPRE_StructVectorAssemble(x, ierr) ! call HYPRE_StructVectorPrint(x, zero, ierr) ! call HYPRE_StructVectorPrint("driver.out.x0", x, zero, ierr) !----------------------------------------------------------------------- ! Solve the linear system !----------------------------------------------------------------------- ! General solver parameters, passing hard coded constants ! will break the interface. slvr_iter = 50 prec_iter = 1 dscg_iter = 100 slvr_tol = 0.000001 prec_tol = 0.0 convtol = 0.9 prec_id = -1 if (slvr_id .eq. 0) then ! Solve the system using SMG call HYPRE_StructSMGCreate(MPI_COMM_WORLD, solver, ierr) call HYPRE_StructSMGSetMemoryUse(solver, zero, ierr) call HYPRE_StructSMGSetMaxIter(solver, slvr_iter, ierr) call HYPRE_StructSMGSetTol(solver, slvr_tol, ierr) call HYPRE_StructSMGSetRelChange(solver, zero, ierr) call HYPRE_StructSMGSetNumPreRelax(solver, n_pre, ierr) call HYPRE_StructSMGSetNumPostRelax(solver, n_post, ierr) call HYPRE_StructSMGSetLogging(solver, one, ierr) call HYPRE_StructSMGSetup(solver, A, b, x, ierr) call HYPRE_StructSMGSolve(solver, A, b, x, ierr) call HYPRE_StructSMGGetNumIterations(solver, num_iterations, & ierr) call HYPRE_StructSMGGetFinalRelative(solver, final_res_norm, & ierr) call HYPRE_StructSMGDestroy(solver, ierr) elseif (slvr_id .eq. 1) then ! Solve the system using PFMG call HYPRE_StructPFMGCreate(MPI_COMM_WORLD, solver, ierr) call HYPRE_StructPFMGSetMaxIter(solver, slvr_iter, ierr) call HYPRE_StructPFMGSetTol(solver, slvr_tol, ierr) call HYPRE_StructPFMGSetRelChange(solver, zero, ierr) ! weighted Jacobi = 1; red-black GS = 2 call HYPRE_StructPFMGSetRelaxType(solver, one, ierr) call HYPRE_StructPFMGSetNumPreRelax(solver, n_pre, ierr) call HYPRE_StructPFMGSetNumPostRelax(solver, n_post, ierr) ! call HYPRE_StructPFMGSetDxyz(solver, dxyz, ierr) call HYPRE_StructPFMGSetLogging(solver, one, ierr) call HYPRE_StructPFMGSetPrintLevel(solver, one, ierr) call HYPRE_StructPFMGSetup(solver, A, b, x, ierr) call HYPRE_StructPFMGSolve(solver, A, b, x, ierr) call HYPRE_StructPFMGGetNumIteration(solver, num_iterations, & ierr) call HYPRE_StructPFMGGetFinalRelativ(solver, final_res_norm, & ierr) call HYPRE_StructPFMGDestroy(solver, ierr) elseif ((slvr_id .gt. 9) .and. (slvr_id .lt. 20)) then ! Solve the system using CG call HYPRE_StructPCGCreate(MPI_COMM_WORLD, solver, ierr) call HYPRE_StructPCGSetMaxIter(solver, slvr_iter, ierr) call HYPRE_StructPCGSetTol(solver, slvr_tol, ierr) call HYPRE_StructPCGSetTwoNorm(solver, one, ierr) call HYPRE_StructPCGSetRelChange(solver, zero, ierr) call HYPRE_StructPCGSetLogging(solver, one, ierr) if (slvr_id .eq. 10) then ! use symmetric SMG as preconditioner prec_id = 0 call HYPRE_StructSMGCreate(MPI_COMM_WORLD, precond, & ierr) call HYPRE_StructSMGSetMemoryUse(precond, zero, ierr) call HYPRE_StructSMGSetMaxIter(precond, prec_iter, ierr) call HYPRE_StructSMGSetTol(precond, prec_tol, ierr) call HYPRE_StructSMGSetNumPreRelax(precond, n_pre, ierr) call HYPRE_StructSMGSetNumPostRelax(precond, n_post, ierr) call HYPRE_StructSMGSetLogging(precond, zero, ierr) elseif (slvr_id .eq. 11) then ! use symmetric PFMG as preconditioner prec_id = 1 call HYPRE_StructPFMGCreate(MPI_COMM_WORLD, precond, & ierr) call HYPRE_StructPFMGSetMaxIter(precond, prec_iter, ierr) call HYPRE_StructPFMGSetTol(precond, prec_tol, ierr) ! weighted Jacobi = 1; red-black GS = 2 call HYPRE_StructPFMGSetRelaxType(precond, one, ierr) call HYPRE_StructPFMGSetNumPreRelax(precond, n_pre, ierr) call HYPRE_StructPFMGSetNumPostRelax(precond, n_post, ierr) ! call HYPRE_StructPFMGSetDxyz(precond, dxyz, ierr) call HYPRE_StructPFMGSetLogging(precond, zero, ierr) elseif (slvr_id .eq. 17) then ! use 2-step jacobi as preconditioner prec_id = 7 prec_iter = 2 call HYPRE_StructJacobiCreate(MPI_COMM_WORLD, precond, ierr) call HYPRE_StructJacobiSetMaxIter(precond, prec_iter, ierr) call HYPRE_StructJacobiSetTol(precond, prec_tol, ierr) elseif (slvr_id .eq. 18) then ! use diagonal scaling as preconditioner prec_id = 8 precond = zero elseif (slvr_id .eq. 19) then ! use no preconditioner prec_id = 9 else ! Invalid preconditioner if (myid .eq. 0) then write(*,*) 'Invalid preconditioner!' endif call MPI_ABORT(MPI_COMM_WORLD, -2, ierr) endif call HYPRE_StructPCGSetPrecond(solver, prec_id, precond, & ierr) call HYPRE_StructPCGSetup(solver, A, b, x, ierr) call HYPRE_StructPCGSolve(solver, A, b, x, ierr) call HYPRE_StructPCGGetNumIterations(solver, num_iterations, & ierr) call HYPRE_StructPCGGetFinalRelative(solver, final_res_norm, & ierr) call HYPRE_StructPCGDestroy(solver, ierr) elseif ((slvr_id .gt. 19) .and. (slvr_id .lt. 30)) then ! Solve the system using Hybrid call HYPRE_StructHybridCreate(MPI_COMM_WORLD, solver, ierr) call HYPRE_StructHybridSetDSCGMaxIte(solver, dscg_iter, ierr) call HYPRE_StructHybridSetPCGMaxIter(solver, slvr_iter, ierr) call HYPRE_StructHybridSetTol(solver, slvr_tol, ierr) call HYPRE_StructHybridSetConvergenc(solver, convtol, ierr) call HYPRE_StructHybridSetTwoNorm(solver, one, ierr) call HYPRE_StructHybridSetRelChange(solver, zero, ierr) call HYPRE_StructHybridSetLogging(solver, one, ierr) if (slvr_id .eq. 20) then ! use symmetric SMG as preconditioner prec_id = 0 call HYPRE_StructSMGCreate(MPI_COMM_WORLD, precond, & ierr) call HYPRE_StructSMGSetMemoryUse(precond, zero, ierr) call HYPRE_StructSMGSetMaxIter(precond, prec_iter, ierr) call HYPRE_StructSMGSetTol(precond, prec_tol, ierr) call HYPRE_StructSMGSetNumPreRelax(precond, n_pre, ierr) call HYPRE_StructSMGSetNumPostRelax(precond, n_post, ierr) call HYPRE_StructSMGSetLogging(precond, zero, ierr) elseif (slvr_id .eq. 21) then ! use symmetric PFMG as preconditioner prec_id = 1 call HYPRE_StructPFMGCreate(MPI_COMM_WORLD, precond, & ierr) call HYPRE_StructPFMGSetMaxIter(precond, prec_iter, ierr) call HYPRE_StructPFMGSetTol(precond, prec_tol, ierr) ! weighted Jacobi = 1; red-black GS = 2 call HYPRE_StructPFMGSetRelaxType(precond, one, ierr) call HYPRE_StructPFMGSetNumPreRelax(precond, n_pre, ierr) call HYPRE_StructPFMGSetNumPostRelax(precond, n_post, ierr) ! call HYPRE_StructPFMGSetDxyz(precond, dxyz, ierr) call HYPRE_StructPFMGSetLogging(precond, zero, ierr) elseif (slvr_id .eq. 27) then ! use 2-step jacobi as preconditioner prec_id = 7 prec_iter = 2 call HYPRE_StructJacobiCreate(MPI_COMM_WORLD, precond, ierr) call HYPRE_StructJacobiSetMaxIter(precond, prec_iter, ierr) call HYPRE_StructJacobiSetTol(precond, prec_tol, ierr) elseif (slvr_id .eq. 28) then ! use diagonal scaling as preconditioner prec_id = 8 precond = zero elseif (slvr_id .eq. 29) then ! use no preconditioner prec_id = 9 else ! Invalid preconditioner if (myid .eq. 0) then write(*,*) 'Invalid preconditioner!' endif call MPI_ABORT(MPI_COMM_WORLD, -2, ierr) endif call HYPRE_StructHybridSetPrecond(solver, prec_id, precond, & ierr) call HYPRE_StructHybridSetup(solver, A, b, x, ierr) call HYPRE_StructHybridSolve(solver, A, b, x, ierr) call HYPRE_StructHybridGetNumIterati(solver, num_iterations, & ierr) call HYPRE_StructHybridGetFinalRelat(solver, final_res_norm, & ierr) call HYPRE_StructHybridDestroy(solver, ierr) elseif ((slvr_id .gt. 29) .and. (slvr_id .lt. 40)) then ! Solve the system using GMRes call HYPRE_StructGMResCreate(MPI_COMM_WORLD, solver, ierr) call HYPRE_StructGMResSetMaxIter(solver, slvr_iter, ierr) call HYPRE_StructGMResSetKDim(solver, slvr_iter, ierr) call HYPRE_StructGMResSetTol(solver, slvr_tol, ierr) call HYPRE_StructGMResSetPrintLevel(solver, one); call HYPRE_StructGMResSetLogging(solver, one, ierr) if (slvr_id .eq. 30) then ! use symmetric SMG as preconditioner prec_id = 0 call HYPRE_StructSMGCreate(MPI_COMM_WORLD, precond, & ierr) call HYPRE_StructSMGSetMemoryUse(precond, zero, ierr) call HYPRE_StructSMGSetMaxIter(precond, prec_iter, ierr) call HYPRE_StructSMGSetTol(precond, prec_tol, ierr) call HYPRE_StructSMGSetNumPreRelax(precond, n_pre, ierr) call HYPRE_StructSMGSetNumPostRelax(precond, n_post, ierr) call HYPRE_StructSMGSetLogging(precond, zero, ierr) elseif (slvr_id .eq. 31) then ! use symmetric PFMG as preconditioner prec_id = 1 call HYPRE_StructPFMGCreate(MPI_COMM_WORLD, precond, & ierr) call HYPRE_StructPFMGSetMaxIter(precond, prec_iter, ierr) call HYPRE_StructPFMGSetTol(precond, prec_tol, ierr) ! weighted Jacobi = 1; red-black GS = 2 call HYPRE_StructPFMGSetRelaxType(precond, one, ierr) call HYPRE_StructPFMGSetNumPreRelax(precond, n_pre, ierr) call HYPRE_StructPFMGSetNumPostRelax(precond, n_post, ierr) ! call HYPRE_StructPFMGSetDxyz(precond, dxyz, ierr) call HYPRE_StructPFMGSetLogging(precond, zero, ierr) elseif (slvr_id .eq. 36) then ! use 2-step jacobi as preconditioner prec_id = 6 prec_iter = 2 call HYPRE_StructJacobiCreate(MPI_COMM_WORLD, precond, ierr) call HYPRE_StructJacobiSetMaxIter(precond, prec_iter, ierr) call HYPRE_StructJacobiSetTol(precond, prec_tol, ierr) prec_id = 7 elseif (slvr_id .eq. 38) then ! use diagonal scaling as preconditioner prec_id = 8 precond = zero elseif (slvr_id .eq. 39) then ! use no preconditioner prec_id = 9 else ! Invalid preconditioner if (myid .eq. 0) then write(*,*) 'Invalid preconditioner!' endif call MPI_ABORT(MPI_COMM_WORLD, -2, ierr) endif call HYPRE_StructGMResSetPrecond(solver, prec_id, precond, & ierr) call HYPRE_StructGMResSetup(solver, A, b, x, ierr) call HYPRE_StructGMResSolve(solver, A, b, x, ierr) call HYPRE_StructGMResGetNumIteratio(solver, num_iterations, & ierr) call HYPRE_StructGMResGetFinalRelati(solver, final_res_norm, & ierr) call HYPRE_StructGMResDestroy(solver, ierr) elseif ((slvr_id .gt. 39) .and. (slvr_id .lt. 50)) then ! Solve the system using BiCGStab call HYPRE_StructBiCGStabCreate(MPI_COMM_WORLD, solver, ierr) call HYPRE_StructBiCGStabSetMaxIter(solver, slvr_iter, ierr) call HYPRE_StructBiCGStabSetTol(solver, slvr_tol, ierr) call HYPRE_StructBiCGStabSetPrintLev(solver, one); call HYPRE_StructBiCGStabSetLogging(solver, one, ierr) if (slvr_id .eq. 40) then ! use symmetric SMG as preconditioner prec_id = 0 call HYPRE_StructSMGCreate(MPI_COMM_WORLD, precond, & ierr) call HYPRE_StructSMGSetMemoryUse(precond, zero, ierr) call HYPRE_StructSMGSetMaxIter(precond, prec_iter, ierr) call HYPRE_StructSMGSetTol(precond, prec_tol, ierr) call HYPRE_StructSMGSetNumPreRelax(precond, n_pre, ierr) call HYPRE_StructSMGSetNumPostRelax(precond, n_post, ierr) call HYPRE_StructSMGSetLogging(precond, zero, ierr) elseif (slvr_id .eq. 41) then ! use symmetric PFMG as preconditioner prec_id = 1 call HYPRE_StructPFMGCreate(MPI_COMM_WORLD, precond, & ierr) call HYPRE_StructPFMGSetMaxIter(precond, prec_iter, ierr) call HYPRE_StructPFMGSetTol(precond, prec_tol, ierr) ! weighted Jacobi = 1; red-black GS = 2 call HYPRE_StructPFMGSetRelaxType(precond, one, ierr) call HYPRE_StructPFMGSetNumPreRelax(precond, n_pre, ierr) call HYPRE_StructPFMGSetNumPostRelax(precond, n_post, ierr) ! call HYPRE_StructPFMGSetDxyz(precond, dxyz, ierr) call HYPRE_StructPFMGSetLogging(precond, zero, ierr) elseif (slvr_id .eq. 47) then ! use 2-step jacobi as preconditioner prec_id = 7 prec_iter = 2 call HYPRE_StructJacobiCreate(MPI_COMM_WORLD, precond, ierr) call HYPRE_StructJacobiSetMaxIter(precond, prec_iter, ierr) call HYPRE_StructJacobiSetTol(precond, prec_tol, ierr) elseif (slvr_id .eq. 38) then ! use diagonal scaling as preconditioner prec_id = 8 precond = zero elseif (slvr_id .eq. 39) then ! use no preconditioner prec_id = 9 else ! Invalid preconditioner if (myid .eq. 0) then write(*,*) 'Invalid preconditioner!' endif call MPI_ABORT(MPI_COMM_WORLD, -2, ierr) endif call HYPRE_StructBiCGStabSetPrecond(solver, prec_id, precond, & ierr) call HYPRE_StructBiCGStabSetup(solver, A, b, x, ierr) call HYPRE_StructBiCGStabSolve(solver, A, b, x, ierr) call HYPRE_StructBiCGStabGetNumItera(solver, num_iterations, & ierr) call HYPRE_StructBiCGStabGetFinalRel(solver, final_res_norm, & ierr) call HYPRE_StructBiCGStabDestroy(solver, ierr) elseif ((slvr_id .gt. 49) .and. (slvr_id .lt. 60)) then ! Solve the system using LGMRes call HYPRE_StructLGMResCreate(MPI_COMM_WORLD, solver, ierr) call HYPRE_StructLGMResSetMaxIter(solver, slvr_iter, ierr) call HYPRE_StructLGMResSetKDim(solver, slvr_iter, ierr) call HYPRE_StructLGMResSetTol(solver, slvr_tol, ierr) call HYPRE_StructLGMResSetPrintLevel(solver, one); call HYPRE_StructLGMResSetLogging(solver, one, ierr) if (slvr_id .eq. 50) then ! use symmetric SMG as preconditioner prec_id = 0 call HYPRE_StructSMGCreate(MPI_COMM_WORLD, precond, & ierr) call HYPRE_StructSMGSetMemoryUse(precond, zero, ierr) call HYPRE_StructSMGSetMaxIter(precond, prec_iter, ierr) call HYPRE_StructSMGSetTol(precond, prec_tol, ierr) call HYPRE_StructSMGSetNumPreRelax(precond, n_pre, ierr) call HYPRE_StructSMGSetNumPostRelax(precond, n_post, ierr) call HYPRE_StructSMGSetLogging(precond, zero, ierr) elseif (slvr_id .eq. 51) then ! use symmetric PFMG as preconditioner prec_id = 1 call HYPRE_StructPFMGCreate(MPI_COMM_WORLD, precond, & ierr) call HYPRE_StructPFMGSetMaxIter(precond, prec_iter, ierr) call HYPRE_StructPFMGSetTol(precond, prec_tol, ierr) ! weighted Jacobi = 1; red-black GS = 2 call HYPRE_StructPFMGSetRelaxType(precond, one, ierr) call HYPRE_StructPFMGSetNumPreRelax(precond, n_pre, ierr) call HYPRE_StructPFMGSetNumPostRelax(precond, n_post, ierr) ! call HYPRE_StructPFMGSetDxyz(precond, dxyz, ierr) call HYPRE_StructPFMGSetLogging(precond, zero, ierr) elseif (slvr_id .eq. 56) then ! use 2-step jacobi as preconditioner prec_id = 6 prec_iter = 2 call HYPRE_StructJacobiCreate(MPI_COMM_WORLD, precond, ierr) call HYPRE_StructJacobiSetMaxIter(precond, prec_iter, ierr) call HYPRE_StructJacobiSetTol(precond, prec_tol, ierr) prec_id = 7 elseif (slvr_id .eq. 58) then ! use diagonal scaling as preconditioner prec_id = 8 precond = zero elseif (slvr_id .eq. 59) then ! use no preconditioner prec_id = 9 else ! Invalid preconditioner if (myid .eq. 0) then write(*,*) 'Invalid preconditioner!' endif call MPI_ABORT(MPI_COMM_WORLD, -2, ierr) endif call HYPRE_StructLGMResSetPrecond(solver, prec_id, precond, & ierr) call HYPRE_StructLGMResSetup(solver, A, b, x, ierr) call HYPRE_StructLGMResSolve(solver, A, b, x, ierr) call HYPRE_StructLGMResGetNumIter(solver, num_iterations, & ierr) call HYPRE_StructLGMResGetFinalRel(solver, final_res_norm, & ierr) call HYPRE_StructLGMResDestroy(solver, ierr) elseif ((slvr_id .gt. 59) .and. (slvr_id .lt. 70)) then ! Solve the system using FlexGMRes call HYPRE_StructFGMResCreate(MPI_COMM_WORLD, solver, ierr) call HYPRE_StructFGMResSetMaxIter(solver, slvr_iter, ierr) call HYPRE_StructFGMResSetKDim(solver, slvr_iter, ierr) call HYPRE_StructFGMResSetTol(solver, slvr_tol, ierr) call HYPRE_StructFGMResSetPrintLevel(solver, one); call HYPRE_StructFGMResSetLogging(solver, one, ierr) if (slvr_id .eq. 60) then ! use symmetric SMG as preconditioner prec_id = 0 call HYPRE_StructSMGCreate(MPI_COMM_WORLD, precond, & ierr) call HYPRE_StructSMGSetMemoryUse(precond, zero, ierr) call HYPRE_StructSMGSetMaxIter(precond, prec_iter, ierr) call HYPRE_StructSMGSetTol(precond, prec_tol, ierr) call HYPRE_StructSMGSetNumPreRelax(precond, n_pre, ierr) call HYPRE_StructSMGSetNumPostRelax(precond, n_post, ierr) call HYPRE_StructSMGSetLogging(precond, zero, ierr) elseif (slvr_id .eq. 61) then ! use symmetric PFMG as preconditioner prec_id = 1 call HYPRE_StructPFMGCreate(MPI_COMM_WORLD, precond, & ierr) call HYPRE_StructPFMGSetMaxIter(precond, prec_iter, ierr) call HYPRE_StructPFMGSetTol(precond, prec_tol, ierr) ! weighted Jacobi = 1; red-black GS = 2 call HYPRE_StructPFMGSetRelaxType(precond, one, ierr) call HYPRE_StructPFMGSetNumPreRelax(precond, n_pre, ierr) call HYPRE_StructPFMGSetNumPostRelax(precond, n_post, ierr) ! call HYPRE_StructPFMGSetDxyz(precond, dxyz, ierr) call HYPRE_StructPFMGSetLogging(precond, zero, ierr) elseif (slvr_id .eq. 66) then ! use 2-step jacobi as preconditioner prec_id = 6 prec_iter = 2 call HYPRE_StructJacobiCreate(MPI_COMM_WORLD, precond, ierr) call HYPRE_StructJacobiSetMaxIter(precond, prec_iter, ierr) call HYPRE_StructJacobiSetTol(precond, prec_tol, ierr) prec_id = 7 elseif (slvr_id .eq. 68) then ! use diagonal scaling as preconditioner prec_id = 8 precond = zero elseif (slvr_id .eq. 69) then ! use no preconditioner prec_id = 9 else ! Invalid preconditioner if (myid .eq. 0) then write(*,*) 'Invalid preconditioner!' endif call MPI_ABORT(MPI_COMM_WORLD, -2, ierr) endif call HYPRE_StructFGMResSetPrecond(solver, prec_id, precond, & ierr) call HYPRE_StructFGMResSetup(solver, A, b, x, ierr) call HYPRE_StructFGMResSolve(solver, A, b, x, ierr) call HYPRE_StructFGMResGetNumIter(solver, num_iterations, & ierr) call HYPRE_StructFGMResGetFinalRel(solver, final_res_norm, & ierr) call HYPRE_StructFGMResDestroy(solver, ierr) else if (myid .eq. 0) then write(*,*) 'Invalid solver!' endif call MPI_ABORT(MPI_COMM_WORLD, -1, ierr) endif if (prec_id .eq. 0) then call HYPRE_StructSMGDestroy(precond, ierr) elseif (prec_id .eq. 1) then call HYPRE_StructPFMGDestroy(precond, ierr) elseif (prec_id .eq. 7) then call HYPRE_StructJacobiDestroy(precond, ierr) endif !----------------------------------------------------------------------- ! Print the solution and other info !----------------------------------------------------------------------- ! call HYPRE_StructVectorPrint("driver.out.x", x, zero, ierr) if (myid .eq. 0) then write(*,'(a, i0)') 'Number of iterations = ', num_iterations write(*,'(a, e15.7)') 'Final Relative Residual Norm = ', & final_res_norm endif !----------------------------------------------------------------------- ! Finalize things !----------------------------------------------------------------------- call HYPRE_StructGridDestroy(grid, ierr) call HYPRE_StructStencilDestroy(stencil, ierr) call HYPRE_StructMatrixDestroy(A, ierr) call HYPRE_StructVectorDestroy(b, ierr) call HYPRE_StructVectorDestroy(x, ierr) ! Finalize MPI call MPI_FINALIZE(ierr) stop end hypre-2.33.0/src/test/fei.cxx000066400000000000000000000527021477326011500157770ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /*-------------------------------------------------------------------------- * Test driver for unstructured matrix interface (IJ_matrix interface). * Do `driver -help' for usage info. * This driver started from the driver for parcsr_linear_solvers, and it * works by first building a parcsr matrix as before and then "copying" * that matrix row-by-row into the IJMatrix interface. AJC 7/99. *--------------------------------------------------------------------------*/ #include #include #include /*--------------------------------------------------------------------- * hypre includes *---------------------------------------------------------------------*/ #include "_hypre_utilities.h" #include "HYPRE.h" #include "HYPRE_parcsr_mv.h" #include "HYPRE_IJ_mv.h" #include "HYPRE_parcsr_ls.h" #include "FEI_mv/fei-hypre/LLNL_FEI_Impl.h" /*--------------------------------------------------------------------- * local functions *---------------------------------------------------------------------*/ HYPRE_Int setupFEProblem(LLNL_FEI_Impl *feiPtr); HYPRE_Int readFERhs(HYPRE_Int nElems, HYPRE_Int elemNNodes, HYPRE_Real *rhs); HYPRE_Int readFEMatrix(HYPRE_Int *nElemsOut, HYPRE_Int *elemNNodesOut, HYPRE_Int ***elemConnOut, HYPRE_Real ****elemStiffOut, HYPRE_Int *startRowOut, HYPRE_Int *endRowOut); HYPRE_Int readFEMBC(HYPRE_Int *nBCsOut, HYPRE_Int **BCEqnOut, HYPRE_Real ***alphaOut, HYPRE_Real ***betaOut, HYPRE_Real ***gammaOut); HYPRE_Int composeSharedNodes(HYPRE_Int nElems, HYPRE_Int elemNNodes, HYPRE_Int **elemConn, HYPRE_Int *partition, HYPRE_Int *nSharedOut, HYPRE_Int **sharedIDsOut, HYPRE_Int **sharedLengsOut, HYPRE_Int ***sharedProcsOut); /*--------------------------------------------------------------------- * main *---------------------------------------------------------------------*/ HYPRE_Int main(HYPRE_Int argc, char *argv[]) { HYPRE_Int nprocs, mypid, printUsage, argIndex, solverID = 0, nParams, i, status; char **paramStrings; LLNL_FEI_Impl *feiPtr; /*----------------------------------------------------------- * Initialize some stuff *-----------------------------------------------------------*/ hypre_MPI_Init(&argc, &argv); hypre_MPI_Comm_size(hypre_MPI_COMM_WORLD, &nprocs); hypre_MPI_Comm_rank(hypre_MPI_COMM_WORLD, &mypid); /*----------------------------------------------------------- * Parse command line *-----------------------------------------------------------*/ printUsage = 0; argIndex = 1; while ((argIndex < argc) && (!printUsage)) { if (strcmp(argv[argIndex], "-solver") == 0) { solverID = atoi(argv[++argIndex]); } else if (strcmp(argv[argIndex], "-help") == 0) { printUsage = 1; } argIndex++; } /*----------------------------------------------------------- * Print usage info *-----------------------------------------------------------*/ if ((printUsage) && (mypid == 0)) { hypre_printf("\n"); hypre_printf("Usage: %s []\n", argv[0]); hypre_printf("\n"); hypre_printf(" -solver : solver ID\n"); hypre_printf(" 0=DS-PCG 1=ParaSails-PCG \n"); hypre_printf(" 2=AMG-PCG 3=AMGSA-PCG \n"); hypre_printf(" 4=DS-GMRES 5=AMG-GMRES \n"); hypre_printf(" 6=AMGSA-GMRES 7=LLNL_FEI-CGDiag \n"); hypre_printf("\n"); exit(1); } /*----------------------------------------------------------- * instantiate the finite element interface *-----------------------------------------------------------*/ feiPtr = new LLNL_FEI_Impl(hypre_MPI_COMM_WORLD); nParams = 18; paramStrings = new char*[nParams]; for (i = 0; i < nParams; i++) { paramStrings[i] = new char[100]; } strcpy(paramStrings[0], "externalSolver HYPRE"); strcpy(paramStrings[1], "outputLevel 0"); switch (solverID) { case 0: strcpy(paramStrings[2], "solver cg"); strcpy(paramStrings[3], "preconditioner diagonal"); break; case 1: strcpy(paramStrings[2], "solver cg"); strcpy(paramStrings[3], "preconditioner parasails"); break; case 2: strcpy(paramStrings[2], "solver cg"); strcpy(paramStrings[3], "preconditioner boomeramg"); break; case 3: strcpy(paramStrings[2], "solver cg"); strcpy(paramStrings[3], "preconditioner mli"); break; case 4: strcpy(paramStrings[2], "solver gmres"); strcpy(paramStrings[3], "preconditioner diagonal"); break; case 5: strcpy(paramStrings[2], "solver gmres"); strcpy(paramStrings[3], "preconditioner boomeramg"); break; case 6: strcpy(paramStrings[2], "solver gmres"); strcpy(paramStrings[3], "preconditioner mli"); break; case 7: strcpy(paramStrings[0], "outputLevel 0"); break; default: strcpy(paramStrings[2], "solver cg"); strcpy(paramStrings[3], "preconditioner diagonal"); break; } strcpy(paramStrings[4], "gmresDim 100"); strcpy(paramStrings[5], "amgNumSweeps 1"); strcpy(paramStrings[6], "amgRelaxType hybridsym"); strcpy(paramStrings[7], "amgSystemSize 3"); strcpy(paramStrings[8], "amgRelaxWeight -10.0"); strcpy(paramStrings[9], "amgStrongThreshold 0.5"); strcpy(paramStrings[10], "MLI smoother HSGS"); strcpy(paramStrings[11], "MLI numSweeps 1"); strcpy(paramStrings[12], "MLI smootherWeight 1.0"); strcpy(paramStrings[13], "MLI nodeDOF 3"); strcpy(paramStrings[14], "MLI nullSpaceDim 3"); strcpy(paramStrings[15], "MLI minCoarseSize 50"); strcpy(paramStrings[16], "MLI outputLevel 0"); strcpy(paramStrings[17], "parasailsSymmetric outputLevel 0"); feiPtr->parameters(nParams, paramStrings); for (i = 0; i < nParams; i++) { delete [] paramStrings[i]; } delete [] paramStrings; /*----------------------------------------------------------- * set up the finite element interface *-----------------------------------------------------------*/ setupFEProblem(feiPtr); /*----------------------------------------------------------- * set up finite element problem parameters *-----------------------------------------------------------*/ feiPtr->solve(&status); /*----------------------------------------------------------- * Finalize things *-----------------------------------------------------------*/ delete feiPtr; hypre_MPI_Finalize(); return (0); } /*************************************************************************** * set up the finite element problem *--------------------------------------------------------------------------*/ HYPRE_Int setupFEProblem(LLNL_FEI_Impl *feiPtr) { HYPRE_Int nprocs, mypid, nElems, elemNNodes, **elemConn, startRow, endRow; HYPRE_Int *partition, *iArray, i, j, nBCs, *BCEqn, nFields, *fieldSizes; HYPRE_Int *fieldIDs, elemBlkID, elemDOF, elemFormat, interleave; HYPRE_Int *nodeNFields, **nodeFieldIDs, nShared, *sharedIDs, *sharedLengs; HYPRE_Int **sharedProcs; HYPRE_Real ***elemStiff, **alpha, **beta, **gamma, *elemLoad; /*----------------------------------------------------------- * Initialize parallel machine information *-----------------------------------------------------------*/ hypre_MPI_Comm_size(hypre_MPI_COMM_WORLD, &nprocs); hypre_MPI_Comm_rank(hypre_MPI_COMM_WORLD, &mypid); /*----------------------------------------------------------- * read finite element connectivities and stiffness matrices *-----------------------------------------------------------*/ readFEMatrix(&nElems, &elemNNodes, &elemConn, &elemStiff, &startRow, &endRow); elemLoad = new HYPRE_Real[nElems * elemNNodes]; readFERhs(nElems, elemNNodes, elemLoad); /*----------------------------------------------------------- * create a processor partition table *-----------------------------------------------------------*/ partition = new HYPRE_Int[nprocs]; iArray = new HYPRE_Int[nprocs]; for (i = 0; i < nprocs; i++) { iArray[i] = 0; } iArray[mypid] = endRow - startRow + 1; hypre_MPI_Allreduce(iArray, partition, nprocs, HYPRE_MPI_INT, hypre_MPI_SUM, hypre_MPI_COMM_WORLD); for (i = 1; i < nprocs; i++) { partition[i] += partition[i - 1]; } delete [] iArray; /*----------------------------------------------------------- * read finite element mesh boundary conditions *-----------------------------------------------------------*/ readFEMBC(&nBCs, &BCEqn, &alpha, &beta, &gamma); /*----------------------------------------------------------- * initialize elementwise information *-----------------------------------------------------------*/ nFields = 1; fieldSizes = new HYPRE_Int[1]; fieldSizes[0] = 1; fieldIDs = new HYPRE_Int[1]; fieldIDs[0] = 0; elemBlkID = 0; elemDOF = 0; elemFormat = 0; interleave = 0; nodeNFields = new HYPRE_Int[elemNNodes]; for (i = 0; i < elemNNodes; i++) { nodeNFields[i] = 1; } nodeFieldIDs = new HYPRE_Int*[elemNNodes]; for (i = 0; i < elemNNodes; i++) { nodeFieldIDs[i] = new HYPRE_Int[1]; nodeFieldIDs[i][0] = 0; } /*----------------------------------------------------------- * compose shared node list *-----------------------------------------------------------*/ composeSharedNodes(nElems, elemNNodes, elemConn, partition, &nShared, &sharedIDs, &sharedLengs, &sharedProcs); /*----------------------------------------------------------- * initialize and load the finite element interface *-----------------------------------------------------------*/ feiPtr->initFields(nFields, fieldSizes, fieldIDs); feiPtr->initElemBlock(elemBlkID, nElems, elemNNodes, nodeNFields, nodeFieldIDs, elemDOF, NULL, interleave); for (i = 0; i < nElems; i++) { feiPtr->initElem(elemBlkID, i, elemConn[i]); } if (nShared > 0) { feiPtr->initSharedNodes(nShared, sharedIDs, sharedLengs, sharedProcs); } feiPtr->initComplete(); feiPtr->loadNodeBCs(nBCs, BCEqn, fieldIDs[0], alpha, beta, gamma); for (i = 0; i < nElems; i++) { feiPtr->sumInElem(elemBlkID, i, elemConn[i], elemStiff[i], &(elemLoad[i * elemNNodes]), elemFormat); } feiPtr->loadComplete(); /*----------------------------------------------------------- * clean up *-----------------------------------------------------------*/ for (i = 0; i < nElems; i++) { delete [] elemConn[i]; } delete [] elemConn; for (i = 0; i < nElems; i++) { for (j = 0; j < elemNNodes; j++) { delete [] elemStiff[i][j]; } delete [] elemStiff[i]; } delete [] elemStiff; delete [] partition; delete [] BCEqn; for (i = 0; i < nBCs; i++) { delete [] alpha[i]; delete [] beta[i]; delete [] gamma[i]; } delete [] alpha; delete [] beta; delete [] gamma; delete [] nodeNFields; for (i = 0; i < elemNNodes; i++) { delete [] nodeFieldIDs[i]; } delete [] nodeFieldIDs; delete [] elemLoad; if (nShared > 0) { delete [] sharedIDs; delete [] sharedLengs; for (i = 0; i < nShared; i++) { delete [] sharedProcs[i]; } delete [] sharedProcs; } return 0; } /*************************************************************************** * read finite element matrices *--------------------------------------------------------------------------*/ HYPRE_Int readFEMatrix(HYPRE_Int *nElemsOut, HYPRE_Int *elemNNodesOut, HYPRE_Int ***elemConnOut, HYPRE_Real ****elemStiffOut, HYPRE_Int *startRowOut, HYPRE_Int *endRowOut) { HYPRE_Int mypid, nElems, elemNNodes, startRow, endRow, **elemConn, i, j, k; HYPRE_Real ***elemStiff; char *paramString; FILE *fp; hypre_MPI_Comm_rank(hypre_MPI_COMM_WORLD, &mypid); paramString = new char[100]; hypre_sprintf(paramString, "SFEI.%d", mypid); fp = fopen(paramString, "r"); if (fp == NULL) { hypre_printf("%3d : feiTest ERROR - sfei file does not exist.\n", mypid); exit(1); } hypre_fscanf(fp, "%d %d %d %d", &nElems, &elemNNodes, &startRow, &endRow); elemConn = new HYPRE_Int*[nElems]; elemStiff = new HYPRE_Real**[nElems]; for (i = 0; i < nElems; i++) { elemConn[i] = new HYPRE_Int[elemNNodes]; elemStiff[i] = new HYPRE_Real*[elemNNodes]; for (j = 0; j < elemNNodes; j++) { hypre_fscanf(fp, "%d", &(elemConn[i][j])); } for (j = 0; j < elemNNodes; j++) { elemStiff[i][j] = new HYPRE_Real[elemNNodes]; for (k = 0; k < elemNNodes; k++) { hypre_fscanf(fp, "%lg", &(elemStiff[i][j][k])); } } } fclose(fp); delete [] paramString; (*nElemsOut) = nElems; (*elemNNodesOut) = elemNNodes; (*elemConnOut) = elemConn; (*elemStiffOut) = elemStiff; (*startRowOut) = startRow; (*endRowOut) = endRow; return 0; } /*************************************************************************** * read finite element right hand sides *--------------------------------------------------------------------------*/ HYPRE_Int readFERhs(HYPRE_Int nElems, HYPRE_Int elemNNodes, HYPRE_Real *elemLoad) { HYPRE_Int mypid, length, i; char *paramString; FILE *fp; hypre_MPI_Comm_rank(hypre_MPI_COMM_WORLD, &mypid); paramString = new char[100]; hypre_sprintf(paramString, "RHS.%d", mypid); fp = fopen(paramString, "r"); if (fp == NULL) { hypre_printf("%3d : feiTest ERROR - rhs file does not exist.\n", mypid); exit(1); } length = nElems * elemNNodes; for (i = 0; i < length; i++) { hypre_fscanf(fp, "%lg", &(elemLoad[i])); } fclose(fp); delete [] paramString; return 0; } /*************************************************************************** * read BC from file *--------------------------------------------------------------------------*/ HYPRE_Int readFEMBC(HYPRE_Int *nBCsOut, HYPRE_Int **BCEqnOut, HYPRE_Real ***alphaOut, HYPRE_Real ***betaOut, HYPRE_Real ***gammaOut) { HYPRE_Int mypid, nBCs = 0, *BCEqn, i; HYPRE_Real **alpha, **beta, **gamma; char *paramString; FILE *fp; hypre_MPI_Comm_rank(hypre_MPI_COMM_WORLD, &mypid); paramString = new char[100]; hypre_sprintf(paramString, "BC.%d", mypid); fp = fopen(paramString, "r"); if (fp == NULL) { hypre_printf("%3d : feiTest ERROR - BC file does not exist.\n", mypid); exit(1); } hypre_fscanf(fp, "%d", &nBCs); BCEqn = new HYPRE_Int[nBCs]; alpha = new HYPRE_Real*[nBCs]; beta = new HYPRE_Real*[nBCs]; gamma = new HYPRE_Real*[nBCs]; for (i = 0; i < nBCs; i++) { alpha[i] = new HYPRE_Real[1]; beta[i] = new HYPRE_Real[1]; gamma[i] = new HYPRE_Real[1]; } for (i = 0; i < nBCs; i++) hypre_fscanf(fp, "%d %lg %lg %lg", &(BCEqn[i]), &(alpha[i][0]), &(beta[i][0]), &(gamma[i][0])); fclose(fp); delete [] paramString; (*nBCsOut) = nBCs; (*BCEqnOut) = BCEqn; (*alphaOut) = alpha; (*betaOut) = beta; (*gammaOut) = gamma; return 0; } /*************************************************************************** * compose shared node list *--------------------------------------------------------------------------*/ HYPRE_Int composeSharedNodes(HYPRE_Int nElems, HYPRE_Int elemNNodes, HYPRE_Int **elemConn, HYPRE_Int *partition, HYPRE_Int *nSharedOut, HYPRE_Int **sharedIDsOut, HYPRE_Int **sharedLengsOut, HYPRE_Int ***sharedProcsOut) { HYPRE_Int nShared, i, j, index, startRow, endRow, mypid, nprocs, ncnt; HYPRE_Int *sharedIDs, *iArray1, *iArray2, **iRecvBufs, **iSendBufs; HYPRE_Int nRecvs, *recvProcs, *recvLengs, nSends, *sendProcs, *sendLengs; hypre_MPI_Request *mpiRequests; hypre_MPI_Status mpiStatus; /* --- get machine and matrix information --- */ hypre_MPI_Comm_size(hypre_MPI_COMM_WORLD, &nprocs); hypre_MPI_Comm_rank(hypre_MPI_COMM_WORLD, &mypid); if (mypid == 0) { startRow = 0; } else { startRow = partition[mypid - 1]; } endRow = partition[mypid] - 1; /* --- get a rough count of nShared --- */ nShared = 0; for (i = 0; i < nElems; i++) { for (j = 0; j < elemNNodes; j++) { index = elemConn[i][j]; if (index < startRow || index > endRow) { nShared++; } } } /* --- allocate and fill sharedIDs array, then sort and compress --- */ if (nShared <= 0) { sharedIDs = NULL; } else { sharedIDs = new HYPRE_Int[nShared]; nShared = 0; for (i = 0; i < nElems; i++) { for (j = 0; j < elemNNodes; j++) { index = elemConn[i][j]; if (index < startRow || index > endRow) { sharedIDs[nShared++] = index; } } } hypre_qsort0(sharedIDs, 0, nShared - 1); ncnt = 1; for (i = 1; i < nShared; i++) { if (sharedIDs[i] != sharedIDs[ncnt - 1]) { sharedIDs[ncnt++] = sharedIDs[i]; } } nShared = ncnt; } /* --- tabulate recv processors and send processors --- */ iArray1 = new HYPRE_Int[nprocs]; iArray2 = new HYPRE_Int[nprocs]; for (i = 0; i < nprocs; i++) { iArray1[i] = 0; } for (i = 0; i < nShared; i++) { for (j = 0; j < nprocs; j++) if (sharedIDs[i] < partition[j]) { break; } if (j != mypid) { iArray1[j] = 1; } } hypre_MPI_Allreduce(iArray1, iArray2, nprocs, HYPRE_MPI_INT, hypre_MPI_SUM, hypre_MPI_COMM_WORLD); for (i = 0; i < nprocs; i++) { iArray1[i] = 0; } for (i = 0; i < nShared; i++) { for (j = 0; j < nprocs; j++) if (sharedIDs[i] < partition[j]) { break; } if (j != mypid) { iArray1[j]++; } } nSends = 0; for (i = 0; i < nprocs; i++) if (iArray1[i] != 0) { nSends++; } if (nSends > 0) { sendLengs = new HYPRE_Int[nSends]; sendProcs = new HYPRE_Int[nSends]; nSends = 0; for (i = 0; i < nprocs; i++) { if (iArray1[i] != 0) { sendLengs[nSends] = iArray1[i]; sendProcs[nSends++] = i; } } } nRecvs = iArray2[mypid]; if (nRecvs > 0) { recvLengs = new HYPRE_Int[nRecvs]; recvProcs = new HYPRE_Int[nRecvs]; mpiRequests = new hypre_MPI_Request[nRecvs]; } for (i = 0; i < nRecvs; i++) hypre_MPI_Irecv(&(recvLengs[i]), 1, HYPRE_MPI_INT, hypre_MPI_ANY_SOURCE, 12233, hypre_MPI_COMM_WORLD, &(mpiRequests[i])); for (i = 0; i < nSends; i++) hypre_MPI_Send(&(sendLengs[i]), 1, HYPRE_MPI_INT, sendProcs[i], 12233, hypre_MPI_COMM_WORLD); for (i = 0; i < nRecvs; i++) { hypre_MPI_Wait(&(mpiRequests[i]), &mpiStatus); recvProcs[i] = mpiStatus.hypre_MPI_SOURCE; } /* get the shared nodes */ if (nRecvs > 0) { iRecvBufs = new HYPRE_Int*[nRecvs]; } for (i = 0; i < nRecvs; i++) { iRecvBufs[i] = new HYPRE_Int[recvLengs[i]]; hypre_MPI_Irecv(iRecvBufs[i], recvLengs[i], HYPRE_MPI_INT, recvProcs[i], 12234, hypre_MPI_COMM_WORLD, &(mpiRequests[i])); } if (nSends > 0) { iSendBufs = new HYPRE_Int*[nSends]; } for (i = 0; i < nSends; i++) { iSendBufs[i] = new HYPRE_Int[sendLengs[i]]; sendLengs[i] = 0; } for (i = 0; i < nShared; i++) { for (j = 0; j < nprocs; j++) if (sharedIDs[i] < partition[j]) { break; } iSendBufs[j][sendLengs[j]++] = sharedIDs[i]; } for (i = 0; i < nSends; i++) hypre_MPI_Send(iSendBufs[i], sendLengs[i], HYPRE_MPI_INT, sendProcs[i], 12234, hypre_MPI_COMM_WORLD); for (i = 0; i < nRecvs; i++) { hypre_MPI_Wait(&(mpiRequests[i]), &mpiStatus); } /* --- finally construct the shared information --- */ ncnt = nShared; for (i = 0; i < nRecvs; i++) { ncnt += recvLengs[i]; } (*nSharedOut) = ncnt; (*sharedIDsOut) = new HYPRE_Int[ncnt]; (*sharedLengsOut) = new HYPRE_Int[ncnt]; (*sharedProcsOut) = new HYPRE_Int*[ncnt]; for (i = 0; i < ncnt; i++) { (*sharedProcsOut)[i] = new HYPRE_Int[2]; } for (i = 0; i < nShared; i++) { (*sharedIDsOut)[i] = sharedIDs[i]; for (j = 0; j < nprocs; j++) if (sharedIDs[i] < partition[j]) { break; } (*sharedLengsOut)[i] = 2; (*sharedProcsOut)[i][0] = j; (*sharedProcsOut)[i][1] = mypid; } ncnt = nShared; for (i = 0; i < nRecvs; i++) { for (j = 0; j < recvLengs[i]; j++) { index = iRecvBufs[i][j]; (*sharedIDsOut)[ncnt] = index; (*sharedLengsOut)[ncnt] = 2; (*sharedProcsOut)[ncnt][0] = mypid; (*sharedProcsOut)[ncnt][1] = recvProcs[i]; ncnt++; } } /* --- finally clean up --- */ if (nShared > 0) { delete [] sharedIDs; } if (nSends > 0) { delete [] sendProcs; delete [] sendLengs; for (i = 0; i < nSends; i++) { delete [] iSendBufs[i]; } delete [] iSendBufs; } if (nRecvs > 0) { delete [] recvProcs; delete [] recvLengs; for (i = 0; i < nRecvs; i++) { delete [] iRecvBufs[i]; } delete [] iRecvBufs; delete [] mpiRequests; } delete [] iArray1; delete [] iArray2; return 0; } hypre-2.33.0/src/test/fei_lscore.c000066400000000000000000000371371477326011500167730ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /*-------------------------------------------------------------------------- * Test driver for unstructured matrix interface (IJ_matrix interface). * Do `driver -help' for usage info. * This driver started from the driver for parcsr_linear_solvers, and it * works by first building a parcsr matrix as before and then "copying" * that matrix row-by-row into the IJMatrix interface. AJC 7/99. *--------------------------------------------------------------------------*/ #include #include #include #include "_hypre_utilities.h" #include "HYPRE.h" #include "HYPRE_parcsr_mv.h" #include "HYPRE_IJ_mv.h" #include "HYPRE_parcsr_ls.h" #include "HYPRE_LinSysCore.h" HYPRE_Int BuildParLaplacian27pt (HYPRE_Int argc, char *argv [], HYPRE_Int arg_index, HYPRE_ParCSRMatrix *A_ptr ); #define SECOND_TIME 0 HYPRE_Int main( HYPRE_Int argc, char *argv[] ) { HYPRE_Int arg_index; HYPRE_Int print_usage; HYPRE_Int build_matrix_arg_index; HYPRE_Int solver_id; HYPRE_Int ierr, i, j; HYPRE_Int num_iterations; HYPRE_ParCSRMatrix parcsr_A; HYPRE_Int num_procs, myid; HYPRE_Int local_row; HYPRE_Int time_index; MPI_Comm comm; HYPRE_Int M, N; HYPRE_Int first_local_row, last_local_row; HYPRE_Int first_local_col, last_local_col; HYPRE_Int size, *col_ind; HYPRE_Real *values; /* parameters for BoomerAMG */ HYPRE_Real strong_threshold; HYPRE_Int num_grid_sweeps; HYPRE_Real relax_weight; /* parameters for GMRES */ HYPRE_Int k_dim; char *paramString = new char[100]; /*----------------------------------------------------------- * Initialize some stuff *-----------------------------------------------------------*/ hypre_MPI_Init(&argc, &argv); hypre_MPI_Comm_size(hypre_MPI_COMM_WORLD, &num_procs ); hypre_MPI_Comm_rank(hypre_MPI_COMM_WORLD, &myid ); /*----------------------------------------------------------- * Set defaults *-----------------------------------------------------------*/ build_matrix_arg_index = argc; solver_id = 0; strong_threshold = 0.25; num_grid_sweeps = 2; relax_weight = 0.5; k_dim = 20; /*----------------------------------------------------------- * Parse command line *-----------------------------------------------------------*/ print_usage = 0; arg_index = 1; while ( (arg_index < argc) && (!print_usage) ) { if ( strcmp(argv[arg_index], "-solver") == 0 ) { arg_index++; solver_id = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-dbg") == 0 ) { arg_index++; atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-help") == 0 ) { print_usage = 1; } else { arg_index++; } } /*----------------------------------------------------------- * Print usage info *-----------------------------------------------------------*/ if ( (print_usage) && (myid == 0) ) { hypre_printf("\n"); hypre_printf("Usage: %s []\n", argv[0]); hypre_printf("\n"); hypre_printf(" -solver : solver ID\n"); hypre_printf(" 0=DS-PCG 1=ParaSails-PCG \n"); hypre_printf(" 2=AMG-PCG 3=DS-GMRES \n"); hypre_printf(" 4=PILUT-GMRES 5=AMG-GMRES \n"); hypre_printf("\n"); hypre_printf(" -rlx : relaxation type\n"); hypre_printf(" 0=Weighted Jacobi \n"); hypre_printf(" 1=Gauss-Seidel (very slow!) \n"); hypre_printf(" 3=Hybrid Jacobi/Gauss-Seidel \n"); hypre_printf("\n"); exit(1); } /*----------------------------------------------------------- * Print driver parameters *-----------------------------------------------------------*/ if (myid == 0) { hypre_printf("Running with these driver parameters:\n"); hypre_printf(" solver ID = %d\n", solver_id); } /*----------------------------------------------------------- * Set up matrix *-----------------------------------------------------------*/ strcpy(paramString, "LS Interface"); time_index = hypre_InitializeTiming(paramString); hypre_BeginTiming(time_index); BuildParLaplacian27pt(argc, argv, build_matrix_arg_index, &parcsr_A); /*----------------------------------------------------------- * Copy the parcsr matrix into the LSI through interface calls *-----------------------------------------------------------*/ ierr = HYPRE_ParCSRMatrixGetComm( parcsr_A, &comm ); ierr += HYPRE_ParCSRMatrixGetDims( parcsr_A, &M, &N ); ierr = HYPRE_ParCSRMatrixGetLocalRange( parcsr_A, &first_local_row, &last_local_row, &first_local_col, &last_local_col ); HYPRE_LinSysCore H(hypre_MPI_COMM_WORLD); HYPRE_Int numLocalEqns = last_local_row - first_local_row + 1; H.createMatricesAndVectors(M, first_local_row + 1, numLocalEqns); HYPRE_Int index; HYPRE_Int *rowLengths = new HYPRE_Int[numLocalEqns]; HYPRE_Int **colIndices = new HYPRE_Int*[numLocalEqns]; local_row = 0; for (i = first_local_row; i <= last_local_row; i++) { ierr += HYPRE_ParCSRMatrixGetRow(parcsr_A, i, &size, &col_ind, &values ); rowLengths[local_row] = size; colIndices[local_row] = new HYPRE_Int[size]; for (j = 0; j < size; j++) { colIndices[local_row][j] = col_ind[j] + 1; } local_row++; HYPRE_ParCSRMatrixRestoreRow(parcsr_A, i, &size, &col_ind, &values); } H.allocateMatrix(colIndices, rowLengths); delete [] rowLengths; for (i = 0; i < numLocalEqns; i++) { delete [] colIndices[i]; } delete [] colIndices; HYPRE_Int *newColInd; for (i = first_local_row; i <= last_local_row; i++) { ierr += HYPRE_ParCSRMatrixGetRow(parcsr_A, i, &size, &col_ind, &values ); newColInd = new HYPRE_Int[size]; for (j = 0; j < size; j++) { newColInd[j] = col_ind[j] + 1; } H.sumIntoSystemMatrix(i + 1, size, (const HYPRE_Real*)values, (const HYPRE_Int*)newColInd); delete [] newColInd; ierr += HYPRE_ParCSRMatrixRestoreRow(parcsr_A, i, &size, &col_ind, &values); } H.matrixLoadComplete(); HYPRE_ParCSRMatrixDestroy(parcsr_A); /*----------------------------------------------------------- * Set up the RHS and initial guess *-----------------------------------------------------------*/ HYPRE_Real ddata = 1.0; HYPRE_Int status; for (i = first_local_row; i <= last_local_row; i++) { index = i + 1; H.sumIntoRHSVector(1, (const HYPRE_Real*) &ddata, (const HYPRE_Int*) &index); } hypre_EndTiming(time_index); strcpy(paramString, "LS Interface"); hypre_PrintTiming(paramString, hypre_MPI_COMM_WORLD); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); /*----------------------------------------------------------- * Solve the system using PCG *-----------------------------------------------------------*/ if ( solver_id == 0 ) { strcpy(paramString, "solver cg"); H.parameters(1, ¶mString); if (myid == 0) { hypre_printf("Solver: DS-PCG\n"); } strcpy(paramString, "preconditioner diagonal"); H.parameters(1, ¶mString); } else if ( solver_id == 1 ) { strcpy(paramString, "solver cg"); H.parameters(1, ¶mString); if (myid == 0) { hypre_printf("Solver: ParaSails-PCG\n"); } strcpy(paramString, "preconditioner parasails"); H.parameters(1, ¶mString); strcpy(paramString, "parasailsNlevels 1"); H.parameters(1, ¶mString); strcpy(paramString, "parasailsThreshold 0.1"); H.parameters(1, ¶mString); } else if ( solver_id == 2 ) { strcpy(paramString, "solver cg"); H.parameters(1, ¶mString); if (myid == 0) { hypre_printf("Solver: AMG-PCG\n"); } strcpy(paramString, "preconditioner boomeramg"); H.parameters(1, ¶mString); strcpy(paramString, "amgCoarsenType falgout"); H.parameters(1, ¶mString); hypre_sprintf(paramString, "amgStrongThreshold %e", strong_threshold); H.parameters(1, ¶mString); hypre_sprintf(paramString, "amgNumSweeps %d", num_grid_sweeps); H.parameters(1, ¶mString); strcpy(paramString, "amgRelaxType jacobi"); H.parameters(1, ¶mString); hypre_sprintf(paramString, "amgRelaxWeight %e", relax_weight); H.parameters(1, ¶mString); } else if ( solver_id == 3 ) { strcpy(paramString, "solver cg"); H.parameters(1, ¶mString); if (myid == 0) { hypre_printf("Solver: Poly-PCG\n"); } strcpy(paramString, "preconditioner poly"); H.parameters(1, ¶mString); strcpy(paramString, "polyOrder 9"); H.parameters(1, ¶mString); } else if ( solver_id == 4 ) { strcpy(paramString, "solver gmres"); H.parameters(1, ¶mString); hypre_sprintf(paramString, "gmresDim %d", k_dim); H.parameters(1, ¶mString); if (myid == 0) { hypre_printf("Solver: DS-GMRES\n"); } strcpy(paramString, "preconditioner diagonal"); H.parameters(1, ¶mString); } else if ( solver_id == 5 ) { strcpy(paramString, "solver gmres"); H.parameters(1, ¶mString); hypre_sprintf(paramString, "gmresDim %d", k_dim); H.parameters(1, ¶mString); if (myid == 0) { hypre_printf("Solver: PILUT-GMRES\n"); } strcpy(paramString, "preconditioner pilut"); H.parameters(1, ¶mString); strcpy(paramString, "pilutRowSize 0"); H.parameters(1, ¶mString); strcpy(paramString, "pilutDropTol 0.0"); H.parameters(1, ¶mString); } else if ( solver_id == 6 ) { strcpy(paramString, "solver gmres"); H.parameters(1, ¶mString); hypre_sprintf(paramString, "gmresDim %d", k_dim); H.parameters(1, ¶mString); if (myid == 0) { hypre_printf("Solver: AMG-GMRES\n"); } strcpy(paramString, "preconditioner boomeramg"); H.parameters(1, ¶mString); strcpy(paramString, "amgCoarsenType falgout"); H.parameters(1, ¶mString); hypre_sprintf(paramString, "amgStrongThreshold %e", strong_threshold); H.parameters(1, ¶mString); hypre_sprintf(paramString, "amgNumSweeps %d", num_grid_sweeps); H.parameters(1, ¶mString); strcpy(paramString, "amgRelaxType jacobi"); H.parameters(1, ¶mString); hypre_sprintf(paramString, "amgRelaxWeight %e", relax_weight); H.parameters(1, ¶mString); } else if ( solver_id == 7 ) { strcpy(paramString, "solver gmres"); H.parameters(1, ¶mString); hypre_sprintf(paramString, "gmresDim %d", k_dim); H.parameters(1, ¶mString); if (myid == 0) { hypre_printf("Solver: DDILUT-GMRES\n"); } strcpy(paramString, "preconditioner ddilut"); H.parameters(1, ¶mString); strcpy(paramString, "ddilutFillin 5.0"); H.parameters(1, ¶mString); strcpy(paramString, "ddilutDropTol 0.0"); H.parameters(1, ¶mString); } else if ( solver_id == 8 ) { strcpy(paramString, "solver gmres"); H.parameters(1, ¶mString); hypre_sprintf(paramString, "gmresDim %d", k_dim); H.parameters(1, ¶mString); if (myid == 0) { hypre_printf("Solver: POLY-GMRES\n"); } strcpy(paramString, "preconditioner poly"); H.parameters(1, ¶mString); strcpy(paramString, "polyOrder 5"); H.parameters(1, ¶mString); } strcpy(paramString, "Krylov Solve"); time_index = hypre_InitializeTiming(paramString); hypre_BeginTiming(time_index); H.launchSolver(status, num_iterations); hypre_EndTiming(time_index); strcpy(paramString, "Solve phase times"); hypre_PrintTiming(paramString, hypre_MPI_COMM_WORLD); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); if (myid == 0) { hypre_printf("\n Iterations = %d\n", num_iterations); hypre_printf("\n"); } /*----------------------------------------------------------- * Finalize things *-----------------------------------------------------------*/ delete [] paramString; hypre_MPI_Finalize(); return (0); } /*---------------------------------------------------------------------- * Build 27-point laplacian in 3D, * Parameters given in command line. *----------------------------------------------------------------------*/ HYPRE_Int BuildParLaplacian27pt( HYPRE_Int argc, char *argv[], HYPRE_Int arg_index, HYPRE_ParCSRMatrix *A_ptr ) { HYPRE_Int nx, ny, nz; HYPRE_Int P, Q, R; HYPRE_ParCSRMatrix A; HYPRE_Int num_procs, myid; HYPRE_Int p, q, r; HYPRE_Real *values; /*----------------------------------------------------------- * Initialize some stuff *-----------------------------------------------------------*/ hypre_MPI_Comm_size(hypre_MPI_COMM_WORLD, &num_procs ); hypre_MPI_Comm_rank(hypre_MPI_COMM_WORLD, &myid ); /*----------------------------------------------------------- * Set defaults *-----------------------------------------------------------*/ nx = 20; ny = 20; nz = 20; P = 1; Q = num_procs; R = 1; /*----------------------------------------------------------- * Check a few things *-----------------------------------------------------------*/ if ((P * Q * R) != num_procs) { hypre_printf("Error: Invalid number of processors or processor topology \n"); exit(1); } /*----------------------------------------------------------- * Print driver parameters *-----------------------------------------------------------*/ if (myid == 0) { hypre_printf(" Laplacian_27pt:\n"); hypre_printf(" (nx, ny, nz) = (%d, %d, %d)\n", nx, ny, nz); hypre_printf(" (Px, Py, Pz) = (%d, %d, %d)\n", P, Q, R); } /*----------------------------------------------------------- * Set up the grid structure *-----------------------------------------------------------*/ /* compute p,q,r from P,Q,R and myid */ p = myid % P; q = (( myid - p) / P) % Q; r = ( myid - p - P * q) / ( P * Q ); /*----------------------------------------------------------- * Generate the matrix *-----------------------------------------------------------*/ values = hypre_CTAlloc(HYPRE_Real, 2, HYPRE_MEMORY_HOST); values[0] = 26.0; if (nx == 1 || ny == 1 || nz == 1) { values[0] = 8.0; } if (nx * ny == 1 || nx * nz == 1 || ny * nz == 1) { values[0] = 2.0; } values[1] = -1.0; A = (HYPRE_ParCSRMatrix) GenerateLaplacian27pt(hypre_MPI_COMM_WORLD, nx, ny, nz, P, Q, R, p, q, r, values); hypre_TFree(values, HYPRE_MEMORY_HOST); *A_ptr = A; return (0); } hypre-2.33.0/src/test/fij_mv.f000066400000000000000000000350361477326011500161320ustar00rootroot00000000000000! Copyright (c) 1998 Lawrence Livermore National Security, LLC and other ! HYPRE Project Developers. See the top-level COPYRIGHT file for details. ! ! SPDX-License-Identifier: (Apache-2.0 OR MIT) !***************************************************************************** ! HYPRE_IJMatrix Fortran interface !***************************************************************************** !-------------------------------------------------------------------------- ! HYPRE_IJMatrixCreate !-------------------------------------------------------------------------- subroutine fhypre_ijmatrixcreate(fcomm, filower, fiupper, 1 fjlower, fjupper, fmatrix) integer ierr integer*8 fmatrix integer*8 fcomm integer filower integer fiupper integer fjlower integer fjupper call HYPRE_IJMatrixCreate(fcomm, filower, fiupper, fjlower, 1 fjupper, fmatrix, ierr) if(ierr .ne. 0) then print *, 'fhypre_ijmatrixcreate error = ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_IJMatrixDestroy !-------------------------------------------------------------------------- subroutine fhypre_ijmatrixdestroy(fmatrix) integer ierr integer*8 fmatrix call HYPRE_IJMatrixDestroy(fmatrix, ierr) if(ierr .ne. 0) then print *, 'fhypre_ijmatrixdestroy error = ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_IJMatrixInitialize !-------------------------------------------------------------------------- subroutine fhypre_ijmatrixinitialize(fmatrix) integer ierr integer*8 fmatrix call HYPRE_IJMatrixInitialize(fmatrix, ierr) if(ierr .ne. 0) then print *, 'fhypre_ijmatrixinitialize error = ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_IJMatrixAssemble !-------------------------------------------------------------------------- subroutine fhypre_ijmatrixassemble(fmatrix) integer ierr integer*8 fmatrix call HYPRE_IJMatrixAssemble(fmatrix, ierr) if(ierr .ne. 0) then print *, 'fhypre_ijmatrixassemble error = ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_IJMatrixSetRowSizes !-------------------------------------------------------------------------- subroutine fhypre_ijmatrixsetrowsizes(fmatrix, fizes) integer ierr integer*8 fmatrix integer fsizes call HYPRE_IJMatrixSetRowSizes(fmatrix, fsizes, ierr) if(ierr .ne. 0) then print *, 'fhypre_ijmatrixsetrowsizes error = ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_IJMatrixSetDiagOffdSizes !-------------------------------------------------------------------------- subroutine fhypre_ijmatrixsetdiagoffdsizes(fmatrix, fdiag_sizes, 1 foffd_sizes) integer ierr integer*8 fmatrix integer fdiag_sizes integer foffd_sizes call HYPRE_IJMatrixSetDiagOffdSizes(fmatrix, fdiag_sizes, 1 foffd_sizes, ierr) if(ierr .ne. 0) then print *, 'fhypre_ijmatrixsetdiagoffdsizes error = ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_IJMatrixSetValues !-------------------------------------------------------------------------- subroutine fhypre_ijmatrixsetvalues(fmatrix, fnrows, fncols, 1 frows, fcols, fvalues) integer ierr integer*8 fmatrix integer fnrows integer fncols integer frows integer fcols double precision fvalues call HYPRE_IJMatrixSetValues(fmatrix, fnrows, fncols, frows, 1 fcols, fvalues, ierr) if(ierr .ne. 0) then print *, 'fhypre_ijmatrixsetvalues error = ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_IJMatrixAddToValues !-------------------------------------------------------------------------- subroutine fhypre_ijmatrixaddtovalues(fmatrix, fnrows, fncols, 1 frows, fcols, fvalues) integer ierr integer*8 fmatrix integer fnrows integer fncols integer frows integer fcols double precision fvalues call HYPRE_IJMatrixAddToValues(fmatrix, fnrows, fncols, frows, 1 fcols, fvalues, ierr) if(ierr .ne. 0) then print *, 'fhypre_ijmatrixaddtovalues error = ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_IJMatrixSetObjectType !-------------------------------------------------------------------------- subroutine fhypre_ijmatrixsetobjecttype(fmatrix, ftype) integer ierr integer*8 fmatrix integer ftype call HYPRE_IJMatrixSetObjectType(fmatrix, ftype, ierr) if(ierr .ne. 0) then print *, 'fhypre_ijmatrixsetobjecttype error = ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_IJMatrixGetObjectType !-------------------------------------------------------------------------- subroutine fhypre_ijmatrixgetobjecttype(fmatrix, ftype) integer ierr integer*8 fmatrix integer ftype call HYPRE_IJMatrixGetObjectType(fmatrix, ftype, ierr) if(ierr .ne. 0) then print *, 'fhypre_ijmatrixgetobjecttype error = ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_IJMatrixGetObject !-------------------------------------------------------------------------- subroutine fhypre_ijmatrixgetobject(fmatrix, fobject) integer ierr integer*8 fmatrix integer*8 fobject call HYPRE_IJMatrixGetObject(fmatrix, fobject, ierr) if(ierr .ne. 0) then print *, 'fhypre_ijmatrixgetobject error = ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_IJMatrixRead !-------------------------------------------------------------------------- subroutine fhypre_ijmatrixread(ffilename, fcomm, fobject_type, 1 fmatrix) integer ierr integer*8 fmatrix integer*8 fcomm integer fobject_type character*(*) ffilename call HYPRE_IJMatrixRead(ffilename, fcomm, fobject_type, fmatrix, 1 ierr) if(ierr .ne. 0) then print *, 'fhypre_ijmatrixread error = ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_IJMatrixPrint !-------------------------------------------------------------------------- subroutine fhypre_ijmatrixprint(fmatrix, ffilename) integer ierr integer*8 fmatrix character*(*) ffilename call HYPRE_IJMatrixPrint(fmatrix, ffilename, ierr) if(ierr .ne. 0) then print *, 'fhypre_ijmatrixprint error = ', ierr endif return end !-------------------------------------------------------------------------- ! hypre_IJMatrixSetObject !-------------------------------------------------------------------------- subroutine fhypre_ijmatrixsetobject(fmatrix, fobject) integer ierr integer*8 fmatrix integer*8 fobject call hypre_IJMatrixSetObject(fmatrix, fobject, ierr) if(ierr .ne. 0) then print *, 'fhypre_ijmatrixsetobject error = ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_IJVectorCreate !-------------------------------------------------------------------------- subroutine fhypre_ijvectorcreate(fcomm, fjlower, fjupper, fvector) integer ierr integer*8 fvector integer fcomm integer fjlower integer fjupper call HYPRE_IJVectorCreate(fcomm, fjlower, fjupper, fvector, ierr) if(ierr .ne. 0) then print *, 'fhypre_ijvectorcreate error = ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_IJVectorDestroy !-------------------------------------------------------------------------- subroutine fhypre_ijvectordestroy(fvector) integer ierr integer*8 fvector call HYPRE_IJVectorDestroy(fvector, ierr) if(ierr .ne. 0) then print *, 'fhypre_ijvectordestroy error = ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_IJVectorInitialize !-------------------------------------------------------------------------- subroutine fhypre_ijvectorinitialize(fvector) integer ierr integer*8 fvector call HYPRE_IJVectorInitialize(fvector, ierr) if(ierr .ne. 0) then print *, 'fhypre_ijvectorinitialize error = ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_IJVectorSetValues !-------------------------------------------------------------------------- subroutine fhypre_ijvectorsetvalues(fvector, fnum_values, 1 findices, fvalues) integer ierr integer*8 fvector integer fnum_values integer findices double precision fvalues call HYPRE_IJVectorSetValues(fvector, fnum_values, findices, 1 fvalues, ierr) if(ierr .ne. 0) then print *, 'fhypre_ijvectorsetvalues error = ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_IJVectorAddToValues !-------------------------------------------------------------------------- subroutine fhypre_ijvectoraddtovalues(fvector, fnum_values, 1 findices, fvalues) integer ierr integer*8 fvector integer fnum_values integer findices double precision fvalues call HYPRE_IJVectorAddToValues(fvector, fnum_values, findices, 1 fvalues, ierr) if(ierr .ne. 0) then print *, 'fhypre_ijvectoraddtovalues error = ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_IJVectorAssemble !-------------------------------------------------------------------------- subroutine fhypre_ijvectorassemble(fvector) integer ierr integer*8 fvector call HYPRE_IJVectorAssemble(fvector , ierr) if(ierr .ne. 0) then print *, 'fhypre_ijvectorassemble error = ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_IJVectorGetValues !-------------------------------------------------------------------------- subroutine fhypre_ijvectorgetvalues(fvector, fnum_values, 1 findices, fvalues) integer ierr integer*8 fvector integer fnum_values integer findices double precision fvalues call HYPRE_IJVectorGetValues(fvector, fnum_values, findices, 1 fvalues, ierr) if(ierr .ne. 0) then print *, 'fhypre_ijvectorgetvalues error = ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_IJVectorSetObjectType !-------------------------------------------------------------------------- subroutine fhypre_ijvectorsetobjecttype(fvector, ftype) integer ierr integer*8 fvector integer ftype call HYPRE_IJVectorSetObjectType(fvector, ftype, ierr) if(ierr .ne. 0) then print *, 'fhypre_ijvectorsetobjecttype error = ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_IJVectorGetObjectType !-------------------------------------------------------------------------- subroutine fhypre_ijvectorgetobjecttype(fvector, ftype) integer ierr integer*8 fvector integer ftype call HYPRE_IJVectorGetObjectType(fvector, ftype, ierr) if(ierr .ne. 0) then print *, 'fhypre_ijvectorgetobjecttype error = ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_IJVectorGetObject !-------------------------------------------------------------------------- subroutine fhypre_ijvectorgetobject(fvector, fobject) integer ierr integer*8 fvector integer*8 fobject call HYPRE_IJVectorGetObject(fvector, fobject, ierr) if(ierr .ne. 0) then print *, 'fhypre_ijvectorgetobject error = ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_IJVectorRead !-------------------------------------------------------------------------- subroutine fhypre_ijvectorread(ffilename, fcomm, fobject_type, 1 fvector) integer ierr integer*8 fvector integer*8 fcomm integer fobject_type character*(*) ffilename call HYPRE_IJVectorRead(ffilename, fcomm, fobject_type, fvector, 1 ierr) if(ierr .ne. 0) then print *, 'fhypre_ijvectorread error = ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_IJVectorPrint !-------------------------------------------------------------------------- subroutine fhypre_ijvectorprint(fvector, ffilename) integer ierr integer*8 fvector character*(*) ffilename call HYPRE_IJVectorPrint(fvector, ffilename, ierr) if(ierr .ne. 0) then print *, 'fhypre_ijvectorprint error = ', ierr endif return end hypre-2.33.0/src/test/for_maxwell.c000066400000000000000000002321201477326011500171650ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include #include #include #include "_hypre_utilities.h" #include "HYPRE_sstruct_ls.h" #include "HYPRE_krylov.h" #include "_hypre_sstruct_mv.h" #include "_hypre_sstruct_ls.h" #define DEBUG 0 /* include fortran headers */ #ifdef HYPRE_FORTRAN #include "fortran.h" #include "hypre_sstruct_fortran_test.h" #endif /*-------------------------------------------------------------------------- * Data structures *--------------------------------------------------------------------------*/ char infile_default[50] = "sstruct.in.default"; typedef HYPRE_Int Index[3]; typedef HYPRE_Int ProblemIndex[9]; typedef struct { /* for GridSetExtents */ HYPRE_Int nboxes; ProblemIndex *ilowers; ProblemIndex *iuppers; HYPRE_Int *boxsizes; HYPRE_Int max_boxsize; /* for GridSetVariables */ HYPRE_Int nvars; #ifdef HYPRE_FORTRAN hypre_F90_Obj *vartypes; #else HYPRE_SStructVariable *vartypes; #endif /* for GridAddVariables */ HYPRE_Int add_nvars; ProblemIndex *add_indexes; #ifdef HYPRE_FORTRAN hypre_F90_Obj *add_vartypes; #else HYPRE_SStructVariable *add_vartypes; #endif /* for GridSetNeighborBox */ HYPRE_Int glue_nboxes; ProblemIndex *glue_ilowers; ProblemIndex *glue_iuppers; HYPRE_Int *glue_nbor_parts; ProblemIndex *glue_nbor_ilowers; ProblemIndex *glue_nbor_iuppers; Index *glue_index_maps; /* for GraphSetStencil */ HYPRE_Int *stencil_num; /* for GraphAddEntries */ HYPRE_Int graph_nentries; ProblemIndex *graph_ilowers; ProblemIndex *graph_iuppers; Index *graph_strides; HYPRE_Int *graph_vars; HYPRE_Int *graph_to_parts; ProblemIndex *graph_to_ilowers; ProblemIndex *graph_to_iuppers; Index *graph_to_strides; HYPRE_Int *graph_to_vars; Index *graph_index_maps; Index *graph_index_signs; HYPRE_Int *graph_entries; HYPRE_Real *graph_values; HYPRE_Int *graph_boxsizes; HYPRE_Int matrix_nentries; ProblemIndex *matrix_ilowers; ProblemIndex *matrix_iuppers; Index *matrix_strides; HYPRE_Int *matrix_vars; HYPRE_Int *matrix_entries; HYPRE_Real *matrix_values; Index periodic; } ProblemPartData; typedef struct { HYPRE_Int ndim; HYPRE_Int nparts; ProblemPartData *pdata; HYPRE_Int max_boxsize; HYPRE_Int nstencils; HYPRE_Int *stencil_sizes; Index **stencil_offsets; HYPRE_Int **stencil_vars; HYPRE_Real **stencil_values; HYPRE_Int symmetric_nentries; HYPRE_Int *symmetric_parts; HYPRE_Int *symmetric_vars; HYPRE_Int *symmetric_to_vars; HYPRE_Int *symmetric_booleans; HYPRE_Int ns_symmetric; Index rfactor; HYPRE_Int npools; HYPRE_Int *pools; /* array of size nparts */ } ProblemData; /*-------------------------------------------------------------------------- * Read routines *--------------------------------------------------------------------------*/ HYPRE_Int SScanIntArray( char *sdata_ptr, char **sdata_ptr_ptr, HYPRE_Int size, HYPRE_Int *array ) { HYPRE_Int i; sdata_ptr += strspn(sdata_ptr, " \t\n["); for (i = 0; i < size; i++) { array[i] = strtol(sdata_ptr, &sdata_ptr, 10); } sdata_ptr += strcspn(sdata_ptr, "]") + 1; *sdata_ptr_ptr = sdata_ptr; return 0; } HYPRE_Int SScanProblemIndex( char *sdata_ptr, char **sdata_ptr_ptr, HYPRE_Int ndim, ProblemIndex index ) { HYPRE_Int i; char sign[3]; /* initialize index array */ for (i = 0; i < 9; i++) { index[i] = 0; } sdata_ptr += strspn(sdata_ptr, " \t\n("); switch (ndim) { case 1: hypre_sscanf(sdata_ptr, "%d%c", &index[0], &sign[0]); break; case 2: hypre_sscanf(sdata_ptr, "%d%c%d%c", &index[0], &sign[0], &index[1], &sign[1]); break; case 3: hypre_sscanf(sdata_ptr, "%d%c%d%c%d%c", &index[0], &sign[0], &index[1], &sign[1], &index[2], &sign[2]); break; } sdata_ptr += strcspn(sdata_ptr, ":)"); if ( *sdata_ptr == ':' ) { /* read in optional shift */ sdata_ptr += 1; switch (ndim) { case 1: hypre_sscanf(sdata_ptr, "%d", &index[6]); break; case 2: hypre_sscanf(sdata_ptr, "%d%d", &index[6], &index[7]); break; case 3: hypre_sscanf(sdata_ptr, "%d%d%d", &index[6], &index[7], &index[8]); break; } /* pre-shift the index */ for (i = 0; i < ndim; i++) { index[i] += index[i + 6]; } } sdata_ptr += strcspn(sdata_ptr, ")") + 1; for (i = 0; i < ndim; i++) { if (sign[i] == '+') { index[i + 3] = 1; } } *sdata_ptr_ptr = sdata_ptr; return 0; } HYPRE_Int ReadData( char *filename, ProblemData *data_ptr ) { ProblemData data; ProblemPartData pdata; HYPRE_Int myid; FILE *file; char *sdata = NULL; char *sdata_line; char *sdata_ptr; HYPRE_Int sdata_size; HYPRE_Int size; HYPRE_Int memchunk = 10000; HYPRE_Int maxline = 250; char key[250]; HYPRE_Int part, var, entry, s, i, il, iu; /*----------------------------------------------------------- * Read data file from process 0, then broadcast *-----------------------------------------------------------*/ hypre_MPI_Comm_rank(hypre_MPI_COMM_WORLD, &myid); if (myid == 0) { if ((file = fopen(filename, "r")) == NULL) { hypre_printf("Error: can't open input file %s\n", filename); exit(1); } /* allocate initial space, and read first input line */ sdata_size = 0; sdata = hypre_TAlloc(char, memchunk, HYPRE_MEMORY_HOST); sdata_line = fgets(sdata, maxline, file); s = 0; while (sdata_line != NULL) { sdata_size += strlen(sdata_line) + 1; /* allocate more space, if necessary */ if ((sdata_size + maxline) > s) { sdata = hypre_TReAlloc(sdata, char, (sdata_size + memchunk), HYPRE_MEMORY_HOST); s = sdata_size + memchunk; } /* read the next input line */ sdata_line = fgets((sdata + sdata_size), maxline, file); } } /* broadcast the data size */ hypre_MPI_Bcast(&sdata_size, 1, HYPRE_MPI_INT, 0, hypre_MPI_COMM_WORLD); /* broadcast the data */ sdata = hypre_TReAlloc(sdata, char, sdata_size, HYPRE_MEMORY_HOST); hypre_MPI_Bcast(sdata, sdata_size, hypre_MPI_CHAR, 0, hypre_MPI_COMM_WORLD); /*----------------------------------------------------------- * Parse the data and fill ProblemData structure *-----------------------------------------------------------*/ data.max_boxsize = 0; data.symmetric_nentries = 0; data.symmetric_parts = NULL; data.symmetric_vars = NULL; data.symmetric_to_vars = NULL; data.symmetric_booleans = NULL; data.ns_symmetric = 0; sdata_line = sdata; while (sdata_line < (sdata + sdata_size)) { sdata_ptr = sdata_line; if ( ( hypre_sscanf(sdata_ptr, "%s", key) > 0 ) && ( sdata_ptr[0] != '#' ) ) { sdata_ptr += strcspn(sdata_ptr, " \t\n"); if ( strcmp(key, "GridCreate:") == 0 ) { data.ndim = strtol(sdata_ptr, &sdata_ptr, 10); data.nparts = strtol(sdata_ptr, &sdata_ptr, 10); data.pdata = hypre_CTAlloc(ProblemPartData, data.nparts, HYPRE_MEMORY_HOST); } else if ( strcmp(key, "GridSetExtents:") == 0 ) { part = strtol(sdata_ptr, &sdata_ptr, 10); pdata = data.pdata[part]; if ((pdata.nboxes % 10) == 0) { size = pdata.nboxes + 10; pdata.ilowers = hypre_TReAlloc(pdata.ilowers, ProblemIndex, size, HYPRE_MEMORY_HOST); pdata.iuppers = hypre_TReAlloc(pdata.iuppers, ProblemIndex, size, HYPRE_MEMORY_HOST); pdata.boxsizes = hypre_TReAlloc(pdata.boxsizes, HYPRE_Int, size, HYPRE_MEMORY_HOST); } SScanProblemIndex(sdata_ptr, &sdata_ptr, data.ndim, pdata.ilowers[pdata.nboxes]); SScanProblemIndex(sdata_ptr, &sdata_ptr, data.ndim, pdata.iuppers[pdata.nboxes]); /* check use of +- in GridSetExtents */ il = 1; iu = 1; for (i = 0; i < data.ndim; i++) { il *= pdata.ilowers[pdata.nboxes][i + 3]; iu *= pdata.iuppers[pdata.nboxes][i + 3]; } if ( (il != 0) || (iu != 1) ) { hypre_printf("Error: Invalid use of `+-' in GridSetExtents\n"); exit(1); } pdata.boxsizes[pdata.nboxes] = 1; for (i = 0; i < 3; i++) { pdata.boxsizes[pdata.nboxes] *= (pdata.iuppers[pdata.nboxes][i] - pdata.ilowers[pdata.nboxes][i] + 2); } pdata.max_boxsize = hypre_max(pdata.max_boxsize, pdata.boxsizes[pdata.nboxes]); pdata.nboxes++; data.pdata[part] = pdata; } else if ( strcmp(key, "GridSetVariables:") == 0 ) { part = strtol(sdata_ptr, &sdata_ptr, 10); pdata = data.pdata[part]; pdata.nvars = strtol(sdata_ptr, &sdata_ptr, 10); #ifdef HYPRE_FORTRAN pdata.vartypes = hypre_CTAlloc(hypre_F90_Obj, pdata.nvars, HYPRE_MEMORY_HOST); #else pdata.vartypes = hypre_CTAlloc(HYPRE_SStructVariable, pdata.nvars, HYPRE_MEMORY_HOST); #endif SScanIntArray(sdata_ptr, &sdata_ptr, pdata.nvars, (HYPRE_Int *) pdata.vartypes); data.pdata[part] = pdata; } else if ( strcmp(key, "GridAddVariables:") == 0 ) { /* TODO */ hypre_printf("GridAddVariables not yet implemented!\n"); exit(1); } else if ( strcmp(key, "GridSetNeighborBox:") == 0 ) { part = strtol(sdata_ptr, &sdata_ptr, 10); pdata = data.pdata[part]; if ((pdata.glue_nboxes % 10) == 0) { size = pdata.glue_nboxes + 10; pdata.glue_ilowers = hypre_TReAlloc(pdata.glue_ilowers, ProblemIndex, size, HYPRE_MEMORY_HOST); pdata.glue_iuppers = hypre_TReAlloc(pdata.glue_iuppers, ProblemIndex, size, HYPRE_MEMORY_HOST); pdata.glue_nbor_parts = hypre_TReAlloc(pdata.glue_nbor_parts, HYPRE_Int, size, HYPRE_MEMORY_HOST); pdata.glue_nbor_ilowers = hypre_TReAlloc(pdata.glue_nbor_ilowers, ProblemIndex, size, HYPRE_MEMORY_HOST); pdata.glue_nbor_iuppers = hypre_TReAlloc(pdata.glue_nbor_iuppers, ProblemIndex, size, HYPRE_MEMORY_HOST); pdata.glue_index_maps = hypre_TReAlloc(pdata.glue_index_maps, Index, size, HYPRE_MEMORY_HOST); } SScanProblemIndex(sdata_ptr, &sdata_ptr, data.ndim, pdata.glue_ilowers[pdata.glue_nboxes]); SScanProblemIndex(sdata_ptr, &sdata_ptr, data.ndim, pdata.glue_iuppers[pdata.glue_nboxes]); pdata.glue_nbor_parts[pdata.glue_nboxes] = strtol(sdata_ptr, &sdata_ptr, 10); SScanProblemIndex(sdata_ptr, &sdata_ptr, data.ndim, pdata.glue_nbor_ilowers[pdata.glue_nboxes]); SScanProblemIndex(sdata_ptr, &sdata_ptr, data.ndim, pdata.glue_nbor_iuppers[pdata.glue_nboxes]); SScanIntArray(sdata_ptr, &sdata_ptr, data.ndim, pdata.glue_index_maps[pdata.glue_nboxes]); for (i = data.ndim; i < 3; i++) { pdata.glue_index_maps[pdata.glue_nboxes][i] = i; } pdata.glue_nboxes++; data.pdata[part] = pdata; } else if ( strcmp(key, "GridSetPeriodic:") == 0 ) { part = strtol(sdata_ptr, &sdata_ptr, 10); pdata = data.pdata[part]; SScanIntArray(sdata_ptr, &sdata_ptr, data.ndim, pdata.periodic); for (i = data.ndim; i < 3; i++) { pdata.periodic[i] = 0; } data.pdata[part] = pdata; } else if ( strcmp(key, "StencilCreate:") == 0 ) { data.nstencils = strtol(sdata_ptr, &sdata_ptr, 10); data.stencil_sizes = hypre_CTAlloc(HYPRE_Int, data.nstencils, HYPRE_MEMORY_HOST); data.stencil_offsets = hypre_CTAlloc(Index *, data.nstencils, HYPRE_MEMORY_HOST); data.stencil_vars = hypre_CTAlloc(HYPRE_Int *, data.nstencils, HYPRE_MEMORY_HOST); data.stencil_values = hypre_CTAlloc(HYPRE_Real *, data.nstencils, HYPRE_MEMORY_HOST); SScanIntArray(sdata_ptr, &sdata_ptr, data.nstencils, data.stencil_sizes); for (s = 0; s < data.nstencils; s++) { data.stencil_offsets[s] = hypre_CTAlloc(Index, data.stencil_sizes[s], HYPRE_MEMORY_HOST); data.stencil_vars[s] = hypre_CTAlloc(HYPRE_Int, data.stencil_sizes[s], HYPRE_MEMORY_HOST); data.stencil_values[s] = hypre_CTAlloc(HYPRE_Real, data.stencil_sizes[s], HYPRE_MEMORY_HOST); } } else if ( strcmp(key, "StencilSetEntry:") == 0 ) { s = strtol(sdata_ptr, &sdata_ptr, 10); entry = strtol(sdata_ptr, &sdata_ptr, 10); SScanIntArray(sdata_ptr, &sdata_ptr, data.ndim, data.stencil_offsets[s][entry]); for (i = data.ndim; i < 3; i++) { data.stencil_offsets[s][entry][i] = 0; } data.stencil_vars[s][entry] = strtol(sdata_ptr, &sdata_ptr, 10); data.stencil_values[s][entry] = (HYPRE_Real)strtod(sdata_ptr, &sdata_ptr); } else if ( strcmp(key, "GraphSetStencil:") == 0 ) { part = strtol(sdata_ptr, &sdata_ptr, 10); var = strtol(sdata_ptr, &sdata_ptr, 10); s = strtol(sdata_ptr, &sdata_ptr, 10); pdata = data.pdata[part]; if (pdata.stencil_num == NULL) { pdata.stencil_num = hypre_CTAlloc(HYPRE_Int, pdata.nvars, HYPRE_MEMORY_HOST); } pdata.stencil_num[var] = s; data.pdata[part] = pdata; } else if ( strcmp(key, "GraphAddEntries:") == 0 ) { part = strtol(sdata_ptr, &sdata_ptr, 10); pdata = data.pdata[part]; if ((pdata.graph_nentries % 10) == 0) { size = pdata.graph_nentries + 10; pdata.graph_ilowers = hypre_TReAlloc(pdata.graph_ilowers, ProblemIndex, size, HYPRE_MEMORY_HOST); pdata.graph_iuppers = hypre_TReAlloc(pdata.graph_iuppers, ProblemIndex, size, HYPRE_MEMORY_HOST); pdata.graph_strides = hypre_TReAlloc(pdata.graph_strides, Index, size, HYPRE_MEMORY_HOST); pdata.graph_vars = hypre_TReAlloc(pdata.graph_vars, HYPRE_Int, size, HYPRE_MEMORY_HOST); pdata.graph_to_parts = hypre_TReAlloc(pdata.graph_to_parts, HYPRE_Int, size, HYPRE_MEMORY_HOST); pdata.graph_to_ilowers = hypre_TReAlloc(pdata.graph_to_ilowers, ProblemIndex, size, HYPRE_MEMORY_HOST); pdata.graph_to_iuppers = hypre_TReAlloc(pdata.graph_to_iuppers, ProblemIndex, size, HYPRE_MEMORY_HOST); pdata.graph_to_strides = hypre_TReAlloc(pdata.graph_to_strides, Index, size, HYPRE_MEMORY_HOST); pdata.graph_to_vars = hypre_TReAlloc(pdata.graph_to_vars, HYPRE_Int, size, HYPRE_MEMORY_HOST); pdata.graph_index_maps = hypre_TReAlloc(pdata.graph_index_maps, Index, size, HYPRE_MEMORY_HOST); pdata.graph_index_signs = hypre_TReAlloc(pdata.graph_index_signs, Index, size, HYPRE_MEMORY_HOST); pdata.graph_entries = hypre_TReAlloc(pdata.graph_entries, HYPRE_Int, size, HYPRE_MEMORY_HOST); pdata.graph_values = hypre_TReAlloc(pdata.graph_values, HYPRE_Real, size, HYPRE_MEMORY_HOST); pdata.graph_boxsizes = hypre_TReAlloc(pdata.graph_boxsizes, HYPRE_Int, size, HYPRE_MEMORY_HOST); } SScanProblemIndex(sdata_ptr, &sdata_ptr, data.ndim, pdata.graph_ilowers[pdata.graph_nentries]); SScanProblemIndex(sdata_ptr, &sdata_ptr, data.ndim, pdata.graph_iuppers[pdata.graph_nentries]); SScanIntArray(sdata_ptr, &sdata_ptr, data.ndim, pdata.graph_strides[pdata.graph_nentries]); for (i = data.ndim; i < 3; i++) { pdata.graph_strides[pdata.graph_nentries][i] = 1; } pdata.graph_vars[pdata.graph_nentries] = strtol(sdata_ptr, &sdata_ptr, 10); pdata.graph_to_parts[pdata.graph_nentries] = strtol(sdata_ptr, &sdata_ptr, 10); SScanProblemIndex(sdata_ptr, &sdata_ptr, data.ndim, pdata.graph_to_ilowers[pdata.graph_nentries]); SScanProblemIndex(sdata_ptr, &sdata_ptr, data.ndim, pdata.graph_to_iuppers[pdata.graph_nentries]); SScanIntArray(sdata_ptr, &sdata_ptr, data.ndim, pdata.graph_to_strides[pdata.graph_nentries]); for (i = data.ndim; i < 3; i++) { pdata.graph_to_strides[pdata.graph_nentries][i] = 1; } pdata.graph_to_vars[pdata.graph_nentries] = strtol(sdata_ptr, &sdata_ptr, 10); SScanIntArray(sdata_ptr, &sdata_ptr, data.ndim, pdata.graph_index_maps[pdata.graph_nentries]); for (i = data.ndim; i < 3; i++) { pdata.graph_index_maps[pdata.graph_nentries][i] = i; } for (i = 0; i < 3; i++) { pdata.graph_index_signs[pdata.graph_nentries][i] = 1; if ( pdata.graph_to_iuppers[pdata.graph_nentries][i] < pdata.graph_to_ilowers[pdata.graph_nentries][i] ) { pdata.graph_index_signs[pdata.graph_nentries][i] = -1; } } pdata.graph_entries[pdata.graph_nentries] = strtol(sdata_ptr, &sdata_ptr, 10); pdata.graph_values[pdata.graph_nentries] = (HYPRE_Real)strtod(sdata_ptr, &sdata_ptr); pdata.graph_boxsizes[pdata.graph_nentries] = 1; for (i = 0; i < 3; i++) { pdata.graph_boxsizes[pdata.graph_nentries] *= (pdata.graph_iuppers[pdata.graph_nentries][i] - pdata.graph_ilowers[pdata.graph_nentries][i] + 1); } pdata.graph_nentries++; data.pdata[part] = pdata; } else if ( strcmp(key, "MatrixSetSymmetric:") == 0 ) { if ((data.symmetric_nentries % 10) == 0) { size = data.symmetric_nentries + 10; data.symmetric_parts = hypre_TReAlloc(data.symmetric_parts, HYPRE_Int, size, HYPRE_MEMORY_HOST); data.symmetric_vars = hypre_TReAlloc(data.symmetric_vars, HYPRE_Int, size, HYPRE_MEMORY_HOST); data.symmetric_to_vars = hypre_TReAlloc(data.symmetric_to_vars, HYPRE_Int, size, HYPRE_MEMORY_HOST); data.symmetric_booleans = hypre_TReAlloc(data.symmetric_booleans, HYPRE_Int, size, HYPRE_MEMORY_HOST); } data.symmetric_parts[data.symmetric_nentries] = strtol(sdata_ptr, &sdata_ptr, 10); data.symmetric_vars[data.symmetric_nentries] = strtol(sdata_ptr, &sdata_ptr, 10); data.symmetric_to_vars[data.symmetric_nentries] = strtol(sdata_ptr, &sdata_ptr, 10); data.symmetric_booleans[data.symmetric_nentries] = strtol(sdata_ptr, &sdata_ptr, 10); data.symmetric_nentries++; } else if ( strcmp(key, "MatrixSetNSSymmetric:") == 0 ) { data.ns_symmetric = strtol(sdata_ptr, &sdata_ptr, 10); } else if ( strcmp(key, "MatrixSetValues:") == 0 ) { part = strtol(sdata_ptr, &sdata_ptr, 10); pdata = data.pdata[part]; if ((pdata.matrix_nentries % 10) == 0) { size = pdata.matrix_nentries + 10; pdata.matrix_ilowers = hypre_TReAlloc(pdata.matrix_ilowers, ProblemIndex, size, HYPRE_MEMORY_HOST); pdata.matrix_iuppers = hypre_TReAlloc(pdata.matrix_iuppers, ProblemIndex, size, HYPRE_MEMORY_HOST); pdata.matrix_strides = hypre_TReAlloc(pdata.matrix_strides, Index, size, HYPRE_MEMORY_HOST); pdata.matrix_vars = hypre_TReAlloc(pdata.matrix_vars, HYPRE_Int, size, HYPRE_MEMORY_HOST); pdata.matrix_entries = hypre_TReAlloc(pdata.matrix_entries, HYPRE_Int, size, HYPRE_MEMORY_HOST); pdata.matrix_values = hypre_TReAlloc(pdata.matrix_values, HYPRE_Real, size, HYPRE_MEMORY_HOST); } SScanProblemIndex(sdata_ptr, &sdata_ptr, data.ndim, pdata.matrix_ilowers[pdata.matrix_nentries]); SScanProblemIndex(sdata_ptr, &sdata_ptr, data.ndim, pdata.matrix_iuppers[pdata.matrix_nentries]); SScanIntArray(sdata_ptr, &sdata_ptr, data.ndim, pdata.matrix_strides[pdata.matrix_nentries]); for (i = data.ndim; i < 3; i++) { pdata.matrix_strides[pdata.matrix_nentries][i] = 1; } pdata.matrix_vars[pdata.matrix_nentries] = strtol(sdata_ptr, &sdata_ptr, 10); pdata.matrix_entries[pdata.matrix_nentries] = strtol(sdata_ptr, &sdata_ptr, 10); pdata.matrix_values[pdata.matrix_nentries] = (HYPRE_Real)strtod(sdata_ptr, &sdata_ptr); pdata.matrix_nentries++; data.pdata[part] = pdata; } else if ( strcmp(key, "rfactor:") == 0 ) { SScanIntArray(sdata_ptr, &sdata_ptr, data.ndim, data.rfactor); for (i = data.ndim; i < 3; i++) { data.rfactor[i] = 1; } } else if ( strcmp(key, "ProcessPoolCreate:") == 0 ) { data.npools = strtol(sdata_ptr, &sdata_ptr, 10); data.pools = hypre_CTAlloc(HYPRE_Int, data.nparts, HYPRE_MEMORY_HOST); } else if ( strcmp(key, "ProcessPoolSetPart:") == 0 ) { i = strtol(sdata_ptr, &sdata_ptr, 10); part = strtol(sdata_ptr, &sdata_ptr, 10); data.pools[part] = i; } } sdata_line += strlen(sdata_line) + 1; } data.max_boxsize = 0; for (part = 0; part < data.nparts; part++) { data.max_boxsize = hypre_max(data.max_boxsize, data.pdata[part].max_boxsize); } hypre_TFree(sdata, HYPRE_MEMORY_HOST); *data_ptr = data; return 0; } /*-------------------------------------------------------------------------- * Distribute routines *--------------------------------------------------------------------------*/ HYPRE_Int MapProblemIndex( ProblemIndex index, Index m ) { /* un-shift the index */ index[0] -= index[6]; index[1] -= index[7]; index[2] -= index[8]; /* map the index */ index[0] = m[0] * index[0] + (m[0] - 1) * index[3]; index[1] = m[1] * index[1] + (m[1] - 1) * index[4]; index[2] = m[2] * index[2] + (m[2] - 1) * index[5]; /* pre-shift the new mapped index */ index[0] += index[6]; index[1] += index[7]; index[2] += index[8]; return 0; } HYPRE_Int IntersectBoxes( ProblemIndex ilower1, ProblemIndex iupper1, ProblemIndex ilower2, ProblemIndex iupper2, ProblemIndex int_ilower, ProblemIndex int_iupper ) { HYPRE_Int d, size; size = 1; for (d = 0; d < 3; d++) { int_ilower[d] = hypre_max(ilower1[d], ilower2[d]); int_iupper[d] = hypre_min(iupper1[d], iupper2[d]); size *= hypre_max(0, (int_iupper[d] - int_ilower[d] + 1)); } return size; } HYPRE_Int DistributeData( ProblemData global_data, Index *refine, Index *distribute, Index *block, HYPRE_Int num_procs, HYPRE_Int myid, ProblemData *data_ptr ) { ProblemData data = global_data; ProblemPartData pdata; HYPRE_Int *pool_procs; HYPRE_Int np, pid; HYPRE_Int pool, part, box, entry, p, q, r, i, d, dmap, sign, size; Index m, mmap, n; ProblemIndex int_ilower, int_iupper; /* determine first process number in each pool */ pool_procs = hypre_CTAlloc(HYPRE_Int, (data.npools + 1), HYPRE_MEMORY_HOST); for (part = 0; part < data.nparts; part++) { pool = data.pools[part] + 1; np = distribute[part][0] * distribute[part][1] * distribute[part][2]; pool_procs[pool] = hypre_max(pool_procs[pool], np); } pool_procs[0] = 0; for (pool = 1; pool < (data.npools + 1); pool++) { pool_procs[pool] = pool_procs[pool - 1] + pool_procs[pool]; } /* check number of processes */ if (pool_procs[data.npools] != num_procs) { hypre_printf("Error: Invalid number of processes or process topology \n"); exit(1); } /* modify part data */ for (part = 0; part < data.nparts; part++) { pdata = data.pdata[part]; pool = data.pools[part]; np = distribute[part][0] * distribute[part][1] * distribute[part][2]; pid = myid - pool_procs[pool]; if ( (pid < 0) || (pid >= np) ) { /* none of this part data lives on this process */ pdata.nboxes = 0; pdata.glue_nboxes = 0; pdata.graph_nentries = 0; pdata.matrix_nentries = 0; } else { /* refine boxes */ m[0] = refine[part][0]; m[1] = refine[part][1]; m[2] = refine[part][2]; if ( (m[0] * m[1] * m[2]) > 1) { for (box = 0; box < pdata.nboxes; box++) { MapProblemIndex(pdata.ilowers[box], m); MapProblemIndex(pdata.iuppers[box], m); } for (entry = 0; entry < pdata.graph_nentries; entry++) { MapProblemIndex(pdata.graph_ilowers[entry], m); MapProblemIndex(pdata.graph_iuppers[entry], m); mmap[0] = m[pdata.graph_index_maps[entry][0]]; mmap[1] = m[pdata.graph_index_maps[entry][1]]; mmap[2] = m[pdata.graph_index_maps[entry][2]]; MapProblemIndex(pdata.graph_to_ilowers[entry], mmap); MapProblemIndex(pdata.graph_to_iuppers[entry], mmap); } for (entry = 0; entry < pdata.matrix_nentries; entry++) { MapProblemIndex(pdata.matrix_ilowers[entry], m); MapProblemIndex(pdata.matrix_iuppers[entry], m); } } /* refine and distribute boxes */ m[0] = distribute[part][0]; m[1] = distribute[part][1]; m[2] = distribute[part][2]; if ( (m[0] * m[1] * m[2]) > 1) { p = pid % m[0]; q = ((pid - p) / m[0]) % m[1]; r = (pid - p - q * m[0]) / (m[0] * m[1]); for (box = 0; box < pdata.nboxes; box++) { n[0] = pdata.iuppers[box][0] - pdata.ilowers[box][0] + 1; n[1] = pdata.iuppers[box][1] - pdata.ilowers[box][1] + 1; n[2] = pdata.iuppers[box][2] - pdata.ilowers[box][2] + 1; MapProblemIndex(pdata.ilowers[box], m); MapProblemIndex(pdata.iuppers[box], m); pdata.iuppers[box][0] = pdata.ilowers[box][0] + n[0] - 1; pdata.iuppers[box][1] = pdata.ilowers[box][1] + n[1] - 1; pdata.iuppers[box][2] = pdata.ilowers[box][2] + n[2] - 1; pdata.ilowers[box][0] = pdata.ilowers[box][0] + p * n[0]; pdata.ilowers[box][1] = pdata.ilowers[box][1] + q * n[1]; pdata.ilowers[box][2] = pdata.ilowers[box][2] + r * n[2]; pdata.iuppers[box][0] = pdata.iuppers[box][0] + p * n[0]; pdata.iuppers[box][1] = pdata.iuppers[box][1] + q * n[1]; pdata.iuppers[box][2] = pdata.iuppers[box][2] + r * n[2]; } i = 0; for (entry = 0; entry < pdata.graph_nentries; entry++) { MapProblemIndex(pdata.graph_ilowers[entry], m); MapProblemIndex(pdata.graph_iuppers[entry], m); mmap[0] = m[pdata.graph_index_maps[entry][0]]; mmap[1] = m[pdata.graph_index_maps[entry][1]]; mmap[2] = m[pdata.graph_index_maps[entry][2]]; MapProblemIndex(pdata.graph_to_ilowers[entry], mmap); MapProblemIndex(pdata.graph_to_iuppers[entry], mmap); for (box = 0; box < pdata.nboxes; box++) { size = IntersectBoxes(pdata.graph_ilowers[entry], pdata.graph_iuppers[entry], pdata.ilowers[box], pdata.iuppers[box], int_ilower, int_iupper); if (size > 0) { /* if there is an intersection, it is the only one */ for (d = 0; d < 3; d++) { dmap = pdata.graph_index_maps[entry][d]; sign = pdata.graph_index_signs[entry][d]; pdata.graph_to_iuppers[i][dmap] = pdata.graph_to_ilowers[entry][dmap] + sign * (int_iupper[d] - pdata.graph_ilowers[entry][d]); pdata.graph_to_ilowers[i][dmap] = pdata.graph_to_ilowers[entry][dmap] + sign * (int_ilower[d] - pdata.graph_ilowers[entry][d]); pdata.graph_ilowers[i][d] = int_ilower[d]; pdata.graph_iuppers[i][d] = int_iupper[d]; pdata.graph_strides[i][d] = pdata.graph_strides[entry][d]; pdata.graph_to_strides[i][d] = pdata.graph_to_strides[entry][d]; pdata.graph_index_maps[i][d] = dmap; pdata.graph_index_signs[i][d] = sign; } for (d = 3; d < 9; d++) { pdata.graph_ilowers[i][d] = pdata.graph_ilowers[entry][d]; pdata.graph_iuppers[i][d] = pdata.graph_iuppers[entry][d]; pdata.graph_to_ilowers[i][d] = pdata.graph_to_ilowers[entry][d]; pdata.graph_to_iuppers[i][d] = pdata.graph_to_iuppers[entry][d]; } pdata.graph_vars[i] = pdata.graph_vars[entry]; pdata.graph_to_parts[i] = pdata.graph_to_parts[entry]; pdata.graph_to_vars[i] = pdata.graph_to_vars[entry]; pdata.graph_entries[i] = pdata.graph_entries[entry]; pdata.graph_values[i] = pdata.graph_values[entry]; i++; break; } } } pdata.graph_nentries = i; i = 0; for (entry = 0; entry < pdata.matrix_nentries; entry++) { MapProblemIndex(pdata.matrix_ilowers[entry], m); MapProblemIndex(pdata.matrix_iuppers[entry], m); for (box = 0; box < pdata.nboxes; box++) { size = IntersectBoxes(pdata.matrix_ilowers[entry], pdata.matrix_iuppers[entry], pdata.ilowers[box], pdata.iuppers[box], int_ilower, int_iupper); if (size > 0) { /* if there is an intersection, it is the only one */ for (d = 0; d < 3; d++) { pdata.matrix_ilowers[i][d] = int_ilower[d]; pdata.matrix_iuppers[i][d] = int_iupper[d]; pdata.matrix_strides[i][d] = pdata.matrix_strides[entry][d]; } for (d = 3; d < 9; d++) { pdata.matrix_ilowers[i][d] = pdata.matrix_ilowers[entry][d]; pdata.matrix_iuppers[i][d] = pdata.matrix_iuppers[entry][d]; } pdata.matrix_vars[i] = pdata.matrix_vars[entry]; pdata.matrix_entries[i] = pdata.matrix_entries[entry]; pdata.matrix_values[i] = pdata.matrix_values[entry]; i++; break; } } } pdata.matrix_nentries = i; } /* refine and block boxes */ m[0] = block[part][0]; m[1] = block[part][1]; m[2] = block[part][2]; if ( (m[0] * m[1] * m[2]) > 1) { pdata.ilowers = hypre_TReAlloc(pdata.ilowers, ProblemIndex, m[0] * m[1] * m[2] * pdata.nboxes, HYPRE_MEMORY_HOST); pdata.iuppers = hypre_TReAlloc(pdata.iuppers, ProblemIndex, m[0] * m[1] * m[2] * pdata.nboxes, HYPRE_MEMORY_HOST); pdata.boxsizes = hypre_TReAlloc(pdata.boxsizes, HYPRE_Int, m[0] * m[1] * m[2] * pdata.nboxes, HYPRE_MEMORY_HOST); for (box = 0; box < pdata.nboxes; box++) { n[0] = pdata.iuppers[box][0] - pdata.ilowers[box][0] + 1; n[1] = pdata.iuppers[box][1] - pdata.ilowers[box][1] + 1; n[2] = pdata.iuppers[box][2] - pdata.ilowers[box][2] + 1; MapProblemIndex(pdata.ilowers[box], m); MapProblemIndex(pdata.iuppers[box], m); pdata.iuppers[box][0] = pdata.ilowers[box][0] + n[0] - 1; pdata.iuppers[box][1] = pdata.ilowers[box][1] + n[1] - 1; pdata.iuppers[box][2] = pdata.ilowers[box][2] + n[2] - 1; i = box; for (r = 0; r < m[2]; r++) { for (q = 0; q < m[1]; q++) { for (p = 0; p < m[0]; p++) { pdata.ilowers[i][0] = pdata.ilowers[box][0] + p * n[0]; pdata.ilowers[i][1] = pdata.ilowers[box][1] + q * n[1]; pdata.ilowers[i][2] = pdata.ilowers[box][2] + r * n[2]; pdata.iuppers[i][0] = pdata.iuppers[box][0] + p * n[0]; pdata.iuppers[i][1] = pdata.iuppers[box][1] + q * n[1]; pdata.iuppers[i][2] = pdata.iuppers[box][2] + r * n[2]; for (d = 3; d < 9; d++) { pdata.ilowers[i][d] = pdata.ilowers[box][d]; pdata.iuppers[i][d] = pdata.iuppers[box][d]; } i += pdata.nboxes; } } } } pdata.nboxes *= m[0] * m[1] * m[2]; for (entry = 0; entry < pdata.graph_nentries; entry++) { MapProblemIndex(pdata.graph_ilowers[entry], m); MapProblemIndex(pdata.graph_iuppers[entry], m); mmap[0] = m[pdata.graph_index_maps[entry][0]]; mmap[1] = m[pdata.graph_index_maps[entry][1]]; mmap[2] = m[pdata.graph_index_maps[entry][2]]; MapProblemIndex(pdata.graph_to_ilowers[entry], mmap); MapProblemIndex(pdata.graph_to_iuppers[entry], mmap); } for (entry = 0; entry < pdata.matrix_nentries; entry++) { MapProblemIndex(pdata.matrix_ilowers[entry], m); MapProblemIndex(pdata.matrix_iuppers[entry], m); } } /* map remaining ilowers & iuppers */ m[0] = refine[part][0] * block[part][0] * distribute[part][0]; m[1] = refine[part][1] * block[part][1] * distribute[part][1]; m[2] = refine[part][2] * block[part][2] * distribute[part][2]; if ( (m[0] * m[1] * m[2]) > 1) { for (box = 0; box < pdata.glue_nboxes; box++) { MapProblemIndex(pdata.glue_ilowers[box], m); MapProblemIndex(pdata.glue_iuppers[box], m); mmap[0] = m[pdata.glue_index_maps[box][0]]; mmap[1] = m[pdata.glue_index_maps[box][1]]; mmap[2] = m[pdata.glue_index_maps[box][2]]; MapProblemIndex(pdata.glue_nbor_ilowers[box], mmap); MapProblemIndex(pdata.glue_nbor_iuppers[box], mmap); } } /* compute box sizes, etc. */ pdata.max_boxsize = 0; for (box = 0; box < pdata.nboxes; box++) { pdata.boxsizes[box] = 1; for (i = 0; i < 3; i++) { pdata.boxsizes[box] *= (pdata.iuppers[box][i] - pdata.ilowers[box][i] + 2); } pdata.max_boxsize = hypre_max(pdata.max_boxsize, pdata.boxsizes[box]); } for (box = 0; box < pdata.graph_nentries; box++) { pdata.graph_boxsizes[box] = 1; for (i = 0; i < 3; i++) { pdata.graph_boxsizes[box] *= (pdata.graph_iuppers[box][i] - pdata.graph_ilowers[box][i] + 1); } } } if (pdata.nboxes == 0) { hypre_TFree(pdata.ilowers, HYPRE_MEMORY_HOST); hypre_TFree(pdata.iuppers, HYPRE_MEMORY_HOST); hypre_TFree(pdata.boxsizes, HYPRE_MEMORY_HOST); pdata.max_boxsize = 0; } if (pdata.glue_nboxes == 0) { hypre_TFree(pdata.glue_ilowers, HYPRE_MEMORY_HOST); hypre_TFree(pdata.glue_iuppers, HYPRE_MEMORY_HOST); hypre_TFree(pdata.glue_nbor_parts, HYPRE_MEMORY_HOST); hypre_TFree(pdata.glue_nbor_ilowers, HYPRE_MEMORY_HOST); hypre_TFree(pdata.glue_nbor_iuppers, HYPRE_MEMORY_HOST); hypre_TFree(pdata.glue_index_maps, HYPRE_MEMORY_HOST); } if (pdata.graph_nentries == 0) { hypre_TFree(pdata.graph_ilowers, HYPRE_MEMORY_HOST); hypre_TFree(pdata.graph_iuppers, HYPRE_MEMORY_HOST); hypre_TFree(pdata.graph_strides, HYPRE_MEMORY_HOST); hypre_TFree(pdata.graph_vars, HYPRE_MEMORY_HOST); hypre_TFree(pdata.graph_to_parts, HYPRE_MEMORY_HOST); hypre_TFree(pdata.graph_to_ilowers, HYPRE_MEMORY_HOST); hypre_TFree(pdata.graph_to_iuppers, HYPRE_MEMORY_HOST); hypre_TFree(pdata.graph_to_strides, HYPRE_MEMORY_HOST); hypre_TFree(pdata.graph_to_vars, HYPRE_MEMORY_HOST); hypre_TFree(pdata.graph_index_maps, HYPRE_MEMORY_HOST); hypre_TFree(pdata.graph_index_signs, HYPRE_MEMORY_HOST); hypre_TFree(pdata.graph_entries, HYPRE_MEMORY_HOST); hypre_TFree(pdata.graph_values, HYPRE_MEMORY_HOST); hypre_TFree(pdata.graph_boxsizes, HYPRE_MEMORY_HOST); } if (pdata.matrix_nentries == 0) { hypre_TFree(pdata.matrix_ilowers, HYPRE_MEMORY_HOST); hypre_TFree(pdata.matrix_iuppers, HYPRE_MEMORY_HOST); hypre_TFree(pdata.matrix_strides, HYPRE_MEMORY_HOST); hypre_TFree(pdata.matrix_vars, HYPRE_MEMORY_HOST); hypre_TFree(pdata.matrix_entries, HYPRE_MEMORY_HOST); hypre_TFree(pdata.matrix_values, HYPRE_MEMORY_HOST); } data.pdata[part] = pdata; } data.max_boxsize = 0; for (part = 0; part < data.nparts; part++) { data.max_boxsize = hypre_max(data.max_boxsize, data.pdata[part].max_boxsize); } hypre_TFree(pool_procs, HYPRE_MEMORY_HOST); *data_ptr = data; return 0; } /*-------------------------------------------------------------------------- * Destroy data *--------------------------------------------------------------------------*/ HYPRE_Int DestroyData( ProblemData data ) { ProblemPartData pdata; HYPRE_Int part, s; for (part = 0; part < data.nparts; part++) { pdata = data.pdata[part]; if (pdata.nboxes > 0) { hypre_TFree(pdata.ilowers, HYPRE_MEMORY_HOST); hypre_TFree(pdata.iuppers, HYPRE_MEMORY_HOST); hypre_TFree(pdata.boxsizes, HYPRE_MEMORY_HOST); } if (pdata.nvars > 0) { hypre_TFree(pdata.vartypes, HYPRE_MEMORY_HOST); } if (pdata.add_nvars > 0) { hypre_TFree(pdata.add_indexes, HYPRE_MEMORY_HOST); hypre_TFree(pdata.add_vartypes, HYPRE_MEMORY_HOST); } if (pdata.glue_nboxes > 0) { hypre_TFree(pdata.glue_ilowers, HYPRE_MEMORY_HOST); hypre_TFree(pdata.glue_iuppers, HYPRE_MEMORY_HOST); hypre_TFree(pdata.glue_nbor_parts, HYPRE_MEMORY_HOST); hypre_TFree(pdata.glue_nbor_ilowers, HYPRE_MEMORY_HOST); hypre_TFree(pdata.glue_nbor_iuppers, HYPRE_MEMORY_HOST); hypre_TFree(pdata.glue_index_maps, HYPRE_MEMORY_HOST); } if (pdata.nvars > 0) { hypre_TFree(pdata.stencil_num, HYPRE_MEMORY_HOST); } if (pdata.graph_nentries > 0) { hypre_TFree(pdata.graph_ilowers, HYPRE_MEMORY_HOST); hypre_TFree(pdata.graph_iuppers, HYPRE_MEMORY_HOST); hypre_TFree(pdata.graph_strides, HYPRE_MEMORY_HOST); hypre_TFree(pdata.graph_vars, HYPRE_MEMORY_HOST); hypre_TFree(pdata.graph_to_parts, HYPRE_MEMORY_HOST); hypre_TFree(pdata.graph_to_ilowers, HYPRE_MEMORY_HOST); hypre_TFree(pdata.graph_to_iuppers, HYPRE_MEMORY_HOST); hypre_TFree(pdata.graph_to_strides, HYPRE_MEMORY_HOST); hypre_TFree(pdata.graph_to_vars, HYPRE_MEMORY_HOST); hypre_TFree(pdata.graph_index_maps, HYPRE_MEMORY_HOST); hypre_TFree(pdata.graph_index_signs, HYPRE_MEMORY_HOST); hypre_TFree(pdata.graph_entries, HYPRE_MEMORY_HOST); hypre_TFree(pdata.graph_values, HYPRE_MEMORY_HOST); hypre_TFree(pdata.graph_boxsizes, HYPRE_MEMORY_HOST); } if (pdata.matrix_nentries > 0) { hypre_TFree(pdata.matrix_ilowers, HYPRE_MEMORY_HOST); hypre_TFree(pdata.matrix_iuppers, HYPRE_MEMORY_HOST); hypre_TFree(pdata.matrix_strides, HYPRE_MEMORY_HOST); hypre_TFree(pdata.matrix_vars, HYPRE_MEMORY_HOST); hypre_TFree(pdata.matrix_entries, HYPRE_MEMORY_HOST); hypre_TFree(pdata.matrix_values, HYPRE_MEMORY_HOST); } } hypre_TFree(data.pdata, HYPRE_MEMORY_HOST); for (s = 0; s < data.nstencils; s++) { hypre_TFree(data.stencil_offsets[s], HYPRE_MEMORY_HOST); hypre_TFree(data.stencil_vars[s], HYPRE_MEMORY_HOST); hypre_TFree(data.stencil_values[s], HYPRE_MEMORY_HOST); } hypre_TFree(data.stencil_sizes, HYPRE_MEMORY_HOST); hypre_TFree(data.stencil_offsets, HYPRE_MEMORY_HOST); hypre_TFree(data.stencil_vars, HYPRE_MEMORY_HOST); hypre_TFree(data.stencil_values, HYPRE_MEMORY_HOST); if (data.symmetric_nentries > 0) { hypre_TFree(data.symmetric_parts, HYPRE_MEMORY_HOST); hypre_TFree(data.symmetric_vars, HYPRE_MEMORY_HOST); hypre_TFree(data.symmetric_to_vars, HYPRE_MEMORY_HOST); hypre_TFree(data.symmetric_booleans, HYPRE_MEMORY_HOST); } hypre_TFree(data.pools, HYPRE_MEMORY_HOST); return 0; } /*-------------------------------------------------------------------------- * Compute new box based on variable type *--------------------------------------------------------------------------*/ HYPRE_Int GetVariableBox( Index cell_ilower, Index cell_iupper, HYPRE_Int int_vartype, Index var_ilower, Index var_iupper ) { HYPRE_Int ierr = 0; #ifdef HYPRE_FORTRAN hypre_F90_Obj vartype = (hypre_F90_Obj) int_vartype; #else HYPRE_SStructVariable vartype = (HYPRE_SStructVariable) int_vartype; #endif var_ilower[0] = cell_ilower[0]; var_ilower[1] = cell_ilower[1]; var_ilower[2] = cell_ilower[2]; var_iupper[0] = cell_iupper[0]; var_iupper[1] = cell_iupper[1]; var_iupper[2] = cell_iupper[2]; switch (vartype) { case HYPRE_SSTRUCT_VARIABLE_CELL: var_ilower[0] -= 0; var_ilower[1] -= 0; var_ilower[2] -= 0; break; case HYPRE_SSTRUCT_VARIABLE_NODE: var_ilower[0] -= 1; var_ilower[1] -= 1; var_ilower[2] -= 1; break; case HYPRE_SSTRUCT_VARIABLE_XFACE: var_ilower[0] -= 1; var_ilower[1] -= 0; var_ilower[2] -= 0; break; case HYPRE_SSTRUCT_VARIABLE_YFACE: var_ilower[0] -= 0; var_ilower[1] -= 1; var_ilower[2] -= 0; break; case HYPRE_SSTRUCT_VARIABLE_ZFACE: var_ilower[0] -= 0; var_ilower[1] -= 0; var_ilower[2] -= 1; break; case HYPRE_SSTRUCT_VARIABLE_XEDGE: var_ilower[0] -= 0; var_ilower[1] -= 1; var_ilower[2] -= 1; break; case HYPRE_SSTRUCT_VARIABLE_YEDGE: var_ilower[0] -= 1; var_ilower[1] -= 0; var_ilower[2] -= 1; break; case HYPRE_SSTRUCT_VARIABLE_ZEDGE: var_ilower[0] -= 1; var_ilower[1] -= 1; var_ilower[2] -= 0; break; case HYPRE_SSTRUCT_VARIABLE_UNDEFINED: break; } return ierr; } /*-------------------------------------------------------------------------- * Print usage info *--------------------------------------------------------------------------*/ HYPRE_Int PrintUsage( char *progname, HYPRE_Int myid ) { if ( myid == 0 ) { hypre_printf("\n"); hypre_printf("Usage: %s []\n", progname); hypre_printf("\n"); hypre_printf(" -in : input file (default is `%s')\n", infile_default); hypre_printf("\n"); hypre_printf(" -pt ... : set part(s) for subsequent options\n"); hypre_printf(" -r : refine part(s)\n"); hypre_printf(" -P : refine and distribute part(s)\n"); hypre_printf(" -b : refine and block part(s)\n"); hypre_printf(" -solver : solver ID (default = 39)\n"); hypre_printf(" -print : print out the system\n"); hypre_printf(" -v : SysPFMG and Struct- # of pre and post relax\n"); hypre_printf(" -sym : Struct- symmetric storage (1) or not (0)\n"); hypre_printf("\n"); } return 0; } /*-------------------------------------------------------------------------- * Test driver for semi-structured matrix interface *--------------------------------------------------------------------------*/ HYPRE_Int main( HYPRE_Int argc, char *argv[] ) { char *infile; ProblemData global_data; ProblemData data; ProblemPartData pdata; HYPRE_Int nparts; HYPRE_Int *parts; Index *refine; Index *distribute; Index *block; HYPRE_Int solver_id; HYPRE_Int print_system; #ifdef HYPRE_FORTRAN hypre_F90_Obj grid; hypre_F90_Obj *stencils; hypre_F90_Obj graph; hypre_F90_Obj A; hypre_F90_Obj T, parA; hypre_F90_Obj b; hypre_F90_Obj x; hypre_F90_Obj parb, parx; hypre_F90_Obj solver; hypre_F90_Obj cell_grid; #else HYPRE_SStructGrid grid; HYPRE_SStructStencil *stencils; HYPRE_SStructGraph graph; HYPRE_SStructMatrix A; HYPRE_ParCSRMatrix T, parA; HYPRE_SStructVector b; HYPRE_SStructVector x; HYPRE_ParVector parb, parx; HYPRE_SStructSolver solver; HYPRE_StructGrid cell_grid; #endif hypre_Box *bounding_box; HYPRE_Real h; HYPRE_Int **bdryRanks, *bdryRanksCnt; Index ilower, iupper; Index index, to_index; HYPRE_Real *values; HYPRE_Int num_iterations; HYPRE_Real final_res_norm; HYPRE_Int num_procs, myid; HYPRE_Int time_index; HYPRE_Int n_pre, n_post; HYPRE_Int arg_index, part, box, var, entry, s, i, j, k; #ifdef HYPRE_FORTRAN hypre_F90_Obj long_temp_COMM; HYPRE_Int temp_COMM; HYPRE_Int zero = 0; HYPRE_Int one = 1; HYPRE_Int twenty = 20; HYPRE_Int for_HYPRE_PARCSR = 5555; HYPRE_Real ftol = 1.e-8; #endif /*----------------------------------------------------------- * Initialize some stuff *-----------------------------------------------------------*/ /* Initialize MPI */ hypre_MPI_Init(&argc, &argv); hypre_MPI_Comm_size(hypre_MPI_COMM_WORLD, &num_procs); hypre_MPI_Comm_rank(hypre_MPI_COMM_WORLD, &myid); /*----------------------------------------------------------- * Read input file *-----------------------------------------------------------*/ arg_index = 1; /* parse command line for input file name */ infile = infile_default; if (argc > 1) { if ( strcmp(argv[arg_index], "-in") == 0 ) { arg_index++; infile = argv[arg_index++]; } } ReadData(infile, &global_data); /*----------------------------------------------------------- * Set defaults *-----------------------------------------------------------*/ nparts = global_data.nparts; parts = hypre_TAlloc(HYPRE_Int, nparts, HYPRE_MEMORY_HOST); refine = hypre_TAlloc(Index, nparts, HYPRE_MEMORY_HOST); distribute = hypre_TAlloc(Index, nparts, HYPRE_MEMORY_HOST); block = hypre_TAlloc(Index, nparts, HYPRE_MEMORY_HOST); for (part = 0; part < nparts; part++) { parts[part] = part; for (j = 0; j < 3; j++) { refine[part][j] = 1; distribute[part][j] = 1; block[part][j] = 1; } } print_system = 0; n_pre = 1; n_post = 1; /*----------------------------------------------------------- * Parse command line *-----------------------------------------------------------*/ while (arg_index < argc) { if ( strcmp(argv[arg_index], "-pt") == 0 ) { arg_index++; nparts = 0; while ( strncmp(argv[arg_index], "-", 1) != 0 ) { parts[nparts++] = atoi(argv[arg_index++]); } } else if ( strcmp(argv[arg_index], "-r") == 0 ) { arg_index++; for (i = 0; i < nparts; i++) { part = parts[i]; k = arg_index; for (j = 0; j < 3; j++) { refine[part][j] = atoi(argv[k++]); } } arg_index += 3; } else if ( strcmp(argv[arg_index], "-P") == 0 ) { arg_index++; for (i = 0; i < nparts; i++) { part = parts[i]; k = arg_index; for (j = 0; j < 3; j++) { distribute[part][j] = atoi(argv[k++]); } } arg_index += 3; } else if ( strcmp(argv[arg_index], "-b") == 0 ) { arg_index++; for (i = 0; i < nparts; i++) { part = parts[i]; k = arg_index; for (j = 0; j < 3; j++) { block[part][j] = atoi(argv[k++]); } } arg_index += 3; } else if ( strcmp(argv[arg_index], "-solver") == 0 ) { arg_index++; solver_id = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-print") == 0 ) { arg_index++; print_system = 1; } else if ( strcmp(argv[arg_index], "-v") == 0 ) { arg_index++; n_pre = atoi(argv[arg_index++]); n_post = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-help") == 0 ) { PrintUsage(argv[0], myid); exit(1); break; } else { break; } } /*----------------------------------------------------------- * Distribute data *-----------------------------------------------------------*/ DistributeData(global_data, refine, distribute, block, num_procs, myid, &data); /*----------------------------------------------------------- * Synchronize so that timings make sense *-----------------------------------------------------------*/ hypre_MPI_Barrier(hypre_MPI_COMM_WORLD); /*----------------------------------------------------------- * Set up the grid *-----------------------------------------------------------*/ #ifdef HYPRE_FORTRAN temp_COMM = (HYPRE_Int) hypre_MPI_COMM_WORLD; long_temp_COMM = (hypre_F90_Obj) hypre_MPI_COMM_WORLD; #endif time_index = hypre_InitializeTiming("SStruct Interface"); hypre_BeginTiming(time_index); #ifdef HYPRE_FORTRAN HYPRE_SStructGridCreate(&temp_COMM, &data.ndim, &data.nparts, &grid); #else HYPRE_SStructGridCreate(hypre_MPI_COMM_WORLD, data.ndim, data.nparts, &grid); #endif for (part = 0; part < data.nparts; part++) { pdata = data.pdata[part]; for (box = 0; box < pdata.nboxes; box++) { #ifdef HYPRE_FORTRAN HYPRE_SStructGridSetExtents(&grid, &part, pdata.ilowers[box], pdata.iuppers[box]); #else HYPRE_SStructGridSetExtents(grid, part, pdata.ilowers[box], pdata.iuppers[box]); #endif } #ifdef HYPRE_FORTRAN HYPRE_SStructGridSetVariables(&grid, &part, &pdata.nvars, pdata.vartypes); #else HYPRE_SStructGridSetVariables(grid, part, pdata.nvars, pdata.vartypes); #endif /* GridAddVariabes */ /* GridSetNeighborBox */ for (box = 0; box < pdata.glue_nboxes; box++) { #ifdef HYPRE_FORTRAN HYPRE_SStructGridSetNeighborBox(&grid, &part, pdata.glue_ilowers[box], pdata.glue_iuppers[box], &pdata.glue_nbor_parts[box], pdata.glue_nbor_ilowers[box], pdata.glue_nbor_iuppers[box], pdata.glue_index_maps[box]); #else HYPRE_SStructGridSetNeighborBox(grid, part, pdata.glue_ilowers[box], pdata.glue_iuppers[box], pdata.glue_nbor_parts[box], pdata.glue_nbor_ilowers[box], pdata.glue_nbor_iuppers[box], pdata.glue_index_maps[box]); #endif } #ifdef HYPRE_FORTRAN HYPRE_SStructGridSetPeriodic(&grid, &part, pdata.periodic); #else HYPRE_SStructGridSetPeriodic(grid, part, pdata.periodic); #endif } #ifdef HYPRE_FORTRAN HYPRE_SStructGridAssemble(&grid); #else HYPRE_SStructGridAssemble(grid); #endif /*----------------------------------------------------------- * Set up the stencils *-----------------------------------------------------------*/ #ifdef HYPRE_FORTRAN stencils = hypre_CTAlloc(hypre_F90_Obj, data.nstencils, HYPRE_MEMORY_HOST); #else stencils = hypre_CTAlloc(HYPRE_SStructStencil, data.nstencils, HYPRE_MEMORY_HOST); #endif for (s = 0; s < data.nstencils; s++) { #ifdef HYPRE_FORTRAN HYPRE_SStructStencilCreate(&data.ndim, &data.stencil_sizes[s], &stencils[s]); #else HYPRE_SStructStencilCreate(data.ndim, data.stencil_sizes[s], &stencils[s]); #endif for (i = 0; i < data.stencil_sizes[s]; i++) { #ifdef HYPRE_FORTRAN HYPRE_SStructStencilSetEntry(&stencils[s], &i, data.stencil_offsets[s][i], &data.stencil_vars[s][i]); #else HYPRE_SStructStencilSetEntry(stencils[s], i, data.stencil_offsets[s][i], data.stencil_vars[s][i]); #endif } } /*----------------------------------------------------------- * Set up the graph *-----------------------------------------------------------*/ #ifdef HYPRE_FORTRAN HYPRE_SStructGraphCreate(&temp_COMM, &grid, &graph); HYPRE_SStructGraphSetObjectType(&graph, &for_HYPRE_PARCSR); #else HYPRE_SStructGraphCreate(hypre_MPI_COMM_WORLD, grid, &graph); HYPRE_SStructGraphSetObjectType(graph, HYPRE_PARCSR); #endif for (part = 0; part < data.nparts; part++) { pdata = data.pdata[part]; /* set stencils */ for (var = 0; var < pdata.nvars; var++) { #ifdef HYPRE_FORTRAN HYPRE_SStructGraphSetStencil(&graph, &part, &var, &stencils[pdata.stencil_num[var]]); #else HYPRE_SStructGraphSetStencil(graph, part, var, stencils[pdata.stencil_num[var]]); #endif } /* add entries */ for (entry = 0; entry < pdata.graph_nentries; entry++) { for (index[2] = pdata.graph_ilowers[entry][2]; index[2] <= pdata.graph_iuppers[entry][2]; index[2] += pdata.graph_strides[entry][2]) { for (index[1] = pdata.graph_ilowers[entry][1]; index[1] <= pdata.graph_iuppers[entry][1]; index[1] += pdata.graph_strides[entry][1]) { for (index[0] = pdata.graph_ilowers[entry][0]; index[0] <= pdata.graph_iuppers[entry][0]; index[0] += pdata.graph_strides[entry][0]) { for (i = 0; i < 3; i++) { j = pdata.graph_index_maps[entry][i]; k = index[i] - pdata.graph_ilowers[entry][i]; k /= pdata.graph_strides[entry][i]; k *= pdata.graph_index_signs[entry][i]; to_index[j] = pdata.graph_to_ilowers[entry][j] + k * pdata.graph_to_strides[entry][j]; } #ifdef HYPRE_FORTRAN HYPRE_SStructGraphAddEntries(&graph, &part, index, &pdata.graph_vars[entry], &pdata.graph_to_parts[entry], to_index, &pdata.graph_to_vars[entry]); #else HYPRE_SStructGraphAddEntries(graph, part, index, pdata.graph_vars[entry], pdata.graph_to_parts[entry], to_index, pdata.graph_to_vars[entry]); #endif } } } } } #ifdef HYPRE_FORTRAN HYPRE_SStructGraphAssemble(&graph); #else HYPRE_SStructGraphAssemble(graph); #endif /*----------------------------------------------------------- * Set up the matrix *-----------------------------------------------------------*/ values = hypre_TAlloc(HYPRE_Real, data.max_boxsize, HYPRE_MEMORY_HOST); #ifdef HYPRE_FORTRAN HYPRE_SStructMatrixCreate(&temp_COMM, &graph, &A); #else HYPRE_SStructMatrixCreate(hypre_MPI_COMM_WORLD, graph, &A); #endif /* TODO HYPRE_SStructMatrixSetSymmetric(A, 1); */ for (entry = 0; entry < data.symmetric_nentries; entry++) { #ifdef HYPRE_FORTRAN HYPRE_SStructMatrixSetSymmetric(&A, &data.symmetric_parts[entry], &data.symmetric_vars[entry], &data.symmetric_to_vars[entry], &data.symmetric_booleans[entry]); #else HYPRE_SStructMatrixSetSymmetric(A, data.symmetric_parts[entry], data.symmetric_vars[entry], data.symmetric_to_vars[entry], data.symmetric_booleans[entry]); #endif } #ifdef HYPRE_FORTRAN HYPRE_SStructMatrixSetNSSymmetric(&A, &data.ns_symmetric); HYPRE_SStructMatrixSetObjectType(&A, &for_HYPRE_PARCSR); HYPRE_SStructMatrixInitialize(&A); #else HYPRE_SStructMatrixSetNSSymmetric(A, data.ns_symmetric); HYPRE_SStructMatrixSetObjectType(A, HYPRE_PARCSR); HYPRE_SStructMatrixInitialize(A); #endif for (part = 0; part < data.nparts; part++) { pdata = data.pdata[part]; cell_grid = hypre_SStructPGridCellSGrid(hypre_SStructGridPGrid(grid, part)); bounding_box = hypre_StructGridBoundingBox(cell_grid); h = (HYPRE_Real) (hypre_BoxIMax(bounding_box)[0] - hypre_BoxIMin(bounding_box)[0]); for (i = 1; i < data.ndim; i++) { if ((hypre_BoxIMax(bounding_box)[i] - hypre_BoxIMin(bounding_box)[i]) > h) { h = (HYPRE_Real) (hypre_BoxIMax(bounding_box)[i] - hypre_BoxIMin(bounding_box)[i]); } } h = 1.0 / h; /* set stencil values */ for (var = 0; var < pdata.nvars; var++) { s = pdata.stencil_num[var]; for (i = 0; i < data.stencil_sizes[s]; i++) { for (j = 0; j < pdata.max_boxsize; j++) { values[j] = h * data.stencil_values[s][i]; } if (i < 9) { for (j = 0; j < pdata.max_boxsize; j++) { values[j] += data.stencil_values[s + data.ndim][i] / h; } } for (box = 0; box < pdata.nboxes; box++) { GetVariableBox(pdata.ilowers[box], pdata.iuppers[box], pdata.vartypes[var], ilower, iupper); #ifdef HYPRE_FORTRAN HYPRE_SStructMatrixSetBoxValues(&A, &part, &ilower[0], &iupper[0], &var, &one, &i, &values[0]); #else HYPRE_SStructMatrixSetBoxValues(A, part, ilower, iupper, var, 1, &i, values); #endif } } } /* set non-stencil entries */ for (entry = 0; entry < pdata.graph_nentries; entry++) { for (index[2] = pdata.graph_ilowers[entry][2]; index[2] <= pdata.graph_iuppers[entry][2]; index[2] += pdata.graph_strides[entry][2]) { for (index[1] = pdata.graph_ilowers[entry][1]; index[1] <= pdata.graph_iuppers[entry][1]; index[1] += pdata.graph_strides[entry][1]) { for (index[0] = pdata.graph_ilowers[entry][0]; index[0] <= pdata.graph_iuppers[entry][0]; index[0] += pdata.graph_strides[entry][0]) { #ifdef HYPRE_FORTRAN HYPRE_SStructMatrixSetValues(&A, &part, index, &pdata.graph_vars[entry], &one, &pdata.graph_entries[entry], &pdata.graph_values[entry]); #else HYPRE_SStructMatrixSetValues(A, part, index, pdata.graph_vars[entry], 1, &pdata.graph_entries[entry], &pdata.graph_values[entry]); #endif } } } } } /* reset matrix values: * NOTE THAT THE matrix_ilowers & matrix_iuppers MUST BE IN TERMS OF THE * CHOOSEN VAR_TYPE INDICES, UNLIKE THE EXTENTS OF THE GRID< WHICH ARE * IN TERMS OF THE CELL VARTYPE INDICES. */ for (part = 0; part < data.nparts; part++) { pdata = data.pdata[part]; for (entry = 0; entry < pdata.matrix_nentries; entry++) { for (index[2] = pdata.matrix_ilowers[entry][2]; index[2] <= pdata.matrix_iuppers[entry][2]; index[2] += pdata.matrix_strides[entry][2]) { for (index[1] = pdata.matrix_ilowers[entry][1]; index[1] <= pdata.matrix_iuppers[entry][1]; index[1] += pdata.matrix_strides[entry][1]) { for (index[0] = pdata.matrix_ilowers[entry][0]; index[0] <= pdata.matrix_iuppers[entry][0]; index[0] += pdata.matrix_strides[entry][0]) { #ifdef HYPRE_FORTRAN HYPRE_SStructMatrixSetValues(&A, &part, index, &pdata.matrix_vars[entry], &one, &pdata.matrix_entries[entry], &pdata.matrix_values[entry]); #else HYPRE_SStructMatrixSetValues(A, part, index, pdata.matrix_vars[entry], 1, &pdata.matrix_entries[entry], &pdata.matrix_values[entry]); #endif } } } } } #ifdef HYPRE_FORTRAN HYPRE_SStructMatrixAssemble(&A); HYPRE_MaxwellGrad(&grid, &T); #else HYPRE_SStructMatrixAssemble(A); HYPRE_MaxwellGrad(grid, &T); #endif /* eliminate the physical boundary points */ #ifdef HYPRE_FORTRAN HYPRE_SStructMatrixGetObject(&A, &parA); HYPRE_SStructMaxwellPhysBdy(&grid, &one, &data.rfactor[0], &bdryRanks[0][0], &bdryRanksCnt[0]); HYPRE_ParCSRMatrixEliminateRowsCols(&parA, &bdryRanksCnt[0], &bdryRanks[0]); HYPRE_ParCSRMatrixEliminateRowsCols(&parA, &bdryRanksCnt[0], &bdryRanks[0]); #else HYPRE_SStructMatrixGetObject(A, (void **) &parA); HYPRE_SStructMaxwellPhysBdy(&grid, 1, data.rfactor, &bdryRanks, &bdryRanksCnt); HYPRE_ParCSRMatrixEliminateRowsCols(parA, bdryRanksCnt[0], bdryRanks[0]); HYPRE_ParCSRMatrixEliminateRowsCols(parA, bdryRanksCnt[0], bdryRanks[0]); #endif { hypre_MaxwellOffProcRow **OffProcRows; hypre_SStructSharedDOF_ParcsrMatRowsComm(&grid, (hypre_ParCSRMatrix *) parA, &i, &OffProcRows); for (j = 0; j < i; j++) { hypre_MaxwellOffProcRowDestroy((void *) OffProcRows[j]); } hypre_TFree(OffProcRows, HYPRE_MEMORY_HOST); } /*----------------------------------------------------------- * Set up the linear system *-----------------------------------------------------------*/ #ifdef HYPRE_FORTRAN HYPRE_SStructVectorCreate(&temp_COMM, &grid, &b); HYPRE_SStructVectorSetObjectType(&b, &for_HYPRE_PARCSR); HYPRE_SStructVectorInitialize(&b); #else HYPRE_SStructVectorCreate(hypre_MPI_COMM_WORLD, grid, &b); HYPRE_SStructVectorSetObjectType(b, HYPRE_PARCSR); HYPRE_SStructVectorInitialize(b); #endif for (j = 0; j < data.max_boxsize; j++) { values[j] = hypre_sin((HYPRE_Real)(j + 1)); values[j] = (HYPRE_Real) hypre_Rand(); values[j] = (HYPRE_Real) j; } for (part = 0; part < data.nparts; part++) { pdata = data.pdata[part]; for (var = 0; var < pdata.nvars; var++) { for (box = 0; box < pdata.nboxes; box++) { GetVariableBox(pdata.ilowers[box], pdata.iuppers[box], pdata.vartypes[var], ilower, iupper); #ifdef HYPRE_FORTRAN HYPRE_SStructVectorSetBoxValues(&b, &part, &ilower[0], &iupper[0], &var, &values[0]); #else HYPRE_SStructVectorSetBoxValues(b, part, ilower, iupper, var, values); #endif } } } #ifdef HYPRE_FORTRAN HYPRE_SStructVectorAssemble(&b); #else HYPRE_SStructVectorAssemble(b); #endif #ifdef HYPRE_FORTRAN HYPRE_SStructVectorCreate(&temp_COMM, &grid, &x); HYPRE_SStructVectorSetObjectType(&x, &for_HYPRE_PARCSR); HYPRE_SStructVectorInitialize(&x); #else HYPRE_SStructVectorCreate(hypre_MPI_COMM_WORLD, grid, x); HYPRE_SStructVectorSetObjectType(x, HYPRE_PARCSR); HYPRE_SStructVectorInitialize(x); #endif for (j = 0; j < data.max_boxsize; j++) { values[j] = 0.0; } for (part = 0; part < data.nparts; part++) { pdata = data.pdata[part]; for (var = 0; var < pdata.nvars; var++) { for (box = 0; box < pdata.nboxes; box++) { GetVariableBox(pdata.ilowers[box], pdata.iuppers[box], pdata.vartypes[var], ilower, iupper); #ifdef HYPRE_FORTRAN HYPRE_SStructVectorSetBoxValues(&x, &part, &ilower[0], &iupper[0], &var, &values[0]); #else HYPRE_SStructVectorSetBoxValues(x, part, ilower, iupper, var, values); #endif } } } #ifdef HYPRE_FORTRAN HYPRE_SStructVectorAssemble(&x); HYPRE_SStructVectorGetObject(&x, &parx); HYPRE_SStructVectorGetObject(&b, &parb); #else HYPRE_SStructVectorAssemble(x); HYPRE_SStructVectorGetObject(x, (void **) &parx); HYPRE_SStructVectorGetObject(b, (void **) &parb); #endif hypre_ParVectorZeroBCValues((hypre_ParVector *) parx, bdryRanks[0], bdryRanksCnt[0]); hypre_ParVectorZeroBCValues((hypre_ParVector *) parb, bdryRanks[0], bdryRanksCnt[0]); hypre_TFree(bdryRanks[0], HYPRE_MEMORY_HOST); hypre_TFree(bdryRanks, HYPRE_MEMORY_HOST); hypre_TFree(bdryRanksCnt, HYPRE_MEMORY_HOST); hypre_EndTiming(time_index); hypre_PrintTiming("SStruct Interface", hypre_MPI_COMM_WORLD); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); /*----------------------------------------------------------- * Print out the system and initial guess *-----------------------------------------------------------*/ if (print_system) { #ifdef HYPRE_FORTRAN HYPRE_SStructMatrixPrint("sstruct.out.A", &A, &zero); HYPRE_SStructVectorPrint("sstruct.out.b", &b, &zero); HYPRE_SStructVectorPrint("sstruct.out.x0", &x, &zero); #else HYPRE_SStructMatrixPrint("sstruct.out.A", A, 0); HYPRE_SStructVectorPrint("sstruct.out.b", b, 0); HYPRE_SStructVectorPrint("sstruct.out.x0", x, 0); #endif } /*----------------------------------------------------------- * Debugging code *-----------------------------------------------------------*/ hypre_TFree(values, HYPRE_MEMORY_HOST); if (solver_id == 1) { time_index = hypre_InitializeTiming("Maxwell Setup"); hypre_BeginTiming(time_index); #ifdef HYPRE_FORTRAN HYPRE_SStructMaxwellCreate(&long_temp_COMM, &solver); HYPRE_SStructMaxwellSetMaxIter(&solver, &twenty); HYPRE_SStructMaxwellSetTol(&solver, &ftol); HYPRE_SStructMaxwellSetRelChange(&solver, &zero); HYPRE_SStructMaxwellSetNumPreRelax(&solver, &one); HYPRE_SStructMaxwellSetNumPostRelax(&solver, &one); HYPRE_SStructMaxwellSetRfactors(&solver, &data.rfactor[0]); HYPRE_SStructMaxwellSetGrad(&solver, &T); /*HYPRE_SStructMaxwellSetConstantCoef(solver, 1);*/ HYPRE_SStructMaxwellSetPrintLevel(&solver, &one); HYPRE_SStructMaxwellSetLogging(&solver, &one); HYPRE_SStructMaxwellSetup(&solver, &A, &b, &x); #else HYPRE_SStructMaxwellCreate(hypre_MPI_COMM_WORLD, &solver); HYPRE_SStructMaxwellSetMaxIter(solver, 20); HYPRE_SStructMaxwellSetTol(solver, 1.0e-8); HYPRE_SStructMaxwellSetRelChange(solver, 0); HYPRE_SStructMaxwellSetNumPreRelax(solver, 1); HYPRE_SStructMaxwellSetNumPostRelax(solver, 1); HYPRE_SStructMaxwellSetRfactors(solver, data.rfactor); HYPRE_SStructMaxwellSetGrad(solver, T); /*HYPRE_SStructMaxwellSetConstantCoef(solver, 1);*/ HYPRE_SStructMaxwellSetPrintLevel(solver, 1); HYPRE_SStructMaxwellSetLogging(solver, 1); HYPRE_SStructMaxwellSetup(solver, A, b, x); #endif hypre_EndTiming(time_index); hypre_PrintTiming("Setup phase times", hypre_MPI_COMM_WORLD); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); time_index = hypre_InitializeTiming("Maxwell Solve"); hypre_BeginTiming(time_index); #ifdef HYPRE_FORTRAN HYPRE_SStructMaxwellSolve(&solver, &A, &b, &x); #else HYPRE_SStructMaxwellSolve(solver, A, b, x); #endif hypre_EndTiming(time_index); hypre_PrintTiming("Solve phase times", hypre_MPI_COMM_WORLD); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); #ifdef HYPRE_FORTRAN HYPRE_SStructMaxwellGetNumIterations(&solver, &num_iterations); HYPRE_SStructMaxwellGetFinalRelativeResidualNorm(&solver, &final_res_norm); HYPRE_SStructMaxwellDestroy(&solver); #else HYPRE_SStructMaxwellGetNumIterations(solver, &num_iterations); HYPRE_SStructMaxwellGetFinalRelativeResidualNorm( solver, &final_res_norm); HYPRE_SStructMaxwellDestroy(solver); #endif } #ifdef HYPRE_FORTRAN HYPRE_SStructVectorGather(&x); #else HYPRE_SStructVectorGather(x); #endif /*----------------------------------------------------------- * Print the solution and other info *-----------------------------------------------------------*/ if (print_system) { #ifdef HYPRE_FORTRAN HYPRE_SStructVectorPrint("sstruct.out.x", &x, &zero); #else HYPRE_SStructVectorPrint("sstruct.out.x", x, 0); #endif } if (myid == 0) { hypre_printf("\n"); hypre_printf("Iterations = %d\n", num_iterations); hypre_printf("Final Relative Residual Norm = %e\n", final_res_norm); hypre_printf("\n"); } /*----------------------------------------------------------- * Finalize things *-----------------------------------------------------------*/ #ifdef HYPRE_FORTRAN HYPRE_SStructGridDestroy(&grid); #else HYPRE_SStructGridDestroy(grid); #endif for (s = 0; s < data.nstencils; s++) { #ifdef HYPRE_FORTRAN HYPRE_SStructStencilDestroy(&stencils[s]); #else HYPRE_SStructStencilDestroy(stencils[s]); #endif } hypre_TFree(stencils, HYPRE_MEMORY_HOST); #ifdef HYPRE_FORTRAN HYPRE_SStructGraphDestroy(&graph); HYPRE_SStructMatrixDestroy(&A); HYPRE_ParCSRMatrixDestroy(&T); HYPRE_SStructVectorDestroy(&b); HYPRE_SStructVectorDestroy(&x); #else HYPRE_SStructGraphDestroy(graph); HYPRE_SStructMatrixDestroy(A); HYPRE_ParCSRMatrixDestroy(T); HYPRE_SStructVectorDestroy(b); HYPRE_SStructVectorDestroy(x); #endif DestroyData(data); hypre_TFree(parts, HYPRE_MEMORY_HOST); hypre_TFree(refine, HYPRE_MEMORY_HOST); hypre_TFree(distribute, HYPRE_MEMORY_HOST); hypre_TFree(block, HYPRE_MEMORY_HOST); /* Finalize MPI */ hypre_MPI_Finalize(); return (0); } hypre-2.33.0/src/test/fparcsr_ls.f000066400000000000000000003646271477326011500170310ustar00rootroot00000000000000! Copyright (c) 1998 Lawrence Livermore National Security, LLC and other ! HYPRE Project Developers. See the top-level COPYRIGHT file for details. ! ! SPDX-License-Identifier: (Apache-2.0 OR MIT) !-------------------------------------------------------------------------- ! GenerateLaplacian !-------------------------------------------------------------------------- subroutine fhypre_generatelaplacian(fcom, fnx, fny, fnz, 1 fcapp, fcapq, fcapr, 1 fp, fq, fr, 2 fvalue, fmatrix) integer ierr integer fcomm integer fnx, fny, fnz integer fcapp, fcapq, fcapr integer fp, fq, fr double precision fvalue integer*8 fmatrix call hypre_GenerateLaplacian(fcomm, fnx, fny, fnz, fcapp, fcapq, 1 fcapr, fp, fq, fr, fvalue, ierr) if(ierr .ne. 0) then print *, 'fhypre_generatelaplacian error: ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_BoomerAMGCreate !-------------------------------------------------------------------------- subroutine fhypre_boomeramgcreate(fsolver) integer ierr integer*8 fsolver call HYPRE_BoomerAMGCreate(fsolver, ierr) if(ierr .ne. 0) then print *, 'fhypre_boomeramgcreate error: ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_BoomerAMGDestroy !-------------------------------------------------------------------------- subroutine fhypre_boomeramgdestroy(fsolver) integer ierr integer*8 fsolver call HYPRE_BoomerAMGDestroy(fsolver, ierr) if(ierr .ne. 0) then print *, 'fhypre_boomeramgdestroy error: ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_BoomerAMGSetup !-------------------------------------------------------------------------- subroutine fhypre_boomeramgsetup(fsolver, fA, fb, fx) integer ierr integer*8 fsolver integer*8 fA integer*8 fb integer*8 fx call HYPRE_BoomerAMGSetup(fsolver, fA, fb, fx, ierr) if(ierr .ne. 0) then print *, 'fhypre_boomeramgsetup error: ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_BoomerAMGSolve !-------------------------------------------------------------------------- subroutine fhypre_boomeramgsolve(fsolver, fA, fb, fx) integer ierr integer*8 fsolver integer*8 fA integer*8 fb integer*8 fx call HYPRE_BoomerAMGSolve(fsolver, fA, fb, fx, ierr) if(ierr .ne. 0) then print *, 'fhypre_boomeramgsolve error: ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_BoomerAMGSolveT !-------------------------------------------------------------------------- subroutine fhypre_boomeramgsolvet(fsolver, fA, fb, fx) integer ierr integer*8 fsolver integer*8 fA integer*8 fb integer*8 fx call HYPRE_BoomerAMGSolveT(fsolver, fA, fb, fx, ierr) if(ierr .ne. 0) then print *, 'fhypre_boomeramgsolvet error: ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_BoomerAMGSetRestriction !-------------------------------------------------------------------------- subroutine fhypre_boomeramgsetrestriction(fsolver, frestr_par) integer ierr integer frestr_par integer*8 fsolver call HYPRE_BoomerAMGSetRestriction(fsolver, frestr_par, ierr) if(ierr .ne. 0) then print *, 'fhypre_boomeramgsetrestriction error: ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_BoomerAMGSetMaxLevels !-------------------------------------------------------------------------- subroutine fhypre_boomeramgsetmaxlevels(fsolver, fmaxlvl) integer ierr integer fmaxlvl integer*8 fsolver call HYPRE_BoomerAMGSetMaxLevels(fsolver, fmaxlvl, ierr) if(ierr .ne. 0) then print *, 'fhypre_boomeramgsetmaxlevels error: ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_BoomerAMGGetMaxLevels !-------------------------------------------------------------------------- subroutine fhypre_boomeramggetmaxlevels(fsolver, fmaxlvl) integer ierr integer fmaxlvl integer*8 fsolver call HYPRE_BoomerAMGGetMaxLevels(fsolver, fmaxlvl, ierr) if(ierr .ne. 0) then print *, 'fhypre_boomeramggetmaxlevels error: ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_BoomerAMGSetStrongThreshold !-------------------------------------------------------------------------- subroutine fhypre_boomeramgsetstrongthrshl(fsolver, fstrong) integer ierr double precision fstrong integer*8 fsolver call HYPRE_BoomerAMGSetStrongThrshld(fsolver, fstrong, ierr) if(ierr .ne. 0) then print *, 'fhypre_boomeramgsetstrongthreshold error: ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_BoomerAMGGetStrongThreshold !-------------------------------------------------------------------------- subroutine fhypre_boomeramggetstrongthrshl(fsolver, fstrong) integer ierr double precision fstrong integer*8 fsolver call HYPRE_BoomerAMGGetStrongThrshld(fsolver, fstrong, ierr) if(ierr .ne. 0) then print *, 'fhypre_boomeramggetstrongthreshold error: ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_BoomerAMGSetMaxRowSum !-------------------------------------------------------------------------- subroutine fhypre_boomeramgsetmaxrowsum(fsolver, fmaxrowsum) integer ierr double precision fmaxrowsum integer*8 fsolver call HYPRE_BoomerAMGSetMaxRowSum(fsolver, fmaxrowsum, ierr) if(ierr .ne. 0) then print *, 'fhypre_boomeramgsetmaxrowsum error: ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_BoomerAMGGetMaxRowSum !-------------------------------------------------------------------------- subroutine fhypre_boomeramggetmaxrowsum(fsolver, fmaxrowsum) integer ierr double precision fmaxrowsum integer*8 fsolver call HYPRE_BoomerAMGGetMaxRowSum(fsolver, fmaxrowsum, ierr) if(ierr .ne. 0) then print *, 'fhypre_boomeramggetmaxrowsum error: ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_BoomerAMGSetTruncFactor !-------------------------------------------------------------------------- subroutine fhypre_boomeramgsettruncfactor(fsolver, ftrunc_factor) integer ierr double precision ftrunc_factor integer*8 fsolver call HYPRE_BoomerAMGSetTruncFactor(fsolver, ftrunc_factor, ierr) if(ierr .ne. 0) then print *, 'fhypre_boomeramgsettruncfactor error: ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_BoomerAMGGetTruncFactor !-------------------------------------------------------------------------- subroutine fhypre_boomeramggettruncfactor(fsolver, ftrunc_factor) integer ierr double precision ftrunc_factor integer*8 fsolver call HYPRE_BoomerAMGGetTruncFactor(fsolver, ftrunc_factor, ierr) if(ierr .ne. 0) then print *, 'fhypre_boomeramggettruncfactor error: ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_BoomerAMGSetSCommPkgSwitch !-------------------------------------------------------------------------- subroutine fhypre_boomeramgsetscommpkgswit(fsolver, fcommswtch) integer ierr integer fcommswtch integer*8 fsolver call HYPRE_BoomerAMGSetSCommPkgSwitc(fsolver, fcommswtch, ierr) if(ierr .ne. 0) then print *, 'fhypre_boomeramgsetscommpkgswitch error: ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_BoomerAMGSetInterpType !-------------------------------------------------------------------------- subroutine fhypre_boomeramgsetinterptype(fsolver, finterp) integer ierr integer finterp integer*8 fsolver call HYPRE_BoomerAMGSetInterpType(fsolver, finterp, ierr) if(ierr .ne. 0) then print *, 'fhypre_boomeramgsetinterptype error: ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_BoomerAMGSetMinIter !-------------------------------------------------------------------------- subroutine fhypre_boomeramgsetminiter(fsolver, fminiter) integer ierr integer fminiter integer*8 fsolver call HYPRE_BoomerAMGSetMinIter(fsolver, fminiter, ierr) if(ierr .ne. 0) then print *, 'fhypre_boomeramgsetminiter error: ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_BoomerAMGSetMaxIter !-------------------------------------------------------------------------- subroutine fhypre_boomeramgsetmaxiter(fsolver, fmaxiter) integer ierr integer fmaxiter integer*8 fsolver call HYPRE_BoomerAMGSetMaxIter(fsolver, fmaxiter, ierr) if(ierr .ne. 0) then print *, 'fhypre_boomeramgsetmaxiter error: ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_BoomerAMGGetMaxIter !-------------------------------------------------------------------------- subroutine fhypre_boomeramggetmaxiter(fsolver, fmaxiter) integer ierr integer fmaxiter integer*8 fsolver call HYPRE_BoomerAMGGetMaxIter(fsolver, fmaxiter, ierr) if(ierr .ne. 0) then print *, 'fhypre_boomeramggetmaxiter error: ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_BoomerAMGSetCoarsenType !-------------------------------------------------------------------------- subroutine fhypre_boomeramgsetcoarsentype(fsolver, fcoarsen) integer ierr integer fcoarsen integer*8 fsolver call HYPRE_BoomerAMGSetCoarsenType(fsolver, fcoarsen, ierr) if(ierr .ne. 0) then print *, 'fhypre_boomeramgsetcoarsentype error: ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_BoomerAMGGetCoarsenType !-------------------------------------------------------------------------- subroutine fhypre_boomeramggetcoarsentype(fsolver, fcoarsen) integer ierr integer fcoarsen integer*8 fsolver call HYPRE_BoomerAMGGetCoarsenType(fsolver, fcoarsen, ierr) if(ierr .ne. 0) then print *, 'fhypre_boomeramggetcoarsentype error: ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_BoomerAMGSetMeasureType !-------------------------------------------------------------------------- subroutine fhypre_boomeramgsetmeasuretype(fsolver, fmeasure) integer ierr integer fmeasure integer*8 fsolver call HYPRE_BoomerAMGSetMeasureType(fsolver, fmeasure, ierr) if(ierr .ne. 0) then print *, 'fhypre_boomeramgsetmeasuretype error: ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_BoomerAMGGetMeasureType !-------------------------------------------------------------------------- subroutine fhypre_boomeramggetmeasuretype(fsolver, fmeasure) integer ierr integer fmeasure integer*8 fsolver call HYPRE_BoomerAMGGetMeasureType(fsolver, fmeasure, ierr) if(ierr .ne. 0) then print *, 'fhypre_boomeramggetmeasuretype error: ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_BoomerAMGSetSetupType !-------------------------------------------------------------------------- subroutine fhypre_boomeramgsetsetuptype(fsolver, fsetup) integer ierr integer fsetup integer*8 fsolver call HYPRE_BoomerAMGSetSetupType(fsolver, fsetup, ierr) if(ierr .ne. 0) then print *, 'fhypre_boomeramgsetuptype error: ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_BoomerAMGSetCycleType !-------------------------------------------------------------------------- subroutine fhypre_boomeramgsetcycletype(fsolver, fcycle) integer ierr integer fcycle integer*8 fsolver call HYPRE_BoomerAMGSetCycleType(fsolver, fcycle, ierr) if(ierr .ne. 0) then print *, 'fhypre_boomeramgsetcycletype error: ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_BoomerAMGGetCycleType !-------------------------------------------------------------------------- subroutine fhypre_boomeramggetcycletype(fsolver, fcycle) integer ierr integer fcycle integer*8 fsolver call HYPRE_BoomerAMGGetCycleType(fsolver, fcycle, ierr) if(ierr .ne. 0) then print *, 'fhypre_boomeramggetcycletype error: ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_BoomerAMGSetTol !-------------------------------------------------------------------------- subroutine fhypre_boomeramgsettol(fsolver, ftol) integer ierr double precision ftol integer*8 fsolver call HYPRE_BoomerAMGSetTol(fsolver, ftol, ierr) if(ierr .ne. 0) then print *, 'fhypre_boomeramgsettol error: ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_BoomerAMGGetTol !-------------------------------------------------------------------------- subroutine fhypre_boomeramggettol(fsolver, ftol) integer ierr double precision ftol integer*8 fsolver call HYPRE_BoomerAMGGetTol(fsolver, ftol, ierr) if(ierr .ne. 0) then print *, 'fhypre_boomeramggettol error: ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_BoomerAMGSetNumSweeps !-------------------------------------------------------------------------- subroutine fhypre_boomeramgsetnumsweeps(fsolver, fnumsweeps) integer ierr integer fnumsweeps integer*8 fsolver call HYPRE_BoomerAMGSetNumSweeps(fsolver, fnumsweeps, ierr) if(ierr .ne. 0) then print *, 'fhypre_boomeramgsetnumsweeps error: ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_BoomerAMGSetCycleNumSweeps !-------------------------------------------------------------------------- subroutine fhypre_boomeramgsetcyclenumswee(fsolver, fnumsweeps, 1 fk) integer ierr integer fnumsweeps integer fk integer*8 fsolver call HYPRE_BoomerAMGSetCycleNumSweeps(fsolver, fnumsweeps, fk, 1 ierr) if(ierr .ne. 0) then print *, 'fhypre_boomeramgsetcyclenumsweeps error: ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_BoomerAMGGetCycleNumSweeps !-------------------------------------------------------------------------- subroutine fhypre_boomeramggetcyclenumswee(fsolver, fnumsweeps, 1 fk) integer ierr integer fnumsweeps integer fk integer*8 fsolver call HYPRE_BoomerAMGGetCycleNumSweeps(fsolver, fnumsweeps, fk, 1 ierr) if(ierr .ne. 0) then print *, 'fhypre_boomeramggetcyclenumsweeps error: ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_BoomerAMGInitGridRelaxation !-------------------------------------------------------------------------- subroutine fhypre_boomeramginitgridrelaxat(fnumsweeps, fgridtype, 1 fgridrelax, fcoarsen, 2 frelaxwt, fmaxlvl) integer ierr integer fcoarsen integer fmaxlvl integer*8 fnumsweeps integer*8 fgridtype integer*8 fgridrelax integer*8 frelaxwt call HYPRE_BoomerAMGInitGridRelaxatn(fnumsweeps, fgridtype, 1 fgridrelax, fcoarsen, 2 frelaxwt, fmaxlvl, ierr) if(ierr .ne. 0) then print *, 'fhypre_boomeramginitgridrelaxation error: ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_BoomerAMGFinalizeGridRelaxation !-------------------------------------------------------------------------- subroutine fhypre_boomeramgfingridrelaxatn(fnumsweeps, fgridtype, 1 fgridrelax, frelaxwt) integer ierr integer*8 fnumsweeps integer*8 fgridtype integer*8 fgridrelax integer*8 frelaxwt ! hypre_TFree(num_grid_sweeps); ! hypre_TFree(grid_relax_type); ! hypre_TFree(grid_relax_points); ! hypre_TFree(relax_weights); ierr = 0 return end !-------------------------------------------------------------------------- ! HYPRE_BoomerAMGSetRelaxType !-------------------------------------------------------------------------- subroutine fhypre_boomeramgsetrelaxtype(fsolver, frelaxtype) integer ierr integer frelaxtype integer*8 fsolver call HYPRE_BoomerAMGSetRelaxType(fsolver, frelaxtype, ierr) if(ierr .ne. 0) then print *, 'fhypre_boomeramgsetrelaxtype error: ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_BoomerAMGSetCycleRelaxType !-------------------------------------------------------------------------- subroutine fhypre_boomeramgsetcyclerelaxty(fsolver, frelaxtype, 1 fk) integer ierr integer frelaxtype integer fk integer*8 fsolver call HYPRE_BoomerAMGSetCycleRelaxType(fsolver, fk, frelaxtype, 1 ierr) if(ierr .ne. 0) then print *, 'fhypre_boomeramgsetcyclerelaxtype error: ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_BoomerAMGGetCycleRelaxType !-------------------------------------------------------------------------- subroutine fhypre_boomeramggetcyclerelaxty(fsolver, frelaxtype, 1 fk) integer ierr integer frelaxtype integer fk integer*8 fsolver call HYPRE_BoomerAMGGetCycleRelaxType(fsolver, fk, frelaxtype, 1 ierr) if(ierr .ne. 0) then print *, 'fhypre_boomeramggetcyclerelaxtype error: ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_BoomerAMGSetRelaxOrder !-------------------------------------------------------------------------- subroutine fhypre_boomeramgsetrelaxorder(fsolver, frlxorder) integer ierr integer frlxorder integer*8 fsolver call HYPRE_BoomerAMGSetRelaxOrder(fsolver, frlxorder, ierr) if(ierr .ne. 0) then print *, 'fhypre_boomeramgsetrelaxorder error: ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_BoomerAMGSetRelaxWt !-------------------------------------------------------------------------- subroutine fhypre_boomeramgsetrelaxwt(fsolver, frelaxwt) integer ierr integer*8 fsolver double precision frelaxwt call HYPRE_BoomerAMGSetRelaxWt(fsolver, frelaxwt, ierr) if(ierr .ne. 0) then print *, 'fhypre_boomeramgsetrelaxwt error: ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_BoomerAMGSetLevelRelaxWt !-------------------------------------------------------------------------- subroutine fhypre_boomeramgsetlevelrelaxwt(fsolver, frelaxwt, 1 flevel) integer ierr integer flevel integer*8 fsolver double precision frelaxwt call HYPRE_BoomerAMGSetLevelRelaxWt(fsolver, frelaxwt, flevel, 1 ierr) if(ierr .ne. 0) then print *, 'fhypre_boomeramgsetlevelrelaxwt error: ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_BoomerAMGSetOuterWt !-------------------------------------------------------------------------- subroutine fhypre_boomeramgsetouterwt(fsolver, fouterwt) integer ierr integer*8 fsolver double precision fouterwt call HYPRE_BoomerAMGSetOuterWt(fsolver, fouterwt, ierr) if(ierr .ne. 0) then print *, 'fhypre_boomeramgsetouterwt error: ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_BoomerAMGSetLevelOuterWt !-------------------------------------------------------------------------- subroutine fhypre_boomeramgsetlevelouterwt(fsolver, fouterwt, 1 flevel) integer ierr integer flevel integer*8 fsolver double precision fouterwt call HYPRE_BoomerAMGSetLevelOuterWt(fsolver, fouterwt, flevel, 1 ierr) if(ierr .ne. 0) then print *, 'fhypre_boomeramgsetlevelouterwt error: ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_BoomerAMGSetSmoothType !-------------------------------------------------------------------------- subroutine fhypre_boomeramgsetsmoothtype(fsolver, fsmooth) integer ierr integer fsmooth integer*8 fsolver call HYPRE_BoomerAMGSetSmoothType(fsolver, fsmooth, ierr) if(ierr .ne. 0) then print *, 'fhypre_boomeramgsetsmoothtype error: ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_BoomerAMGGetSmoothType !-------------------------------------------------------------------------- subroutine fhypre_boomeramggetsmoothtype(fsolver, fsmooth) integer ierr integer fsmooth integer*8 fsolver call HYPRE_BoomerAMGGetSmoothType(fsolver, fsmooth, ierr) if(ierr .ne. 0) then print *, 'fhypre_boomeramggetsmoothtype error: ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_BoomerAMGSetSmoothNumLvls !-------------------------------------------------------------------------- subroutine fhypre_boomeramgsetsmoothnumlvl(fsolver, fsmooth) integer ierr integer fsmooth integer*8 fsolver call HYPRE_BoomerAMGSetSmoothNumLvls(fsolver, fsmooth, ierr) if(ierr .ne. 0) then print *, 'fhypre_boomeramgsetsmoothnumlvls error: ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_BoomerAMGGetSmoothNumLvls !-------------------------------------------------------------------------- subroutine fhypre_boomeramggetsmoothnumlvl(fsolver, fsmooth) integer ierr integer fsmooth integer*8 fsolver call HYPRE_BoomerAMGGetSmoothNumLvls(fsolver, fsmooth, ierr) if(ierr .ne. 0) then print *, 'fhypre_boomeramggetsmoothnumlvls error: ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_BoomerAMGSetSmoothNumSwps !-------------------------------------------------------------------------- subroutine fhypre_boomeramgsetsmoothnumswp(fsolver, fsmooth) integer ierr integer fsmooth integer*8 fsolver call HYPRE_BoomerAMGSetSmoothNumSwps(fsolver, fsmooth, ierr) if(ierr .ne. 0) then print *, 'fhypre_boomeramgsetsmoothnumswps error: ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_BoomerAMGGetSmoothNumSwps !-------------------------------------------------------------------------- subroutine fhypre_boomeramggetsmoothnumswp(fsolver, fsmooth) integer ierr integer fsmooth integer*8 fsolver call HYPRE_BoomerAMGGetSmoothNumSwps(fsolver, fsmooth, ierr) if(ierr .ne. 0) then print *, 'fhypre_boomeramggetsmoothnumswps error: ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_BoomerAMGSetLogging !-------------------------------------------------------------------------- subroutine fhypre_boomeramgsetlogging(fsolver, flogging) integer ierr integer flogging integer*8 fsolver call HYPRE_BoomerAMGSetLogging(fsolver, flogging, ierr) if(ierr .ne. 0) then print *, 'fhypre_boomeramgsetlogging error: ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_BoomerAMGGetLogging !-------------------------------------------------------------------------- subroutine fhypre_boomeramggetlogging(fsolver, flogging) integer ierr integer flogging integer*8 fsolver call HYPRE_BoomerAMGGetLogging(fsolver, flogging, ierr) if(ierr .ne. 0) then print *, 'fhypre_boomeramggetlogging error: ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_BoomerAMGSetPrintLevel !-------------------------------------------------------------------------- subroutine fhypre_boomeramgsetprintlevel(fsolver, fprintlevel) integer ierr integer fprintlevel integer*8 fsolver call HYPRE_BoomerAMGSetPrintLevel(fsolver, fprintlevel, ierr) if(ierr .ne. 0) then print *, 'fhypre_boomeramgsetprintlevel error: ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_BoomerAMGGetPrintLevel !-------------------------------------------------------------------------- subroutine fhypre_boomeramggetprintlevel(fsolver, fprintlevel) integer ierr integer fprintlevel integer*8 fsolver call HYPRE_BoomerAMGGetPrintLevel(fsolver, fprintlevel, ierr) if(ierr .ne. 0) then print *, 'fhypre_boomeramggetprintlevel error: ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_BoomerAMGSetPrintFileName !-------------------------------------------------------------------------- subroutine fhypre_boomeramgsetprintfilenam(fsolver, fname) integer ierr integer*8 fsolver character*(*) fname call HYPRE_BoomerAMGSetPrintFileName(fsolver, fname, ierr) if(ierr .ne. 0) then print *, 'fhypre_boomeramgsetprintfilename error: ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_BoomerAMGSetDebugFlag !-------------------------------------------------------------------------- subroutine fhypre_boomeramgsetdebugflag(fsolver, fdebug) integer ierr integer fdebug integer*8 fsolver call HYPRE_BoomerAMGSetDebugFlag(fsolver, fdebug, ierr) if(ierr .ne. 0) then print *, 'fhypre_boomeramgsetdebugflag error: ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_BoomerAMGGetDebugFlag !-------------------------------------------------------------------------- subroutine fhypre_boomeramggetdebugflag(fsolver, fdebug) integer ierr integer fdebug integer*8 fsolver call HYPRE_BoomerAMGGetDebugFlag(fsolver, fdebug, ierr) if(ierr .ne. 0) then print *, 'fhypre_boomeramggetdebugflag error: ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_BoomerAMGGetNumIterations !-------------------------------------------------------------------------- subroutine fhypre_boomeramggetnumiteration(fsolver, fnumiter) integer ierr integer fnumiter integer*8 fsolver call HYPRE_BoomerAMGGetNumIterations(fsolver, fnumiter, ierr) if(ierr .ne. 0) then print *, 'fhypre_boomeramggetnumiterations error: ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_BoomerAMGGetCumNumIterations !-------------------------------------------------------------------------- subroutine fhypre_boomeramggetcumnumiterat(fsolver, fnumiter) integer ierr integer fnumiter integer*8 fsolver call HYPRE_BoomerAMGGetNumIterations(fsolver, fnumiter, ierr) if(ierr .ne. 0) then print *, 'fhypre_boomeramggetnumiterations error: ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_BoomerAMGGetResidual !-------------------------------------------------------------------------- subroutine fhypre_boomeramggetresidual(fsolver, fresid) integer ierr integer*8 fsolver double precision fresid call HYPRE_BoomerAMGGetResidual(fsolver, fresid, ierr) if(ierr .ne. 0) then print *, 'fhypre_boomeramggetresidual error: ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_BoomerAMGGetFinalRelativeResidual !-------------------------------------------------------------------------- subroutine fhypre_boomeramggetfinalreltvre(fsolver, frelresid) integer ierr integer*8 fsolver double precision frelresid call HYPRE_BoomerAMGGetFinalReltvRes(fsolver, frelresid, ierr) if(ierr .ne. 0) then print *, 'fhypre_boomeramggetfinalrelativeres error: ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_BoomerAMGSetVariant !-------------------------------------------------------------------------- subroutine fhypre_boomeramgsetvariant(fsolver, fvariant) integer ierr integer fvariant integer*8 fsolver call HYPRE_BoomerAMGSetVariant(fsolver, fvariant, ierr) if(ierr .ne. 0) then print *, 'fhypre_boomeramgsetvariant error: ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_BoomerAMGGetVariant !-------------------------------------------------------------------------- subroutine fhypre_boomeramggetvariant(fsolver, fvariant) integer ierr integer fvariant integer*8 fsolver call HYPRE_BoomerAMGGetVariant(fsolver, fvariant, ierr) if(ierr .ne. 0) then print *, 'fhypre_boomeramggetvariant error: ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_BoomerAMGSetOverlap !-------------------------------------------------------------------------- subroutine fhypre_boomeramgsetoverlap(fsolver, foverlap) integer ierr integer foverlap integer*8 fsolver call HYPRE_BoomerAMGSetOverlap(fsolver, foverlap, ierr) if(ierr .ne. 0) then print *, 'fhypre_boomeramgsetoverlap error: ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_BoomerAMGGetOverlap !-------------------------------------------------------------------------- subroutine fhypre_boomeramggetoverlap(fsolver, foverlap) integer ierr integer foverlap integer*8 fsolver call HYPRE_BoomerAMGGetOverlap(fsolver, foverlap, ierr) if(ierr .ne. 0) then print *, 'fhypre_boomeramggetoverlap error: ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_BoomerAMGSetDomainType !-------------------------------------------------------------------------- subroutine fhypre_boomeramgsetdomaintype(fsolver, fdomain) integer ierr integer fdomain integer*8 fsolver call HYPRE_BoomerAMGSetDomainType(fsolver, fdomain, ierr) if(ierr .ne. 0) then print *, 'fhypre_boomeramgsetdomaintype error: ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_BoomerAMGGetDomainType !-------------------------------------------------------------------------- subroutine fhypre_boomeramggetdomaintype(fsolver, fdomain) integer ierr integer fdomain integer*8 fsolver call HYPRE_BoomerAMGGetDomainType(fsolver, fdomain, ierr) if(ierr .ne. 0) then print *, 'fhypre_boomeramggetdomaintype error: ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_BoomerAMGSetSchwarzRlxWt !-------------------------------------------------------------------------- subroutine fhypre_boomeramgsetschwarzrlxwt(fsolver, fschwarz) integer ierr integer fschwarz integer*8 fsolver call HYPRE_BoomerAMGSetSchwarzRlxWt(fsolver, fschwarz, ierr) if(ierr .ne. 0) then print *, 'fhypre_boomeramgsetschwarzrlxwt error: ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_BoomerAMGGetSchwarzRlxWt !-------------------------------------------------------------------------- subroutine fhypre_boomeramggetschwarzrlxwt(fsolver, fschwarz) integer ierr integer fschwarz integer*8 fsolver call HYPRE_BoomerAMGGetSchwarzRlxWt(fsolver, fschwarz, ierr) if(ierr .ne. 0) then print *, 'fhypre_boomeramggetschwarzrlxwt error: ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_BoomerAMGSetSym !-------------------------------------------------------------------------- subroutine fhypre_boomeramgsetsym(fsolver, fsym) integer ierr integer fsym integer*8 fsolver call HYPRE_BoomerAMGSetSym(fsolver, fsym, ierr) if(ierr .ne. 0) then print *, 'fhypre_boomeramgsetsym error: ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_BoomerAMGSetLevel !-------------------------------------------------------------------------- subroutine fhypre_boomeramgsetlevel(fsolver, flevel) integer ierr integer flevel integer*8 fsolver call HYPRE_BoomerAMGSetLevel(fsolver, flevel, ierr) if(ierr .ne. 0) then print *, 'fhypre_boomeramgsetlevel error: ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_BoomerAMGSetFilter !-------------------------------------------------------------------------- subroutine fhypre_boomeramgsetfilter(fsolver, ffilter) integer ierr integer ffilter integer*8 fsolver call HYPRE_BoomerAMGSetFilter(fsolver, ffilter, ierr) if(ierr .ne. 0) then print *, 'fhypre_boomeramgsetfilter error: ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_BoomerAMGSetDropTol !-------------------------------------------------------------------------- subroutine fhypre_boomeramgsetdroptol(fsolver, fdroptol) integer ierr integer fdroptol integer*8 fsolver call HYPRE_BoomerAMGSetDropTol(fsolver, fdroptol, ierr) if(ierr .ne. 0) then print *, 'fhypre_boomeramgsetdroptol error: ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_BoomerAMGSetMaxNzPerRow !-------------------------------------------------------------------------- subroutine fhypre_boomeramgsetmaxnzperrow(fsolver, fmaxnzperrow) integer ierr integer fmaxnzperrow integer*8 fsolver call HYPRE_BoomerAMGSetMaxNzPerRow(fsolver, fmaxnzperrow, ierr) if(ierr .ne. 0) then print *, 'fhypre_boomeramgsetmaxnzperrow error: ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_BoomerAMGSetEuclidFile !-------------------------------------------------------------------------- subroutine fhypre_boomeramgseteuclidfile(fsolver, ffile) integer ierr integer*8 fsolver character*(*) ffile call HYPRE_BoomerAMGSetEuclidFile(fsolver, ffile, ierr) if(ierr .ne. 0) then print *, 'fhypre_boomeramgseteuclidfile error: ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_BoomerAMGSetNumFunctions !-------------------------------------------------------------------------- subroutine fhypre_boomeramgsetnumfunctions(fsolver, fnfncs) integer ierr integer fnfncs integer*8 fsolver call HYPRE_BoomerAMGSetNumFunctions(fsolver, fnfncs, ierr) if(ierr .ne. 0) then print *, 'fhypre_boomeramgsetnumfunctions error: ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_BoomerAMGGetNumFunctions !-------------------------------------------------------------------------- subroutine fhypre_boomeramggetnumfunctions(fsolver, fnfncs) integer ierr integer fnfncs integer*8 fsolver call HYPRE_BoomerAMGGetNumFunctions(fsolver, fnfncs, ierr) if(ierr .ne. 0) then print *, 'fhypre_boomeramggetnumfunctions error: ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_BoomerAMGSetNodal !-------------------------------------------------------------------------- subroutine fhypre_boomeramgsetnodal(fsolver, fnodal) integer ierr integer fnodal integer*8 fsolver call HYPRE_BoomerAMGSetNodal(fsolver, fnodal, ierr) if(ierr .ne. 0) then print *, 'fhypre_boomeramgsetnodal error: ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_BoomerAMGSetDofFunc !-------------------------------------------------------------------------- subroutine fhypre_boomeramgsetdoffunc(fsolver, fdoffunc) integer ierr integer fdoffunc integer*8 fsolver call HYPRE_BoomerAMGSetDofFunc(fsolver, fdoffunc, ierr) if(ierr .ne. 0) then print *, 'fhypre_boomeramgsetdoffunc error: ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_BoomerAMGSetNumPaths !-------------------------------------------------------------------------- subroutine fhypre_boomeramgsetnumpaths(fsolver, fnumpaths) integer ierr integer fnumpaths integer*8 fsolver call HYPRE_BoomerAMGSetNumPaths(fsolver, fnumpaths, ierr) if(ierr .ne. 0) then print *, 'fhypre_boomeramgsetnumpaths error: ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_BoomerAMGSetAggNumLevels !-------------------------------------------------------------------------- subroutine fhypre_boomeramgsetaggnumlevels(fsolver, fagglvl) integer ierr integer fagglvl integer*8 fsolver call HYPRE_BoomerAMGSetAggNumLevels(fsolver, fagglvl, ierr) if(ierr .ne. 0) then print *, 'fhypre_boomeramgsetaggnumlevels error: ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_BoomerAMGSetGSMG !-------------------------------------------------------------------------- subroutine fhypre_boomeramgsetgsmg(fsolver, fgsmg) integer ierr integer fgsmg integer*8 fsolver call HYPRE_BoomerAMGSetGSMG(fsolver, fgsmg, ierr) if(ierr .ne. 0) then print *, 'fhypre_boomeramgsetgsmg error: ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_BoomerAMGSetNumSamples !-------------------------------------------------------------------------- subroutine fhypre_boomeramgsetnumsamples(fsolver, fsamples) integer ierr integer fsamples integer*8 fsolver call HYPRE_BoomerAMGSetNumSamples(fsolver, fsamples, ierr) if(ierr .ne. 0) then print *, 'fhypre_boomeramgsetnumsamples error: ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_ParCSRBiCGSTABCreate !-------------------------------------------------------------------------- subroutine fhypre_parcsrbicgstabcreate(fcomm, fsolver) integer fcomm integer ierr integer*8 fsolver call HYPRE_ParCSRBiCGSTABCreate(fcomm, fsolver, ierr) if(ierr .ne. 0) then print *, 'fhypre_parcsrbicgstabcreate error: ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_ParCSRBiCGSTABDestroy !-------------------------------------------------------------------------- subroutine fhypre_parcsrbicgstabdestroy(fsolver) integer ierr integer*8 fsolver call HYPRE_ParCSRBiCGSTABDestroy(fsolver, ierr) if(ierr .ne. 0) then print *, 'fhypre_parcsrbicgstabdestroy error: ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_ParCSRBiCGSTABSetup !------------------------------------------------------------------------- subroutine fhypre_parcsrbicgstabsetup(fsolver, fA, fb, fx) integer ierr integer*8 fsolver integer*8 fA integer*8 fb integer*8 fx call HYPRE_ParCSRBiCGSTABSetup(fsolver, fA, fb, fx, ierr) if(ierr .ne. 0) then print *, 'fhypre_parcsrbicgstabsetup error: ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_ParCSRBiCGSTABSolve !-------------------------------------------------------------------------- subroutine fhypre_parcsrbicgstabsolve(fsolver, fA, fb, fx) integer ierr integer*8 fsolver integer*8 fA integer*8 fb integer*8 fx call HYPRE_ParCSRBiCGSTABSolve(fsolver, fA, fb, fx) if(ierr .ne. 0) then print *, 'fhypre_parcsrbicgstabsolve error: ', ierr endif return end !------------------------------------------------------------------------- ! HYPRE_ParCSRBiCGSTABSetTol !------------------------------------------------------------------------- subroutine fhypre_parcsrbicgstabsettol(fsolver, ftol) integer ierr integer*8 fsolver double precision ftol call HYPRE_ParCSRBiCGSTABSetTol(fsolver, ftol, ierr) if(ierr .ne. 0) then print *, 'fhypre_parcsrbicgstabsettol error: ', ierr endif return end !------------------------------------------------------------------------- ! HYPRE_ParCSRBiCGSTABSetMinIter !------------------------------------------------------------------------- subroutine fhypre_parcsrbicgstabsetminiter(fsolver, fminiter) integer ierr integer fminiter integer*8 fsolver call HYPRE_ParCSRBiCGSTABSetMinIter(fsolver, fminiter, ierr) if(ierr .ne. 0) then print *, 'fhypre_parcsrparcsrbicgstabsetminiter error: ', ierr endif return end !------------------------------------------------------------------------- ! HYPRE_ParCSRBiCGSTABSetMaxIter !------------------------------------------------------------------------- subroutine fhypre_parcsrbicgstabsetmaxiter(fsolver, fmaxiter) integer ierr integer fmaxiter integer*8 fsolver call HYPRE_ParCSRBiCGSTABSetMaxIter(fsolver, fmaxiter, ierr) if(ierr .ne. 0) then print *, 'fhypre_parcsrbicgstabsetmaxiter error: ', ierr endif return end !------------------------------------------------------------------------- ! HYPRE_ParCSRBiCGSTABSetStopCrit !------------------------------------------------------------------------- subroutine fhypre_parcsrbicgstabsetstopcrit(fsolver, fstopcrit) integer ierr integer fstopcrit integer*8 fsolver call HYPRE_ParCSRBiCGSTABSetStopCrit(fsolver, fstopcrit, ierr) if(ierr .ne. 0) then print *, 'fhypre_parcsrbicgstabsetstopcrit error: ', ierr endif return end !------------------------------------------------------------------------- ! HYPRE_ParCSRBiCGSTABSetPrecond !-------------------------------------------------------------------------- subroutine fhypre_parcsrbicgstabsetprecond(fsolver, fprecond_id, 1 fprecond) integer ierr integer fprecond_id integer*8 fsolver integer*8 fprecond call HYPRE_ParCSRBiCGSTABSetPrecond(fsolver, fprecond_id, 1 fprecond, ierr) if(ierr .ne. 0) then print *, 'fhypre_parcsrbicgstabsetprecond error: ', ierr endif return end !------------------------------------------------------------------------- ! HYPRE_ParCSRBiCGSTABGetPrecond !------------------------------------------------------------------------- subroutine fhypre_parcsrbicgstabgetprecond(fsolver, fprecond) integer ierr integer*8 fsolver integer*8 fprecond call HYPRE_ParCSRBiCGSTABGetPrecond(fsolver, fprecond) if(ierr .ne. 0) then print *, 'fhypre_parcsrbicgstabgetprecond error: ', ierr endif return end !------------------------------------------------------------------------- ! HYPRE_ParCSRBiCGSTABSetLogging !------------------------------------------------------------------------- subroutine fhypre_parcsrbicgstabsetlogging(fsolver, flog) integer ierr integer flog integer*8 fsolver call HYPRE_ParCSRBiCGSTABSetLogging(fsolver, flog, ierr) if(ierr .ne. 0) then print *, 'fhypre_parcsrbicgstabsetlogging error: ', ierr endif return end !------------------------------------------------------------------------- ! HYPRE_ParCSRBiCGSTABSetPrintLevel !------------------------------------------------------------------------- subroutine fhypre_parcsrbicgstabsetprintle(fsolver, fprntlvl) integer ierr integer fprntlvl integer*8 fsolver call HYPRE_ParCSRBiCGSTABSetPrintLev(fsolver, fprntlvl, ierr) if(ierr .ne. 0) then print *, 'fhypre_parcsrbicgstabsetprintlevel error: ', ierr endif return end !------------------------------------------------------------------------- ! HYPRE_ParCSRBiCGSTABGetNumIter !------------------------------------------------------------------------- subroutine fhypre_parcsrbicgstabgetnumiter(fsolver, fnumiter) integer ierr integer fnumiter integer*8 fsolver call HYPRE_ParCSRBiCGSTABGetNumIter(fsolver, fnumiter, ierr) if(ierr .ne. 0) then print *, 'fhypre_parcsrbicgstabgetnumiterations error: ', ierr endif return end !------------------------------------------------------------------------- ! HYPRE_ParCSRBiCGSTABGetFinalRelativeResidualNorm !------------------------------------------------------------------------- subroutine fhypre_parcsrbicgstabgetfinalre(fsolver, fnorm) integer ierr integer*8 fsolver double precision fnorm call HYPRE_ParCSRBiCGSTABGetFinalRel(fsolver, fnorm, ierr) if(ierr .ne. 0) then print *, 'fhypre_parcsrbicgstabgetfinalrel error: ', ierr endif return end !------------------------------------------------------------------------- ! HYPRE_BlockTridiagCreate !------------------------------------------------------------------------- subroutine fhypre_blocktridiagcreate(fsolver) integer ierr integer*8 fsolver call HYPRE_BlockTridiagCreate(fsolver, ierr) if(ierr .ne. 0) then print *, 'fhypre_blocktridiagcreate error: ', ierr endif return end !------------------------------------------------------------------------- ! HYPRE_BlockTridiagDestroy !------------------------------------------------------------------------- subroutine fhypre_blocktridiagdestroy(fsolver) integer ierr integer*8 fsolver call HYPRE_BlockTridiagDestroy(fsolver, ierr) if(ierr .ne. 0) then print *, 'fhypre_blocktridiagdestroy error: ', ierr endif return end !------------------------------------------------------------------------- ! HYPRE_BlockTridiagSetup !------------------------------------------------------------------------- subroutine fhypre_blocktridiagsetup(fsolver, fA, fb, fx) integer ierr integer*8 fsolver integer*8 fA integer*8 fb integer*8 fx call HYPRE_BlockTridiagSetup(fsolver, fA, fb, fx, ierr) if(ierr .ne. 0) then print *, 'fhypre_blocktridiagsetup error: ', ierr endif return end !------------------------------------------------------------------------- ! HYPRE_BlockTridiagSolve !------------------------------------------------------------------------- subroutine fhypre_blocktridiagsolve(fsolver, fA, fb, fx) integer ierr integer*8 fsolver integer*8 fA integer*8 fb integer*8 fx call HYPRE_BlockTridiagSolve(fsolver, fA, fb, fx, ierr) if(ierr .ne. 0) then print *, 'fhypre_blocktridiagsolve error: ', ierr endif return end !------------------------------------------------------------------------- ! HYPRE_BlockTridiagSetIndexSet !------------------------------------------------------------------------- subroutine fhypre_blocktridiagsetindexset(fsolver, fn, finds) integer ierr integer fn integer finds integer*8 fsolver call HYPRE_BlockTridiagSetIndexSet(fsolver, fn, finds, ierr) if(ierr .ne. 0) then print *, 'fhypre_blocktridiagsetindexset error: ', ierr endif return end !------------------------------------------------------------------------- ! HYPRE_BlockTridiagSetAMGStrengthThreshold !------------------------------------------------------------------------- subroutine fhypre_blocktridiagsetamgstreng(fsolver, fthresh) integer ierr integer*8 fsolver double precision fthresh call HYPRE_BlockTridiagSetAMGStrengt(fsolver, fthresh, 1 ierr) if(ierr .ne. 0) then print *, 'fhypre_blocktridiagsetamgstrengththreshold error: ', 1 ierr endif return end !------------------------------------------------------------------------- ! HYPRE_BlockTridiagSetAMGNumSweeps !------------------------------------------------------------------------- subroutine fhypre_blocktridiagsetamgnumswe(fsolver, fnumsweep) integer ierr integer fnumsweep integer*8 fsolver call HYPRE_BlockTridiagSetAMGNumSwee(fsolver, fnumsweep, ierr) if(ierr .ne. 0) then print *, 'fhypre_blocktridiagsetamgnumsweeps error: ', ierr endif return end !------------------------------------------------------------------------- ! HYPRE_BlockTridiagSetAMGRelaxType !------------------------------------------------------------------------- subroutine fhypre_blocktridiagsetamgrelaxt(fsolver, frlxtyp) integer ierr integer frlxtyp integer*8 fsolver call HYPRE_BlockTridiagSetAMGRelaxTy(fsolver, frlxtyp, ierr) if(ierr .ne. 0) then print *, 'fhypre_blocktridiagsetamgrelaxype error: ', ierr endif return end !------------------------------------------------------------------------- ! HYPRE_BlockTridiagSetPrintLevel !------------------------------------------------------------------------- subroutine fhypre_blocktridiagsetprintleve(fsolver, fprntlvl) integer ierr integer fprntlvl integer*8 fsolver call HYPRE_BlockTridiagSetPrintLevel(fsolver, fprntlvl, ierr) if(ierr .ne. 0) then print *, 'fhypre_blocktridiagsetprintlevel error: ', ierr endif return end !------------------------------------------------------------------------- ! HYPRE_ParCSRCGNRCreate !------------------------------------------------------------------------- subroutine fhypre_parcsrcgnrcreate(fcomm, fsolver) integer ierr integer fcomm integer*8 fsolver call HYPRE_ParCSRCGNRCreate(fcomm, fsolver, ierr) if(ierr .ne. 0) then print *, 'fhypre_parcsrcgnrcreate error: ', ierr endif return end !------------------------------------------------------------------------- ! HYPRE_ParCSRCGNRDestroy !------------------------------------------------------------------------- subroutine fhypre_parcsrcgnrdestroy(fsolver) integer ierr integer*8 fsolver call HYPRE_ParCSRCGNRDestroy(fsolver, ierr) if(ierr .ne. 0) then print *, 'fhypre_parcsrcgnrdestroy error: ', ierr endif return end !------------------------------------------------------------------------- ! HYPRE_ParCSRCGNRSetup !------------------------------------------------------------------------- subroutine fhypre_parcsrcgnrsetup(fsolver, fA, fb, fx) integer ierr integer*8 fA integer*8 fb integer*8 fx call HYPRE_ParCSRCGNRSetup(fsolver, fA, fb, fx, ierr) if(ierr .ne. 0) then print *, 'fhypre_parcsrcgnrsetup error: ', ierr endif return end !------------------------------------------------------------------------- ! HYPRE_ParCSRCGNRSolve !------------------------------------------------------------------------- subroutine fhypre_parcsrcgnrsolve(fsolver, fA, fb, fx) integer ierr integer*8 fA integer*8 fb integer*8 fx call HYPRE_ParCSRCGNRSolve(fsolver, fA, fb, fx, ierr) if(ierr .ne. 0) then print *, 'fhypre_parcsrcgnrsolve error: ', ierr endif return end !------------------------------------------------------------------------- ! HYPRE_ParCSRCGNRSetTol !------------------------------------------------------------------------- subroutine fhypre_parcsrcgnrsettol(fsolver, ftol) integer ierr integer*8 fsolver double precision ftol call HYPRE_ParCSRCGNRSetTol(fsolver, ftol, ierr) if(ierr .ne. 0) then print *, 'fhypre_parcsrcgnrsettol error: ', ierr endif return end !------------------------------------------------------------------------- ! HYPRE_ParCSRCGNRSetMinIter !------------------------------------------------------------------------- subroutine fhypre_parcsrcgnrsetminiter(fsolver, fminiter) integer ierr integer fminiter integer*8 fsolver call HYPRE_ParCSRCGNRSetMinIter(fsolver, fminiter, ierr) if(ierr .ne. 0) then print *, 'fhypre_parcsrcgnrsetminiter error: ', ierr endif return end !------------------------------------------------------------------------- ! HYPRE_ParCSRCGNRSetMaxIter !------------------------------------------------------------------------- subroutine fhypre_parcsrcgnrsetmaxiter(fsolver, fmaxiter) integer ierr integer fmaxiter integer*8 fsolver call HYPRE_ParCSRCGNRSetMaxIter(fsolver, fmaxiter, ierr) if(ierr .ne. 0) then print *, 'fhypre_parcsrcgnrsetmaxiter error: ', ierr endif return end !------------------------------------------------------------------------- ! HYPRE_ParCSRCGNRSetStopCrit !------------------------------------------------------------------------- subroutine fhypre_parcsrcgnrsetstopcri(fsolver, fstopcrit) integer ierr integer fstopcrit integer*8 fsolver call HYPRE_ParCSRCGNRSetStopCrit(fsolver, fstopcrit, ierr) if(ierr .ne. 0) then print *, 'fhypre_parcsrcgnrsetstopcrit error: ', ierr endif return end !------------------------------------------------------------------------- ! HYPRE_ParCSRCGNRSetPrecond !------------------------------------------------------------------------- subroutine fhypre_parcsrcgnrsetprecond(fsolver, fprecond_id, 1 fprecond) integer ierr integer fprecond_id integer*8 fsolver integer*8 fprecond call HYPRE_ParCSRCGNRSetPrecond(fsolver, fprecond_id, fprecond, 1 ierr) if(ierr .ne. 0) then print *, 'fhypre_parcsrcgnrsetprecond error: ', ierr endif return end !------------------------------------------------------------------------- ! HYPRE_ParCSRCGNRGetPrecond !------------------------------------------------------------------------- subroutine fhypre_parcsrcgnrgetprecond(fsolver, fprecond) integer ierr integer*8 fsolver integer*8 fprecond call HYPRE_ParCSRCGNRGetPrecond(fsolver, fprecond, ierr) if(ierr .ne. 0) then print *, 'fhypre_parcsrcgnrgetprecond error: ', ierr endif return end !------------------------------------------------------------------------- ! HYPRE_ParCSRCGNRSetLogging !------------------------------------------------------------------------- subroutine fhypre_parcsrcgnrsetlogging(fsolver, flog) integer ierr integer flog integer*8 fsolver call HYPRE_ParCSRCGNRSetLogging(fsolver, flog, ierr) if(ierr .ne. 0) then print *, 'fhypre_parcsrcgnrsetlogging error: ', ierr endif return end !------------------------------------------------------------------------- ! HYPRE_ParCSRCGNRGetNumIteration !------------------------------------------------------------------------- subroutine fhypre_parcsrcgnrgetnumiteratio(fsolver, fnumiter) integer ierr integer fnumiter integer*8 fsolver call HYPRE_ParCSRCGNRGetNumIteration(fsolver, fnumiter, ierr) if(ierr .ne. 0) then print *, 'fhypre_parcsrcgnrgetnumiterations error: ', ierr endif return end !------------------------------------------------------------------------- ! HYPRE_ParCSRCGNRGetFinalRelativeResidualNorm !------------------------------------------------------------------------- subroutine fhypre_parcsrcgnrgetfinalrelati(fsolver, fnorm) integer ierr integer*8 fsolver double precision fnorm call HYPRE_ParCSRCGNRGetFinalRelativ(fsolver, fnorm, ierr) if(ierr .ne. 0) then print *, 'fhypre_parcsrcgnrgetfinalrelativ error: ', ierr endif return end !------------------------------------------------------------------------- ! HYPRE_EuclidCreate !------------------------------------------------------------------------- subroutine fhypre_euclidcreate(fcomm, fsolver) integer ierr integer fcomm integer*8 fsolver call HYPRE_EuclidCreate(fcomm, fsolver, ierr) if(ierr .ne. 0) then print *, 'fhypre_euclidcreate error: ', ierr endif return end !------------------------------------------------------------------------- ! HYPRE_EuclidDestroy !------------------------------------------------------------------------- subroutine fhypre_eucliddestroy(fsolver) integer ierr integer*8 fsolver call HYPRE_EuclidDestroy(fsolver, ierr) if(ierr .ne. 0) then print *, 'fhypre_eucliddestroy error: ', ierr endif return end !------------------------------------------------------------------------- ! HYPRE_EuclidSetup !------------------------------------------------------------------------- subroutine fhypre_euclidsetup(fsolver, fA, fb, fx) integer ierr integer*8 fsolver integer*8 fA integer*8 fb integer*8 fx call HYPRE_EuclidSetup(fsolver, fA, fb, fx, ierr) if(ierr .ne. 0) then print *, 'fhypre_euclidsetup error: ', ierr endif return end !------------------------------------------------------------------------- ! HYPRE_EuclidSolve !------------------------------------------------------------------------- subroutine fhypre_euclidsolve(fsolver, fA, fb, fx) integer ierr integer*8 fsolver integer*8 fA integer*8 fb integer*8 fx call HYPRE_EuclidSolve(fsolver, fA, fb, fx, ierr) if(ierr .ne. 0) then print *, 'fhypre_euclidsolve error: ', ierr endif return end !------------------------------------------------------------------------- ! HYPRE_EuclidSetParams !------------------------------------------------------------------------- subroutine fhypre_euclidsetparams(fsolver, fargc, fargv) integer ierr integer fargc integer*8 fsolver character*(*) fargv call HYPRE_EuclidSetParams(fsolver, fargc, fargv, ierr) if(ierr .ne. 0) then print *, 'fhypre_euclidsetparams error: ', ierr endif return end !------------------------------------------------------------------------- ! HYPRE_EuclidSetParamsFromFile !------------------------------------------------------------------------- subroutine fhypre_euclidsetparamsfromfile(fsolver, ffile) integer ierr integer*8 fsolver character*(*) ffile call HYPRE_EuclidSetParamsFromFile(fsolver, ffile, ierr) if(ierr .ne. 0) then print *, 'fhypre_euclidsetparamsfromfile error: ', ierr endif return end !------------------------------------------------------------------------- ! HYPRE_ParCSRGMRESCreate !------------------------------------------------------------------------- subroutine fhypre_parcsrgmrescreate(fcomm, fsolver) integer ierr integer fcomm integer*8 fsolver call HYPRE_ParCSRGMRESCreate(fcomm, fsolver, ierr) if(ierr .ne. 0) then print *, 'fhypre_parcsrgmrescreate error: ', ierr endif return end !------------------------------------------------------------------------- ! HYPRE_ParCSRGMRESDestroy !------------------------------------------------------------------------- subroutine fhypre_parcsrgmresdestroy(fsolver) integer ierr integer*8 fsolver call HYPRE_ParCSRGMRESDestroy(fsolver) if(ierr .ne. 0) then print *, 'fhypre_parcsrgmresdestroy error: ', ierr endif return end !------------------------------------------------------------------------- ! HYPRE_ParCSRGMRESSetup !------------------------------------------------------------------------- subroutine fhypre_parcsrgmressetup(fsolver, fA, fb, fx) integer ierr integer*8 fsolver integer*8 fA integer*8 fb integer*8 fx call HYPRE_ParCSRGMRESSetup(fsolver, fA, fb, fx, ierr) if(ierr .ne. 0) then print *, 'fhypre_parcsrgmressetup error: ', ierr endif return end !------------------------------------------------------------------------- ! HYPRE_ParCSRGMRESSolve !------------------------------------------------------------------------- subroutine fhypre_parcsrgmressolve(fsolver, fA, fb, fx) integer ierr integer*8 fsolver integer*8 fA integer*8 fb integer*8 fx call HYPRE_ParCSRGMRESSolve(fsolver, fA, fb, fx, ierr) if(ierr .ne. 0) then print *, 'fhypre_parcsrgmressolve error: ', ierr endif return end !------------------------------------------------------------------------- ! HYPRE_ParCSRGMRESSetKDim !------------------------------------------------------------------------- subroutine fhypre_parcsrgmressetkdim(fsolver, fkdim) integer ierr integer fkdim integer*8 fsolver call HYPRE_ParCSRGMRESSetKDim(fsolver, fkdim, ierr) if(ierr .ne. 0) then print *, 'fhypre_parcsrgmressetkdim error: ', ierr endif return end !------------------------------------------------------------------------- ! HYPRE_ParCSRGMRESSetTol !------------------------------------------------------------------------- subroutine fhypre_parcsrgmressettol(fsolver, ftol) integer ierr integer*8 fsolver double precision ftol call HYPRE_ParCSRGMRESSetTol(fsolver, ftol, ierr) if(ierr .ne. 0) then print *, 'fhypre_parcsrgmressettol error: ', ierr endif return end !------------------------------------------------------------------------- ! HYPRE_ParCSRGMRESSetMinIter !------------------------------------------------------------------------- subroutine fhypre_parcsrgmressetminiter(fsolver, fminiter) integer ierr integer fminiter integer*8 fsolver call HYPRE_ParCSRGMRESSetMinIter(fsolver, fminiter, ierr) if(ierr .ne. 0) then print *, 'fhypre_parcsrgmressetminiter error: ', ierr endif return end !------------------------------------------------------------------------- ! HYPRE_ParCSRGMRESSetMaxIter !-------------------------------------------------------------------------- subroutine fhypre_parcsrgmressetmaxiter(fsolver, fmaxiter) integer ierr integer fmaxiter integer*8 fsolver call HYPRE_ParCSRGMRESSetMaxIter(fsolver, fmaxiter, ierr) if(ierr .ne. 0) then print *, 'fhypre_parcsrgmressetmaxiter error: ', ierr endif return end !------------------------------------------------------------------------- ! HYPRE_ParCSRGMRESSetStopCrit !-------------------------------------------------------------------------- subroutine fhypre_parcsrgmressetstopcrit(fsolver, fstopcrit) integer ierr integer fstopcrit integer*8 fsolver call HYPRE_ParCSRGMRESSetStopCrit(fsolver, fstopcrit, ierr) if(ierr .ne. 0) then print *, 'fhypre_parcsrgmressetstopcrit error: ', ierr endif return end !------------------------------------------------------------------------- ! HYPRE_ParCSRGMRESSetPrecond !------------------------------------------------------------------------- subroutine fhypre_parcsrgmressetprecond(fsolver, fprecond_id, 1 fprecond) integer ierr integer fprecond_id integer*8 fsolver integer*8 fprecond call HYPRE_ParCSRGMRESSetPrecond(fsolver, fprecond_id, fprecond, 1 ierr) if(ierr .ne. 0) then print *, 'fhypre_parcsrgmressetprecond error: ', ierr endif return end !------------------------------------------------------------------------- ! HYPRE_ParCSRGMRESGetPrecond !------------------------------------------------------------------------- subroutine fhypre_parcsrgmresgetprecond(fsolver, fprecond) integer ierr integer*8 fsolver integer*8 fprecond call HYPRE_ParCSRGMRESGetPrecond(fsolver, fprecond, ierr) if(ierr .ne. 0) then print *, 'fhypre_parcsrgmresgetprecond error: ', ierr endif return end !------------------------------------------------------------------------- ! HYPRE_ParCSRGMRESSetLogging !------------------------------------------------------------------------- subroutine fhypre_parcsrgmressetlogging(fsolver, flog) integer ierr integer flog integer*8 fsolver call HYPRE_ParCSRGMRESSetLogging(fsolver, flog, ierr) if(ierr .ne. 0) then print *, 'fhypre_parcsrgmressetlogging error: ', ierr endif return end !------------------------------------------------------------------------- ! HYPRE_ParCSRGMRESSetPrintLevel !------------------------------------------------------------------------- subroutine fhypre_parcsrgmressetprintlevel(fsolver, fprntlvl) integer ierr integer fprntlvl integer*8 fsolver call HYPRE_ParCSRGMRESSetPrintLevel(fsolver, fprntlvl, ierr) if(ierr .ne. 0) then print *, 'fhypre_parcsrgmressetprintlevel error: ', ierr endif return end !------------------------------------------------------------------------- ! HYPRE_ParCSRGMRESGetNumIterations !------------------------------------------------------------------------- subroutine fhypre_parcsrgmresgetnumiterati(fsolver, fnumiter) integer ierr integer fnumiter integer*8 fsolver call HYPRE_ParCSRGMRESGetNumIteratio(fsolver, fnumiter, ierr) if(ierr .ne. 0) then print *, 'fhypre_parcsrgmresgetnumiterations error: ', ierr endif return end !------------------------------------------------------------------------- ! HYPRE_ParCSRGMRESGetFinalRelativeResidualNorm !------------------------------------------------------------------------- subroutine fhypre_parcsrgmresgetfinalrelat(fsolver, fnorm) integer ierr integer*8 fsolver double precision fnorm call HYPRE_ParCSRGMRESGetFinalRelati(fsolver, fnorm, ierr) if(ierr .ne. 0) then print *, 'fhypre_parcsrgmresgetfinalrelative error: ', ierr endif return end !------------------------------------------------------------------------- ! HYPRE_ParCSRHybridCreate !------------------------------------------------------------------------- subroutine fhypre_parcsrhybridcreate(fsolver) integer ierr integer*8 fsolver call HYPRE_ParCSRHybridCreate(fsolver, ierr) if(ierr .ne. 0) then print *, 'fhypre_parcsrhybridcreate error: ', ierr endif return end !------------------------------------------------------------------------- ! HYPRE_ParCSRHybridDestroy !------------------------------------------------------------------------- subroutine fhypre_parcsrhybriddestroy(fsolver) integer ierr integer*8 fsolver call HYPRE_ParCSRHybridDestroy(fsolver, ierr) if(ierr .ne. 0) then print *, 'fhypre_parcsrhybriddestroy error: ', ierr endif return end !------------------------------------------------------------------------- ! HYPRE_ParCSRHybridSetup !------------------------------------------------------------------------- subroutine fhypre_parcsrhybridsetup(fsolver, fA, fb, fx) integer ierr integer*8 fsolver integer*8 fA integer*8 fb integer*8 fx call HYPRE_ParCSRHybridSetup(fsolver, fA, fb, fx, ierr) if(ierr .ne. 0) then print *, 'fhypre_parcsrhybridsetup error: ', ierr endif return end !------------------------------------------------------------------------- ! HYPRE_ParCSRHybridSolve !------------------------------------------------------------------------- subroutine fhypre_parcsrhybridsolve(fsolver, fA, fb, fx) integer ierr integer*8 fsolver integer*8 fA integer*8 fb integer*8 fx call HYPRE_ParCSRHybridSolve(fsolver, fA, fb, fx, ierr) if(ierr .ne. 0) then print *, 'fhypre_parcsrhybridsolve error: ', ierr endif return end !------------------------------------------------------------------------- ! HYPRE_ParCSRHybridSetTol !------------------------------------------------------------------------- subroutine fhypre_parcsrhybridsettol(fsolver, ftol) integer ierr integer*8 fsolver double precision ftol call HYPRE_ParCSRHybridSetTol(fsolver, ftol, ierr) if(ierr .ne. 0) then print *, 'fhypre_parcsrhybridsettol error: ', ierr endif return end !------------------------------------------------------------------------- ! HYPRE_ParCSRHybridSetConvergenceTol !------------------------------------------------------------------------- subroutine fhypre_parcsrhybridsetconvergenc(fsolver, fcftol) integer ierr integer*8 fsolver double precision fcftol call HYPRE_ParCSRHybridSetConvergenc(fsolver, fcftol, ierr) if(ierr .ne. 0) then print *, 'fhypre_parcsrhybridsetconvergencetol error: ', ierr endif return end !------------------------------------------------------------------------- ! HYPRE_ParCSRHybridSetDSCGMaxIter !------------------------------------------------------------------------- subroutine fhypre_parcsrhybridsetdscgmaxit(fsolver, fmaxiter) integer ierr integer fmaxiter integer*8 fsolver call HYPRE_ParCSRHybridSetDSCGMaxIte(fsolver, fmaxiter, ierr) if(ierr .ne. 0) then print *, 'fhypre_parcsrhybridsetdscgmaxiter error: ', ierr endif return end !------------------------------------------------------------------------- ! HYPRE_ParCSRHybridSetPCGMaxIter !------------------------------------------------------------------------- subroutine fhypre_parcsrhybridsetpcgmaxite(fsolver, fmaxiter) integer ierr integer fmaxiter integer*8 fsolver call HYPRE_ParCSRHybridSetPCGMaxIter(fsolver, fmaxiter, ierr) if(ierr .ne. 0) then print *, 'fhypre_parcsrhybridsetpcgmaxiter error: ', ierr endif return end !------------------------------------------------------------------------- ! HYPRE_ParCSRHybridSetSolverType !------------------------------------------------------------------------- subroutine fhypre_parcsrhybridsetsolvertyp(fsolver, ftype) integer ierr integer ftype integer*8 fsolver call HYPRE_ParCSRHybridSetSolverType(fsolver, ftype, ierr) if(ierr .ne. 0) then print *, 'fhypre_parcsrhybridsetsolvertype error: ', ierr endif return end !------------------------------------------------------------------------- ! HYPRE_ParCSRHybridSetKDim !------------------------------------------------------------------------- subroutine fhypre_parcsrhybridsetkdim(fsolver, fkdim) integer ierr integer fkdim integer*8 fsolver call HYPRE_ParCSRHybridSetKDim(fsolver, fkdim, ierr) if(ierr .ne. 0) then print *, 'fhypre_parcsrhybridsetkdim error: ', ierr endif return end !------------------------------------------------------------------------- ! HYPRE_ParCSRHybridSetTwoNorm !------------------------------------------------------------------------- subroutine fhypre_parcsrhybridsettwonorm(fsolver, f2norm) integer ierr integer f2norm integer*8 fsolver call HYPRE_ParCSRHybridSetTwoNorm(fsolver, f2norm, ierr) if(ierr .ne. 0) then print *, 'fhypre_parcsrhybridsettwonorm error: ', ierr endif return end !------------------------------------------------------------------------- ! HYPRE_ParCSRHybridSetStopCrit !------------------------------------------------------------------------- subroutine fhypre_parcsrhybridsetstopcrit(fsolver, fstopcrit) integer ierr integer fstopcrit integer*8 fsolver call HYPRE_ParCSRHybridSetStopCrit(fsolver, fstopcrit, ierr) if(ierr .ne. 0) then print *, 'fhypre_parcsrhybridsetstopcrit error: ', ierr endif return end !------------------------------------------------------------------------- ! HYPRE_ParCSRHybridSetRelChange !------------------------------------------------------------------------- subroutine fhypre_parcsrhybridsetrelchange(fsolver, frelchg) integer ierr integer frelchg integer*8 fsolver call HYPRE_ParCSRHybridSetRelChange(fsolver, frelchg, ierr) if(ierr .ne. 0) then print *, 'fhypre_parcsrhybridsetrelchange error: ', ierr endif return end !------------------------------------------------------------------------- ! HYPRE_ParCSRHybridSetPrecond !------------------------------------------------------------------------- subroutine fhypre_parcsrhybridsetprecond(fsolver, fpreid, 1 fpresolver) integer ierr integer fpreid integer*8 fsolver integer*8 fpresolver call HYPRE_ParCSRHybridSetPrecond(fsolver, fpreid, fpresolver, 1 ierr) if(ierr .ne. 0) then print *, 'fhypre_parcsrhybridsetprecond error: ', ierr endif return end !------------------------------------------------------------------------- ! HYPRE_ParCSRHybridSetLogging !------------------------------------------------------------------------- subroutine fhypre_parcsrhybridsetlogging(fsolver, flogging) integer ierr integer flogging integer*8 fsolver call HYPRE_ParCSRHybridSetLogging(fsolver, flogging, ierr) if(ierr .ne. 0) then print *, 'fhypre_parcsrhybridsetlogging error: ', ierr endif return end !------------------------------------------------------------------------- ! HYPRE_ParCSRHybridSetPrintLevel !------------------------------------------------------------------------- subroutine fhypre_parcsrhybridsetprintlevel(fsolver, fprntlvl) integer ierr integer fprntlvl integer*8 fsolver call HYPRE_ParCSRHybridSetPrintLevel(fsolver, fprntlvl, ierr) if(ierr .ne. 0) then print *, 'fhypre_parcsrhybridsetprintlevel error: ', ierr endif return end !------------------------------------------------------------------------- ! HYPRE_ParCSRHybridSetStrongThreshold !------------------------------------------------------------------------- subroutine fhypre_parcsrhybridsetstrongthr(fsolver, fthresh) integer ierr integer fthresh integer*8 fsolver call HYPRE_ParCSRHybridSetStrongThre(fsolver, fthresh, ierr) if(ierr .ne. 0) then print *, 'fhypre_parcsrhybridsetstrongthreshold error: ', ierr endif return end !------------------------------------------------------------------------- ! HYPRE_ParCSRHybridSetMaxRowSum !------------------------------------------------------------------------- subroutine fhypre_parcsrhybridsetmaxrowsum(fsolver, fsum) integer ierr integer fsum integer*8 fsolver call HYPRE_ParCSRHybridSetMaxRowSum(fsolver, fsum, ierr) if(ierr .ne. 0) then print *, 'fhypre_parcsrhybridsetmaxrowsum error: ', ierr endif return end !------------------------------------------------------------------------- ! HYPRE_ParCSRHybridSetTruncFactor !------------------------------------------------------------------------- subroutine fhypre_parcsrhybridsettruncfact(fsolver, ftfact) integer ierr integer ftfact integer*8 fsolver call HYPRE_ParCSRHybridSetTruncFacto(fsolver, ftfact, ierr) if(ierr .ne. 0) then print *, 'fhypre_parcsrhybridsettruncfactor error: ', ierr endif return end !------------------------------------------------------------------------- ! HYPRE_ParCSRHybridSetMaxLevels !------------------------------------------------------------------------- subroutine fhypre_parcsrhybridsetmaxlevels(fsolver, fmaxlvl) integer ierr integer fmaxlvl integer*8 fsolver call HYPRE_ParCSRHybridSetMaxLevels(fsolver, fmaxlvl, ierr) if(ierr .ne. 0) then print *, 'fhypre_parcsrhybridsetmaxlevels error: ', ierr endif return end !------------------------------------------------------------------------- ! HYPRE_ParCSRHybridSetMeasureType !------------------------------------------------------------------------- subroutine fhypre_parcsrhybridsetmeasurety(fsolver, fmtype) integer ierr integer fmtype integer*8 fsolver call HYPRE_ParCSRHybridSetMeasureTyp(fsolver, fmtype, ierr) if(ierr .ne. 0) then print *, 'fhypre_parcsrhybridsetmeasuretype error: ', ierr endif return end !------------------------------------------------------------------------- ! HYPRE_ParCSRHybridSetCoarsenType !------------------------------------------------------------------------- subroutine fhypre_parcsrhybridsetcoarsenty(fsolver, fcoarse) integer ierr integer fcoarse integer*8 fsolver call HYPRE_ParCSRHybridSetCoarsenTyp(fsolver, fcoarse, ierr) if(ierr .ne. 0) then print *, 'fhypre_parcsrhybridsetcoarsentype error: ', ierr endif return end !------------------------------------------------------------------------- ! HYPRE_ParCSRHybridSetCycleType !------------------------------------------------------------------------- subroutine fhypre_parcsrhybridsetcycletype(fsolver, fcycle) integer ierr integer fcycle integer*8 fsolver call HYPRE_ParCSRHybridSetCycleType(fsolver, fcycle, ierr) if(ierr .ne. 0) then print *, 'fhypre_parcsrhybridsetcycletype error: ', ierr endif return end !------------------------------------------------------------------------- ! HYPRE_ParCSRHybridSetNumGridSweeps !------------------------------------------------------------------------- subroutine fhypre_parcsrhybridsetnumgridsw(fsolver, fsweep) integer ierr integer fsweep integer*8 fsolver call HYPRE_ParCSRHybridSetNumGridSwe(fsolver, fsweep, ierr) if(ierr .ne. 0) then print *, 'fhypre_parcsrhybridsetnumgridsweeps error: ', ierr endif return end !------------------------------------------------------------------------- ! HYPRE_ParCSRHybridSetGridRelaxType !------------------------------------------------------------------------- subroutine fhypre_parcsrhybridsetgridrlxtyp(fsolver, frlxt) integer ierr integer frlxt integer*8 fsolver call HYPRE_ParCSRHybridSetGridRelaxT(fsolver, frlxt, ierr) if(ierr .ne. 0) then print *, 'fhypre_parcsrhybridsetgridrelaxtype error: ', ierr endif return end !------------------------------------------------------------------------- ! HYPRE_ParCSRHybridSetGridRelaxPoints !------------------------------------------------------------------------- subroutine fhypre_parcsrhybridsetgridrlxpts(fsolver, frlxp) integer ierr integer frlxp integer*8 fsolver call HYPRE_ParCSRHybridSetGridRelaxP(fsolver, frlxp, ierr) if(ierr .ne. 0) then print *, 'fhypre_parcsrhybridsetgridrelaxpoints error: ', ierr endif return end !------------------------------------------------------------------------- ! HYPRE_ParCSRHybridSetNumSweeps !------------------------------------------------------------------------- subroutine fhypre_parcsrhybridsetnumsweeps(fsolver, fsweep) integer ierr integer fsweep integer*8 fsolver call HYPRE_ParCSRHybridSetNumSweeps(fsolver, fsweep, ierr) if(ierr .ne. 0) then print *, 'fhypre_parcsrhybridsetnumsweeps error: ', ierr endif return end !------------------------------------------------------------------------- ! HYPRE_ParCSRHybridSetCycleNumSweeps !------------------------------------------------------------------------- subroutine fhypre_parcsrhybridsetcyclenums(fsolver, fsweep) integer ierr integer fsweep integer*8 fsolver call HYPRE_ParCSRHybridSetCycleNumSw(fsolver, fsweep, ierr) if(ierr .ne. 0) then print *, 'fhypre_parcsrhybridsetcyclenumsweeps error: ', ierr endif return end !------------------------------------------------------------------------- ! HYPRE_ParCSRHybridSetRelaxType !------------------------------------------------------------------------- subroutine fhypre_parcsrhybridsetrelaxtype(fsolver, frlxt) integer ierr integer frlxt integer*8 fsolver call HYPRE_ParCSRHybridSetRelaxType(fsolver, frlxt, ierr) if(ierr .ne. 0) then print *, 'fhypre_parcsrhybridsetrelaxtype error: ', ierr endif return end !------------------------------------------------------------------------- ! HYPRE_ParCSRHybridSetCycleRelaxType !------------------------------------------------------------------------- subroutine fhypre_parcsrhybridsetcyclerela(fsolver, frlxt) integer ierr integer frlxt integer*8 fsolver call HYPRE_ParCSRHybridSetCycleRelax(fsolver, frlxt, ierr) if(ierr .ne. 0) then print *, 'fhypre_parcsrhybridsetcyclerelaxtype error: ', ierr endif return end !------------------------------------------------------------------------- ! HYPRE_ParCSRHybridSetRelaxOrder !------------------------------------------------------------------------- subroutine fhypre_parcsrhybridsetrelaxorde(fsolver, frlx) integer ierr integer frlx integer*8 fsolver call HYPRE_ParCSRHybridSetRelaxOrder(fsolver, frlx, ierr) if(ierr .ne. 0) then print *, 'fhypre_parcsrhybridsetrelaxorder error: ', ierr endif return end !------------------------------------------------------------------------- ! HYPRE_ParCSRHybridSetRelaxWt !------------------------------------------------------------------------- subroutine fhypre_parcsrhybridsetrelaxwt(fsolver, frlx) integer ierr integer frlx integer*8 fsolver call HYPRE_ParCSRHybridSetRelaxWt(fsolver, frlx, ierr) if(ierr .ne. 0) then print *, 'fhypre_parcsrhybridsetrelaxwt error: ', ierr endif return end !------------------------------------------------------------------------- ! HYPRE_ParCSRHybridSetLevelRelaxWt !------------------------------------------------------------------------- subroutine fhypre_parcsrhybridsetlevelrela(fsolver, frlx) integer ierr integer frlx integer*8 fsolver call HYPRE_ParCSRHybridSetLevelRelax(fsolver, frlx, ierr) if(ierr .ne. 0) then print *, 'fhypre_parcsrhybridsetlevelrelaxwt error: ', ierr endif return end !------------------------------------------------------------------------- ! HYPRE_ParCSRHybridSetOuterWt !------------------------------------------------------------------------- subroutine fhypre_parcsrhybridsetouterwt(fsolver, fout) integer ierr integer fout integer*8 fsolver call HYPRE_ParCSRHybridSetOuterWt(fsolver, fout, ierr) if(ierr .ne. 0) then print *, 'fhypre_parcsrhybridsetouterwt error: ', ierr endif return end !------------------------------------------------------------------------- ! HYPRE_ParCSRHybridSetLevelOuterWt !------------------------------------------------------------------------- subroutine fhypre_parcsrhybridsetleveloute(fsolver, fout) integer ierr integer fout integer*8 fsolver call HYPRE_ParCSRHybridSetLevelOuter(fsolver, fout ierr) if(ierr .ne. 0) then print *, 'fhypre_parcsrhybridsetlevelouterwt error: ', ierr endif return end !------------------------------------------------------------------------- ! HYPRE_ParCSRHybridSetRelaxWeight !------------------------------------------------------------------------- subroutine fhypre_parcsrhybridsetrelaxweig(fsolver, frlx) integer ierr integer frlx integer*8 fsolver call HYPRE_ParCSRHybridSetRelaxWeigh(fsolver, frlx, ierr) if(ierr .ne. 0) then print *, 'fhypre_parcsrhybridsetrelaxweight error: ', ierr endif return end !------------------------------------------------------------------------- ! HYPRE_ParCSRHybridSetOmega !------------------------------------------------------------------------- subroutine fhypre_parcsrhybridsetomega(fsolver, fomega) integer ierr integer fomega integer*8 fsolver call HYPRE_ParCSRHybridSetOmega(fsolver, fomega, ierr) if(ierr .ne. 0) then print *, 'fhypre_parcsrhybridsetomega error: ', ierr endif return end !------------------------------------------------------------------------- ! HYPRE_ParCSRHybridGetNumIterations !------------------------------------------------------------------------- subroutine fhypre_parcsrhybridgetnumiterat(fsolver, fiters) integer ierr integer fiters integer*8 fsolver call HYPRE_ParCSRHybridGetNumIterati(fsolver, fiters, ierr) if(ierr .ne. 0) then print *, 'fhypre_parcsrhybridgetnumiterations error: ', ierr endif return end !------------------------------------------------------------------------- ! HYPRE_ParCSRHybridGetDSCGNumIterations !------------------------------------------------------------------------- subroutine fhypre_parcsrhybridgetdscgnumit(fsolver, fiters) integer ierr integer fiters integer*8 fsolver call HYPRE_ParCSRHybridGetDSCGNumIte(fsolver, fiters, ierr) if(ierr .ne. 0) then print *, 'fhypre_parcsrhybridgetdscgnumiterations error: ', 1 ierr endif return end !------------------------------------------------------------------------- ! HYPRE_ParCSRHybridGetPCGNumIterations !------------------------------------------------------------------------- subroutine fhypre_parcsrhybridgetpcgnumite(fsolver, fiters) integer ierr integer fiters integer*8 fsolver call HYPRE_ParCSRHybridGetPCGNumIter(fsolver, fiters, ierr) if(ierr .ne. 0) then print *, 'fhypre_parcsrhybridgetpcgnumiterations error: ', 1 ierr endif return end !------------------------------------------------------------------------- ! HYPRE_ParCSRHybridGetFinalRelativeResidualNorm !------------------------------------------------------------------------- subroutine fhypre_parcsrhybridgetfinalrela(fsolver, fnorm) integer ierr integer fnorm integer*8 fsolver call HYPRE_ParCSRHybridGetFinalRelat(fsolver, 1 fnorm, ierr) if(ierr .ne. 0) then print *, 1 'fhypre_parcsrhybridgetfinalrelativeresidualnorm error: ', 1 ierr endif return end !------------------------------------------------------------------------- ! HYPRE_ParSetRandomValues !------------------------------------------------------------------------- subroutine fhypre_parsetrandomvalues(fv, fseed) integer ierr integer fseed integer*8 fv call HYPRE_ParVectorSetRandomValues(fv, fseed, ierr) if(ierr .ne. 0) then print *, 'fhypre_parsetrandomvalues error: ', ierr endif return end !------------------------------------------------------------------------- ! HYPRE_ParPrintVector !------------------------------------------------------------------------- subroutine fhypre_parprintvector(fv, ffile) integer ierr integer*8 fv character*(*) ffile call hypre_ParVectorPrint(fv, ffile, ierr) if(ierr .ne. 0) then print *, 'fhypre_parprintvector error: ', ierr endif return end !------------------------------------------------------------------------- ! HYPRE_ParReadVector !------------------------------------------------------------------------- subroutine fhypre_parreadvector(fcomm, ffile) integer ierr integer fcomm character*(*) ffile call hypre_ParReadVector(fcomm, ffile, ierr) if(ierr .ne. 0) then print *, 'fhypre_parreadvector error: ', ierr endif return end !------------------------------------------------------------------------- ! HYPRE_ParVectorSize !------------------------------------------------------------------------- subroutine fhypre_parvectorsize(fx) integer ierr integer*8 fx call hypre_ParVectorSize(fx, ierr) if(ierr .ne. 0) then print *, 'fhypre_parvectorsize error: ', ierr endif return end !------------------------------------------------------------------------- ! HYPRE_ParCSRMultiVectorPrint !------------------------------------------------------------------------- subroutine fhypre_parcsrmultivectorprint(fx, ffile) integer ierr integer*8 fx character*(*) ffile call hypre_ParCSRMultiVectorPrint(fx, ffile, ierr) if(ierr .ne. 0) then print *, 'fhypre_parcsrmultivectorprint error: ', ierr endif return end !------------------------------------------------------------------------- ! HYPRE_ParCSRMultiVectorRead !------------------------------------------------------------------------- subroutine fhypre_parcsrmultivectorread(fcomm, fii, ffile) integer ierr integer fcomm integer*8 fii character*(*) ffile call hypre_ParCSRMultiVectorRead(fcomm, fii, ffile, ierr) if(ierr .ne. 0) then print *, 'fhypre_parcsrmultivectorread error: ', ierr endif return end !------------------------------------------------------------------------- ! aux_maskCount !------------------------------------------------------------------------- subroutine fhypre_aux_maskcount(fn, fmask) integer ierr integer fn integer fmask call aux_maskCount(fn, fmask, ierr) if(ierr .ne. 0) then print *, 'fhypre_aux_maskcount error: ', ierr endif return end !------------------------------------------------------------------------- ! aux_indexFromMask !------------------------------------------------------------------------- subroutine fhypre_auxindexfrommask(fn, fmask, findex) integer ierr integer fn integer fmask integer findex call aux_indexFromMask(fn, fmask, findex, ierr) if(ierr .ne. 0) then print *, 'fhypre_aux_indexfrommask error: ', ierr endif return end !------------------------------------------------------------------------- ! HYPRE_TempParCSRSetupInterpreter !------------------------------------------------------------------------- subroutine fhypre_tempparcsrsetupinterpret(fi) integer ierr integer*8 fi call HYPRE_TempParCSRSetupInterprete(fi, ierr) if(ierr .ne. 0) then print *, 'fhypre_tempparcsrsetupinterpreter error: ', ierr endif return end !------------------------------------------------------------------------- ! HYPRE_ParCSRSetupInterpreter !------------------------------------------------------------------------- subroutine fhypre_parcsrsetupinterpreter(fi) integer ierr integer*8 fi call HYPRE_ParCSRSetupInterpreter(fi, ierr) if(ierr .ne. 0) then print *, 'fhypre_parcsrsetupinterpreter error: ', ierr endif return end !------------------------------------------------------------------------- ! HYPRE_ParCSRSetupMatvec !------------------------------------------------------------------------- subroutine fhypre_parcsrsetupmatvec(fmv) integer ierr integer*8 fmv call HYPRE_ParCSRSetupMatvec(fmv, ierr) if(ierr .ne. 0) then print *, 'fhypre_parcsrsetupmatvec error: ', ierr endif return end !------------------------------------------------------------------------- ! HYPRE_ParaSailsCreate !------------------------------------------------------------------------- subroutine fhypre_parasailscreate(fcomm, fsolver) integer ierr integer fcomm integer*8 fsolver call HYPRE_ParaSailsCreate(fcomm, fsolver, ierr) if(ierr .ne. 0) then print *, 'fhypre_parasailscreate error: ', ierr endif return end !------------------------------------------------------------------------- ! HYPRE_ParaSailsDestroy !------------------------------------------------------------------------- subroutine fhypre_parasailsdestroy(fsolver) integer ierr integer*8 fsolver call HYPRE_ParaSailsDestroy(fsolver, ierr) if(ierr .ne. 0) then print *, 'fhypre_parasailsdestroy error: ', ierr endif return end !------------------------------------------------------------------------- ! HYPRE_ParaSailsSetup !------------------------------------------------------------------------- subroutine fhypre_parasailssetup(fsolver, fA, fb, fx) integer ierr integer*8 fsolver integer*8 fA integer*8 fb integer*8 fx call HYPRE_ParaSailsSetup(fsolver, fA, fb, fx, ierr) if(ierr .ne. 0) then print *, 'fhypre_parasailssetup error: ', ierr endif return end !------------------------------------------------------------------------- ! HYPRE_ParaSailsSolve !------------------------------------------------------------------------- subroutine fhypre_parasailssolve(fsolver, fA, fb, fx) integer ierr integer*8 fsolver integer*8 fA integer*8 fb integer*8 fx call HYPRE_ParaSailsSolve(fsolver, fA, fb, fx, ierr) if(ierr .ne. 0) then print *, 'fhypre_parasailssolve error: ', ierr endif return end !------------------------------------------------------------------------- ! HYPRE_ParaSailsSetParams !------------------------------------------------------------------------- subroutine fhypre_parasailssetparams(fsolver, fthresh, fnlevels) integer ierr integer fnlevels integer*8 fsolver double precision fthresh call HYPRE_ParaSailsSetParams(fsolver, fthresh, fnlevels, ierr) if(ierr .ne. 0) then print *, 'fhypre_parasailssetparams error: ', ierr endif return end !------------------------------------------------------------------------- ! HYPRE_ParaSailsSetThresh !------------------------------------------------------------------------- subroutine fhypre_parasailssetthresh(fsolver, fthresh) integer ierr integer*8 fsolver double precision fthresh call HYPRE_ParaSailsSetThresh(fsolver, fthresh, ierr) if(ierr .ne. 0) then print *, 'fhypre_parasailssetthresh error: ', ierr endif return end !------------------------------------------------------------------------- ! HYPRE_ParaSailsGetThresh !------------------------------------------------------------------------- subroutine fhypre_parasailsgetthresh(fsolver, fthresh) integer ierr integer*8 fsolver double precision fthresh call HYPRE_ParaSailsGetThresh(fsolver, fthresh, ierr) if(ierr .ne. 0) then print *, 'fhypre_parasailsgetthresh error: ', ierr endif return end !------------------------------------------------------------------------- ! HYPRE_ParaSailsSetNlevels !------------------------------------------------------------------------- subroutine fhypre_parasailssetnlevels(fsolver, fnlevels) integer ierr integer fnlevels integer*8 fsolver call HYPRE_ParaSailsSetNlevels(fsolver, fnlevels, ierr) if(ierr .ne. 0) then print *, 'fhypre_parasailssetnlevels error: ', ierr endif return end !------------------------------------------------------------------------- ! HYPRE_ParaSailsGetNlevels !------------------------------------------------------------------------- subroutine fhypre_parasailsgetnlevels(fsolver, fnlevels) integer ierr integer fnlevels integer*8 fsolver call HYPRE_ParaSailsGetNlevels(fsolver, fnlevels, ierr) if(ierr .ne. 0) then print *, 'fhypre_parasailsgetnlevels error: ', ierr endif return end !------------------------------------------------------------------------- ! HYPRE_ParaSailsSetFilter !------------------------------------------------------------------------- subroutine fhypre_parasailssetfilter(fsolver, ffilter) integer ierr integer*8 fsolver double precision ffilter call HYPRE_ParaSailsSetFilter(fsolver, ffilter, ierr) if(ierr .ne. 0) then print *, 'fhypre_parasailssetfilter error: ', ierr endif return end !------------------------------------------------------------------------- ! HYPRE_ParaSailsGetFilter !------------------------------------------------------------------------- subroutine fhypre_parasailsgetfilter(fsolver, ffilter) integer ierr integer*8 fsolver double precision ffilter call HYPRE_ParaSailsGetFilter(fsolver, ffilter, ierr) if(ierr .ne. 0) then print *, 'fhypre_parasailsgetfilter error: ', ierr endif return end !------------------------------------------------------------------------- ! HYPRE_ParaSailsSetSym !------------------------------------------------------------------------- subroutine fhypre_parasailssetsym(fsolver, fsym) integer ierr integer fsym integer*8 fsolver call HYPRE_ParaSailsSetSym(fsolver, fsym, ierr) if(ierr .ne. 0) then print *, 'fhypre_parasailssetsym error: ', ierr endif return end !------------------------------------------------------------------------- ! HYPRE_ParaSailsGetSym !------------------------------------------------------------------------- subroutine fhypre_parasailsgetsym(fsolver, fsym) integer ierr integer fsym integer*8 fsolver call HYPRE_ParaSailsGetSym(fsolver, fsym, ierr) if(ierr .ne. 0) then print *, 'fhypre_parasailsgetsym error: ', ierr endif return end !------------------------------------------------------------------------- ! HYPRE_ParaSailsSetLoadbal !------------------------------------------------------------------------- subroutine fhypre_parasailssetloadbal(fsolver, floadbal) integer ierr integer*8 fsolver double precision floadbal call HYPRE_ParaSailsSetLoadbal(fsolver, floadbal, ierr) if(ierr .ne. 0) then print *, 'fhypre_parasailssetloadbal error: ', ierr endif return end !------------------------------------------------------------------------- ! HYPRE_ParaSailsGetLoadbal !------------------------------------------------------------------------- subroutine fhypre_parasailsgetloadbal(fsolver, floadbal) integer ierr integer*8 fsolver double precision floadbal call HYPRE_ParaSailsGetLoadbal(fsolver, floadbal, ierr) if(ierr .ne. 0) then print *, 'fhypre_parasailsgetloadbal error: ', ierr endif return end !------------------------------------------------------------------------- ! HYPRE_ParaSailsSetReuse !------------------------------------------------------------------------- subroutine fhypre_parasailssetreuse(fsolver, freuse) integer ierr integer freuse integer*8 fsolver call HYPRE_ParaSailsSetReuse(fsolver, freuse, ierr) if(ierr .ne. 0) then print *, 'fhypre_parasailssetreuse error: ', ierr endif return end !------------------------------------------------------------------------- ! HYPRE_ParaSailsGetReuse !------------------------------------------------------------------------- subroutine fhypre_parasailsgetreuse(fsolver, freuse) integer ierr integer freuse integer*8 fsolver call HYPRE_ParaSailsGetReuse(fsolver, freuse, ierr) if(ierr .ne. 0) then print *, 'fhypre_parasailsgetreuse error: ', ierr endif return end !------------------------------------------------------------------------- ! HYPRE_ParaSailsSetLogging !------------------------------------------------------------------------- subroutine fhypre_parasailssetlogging(fsolver, flog) integer ierr integer flog integer*8 fsolver call HYPRE_ParaSailsSetLogging(fsolver, flog, ierr) if(ierr .ne. 0) then print *, 'fhypre_parasailssetlogging error: ', ierr endif return end !------------------------------------------------------------------------- ! HYPRE_ParaSailsGetLogging !------------------------------------------------------------------------- subroutine fhypre_parasailsgetlogging(fsolver, flog) integer ierr integer flog integer*8 fsolver call HYPRE_ParaSailsGetLogging(fsolver, flog, ierr) if(ierr .ne. 0) then print *, 'fhypre_parasailsgetlogging error: ', ierr endif return end !------------------------------------------------------------------------- ! HYPRE_ParCSRPCGCreate !------------------------------------------------------------------------- subroutine fhypre_parcsrpcgcreate(fcomm, fsolver) integer ierr integer fcomm integer*8 fsolver call HYPRE_ParCSRPCGCreate(fcomm, fsolver, ierr) if(ierr .ne. 0) then print *, 'fhypre_parcsrpcgcreate error: ', ierr endif return end !------------------------------------------------------------------------- ! HYPRE_ParCSRPCGDestroy !------------------------------------------------------------------------- subroutine fhypre_parcsrpcgdestroy(fsolver) integer ierr integer*8 fsolver call HYPRE_ParCSRPCGDestroy(fsolver) if(ierr .ne. 0) then print *, 'fhypre_parcsrpcgdestroy error: ', ierr endif return end !------------------------------------------------------------------------- ! HYPRE_ParCSRPCGSetup !------------------------------------------------------------------------- subroutine fhypre_parcsrpcgsetup(fsolver, fA, fb, fx) integer ierr integer*8 fsolver integer*8 fA integer*8 fb integer*8 fx call HYPRE_ParCSRPCGSetup(fsolver, fA, fb, fx, ierr) if(ierr .ne. 0) then print *, 'fhypre_parcsrpcgcreate error: ', ierr endif return end !------------------------------------------------------------------------- ! HYPRE_ParCSRPCGSolve !------------------------------------------------------------------------- subroutine fhypre_parcsrpcgsolve(fsolver, fA, fb, fx) integer ierr integer*8 fsolver integer*8 fA integer*8 fb integer*8 fx call HYPRE_ParCSRPCGSolve(fsolver, fA, fb, fx, ierr) if(ierr .ne. 0) then print *, 'fhypre_parcsrpcgsolve error: ', ierr endif return end !------------------------------------------------------------------------- ! HYPRE_ParCSRPCGSetTol !------------------------------------------------------------------------- subroutine fhypre_parcsrpcgsettol(fsolver, ftol) integer ierr integer*8 fsolver double precision ftol call HYPRE_ParCSRPCGSetTol(fsolver, ftol, ierr) if(ierr .ne. 0) then print *, 'fhypre_parcsrpcgsettol error: ', ierr endif return end !------------------------------------------------------------------------- ! HYPRE_ParCSRPCGSetMaxIter !------------------------------------------------------------------------- subroutine fhypre_parcsrpcgsetmaxiter(fsolver, fmaxiter) integer ierr integer fmaxiter integer*8 fsolver call HYPRE_ParCSRPCGSetMaxIter(fsolver, fmaxiter, ierr) if(ierr .ne. 0) then print *, 'fhypre_parcsrpcgsetmaxiter error: ', ierr endif return end !------------------------------------------------------------------------- ! HYPRE_ParCSRPCGSetStopCrit !------------------------------------------------------------------------- subroutine fhypre_parcsrpcgsetstopcrit(fsolver, ftol) integer ierr integer*8 fsolver double precision ftol call HYPRE_ParCSRPCGSetStopCrit(fsolver, ftol, ierr) if(ierr .ne. 0) then print *, 'fhypre_parcsrpcgsetstopcrit error: ', ierr endif return end !------------------------------------------------------------------------- ! HYPRE_ParCSRPCGSetTwoNorm !------------------------------------------------------------------------- subroutine fhypre_parcsrpcgsettwonorm(fsolver, ftwonorm) integer ierr integer ftwonorm integer*8 fsolver call HYPRE_ParCSRPCGSetTwoNorm(fsolver, ftwonorm, ierr) if(ierr .ne. 0) then print *, 'fhypre_parcsrpcgsettwonorm error: ', ierr endif return end !------------------------------------------------------------------------- ! HYPRE_ParCSRPCGSetRelChange !------------------------------------------------------------------------- subroutine fhypre_parcsrpcgsetrelchange(fsolver, frelchange) integer ierr integer frelchange integer*8 fsolver call HYPRE_ParCSRPCGSetRelChange(fsolver, frelchange, ierr) if(ierr .ne. 0) then print *, 'fhypre_parcsrpcgsetrelchange error: ', ierr endif return end !------------------------------------------------------------------------- ! HYPRE_ParCSRPCGSetPrecond !------------------------------------------------------------------------- subroutine fhypre_parcsrpcgsetprecond(fsolver, fprecond_id, 1 fprecond) integer ierr integer fprecond_id integer*8 fsolver integer*8 fprecond call HYPRE_ParCSRPCGSetPrecond(fsolver, fprecond_id, fprecond, 1 ierr) if(ierr .ne. 0) then print *, 'fhypre_parcsrpcgsetprecond error: ', ierr endif return end !------------------------------------------------------------------------- ! HYPRE_ParCSRPCGGetPrecond !------------------------------------------------------------------------- subroutine fhypre_parcsrpcggetprecond(fsolver, fprecond) integer ierr integer*8 fsolver integer*8 fprecond call HYPRE_ParCSRPCGGetPrecond(fsolver, fprecond, ierr) if(ierr .ne. 0) then print *, 'fhypre_parcsrpcggetprecond error: ', ierr endif return end !------------------------------------------------------------------------- ! HYPRE_ParCSRPCGSetPrintLevel !------------------------------------------------------------------------- subroutine fhypre_parcsrpcgsetprintlevel(fsolver, flevel) integer ierr integer flevel integer*8 fsolver call HYPRE_ParCSRPCGSetPrintLevel(fsolver, flevel, ierr) if(ierr .ne. 0) then print *, 'fhypre_parcsrpcgsetprintlevel error: ', ierr endif return end !------------------------------------------------------------------------- ! HYPRE_ParCSRPCGGetNumIterations !------------------------------------------------------------------------- subroutine fhypre_parcsrpcggetnumiteration(fsolver, fnumiter) integer ierr integer fnumiter integer*8 fsolver call HYPRE_ParCSRPCGGetNumIterations(fsolver, fnumiter, ierr) if(ierr .ne. 0) then print *, 'fhypre_parcsrpcggetnumiteration error: ', ierr endif return end !------------------------------------------------------------------------- ! HYPRE_ParCSRPCGGetFinalRelativeResidualNorm !------------------------------------------------------------------------- subroutine fhypre_parcsrpcggetfinalrelativ(fsolver, fnorm) integer ierr integer*8 fsolver double precision fnorm call HYPRE_ParCSRPCGGetFinalRelative(fsolver, fnorm, ierr) if(ierr .ne. 0) then print *, 'fhypre_parcsrpcggetfinalrelative error: ', ierr endif return end !------------------------------------------------------------------------- ! HYPRE_ParCSRDiagScaleSetup !------------------------------------------------------------------------- subroutine fhypre_parcsrdiagscalesetup(fsolver, fA, fb, fx) integer ierr integer*8 fsolver integer*8 fA integer*8 fb integer*8 fx call HYPRE_ParCSRDiagScaleSetup(fsolver, fA, fb, fx, ierr) if(ierr .ne. 0) then print *, 'fhypre_parcsrdiagscalesetup error: ', ierr endif return end !------------------------------------------------------------------------- ! HYPRE_ParCSRDiagScale !------------------------------------------------------------------------- subroutine fhypre_parcsrdiagscale(fsolver, fHA, fHy, fHx) integer ierr integer*8 fsolver integer*8 fHA integer*8 fHy integer*8 fHx call HYPRE_ParCSRDiagScale(fsolver, fHA, fHy, fHx, ierr) if(ierr .ne. 0) then print *, 'fhypre_parcsrdiagscale error: ', ierr endif return end !------------------------------------------------------------------------- ! HYPRE_ParCSRPilutCreate !------------------------------------------------------------------------- subroutine fhypre_parcsrpilutcreate(fcomm, fsolver) integer ierr integer fcomm integer*8 fsolver call HYPRE_ParCSRPilutCreate(fcomm, fsolver, ierr) if(ierr .ne. 0) then print *, 'fhypre_parcsrpilutcreate error: ', ierr endif return end !------------------------------------------------------------------------- ! HYPRE_ParCSRPilutDestroy !------------------------------------------------------------------------- subroutine fhypre_parcsrpilutdestroy(fsolver) integer ierr integer*8 fsolver call HYPRE_ParCSRPilutDestroy(fsolver, ierr) if(ierr .ne. 0) then print *, 'fhypre_parcsrpilutdestroy error: ', ierr endif return end !------------------------------------------------------------------------- ! HYPRE_ParCSRPilutSetup !------------------------------------------------------------------------- subroutine fhypre_parcsrpilutsetup(fsolver, fA, fb, fx) integer ierr integer*8 fsolver integer*8 fA integer*8 fb integer*8 fx call HYPRE_ParCSRPilutSetup(fsolver, fA, fb, fx, ierr) if(ierr .ne. 0) then print *, 'fhypre_parcsrpilutsetup error: ', ierr endif return end !------------------------------------------------------------------------- ! HYPRE_ParCSRPilutSolve !------------------------------------------------------------------------- subroutine fhypre_parcsrpilutsolve(fsolver, fA, fb, fx) integer ierr integer*8 fsolver integer*8 fA integer*8 fb integer*8 fx call HYPRE_ParCSRPilutSolve(fsolver, fA, fb, fx, ierr) if(ierr .ne. 0) then print *, 'fhypre_parcsrpilutsolve error: ', ierr endif return end !------------------------------------------------------------------------- ! HYPRE_ParCSRPilutSetMaxIter !------------------------------------------------------------------------- subroutine fhypre_parcsrpilutsetmaxiter(fsolver, fmaxiter) integer ierr integer fmaxiter integer*8 fsolver call HYPRE_ParCSRPilutSetMaxIter(fsolver, fmaxiter, ierr) if(ierr .ne. 0) then print *, 'fhypre_parcsrpilutsetmaxiter error: ', ierr endif return end !------------------------------------------------------------------------- ! HYPRE_ParCSRPilutSetDropToleran !------------------------------------------------------------------------- subroutine fhypre_parcsrpilutsetdroptolera(fsolver, ftol) integer ierr integer*8 fsolver double precision ftol call HYPRE_ParCSRPilutSetDropToleran(fsolver, ftol, ierr) if(ierr .ne. 0) then print *, 'fhypre_parcsrpilutsetdroptol error: ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_ParCSRPilutSetFacRowSize !-------------------------------------------------------------------------- subroutine fhypre_parcsrpilutsetfacrowsize(fsolver, fsize) integer ierr integer fsize integer*8 fsolver call HYPRE_ParCSRPilutSetFacRowSize(fsolver, fsize, ierr) if(ierr .ne. 0) then print *, 'fhypre_parcsrpilutsetfacrowsize error: ', ierr endif return end !------------------------------------------------------------------------- ! HYPRE_SchwarzCreate !------------------------------------------------------------------------- subroutine fhypre_schwarzcreate(fsolver) integer ierr integer*8 fsolver call HYPRE_SchwarzCreate(fsolver, ierr) if(ierr .ne. 0) then print *, 'fhypre_schwarzcreate error: ', ierr endif return end !------------------------------------------------------------------------- ! HYPRE_SchwarzDestroy !------------------------------------------------------------------------- subroutine fhypre_schwarzdestroy(fsolver) integer ierr integer*8 fsolver call HYPRE_SchwarzDestroy(fsolver, ierr) if(ierr .ne. 0) then print *, 'fhypre_schwarzdestroy error: ', ierr endif return end !------------------------------------------------------------------------- ! HYPRE_SchwarzSetup !------------------------------------------------------------------------- subroutine fhypre_schwarzsetup(fsolver, fA, fb, fx) integer ierr integer*8 fsolver integer*8 fA integer*8 fb integer*8 fx call HYPRE_SchwarzSetup(fsolver, fA, fb, fx, ierr) if(ierr .ne. 0) then print *, 'fhypre_schwarzsetup error: ', ierr endif return end !------------------------------------------------------------------------- ! HYPRE_SchwarzSolve !------------------------------------------------------------------------- subroutine fhypre_schwarzsolve(fsolver, fA, fb, fx) integer ierr integer*8 fsolver integer*8 fA integer*8 fb integer*8 fx call HYPRE_SchwarzSolve(fsolver, fA, fb, fx, ierr) if(ierr .ne. 0) then print *, 'fhypre_schwarzsolve error: ', ierr endif return end !------------------------------------------------------------------------- ! HYPRE_SchwarzSetVariant !------------------------------------------------------------------------- subroutine fhypre_schwarzsetvariant(fsolver, fvariant) integer ierr integer fvariant integer*8 fsolver call HYPRE_SchwarzSetVariant(fsolver, fvariant, ierr) if(ierr .ne. 0) then print *, 'fhypre_schwarzsetvariant error: ', ierr endif return end !------------------------------------------------------------------------- ! HYPRE_SchwarzSetOverlap !------------------------------------------------------------------------- subroutine fhypre_schwarzsetoverlap(fsolver, foverlap) integer ierr integer foverlap integer*8 fsolver call HYPRE_SchwarzSetOverlap(fsolver, foverlap, ierr) if(ierr .ne. 0) then print *, 'fhypre_schwarzsetoverlap error: ', ierr endif return end !------------------------------------------------------------------------- ! HYPRE_SchwarzSetDomainType !------------------------------------------------------------------------- subroutine fhypre_schwarzsetdomaintype(fsolver, fdomaint) integer ierr integer fdomaint integer*8 fsolver call HYPRE_SchwarzSetDomainType(fsolver, fdomaint, ierr) if(ierr .ne. 0) then print *, 'fhypre_schwarzsetdomaintype error: ', ierr endif return end !------------------------------------------------------------------------- ! HYPRE_SchwarzSetDomainStructure !------------------------------------------------------------------------- subroutine fhypre_schwarzsetdomainstructur(fsolver, fdomains) integer ierr integer fdomains integer*8 fsolver call HYPRE_SchwarzSetDomainStructure(fsolver, fdomains, ierr) if(ierr .ne. 0) then print *, 'fhypre_schwarzsetdomainstructure error: ', ierr endif return end !------------------------------------------------------------------------- ! HYPRE_SchwarzSetNumFunctions !------------------------------------------------------------------------- subroutine fhypre_schwarzsetnumfunctions(fsolver, fnumfncs) integer ierr integer fnumfncs integer*8 fsolver call HYPRE_SchwarzSetNumFunctions(fsolver, fnumfncs, ierr) if(ierr .ne. 0) then print *, 'fhypre_schwarzsetnumfunctions error: ', ierr endif return end !------------------------------------------------------------------------- ! HYPRE_SchwarzSetRelaxWeight !------------------------------------------------------------------------- subroutine fhypre_schwarzsetrelaxweight(fsolver, frlxwt) integer ierr integer*8 fsolver double precision frlxwt call HYPRE_SchwarzSetRelaxWeight(fsolver, frlxwt, ierr) if(ierr .ne. 0) then print *, 'fhypre_schwarzsetrelaxweight error: ', ierr endif return end !------------------------------------------------------------------------- ! HYPRE_SchwarzSetDofFunc !------------------------------------------------------------------------- subroutine fhypre_schwarzsetdoffunc(fsolver, fdofnc) integer ierr integer fdofnc integer*8 fsolver call HYPRE_SchwarzSetDofFunc(fsolver, fdofnc, ierr) if(ierr .ne. 0) then print *, 'fhypre_schwarzsetdoffunc error: ', ierr endif return end hypre-2.33.0/src/test/fparcsr_mv.f000066400000000000000000000437211477326011500170220ustar00rootroot00000000000000! Copyright (c) 1998 Lawrence Livermore National Security, LLC and other ! HYPRE Project Developers. See the top-level COPYRIGHT file for details. ! ! SPDX-License-Identifier: (Apache-2.0 OR MIT) !***************************************************************************** ! Routines to test HYPRE_ParCSRMatrix Fortran interface !***************************************************************************** !-------------------------------------------------------------------------- ! fhypre_parcsrmatrixcreate !-------------------------------------------------------------------------- subroutine fhypre_parcsrmatrixcreate(fcomm, fglobal_num_rows, 1 fglobal_num_cols, 1 frow_starts, fcol_starts, 3 fnum_cols_offd, 2 fnum_nonzeros_diag, 5 fnum_nonzeros_offd, fmatrix) integer ierr integer fcomm integer fglobal_num_rows integer fglobal_num_cols integer frow_starts integer fcol_starts integer fnum_cols_offd integer fnum_nonzeros_diag integer fnum_nonzeros_offd integer*8 fmatrix call HYPRE_ParCSRMatrixCreate(fcomm, fglobal_num_rows, 1 fglobal_num_cols, frow_starts, 2 fcol_starts, fnum_cols_offd, 3 fnum_nonzeros_diag, 4 fnum_nonzeros_offd, fmatrix, ierr) if (ierr .ne. 0) then print *, 'fhypre_parcsrmatrixcreate: error = ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_ParCSRMatrixDestroy !-------------------------------------------------------------------------- subroutine fhypre_parcsrmatrixdestroy (fmatrix) integer ierr integer*8 fmatrix call HYPRE_ParCSRMatrixDestroy(fmatrix, ierr) if (ierr .ne. 0) then print *, 'fhypre_parcsrmatrixdestroy: error = ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_ParCSRMatrixInitialize !-------------------------------------------------------------------------- subroutine fhypre_parcsrmatrixinitialize (fmatrix) integer ierr integer*8 fmatrix call HYPRE_ParCSRMatrixInitialize(fmatrix, ierr) if (ierr .ne. 0) then print *, 'fhypre_parcsrmatrixinitialize: error = ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_ParCSRMatrixRead !-------------------------------------------------------------------------- subroutine fhypre_parcsrmatrixread (fcomm, ffile_name, fmatrix) integer fcomm character*(*) ffile_name integer*8 fmatrix integer ierr call HYPRE_ParCSRMatrixRead(fcomm, ffile_name, fmatrix, ierr) if (ierr .ne. 0) then print *, 'fhypre_parcsrmatrixread: error = ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_ParCSRMatrixPrint !-------------------------------------------------------------------------- subroutine fhypre_parcsrmatrixprint (fmatrix, fname) integer ierr integer*8 fmatrix character*(*) fname call HYPRE_ParCSRMatrixPrint(fmatrix, fname, ierr) if (ierr .ne. 0) then print *, 'fhypre_parcsrmatrixprint: error = ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_ParCSRMatrixGetComm !-------------------------------------------------------------------------- subroutine fhypre_parcsrmatrixgetcomm (fmatrix, fcomm) integer ierr integer fcomm integer*8 fmatrix call HYPRE_ParCSRMatrixGetComm(fmatrix, fcomm) if (ierr .ne. 0) then print *, 'fhypre_parcsrmatrixgetcomm: error = ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_ParCSRMatrixGetDims !-------------------------------------------------------------------------- subroutine fhypre_parcsrmatrixgetdims (fmatrix, fM, fN) integer ierr integer fM integer fN integer*8 fmatrix call HYPRE_ParCSRMatrixGetDims(fmatrix, fM, fN, ierr) if (ierr .ne. 0) then print *, 'fhypre_parcsrmatrixgetdims: error = ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_ParCSRMatrixGetRowPartitioning !-------------------------------------------------------------------------- subroutine fhypre_parcsrmatrixgetrowpartit (fmatrix, frow_ptr) integer ierr integer*8 fmatrix integer*8 frow_ptr call HYPRE_ParCSRMatrixGetRowPartiti(fmatrix, frow_ptr, 1 ierr) if (ierr .ne. 0) then print *, 'fhypre_parcsrmatrixgetrowpartitioning: error = ', 1 ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_ParCSRMatrixGetColPartitioning !-------------------------------------------------------------------------- subroutine fhypre_parcsrmatrixgetcolpartit (fmatrix, fcol_ptr) integer ierr integer*8 fmatrix integer*8 fcol_ptr call HYPRE_ParCSRMatrixGetColPartiti(fmatrix, fcol_ptr, 1 ierr) if (ierr .ne. 0) then print *, 'fhypre_parcsrmatrixgetcolpartitioning: error = ', 1 ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_ParCSRMatrixGetLocalRange !-------------------------------------------------------------------------- subroutine fhypre_parcsrmatrixgetlocalrange (fmatrix, frow_start, 1 frow_end, fcol_start, 2 fcol_end) integer ierr integer frow_start integer frow_end integer fcol_start integer fcol_end integer*8 fmatrix call HYPRE_ParCSRMatrixGetLocalRange(fmatrix, frow_start, 1 frow_end, fcol_start, 2 fcol_end, ierr) if (ierr .ne. 0) then print *, 'fhypre_parcsrmatrixgetlocalrange: error = ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_ParCSRMatrixGetRow !-------------------------------------------------------------------------- subroutine fhypre_parcsrmatrixgetrow (fmatrix, frow, fsize, 1 fcolptr, fvalptr) integer ierr integer frow integer fsize integer*8 fcolptr integer*8 fvalptr integer*8 fmatrix call HYPRE_ParCSRMatrixGetRow(fmatrix, frow, fsize, fcolptr, 1 fvalptr, ierr) if (ierr .ne. 0) then print *, 'fhypre_parcsrmatrixgetrow: error = ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_ParCSRMatrixRestoreRow !-------------------------------------------------------------------------- subroutine fhypre_parcsrmatrixrestorerow (fmatrix, frow, fsize, 1 fcolptr, fvalptr) integer ierr integer frow integer fsize integer*8 fcolptr integer*8 fvalptr integer*8 fmatrix call HYPRE_ParCSRMatrixRestoreRow(fmatrix, frow, fsize, fcolptr, 1 fvalptr, ierr) if (ierr .ne. 0) then print *, 'fhypre_parcsrmatrixrestorerow: error = ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_CSRMatrixtoParCSRMatrix !-------------------------------------------------------------------------- subroutine fhypre_csrmatrixtoparcsrmatrix (fcomm, fA_CSR, 1 frow_part, fcol_part, 2 fmatrix) integer ierr integer fcomm integer frow_part integer fcol_part integer*8 fA_CSR integer*8 fmatrix call HYPRE_CSRMatriXToParCSRMatrix(fcomm, fA_CSR, frow_part, 1 fcol_part, fmatrix, ierr) if (ierr .ne. 0) then print *, 'fhypre_csrmatrixtoparcsrmatrix: error = ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_ParCSRMatrixMatvec !-------------------------------------------------------------------------- subroutine fhypre_parcsrmatrixmatvec (falpha, fA, fx, fbeta, fy) integer ierr double precision falpha double precision fbeta integer*8 fA integer*8 fx integer*8 fy call HYPRE_ParCSRMatrixMatvec(falpha, fA, fx, fbeta, fy, ierr) if (ierr .ne. 0) then print *, 'fhypre_parcsrmatrixmatvec: error = ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_ParCSRMatrixMatvecT !-------------------------------------------------------------------------- subroutine fhypre_parcsrmatrixmatvect (falpha, fA, fx, fbeta, fy) integer ierr double precision falpha double precision fbeta integer*8 fA integer*8 fx integer*8 fy call HYPRE_ParCSRMatrixMatvecT(falpha, fA, fx, fbeta, fy, ierr) if (ierr .ne. 0) then print *, 'fhypre_parcsrmatrixmatvect: error = ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_ParVectorCreate !-------------------------------------------------------------------------- subroutine fhypre_parvectorcreate(fcomm, fsize, fpartion, fvector) integer ierr integer fcomm integer fsize integer*8 fvector integer*8 fpartion call HYPRE_ParVectorCreate(fcomm, fsize, fpartion, fvector, ierr) if (ierr .ne. 0) then print *, 'fhypre_parvectorcreate: error = ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_ParMultiVectorCreate !-------------------------------------------------------------------------- subroutine fhypre_parmultivectorcreate(fcomm, fsize, fpartion, 1 fnumvecs, fvector) integer ierr integer fcomm integer fsize integer fnumvecs integer*8 fvector integer*8 fpartion call HYPRE_ParMultiVectorCreate(fcomm, fsize, fpartion, fnumvecs, 1 fvector, ierr) if (ierr .ne. 0) then print *, 'fhypre_parmultivectorcreate: error = ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_ParVectorDestroy !-------------------------------------------------------------------------- subroutine fhypre_parvectordestroy (fvector) integer ierr integer*8 fvector call HYPRE_ParVectorDestroy(fvector, ierr) if (ierr .ne. 0) then print *, 'fhypre_parvectordestroy: error = ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_ParVectorInitialize !-------------------------------------------------------------------------- subroutine fhypre_parvectorinitialize (fvector) integer ierr integer*8 fvector call HYPRE_ParVectorInitialize(fvector, ierr) if (ierr .ne. 0) then print *, 'fhypre_parvectorinitialize: error = ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_ParVectorRead !-------------------------------------------------------------------------- subroutine fhypre_parvectorread (fcomm, fvector, fname) integer ierr integer fcomm character*(*) fname integer*8 fvector call HYPRE_ParVectorRead(fcomm, fname, fvector, ierr) if (ierr .ne. 0) then print *, 'fhypre_parvectorread: error = ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_ParVectorPrint !-------------------------------------------------------------------------- subroutine fhypre_parvectorprint (fvector, fname, fsize) integer ierr integer fsize character*(*) fname integer*8 fvector call HYPRE_ParVectorPrint (fvector, fname, ierr) if (ierr .ne. 0) then print *, 'fhypre_parvectorprint: error = ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_ParVectorSetConstantValues !-------------------------------------------------------------------------- subroutine fhypre_parvectorsetconstantvalue (fvector, fvalue) integer ierr double precision fvalue integer*8 fvector call HYPRE_ParVectorSetConstantValue (fvector, fvalue, ierr) if (ierr .ne. 0) then print *, 'fhypre_parvectorconstantvalues: error = ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_ParVectorSetRandomValues !-------------------------------------------------------------------------- subroutine fhypre_parvectorsetrandomvalues (fvector, fseed) integer ierr integer fseed integer*8 fvector call HYPRE_ParVectorSetRandomValues (fvector, fvalue, ierr) if (ierr .ne. 0) then print *, 'fhypre_parvectorrandomvalues: error = ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_ParVectorCopy !-------------------------------------------------------------------------- subroutine fhypre_parvectorcopy (fx, fy) integer ierr integer*8 fx integer*8 fy call HYPRE_ParVectorCopy (fx, fy, ierr) if (ierr .ne. 0) then print *, 'fhypre_parvectorcopy: error = ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_ParVectorCloneShallow !-------------------------------------------------------------------------- subroutine fhypre_parvectorcloneshallow (fx) integer ierr integer*8 fx call HYPRE_ParVectorCloneShallow (fx, ierr) if (ierr .ne. 0) then print *, 'fhypre_parvectorcloneshallow: error = ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_ParVectorScale !-------------------------------------------------------------------------- subroutine fhypre_parvectorscale (fvalue, fx) integer ierr double precision fvalue integer*8 fx call HYPRE_ParVectorScale (fvalue, fx, ierr) if (ierr .ne. 0) then print *, 'fhypre_parvectorscale: error = ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_ParVectorAxpy !-------------------------------------------------------------------------- subroutine fhypre_parvectoraxpy (fvalue, fx, fy) integer ierr double precision fvalue integer*8 fx integer*8 fy call HYPRE_ParVectorAxpy (fvalue, fx, fy, ierr) if (ierr .ne. 0) then print *, 'fhypre_parvectoraxpy: error = ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_ParVectorInnerProd !-------------------------------------------------------------------------- subroutine fhypre_parvectorinnerprod (fx, fy, fprod) integer ierr double precision fprod integer*8 fx integer*8 fy call HYPRE_ParVectorInnerProd (fx, fy, fprod, ierr) if (ierr .ne. 0) then print *, 'fhypre_parvectorinnerprod: error = ', ierr endif return end !-------------------------------------------------------------------------- ! hypre_ParCSRMatrixGlobalNumRows !-------------------------------------------------------------------------- subroutine fhypre_parcsrmatrixglobalnumrow (fmatrix, fnrows) integer ierr integer fnrows integer*8 fmatrix call hypre_ParCSRMatrixGlobalNumRows (fmatrix, fnrows, ierr) if (ierr .ne. 0) then print *, 'fhypre_parcsrmatrixglobalnumrows: error = ', ierr endif return end !-------------------------------------------------------------------------- ! hypre_ParCSRMatrixRowStarts !-------------------------------------------------------------------------- subroutine fhypre_parcsrmatrixrowstarts (fmatrix, frows) integer ierr integer*8 frows integer*8 fmatrix call hypre_ParCSRMatrixRowStarts (fmatrix, frows, ierr) if (ierr .ne. 0) then print *, 'fhypre_parcsrmatrixrowstarts: error = ', ierr endif return end !-------------------------------------------------------------------------- ! hypre_ParVectorSetDataOwner !-------------------------------------------------------------------------- subroutine fhypre_parvectorsetdataowner (fv, fown) integer ierr integer fown integer*8 fv call hypre_SetParVectorDataOwner (fv, fown, ierr) if (ierr .ne. 0) then print *, 'fhypre_parvectorsetdataowner: error = ', ierr endif return end hypre-2.33.0/src/test/fsstruct_ls.f000066400000000000000000002006261477326011500172320ustar00rootroot00000000000000! Copyright (c) 1998 Lawrence Livermore National Security, LLC and other ! HYPRE Project Developers. See the top-level COPYRIGHT file for details. ! ! SPDX-License-Identifier: (Apache-2.0 OR MIT) !**************************************************************************** ! HYPRE_SStruct_ls fortran interface routines !**************************************************************************** !**************************************************************************** ! HYPRE_SStructBiCGSTAB routines !**************************************************************************** !-------------------------------------------------------------------------- ! HYPRE_SStructBiCGSTABCreate !-------------------------------------------------------------------------- subroutine fhypre_sstructbicgstabcreate(fcomm, fsolver) integer ierr integer*8 fcomm integer*8 fsolver call HYPRE_SStructBiCGSTABCreate(fcomm, fsolver, ierr) if(ierr .ne. 0) then print *, 'fhypre_sstructbicgstabcreate error = ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_SStructBiCGSTABDestroy !-------------------------------------------------------------------------- subroutine fhypre_sstructbicgstabdestroy(fsolver) integer ierr integer*8 fsolver call HYPRE_SStructBiCGSTABDestroy(fsolver, ierr) if(ierr .ne. 0) then print *, 'fhypre_sstructbicgstabdestroy error = ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_SStructBiCGSTABSetup !-------------------------------------------------------------------------- subroutine fhypre_sstructbicgstabsetup(fsolver, fA, fb, fx) integer ierr integer*8 fsolver integer*8 fA integer*8 fb integer*8 fx call HYPRE_SStructBiCGSTABSetup(fsolver, fA, fb, fx, ierr) if(ierr .ne. 0) then print *, 'fhypre_sstructbicgstabsetup error = ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_SStructBiCGSTABSolve !-------------------------------------------------------------------------- subroutine fhypre_sstructbicgstabsolve(fsolver, fA, fb, fx) integer ierr integer*8 fsolver integer*8 fA integer*8 fb integer*8 fx call HYPRE_SStructBiCGSTABSolve(fsolver, fA, fb, fx, ierr) if(ierr .ne. 0) then print *, 'fhypre_sstructbicgstabsolve error = ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_SStructBiCGSTABSetTol !-------------------------------------------------------------------------- subroutine fhypre_sstructbicgstabsettol(fsolver, ftol) integer ierr integer*8 fsolver double precision ftol call HYPRE_SStructBiCGSTABSetTol(fsolver, ftol, ierr) if(ierr .ne. 0) then print *, 'fhypre_sstructbicgstabsettol error = ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_SStructBiCGSTABSetMinIter !-------------------------------------------------------------------------- subroutine fhypre_sstructbicgstabsetminite(fsolver, fmin_iter) integer ierr integer fmin_iter integer*8 fsolver call HYPRE_SStructBiCGSTABSetMinIter(fsolver, fmin_iter, ierr) if(ierr .ne. 0) then print *, 'fhypre_sstructbicgstabsetminiter error = ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_SStructBiCGSTABSetMaxIter !-------------------------------------------------------------------------- subroutine fhypre_sstructbicgstabsetmaxite(fsolver, fmax_iter) integer ierr integer fmax_iter integer*8 fsolver call HYPRE_SStructBiCGSTABSetMaxIter(fsolver, fmax_iter, ierr) if(ierr .ne. 0) then print *, 'fhypre_sstructbicgstabsetmaxiter error = ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_SStructBiCGSTABSetStopCrit !-------------------------------------------------------------------------- subroutine fhypre_sstructbicgstabsetstopcr(fsolver, fstop_crit) integer ierr integer fstop_crit integer*8 fsolver call HYPRE_SStructBiCGSTABSetStopCri(fsolver, fstop_crit, ierr) if(ierr .ne. 0) then print *, 'fhypre_sstructbicgstabsetstopcrit error = ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_SStructBiCGSTABSetPrecond !-------------------------------------------------------------------------- subroutine fhypre_sstructbicgstabsetprecon(fsolver, fprecond_id, 1 fprecond) integer ierr integer fprecond_id integer*8 fsolver integer*8 fprecond call HYPRE_SStructBiCGSTABSetPrecond(fsolver, fprecond_id, 1 fprecond, ierr) if(ierr .ne. 0) then print *, 'fhypre_sstructbicgstabsetprecond error = ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_SStructBiCGSTABSetLogging !-------------------------------------------------------------------------- subroutine fhypre_sstructbicgstabsetloggin(fsolver, flog) integer ierr integer flog integer*8 fsolver call HYPRE_SStructBiCGSTABSetLogging(fsolver, flog, ierr) if(ierr .ne. 0) then print *, 'fhypre_sstructbicgstabsetlogging error = ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_SStructBiCGSTABSetPrintLevel !-------------------------------------------------------------------------- subroutine fhypre_sstructbicgstabsetprintl(fsolver, fprint) integer ierr integer fprint integer*8 fsolver call HYPRE_SStructBiCGSTABSetPrintLe(fsolver, fprint, ierr) if(ierr .ne. 0) then print *, 'fhypre_sstructbicgstabsetprintlevel error = ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_SStructBiCGSTABGetNumIterations !-------------------------------------------------------------------------- subroutine fhypre_sstructbicgstabgetnumite(fsolver, fnumiter) integer ierr integer fnumiter integer*8 fsolver call HYPRE_SStructBiCGSTABGetNumIter(fsolver, fnumiter, 1 ierr) if(ierr .ne. 0) then print *, 'fhypre_sstructbicgstabgetnumiterations error = ', 1 ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_SStructBiCGSTABGetFinalRelativeResidualNorm !-------------------------------------------------------------------------- subroutine fhypre_sstructbicgstabgetfinalr(fsolver, fnorm) integer ierr integer*8 fsolver double precision fnorm call HYPRE_SStructBiCGSTABGetFinalRe(fsolver, fnorm, ierr) if(ierr .ne. 0) then print *, 'fhypre_sstructbicgstabgetfinalrelative error = ', 1 ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_SStructBiCGSTABGetResidual !-------------------------------------------------------------------------- subroutine fhypre_sstructbicgstabgetresidu(fsolver, fresidual) integer ierr integer*8 fsolver integer*8 fresidual call HYPRE_SStructBiCGSTABGetResidua(fsolver, fresidual, ierr) if(ierr .ne. 0) then print *, 'fhypre_sstructbicgstabgetresidual error = ', ierr endif return end !**************************************************************************** ! HYPRE_SStructGMRES routines !**************************************************************************** !-------------------------------------------------------------------------- ! HYPRE_SStructGMRESCreate !-------------------------------------------------------------------------- subroutine fhypre_sstructgmrescreate(fcomm, fsolver) integer ierr integer*8 fcomm integer*8 fsolver call HYPRE_SStructGMRESCreate(fcomm, fsolver, ierr) if(ierr .ne. 0) then print *, 'fhypre_sstructgmrescreate error = ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_SStructGMRESDestroy !-------------------------------------------------------------------------- subroutine fhypre_sstructgmresdestroy(fsolver) integer ierr integer*8 fsolver call HYPRE_SStructGMRESDestroy(fsolver, ierr) if(ierr .ne. 0) then print *, 'fhypre_sstructgmresdestroy error = ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_SStructGMRESSetup !-------------------------------------------------------------------------- subroutine fhypre_sstructgmressetup(fsolver, fA, fb, fx) integer ierr integer*8 fsolver integer*8 fA integer*8 fb integer*8 fx call HYPRE_SStructGMRESSetup(fsolver, fA, fb, fx, ierr) if(ierr .ne. 0) then print *, 'fhypre_sstructgmressetup error = ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_SStructGMRESSolve !-------------------------------------------------------------------------- subroutine fhypre_sstructgmressolve(fsolver, fA, fb, fx) integer ierr integer*8 fsolver integer*8 fA integer*8 fb integer*8 fx call HYPRE_SStructGMRESSolve(fsolver, fA, fb, fx, ierr) if(ierr .ne. 0) then print *, 'fhypre_sstructgmressolve error = ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_SStructGMRESSetKDim !-------------------------------------------------------------------------- subroutine fhypre_sstructgmressetkdim(fsolver, fkdim) integer ierr integer fkdim integer*8 fsolver call HYPRE_SStructGMRESSetKDim(fsolver, fkdim, ierr) if(ierr .ne. 0) then print *, 'fhypre_sstructgmressetkdim error = ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_SStructGMRESSetTol !-------------------------------------------------------------------------- subroutine fhypre_sstructgmressettol(fsolver, ftol) integer ierr integer*8 fsolver double precision ftol call HYPRE_SStructGMRESSetTol(fsolver, ftol, ierr) if(ierr .ne. 0) then print *, 'fhypre_sstructgmressettol error = ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_SStructGMRESSetMinIter !-------------------------------------------------------------------------- subroutine fhypre_sstructgmressetminiter(fsolver, fmin_iter) integer ierr integer fmin_iter integer*8 fsolver call HYPRE_SStructGMRESSetMinIter(fsolver, fmin_iter, ierr) if(ierr .ne. 0) then print *, 'fhypre_sstructgmressetminiter error = ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_SStructGMRESSetMaxIter !-------------------------------------------------------------------------- subroutine fhypre_sstructgmressetmaxiter(fsolver, fmax_iter) integer ierr integer fmax_iter integer*8 fsolver call HYPRE_SStructGMRESSetMaxIter(fsolver, fmax_iter, ierr) if(ierr .ne. 0) then print *, 'fhypre_sstructgmressetmaxiter error = ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_SStructGMRESSetStopCrit !-------------------------------------------------------------------------- subroutine fhypre_sstructgmressetstopcrit(fsolver, fstop_crit) integer ierr integer fstop_crit integer*8 fsolver call HYPRE_SStructGMRESSetStopCrit(fsolver, fstop_crit, ierr) if(ierr .ne. 0) then print *, 'fhypre_sstructgmressetstopcrit error = ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_SStructGMRESSetPrecond !-------------------------------------------------------------------------- subroutine fhypre_sstructgmressetprecond(fsolver, fprecond_id, 1 fprecond) integer ierr integer fprecond_id integer*8 fsolver integer*8 fprecond call HYPRE_SStructGMRESSetPrecond(fsolver, fprecond_id, fprecond, 1 ierr) if(ierr .ne. 0) then print *, 'fhypre_sstructgmressetprecond error = ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_SStructGMRESSetLogging !-------------------------------------------------------------------------- subroutine fhypre_sstructgmressetlogging(fsolver, flog) integer ierr integer flog integer*8 fsolver call HYPRE_SStructGMRESSetLogging(fsolver, flog, ierr) if(ierr .ne. 0) then print *, 'fhypre_sstructgmressetlogging error = ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_SStructGMRESSetPrintLevel !-------------------------------------------------------------------------- subroutine fhypre_sstructgmressetprintleve(fsolver, flevel) integer ierr integer flevel integer*8 fsolver call HYPRE_SStructGMRESSetPrintLevel(fsolver, flevel, ierr) if(ierr .ne. 0) then print *, 'fhypre_sstructgmressetprintlevel error = ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_SStructGMRESGetNumIterations !-------------------------------------------------------------------------- subroutine fhypre_sstructgmresgetnumiterat(fsolver, fnumiter) integer ierr integer fnumiter integer*8 fsolver call HYPRE_SStructGMRESGetNumIterati(fsolver, fnumiter, ierr) if(ierr .ne. 0) then print *, 'fhypre_sstructgmresgetnumiteration error = ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_SStructGMRESGetFinalRelativeResidualNorm !-------------------------------------------------------------------------- subroutine fhypre_sstructgmresgetfinalrela(fsolver, fnorm) integer ierr integer*8 fsolver double precision fnorm call HYPRE_SStructGMRESGetFinalRelat(fsolver, fnorm, ierr) if(ierr .ne. 0) then print *, 'fhypre_sstructgmresgetfinalrelative error = ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_SStructGMRESGetResidual !-------------------------------------------------------------------------- subroutine fhypre_sstructgmresgetresidual(fsolver, fresidual) integer ierr integer*8 fsolver integer*8 fresidual call HYPRE_SStructGMRESGetResidual(fsolver, fresidual, ierr) if(ierr .ne. 0) then print *, 'fhypre_sstructgmresgetresidual error = ', ierr endif return end !**************************************************************************** ! HYPRE_SStructInterpreter routines !**************************************************************************** !-------------------------------------------------------------------------- ! HYPRE_SStructPVectorSetRandomValues !-------------------------------------------------------------------------- subroutine fhypre_sstructpvectorsetrandomv(fsolver, fseed) integer ierr integer*8 fsolver integer*8 fseed call HYPRE_SStructPVectorSetRandomVa(fsolver, fseed, ierr) if(ierr .ne. 0) then print *, 'fhypre_sstructpvectorsetrandomvalues error = ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_SStructVectorSetRandomValues !-------------------------------------------------------------------------- subroutine fhypre_sstructvectorsetrandomva(fsolver, fseed) integer ierr integer*8 fsolver integer*8 fseed call HYPRE_SStructVectorSetRandomVal(fsolver, fseed, ierr) if(ierr .ne. 0) then print *, 'fhypre_sstructvectorsetrandomvalues error = ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_SStructSetRandomValues !-------------------------------------------------------------------------- subroutine fhypre_sstructsetrandomvalues(fsolver, fseed) integer ierr integer*8 fsolver integer*8 fseed call HYPRE_SStructSetRandomValues(fsolver, fseed, ierr) if(ierr .ne. 0) then print *, 'fhypre_sstructsetrandomvalues error = ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_SStructSetupInterpreter !-------------------------------------------------------------------------- subroutine fhypre_sstructsetupinterpreter(fsolver) integer ierr integer*8 fsolver call HYPRE_SStructSetupInterpreter(fsolver, ierr) if(ierr .ne. 0) then print *, 'fhypre_sstructsetupinterpreter error = ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_SStructSetupMatvec !-------------------------------------------------------------------------- subroutine fhypre_sstructsetupmatvec(fsolver) integer ierr integer*8 fsolver call HYPRE_SStructSetupMatvec(fsolver, ierr) if(ierr .ne. 0) then print *, 'fhypre_sstructsetupmatvec error = ', ierr endif return end !**************************************************************************** ! HYPRE_SStructFAC routines !**************************************************************************** !-------------------------------------------------------------------------- ! HYPRE_SStructFACCreate !-------------------------------------------------------------------------- subroutine fhypre_sstructfaccreate(fcomm, fsolver) integer ierr integer*8 fcomm integer*8 fsolver call HYPRE_SStructFACCreate(fcomm, fsolver, ierr) if(ierr .ne. 0) then print *, 'fhypre_sstructfaccreate error = ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_SStructFACDestroy2 !-------------------------------------------------------------------------- subroutine fhypre_sstructfacdestroy2(fsolver) integer ierr integer*8 fsolver call HYPRE_SStructFACDestroy2(fsolver, ierr) if(ierr .ne. 0) then print *, 'fhypre_sstructfacdestroy2 error = ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_SStructFACSetup2 !-------------------------------------------------------------------------- subroutine fhypre_sstructfacsetup2(fsolver, fA, fb, fx) integer ierr integer*8 fsolver integer*8 fA integer*8 fb integer*8 fx call HYPRE_SStructFACSetup2(fsolver, fA, fb, fx, ierr) if(ierr .ne. 0) then print *, 'fhypre_sstructfacsetup2 error = ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_SStructFACSolve3 !-------------------------------------------------------------------------- subroutine fhypre_sstructfacsolve3(fsolver, fA, fb, fx) integer ierr integer*8 fsolver integer*8 fA integer*8 fb integer*8 fx call HYPRE_SStructFACSolve3(fsolver, fA, fb, fx, ierr) if(ierr .ne. 0) then print *, 'fhypre_sstructfacsolve3 error = ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_SStructFACSetTol !-------------------------------------------------------------------------- subroutine fhypre_sstructfacsettol(fsolver, ftol) integer ierr integer*8 fsolver integer*8 ftol call HYPRE_SStructFACSetTol(fsolver, ftol, ierr) if(ierr .ne. 0) then print *, 'fhypre_sstructfacsettol error = ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_SStructFACSetPLevels !-------------------------------------------------------------------------- subroutine fhypre_sstructfacsetplevels(fsolver, fnparts, fplevels) integer ierr integer*8 fsolver integer*8 fnparts integer*8 fplevels call HYPRE_SStructFACSetPLevels(fsolver, fnparts, fplevels, ierr) if(ierr .ne. 0) then print *, 'fhypre_sstructfacsetplevels error = ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_SStructFACSetPRefinements !-------------------------------------------------------------------------- subroutine fhypre_sstructfacsetprefinement(fsolver, fnparts, 1 frfactors) integer ierr integer*8 fsolver integer*8 fnparts integer*8 frfactors(3) call HYPRE_SStructFACSetPRefinements(fsolver, fnparts, frfactors, 1 ierr) if(ierr .ne. 0) then print *, 'fhypre_sstructfacsetprefinements error = ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_SStructFACSetMaxLevels !-------------------------------------------------------------------------- subroutine fhypre_sstructfacsetmaxlevels(fsolver, fmaxlevels) integer ierr integer*8 fsolver integer*8 fmaxlevels call HYPRE_SStructFACSetMaxLevels(fsolver, fmaxlevels, ierr) if(ierr .ne. 0) then print *, 'fhypre_sstructfacsetmaxlevels error = ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_SStructFACSetMaxIter !-------------------------------------------------------------------------- subroutine fhypre_sstructfacsetmaxiter(fsolver, fmaxiter) integer ierr integer*8 fsolver integer*8 fmaxiter call HYPRE_SStructFACSetMaxIter(fsolver, fmaxiter, ierr) if(ierr .ne. 0) then print *, 'fhypre_sstructfacsetmaxiter error = ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_SStructFACSetRelChange !-------------------------------------------------------------------------- subroutine fhypre_sstructfacsetrelchange(fsolver, frelchange) integer ierr integer*8 fsolver integer*8 frelchange call HYPRE_SStructFACSetRelChange(fsolver, frelchange, ierr) if(ierr .ne. 0) then print *, 'fhypre_sstructfacsetrelchange error = ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_SStructFACSetZeroGuess !-------------------------------------------------------------------------- subroutine fhypre_sstructfacsetzeroguess(fsolver) integer ierr integer*8 fsolver call HYPRE_SStructFACSetZeroGuess(fsolver, ierr) if(ierr .ne. 0) then print *, 'fhypre_sstructfacsetzeroguess error = ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_SStructFACSetNonZeroGuess !-------------------------------------------------------------------------- subroutine fhypre_sstructfacsetnonzerogues(fsolver) integer ierr integer*8 fsolver call HYPRE_SStructFACSetNonZeroGuess(fsolver, ierr) if(ierr .ne. 0) then print *, 'fhypre_sstructfacsetnonzeroguess error = ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_SStructFACSetRelaxType !-------------------------------------------------------------------------- subroutine fhypre_sstructfacsetrelaxtype(fsolver, frelaxtype) integer ierr integer*8 fsolver integer*8 frelaxtype call HYPRE_SStructFACSetRelaxType(fsolver, frelaxtype, ierr) if(ierr .ne. 0) then print *, 'fhypre_sstructfacsetrelaxtype error = ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_SStructFACSetNumPreRelax !-------------------------------------------------------------------------- subroutine fhypre_sstructfacsetnumprerelax(fsolver, fnumprerelax) integer ierr integer*8 fsolver integer*8 fnumprerelax call HYPRE_SStructFACSetNumPreRelax(fsolver, fnumprerelax, ierr) if(ierr .ne. 0) then print *, 'fhypre_sstructfacsetnumprerelax error = ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_SStructFACSetNumPostRelax !-------------------------------------------------------------------------- subroutine fhypre_sstructfacsetnumpostrela(fsolver, 1 fnumpostrelax) integer ierr integer*8 fsolver integer*8 fnumpostrelax call HYPRE_SStructFACSetNumPostRelax(fsolver, fnumpostrelax, ierr) if(ierr .ne. 0) then print *, 'fhypre_sstructfacsetnumpostrelax error = ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_SStructFACSetCoarseSolverType !-------------------------------------------------------------------------- subroutine fhypre_sstructfacsetcoarsesolve(fsolver, 1 fcsolvertype) integer ierr integer*8 fsolver integer*8 fcsolvertype call HYPRE_SStructFACSetCoarseSolver(fsolver, fcsolvertype, 1 ierr) if(ierr .ne. 0) then print *, 'fhypre_sstructfacsetcoarsesolvertype error = ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_SStructFACSetLogging !-------------------------------------------------------------------------- subroutine fhypre_sstructfacsetlogging(fsolver, flog) integer ierr integer flog integer*8 fsolver call HYPRE_SStructFACSetLogging(fsolver, flog, ierr) if(ierr .ne. 0) then print *, 'fhypre_sstructfacsetlogging error = ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_SStructFACGetNumIterations !-------------------------------------------------------------------------- subroutine fhypre_sstructfacgetnumiteratio(fsolver, fnumiter) integer ierr integer fnumiter integer*8 fsolver call HYPRE_SStructFACGetNumIteration(fsolver, fnumiter, ierr) if(ierr .ne. 0) then print *, 'fhypre_sstructfacgetnumiteration error = ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_SStructFACGetFinalRelativeResidualNorm !-------------------------------------------------------------------------- subroutine fhypre_sstructfacgetfinalrelati(fsolver, fnorm) integer ierr integer*8 fsolver double precision fnorm call HYPRE_SStructFACGetFinalRelativ(fsolver, fnorm, ierr) if(ierr .ne. 0) then print *, 'fhypre_sstructfacgetfinalrelative error = ', ierr endif return end !**************************************************************************** ! HYPRE_SStructPCG routines !**************************************************************************** !-------------------------------------------------------------------------- ! HYPRE_SStructPCGCreate !-------------------------------------------------------------------------- subroutine fhypre_sstructpcgcreate(fcomm, fsolver) integer ierr integer*8 fcomm integer*8 fsolver call HYPRE_SStructPCGCreate(fcomm, fsolver, ierr) if(ierr .ne. 0) then print *, 'fhypre_sstructpcgcreate error = ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_SStructPCGDestroy !-------------------------------------------------------------------------- subroutine fhypre_sstructpcgdestroy(fsolver) integer ierr integer*8 fsolver call HYPRE_SStructPCGDestroy(fsolver, ierr) if(ierr .ne. 0) then print *, 'fhypre_sstructpcgdestroy error = ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_SStructPCGSetup !-------------------------------------------------------------------------- subroutine fhypre_sstructpcgsetup(fsolver, fA, fb, fx) integer ierr integer*8 fsolver integer*8 fA integer*8 fb integer*8 fx call HYPRE_SStructPCGSetup(fsolver, fA, fb, fx, ierr) if(ierr .ne. 0) then print *, 'fhypre_sstructpcgsetup error = ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_SStructPCGSolve !-------------------------------------------------------------------------- subroutine fhypre_sstructpcgsolve(fsolver, fA, fb, fx) integer ierr integer*8 fsolver integer*8 fA integer*8 fb integer*8 fx call HYPRE_SStructPCGSolve(fsolver, fA, fb, fx, ierr) if(ierr .ne. 0) then print *, 'fhypre_sstructpcgsolve error = ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_SStructPCGSetTol !-------------------------------------------------------------------------- subroutine fhypre_sstructpcgsettol(fsolver, ftol) integer ierr integer*8 fsolver double precision ftol call HYPRE_SStructPCGSetTol(fsolver, ftol, ierr) if(ierr .ne. 0) then print *, 'fhypre_sstructpcgsettol error = ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_SStructPCGSetMaxIter !-------------------------------------------------------------------------- subroutine fhypre_sstructpcgsetmaxiter(fsolver, fmax_iter) integer ierr integer fmax_iter integer*8 fsolver call HYPRE_SStructPCGSetMaxIter(fsolver, fmax_iter, ierr) if(ierr .ne. 0) then print *, 'fhypre_sstructpcgsetmaxiter error = ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_SStructPCGSetTwoNorm !-------------------------------------------------------------------------- subroutine fhypre_sstructpcgsettwonorm(fsolver, ftwo_norm) integer ierr integer ftwo_norm integer*8 fsolver call HYPRE_SStructPCGSetTwoNorm(fsolver, ftwo_norm, ierr) if(ierr .ne. 0) then print *, 'fhypre_sstructpcgsettwonorm error = ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_SStructPCGSetRelChange !-------------------------------------------------------------------------- subroutine fhypre_sstructpcgsetrelchange(fsolver, frel_change) integer ierr integer frel_change integer*8 fsolver call HYPRE_SStructPCGSetRelChange(fsolver, frel_change, ierr) if(ierr .ne. 0) then print *, 'fhypre_sstructpcgsetrelchange error = ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_SStructPCGSetPrecond !-------------------------------------------------------------------------- subroutine fhypre_sstructpcgsetprecond(fsolver, fprecond_id, 1 fprecond) integer ierr integer fprecond_id integer*8 fsolver integer*8 fprecond call HYPRE_SStructPCGSetPrecond(fsolver, fprecond_id, fprecond, 1 ierr) if(ierr .ne. 0) then print *, 'fhypre_sstructpcgsetprecond error = ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_SStructPCGSetLogging !-------------------------------------------------------------------------- subroutine fhypre_sstructpcgsetlogging(fsolver, flog) integer ierr integer flog integer*8 fsolver call HYPRE_SStructPCGSetLogging(fsolver, flog, ierr) if(ierr .ne. 0) then print *, 'fhypre_sstructpcgsetlogging error = ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_SStructPCGSetPrintLevel !-------------------------------------------------------------------------- subroutine fhypre_sstructpcgsetprintlevel(fsolver, flevel) integer ierr integer flevel integer*8 fsolver call HYPRE_SStructPCGSetPrintLevel(fsolver, flevel, ierr) if(ierr .ne. 0) then print *, 'fhypre_sstructpcgsetprintlevel error = ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_SStructPCGGetNumIterations !-------------------------------------------------------------------------- subroutine fhypre_sstructpcggetnumiteratio(fsolver, fnumiter) integer ierr integer fnumiter integer*8 fsolver call HYPRE_SStructPCGGetNumIteration(fsolver, fnumiter, ierr) if(ierr .ne. 0) then print *, 'fhypre_sstructpcggetnumiteration error = ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_SStructPCGGetFinalRelativeResidualNorm !-------------------------------------------------------------------------- subroutine fhypre_sstructpcggetfinalrelati(fsolver, fnorm) integer ierr integer*8 fsolver double precision fnorm call HYPRE_SStructPCGGetFinalRelativ(fsolver, fnorm, ierr) if(ierr .ne. 0) then print *, 'fhypre_sstructpcggetfinalrelative error = ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_SStructPCGGetResidual !-------------------------------------------------------------------------- subroutine fhypre_sstructpcggetresidual(fsolver, fresidual) integer ierr integer*8 fsolver integer*8 fresidual call HYPRE_SStructPCGGetResidual(fsolver, fresidual, ierr) if(ierr .ne. 0) then print *, 'fhypre_sstructpcggetresidual error = ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_SStructDiagScaleSetup !-------------------------------------------------------------------------- subroutine fhypre_sstructdiagscalesetup(fsolver, fA, fy, fx) integer ierr integer*8 fsolver integer*8 fA integer*8 fy integer*8 fx call HYPRE_SStructDiagScaleSetup(fsolver, fA, fy, fx, ierr) if(ierr .ne. 0) then print *, 'fhypre_sstructdiagscalesetup error = ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_SStructDiagScale !-------------------------------------------------------------------------- subroutine fhypre_sstructdiagscale(fsolver, fA, fy, fx) integer ierr integer*8 fsolver integer*8 fA integer*8 fy integer*8 fx call HYPRE_SStructDiagScale(fsolver, fA, fy, fx, ierr) if(ierr .ne. 0) then print *, 'fhypre_sstructdiagscale error = ', ierr endif return end !**************************************************************************** ! HYPRE_SStructSplit routines !**************************************************************************** !-------------------------------------------------------------------------- ! HYPRE_SStructSplitCreate !-------------------------------------------------------------------------- subroutine fhypre_sstructsplitcreate(fcomm, fsolver) integer ierr integer*8 fcomm integer*8 fsolver call HYPRE_SStructSplitCreate(fcomm, fsolver, ierr) if(ierr .ne. 0) then print *, 'fhypre_sstructsplitcreate error = ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_SStructSplitDestroy !-------------------------------------------------------------------------- subroutine fhypre_sstructsplitdestroy(fsolver) integer ierr integer*8 fsolver call HYPRE_SStructSplitDestroy(fsolver, ierr) if(ierr .ne. 0) then print *, 'fhypre_sstructsplitdestroy error = ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_SStructSplitSetup !-------------------------------------------------------------------------- subroutine fhypre_sstructsplitsetup(fsolver, fA, fb, fx) integer ierr integer*8 fsolver integer*8 fA integer*8 fb integer*8 fx call HYPRE_SStructSplitSetup(fsolver, fA, fb, fx, ierr) if(ierr .ne. 0) then print *, 'fhypre_sstructsplitsetup error = ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_SStructSplitSolve !-------------------------------------------------------------------------- subroutine fhypre_sstructsplitsolve(fsolver, fA, fb, fx) integer ierr integer*8 fsolver integer*8 fA integer*8 fb integer*8 fx call HYPRE_SStructSplitSolve(fsolver, fA, fb, fx, ierr) if(ierr .ne. 0) then print *, 'fhypre_sstructsplitsolve error = ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_SStructSplitSetTol !-------------------------------------------------------------------------- subroutine fhypre_sstructsplitsettol(fsolver, ftol) integer ierr integer*8 fsolver double precision ftol call HYPRE_SStructSplitSetTol(fsolver, ftol, ierr) if(ierr .ne. 0) then print *, 'fhypre_sstructsplitsettol error = ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_SStructSplitSetMaxIter !-------------------------------------------------------------------------- subroutine fhypre_sstructsplitsetmaxiter(fsolver, fmax_iter) integer ierr integer fmax_iter integer*8 fsolver call HYPRE_SStructSplitSetMaxIter(fsolver, fmax_iter, ierr) if(ierr .ne. 0) then print *, 'fhypre_sstructsplitsetmaxiter error = ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_SStructSplitSetZeroGuess !-------------------------------------------------------------------------- subroutine fhypre_sstructsplitsetzeroguess(fsolver) integer ierr integer*8 fsolver call HYPRE_SStructSplitSetZeroGuess(fsolver, ierr) if(ierr .ne. 0) then print *, 'fhypre_sstructsplitsetzeroguess error = ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_SStructSplitSetNonZeroGuess !-------------------------------------------------------------------------- subroutine fhypre_sstructsplitsetnonzerogu(fsolver) integer ierr integer*8 fsolver call HYPRE_SStructSplitSetNonZeroGue(fsolver, ierr) if(ierr .ne. 0) then print *, 'fhypre_sstructsplitsetnonzeroguess error = ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_SStructSplitSetStructSolver !-------------------------------------------------------------------------- subroutine fhypre_sstructsplitsetstructsol(fsolver, fssolver) integer ierr integer fssolver integer*8 fsolver call HYPRE_SStructSplitSetStructSolv(fsolver, fssolver, ierr) if(ierr .ne. 0) then print *, 'fhypre_sstructsplitsetstructsolve error = ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_SStructSplitGetNumIterations !-------------------------------------------------------------------------- subroutine fhypre_sstructsplitgetnumiterat(fsolver, fnumiter) integer ierr integer fnumiter integer*8 fsolver call HYPRE_SStructSplitGetNumIterati(fsolver, fnumiter, ierr) if(ierr .ne. 0) then print *, 'fhypre_sstructsplitgetnumiteration error = ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_SStructSplitGetFinalRelativeResidualNorm !-------------------------------------------------------------------------- subroutine fhypre_sstructsplitgetfinalrela(fsolver, fnorm) integer ierr integer*8 fsolver double precision fnorm call HYPRE_SStructSplitGetFinalRelat(fsolver, fnorm, ierr) if(ierr .ne. 0) then print *, 'fhypre_sstructsplitgetfinalrelative error = ', ierr endif return end !**************************************************************************** ! HYPRE_SStructSYSPFMG routines !**************************************************************************** !-------------------------------------------------------------------------- ! HYPRE_SStructSysPFMGCreate !-------------------------------------------------------------------------- subroutine fhypre_sstructsyspfmgcreate(fcomm, fsolver) integer ierr integer*8 fcomm integer*8 fsolver call HYPRE_SStructSysPFMGCreate(fcomm, fsolver, ierr) if(ierr .ne. 0) then print *, 'fhypre_sstructsyspfmgcreate error = ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_SStructSysPFMGDestroy !-------------------------------------------------------------------------- subroutine fhypre_sstructsyspfmgdestroy(fsolver) integer ierr integer*8 fsolver call HYPRE_SStructSysPFMGDestroy(fsolver, ierr) if(ierr .ne. 0) then print *, 'fhypre_sstructsyspfmgdestroy error = ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_SStructSysPFMGSetup !-------------------------------------------------------------------------- subroutine fhypre_sstructsyspfmgsetup(fsolver, fA, fb, fx) integer ierr integer*8 fsolver integer*8 fA integer*8 fb integer*8 fx call HYPRE_SStructSysPFMGSetup(fsolver, fA, fb, fx, ierr) if(ierr .ne. 0) then print *, 'fhypre_sstructsyspfmgsetup error = ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_SStructSysPFMGSolve !-------------------------------------------------------------------------- subroutine fhypre_sstructsyspfmgsolve(fsolver, fA, fb, fx) integer ierr integer*8 fsolver integer*8 fA integer*8 fb integer*8 fx call HYPRE_SStructSysPFMGSolve(fsolver, fA, fb, fx, ierr) if(ierr .ne. 0) then print *, 'fhypre_sstructsyspfmgsolve error = ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_SStructSysPFMGSetTol !-------------------------------------------------------------------------- subroutine fhypre_sstructsyspfmgsettol(fsolver, ftol) integer ierr integer*8 fsolver double precision ftol call HYPRE_SStructSysPFMGSetTol(fsolver, ftol, ierr) if(ierr .ne. 0) then print *, 'fhypre_sstructsyspfmgsettol error = ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_SStructSysPFMGSetMaxIter !-------------------------------------------------------------------------- subroutine fhypre_sstructsyspfmgsetmaxiter(fsolver, fmax_iter) integer ierr integer fmax_iter integer*8 fsolver call HYPRE_SStructSysPFMGSetMaxIter(fsolver, fmax_iter, ierr) if(ierr .ne. 0) then print *, 'fhypre_sstructsyspfmgsetmaxiter error = ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_SStructSysPFMGSetRelChange !-------------------------------------------------------------------------- subroutine fhypre_sstructsyspfmgsetrelchang(fsolver, frel_change) integer ierr integer frel_change integer*8 fsolver call HYPRE_SStructSysPFMGSetRelChang(fsolver, frel_change, ierr) if(ierr .ne. 0) then print *, 'fhypre_sstructsyspfmgsetrelchange error = ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_SStructSysPFMGSetZeroGuess !-------------------------------------------------------------------------- subroutine fhypre_sstructsyspfmgsetzerogue(fsolver) integer ierr integer*8 fsolver call HYPRE_SStructSysPFMGSetZeroGues(fsolver, ierr) if(ierr .ne. 0) then print *, 'fhypre_sstructsyspfmgsetzeroguess error = ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_SStructSysPFMGSetNonZeroGuess !-------------------------------------------------------------------------- subroutine fhypre_sstructsyspfmgsetnonzero(fsolver) integer ierr integer*8 fsolver call HYPRE_SStructSysPFMGSetNonZeroG(fsolver, ierr) if(ierr .ne. 0) then print *, 'fhypre_sstructsyspfmgsetnonzeroguess error = ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_SStructSysPFMGSetRelaxType !-------------------------------------------------------------------------- subroutine fhypre_sstructsyspfmgsetrelaxty(fsolver, frelax_type) integer ierr integer frelax_type integer*8 fsolver call HYPRE_SStructSysPFMGSetRelaxTyp(fsolver, frelax_type, ierr) if(ierr .ne. 0) then print *, 'fhypre_sstructsyspfmgsetrelaxtype error = ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_SStructSysPFMGSetNumPreRelax !-------------------------------------------------------------------------- subroutine fhypre_sstructsyspfmgsetnumprer(fsolver, 1 fnum_pre_relax) integer ierr integer fnum_pre_relax integer*8 fsolver call HYPRE_SStructSysPFMGSetNumPreRe(fsolver, fnum_pre_relax, 1 ierr) if(ierr .ne. 0) then print *, 'fhypre_sstructsyspfmgsetnumprerelax error = ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_SStructSysPFMGSetNumPostRelax !-------------------------------------------------------------------------- subroutine fhypre_sstructsyspfmgsetnumpost(fsolver, 1 fnum_post_relax) integer ierr integer fnum_post_relax integer*8 fsolver call HYPRE_SStructSysPFMGSetNumPostR(fsolver, fnum_post_relax, 1 ierr) if(ierr .ne. 0) then print *, 'fhypre_sstructsyspfmgsetnumpostrelax error = ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_SStructSysPFMGSetSkipRelax !-------------------------------------------------------------------------- subroutine fhypre_sstructsyspfmgsetskiprel(fsolver, fskip_relax) integer ierr integer fskip_relax integer*8 fsolver call HYPRE_SStructSysPFMGSetSkipRela(fsolver, fskip_relax, ierr) if(ierr .ne. 0) then print *, 'fhypre_sstructsyspfmgsetskiprelax error = ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_SStructSysPFMGSetDxyz !-------------------------------------------------------------------------- subroutine fhypre_sstructsyspfmgsetdxyz(fsolver, fdxyz) integer ierr integer*8 fsolver double precision fdxyz call HYPRE_SStructSysPFMGSetDxyz(fsolver, fdxyz, ierr) if(ierr .ne. 0) then print *, 'fhypre_sstructsyspfmgsetdxyz error = ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_SStructSysPFMGSetLogging !-------------------------------------------------------------------------- subroutine fhypre_sstructsyspfmgsetlogging(fsolver, flog) integer ierr integer flog integer*8 fsolver call HYPRE_SStructSysPFMGSetLogging(fsolver, flog, ierr) if(ierr .ne. 0) then print *, 'fhypre_sstructsyspfmgsetlogging error = ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_SStructSysPFMGSetPrintLevel !-------------------------------------------------------------------------- subroutine fhypre_sstructsyspfmgsetprintle(fsolver, fprint_level) integer ierr integer fprint_level integer*8 fsolver call HYPRE_SStructSysPFMGSetPrintLev(fsolver, fprint_level, 1 ierr) if(ierr .ne. 0) then print *, 'fhypre_sstructsyspfmgsetprintlevel error = ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_SStructSysPFMGGetNumIterations !-------------------------------------------------------------------------- subroutine fhypre_sstructsyspfmggetnumiter(fsolver, fnumiter) integer ierr integer fnumiter integer*8 fsolver call HYPRE_SStructSysPFMGGetNumItera(fsolver, fnumiter, ierr) if(ierr .ne. 0) then print *, 'fhypre_sstructsyspfmggetnumiteration error = ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_SStructSysPFMGGetFinalRelativeResidualNorm !-------------------------------------------------------------------------- subroutine fhypre_sstructsyspfmggetfinalre(fsolver, fnorm) integer ierr integer*8 fsolver double precision fnorm call HYPRE_SStructSysPFMGGetFinalRel(fsolver, fnorm, ierr) if(ierr .ne. 0) then print *, 'fhypre_sstructsyspfmggetfinalrelative error = ', ierr endif return end !***************************************************************************** !* !* HYPRE_SStructMaxwell interface !* !***************************************************************************** !*-------------------------------------------------------------------------- !* HYPRE_SStructMaxwellCreate !*-------------------------------------------------------------------------- subroutine fhypre_sstructmaxwellcreate(fcomm, fsolver) integer ierr integer*8 fcomm integer*8 fsolver call HYPRE_SStructMaxwellCreate(fcomm, fsolver, ierr) if(ierr .ne. 0) then print *, 'fhypre_sstructmaxwellcreate = ', ierr endif return end !*-------------------------------------------------------------------------- !* HYPRE_SStructMaxwellDestroy !*-------------------------------------------------------------------------- subroutine fhypre_sstructmaxwelldestroy(fsolver) integer ierr integer*8 fsolver call HYPRE_SStructMaxwellDestroy(fsolver, ierr) if(ierr .ne. 0) then print *, 'fhypre_sstructmaxwelldestroy = ', ierr endif return end !*-------------------------------------------------------------------------- !* HYPRE_SStructMaxwellSetup !*-------------------------------------------------------------------------- subroutine fhypre_sstructmaxwellsetup (fsolver, fA, fb, fx) integer ierr integer*8 fsolver integer*8 fA integer*8 fb integer*8 fx call HYPRE_SStructMaxwellSetup(fsolver, fA, fb, fx, ierr) if(ierr .ne. 0) then print *, 'fhypre_sstructmaxwellsetup = ', ierr endif return end !*-------------------------------------------------------------------------- !* HYPRE_SStructMaxwellSolve !*-------------------------------------------------------------------------- subroutine fhypre_sstructmaxwellsolve (fsolver, fA, fb, fx) integer ierr integer*8 fsolver integer*8 fA integer*8 fb integer*8 fx call HYPRE_SStructMaxwellSolve(fsolver, fA, fb, fx, ierr) if(ierr .ne. 0) then print *, 'fhypre_sstructmaxwellsolve = ', ierr endif return end !*-------------------------------------------------------------------------- !* HYPRE_SStructMaxwellSolve2 !*-------------------------------------------------------------------------- subroutine fhypre_sstructmaxwellsolve2(fsolver, fA, fb, fx) integer ierr integer*8 fsolver integer*8 fA integer*8 fb integer*8 fx call HYPRE_SStructMaxwellSolve2(fsolver, fA, fb, fx, ierr) if(ierr .ne. 0) then print *, 'fhypre_sstructmaxwellsolve2 = ', ierr endif return end !*-------------------------------------------------------------------------- !* HYPRE_MaxwellGrad !*-------------------------------------------------------------------------- subroutine fhypre_maxwellgrad (fgrid, fT) integer ierr integer*8 fgrid integer*8 fT call HYPRE_MaxwellGrad(fgrid, fT, ierr) if(ierr .ne. 0) then print *, 'fhypre_sstructmaxwellgrad = ', ierr endif return end !*-------------------------------------------------------------------------- !* HYPRE_SStructMaxwellSetGrad !*-------------------------------------------------------------------------- subroutine fhypre_sstructmaxwellsetgrad (fsolver, fT) integer ierr integer*8 fsolver integer*8 fT call HYPRE_SStructMaxwellSetGrad(fsolver, fT, ierr) if(ierr .ne. 0) then print *, 'fhypre_sstructmaxwellsetgrad = ', ierr endif return end !*-------------------------------------------------------------------------- !* HYPRE_SStructMaxwellSetRfactors !*-------------------------------------------------------------------------- subroutine fhypre_sstructmaxwellsetrfactor (fsolver,frfactors) integer ierr integer*8 fsolver integer*8 frfactors(3) call HYPRE_SStructMaxwellSetRfactors(fsolver, frfactors, ierr) if(ierr .ne. 0) then print *, 'fhypre_sstructmaxwellsetrfactors = ', ierr endif return end !*-------------------------------------------------------------------------- !* HYPRE_SStructMaxwellSetTol !*-------------------------------------------------------------------------- subroutine fhypre_sstructmaxwellsettol (fsolver, ftol) integer ierr integer*8 fsolver double precision ftol call HYPRE_SStructMaxwellSetTol(fsolver, ftol, ierr) if(ierr .ne. 0) then print *, 'fhypre_sstructmaxwellsettol = ', ierr endif return end !*-------------------------------------------------------------------------- !* HYPRE_SStructMaxwellSetConstantCoef !*-------------------------------------------------------------------------- subroutine fhypre_sstructmaxwellsetconstan (fsolver, 1 fconstant_coef) integer ierr integer*8 fsolver integer fconstant_coef call HYPRE_SStructMaxwellSetConstant(fsolver, fconstant_coef, 1 ierr) if(ierr .ne. 0) then print *, 'fhypre_sstructmaxwellsetconstantcoef = ', ierr endif return end !*-------------------------------------------------------------------------- !* HYPRE_SStructMaxwellSetMaxIter !*-------------------------------------------------------------------------- subroutine fhypre_sstructmaxwellsetmaxiter (fsolver, fmax_iter) integer ierr integer*8 fsolver integer fmax_iter call HYPRE_SStructMaxwellSetMaxIter(fsolver, fmax_iter, ierr) if(ierr .ne. 0) then print *, 'fhypre_sstructmaxwellsetmaxiter = ', ierr endif return end !*-------------------------------------------------------------------------- !* HYPRE_SStructMaxwellSetRelChange !*-------------------------------------------------------------------------- subroutine fhypre_sstructmaxwellsetrelchan (fsolver, frel_change) integer ierr integer*8 fsolver integer frel_change call HYPRE_SStructMaxwellSetRelChang(fsolver, frel_change, ierr) if(ierr .ne. 0) then print *, 'fhypre_sstructmaxwellsetrelchange = ', ierr endif return end !*-------------------------------------------------------------------------- !* HYPRE_SStructMaxwellSetNumPreRelax !*-------------------------------------------------------------------------- subroutine fhypre_sstructmaxwellsetnumprer (fsolver, 1 fnum_pre_relax) integer ierr integer*8 fsolver integer fnum_pre_relax call HYPRE_SStructMaxwellSetNumPreRe(fsolver, fnum_pre_relax, 1 ierr) if(ierr .ne. 0) then print *, 'fhypre_sstructmaxwellsetnumprerelax = ', ierr endif return end !*-------------------------------------------------------------------------- !* HYPRE_SStructMaxwellSetNumPostRelax !*-------------------------------------------------------------------------- subroutine fhypre_sstructmaxwellsetnumpost (fsolver, 1 fnum_post_relax) integer ierr integer*8 fsolver integer fnum_post_relax call HYPRE_SStructMaxwellSetNumPostR(fsolver, fnum_post_relax, 1 ierr) if(ierr .ne. 0) then print *, 'fhypre_sstructmaxwellsetnumpostrelax = ', ierr endif return end !*-------------------------------------------------------------------------- !* HYPRE_SStructMaxwellSetLogging !*-------------------------------------------------------------------------- subroutine fhypre_sstructmaxwellsetlogging (fsolver, flogging) integer ierr integer*8 fsolver integer flogging call HYPRE_SStructMaxwellSetLogging(fsolver, flogging, ierr) if(ierr .ne. 0) then print *, 'fhypre_sstructmaxwellsetlogging = ', ierr endif return end !*-------------------------------------------------------------------------- !* HYPRE_SStructMaxwellSetPrintLevel !*-------------------------------------------------------------------------- subroutine fhypre_sstructmaxwellsetprintle (fsolver, fprint_level) integer ierr integer*8 fsolver integer flogging call HYPRE_SStructMaxwellSetPrintLev(fsolver, fprint_level, 1 ierr) if(ierr .ne. 0) then print *, 'fhypre_sstructmaxwellsetprintlevel = ', ierr endif return end !*-------------------------------------------------------------------------- !* HYPRE_SStructMaxwellPrintLogging !*-------------------------------------------------------------------------- subroutine fhypre_sstructmaxwellprintloggi (fsolver, fmyid) integer ierr integer*8 fsolver integer flogging call HYPRE_SStructMaxwellPrintLoggin(fsolver, fmyid, ierr) if(ierr .ne. 0) then print *, 'fhypre_sstructmaxwellprintlogging = ', ierr endif return end !*-------------------------------------------------------------------------- !* HYPRE_SStructMaxwellGetNumIterations !*-------------------------------------------------------------------------- subroutine fhypre_sstructmaxwellgetnumiter (fsolver, 1 fnum_iterations) integer ierr integer*8 fsolver integer fnum_iterations call HYPRE_SStructMaxwellGetNumItera(fsolver, 1 fnum_iterations, ierr) if(ierr .ne. 0) then print *, 'fhypre_sstructmaxwellgetnumiterations = ', ierr endif return end !*-------------------------------------------------------------------------- !* HYPRE_SStructMaxwellGetFinalRelativeResidualNorm !*-------------------------------------------------------------------------- subroutine fhypre_sstructmaxwellgetfinalre (fsolver, fnorm) integer ierr integer*8 fsolver double precision fnorm call HYPRE_SStructMaxwellGetFinalRel(fsolver, fnorm, ierr) if(ierr .ne. 0) then print *, 1 'fhypre_sstructmaxwellgetfinalrelativeresidualnorm = ', ierr endif return end !*-------------------------------------------------------------------------- !* HYPRE_SStructMaxwellPhysBdy !*-------------------------------------------------------------------------- subroutine fhypre_sstructmaxwellphysbdy (fgrid_l, fnum_levels, 1 frfactors, 2 fBdryRanks_ptr, 3 fBdryRanksCnt_ptr) integer ierr integer*8 fgrid_l integer*8 frfactors integer*8 fBdryRanks_ptr integer*8 fBdryRanksCnt_ptr integer fnum_levels call HYPRE_SStructMaxwellPhysBdy(fgrid_l, fnum_levels, frfactors, 1 fBdryRanks_ptr, 2 fBdryRanksCnt_ptr, ierr) if(ierr .ne. 0) then print *, 'fhypre_sstructmaxwellphysbdy = ', ierr endif return end !*-------------------------------------------------------------------------- !* HYPRE_SStructMaxwellEliminateRowsCols !*-------------------------------------------------------------------------- subroutine fhypre_sstructmaxwelleliminater (fparA, fnrows, frows) integer ierr integer*8 fparA integer*8 frows integer*8 fnrows call HYPRE_SStructMaxwellEliminateRo(fparA, fnrows, frows, 1 ierr) if(ierr .ne. 0) then print *, 'fhypre_sstructmaxwelleliminaterows = ', ierr endif return end !*-------------------------------------------------------------------------- !* HYPRE_SStructMaxwellZeroVector !*-------------------------------------------------------------------------- subroutine fhypre_sstructmaxwellzerovector (fb, frows, fnrows) integer ierr integer*8 fb integer*8 frows integer*8 fnrows call HYPRE_SStructMaxwellZeroVector(fb, frows, fnrows, ierr) if(ierr .ne. 0) then print *, 'fhypre_sstructmaxwellzerovector = ', ierr endif return end hypre-2.33.0/src/test/fsstruct_mv.f000066400000000000000000001050661477326011500172400ustar00rootroot00000000000000! Copyright (c) 1998 Lawrence Livermore National Security, LLC and other ! HYPRE Project Developers. See the top-level COPYRIGHT file for details. ! ! SPDX-License-Identifier: (Apache-2.0 OR MIT) !*************************************************************************** ! HYPRE_SStruct fortran interface !*************************************************************************** !*************************************************************************** ! HYPRE_SStructGraph routines !*************************************************************************** !------------------------------------------------------------------------- ! HYPRE_SStructGraphCreate !------------------------------------------------------------------------- subroutine fhypre_sstructgraphcreate(fcomm, fgrid, fgraphptr) integer ierr integer fcomm integer*8 fgrid integer*8 fgraphptr call HYPRE_SStructGraphCreate(fcomm, fgrid, fgraphptr, ierr) if (ierr .ne. 0) then print *, ' fhypre_sstructgraphcreate error = ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_SStructGraphDestroy !-------------------------------------------------------------------------- subroutine fhypre_sstructgraphdestroy(fgraph) integer ierr integer*8 fgraph call HYPRE_SStructGraphDestroy(fgraph, ierr) if (ierr .ne. 0) then print *, ' fhypre_sstructgraphdestroy error = ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_SStructGraphSetStencil !-------------------------------------------------------------------------- subroutine fhypre_sstructgraphsetstencil(fgraph, fpart, fvar, 1 fstencil) integer ierr integer part integer var integer*8 fgraph integer*8 fstencil call HYPRE_SStructGraphSetStencil(fgraph, fpart, fvar, fstencil, 1 ierr) if (ierr .ne. 0) then print *, ' fhypre_sstructgraphsetstencil error = ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_SStructGraphAddEntries- ! THIS IS FOR A NON-OVERLAPPING GRID GRAPH. !-------------------------------------------------------------------------- subroutine fhypre_sstructgraphaddentries(fgraph, fpart, findex, 1 fvar, fto_part, 1 fto_index, fto_var) integer ierr integer fpart integer findex integer fvar integer fto_part integer fto_index integer fto_var integer*8 fgraph call HYPRE_SStructGraphAddEntries(fgraph, fpart, findex, fvar, 1 fto_part, fto_index, fto_var, 2 ierr) if (ierr .ne. 0) then print *, ' fhypre_sstructgraphaddedntries error = ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_SStructGraphAssemble !-------------------------------------------------------------------------- subroutine fhypre_sstructgraphassemble(fgraph) integer ierr integer*8 fgraph call HYPRE_SStructGraphAssemble(fgraph, ierr) if (ierr .ne. 0) then print *, ' fhypre_sstructgraphassemble error = ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_SStructGraphSetObjectType !-------------------------------------------------------------------------- subroutine fhypre_sstructgraphsetobjecttyp(fgraph, ftype) integer ierr integer ftype integer*8 fgraph call HYPRE_SStructGraphSetObjectType(fgraph, ftype, ierr) if (ierr .ne. 0) then print *, ' fhypre_sstructgraphsetobjecttype error = ', ierr endif return end !*************************************************************************** ! HYPRE_SStructGrid routines !*************************************************************************** !-------------------------------------------------------------------------- ! HYPRE_SStructGridCreate !-------------------------------------------------------------------------- subroutine fhypre_sstructgridcreate(fcomm, fndim, fnparts, 1 fgridptr) integer ierr integer fcomm integer fndim integer fnparts integer*8 fgridptr call HYPRE_SStructGridCreate(fcomm, fndim, fnparts, fgridptr, 1 ierr) if (ierr .ne. 0) then print *, ' fhypre_sstructgridcreate error = ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_SStructGridDestroy !-------------------------------------------------------------------------- subroutine fhypre_sstructgriddestroy(fgrid) integer ierr integer*8 fgrid call HYPRE_SStructGridDestroy(fgrid, ierr) if (ierr .ne. 0) then print *, ' fhypre_sstructgriddestroy error = ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_SStructGridSetExtents !-------------------------------------------------------------------------- subroutine fhypre_sstructgridsetextents(fgrid, fpart, filower, 1 fiupper) integer ierr integer fpart integer filower integer fiupper integer*8 fgrid call HYPRE_SStructGridSetExtents(fgrid, fpart, filower, fiupper, 1 ierr) if (ierr .ne. 0) then print *, ' fhypre_sstructgridsetextents error = ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_SStructGridSetVariables !-------------------------------------------------------------------------- subroutine fhypre_sstructgridsetvariables(fgrid, fpart, fnvars, 1 fvartypes) integer ierr integer fpart integer fnvars integer*8 fgrid integer*8 fvartypes call HYPRE_SStructGridSetVariables(fgrid, fpart, fnvars, 1 fvartypes, ierr) if (ierr .ne. 0) then print *, ' fhypre_sstructgridsetvariables error = ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_SStructGridAddVariables !-------------------------------------------------------------------------- subroutine fhypre_sstructgridaddvariables(fgrid, fpart, findex, 1 fnvars, fvartypes) integer ierr integer fpart integer findex integer fnvars integer*8 fgrid integer*8 fvartypes call HYPRE_SStructGridAddVariables(fgrid, fpart, findex, fnvars, 1 fvartypes, ierr) if (ierr .ne. 0) then print *, ' fhypre_sstructgridaddvariables error = ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_SStructGridSetNeighborBox !-------------------------------------------------------------------------- subroutine fhypre_sstructgridsetneighborbo(fgrid, fpart, filower, 1 fiupper, fnbor_part, 2 fnbor_ilower, 3 fnbor_iupper, 4 findex_map) integer ierr integer fpart integer filower integer fiupper integer fnbor_part integer fnbor_ilower integer fnbor_iupper integer findex_map integer*8 fgrid call HYPRE_SStructGridSetNeighborBox(fgrid, fpart, filower, 1 fiupper, fnbor_part, 2 fnbor_ilower, fnbor_iupper, 3 findex_map, ierr) if (ierr .ne. 0) then print *, ' fhypre_sstructgridsetneighborbox error = ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_SStructGridAssemble !-------------------------------------------------------------------------- subroutine fhypre_sstructgridassemble(fgrid) integer ierr integer*8 fgrid call HYPRE_SStructGridAssemble(fgrid, ierr) if (ierr .ne. 0) then print *, ' fhypre_sstructgridassemble error = ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_SStructGridSetPeriodic !-------------------------------------------------------------------------- subroutine fhypre_sstructgridsetperiodic(fgrid, fpart, fperiodic) integer ierr integer fpart integer fperiodic integer*8 fgrid call HYPRE_SStructGridSetPeriodic(fgrid, fpart, fperiodic, ierr) if (ierr .ne. 0) then print *, ' fhypre_sstructgridsetperiodic error = ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_SStructGridSetNumGhost !-------------------------------------------------------------------------- subroutine fhypre_sstructgridsetnumghost(fgrid, fnum_ghost) integer ierr integer fnumghost integer*8 fgrid call HYPRE_SStructGridSetNumGhost(fgrid, fnum_ghost, ierr) if (ierr .ne. 0) then print *, ' fhypre_sstructgridsetnumghost error = ', ierr endif return end !*************************************************************************** ! HYPRE_SStructMatrix routines !*************************************************************************** !-------------------------------------------------------------------------- ! HYPRE_SStructMatrixCreate !-------------------------------------------------------------------------- subroutine fhypre_sstructmatrixcreate(fcomm, fgraph, fmatrix_ptr) integer ierr integer fcomm integer*8 fgraph integer*8 fmatrix_ptr call HYPRE_SStructMatrixCreate(fcomm, fgraph, fmatrix_ptr, ierr) if (ierr .ne. 0) then print *, ' fhypre_sstructmatrixcreate error = ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_SStructMatrixDestroy !-------------------------------------------------------------------------- subroutine fhypre_sstructmatrixdestroy(fmatrix) integer ierr integer*8 fmatrix call HYPRE_SStructMatrixDestroy(fmatrix, ierr) if (ierr .ne. 0) then print *, ' fhypre_sstructmatrixdestroy error = ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_SStructMatrixInitialize !-------------------------------------------------------------------------- subroutine fhypre_sstructmatrixinitialize(fmatrix) integer ierr integer*8 fmatrix call HYPRE_SStructMatrixInitialize(fmatrix, ierr) if (ierr .ne. 0) then print *, ' fhypre_sstructmatrixinitialize error = ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_SStructMatrixSetValues !-------------------------------------------------------------------------- subroutine fhypre_sstructmatrixsetvalues(fmatrix, fpart, findex, 1 fvar, fnentries, 2 fentries, fvalues) integer ierr integer fpart integer findex integer fvar integer fnentries integer fentries integer*8 fmatrix double precision fvalues call HYPRE_SStructMatrixSetValues(fmatrix, fpart, findex, fvar, 1 fnentries, fentries, fvalues, 2 ierr) if (ierr .ne. 0) then print *, ' fhypre_sstructmatrixsetvalues error = ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_SStructMatrixSetBoxValues !-------------------------------------------------------------------------- subroutine fhypre_sstructmatrixsetboxvalue(fmatrix, fpart, 1 filower, fiupper, 2 fvar, fnentries, 3 fentries, fvalues) integer ierr integer fpart integer filower integer fiupper integer fvar integer fnentries integer fentries integer*8 fmatrix double precision fvalues call HYPRE_SStructMatrixSetBoxValues(fmatrix, fpart, filower, 1 fiupper, fvar, fnentries, 2 fentries, fvalues, ierr) if (ierr .ne. 0) then print *, ' fhypre_sstructmatrixsetboxvalues error = ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_SStructMatrixGetValues !-------------------------------------------------------------------------- subroutine fhypre_sstructmatrixgetvalues(fmatrix, fpart, findex, 1 fvar, fnentries, 2 fentries, fvalues) integer ierr integer fpart integer findex integer fvar integer fnentries integer fentries integer*8 fmatrix double precision fvalues call HYPRE_SStructMatrixGetValues(fmatrix, fpart, findex, fvar, 1 fnentries, fentries, fvalues, 2 ierr) if (ierr .ne. 0) then print *, ' fhypre_sstructmatrixgetvalues error = ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_SStructMatrixGetBoxValues !-------------------------------------------------------------------------- subroutine fhypre_sstructmatrixgetboxvalue(fmatrix, fpart, 1 filower, fiupper, 2 fvar, fnentries, 3 fentries, fvalues) integer ierr integer fpart integer filower integer fiupper integer fvar integer fnentries integer fentries integer*8 fmatrix double precision fvalues call HYPRE_SStructMatrixGetBoxValues(fmatrix, fpart, filower, 1 fiupper, fvar, fnentries, 2 fentries, fvalues, ierr) if (ierr .ne. 0) then print *, ' fhypre_sstructmatrixgetboxvalues error = ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_SStructMatrixAddToValues !-------------------------------------------------------------------------- subroutine fhypre_sstructmatrixaddtovalues(fmatrix, fpart, findex, 1 fvar, fnentries, 2 fentries, fvalues) integer ierr integer fpart integer findex integer fvar integer fnentries integer fentries integer*8 fmatrix double precision fvalues call HYPRE_SStructMatrixAddToValues(fmatrix, fpart, findex, fvar, 1 fnentries, fentries, fvalues, 2 ierr) if (ierr .ne. 0) then print *, ' fhypre_sstructmatrixaddtovalues error = ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_SStructMatrixAddToBoxValues !-------------------------------------------------------------------------- subroutine fhypre_sstructmatrixaddtoboxval(fmatrix, fpart, 1 filower, fiupper, 2 fvar, fnentries, 3 fentries, fvalues) integer ierr integer fpart integer filower integer fiupper integer fvar integer fnentries integer fentries integer*8 fmatrix double precision fvalues call HYPRE_SStructMatrixAddToBoxValu(fmatrix, fpart, filower, 1 fiupper, fvar, fnentries, 2 fentries, fvalues, ierr) if (ierr .ne. 0) then print *, ' fhypre_sstructmatrixaddtoboxvalues error = ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_SStructMatrixAssemble !-------------------------------------------------------------------------- subroutine fhypre_sstructmatrixassemble(fmatrix) integer ierr integer*8 fmatrix call HYPRE_SStructMatrixAssemble(fmatrix, ierr) if (ierr .ne. 0) then print *, ' fhypre_sstructmatrixassemble error = ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_SStructMatrixSetSymmetric !-------------------------------------------------------------------------- subroutine fhypre_sstructmatrixsetsymmetri(fmatrix, fpart, fvar, 1 fto_var, fsymmetric) integer ierr integer fpart integer fvar integer fto_var integer fsymmetric integer*8 fmatrix call HYPRE_SStructMatrixSetSymmetric(fmatrix, fpart, fvar, 1 fto_var, fsymmetric, ierr) if (ierr .ne. 0) then print *, ' fhypre_sstructmatrixsetsymmetric error = ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_SStructMatrixSetNSSymmetric !-------------------------------------------------------------------------- subroutine fhypre_sstructmatrixsetnssymmet(fmatrix, fsymmetric) integer ierr integer fsymmetric integer*8 fmatrix call HYPRE_SStructMatrixSetNSSymmetr(fmatrix, fsymmetric, ierr) if (ierr .ne. 0) then print *, ' fhypre_sstructmatrixsetnssymmetric error = ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_SStructMatrixSetObjectType !-------------------------------------------------------------------------- subroutine fhypre_sstructmatrixsetobjectty(fmatrix, ftype) integer ierr integer ftype integer*8 fmatrix call HYPRE_SStructMatrixSetObjectTyp(fmatrix, ftype, ierr) if (ierr .ne. 0) then print *, ' fhypre_sstructmatrixsetobjecttype error = ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_SStructMatrixGetObject !-------------------------------------------------------------------------- subroutine fhypre_sstructmatrixgetobject(fmatrix, fobject) integer ierr integer*8 fobject integer*8 fmatrix call HYPRE_SStructMatrixGetObject(fmatrix, fobject, ierr) if (ierr .ne. 0) then print *, ' fhypre_sstructmatrixgetobject error = ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_SStructMatrixGetObject2 !-------------------------------------------------------------------------- subroutine fhypre_sstructmatrixgetobject2(fmatrix, fobject) integer ierr integer*8 fobject integer*8 fmatrix call HYPRE_SStructMatrixGetObject2(fmatrix, fobject, ierr) if (ierr .ne. 0) then print *, ' fhypre_sstructmatrixgetobject2 error = ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_SStructMatrixPrint !-------------------------------------------------------------------------- subroutine fhypre_sstructmatrixprint(ffilename, fmatrix, fall) integer ierr integer fall integer*8 fmatrix character*(*) ffilename call HYPRE_SStructMatrixPrint(ffilename, fmatrix, fall, ierr) if (ierr .ne. 0) then print *, ' fhypre_sstructmatrixprint error = ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_SStructMatrixMatvec !-------------------------------------------------------------------------- subroutine fhypre_sstructmatrixmatvec(falpha, fA, fx, fbeta, fy) integer ierr integer*8 fA integer*8 fx integer*8 fy double precision falpha double precision fbeta call HYPRE_SStructMatrixMatvec(falpha, fA, fx, fbeta, fy, ierr) if (ierr .ne. 0) then print *, ' fhypre_sstructmatrixmatvec error = ', ierr endif return end !*************************************************************************** ! HYPRE_SStructStencil routines !*************************************************************************** !-------------------------------------------------------------------------- ! HYPRE_SStructStencilCreate !-------------------------------------------------------------------------- subroutine fhypre_sstructstencilcreate(fndim, fsize, fstencil_ptr) integer ierr integer fndim integer fsize integer*8 fstencil_ptr call HYPRE_SStructStencilCreate(fndim, fsize, fstencil_ptr, ierr) if (ierr .ne. 0) then print *, ' fhypre_sstructstencilcreate error = ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_SStructStencilDestroy !-------------------------------------------------------------------------- subroutine fhypre_sstructstencildestroy(fstencil) integer ierr integer*8 fstencil call HYPRE_SStructStencilDestroy(fstencil, ierr) if (ierr .ne. 0) then print *, ' fhypre_sstructstencildestroy error = ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_SStructStencilSetEntry !-------------------------------------------------------------------------- subroutine fhypre_sstructstencilsetentry(fstencil, fentry, 1 foffset, fvar) integer ierr integer fentry integer foffset integer fvar integer*8 fstencil call HYPRE_SStructStencilSetEntry(fstencil, fentry, foffset, fvar, 1 ierr) if (ierr .ne. 0) then print *, ' fhypre_sstructstencilsetentry error = ', ierr endif return end !*************************************************************************** ! HYPRE_SStructVector routines !*************************************************************************** !-------------------------------------------------------------------------- ! HYPRE_SStructVectorCreate !-------------------------------------------------------------------------- subroutine fhypre_sstructvectorcreate(fcomm, fgrid, fvector_ptr) integer ierr integer fcomm integer*8 fvector_ptr integer*8 fgrid call HYPRE_SStructVectorCreate(fcomm, fgrid, fvector_ptr, ierr) if (ierr .ne. 0) then print *, ' fhypre_sstructvectorcreate error = ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_SStructVectorDestroy !-------------------------------------------------------------------------- subroutine fhypre_sstructvectordestroy(fvector) integer ierr integer*8 fvector call HYPRE_SStructVectorDestroy(fvector, ierr) if (ierr .ne. 0) then print *, ' fhypre_sstructvectordestroy error = ', ierr endif return end !--------------------------------------------------------- ! HYPRE_SStructVectorInitialize !--------------------------------------------------------- subroutine fhypre_sstructvectorinitialize(fvector) integer ierr integer*8 fvector call HYPRE_SStructVectorInitialize(fvector, ierr) if (ierr .ne. 0) then print *, ' fhypre_sstructvectorinitialize error = ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_SStructVectorSetValues !-------------------------------------------------------------------------- subroutine fhypre_sstructvectorsetvalues(fvector, fpart, findex, 1 fvar, fvalue) integer ierr integer fpart integer findex integer fvar integer*8 fvector double precision fvalue call HYPRE_SStructVectorSetValues(fvector, fpart, findex, fvar, 1 fvalue, ierr) if (ierr .ne. 0) then print *, ' fhypre_sstructvectorsetvalues error = ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_SStructVectorSetBoxValues !-------------------------------------------------------------------------- subroutine fhypre_sstructvectorsetboxvalue(fvector, fpart, 1 filower, fiupper, 2 fvar, fvalues) integer ierr integer fpart integer filower integer fiupper integer fvar integer*8 fvector double precision fvalues call HYPRE_SStructVectorSetBoxValues(fvector, fpart, filower, 1 fiupper, fvar, fvalues, ierr) if (ierr .ne. 0) then print *, ' fhypre_sstructvectorsetboxvalues error = ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_SStructVectorAddToValues !-------------------------------------------------------------------------- subroutine fhypre_sstructvectoraddtovalues(fvector, fpart, findex, 1 fvar, fvalue) integer ierr integer fpart integer findex integer fvar integer*8 fvector double precision fvalue call HYPRE_SStructVectorAddToValues(fvector, fpart, findex, fvar, 1 fvalue, ierr) if (ierr .ne. 0) then print *, ' fhypre_sstructvectoraddtovalues error = ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_SStructVectorAddToBoxValues !-------------------------------------------------------------------------- subroutine fhypre_sstructvectoraddtoboxval(fvector, fpart, 1 filower, fiupper, 2 fvar, fvalues) integer ierr integer fpart integer filower integer fiupper integer fvar integer*8 fvector double precision fvalues call HYPRE_SStructVectorAddToBoxValu(fvector, fpart, filower, 1 fiupper, fvar, fvalues, 2 ierr) if (ierr .ne. 0) then print *, ' fhypre_sstructvectoraddtoboxvalues error = ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_SStructVectorAssemble !-------------------------------------------------------------------------- subroutine fhypre_sstructvectorassemble(fvector) integer ierr integer*8 fvector call HYPRE_SStructVectorAssemble(fvector, ierr) if (ierr .ne. 0) then print *, ' fhypre_sstructvectorassemble error = ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_SStructVectorGather !-------------------------------------------------------------------------- subroutine fhypre_sstructvectorgather(fvector) integer ierr integer*8 fvector call HYPRE_SStructVectorGather(fvector, ierr) if (ierr .ne. 0) then print *, ' fhypre_sstructvectorgather error = ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_SStructVectorGetValues !-------------------------------------------------------------------------- subroutine fhypre_sstructvectorgetvalues(fvector, fpart, findex, 1 fvar, fvalue) integer ierr integer fpart integer findex integer fvar integer*8 fvector double precision fvalue call HYPRE_SStructVectorGetValues(fvector, fpart, findex, fvar, 1 fvalue, ierr) if (ierr .ne. 0) then print *, ' fhypre_sstructvectorgetvalues error = ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_SStructVectorGetBoxValues !-------------------------------------------------------------------------- subroutine fhypre_sstructvectorgetboxvalue(fvector, fpart, 1 filower, fiupper, 2 fvar, fvalues) integer ierr integer fpart integer filower integer fiupper integer fvar integer*8 fvector double precision fvalues call HYPRE_SStructVectorGetBoxValues(fvector, fpart, filower, 1 fiupper, fvar, fvalues, ierr) if (ierr .ne. 0) then print *, ' fhypre_sstructvectorgetboxvalues error = ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_SStructVectorSetConstantValues !-------------------------------------------------------------------------- subroutine fhypre_sstructvectorsetconstant(fvector, fvalue) integer ierr integer*8 fvector double precision fvalue call HYPRE_SStructVectorSetConstantV(fvector, fvalue, ierr) if (ierr .ne. 0) then print *, ' fhypre_sstructvectorsetconstantvalues error = ', 1 ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_SStructVectorSetObjectType !-------------------------------------------------------------------------- subroutine fhypre_sstructvectorsetobjectty(fvector, ftype) integer ierr integer ftype integer*8 fvector call HYPRE_SStructVectorSetObjectTyp(fvector, ftype, ierr) if (ierr .ne. 0) then print *, ' fhypre_sstructvectorsetobjecttype error = ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_SStructVectorGetObject !-------------------------------------------------------------------------- subroutine fhypre_sstructvectorgetobject(fvector, fobject) integer ierr integer*8 fobject integer*8 fvector call HYPRE_SStructVectorGetObject(fvector, fobject, ierr) if (ierr .ne. 0) then print *, ' fhypre_sstructvectorgetobject error = ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_SStructVectorPrint !-------------------------------------------------------------------------- subroutine fhypre_sstructvectorprint(ffilename, fvector, fall) integer ierr integer fall integer*8 fvector character*(*) ffilename call HYPRE_SStructVectorPrint(ffilename, fvector, fall, ierr) if (ierr .ne. 0) then print *, ' fhypre_sstructvectorprint error = ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_SStructVectorCopy !-------------------------------------------------------------------------- subroutine fhypre_sstructvectorcopy(fx, fy) integer ierr integer*8 fx integer*8 fy call HYPRE_SStructVectorCopy(fx, fy, ierr) if (ierr .ne. 0) then print *, ' fhypre_sstructvectorcopy error = ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_SStructVectorScale !-------------------------------------------------------------------------- subroutine fhypre_sstructvectorscale(falpha, fy) integer ierr integer*8 fy double precision falpha call HYPRE_SStructVectorScale(falpha, fy, ierr) if (ierr .ne. 0) then print *, ' fhypre_sstructvectorscale error = ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_SStructInnerProd !-------------------------------------------------------------------------- subroutine fhypre_sstructinnerprod(fx, fy, fresult) integer ierr integer*8 fx integer*8 fy double precision fresult call HYPRE_SStructInnerProd(fx, fy, fresult, ierr) if (ierr .ne. 0) then print *, ' fhypre_sstructinnerprod error = ', ierr endif return end !-------------------------------------------------------------------------- ! HYPRE_SStructAxpy !-------------------------------------------------------------------------- subroutine fhypre_sstructaxpy(falpha, fx, fy) integer ierr integer*8 fx integer*8 fy double precision falpha call HYPRE_SStructAxpy(falpha, fx, fy, ierr) if (ierr .ne. 0) then print *, ' fhypre_sstructaxpy error = ', ierr endif return end hypre-2.33.0/src/test/fstruct_ls.f000066400000000000000000002327441477326011500170550ustar00rootroot00000000000000! Copyright (c) 1998 Lawrence Livermore National Security, LLC and other ! HYPRE Project Developers. See the top-level COPYRIGHT file for details. ! ! SPDX-License-Identifier: (Apache-2.0 OR MIT) !*********************************************************************** ! Routines to test struct_ls fortran interfaces !*********************************************************************** !*********************************************************************** ! HYPRE_StructBiCGSTAB routines !*********************************************************************** !*********************************************************************** ! fhypre_structbicgstabcreate !*********************************************************************** subroutine fhypre_structbicgstabcreate(fcomm, fsolver) integer ierr integer fcomm integer*8 fsolver call HYPRE_StructBiCGSTABCreate(fcomm, fsolver, ierr) if (ierr .ne. 0) then print *, 'fhypre_structbicgstabcreate: err = ', ierr endif return end !*********************************************************************** ! fhypre_structbicgstabdestroy !*********************************************************************** subroutine fhypre_structbicgstabdestroy(fsolver) integer ierr integer*8 fsolver call HYPRE_StructBiCGSTABDestroy(fsolver, ierr) if (ierr .ne. 0) then print *, 'fhypre_structbicgstabdestroy: err = ', ierr endif return end !*********************************************************************** ! fhypre_structbicgstabsetup !*********************************************************************** subroutine fhypre_structbicgstabsetup(fsolver, fA, fb, fx) integer ierr integer*8 fsolver integer*8 fA integer*8 fb integer*8 fx call HYPRE_StructBiCGSTABSetup(fsolver, fA, fb, fx, ierr) if (ierr .ne. 0) then print *, 'fhypre_structbicgstabsetup: err = ', ierr endif return end !*********************************************************************** ! fhypre_structbicgstabsolve !*********************************************************************** subroutine fhypre_structbicgstabsolve(fsolver, fA, fb, fx) integer ierr integer*8 fsolver integer*8 fA integer*8 fb integer*8 fx call HYPRE_StructBiCGSTABSolve(fsolver, fA, fb, fx, ierr) if (ierr .ne. 0) then print *, 'fhypre_structbicgstabsolve: err = ', ierr endif return end !*********************************************************************** ! fhypre_structbicgstabsettol !*********************************************************************** subroutine fhypre_structbicgstabsettol(fsolver, ftol) integer ierr integer*8 fsolver double precision ftol call HYPRE_StructBiCGSTABSetTol(fsolver, ftol, ierr) if (ierr .ne. 0) then print *, 'fhypre_structbicgstabsettol: err = ', ierr endif return end !*********************************************************************** ! fhypre_structbicgstabsetmaxiter !*********************************************************************** subroutine fhypre_structbicgstabsetmaxiter(fsolver, fmaxiter) integer ierr integer fmaxiter integer*8 fsolver call HYPRE_StructBiCGSTABSetMaxIter(fsolver, fmaxiter, ierr) if (ierr .ne. 0) then print *, 'fhypre_structbicgstabsetmaxiter: err = ', ierr endif return end !*********************************************************************** ! fhypre_structbicgstabsetprecond !*********************************************************************** subroutine fhypre_structbicgstabsetprecond(fsolver, fprecond_id, 1 fprecond_solver) integer ierr integer*8 fsolver integer*8 fprecond_id integer*8 fprecond_solver call HYPRE_StructBiCGSTABSetPrecond(fsolver, fprecond_id, 1 fprecond_solver, ierr) if (ierr .ne. 0) then print *, 'fhypre_structbicgstabsetprecond: err = ', ierr endif return end !*********************************************************************** ! fhypre_structbicgstabsetlogging !*********************************************************************** subroutine fhypre_structbicgstabsetlogging(fsolver, flogging) integer ierr integer flogging integer*8 fsolver call HYPRE_StructBiCGSTABSetLogging(fsolver, flogging, ierr) if (ierr .ne. 0) then print *, 'fhypre_structbicgstabsetlogging: err = ', ierr endif return end !*********************************************************************** ! fhypre_structbicgstabsetprintlevel !*********************************************************************** subroutine fhypre_structbicgstabsetprintle(fsolver, fprintlev) integer ierr integer fprintlev integer*8 fsolver call HYPRE_StructBiCGSTABSetPrintLev(fsolver, fprintlev, ierr) if (ierr .ne. 0) then print *, 'fhypre_structbicgstabsetprintle: err = ', ierr endif return end !*********************************************************************** ! fhypre_structbicgstabgetnumiterations !*********************************************************************** subroutine fhypre_structbicgstabgetnumiter(fsolver, fnumiter) integer ierr integer fnumiter integer*8 fsolver call HYPRE_StructBiCGSTABGetNumItera(fsolver, fnumiter, ierr) if (ierr .ne. 0) then print *, 'fhypre_structbicgstabgetnumiter: err = ', ierr endif return end !*********************************************************************** ! fhypre_structbicgstabgetresidual !*********************************************************************** subroutine fhypre_structbicgstabgetresidua(fsolver, fresidual) integer ierr integer*8 fsolver double precision fresidual call HYPRE_StructBiCGSTABGetResidual(fsolver, fresidual, ierr) if (ierr .ne. 0) then print *, 'fhypre_structbicgstabgetresidua: err = ', ierr endif return end !*********************************************************************** ! fhypre_structbicgstabgetfinalrelativeresidualnorm !*********************************************************************** subroutine fhypre_structbicgstabgetfinalre(fsolver, fnorm) integer ierr integer*8 fsolver double precision fnorm call HYPRE_StructBiCGSTABGetFinalRel(fsolver, fnorm) if (ierr .ne. 0) then print *, 'fhypre_structbicgstabgetfinalre: err = ', ierr endif return end !*********************************************************************** ! HYPRE_StructGMRES routines !*********************************************************************** !*********************************************************************** ! fhypre_structgmrescreate !*********************************************************************** subroutine fhypre_structgmrescreate(fcomm, fsolver) integer ierr integer fcomm integer*8 fsolver call HYPRE_StructGMRESCreate(fcomm, fsolver, ierr) if (ierr .ne. 0) then print *, 'fhypre_structgmrescreate: err = ', ierr endif return end !*********************************************************************** ! fhypre_structgmresdestroy !*********************************************************************** subroutine fhypre_structgmresdestroy(fsolver) integer ierr integer*8 fsolver call HYPRE_StructGMRESDestroy(fsolver, ierr) if (ierr .ne. 0) then print *, 'fhypre_structgmresdestroy: err = ', ierr endif return end !*********************************************************************** ! fhypre_structgmressetup !*********************************************************************** subroutine fhypre_structgmressetup(fsolver, fA, fb, fx) integer ierr integer*8 fsolver integer*8 fA integer*8 fb integer*8 fx call HYPRE_StructGMRESSetup(fsolver, fA, fb, fx, ierr) if (ierr .ne. 0) then print *, 'fhypre_structgmressetup: err = ', ierr endif return end !*********************************************************************** ! fhypre_structgmressolve !*********************************************************************** subroutine fhypre_structgmressolve(fsolver, fA, fb, fx) integer ierr integer*8 fsolver integer*8 fA integer*8 fb integer*8 fx call HYPRE_StructGMRESSolve(fsolver, fA, fb, fx, ierr) if (ierr .ne. 0) then print *, 'fhypre_structgmressolve: err = ', ierr endif return end !*********************************************************************** ! fhypre_structgmressettol !*********************************************************************** subroutine fhypre_structgmressettol(fsolver, ftol) integer ierr integer*8 fsolver double precision ftol call HYPRE_StructGMRESSetTol(fsolver, ftol, ierr) if (ierr .ne. 0) then print *, 'fhypre_structgmressettol: err = ', ierr endif return end !*********************************************************************** ! fhypre_structgmressetmaxiter !*********************************************************************** subroutine fhypre_structgmressetmaxiter(fsolver, fmaxiter) integer ierr integer fmaxiter integer*8 fsolver call HYPRE_StructGMRESSetMaxIter(fsolver, fmaxiter, ierr) if (ierr .ne. 0) then print *, 'fhypre_structgmressetmaxiter: err = ', ierr endif return end !*********************************************************************** ! fhypre_structgmressetprecond !*********************************************************************** subroutine fhypre_structgmressetprecond(fsolver, fprecond_id, 1 fprecond_solver) integer ierr integer fprecond_id integer*8 fsolver integer*8 fprecond_solver call HYPRE_StructGMRESSetPrecond(fsolver, fprecond_id, 1 fprecond_solver, ierr) if (ierr .ne. 0) then print *, 'fhypre_structgmressetprecond: err = ', ierr endif return end !*********************************************************************** ! fhypre_structgmressetlogging !*********************************************************************** subroutine fhypre_structgmressetlogging(fsolver, flogging) integer ierr integer flogging integer*8 fsolver call HYPRE_StructGMRESSetLogging(fsolver, flogging, ierr) if (ierr .ne. 0) then print *, 'fhypre_structgmressetlogging: err = ', ierr endif return end !*********************************************************************** ! fhypre_structgmressetprintlevel !*********************************************************************** subroutine fhypre_structgmressetprintlevel(fsolver, fprintlevel) integer ierr integer fprintlevel integer*8 fsolver call HYPRE_StructGMRESSetPrintLevel(fsolver, fprint_level, ierr) if (ierr .ne. 0) then print *, 'fhypre_structgmressetprintlevel: err = ', ierr endif return end !*********************************************************************** ! fhypre_structgmresgetnumiterations !*********************************************************************** subroutine fhypre_structgmresgetnumiterati(fsolver, fnumiters) integer ierr integer fnumiters integer*8 fsolver call HYPRE_StructGMRESGetNumIteratio(fsolver, fnumiters, ierr) if (ierr .ne. 0) then print *, 'fhypre_structgmresgetnumiterati: err = ', ierr endif return end !*********************************************************************** ! fhypre_structgmresgetfinalrelativeresidualnorm !*********************************************************************** subroutine fhypre_structgmresgetfinalrelat(fsolver, fnorm) integer ierr integer*8 fsolver double precision fnorm call HYPRE_StructGMRESGetFinalRelati(fsolver, fnorm, ierr) if (ierr .ne. 0) then print *, 'fhypre_structgmresgetfinalrelat: err = ', ierr endif return end !*********************************************************************** ! HYPRE_StructHybrid routines !*********************************************************************** !*********************************************************************** ! fhypre_structhybridcreate !*********************************************************************** subroutine fhypre_structhybridcreate(fcomm, fsolver) integer ierr integer fcomm integer*8 fsolver call HYPRE_StructHybridCreate(fcomm, fsolver, ierr) if (ierr .ne. 0) then print *, 'fhypre_structhybridcreate: err = ', ierr endif return end !*********************************************************************** ! fhypre_structhybriddestroy !*********************************************************************** subroutine fhypre_structhybriddestroy(fsolver) integer ierr integer*8 fsolver call HYPRE_StructHybridDestroy(fsolver, ierr) if (ierr .ne. 0) then print *, 'fhypre_structhybriddestroy: err = ', ierr endif return end !*********************************************************************** ! fhypre_structhybridsetup !*********************************************************************** subroutine fhypre_structhybridsetup(fsolver, fA, fb, fx) integer ierr integer*8 fsolver integer*8 fA integer*8 fb integer*8 fx call HYPRE_StructHybridSetup(fsolver, fA, fb, fx, ierr) if (ierr .ne. 0) then print *, 'fhypre_structhybridsetup: err = ', ierr endif return end !*********************************************************************** ! fhypre_structhybridsolve !*********************************************************************** subroutine fhypre_structhybridsolve(fsolver, fA, fb, fx) integer ierr integer*8 fsolver integer*8 fA integer*8 fb integer*8 fx call HYPRE_StructHybridSolve(fsolver, fA, fb, fx, ierr) if (ierr .ne. 0) then print *, 'fhypre_structhybridsolve: err = ', ierr endif return end !*********************************************************************** ! fhypre_structhybridsetsolvertype !*********************************************************************** subroutine fhypre_structhybridsetsolvertyp(fsolver, fsolver_typ) integer ierr integer fsolver_typ integer*8 fsolver call HYPRE_StructHybridSetSolverType(fsolver, fsolver_typ, ierr) if (ierr .ne. 0) then print *, 'fhypre_structhybridsetsolvertyp: err = ', ierr endif return end !*********************************************************************** ! fhypre_structhybridsetstopcrit !*********************************************************************** subroutine fhypre_structhybridsetstopcrit(fsolver, fstop_crit) integer ierr integer fstop_crit integer*8 fsolver call HYPRE_StructHybridSetStopCrit(fsolver, fstop_crit, ierr) if (ierr .ne. 0) then print *, 'fhypre_structhybridsetstopcrit: err = ', ierr endif return end !*********************************************************************** ! fhypre_structhybridsetkdim !*********************************************************************** subroutine fhypre_structhybridsetkdim(fsolver, fkdim) integer ierr integer fkdim integer*8 fsolver call HYPRE_StructHybridSetKDim(fsolver, fkdim, ierr) if (ierr .ne. 0) then print *, 'fhypre_structhybridsetkdim: err = ', ierr endif return end !*********************************************************************** ! fhypre_structhybridsettol !*********************************************************************** subroutine fhypre_structhybridsettol(fsolver, ftol) integer ierr integer*8 fsolver double precision ftol call HYPRE_StructHybridSetTol(fsolver, ftol, ierr) if (ierr .ne. 0) then print *, 'fhypre_structhybridsettol: err = ', ierr endif return end !*********************************************************************** ! fhypre_structhybridsetconvergencetol !*********************************************************************** subroutine fhypre_structhybridsetconvergen(fsolver, fcftol) integer ierr integer*8 fsolver double precision fcftol call HYPRE_StructHybridSetConvergenc(fsolver, fcftol, ierr) if (ierr .ne. 0) then print *, 'fhypre_structhybridsetconvergen: err = ', ierr endif return end !*********************************************************************** ! fhypre_structhybridsetpcgabsolutetolfactor !*********************************************************************** subroutine fhypre_structhybridsetpcgabsolu(fsolver, fpcgtol) integer ierr integer*8 fsolver double precision fpcgtol call HYPRE_StructHybridSetPCGAbsolut(fsolver, fpcgtol, ierr) if (ierr .ne. 0) then print *, 'fhypre_structhybridsetpcgabsolu: err = ', ierr endif return end !*********************************************************************** ! fhypre_structhybridsetdscgmaxiter !*********************************************************************** subroutine fhypre_structhybridsetdscgmaxit(fsolver, fdscgmaxitr) integer ierr integer fdscgmaxitr integer*8 fsolver call HYPRE_StructHybridSetDSCGMaxIte(fsolver, fdscgmaxitr, ierr) if (ierr .ne. 0) then print *, 'fhypre_structhybridsetdscgmaxit: err = ', ierr endif return end !*********************************************************************** ! fhypre_structhybridsetpcgmaxiter !*********************************************************************** subroutine fhypre_structhybridsetpcgmaxite(fsolver, fpcgmaxitr) integer ierr integer fpcgmaxitr integer*8 fsolver call HYPRE_StructHybridSetPCGMaxIter(fsolver, fpcgmaxitr, ierr) if (ierr .ne. 0) then print *, 'fhypre_structhybridsetpcgmaxite: err = ', ierr endif return end !*********************************************************************** ! fhypre_structhybridsettwonorm !*********************************************************************** subroutine fhypre_structhybridsettwonorm(fsolver, ftwonorm) integer ierr integer ftwonorm integer*8 fsolver call HYPRE_StructHybridSetTwoNorm(fsolver, ftwonorm, ierr) if (ierr .ne. 0) then print *, 'fhypre_structhybridsettwonorm: err = ', ierr endif return end !*********************************************************************** ! fhypre_structhybridsetrelchange !*********************************************************************** subroutine fhypre_structhybridsetrelchange(fsolver, frelchng) integer ierr integer frelchng integer*8 fsolver call HYPRE_StructHybridSetRelChange(fsolver, frelchng, ierr) if (ierr .ne. 0) then print *, 'fhypre_structhybridsetrelchange: err = ', ierr endif return end !*********************************************************************** ! fhypre_structhybridsetprecond !*********************************************************************** subroutine fhypre_structhybridsetprecond(fsolver, fprecond_id, 1 fprecond) integer ierr integer fprecond_id integer*8 fsolver integer*8 fprecond call HYPRE_StructHybridSetPrecond(fsolver, fprecond_id, fprecond, 1 ierr) if (ierr .ne. 0) then print *, 'fhypre_structhybridsetprecond: err = ', ierr endif return end !*********************************************************************** ! fhypre_structhybridsetlogging !*********************************************************************** subroutine fhypre_structhybridsetlogging(fsolver, flogging) integer ierr integer flogging integer*8 fsolver call HYPRE_StructHybridSetLogging(fsolver, flogging, ierr) if (ierr .ne. 0) then print *, 'fhypre_structhybridsetlogging: err = ', ierr endif return end !*********************************************************************** ! fhypre_structhybridsetprintlevel !*********************************************************************** subroutine fhypre_structhybridsetprintleve(fsolver, fprntlvl) integer ierr integer fprntlvl integer*8 fsolver call HYPRE_StructHybridSetPrintLevel(fsolver, fprntlvl, ierr) if (ierr .ne. 0) then print *, 'fhypre_structhybridsetprintleve: err = ', ierr endif return end !*********************************************************************** ! fhypre_structhybridgetnumiterations !*********************************************************************** subroutine fhypre_structhybridgetnumiterat(fsolver, fnumits) integer ierr integer fnumits integer*8 fsolver call HYPRE_StructHybridGetNumIterati(fsolver, fnumits, ierr) if (ierr .ne. 0) then print *, 'fhypre_structhybridgetnumiterat: err = ', ierr endif return end !*********************************************************************** ! fhypre_structhybridgetdscgnumiterations !*********************************************************************** subroutine fhypre_structhybridgetdscgnumit(fsolver, fdscgnumits) integer ierr integer fdscgnumits integer*8 fsolver call HYPRE_StructHybridGetDSCGNumIte(fsolver, fdscgnumits, ierr) if (ierr .ne. 0) then print *, 'fhypre_structhybridgetdscgnumit: err = ', ierr endif return end !*********************************************************************** ! fhypre_structhybridgetpcgnumiterations !*********************************************************************** subroutine fhypre_structhybridgetpcgnumite(fsolver, fpcgnumits) integer ierr integer fpcgnumits integer*8 fsolver call HYPRE_StructHybridGetPCGNumIter(fsolver, fpcgnumits, ierr) if (ierr .ne. 0) then print *, 'fhypre_structhybridgetpcgnumite: err = ', ierr endif return end !*********************************************************************** ! fhypre_structhybridgetfinalrelativeresidualnorm !*********************************************************************** subroutine fhypre_structhybridgetfinalrela(fsolver, fnorm) integer ierr integer*8 fsolver double precision fnorm call HYPRE_StructHybridGetFinalRelat(fsolver, fnorm, ierr) if (ierr .ne. 0) then print *, 'fhypre_structhybridgetfinalrela: err = ', ierr endif return end !*********************************************************************** ! HYPRE_StructInterpreter routines !*********************************************************************** !*********************************************************************** ! fhypre_structvectorsetrandomvalues !*********************************************************************** subroutine fhypre_structvectorsetrandomvalu(fvector, fseed) integer ierr integer fseed integer*8 fvector call hypre_StructVectorSetRandomValu(fvector, fseed, ierr) if (ierr .ne. 0) then print *, 'fhypre_structvectorsetrandomvalues: err = ', ierr endif return end !*********************************************************************** ! fhypre_structsetrandomvalues !*********************************************************************** subroutine fhypre_structsetrandomvalues(fvector, fseed) integer ierr integer fseed integer*8 fvector call hypre_StructSetRandomValues(fvector, fseed, ierr) if (ierr .ne. 0) then print *, 'fhypre_structsetrandomvalues: err = ', ierr endif return end !*********************************************************************** ! fhypre_structsetupinterpreter !*********************************************************************** subroutine fhypre_structsetupinterpreter(fi) integer ierr integer*8 fi call HYPRE_StructSetupInterpreter(fi, ierr) if (ierr .ne. 0) then print *, 'fhypre_structsetupinterpreter: err = ', ierr endif return end !*********************************************************************** ! fhypre_structsetupmatvec !*********************************************************************** subroutine fhypre_structsetupmatvec(fmv) integer ierr integer*8 fmv call HYPRE_StructSetupMatvec(fmv, ierr) if (ierr .ne. 0) then print *, 'fhypre_structsetupmatvec: err = ', ierr endif return end !*********************************************************************** ! HYPRE_StructJacobi routines !*********************************************************************** !*********************************************************************** ! fhypre_structjacobicreate !*********************************************************************** subroutine fhypre_structjacobicreate(fcomm, fsolver) integer ierr integer fcomm integer*8 fsolver call HYPRE_StructJacobiCreate(fcomm, fsolver, ierr) if (ierr .ne. 0) then print *, 'fhypre_structjacobicreate: err = ', ierr endif return end !*********************************************************************** ! fhypre_structjacobidestroy !*********************************************************************** subroutine fhypre_structjacobidestroy(fsolver) integer ierr integer*8 fsolver call HYPRE_StructJacobiDestroy(fsolver, ierr) if (ierr .ne. 0) then print *, 'fhypre_structjacobidestroy: err = ', ierr endif return end !*********************************************************************** ! fhypre_structjacobisetup !*********************************************************************** subroutine fhypre_structjacobisetup(fsolver, fA, fb, fx) integer ierr integer*8 fsolver integer*8 fA integer*8 fb integer*8 fx call HYPRE_StructJacobiSetup(fsolver, fA, fb, fx, ierr) if (ierr .ne. 0) then print *, 'fhypre_structjacobisetup: err = ', ierr endif return end !*********************************************************************** ! fhypre_structjacobisolve !*********************************************************************** subroutine fhypre_structjacobisolve(fsolver, fA, fb, fx) integer ierr integer*8 fsolver integer*8 fA integer*8 fb integer*8 fx call HYPRE_StructJacobiSolve(fsolver, fA, fb, fx, ierr) if (ierr .ne. 0) then print *, 'fhypre_structjacobisolve: err = ', ierr endif return end !*********************************************************************** ! fhypre_structjacobisettol !*********************************************************************** subroutine fhypre_structjacobisettol(fsolver, ftol) integer ierr integer*8 fsolver double precision ftol call HYPRE_StructJacobiSetTol(fsolver, ftol, ierr) if (ierr .ne. 0) then print *, 'fhypre_structjacobisettol: err = ', ierr endif return end !*********************************************************************** ! fhypre_structjacobigettol !*********************************************************************** subroutine fhypre_structjacobigettol(fsolver, ftol) integer ierr integer*8 fsolver double precision ftol call HYPRE_StructJacobiGetTol(fsolver, ftol, ierr) if (ierr .ne. 0) then print *, 'fhypre_structjacobigettol: err = ', ierr endif return end !*********************************************************************** ! fhypre_structjacobisetmaxiter !*********************************************************************** subroutine fhypre_structjacobisetmaxiter(fsolver, fmaxiter) integer ierr integer fmaxiter integer*8 fsolver call HYPRE_StructJacobiSetMaxIter(fsolver, fmaxiter, ierr) if (ierr .ne. 0) then print *, 'fhypre_structjacobisetmaxiter: err = ', ierr endif return end !*********************************************************************** ! fhypre_structjacobigetmaxiter !*********************************************************************** subroutine fhypre_structjacobigetmaxiter(fsolver, fmaxiter) integer ierr integer fmaxiter integer*8 fsolver call HYPRE_StructJacobiGetMaxIter(fsolver, fmaxiter, ierr) if (ierr .ne. 0) then print *, 'fhypre_structjacobigetmaxiter: err = ', ierr endif return end !*********************************************************************** ! fhypre_structjacobisetzeroguess !*********************************************************************** subroutine fhypre_structjacobisetzeroguess(fsolver) integer ierr integer*8 fsolver call HYPRE_StructJacobiSetZeroGuess(fsolver, ierr) if (ierr .ne. 0) then print *, 'fhypre_structjacobisetzeroguess: err = ', ierr endif return end !*********************************************************************** ! fhypre_structjacobigetzeroguess !*********************************************************************** subroutine fhypre_structjacobigetzeroguess(fsolver) integer ierr integer*8 fsolver call HYPRE_StructJacobiGetZeroGuess(fsolver, ierr) if (ierr .ne. 0) then print *, 'fhypre_structjacobigetzeroguess: err = ', ierr endif return end !*********************************************************************** ! fhypre_structjacobisetnonzeroguess !*********************************************************************** subroutine fhypre_structjacobisetnonzerogu(fsolver) integer ierr integer*8 fsolver call HYPRE_StructJacobiSetNonZeroGue(fsolver, ierr) if (ierr .ne. 0) then print *, 'fhypre_structjacobisetnonzerogu: err = ', ierr endif return end !*********************************************************************** ! fhypre_structjacobigetnumiterations !*********************************************************************** subroutine fhypre_structjacobigetnumiterat(fsolver, fnumiters) integer ierr integer fnumiters integer*8 fsolver call HYPRE_StructJacobiGetNumIterati(fsolver, fnumiters, ierr) if (ierr .ne. 0) then print *, 'fhypre_structjacobigetnumiterat: err = ', ierr endif return end !*********************************************************************** ! fhypre_structjacobigetfinalrelativeresidualnorm !*********************************************************************** subroutine fhypre_structjacobigetfinalrela(fsolver, fnorm) integer ierr integer*8 fsolver double precision fnorm call HYPRE_StructJacobiGetFinalRelat(fsolver, fnorm, ierr) if (ierr .ne. 0) then print *, 'fhypre_structjacobigetfinalrela: err = ', ierr endif return end !*********************************************************************** ! HYPRE_StructPCG routines !*********************************************************************** !*********************************************************************** ! fhypre_structpcgcreate !*********************************************************************** subroutine fhypre_structpcgcreate(fcomm, fsolver) integer ierr integer fcomm integer*8 fsolver call HYPRE_StructPCGCreate(fcomm, fsolver, ierr) if (ierr .ne. 0) then print *, 'fhypre_structpcgcreate: err = ', ierr endif return end !*********************************************************************** ! fhypre_structpcgdestroy !*********************************************************************** subroutine fhypre_structpcgdestroy(fsolver) integer ierr integer*8 fsolver call HYPRE_StructPCGDestroy(fsolver, ierr) if (ierr .ne. 0) then print *, 'fhypre_structpcgdestroy: err = ', ierr endif return end !*********************************************************************** ! fhypre_structpcgsetup !*********************************************************************** subroutine fhypre_structpcgsetup(fsolver, fA, fb, fx) integer ierr integer*8 fsolver integer*8 fA integer*8 fb integer*8 fx call HYPRE_StructPCGSetup(fsolver, fA, fb, fx, ierr) if (ierr .ne. 0) then print *, 'fhypre_structpcgsetup: err = ', ierr endif return end !*********************************************************************** ! fhypre_structpcgsolve !*********************************************************************** subroutine fhypre_structpcgsolve(fsolver, fA, fb, fx) integer ierr integer*8 fsolver integer*8 fA integer*8 fb integer*8 fx call HYPRE_StructPCGSolve(fsolver, fA, fb, fx, ierr) if (ierr .ne. 0) then print *, 'fhypre_structpcgsolve: err = ', ierr endif return end !*********************************************************************** ! fhypre_structpcgsettol !*********************************************************************** subroutine fhypre_structpcgsettol(fsolver, ftol) integer ierr integer*8 fsolver double precision ftol call HYPRE_StructPCGSetTol(fsolver, ftol, ierr) if (ierr .ne. 0) then print *, 'fhypre_structpcgsettol: err = ', ierr endif return end !*********************************************************************** ! fhypre_structpcgsetmaxiter !*********************************************************************** subroutine fhypre_structpcgsetmaxiter(fsolver, fmaxiter) integer ierr integer fmaxiter integer*8 fsolver call HYPRE_StructPCGSetMaxIter(fsolver, fmaxiter, ierr) if (ierr .ne. 0) then print *, 'fhypre_structpcgsetmaxiter: err = ', ierr endif return end !*********************************************************************** ! fhypre_structpcgsettwonorm !*********************************************************************** subroutine fhypre_structpcgsettwonorm(fsolver, ftwonorm) integer ierr integer ftwonorm integer*8 fsolver call HYPRE_StructPCGSetTwoNorm(fsolver, ftwonorm, ierr) if (ierr .ne. 0) then print *, 'fhypre_structpcgsettwonorm: err = ', ierr endif return end !*********************************************************************** ! fhypre_structpcgsetrelchange !*********************************************************************** subroutine fhypre_structpcgsetrelchange(fsolver, frelchng) integer ierr integer frelchng integer*8 fsolver call HYPRE_StructPCGSetRelChange(fsolver, frelchng, ierr) if (ierr .ne. 0) then print *, 'fhypre_structpcgsetrelchange: err = ', ierr endif return end !*********************************************************************** ! fhypre_structpcgsetprecond !*********************************************************************** subroutine fhypre_structpcgsetprecond(fsolver, fprecond_id, 1 fprecond) integer ierr integer fprecond_id integer*8 fsolver integer*8 fprecond call HYPRE_StructPCGSetPrecond(fsolver, fprecond_id, fprecond, 1 ierr) if (ierr .ne. 0) then print *, 'fhypre_structpcgsetprecond: err = ', ierr endif return end !*********************************************************************** ! fhypre_structpcgsetlogging !*********************************************************************** subroutine fhypre_structpcgsetlogging(fsolver, flogging) integer ierr integer flogging integer*8 fsolver call HYPRE_StructPCGSetLogging(fsolver, flogging, ierr) if (ierr .ne. 0) then print *, 'fhypre_structpcgsetlogging: err = ', ierr endif return end !*********************************************************************** ! fhypre_structpcgsetprintlevel !*********************************************************************** subroutine fhypre_structpcgsetprintlevel(fsolver, fprntlvl) integer ierr integer fprntlvl integer*8 fsolver call HYPRE_StructPCGSetPrintLevel(fsolver, fprntlvl, ierr) if (ierr .ne. 0) then print *, 'fhypre_structpcgsetprintlevel: err = ', ierr endif return end !*********************************************************************** ! fhypre_structpcggetnumiterations !*********************************************************************** subroutine fhypre_structpcggetnumiteration(fsolver, fnumiters) integer ierr integer fnumiters integer*8 fsolver call HYPRE_StructPCGGetNumIterations(fsolver, fnumiters, ierr) if (ierr .ne. 0) then print *, 'fhypre_structpcggetnumiteration: err = ', ierr endif return end !*********************************************************************** ! fhypre_structpcggetfinalrelativeresidualnorm !*********************************************************************** subroutine fhypre_structpcggetfinalrelativ(fsolver, fnorm) integer ierr integer*8 fsolver double precision fnorm call HYPRE_StructPCGGetFinalRelative(fsolver, fnorm, ierr) if (ierr .ne. 0) then print *, 'fhypre_structjacobigetfinalrelativ: err = ', ierr endif return end !*********************************************************************** ! fhypre_structdiagscalesetup !*********************************************************************** subroutine fhypre_structdiagscalesetup(fsolver, fA, fb, fx) integer ierr integer*8 fsolver integer*8 fA integer*8 fb integer*8 fx call HYPRE_StructDiagScaleSetup(fsolver, fA, fb, fx, ierr) if (ierr .ne. 0) then print *, 'fhypre_structdiagscalesetup: err = ', ierr endif return end !*********************************************************************** ! fhypre_structdiagscale !*********************************************************************** subroutine fhypre_structdiagscale(fsolver, fA, fb, fx) integer ierr integer*8 fsolver integer*8 fA integer*8 fb integer*8 fx call HYPRE_StructDiagScale(fsolver, fA, fb, fx, ierr) if (ierr .ne. 0) then print *, 'fhypre_structdiagscale: err = ', ierr endif return end !*********************************************************************** ! HYPRE_StructPFMG routines !*********************************************************************** !*********************************************************************** ! fhypre_structpfmgcreate !*********************************************************************** subroutine fhypre_structpfmgcreate(fcomm, fsolver) integer ierr integer fcomm integer*8 fsolver call HYPRE_StructPFMGCreate(fcomm, fsolver, ierr) if (ierr .ne. 0) then print *, 'fhypre_structpfmgcreate: err = ', ierr endif return end !*********************************************************************** ! fhypre_structpfmgdestroy !*********************************************************************** subroutine fhypre_structpfmgdestroy(fsolver) integer ierr integer*8 fsolver call HYPRE_StructPFMGDestroy(fsolver, ierr) if (ierr .ne. 0) then print *, 'fhypre_structpfmgdestroy: err = ', ierr endif return end !*********************************************************************** ! fhypre_structpfmgsetup !*********************************************************************** subroutine fhypre_structpfmgsetup(fsolver, fA, fb, fx) integer ierr integer*8 fsolver integer*8 fA integer*8 fb integer*8 fx call HYPRE_StructPFMGSetup(fsolver, fA, fb, fx, ierr) if (ierr .ne. 0) then print *, 'fhypre_structpfmgsetup: err = ', ierr endif return end !*********************************************************************** ! fhypre_structpfmgsolve !*********************************************************************** subroutine fhypre_structpfmgsolve(fsolver, fA, fb, fx) integer ierr integer*8 fsolver integer*8 fA integer*8 fb integer*8 fx call HYPRE_StructPFMGSolve(fsolver, fA, fb, fx, ierr) if (ierr .ne. 0) then print *, 'fhypre_structpfmgsolve: err = ', ierr endif return end !*********************************************************************** ! fhypre_structpfmgsettol !*********************************************************************** subroutine fhypre_structpfmgsettol(fsolver, ftol) integer ierr integer*8 fsolver double precision ftol call HYPRE_StructPFMGSetTol(fsolver, ftol, ierr) if (ierr .ne. 0) then print *, 'fhypre_structpfmgsettol: err = ', ierr endif return end !*********************************************************************** ! fhypre_structpfmggettol !*********************************************************************** subroutine fhypre_structpfmggettol(fsolver, ftol) integer ierr integer*8 fsolver double precision ftol call HYPRE_StructPFMGGetTol(fsolver, ftol, ierr) if (ierr .ne. 0) then print *, 'fhypre_structpfmggettol: err = ', ierr endif return end !*********************************************************************** ! fhypre_structpfmgsetmaxiter !*********************************************************************** subroutine fhypre_structpfmgsetmaxiter(fsolver, fmaxiter) integer ierr integer fmaxiter integer*8 fsolver call HYPRE_StructPFMGSetMaxIter(fsolver, fmaxiter, ierr) if (ierr .ne. 0) then print *, 'fhypre_structpfmgsetmaxiter: err = ', ierr endif return end !*********************************************************************** ! fhypre_structpfmggetmaxiter !*********************************************************************** subroutine fhypre_structpfmggetmaxiter(fsolver, fmaxiter) integer ierr integer fmaxiter integer*8 fsolver call HYPRE_StructPFMGGetMaxIter(fsolver, fmaxiter, ierr) if (ierr .ne. 0) then print *, 'fhypre_structpfmggetmaxiter: err = ', ierr endif return end !*********************************************************************** ! fhypre_structpfmgsetmaxlevels !*********************************************************************** subroutine fhypre_structpfmgsetmaxlevels(fsolver, fmaxlevels) integer ierr integer fmaxlevels integer*8 fsolver call HYPRE_StructPFMGSetMaxLevels(fsolver, fmaxlevels, ierr) if (ierr .ne. 0) then print *, 'fhypre_structpfmgsetmaxlevels: err = ', ierr endif return end !*********************************************************************** ! fhypre_structpfmggetmaxlevels !*********************************************************************** subroutine fhypre_structpfmggetmaxlevels(fsolver, fmaxlevels) integer ierr integer fmaxlevels integer*8 fsolver call HYPRE_StructPFMGGetMaxLevels(fsolver, fmaxlevels, ierr) if (ierr .ne. 0) then print *, 'fhypre_structpfmggetmaxlevels: err = ', ierr endif return end !*********************************************************************** ! fhypre_structpfmgsetrelchange !*********************************************************************** subroutine fhypre_structpfmgsetrelchange(fsolver, frelchange) integer ierr integer frelchange integer*8 fsolver call HYPRE_StructPFMGSetRelChange(fsolver, frelchange, ierr) if (ierr .ne. 0) then print *, 'fhypre_structpfmgsetrelchange: err = ', ierr endif return end !*********************************************************************** ! fhypre_structpfmggetrelchange !*********************************************************************** subroutine fhypre_structpfmggetrelchange(fsolver, frelchange) integer ierr integer frelchange integer*8 fsolver call HYPRE_StructPFMGGetRelChange(fsolver, frelchange, ierr) if (ierr .ne. 0) then print *, 'fhypre_structpfmggetrelchange: err = ', ierr endif return end !*********************************************************************** ! fhypre_structpfmgsetzeroguess !*********************************************************************** subroutine fhypre_structpfmgsetzeroguess(fsolver) integer ierr integer*8 fsolver call HYPRE_StructPFMGSetZeroGuess(fsolver, ierr) if (ierr .ne. 0) then print *, 'fhypre_structpfmgsetzeroguess: err = ', ierr endif return end !*********************************************************************** ! fhypre_structpfmggetzeroguess !*********************************************************************** subroutine fhypre_structpfmggetzeroguess(fsolver) integer ierr integer*8 fsolver call HYPRE_StructPFMGGetZeroGuess(fsolver, ierr) if (ierr .ne. 0) then print *, 'fhypre_structpfmggetzeroguess: err = ', ierr endif return end !*********************************************************************** ! fhypre_structpfmgsetnonzeroguess !*********************************************************************** subroutine fhypre_structpfmgsetnonzerogues(fsolver) integer ierr integer*8 fsolver call HYPRE_StructPFMGSetNonZeroGuess(fsolver, ierr) if (ierr .ne. 0) then print *, 'fhypre_structpfmgsetnonzerogues: err = ', ierr endif return end !*********************************************************************** ! fhypre_structpfmggetnumiterations !*********************************************************************** subroutine fhypre_structpfmggetnumiteratio(fsolver, fnumiters) integer ierr integer fnumiters integer*8 fsolver call HYPRE_StructPFMGGetNumIteration(fsolver, fnumiters, ierr) if (ierr .ne. 0) then print *, 'fhypre_structpfmggetnumiteratio: err = ', ierr endif return end !*********************************************************************** ! fhypre_structpfmggetfinalrelativeresidualnorm !*********************************************************************** subroutine fhypre_structpfmggetfinalrelati(fsolver, fnorm) integer ierr integer*8 fsolver double precision fnorm call HYPRE_StructPFMGGetFinalRelativ(fsolver, fnorm, ierr) if (ierr .ne. 0) then print *, 'fhypre_structpfmggetfinalrelati: err = ', ierr endif return end !*********************************************************************** ! fhypre_structpfmgsetskiprelax !*********************************************************************** subroutine fhypre_structpfmgsetskiprelax(fsolver, fskiprelax) integer ierr integer fskiprelax integer*8 fsolver call HYPRE_StructPFMGSetSkipRelax(fsolver, fskiprelax, ierr) if (ierr .ne. 0) then print *, 'fhypre_structpfmgsetskiprelax: err = ', ierr endif return end !*********************************************************************** ! fhypre_structpfmggetskiprelax !*********************************************************************** subroutine fhypre_structpfmggetskiprelax(fsolver, fskiprelax) integer ierr integer fskiprelax integer*8 fsolver call HYPRE_StructPFMGGetSkipRelax(fsolver, fskiprelax, ierr) if (ierr .ne. 0) then print *, 'fhypre_structpfmggetskiprelax: err = ', ierr endif return end !*********************************************************************** ! fhypre_structpfmgsetrelaxtype !*********************************************************************** subroutine fhypre_structpfmgsetrelaxtype(fsolver, frelaxtype) integer ierr integer frelaxtype integer*8 fsolver call HYPRE_StructPFMGSetRelaxType(fsolver, frelaxtype, ierr) if (ierr .ne. 0) then print *, 'fhypre_structpfmgsetrelaxtype: err = ', ierr endif return end !*********************************************************************** ! fhypre_structpfmggetrelaxtype !*********************************************************************** subroutine fhypre_structpfmggetrelaxtype(fsolver, frelaxtype) integer ierr integer frelaxtype integer*8 fsolver call HYPRE_StructPFMGGetRelaxType(fsolver, frelaxtype, ierr) if (ierr .ne. 0) then print *, 'fhypre_structpfmggetrelaxtype: err = ', ierr endif return end !*********************************************************************** ! fhypre_structpfmgsetraptype !*********************************************************************** subroutine fhypre_structpfmgsetraptype(fsolver, fraptype) integer ierr integer fraptype integer*8 fsolver call HYPRE_StructPFMGSetRAPType(fsolver, fraptype, ierr) if (ierr .ne. 0) then print *, 'fhypre_structpfmgsetraptype: err = ', ierr endif return end !*********************************************************************** ! fhypre_structpfmggetraptype !*********************************************************************** subroutine fhypre_structpfmggetraptype(fsolver, fraptype) integer ierr integer fraptype integer*8 fsolver call HYPRE_StructPFMGGetRAPType(fsolver, fraptype, ierr) if (ierr .ne. 0) then print *, 'fhypre_structpfmggetraptype: err = ', ierr endif return end !*********************************************************************** ! fhypre_structpfmgsetnumprerelax !*********************************************************************** subroutine fhypre_structpfmgsetnumprerelax(fsolver, 1 fnumprerelax) integer ierr integer fnumprerelax integer*8 fsolver call HYPRE_StructPFMGSetNumPreRelax(fsolver, fnumprerelax, ierr) if (ierr .ne. 0) then print *, 'fhypre_structpfmgsetnumprerelax: err = ', ierr endif return end !*********************************************************************** ! fhypre_structpfmggetnumprerelax !*********************************************************************** subroutine fhypre_structpfmggetnumprerelax(fsolver, 1 fnumprerelax) integer ierr integer fnumprerelax integer*8 fsolver call HYPRE_StructPFMGGetNumPreRelax(fsolver, fnumprerelax, ierr) if (ierr .ne. 0) then print *, 'fhypre_structpfmggetnumprerelax: err = ', ierr endif return end !*********************************************************************** ! fhypre_structpfmgsetnumpostrelax !*********************************************************************** subroutine fhypre_structpfmgsetnumpostrela(fsolver, 1 fnumpostrelax) integer ierr integer fnumpostrelax integer*8 fsolver call HYPRE_StructPFMGSetNumPostRelax(fsolver, fnumpostrelax, ierr) if (ierr .ne. 0) then print *, 'fhypre_structpfmgsetnumpostrela: err = ', ierr endif return end !*********************************************************************** ! fhypre_structpfmggetnumpostrelax !*********************************************************************** subroutine fhypre_structpfmggetnumpostrela(fsolver, 1 fnumpostrelax) integer ierr integer fnumpostrelax integer*8 fsolver call HYPRE_StructPFMGGetNumPostRelax(fsolver, fnumpostrelax, ierr) if (ierr .ne. 0) then print *, 'fhypre_structpfmggetnumpostrela: err = ', ierr endif return end !*********************************************************************** ! fhypre_structpfmgsetdxyz !*********************************************************************** subroutine fhypre_structpfmgsetdxyz(fsolver, fdxyz) integer ierr integer*8 fsolver double precision fdxyz call HYPRE_StructPFMGSetDxyz(fsolver, fdxyz, ierr) if (ierr .ne. 0) then print *, 'fhypre_structpfmgsetdxyz: err = ', ierr endif return end !*********************************************************************** ! fhypre_structpfmgsetlogging !*********************************************************************** subroutine fhypre_structpfmgsetlogging(fsolver, flogging) integer ierr integer flogging integer*8 fsolver call HYPRE_StructPFMGSetLogging(fsolver, flogging, ierr) if (ierr .ne. 0) then print *, 'fhypre_structpfmgsetlogging: err = ', ierr endif return end !*********************************************************************** ! fhypre_structpfmggetlogging !*********************************************************************** subroutine fhypre_structpfmggetlogging(fsolver, flogging) integer ierr integer flogging integer*8 fsolver call HYPRE_StructPFMGGetLogging(fsolver, flogging, ierr) if (ierr .ne. 0) then print *, 'fhypre_structpfmggetlogging: err = ', ierr endif return end !*********************************************************************** ! fhypre_structpfmgsetprintlevel !*********************************************************************** subroutine fhypre_structpfmgsetprintlevel(fsolver, fprintlevel) integer ierr integer fprintlevel integer*8 fsolver call HYPRE_StructPFMGSetPrintLevel(fsolver, fprintlevel, ierr) if (ierr .ne. 0) then print *, 'fhypre_structpfmgsetprintlevel: err = ', ierr endif return end !*********************************************************************** ! fhypre_structpfmggetprintlevel !*********************************************************************** subroutine fhypre_structpfmggetprintlevel(fsolver, fprintlevel) integer ierr integer fprintlevel integer*8 fsolver call HYPRE_StructPFMGGetPrintLevel(fsolver, fprintlevel, ierr) if (ierr .ne. 0) then print *, 'fhypre_structpfmggetprintlevel: err = ', ierr endif return end !*********************************************************************** ! HYPRE_StructSMG routines !*********************************************************************** !*********************************************************************** ! fhypre_structsmgcreate !*********************************************************************** subroutine fhypre_structsmgcreate(fcomm, fsolver) integer ierr integer fcomm integer*8 fsolver call HYPRE_StructSMGCreate(fcomm, fsolver, ierr) if (ierr .ne. 0) then print *, 'fhypre_structsmgcreate: err = ', ierr endif return end !*********************************************************************** ! fhypre_structsmgdestroy !*********************************************************************** subroutine fhypre_structsmgdestroy(fsolver) integer ierr integer*8 fsolver call HYPRE_StructSMGDestroy(fsolver, ierr) if (ierr .ne. 0) then print *, 'fhypre_structsmgdestroy: err = ', ierr endif return end !*********************************************************************** ! fhypre_structsmgsetup !*********************************************************************** subroutine fhypre_structsmgsetup(fsolver, fA, fb, fx) integer ierr integer*8 fsolver integer*8 fA integer*8 fb integer*8 fx call HYPRE_StructSMGSetup(fsolver, fA, fb, fx, ierr) if (ierr .ne. 0) then print *, 'fhypre_structsmgsetup: err = ', ierr endif return end !*********************************************************************** ! fhypre_structsmgsolve !*********************************************************************** subroutine fhypre_structsmgsolve(fsolver, fA, fb, fx) integer ierr integer*8 fsolver integer*8 fA integer*8 fb integer*8 fx call HYPRE_StructSMGSolve(fsolver, fA, fb, fx, ierr) if (ierr .ne. 0) then print *, 'fhypre_structsmgsolve: err = ', ierr endif return end !*********************************************************************** ! fhypre_structsmgsetmemoryuse !*********************************************************************** subroutine fhypre_structsmgsetmemoryuse(fsolver, fmemuse) integer ierr integer fmemuse integer*8 fsolver call HYPRE_StructSMGSetMemoryUse(fsolver, fmemuse, ierr) if (ierr .ne. 0) then print *, 'fhypre_structsmgsetmemoryuse: err = ', ierr endif return end !*********************************************************************** ! fhypre_structsmggetmemoryuse !*********************************************************************** subroutine fhypre_structsmggetmemoryuse(fsolver, fmemuse) integer ierr integer fmemuse integer*8 fsolver call HYPRE_StructSMGGetMemoryUse(fsolver, fmemuse, ierr) if (ierr .ne. 0) then print *, 'fhypre_structsmggetmemoryuse: err = ', ierr endif return end !*********************************************************************** ! fhypre_structsmgsettol !*********************************************************************** subroutine fhypre_structsmgsettol(fsolver, ftol) integer ierr integer*8 fsolver double precision ftol call HYPRE_StructSMGSetTol(fsolver, ftol, ierr) if (ierr .ne. 0) then print *, 'fhypre_structsmgsettol: err = ', ierr endif return end !*********************************************************************** ! fhypre_structsmggettol !*********************************************************************** subroutine fhypre_structsmggettol(fsolver, ftol) integer ierr integer*8 fsolver double precision ftol call HYPRE_StructSMGGetTol(fsolver, ftol, ierr) if (ierr .ne. 0) then print *, 'fhypre_structsmggettol: err = ', ierr endif return end !*********************************************************************** ! fhypre_structsmgsetmaxiter !*********************************************************************** subroutine fhypre_structsmgsetmaxiter(fsolver, fmaxiter) integer ierr integer fmaxiter integer*8 fsolver call HYPRE_StructSMGSetMaxIter(fsolver, fmaxiter, ierr) if (ierr .ne. 0) then print *, 'fhypre_structsmgsetmaxiter: err = ', ierr endif return end !*********************************************************************** ! fhypre_structsmggetmaxiter !*********************************************************************** subroutine fhypre_structsmggetmaxiter(fsolver, fmaxiter) integer ierr integer fmaxiter integer*8 fsolver call HYPRE_StructSMGGetMaxIter(fsolver, fmaxiter, ierr) if (ierr .ne. 0) then print *, 'fhypre_structsmggetmaxiter: err = ', ierr endif return end !*********************************************************************** ! fhypre_structsmgsetrelchange !*********************************************************************** subroutine fhypre_structsmgsetrelchange(fsolver, frelchange) integer ierr integer frelchange integer*8 fsolver call HYPRE_StructSMGSetRelChange(fsolver, frelchange, ierr) if (ierr .ne. 0) then print *, 'fhypre_structsmgsetrelchange: err = ', ierr endif return end !*********************************************************************** ! fhypre_structsmggetrelchange !*********************************************************************** subroutine fhypre_structsmggetrelchange(fsolver, frelchange) integer ierr integer frelchange integer*8 fsolver call HYPRE_StructSMGGetRelChange(fsolver, frelchange, ierr) if (ierr .ne. 0) then print *, 'fhypre_structsmggetrelchange: err = ', ierr endif return end !*********************************************************************** ! fhypre_structsmgsetzeroguess !*********************************************************************** subroutine fhypre_structsmgsetzeroguess(fsolver) integer ierr integer*8 fsolver call HYPRE_StructSMGSetZeroGuess(fsolver, ierr) if (ierr .ne. 0) then print *, 'fhypre_structsmgsetzeroguess: err = ', ierr endif return end !*********************************************************************** ! fhypre_structsmggetzeroguess !*********************************************************************** subroutine fhypre_structsmggetzeroguess(fsolver) integer ierr integer*8 fsolver call HYPRE_StructSMGGetZeroGuess(fsolver, ierr) if (ierr .ne. 0) then print *, 'fhypre_structsmggetzeroguess: err = ', ierr endif return end !*********************************************************************** ! fhypre_structsmgsetnonzeroguess !*********************************************************************** subroutine fhypre_structsmgsetnonzeroguess(fsolver) integer ierr integer*8 fsolver call HYPRE_StructSMGSetNonZeroGuess(fsolver, ierr) if (ierr .ne. 0) then print *, 'fhypre_structsmgsetnonzeroguess: err = ', ierr endif return end !*********************************************************************** ! fhypre_structsmggetnumiterations !*********************************************************************** subroutine fhypre_structsmggetnumiteration(fsolver, fnumiters) integer ierr integer fnumiters integer*8 fsolver call HYPRE_StructSMGGetNumIterations(fsolver, fnumiters, ierr) if (ierr .ne. 0) then print *, 'fhypre_structsmggetnumiteration: err = ', ierr endif return end !*********************************************************************** ! fhypre_structsmggetfinalrelativeresidualnorm !*********************************************************************** subroutine fhypre_structsmggetfinalrelativ(fsolver, fnorm) integer ierr integer*8 fsolver double precision fnorm call HYPRE_StructSMGGetFinalRelative(fsolver, fnorm, ierr) if (ierr .ne. 0) then print *, 'fhypre_structsmggetfinalrelativ: err = ', ierr endif return end !*********************************************************************** ! fhypre_structsmgsetnumprerelax !*********************************************************************** subroutine fhypre_structsmgsetnumprerelax(fsolver, fnumprerelax) integer ierr integer fnumprerelax integer*8 fsolver call HYPRE_StructSMGSetNumPreRelax(fsolver, fnumprerelax, ierr) if (ierr .ne. 0) then print *, 'fhypre_structsmgsetnumprerelax: err = ', ierr endif return end !*********************************************************************** ! fhypre_structsmggetnumprerelax !*********************************************************************** subroutine fhypre_structsmggetnumprerelax(fsolver, fnumprerelax) integer ierr integer fnumprerelax integer*8 fsolver call HYPRE_StructSMGGetNumPreRelax(fsolver, fnumprerelax, ierr) if (ierr .ne. 0) then print *, 'fhypre_structsmggetnumprerelax: err = ', ierr endif return end !*********************************************************************** ! fhypre_structsmgsetnumpostrelax !*********************************************************************** subroutine fhypre_structsmgsetnumpostrelax(fsolver, fnumpstrlx) integer ierr integer fnumpstrlx integer*8 fsolver call HYPRE_StructSMGSetNumPostRelax(fsolver, fnumpstrlx, ierr) if (ierr .ne. 0) then print *, 'fhypre_structsmgsetnumpostrelax: err = ', ierr endif return end !*********************************************************************** ! fhypre_structsmggetnumpostrelax !*********************************************************************** subroutine fhypre_structsmggetnumpostrelax(fsolver, fnumpstrlx) integer ierr integer fnumpstrlx integer*8 fsolver call HYPRE_StructSMGGetNumPostRelax(fsolver, fnumpstrlx, ierr) if (ierr .ne. 0) then print *, 'fhypre_structsmggetnumpostrelax: err = ', ierr endif return end !*********************************************************************** ! fhypre_structsmgsetlogging !*********************************************************************** subroutine fhypre_structsmgsetlogging(fsolver, flogging) integer ierr integer flogging integer*8 fsolver call HYPRE_StructSMGSetLogging(fsolver, flogging, ierr) if (ierr .ne. 0) then print *, 'fhypre_structsmgsetlogging: err = ', ierr endif return end !*********************************************************************** ! fhypre_structsmggetlogging !*********************************************************************** subroutine fhypre_structsmggetlogging(fsolver, flogging) integer ierr integer flogging integer*8 fsolver call HYPRE_StructSMGGetLogging(fsolver, flogging, ierr) if (ierr .ne. 0) then print *, 'fhypre_structsmggetlogging: err = ', ierr endif return end !*********************************************************************** ! fhypre_structsmgsetprintlevel !*********************************************************************** subroutine fhypre_structsmgsetprintlevel(fsolver, fprintlevel) integer ierr integer fprintlevel integer*8 fsolver call HYPRE_StructSMGSetPrintLevel(fsolver, fprintlevel, ierr) if (ierr .ne. 0) then print *, 'fhypre_structsmgsetprintlevel: err = ', ierr endif return end !*********************************************************************** ! fhypre_structsmggetprintlevel !*********************************************************************** subroutine fhypre_structsmggetprintlevel(fsolver, fprintlevel) integer ierr integer fprintlevel integer*8 fsolver call HYPRE_StructSMGGetPrintLevel(fsolver, fprintlevel, ierr) if (ierr .ne. 0) then print *, 'fhypre_structsmggetprintlevel: err = ', ierr endif return end !*********************************************************************** ! HYPRE_StructSparseMSG routines !*********************************************************************** !*********************************************************************** ! fhypre_structsparsemsgcreate !*********************************************************************** subroutine fhypre_structsparsemsgcreate(fcomm, fsolver) integer ierr integer fcomm integer*8 fsolver call HYPRE_StructSparseMSGCreate(fcomm, fsolver, ierr) if (ierr .ne. 0) then print *, 'fhypre_structsparsemsgcreate: err = ', ierr endif return end !*********************************************************************** ! fhypre_structsparsemsgdestroy !*********************************************************************** subroutine fhypre_structsparsemsgdestroy(fsolver) integer ierr integer*8 fsolver call HYPRE_StructSparseMSGDestroy(fsolver, ierr) if (ierr .ne. 0) then print *, 'fhypre_structsparsemsgdestroy: err = ', ierr endif return end !*********************************************************************** ! fhypre_structsparsemsgsetup !*********************************************************************** subroutine fhypre_structsparsemsgsetup(fsolver, fA, fb, fx) integer ierr integer*8 fsolver integer*8 fA integer*8 fb integer*8 fx call HYPRE_StructSparseMSGSetup(fsolver, fA, fb, fx, ierr) if (ierr .ne. 0) then print *, 'fhypre_structsparsemsgsetup: err = ', ierr endif return end !*********************************************************************** ! fhypre_structsparsemsgsolve !*********************************************************************** subroutine fhypre_structsparsemsgsolve(fsolver, fA, fb, fx) integer ierr integer*8 fsolver integer*8 fA integer*8 fb integer*8 fx call HYPRE_StructSparseMSGSolve(fsolver, fA, fb, fx, ierr) if (ierr .ne. 0) then print *, 'fhypre_structsparsemsgsolve: err = ', ierr endif return end !*********************************************************************** ! fhypre_structsparsemsgsetjump !*********************************************************************** subroutine fhypre_structsparsemsgsetjump(fsolver, fjump) integer ierr integer fjump integer*8 fsolver call HYPRE_StructSparseMSGSetJump(fsolver, fjump, ierr) if (ierr .ne. 0) then print *, 'fhypre_structsparsemsgsetjump: err = ', ierr endif return end !*********************************************************************** ! fhypre_structsparsemsgsettol !*********************************************************************** subroutine fhypre_structsparsemsgsettol(fsolver, ftol) integer ierr integer*8 fsolver double precision ftol call HYPRE_StructSparseMSGSetTol(fsolver, ftol, ierr) if (ierr .ne. 0) then print *, 'fhypre_structsparsemsgsettol: err = ', ierr endif return end !*********************************************************************** ! fhypre_structsparsemsgsetmaxiter !*********************************************************************** subroutine fhypre_structsparsemsgsetmaxite(fsolver, fmaxiter) integer ierr integer fmaxiter integer*8 fsolver call HYPRE_StructSparseMSGSetMaxIter(fsolver, fmaxiter, ierr) if (ierr .ne. 0) then print *, 'fhypre_structsparsemsgsetmaxite: err = ', ierr endif return end !*********************************************************************** ! fhypre_structsparsemsgsetrelchange !*********************************************************************** subroutine fhypre_structsparsemsgsetrelcha(fsolver, frelchange) integer ierr integer frelchange integer*8 fsolver call HYPRE_StructSparseMSGSetRelChan(fsolver, frelchange, ierr) if (ierr .ne. 0) then print *, 'fhypre_structsparsemsgsetrelcha: err = ', ierr endif return end !*********************************************************************** ! fhypre_structsparsemsgsetzeroguess !*********************************************************************** subroutine fhypre_structsparsemsgsetzerogu(fsolver) integer ierr integer*8 fsolver call HYPRE_StructSparseMSGSetZeroGue(fsolver, ierr) if (ierr .ne. 0) then print *, 'fhypre_structsparsemsgsetzerogu: err = ', ierr endif return end !*********************************************************************** ! fhypre_structsparsemsgsetnonzeroguess !*********************************************************************** subroutine fhypre_structsparsemsgsetnonzer(fsolver) integer ierr integer*8 fsolver call HYPRE_StructSparseMSGSetNonZero(fsolver, ierr) if (ierr .ne. 0) then print *, 'fhypre_structsparsemsgsetnonzer: err = ', ierr endif return end !*********************************************************************** ! fhypre_structsparsemsggetnumiterations !*********************************************************************** subroutine fhypre_structsparsemsggetnumite(fsolver, fniters) integer ierr integer fniters integer*8 fsolver call HYPRE_StructSparseMSGGetNumIter(fsolver, fniters, ierr) if (ierr .ne. 0) then print *, 'fhypre_structsparsemsggetnumite: err = ', ierr endif return end !*********************************************************************** ! fhypre_structsparsemsggetfinalrelativeresidualnorm !*********************************************************************** subroutine fhypre_structsparsemsggetfinalr(fsolver, fnorm) integer ierr integer*8 fsolver double precision fnorm call HYPRE_StructSparseMSGGetFinalRe(fsolver, fnorm, ierr) if (ierr .ne. 0) then print *, 'fhypre_structsparsemsggetfinalr: err = ', ierr endif return end !*********************************************************************** ! fhypre_structsparsemsgsetrelaxtype !*********************************************************************** subroutine fhypre_structsparsemsgsetrelaxt(fsolver, frelaxtype) integer ierr integer frelaxtype integer*8 fsolver call HYPRE_StructSparseMSGSetRelaxTy(fsolver, frelaxtype, ierr) if (ierr .ne. 0) then print *, 'fhypre_structsparsemsgsetrelaxt: err = ', ierr endif return end !*********************************************************************** ! fhypre_structsparsemsgsetnumprerelax !*********************************************************************** subroutine fhypre_structsparsemsgsetnumpre(fsolver, fnprelax) integer ierr integer fnprelax integer*8 fsolver call HYPRE_StructSparseMSGSetNumPreR(fsolver, fnprelax, ierr) if (ierr .ne. 0) then print *, 'fhypre_structsparsemsgsetnumpre: err = ', ierr endif return end !*********************************************************************** ! fhypre_structsparsemsgsetnumpostrelax !*********************************************************************** subroutine fhypre_structsparsemsgsetnumpos(fsolver, fnpstrlx) integer ierr integer fnpstrlx integer*8 fsolver call HYPRE_StructSparseMSGSetNumPost(fsolver, fnpstrlx, ierr) if (ierr .ne. 0) then print *, 'fhypre_structsparsemsgsetnumpos: err = ', ierr endif return end !*********************************************************************** ! fhypre_structsparsemsgsetnumfinerelax !*********************************************************************** subroutine fhypre_structsparsemsgsetnumfin(fsolver, fnfine) integer ierr integer fnfine integer*8 fsolver call HYPRE_StructSparseMSGSetNumFine(fsolver, fnfine, ierr) if (ierr .ne. 0) then print *, 'fhypre_structsparsemsgsetnumfin: err = ', ierr endif return end !*********************************************************************** ! fhypre_structsparsemsgsetlogging !*********************************************************************** subroutine fhypre_structsparsemsgsetloggin(fsolver, flogging) integer ierr integer flogging integer*8 fsolver call HYPRE_StructSparseMSGSetLogging(fsolver, flogging, ierr) if (ierr .ne. 0) then print *, 'fhypre_structsparsemsgsetloggin: err = ', ierr endif return end !*********************************************************************** ! fhypre_structsparsemsgsetprintlevel !*********************************************************************** subroutine fhypre_structsparsemsgsetprintl(fsolver, fprntlvl) integer ierr integer fprntlvl integer*8 fsolver call HYPRE_StructSparseMSGSetPrintLe(fsolver, fprntlvl, ierr) if (ierr .ne. 0) then print *, 'fhypre_structsparsemsgsetprintl: err = ', ierr endif return end hypre-2.33.0/src/test/fstruct_mv.f000066400000000000000000000567361477326011500170660ustar00rootroot00000000000000! Copyright (c) 1998 Lawrence Livermore National Security, LLC and other ! HYPRE Project Developers. See the top-level COPYRIGHT file for details. ! ! SPDX-License-Identifier: (Apache-2.0 OR MIT) !************************************************** ! Routines to test struct_mv fortran interface !************************************************** !************************************************** ! HYPRE_StructStencil routines !************************************************** !****************************************** ! fhypre_structstencilcreate !****************************************** subroutine fhypre_structstencilcreate(fdim, fdim1, fstencil) integer ierr integer fdim integer fdim1 integer*8 fstencil call HYPRE_StructStencilCreate(fdim, fdim1, fstencil, ierr) if (ierr .ne. 0) then print *, 'fhypre_structstencilcreate: error = ', ierr endif return end !****************************************** ! fhypre_structstencilsetelement !****************************************** subroutine fhypre_structstencilsetelement(fstencil, findx, 1 foffset) integer ierr integer findx integer foffset(*) integer*8 fstencil call HYPRE_StructStencilSetElement(fstencil, findx, foffset, 1 ierr) if (ierr .ne. 0) then print *, 'fhypre_structstencilsetelement: error = ', ierr endif return end !****************************************** ! fhypre_structstencildestroy !****************************************** subroutine fhypre_structstencildestroy(fstencil) integer ierr integer*8 fstencil call HYPRE_StructStencilDestroy(fstencil, ierr) if (ierr .ne. 0) then print *, 'fhypre_structstencildestroy: error = ', ierr endif return end !************************************************** ! HYPRE_StructGrid routines !************************************************** !****************************************** ! fhypre_structgridcreate !****************************************** subroutine fhypre_structgridcreate(fcomm, fdim, fgrid) integer ierr integer fcomm integer fdim integer*8 fgrid call HYPRE_StructGridCreate(fcomm, fdim, fgrid, ierr) if (ierr .ne. 0) then print *, 'fhypre_structgridcreate: error = ', ierr endif return end !****************************************** ! fhypre_structgriddestroy !****************************************** subroutine fhypre_structgriddestroy(fgrid) integer ierr integer*8 fgrid call HYPRE_StructGridDestroy(fgrid, ierr) if (ierr .ne. 0) then print *, 'fhypre_structgriddestroy: error = ', ierr endif return end !****************************************** ! fhypre_structgridsetextents !****************************************** subroutine fhypre_structgridsetextents(fgrid, flower, fupper) integer ierr integer flower(*) integer fupper(*) integer*8 fgrid call HYPRE_StructGridSetExtents(fgrid, flower, fupper, ierr) if (ierr .ne. 0) then print *, 'fhypre_structgridsetelement: error = ', ierr endif return end !****************************************** ! fhypre_structgridsetperiodic !****************************************** subroutine fhypre_structgridsetperiodic(fgrid, fperiod) integer ierr integer fperiod(*) integer*8 fgrid call HYPRE_StructGridSetPeriodic(fgrid, fperiod, ierr) if (ierr .ne. 0) then print *, 'fhypre_structgridsetperiodic: error = ', ierr endif return end !****************************************** ! fhypre_structgridassemble !****************************************** subroutine fhypre_structgridassemble(fgrid) integer ierr integer*8 fgrid call HYPRE_StructGridAssemble(fgrid, ierr) if (ierr .ne. 0) then print *, 'fhypre_structgridassemble: error = ', ierr endif return end !****************************************** ! fhypre_structgridsetnumghost !****************************************** subroutine fhypre_structgridsetnumghost(fgrid, fnumghost) integer ierr integer fnumghost integer*8 fgrid call HYPRE_StructGridSetNumGhost(fgrid, fnumghost, ierr) if (ierr .ne. 0) then print *, 'fhypre_structgridsetnumghost: error = ', ierr endif return end !************************************************** ! HYPRE_StructMatrix routines !************************************************** !****************************************** ! fhypre_structmatrixcreate !****************************************** subroutine fhypre_structmatrixcreate(fcomm, fgrid, fstencil, 1 fmatrix) integer ierr integer fcomm integer*8 fgrid integer*8 fstencil integer*8 fmatrix call HYPRE_StructMatrixCreate(fcomm, fgrid, fstencil, fmatrix, 1 ierr) if (ierr .ne. 0) then print *, 'fhypre_structmatrixcreate: error = ', ierr endif return end !****************************************** ! fhypre_structmatrixdestroy !****************************************** subroutine fhypre_structmatrixdestroy(fmatrix) integer ierr integer*8 fmatrix call HYPRE_StructMatrixDestroy(fmatrix, ierr) if (ierr .ne. 0) then print *, 'fhypre_structmatrixdestroy: error = ', ierr endif return end !****************************************** ! fhypre_structmatrixinitialize !****************************************** subroutine fhypre_structmatrixinitialize(fmatrix) integer ierr integer*8 fmatrix call HYPRE_StructMatrixInitialize(fmatrix, ierr) if (ierr .ne. 0) then print *, 'fhypre_structmatrixinitialize: error = ', ierr endif return end !****************************************** ! fhypre_structmatrixsetvalues !****************************************** subroutine fhypre_structmatrixsetvalues(fmatrix, fgridindx, 1 fnumsindx, fsindx, fvals) integer ierr integer fgridindx(*) integer fnumsindx(*) integer fsindx(*) double precision fvals(*) integer*8 fmatrix call HYPRE_StructMatrixSetValues(fmatrix, fgridindx, fnumsindx, 1 fsindx, fvals, ierr) if (ierr .ne. 0) then print *, 'fhypre_structmatrixsetvalues: error = ', ierr endif return end !****************************************** ! fhypre_structmatrixsetboxvalues !****************************************** subroutine fhypre_structmatrixsetboxvalues(fmatrix, flower, 1 fupper, fnumsindx, 2 fsindx, fvals) integer ierr integer flower(*) integer fupper(*) integer fnumsindx(*) integer fsindx(*) double precision fvals(*) integer*8 fmatrix call HYPRE_StructMatrixSetBoxValues(fmatrix, flower, fupper, 1 fnumsindx, fsindx, fvals, 2 ierr) if (ierr .ne. 0) then print *, 'fhypre_structmatrixsetboxvalues: error = ', ierr endif return end !****************************************** ! fhypre_structmatrixgetboxvalues !****************************************** subroutine fhypre_structmatrixgetboxvalues(fmatrix, flower, 1 fupper, fnumsindx, 2 fsindx, fvals) integer ierr integer flower(*) integer fupper(*) integer fnumsindx(*) integer fsindx(*) double precision fvals(*) integer*8 fmatrix call HYPRE_StructMatrixGetBoxValues(fmatrix, flower, fupper, 1 fnumsindx, fsindx, fvals, 2 ierr) if (ierr .ne. 0) then print *, 'fhypre_structmatrixgetboxvalues: error = ', ierr endif return end !****************************************** ! fhypre_structmatrixsetconstantentries !****************************************** subroutine fhypre_structmatrixsetconstante(fmatrix, fnument, 1 fentries) integer ierr integer fnument(*) integer fentries(*) integer*8 fmatrix call HYPRE_StructMatrixSetConstantEn(fmatrix, fnument, 1 fentries, ierr) if (ierr .ne. 0) then print *, 'fhypre_structmatrixsetconstantentries: error =', ierr endif return end !****************************************** ! fhypre_structmatrixsetconstantvalues !****************************************** subroutine fhypre_structmatrixsetconstantv(fmatrix, 1 fnumsindx, fsindx, 2 fvals) integer ierr integer fnumsindx(*) integer fsindx(*) double precision fvals(*) integer*8 fmatrix call HYPRE_StructMatrixSetConstantVa(fmatrix, fnumsindx, 1 fsindx, fvals, ierr) if (ierr .ne. 0) then print *, 'fhypre_structmatrixsetconstantvalues: error = ', ierr endif return end !****************************************** ! fhypre_structmatrixaddtovalues !****************************************** subroutine fhypre_structmatrixaddtovalues(fmatrix, fgrdindx, 1 fnumsindx, fsindx, 2 fvals) integer ierr integer fgrdindx(*) integer fnumsindx(*) integer fsindx(*) double precision fvals(*) integer*8 fmatrix call HYPRE_StructMatrixAddToValues(fmatrix, fgrdindx, 1 fnumsindx, fsindx, fvals, 2 ierr) if (ierr .ne. 0) then print *, 'fhypre_structmatrixaddtovalues: error = ', ierr endif return end !****************************************** ! fhypre_structmatrixaddtoboxvalues !****************************************** subroutine fhypre_structmatrixaddtoboxvalues(fmatrix, filower, 1 fiupper, fnumsindx, 2 fsindx, fvals) integer ierr integer filower(*) integer fiupper(*) integer fnumsindx integer fsindx(*) double precision fvals(*) integer*8 fmatrix call HYPRE_StructMatrixAddToBoxValues(fmatrix, filower, fiupper, 1 fnumsindx, fsindx, fvals, 2 ierr) if (ierr .ne. 0) then print *, 'fhypre_structmatrixaddtovalues: error = ', ierr endif return end !****************************************** ! fhypre_structmatrixaddtoconstantvalues !****************************************** subroutine fhypre_structmatrixaddtoconstant(fmatrix, fnumsindx, 2 fsindx, fvals) integer ierr integer fnumsindx integer fsindx(*) double precision fvals(*) integer*8 fmatrix call HYPRE_StructMatrixSetConstantVa(fmatrix, fnumsindx, 1 fsindx, fvals, ierr) if (ierr .ne. 0) then print *, 'fhypre_structmatrixaddtoconstantvalues: error = ', 1 ierr endif return end !****************************************** ! fhypre_structmatrixassemble !****************************************** subroutine fhypre_structmatrixassemble(fmatrix) integer ierr integer*8 fmatrix call HYPRE_StructMatrixAssemble(fmatrix, ierr) if (ierr .ne. 0) then print *, 'fhypre_structmatrixassemble: error = ', ierr endif return end !****************************************** ! fhypre_structmatrixsetnumghost !****************************************** subroutine fhypre_structmatrixsetnumghost(fmatrix, fnumghost) integer ierr integer fnumghost integer*8 fmatrix call HYPRE_StructMatrixSetNumGhost(fmatrix, fnumghost, ierr) if (ierr .ne. 0) then print *, 'fhypre_structmatrixsetnumghost: error = ', ierr endif return end !****************************************** ! fhypre_structmatrixgetgrid !****************************************** subroutine fhypre_structmatrixgetgrid(fmatrix, fgrid) integer ierr integer*8 fmatrix integer*8 fgrid call HYPRE_StructMatrixGetGrid(fmatrix, fgrid, ierr) if (ierr .ne. 0) then print *, 'fhypre_structmatrixgetgrid: error = ', ierr endif return end !****************************************** ! fhypre_structmatrixsetsymmetric !****************************************** subroutine fhypre_structmatrixsetsymmetric(fmatrix, fsymmetric) integer ierr integer fsymmetric integer*8 fmatrix call HYPRE_StructMatrixSetSymmetric(fmatrix, fsymmetric, ierr) if (ierr .ne. 0) then print *, 'fhypre_structmatrixsetsymmetric: error = ', ierr endif return end !****************************************** ! fhypre_structmatrixprint !****************************************** subroutine fhypre_structmatrixprint(fmatrix, fall) integer ierr integer fall integer*8 fmatrix call HYPRE_StructMatrixPrint(fmatrix, fall, ierr) if (ierr .ne. 0) then print *, 'fhypre_structmatrixprint: error = ', ierr endif return end !****************************************** ! fhypre_structmatrixmatvec !****************************************** subroutine fhypre_structmatrixmatvec(falpha, fA, fx, fbeta, fy) integer ierr integer falpha integer fbeta integer*8 fA integer*8 fx integer*8 fy call HYPRE_StructMatrixMatvec(falplah, fA, fx, fbeta, fy, ierr) if (ierr .ne. 0) then print *, 'fhypre_structmatrixmatvec: error = ', ierr endif return end !************************************************** ! HYPRE_StructVector routines !************************************************** !****************************************** ! fhypre_structvectorcreate !****************************************** subroutine fhypre_structvectorcreate(fcomm, fgrid, fvector) integer ierr integer fcomm integer*8 fgrid integer*8 fvector call HYPRE_StructVectorCreate(fcomm, fgrid, fvector, ierr) if (ierr .ne. 0) then print *, 'fhypre_structvectorcreate: error = ', ierr endif return end !****************************************** ! fhypre_structvectordestroy !****************************************** subroutine fhypre_structvectordestroy(fvector) integer ierr integer*8 fvector call HYPRE_StructVectorDestroy(fvector, ierr) if (ierr .ne. 0) then print *, 'fhypre_structvectordestroy: error = ', ierr endif return end !****************************************** ! fhypre_structvectorinitialize !****************************************** subroutine fhypre_structvectorinitialize(fvector) integer ierr integer*8 fvector call HYPRE_StructVectorInitialize(fvector, ierr) if (ierr .ne. 0) then print *, 'fhypre_structvectorinitialize: error = ', ierr endif return end !****************************************** ! fhypre_structvectorsetvalues !****************************************** subroutine fhypre_structvectorsetvalues(fvector, fgridindx, 1 fvals) integer ierr integer fgridindx(*) double precision fvals(*) integer*8 fvector call HYPRE_StructVectorSetValues(fvector, fgridindx, fvals, ierr) if (ierr .ne. 0) then print *, 'fhypre_structvectorsetvalues: error = ', ierr endif return end !****************************************** ! fhypre_structvectorsetboxvalues !****************************************** subroutine fhypre_structvectorsetboxvalues(fvector, flower, 1 fupper, fvals) integer ierr integer flower(*) integer fupper(*) double precision fvals(*) integer*8 fvector call HYPRE_StructVectorSetBoxValues(fvector, flower, fupper, 1 fvals, ierr) if (ierr .ne. 0) then print *, 'fhypre_structvectorsetboxvalues: error = ', ierr endif return end !****************************************** ! fhypre_structvectorsetconstantvalues !****************************************** subroutine fhypre_structvectorsetconstantv(fvector, fvals) integer ierr double precision fvals(*) integer*8 fvector call HYPRE_StructVectorSetConstantVa(fvector, fvals, ierr) if (ierr .ne. 0) then print *, 'fhypre_structvectorsetconstantvalues: error = ', ierr endif return end !****************************************** ! fhypre_structvectoraddtovalues !****************************************** subroutine fhypre_structvectoraddtovalues(fvector, fgrdindx, 1 fvals) integer ierr integer fgrdindx(*) double precision fvals(*) integer*8 fvector call HYPRE_StructVectorAddToValues(fvector, fgrdindx, fvals, ierr) if (ierr .ne. 0) then print *, 'fhypre_structvectoraddtovalues: error = ', ierr endif return end !****************************************** ! fhypre_structvectoraddtoboxvalues !****************************************** subroutine fhypre_structvectoraddtoboxvalu(fvector, flower, 1 fupper, fvals) integer ierr integer flower(*) integer fupper(*) double precision fvals(*) integer*8 fvector call HYPRE_StructVectorAddToBoxValue(fvector, flower, fupper, 1 fvals, ierr) if (ierr .ne. 0) then print *, 'fhypre_structvectoraddtoboxvalues: error = ', ierr endif return end !****************************************** ! fhypre_structvectorscalevalues !****************************************** subroutine fhypre_structvectorscalevalues(fvector, ffactor) integer ierr double precision ffactor integer*8 fvector call HYPRE_StructVectorScaleValues(fvector, ffactor, ierr) if (ierr .ne. 0) then print *, 'fhypre_structvectorscalevalues: error = ', ierr endif return end !****************************************** ! fhypre_structvectorgetvalues !****************************************** subroutine fhypre_structvectorgetvalues(fvector, fgrdindx, 1 fvals) integer ierr integer fgrdindx(*) double precision fvals(*) integer*8 fvector call HYPRE_StructVectorGetValues(fvector, fgrdindx, fvals, ierr) if (ierr .ne. 0) then print *, 'fhypre_structvectorgetvalues: error = ', ierr endif return end !****************************************** ! fhypre_structvectorgetboxvalues !****************************************** subroutine fhypre_structvectorgetboxvalues(fvector, flower, 1 fupper, fvals) integer ierr integer flower(*) integer fupper(*) double precision fvals(*) integer*8 fvector call HYPRE_StructVectorGetBoxValues(fvector, flower, fupper, 1 fvals, ierr) if (ierr .ne. 0) then print *, 'fhypre_structvectorgetboxvalues: error = ', ierr endif return end !****************************************** ! fhypre_structvectorassemble !****************************************** subroutine fhypre_structvectorassemble(fvector) integer ierr integer*8 fvector call HYPRE_StructVectorAssemble(fvector, ierr) if (ierr .ne. 0) then print *, 'fhypre_structvectorassemble: error = ', ierr endif return end !****************************************** ! fhypre_structvectorsetnumghost !****************************************** subroutine fhypre_structvectorsetnumghost(fvector, fnumghost) integer ierr integer fnumghost integer*8 fvector call HYPRE_StructVectorSetNumGhost(fvector, fnumghost, ierr) if (ierr .ne. 0) then print *, 'fhypre_structvectorsetnumghost: error = ', ierr endif return end !****************************************** ! fhypre_structvectorcopy !****************************************** subroutine fhypre_structvectorcopy(fx, fy) integer ierr integer*8 fx integer*8 fy call HYPRE_StructVectorCopy(fx, fy, ierr) if (ierr .ne. 0) then print *, 'fhypre_structvectorcopy: error = ', ierr endif return end !****************************************** ! fhypre_structvectorgetmigratecommpkg !****************************************** subroutine fhypre_structvectorgetmigrateco(ffromvec, ftovec, 1 fcommpkg) integer ierr integer*8 ffromvec integer*8 ftovec integer*8 fcommpkg call HYPRE_StructVectorGetMigrateCom(ffromvec, ftovec, fcommpkg, 1 ierr) if (ierr .ne. 0) then print *, 'fhypre_structvectorgetmigratecommpkg: error = ', ierr endif return end !****************************************** ! fhypre_structvectormigrate !****************************************** subroutine fhypre_structvectormigrate(fcommpkg, ffromvec, 1 ftovec) integer ierr integer*8 ffromvec integer*8 ftovec integer*8 fcommpkg call HYPRE_StructVectorMigrate(fcommpkg, ffromvec, ftovec, ierr) if (ierr .ne. 0) then print *, 'fhypre_structvectormigrate: error = ', ierr endif return end !****************************************** ! fhypre_commpkgdestroy !****************************************** subroutine fhypre_commpkgdestroy(fcommpkg) integer ierr integer*8 fcommpkg call HYPRE_DestroyCommPkg(fcommpkg, ierr) if (ierr .ne. 0) then print *, 'fhypre_commpkgdestroy: error = ', ierr endif return end !****************************************** ! fhypre_structvectorprint !****************************************** subroutine fhypre_structvectorprint(fvector, fall) integer ierr integer fall integer*8 fvector call HYPRE_StructVectorPrint(fvector, fall, ierr) if (ierr .ne. 0) then print *, 'fhypre_structvectorprint: error = ', ierr endif return end hypre-2.33.0/src/test/hypre_ij_fortran_test.h000066400000000000000000000151251477326011500212620ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #ifdef __cplusplus extern "C" { #endif /****************************************************************************** * Definitions of IJMatrix Fortran interface routines *****************************************************************************/ #define HYPRE_IJMatrixCreate \ hypre_F90_NAME(fhypre_ijmatrixcreate, FHYPRE_IJMATRIXCREATE) extern void hypre_F90_NAME(fhypre_ijmatrixcreate, FHYPRE_IJMATRIXCREATE) (hypre_F90_Obj *, HYPRE_Int *, HYPRE_Int *, HYPRE_Int *, HYPRE_Int *, hypre_F90_Obj*); #define HYPRE_IJMatrixDestroy \ hypre_F90_NAME(fhypre_ijmatrixdestroy, FHYPRE_IJMATRIXDESTROY) extern void hypre_F90_NAME(fhypre_ijmatrixdestroy, FHYPRE_IJMATRIXDESTROY) (hypre_F90_Obj *); #define HYPRE_IJMatrixInitialize \ hypre_F90_NAME(fhypre_ijmatrixinitialize, FHYPRE_IJMATRIXINITIALIZE) extern void hypre_F90_NAME(fhypre_ijmatrixinitialize, FHYPRE_IJMATRIXINITIALIZE) (hypre_F90_Obj *); #define HYPRE_IJMatrixAssemble \ hypre_F90_NAME(fhypre_ijmatrixassemble, FHYPRE_IJMATRIXASSEMBLE) extern void hypre_F90_NAME(fhypre_ijmatrixassemble, FHYPRE_IJMATRIXASSEMBLE) (hypre_F90_Obj *); #define HYPRE_IJMatrixSetRowSizes \ hypre_F90_NAME(fhypre_ijmatrixsetrowsizes, FHYPRE_IJMATRIXSETROWSIZES) extern void hypre_F90_NAME(fhypre_ijmatrixsetrowsizes, FHYPRE_IJMATRIXSETROWSIZES) (hypre_F90_Obj *, const HYPRE_Int *); #define HYPRE_IJMatrixSetDiagOffdSizes \ hypre_F90_NAME(fhypre_ijmatrixsetdiagoffdsizes, FHYPRE_IJMATRIXSETDIAGOFFDSIZES) extern void hypre_F90_NAME(fhypre_ijmatrixsetdiagoffdsizes, FHYPRE_IJMATRIXSETDIAGOFFDSIZES) (hypre_F90_Obj *, const HYPRE_Int *, const HYPRE_Int *); #define HYPRE_IJMatrixSetValues \ hypre_F90_NAME(fhypre_ijmatrixsetvalues, FHYPRE_IJMATRIXSETVALUES) extern void hypre_F90_NAME(fhypre_ijmatrixsetvalues, FHYPRE_IJMATRIXSETVALUES) (hypre_F90_Obj *, HYPRE_Int *, HYPRE_Int *, const HYPRE_Int *, const HYPRE_Int *, const HYPRE_Real *); #define HYPRE_IJMatrixAddToValues \ hypre_F90_NAME(fhypre_ijmatrixaddtovalues, FHYPRE_IJMATRIXADDTOVALUES) extern void hypre_F90_NAME(fhypre_ijmatrixaddtovalues, FHYPRE_IJMATRIXADDTOVALUES) (hypre_F90_Obj *, HYPRE_Int *, HYPRE_Int *, const HYPRE_Int *, const HYPRE_Int *, const HYPRE_Real *); #define HYPRE_IJMatrixSetObjectType \ hypre_F90_NAME(fhypre_ijmatrixsetobjecttype, FHYPRE_IJMATRIXSETOBJECTTYPE) extern void hypre_F90_NAME(fhypre_ijmatrixsetobjecttype, FHYPRE_IJMATRIXSETOBJECTTYPE) (hypre_F90_Obj *, const HYPRE_Int *); #define HYPRE_IJMatrixGetObjectType \ hypre_F90_NAME(fhypre_ijmatrixgetobjecttype, FHYPRE_IJMATRIXGETOBJECTTYPE) extern void hypre_F90_NAME(fhypre_ijmatrixgetobjecttype, FHYPRE_IJMATRIXGETOBJECTTYPE) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_IJMatrixGetObject \ hypre_F90_NAME(fhypre_ijmatrixgetobject, FHYPRE_IJMATRIXGETOBJECT) extern void hypre_F90_NAME(fhypre_ijmatrixgetobject, FHYPRE_IJMATRIXGETOBJECT) (hypre_F90_Obj *, hypre_F90_Obj *); #define HYPRE_IJMatrixRead \ hypre_F90_NAME(fhypre_ijmatrixread, FHYPRE_IJMATRIXREAD) extern void hypre_F90_NAME(fhypre_ijmatrixread, FHYPRE_IJMATRIXREAD) (char *, hypre_F90_Obj *, HYPRE_Int *, hypre_F90_Obj *); #define HYPRE_IJMatrixPrint \ hypre_F90_NAME(fhypre_ijmatrixprint, FHYPRE_IJMATRIXPRINT) extern void hypre_F90_NAME(fhypre_ijmatrixprint, FHYPRE_IJMATRIXPRINT) (hypre_F90_Obj *, char *); #define hypre_IJMatrixSetObject \ hypre_F90_NAME(fhypre_ijmatrixsetobject, FHYPRE_IJMATRIXSETOBJECT) extern void hypre_F90_NAME(fhypre_ijmatrixsetobject, FHYPRE_IJMATRIXSETOBJECT) (hypre_F90_Obj *, hypre_F90_Obj *); #define HYPRE_IJVectorCreate \ hypre_F90_NAME(fhypre_ijvectorcreate, FHYPRE_IJVECTORCREATE) extern void hypre_F90_NAME(fhypre_ijvectorcreate, FHYPRE_IJVECTORCREATE) (HYPRE_Int *, HYPRE_Int *, HYPRE_Int *, hypre_F90_Obj *); #define HYPRE_IJVectorDestroy \ hypre_F90_NAME(fhypre_ijvectordestroy, FHYPRE_IJVECTORDESTROY) extern void hypre_F90_NAME(fhypre_ijvectordestroy, FHYPRE_IJVECTORDESTROY) (hypre_F90_Obj *); #define HYPRE_IJVectorInitialize \ hypre_F90_NAME(fhypre_ijvectorinitialize, FHYPRE_IJVECTORINITIALIZE) extern void hypre_F90_NAME(fhypre_ijvectorinitialize, FHYPRE_IJVECTORINITIALIZE) (hypre_F90_Obj *); #define HYPRE_IJVectorSetValues \ hypre_F90_NAME(fhypre_ijvectorsetvalues, FHYPRE_IJVECTORSETVALUES) extern void hypre_F90_NAME(fhypre_ijvectorsetvalues, FHYPRE_IJVECTORSETVALUES) (hypre_F90_Obj *, HYPRE_Int *, HYPRE_Int *, HYPRE_Real *); #define HYPRE_IJVectorAddToValues \ hypre_F90_NAME(fhypre_ijvectoraddtovalues, FHYPRE_IJVECTORADDTOVALUES) extern void hypre_F90_NAME(fhypre_ijvectoraddtovalues, FHYPRE_IJVECTORADDTOVALUES) (hypre_F90_Obj *, HYPRE_Int *, HYPRE_Int *, HYPRE_Real *); #define HYPRE_IJVectorAssemble \ hypre_F90_NAME(fhypre_ijvectorassemble, FHYPRE_IJVECTORASSEMBLE) extern void hypre_F90_NAME(fhypre_ijvectorassemble, FHYPRE_IJVECTORASSEMBLE) (hypre_F90_Obj *); #define HYPRE_IJVectorGetValues \ hypre_F90_NAME(fhypre_ijvectorgetvalues, FHYPRE_IJVECTORGETVALUES) extern void hypre_F90_NAME(fhypre_ijvectorgetvalues, FHYPRE_IJVECTORGETVALUES) (hypre_F90_Obj *, const HYPRE_Int *, const HYPRE_Int *, HYPRE_Real *); #define HYPRE_IJVectorSetObjectType \ hypre_F90_NAME(fhypre_ijvectorsetobjecttype, FHYPRE_IJVECTORSETOBJECTTYPE) extern void hypre_F90_NAME(fhypre_ijvectorsetobjecttype, FHYPRE_IJVECTORSETOBJECTTYPE) (hypre_F90_Obj *, const HYPRE_Int *); #define HYPRE_IJVectorGetObjectType \ hypre_F90_NAME(fhypre_ijvectorgetobjecttype, FHYPRE_IJVECTORGETOBJECTTYPE) extern void hypre_F90_NAME(fhypre_ijvectorgetobjecttype, FHYPRE_IJVECTORGETOBJECTTYPE) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_IJVectorGetObject \ hypre_F90_NAME(fhypre_ijvectorgetobject, FHYPRE_IJVECTORGETOBJECT) extern void hypre_F90_NAME(fhypre_ijvectorgetobject, FHYPRE_IJVECTORGETOBJECT) (hypre_F90_Obj *, hypre_F90_Obj *); #define HYPRE_IJVectorRead \ hypre_F90_NAME(fhypre_ijvectorread, FHYPRE_IJVECTORREAD) extern void hypre_F90_NAME(fhypre_ijvectorread, FHYPRE_IJVECTORREAD) (char *, hypre_F90_Obj *, HYPRE_Int *, hypre_F90_Obj *); #define HYPRE_IJVectorPrint \ hypre_F90_NAME(fhypre_ijvectorprint, FHYPRE_IJVECTORPRINT) extern void hypre_F90_NAME(fhypre_ijvectorprint, FHYPRE_IJVECTORPRINT) (hypre_F90_Obj *, const char *); #ifdef __cplusplus } #endif hypre-2.33.0/src/test/hypre_parcsr_fortran_test.h000066400000000000000000002144241477326011500221550ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #ifdef __cplusplus extern "C" { #endif /****************************************************************************** * Definitions of ParCSR Fortran interface routines *****************************************************************************/ #define HYPRE_ParCSRMatrixCreate \ hypre_F90_NAME(fhypre_parcsrmatrixcreate, FHYPRE_PARCSRMATRIXCREATE) extern void hypre_F90_NAME(fhypre_parcsrmatrixcreate, FHYPRE_PARCSRMATRIXCREATE) (HYPRE_Int *, HYPRE_Int *, HYPRE_Int *, HYPRE_Int *, HYPRE_Int *, HYPRE_Int *, HYPRE_Int *, HYPRE_Int *, hypre_F90_Obj *); #define HYPRE_ParCSRMatrixDestroy \ hypre_F90_NAME(fhypre_parcsrmatrixdestroy, FHYPRE_PARCSRMATRIXDESTROY) extern void hypre_F90_NAME(fhypre_parcsrmatrixdestroy, FHYPRE_PARCSRMATRIXDESTROY) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_ParCSRMatrixInitialize \ hypre_F90_NAME(fhypre_parcsrmatrixinitialize, FHYPRE_PARCSRMATRIXINITIALIZE) extern void hypre_F90_NAME(fhypre_parcsrmatrixinitialize, FHYPRE_PARCSRMATRIXINITIALIZE) (hypre_F90_Obj *); #define HYPRE_ParCSRMatrixRead \ hypre_F90_NAME(fhypre_parcsrmatrixread, FHYPRE_PARCSRMATRIXREAD) extern void hypre_F90_NAME(fhypre_parcsrmatrixread, FHYPRE_PARCSRMATRIXREAD) (HYPRE_Int *, char *, hypre_F90_Obj *); #define HYPRE_ParCSRMatrixPrint \ hypre_F90_NAME(fhypre_parcsrmatrixprint, FHYPRE_PARCSRMATRIXPRINT) extern void hypre_F90_NAME(fhypre_parcsrmatrixprint, FHYPRE_PARCSRMATRIXPRINT) (hypre_F90_Obj *, char *, HYPRE_Int *); #define HYPRE_ParCSRMatrixGetComm \ hypre_F90_NAME(fhypre_parcsrmatrixgetcomm, FHYPRE_PARCSRMATRIXGETCOMM) extern void hypre_F90_NAME(fhypre_parcsrmatrixgetcomm, FHYPRE_PARCSRMATRIXGETCOMM) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_ParCSRMatrixGetDims \ hypre_F90_NAME(fhypre_parcsrmatrixgetdims, FHYPRE_PARCSRMATRIXGETDIMS) extern void hypre_F90_NAME(fhypre_parcsrmatrixgetdims, FHYPRE_PARCSRMATRIXGETDIMS) (hypre_F90_Obj *, HYPRE_Int *, HYPRE_Int *); #define HYPRE_ParCSRMatrixGetRowPartitioning \ hypre_F90_NAME(fhypre_parcsrmatrixgetrowpartit, FHYPRE_PARCSRMATRIXGETROWPARTIT) extern void hypre_F90_NAME(fhypre_parcsrmatrixgetrowpartit, FHYPRE_PARCSRMATRIXGETROWPARTIT) (hypre_F90_Obj *, hypre_F90_Obj *); #define HYPRE_ParCSRMatrixGetColPartitioning \ hypre_F90_NAME(fhypre_parcsrmatrixgetcolpartit, FHYPRE_PARCSRMATRIXGETCOLPARTIT) extern void hypre_F90_NAME(fhypre_parcsrmatrixgetcolpartit, FHYPRE_PARCSRMATRIXGETCOLPARTIT) (hypre_F90_Obj *, hypre_F90_Obj *); #define HYPRE_ParCSRMatrixGetLocalRange \ hypre_F90_NAME(fhypre_parcsrmatrixgetlocalrang, FHYPRE_PARCSRMATRIXGETLOCALRANG) extern void hypre_F90_NAME(fhypre_parcsrmatrixgetlocalrang, FHYPRE_PARCSRMATRIXGETLOCALRANG) (hypre_F90_Obj *, HYPRE_Int *, HYPRE_Int *, HYPRE_Int *, HYPRE_Int *); #define HYPRE_ParCSRMatrixGetRow \ hypre_F90_NAME(fhypre_parcsrmatrixgetrow, FHYPRE_PARCSRMATRIXGETROW) extern void hypre_F90_NAME(fhypre_parcsrmatrixgetrow, FHYPRE_PARCSRMATRIXGETROW) (hypre_F90_Obj *, HYPRE_Int *, HYPRE_Int *, hypre_F90_Obj *, hypre_F90_Obj *); #define HYPRE_ParCSRMatrixRestoreRow \ hypre_F90_NAME(fhypre_parcsrmatrixrestorerow, FHYPRE_PARCSRMATRIXRESTOREROW) extern void hypre_F90_NAME(fhypre_parcsrmatrixrestorerow, FHYPRE_PARCSRMATRIXRESTOREROW) (hypre_F90_Obj *, HYPRE_Int *, HYPRE_Int *, hypre_F90_Obj *, hypre_F90_Obj *); #define HYPRE_CSRMatrixtoParCSRMatrix \ hypre_F90_NAME(fhypre_csrmatrixtoparcsrmatrix, FHYPRE_CSRMATRIXTOPARCSRMATRIX) extern void hypre_F90_NAME(fhypre_csrmatrixtoparcsrmatrix, FHYPRE_CSRMATRIXTOPARCSRMATRIX) (HYPRE_Int *, hypre_F90_Obj *, HYPRE_Int *, HYPRE_Int *, hypre_F90_Obj *); #define HYPRE_ParCSRMatrixMatvec \ hypre_F90_NAME(fhypre_parcsrmatrixmatvec, FHYPRE_PARCSRMATRIXMATVEC) extern void hypre_F90_NAME(fhypre_parcsrmatrixmatvec, FHYPRE_PARCSRMATRIXMATVEC) (HYPRE_Real *, hypre_F90_Obj *, hypre_F90_Obj *, HYPRE_Real *, hypre_F90_Obj *); #define HYPRE_ParCSRMatrixMatvecT \ hypre_F90_NAME(fhypre_parcsrmatrixmatvect, FHYPRE_PARCSRMATRIXMATVECT) extern void hypre_F90_NAME(fhypre_parcsrmatrixmatvect, FHYPRE_PARCSRMATRIXMATVECT) (HYPRE_Real *, hypre_F90_Obj *, hypre_F90_Obj *, HYPRE_Real *, hypre_F90_Obj *); #define HYPRE_ParVectorCreate \ hypre_F90_NAME(fhypre_parvectorcreate, FHYPRE_PARVECTORCREATE) extern void hypre_F90_NAME(fhypre_parvectorcreate, FHYPRE_PARVECTORCREATE) (HYPRE_Int *, HYPRE_Int *, hypre_F90_Obj *, hypre_F90_Obj *); #define HYPRE_ParMultiVectorCreate \ hypre_F90_NAME(fhypre_parmultivectorcreate, FHYPRE_PARMULTIVECTORCREATE) extern void hypre_F90_NAME(fhypre_parmultivectorcreate, FHYPRE_PARMULTIVECTORCREATE) (HYPRE_Int *, HYPRE_Int *, hypre_F90_Obj *, HYPRE_Int *, hypre_F90_Obj *); #define HYPRE_ParVectorDestroy \ hypre_F90_NAME(fhypre_parvectordestroy, FHYPRE_PARVECTORDESTROY) extern void hypre_F90_NAME(fhypre_parvectordestroy, FHYPRE_PARVECTORDESTROY) (hypre_F90_Obj *); #define HYPRE_ParVectorInitialize \ hypre_F90_NAME(fhypre_parvectorinitialize, FHYPRE_PARVECTORINITIALIZE) extern void hypre_F90_NAME(fhypre_parvectorinitialize, FHYPRE_PARVECTORINITIALIZE) (hypre_F90_Obj *); #define HYPRE_ParVectorRead \ hypre_F90_NAME(fhypre_parvectorread, FHYPRE_PARVECTORREAD) extern void hypre_F90_NAME(fhypre_parvectorread, FHYPRE_PARVECTORREAD) (HYPRE_Int *, hypre_F90_Obj *, char *); #define HYPRE_ParVectorPrint \ hypre_F90_NAME(fhypre_parvectorprint, FHYPRE_PARVECTORPRINT) extern void hypre_F90_NAME(fhypre_parvectorprint, FHYPRE_PARVECTORPRINT) (hypre_F90_Obj *, char *, HYPRE_Int *); #define HYPRE_ParVectorSetConstantValues \ hypre_F90_NAME(fhypre_parvectorsetconstantvalu, FHYPRE_PARVECTORSETCONSTANTVALU) extern void hypre_F90_NAME(fhypre_parvectorsetconstantvalu, FHYPRE_PARVECTORSETCONSTANTVALU) (hypre_F90_Obj *, HYPRE_Real *); #define HYPRE_ParVectorSetRandomValues \ hypre_F90_NAME(fhypre_parvectorsetrandomvalues, FHYPRE_PARVECTORSETRANDOMVALUES) extern void hypre_F90_NAME(fhypre_parvectorsetrandomvalues, FHYPRE_PARVECTORSETRANDOMVALUES) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_ParVectorCopy \ hypre_F90_NAME(fhypre_parvectorcopy, FHYPRE_PARVECTORCOPY) extern void hypre_F90_NAME(fhypre_parvectorcopy, FHYPRE_PARVECTORCOPY) (hypre_F90_Obj *, hypre_F90_Obj *); #define HYPRE_ParVectorCloneShallow \ hypre_F90_NAME(fhypre_parvectorcloneshallow, FHYPRE_PARVECTORCLONESHALLOW) extern void hypre_F90_NAME(fhypre_parvectorcloneshallow, FHYPRE_PARVECTORCLONESHALLOW) (hypre_F90_Obj *); #define HYPRE_ParVectorScale \ hypre_F90_NAME(fhypre_parvectorscale, FHYPRE_PARVECTORSCALE) extern void hypre_F90_NAME(fhypre_parvectorscale, FHYPRE_PARVECTORSCALE) (hypre_F90_Obj *, HYPRE_Real *); #define HYPRE_ParVectorAxpy \ hypre_F90_NAME(fhypre_parvectoraxpy, FHYPRE_PARVECTORAXPY) extern void hypre_F90_NAME(fhypre_parvectoraxpy, FHYPRE_PARVECTORAXPY) (HYPRE_Real *, hypre_F90_Obj *, hypre_F90_Obj *); #define HYPRE_ParVectorInnerProd \ hypre_F90_NAME(fhypre_parvectorinnerprod, FHYPRE_PARVECTORINNERPROD) extern void hypre_F90_NAME(fhypre_parvectorinnerprod, FHYPRE_PARVECTORINNERPROD) (hypre_F90_Obj *, hypre_F90_Obj *, HYPRE_Real *); #define hypre_ParCSRMatrixGlobalNumRows \ hypre_F90_NAME(fhypre_parcsrmatrixglobalnumrow, FHYPRE_PARCSRMATRIXGLOBALNUMROW) extern void hypre_F90_NAME(fhypre_parcsrmatrixglobalnumrow, FHYPRE_PARCSRMATRIXGLOBALNUMROW) (hypre_F90_Obj *, HYPRE_Int *); #define hypre_ParCSRMatrixRowStarts \ hypre_F90_NAME(fhypre_parcsrmatrixrowstarts, FHYPRE_PARCSRMATRIXROWSTARTS) extern void hypre_F90_NAME(fhypre_parcsrmatrixrowstarts, FHYPRE_PARCSRMATRIXROWSTARTS) (hypre_F90_Obj *, hypre_F90_Obj *); #define hypre_ParVectorSetDataOwner \ hypre_F90_NAME(fhypre_setparvectordataowner, FHYPRE_SETPARVECTORDATAOWNER) extern void hypre_F90_NAME(fhypre_setparvectordataowner, FHYPRE_SETPARVECTORDATAOWNER) (hypre_F90_Obj *, HYPRE_Int *); #define GenerateLaplacian \ hypre_F90_NAME(fgeneratelaplacian, FHYPRE_GENERATELAPLACIAN) extern void hypre_F90_NAME(fgeneratelaplacian, FHYPRE_GENERATELAPLACIAN) (HYPRE_Int *, HYPRE_Int *, HYPRE_Int *, HYPRE_Int *, HYPRE_Int *, HYPRE_Int *, HYPRE_Int *, HYPRE_Int *, HYPRE_Int *, HYPRE_Int *, HYPRE_Real *, hypre_F90_Obj *); #define HYPRE_BoomerAMGCreate \ hypre_F90_NAME(fhypre_boomeramgcreate, FHYPRE_BOOMERAMGCREATE) extern void hypre_F90_NAME(fhypre_boomeramgcreate, FHYPRE_BOOMERAMGCREATE) (hypre_F90_Obj *); #define HYPRE_BoomerAMGDestroy \ hypre_F90_NAME(fhypre_boomeramgdestroy, FHYPRE_BOOMERAMGDESTROY) extern void hypre_F90_NAME(fhypre_boomeramgdestroy, FHYPRE_BOOMERAMGDESTROY) (hypre_F90_Obj *); #define HYPRE_BoomerAMGSetup \ hypre_F90_NAME(fhypre_boomeramgsetup, FHYPRE_BOOMERAMGSETUP) extern void hypre_F90_NAME(fhypre_boomeramgsetup, FHYPRE_BOOMERAMGSETUP) (hypre_F90_Obj *, hypre_F90_Obj *, hypre_F90_Obj *, hypre_F90_Obj *); #define HYPRE_BoomerAMGSolve \ hypre_F90_NAME(fhypre_boomeramgsolve, FHYPRE_BOOMERAMGSOLVE) extern void hypre_F90_NAME(fhypre_boomeramgsolve, FHYPRE_BOOMERAMGSOLVE) (hypre_F90_Obj *, hypre_F90_Obj *, hypre_F90_Obj *, hypre_F90_Obj *); #define HYPRE_BoomerAMGSolveT \ hypre_F90_NAME(fhypre_boomeramgsolvet, FHYPRE_BOOMERAMGSOLVET) extern void hypre_F90_NAME(fhypre_boomeramgsolvet, FHYPRE_BOOMERAMGSOLVET) (hypre_F90_Obj *, hypre_F90_Obj *, hypre_F90_Obj *, hypre_F90_Obj *); #define HYPRE_BoomerAMGSetRestriction \ hypre_F90_NAME(fhypre_boomeramgsetrestriction, FHYPRE_BOOMERAMGSETRESTRICTION) extern void hypre_F90_NAME(fhypre_boomeramgsetrestriction, FHYPRE_BOOMERAMGSETRESTRICTION) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_BoomerAMGSetMaxLevels \ hypre_F90_NAME(fhypre_boomeramgsetmaxlevels, FHYPRE_BOOMERAMGSETMAXLEVELS) extern void hypre_F90_NAME(fhypre_boomeramgsetmaxlevels, FHYPRE_BOOMERAMGSETMAXLEVELS) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_BoomerAMGGetMaxLevels \ hypre_F90_NAME(fhypre_boomeramggetmaxlevels, FHYPRE_BOOMERAMGGETMAXLEVELS) extern void hypre_F90_NAME(fhypre_boomeramggetmaxlevels, FHYPRE_BOOMERAMGGETMAXLEVELS) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_BoomerAMGSetCoarsenCutFactor \ hypre_F90_NAME(fhypre_boomeramgsetcoarsencutfa, FHYPRE_BOOMERAMGSETCOARSENCUTFAC) extern void hypre_F90_NAME(fhypre_boomeramgsetcoarsencutfa, FHYPRE_BOOMERAMGSETCOARSENCUTFAC) (hypre_F90_Obj *, HYPRE_Real *); #define HYPRE_BoomerAMGGetCoarsenCutFactor \ hypre_F90_NAME(fhypre_boomeramggetcoarsencutfa, FHYPRE_BOOMERAMGGETCOARSENCUTFAC) extern void hypre_F90_NAME(fhypre_boomeramggetcoarsencutfa, FHYPRE_BOOMERAMGGETCOARSENCUTFAC) (hypre_F90_Obj *, HYPRE_Real *); #define HYPRE_BoomerAMGSetStrongThreshold \ hypre_F90_NAME(fhypre_boomeramgsetstrongthrshl, FHYPRE_BOOMERAMGSETSTRONGTHRSHL) extern void hypre_F90_NAME(fhypre_boomeramgsetstrongthrshl, FHYPRE_BOOMERAMGSETSTRONGTHRSHL) (hypre_F90_Obj *, HYPRE_Real *); #define HYPRE_BoomerAMGGetStrongThreshold \ hypre_F90_NAME(fhypre_boomeramggetstrongthrshl, FHYPRE_BOOMERAMGGETSTRONGTHRSHL) extern void hypre_F90_NAME(fhypre_boomeramggetstrongthrshl, FHYPRE_BOOMERAMGGETSTRONGTHRSHL) (hypre_F90_Obj *, HYPRE_Real *); #define HYPRE_BoomerAMGSetMaxRowSum \ hypre_F90_NAME(fhypre_boomeramgsetmaxrowsum, FHYPRE_BOOMERAMGSETMAXROWSUM) extern void hypre_F90_NAME(fhypre_boomeramgsetmaxrowsum, FHYPRE_BOOMERAMGSETMAXROWSUM) (hypre_F90_Obj *, HYPRE_Real *); #define HYPRE_BoomerAMGGetMaxRowSum \ hypre_F90_NAME(fhypre_boomeramggetmaxrowsum, FHYPRE_BOOMERAMGGETMAXROWSUM) extern void hypre_F90_NAME(fhypre_boomeramggetmaxrowsum, FHYPRE_BOOMERAMGGETMAXROWSUM) (hypre_F90_Obj *, HYPRE_Real *); #define HYPRE_BoomerAMGSetTruncFactor \ hypre_F90_NAME(fhypre_boomeramgsettruncfactor, FHYPRE_BOOMERAMGSETTRUNCFACTOR) extern void hypre_F90_NAME(fhypre_boomeramgsettruncfactor, FHYPRE_BOOMERAMGSETTRUNCFACTOR) (hypre_F90_Obj *, HYPRE_Real *); #define HYPRE_BoomerAMGGetTruncFactor \ hypre_F90_NAME(fhypre_boomeramggettruncfactor, FHYPRE_BOOMERAMGGETTRUNCFACTOR) extern void hypre_F90_NAME(fhypre_boomeramggettruncfactor, FHYPRE_BOOMERAMGGETTRUNCFACTOR) (hypre_F90_Obj *, HYPRE_Real *); #define HYPRE_BoomerAMGSetSCommPkgSwitch \ hypre_F90_NAME(fhypre_boomeramgsetscommpkgswit, FHYPRE_BOOMERAMGSETSCOMMPKGSWIT) extern void hypre_F90_NAME(fhypre_boomeramgsetscommpkgswit, FHYPRE_BOOMERAMGSETSCOMMPKGSWIT) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_BoomerAMGSetInterpType \ hypre_F90_NAME(fhypre_boomeramgsetinterptype, FHYPRE_BOOMERAMGSETINTERPTYPE) extern void hypre_F90_NAME(fhypre_boomeramgsetinterptype, FHYPRE_BOOMERAMGSETINTERPTYPE) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_BoomerAMGSetMinIter \ hypre_F90_NAME(fhypre_boomeramgsetminiter, FHYPRE_BOOMERAMGSETMINITER) extern void hypre_F90_NAME(fhypre_boomeramgsetminiter, FHYPRE_BOOMERAMGSETMINITER) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_BoomerAMGSetMaxIter \ hypre_F90_NAME(fhypre_boomeramgsetmaxiter, FHYPRE_BOOMERAMGSETMAXITER) extern void hypre_F90_NAME(fhypre_boomeramgsetmaxiter, FHYPRE_BOOMERAMGSETMAXITER) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_BoomerAMGGetMaxIter \ hypre_F90_NAME(fhypre_boomeramggetmaxiter, FHYPRE_BOOMERAMGGETMAXITER) extern void hypre_F90_NAME(fhypre_boomeramggetmaxiter, FHYPRE_BOOMERAMGGETMAXITER) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_BoomerAMGSetCoarsenType \ hypre_F90_NAME(fhypre_boomeramgsetcoarsentype, FHYPRE_BOOMERAMGSETCOARSENTYPE) extern void hypre_F90_NAME(fhypre_boomeramgsetcoarsentype, FHYPRE_BOOMERAMGSETCOARSENTYPE) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_BoomerAMGGetCoarsenType \ hypre_F90_NAME(fhypre_boomeramggetcoarsentype, FHYPRE_BOOMERAMGGETCOARSENTYPE) extern void hypre_F90_NAME(fhypre_boomeramggetcoarsentype, FHYPRE_BOOMERAMGGETCOARSENTYPE) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_BoomerAMGSetMeasureType \ hypre_F90_NAME(fhypre_boomeramgsetmeasuretype, FHYPRE_BOOMERAMGSETMEASURETYPE) extern void hypre_F90_NAME(fhypre_boomeramgsetmeasuretype, FHYPRE_BOOMERAMGSETMEASURETYPE) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_BoomerAMGGetMeasureType \ hypre_F90_NAME(fhypre_boomeramggetmeasuretype, FHYPRE_BOOMERAMGGETMEASURETYPE) extern void hypre_F90_NAME(fhypre_boomeramggetmeasuretype, FHYPRE_BOOMERAMGGETMEASURETYPE) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_BoomerAMGSetSetupType \ hypre_F90_NAME(fhypre_boomeramgsetsetuptype, FHYPRE_BOOMERAMGSETSETUPTYPE) extern void hypre_F90_NAME(fhypre_boomeramgsetsetuptype, FHYPRE_BOOMERAMGSETSETUPTYPE) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_BoomerAMGSetCycleType \ hypre_F90_NAME(fhypre_boomeramgsetcycletype, FHYPRE_BOOMERAMGSETCYCLETYPE) extern void hypre_F90_NAME(fhypre_boomeramgsetcycletype, FHYPRE_BOOMERAMGSETCYCLETYPE) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_BoomerAMGGetCycleType \ hypre_F90_NAME(fhypre_boomeramggetcycletype, FHYPRE_BOOMERAMGGETCYCLETYPE) extern void hypre_F90_NAME(fhypre_boomeramggetcycletype, FHYPRE_BOOMERAMGGETCYCLETYPE) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_BoomerAMGSetTol \ hypre_F90_NAME(fhypre_boomeramgsettol, FHYPRE_BOOMERAMGSETTOL) extern void hypre_F90_NAME(fhypre_boomeramgsettol, FHYPRE_BOOMERAMGSETTOL) (hypre_F90_Obj *, HYPRE_Real *); #define HYPRE_BoomerAMGGetTol \ hypre_F90_NAME(fhypre_boomeramggettol, FHYPRE_BOOMERAMGGETTOL) extern void hypre_F90_NAME(fhypre_boomeramggettol, FHYPRE_BOOMERAMGGETTOL) (hypre_F90_Obj *, HYPRE_Real *); #define HYPRE_BoomerAMGSetNumSweeps \ hypre_F90_NAME(fhypre_boomeramgsetnumsweeps, FHYPRE_BOOMERAMGSETNUMSWEEPS) extern void hypre_F90_NAME(fhypre_boomeramgsetnumsweeps, FHYPRE_BOOMERAMGSETNUMSWEEPS) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_BoomerAMGSetCycleNumSweeps \ hypre_F90_NAME(fhypre_boomeramgsetcyclenumswee, FHYPRE_BOOMERAMGSETCYCLENUMSWEE) extern void hypre_F90_NAME(fhypre_boomeramgsetcyclenumswee, FHYPRE_BOOMERAMGSETCYCLENUMSWEE) (hypre_F90_Obj *, HYPRE_Int *, HYPRE_Int *); #define HYPRE_BoomerAMGGetCycleNumSweeps \ hypre_F90_NAME(fhypre_boomeramggetcyclenumswee, FHYPRE_BOOMERAMGGETCYCLENUMSWEE) extern void hypre_F90_NAME(fhypre_boomeramggetcyclenumswee, FHYPRE_BOOMERAMGGETCYCLENUMSWEE) (hypre_F90_Obj *, HYPRE_Int *, HYPRE_Int *); #define HYPRE_BoomerAMGInitGridRelaxation \ hypre_F90_NAME(fhypre_boomeramginitgridrelaxat, FHYPRE_BOOMERAMGINITGRIDRELAXAT) extern void hypre_F90_NAME(fhypre_boomeramginitgridrelaxat, FHYPRE_BOOMERAMGINITGRIDRELAXAT) (hypre_F90_Obj *, hypre_F90_Obj *, hypre_F90_Obj *, HYPRE_Int *, hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_BoomerAMGFinalizeGridRelaxation \ hypre_F90_NAME(fhypre_boomeramgfingridrelaxatn, FHYPRE_BOOMERAMGFINGRIDRELAXATN) extern void hypre_F90_NAME(fhypre_boomeramgfingridrelaxatn, FHYPRE_BOOMERAMGFINGRIDRELAXATN) (hypre_F90_Obj *, hypre_F90_Obj *, hypre_F90_Obj *, hypre_F90_Obj *); #define HYPRE_BoomerAMGSetRelaxType \ hypre_F90_NAME(fhypre_boomeramgsetrelaxtype, FHYPRE_BOOMERAMGSETRELAXTYPE) extern void hypre_F90_NAME(fhypre_boomeramgsetrelaxtype, FHYPRE_BOOMERAMGSETRELAXTYPE) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_BoomerAMGSetRelaxType \ hypre_F90_NAME(fhypre_boomeramgsetrelaxtype, FHYPRE_BOOMERAMGSETRELAXTYPE) extern void hypre_F90_NAME(fhypre_boomeramgsetrelaxtype, FHYPRE_BOOMERAMGSETRELAXTYPE) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_BoomerAMGSetRelaxOrder \ hypre_F90_NAME(fhypre_boomeramgsetrelaxorder, FHYPRE_BOOMERAMGSETRELAXORDER) extern void hypre_F90_NAME(fhypre_boomeramgsetrelaxorder, FHYPRE_BOOMERAMGSETRELAXORDER) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_BoomerAMGSetRelaxWeight \ hypre_F90_NAME(fhypre_boomeramgsetrelaxweight, FHYPRE_BOOMERAMGSETRELAXWEIGHT) extern void hypre_F90_NAME(fhypre_boomeramgsetrelaxweight, FHYPRE_BOOMERAMGSETRELAXWEIGHT) (hypre_F90_Obj *, hypre_F90_Obj *); #define HYPRE_BoomerAMGSetRelaxWt \ hypre_F90_NAME(fhypre_boomeramgsetrelaxwt, FHYPRE_BOOMERAMGSETRELAXWT) extern void hypre_F90_NAME(fhypre_boomeramgsetrelaxwt, FHYPRE_BOOMERAMGSETRELAXWT) (hypre_F90_Obj *, HYPRE_Real *); #define HYPRE_BoomerAMGSetLevelRelaxWt \ hypre_F90_NAME(fhypre_boomeramgsetlevelrelaxwt, FHYPRE_BOOMERAMGSETLEVELRELAXWT) extern void hypre_F90_NAME(fhypre_boomeramgsetlevelrelaxwt, FHYPRE_BOOMERAMGSETLEVELRELAXWT) (hypre_F90_Obj *, HYPRE_Real *, HYPRE_Int *); #define HYPRE_BoomerAMGSetOuterWt \ hypre_F90_NAME(fhypre_boomeramgsetouterwt, FHYPRE_BOOMERAMGSETOUTERWT) extern void hypre_F90_NAME(fhypre_boomeramgsetouterwt, FHYPRE_BOOMERAMGSETOUTERWT) (hypre_F90_Obj *, HYPRE_Real *); #define HYPRE_BoomerAMGSetLevelOuterWt \ hypre_F90_NAME(fhypre_boomeramgsetlevelouterwt, FHYPRE_BOOMERAMGSETLEVELOUTERWT) extern void hypre_F90_NAME(fhypre_boomeramgsetlevelouterwt, FHYPRE_BOOMERAMGSETLEVELOUTERWT) (hypre_F90_Obj *, HYPRE_Real *); #define HYPRE_BoomerAMGSetSmoothType \ hypre_F90_NAME(fhypre_boomeramgsetsmoothtype, FHYPRE_BOOMERAMGSETSMOOTHTYPE) extern void hypre_F90_NAME(fhypre_boomeramgsetsmoothtype, FHYPRE_BOOMERAMGSETSMOOTHTYPE) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_BoomerAMGGetSmoothType \ hypre_F90_NAME(fhypre_boomeramggetsmoothtype, FHYPRE_BOOMERAMGGETSMOOTHTYPE) extern void hypre_F90_NAME(fhypre_boomeramggetsmoothtype, FHYPRE_BOOMERAMGGETSMOOTHTYPE) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_BoomerAMGSetSmoothNumLvls \ hypre_F90_NAME(fhypre_boomeramgsetsmoothnumlvl, FHYPRE_BOOMERAMGSETSMOOTHNUMLVL) extern void hypre_F90_NAME(fhypre_boomeramgsetsmoothnumlvl, FHYPRE_BOOMERAMGSETSMOOTHNUMLVL) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_BoomerAMGGetSmoothNumLvls \ hypre_F90_NAME(fhypre_boomeramggetsmoothnumlvl, FHYPRE_BOOMERAMGGETSMOOTHNUMLVL) extern void hypre_F90_NAME(fhypre_boomeramggetsmoothnumlvl, FHYPRE_BOOMERAMGGETSMOOTHNUMLVL) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_BoomerAMGSetSmoothNumSwps \ hypre_F90_NAME(fhypre_boomeramgsetsmoothnumswp, FHYPRE_BOOMERAMGSETSMOOTHNUMSWP) extern void hypre_F90_NAME(fhypre_boomeramgsetsmoothnumswp, FHYPRE_BOOMERAMGSETSMOOTHNUMSWP) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_BoomerAMGGetSmoothNumSwps \ hypre_F90_NAME(fhypre_boomeramggetsmoothnumswp, FHYPRE_BOOMERAMGGETSMOOTHNUMSWP) extern void hypre_F90_NAME(fhypre_boomeramggetsmoothnumswp, FHYPRE_BOOMERAMGGETSMOOTHNUMSWP) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_BoomerAMGSetLogging \ hypre_F90_NAME(fhypre_boomeramgsetlogging, FHYPRE_BOOMERAMGSETLOGGING) extern void hypre_F90_NAME(fhypre_boomeramgsetlogging, FHYPRE_BOOMERAMGSETLOGGING) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_BoomerAMGGetLogging \ hypre_F90_NAME(fhypre_boomeramggetlogging, FHYPRE_BOOMERAMGGETLOGGING) extern void hypre_F90_NAME(fhypre_boomeramggetlogging, FHYPRE_BOOMERAMGGETLOGGING) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_BoomerAMGSetPrintLevel \ hypre_F90_NAME(fhypre_boomeramgsetprintlevel, FHYPRE_BOOMERAMGSETPRINTLEVEL) extern void hypre_F90_NAME(fhypre_boomeramgsetprintlevel, FHYPRE_BOOMERAMGSETPRINTLEVEL) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_BoomerAMGGetPrintLevel \ hypre_F90_NAME(fhypre_boomeramggetprintlevel, FHYPRE_BOOMERAMGGETPRINTLEVEL) extern void hypre_F90_NAME(fhypre_boomeramggetprintlevel, FHYPRE_BOOMERAMGGETPRINTLEVEL) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_BoomerAMGSetPrintFileName \ hypre_F90_NAME(fhypre_boomeramgsetprintfilenam, FHYPRE_BOOMERAMGSETPRINTFILENAM) extern void hypre_F90_NAME(fhypre_boomeramgsetprintfilenam, FHYPRE_BOOMERAMGSETPRINTFILENAM) (hypre_F90_Obj *, char *); #define HYPRE_BoomerAMGSetDebugFlag \ hypre_F90_NAME(fhypre_boomeramgsetdebugflag, FHYPRE_BOOMERAMGSETDEBUGFLAG) extern void hypre_F90_NAME(fhypre_boomeramgsetdebugflag, FHYPRE_BOOMERAMGSETDEBUGFLAG) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_BoomerAMGGetDebugFlag \ hypre_F90_NAME(fhypre_boomeramggetdebugflag, FHYPRE_BOOMERAMGGETDEBUGFLAG) extern void hypre_F90_NAME(fhypre_boomeramggetdebugflag, FHYPRE_BOOMERAMGGETDEBUGFLAG) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_BoomerAMGGetNumIterations \ hypre_F90_NAME(fhypre_boomeramggetnumiteration, FHYPRE_BOOMERAMGGETNUMITERATION) extern void hypre_F90_NAME(fhypre_boomeramggetnumiteration, FHYPRE_BOOMERAMGGETNUMITERATION) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_BoomerAMGGetCumNumIterations \ hypre_F90_NAME(fhypre_boomeramggetcumnumiterat, FHYPRE_BOOMERAMGGETCUMNUMITERAT) extern void hypre_F90_NAME(fhypre_boomeramggetcumnumiterat, FHYPRE_BOOMERAMGGETCUMNUMITERAT) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_BoomerAMGGetResidual \ hypre_F90_NAME(fhypre_boomeramggetresidual, FHYPRE_BOOMERAMGGETRESIDUAL) extern void hypre_F90_NAME(fhypre_boomeramggetresidual, FHYPRE_BOOMERAMGGETRESIDUAL) (hypre_F90_Obj *, HYPRE_Real *); #define HYPRE_BoomerAMGGetFinalRelativeResidualNorm \ hypre_F90_NAME(fhypre_boomeramggetfinalreltvre, FHYPRE_BOOMERAMGGETFINALRELTVRE) extern void hypre_F90_NAME(fhypre_boomeramggetfinalreltvre, FHYPRE_BOOMERAMGGETFINALRELTVRE) (hypre_F90_Obj *, HYPRE_Real *); #define HYPRE_BoomerAMGSetVariant \ hypre_F90_NAME(fhypre_boomeramgsetvariant, FHYPRE_BOOMERAMGSETVARIANT) extern void hypre_F90_NAME(fhypre_boomeramgsetvariant, FHYPRE_BOOMERAMGSETVARIANT) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_BoomerAMGGetVariant \ hypre_F90_NAME(fhypre_boomeramggetvariant, FHYPRE_BOOMERAMGGETVARIANT) extern void hypre_F90_NAME(fhypre_boomeramggetvariant, FHYPRE_BOOMERAMGGETVARIANT) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_BoomerAMGSetOverlap \ hypre_F90_NAME(fhypre_boomeramgsetoverlap, FHYPRE_BOOMERAMGSETOVERLAP) extern void hypre_F90_NAME(fhypre_boomeramgsetoverlap, FHYPRE_BOOMERAMGSETOVERLAP) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_BoomerAMGGetOverlap \ hypre_F90_NAME(fhypre_boomeramggetoverlap, FHYPRE_BOOMERAMGGETOVERLAP) extern void hypre_F90_NAME(fhypre_boomeramggetoverlap, FHYPRE_BOOMERAMGGETOVERLAP) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_BoomerAMGSetDomainType \ hypre_F90_NAME(fhypre_boomeramgsetdomaintype, FHYPRE_BOOMERAMGSETDOMAINTYPE) extern void hypre_F90_NAME(fhypre_boomeramgsetdomaintype, FHYPRE_BOOMERAMGSETDOMAINTYPE) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_BoomerAMGGetDomainType \ hypre_F90_NAME(fhypre_boomeramggetdomaintype, FHYPRE_BOOMERAMGGETDOMAINTYPE) extern void hypre_F90_NAME(fhypre_boomeramggetdomaintype, FHYPRE_BOOMERAMGGETDOMAINTYPE) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_BoomerAMGSetSchwarzRlxWt \ hypre_F90_NAME(fhypre_boomeramgsetschwarzrlxwt, FHYPRE_BOOMERAMGSETSCHWARZRLXWT) extern void hypre_F90_NAME(fhypre_boomeramgsetschwarzrlxwt, FHYPRE_BOOMERAMGSETSCHWARZRLXWT) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_BoomerAMGGetSchwarzRlxWt \ hypre_F90_NAME(fhypre_boomeramggetschwarzrlxwt, FHYPRE_BOOMERAMGGETSCHWARZRLXWT) extern void hypre_F90_NAME(fhypre_boomeramggetschwarzrlxwt, FHYPRE_BOOMERAMGGETSCHWARZRLXWT) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_BoomerAMGSetSym \ hypre_F90_NAME(fhypre_boomeramgsetsym, FHYPRE_BOOMERAMGSETSYM) extern void hypre_F90_NAME(fhypre_boomeramgsetsym, FHYPRE_BOOMERAMGSETSYM) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_BoomerAMGSetLevel \ hypre_F90_NAME(fhypre_boomeramgsetlevel, FHYPRE_BOOMERAMGSETLEVEL) extern void hypre_F90_NAME(fhypre_boomeramgsetlevel, FHYPRE_BOOMERAMGSETLEVEL) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_BoomerAMGSetFilter \ hypre_F90_NAME(fhypre_boomeramgsetfilter, FHYPRE_BOOMERAMGSETFILTER) extern void hypre_F90_NAME(fhypre_boomeramgsetfilter, FHYPRE_BOOMERAMGSETFILTER) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_BoomerAMGSetDropTol \ hypre_F90_NAME(fhypre_boomeramgsetdroptol, FHYPRE_BOOMERAMGSETDROPTOL) extern void hypre_F90_NAME(fhypre_boomeramgsetdroptol, FHYPRE_BOOMERAMGSETDROPTOL) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_BoomerAMGSetMaxNzPerRow \ hypre_F90_NAME(fhypre_boomeramgsetmaxnzperrow, FHYPRE_BOOMERAMGSETMAXNZPERROW) extern void hypre_F90_NAME(fhypre_boomeramgsetmaxnzperrow, FHYPRE_BOOMERAMGSETMAXNZPERROW) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_BoomerAMGSetEuclidFile \ hypre_F90_NAME(fhypre_boomeramgseteuclidfile, FHYPRE_BOOMERAMGSETEUCLIDFILE) extern void hypre_F90_NAME(fhypre_boomeramgseteuclidfile, FHYPRE_BOOMERAMGSETEUCLIDFILE) (hypre_F90_Obj *, char *); #define HYPRE_BoomerAMGSetNumFunctions \ hypre_F90_NAME(fhypre_boomeramgsetnumfunctions, FHYPRE_BOOMERAMGSETNUMFUNCTIONS) extern void hypre_F90_NAME(fhypre_boomeramgsetnumfunctions, FHYPRE_BOOMERAMGSETNUMFUNCTIONS) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_BoomerAMGGetNumFunctions \ hypre_F90_NAME(fhypre_boomeramggetnumfunctions, FHYPRE_BOOMERAMGGETNUMFUNCTIONS) extern void hypre_F90_NAME(fhypre_boomeramggetnumfunctions, FHYPRE_BOOMERAMGGETNUMFUNCTIONS) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_BoomerAMGSetNodal \ hypre_F90_NAME(fhypre_boomeramgsetnodal, FHYPRE_BOOMERAMGSETNODAL) extern void hypre_F90_NAME(fhypre_boomeramgsetnodal, FHYPRE_BOOMERAMGSETNODAL) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_BoomerAMGSetDofFunc \ hypre_F90_NAME(fhypre_boomeramgsetdoffunc, FHYPRE_BOOMERAMGSETDOFFUNC) extern void hypre_F90_NAME(fhypre_boomeramgsetdoffunc, FHYPRE_BOOMERAMGSETDOFFUNC) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_BoomerAMGSetNumPaths \ hypre_F90_NAME(fhypre_boomeramgsetnumpaths, FHYPRE_BOOMERAMGSETNUMPATHS) extern void hypre_F90_NAME(fhypre_boomeramgsetnumpaths, FHYPRE_BOOMERAMGSETNUMPATHS) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_BoomerAMGSetAggNumLevels \ hypre_F90_NAME(fhypre_boomeramgsetaggnumlevels, FHYPRE_BOOMERAMGSETAGGNUMLEVELS) extern void hypre_F90_NAME(fhypre_boomeramgsetaggnumlevels, FHYPRE_BOOMERAMGSETAGGNUMLEVELS) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_BoomerAMGSetGSMG \ hypre_F90_NAME(fhypre_boomeramgsetgsmg, FHYPRE_BOOMERAMGSETGSMG) extern void hypre_F90_NAME(fhypre_boomeramgsetgsmg, FHYPRE_BOOMERAMGSETGSMG) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_BoomerAMGSetNumSamples \ hypre_F90_NAME(fhypre_boomeramgsetnumsamples, FHYPRE_BOOMERAMGSETNUMSAMPLES) extern void hypre_F90_NAME(fhypre_boomeramgsetsamples, FHYPRE_BOOMERAMGSETNUMSAMPLES) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_ParCSRBiCGSTABCreate \ hypre_F90_NAME(fhypre_parcsrbicgstabcreate, FHYPRE_PARCSRBICGSTABCREATE) extern void hypre_F90_NAME(fhypre_parcsrbicgstabcreate, FHYPRE_PARCSRBICGSTABCREATE) (HYPRE_Int *, hypre_F90_Obj *); #define HYPRE_ParCSRBiCGSTABDestroy \ hypre_F90_NAME(fhypre_parcsrbicgstabdestroy, FHYPRE_PARCSRBICGSTABDESTROY) extern void hypre_F90_NAME(fhypre_parcsrbicgstabdestroy, FHYPRE_PARCSRBICGSTABDESTROY) (hypre_F90_Obj *); #define HYPRE_ParCSRBiCGSTABSetup \ hypre_F90_NAME(fhypre_parcsrbicgstabsetup, FHYPRE_PARCSRBICGSTABSETUP) extern void hypre_F90_NAME(fhypre_parcsrbicgstabsetup, FHYPRE_PARCSRBICGSTABSETUP) (hypre_F90_Obj *, hypre_F90_Obj *, hypre_F90_Obj *, hypre_F90_Obj *); #define HYPRE_ParCSRBiCGSTABSolve \ hypre_F90_NAME(fhypre_parcsrbicgstabsolve, FHYPRE_PARCSRBICGSTABSOLVE) extern void hypre_F90_NAME(fhypre_parcsrbicgstabsolve, FHYPRE_PARCSRBICGSTABSOLVE) (hypre_F90_Obj *, hypre_F90_Obj *, hypre_F90_Obj *, hypre_F90_Obj *); #define HYPRE_ParCSRBiCGSTABSetTol \ hypre_F90_NAME(fhypre_parcsrbicgstabsettol, FHYPRE_PARCSRBICGSTABSETTOL) extern void hypre_F90_NAME(fhypre_parcsrbicgstabsettol, FHYPRE_PARCSRBICGSTABSETTOL) (hypre_F90_Obj *, HYPRE_Real *); #define HYPRE_ParCSRBiCGSTABSetMinIter \ hypre_F90_NAME(fhypre_parcsrbicgstabsetminiter, FHYPRE_PARCSRBICGSTABSETMINITER) extern void hypre_F90_NAME(fhypre_parcsrbicgstabsetminiter, FHYPRE_PARCSRBICGSTABSETMINITER) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_ParCSRBiCGSTABSetMaxIter \ hypre_F90_NAME(fhypre_parcsrbicgstabsetmaxiter, FHYPRE_PARCSRBICGSTABSETMAXITER) extern void hypre_F90_NAME(fhypre_parcsrbicgstabsetmaxiter, FHYPRE_PARCSRBICGSTABSETMAXITER) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_ParCSRBiCGSTABSetStopCrit \ hypre_F90_NAME(fhypre_parcsrbicgstabsetstopcri, FHYPRE_PARCSRBICGSTABSETSTOPCRI) extern void hypre_F90_NAME(fhypre_parcsrbicgstabsetstopcri, FHYPRE_PARCSRBICGSTABSETSTOPCRI) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_ParCSRBiCGSTABSetPrecond \ hypre_F90_NAME(fhypre_parcsrbicgstabsetprecond, FHYPRE_PARCSRBICGSTABSETPRECOND) extern void hypre_F90_NAME(fhypre_parcsrbicgstabsetprecond, FHYPRE_PARCSRBICGSTABSETPRECOND) (hypre_F90_Obj *, HYPRE_Int *, hypre_F90_Obj *); #define HYPRE_ParCSRBiCGSTABGetPrecond \ hypre_F90_NAME(fhypre_parcsrbicgstabgetprecond, FHYPRE_PARCSRBICGSTABGETPRECOND) extern void hypre_F90_NAME(fhypre_parcsrbicgstabgetprecond, FHYPRE_PARCSRBICGSTABGETPRECOND) (hypre_F90_Obj *, hypre_F90_Obj *); #define HYPRE_ParCSRBiCGSTABSetLogging \ hypre_F90_NAME(fhypre_parcsrbicgstabsetlogging, FHYPRE_PARCSRBICGSTABSETLOGGING) extern void hypre_F90_NAME(fhypre_parcsrbicgstabsetlogging, FHYPRE_PARCSRBICGSTABSETLOGGING) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_ParCSRBiCGSTABSetPrintLevel \ hypre_F90_NAME(fhypre_parcsrbicgstabsetprintle, FHYPRE_PARCSRBICGSTABSETPRINTLE) extern void hypre_F90_NAME(fhypre_parcsrbicgstabsetprintle, FHYPRE_PARCSRBICGSTABSETPRINTLE) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_ParCSRBiCGSTABGetNumIter \ hypre_F90_NAME(fhypre_parcsrbicgstabgetnumiter, FHYPRE_PARCSRBICGSTABGETNUMITER) extern void hypre_F90_NAME(fhypre_parcsrbicgstabgetnumiter, FHYPRE_PARCSRBICGSTABGETNUMITER) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_ParCSRBiCGSTABGetFinalRel \ hypre_F90_NAME(fhypre_parcsrbicgstabgetfinalre, FHYPRE_PARCSRBICGSTABGETFINALRE) extern void hypre_F90_NAME(fhypre_parcsrbicgstabgetfinalre, FHYPRE_PARCSRBICGSTABGETFINALRE) (hypre_F90_Obj *, HYPRE_Real *); #define HYPRE_BlockTridiagCreate \ hypre_F90_NAME(fhypre_blocktridiagcreate, FHYPRE_BLOCKTRIDIAGCREATE) extern void hypre_F90_NAME(fhypre_blocktridiagcreate, FHYPRE_BLOCKTRIDIAGCREATE) (hypre_F90_Obj *); #define HYPRE_BlockTridiagDestroy \ hypre_F90_NAME(fhypre_blocktridiagdestroy, FHYPRE_BLOCKTRIDIAGDESTROY) extern void hypre_F90_NAME(fhypre_blocktridiagdestroy, FHYPRE_BLOCKTRIDIAGDESTROY) (hypre_F90_Obj *); #define HYPRE_BlockTridiagSetup \ hypre_F90_NAME(fhypre_blocktridiagsetup, FHYPRE_BLOCKTRIDIAGSETUP) extern void hypre_F90_NAME(fhypre_blocktridiagsetup, FHYPRE_BLOCKTRIDIAGSETUP) (hypre_F90_Obj *, hypre_F90_Obj *, hypre_F90_Obj *, hypre_F90_Obj *); #define HYPRE_BlockTridiagSolve \ hypre_F90_NAME(fhypre_blocktridiagsolve, FHYPRE_BLOCKTRIDIAGSOLVE) extern void hypre_F90_NAME(fhypre_blocktridiagsolve, FHYPRE_BLOCKTRIDIAGSOLVE) (hypre_F90_Obj *, hypre_F90_Obj *, hypre_F90_Obj *, hypre_F90_Obj *); #define HYPRE_BlockTridiagSetIndexSet \ hypre_F90_NAME(fhypre_blocktridiagsetindexset, FHYPRE_BLOCKTRIDIAGSETINDEXSET) extern void hypre_F90_NAME(fhypre_blocktridiagsetindexset, FHYPRE_BLOCKTRIDIAGSETINDEXSET) (hypre_F90_Obj *, HYPRE_Int *, HYPRE_Int *); #define HYPRE_BlockTridiagSetAMGStrengthThreshold \ hypre_F90_NAME(fhypre_blocktridiagsetamgstreng, FHYPRE_BLOCKTRIDIAGSETAMGSTRENG) extern void hypre_F90_NAME(fhypre_blocktridiagsetamgstreng, FHYPRE_BLOCKTRIDIAGSETAMGSTRENG) (hypre_F90_Obj *, HYPRE_Real *); #define HYPRE_BlockTridiagSetAMGNumSweeps \ hypre_F90_NAME(fhypre_blocktridiagsetamgnumswe, FHYPRE_BLOCKTRIDIAGSETAMGNUMSWE) extern void hypre_F90_NAME(fhypre_blocktridiagsetamgnumswe, FHYPRE_BLOCKTRIDIAGSETAMGNUMSWE) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_BlockTridiagSetAMGRelaxType \ hypre_F90_NAME(fhypre_blocktridiagsetamgrelaxt, FHYPRE_BLOCKTRIDIAGSETAMGRELAXT) extern void hypre_F90_NAME(fhypre_blocktridiagsetamgrelaxt, FHYPRE_BLOCKTRIDIAGSETAMGRELAXT) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_BlockTridiagSetPrintLevel \ hypre_F90_NAME(fhypre_blocktridiagsetprintleve, FHYPRE_BLOCKTRIDIAGSETPRINTLEVE) extern void hypre_F90_NAME(fhypre_blocktridiagsetprintleve, FHYPRE_BLOCKTRIDIAGSETPRINTLEVE) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_ParCSRCGNRCreate \ hypre_F90_NAME(fhypre_parcsrcgnrcreate, FHYPRE_PARCSRCGNRCREATE) extern void hypre_F90_NAME(fhypre_parcsrcgnrcreate, FHYPRE_PARCSRCGNRCREATE) (HYPRE_Int *, hypre_F90_Obj *); #define HYPRE_ParCSRCGNRDestroy \ hypre_F90_NAME(fhypre_parcsrcgnrdestroy, FHYPRE_PARCSRCGNRDESTROY) extern void hypre_F90_NAME(fhypre_parcsrcgnrdestroy, FHYPRE_PARCSRCGNRDESTROY) (hypre_F90_Obj *); #define HYPRE_ParCSRCGNRSetup \ hypre_F90_NAME(fhypre_parcsrcgnrsetup, FHYPRE_PARCSRCGNRSETUP) extern void hypre_F90_NAME(fhypre_parcsrcgnrsetup, FHYPRE_PARCSRCGNRSETUP) (hypre_F90_Obj *, hypre_F90_Obj *, hypre_F90_Obj *, hypre_F90_Obj *); #define HYPRE_ParCSRCGNRSolve \ hypre_F90_NAME(fhypre_parcsrcgnrsolve, FHYPRE_PARCSRCGNRSOLVE) extern void hypre_F90_NAME(fhypre_parcsrcgnrsolve, FHYPRE_PARCSRCGNRSOLVE) (hypre_F90_Obj *, hypre_F90_Obj *, hypre_F90_Obj *, hypre_F90_Obj *); #define HYPRE_ParCSRCGNRSetTol \ hypre_F90_NAME(fhypre_parcsrcgnrsettol, FHYPRE_PARCSRCGNRSETTOL) extern void hypre_F90_NAME(fhypre_parcsrcgnrsettol, FHYPRE_PARCSRCGNRSETTOL) (hypre_F90_Obj *, HYPRE_Real *); #define HYPRE_ParCSRCGNRSetMinIter \ hypre_F90_NAME(fhypre_parcsrcgnrsetminiter, FHYPRE_PARCSRCGNRSETMINITER) extern void hypre_F90_NAME(fhypre_parcsrcgnrsetminiter, FHYPRE_PARCSRCGNRSETMINITER) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_ParCSRCGNRSetMaxIter \ hypre_F90_NAME(fhypre_parcsrcgnrsetmaxiter, FHYPRE_PARCSRCGNRSETMAXITER) extern void hypre_F90_NAME(fhypre_parcsrcgnrsetmaxiter, FHYPRE_PARCSRCGNRSETMAXITER) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_ParCSRCGNRSetStopCrit \ hypre_F90_NAME(fhypre_parcsrcgnrsetstopcri, FHYPRE_PARCSRCGNRSETSTOPCRI) extern void hypre_F90_NAME(fhypre_parcsrcgnrsetstopcri, FHYPRE_PARCSRCGNRSETSTOPCRI) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_ParCSRCGNRSetPrecond \ hypre_F90_NAME(fhypre_parcsrcgnrsetprecond, FHYPRE_PARCSRCGNRSETPRECOND) extern void hypre_F90_NAME(fhypre_parcsrcgnrsetprecond, FHYPRE_PARCSRCGNRSETPRECOND) (hypre_F90_Obj *, HYPRE_Int *, hypre_F90_Obj *); #define HYPRE_ParCSRCGNRGetPrecond \ hypre_F90_NAME(fhypre_parcsrcgnrgetprecond, FHYPRE_PARCSRCGNRGETPRECOND) extern void hypre_F90_NAME(fhypre_parcsrcgnrgetprecond, FHYPRE_PARCSRCGNRGETPRECOND) (hypre_F90_Obj *, hypre_F90_Obj *); #define HYPRE_ParCSRCGNRSetLogging \ hypre_F90_NAME(fhypre_parcsrcgnrsetlogging, FHYPRE_PARCSRCGNRSETLOGGING) extern void hypre_F90_NAME(fhypre_parcsrcgnrsetlogging, FHYPRE_PARCSRCGNRSETLOGGING) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_ParCSRCGNRGetNumIteration \ hypre_F90_NAME(fhypre_parcsrcgnrgetnumiteratio, FHYPRE_PARCSRCGNRGETNUMITERATIO) extern void hypre_F90_NAME(fhypre_parcsrcgnrgetnumiteratio, FHYPRE_PARCSRCGNRGETNUMITERATIO) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_ParCSRCGNRGetFinalRelativeResidualNorm \ hypre_F90_NAME(fhypre_parcsrcgnrgetfinalrelati, FHYPRE_PARCSRCGNRGETFINALRELATI) extern void hypre_F90_NAME(fhypre_parcsrcgnrgetfinalrelati, FHYPRE_PARCSRCGNRGETFINALRELATI) (hypre_F90_Obj *, HYPRE_Real *); #define HYPRE_EuclidCreate \ hypre_F90_NAME(fhypre_euclidcreate, FHYPRE_EUCLIDCREATE) extern void hypre_F90_NAME(fhypre_euclidcreate, FHYPRE_EUCLIDCREATE) (HYPRE_Int *, hypre_F90_Obj *); #define HYPRE_EuclidDestroy \ hypre_F90_NAME(fhypre_eucliddestroy, FHYPRE_EUCLIDDESTROY) extern void hypre_F90_NAME(fhypre_eucliddestroy, FHYPRE_EUCLIDDESTROY) (hypre_F90_Obj *); #define HYPRE_EuclidSetup \ hypre_F90_NAME(fhypre_euclidsetup, FHYPRE_EUCLIDSETUP) extern void hypre_F90_NAME(fhypre_euclidsetup, FHYPRE_EUCLIDSETUP) (hypre_F90_Obj *, hypre_F90_Obj *, hypre_F90_Obj *, hypre_F90_Obj *); #define HYPRE_EuclidSolve \ hypre_F90_NAME(fhypre_euclidsolve, FHYPRE_EUCLIDSOLVE) extern void hypre_F90_NAME(fhypre_euclidsolve, FHYPRE_EUCLIDSOLVE) (hypre_F90_Obj *, hypre_F90_Obj *, hypre_F90_Obj *, hypre_F90_Obj *); #define HYPRE_EuclidSetParams \ hypre_F90_NAME(fhypre_euclidsetparams, FHYPRE_EUCLIDSETPARAMS) extern void hypre_F90_NAME(fhypre_euclidsetparams, FHYPRE_EUCLIDSETPARAMS) (hypre_F90_Obj *, HYPRE_Int *, char *); #define HYPRE_EuclidSetParamsFromFile \ hypre_F90_NAME(fhypre_euclidsetparamsfromfile, FHYPRE_EUCLIDSETPARAMSFROMFILE) extern void hypre_F90_NAME(fhypre_euclidsetparamsfromfile, FHYPRE_EUCLIDSETPARAMSFROMFILE) (hypre_F90_Obj *, char *); #define HYPRE_ParCSRGMRESCreate \ hypre_F90_NAME(fhypre_parcsrgmrescreate, FHYPRE_PARCSRGMRESCREATE) extern void hypre_F90_NAME(fhypre_parcsrgmrescreate, FHYPRE_PARCSRGMRESCREATE) (HYPRE_Int *, hypre_F90_Obj *); #define HYPRE_ParCSRGMRESDestroy \ hypre_F90_NAME(fhypre_parcsrgmresdestroy, FHYPRE_PARCSRGMRESDESTROY) extern void hypre_F90_NAME(fhypre_parcsrgmresdestroy, FHYPRE_PARCSRGMRESDESTROY) (hypre_F90_Obj *); #define HYPRE_ParCSRGMRESSetup \ hypre_F90_NAME(fhypre_parcsrgmressetup, FHYPRE_PARCSRGMRESSETUP) extern void hypre_F90_NAME(fhypre_parcsrgmressetup, FHYPRE_PARCSRGMRESSETUP) (hypre_F90_Obj *, hypre_F90_Obj *, hypre_F90_Obj *, hypre_F90_Obj *); #define HYPRE_ParCSRGMRESSolve \ hypre_F90_NAME(fhypre_parcsrgmressolve, FHYPRE_PARCSRGMRESSOLVE) extern void hypre_F90_NAME(fhypre_parcsrgmressolve, FHYPRE_PARCSRGMRESSOLVE) (hypre_F90_Obj *, hypre_F90_Obj *, hypre_F90_Obj *, hypre_F90_Obj *); #define HYPRE_ParCSRGMRESSetKDim \ hypre_F90_NAME(fhypre_parcsrgmressetkdim, FHYPRE_PARCSRGMRESSETKDIM) extern void hypre_F90_NAME(fhypre_parcsrgmressetkdim, FHYPRE_PARCSRGMRESSETKDIM) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_ParCSRGMRESSetTol \ hypre_F90_NAME(fhypre_parcsrgmressettol, FHYPRE_PARCSRGMRESSETTOL) extern void hypre_F90_NAME(fhypre_parcsrgmressettol, FHYPRE_PARCSRGMRESSETTOL) (hypre_F90_Obj *, HYPRE_Real *); #define HYPRE_ParCSRGMRESSetMinIter \ hypre_F90_NAME(fhypre_parcsrgmressetminiter, FHYPRE_PARCSRGMRESSETMINITER) extern void hypre_F90_NAME(fhypre_parcsrgmressetminiter, FHYPRE_PARCSRGMRESSETMINITER) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_ParCSRGMRESSetMaxIter \ hypre_F90_NAME(fhypre_parcsrgmressetmaxiter, FHYPRE_PARCSRGMRESSETMAXITER) extern void hypre_F90_NAME(fhypre_parcsrgmressetmaxiter, FHYPRE_PARCSRGMRESSETMAXITER) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_ParCSRGMRESSetPrecond \ hypre_F90_NAME(fhypre_parcsrgmressetprecond, FHYPRE_PARCSRGMRESSETPRECOND) extern void hypre_F90_NAME(fhypre_parcsrgmressetprecond, FHYPRE_PARCSRGMRESSETPRECOND) (hypre_F90_Obj *, HYPRE_Int *, hypre_F90_Obj *); #define HYPRE_ParCSRGMRESGetPrecond \ hypre_F90_NAME(fhypre_parcsrgmresgetprecond, FHYPRE_PARCSRGMRESGETPRECOND) extern void hypre_F90_NAME(fhypre_parcsrgmresgetprecond, FHYPRE_PARCSRGMRESGETPRECOND) (hypre_F90_Obj *, hypre_F90_Obj *); #define HYPRE_ParCSRGMRESSetLogging \ hypre_F90_NAME(fhypre_parcsrgmressetlogging, FHYPRE_PARCSRGMRESSETLOGGING) extern void hypre_F90_NAME(fhypre_parcsrgmressetlogging, FHYPRE_PARCSRGMRESSETLOGGING) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_ParCSRGMRESSetPrintLevel \ hypre_F90_NAME(fhypre_parcsrgmressetprintlevel, FHYPRE_PARCSRGMRESSETPRINTLEVEL) extern void hypre_F90_NAME(fhypre_parcsrgmressetprintlevel, FHYPRE_PARCSRGMRESSETPRINTLEVEL) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_ParCSRGMRESGetNumIterations \ hypre_F90_NAME(fhypre_parcsrgmresgetnumiterati, FHYPRE_PARCSRGMRESGETNUMITERATI) extern void hypre_F90_NAME(fhypre_parcsrgmresgetnumiterati, FHYPRE_PARCSRGMRESGETNUMITERATI) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_ParCSRGMRESGetFinalRelativeResidualNorm \ hypre_F90_NAME(fhypre_parcsrgmresgetfinalrelat, FHYPRE_PARCSRGMRESGETFINALRELAT) extern void hypre_F90_NAME(fhypre_parcsrgmresgetfinalrelat, FHYPRE_PARCSRGMRESGETFINALRELAT) (hypre_F90_Obj *, HYPRE_Real *); #define HYPRE_ParCSRCOGMRESCreate \ hypre_F90_NAME(fhypre_parcsrcogmrescreate, FHYPRE_PARCSRCOGMRESCREATE) extern void hypre_F90_NAME(fhypre_parcsrcogmrescreate, FHYPRE_PARCSRCOGMRESCREATE) (HYPRE_Int *, hypre_F90_Obj *); #define HYPRE_ParCSRCOGMRESDestroy \ hypre_F90_NAME(fhypre_parcsrcogmresdestroy, FHYPRE_PARCSRCOGMRESDESTROY) extern void hypre_F90_NAME(fhypre_parcsrcogmresdestroy, FHYPRE_PARCSRCOGMRESDESTROY) (hypre_F90_Obj *); #define HYPRE_ParCSRCOGMRESSetup \ hypre_F90_NAME(fhypre_parcsrcogmressetup, FHYPRE_PARCSRCOGMRESSETUP) extern void hypre_F90_NAME(fhypre_parcsrcogmressetup, FHYPRE_PARCSRCOGMRESSETUP) (hypre_F90_Obj *, hypre_F90_Obj *, hypre_F90_Obj *, hypre_F90_Obj *); #define HYPRE_ParCSRCOGMRESSolve \ hypre_F90_NAME(fhypre_parcsrcogmressolve, FHYPRE_PARCSRCOGMRESSOLVE) extern void hypre_F90_NAME(fhypre_parcsrcogmressolve, FHYPRE_PARCSRCOGMRESSOLVE) (hypre_F90_Obj *, hypre_F90_Obj *, hypre_F90_Obj *, hypre_F90_Obj *); #define HYPRE_ParCSRCOGMRESSetKDim \ hypre_F90_NAME(fhypre_parcsrcogmressetkdim, FHYPRE_PARCSRCOGMRESSETKDIM) extern void hypre_F90_NAME(fhypre_parcsrcogmressetkdim, FHYPRE_PARCSRCOGMRESSETKDIM) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_ParCSRCOGMRESSetUnroll \ hypre_F90_NAME(fhypre_parcsrcogmressetunroll, FHYPRE_PARCSRCOGMRESSETUNROLL) extern void hypre_F90_NAME(fhypre_parcsrcogmressetunroll, FHYPRE_PARCSRCOGMRESSETUNROLL) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_ParCSRCOGMRESSetCGS \ hypre_F90_NAME(fhypre_parcsrcogmressetcgs, FHYPRE_PARCSRCOGMRESSETCGS) extern void hypre_F90_NAME(fhypre_parcsrcogmressetcgs, FHYPRE_PARCSRCOGMRESSETCGS) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_ParCSRCOGMRESSetTol \ hypre_F90_NAME(fhypre_parcsrcogmressettol, FHYPRE_PARCSRCOGMRESSETTOL) extern void hypre_F90_NAME(fhypre_parcsrcogmressettol, FHYPRE_PARCSRCOGMRESSETTOL) (hypre_F90_Obj *, HYPRE_Real *); #define HYPRE_ParCSRCOGMRESSetAbsoluteTol \ hypre_F90_NAME(fhypre_parcsrcogmressetabsolutet, FHYPRE_PARCSRCOGMRESSETABSOLUTET) extern void hypre_F90_NAME(fhypre_parcsrcogmressetabsolutet, FHYPRE_PARCSRCOGMRESSETABSOLUTET) (hypre_F90_Obj *, HYPRE_Real *); #define HYPRE_ParCSRCOGMRESSetMinIter \ hypre_F90_NAME(fhypre_parcsrcogmressetminiter, FHYPRE_PARCSRCOGMRESSETMINITER) extern void hypre_F90_NAME(fhypre_parcsrcogmressetminiter, FHYPRE_PARCSRCOGMRESSETMINITER) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_ParCSRCOGMRESSetMaxIter \ hypre_F90_NAME(fhypre_parcsrcogmressetmaxiter, FHYPRE_PARCSRCOGMRESSETMAXITER) extern void hypre_F90_NAME(fhypre_parcsrcogmressetmaxiter, FHYPRE_PARCSRCOGMRESSETMAXITER) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_ParCSRCOGMRESSetPrecond \ hypre_F90_NAME(fhypre_parcsrcogmressetprecond, FHYPRE_PARCSRCOGMRESSETPRECOND) extern void hypre_F90_NAME(fhypre_parcsrcogmressetprecond, FHYPRE_PARCSRCOGMRESSETPRECOND) (hypre_F90_Obj *, HYPRE_Int *, hypre_F90_Obj *); #define HYPRE_ParCSRCOGMRESGetPrecond \ hypre_F90_NAME(fhypre_parcsrcogmresgetprecond, FHYPRE_PARCSRCOGMRESGETPRECOND) extern void hypre_F90_NAME(fhypre_parcsrcogmresgetprecond, FHYPRE_PARCSRCOGMRESGETPRECOND) (hypre_F90_Obj *, hypre_F90_Obj *); #define HYPRE_ParCSRCOGMRESSetLogging \ hypre_F90_NAME(fhypre_parcsrcogmressetlogging, FHYPRE_PARCSRCOGMRESSETLOGGING) extern void hypre_F90_NAME(fhypre_parcsrcogmressetlogging, FHYPRE_PARCSRCOGMRESSETLOGGING) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_ParCSRCOGMRESSetPrintLevel \ hypre_F90_NAME(fhypre_parcsrcogmressetprintlevel, FHYPRE_PARCSRCOGMRESSETPRINTLEVEL) extern void hypre_F90_NAME(fhypre_parcsrcogmressetprintlevel, FHYPRE_PARCSRCOGMRESSETPRINTLEVEL) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_ParCSRCOGMRESGetNumIterations \ hypre_F90_NAME(fhypre_parcsrcogmresgetnumiterat, FHYPRE_PARCSRCOGMRESGETNUMITERAT) extern void hypre_F90_NAME(fhypre_parcsrcogmresgetnumiterat, FHYPRE_PARCSRCOGMRESGETNUMITERAT) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_ParCSRCOGMRESGetFinalRelativeResidualNorm \ hypre_F90_NAME(fhypre_parcsrcogmresgetfinalrela, FHYPRE_PARCSRCOGMRESGETFINALRELA) extern void hypre_F90_NAME(fhypre_parcsrcogmresgetfinalrela, FHYPRE_PARCSRCOGMRESGETFINALRELA) (hypre_F90_Obj *, HYPRE_Real *); #define HYPRE_ParCSRHybridCreate \ hypre_F90_NAME(fhypre_parcsrhybridcreate, FHYPRE_PARCSRHYBRIDCREATE) extern void hypre_F90_NAME(fhypre_parcsrhybridcreate, FHYPRE_PARCSRHYBRIDCREATE) (hypre_F90_Obj *); #define HYPRE_ParCSRHybridDestroy \ hypre_F90_NAME(fhypre_parcsrhybriddestroy, FHYPRE_PARCSRHYBRIDDESTROY) extern void hypre_F90_NAME(fhypre_parcsrhybriddestroy, FHYPRE_PARCSRHYBRIDDESTROY) (hypre_F90_Obj *); #define HYPRE_ParCSRHybridSetup \ hypre_F90_NAME(fhypre_parcsrhybridsetup, FHYPRE_PARCSRHYBRIDSETUP) extern void hypre_F90_NAME(fhypre_parcsrhybridsetup, FHYPRE_PARCSRHYBRIDSETUP) (hypre_F90_Obj *, hypre_F90_Obj *, hypre_F90_Obj *, hypre_F90_Obj *); #define HYPRE_ParCSRHybridSolve \ hypre_F90_NAME(fhypre_parcsrhybridsolve, FHYPRE_PARCSRHYBRIDSOLVE) extern void hypre_F90_NAME(fhypre_parcsrhybridsolve, FHYPRE_PARCSRHYBRIDSOLVE) (hypre_F90_Obj *, hypre_F90_Obj *, hypre_F90_Obj *, hypre_F90_Obj *); #define HYPRE_ParCSRHybridSetTol \ hypre_F90_NAME(fhypre_parcsrhybridsettol, FHYPRE_PARCSRHYBRIDSETTOL) extern void hypre_F90_NAME(fhypre_parcsrhybridsettol, FHYPRE_PARCSRHYBRIDSETTOL) (hypre_F90_Obj *, HYPRE_Real *); #define HYPRE_ParCSRHybridSetConvergenceTol \ hypre_F90_NAME(fhypre_parcsrhybridsetconvergen, FHYPRE_PARCSRHYBRIDSETCONVERGEN) extern void hypre_F90_NAME(fhypre_parcsrhybridsetconvergen, FHYPRE_PARCSRHYBRIDSETCONVERGEN) (hypre_F90_Obj *, HYPRE_Real *); #define HYPRE_ParCSRHybridSetDSCGMaxIter \ hypre_F90_NAME(fhypre_parcsrhybridsetdscgmaxit, FHYPRE_PARCSRHYBRIDSETDSCGMAXIT) extern void hypre_F90_NAME(fhypre_parcsrhybridsetdscgmaxit, FHYPRE_PARCSRHYBRIDSETDSCGMAXIT) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_ParCSRHybridSetPCGMaxIter \ hypre_F90_NAME(fhypre_parcsrhybridsetpcgmaxite, FHYPRE_PARCSRHYBRIDSETPCGMAXITE) extern void hypre_F90_NAME(fhypre_parcsrhybridsetpcgmaxite, FHYPRE_PARCSRHYBRIDSETPCGMAXITE) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_ParCSRHybridSetSolverType \ hypre_F90_NAME(fhypre_parcsrhybridsetsolvertyp, FHYPRE_PARCSRHYBRIDSETSOLVERTYP) extern void hypre_F90_NAME(fhypre_parcsrhybridsetsolvertyp, FHYPRE_PARCSRHYBRIDSETSOLVERTYP) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_ParCSRHybridSetKDim \ hypre_F90_NAME(fhypre_parcsrhybridsetkdim, FHYPRE_PARCSRHYBRIDSETKDIM) extern void hypre_F90_NAME(fhypre_parcsrhybridsetkdim, FHYPRE_PARCSRHYBRIDSETKDIM) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_ParCSRHybridSetTwoNorm \ hypre_F90_NAME(fhypre_parcsrhybridsettwonorm, FHYPRE_PARCSRHYBRIDSETTWONORM) extern void hypre_F90_NAME(fhypre_parcsrhybridsettwonorm, FHYPRE_PARCSRHYBRIDSETTWONORM) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_ParCSRHybridSetStopCrit \ hypre_F90_NAME(fhypre_parcsrhybridsetstopcrit, FHYPRE_PARCSRSETSTOPCRIT) extern void hypre_F90_NAME(fhypre_parcsrhybridsetstopcrit, FHYPRE_PARCSRSETSTOPCRIT) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_ParCSRHybridSetRelChange \ hypre_F90_NAME(fhypre_parcsrhybridsetrelchange, FHYPRE_PARCSRHYBRIDSETRELCHANGE) extern void hypre_F90_NAME(fhypre_parcsrhybridsetrelchange, FHYPRE_PARCSRHYBRIDSETRELCHANGE) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_ParCSRHybridSetPrecond \ hypre_F90_NAME(fhypre_parcsrhybridsetprecond, FHYPRE_PARCSRHYBRIDSETPRECOND) extern void hypre_F90_NAME(fhypre_parcsrhybridsetprecond, FHYPRE_PARCSRHYBRIDSETPRECOND) (hypre_F90_Obj *, HYPRE_Int *, hypre_F90_Obj *); #define HYPRE_ParCSRHybridSetLogging \ hypre_F90_NAME(fhypre_parcsrhybridsetlogging, FHYPRE_PARCSRHYBRIDSETLOGGING) extern void hypre_F90_NAME(fhypre_parcsrhybridsetlogging, FHYPRE_PARCSRHYBRIDSETLOGGING) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_ParCSRHybridSetPrintLevel \ hypre_F90_NAME(fhypre_parcsrhybridsetprintleve, FHYPRE_PARCSRHYBRIDSETPRINTLEVE) extern void hypre_F90_NAME(fhypre_parcsrhybridsetprintleve, FHYPRE_PARCSRHYBRIDSETPRINTLEVE) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_ParCSRHybridSetStrongThreshold \ hypre_F90_NAME(fhypre_parcsrhybridsetstrongthr, FHYPRE_PARCSRHYBRIDSETSTRONGTHR) extern void hypre_F90_NAME(fhypre_parcsrhybridsetstrongthr, FHYPRE_PARCSRHYBRIDSETSTRONGTHR) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_ParCSRHybridSetMaxRowSum \ hypre_F90_NAME(fhypre_parcsrhybridsetmaxrowsum, FHYPRE_PARCSRHYBRIDSETMAXROWSUM) extern void hypre_F90_NAME(fhypre_parcsrhybridsetmaxrowsum, FHYPRE_PARCSRHYBRIDSETMAXROWSUM) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_ParCSRHybridSetTruncFactor \ hypre_F90_NAME(fhypre_parcsrhybridsettruncfact, FHYPRE_PARCSRHYBRIDSETTRUNCFACT) extern void hypre_F90_NAME(fhypre_parcsrhybridsettruncfact, FHYPRE_PARCSRHYBRIDSETTRUNCFACT) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_ParCSRHybridSetMaxLevels \ hypre_F90_NAME(fhypre_parcsrhybridsetmaxlevels, FHYPRE_PARCSRHYBRIDSETMAXLEVELS) extern void hypre_F90_NAME(fhypre_parcsrhybridsetmaxlevels, FHYPRE_PARCSRHYBRIDSETMAXLEVELS) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_ParCSRHybridSetMeasureType \ hypre_F90_NAME(fhypre_parcsrhybridsetmeasurety, FHYPRE_PARCSRHYBRIDSETMEASURETY) extern void hypre_F90_NAME(fhypre_parcsrhybridsetmeasurety, FHYPRE_PARCSRHYBRIDSETMEASURETY) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_ParCSRHybridSetCoarsenType \ hypre_F90_NAME(fhypre_parcsrhybridsetcoarsenty, FHYPRE_PARCSRHYBRIDSETCOARSENTY) extern void hypre_F90_NAME(fhypre_parcsrhybridsetcoarsenty, FHYPRE_PARCSRHYBRIDSETCOARSENTY) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_ParCSRHybridSetCycleType \ hypre_F90_NAME(fhypre_parcsrhybridsetcycletype, FHYPRE_PARCSRHYBRIDSETCYCLETYPE) extern void hypre_F90_NAME(fhypre_parcsrhybridsetcycletype, FHYPRE_PARCSRHYBRIDSETCYCLETYPE) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_ParCSRHybridSetNumGridSweeps \ hypre_F90_NAME(fhypre_parcsrhybridsetnumgridsw, FHYPRE_PARCSRHYBRIDSETNUMGRIDSW) extern void hypre_F90_NAME(fhypre_parcsrhybridsetnumgridsw, FHYPRE_PARCSRHYBRIDSETNUMGRIDSW) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_ParCSRHybridSetGridRelaxType \ hypre_F90_NAME(fhypre_parcsrhybridsetgridrlxty, FHYPRE_PARCSRHYBRIDSETGRIDRLXTY) extern void hypre_F90_NAME(fhypre_parcsrhybridsetgridrlxty, FHYPRE_PARCSRHYBRIDSETGRIDRLXTY) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_ParCSRHybridSetGridRelaxPoints \ hypre_F90_NAME(fhypre_parcsrhybridsetgridrlxpt, FHYPRE_PARCSRHYBRIDSETGRIDRLXPT) extern void hypre_F90_NAME(fhypre_parcsrhybridsetgridrlxpt, FHYPRE_PARCSRHYBRIDSETGRIDRLXPT) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_ParCSRHybridSetNumSweeps \ hypre_F90_NAME(fhypre_parcsrhybridsetnumsweeps, FHYPRE_PARCSRHYBRIDSETNUMSWEEPS) extern void hypre_F90_NAME(fhypre_parcsrhybridsetnumsweeps, FHYPRE_PARCSRHYBRIDSETNUMSWEEPS) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_ParCSRHybridSetCycleNumSweeps \ hypre_F90_NAME(fhypre_parcsrhybridsetcyclenums, FHYPRE_PARCSRHYBRIDSETCYCLENUMS) extern void hypre_F90_NAME(fhypre_parcsrhybridsetcyclenums, FHYPRE_PARCSRHYBRIDSETCYCLENUMS) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_ParCSRHybridSetRelaxType \ hypre_F90_NAME(fhypre_parcsrhybridsetrelaxtype, FHYPRE_PARCSRHYBRIDSETRELAXTYPE) extern void hypre_F90_NAME(fhypre_parcsrhybridsetrelaxtype, FHYPRE_PARCSRHYBRIDSETRELAXTYPE) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_ParCSRHybridSetCycleRelaxType \ hypre_F90_NAME(fhypre_parcsrhybridsetcyclerela, FHYPRE_PARCSRHYBRIDSETCYCLERELA) extern void hypre_F90_NAME(fhypre_parcsrhybridsetcyclerela, FHYPRE_PARCSRHYBRIDSETCYCLERELA) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_ParCSRHybridSetRelaxOrder \ hypre_F90_NAME(fhypre_parcsrhybridsetrelaxorde, FHYPRE_PARCSRHYBRIDSETRELAXORDE) extern void hypre_F90_NAME(fhypre_parcsrhybridsetrelaxorde, FHYPRE_PARCSRHYBRIDSETRELAXORDE) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_ParCSRHybridSetRelaxWt \ hypre_F90_NAME(fhypre_parcsrhybridsetrelaxwt, FHYPRE_PARCSRHYBRIDSETRELAXWT) extern void hypre_F90_NAME(fhypre_parcsrhybridsetrelaxwt, FHYPRE_PARCSRHYBRIDSETRELAXWT) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_ParCSRHybridSetLevelRelaxWt \ hypre_F90_NAME(fhypre_parcsrhybridsetlevelrela, FHYPRE_PARCSRHYBRIDSETLEVELRELA) extern void hypre_F90_NAME(fhypre_parcsrhybridsetlevelrela, FHYPRE_PARCSRHYBRIDSETLEVELRELA) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_ParCSRHybridSetOuterWt \ hypre_F90_NAME(fhypre_parcsrhybridsetouterwt, FHYPRE_PARCSRHYBRIDSETOUTERWT) extern void hypre_F90_NAME(fhypre_parcsrhybridsetouterwt, FHYPRE_PARCSRHYBRIDSETOUTERWT) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_ParCSRHybridSetLevelOuterWt \ hypre_F90_NAME(fhypre_parcsrhybridsetleveloute, FHYPRE_PARCSRHYBRIDSETLEVELOUTE) extern void hypre_F90_NAME(fhypre_parcsrhybridsetleveloute, FHYPRE_PARCSRHYBRIDSETLEVELOUTE) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_ParCSRHybridSetRelaxWeight \ hypre_F90_NAME(fhypre_parcsrhybridsetrelaxweig, FHYPRE_PARCSRHYBRIDSETRELAXWEIG) extern void hypre_F90_NAME(fhypre_parcsrhybridsetrelaxweig, FHYPRE_PARCSRHYBRIDSETRELAXWEIG) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_ParCSRHybridSetOmega \ hypre_F90_NAME(fhypre_parcsrhybridsetomega, FHYPRE_PARCSRHYBRIDSETOMEGA) extern void hypre_F90_NAME(fhypre_parcsrhybridsetomega, FHYPRE_PARCSRHYBRIDSETOMEGA) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_ParCSRHybridGetNumIterations \ hypre_F90_NAME(fhypre_parcsrhybridgetnumiterat, FHYPRE_PARCSRHYBRIDGETNUMITERAT) extern void hypre_F90_NAME(fhypre_parcsrhybridgetnumiterat, FHYPRE_PARCSRHYBRIDGETNUMITERAT) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_ParCSRHybridGetDSCGNumIterations \ hypre_F90_NAME(fhypre_parcsrhybridgetdscgnumit, FHYPRE_PARCSRHYBRIDGETDSCGNUMIT) extern void hypre_F90_NAME(fhypre_parcsrhybridgetdscgnumit, FHYPRE_PARCSRHYBRIDGETDSCGNUMIT) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_ParCSRHybridGetPCGNumIterations \ hypre_F90_NAME(fhypre_parcsrhybridgetpcgnumite, FHYPRE_PARCSRHYBRIDGETPCGNUMITE) extern void hypre_F90_NAME(fhypre_parcsrhybridgetpcgnumite, FHYPRE_PARCSRHYBRIDGETPCGNUMITE) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_ParCSRHybridGetFinalRelativeResidualNorm \ hypre_F90_NAME(fhypre_parcsrhybridgetfinalrela, FHYPRE_PARCSRHYBRIDGETFINALRELA) extern void hypre_F90_NAME(fhypre_parcsrhybridgetfinalrela, FHYPRE_PARCSRHYBRIDGETFINALRELA) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_ParSetRandomValues \ hypre_F90_NAME(fhypre_parsetrandomvalues, FHYPRE_PARSETRANDOMVALUES) extern void hypre_F90_NAME(fhypre_parsetrandomvalues, FHYPRE_PARSETRANDOMVALUES) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_ParPrintVector \ hypre_F90_NAME(fhypre_parprintvector, FHYPRE_PARPRINTVECTOR) extern void hypre_F90_NAME(fhypre_parprintvector, FHYPRE_PARPRINTVECTOR) (hypre_F90_Obj *, char *); #define HYPRE_ParReadVector \ hypre_F90_NAME(fhypre_parreadvector, FHYPRE_PARREADVECTOR) extern void hypre_F90_NAME(fhypre_parreadvector, FHYPRE_PARREADVECTOR) (HYPRE_Int *, char *); #define HYPRE_ParVectorSize \ hypre_F90_NAME(fhypre_parvectorsize, FHYPRE_PARVECTORSIZE) extern void hypre_F90_NAME(fhypre_parvectorsize, FHYPRE_PARVECTORSIZE) (HYPRE_Int *); #define HYPRE_ParCSRMultiVectorPrint \ hypre_F90_NAME(fhypre_parcsrmultivectorprint, FHYPRE_PARCSRMULTIVECTORPRINT) extern void hypre_F90_NAME(fhypre_parcsrmultivectorprint, FHYPRE_PARCSRMULTIVECTORPRINT) (HYPRE_Int *, char *); #define HYPRE_ParCSRMultiVectorRead \ hypre_F90_NAME(fhypre_parcsrmultivectorread, FHYPRE_PARCSRMULTIVECTORREAD) extern void hypre_F90_NAME(fhypre_parcsrmultivectorread, FHYPRE_PARCSRMULTIVECTORREAD) (HYPRE_Int *, hypre_F90_Obj *, char *); #define aux_maskCount \ hypre_F90_NAME(fhypre_aux_maskcount, FHYPRE_AUX_MASKCOUNT) extern void hypre_F90_NAME(fhypre_aux_maskcount, FHYPRE_AUX_MASKCOUNT) (HYPRE_Int *, HYPRE_Int *); #define aux_indexFromMask \ hypre_F90_NAME(fhypre_auxindexfrommask, FHYPRE_AUXINDEXFROMMASK) extern void hypre_F90_NAME(fhypre_auxindexfrommask, FHYPRE_AUXINDEXFROMMASK) (HYPRE_Int *, HYPRE_Int *, HYPRE_Int *); #define HYPRE_TempParCSRSetupInterpreter \ hypre_F90_NAME(fhypre_tempparcsrsetupinterpret, FHYPRE_TEMPPARCSRSETUPINTERPRET) extern void hypre_F90_NAME(fhypre_tempparcsrsetupinterpret, FHYPRE_TEMPPARCSRSETUPINTERPRET) (hypre_F90_Obj *); #define HYPRE_ParCSRSetupInterpreter \ hypre_F90_NAME(fhypre_parcsrsetupinterpreter, FHYPRE_PARCSRSETUPINTERPRETER) extern void hypre_F90_NAME(fhypre_parcsrsetupinterpreter, FHYPRE_PARCSRSETUPINTERPRETER) (hypre_F90_Obj *); #define HYPRE_ParCSRSetupMatvec \ hypre_F90_NAME(fhypre_parcsrsetupmatvec, FHYPRE_PARCSRSETUPMATVEC) extern void hypre_F90_NAME(fhypre_parcsrsetupmatvec, FHYPRE_PARCSRSETUPMATVEC) (hypre_F90_Obj *); #define HYPRE_ParaSailsCreate \ hypre_F90_NAME(fhypre_parasailscreate, FHYPRE_PARASAILSCREATE) extern void hypre_F90_NAME(fhypre_parasailscreate, FHYPRE_PARASAILSCREATE) (HYPRE_Int *, hypre_F90_Obj *); #define HYPRE_ParaSailsDestroy \ hypre_F90_NAME(fhypre_parasailsdestroy, FHYPRE_PARASAILSDESTROY) extern void hypre_F90_NAME(fhypre_parasailsdestroy, FHYPRE_PARASAILSDESTROY) (hypre_F90_Obj *); #define HYPRE_ParaSailsSetup \ hypre_F90_NAME(fhypre_parasailssetup, FHYPRE_PARASAILSSETUP) extern void hypre_F90_NAME(fhypre_parasailssetup, FHYPRE_PARASAILSSETUP) (hypre_F90_Obj *, hypre_F90_Obj *, hypre_F90_Obj *, hypre_F90_Obj *); #define HYPRE_ParaSailsSolve \ hypre_F90_NAME(fhypre_parasailssolve, FHYPRE_PARASAILSSOLVE) extern void hypre_F90_NAME(fhypre_parasailssolve, FHYPRE_PARASAILSSOLVE) (hypre_F90_Obj *, hypre_F90_Obj *, hypre_F90_Obj *, hypre_F90_Obj *); #define HYPRE_ParaSailsSetParams \ hypre_F90_NAME(fhypre_parasailssetparams, FHYPRE_PARASAILSSETPARAMS) extern void hypre_F90_NAME(fhypre_parasailssetparams, FHYPRE_PARASAILSSETPARAMS) (hypre_F90_Obj *, HYPRE_Real *, HYPRE_Int *); #define HYPRE_ParaSailsSetThresh \ hypre_F90_NAME(fhypre_parasailssetthresh, FHYPRE_PARASAILSSETTHRESH) extern void hypre_F90_NAME(fhypre_parasailssetthresh, FHYPRE_PARASAILSSETTHRESH) (hypre_F90_Obj *, HYPRE_Real *); #define HYPRE_ParaSailsGetThresh \ hypre_F90_NAME(fhypre_parasailsgetthresh, FHYPRE_PARASAILSGETTHRESH) extern void hypre_F90_NAME(fhypre_parasailsgetthresh, FHYPRE_PARASAILSGETTHRESH) (hypre_F90_Obj *, HYPRE_Real *); #define HYPRE_ParaSailsSetNlevels \ hypre_F90_NAME(fhypre_parasailssetnlevels, FHYPRE_PARASAILSSETNLEVELS) extern void hypre_F90_NAME(fhypre_parasailssetnlevels, FHYPRE_PARASAILSSETNLEVELS) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_ParaSailsGetNlevels \ hypre_F90_NAME(fhypre_parasailsgetnlevels, FHYPRE_PARASAILSGETNLEVELS) extern void hypre_F90_NAME(fhypre_parasailsgetnlevels, FHYPRE_PARASAILSGETNLEVELS) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_ParaSailsSetFilter \ hypre_F90_NAME(fhypre_parasailssetfilter, FHYPRE_PARASAILSSETFILTER) extern void hypre_F90_NAME(fhypre_parasailssetfilter, FHYPRE_PARASAILSSETFILTER) (hypre_F90_Obj *, HYPRE_Real *); #define HYPRE_ParaSailsGetFilter \ hypre_F90_NAME(fhypre_parasailsgetfilter, FHYPRE_PARASAILSGETFILTER) extern void hypre_F90_NAME(fhypre_parasailsgetfilter, FHYPRE_PARASAILSGETFILTER) (hypre_F90_Obj *, HYPRE_Real *); #define HYPRE_ParaSailsSetSym \ hypre_F90_NAME(fhypre_parasailssetsym, FHYPRE_PARASAILSSETSYM) extern void hypre_F90_NAME(fhypre_parasailssetsym, FHYPRE_PARASAILSSETSYM) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_ParaSailsGetSym \ hypre_F90_NAME(fhypre_parasailsgetsym, FHYPRE_PARASAILSGETSYM) extern void hypre_F90_NAME(fhypre_parasailsgetsym, FHYPRE_PARASAILSGETSYM) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_ParaSailsSetLoadbal \ hypre_F90_NAME(fhypre_parasailssetloadbal, FHYPRE_PARASAILSSETLOADBAL) extern void hypre_F90_NAME(fhypre_parasailssetloadbal, FHYPRE_PARASAILSSETLOADBAL) (hypre_F90_Obj *, HYPRE_Real *); #define HYPRE_ParaSailsGetLoadbal \ hypre_F90_NAME(fhypre_parasailsgetloadbal, FHYPRE_PARASAILSGETLOADBAL) extern void hypre_F90_NAME(fhypre_parasailsgetloadbal, FHYPRE_PARASAILSGETLOADBAL) (hypre_F90_Obj *, HYPRE_Real *); #define HYPRE_ParaSailsSetReuse \ hypre_F90_NAME(fhypre_parasailssetreuse, FHYPRE_PARASAILSSETREUSE) extern void hypre_F90_NAME(fhypre_parasailssetreuse, FHYPRE_PARASAILSSETREUSE) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_ParaSailsGetReuse \ hypre_F90_NAME(fhypre_parasailsgetreuse, FHYPRE_PARASAILSGETREUSE) extern void hypre_F90_NAME(fhypre_parasailsgetreuse, FHYPRE_PARASAILSGETREUSE) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_ParaSailsSetLogging \ hypre_F90_NAME(fhypre_parasailssetlogging, FHYPRE_PARASAILSSETLOGGING) extern void hypre_F90_NAME(fhypre_parasailssetlogging, FHYPRE_PARASAILSSETLOGGING) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_ParaSailsGetLogging \ hypre_F90_NAME(fhypre_parasailsgetlogging, FHYPRE_PARASAILSGETLOGGING) extern void hypre_F90_NAME(fhypre_parasailsgetlogging, FHYPRE_PARASAILSGETLOGGING) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_ParCSRPCGCreate \ hypre_F90_NAME(fhypre_parcsrpcgcreate, FHYPRE_PARCSRPCGCREATE) extern void hypre_F90_NAME(fhypre_parcsrpcgcreate, FHYPRE_PARCSRPCGCREATE) (HYPRE_Int *, hypre_F90_Obj *); #define HYPRE_ParCSRPCGDestroy \ hypre_F90_NAME(fhypre_parcsrpcgdestroy, FHYPRE_PARCSRPCGDESTROY) extern void hypre_F90_NAME(fhypre_parcsrpcgdestroy, FHYPRE_PARCSRPCGDESTROY) (hypre_F90_Obj *); #define HYPRE_ParCSRPCGSetup \ hypre_F90_NAME(fhypre_parcsrpcgsetup, FHYPRE_PARCSRPCGSETUP) extern void hypre_F90_NAME(fhypre_parcsrpcgsetup, FHYPRE_PARCSRPCGSETUP) (hypre_F90_Obj *, hypre_F90_Obj *, hypre_F90_Obj *, hypre_F90_Obj *); #define HYPRE_ParCSRPCGSolve \ hypre_F90_NAME(fhypre_parcsrpcgsolve, FHYPRE_PARCSRPCGSOLVE) extern void hypre_F90_NAME(fhypre_parcsrpcgsolve, FHYPRE_PARCSRPCGSOLVE) (hypre_F90_Obj *, hypre_F90_Obj *, hypre_F90_Obj *, hypre_F90_Obj *); #define HYPRE_ParCSRPCGSetTol \ hypre_F90_NAME(fhypre_parcsrpcgsettol, FHYPRE_PARCSRPCGSETTOL) extern void hypre_F90_NAME(fhypre_parcsrpcgsettol, FHYPRE_PARCSRPCGSETTOL) (hypre_F90_Obj *, HYPRE_Real *); #define HYPRE_ParCSRPCGSetMaxIter \ hypre_F90_NAME(fhypre_parcsrpcgsetmaxiter, FHYPRE_PARCSRPCGSETMAXITER) extern void hypre_F90_NAME(fhypre_parcsrpcgsetmaxiter, FHYPRE_PARCSRPCGSETMAXITER) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_ParCSRPCGSetStopCrit \ hypre_F90_NAME(fhypre_parcsrpcgsetstopcrit, FHYPRE_PARCSRPCGSETSTOPCRIT) extern void hypre_F90_NAME(fhypre_parcsrpcgsetstopcrit, FHYPRE_PARCSRPCGSETSTOPCRIT) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_ParCSRPCGSetTwoNorm \ hypre_F90_NAME(fhypre_parcsrpcgsettwonorm, FHYPRE_PARCSRPCGSETTWONORM) extern void hypre_F90_NAME(fhypre_parcsrpcgsettwonorm, FHYPRE_PARCSRPCGSETTWONORM) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_ParCSRPCGSetRelChange \ hypre_F90_NAME(fhypre_parcsrpcgsetrelchange, FHYPRE_PARCSRPCGSETRELCHANGE) extern void hypre_F90_NAME(fhypre_parcsrpcgsetrelchange, FHYPRE_PARCSRPCGSETRELCHANGE) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_ParCSRPCGSetPrecond \ hypre_F90_NAME(fhypre_parcsrpcgsetprecond, FHYPRE_PARCSRPCGSETPRECOND) extern void hypre_F90_NAME(fhypre_parcsrpcgsetprecond, FHYPRE_PARCSRPCGSETPRECOND) (hypre_F90_Obj *, HYPRE_Int *, hypre_F90_Obj *); #define HYPRE_ParCSRPCGGetPrecond \ hypre_F90_NAME(fhypre_parcsrpcggetprecond, FHYPRE_PARCSRPCGGETPRECOND) extern void hypre_F90_NAME(fhypre_parcsrpcggetprecond, FHYPRE_PARCSRPCGGETPRECOND) (hypre_F90_Obj *, hypre_F90_Obj *); #define HYPRE_ParCSRPCGSetPrintLevel \ hypre_F90_NAME(fhypre_parcsrpcgsetprintlevel, FHYPRE_PARCSRPCGSETPRINTLEVEL) extern void hypre_F90_NAME(fhypre_parcsrpcgsetprintlevel, FHYPRE_PARCSRPCGSETPRINTLEVEL) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_ParCSRPCGGetNumIterations \ hypre_F90_NAME(fhypre_parcsrpcggetnumiteration, FHYPRE_PARCSRPCGGETNUMITERATION) extern void hypre_F90_NAME(fhypre_parcsrpcggetnumiteration, FHYPRE_PARCSRPCGGETNUMITERATION) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_ParCSRPCGGetFinalRelativeResidualNorm \ hypre_F90_NAME(fhypre_parcsrpcggetfinalrelativ, FHYPRE_PARCSRPCGGETFINALRELATIV) extern void hypre_F90_NAME(fhypre_parcsrpcggetfinalrelativ, FHYPRE_PARCSRPCGGETFINALRELATIV) (hypre_F90_Obj *, HYPRE_Real *); #define HYPRE_ParCSRDiagScaleSetup \ hypre_F90_NAME(fhypre_parcsrdiagscalesetup, FHYPRE_PARCSRDIAGSCALESETUP) extern void hypre_F90_NAME(fhypre_parcsrdiagscalesetup, FHYPRE_PARCSRDIAGSCALESETUP) (hypre_F90_Obj *, hypre_F90_Obj *, hypre_F90_Obj *, hypre_F90_Obj *); #define HYPRE_ParCSRDiagScale \ hypre_F90_NAME(fhypre_parcsrdiagscale, FHYPRE_PARCSRDIAGSCALE) extern void hypre_F90_NAME(fhypre_parcsrdiagscale, FHYPRE_PARCSRDIAGSCALE) (hypre_F90_Obj *, hypre_F90_Obj *, hypre_F90_Obj *, hypre_F90_Obj *); #define HYPRE_ParCSRPilutCreate \ hypre_F90_NAME(fhypre_parcsrpilutcreate, FHYPRE_PARCSRPILUTCREATE) extern void hypre_F90_NAME(fhypre_parcsrpilutcreate, FHYPRE_PARCSRPILUTCREATE) (HYPRE_Int *, hypre_F90_Obj *); #define HYPRE_ParCSRPilutDestroy \ hypre_F90_NAME(fhypre_parcsrpilutdestroy, FHYPRE_PARCSRPILUTDESTROY) extern void hypre_F90_NAME(fhypre_parcsrpilutdestroy, FHYPRE_PARCSRPILUTDESTROY) (hypre_F90_Obj *); #define HYPRE_ParCSRPilutSetup \ hypre_F90_NAME(fhypre_parcsrpilutsetup, FHYPRE_PARCSRPILUTSETUP) extern void hypre_F90_NAME(fhypre_parcsrpilutsetup, FHYPRE_PARCSRPILUTSETUP) (hypre_F90_Obj *, hypre_F90_Obj *, hypre_F90_Obj *, hypre_F90_Obj *); #define HYPRE_ParCSRPilutSolve \ hypre_F90_NAME(fhypre_parcsrpilutsolve, FHYPRE_PARCSRPILUTSOLVE) extern void hypre_F90_NAME(fhypre_parcsrpilutsolve, FHYPRE_PARCSRPILUTSOLVE) (hypre_F90_Obj *, hypre_F90_Obj *, hypre_F90_Obj *, hypre_F90_Obj *); #define HYPRE_ParCSRPilutSetMaxIter \ hypre_F90_NAME(fhypre_parcsrpilutsetmaxiter, FHYPRE_PARCSRPILUTSETMAXITER) extern void hypre_F90_NAME(fhypre_parcsrpilutsetmaxiter, FHYPRE_PARCSRPILUTSETMAXITER) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_ParCSRPilutSetDropToleran \ hypre_F90_NAME(fhypre_parcsrpilutsetdroptolera, FHYPRE_PARCSRPILUTSETDROPTOLERA) extern void hypre_F90_NAME(fhypre_parcsrpilutsetdroptolera, FHYPRE_PARCSRPILUTSETDROPTOLERA) (hypre_F90_Obj *, HYPRE_Real *); #define HYPRE_ParCSRPilutSetFacRowSize \ hypre_F90_NAME(fhypre_parcsrpilutsetfacrowsize, FHYPRE_PARCSRPILUTSETFACROWSIZE) extern void hypre_F90_NAME(fhypre_parcsrpilutsetfacrowsize, FHYPRE_PARCSRPILUTSETFACROWSIZE) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_SchwarzCreate \ hypre_F90_NAME(fhypre_schwarzcreate, FHYPRE_SCHWARZCREATE) extern void hypre_F90_NAME(fhypre_schwarzcreate, FHYPRE_SCHWARZCREATE) (hypre_F90_Obj *); #define HYPRE_SchwarzDestroy \ hypre_F90_NAME(fhypre_schwarzdestroy, FHYPRE_SCHWARZDESTROY) extern void hypre_F90_NAME(fhypre_schwarzdestroy, FHYPRE_SCHWARZDESTROY) (hypre_F90_Obj *); #define HYPRE_SchwarzSetup \ hypre_F90_NAME(fhypre_schwarzsetup, FHYPRE_SCHWARZSETUP) extern void hypre_F90_NAME(fhypre_schwarzsetup, FHYPRE_SCHWARZSETUP) (hypre_F90_Obj *, hypre_F90_Obj *, hypre_F90_Obj *, hypre_F90_Obj*); #define HYPRE_SchwarzSolve \ hypre_F90_NAME(fhypre_schwarzsolve, FHYPRE_SCHWARZSOLVE) extern void hypre_F90_NAME(fhypre_schwarzsolve, FHYPRE_SCHWARZSOLVE) (hypre_F90_Obj *, hypre_F90_Obj *, hypre_F90_Obj *, hypre_F90_Obj*); #define HYPRE_SchwarzSetVariant \ hypre_F90_NAME(fhypre_schwarzsetvariant, FHYPRE_SCHWARZVARIANT) extern void hypre_F90_NAME(fhypre_schwarzsetvariant, FHYPRE_SCHWARZVARIANT) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_SchwarzSetOverlap \ hypre_F90_NAME(fhypre_schwarzsetoverlap, FHYPRE_SCHWARZOVERLAP) extern void hypre_F90_NAME(fhypre_schwarzsetoverlap, FHYPRE_SCHWARZOVERLAP) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_SchwarzSetDomainType \ hypre_F90_NAME(fhypre_schwarzsetdomaintype, FHYPRE_SVHWARZSETDOMAINTYPE) extern void hypre_F90_NAME(fhypre_schwarzsetdomaintype, FHYPRE_SVHWARZSETDOMAINTYPE) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_SchwarzSetDomainStructure \ hypre_F90_NAME(fhypre_schwarzsetdomainstructur, FHYPRE_SCHWARZSETDOMAINSTRUCTUR) extern void hypre_F90_NAME(fhypre_schwarzsetdomainstructur, FHYPRE_SCHWARZSETDOMAINSTRUCTUR) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_SchwarzSetNumFunctions \ hypre_F90_NAME(fhypre_schwarzsetnumfunctions, FHYPRE_SCHWARZSETNUMFUNCTIONS) extern void hypre_F90_NAME(fhypre_schwarzsetnumfunctions, FHYPRE_SCHWARZSETNUMFUNCTIONS) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_SchwarzSetRelaxWeight \ hypre_F90_NAME(fhypre_schwarzsetrelaxweight, FHYPRE_SCHWARZSETRELAXWEIGHT) extern void hypre_F90_NAME(fhypre_schwarzsetrelaxweight, FHYPRE_SCHWARZSETRELAXWEIGHT) (hypre_F90_Obj *, HYPRE_Real *); #define HYPRE_SchwarzSetDofFunc \ hypre_F90_NAME(fhypre_schwarzsetdoffunc, FHYPRE_SCHWARZSETDOFFUNC) extern void hypre_F90_NAME(fhypre_schwarzsetdoffunc, FHYPRE_SCHWARZSETDOFFUNC) (hypre_F90_Obj *, HYPRE_Int *); #ifdef __cplusplus } #endif hypre-2.33.0/src/test/hypre_set_precond.c000066400000000000000000000665341477326011500204000ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /*-------------------------------------------------------------------------- * Routines to set up preconditioners for use in test codes. * June 16, 2005 *--------------------------------------------------------------------------*/ #include "hypre_test.h" HYPRE_Int hypre_set_precond(HYPRE_Int matrix_id, HYPRE_Int solver_id, HYPRE_Int precond_id, void *solver, void *precond) { hypre_set_precond_params(precond_id, precond); /************************************************************************ * PARCSR MATRIX ***********************************************************************/ if (matrix_id == HYPRE_PARCSR) { /************************************************************************ * PCG Solver ***********************************************************************/ if (solver_id == HYPRE_PCG) { if (precond_id == HYPRE_BOOMERAMG) { HYPRE_PCGSetPrecond( (HYPRE_Solver) solver, (HYPRE_PtrToSolverFcn) HYPRE_BoomerAMGSolve, (HYPRE_PtrToSolverFcn) HYPRE_BoomerAMGSetup, (HYPRE_Solver) precond); } else if (precond_id == HYPRE_DIAGSCALE) { HYPRE_PCGSetPrecond( (HYPRE_Solver) solver, (HYPRE_PtrToSolverFcn) HYPRE_ParCSRDiagScale, (HYPRE_PtrToSolverFcn) HYPRE_ParCSRDiagScaleSetup, (HYPRE_Solver) precond); } else if (precond_id == HYPRE_EUCLID) { HYPRE_PCGSetPrecond( (HYPRE_Solver) solver, (HYPRE_PtrToSolverFcn) HYPRE_EuclidSolve, (HYPRE_PtrToSolverFcn) HYPRE_EuclidSetup, (HYPRE_Solver) precond); } else if (precond_id == HYPRE_PARASAILS) { HYPRE_PCGSetPrecond( (HYPRE_Solver) solver, (HYPRE_PtrToSolverFcn) HYPRE_ParCSRParaSailsSolve, (HYPRE_PtrToSolverFcn) HYPRE_ParCSRParaSailsSetup, (HYPRE_Solver) precond); } else if (precond_id == HYPRE_SCHWARZ) { HYPRE_PCGSetPrecond( (HYPRE_Solver) solver, (HYPRE_PtrToSolverFcn) HYPRE_SchwarzSolve, (HYPRE_PtrToSolverFcn) HYPRE_SchwarzSetup, (HYPRE_Solver) precond); } } /************************************************************************ * GMRES Solver ***********************************************************************/ if (solver_id == HYPRE_GMRES) { if (precond_id == HYPRE_BOOMERAMG) { HYPRE_GMRESSetPrecond( (HYPRE_Solver) solver, (HYPRE_PtrToSolverFcn) HYPRE_BoomerAMGSolve, (HYPRE_PtrToSolverFcn) HYPRE_BoomerAMGSetup, (HYPRE_Solver) precond); } else if (precond_id == HYPRE_DIAGSCALE) { HYPRE_GMRESSetPrecond( (HYPRE_Solver) solver, (HYPRE_PtrToSolverFcn) HYPRE_ParCSRDiagScale, (HYPRE_PtrToSolverFcn) HYPRE_ParCSRDiagScaleSetup, (HYPRE_Solver) precond); } else if (precond_id == HYPRE_EUCLID) { HYPRE_GMRESSetPrecond( (HYPRE_Solver) solver, (HYPRE_PtrToSolverFcn) HYPRE_EuclidSolve, (HYPRE_PtrToSolverFcn) HYPRE_EuclidSetup, (HYPRE_Solver) precond); } else if (precond_id == HYPRE_PARASAILS) { HYPRE_GMRESSetPrecond( (HYPRE_Solver) solver, (HYPRE_PtrToSolverFcn) HYPRE_ParCSRParaSailsSolve, (HYPRE_PtrToSolverFcn) HYPRE_ParCSRParaSailsSetup, (HYPRE_Solver) precond); } else if (precond_id == HYPRE_PILUT) { HYPRE_GMRESSetPrecond( (HYPRE_Solver) solver, (HYPRE_PtrToSolverFcn) HYPRE_ParCSRPilutSolve, (HYPRE_PtrToSolverFcn) HYPRE_ParCSRPilutSetup, (HYPRE_Solver) precond); } else if (precond_id == HYPRE_SCHWARZ) { HYPRE_GMRESSetPrecond( (HYPRE_Solver) solver, (HYPRE_PtrToSolverFcn) HYPRE_SchwarzSolve, (HYPRE_PtrToSolverFcn) HYPRE_SchwarzSetup, (HYPRE_Solver) precond); } } /************************************************************************ * BiCGSTAB Solver ***********************************************************************/ if (solver_id == HYPRE_BICGSTAB) { if (precond_id == HYPRE_BOOMERAMG) { HYPRE_BiCGSTABSetPrecond( (HYPRE_Solver) solver, (HYPRE_PtrToSolverFcn) HYPRE_BoomerAMGSolve, (HYPRE_PtrToSolverFcn) HYPRE_BoomerAMGSetup, (HYPRE_Solver) precond); } else if (precond_id == HYPRE_DIAGSCALE) { HYPRE_BiCGSTABSetPrecond( (HYPRE_Solver) solver, (HYPRE_PtrToSolverFcn) HYPRE_ParCSRDiagScale, (HYPRE_PtrToSolverFcn) HYPRE_ParCSRDiagScaleSetup, (HYPRE_Solver) precond); } else if (precond_id == HYPRE_EUCLID) { HYPRE_BiCGSTABSetPrecond( (HYPRE_Solver) solver, (HYPRE_PtrToSolverFcn) HYPRE_EuclidSolve, (HYPRE_PtrToSolverFcn) HYPRE_EuclidSetup, (HYPRE_Solver) precond); } else if (precond_id == HYPRE_PILUT) { HYPRE_BiCGSTABSetPrecond( (HYPRE_Solver) solver, (HYPRE_PtrToSolverFcn) HYPRE_ParCSRPilutSolve, (HYPRE_PtrToSolverFcn) HYPRE_ParCSRPilutSetup, (HYPRE_Solver) precond); } } /************************************************************************ * CGNR Solver ***********************************************************************/ if (solver_id == HYPRE_CGNR) { if (precond_id == HYPRE_BOOMERAMG) { HYPRE_CGNRSetPrecond( (HYPRE_Solver) solver, (HYPRE_PtrToSolverFcn) HYPRE_BoomerAMGSolve, (HYPRE_PtrToSolverFcn) HYPRE_BoomerAMGSolveT, (HYPRE_PtrToSolverFcn) HYPRE_BoomerAMGSetup, (HYPRE_Solver) precond); } else if (precond_id == HYPRE_DIAGSCALE) { HYPRE_CGNRSetPrecond( (HYPRE_Solver) solver, (HYPRE_PtrToSolverFcn) HYPRE_ParCSRDiagScale, (HYPRE_PtrToSolverFcn) HYPRE_ParCSRDiagScale, (HYPRE_PtrToSolverFcn) HYPRE_ParCSRDiagScaleSetup, (HYPRE_Solver) precond); } } } /************************************************************************ * SSTRUCT MATRIX ***********************************************************************/ if (matrix_id == HYPRE_SSTRUCT) { /************************************************************************ * PCG Solver ***********************************************************************/ if (solver_id == HYPRE_PCG) { if (precond_id == HYPRE_SPLIT) { HYPRE_PCGSetPrecond( (HYPRE_Solver) solver, (HYPRE_PtrToSolverFcn) HYPRE_SStructSplitSolve, (HYPRE_PtrToSolverFcn) HYPRE_SStructSplitSetup, (HYPRE_Solver) precond); } else if (precond_id == HYPRE_SYSPFMG) { HYPRE_PCGSetPrecond( (HYPRE_Solver) solver, (HYPRE_PtrToSolverFcn) HYPRE_SStructSysPFMGSolve, (HYPRE_PtrToSolverFcn) HYPRE_SStructSysPFMGSetup, (HYPRE_Solver) precond); } else if (precond_id == HYPRE_DIAGSCALE) { HYPRE_PCGSetPrecond( (HYPRE_Solver) solver, (HYPRE_PtrToSolverFcn) HYPRE_SStructDiagScale, (HYPRE_PtrToSolverFcn) HYPRE_SStructDiagScaleSetup, (HYPRE_Solver) precond); } } /************************************************************************ * GMRES Solver ***********************************************************************/ if (solver_id == HYPRE_GMRES) { if (precond_id == HYPRE_DIAGSCALE) { HYPRE_GMRESSetPrecond( (HYPRE_Solver) solver, (HYPRE_PtrToSolverFcn) HYPRE_SStructDiagScale, (HYPRE_PtrToSolverFcn) HYPRE_SStructDiagScaleSetup, (HYPRE_Solver) precond); } else if (precond_id == HYPRE_SPLIT) { HYPRE_GMRESSetPrecond( (HYPRE_Solver) solver, (HYPRE_PtrToSolverFcn) HYPRE_SStructSplitSolve, (HYPRE_PtrToSolverFcn) HYPRE_SStructSplitSetup, (HYPRE_Solver) precond); } } /************************************************************************ * BiCGSTAB Solver ***********************************************************************/ if (solver_id == HYPRE_BICGSTAB) { if (precond_id == HYPRE_DIAGSCALE) { HYPRE_BiCGSTABSetPrecond( (HYPRE_Solver) solver, (HYPRE_PtrToSolverFcn) HYPRE_SStructDiagScale, (HYPRE_PtrToSolverFcn) HYPRE_SStructDiagScaleSetup, (HYPRE_Solver) precond); } else if (precond_id == HYPRE_SPLIT) { HYPRE_BiCGSTABSetPrecond( (HYPRE_Solver) solver, (HYPRE_PtrToSolverFcn) HYPRE_SStructSplitSolve, (HYPRE_PtrToSolverFcn) HYPRE_SStructSplitSetup, (HYPRE_Solver) precond); } } /************************************************************************ * CGNR Solver ***********************************************************************/ if (solver_id == HYPRE_CGNR) { if (precond_id == HYPRE_BOOMERAMG) { HYPRE_CGNRSetPrecond( (HYPRE_Solver) solver, (HYPRE_PtrToSolverFcn) HYPRE_BoomerAMGSolve, (HYPRE_PtrToSolverFcn) HYPRE_BoomerAMGSolveT, (HYPRE_PtrToSolverFcn) HYPRE_BoomerAMGSetup, (HYPRE_Solver) precond); } else if (precond_id == HYPRE_DIAGSCALE) { HYPRE_CGNRSetPrecond( (HYPRE_Solver) solver, (HYPRE_PtrToSolverFcn) HYPRE_ParCSRDiagScale, (HYPRE_PtrToSolverFcn) HYPRE_ParCSRDiagScale, (HYPRE_PtrToSolverFcn) HYPRE_ParCSRDiagScaleSetup, (HYPRE_Solver) precond); } } } /************************************************************************ * STRUCT MATRIX ***********************************************************************/ if (matrix_id == HYPRE_STRUCT) { /************************************************************************ * PCG Solver ***********************************************************************/ if (solver_id == HYPRE_PCG) { if (precond_id == HYPRE_SMG) { HYPRE_PCGSetPrecond( (HYPRE_Solver) solver, (HYPRE_PtrToSolverFcn) HYPRE_StructSMGSolve, (HYPRE_PtrToSolverFcn) HYPRE_StructSMGSetup, (HYPRE_Solver) precond); } else if (precond_id == HYPRE_PFMG) { HYPRE_PCGSetPrecond( (HYPRE_Solver) solver, (HYPRE_PtrToSolverFcn) HYPRE_StructPFMGSolve, (HYPRE_PtrToSolverFcn) HYPRE_StructPFMGSetup, (HYPRE_Solver) precond); } else if (precond_id == HYPRE_SPARSEMSG) { HYPRE_PCGSetPrecond( (HYPRE_Solver) solver, (HYPRE_PtrToSolverFcn) HYPRE_StructSparseMSGSolve, (HYPRE_PtrToSolverFcn) HYPRE_StructSparseMSGSetup, (HYPRE_Solver) precond); } else if (precond_id == HYPRE_JACOBI) { HYPRE_PCGSetPrecond( (HYPRE_Solver) solver, (HYPRE_PtrToSolverFcn) HYPRE_StructJacobiSolve, (HYPRE_PtrToSolverFcn) HYPRE_StructJacobiSetup, (HYPRE_Solver) precond); } else if (precond_id == HYPRE_DIAGSCALE) { HYPRE_PCGSetPrecond( (HYPRE_Solver) solver, (HYPRE_PtrToSolverFcn) HYPRE_StructDiagScale, (HYPRE_PtrToSolverFcn) HYPRE_StructDiagScaleSetup, (HYPRE_Solver) precond); } } /************************************************************************ * HYBRID Solver ***********************************************************************/ if (solver_id == HYPRE_HYBRID) { if (precond_id == HYPRE_SMG) { HYPRE_StructHybridSetPrecond( (HYPRE_StructSolver) solver, (HYPRE_PtrToStructSolverFcn) HYPRE_StructSMGSolve, (HYPRE_PtrToStructSolverFcn) HYPRE_StructSMGSetup, (HYPRE_StructSolver) precond); } else if (precond_id == HYPRE_PFMG) { HYPRE_StructHybridSetPrecond( (HYPRE_StructSolver) solver, (HYPRE_PtrToStructSolverFcn) HYPRE_StructPFMGSolve, (HYPRE_PtrToStructSolverFcn) HYPRE_StructPFMGSetup, (HYPRE_StructSolver) precond); } else if (precond_id == HYPRE_SPARSEMSG) { HYPRE_StructHybridSetPrecond( (HYPRE_StructSolver) solver, (HYPRE_PtrToStructSolverFcn) HYPRE_StructSparseMSGSolve, (HYPRE_PtrToStructSolverFcn) HYPRE_StructSparseMSGSetup, (HYPRE_StructSolver) precond); } } /************************************************************************ * GMRES Solver ***********************************************************************/ if (solver_id == HYPRE_GMRES) { if (precond_id == HYPRE_SMG) { HYPRE_GMRESSetPrecond( (HYPRE_Solver) solver, (HYPRE_PtrToSolverFcn) HYPRE_StructSMGSolve, (HYPRE_PtrToSolverFcn) HYPRE_StructSMGSetup, (HYPRE_Solver) precond); } else if (precond_id == HYPRE_PFMG) { HYPRE_GMRESSetPrecond( (HYPRE_Solver) solver, (HYPRE_PtrToSolverFcn) HYPRE_StructPFMGSolve, (HYPRE_PtrToSolverFcn) HYPRE_StructPFMGSetup, (HYPRE_Solver) precond); } else if (precond_id == HYPRE_SPARSEMSG) { HYPRE_GMRESSetPrecond( (HYPRE_Solver) solver, (HYPRE_PtrToSolverFcn) HYPRE_StructSparseMSGSolve, (HYPRE_PtrToSolverFcn) HYPRE_StructSparseMSGSetup, (HYPRE_Solver) precond); } else if (precond_id == HYPRE_JACOBI) { HYPRE_GMRESSetPrecond( (HYPRE_Solver) solver, (HYPRE_PtrToSolverFcn) HYPRE_StructJacobiSolve, (HYPRE_PtrToSolverFcn) HYPRE_StructJacobiSetup, (HYPRE_Solver) precond); } else if (precond_id == HYPRE_DIAGSCALE) { HYPRE_GMRESSetPrecond( (HYPRE_Solver) solver, (HYPRE_PtrToSolverFcn) HYPRE_StructDiagScale, (HYPRE_PtrToSolverFcn) HYPRE_StructDiagScaleSetup, (HYPRE_Solver) precond); } } /************************************************************************ * BICGSTAB Solver ***********************************************************************/ if (solver_id == HYPRE_BICGSTAB) { if (precond_id == HYPRE_SMG) { HYPRE_BiCGSTABSetPrecond( (HYPRE_Solver) solver, (HYPRE_PtrToSolverFcn) HYPRE_StructSMGSolve, (HYPRE_PtrToSolverFcn) HYPRE_StructSMGSetup, (HYPRE_Solver) precond); } else if (precond_id == HYPRE_PFMG) { HYPRE_BiCGSTABSetPrecond( (HYPRE_Solver) solver, (HYPRE_PtrToSolverFcn) HYPRE_StructPFMGSolve, (HYPRE_PtrToSolverFcn) HYPRE_StructPFMGSetup, (HYPRE_Solver) precond); } else if (precond_id == HYPRE_SPARSEMSG) { HYPRE_BiCGSTABSetPrecond( (HYPRE_Solver) solver, (HYPRE_PtrToSolverFcn) HYPRE_StructSparseMSGSolve, (HYPRE_PtrToSolverFcn) HYPRE_StructSparseMSGSetup, (HYPRE_Solver) precond); } else if (precond_id == HYPRE_JACOBI) { HYPRE_BiCGSTABSetPrecond( (HYPRE_Solver) solver, (HYPRE_PtrToSolverFcn) HYPRE_StructJacobiSolve, (HYPRE_PtrToSolverFcn) HYPRE_StructJacobiSetup, (HYPRE_Solver) precond); } else if (precond_id == HYPRE_DIAGSCALE) { HYPRE_BiCGSTABSetPrecond( (HYPRE_Solver) solver, (HYPRE_PtrToSolverFcn) HYPRE_StructDiagScale, (HYPRE_PtrToSolverFcn) HYPRE_StructDiagScaleSetup, (HYPRE_Solver) precond); } } } } HYPRE_Int hypre_set_precond_params(HYPRE_Int precond_id, void *precond) { HYPRE_Int i; HYPRE_Int ierr; /* use BoomerAMG preconditioner */ if (precond_id == HYPRE_BOOMERAMG) { HYPRE_BoomerAMGCreate(precond); HYPRE_BoomerAMGSetInterpType(precond, interp_type); HYPRE_BoomerAMGSetNumSamples(precond, gsmg_samples); HYPRE_BoomerAMGSetTol(precond, pc_tol); HYPRE_BoomerAMGSetCoarsenType(precond, (hybrid * coarsen_type)); HYPRE_BoomerAMGSetMeasureType(precond, measure_type); HYPRE_BoomerAMGSetStrongThreshold(precond, strong_threshold); HYPRE_BoomerAMGSetTruncFactor(precond, trunc_factor); HYPRE_BoomerAMGSetPrintLevel(precond, poutdat); HYPRE_BoomerAMGSetPrintFileName(precond, "driver.out.log"); HYPRE_BoomerAMGSetMaxIter(precond, 1); HYPRE_BoomerAMGSetCycleType(precond, cycle_type); HYPRE_BoomerAMGSetNumGridSweeps(precond, num_grid_sweeps); HYPRE_BoomerAMGSetGridRelaxType(precond, grid_relax_type); HYPRE_BoomerAMGSetRelaxWeight(precond, relax_weight); HYPRE_BoomerAMGSetOmega(precond, omega); HYPRE_BoomerAMGSetSmoothType(precond, smooth_type); HYPRE_BoomerAMGSetSmoothNumLevels(precond, smooth_num_levels); HYPRE_BoomerAMGSetSmoothNumSweeps(precond, smooth_num_sweeps); HYPRE_BoomerAMGSetGridRelaxPoints(precond, grid_relax_points); HYPRE_BoomerAMGSetMaxLevels(precond, max_levels); HYPRE_BoomerAMGSetMaxRowSum(precond, max_row_sum); HYPRE_BoomerAMGSetNumFunctions(precond, num_functions); HYPRE_BoomerAMGSetVariant(precond, variant); HYPRE_BoomerAMGSetOverlap(precond, overlap); HYPRE_BoomerAMGSetDomainType(precond, domain_type); HYPRE_BoomerAMGSetSchwarzRlxWeight(precond, schwarz_rlx_weight); if (num_functions > 1) { HYPRE_BoomerAMGSetDofFunc(precond, dof_func); } } /* use DiagScale preconditioner */ else if (precond_id == HYPRE_DIAGSCALE) { precond = NULL; } /* use ParaSails preconditioner */ else if (precond_id == HYPRE_PARASAILS) { HYPRE_ParaSailsCreate(hypre_MPI_COMM_WORLD, precond); HYPRE_ParaSailsSetParams(precond, sai_threshold, max_levels); HYPRE_ParaSailsSetFilter(precond, sai_filter); HYPRE_ParaSailsSetLogging(precond, poutdat); } /* use Schwarz preconditioner */ else if (precond_id == HYPRE_SCHWARZ) { HYPRE_SchwarzCreate(precond); HYPRE_SchwarzSetVariant(precond, variant); HYPRE_SchwarzSetOverlap(precond, overlap); HYPRE_SchwarzSetDomainType(precond, domain_type); HYPRE_SchwarzSetRelaxWeight(precond, schwarz_rlx_weight); } /* use GSMG as preconditioner */ else if (precond_id == HYPRE_GSMG) { /* fine grid */ num_grid_sweeps[0] = num_sweep; grid_relax_type[0] = relax_default; hypre_TFree(grid_relax_points[0], HYPRE_MEMORY_HOST); grid_relax_points[0] = hypre_CTAlloc(HYPRE_Int, num_sweep, HYPRE_MEMORY_HOST); for (i = 0; i < num_sweep; i++) { grid_relax_points[0][i] = 0; } /* down cycle */ num_grid_sweeps[1] = num_sweep; grid_relax_type[1] = relax_default; hypre_TFree(grid_relax_points[1], HYPRE_MEMORY_HOST); grid_relax_points[1] = hypre_CTAlloc(HYPRE_Int, num_sweep, HYPRE_MEMORY_HOST); for (i = 0; i < num_sweep; i++) { grid_relax_points[1][i] = 0; } /* up cycle */ num_grid_sweeps[2] = num_sweep; grid_relax_type[2] = relax_default; hypre_TFree(grid_relax_points[2], HYPRE_MEMORY_HOST); grid_relax_points[2] = hypre_CTAlloc(HYPRE_Int, num_sweep, HYPRE_MEMORY_HOST); for (i = 0; i < num_sweep; i++) { grid_relax_points[2][i] = 0; } /* coarsest grid */ num_grid_sweeps[3] = 1; grid_relax_type[3] = 9; hypre_TFree(grid_relax_points[3], HYPRE_MEMORY_HOST); grid_relax_points[3] = hypre_CTAlloc(HYPRE_Int, 1, HYPRE_MEMORY_HOST); grid_relax_points[3][0] = 0; HYPRE_BoomerAMGCreate(precond); HYPRE_BoomerAMGSetGSMG(precond, 4); HYPRE_BoomerAMGSetInterpType(precond, interp_type); HYPRE_BoomerAMGSetNumSamples(precond, gsmg_samples); HYPRE_BoomerAMGSetTol(precond, pc_tol); HYPRE_BoomerAMGSetCoarsenType(precond, (hybrid * coarsen_type)); HYPRE_BoomerAMGSetMeasureType(precond, measure_type); HYPRE_BoomerAMGSetStrongThreshold(precond, strong_threshold); HYPRE_BoomerAMGSetTruncFactor(precond, trunc_factor); HYPRE_BoomerAMGSetPrintLevel(precond, poutdat); HYPRE_BoomerAMGSetPrintFileName(precond, "driver.out.log"); HYPRE_BoomerAMGSetMaxIter(precond, 1); HYPRE_BoomerAMGSetCycleType(precond, cycle_type); HYPRE_BoomerAMGSetNumGridSweeps(precond, num_grid_sweeps); HYPRE_BoomerAMGSetGridRelaxType(precond, grid_relax_type); HYPRE_BoomerAMGSetRelaxWeight(precond, relax_weight); HYPRE_BoomerAMGSetOmega(precond, omega); HYPRE_BoomerAMGSetSmoothType(precond, smooth_type); HYPRE_BoomerAMGSetSmoothNumLevels(precond, smooth_num_levels); HYPRE_BoomerAMGSetSmoothNumSweeps(precond, smooth_num_sweeps); HYPRE_BoomerAMGSetVariant(precond, variant); HYPRE_BoomerAMGSetOverlap(precond, overlap); HYPRE_BoomerAMGSetDomainType(precond, domain_type); HYPRE_BoomerAMGSetSchwarzRlxWeight(precond, schwarz_rlx_weight); HYPRE_BoomerAMGSetGridRelaxPoints(precond, grid_relax_points); HYPRE_BoomerAMGSetMaxLevels(precond, max_levels); HYPRE_BoomerAMGSetMaxRowSum(precond, max_row_sum); HYPRE_BoomerAMGSetNumFunctions(precond, num_functions); if (num_functions > 1) { HYPRE_BoomerAMGSetDofFunc(precond, dof_func); } } /* use PILUT as preconditioner */ else if (precond_id == HYPRE_PILUT) { ierr = HYPRE_ParCSRPilutCreate( hypre_MPI_COMM_WORLD, precond ); } } HYPRE_Int hypre_destroy_precond(HYPRE_Int precond_id, void *precond) { if (precond_id == HYPRE_BICGSTAB) { HYPRE_BiCGSTABDestroy(precond); } else if (precond_id == HYPRE_BOOMERAMG) { HYPRE_BoomerAMGDestroy(precond); } else if (precond_id == HYPRE_CGNR) { HYPRE_CGNRDestroy(precond); } else if (precond_id == HYPRE_DIAGSCALE) { HYPRE_Destroy(precond); } else if (precond_id == HYPRE_EUCLID) { HYPRE_EuclidDestroy(precond); } else if (precond_id == HYPRE_GMRES) { HYPRE_GMRESDestroy(precond); } else if (precond_id == HYPRE_GSMG) { HYPRE_BoomerAMGDestroy(precond); } else if (precond_id == HYPRE_HYBRID) { HYPRE_HybridDestroy(precond); } else if (precond_id == HYPRE_JACOBI) { HYPRE_JacobiDestroy(precond); } else if (precond_id == HYPRE_PARASAILS) { HYPRE_ParaSailsDestroy(precond); } else if (precond_id == HYPRE_PCG) { HYPRE_PCGDestroy(precond); } else if (precond_id == HYPRE_PFMG) { HYPRE_PFMGDestroy(precond); } else if (precond_id == HYPRE_PILUT) { HYPRE_PilutDestroy(precond); } else if (precond_id == HYPRE_SCHWARZ) { HYPRE_SchwarzDestroy(precond); } else if (precond_id == HYPRE_SMG) { HYPRE_SMGDestroy(precond); } else if (precond_id == HYPRE_SPARSEMSG) { HYPRE_SparseMSGDestroy(precond); } else if (precond_id == HYPRE_SPLIT) { HYPRE_SplitDestroy(precond); } else if (precond_id == HYPRE_SPLITPFMG) { HYPRE_SplitDestroy(precond); } else if (precond_id == HYPRE_SPLITSMG) { HYPRE_SplitDestroy(precond); } else if (precond_id == HYPRE_SYSPFMG) { HYPRE_SysPFMGDestroy(precond); } } hypre-2.33.0/src/test/hypre_sstruct_fortran_test.h000066400000000000000000001110561477326011500223670ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #ifdef __cplusplus extern "C" { #endif /****************************************************************************** * Definitions of sstruct fortran interface routines *****************************************************************************/ #define HYPRE_SStructGraphCreate \ hypre_F90_NAME(fhypre_sstructgraphcreate, FHYPRE_SSTRUCTGRAPHCREATE) extern void hypre_F90_NAME(fhypre_sstructgraphcreate, FHYPRE_SSTRUCTGRAPHCREATE) (HYPRE_Int *, hypre_F90_Obj *, hypre_F90_Obj *); #define HYPRE_SStructGraphDestroy \ hypre_F90_NAME(fhypre_sstructgraphdestroy, FHYPRE_SSTRUCTGRAPHDESTROY) extern void hypre_F90_NAME(fhypre_sstructgraphdestroy, FHYPRE_SSTRUCTGRAPHDESTROY) (hypre_F90_Obj *); #define HYPRE_SStructGraphSetStencil \ hypre_F90_NAME(fhypre_sstructgraphsetstencil, FHYPRE_SSTRUCTGRAPHSETSTENCIL) extern void hypre_F90_NAME(fhypre_sstructgraphsetstencil, FHYPRE_SSTRUCTGRAPHSETSTENCIL) (hypre_F90_Obj *, HYPRE_Int *, HYPRE_Int *, hypre_F90_Obj *); #define HYPRE_SStructGraphAddEntries \ hypre_F90_NAME(fhypre_sstructgraphaddentries, FHYPRE_SSTRUCTGRAPHADDENTRIES) extern void hypre_F90_NAME(fhypre_sstructgraphaddentries, FHYPRE_SSTRUCTGRAPHADDENTRIES) (hypre_F90_Obj *, HYPRE_Int *, HYPRE_Int *, HYPRE_Int *, HYPRE_Int *, HYPRE_Int *, HYPRE_Int *); #define HYPRE_SStructGraphAssemble \ hypre_F90_NAME(fhypre_sstructgraphassemble, FHYPRE_SSTRUCTGRAPHASSEMBLE) extern void hypre_F90_NAME(fhypre_sstructgraphassemble, FHYPRE_SSTRUCTGRAPHASSEMBLE) (hypre_F90_Obj *); #define HYPRE_SStructGraphSetObjectType \ hypre_F90_NAME(fhypre_sstructgraphsetobjecttyp, FHYPRE_SSTRUCTGRAPHSETOBJECTTYP) extern void hypre_F90_NAME(fhypre_sstructgraphsetobjecttyp, FHYPRE_SSTRUCTGRAPHSETOBJECTTYP) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_SStructGridCreate \ hypre_F90_NAME(fhypre_sstructgridcreate, FHYPRE_SSTRUCTGRIDCREATE) extern void hypre_F90_NAME(fhypre_sstructgridcreate, FHYPRE_SSTRUCTGRIDCREATE) (HYPRE_Int *, HYPRE_Int *, HYPRE_Int *, hypre_F90_Obj *); #define HYPRE_SStructGridDestroy \ hypre_F90_NAME(fhypre_sstructgriddestroy, FHYPRE_SSTRUCTGRIDDESTROY) extern void hypre_F90_NAME(fhypre_sstructgriddestroy, FHYPRE_SSTRUCTGRIDDESTROY) (hypre_F90_Obj *); #define HYPRE_SStructGridSetExtents \ hypre_F90_NAME(fhypre_sstructgridsetextents, FHYPRE_SSTRUCTGRIDSETEXTENTS) extern void hypre_F90_NAME(fhypre_sstructgridsetextents, FHYPRE_SSTRUCTGRIDSETEXTENTS) (hypre_F90_Obj *, HYPRE_Int *, HYPRE_Int *, HYPRE_Int *); #define HYPRE_SStructGridSetVariables \ hypre_F90_NAME(fhypre_sstructgridsetvariables, FHYPRE_SSTRUCTGRIDSETVARIABLES) extern void hypre_F90_NAME(fhypre_sstructgridsetvariables, FHYPRE_SSTRUCTGRIDSETVARIABLES) (hypre_F90_Obj *, HYPRE_Int *, HYPRE_Int *, hypre_F90_Obj *); #define HYPRE_SStructGridAddVariables \ hypre_F90_NAME(fhypre_sstructgridaddvariables, FHYPRE_SSTRUCTGRIDADDVARIABLES) extern void hypre_F90_NAME(fhypre_sstructgridaddvariables, FHYPRE_SSTRUCTGRIDADDVARIABLES) (hypre_F90_Obj *, HYPRE_Int *, HYPRE_Int *, HYPRE_Int *, hypre_F90_Obj *); #define HYPRE_SStructGridSetNeighborBox \ hypre_F90_NAME(fhypre_sstructgridsetneighborbo, FHYPRE_SSTRUCTGRIDSETNEIGHBORBO) extern void hypre_F90_NAME(fhypre_sstructgridsetneighborbo, FHYPRE_SSTRUCTGRIDSETNEIGHBORBO) (hypre_F90_Obj *, HYPRE_Int *, HYPRE_Int *, HYPRE_Int *, HYPRE_Int *, HYPRE_Int *, HYPRE_Int *, HYPRE_Int *); #define HYPRE_SStructGridAssemble \ hypre_F90_NAME(fhypre_sstructgridassemble, FHYPRE_SSTRUCTGRIDASSEMBLE) extern void hypre_F90_NAME(fhypre_sstructgridassemble, FHYPRE_SSTRUCTGRIDASSEMBLE) (hypre_F90_Obj *); #define HYPRE_SStructGridSetPeriodic \ hypre_F90_NAME(fhypre_sstructgridsetperiodic, FHYPRE_SSTRUCTGRIDSETPERIODIC) extern void hypre_F90_NAME(fhypre_sstructgridsetperiodic, FHYPRE_SSTRUCTGRIDSETPERIODIC) (hypre_F90_Obj *, HYPRE_Int *, HYPRE_Int *); #define HYPRE_SStructGridSetNumGhost \ hypre_F90_NAME(fhypre_sstructgridsetnumghost, FHYPRE_SSTRUCTGRIDSETNUMGHOST) extern void hypre_F90_NAME(fhypre_sstructgridsetnumghost, FHYPRE_SSTRUCTGRIDSETNUMGHOST) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_SStructMatrixCreate \ hypre_F90_NAME(fhypre_sstructmatrixcreate, FHYPRE_SSTRUCTMATRIXCREATE) extern void hypre_F90_NAME(fhypre_sstructmatrixcreate, FHYPRE_SSTRUCTMATRIXCREATE) (HYPRE_Int *, hypre_F90_Obj *, hypre_F90_Obj *); #define HYPRE_SStructMatrixDestroy \ hypre_F90_NAME(fhypre_sstructmatrixdestroy, FHYPRE_SSTRUCTMATRIXDESTROY) extern void hypre_F90_NAME(fhypre_sstructmatrixdestroy, FHYPRE_SSTRUCTMATRIXDESTROY) (hypre_F90_Obj *); #define HYPRE_SStructMatrixInitialize \ hypre_F90_NAME(fhypre_sstructmatrixinitialize, FHYPRE_SSTRUCTMATRIXINITIALIZE) extern void hypre_F90_NAME(fhypre_sstructmatrixinitialize, FHYPRE_SSTRUCTMATRIXINITIALIZE) (hypre_F90_Obj *); #define HYPRE_SStructMatrixSetValues \ hypre_F90_NAME(fhypre_sstructmatrixsetvalues, FHYPRE_SSTRUCTMATRIXSETVALUES) extern void hypre_F90_NAME(fhypre_sstructmatrixsetvalues, FHYPRE_SSTRUCTMATRIXSETVALUES) (hypre_F90_Obj *, HYPRE_Int *, HYPRE_Int *, HYPRE_Int *, HYPRE_Int *, HYPRE_Int *, HYPRE_Real *); #define HYPRE_SStructMatrixSetBoxValues \ hypre_F90_NAME(fhypre_sstructmatrixsetboxvalue, FHYPRE_SSTRUCTMATRIXSETBOXVALUE) extern void hypre_F90_NAME(fhypre_sstructmatrixsetboxvalue, FHYPRE_SSTRUCTMATRIXSETBOXVALUE) (hypre_F90_Obj *, HYPRE_Int *, HYPRE_Int *, HYPRE_Int *, HYPRE_Int *, HYPRE_Int *, HYPRE_Int *, HYPRE_Real *); #define HYPRE_SStructMatrixGetValues \ hypre_F90_NAME(fhypre_sstructmatrixgetvalues, FHYPRE_SSTRUCTMATRIXGETVALUES) extern void hypre_F90_NAME(fhypre_sstructmatrixgetvalues, FHYPRE_SSTRUCTMATRIXGETVALUES) (hypre_F90_Obj *, HYPRE_Int *, HYPRE_Int *, HYPRE_Int *, HYPRE_Int *, HYPRE_Int *, HYPRE_Real *); #define HYPRE_SStructMatrixGetBoxValues \ hypre_F90_NAME(fhypre_sstructmatrixgetboxvalue, FHYPRE_SSTRUCTMATRIXGETBOXVALUE) extern void hypre_F90_NAME(fhypre_sstructmatrixgetboxvalue, FHYPRE_SSTRUCTMATRIXGETBOXVALUE) (hypre_F90_Obj *, HYPRE_Int *, HYPRE_Int *, HYPRE_Int *, HYPRE_Int *, HYPRE_Int *, HYPRE_Int *, HYPRE_Real *); #define HYPRE_SStructMatrixAddToValues \ hypre_F90_NAME(fhypre_sstructmatrixaddtovalues, FHYPRE_SSTRUCTMATRIXADDTOVALUES) extern void hypre_F90_NAME(fhypre_sstructmatrixaddtovalues, FHYPRE_SSTRUCTMATRIXADDTOVALUES) (hypre_F90_Obj *, HYPRE_Int *, HYPRE_Int *, HYPRE_Int *, HYPRE_Int *, HYPRE_Int *, HYPRE_Real *); #define HYPRE_SStructMatrixAddToBoxValues \ hypre_F90_NAME(fhypre_sstructmatrixaddtoboxval, FHYPRE_SSTRUCTMATRIXADDTOBOXVAL) extern void hypre_F90_NAME(fhypre_sstructmatrixaddtoboxval, FHYPRE_SSTRUCTMATRIXADDTOBOXVAL) (hypre_F90_Obj *, HYPRE_Int *, HYPRE_Int *, HYPRE_Int *, HYPRE_Int *, HYPRE_Int *, HYPRE_Int *, HYPRE_Real *); #define HYPRE_SStructMatrixAssemble \ hypre_F90_NAME(fhypre_sstructmatrixassemble, FHYPRE_SSTRUCTMATRIXASSEMBLE) extern void hypre_F90_NAME(fhypre_sstructmatrixassemble, FHYPRE_SSTRUCTMATRIXASSEMBLE) (hypre_F90_Obj *); #define HYPRE_SStructMatrixSetSymmetric \ hypre_F90_NAME(fhypre_sstructmatrixsetsymmetri, FHYPRE_SSTRUCTMATRIXSETSYMMETRI) extern void hypre_F90_NAME(fhypre_sstructmatrixsetsymmetri, FHYPRE_SSTRUCTMATRIXSETSYMMETRI) (hypre_F90_Obj *, HYPRE_Int *, HYPRE_Int *, HYPRE_Int *, HYPRE_Int *); #define HYPRE_SStructMatrixSetNSSymmetric \ hypre_F90_NAME(fhypre_sstructmatrixsetnssymmet, FHYPRE_SSTRUCTMATRIXSETNSSYMMET) extern void hypre_F90_NAME(fhypre_sstructmatrixsetnssymmet, FHYPRE_SSTRUCTMATRIXSETNSSYMMET) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_SStructMatrixSetObjectType \ hypre_F90_NAME(fhypre_sstructmatrixsetobjectty, FHYPRE_SSTRUCTMATRIXSETOBJECTTY) extern void hypre_F90_NAME(fhypre_sstructmatrixsetobjectty, FHYPRE_SSTRUCTMATRIXSETOBJECTTY) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_SStructMatrixGetObject \ hypre_F90_NAME(fhypre_sstructmatrixgetobject, FHYPRE_SSTRUCTMATRIXGETOBJECT) extern void hypre_F90_NAME(fhypre_sstructmatrixgetobject, FHYPRE_SSTRUCTMATRIXGETOBJECT) (hypre_F90_Obj *, hypre_F90_Obj *); #define HYPRE_SStructMatrixPrint \ hypre_F90_NAME(fhypre_sstructmatrixprint, FHYPRE_SSTRUCTMATRIXPRINT) extern void hypre_F90_NAME(fhypre_sstructmatrixprint, FHYPRE_SSTRUCTMATRIXPRINT) (const char *, hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_SStructStencilCreate \ hypre_F90_NAME(fhypre_sstructstencilcreate, FHYPRE_SSTRUCTSTENCILCREATE) extern void hypre_F90_NAME(fhypre_sstructstencilcreate, FHYPRE_SSTRUCTSTENCILCREATE) (HYPRE_Int *, HYPRE_Int *, hypre_F90_Obj *); #define HYPRE_SStructStencilDestroy \ hypre_F90_NAME(fhypre_sstructstencildestroy, FHYPRE_SSTRUCTSTENCILDESTROY) extern void hypre_F90_NAME(fhypre_sstructstencildestroy, FHYPRE_SSTRUCTSTENCILDESTROY) (hypre_F90_Obj *); #define HYPRE_SStructStencilSetEntry \ hypre_F90_NAME(fhypre_sstructstencilsetentry, FHYPRE_SSTRUCTSTENCILSETENTRY) extern void hypre_F90_NAME(fhypre_sstructstencilsetentry, FHYPRE_SSTRUCTSTENCILSETENTRY) (hypre_F90_Obj *, HYPRE_Int *, HYPRE_Int *, HYPRE_Int *); #define HYPRE_SStructVectorCreate \ hypre_F90_NAME(fhypre_sstructvectorcreate, FHYPRE_SSTRUCTVECTORCREATE) extern void hypre_F90_NAME(fhypre_sstructvectorcreate, FHYPRE_SSTRUCTVECTORCREATE) (HYPRE_Int *, hypre_F90_Obj *, hypre_F90_Obj *); #define HYPRE_SStructVectorDestroy \ hypre_F90_NAME(fhypre_sstructvectordestroy, FHYPRE_SSTRUCTVECTORDESTROY) extern void hypre_F90_NAME(fhypre_sstructvectordestroy, FHYPRE_SSTRUCTVECTORDESTROY) (hypre_F90_Obj *); #define HYPRE_SStructVectorInitialize \ hypre_F90_NAME(fhypre_sstructvectorinitialize, FHYPRE_SSTRUCTVECTORINITIALIZE) extern void hypre_F90_NAME(fhypre_sstructvectorinitialize, FHYPRE_SSTRUCTVECTORINITIALIZE) (hypre_F90_Obj *); #define HYPRE_SStructVectorSetValues \ hypre_F90_NAME(fhypre_sstructvectorsetvalues, FHYPRE_SSTRUCTVECTORSETVALUES) extern void hypre_F90_NAME(fhypre_sstructvectorsetvalues, FHYPRE_SSTRUCTVECTORSETVALUES) (hypre_F90_Obj *, HYPRE_Int *, HYPRE_Int *, HYPRE_Int *, HYPRE_Real *); #define HYPRE_SStructVectorSetBoxValues \ hypre_F90_NAME(fhypre_sstructvectorsetboxvalue, FHYPRE_SSTRUCTVECTORSETBOXVALUE) extern void hypre_F90_NAME(fhypre_sstructvectorsetboxvalue, FHYPRE_SSTRUCTVECTORSETBOXVALUE) (hypre_F90_Obj *, HYPRE_Int *, HYPRE_Int *, HYPRE_Int *, HYPRE_Int *, HYPRE_Real *); #define HYPRE_SStructVectorAddToValues \ hypre_F90_NAME(fhypre_sstructvectoraddtovalues, FHYPRE_SSTRUCTVECTORADDTOVALUES) extern void hypre_F90_NAME(fhypre_sstructvectoraddtovalues, FHYPRE_SSTRUCTVECTORADDTOVALUES) (hypre_F90_Obj *, HYPRE_Int *, HYPRE_Int *, HYPRE_Int *, HYPRE_Real *); #define HYPRE_SStructVectorAddToBoxValues \ hypre_F90_NAME(fhypre_sstructvectoraddtoboxval, FHYPRE_SSTRUCTVECTORADDTOBOXVAL) extern void hypre_F90_NAME(fhypre_sstructvectoraddtoboxval, FHYPRE_SSTRUCTVECTORADDTOBOXVAL) (hypre_F90_Obj *, HYPRE_Int *, HYPRE_Int *, HYPRE_Int *, HYPRE_Int *, HYPRE_Real *); #define HYPRE_SStructVectorAssemble \ hypre_F90_NAME(fhypre_sstructvectorassemble, FHYPRE_SSTRUCTVECTORASSEMBLE) extern void hypre_F90_NAME(fhypre_sstructvectorassemble, FHYPRE_SSTRUCTVECTORASSEMBLE) (hypre_F90_Obj *); #define HYPRE_SStructVectorGather \ hypre_F90_NAME(fhypre_sstructvectorgather, FHYPRE_SSTRUCTVECTORGATHER) extern void hypre_F90_NAME(fhypre_sstructvectorgather, FHYPRE_SSTRUCTVECTORGATHER) (hypre_F90_Obj *); #define HYPRE_SStructVectorGetValues \ hypre_F90_NAME(fhypre_sstructvectorgetvalues, FHYPRE_SSTRUCTVECTORGETVALUES) extern void hypre_F90_NAME(fhypre_sstructvectorgetvalues, FHYPRE_SSTRUCTVECTORGETVALUES) (hypre_F90_Obj *, HYPRE_Int *, HYPRE_Int *, HYPRE_Int *, HYPRE_Real *); #define HYPRE_SStructVectorGetBoxValues \ hypre_F90_NAME(fhypre_sstructvectorgetboxvalue, FHYPRE_SSTRUCTVECTORGETBOXVALUE) extern void hypre_F90_NAME(fhypre_sstructvectorgetboxvalue, FHYPRE_SSTRUCTVECTORGETBOXVALUE) (hypre_F90_Obj *, HYPRE_Int *, HYPRE_Int *, HYPRE_Int *, HYPRE_Int *, HYPRE_Real *); #define HYPRE_SStructVectorSetObjectType \ hypre_F90_NAME(fhypre_sstructvectorsetobjectty, FHYPRE_SSTRUCTVECTORSETOBJECTTY) extern void hypre_F90_NAME(fhypre_sstructvectorsetobjectty, FHYPRE_SSTRUCTVECTORSETOBJECTTY) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_SStructVectorGetObject \ hypre_F90_NAME(fhypre_sstructvectorgetobject, FHYPRE_SSTRUCTVECTORGETOBJECT) extern void hypre_F90_NAME(fhypre_sstructvectorgetobject, FHYPRE_SSTRUCTVECTORGETOBJECT) (hypre_F90_Obj *, void *); #define HYPRE_SStructVectorPrint \ hypre_F90_NAME(fhypre_sstructvectorprint, FHYPRE_SSTRUCTVECTORPRINT) extern void hypre_F90_NAME(fhypre_sstructvectorprint, FHYPRE_SSTRUCTVECTORPRINT) (const char *, hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_SStructBiCGSTABCreate \ hypre_F90_NAME(fhypre_sstructbicgstabcreate, FHYPRE_SSTRUCTBICGSTABCREATE) extern void hypre_F90_NAME(fhypre_sstructbicgstabcreate, FHYPRE_SSTRUCTBICGSTABCREATE) (HYPRE_Int *, hypre_F90_Obj *); #define HYPRE_SStructBiCGSTABDestroy \ hypre_F90_NAME(fhypre_sstructbicgstabdestroy, FHYPRE_SSTRUCTBICGSTABDESTROY) extern void hypre_F90_NAME(fhypre_sstructbicgstabdestroy, FHYPRE_SSTRUCTBICGSTABDESTROY) (hypre_F90_Obj *); #define HYPRE_SStructBiCGSTABSetup \ hypre_F90_NAME(fhypre_sstructbicgstabsetup, FHYPRE_SSTRUCTBICGSTABSETUP) extern void hypre_F90_NAME(fhypre_sstructbicgstabsetup, FHYPRE_SSTRUCTBICGSTABSETUP) (hypre_F90_Obj *, hypre_F90_Obj *, hypre_F90_Obj *, hypre_F90_Obj *); #define HYPRE_SStructBiCGSTABSolve \ hypre_F90_NAME(fhypre_sstructbicgstabsolve, FHYPRE_SSTRUCTBICGSTABSOLVE) extern void hypre_F90_NAME(fhypre_sstructbicgstabsolve, FHYPRE_SSTRUCTBICGSTABSOLVE) (hypre_F90_Obj *, hypre_F90_Obj *, hypre_F90_Obj *, hypre_F90_Obj *); #define HYPRE_SStructBiCGSTABSetTol \ hypre_F90_NAME(fhypre_sstructbicgstabsettol, FHYPRE_SSTRUCTBICGSTABSETTOL) extern void hypre_F90_NAME(fhypre_sstructbicgstabsettol, FHYPRE_SSTRUCTBICGSTABSETTOL) (hypre_F90_Obj *, HYPRE_Real *); #define HYPRE_SStructBiCGSTABSetMinIter \ hypre_F90_NAME(fhypre_sstructbicgstabsetminite, FHYPRE_SSTRUCTBICGSTABSETMINITE) extern void hypre_F90_NAME(fhypre_sstructbicgstabsetminite, FHYPRE_SSTRUCTBICGSTABSETMINITE) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_SStructBiCGSTABSetMaxIter \ hypre_F90_NAME(fhypre_sstructbicgstabsetmaxite, FHYPRE_SSTRUCTBICGSTABSETMAXITE) extern void hypre_F90_NAME(fhypre_sstructbicgstabsetmaxite, FHYPRE_SSTRUCTBICGSTABSETMAXITE) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_SStructBiCGSTABSetStopCrit \ hypre_F90_NAME(fhypre_sstructbicgstabsetstopcr, FHYPRE_SSTRUCTBICGSTABSETSTOPCR) extern void hypre_F90_NAME(fhypre_sstructbicgstabsetstopcr, FHYPRE_SSTRUCTBICGSTABSETSTOPCR) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_SStructBiCGSTABSetPrecond \ hypre_F90_NAME(fhypre_sstructbicgstabsetprecon, FHYPRE_SSTRUCTBICGSTABSETPRECON) extern void hypre_F90_NAME(fhypre_sstructbicgstabsetprecon, FHYPRE_SSTRUCTBICGSTABSETPRECON) (hypre_F90_Obj *, HYPRE_Int *, hypre_F90_Obj *); #define HYPRE_SStructBiCGSTABSetLogging \ hypre_F90_NAME(fhypre_sstructbicgstabsetloggin, FHYPRE_SSTRUCTBICGSTABSETLOGGIN) extern void hypre_F90_NAME(fhypre_sstructbicgstabsetloggin, FHYPRE_SSTRUCTBICGSTABSETLOGGIN) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_SStructBiCGSTABSetPrintLevel \ hypre_F90_NAME(fhypre_sstructbicgstabsetprintl, FHYPRE_SSTRUCTBICGSTABSETPRINTL) extern void hypre_F90_NAME(fhypre_sstructbicgstabsetprintl, FHYPRE_SSTRUCTBICGSTABSETPRINTL) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_SStructBiCGSTABGetNumIterations \ hypre_F90_NAME(fhypre_sstructbicgstabgetnumite, FHYPRE_SSTRUCTBICGSTABGETNUMITE) extern void hypre_F90_NAME(fhypre_sstructbicgstabgetnumite, FHYPRE_SSTRUCTBICGSTABGETNUMITE) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_SStructBiCGSTABGetFinalRelativeResidualNorm \ hypre_F90_NAME(fhypre_sstructbicgstabgetfinalr, FHYPRE_SSTRUCTBICGSTABGETFINALR) extern void hypre_F90_NAME(fhypre_sstructbicgstabgetfinalr, FHYPRE_SSTRUCTBICGSTABGETFINALR) (hypre_F90_Obj *, HYPRE_Real *); #define HYPRE_SStructBiCGSTABGetResidual \ hypre_F90_NAME(fhypre_sstructbicgstabgetresidu, FHYPRE_SSTRUCTBICGSTABGETRESIDU) extern void hypre_F90_NAME(fhypre_sstructbicgstabgetresidu, FHYPRE_SSTRUCTBICGSTABGETRESIDU) (hypre_F90_Obj *, hypre_F90_Obj *); #define HYPRE_SStructGMRESCreate \ hypre_F90_NAME(fhypre_sstructgmrescreate, FHYPRE_SSTRUCTGMRESCREATE) extern void hypre_F90_NAME(fhypre_sstructgmrescreate, FHYPRE_SSTRUCTGMRESCREATE) (hypre_F90_Obj *, hypre_F90_Obj *); #define HYPRE_SStructGMRESDestroy \ hypre_F90_NAME(fhypre_sstructgmresdestroy, FHYPRE_SSTRUCTGMRESDESTROY) extern void hypre_F90_NAME(fhypre_sstructgmresdestroy, FHYPRE_SSTRUCTGMRESDESTROY) (hypre_F90_Obj *); #define HYPRE_SStructGMRESSetup \ hypre_F90_NAME(fhypre_sstructgmressetup, FHYPRE_SSTRUCTGMRESSETUP) extern void hypre_F90_NAME(fhypre_sstructgmressetup, FHYPRE_SSTRUCTGMRESSETUP) (hypre_F90_Obj *, hypre_F90_Obj *, hypre_F90_Obj *, hypre_F90_Obj *); #define HYPRE_SStructGMRESSolve \ hypre_F90_NAME(fhypre_sstructgmressolve, FHYPRE_SSTRUCTGMRESSOLVE) extern void hypre_F90_NAME(fhypre_sstructgmressolve, FHYPRE_SSTRUCTGMRESSOLVE) (hypre_F90_Obj *, hypre_F90_Obj *, hypre_F90_Obj *, hypre_F90_Obj *); #define HYPRE_SStructGMRESSetKDim \ hypre_F90_NAME(fhypre_sstructgmressetkdim, FHYPRE_SSTRUCTGMRESSETKDIM) extern void hypre_F90_NAME(fhypre_sstructgmressetkdim, FHYPRE_SSTRUCTGMRESSETKDIM) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_SStructGMRESSetTol \ hypre_F90_NAME(fhypre_sstructgmressettol, FHYPRE_SSTRUCTGMRESSETTOL) extern void hypre_F90_NAME(fhypre_sstructgmressettol, FHYPRE_SSTRUCTGMRESSETTOL) (hypre_F90_Obj *, HYPRE_Real *); #define HYPRE_SStructGMRESSetMinIter \ hypre_F90_NAME(fhypre_sstructgmressetminiter, FHYPRE_SSTRUCTGMRESSETMINITER) extern void hypre_F90_NAME(fhypre_sstructgmressetminiter, FHYPRE_SSTRUCTGMRESSETMINITER) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_SStructGMRESSetMaxIter \ hypre_F90_NAME(fhypre_sstructgmressetmaxiter, FHYPRE_SSTRUCTGMRESSETMAXITER) extern void hypre_F90_NAME(fhypre_sstructgmressetmaxiter, FHYPRE_SSTRUCTGMRESSETMAXITER) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_SStructGMRESSetStopCrit \ hypre_F90_NAME(fhypre_sstructgmressetstopcrit, FHYPRE_SSTRUCTGMRESSETSTOPCRIT) extern void hypre_F90_NAME(fhypre_sstructgmressetstopcrit, FHYPRE_SSTRUCTGMRESSETSTOPCRIT) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_SStructGMRESSetPrecond \ hypre_F90_NAME(fhypre_sstructgmressetprecond, FHYPRE_SSTRUCTGMRESSETPRECOND) extern void hypre_F90_NAME(fhypre_sstructgmressetprecond, FHYPRE_SSTRUCTGMRESSETPRECOND) (hypre_F90_Obj *, HYPRE_Int *, hypre_F90_Obj *); #define HYPRE_SStructGMRESSetLogging \ hypre_F90_NAME(fhypre_sstructgmressetlogging, FHYPRE_SSTRUCTGMRESSETLOGGING) extern void hypre_F90_NAME(fhypre_sstructgmressetlogging, FHYPRE_SSTRUCTGMRESSETLOGGING) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_SStructGMRESSetPrintLevel \ hypre_F90_NAME(fhypre_sstructgmressetprintleve, FHYPRE_SSTRUCTGMRESSETPRINTLEVE) extern void hypre_F90_NAME(fhypre_sstructgmressetprintleve, FHYPRE_SSTRUCTGMRESSETPRINTLEVE) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_SStructGMRESGetNumIterations \ hypre_F90_NAME(fhypre_sstructgmresgetnumiterati, FHYPRE_SSTRUCTGMRESGETNUMITERATI) extern void hypre_F90_NAME(fhypre_sstructgmresgetnumiterati, FHYPRE_SSTRUCTGMRESGETNUMITERATI) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_SStructGMRESGetFinalRelativeResidualNorm \ hypre_F90_NAME(fhypre_sstructgmresgetfinalrela, FHYPRE_SSTRUCTGMRESGETFINALRELA) extern void hypre_F90_NAME(fhypre_sstructgmresgetfinalrela, FHYPRE_SSTRUCTGMRESGETFINALRELA) (hypre_F90_Obj *, HYPRE_Real *); #define HYPRE_SStructGMRESGetResidual \ hypre_F90_NAME(fhypre_sstructgmresgetresidual, FHYPRE_SSTRUCTGMRESGETRESIDUAL) extern void hypre_F90_NAME(fhypre_sstructgmresgetresidual, FHYPRE_SSTRUCTGMRESGETRESIDUAL) (hypre_F90_Obj *, hypre_F90_Obj *); #define HYPRE_SStructPCGCreate \ hypre_F90_NAME(fhypre_sstructpcgcreate, FHYPRE_SSTRUCTPCGCREATE) extern void hypre_F90_NAME(fhypre_sstructpcgcreate, FHYPRE_SSTRUCTPCGCREATE) (hypre_F90_Obj *, hypre_F90_Obj *); #define HYPRE_SStructPCGDestroy \ hypre_F90_NAME(fhypre_sstructpcgdestroy, FHYPRE_SSTRUCTPCGDESTROY) extern void hypre_F90_NAME(fhypre_sstructpcgdestroy, FHYPRE_SSTRUCTPCGDESTROY) (hypre_F90_Obj *); #define HYPRE_SStructPCGSetup \ hypre_F90_NAME(fhypre_sstructpcgsetup, FHYPRE_SSTRUCTPCGDESTROY) extern void hypre_F90_NAME(fhypre_sstructpcgsetup, FHYPRE_SSTRUCTPCGDESTROY) (hypre_F90_Obj *, hypre_F90_Obj *, hypre_F90_Obj *, hypre_F90_Obj *); #define HYPRE_SStructPCGSolve \ hypre_F90_NAME(fhypre_sstructpcgsolve, FHYPRE_SSTRUCTPCGSOLVE) extern void hypre_F90_NAME(fhypre_sstructpcgsolve, FHYPRE_SSTRUCTPCGSOLVE) (hypre_F90_Obj *, hypre_F90_Obj *, hypre_F90_Obj *, hypre_F90_Obj *); #define HYPRE_SStructPCGSetTol \ hypre_F90_NAME(fhypre_sstructpcgsettol, FHYPRE_SSTRUCTPCGSETTOL) extern void hypre_F90_NAME(fhypre_sstructpcgsettol, FHYPRE_SSTRUCTPCGSETTOL) (hypre_F90_Obj *, HYPRE_Real *); #define HYPRE_SStructPCGSetMaxIter \ hypre_F90_NAME(fhypre_sstructpcgsetmaxiter, FHYPRE_SSTRUCTPCGSETMAXITER) extern void hypre_F90_NAME(fhypre_sstructpcgsetmaxiter, FHYPRE_SSTRUCTPCGSETMAXITER) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_SStructPCGSetTwoNorm \ hypre_F90_NAME(fhypre_sstructpcgsettwonorm, FHYPRE_SSTRUCTPCGSETTWONORM) extern void hypre_F90_NAME(fhypre_sstructpcgsettwonorm, FHYPRE_SSTRUCTPCGSETTWONORM) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_SStructPCGSetRelChange \ hypre_F90_NAME(fhypre_sstructpcgsetrelchange, FHYPRE_SSTRUCTPCGSETRELCHANGE) extern void hypre_F90_NAME(fhypre_sstructpcgsetrelchange, FHYPRE_SSTRUCTPCGSETRELCHANGE) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_SStructPCGSetPrecond \ hypre_F90_NAME(fhypre_sstructpcgsetprecond, FHYPRE_SSTRUCTPCGSETPRECOND) extern void hypre_F90_NAME(fhypre_sstructpcgsetprecond, FHYPRE_SSTRUCTPCGSETPRECOND) (hypre_F90_Obj *, HYPRE_Int *, hypre_F90_Obj *); #define HYPRE_SStructPCGSetLogging \ hypre_F90_NAME(fhypre_sstructpcgsetlogging, FHYPRE_SSTRUCTPCGSETLOGGING) extern void hypre_F90_NAME(fhypre_sstructpcgsetlogging, FHYPRE_SSTRUCTPCGSETLOGGING) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_SStructPCGSetPrintLevel \ hypre_F90_NAME(fhypre_sstructpcgsetprintlevel, FHYPRE_SSTRUCTPCGSETPRINTLEVEL) extern void hypre_F90_NAME(fhypre_sstructpcgsetprintlevel, FHYPRE_SSTRUCTPCGSETPRINTLEVEL) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_SStructPCGGetNumIterations \ hypre_F90_NAME(fhypre_sstructpcggetnumiteratio, FHYPRE_SSTRUCTPCGGETNUMITERATIO) extern void hypre_F90_NAME(fhypre_sstructpcggetnumiteratio, FHYPRE_SSTRUCTPCGGETNUMITERATIO) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_SStructPCGGetFinalRelativeResidualNorm \ hypre_F90_NAME(fhypre_sstructpcggetfinalrelati, FHYPRE_SSTRUCTPCGGETFINALRELATI) extern void hypre_F90_NAME(fhypre_sstructpcggetfinalrelati, FHYPRE_SSTRUCTPCGGETFINALRELATI) (hypre_F90_Obj *, HYPRE_Real *); #define HYPRE_SStructPCGGetResidual \ hypre_F90_NAME(fhypre_sstructpcggetresidual, FHYPRE_SSTRUCTPCGGETRESIDUAL) extern void hypre_F90_NAME(fhypre_sstructpcggetresidual, FHYPRE_SSTRUCTPCGGETRESIDUAL) (hypre_F90_Obj *, hypre_F90_Obj *); #define HYPRE_SStructDiagScaleSetup \ hypre_F90_NAME(fhypre_sstructdiagscalesetup, FHYPRE_SSTRUCTDIAGSCALESETUP) extern void hypre_F90_NAME(fhypre_sstructdiagscalesetup, FHYPRE_SSTRUCTDIAGSCALESETUP) (hypre_F90_Obj *, hypre_F90_Obj *, hypre_F90_Obj *, hypre_F90_Obj *); #define HYPRE_SStructDiagScale \ hypre_F90_NAME(fhypre_sstructdiagscale, FHYPRE_SSTRUCTDIAGSCALE) extern void hypre_F90_NAME(fhypre_sstructdiagscale, FHYPRE_SSTRUCTDIAGSCALE) (hypre_F90_Obj *, hypre_F90_Obj *, hypre_F90_Obj *, hypre_F90_Obj *); #define HYPRE_SStructSplitCreate \ hypre_F90_NAME(fhypre_sstructsplitcreate, FHYPRE_SSTRUCTSPLITCREATE) extern void hypre_F90_NAME(fhypre_sstructsplitcreate, FHYPRE_SSTRUCTSPLITCREATE) (hypre_F90_Obj *, hypre_F90_Obj *); #define HYPRE_SStructSplitDestroy \ hypre_F90_NAME(fhypre_sstructsplitdestroy, FHYPRE_SSTRUCTSPLITDESTROY) extern void hypre_F90_NAME(fhypre_sstructsplitdestroy, FHYPRE_SSTRUCTSPLITDESTROY) (hypre_F90_Obj *); #define HYPRE_SStructSplitSetup \ hypre_F90_NAME(fhypre_sstructsplitsetup, FHYPRE_SSTRUCTSPLITSETUP) extern void hypre_F90_NAME(fhypre_sstructsplitsetup, FHYPRE_SSTRUCTSPLITSETUP) (hypre_F90_Obj *, hypre_F90_Obj *, hypre_F90_Obj *, hypre_F90_Obj *); #define HYPRE_SStructSplitSolve \ hypre_F90_NAME(fhypre_sstructsplitsolve, FHYPRE_SSTRUCTSPLITSOLVE) extern void hypre_F90_NAME(fhypre_sstructsplitsolve, FHYPRE_SSTRUCTSPLITSOLVE) (hypre_F90_Obj *, hypre_F90_Obj *, hypre_F90_Obj *, hypre_F90_Obj *); #define HYPRE_SStructSplitSetTol \ hypre_F90_NAME(fhypre_sstructsplitsettol, FHYPRE_SSTRUCTSPLITSETTOL) extern void hypre_F90_NAME(fhypre_sstructsplitsettol, FHYPRE_SSTRUCTSPLITSETTOL) (hypre_F90_Obj *, HYPRE_Real *); #define HYPRE_SStructSplitSetMaxIter \ hypre_F90_NAME(fhypre_sstructsplitsetmaxiter, FHYPRE_SSTRUCTSPLITSETMAXITER) extern void hypre_F90_NAME(fhypre_sstructsplitsetmaxiter, FHYPRE_SSTRUCTSPLITSETMAXITER) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_SStructSplitSetZeroGuess \ hypre_F90_NAME(fhypre_sstructsplitsetzeroguess, FHYPRE_SSTRUCTSPLITSETZEROGUESS) extern void hypre_F90_NAME(fhypre_sstructsplitsetzeroguess, FHYPRE_SSTRUCTSPLITSETZEROGUESS) (hypre_F90_Obj *); #define HYPRE_SStructSplitSetNonZeroGuess \ hypre_F90_NAME(fhypre_sstructsplitsetnonzerogu, FHYPRE_SSTRUCTSPLITSETNONZEROGU) extern void hypre_F90_NAME(fhypre_sstructsplitsetnonzerogu, FHYPRE_SSTRUCTSPLITSETNONZEROGU) (hypre_F90_Obj *); #define HYPRE_SStructSplitSetStructSolver \ hypre_F90_NAME(fhypre_sstructsplitsetstructsol, FHYPRE_SSTRUCTSPLITSETSTRUCTSOL) extern void hypre_F90_NAME(fhypre_sstructsplitsetstructsol, FHYPRE_SSTRUCTSPLITSETSTRUCTSOL) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_SStructSplitGetNumIterations \ hypre_F90_NAME(fhypre_sstructsplitgetnumiterat, FHYPRE_SSTRUCTSPLITGETNUMITERAT) extern void hypre_F90_NAME(fhypre_sstructsplitgetnumiterat, FHYPRE_SSTRUCTSPLITGETNUMITERAT) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_SStructSplitGetFinalRelativeResidualNorm \ hypre_F90_NAME(fhypre_sstructsplitgetfinalrela, FHYPRE_SSTRUCTSPLITGETFINALRELA) extern void hypre_F90_NAME(fhypre_sstructsplitgetfinalrela, FHYPRE_SSTRUCTSPLITGETFINALRELA) (hypre_F90_Obj *, HYPRE_Real *); #define HYPRE_SStructSysPFMGCreate \ hypre_F90_NAME(fhypre_sstructsyspfmgcreate, FHYPRE_SSTRUCTSYSPFMGCREATE) extern void hypre_F90_NAME(fhypre_sstructsyspfmgcreate, FHYPRE_SSTRUCTSYSPFMGCREATE) (hypre_F90_Obj *, hypre_F90_Obj *); #define HYPRE_SStructSysPFMGDestroy \ hypre_F90_NAME(fhypre_sstructsyspfmgdestroy, FHYPRE_SSTRUCTSYSPFMGDESTROY) extern void hypre_F90_NAME(fhypre_sstructsyspfmgdestroy, FHYPRE_SSTRUCTSYSPFMGDESTROY) (hypre_F90_Obj *); #define HYPRE_SStructSysPFMGSetup \ hypre_F90_NAME(fhypre_sstructsyspfmgsetup, FHYPRE_SSTRUCTSYSPFMGSETUP) extern void hypre_F90_NAME(fhypre_sstructsyspfmgsetup, FHYPRE_SSTRUCTSYSPFMGSETUP) (hypre_F90_Obj *, hypre_F90_Obj *, hypre_F90_Obj *, hypre_F90_Obj *); #define HYPRE_SStructSysPFMGSolve \ hypre_F90_NAME(fhypre_sstructsyspfmgsolve, FHYPRE_SSTRUCTSYSPFMGSOLVE) extern void hypre_F90_NAME(fhypre_sstructsyspfmgsolve, FHYPRE_SSTRUCTSYSPFMGSOLVE) (hypre_F90_Obj *, hypre_F90_Obj *, hypre_F90_Obj *, hypre_F90_Obj *); #define HYPRE_SStructSysPFMGSetTol \ hypre_F90_NAME(fhypre_sstructsyspfmgsettol, FHYPRE_SSTRUCTSYSPFMGSETTOL) extern void hypre_F90_NAME(fhypre_sstructsyspfmgsettol, FHYPRE_SSTRUCTSYSPFMGSETTOL) (hypre_F90_Obj *, HYPRE_Real *); #define HYPRE_SStructSysPFMGSetMaxIter \ hypre_F90_NAME(fhypre_sstructsyspfmgsetmaxiter, FHYPRE_SSTRUCTSYSPFMGSETMAXITER) extern void hypre_F90_NAME(fhypre_sstructsyspfmgsetmaxiter, FHYPRE_SSTRUCTSYSPFMGSETMAXITER) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_SStructSysPFMGSetRelChange \ hypre_F90_NAME(fhypre_sstructsyspfmgsetrelchan, FHYPRE_SSTRUCTSYSPFMGSETRELCHAN) extern void hypre_F90_NAME(fhypre_sstructsyspfmgsetrelchan, FHYPRE_SSTRUCTSYSPFMGSETRELCHAN) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_SStructSysPFMGSetZeroGuess \ hypre_F90_NAME(fhypre_sstructsyspfmgsetzerogue, FHYPRE_SSTRUCTSYSPFMGSETZEROGUE) extern void hypre_F90_NAME(fhypre_sstructsyspfmgsetzerogue, FHYPRE_SSTRUCTSYSPFMGSETZEROGUE) (hypre_F90_Obj *); #define HYPRE_SStructSysPFMGSetNonZeroGuess \ hypre_F90_NAME(fhypre_sstructsyspfmgsetnonzero, FHYPRE_SSTRUCTSYSPFMGSETNONZERO) extern void hypre_F90_NAME(fhypre_sstructsyspfmgsetnonzero, FHYPRE_SSTRUCTSYSPFMGSETNONZERO) (hypre_F90_Obj *); #define HYPRE_SStructSysPFMGSetRelaxType \ hypre_F90_NAME(fhypre_sstructsyspfmgsetrelaxty, FHYPRE_SSTRUCTSYSPFMGSETRELAXTY) extern void hypre_F90_NAME(fhypre_sstructsyspfmgsetrelaxty, FHYPRE_SSTRUCTSYSPFMGSETRELAXTY) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_SStructSysPFMGSetNumPreRelax \ hypre_F90_NAME(fhypre_sstructsyspfmgsetnumprer, FHYPRE_SSTRUCTSYSPFMGSETNUMPRER) extern void hypre_F90_NAME(fhypre_sstructsyspfmgsetnumprer, FHYPRE_SSTRUCTSYSPFMGSETNUMPRER) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_SStructSysPFMGSetNumPostRelax \ hypre_F90_NAME(fhypre_sstructsyspfmgsetnumpost, FHYPRE_SSTRUCTSYSPFMGSETNUMPOST) extern void hypre_F90_NAME(fhypre_sstructsyspfmgsetnumpost, FHYPRE_SSTRUCTSYSPFMGSETNUMPOST) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_SStructSysPFMGSetSkipRelax \ hypre_F90_NAME(fhypre_sstructsyspfmgsetskiprel, FHYPRE_SSTRUCTSYSPFMGSETSKIPREL) extern void hypre_F90_NAME(fhypre_sstructsyspfmgsetskiprel, FHYPRE_SSTRUCTSYSPFMGSETSKIPREL) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_SStructSysPFMGSetDxyz \ hypre_F90_NAME(fhypre_sstructsyspfmgsetdxyz, FHYPRE_SSTRUCTSYSPFMGSETDXYZ) extern void hypre_F90_NAME(fhypre_sstructsyspfmgsetdxyz, FHYPRE_SSTRUCTSYSPFMGSETDXYZ) (hypre_F90_Obj *, HYPRE_Real *); #define HYPRE_SStructSysPFMGSetLogging \ hypre_F90_NAME(fhypre_sstructsyspfmgsetlogging, FHYPRE_SSTRUCTSYSPFMGSETLOGGING) extern void hypre_F90_NAME(fhypre_sstructsyspfmgsetlogging, FHYPRE_SSTRUCTSYSPFMGSETLOGGING) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_SStructSysPFMGSetPrintLevel \ hypre_F90_NAME(fhypre_sstructsyspfmgsetprintle, FHYPRE_SSTRUCTSYSPFMGSETPRINTLE) extern void hypre_F90_NAME(fhypre_sstructsyspfmgsetprintle, FHYPRE_SSTRUCTSYSPFMGSETPRINTLE) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_SStructSysPFMGGetNumIterations \ hypre_F90_NAME(fhypre_sstructsyspfmggetnumiter, FHYPRE_SSTRUCTSYSPFMGGETNUMITER) extern void hypre_F90_NAME(fhypre_sstructsyspfmggetnumiter, FHYPRE_SSTRUCTSYSPFMGGETNUMITER) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_SStructSysPFMGGetFinalRelativeResidualNorm \ hypre_F90_NAME(fhypre_sstructsyspfmggetfinalre, FHYPRE_SSTRUCTSYSPFMGGETFINALRE) extern void hypre_F90_NAME(fhypre_sstructsyspfmggetfinalre, FHYPRE_SSTRUCTSYSPFMGGETFINALRE) (hypre_F90_Obj *, HYPRE_Real *); #define HYPRE_SStructMaxwellCreate \ hypre_F90_NAME(fhypre_sstructmaxwellcreate, FHYPRE_SSTRUCTMAXWELLCREATE) extern void hypre_F90_NAME(fhypre_sstructmaxwellcreate, FHYPRE_SSTRUCTMAXWELLCREATE) (hypre_F90_Obj *, hypre_F90_Obj *); #define HYPRE_SStructMaxwellDestroy \ hypre_F90_NAME(fhypre_sstructmaxwelldestroy, FHYPRE_SSTRUCTMAXWELLDESTROY) extern void hypre_F90_NAME(fhypre_sstructmaxwelldestroy, FHYPRE_SSTRUCTMAXWELLDESTROY) (hypre_F90_Obj *); #define HYPRE_SStructMaxwellSetup \ hypre_F90_NAME(fhypre_sstructmaxwellsetup, FHYPRE_SSTRUCTMAXWELLSETUP) extern void hypre_F90_NAME(fhypre_sstructmaxwellsetup, FHYPRE_SSTRUCTMAXWELLSETUP) (hypre_F90_Obj *, hypre_F90_Obj *, hypre_F90_Obj *, hypre_F90_Obj *); #define HYPRE_SStructMaxwellSolve \ hypre_F90_NAME(fhypre_sstructmaxwellsolve, FHYPRE_SSTRUCTMAXWELLSOLVE) extern void hypre_F90_NAME(fhypre_sstructmaxwellsolve, FHYPRE_SSTRUCTMAXWELLSOLVE) (hypre_F90_Obj *, hypre_F90_Obj *, hypre_F90_Obj *, hypre_F90_Obj *); #define HYPRE_SStructMaxwellSolve2 \ hypre_F90_NAME(fhypre_sstructmaxwellsolve2, FHYPRE_SSTRUCTMAXWELLSOLVE2) extern void hypre_F90_NAME(fhypre_sstructmaxwellsolve2, FHYPRE_SSTRUCTMAXWELLSOLVE2) (hypre_F90_Obj *, hypre_F90_Obj *, hypre_F90_Obj *, hypre_F90_Obj *); #define HYPRE_MaxwellGrad \ hypre_F90_NAME(fhypre_maxwellgrad, FHYPRE_MAXWELLGRAD) extern void hypre_F90_NAME(fhypre_maxwellgrad, FHYPRE_MAXWELLGRAD) (hypre_F90_Obj *, hypre_F90_Obj *); #define HYPRE_SStructMaxwellSetGrad \ hypre_F90_NAME(fhypre_sstructmaxwellsetgrad, FHYPRE_SSTRUCTMAXWELLSETGRAD) extern void hypre_F90_NAME(fhypre_sstructmaxwellsetgrad, FHYPRE_SSTRUCTMAXWELLSETGRAD) (hypre_F90_Obj *, hypre_F90_Obj *); #define HYPRE_SStructMaxwellSetRfactors \ hypre_F90_NAME(fhypre_sstructmaxwellsetrfactor, FHYPRE_SSTRUCTMAXWELLSETRFACTOR) extern void hypre_F90_NAME(fhypre_sstructmaxwellsetrfactor, FHYPRE_SSTRUCTMAXWELLSETRFACTOR) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_SStructMaxwellSetTol \ hypre_F90_NAME(fhypre_sstructmaxwellsettol, FHYPRE_SSTRUCTMAXWELLSETTOL) extern void hypre_F90_NAME(fhypre_sstructmaxwellsettol, FHYPRE_SSTRUCTMAXWELLSETTOL) (hypre_F90_Obj *, HYPRE_Real *); #define HYPRE_SStructMaxwellSetConstantCoef \ hypre_F90_NAME(fhypre_sstructmaxwellsetconstan, FHYPRE_SSTRUCTMAXWELLSETCONSTAN) extern void hypre_F90_NAME(fhypre_sstructmaxwellsetconstan, FHYPRE_SSTRUCTMAXWELLSETCONSTAN) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_SStructMaxwellSetMaxIter \ hypre_F90_NAME(fhypre_sstructmaxwellsetmaxiter, FHYPRE_SSTRUCTMAXWELLSETMAXITER) extern void hypre_F90_NAME(fhypre_sstructmaxwellsetmaxiter, FHYPRE_SSTRUCTMAXWELLSETMAXITER) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_SStructMaxwellSetRelChange \ hypre_F90_NAME(fhypre_sstructmaxwellsetrelchan, FHYPRE_SSTRUCTMAXWELLSETRELCHAN) extern void hypre_F90_NAME(fhypre_sstructmaxwellsetrelchan, FHYPRE_SSTRUCTMAXWELLSETRELCHAN) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_SStructMaxwellSetNumPreRelax \ hypre_F90_NAME(fhypre_sstructmaxwellsetnumprer, FHYPRE_SSTRUCTMAXWELLSETNUMPRER) extern void hypre_F90_NAME(fhypre_sstructmaxwellsetnumprer, FHYPRE_SSTRUCTMAXWELLSETNUMPRER) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_SStructMaxwellSetNumPostRelax \ hypre_F90_NAME(fhypre_sstructmaxwellsetnumpost, FHYPRE_SSTRUCTMAXWELLSETNUMPOST) extern void hypre_F90_NAME(fhypre_sstructmaxwellsetnumpost, FHYPRE_SSTRUCTMAXWELLSETNUMPOST) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_SStructMaxwellSetLogging \ hypre_F90_NAME(fhypre_sstructmaxwellsetlogging, FHYPRE_SSTRUCTMAXWELLSETLOGGING) extern void hypre_F90_NAME(fhypre_sstructmaxwellsetlogging, FHYPRE_SSTRUCTMAXWELLSETLOGGING) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_SStructMaxwellSetPrintLevel \ hypre_F90_NAME(fhypre_sstructmaxwellsetprintle, FHYPRE_SSTRUCTMAXWELLSETPRINTLE) extern void hypre_F90_NAME(fhypre_sstructmaxwellsetprintle, FHYPRE_SSTRUCTMAXWELLSETPRINTLE) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_SStructMaxwellPrintLogging \ hypre_F90_NAME(fhypre_sstructmaxwellprintloggi, FHYPRE_SSTRUCTMAXWELLPRINTLOGGI) extern void hypre_F90_NAME(fhypre_sstructmaxwellprintloggi, FHYPRE_SSTRUCTMAXWELLPRINTLOGGI) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_SStructMaxwellGetNumIterations \ hypre_F90_NAME(fhypre_sstructmaxwellgetnumiter, FHYPRE_SSTRUCTMAXWELLGETNUMITER) extern void hypre_F90_NAME(fhypre_sstructmaxwellgetnumiter, FHYPRE_SSTRUCTMAXWELLGETNUMITER) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_SStructMaxwellGetFinalRelativeResidualNorm \ hypre_F90_NAME(fhypre_sstructmaxwellgetfinalre, FHYPRE_SSTRUCTMAXWELLGETFINALRE) extern void hypre_F90_NAME(fhypre_sstructmaxwellgetfinalre, FHYPRE_SSTRUCTMAXWELLGETFINALRE) (hypre_F90_Obj *, HYPRE_Real *); #define HYPRE_SStructMaxwellPhysBdy \ hypre_F90_NAME(fhypre_sstructmaxwellphysbdy, FHYPRE_SSTRUCTMAXWELLPHYSBDY) extern void hypre_F90_NAME(fhypre_sstructmaxwellphysbdy, FHYPRE_SSTRUCTMAXWELLPHYSBDY) (hypre_F90_Obj *, HYPRE_Int *, HYPRE_Int *, HYPRE_Int *, HYPRE_Int *); #define HYPRE_SStructMaxwellEliminateRowsCols \ hypre_F90_NAME(fhypre_sstructmaxwelleliminater, FHYPRE_SSTRUCTMAXWELLELIMINATER) extern void hypre_F90_NAME(fhypre_sstructmaxwelleliminater, FHYPRE_SSTRUCTMAXWELLELIMINATER) (hypre_F90_Obj *, HYPRE_Int *, HYPRE_Int *); #define HYPRE_SStructMaxwellZeroVector \ hypre_F90_NAME(fhypre_sstructmaxwellzerovector, FHYPRE_SSTRUCTMAXWELLZEROVECTOR) extern void hypre_F90_NAME(fhypre_sstructmaxwellzerovector, FHYPRE_SSTRUCTMAXWELLZEROVECTOR) (hypre_F90_Obj *, HYPRE_Int *, HYPRE_Int *); #ifdef __cplusplus } #endif hypre-2.33.0/src/test/hypre_struct_fortran_test.h000066400000000000000000001375421477326011500222140ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #ifdef __cplusplus extern "C" { #endif /************************************************** * Definitions of struct fortran interface routines **************************************************/ #define HYPRE_StructStencilCreate \ hypre_F90_NAME(fhypre_structstencilcreate, FHYPRE_STRUCTSTENCILCREATE) extern void hypre_F90_NAME(fhypre_structstencilcreate, FHYPRE_STRUCTSTENCILCREATE) (HYPRE_Int *, HYPRE_Int *, hypre_F90_Obj *); #define HYPRE_StructStencilDestroy \ hypre_F90_NAME(fhypre_structstencildestroy, FHYPRE_STRUCTSTENCILDESTROY) extern void hypre_F90_NAME(fhypre_structstencildestroy, FHYPRE_STRUCTSTENCILDESTROY) (hypre_F90_Obj *); #define HYPRE_StructStencilSetElement \ hypre_F90_NAME(fhypre_structstencilsetelement, FHYPRE_STRUCTSTENCILSETELEMENT) extern void hypre_F90_NAME(fhypre_structstencilsetelement, FHYPRE_STRUCTSTENCILSETELEMENT) (hypre_F90_Obj *, HYPRE_Int *, HYPRE_Int *); #define HYPRE_StructGridCreate \ hypre_F90_NAME(fhypre_structgridcreate, FHYPRE_STRUCTGRIDCREATE) extern void hypre_F90_NAME(fhypre_structgridcreate, FHYPRE_STRUCTGRIDCREATE) (HYPRE_Int *, HYPRE_Int *, hypre_F90_Obj *); #define HYPRE_StructGridDestroy \ hypre_F90_NAME(fhypre_structgriddestroy, FHYPRE_STRUCTGRIDDESTROY) extern void hypre_F90_NAME(fhypre_structgriddestroy, FHYPRE_STRUCTGRIDDESTROY) (hypre_F90_Obj *); #define HYPRE_StructGridSetExtents \ hypre_F90_NAME(fhypre_structgridsetextents, FHYPRE_STRUCTGRIDSETEXTENTS) extern void hypre_F90_NAME(fhypre_structgridsetextents, FHYPRE_STRUCTGRIDSETEXTENTS) (hypre_F90_Obj *, HYPRE_Int *, HYPRE_Int *); #define HYPRE_StructGridSetPeriodic \ hypre_F90_NAME(fhypre_structgridsetperiodic, FHYPRE_STRUCTGRIDSETPERIODIC) extern void hypre_F90_NAME(fhypre_structgridsetperiodic, fhypre_structsetgridperiodic) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_StructGridAssemble \ hypre_F90_NAME(fhypre_structgridassemble, FHYPRE_STRUCTGRIDASSEMBLE) extern void hypre_F90_NAME(fhypre_structgridassemble, FHYPRE_STRUCTGRIDASSEMBLE) (hypre_F90_Obj *); #define HYPRE_StructGridSetNumGhost \ hypre_F90_NAME(fhypre_structgridsetnumghost, FHYPRE_STRUCTGRIDSETNUMGHOST) extern void hypre_F90_NAME(fhypre_structgridsetnumghost, fhypre_structsetgridnumghost) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_StructMatrixCreate \ hypre_F90_NAME(fhypre_structmatrixcreate, FHYPRE_STRUCTMATRIXCREATE) extern void hypre_F90_NAME(fhypre_structmatrixcreate, FHYPRE_STRUCTMATRIXCREATE) (HYPRE_Int *, hypre_F90_Obj *, hypre_F90_Obj *, hypre_F90_Obj *); #define HYPRE_StructMatrixDestroy \ hypre_F90_NAME(fhypre_structmatrixdestroy, FHYPRE_STRUCTMATRIXDESTROY) extern void hypre_F90_NAME(fhypre_structmatrixdestroy, FHYPRE_STRUCTMATRIXDESTROY) (hypre_F90_Obj *); #define HYPRE_StructMatrixInitialize \ hypre_F90_NAME(fhypre_structmatrixinitialize, FHYPRE_STRUCTMATRIXINITIALIZE) extern void hypre_F90_NAME(fhypre_structmatrixinitialize, FHYPRE_STRUCTMATRIXINITIALIZE) (hypre_F90_Obj *); #define HYPRE_StructMatrixSetValues \ hypre_F90_NAME(fhypre_structmatrixsetvalues, FHYPRE_STRUCTMATRIXSETVALUES) extern void hypre_F90_NAME(fhypre_structmatrixsetvalues, FHYPRE_STRUCTMATRIXSETVALUES) (hypre_F90_Obj *, HYPRE_Int *, HYPRE_Int *); #define HYPRE_StructMatrixSetBoxValues \ hypre_F90_NAME(fhypre_structmatrixsetboxvalues, FHYPRE_STRUCTMATRIXSETBOXVALUES) extern void hypre_F90_NAME(fhypre_structmatrixsetboxvalues, FHYPRE_STRUCTMATRIXSETBOXVALUES) (hypre_F90_Obj *, HYPRE_Int *, HYPRE_Int *, HYPRE_Int *, HYPRE_Int *, HYPRE_Real *); #define HYPRE_StructMatrixGetBoxValues \ hypre_F90_NAME(fhypre_structmatrixgetboxvalues, FHYPRE_STRUCTMATRIXGETBOXVALUES) extern void hypre_F90_NAME(fhypre_structmatrixgetboxvalues, FHYPRE_STRUCTMATRIXGETBOXVALUES) (hypre_F90_Obj *, HYPRE_Int *, HYPRE_Int *, HYPRE_Int *, HYPRE_Int *, HYPRE_Real *); #define HYPRE_StructMatrixSetConstantEntries \ hypre_F90_NAME(fhypre_structmatrixsetconstante, FHYPRE_STRUCTMATRIXSETCONSTANTE) extern void hypre_F90_NAME(fhypre_structmatrixsetconstante, FHYPRE_STRUCTMATRIXSETCONSTANTE) (hypre_F90_Obj *, HYPRE_Int *, HYPRE_Int *); #define HYPRE_StructMatrixSetConstantValues \ hypre_F90_NAME(fhypre_structmatrixsetconstantv, FHYPRE_STRUCTMATRIXSETCONSTANTV) extern void hypre_F90_NAME(fhypre_structmatrixsetconstantv, FHYPRE_STRUCTMATRIXSETCONSTANTV) (hypre_F90_Obj *, HYPRE_Int *, HYPRE_Int *, HYPRE_Real *); #define HYPRE_StructMatrixAddToValues \ hypre_F90_NAME(fhypre_structmatrixaddtovalues, FHYPRE_STRUCTMATRIXADDTOVALUES) extern void hypre_F90_NAME(fhypre_structmatrixaddtovalues, FHYPRE_STRUCTMATRIXADDTOVALUES) (hypre_F90_Obj *, HYPRE_Int *, HYPRE_Int *, HYPRE_Int *, HYPRE_Real *); #define HYPRE_StructMatrixAddToBoxValues \ hypre_F90_NAME(fhypre_structmatrixaddtoboxvalues, FHYPRE_STRUCTMATRIXADDTOBOXVALUES) extern void hypre_F90_NAME(fhypre_structmatrixaddtoboxvalues, FHYPRE_STRUCTMATRIXADDTOBOXVALUES) (hypre_F90_Obj *, HYPRE_Int *, HYPRE_Int *, HYPRE_Int *, HYPRE_Int *, HYPRE_Real *); #define HYPRE_StructMatrixAddToConstantValues \ hypre_F90_NAME(fhypre_structmatrixaddtoconstant, FHYPRE_STRUCTMATRIXADDTOCONSTANT) extern void hypre_F90_NAME(fhypre_structmatrixaddtoconstant, FHYPRE_STRUCTMATRIXADDTOCONSTANT) (hypre_F90_Obj *, HYPRE_Int *, HYPRE_Int *, HYPRE_Real *); #define HYPRE_StructMatrixAssemble \ hypre_F90_NAME(fhypre_structmatrixassemble, FHYPRE_STRUCTMATRIXASSEMBLE) extern void hypre_F90_NAME(fhypre_structmatrixassemble, FHYPRE_STRUCTMATRIXASSEMBLE) (hypre_F90_Obj *); #define HYPRE_StructMatrixSetNumGhost \ hypre_F90_NAME(fhypre_structmatrixsetnumghost, FHYPRE_STRUCTMATRIXSETNUMGHOST) extern void hypre_F90_NAME(fhypre_structmatrixsetnumghost, FHYPRE_STRUCTMATRIXSETNUMGHOST) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_StructMatrixGetGrid \ hypre_F90_NAME(fhypre_structmatrixgetgrid, FHYPRE_STRUCTMATRIXGETGRID) extern void hypre_F90_NAME(fhypre_structmatrixgetgrid, FHYPRE_STRUCTMATRIXGETGRID) (hypre_F90_Obj *, hypre_F90_Obj *); #define HYPRE_StructMatrixSetSymmetric \ hypre_F90_NAME(fhypre_structmatrixsetsymmetric, FHYPRE_STRUCTMATRIXSETSYMMETRIC) extern void hypre_F90_NAME(fhypre_structmatrixsetsymmetric, FHYPRE_STRUCTMATRIXSETSYMMETRIC) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_StructMatrixPrint \ hypre_F90_NAME(fhypre_structmatrixprint, FHYPRE_STRUCTMATRIXPRINT) extern void hypre_F90_NAME(fhypre_structmatrixprint, FHYPRE_STRUCTMATRIXPRINT) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_StructMatrixMatvec \ hypre_F90_NAME(fhypre_structmatrixmatvec, FHYPRE_STRUCTMATRIXMATVEC) extern void hypre_F90_NAME(fhypre_structmatrixmatvec, FHYPRE_STRUCTMATRIXMATVEC) (HYPRE_Int *, hypre_F90_Obj *, hypre_F90_Obj *, HYPRE_Int *, hypre_F90_Obj *); #define HYPRE_StructVectorCreate \ hypre_F90_NAME(fhypre_structvectorcreate, FHYPRE_STRUCTVECTORCREATE) extern void hypre_F90_NAME(fhypre_structvectorcreate, FHYPRE_STRUCTVECTORCREATE) (HYPRE_Int *, hypre_F90_Obj *, hypre_F90_Obj *); #define HYPRE_StructVectorDestroy \ hypre_F90_NAME(fhypre_structvectordestroy, FHYPRE_STRUCTVECTORDESTROY) extern void hypre_F90_NAME(fhypre_structvectordestroy, FHYPRE_STRUCTVECTORDESTROY) (hypre_F90_Obj *); #define HYPRE_StructVectorInitialize \ hypre_F90_NAME(fhypre_structvectorinitialize, FHYPRE_STRUCTVECTORINITIALIZE) extern void hypre_F90_NAME(fhypre_structvectorinitialize, FHYPRE_STRUCTVECTORINITIALIZE) (hypre_F90_Obj *); #define HYPRE_StructVectorSetValues \ hypre_F90_NAME(fhypre_structvectorsetvalues, FHYPRE_STRUCTVECTORSETVALUES) extern void hypre_F90_NAME(fhypre_structvectorsetvalues, FHYPRE_STRUCTVECTORSETVALUES) (hypre_F90_Obj *, HYPRE_Int *, HYPRE_Int *); #define HYPRE_StructVectorSetBoxValues \ hypre_F90_NAME(fhypre_structvectorsetboxvalues, FHYPRE_STRUCTVECTORSETBOXVALUES) extern void hypre_F90_NAME(fhypre_structvectorsetboxvalues, FHYPRE_STRUCTVECTORSETBOXVALUES) (hypre_F90_Obj *, HYPRE_Int *, HYPRE_Int *, HYPRE_Real *); #define HYPRE_StructVectorSetConstantValues \ hypre_F90_NAME(fhypre_structvectorsetconstantv, FHYPRE_STRUCTVECTORSETCONTANTV) extern void hypre_F90_NAME(fhypre_structvectorsetconstantv, FHYPRE_STRUCTVECTORSETCONTANTV) (hypre_F90_Obj *, HYPRE_Real *); #define HYPRE_StructVectorAddToValues \ hypre_F90_NAME(fhypre_structvectoraddtovalues, FHYPRE_STRUCTVECTORADDTOVALUES) extern void hypre_F90_NAME(fhypre_structvectoraddtovalues, FHYPRE_STRUCTVECTORADDTOVALUES) (hypre_F90_Obj *, HYPRE_Int *, HYPRE_Real *); #define HYPRE_StructVectorAddToBoxValues \ hypre_F90_NAME(fhypre_structvectoraddtoboxvalu, FHYPRE_STRUCTVECTORADDTOBOXVALU) extern void hypre_F90_NAME(fhypre_structvectoraddtoboxvalu, FHYPRE_STRUCTVECTORADDTOBOXVALU) (hypre_F90_Obj *, HYPRE_Int *, HYPRE_Int *, HYPRE_Real *); #define HYPRE_StructVectorScaleValues \ hypre_F90_NAME(fhypre_structvectorscalevalues, FHYPRE_STRUCTVECTORSCALEVALUES) extern void hypre_F90_NAME(fhypre_structvectorscalevalues, FHYPRE_STRUCTVECTORSCALEVALUES) (hypre_F90_Obj *, HYPRE_Real *); #define HYPRE_StructVectorGetValues \ hypre_F90_NAME(fhypre_structvectorgetvalues, FHYPRE_STRUCTVECTORGETVALUES) extern void hypre_F90_NAME(fhypre_structvectorgetvalues, FHYPRE_STRUCTVECTORGETVALUES) (hypre_F90_Obj *, HYPRE_Int *, HYPRE_Real *); #define HYPRE_StructVectorGetBoxValues \ hypre_F90_NAME(fhypre_structvectorgetboxvalues, FHYPRE_STRUCTVECTORGETBOXVALUES) extern void hypre_F90_NAME(fhypre_structvectorgetboxvalues, FHYPRE_STRUCTVECTORGETBOXVALUES) (hypre_F90_Obj *, HYPRE_Int *, HYPRE_Real *); #define HYPRE_StructVectorAssemble \ hypre_F90_NAME(fhypre_structvectorassemble, FHYPRE_STRUCTVECTORASSEMBLE) extern void hypre_F90_NAME(fhypre_structvectorassemble, FHYPRE_STRUCTVECTORASSEMBLE) (hypre_F90_Obj *); #define HYPRE_StructVectorSetNumGhost \ hypre_F90_NAME(fhypre_structvectorsetnumghost, FHYPRE_STRUCTVECTORSETNUMGHOST) extern void hypre_F90_NAME(fhypre_structvectorsetnumghost, FHYPRE_STRUCTVECTORSETNUMGHOST) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_StructVectorCopy \ hypre_F90_NAME(fhypre_structvectorcopy, FHYPRE_STRUCTVECTORCOPY) extern void hypre_F90_NAME(fhypre_structvectorcopy, FHYPRE_STRUCTVECTORCOPY) (hypre_F90_Obj *, hypre_F90_Obj *); #define HYPRE_StructVectorGetMigrateCommPkg \ hypre_F90_NAME(fhypre_structvectorgetmigrateco, FHYPRE_STRUCTVECTORGETMIGRATECO) extern void hypre_F90_NAME(fhypre_structvectorgetmigrateco, FHYPRE_STRUCTVECTORGETMIGRATECO) (hypre_F90_Obj *, hypre_F90_Obj *, hypre_F90_Obj *); #define HYPRE_StructVectorMigrate \ hypre_F90_NAME(fhypre_structvectormigrate, FHYPRE_STRUCTVECTORMIGRATE) extern void hypre_F90_NAME(fhypre_structvectormigrate, FHYPRE_STRUCTVECTORMIGRATE) (hypre_F90_Obj *, hypre_F90_Obj *, hypre_F90_Obj *); #define HYPRE_CommPkgDestroy \ hypre_F90_NAME(fhypre_commpkgdestroy, FHYPRE_COMMPKGDESTROY) extern void hypre_F90_NAME(fhypre_commpkgdestroy, FHYPRE_COMMPKGDESTROY) (hypre_F90_Obj *); #define HYPRE_StructVectorPrint \ hypre_F90_NAME(fhypre_structvectorprint, FHYPRE_STRUCTVECTORPRINT) extern void hypre_F90_NAME(fhypre_structvectorprint, FHYPRE_STRUCTVECTORPRINT) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_StructBiCGSTABCreate \ hypre_F90_NAME(fhypre_structbicgstabcreate, FHYPRE_STRUCTBICGSTABCREATE) extern void hypre_F90_NAME(fhypre_structbicgstabcreate, FHYPRE_STRUCTBICGSTABCREATE) (HYPRE_Int *, hypre_F90_Obj *); #define HYPRE_StructBiCGSTABDestroy \ hypre_F90_NAME(fhypre_structbicgstabdestroy, FHYPRE_STRUCTBICGSTABDESTROY) extern void hypre_F90_NAME(fhypre_structbicgstabdestroy, FHYPRE_STRUCTBICGSTABDESTROY) (hypre_F90_Obj *); #define HYPRE_StructBiCGSTABSetup \ hypre_F90_NAME(fhypre_structbicgstabsetup, FHYPRE_STRUCTBICGSTABSETUP) extern void hypre_F90_NAME(fhypre_structbicgstabsetup, FHYPRE_STRUCTBICGSTABSETUP) (hypre_F90_Obj *, hypre_F90_Obj *, hypre_F90_Obj *, hypre_F90_Obj *); #define HYPRE_StructBiCGSTABSolve \ hypre_F90_NAME(fhypre_structbicgstabsolve, FHYPRE_STRUCTBICGSTABSOLVE) extern void hypre_F90_NAME(fhypre_structbicgstabsolve, FHYPRE_STRUCTBICGSTABSOLVE) (hypre_F90_Obj *, hypre_F90_Obj *, hypre_F90_Obj *, hypre_F90_Obj *); #define HYPRE_StructBiCGSTABSetTol \ hypre_F90_NAME(fhypre_structbicgstabsettol, FHYPRE_STRUCTBICGSTABSETTOL) extern void hypre_F90_NAME(fhypre_structbicgstabsettol, FHYPRE_STRUCTBICGSTABSETTOL) (hypre_F90_Obj *, HYPRE_Real *); #define HYPRE_StructBiCGSTABSetMaxIter \ hypre_F90_NAME(fhypre_structbicgstabsetmaxiter, FHYPRE_STRUCTBICGSTABSETMAXITER) extern void hypre_F90_NAME(fhypre_structbicgstabsetmaxiter, FHYPRE_STRUCTBICGSTABSETMAXITER) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_StructBiCGSTABSetPrecond \ hypre_F90_NAME(fhypre_structbicgstabsetprecond, FHYPRE_STRUCTBICGSTABSETPRECOND) extern void hypre_F90_NAME(fhypre_structbicgstabsetprecond, FHYPRE_STRUCTBICGSTABSETPRECOND) (hypre_F90_Obj *, HYPRE_Int *, hypre_F90_Obj *); #define HYPRE_StructBiCGSTABSetLogging \ hypre_F90_NAME(fhypre_structbicgstabsetlogging, FHYPRE_STRUCTBICGSTABSETLOGGING) extern void hypre_F90_NAME(fhypre_structbicgstabsetlogging, FHYPRE_STRUCTBICGSTABSETLOGGING) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_StructBiCGSTABSetPrintLevel \ hypre_F90_NAME(fhypre_structbicgstabsetprintle, FHYPRE_STRUCTBICGSTABPRINTLE) extern void hypre_F90_NAME(fhypre_structbicgstabsetprintle, FHYPRE_STRUCTBICGSTABPRINTLE) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_StructBiCGSTABGetNumIterations \ hypre_F90_NAME(fhypre_structbicgstabgetnumiter, FHYPRE_STRUCTBICGSTABGETNUMITER) extern void hypre_F90_NAME(fhypre_structbicgstabgetnumiter, FHYPRE_STRUCTBICGSTABGETNUMITER) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_StructBiCGSTABGetResidual \ hypre_F90_NAME(fhypre_structbicgstabgetresidua, FHYPRE_STRUCTBICGSTABGETRESIDUA) extern void hypre_F90_NAME(fhypre_structbicgstabgetresidua, FHYPRE_STRUCTBICGSTABGETRESIDUA) (hypre_F90_Obj *, HYPRE_Real *); #define HYPRE_StructBiCGSTABGetFinalRelativeResidualNorm \ hypre_F90_NAME(fhypre_structbicgstabgetfinalre, FHYPRE_STRUCTBICGSTABGETFINALRE) extern void hypre_F90_NAME(fhypre_structbicgstabgetfinalre, FHYPRE_STRUCTBICGSTABGETFINALRE) (hypre_F90_Obj *, HYPRE_Real *); #define HYPRE_StructGMRESCreate \ hypre_F90_NAME(fhypre_structgmrescreate, FHYPRE_STRUCTGMRESCREATE) extern void hypre_F90_NAME(fhypre_structgmrescreate, FHYPRE_STRUCTGMRESCREATE) (HYPRE_Int *, hypre_F90_Obj *); #define HYPRE_StructGMRESDestroy \ hypre_F90_NAME(fhypre_structgmresdestroy, FHYPRE_STRUCTGMRESDESTROY) extern void hypre_F90_NAME(fhypre_structgmresdestroy, FHYPRE_STRUCTGMRESDESTROY) (hypre_F90_Obj *); #define HYPRE_StructGMRESSetup \ hypre_F90_NAME(fhypre_structgmressetup, FHYPRE_STRUCTGMRESSETUP) extern void hypre_F90_NAME(fhypre_structgmressetup, FHYPRE_STRUCTGMRESSETUP) (hypre_F90_Obj *, hypre_F90_Obj *, hypre_F90_Obj *, hypre_F90_Obj *); #define HYPRE_StructGMRESSolve \ hypre_F90_NAME(fhypre_structgmressolve, FHYPRE_STRUCTGMRESSOLVE) extern void hypre_F90_NAME(fhypre_structgmressolve, FHYPRE_STRUCTGMRESSOLVE) (hypre_F90_Obj *, hypre_F90_Obj *, hypre_F90_Obj *, hypre_F90_Obj *); #define HYPRE_StructGMRESSetTol \ hypre_F90_NAME(fhypre_structgmressettol, FHYPRE_STRUCTGMRESSETTOL) extern void hypre_F90_NAME(fhypre_structgmressettol, FHYPRE_STRUCTGMRESSETTOL) (hypre_F90_Obj *, HYPRE_Real *); #define HYPRE_StructGMRESSetMaxIter \ hypre_F90_NAME(fhypre_structgmressetmaxiter, FHYPRE_STRUCTGMRESSETMAXITER) extern void hypre_F90_NAME(fhypre_structgmressetmaxiter, FHYPRE_STRUCTGMRESSETMAXITER) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_StructGMRESSetPrecond \ hypre_F90_NAME(fhypre_structgmressetprecond, FHYPRE_STRUCTGMRESSETPRECOND) extern void hypre_F90_NAME(fhypre_structgmressetprecond, FHYPRE_STRUCTGMRESSETPRECOND) (hypre_F90_Obj *, HYPRE_Int *, hypre_F90_Obj *); #define HYPRE_StructGMRESSetLogging \ hypre_F90_NAME(fhypre_structgmressetlogging, FHYPRE_STRUCTGMRESSETLOGGING) extern void hypre_F90_NAME(fhypre_structgmressetlogging, FHYPRE_STRUCTGMRESSETLOGGING) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_StructGMRESSetPrintLevel \ hypre_F90_NAME(fhypre_structgmressetprintlevel, FHYPRE_STRUCTGMRESPRINTLEVEL) extern void hypre_F90_NAME(fhypre_structgmressetprintlevel, FHYPRE_STRUCTGMRESPRINTLEVEL) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_StructGMRESGetNumIterations \ hypre_F90_NAME(fhypre_structgmresgetnumiterati, FHYPRE_STRUCTGMRESGETNUMITERATI) extern void hypre_F90_NAME(fhypre_structgmresgetnumiterati, FHYPRE_STRUCTGMRESGETNUMITERATI) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_StructGMRESGetFinalRelativeResidualNorm \ hypre_F90_NAME(fhypre_structgmresgetfinalrelat, FHYPRE_STRUCTGMRESGETFINALRELAT) extern void hypre_F90_NAME(fhypre_structgmresgetfinalrelat, FHYPRE_STRUCTGMRESGETFINALRELAT) (hypre_F90_Obj *, HYPRE_Real *); #define HYPRE_StructHybridCreate \ hypre_F90_NAME(fhypre_structhybridcreate, FHYPRE_STRUCTHYBRIDCREATE) extern void hypre_F90_NAME(fhypre_structhybridcreate, FHYPRE_STRUCTHYBRIDCREATE) (HYPRE_Int *, hypre_F90_Obj *); #define HYPRE_StructHybridDestroy \ hypre_F90_NAME(fhypre_structhybriddestroy, FHYPRE_STRUCTHYBRIDDESTROY) extern void hypre_F90_NAME(fhypre_structhybriddestroy, FHYPRE_STRUCTHYBRIDDESTROY) (hypre_F90_Obj *); #define HYPRE_StructHybridSetup \ hypre_F90_NAME(fhypre_structhybridsetup, FHYPRE_STRUCTHYBRIDSETUP) extern void hypre_F90_NAME(fhypre_structhybridsetup, FHYPRE_STRUCTHYBRIDSETUP) (hypre_F90_Obj *, hypre_F90_Obj *, hypre_F90_Obj *, hypre_F90_Obj *); #define HYPRE_StructHybridSolve \ hypre_F90_NAME(fhypre_structhybridsolve, FHYPRE_STRUCTHYBRIDSOLVE) extern void hypre_F90_NAME(fhypre_structhybridsolve, FHYPRE_STRUCTHYBRIDSOLVE) (hypre_F90_Obj *, hypre_F90_Obj *, hypre_F90_Obj *, hypre_F90_Obj *); #define HYPRE_StructHybridSetSolverType \ hypre_F90_NAME(fhypre_structhybridsetsolvertyp, FHYPRE_STRUCTHYBRIDSETSOLVERTYP) extern void hypre_F90_NAME(fhypre_structhybridsetsolvertyp, FHYPRE_STRUCTHYBRIDSETSOLVERTYP) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_StructHybridSetStopCrit \ hypre_F90_NAME(fhypre_structhybridsetstopcrit, FHYPRE_STRUCTHYBRIDSETSTOPCRIT) extern void hypre_F90_NAME(fhypre_structhybridsetstopcrit, FHYPRE_STRUCTHYBRIDSETSTOPCRIT) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_StructHybridSetKDim \ hypre_F90_NAME(fhypre_structhybridsetkdim, FHYPRE_STRUCTHYBRIDSETKDIM) extern void hypre_F90_NAME(fhypre_structhybridsetkdim, FHYPRE_STRUCTHYBRIDSETKDIM) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_StructHybridSetTol \ hypre_F90_NAME(fhypre_structhybridsettol, FHYPRE_STRUCTHYBRIDSETTOL) extern void hypre_F90_NAME(fhypre_structhybridsettol, FHYPRE_STRUCTHYBRIDSETTOL) (hypre_F90_Obj *, HYPRE_Real *); #define HYPRE_StructHybridSetConvergenceTol \ hypre_F90_NAME(fhypre_structhybridsetconvergen, FHYPRE_STRUCTHYBRIDSETCONVERGEN) extern void hypre_F90_NAME(fhypre_structhybridsetconvergen, FHYPRE_STRUCTHYBRIDSETCONVERGEN) (hypre_F90_Obj *, HYPRE_Real *); #define HYPRE_StructHybridSetPCGAbsoluteTolFactor \ hypre_F90_NAME(fhypre_structhybridsetpcgabsolu, FHYPRE_STRUCTHYBRIDSETABSOLU) extern void hypre_F90_NAME(fhypre_structhybridsetpcgabsolu, FHYPRE_STRUCTHYBRIDSETABSOLU) (hypre_F90_Obj *, HYPRE_Real *); #define HYPRE_StructHybridSetMaxIter \ hypre_F90_NAME(fhypre_structhybridsetmaxiter, FHYPRE_STRUCTHYBRIDSETMAXITER) extern void hypre_F90_NAME(fhypre_structhybridsetmaxiter, FHYPRE_STRUCTHYBRIDSETMAXITER) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_StructHybridSetDSCGMaxIter \ hypre_F90_NAME(fhypre_structhybridsetdscgmaxit, FHYPRE_STRUCTHYBRIDSETDSCGMAXIT) extern void hypre_F90_NAME(fhypre_structhybridsetdscgmaxit, FHYPRE_STRUCTHYBRIDSETDSCGMAXIT) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_StructHybridSetPCGMaxIter \ hypre_F90_NAME(fhypre_structhybridsetpcgmaxite, FHYPRE_STRUCTHYBRIDSETPCGMAXITE) extern void hypre_F90_NAME(fhypre_structhybridsetpcgmaxite, FHYPRE_STRUCTHYBRIDSETPCGMAXITE) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_StructHybridSetTwoNorm \ hypre_F90_NAME(fhypre_structhybridsettwonorm, FHYPRE_STRUCTHYBRIDSETTWONORM) extern void hypre_F90_NAME(fhypre_structhybridsettwonorm, FHYPRE_STRUCTHYBRIDSETTWONORM) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_StructHybridSetRelChange \ hypre_F90_NAME(fhypre_structhybridsetrelchange, FHYPRE_STRUCTHYBRIDSETRELCHANGE) extern void hypre_F90_NAME(fhypre_structhybridsetrelchange, FHYPRE_STRUCTHYBRIDSETRELCHANGE) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_StructHybridSetPrecond \ hypre_F90_NAME(fhypre_structhybridsetprecond, FHYPRE_STRUCTHYBRIDSETPRECOND) extern void hypre_F90_NAME(fhypre_structhybridsetprecond, FHYPRE_STRUCTHYBRIDSETPRECOND) (hypre_F90_Obj *, HYPRE_Int *, hypre_F90_Obj *); #define HYPRE_StructHybridSetLogging \ hypre_F90_NAME(fhypre_structhybridsetlogging, FHYPRE_STRUCTHYBRIDSETLOGGING) extern void hypre_F90_NAME(fhypre_structhybridsetlogging, FHYPRE_STRUCTHYBRIDSETLOGGING) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_StructHybridSetPrintLevel \ hypre_F90_NAME(fhypre_structhybridsetprintleve, FHYPRE_STRUCTHYBRIDSETPRINTLEVE) extern void hypre_F90_NAME(fhypre_structhybridsetprintleve, FHYPRE_STRUCTHYBRIDSETPRINTLEVE) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_StructHybridGetNumIterations \ hypre_F90_NAME(fhypre_structhybridgetnumiterat, FHYPRE_STRUCTHYBRIDGETNUMITERAT) extern void hypre_F90_NAME(fhypre_structhybridgetnumiterat, FHYPRE_STRUCTHYBRIDGETNUMITERAT) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_StructHybridGetDSCGNumIterations \ hypre_F90_NAME(fhypre_structhybridgetdscgnumit, FHYPRE_STRUCTHYBRIDGETDSCGNUMIT) extern void hypre_F90_NAME(fhypre_structhybridgetdscgnumit, FHYPRE_STRUCTHYBRIDGETDSCGNUMIT) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_StructHybridGetPCGNumIterations \ hypre_F90_NAME(fhypre_structhybridgetpcgnumite, FHYPRE_STRUCTHYBRIDGETPCGNUMITE) extern void hypre_F90_NAME(fhypre_structhybridgetpcgnumite, FHYPRE_STRUCTHYBRIDGETPCGNUMITE) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_StructHybridGetFinalRelativeResidualNorm \ hypre_F90_NAME(fhypre_structhybridgetfinalrela, FHYPRE_STRUCTHYBRIDGETFINALRELA) extern void hypre_F90_NAME(fhypre_structhybridgetfinalrela, FHYPRE_STRUCTHYBRIDGETFINALRELA) (hypre_F90_Obj *, HYPRE_Real *); #define HYPRE_StructVectorSetRandomValues \ hypre_F90_NAME(fhypre_structvectorsetrandomvalu, FHYPRE_STRUCTVECTORSETRANDOMVALU) extern void hypre_F90_NAME(fhypre_structvectorsetrandomvalu, FHYPRE_STRUCTVECTORSETRANDOMVALU) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_StructSetRandomValues \ hypre_F90_NAME(fhypre_structsetrandomvalues, FHYPRE_STRUCTSETRANDOMVALUES) extern void hypre_F90_NAME(fhypre_structsetrandomvalues, FHYPRE_STRUCTSETRANDOMVALUES) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_StructSetupInterpreter \ hypre_F90_NAME(fhypre_structsetupinterpreter, FHYPRE_STRUCTSETUPINTERPRETER) extern void hypre_F90_NAME(fhypre_structsetupinterpreter, FHYPRE_STRUCTSETUPINTERPRETER) (hypre_F90_Obj *); #define HYPRE_StructSetupMatvec \ hypre_F90_NAME(fhypre_structsetupmatvec, FHYPRE_STRUCTSETUPMATVEC) extern void hypre_F90_NAME(fhypre_structsetupmatvec, FHYPRE_STRUCTSETUPMATVEC) (hypre_F90_Obj *); #define HYPRE_StructJacobiCreate \ hypre_F90_NAME(fhypre_structjacobicreate, FHYPRE_STRUCTJACOBICREATE) extern void hypre_F90_NAME(fhypre_structjacobicreate, FHYPRE_STRUCTJACOBICREATE) (HYPRE_Int *, hypre_F90_Obj *); #define HYPRE_StructJacobiDestroy \ hypre_F90_NAME(fhypre_structjacobidestroy, FHYPRE_STRUCTJACOBIDESTROY) extern void hypre_F90_NAME(fhypre_structjacobidestroy, FHYPRE_STRUCTJACOBIDESTROY) (hypre_F90_Obj *); #define HYPRE_StructJacobiSetup \ hypre_F90_NAME(fhypre_structjacobisetup, FHYPRE_STRUCTJACOBISETUP) extern void hypre_F90_NAME(fhypre_structjacobisetup, FHYPRE_STRUCTJACOBISETUP) (hypre_F90_Obj *, hypre_F90_Obj *, hypre_F90_Obj *, hypre_F90_Obj *); #define HYPRE_StructJacobiSolve \ hypre_F90_NAME(fhypre_structjacobisolve, FHYPRE_STRUCTJACOBISOLVE) extern void hypre_F90_NAME(fhypre_structjacobisolve, FHYPRE_STRUCTJACOBISOLVE) (hypre_F90_Obj *, hypre_F90_Obj *, hypre_F90_Obj *, hypre_F90_Obj *); #define HYPRE_StructJacobiSetTol \ hypre_F90_NAME(fhypre_structjacobisettol, FHYPRE_STRUCTJACOBISETTOL) extern void hypre_F90_NAME(fhypre_structjacobisettol, FHYPRE_STRUCTJACOBISETTOL) (hypre_F90_Obj *, HYPRE_Real *); #define HYPRE_StructJacobiGetTol \ hypre_F90_NAME(fhypre_structjacobigettol, FHYPRE_STRUCTJACOBIGETTOL) extern void hypre_F90_NAME(fhypre_structjacobigettol, FHYPRE_STRUCTJACOBIGETTOL) (hypre_F90_Obj *, HYPRE_Real *); #define HYPRE_StructJacobiSetMaxIter \ hypre_F90_NAME(fhypre_structjacobisetmaxiter, FHYPRE_STRUCTJACOBISETTOL) extern void hypre_F90_NAME(fhypre_structjacobisetmaxiter, FHYPRE_STRUCTJACOBISETTOL) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_StructJacobiGetMaxIter \ hypre_F90_NAME(fhypre_structjacobigetmaxiter, FHYPRE_STRUCTJACOBIGETTOL) extern void hypre_F90_NAME(fhypre_structjacobigetmaxiter, FHYPRE_STRUCTJACOBIGETTOL) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_StructJacobiSetZeroGuess \ hypre_F90_NAME(fhypre_structjacobisetzeroguess, FHYPRE_STRUCTJACOBISETZEROGUESS) extern void hypre_F90_NAME(fhypre_structjacobisetzeroguess, FHYPRE_STRUCTJACOBISETZEROGUESS) (hypre_F90_Obj *); #define HYPRE_StructJacobiGetZeroGuess \ hypre_F90_NAME(fhypre_structjacobigetzeroguess, FHYPRE_STRUCTJACOBIGETZEROGUESS) extern void hypre_F90_NAME(fhypre_structjacobigetzeroguess, FHYPRE_STRUCTJACOBIGETZEROGUESS) (hypre_F90_Obj *); #define HYPRE_StructJacobiSetNonZeroGuess \ hypre_F90_NAME(fhypre_structjacobisetnonzerogu, FHYPRE_STRUCTJACOBISETNONZEROGU) extern void hypre_F90_NAME(fhypre_structjacobisetnonzerogu, FHYPRE_STRUCTJACOBISETNONZEROGU) (hypre_F90_Obj *); #define HYPRE_StructJacobiGetNumIterations \ hypre_F90_NAME(fhypre_structjacobigetnumiterati, FHYPRE_STRUCTJACOBIGETNUMITERATI) extern void hypre_F90_NAME(fhypre_structjacobigetnumiterati, FHYPRE_STRUCTJACOBIGETNUMITERATI) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_StructJacobiGetFinalRelativeResidualNorm \ hypre_F90_NAME(fhypre_structjacobigetfinalrela, FHYPRE_STRUCTJACOBIGETFINALRELA) extern void hypre_F90_NAME(fhypre_structjacobigetfinalrela, FHYPRE_STRUCTJACOBIGETFINALRELA) (hypre_F90_Obj *, HYPRE_Real *); #define HYPRE_StructPCGCreate \ hypre_F90_NAME(fhypre_structpcgcreate, FHYPRE_STRUCTPCGCREATE) extern void hypre_F90_NAME(fhypre_structpcgcreate, FHYPRE_STRUCTPCGCREATE) (HYPRE_Int *, hypre_F90_Obj *); #define HYPRE_StructPCGDestroy \ hypre_F90_NAME(fhypre_structpcgdestroy, FHYPRE_STRUCTPCGDESTROY) extern void hypre_F90_NAME(fhypre_structpcgdestroy, FHYPRE_STRUCTPCGDESTROY) (hypre_F90_Obj *); #define HYPRE_StructPCGSetup \ hypre_F90_NAME(fhypre_structpcgsetup, FHYPRE_STRUCTPCGSETUP) extern void hypre_F90_NAME(fhypre_structpcgsetup, FHYPRE_STRUCTPCGSETUP) (hypre_F90_Obj *, hypre_F90_Obj *, hypre_F90_Obj *, hypre_F90_Obj *); #define HYPRE_StructPCGSolve \ hypre_F90_NAME(fhypre_structpcgsolve, FHYPRE_STRUCTPCGSOLVE) extern void hypre_F90_NAME(fhypre_structpcgsolve, FHYPRE_STRUCTPCGSOLVE) (hypre_F90_Obj *, hypre_F90_Obj *, hypre_F90_Obj *, hypre_F90_Obj *); #define HYPRE_StructPCGSetTol \ hypre_F90_NAME(fhypre_structpcgsettol, FHYPRE_STRUCTPCGSETTOL) extern void hypre_F90_NAME(fhypre_structpcgsettol, FHYPRE_STRUCTPCGSETTOL) (hypre_F90_Obj *, HYPRE_Real *); #define HYPRE_StructPCGSetMaxIter \ hypre_F90_NAME(fhypre_structpcgsetmaxiter, FHYPRE_STRUCTPCGSETMAXITER) extern void hypre_F90_NAME(fhypre_structpcgsetmaxiter, FHYPRE_STRUCTPCGSETMAXITER) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_StructPCGSetTwoNorm \ hypre_F90_NAME(fhypre_structpcgsettwonorm, FHYRPE_STRUCTPCGSETTWONORM) extern void hypre_F90_NAME(fhypre_structpcgsettwonorm, FHYRPE_STRUCTPCGSETTWONORM) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_StructPCGSetRelChange \ hypre_F90_NAME(fhypre_structpcgsetrelchange, FHYPRE_STRUCTPCGSETRELCHANGE) extern void hypre_F90_NAME(fhypre_structpcgsetrelchange, FHYPRE_STRUCTPCGSETRELCHANGE) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_StructPCGSetPrecond \ hypre_F90_NAME(fhypre_structpcgsetprecond, FHYPRE_STRUCTPCGSETPRECOND) extern void hypre_F90_NAME(fhypre_structpcgsetprecond, FHYPRE_STRUCTPCGSETPRECOND) (hypre_F90_Obj *, HYPRE_Int *, hypre_F90_Obj *); #define HYPRE_StructPCGSetLogging \ hypre_F90_NAME(fhypre_structpcgsetlogging, FHYPRES_TRUCTPCFSETLOGGING) extern void hypre_F90_NAME(fhypre_structpcgsetlogging, FHYPRES_TRUCTPCFSETLOGGING) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_StructPCGSetPrintLevel \ hypre_F90_NAME(fhypre_structpcgsetprintlevel, FHYPRE_STRUCTPCGSETPRINTLEVEL) extern void hypre_F90_NAME(fhypre_structpcgsetprintlevel, FHYPRE_STRUCTPCGSETPRINTLEVEL) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_StructPCGGetNumIterations \ hypre_F90_NAME(fhypre_structpcggetnumiteration, FHYPRE_STRUCTPCGGETNUMITERATION) extern void hypre_F90_NAME(fhypre_structpcggetnumiteration, FHYPRE_STRUCTPCGGETNUMITERATION) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_StructPCGGetFinalRelativeResidualNorm \ hypre_F90_NAME(fhypre_structpcggetfinalrelativ, FHYPRE_STRUCTPCGGETFINALRELATIV) extern void hypre_F90_NAME(fhypre_structpcggetfinalrelativ, FHYPRE_STRUCTPCGGETFINALRELATIV) (hypre_F90_Obj *, HYPRE_Real *); #define HYPRE_StructDiagScaleSetup \ hypre_F90_NAME(fhypre_structdiagscalesetup, FHYPRE_STRUCTDIAGSCALESETUP) extern void hypre_F90_NAME(fhypre_structdiagscalesetup, FHYPRE_STRUCTDIAGSCALESETUP) (hypre_F90_Obj *, hypre_F90_Obj *, hypre_F90_Obj *, hypre_F90_Obj *); #define HYPRE_StructDiagScaleSolve \ hypre_F90_NAME(fhypre_structdiagscalesolve, FHYPRE_STRUCTDIAGSCALESOLVE) extern void hypre_F90_NAME(fhypre_structdiagscalesolve, FHYPRE_STRUCTDIAGSCALESOLVE) (hypre_F90_Obj *, hypre_F90_Obj *, hypre_F90_Obj *, hypre_F90_Obj *); #define HYPRE_StructPFMGCreate \ hypre_F90_NAME(fhypre_structpfmgcreate, FHYPRE_STRUCTPFMGCREATE) extern void hypre_F90_NAME(fhypre_structpfmgcreate, FHYPRE_STRUCTPFMGCREATE) (HYPRE_Int *, hypre_F90_Obj *); #define HYPRE_StructPFMGDestroy \ hypre_F90_NAME(fhypre_structpfmgdestroy, FHYPRE_STRUCTPFMGDESTROY) extern void hypre_F90_NAME(fhypre_structpfmgdestroy, FHYPRE_STRUCTPFMGDESTROY) (hypre_F90_Obj *); #define HYPRE_StructPFMGSetup \ hypre_F90_NAME(fhypre_structpfmgsetup, FHYPRE_STRUCTPFMGSETUP) extern void hypre_F90_NAME(fhypre_structpfmgsetup, FHYPRE_STRUCTPFMGSETUP) (hypre_F90_Obj *, hypre_F90_Obj *, hypre_F90_Obj *, hypre_F90_Obj *); #define HYPRE_StructPFMGSolve \ hypre_F90_NAME(fhypre_structpfmgsolve, FHYPRE_STRUCTPFMGSOLVE) extern void hypre_F90_NAME(fhypre_structpfmgsolve, FHYPRE_STRUCTPFMGSOLVE) (hypre_F90_Obj *, hypre_F90_Obj *, hypre_F90_Obj *, hypre_F90_Obj *); #define HYPRE_StructPFMGSetTol \ hypre_F90_NAME(fhypre_structpfmgsettol, FHYPRE_STRUCTPFMGSETTOL) extern void hypre_F90_NAME(fhypre_structpfmgsettol, FHYPRE_STRUCTPFMGSETTOL) (hypre_F90_Obj *, HYPRE_Real *); #define HYPRE_StructPFMGGetTol \ hypre_F90_NAME(fhypre_structpfmggettol, FHYPRE_STRUCTPFMGGETTOL) extern void hypre_F90_NAME(fhypre_structpfmggettol, FHYPRE_STRUCTPFMGGETTOL) (hypre_F90_Obj *, HYPRE_Real *); #define HYPRE_StructPFMGSetMaxIter \ hypre_F90_NAME(fhypre_structpfmgsetmaxiter, FHYPRE_STRUCTPFMGSETMAXITER) extern void hypre_F90_NAME(fhypre_structpfmgsetmaxiter, FHYPRE_STRUCTPFMGSETMAXITER) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_StructPFMGGetMaxIter \ hypre_F90_NAME(fhypre_structpfmggetmaxiter, FHYPRE_STRUCTPFMGGETMAXITER) extern void hypre_F90_NAME(fhypre_structpfmggetmaxiter, FHYPRE_STRUCTPFMGGETMAXITER) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_StructPFMGSetMaxLevels \ hypre_F90_NAME(fhypre_structpfmgsetmaxlevels, FHYPRE_STRUCTPFMGSETMAXLEVELS) extern void hypre_F90_NAME(fhypre_structpfmgsetmaxlevels, FHYPRE_STRUCTPFMGSETMAXLEVELS) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_StructPFMGGetMaxLevels \ hypre_F90_NAME(fhypre_structpfmggetmaxlevels, FHYPRE_STRUCTPFMGGETMAXLEVELS) extern void hypre_F90_NAME(fhypre_structpfmggetmaxlevels, FHYPRE_STRUCTPFMGGETMAXLEVELS) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_StructPFMGSetRelChange \ hypre_F90_NAME(fhypre_structpfmgsetrelchange, FHYPRE_STRUCTPFMGSETRELCHANGE) extern void hypre_F90_NAME(fhypre_structpfmgsetrelchange, FHYPRE_STRUCTPFMGSETRELCHANGE) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_StructPFMGGetRelChange \ hypre_F90_NAME(fhypre_structpfmggetrelchange, FHYPRE_STRUCTPFMGGETRELCHANGE) extern void hypre_F90_NAME(fhypre_structpfmggetrelchange, FHYPRE_STRUCTPFMGGETRELCHANGE) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_StructPFMGSetZeroGuess \ hypre_F90_NAME(fhypre_structpfmgsetzeroguess, FHYPRE_STRUCTPFMGSETZEROGUESS) extern void hypre_F90_NAME(fhypre_structpfmgsetzeroguess, FHYPRE_STRUCTPFMGSETZEROGUESS) (hypre_F90_Obj *); #define HYPRE_StructPFMGGetZeroGuess \ hypre_F90_NAME(fhypre_structpfmggetzeroguess, FHYPRE_STRUCTPFMGGETZEROGUESS) extern void hypre_F90_NAME(fhypre_structpfmggetzeroguess, FHYPRE_STRUCTPFMGGETZEROGUESS) (hypre_F90_Obj *); #define HYPRE_StructPFMGSetNonZeroGuess \ hypre_F90_NAME(fhypre_structpfmgsetnonzerogues, FHYPRES_TRUCTPFMGSETNONZEROGUES) extern void hypre_F90_NAME(fhypre_structpfmgsetnonzerogues, FHYPRES_TRUCTPFMGSETNONZEROGUES) (hypre_F90_Obj *); #define HYPRE_StructPFMGSetSkipRelax \ hypre_F90_NAME(fhypre_structpfmgsetskiprelax, FHYPRE_STRUCTPFMGSETSKIPRELAX) extern void hypre_F90_NAME(fhypre_structpfmgsetskiprelax, FHYPRE_STRUCTPFMGSETSKIPRELAX) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_StructPFMGGetSkipRelax \ hypre_F90_NAME(fhypre_structpfmggetskiprelax, FHYPRE_STRUCTPFMGGETSKIPRELAX) extern void hypre_F90_NAME(fhypre_structpfmggetskiprelax, FHYPRE_STRUCTPFMGGETSKIPRELAX) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_StructPFMGSetRelaxType \ hypre_F90_NAME(fhypre_structpfmgsetrelaxtype, FHYPRE_STRUCTPFMGSETRELAXTYPE) extern void hypre_F90_NAME(fhypre_structpfmgsetrelaxtype, FHYPRE_STRUCTPFMGSETRELAXTYPE) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_StructPFMGGetRelaxType \ hypre_F90_NAME(fhypre_structpfmggetrelaxtype, FHYPRE_STRUCTPFMGGETRELAXTYPE) extern void hypre_F90_NAME(fhypre_structpfmggetrelaxtype, FHYPRE_STRUCTPFMGGETRELAXTYPE) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_StructPFMGSetRAPType \ hypre_F90_NAME(fhypre_structpfmgsetraptype, FHYPRE_STRUCTPFMGSETRAPTYPE) extern void hypre_F90_NAME(fhypre_structpfmgsetraptype, FHYPRE_STRUCTPFMGSETRAPTYPE) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_StructPFMGGetRAPType \ hypre_F90_NAME(fhypre_structpfmggetraptype, FHYPRE_STRUCTPFMGGETRAPTYPE) extern void hypre_F90_NAME(fhypre_structpfmggetraptype, FHYPRE_STRUCTPFMGGETRAPTYPE) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_StructPFMGSetNumPreRelax \ hypre_F90_NAME(fhypre_structpfmgsetnumprerelax, FHYPRE_STRUCTPFMGSETNUMPRERELAX) extern void hypre_F90_NAME(fhypre_structpfmgsetnumprerelax, FHYPRE_STRUCTPFMGSETNUMPRERELAX) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_StructPFMGGetNumPreRelax \ hypre_F90_NAME(fhypre_structpfmggetnumprerelax, FHYPRE_STRUCTPFMGGETNUMPRERELAX) extern void hypre_F90_NAME(fhypre_structpfmggetnumprerelax, FHYPRE_STRUCTPFMGGETNUMPRERELAX) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_StructPFMGSetNumPostRelax \ hypre_F90_NAME(fhypre_structpfmgsetnumpostrela, FHYPRE_STRUCTPFMGSETNUMPOSTRELA) extern void hypre_F90_NAME(fhypre_structpfmgsetnumpostrela, FHYPRE_STRUCTPFMGSETNUMPOSTRELA) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_StructPFMGGetNumPostRelax \ hypre_F90_NAME(fhypre_structpfmggetnumpostrela, FHYPRE_STRUCTPFMGGETNUMPOSTRELA) extern void hypre_F90_NAME(fhypre_structpfmggetnumpostrela, FHYPRE_STRUCTPFMGGETNUMPOSTRELA) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_StructPFMGSetDxyz \ hypre_F90_NAME(fhypre_structpfmgsetdxyz, FHYPRE_STRUCTPFMGSETDXYZ) extern void hypre_F90_NAME(fhypre_structpfmgsetdxyz, FHYPRE_STRUCTPFMGSETDXYZ) (hypre_F90_Obj *, HYPRE_Real *); #define HYPRE_StructPFMGSetLogging \ hypre_F90_NAME(fhypre_structpfmgsetlogging, FHYPRE_STRUCTPFMGSETLOGGING) extern void hypre_F90_NAME(fhypre_structpfmgsetlogging, FHYPRE_STRUCTPFMGSETLOGGING) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_StructPFMGGetLogging \ hypre_F90_NAME(fhypre_structpfmggetlogging, FHYPRE_STRUCTPFMGGETLOGGING) extern void hypre_F90_NAME(fhypre_structpfmggetlogging, FHYPRE_STRUCTPFMGGETLOGGING) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_StructPFMGSetPrintLevel \ hypre_F90_NAME(fhypre_structpfmgsetprintlevel, FHYPRE_STRUCTPFMGSETPRINTLEVEL) extern void hypre_F90_NAME(fhypre_structpfmgsetprintlevel, FHYPRE_STRUCTPFMGSETPRINTLEVEL) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_StructPFMGGetPrintLevel \ hypre_F90_NAME(fhypre_structpfmggetprintlevel, FHYPRE_STRUCTPFMGGETPRINTLEVEL) extern void hypre_F90_NAME(fhypre_structpfmggetprintlevel, FHYPRE_STRUCTPFMGGETPRINTLEVEL) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_StructPFMGGetNumIterations \ hypre_F90_NAME(fhypre_structpfmggetnumiteratio, FHYPRE_STRUCTPFMGGETNUMITERATIO) extern void hypre_F90_NAME(fhypre_structpfmggetnumiteratio, FHYPRE_STRUCTPFMGGETNUMITERATIO) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_StructPFMGGetFinalRelativeResidualNorm \ hypre_F90_NAME(fhypre_structpfmggetfinalrelati, FHYPRE_STRUCTPFMGGETFINALRELATI) extern void hypre_F90_NAME(fhypre_structpfmggetfinalrelati, FHYPRE_STRUCTPFMGGETFINALRELATI) (hypre_F90_Obj *, HYPRE_Real *); #define HYPRE_StructSMGCreate \ hypre_F90_NAME(fhypre_structsmgcreate, FHYPRE_STRUCTSMGCREATE) extern void hypre_F90_NAME(fhypre_structsmgcreate, FHYPRE_STRUCTSMGCREATE) (HYPRE_Int *, hypre_F90_Obj *); #define HYPRE_StructSMGDestroy \ hypre_F90_NAME(fhypre_structsmgdestroy, FHYPRE_STRUCTSMGDESTROY) extern void hypre_F90_NAME(fhypre_structsmgdestroy, FHYPRE_STRUCTSMGDESTROY) (hypre_F90_Obj *); #define HYPRE_StructSMGSetup \ hypre_F90_NAME(fhypre_structsmgsetup, FHYPRE_STRUCTSMGSETUP) extern void hypre_F90_NAME(fhypre_structsmgsetup, FHYPRE_STRUCTSMGSETUP) (hypre_F90_Obj *, hypre_F90_Obj *, hypre_F90_Obj *, hypre_F90_Obj *); #define HYPRE_StructSMGSolve \ hypre_F90_NAME(fhypre_structsmgsolve, FHYPRE_STRUCTSMGSOLVE) extern void hypre_F90_NAME(fhypre_structsmgsolve, FHYPRE_STRUCTSMGSOLVE) (hypre_F90_Obj *, hypre_F90_Obj *, hypre_F90_Obj *, hypre_F90_Obj *); #define HYPRE_StructSMGSetMemoryUse \ hypre_F90_NAME(fhypre_structsmgsetmemoryuse, FHYPRE_STRUCTSMGSETMEMORYUSE) extern void hypre_F90_NAME(fhypre_structsmgsetmemoryuse, FHYPRE_STRUCTSMGSETMEMORYUSE) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_StructSMGGetMemoryUse \ hypre_F90_NAME(fhypre_structsmggetmemoryuse, FHYPRE_STRUCTSMGGETMEMORYUSE) extern void hypre_F90_NAME(fhypre_structsmggetmemoryuse, FHYPRE_STRUCTSMGGETMEMORYUSE) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_StructSMGSetTol \ hypre_F90_NAME(fhypre_structsmgsettol, FHYPRE_STRUCTSMGSETTOL) extern void hypre_F90_NAME(fhypre_structsmgsettol, FHYPRE_STRUCTSMGSETTOL) (hypre_F90_Obj *, HYPRE_Real *); #define HYPRE_StructSMGGetTol \ hypre_F90_NAME(fhypre_structsmggettol, FHYPRE_STRUCTSMGGETTOL) extern void hypre_F90_NAME(fhypre_structsmggettol, FHYPRE_STRUCTSMGGETTOL) (hypre_F90_Obj *, HYPRE_Real *); #define HYPRE_StructSMGSetMaxIter \ hypre_F90_NAME(fhypre_structsmgsetmaxiter, FHYPRE_STRUCTSMGSETMAXTITER) extern void hypre_F90_NAME(fhypre_structsmgsetmaxiter, FHYPRE_STRUCTSMGSETMAXTITER) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_StructSMGGetMaxIter \ hypre_F90_NAME(fhypre_structsmggetmaxiter, FHYPRE_STRUCTSMGGETMAXTITER) extern void hypre_F90_NAME(fhypre_structsmggetmaxiter, FHYPRE_STRUCTSMGGETMAXTITER) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_StructSMGSetRelChange \ hypre_F90_NAME(fhypre_structsmgsetrelchange, FHYPRE_STRUCTSMGSETRELCHANGE) extern void hypre_F90_NAME(fhypre_structsmgsetrelchange, FHYPRE_STRUCTSMGSETRELCHANGE) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_StructSMGGetRelChange \ hypre_F90_NAME(fhypre_structsmggetrelchange, FHYPRE_STRUCTSMGGETRELCHANGE) extern void hypre_F90_NAME(fhypre_structsmggetrelchange, FHYPRE_STRUCTSMGGETRELCHANGE) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_StructSMGSetZeroGuess \ hypre_F90_NAME(fhypre_structsmgsetzeroguess, FHYPRE_STRUCTSMGSETZEROGUESS) extern void hypre_F90_NAME(fhypre_structsmgsetzeroguess, FHYPRE_STRUCTSMGSETZEROGUESS) (hypre_F90_Obj *); #define HYPRE_StructSMGGetZeroGuess \ hypre_F90_NAME(fhypre_structsmggetzeroguess, FHYPRE_STRUCTSMGGETZEROGUESS) extern void hypre_F90_NAME(fhypre_structsmggetzeroguess, FHYPRE_STRUCTSMGGETZEROGUESS) (hypre_F90_Obj *); #define HYPRE_StructSMGSetNonZeroGuess \ hypre_F90_NAME(fhypre_structsmgsetnonzerogues, FHYPRE_STRUCTSMGSETNONZEROGUES) extern void hypre_F90_NAME(fhypre_structsmgsetnonzerogues, FHYPRE_STRUCTSMGSETNONZEROGUES) (hypre_F90_Obj *); #define HYPRE_StructSMGGetNumIterations \ hypre_F90_NAME(fhypre_structsmggetnumiteration, FHYPRE_STRUCTSMGGETNUMITERATION) extern void hypre_F90_NAME(fhypre_structsmggetnumiteration, FHYPRE_STRUCTSMGGETNUMITERATION) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_StructSMGGetFinalRelativeResidualNorm \ hypre_F90_NAME(fhypre_structsmggetfinalrelativ, FHYPRE_STRUCTSMGGETFINALRELATIV) extern void hypre_F90_NAME(fhypre_structsmggetfinalrelativ, FHYPRE_STRUCTSMGGETFINALRELATIV) (hypre_F90_Obj *, HYPRE_Real *); #define HYPRE_StructSMGSetNumPreRelax \ hypre_F90_NAME(fhypre_structsmgsetnumprerelax, FHYPRE_STRUCTSMGSETNUMPRERELAX) extern void hypre_F90_NAME(fhypre_structsmgsetnumprerelax, FHYPRE_STRUCTSMGSETNUMPRERELAX) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_StructSMGGetNumPreRelax \ hypre_F90_NAME(fhypre_structsmggetnumprerelax, FHYPRE_STRUCTSMGGETNUMPRERELAX) extern void hypre_F90_NAME(fhypre_structsmggetnumprerelax, FHYPRE_STRUCTSMGGETNUMPRERELAX) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_StructSMGSetNumPostRelax \ hypre_F90_NAME(fhypre_structsmgsetnumpostrelax, FHYPRE_STRUCTSMGSETNUMPOSTRELAX) extern void hypre_F90_NAME(fhypre_structsmgsetnumpostrelax, FHYPRE_STRUCTSMGSETNUMPOSTRELAX) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_StructSMGGetNumPostRelax \ hypre_F90_NAME(fhypre_structsmggetnumpostrelax, FHYPRE_STRUCTSMGGETNUMPOSTRELAX) extern void hypre_F90_NAME(fhypre_structsmggetnumpostrelax, FHYPRE_STRUCTSMGGETNUMPOSTRELAX) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_StructSMGSetLogging \ hypre_F90_NAME(fhypre_structsmgsetlogging, FHYPRE_STRUCTSMGSETLOGGING) extern void hypre_F90_NAME(fhypre_structsmgsetlogging, FHYPRE_STRUCTSMGSETLOGGING) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_StructSMGGetLogging \ hypre_F90_NAME(fhypre_structsmggetlogging, FHYPRE_STRUCTSMGGETLOGGING) extern void hypre_F90_NAME(fhypre_structsmggetlogging, FHYPRE_STRUCTSMGGETLOGGING) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_StructSMGSetPrintLevel \ hypre_F90_NAME(fhypre_structsmgsetprintlevel, FHYPRE_STRUCTSMGSETPRINTLEVEL) extern void hypre_F90_NAME(fhypre_structsmgsetprintlevel, FHYPRE_STRUCTSMGSETPRINTLEVEL) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_StructSMGGetPrintLevel \ hypre_F90_NAME(fhypre_structsmggetprintlevel, FHYPRE_STRUCTSMGGETPRINTLEVEL) extern void hypre_F90_NAME(fhypre_structsmggetprintlevel, FHYPRE_STRUCTSMGGETPRINTLEVEL) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_StructSparseMSGCreate \ hypre_F90_NAME(fhypre_structsparsemsgcreate, FHYPRE_STRUCTSPARSEMSGCREATE) extern void hypre_F90_NAME(fhypre_structsparsemsgcreate, FHYPRE_STRUCTSPARSEMSGCREATE) (HYPRE_Int *, hypre_F90_Obj *); #define HYPRE_StructSparseMSGDestroy \ hypre_F90_NAME(fhypre_structsparsemsgdestroy, FHYPRE_STRUCTSPARSEMSGDESTROY) extern void hypre_F90_NAME(fhypre_structsparsemsgdestroy, FHYPRE_STRUCTSPARSEMSGDESTROY) (hypre_F90_Obj *); #define HYPRE_StructSparseMSGSetup \ hypre_F90_NAME(fhypre_structsparsemsgsetup, FHYRPE_STRUCTSPARSEMSGSETUP) extern void hypre_F90_NAME(fhypre_structsparsemsgsetup, FHYRPE_STRUCTSPARSEMSGSETUP) (hypre_F90_Obj *, hypre_F90_Obj *, hypre_F90_Obj *, hypre_F90_Obj *); #define HYPRE_StructSparseMSGSolve \ hypre_F90_NAME(fhypre_structsparsemsgsolve, FHYPRE_STRUCTSPARSEMSGSOLVE) extern void hypre_F90_NAME(fhypre_structsparsemsgsolve, FHYPRE_STRUCTSPARSEMSGSOLVE) (hypre_F90_Obj *, hypre_F90_Obj *, hypre_F90_Obj *, hypre_F90_Obj *); #define HYPRE_StructSparseMSGSetJump \ hypre_F90_NAME(fhypre_structsparsemsgsetjump, FHYPRE_STRUCTSPARSEMSGSETJUMP) extern void hypre_F90_NAME(fhypre_structsparsemsgsetjump, FHYPRE_STRUCTSPARSEMSGSETJUMP) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_StructSparseMSGSetTol \ hypre_F90_NAME(fhypre_structsparsemsgsettol, FHYPRE_STRUCTSPARSEMSGSETTOL) extern void hypre_F90_NAME(fhypre_structsparsemsgsettol, FHYPRE_STRUCTSPARSEMSGSETTOL) (hypre_F90_Obj *, HYPRE_Real *); #define HYPRE_StructSparseMSGSetMaxIter \ hypre_F90_NAME(fhypre_structsparsemsgsetmaxite, FHYPRE_STRUCTSPARSEMSGSETMAXITE) extern void hypre_F90_NAME(fhypre_structsparsemsgsetmaxite, FHYPRE_STRUCTSPARSEMSGSETMAXITE) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_StructSparseMSGSetRelChange \ hypre_F90_NAME(fhypre_structsparsemsgsetrelcha, FHYPRE_STRUCTSPARSEMSGSETRELCHA) extern void hypre_F90_NAME(fhypre_structsparsemsgsetrelcha, FHYPRE_STRUCTSPARSEMSGSETRELCHA) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_StructSparseMSGSetZeroGuess \ hypre_F90_NAME(fhypre_structsparsemsgsetzerogu, FHYPRE_STRUCTSPARSEMSGSETZEROGU) extern void hypre_F90_NAME(fhypre_structsparsemsgsetzerogu, FHYPRE_STRUCTSPARSEMSGSETZEROGU) (hypre_F90_Obj *); #define HYPRE_StructSparseMSGSetNonZeroGuess \ hypre_F90_NAME(fhypre_structsparsemsgsetnonzer, FHYPRE_STRUCTSPARSEMSGSETNONZER) extern void hypre_F90_NAME(fhypre_structsparsemsgsetnonzer, FHYPRE_STRUCTSPARSEMSGSETNONZER) (hypre_F90_Obj *); #define HYPRE_StructSparseMSGGetNumIterations \ hypre_F90_NAME(fhypre_structsparsemsggetnumite, FHYPRE_STRUCTSPARSEMSGGETNUMITE) extern void hypre_F90_NAME(fhypre_structsparsemsggetnumite, FHYPRE_STRUCTSPARSEMSGGETNUMITE) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_StructSparseMSGGetFinalRelativeResidualNorm \ hypre_F90_NAME(fhypre_structsparsemsggetfinalr, FHYRPE_STRUCTSPARSEMSGGETFINALR) extern void hypre_F90_NAME(fhypre_structsparsemsggetfinalr, FHYRPE_STRUCTSPARSEMSGGETFINALR) (hypre_F90_Obj *, HYPRE_Real *); #define HYPRE_StructSparseMSGSetRelaxType \ hypre_F90_NAME(fhypre_structsparsemsgsetrelaxt, FHYPRE_STRUCTSPARSEMSGSETRELAXT) extern void hypre_F90_NAME(fhypre_structsparsemsgsetrelaxt, FHYPRE_STRUCTSPARSEMSGSETRELAXT) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_StructSparseMSGSetNumPreRelax \ hypre_F90_NAME(fhypre_structsparsemsgsetnumpre, FHYPRE_STRUCTSPARSEMSGSETNUMPRE) extern void hypre_F90_NAME(fhypre_structsparsemsgsetnumpre, FHYPRE_STRUCTSPARSEMSGSETNUMPRE) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_StructSparseMSGSetNumPostRelax \ hypre_F90_NAME(fhypre_structsparsemsgsetnumpos, FHYPRE_STRUCTSPARSEMSGSETNUMPOS) extern void hypre_F90_NAME(fhypre_structsparsemsgsetnumpos, FHYPRE_STRUCTSPARSEMSGSETNUMPOS) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_StructSparseMSGSetNumFineRelax \ hypre_F90_NAME(fhypre_structsparsemsgsetnumfin, FHYPRE_STRUCTSPARSEMSGSETNUMFIN) extern void hypre_F90_NAME(fhypre_structsparsemsgsetnumfin, FHYPRE_STRUCTSPARSEMSGSETNUMFIN) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_StructSparseMSGSetLogging \ hypre_F90_NAME(fhypre_structsparsemsgsetloggin, FHYPRE_STRUCTSPARSEMSGSETLOGGIN) extern void hypre_F90_NAME(fhypre_structsparsemsgsetloggin, FHYPRE_STRUCTSPARSEMSGSETLOGGIN) (hypre_F90_Obj *, HYPRE_Int *); #define HYPRE_StructSparseMSGSetPrintLevel \ hypre_F90_NAME(fhypre_structsparsemsgsetprintl, FHYPRE_STRUCTSPARSEMSGSETPRINTL) extern void hypre_F90_NAME(fhypre_structsparsemsgsetprintl, FHYPRE_STRUCTSPARSEMSGSETPRINTL) (hypre_F90_Obj *, HYPRE_Int *); #ifdef __cplusplus } #endif hypre-2.33.0/src/test/hypre_test.h000066400000000000000000000061501477326011500170430ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /*-------------------------------------------------------------------------- * Header file for test drivers *--------------------------------------------------------------------------*/ #ifndef HYPRE_TEST_INCLUDES #define HYPRE_TEST_INCLUDES #include #include #include #include "HYPRE_krylov.h" #include "_hypre_utilities.h" #include "HYPRE.h" #include "HYPRE_parcsr_ls.h" #include "HYPRE_struct_ls.h" #include "HYPRE_sstruct_ls.h" #define HYPRE_BICGSTAB 99100 #define HYPRE_BOOMERAMG 99110 #define HYPRE_CGNR 99120 #define HYPRE_DIAGSCALE 99130 #define HYPRE_EUCLID 99140 #define HYPRE_GMRES 99150 #define HYPRE_GSMG 99155 #define HYPRE_HYBRID 99160 #define HYPRE_JACOBI 99170 #define HYPRE_PARASAILS 99180 #define HYPRE_PCG 99190 #define HYPRE_PFMG_1 99200 #define HYPRE_PILUT 99210 #define HYPRE_SCHWARZ 99220 #define HYPRE_SMG_1 99230 #define HYPRE_SPARSEMSG 99240 #define HYPRE_SPLIT 99250 #define HYPRE_SPLITPFMG 99260 #define HYPRE_SPLITSMG 99270 #define HYPRE_SYSPFMG 99280 /**************************************************************************** * Prototypes for testing routines ***************************************************************************/ HYPRE_Int hypre_set_precond(HYPRE_Int matrix_id, HYPRE_Int solver_id, HYPRE_Int precond_id, void *solver, void *precond); HYPRE_Int hypre_set_precond_params(HYPRE_Int precond_id, void *precond); HYPRE_Int hypre_destroy_precond(HYPRE_Int precond_id, void *precond); /**************************************************************************** * Variables for testing routines ***************************************************************************/ HYPRE_Int k_dim = 5; HYPRE_Int gsmg_samples = 5; HYPRE_Int poutdat = 1; HYPRE_Int hybrid = 1; HYPRE_Int coarsen_type = 6; HYPRE_Int measure_type = 0; HYPRE_Int smooth_type = 6; HYPRE_Int num_functions = 1; HYPRE_Int smooth_num_levels = 0; HYPRE_Int smooth_num_sweeps = 1; HYPRE_Int num_sweep = 1; HYPRE_Int max_levels = 25; HYPRE_Int variant = 0; HYPRE_Int overlap = 1; HYPRE_Int domain_type = 2; HYPRE_Int nonzeros_to_keep = -1; HYPRE_Int interp_type; HYPRE_Int cycle_type; HYPRE_Int relax_default; HYPRE_Int *dof_func; HYPRE_Int *num_grid_sweeps; HYPRE_Int *grid_relax_type; HYPRE_Int **grid_relax_points; HYPRE_Real tol = 1.e-8; HYPRE_Real pc_tol = 0.; HYPRE_Real drop_tol = -1.; HYPRE_Real max_row_sum = 1.; HYPRE_Real schwarz_rlx_weight = 1.; HYPRE_Real sai_threshold = 0.1; HYPRE_Real sai_filter = 0.1; HYPRE_Real strong_threshold; HYPRE_Real trunc_factor; HYPRE_Real *relax_weight; HYPRE_Real *omega; #endif hypre-2.33.0/src/test/ij.c000066400000000000000000015553121477326011500152640ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /*-------------------------------------------------------------------------- * Test driver for unstructured matrix interface (IJ_matrix interface). * Do `driver -help' for usage info. * This driver started from the driver for parcsr_linear_solvers, and it * works by first building a parcsr matrix as before and then "copying" * that matrix row-by-row into the IJMatrix interface. AJC 7/99. *--------------------------------------------------------------------------*/ #include #include #include #include "_hypre_utilities.h" #include "HYPRE.h" #include "HYPRE_parcsr_mv.h" #include "HYPRE_IJ_mv.h" #include "_hypre_IJ_mv.h" #include "HYPRE_parcsr_ls.h" #include "_hypre_parcsr_mv.h" #include "HYPRE_krylov.h" #if defined (HYPRE_USING_CUDA) #include #endif #if defined(HYPRE_USING_CUSPARSE) #define DISABLE_CUSPARSE_DEPRECATED #include #endif /* begin lobpcg */ #define NO_SOLVER -9198 #include #include "HYPRE_lobpcg.h" /* max dt */ #define DT_INF 1.0e30 HYPRE_Int BuildParIsoLaplacian( HYPRE_Int argc, char** argv, HYPRE_ParCSRMatrix *A_ptr ); /* end lobpcg */ #ifdef __cplusplus extern "C" { #endif HYPRE_Int BuildParFromFile (HYPRE_Int argc, char *argv [], HYPRE_Int arg_index, HYPRE_ParCSRMatrix *A_ptr ); HYPRE_Int ReadParVectorFromFile (HYPRE_Int argc, char *argv [], HYPRE_Int arg_index, HYPRE_ParVector *b_ptr ); HYPRE_Int BuildParLaplacian (HYPRE_Int argc, char *argv [], HYPRE_Int arg_index, HYPRE_ParCSRMatrix *A_ptr ); HYPRE_Int BuildParSysLaplacian (HYPRE_Int argc, char *argv [], HYPRE_Int arg_index, HYPRE_ParCSRMatrix *A_ptr ); HYPRE_Int BuildParDifConv (HYPRE_Int argc, char *argv [], HYPRE_Int arg_index, HYPRE_ParCSRMatrix *A_ptr); HYPRE_Int BuildParFromOneFile (HYPRE_Int argc, char *argv [], HYPRE_Int arg_index, HYPRE_Int num_functions, HYPRE_ParCSRMatrix *A_ptr ); HYPRE_Int BuildFuncsFromFiles (HYPRE_Int argc, char *argv [], HYPRE_Int arg_index, HYPRE_ParCSRMatrix A, HYPRE_Int **dof_func_ptr ); HYPRE_Int BuildFuncsFromOneFile (HYPRE_Int argc, char *argv [], HYPRE_Int arg_index, HYPRE_ParCSRMatrix A, HYPRE_Int **dof_func_ptr ); HYPRE_Int BuildRhsParFromOneFile (HYPRE_Int argc, char *argv [], HYPRE_Int arg_index, HYPRE_ParCSRMatrix A, HYPRE_ParVector *b_ptr ); HYPRE_Int BuildBigArrayFromOneFile (HYPRE_Int argc, char *argv [], const char *array_name, HYPRE_Int arg_index, HYPRE_BigInt *partitioning, HYPRE_Int *size, HYPRE_BigInt **array_ptr); HYPRE_Int BuildParLaplacian9pt (HYPRE_Int argc, char *argv [], HYPRE_Int arg_index, HYPRE_ParCSRMatrix *A_ptr ); HYPRE_Int BuildParLaplacian27pt (HYPRE_Int argc, char *argv [], HYPRE_Int arg_index, HYPRE_ParCSRMatrix *A_ptr ); HYPRE_Int BuildParLaplacian125pt (HYPRE_Int argc, char *argv [], HYPRE_Int arg_index, HYPRE_ParCSRMatrix *A_ptr ); HYPRE_Int BuildParRotate7pt (HYPRE_Int argc, char *argv [], HYPRE_Int arg_index, HYPRE_ParCSRMatrix *A_ptr ); HYPRE_Int BuildParVarDifConv (HYPRE_Int argc, char *argv [], HYPRE_Int arg_index, HYPRE_ParCSRMatrix *A_ptr, HYPRE_ParVector *rhs_ptr ); HYPRE_ParCSRMatrix GenerateSysLaplacian (MPI_Comm comm, HYPRE_BigInt nx, HYPRE_BigInt ny, HYPRE_BigInt nz, HYPRE_Int P, HYPRE_Int Q, HYPRE_Int R, HYPRE_Int p, HYPRE_Int q, HYPRE_Int r, HYPRE_Int num_fun, HYPRE_Real *mtrx, HYPRE_Real *value); HYPRE_ParCSRMatrix GenerateSysLaplacianVCoef (MPI_Comm comm, HYPRE_BigInt nx, HYPRE_BigInt ny, HYPRE_BigInt nz, HYPRE_Int P, HYPRE_Int Q, HYPRE_Int R, HYPRE_Int p, HYPRE_Int q, HYPRE_Int r, HYPRE_Int num_fun, HYPRE_Real *mtrx, HYPRE_Real *value); HYPRE_Int SetSysVcoefValues(HYPRE_Int num_fun, HYPRE_BigInt nx, HYPRE_BigInt ny, HYPRE_BigInt nz, HYPRE_Real vcx, HYPRE_Real vcy, HYPRE_Real vcz, HYPRE_Int mtx_entry, HYPRE_Real *values); HYPRE_Int BuildParCoordinates (HYPRE_Int argc, char *argv [], HYPRE_Int arg_index, HYPRE_Int *coorddim_ptr, float **coord_ptr ); extern HYPRE_Int hypre_FlexGMRESModifyPCAMGExample(void *precond_data, HYPRE_Int iterations, HYPRE_Real rel_residual_norm); extern HYPRE_Int hypre_FlexGMRESModifyPCDefault(void *precond_data, HYPRE_Int iteration, HYPRE_Real rel_residual_norm); #ifdef __cplusplus } #endif hypre_int main( hypre_int argc, char *argv[] ) { HYPRE_Int arg_index; HYPRE_Int print_usage; HYPRE_Int log_level = 0; HYPRE_Int sparsity_known = 0; HYPRE_Int add = 0; HYPRE_Int check_constant = 0; HYPRE_Int off_proc = 0; HYPRE_Int chunk = 0; HYPRE_Int omp_flag = 0; HYPRE_Int build_matrix_type; HYPRE_Int build_matrix_arg_index; HYPRE_Int build_matrix_M; HYPRE_Int build_matrix_M_arg_index; HYPRE_Int build_rhs_type; HYPRE_Int build_rhs_arg_index; HYPRE_Int build_src_type; HYPRE_Int build_src_arg_index; HYPRE_Int build_x0_type; HYPRE_Int build_x0_arg_index; HYPRE_Int build_funcs_type; HYPRE_Int build_funcs_arg_index; HYPRE_Int build_fpt_arg_index; HYPRE_Int build_sfpt_arg_index; HYPRE_Int build_cpt_arg_index; HYPRE_Int num_components = 1; HYPRE_Int solver_id; HYPRE_Int solver_type = 1; HYPRE_Int recompute_res = 0; /* What should be the default here? */ HYPRE_Int ioutdat; HYPRE_Int poutdat; HYPRE_Int poutusr = 0; /* if user selects pout */ HYPRE_Int print_matrix_info = 0; HYPRE_Int debug_flag; HYPRE_Int ierr = 0; HYPRE_Int i, j, c; HYPRE_Int max_levels = 25; HYPRE_Int num_iterations; HYPRE_Int pcg_num_its, dscg_num_its; HYPRE_Int max_iter = 1000; HYPRE_Int mg_max_iter = 100; HYPRE_Int nodal = 0; HYPRE_Int nodal_diag = 0; HYPRE_Int keep_same_sign = 0; HYPRE_Real cf_tol = 0.9; HYPRE_Real norm; HYPRE_Real b_dot_b; HYPRE_Real final_res_norm; void *object; HYPRE_IJMatrix ij_A = NULL; HYPRE_IJMatrix ij_M = NULL; HYPRE_IJVector ij_b = NULL; HYPRE_IJVector ij_x = NULL; HYPRE_IJVector *ij_rbm = NULL; HYPRE_ParCSRMatrix parcsr_A = NULL; HYPRE_ParCSRMatrix parcsr_M = NULL; HYPRE_ParVector b = NULL; HYPRE_ParVector x = NULL; HYPRE_ParVector *interp_vecs = NULL; HYPRE_ParVector residual = NULL; HYPRE_ParVector x0_save = NULL; HYPRE_Solver amg_solver; HYPRE_Solver amgdd_solver; HYPRE_Solver pcg_solver; HYPRE_Solver amg_precond = NULL; HYPRE_Solver pcg_precond = NULL; HYPRE_Solver pcg_precond_gotten; HYPRE_Int check_residual = 0; HYPRE_Int num_procs, myid; HYPRE_Int local_row; HYPRE_Int *row_sizes = NULL; HYPRE_Int *diag_sizes; HYPRE_Int *offdiag_sizes; HYPRE_BigInt *rows; HYPRE_Int size; HYPRE_Int *ncols; HYPRE_BigInt *col_inds; HYPRE_Int *dof_func; HYPRE_Int filter_functions = 0; HYPRE_Int num_functions = 1; HYPRE_Int num_paths = 1; HYPRE_Int agg_num_levels = 0; HYPRE_Int ns_coarse = 1, ns_down = -1, ns_up = -1; HYPRE_Int time_index; MPI_Comm comm = hypre_MPI_COMM_WORLD; HYPRE_BigInt M, N, big_i; HYPRE_Int local_num_rows, local_num_cols; HYPRE_BigInt first_local_row, last_local_row; HYPRE_BigInt first_local_col, last_local_col; HYPRE_BigInt *partitioning = NULL; HYPRE_Int variant, overlap, domain_type; HYPRE_Real schwarz_rlx_weight; HYPRE_Real *values, val; HYPRE_Int use_nonsymm_schwarz = 0; HYPRE_Int build_rbm = 0; HYPRE_Int build_rbm_index = 0; HYPRE_Int num_interp_vecs = 0; HYPRE_Int interp_vec_variant = 0; HYPRE_Int Q_max = 0; HYPRE_Real Q_trunc = 0; /* Specific tests */ HYPRE_Int test_init = 0; HYPRE_Int lazy_device_init = 0; HYPRE_Int device_id = -1; HYPRE_Int test_ij = 0; HYPRE_Int test_multivec = 0; HYPRE_Int test_scaling = 0; HYPRE_Int test_error = 0; const HYPRE_Real dt_inf = DT_INF; HYPRE_Real dt = dt_inf; /* solve -Ax = b, for testing SND matrices */ HYPRE_Int negA = 0; /* parameters for BoomerAMG */ HYPRE_Real A_drop_tol = 0.0; HYPRE_Int A_drop_type = -1; HYPRE_Int coarsen_cut_factor = 0; HYPRE_Real strong_threshold; HYPRE_Real strong_thresholdR; HYPRE_Real filter_thresholdR; HYPRE_Real trunc_factor; HYPRE_Real jacobi_trunc_threshold; HYPRE_Real S_commpkg_switch = 1.0; HYPRE_Real CR_rate = 0.7; HYPRE_Real CR_strong_th = 0.0; HYPRE_Int CR_use_CG = 0; HYPRE_Int P_max_elmts = 4; HYPRE_Int cycle_type; HYPRE_Int fcycle; HYPRE_Int coarsen_type = 10; HYPRE_Int measure_type = 0; HYPRE_Int num_sweeps = 1; HYPRE_Int IS_type; HYPRE_Int num_CR_relax_steps = 2; HYPRE_Int relax_type = -1; HYPRE_Int add_relax_type = 18; HYPRE_Int relax_coarse = -1; HYPRE_Int relax_up = -1; HYPRE_Int relax_down = -1; HYPRE_Int relax_order = 0; HYPRE_Int level_w = -1; HYPRE_Int level_ow = -1; /* HYPRE_Int smooth_lev; */ /* HYPRE_Int smooth_rlx = 8; */ HYPRE_Int smooth_type = 6; HYPRE_Int smooth_num_levels = 0; HYPRE_Int smooth_num_sweeps = 1; HYPRE_Int coarse_threshold = 9; HYPRE_Int min_coarse_size = 0; /* redundant coarse grid solve */ HYPRE_Int seq_threshold = 0; HYPRE_Int redundant = 0; /* additive versions */ HYPRE_Int additive = -1; HYPRE_Int mult_add = -1; HYPRE_Int simple = -1; HYPRE_Int add_last_lvl = -1; HYPRE_Int add_P_max_elmts = 0; HYPRE_Real add_trunc_factor = 0; HYPRE_Int rap2 = 0; HYPRE_Int mod_rap2 = 0; HYPRE_Int keepTranspose = 0; #ifdef HYPRE_USING_DSUPERLU HYPRE_Int dslu_threshold = -1; #endif HYPRE_Real relax_wt; HYPRE_Real add_relax_wt = 1.0; HYPRE_Real relax_wt_level = 0.0; HYPRE_Real outer_wt; HYPRE_Real outer_wt_level = 0; HYPRE_Real tol = 1.e-8, pc_tol = 0.; HYPRE_Real atol = 0.0; HYPRE_Real max_row_sum = 1.; HYPRE_Int converge_type = 0; HYPRE_Int precon_cycles = 1; HYPRE_Int cheby_order = 2; HYPRE_Int cheby_eig_est = 10; HYPRE_Int cheby_variant = 0; HYPRE_Int cheby_scale = 1; HYPRE_Real cheby_fraction = .3; #if defined(HYPRE_USING_GPU) #if defined(HYPRE_USING_CUSPARSE) && CUSPARSE_VERSION >= 11000 /* CUSPARSE_SPMV_ALG_DEFAULT doesn't provide deterministic results */ HYPRE_Int spmv_use_vendor = 0; #else HYPRE_Int spmv_use_vendor = 1; #endif HYPRE_Int use_curand = 1; #if defined(HYPRE_USING_CUDA) HYPRE_Int spgemm_use_vendor = 0; #else HYPRE_Int spgemm_use_vendor = 1; #endif HYPRE_Int spgemm_alg = 1; HYPRE_Int spgemm_binned = 0; HYPRE_Int spgemm_rowest_mtd = 3; HYPRE_Int spgemm_rowest_nsamples = -1; /* default */ HYPRE_Real spgemm_rowest_mult = -1.0; /* default */ #endif HYPRE_Int nmv = 100; /* for CGC BM Aug 25, 2006 */ HYPRE_Int cgcits = 1; /* for coordinate plotting BM Oct 24, 2006 */ HYPRE_Int plot_grids = 0; HYPRE_Int coord_dim = 3; float *coordinates = NULL; char plot_file_name[256]; /* parameters for ParaSAILS */ HYPRE_Real sai_threshold = 0.1; HYPRE_Real sai_filter = 0.1; /* parameters for PILUT */ HYPRE_Real drop_tol = -1; HYPRE_Int nonzeros_to_keep = -1; /* parameters for Euclid or ILU smoother in AMG */ HYPRE_Real eu_ilut = 0.0; HYPRE_Real eu_sparse_A = 0.0; HYPRE_Int eu_bj = 0; HYPRE_Int eu_level = -1; HYPRE_Int eu_stats = 0; HYPRE_Int eu_mem = 0; HYPRE_Int eu_row_scale = 0; /* Euclid only */ /* parameters for GMRES */ HYPRE_Int k_dim; /* parameters for COGMRES */ HYPRE_Int cgs = 1; HYPRE_Int unroll = 0; /* parameters for LGMRES */ HYPRE_Int aug_dim; /* parameters for GSMG */ HYPRE_Int gsmg_samples = 5; /* interpolation */ HYPRE_Int interp_type = 6; /* default value */ HYPRE_Int post_interp_type = 0; /* default value */ /* RL: restriction */ HYPRE_Int restri_type = 0; /* aggressive coarsening */ HYPRE_Int agg_interp_type = 4; /* default value */ HYPRE_Int agg_P_max_elmts = 0; /* default value */ HYPRE_Int agg_P12_max_elmts = 0; /* default value */ HYPRE_Real agg_trunc_factor = 0; /* default value */ HYPRE_Real agg_P12_trunc_factor = 0; /* default value */ HYPRE_Int print_system = 0; HYPRE_Int print_system_binary = 0; HYPRE_Int rel_change = 0; HYPRE_Int second_time = 0; HYPRE_Int benchmark = 0; /* begin lobpcg */ HYPRE_Int hybrid = 1; HYPRE_Int num_sweep = 1; HYPRE_Int relax_default = 3; HYPRE_Int lobpcgFlag = 0; HYPRE_Int lobpcgGen = 0; HYPRE_Int constrained = 0; HYPRE_Int vFromFileFlag = 0; HYPRE_Int lobpcgSeed = 0; HYPRE_Int blockSize = 1; HYPRE_Int verbosity = 1; HYPRE_Int iterations; HYPRE_Int maxIterations = 100; HYPRE_Int checkOrtho = 0; HYPRE_Int printLevel = 0; /* also c.f. poutdat */ HYPRE_Int two_norm = 1; HYPRE_Int skip_break = 0; HYPRE_Int flex = 0; HYPRE_Int pcgIterations = 0; HYPRE_Int pcgMode = 1; HYPRE_Real pcgTol = 1e-2; HYPRE_Real nonOrthF; FILE* filePtr; mv_MultiVectorPtr eigenvectors = NULL; mv_MultiVectorPtr constraints = NULL; mv_MultiVectorPtr workspace = NULL; HYPRE_Real* eigenvalues = NULL; HYPRE_Real* residuals; utilities_FortranMatrix* residualNorms; utilities_FortranMatrix* residualNormsHistory; utilities_FortranMatrix* eigenvaluesHistory; utilities_FortranMatrix* printBuffer; utilities_FortranMatrix* gramXX; utilities_FortranMatrix* identity; HYPRE_Solver lobpcg_solver; mv_InterfaceInterpreter* interpreter; HYPRE_MatvecFunctions matvec_fn; HYPRE_IJMatrix ij_B; HYPRE_ParCSRMatrix parcsr_B; /* end lobpcg */ /* mgr options */ HYPRE_Int mgr_bsize = 1; HYPRE_Int mgr_nlevels = 0; HYPRE_Int mgr_num_reserved_nodes = 0; HYPRE_Int mgr_non_c_to_f = 1; HYPRE_Int mgr_frelax_method = 0; HYPRE_Int *mgr_num_cindexes = NULL; HYPRE_Int **mgr_cindexes = NULL; HYPRE_BigInt *mgr_reserved_coarse_indexes = NULL; HYPRE_Int mgr_relax_type = 0; HYPRE_Int mgr_num_relax_sweeps = 2; HYPRE_Int mgr_interp_type = 2; HYPRE_Int mgr_num_interp_sweeps = 2; HYPRE_Int mgr_gsmooth_type = 0; HYPRE_Int mgr_num_gsmooth_sweeps = 1; HYPRE_Int mgr_restrict_type = 0; HYPRE_Int mgr_num_restrict_sweeps = 0; /* end mgr options */ /* hypre_ILU options */ HYPRE_Int ilu_type = 0; HYPRE_Int ilu_lfil = 0; HYPRE_Int ilu_reordering = 1; HYPRE_Int ilu_tri_solve = 1; HYPRE_Int ilu_ljac_iters = 5; HYPRE_Int ilu_ujac_iters = 5; HYPRE_Int ilu_iter_setup_type = 0; HYPRE_Int ilu_iter_setup_option = 0; HYPRE_Int ilu_iter_setup_max_iter = 100; HYPRE_Real ilu_iter_setup_tolerance = 1.e-6; HYPRE_Int ilu_sm_max_iter = 1; HYPRE_Real ilu_droptol = 1.0e-02; HYPRE_Int ilu_max_row_nnz = 1000; HYPRE_Int ilu_schur_max_iter = 3; HYPRE_Real ilu_nsh_droptol = 1.0e-02; /* end hypre ILU options */ /* hypre_FSAI options */ HYPRE_Int fsai_algo_type = 1; HYPRE_Int fsai_ls_type = 1; HYPRE_Int fsai_max_steps = 10; HYPRE_Int fsai_max_step_size = 1; HYPRE_Int fsai_max_nnz_row = 10; HYPRE_Int fsai_num_levels = 2; HYPRE_Real fsai_threshold = 1.0e-02; HYPRE_Int fsai_eig_max_iters = 5; HYPRE_Real fsai_kap_tolerance = 1.0e-03; /* end hypre FSAI options */ HYPRE_Real *nongalerk_tol = NULL; HYPRE_Int nongalerk_num_tol = 0; /* coasening data */ HYPRE_Int num_cpt = 0; HYPRE_Int num_fpt = 0; HYPRE_Int num_isolated_fpt = 0; HYPRE_BigInt *cpt_index = NULL; HYPRE_BigInt *fpt_index = NULL; HYPRE_BigInt *isolated_fpt_index = NULL; HYPRE_BigInt *row_nums = NULL; HYPRE_Int *num_cols = NULL; HYPRE_BigInt *col_nums = NULL; HYPRE_Int i_indx, j_indx, num_rows; HYPRE_Real *data = NULL; HYPRE_Int air = 0; HYPRE_Int **grid_relax_points = NULL; /* amg-dd options */ HYPRE_Int amgdd_start_level = 0; HYPRE_Int amgdd_padding = 1; HYPRE_Int amgdd_fac_num_relax = 1; HYPRE_Int amgdd_num_comp_cycles = 2; HYPRE_Int amgdd_fac_relax_type = 3; HYPRE_Int amgdd_fac_cycle_type = 1; HYPRE_Int amgdd_num_ghost_layers = 1; #if defined(HYPRE_USING_MEMORY_TRACKER) HYPRE_Int print_mem_tracker = 0; char mem_tracker_name[HYPRE_MAX_FILE_NAME_LEN] = {0}; #endif HYPRE_Int gpu_aware_mpi = 0; /* Initialize MPI */ hypre_MPI_Init(&argc, &argv); hypre_MPI_Comm_size(hypre_MPI_COMM_WORLD, &num_procs ); hypre_MPI_Comm_rank(hypre_MPI_COMM_WORLD, &myid ); /* Should we test library initialization? */ for (arg_index = 1; arg_index < argc; arg_index ++) { if (strcmp(argv[arg_index], "-test_init") == 0) { test_init = 1; } else if (strcmp(argv[arg_index], "-lazy_device_init") == 0) { lazy_device_init = atoi(argv[++arg_index]); } else if (strcmp(argv[arg_index], "-device_id") == 0) { device_id = atoi(argv[++arg_index]); } } /*----------------------------------------------------------------- * GPU Device binding * Must be done before HYPRE_Initialize() and should not be changed after *-----------------------------------------------------------------*/ hypre_bind_device_id(device_id, myid, num_procs, hypre_MPI_COMM_WORLD); /*----------------------------------------------------------- * Initialize : must be the first HYPRE function to call *-----------------------------------------------------------*/ if (test_init) { /* The library should not be initialized or finalized */ if (!HYPRE_Initialized() && !HYPRE_Finalized()) { hypre_ParPrintf(hypre_MPI_COMM_WORLD, "hypre library has not been initialized or finalized yet\n"); } HYPRE_Initialize(); /* Check if the library is in initialized state */ if (HYPRE_Initialized() && !HYPRE_Finalized()) { hypre_ParPrintf(hypre_MPI_COMM_WORLD, "hypre library has been initialized\n"); } HYPRE_Finalize(); /* Check if the library is in finalized state */ if (!HYPRE_Initialized() && HYPRE_Finalized()) { hypre_ParPrintf(hypre_MPI_COMM_WORLD, "hypre library has been finalized\n"); } HYPRE_Initialize(); /* Check if the library is in initialized state */ if (HYPRE_Initialized() && !HYPRE_Finalized()) { hypre_ParPrintf(hypre_MPI_COMM_WORLD, "hypre library has been re-initialized\n"); } HYPRE_Finalize(); /* Check if the library is in finalized state */ if (!HYPRE_Initialized() && HYPRE_Finalized()) { hypre_ParPrintf(hypre_MPI_COMM_WORLD, "hypre library has been finalized\n"); } hypre_MPI_Finalize(); return 0; } time_index = hypre_InitializeTiming("Hypre init"); hypre_BeginTiming(time_index); HYPRE_Initialize(); if (!lazy_device_init) { HYPRE_DeviceInitialize(); } hypre_EndTiming(time_index); hypre_PrintTiming("Hypre init times", hypre_MPI_COMM_WORLD); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); /* default execution policy and memory space */ #if defined(HYPRE_TEST_USING_HOST) HYPRE_MemoryLocation memory_location = HYPRE_MEMORY_HOST; HYPRE_ExecutionPolicy default_exec_policy = HYPRE_EXEC_HOST; HYPRE_ExecutionPolicy exec2_policy = HYPRE_EXEC_HOST; #else HYPRE_MemoryLocation memory_location = HYPRE_MEMORY_DEVICE; HYPRE_ExecutionPolicy default_exec_policy = HYPRE_EXEC_DEVICE; HYPRE_ExecutionPolicy exec2_policy = HYPRE_EXEC_DEVICE; #endif for (arg_index = 1; arg_index < argc; arg_index ++) { if ( strcmp(argv[arg_index], "-memory_host") == 0 ) { memory_location = HYPRE_MEMORY_HOST; } else if ( strcmp(argv[arg_index], "-memory_device") == 0 ) { memory_location = HYPRE_MEMORY_DEVICE; } else if ( strcmp(argv[arg_index], "-exec_host") == 0 ) { default_exec_policy = HYPRE_EXEC_HOST; } else if ( strcmp(argv[arg_index], "-exec_device") == 0 ) { default_exec_policy = HYPRE_EXEC_DEVICE; } else if ( strcmp(argv[arg_index], "-exec2_host") == 0 ) { exec2_policy = HYPRE_EXEC_HOST; } else if ( strcmp(argv[arg_index], "-exec2_device") == 0 ) { exec2_policy = HYPRE_EXEC_DEVICE; } } if (hypre_GetExecPolicy1(memory_location) == HYPRE_EXEC_DEVICE) { keepTranspose = 1; coarsen_type = 8; mod_rap2 = 1; } #if defined (HYPRE_USING_DEVICE_POOL) /* device pool allocator */ hypre_uint mempool_bin_growth = 8, mempool_min_bin = 3, mempool_max_bin = 9; size_t mempool_max_cached_bytes = 2000LL * 1024 * 1024; #elif defined (HYPRE_USING_UMPIRE) size_t umpire_dev_pool_size = 4294967296; // 4 GiB size_t umpire_uvm_pool_size = 4294967296; // 4 GiB size_t umpire_pinned_pool_size = 4294967296; // 4 GiB size_t umpire_host_pool_size = 4294967296; // 4 GiB #endif /*----------------------------------------------------------- * Set defaults *-----------------------------------------------------------*/ build_matrix_type = 2; build_matrix_arg_index = argc; build_matrix_M = 0; build_matrix_M_arg_index = argc; build_rhs_type = 2; build_rhs_arg_index = argc; build_src_type = -1; build_src_arg_index = argc; build_x0_type = -1; build_x0_arg_index = argc; build_funcs_type = 0; build_funcs_arg_index = argc; build_fpt_arg_index = 0; build_sfpt_arg_index = 0; build_cpt_arg_index = 0; IS_type = 1; debug_flag = 0; solver_id = 0; ioutdat = 3; poutdat = 1; hypre_sprintf (plot_file_name, "AMGgrids.CF.dat"); /*----------------------------------------------------------- * Parse command line *-----------------------------------------------------------*/ print_usage = 0; arg_index = 1; while ( (arg_index < argc) && (!print_usage) ) { if ( strcmp(argv[arg_index], "-ll") == 0 ) { arg_index++; log_level = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-frombinfile") == 0 ) { arg_index++; build_matrix_type = -2; build_matrix_arg_index = arg_index; } else if ( strcmp(argv[arg_index], "-fromfile") == 0 ) { arg_index++; build_matrix_type = -1; build_matrix_arg_index = arg_index; } else if ( strcmp(argv[arg_index], "-auxfromfile") == 0 ) { arg_index++; build_matrix_M = 1; build_matrix_M_arg_index = arg_index; } else if ( strcmp(argv[arg_index], "-fromparcsrfile") == 0 ) { arg_index++; build_matrix_type = 0; build_matrix_arg_index = arg_index; } else if ( strcmp(argv[arg_index], "-fromonecsrfile") == 0 ) { arg_index++; build_matrix_type = 1; build_matrix_arg_index = arg_index; } else if ( strcmp(argv[arg_index], "-laplacian") == 0 ) { arg_index++; build_matrix_type = 2; build_matrix_arg_index = arg_index; } else if ( strcmp(argv[arg_index], "-9pt") == 0 ) { arg_index++; build_matrix_type = 3; build_matrix_arg_index = arg_index; } else if ( strcmp(argv[arg_index], "-27pt") == 0 ) { arg_index++; build_matrix_type = 4; build_matrix_arg_index = arg_index; } else if ( strcmp(argv[arg_index], "-125pt") == 0 ) { arg_index++; build_matrix_type = 5; build_matrix_arg_index = arg_index; } else if ( strcmp(argv[arg_index], "-difconv") == 0 ) { arg_index++; build_matrix_type = 6; build_matrix_arg_index = arg_index; } else if ( strcmp(argv[arg_index], "-vardifconv") == 0 ) { arg_index++; build_matrix_type = 7; build_matrix_arg_index = arg_index; } else if ( strcmp(argv[arg_index], "-rotate") == 0 ) { arg_index++; build_matrix_type = 8; build_matrix_arg_index = arg_index; } else if ( strcmp(argv[arg_index], "-test_ij") == 0 ) { arg_index++; test_ij = 1; } else if ( strcmp(argv[arg_index], "-test_multivec") == 0 ) { arg_index++; test_multivec = 1; } else if ( strcmp(argv[arg_index], "-test_scaling") == 0 ) { arg_index++; test_scaling = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-test_error") == 0 ) { arg_index++; test_error = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-funcsfromonefile") == 0 ) { arg_index++; build_funcs_type = 1; build_funcs_arg_index = arg_index; } else if ( strcmp(argv[arg_index], "-funcsfromfile") == 0 ) { arg_index++; build_funcs_type = 2; build_funcs_arg_index = arg_index; } else if ( strcmp(argv[arg_index], "-mat-info") == 0 ) { arg_index++; print_matrix_info = 1; } else if ( strcmp(argv[arg_index], "-exact_size") == 0 ) { arg_index++; sparsity_known = 1; } else if ( strcmp(argv[arg_index], "-storage_low") == 0 ) { arg_index++; sparsity_known = 2; } else if ( strcmp(argv[arg_index], "-add") == 0 ) { arg_index++; add = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-chunk") == 0 ) { arg_index++; chunk = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-off_proc") == 0 ) { arg_index++; off_proc = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-omp") == 0 ) { arg_index++; omp_flag = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-check_constant") == 0 ) { arg_index++; check_constant = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-concrete_parcsr") == 0 ) { arg_index++; build_matrix_arg_index = arg_index; } else if ( strcmp(argv[arg_index], "-solver") == 0 ) { arg_index++; /* begin lobpcg */ if ( strcmp(argv[arg_index], "none") == 0 ) { solver_id = NO_SOLVER; arg_index++; } else /* end lobpcg */ { solver_id = atoi(argv[arg_index++]); } } else if ( strcmp(argv[arg_index], "-rbm") == 0 ) { arg_index++; build_rbm = 1; num_interp_vecs = atoi(argv[arg_index++]); build_rbm_index = arg_index; } else if ( strcmp(argv[arg_index], "-nc") == 0 ) { arg_index++; num_components = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-rhsfromfile") == 0 ) { arg_index++; build_rhs_type = 0; build_rhs_arg_index = arg_index; } else if ( strcmp(argv[arg_index], "-rhsfrombinfile") == 0 ) { arg_index++; build_rhs_type = -2; build_rhs_arg_index = arg_index; } else if ( strcmp(argv[arg_index], "-rhsfromonefile") == 0 ) { arg_index++; build_rhs_type = 1; build_rhs_arg_index = arg_index; } else if ( strcmp(argv[arg_index], "-rhsparcsrfile") == 0 ) { arg_index++; build_rhs_type = 7; build_rhs_arg_index = arg_index; } else if ( strcmp(argv[arg_index], "-rhsisone") == 0 ) { arg_index++; build_rhs_type = 2; build_rhs_arg_index = arg_index; } else if ( strcmp(argv[arg_index], "-rhsrand") == 0 ) { arg_index++; build_rhs_type = 3; build_rhs_arg_index = arg_index; } else if ( strcmp(argv[arg_index], "-xisone") == 0 ) { arg_index++; build_rhs_type = 4; build_rhs_arg_index = arg_index; } else if ( strcmp(argv[arg_index], "-rhszero") == 0 ) { arg_index++; build_rhs_type = 5; build_rhs_arg_index = arg_index; } else if ( strcmp(argv[arg_index], "-srcfromfile") == 0 ) { arg_index++; build_src_type = 0; build_rhs_type = -1; build_src_arg_index = arg_index; } else if ( strcmp(argv[arg_index], "-srcfromonefile") == 0 ) { arg_index++; build_src_type = 1; build_rhs_type = -1; build_src_arg_index = arg_index; } else if ( strcmp(argv[arg_index], "-srcisone") == 0 ) { arg_index++; build_src_type = 2; build_rhs_type = -1; build_src_arg_index = arg_index; } else if ( strcmp(argv[arg_index], "-srcrand") == 0 ) { arg_index++; build_src_type = 3; build_rhs_type = -1; build_src_arg_index = arg_index; } else if ( strcmp(argv[arg_index], "-srczero") == 0 ) { arg_index++; build_src_type = 4; build_rhs_type = -1; build_src_arg_index = arg_index; } else if ( strcmp(argv[arg_index], "-x0frombinfile") == 0 ) { arg_index++; build_x0_type = -2; build_x0_arg_index = arg_index; } else if ( strcmp(argv[arg_index], "-x0fromfile") == 0 ) { arg_index++; build_x0_type = 0; build_x0_arg_index = arg_index; } else if ( strcmp(argv[arg_index], "-x0parcsrfile") == 0 ) { arg_index++; build_x0_type = 7; build_x0_arg_index = arg_index; } else if ( strcmp(argv[arg_index], "-x0rand") == 0 ) { arg_index++; build_x0_type = 1; build_x0_arg_index = arg_index; } else if ( strcmp(argv[arg_index], "-CFfromfile") == 0 ) { arg_index++; coarsen_type = 999; } else if ( strcmp(argv[arg_index], "-Ffromonefile") == 0 ) { arg_index++; build_fpt_arg_index = arg_index; } else if ( strcmp(argv[arg_index], "-SFfromonefile") == 0 ) { arg_index++; build_sfpt_arg_index = arg_index; } else if ( strcmp(argv[arg_index], "-Cfromonefile") == 0 ) { arg_index++; build_cpt_arg_index = arg_index; } else if ( strcmp(argv[arg_index], "-cljp") == 0 ) { arg_index++; coarsen_type = 0; } else if ( strcmp(argv[arg_index], "-cljp1") == 0 ) { arg_index++; coarsen_type = 7; } else if ( strcmp(argv[arg_index], "-cgc") == 0 ) { arg_index++; coarsen_type = 21; cgcits = 200; } else if ( strcmp(argv[arg_index], "-cgce") == 0 ) { arg_index++; coarsen_type = 22; cgcits = 200; } else if ( strcmp(argv[arg_index], "-pmis") == 0 ) { arg_index++; coarsen_type = 8; } else if ( strcmp(argv[arg_index], "-pmis1") == 0 ) { arg_index++; coarsen_type = 9; } else if ( strcmp(argv[arg_index], "-cr1") == 0 ) { arg_index++; coarsen_type = 98; } else if ( strcmp(argv[arg_index], "-cr") == 0 ) { arg_index++; coarsen_type = 99; } else if ( strcmp(argv[arg_index], "-crcg") == 0 ) { arg_index++; CR_use_CG = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-hmis") == 0 ) { arg_index++; coarsen_type = 10; } else if ( strcmp(argv[arg_index], "-ruge") == 0 ) { arg_index++; coarsen_type = 1; } else if ( strcmp(argv[arg_index], "-ruge1p") == 0 ) { arg_index++; coarsen_type = 11; } else if ( strcmp(argv[arg_index], "-ruge2b") == 0 ) { arg_index++; coarsen_type = 2; } else if ( strcmp(argv[arg_index], "-ruge3") == 0 ) { arg_index++; coarsen_type = 3; } else if ( strcmp(argv[arg_index], "-ruge3c") == 0 ) { arg_index++; coarsen_type = 4; } else if ( strcmp(argv[arg_index], "-rugerlx") == 0 ) { arg_index++; coarsen_type = 5; } else if ( strcmp(argv[arg_index], "-falgout") == 0 ) { arg_index++; coarsen_type = 6; } else if ( strcmp(argv[arg_index], "-gm") == 0 ) { arg_index++; measure_type = 1; } else if ( strcmp(argv[arg_index], "-is") == 0 ) { arg_index++; IS_type = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-ncr") == 0 ) { arg_index++; num_CR_relax_steps = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-crth") == 0 ) { arg_index++; CR_rate = (HYPRE_Real)atof(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-crst") == 0 ) { arg_index++; CR_strong_th = (HYPRE_Real)atof(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-rlx") == 0 ) { arg_index++; relax_type = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-rlx_coarse") == 0 ) { arg_index++; relax_coarse = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-rlx_down") == 0 ) { arg_index++; relax_down = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-rlx_up") == 0 ) { arg_index++; relax_up = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-smtype") == 0 ) { arg_index++; smooth_type = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-smlv") == 0 ) { arg_index++; smooth_num_levels = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-mxl") == 0 ) { arg_index++; max_levels = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-dbg") == 0 ) { arg_index++; debug_flag = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-nf") == 0 ) { arg_index++; num_functions = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-ff") == 0 ) { arg_index++; filter_functions = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-agg_nl") == 0 ) { arg_index++; agg_num_levels = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-npaths") == 0 ) { arg_index++; num_paths = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-ns") == 0 ) { arg_index++; num_sweeps = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-ns_coarse") == 0 ) { arg_index++; ns_coarse = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-ns_down") == 0 ) { arg_index++; ns_down = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-ns_up") == 0 ) { arg_index++; ns_up = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-sns") == 0 ) { arg_index++; smooth_num_sweeps = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-max_iter") == 0 ) { arg_index++; max_iter = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-mg_max_iter") == 0 ) { arg_index++; mg_max_iter = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-dt") == 0 ) { arg_index++; dt = (HYPRE_Real)atof(argv[arg_index++]); build_rhs_type = -1; if ( build_src_type == -1 ) { build_src_type = 2; } } else if ( strcmp(argv[arg_index], "-restritype") == 0 ) { arg_index++; restri_type = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-help") == 0 ) { print_usage = 1; } /* begin lobpcg */ else if ( strcmp(argv[arg_index], "-lobpcg") == 0 ) { /* use lobpcg */ arg_index++; lobpcgFlag = 1; } else if ( strcmp(argv[arg_index], "-gen") == 0 ) { /* generalized evp */ arg_index++; lobpcgGen = 1; } else if ( strcmp(argv[arg_index], "-con") == 0 ) { /* constrained evp */ arg_index++; constrained = 1; } else if ( strcmp(argv[arg_index], "-orthchk") == 0 ) { /* lobpcg: check orthonormality */ arg_index++; checkOrtho = 1; } else if ( strcmp(argv[arg_index], "-vfromfile") == 0 ) { /* lobpcg: get initial vectors from file */ arg_index++; vFromFileFlag = 1; } else if ( strcmp(argv[arg_index], "-vrand") == 0 ) { /* lobpcg: block size */ arg_index++; blockSize = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-seed") == 0 ) { /* lobpcg: seed for srand */ arg_index++; lobpcgSeed = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-itr") == 0 ) { /* lobpcg: max # of iterations */ arg_index++; maxIterations = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-verb") == 0 ) { /* lobpcg: verbosity level */ arg_index++; verbosity = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-vout") == 0 ) { /* lobpcg: print level */ arg_index++; printLevel = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-pcgitr") == 0 ) { /* lobpcg: inner pcg iterations */ arg_index++; pcgIterations = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-pcgtol") == 0 ) { /* lobpcg: inner pcg iterations */ arg_index++; pcgTol = (HYPRE_Real)atof(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-pcgmode") == 0 ) { /* lobpcg: initial guess for inner pcg */ arg_index++; /* 0: zero, otherwise rhs */ pcgMode = atoi(argv[arg_index++]); } /* end lobpcg */ /* begin mgr options*/ else if ( strcmp(argv[arg_index], "-mgr_bsize") == 0 ) { /* mgr block size */ arg_index++; mgr_bsize = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-mgr_nlevels") == 0 ) { /* mgr number of coarsening levels */ arg_index++; mgr_nlevels = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-mgr_non_c_to_f") == 0 ) { /* mgr intermediate coarse grid strategy */ arg_index++; mgr_non_c_to_f = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-mgr_num_reserved_nodes") == 0 ) { /* mgr number of reserved nodes to be put on coarsest grid */ arg_index++; mgr_num_reserved_nodes = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-mgr_frelax_method") == 0 ) { /* mgr F-relaxation strategy: single/ multi level */ arg_index++; mgr_frelax_method = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-mgr_relax_type") == 0 ) { /* relax type for "single level" F-relaxation */ arg_index++; mgr_relax_type = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-mgr_relax_sweeps") == 0 ) { /* number of relaxation sweeps */ arg_index++; mgr_num_relax_sweeps = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-mgr_interp_type") == 0 ) { /* interpolation type */ arg_index++; mgr_interp_type = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-mgr_interp_sweeps") == 0 ) { /* number of interpolation sweeps*/ arg_index++; mgr_num_interp_sweeps = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-mgr_gsmooth_type") == 0 ) { /* global smoother type */ arg_index++; mgr_gsmooth_type = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-mgr_gsmooth_sweeps") == 0 ) { /* number of global smooth sweeps*/ arg_index++; mgr_num_gsmooth_sweeps = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-mgr_restrict_type") == 0 ) { /* restriction type */ arg_index++; mgr_restrict_type = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-mgr_restrict_sweeps") == 0 ) { /* number of restriction sweeps*/ arg_index++; mgr_num_restrict_sweeps = atoi(argv[arg_index++]); } /* end mgr options */ /* begin ilu options*/ else if ( strcmp(argv[arg_index], "-ilu_type") == 0 ) { /* ilu_type */ arg_index++; ilu_type = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-ilu_sm_max_iter") == 0 ) { /* number of iteration when applied as a smoother */ arg_index++; ilu_sm_max_iter = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-ilu_lfil") == 0 ) { /* level of fill */ arg_index++; ilu_lfil = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-ilu_reordering") == 0 ) { /* local reordering type */ arg_index++; ilu_reordering = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-ilu_trisolve") == 0 ) { /* Triangular solver type */ arg_index++; ilu_tri_solve = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-ilu_ljac_iters") == 0 ) { /* Lower Jacobi Iterations */ arg_index++; ilu_ljac_iters = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-ilu_ujac_iters") == 0 ) { /* Upper Jacobi Iterations */ arg_index++; ilu_ujac_iters = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-ilu_iter_setup_type") == 0 ) { /* Iterative setup for ILU (only with rocSPARSE)*/ arg_index++; ilu_iter_setup_type = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-ilu_iter_setup_option") == 0 ) { /* Iterative setup for ILU (only with rocSPARSE)*/ arg_index++; ilu_iter_setup_option = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-ilu_iter_setup_option") == 0 ) { /* Iterative setup for ILU (only with rocSPARSE)*/ arg_index++; ilu_iter_setup_option = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-ilu_iter_setup_max_iter") == 0 ) { /* Iterative setup for ILU (only with rocSPARSE)*/ arg_index++; ilu_iter_setup_max_iter = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-ilu_iter_setup_tolerance") == 0 ) { /* Iterative setup for ILU (only with rocSPARSE)*/ arg_index++; ilu_iter_setup_tolerance = atof(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-ilu_droptol") == 0 ) { /* drop tolerance */ arg_index++; ilu_droptol = (HYPRE_Real)atof(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-ilu_max_row_nnz") == 0 ) { /* Max number of nonzeros to keep per row */ arg_index++; ilu_max_row_nnz = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-ilu_schur_max_iter") == 0 ) { /* Max number of iterations for schur system solver */ arg_index++; ilu_schur_max_iter = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-ilu_nsh_droptol") == 0 ) { /* Max number of iterations for schur system solver */ arg_index++; ilu_nsh_droptol = (HYPRE_Real)atof(argv[arg_index++]); } /* end ilu options */ /* begin FSAI options*/ else if ( strcmp(argv[arg_index], "-fs_algo_type") == 0 ) { arg_index++; fsai_algo_type = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-fs_ls_type") == 0 ) { arg_index++; fsai_ls_type = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-fs_max_steps") == 0 ) { arg_index++; fsai_max_steps = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-fs_max_step_size") == 0 ) { arg_index++; fsai_max_step_size = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-fs_max_nnz_row") == 0 ) { arg_index++; fsai_max_nnz_row = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-fs_num_levels") == 0 ) { arg_index++; fsai_num_levels = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-fs_threshold") == 0 ) { arg_index++; fsai_threshold = atof(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-fs_eig_max_iters") == 0 ) { arg_index++; fsai_eig_max_iters = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-fs_kap_tol") == 0 ) { arg_index++; fsai_kap_tolerance = (HYPRE_Real)atof(argv[arg_index++]); } /* end FSAI options */ #if defined(HYPRE_USING_GPU) else if ( strcmp(argv[arg_index], "-mm_vendor") == 0 ) { arg_index++; spgemm_use_vendor = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-nmv") == 0 ) { arg_index++; nmv = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-mv_vendor") == 0 ) { arg_index++; spmv_use_vendor = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-spgemm_alg") == 0 ) { arg_index++; spgemm_alg = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-spgemm_binned") == 0 ) { arg_index++; spgemm_binned = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-spgemm_rowest") == 0 ) { arg_index++; spgemm_rowest_mtd = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-spgemm_rowestmult") == 0 ) { arg_index++; spgemm_rowest_mult = (HYPRE_Real)atof(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-spgemm_rowestnsamples") == 0 ) { arg_index++; spgemm_rowest_nsamples = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-use_curand") == 0 ) { arg_index++; use_curand = atoi(argv[arg_index++]); } #endif #if defined (HYPRE_USING_DEVICE_POOL) else if ( strcmp(argv[arg_index], "-mempool_growth") == 0 ) { arg_index++; mempool_bin_growth = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-mempool_minbin") == 0 ) { arg_index++; mempool_min_bin = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-mempool_maxbin") == 0 ) { arg_index++; mempool_max_bin = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-mempool_maxcached") == 0 ) { // Give maximum cached in Mbytes. arg_index++; mempool_max_cached_bytes = atoi(argv[arg_index++]) * 1024LL * 1024LL; } #elif defined (HYPRE_USING_UMPIRE) else if ( strcmp(argv[arg_index], "-umpire_dev_pool_size") == 0 ) { arg_index++; umpire_dev_pool_size = (size_t) 1073741824 * atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-umpire_uvm_pool_size") == 0 ) { arg_index++; umpire_uvm_pool_size = (size_t) 1073741824 * atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-umpire_pinned_pool_size") == 0 ) { arg_index++; umpire_pinned_pool_size = (size_t) 1073741824 * atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-umpire_host_pool_size") == 0 ) { arg_index++; umpire_host_pool_size = (size_t) 1073741824 * atoi(argv[arg_index++]); } #endif else if ( strcmp(argv[arg_index], "-negA") == 0 ) { arg_index++; negA = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-second_time") == 0 ) { arg_index++; second_time = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-benchmark") == 0 ) { arg_index++; benchmark = atoi(argv[arg_index++]); } #if defined(HYPRE_USING_MEMORY_TRACKER) else if ( strcmp(argv[arg_index], "-print_mem_tracker") == 0 ) { arg_index++; print_mem_tracker = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-mem_tracker_filename") == 0 ) { arg_index++; snprintf(mem_tracker_name, HYPRE_MAX_FILE_NAME_LEN, "%s", argv[arg_index++]); } #endif else if ( strcmp(argv[arg_index], "-gpu_mpi") == 0 ) { arg_index++; gpu_aware_mpi = atoi(argv[arg_index++]); } else { arg_index++; } } /* begin CGC BM Aug 25, 2006 */ if (coarsen_type == 21 || coarsen_type == 22) { arg_index = 0; while ( (arg_index < argc) && (!print_usage) ) { if ( strcmp(argv[arg_index], "-cgcits") == 0 ) { arg_index++; cgcits = atoi(argv[arg_index++]); } else { arg_index++; } } } /* begin lobpcg */ if ( solver_id == 0 && lobpcgFlag ) { solver_id = 1; } /* end lobpcg */ if (solver_id == 8 || solver_id == 18) { max_levels = 1; } /* defaults for BoomerAMG */ if (solver_id == 0 || solver_id == 1 || solver_id == 3 || solver_id == 5 || solver_id == 9 || solver_id == 13 || solver_id == 14 || solver_id == 15 || solver_id == 20 || solver_id == 51 || solver_id == 61 || solver_id == 16 || solver_id == 70 || solver_id == 71 || solver_id == 72 || solver_id == 90 || solver_id == 91) { strong_threshold = 0.25; strong_thresholdR = 0.25; filter_thresholdR = 0.00; trunc_factor = 0.; jacobi_trunc_threshold = 0.01; cycle_type = 1; fcycle = 0; relax_wt = 1.; outer_wt = 1.; /* for CGNR preconditioned with Boomeramg, only relaxation scheme 0 is implemented, i.e. Jacobi relaxation, and needs to be used without CF ordering */ if (solver_id == 5) { relax_type = 0; relax_order = 0; } } /* defaults for Schwarz */ variant = 0; /* multiplicative */ overlap = 1; /* 1 layer overlap */ domain_type = 2; /* through agglomeration */ schwarz_rlx_weight = 1.; /* defaults for GMRES */ k_dim = 5; cgs = 1; unroll = 0; /* defaults for LGMRES - should use a larger k_dim, though*/ aug_dim = 2; arg_index = 0; while (arg_index < argc) { if ( strcmp(argv[arg_index], "-k") == 0 ) { arg_index++; k_dim = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-cgs") == 0 ) { arg_index++; cgs = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-unroll") == 0 ) { arg_index++; unroll = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-check_residual") == 0 ) { arg_index++; check_residual = 1; } else if ( strcmp(argv[arg_index], "-aug") == 0 ) { arg_index++; aug_dim = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-w") == 0 ) { arg_index++; relax_wt = (HYPRE_Real)atof(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-wl") == 0 ) { arg_index++; relax_wt_level = (HYPRE_Real)atof(argv[arg_index++]); level_w = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-ow") == 0 ) { arg_index++; outer_wt = (HYPRE_Real)atof(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-owl") == 0 ) { arg_index++; outer_wt_level = (HYPRE_Real)atof(argv[arg_index++]); level_ow = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-sw") == 0 ) { arg_index++; schwarz_rlx_weight = (HYPRE_Real)atof(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-adroptol") == 0 ) { arg_index++; A_drop_tol = (HYPRE_Real)atof(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-adroptype") == 0 ) { arg_index++; A_drop_type = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-coarse_th") == 0 ) { arg_index++; coarse_threshold = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-min_cs") == 0 ) { arg_index++; min_coarse_size = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-seq_th") == 0 ) { arg_index++; seq_threshold = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-red") == 0 ) { arg_index++; redundant = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-cutf") == 0 ) { arg_index++; coarsen_cut_factor = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-th") == 0 ) { arg_index++; strong_threshold = (HYPRE_Real)atof(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-thR") == 0 ) { arg_index++; strong_thresholdR = (HYPRE_Real)atof(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-fltr_thR") == 0 ) { arg_index++; filter_thresholdR = (HYPRE_Real)atof(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-CF") == 0 ) { arg_index++; relax_order = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-cf") == 0 ) { arg_index++; cf_tol = (HYPRE_Real)atof(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-tol") == 0 ) { arg_index++; tol = (HYPRE_Real)atof(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-conv_type") == 0 ) { arg_index++; converge_type = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-atol") == 0 ) { arg_index++; atol = (HYPRE_Real)atof(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-mxrs") == 0 ) { arg_index++; max_row_sum = (HYPRE_Real)atof(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-sai_th") == 0 ) { arg_index++; sai_threshold = (HYPRE_Real)atof(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-sai_filt") == 0 ) { arg_index++; sai_filter = (HYPRE_Real)atof(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-drop_tol") == 0 ) { arg_index++; drop_tol = (HYPRE_Real)atof(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-nonzeros_to_keep") == 0 ) { arg_index++; nonzeros_to_keep = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-ilut") == 0 ) { arg_index++; eu_ilut = (HYPRE_Real)atof(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-sparseA") == 0 ) { arg_index++; eu_sparse_A = (HYPRE_Real)atof(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-rowScale") == 0 ) { arg_index++; eu_row_scale = 1; } else if ( strcmp(argv[arg_index], "-level") == 0 ) { arg_index++; eu_level = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-bj") == 0 ) { arg_index++; eu_bj = 1; } else if ( strcmp(argv[arg_index], "-eu_stats") == 0 ) { arg_index++; eu_stats = 1; } else if ( strcmp(argv[arg_index], "-eu_mem") == 0 ) { arg_index++; eu_mem = 1; } else if ( strcmp(argv[arg_index], "-tr") == 0 ) { arg_index++; trunc_factor = (HYPRE_Real)atof(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-Pmx") == 0 ) { arg_index++; P_max_elmts = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-interpvecvar") == 0 ) { arg_index++; interp_vec_variant = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-Qtr") == 0 ) { arg_index++; Q_trunc = (HYPRE_Real)atof(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-Qmx") == 0 ) { arg_index++; Q_max = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-jtr") == 0 ) { arg_index++; jacobi_trunc_threshold = (HYPRE_Real)atof(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-Ssw") == 0 ) { arg_index++; S_commpkg_switch = (HYPRE_Real)atof(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-solver_type") == 0 ) { arg_index++; solver_type = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-recompute") == 0 ) { arg_index++; recompute_res = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-iout") == 0 ) { arg_index++; ioutdat = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-pout") == 0 ) { arg_index++; poutdat = atoi(argv[arg_index++]); poutusr = 1; } else if ( strcmp(argv[arg_index], "-skipbreak") == 0 ) { arg_index++; skip_break = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-flex") == 0 ) { arg_index++; flex = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-var") == 0 ) { arg_index++; variant = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-use_ns") == 0 ) { arg_index++; use_nonsymm_schwarz = 1; } else if ( strcmp(argv[arg_index], "-ov") == 0 ) { arg_index++; overlap = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-dom") == 0 ) { arg_index++; domain_type = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-blk_sm") == 0 ) { arg_index++; smooth_num_levels = atoi(argv[arg_index++]); overlap = 0; smooth_type = 6; domain_type = 1; } else if ( strcmp(argv[arg_index], "-mu") == 0 ) { arg_index++; cycle_type = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-fmg") == 0 ) { arg_index++; fcycle = 1; } else if ( strcmp(argv[arg_index], "-numsamp") == 0 ) { arg_index++; gsmg_samples = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-interptype") == 0 ) { arg_index++; interp_type = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-agg_interp") == 0 ) { arg_index++; agg_interp_type = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-agg_Pmx") == 0 ) { arg_index++; agg_P_max_elmts = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-agg_P12_mx") == 0 ) { arg_index++; agg_P12_max_elmts = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-agg_tr") == 0 ) { arg_index++; agg_trunc_factor = (HYPRE_Real)atof(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-agg_P12_tr") == 0 ) { arg_index++; agg_P12_trunc_factor = (HYPRE_Real)atof(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-postinterptype") == 0 ) { arg_index++; post_interp_type = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-nodal") == 0 ) { arg_index++; nodal = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-rel_change") == 0 ) { arg_index++; rel_change = 1; } else if ( strcmp(argv[arg_index], "-nodal_diag") == 0 ) { arg_index++; nodal_diag = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-keepSS") == 0 ) { arg_index++; keep_same_sign = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-cheby_order") == 0 ) { arg_index++; cheby_order = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-cheby_eig_est") == 0 ) { arg_index++; cheby_eig_est = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-cheby_variant") == 0 ) { arg_index++; cheby_variant = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-cheby_scale") == 0 ) { arg_index++; cheby_scale = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-cheby_fraction") == 0 ) { arg_index++; cheby_fraction = (HYPRE_Real)atof(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-additive") == 0 ) { arg_index++; additive = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-mult_add") == 0 ) { arg_index++; mult_add = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-simple") == 0 ) { arg_index++; simple = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-add_end") == 0 ) { arg_index++; add_last_lvl = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-add_Pmx") == 0 ) { arg_index++; add_P_max_elmts = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-add_tr") == 0 ) { arg_index++; add_trunc_factor = (HYPRE_Real)atof(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-add_rlx") == 0 ) { arg_index++; add_relax_type = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-add_w") == 0 ) { arg_index++; add_relax_wt = (HYPRE_Real)atof(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-rap") == 0 ) { arg_index++; rap2 = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-mod_rap2") == 0 ) { arg_index++; mod_rap2 = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-keepT") == 0 ) { arg_index++; keepTranspose = atoi(argv[arg_index++]); } #ifdef HYPRE_USING_DSUPERLU else if ( strcmp(argv[arg_index], "-dslu_th") == 0 ) { arg_index++; dslu_threshold = atoi(argv[arg_index++]); } #endif else if ( strcmp(argv[arg_index], "-nongalerk_tol") == 0 ) { arg_index++; nongalerk_num_tol = atoi(argv[arg_index++]); nongalerk_tol = hypre_CTAlloc(HYPRE_Real, nongalerk_num_tol, HYPRE_MEMORY_HOST); for (i = 0; i < nongalerk_num_tol; i++) { nongalerk_tol[i] = (HYPRE_Real)atof(argv[arg_index++]); } } else if ( strcmp(argv[arg_index], "-print") == 0 ) { arg_index++; print_system = 1; } else if ( strcmp(argv[arg_index], "-printbin") == 0 ) { arg_index++; print_system_binary = 1; } /* BM Oct 23, 2006 */ else if ( strcmp(argv[arg_index], "-plot_grids") == 0 ) { arg_index++; plot_grids = 1; } else if ( strcmp(argv[arg_index], "-plot_file_name") == 0 ) { arg_index++; hypre_sprintf (plot_file_name, "%s", argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-AIR") == 0 ) { arg_index++; air = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-amgdd_start_level") == 0 ) { arg_index++; amgdd_start_level = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-amgdd_padding") == 0 ) { arg_index++; amgdd_padding = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-amgdd_fac_num_relax") == 0 ) { arg_index++; amgdd_fac_num_relax = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-amgdd_num_comp_cycles") == 0 ) { arg_index++; amgdd_num_comp_cycles = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-amgdd_fac_relax_type") == 0 ) { arg_index++; amgdd_fac_relax_type = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-amgdd_fac_cycle_type") == 0 ) { arg_index++; amgdd_fac_cycle_type = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-amgdd_num_ghost_layers") == 0 ) { arg_index++; amgdd_num_ghost_layers = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-precon_cycles") == 0 ) { arg_index++; precon_cycles = atoi(argv[arg_index++]); } else { arg_index++; } } /* default settings for AIR alg. */ if (air) { restri_type = air; /* Set Restriction to be AIR */ interp_type = 100; /* 1-pt Interp */ if (hypre_GetExecPolicy1(memory_location) == HYPRE_EXEC_DEVICE) { relax_type = 7; } else { relax_type = 0; } ns_down = 0; ns_up = 3; /* this is a 2-D 4-by-k array using Double pointers */ grid_relax_points = hypre_CTAlloc(HYPRE_Int*, 4, HYPRE_MEMORY_HOST); grid_relax_points[0] = NULL; grid_relax_points[1] = hypre_CTAlloc(HYPRE_Int, ns_down, HYPRE_MEMORY_HOST); grid_relax_points[2] = hypre_CTAlloc(HYPRE_Int, ns_up, HYPRE_MEMORY_HOST); grid_relax_points[3] = hypre_CTAlloc(HYPRE_Int, ns_coarse, HYPRE_MEMORY_HOST); /* down cycle: C */ for (i = 0; i < ns_down; i++) { grid_relax_points[1][i] = 0;//1; } /* up cycle: F */ //for (i=0; i]\n", argv[0]); hypre_printf("\n"); hypre_printf(" -ll : hypre's log level. \n"); hypre_printf(" 0 = (default) No messaging.\n"); hypre_printf(" 1 = Display memory usage statistics for each MPI rank.\n"); hypre_printf(" 2 = Display aggregate memory usage statistics over MPI ranks.\n"); hypre_printf(" -fromfile : "); hypre_printf("matrix read from multiple files (IJ format)\n"); hypre_printf(" -frombinfile : "); hypre_printf("matrix read from multiple binary files (IJ format)\n"); hypre_printf(" -fromparcsrfile : "); hypre_printf("matrix read from multiple files (ParCSR format)\n"); hypre_printf(" -fromonecsrfile : "); hypre_printf("matrix read from a single file (CSR format)\n"); hypre_printf("\n"); hypre_printf(" -laplacian : build 5pt 2D laplacian problem (default) \n"); hypre_printf(" -sysL : build SYSTEMS laplacian 7pt operator\n"); hypre_printf(" -9pt [] : build 9pt 2D laplacian problem\n"); hypre_printf(" -27pt [] : build 27pt 3D laplacian problem\n"); hypre_printf(" -125pt [] : build 125pt (27pt squared) 3D laplacian\n"); hypre_printf(" -difconv [] : build convection-diffusion problem\n"); hypre_printf(" -vardifconv [] : build variable conv.-diffusion problem\n"); hypre_printf(" -rotate [] : build 7pt rotated laplacian problem\n"); hypre_printf(" -n : total problem size \n"); hypre_printf(" -P : processor topology\n"); hypre_printf(" -c : diffusion coefficients\n"); hypre_printf(" -a : convection coefficients\n"); hypre_printf(" -atype : FD scheme for convection \n"); hypre_printf(" 0=Forward (default) 1=Backward\n"); hypre_printf(" 2=Centered 3=Upwind\n"); hypre_printf("\n"); hypre_printf(" -exact_size : inserts immediately into ParCSR structure\n"); hypre_printf(" -storage_low : allocates not enough storage for aux struct\n"); hypre_printf(" -concrete_parcsr : use parcsr matrix type as concrete type\n"); hypre_printf("\n"); hypre_printf(" -rbm : rigid body mode vectors\n"); hypre_printf(" -nc : number of components of a vector (multivector)\n"); hypre_printf(" -rhsfromfile : "); hypre_printf("rhs read from multiple files (IJ format)\n"); hypre_printf(" -rhsfrombinfile : "); hypre_printf("rhs read from multiple binary files (IJ format)\n"); hypre_printf(" -rhsfromonefile : "); hypre_printf("rhs read from a single file (CSR format)\n"); hypre_printf(" -rhsparcsrfile : "); hypre_printf("rhs read from multiple files (ParCSR format)\n"); hypre_printf(" -Ffromonefile : "); hypre_printf("list of F points from a single file\n"); hypre_printf(" -SFfromonefile : "); hypre_printf("list of isolated F points from a single file\n"); hypre_printf(" -rhsrand : rhs is random vector\n"); hypre_printf(" -rhsisone : rhs is vector with unit coefficients (default)\n"); hypre_printf(" -xisone : solution of all ones\n"); hypre_printf(" -rhszero : rhs is zero vector\n"); hypre_printf("\n"); hypre_printf(" -dt : specify finite backward Euler time step\n"); hypre_printf(" : -rhsfromfile, -rhsfromonefile, -rhsrand,\n"); hypre_printf(" : -rhsrand, or -xisone will be ignored\n"); hypre_printf(" -srcfromfile : "); hypre_printf("backward Euler source read from multiple files (IJ format)\n"); hypre_printf(" -srcfromonefile : "); hypre_printf("backward Euler source read from a single file (IJ format)\n"); hypre_printf(" -srcrand : "); hypre_printf("backward Euler source is random vector with coefficients in range 0 - 1\n"); hypre_printf(" -srcisone : "); hypre_printf("backward Euler source is vector with unit coefficients (default)\n"); hypre_printf(" -srczero : "); hypre_printf("backward Euler source is zero-vector\n"); hypre_printf(" -x0fromfile : "); hypre_printf("initial guess x0 read from multiple files (IJ format)\n"); hypre_printf("\n"); hypre_printf(" -solver : solver ID\n"); hypre_printf(" 0=AMG 1=AMG-PCG \n"); hypre_printf(" 2=DS-PCG 3=AMG-GMRES \n"); hypre_printf(" 4=DS-GMRES 5=AMG-CGNR \n"); hypre_printf(" 6=DS-CGNR 7=PILUT-GMRES \n"); hypre_printf(" 8=ParaSails-PCG 9=AMG-BiCGSTAB \n"); hypre_printf(" 10=DS-BiCGSTAB 11=PILUT-BiCGSTAB \n"); hypre_printf(" 12=Schwarz-PCG 13=GSMG \n"); hypre_printf(" 14=GSMG-PCG 15=GSMG-GMRES\n"); hypre_printf(" 16=AMG-COGMRES 17=DIAG-COGMRES\n"); hypre_printf(" 18=ParaSails-GMRES\n"); hypre_printf(" 20=Hybrid solver/ DiagScale, AMG \n"); hypre_printf(" 31=FSAI-PCG \n"); hypre_printf(" 43=Euclid-PCG 44=Euclid-GMRES \n"); hypre_printf(" 45=Euclid-BICGSTAB 46=Euclid-COGMRES\n"); hypre_printf(" 47=Euclid-FlexGMRES\n"); hypre_printf(" 50=DS-LGMRES 51=AMG-LGMRES \n"); hypre_printf(" 60=DS-FlexGMRES 61=AMG-FlexGMRES \n"); hypre_printf(" 70=MGR 71=MGR-PCG \n"); hypre_printf(" 72=MGR-FlexGMRES 73=MGR-BICGSTAB \n"); hypre_printf(" 74=MGR-COGMRES \n"); hypre_printf(" 80=ILU 81=ILU-GMRES \n"); hypre_printf(" 82=ILU-FlexGMRES \n"); hypre_printf(" 90=AMG-DD 91=AMG-DD-GMRES \n"); hypre_printf("\n"); hypre_printf(" -cljp : CLJP coarsening \n"); hypre_printf(" -cljp1 : CLJP coarsening, fixed random \n"); hypre_printf(" -cgc : CGC coarsening \n"); hypre_printf(" -cgce : CGC-E coarsening \n"); hypre_printf(" -pmis : PMIS coarsening \n"); hypre_printf(" -pmis1 : PMIS coarsening, fixed random \n"); hypre_printf(" -hmis : HMIS coarsening (default)\n"); hypre_printf(" -ruge : Ruge-Stueben coarsening (local)\n"); hypre_printf(" -ruge1p : Ruge-Stueben coarsening 1st pass only(local)\n"); hypre_printf(" -ruge3 : third pass on boundary\n"); hypre_printf(" -ruge3c : third pass on boundary, keep c-points\n"); hypre_printf(" -falgout : local Ruge_Stueben followed by CLJP\n"); hypre_printf(" -gm : use global measures\n"); hypre_printf("\n"); hypre_printf(" -interptype : set interpolation type\n"); hypre_printf(" 0=Classical modified interpolation \n"); hypre_printf(" 1=least squares interpolation (for GSMG only) \n"); hypre_printf(" 0=Classical modified interpolation for hyperbolic PDEs \n"); hypre_printf(" 3=direct interpolation with separation of weights \n"); hypre_printf(" 15=direct interpolation\n"); hypre_printf(" 4=multipass interpolation \n"); hypre_printf(" 5=multipass interpolation with separation of weights \n"); hypre_printf(" 6=extended classical modified interpolation (default) \n"); hypre_printf(" 7=extended (only if no common C neighbor) interpolation \n"); hypre_printf(" 8=standard interpolation \n"); hypre_printf(" 9=standard interpolation with separation of weights \n"); hypre_printf(" 12=FF interpolation \n"); hypre_printf(" 13=FF1 interpolation \n"); hypre_printf(" 16=use modified unknown interpolation for a system (w/unknown or hybrid approach) \n"); hypre_printf(" 17=use non-systems interp = 6 for a system (w/unknown or hybrid approach) \n"); hypre_printf(" 18=use non-systems interp = 8 for a system (w/unknown or hybrid approach) \n"); hypre_printf(" 19=use non-systems interp = 0 for a system (w/unknown or hybrid approach) \n"); hypre_printf(" 10=classical block interpolation for nodal systems AMG\n"); hypre_printf(" 11=classical block interpolation with diagonal blocks for nodal systems AMG\n"); hypre_printf(" 20=same as 10, but don't add weak connect. to diag \n"); hypre_printf(" 21=same as 11, but don't add weak connect. to diag \n"); hypre_printf(" 22=classical block interpolation w/Ruge's variant for nodal systems AMG \n"); hypre_printf(" 23=same as 22, but use row sums for diag scaling matrices,for nodal systems AMG \n"); hypre_printf(" 24=direct block interpolation for nodal systems AMG\n"); hypre_printf(" 100=One point interpolation [a Boolean matrix]\n"); hypre_printf("\n"); /* RL */ hypre_printf(" -restritype : set restriction type\n"); hypre_printf(" 0=transpose of the interpolation \n"); hypre_printf(" k=local approximate ideal restriction (AIR-k) \n"); hypre_printf("\n"); hypre_printf(" -rlx : relaxation type\n"); hypre_printf(" 0=Weighted Jacobi \n"); hypre_printf(" 1=Gauss-Seidel (very slow!) \n"); hypre_printf(" 3=Hybrid Gauss-Seidel \n"); hypre_printf(" 4=Hybrid backward Gauss-Seidel \n"); hypre_printf(" 6=Hybrid symmetric Gauss-Seidel \n"); hypre_printf(" 8= symmetric L1-Gauss-Seidel \n"); hypre_printf(" 13= forward L1-Gauss-Seidel \n"); hypre_printf(" 14= backward L1-Gauss-Seidel \n"); hypre_printf(" 15=CG \n"); hypre_printf(" 16=Chebyshev \n"); hypre_printf(" 17=FCF-Jacobi \n"); hypre_printf(" 18=L1-Jacobi (may be used with -CF) \n"); hypre_printf(" 9=Gauss elimination (use for coarsest grid only) \n"); hypre_printf(" 99=Gauss elimination with pivoting (use for coarsest grid only) \n"); hypre_printf(" 20= Nodal Weighted Jacobi (for systems only) \n"); hypre_printf(" 23= Nodal Hybrid Jacobi/Gauss-Seidel (for systems only) \n"); hypre_printf(" 26= Nodal Hybrid Symmetric Gauss-Seidel (for systems only)\n"); hypre_printf(" 29= Nodal Gauss elimination (use for coarsest grid only) \n"); hypre_printf(" -rlx_coarse : set relaxation type for coarsest grid\n"); hypre_printf(" -rlx_down : set relaxation type for down cycle\n"); hypre_printf(" -rlx_up : set relaxation type for up cycle\n"); hypre_printf(" -cheby_order : set order (1-4) for Chebyshev poly. smoother (default is 2)\n"); hypre_printf(" -cheby_fraction : fraction of the spectrum for Chebyshev poly. smoother (default is .3)\n"); hypre_printf(" -nodal : nodal system type\n"); hypre_printf(" 0 = Unknown approach \n"); hypre_printf(" 1 = Frobenius norm \n"); hypre_printf(" 2 = Sum of Abs.value of elements \n"); hypre_printf(" 3 = Largest magnitude element (includes its sign) \n"); hypre_printf(" 4 = Inf. norm \n"); hypre_printf(" 5 = One norm (note: use with block version only) \n"); hypre_printf(" 6 = Sum of all elements in block \n"); hypre_printf(" -nodal_diag :how to treat diag elements\n"); hypre_printf(" 0 = no special treatment \n"); hypre_printf(" 1 = make diag = neg.sum of the off_diag \n"); hypre_printf(" 2 = make diag = neg. of diag \n"); hypre_printf(" -ns : Use sweeps on each level\n"); hypre_printf(" (default C/F down, F/C up, F/C fine\n"); hypre_printf(" -ns_coarse : set no. of sweeps for coarsest grid\n"); /* RL restore these */ hypre_printf(" -ns_down : set no. of sweeps for down cycle\n"); hypre_printf(" -ns_up : set no. of sweeps for up cycle\n"); hypre_printf("\n"); hypre_printf(" -mu : set AMG cycles (1=V, 2=W, etc.)\n"); hypre_printf(" -cutf : set coarsening cut factor for dense rows\n"); hypre_printf(" -th : set AMG threshold Theta = val \n"); hypre_printf(" -tr : set AMG interpolation truncation factor = val \n"); hypre_printf(" -Pmx : set maximal no. of elmts per row for AMG interpolation (default: 4)\n"); hypre_printf(" -jtr : set truncation threshold for Jacobi interpolation = val \n"); hypre_printf(" -Ssw : set S-commpkg-switch = val \n"); hypre_printf(" -mxrs : set AMG maximum row sum threshold for dependency weakening \n"); hypre_printf(" -ff <0/1> : set filtering based on functions for systems AMG\n"); hypre_printf(" -nf : set number of functions for systems AMG\n"); hypre_printf(" -numsamp : set number of sample vectors for GSMG\n"); hypre_printf(" -postinterptype : invokes no. of Jacobi interpolation steps after main interpolation\n"); hypre_printf("\n"); hypre_printf(" -cgcitr : set maximal number of coarsening iterations for CGC\n"); hypre_printf(" -solver_type : sets solver within Hybrid solver\n"); hypre_printf(" : 1 PCG (default)\n"); hypre_printf(" : 2 GMRES\n"); hypre_printf(" : 3 BiCGSTAB\n"); hypre_printf(" -w : set Jacobi relax weight = val\n"); hypre_printf(" -k : dimension Krylov space for GMRES\n"); hypre_printf(" -aug : number of augmentation vectors for LGMRES (-k indicates total approx space size)\n"); hypre_printf(" -mxl : maximum number of levels (AMG, ParaSAILS)\n"); hypre_printf(" -tol : set solver convergence tolerance = val\n"); hypre_printf(" -atol : set solver absolute convergence tolerance = val\n"); hypre_printf(" -max_iter : set max iterations\n"); hypre_printf(" -mg_max_iter : set max iterations for mg solvers\n"); hypre_printf(" -agg_nl : set number of aggressive coarsening levels (default:0)\n"); hypre_printf(" -np : set number of paths of length 2 for aggr. coarsening\n"); hypre_printf("\n"); hypre_printf(" -sai_th : set ParaSAILS threshold = val \n"); hypre_printf(" -sai_filt : set ParaSAILS filter = val \n"); hypre_printf("\n"); hypre_printf(" -level : set k in ILU(k) for Euclid \n"); hypre_printf(" -bj : enable block Jacobi ILU for Euclid \n"); hypre_printf(" -ilut : set drop tolerance for ILUT in Euclid\n"); hypre_printf(" Note ILUT is sequential only!\n"); hypre_printf(" -sparseA : set drop tolerance in ILU(k) for Euclid \n"); hypre_printf(" -rowScale : enable row scaling in Euclid \n"); hypre_printf("\n"); hypre_printf(" -drop_tol : set threshold for dropping in PILUT\n"); hypre_printf(" -nonzeros_to_keep : number of nonzeros in each row to keep\n"); hypre_printf("\n"); hypre_printf(" -iout : set output flag\n"); hypre_printf(" 0=no output 1=matrix stats\n"); hypre_printf(" 2=cycle stats 3=matrix & cycle stats\n"); hypre_printf("\n"); hypre_printf(" -dbg : set debug flag\n"); hypre_printf(" 0=no debugging\n 1=internal timing\n 2=interpolation truncation\n 3=more detailed timing in coarsening routine\n"); hypre_printf("\n"); hypre_printf(" -print : print out the system\n"); hypre_printf("\n"); /* begin lobpcg */ hypre_printf("LOBPCG options:\n"); hypre_printf("\n"); hypre_printf(" -lobpcg : run LOBPCG instead of PCG\n"); hypre_printf("\n"); hypre_printf(" -gen : solve generalized EVP with B = Laplacian\n"); hypre_printf("\n"); hypre_printf(" -con : solve constrained EVP using 'vectors.*.*'\n"); hypre_printf(" as constraints (see -vout 1 below)\n"); hypre_printf("\n"); hypre_printf(" -solver none : no HYPRE preconditioner is used\n"); hypre_printf("\n"); hypre_printf(" -itr : maximal number of LOBPCG iterations\n"); hypre_printf(" (default 100);\n"); hypre_printf("\n"); hypre_printf(" -vrand : compute eigenpairs using random\n"); hypre_printf(" initial vectors (default 1)\n"); hypre_printf("\n"); hypre_printf(" -seed : use as the seed for the random\n"); hypre_printf(" number generator(default seed is based\n"); hypre_printf(" on the time of the run)\n"); hypre_printf("\n"); hypre_printf(" -vfromfile : read initial vectors from files\n"); hypre_printf(" vectors.i.j where i is vector number\n"); hypre_printf(" and j is processor number\n"); hypre_printf("\n"); hypre_printf(" -orthchk : check eigenvectors for orthonormality\n"); hypre_printf("\n"); hypre_printf(" -verb : verbosity level\n"); hypre_printf(" -verb 0 : no print\n"); hypre_printf(" -verb 1 : print initial eigenvalues and residuals,\n"); hypre_printf(" the iteration number, the number of\n"); hypre_printf(" non-convergent eigenpairs and final\n"); hypre_printf(" eigenvalues and residuals (default)\n"); hypre_printf(" -verb 2 : print eigenvalues and residuals on each\n"); hypre_printf(" iteration\n"); hypre_printf("\n"); hypre_printf(" -pcgitr : maximal number of inner PCG iterations\n"); hypre_printf(" for preconditioning (default 1);\n"); hypre_printf(" if = 0 then the preconditioner\n"); hypre_printf(" is applied directly\n"); hypre_printf("\n"); hypre_printf(" -pcgtol : residual tolerance for inner iterations\n"); hypre_printf(" (default 0.01)\n"); hypre_printf("\n"); hypre_printf(" -vout : file output level\n"); hypre_printf(" -vout 0 : no files created (default)\n"); hypre_printf(" -vout 1 : write eigenvalues to values.txt, residuals\n"); hypre_printf(" to residuals.txt and eigenvectors to \n"); hypre_printf(" vectors.i.j where i is vector number\n"); hypre_printf(" and j is processor number\n"); hypre_printf(" -vout 2 : in addition to the above, write the\n"); hypre_printf(" eigenvalues history (the matrix whose\n"); hypre_printf(" i-th column contains eigenvalues at\n"); hypre_printf(" (i+1)-th iteration) to val_hist.txt and\n"); hypre_printf(" residuals history to res_hist.txt\n"); hypre_printf("\nNOTE: in this test driver LOBPCG only works with solvers 1, 2, 8, 12, 14 and 43\n"); hypre_printf("\ndefault solver is 1\n"); hypre_printf("\n"); /* end lobpcg */ hypre_printf(" -plot_grids : print out information for plotting the grids\n"); hypre_printf(" -plot_file_name : file name for plotting output\n"); hypre_printf("\n"); hypre_printf(" -smtype :smooth type\n"); hypre_printf(" -smlv :smooth num levels\n"); hypre_printf(" -ov :over lap:\n"); hypre_printf(" -dom :domain type\n"); hypre_printf(" -use_ns : use non-symm schwarz smoother\n"); hypre_printf(" -var : schwarz smoother variant (0-3) \n"); hypre_printf(" -blk_sm : same as '-smtype 6 -ov 0 -dom 1 -smlv '\n"); hypre_printf(" -nongalerk_tol : specify the NonGalerkin drop tolerance\n"); hypre_printf(" and list contains the values, where last value\n"); hypre_printf(" in list is repeated if val < num_levels in AMG\n"); /* MGR options */ hypre_printf(" -mgr_bsize : set block size = val\n"); hypre_printf(" -mgr_nlevels : set number of coarsening levels = val\n"); hypre_printf(" -mgr_num_reserved_nodes : set number of reserved nodes \n"); hypre_printf(" to be kept till the coarsest grid = val\n"); hypre_printf(" -mgr_non_c_to_f : set strategy for intermediate coarse grid \n"); hypre_printf(" -mgr_non_c_to_f 0 : Allow some non Cpoints to be labeled \n"); hypre_printf(" Cpoints on intermediate grid \n"); hypre_printf(" -mgr_non_c_to_f 1 : set non Cpoints strictly to Fpoints \n"); hypre_printf(" -mgr_frelax_method : set F-relaxation strategy \n"); hypre_printf(" -mgr_frelax_method 0 : Use 'single-level smoother' strategy \n"); hypre_printf(" for F-relaxation \n"); hypre_printf(" -mgr_frelax_method 1 : Use a 'multi-level smoother' strategy \n"); hypre_printf(" for F-relaxation \n"); /* end MGR options */ /* hypre ILU options */ hypre_printf(" -ilu_type : set ILU factorization type = val\n"); hypre_printf(" -ilu_type 0 : Block Jacobi with ILU(k) variants \n"); hypre_printf(" -ilu_type 1 : Block Jacobi with ILUT \n"); hypre_printf(" -ilu_type 10 : GMRES with ILU(k) variants \n"); hypre_printf(" -ilu_type 11 : GMRES with ILUT \n"); hypre_printf(" -ilu_type 20 : NSH with ILU(k) variants \n"); hypre_printf(" -ilu_type 21 : NSH with ILUT \n"); hypre_printf(" -ilu_type 30 : RAS with ILU(k) variants \n"); hypre_printf(" -ilu_type 31 : RAS with ILUT \n"); hypre_printf(" -ilu_type 40 : ddPQ + GMRES with ILU(k) variants \n"); hypre_printf(" -ilu_type 41 : ddPQ + GMRES with ILUT \n"); hypre_printf(" -ilu_type 50 : GMRES with ILU(0): RAP variant with MILU(0) \n"); hypre_printf(" -ilu_lfil : set level of fill (k) for ILU(k) = val\n"); hypre_printf(" -ilu_droptol : set drop tolerance threshold for ILUT = val \n"); hypre_printf(" -ilu_max_row_nnz : set max. num of nonzeros to keep per row = val \n"); hypre_printf(" -ilu_schur_max_iter : set max. num of iteration for GMRES/NSH Schur = val \n"); hypre_printf(" -ilu_nsh_droptol : set drop tolerance threshold for NSH = val \n"); hypre_printf(" -ilu_reordering : 0: no reordering. 1: Reverse Cuthill-McKee.\n"); hypre_printf(" -ilu_tri_solve <0/1> : 0: iterative solve. 1: direct solve.\n"); hypre_printf(" -ilu_ljac_iters : set number of lower Jacobi iterations for the triangular L solves when using iterative solve approach.\n"); hypre_printf(" -ilu_ujac_iters : set number of upper Jacobi iterations for the triangular U solves when using iterative solve approach.\n"); hypre_printf(" -ilu_iter_setup_type : set iterative ILU setup algorithm.\n"); hypre_printf(" -ilu_iter_setup_option : set iterative ILU setup option.\n"); hypre_printf(" -ilu_iter_setup_max_iter : set max. number of iterations for iterative ILU setup.\n"); hypre_printf(" -ilu_iter_setup_tolerance : set stopping tolerance for iterative ILU setup.\n"); hypre_printf(" -ilu_sm_max_iter : set number of iterations when applied as a smmother in AMG = val \n"); /* end ILU options */ /* hypre FSAI options */ hypre_printf(" -fs_algo_type : FSAI algorithm type\n"); hypre_printf(" -fs_ls_type : FSAI local solve type\n"); hypre_printf(" -fs_max_steps : Max. number of steps (adaptive)\n"); hypre_printf(" -fs_max_step_size : Max. step size (adaptive)\n"); hypre_printf(" -fs_max_nnz_row : Max. nonzeros per row (static)\n"); hypre_printf(" -fs_num_levels : Number of levels (static)\n"); hypre_printf(" -fs_threshold : Filtering threshold (static)\n"); hypre_printf(" -fs_eig_max_iters : Max. it. for eig calculation.\n"); hypre_printf(" -fs_kap_tol : Kap. theshold (adaptive)\n"); /* end FSAI options */ /* hypre AMG-DD options */ hypre_printf(" -amgdd_start_level : set AMG-DD start level = val\n"); hypre_printf(" -amgdd_padding : set AMG-DD padding = val\n"); hypre_printf(" -amgdd_num_ghost_layers : set AMG-DD number of ghost layers = val\n"); hypre_printf(" -amgdd_fac_num_relax : set AMG-DD FAC cycle number of pre/post-relaxations = val\n"); hypre_printf(" -amgdd_num_comp_cycles : set AMG-DD number of inner FAC cycles = val\n"); hypre_printf(" -amgdd_fac_relax_type : set AMG-DD FAC relaxation type = val\n"); hypre_printf(" 0=Weighted Jacobi \n"); hypre_printf(" 1=Gauss-Seidel \n"); hypre_printf(" 2=Ordered Gauss-Seidel \n"); hypre_printf(" 3=CFL1 Jacobi \n"); hypre_printf(" -amgdd_fac_cycle_type : set AMG-DD FAC cycle type = val\n"); hypre_printf(" 1=V-cycle \n"); hypre_printf(" 2=W-cycle \n"); hypre_printf(" 3=F-cycle \n"); /* end AMG-DD options */ #if defined (HYPRE_USING_UMPIRE) /* hypre umpire options */ hypre_printf(" -umpire_dev_pool_size : device memory pool size (GiB)\n"); hypre_printf(" -umpire_uvm_pool_size : device unified virtual memory pool size (GiB)\n"); hypre_printf(" -umpire_pinned_pool_size : pinned memory pool size (GiB)\n"); hypre_printf(" -umpire_host_pool_size : host memory pool size (GiB)\n"); /* end umpire options */ #endif } goto final; } /*----------------------------------------------------------- * Print driver parameters *-----------------------------------------------------------*/ if (myid == 0) { #if defined(HYPRE_DEVELOP_STRING) && defined(HYPRE_DEVELOP_BRANCH) hypre_printf("\nUsing HYPRE_DEVELOP_STRING: %s (branch %s; the develop branch)\n\n", HYPRE_DEVELOP_STRING, HYPRE_DEVELOP_BRANCH); #elif defined(HYPRE_DEVELOP_STRING) && !defined(HYPRE_DEVELOP_BRANCH) hypre_printf("\nUsing HYPRE_DEVELOP_STRING: %s (branch %s; not the develop branch)\n\n", HYPRE_DEVELOP_STRING, HYPRE_BRANCH_NAME); #elif defined(HYPRE_RELEASE_VERSION) hypre_printf("\nUsing HYPRE_RELEASE_VERSION: %s\n\n", HYPRE_RELEASE_VERSION); #endif hypre_printf("Running with these driver parameters:\n"); hypre_printf(" solver ID = %d\n\n", solver_id); } /*----------------------------------------------------------- * Set various things *-----------------------------------------------------------*/ HYPRE_SetPrintErrorMode(1); if (test_error == 1) { HYPRE_SetPrintErrorVerbosity(-1, 0); /* turn all errors off */ HYPRE_SetPrintErrorVerbosity(HYPRE_ERROR_GENERIC, 1); /* turn generic errors on */ } #if defined(HYPRE_USING_DEVICE_POOL) /* To be effective, hypre_SetCubMemPoolSize must immediately follow HYPRE_Init */ HYPRE_SetGPUMemoryPoolSize( mempool_bin_growth, mempool_min_bin, mempool_max_bin, mempool_max_cached_bytes ); #elif defined(HYPRE_USING_UMPIRE) /* Setup Umpire pools */ HYPRE_SetUmpireDevicePoolName("HYPRE_DEVICE_POOL_TEST"); HYPRE_SetUmpireUMPoolName("HYPRE_UM_POOL_TEST"); HYPRE_SetUmpireHostPoolName("HYPRE_HOST_POOL_TEST"); HYPRE_SetUmpirePinnedPoolName("HYPRE_PINNED_POOL_TEST"); HYPRE_SetUmpireDevicePoolSize(umpire_dev_pool_size); HYPRE_SetUmpireUMPoolSize(umpire_uvm_pool_size); HYPRE_SetUmpireHostPoolSize(umpire_host_pool_size); HYPRE_SetUmpirePinnedPoolSize(umpire_pinned_pool_size); #endif #if defined(HYPRE_USING_MEMORY_TRACKER) hypre_MemoryTrackerSetPrint(print_mem_tracker); if (mem_tracker_name[0]) { hypre_MemoryTrackerSetFileName(mem_tracker_name); } #endif /* Set log level */ HYPRE_SetLogLevel(log_level); /* default memory location */ HYPRE_SetMemoryLocation(memory_location); /* default execution policy */ HYPRE_SetExecutionPolicy(default_exec_policy); #if defined(HYPRE_USING_GPU) ierr = HYPRE_SetSpMVUseVendor(spmv_use_vendor); hypre_assert(ierr == 0); /* use vendor implementation for SpGEMM */ ierr = HYPRE_SetSpGemmUseVendor(spgemm_use_vendor); hypre_assert(ierr == 0); ierr = hypre_SetSpGemmAlgorithm(spgemm_alg); hypre_assert(ierr == 0); ierr = hypre_SetSpGemmBinned(spgemm_binned); hypre_assert(ierr == 0); ierr = hypre_SetSpGemmRownnzEstimateMethod(spgemm_rowest_mtd); hypre_assert(ierr == 0); if (spgemm_rowest_nsamples > 0) { ierr = hypre_SetSpGemmRownnzEstimateNSamples(spgemm_rowest_nsamples); hypre_assert(ierr == 0); } if (spgemm_rowest_mult > 0.0) { ierr = hypre_SetSpGemmRownnzEstimateMultFactor(spgemm_rowest_mult); hypre_assert(ierr == 0); } /* use cuRand for PMIS */ HYPRE_SetUseGpuRand(use_curand); #endif HYPRE_SetGpuAwareMPI(gpu_aware_mpi); /*----------------------------------------------------------- * Set up matrix *-----------------------------------------------------------*/ if ( myid == 0 && dt != dt_inf) { hypre_printf(" Backward Euler time step with dt = %e\n", dt); hypre_printf(" Dirichlet 0 BCs are implicit in the spatial operator\n"); } time_index = hypre_InitializeTiming("Spatial Operator"); hypre_BeginTiming(time_index); if ( build_matrix_type == -2 ) { ierr = HYPRE_IJMatrixReadBinary( argv[build_matrix_arg_index], comm, HYPRE_PARCSR, &ij_A ); if (ierr) { hypre_printf("ERROR: Problem reading in the system matrix!\n"); hypre_MPI_Abort(comm, 1); } } else if ( build_matrix_type == -1 ) { ierr = HYPRE_IJMatrixRead( argv[build_matrix_arg_index], comm, HYPRE_PARCSR, &ij_A ); if (ierr) { hypre_printf("ERROR: Problem reading in the system matrix!\n"); hypre_MPI_Abort(comm, 1); } } else if ( build_matrix_type == 0 ) { BuildParFromFile(argc, argv, build_matrix_arg_index, &parcsr_A); } else if ( build_matrix_type == 1 ) { BuildParFromOneFile(argc, argv, build_matrix_arg_index, num_functions, &parcsr_A); } else if ( build_matrix_type == 2 ) { BuildParLaplacian(argc, argv, build_matrix_arg_index, &parcsr_A); } else if ( build_matrix_type == 3 ) { BuildParLaplacian9pt(argc, argv, build_matrix_arg_index, &parcsr_A); } else if ( build_matrix_type == 4 ) { BuildParLaplacian27pt(argc, argv, build_matrix_arg_index, &parcsr_A); #if defined(HYPRE_USING_GPU) hypre_CSRMatrixSpMVAnalysisDevice(hypre_ParCSRMatrixDiag(parcsr_A)); #endif } else if ( build_matrix_type == 5 ) { BuildParLaplacian125pt(argc, argv, build_matrix_arg_index, &parcsr_A); #if defined(HYPRE_USING_GPU) hypre_CSRMatrixSpMVAnalysisDevice(hypre_ParCSRMatrixDiag(parcsr_A)); #endif } else if ( build_matrix_type == 6 ) { BuildParDifConv(argc, argv, build_matrix_arg_index, &parcsr_A); } else if ( build_matrix_type == 7 ) { BuildParVarDifConv(argc, argv, build_matrix_arg_index, &parcsr_A, &b); build_rhs_type = 6; build_src_type = 5; } else if ( build_matrix_type == 8 ) { BuildParRotate7pt(argc, argv, build_matrix_arg_index, &parcsr_A); } else { hypre_printf("You have asked for an unsupported problem with\n"); hypre_printf("build_matrix_type = %d.\n", build_matrix_type); hypre_MPI_Abort(comm, 1); } /* BM Oct 23, 2006 */ if (plot_grids) { if (build_matrix_type > 1 && build_matrix_type < 9) BuildParCoordinates (argc, argv, build_matrix_arg_index, &coord_dim, &coordinates); else { hypre_printf("Warning: coordinates are not yet printed for build_matrix_type = %d.\n", build_matrix_type); } } if (build_matrix_type < 0) { ierr = HYPRE_IJMatrixGetLocalRange( ij_A, &first_local_row, &last_local_row, &first_local_col, &last_local_col ); local_num_rows = (HYPRE_Int)(last_local_row - first_local_row + 1); local_num_cols = (HYPRE_Int)(last_local_col - first_local_col + 1); ierr += HYPRE_IJMatrixGetObject( ij_A, &object); parcsr_A = (HYPRE_ParCSRMatrix) object; } else { /*----------------------------------------------------------- * Copy the parcsr matrix into the IJMatrix through interface calls *-----------------------------------------------------------*/ ierr = HYPRE_ParCSRMatrixGetLocalRange( parcsr_A, &first_local_row, &last_local_row, &first_local_col, &last_local_col ); local_num_rows = (HYPRE_Int)(last_local_row - first_local_row + 1); local_num_cols = (HYPRE_Int)(last_local_col - first_local_col + 1); } hypre_EndTiming(time_index); hypre_PrintTiming("Generate Matrix", hypre_MPI_COMM_WORLD); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); /* Read matrix to be passed to the preconditioner */ if (build_matrix_M == 1) { time_index = hypre_InitializeTiming("Auxiliary Operator"); hypre_BeginTiming(time_index); ierr = HYPRE_IJMatrixRead( argv[build_matrix_M_arg_index], comm, HYPRE_PARCSR, &ij_M ); if (ierr) { hypre_printf("ERROR: Problem reading in the auxiliary matrix B!\n"); exit(1); } HYPRE_IJMatrixGetObject(ij_M, &object); parcsr_M = (HYPRE_ParCSRMatrix) object; hypre_EndTiming(time_index); hypre_PrintTiming("Auxiliary Operator", hypre_MPI_COMM_WORLD); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); } else { parcsr_M = parcsr_A; } /* Check the ij interface - not necessary if one just wants to test solvers */ if (test_ij && build_matrix_type > -1) { hypre_ParCSRMatrixMigrate(parcsr_A, HYPRE_MEMORY_HOST); HYPRE_Int mx_size = 5; time_index = hypre_InitializeTiming("Generate IJ matrix"); hypre_BeginTiming(time_index); ierr += HYPRE_ParCSRMatrixGetDims( parcsr_A, &M, &N ); ierr += HYPRE_IJMatrixCreate( comm, first_local_row, last_local_row, first_local_col, last_local_col, &ij_A ); ierr += HYPRE_IJMatrixSetObjectType( ij_A, HYPRE_PARCSR ); num_rows = local_num_rows; if (off_proc) { if (myid != num_procs - 1) { num_rows++; } if (myid) { num_rows++; } } /* The following shows how to build an IJMatrix if one has only an estimate for the row sizes */ row_nums = hypre_CTAlloc(HYPRE_BigInt, num_rows, HYPRE_MEMORY_HOST); num_cols = hypre_CTAlloc(HYPRE_Int, num_rows, HYPRE_MEMORY_HOST); if (sparsity_known == 1) { diag_sizes = hypre_CTAlloc(HYPRE_Int, local_num_rows, HYPRE_MEMORY_HOST); offdiag_sizes = hypre_CTAlloc(HYPRE_Int, local_num_rows, HYPRE_MEMORY_HOST); } else { size = 5; if (sparsity_known == 0) { if (build_matrix_type == 2) { size = 7; } else if (build_matrix_type == 3) { size = 9; } else if (build_matrix_type == 4) { size = 27; } else if (build_matrix_type == 5) { size = 125; } } row_sizes = hypre_CTAlloc(HYPRE_Int, num_rows, HYPRE_MEMORY_HOST); for (i = 0; i < num_rows; i++) { row_sizes[i] = size; } } local_row = 0; if (build_matrix_type == 2) { mx_size = 7; } else if (build_matrix_type == 3) { mx_size = 9; } else if (build_matrix_type == 4) { mx_size = 27; } else if (build_matrix_type == 5) { mx_size = 125; } col_nums = hypre_CTAlloc(HYPRE_BigInt, mx_size * num_rows, HYPRE_MEMORY_HOST); data = hypre_CTAlloc(HYPRE_Real, mx_size * num_rows, HYPRE_MEMORY_HOST); i_indx = 0; j_indx = 0; if (off_proc && myid) { num_cols[i_indx] = 2; row_nums[i_indx++] = first_local_row - 1; col_nums[j_indx] = first_local_row - 1; data[j_indx++] = 6.0; col_nums[j_indx] = first_local_row - 2; data[j_indx++] = -1.0; } for (i = 0; i < local_num_rows; i++) { row_nums[i_indx] = first_local_row + i; ierr += HYPRE_ParCSRMatrixGetRow(parcsr_A, first_local_row + i, &size, &col_inds, &values); num_cols[i_indx++] = size; hypre_TMemcpy(&col_nums[j_indx], &col_inds[0], HYPRE_BigInt, size, HYPRE_MEMORY_HOST, HYPRE_MEMORY_HOST); hypre_TMemcpy(&data[j_indx], &values[0], HYPRE_Real, size, HYPRE_MEMORY_HOST, HYPRE_MEMORY_HOST); if (sparsity_known == 1) { for (j = 0; j < size; j++) { if (col_nums[j_indx + j] < first_local_row || col_nums[j_indx + j] > last_local_row) { offdiag_sizes[local_row]++; } else { diag_sizes[local_row]++; } } } j_indx += size; local_row++; ierr += HYPRE_ParCSRMatrixRestoreRow(parcsr_A, first_local_row + i, &size, &col_inds, &values); } if (off_proc && myid != num_procs - 1) { num_cols[i_indx] = 2; row_nums[i_indx++] = last_local_row + 1; col_nums[j_indx] = last_local_row + 2; data[j_indx++] = -1.0; col_nums[j_indx] = last_local_row + 1; data[j_indx++] = 6.0; } if (sparsity_known == 1) { ierr += HYPRE_IJMatrixSetDiagOffdSizes( ij_A, (const HYPRE_Int *) diag_sizes, (const HYPRE_Int *) offdiag_sizes ); } else { ierr = HYPRE_IJMatrixSetRowSizes ( ij_A, (const HYPRE_Int *) row_sizes ); } ierr += HYPRE_IJMatrixInitialize_v2( ij_A, memory_location ); if (omp_flag) { HYPRE_IJMatrixSetOMPFlag(ij_A, 1); } /* move arrays to `memory_location' */ HYPRE_Int *num_cols_h = num_cols; HYPRE_BigInt *row_nums_h = row_nums; HYPRE_BigInt *col_nums_h = col_nums; HYPRE_Real *data_h = data; if (hypre_GetActualMemLocation(memory_location) != hypre_MEMORY_HOST) { num_cols = hypre_TAlloc(HYPRE_Int, num_rows, memory_location); row_nums = hypre_TAlloc(HYPRE_BigInt, num_rows, memory_location); col_nums = hypre_TAlloc(HYPRE_BigInt, mx_size * num_rows, memory_location); data = hypre_TAlloc(HYPRE_Real, mx_size * num_rows, memory_location); hypre_TMemcpy(num_cols, num_cols_h, HYPRE_Int, num_rows, memory_location, HYPRE_MEMORY_HOST); hypre_TMemcpy(row_nums, row_nums_h, HYPRE_BigInt, num_rows, memory_location, HYPRE_MEMORY_HOST); hypre_TMemcpy(col_nums, col_nums_h, HYPRE_BigInt, mx_size * num_rows, memory_location, HYPRE_MEMORY_HOST); hypre_TMemcpy(data, data_h, HYPRE_Real, mx_size * num_rows, memory_location, HYPRE_MEMORY_HOST); } if (chunk) { if (add) { ierr += HYPRE_IJMatrixAddToValues(ij_A, num_rows, num_cols, row_nums, (const HYPRE_BigInt *) col_nums, (const HYPRE_Real *) data); } else { ierr += HYPRE_IJMatrixSetValues(ij_A, num_rows, num_cols, row_nums, (const HYPRE_BigInt *) col_nums, (const HYPRE_Real *) data); } } else { j_indx = 0; for (i = 0; i < num_rows; i++) { if (add) { ierr += HYPRE_IJMatrixAddToValues( ij_A, 1, &num_cols[i], &row_nums[i], (const HYPRE_BigInt *) &col_nums[j_indx], (const HYPRE_Real *) &data[j_indx] ); } else { ierr += HYPRE_IJMatrixSetValues( ij_A, 1, &num_cols[i], &row_nums[i], (const HYPRE_BigInt *) &col_nums[j_indx], (const HYPRE_Real *) &data[j_indx] ); } j_indx += num_cols_h[i]; } } hypre_TFree(num_cols_h, HYPRE_MEMORY_HOST); hypre_TFree(row_nums_h, HYPRE_MEMORY_HOST); hypre_TFree(col_nums_h, HYPRE_MEMORY_HOST); hypre_TFree(data_h, HYPRE_MEMORY_HOST); if (hypre_GetActualMemLocation(memory_location) != hypre_MEMORY_HOST) { hypre_TFree(col_nums, memory_location); hypre_TFree(data, memory_location); hypre_TFree(row_nums, memory_location); hypre_TFree(num_cols, memory_location); } if (sparsity_known == 1) { hypre_TFree(diag_sizes, HYPRE_MEMORY_HOST); hypre_TFree(offdiag_sizes, HYPRE_MEMORY_HOST); } else { hypre_TFree(row_sizes, HYPRE_MEMORY_HOST); } ierr += HYPRE_IJMatrixAssemble( ij_A ); hypre_EndTiming(time_index); hypre_PrintTiming("IJ Matrix Setup", hypre_MPI_COMM_WORLD); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); if (ierr) { hypre_printf("Error in driver building IJMatrix from parcsr matrix. \n"); return (-1); } /* This is to emphasize that one can IJMatrixAddToValues after an IJMatrixRead or an IJMatrixAssemble. After an IJMatrixRead, assembly is unnecessary if the sparsity pattern of the matrix is not changed somehow. If one has not used IJMatrixRead, one has the opportunity to IJMatrixAddTo before a IJMatrixAssemble. This first sets all matrix coefficients to -1 and then adds 7.0 to the diagonal to restore the original matrix*/ if (check_constant) { ierr += HYPRE_IJMatrixSetConstantValues( ij_A, -1.0 ); } ncols = hypre_TAlloc(HYPRE_Int, last_local_row - first_local_row + 1, HYPRE_MEMORY_HOST); rows = hypre_TAlloc(HYPRE_BigInt, last_local_row - first_local_row + 1, HYPRE_MEMORY_HOST); col_inds = hypre_TAlloc(HYPRE_BigInt, last_local_row - first_local_row + 1, HYPRE_MEMORY_HOST); values = hypre_TAlloc(HYPRE_Real, last_local_row - first_local_row + 1, HYPRE_MEMORY_HOST); val = 0.0; if (check_constant) { val = 7.0; } if (dt < dt_inf) { val += 1. / dt; } else { val += 0.0; /* Use zero to avoid unintentional loss of significance */ } for (big_i = first_local_row; big_i <= last_local_row; big_i++) { j = (HYPRE_Int) (big_i - first_local_row); ncols[j] = 1; rows[j] = big_i; col_inds[j] = big_i; values[j] = val; } if (hypre_GetActualMemLocation(memory_location) != hypre_MEMORY_HOST) { HYPRE_Int *ncols_h = ncols; HYPRE_BigInt *rows_h = rows; HYPRE_BigInt *col_inds_h = col_inds; HYPRE_Real *values_h = values; ncols = hypre_TAlloc(HYPRE_Int, last_local_row - first_local_row + 1, memory_location); rows = hypre_TAlloc(HYPRE_BigInt, last_local_row - first_local_row + 1, memory_location); col_inds = hypre_TAlloc(HYPRE_BigInt, last_local_row - first_local_row + 1, memory_location); values = hypre_TAlloc(HYPRE_Real, last_local_row - first_local_row + 1, memory_location); hypre_TMemcpy(ncols, ncols_h, HYPRE_Int, last_local_row - first_local_row + 1, memory_location, HYPRE_MEMORY_HOST); hypre_TMemcpy(rows, rows_h, HYPRE_BigInt, last_local_row - first_local_row + 1, memory_location, HYPRE_MEMORY_HOST); hypre_TMemcpy(col_inds, col_inds_h, HYPRE_BigInt, last_local_row - first_local_row + 1, memory_location, HYPRE_MEMORY_HOST); hypre_TMemcpy(values, values_h, HYPRE_Real, last_local_row - first_local_row + 1, memory_location, HYPRE_MEMORY_HOST); hypre_TFree(ncols_h, HYPRE_MEMORY_HOST); hypre_TFree(rows_h, HYPRE_MEMORY_HOST); hypre_TFree(col_inds_h, HYPRE_MEMORY_HOST); hypre_TFree(values_h, HYPRE_MEMORY_HOST); } ierr += HYPRE_IJMatrixAddToValues( ij_A, local_num_rows, /* this is to show one can use NULL if ncols contains all ones */ NULL, /* ncols, */ rows, (const HYPRE_BigInt *) col_inds, (const HYPRE_Real *) values ); hypre_TFree(ncols, memory_location); hypre_TFree(rows, memory_location); hypre_TFree(col_inds, memory_location); hypre_TFree(values, memory_location); /* If sparsity pattern is not changed since last IJMatrixAssemble call, this should be a no-op */ ierr += HYPRE_IJMatrixAssemble( ij_A ); /*----------------------------------------------------------- * Fetch the resulting underlying matrix out *-----------------------------------------------------------*/ ierr += HYPRE_ParCSRMatrixDestroy(parcsr_A); ierr += HYPRE_IJMatrixGetObject( ij_A, &object); parcsr_A = (HYPRE_ParCSRMatrix) object; } /*----------------------------------------------------------- * Set up the interp vector *-----------------------------------------------------------*/ if (build_rbm) { char new_file_name[80]; /* RHS */ interp_vecs = hypre_CTAlloc(HYPRE_ParVector, num_interp_vecs, HYPRE_MEMORY_HOST); ij_rbm = hypre_CTAlloc(HYPRE_IJVector, num_interp_vecs, HYPRE_MEMORY_HOST); for (i = 0; i < num_interp_vecs; i++) { hypre_sprintf(new_file_name, "%s.%d", argv[build_rbm_index], i); ierr = HYPRE_IJVectorRead( new_file_name, hypre_MPI_COMM_WORLD, HYPRE_PARCSR, &ij_rbm[i] ); ierr = HYPRE_IJVectorGetObject( ij_rbm[i], &object ); interp_vecs[i] = (HYPRE_ParVector) object; } if (ierr) { hypre_printf("ERROR: Problem reading in rbm!\n"); exit(1); } } /*----------------------------------------------------------- * Set up coarsening data *-----------------------------------------------------------*/ if (build_fpt_arg_index || build_sfpt_arg_index || build_cpt_arg_index) { HYPRE_ParCSRMatrixGetGlobalRowPartitioning(parcsr_A, 0, &partitioning); if (build_fpt_arg_index) { BuildBigArrayFromOneFile(argc, argv, "Fine points", build_fpt_arg_index, partitioning, &num_fpt, &fpt_index); } if (build_sfpt_arg_index) { BuildBigArrayFromOneFile(argc, argv, "Isolated Fine points", build_sfpt_arg_index, partitioning, &num_isolated_fpt, &isolated_fpt_index); } if (build_cpt_arg_index) { BuildBigArrayFromOneFile(argc, argv, "Coarse points", build_cpt_arg_index, partitioning, &num_cpt, &cpt_index); } if (partitioning) { hypre_TFree(partitioning, HYPRE_MEMORY_HOST); } } /* Print matrix information */ if (print_matrix_info) { HYPRE_BigInt global_num_rows, global_num_cols, global_num_nonzeros; if (parcsr_A) { HYPRE_BigInt ilower, iupper, jlower, jupper; HYPRE_ParCSRMatrixGetLocalRange(parcsr_A, &ilower, &iupper, &jlower, &jupper); HYPRE_IJMatrixCreate(comm, ilower, iupper, jlower, jupper, &ij_A); HYPRE_IJMatrixSetObjectType(ij_A, HYPRE_PARCSR); hypre_IJMatrixObject(ij_A) = parcsr_A; hypre_IJMatrixAssembleFlag(ij_A) = 1; } HYPRE_IJMatrixGetGlobalInfo(ij_A, &global_num_rows, &global_num_cols, &global_num_nonzeros); if (parcsr_A) { hypre_IJMatrixObject(ij_A) = NULL; HYPRE_IJMatrixDestroy(ij_A); } if (myid == 0) { hypre_printf(" Matrix Information:\n"); hypre_printf(" Global number of rows: %b\n", global_num_rows); hypre_printf(" Global number of columns: %b\n", global_num_cols); hypre_printf(" Global number of nonzeros: %b\n", global_num_nonzeros); } } /*----------------------------------------------------------- * Set up the RHS and initial guess *-----------------------------------------------------------*/ time_index = hypre_InitializeTiming("RHS and Initial Guess"); hypre_BeginTiming(time_index); if (myid == 0) { hypre_printf(" Number of vector components: %d\n", num_components); } if (num_components > 1 && !(build_rhs_type > 1 && build_rhs_type < 6)) { hypre_printf("num_components > 1 not implemented for this RHS choice!\n"); hypre_MPI_Abort(comm, 1); } if (build_rhs_type == 0 || build_rhs_type == -2) { if (myid == 0) { hypre_printf(" RHS vector read from file %s\n", argv[build_rhs_arg_index]); hypre_printf(" Initial guess is 0\n"); } /* RHS */ if (!build_rhs_type) { ierr = HYPRE_IJVectorRead(argv[build_rhs_arg_index], hypre_MPI_COMM_WORLD, HYPRE_PARCSR, &ij_b); } else { ierr = HYPRE_IJVectorReadBinary(argv[build_rhs_arg_index], hypre_MPI_COMM_WORLD, HYPRE_PARCSR, &ij_b); } if (ierr) { hypre_printf("ERROR: Problem reading in the right-hand-side!\n"); exit(1); } ierr = HYPRE_IJVectorGetObject( ij_b, &object ); b = (HYPRE_ParVector) object; /* Initial guess */ HYPRE_IJVectorCreate(hypre_MPI_COMM_WORLD, first_local_col, last_local_col, &ij_x); HYPRE_IJVectorSetObjectType(ij_x, HYPRE_PARCSR); HYPRE_IJVectorInitialize(ij_x); HYPRE_IJVectorAssemble(ij_x); ierr = HYPRE_IJVectorGetObject( ij_x, &object ); x = (HYPRE_ParVector) object; } else if (build_rhs_type == 1) { if (myid == 0) { hypre_printf(" RHS vector read from file %s\n", argv[build_rhs_arg_index]); hypre_printf(" Initial guess is 0\n"); } ij_b = NULL; BuildRhsParFromOneFile(argc, argv, build_rhs_arg_index, parcsr_A, &b); /* initial guess */ HYPRE_IJVectorCreate(hypre_MPI_COMM_WORLD, first_local_col, last_local_col, &ij_x); HYPRE_IJVectorSetObjectType(ij_x, HYPRE_PARCSR); HYPRE_IJVectorInitialize(ij_x); HYPRE_IJVectorAssemble(ij_x); ierr = HYPRE_IJVectorGetObject( ij_x, &object ); x = (HYPRE_ParVector) object; } else if (build_rhs_type == 2) { if (myid == 0) { hypre_printf(" RHS vector has unit coefficients\n"); hypre_printf(" Initial guess is 0\n"); } HYPRE_Complex *values_h = hypre_CTAlloc(HYPRE_Real, local_num_rows, HYPRE_MEMORY_HOST); HYPRE_Complex *values_d = hypre_CTAlloc(HYPRE_Real, local_num_rows, memory_location); for (i = 0; i < local_num_rows; i++) { values_h[i] = 1.0; } hypre_TMemcpy(values_d, values_h, HYPRE_Complex, local_num_rows, memory_location, HYPRE_MEMORY_HOST); /* RHS */ HYPRE_IJVectorCreate(hypre_MPI_COMM_WORLD, first_local_row, last_local_row, &ij_b); HYPRE_IJVectorSetObjectType(ij_b, HYPRE_PARCSR); HYPRE_IJVectorSetNumComponents(ij_b, num_components); HYPRE_IJVectorInitialize_v2(ij_b, memory_location); for (c = 0; c < num_components; c++) { HYPRE_IJVectorSetComponent(ij_b, c); HYPRE_IJVectorSetValues(ij_b, local_num_rows, NULL, values_d); } HYPRE_IJVectorAssemble(ij_b); ierr = HYPRE_IJVectorGetObject( ij_b, &object ); b = (HYPRE_ParVector) object; /* Initial guess */ hypre_Memset(values_d, 0, local_num_rows * sizeof(HYPRE_Complex), memory_location); HYPRE_IJVectorCreate(hypre_MPI_COMM_WORLD, first_local_col, last_local_col, &ij_x); HYPRE_IJVectorSetObjectType(ij_x, HYPRE_PARCSR); HYPRE_IJVectorSetNumComponents(ij_x, num_components); HYPRE_IJVectorInitialize_v2(ij_x, memory_location); for (c = 0; c < num_components; c++) { HYPRE_IJVectorSetComponent(ij_x, c); HYPRE_IJVectorSetValues(ij_x, local_num_cols, NULL, values_d); } HYPRE_IJVectorAssemble(ij_x); ierr = HYPRE_IJVectorGetObject( ij_x, &object ); x = (HYPRE_ParVector) object; hypre_TFree(values_h, HYPRE_MEMORY_HOST); hypre_TFree(values_d, memory_location); } else if (build_rhs_type == 3) { if (myid == 0) { hypre_printf(" RHS vector has random coefficients and unit 2-norm\n"); hypre_printf(" Initial guess is 0\n"); } /* RHS */ HYPRE_IJVectorCreate(hypre_MPI_COMM_WORLD, first_local_row, last_local_row, &ij_b); HYPRE_IJVectorSetObjectType(ij_b, HYPRE_PARCSR); HYPRE_IJVectorSetNumComponents(ij_b, num_components); HYPRE_IJVectorInitialize(ij_b); ierr = HYPRE_IJVectorGetObject( ij_b, &object ); b = (HYPRE_ParVector) object; /* For purposes of this test, HYPRE_ParVector functions are used, but these are not necessary. For a clean use of the interface, the user "should" modify coefficients of ij_x by using functions HYPRE_IJVectorSetValues or HYPRE_IJVectorAddToValues */ HYPRE_ParVectorSetRandomValues(b, 22775); HYPRE_ParVectorInnerProd(b, b, &norm); norm = 1. / hypre_sqrt(norm); ierr = HYPRE_ParVectorScale(norm, b); /* Initial guess */ HYPRE_IJVectorCreate(hypre_MPI_COMM_WORLD, first_local_col, last_local_col, &ij_x); HYPRE_IJVectorSetNumComponents(ij_x, num_components); HYPRE_IJVectorSetObjectType(ij_x, HYPRE_PARCSR); HYPRE_IJVectorInitialize(ij_x); HYPRE_IJVectorAssemble(ij_x); ierr = HYPRE_IJVectorGetObject( ij_x, &object ); x = (HYPRE_ParVector) object; } else if (build_rhs_type == 4) { if (myid == 0) { hypre_printf(" RHS vector set for solution with unit coefficients\n"); hypre_printf(" Initial guess is 0\n"); } HYPRE_Real *values_h = hypre_CTAlloc(HYPRE_Real, local_num_cols, HYPRE_MEMORY_HOST); HYPRE_Real *values_d = hypre_CTAlloc(HYPRE_Real, local_num_cols, memory_location); for (i = 0; i < local_num_cols; i++) { values_h[i] = 1.; } hypre_TMemcpy(values_d, values_h, HYPRE_Real, local_num_cols, memory_location, HYPRE_MEMORY_HOST); /* Temporary use of solution vector */ HYPRE_IJVectorCreate(hypre_MPI_COMM_WORLD, first_local_col, last_local_col, &ij_x); HYPRE_IJVectorSetObjectType(ij_x, HYPRE_PARCSR); HYPRE_IJVectorSetNumComponents(ij_x, num_components); HYPRE_IJVectorInitialize(ij_x); for (c = 0; c < num_components; c++) { HYPRE_IJVectorSetComponent(ij_x, c); HYPRE_IJVectorSetValues(ij_x, local_num_cols, NULL, values_d); } HYPRE_IJVectorAssemble(ij_x); ierr = HYPRE_IJVectorGetObject( ij_x, &object ); x = (HYPRE_ParVector) object; hypre_TFree(values_h, HYPRE_MEMORY_HOST); hypre_TFree(values_d, memory_location); /* RHS */ HYPRE_IJVectorCreate(hypre_MPI_COMM_WORLD, first_local_row, last_local_row, &ij_b); HYPRE_IJVectorSetObjectType(ij_b, HYPRE_PARCSR); HYPRE_IJVectorSetNumComponents(ij_b, num_components); HYPRE_IJVectorInitialize(ij_b); ierr = HYPRE_IJVectorGetObject( ij_b, &object ); b = (HYPRE_ParVector) object; HYPRE_ParCSRMatrixMatvec(1.0, parcsr_A, x, 0.0, b); /* Zero initial guess */ hypre_IJVectorZeroValues(ij_x); } else if (build_rhs_type == 5) { if (myid == 0) { hypre_printf(" RHS vector is 0\n"); hypre_printf(" Initial guess has unit coefficients\n"); } HYPRE_Real *values_h = hypre_CTAlloc(HYPRE_Real, local_num_cols, HYPRE_MEMORY_HOST); HYPRE_Real *values_d = hypre_CTAlloc(HYPRE_Real, local_num_cols, memory_location); for (i = 0; i < local_num_cols; i++) { values_h[i] = 1.; } hypre_TMemcpy(values_d, values_h, HYPRE_Real, local_num_cols, memory_location, HYPRE_MEMORY_HOST); /* RHS */ HYPRE_IJVectorCreate(hypre_MPI_COMM_WORLD, first_local_row, last_local_row, &ij_b); HYPRE_IJVectorSetObjectType(ij_b, HYPRE_PARCSR); HYPRE_IJVectorSetNumComponents(ij_b, num_components); HYPRE_IJVectorInitialize(ij_b); HYPRE_IJVectorAssemble(ij_b); ierr = HYPRE_IJVectorGetObject( ij_b, &object ); b = (HYPRE_ParVector) object; /* Initial guess */ HYPRE_IJVectorCreate(hypre_MPI_COMM_WORLD, first_local_col, last_local_col, &ij_x); HYPRE_IJVectorSetNumComponents(ij_x, num_components); HYPRE_IJVectorSetObjectType(ij_x, HYPRE_PARCSR); HYPRE_IJVectorInitialize(ij_x); for (c = 0; c < num_components; c++) { HYPRE_IJVectorSetComponent(ij_x, c); HYPRE_IJVectorSetValues(ij_x, local_num_cols, NULL, values_d); } HYPRE_IJVectorAssemble(ij_x); ierr = HYPRE_IJVectorGetObject( ij_x, &object ); x = (HYPRE_ParVector) object; hypre_TFree(values_h, HYPRE_MEMORY_HOST); hypre_TFree(values_d, memory_location); } else if (build_rhs_type == 6) { ij_b = NULL; } else if (build_rhs_type == 7) { if (myid == 0) { hypre_printf(" RHS vector read from file %s\n", argv[build_rhs_arg_index]); hypre_printf(" Initial guess is 0\n"); } ij_b = NULL; ReadParVectorFromFile(argc, argv, build_rhs_arg_index, &b); /* initial guess */ HYPRE_IJVectorCreate(hypre_MPI_COMM_WORLD, first_local_col, last_local_col, &ij_x); HYPRE_IJVectorSetObjectType(ij_x, HYPRE_PARCSR); HYPRE_IJVectorInitialize(ij_x); HYPRE_IJVectorAssemble(ij_x); ierr = HYPRE_IJVectorGetObject( ij_x, &object ); x = (HYPRE_ParVector) object; } else { if (build_rhs_type != -1) { if (myid == 0) { hypre_printf("Error: Invalid build_rhs_type!\n"); } hypre_MPI_Abort(comm, 1); } } if ( build_src_type == 0) { if (myid == 0) { hypre_printf(" Source vector read from file %s\n", argv[build_src_arg_index]); hypre_printf(" Initial unknown vector in evolution is 0\n"); } ierr = HYPRE_IJVectorRead( argv[build_src_arg_index], hypre_MPI_COMM_WORLD, HYPRE_PARCSR, &ij_b ); if (ierr) { hypre_printf("ERROR: Problem reading in the right-hand-side!\n"); exit(1); } ierr = HYPRE_IJVectorGetObject( ij_b, &object ); b = (HYPRE_ParVector) object; /* Initial unknown vector */ HYPRE_IJVectorCreate(hypre_MPI_COMM_WORLD, first_local_col, last_local_col, &ij_x); HYPRE_IJVectorSetObjectType(ij_x, HYPRE_PARCSR); HYPRE_IJVectorInitialize(ij_x); HYPRE_IJVectorAssemble(ij_x); ierr = HYPRE_IJVectorGetObject( ij_x, &object ); x = (HYPRE_ParVector) object; } else if (build_src_type == 1) { BuildRhsParFromOneFile(argc, argv, build_src_arg_index, parcsr_A, &b); ij_b = NULL; /* Initial unknown vector */ HYPRE_IJVectorCreate(hypre_MPI_COMM_WORLD, first_local_col, last_local_col, &ij_x); HYPRE_IJVectorSetObjectType(ij_x, HYPRE_PARCSR); HYPRE_IJVectorInitialize(ij_x); HYPRE_IJVectorAssemble(ij_x); ierr = HYPRE_IJVectorGetObject( ij_x, &object ); x = (HYPRE_ParVector) object; } else if ( build_src_type == 2 ) { if (myid == 0) { hypre_printf(" Source vector has unit coefficients\n"); hypre_printf(" Initial unknown vector is 0\n"); } /* RHS */ HYPRE_IJVectorCreate(hypre_MPI_COMM_WORLD, first_local_row, last_local_row, &ij_b); HYPRE_IJVectorSetObjectType(ij_b, HYPRE_PARCSR); HYPRE_IJVectorInitialize(ij_b); HYPRE_Real *values_h = hypre_CTAlloc(HYPRE_Real, local_num_rows, HYPRE_MEMORY_HOST); HYPRE_Real *values_d = hypre_CTAlloc(HYPRE_Real, local_num_rows, memory_location); for (i = 0; i < local_num_rows; i++) { values_h[i] = 1.; } hypre_TMemcpy(values_d, values_h, HYPRE_Real, local_num_rows, memory_location, HYPRE_MEMORY_HOST); HYPRE_IJVectorSetValues(ij_b, local_num_rows, NULL, values_d); HYPRE_IJVectorAssemble(ij_b); hypre_TFree(values_h, HYPRE_MEMORY_HOST); hypre_TFree(values_d, memory_location); ierr = HYPRE_IJVectorGetObject( ij_b, &object ); b = (HYPRE_ParVector) object; /* Initial guess */ HYPRE_IJVectorCreate(hypre_MPI_COMM_WORLD, first_local_col, last_local_col, &ij_x); HYPRE_IJVectorSetObjectType(ij_x, HYPRE_PARCSR); HYPRE_IJVectorInitialize(ij_x); /* For backward Euler the previous backward Euler iterate (assumed 0 here) is usually used as the initial guess */ HYPRE_IJVectorAssemble(ij_x); ierr = HYPRE_IJVectorGetObject( ij_x, &object ); x = (HYPRE_ParVector) object; } else if ( build_src_type == 3 ) { if (myid == 0) { hypre_printf(" Source vector has random coefficients in range 0 - 1\n"); hypre_printf(" Initial unknown vector is 0\n"); } /* RHS */ HYPRE_IJVectorCreate(hypre_MPI_COMM_WORLD, first_local_row, last_local_row, &ij_b); HYPRE_IJVectorSetObjectType(ij_b, HYPRE_PARCSR); HYPRE_IJVectorInitialize(ij_b); HYPRE_Real *values_h = hypre_CTAlloc(HYPRE_Real, local_num_rows, HYPRE_MEMORY_HOST); HYPRE_Real *values_d = hypre_CTAlloc(HYPRE_Real, local_num_rows, memory_location); hypre_SeedRand(myid); for (i = 0; i < local_num_rows; i++) { values_h[i] = hypre_Rand(); } hypre_TMemcpy(values_d, values_h, HYPRE_Real, local_num_rows, memory_location, HYPRE_MEMORY_HOST); HYPRE_IJVectorSetValues(ij_b, local_num_rows, NULL, values_d); HYPRE_IJVectorAssemble(ij_b); hypre_TFree(values_h, HYPRE_MEMORY_HOST); hypre_TFree(values_d, memory_location); ierr = HYPRE_IJVectorGetObject( ij_b, &object ); b = (HYPRE_ParVector) object; /* Initial guess */ HYPRE_IJVectorCreate(hypre_MPI_COMM_WORLD, first_local_col, last_local_col, &ij_x); HYPRE_IJVectorSetObjectType(ij_x, HYPRE_PARCSR); HYPRE_IJVectorInitialize(ij_x); /* For backward Euler the previous backward Euler iterate (assumed 0 here) is usually used as the initial guess */ HYPRE_IJVectorAssemble(ij_x); ierr = HYPRE_IJVectorGetObject( ij_x, &object ); x = (HYPRE_ParVector) object; } else if ( build_src_type == 4 ) { if (myid == 0) { hypre_printf(" Source vector is 0 \n"); hypre_printf(" Initial unknown vector has random coefficients in range 0 - 1\n"); } /* RHS */ HYPRE_IJVectorCreate(hypre_MPI_COMM_WORLD, first_local_row, last_local_row, &ij_b); HYPRE_IJVectorSetObjectType(ij_b, HYPRE_PARCSR); HYPRE_IJVectorInitialize(ij_b); HYPRE_Real *values_h = hypre_CTAlloc(HYPRE_Real, local_num_rows, HYPRE_MEMORY_HOST); HYPRE_Real *values_d = hypre_CTAlloc(HYPRE_Real, local_num_rows, memory_location); hypre_SeedRand(myid); for (i = 0; i < local_num_rows; i++) { values_h[i] = hypre_Rand() / dt; } hypre_TMemcpy(values_d, values_h, HYPRE_Real, local_num_rows, memory_location, HYPRE_MEMORY_HOST); HYPRE_IJVectorSetValues(ij_b, local_num_rows, NULL, values_d); HYPRE_IJVectorAssemble(ij_b); hypre_TFree(values_h, HYPRE_MEMORY_HOST); hypre_TFree(values_d, memory_location); ierr = HYPRE_IJVectorGetObject( ij_b, &object ); b = (HYPRE_ParVector) object; /* Initial guess */ HYPRE_IJVectorCreate(hypre_MPI_COMM_WORLD, first_local_col, last_local_col, &ij_x); HYPRE_IJVectorSetObjectType(ij_x, HYPRE_PARCSR); HYPRE_IJVectorInitialize(ij_x); /* For backward Euler the previous backward Euler iterate (assumed random in 0 - 1 here) is usually used as the initial guess */ values_h = hypre_CTAlloc(HYPRE_Real, local_num_cols, HYPRE_MEMORY_HOST); values_d = hypre_CTAlloc(HYPRE_Real, local_num_cols, memory_location); hypre_SeedRand(myid); for (i = 0; i < local_num_cols; i++) { values_h[i] = hypre_Rand(); } hypre_TMemcpy(values_d, values_h, HYPRE_Real, local_num_cols, memory_location, HYPRE_MEMORY_HOST); HYPRE_IJVectorSetValues(ij_x, local_num_cols, NULL, values_d); HYPRE_IJVectorAssemble(ij_x); hypre_TFree(values_h, HYPRE_MEMORY_HOST); hypre_TFree(values_d, memory_location); ierr = HYPRE_IJVectorGetObject( ij_x, &object ); x = (HYPRE_ParVector) object; } else if ( build_src_type == 5 ) { if (myid == 0) { hypre_printf(" Initial guess is random \n"); } /* Initial guess */ HYPRE_IJVectorCreate(hypre_MPI_COMM_WORLD, first_local_col, last_local_col, &ij_x); HYPRE_IJVectorSetObjectType(ij_x, HYPRE_PARCSR); HYPRE_IJVectorInitialize(ij_x); /* For backward Euler the previous backward Euler iterate (assumed random in 0 - 1 here) is usually used as the initial guess */ HYPRE_Real *values_h = hypre_CTAlloc(HYPRE_Real, local_num_cols, HYPRE_MEMORY_HOST); HYPRE_Real *values_d = hypre_CTAlloc(HYPRE_Real, local_num_cols, memory_location); hypre_SeedRand(myid + 2747); hypre_SeedRand(myid); for (i = 0; i < local_num_cols; i++) { values_h[i] = hypre_Rand(); } hypre_TMemcpy(values_d, values_h, HYPRE_Real, local_num_cols, memory_location, HYPRE_MEMORY_HOST); HYPRE_IJVectorSetValues(ij_x, local_num_cols, NULL, values_d); HYPRE_IJVectorAssemble(ij_x); hypre_TFree(values_h, HYPRE_MEMORY_HOST); hypre_TFree(values_d, memory_location); ierr = HYPRE_IJVectorGetObject( ij_x, &object ); x = (HYPRE_ParVector) object; } /* initial guess */ if (build_x0_type == 0 || build_x0_type == -2) { /* from file */ if (myid == 0) { hypre_printf(" Initial guess vector read from file %s\n", argv[build_x0_arg_index]); } /* x0 */ if (ij_x) { HYPRE_IJVectorDestroy(ij_x); } if (!build_x0_type) { ierr = HYPRE_IJVectorRead(argv[build_x0_arg_index], hypre_MPI_COMM_WORLD, HYPRE_PARCSR, &ij_x); } else { ierr = HYPRE_IJVectorReadBinary(argv[build_x0_arg_index], hypre_MPI_COMM_WORLD, HYPRE_PARCSR, &ij_x); } if (ierr) { hypre_printf("ERROR: Problem reading in x0!\n"); exit(1); } ierr = HYPRE_IJVectorGetObject( ij_x, &object ); x = (HYPRE_ParVector) object; } else if (build_x0_type == 7) { /* from file */ if (myid == 0) { hypre_printf(" Initial guess vector read from file %s\n", argv[build_x0_arg_index]); } ReadParVectorFromFile(argc, argv, build_x0_arg_index, &x); } else if (build_x0_type == 1) { /* random */ if (myid == 0) { hypre_printf(" Initial guess is random \n"); } if (ij_x) { HYPRE_IJVectorDestroy(ij_x); } /* Initial guess */ HYPRE_IJVectorCreate(hypre_MPI_COMM_WORLD, first_local_col, last_local_col, &ij_x); HYPRE_IJVectorSetObjectType(ij_x, HYPRE_PARCSR); HYPRE_IJVectorInitialize(ij_x); /* For backward Euler the previous backward Euler iterate (assumed random in 0 - 1 here) is usually used as the initial guess */ HYPRE_Real *values_h = hypre_CTAlloc(HYPRE_Real, local_num_cols, HYPRE_MEMORY_HOST); HYPRE_Real *values_d = hypre_CTAlloc(HYPRE_Real, local_num_cols, memory_location); hypre_SeedRand(myid); for (i = 0; i < local_num_cols; i++) { values_h[i] = hypre_Rand(); } hypre_TMemcpy(values_d, values_h, HYPRE_Real, local_num_cols, memory_location, HYPRE_MEMORY_HOST); HYPRE_IJVectorSetValues(ij_x, local_num_cols, NULL, values_d); HYPRE_IJVectorAssemble(ij_x); hypre_TFree(values_h, HYPRE_MEMORY_HOST); hypre_TFree(values_d, memory_location); ierr = HYPRE_IJVectorGetObject( ij_x, &object ); x = (HYPRE_ParVector) object; } /*----------------------------------------------------------- * Finalize IJVector Setup timings *-----------------------------------------------------------*/ hypre_EndTiming(time_index); hypre_PrintTiming("IJ Vector Setup", hypre_MPI_COMM_WORLD); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); if (num_functions > 1) { dof_func = NULL; if (build_funcs_type == 1) { if (myid == 0) { hypre_printf(" Calling BuildFuncsFromOneFile\n"); } BuildFuncsFromOneFile(argc, argv, build_funcs_arg_index, parcsr_A, &dof_func); } else if (build_funcs_type == 2) { if (myid == 0) { hypre_printf(" Calling BuildFuncsFromFiles\n"); } BuildFuncsFromFiles(argc, argv, build_funcs_arg_index, parcsr_A, &dof_func); } else { if (myid == 0) { hypre_printf (" Number of functions = %d \n", num_functions); } } } /*----------------------------------------------------------- * Print out the system and initial guess *-----------------------------------------------------------*/ if (negA) { hypre_ParCSRMatrixScale(parcsr_A, -1); } if (print_system) { if (ij_A) { HYPRE_IJMatrixPrint(ij_A, "IJ.out.A"); } else if (parcsr_A) { hypre_ParCSRMatrixPrintIJ(parcsr_A, 0, 0, "IJ.out.A"); } else { if (!myid) { hypre_printf(" Matrix A not found!\n"); } } if (parcsr_M != parcsr_A) { if (ij_M) { HYPRE_IJMatrixPrint(ij_M, "IJ.out.M"); } else { if (!myid) { hypre_printf(" Matrix M not found!\n"); } } } if (ij_b) { HYPRE_IJVectorPrint(ij_b, "IJ.out.b"); } else if (b) { HYPRE_ParVectorPrint(b, "ParVec.out.b"); } HYPRE_IJVectorPrint(ij_x, "IJ.out.x0"); } if (print_system_binary) { if (ij_A) { HYPRE_IJMatrixPrintBinary(ij_A, "IJ.out.A"); } else { hypre_ParCSRMatrixPrintBinaryIJ(parcsr_A, 0, 0, "IJ.out.A"); } if (ij_b) { HYPRE_IJVectorPrintBinary(ij_b, "IJ.out.b"); } else if (b) { HYPRE_ParVectorPrintBinaryIJ(b, "IJ.out.b"); } if (ij_x) { HYPRE_IJVectorPrintBinary(ij_x, "IJ.out.x0"); } else if (x) { HYPRE_ParVectorPrintBinaryIJ(x, "IJ.out.x0"); } } /*----------------------------------------------------------- * Migrate the system to the wanted memory space *-----------------------------------------------------------*/ hypre_ParCSRMatrixMigrate(parcsr_A, hypre_HandleMemoryLocation(hypre_handle())); hypre_ParVectorMigrate(b, hypre_HandleMemoryLocation(hypre_handle())); hypre_ParVectorMigrate(x, hypre_HandleMemoryLocation(hypre_handle())); if (build_matrix_M == 1) { hypre_ParCSRMatrixMigrate(parcsr_M, hypre_HandleMemoryLocation(hypre_handle())); } if (benchmark) { poutusr = 1; poutdat = 0; second_time = 1; } /* save the initial guess for the 2nd time */ if (second_time) { x0_save = hypre_ParVectorCloneDeep_v2(x, hypre_ParVectorMemoryLocation(x)); } /* Compute RHS squared norm */ if (ij_b) { HYPRE_IJVectorInnerProd(ij_b, ij_b, &b_dot_b); } else if (b) { HYPRE_ParVectorInnerProd(b, b, &b_dot_b); } else { if (!myid) { hypre_printf(" Error: Vector b not set!\n"); } hypre_MPI_Abort(comm, 1); } /*----------------------------------------------------------- * Test multivector support *-----------------------------------------------------------*/ if (test_multivec && ij_b && num_components > 1) { HYPRE_IJVector ij_bf; HYPRE_Complex *d_data_full; HYPRE_Real bf_dot_bf, e_dot_e; HYPRE_Int num_rows_full = local_num_rows * num_components; HYPRE_BigInt ilower = first_local_row * num_components; HYPRE_BigInt iupper = ilower + (HYPRE_BigInt) num_rows_full - 1; /* Allocate memory */ d_data_full = hypre_CTAlloc(HYPRE_Complex, num_rows_full, memory_location); /* Get values */ for (c = 0; c < num_components; c++) { HYPRE_IJVectorSetComponent(ij_b, c); HYPRE_IJVectorGetValues(ij_b, local_num_rows, NULL, &d_data_full[c * local_num_rows]); } /* Create a single component vector containing all values of b */ HYPRE_IJVectorCreate(comm, ilower, iupper, &ij_bf); HYPRE_IJVectorSetObjectType(ij_bf, HYPRE_PARCSR); HYPRE_IJVectorInitialize(ij_bf); HYPRE_IJVectorSetValues(ij_bf, num_rows_full, NULL, d_data_full); HYPRE_IJVectorAssemble(ij_bf); HYPRE_IJVectorInnerProd(ij_bf, ij_bf, &bf_dot_bf); e_dot_e = bf_dot_bf - b_dot_b; if (myid == 0) { hypre_printf("\nVector/Multivector error = %e\n\n", e_dot_e); } /* Free memory */ hypre_TFree(d_data_full, memory_location); HYPRE_IJVectorDestroy(ij_bf); } /*----------------------------------------------------------- * Test matrix scaling: B = diag(ld) * A * diag(rd) *-----------------------------------------------------------*/ if (test_scaling) { HYPRE_IJVector ij_ld = NULL; HYPRE_IJVector ij_rd = NULL; HYPRE_ParVector par_ld = NULL; HYPRE_ParVector par_rd = NULL; HYPRE_Complex *d_data; HYPRE_Int scaling_type; time_index = hypre_InitializeTiming("ParCSR scaling"); hypre_BeginTiming(time_index); /* Allocate memory */ d_data = hypre_TAlloc(HYPRE_Complex, local_num_rows, memory_location); /* Select scaling type: left OR right scaling: diag inverse (2) left AND right scaling: diag inverse sqrt (3) */ scaling_type = (test_scaling == 1 || test_scaling == 2) ? 2 : 3; /* Compute scaling vector */ hypre_CSRMatrixExtractDiagonal(hypre_ParCSRMatrixDiag(parcsr_A), d_data, scaling_type); /* Create diagonal scaling matrix diag(ld) */ if (test_scaling != 2) { HYPRE_IJVectorCreate(comm, first_local_row, last_local_row, &ij_ld); HYPRE_IJVectorSetObjectType(ij_ld, HYPRE_PARCSR); HYPRE_IJVectorInitialize(ij_ld); HYPRE_IJVectorSetValues(ij_ld, local_num_rows, NULL, d_data); HYPRE_IJVectorAssemble(ij_ld); HYPRE_IJVectorGetObject(ij_ld, &object); par_ld = (HYPRE_ParVector) object; } /* Create diagonal scaling matrix diag(rd) */ if (test_scaling != 1) { HYPRE_IJVectorCreate(comm, first_local_row, last_local_row, &ij_rd); HYPRE_IJVectorSetObjectType(ij_rd, HYPRE_PARCSR); HYPRE_IJVectorInitialize(ij_rd); HYPRE_IJVectorSetValues(ij_rd, local_num_rows, NULL, d_data); HYPRE_IJVectorAssemble(ij_rd); HYPRE_IJVectorGetObject(ij_rd, &object); par_rd = (HYPRE_ParVector) object; } /* Compute A = diag(ld) * A * diag(rd) */ hypre_ParCSRMatrixDiagScale(parcsr_A, par_ld, par_rd); /* Print scaled matrix */ if (print_system) { hypre_ParCSRMatrixPrintIJ(parcsr_A, 0, 0, "IJ.out.Ascal"); HYPRE_IJVectorPrint(ij_ld, "IJ.out.ld"); HYPRE_IJVectorPrint(ij_rd, "IJ.out.rd"); } /* Free memory */ hypre_TFree(d_data, memory_location); if (ij_rd) { HYPRE_IJVectorDestroy(ij_rd); } if (ij_ld) { HYPRE_IJVectorDestroy(ij_ld); } hypre_EndTiming(time_index); hypre_PrintTiming("ParCSR scaling", hypre_MPI_COMM_WORLD); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); } /*----------------------------------------------------------- * Perform sparse matrix/vector multiplication *-----------------------------------------------------------*/ if (solver_id == -1) { HYPRE_Int num_threads = hypre_NumThreads(); if (myid == 0) { hypre_printf("Running %d matvecs with A\n", nmv); hypre_printf("\n\n Num MPI tasks = %d\n\n", num_procs); hypre_printf(" Num OpenMP threads = %d\n\n", num_threads); } HYPRE_Real tt = hypre_MPI_Wtime(); time_index = hypre_InitializeTiming("MatVec Test"); hypre_BeginTiming(time_index); for (i = 0; i < nmv; i++) { HYPRE_ParCSRMatrixMatvec(1., parcsr_A, x, 0., b); } hypre_EndTiming(time_index); hypre_PrintTiming("MatVec Test", hypre_MPI_COMM_WORLD); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); tt = hypre_MPI_Wtime() - tt; if (myid == 0) { hypre_printf("Matvec time %.2f (ms)\n", tt * 1000.0); } goto final; } /*----------------------------------------------------------- * Solve the system using the hybrid solver *-----------------------------------------------------------*/ if (solver_id == 20) { if (myid == 0) { hypre_printf("Solver: AMG\n"); } time_index = hypre_InitializeTiming("AMG_hybrid Setup"); hypre_BeginTiming(time_index); HYPRE_ParCSRHybridCreate(&amg_solver); HYPRE_ParCSRHybridSetTol(amg_solver, tol); HYPRE_ParCSRHybridSetAbsoluteTol(amg_solver, atol); HYPRE_ParCSRHybridSetConvergenceTol(amg_solver, cf_tol); HYPRE_ParCSRHybridSetSolverType(amg_solver, solver_type); HYPRE_ParCSRHybridSetRecomputeResidual(amg_solver, recompute_res); HYPRE_ParCSRHybridSetLogging(amg_solver, ioutdat); HYPRE_ParCSRHybridSetPrintLevel(amg_solver, poutdat); HYPRE_ParCSRHybridSetDSCGMaxIter(amg_solver, max_iter); HYPRE_ParCSRHybridSetPCGMaxIter(amg_solver, mg_max_iter); HYPRE_ParCSRHybridSetCoarsenType(amg_solver, coarsen_type); HYPRE_ParCSRHybridSetStrongThreshold(amg_solver, strong_threshold); HYPRE_ParCSRHybridSetTruncFactor(amg_solver, trunc_factor); HYPRE_ParCSRHybridSetPMaxElmts(amg_solver, P_max_elmts); HYPRE_ParCSRHybridSetMaxLevels(amg_solver, max_levels); HYPRE_ParCSRHybridSetMaxRowSum(amg_solver, max_row_sum); HYPRE_ParCSRHybridSetNumSweeps(amg_solver, num_sweeps); HYPRE_ParCSRHybridSetInterpType(amg_solver, interp_type); if (relax_type > -1) { HYPRE_ParCSRHybridSetRelaxType(amg_solver, relax_type); } HYPRE_ParCSRHybridSetAggNumLevels(amg_solver, agg_num_levels); HYPRE_ParCSRHybridSetAggInterpType(amg_solver, agg_interp_type); HYPRE_ParCSRHybridSetNumPaths(amg_solver, num_paths); HYPRE_ParCSRHybridSetNumFunctions(amg_solver, num_functions); HYPRE_ParCSRHybridSetNodal(amg_solver, nodal); if (relax_down > -1) { HYPRE_ParCSRHybridSetCycleRelaxType(amg_solver, relax_down, 1); } if (relax_up > -1) { HYPRE_ParCSRHybridSetCycleRelaxType(amg_solver, relax_up, 2); } if (relax_coarse > -1) { HYPRE_ParCSRHybridSetCycleRelaxType(amg_solver, relax_coarse, 3); } HYPRE_ParCSRHybridSetRelaxOrder(amg_solver, relax_order); HYPRE_ParCSRHybridSetKeepTranspose(amg_solver, keepTranspose); HYPRE_ParCSRHybridSetMaxCoarseSize(amg_solver, coarse_threshold); HYPRE_ParCSRHybridSetMinCoarseSize(amg_solver, min_coarse_size); HYPRE_ParCSRHybridSetSeqThreshold(amg_solver, seq_threshold); HYPRE_ParCSRHybridSetRelaxWt(amg_solver, relax_wt); HYPRE_ParCSRHybridSetOuterWt(amg_solver, outer_wt); if (level_w > -1) { HYPRE_ParCSRHybridSetLevelRelaxWt(amg_solver, relax_wt_level, level_w); } if (level_ow > -1) { HYPRE_ParCSRHybridSetLevelOuterWt(amg_solver, outer_wt_level, level_ow); } HYPRE_ParCSRHybridSetNonGalerkinTol(amg_solver, nongalerk_num_tol, nongalerk_tol); HYPRE_ParCSRHybridSetup(amg_solver, parcsr_M, b, x); hypre_EndTiming(time_index); hypre_PrintTiming("Setup phase times", hypre_MPI_COMM_WORLD); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); time_index = hypre_InitializeTiming("ParCSR Hybrid Solve"); hypre_BeginTiming(time_index); HYPRE_ParCSRHybridSolve(amg_solver, parcsr_A, b, x); hypre_EndTiming(time_index); hypre_PrintTiming("Solve phase times", hypre_MPI_COMM_WORLD); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); if (second_time) { /* run a second time [for timings, to check for memory leaks] */ HYPRE_ParVectorSetRandomValues(x, 775); #if defined(HYPRE_USING_CURAND) || defined(HYPRE_USING_ROCRAND) hypre_ResetDeviceRandGenerator(1234ULL, 0ULL); #endif hypre_ParVectorCopy(x0_save, x); if (myid == 0) { hypre_printf("Solver: AMG\n"); } time_index = hypre_InitializeTiming("AMG_hybrid Setup"); hypre_BeginTiming(time_index); HYPRE_ParCSRHybridSetup(amg_solver, parcsr_M, b, x); hypre_EndTiming(time_index); hypre_PrintTiming("Setup phase times", hypre_MPI_COMM_WORLD); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); time_index = hypre_InitializeTiming("ParCSR Hybrid Solve"); hypre_BeginTiming(time_index); HYPRE_ParCSRHybridSolve(amg_solver, parcsr_A, b, x); hypre_EndTiming(time_index); hypre_PrintTiming("Solve phase times", hypre_MPI_COMM_WORLD); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); HYPRE_Real time[4]; HYPRE_ParCSRHybridGetSetupSolveTime(amg_solver, time); if (myid == 0) { hypre_printf("ParCSRHybrid: Setup-Time1 %f Solve-Time1 %f Setup-Time2 %f Solve-Time2 %f\n", time[0], time[1], time[2], time[3]); } } HYPRE_ParCSRHybridGetNumIterations(amg_solver, &num_iterations); HYPRE_ParCSRHybridGetPCGNumIterations(amg_solver, &pcg_num_its); HYPRE_ParCSRHybridGetDSCGNumIterations(amg_solver, &dscg_num_its); HYPRE_ParCSRHybridGetFinalRelativeResidualNorm(amg_solver, &final_res_norm); if (myid == 0) { hypre_printf("\n"); hypre_printf("Iterations = %d\n", num_iterations); hypre_printf("PCG_Iterations = %d\n", pcg_num_its); hypre_printf("DSCG_Iterations = %d\n", dscg_num_its); hypre_printf("Final Relative Residual Norm = %e\n", final_res_norm); hypre_printf("\n"); } HYPRE_ParCSRHybridDestroy(amg_solver); } /*----------------------------------------------------------- * Solve the system using AMG *-----------------------------------------------------------*/ if (solver_id == 0 || solver_id == 90) { HYPRE_ANNOTATE_REGION_BEGIN("%s", "Run-1"); if (solver_id == 0) { if (myid == 0) { hypre_printf("Solver: AMG\n"); } time_index = hypre_InitializeTiming("BoomerAMG Setup"); hypre_BeginTiming(time_index); HYPRE_BoomerAMGCreate(&amg_solver); } else if (solver_id == 90) { if (myid == 0) { hypre_printf("Solver: AMG-DD\n"); } time_index = hypre_InitializeTiming("BoomerAMGDD Setup"); hypre_BeginTiming(time_index); HYPRE_BoomerAMGDDCreate(&amgdd_solver); HYPRE_BoomerAMGDDGetAMG(amgdd_solver, &amg_solver); /* AMG-DD options */ HYPRE_BoomerAMGDDSetStartLevel(amgdd_solver, amgdd_start_level); HYPRE_BoomerAMGDDSetPadding(amgdd_solver, amgdd_padding); HYPRE_BoomerAMGDDSetFACNumRelax(amgdd_solver, amgdd_fac_num_relax); HYPRE_BoomerAMGDDSetFACNumCycles(amgdd_solver, amgdd_num_comp_cycles); HYPRE_BoomerAMGDDSetFACRelaxType(amgdd_solver, amgdd_fac_relax_type); HYPRE_BoomerAMGDDSetFACCycleType(amgdd_solver, amgdd_fac_cycle_type); HYPRE_BoomerAMGDDSetNumGhostLayers(amgdd_solver, amgdd_num_ghost_layers); } if (air) { /* RL: specify restriction */ hypre_assert(restri_type >= 0); HYPRE_BoomerAMGSetRestriction(amg_solver, restri_type); /* 0: P^T, 1: AIR, 2: AIR-2 */ HYPRE_BoomerAMGSetGridRelaxPoints(amg_solver, grid_relax_points); HYPRE_BoomerAMGSetStrongThresholdR(amg_solver, strong_thresholdR); HYPRE_BoomerAMGSetFilterThresholdR(amg_solver, filter_thresholdR); } /* RL */ HYPRE_BoomerAMGSetADropTol(amg_solver, A_drop_tol); HYPRE_BoomerAMGSetADropType(amg_solver, A_drop_type); /* BM Aug 25, 2006 */ HYPRE_BoomerAMGSetCGCIts(amg_solver, cgcits); HYPRE_BoomerAMGSetInterpType(amg_solver, interp_type); HYPRE_BoomerAMGSetRestriction(amg_solver, restri_type); /* 0: P^T, 1: AIR, 2: AIR-2 */ HYPRE_BoomerAMGSetPostInterpType(amg_solver, post_interp_type); HYPRE_BoomerAMGSetNumSamples(amg_solver, gsmg_samples); HYPRE_BoomerAMGSetCoarsenType(amg_solver, coarsen_type); HYPRE_BoomerAMGSetCoarsenCutFactor(amg_solver, coarsen_cut_factor); HYPRE_BoomerAMGSetCPoints(amg_solver, max_levels, num_cpt, cpt_index); HYPRE_BoomerAMGSetFPoints(amg_solver, num_fpt, fpt_index); HYPRE_BoomerAMGSetIsolatedFPoints(amg_solver, num_isolated_fpt, isolated_fpt_index); HYPRE_BoomerAMGSetMeasureType(amg_solver, measure_type); HYPRE_BoomerAMGSetConvergeType(amg_solver, converge_type); HYPRE_BoomerAMGSetTol(amg_solver, tol); HYPRE_BoomerAMGSetStrongThreshold(amg_solver, strong_threshold); HYPRE_BoomerAMGSetSeqThreshold(amg_solver, seq_threshold); HYPRE_BoomerAMGSetRedundant(amg_solver, redundant); HYPRE_BoomerAMGSetMaxCoarseSize(amg_solver, coarse_threshold); HYPRE_BoomerAMGSetMinCoarseSize(amg_solver, min_coarse_size); HYPRE_BoomerAMGSetTruncFactor(amg_solver, trunc_factor); HYPRE_BoomerAMGSetPMaxElmts(amg_solver, P_max_elmts); HYPRE_BoomerAMGSetJacobiTruncThreshold(amg_solver, jacobi_trunc_threshold); HYPRE_BoomerAMGSetSCommPkgSwitch(amg_solver, S_commpkg_switch); /* note: log is written to standard output, not to file */ HYPRE_BoomerAMGSetPrintLevel(amg_solver, poutusr ? poutdat : 3); //HYPRE_BoomerAMGSetLogging(amg_solver, 2); HYPRE_BoomerAMGSetPrintFileName(amg_solver, "driver.out.log"); HYPRE_BoomerAMGSetCycleType(amg_solver, cycle_type); HYPRE_BoomerAMGSetFCycle(amg_solver, fcycle); HYPRE_BoomerAMGSetNumSweeps(amg_solver, num_sweeps); HYPRE_BoomerAMGSetISType(amg_solver, IS_type); HYPRE_BoomerAMGSetNumCRRelaxSteps(amg_solver, num_CR_relax_steps); HYPRE_BoomerAMGSetCRRate(amg_solver, CR_rate); HYPRE_BoomerAMGSetCRStrongTh(amg_solver, CR_strong_th); HYPRE_BoomerAMGSetCRUseCG(amg_solver, CR_use_CG); if (relax_type > -1) { HYPRE_BoomerAMGSetRelaxType(amg_solver, relax_type); } if (relax_down > -1) { HYPRE_BoomerAMGSetCycleRelaxType(amg_solver, relax_down, 1); } if (relax_up > -1) { HYPRE_BoomerAMGSetCycleRelaxType(amg_solver, relax_up, 2); } if (relax_coarse > -1) { HYPRE_BoomerAMGSetCycleRelaxType(amg_solver, relax_coarse, 3); } HYPRE_BoomerAMGSetAddRelaxType(amg_solver, add_relax_type); HYPRE_BoomerAMGSetAddRelaxWt(amg_solver, add_relax_wt); HYPRE_BoomerAMGSetChebyOrder(amg_solver, cheby_order); HYPRE_BoomerAMGSetChebyFraction(amg_solver, cheby_fraction); HYPRE_BoomerAMGSetChebyEigEst(amg_solver, cheby_eig_est); HYPRE_BoomerAMGSetChebyVariant(amg_solver, cheby_variant); HYPRE_BoomerAMGSetChebyScale(amg_solver, cheby_scale); HYPRE_BoomerAMGSetRelaxOrder(amg_solver, relax_order); HYPRE_BoomerAMGSetRelaxWt(amg_solver, relax_wt); HYPRE_BoomerAMGSetOuterWt(amg_solver, outer_wt); HYPRE_BoomerAMGSetMaxLevels(amg_solver, max_levels); if (level_w > -1) { HYPRE_BoomerAMGSetLevelRelaxWt(amg_solver, relax_wt_level, level_w); } if (level_ow > -1) { HYPRE_BoomerAMGSetLevelOuterWt(amg_solver, outer_wt_level, level_ow); } HYPRE_BoomerAMGSetSmoothType(amg_solver, smooth_type); HYPRE_BoomerAMGSetSmoothNumSweeps(amg_solver, smooth_num_sweeps); HYPRE_BoomerAMGSetSmoothNumLevels(amg_solver, smooth_num_levels); HYPRE_BoomerAMGSetMaxRowSum(amg_solver, max_row_sum); HYPRE_BoomerAMGSetDebugFlag(amg_solver, debug_flag); HYPRE_BoomerAMGSetVariant(amg_solver, variant); HYPRE_BoomerAMGSetOverlap(amg_solver, overlap); HYPRE_BoomerAMGSetDomainType(amg_solver, domain_type); HYPRE_BoomerAMGSetSchwarzUseNonSymm(amg_solver, use_nonsymm_schwarz); HYPRE_BoomerAMGSetSchwarzRlxWeight(amg_solver, schwarz_rlx_weight); if (eu_level < 0) { eu_level = 0; } HYPRE_BoomerAMGSetEuLevel(amg_solver, eu_level); HYPRE_BoomerAMGSetEuBJ(amg_solver, eu_bj); HYPRE_BoomerAMGSetEuSparseA(amg_solver, eu_sparse_A); HYPRE_BoomerAMGSetILUType(amg_solver, ilu_type); HYPRE_BoomerAMGSetILULevel(amg_solver, ilu_lfil); HYPRE_BoomerAMGSetILUDroptol(amg_solver, ilu_droptol); HYPRE_BoomerAMGSetILUMaxRowNnz(amg_solver, ilu_max_row_nnz); HYPRE_BoomerAMGSetILUMaxIter(amg_solver, ilu_sm_max_iter); HYPRE_BoomerAMGSetILUTriSolve(amg_solver, ilu_tri_solve); HYPRE_BoomerAMGSetILULowerJacobiIters(amg_solver, ilu_ljac_iters); HYPRE_BoomerAMGSetILUUpperJacobiIters(amg_solver, ilu_ujac_iters); HYPRE_BoomerAMGSetILULocalReordering(amg_solver, ilu_reordering); HYPRE_BoomerAMGSetILUIterSetupType(amg_solver, ilu_iter_setup_type); HYPRE_BoomerAMGSetILUIterSetupOption(amg_solver, ilu_iter_setup_option); HYPRE_BoomerAMGSetILUIterSetupMaxIter(amg_solver, ilu_iter_setup_max_iter); HYPRE_BoomerAMGSetILUIterSetupTolerance(amg_solver, ilu_iter_setup_tolerance); HYPRE_BoomerAMGSetFSAIAlgoType(amg_solver, fsai_algo_type); HYPRE_BoomerAMGSetFSAILocalSolveType(amg_solver, fsai_ls_type); HYPRE_BoomerAMGSetFSAIMaxSteps(amg_solver, fsai_max_steps); HYPRE_BoomerAMGSetFSAIMaxStepSize(amg_solver, fsai_max_step_size); HYPRE_BoomerAMGSetFSAIMaxNnzRow(amg_solver, fsai_max_nnz_row); HYPRE_BoomerAMGSetFSAINumLevels(amg_solver, fsai_num_levels); HYPRE_BoomerAMGSetFSAIThreshold(amg_solver, fsai_threshold); HYPRE_BoomerAMGSetFSAIEigMaxIters(amg_solver, fsai_eig_max_iters); HYPRE_BoomerAMGSetFSAIKapTolerance(amg_solver, fsai_kap_tolerance); HYPRE_BoomerAMGSetFilterFunctions(amg_solver, filter_functions); HYPRE_BoomerAMGSetNumFunctions(amg_solver, num_functions); HYPRE_BoomerAMGSetAggNumLevels(amg_solver, agg_num_levels); HYPRE_BoomerAMGSetAggInterpType(amg_solver, agg_interp_type); HYPRE_BoomerAMGSetAggTruncFactor(amg_solver, agg_trunc_factor); HYPRE_BoomerAMGSetAggP12TruncFactor(amg_solver, agg_P12_trunc_factor); HYPRE_BoomerAMGSetAggPMaxElmts(amg_solver, agg_P_max_elmts); HYPRE_BoomerAMGSetAggP12MaxElmts(amg_solver, agg_P12_max_elmts); HYPRE_BoomerAMGSetNumPaths(amg_solver, num_paths); HYPRE_BoomerAMGSetNodal(amg_solver, nodal); HYPRE_BoomerAMGSetNodalDiag(amg_solver, nodal_diag); HYPRE_BoomerAMGSetKeepSameSign(amg_solver, keep_same_sign); HYPRE_BoomerAMGSetCycleNumSweeps(amg_solver, ns_coarse, 3); if (ns_down > -1) { HYPRE_BoomerAMGSetCycleNumSweeps(amg_solver, ns_down, 1); } if (ns_up > -1) { HYPRE_BoomerAMGSetCycleNumSweeps(amg_solver, ns_up, 2); } if (num_functions > 1) { HYPRE_BoomerAMGSetDofFunc(amg_solver, dof_func); } HYPRE_BoomerAMGSetAdditive(amg_solver, additive); HYPRE_BoomerAMGSetMultAdditive(amg_solver, mult_add); HYPRE_BoomerAMGSetSimple(amg_solver, simple); HYPRE_BoomerAMGSetAddLastLvl(amg_solver, add_last_lvl); HYPRE_BoomerAMGSetMultAddPMaxElmts(amg_solver, add_P_max_elmts); HYPRE_BoomerAMGSetMultAddTruncFactor(amg_solver, add_trunc_factor); HYPRE_BoomerAMGSetMaxIter(amg_solver, mg_max_iter); HYPRE_BoomerAMGSetRAP2(amg_solver, rap2); HYPRE_BoomerAMGSetModuleRAP2(amg_solver, mod_rap2); HYPRE_BoomerAMGSetKeepTranspose(amg_solver, keepTranspose); #ifdef HYPRE_USING_DSUPERLU HYPRE_BoomerAMGSetDSLUThreshold(amg_solver, dslu_threshold); #endif /*HYPRE_BoomerAMGSetNonGalerkTol(amg_solver, nongalerk_num_tol, nongalerk_tol);*/ if (nongalerk_tol) { HYPRE_BoomerAMGSetNonGalerkinTol(amg_solver, nongalerk_tol[nongalerk_num_tol - 1]); for (i = 0; i < nongalerk_num_tol - 1; i++) { HYPRE_BoomerAMGSetLevelNonGalerkinTol(amg_solver, nongalerk_tol[i], i); } } if (build_rbm) { HYPRE_BoomerAMGSetInterpVectors(amg_solver, num_interp_vecs, interp_vecs); HYPRE_BoomerAMGSetInterpVecVariant(amg_solver, interp_vec_variant); HYPRE_BoomerAMGSetInterpVecQMax(amg_solver, Q_max); HYPRE_BoomerAMGSetInterpVecAbsQTrunc(amg_solver, Q_trunc); } /* BM Oct 23, 2006 */ if (plot_grids) { HYPRE_BoomerAMGSetPlotGrids (amg_solver, 1); HYPRE_BoomerAMGSetPlotFileName (amg_solver, plot_file_name); HYPRE_BoomerAMGSetCoordDim (amg_solver, coord_dim); HYPRE_BoomerAMGSetCoordinates (amg_solver, coordinates); } hypre_GpuProfilingPushRange("AMG-Setup-1"); if (solver_id == 0) { HYPRE_BoomerAMGSetup(amg_solver, parcsr_M, b, x); } else if (solver_id == 90) { HYPRE_BoomerAMGDDSetup(amgdd_solver, parcsr_M, b, x); } hypre_GpuProfilingPopRange(); hypre_EndTiming(time_index); hypre_PrintTiming("Setup phase times", hypre_MPI_COMM_WORLD); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); if (solver_id == 0) { time_index = hypre_InitializeTiming("BoomerAMG Solve"); } else if (solver_id == 90) { time_index = hypre_InitializeTiming("BoomerAMG-DD Solve"); } hypre_BeginTiming(time_index); hypre_GpuProfilingPushRange("AMG-Solve-1"); if (solver_id == 0) { HYPRE_BoomerAMGSolve(amg_solver, parcsr_A, b, x); } else if (solver_id == 90) { HYPRE_BoomerAMGDDSolve(amgdd_solver, parcsr_A, b, x); } hypre_GpuProfilingPopRange(); hypre_EndTiming(time_index); hypre_PrintTiming("Solve phase times", hypre_MPI_COMM_WORLD); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); HYPRE_ANNOTATE_REGION_END("%s", "Run-1"); if (second_time) { HYPRE_ANNOTATE_REGION_BEGIN("%s", "Run-2"); HYPRE_SetExecutionPolicy(exec2_policy); /* run a second time [for timings, to check for memory leaks] */ HYPRE_ParVectorSetRandomValues(x, 775); #if defined(HYPRE_USING_CURAND) || defined(HYPRE_USING_ROCRAND) hypre_ResetDeviceRandGenerator(1234ULL, 0ULL); #endif hypre_ParVectorCopy(x0_save, x); #if defined(HYPRE_USING_CUDA) cudaProfilerStart(); #endif time_index = hypre_InitializeTiming("BoomerAMG/AMG-DD Setup2"); hypre_BeginTiming(time_index); hypre_GpuProfilingPushRange("AMG-Setup-2"); if (solver_id == 0) { HYPRE_BoomerAMGSetup(amg_solver, parcsr_M, b, x); } else if (solver_id == 90) { HYPRE_BoomerAMGDDSetup(amgdd_solver, parcsr_M, b, x); } hypre_GpuProfilingPopRange(); hypre_EndTiming(time_index); hypre_PrintTiming("Setup phase times", hypre_MPI_COMM_WORLD); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); time_index = hypre_InitializeTiming("BoomerAMG/AMG-DD Solve2"); hypre_BeginTiming(time_index); hypre_GpuProfilingPushRange("AMG-Solve-2"); if (solver_id == 0) { HYPRE_BoomerAMGSolve(amg_solver, parcsr_A, b, x); } else if (solver_id == 90) { HYPRE_BoomerAMGDDSolve(amgdd_solver, parcsr_A, b, x); } hypre_GpuProfilingPopRange(); hypre_EndTiming(time_index); hypre_PrintTiming("Solve phase times", hypre_MPI_COMM_WORLD); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); HYPRE_ANNOTATE_REGION_END("%s", "Run-2"); #if defined(HYPRE_USING_CUDA) cudaProfilerStop(); #endif } if (solver_id == 0) { HYPRE_BoomerAMGGetNumIterations(amg_solver, &num_iterations); HYPRE_BoomerAMGGetFinalRelativeResidualNorm(amg_solver, &final_res_norm); } else if (solver_id == 90) { HYPRE_BoomerAMGDDGetNumIterations(amgdd_solver, &num_iterations); HYPRE_BoomerAMGDDGetFinalRelativeResidualNorm(amgdd_solver, &final_res_norm); } if (myid == 0) { hypre_printf("\n"); if (solver_id == 0) { hypre_printf("BoomerAMG Iterations = %d\n", num_iterations); } else if (solver_id == 90) { hypre_printf("BoomerAMG-DD Iterations = %d\n", num_iterations); } hypre_printf("Final Relative Residual Norm = %e\n", final_res_norm); hypre_printf("\n"); } if (solver_id == 0) { HYPRE_BoomerAMGDestroy(amg_solver); } else if (solver_id == 90) { HYPRE_BoomerAMGDDDestroy(amgdd_solver); } } /*----------------------------------------------------------- * Solve the system using GSMG *-----------------------------------------------------------*/ if (solver_id == 13) { /* reset some smoother parameters */ relax_order = 0; if (myid == 0) { hypre_printf("Solver: GSMG\n"); } time_index = hypre_InitializeTiming("BoomerAMG Setup"); hypre_BeginTiming(time_index); HYPRE_BoomerAMGCreate(&amg_solver); HYPRE_BoomerAMGSetGSMG(amg_solver, 4); /* specify GSMG */ /* BM Aug 25, 2006 */ HYPRE_BoomerAMGSetCGCIts(amg_solver, cgcits); HYPRE_BoomerAMGSetInterpType(amg_solver, interp_type); HYPRE_BoomerAMGSetPostInterpType(amg_solver, post_interp_type); HYPRE_BoomerAMGSetNumSamples(amg_solver, gsmg_samples); HYPRE_BoomerAMGSetCoarsenType(amg_solver, coarsen_type); HYPRE_BoomerAMGSetCoarsenCutFactor(amg_solver, coarsen_cut_factor); HYPRE_BoomerAMGSetCPoints(amg_solver, max_levels, num_cpt, cpt_index); HYPRE_BoomerAMGSetFPoints(amg_solver, num_fpt, fpt_index); HYPRE_BoomerAMGSetIsolatedFPoints(amg_solver, num_isolated_fpt, isolated_fpt_index); HYPRE_BoomerAMGSetMeasureType(amg_solver, measure_type); HYPRE_BoomerAMGSetTol(amg_solver, tol); HYPRE_BoomerAMGSetStrongThreshold(amg_solver, strong_threshold); HYPRE_BoomerAMGSetSeqThreshold(amg_solver, seq_threshold); HYPRE_BoomerAMGSetRedundant(amg_solver, redundant); HYPRE_BoomerAMGSetMaxCoarseSize(amg_solver, coarse_threshold); HYPRE_BoomerAMGSetMinCoarseSize(amg_solver, min_coarse_size); HYPRE_BoomerAMGSetTruncFactor(amg_solver, trunc_factor); HYPRE_BoomerAMGSetPMaxElmts(amg_solver, P_max_elmts); HYPRE_BoomerAMGSetJacobiTruncThreshold(amg_solver, jacobi_trunc_threshold); HYPRE_BoomerAMGSetSCommPkgSwitch(amg_solver, S_commpkg_switch); /* note: log is written to standard output, not to file */ HYPRE_BoomerAMGSetPrintLevel(amg_solver, 3); HYPRE_BoomerAMGSetPrintFileName(amg_solver, "driver.out.log"); HYPRE_BoomerAMGSetMaxIter(amg_solver, mg_max_iter); HYPRE_BoomerAMGSetCycleType(amg_solver, cycle_type); HYPRE_BoomerAMGSetFCycle(amg_solver, fcycle); HYPRE_BoomerAMGSetNumSweeps(amg_solver, num_sweeps); if (relax_type > -1) { HYPRE_BoomerAMGSetRelaxType(amg_solver, relax_type); } if (relax_down > -1) { HYPRE_BoomerAMGSetCycleRelaxType(amg_solver, relax_down, 1); } if (relax_up > -1) { HYPRE_BoomerAMGSetCycleRelaxType(amg_solver, relax_up, 2); } if (relax_coarse > -1) { HYPRE_BoomerAMGSetCycleRelaxType(amg_solver, relax_coarse, 3); } HYPRE_BoomerAMGSetAddRelaxType(amg_solver, add_relax_type); HYPRE_BoomerAMGSetAddRelaxWt(amg_solver, add_relax_wt); HYPRE_BoomerAMGSetChebyOrder(amg_solver, cheby_order); HYPRE_BoomerAMGSetChebyFraction(amg_solver, cheby_fraction); HYPRE_BoomerAMGSetChebyEigEst(amg_solver, cheby_eig_est); HYPRE_BoomerAMGSetChebyVariant(amg_solver, cheby_variant); HYPRE_BoomerAMGSetChebyScale(amg_solver, cheby_scale); HYPRE_BoomerAMGSetRelaxOrder(amg_solver, relax_order); HYPRE_BoomerAMGSetRelaxWt(amg_solver, relax_wt); HYPRE_BoomerAMGSetOuterWt(amg_solver, outer_wt); if (level_w > -1) { HYPRE_BoomerAMGSetLevelRelaxWt(amg_solver, relax_wt_level, level_w); } if (level_ow > -1) { HYPRE_BoomerAMGSetLevelOuterWt(amg_solver, outer_wt_level, level_ow); } HYPRE_BoomerAMGSetSmoothType(amg_solver, smooth_type); HYPRE_BoomerAMGSetSmoothNumSweeps(amg_solver, smooth_num_sweeps); HYPRE_BoomerAMGSetSmoothNumLevels(amg_solver, smooth_num_levels); HYPRE_BoomerAMGSetMaxLevels(amg_solver, max_levels); HYPRE_BoomerAMGSetMaxRowSum(amg_solver, max_row_sum); HYPRE_BoomerAMGSetDebugFlag(amg_solver, debug_flag); HYPRE_BoomerAMGSetVariant(amg_solver, variant); HYPRE_BoomerAMGSetOverlap(amg_solver, overlap); HYPRE_BoomerAMGSetDomainType(amg_solver, domain_type); HYPRE_BoomerAMGSetSchwarzUseNonSymm(amg_solver, use_nonsymm_schwarz); HYPRE_BoomerAMGSetSchwarzRlxWeight(amg_solver, schwarz_rlx_weight); if (eu_level < 0) { eu_level = 0; } HYPRE_BoomerAMGSetEuLevel(amg_solver, eu_level); HYPRE_BoomerAMGSetEuBJ(amg_solver, eu_bj); HYPRE_BoomerAMGSetEuSparseA(amg_solver, eu_sparse_A); HYPRE_BoomerAMGSetILUType(amg_solver, ilu_type); HYPRE_BoomerAMGSetILULevel(amg_solver, ilu_lfil); HYPRE_BoomerAMGSetILUDroptol(amg_solver, ilu_droptol); HYPRE_BoomerAMGSetILUMaxRowNnz(amg_solver, ilu_max_row_nnz); HYPRE_BoomerAMGSetILUMaxIter(amg_solver, ilu_sm_max_iter); HYPRE_BoomerAMGSetILUTriSolve(amg_solver, ilu_tri_solve); HYPRE_BoomerAMGSetILULowerJacobiIters(amg_solver, ilu_ljac_iters); HYPRE_BoomerAMGSetILUUpperJacobiIters(amg_solver, ilu_ujac_iters); HYPRE_BoomerAMGSetILULocalReordering(amg_solver, ilu_reordering); HYPRE_BoomerAMGSetILUIterSetupType(amg_solver, ilu_iter_setup_type); HYPRE_BoomerAMGSetILUIterSetupOption(amg_solver, ilu_iter_setup_option); HYPRE_BoomerAMGSetILUIterSetupMaxIter(amg_solver, ilu_iter_setup_max_iter); HYPRE_BoomerAMGSetILUIterSetupTolerance(amg_solver, ilu_iter_setup_tolerance); HYPRE_BoomerAMGSetFSAIAlgoType(amg_solver, fsai_algo_type); HYPRE_BoomerAMGSetFSAILocalSolveType(amg_solver, fsai_ls_type); HYPRE_BoomerAMGSetFSAIMaxSteps(amg_solver, fsai_max_steps); HYPRE_BoomerAMGSetFSAIMaxStepSize(amg_solver, fsai_max_step_size); HYPRE_BoomerAMGSetFSAIMaxNnzRow(amg_solver, fsai_max_nnz_row); HYPRE_BoomerAMGSetFSAINumLevels(amg_solver, fsai_num_levels); HYPRE_BoomerAMGSetFSAIThreshold(amg_solver, fsai_threshold); HYPRE_BoomerAMGSetFSAIEigMaxIters(amg_solver, fsai_eig_max_iters); HYPRE_BoomerAMGSetFSAIKapTolerance(amg_solver, fsai_kap_tolerance); HYPRE_BoomerAMGSetFilterFunctions(amg_solver, filter_functions); HYPRE_BoomerAMGSetNumFunctions(amg_solver, num_functions); HYPRE_BoomerAMGSetAggNumLevels(amg_solver, agg_num_levels); HYPRE_BoomerAMGSetAggInterpType(amg_solver, agg_interp_type); HYPRE_BoomerAMGSetAggTruncFactor(amg_solver, agg_trunc_factor); HYPRE_BoomerAMGSetAggP12TruncFactor(amg_solver, agg_P12_trunc_factor); HYPRE_BoomerAMGSetAggPMaxElmts(amg_solver, agg_P_max_elmts); HYPRE_BoomerAMGSetAggP12MaxElmts(amg_solver, agg_P12_max_elmts); HYPRE_BoomerAMGSetNumPaths(amg_solver, num_paths); HYPRE_BoomerAMGSetNodal(amg_solver, nodal); HYPRE_BoomerAMGSetNodalDiag(amg_solver, nodal_diag); if (num_functions > 1) { HYPRE_BoomerAMGSetDofFunc(amg_solver, dof_func); } HYPRE_BoomerAMGSetAdditive(amg_solver, additive); HYPRE_BoomerAMGSetMultAdditive(amg_solver, mult_add); HYPRE_BoomerAMGSetSimple(amg_solver, simple); HYPRE_BoomerAMGSetAddLastLvl(amg_solver, add_last_lvl); HYPRE_BoomerAMGSetMultAddPMaxElmts(amg_solver, add_P_max_elmts); HYPRE_BoomerAMGSetMultAddTruncFactor(amg_solver, add_trunc_factor); HYPRE_BoomerAMGSetRAP2(amg_solver, rap2); HYPRE_BoomerAMGSetModuleRAP2(amg_solver, mod_rap2); HYPRE_BoomerAMGSetKeepTranspose(amg_solver, keepTranspose); if (nongalerk_tol) { HYPRE_BoomerAMGSetNonGalerkinTol(amg_solver, nongalerk_tol[nongalerk_num_tol - 1]); for (i = 0; i < nongalerk_num_tol - 1; i++) { HYPRE_BoomerAMGSetLevelNonGalerkinTol(amg_solver, nongalerk_tol[i], i); } } HYPRE_BoomerAMGSetup(amg_solver, parcsr_M, b, x); hypre_EndTiming(time_index); hypre_PrintTiming("Setup phase times", hypre_MPI_COMM_WORLD); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); time_index = hypre_InitializeTiming("BoomerAMG Solve"); hypre_BeginTiming(time_index); HYPRE_BoomerAMGSolve(amg_solver, parcsr_A, b, x); hypre_EndTiming(time_index); hypre_PrintTiming("Solve phase times", hypre_MPI_COMM_WORLD); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); if (second_time) { /* run a second time [for timings, to check for memory leaks] */ HYPRE_ParVectorSetRandomValues(x, 775); #if defined(HYPRE_USING_CURAND) || defined(HYPRE_USING_ROCRAND) hypre_ResetDeviceRandGenerator(1234ULL, 0ULL); #endif hypre_ParVectorCopy(x0_save, x); HYPRE_BoomerAMGSetup(amg_solver, parcsr_M, b, x); HYPRE_BoomerAMGSolve(amg_solver, parcsr_A, b, x); } HYPRE_BoomerAMGDestroy(amg_solver); } if (solver_id == 999) { HYPRE_IJMatrix ij_N; /* use ParaSails preconditioner */ if (myid == 0) { hypre_printf("Test ParaSails Build IJMatrix\n"); } HYPRE_IJMatrixPrint(ij_A, "parasails.in"); HYPRE_ParaSailsCreate(hypre_MPI_COMM_WORLD, &pcg_precond); HYPRE_ParaSailsSetParams(pcg_precond, 0., 0); HYPRE_ParaSailsSetFilter(pcg_precond, 0.); HYPRE_ParaSailsSetLogging(pcg_precond, ioutdat); HYPRE_IJMatrixGetObject(ij_A, &object); parcsr_A = (HYPRE_ParCSRMatrix) object; HYPRE_ParaSailsSetup(pcg_precond, parcsr_M, NULL, NULL); HYPRE_ParaSailsBuildIJMatrix(pcg_precond, &ij_N); HYPRE_IJMatrixPrint(ij_M, "parasails.out"); if (myid == 0) { hypre_printf("Printed to parasails.out.\n"); } exit(0); } /*----------------------------------------------------------- * Solve the system using PCG *-----------------------------------------------------------*/ /* begin lobpcg */ if (!lobpcgFlag && (solver_id == 1 || solver_id == 2 || solver_id == 8 || solver_id == 12 || solver_id == 14 || solver_id == 31 || solver_id == 43 || solver_id == 71)) /*end lobpcg */ { HYPRE_ANNOTATE_REGION_BEGIN("%s", "Run-1"); time_index = hypre_InitializeTiming("PCG Setup"); hypre_BeginTiming(time_index); HYPRE_ParCSRPCGCreate(hypre_MPI_COMM_WORLD, &pcg_solver); HYPRE_PCGSetMaxIter(pcg_solver, max_iter); HYPRE_PCGSetTol(pcg_solver, tol); HYPRE_PCGSetTwoNorm(pcg_solver, 1); HYPRE_PCGSetFlex(pcg_solver, flex); HYPRE_PCGSetSkipBreak(pcg_solver, skip_break); HYPRE_PCGSetRelChange(pcg_solver, rel_change); HYPRE_PCGSetPrintLevel(pcg_solver, ioutdat); HYPRE_PCGSetAbsoluteTol(pcg_solver, atol); HYPRE_PCGSetRecomputeResidual(pcg_solver, recompute_res); if (solver_id == 1) { /* use BoomerAMG as preconditioner */ if (myid == 0) { hypre_printf("Solver: AMG-PCG\n"); } HYPRE_BoomerAMGCreate(&pcg_precond); /* BM Aug 25, 2006 */ HYPRE_BoomerAMGSetCGCIts(pcg_precond, cgcits); HYPRE_BoomerAMGSetInterpType(pcg_precond, interp_type); HYPRE_BoomerAMGSetPostInterpType(pcg_precond, post_interp_type); HYPRE_BoomerAMGSetNumSamples(pcg_precond, gsmg_samples); HYPRE_BoomerAMGSetTol(pcg_precond, pc_tol); HYPRE_BoomerAMGSetCoarsenType(pcg_precond, coarsen_type); HYPRE_BoomerAMGSetCoarsenCutFactor(pcg_precond, coarsen_cut_factor); HYPRE_BoomerAMGSetMeasureType(pcg_precond, measure_type); HYPRE_BoomerAMGSetCPoints(pcg_precond, max_levels, num_cpt, cpt_index); HYPRE_BoomerAMGSetFPoints(pcg_precond, num_fpt, fpt_index); HYPRE_BoomerAMGSetIsolatedFPoints(pcg_precond, num_isolated_fpt, isolated_fpt_index); HYPRE_BoomerAMGSetStrongThreshold(pcg_precond, strong_threshold); HYPRE_BoomerAMGSetSeqThreshold(pcg_precond, seq_threshold); HYPRE_BoomerAMGSetRedundant(pcg_precond, redundant); HYPRE_BoomerAMGSetMaxCoarseSize(pcg_precond, coarse_threshold); HYPRE_BoomerAMGSetMinCoarseSize(pcg_precond, min_coarse_size); HYPRE_BoomerAMGSetTruncFactor(pcg_precond, trunc_factor); HYPRE_BoomerAMGSetPMaxElmts(pcg_precond, P_max_elmts); HYPRE_BoomerAMGSetJacobiTruncThreshold(pcg_precond, jacobi_trunc_threshold); HYPRE_BoomerAMGSetSCommPkgSwitch(pcg_precond, S_commpkg_switch); HYPRE_BoomerAMGSetPrintLevel(pcg_precond, poutdat); HYPRE_BoomerAMGSetPrintFileName(pcg_precond, "driver.out.log"); HYPRE_BoomerAMGSetMaxIter(pcg_precond, precon_cycles); HYPRE_BoomerAMGSetCycleType(pcg_precond, cycle_type); HYPRE_BoomerAMGSetFCycle(pcg_precond, fcycle); HYPRE_BoomerAMGSetNumSweeps(pcg_precond, num_sweeps); HYPRE_BoomerAMGSetISType(pcg_precond, IS_type); HYPRE_BoomerAMGSetNumCRRelaxSteps(pcg_precond, num_CR_relax_steps); HYPRE_BoomerAMGSetCRRate(pcg_precond, CR_rate); HYPRE_BoomerAMGSetCRStrongTh(pcg_precond, CR_strong_th); HYPRE_BoomerAMGSetCRUseCG(pcg_precond, CR_use_CG); if (relax_type > -1) { HYPRE_BoomerAMGSetRelaxType(pcg_precond, relax_type); } if (relax_down > -1) { HYPRE_BoomerAMGSetCycleRelaxType(pcg_precond, relax_down, 1); } if (relax_up > -1) { HYPRE_BoomerAMGSetCycleRelaxType(pcg_precond, relax_up, 2); } if (relax_coarse > -1) { HYPRE_BoomerAMGSetCycleRelaxType(pcg_precond, relax_coarse, 3); } HYPRE_BoomerAMGSetAddRelaxType(pcg_precond, add_relax_type); HYPRE_BoomerAMGSetAddRelaxWt(pcg_precond, add_relax_wt); HYPRE_BoomerAMGSetChebyOrder(pcg_precond, cheby_order); HYPRE_BoomerAMGSetChebyFraction(pcg_precond, cheby_fraction); HYPRE_BoomerAMGSetChebyEigEst(pcg_precond, cheby_eig_est); HYPRE_BoomerAMGSetChebyVariant(pcg_precond, cheby_variant); HYPRE_BoomerAMGSetChebyScale(pcg_precond, cheby_scale); HYPRE_BoomerAMGSetRelaxOrder(pcg_precond, relax_order); HYPRE_BoomerAMGSetRelaxWt(pcg_precond, relax_wt); HYPRE_BoomerAMGSetOuterWt(pcg_precond, outer_wt); if (level_w > -1) { HYPRE_BoomerAMGSetLevelRelaxWt(pcg_precond, relax_wt_level, level_w); } if (level_ow > -1) { HYPRE_BoomerAMGSetLevelOuterWt(pcg_precond, outer_wt_level, level_ow); } HYPRE_BoomerAMGSetSmoothType(pcg_precond, smooth_type); HYPRE_BoomerAMGSetSmoothNumLevels(pcg_precond, smooth_num_levels); HYPRE_BoomerAMGSetSmoothNumSweeps(pcg_precond, smooth_num_sweeps); HYPRE_BoomerAMGSetMaxLevels(pcg_precond, max_levels); HYPRE_BoomerAMGSetMaxRowSum(pcg_precond, max_row_sum); HYPRE_BoomerAMGSetDebugFlag(pcg_precond, debug_flag); HYPRE_BoomerAMGSetFilterFunctions(pcg_precond, filter_functions); HYPRE_BoomerAMGSetNumFunctions(pcg_precond, num_functions); HYPRE_BoomerAMGSetAggNumLevels(pcg_precond, agg_num_levels); HYPRE_BoomerAMGSetAggInterpType(pcg_precond, agg_interp_type); HYPRE_BoomerAMGSetAggTruncFactor(pcg_precond, agg_trunc_factor); HYPRE_BoomerAMGSetAggP12TruncFactor(pcg_precond, agg_P12_trunc_factor); HYPRE_BoomerAMGSetAggPMaxElmts(pcg_precond, agg_P_max_elmts); HYPRE_BoomerAMGSetAggP12MaxElmts(pcg_precond, agg_P12_max_elmts); HYPRE_BoomerAMGSetNumPaths(pcg_precond, num_paths); HYPRE_BoomerAMGSetNodal(pcg_precond, nodal); HYPRE_BoomerAMGSetNodalDiag(pcg_precond, nodal_diag); HYPRE_BoomerAMGSetKeepSameSign(pcg_precond, keep_same_sign); HYPRE_BoomerAMGSetVariant(pcg_precond, variant); HYPRE_BoomerAMGSetOverlap(pcg_precond, overlap); HYPRE_BoomerAMGSetDomainType(pcg_precond, domain_type); HYPRE_BoomerAMGSetSchwarzUseNonSymm(pcg_precond, use_nonsymm_schwarz); HYPRE_BoomerAMGSetSchwarzRlxWeight(pcg_precond, schwarz_rlx_weight); if (eu_level < 0) { eu_level = 0; } HYPRE_BoomerAMGSetEuLevel(pcg_precond, eu_level); HYPRE_BoomerAMGSetEuBJ(pcg_precond, eu_bj); HYPRE_BoomerAMGSetEuSparseA(pcg_precond, eu_sparse_A); HYPRE_BoomerAMGSetILUType(pcg_precond, ilu_type); HYPRE_BoomerAMGSetILULevel(pcg_precond, ilu_lfil); HYPRE_BoomerAMGSetILUDroptol(pcg_precond, ilu_droptol); HYPRE_BoomerAMGSetILUMaxRowNnz(pcg_precond, ilu_max_row_nnz); HYPRE_BoomerAMGSetILUMaxIter(pcg_precond, ilu_sm_max_iter); HYPRE_BoomerAMGSetILUTriSolve(pcg_precond, ilu_tri_solve); HYPRE_BoomerAMGSetILULowerJacobiIters(pcg_precond, ilu_ljac_iters); HYPRE_BoomerAMGSetILUUpperJacobiIters(pcg_precond, ilu_ujac_iters); HYPRE_BoomerAMGSetILULocalReordering(pcg_precond, ilu_reordering); HYPRE_BoomerAMGSetILUIterSetupType(pcg_precond, ilu_iter_setup_type); HYPRE_BoomerAMGSetILUIterSetupOption(pcg_precond, ilu_iter_setup_option); HYPRE_BoomerAMGSetILUIterSetupMaxIter(pcg_precond, ilu_iter_setup_max_iter); HYPRE_BoomerAMGSetILUIterSetupTolerance(pcg_precond, ilu_iter_setup_tolerance); HYPRE_BoomerAMGSetFSAIAlgoType(pcg_precond, fsai_algo_type); HYPRE_BoomerAMGSetFSAILocalSolveType(pcg_precond, fsai_ls_type); HYPRE_BoomerAMGSetFSAIMaxSteps(pcg_precond, fsai_max_steps); HYPRE_BoomerAMGSetFSAIMaxStepSize(pcg_precond, fsai_max_step_size); HYPRE_BoomerAMGSetFSAIMaxNnzRow(pcg_precond, fsai_max_nnz_row); HYPRE_BoomerAMGSetFSAINumLevels(pcg_precond, fsai_num_levels); HYPRE_BoomerAMGSetFSAIEigMaxIters(pcg_precond, fsai_eig_max_iters); HYPRE_BoomerAMGSetFSAIThreshold(pcg_precond, fsai_threshold); HYPRE_BoomerAMGSetFSAIKapTolerance(pcg_precond, fsai_kap_tolerance); HYPRE_BoomerAMGSetCycleNumSweeps(pcg_precond, ns_coarse, 3); if (num_functions > 1) { HYPRE_BoomerAMGSetDofFunc(pcg_precond, dof_func); } HYPRE_BoomerAMGSetAdditive(pcg_precond, additive); HYPRE_BoomerAMGSetMultAdditive(pcg_precond, mult_add); HYPRE_BoomerAMGSetSimple(pcg_precond, simple); HYPRE_BoomerAMGSetAddLastLvl(pcg_precond, add_last_lvl); HYPRE_BoomerAMGSetMultAddPMaxElmts(pcg_precond, add_P_max_elmts); HYPRE_BoomerAMGSetMultAddTruncFactor(pcg_precond, add_trunc_factor); HYPRE_BoomerAMGSetRAP2(pcg_precond, rap2); HYPRE_BoomerAMGSetModuleRAP2(pcg_precond, mod_rap2); HYPRE_BoomerAMGSetKeepTranspose(pcg_precond, keepTranspose); #ifdef HYPRE_USING_DSUPERLU HYPRE_BoomerAMGSetDSLUThreshold(pcg_precond, dslu_threshold); #endif if (nongalerk_tol) { HYPRE_BoomerAMGSetNonGalerkinTol(pcg_precond, nongalerk_tol[nongalerk_num_tol - 1]); for (i = 0; i < nongalerk_num_tol - 1; i++) { HYPRE_BoomerAMGSetLevelNonGalerkinTol(pcg_precond, nongalerk_tol[i], i); } } if (build_rbm) { HYPRE_BoomerAMGSetInterpVectors(pcg_precond, num_interp_vecs, interp_vecs); HYPRE_BoomerAMGSetInterpVecVariant(pcg_precond, interp_vec_variant); HYPRE_BoomerAMGSetInterpVecQMax(pcg_precond, Q_max); HYPRE_BoomerAMGSetInterpVecAbsQTrunc(pcg_precond, Q_trunc); } HYPRE_PCGSetMaxIter(pcg_solver, mg_max_iter); HYPRE_PCGSetPreconditioner(pcg_solver, pcg_precond); } else if (solver_id == 2) { /* use diagonal scaling as preconditioner */ if (myid == 0) { hypre_printf("Solver: DS-PCG\n"); } pcg_precond = NULL; HYPRE_PCGSetPrecond(pcg_solver, (HYPRE_PtrToSolverFcn) HYPRE_ParCSRDiagScale, (HYPRE_PtrToSolverFcn) HYPRE_ParCSRDiagScaleSetup, pcg_precond); } else if (solver_id == 8) { /* use ParaSails preconditioner */ if (myid == 0) { hypre_printf("Solver: ParaSails-PCG\n"); } HYPRE_ParaSailsCreate(hypre_MPI_COMM_WORLD, &pcg_precond); HYPRE_ParaSailsSetParams(pcg_precond, sai_threshold, max_levels); HYPRE_ParaSailsSetFilter(pcg_precond, sai_filter); HYPRE_ParaSailsSetLogging(pcg_precond, poutdat); HYPRE_PCGSetPrecond(pcg_solver, (HYPRE_PtrToSolverFcn) HYPRE_ParaSailsSolve, (HYPRE_PtrToSolverFcn) HYPRE_ParaSailsSetup, pcg_precond); } else if (solver_id == 12) { /* use Schwarz preconditioner */ if (myid == 0) { hypre_printf("Solver: Schwarz-PCG\n"); } HYPRE_SchwarzCreate(&pcg_precond); HYPRE_SchwarzSetVariant(pcg_precond, variant); HYPRE_SchwarzSetOverlap(pcg_precond, overlap); HYPRE_SchwarzSetDomainType(pcg_precond, domain_type); HYPRE_SchwarzSetRelaxWeight(pcg_precond, schwarz_rlx_weight); HYPRE_SchwarzSetNonSymm(pcg_precond, use_nonsymm_schwarz); HYPRE_PCGSetPrecond(pcg_solver, (HYPRE_PtrToSolverFcn) HYPRE_SchwarzSolve, (HYPRE_PtrToSolverFcn) HYPRE_SchwarzSetup, pcg_precond); } else if (solver_id == 14) { /* use GSMG as preconditioner */ /* reset some smoother parameters */ /* fine grid */ relax_order = 0; if (myid == 0) { hypre_printf("Solver: GSMG-PCG\n"); } HYPRE_BoomerAMGCreate(&pcg_precond); HYPRE_BoomerAMGSetGSMG(pcg_precond, 4); /* BM Aug 25, 2006 */ HYPRE_BoomerAMGSetCGCIts(pcg_precond, cgcits); HYPRE_BoomerAMGSetInterpType(pcg_precond, interp_type); HYPRE_BoomerAMGSetPostInterpType(pcg_precond, post_interp_type); HYPRE_BoomerAMGSetNumSamples(pcg_precond, gsmg_samples); HYPRE_BoomerAMGSetTol(pcg_precond, pc_tol); HYPRE_BoomerAMGSetCoarsenType(pcg_precond, coarsen_type); HYPRE_BoomerAMGSetCoarsenCutFactor(pcg_precond, coarsen_cut_factor); HYPRE_BoomerAMGSetMeasureType(pcg_precond, measure_type); HYPRE_BoomerAMGSetCPoints(pcg_precond, max_levels, num_cpt, cpt_index); HYPRE_BoomerAMGSetFPoints(pcg_precond, num_fpt, fpt_index); HYPRE_BoomerAMGSetIsolatedFPoints(pcg_precond, num_isolated_fpt, isolated_fpt_index); HYPRE_BoomerAMGSetStrongThreshold(pcg_precond, strong_threshold); HYPRE_BoomerAMGSetSeqThreshold(pcg_precond, seq_threshold); HYPRE_BoomerAMGSetRedundant(pcg_precond, redundant); HYPRE_BoomerAMGSetMaxCoarseSize(pcg_precond, coarse_threshold); HYPRE_BoomerAMGSetMinCoarseSize(pcg_precond, min_coarse_size); HYPRE_BoomerAMGSetTruncFactor(pcg_precond, trunc_factor); HYPRE_BoomerAMGSetPMaxElmts(pcg_precond, P_max_elmts); HYPRE_BoomerAMGSetJacobiTruncThreshold(pcg_precond, jacobi_trunc_threshold); HYPRE_BoomerAMGSetSCommPkgSwitch(pcg_precond, S_commpkg_switch); HYPRE_BoomerAMGSetPrintLevel(pcg_precond, poutdat); HYPRE_BoomerAMGSetPrintFileName(pcg_precond, "driver.out.log"); HYPRE_BoomerAMGSetMaxIter(pcg_precond, precon_cycles); HYPRE_BoomerAMGSetCycleType(pcg_precond, cycle_type); HYPRE_BoomerAMGSetFCycle(pcg_precond, fcycle); HYPRE_BoomerAMGSetNumSweeps(pcg_precond, num_sweeps); HYPRE_BoomerAMGSetISType(pcg_precond, IS_type); HYPRE_BoomerAMGSetNumCRRelaxSteps(pcg_precond, num_CR_relax_steps); HYPRE_BoomerAMGSetCRRate(pcg_precond, CR_rate); HYPRE_BoomerAMGSetCRStrongTh(pcg_precond, CR_strong_th); HYPRE_BoomerAMGSetCRUseCG(pcg_precond, CR_use_CG); if (relax_type > -1) { HYPRE_BoomerAMGSetRelaxType(pcg_precond, relax_type); } if (relax_down > -1) { HYPRE_BoomerAMGSetCycleRelaxType(pcg_precond, relax_down, 1); } if (relax_up > -1) { HYPRE_BoomerAMGSetCycleRelaxType(pcg_precond, relax_up, 2); } if (relax_coarse > -1) { HYPRE_BoomerAMGSetCycleRelaxType(pcg_precond, relax_coarse, 3); } HYPRE_BoomerAMGSetAddRelaxType(pcg_precond, add_relax_type); HYPRE_BoomerAMGSetAddRelaxWt(pcg_precond, add_relax_wt); HYPRE_BoomerAMGSetRelaxOrder(pcg_precond, relax_order); HYPRE_BoomerAMGSetChebyOrder(pcg_precond, cheby_order); HYPRE_BoomerAMGSetChebyFraction(pcg_precond, cheby_fraction); HYPRE_BoomerAMGSetChebyEigEst(pcg_precond, cheby_eig_est); HYPRE_BoomerAMGSetChebyVariant(pcg_precond, cheby_variant); HYPRE_BoomerAMGSetChebyScale(pcg_precond, cheby_scale); HYPRE_BoomerAMGSetRelaxWt(pcg_precond, relax_wt); HYPRE_BoomerAMGSetOuterWt(pcg_precond, outer_wt); if (level_w > -1) { HYPRE_BoomerAMGSetLevelRelaxWt(pcg_precond, relax_wt_level, level_w); } if (level_ow > -1) { HYPRE_BoomerAMGSetLevelOuterWt(pcg_precond, outer_wt_level, level_ow); } HYPRE_BoomerAMGSetSmoothType(pcg_precond, smooth_type); HYPRE_BoomerAMGSetSmoothNumLevels(pcg_precond, smooth_num_levels); HYPRE_BoomerAMGSetSmoothNumSweeps(pcg_precond, smooth_num_sweeps); HYPRE_BoomerAMGSetVariant(pcg_precond, variant); HYPRE_BoomerAMGSetOverlap(pcg_precond, overlap); HYPRE_BoomerAMGSetDomainType(pcg_precond, domain_type); HYPRE_BoomerAMGSetSchwarzRlxWeight(pcg_precond, schwarz_rlx_weight); if (eu_level < 0) { eu_level = 0; } HYPRE_BoomerAMGSetEuLevel(pcg_precond, eu_level); HYPRE_BoomerAMGSetEuBJ(pcg_precond, eu_bj); HYPRE_BoomerAMGSetEuSparseA(pcg_precond, eu_sparse_A); HYPRE_BoomerAMGSetILUType(pcg_precond, ilu_type); HYPRE_BoomerAMGSetILULevel(pcg_precond, ilu_lfil); HYPRE_BoomerAMGSetILUDroptol(pcg_precond, ilu_droptol); HYPRE_BoomerAMGSetILUMaxRowNnz(pcg_precond, ilu_max_row_nnz); HYPRE_BoomerAMGSetILUMaxIter(pcg_precond, ilu_sm_max_iter); HYPRE_BoomerAMGSetILUTriSolve(pcg_precond, ilu_tri_solve); HYPRE_BoomerAMGSetILULowerJacobiIters(pcg_precond, ilu_ljac_iters); HYPRE_BoomerAMGSetILUUpperJacobiIters(pcg_precond, ilu_ujac_iters); HYPRE_BoomerAMGSetILULocalReordering(pcg_precond, ilu_reordering); HYPRE_BoomerAMGSetILUIterSetupType(pcg_precond, ilu_iter_setup_type); HYPRE_BoomerAMGSetILUIterSetupOption(pcg_precond, ilu_iter_setup_option); HYPRE_BoomerAMGSetILUIterSetupMaxIter(pcg_precond, ilu_iter_setup_max_iter); HYPRE_BoomerAMGSetILUIterSetupTolerance(pcg_precond, ilu_iter_setup_tolerance); HYPRE_BoomerAMGSetFSAIAlgoType(pcg_precond, fsai_algo_type); HYPRE_BoomerAMGSetFSAILocalSolveType(pcg_precond, fsai_ls_type); HYPRE_BoomerAMGSetFSAIMaxSteps(pcg_precond, fsai_max_steps); HYPRE_BoomerAMGSetFSAIMaxStepSize(pcg_precond, fsai_max_step_size); HYPRE_BoomerAMGSetFSAIMaxNnzRow(pcg_precond, fsai_max_nnz_row); HYPRE_BoomerAMGSetFSAINumLevels(pcg_precond, fsai_num_levels); HYPRE_BoomerAMGSetFSAIThreshold(pcg_precond, fsai_threshold); HYPRE_BoomerAMGSetFSAIEigMaxIters(pcg_precond, fsai_eig_max_iters); HYPRE_BoomerAMGSetFSAIKapTolerance(pcg_precond, fsai_kap_tolerance); HYPRE_BoomerAMGSetMaxLevels(pcg_precond, max_levels); HYPRE_BoomerAMGSetMaxRowSum(pcg_precond, max_row_sum); HYPRE_BoomerAMGSetDebugFlag(pcg_precond, debug_flag); HYPRE_BoomerAMGSetFilterFunctions(pcg_precond, filter_functions); HYPRE_BoomerAMGSetNumFunctions(pcg_precond, num_functions); HYPRE_BoomerAMGSetAggNumLevels(pcg_precond, agg_num_levels); HYPRE_BoomerAMGSetAggInterpType(pcg_precond, agg_interp_type); HYPRE_BoomerAMGSetAggTruncFactor(pcg_precond, agg_trunc_factor); HYPRE_BoomerAMGSetAggP12TruncFactor(pcg_precond, agg_P12_trunc_factor); HYPRE_BoomerAMGSetAggPMaxElmts(pcg_precond, agg_P_max_elmts); HYPRE_BoomerAMGSetAggP12MaxElmts(pcg_precond, agg_P12_max_elmts); HYPRE_BoomerAMGSetNumPaths(pcg_precond, num_paths); HYPRE_BoomerAMGSetNodal(pcg_precond, nodal); HYPRE_BoomerAMGSetNodalDiag(pcg_precond, nodal_diag); HYPRE_BoomerAMGSetCycleNumSweeps(pcg_precond, ns_coarse, 3); if (num_functions > 1) { HYPRE_BoomerAMGSetDofFunc(pcg_precond, dof_func); } HYPRE_BoomerAMGSetAdditive(pcg_precond, additive); HYPRE_BoomerAMGSetMultAdditive(pcg_precond, mult_add); HYPRE_BoomerAMGSetSimple(pcg_precond, simple); HYPRE_BoomerAMGSetAddLastLvl(pcg_precond, add_last_lvl); HYPRE_BoomerAMGSetMultAddPMaxElmts(pcg_precond, add_P_max_elmts); HYPRE_BoomerAMGSetMultAddTruncFactor(pcg_precond, add_trunc_factor); HYPRE_BoomerAMGSetRAP2(pcg_precond, rap2); HYPRE_BoomerAMGSetModuleRAP2(pcg_precond, mod_rap2); HYPRE_BoomerAMGSetKeepTranspose(pcg_precond, keepTranspose); #ifdef HYPRE_USING_DSUPERLU HYPRE_BoomerAMGSetDSLUThreshold(pcg_precond, dslu_threshold); #endif if (nongalerk_tol) { HYPRE_BoomerAMGSetNonGalerkinTol(pcg_precond, nongalerk_tol[nongalerk_num_tol - 1]); for (i = 0; i < nongalerk_num_tol - 1; i++) { HYPRE_BoomerAMGSetLevelNonGalerkinTol(pcg_precond, nongalerk_tol[i], i); } } HYPRE_PCGSetMaxIter(pcg_solver, mg_max_iter); HYPRE_PCGSetPrecond(pcg_solver, (HYPRE_PtrToSolverFcn) HYPRE_BoomerAMGSolve, (HYPRE_PtrToSolverFcn) HYPRE_BoomerAMGSetup, pcg_precond); } else if (solver_id == 31) { /* use FSAI preconditioning */ if (myid == 0) { hypre_printf("Solver: FSAI-PCG\n"); } HYPRE_FSAICreate(&pcg_precond); HYPRE_FSAISetAlgoType(pcg_precond, fsai_algo_type); HYPRE_FSAISetLocalSolveType(pcg_precond, fsai_ls_type); HYPRE_FSAISetMaxSteps(pcg_precond, fsai_max_steps); HYPRE_FSAISetMaxStepSize(pcg_precond, fsai_max_step_size); HYPRE_FSAISetMaxNnzRow(pcg_precond, fsai_max_nnz_row); HYPRE_FSAISetNumLevels(pcg_precond, fsai_num_levels); HYPRE_FSAISetThreshold(pcg_precond, fsai_threshold); HYPRE_FSAISetKapTolerance(pcg_precond, fsai_kap_tolerance); HYPRE_FSAISetMaxIterations(pcg_precond, 1); HYPRE_FSAISetTolerance(pcg_precond, 0.0); HYPRE_FSAISetZeroGuess(pcg_precond, 1); HYPRE_FSAISetPrintLevel(pcg_precond, poutdat); HYPRE_PCGSetPrecond(pcg_solver, (HYPRE_PtrToSolverFcn) HYPRE_FSAISolve, (HYPRE_PtrToSolverFcn) HYPRE_FSAISetup, pcg_precond); } else if (solver_id == 43) { /* use Euclid preconditioning */ if (myid == 0) { hypre_printf("Solver: Euclid-PCG\n"); } HYPRE_EuclidCreate(hypre_MPI_COMM_WORLD, &pcg_precond); /* note: There are three three methods of setting run-time parameters for Euclid: (see HYPRE_parcsr_ls.h); here we'll use what I think is simplest: let Euclid internally parse the command line. */ if (eu_level > -1) { HYPRE_EuclidSetLevel(pcg_precond, eu_level); } if (eu_ilut) { HYPRE_EuclidSetILUT(pcg_precond, eu_ilut); } if (eu_sparse_A) { HYPRE_EuclidSetSparseA(pcg_precond, eu_sparse_A); } if (eu_row_scale) { HYPRE_EuclidSetRowScale(pcg_precond, eu_row_scale); } if (eu_bj) { HYPRE_EuclidSetBJ(pcg_precond, eu_bj); } HYPRE_EuclidSetStats(pcg_precond, eu_stats); HYPRE_EuclidSetMem(pcg_precond, eu_mem); /*HYPRE_EuclidSetParams(pcg_precond, argc, argv);*/ HYPRE_PCGSetPrecond(pcg_solver, (HYPRE_PtrToSolverFcn) HYPRE_EuclidSolve, (HYPRE_PtrToSolverFcn) HYPRE_EuclidSetup, pcg_precond); } else if ( solver_id == 71 ) { /* use MGR preconditioning */ if (myid == 0) { hypre_printf("Solver: MGR-PCG\n"); } HYPRE_MGRCreate(&pcg_precond); mgr_num_cindexes = hypre_CTAlloc(HYPRE_Int, mgr_nlevels, HYPRE_MEMORY_HOST); for (i = 0; i < mgr_nlevels; i++) { /* assume 1 coarse index per level */ mgr_num_cindexes[i] = 1; } mgr_cindexes = hypre_CTAlloc(HYPRE_Int*, mgr_nlevels, HYPRE_MEMORY_HOST); for (i = 0; i < mgr_nlevels; i++) { mgr_cindexes[i] = hypre_CTAlloc(HYPRE_Int, mgr_num_cindexes[i], HYPRE_MEMORY_HOST); } for (i = 0; i < mgr_nlevels; i++) { /* assume coarse point is at index 0 */ mgr_cindexes[i][0] = 0; } mgr_reserved_coarse_indexes = hypre_CTAlloc(HYPRE_BigInt, mgr_num_reserved_nodes, HYPRE_MEMORY_HOST); for (i = 0; i < mgr_num_reserved_nodes; i++) { /* generate artificial reserved nodes */ mgr_reserved_coarse_indexes[i] = last_local_row - (HYPRE_BigInt) i; //2*i+1; } /* set MGR data by block */ HYPRE_MGRSetCpointsByBlock( pcg_precond, mgr_bsize, mgr_nlevels, mgr_num_cindexes, mgr_cindexes); /* set reserved coarse nodes */ if (mgr_num_reserved_nodes) { HYPRE_MGRSetReservedCoarseNodes(pcg_precond, mgr_num_reserved_nodes, mgr_reserved_coarse_indexes); } /* set intermediate coarse grid strategy */ HYPRE_MGRSetNonCpointsToFpoints(pcg_precond, mgr_non_c_to_f); /* set F relaxation strategy */ HYPRE_MGRSetFRelaxMethod(pcg_precond, mgr_frelax_method); /* set relax type for single level F-relaxation and post-relaxation */ HYPRE_MGRSetRelaxType(pcg_precond, 0); HYPRE_MGRSetNumRelaxSweeps(pcg_precond, 2); /* set interpolation type */ HYPRE_MGRSetRestrictType(pcg_precond, mgr_restrict_type); HYPRE_MGRSetInterpType(pcg_precond, mgr_interp_type); HYPRE_MGRSetNumInterpSweeps(pcg_precond, 2); /* set global smoother */ HYPRE_MGRSetGlobalSmoothType(pcg_precond, mgr_gsmooth_type); HYPRE_MGRSetMaxGlobalSmoothIters( pcg_precond, mgr_num_gsmooth_sweeps ); /* set print level */ HYPRE_MGRSetPrintLevel(pcg_precond, ioutdat); /* set max iterations */ HYPRE_MGRSetMaxIter(pcg_precond, 1); HYPRE_MGRSetTol(pcg_precond, pc_tol); /* create AMG coarse grid solver */ HYPRE_BoomerAMGCreate(&amg_solver); if (hypre_GetExecPolicy1(memory_location) == HYPRE_EXEC_DEVICE) { HYPRE_BoomerAMGSetInterpType(amg_solver, 18); HYPRE_BoomerAMGSetCoarsenType(amg_solver, 8); HYPRE_BoomerAMGSetRelaxType(amg_solver, 3); } else { HYPRE_BoomerAMGSetInterpType(amg_solver, 0); HYPRE_BoomerAMGSetPostInterpType(amg_solver, post_interp_type); HYPRE_BoomerAMGSetCoarsenType(amg_solver, 6); HYPRE_BoomerAMGSetCycleType(amg_solver, cycle_type); HYPRE_BoomerAMGSetFCycle(amg_solver, fcycle); HYPRE_BoomerAMGSetRelaxType(amg_solver, 3); if (relax_down > -1) { HYPRE_BoomerAMGSetCycleRelaxType(amg_solver, relax_down, 1); } if (relax_up > -1) { HYPRE_BoomerAMGSetCycleRelaxType(amg_solver, relax_up, 2); } if (relax_coarse > -1) { HYPRE_BoomerAMGSetCycleRelaxType(amg_solver, relax_coarse, 3); } HYPRE_BoomerAMGSetSmoothType(amg_solver, smooth_type); HYPRE_BoomerAMGSetSmoothNumSweeps(amg_solver, smooth_num_sweeps); } HYPRE_BoomerAMGSetCGCIts(amg_solver, cgcits); HYPRE_BoomerAMGSetTol(amg_solver, 0.0); HYPRE_BoomerAMGSetPMaxElmts(amg_solver, 0); HYPRE_BoomerAMGSetNumSweeps(amg_solver, num_sweeps); HYPRE_BoomerAMGSetRelaxOrder(amg_solver, 1); HYPRE_BoomerAMGSetMaxLevels(amg_solver, max_levels); HYPRE_BoomerAMGSetMaxIter(amg_solver, precon_cycles); HYPRE_BoomerAMGSetPrintLevel(amg_solver, 1); /* set the MGR coarse solver. Comment out to use default CG solver in MGR */ HYPRE_MGRSetCoarseSolver( pcg_precond, HYPRE_BoomerAMGSolve, HYPRE_BoomerAMGSetup, amg_solver); /* setup MGR-PCG solver */ HYPRE_PCGSetPrecond(pcg_solver, (HYPRE_PtrToSolverFcn) HYPRE_MGRSolve, (HYPRE_PtrToSolverFcn) HYPRE_MGRSetup, pcg_precond); } HYPRE_PCGGetPrecond(pcg_solver, &pcg_precond_gotten); if (pcg_precond_gotten != pcg_precond) { hypre_printf("HYPRE_ParCSRPCGGetPrecond got bad precond\n"); return (-1); } else if (myid == 0) { hypre_printf("HYPRE_ParCSRPCGGetPrecond got good precond\n"); } hypre_GpuProfilingPushRange("PCG-Setup-1"); HYPRE_PCGSetup(pcg_solver, (HYPRE_Matrix) parcsr_M, (HYPRE_Vector) b, (HYPRE_Vector) x); hypre_GpuProfilingPopRange(); hypre_EndTiming(time_index); hypre_PrintTiming("Setup phase times", hypre_MPI_COMM_WORLD); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); time_index = hypre_InitializeTiming("PCG Solve"); hypre_BeginTiming(time_index); hypre_GpuProfilingPushRange("PCG-Solve-1"); HYPRE_PCGSolve(pcg_solver, (HYPRE_Matrix)parcsr_A, (HYPRE_Vector)b, (HYPRE_Vector)x); hypre_GpuProfilingPopRange(); hypre_EndTiming(time_index); hypre_PrintTiming("Solve phase times", hypre_MPI_COMM_WORLD); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); HYPRE_ANNOTATE_REGION_END("%s", "Run-1"); if (second_time) { HYPRE_ANNOTATE_REGION_BEGIN("%s", "Run-2"); HYPRE_SetExecutionPolicy(exec2_policy); /* run a second time [for timings, to check for memory leaks] */ HYPRE_ParVectorSetRandomValues(x, 775); #if defined(HYPRE_USING_CURAND) || defined(HYPRE_USING_ROCRAND) hypre_ResetDeviceRandGenerator(1234ULL, 0ULL); #endif hypre_ParVectorCopy(x0_save, x); #if defined(HYPRE_USING_CUDA) cudaProfilerStart(); #endif time_index = hypre_InitializeTiming("PCG Setup"); hypre_BeginTiming(time_index); hypre_GpuProfilingPushRange("PCG-Setup-2"); HYPRE_PCGSetup(pcg_solver, (HYPRE_Matrix) parcsr_M, (HYPRE_Vector) b, (HYPRE_Vector) x); hypre_GpuProfilingPopRange(); hypre_EndTiming(time_index); hypre_PrintTiming("Setup phase times", hypre_MPI_COMM_WORLD); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); time_index = hypre_InitializeTiming("PCG Solve"); hypre_BeginTiming(time_index); hypre_GpuProfilingPushRange("PCG-Solve-2"); HYPRE_PCGSolve(pcg_solver, (HYPRE_Matrix)parcsr_A, (HYPRE_Vector)b, (HYPRE_Vector)x); hypre_GpuProfilingPopRange(); hypre_EndTiming(time_index); hypre_PrintTiming("Solve phase times", hypre_MPI_COMM_WORLD); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); HYPRE_ANNOTATE_REGION_END("%s", "Run-2"); #if defined(HYPRE_USING_CUDA) cudaProfilerStop(); #endif } HYPRE_PCGGetNumIterations(pcg_solver, &num_iterations); HYPRE_PCGGetFinalRelativeResidualNorm(pcg_solver, &final_res_norm); HYPRE_ParCSRPCGDestroy(pcg_solver); if (solver_id == 1) { HYPRE_BoomerAMGDestroy(pcg_precond); } else if (solver_id == 8) { HYPRE_ParaSailsDestroy(pcg_precond); } else if (solver_id == 12) { HYPRE_SchwarzDestroy(pcg_precond); } else if (solver_id == 14) { HYPRE_BoomerAMGDestroy(pcg_precond); } else if (solver_id == 31) { HYPRE_FSAIDestroy(pcg_precond); } else if (solver_id == 43) { HYPRE_EuclidDestroy(pcg_precond); } else if (solver_id == 71) { /* free memory */ if (mgr_num_cindexes) { hypre_TFree(mgr_num_cindexes, HYPRE_MEMORY_HOST); } mgr_num_cindexes = NULL; if (mgr_reserved_coarse_indexes) { hypre_TFree(mgr_reserved_coarse_indexes, HYPRE_MEMORY_HOST); } mgr_reserved_coarse_indexes = NULL; if (mgr_cindexes) { for ( i = 0; i < mgr_nlevels; i++) { if (mgr_cindexes[i]) { hypre_TFree(mgr_cindexes[i], HYPRE_MEMORY_HOST); } } hypre_TFree(mgr_cindexes, HYPRE_MEMORY_HOST); mgr_cindexes = NULL; } HYPRE_BoomerAMGDestroy(amg_solver); HYPRE_MGRDestroy(pcg_precond); } if (myid == 0) { hypre_printf("\n"); hypre_printf("Iterations = %d\n", num_iterations); hypre_printf("Final Relative Residual Norm = %e\n", final_res_norm); hypre_printf("\n"); } } /* begin lobpcg */ /*----------------------------------------------------------- * Solve the eigenvalue problem using LOBPCG *-----------------------------------------------------------*/ if ( lobpcgFlag ) { interpreter = hypre_CTAlloc(mv_InterfaceInterpreter, 1, HYPRE_MEMORY_HOST); HYPRE_ParCSRSetupInterpreter( interpreter ); HYPRE_ParCSRSetupMatvec(&matvec_fn); if (myid != 0) { verbosity = 0; } if ( lobpcgGen ) { BuildParIsoLaplacian(argc, argv, &parcsr_B); ierr = HYPRE_ParCSRMatrixGetLocalRange( parcsr_B, &first_local_row, &last_local_row, &first_local_col, &last_local_col ); local_num_rows = (HYPRE_Int)(last_local_row - first_local_row + 1); local_num_cols = (HYPRE_Int)(last_local_col - first_local_col + 1); ierr += HYPRE_ParCSRMatrixGetDims( parcsr_B, &M, &N ); ierr += HYPRE_IJMatrixCreate( comm, first_local_row, last_local_row, first_local_col, last_local_col, &ij_B ); ierr += HYPRE_IJMatrixSetObjectType( ij_B, HYPRE_PARCSR ); if (sparsity_known == 1) { diag_sizes = hypre_CTAlloc(HYPRE_Int, local_num_rows, HYPRE_MEMORY_HOST); offdiag_sizes = hypre_CTAlloc(HYPRE_Int, local_num_rows, HYPRE_MEMORY_HOST); local_row = 0; for (big_i = first_local_row; big_i <= last_local_row; big_i++) { ierr += HYPRE_ParCSRMatrixGetRow( parcsr_B, big_i, &size, &col_inds, &values ); for (j = 0; j < size; j++) { if (col_inds[j] < first_local_row || col_inds[j] > last_local_row) { offdiag_sizes[local_row]++; } else { diag_sizes[local_row]++; } } local_row++; ierr += HYPRE_ParCSRMatrixRestoreRow( parcsr_B, big_i, &size, &col_inds, &values ); } ierr += HYPRE_IJMatrixSetDiagOffdSizes( ij_B, (const HYPRE_Int *) diag_sizes, (const HYPRE_Int *) offdiag_sizes ); hypre_TFree(diag_sizes, HYPRE_MEMORY_HOST); hypre_TFree(offdiag_sizes, HYPRE_MEMORY_HOST); ierr = HYPRE_IJMatrixInitialize( ij_B ); for (big_i = first_local_row; big_i <= last_local_row; big_i++) { ierr += HYPRE_ParCSRMatrixGetRow( parcsr_B, big_i, &size, &col_inds, &values ); ierr += HYPRE_IJMatrixSetValues( ij_B, 1, &size, &big_i, (const HYPRE_BigInt *) col_inds, (const HYPRE_Real *) values ); ierr += HYPRE_ParCSRMatrixRestoreRow( parcsr_B, big_i, &size, &col_inds, &values ); } } else { row_sizes = hypre_CTAlloc(HYPRE_Int, local_num_rows, HYPRE_MEMORY_HOST); size = 5; /* this is in general too low, and supposed to test the capability of the reallocation of the interface */ if (sparsity_known == 0) /* tries a more accurate estimate of the storage */ { if (build_matrix_type == 2) { size = 7; } else if (build_matrix_type == 3) { size = 9; } else if (build_matrix_type == 4) { size = 27; } else if (build_matrix_type == 5) { size = 125; } } for (i = 0; i < local_num_rows; i++) { row_sizes[i] = size; } ierr = HYPRE_IJMatrixSetRowSizes ( ij_B, (const HYPRE_Int *) row_sizes ); hypre_TFree(row_sizes, HYPRE_MEMORY_HOST); ierr = HYPRE_IJMatrixInitialize( ij_B ); /* Loop through all locally stored rows and insert them into ij_matrix */ for (big_i = first_local_row; big_i <= last_local_row; big_i++) { ierr += HYPRE_ParCSRMatrixGetRow( parcsr_B, big_i, &size, &col_inds, &values ); ierr += HYPRE_IJMatrixSetValues( ij_B, 1, &size, &big_i, (const HYPRE_BigInt *) col_inds, (const HYPRE_Real *) values ); ierr += HYPRE_ParCSRMatrixRestoreRow( parcsr_B, big_i, &size, &col_inds, &values ); } } ierr += HYPRE_IJMatrixAssemble( ij_B ); ierr += HYPRE_ParCSRMatrixDestroy(parcsr_B); ierr += HYPRE_IJMatrixGetObject( ij_B, &object); parcsr_B = (HYPRE_ParCSRMatrix) object; } /* if ( lobpcgGen ) */ if ( pcgIterations > 0 ) /* do inner pcg iterations */ { time_index = hypre_InitializeTiming("PCG Setup"); hypre_BeginTiming(time_index); HYPRE_ParCSRPCGCreate(hypre_MPI_COMM_WORLD, &pcg_solver); HYPRE_PCGSetMaxIter(pcg_solver, pcgIterations); HYPRE_PCGSetTol(pcg_solver, pcgTol); HYPRE_PCGSetTwoNorm(pcg_solver, two_norm); HYPRE_PCGSetRelChange(pcg_solver, 0); HYPRE_PCGSetPrintLevel(pcg_solver, 0); HYPRE_PCGSetRecomputeResidual(pcg_solver, recompute_res); HYPRE_PCGGetPrecond(pcg_solver, &pcg_precond); if (solver_id == 1) { /* use BoomerAMG as preconditioner */ if (myid == 0) { hypre_printf("Solver: AMG-PCG\n"); } HYPRE_BoomerAMGCreate(&pcg_precond); /* BM Aug 25, 2006 */ HYPRE_BoomerAMGSetCGCIts(pcg_precond, cgcits); HYPRE_BoomerAMGSetInterpType(pcg_precond, interp_type); HYPRE_BoomerAMGSetNumSamples(pcg_precond, gsmg_samples); HYPRE_BoomerAMGSetTol(pcg_precond, pc_tol); HYPRE_BoomerAMGSetCoarsenType(pcg_precond, (hybrid * coarsen_type)); HYPRE_BoomerAMGSetCoarsenCutFactor(pcg_precond, coarsen_cut_factor); HYPRE_BoomerAMGSetCPoints(pcg_precond, max_levels, num_cpt, cpt_index); HYPRE_BoomerAMGSetFPoints(pcg_precond, num_fpt, fpt_index); HYPRE_BoomerAMGSetIsolatedFPoints(pcg_precond, num_isolated_fpt, isolated_fpt_index); HYPRE_BoomerAMGSetMeasureType(pcg_precond, measure_type); HYPRE_BoomerAMGSetStrongThreshold(pcg_precond, strong_threshold); HYPRE_BoomerAMGSetTruncFactor(pcg_precond, trunc_factor); HYPRE_BoomerAMGSetPMaxElmts(pcg_precond, P_max_elmts); HYPRE_BoomerAMGSetPostInterpType(pcg_precond, post_interp_type); HYPRE_BoomerAMGSetJacobiTruncThreshold(pcg_precond, jacobi_trunc_threshold); HYPRE_BoomerAMGSetPrintLevel(pcg_precond, poutdat); HYPRE_BoomerAMGSetPrintFileName(pcg_precond, "driver.out.log"); HYPRE_BoomerAMGSetMaxIter(pcg_precond, precon_cycles); HYPRE_BoomerAMGSetCycleType(pcg_precond, cycle_type); HYPRE_BoomerAMGSetFCycle(pcg_precond, fcycle); HYPRE_BoomerAMGSetNumSweeps(pcg_precond, num_sweeps); if (relax_type > -1) { HYPRE_BoomerAMGSetRelaxType(pcg_precond, relax_type); } if (relax_down > -1) { HYPRE_BoomerAMGSetCycleRelaxType(pcg_precond, relax_down, 1); } if (relax_up > -1) { HYPRE_BoomerAMGSetCycleRelaxType(pcg_precond, relax_up, 2); } if (relax_coarse > -1) { HYPRE_BoomerAMGSetCycleRelaxType(pcg_precond, relax_coarse, 3); } HYPRE_BoomerAMGSetAddRelaxType(pcg_precond, add_relax_type); HYPRE_BoomerAMGSetAddRelaxWt(pcg_precond, add_relax_wt); HYPRE_BoomerAMGSetRelaxWt(pcg_precond, relax_wt); HYPRE_BoomerAMGSetOuterWt(pcg_precond, outer_wt); HYPRE_BoomerAMGSetSmoothType(pcg_precond, smooth_type); HYPRE_BoomerAMGSetSmoothNumLevels(pcg_precond, smooth_num_levels); HYPRE_BoomerAMGSetSmoothNumSweeps(pcg_precond, smooth_num_sweeps); HYPRE_BoomerAMGSetRelaxOrder(pcg_precond, relax_order); HYPRE_BoomerAMGSetMaxLevels(pcg_precond, max_levels); HYPRE_BoomerAMGSetMaxRowSum(pcg_precond, max_row_sum); HYPRE_BoomerAMGSetDebugFlag(pcg_precond, debug_flag); HYPRE_BoomerAMGSetFilterFunctions(pcg_precond, filter_functions); HYPRE_BoomerAMGSetNumFunctions(pcg_precond, num_functions); HYPRE_BoomerAMGSetNumPaths(pcg_precond, num_paths); HYPRE_BoomerAMGSetAggNumLevels(pcg_precond, agg_num_levels); HYPRE_BoomerAMGSetVariant(pcg_precond, variant); HYPRE_BoomerAMGSetOverlap(pcg_precond, overlap); HYPRE_BoomerAMGSetDomainType(pcg_precond, domain_type); HYPRE_BoomerAMGSetSchwarzRlxWeight(pcg_precond, schwarz_rlx_weight); if (num_functions > 1) { HYPRE_BoomerAMGSetDofFunc(pcg_precond, dof_func); } HYPRE_PCGSetPrecond(pcg_solver, (HYPRE_PtrToSolverFcn) HYPRE_BoomerAMGSolve, (HYPRE_PtrToSolverFcn) HYPRE_BoomerAMGSetup, pcg_precond); } else if (solver_id == 2) { /* use diagonal scaling as preconditioner */ if (myid == 0) { hypre_printf("Solver: DS-PCG\n"); } pcg_precond = NULL; HYPRE_PCGSetPrecond(pcg_solver, (HYPRE_PtrToSolverFcn) HYPRE_ParCSRDiagScale, (HYPRE_PtrToSolverFcn) HYPRE_ParCSRDiagScaleSetup, pcg_precond); } else if (solver_id == 8) { /* use ParaSails preconditioner */ if (myid == 0) { hypre_printf("Solver: ParaSails-PCG\n"); } HYPRE_ParaSailsCreate(hypre_MPI_COMM_WORLD, &pcg_precond); HYPRE_ParaSailsSetParams(pcg_precond, sai_threshold, max_levels); HYPRE_ParaSailsSetFilter(pcg_precond, sai_filter); HYPRE_ParaSailsSetLogging(pcg_precond, poutdat); HYPRE_PCGSetPrecond(pcg_solver, (HYPRE_PtrToSolverFcn) HYPRE_ParaSailsSolve, (HYPRE_PtrToSolverFcn) HYPRE_ParaSailsSetup, pcg_precond); } else if (solver_id == 12) { /* use Schwarz preconditioner */ if (myid == 0) { hypre_printf("Solver: Schwarz-PCG\n"); } HYPRE_SchwarzCreate(&pcg_precond); HYPRE_SchwarzSetVariant(pcg_precond, variant); HYPRE_SchwarzSetOverlap(pcg_precond, overlap); HYPRE_SchwarzSetDomainType(pcg_precond, domain_type); HYPRE_SchwarzSetRelaxWeight(pcg_precond, schwarz_rlx_weight); HYPRE_PCGSetPrecond(pcg_solver, (HYPRE_PtrToSolverFcn) HYPRE_SchwarzSolve, (HYPRE_PtrToSolverFcn) HYPRE_SchwarzSetup, pcg_precond); } else if (solver_id == 14) { /* use GSMG as preconditioner */ /* reset some smoother parameters */ num_sweeps = num_sweep; relax_type = relax_default; relax_order = 0; if (myid == 0) { hypre_printf("Solver: GSMG-PCG\n"); } HYPRE_BoomerAMGCreate(&pcg_precond); /* BM Aug 25, 2006 */ HYPRE_BoomerAMGSetCGCIts(pcg_precond, cgcits); HYPRE_BoomerAMGSetGSMG(pcg_precond, 4); HYPRE_BoomerAMGSetInterpType(pcg_precond, interp_type); HYPRE_BoomerAMGSetNumSamples(pcg_precond, gsmg_samples); HYPRE_BoomerAMGSetTol(pcg_precond, pc_tol); HYPRE_BoomerAMGSetCoarsenType(pcg_precond, (hybrid * coarsen_type)); HYPRE_BoomerAMGSetCoarsenCutFactor(pcg_precond, coarsen_cut_factor); HYPRE_BoomerAMGSetCPoints(pcg_precond, max_levels, num_cpt, cpt_index); HYPRE_BoomerAMGSetFPoints(pcg_precond, num_fpt, fpt_index); HYPRE_BoomerAMGSetIsolatedFPoints(pcg_precond, num_isolated_fpt, isolated_fpt_index); HYPRE_BoomerAMGSetMeasureType(pcg_precond, measure_type); HYPRE_BoomerAMGSetStrongThreshold(pcg_precond, strong_threshold); HYPRE_BoomerAMGSetTruncFactor(pcg_precond, trunc_factor); HYPRE_BoomerAMGSetPMaxElmts(pcg_precond, P_max_elmts); HYPRE_BoomerAMGSetPostInterpType(pcg_precond, post_interp_type); HYPRE_BoomerAMGSetJacobiTruncThreshold(pcg_precond, jacobi_trunc_threshold); HYPRE_BoomerAMGSetPrintLevel(pcg_precond, poutdat); HYPRE_BoomerAMGSetPrintFileName(pcg_precond, "driver.out.log"); HYPRE_BoomerAMGSetMaxIter(pcg_precond, precon_cycles); HYPRE_BoomerAMGSetCycleType(pcg_precond, cycle_type); HYPRE_BoomerAMGSetFCycle(pcg_precond, fcycle); HYPRE_BoomerAMGSetNumSweeps(pcg_precond, num_sweeps); HYPRE_BoomerAMGSetRelaxType(pcg_precond, relax_type); HYPRE_BoomerAMGSetRelaxWt(pcg_precond, relax_wt); HYPRE_BoomerAMGSetAddRelaxType(pcg_precond, add_relax_type); HYPRE_BoomerAMGSetAddRelaxWt(pcg_precond, add_relax_wt); HYPRE_BoomerAMGSetOuterWt(pcg_precond, outer_wt); HYPRE_BoomerAMGSetSmoothType(pcg_precond, smooth_type); HYPRE_BoomerAMGSetSmoothNumLevels(pcg_precond, smooth_num_levels); HYPRE_BoomerAMGSetSmoothNumSweeps(pcg_precond, smooth_num_sweeps); HYPRE_BoomerAMGSetVariant(pcg_precond, variant); HYPRE_BoomerAMGSetOverlap(pcg_precond, overlap); HYPRE_BoomerAMGSetDomainType(pcg_precond, domain_type); HYPRE_BoomerAMGSetSchwarzRlxWeight(pcg_precond, schwarz_rlx_weight); HYPRE_BoomerAMGSetRelaxOrder(pcg_precond, relax_order); HYPRE_BoomerAMGSetMaxLevels(pcg_precond, max_levels); HYPRE_BoomerAMGSetMaxRowSum(pcg_precond, max_row_sum); HYPRE_BoomerAMGSetDebugFlag(pcg_precond, debug_flag); HYPRE_BoomerAMGSetFilterFunctions(pcg_precond, filter_functions); HYPRE_BoomerAMGSetNumFunctions(pcg_precond, num_functions); HYPRE_BoomerAMGSetNumPaths(pcg_precond, num_paths); HYPRE_BoomerAMGSetAggNumLevels(pcg_precond, agg_num_levels); if (num_functions > 1) { HYPRE_BoomerAMGSetDofFunc(pcg_precond, dof_func); } HYPRE_PCGSetPrecond(pcg_solver, (HYPRE_PtrToSolverFcn) HYPRE_BoomerAMGSolve, (HYPRE_PtrToSolverFcn) HYPRE_BoomerAMGSetup, pcg_precond); } else if (solver_id == 43) { /* use Euclid preconditioning */ if (myid == 0) { hypre_printf("Solver: Euclid-PCG\n"); } HYPRE_EuclidCreate(hypre_MPI_COMM_WORLD, &pcg_precond); /* note: There are three three methods of setting run-time * parameters for Euclid: (see HYPRE_parcsr_ls.h); here * we'll use what I think is simplest: let Euclid internally * parse the command line. * */ HYPRE_EuclidSetParams(pcg_precond, argc, argv); HYPRE_PCGSetPrecond(pcg_solver, (HYPRE_PtrToSolverFcn) HYPRE_EuclidSolve, (HYPRE_PtrToSolverFcn) HYPRE_EuclidSetup, pcg_precond); } else if (solver_id != NO_SOLVER ) { if ( verbosity ) { hypre_printf("Solver ID not recognized - running inner PCG iterations without preconditioner\n\n"); } } HYPRE_PCGGetPrecond(pcg_solver, &pcg_precond_gotten); if (pcg_precond_gotten != pcg_precond) { hypre_printf("HYPRE_ParCSRPCGGetPrecond got bad precond\n"); return (-1); } else if (myid == 0) { hypre_printf("HYPRE_ParCSRPCGGetPrecond got good precond\n"); } /* HYPRE_PCGSetup(pcg_solver, (HYPRE_Matrix)parcsr_M, * (HYPRE_Vector)b, (HYPRE_Vector)x); */ hypre_EndTiming(time_index); hypre_PrintTiming("Setup phase times", hypre_MPI_COMM_WORLD); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); HYPRE_LOBPCGCreate(interpreter, &matvec_fn, &lobpcg_solver); HYPRE_LOBPCGSetMaxIter(lobpcg_solver, maxIterations); HYPRE_LOBPCGSetPrecondUsageMode(lobpcg_solver, pcgMode); HYPRE_LOBPCGSetTol(lobpcg_solver, tol); HYPRE_LOBPCGSetPrintLevel(lobpcg_solver, verbosity); HYPRE_LOBPCGSetPrecond(lobpcg_solver, (HYPRE_PtrToSolverFcn) HYPRE_PCGSolve, (HYPRE_PtrToSolverFcn) HYPRE_PCGSetup, pcg_solver); HYPRE_LOBPCGSetupT(lobpcg_solver, (HYPRE_Matrix)parcsr_A, (HYPRE_Vector)x); HYPRE_LOBPCGSetup(lobpcg_solver, (HYPRE_Matrix)parcsr_A, (HYPRE_Vector)b, (HYPRE_Vector)x); if ( lobpcgGen ) HYPRE_LOBPCGSetupB(lobpcg_solver, (HYPRE_Matrix)parcsr_B, (HYPRE_Vector)x); if ( vFromFileFlag ) { eigenvectors = mv_MultiVectorWrap( interpreter, HYPRE_ParCSRMultiVectorRead(hypre_MPI_COMM_WORLD, interpreter, "vectors" ), 1); hypre_assert( eigenvectors != NULL ); blockSize = mv_MultiVectorWidth( eigenvectors ); } else { eigenvectors = mv_MultiVectorCreateFromSampleVector( interpreter, blockSize, x ); if ( lobpcgSeed ) { mv_MultiVectorSetRandom( eigenvectors, lobpcgSeed ); } else { mv_MultiVectorSetRandom( eigenvectors, (HYPRE_Int)time(0) ); } } if ( constrained ) { constraints = mv_MultiVectorWrap( interpreter, HYPRE_ParCSRMultiVectorRead(hypre_MPI_COMM_WORLD, interpreter, "vectors" ), 1); hypre_assert( constraints != NULL ); } eigenvalues = hypre_CTAlloc(HYPRE_Real, blockSize, HYPRE_MEMORY_HOST); time_index = hypre_InitializeTiming("LOBPCG Solve"); hypre_BeginTiming(time_index); HYPRE_LOBPCGSolve(lobpcg_solver, constraints, eigenvectors, eigenvalues ); hypre_EndTiming(time_index); hypre_PrintTiming("Solve phase times", hypre_MPI_COMM_WORLD); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); if ( checkOrtho ) { gramXX = utilities_FortranMatrixCreate(); identity = utilities_FortranMatrixCreate(); utilities_FortranMatrixAllocateData( blockSize, blockSize, gramXX ); utilities_FortranMatrixAllocateData( blockSize, blockSize, identity ); if ( lobpcgGen ) { workspace = mv_MultiVectorCreateCopy( eigenvectors, 0 ); hypre_LOBPCGMultiOperatorB( lobpcg_solver, mv_MultiVectorGetData(eigenvectors), mv_MultiVectorGetData(workspace) ); lobpcg_MultiVectorByMultiVector( eigenvectors, workspace, gramXX ); } else { lobpcg_MultiVectorByMultiVector( eigenvectors, eigenvectors, gramXX ); } utilities_FortranMatrixSetToIdentity( identity ); utilities_FortranMatrixAdd( -1, identity, gramXX, gramXX ); nonOrthF = utilities_FortranMatrixFNorm( gramXX ); if ( myid == 0 ) { hypre_printf("Non-orthonormality of eigenvectors: %12.5e\n", nonOrthF); } utilities_FortranMatrixDestroy( gramXX ); utilities_FortranMatrixDestroy( identity ); } if ( printLevel ) { HYPRE_ParCSRMultiVectorPrint( mv_MultiVectorGetData(eigenvectors), "vectors" ); if ( myid == 0 ) { if ( (filePtr = fopen("values.txt", "w")) ) { hypre_fprintf(filePtr, "%d\n", blockSize); for ( i = 0; i < blockSize; i++ ) { hypre_fprintf(filePtr, "%22.14e\n", eigenvalues[i]); } fclose(filePtr); } if ( (filePtr = fopen("residuals.txt", "w")) ) { residualNorms = HYPRE_LOBPCGResidualNorms( lobpcg_solver ); residuals = utilities_FortranMatrixValues( residualNorms ); hypre_fprintf(filePtr, "%d\n", blockSize); for ( i = 0; i < blockSize; i++ ) { hypre_fprintf(filePtr, "%22.14e\n", residuals[i]); } fclose(filePtr); } if ( printLevel > 1 ) { printBuffer = utilities_FortranMatrixCreate(); iterations = HYPRE_LOBPCGIterations( lobpcg_solver ); eigenvaluesHistory = HYPRE_LOBPCGEigenvaluesHistory( lobpcg_solver ); utilities_FortranMatrixSelectBlock( eigenvaluesHistory, 1, blockSize, 1, iterations + 1, printBuffer ); utilities_FortranMatrixPrint( printBuffer, "val_hist.txt" ); residualNormsHistory = HYPRE_LOBPCGResidualNormsHistory( lobpcg_solver ); utilities_FortranMatrixSelectBlock(residualNormsHistory, 1, blockSize, 1, iterations + 1, printBuffer ); utilities_FortranMatrixPrint( printBuffer, "res_hist.txt" ); utilities_FortranMatrixDestroy( printBuffer ); } } } HYPRE_LOBPCGDestroy(lobpcg_solver); mv_MultiVectorDestroy( eigenvectors ); if ( constrained ) { mv_MultiVectorDestroy( constraints ); } if ( lobpcgGen ) { mv_MultiVectorDestroy( workspace ); } hypre_TFree(eigenvalues, HYPRE_MEMORY_HOST); HYPRE_ParCSRPCGDestroy(pcg_solver); if (solver_id == 1) { HYPRE_BoomerAMGDestroy(pcg_precond); } else if (solver_id == 8) { HYPRE_ParaSailsDestroy(pcg_precond); } else if (solver_id == 12) { HYPRE_SchwarzDestroy(pcg_precond); } else if (solver_id == 14) { HYPRE_BoomerAMGDestroy(pcg_precond); } else if (solver_id == 43) { HYPRE_EuclidDestroy(pcg_precond); } } else /* pcgIterations <= 0 --> use the preconditioner directly */ { time_index = hypre_InitializeTiming("LOBPCG Setup"); hypre_BeginTiming(time_index); if (myid != 0) { verbosity = 0; } HYPRE_LOBPCGCreate(interpreter, &matvec_fn, &pcg_solver); HYPRE_LOBPCGSetMaxIter(pcg_solver, maxIterations); HYPRE_LOBPCGSetTol(pcg_solver, tol); HYPRE_LOBPCGSetPrintLevel(pcg_solver, verbosity); HYPRE_LOBPCGGetPrecond(pcg_solver, &pcg_precond); if (solver_id == 1) { /* use BoomerAMG as preconditioner */ if (myid == 0) { hypre_printf("Solver: AMG-PCG\n"); } HYPRE_BoomerAMGCreate(&pcg_precond); /* BM Aug 25, 2006 */ HYPRE_BoomerAMGSetCGCIts(pcg_precond, cgcits); HYPRE_BoomerAMGSetInterpType(pcg_precond, interp_type); HYPRE_BoomerAMGSetNumSamples(pcg_precond, gsmg_samples); HYPRE_BoomerAMGSetTol(pcg_precond, pc_tol); HYPRE_BoomerAMGSetCoarsenType(pcg_precond, (hybrid * coarsen_type)); HYPRE_BoomerAMGSetCoarsenCutFactor(pcg_precond, coarsen_cut_factor); HYPRE_BoomerAMGSetCPoints(pcg_precond, max_levels, num_cpt, cpt_index); HYPRE_BoomerAMGSetFPoints(pcg_precond, num_fpt, fpt_index); HYPRE_BoomerAMGSetIsolatedFPoints(pcg_precond, num_isolated_fpt, isolated_fpt_index); HYPRE_BoomerAMGSetMeasureType(pcg_precond, measure_type); HYPRE_BoomerAMGSetStrongThreshold(pcg_precond, strong_threshold); HYPRE_BoomerAMGSetTruncFactor(pcg_precond, trunc_factor); HYPRE_BoomerAMGSetPMaxElmts(pcg_precond, P_max_elmts); HYPRE_BoomerAMGSetPostInterpType(pcg_precond, post_interp_type); HYPRE_BoomerAMGSetJacobiTruncThreshold(pcg_precond, jacobi_trunc_threshold); HYPRE_BoomerAMGSetPrintLevel(pcg_precond, poutdat); HYPRE_BoomerAMGSetPrintFileName(pcg_precond, "driver.out.log"); HYPRE_BoomerAMGSetMaxIter(pcg_precond, precon_cycles); HYPRE_BoomerAMGSetCycleType(pcg_precond, cycle_type); HYPRE_BoomerAMGSetFCycle(pcg_precond, fcycle); HYPRE_BoomerAMGSetNumSweeps(pcg_precond, num_sweeps); if (relax_type > -1) { HYPRE_BoomerAMGSetRelaxType(pcg_precond, relax_type); } if (relax_down > -1) { HYPRE_BoomerAMGSetCycleRelaxType(pcg_precond, relax_down, 1); } if (relax_up > -1) { HYPRE_BoomerAMGSetCycleRelaxType(pcg_precond, relax_up, 2); } if (relax_coarse > -1) { HYPRE_BoomerAMGSetCycleRelaxType(pcg_precond, relax_coarse, 3); } HYPRE_BoomerAMGSetAddRelaxType(pcg_precond, add_relax_type); HYPRE_BoomerAMGSetAddRelaxWt(pcg_precond, add_relax_wt); HYPRE_BoomerAMGSetRelaxWt(pcg_precond, relax_wt); HYPRE_BoomerAMGSetOuterWt(pcg_precond, outer_wt); HYPRE_BoomerAMGSetSmoothType(pcg_precond, smooth_type); HYPRE_BoomerAMGSetSmoothNumLevels(pcg_precond, smooth_num_levels); HYPRE_BoomerAMGSetSmoothNumSweeps(pcg_precond, smooth_num_sweeps); HYPRE_BoomerAMGSetRelaxOrder(pcg_precond, relax_order); HYPRE_BoomerAMGSetMaxLevels(pcg_precond, max_levels); HYPRE_BoomerAMGSetMaxRowSum(pcg_precond, max_row_sum); HYPRE_BoomerAMGSetDebugFlag(pcg_precond, debug_flag); HYPRE_BoomerAMGSetFilterFunctions(pcg_precond, filter_functions); HYPRE_BoomerAMGSetNumFunctions(pcg_precond, num_functions); HYPRE_BoomerAMGSetNumPaths(pcg_precond, num_paths); HYPRE_BoomerAMGSetAggNumLevels(pcg_precond, agg_num_levels); HYPRE_BoomerAMGSetVariant(pcg_precond, variant); HYPRE_BoomerAMGSetOverlap(pcg_precond, overlap); HYPRE_BoomerAMGSetDomainType(pcg_precond, domain_type); HYPRE_BoomerAMGSetSchwarzRlxWeight(pcg_precond, schwarz_rlx_weight); if (num_functions > 1) { HYPRE_BoomerAMGSetDofFunc(pcg_precond, dof_func); } HYPRE_LOBPCGSetPrecond(pcg_solver, (HYPRE_PtrToSolverFcn) HYPRE_BoomerAMGSolve, (HYPRE_PtrToSolverFcn) HYPRE_BoomerAMGSetup, pcg_precond); } else if (solver_id == 2) { /* use diagonal scaling as preconditioner */ if (myid == 0) { hypre_printf("Solver: DS-PCG\n"); } pcg_precond = NULL; HYPRE_LOBPCGSetPrecond(pcg_solver, (HYPRE_PtrToSolverFcn) HYPRE_ParCSRDiagScale, (HYPRE_PtrToSolverFcn) HYPRE_ParCSRDiagScaleSetup, pcg_precond); } else if (solver_id == 8) { /* use ParaSails preconditioner */ if (myid == 0) { hypre_printf("Solver: ParaSails-PCG\n"); } HYPRE_ParaSailsCreate(hypre_MPI_COMM_WORLD, &pcg_precond); HYPRE_ParaSailsSetParams(pcg_precond, sai_threshold, max_levels); HYPRE_ParaSailsSetFilter(pcg_precond, sai_filter); HYPRE_ParaSailsSetLogging(pcg_precond, poutdat); HYPRE_LOBPCGSetPrecond(pcg_solver, (HYPRE_PtrToSolverFcn) HYPRE_ParaSailsSolve, (HYPRE_PtrToSolverFcn) HYPRE_ParaSailsSetup, pcg_precond); } else if (solver_id == 12) { /* use Schwarz preconditioner */ if (myid == 0) { hypre_printf("Solver: Schwarz-PCG\n"); } HYPRE_SchwarzCreate(&pcg_precond); HYPRE_SchwarzSetVariant(pcg_precond, variant); HYPRE_SchwarzSetOverlap(pcg_precond, overlap); HYPRE_SchwarzSetDomainType(pcg_precond, domain_type); HYPRE_SchwarzSetRelaxWeight(pcg_precond, schwarz_rlx_weight); HYPRE_LOBPCGSetPrecond(pcg_solver, (HYPRE_PtrToSolverFcn) HYPRE_SchwarzSolve, (HYPRE_PtrToSolverFcn) HYPRE_SchwarzSetup, pcg_precond); } else if (solver_id == 14) { /* use GSMG as preconditioner */ /* reset some smoother parameters */ num_sweeps = num_sweep; relax_type = relax_default; relax_order = 0; if (myid == 0) { hypre_printf("Solver: GSMG-PCG\n"); } HYPRE_BoomerAMGCreate(&pcg_precond); /* BM Aug 25, 2006 */ HYPRE_BoomerAMGSetCGCIts(pcg_precond, cgcits); HYPRE_BoomerAMGSetGSMG(pcg_precond, 4); HYPRE_BoomerAMGSetInterpType(pcg_precond, interp_type); HYPRE_BoomerAMGSetNumSamples(pcg_precond, gsmg_samples); HYPRE_BoomerAMGSetTol(pcg_precond, pc_tol); HYPRE_BoomerAMGSetCoarsenType(pcg_precond, (hybrid * coarsen_type)); HYPRE_BoomerAMGSetCoarsenCutFactor(pcg_precond, coarsen_cut_factor); HYPRE_BoomerAMGSetCPoints(pcg_precond, max_levels, num_cpt, cpt_index); HYPRE_BoomerAMGSetFPoints(pcg_precond, num_fpt, fpt_index); HYPRE_BoomerAMGSetIsolatedFPoints(pcg_precond, num_isolated_fpt, isolated_fpt_index); HYPRE_BoomerAMGSetMeasureType(pcg_precond, measure_type); HYPRE_BoomerAMGSetStrongThreshold(pcg_precond, strong_threshold); HYPRE_BoomerAMGSetTruncFactor(pcg_precond, trunc_factor); HYPRE_BoomerAMGSetPMaxElmts(pcg_precond, P_max_elmts); HYPRE_BoomerAMGSetPostInterpType(pcg_precond, post_interp_type); HYPRE_BoomerAMGSetJacobiTruncThreshold(pcg_precond, jacobi_trunc_threshold); HYPRE_BoomerAMGSetPrintLevel(pcg_precond, poutdat); HYPRE_BoomerAMGSetPrintFileName(pcg_precond, "driver.out.log"); HYPRE_BoomerAMGSetMaxIter(pcg_precond, precon_cycles); HYPRE_BoomerAMGSetCycleType(pcg_precond, cycle_type); HYPRE_BoomerAMGSetFCycle(pcg_precond, fcycle); HYPRE_BoomerAMGSetNumSweeps(pcg_precond, num_sweeps); HYPRE_BoomerAMGSetRelaxType(pcg_precond, relax_type); HYPRE_BoomerAMGSetAddRelaxType(pcg_precond, add_relax_type); HYPRE_BoomerAMGSetAddRelaxWt(pcg_precond, add_relax_wt); HYPRE_BoomerAMGSetRelaxWt(pcg_precond, relax_wt); HYPRE_BoomerAMGSetOuterWt(pcg_precond, outer_wt); HYPRE_BoomerAMGSetSmoothType(pcg_precond, smooth_type); HYPRE_BoomerAMGSetSmoothNumLevels(pcg_precond, smooth_num_levels); HYPRE_BoomerAMGSetSmoothNumSweeps(pcg_precond, smooth_num_sweeps); HYPRE_BoomerAMGSetVariant(pcg_precond, variant); HYPRE_BoomerAMGSetOverlap(pcg_precond, overlap); HYPRE_BoomerAMGSetDomainType(pcg_precond, domain_type); HYPRE_BoomerAMGSetSchwarzRlxWeight(pcg_precond, schwarz_rlx_weight); HYPRE_BoomerAMGSetRelaxOrder(pcg_precond, relax_order); HYPRE_BoomerAMGSetMaxLevels(pcg_precond, max_levels); HYPRE_BoomerAMGSetMaxRowSum(pcg_precond, max_row_sum); HYPRE_BoomerAMGSetDebugFlag(pcg_precond, debug_flag); HYPRE_BoomerAMGSetFilterFunctions(pcg_precond, filter_functions); HYPRE_BoomerAMGSetNumFunctions(pcg_precond, num_functions); HYPRE_BoomerAMGSetNumPaths(pcg_precond, num_paths); HYPRE_BoomerAMGSetAggNumLevels(pcg_precond, agg_num_levels); if (num_functions > 1) { HYPRE_BoomerAMGSetDofFunc(pcg_precond, dof_func); } HYPRE_LOBPCGSetPrecond(pcg_solver, (HYPRE_PtrToSolverFcn) HYPRE_BoomerAMGSolve, (HYPRE_PtrToSolverFcn) HYPRE_BoomerAMGSetup, pcg_precond); } else if (solver_id == 43) { /* use Euclid preconditioning */ if (myid == 0) { hypre_printf("Solver: Euclid-PCG\n"); } HYPRE_EuclidCreate(hypre_MPI_COMM_WORLD, &pcg_precond); /* note: There are three three methods of setting run-time * parameters for Euclid: (see HYPRE_parcsr_ls.h); here we'll * use what I think is simplest: let Euclid internally parse * the command line. */ HYPRE_EuclidSetParams(pcg_precond, argc, argv); HYPRE_LOBPCGSetPrecond(pcg_solver, (HYPRE_PtrToSolverFcn) HYPRE_EuclidSolve, (HYPRE_PtrToSolverFcn) HYPRE_EuclidSetup, pcg_precond); } else if (solver_id != NO_SOLVER ) { if ( verbosity ) { hypre_printf("Solver ID not recognized - running LOBPCG without preconditioner\n\n"); } } HYPRE_LOBPCGGetPrecond(pcg_solver, &pcg_precond_gotten); if (pcg_precond_gotten != pcg_precond && pcgIterations) { hypre_printf("HYPRE_ParCSRLOBPCGGetPrecond got bad precond\n"); return (-1); } else if (myid == 0) { hypre_printf("HYPRE_ParCSRLOBPCGGetPrecond got good precond\n"); } HYPRE_LOBPCGSetup(pcg_solver, (HYPRE_Matrix)parcsr_A, (HYPRE_Vector)b, (HYPRE_Vector)x); if ( lobpcgGen ) HYPRE_LOBPCGSetupB(pcg_solver, (HYPRE_Matrix)parcsr_B, (HYPRE_Vector)x); hypre_EndTiming(time_index); hypre_PrintTiming("Setup phase times", hypre_MPI_COMM_WORLD); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); if ( vFromFileFlag ) { eigenvectors = mv_MultiVectorWrap( interpreter, HYPRE_ParCSRMultiVectorRead(hypre_MPI_COMM_WORLD, interpreter, "vectors" ), 1); hypre_assert( eigenvectors != NULL ); blockSize = mv_MultiVectorWidth( eigenvectors ); } else { eigenvectors = mv_MultiVectorCreateFromSampleVector( interpreter, blockSize, x ); if ( lobpcgSeed ) { mv_MultiVectorSetRandom( eigenvectors, lobpcgSeed ); } else { mv_MultiVectorSetRandom( eigenvectors, (HYPRE_Int)time(0) ); } } if ( constrained ) { constraints = mv_MultiVectorWrap( interpreter, HYPRE_ParCSRMultiVectorRead(hypre_MPI_COMM_WORLD, interpreter, "vectors" ), 1); hypre_assert( constraints != NULL ); } eigenvalues = hypre_CTAlloc(HYPRE_Real, blockSize, HYPRE_MEMORY_HOST); time_index = hypre_InitializeTiming("LOBPCG Solve"); hypre_BeginTiming(time_index); HYPRE_LOBPCGSolve(pcg_solver, constraints, eigenvectors, eigenvalues); hypre_EndTiming(time_index); hypre_PrintTiming("Solve phase times", hypre_MPI_COMM_WORLD); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); if ( checkOrtho ) { gramXX = utilities_FortranMatrixCreate(); identity = utilities_FortranMatrixCreate(); utilities_FortranMatrixAllocateData( blockSize, blockSize, gramXX ); utilities_FortranMatrixAllocateData( blockSize, blockSize, identity ); if ( lobpcgGen ) { workspace = mv_MultiVectorCreateCopy( eigenvectors, 0 ); hypre_LOBPCGMultiOperatorB( pcg_solver, mv_MultiVectorGetData(eigenvectors), mv_MultiVectorGetData(workspace) ); lobpcg_MultiVectorByMultiVector( eigenvectors, workspace, gramXX ); } else { lobpcg_MultiVectorByMultiVector( eigenvectors, eigenvectors, gramXX ); } utilities_FortranMatrixSetToIdentity( identity ); utilities_FortranMatrixAdd( -1, identity, gramXX, gramXX ); nonOrthF = utilities_FortranMatrixFNorm( gramXX ); if ( myid == 0 ) { hypre_printf("Non-orthonormality of eigenvectors: %12.5e\n", nonOrthF); } utilities_FortranMatrixDestroy( gramXX ); utilities_FortranMatrixDestroy( identity ); } if ( printLevel ) { HYPRE_ParCSRMultiVectorPrint( mv_MultiVectorGetData(eigenvectors), "vectors" ); if ( myid == 0 ) { if ( (filePtr = fopen("values.txt", "w")) ) { hypre_fprintf(filePtr, "%d\n", blockSize); for ( i = 0; i < blockSize; i++ ) { hypre_fprintf(filePtr, "%22.14e\n", eigenvalues[i]); } fclose(filePtr); } if ( (filePtr = fopen("residuals.txt", "w")) ) { residualNorms = HYPRE_LOBPCGResidualNorms( pcg_solver ); residuals = utilities_FortranMatrixValues( residualNorms ); hypre_fprintf(filePtr, "%d\n", blockSize); for ( i = 0; i < blockSize; i++ ) { hypre_fprintf(filePtr, "%22.14e\n", residuals[i]); } fclose(filePtr); } if ( printLevel > 1 ) { printBuffer = utilities_FortranMatrixCreate(); iterations = HYPRE_LOBPCGIterations( pcg_solver ); eigenvaluesHistory = HYPRE_LOBPCGEigenvaluesHistory( pcg_solver ); utilities_FortranMatrixSelectBlock( eigenvaluesHistory, 1, blockSize, 1, iterations + 1, printBuffer ); utilities_FortranMatrixPrint( printBuffer, "val_hist.txt" ); residualNormsHistory = HYPRE_LOBPCGResidualNormsHistory( pcg_solver ); utilities_FortranMatrixSelectBlock(residualNormsHistory, 1, blockSize, 1, iterations + 1, printBuffer ); utilities_FortranMatrixPrint( printBuffer, "res_hist.txt" ); utilities_FortranMatrixDestroy( printBuffer ); } } } if (second_time) { /* run a second time [for timings, to check for memory leaks] */ mv_MultiVectorSetRandom( eigenvectors, 775 ); #if defined(HYPRE_USING_CURAND) || defined(HYPRE_USING_ROCRAND) hypre_ResetDeviceRandGenerator(1234ULL, 0ULL); #endif hypre_ParVectorCopy(x0_save, x); HYPRE_LOBPCGSetup(pcg_solver, (HYPRE_Matrix)parcsr_A, (HYPRE_Vector)b, (HYPRE_Vector)x); HYPRE_LOBPCGSolve(pcg_solver, constraints, eigenvectors, eigenvalues ); } HYPRE_LOBPCGDestroy(pcg_solver); if (solver_id == 1) { HYPRE_BoomerAMGDestroy(pcg_precond); } else if (solver_id == 8) { HYPRE_ParaSailsDestroy(pcg_precond); } else if (solver_id == 12) { HYPRE_SchwarzDestroy(pcg_precond); } else if (solver_id == 14) { HYPRE_BoomerAMGDestroy(pcg_precond); } else if (solver_id == 43) { HYPRE_EuclidDestroy(pcg_precond); } mv_MultiVectorDestroy( eigenvectors ); if ( constrained ) { mv_MultiVectorDestroy( constraints ); } if ( lobpcgGen ) { mv_MultiVectorDestroy( workspace ); } hypre_TFree(eigenvalues, HYPRE_MEMORY_HOST); } /* if ( pcgIterations > 0 ) */ hypre_TFree( interpreter, HYPRE_MEMORY_HOST); if ( lobpcgGen ) { HYPRE_IJMatrixDestroy(ij_B); } } /* if ( lobpcgFlag ) */ /* end lobpcg */ /*----------------------------------------------------------- * Solve the system using GMRES *-----------------------------------------------------------*/ if (solver_id == 3 || solver_id == 4 || solver_id == 7 || solver_id == 15 || solver_id == 18 || solver_id == 44 || solver_id == 81 || solver_id == 91) { HYPRE_ANNOTATE_REGION_BEGIN("%s", "Run-1"); time_index = hypre_InitializeTiming("GMRES Setup"); hypre_BeginTiming(time_index); HYPRE_ParCSRGMRESCreate(hypre_MPI_COMM_WORLD, &pcg_solver); HYPRE_GMRESSetKDim(pcg_solver, k_dim); HYPRE_GMRESSetMaxIter(pcg_solver, max_iter); HYPRE_GMRESSetTol(pcg_solver, tol); HYPRE_GMRESSetAbsoluteTol(pcg_solver, atol); HYPRE_GMRESSetLogging(pcg_solver, 1); HYPRE_GMRESSetPrintLevel(pcg_solver, ioutdat); HYPRE_GMRESSetRelChange(pcg_solver, rel_change); if (solver_id == 3 || solver_id == 91) { if (solver_id == 3) { /* use BoomerAMG as preconditioner */ if (myid == 0) { hypre_printf("Solver: AMG-GMRES\n"); } HYPRE_BoomerAMGCreate(&amg_precond); } else { /* use BoomerAMG-DD as preconditioner */ if (myid == 0) { hypre_printf("Solver: AMG-DD-GMRES\n"); } HYPRE_BoomerAMGDDCreate(&pcg_precond); HYPRE_BoomerAMGDDGetAMG(pcg_precond, &amg_precond); /* AMG-DD options */ HYPRE_BoomerAMGDDSetStartLevel(pcg_precond, amgdd_start_level); HYPRE_BoomerAMGDDSetPadding(pcg_precond, amgdd_padding); HYPRE_BoomerAMGDDSetFACNumRelax(pcg_precond, amgdd_fac_num_relax); HYPRE_BoomerAMGDDSetFACNumCycles(pcg_precond, amgdd_num_comp_cycles); HYPRE_BoomerAMGDDSetFACRelaxType(pcg_precond, amgdd_fac_relax_type); HYPRE_BoomerAMGDDSetFACCycleType(pcg_precond, amgdd_fac_cycle_type); HYPRE_BoomerAMGDDSetNumGhostLayers(pcg_precond, amgdd_num_ghost_layers); } if (air) { /* RL: specify restriction */ hypre_assert(restri_type >= 0); HYPRE_BoomerAMGSetRestriction(amg_precond, restri_type); /* 0: P^T, 1: AIR, 2: AIR-2 */ HYPRE_BoomerAMGSetGridRelaxPoints(amg_precond, grid_relax_points); HYPRE_BoomerAMGSetStrongThresholdR(amg_precond, strong_thresholdR); HYPRE_BoomerAMGSetFilterThresholdR(amg_precond, filter_thresholdR); } HYPRE_BoomerAMGSetCGCIts(amg_precond, cgcits); HYPRE_BoomerAMGSetInterpType(amg_precond, interp_type); HYPRE_BoomerAMGSetRestriction(amg_precond, restri_type); /* 0: P^T, 1: AIR, 2: AIR-2 */ HYPRE_BoomerAMGSetPostInterpType(amg_precond, post_interp_type); HYPRE_BoomerAMGSetNumSamples(amg_precond, gsmg_samples); HYPRE_BoomerAMGSetTol(amg_precond, pc_tol); HYPRE_BoomerAMGSetCoarsenType(amg_precond, coarsen_type); HYPRE_BoomerAMGSetCoarsenCutFactor(amg_precond, coarsen_cut_factor); HYPRE_BoomerAMGSetCPoints(amg_precond, max_levels, num_cpt, cpt_index); HYPRE_BoomerAMGSetFPoints(amg_precond, num_fpt, fpt_index); HYPRE_BoomerAMGSetIsolatedFPoints(amg_precond, num_isolated_fpt, isolated_fpt_index); HYPRE_BoomerAMGSetMeasureType(amg_precond, measure_type); HYPRE_BoomerAMGSetStrongThreshold(amg_precond, strong_threshold); HYPRE_BoomerAMGSetSeqThreshold(amg_precond, seq_threshold); HYPRE_BoomerAMGSetRedundant(amg_precond, redundant); HYPRE_BoomerAMGSetMaxCoarseSize(amg_precond, coarse_threshold); HYPRE_BoomerAMGSetMinCoarseSize(amg_precond, min_coarse_size); HYPRE_BoomerAMGSetTruncFactor(amg_precond, trunc_factor); HYPRE_BoomerAMGSetPMaxElmts(amg_precond, P_max_elmts); HYPRE_BoomerAMGSetJacobiTruncThreshold(amg_precond, jacobi_trunc_threshold); HYPRE_BoomerAMGSetSCommPkgSwitch(amg_precond, S_commpkg_switch); HYPRE_BoomerAMGSetPrintLevel(amg_precond, poutdat); HYPRE_BoomerAMGSetPrintFileName(amg_precond, "driver.out.log"); HYPRE_BoomerAMGSetMaxIter(amg_precond, precon_cycles); HYPRE_BoomerAMGSetCycleType(amg_precond, cycle_type); HYPRE_BoomerAMGSetFCycle(amg_precond, fcycle); HYPRE_BoomerAMGSetNumSweeps(amg_precond, num_sweeps); HYPRE_BoomerAMGSetISType(amg_precond, IS_type); HYPRE_BoomerAMGSetNumCRRelaxSteps(amg_precond, num_CR_relax_steps); HYPRE_BoomerAMGSetCRRate(amg_precond, CR_rate); HYPRE_BoomerAMGSetCRStrongTh(amg_precond, CR_strong_th); HYPRE_BoomerAMGSetCRUseCG(amg_precond, CR_use_CG); if (relax_type > -1) { HYPRE_BoomerAMGSetRelaxType(amg_precond, relax_type); } if (relax_down > -1) { HYPRE_BoomerAMGSetCycleRelaxType(amg_precond, relax_down, 1); } if (relax_up > -1) { HYPRE_BoomerAMGSetCycleRelaxType(amg_precond, relax_up, 2); } if (relax_coarse > -1) { HYPRE_BoomerAMGSetCycleRelaxType(amg_precond, relax_coarse, 3); } HYPRE_BoomerAMGSetAddRelaxType(amg_precond, add_relax_type); HYPRE_BoomerAMGSetAddRelaxWt(amg_precond, add_relax_wt); HYPRE_BoomerAMGSetChebyOrder(amg_precond, cheby_order); HYPRE_BoomerAMGSetChebyFraction(amg_precond, cheby_fraction); HYPRE_BoomerAMGSetChebyEigEst(amg_precond, cheby_eig_est); HYPRE_BoomerAMGSetChebyVariant(amg_precond, cheby_variant); HYPRE_BoomerAMGSetChebyScale(amg_precond, cheby_scale); HYPRE_BoomerAMGSetRelaxOrder(amg_precond, relax_order); HYPRE_BoomerAMGSetRelaxWt(amg_precond, relax_wt); HYPRE_BoomerAMGSetOuterWt(amg_precond, outer_wt); if (level_w > -1) { HYPRE_BoomerAMGSetLevelRelaxWt(amg_precond, relax_wt_level, level_w); } if (level_ow > -1) { HYPRE_BoomerAMGSetLevelOuterWt(amg_precond, outer_wt_level, level_ow); } HYPRE_BoomerAMGSetSmoothType(amg_precond, smooth_type); HYPRE_BoomerAMGSetSmoothNumLevels(amg_precond, smooth_num_levels); HYPRE_BoomerAMGSetSmoothNumSweeps(amg_precond, smooth_num_sweeps); HYPRE_BoomerAMGSetMaxLevels(amg_precond, max_levels); HYPRE_BoomerAMGSetMaxRowSum(amg_precond, max_row_sum); HYPRE_BoomerAMGSetDebugFlag(amg_precond, debug_flag); HYPRE_BoomerAMGSetFilterFunctions(amg_precond, filter_functions); HYPRE_BoomerAMGSetNumFunctions(amg_precond, num_functions); HYPRE_BoomerAMGSetAggNumLevels(amg_precond, agg_num_levels); HYPRE_BoomerAMGSetAggInterpType(amg_precond, agg_interp_type); HYPRE_BoomerAMGSetAggTruncFactor(amg_precond, agg_trunc_factor); HYPRE_BoomerAMGSetAggP12TruncFactor(amg_precond, agg_P12_trunc_factor); HYPRE_BoomerAMGSetAggPMaxElmts(amg_precond, agg_P_max_elmts); HYPRE_BoomerAMGSetAggP12MaxElmts(amg_precond, agg_P12_max_elmts); HYPRE_BoomerAMGSetNumPaths(amg_precond, num_paths); HYPRE_BoomerAMGSetNodal(amg_precond, nodal); HYPRE_BoomerAMGSetNodalDiag(amg_precond, nodal_diag); HYPRE_BoomerAMGSetVariant(amg_precond, variant); HYPRE_BoomerAMGSetOverlap(amg_precond, overlap); HYPRE_BoomerAMGSetDomainType(amg_precond, domain_type); HYPRE_BoomerAMGSetSchwarzUseNonSymm(amg_precond, use_nonsymm_schwarz); HYPRE_BoomerAMGSetSchwarzRlxWeight(amg_precond, schwarz_rlx_weight); if (eu_level < 0) { eu_level = 0; } HYPRE_BoomerAMGSetEuLevel(amg_precond, eu_level); HYPRE_BoomerAMGSetEuBJ(amg_precond, eu_bj); HYPRE_BoomerAMGSetEuSparseA(amg_precond, eu_sparse_A); HYPRE_BoomerAMGSetILUType(amg_precond, ilu_type); HYPRE_BoomerAMGSetILULevel(amg_precond, ilu_lfil); HYPRE_BoomerAMGSetILUDroptol(amg_precond, ilu_droptol); HYPRE_BoomerAMGSetILUMaxRowNnz(amg_precond, ilu_max_row_nnz); HYPRE_BoomerAMGSetILUMaxIter(amg_precond, ilu_sm_max_iter); HYPRE_BoomerAMGSetILUTriSolve(amg_precond, ilu_tri_solve); HYPRE_BoomerAMGSetILULowerJacobiIters(amg_precond, ilu_ljac_iters); HYPRE_BoomerAMGSetILUUpperJacobiIters(amg_precond, ilu_ujac_iters); HYPRE_BoomerAMGSetILULocalReordering(amg_precond, ilu_reordering); HYPRE_BoomerAMGSetILUIterSetupType(amg_precond, ilu_iter_setup_type); HYPRE_BoomerAMGSetILUIterSetupOption(amg_precond, ilu_iter_setup_option); HYPRE_BoomerAMGSetILUIterSetupMaxIter(amg_precond, ilu_iter_setup_max_iter); HYPRE_BoomerAMGSetILUIterSetupTolerance(amg_precond, ilu_iter_setup_tolerance); HYPRE_BoomerAMGSetFSAIAlgoType(amg_precond, fsai_algo_type); HYPRE_BoomerAMGSetFSAILocalSolveType(amg_precond, fsai_ls_type); HYPRE_BoomerAMGSetFSAIMaxSteps(amg_precond, fsai_max_steps); HYPRE_BoomerAMGSetFSAIMaxStepSize(amg_precond, fsai_max_step_size); HYPRE_BoomerAMGSetFSAIMaxNnzRow(amg_precond, fsai_max_nnz_row); HYPRE_BoomerAMGSetFSAINumLevels(amg_precond, fsai_num_levels); HYPRE_BoomerAMGSetFSAIThreshold(amg_precond, fsai_threshold); HYPRE_BoomerAMGSetFSAIEigMaxIters(amg_precond, fsai_eig_max_iters); HYPRE_BoomerAMGSetFSAIKapTolerance(amg_precond, fsai_kap_tolerance); HYPRE_BoomerAMGSetCycleNumSweeps(amg_precond, ns_coarse, 3); if (ns_down > -1) { HYPRE_BoomerAMGSetCycleNumSweeps(amg_precond, ns_down, 1); } if (ns_up > -1) { HYPRE_BoomerAMGSetCycleNumSweeps(amg_precond, ns_up, 2); } if (num_functions > 1) { HYPRE_BoomerAMGSetDofFunc(amg_precond, dof_func); } HYPRE_BoomerAMGSetAdditive(amg_precond, additive); HYPRE_BoomerAMGSetMultAdditive(amg_precond, mult_add); HYPRE_BoomerAMGSetSimple(amg_precond, simple); HYPRE_BoomerAMGSetAddLastLvl(amg_precond, add_last_lvl); HYPRE_BoomerAMGSetMultAddPMaxElmts(amg_precond, add_P_max_elmts); HYPRE_BoomerAMGSetMultAddTruncFactor(amg_precond, add_trunc_factor); HYPRE_BoomerAMGSetRAP2(amg_precond, rap2); HYPRE_BoomerAMGSetModuleRAP2(amg_precond, mod_rap2); HYPRE_BoomerAMGSetKeepTranspose(amg_precond, keepTranspose); #ifdef HYPRE_USING_DSUPERLU HYPRE_BoomerAMGSetDSLUThreshold(amg_precond, dslu_threshold); #endif if (nongalerk_tol) { HYPRE_BoomerAMGSetNonGalerkinTol(amg_precond, nongalerk_tol[nongalerk_num_tol - 1]); for (i = 0; i < nongalerk_num_tol - 1; i++) { HYPRE_BoomerAMGSetLevelNonGalerkinTol(amg_precond, nongalerk_tol[i], i); } } if (build_rbm) { HYPRE_BoomerAMGSetInterpVectors(amg_precond, 1, interp_vecs); HYPRE_BoomerAMGSetInterpVecVariant(amg_precond, interp_vec_variant); HYPRE_BoomerAMGSetInterpVecQMax(amg_precond, Q_max); HYPRE_BoomerAMGSetInterpVecAbsQTrunc(amg_precond, Q_trunc); } HYPRE_GMRESSetMaxIter(pcg_solver, mg_max_iter); if (solver_id == 3) { HYPRE_GMRESSetPrecond(pcg_solver, (HYPRE_PtrToSolverFcn) HYPRE_BoomerAMGSolve, (HYPRE_PtrToSolverFcn) HYPRE_BoomerAMGSetup, amg_precond); } else if (solver_id == 91) { HYPRE_GMRESSetPrecond(pcg_solver, (HYPRE_PtrToSolverFcn) HYPRE_BoomerAMGDDSolve, (HYPRE_PtrToSolverFcn) HYPRE_BoomerAMGDDSetup, pcg_precond); } } else if (solver_id == 4) { /* use diagonal scaling as preconditioner */ if (myid == 0) { hypre_printf("Solver: DS-GMRES\n"); } pcg_precond = NULL; HYPRE_GMRESSetPrecond(pcg_solver, (HYPRE_PtrToSolverFcn) HYPRE_ParCSRDiagScale, (HYPRE_PtrToSolverFcn) HYPRE_ParCSRDiagScaleSetup, pcg_precond); } else if (solver_id == 7) { /* use PILUT as preconditioner */ if (myid == 0) { hypre_printf("Solver: PILUT-GMRES\n"); } ierr = HYPRE_ParCSRPilutCreate( hypre_MPI_COMM_WORLD, &pcg_precond ); if (ierr) { hypre_printf("Error in ParPilutCreate\n"); } HYPRE_GMRESSetPrecond(pcg_solver, (HYPRE_PtrToSolverFcn) HYPRE_ParCSRPilutSolve, (HYPRE_PtrToSolverFcn) HYPRE_ParCSRPilutSetup, pcg_precond); if (drop_tol >= 0 ) HYPRE_ParCSRPilutSetDropTolerance( pcg_precond, drop_tol ); if (nonzeros_to_keep >= 0 ) HYPRE_ParCSRPilutSetFactorRowSize( pcg_precond, nonzeros_to_keep ); } else if (solver_id == 15) { /* use GSMG as preconditioner */ /* reset some smoother parameters */ relax_order = 0; if (myid == 0) { hypre_printf("Solver: GSMG-GMRES\n"); } HYPRE_BoomerAMGCreate(&pcg_precond); HYPRE_BoomerAMGSetGSMG(pcg_precond, 4); HYPRE_BoomerAMGSetCGCIts(pcg_precond, cgcits); HYPRE_BoomerAMGSetInterpType(pcg_precond, interp_type); HYPRE_BoomerAMGSetPostInterpType(pcg_precond, post_interp_type); HYPRE_BoomerAMGSetNumSamples(pcg_precond, gsmg_samples); HYPRE_BoomerAMGSetTol(pcg_precond, pc_tol); HYPRE_BoomerAMGSetCoarsenType(pcg_precond, coarsen_type); HYPRE_BoomerAMGSetCoarsenCutFactor(pcg_precond, coarsen_cut_factor); HYPRE_BoomerAMGSetCPoints(pcg_precond, max_levels, num_cpt, cpt_index); HYPRE_BoomerAMGSetFPoints(pcg_precond, num_fpt, fpt_index); HYPRE_BoomerAMGSetIsolatedFPoints(pcg_precond, num_isolated_fpt, isolated_fpt_index); HYPRE_BoomerAMGSetMeasureType(pcg_precond, measure_type); HYPRE_BoomerAMGSetStrongThreshold(pcg_precond, strong_threshold); HYPRE_BoomerAMGSetSeqThreshold(pcg_precond, seq_threshold); HYPRE_BoomerAMGSetRedundant(pcg_precond, redundant); HYPRE_BoomerAMGSetMaxCoarseSize(pcg_precond, coarse_threshold); HYPRE_BoomerAMGSetMinCoarseSize(pcg_precond, min_coarse_size); HYPRE_BoomerAMGSetTruncFactor(pcg_precond, trunc_factor); HYPRE_BoomerAMGSetPMaxElmts(pcg_precond, P_max_elmts); HYPRE_BoomerAMGSetJacobiTruncThreshold(pcg_precond, jacobi_trunc_threshold); HYPRE_BoomerAMGSetSCommPkgSwitch(pcg_precond, S_commpkg_switch); HYPRE_BoomerAMGSetPrintLevel(pcg_precond, poutdat); HYPRE_BoomerAMGSetPrintFileName(pcg_precond, "driver.out.log"); HYPRE_BoomerAMGSetMaxIter(pcg_precond, precon_cycles); HYPRE_BoomerAMGSetCycleType(pcg_precond, cycle_type); HYPRE_BoomerAMGSetFCycle(pcg_precond, fcycle); HYPRE_BoomerAMGSetNumSweeps(pcg_precond, num_sweeps); HYPRE_BoomerAMGSetISType(pcg_precond, IS_type); HYPRE_BoomerAMGSetNumCRRelaxSteps(pcg_precond, num_CR_relax_steps); HYPRE_BoomerAMGSetCRRate(pcg_precond, CR_rate); HYPRE_BoomerAMGSetCRStrongTh(pcg_precond, CR_strong_th); HYPRE_BoomerAMGSetCRUseCG(pcg_precond, CR_use_CG); if (relax_type > -1) { HYPRE_BoomerAMGSetRelaxType(pcg_precond, relax_type); } if (relax_down > -1) { HYPRE_BoomerAMGSetCycleRelaxType(pcg_precond, relax_down, 1); } if (relax_up > -1) { HYPRE_BoomerAMGSetCycleRelaxType(pcg_precond, relax_up, 2); } if (relax_coarse > -1) { HYPRE_BoomerAMGSetCycleRelaxType(pcg_precond, relax_coarse, 3); } HYPRE_BoomerAMGSetAddRelaxType(pcg_precond, add_relax_type); HYPRE_BoomerAMGSetAddRelaxWt(pcg_precond, add_relax_wt); HYPRE_BoomerAMGSetChebyOrder(pcg_precond, cheby_order); HYPRE_BoomerAMGSetChebyFraction(pcg_precond, cheby_fraction); HYPRE_BoomerAMGSetChebyEigEst(pcg_precond, cheby_eig_est); HYPRE_BoomerAMGSetChebyVariant(pcg_precond, cheby_variant); HYPRE_BoomerAMGSetChebyScale(pcg_precond, cheby_scale); HYPRE_BoomerAMGSetRelaxOrder(pcg_precond, relax_order); HYPRE_BoomerAMGSetRelaxWt(pcg_precond, relax_wt); HYPRE_BoomerAMGSetOuterWt(pcg_precond, outer_wt); if (level_w > -1) { HYPRE_BoomerAMGSetLevelRelaxWt(pcg_precond, relax_wt_level, level_w); } if (level_ow > -1) { HYPRE_BoomerAMGSetLevelOuterWt(pcg_precond, outer_wt_level, level_ow); } HYPRE_BoomerAMGSetSmoothType(pcg_precond, smooth_type); HYPRE_BoomerAMGSetSmoothNumLevels(pcg_precond, smooth_num_levels); HYPRE_BoomerAMGSetSmoothNumSweeps(pcg_precond, smooth_num_sweeps); HYPRE_BoomerAMGSetVariant(pcg_precond, variant); HYPRE_BoomerAMGSetOverlap(pcg_precond, overlap); HYPRE_BoomerAMGSetDomainType(pcg_precond, domain_type); HYPRE_BoomerAMGSetSchwarzUseNonSymm(pcg_precond, use_nonsymm_schwarz); HYPRE_BoomerAMGSetSchwarzRlxWeight(pcg_precond, schwarz_rlx_weight); if (eu_level < 0) { eu_level = 0; } HYPRE_BoomerAMGSetEuLevel(pcg_precond, eu_level); HYPRE_BoomerAMGSetEuBJ(pcg_precond, eu_bj); HYPRE_BoomerAMGSetEuSparseA(pcg_precond, eu_sparse_A); HYPRE_BoomerAMGSetILUType(pcg_precond, ilu_type); HYPRE_BoomerAMGSetILULevel(pcg_precond, ilu_lfil); HYPRE_BoomerAMGSetILUDroptol(pcg_precond, ilu_droptol); HYPRE_BoomerAMGSetILUMaxRowNnz(pcg_precond, ilu_max_row_nnz); HYPRE_BoomerAMGSetILUMaxIter(pcg_precond, ilu_sm_max_iter); HYPRE_BoomerAMGSetILUTriSolve(pcg_precond, ilu_tri_solve); HYPRE_BoomerAMGSetILULowerJacobiIters(pcg_precond, ilu_ljac_iters); HYPRE_BoomerAMGSetILUUpperJacobiIters(pcg_precond, ilu_ujac_iters); HYPRE_BoomerAMGSetILULocalReordering(pcg_precond, ilu_reordering); HYPRE_BoomerAMGSetILUIterSetupType(pcg_precond, ilu_iter_setup_type); HYPRE_BoomerAMGSetILUIterSetupOption(pcg_precond, ilu_iter_setup_option); HYPRE_BoomerAMGSetILUIterSetupMaxIter(pcg_precond, ilu_iter_setup_max_iter); HYPRE_BoomerAMGSetILUIterSetupTolerance(pcg_precond, ilu_iter_setup_tolerance); HYPRE_BoomerAMGSetFSAIAlgoType(pcg_precond, fsai_algo_type); HYPRE_BoomerAMGSetFSAILocalSolveType(pcg_precond, fsai_ls_type); HYPRE_BoomerAMGSetFSAIMaxSteps(pcg_precond, fsai_max_steps); HYPRE_BoomerAMGSetFSAIMaxStepSize(pcg_precond, fsai_max_step_size); HYPRE_BoomerAMGSetFSAIMaxNnzRow(pcg_precond, fsai_max_nnz_row); HYPRE_BoomerAMGSetFSAINumLevels(pcg_precond, fsai_num_levels); HYPRE_BoomerAMGSetFSAIThreshold(pcg_precond, fsai_threshold); HYPRE_BoomerAMGSetFSAIEigMaxIters(pcg_precond, fsai_eig_max_iters); HYPRE_BoomerAMGSetFSAIKapTolerance(pcg_precond, fsai_kap_tolerance); HYPRE_BoomerAMGSetMaxLevels(pcg_precond, max_levels); HYPRE_BoomerAMGSetMaxRowSum(pcg_precond, max_row_sum); HYPRE_BoomerAMGSetDebugFlag(pcg_precond, debug_flag); HYPRE_BoomerAMGSetFilterFunctions(pcg_precond, filter_functions); HYPRE_BoomerAMGSetNumFunctions(pcg_precond, num_functions); HYPRE_BoomerAMGSetAggNumLevels(pcg_precond, agg_num_levels); HYPRE_BoomerAMGSetAggInterpType(pcg_precond, agg_interp_type); HYPRE_BoomerAMGSetAggTruncFactor(pcg_precond, agg_trunc_factor); HYPRE_BoomerAMGSetAggP12TruncFactor(pcg_precond, agg_P12_trunc_factor); HYPRE_BoomerAMGSetAggPMaxElmts(pcg_precond, agg_P_max_elmts); HYPRE_BoomerAMGSetAggP12MaxElmts(pcg_precond, agg_P12_max_elmts); HYPRE_BoomerAMGSetNumPaths(pcg_precond, num_paths); HYPRE_BoomerAMGSetNodal(pcg_precond, nodal); HYPRE_BoomerAMGSetNodalDiag(pcg_precond, nodal_diag); HYPRE_BoomerAMGSetCycleNumSweeps(pcg_precond, ns_coarse, 3); if (num_functions > 1) { HYPRE_BoomerAMGSetDofFunc(pcg_precond, dof_func); } HYPRE_BoomerAMGSetAdditive(pcg_precond, additive); HYPRE_BoomerAMGSetMultAdditive(pcg_precond, mult_add); HYPRE_BoomerAMGSetSimple(pcg_precond, simple); HYPRE_BoomerAMGSetAddLastLvl(pcg_precond, add_last_lvl); HYPRE_BoomerAMGSetMultAddPMaxElmts(pcg_precond, add_P_max_elmts); HYPRE_BoomerAMGSetMultAddTruncFactor(pcg_precond, add_trunc_factor); HYPRE_BoomerAMGSetRAP2(pcg_precond, rap2); HYPRE_BoomerAMGSetModuleRAP2(pcg_precond, mod_rap2); HYPRE_BoomerAMGSetKeepTranspose(pcg_precond, keepTranspose); #ifdef HYPRE_USING_DSUPERLU HYPRE_BoomerAMGSetDSLUThreshold(pcg_precond, dslu_threshold); #endif if (nongalerk_tol) { HYPRE_BoomerAMGSetNonGalerkinTol(pcg_precond, nongalerk_tol[nongalerk_num_tol - 1]); for (i = 0; i < nongalerk_num_tol - 1; i++) { HYPRE_BoomerAMGSetLevelNonGalerkinTol(pcg_precond, nongalerk_tol[i], i); } } HYPRE_GMRESSetMaxIter(pcg_solver, mg_max_iter); HYPRE_GMRESSetPrecond(pcg_solver, (HYPRE_PtrToSolverFcn) HYPRE_BoomerAMGSolve, (HYPRE_PtrToSolverFcn) HYPRE_BoomerAMGSetup, pcg_precond); } else if (solver_id == 18) { /* use ParaSails preconditioner */ if (myid == 0) { hypre_printf("Solver: ParaSails-GMRES\n"); } HYPRE_ParaSailsCreate(hypre_MPI_COMM_WORLD, &pcg_precond); HYPRE_ParaSailsSetParams(pcg_precond, sai_threshold, max_levels); HYPRE_ParaSailsSetFilter(pcg_precond, sai_filter); HYPRE_ParaSailsSetLogging(pcg_precond, poutdat); HYPRE_ParaSailsSetSym(pcg_precond, 0); HYPRE_GMRESSetPrecond(pcg_solver, (HYPRE_PtrToSolverFcn) HYPRE_ParaSailsSolve, (HYPRE_PtrToSolverFcn) HYPRE_ParaSailsSetup, pcg_precond); } else if (solver_id == 44) { /* use Euclid preconditioning */ if (myid == 0) { hypre_printf("Solver: Euclid-GMRES\n"); } HYPRE_EuclidCreate(hypre_MPI_COMM_WORLD, &pcg_precond); if (eu_level > -1) { HYPRE_EuclidSetLevel(pcg_precond, eu_level); } if (eu_ilut) { HYPRE_EuclidSetILUT(pcg_precond, eu_ilut); } if (eu_sparse_A) { HYPRE_EuclidSetSparseA(pcg_precond, eu_sparse_A); } if (eu_row_scale) { HYPRE_EuclidSetRowScale(pcg_precond, eu_row_scale); } if (eu_bj) { HYPRE_EuclidSetBJ(pcg_precond, eu_bj); } HYPRE_EuclidSetStats(pcg_precond, eu_stats); HYPRE_EuclidSetMem(pcg_precond, eu_mem); /*HYPRE_EuclidSetParams(pcg_precond, argc, argv);*/ HYPRE_GMRESSetPrecond (pcg_solver, (HYPRE_PtrToSolverFcn) HYPRE_EuclidSolve, (HYPRE_PtrToSolverFcn) HYPRE_EuclidSetup, pcg_precond); } else if (solver_id == 81) { /* use hypre_ILU preconditioning */ if (myid == 0) { hypre_printf("Solver: ILU-GMRES\n"); } /* create precon */ HYPRE_ILUCreate(&pcg_precond); HYPRE_ILUSetType(pcg_precond, ilu_type); HYPRE_ILUSetLevelOfFill(pcg_precond, ilu_lfil); HYPRE_ILUSetLocalReordering(pcg_precond, ilu_reordering); HYPRE_ILUSetTriSolve(pcg_precond, ilu_tri_solve); HYPRE_ILUSetLowerJacobiIters(pcg_precond, ilu_ljac_iters); HYPRE_ILUSetUpperJacobiIters(pcg_precond, ilu_ujac_iters); HYPRE_ILUSetIterativeSetupType(pcg_precond, ilu_iter_setup_type); HYPRE_ILUSetIterativeSetupOption(pcg_precond, ilu_iter_setup_option); HYPRE_ILUSetIterativeSetupMaxIter(pcg_precond, ilu_iter_setup_max_iter); HYPRE_ILUSetIterativeSetupTolerance(pcg_precond, ilu_iter_setup_tolerance); /* set print level */ HYPRE_ILUSetPrintLevel(pcg_precond, poutdat); /* set max iterations */ HYPRE_ILUSetMaxIter(pcg_precond, 1); HYPRE_ILUSetTol(pcg_precond, pc_tol); /* set max number of nonzeros per row */ HYPRE_ILUSetMaxNnzPerRow(pcg_precond, ilu_max_row_nnz); /* set the droptol */ HYPRE_ILUSetDropThreshold(pcg_precond, ilu_droptol); /* set max iterations for Schur system solve */ HYPRE_ILUSetSchurMaxIter( pcg_precond, ilu_schur_max_iter ); if (ilu_type == 20 || ilu_type == 21) { HYPRE_ILUSetNSHDropThreshold( pcg_precond, ilu_nsh_droptol); } /* setup ILU-GMRES solver */ HYPRE_GMRESSetMaxIter(pcg_solver, mg_max_iter); HYPRE_GMRESSetPrecond(pcg_solver, (HYPRE_PtrToSolverFcn) HYPRE_ILUSolve, (HYPRE_PtrToSolverFcn) HYPRE_ILUSetup, pcg_precond); } HYPRE_GMRESGetPrecond(pcg_solver, &pcg_precond_gotten); if (pcg_precond_gotten != ((solver_id == 3) ? amg_precond : pcg_precond)) { hypre_printf("HYPRE_GMRESGetPrecond got bad precond\n"); return (-1); } else { if (myid == 0) { hypre_printf("HYPRE_GMRESGetPrecond got good precond\n"); } } HYPRE_GMRESSetup(pcg_solver, (HYPRE_Matrix)parcsr_M, (HYPRE_Vector)b, (HYPRE_Vector)x); hypre_EndTiming(time_index); hypre_PrintTiming("Setup phase times", hypre_MPI_COMM_WORLD); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); time_index = hypre_InitializeTiming("GMRES Solve"); hypre_BeginTiming(time_index); HYPRE_GMRESSolve(pcg_solver, (HYPRE_Matrix)parcsr_A, (HYPRE_Vector)b, (HYPRE_Vector)x); hypre_EndTiming(time_index); hypre_PrintTiming("Solve phase times", hypre_MPI_COMM_WORLD); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); if (check_residual) { HYPRE_BigInt *indices_h, *indices_d; HYPRE_Complex *values_h, *values_d; HYPRE_Int num_values = 20; HYPRE_ParCSRGMRESGetResidual(pcg_solver, &residual); HYPRE_ParCSRMatrixGetLocalRange( parcsr_A, &first_local_row, &last_local_row, &first_local_col, &last_local_col ); local_num_rows = (HYPRE_Int)(last_local_row - first_local_row + 1); if (local_num_rows < 20) { num_values = local_num_rows; } indices_h = hypre_TAlloc(HYPRE_BigInt, num_values, HYPRE_MEMORY_HOST); values_h = hypre_TAlloc(HYPRE_Complex, num_values, HYPRE_MEMORY_HOST); indices_d = hypre_TAlloc(HYPRE_BigInt, num_values, memory_location); values_d = hypre_TAlloc(HYPRE_Complex, num_values, memory_location); for (i = 0; i < num_values; i++) { indices_h[i] = first_local_row + i; } hypre_TMemcpy(indices_d, indices_h, HYPRE_BigInt, num_values, memory_location, HYPRE_MEMORY_HOST); HYPRE_ParVectorGetValues((HYPRE_ParVector) residual, num_values, indices_d, values_d); hypre_TMemcpy(values_h, values_d, HYPRE_Complex, num_values, HYPRE_MEMORY_HOST, memory_location); for (i = 0; i < num_values; i++) { if (myid == 0) { hypre_printf("index %d value %e\n", i, values_h[i]); } } hypre_TFree(indices_h, HYPRE_MEMORY_HOST); hypre_TFree(values_h, HYPRE_MEMORY_HOST); hypre_TFree(indices_d, memory_location); hypre_TFree(values_d, memory_location); } HYPRE_ANNOTATE_REGION_END("%s", "Run-1"); if (second_time) { HYPRE_ANNOTATE_REGION_BEGIN("%s", "Run-2"); /* run a second time [for timings, to check for memory leaks] */ HYPRE_ParVectorSetRandomValues(x, 775); #if defined(HYPRE_USING_CURAND) || defined(HYPRE_USING_ROCRAND) hypre_ResetDeviceRandGenerator(1234ULL, 0ULL); #endif hypre_ParVectorCopy(x0_save, x); HYPRE_GMRESSetup(pcg_solver, (HYPRE_Matrix) parcsr_M, (HYPRE_Vector) b, (HYPRE_Vector) x); HYPRE_GMRESSolve(pcg_solver, (HYPRE_Matrix) parcsr_A, (HYPRE_Vector) b, (HYPRE_Vector) x); HYPRE_ANNOTATE_REGION_END("%s", "Run-2"); } HYPRE_GMRESGetNumIterations(pcg_solver, &num_iterations); HYPRE_GMRESGetFinalRelativeResidualNorm(pcg_solver, &final_res_norm); HYPRE_ParCSRGMRESDestroy(pcg_solver); if (solver_id == 3) { HYPRE_BoomerAMGDestroy(amg_precond); } else if (solver_id == 15) { HYPRE_BoomerAMGDestroy(pcg_precond); } else if (solver_id == 7) { HYPRE_ParCSRPilutDestroy(pcg_precond); } else if (solver_id == 18) { HYPRE_ParaSailsDestroy(pcg_precond); } else if (solver_id == 44) { HYPRE_EuclidDestroy(pcg_precond); } else if (solver_id == 81) { HYPRE_ILUDestroy(pcg_precond); } else if (solver_id == 91) { HYPRE_BoomerAMGDDDestroy(pcg_precond); } if (myid == 0) { hypre_printf("\n"); hypre_printf("GMRES Iterations = %d\n", num_iterations); hypre_printf("Final GMRES Relative Residual Norm = %e\n", final_res_norm); hypre_printf("\n"); } } /*----------------------------------------------------------- * Solve the system using LGMRES *-----------------------------------------------------------*/ if (solver_id == 50 || solver_id == 51 ) { HYPRE_ANNOTATE_REGION_BEGIN("%s", "Run-1"); time_index = hypre_InitializeTiming("LGMRES Setup"); hypre_BeginTiming(time_index); HYPRE_ParCSRLGMRESCreate(hypre_MPI_COMM_WORLD, &pcg_solver); HYPRE_LGMRESSetKDim(pcg_solver, k_dim); HYPRE_LGMRESSetAugDim(pcg_solver, aug_dim); HYPRE_LGMRESSetMaxIter(pcg_solver, max_iter); HYPRE_LGMRESSetTol(pcg_solver, tol); HYPRE_LGMRESSetAbsoluteTol(pcg_solver, atol); HYPRE_LGMRESSetLogging(pcg_solver, 1); HYPRE_LGMRESSetPrintLevel(pcg_solver, ioutdat); if (solver_id == 51) { /* use BoomerAMG as preconditioner */ if (myid == 0) { hypre_printf("Solver: AMG-LGMRES\n"); } HYPRE_BoomerAMGCreate(&pcg_precond); HYPRE_BoomerAMGSetCGCIts(pcg_precond, cgcits); HYPRE_BoomerAMGSetInterpType(pcg_precond, interp_type); HYPRE_BoomerAMGSetPostInterpType(pcg_precond, post_interp_type); HYPRE_BoomerAMGSetNumSamples(pcg_precond, gsmg_samples); HYPRE_BoomerAMGSetTol(pcg_precond, pc_tol); HYPRE_BoomerAMGSetCoarsenType(pcg_precond, coarsen_type); HYPRE_BoomerAMGSetCoarsenCutFactor(pcg_precond, coarsen_cut_factor); HYPRE_BoomerAMGSetCPoints(pcg_precond, max_levels, num_cpt, cpt_index); HYPRE_BoomerAMGSetFPoints(pcg_precond, num_fpt, fpt_index); HYPRE_BoomerAMGSetIsolatedFPoints(pcg_precond, num_isolated_fpt, isolated_fpt_index); HYPRE_BoomerAMGSetMeasureType(pcg_precond, measure_type); HYPRE_BoomerAMGSetStrongThreshold(pcg_precond, strong_threshold); HYPRE_BoomerAMGSetSeqThreshold(pcg_precond, seq_threshold); HYPRE_BoomerAMGSetRedundant(pcg_precond, redundant); HYPRE_BoomerAMGSetMaxCoarseSize(pcg_precond, coarse_threshold); HYPRE_BoomerAMGSetMinCoarseSize(pcg_precond, min_coarse_size); HYPRE_BoomerAMGSetTruncFactor(pcg_precond, trunc_factor); HYPRE_BoomerAMGSetPMaxElmts(pcg_precond, P_max_elmts); HYPRE_BoomerAMGSetJacobiTruncThreshold(pcg_precond, jacobi_trunc_threshold); HYPRE_BoomerAMGSetSCommPkgSwitch(pcg_precond, S_commpkg_switch); HYPRE_BoomerAMGSetPrintLevel(pcg_precond, poutdat); HYPRE_BoomerAMGSetPrintFileName(pcg_precond, "driver.out.log"); HYPRE_BoomerAMGSetMaxIter(pcg_precond, precon_cycles); HYPRE_BoomerAMGSetCycleType(pcg_precond, cycle_type); HYPRE_BoomerAMGSetFCycle(pcg_precond, fcycle); HYPRE_BoomerAMGSetNumSweeps(pcg_precond, num_sweeps); HYPRE_BoomerAMGSetISType(pcg_precond, IS_type); HYPRE_BoomerAMGSetNumCRRelaxSteps(pcg_precond, num_CR_relax_steps); HYPRE_BoomerAMGSetCRRate(pcg_precond, CR_rate); HYPRE_BoomerAMGSetCRStrongTh(pcg_precond, CR_strong_th); HYPRE_BoomerAMGSetCRUseCG(pcg_precond, CR_use_CG); if (relax_type > -1) { HYPRE_BoomerAMGSetRelaxType(pcg_precond, relax_type); } if (relax_down > -1) { HYPRE_BoomerAMGSetCycleRelaxType(pcg_precond, relax_down, 1); } if (relax_up > -1) { HYPRE_BoomerAMGSetCycleRelaxType(pcg_precond, relax_up, 2); } if (relax_coarse > -1) { HYPRE_BoomerAMGSetCycleRelaxType(pcg_precond, relax_coarse, 3); } HYPRE_BoomerAMGSetAddRelaxType(pcg_precond, add_relax_type); HYPRE_BoomerAMGSetAddRelaxWt(pcg_precond, add_relax_wt); HYPRE_BoomerAMGSetChebyOrder(pcg_precond, cheby_order); HYPRE_BoomerAMGSetChebyFraction(pcg_precond, cheby_fraction); HYPRE_BoomerAMGSetChebyEigEst(pcg_precond, cheby_eig_est); HYPRE_BoomerAMGSetChebyVariant(pcg_precond, cheby_variant); HYPRE_BoomerAMGSetChebyScale(pcg_precond, cheby_scale); HYPRE_BoomerAMGSetRelaxOrder(pcg_precond, relax_order); HYPRE_BoomerAMGSetRelaxWt(pcg_precond, relax_wt); HYPRE_BoomerAMGSetOuterWt(pcg_precond, outer_wt); if (level_w > -1) { HYPRE_BoomerAMGSetLevelRelaxWt(pcg_precond, relax_wt_level, level_w); } if (level_ow > -1) { HYPRE_BoomerAMGSetLevelOuterWt(pcg_precond, outer_wt_level, level_ow); } HYPRE_BoomerAMGSetSmoothType(pcg_precond, smooth_type); HYPRE_BoomerAMGSetSmoothNumLevels(pcg_precond, smooth_num_levels); HYPRE_BoomerAMGSetSmoothNumSweeps(pcg_precond, smooth_num_sweeps); HYPRE_BoomerAMGSetMaxLevels(pcg_precond, max_levels); HYPRE_BoomerAMGSetMaxRowSum(pcg_precond, max_row_sum); HYPRE_BoomerAMGSetDebugFlag(pcg_precond, debug_flag); HYPRE_BoomerAMGSetFilterFunctions(pcg_precond, filter_functions); HYPRE_BoomerAMGSetNumFunctions(pcg_precond, num_functions); HYPRE_BoomerAMGSetAggNumLevels(pcg_precond, agg_num_levels); HYPRE_BoomerAMGSetAggInterpType(pcg_precond, agg_interp_type); HYPRE_BoomerAMGSetAggTruncFactor(pcg_precond, agg_trunc_factor); HYPRE_BoomerAMGSetAggP12TruncFactor(pcg_precond, agg_P12_trunc_factor); HYPRE_BoomerAMGSetAggPMaxElmts(pcg_precond, agg_P_max_elmts); HYPRE_BoomerAMGSetAggP12MaxElmts(pcg_precond, agg_P12_max_elmts); HYPRE_BoomerAMGSetNumPaths(pcg_precond, num_paths); HYPRE_BoomerAMGSetNodal(pcg_precond, nodal); HYPRE_BoomerAMGSetNodalDiag(pcg_precond, nodal_diag); HYPRE_BoomerAMGSetVariant(pcg_precond, variant); HYPRE_BoomerAMGSetOverlap(pcg_precond, overlap); HYPRE_BoomerAMGSetDomainType(pcg_precond, domain_type); HYPRE_BoomerAMGSetSchwarzUseNonSymm(pcg_precond, use_nonsymm_schwarz); HYPRE_BoomerAMGSetSchwarzRlxWeight(pcg_precond, schwarz_rlx_weight); if (eu_level < 0) { eu_level = 0; } HYPRE_BoomerAMGSetEuLevel(pcg_precond, eu_level); HYPRE_BoomerAMGSetEuBJ(pcg_precond, eu_bj); HYPRE_BoomerAMGSetEuSparseA(pcg_precond, eu_sparse_A); HYPRE_BoomerAMGSetILUType(pcg_precond, ilu_type); HYPRE_BoomerAMGSetILULevel(pcg_precond, ilu_lfil); HYPRE_BoomerAMGSetILUDroptol(pcg_precond, ilu_droptol); HYPRE_BoomerAMGSetILUMaxRowNnz(pcg_precond, ilu_max_row_nnz); HYPRE_BoomerAMGSetILUMaxIter(pcg_precond, ilu_sm_max_iter); HYPRE_BoomerAMGSetILUTriSolve(pcg_precond, ilu_tri_solve); HYPRE_BoomerAMGSetILULowerJacobiIters(pcg_precond, ilu_ljac_iters); HYPRE_BoomerAMGSetILUUpperJacobiIters(pcg_precond, ilu_ujac_iters); HYPRE_BoomerAMGSetILULocalReordering(pcg_precond, ilu_reordering); HYPRE_BoomerAMGSetILUIterSetupType(pcg_precond, ilu_iter_setup_type); HYPRE_BoomerAMGSetILUIterSetupOption(pcg_precond, ilu_iter_setup_option); HYPRE_BoomerAMGSetILUIterSetupMaxIter(pcg_precond, ilu_iter_setup_max_iter); HYPRE_BoomerAMGSetILUIterSetupTolerance(pcg_precond, ilu_iter_setup_tolerance); HYPRE_BoomerAMGSetFSAIAlgoType(pcg_precond, fsai_algo_type); HYPRE_BoomerAMGSetFSAILocalSolveType(pcg_precond, fsai_ls_type); HYPRE_BoomerAMGSetFSAIMaxSteps(pcg_precond, fsai_max_steps); HYPRE_BoomerAMGSetFSAIMaxStepSize(pcg_precond, fsai_max_step_size); HYPRE_BoomerAMGSetFSAIMaxNnzRow(pcg_precond, fsai_max_nnz_row); HYPRE_BoomerAMGSetFSAINumLevels(pcg_precond, fsai_num_levels); HYPRE_BoomerAMGSetFSAIThreshold(pcg_precond, fsai_threshold); HYPRE_BoomerAMGSetFSAIEigMaxIters(pcg_precond, fsai_eig_max_iters); HYPRE_BoomerAMGSetFSAIKapTolerance(pcg_precond, fsai_kap_tolerance); HYPRE_BoomerAMGSetCycleNumSweeps(pcg_precond, ns_coarse, 3); if (num_functions > 1) { HYPRE_BoomerAMGSetDofFunc(pcg_precond, dof_func); } HYPRE_BoomerAMGSetAdditive(pcg_precond, additive); HYPRE_BoomerAMGSetMultAdditive(pcg_precond, mult_add); HYPRE_BoomerAMGSetSimple(pcg_precond, simple); HYPRE_BoomerAMGSetAddLastLvl(pcg_precond, add_last_lvl); HYPRE_BoomerAMGSetMultAddPMaxElmts(pcg_precond, add_P_max_elmts); HYPRE_BoomerAMGSetMultAddTruncFactor(pcg_precond, add_trunc_factor); HYPRE_BoomerAMGSetRAP2(pcg_precond, rap2); HYPRE_BoomerAMGSetModuleRAP2(pcg_precond, mod_rap2); HYPRE_BoomerAMGSetKeepTranspose(pcg_precond, keepTranspose); #ifdef HYPRE_USING_DSUPERLU HYPRE_BoomerAMGSetDSLUThreshold(pcg_precond, dslu_threshold); #endif if (nongalerk_tol) { HYPRE_BoomerAMGSetNonGalerkinTol(pcg_precond, nongalerk_tol[nongalerk_num_tol - 1]); for (i = 0; i < nongalerk_num_tol - 1; i++) { HYPRE_BoomerAMGSetLevelNonGalerkinTol(pcg_precond, nongalerk_tol[i], i); } } HYPRE_LGMRESSetMaxIter(pcg_solver, mg_max_iter); HYPRE_LGMRESSetPrecond(pcg_solver, (HYPRE_PtrToSolverFcn) HYPRE_BoomerAMGSolve, (HYPRE_PtrToSolverFcn) HYPRE_BoomerAMGSetup, pcg_precond); } else if (solver_id == 50) { /* use diagonal scaling as preconditioner */ if (myid == 0) { hypre_printf("Solver: DS-LGMRES\n"); } pcg_precond = NULL; HYPRE_LGMRESSetPrecond(pcg_solver, (HYPRE_PtrToSolverFcn) HYPRE_ParCSRDiagScale, (HYPRE_PtrToSolverFcn) HYPRE_ParCSRDiagScaleSetup, pcg_precond); } HYPRE_LGMRESGetPrecond(pcg_solver, &pcg_precond_gotten); if (pcg_precond_gotten != pcg_precond) { hypre_printf("HYPRE_LGMRESGetPrecond got bad precond\n"); return (-1); } else if (myid == 0) { hypre_printf("HYPRE_LGMRESGetPrecond got good precond\n"); } HYPRE_LGMRESSetup (pcg_solver, (HYPRE_Matrix)parcsr_M, (HYPRE_Vector)b, (HYPRE_Vector)x); hypre_EndTiming(time_index); hypre_PrintTiming("Setup phase times", hypre_MPI_COMM_WORLD); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); time_index = hypre_InitializeTiming("LGMRES Solve"); hypre_BeginTiming(time_index); HYPRE_LGMRESSolve (pcg_solver, (HYPRE_Matrix)parcsr_A, (HYPRE_Vector)b, (HYPRE_Vector)x); hypre_EndTiming(time_index); hypre_PrintTiming("Solve phase times", hypre_MPI_COMM_WORLD); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); HYPRE_LGMRESGetNumIterations(pcg_solver, &num_iterations); HYPRE_LGMRESGetFinalRelativeResidualNorm(pcg_solver, &final_res_norm); HYPRE_ParCSRLGMRESDestroy(pcg_solver); if (solver_id == 51) { HYPRE_BoomerAMGDestroy(pcg_precond); } if (myid == 0) { hypre_printf("\n"); hypre_printf("LGMRES Iterations = %d\n", num_iterations); hypre_printf("Final LGMRES Relative Residual Norm = %e\n", final_res_norm); hypre_printf("\n"); } HYPRE_ANNOTATE_REGION_END("%s", "Run-1"); } /*----------------------------------------------------------- * Solve the system using FlexGMRES *-----------------------------------------------------------*/ if (solver_id == 60 || solver_id == 61 || solver_id == 72 || solver_id == 82 || solver_id == 47) { HYPRE_ANNOTATE_REGION_BEGIN("%s", "Run-1"); time_index = hypre_InitializeTiming("FlexGMRES Setup"); hypre_BeginTiming(time_index); HYPRE_ParCSRFlexGMRESCreate(hypre_MPI_COMM_WORLD, &pcg_solver); HYPRE_FlexGMRESSetKDim(pcg_solver, k_dim); HYPRE_FlexGMRESSetMaxIter(pcg_solver, max_iter); HYPRE_FlexGMRESSetTol(pcg_solver, tol); HYPRE_FlexGMRESSetAbsoluteTol(pcg_solver, atol); HYPRE_FlexGMRESSetLogging(pcg_solver, 1); HYPRE_FlexGMRESSetPrintLevel(pcg_solver, ioutdat); if (solver_id == 61) { /* use BoomerAMG as preconditioner */ if (myid == 0) { hypre_printf("Solver: AMG-FlexGMRES\n"); } HYPRE_BoomerAMGCreate(&pcg_precond); HYPRE_BoomerAMGSetCGCIts(pcg_precond, cgcits); HYPRE_BoomerAMGSetInterpType(pcg_precond, interp_type); HYPRE_BoomerAMGSetPostInterpType(pcg_precond, post_interp_type); HYPRE_BoomerAMGSetNumSamples(pcg_precond, gsmg_samples); HYPRE_BoomerAMGSetTol(pcg_precond, pc_tol); HYPRE_BoomerAMGSetCoarsenType(pcg_precond, coarsen_type); HYPRE_BoomerAMGSetCoarsenCutFactor(pcg_precond, coarsen_cut_factor); HYPRE_BoomerAMGSetCPoints(pcg_precond, max_levels, num_cpt, cpt_index); HYPRE_BoomerAMGSetFPoints(pcg_precond, num_fpt, fpt_index); HYPRE_BoomerAMGSetIsolatedFPoints(pcg_precond, num_isolated_fpt, isolated_fpt_index); HYPRE_BoomerAMGSetMeasureType(pcg_precond, measure_type); HYPRE_BoomerAMGSetStrongThreshold(pcg_precond, strong_threshold); HYPRE_BoomerAMGSetSeqThreshold(pcg_precond, seq_threshold); HYPRE_BoomerAMGSetRedundant(pcg_precond, redundant); HYPRE_BoomerAMGSetMaxCoarseSize(pcg_precond, coarse_threshold); HYPRE_BoomerAMGSetMinCoarseSize(pcg_precond, min_coarse_size); HYPRE_BoomerAMGSetTruncFactor(pcg_precond, trunc_factor); HYPRE_BoomerAMGSetPMaxElmts(pcg_precond, P_max_elmts); HYPRE_BoomerAMGSetJacobiTruncThreshold(pcg_precond, jacobi_trunc_threshold); HYPRE_BoomerAMGSetSCommPkgSwitch(pcg_precond, S_commpkg_switch); HYPRE_BoomerAMGSetPrintLevel(pcg_precond, poutdat); HYPRE_BoomerAMGSetPrintFileName(pcg_precond, "driver.out.log"); HYPRE_BoomerAMGSetMaxIter(pcg_precond, precon_cycles); HYPRE_BoomerAMGSetCycleType(pcg_precond, cycle_type); HYPRE_BoomerAMGSetFCycle(pcg_precond, fcycle); HYPRE_BoomerAMGSetNumSweeps(pcg_precond, num_sweeps); HYPRE_BoomerAMGSetISType(pcg_precond, IS_type); HYPRE_BoomerAMGSetNumCRRelaxSteps(pcg_precond, num_CR_relax_steps); HYPRE_BoomerAMGSetCRRate(pcg_precond, CR_rate); HYPRE_BoomerAMGSetCRStrongTh(pcg_precond, CR_strong_th); HYPRE_BoomerAMGSetCRUseCG(pcg_precond, CR_use_CG); if (relax_type > -1) { HYPRE_BoomerAMGSetRelaxType(pcg_precond, relax_type); } if (relax_down > -1) { HYPRE_BoomerAMGSetCycleRelaxType(pcg_precond, relax_down, 1); } if (relax_up > -1) { HYPRE_BoomerAMGSetCycleRelaxType(pcg_precond, relax_up, 2); } if (relax_coarse > -1) { HYPRE_BoomerAMGSetCycleRelaxType(pcg_precond, relax_coarse, 3); } HYPRE_BoomerAMGSetAddRelaxType(pcg_precond, add_relax_type); HYPRE_BoomerAMGSetAddRelaxWt(pcg_precond, add_relax_wt); HYPRE_BoomerAMGSetChebyOrder(pcg_precond, cheby_order); HYPRE_BoomerAMGSetChebyFraction(pcg_precond, cheby_fraction); HYPRE_BoomerAMGSetChebyEigEst(pcg_precond, cheby_eig_est); HYPRE_BoomerAMGSetChebyVariant(pcg_precond, cheby_variant); HYPRE_BoomerAMGSetChebyScale(pcg_precond, cheby_scale); HYPRE_BoomerAMGSetRelaxOrder(pcg_precond, relax_order); HYPRE_BoomerAMGSetRelaxWt(pcg_precond, relax_wt); HYPRE_BoomerAMGSetOuterWt(pcg_precond, outer_wt); if (level_w > -1) { HYPRE_BoomerAMGSetLevelRelaxWt(pcg_precond, relax_wt_level, level_w); } if (level_ow > -1) { HYPRE_BoomerAMGSetLevelOuterWt(pcg_precond, outer_wt_level, level_ow); } HYPRE_BoomerAMGSetSmoothType(pcg_precond, smooth_type); HYPRE_BoomerAMGSetSmoothNumLevels(pcg_precond, smooth_num_levels); HYPRE_BoomerAMGSetSmoothNumSweeps(pcg_precond, smooth_num_sweeps); HYPRE_BoomerAMGSetMaxLevels(pcg_precond, max_levels); HYPRE_BoomerAMGSetMaxRowSum(pcg_precond, max_row_sum); HYPRE_BoomerAMGSetDebugFlag(pcg_precond, debug_flag); HYPRE_BoomerAMGSetFilterFunctions(pcg_precond, filter_functions); HYPRE_BoomerAMGSetNumFunctions(pcg_precond, num_functions); HYPRE_BoomerAMGSetAggNumLevels(pcg_precond, agg_num_levels); HYPRE_BoomerAMGSetAggInterpType(pcg_precond, agg_interp_type); HYPRE_BoomerAMGSetAggTruncFactor(pcg_precond, agg_trunc_factor); HYPRE_BoomerAMGSetAggP12TruncFactor(pcg_precond, agg_P12_trunc_factor); HYPRE_BoomerAMGSetAggPMaxElmts(pcg_precond, agg_P_max_elmts); HYPRE_BoomerAMGSetAggP12MaxElmts(pcg_precond, agg_P12_max_elmts); HYPRE_BoomerAMGSetNumPaths(pcg_precond, num_paths); HYPRE_BoomerAMGSetNodal(pcg_precond, nodal); HYPRE_BoomerAMGSetNodalDiag(pcg_precond, nodal_diag); HYPRE_BoomerAMGSetVariant(pcg_precond, variant); HYPRE_BoomerAMGSetOverlap(pcg_precond, overlap); HYPRE_BoomerAMGSetDomainType(pcg_precond, domain_type); HYPRE_BoomerAMGSetSchwarzUseNonSymm(pcg_precond, use_nonsymm_schwarz); HYPRE_BoomerAMGSetSchwarzRlxWeight(pcg_precond, schwarz_rlx_weight); if (eu_level < 0) { eu_level = 0; } HYPRE_BoomerAMGSetEuLevel(pcg_precond, eu_level); HYPRE_BoomerAMGSetEuBJ(pcg_precond, eu_bj); HYPRE_BoomerAMGSetEuSparseA(pcg_precond, eu_sparse_A); HYPRE_BoomerAMGSetILUType(pcg_precond, ilu_type); HYPRE_BoomerAMGSetILULevel(pcg_precond, ilu_lfil); HYPRE_BoomerAMGSetILUDroptol(pcg_precond, ilu_droptol); HYPRE_BoomerAMGSetILUMaxRowNnz(pcg_precond, ilu_max_row_nnz); HYPRE_BoomerAMGSetILUMaxIter(pcg_precond, ilu_sm_max_iter); HYPRE_BoomerAMGSetILUTriSolve(pcg_precond, ilu_tri_solve); HYPRE_BoomerAMGSetILULowerJacobiIters(pcg_precond, ilu_ljac_iters); HYPRE_BoomerAMGSetILUUpperJacobiIters(pcg_precond, ilu_ujac_iters); HYPRE_BoomerAMGSetILULocalReordering(pcg_precond, ilu_reordering); HYPRE_BoomerAMGSetILUIterSetupType(pcg_precond, ilu_iter_setup_type); HYPRE_BoomerAMGSetILUIterSetupOption(pcg_precond, ilu_iter_setup_option); HYPRE_BoomerAMGSetILUIterSetupMaxIter(pcg_precond, ilu_iter_setup_max_iter); HYPRE_BoomerAMGSetILUIterSetupTolerance(pcg_precond, ilu_iter_setup_tolerance); HYPRE_BoomerAMGSetFSAIAlgoType(pcg_precond, fsai_algo_type); HYPRE_BoomerAMGSetFSAILocalSolveType(pcg_precond, fsai_ls_type); HYPRE_BoomerAMGSetFSAIMaxSteps(pcg_precond, fsai_max_steps); HYPRE_BoomerAMGSetFSAIMaxStepSize(pcg_precond, fsai_max_step_size); HYPRE_BoomerAMGSetFSAIMaxNnzRow(pcg_precond, fsai_max_nnz_row); HYPRE_BoomerAMGSetFSAINumLevels(pcg_precond, fsai_num_levels); HYPRE_BoomerAMGSetFSAIThreshold(pcg_precond, fsai_threshold); HYPRE_BoomerAMGSetFSAIEigMaxIters(pcg_precond, fsai_eig_max_iters); HYPRE_BoomerAMGSetFSAIKapTolerance(pcg_precond, fsai_kap_tolerance); HYPRE_BoomerAMGSetCycleNumSweeps(pcg_precond, ns_coarse, 3); if (num_functions > 1) { HYPRE_BoomerAMGSetDofFunc(pcg_precond, dof_func); } HYPRE_BoomerAMGSetAdditive(pcg_precond, additive); HYPRE_BoomerAMGSetMultAdditive(pcg_precond, mult_add); HYPRE_BoomerAMGSetSimple(pcg_precond, simple); HYPRE_BoomerAMGSetAddLastLvl(pcg_precond, add_last_lvl); HYPRE_BoomerAMGSetMultAddPMaxElmts(pcg_precond, add_P_max_elmts); HYPRE_BoomerAMGSetMultAddTruncFactor(pcg_precond, add_trunc_factor); HYPRE_BoomerAMGSetRAP2(pcg_precond, rap2); HYPRE_BoomerAMGSetModuleRAP2(pcg_precond, mod_rap2); HYPRE_BoomerAMGSetKeepTranspose(pcg_precond, keepTranspose); #ifdef HYPRE_USING_DSUPERLU HYPRE_BoomerAMGSetDSLUThreshold(pcg_precond, dslu_threshold); #endif if (nongalerk_tol) { HYPRE_BoomerAMGSetNonGalerkinTol(pcg_precond, nongalerk_tol[nongalerk_num_tol - 1]); for (i = 0; i < nongalerk_num_tol - 1; i++) { HYPRE_BoomerAMGSetLevelNonGalerkinTol(pcg_precond, nongalerk_tol[i], i); } } HYPRE_FlexGMRESSetMaxIter(pcg_solver, mg_max_iter); HYPRE_FlexGMRESSetPrecond(pcg_solver, (HYPRE_PtrToSolverFcn) HYPRE_BoomerAMGSolve, (HYPRE_PtrToSolverFcn) HYPRE_BoomerAMGSetup, pcg_precond); } else if ( solver_id == 72 ) { /* use MGR preconditioning */ if (myid == 0) { hypre_printf("Solver: MGR-FlexGMRES\n"); } HYPRE_MGRCreate(&pcg_precond); mgr_num_cindexes = hypre_CTAlloc(HYPRE_Int, mgr_nlevels, HYPRE_MEMORY_HOST); for (i = 0; i < mgr_nlevels; i++) { /* assume 1 coarse index per level */ mgr_num_cindexes[i] = 1; } mgr_cindexes = hypre_CTAlloc(HYPRE_Int*, mgr_nlevels, HYPRE_MEMORY_HOST); for (i = 0; i < mgr_nlevels; i++) { mgr_cindexes[i] = hypre_CTAlloc(HYPRE_Int, mgr_num_cindexes[i], HYPRE_MEMORY_HOST); } for (i = 0; i < mgr_nlevels; i++) { /* assume coarse point is at index 0 */ mgr_cindexes[i][0] = 0; } mgr_reserved_coarse_indexes = hypre_CTAlloc(HYPRE_BigInt, mgr_num_reserved_nodes, HYPRE_MEMORY_HOST); for (i = 0; i < mgr_num_reserved_nodes; i++) { /* generate artificial reserved nodes */ mgr_reserved_coarse_indexes[i] = last_local_row - (HYPRE_BigInt) i; //2*i+1; } /* set MGR data by block */ HYPRE_MGRSetCpointsByBlock( pcg_precond, mgr_bsize, mgr_nlevels, mgr_num_cindexes, mgr_cindexes); /* set reserved coarse nodes */ if (mgr_num_reserved_nodes) { HYPRE_MGRSetReservedCoarseNodes(pcg_precond, mgr_num_reserved_nodes, mgr_reserved_coarse_indexes); } /* set intermediate coarse grid strategy */ HYPRE_MGRSetNonCpointsToFpoints(pcg_precond, mgr_non_c_to_f); /* set F relaxation strategy */ HYPRE_MGRSetFRelaxMethod(pcg_precond, mgr_frelax_method); /* set relax type for single level F-relaxation and post-relaxation */ HYPRE_MGRSetRelaxType(pcg_precond, mgr_relax_type); HYPRE_MGRSetNumRelaxSweeps(pcg_precond, mgr_num_relax_sweeps); /* set interpolation type */ HYPRE_MGRSetInterpType(pcg_precond, mgr_interp_type); HYPRE_MGRSetNumInterpSweeps(pcg_precond, mgr_num_interp_sweeps); /* set print level */ HYPRE_MGRSetPrintLevel(pcg_precond, ioutdat); /* set max iterations */ HYPRE_MGRSetMaxIter(pcg_precond, 1); HYPRE_MGRSetTol(pcg_precond, pc_tol); /* set global smoother */ HYPRE_MGRSetGlobalSmoothType(pcg_precond, mgr_gsmooth_type); HYPRE_MGRSetMaxGlobalSmoothIters( pcg_precond, mgr_num_gsmooth_sweeps ); /* create AMG coarse grid solver */ HYPRE_BoomerAMGCreate(&amg_solver); if (hypre_GetExecPolicy1(memory_location) == HYPRE_EXEC_DEVICE) { HYPRE_BoomerAMGSetInterpType(amg_solver, 18); HYPRE_BoomerAMGSetCoarsenType(amg_solver, 8); HYPRE_BoomerAMGSetRelaxType(amg_solver, 3); } else { HYPRE_BoomerAMGSetInterpType(amg_solver, 0); HYPRE_BoomerAMGSetPostInterpType(amg_solver, post_interp_type); HYPRE_BoomerAMGSetCoarsenType(amg_solver, 6); HYPRE_BoomerAMGSetCycleType(amg_solver, cycle_type); HYPRE_BoomerAMGSetFCycle(amg_solver, fcycle); HYPRE_BoomerAMGSetRelaxType(amg_solver, 3); if (relax_down > -1) { HYPRE_BoomerAMGSetCycleRelaxType(amg_solver, relax_down, 1); } if (relax_up > -1) { HYPRE_BoomerAMGSetCycleRelaxType(amg_solver, relax_up, 2); } if (relax_coarse > -1) { HYPRE_BoomerAMGSetCycleRelaxType(amg_solver, relax_coarse, 3); } HYPRE_BoomerAMGSetSmoothType(amg_solver, smooth_type); HYPRE_BoomerAMGSetSmoothNumSweeps(amg_solver, smooth_num_sweeps); } HYPRE_BoomerAMGSetCGCIts(amg_solver, cgcits); HYPRE_BoomerAMGSetTol(amg_solver, 0.0); HYPRE_BoomerAMGSetPMaxElmts(amg_solver, 0); HYPRE_BoomerAMGSetNumSweeps(amg_solver, num_sweeps); HYPRE_BoomerAMGSetRelaxOrder(amg_solver, 1); HYPRE_BoomerAMGSetMaxLevels(amg_solver, max_levels); HYPRE_BoomerAMGSetMaxIter(amg_solver, precon_cycles); HYPRE_BoomerAMGSetPrintLevel(amg_solver, 1); /* set the MGR coarse solver. Comment out to use default CG solver in MGR */ HYPRE_MGRSetCoarseSolver( pcg_precond, HYPRE_BoomerAMGSolve, HYPRE_BoomerAMGSetup, amg_solver); /* setup MGR-PCG solver */ HYPRE_FlexGMRESSetMaxIter(pcg_solver, mg_max_iter); HYPRE_FlexGMRESSetPrecond(pcg_solver, (HYPRE_PtrToSolverFcn) HYPRE_MGRSolve, (HYPRE_PtrToSolverFcn) HYPRE_MGRSetup, pcg_precond); } else if (solver_id == 47) { /* use Euclid preconditioning */ if (myid == 0) { hypre_printf("Solver: Euclid-FlexGMRES\n"); } HYPRE_EuclidCreate(hypre_MPI_COMM_WORLD, &pcg_precond); if (eu_level > -1) { HYPRE_EuclidSetLevel(pcg_precond, eu_level); } if (eu_ilut) { HYPRE_EuclidSetILUT(pcg_precond, eu_ilut); } if (eu_sparse_A) { HYPRE_EuclidSetSparseA(pcg_precond, eu_sparse_A); } if (eu_row_scale) { HYPRE_EuclidSetRowScale(pcg_precond, eu_row_scale); } if (eu_bj) { HYPRE_EuclidSetBJ(pcg_precond, eu_bj); } HYPRE_EuclidSetStats(pcg_precond, eu_stats); HYPRE_EuclidSetMem(pcg_precond, eu_mem); /*HYPRE_EuclidSetParams(pcg_precond, argc, argv);*/ /* setup MGR-PCG solver */ HYPRE_FlexGMRESSetMaxIter(pcg_solver, mg_max_iter); HYPRE_FlexGMRESSetPrecond(pcg_solver, (HYPRE_PtrToSolverFcn) HYPRE_EuclidSolve, (HYPRE_PtrToSolverFcn) HYPRE_EuclidSetup, pcg_precond); } else if (solver_id == 82) { /* use hypre_ILU preconditioning */ if (myid == 0) { hypre_printf("Solver: ILU-FlexGMRES\n"); } /* create precon */ HYPRE_ILUCreate(&pcg_precond); HYPRE_ILUSetType(pcg_precond, ilu_type); HYPRE_ILUSetLevelOfFill(pcg_precond, ilu_lfil); HYPRE_ILUSetLocalReordering(pcg_precond, ilu_reordering); HYPRE_ILUSetTriSolve(pcg_precond, ilu_tri_solve); HYPRE_ILUSetLowerJacobiIters(pcg_precond, ilu_ljac_iters); HYPRE_ILUSetUpperJacobiIters(pcg_precond, ilu_ujac_iters); HYPRE_ILUSetIterativeSetupType(pcg_precond, ilu_iter_setup_type); HYPRE_ILUSetIterativeSetupOption(pcg_precond, ilu_iter_setup_option); HYPRE_ILUSetIterativeSetupMaxIter(pcg_precond, ilu_iter_setup_max_iter); HYPRE_ILUSetIterativeSetupTolerance(pcg_precond, ilu_iter_setup_tolerance); /* set print level */ HYPRE_ILUSetPrintLevel(pcg_precond, poutdat); /* set max iterations */ HYPRE_ILUSetMaxIter(pcg_precond, 1); HYPRE_ILUSetTol(pcg_precond, pc_tol); /* set max number of nonzeros per row */ HYPRE_ILUSetMaxNnzPerRow(pcg_precond, ilu_max_row_nnz); /* set the droptol */ HYPRE_ILUSetDropThreshold(pcg_precond, ilu_droptol); /* set max iterations for Schur system solve */ HYPRE_ILUSetSchurMaxIter( pcg_precond, ilu_schur_max_iter ); HYPRE_ILUSetNSHDropThreshold( pcg_precond, ilu_nsh_droptol); /* setup MGR-PCG solver */ HYPRE_FlexGMRESSetMaxIter(pcg_solver, mg_max_iter); HYPRE_FlexGMRESSetPrecond(pcg_solver, (HYPRE_PtrToSolverFcn) HYPRE_ILUSolve, (HYPRE_PtrToSolverFcn) HYPRE_ILUSetup, pcg_precond); } else if (solver_id == 60) { /* use diagonal scaling as preconditioner */ if (myid == 0) { hypre_printf("Solver: DS-FlexGMRES\n"); } pcg_precond = NULL; HYPRE_FlexGMRESSetPrecond(pcg_solver, (HYPRE_PtrToSolverFcn) HYPRE_ParCSRDiagScale, (HYPRE_PtrToSolverFcn) HYPRE_ParCSRDiagScaleSetup, pcg_precond); } HYPRE_FlexGMRESGetPrecond(pcg_solver, &pcg_precond_gotten); if (pcg_precond_gotten != pcg_precond) { hypre_printf("HYPRE_FlexGMRESGetPrecond got bad precond\n"); return (-1); } else if (myid == 0) { hypre_printf("HYPRE_FlexGMRESGetPrecond got good precond\n"); } /* this is optional - could be a user defined one instead (see ex5.c)*/ HYPRE_FlexGMRESSetModifyPC( pcg_solver, (HYPRE_PtrToModifyPCFcn) hypre_FlexGMRESModifyPCDefault); HYPRE_FlexGMRESSetup (pcg_solver, (HYPRE_Matrix)parcsr_M, (HYPRE_Vector)b, (HYPRE_Vector)x); hypre_EndTiming(time_index); hypre_PrintTiming("Setup phase times", hypre_MPI_COMM_WORLD); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); time_index = hypre_InitializeTiming("FlexGMRES Solve"); hypre_BeginTiming(time_index); HYPRE_FlexGMRESSolve (pcg_solver, (HYPRE_Matrix)parcsr_A, (HYPRE_Vector)b, (HYPRE_Vector)x); hypre_EndTiming(time_index); hypre_PrintTiming("Solve phase times", hypre_MPI_COMM_WORLD); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); HYPRE_FlexGMRESGetNumIterations(pcg_solver, &num_iterations); HYPRE_FlexGMRESGetFinalRelativeResidualNorm(pcg_solver, &final_res_norm); HYPRE_ParCSRFlexGMRESDestroy(pcg_solver); if (solver_id == 61) { HYPRE_BoomerAMGDestroy(pcg_precond); } else if (solver_id == 72) { /* free memory */ if (mgr_num_cindexes) { hypre_TFree(mgr_num_cindexes, HYPRE_MEMORY_HOST); } mgr_num_cindexes = NULL; if (mgr_reserved_coarse_indexes) { hypre_TFree(mgr_reserved_coarse_indexes, HYPRE_MEMORY_HOST); } mgr_reserved_coarse_indexes = NULL; if (mgr_cindexes) { for ( i = 0; i < mgr_nlevels; i++) { if (mgr_cindexes[i]) { hypre_TFree(mgr_cindexes[i], HYPRE_MEMORY_HOST); } } hypre_TFree(mgr_cindexes, HYPRE_MEMORY_HOST); mgr_cindexes = NULL; } HYPRE_BoomerAMGDestroy(amg_solver); HYPRE_MGRDestroy(pcg_precond); } else if (solver_id == 47) { HYPRE_EuclidDestroy(pcg_precond); } else if (solver_id == 82) { HYPRE_ILUDestroy(pcg_precond); } if (myid == 0) { hypre_printf("\n"); hypre_printf("FlexGMRES Iterations = %d\n", num_iterations); hypre_printf("Final FlexGMRES Relative Residual Norm = %e\n", final_res_norm); hypre_printf("\n"); } HYPRE_ANNOTATE_REGION_END("%s", "Run-1"); } /*----------------------------------------------------------- * Solve the system using BiCGSTAB *-----------------------------------------------------------*/ if (solver_id == 9 || solver_id == 10 || solver_id == 11 || solver_id == 45 || solver_id == 73) { HYPRE_ANNOTATE_REGION_BEGIN("%s", "Run-1"); time_index = hypre_InitializeTiming("BiCGSTAB Setup"); hypre_BeginTiming(time_index); HYPRE_ParCSRBiCGSTABCreate(hypre_MPI_COMM_WORLD, &pcg_solver); HYPRE_BiCGSTABSetMaxIter(pcg_solver, max_iter); HYPRE_BiCGSTABSetTol(pcg_solver, tol); HYPRE_BiCGSTABSetAbsoluteTol(pcg_solver, atol); HYPRE_BiCGSTABSetLogging(pcg_solver, ioutdat); HYPRE_BiCGSTABSetPrintLevel(pcg_solver, ioutdat); if (solver_id == 9) { /* use BoomerAMG as preconditioner */ if (myid == 0) { hypre_printf("Solver: AMG-BiCGSTAB\n"); } HYPRE_BoomerAMGCreate(&pcg_precond); HYPRE_BoomerAMGSetCGCIts(pcg_precond, cgcits); HYPRE_BoomerAMGSetInterpType(pcg_precond, interp_type); HYPRE_BoomerAMGSetPostInterpType(pcg_precond, post_interp_type); HYPRE_BoomerAMGSetNumSamples(pcg_precond, gsmg_samples); HYPRE_BoomerAMGSetTol(pcg_precond, pc_tol); HYPRE_BoomerAMGSetCoarsenType(pcg_precond, coarsen_type); HYPRE_BoomerAMGSetCoarsenCutFactor(pcg_precond, coarsen_cut_factor); HYPRE_BoomerAMGSetCPoints(pcg_precond, max_levels, num_cpt, cpt_index); HYPRE_BoomerAMGSetFPoints(pcg_precond, num_fpt, fpt_index); HYPRE_BoomerAMGSetIsolatedFPoints(pcg_precond, num_isolated_fpt, isolated_fpt_index); HYPRE_BoomerAMGSetMeasureType(pcg_precond, measure_type); HYPRE_BoomerAMGSetStrongThreshold(pcg_precond, strong_threshold); HYPRE_BoomerAMGSetSeqThreshold(pcg_precond, seq_threshold); HYPRE_BoomerAMGSetRedundant(pcg_precond, redundant); HYPRE_BoomerAMGSetMaxCoarseSize(pcg_precond, coarse_threshold); HYPRE_BoomerAMGSetMinCoarseSize(pcg_precond, min_coarse_size); HYPRE_BoomerAMGSetTruncFactor(pcg_precond, trunc_factor); HYPRE_BoomerAMGSetPMaxElmts(pcg_precond, P_max_elmts); HYPRE_BoomerAMGSetJacobiTruncThreshold(pcg_precond, jacobi_trunc_threshold); HYPRE_BoomerAMGSetSCommPkgSwitch(pcg_precond, S_commpkg_switch); HYPRE_BoomerAMGSetPrintLevel(pcg_precond, poutdat); HYPRE_BoomerAMGSetPrintFileName(pcg_precond, "driver.out.log"); HYPRE_BoomerAMGSetMaxIter(pcg_precond, precon_cycles); HYPRE_BoomerAMGSetCycleType(pcg_precond, cycle_type); HYPRE_BoomerAMGSetFCycle(pcg_precond, fcycle); HYPRE_BoomerAMGSetNumSweeps(pcg_precond, num_sweeps); HYPRE_BoomerAMGSetISType(pcg_precond, IS_type); HYPRE_BoomerAMGSetNumCRRelaxSteps(pcg_precond, num_CR_relax_steps); HYPRE_BoomerAMGSetCRRate(pcg_precond, CR_rate); HYPRE_BoomerAMGSetCRStrongTh(pcg_precond, CR_strong_th); HYPRE_BoomerAMGSetCRUseCG(pcg_precond, CR_use_CG); if (relax_type > -1) { HYPRE_BoomerAMGSetRelaxType(pcg_precond, relax_type); } if (relax_down > -1) { HYPRE_BoomerAMGSetCycleRelaxType(pcg_precond, relax_down, 1); } if (relax_up > -1) { HYPRE_BoomerAMGSetCycleRelaxType(pcg_precond, relax_up, 2); } if (relax_coarse > -1) { HYPRE_BoomerAMGSetCycleRelaxType(pcg_precond, relax_coarse, 3); } HYPRE_BoomerAMGSetAddRelaxType(pcg_precond, add_relax_type); HYPRE_BoomerAMGSetAddRelaxWt(pcg_precond, add_relax_wt); HYPRE_BoomerAMGSetChebyOrder(pcg_precond, cheby_order); HYPRE_BoomerAMGSetChebyFraction(pcg_precond, cheby_fraction); HYPRE_BoomerAMGSetChebyEigEst(pcg_precond, cheby_eig_est); HYPRE_BoomerAMGSetChebyVariant(pcg_precond, cheby_variant); HYPRE_BoomerAMGSetChebyScale(pcg_precond, cheby_scale); HYPRE_BoomerAMGSetRelaxOrder(pcg_precond, relax_order); HYPRE_BoomerAMGSetRelaxWt(pcg_precond, relax_wt); HYPRE_BoomerAMGSetOuterWt(pcg_precond, outer_wt); if (level_w > -1) { HYPRE_BoomerAMGSetLevelRelaxWt(pcg_precond, relax_wt_level, level_w); } if (level_ow > -1) { HYPRE_BoomerAMGSetLevelOuterWt(pcg_precond, outer_wt_level, level_ow); } HYPRE_BoomerAMGSetSmoothType(pcg_precond, smooth_type); HYPRE_BoomerAMGSetSmoothNumLevels(pcg_precond, smooth_num_levels); HYPRE_BoomerAMGSetSmoothNumSweeps(pcg_precond, smooth_num_sweeps); HYPRE_BoomerAMGSetMaxLevels(pcg_precond, max_levels); HYPRE_BoomerAMGSetMaxRowSum(pcg_precond, max_row_sum); HYPRE_BoomerAMGSetDebugFlag(pcg_precond, debug_flag); HYPRE_BoomerAMGSetFilterFunctions(pcg_precond, filter_functions); HYPRE_BoomerAMGSetNumFunctions(pcg_precond, num_functions); HYPRE_BoomerAMGSetAggNumLevels(pcg_precond, agg_num_levels); HYPRE_BoomerAMGSetAggInterpType(pcg_precond, agg_interp_type); HYPRE_BoomerAMGSetAggTruncFactor(pcg_precond, agg_trunc_factor); HYPRE_BoomerAMGSetAggP12TruncFactor(pcg_precond, agg_P12_trunc_factor); HYPRE_BoomerAMGSetAggPMaxElmts(pcg_precond, agg_P_max_elmts); HYPRE_BoomerAMGSetAggP12MaxElmts(pcg_precond, agg_P12_max_elmts); HYPRE_BoomerAMGSetNumPaths(pcg_precond, num_paths); HYPRE_BoomerAMGSetNodal(pcg_precond, nodal); HYPRE_BoomerAMGSetNodalDiag(pcg_precond, nodal_diag); HYPRE_BoomerAMGSetVariant(pcg_precond, variant); HYPRE_BoomerAMGSetOverlap(pcg_precond, overlap); HYPRE_BoomerAMGSetDomainType(pcg_precond, domain_type); HYPRE_BoomerAMGSetSchwarzUseNonSymm(pcg_precond, use_nonsymm_schwarz); HYPRE_BoomerAMGSetSchwarzRlxWeight(pcg_precond, schwarz_rlx_weight); if (eu_level < 0) { eu_level = 0; } HYPRE_BoomerAMGSetEuLevel(pcg_precond, eu_level); HYPRE_BoomerAMGSetEuBJ(pcg_precond, eu_bj); HYPRE_BoomerAMGSetEuSparseA(pcg_precond, eu_sparse_A); HYPRE_BoomerAMGSetILUType(pcg_precond, ilu_type); HYPRE_BoomerAMGSetILULevel(pcg_precond, ilu_lfil); HYPRE_BoomerAMGSetILUDroptol(pcg_precond, ilu_droptol); HYPRE_BoomerAMGSetILUMaxRowNnz(pcg_precond, ilu_max_row_nnz); HYPRE_BoomerAMGSetILUMaxIter(pcg_precond, ilu_sm_max_iter); HYPRE_BoomerAMGSetILUTriSolve(pcg_precond, ilu_tri_solve); HYPRE_BoomerAMGSetILULowerJacobiIters(pcg_precond, ilu_ljac_iters); HYPRE_BoomerAMGSetILUUpperJacobiIters(pcg_precond, ilu_ujac_iters); HYPRE_BoomerAMGSetILULocalReordering(pcg_precond, ilu_reordering); HYPRE_BoomerAMGSetILUIterSetupType(pcg_precond, ilu_iter_setup_type); HYPRE_BoomerAMGSetILUIterSetupOption(pcg_precond, ilu_iter_setup_option); HYPRE_BoomerAMGSetILUIterSetupMaxIter(pcg_precond, ilu_iter_setup_max_iter); HYPRE_BoomerAMGSetILUIterSetupTolerance(pcg_precond, ilu_iter_setup_tolerance); HYPRE_BoomerAMGSetFSAIAlgoType(pcg_precond, fsai_algo_type); HYPRE_BoomerAMGSetFSAILocalSolveType(pcg_precond, fsai_ls_type); HYPRE_BoomerAMGSetFSAIMaxSteps(pcg_precond, fsai_max_steps); HYPRE_BoomerAMGSetFSAIMaxStepSize(pcg_precond, fsai_max_step_size); HYPRE_BoomerAMGSetFSAIMaxNnzRow(pcg_precond, fsai_max_nnz_row); HYPRE_BoomerAMGSetFSAINumLevels(pcg_precond, fsai_num_levels); HYPRE_BoomerAMGSetFSAIEigMaxIters(pcg_precond, fsai_eig_max_iters); HYPRE_BoomerAMGSetFSAIThreshold(pcg_precond, fsai_threshold); HYPRE_BoomerAMGSetFSAIKapTolerance(pcg_precond, fsai_kap_tolerance); HYPRE_BoomerAMGSetCycleNumSweeps(pcg_precond, ns_coarse, 3); if (num_functions > 1) { HYPRE_BoomerAMGSetDofFunc(pcg_precond, dof_func); } HYPRE_BoomerAMGSetAdditive(pcg_precond, additive); HYPRE_BoomerAMGSetMultAdditive(pcg_precond, mult_add); HYPRE_BoomerAMGSetSimple(pcg_precond, simple); HYPRE_BoomerAMGSetAddLastLvl(pcg_precond, add_last_lvl); HYPRE_BoomerAMGSetMultAddPMaxElmts(pcg_precond, add_P_max_elmts); HYPRE_BoomerAMGSetMultAddTruncFactor(pcg_precond, add_trunc_factor); HYPRE_BoomerAMGSetRAP2(pcg_precond, rap2); HYPRE_BoomerAMGSetModuleRAP2(pcg_precond, mod_rap2); HYPRE_BoomerAMGSetKeepTranspose(pcg_precond, keepTranspose); #ifdef HYPRE_USING_DSUPERLU HYPRE_BoomerAMGSetDSLUThreshold(pcg_precond, dslu_threshold); #endif if (nongalerk_tol) { HYPRE_BoomerAMGSetNonGalerkinTol(pcg_precond, nongalerk_tol[nongalerk_num_tol - 1]); for (i = 0; i < nongalerk_num_tol - 1; i++) { HYPRE_BoomerAMGSetLevelNonGalerkinTol(pcg_precond, nongalerk_tol[i], i); } } HYPRE_BiCGSTABSetMaxIter(pcg_solver, mg_max_iter); HYPRE_BiCGSTABSetPrecond(pcg_solver, (HYPRE_PtrToSolverFcn) HYPRE_BoomerAMGSolve, (HYPRE_PtrToSolverFcn) HYPRE_BoomerAMGSetup, pcg_precond); } else if (solver_id == 10) { /* use diagonal scaling as preconditioner */ if (myid == 0) { hypre_printf("Solver: DS-BiCGSTAB\n"); } pcg_precond = NULL; HYPRE_BiCGSTABSetPrecond(pcg_solver, (HYPRE_PtrToSolverFcn) HYPRE_ParCSRDiagScale, (HYPRE_PtrToSolverFcn) HYPRE_ParCSRDiagScaleSetup, pcg_precond); } else if (solver_id == 11) { /* use PILUT as preconditioner */ if (myid == 0) { hypre_printf("Solver: PILUT-BiCGSTAB\n"); } ierr = HYPRE_ParCSRPilutCreate( hypre_MPI_COMM_WORLD, &pcg_precond ); if (ierr) { hypre_printf("Error in ParPilutCreate\n"); } HYPRE_BiCGSTABSetPrecond(pcg_solver, (HYPRE_PtrToSolverFcn) HYPRE_ParCSRPilutSolve, (HYPRE_PtrToSolverFcn) HYPRE_ParCSRPilutSetup, pcg_precond); HYPRE_ParCSRPilutSetLogging(pcg_precond, 0); if (drop_tol >= 0 ) HYPRE_ParCSRPilutSetDropTolerance( pcg_precond, drop_tol ); if (nonzeros_to_keep >= 0 ) HYPRE_ParCSRPilutSetFactorRowSize( pcg_precond, nonzeros_to_keep ); } else if (solver_id == 45) { /* use Euclid preconditioning */ if (myid == 0) { hypre_printf("Solver: Euclid-BICGSTAB\n"); } HYPRE_EuclidCreate(hypre_MPI_COMM_WORLD, &pcg_precond); /* note: There are three three methods of setting run-time parameters for Euclid: (see HYPRE_parcsr_ls.h); here we'll use what I think is simplest: let Euclid internally parse the command line. */ if (eu_level > -1) { HYPRE_EuclidSetLevel(pcg_precond, eu_level); } if (eu_ilut) { HYPRE_EuclidSetILUT(pcg_precond, eu_ilut); } if (eu_sparse_A) { HYPRE_EuclidSetSparseA(pcg_precond, eu_sparse_A); } if (eu_row_scale) { HYPRE_EuclidSetRowScale(pcg_precond, eu_row_scale); } if (eu_bj) { HYPRE_EuclidSetBJ(pcg_precond, eu_bj); } HYPRE_EuclidSetStats(pcg_precond, eu_stats); HYPRE_EuclidSetMem(pcg_precond, eu_mem); /*HYPRE_EuclidSetParams(pcg_precond, argc, argv);*/ HYPRE_BiCGSTABSetPrecond(pcg_solver, (HYPRE_PtrToSolverFcn) HYPRE_EuclidSolve, (HYPRE_PtrToSolverFcn) HYPRE_EuclidSetup, pcg_precond); } else if (solver_id == 73) { /* use MGR preconditioning */ if (myid == 0) { hypre_printf("Solver: MGR-BICGSTAB\n"); } HYPRE_MGRCreate(&pcg_precond); mgr_num_cindexes = hypre_CTAlloc(HYPRE_Int, mgr_nlevels, HYPRE_MEMORY_HOST); for (i = 0; i < mgr_nlevels; i++) { /* assume 1 coarse index per level */ mgr_num_cindexes[i] = 1; } mgr_cindexes = hypre_CTAlloc(HYPRE_Int*, mgr_nlevels, HYPRE_MEMORY_HOST); for (i = 0; i < mgr_nlevels; i++) { mgr_cindexes[i] = hypre_CTAlloc(HYPRE_Int, mgr_num_cindexes[i], HYPRE_MEMORY_HOST); } for (i = 0; i < mgr_nlevels; i++) { /* assume coarse point is at index 0 */ mgr_cindexes[i][0] = 2; } mgr_reserved_coarse_indexes = hypre_CTAlloc(HYPRE_BigInt, mgr_num_reserved_nodes, HYPRE_MEMORY_HOST); for (i = 0; i < mgr_num_reserved_nodes; i++) { /* Generate 'artificial' reserved nodes. Assumes these are ordered last in the system */ mgr_reserved_coarse_indexes[i] = last_local_row - (HYPRE_BigInt) i; //2*i+1; // hypre_printf("mgr_reserved_coarse_indexes[i] = %b \n", mgr_reserved_coarse_indexes[i]); } /* set MGR data by block */ HYPRE_MGRSetCpointsByBlock( pcg_precond, mgr_bsize, mgr_nlevels, mgr_num_cindexes, mgr_cindexes); /* set reserved coarse nodes */ if (mgr_num_reserved_nodes) { HYPRE_MGRSetReservedCoarseNodes(pcg_precond, mgr_num_reserved_nodes, mgr_reserved_coarse_indexes); } /* set intermediate coarse grid strategy */ HYPRE_MGRSetNonCpointsToFpoints(pcg_precond, mgr_non_c_to_f); /* set F relaxation strategy */ HYPRE_MGRSetFRelaxMethod(pcg_precond, mgr_frelax_method); /* set relax type for single level F-relaxation and post-relaxation */ HYPRE_MGRSetRelaxType(pcg_precond, mgr_relax_type); HYPRE_MGRSetNumRelaxSweeps(pcg_precond, mgr_num_relax_sweeps); /* set interpolation type */ HYPRE_MGRSetRestrictType(pcg_precond, mgr_restrict_type); HYPRE_MGRSetNumRestrictSweeps(pcg_precond, mgr_num_restrict_sweeps); HYPRE_MGRSetInterpType(pcg_precond, mgr_interp_type); HYPRE_MGRSetNumInterpSweeps(pcg_precond, mgr_num_interp_sweeps); /* set print level */ HYPRE_MGRSetPrintLevel(pcg_precond, ioutdat); /* set max iterations */ HYPRE_MGRSetMaxIter(pcg_precond, 1); HYPRE_MGRSetTol(pcg_precond, pc_tol); /* set global smoother */ HYPRE_MGRSetGlobalSmoothType(pcg_precond, mgr_gsmooth_type); HYPRE_MGRSetMaxGlobalSmoothIters( pcg_precond, mgr_num_gsmooth_sweeps ); /* create AMG coarse grid solver */ HYPRE_BoomerAMGCreate(&amg_solver); if (hypre_GetExecPolicy1(memory_location) == HYPRE_EXEC_DEVICE) { HYPRE_BoomerAMGSetInterpType(amg_solver, 18); HYPRE_BoomerAMGSetCoarsenType(amg_solver, 8); HYPRE_BoomerAMGSetRelaxType(amg_solver, 3); } else { HYPRE_BoomerAMGSetInterpType(amg_solver, 0); HYPRE_BoomerAMGSetCoarsenType(amg_solver, 6); HYPRE_BoomerAMGSetCycleType(amg_solver, 1); HYPRE_BoomerAMGSetCycleRelaxType(amg_solver, 14, 1); HYPRE_BoomerAMGSetCycleRelaxType(amg_solver, 14, 2); HYPRE_BoomerAMGSetCycleRelaxType(amg_solver, 9, 3); } HYPRE_BoomerAMGSetTol(amg_solver, pc_tol); HYPRE_BoomerAMGSetPMaxElmts(amg_solver, 0); HYPRE_BoomerAMGSetNumSweeps(amg_solver, 1); HYPRE_BoomerAMGSetRelaxOrder(amg_solver, 1); HYPRE_BoomerAMGSetMaxLevels(amg_solver, max_levels); HYPRE_BoomerAMGSetMaxIter(amg_solver, precon_cycles); HYPRE_BoomerAMGSetPrintLevel(amg_solver, 1); /* set the MGR coarse solver. Comment out to use default CG solver in MGR */ HYPRE_MGRSetCoarseSolver( pcg_precond, HYPRE_BoomerAMGSolve, HYPRE_BoomerAMGSetup, amg_solver); /* setup MGR-BiCGSTAB solver */ HYPRE_BiCGSTABSetMaxIter(pcg_solver, mg_max_iter); HYPRE_BiCGSTABSetPrecond(pcg_solver, (HYPRE_PtrToSolverFcn) HYPRE_MGRSolve, (HYPRE_PtrToSolverFcn) HYPRE_MGRSetup, pcg_precond); } HYPRE_BiCGSTABSetup(pcg_solver, (HYPRE_Matrix) parcsr_M, (HYPRE_Vector) b, (HYPRE_Vector) x); hypre_EndTiming(time_index); hypre_PrintTiming("Setup phase times", hypre_MPI_COMM_WORLD); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); time_index = hypre_InitializeTiming("BiCGSTAB Solve"); hypre_BeginTiming(time_index); HYPRE_BiCGSTABSolve(pcg_solver, (HYPRE_Matrix)parcsr_A, (HYPRE_Vector)b, (HYPRE_Vector)x); hypre_EndTiming(time_index); hypre_PrintTiming("Solve phase times", hypre_MPI_COMM_WORLD); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); HYPRE_ANNOTATE_REGION_END("%s", "Run-1"); if (second_time) { /* run a second time [for timings, to check for memory leaks] */ HYPRE_ANNOTATE_REGION_BEGIN("%s", "Run-2"); HYPRE_ParVectorSetRandomValues(x, 775); #if defined(HYPRE_USING_CURAND) || defined(HYPRE_USING_ROCRAND) hypre_ResetDeviceRandGenerator(1234ULL, 0ULL); #endif hypre_ParVectorCopy(x0_save, x); HYPRE_BiCGSTABSetup(pcg_solver, (HYPRE_Matrix) parcsr_M, (HYPRE_Vector) b, (HYPRE_Vector) x); HYPRE_BiCGSTABSolve(pcg_solver, (HYPRE_Matrix) parcsr_A, (HYPRE_Vector) b, (HYPRE_Vector) x); HYPRE_ANNOTATE_REGION_END("%s", "Run-2"); } HYPRE_BiCGSTABGetNumIterations(pcg_solver, &num_iterations); HYPRE_BiCGSTABGetFinalRelativeResidualNorm(pcg_solver, &final_res_norm); HYPRE_ParCSRBiCGSTABDestroy(pcg_solver); if (solver_id == 9) { HYPRE_BoomerAMGDestroy(pcg_precond); } if (solver_id == 11) { HYPRE_ParCSRPilutDestroy(pcg_precond); } else if (solver_id == 45) { HYPRE_EuclidDestroy(pcg_precond); } else if (solver_id == 73) { /* free memory */ if (mgr_num_cindexes) { hypre_TFree(mgr_num_cindexes, HYPRE_MEMORY_HOST); } mgr_num_cindexes = NULL; if (mgr_reserved_coarse_indexes) { hypre_TFree(mgr_reserved_coarse_indexes, HYPRE_MEMORY_HOST); } mgr_reserved_coarse_indexes = NULL; if (mgr_cindexes) { for ( i = 0; i < mgr_nlevels; i++) { if (mgr_cindexes[i]) { hypre_TFree(mgr_cindexes[i], HYPRE_MEMORY_HOST); } } hypre_TFree(mgr_cindexes, HYPRE_MEMORY_HOST); mgr_cindexes = NULL; } HYPRE_BoomerAMGDestroy(amg_solver); HYPRE_MGRDestroy(pcg_precond); } if (myid == 0) { hypre_printf("\n"); hypre_printf("BiCGSTAB Iterations = %d\n", num_iterations); hypre_printf("Final BiCGSTAB Relative Residual Norm = %e\n", final_res_norm); hypre_printf("\n"); } } /*----------------------------------------------------------- * Solve the system using COGMRES *-----------------------------------------------------------*/ if (solver_id == 16 || solver_id == 17 || solver_id == 46 || solver_id == 74) { HYPRE_ANNOTATE_REGION_BEGIN("%s", "Run-1"); time_index = hypre_InitializeTiming("COGMRES Setup"); hypre_BeginTiming(time_index); HYPRE_ParCSRCOGMRESCreate(hypre_MPI_COMM_WORLD, &pcg_solver); HYPRE_COGMRESSetKDim(pcg_solver, k_dim); HYPRE_COGMRESSetUnroll(pcg_solver, unroll); HYPRE_COGMRESSetCGS(pcg_solver, cgs); HYPRE_COGMRESSetMaxIter(pcg_solver, max_iter); HYPRE_COGMRESSetTol(pcg_solver, tol); HYPRE_COGMRESSetAbsoluteTol(pcg_solver, atol); HYPRE_COGMRESSetLogging(pcg_solver, ioutdat); HYPRE_COGMRESSetPrintLevel(pcg_solver, ioutdat); if (solver_id == 16) { /* use BoomerAMG as preconditioner */ if (myid == 0) { hypre_printf("Solver: AMG-COGMRES\n"); } HYPRE_BoomerAMGCreate(&pcg_precond); HYPRE_BoomerAMGSetCGCIts(pcg_precond, cgcits); HYPRE_BoomerAMGSetInterpType(pcg_precond, interp_type); HYPRE_BoomerAMGSetPostInterpType(pcg_precond, post_interp_type); HYPRE_BoomerAMGSetNumSamples(pcg_precond, gsmg_samples); HYPRE_BoomerAMGSetTol(pcg_precond, pc_tol); HYPRE_BoomerAMGSetCoarsenType(pcg_precond, coarsen_type); HYPRE_BoomerAMGSetCoarsenCutFactor(pcg_precond, coarsen_cut_factor); HYPRE_BoomerAMGSetCPoints(pcg_precond, max_levels, num_cpt, cpt_index); HYPRE_BoomerAMGSetFPoints(pcg_precond, num_fpt, fpt_index); HYPRE_BoomerAMGSetIsolatedFPoints(pcg_precond, num_isolated_fpt, isolated_fpt_index); HYPRE_BoomerAMGSetMeasureType(pcg_precond, measure_type); HYPRE_BoomerAMGSetStrongThreshold(pcg_precond, strong_threshold); HYPRE_BoomerAMGSetSeqThreshold(pcg_precond, seq_threshold); HYPRE_BoomerAMGSetRedundant(pcg_precond, redundant); HYPRE_BoomerAMGSetMaxCoarseSize(pcg_precond, coarse_threshold); HYPRE_BoomerAMGSetMinCoarseSize(pcg_precond, min_coarse_size); HYPRE_BoomerAMGSetTruncFactor(pcg_precond, trunc_factor); HYPRE_BoomerAMGSetPMaxElmts(pcg_precond, P_max_elmts); HYPRE_BoomerAMGSetJacobiTruncThreshold(pcg_precond, jacobi_trunc_threshold); HYPRE_BoomerAMGSetSCommPkgSwitch(pcg_precond, S_commpkg_switch); HYPRE_BoomerAMGSetPrintLevel(pcg_precond, poutdat); HYPRE_BoomerAMGSetPrintFileName(pcg_precond, "driver.out.log"); HYPRE_BoomerAMGSetMaxIter(pcg_precond, precon_cycles); HYPRE_BoomerAMGSetCycleType(pcg_precond, cycle_type); HYPRE_BoomerAMGSetFCycle(pcg_precond, fcycle); HYPRE_BoomerAMGSetNumSweeps(pcg_precond, num_sweeps); HYPRE_BoomerAMGSetISType(pcg_precond, IS_type); HYPRE_BoomerAMGSetNumCRRelaxSteps(pcg_precond, num_CR_relax_steps); HYPRE_BoomerAMGSetCRRate(pcg_precond, CR_rate); HYPRE_BoomerAMGSetCRStrongTh(pcg_precond, CR_strong_th); HYPRE_BoomerAMGSetCRUseCG(pcg_precond, CR_use_CG); if (relax_type > -1) { HYPRE_BoomerAMGSetRelaxType(pcg_precond, relax_type); } if (relax_down > -1) { HYPRE_BoomerAMGSetCycleRelaxType(pcg_precond, relax_down, 1); } if (relax_up > -1) { HYPRE_BoomerAMGSetCycleRelaxType(pcg_precond, relax_up, 2); } if (relax_coarse > -1) { HYPRE_BoomerAMGSetCycleRelaxType(pcg_precond, relax_coarse, 3); } HYPRE_BoomerAMGSetAddRelaxType(pcg_precond, add_relax_type); HYPRE_BoomerAMGSetAddRelaxWt(pcg_precond, add_relax_wt); HYPRE_BoomerAMGSetChebyOrder(pcg_precond, cheby_order); HYPRE_BoomerAMGSetChebyFraction(pcg_precond, cheby_fraction); HYPRE_BoomerAMGSetChebyEigEst(pcg_precond, cheby_eig_est); HYPRE_BoomerAMGSetChebyVariant(pcg_precond, cheby_variant); HYPRE_BoomerAMGSetChebyScale(pcg_precond, cheby_scale); HYPRE_BoomerAMGSetRelaxOrder(pcg_precond, relax_order); HYPRE_BoomerAMGSetRelaxWt(pcg_precond, relax_wt); HYPRE_BoomerAMGSetOuterWt(pcg_precond, outer_wt); if (level_w > -1) { HYPRE_BoomerAMGSetLevelRelaxWt(pcg_precond, relax_wt_level, level_w); } if (level_ow > -1) { HYPRE_BoomerAMGSetLevelOuterWt(pcg_precond, outer_wt_level, level_ow); } HYPRE_BoomerAMGSetSmoothType(pcg_precond, smooth_type); HYPRE_BoomerAMGSetSmoothNumLevels(pcg_precond, smooth_num_levels); HYPRE_BoomerAMGSetSmoothNumSweeps(pcg_precond, smooth_num_sweeps); HYPRE_BoomerAMGSetMaxLevels(pcg_precond, max_levels); HYPRE_BoomerAMGSetMaxRowSum(pcg_precond, max_row_sum); HYPRE_BoomerAMGSetDebugFlag(pcg_precond, debug_flag); HYPRE_BoomerAMGSetFilterFunctions(pcg_precond, filter_functions); HYPRE_BoomerAMGSetNumFunctions(pcg_precond, num_functions); HYPRE_BoomerAMGSetAggNumLevels(pcg_precond, agg_num_levels); HYPRE_BoomerAMGSetAggInterpType(pcg_precond, agg_interp_type); HYPRE_BoomerAMGSetAggTruncFactor(pcg_precond, agg_trunc_factor); HYPRE_BoomerAMGSetAggP12TruncFactor(pcg_precond, agg_P12_trunc_factor); HYPRE_BoomerAMGSetAggPMaxElmts(pcg_precond, agg_P_max_elmts); HYPRE_BoomerAMGSetAggP12MaxElmts(pcg_precond, agg_P12_max_elmts); HYPRE_BoomerAMGSetNumPaths(pcg_precond, num_paths); HYPRE_BoomerAMGSetNodal(pcg_precond, nodal); HYPRE_BoomerAMGSetNodalDiag(pcg_precond, nodal_diag); HYPRE_BoomerAMGSetVariant(pcg_precond, variant); HYPRE_BoomerAMGSetOverlap(pcg_precond, overlap); HYPRE_BoomerAMGSetDomainType(pcg_precond, domain_type); HYPRE_BoomerAMGSetSchwarzUseNonSymm(pcg_precond, use_nonsymm_schwarz); HYPRE_BoomerAMGSetSchwarzRlxWeight(pcg_precond, schwarz_rlx_weight); if (eu_level < 0) { eu_level = 0; } HYPRE_BoomerAMGSetEuLevel(pcg_precond, eu_level); HYPRE_BoomerAMGSetEuBJ(pcg_precond, eu_bj); HYPRE_BoomerAMGSetEuSparseA(pcg_precond, eu_sparse_A); HYPRE_BoomerAMGSetILUType(pcg_precond, ilu_type); HYPRE_BoomerAMGSetILULevel(pcg_precond, ilu_lfil); HYPRE_BoomerAMGSetILUDroptol(pcg_precond, ilu_droptol); HYPRE_BoomerAMGSetILUMaxRowNnz(pcg_precond, ilu_max_row_nnz); HYPRE_BoomerAMGSetILUMaxIter(pcg_precond, ilu_sm_max_iter); HYPRE_BoomerAMGSetILUTriSolve(pcg_precond, ilu_tri_solve); HYPRE_BoomerAMGSetILULowerJacobiIters(pcg_precond, ilu_ljac_iters); HYPRE_BoomerAMGSetILUUpperJacobiIters(pcg_precond, ilu_ujac_iters); HYPRE_BoomerAMGSetILULocalReordering(pcg_precond, ilu_reordering); HYPRE_BoomerAMGSetILUIterSetupType(pcg_precond, ilu_iter_setup_type); HYPRE_BoomerAMGSetILUIterSetupOption(pcg_precond, ilu_iter_setup_option); HYPRE_BoomerAMGSetILUIterSetupMaxIter(pcg_precond, ilu_iter_setup_max_iter); HYPRE_BoomerAMGSetILUIterSetupTolerance(pcg_precond, ilu_iter_setup_tolerance); HYPRE_BoomerAMGSetFSAIAlgoType(pcg_precond, fsai_algo_type); HYPRE_BoomerAMGSetFSAILocalSolveType(pcg_precond, fsai_ls_type); HYPRE_BoomerAMGSetFSAIMaxSteps(pcg_precond, fsai_max_steps); HYPRE_BoomerAMGSetFSAIMaxStepSize(pcg_precond, fsai_max_step_size); HYPRE_BoomerAMGSetFSAIMaxNnzRow(pcg_precond, fsai_max_nnz_row); HYPRE_BoomerAMGSetFSAINumLevels(pcg_precond, fsai_num_levels); HYPRE_BoomerAMGSetFSAIThreshold(pcg_precond, fsai_threshold); HYPRE_BoomerAMGSetFSAIEigMaxIters(pcg_precond, fsai_eig_max_iters); HYPRE_BoomerAMGSetFSAIKapTolerance(pcg_precond, fsai_kap_tolerance); HYPRE_BoomerAMGSetCycleNumSweeps(pcg_precond, ns_coarse, 3); if (num_functions > 1) { HYPRE_BoomerAMGSetDofFunc(pcg_precond, dof_func); } HYPRE_BoomerAMGSetAdditive(pcg_precond, additive); HYPRE_BoomerAMGSetMultAdditive(pcg_precond, mult_add); HYPRE_BoomerAMGSetSimple(pcg_precond, simple); HYPRE_BoomerAMGSetAddLastLvl(pcg_precond, add_last_lvl); HYPRE_BoomerAMGSetMultAddPMaxElmts(pcg_precond, add_P_max_elmts); HYPRE_BoomerAMGSetMultAddTruncFactor(pcg_precond, add_trunc_factor); HYPRE_BoomerAMGSetRAP2(pcg_precond, rap2); HYPRE_BoomerAMGSetModuleRAP2(pcg_precond, mod_rap2); HYPRE_BoomerAMGSetKeepTranspose(pcg_precond, keepTranspose); #ifdef HYPRE_USING_DSUPERLU HYPRE_BoomerAMGSetDSLUThreshold(pcg_precond, dslu_threshold); #endif if (nongalerk_tol) { HYPRE_BoomerAMGSetNonGalerkinTol(pcg_precond, nongalerk_tol[nongalerk_num_tol - 1]); for (i = 0; i < nongalerk_num_tol - 1; i++) { HYPRE_BoomerAMGSetLevelNonGalerkinTol(pcg_precond, nongalerk_tol[i], i); } } HYPRE_COGMRESSetMaxIter(pcg_solver, mg_max_iter); HYPRE_COGMRESSetPrecond(pcg_solver, (HYPRE_PtrToSolverFcn) HYPRE_BoomerAMGSolve, (HYPRE_PtrToSolverFcn) HYPRE_BoomerAMGSetup, pcg_precond); } else if (solver_id == 17) { /* use diagonal scaling as preconditioner */ if (myid == 0) { hypre_printf("Solver: DS-COGMRES\n"); } pcg_precond = NULL; HYPRE_COGMRESSetPrecond(pcg_solver, (HYPRE_PtrToSolverFcn) HYPRE_ParCSRDiagScale, (HYPRE_PtrToSolverFcn) HYPRE_ParCSRDiagScaleSetup, pcg_precond); } else if (solver_id == 46) { /* use Euclid preconditioning */ if (myid == 0) { hypre_printf("Solver: Euclid-BICGSTAB\n"); } HYPRE_EuclidCreate(hypre_MPI_COMM_WORLD, &pcg_precond); /* note: There are three three methods of setting run-time parameters for Euclid: (see HYPRE_parcsr_ls.h); here we'll use what I think is simplest: let Euclid internally parse the command line. */ if (eu_level > -1) { HYPRE_EuclidSetLevel(pcg_precond, eu_level); } if (eu_ilut) { HYPRE_EuclidSetILUT(pcg_precond, eu_ilut); } if (eu_sparse_A) { HYPRE_EuclidSetSparseA(pcg_precond, eu_sparse_A); } if (eu_row_scale) { HYPRE_EuclidSetRowScale(pcg_precond, eu_row_scale); } if (eu_bj) { HYPRE_EuclidSetBJ(pcg_precond, eu_bj); } HYPRE_EuclidSetStats(pcg_precond, eu_stats); HYPRE_EuclidSetMem(pcg_precond, eu_mem); /*HYPRE_EuclidSetParams(pcg_precond, argc, argv);*/ HYPRE_COGMRESSetPrecond(pcg_solver, (HYPRE_PtrToSolverFcn) HYPRE_EuclidSolve, (HYPRE_PtrToSolverFcn) HYPRE_EuclidSetup, pcg_precond); } else if (solver_id == 74) { /* use MGR preconditioning */ if (myid == 0) { hypre_printf("Solver: MGR-BICGSTAB\n"); } HYPRE_MGRCreate(&pcg_precond); mgr_num_cindexes = hypre_CTAlloc(HYPRE_Int, mgr_nlevels, HYPRE_MEMORY_HOST); for (i = 0; i < mgr_nlevels; i++) { /* assume 1 coarse index per level */ mgr_num_cindexes[i] = 1; } mgr_cindexes = hypre_CTAlloc(HYPRE_Int*, mgr_nlevels, HYPRE_MEMORY_HOST); for (i = 0; i < mgr_nlevels; i++) { mgr_cindexes[i] = hypre_CTAlloc(HYPRE_Int, mgr_num_cindexes[i], HYPRE_MEMORY_HOST); } for (i = 0; i < mgr_nlevels; i++) { /* assume coarse point is at index 0 */ mgr_cindexes[i][0] = 2; } mgr_reserved_coarse_indexes = hypre_CTAlloc(HYPRE_BigInt, mgr_num_reserved_nodes, HYPRE_MEMORY_HOST); for (i = 0; i < mgr_num_reserved_nodes; i++) { /* Generate 'artificial' reserved nodes. Assumes these are ordered last in the system */ mgr_reserved_coarse_indexes[i] = last_local_row - (HYPRE_BigInt) i; //2*i+1; // hypre_printf("mgr_reserved_coarse_indexes[i] = %b \n", mgr_reserved_coarse_indexes[i]); } /* set MGR data by block */ HYPRE_MGRSetCpointsByBlock( pcg_precond, mgr_bsize, mgr_nlevels, mgr_num_cindexes, mgr_cindexes); /* set reserved coarse nodes */ if (mgr_num_reserved_nodes) { HYPRE_MGRSetReservedCoarseNodes(pcg_precond, mgr_num_reserved_nodes, mgr_reserved_coarse_indexes); } /* set intermediate coarse grid strategy */ HYPRE_MGRSetNonCpointsToFpoints(pcg_precond, mgr_non_c_to_f); /* set F relaxation strategy */ HYPRE_MGRSetFRelaxMethod(pcg_precond, mgr_frelax_method); /* set relax type for single level F-relaxation and post-relaxation */ HYPRE_MGRSetRelaxType(pcg_precond, mgr_relax_type); HYPRE_MGRSetNumRelaxSweeps(pcg_precond, mgr_num_relax_sweeps); /* set interpolation type */ HYPRE_MGRSetRestrictType(pcg_precond, mgr_restrict_type); HYPRE_MGRSetNumRestrictSweeps(pcg_precond, mgr_num_restrict_sweeps); HYPRE_MGRSetInterpType(pcg_precond, mgr_interp_type); HYPRE_MGRSetNumInterpSweeps(pcg_precond, mgr_num_interp_sweeps); /* set print level */ HYPRE_MGRSetPrintLevel(pcg_precond, ioutdat); /* set max iterations */ HYPRE_MGRSetMaxIter(pcg_precond, 1); HYPRE_MGRSetTol(pcg_precond, pc_tol); /* set global smoother */ HYPRE_MGRSetGlobalSmoothType(pcg_precond, mgr_gsmooth_type); HYPRE_MGRSetMaxGlobalSmoothIters( pcg_precond, mgr_num_gsmooth_sweeps ); /* create AMG coarse grid solver */ HYPRE_BoomerAMGCreate(&amg_solver); HYPRE_BoomerAMGSetTol(amg_solver, pc_tol); HYPRE_BoomerAMGSetPrintLevel(amg_solver, 1); HYPRE_BoomerAMGSetMaxIter(amg_solver, precon_cycles); HYPRE_BoomerAMGSetCycleType(amg_solver, 1); HYPRE_BoomerAMGSetNumSweeps(amg_solver, 1); HYPRE_BoomerAMGSetCycleRelaxType(amg_solver, 14, 1); HYPRE_BoomerAMGSetCycleRelaxType(amg_solver, 14, 2); HYPRE_BoomerAMGSetCycleRelaxType(amg_solver, 9, 3); /* set the MGR coarse solver. Comment out to use default CG solver in MGR */ HYPRE_MGRSetCoarseSolver( pcg_precond, HYPRE_BoomerAMGSolve, HYPRE_BoomerAMGSetup, amg_solver); /* setup MGR-COGMRES solver */ HYPRE_COGMRESSetMaxIter(pcg_solver, mg_max_iter); HYPRE_COGMRESSetPrecond(pcg_solver, (HYPRE_PtrToSolverFcn) HYPRE_MGRSolve, (HYPRE_PtrToSolverFcn) HYPRE_MGRSetup, pcg_precond); } HYPRE_COGMRESSetup(pcg_solver, (HYPRE_Matrix) parcsr_M, (HYPRE_Vector) b, (HYPRE_Vector) x); hypre_EndTiming(time_index); hypre_PrintTiming("Setup phase times", hypre_MPI_COMM_WORLD); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); time_index = hypre_InitializeTiming("COGMRES Solve"); hypre_BeginTiming(time_index); HYPRE_COGMRESSolve(pcg_solver, (HYPRE_Matrix)parcsr_A, (HYPRE_Vector)b, (HYPRE_Vector)x); hypre_EndTiming(time_index); hypre_PrintTiming("Solve phase times", hypre_MPI_COMM_WORLD); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); HYPRE_ANNOTATE_REGION_END("%s", "Run-1"); if (second_time) { /* run a second time [for timings, to check for memory leaks] */ HYPRE_ANNOTATE_REGION_BEGIN("%s", "Run-2"); HYPRE_ParVectorSetRandomValues(x, 775); #if defined(HYPRE_USING_CURAND) || defined(HYPRE_USING_ROCRAND) hypre_ResetDeviceRandGenerator(1234ULL, 0ULL); #endif hypre_ParVectorCopy(x0_save, x); HYPRE_COGMRESSetup(pcg_solver, (HYPRE_Matrix) parcsr_M, (HYPRE_Vector) b, (HYPRE_Vector) x); HYPRE_COGMRESSolve(pcg_solver, (HYPRE_Matrix) parcsr_A, (HYPRE_Vector) b, (HYPRE_Vector) x); HYPRE_ANNOTATE_REGION_END("%s", "Run-2"); } HYPRE_COGMRESGetNumIterations(pcg_solver, &num_iterations); HYPRE_COGMRESGetFinalRelativeResidualNorm(pcg_solver, &final_res_norm); HYPRE_ParCSRCOGMRESDestroy(pcg_solver); if (solver_id == 16) { HYPRE_BoomerAMGDestroy(pcg_precond); } else if (solver_id == 46) { HYPRE_EuclidDestroy(pcg_precond); } else if (solver_id == 74) { /* free memory */ if (mgr_num_cindexes) { hypre_TFree(mgr_num_cindexes, HYPRE_MEMORY_HOST); } mgr_num_cindexes = NULL; if (mgr_reserved_coarse_indexes) { hypre_TFree(mgr_reserved_coarse_indexes, HYPRE_MEMORY_HOST); } mgr_reserved_coarse_indexes = NULL; if (mgr_cindexes) { for ( i = 0; i < mgr_nlevels; i++) { if (mgr_cindexes[i]) { hypre_TFree(mgr_cindexes[i], HYPRE_MEMORY_HOST); } } hypre_TFree(mgr_cindexes, HYPRE_MEMORY_HOST); mgr_cindexes = NULL; } HYPRE_BoomerAMGDestroy(amg_solver); HYPRE_MGRDestroy(pcg_precond); } if (myid == 0) { hypre_printf("\n"); hypre_printf("COGMRES Iterations = %d\n", num_iterations); hypre_printf("Final COGMRES Relative Residual Norm = %e\n", final_res_norm); hypre_printf("\n"); } } /*----------------------------------------------------------- * Solve the system using CGNR *-----------------------------------------------------------*/ if (solver_id == 5 || solver_id == 6) { HYPRE_ANNOTATE_REGION_BEGIN("%s", "Run-1"); time_index = hypre_InitializeTiming("CGNR Setup"); hypre_BeginTiming(time_index); HYPRE_ParCSRCGNRCreate(hypre_MPI_COMM_WORLD, &pcg_solver); HYPRE_CGNRSetMaxIter(pcg_solver, max_iter); HYPRE_CGNRSetTol(pcg_solver, tol); HYPRE_CGNRSetLogging(pcg_solver, ioutdat); if (solver_id == 5) { /* use BoomerAMG as preconditioner */ if (myid == 0) { hypre_printf("Solver: AMG-CGNR\n"); } HYPRE_BoomerAMGCreate(&pcg_precond); HYPRE_BoomerAMGSetCGCIts(pcg_precond, cgcits); HYPRE_BoomerAMGSetInterpType(pcg_precond, interp_type); HYPRE_BoomerAMGSetPostInterpType(pcg_precond, post_interp_type); HYPRE_BoomerAMGSetNumSamples(pcg_precond, gsmg_samples); HYPRE_BoomerAMGSetTol(pcg_precond, pc_tol); HYPRE_BoomerAMGSetCoarsenType(pcg_precond, coarsen_type); HYPRE_BoomerAMGSetCoarsenCutFactor(pcg_precond, coarsen_cut_factor); HYPRE_BoomerAMGSetCPoints(pcg_precond, max_levels, num_cpt, cpt_index); HYPRE_BoomerAMGSetFPoints(pcg_precond, num_fpt, fpt_index); HYPRE_BoomerAMGSetIsolatedFPoints(pcg_precond, num_isolated_fpt, isolated_fpt_index); HYPRE_BoomerAMGSetMeasureType(pcg_precond, measure_type); HYPRE_BoomerAMGSetStrongThreshold(pcg_precond, strong_threshold); HYPRE_BoomerAMGSetSeqThreshold(pcg_precond, seq_threshold); HYPRE_BoomerAMGSetRedundant(pcg_precond, redundant); HYPRE_BoomerAMGSetMaxCoarseSize(pcg_precond, coarse_threshold); HYPRE_BoomerAMGSetMinCoarseSize(pcg_precond, min_coarse_size); HYPRE_BoomerAMGSetTruncFactor(pcg_precond, trunc_factor); HYPRE_BoomerAMGSetPMaxElmts(pcg_precond, P_max_elmts); HYPRE_BoomerAMGSetJacobiTruncThreshold(pcg_precond, jacobi_trunc_threshold); HYPRE_BoomerAMGSetSCommPkgSwitch(pcg_precond, S_commpkg_switch); HYPRE_BoomerAMGSetPrintLevel(pcg_precond, poutdat); HYPRE_BoomerAMGSetPrintFileName(pcg_precond, "driver.out.log"); HYPRE_BoomerAMGSetMaxIter(pcg_precond, precon_cycles); HYPRE_BoomerAMGSetCycleType(pcg_precond, cycle_type); HYPRE_BoomerAMGSetFCycle(pcg_precond, fcycle); HYPRE_BoomerAMGSetNumSweeps(pcg_precond, num_sweeps); if (relax_type > -1) { HYPRE_BoomerAMGSetRelaxType(pcg_precond, relax_type); } if (relax_down > -1) { HYPRE_BoomerAMGSetCycleRelaxType(pcg_precond, relax_down, 1); } if (relax_up > -1) { HYPRE_BoomerAMGSetCycleRelaxType(pcg_precond, relax_up, 2); } if (relax_coarse > -1) { HYPRE_BoomerAMGSetCycleRelaxType(pcg_precond, relax_coarse, 3); } HYPRE_BoomerAMGSetAddRelaxType(pcg_precond, add_relax_type); HYPRE_BoomerAMGSetAddRelaxWt(pcg_precond, add_relax_wt); HYPRE_BoomerAMGSetChebyOrder(pcg_precond, cheby_order); HYPRE_BoomerAMGSetChebyFraction(pcg_precond, cheby_fraction); HYPRE_BoomerAMGSetChebyEigEst(pcg_precond, cheby_eig_est); HYPRE_BoomerAMGSetChebyVariant(pcg_precond, cheby_variant); HYPRE_BoomerAMGSetChebyScale(pcg_precond, cheby_scale); HYPRE_BoomerAMGSetRelaxOrder(pcg_precond, relax_order); HYPRE_BoomerAMGSetRelaxWt(pcg_precond, relax_wt); HYPRE_BoomerAMGSetOuterWt(pcg_precond, outer_wt); if (level_w > -1) { HYPRE_BoomerAMGSetLevelRelaxWt(pcg_precond, relax_wt_level, level_w); } if (level_ow > -1) { HYPRE_BoomerAMGSetLevelOuterWt(pcg_precond, outer_wt_level, level_ow); } HYPRE_BoomerAMGSetSmoothType(pcg_precond, smooth_type); HYPRE_BoomerAMGSetSmoothNumLevels(pcg_precond, smooth_num_levels); HYPRE_BoomerAMGSetSmoothNumSweeps(pcg_precond, smooth_num_sweeps); HYPRE_BoomerAMGSetMaxLevels(pcg_precond, max_levels); HYPRE_BoomerAMGSetMaxRowSum(pcg_precond, max_row_sum); HYPRE_BoomerAMGSetDebugFlag(pcg_precond, debug_flag); HYPRE_BoomerAMGSetFilterFunctions(pcg_precond, filter_functions); HYPRE_BoomerAMGSetNumFunctions(pcg_precond, num_functions); HYPRE_BoomerAMGSetAggNumLevels(pcg_precond, agg_num_levels); HYPRE_BoomerAMGSetAggInterpType(pcg_precond, agg_interp_type); HYPRE_BoomerAMGSetAggTruncFactor(pcg_precond, agg_trunc_factor); HYPRE_BoomerAMGSetAggP12TruncFactor(pcg_precond, agg_P12_trunc_factor); HYPRE_BoomerAMGSetAggPMaxElmts(pcg_precond, agg_P_max_elmts); HYPRE_BoomerAMGSetAggP12MaxElmts(pcg_precond, agg_P12_max_elmts); HYPRE_BoomerAMGSetNumPaths(pcg_precond, num_paths); HYPRE_BoomerAMGSetNodal(pcg_precond, nodal); HYPRE_BoomerAMGSetNodalDiag(pcg_precond, nodal_diag); HYPRE_BoomerAMGSetVariant(pcg_precond, variant); HYPRE_BoomerAMGSetOverlap(pcg_precond, overlap); HYPRE_BoomerAMGSetDomainType(pcg_precond, domain_type); if (num_functions > 1) { HYPRE_BoomerAMGSetDofFunc(pcg_precond, dof_func); } HYPRE_BoomerAMGSetAdditive(pcg_precond, additive); HYPRE_BoomerAMGSetMultAdditive(pcg_precond, mult_add); HYPRE_BoomerAMGSetSimple(pcg_precond, simple); HYPRE_BoomerAMGSetAddLastLvl(pcg_precond, add_last_lvl); HYPRE_BoomerAMGSetMultAddPMaxElmts(pcg_precond, add_P_max_elmts); HYPRE_BoomerAMGSetMultAddTruncFactor(pcg_precond, add_trunc_factor); HYPRE_BoomerAMGSetRAP2(pcg_precond, rap2); HYPRE_BoomerAMGSetModuleRAP2(pcg_precond, mod_rap2); HYPRE_BoomerAMGSetKeepTranspose(pcg_precond, keepTranspose); #ifdef HYPRE_USING_DSUPERLU HYPRE_BoomerAMGSetDSLUThreshold(pcg_precond, dslu_threshold); #endif if (nongalerk_tol) { HYPRE_BoomerAMGSetNonGalerkinTol(pcg_precond, nongalerk_tol[nongalerk_num_tol - 1]); for (i = 0; i < nongalerk_num_tol - 1; i++) { HYPRE_BoomerAMGSetLevelNonGalerkinTol(pcg_precond, nongalerk_tol[i], i); } } HYPRE_CGNRSetMaxIter(pcg_solver, mg_max_iter); HYPRE_CGNRSetPrecond(pcg_solver, (HYPRE_PtrToSolverFcn) HYPRE_BoomerAMGSolve, (HYPRE_PtrToSolverFcn) HYPRE_BoomerAMGSolveT, (HYPRE_PtrToSolverFcn) HYPRE_BoomerAMGSetup, pcg_precond); } else if (solver_id == 6) { /* use diagonal scaling as preconditioner */ if (myid == 0) { hypre_printf("Solver: DS-CGNR\n"); } pcg_precond = NULL; HYPRE_CGNRSetPrecond(pcg_solver, (HYPRE_PtrToSolverFcn) HYPRE_ParCSRDiagScale, (HYPRE_PtrToSolverFcn) HYPRE_ParCSRDiagScale, (HYPRE_PtrToSolverFcn) HYPRE_ParCSRDiagScaleSetup, pcg_precond); } HYPRE_CGNRGetPrecond(pcg_solver, &pcg_precond_gotten); if (pcg_precond_gotten != pcg_precond) { hypre_printf("HYPRE_ParCSRCGNRGetPrecond got bad precond\n"); return (-1); } else if (myid == 0) { hypre_printf("HYPRE_ParCSRCGNRGetPrecond got good precond\n"); } HYPRE_CGNRSetup(pcg_solver, (HYPRE_Matrix) parcsr_M, (HYPRE_Vector) b, (HYPRE_Vector) x); hypre_EndTiming(time_index); hypre_PrintTiming("Setup phase times", hypre_MPI_COMM_WORLD); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); time_index = hypre_InitializeTiming("CGNR Solve"); hypre_BeginTiming(time_index); HYPRE_CGNRSolve(pcg_solver, (HYPRE_Matrix)parcsr_A, (HYPRE_Vector)b, (HYPRE_Vector)x); hypre_EndTiming(time_index); hypre_PrintTiming("Solve phase times", hypre_MPI_COMM_WORLD); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); HYPRE_ANNOTATE_REGION_END("%s", "Run-1"); if (second_time) { /* run a second time [for timings, to check for memory leaks] */ HYPRE_ANNOTATE_REGION_BEGIN("%s", "Run-2"); HYPRE_ParVectorSetRandomValues(x, 775); #if defined(HYPRE_USING_CURAND) || defined(HYPRE_USING_ROCRAND) hypre_ResetDeviceRandGenerator(1234ULL, 0ULL); #endif hypre_ParVectorCopy(x0_save, x); HYPRE_CGNRSetup(pcg_solver, (HYPRE_Matrix) parcsr_M, (HYPRE_Vector) b, (HYPRE_Vector) x); HYPRE_CGNRSolve(pcg_solver, (HYPRE_Matrix) parcsr_A, (HYPRE_Vector) b, (HYPRE_Vector) x); HYPRE_ANNOTATE_REGION_END("%s", "Run-2"); } HYPRE_CGNRGetNumIterations(pcg_solver, &num_iterations); HYPRE_CGNRGetFinalRelativeResidualNorm(pcg_solver, &final_res_norm); HYPRE_ParCSRCGNRDestroy(pcg_solver); if (solver_id == 5) { HYPRE_BoomerAMGDestroy(pcg_precond); } if (myid == 0 /* begin lobpcg */ && !lobpcgFlag /* end lobpcg */) { hypre_printf("\n"); hypre_printf("Iterations = %d\n", num_iterations); hypre_printf("Final Relative Residual Norm = %e\n", final_res_norm); hypre_printf("\n"); } } /*----------------------------------------------------------- * Solve the system using MGR *-----------------------------------------------------------*/ if (solver_id == 70) { if (myid == 0) { hypre_printf("Solver: MGR\n"); } time_index = hypre_InitializeTiming("MGR Setup"); hypre_BeginTiming(time_index); HYPRE_Solver mgr_solver; HYPRE_MGRCreate(&mgr_solver); mgr_num_cindexes = hypre_CTAlloc(HYPRE_Int, mgr_nlevels, HYPRE_MEMORY_HOST); for (i = 0; i < mgr_nlevels; i++) { /* assume 1 coarse index per level */ mgr_num_cindexes[i] = 1; } mgr_cindexes = hypre_CTAlloc(HYPRE_Int*, mgr_nlevels, HYPRE_MEMORY_HOST); for (i = 0; i < mgr_nlevels; i++) { mgr_cindexes[i] = hypre_CTAlloc(HYPRE_Int, mgr_num_cindexes[i], HYPRE_MEMORY_HOST); } for (i = 0; i < mgr_nlevels; i++) { /* assume coarse point is at index 0 */ mgr_cindexes[i][0] = 0; } mgr_reserved_coarse_indexes = hypre_CTAlloc(HYPRE_BigInt, mgr_num_reserved_nodes, HYPRE_MEMORY_HOST); for (i = 0; i < mgr_num_reserved_nodes; i++) { /* generate artificial reserved nodes */ mgr_reserved_coarse_indexes[i] = last_local_row - (HYPRE_BigInt) i; //2*i+1; } /* set MGR data by block */ HYPRE_MGRSetCpointsByBlock( mgr_solver, mgr_bsize, mgr_nlevels, mgr_num_cindexes, mgr_cindexes); /* set reserved coarse nodes */ if (mgr_num_reserved_nodes) { HYPRE_MGRSetReservedCoarseNodes(mgr_solver, mgr_num_reserved_nodes, mgr_reserved_coarse_indexes); } /* set intermediate coarse grid strategy */ HYPRE_MGRSetNonCpointsToFpoints(mgr_solver, mgr_non_c_to_f); /* set F relaxation strategy */ HYPRE_MGRSetFRelaxMethod(mgr_solver, mgr_frelax_method); /* set relax type for single level F-relaxation and post-relaxation */ HYPRE_MGRSetRelaxType(mgr_solver, mgr_relax_type); HYPRE_MGRSetNumRelaxSweeps(mgr_solver, mgr_num_relax_sweeps); /* set interpolation type */ HYPRE_MGRSetRestrictType(mgr_solver, mgr_restrict_type); HYPRE_MGRSetNumRestrictSweeps(mgr_solver, mgr_num_restrict_sweeps); HYPRE_MGRSetInterpType(mgr_solver, mgr_interp_type); HYPRE_MGRSetNumInterpSweeps(mgr_solver, mgr_num_interp_sweeps); /* set print level */ HYPRE_MGRSetPrintLevel(mgr_solver, ioutdat); /* set max iterations */ HYPRE_MGRSetMaxIter(mgr_solver, max_iter); HYPRE_MGRSetTol(mgr_solver, tol); /* set global smoother */ HYPRE_MGRSetGlobalSmoothType(mgr_solver, mgr_gsmooth_type); HYPRE_MGRSetMaxGlobalSmoothIters( mgr_solver, mgr_num_gsmooth_sweeps ); /* create AMG coarse grid solver */ HYPRE_BoomerAMGCreate(&amg_solver); if (hypre_GetExecPolicy1(memory_location) == HYPRE_EXEC_DEVICE) { HYPRE_BoomerAMGSetInterpType(amg_solver, 18); HYPRE_BoomerAMGSetCoarsenType(amg_solver, 8); HYPRE_BoomerAMGSetRelaxType(amg_solver, 3); } else { HYPRE_BoomerAMGSetInterpType(amg_solver, 0); HYPRE_BoomerAMGSetPostInterpType(amg_solver, post_interp_type); HYPRE_BoomerAMGSetCoarsenType(amg_solver, 6); HYPRE_BoomerAMGSetCycleType(amg_solver, cycle_type); HYPRE_BoomerAMGSetFCycle(amg_solver, fcycle); HYPRE_BoomerAMGSetRelaxType(amg_solver, 3); if (relax_down > -1) { HYPRE_BoomerAMGSetCycleRelaxType(amg_solver, relax_down, 1); } if (relax_up > -1) { HYPRE_BoomerAMGSetCycleRelaxType(amg_solver, relax_up, 2); } if (relax_coarse > -1) { HYPRE_BoomerAMGSetCycleRelaxType(amg_solver, relax_coarse, 3); } HYPRE_BoomerAMGSetSmoothType(amg_solver, smooth_type); HYPRE_BoomerAMGSetSmoothNumSweeps(amg_solver, smooth_num_sweeps); } HYPRE_BoomerAMGSetCGCIts(amg_solver, cgcits); HYPRE_BoomerAMGSetTol(amg_solver, tol); HYPRE_BoomerAMGSetPMaxElmts(amg_solver, 0); HYPRE_BoomerAMGSetNumSweeps(amg_solver, num_sweeps); HYPRE_BoomerAMGSetRelaxOrder(amg_solver, 1); HYPRE_BoomerAMGSetMaxLevels(amg_solver, max_levels); if (mgr_nlevels < 1 || mgr_bsize < 2) { HYPRE_BoomerAMGSetMaxIter(amg_solver, max_iter); HYPRE_BoomerAMGSetPrintLevel(amg_solver, 3); } else { HYPRE_BoomerAMGSetMaxIter(amg_solver, precon_cycles); HYPRE_BoomerAMGSetTol(amg_solver, 0.0); HYPRE_BoomerAMGSetPrintLevel(amg_solver, 1); } /* set the MGR coarse solver. Comment out to use default CG solver in MGR */ HYPRE_MGRSetCoarseSolver( mgr_solver, HYPRE_BoomerAMGSolve, HYPRE_BoomerAMGSetup, amg_solver); /* setup MGR solver */ HYPRE_MGRSetup(mgr_solver, parcsr_M, b, x); hypre_EndTiming(time_index); hypre_PrintTiming("Setup phase times", hypre_MPI_COMM_WORLD); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); time_index = hypre_InitializeTiming("MGR Solve"); hypre_BeginTiming(time_index); /* MGR solve */ HYPRE_MGRSolve(mgr_solver, parcsr_A, b, x); hypre_EndTiming(time_index); hypre_PrintTiming("Solve phase times", hypre_MPI_COMM_WORLD); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); if (second_time) { /* run a second time [for timings, to check for memory leaks] */ HYPRE_ParVectorSetRandomValues(x, 775); #if defined(HYPRE_USING_CURAND) || defined(HYPRE_USING_ROCRAND) hypre_ResetDeviceRandGenerator(1234ULL, 0ULL); #endif hypre_ParVectorCopy(x0_save, x); HYPRE_MGRSetup(mgr_solver, parcsr_M, b, x); HYPRE_MGRSolve(mgr_solver, parcsr_A, b, x); } HYPRE_MGRGetNumIterations(mgr_solver, &num_iterations); HYPRE_MGRGetFinalRelativeResidualNorm(mgr_solver, &final_res_norm); if (myid == 0) { hypre_printf("\n"); hypre_printf("MGR Iterations = %d\n", num_iterations); hypre_printf("Final Relative Residual Norm = %e\n", final_res_norm); hypre_printf("\n"); } /* free memory */ if (mgr_num_cindexes) { hypre_TFree(mgr_num_cindexes, HYPRE_MEMORY_HOST); } mgr_num_cindexes = NULL; if (mgr_reserved_coarse_indexes) { hypre_TFree(mgr_reserved_coarse_indexes, HYPRE_MEMORY_HOST); } mgr_reserved_coarse_indexes = NULL; if (mgr_cindexes) { for ( i = 0; i < mgr_nlevels; i++) { if (mgr_cindexes[i]) { hypre_TFree(mgr_cindexes[i], HYPRE_MEMORY_HOST); } } hypre_TFree(mgr_cindexes, HYPRE_MEMORY_HOST); mgr_cindexes = NULL; } HYPRE_BoomerAMGDestroy(amg_solver); HYPRE_MGRDestroy(mgr_solver); } /*----------------------------------------------------------- * Solve the system using hypre_ILU *-----------------------------------------------------------*/ if (solver_id == 80) { if (myid == 0) { hypre_printf("Solver: hypre_ILU\n"); } time_index = hypre_InitializeTiming("hypre_ILU Setup"); hypre_BeginTiming(time_index); HYPRE_Solver ilu_solver; HYPRE_ILUCreate(&ilu_solver); /* set ilu type */ HYPRE_ILUSetType(ilu_solver, ilu_type); /* set level of fill */ HYPRE_ILUSetLevelOfFill(ilu_solver, ilu_lfil); /* set local reordering type */ HYPRE_ILUSetLocalReordering(ilu_solver, ilu_reordering); /* set print level */ HYPRE_ILUSetPrintLevel(ilu_solver, 2); /* set max iterations */ HYPRE_ILUSetMaxIter(ilu_solver, max_iter); /* set max number of nonzeros per row */ HYPRE_ILUSetMaxNnzPerRow(ilu_solver, ilu_max_row_nnz); /* set the droptol */ HYPRE_ILUSetDropThreshold(ilu_solver, ilu_droptol); HYPRE_ILUSetTol(ilu_solver, tol); /* set max iterations for Schur system solve */ HYPRE_ILUSetSchurMaxIter(ilu_solver, ilu_schur_max_iter); HYPRE_ILUSetIterativeSetupType(ilu_solver, ilu_iter_setup_type); HYPRE_ILUSetIterativeSetupOption(ilu_solver, ilu_iter_setup_option); HYPRE_ILUSetIterativeSetupMaxIter(ilu_solver, ilu_iter_setup_max_iter); HYPRE_ILUSetIterativeSetupTolerance(ilu_solver, ilu_iter_setup_tolerance); /* setting for NSH */ if (ilu_type == 20 || ilu_type == 21) { HYPRE_ILUSetNSHDropThreshold( ilu_solver, ilu_nsh_droptol); } /* setup hypre_ILU solver */ HYPRE_ILUSetup(ilu_solver, parcsr_M, b, x); hypre_EndTiming(time_index); hypre_PrintTiming("Setup phase times", hypre_MPI_COMM_WORLD); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); time_index = hypre_InitializeTiming("hypre_ILU Solve"); hypre_BeginTiming(time_index); /* hypre_ILU solve */ HYPRE_ILUSolve(ilu_solver, parcsr_A, b, x); hypre_EndTiming(time_index); hypre_PrintTiming("Solve phase times", hypre_MPI_COMM_WORLD); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); if (second_time) { /* run a second time [for timings, to check for memory leaks] */ HYPRE_ParVectorSetRandomValues(x, 775); #if defined(HYPRE_USING_CURAND) || defined(HYPRE_USING_ROCRAND) hypre_ResetDeviceRandGenerator(1234ULL, 0ULL); #endif hypre_ParVectorCopy(x0_save, x); HYPRE_ILUSetup(ilu_solver, parcsr_M, b, x); HYPRE_ILUSolve(ilu_solver, parcsr_A, b, x); } HYPRE_ILUGetNumIterations(ilu_solver, &num_iterations); HYPRE_ILUGetFinalRelativeResidualNorm(ilu_solver, &final_res_norm); if (myid == 0) { hypre_printf("\n"); hypre_printf("hypre_ILU Iterations = %d\n", num_iterations); hypre_printf("Final Relative Residual Norm = %e\n", final_res_norm); hypre_printf("\n"); } /* free memory */ HYPRE_ILUDestroy(ilu_solver); } /*----------------------------------------------------------- * Print the solution and other info *-----------------------------------------------------------*/ if (print_system) { HYPRE_IJVectorPrint(ij_x, "IJ.out.x"); } if (print_system_binary) { if (ij_x) { HYPRE_IJVectorPrintBinary(ij_x, "IJ.out.x"); } else if (x) { HYPRE_ParVectorPrintBinaryIJ(x, "IJ.out.x"); } } /*----------------------------------------------------------- * Finalize things *-----------------------------------------------------------*/ final: HYPRE_ParVectorDestroy(x0_save); if (test_ij || build_matrix_type == -1 || build_matrix_type == -2) { if (ij_A) { HYPRE_IJMatrixDestroy(ij_A); } } else { HYPRE_ParCSRMatrixDestroy(parcsr_A); } if (build_matrix_M == 1) { HYPRE_IJMatrixDestroy(ij_M); } /* for build_rhs_type = 1, 6 or 7, we did not create ij_b - just b*/ if (build_rhs_type == 1 || build_rhs_type == 6 || build_rhs_type == 7) { HYPRE_ParVectorDestroy(b); } else { if (ij_b) { HYPRE_IJVectorDestroy(ij_b); } } if (ij_x) { HYPRE_IJVectorDestroy(ij_x); } if (build_rbm) { if (ij_rbm) { for (i = 0; i < num_interp_vecs; i++) { if (ij_rbm[i]) { HYPRE_IJVectorDestroy(ij_rbm[i]); } } } hypre_TFree(ij_rbm, HYPRE_MEMORY_HOST); hypre_TFree(interp_vecs, HYPRE_MEMORY_HOST); } if (nongalerk_tol) { hypre_TFree(nongalerk_tol, HYPRE_MEMORY_HOST); } if (cpt_index) { hypre_TFree(cpt_index, HYPRE_MEMORY_HOST); } if (fpt_index) { hypre_TFree(fpt_index, HYPRE_MEMORY_HOST); } if (isolated_fpt_index) { hypre_TFree(isolated_fpt_index, HYPRE_MEMORY_HOST); } /* hypre_FinalizeMemoryDebug(); */ if (test_error == 1) { /* Test GetErrorMessages() */ char *buffer, *msg; HYPRE_Int bufsz; HYPRE_GetErrorMessages(&buffer, &bufsz); hypre_MPI_Barrier(comm); for (msg = buffer; msg < (buffer + bufsz); msg += strlen(msg) + 1) { hypre_fprintf(stderr, "%d: %s", myid, msg); } hypre_TFree(buffer, HYPRE_MEMORY_HOST); } else { if (myid == 0) { HYPRE_PrintErrorMessages(comm); } } /* Free the memory buffer allocated for storing error messages when using mode 1 for printing errors Note: This call is redundant since the cleanup is already handled in HYPRE_Finalize. */ HYPRE_ClearErrorMessages(); /* Finalize Hypre */ HYPRE_Finalize(); /* Finalize MPI */ hypre_MPI_Finalize(); #if defined(HYPRE_USING_MEMORY_TRACKER) if (memory_location == HYPRE_MEMORY_HOST) { if (hypre_total_bytes[hypre_MEMORY_DEVICE] || hypre_total_bytes[hypre_MEMORY_UNIFIED]) { hypre_printf("Error: nonzero GPU memory allocated with the HOST mode\n"); hypre_assert(0); } } #endif /* when using cuda-memcheck --leak-check full, uncomment this */ #if defined(HYPRE_USING_GPU) hypre_ResetDevice(); #endif return (0); } /*---------------------------------------------------------------------- * Build matrix from file. Expects three files on each processor. * filename.D.n contains the diagonal part, filename.O.n contains * the offdiagonal part and filename.INFO.n contains global row * and column numbers, number of columns of offdiagonal matrix * and the mapping of offdiagonal column numbers to global column numbers. * Parameters given in command line. *----------------------------------------------------------------------*/ HYPRE_Int BuildParFromFile( HYPRE_Int argc, char *argv[], HYPRE_Int arg_index, HYPRE_ParCSRMatrix *A_ptr ) { char *filename; HYPRE_ParCSRMatrix A; HYPRE_Int myid; /*----------------------------------------------------------- * Initialize some stuff *-----------------------------------------------------------*/ hypre_MPI_Comm_rank(hypre_MPI_COMM_WORLD, &myid ); /*----------------------------------------------------------- * Parse command line *-----------------------------------------------------------*/ if (arg_index < argc) { filename = argv[arg_index]; } else { hypre_printf("Error: No filename specified \n"); exit(1); } /*----------------------------------------------------------- * Print driver parameters *-----------------------------------------------------------*/ if (myid == 0) { hypre_printf(" FromFile: %s\n", filename); } /*----------------------------------------------------------- * Generate the matrix *-----------------------------------------------------------*/ HYPRE_ParCSRMatrixRead(hypre_MPI_COMM_WORLD, filename, &A); *A_ptr = A; return (0); } /*---------------------------------------------------------------------- * Build rhs from file. Expects two files on each processor. * filename.n contains the data and * and filename.INFO.n contains global row * numbers *----------------------------------------------------------------------*/ HYPRE_Int ReadParVectorFromFile( HYPRE_Int argc, char *argv[], HYPRE_Int arg_index, HYPRE_ParVector *b_ptr ) { char *filename; HYPRE_ParVector b; HYPRE_Int myid; /*----------------------------------------------------------- * Initialize some stuff *-----------------------------------------------------------*/ hypre_MPI_Comm_rank(hypre_MPI_COMM_WORLD, &myid ); /*----------------------------------------------------------- * Parse command line *-----------------------------------------------------------*/ if (arg_index < argc) { filename = argv[arg_index]; } else { hypre_printf(" Error: No filename specified \n"); exit(1); } /*----------------------------------------------------------- * Print driver parameters *-----------------------------------------------------------*/ if (myid == 0) { hypre_printf(" From ParFile: %s\n", filename); } /*----------------------------------------------------------- * Generate the matrix *-----------------------------------------------------------*/ HYPRE_ParVectorRead(hypre_MPI_COMM_WORLD, filename, &b); *b_ptr = b; return (0); } /*---------------------------------------------------------------------- * Build standard 7-point laplacian in 3D with grid and anisotropy. * Parameters given in command line. *----------------------------------------------------------------------*/ HYPRE_Int BuildParLaplacian( HYPRE_Int argc, char *argv[], HYPRE_Int arg_index, HYPRE_ParCSRMatrix *A_ptr ) { HYPRE_BigInt nx, ny, nz; HYPRE_Int P, Q, R; HYPRE_Real cx, cy, cz; HYPRE_ParCSRMatrix A; HYPRE_Int num_procs, myid; HYPRE_Int p, q, r; HYPRE_Int num_fun = 1; HYPRE_Real *values; HYPRE_Real *mtrx; HYPRE_Real ep = .1; HYPRE_Int system_vcoef = 0; HYPRE_Int sys_opt = 0; HYPRE_Int vcoef_opt = 0; /*----------------------------------------------------------- * Initialize some stuff *-----------------------------------------------------------*/ hypre_MPI_Comm_size(hypre_MPI_COMM_WORLD, &num_procs ); hypre_MPI_Comm_rank(hypre_MPI_COMM_WORLD, &myid ); /*----------------------------------------------------------- * Set defaults *-----------------------------------------------------------*/ nx = 10; ny = 10; nz = 10; P = 1; Q = num_procs; R = 1; cx = 1.; cy = 1.; cz = 1.; /*----------------------------------------------------------- * Parse command line *-----------------------------------------------------------*/ arg_index = 0; while (arg_index < argc) { if ( strcmp(argv[arg_index], "-n") == 0 ) { arg_index++; nx = atoi(argv[arg_index++]); ny = atoi(argv[arg_index++]); nz = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-P") == 0 ) { arg_index++; P = atoi(argv[arg_index++]); Q = atoi(argv[arg_index++]); R = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-c") == 0 ) { arg_index++; cx = (HYPRE_Real)atof(argv[arg_index++]); cy = (HYPRE_Real)atof(argv[arg_index++]); cz = (HYPRE_Real)atof(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-sysL") == 0 ) { arg_index++; num_fun = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-sysL_opt") == 0 ) { arg_index++; sys_opt = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-sys_vcoef") == 0 ) { /* have to use -sysL for this to */ arg_index++; system_vcoef = 1; } else if ( strcmp(argv[arg_index], "-sys_vcoef_opt") == 0 ) { arg_index++; vcoef_opt = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-ep") == 0 ) { arg_index++; ep = (HYPRE_Real)atof(argv[arg_index++]); } else { arg_index++; } } /*----------------------------------------------------------- * Check a few things *-----------------------------------------------------------*/ if ((P * Q * R) != num_procs) { hypre_printf("Error: Invalid number of processors or processor topology \n"); exit(1); } /*----------------------------------------------------------- * Print driver parameters *-----------------------------------------------------------*/ if (myid == 0) { hypre_printf(" Laplacian: num_fun = %d\n", num_fun); hypre_printf(" (nx, ny, nz) = (%b, %b, %b)\n", nx, ny, nz); hypre_printf(" (Px, Py, Pz) = (%d, %d, %d)\n", P, Q, R); hypre_printf(" (cx, cy, cz) = (%f, %f, %f)\n\n", cx, cy, cz); } /*----------------------------------------------------------- * Set up the grid structure *-----------------------------------------------------------*/ /* compute p,q,r from P,Q,R and myid */ p = myid % P; q = (( myid - p) / P) % Q; r = ( myid - p - P * q) / ( P * Q ); /*----------------------------------------------------------- * Generate the matrix *-----------------------------------------------------------*/ values = hypre_CTAlloc(HYPRE_Real, 4, HYPRE_MEMORY_HOST); values[1] = -cx; values[2] = -cy; values[3] = -cz; values[0] = 0.; if (nx > 1) { values[0] += 2.0 * cx; } if (ny > 1) { values[0] += 2.0 * cy; } if (nz > 1) { values[0] += 2.0 * cz; } if (num_fun == 1) A = (HYPRE_ParCSRMatrix) GenerateLaplacian(hypre_MPI_COMM_WORLD, nx, ny, nz, P, Q, R, p, q, r, values); else { mtrx = hypre_CTAlloc(HYPRE_Real, num_fun * num_fun, HYPRE_MEMORY_HOST); if (num_fun == 2) { if (sys_opt == 1) /* identity */ { mtrx[0] = 1.0; mtrx[1] = 0.0; mtrx[2] = 0.0; mtrx[3] = 1.0; } else if (sys_opt == 2) { mtrx[0] = 1.0; mtrx[1] = 0.0; mtrx[2] = 0.0; mtrx[3] = 20.0; } else if (sys_opt == 3) /* similar to barry's talk - ex1 */ { mtrx[0] = 1.0; mtrx[1] = 2.0; mtrx[2] = 2.0; mtrx[3] = 1.0; } else if (sys_opt == 4) /* can use with vcoef to get barry's ex*/ { mtrx[0] = 1.0; mtrx[1] = 1.0; mtrx[2] = 1.0; mtrx[3] = 1.0; } else if (sys_opt == 5) /* barry's talk - ex1 */ { mtrx[0] = 1.0; mtrx[1] = 1.1; mtrx[2] = 1.1; mtrx[3] = 1.0; } else if (sys_opt == 6) /* */ { mtrx[0] = 1.1; mtrx[1] = 1.0; mtrx[2] = 1.0; mtrx[3] = 1.1; } else /* == 0 */ { mtrx[0] = 2; mtrx[1] = 1; mtrx[2] = 1; mtrx[3] = 2; } } else if (num_fun == 3) { if (sys_opt == 1) { mtrx[0] = 1.0; mtrx[1] = 0.0; mtrx[2] = 0.0; mtrx[3] = 0.0; mtrx[4] = 1.0; mtrx[5] = 0.0; mtrx[6] = 0.0; mtrx[7] = 0.0; mtrx[8] = 1.0; } else if (sys_opt == 2) { mtrx[0] = 1.0; mtrx[1] = 0.0; mtrx[2] = 0.0; mtrx[3] = 0.0; mtrx[4] = 20.0; mtrx[5] = 0.0; mtrx[6] = 0.0; mtrx[7] = 0.0; mtrx[8] = .01; } else if (sys_opt == 3) { mtrx[0] = 1.01; mtrx[1] = 1; mtrx[2] = 0.0; mtrx[3] = 1; mtrx[4] = 2; mtrx[5] = 1; mtrx[6] = 0.0; mtrx[7] = 1; mtrx[8] = 1.01; } else if (sys_opt == 4) /* barry ex4 */ { mtrx[0] = 3; mtrx[1] = 1; mtrx[2] = 0.0; mtrx[3] = 1; mtrx[4] = 4; mtrx[5] = 2; mtrx[6] = 0.0; mtrx[7] = 2; mtrx[8] = .25; } else /* == 0 */ { mtrx[0] = 2.0; mtrx[1] = 1.0; mtrx[2] = 0.0; mtrx[3] = 1.0; mtrx[4] = 2.0; mtrx[5] = 1.0; mtrx[6] = 0.0; mtrx[7] = 1.0; mtrx[8] = 2.0; } } else if (num_fun == 4) { mtrx[0] = 1.01; mtrx[1] = 1; mtrx[2] = 0.0; mtrx[3] = 0.0; mtrx[4] = 1; mtrx[5] = 2; mtrx[6] = 1; mtrx[7] = 0.0; mtrx[8] = 0.0; mtrx[9] = 1; mtrx[10] = 1.01; mtrx[11] = 0.0; mtrx[12] = 2; mtrx[13] = 1; mtrx[14] = 0.0; mtrx[15] = 1; } if (!system_vcoef) { A = (HYPRE_ParCSRMatrix) GenerateSysLaplacian(hypre_MPI_COMM_WORLD, nx, ny, nz, P, Q, R, p, q, r, num_fun, mtrx, values); } else { HYPRE_Real *mtrx_values; mtrx_values = hypre_CTAlloc(HYPRE_Real, num_fun * num_fun * 4, HYPRE_MEMORY_HOST); if (num_fun == 2) { if (vcoef_opt == 1) { /* Barry's talk * - must also have sys_opt = 4, all fail */ mtrx[0] = 1.0; SetSysVcoefValues(num_fun, nx, ny, nz, 1.0, .10, 1.0, 0, mtrx_values); mtrx[1] = 1.0; SetSysVcoefValues(num_fun, nx, ny, nz, .1, 1.0, 1.0, 1, mtrx_values); mtrx[2] = 1.0; SetSysVcoefValues(num_fun, nx, ny, nz, .01, 1.0, 1.0, 2, mtrx_values); mtrx[3] = 1.0; SetSysVcoefValues(num_fun, nx, ny, nz, 2.0, .02, 1.0, 3, mtrx_values); } else if (vcoef_opt == 2) { /* Barry's talk * - ex2 - if have sys-opt = 4*/ mtrx[0] = 1.0; SetSysVcoefValues(num_fun, nx, ny, nz, 1.0, .010, 1.0, 0, mtrx_values); mtrx[1] = 200.0; SetSysVcoefValues(num_fun, nx, ny, nz, 1.0, 1.0, 1.0, 1, mtrx_values); mtrx[2] = 200.0; SetSysVcoefValues(num_fun, nx, ny, nz, 1.0, 1.0, 1.0, 2, mtrx_values); mtrx[3] = 1.0; SetSysVcoefValues(num_fun, nx, ny, nz, 2.0, .02, 1.0, 3, mtrx_values); } else if (vcoef_opt == 3) /* use with default sys_opt - ulrike ex 3*/ { /* mtrx[0] */ SetSysVcoefValues(num_fun, nx, ny, nz, ep * 1.0, 1.0, 1.0, 0, mtrx_values); /* mtrx[1] */ SetSysVcoefValues(num_fun, nx, ny, nz, 1.0, 1.0, 1.0, 1, mtrx_values); /* mtrx[2] */ SetSysVcoefValues(num_fun, nx, ny, nz, ep * 1.0, 1.0, 1.0, 2, mtrx_values); /* mtrx[3] */ SetSysVcoefValues(num_fun, nx, ny, nz, 1.0, 1.0, 1.0, 3, mtrx_values); } else if (vcoef_opt == 4) /* use with default sys_opt - ulrike ex 4*/ { HYPRE_Real ep2 = ep; /* mtrx[0] */ SetSysVcoefValues(num_fun, nx, ny, nz, ep * 1.0, 1.0, 1.0, 0, mtrx_values); /* mtrx[1] */ SetSysVcoefValues(num_fun, nx, ny, nz, 1.0, ep * 1.0, 1.0, 1, mtrx_values); /* mtrx[2] */ SetSysVcoefValues(num_fun, nx, ny, nz, ep * 1.0, 1.0, 1.0, 2, mtrx_values); /* mtrx[3] */ SetSysVcoefValues(num_fun, nx, ny, nz, 1.0, ep2 * 1.0, 1.0, 3, mtrx_values); } else if (vcoef_opt == 5) /* use with default sys_opt - */ { HYPRE_Real alp, beta; alp = .001; beta = 10; /* mtrx[0] */ SetSysVcoefValues(num_fun, nx, ny, nz, alp * 1.0, 1.0, 1.0, 0, mtrx_values); /* mtrx[1] */ SetSysVcoefValues(num_fun, nx, ny, nz, 1.0, beta * 1.0, 1.0, 1, mtrx_values); /* mtrx[2] */ SetSysVcoefValues(num_fun, nx, ny, nz, alp * 1.0, 1.0, 1.0, 2, mtrx_values); /* mtrx[3] */ SetSysVcoefValues(num_fun, nx, ny, nz, 1.0, beta * 1.0, 1.0, 3, mtrx_values); } else /* = 0 */ { /* mtrx[0] */ SetSysVcoefValues(num_fun, nx, ny, nz, 1.0, 1.0, 1.0, 0, mtrx_values); /* mtrx[1] */ SetSysVcoefValues(num_fun, nx, ny, nz, 1.0, 2.0, 1.0, 1, mtrx_values); /* mtrx[2] */ SetSysVcoefValues(num_fun, nx, ny, nz, 2.0, 1.0, 0.0, 2, mtrx_values); /* mtrx[3] */ SetSysVcoefValues(num_fun, nx, ny, nz, 1.0, 3.0, 1.0, 3, mtrx_values); } } else if (num_fun == 3) { mtrx[0] = 1; SetSysVcoefValues(num_fun, nx, ny, nz, 1, .01, 1, 0, mtrx_values); mtrx[1] = 1; SetSysVcoefValues(num_fun, nx, ny, nz, 1, 1, 1, 1, mtrx_values); mtrx[2] = 0.0; SetSysVcoefValues(num_fun, nx, ny, nz, 1, 1, 1, 2, mtrx_values); mtrx[3] = 1; SetSysVcoefValues(num_fun, nx, ny, nz, 1, 1, 1, 3, mtrx_values); mtrx[4] = 1; SetSysVcoefValues(num_fun, nx, ny, nz, 2, .02, 1, 4, mtrx_values); mtrx[5] = 2; SetSysVcoefValues(num_fun, nx, ny, nz, 1, 1, 1, 5, mtrx_values); mtrx[6] = 0.0; SetSysVcoefValues(num_fun, nx, ny, nz, 1, 1, 1, 6, mtrx_values); mtrx[7] = 2; SetSysVcoefValues(num_fun, nx, ny, nz, 1, 1, 1, 7, mtrx_values); mtrx[8] = 1; SetSysVcoefValues(num_fun, nx, ny, nz, 1.5, .04, 1, 8, mtrx_values); } A = (HYPRE_ParCSRMatrix) GenerateSysLaplacianVCoef(hypre_MPI_COMM_WORLD, nx, ny, nz, P, Q, R, p, q, r, num_fun, mtrx, mtrx_values); hypre_TFree(mtrx_values, HYPRE_MEMORY_HOST); } hypre_TFree(mtrx, HYPRE_MEMORY_HOST); } hypre_TFree(values, HYPRE_MEMORY_HOST); *A_ptr = A; return (0); } /*---------------------------------------------------------------------- * returns the sign of a real number * 1 : positive * 0 : zero * -1 : negative *----------------------------------------------------------------------*/ static inline HYPRE_Int sign_double(HYPRE_Real a) { return ( (0.0 < a) - (0.0 > a) ); } /*---------------------------------------------------------------------- * Build standard 7-point convection-diffusion operator * Parameters given in command line. * Operator: * * -cx Dxx - cy Dyy - cz Dzz + ax Dx + ay Dy + az Dz = f * *----------------------------------------------------------------------*/ HYPRE_Int BuildParDifConv( HYPRE_Int argc, char *argv[], HYPRE_Int arg_index, HYPRE_ParCSRMatrix *A_ptr) { HYPRE_BigInt nx, ny, nz; HYPRE_Int P, Q, R; HYPRE_Real cx, cy, cz; HYPRE_Real ax, ay, az, atype; HYPRE_Real hinx, hiny, hinz; HYPRE_Int sign_prod; HYPRE_ParCSRMatrix A; HYPRE_Int num_procs, myid; HYPRE_Int p, q, r; HYPRE_Real *values; /*----------------------------------------------------------- * Initialize some stuff *-----------------------------------------------------------*/ hypre_MPI_Comm_size(hypre_MPI_COMM_WORLD, &num_procs ); hypre_MPI_Comm_rank(hypre_MPI_COMM_WORLD, &myid ); /*----------------------------------------------------------- * Set defaults *-----------------------------------------------------------*/ nx = 10; ny = 10; nz = 10; P = 1; Q = num_procs; R = 1; cx = 1.; cy = 1.; cz = 1.; ax = 1.; ay = 1.; az = 1.; atype = 0; /*----------------------------------------------------------- * Parse command line *-----------------------------------------------------------*/ arg_index = 0; while (arg_index < argc) { if ( strcmp(argv[arg_index], "-n") == 0 ) { arg_index++; nx = atoi(argv[arg_index++]); ny = atoi(argv[arg_index++]); nz = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-P") == 0 ) { arg_index++; P = atoi(argv[arg_index++]); Q = atoi(argv[arg_index++]); R = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-c") == 0 ) { arg_index++; cx = (HYPRE_Real)atof(argv[arg_index++]); cy = (HYPRE_Real)atof(argv[arg_index++]); cz = (HYPRE_Real)atof(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-a") == 0 ) { arg_index++; ax = (HYPRE_Real)atof(argv[arg_index++]); ay = (HYPRE_Real)atof(argv[arg_index++]); az = (HYPRE_Real)atof(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-atype") == 0 ) { arg_index++; atype = atoi(argv[arg_index++]); } else { arg_index++; } } /*----------------------------------------------------------- * Check a few things *-----------------------------------------------------------*/ if ((P * Q * R) != num_procs) { hypre_printf("Error: Invalid number of processors or processor topology \n"); exit(1); } /*----------------------------------------------------------- * Print driver parameters *-----------------------------------------------------------*/ if (myid == 0) { hypre_printf(" Convection-Diffusion: \n"); hypre_printf(" -cx Dxx - cy Dyy - cz Dzz + ax Dx + ay Dy + az Dz = f\n"); hypre_printf(" (nx, ny, nz) = (%b, %b, %b)\n", nx, ny, nz); hypre_printf(" (Px, Py, Pz) = (%d, %d, %d)\n", P, Q, R); hypre_printf(" (cx, cy, cz) = (%f, %f, %f)\n", cx, cy, cz); hypre_printf(" (ax, ay, az) = (%f, %f, %f)\n\n", ax, ay, az); } /*----------------------------------------------------------- * Set up the grid structure *-----------------------------------------------------------*/ /* compute p,q,r from P,Q,R and myid */ p = myid % P; q = (( myid - p) / P) % Q; r = ( myid - p - P * q) / ( P * Q ); hinx = 1. / (HYPRE_Real)(nx + 1); hiny = 1. / (HYPRE_Real)(ny + 1); hinz = 1. / (HYPRE_Real)(nz + 1); /*----------------------------------------------------------- * Generate the matrix *-----------------------------------------------------------*/ /* values[7]: * [0]: center * [1]: X- * [2]: Y- * [3]: Z- * [4]: X+ * [5]: Y+ * [6]: Z+ */ values = hypre_CTAlloc(HYPRE_Real, 7, HYPRE_MEMORY_HOST); values[0] = 0.; if (0 == atype) /* forward scheme for conv */ { values[1] = -cx / (hinx * hinx); values[2] = -cy / (hiny * hiny); values[3] = -cz / (hinz * hinz); values[4] = -cx / (hinx * hinx) + ax / hinx; values[5] = -cy / (hiny * hiny) + ay / hiny; values[6] = -cz / (hinz * hinz) + az / hinz; if (nx > 1) { values[0] += 2.0 * cx / (hinx * hinx) - 1.*ax / hinx; } if (ny > 1) { values[0] += 2.0 * cy / (hiny * hiny) - 1.*ay / hiny; } if (nz > 1) { values[0] += 2.0 * cz / (hinz * hinz) - 1.*az / hinz; } } else if (1 == atype) /* backward scheme for conv */ { values[1] = -cx / (hinx * hinx) - ax / hinx; values[2] = -cy / (hiny * hiny) - ay / hiny; values[3] = -cz / (hinz * hinz) - az / hinz; values[4] = -cx / (hinx * hinx); values[5] = -cy / (hiny * hiny); values[6] = -cz / (hinz * hinz); if (nx > 1) { values[0] += 2.0 * cx / (hinx * hinx) + 1.*ax / hinx; } if (ny > 1) { values[0] += 2.0 * cy / (hiny * hiny) + 1.*ay / hiny; } if (nz > 1) { values[0] += 2.0 * cz / (hinz * hinz) + 1.*az / hinz; } } else if (3 == atype) /* upwind scheme */ { sign_prod = sign_double(cx) * sign_double(ax); if (sign_prod == 1) /* same sign use back scheme */ { values[1] = -cx / (hinx * hinx) - ax / hinx; values[4] = -cx / (hinx * hinx); if (nx > 1) { values[0] += 2.0 * cx / (hinx * hinx) + 1.*ax / hinx; } } else /* diff sign use forward scheme */ { values[1] = -cx / (hinx * hinx); values[4] = -cx / (hinx * hinx) + ax / hinx; if (nx > 1) { values[0] += 2.0 * cx / (hinx * hinx) - 1.*ax / hinx; } } sign_prod = sign_double(cy) * sign_double(ay); if (sign_prod == 1) /* same sign use back scheme */ { values[2] = -cy / (hiny * hiny) - ay / hiny; values[5] = -cy / (hiny * hiny); if (ny > 1) { values[0] += 2.0 * cy / (hiny * hiny) + 1.*ay / hiny; } } else /* diff sign use forward scheme */ { values[2] = -cy / (hiny * hiny); values[5] = -cy / (hiny * hiny) + ay / hiny; if (ny > 1) { values[0] += 2.0 * cy / (hiny * hiny) - 1.*ay / hiny; } } sign_prod = sign_double(cz) * sign_double(az); if (sign_prod == 1) /* same sign use back scheme */ { values[3] = -cz / (hinz * hinz) - az / hinz; values[6] = -cz / (hinz * hinz); if (nz > 1) { values[0] += 2.0 * cz / (hinz * hinz) + 1.*az / hinz; } } else /* diff sign use forward scheme */ { values[3] = -cz / (hinz * hinz); values[6] = -cz / (hinz * hinz) + az / hinz; if (nz > 1) { values[0] += 2.0 * cz / (hinz * hinz) - 1.*az / hinz; } } } else /* centered difference scheme */ { values[1] = -cx / (hinx * hinx) - ax / (2.*hinx); values[2] = -cy / (hiny * hiny) - ay / (2.*hiny); values[3] = -cz / (hinz * hinz) - az / (2.*hinz); values[4] = -cx / (hinx * hinx) + ax / (2.*hinx); values[5] = -cy / (hiny * hiny) + ay / (2.*hiny); values[6] = -cz / (hinz * hinz) + az / (2.*hinz); if (nx > 1) { values[0] += 2.0 * cx / (hinx * hinx); } if (ny > 1) { values[0] += 2.0 * cy / (hiny * hiny); } if (nz > 1) { values[0] += 2.0 * cz / (hinz * hinz); } } A = (HYPRE_ParCSRMatrix) GenerateDifConv(hypre_MPI_COMM_WORLD, nx, ny, nz, P, Q, R, p, q, r, values); hypre_TFree(values, HYPRE_MEMORY_HOST); *A_ptr = A; return (0); } /*---------------------------------------------------------------------- * Build matrix from one file on Proc. 0. Expects matrix to be in * CSR format. Distributes matrix across processors giving each about * the same number of rows. * Parameters given in command line. *----------------------------------------------------------------------*/ HYPRE_Int BuildParFromOneFile( HYPRE_Int argc, char *argv[], HYPRE_Int arg_index, HYPRE_Int num_functions, HYPRE_ParCSRMatrix *A_ptr ) { char *filename; HYPRE_CSRMatrix A_CSR = NULL; HYPRE_BigInt *row_part = NULL; HYPRE_BigInt *col_part = NULL; HYPRE_Int myid, numprocs; HYPRE_Int i, rest, size, num_nodes, num_dofs; /*----------------------------------------------------------- * Initialize some stuff *-----------------------------------------------------------*/ hypre_MPI_Comm_rank(hypre_MPI_COMM_WORLD, &myid ); hypre_MPI_Comm_size(hypre_MPI_COMM_WORLD, &numprocs ); /*----------------------------------------------------------- * Parse command line *-----------------------------------------------------------*/ if (arg_index < argc) { filename = argv[arg_index]; } else { hypre_printf("Error: No filename specified \n"); exit(1); } /*----------------------------------------------------------- * Print driver parameters *-----------------------------------------------------------*/ if (myid == 0) { hypre_printf(" FromFile: %s\n", filename); /*----------------------------------------------------------- * Generate the matrix *-----------------------------------------------------------*/ A_CSR = HYPRE_CSRMatrixRead(filename); } if (myid == 0 && num_functions > 1) { HYPRE_CSRMatrixGetNumRows(A_CSR, &num_dofs); num_nodes = num_dofs / num_functions; if (num_dofs == num_functions * num_nodes) { row_part = hypre_CTAlloc(HYPRE_BigInt, numprocs + 1, HYPRE_MEMORY_HOST); row_part[0] = 0; size = num_nodes / numprocs; rest = num_nodes - size * numprocs; for (i = 0; i < rest; i++) { row_part[i + 1] = row_part[i] + (size + 1) * num_functions; } for (i = rest; i < numprocs; i++) { row_part[i + 1] = row_part[i] + size * num_functions; } col_part = row_part; } } HYPRE_CSRMatrixToParCSRMatrix(hypre_MPI_COMM_WORLD, A_CSR, row_part, col_part, A_ptr); if (myid == 0) { HYPRE_CSRMatrixDestroy(A_CSR); } return (0); } /*---------------------------------------------------------------------- * Build Function array from files on different processors *----------------------------------------------------------------------*/ HYPRE_Int BuildFuncsFromFiles( HYPRE_Int argc, char *argv[], HYPRE_Int arg_index, HYPRE_ParCSRMatrix parcsr_A, HYPRE_Int **dof_func_ptr ) { HYPRE_UNUSED_VAR(argc); HYPRE_UNUSED_VAR(argv); HYPRE_UNUSED_VAR(arg_index); HYPRE_UNUSED_VAR(parcsr_A); HYPRE_UNUSED_VAR(dof_func_ptr); /*---------------------------------------------------------------------- * Build Function array from files on different processors *----------------------------------------------------------------------*/ hypre_printf("Feature is not implemented yet!\n"); return (0); } /*---------------------------------------------------------------------- * Build Function array from file on master process *----------------------------------------------------------------------*/ HYPRE_Int BuildFuncsFromOneFile( HYPRE_Int argc, char *argv[], HYPRE_Int arg_index, HYPRE_ParCSRMatrix parcsr_A, HYPRE_Int **dof_func_ptr ) { char *filename; HYPRE_Int myid, num_procs; HYPRE_Int first_row_index; HYPRE_Int last_row_index; HYPRE_BigInt *partitioning; HYPRE_Int *dof_func = NULL; HYPRE_Int *dof_func_local; HYPRE_Int i, j; HYPRE_Int local_size; HYPRE_Int global_size; hypre_MPI_Request *requests; hypre_MPI_Status *status, status0; MPI_Comm comm; /*----------------------------------------------------------- * Initialize some stuff *-----------------------------------------------------------*/ comm = hypre_MPI_COMM_WORLD; hypre_MPI_Comm_rank(comm, &myid ); hypre_MPI_Comm_size(comm, &num_procs ); /*----------------------------------------------------------- * Parse command line *-----------------------------------------------------------*/ if (arg_index < argc) { filename = argv[arg_index]; } else { hypre_printf("Error: No filename specified \n"); exit(1); } /*----------------------------------------------------------- * Print driver parameters *-----------------------------------------------------------*/ if (myid == 0) { FILE *fp; hypre_printf(" Funcs FromFile: %s\n", filename); /*----------------------------------------------------------- * read in the data *-----------------------------------------------------------*/ fp = fopen(filename, "r"); hypre_fscanf(fp, "%d", &global_size); dof_func = hypre_CTAlloc(HYPRE_Int, global_size, HYPRE_MEMORY_HOST); for (j = 0; j < global_size; j++) { hypre_fscanf(fp, "%d", &dof_func[j]); } fclose(fp); } HYPRE_ParCSRMatrixGetGlobalRowPartitioning(parcsr_A, 0, &partitioning); first_row_index = hypre_ParCSRMatrixFirstRowIndex(parcsr_A); last_row_index = hypre_ParCSRMatrixLastRowIndex(parcsr_A); local_size = last_row_index - first_row_index + 1; dof_func_local = hypre_CTAlloc(HYPRE_Int, local_size, HYPRE_MEMORY_HOST); if (myid == 0) { requests = hypre_CTAlloc(hypre_MPI_Request, num_procs - 1, HYPRE_MEMORY_HOST); status = hypre_CTAlloc(hypre_MPI_Status, num_procs - 1, HYPRE_MEMORY_HOST); for (i = 1; i < num_procs; i++) { hypre_MPI_Isend(&dof_func[partitioning[i]], (partitioning[i + 1] - partitioning[i]), HYPRE_MPI_INT, i, 0, comm, &requests[i - 1]); } for (i = 0; i < local_size; i++) { dof_func_local[i] = dof_func[i]; } hypre_MPI_Waitall(num_procs - 1, requests, status); hypre_TFree(requests, HYPRE_MEMORY_HOST); hypre_TFree(status, HYPRE_MEMORY_HOST); } else { hypre_MPI_Recv(dof_func_local, local_size, HYPRE_MPI_INT, 0, 0, comm, &status0); } *dof_func_ptr = dof_func_local; if (myid == 0) { hypre_TFree(dof_func, HYPRE_MEMORY_HOST); } if (partitioning) { hypre_TFree(partitioning, HYPRE_MEMORY_HOST); } return (0); } /*---------------------------------------------------------------------- * Build Rhs from one file on Proc. 0. Distributes vector across processors * giving each about using the distribution of the matrix A. *----------------------------------------------------------------------*/ HYPRE_Int BuildRhsParFromOneFile( HYPRE_Int argc, char *argv[], HYPRE_Int arg_index, HYPRE_ParCSRMatrix parcsr_A, HYPRE_ParVector *b_ptr ) { char *filename; HYPRE_Int myid; HYPRE_BigInt *partitioning; HYPRE_ParVector b; HYPRE_Vector b_CSR = NULL; /*----------------------------------------------------------- * Initialize some stuff *-----------------------------------------------------------*/ hypre_MPI_Comm_rank(hypre_MPI_COMM_WORLD, &myid ); partitioning = hypre_ParCSRMatrixRowStarts(parcsr_A); /*----------------------------------------------------------- * Parse command line *-----------------------------------------------------------*/ if (arg_index < argc) { filename = argv[arg_index]; } else { hypre_printf("Error: No filename specified \n"); exit(1); } /*----------------------------------------------------------- * Print driver parameters *-----------------------------------------------------------*/ if (myid == 0) { hypre_printf(" Rhs FromFile: %s\n", filename); /*----------------------------------------------------------- * Generate the matrix *-----------------------------------------------------------*/ b_CSR = HYPRE_VectorRead(filename); } HYPRE_VectorToParVector(hypre_MPI_COMM_WORLD, b_CSR, partitioning, &b); *b_ptr = b; HYPRE_VectorDestroy(b_CSR); return (0); } /*---------------------------------------------------------------------- * Build Rhs from one file on Proc. 0. Distributes vector across processors * giving each about using the distribution of the matrix A. *----------------------------------------------------------------------*/ HYPRE_Int BuildBigArrayFromOneFile( HYPRE_Int argc, char *argv[], const char *array_name, HYPRE_Int arg_index, HYPRE_BigInt *partitioning, HYPRE_Int *size, HYPRE_BigInt **array_ptr ) { MPI_Comm comm = hypre_MPI_COMM_WORLD; char *filename = NULL; FILE *fp; HYPRE_Int myid; HYPRE_Int num_procs; HYPRE_Int global_size; HYPRE_BigInt *global_array = NULL; HYPRE_BigInt *array = NULL; HYPRE_BigInt *send_buffer = NULL; HYPRE_Int *send_counts = NULL; HYPRE_Int *displs = NULL; HYPRE_Int *array_procs = NULL; HYPRE_Int j, jj, proc; /*----------------------------------------------------------- * Initialize some stuff *-----------------------------------------------------------*/ hypre_MPI_Comm_rank(comm, &myid); hypre_MPI_Comm_size(comm, &num_procs); /*----------------------------------------------------------- * Parse command line *-----------------------------------------------------------*/ if (arg_index < argc) { filename = argv[arg_index]; } else { if (myid == 0) { hypre_printf("Error: No filename specified \n"); } hypre_MPI_Abort(comm, 1); } /*----------------------------------------------------------- * Print driver parameters *-----------------------------------------------------------*/ if (myid == 0) { hypre_printf(" %s array FromFile: %s\n", array_name, filename); /*----------------------------------------------------------- * Read data *-----------------------------------------------------------*/ fp = fopen(filename, "r"); hypre_fscanf(fp, "%d", &global_size); global_array = hypre_CTAlloc(HYPRE_BigInt, global_size, HYPRE_MEMORY_HOST); for (j = 0; j < global_size; j++) { hypre_fscanf(fp, "%d", &global_array[j]); } fclose(fp); } /*----------------------------------------------------------- * Distribute data *-----------------------------------------------------------*/ if (myid == 0) { send_counts = hypre_CTAlloc(HYPRE_Int, num_procs, HYPRE_MEMORY_HOST); displs = hypre_CTAlloc(HYPRE_Int, num_procs, HYPRE_MEMORY_HOST); array_procs = hypre_CTAlloc(HYPRE_Int, global_size, HYPRE_MEMORY_HOST); send_buffer = hypre_CTAlloc(HYPRE_BigInt, global_size, HYPRE_MEMORY_HOST); for (j = 0; j < global_size; j++) { for (proc = 0; proc < (num_procs + 1); proc++) { if (global_array[j] < partitioning[proc]) { proc--; break; } } if (proc < num_procs) { send_counts[proc]++; array_procs[j] = proc; } else { array_procs[j] = -1; // Not found } } for (proc = 0; proc < (num_procs - 1); proc++) { displs[proc + 1] = displs[proc] + send_counts[proc]; } } hypre_MPI_Scatter(send_counts, 1, HYPRE_MPI_INT, size, 1, HYPRE_MPI_INT, 0, comm); if (myid == 0) { for (proc = 0; proc < num_procs; proc++) { send_counts[proc] = 0; } for (j = 0; j < global_size; j++) { proc = array_procs[j]; if (proc > -1) { jj = displs[proc] + send_counts[proc]; send_buffer[jj] = global_array[j]; send_counts[proc]++; } } } array = hypre_CTAlloc(HYPRE_BigInt, *size, HYPRE_MEMORY_HOST); hypre_MPI_Scatterv(send_buffer, send_counts, displs, HYPRE_MPI_BIG_INT, array, *size, HYPRE_MPI_BIG_INT, 0, comm); *array_ptr = array; /* Free memory */ if (myid == 0) { hypre_TFree(send_counts, HYPRE_MEMORY_HOST); hypre_TFree(send_buffer, HYPRE_MEMORY_HOST); hypre_TFree(displs, HYPRE_MEMORY_HOST); hypre_TFree(array_procs, HYPRE_MEMORY_HOST); hypre_TFree(global_array, HYPRE_MEMORY_HOST); } return 0; } /*---------------------------------------------------------------------- * Build standard 9-point laplacian in 2D with grid and anisotropy. * Parameters given in command line. *----------------------------------------------------------------------*/ HYPRE_Int BuildParLaplacian9pt( HYPRE_Int argc, char *argv[], HYPRE_Int arg_index, HYPRE_ParCSRMatrix *A_ptr ) { HYPRE_BigInt nx, ny; HYPRE_Int P, Q; HYPRE_ParCSRMatrix A; HYPRE_Int num_procs, myid; HYPRE_Int p, q; HYPRE_Real *values; /*----------------------------------------------------------- * Initialize some stuff *-----------------------------------------------------------*/ hypre_MPI_Comm_size(hypre_MPI_COMM_WORLD, &num_procs ); hypre_MPI_Comm_rank(hypre_MPI_COMM_WORLD, &myid ); /*----------------------------------------------------------- * Set defaults *-----------------------------------------------------------*/ nx = 10; ny = 10; P = 1; Q = num_procs; /*----------------------------------------------------------- * Parse command line *-----------------------------------------------------------*/ arg_index = 0; while (arg_index < argc) { if ( strcmp(argv[arg_index], "-n") == 0 ) { arg_index++; nx = atoi(argv[arg_index++]); ny = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-P") == 0 ) { arg_index++; P = atoi(argv[arg_index++]); Q = atoi(argv[arg_index++]); } else { arg_index++; } } /*----------------------------------------------------------- * Check a few things *-----------------------------------------------------------*/ if ((P * Q) != num_procs) { hypre_printf("Error: Invalid number of processors or processor topology \n"); exit(1); } /*----------------------------------------------------------- * Print driver parameters *-----------------------------------------------------------*/ if (myid == 0) { hypre_printf(" Laplacian 9pt:\n"); hypre_printf(" (nx, ny) = (%b, %b)\n", nx, ny); hypre_printf(" (Px, Py) = (%d, %d)\n\n", P, Q); } /*----------------------------------------------------------- * Set up the grid structure *-----------------------------------------------------------*/ /* compute p,q from P,Q and myid */ p = myid % P; q = ( myid - p) / P; /*----------------------------------------------------------- * Generate the matrix *-----------------------------------------------------------*/ values = hypre_CTAlloc(HYPRE_Real, 2, HYPRE_MEMORY_HOST); values[1] = -1.; values[0] = 0.; if (nx > 1) { values[0] += 2.0; } if (ny > 1) { values[0] += 2.0; } if (nx > 1 && ny > 1) { values[0] += 4.0; } A = (HYPRE_ParCSRMatrix) GenerateLaplacian9pt(hypre_MPI_COMM_WORLD, nx, ny, P, Q, p, q, values); hypre_TFree(values, HYPRE_MEMORY_HOST); *A_ptr = A; return (0); } /*---------------------------------------------------------------------- * Build 27-point laplacian in 3D, * Parameters given in command line. *----------------------------------------------------------------------*/ HYPRE_Int BuildParLaplacian27pt( HYPRE_Int argc, char *argv[], HYPRE_Int arg_index, HYPRE_ParCSRMatrix *A_ptr ) { HYPRE_BigInt nx, ny, nz; HYPRE_Int P, Q, R; HYPRE_ParCSRMatrix A; HYPRE_Int num_procs, myid; HYPRE_Int p, q, r; HYPRE_Real *values; /*----------------------------------------------------------- * Initialize some stuff *-----------------------------------------------------------*/ hypre_MPI_Comm_size(hypre_MPI_COMM_WORLD, &num_procs ); hypre_MPI_Comm_rank(hypre_MPI_COMM_WORLD, &myid ); /*----------------------------------------------------------- * Set defaults *-----------------------------------------------------------*/ nx = 10; ny = 10; nz = 10; P = 1; Q = num_procs; R = 1; /*----------------------------------------------------------- * Parse command line *-----------------------------------------------------------*/ arg_index = 0; while (arg_index < argc) { if ( strcmp(argv[arg_index], "-n") == 0 ) { arg_index++; nx = atoi(argv[arg_index++]); ny = atoi(argv[arg_index++]); nz = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-P") == 0 ) { arg_index++; P = atoi(argv[arg_index++]); Q = atoi(argv[arg_index++]); R = atoi(argv[arg_index++]); } else { arg_index++; } } /*----------------------------------------------------------- * Check a few things *-----------------------------------------------------------*/ if ((P * Q * R) != num_procs) { hypre_printf("Error: Invalid number of processors or processor topology \n"); exit(1); } /*----------------------------------------------------------- * Print driver parameters *-----------------------------------------------------------*/ if (myid == 0) { hypre_printf(" Laplacian_27pt:\n"); hypre_printf(" (nx, ny, nz) = (%b, %b, %b)\n", nx, ny, nz); hypre_printf(" (Px, Py, Pz) = (%d, %d, %d)\n\n", P, Q, R); } /*----------------------------------------------------------- * Set up the grid structure *-----------------------------------------------------------*/ /* compute p,q,r from P,Q,R and myid */ p = myid % P; q = (( myid - p) / P) % Q; r = ( myid - p - P * q) / ( P * Q ); /*----------------------------------------------------------- * Generate the matrix *-----------------------------------------------------------*/ values = hypre_CTAlloc(HYPRE_Real, 2, HYPRE_MEMORY_HOST); values[0] = 26.0; if (nx == 1 || ny == 1 || nz == 1) { values[0] = 8.0; } if (nx * ny == 1 || nx * nz == 1 || ny * nz == 1) { values[0] = 2.0; } values[1] = -1.; A = (HYPRE_ParCSRMatrix) GenerateLaplacian27pt(hypre_MPI_COMM_WORLD, nx, ny, nz, P, Q, R, p, q, r, values); hypre_TFree(values, HYPRE_MEMORY_HOST); *A_ptr = A; return (0); } /*---------------------------------------------------------------------- * Build 125-point laplacian in 3D (27-pt squared) * Parameters given in command line. *----------------------------------------------------------------------*/ HYPRE_Int BuildParLaplacian125pt( HYPRE_Int argc, char *argv[], HYPRE_Int arg_index, HYPRE_ParCSRMatrix *A_ptr ) { HYPRE_BigInt nx, ny, nz; HYPRE_Int P, Q, R; HYPRE_ParCSRMatrix A, B; HYPRE_Int num_procs, myid; HYPRE_Int p, q, r; HYPRE_Real *values; /*----------------------------------------------------------- * Initialize some stuff *-----------------------------------------------------------*/ hypre_MPI_Comm_size(hypre_MPI_COMM_WORLD, &num_procs ); hypre_MPI_Comm_rank(hypre_MPI_COMM_WORLD, &myid ); /*----------------------------------------------------------- * Set defaults *-----------------------------------------------------------*/ nx = 10; ny = 10; nz = 10; P = 1; Q = num_procs; R = 1; /*----------------------------------------------------------- * Parse command line *-----------------------------------------------------------*/ arg_index = 0; while (arg_index < argc) { if ( strcmp(argv[arg_index], "-n") == 0 ) { arg_index++; nx = atoi(argv[arg_index++]); ny = atoi(argv[arg_index++]); nz = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-P") == 0 ) { arg_index++; P = atoi(argv[arg_index++]); Q = atoi(argv[arg_index++]); R = atoi(argv[arg_index++]); } else { arg_index++; } } /*----------------------------------------------------------- * Check a few things *-----------------------------------------------------------*/ if ((P * Q * R) != num_procs) { hypre_printf("Error: Invalid number of processors or processor topology \n"); exit(1); } /*----------------------------------------------------------- * Print driver parameters *-----------------------------------------------------------*/ if (myid == 0) { hypre_printf(" Laplacian_125pt:\n"); hypre_printf(" (nx, ny, nz) = (%b, %b, %b)\n", nx, ny, nz); hypre_printf(" (Px, Py, Pz) = (%d, %d, %d)\n\n", P, Q, R); } /*----------------------------------------------------------- * Set up the grid structure *-----------------------------------------------------------*/ /* compute p,q,r from P,Q,R and myid */ p = myid % P; q = (( myid - p) / P) % Q; r = ( myid - p - P * q) / ( P * Q ); /*----------------------------------------------------------- * Generate the matrix *-----------------------------------------------------------*/ values = hypre_CTAlloc(HYPRE_Real, 2, HYPRE_MEMORY_HOST); values[0] = 26.0; if (nx == 1 || ny == 1 || nz == 1) { values[0] = 8.0; } if (nx * ny == 1 || nx * nz == 1 || ny * nz == 1) { values[0] = 2.0; } values[1] = -1.; B = (HYPRE_ParCSRMatrix) GenerateLaplacian27pt(hypre_MPI_COMM_WORLD, nx, ny, nz, P, Q, R, p, q, r, values); A = (HYPRE_ParCSRMatrix) hypre_ParCSRMatMat(B, B); HYPRE_ParCSRMatrixDestroy(B); hypre_TFree(values, HYPRE_MEMORY_HOST); *A_ptr = A; return (0); } /*---------------------------------------------------------------------- * Build 7-point in 2D * Parameters given in command line. *----------------------------------------------------------------------*/ HYPRE_Int BuildParRotate7pt( HYPRE_Int argc, char *argv[], HYPRE_Int arg_index, HYPRE_ParCSRMatrix *A_ptr ) { HYPRE_BigInt nx, ny; HYPRE_Int P, Q; HYPRE_ParCSRMatrix A; HYPRE_Int num_procs, myid; HYPRE_Int p, q; HYPRE_Real eps = 0.0, alpha = 1.0; /*----------------------------------------------------------- * Initialize some stuff *-----------------------------------------------------------*/ hypre_MPI_Comm_size(hypre_MPI_COMM_WORLD, &num_procs ); hypre_MPI_Comm_rank(hypre_MPI_COMM_WORLD, &myid ); /*----------------------------------------------------------- * Set defaults *-----------------------------------------------------------*/ nx = 10; ny = 10; P = 1; Q = num_procs; /*----------------------------------------------------------- * Parse command line *-----------------------------------------------------------*/ arg_index = 0; while (arg_index < argc) { if ( strcmp(argv[arg_index], "-n") == 0 ) { arg_index++; nx = atoi(argv[arg_index++]); ny = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-P") == 0 ) { arg_index++; P = atoi(argv[arg_index++]); Q = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-alpha") == 0 ) { arg_index++; alpha = (HYPRE_Real)atof(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-eps") == 0 ) { arg_index++; eps = (HYPRE_Real)atof(argv[arg_index++]); } else { arg_index++; } } /*----------------------------------------------------------- * Check a few things *-----------------------------------------------------------*/ if ((P * Q) != num_procs) { hypre_printf("Error: Invalid number of processors or processor topology \n"); exit(1); } /*----------------------------------------------------------- * Print driver parameters *-----------------------------------------------------------*/ if (myid == 0) { hypre_printf(" Rotate 7pt:\n"); hypre_printf(" alpha = %f, eps = %f\n", alpha, eps); hypre_printf(" (nx, ny) = (%b, %b)\n", nx, ny); hypre_printf(" (Px, Py) = (%d, %d)\n", P, Q); } /*----------------------------------------------------------- * Set up the grid structure *-----------------------------------------------------------*/ /* compute p,q from P,Q and myid */ p = myid % P; q = ( myid - p) / P; /*----------------------------------------------------------- * Generate the matrix *-----------------------------------------------------------*/ A = (HYPRE_ParCSRMatrix) GenerateRotate7pt(hypre_MPI_COMM_WORLD, nx, ny, P, Q, p, q, alpha, eps); *A_ptr = A; return (0); } /*---------------------------------------------------------------------- * Build standard 7-point difference operator using centered differences * * eps*(a(x,y,z) ux)x + (b(x,y,z) uy)y + (c(x,y,z) uz)z * d(x,y,z) ux + e(x,y,z) uy + f(x,y,z) uz + g(x,y,z) u * * functions a,b,c,d,e,f,g need to be defined inside par_vardifconv.c * *----------------------------------------------------------------------*/ HYPRE_Int BuildParVarDifConv( HYPRE_Int argc, char *argv[], HYPRE_Int arg_index, HYPRE_ParCSRMatrix *A_ptr, HYPRE_ParVector *rhs_ptr ) { HYPRE_BigInt nx, ny, nz; HYPRE_Int P, Q, R; HYPRE_ParCSRMatrix A; HYPRE_ParVector rhs; HYPRE_Int num_procs, myid; HYPRE_Int p, q, r; HYPRE_Int type; HYPRE_Real eps; /*----------------------------------------------------------- * Initialize some stuff *-----------------------------------------------------------*/ hypre_MPI_Comm_size(hypre_MPI_COMM_WORLD, &num_procs ); hypre_MPI_Comm_rank(hypre_MPI_COMM_WORLD, &myid ); /*----------------------------------------------------------- * Set defaults *-----------------------------------------------------------*/ nx = 10; ny = 10; nz = 10; P = 1; Q = num_procs; R = 1; eps = 1.0; /* type: 0 : default FD; * 1-3 : FD and examples 1-3 in Ruge-Stuben paper */ type = 0; /*----------------------------------------------------------- * Parse command line *-----------------------------------------------------------*/ arg_index = 0; while (arg_index < argc) { if ( strcmp(argv[arg_index], "-n") == 0 ) { arg_index++; nx = atoi(argv[arg_index++]); ny = atoi(argv[arg_index++]); nz = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-P") == 0 ) { arg_index++; P = atoi(argv[arg_index++]); Q = atoi(argv[arg_index++]); R = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-eps") == 0 ) { arg_index++; eps = (HYPRE_Real)atof(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-vardifconvRS") == 0 ) { arg_index++; type = atoi(argv[arg_index++]); } else { arg_index++; } } /*----------------------------------------------------------- * Check a few things *-----------------------------------------------------------*/ if ((P * Q * R) != num_procs) { hypre_printf("Error: Invalid number of processors or processor topology \n"); exit(1); } /*----------------------------------------------------------- * Print driver parameters *-----------------------------------------------------------*/ if (myid == 0) { hypre_printf(" ell PDE: eps = %f\n", eps); hypre_printf(" Dx(aDxu) + Dy(bDyu) + Dz(cDzu) + d Dxu + e Dyu + f Dzu + g u= f\n"); hypre_printf(" (nx, ny, nz) = (%b, %b, %b)\n", nx, ny, nz); hypre_printf(" (Px, Py, Pz) = (%d, %d, %d)\n", P, Q, R); } /*----------------------------------------------------------- * Set up the grid structure *-----------------------------------------------------------*/ /* compute p,q,r from P,Q,R and myid */ p = myid % P; q = (( myid - p) / P) % Q; r = ( myid - p - P * q) / ( P * Q ); /*----------------------------------------------------------- * Generate the matrix *-----------------------------------------------------------*/ if (0 == type) { A = (HYPRE_ParCSRMatrix) GenerateVarDifConv(hypre_MPI_COMM_WORLD, nx, ny, nz, P, Q, R, p, q, r, eps, &rhs); } else { A = (HYPRE_ParCSRMatrix) GenerateRSVarDifConv(hypre_MPI_COMM_WORLD, nx, ny, nz, P, Q, R, p, q, r, eps, &rhs, type); } *A_ptr = A; *rhs_ptr = rhs; return (0); } /**************************************************************************/ HYPRE_Int SetSysVcoefValues(HYPRE_Int num_fun, HYPRE_BigInt nx, HYPRE_BigInt ny, HYPRE_BigInt nz, HYPRE_Real vcx, HYPRE_Real vcy, HYPRE_Real vcz, HYPRE_Int mtx_entry, HYPRE_Real *values) { HYPRE_Int sz = num_fun * num_fun; values[1 * sz + mtx_entry] = -vcx; values[2 * sz + mtx_entry] = -vcy; values[3 * sz + mtx_entry] = -vcz; values[0 * sz + mtx_entry] = 0.0; if (nx > 1) { values[0 * sz + mtx_entry] += 2.0 * vcx; } if (ny > 1) { values[0 * sz + mtx_entry] += 2.0 * vcy; } if (nz > 1) { values[0 * sz + mtx_entry] += 2.0 * vcz; } return 0; } /*---------------------------------------------------------------------- * Build coordinates for 1D/2D/3D *----------------------------------------------------------------------*/ HYPRE_Int BuildParCoordinates( HYPRE_Int argc, char *argv[], HYPRE_Int arg_index, HYPRE_Int *coorddim_ptr, float **coord_ptr ) { HYPRE_BigInt nx, ny, nz; HYPRE_Int P, Q, R; HYPRE_Int num_procs, myid; HYPRE_Int p, q, r; HYPRE_Int coorddim; float *coordinates; /*----------------------------------------------------------- * Initialize some stuff *-----------------------------------------------------------*/ hypre_MPI_Comm_size(hypre_MPI_COMM_WORLD, &num_procs ); hypre_MPI_Comm_rank(hypre_MPI_COMM_WORLD, &myid ); /*----------------------------------------------------------- * Set defaults *-----------------------------------------------------------*/ nx = 10; ny = 10; nz = 10; P = 1; Q = num_procs; R = 1; /*----------------------------------------------------------- * Parse command line *-----------------------------------------------------------*/ arg_index = 0; while (arg_index < argc) { if ( strcmp(argv[arg_index], "-n") == 0 ) { arg_index++; nx = atoi(argv[arg_index++]); ny = atoi(argv[arg_index++]); nz = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-P") == 0 ) { arg_index++; P = atoi(argv[arg_index++]); Q = atoi(argv[arg_index++]); R = atoi(argv[arg_index++]); } else { arg_index++; } } /* compute p,q,r from P,Q,R and myid */ p = myid % P; q = (( myid - p) / P) % Q; r = ( myid - p - P * q) / ( P * Q ); /*----------------------------------------------------------- * Generate the coordinates *-----------------------------------------------------------*/ coorddim = 3; if (nx < 2) { coorddim--; } if (ny < 2) { coorddim--; } if (nz < 2) { coorddim--; } if (coorddim > 0) { coordinates = hypre_GenerateCoordinates(hypre_MPI_COMM_WORLD, nx, ny, nz, P, Q, R, p, q, r, coorddim); } else { coordinates = NULL; } *coorddim_ptr = coorddim; *coord_ptr = coordinates; return (0); } /* begin lobpcg */ /*---------------------------------------------------------------------- * Build standard 7-point laplacian in 3D. *----------------------------------------------------------------------*/ HYPRE_Int BuildParIsoLaplacian( HYPRE_Int argc, char** argv, HYPRE_ParCSRMatrix *A_ptr ) { HYPRE_BigInt nx, ny, nz; HYPRE_Real cx, cy, cz; HYPRE_Int P, Q, R; HYPRE_ParCSRMatrix A; HYPRE_Int num_procs, myid; HYPRE_Int p, q, r; HYPRE_Real *values; HYPRE_Int arg_index; /*----------------------------------------------------------- * Initialize some stuff *-----------------------------------------------------------*/ hypre_MPI_Comm_size(hypre_MPI_COMM_WORLD, &num_procs ); hypre_MPI_Comm_rank(hypre_MPI_COMM_WORLD, &myid ); /*----------------------------------------------------------- * Set defaults *-----------------------------------------------------------*/ P = 1; Q = num_procs; R = 1; nx = 10; ny = 10; nz = 10; cx = 1.0; cy = 1.0; cz = 1.0; arg_index = 0; while (arg_index < argc) { if ( strcmp(argv[arg_index], "-n") == 0 ) { arg_index++; nx = atoi(argv[arg_index++]); ny = atoi(argv[arg_index++]); nz = atoi(argv[arg_index++]); } else { arg_index++; } } /*----------------------------------------------------------- * Print driver parameters *-----------------------------------------------------------*/ if (myid == 0) { hypre_printf(" Laplacian:\n"); hypre_printf(" (nx, ny, nz) = (%b, %b, %b)\n", nx, ny, nz); hypre_printf(" (Px, Py, Pz) = (%d, %d, %d)\n", P, Q, R); hypre_printf(" (cx, cy, cz) = (%f, %f, %f)\n\n", cx, cy, cz); } /*----------------------------------------------------------- * Set up the grid structure *-----------------------------------------------------------*/ /* compute p,q,r from P,Q,R and myid */ p = myid % P; q = (( myid - p) / P) % Q; r = ( myid - p - P * q) / ( P * Q ); /*----------------------------------------------------------- * Generate the matrix *-----------------------------------------------------------*/ values = hypre_CTAlloc(HYPRE_Real, 4, HYPRE_MEMORY_HOST); values[1] = -cx; values[2] = -cy; values[3] = -cz; values[0] = 0.; if (nx > 1) { values[0] += 2.0 * cx; } if (ny > 1) { values[0] += 2.0 * cy; } if (nz > 1) { values[0] += 2.0 * cz; } A = (HYPRE_ParCSRMatrix) GenerateLaplacian(hypre_MPI_COMM_WORLD, nx, ny, nz, P, Q, R, p, q, r, values); hypre_TFree(values, HYPRE_MEMORY_HOST); *A_ptr = A; return (0); } /* end lobpcg */ hypre-2.33.0/src/test/ij_assembly.c000066400000000000000000000756021477326011500171610ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /*-------------------------------------------------------------------------- * Test driver for unstructured matrix interface (IJ). * * It tests the assembly phase of an IJ matrix in both CPU and GPU. *--------------------------------------------------------------------------*/ #include "HYPRE.h" #include "HYPRE_utilities.h" #include "_hypre_IJ_mv.h" #include "_hypre_parcsr_mv.h" #include "HYPRE_parcsr_ls.h" #include "_hypre_utilities.h" //#include "_hypre_utilities.hpp" HYPRE_Int buildMatrixEntries(MPI_Comm comm, HYPRE_Int nx, HYPRE_Int ny, HYPRE_Int nz, HYPRE_Int Px, HYPRE_Int Py, HYPRE_Int Pz, HYPRE_Real cx, HYPRE_Real cy, HYPRE_Real cz, HYPRE_Int base, HYPRE_BigInt *ilower, HYPRE_BigInt *iupper, HYPRE_BigInt *jlower, HYPRE_BigInt *jupper, HYPRE_Int *nrows, HYPRE_BigInt *num_nonzeros, HYPRE_Int **nnzrow_ptr, HYPRE_BigInt **rows_ptr, HYPRE_BigInt **rows_coo_ptr, HYPRE_BigInt **cols_ptr, HYPRE_Real **coefs_ptr, HYPRE_Int stencil, HYPRE_ParCSRMatrix *parcsr_ptr); HYPRE_Int getParCSRMatrixData(HYPRE_ParCSRMatrix A, HYPRE_Int base, HYPRE_Int *nrows_ptr, HYPRE_BigInt *num_nonzeros_ptr, HYPRE_Int **nnzrow_ptr, HYPRE_BigInt **rows_ptr, HYPRE_BigInt **rows_coo_ptr, HYPRE_BigInt **cols_ptr, HYPRE_Real **coefs_ptr); HYPRE_Real checkMatrix(HYPRE_ParCSRMatrix parcsr_ref, HYPRE_IJMatrix ij_A); HYPRE_Int test_all(MPI_Comm comm, const char *test_name, HYPRE_MemoryLocation memory_location, HYPRE_Int option, const char *cmd_sequence, HYPRE_BigInt ilower, HYPRE_BigInt iupper, HYPRE_BigInt jlower, HYPRE_BigInt jupper, HYPRE_Int nrows, HYPRE_BigInt num_nonzeros, HYPRE_Int nchunks, HYPRE_Int init_alloc, HYPRE_Int early_assemble, HYPRE_Real grow_factor, HYPRE_Int *h_nnzrow, HYPRE_Int *nnzrow, HYPRE_BigInt *rows, HYPRE_BigInt *cols, HYPRE_Real *coefs, HYPRE_IJMatrix *ij_A_ptr); hypre_int main( hypre_int argc, char *argv[] ) { MPI_Comm comm = hypre_MPI_COMM_WORLD; HYPRE_Int num_procs; HYPRE_Int myid; HYPRE_Int arg_index; HYPRE_Int time_index; HYPRE_Int print_usage; HYPRE_MemoryLocation memory_location; #if defined(HYPRE_USING_GPU) || defined(HYPRE_USING_DEVICE_OPENMP) HYPRE_ExecutionPolicy default_exec_policy; #endif char memory_location_name[8]; HYPRE_Int nrows; HYPRE_BigInt num_nonzeros; HYPRE_BigInt ilower, iupper; HYPRE_BigInt jlower, jupper; HYPRE_Int *nnzrow = NULL, *h_nnzrow, *d_nnzrow = NULL; HYPRE_BigInt *rows = NULL, *h_rows, *d_rows = NULL; HYPRE_BigInt *rows_coo = NULL, *h_rows_coo, *d_rows_coo = NULL; HYPRE_BigInt *cols = NULL, *h_cols, *d_cols = NULL; HYPRE_Real *coefs = NULL, *h_coefs, *d_coefs = NULL; HYPRE_IJMatrix ij_A, ij_AT; HYPRE_ParCSRMatrix parcsr_ref = NULL, parcsr_trans = NULL; // Driver input parameters HYPRE_Int Px, Py, Pz; HYPRE_Int nx, ny, nz; HYPRE_Real cx, cy, cz; HYPRE_Int nchunks; HYPRE_Int mode, ierr = 0; HYPRE_Real tol = HYPRE_REAL_EPSILON; HYPRE_Int option, base; HYPRE_Int stencil; HYPRE_Int print_matrix; HYPRE_Int init_alloc = -1; HYPRE_Int early_assemble = 0; HYPRE_Real grow_factor = -1.0; /* Initialize MPI */ hypre_MPI_Init(&argc, &argv); hypre_MPI_Comm_size(comm, &num_procs ); hypre_MPI_Comm_rank(comm, &myid ); /*----------------------------------------------------------------- * GPU Device binding * Must be done before HYPRE_Initialize() and should not be changed after *-----------------------------------------------------------------*/ hypre_bind_device_id(-1, myid, num_procs, hypre_MPI_COMM_WORLD); /* Initialize Hypre */ /* Initialize Hypre: must be the first Hypre function to call */ time_index = hypre_InitializeTiming("Hypre init"); hypre_BeginTiming(time_index); HYPRE_Initialize(); HYPRE_DeviceInitialize(); hypre_EndTiming(time_index); hypre_PrintTiming("Hypre init times", hypre_MPI_COMM_WORLD); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); /*----------------------------------------------------------- * Set default parameters *-----------------------------------------------------------*/ Px = num_procs; Py = 1; Pz = 1; nx = 100; ny = 101; nz = 102; cx = 1.0; cy = 2.0; cz = 3.0; #if defined(HYPRE_USING_GPU) || defined(HYPRE_USING_DEVICE_OPENMP) default_exec_policy = HYPRE_EXEC_DEVICE; #endif memory_location = HYPRE_MEMORY_DEVICE; mode = (1 << 7) - 1; option = 1; nchunks = 3; base = 0; print_matrix = 0; stencil = 7; /*----------------------------------------------------------- * Parse command line *-----------------------------------------------------------*/ print_usage = 0; arg_index = 1; while ( (arg_index < argc) && (!print_usage) ) { if ( strcmp(argv[arg_index], "-memory_location") == 0 ) { arg_index++; memory_location = (HYPRE_MemoryLocation) atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-P") == 0 ) { arg_index++; Px = atoi(argv[arg_index++]); Py = atoi(argv[arg_index++]); Pz = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-n") == 0 ) { arg_index++; nx = atoi(argv[arg_index++]); ny = atoi(argv[arg_index++]); nz = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-c") == 0 ) { arg_index++; cx = (HYPRE_Real)atof(argv[arg_index++]); cy = (HYPRE_Real)atof(argv[arg_index++]); cz = (HYPRE_Real)atof(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-mode") == 0 ) { arg_index++; mode = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-option") == 0 ) { arg_index++; option = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-9pt") == 0 ) { arg_index++; stencil = 9; } else if ( strcmp(argv[arg_index], "-27pt") == 0 ) { arg_index++; stencil = 27; } else if ( strcmp(argv[arg_index], "-nchunks") == 0 ) { arg_index++; nchunks = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-base") == 0 ) { arg_index++; base = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-init") == 0 ) { arg_index++; init_alloc = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-early") == 0 ) { arg_index++; early_assemble = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-grow") == 0 ) { arg_index++; grow_factor = (HYPRE_Real) atof(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-print") == 0 ) { arg_index++; print_matrix = 1; } else { print_usage = 1; break; } } /*----------------------------------------------------------- * Safety checks *-----------------------------------------------------------*/ if (Px * Py * Pz != num_procs) { hypre_printf("Px x Py x Pz is different than the number of MPI processes"); return (-1); } /*----------------------------------------------------------- * Print usage info *-----------------------------------------------------------*/ if ( print_usage ) { if ( myid == 0 ) { hypre_printf("\n"); hypre_printf("Usage: %s []\n", argv[0]); hypre_printf("\n"); hypre_printf(" -n : total problem size \n"); hypre_printf(" -P : processor topology\n"); hypre_printf(" -c : diffusion coefficients\n"); hypre_printf(" -memory_location : memory location of the assembled matrix\n"); hypre_printf(" 0 = HOST\n"); hypre_printf(" 1 = DEVICE (default)\n"); hypre_printf(" -nchunks : number of chunks passed to Set/AddValues\n"); hypre_printf(" -base : matrix index base\n"); hypre_printf(" -mode : tests to be performed\n"); hypre_printf(" 1 = Set (default)\n"); hypre_printf(" 2 = SetOffProc\n"); hypre_printf(" 4 = SetSet\n"); hypre_printf(" 8 = AddSet\n"); hypre_printf(" 16 = SetAddSet\n"); hypre_printf(" -option : interface option of Set/AddToValues\n"); hypre_printf(" 1 = CSR-like (default)\n"); hypre_printf(" 2 = COO-like\n"); hypre_printf(" -print : print matrices\n"); hypre_printf("\n"); } return (0); } #if defined(HYPRE_USING_MEMORY_TRACKER) hypre_MemoryTrackerSetPrint(1); #endif /*----------------------------------------------------------- * Print driver parameters *-----------------------------------------------------------*/ switch (memory_location) { case HYPRE_MEMORY_UNDEFINED: return -1; case HYPRE_MEMORY_DEVICE: hypre_sprintf(memory_location_name, "Device"); break; case HYPRE_MEMORY_HOST: hypre_sprintf(memory_location_name, "Host"); break; } if (myid == 0) { hypre_printf(" Memory location: %s\n", memory_location_name); hypre_printf(" (nx, ny, nz) = (%b, %b, %b)\n", nx, ny, nz); hypre_printf(" (Px, Py, Pz) = (%d, %d, %d)\n", Px, Py, Pz); hypre_printf(" (cx, cy, cz) = (%f, %f, %f)\n", cx, cy, cz); hypre_printf("\n"); } #if defined(HYPRE_USING_GPU) || defined(HYPRE_USING_DEVICE_OPENMP) hypre_HandleDefaultExecPolicy(hypre_handle()) = default_exec_policy; #endif #if defined(HYPRE_USING_OPENMP) if (hypre_GetExecPolicy1(memory_location) == HYPRE_EXEC_HOST) { mode = mode & ~2; /* skip AddTranspose with OMP */ } #endif /*----------------------------------------------------------- * Build matrix entries *-----------------------------------------------------------*/ buildMatrixEntries(comm, nx, ny, nz, Px, Py, Pz, cx, cy, cz, base, &ilower, &iupper, &jlower, &jupper, &nrows, &num_nonzeros, &h_nnzrow, &h_rows, &h_rows_coo, &h_cols, &h_coefs, stencil, &parcsr_ref); switch (memory_location) { case HYPRE_MEMORY_DEVICE: d_nnzrow = hypre_TAlloc(HYPRE_Int, nrows, HYPRE_MEMORY_DEVICE); d_rows = hypre_TAlloc(HYPRE_BigInt, nrows, HYPRE_MEMORY_DEVICE); d_rows_coo = hypre_TAlloc(HYPRE_BigInt, num_nonzeros, HYPRE_MEMORY_DEVICE); d_cols = hypre_TAlloc(HYPRE_BigInt, num_nonzeros, HYPRE_MEMORY_DEVICE); d_coefs = hypre_TAlloc(HYPRE_Real, num_nonzeros, HYPRE_MEMORY_DEVICE); hypre_TMemcpy(d_nnzrow, h_nnzrow, HYPRE_Int, nrows, HYPRE_MEMORY_DEVICE, HYPRE_MEMORY_HOST); hypre_TMemcpy(d_rows, h_rows, HYPRE_BigInt, nrows, HYPRE_MEMORY_DEVICE, HYPRE_MEMORY_HOST); hypre_TMemcpy(d_rows_coo, h_rows_coo, HYPRE_BigInt, num_nonzeros, HYPRE_MEMORY_DEVICE, HYPRE_MEMORY_HOST); hypre_TMemcpy(d_cols, h_cols, HYPRE_BigInt, num_nonzeros, HYPRE_MEMORY_DEVICE, HYPRE_MEMORY_HOST); hypre_TMemcpy(d_coefs, h_coefs, HYPRE_Real, num_nonzeros, HYPRE_MEMORY_DEVICE, HYPRE_MEMORY_HOST); nnzrow = d_nnzrow; rows = d_rows; rows_coo = d_rows_coo; cols = d_cols; coefs = d_coefs; break; case HYPRE_MEMORY_HOST: nnzrow = h_nnzrow; rows = h_rows; rows_coo = h_rows_coo; cols = h_cols; coefs = h_coefs; break; case HYPRE_MEMORY_UNDEFINED: return -1; } /*----------------------------------------------------------- * Test different Set/Add combinations *-----------------------------------------------------------*/ /* Test Set */ if (mode & 1) { test_all(comm, "set", memory_location, option, "sA", ilower, iupper, jlower, jupper, nrows, num_nonzeros, nchunks, init_alloc, early_assemble, grow_factor, h_nnzrow, nnzrow, option == 1 ? rows : rows_coo, cols, coefs, &ij_A); ierr += checkMatrix(parcsr_ref, ij_A) > tol; if (print_matrix) { HYPRE_IJMatrixPrint(ij_A, "ij_Set"); } HYPRE_IJMatrixDestroy(ij_A); } /* Test AddTranspose * set values with (row, col) reversed, i.e., the transpose of A * in this way, we can test off-proc add to values */ if (mode & 2) { test_all(comm, "addtrans", memory_location, 2, "aaaaaA", ilower, iupper, jlower, jupper, nrows, num_nonzeros, nchunks, init_alloc, early_assemble, grow_factor, h_nnzrow, nnzrow, cols, rows_coo, coefs, &ij_AT); hypre_ParCSRMatrixTranspose(parcsr_ref, &parcsr_trans, 1); hypre_ParCSRMatrixScale(parcsr_trans, 5.0); ierr += checkMatrix(parcsr_trans, ij_AT) > tol; if (print_matrix) { HYPRE_IJMatrixPrint(ij_AT, "ij_AddTrans"); } HYPRE_IJMatrixDestroy(ij_AT); HYPRE_ParCSRMatrixDestroy(parcsr_trans); } /* Test Set/Set */ if (mode & 4) { test_all(comm, "set/set", memory_location, option, "ssA", ilower, iupper, jlower, jupper, nrows, num_nonzeros, nchunks, init_alloc, early_assemble, grow_factor, h_nnzrow, nnzrow, option == 1 ? rows : rows_coo, cols, coefs, &ij_A); ierr += checkMatrix(parcsr_ref, ij_A) > tol; if (print_matrix) { HYPRE_IJMatrixPrint(ij_A, "ij_SetSet"); } HYPRE_IJMatrixDestroy(ij_A); } /* Test Add/Set */ if (mode & 8) { test_all(comm, "add/set", memory_location, option, "asA", ilower, iupper, jlower, jupper, nrows, num_nonzeros, nchunks, init_alloc, early_assemble, grow_factor, h_nnzrow, nnzrow, option == 1 ? rows : rows_coo, cols, coefs, &ij_A); ierr += checkMatrix(parcsr_ref, ij_A) > tol; if (print_matrix) { HYPRE_IJMatrixPrint(ij_A, "ij_AddSet"); } HYPRE_IJMatrixDestroy(ij_A); } /* Test Set/Add */ if (mode & 16) { test_all(comm, "set/add", memory_location, option, "saA", ilower, iupper, jlower, jupper, nrows, num_nonzeros, nchunks, init_alloc, early_assemble, grow_factor, h_nnzrow, nnzrow, option == 1 ? rows : rows_coo, cols, coefs, &ij_A); hypre_ParCSRMatrix *parcsr_ref2 = hypre_ParCSRMatrixClone(parcsr_ref, 1); hypre_ParCSRMatrixScale(parcsr_ref2, 2.0); ierr += checkMatrix(parcsr_ref2, ij_A) > tol; if (print_matrix) { HYPRE_IJMatrixPrint(ij_A, "ij_SetAdd"); } HYPRE_IJMatrixDestroy(ij_A); HYPRE_ParCSRMatrixDestroy(parcsr_ref2); } /* Test Set/Add/Assemble/Set */ if (mode & 32) { test_all(comm, "set/add/assemble/set", memory_location, option, "saAsA", ilower, iupper, jlower, jupper, nrows, num_nonzeros, nchunks, init_alloc, early_assemble, grow_factor, h_nnzrow, nnzrow, option == 1 ? rows : rows_coo, cols, coefs, &ij_A); ierr += checkMatrix(parcsr_ref, ij_A) > tol; if (print_matrix) { HYPRE_IJMatrixPrint(ij_A, "ij_SetAddAssembleSet"); } HYPRE_IJMatrixDestroy(ij_A); } /* Test Adds */ if (mode & 64) { test_all(comm, "5adds/set", memory_location, option, "aaaaasA", ilower, iupper, jlower, jupper, nrows, num_nonzeros, nchunks, init_alloc, early_assemble, grow_factor, h_nnzrow, nnzrow, option == 1 ? rows : rows_coo, cols, coefs, &ij_A); hypre_ParCSRMatrix *parcsr_ref2 = hypre_ParCSRMatrixClone(parcsr_ref, 1); hypre_ParCSRMatrixScale(parcsr_ref2, 1.); ierr += checkMatrix(parcsr_ref2, ij_A) > tol; if (print_matrix) { HYPRE_IJMatrixPrint(ij_A, "ij_5AddsSet"); } HYPRE_IJMatrixDestroy(ij_A); HYPRE_ParCSRMatrixDestroy(parcsr_ref2); } /* Print the error code */ hypre_ParPrintf(comm, "Test error code = %d\n", ierr); /*----------------------------------------------------------- * Free memory *-----------------------------------------------------------*/ if (memory_location == HYPRE_MEMORY_DEVICE) { hypre_TFree(d_nnzrow, HYPRE_MEMORY_DEVICE); hypre_TFree(d_rows, HYPRE_MEMORY_DEVICE); hypre_TFree(d_rows_coo, HYPRE_MEMORY_DEVICE); hypre_TFree(d_cols, HYPRE_MEMORY_DEVICE); hypre_TFree(d_coefs, HYPRE_MEMORY_DEVICE); } hypre_TFree(h_nnzrow, HYPRE_MEMORY_HOST); hypre_TFree(h_rows, HYPRE_MEMORY_HOST); hypre_TFree(h_rows_coo, HYPRE_MEMORY_HOST); hypre_TFree(h_cols, HYPRE_MEMORY_HOST); hypre_TFree(h_coefs, HYPRE_MEMORY_HOST); HYPRE_ParCSRMatrixDestroy(parcsr_ref); /* Finalize Hypre */ HYPRE_Finalize(); /* Finalize MPI */ hypre_MPI_Finalize(); /* when using cuda-memcheck --leak-check full, uncomment this */ #if defined(HYPRE_USING_GPU) hypre_ResetDevice(); #endif return (0); } HYPRE_Int buildMatrixEntries(MPI_Comm comm, HYPRE_Int nx, HYPRE_Int ny, HYPRE_Int nz, HYPRE_Int Px, HYPRE_Int Py, HYPRE_Int Pz, HYPRE_Real cx, HYPRE_Real cy, HYPRE_Real cz, HYPRE_Int base, HYPRE_BigInt *ilower_ptr, HYPRE_BigInt *iupper_ptr, HYPRE_BigInt *jlower_ptr, HYPRE_BigInt *jupper_ptr, HYPRE_Int *nrows_ptr, HYPRE_BigInt *num_nonzeros_ptr, HYPRE_Int **nnzrow_ptr, HYPRE_BigInt **rows_ptr, /* row indices of length nrows */ HYPRE_BigInt **rows_coo_ptr, /* row indices of length nnz */ HYPRE_BigInt **cols_ptr, /* col indices of length nnz */ HYPRE_Real **coefs_ptr, /* values of length nnz */ HYPRE_Int stencil, HYPRE_ParCSRMatrix *parcsr_ptr) { HYPRE_Int num_procs; HYPRE_Int myid; HYPRE_Real values[4]; HYPRE_ParCSRMatrix A = NULL; hypre_MPI_Comm_size(comm, &num_procs ); hypre_MPI_Comm_rank(comm, &myid ); HYPRE_Int ip = myid % Px; HYPRE_Int iq = (( myid - ip) / Px) % Py; HYPRE_Int ir = ( myid - ip - Px * iq) / ( Px * Py ); values[0] = 0; values[1] = -cx; values[2] = -cy; values[3] = -cz; if (stencil == 7) { A = (HYPRE_ParCSRMatrix) GenerateLaplacian(comm, nx, ny, nz, Px, Py, Pz, ip, iq, ir, values); } else if (stencil == 9) { A = (HYPRE_ParCSRMatrix) GenerateLaplacian9pt(comm, nx, ny, Px, Py, ip, iq, values); } else if (stencil == 27) { A = (HYPRE_ParCSRMatrix) GenerateLaplacian27pt(comm, nx, ny, nz, Px, Py, Pz, ip, iq, ir, values); } else { hypre_assert(0); } hypre_ParCSRMatrixMigrate(A, HYPRE_MEMORY_HOST); /* modify the upper triangular part to A nonsymmetric */ HYPRE_Int i, j; HYPRE_Int nrows = hypre_ParCSRMatrixNumRows(A); hypre_CSRMatrix *A_diag = hypre_ParCSRMatrixDiag(A); hypre_CSRMatrix *A_offd = hypre_ParCSRMatrixOffd(A); HYPRE_Int *A_diag_i = hypre_CSRMatrixI(A_diag); HYPRE_Int *A_diag_j = hypre_CSRMatrixJ(A_diag); HYPRE_Int *A_offd_i = hypre_CSRMatrixI(A_offd); HYPRE_Int *A_offd_j = hypre_CSRMatrixJ(A_offd); HYPRE_BigInt *col_map_offd_A = hypre_ParCSRMatrixColMapOffd(A); HYPRE_BigInt ilower = hypre_ParCSRMatrixFirstRowIndex(A); HYPRE_BigInt jlower = hypre_ParCSRMatrixFirstColDiag(A); for (i = 0; i < nrows; i++) { for (j = A_diag_i[i]; j < A_diag_i[i + 1]; j++) { HYPRE_BigInt row = ilower + (HYPRE_BigInt) i; HYPRE_BigInt col = jlower + (HYPRE_BigInt) A_diag_j[j]; if (row < col) { hypre_CSRMatrixData(A_diag)[j] += myid + .89; } } for (j = A_offd_i[i]; j < A_offd_i[i + 1]; j++) { HYPRE_BigInt row = ilower + (HYPRE_BigInt) i; HYPRE_BigInt col = col_map_offd_A[A_offd_j[j]]; if (row < col) { hypre_CSRMatrixData(A_offd)[j] += myid + .64; } } } /* get I, J, data from A */ getParCSRMatrixData(A, base, nrows_ptr, num_nonzeros_ptr, nnzrow_ptr, rows_ptr, rows_coo_ptr, cols_ptr, coefs_ptr); // Set pointers *ilower_ptr = hypre_ParCSRMatrixFirstRowIndex(A) + base; *iupper_ptr = hypre_ParCSRMatrixLastRowIndex(A) + base; *jlower_ptr = hypre_ParCSRMatrixFirstColDiag(A) + base; *jupper_ptr = hypre_ParCSRMatrixLastColDiag(A) + base; *parcsr_ptr = A; return hypre_error_flag; } HYPRE_Int getParCSRMatrixData(HYPRE_ParCSRMatrix A, HYPRE_Int base, HYPRE_Int *nrows_ptr, HYPRE_BigInt *num_nonzeros_ptr, HYPRE_Int **nnzrow_ptr, HYPRE_BigInt **rows_ptr, HYPRE_BigInt **rows_coo_ptr, HYPRE_BigInt **cols_ptr, HYPRE_Real **coefs_ptr) { hypre_CSRMatrix *A_diag = hypre_ParCSRMatrixDiag(A); hypre_CSRMatrix *A_offd = hypre_ParCSRMatrixOffd(A); HYPRE_Int *A_diag_i = hypre_CSRMatrixI(A_diag); HYPRE_Int *A_diag_j = hypre_CSRMatrixJ(A_diag); HYPRE_Int *A_offd_i = hypre_CSRMatrixI(A_offd); HYPRE_Int *A_offd_j = hypre_CSRMatrixJ(A_offd); HYPRE_BigInt *col_map_offd_A = hypre_ParCSRMatrixColMapOffd(A); HYPRE_BigInt ilower = hypre_ParCSRMatrixFirstRowIndex(A); HYPRE_BigInt jlower = hypre_ParCSRMatrixFirstColDiag(A); HYPRE_Int nrows; HYPRE_BigInt num_nonzeros; HYPRE_Int *nnzrow; HYPRE_BigInt *rows; HYPRE_BigInt *rows_coo; HYPRE_BigInt *cols; HYPRE_Real *coefs; HYPRE_Int i, j, k; nrows = hypre_ParCSRMatrixNumRows(A); num_nonzeros = hypre_CSRMatrixNumNonzeros(A_diag) + hypre_CSRMatrixNumNonzeros(A_offd); nnzrow = hypre_CTAlloc(HYPRE_Int, nrows, HYPRE_MEMORY_HOST); rows = hypre_CTAlloc(HYPRE_BigInt, nrows, HYPRE_MEMORY_HOST); rows_coo = hypre_CTAlloc(HYPRE_BigInt, num_nonzeros, HYPRE_MEMORY_HOST); cols = hypre_CTAlloc(HYPRE_BigInt, num_nonzeros, HYPRE_MEMORY_HOST); coefs = hypre_CTAlloc(HYPRE_Real, num_nonzeros, HYPRE_MEMORY_HOST); k = 0; #if 0 for (i = 0; i < nrows; i++) { nnzrow[i] = A_diag_i[i + 1] - A_diag_i[i] + A_offd_i[i + 1] - A_offd_i[i]; rows[i] = ilower + i; for (j = A_diag_i[i]; j < A_diag_i[i + 1]; j++) { rows_coo[k] = ilower + (HYPRE_BigInt) i; cols[k] = jlower + (HYPRE_BigInt) A_diag_j[j]; coefs[k++] = hypre_CSRMatrixData(A_diag)[j]; } for (j = A_offd_i[i]; j < A_offd_i[i + 1]; j++) { rows_coo[k] = ilower + (HYPRE_BigInt) i; cols[k] = hypre_ParCSRMatrixColMapOffd(A)[A_offd_j[j]]; coefs[k++] = hypre_CSRMatrixData(A_offd)[j]; } } #else for (i = nrows - 1; i >= 0; i--) { nnzrow[nrows - 1 - i] = A_diag_i[i + 1] - A_diag_i[i] + A_offd_i[i + 1] - A_offd_i[i]; rows[nrows - 1 - i] = ilower + i + base; for (j = A_diag_i[i]; j < A_diag_i[i + 1]; j++) { rows_coo[k] = ilower + (HYPRE_BigInt) i + base; cols[k] = jlower + (HYPRE_BigInt) A_diag_j[j] + base; coefs[k++] = hypre_CSRMatrixData(A_diag)[j]; } for (j = A_offd_i[i]; j < A_offd_i[i + 1]; j++) { rows_coo[k] = ilower + (HYPRE_BigInt) i + base; cols[k] = col_map_offd_A[A_offd_j[j]] + base; coefs[k++] = hypre_CSRMatrixData(A_offd)[j]; } } #endif hypre_assert(k == num_nonzeros); // Set pointers *nrows_ptr = nrows; *num_nonzeros_ptr = num_nonzeros; *nnzrow_ptr = nnzrow; *rows_ptr = rows; *rows_coo_ptr = rows_coo; *cols_ptr = cols; *coefs_ptr = coefs; return hypre_error_flag; } HYPRE_Real checkMatrix(HYPRE_ParCSRMatrix h_parcsr_ref, HYPRE_IJMatrix ij_A) { MPI_Comm comm = hypre_IJMatrixComm(ij_A); HYPRE_ParCSRMatrix parcsr_A = (HYPRE_ParCSRMatrix) hypre_IJMatrixObject(ij_A); HYPRE_ParCSRMatrix h_parcsr_A; HYPRE_ParCSRMatrix parcsr_error; HYPRE_Real fnorm_err, fnorm_ref, rel_err; h_parcsr_A = hypre_ParCSRMatrixClone_v2(parcsr_A, 1, HYPRE_MEMORY_HOST); // Check norm of (parcsr_ref - parcsr_A) hypre_ParCSRMatrixAdd(1.0, h_parcsr_ref, -1.0, h_parcsr_A, &parcsr_error); fnorm_err = hypre_ParCSRMatrixFnorm(parcsr_error); fnorm_ref = hypre_ParCSRMatrixFnorm(h_parcsr_ref); rel_err = fnorm_err / fnorm_ref; hypre_ParPrintf(comm, "||A_ref - A||_F / ||A_ref||_F: %e\n", rel_err); HYPRE_ParCSRMatrixDestroy(h_parcsr_A); HYPRE_ParCSRMatrixDestroy(parcsr_error); return rel_err; } /* ---------------------------------- * * All test functions for assembly * * option = 1: length of nrows, * * = 2: length of num_nonzeros * * ---------------------------------- */ /* set values */ HYPRE_Int test_all(MPI_Comm comm, const char *test_name, HYPRE_MemoryLocation memory_location, HYPRE_Int option, const char *cmd_sequence, HYPRE_BigInt ilower, HYPRE_BigInt iupper, HYPRE_BigInt jlower, HYPRE_BigInt jupper, HYPRE_Int nrows, HYPRE_BigInt num_nonzeros, HYPRE_Int nchunks, HYPRE_Int init_alloc, HYPRE_Int early_assemble, HYPRE_Real grow_factor, HYPRE_Int *h_nnzrow, HYPRE_Int *nnzrow, HYPRE_BigInt *rows, HYPRE_BigInt *cols, HYPRE_Real *coefs, HYPRE_IJMatrix *ij_A_ptr) { HYPRE_IJMatrix ij_A; HYPRE_Int i, j, chunk, chunk_size; HYPRE_Int time_index; HYPRE_Int *h_rowptr = hypre_CTAlloc(HYPRE_Int, nrows + 1, HYPRE_MEMORY_HOST); HYPRE_Int cmd_len = strlen(cmd_sequence); HYPRE_Int myid; hypre_MPI_Comm_rank(comm, &myid); for (i = 1; i < nrows + 1; i++) { h_rowptr[i] = h_rowptr[i - 1] + h_nnzrow[i - 1]; } hypre_assert(h_rowptr[nrows] == num_nonzeros); HYPRE_IJMatrixCreate(comm, ilower, iupper, jlower, jupper, &ij_A); HYPRE_IJMatrixSetObjectType(ij_A, HYPRE_PARCSR); HYPRE_IJMatrixInitialize_v2(ij_A, memory_location); HYPRE_IJMatrixSetOMPFlag(ij_A, 1); grow_factor = myid ? grow_factor : 2 * grow_factor; if (init_alloc >= 0) { HYPRE_IJMatrixSetInitAllocation(ij_A, init_alloc); } HYPRE_IJMatrixSetEarlyAssemble(ij_A, early_assemble); if (grow_factor > 0) { HYPRE_IJMatrixSetGrowFactor(ij_A, grow_factor); } chunk_size = nrows / nchunks; #if defined(HYPRE_USING_GPU) hypre_SyncDevice(); #if defined(CUDA_PROFILER) cudaProfilerStart(); #endif #endif time_index = hypre_InitializeTiming(test_name); hypre_BeginTiming(time_index); for (j = 0; j < cmd_len; j++) { if (cmd_sequence[j] == 's' || cmd_sequence[j] == 'a') { for (chunk = 0; chunk < nrows; chunk += chunk_size) { chunk_size = hypre_min(chunk_size, nrows - chunk); if (1 == option) { if (cmd_sequence[j] == 's') { HYPRE_IJMatrixSetValues(ij_A, chunk_size, &nnzrow[chunk], &rows[chunk], &cols[h_rowptr[chunk]], &coefs[h_rowptr[chunk]]); } else { HYPRE_IJMatrixAddToValues(ij_A, chunk_size, &nnzrow[chunk], &rows[chunk], &cols[h_rowptr[chunk]], &coefs[h_rowptr[chunk]]); } } else { if (cmd_sequence[j] == 's') { HYPRE_IJMatrixSetValues(ij_A, h_rowptr[chunk + chunk_size] - h_rowptr[chunk], NULL, &rows[h_rowptr[chunk]], &cols[h_rowptr[chunk]], &coefs[h_rowptr[chunk]]); } else { HYPRE_IJMatrixAddToValues(ij_A, h_rowptr[chunk + chunk_size] - h_rowptr[chunk], NULL, &rows[h_rowptr[chunk]], &cols[h_rowptr[chunk]], &coefs[h_rowptr[chunk]]); } } } } else if (cmd_sequence[j] == 'A') { HYPRE_IJMatrixAssemble(ij_A); } } #if defined(HYPRE_USING_GPU) hypre_SyncDevice(); #if defined(CUDA_PROFILER) cudaProfilerStop(); #endif #endif // Finalize timer hypre_EndTiming(time_index); hypre_PrintTiming(test_name, hypre_MPI_COMM_WORLD); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); // Free memory hypre_TFree(h_rowptr, HYPRE_MEMORY_HOST); // Set pointer to matrix *ij_A_ptr = ij_A; return hypre_error_flag; } hypre-2.33.0/src/test/ij_device.c000066400000000000000000002205161477326011500165750ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /*-------------------------------------------------------------------------- * Test driver for unstructured matrix interface (IJ_matrix interface). * Do `driver -help' for usage info. * This driver started from the driver for parcsr_linear_solvers, and it * works by first building a parcsr matrix as before and then "copying" * that matrix row-by-row into the IJMatrix interface. AJC 7/99. *--------------------------------------------------------------------------*/ #include #include #include #include "_hypre_utilities.h" #include "HYPRE.h" #include "HYPRE_parcsr_mv.h" #include "HYPRE_IJ_mv.h" #include "HYPRE_parcsr_ls.h" #include "_hypre_parcsr_ls.h" #include "_hypre_parcsr_mv.h" #include "HYPRE_krylov.h" #include "cuda_profiler_api.h" #ifdef __cplusplus extern "C" { #endif HYPRE_Int BuildParFromFile (HYPRE_Int argc, char *argv [], HYPRE_Int arg_index, HYPRE_ParCSRMatrix *A_ptr ); HYPRE_Int BuildParRhsFromFile (HYPRE_Int argc, char *argv [], HYPRE_Int arg_index, HYPRE_ParVector *b_ptr ); HYPRE_Int BuildParLaplacian (HYPRE_Int argc, char *argv [], HYPRE_Int arg_index, HYPRE_ParCSRMatrix *A_ptr ); HYPRE_Int BuildParSysLaplacian (HYPRE_Int argc, char *argv [], HYPRE_Int arg_index, HYPRE_ParCSRMatrix *A_ptr ); HYPRE_Int BuildParDifConv (HYPRE_Int argc, char *argv [], HYPRE_Int arg_index, HYPRE_ParCSRMatrix *A_ptr); HYPRE_Int BuildFuncsFromFiles (HYPRE_Int argc, char *argv [], HYPRE_Int arg_index, HYPRE_ParCSRMatrix A, HYPRE_Int **dof_func_ptr ); HYPRE_Int BuildFuncsFromOneFile (HYPRE_Int argc, char *argv [], HYPRE_Int arg_index, HYPRE_ParCSRMatrix A, HYPRE_Int **dof_func_ptr ); HYPRE_Int BuildParLaplacian9pt (HYPRE_Int argc, char *argv [], HYPRE_Int arg_index, HYPRE_ParCSRMatrix *A_ptr ); HYPRE_Int BuildParLaplacian27pt (HYPRE_Int argc, char *argv [], HYPRE_Int arg_index, HYPRE_ParCSRMatrix *A_ptr ); HYPRE_Int BuildParRotate7pt (HYPRE_Int argc, char *argv [], HYPRE_Int arg_index, HYPRE_ParCSRMatrix *A_ptr ); HYPRE_Int BuildParVarDifConv (HYPRE_Int argc, char *argv [], HYPRE_Int arg_index, HYPRE_ParCSRMatrix *A_ptr, HYPRE_ParVector *rhs_ptr ); HYPRE_ParCSRMatrix GenerateSysLaplacian (MPI_Comm comm, HYPRE_Int nx, HYPRE_Int ny, HYPRE_Int nz, HYPRE_Int P, HYPRE_Int Q, HYPRE_Int R, HYPRE_Int p, HYPRE_Int q, HYPRE_Int r, HYPRE_Int num_fun, HYPRE_Real *mtrx, HYPRE_Real *value); HYPRE_ParCSRMatrix GenerateSysLaplacianVCoef (MPI_Comm comm, HYPRE_Int nx, HYPRE_Int ny, HYPRE_Int nz, HYPRE_Int P, HYPRE_Int Q, HYPRE_Int R, HYPRE_Int p, HYPRE_Int q, HYPRE_Int r, HYPRE_Int num_fun, HYPRE_Real *mtrx, HYPRE_Real *value); HYPRE_Int SetSysVcoefValues(HYPRE_Int num_fun, HYPRE_Int nx, HYPRE_Int ny, HYPRE_Int nz, HYPRE_Real vcx, HYPRE_Real vcy, HYPRE_Real vcz, HYPRE_Int mtx_entry, HYPRE_Real *values); HYPRE_Int BuildParCoordinates (HYPRE_Int argc, char *argv [], HYPRE_Int arg_index, HYPRE_Int *coorddim_ptr, float **coord_ptr ); void testPMIS(HYPRE_ParCSRMatrix parcsr_A); void testPMIS2(HYPRE_ParCSRMatrix parcsr_A); void testPMIS3(HYPRE_ParCSRMatrix parcsr_A); void testTranspose(HYPRE_ParCSRMatrix parcsr_A); void testAdd(HYPRE_ParCSRMatrix parcsr_A); void testFFFC(HYPRE_ParCSRMatrix parcsr_A); HYPRE_Int CompareParCSRDH(HYPRE_ParCSRMatrix hmat, HYPRE_ParCSRMatrix dmat, HYPRE_Real tol); #ifdef __cplusplus } #endif hypre_int main( hypre_int argc, char *argv[] ) { HYPRE_Int arg_index; HYPRE_Int print_usage; HYPRE_Int build_matrix_type; HYPRE_Int build_matrix_arg_index; HYPRE_Int ierr = 0; void *object; HYPRE_IJMatrix ij_A = NULL; HYPRE_ParCSRMatrix parcsr_A = NULL; HYPRE_Int time_index; MPI_Comm comm = hypre_MPI_COMM_WORLD; HYPRE_Int test = 1; //HYPRE_Int i; //HYPRE_Real *data; HYPRE_Int myid, num_procs; /*----------------------------------------------------------- * Initialize some stuff *-----------------------------------------------------------*/ /* Initialize MPI */ hypre_MPI_Init(&argc, &argv); hypre_MPI_Comm_rank(hypre_MPI_COMM_WORLD, &myid); hypre_MPI_Comm_size(hypre_MPI_COMM_WORLD, &num_procs ); /*----------------------------------------------------------------- * GPU Device binding * Must be done before HYPRE_Initialize() and should not be changed after *-----------------------------------------------------------------*/ hypre_bind_device_id(myid, num_procs, hypre_MPI_COMM_WORLD); /*----------------------------------------------------------- * Initialize : must be the first HYPRE function to call *-----------------------------------------------------------*/ HYPRE_Initialize(); hypre_SetNumThreads(5); hypre_printf("CPU #OMP THREADS %d\n", hypre_NumThreads()); /*----------------------------------------------------------- * Set defaults *-----------------------------------------------------------*/ build_matrix_type = 2; build_matrix_arg_index = argc; /*----------------------------------------------------------- * Parse command line *-----------------------------------------------------------*/ print_usage = 0; arg_index = 1; while ( (arg_index < argc) && (!print_usage) ) { if ( strcmp(argv[arg_index], "-fromfile") == 0 ) { arg_index++; build_matrix_type = -1; build_matrix_arg_index = arg_index; } else if ( strcmp(argv[arg_index], "-fromparcsrfile") == 0 ) { arg_index++; build_matrix_type = 0; build_matrix_arg_index = arg_index; } else if ( strcmp(argv[arg_index], "-fromonecsrfile") == 0 ) { arg_index++; build_matrix_type = 1; build_matrix_arg_index = arg_index; } else if ( strcmp(argv[arg_index], "-laplacian") == 0 ) { arg_index++; build_matrix_type = 2; build_matrix_arg_index = arg_index; } else if ( strcmp(argv[arg_index], "-9pt") == 0 ) { arg_index++; build_matrix_type = 3; build_matrix_arg_index = arg_index; } else if ( strcmp(argv[arg_index], "-27pt") == 0 ) { arg_index++; build_matrix_type = 4; build_matrix_arg_index = arg_index; } else if ( strcmp(argv[arg_index], "-difconv") == 0 ) { arg_index++; build_matrix_type = 5; build_matrix_arg_index = arg_index; } else if ( strcmp(argv[arg_index], "-vardifconv") == 0 ) { arg_index++; build_matrix_type = 6; build_matrix_arg_index = arg_index; } else if ( strcmp(argv[arg_index], "-rotate") == 0 ) { arg_index++; build_matrix_type = 7; build_matrix_arg_index = arg_index; } else if ( strcmp(argv[arg_index], "-test") == 0 ) { arg_index++; test = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-help") == 0 ) { print_usage = 1; } else { arg_index++; } } /*----------------------------------------------------------- * Print usage info *-----------------------------------------------------------*/ if ( print_usage ) { goto final; } /*----------------------------------------------------------- * Print driver parameters *-----------------------------------------------------------*/ HYPRE_SetSpGemmUseVendor(0); /* use cuRand for PMIS */ HYPRE_SetUseGpuRand(1); /*----------------------------------------------------------- * Set up matrix *-----------------------------------------------------------*/ time_index = hypre_InitializeTiming("Generate Matrix"); hypre_BeginTiming(time_index); if ( build_matrix_type == -1 ) { ierr = HYPRE_IJMatrixRead( argv[build_matrix_arg_index], comm, HYPRE_PARCSR, &ij_A ); if (ierr) { hypre_printf("ERROR: Problem reading in the system matrix!\n"); exit(1); } } else if ( build_matrix_type == 0 ) { BuildParFromFile(argc, argv, build_matrix_arg_index, &parcsr_A); } else if ( build_matrix_type == 2 ) { BuildParLaplacian(argc, argv, build_matrix_arg_index, &parcsr_A); } else if ( build_matrix_type == 3 ) { BuildParLaplacian9pt(argc, argv, build_matrix_arg_index, &parcsr_A); } else if ( build_matrix_type == 4 ) { BuildParLaplacian27pt(argc, argv, build_matrix_arg_index, &parcsr_A); } else if ( build_matrix_type == 5 ) { BuildParDifConv(argc, argv, build_matrix_arg_index, &parcsr_A); } else if ( build_matrix_type == 7 ) { BuildParRotate7pt(argc, argv, build_matrix_arg_index, &parcsr_A); } else { hypre_printf("You have asked for an unsupported problem with\n"); hypre_printf("build_matrix_type = %d.\n", build_matrix_type); return (-1); } if (build_matrix_type < 0) { ierr += HYPRE_IJMatrixGetObject( ij_A, &object); parcsr_A = (HYPRE_ParCSRMatrix) object; } hypre_EndTiming(time_index); hypre_PrintTiming("Generate Matrix", hypre_MPI_COMM_WORLD); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); hypre_ParCSRMatrixMigrate(parcsr_A, hypre_HandleMemoryLocation(hypre_handle())); /* * TESTS */ if (test == 1) { testPMIS(parcsr_A); } else if (test == 2) { testPMIS2(parcsr_A); } else if (test == 3) { testPMIS3(parcsr_A); } else if (test == 4) { testTranspose(parcsr_A); } else if (test == 5) { testAdd(parcsr_A); } //testFFFC(parcsr_A); /*----------------------------------------------------------- * Finalize things *-----------------------------------------------------------*/ if (build_matrix_type == -1) { HYPRE_IJMatrixDestroy(ij_A); } else { HYPRE_ParCSRMatrixDestroy(parcsr_A); } final: /* Finalize Hypre */ HYPRE_Finalize(); /* Finalize MPI */ hypre_MPI_Finalize(); /* when using cuda-memcheck --leak-check full, uncomment this */ #if defined(HYPRE_USING_GPU) hypre_ResetDevice(); #endif return (0); } /*---------------------------------------------------------------------- * Build matrix from file. Expects three files on each processor. * filename.D.n contains the diagonal part, filename.O.n contains * the offdiagonal part and filename.INFO.n contains global row * and column numbers, number of columns of offdiagonal matrix * and the mapping of offdiagonal column numbers to global column numbers. * Parameters given in command line. *----------------------------------------------------------------------*/ HYPRE_Int BuildParFromFile( HYPRE_Int argc, char *argv[], HYPRE_Int arg_index, HYPRE_ParCSRMatrix *A_ptr ) { char *filename; HYPRE_ParCSRMatrix A; HYPRE_Int myid; /*----------------------------------------------------------- * Initialize some stuff *-----------------------------------------------------------*/ hypre_MPI_Comm_rank(hypre_MPI_COMM_WORLD, &myid ); /*----------------------------------------------------------- * Parse command line *-----------------------------------------------------------*/ if (arg_index < argc) { filename = argv[arg_index]; } else { hypre_printf("Error: No filename specified \n"); exit(1); } /*----------------------------------------------------------- * Print driver parameters *-----------------------------------------------------------*/ if (myid == 0) { hypre_printf(" FromFile: %s\n", filename); } /*----------------------------------------------------------- * Generate the matrix *-----------------------------------------------------------*/ HYPRE_ParCSRMatrixRead(hypre_MPI_COMM_WORLD, filename, &A); *A_ptr = A; return (0); } /*---------------------------------------------------------------------- * Build rhs from file. Expects two files on each processor. * filename.n contains the data and * and filename.INFO.n contains global row * numbers *----------------------------------------------------------------------*/ HYPRE_Int BuildParRhsFromFile( HYPRE_Int argc, char *argv[], HYPRE_Int arg_index, HYPRE_ParVector *b_ptr ) { char *filename; HYPRE_ParVector b; HYPRE_Int myid; /*----------------------------------------------------------- * Initialize some stuff *-----------------------------------------------------------*/ hypre_MPI_Comm_rank(hypre_MPI_COMM_WORLD, &myid ); /*----------------------------------------------------------- * Parse command line *-----------------------------------------------------------*/ if (arg_index < argc) { filename = argv[arg_index]; } else { hypre_printf("Error: No filename specified \n"); exit(1); } /*----------------------------------------------------------- * Print driver parameters *-----------------------------------------------------------*/ if (myid == 0) { hypre_printf(" RhsFromParFile: %s\n", filename); } /*----------------------------------------------------------- * Generate the matrix *-----------------------------------------------------------*/ HYPRE_ParVectorRead(hypre_MPI_COMM_WORLD, filename, &b); *b_ptr = b; return (0); } /*---------------------------------------------------------------------- * Build standard 7-point laplacian in 3D with grid and anisotropy. * Parameters given in command line. *----------------------------------------------------------------------*/ HYPRE_Int BuildParLaplacian( HYPRE_Int argc, char *argv[], HYPRE_Int arg_index, HYPRE_ParCSRMatrix *A_ptr ) { HYPRE_Int nx, ny, nz; HYPRE_Int P, Q, R; HYPRE_Real cx, cy, cz; HYPRE_ParCSRMatrix A; HYPRE_Int num_procs, myid; HYPRE_Int p, q, r; HYPRE_Int num_fun = 1; HYPRE_Real *values; HYPRE_Real *mtrx; HYPRE_Real ep = .1; HYPRE_Int system_vcoef = 0; HYPRE_Int sys_opt = 0; HYPRE_Int vcoef_opt = 0; /*----------------------------------------------------------- * Initialize some stuff *-----------------------------------------------------------*/ hypre_MPI_Comm_size(hypre_MPI_COMM_WORLD, &num_procs ); hypre_MPI_Comm_rank(hypre_MPI_COMM_WORLD, &myid ); /*----------------------------------------------------------- * Set defaults *-----------------------------------------------------------*/ nx = 10; ny = 10; nz = 10; P = 1; Q = num_procs; R = 1; cx = 1.; cy = 1.; cz = 1.; /*----------------------------------------------------------- * Parse command line *-----------------------------------------------------------*/ arg_index = 0; while (arg_index < argc) { if ( strcmp(argv[arg_index], "-n") == 0 ) { arg_index++; nx = atoi(argv[arg_index++]); ny = atoi(argv[arg_index++]); nz = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-P") == 0 ) { arg_index++; P = atoi(argv[arg_index++]); Q = atoi(argv[arg_index++]); R = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-c") == 0 ) { arg_index++; cx = (HYPRE_Real)atof(argv[arg_index++]); cy = (HYPRE_Real)atof(argv[arg_index++]); cz = (HYPRE_Real)atof(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-sysL") == 0 ) { arg_index++; num_fun = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-sysL_opt") == 0 ) { arg_index++; sys_opt = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-sys_vcoef") == 0 ) { /* have to use -sysL for this to */ arg_index++; system_vcoef = 1; } else if ( strcmp(argv[arg_index], "-sys_vcoef_opt") == 0 ) { arg_index++; vcoef_opt = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-ep") == 0 ) { arg_index++; ep = (HYPRE_Real)atof(argv[arg_index++]); } else { arg_index++; } } /*----------------------------------------------------------- * Check a few things *-----------------------------------------------------------*/ if ((P * Q * R) != num_procs) { hypre_printf("Error: Invalid number of processors or processor topology \n"); exit(1); } /*----------------------------------------------------------- * Print driver parameters *-----------------------------------------------------------*/ if (myid == 0) { hypre_printf(" Laplacian: num_fun = %d\n", num_fun); hypre_printf(" (nx, ny, nz) = (%d, %d, %d)\n", nx, ny, nz); hypre_printf(" (Px, Py, Pz) = (%d, %d, %d)\n", P, Q, R); hypre_printf(" (cx, cy, cz) = (%f, %f, %f)\n\n", cx, cy, cz); } /*----------------------------------------------------------- * Set up the grid structure *-----------------------------------------------------------*/ /* compute p,q,r from P,Q,R and myid */ p = myid % P; q = (( myid - p) / P) % Q; r = ( myid - p - P * q) / ( P * Q ); /*----------------------------------------------------------- * Generate the matrix *-----------------------------------------------------------*/ values = hypre_CTAlloc(HYPRE_Real, 4, HYPRE_MEMORY_HOST); values[1] = -cx; values[2] = -cy; values[3] = -cz; values[0] = 0.; if (nx > 1) { values[0] += 2.0 * cx; } if (ny > 1) { values[0] += 2.0 * cy; } if (nz > 1) { values[0] += 2.0 * cz; } if (num_fun == 1) A = (HYPRE_ParCSRMatrix) GenerateLaplacian(hypre_MPI_COMM_WORLD, nx, ny, nz, P, Q, R, p, q, r, values); else { mtrx = hypre_CTAlloc(HYPRE_Real, num_fun * num_fun, HYPRE_MEMORY_HOST); if (num_fun == 2) { if (sys_opt == 1) /* identity */ { mtrx[0] = 1.0; mtrx[1] = 0.0; mtrx[2] = 0.0; mtrx[3] = 1.0; } else if (sys_opt == 2) { mtrx[0] = 1.0; mtrx[1] = 0.0; mtrx[2] = 0.0; mtrx[3] = 20.0; } else if (sys_opt == 3) /* similar to barry's talk - ex1 */ { mtrx[0] = 1.0; mtrx[1] = 2.0; mtrx[2] = 2.0; mtrx[3] = 1.0; } else if (sys_opt == 4) /* can use with vcoef to get barry's ex*/ { mtrx[0] = 1.0; mtrx[1] = 1.0; mtrx[2] = 1.0; mtrx[3] = 1.0; } else if (sys_opt == 5) /* barry's talk - ex1 */ { mtrx[0] = 1.0; mtrx[1] = 1.1; mtrx[2] = 1.1; mtrx[3] = 1.0; } else if (sys_opt == 6) /* */ { mtrx[0] = 1.1; mtrx[1] = 1.0; mtrx[2] = 1.0; mtrx[3] = 1.1; } else /* == 0 */ { mtrx[0] = 2; mtrx[1] = 1; mtrx[2] = 1; mtrx[3] = 2; } } else if (num_fun == 3) { if (sys_opt == 1) { mtrx[0] = 1.0; mtrx[1] = 0.0; mtrx[2] = 0.0; mtrx[3] = 0.0; mtrx[4] = 1.0; mtrx[5] = 0.0; mtrx[6] = 0.0; mtrx[7] = 0.0; mtrx[8] = 1.0; } else if (sys_opt == 2) { mtrx[0] = 1.0; mtrx[1] = 0.0; mtrx[2] = 0.0; mtrx[3] = 0.0; mtrx[4] = 20.0; mtrx[5] = 0.0; mtrx[6] = 0.0; mtrx[7] = 0.0; mtrx[8] = .01; } else if (sys_opt == 3) { mtrx[0] = 1.01; mtrx[1] = 1; mtrx[2] = 0.0; mtrx[3] = 1; mtrx[4] = 2; mtrx[5] = 1; mtrx[6] = 0.0; mtrx[7] = 1; mtrx[8] = 1.01; } else if (sys_opt == 4) /* barry ex4 */ { mtrx[0] = 3; mtrx[1] = 1; mtrx[2] = 0.0; mtrx[3] = 1; mtrx[4] = 4; mtrx[5] = 2; mtrx[6] = 0.0; mtrx[7] = 2; mtrx[8] = .25; } else /* == 0 */ { mtrx[0] = 2.0; mtrx[1] = 1.0; mtrx[2] = 0.0; mtrx[3] = 1.0; mtrx[4] = 2.0; mtrx[5] = 1.0; mtrx[6] = 0.0; mtrx[7] = 1.0; mtrx[8] = 2.0; } } else if (num_fun == 4) { mtrx[0] = 1.01; mtrx[1] = 1; mtrx[2] = 0.0; mtrx[3] = 0.0; mtrx[4] = 1; mtrx[5] = 2; mtrx[6] = 1; mtrx[7] = 0.0; mtrx[8] = 0.0; mtrx[9] = 1; mtrx[10] = 1.01; mtrx[11] = 0.0; mtrx[12] = 2; mtrx[13] = 1; mtrx[14] = 0.0; mtrx[15] = 1; } if (!system_vcoef) { A = (HYPRE_ParCSRMatrix) GenerateSysLaplacian(hypre_MPI_COMM_WORLD, nx, ny, nz, P, Q, R, p, q, r, num_fun, mtrx, values); } else { HYPRE_Real *mtrx_values; mtrx_values = hypre_CTAlloc(HYPRE_Real, num_fun * num_fun * 4, HYPRE_MEMORY_HOST); if (num_fun == 2) { if (vcoef_opt == 1) { /* Barry's talk * - must also have sys_opt = 4, all fail */ mtrx[0] = 1.0; SetSysVcoefValues(num_fun, nx, ny, nz, 1.0, .10, 1.0, 0, mtrx_values); mtrx[1] = 1.0; SetSysVcoefValues(num_fun, nx, ny, nz, .1, 1.0, 1.0, 1, mtrx_values); mtrx[2] = 1.0; SetSysVcoefValues(num_fun, nx, ny, nz, .01, 1.0, 1.0, 2, mtrx_values); mtrx[3] = 1.0; SetSysVcoefValues(num_fun, nx, ny, nz, 2.0, .02, 1.0, 3, mtrx_values); } else if (vcoef_opt == 2) { /* Barry's talk * - ex2 - if have sys-opt = 4*/ mtrx[0] = 1.0; SetSysVcoefValues(num_fun, nx, ny, nz, 1.0, .010, 1.0, 0, mtrx_values); mtrx[1] = 200.0; SetSysVcoefValues(num_fun, nx, ny, nz, 1.0, 1.0, 1.0, 1, mtrx_values); mtrx[2] = 200.0; SetSysVcoefValues(num_fun, nx, ny, nz, 1.0, 1.0, 1.0, 2, mtrx_values); mtrx[3] = 1.0; SetSysVcoefValues(num_fun, nx, ny, nz, 2.0, .02, 1.0, 3, mtrx_values); } else if (vcoef_opt == 3) /* use with default sys_opt - ulrike ex 3*/ { /* mtrx[0] */ SetSysVcoefValues(num_fun, nx, ny, nz, ep * 1.0, 1.0, 1.0, 0, mtrx_values); /* mtrx[1] */ SetSysVcoefValues(num_fun, nx, ny, nz, 1.0, 1.0, 1.0, 1, mtrx_values); /* mtrx[2] */ SetSysVcoefValues(num_fun, nx, ny, nz, ep * 1.0, 1.0, 1.0, 2, mtrx_values); /* mtrx[3] */ SetSysVcoefValues(num_fun, nx, ny, nz, 1.0, 1.0, 1.0, 3, mtrx_values); } else if (vcoef_opt == 4) /* use with default sys_opt - ulrike ex 4*/ { HYPRE_Real ep2 = ep; /* mtrx[0] */ SetSysVcoefValues(num_fun, nx, ny, nz, ep * 1.0, 1.0, 1.0, 0, mtrx_values); /* mtrx[1] */ SetSysVcoefValues(num_fun, nx, ny, nz, 1.0, ep * 1.0, 1.0, 1, mtrx_values); /* mtrx[2] */ SetSysVcoefValues(num_fun, nx, ny, nz, ep * 1.0, 1.0, 1.0, 2, mtrx_values); /* mtrx[3] */ SetSysVcoefValues(num_fun, nx, ny, nz, 1.0, ep2 * 1.0, 1.0, 3, mtrx_values); } else if (vcoef_opt == 5) /* use with default sys_opt - */ { HYPRE_Real alp, beta; alp = .001; beta = 10; /* mtrx[0] */ SetSysVcoefValues(num_fun, nx, ny, nz, alp * 1.0, 1.0, 1.0, 0, mtrx_values); /* mtrx[1] */ SetSysVcoefValues(num_fun, nx, ny, nz, 1.0, beta * 1.0, 1.0, 1, mtrx_values); /* mtrx[2] */ SetSysVcoefValues(num_fun, nx, ny, nz, alp * 1.0, 1.0, 1.0, 2, mtrx_values); /* mtrx[3] */ SetSysVcoefValues(num_fun, nx, ny, nz, 1.0, beta * 1.0, 1.0, 3, mtrx_values); } else /* = 0 */ { /* mtrx[0] */ SetSysVcoefValues(num_fun, nx, ny, nz, 1.0, 1.0, 1.0, 0, mtrx_values); /* mtrx[1] */ SetSysVcoefValues(num_fun, nx, ny, nz, 1.0, 2.0, 1.0, 1, mtrx_values); /* mtrx[2] */ SetSysVcoefValues(num_fun, nx, ny, nz, 2.0, 1.0, 0.0, 2, mtrx_values); /* mtrx[3] */ SetSysVcoefValues(num_fun, nx, ny, nz, 1.0, 3.0, 1.0, 3, mtrx_values); } } else if (num_fun == 3) { mtrx[0] = 1; SetSysVcoefValues(num_fun, nx, ny, nz, 1, .01, 1, 0, mtrx_values); mtrx[1] = 1; SetSysVcoefValues(num_fun, nx, ny, nz, 1, 1, 1, 1, mtrx_values); mtrx[2] = 0.0; SetSysVcoefValues(num_fun, nx, ny, nz, 1, 1, 1, 2, mtrx_values); mtrx[3] = 1; SetSysVcoefValues(num_fun, nx, ny, nz, 1, 1, 1, 3, mtrx_values); mtrx[4] = 1; SetSysVcoefValues(num_fun, nx, ny, nz, 2, .02, 1, 4, mtrx_values); mtrx[5] = 2; SetSysVcoefValues(num_fun, nx, ny, nz, 1, 1, 1, 5, mtrx_values); mtrx[6] = 0.0; SetSysVcoefValues(num_fun, nx, ny, nz, 1, 1, 1, 6, mtrx_values); mtrx[7] = 2; SetSysVcoefValues(num_fun, nx, ny, nz, 1, 1, 1, 7, mtrx_values); mtrx[8] = 1; SetSysVcoefValues(num_fun, nx, ny, nz, 1.5, .04, 1, 8, mtrx_values); } A = (HYPRE_ParCSRMatrix) GenerateSysLaplacianVCoef(hypre_MPI_COMM_WORLD, nx, ny, nz, P, Q, R, p, q, r, num_fun, mtrx, mtrx_values); hypre_TFree(mtrx_values, HYPRE_MEMORY_HOST); } hypre_TFree(mtrx, HYPRE_MEMORY_HOST); } hypre_TFree(values, HYPRE_MEMORY_HOST); *A_ptr = A; return (0); } /*---------------------------------------------------------------------- * returns the sign of a real number * 1 : positive * 0 : zero * -1 : negative *----------------------------------------------------------------------*/ static inline HYPRE_Int sign_double(HYPRE_Real a) { return ( (0.0 < a) - (0.0 > a) ); } /*---------------------------------------------------------------------- * Build standard 7-point convection-diffusion operator * Parameters given in command line. * Operator: * * -cx Dxx - cy Dyy - cz Dzz + ax Dx + ay Dy + az Dz = f * *----------------------------------------------------------------------*/ HYPRE_Int BuildParDifConv( HYPRE_Int argc, char *argv[], HYPRE_Int arg_index, HYPRE_ParCSRMatrix *A_ptr) { HYPRE_Int nx, ny, nz; HYPRE_Int P, Q, R; HYPRE_Real cx, cy, cz; HYPRE_Real ax, ay, az, atype; HYPRE_Real hinx, hiny, hinz; HYPRE_Int sign_prod; HYPRE_ParCSRMatrix A; HYPRE_Int num_procs, myid; HYPRE_Int p, q, r; HYPRE_Real *values; /*----------------------------------------------------------- * Initialize some stuff *-----------------------------------------------------------*/ hypre_MPI_Comm_size(hypre_MPI_COMM_WORLD, &num_procs ); hypre_MPI_Comm_rank(hypre_MPI_COMM_WORLD, &myid ); /*----------------------------------------------------------- * Set defaults *-----------------------------------------------------------*/ nx = 10; ny = 10; nz = 10; P = 1; Q = num_procs; R = 1; cx = 1.; cy = 1.; cz = 1.; ax = 1.; ay = 1.; az = 1.; atype = 0; /*----------------------------------------------------------- * Parse command line *-----------------------------------------------------------*/ arg_index = 0; while (arg_index < argc) { if ( strcmp(argv[arg_index], "-n") == 0 ) { arg_index++; nx = atoi(argv[arg_index++]); ny = atoi(argv[arg_index++]); nz = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-P") == 0 ) { arg_index++; P = atoi(argv[arg_index++]); Q = atoi(argv[arg_index++]); R = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-c") == 0 ) { arg_index++; cx = (HYPRE_Real)atof(argv[arg_index++]); cy = (HYPRE_Real)atof(argv[arg_index++]); cz = (HYPRE_Real)atof(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-a") == 0 ) { arg_index++; ax = (HYPRE_Real)atof(argv[arg_index++]); ay = (HYPRE_Real)atof(argv[arg_index++]); az = (HYPRE_Real)atof(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-atype") == 0 ) { arg_index++; atype = atoi(argv[arg_index++]); } else { arg_index++; } } /*----------------------------------------------------------- * Check a few things *-----------------------------------------------------------*/ if ((P * Q * R) != num_procs) { hypre_printf("Error: Invalid number of processors or processor topology \n"); exit(1); } /*----------------------------------------------------------- * Print driver parameters *-----------------------------------------------------------*/ if (myid == 0) { hypre_printf(" Convection-Diffusion: \n"); hypre_printf(" -cx Dxx - cy Dyy - cz Dzz + ax Dx + ay Dy + az Dz = f\n"); hypre_printf(" (nx, ny, nz) = (%d, %d, %d)\n", nx, ny, nz); hypre_printf(" (Px, Py, Pz) = (%d, %d, %d)\n", P, Q, R); hypre_printf(" (cx, cy, cz) = (%f, %f, %f)\n", cx, cy, cz); hypre_printf(" (ax, ay, az) = (%f, %f, %f)\n\n", ax, ay, az); } /*----------------------------------------------------------- * Set up the grid structure *-----------------------------------------------------------*/ /* compute p,q,r from P,Q,R and myid */ p = myid % P; q = (( myid - p) / P) % Q; r = ( myid - p - P * q) / ( P * Q ); hinx = 1. / (nx + 1); hiny = 1. / (ny + 1); hinz = 1. / (nz + 1); /*----------------------------------------------------------- * Generate the matrix *-----------------------------------------------------------*/ /* values[7]: * [0]: center * [1]: X- * [2]: Y- * [3]: Z- * [4]: X+ * [5]: Y+ * [6]: Z+ */ values = hypre_CTAlloc(HYPRE_Real, 7, HYPRE_MEMORY_HOST); values[0] = 0.; if (0 == atype) /* forward scheme for conv */ { values[1] = -cx / (hinx * hinx); values[2] = -cy / (hiny * hiny); values[3] = -cz / (hinz * hinz); values[4] = -cx / (hinx * hinx) + ax / hinx; values[5] = -cy / (hiny * hiny) + ay / hiny; values[6] = -cz / (hinz * hinz) + az / hinz; if (nx > 1) { values[0] += 2.0 * cx / (hinx * hinx) - 1.*ax / hinx; } if (ny > 1) { values[0] += 2.0 * cy / (hiny * hiny) - 1.*ay / hiny; } if (nz > 1) { values[0] += 2.0 * cz / (hinz * hinz) - 1.*az / hinz; } } else if (1 == atype) /* backward scheme for conv */ { values[1] = -cx / (hinx * hinx) - ax / hinx; values[2] = -cy / (hiny * hiny) - ay / hiny; values[3] = -cz / (hinz * hinz) - az / hinz; values[4] = -cx / (hinx * hinx); values[5] = -cy / (hiny * hiny); values[6] = -cz / (hinz * hinz); if (nx > 1) { values[0] += 2.0 * cx / (hinx * hinx) + 1.*ax / hinx; } if (ny > 1) { values[0] += 2.0 * cy / (hiny * hiny) + 1.*ay / hiny; } if (nz > 1) { values[0] += 2.0 * cz / (hinz * hinz) + 1.*az / hinz; } } else if (3 == atype) /* upwind scheme */ { sign_prod = sign_double(cx) * sign_double(ax); if (sign_prod == 1) /* same sign use back scheme */ { values[1] = -cx / (hinx * hinx) - ax / hinx; values[4] = -cx / (hinx * hinx); if (nx > 1) { values[0] += 2.0 * cx / (hinx * hinx) + 1.*ax / hinx; } } else /* diff sign use forward scheme */ { values[1] = -cx / (hinx * hinx); values[4] = -cx / (hinx * hinx) + ax / hinx; if (nx > 1) { values[0] += 2.0 * cx / (hinx * hinx) - 1.*ax / hinx; } } sign_prod = sign_double(cy) * sign_double(ay); if (sign_prod == 1) /* same sign use back scheme */ { values[2] = -cy / (hiny * hiny) - ay / hiny; values[5] = -cy / (hiny * hiny); if (ny > 1) { values[0] += 2.0 * cy / (hiny * hiny) + 1.*ay / hiny; } } else /* diff sign use forward scheme */ { values[2] = -cy / (hiny * hiny); values[5] = -cy / (hiny * hiny) + ay / hiny; if (ny > 1) { values[0] += 2.0 * cy / (hiny * hiny) - 1.*ay / hiny; } } sign_prod = sign_double(cz) * sign_double(az); if (sign_prod == 1) /* same sign use back scheme */ { values[3] = -cz / (hinz * hinz) - az / hinz; values[6] = -cz / (hinz * hinz); if (nz > 1) { values[0] += 2.0 * cz / (hinz * hinz) + 1.*az / hinz; } } else /* diff sign use forward scheme */ { values[3] = -cz / (hinz * hinz); values[6] = -cz / (hinz * hinz) + az / hinz; if (nz > 1) { values[0] += 2.0 * cz / (hinz * hinz) - 1.*az / hinz; } } } else /* centered difference scheme */ { values[1] = -cx / (hinx * hinx) - ax / (2.*hinx); values[2] = -cy / (hiny * hiny) - ay / (2.*hiny); values[3] = -cz / (hinz * hinz) - az / (2.*hinz); values[4] = -cx / (hinx * hinx) + ax / (2.*hinx); values[5] = -cy / (hiny * hiny) + ay / (2.*hiny); values[6] = -cz / (hinz * hinz) + az / (2.*hinz); if (nx > 1) { values[0] += 2.0 * cx / (hinx * hinx); } if (ny > 1) { values[0] += 2.0 * cy / (hiny * hiny); } if (nz > 1) { values[0] += 2.0 * cz / (hinz * hinz); } } A = (HYPRE_ParCSRMatrix) GenerateDifConv(hypre_MPI_COMM_WORLD, nx, ny, nz, P, Q, R, p, q, r, values); hypre_TFree(values, HYPRE_MEMORY_HOST); *A_ptr = A; return (0); } /*---------------------------------------------------------------------- * Build standard 9-point laplacian in 2D with grid and anisotropy. * Parameters given in command line. *----------------------------------------------------------------------*/ HYPRE_Int BuildParLaplacian9pt( HYPRE_Int argc, char *argv[], HYPRE_Int arg_index, HYPRE_ParCSRMatrix *A_ptr ) { HYPRE_Int nx, ny; HYPRE_Int P, Q; HYPRE_ParCSRMatrix A; HYPRE_Int num_procs, myid; HYPRE_Int p, q; HYPRE_Real *values; /*----------------------------------------------------------- * Initialize some stuff *-----------------------------------------------------------*/ hypre_MPI_Comm_size(hypre_MPI_COMM_WORLD, &num_procs ); hypre_MPI_Comm_rank(hypre_MPI_COMM_WORLD, &myid ); /*----------------------------------------------------------- * Set defaults *-----------------------------------------------------------*/ nx = 10; ny = 10; P = 1; Q = num_procs; /*----------------------------------------------------------- * Parse command line *-----------------------------------------------------------*/ arg_index = 0; while (arg_index < argc) { if ( strcmp(argv[arg_index], "-n") == 0 ) { arg_index++; nx = atoi(argv[arg_index++]); ny = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-P") == 0 ) { arg_index++; P = atoi(argv[arg_index++]); Q = atoi(argv[arg_index++]); } else { arg_index++; } } /*----------------------------------------------------------- * Check a few things *-----------------------------------------------------------*/ if ((P * Q) != num_procs) { hypre_printf("Error: Invalid number of processors or processor topology \n"); exit(1); } /*----------------------------------------------------------- * Print driver parameters *-----------------------------------------------------------*/ if (myid == 0) { hypre_printf(" Laplacian 9pt:\n"); hypre_printf(" (nx, ny) = (%d, %d)\n", nx, ny); hypre_printf(" (Px, Py) = (%d, %d)\n\n", P, Q); } /*----------------------------------------------------------- * Set up the grid structure *-----------------------------------------------------------*/ /* compute p,q from P,Q and myid */ p = myid % P; q = ( myid - p) / P; /*----------------------------------------------------------- * Generate the matrix *-----------------------------------------------------------*/ values = hypre_CTAlloc(HYPRE_Real, 2, HYPRE_MEMORY_HOST); values[1] = -1.; values[0] = 0.; if (nx > 1) { values[0] += 2.0; } if (ny > 1) { values[0] += 2.0; } if (nx > 1 && ny > 1) { values[0] += 4.0; } A = (HYPRE_ParCSRMatrix) GenerateLaplacian9pt(hypre_MPI_COMM_WORLD, nx, ny, P, Q, p, q, values); hypre_TFree(values, HYPRE_MEMORY_HOST); *A_ptr = A; return (0); } /*---------------------------------------------------------------------- * Build 27-point laplacian in 3D, * Parameters given in command line. *----------------------------------------------------------------------*/ HYPRE_Int BuildParLaplacian27pt( HYPRE_Int argc, char *argv[], HYPRE_Int arg_index, HYPRE_ParCSRMatrix *A_ptr ) { HYPRE_Int nx, ny, nz; HYPRE_Int P, Q, R; HYPRE_ParCSRMatrix A; HYPRE_Int num_procs, myid; HYPRE_Int p, q, r; HYPRE_Real *values; /*----------------------------------------------------------- * Initialize some stuff *-----------------------------------------------------------*/ hypre_MPI_Comm_size(hypre_MPI_COMM_WORLD, &num_procs ); hypre_MPI_Comm_rank(hypre_MPI_COMM_WORLD, &myid ); /*----------------------------------------------------------- * Set defaults *-----------------------------------------------------------*/ nx = 10; ny = 10; nz = 10; P = 1; Q = num_procs; R = 1; /*----------------------------------------------------------- * Parse command line *-----------------------------------------------------------*/ arg_index = 0; while (arg_index < argc) { if ( strcmp(argv[arg_index], "-n") == 0 ) { arg_index++; nx = atoi(argv[arg_index++]); ny = atoi(argv[arg_index++]); nz = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-P") == 0 ) { arg_index++; P = atoi(argv[arg_index++]); Q = atoi(argv[arg_index++]); R = atoi(argv[arg_index++]); } else { arg_index++; } } /*----------------------------------------------------------- * Check a few things *-----------------------------------------------------------*/ if ((P * Q * R) != num_procs) { hypre_printf("Error: Invalid number of processors or processor topology \n"); exit(1); } /*----------------------------------------------------------- * Print driver parameters *-----------------------------------------------------------*/ if (myid == 0) { hypre_printf(" Laplacian_27pt:\n"); hypre_printf(" (nx, ny, nz) = (%d, %d, %d)\n", nx, ny, nz); hypre_printf(" (Px, Py, Pz) = (%d, %d, %d)\n\n", P, Q, R); } /*----------------------------------------------------------- * Set up the grid structure *-----------------------------------------------------------*/ /* compute p,q,r from P,Q,R and myid */ p = myid % P; q = (( myid - p) / P) % Q; r = ( myid - p - P * q) / ( P * Q ); /*----------------------------------------------------------- * Generate the matrix *-----------------------------------------------------------*/ values = hypre_CTAlloc(HYPRE_Real, 2, HYPRE_MEMORY_HOST); values[0] = 26.0; if (nx == 1 || ny == 1 || nz == 1) { values[0] = 8.0; } if (nx * ny == 1 || nx * nz == 1 || ny * nz == 1) { values[0] = 2.0; } values[1] = -1.; A = (HYPRE_ParCSRMatrix) GenerateLaplacian27pt(hypre_MPI_COMM_WORLD, nx, ny, nz, P, Q, R, p, q, r, values); hypre_TFree(values, HYPRE_MEMORY_HOST); *A_ptr = A; return (0); } /*---------------------------------------------------------------------- * Build 7-point in 2D * Parameters given in command line. *----------------------------------------------------------------------*/ HYPRE_Int BuildParRotate7pt( HYPRE_Int argc, char *argv[], HYPRE_Int arg_index, HYPRE_ParCSRMatrix *A_ptr ) { HYPRE_Int nx, ny; HYPRE_Int P, Q; HYPRE_ParCSRMatrix A; HYPRE_Int num_procs, myid; HYPRE_Int p, q; HYPRE_Real eps, alpha; /*----------------------------------------------------------- * Initialize some stuff *-----------------------------------------------------------*/ hypre_MPI_Comm_size(hypre_MPI_COMM_WORLD, &num_procs ); hypre_MPI_Comm_rank(hypre_MPI_COMM_WORLD, &myid ); /*----------------------------------------------------------- * Set defaults *-----------------------------------------------------------*/ nx = 10; ny = 10; P = 1; Q = num_procs; /*----------------------------------------------------------- * Parse command line *-----------------------------------------------------------*/ arg_index = 0; while (arg_index < argc) { if ( strcmp(argv[arg_index], "-n") == 0 ) { arg_index++; nx = atoi(argv[arg_index++]); ny = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-P") == 0 ) { arg_index++; P = atoi(argv[arg_index++]); Q = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-alpha") == 0 ) { arg_index++; alpha = (HYPRE_Real)atof(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-eps") == 0 ) { arg_index++; eps = (HYPRE_Real)atof(argv[arg_index++]); } else { arg_index++; } } /*----------------------------------------------------------- * Check a few things *-----------------------------------------------------------*/ if ((P * Q) != num_procs) { hypre_printf("Error: Invalid number of processors or processor topology \n"); exit(1); } /*----------------------------------------------------------- * Print driver parameters *-----------------------------------------------------------*/ if (myid == 0) { hypre_printf(" Rotate 7pt:\n"); hypre_printf(" alpha = %f, eps = %f\n", alpha, eps); hypre_printf(" (nx, ny) = (%d, %d)\n", nx, ny); hypre_printf(" (Px, Py) = (%d, %d)\n", P, Q); } /*----------------------------------------------------------- * Set up the grid structure *-----------------------------------------------------------*/ /* compute p,q from P,Q and myid */ p = myid % P; q = ( myid - p) / P; /*----------------------------------------------------------- * Generate the matrix *-----------------------------------------------------------*/ A = (HYPRE_ParCSRMatrix) GenerateRotate7pt(hypre_MPI_COMM_WORLD, nx, ny, P, Q, p, q, alpha, eps); *A_ptr = A; return (0); } /*---------------------------------------------------------------------- * Build standard 7-point difference operator using centered differences * * eps*(a(x,y,z) ux)x + (b(x,y,z) uy)y + (c(x,y,z) uz)z * d(x,y,z) ux + e(x,y,z) uy + f(x,y,z) uz + g(x,y,z) u * * functions a,b,c,d,e,f,g need to be defined inside par_vardifconv.c * *----------------------------------------------------------------------*/ HYPRE_Int BuildParVarDifConv( HYPRE_Int argc, char *argv[], HYPRE_Int arg_index, HYPRE_ParCSRMatrix *A_ptr, HYPRE_ParVector *rhs_ptr ) { HYPRE_Int nx, ny, nz; HYPRE_Int P, Q, R; HYPRE_ParCSRMatrix A; HYPRE_ParVector rhs; HYPRE_Int num_procs, myid; HYPRE_Int p, q, r; HYPRE_Int type; HYPRE_Real eps; /*----------------------------------------------------------- * Initialize some stuff *-----------------------------------------------------------*/ hypre_MPI_Comm_size(hypre_MPI_COMM_WORLD, &num_procs ); hypre_MPI_Comm_rank(hypre_MPI_COMM_WORLD, &myid ); /*----------------------------------------------------------- * Set defaults *-----------------------------------------------------------*/ nx = 10; ny = 10; nz = 10; P = 1; Q = num_procs; R = 1; eps = 1.0; /* type: 0 : default FD; * 1-3 : FD and examples 1-3 in Ruge-Stuben paper */ type = 0; /*----------------------------------------------------------- * Parse command line *-----------------------------------------------------------*/ arg_index = 0; while (arg_index < argc) { if ( strcmp(argv[arg_index], "-n") == 0 ) { arg_index++; nx = atoi(argv[arg_index++]); ny = atoi(argv[arg_index++]); nz = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-P") == 0 ) { arg_index++; P = atoi(argv[arg_index++]); Q = atoi(argv[arg_index++]); R = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-eps") == 0 ) { arg_index++; eps = (HYPRE_Real)atof(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-vardifconvRS") == 0 ) { arg_index++; type = atoi(argv[arg_index++]); } else { arg_index++; } } /*----------------------------------------------------------- * Check a few things *-----------------------------------------------------------*/ if ((P * Q * R) != num_procs) { hypre_printf("Error: Invalid number of processors or processor topology \n"); exit(1); } /*----------------------------------------------------------- * Print driver parameters *-----------------------------------------------------------*/ if (myid == 0) { hypre_printf(" ell PDE: eps = %f\n", eps); hypre_printf(" Dx(aDxu) + Dy(bDyu) + Dz(cDzu) + d Dxu + e Dyu + f Dzu + g u= f\n"); hypre_printf(" (nx, ny, nz) = (%d, %d, %d)\n", nx, ny, nz); hypre_printf(" (Px, Py, Pz) = (%d, %d, %d)\n", P, Q, R); } /*----------------------------------------------------------- * Set up the grid structure *-----------------------------------------------------------*/ /* compute p,q,r from P,Q,R and myid */ p = myid % P; q = (( myid - p) / P) % Q; r = ( myid - p - P * q) / ( P * Q ); /*----------------------------------------------------------- * Generate the matrix *-----------------------------------------------------------*/ if (0 == type) { A = (HYPRE_ParCSRMatrix) GenerateVarDifConv(hypre_MPI_COMM_WORLD, nx, ny, nz, P, Q, R, p, q, r, eps, &rhs); } else { A = (HYPRE_ParCSRMatrix) GenerateRSVarDifConv(hypre_MPI_COMM_WORLD, nx, ny, nz, P, Q, R, p, q, r, eps, &rhs, type); } *A_ptr = A; *rhs_ptr = rhs; return (0); } /**************************************************************************/ HYPRE_Int SetSysVcoefValues(HYPRE_Int num_fun, HYPRE_Int nx, HYPRE_Int ny, HYPRE_Int nz, HYPRE_Real vcx, HYPRE_Real vcy, HYPRE_Real vcz, HYPRE_Int mtx_entry, HYPRE_Real *values) { HYPRE_Int sz = num_fun * num_fun; values[1 * sz + mtx_entry] = -vcx; values[2 * sz + mtx_entry] = -vcy; values[3 * sz + mtx_entry] = -vcz; values[0 * sz + mtx_entry] = 0.0; if (nx > 1) { values[0 * sz + mtx_entry] += 2.0 * vcx; } if (ny > 1) { values[0 * sz + mtx_entry] += 2.0 * vcy; } if (nz > 1) { values[0 * sz + mtx_entry] += 2.0 * vcz; } return 0; } /*---------------------------------------------------------------------- * Build coordinates for 1D/2D/3D *----------------------------------------------------------------------*/ HYPRE_Int BuildParCoordinates( HYPRE_Int argc, char *argv[], HYPRE_Int arg_index, HYPRE_Int *coorddim_ptr, float **coord_ptr ) { HYPRE_Int nx, ny, nz; HYPRE_Int P, Q, R; HYPRE_Int num_procs, myid; HYPRE_Int p, q, r; HYPRE_Int coorddim; float *coordinates; /*----------------------------------------------------------- * Initialize some stuff *-----------------------------------------------------------*/ hypre_MPI_Comm_size(hypre_MPI_COMM_WORLD, &num_procs ); hypre_MPI_Comm_rank(hypre_MPI_COMM_WORLD, &myid ); /*----------------------------------------------------------- * Set defaults *-----------------------------------------------------------*/ nx = 10; ny = 10; nz = 10; P = 1; Q = num_procs; R = 1; /*----------------------------------------------------------- * Parse command line *-----------------------------------------------------------*/ arg_index = 0; while (arg_index < argc) { if ( strcmp(argv[arg_index], "-n") == 0 ) { arg_index++; nx = atoi(argv[arg_index++]); ny = atoi(argv[arg_index++]); nz = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-P") == 0 ) { arg_index++; P = atoi(argv[arg_index++]); Q = atoi(argv[arg_index++]); R = atoi(argv[arg_index++]); } else { arg_index++; } } /* compute p,q,r from P,Q,R and myid */ p = myid % P; q = (( myid - p) / P) % Q; r = ( myid - p - P * q) / ( P * Q ); /*----------------------------------------------------------- * Generate the coordinates *-----------------------------------------------------------*/ coorddim = 3; if (nx < 2) { coorddim--; } if (ny < 2) { coorddim--; } if (nz < 2) { coorddim--; } if (coorddim > 0) { coordinates = hypre_GenerateCoordinates(hypre_MPI_COMM_WORLD, nx, ny, nz, P, Q, R, p, q, r, coorddim); } else { coordinates = NULL; } *coorddim_ptr = coorddim; *coord_ptr = coordinates; return (0); } void testPMIS(HYPRE_ParCSRMatrix parcsr_A) { HYPRE_Int nC1 = 0, nC2 = 0, i; HYPRE_Int time_index; hypre_IntArray *h_CF_marker = NULL; hypre_IntArray *h_CF_marker2 = NULL; HYPRE_Int *d_CF_marker = NULL; HYPRE_Real max_row_sum = 1.0; HYPRE_Int num_functions = 1; HYPRE_Real strong_threshold = 0.25; HYPRE_Int debug_flag = 0; HYPRE_Int local_num_rows; HYPRE_Int first_local_row, last_local_row; HYPRE_Int first_local_col, last_local_col; MPI_Comm comm = hypre_MPI_COMM_WORLD; HYPRE_Int num_procs, myid; hypre_MPI_Comm_size(hypre_MPI_COMM_WORLD, &num_procs ); hypre_MPI_Comm_rank(hypre_MPI_COMM_WORLD, &myid ); HYPRE_ParCSRMatrixGetLocalRange( parcsr_A, &first_local_row, &last_local_row, &first_local_col, &last_local_col ); local_num_rows = last_local_row - first_local_row + 1; //local_num_cols = last_local_col - first_local_col + 1; /* Soc on HOST */ HYPRE_ParCSRMatrix parcsr_S = NULL; hypre_BoomerAMGCreateSHost(parcsr_A, strong_threshold, max_row_sum, num_functions, NULL, &parcsr_S); /* PMIS on HOST */ time_index = hypre_InitializeTiming("Host PMIS"); hypre_BeginTiming(time_index); hypre_BoomerAMGCoarsenPMISHost(parcsr_S, parcsr_A, 2, debug_flag, &h_CF_marker); hypre_EndTiming(time_index); hypre_PrintTiming("Host PMIS", hypre_MPI_COMM_WORLD); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); /* Soc on DEVICE */ HYPRE_ParCSRMatrix parcsr_S_device = NULL; hypre_BoomerAMGCreateSDevice(parcsr_A, strong_threshold, max_row_sum, num_functions, NULL, &parcsr_S_device); /* PMIS on DEVICE */ time_index = hypre_InitializeTiming("Device PMIS"); hypre_BeginTiming(time_index); h_CF_marker2 = hypre_IntArrayCreate(local_num_rows); hypre_IntArrayInitialize(h_CF_marker2); hypre_BoomerAMGCoarsenPMISDevice(parcsr_S_device, parcsr_A, 2, debug_flag, &h_CF_marker2); hypre_EndTiming(time_index); hypre_PrintTiming("Device PMIS", hypre_MPI_COMM_WORLD); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); //h_CF_marker2 = hypre_TAlloc(HYPRE_Int, local_num_rows, HYPRE_MEMORY_HOST); //hypre_TMemcpy(h_CF_marker2, d_CF_marker, HYPRE_Int, local_num_rows, HYPRE_MEMORY_HOST, HYPRE_MEMORY_DEVICE); for (i = 0; i < local_num_rows; i++) { if (hypre_IntArrayData(h_CF_marker)[i] > 0) { nC1++; } hypre_assert(hypre_IntArrayData(h_CF_marker2)[i] == 1 || hypre_IntArrayData(h_CF_marker2)[i] == -1 || hypre_IntArrayData(h_CF_marker2)[i] == -3); //hypre_assert(h_CF_marker[i] == h_CF_marker2[i]); if (hypre_IntArrayData(h_CF_marker2)[i] > 0) { nC2++; } } HYPRE_Int allnC1, allnC2; hypre_MPI_Allreduce(&nC1, &allnC1, 1, HYPRE_MPI_INT, hypre_MPI_SUM, comm); hypre_MPI_Allreduce(&nC2, &allnC2, 1, HYPRE_MPI_INT, hypre_MPI_SUM, comm); if (myid == 0) { printf("nC1 %d nC2 %d\n", allnC1, allnC2); } hypre_ParCSRMatrixDestroy(parcsr_S); hypre_ParCSRMatrixDestroy(parcsr_S_device); hypre_IntArrayDestroy(h_CF_marker); hypre_IntArrayDestroy(h_CF_marker2); hypre_TFree(d_CF_marker, HYPRE_MEMORY_DEVICE); } void testPMIS3(HYPRE_ParCSRMatrix parcsr_A) { HYPRE_Int nC2 = 0, i; hypre_IntArray *h_CF_marker2 = NULL; HYPRE_Real max_row_sum = 1.0; HYPRE_Int num_functions = 1; HYPRE_Real strong_threshold = 0.25; HYPRE_Int debug_flag = 0; HYPRE_Int local_num_rows; HYPRE_Int first_local_row, last_local_row; HYPRE_Int first_local_col, last_local_col; MPI_Comm comm = hypre_MPI_COMM_WORLD; HYPRE_Int num_procs, myid; hypre_MPI_Comm_size(hypre_MPI_COMM_WORLD, &num_procs ); hypre_MPI_Comm_rank(hypre_MPI_COMM_WORLD, &myid ); HYPRE_ParCSRMatrixGetLocalRange( parcsr_A, &first_local_row, &last_local_row, &first_local_col, &last_local_col ); local_num_rows = last_local_row - first_local_row + 1; //local_num_cols = last_local_col - first_local_col + 1; /* Soc on DEVICE */ HYPRE_ParCSRMatrix parcsr_S_device = NULL; hypre_BoomerAMGCreateSDevice(parcsr_A, strong_threshold, max_row_sum, num_functions, NULL, &parcsr_S_device); /* PMIS on DEVICE */ h_CF_marker2 = hypre_IntArrayCreate(local_num_rows); hypre_IntArrayInitialize(h_CF_marker2); hypre_BoomerAMGCoarsenPMISDevice(parcsr_S_device, parcsr_A, 2, debug_flag, &h_CF_marker2); for (i = 0; i < local_num_rows; i++) { hypre_assert(hypre_IntArrayData(h_CF_marker2)[i] == 1 || hypre_IntArrayData(h_CF_marker2)[i] == -1 || hypre_IntArrayData(h_CF_marker2)[i] == -3); if (hypre_IntArrayData(h_CF_marker2)[i] > 0) { nC2++; } } HYPRE_Int allnC2; hypre_MPI_Allreduce(&nC2, &allnC2, 1, HYPRE_MPI_INT, hypre_MPI_SUM, comm); if (myid == 0) { printf("nC2 %d\n", allnC2); } hypre_ParCSRMatrixDestroy(parcsr_S_device); hypre_IntArrayDestroy(h_CF_marker2); } void testPMIS2(HYPRE_ParCSRMatrix parcsr_A) { HYPRE_Int nC2 = 0, i; hypre_IntArray *h_CF_marker = NULL; hypre_IntArray *h_CF_marker2 = NULL; HYPRE_Real max_row_sum = 1.0; HYPRE_Int num_functions = 1; HYPRE_Real strong_threshold = 0.25; HYPRE_Int debug_flag = 0; HYPRE_Int local_num_rows; HYPRE_Int first_local_row, last_local_row; HYPRE_Int first_local_col, last_local_col; MPI_Comm comm = hypre_ParCSRMatrixComm(parcsr_A); HYPRE_Int num_procs, myid; hypre_MPI_Comm_size(comm, &num_procs ); hypre_MPI_Comm_rank(comm, &myid ); HYPRE_ParCSRMatrixGetLocalRange( parcsr_A, &first_local_row, &last_local_row, &first_local_col, &last_local_col ); local_num_rows = last_local_row - first_local_row + 1; //local_num_cols = last_local_col - first_local_col + 1; /* Soc on DEVICE */ HYPRE_ParCSRMatrix parcsr_S_device = NULL; hypre_BoomerAMGCreateSDevice(parcsr_A, strong_threshold, max_row_sum, num_functions, NULL, &parcsr_S_device); /* PMIS on DEVICE */ h_CF_marker = hypre_IntArrayCreate(local_num_rows); hypre_IntArrayInitialize(h_CF_marker); hypre_BoomerAMGCoarsenPMISDevice(parcsr_S_device, parcsr_A, 2, debug_flag, &h_CF_marker); HYPRE_Int coarse_pnts_global[2]; hypre_BoomerAMGCoarseParms(comm, local_num_rows, 1, NULL, h_CF_marker, NULL, coarse_pnts_global); /* interp */ hypre_ParCSRMatrix *P; hypre_BoomerAMGBuildDirInterpDevice(parcsr_A, hypre_IntArrayData(h_CF_marker), parcsr_S_device, coarse_pnts_global, 1, NULL, debug_flag, 0.0, 0, 3, &P); hypre_ParCSRMatrix *AH = hypre_ParCSRMatrixRAPKTDevice(P, parcsr_A, P, 1); hypre_ParCSRMatrixSetNumNonzeros(AH); //printf("AH %d, %d\n", hypre_ParCSRMatrixGlobalNumRows(AH), hypre_ParCSRMatrixNumNonzeros(AH)); hypre_ParCSRMatrixPrintIJ(AH, 0, 0, "AH"); HYPRE_Int local_num_rows2 = hypre_ParCSRMatrixNumRows(AH); hypre_ParCSRMatrix *S2; hypre_BoomerAMGCreateSDevice(AH, strong_threshold, max_row_sum, num_functions, NULL, &S2); h_CF_marker2 = hypre_IntArrayCreate(local_num_rows2); hypre_IntArrayInitialize(h_CF_marker2); hypre_BoomerAMGCoarsenPMISDevice(S2, AH, 2, debug_flag, &h_CF_marker2); for (i = 0; i < local_num_rows2; i++) { hypre_assert(hypre_IntArrayData(h_CF_marker2)[i] == 1 || hypre_IntArrayData(h_CF_marker2)[i] == -1 || hypre_IntArrayData(h_CF_marker2)[i] == -3); if (hypre_IntArrayData(h_CF_marker2)[i] > 0) { nC2++; } } HYPRE_Int allnC2; hypre_MPI_Allreduce(&nC2, &allnC2, 1, HYPRE_MPI_INT, hypre_MPI_SUM, comm); if (myid == 0) { printf("nC2 %d\n", allnC2); } hypre_ParCSRMatrixDestroy(parcsr_S_device); hypre_ParCSRMatrixDestroy(S2); hypre_IntArrayDestroy(h_CF_marker); hypre_IntArrayDestroy(h_CF_marker2); } void testTranspose(HYPRE_ParCSRMatrix parcsr_A) { HYPRE_Int myid; hypre_MPI_Comm_rank(hypre_MPI_COMM_WORLD, &myid); HYPRE_Real tol = 0.0; HYPRE_Int ierr = 0; HYPRE_ParCSRMatrix parcsr_AT; hypre_ParCSRMatrixTransposeDevice(parcsr_A, &parcsr_AT, 1); HYPRE_ParCSRMatrix parcsr_AT_h; HYPRE_ParCSRMatrix parcsr_A_h = hypre_ParCSRMatrixClone_v2(parcsr_A, 1, HYPRE_MEMORY_HOST); hypre_ParCSRMatrixTransposeHost(parcsr_A_h, &parcsr_AT_h, 1); ierr += CompareParCSRDH(parcsr_AT_h, parcsr_AT, tol); hypre_assert(!ierr); hypre_ParCSRMatrixDestroy(parcsr_AT); hypre_ParCSRMatrixDestroy(parcsr_AT_h); // hypre_ParCSRMatrixTransposeDevice(parcsr_A, &parcsr_AT, 0); hypre_ParCSRMatrixTransposeHost(parcsr_A_h, &parcsr_AT_h, 0); hypre_ParCSRMatrixSetConstantValues(parcsr_AT, 1.0); hypre_ParCSRMatrixSetConstantValues(parcsr_AT_h, 1.0); ierr += CompareParCSRDH(parcsr_AT_h, parcsr_AT, tol); hypre_assert(!ierr); hypre_ParCSRMatrixDestroy(parcsr_AT); hypre_ParCSRMatrixDestroy(parcsr_AT_h); hypre_ParCSRMatrixDestroy(parcsr_A_h); // HYPRE_Int first_local_row, last_local_row; HYPRE_Int first_local_col, last_local_col; HYPRE_ParCSRMatrixGetLocalRange( parcsr_A, &first_local_row, &last_local_row, &first_local_col, &last_local_col ); HYPRE_Int local_num_rows = last_local_row - first_local_row + 1; HYPRE_ParCSRMatrix parcsr_S_device = NULL; hypre_BoomerAMGCreateSDevice(parcsr_A, 0.25, 1.0, 1, NULL, &parcsr_S_device); hypre_IntArray *h_CF_marker = hypre_IntArrayCreate(local_num_rows); hypre_IntArrayInitialize(h_CF_marker); hypre_BoomerAMGCoarsenPMISDevice(parcsr_S_device, parcsr_A, 2, 0, &h_CF_marker); hypre_ParCSRMatrix *P, *PT, *P_h, *PT_h, *P2; HYPRE_Int coarse_pnts_global[2]; MPI_Comm comm = hypre_ParCSRMatrixComm(parcsr_A); hypre_BoomerAMGCoarseParms(comm, local_num_rows, 1, NULL, h_CF_marker, NULL, coarse_pnts_global); hypre_BoomerAMGBuildDirInterpDevice(parcsr_A, hypre_IntArrayData(h_CF_marker), parcsr_S_device, coarse_pnts_global, 1, NULL, 0, 0.0, 0, 3, &P); P_h = hypre_ParCSRMatrixClone_v2(P, 1, HYPRE_MEMORY_HOST); hypre_ParCSRMatrixTransposeDevice(P, &PT, 1); hypre_ParCSRMatrixTransposeHost(P_h, &PT_h, 1); hypre_ParCSRMatrixTransposeDevice(PT, &P2, 1); ierr += CompareParCSRDH(PT_h, PT, tol); hypre_assert(!ierr); ierr += CompareParCSRDH(P_h, P2, tol); hypre_assert(!ierr); if (myid == 0 && !ierr) { printf("[hypre_ParCSRMatrixTranspose] All Tests were OK ...\n"); } hypre_ParCSRMatrixDestroy(P); hypre_ParCSRMatrixDestroy(PT); hypre_ParCSRMatrixDestroy(P_h); hypre_ParCSRMatrixDestroy(PT_h); hypre_ParCSRMatrixDestroy(P2); hypre_IntArrayDestroy(h_CF_marker); } void testAdd(HYPRE_ParCSRMatrix parcsr_A) { HYPRE_Int myid; hypre_MPI_Comm_rank(hypre_MPI_COMM_WORLD, &myid); HYPRE_Real tol = 1e-14; HYPRE_Int ierr = 0; HYPRE_Real alpha = 3.141592654, beta = 2.718281828 * 9.9; HYPRE_ParCSRMatrix parcsr_A2 = hypre_ParCSRMatMatDevice(parcsr_A, parcsr_A); HYPRE_ParCSRMatrix parcsr_C; hypre_ParCSRMatrixAddDevice(alpha, parcsr_A, beta, parcsr_A2, &parcsr_C); HYPRE_ParCSRMatrix parcsr_A_h = hypre_ParCSRMatrixClone_v2(parcsr_A, 1, HYPRE_MEMORY_HOST); HYPRE_ParCSRMatrix parcsr_A2_h = hypre_ParCSRMatrixClone_v2(parcsr_A2, 1, HYPRE_MEMORY_HOST); HYPRE_ParCSRMatrix parcsr_C_h; hypre_ParCSRMatrixAddHost(alpha, parcsr_A_h, beta, parcsr_A2_h, &parcsr_C_h); ierr += CompareParCSRDH(parcsr_C_h, parcsr_C, tol); hypre_assert(!ierr); hypre_ParCSRMatrixDestroy(parcsr_A2); hypre_ParCSRMatrixDestroy(parcsr_C); hypre_ParCSRMatrixDestroy(parcsr_A_h); hypre_ParCSRMatrixDestroy(parcsr_A2_h); hypre_ParCSRMatrixDestroy(parcsr_C_h); // HYPRE_Int first_local_row, last_local_row; HYPRE_Int first_local_col, last_local_col; HYPRE_ParCSRMatrixGetLocalRange( parcsr_A, &first_local_row, &last_local_row, &first_local_col, &last_local_col ); HYPRE_Int local_num_rows = last_local_row - first_local_row + 1; HYPRE_ParCSRMatrix parcsr_S_device = NULL; hypre_BoomerAMGCreateSDevice(parcsr_A, 0.25, 1.0, 1, NULL, &parcsr_S_device); hypre_IntArray *h_CF_marker = hypre_IntArrayCreate(local_num_rows); hypre_IntArrayInitialize(h_CF_marker); hypre_BoomerAMGCoarsenPMISDevice(parcsr_S_device, parcsr_A, 2, 0, &h_CF_marker); hypre_ParCSRMatrix *P, *AP, *P_h, *AP_h; HYPRE_Int coarse_pnts_global[2]; MPI_Comm comm = hypre_ParCSRMatrixComm(parcsr_A); hypre_BoomerAMGCoarseParms(comm, local_num_rows, 1, NULL, h_CF_marker, NULL, coarse_pnts_global); hypre_BoomerAMGBuildDirInterpDevice(parcsr_A, hypre_IntArrayData(h_CF_marker), parcsr_S_device, coarse_pnts_global, 1, NULL, 0, 0.0, 0, 3, &P); AP = hypre_ParCSRMatMatDevice(parcsr_A, P); P_h = hypre_ParCSRMatrixClone_v2(P, 1, HYPRE_MEMORY_HOST); AP_h = hypre_ParCSRMatrixClone_v2(AP, 1, HYPRE_MEMORY_HOST); hypre_ParCSRMatrixAddDevice(alpha, P, beta, AP, &parcsr_C); hypre_ParCSRMatrixAddHost(alpha, P_h, beta, AP_h, &parcsr_C_h); ierr += CompareParCSRDH(parcsr_C_h, parcsr_C, tol); hypre_assert(!ierr); hypre_ParCSRMatrixDestroy(P); hypre_ParCSRMatrixDestroy(AP); hypre_ParCSRMatrixDestroy(P_h); hypre_ParCSRMatrixDestroy(AP_h); hypre_ParCSRMatrixDestroy(parcsr_C); hypre_ParCSRMatrixDestroy(parcsr_C_h); hypre_ParCSRMatrixDestroy(parcsr_S_device); hypre_IntArrayDestroy(h_CF_marker); if (myid == 0 && !ierr) { printf("[hypre_ParCSRMatrixAdd] All Tests were OK ...\n"); } } void testFFFC(HYPRE_ParCSRMatrix parcsr_A) { HYPRE_Real max_row_sum = 1.0; HYPRE_Real strong_threshold = 0.25; HYPRE_Int debug_flag = 0; HYPRE_Int num_functions = 1; hypre_IntArray *h_CF_marker = NULL; HYPRE_Int local_num_rows; HYPRE_Int first_local_row, last_local_row; HYPRE_Int first_local_col, last_local_col; HYPRE_BigInt coarse_pnts_global[2]; HYPRE_Int ierr = 0; HYPRE_Int myid; hypre_MPI_Comm_rank(hypre_MPI_COMM_WORLD, &myid); HYPRE_ParCSRMatrix parcsr_A_h; HYPRE_ParCSRMatrix AFF, AFC, W; HYPRE_ParCSRMatrix AFF_h, AFC_h, W_h; HYPRE_ParCSRMatrix parcsr_S_h, parcsr_S_device; HYPRE_ParCSRMatrixGetLocalRange( parcsr_A, &first_local_row, &last_local_row, &first_local_col, &last_local_col ); local_num_rows = last_local_row - first_local_row + 1; /* Soc on DEVICE */ hypre_BoomerAMGCreateSDevice(parcsr_A, strong_threshold, max_row_sum, num_functions, NULL, &parcsr_S_device); h_CF_marker = hypre_IntArrayCreate(local_num_rows); hypre_IntArrayInitialize(h_CF_marker); hypre_BoomerAMGCoarsenPMISDevice(parcsr_S_device, parcsr_A, 0, debug_flag, &h_CF_marker); hypre_BoomerAMGCoarseParms(hypre_ParCSRMatrixComm(parcsr_A), local_num_rows, num_functions, NULL, h_CF_marker, NULL, coarse_pnts_global); /* FFFC on Device */ hypre_ParCSRMatrixGenerateFFFCDevice(parcsr_A, hypre_IntArrayData(h_CF_marker), coarse_pnts_global, parcsr_S_device, &AFC, &AFF); /* FFFC on Host */ parcsr_A_h = hypre_ParCSRMatrixClone_v2(parcsr_A, 1, HYPRE_MEMORY_HOST); parcsr_S_h = hypre_ParCSRMatrixClone_v2(parcsr_S_device, 0, HYPRE_MEMORY_HOST); hypre_MatvecCommPkgCreate(parcsr_A_h); hypre_ParCSRMatrixGenerateFFFCHost(parcsr_A_h, hypre_IntArrayData(h_CF_marker), coarse_pnts_global, parcsr_S_h, &AFC_h, &AFF_h); /* AFF * AFC */ W_h = hypre_ParCSRMatMatHost(AFF_h, AFC_h); W = hypre_ParCSRMatMatDevice(AFF, AFC); /* check */ HYPRE_Real tol = 1e-15; ierr += CompareParCSRDH(AFF_h, AFF, tol); hypre_assert(!ierr); ierr += CompareParCSRDH(AFC_h, AFC, tol); hypre_assert(!ierr); ierr += CompareParCSRDH(W_h, W, tol); hypre_assert(!ierr); if (myid == 0 && !ierr) { printf("All Tests were OK ...\n"); } /* done */ hypre_TFree(h_CF_marker, HYPRE_MEMORY_HOST); hypre_IntArrayDestroy(h_CF_marker); hypre_ParCSRMatrixDestroy(parcsr_A_h); hypre_ParCSRMatrixDestroy(AFF); hypre_ParCSRMatrixDestroy(AFC); hypre_ParCSRMatrixDestroy(W); hypre_ParCSRMatrixDestroy(AFF_h); hypre_ParCSRMatrixDestroy(AFC_h); hypre_ParCSRMatrixDestroy(W_h); } HYPRE_Int CompareParCSRDH(HYPRE_ParCSRMatrix hmat, HYPRE_ParCSRMatrix dmat, HYPRE_Real tol) { HYPRE_ParCSRMatrix hmat2, emat; HYPRE_Real enorm, fnorm, rnorm; HYPRE_Int i, ecode = 0, ecode_total = 0; hmat2 = hypre_ParCSRMatrixClone_v2(dmat, 1, HYPRE_MEMORY_HOST); if (hypre_ParCSRMatrixNumRows(hmat) != hypre_ParCSRMatrixNumRows(hmat2)) { ecode ++; } if (hypre_ParCSRMatrixNumCols(hmat) != hypre_ParCSRMatrixNumCols(hmat2)) { ecode ++; } if (hypre_CSRMatrixNumRows(hypre_ParCSRMatrixOffd(hmat)) != hypre_CSRMatrixNumRows( hypre_ParCSRMatrixOffd(hmat2))) { ecode ++; } if (hypre_CSRMatrixNumCols(hypre_ParCSRMatrixOffd(hmat)) != hypre_CSRMatrixNumCols( hypre_ParCSRMatrixOffd(hmat2))) { ecode ++; } for (i = 0; i < hypre_CSRMatrixNumCols(hypre_ParCSRMatrixOffd(hmat)); i++) { if (hypre_ParCSRMatrixColMapOffd(hmat)[i] != hypre_ParCSRMatrixColMapOffd(hmat2)[i]) { ecode++; break; } } if (hypre_CSRMatrixNumNonzeros(hypre_ParCSRMatrixDiag(hmat)) != hypre_CSRMatrixNumNonzeros( hypre_ParCSRMatrixDiag(hmat2))) { ecode ++; } if (hypre_CSRMatrixNumNonzeros(hypre_ParCSRMatrixOffd(hmat)) != hypre_CSRMatrixNumNonzeros( hypre_ParCSRMatrixOffd(hmat2))) { ecode ++; } hypre_MPI_Allreduce(&ecode, &ecode_total, 1, HYPRE_MPI_INT, hypre_MPI_SUM, hypre_MPI_COMM_WORLD); hypre_ParCSRMatrixAdd(1.0, hmat, -1.0, hmat2, &emat); enorm = hypre_ParCSRMatrixFnorm(emat); fnorm = hypre_ParCSRMatrixFnorm(hmat); rnorm = fnorm > 0 ? enorm / fnorm : enorm; if ( rnorm > tol ) { ecode_total ++; } printf("relative error %e = %e / %e\n", rnorm, enorm, fnorm); hypre_ParCSRMatrixDestroy(hmat2); hypre_ParCSRMatrixDestroy(emat); return ecode_total; } hypre-2.33.0/src/test/ij_mm.c000066400000000000000000002510411477326011500157440ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /*-------------------------------------------------------------------------- * Test driver for unstructured matrix interface (IJ_matrix interface). * Do `driver -help' for usage info. * This driver started from the driver for parcsr_linear_solvers, and it * works by first building a parcsr matrix as before and then "copying" * that matrix row-by-row into the IJMatrix interface. AJC 7/99. *--------------------------------------------------------------------------*/ #include #include #include #include "_hypre_utilities.h" #include "HYPRE.h" #include "HYPRE_parcsr_mv.h" #include "HYPRE_IJ_mv.h" #include "HYPRE_parcsr_ls.h" #include "_hypre_parcsr_ls.h" #include "_hypre_parcsr_mv.h" #include "HYPRE_krylov.h" #ifdef HYPRE_USING_CUDA #include "cuda_profiler_api.h" #endif #ifdef __cplusplus extern "C" { #endif HYPRE_Int BuildParFromFile (HYPRE_Int argc, char *argv [], HYPRE_Int arg_index, HYPRE_ParCSRMatrix *A_ptr ); HYPRE_Int BuildParRhsFromFile (HYPRE_Int argc, char *argv [], HYPRE_Int arg_index, HYPRE_ParVector *b_ptr ); HYPRE_Int BuildParLaplacian (HYPRE_Int argc, char *argv [], HYPRE_Int arg_index, HYPRE_ParCSRMatrix *A_ptr ); HYPRE_Int BuildParSysLaplacian (HYPRE_Int argc, char *argv [], HYPRE_Int arg_index, HYPRE_ParCSRMatrix *A_ptr ); HYPRE_Int BuildParDifConv (HYPRE_Int argc, char *argv [], HYPRE_Int arg_index, HYPRE_ParCSRMatrix *A_ptr); HYPRE_Int BuildFuncsFromFiles (HYPRE_Int argc, char *argv [], HYPRE_Int arg_index, HYPRE_ParCSRMatrix A, HYPRE_Int **dof_func_ptr ); HYPRE_Int BuildFuncsFromOneFile (HYPRE_Int argc, char *argv [], HYPRE_Int arg_index, HYPRE_ParCSRMatrix A, HYPRE_Int **dof_func_ptr ); HYPRE_Int BuildParLaplacian9pt (HYPRE_Int argc, char *argv [], HYPRE_Int arg_index, HYPRE_ParCSRMatrix *A_ptr ); HYPRE_Int BuildParLaplacian27pt (HYPRE_Int argc, char *argv [], HYPRE_Int arg_index, HYPRE_ParCSRMatrix *A_ptr ); HYPRE_Int BuildParRotate7pt (HYPRE_Int argc, char *argv [], HYPRE_Int arg_index, HYPRE_ParCSRMatrix *A_ptr ); HYPRE_Int BuildParVarDifConv (HYPRE_Int argc, char *argv [], HYPRE_Int arg_index, HYPRE_ParCSRMatrix *A_ptr, HYPRE_ParVector *rhs_ptr ); HYPRE_Int SetSysVcoefValues(HYPRE_Int num_fun, HYPRE_BigInt nx, HYPRE_BigInt ny, HYPRE_BigInt nz, HYPRE_Real vcx, HYPRE_Real vcy, HYPRE_Real vcz, HYPRE_Int mtx_entry, HYPRE_Real *values); HYPRE_Int BuildParCoordinates (HYPRE_Int argc, char *argv [], HYPRE_Int arg_index, HYPRE_Int *coorddim_ptr, float **coord_ptr ); #ifdef __cplusplus } #endif char *gpu_ptr = NULL; size_t total_size = 0, current_size = 0; void gpu_alloc(void **ptr, size_t size) { size = ((size + 128 - 1) / 128) * 128; *ptr = (void *) &gpu_ptr[current_size]; current_size += size; if (current_size > total_size) { hypre_printf("Out of GPU memory\n"); exit(0); } } void gpu_free(void *ptr) { HYPRE_UNUSED_VAR(ptr); return; } char file_dir[] = "./"; void runjob1( HYPRE_ParCSRMatrix parcsr_A, HYPRE_Int print_system, HYPRE_Int rep, HYPRE_Int verify) { HYPRE_Int i; HYPRE_ParCSRMatrix parcsr_A_host = NULL; HYPRE_ParCSRMatrix parcsr_B_host = NULL; HYPRE_ParCSRMatrix parcsr_B_host2 = NULL; HYPRE_ParCSRMatrix parcsr_B = NULL; HYPRE_ParCSRMatrix parcsr_error_host = NULL; HYPRE_Real fnorm, rfnorm, fnorm0; HYPRE_Int time_index; char fname[1024]; MPI_Comm comm = hypre_ParCSRMatrixComm(parcsr_A); hypre_ParPrintf(comm, "A %d x %d, NNZ %d, RNZ %d\n", hypre_ParCSRMatrixGlobalNumRows(parcsr_A), hypre_ParCSRMatrixGlobalNumCols(parcsr_A), hypre_ParCSRMatrixNumNonzeros(parcsr_A), hypre_ParCSRMatrixNumNonzeros(parcsr_A) / hypre_ParCSRMatrixGlobalNumRows(parcsr_A)); hypre_assert(hypre_ParCSRMatrixMemoryLocation(parcsr_A) == HYPRE_MEMORY_DEVICE); hypre_MatvecCommPkgCreate(parcsr_A); hypre_ParCSRMatrixCopyColMapOffdToDevice(parcsr_A); if (verify) { parcsr_A_host = hypre_ParCSRMatrixClone_v2(parcsr_A, 1, HYPRE_MEMORY_HOST); hypre_MatvecCommPkgCreate(parcsr_A_host); time_index = hypre_InitializeTiming("Host Parcsr Matrix-by-Matrix, A*A"); hypre_BeginTiming(time_index); parcsr_B_host = hypre_ParCSRMatMat(parcsr_A_host, parcsr_A_host); hypre_EndTiming(time_index); hypre_PrintTiming("Host Parcsr Matrix-by-Matrix, A*A", hypre_MPI_COMM_WORLD); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); hypre_ParCSRMatrixSetNumNonzeros(parcsr_B_host); } if (print_system) { sprintf(fname, "%s/%s", file_dir, "IJ.out.A"); hypre_ParCSRMatrixPrintIJ(parcsr_A, 0, 0, fname); //hypre_CSRMatrixPrintMM(hypre_ParCSRMatrixDiag(parcsr_A_host), 1, 1, 0, "A.mtx"); } for (i = 0 ; i < rep; i++) { hypre_ParPrintf(comm, "--- rep %d (out of %d) ---\n", i, rep); if (i == rep - 1) { time_index = hypre_InitializeTiming("Device Parcsr Matrix-by-Matrix, A*A"); hypre_BeginTiming(time_index); //cudaProfilerStart(); } parcsr_B = hypre_ParCSRMatMat(parcsr_A, parcsr_A); if (i == rep - 1) { #if defined(HYPRE_USING_GPU) hypre_SyncDevice(); #endif //cudaProfilerStop(); hypre_EndTiming(time_index); hypre_PrintTiming("Device Parcsr Matrix-by-Matrix, A*A", hypre_MPI_COMM_WORLD); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); } if (i < rep - 1) { hypre_ParCSRMatrixDestroy(parcsr_B); } } if (verify) { parcsr_B_host2 = hypre_ParCSRMatrixClone_v2(parcsr_B, 1, HYPRE_MEMORY_HOST); hypre_ParCSRMatrixSetNumNonzeros(parcsr_B_host2); hypre_ParCSRMatrixAdd(1.0, parcsr_B_host, -1.0, parcsr_B_host2, &parcsr_error_host); fnorm = hypre_ParCSRMatrixFnorm(parcsr_error_host); fnorm0 = hypre_ParCSRMatrixFnorm(parcsr_B_host); rfnorm = fnorm0 > 0 ? fnorm / fnorm0 : fnorm; hypre_ParPrintf(comm, "A^2: %d x %d, nnz [CPU %d, GPU %d], CPU-GPU err %e\n", hypre_ParCSRMatrixGlobalNumRows(parcsr_B_host2), hypre_ParCSRMatrixGlobalNumCols(parcsr_B_host2), hypre_ParCSRMatrixNumNonzeros(parcsr_B_host), hypre_ParCSRMatrixNumNonzeros(parcsr_B_host2), rfnorm); } if (print_system) { if (!parcsr_B_host2) { parcsr_B_host2 = hypre_ParCSRMatrixClone_v2(parcsr_B, 1, HYPRE_MEMORY_HOST); } sprintf(fname, "%s/%s", file_dir, "IJ.out.B"); hypre_ParCSRMatrixPrintIJ(parcsr_B_host2, 0, 0, fname); sprintf(fname, "%s/%s", file_dir, "IJ.out.B.CPU"); hypre_ParCSRMatrixPrintIJ(parcsr_B_host, 0, 0, fname); } hypre_ParCSRMatrixSetNumNonzeros(parcsr_B); hypre_ParPrintf(comm, "B %d x %d, NNZ %d, RNZ %d\n", hypre_ParCSRMatrixGlobalNumRows(parcsr_B), hypre_ParCSRMatrixGlobalNumCols(parcsr_B), hypre_ParCSRMatrixNumNonzeros(parcsr_B), hypre_ParCSRMatrixNumNonzeros(parcsr_B) / hypre_ParCSRMatrixGlobalNumRows(parcsr_B)); hypre_ParCSRMatrixDestroy(parcsr_B); hypre_ParCSRMatrixDestroy(parcsr_A_host); hypre_ParCSRMatrixDestroy(parcsr_B_host); hypre_ParCSRMatrixDestroy(parcsr_B_host2); hypre_ParCSRMatrixDestroy(parcsr_error_host); } void runjob2( HYPRE_ParCSRMatrix parcsr_A, HYPRE_Int print_system, HYPRE_Int rep, HYPRE_Int verify) { HYPRE_Int i; HYPRE_ParCSRMatrix parcsr_A_host = NULL; HYPRE_ParCSRMatrix parcsr_B_host = NULL; HYPRE_ParCSRMatrix parcsr_B_host2 = NULL; HYPRE_ParCSRMatrix parcsr_B = NULL; HYPRE_ParCSRMatrix parcsr_error_host = NULL; HYPRE_Real fnorm, rfnorm, fnorm0; HYPRE_Int time_index; char fname[1024]; MPI_Comm comm = hypre_ParCSRMatrixComm(parcsr_A); hypre_ParPrintf(comm, "A %d x %d, NNZ %d, RNZ %d\n", hypre_ParCSRMatrixGlobalNumRows(parcsr_A), hypre_ParCSRMatrixGlobalNumCols(parcsr_A), hypre_ParCSRMatrixNumNonzeros(parcsr_A), hypre_ParCSRMatrixNumNonzeros(parcsr_A) / hypre_ParCSRMatrixGlobalNumRows(parcsr_A)); hypre_assert(hypre_ParCSRMatrixMemoryLocation(parcsr_A) == HYPRE_MEMORY_DEVICE); hypre_MatvecCommPkgCreate(parcsr_A); hypre_ParCSRMatrixCopyColMapOffdToDevice(parcsr_A); if (verify) { parcsr_A_host = hypre_ParCSRMatrixClone_v2(parcsr_A, 1, HYPRE_MEMORY_HOST); hypre_MatvecCommPkgCreate(parcsr_A_host); time_index = hypre_InitializeTiming("Host Parcsr Matrix-by-Matrix, AT*A"); hypre_BeginTiming(time_index); parcsr_B_host = hypre_ParCSRTMatMat(parcsr_A_host, parcsr_A_host); hypre_EndTiming(time_index); hypre_PrintTiming("Host Parcsr Matrix-by-Matrix, AT*A", hypre_MPI_COMM_WORLD); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); hypre_ParCSRMatrixSetNumNonzeros(parcsr_B_host); } if (print_system) { if (!parcsr_A_host) { parcsr_A_host = hypre_ParCSRMatrixClone_v2(parcsr_A, 1, HYPRE_MEMORY_HOST); } sprintf(fname, "%s/%s", file_dir, "IJ.out.A"); hypre_ParCSRMatrixPrintIJ(parcsr_A_host, 0, 0, fname); } for (i = 0 ; i < rep; i++) { hypre_ParPrintf(comm, "--- rep %d (out of %d) ---\n", i, rep); if (i == rep - 1) { time_index = hypre_InitializeTiming("Device Parcsr Matrix-by-Matrix, AT*A"); hypre_BeginTiming(time_index); //cudaProfilerStart(); } parcsr_B = hypre_ParCSRTMatMatKT(parcsr_A, parcsr_A, 0); if (i == rep - 1) { #if defined(HYPRE_USING_GPU) hypre_SyncDevice(); #endif //cudaProfilerStop(); hypre_EndTiming(time_index); hypre_PrintTiming("Device Parcsr Matrix-by-Matrix, AT*A", hypre_MPI_COMM_WORLD); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); } if (i < rep - 1) { hypre_ParCSRMatrixDestroy(parcsr_B); } } if (verify) { parcsr_B_host2 = hypre_ParCSRMatrixClone_v2(parcsr_B, 1, HYPRE_MEMORY_HOST); hypre_ParCSRMatrixSetNumNonzeros(parcsr_B_host2); hypre_ParCSRMatrixAdd(1.0, parcsr_B_host, -1.0, parcsr_B_host2, &parcsr_error_host); fnorm = hypre_ParCSRMatrixFnorm(parcsr_error_host); fnorm0 = hypre_ParCSRMatrixFnorm(parcsr_B_host); rfnorm = fnorm0 > 0 ? fnorm / fnorm0 : fnorm; hypre_ParPrintf(comm, "A^T*A: %d x %d, nnz [CPU %d, GPU %d], CPU-GPU err %e\n", hypre_ParCSRMatrixGlobalNumRows(parcsr_B_host2), hypre_ParCSRMatrixGlobalNumCols(parcsr_B_host2), hypre_ParCSRMatrixNumNonzeros(parcsr_B_host), hypre_ParCSRMatrixNumNonzeros(parcsr_B_host2), rfnorm); } if (print_system) { sprintf(fname, "%s/%s", file_dir, "IJ.out.B"); hypre_ParCSRMatrixPrintIJ(parcsr_B, 0, 0, fname); sprintf(fname, "%s/%s", file_dir, "IJ.out.B.CPU"); hypre_ParCSRMatrixPrintIJ(parcsr_B_host, 0, 0, fname); } hypre_ParCSRMatrixSetNumNonzeros(parcsr_B); hypre_ParPrintf(comm, "B %d x %d, NNZ %d, RNZ %d\n", hypre_ParCSRMatrixGlobalNumRows(parcsr_B), hypre_ParCSRMatrixGlobalNumCols(parcsr_B), hypre_ParCSRMatrixNumNonzeros(parcsr_B), hypre_ParCSRMatrixNumNonzeros(parcsr_B) / hypre_ParCSRMatrixGlobalNumRows(parcsr_B)); hypre_ParCSRMatrixDestroy(parcsr_B); hypre_ParCSRMatrixDestroy(parcsr_A_host); hypre_ParCSRMatrixDestroy(parcsr_B_host); hypre_ParCSRMatrixDestroy(parcsr_B_host2); hypre_ParCSRMatrixDestroy(parcsr_error_host); } void runjob3( HYPRE_ParCSRMatrix parcsr_A, HYPRE_ParCSRMatrix parcsr_P, HYPRE_Int boolean_P, HYPRE_Int print_system, HYPRE_Int rap2, HYPRE_Int mult_order, HYPRE_Int rep, HYPRE_Int verify) { HYPRE_Int i; char fname[1024]; HYPRE_Int time_index; HYPRE_Int keepTranspose = 0; HYPRE_Real fnorm, rfnorm, fnorm0; HYPRE_ParCSRMatrix parcsr_Q = NULL; HYPRE_ParCSRMatrix parcsr_AH = NULL; HYPRE_ParCSRMatrix parcsr_A_host = NULL; HYPRE_ParCSRMatrix parcsr_P_host = NULL; HYPRE_ParCSRMatrix parcsr_Q_host = NULL; HYPRE_ParCSRMatrix parcsr_AH_host = NULL; HYPRE_ParCSRMatrix parcsr_AH_host_2 = NULL; HYPRE_ParCSRMatrix parcsr_error_host = NULL; MPI_Comm comm = hypre_ParCSRMatrixComm(parcsr_A); hypre_ParPrintf(comm, "A %d x %d, NNZ %d\n", hypre_ParCSRMatrixGlobalNumRows(parcsr_A), hypre_ParCSRMatrixGlobalNumCols(parcsr_A), hypre_ParCSRMatrixNumNonzeros(parcsr_A)); hypre_ParPrintf(comm, "P %d x %d, NNZ %d\n", hypre_ParCSRMatrixGlobalNumRows(parcsr_P), hypre_ParCSRMatrixGlobalNumCols(parcsr_P), hypre_ParCSRMatrixNumNonzeros(parcsr_P)); /* !!! */ hypre_assert(hypre_ParCSRMatrixMemoryLocation(parcsr_A) == HYPRE_MEMORY_DEVICE); hypre_assert(hypre_ParCSRMatrixMemoryLocation(parcsr_P) == HYPRE_MEMORY_DEVICE); if (!hypre_ParCSRMatrixCommPkg(parcsr_A)) { hypre_MatvecCommPkgCreate(parcsr_A); } if (!hypre_ParCSRMatrixCommPkg(parcsr_P)) { hypre_MatvecCommPkgCreate(parcsr_P); } hypre_ParCSRMatrixSetPatternOnly(parcsr_P, boolean_P); /*----------------------------------------------------------- * Matrix-by-Matrix on host *-----------------------------------------------------------*/ if (verify) { //hypre_ParPrintf("Clone matrices to the host\n"); parcsr_A_host = hypre_ParCSRMatrixClone_v2(parcsr_A, 1, HYPRE_MEMORY_HOST); parcsr_P_host = hypre_ParCSRMatrixClone_v2(parcsr_P, 1, HYPRE_MEMORY_HOST); hypre_MatvecCommPkgCreate(parcsr_A_host); hypre_MatvecCommPkgCreate(parcsr_P_host); time_index = hypre_InitializeTiming("Host Parcsr Matrix-by-Matrix, RAP"); hypre_BeginTiming(time_index); if (mult_order == 0) { parcsr_Q_host = hypre_ParCSRMatMat(parcsr_A_host, parcsr_P_host); parcsr_AH_host = hypre_ParCSRTMatMatKT(parcsr_P_host, parcsr_Q_host, keepTranspose); } else { parcsr_Q_host = hypre_ParCSRTMatMatKT(parcsr_P_host, parcsr_A_host, keepTranspose); parcsr_AH_host = hypre_ParCSRMatMat(parcsr_Q_host, parcsr_P_host); } hypre_EndTiming(time_index); hypre_PrintTiming("Host Parcsr Matrix-by-Matrix, RAP", hypre_MPI_COMM_WORLD); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); hypre_ParCSRMatrixSetNumNonzeros(parcsr_AH_host); } /*----------------------------------------------------------- * Print out the matrices *-----------------------------------------------------------*/ if (print_system) { sprintf(fname, "%s/%s", file_dir, "IJ.out.A"); hypre_ParCSRMatrixPrintIJ(parcsr_A_host, 0, 0, fname); sprintf(fname, "%s/%s", file_dir, "IJ.out.P"); hypre_ParCSRMatrixPrintIJ(parcsr_P_host, 0, 0, fname); } /*----------------------------------------------------------- * Matrix-by-Matrix on device *-----------------------------------------------------------*/ /* run for the first time without timing [some allocation is done] */ /* run for a second time for timing */ for (i = 0 ; i < rep; i++) { hypre_ParPrintf(comm, "--- rep %d (out of %d) ---\n", i, rep); if (i == rep - 1) { time_index = hypre_InitializeTiming("Device Parcsr Matrix-by-Matrix, RAP"); hypre_BeginTiming(time_index); //cudaProfilerStart(); } if (rap2) { if (mult_order == 0) { parcsr_Q = hypre_ParCSRMatMat(parcsr_A, parcsr_P); parcsr_AH = hypre_ParCSRTMatMatKT(parcsr_P, parcsr_Q, keepTranspose); } else { parcsr_Q = hypre_ParCSRTMatMatKT(parcsr_P, parcsr_A, keepTranspose); parcsr_AH = hypre_ParCSRMatMat(parcsr_Q, parcsr_P); } } else { parcsr_AH = hypre_ParCSRMatrixRAPKT(parcsr_P, parcsr_A, parcsr_P, keepTranspose); } if (i == rep - 1) { #if defined(HYPRE_USING_GPU) hypre_SyncDevice(); #endif //cudaProfilerStop(); hypre_EndTiming(time_index); hypre_PrintTiming("Device Parcsr Matrix-by-Matrix, RAP", hypre_MPI_COMM_WORLD); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); } if (i < rep - 1) { hypre_ParCSRMatrixDestroy(parcsr_Q); hypre_ParCSRMatrixDestroy(parcsr_AH); } } if (verify) { /*----------------------------------------------------------- * Verify results *-----------------------------------------------------------*/ parcsr_AH_host_2 = hypre_ParCSRMatrixClone_v2(parcsr_AH, 1, HYPRE_MEMORY_HOST); hypre_ParCSRMatrixSetNumNonzeros(parcsr_AH_host_2); hypre_ParCSRMatrixAdd(1.0, parcsr_AH_host, -1.0, parcsr_AH_host_2, &parcsr_error_host); fnorm = hypre_ParCSRMatrixFnorm(parcsr_error_host); fnorm0 = hypre_ParCSRMatrixFnorm(parcsr_AH_host); rfnorm = fnorm0 > 0 ? fnorm / fnorm0 : fnorm; hypre_ParPrintf(comm, "AH: %d x %d, nnz [CPU %d, GPU %d], CPU-GPU err %e\n", hypre_ParCSRMatrixGlobalNumRows(parcsr_AH_host_2), hypre_ParCSRMatrixGlobalNumCols(parcsr_AH_host_2), hypre_ParCSRMatrixNumNonzeros(parcsr_AH_host), hypre_ParCSRMatrixNumNonzeros(parcsr_AH_host_2), rfnorm); } hypre_ParCSRMatrixSetNumNonzeros(parcsr_AH); hypre_ParPrintf(comm, "AH %d x %d, NNZ %d, RNZ %d\n", hypre_ParCSRMatrixGlobalNumRows(parcsr_AH), hypre_ParCSRMatrixGlobalNumCols(parcsr_AH), hypre_ParCSRMatrixNumNonzeros(parcsr_AH), hypre_ParCSRMatrixNumNonzeros(parcsr_AH) / hypre_ParCSRMatrixGlobalNumRows(parcsr_AH)); hypre_ParCSRMatrixDestroy(parcsr_Q); hypre_ParCSRMatrixDestroy(parcsr_AH); hypre_ParCSRMatrixDestroy(parcsr_A_host); hypre_ParCSRMatrixDestroy(parcsr_P_host); hypre_ParCSRMatrixDestroy(parcsr_Q_host); hypre_ParCSRMatrixDestroy(parcsr_AH_host); hypre_ParCSRMatrixDestroy(parcsr_AH_host_2); hypre_ParCSRMatrixDestroy(parcsr_error_host); } void runjob4( HYPRE_ParCSRMatrix parcsr_A, HYPRE_Int print_system, HYPRE_Int rap2, HYPRE_Int mult_order, HYPRE_Int rep, HYPRE_Int verify) { HYPRE_Int measure_type = 0; HYPRE_Real trunc_factor = 0.0; HYPRE_Int P_max_elmts = 8; HYPRE_Int debug_flag = 0; HYPRE_Int num_functions = 1; HYPRE_Real strong_threshold = 0.25; HYPRE_Real max_row_sum = 1.0; HYPRE_Int local_num_vars; HYPRE_BigInt coarse_pnts_global[2]; hypre_IntArray *CF_marker = NULL; HYPRE_ParCSRMatrix parcsr_S = NULL; HYPRE_ParCSRMatrix parcsr_P = NULL; /* coarsening */ hypre_BoomerAMGCreateS(parcsr_A, strong_threshold, max_row_sum, num_functions, NULL, &parcsr_S); hypre_BoomerAMGCoarsenPMIS(parcsr_S, parcsr_A, measure_type, debug_flag, &CF_marker); local_num_vars = hypre_ParCSRMatrixNumRows(parcsr_A); hypre_BoomerAMGCoarseParms(hypre_ParCSRMatrixComm(parcsr_A), local_num_vars, num_functions, NULL, CF_marker, NULL, coarse_pnts_global); /* generate P */ hypre_BoomerAMGBuildExtPIInterp(parcsr_A, hypre_IntArrayData(CF_marker), parcsr_S, coarse_pnts_global, num_functions, NULL, debug_flag, trunc_factor, P_max_elmts, &parcsr_P); runjob3(parcsr_A, parcsr_P, 0, print_system, rap2, mult_order, rep, verify); hypre_IntArrayDestroy(CF_marker); hypre_ParCSRMatrixDestroy(parcsr_S); hypre_ParCSRMatrixDestroy(parcsr_P); } void runjob5( HYPRE_ParCSRMatrix parcsr_A, HYPRE_Int print_system, HYPRE_Int rep, HYPRE_Int verify) { #if defined(HYPRE_USING_CUDA) || defined(HYPRE_USING_HIP) HYPRE_Int i; HYPRE_ParCSRMatrix parcsr_B = NULL; HYPRE_ParCSRMatrix parcsr_A_host = NULL; HYPRE_ParCSRMatrix parcsr_B_host = NULL; HYPRE_ParCSRMatrix parcsr_error_host = NULL; HYPRE_Real fnorm, rfnorm, fnorm0; HYPRE_Int time_index; char fname[1024]; MPI_Comm comm = hypre_ParCSRMatrixComm(parcsr_A); hypre_ParPrintf(comm, "A %d x %d, NNZ %d, RNZ %d\n", hypre_ParCSRMatrixGlobalNumRows(parcsr_A), hypre_ParCSRMatrixGlobalNumCols(parcsr_A), hypre_ParCSRMatrixNumNonzeros(parcsr_A), hypre_ParCSRMatrixNumNonzeros(parcsr_A) / hypre_ParCSRMatrixGlobalNumRows(parcsr_A)); hypre_assert(hypre_ParCSRMatrixMemoryLocation(parcsr_A) == HYPRE_MEMORY_DEVICE); // D = diag(diag(A)) HYPRE_ParCSRMatrix parcsr_D = hypre_ParCSRMatrixCreate(hypre_ParCSRMatrixComm(parcsr_A), hypre_ParCSRMatrixGlobalNumRows(parcsr_A), hypre_ParCSRMatrixGlobalNumCols(parcsr_A), hypre_ParCSRMatrixRowStarts(parcsr_A), hypre_ParCSRMatrixColStarts(parcsr_A), 0, hypre_ParCSRMatrixNumRows(parcsr_A), 0); hypre_CSRMatrixDestroy(hypre_ParCSRMatrixDiag(parcsr_D)); hypre_ParCSRMatrixDiag(parcsr_D) = hypre_CSRMatrixDiagMatrixFromMatrixDevice(hypre_ParCSRMatrixDiag( parcsr_A), 0); // Diag Scale on host if (verify) { parcsr_A_host = hypre_ParCSRMatrixClone_v2(parcsr_A, 1, HYPRE_MEMORY_HOST); hypre_Vector *vec_d_host = hypre_SeqVectorCreate(hypre_ParCSRMatrixNumRows(parcsr_A_host)); hypre_SeqVectorInitialize_v2(vec_d_host, HYPRE_MEMORY_HOST); hypre_CSRMatrixExtractDiagonal(hypre_ParCSRMatrixDiag(parcsr_A_host), hypre_VectorData(vec_d_host), 0); time_index = hypre_InitializeTiming("Host Parcsr DiagScale Matrix, Diag(A)*A"); hypre_BeginTiming(time_index); hypre_CSRMatrixDiagScale(hypre_ParCSRMatrixDiag(parcsr_A_host), vec_d_host, NULL); hypre_CSRMatrixDiagScale(hypre_ParCSRMatrixOffd(parcsr_A_host), vec_d_host, NULL); hypre_EndTiming(time_index); hypre_PrintTiming("Host Parcsr DiagScale Matrix, Diag(A)*A", hypre_MPI_COMM_WORLD); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); hypre_SeqVectorDestroy(vec_d_host); } // [FAST] diag scale using vector { HYPRE_ParCSRMatrix parcsr_C = hypre_ParCSRMatrixClone_v2(parcsr_A, 1, HYPRE_MEMORY_DEVICE); hypre_Vector *vec_d = hypre_SeqVectorCreate(hypre_ParCSRMatrixNumRows(parcsr_C)); hypre_SeqVectorInitialize_v2(vec_d, HYPRE_MEMORY_DEVICE); hypre_CSRMatrixExtractDiagonal(hypre_ParCSRMatrixDiag(parcsr_C), hypre_VectorData(vec_d), 0); for (i = 0 ; i < rep; i++) { if (i == rep - 1) { time_index = hypre_InitializeTiming("Device Parcsr DiagScale Matrix"); hypre_BeginTiming(time_index); } hypre_CSRMatrixDiagScale(hypre_ParCSRMatrixDiag(parcsr_C), vec_d, NULL); hypre_CSRMatrixDiagScale(hypre_ParCSRMatrixOffd(parcsr_C), vec_d, NULL); if (i == rep - 1) { #if defined(HYPRE_USING_GPU) hypre_SyncDevice(); #endif hypre_EndTiming(time_index); hypre_PrintTiming("Device Parcsr DiagScale Matrix", hypre_MPI_COMM_WORLD); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); } } hypre_ParCSRMatrixDestroy(parcsr_C); hypre_SeqVectorDestroy(vec_d); } // [SLOW] Diag-by-Matrix for (i = 0 ; i < rep; i++) { hypre_ParPrintf(comm, "--- rep %d (out of %d) ---\n", i, rep); if (i == rep - 1) { time_index = hypre_InitializeTiming("Device Parcsr Matrix-by-Matrix, Diag(A)*A"); hypre_BeginTiming(time_index); } parcsr_B = hypre_ParCSRMatMat(parcsr_D, parcsr_A); if (i == rep - 1) { #if defined(HYPRE_USING_GPU) hypre_SyncDevice(); #endif hypre_EndTiming(time_index); hypre_PrintTiming("Device Parcsr Matrix-by-Matrix, Diag(A)*A", hypre_MPI_COMM_WORLD); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); } if (i < rep - 1) { hypre_ParCSRMatrixDestroy(parcsr_B); } } if (verify) { parcsr_B_host = hypre_ParCSRMatrixClone_v2(parcsr_B, 1, HYPRE_MEMORY_HOST); hypre_ParCSRMatrixSetNumNonzeros(parcsr_B_host); hypre_ParCSRMatrixAdd(1.0, parcsr_A_host, -1.0, parcsr_B_host, &parcsr_error_host); fnorm = hypre_ParCSRMatrixFnorm(parcsr_error_host); fnorm0 = hypre_ParCSRMatrixFnorm(parcsr_B_host); rfnorm = fnorm0 > 0 ? fnorm / fnorm0 : fnorm; hypre_ParPrintf(comm, "Diag(A)*A: %d x %d, nnz [CPU %d, GPU %d], CPU-GPU err %e\n", hypre_ParCSRMatrixGlobalNumRows(parcsr_B_host), hypre_ParCSRMatrixGlobalNumCols(parcsr_B_host), hypre_ParCSRMatrixNumNonzeros(parcsr_A_host), hypre_ParCSRMatrixNumNonzeros(parcsr_B_host), rfnorm); } if (print_system) { if (!parcsr_B_host) { parcsr_B_host = hypre_ParCSRMatrixClone_v2(parcsr_B, 1, HYPRE_MEMORY_HOST); } sprintf(fname, "%s/%s", file_dir, "IJ.out.B"); hypre_ParCSRMatrixPrintIJ(parcsr_B_host, 0, 0, fname); } hypre_ParCSRMatrixSetNumNonzeros(parcsr_B); hypre_ParPrintf(comm, "B %d x %d, NNZ %d, RNZ %d\n", hypre_ParCSRMatrixGlobalNumRows(parcsr_B), hypre_ParCSRMatrixGlobalNumCols(parcsr_B), hypre_ParCSRMatrixNumNonzeros(parcsr_B), hypre_ParCSRMatrixNumNonzeros(parcsr_B) / hypre_ParCSRMatrixGlobalNumRows(parcsr_B)); hypre_ParCSRMatrixDestroy(parcsr_B); hypre_ParCSRMatrixDestroy(parcsr_A_host); hypre_ParCSRMatrixDestroy(parcsr_B_host); hypre_ParCSRMatrixDestroy(parcsr_D); hypre_ParCSRMatrixDestroy(parcsr_error_host); #else HYPRE_UNUSED_VAR(parcsr_A); HYPRE_UNUSED_VAR(print_system); HYPRE_UNUSED_VAR(rep); HYPRE_UNUSED_VAR(verify); #endif } hypre_int main( hypre_int argc, char *argv[] ) { HYPRE_Int arg_index; HYPRE_Int print_usage; HYPRE_Int build_matrix_type; HYPRE_Int build_matrix_arg_index; HYPRE_Int ierr = 0; void *object; HYPRE_IJMatrix ij_A = NULL; HYPRE_IJMatrix ij_P = NULL; HYPRE_ParCSRMatrix parcsr_A = NULL; HYPRE_ParCSRMatrix parcsr_P = NULL; HYPRE_Int errcode, job = 1; HYPRE_Int num_procs, myid; HYPRE_Int time_index; MPI_Comm comm = hypre_MPI_COMM_WORLD; HYPRE_BigInt first_local_row, last_local_row; HYPRE_BigInt first_local_col, last_local_col; HYPRE_Int rap2 = 0; HYPRE_Int mult_order = 0; HYPRE_Int print_system = 0; HYPRE_Int verify = 0; HYPRE_Int use_vendor = 0; HYPRE_Int spgemm_alg = 1; HYPRE_Int spgemm_binned = 0; HYPRE_Int rowest_mtd = 3; HYPRE_Int rowest_nsamples = -1; /* default */ HYPRE_Real rowest_mult = -1.0; /* default */ HYPRE_Int zero_mem_cost = 0; HYPRE_Int boolean_P = 1; HYPRE_Int rep = 10; /*----------------------------------------------------------- * Initialize some stuff *-----------------------------------------------------------*/ /* Initialize MPI */ hypre_MPI_Init(&argc, &argv); hypre_MPI_Comm_size(hypre_MPI_COMM_WORLD, &num_procs ); hypre_MPI_Comm_rank(hypre_MPI_COMM_WORLD, &myid ); /*----------------------------------------------------------------- * GPU Device binding * Must be done before HYPRE_Initialize() and should not be changed after *-----------------------------------------------------------------*/ hypre_bind_device_id(-1, myid, num_procs, hypre_MPI_COMM_WORLD); /*----------------------------------------------------------- * Initialize : must be the first HYPRE function to call *-----------------------------------------------------------*/ HYPRE_Initialize(); HYPRE_DeviceInitialize(); if (myid == 0) { HYPRE_PrintDeviceInfo(); } /* for timing, sync after kernels */ #if defined(HYPRE_USING_GPU) hypre_SetSyncCudaCompute(1); #endif HYPRE_SetExecutionPolicy(HYPRE_EXEC_DEVICE); //hypre_SetNumThreads(20); if (myid == 0) { hypre_printf("CPU #OMP THREADS %d\n", hypre_NumThreads()); } /*----------------------------------------------------------- * Set defaults *-----------------------------------------------------------*/ build_matrix_type = 2; build_matrix_arg_index = argc; /*----------------------------------------------------------- * Parse command line *-----------------------------------------------------------*/ print_usage = 0; arg_index = 1; while ( (arg_index < argc) && (!print_usage) ) { if ( strcmp(argv[arg_index], "-fromMMfile") == 0 ) { arg_index++; build_matrix_type = -2; build_matrix_arg_index = arg_index; } else if ( strcmp(argv[arg_index], "-fromfile") == 0 ) { arg_index++; build_matrix_type = -1; build_matrix_arg_index = arg_index; } else if ( strcmp(argv[arg_index], "-fromparcsrfile") == 0 ) { arg_index++; build_matrix_type = 0; build_matrix_arg_index = arg_index; } else if ( strcmp(argv[arg_index], "-from2files") == 0 ) { arg_index++; build_matrix_type = 1; build_matrix_arg_index = arg_index; arg_index++; } else if ( strcmp(argv[arg_index], "-laplacian") == 0 ) { arg_index++; build_matrix_type = 2; build_matrix_arg_index = arg_index; } else if ( strcmp(argv[arg_index], "-9pt") == 0 ) { arg_index++; build_matrix_type = 3; build_matrix_arg_index = arg_index; } else if ( strcmp(argv[arg_index], "-27pt") == 0 ) { arg_index++; build_matrix_type = 4; build_matrix_arg_index = arg_index; } else if ( strcmp(argv[arg_index], "-difconv") == 0 ) { arg_index++; build_matrix_type = 5; build_matrix_arg_index = arg_index; } else if ( strcmp(argv[arg_index], "-vardifconv") == 0 ) { arg_index++; build_matrix_type = 6; build_matrix_arg_index = arg_index; } else if ( strcmp(argv[arg_index], "-rotate") == 0 ) { arg_index++; build_matrix_type = 7; build_matrix_arg_index = arg_index; } else if ( strcmp(argv[arg_index], "-concrete_parcsr") == 0 ) { arg_index++; build_matrix_arg_index = arg_index; } else if ( strcmp(argv[arg_index], "-print") == 0 ) { arg_index++; print_system = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-verify") == 0 ) { arg_index++; verify = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-rap2") == 0 ) { arg_index++; rap2 = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-order") == 0 ) { arg_index++; mult_order = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-vendor") == 0 ) { arg_index++; use_vendor = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-spgemmalg") == 0 ) { arg_index++; spgemm_alg = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-spgemm_binned") == 0 ) { arg_index++; spgemm_binned = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-rowest") == 0 ) { arg_index++; rowest_mtd = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-rowestmult") == 0 ) { arg_index++; rowest_mult = (HYPRE_Real)atof(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-rowestnsamples") == 0 ) { arg_index++; rowest_nsamples = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-job") == 0 ) { arg_index++; job = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-rep") == 0 ) { arg_index++; rep = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-zeromemcost") == 0 ) { arg_index++; zero_mem_cost = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-help") == 0 ) { print_usage = 1; } else { arg_index++; } } if (zero_mem_cost) { #ifdef HYPRE_USING_CUDA total_size = 15LL * 1024 * 1024 * 1024; #elif defined(HYPRE_USING_HIP) total_size = 20LL * 1024 * 1024 * 1024; #endif gpu_ptr = hypre_TAlloc(char, total_size, HYPRE_MEMORY_DEVICE); hypre_SetUserDeviceMalloc(gpu_alloc); hypre_SetUserDeviceMfree(gpu_free); } /*----------------------------------------------------------- * Print usage info *-----------------------------------------------------------*/ if ( print_usage ) { if ( myid == 0 ) { hypre_printf("\n"); hypre_printf("Usage: %s []\n", argv[0]); hypre_printf("\n"); hypre_printf(" -fromfile : "); hypre_printf("matrix read from multiple files (IJ format)\n"); hypre_printf(" -fromparcsrfile : "); hypre_printf("matrix read from multiple files (ParCSR format)\n"); hypre_printf(" -fromonecsrfile : "); hypre_printf("matrix read from a single file (CSR format)\n"); hypre_printf("\n"); hypre_printf(" -laplacian [] : build 5pt 2D laplacian problem (default) \n"); hypre_printf(" -sysL : build SYSTEMS laplacian 7pt operator\n"); hypre_printf(" -9pt [] : build 9pt 2D laplacian problem\n"); hypre_printf(" -27pt [] : build 27pt 3D laplacian problem\n"); hypre_printf(" -difconv [] : build convection-diffusion problem\n"); hypre_printf(" -n : total problem size \n"); hypre_printf(" -P : processor topology\n"); hypre_printf(" -c : diffusion coefficients\n"); hypre_printf(" -a : convection coefficients\n"); hypre_printf(" -atype : FD scheme for convection \n"); hypre_printf(" 0=Forward (default) 1=Backward\n"); hypre_printf(" 2=Centered 3=Upwind\n"); hypre_printf("\n"); hypre_printf(" -concrete_parcsr : use parcsr matrix type as concrete type\n"); hypre_printf("\n"); hypre_printf(" -job : 1. A^2 2. A^T*A 3. P^T*A*P\n"); hypre_printf(" 4. P^T*A*P (P is AMG Interp from A)\n"); hypre_printf(" 5. Diag(A) * A\n"); } goto final; } /*----------------------------------------------------------- * Print driver parameters *-----------------------------------------------------------*/ errcode = hypre_SetSpGemmRownnzEstimateMethod(rowest_mtd); hypre_assert(errcode == 0); if (rowest_nsamples > 0) { errcode = hypre_SetSpGemmRownnzEstimateNSamples(rowest_nsamples); hypre_assert(errcode == 0); } if (rowest_mult > 0.0) { errcode = hypre_SetSpGemmRownnzEstimateMultFactor(rowest_mult); hypre_assert(errcode == 0); } errcode = HYPRE_SetSpGemmUseVendor(use_vendor); hypre_assert(errcode == 0); errcode = hypre_SetSpGemmAlgorithm(spgemm_alg); hypre_assert(errcode == 0); ierr = hypre_SetSpGemmBinned(spgemm_binned); hypre_assert(ierr == 0); /*----------------------------------------------------------- * Set up matrix *-----------------------------------------------------------*/ time_index = hypre_InitializeTiming("Generate Matrices"); hypre_BeginTiming(time_index); if ( build_matrix_type == -2 ) { ierr = HYPRE_IJMatrixReadMM( argv[build_matrix_arg_index], comm, HYPRE_PARCSR, &ij_A ); if (ierr) { hypre_printf("ERROR: Problem reading in the system matrix in MM format!\n"); exit(1); } } else if ( build_matrix_type == -1 ) { ierr = HYPRE_IJMatrixRead( argv[build_matrix_arg_index], comm, HYPRE_PARCSR, &ij_A ); if (ierr) { hypre_printf("ERROR: Problem reading in the system matrix!\n"); exit(1); } } else if ( build_matrix_type == 0 ) { BuildParFromFile(argc, argv, build_matrix_arg_index, &parcsr_A); } else if ( build_matrix_type == 1 ) { HYPRE_Int ierr1 = HYPRE_IJMatrixRead( argv[build_matrix_arg_index], comm, HYPRE_PARCSR, &ij_A ); HYPRE_Int ierr2 = HYPRE_IJMatrixRead( argv[build_matrix_arg_index + 1], comm, HYPRE_PARCSR, &ij_P ); if (ierr1 || ierr2) { hypre_printf("ERROR: Problem reading in the system matrix!\n"); exit(1); } } else if ( build_matrix_type == 2 ) { BuildParLaplacian(argc, argv, build_matrix_arg_index, &parcsr_A); } else if ( build_matrix_type == 3 ) { BuildParLaplacian9pt(argc, argv, build_matrix_arg_index, &parcsr_A); } else if ( build_matrix_type == 4 ) { BuildParLaplacian27pt(argc, argv, build_matrix_arg_index, &parcsr_A); } else if ( build_matrix_type == 5 ) { BuildParDifConv(argc, argv, build_matrix_arg_index, &parcsr_A); } else if ( build_matrix_type == 7 ) { BuildParRotate7pt(argc, argv, build_matrix_arg_index, &parcsr_A); } else { hypre_printf("You have asked for an unsupported problem with\n"); hypre_printf("build_matrix_type = %d.\n", build_matrix_type); return (-1); } /* first matrix */ if (ij_A) { ierr = HYPRE_IJMatrixGetLocalRange( ij_A, &first_local_row, &last_local_row, &first_local_col, &last_local_col ); ierr += HYPRE_IJMatrixGetObject( ij_A, &object); parcsr_A = (HYPRE_ParCSRMatrix) object; } else { /*----------------------------------------------------------- * Copy the parcsr matrix into the IJMatrix through interface calls *-----------------------------------------------------------*/ ierr = HYPRE_ParCSRMatrixGetLocalRange( parcsr_A, &first_local_row, &last_local_row, &first_local_col, &last_local_col ); } hypre_ParCSRMatrixSetNumNonzeros(parcsr_A); /* [optional] second matrix */ if (ij_P) { ierr += HYPRE_IJMatrixGetObject( ij_P, &object); parcsr_P = (HYPRE_ParCSRMatrix) object; } if (parcsr_P) { hypre_ParCSRMatrixSetNumNonzeros(parcsr_P); } hypre_EndTiming(time_index); hypre_PrintTiming("Generate Matrices", hypre_MPI_COMM_WORLD); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); hypre_ParCSRMatrixMigrate(parcsr_A, hypre_HandleMemoryLocation(hypre_handle())); if (parcsr_P) { hypre_ParCSRMatrixMigrate(parcsr_P, hypre_HandleMemoryLocation(hypre_handle())); } if (job == 1) { runjob1(parcsr_A, print_system, rep, verify); } else if (job == 2) { runjob2(parcsr_A, print_system, rep, verify); } else if (job == 3) { runjob3(parcsr_A, parcsr_P, boolean_P, print_system, rap2, mult_order, rep, verify); } else if (job == 4) { runjob4(parcsr_A, print_system, rap2, mult_order, rep, verify); } else if (job == 5) { runjob5(parcsr_A, print_system, rep, verify); } /*----------------------------------------------------------- * Finalize things *-----------------------------------------------------------*/ if (ij_A) { HYPRE_IJMatrixDestroy(ij_A); } else { HYPRE_ParCSRMatrixDestroy(parcsr_A); } if (ij_P) { HYPRE_IJMatrixDestroy(ij_P); } final: hypre_TFree(gpu_ptr, HYPRE_MEMORY_DEVICE); /* Finalize Hypre */ HYPRE_Finalize(); /* Finalize MPI */ hypre_MPI_Finalize(); return (0); } /*---------------------------------------------------------------------- * Build matrix from file. Expects three files on each processor. * filename.D.n contains the diagonal part, filename.O.n contains * the offdiagonal part and filename.INFO.n contains global row * and column numbers, number of columns of offdiagonal matrix * and the mapping of offdiagonal column numbers to global column numbers. * Parameters given in command line. *----------------------------------------------------------------------*/ HYPRE_Int BuildParFromFile( HYPRE_Int argc, char *argv[], HYPRE_Int arg_index, HYPRE_ParCSRMatrix *A_ptr ) { char *filename; HYPRE_ParCSRMatrix A; HYPRE_Int myid; /*----------------------------------------------------------- * Initialize some stuff *-----------------------------------------------------------*/ hypre_MPI_Comm_rank(hypre_MPI_COMM_WORLD, &myid ); /*----------------------------------------------------------- * Parse command line *-----------------------------------------------------------*/ if (arg_index < argc) { filename = argv[arg_index]; } else { hypre_printf("Error: No filename specified \n"); exit(1); } /*----------------------------------------------------------- * Print driver parameters *-----------------------------------------------------------*/ if (myid == 0) { hypre_printf(" FromFile: %s\n", filename); } /*----------------------------------------------------------- * Generate the matrix *-----------------------------------------------------------*/ HYPRE_ParCSRMatrixRead(hypre_MPI_COMM_WORLD, filename, &A); *A_ptr = A; return (0); } /*---------------------------------------------------------------------- * Build rhs from file. Expects two files on each processor. * filename.n contains the data and * and filename.INFO.n contains global row * numbers *----------------------------------------------------------------------*/ HYPRE_Int BuildParRhsFromFile( HYPRE_Int argc, char *argv[], HYPRE_Int arg_index, HYPRE_ParVector *b_ptr ) { char *filename; HYPRE_ParVector b; HYPRE_Int myid; /*----------------------------------------------------------- * Initialize some stuff *-----------------------------------------------------------*/ hypre_MPI_Comm_rank(hypre_MPI_COMM_WORLD, &myid ); /*----------------------------------------------------------- * Parse command line *-----------------------------------------------------------*/ if (arg_index < argc) { filename = argv[arg_index]; } else { hypre_printf("Error: No filename specified \n"); exit(1); } /*----------------------------------------------------------- * Print driver parameters *-----------------------------------------------------------*/ if (myid == 0) { hypre_printf(" RhsFromParFile: %s\n", filename); } /*----------------------------------------------------------- * Generate the matrix *-----------------------------------------------------------*/ HYPRE_ParVectorRead(hypre_MPI_COMM_WORLD, filename, &b); *b_ptr = b; return (0); } /*---------------------------------------------------------------------- * Build standard 7-point laplacian in 3D with grid and anisotropy. * Parameters given in command line. *----------------------------------------------------------------------*/ HYPRE_Int BuildParLaplacian( HYPRE_Int argc, char *argv[], HYPRE_Int arg_index, HYPRE_ParCSRMatrix *A_ptr ) { HYPRE_Int nx, ny, nz; HYPRE_Int P, Q, R; HYPRE_Real cx, cy, cz; HYPRE_ParCSRMatrix A; HYPRE_Int num_procs, myid; HYPRE_Int p, q, r; HYPRE_Int num_fun = 1; HYPRE_Real *values; HYPRE_Real *mtrx; HYPRE_Real ep = .1; HYPRE_Int system_vcoef = 0; HYPRE_Int sys_opt = 0; HYPRE_Int vcoef_opt = 0; /*----------------------------------------------------------- * Initialize some stuff *-----------------------------------------------------------*/ hypre_MPI_Comm_size(hypre_MPI_COMM_WORLD, &num_procs ); hypre_MPI_Comm_rank(hypre_MPI_COMM_WORLD, &myid ); /*----------------------------------------------------------- * Set defaults *-----------------------------------------------------------*/ nx = 10; ny = 10; nz = 10; P = 1; Q = num_procs; R = 1; cx = 1.; cy = 1.; cz = 1.; /*----------------------------------------------------------- * Parse command line *-----------------------------------------------------------*/ arg_index = 0; while (arg_index < argc) { if ( strcmp(argv[arg_index], "-n") == 0 ) { arg_index++; nx = atoi(argv[arg_index++]); ny = atoi(argv[arg_index++]); nz = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-P") == 0 ) { arg_index++; P = atoi(argv[arg_index++]); Q = atoi(argv[arg_index++]); R = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-c") == 0 ) { arg_index++; cx = (HYPRE_Real)atof(argv[arg_index++]); cy = (HYPRE_Real)atof(argv[arg_index++]); cz = (HYPRE_Real)atof(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-sysL") == 0 ) { arg_index++; num_fun = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-sysL_opt") == 0 ) { arg_index++; sys_opt = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-sys_vcoef") == 0 ) { /* have to use -sysL for this to */ arg_index++; system_vcoef = 1; } else if ( strcmp(argv[arg_index], "-sys_vcoef_opt") == 0 ) { arg_index++; vcoef_opt = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-ep") == 0 ) { arg_index++; ep = (HYPRE_Real)atof(argv[arg_index++]); } else { arg_index++; } } /*----------------------------------------------------------- * Check a few things *-----------------------------------------------------------*/ if ((P * Q * R) != num_procs) { hypre_printf("Error: Invalid number of processors or processor topology \n"); exit(1); } /*----------------------------------------------------------- * Print driver parameters *-----------------------------------------------------------*/ if (myid == 0) { hypre_printf(" Laplacian: num_fun = %d\n", num_fun); hypre_printf(" (nx, ny, nz) = (%d, %d, %d)\n", nx, ny, nz); hypre_printf(" (Px, Py, Pz) = (%d, %d, %d)\n", P, Q, R); hypre_printf(" (cx, cy, cz) = (%f, %f, %f)\n\n", cx, cy, cz); } /*----------------------------------------------------------- * Set up the grid structure *-----------------------------------------------------------*/ /* compute p,q,r from P,Q,R and myid */ p = myid % P; q = (( myid - p) / P) % Q; r = ( myid - p - P * q) / ( P * Q ); /*----------------------------------------------------------- * Generate the matrix *-----------------------------------------------------------*/ values = hypre_CTAlloc(HYPRE_Real, 4, HYPRE_MEMORY_HOST); values[1] = -cx; values[2] = -cy; values[3] = -cz; values[0] = 0.; if (nx > 1) { values[0] += 2.0 * cx; } if (ny > 1) { values[0] += 2.0 * cy; } if (nz > 1) { values[0] += 2.0 * cz; } if (num_fun == 1) A = (HYPRE_ParCSRMatrix) GenerateLaplacian(hypre_MPI_COMM_WORLD, nx, ny, nz, P, Q, R, p, q, r, values); else { mtrx = hypre_CTAlloc(HYPRE_Real, num_fun * num_fun, HYPRE_MEMORY_HOST); if (num_fun == 2) { if (sys_opt == 1) /* identity */ { mtrx[0] = 1.0; mtrx[1] = 0.0; mtrx[2] = 0.0; mtrx[3] = 1.0; } else if (sys_opt == 2) { mtrx[0] = 1.0; mtrx[1] = 0.0; mtrx[2] = 0.0; mtrx[3] = 20.0; } else if (sys_opt == 3) /* similar to barry's talk - ex1 */ { mtrx[0] = 1.0; mtrx[1] = 2.0; mtrx[2] = 2.0; mtrx[3] = 1.0; } else if (sys_opt == 4) /* can use with vcoef to get barry's ex*/ { mtrx[0] = 1.0; mtrx[1] = 1.0; mtrx[2] = 1.0; mtrx[3] = 1.0; } else if (sys_opt == 5) /* barry's talk - ex1 */ { mtrx[0] = 1.0; mtrx[1] = 1.1; mtrx[2] = 1.1; mtrx[3] = 1.0; } else if (sys_opt == 6) /* */ { mtrx[0] = 1.1; mtrx[1] = 1.0; mtrx[2] = 1.0; mtrx[3] = 1.1; } else /* == 0 */ { mtrx[0] = 2; mtrx[1] = 1; mtrx[2] = 1; mtrx[3] = 2; } } else if (num_fun == 3) { if (sys_opt == 1) { mtrx[0] = 1.0; mtrx[1] = 0.0; mtrx[2] = 0.0; mtrx[3] = 0.0; mtrx[4] = 1.0; mtrx[5] = 0.0; mtrx[6] = 0.0; mtrx[7] = 0.0; mtrx[8] = 1.0; } else if (sys_opt == 2) { mtrx[0] = 1.0; mtrx[1] = 0.0; mtrx[2] = 0.0; mtrx[3] = 0.0; mtrx[4] = 20.0; mtrx[5] = 0.0; mtrx[6] = 0.0; mtrx[7] = 0.0; mtrx[8] = .01; } else if (sys_opt == 3) { mtrx[0] = 1.01; mtrx[1] = 1; mtrx[2] = 0.0; mtrx[3] = 1; mtrx[4] = 2; mtrx[5] = 1; mtrx[6] = 0.0; mtrx[7] = 1; mtrx[8] = 1.01; } else if (sys_opt == 4) /* barry ex4 */ { mtrx[0] = 3; mtrx[1] = 1; mtrx[2] = 0.0; mtrx[3] = 1; mtrx[4] = 4; mtrx[5] = 2; mtrx[6] = 0.0; mtrx[7] = 2; mtrx[8] = .25; } else /* == 0 */ { mtrx[0] = 2.0; mtrx[1] = 1.0; mtrx[2] = 0.0; mtrx[3] = 1.0; mtrx[4] = 2.0; mtrx[5] = 1.0; mtrx[6] = 0.0; mtrx[7] = 1.0; mtrx[8] = 2.0; } } else if (num_fun == 4) { mtrx[0] = 1.01; mtrx[1] = 1; mtrx[2] = 0.0; mtrx[3] = 0.0; mtrx[4] = 1; mtrx[5] = 2; mtrx[6] = 1; mtrx[7] = 0.0; mtrx[8] = 0.0; mtrx[9] = 1; mtrx[10] = 1.01; mtrx[11] = 0.0; mtrx[12] = 2; mtrx[13] = 1; mtrx[14] = 0.0; mtrx[15] = 1; } if (!system_vcoef) { A = (HYPRE_ParCSRMatrix) GenerateSysLaplacian(hypre_MPI_COMM_WORLD, nx, ny, nz, P, Q, R, p, q, r, num_fun, mtrx, values); } else { HYPRE_Real *mtrx_values; mtrx_values = hypre_CTAlloc(HYPRE_Real, num_fun * num_fun * 4, HYPRE_MEMORY_HOST); if (num_fun == 2) { if (vcoef_opt == 1) { /* Barry's talk * - must also have sys_opt = 4, all fail */ mtrx[0] = 1.0; SetSysVcoefValues(num_fun, nx, ny, nz, 1.0, .10, 1.0, 0, mtrx_values); mtrx[1] = 1.0; SetSysVcoefValues(num_fun, nx, ny, nz, .1, 1.0, 1.0, 1, mtrx_values); mtrx[2] = 1.0; SetSysVcoefValues(num_fun, nx, ny, nz, .01, 1.0, 1.0, 2, mtrx_values); mtrx[3] = 1.0; SetSysVcoefValues(num_fun, nx, ny, nz, 2.0, .02, 1.0, 3, mtrx_values); } else if (vcoef_opt == 2) { /* Barry's talk * - ex2 - if have sys-opt = 4*/ mtrx[0] = 1.0; SetSysVcoefValues(num_fun, nx, ny, nz, 1.0, .010, 1.0, 0, mtrx_values); mtrx[1] = 200.0; SetSysVcoefValues(num_fun, nx, ny, nz, 1.0, 1.0, 1.0, 1, mtrx_values); mtrx[2] = 200.0; SetSysVcoefValues(num_fun, nx, ny, nz, 1.0, 1.0, 1.0, 2, mtrx_values); mtrx[3] = 1.0; SetSysVcoefValues(num_fun, nx, ny, nz, 2.0, .02, 1.0, 3, mtrx_values); } else if (vcoef_opt == 3) /* use with default sys_opt - ulrike ex 3*/ { /* mtrx[0] */ SetSysVcoefValues(num_fun, nx, ny, nz, ep * 1.0, 1.0, 1.0, 0, mtrx_values); /* mtrx[1] */ SetSysVcoefValues(num_fun, nx, ny, nz, 1.0, 1.0, 1.0, 1, mtrx_values); /* mtrx[2] */ SetSysVcoefValues(num_fun, nx, ny, nz, ep * 1.0, 1.0, 1.0, 2, mtrx_values); /* mtrx[3] */ SetSysVcoefValues(num_fun, nx, ny, nz, 1.0, 1.0, 1.0, 3, mtrx_values); } else if (vcoef_opt == 4) /* use with default sys_opt - ulrike ex 4*/ { HYPRE_Real ep2 = ep; /* mtrx[0] */ SetSysVcoefValues(num_fun, nx, ny, nz, ep * 1.0, 1.0, 1.0, 0, mtrx_values); /* mtrx[1] */ SetSysVcoefValues(num_fun, nx, ny, nz, 1.0, ep * 1.0, 1.0, 1, mtrx_values); /* mtrx[2] */ SetSysVcoefValues(num_fun, nx, ny, nz, ep * 1.0, 1.0, 1.0, 2, mtrx_values); /* mtrx[3] */ SetSysVcoefValues(num_fun, nx, ny, nz, 1.0, ep2 * 1.0, 1.0, 3, mtrx_values); } else if (vcoef_opt == 5) /* use with default sys_opt - */ { HYPRE_Real alp, beta; alp = .001; beta = 10; /* mtrx[0] */ SetSysVcoefValues(num_fun, nx, ny, nz, alp * 1.0, 1.0, 1.0, 0, mtrx_values); /* mtrx[1] */ SetSysVcoefValues(num_fun, nx, ny, nz, 1.0, beta * 1.0, 1.0, 1, mtrx_values); /* mtrx[2] */ SetSysVcoefValues(num_fun, nx, ny, nz, alp * 1.0, 1.0, 1.0, 2, mtrx_values); /* mtrx[3] */ SetSysVcoefValues(num_fun, nx, ny, nz, 1.0, beta * 1.0, 1.0, 3, mtrx_values); } else /* = 0 */ { /* mtrx[0] */ SetSysVcoefValues(num_fun, nx, ny, nz, 1.0, 1.0, 1.0, 0, mtrx_values); /* mtrx[1] */ SetSysVcoefValues(num_fun, nx, ny, nz, 1.0, 2.0, 1.0, 1, mtrx_values); /* mtrx[2] */ SetSysVcoefValues(num_fun, nx, ny, nz, 2.0, 1.0, 0.0, 2, mtrx_values); /* mtrx[3] */ SetSysVcoefValues(num_fun, nx, ny, nz, 1.0, 3.0, 1.0, 3, mtrx_values); } } else if (num_fun == 3) { mtrx[0] = 1; SetSysVcoefValues(num_fun, nx, ny, nz, 1, .01, 1, 0, mtrx_values); mtrx[1] = 1; SetSysVcoefValues(num_fun, nx, ny, nz, 1, 1, 1, 1, mtrx_values); mtrx[2] = 0.0; SetSysVcoefValues(num_fun, nx, ny, nz, 1, 1, 1, 2, mtrx_values); mtrx[3] = 1; SetSysVcoefValues(num_fun, nx, ny, nz, 1, 1, 1, 3, mtrx_values); mtrx[4] = 1; SetSysVcoefValues(num_fun, nx, ny, nz, 2, .02, 1, 4, mtrx_values); mtrx[5] = 2; SetSysVcoefValues(num_fun, nx, ny, nz, 1, 1, 1, 5, mtrx_values); mtrx[6] = 0.0; SetSysVcoefValues(num_fun, nx, ny, nz, 1, 1, 1, 6, mtrx_values); mtrx[7] = 2; SetSysVcoefValues(num_fun, nx, ny, nz, 1, 1, 1, 7, mtrx_values); mtrx[8] = 1; SetSysVcoefValues(num_fun, nx, ny, nz, 1.5, .04, 1, 8, mtrx_values); } A = (HYPRE_ParCSRMatrix) GenerateSysLaplacianVCoef(hypre_MPI_COMM_WORLD, nx, ny, nz, P, Q, R, p, q, r, num_fun, mtrx, mtrx_values); hypre_TFree(mtrx_values, HYPRE_MEMORY_HOST); } hypre_TFree(mtrx, HYPRE_MEMORY_HOST); } hypre_TFree(values, HYPRE_MEMORY_HOST); *A_ptr = A; return (0); } /*---------------------------------------------------------------------- * returns the sign of a real number * 1 : positive * 0 : zero * -1 : negative *----------------------------------------------------------------------*/ static inline HYPRE_Int sign_double(HYPRE_Real a) { return ( (0.0 < a) - (0.0 > a) ); } /*---------------------------------------------------------------------- * Build standard 7-point convection-diffusion operator * Parameters given in command line. * Operator: * * -cx Dxx - cy Dyy - cz Dzz + ax Dx + ay Dy + az Dz = f * *----------------------------------------------------------------------*/ HYPRE_Int BuildParDifConv( HYPRE_Int argc, char *argv[], HYPRE_Int arg_index, HYPRE_ParCSRMatrix *A_ptr) { HYPRE_Int nx, ny, nz; HYPRE_Int P, Q, R; HYPRE_Real cx, cy, cz; HYPRE_Real ax, ay, az, atype; HYPRE_Real hinx, hiny, hinz; HYPRE_Int sign_prod; HYPRE_ParCSRMatrix A; HYPRE_Int num_procs, myid; HYPRE_Int p, q, r; HYPRE_Real *values; /*----------------------------------------------------------- * Initialize some stuff *-----------------------------------------------------------*/ hypre_MPI_Comm_size(hypre_MPI_COMM_WORLD, &num_procs ); hypre_MPI_Comm_rank(hypre_MPI_COMM_WORLD, &myid ); /*----------------------------------------------------------- * Set defaults *-----------------------------------------------------------*/ nx = 10; ny = 10; nz = 10; P = 1; Q = num_procs; R = 1; cx = 1.; cy = 1.; cz = 1.; ax = 1.; ay = 1.; az = 1.; atype = 0; /*----------------------------------------------------------- * Parse command line *-----------------------------------------------------------*/ arg_index = 0; while (arg_index < argc) { if ( strcmp(argv[arg_index], "-n") == 0 ) { arg_index++; nx = atoi(argv[arg_index++]); ny = atoi(argv[arg_index++]); nz = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-P") == 0 ) { arg_index++; P = atoi(argv[arg_index++]); Q = atoi(argv[arg_index++]); R = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-c") == 0 ) { arg_index++; cx = (HYPRE_Real)atof(argv[arg_index++]); cy = (HYPRE_Real)atof(argv[arg_index++]); cz = (HYPRE_Real)atof(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-a") == 0 ) { arg_index++; ax = (HYPRE_Real)atof(argv[arg_index++]); ay = (HYPRE_Real)atof(argv[arg_index++]); az = (HYPRE_Real)atof(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-atype") == 0 ) { arg_index++; atype = atoi(argv[arg_index++]); } else { arg_index++; } } /*----------------------------------------------------------- * Check a few things *-----------------------------------------------------------*/ if ((P * Q * R) != num_procs) { hypre_printf("Error: Invalid number of processors or processor topology \n"); exit(1); } /*----------------------------------------------------------- * Print driver parameters *-----------------------------------------------------------*/ if (myid == 0) { hypre_printf(" Convection-Diffusion: \n"); hypre_printf(" -cx Dxx - cy Dyy - cz Dzz + ax Dx + ay Dy + az Dz = f\n"); hypre_printf(" (nx, ny, nz) = (%d, %d, %d)\n", nx, ny, nz); hypre_printf(" (Px, Py, Pz) = (%d, %d, %d)\n", P, Q, R); hypre_printf(" (cx, cy, cz) = (%f, %f, %f)\n", cx, cy, cz); hypre_printf(" (ax, ay, az) = (%f, %f, %f)\n\n", ax, ay, az); } /*----------------------------------------------------------- * Set up the grid structure *-----------------------------------------------------------*/ /* compute p,q,r from P,Q,R and myid */ p = myid % P; q = (( myid - p) / P) % Q; r = ( myid - p - P * q) / ( P * Q ); hinx = 1. / (nx + 1); hiny = 1. / (ny + 1); hinz = 1. / (nz + 1); /*----------------------------------------------------------- * Generate the matrix *-----------------------------------------------------------*/ /* values[7]: * [0]: center * [1]: X- * [2]: Y- * [3]: Z- * [4]: X+ * [5]: Y+ * [6]: Z+ */ values = hypre_CTAlloc(HYPRE_Real, 7, HYPRE_MEMORY_HOST); values[0] = 0.; if (0 == atype) /* forward scheme for conv */ { values[1] = -cx / (hinx * hinx); values[2] = -cy / (hiny * hiny); values[3] = -cz / (hinz * hinz); values[4] = -cx / (hinx * hinx) + ax / hinx; values[5] = -cy / (hiny * hiny) + ay / hiny; values[6] = -cz / (hinz * hinz) + az / hinz; if (nx > 1) { values[0] += 2.0 * cx / (hinx * hinx) - 1.*ax / hinx; } if (ny > 1) { values[0] += 2.0 * cy / (hiny * hiny) - 1.*ay / hiny; } if (nz > 1) { values[0] += 2.0 * cz / (hinz * hinz) - 1.*az / hinz; } } else if (1 == atype) /* backward scheme for conv */ { values[1] = -cx / (hinx * hinx) - ax / hinx; values[2] = -cy / (hiny * hiny) - ay / hiny; values[3] = -cz / (hinz * hinz) - az / hinz; values[4] = -cx / (hinx * hinx); values[5] = -cy / (hiny * hiny); values[6] = -cz / (hinz * hinz); if (nx > 1) { values[0] += 2.0 * cx / (hinx * hinx) + 1.*ax / hinx; } if (ny > 1) { values[0] += 2.0 * cy / (hiny * hiny) + 1.*ay / hiny; } if (nz > 1) { values[0] += 2.0 * cz / (hinz * hinz) + 1.*az / hinz; } } else if (3 == atype) /* upwind scheme */ { sign_prod = sign_double(cx) * sign_double(ax); if (sign_prod == 1) /* same sign use back scheme */ { values[1] = -cx / (hinx * hinx) - ax / hinx; values[4] = -cx / (hinx * hinx); if (nx > 1) { values[0] += 2.0 * cx / (hinx * hinx) + 1.*ax / hinx; } } else /* diff sign use forward scheme */ { values[1] = -cx / (hinx * hinx); values[4] = -cx / (hinx * hinx) + ax / hinx; if (nx > 1) { values[0] += 2.0 * cx / (hinx * hinx) - 1.*ax / hinx; } } sign_prod = sign_double(cy) * sign_double(ay); if (sign_prod == 1) /* same sign use back scheme */ { values[2] = -cy / (hiny * hiny) - ay / hiny; values[5] = -cy / (hiny * hiny); if (ny > 1) { values[0] += 2.0 * cy / (hiny * hiny) + 1.*ay / hiny; } } else /* diff sign use forward scheme */ { values[2] = -cy / (hiny * hiny); values[5] = -cy / (hiny * hiny) + ay / hiny; if (ny > 1) { values[0] += 2.0 * cy / (hiny * hiny) - 1.*ay / hiny; } } sign_prod = sign_double(cz) * sign_double(az); if (sign_prod == 1) /* same sign use back scheme */ { values[3] = -cz / (hinz * hinz) - az / hinz; values[6] = -cz / (hinz * hinz); if (nz > 1) { values[0] += 2.0 * cz / (hinz * hinz) + 1.*az / hinz; } } else /* diff sign use forward scheme */ { values[3] = -cz / (hinz * hinz); values[6] = -cz / (hinz * hinz) + az / hinz; if (nz > 1) { values[0] += 2.0 * cz / (hinz * hinz) - 1.*az / hinz; } } } else /* centered difference scheme */ { values[1] = -cx / (hinx * hinx) - ax / (2.*hinx); values[2] = -cy / (hiny * hiny) - ay / (2.*hiny); values[3] = -cz / (hinz * hinz) - az / (2.*hinz); values[4] = -cx / (hinx * hinx) + ax / (2.*hinx); values[5] = -cy / (hiny * hiny) + ay / (2.*hiny); values[6] = -cz / (hinz * hinz) + az / (2.*hinz); if (nx > 1) { values[0] += 2.0 * cx / (hinx * hinx); } if (ny > 1) { values[0] += 2.0 * cy / (hiny * hiny); } if (nz > 1) { values[0] += 2.0 * cz / (hinz * hinz); } } A = (HYPRE_ParCSRMatrix) GenerateDifConv(hypre_MPI_COMM_WORLD, nx, ny, nz, P, Q, R, p, q, r, values); hypre_TFree(values, HYPRE_MEMORY_HOST); *A_ptr = A; return (0); } /*---------------------------------------------------------------------- * Build standard 9-point laplacian in 2D with grid and anisotropy. * Parameters given in command line. *----------------------------------------------------------------------*/ HYPRE_Int BuildParLaplacian9pt( HYPRE_Int argc, char *argv[], HYPRE_Int arg_index, HYPRE_ParCSRMatrix *A_ptr ) { HYPRE_Int nx, ny; HYPRE_Int P, Q; HYPRE_ParCSRMatrix A; HYPRE_Int num_procs, myid; HYPRE_Int p, q; HYPRE_Real *values; /*----------------------------------------------------------- * Initialize some stuff *-----------------------------------------------------------*/ hypre_MPI_Comm_size(hypre_MPI_COMM_WORLD, &num_procs ); hypre_MPI_Comm_rank(hypre_MPI_COMM_WORLD, &myid ); /*----------------------------------------------------------- * Set defaults *-----------------------------------------------------------*/ nx = 10; ny = 10; P = 1; Q = num_procs; /*----------------------------------------------------------- * Parse command line *-----------------------------------------------------------*/ arg_index = 0; while (arg_index < argc) { if ( strcmp(argv[arg_index], "-n") == 0 ) { arg_index++; nx = atoi(argv[arg_index++]); ny = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-P") == 0 ) { arg_index++; P = atoi(argv[arg_index++]); Q = atoi(argv[arg_index++]); } else { arg_index++; } } /*----------------------------------------------------------- * Check a few things *-----------------------------------------------------------*/ if ((P * Q) != num_procs) { hypre_printf("Error: Invalid number of processors or processor topology \n"); exit(1); } /*----------------------------------------------------------- * Print driver parameters *-----------------------------------------------------------*/ if (myid == 0) { hypre_printf(" Laplacian 9pt:\n"); hypre_printf(" (nx, ny) = (%d, %d)\n", nx, ny); hypre_printf(" (Px, Py) = (%d, %d)\n\n", P, Q); } /*----------------------------------------------------------- * Set up the grid structure *-----------------------------------------------------------*/ /* compute p,q from P,Q and myid */ p = myid % P; q = ( myid - p) / P; /*----------------------------------------------------------- * Generate the matrix *-----------------------------------------------------------*/ values = hypre_CTAlloc(HYPRE_Real, 2, HYPRE_MEMORY_HOST); values[1] = -1.; values[0] = 0.; if (nx > 1) { values[0] += 2.0; } if (ny > 1) { values[0] += 2.0; } if (nx > 1 && ny > 1) { values[0] += 4.0; } A = (HYPRE_ParCSRMatrix) GenerateLaplacian9pt(hypre_MPI_COMM_WORLD, nx, ny, P, Q, p, q, values); hypre_TFree(values, HYPRE_MEMORY_HOST); *A_ptr = A; return (0); } /*---------------------------------------------------------------------- * Build 27-point laplacian in 3D, * Parameters given in command line. *----------------------------------------------------------------------*/ HYPRE_Int BuildParLaplacian27pt( HYPRE_Int argc, char *argv[], HYPRE_Int arg_index, HYPRE_ParCSRMatrix *A_ptr ) { HYPRE_Int nx, ny, nz; HYPRE_Int P, Q, R; HYPRE_ParCSRMatrix A; HYPRE_Int num_procs, myid; HYPRE_Int p, q, r; HYPRE_Real *values; /*----------------------------------------------------------- * Initialize some stuff *-----------------------------------------------------------*/ hypre_MPI_Comm_size(hypre_MPI_COMM_WORLD, &num_procs ); hypre_MPI_Comm_rank(hypre_MPI_COMM_WORLD, &myid ); /*----------------------------------------------------------- * Set defaults *-----------------------------------------------------------*/ nx = 10; ny = 10; nz = 10; P = 1; Q = num_procs; R = 1; /*----------------------------------------------------------- * Parse command line *-----------------------------------------------------------*/ arg_index = 0; while (arg_index < argc) { if ( strcmp(argv[arg_index], "-n") == 0 ) { arg_index++; nx = atoi(argv[arg_index++]); ny = atoi(argv[arg_index++]); nz = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-P") == 0 ) { arg_index++; P = atoi(argv[arg_index++]); Q = atoi(argv[arg_index++]); R = atoi(argv[arg_index++]); } else { arg_index++; } } /*----------------------------------------------------------- * Check a few things *-----------------------------------------------------------*/ if ((P * Q * R) != num_procs) { hypre_printf("Error: Invalid number of processors or processor topology \n"); exit(1); } /*----------------------------------------------------------- * Print driver parameters *-----------------------------------------------------------*/ if (myid == 0) { hypre_printf(" Laplacian_27pt:\n"); hypre_printf(" (nx, ny, nz) = (%d, %d, %d)\n", nx, ny, nz); hypre_printf(" (Px, Py, Pz) = (%d, %d, %d)\n\n", P, Q, R); } /*----------------------------------------------------------- * Set up the grid structure *-----------------------------------------------------------*/ /* compute p,q,r from P,Q,R and myid */ p = myid % P; q = (( myid - p) / P) % Q; r = ( myid - p - P * q) / ( P * Q ); /*----------------------------------------------------------- * Generate the matrix *-----------------------------------------------------------*/ values = hypre_CTAlloc(HYPRE_Real, 2, HYPRE_MEMORY_HOST); values[0] = 26.0; if (nx == 1 || ny == 1 || nz == 1) { values[0] = 8.0; } if (nx * ny == 1 || nx * nz == 1 || ny * nz == 1) { values[0] = 2.0; } values[1] = -1.; A = (HYPRE_ParCSRMatrix) GenerateLaplacian27pt(hypre_MPI_COMM_WORLD, nx, ny, nz, P, Q, R, p, q, r, values); hypre_TFree(values, HYPRE_MEMORY_HOST); *A_ptr = A; return (0); } /*---------------------------------------------------------------------- * Build 7-point in 2D * Parameters given in command line. *----------------------------------------------------------------------*/ HYPRE_Int BuildParRotate7pt( HYPRE_Int argc, char *argv[], HYPRE_Int arg_index, HYPRE_ParCSRMatrix *A_ptr ) { HYPRE_Int nx, ny; HYPRE_Int P, Q; HYPRE_ParCSRMatrix A; HYPRE_Int num_procs, myid; HYPRE_Int p, q; HYPRE_Real eps = 0.0, alpha = 1.0; /*----------------------------------------------------------- * Initialize some stuff *-----------------------------------------------------------*/ hypre_MPI_Comm_size(hypre_MPI_COMM_WORLD, &num_procs ); hypre_MPI_Comm_rank(hypre_MPI_COMM_WORLD, &myid ); /*----------------------------------------------------------- * Set defaults *-----------------------------------------------------------*/ nx = 10; ny = 10; P = 1; Q = num_procs; /*----------------------------------------------------------- * Parse command line *-----------------------------------------------------------*/ arg_index = 0; while (arg_index < argc) { if ( strcmp(argv[arg_index], "-n") == 0 ) { arg_index++; nx = atoi(argv[arg_index++]); ny = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-P") == 0 ) { arg_index++; P = atoi(argv[arg_index++]); Q = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-alpha") == 0 ) { arg_index++; alpha = (HYPRE_Real)atof(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-eps") == 0 ) { arg_index++; eps = (HYPRE_Real)atof(argv[arg_index++]); } else { arg_index++; } } /*----------------------------------------------------------- * Check a few things *-----------------------------------------------------------*/ if ((P * Q) != num_procs) { hypre_printf("Error: Invalid number of processors or processor topology \n"); exit(1); } /*----------------------------------------------------------- * Print driver parameters *-----------------------------------------------------------*/ if (myid == 0) { hypre_printf(" Rotate 7pt:\n"); hypre_printf(" alpha = %f, eps = %f\n", alpha, eps); hypre_printf(" (nx, ny) = (%d, %d)\n", nx, ny); hypre_printf(" (Px, Py) = (%d, %d)\n", P, Q); } /*----------------------------------------------------------- * Set up the grid structure *-----------------------------------------------------------*/ /* compute p,q from P,Q and myid */ p = myid % P; q = ( myid - p) / P; /*----------------------------------------------------------- * Generate the matrix *-----------------------------------------------------------*/ A = (HYPRE_ParCSRMatrix) GenerateRotate7pt(hypre_MPI_COMM_WORLD, nx, ny, P, Q, p, q, alpha, eps); *A_ptr = A; return (0); } /*---------------------------------------------------------------------- * Build standard 7-point difference operator using centered differences * * eps*(a(x,y,z) ux)x + (b(x,y,z) uy)y + (c(x,y,z) uz)z * d(x,y,z) ux + e(x,y,z) uy + f(x,y,z) uz + g(x,y,z) u * * functions a,b,c,d,e,f,g need to be defined inside par_vardifconv.c * *----------------------------------------------------------------------*/ HYPRE_Int BuildParVarDifConv( HYPRE_Int argc, char *argv[], HYPRE_Int arg_index, HYPRE_ParCSRMatrix *A_ptr, HYPRE_ParVector *rhs_ptr ) { HYPRE_Int nx, ny, nz; HYPRE_Int P, Q, R; HYPRE_ParCSRMatrix A; HYPRE_ParVector rhs; HYPRE_Int num_procs, myid; HYPRE_Int p, q, r; HYPRE_Int type; HYPRE_Real eps; /*----------------------------------------------------------- * Initialize some stuff *-----------------------------------------------------------*/ hypre_MPI_Comm_size(hypre_MPI_COMM_WORLD, &num_procs ); hypre_MPI_Comm_rank(hypre_MPI_COMM_WORLD, &myid ); /*----------------------------------------------------------- * Set defaults *-----------------------------------------------------------*/ nx = 10; ny = 10; nz = 10; P = 1; Q = num_procs; R = 1; eps = 1.0; /* type: 0 : default FD; * 1-3 : FD and examples 1-3 in Ruge-Stuben paper */ type = 0; /*----------------------------------------------------------- * Parse command line *-----------------------------------------------------------*/ arg_index = 0; while (arg_index < argc) { if ( strcmp(argv[arg_index], "-n") == 0 ) { arg_index++; nx = atoi(argv[arg_index++]); ny = atoi(argv[arg_index++]); nz = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-P") == 0 ) { arg_index++; P = atoi(argv[arg_index++]); Q = atoi(argv[arg_index++]); R = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-eps") == 0 ) { arg_index++; eps = (HYPRE_Real)atof(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-vardifconvRS") == 0 ) { arg_index++; type = atoi(argv[arg_index++]); } else { arg_index++; } } /*----------------------------------------------------------- * Check a few things *-----------------------------------------------------------*/ if ((P * Q * R) != num_procs) { hypre_printf("Error: Invalid number of processors or processor topology \n"); exit(1); } /*----------------------------------------------------------- * Print driver parameters *-----------------------------------------------------------*/ if (myid == 0) { hypre_printf(" ell PDE: eps = %f\n", eps); hypre_printf(" Dx(aDxu) + Dy(bDyu) + Dz(cDzu) + d Dxu + e Dyu + f Dzu + g u= f\n"); hypre_printf(" (nx, ny, nz) = (%d, %d, %d)\n", nx, ny, nz); hypre_printf(" (Px, Py, Pz) = (%d, %d, %d)\n", P, Q, R); } /*----------------------------------------------------------- * Set up the grid structure *-----------------------------------------------------------*/ /* compute p,q,r from P,Q,R and myid */ p = myid % P; q = (( myid - p) / P) % Q; r = ( myid - p - P * q) / ( P * Q ); /*----------------------------------------------------------- * Generate the matrix *-----------------------------------------------------------*/ if (0 == type) { A = (HYPRE_ParCSRMatrix) GenerateVarDifConv(hypre_MPI_COMM_WORLD, nx, ny, nz, P, Q, R, p, q, r, eps, &rhs); } else { A = (HYPRE_ParCSRMatrix) GenerateRSVarDifConv(hypre_MPI_COMM_WORLD, nx, ny, nz, P, Q, R, p, q, r, eps, &rhs, type); } *A_ptr = A; *rhs_ptr = rhs; return (0); } /**************************************************************************/ HYPRE_Int SetSysVcoefValues(HYPRE_Int num_fun, HYPRE_BigInt nx, HYPRE_BigInt ny, HYPRE_BigInt nz, HYPRE_Real vcx, HYPRE_Real vcy, HYPRE_Real vcz, HYPRE_Int mtx_entry, HYPRE_Real *values) { HYPRE_Int sz = num_fun * num_fun; values[1 * sz + mtx_entry] = -vcx; values[2 * sz + mtx_entry] = -vcy; values[3 * sz + mtx_entry] = -vcz; values[0 * sz + mtx_entry] = 0.0; if (nx > 1) { values[0 * sz + mtx_entry] += 2.0 * vcx; } if (ny > 1) { values[0 * sz + mtx_entry] += 2.0 * vcy; } if (nz > 1) { values[0 * sz + mtx_entry] += 2.0 * vcz; } return 0; } /*---------------------------------------------------------------------- * Build coordinates for 1D/2D/3D *----------------------------------------------------------------------*/ HYPRE_Int BuildParCoordinates( HYPRE_Int argc, char *argv[], HYPRE_Int arg_index, HYPRE_Int *coorddim_ptr, float **coord_ptr ) { HYPRE_Int nx, ny, nz; HYPRE_Int P, Q, R; HYPRE_Int num_procs, myid; HYPRE_Int p, q, r; HYPRE_Int coorddim; float *coordinates; /*----------------------------------------------------------- * Initialize some stuff *-----------------------------------------------------------*/ hypre_MPI_Comm_size(hypre_MPI_COMM_WORLD, &num_procs ); hypre_MPI_Comm_rank(hypre_MPI_COMM_WORLD, &myid ); /*----------------------------------------------------------- * Set defaults *-----------------------------------------------------------*/ nx = 10; ny = 10; nz = 10; P = 1; Q = num_procs; R = 1; /*----------------------------------------------------------- * Parse command line *-----------------------------------------------------------*/ arg_index = 0; while (arg_index < argc) { if ( strcmp(argv[arg_index], "-n") == 0 ) { arg_index++; nx = atoi(argv[arg_index++]); ny = atoi(argv[arg_index++]); nz = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-P") == 0 ) { arg_index++; P = atoi(argv[arg_index++]); Q = atoi(argv[arg_index++]); R = atoi(argv[arg_index++]); } else { arg_index++; } } /* compute p,q,r from P,Q,R and myid */ p = myid % P; q = (( myid - p) / P) % Q; r = ( myid - p - P * q) / ( P * Q ); /*----------------------------------------------------------- * Generate the coordinates *-----------------------------------------------------------*/ coorddim = 3; if (nx < 2) { coorddim--; } if (ny < 2) { coorddim--; } if (nz < 2) { coorddim--; } if (coorddim > 0) { coordinates = hypre_GenerateCoordinates(hypre_MPI_COMM_WORLD, nx, ny, nz, P, Q, R, p, q, r, coorddim); } else { coordinates = NULL; } *coorddim_ptr = coorddim; *coord_ptr = coordinates; return (0); } hypre-2.33.0/src/test/maxwell_unscaled.c000066400000000000000000002226441477326011500202070ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include #include #include #include "_hypre_utilities.h" #include "HYPRE_sstruct_ls.h" #include "HYPRE_krylov.h" #include "_hypre_sstruct_mv.h" #include "_hypre_sstruct_ls.h" #define DEBUG 0 /*-------------------------------------------------------------------------- * Data structures *--------------------------------------------------------------------------*/ char infile_default[50] = "sstruct.in.default"; typedef HYPRE_Int Index[3]; typedef HYPRE_Int ProblemIndex[9]; typedef struct { /* for GridSetExtents */ HYPRE_Int nboxes; ProblemIndex *ilowers; ProblemIndex *iuppers; HYPRE_Int *boxsizes; HYPRE_Int max_boxsize; /* for GridSetVariables */ HYPRE_Int nvars; HYPRE_SStructVariable *vartypes; /* for GridAddVariables */ HYPRE_Int add_nvars; ProblemIndex *add_indexes; HYPRE_SStructVariable *add_vartypes; /* for GridSetNeighborBox */ HYPRE_Int glue_nboxes; ProblemIndex *glue_ilowers; ProblemIndex *glue_iuppers; HYPRE_Int *glue_nbor_parts; ProblemIndex *glue_nbor_ilowers; ProblemIndex *glue_nbor_iuppers; Index *glue_index_maps; /* for GraphSetStencil */ HYPRE_Int *stencil_num; /* for GraphAddEntries */ HYPRE_Int graph_nentries; ProblemIndex *graph_ilowers; ProblemIndex *graph_iuppers; Index *graph_strides; HYPRE_Int *graph_vars; HYPRE_Int *graph_to_parts; ProblemIndex *graph_to_ilowers; ProblemIndex *graph_to_iuppers; Index *graph_to_strides; HYPRE_Int *graph_to_vars; Index *graph_index_maps; Index *graph_index_signs; HYPRE_Int *graph_entries; HYPRE_Int graph_values_size; HYPRE_Real *graph_values; HYPRE_Real *d_graph_values; HYPRE_Int *graph_boxsizes; HYPRE_Int matrix_nentries; ProblemIndex *matrix_ilowers; ProblemIndex *matrix_iuppers; Index *matrix_strides; HYPRE_Int *matrix_vars; HYPRE_Int *matrix_entries; HYPRE_Int matrix_values_size; HYPRE_Real *matrix_values; HYPRE_Real *d_matrix_values; Index periodic; } ProblemPartData; typedef struct { HYPRE_Int ndim; HYPRE_Int nparts; ProblemPartData *pdata; HYPRE_Int max_boxsize; HYPRE_MemoryLocation memory_location; HYPRE_Int nstencils; HYPRE_Int *stencil_sizes; Index **stencil_offsets; HYPRE_Int **stencil_vars; HYPRE_Real **stencil_values; HYPRE_Int symmetric_nentries; HYPRE_Int *symmetric_parts; HYPRE_Int *symmetric_vars; HYPRE_Int *symmetric_to_vars; HYPRE_Int *symmetric_booleans; HYPRE_Int ns_symmetric; Index rfactor; HYPRE_Int npools; HYPRE_Int *pools; /* array of size nparts */ } ProblemData; /*-------------------------------------------------------------------------- * Read routines *--------------------------------------------------------------------------*/ HYPRE_Int SScanIntArray( char *sdata_ptr, char **sdata_ptr_ptr, HYPRE_Int size, HYPRE_Int *array ) { HYPRE_Int i; sdata_ptr += strspn(sdata_ptr, " \t\n["); for (i = 0; i < size; i++) { array[i] = strtol(sdata_ptr, &sdata_ptr, 10); } sdata_ptr += strcspn(sdata_ptr, "]") + 1; *sdata_ptr_ptr = sdata_ptr; return 0; } HYPRE_Int SScanProblemIndex( char *sdata_ptr, char **sdata_ptr_ptr, HYPRE_Int ndim, ProblemIndex index ) { HYPRE_Int i; char sign[3]; /* initialize index array */ for (i = 0; i < 9; i++) { index[i] = 0; } sdata_ptr += strspn(sdata_ptr, " \t\n("); switch (ndim) { case 1: hypre_sscanf(sdata_ptr, "%d%c", &index[0], &sign[0]); break; case 2: hypre_sscanf(sdata_ptr, "%d%c%d%c", &index[0], &sign[0], &index[1], &sign[1]); break; case 3: hypre_sscanf(sdata_ptr, "%d%c%d%c%d%c", &index[0], &sign[0], &index[1], &sign[1], &index[2], &sign[2]); break; } sdata_ptr += strcspn(sdata_ptr, ":)"); if ( *sdata_ptr == ':' ) { /* read in optional shift */ sdata_ptr += 1; switch (ndim) { case 1: hypre_sscanf(sdata_ptr, "%d", &index[6]); break; case 2: hypre_sscanf(sdata_ptr, "%d%d", &index[6], &index[7]); break; case 3: hypre_sscanf(sdata_ptr, "%d%d%d", &index[6], &index[7], &index[8]); break; } /* pre-shift the index */ for (i = 0; i < ndim; i++) { index[i] += index[i + 6]; } } sdata_ptr += strcspn(sdata_ptr, ")") + 1; for (i = 0; i < ndim; i++) { if (sign[i] == '+') { index[i + 3] = 1; } } *sdata_ptr_ptr = sdata_ptr; return 0; } HYPRE_Int ReadData( char *filename, ProblemData *data_ptr ) { ProblemData data; ProblemPartData pdata; HYPRE_Int myid; FILE *file; char *sdata = NULL; char *sdata_line; char *sdata_ptr; HYPRE_Int sdata_size; HYPRE_Int size; HYPRE_Int memchunk = 10000; HYPRE_Int maxline = 250; char key[250]; HYPRE_Int part, var, entry, s, i, il, iu; HYPRE_MemoryLocation memory_location = data_ptr -> memory_location; /*----------------------------------------------------------- * Read data file from process 0, then broadcast *-----------------------------------------------------------*/ hypre_MPI_Comm_rank(hypre_MPI_COMM_WORLD, &myid); if (myid == 0) { if ((file = fopen(filename, "r")) == NULL) { hypre_printf("Error: can't open input file %s\n", filename); exit(1); } /* allocate initial space, and read first input line */ sdata_size = 0; sdata = hypre_TAlloc(char, memchunk, HYPRE_MEMORY_HOST); sdata_line = fgets(sdata, maxline, file); s = 0; while (sdata_line != NULL) { sdata_size += strlen(sdata_line) + 1; /* allocate more space, if necessary */ if ((sdata_size + maxline) > s) { sdata = hypre_TReAlloc(sdata, char, (sdata_size + memchunk), HYPRE_MEMORY_HOST); s = sdata_size + memchunk; } /* read the next input line */ sdata_line = fgets((sdata + sdata_size), maxline, file); } fclose(file); } /* broadcast the data size */ hypre_MPI_Bcast(&sdata_size, 1, HYPRE_MPI_INT, 0, hypre_MPI_COMM_WORLD); /* broadcast the data */ sdata = hypre_TReAlloc(sdata, char, sdata_size, HYPRE_MEMORY_HOST); hypre_MPI_Bcast(sdata, sdata_size, hypre_MPI_CHAR, 0, hypre_MPI_COMM_WORLD); /*----------------------------------------------------------- * Parse the data and fill ProblemData structure *-----------------------------------------------------------*/ data.memory_location = memory_location; data.max_boxsize = 0; data.symmetric_nentries = 0; data.symmetric_parts = NULL; data.symmetric_vars = NULL; data.symmetric_to_vars = NULL; data.symmetric_booleans = NULL; data.ns_symmetric = 0; sdata_line = sdata; while (sdata_line < (sdata + sdata_size)) { sdata_ptr = sdata_line; if ( ( hypre_sscanf(sdata_ptr, "%s", key) > 0 ) && ( sdata_ptr[0] != '#' ) ) { sdata_ptr += strcspn(sdata_ptr, " \t\n"); if ( strcmp(key, "GridCreate:") == 0 ) { data.ndim = strtol(sdata_ptr, &sdata_ptr, 10); data.nparts = strtol(sdata_ptr, &sdata_ptr, 10); data.pdata = hypre_CTAlloc(ProblemPartData, data.nparts, HYPRE_MEMORY_HOST); } else if ( strcmp(key, "GridSetExtents:") == 0 ) { part = strtol(sdata_ptr, &sdata_ptr, 10); pdata = data.pdata[part]; if ((pdata.nboxes % 10) == 0) { size = pdata.nboxes + 10; pdata.ilowers = hypre_TReAlloc(pdata.ilowers, ProblemIndex, size, HYPRE_MEMORY_HOST); pdata.iuppers = hypre_TReAlloc(pdata.iuppers, ProblemIndex, size, HYPRE_MEMORY_HOST); pdata.boxsizes = hypre_TReAlloc(pdata.boxsizes, HYPRE_Int, size, HYPRE_MEMORY_HOST); } SScanProblemIndex(sdata_ptr, &sdata_ptr, data.ndim, pdata.ilowers[pdata.nboxes]); SScanProblemIndex(sdata_ptr, &sdata_ptr, data.ndim, pdata.iuppers[pdata.nboxes]); /* check use of +- in GridSetExtents */ il = 1; iu = 1; for (i = 0; i < data.ndim; i++) { il *= pdata.ilowers[pdata.nboxes][i + 3]; iu *= pdata.iuppers[pdata.nboxes][i + 3]; } if ( (il != 0) || (iu != 1) ) { hypre_printf("Error: Invalid use of `+-' in GridSetExtents\n"); exit(1); } pdata.boxsizes[pdata.nboxes] = 1; for (i = 0; i < 3; i++) { pdata.boxsizes[pdata.nboxes] *= (pdata.iuppers[pdata.nboxes][i] - pdata.ilowers[pdata.nboxes][i] + 2); } pdata.max_boxsize = hypre_max(pdata.max_boxsize, pdata.boxsizes[pdata.nboxes]); pdata.nboxes++; data.pdata[part] = pdata; } else if ( strcmp(key, "GridSetVariables:") == 0 ) { part = strtol(sdata_ptr, &sdata_ptr, 10); pdata = data.pdata[part]; pdata.nvars = strtol(sdata_ptr, &sdata_ptr, 10); pdata.vartypes = hypre_CTAlloc(HYPRE_SStructVariable, pdata.nvars, HYPRE_MEMORY_HOST); SScanIntArray(sdata_ptr, &sdata_ptr, pdata.nvars, (HYPRE_Int *) pdata.vartypes); data.pdata[part] = pdata; } else if ( strcmp(key, "GridAddVariables:") == 0 ) { /* TODO */ hypre_printf("GridAddVariables not yet implemented!\n"); exit(1); } else if ( strcmp(key, "GridSetNeighborBox:") == 0 ) { part = strtol(sdata_ptr, &sdata_ptr, 10); pdata = data.pdata[part]; if ((pdata.glue_nboxes % 10) == 0) { size = pdata.glue_nboxes + 10; pdata.glue_ilowers = hypre_TReAlloc(pdata.glue_ilowers, ProblemIndex, size, HYPRE_MEMORY_HOST); pdata.glue_iuppers = hypre_TReAlloc(pdata.glue_iuppers, ProblemIndex, size, HYPRE_MEMORY_HOST); pdata.glue_nbor_parts = hypre_TReAlloc(pdata.glue_nbor_parts, HYPRE_Int, size, HYPRE_MEMORY_HOST); pdata.glue_nbor_ilowers = hypre_TReAlloc(pdata.glue_nbor_ilowers, ProblemIndex, size, HYPRE_MEMORY_HOST); pdata.glue_nbor_iuppers = hypre_TReAlloc(pdata.glue_nbor_iuppers, ProblemIndex, size, HYPRE_MEMORY_HOST); pdata.glue_index_maps = hypre_TReAlloc(pdata.glue_index_maps, Index, size, HYPRE_MEMORY_HOST); } SScanProblemIndex(sdata_ptr, &sdata_ptr, data.ndim, pdata.glue_ilowers[pdata.glue_nboxes]); SScanProblemIndex(sdata_ptr, &sdata_ptr, data.ndim, pdata.glue_iuppers[pdata.glue_nboxes]); pdata.glue_nbor_parts[pdata.glue_nboxes] = strtol(sdata_ptr, &sdata_ptr, 10); SScanProblemIndex(sdata_ptr, &sdata_ptr, data.ndim, pdata.glue_nbor_ilowers[pdata.glue_nboxes]); SScanProblemIndex(sdata_ptr, &sdata_ptr, data.ndim, pdata.glue_nbor_iuppers[pdata.glue_nboxes]); SScanIntArray(sdata_ptr, &sdata_ptr, data.ndim, pdata.glue_index_maps[pdata.glue_nboxes]); for (i = data.ndim; i < 3; i++) { pdata.glue_index_maps[pdata.glue_nboxes][i] = i; } pdata.glue_nboxes++; data.pdata[part] = pdata; } else if ( strcmp(key, "GridSetPeriodic:") == 0 ) { part = strtol(sdata_ptr, &sdata_ptr, 10); pdata = data.pdata[part]; SScanIntArray(sdata_ptr, &sdata_ptr, data.ndim, pdata.periodic); for (i = data.ndim; i < 3; i++) { pdata.periodic[i] = 0; } data.pdata[part] = pdata; } else if ( strcmp(key, "StencilCreate:") == 0 ) { data.nstencils = strtol(sdata_ptr, &sdata_ptr, 10); data.stencil_sizes = hypre_CTAlloc(HYPRE_Int, data.nstencils, HYPRE_MEMORY_HOST); data.stencil_offsets = hypre_CTAlloc(Index *, data.nstencils, HYPRE_MEMORY_HOST); data.stencil_vars = hypre_CTAlloc(HYPRE_Int *, data.nstencils, HYPRE_MEMORY_HOST); data.stencil_values = hypre_CTAlloc(HYPRE_Real *, data.nstencils, HYPRE_MEMORY_HOST); SScanIntArray(sdata_ptr, &sdata_ptr, data.nstencils, data.stencil_sizes); for (s = 0; s < data.nstencils; s++) { data.stencil_offsets[s] = hypre_CTAlloc(Index, data.stencil_sizes[s], HYPRE_MEMORY_HOST); data.stencil_vars[s] = hypre_CTAlloc(HYPRE_Int, data.stencil_sizes[s], HYPRE_MEMORY_HOST); data.stencil_values[s] = hypre_CTAlloc(HYPRE_Real, data.stencil_sizes[s], HYPRE_MEMORY_HOST); } } else if ( strcmp(key, "StencilSetEntry:") == 0 ) { s = strtol(sdata_ptr, &sdata_ptr, 10); entry = strtol(sdata_ptr, &sdata_ptr, 10); SScanIntArray(sdata_ptr, &sdata_ptr, data.ndim, data.stencil_offsets[s][entry]); for (i = data.ndim; i < 3; i++) { data.stencil_offsets[s][entry][i] = 0; } data.stencil_vars[s][entry] = strtol(sdata_ptr, &sdata_ptr, 10); data.stencil_values[s][entry] = (HYPRE_Real)strtod(sdata_ptr, &sdata_ptr); } else if ( strcmp(key, "GraphSetStencil:") == 0 ) { part = strtol(sdata_ptr, &sdata_ptr, 10); var = strtol(sdata_ptr, &sdata_ptr, 10); s = strtol(sdata_ptr, &sdata_ptr, 10); pdata = data.pdata[part]; if (pdata.stencil_num == NULL) { pdata.stencil_num = hypre_CTAlloc(HYPRE_Int, pdata.nvars, HYPRE_MEMORY_HOST); } pdata.stencil_num[var] = s; data.pdata[part] = pdata; } else if ( strcmp(key, "GraphAddEntries:") == 0 ) { part = strtol(sdata_ptr, &sdata_ptr, 10); pdata = data.pdata[part]; if ((pdata.graph_nentries % 10) == 0) { size = pdata.graph_nentries + 10; pdata.graph_ilowers = hypre_TReAlloc(pdata.graph_ilowers, ProblemIndex, size, HYPRE_MEMORY_HOST); pdata.graph_iuppers = hypre_TReAlloc(pdata.graph_iuppers, ProblemIndex, size, HYPRE_MEMORY_HOST); pdata.graph_strides = hypre_TReAlloc(pdata.graph_strides, Index, size, HYPRE_MEMORY_HOST); pdata.graph_vars = hypre_TReAlloc(pdata.graph_vars, HYPRE_Int, size, HYPRE_MEMORY_HOST); pdata.graph_to_parts = hypre_TReAlloc(pdata.graph_to_parts, HYPRE_Int, size, HYPRE_MEMORY_HOST); pdata.graph_to_ilowers = hypre_TReAlloc(pdata.graph_to_ilowers, ProblemIndex, size, HYPRE_MEMORY_HOST); pdata.graph_to_iuppers = hypre_TReAlloc(pdata.graph_to_iuppers, ProblemIndex, size, HYPRE_MEMORY_HOST); pdata.graph_to_strides = hypre_TReAlloc(pdata.graph_to_strides, Index, size, HYPRE_MEMORY_HOST); pdata.graph_to_vars = hypre_TReAlloc(pdata.graph_to_vars, HYPRE_Int, size, HYPRE_MEMORY_HOST); pdata.graph_index_maps = hypre_TReAlloc(pdata.graph_index_maps, Index, size, HYPRE_MEMORY_HOST); pdata.graph_index_signs = hypre_TReAlloc(pdata.graph_index_signs, Index, size, HYPRE_MEMORY_HOST); pdata.graph_entries = hypre_TReAlloc(pdata.graph_entries, HYPRE_Int, size, HYPRE_MEMORY_HOST); pdata.graph_values = hypre_TReAlloc(pdata.graph_values, HYPRE_Real, size, HYPRE_MEMORY_HOST); pdata.d_graph_values = hypre_TReAlloc_v2(pdata.d_graph_values, HYPRE_Real, pdata.graph_values_size, HYPRE_Real, size, memory_location); pdata.graph_values_size = size; pdata.graph_boxsizes = hypre_TReAlloc(pdata.graph_boxsizes, HYPRE_Int, size, HYPRE_MEMORY_HOST); } SScanProblemIndex(sdata_ptr, &sdata_ptr, data.ndim, pdata.graph_ilowers[pdata.graph_nentries]); SScanProblemIndex(sdata_ptr, &sdata_ptr, data.ndim, pdata.graph_iuppers[pdata.graph_nentries]); SScanIntArray(sdata_ptr, &sdata_ptr, data.ndim, pdata.graph_strides[pdata.graph_nentries]); for (i = data.ndim; i < 3; i++) { pdata.graph_strides[pdata.graph_nentries][i] = 1; } pdata.graph_vars[pdata.graph_nentries] = strtol(sdata_ptr, &sdata_ptr, 10); pdata.graph_to_parts[pdata.graph_nentries] = strtol(sdata_ptr, &sdata_ptr, 10); SScanProblemIndex(sdata_ptr, &sdata_ptr, data.ndim, pdata.graph_to_ilowers[pdata.graph_nentries]); SScanProblemIndex(sdata_ptr, &sdata_ptr, data.ndim, pdata.graph_to_iuppers[pdata.graph_nentries]); SScanIntArray(sdata_ptr, &sdata_ptr, data.ndim, pdata.graph_to_strides[pdata.graph_nentries]); for (i = data.ndim; i < 3; i++) { pdata.graph_to_strides[pdata.graph_nentries][i] = 1; } pdata.graph_to_vars[pdata.graph_nentries] = strtol(sdata_ptr, &sdata_ptr, 10); SScanIntArray(sdata_ptr, &sdata_ptr, data.ndim, pdata.graph_index_maps[pdata.graph_nentries]); for (i = data.ndim; i < 3; i++) { pdata.graph_index_maps[pdata.graph_nentries][i] = i; } for (i = 0; i < 3; i++) { pdata.graph_index_signs[pdata.graph_nentries][i] = 1; if ( pdata.graph_to_iuppers[pdata.graph_nentries][i] < pdata.graph_to_ilowers[pdata.graph_nentries][i] ) { pdata.graph_index_signs[pdata.graph_nentries][i] = -1; } } pdata.graph_entries[pdata.graph_nentries] = strtol(sdata_ptr, &sdata_ptr, 10); pdata.graph_values[pdata.graph_nentries] = (HYPRE_Real)strtod(sdata_ptr, &sdata_ptr); pdata.graph_boxsizes[pdata.graph_nentries] = 1; for (i = 0; i < 3; i++) { pdata.graph_boxsizes[pdata.graph_nentries] *= (pdata.graph_iuppers[pdata.graph_nentries][i] - pdata.graph_ilowers[pdata.graph_nentries][i] + 1); } pdata.graph_nentries++; data.pdata[part] = pdata; } else if ( strcmp(key, "MatrixSetSymmetric:") == 0 ) { if ((data.symmetric_nentries % 10) == 0) { size = data.symmetric_nentries + 10; data.symmetric_parts = hypre_TReAlloc(data.symmetric_parts, HYPRE_Int, size, HYPRE_MEMORY_HOST); data.symmetric_vars = hypre_TReAlloc(data.symmetric_vars, HYPRE_Int, size, HYPRE_MEMORY_HOST); data.symmetric_to_vars = hypre_TReAlloc(data.symmetric_to_vars, HYPRE_Int, size, HYPRE_MEMORY_HOST); data.symmetric_booleans = hypre_TReAlloc(data.symmetric_booleans, HYPRE_Int, size, HYPRE_MEMORY_HOST); } data.symmetric_parts[data.symmetric_nentries] = strtol(sdata_ptr, &sdata_ptr, 10); data.symmetric_vars[data.symmetric_nentries] = strtol(sdata_ptr, &sdata_ptr, 10); data.symmetric_to_vars[data.symmetric_nentries] = strtol(sdata_ptr, &sdata_ptr, 10); data.symmetric_booleans[data.symmetric_nentries] = strtol(sdata_ptr, &sdata_ptr, 10); data.symmetric_nentries++; } else if ( strcmp(key, "MatrixSetNSSymmetric:") == 0 ) { data.ns_symmetric = strtol(sdata_ptr, &sdata_ptr, 10); } else if ( strcmp(key, "MatrixSetValues:") == 0 ) { part = strtol(sdata_ptr, &sdata_ptr, 10); pdata = data.pdata[part]; if ((pdata.matrix_nentries % 10) == 0) { size = pdata.matrix_nentries + 10; pdata.matrix_ilowers = hypre_TReAlloc(pdata.matrix_ilowers, ProblemIndex, size, HYPRE_MEMORY_HOST); pdata.matrix_iuppers = hypre_TReAlloc(pdata.matrix_iuppers, ProblemIndex, size, HYPRE_MEMORY_HOST); pdata.matrix_strides = hypre_TReAlloc(pdata.matrix_strides, Index, size, HYPRE_MEMORY_HOST); pdata.matrix_vars = hypre_TReAlloc(pdata.matrix_vars, HYPRE_Int, size, HYPRE_MEMORY_HOST); pdata.matrix_entries = hypre_TReAlloc(pdata.matrix_entries, HYPRE_Int, size, HYPRE_MEMORY_HOST); pdata.matrix_values = hypre_TReAlloc(pdata.matrix_values, HYPRE_Real, size, HYPRE_MEMORY_HOST); pdata.d_matrix_values = hypre_TReAlloc_v2(pdata.d_matrix_values, HYPRE_Real, pdata.matrix_values_size, HYPRE_Real, size, memory_location); pdata.matrix_values_size = size; } SScanProblemIndex(sdata_ptr, &sdata_ptr, data.ndim, pdata.matrix_ilowers[pdata.matrix_nentries]); SScanProblemIndex(sdata_ptr, &sdata_ptr, data.ndim, pdata.matrix_iuppers[pdata.matrix_nentries]); SScanIntArray(sdata_ptr, &sdata_ptr, data.ndim, pdata.matrix_strides[pdata.matrix_nentries]); for (i = data.ndim; i < 3; i++) { pdata.matrix_strides[pdata.matrix_nentries][i] = 1; } pdata.matrix_vars[pdata.matrix_nentries] = strtol(sdata_ptr, &sdata_ptr, 10); pdata.matrix_entries[pdata.matrix_nentries] = strtol(sdata_ptr, &sdata_ptr, 10); pdata.matrix_values[pdata.matrix_nentries] = (HYPRE_Real)strtod(sdata_ptr, &sdata_ptr); pdata.matrix_nentries++; data.pdata[part] = pdata; } else if ( strcmp(key, "rfactor:") == 0 ) { SScanIntArray(sdata_ptr, &sdata_ptr, data.ndim, data.rfactor); for (i = data.ndim; i < 3; i++) { data.rfactor[i] = 1; } } else if ( strcmp(key, "ProcessPoolCreate:") == 0 ) { data.npools = strtol(sdata_ptr, &sdata_ptr, 10); data.pools = hypre_CTAlloc(HYPRE_Int, data.nparts, HYPRE_MEMORY_HOST); } else if ( strcmp(key, "ProcessPoolSetPart:") == 0 ) { i = strtol(sdata_ptr, &sdata_ptr, 10); part = strtol(sdata_ptr, &sdata_ptr, 10); data.pools[part] = i; } } sdata_line += strlen(sdata_line) + 1; } data.max_boxsize = 0; for (part = 0; part < data.nparts; part++) { data.max_boxsize = hypre_max(data.max_boxsize, data.pdata[part].max_boxsize); } hypre_TFree(sdata, HYPRE_MEMORY_HOST); *data_ptr = data; return 0; } /*-------------------------------------------------------------------------- * Distribute routines *--------------------------------------------------------------------------*/ HYPRE_Int MapProblemIndex( ProblemIndex index, Index m ) { /* un-shift the index */ index[0] -= index[6]; index[1] -= index[7]; index[2] -= index[8]; /* map the index */ index[0] = m[0] * index[0] + (m[0] - 1) * index[3]; index[1] = m[1] * index[1] + (m[1] - 1) * index[4]; index[2] = m[2] * index[2] + (m[2] - 1) * index[5]; /* pre-shift the new mapped index */ index[0] += index[6]; index[1] += index[7]; index[2] += index[8]; return 0; } HYPRE_Int IntersectBoxes( ProblemIndex ilower1, ProblemIndex iupper1, ProblemIndex ilower2, ProblemIndex iupper2, ProblemIndex int_ilower, ProblemIndex int_iupper ) { HYPRE_Int d, size; size = 1; for (d = 0; d < 3; d++) { int_ilower[d] = hypre_max(ilower1[d], ilower2[d]); int_iupper[d] = hypre_min(iupper1[d], iupper2[d]); size *= hypre_max(0, (int_iupper[d] - int_ilower[d] + 1)); } return size; } HYPRE_Int DistributeData( ProblemData global_data, Index *refine, Index *distribute, Index *block, HYPRE_Int num_procs, HYPRE_Int myid, ProblemData *data_ptr ) { HYPRE_MemoryLocation memory_location = global_data.memory_location; ProblemData data = global_data; ProblemPartData pdata; HYPRE_Int *pool_procs; HYPRE_Int np, pid; HYPRE_Int pool, part, box, entry, p, q, r, i, d, dmap, sign, size; Index m, mmap, n; ProblemIndex int_ilower, int_iupper; /* determine first process number in each pool */ pool_procs = hypre_CTAlloc(HYPRE_Int, (data.npools + 1), HYPRE_MEMORY_HOST); for (part = 0; part < data.nparts; part++) { pool = data.pools[part] + 1; np = distribute[part][0] * distribute[part][1] * distribute[part][2]; pool_procs[pool] = hypre_max(pool_procs[pool], np); } pool_procs[0] = 0; for (pool = 1; pool < (data.npools + 1); pool++) { pool_procs[pool] = pool_procs[pool - 1] + pool_procs[pool]; } /* check number of processes */ if (pool_procs[data.npools] != num_procs) { hypre_printf("Error: Invalid number of processes or process topology \n"); exit(1); } /* modify part data */ for (part = 0; part < data.nparts; part++) { pdata = data.pdata[part]; pool = data.pools[part]; np = distribute[part][0] * distribute[part][1] * distribute[part][2]; pid = myid - pool_procs[pool]; if ( (pid < 0) || (pid >= np) ) { /* none of this part data lives on this process */ pdata.nboxes = 0; pdata.glue_nboxes = 0; pdata.graph_nentries = 0; pdata.matrix_nentries = 0; } else { /* refine boxes */ m[0] = refine[part][0]; m[1] = refine[part][1]; m[2] = refine[part][2]; if ( (m[0] * m[1] * m[2]) > 1) { for (box = 0; box < pdata.nboxes; box++) { MapProblemIndex(pdata.ilowers[box], m); MapProblemIndex(pdata.iuppers[box], m); } for (entry = 0; entry < pdata.graph_nentries; entry++) { MapProblemIndex(pdata.graph_ilowers[entry], m); MapProblemIndex(pdata.graph_iuppers[entry], m); mmap[0] = m[pdata.graph_index_maps[entry][0]]; mmap[1] = m[pdata.graph_index_maps[entry][1]]; mmap[2] = m[pdata.graph_index_maps[entry][2]]; MapProblemIndex(pdata.graph_to_ilowers[entry], mmap); MapProblemIndex(pdata.graph_to_iuppers[entry], mmap); } for (entry = 0; entry < pdata.matrix_nentries; entry++) { MapProblemIndex(pdata.matrix_ilowers[entry], m); MapProblemIndex(pdata.matrix_iuppers[entry], m); } } /* refine and distribute boxes */ m[0] = distribute[part][0]; m[1] = distribute[part][1]; m[2] = distribute[part][2]; if ( (m[0] * m[1] * m[2]) > 1) { p = pid % m[0]; q = ((pid - p) / m[0]) % m[1]; r = (pid - p - q * m[0]) / (m[0] * m[1]); for (box = 0; box < pdata.nboxes; box++) { n[0] = pdata.iuppers[box][0] - pdata.ilowers[box][0] + 1; n[1] = pdata.iuppers[box][1] - pdata.ilowers[box][1] + 1; n[2] = pdata.iuppers[box][2] - pdata.ilowers[box][2] + 1; MapProblemIndex(pdata.ilowers[box], m); MapProblemIndex(pdata.iuppers[box], m); pdata.iuppers[box][0] = pdata.ilowers[box][0] + n[0] - 1; pdata.iuppers[box][1] = pdata.ilowers[box][1] + n[1] - 1; pdata.iuppers[box][2] = pdata.ilowers[box][2] + n[2] - 1; pdata.ilowers[box][0] = pdata.ilowers[box][0] + p * n[0]; pdata.ilowers[box][1] = pdata.ilowers[box][1] + q * n[1]; pdata.ilowers[box][2] = pdata.ilowers[box][2] + r * n[2]; pdata.iuppers[box][0] = pdata.iuppers[box][0] + p * n[0]; pdata.iuppers[box][1] = pdata.iuppers[box][1] + q * n[1]; pdata.iuppers[box][2] = pdata.iuppers[box][2] + r * n[2]; } i = 0; for (entry = 0; entry < pdata.graph_nentries; entry++) { MapProblemIndex(pdata.graph_ilowers[entry], m); MapProblemIndex(pdata.graph_iuppers[entry], m); mmap[0] = m[pdata.graph_index_maps[entry][0]]; mmap[1] = m[pdata.graph_index_maps[entry][1]]; mmap[2] = m[pdata.graph_index_maps[entry][2]]; MapProblemIndex(pdata.graph_to_ilowers[entry], mmap); MapProblemIndex(pdata.graph_to_iuppers[entry], mmap); for (box = 0; box < pdata.nboxes; box++) { size = IntersectBoxes(pdata.graph_ilowers[entry], pdata.graph_iuppers[entry], pdata.ilowers[box], pdata.iuppers[box], int_ilower, int_iupper); if (size > 0) { /* if there is an intersection, it is the only one */ for (d = 0; d < 3; d++) { dmap = pdata.graph_index_maps[entry][d]; sign = pdata.graph_index_signs[entry][d]; pdata.graph_to_iuppers[i][dmap] = pdata.graph_to_ilowers[entry][dmap] + sign * (int_iupper[d] - pdata.graph_ilowers[entry][d]); pdata.graph_to_ilowers[i][dmap] = pdata.graph_to_ilowers[entry][dmap] + sign * (int_ilower[d] - pdata.graph_ilowers[entry][d]); pdata.graph_ilowers[i][d] = int_ilower[d]; pdata.graph_iuppers[i][d] = int_iupper[d]; pdata.graph_strides[i][d] = pdata.graph_strides[entry][d]; pdata.graph_to_strides[i][d] = pdata.graph_to_strides[entry][d]; pdata.graph_index_maps[i][d] = dmap; pdata.graph_index_signs[i][d] = sign; } for (d = 3; d < 9; d++) { pdata.graph_ilowers[i][d] = pdata.graph_ilowers[entry][d]; pdata.graph_iuppers[i][d] = pdata.graph_iuppers[entry][d]; pdata.graph_to_ilowers[i][d] = pdata.graph_to_ilowers[entry][d]; pdata.graph_to_iuppers[i][d] = pdata.graph_to_iuppers[entry][d]; } pdata.graph_vars[i] = pdata.graph_vars[entry]; pdata.graph_to_parts[i] = pdata.graph_to_parts[entry]; pdata.graph_to_vars[i] = pdata.graph_to_vars[entry]; pdata.graph_entries[i] = pdata.graph_entries[entry]; pdata.graph_values[i] = pdata.graph_values[entry]; i++; break; } } } pdata.graph_nentries = i; i = 0; for (entry = 0; entry < pdata.matrix_nentries; entry++) { MapProblemIndex(pdata.matrix_ilowers[entry], m); MapProblemIndex(pdata.matrix_iuppers[entry], m); for (box = 0; box < pdata.nboxes; box++) { size = IntersectBoxes(pdata.matrix_ilowers[entry], pdata.matrix_iuppers[entry], pdata.ilowers[box], pdata.iuppers[box], int_ilower, int_iupper); if (size > 0) { /* if there is an intersection, it is the only one */ for (d = 0; d < 3; d++) { pdata.matrix_ilowers[i][d] = int_ilower[d]; pdata.matrix_iuppers[i][d] = int_iupper[d]; pdata.matrix_strides[i][d] = pdata.matrix_strides[entry][d]; } for (d = 3; d < 9; d++) { pdata.matrix_ilowers[i][d] = pdata.matrix_ilowers[entry][d]; pdata.matrix_iuppers[i][d] = pdata.matrix_iuppers[entry][d]; } pdata.matrix_vars[i] = pdata.matrix_vars[entry]; pdata.matrix_entries[i] = pdata.matrix_entries[entry]; pdata.matrix_values[i] = pdata.matrix_values[entry]; i++; break; } } } pdata.matrix_nentries = i; } /* refine and block boxes */ m[0] = block[part][0]; m[1] = block[part][1]; m[2] = block[part][2]; if ( (m[0] * m[1] * m[2]) > 1) { pdata.ilowers = hypre_TReAlloc(pdata.ilowers, ProblemIndex, m[0] * m[1] * m[2] * pdata.nboxes, HYPRE_MEMORY_HOST); pdata.iuppers = hypre_TReAlloc(pdata.iuppers, ProblemIndex, m[0] * m[1] * m[2] * pdata.nboxes, HYPRE_MEMORY_HOST); pdata.boxsizes = hypre_TReAlloc(pdata.boxsizes, HYPRE_Int, m[0] * m[1] * m[2] * pdata.nboxes, HYPRE_MEMORY_HOST); for (box = 0; box < pdata.nboxes; box++) { n[0] = pdata.iuppers[box][0] - pdata.ilowers[box][0] + 1; n[1] = pdata.iuppers[box][1] - pdata.ilowers[box][1] + 1; n[2] = pdata.iuppers[box][2] - pdata.ilowers[box][2] + 1; MapProblemIndex(pdata.ilowers[box], m); MapProblemIndex(pdata.iuppers[box], m); pdata.iuppers[box][0] = pdata.ilowers[box][0] + n[0] - 1; pdata.iuppers[box][1] = pdata.ilowers[box][1] + n[1] - 1; pdata.iuppers[box][2] = pdata.ilowers[box][2] + n[2] - 1; i = box; for (r = 0; r < m[2]; r++) { for (q = 0; q < m[1]; q++) { for (p = 0; p < m[0]; p++) { pdata.ilowers[i][0] = pdata.ilowers[box][0] + p * n[0]; pdata.ilowers[i][1] = pdata.ilowers[box][1] + q * n[1]; pdata.ilowers[i][2] = pdata.ilowers[box][2] + r * n[2]; pdata.iuppers[i][0] = pdata.iuppers[box][0] + p * n[0]; pdata.iuppers[i][1] = pdata.iuppers[box][1] + q * n[1]; pdata.iuppers[i][2] = pdata.iuppers[box][2] + r * n[2]; for (d = 3; d < 9; d++) { pdata.ilowers[i][d] = pdata.ilowers[box][d]; pdata.iuppers[i][d] = pdata.iuppers[box][d]; } i += pdata.nboxes; } } } } pdata.nboxes *= m[0] * m[1] * m[2]; for (entry = 0; entry < pdata.graph_nentries; entry++) { MapProblemIndex(pdata.graph_ilowers[entry], m); MapProblemIndex(pdata.graph_iuppers[entry], m); mmap[0] = m[pdata.graph_index_maps[entry][0]]; mmap[1] = m[pdata.graph_index_maps[entry][1]]; mmap[2] = m[pdata.graph_index_maps[entry][2]]; MapProblemIndex(pdata.graph_to_ilowers[entry], mmap); MapProblemIndex(pdata.graph_to_iuppers[entry], mmap); } for (entry = 0; entry < pdata.matrix_nentries; entry++) { MapProblemIndex(pdata.matrix_ilowers[entry], m); MapProblemIndex(pdata.matrix_iuppers[entry], m); } } /* map remaining ilowers & iuppers */ m[0] = refine[part][0] * block[part][0] * distribute[part][0]; m[1] = refine[part][1] * block[part][1] * distribute[part][1]; m[2] = refine[part][2] * block[part][2] * distribute[part][2]; if ( (m[0] * m[1] * m[2]) > 1) { for (box = 0; box < pdata.glue_nboxes; box++) { MapProblemIndex(pdata.glue_ilowers[box], m); MapProblemIndex(pdata.glue_iuppers[box], m); mmap[0] = m[pdata.glue_index_maps[box][0]]; mmap[1] = m[pdata.glue_index_maps[box][1]]; mmap[2] = m[pdata.glue_index_maps[box][2]]; MapProblemIndex(pdata.glue_nbor_ilowers[box], mmap); MapProblemIndex(pdata.glue_nbor_iuppers[box], mmap); } } /* compute box sizes, etc. */ pdata.max_boxsize = 0; for (box = 0; box < pdata.nboxes; box++) { pdata.boxsizes[box] = 1; for (i = 0; i < 3; i++) { pdata.boxsizes[box] *= (pdata.iuppers[box][i] - pdata.ilowers[box][i] + 2); } pdata.max_boxsize = hypre_max(pdata.max_boxsize, pdata.boxsizes[box]); } for (box = 0; box < pdata.graph_nentries; box++) { pdata.graph_boxsizes[box] = 1; for (i = 0; i < 3; i++) { pdata.graph_boxsizes[box] *= (pdata.graph_iuppers[box][i] - pdata.graph_ilowers[box][i] + 1); } } } if (pdata.nboxes == 0) { hypre_TFree(pdata.ilowers, HYPRE_MEMORY_HOST); hypre_TFree(pdata.iuppers, HYPRE_MEMORY_HOST); hypre_TFree(pdata.boxsizes, HYPRE_MEMORY_HOST); pdata.max_boxsize = 0; } if (pdata.glue_nboxes == 0) { hypre_TFree(pdata.glue_ilowers, HYPRE_MEMORY_HOST); hypre_TFree(pdata.glue_iuppers, HYPRE_MEMORY_HOST); hypre_TFree(pdata.glue_nbor_parts, HYPRE_MEMORY_HOST); hypre_TFree(pdata.glue_nbor_ilowers, HYPRE_MEMORY_HOST); hypre_TFree(pdata.glue_nbor_iuppers, HYPRE_MEMORY_HOST); hypre_TFree(pdata.glue_index_maps, HYPRE_MEMORY_HOST); } if (pdata.graph_nentries == 0) { hypre_TFree(pdata.graph_ilowers, HYPRE_MEMORY_HOST); hypre_TFree(pdata.graph_iuppers, HYPRE_MEMORY_HOST); hypre_TFree(pdata.graph_strides, HYPRE_MEMORY_HOST); hypre_TFree(pdata.graph_vars, HYPRE_MEMORY_HOST); hypre_TFree(pdata.graph_to_parts, HYPRE_MEMORY_HOST); hypre_TFree(pdata.graph_to_ilowers, HYPRE_MEMORY_HOST); hypre_TFree(pdata.graph_to_iuppers, HYPRE_MEMORY_HOST); hypre_TFree(pdata.graph_to_strides, HYPRE_MEMORY_HOST); hypre_TFree(pdata.graph_to_vars, HYPRE_MEMORY_HOST); hypre_TFree(pdata.graph_index_maps, HYPRE_MEMORY_HOST); hypre_TFree(pdata.graph_index_signs, HYPRE_MEMORY_HOST); hypre_TFree(pdata.graph_entries, HYPRE_MEMORY_HOST); pdata.graph_values_size = 0; hypre_TFree(pdata.graph_values, HYPRE_MEMORY_HOST); hypre_TFree(pdata.d_graph_values, memory_location); hypre_TFree(pdata.graph_boxsizes, HYPRE_MEMORY_HOST); } if (pdata.matrix_nentries == 0) { hypre_TFree(pdata.matrix_ilowers, HYPRE_MEMORY_HOST); hypre_TFree(pdata.matrix_iuppers, HYPRE_MEMORY_HOST); hypre_TFree(pdata.matrix_strides, HYPRE_MEMORY_HOST); hypre_TFree(pdata.matrix_vars, HYPRE_MEMORY_HOST); hypre_TFree(pdata.matrix_entries, HYPRE_MEMORY_HOST); pdata.matrix_values_size = 0; hypre_TFree(pdata.matrix_values, HYPRE_MEMORY_HOST); hypre_TFree(pdata.d_matrix_values, memory_location); } data.pdata[part] = pdata; } data.max_boxsize = 0; for (part = 0; part < data.nparts; part++) { data.max_boxsize = hypre_max(data.max_boxsize, data.pdata[part].max_boxsize); } hypre_TFree(pool_procs, HYPRE_MEMORY_HOST); *data_ptr = data; return 0; } /*-------------------------------------------------------------------------- * Destroy data *--------------------------------------------------------------------------*/ HYPRE_Int DestroyData( ProblemData data ) { HYPRE_MemoryLocation memory_location = data.memory_location; ProblemPartData pdata; HYPRE_Int part, s; for (part = 0; part < data.nparts; part++) { pdata = data.pdata[part]; if (pdata.nboxes > 0) { hypre_TFree(pdata.ilowers, HYPRE_MEMORY_HOST); hypre_TFree(pdata.iuppers, HYPRE_MEMORY_HOST); hypre_TFree(pdata.boxsizes, HYPRE_MEMORY_HOST); } if (pdata.nvars > 0) { hypre_TFree(pdata.vartypes, HYPRE_MEMORY_HOST); } if (pdata.add_nvars > 0) { hypre_TFree(pdata.add_indexes, HYPRE_MEMORY_HOST); hypre_TFree(pdata.add_vartypes, HYPRE_MEMORY_HOST); } if (pdata.glue_nboxes > 0) { hypre_TFree(pdata.glue_ilowers, HYPRE_MEMORY_HOST); hypre_TFree(pdata.glue_iuppers, HYPRE_MEMORY_HOST); hypre_TFree(pdata.glue_nbor_parts, HYPRE_MEMORY_HOST); hypre_TFree(pdata.glue_nbor_ilowers, HYPRE_MEMORY_HOST); hypre_TFree(pdata.glue_nbor_iuppers, HYPRE_MEMORY_HOST); hypre_TFree(pdata.glue_index_maps, HYPRE_MEMORY_HOST); } if (pdata.nvars > 0) { hypre_TFree(pdata.stencil_num, HYPRE_MEMORY_HOST); } if (pdata.graph_nentries > 0) { hypre_TFree(pdata.graph_ilowers, HYPRE_MEMORY_HOST); hypre_TFree(pdata.graph_iuppers, HYPRE_MEMORY_HOST); hypre_TFree(pdata.graph_strides, HYPRE_MEMORY_HOST); hypre_TFree(pdata.graph_vars, HYPRE_MEMORY_HOST); hypre_TFree(pdata.graph_to_parts, HYPRE_MEMORY_HOST); hypre_TFree(pdata.graph_to_ilowers, HYPRE_MEMORY_HOST); hypre_TFree(pdata.graph_to_iuppers, HYPRE_MEMORY_HOST); hypre_TFree(pdata.graph_to_strides, HYPRE_MEMORY_HOST); hypre_TFree(pdata.graph_to_vars, HYPRE_MEMORY_HOST); hypre_TFree(pdata.graph_index_maps, HYPRE_MEMORY_HOST); hypre_TFree(pdata.graph_index_signs, HYPRE_MEMORY_HOST); hypre_TFree(pdata.graph_entries, HYPRE_MEMORY_HOST); hypre_TFree(pdata.graph_values, HYPRE_MEMORY_HOST); hypre_TFree(pdata.d_graph_values, memory_location); hypre_TFree(pdata.graph_boxsizes, HYPRE_MEMORY_HOST); } if (pdata.matrix_nentries > 0) { hypre_TFree(pdata.matrix_ilowers, HYPRE_MEMORY_HOST); hypre_TFree(pdata.matrix_iuppers, HYPRE_MEMORY_HOST); hypre_TFree(pdata.matrix_strides, HYPRE_MEMORY_HOST); hypre_TFree(pdata.matrix_vars, HYPRE_MEMORY_HOST); hypre_TFree(pdata.matrix_entries, HYPRE_MEMORY_HOST); hypre_TFree(pdata.matrix_values, HYPRE_MEMORY_HOST); hypre_TFree(pdata.d_matrix_values, memory_location); } } hypre_TFree(data.pdata, HYPRE_MEMORY_HOST); for (s = 0; s < data.nstencils; s++) { hypre_TFree(data.stencil_offsets[s], HYPRE_MEMORY_HOST); hypre_TFree(data.stencil_vars[s], HYPRE_MEMORY_HOST); hypre_TFree(data.stencil_values[s], HYPRE_MEMORY_HOST); } hypre_TFree(data.stencil_sizes, HYPRE_MEMORY_HOST); hypre_TFree(data.stencil_offsets, HYPRE_MEMORY_HOST); hypre_TFree(data.stencil_vars, HYPRE_MEMORY_HOST); hypre_TFree(data.stencil_values, HYPRE_MEMORY_HOST); if (data.symmetric_nentries > 0) { hypre_TFree(data.symmetric_parts, HYPRE_MEMORY_HOST); hypre_TFree(data.symmetric_vars, HYPRE_MEMORY_HOST); hypre_TFree(data.symmetric_to_vars, HYPRE_MEMORY_HOST); hypre_TFree(data.symmetric_booleans, HYPRE_MEMORY_HOST); } hypre_TFree(data.pools, HYPRE_MEMORY_HOST); return 0; } /*-------------------------------------------------------------------------- * Compute new box based on variable type *--------------------------------------------------------------------------*/ HYPRE_Int GetVariableBox( Index cell_ilower, Index cell_iupper, HYPRE_Int int_vartype, Index var_ilower, Index var_iupper ) { HYPRE_Int ierr = 0; HYPRE_SStructVariable vartype = (HYPRE_SStructVariable) int_vartype; var_ilower[0] = cell_ilower[0]; var_ilower[1] = cell_ilower[1]; var_ilower[2] = cell_ilower[2]; var_iupper[0] = cell_iupper[0]; var_iupper[1] = cell_iupper[1]; var_iupper[2] = cell_iupper[2]; switch (vartype) { case HYPRE_SSTRUCT_VARIABLE_CELL: var_ilower[0] -= 0; var_ilower[1] -= 0; var_ilower[2] -= 0; break; case HYPRE_SSTRUCT_VARIABLE_NODE: var_ilower[0] -= 1; var_ilower[1] -= 1; var_ilower[2] -= 1; break; case HYPRE_SSTRUCT_VARIABLE_XFACE: var_ilower[0] -= 1; var_ilower[1] -= 0; var_ilower[2] -= 0; break; case HYPRE_SSTRUCT_VARIABLE_YFACE: var_ilower[0] -= 0; var_ilower[1] -= 1; var_ilower[2] -= 0; break; case HYPRE_SSTRUCT_VARIABLE_ZFACE: var_ilower[0] -= 0; var_ilower[1] -= 0; var_ilower[2] -= 1; break; case HYPRE_SSTRUCT_VARIABLE_XEDGE: var_ilower[0] -= 0; var_ilower[1] -= 1; var_ilower[2] -= 1; break; case HYPRE_SSTRUCT_VARIABLE_YEDGE: var_ilower[0] -= 1; var_ilower[1] -= 0; var_ilower[2] -= 1; break; case HYPRE_SSTRUCT_VARIABLE_ZEDGE: var_ilower[0] -= 1; var_ilower[1] -= 1; var_ilower[2] -= 0; break; case HYPRE_SSTRUCT_VARIABLE_UNDEFINED: break; } return ierr; } /*-------------------------------------------------------------------------- * Print usage info *--------------------------------------------------------------------------*/ HYPRE_Int PrintUsage( char *progname, HYPRE_Int myid ) { if ( myid == 0 ) { hypre_printf("\n"); hypre_printf("Usage: %s []\n", progname); hypre_printf("\n"); hypre_printf(" -in : input file (default is `%s')\n", infile_default); hypre_printf("\n"); hypre_printf(" -pt ... : set part(s) for subsequent options\n"); hypre_printf(" -r : refine part(s)\n"); hypre_printf(" -P : refine and distribute part(s)\n"); hypre_printf(" -b : refine and block part(s)\n"); hypre_printf(" -solver : solver ID (default = 39)\n"); hypre_printf(" -print : print out the system\n"); hypre_printf(" -sym : Struct- symmetric storage (1) or not (0)\n"); hypre_printf("\n"); } return 0; } /*-------------------------------------------------------------------------- * Test driver for semi-structured matrix interface *--------------------------------------------------------------------------*/ hypre_int main( hypre_int argc, char *argv[] ) { char *infile; ProblemData global_data; ProblemData data; ProblemPartData pdata; HYPRE_Int nparts; HYPRE_Int *parts; Index *refine; Index *distribute; Index *block; HYPRE_Int solver_id; HYPRE_Int print_system; HYPRE_SStructGrid grid; HYPRE_SStructStencil *stencils; HYPRE_SStructGraph graph; HYPRE_SStructMatrix A; HYPRE_ParCSRMatrix T, parA; HYPRE_SStructVector b; HYPRE_SStructVector x; HYPRE_ParVector parb, parx; HYPRE_SStructSolver solver; HYPRE_StructGrid cell_grid; hypre_Box *bounding_box; HYPRE_Real h; HYPRE_Int **bdryRanks, *bdryRanksCnt; Index ilower, iupper; Index index, to_index; HYPRE_Real *values; HYPRE_Real *d_values; HYPRE_Int num_iterations; HYPRE_Real final_res_norm; HYPRE_Int num_procs, myid; HYPRE_Int time_index; HYPRE_Int arg_index, part, box, var, entry, s, i, j, k; #if defined(HYPRE_USING_MEMORY_TRACKER) HYPRE_Int print_mem_tracker = 0; char mem_tracker_name[HYPRE_MAX_FILE_NAME_LEN] = {0}; #endif #if defined(HYPRE_USING_GPU) HYPRE_Int spgemm_use_vendor = 0; #endif #if defined(HYPRE_TEST_USING_HOST) HYPRE_MemoryLocation memory_location = HYPRE_MEMORY_HOST; HYPRE_ExecutionPolicy default_exec_policy = HYPRE_EXEC_HOST; #else HYPRE_MemoryLocation memory_location = HYPRE_MEMORY_DEVICE; HYPRE_ExecutionPolicy default_exec_policy = HYPRE_EXEC_DEVICE; #endif global_data.memory_location = memory_location; /*----------------------------------------------------------- * Initialize some stuff *-----------------------------------------------------------*/ /* Initialize MPI */ hypre_MPI_Init(&argc, &argv); hypre_MPI_Comm_size(hypre_MPI_COMM_WORLD, &num_procs); hypre_MPI_Comm_rank(hypre_MPI_COMM_WORLD, &myid); /*----------------------------------------------------------------- * GPU Device binding * Must be done before HYPRE_Initialize() and should not be changed after *-----------------------------------------------------------------*/ hypre_bind_device_id(-1, myid, num_procs, hypre_MPI_COMM_WORLD); /*----------------------------------------------------------- * Initialize : must be the first HYPRE function to call *-----------------------------------------------------------*/ HYPRE_Initialize(); HYPRE_DeviceInitialize(); /*----------------------------------------------------------- * Read input file *-----------------------------------------------------------*/ arg_index = 1; /* parse command line for input file name */ infile = infile_default; if (argc > 1) { if ( strcmp(argv[arg_index], "-in") == 0 ) { arg_index++; infile = argv[arg_index++]; } } ReadData(infile, &global_data); /*----------------------------------------------------------- * Set defaults *-----------------------------------------------------------*/ nparts = global_data.nparts; parts = hypre_TAlloc(HYPRE_Int, nparts, HYPRE_MEMORY_HOST); refine = hypre_TAlloc(Index, nparts, HYPRE_MEMORY_HOST); distribute = hypre_TAlloc(Index, nparts, HYPRE_MEMORY_HOST); block = hypre_TAlloc(Index, nparts, HYPRE_MEMORY_HOST); for (part = 0; part < nparts; part++) { parts[part] = part; for (j = 0; j < 3; j++) { refine[part][j] = 1; distribute[part][j] = 1; block[part][j] = 1; } } solver_id = 0; print_system = 0; /*----------------------------------------------------------- * Parse command line *-----------------------------------------------------------*/ while (arg_index < argc) { if ( strcmp(argv[arg_index], "-pt") == 0 ) { arg_index++; nparts = 0; while ( strncmp(argv[arg_index], "-", 1) != 0 ) { parts[nparts++] = atoi(argv[arg_index++]); } } else if ( strcmp(argv[arg_index], "-r") == 0 ) { arg_index++; for (i = 0; i < nparts; i++) { part = parts[i]; k = arg_index; for (j = 0; j < 3; j++) { refine[part][j] = atoi(argv[k++]); } } arg_index += 3; } else if ( strcmp(argv[arg_index], "-P") == 0 ) { arg_index++; for (i = 0; i < nparts; i++) { part = parts[i]; k = arg_index; for (j = 0; j < 3; j++) { distribute[part][j] = atoi(argv[k++]); } } arg_index += 3; } else if ( strcmp(argv[arg_index], "-b") == 0 ) { arg_index++; for (i = 0; i < nparts; i++) { part = parts[i]; k = arg_index; for (j = 0; j < 3; j++) { block[part][j] = atoi(argv[k++]); } } arg_index += 3; } else if ( strcmp(argv[arg_index], "-solver") == 0 ) { arg_index++; solver_id = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-print") == 0 ) { arg_index++; print_system = 1; } else if ( strcmp(argv[arg_index], "-exec_host") == 0 ) { arg_index++; default_exec_policy = HYPRE_EXEC_HOST; } else if ( strcmp(argv[arg_index], "-exec_device") == 0 ) { arg_index++; default_exec_policy = HYPRE_EXEC_DEVICE; } #if defined(HYPRE_USING_GPU) else if ( strcmp(argv[arg_index], "-mm_vendor") == 0 ) { arg_index++; spgemm_use_vendor = atoi(argv[arg_index++]); } #endif #if defined(HYPRE_USING_MEMORY_TRACKER) else if ( strcmp(argv[arg_index], "-print_mem_tracker") == 0 ) { arg_index++; print_mem_tracker = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-mem_tracker_filename") == 0 ) { arg_index++; snprintf(mem_tracker_name, HYPRE_MAX_FILE_NAME_LEN, "%s", argv[arg_index++]); } #endif else if ( strcmp(argv[arg_index], "-help") == 0 ) { PrintUsage(argv[0], myid); exit(1); break; } else { break; } } #if defined(HYPRE_USING_MEMORY_TRACKER) hypre_MemoryTrackerSetPrint(print_mem_tracker); if (mem_tracker_name[0]) { hypre_MemoryTrackerSetFileName(mem_tracker_name); } #endif /* default memory location */ HYPRE_SetMemoryLocation(memory_location); /* default execution policy */ HYPRE_SetExecutionPolicy(default_exec_policy); #if defined(HYPRE_USING_GPU) HYPRE_SetSpGemmUseVendor(spgemm_use_vendor); #endif /*----------------------------------------------------------- * Distribute data *-----------------------------------------------------------*/ DistributeData(global_data, refine, distribute, block, num_procs, myid, &data); /*----------------------------------------------------------- * Synchronize so that timings make sense *-----------------------------------------------------------*/ hypre_MPI_Barrier(hypre_MPI_COMM_WORLD); /*----------------------------------------------------------- * Set up the grid *-----------------------------------------------------------*/ time_index = hypre_InitializeTiming("SStruct Interface"); hypre_BeginTiming(time_index); HYPRE_SStructGridCreate(hypre_MPI_COMM_WORLD, data.ndim, data.nparts, &grid); for (part = 0; part < data.nparts; part++) { pdata = data.pdata[part]; for (box = 0; box < pdata.nboxes; box++) { HYPRE_SStructGridSetExtents(grid, part, pdata.ilowers[box], pdata.iuppers[box]); } HYPRE_SStructGridSetVariables(grid, part, pdata.nvars, pdata.vartypes); /* GridAddVariabes */ /* GridSetNeighborBox */ for (box = 0; box < pdata.glue_nboxes; box++) { hypre_printf("Error: No longer supporting SetNeighborBox\n"); #if 0 HYPRE_SStructGridSetNeighborBox(grid, part, pdata.glue_ilowers[box], pdata.glue_iuppers[box], pdata.glue_nbor_parts[box], pdata.glue_nbor_ilowers[box], pdata.glue_nbor_iuppers[box], pdata.glue_index_maps[box]); #endif } HYPRE_SStructGridSetPeriodic(grid, part, pdata.periodic); } HYPRE_SStructGridAssemble(grid); /*----------------------------------------------------------- * Set up the stencils *-----------------------------------------------------------*/ stencils = hypre_CTAlloc(HYPRE_SStructStencil, data.nstencils, HYPRE_MEMORY_HOST); for (s = 0; s < data.nstencils; s++) { HYPRE_SStructStencilCreate(data.ndim, data.stencil_sizes[s], &stencils[s]); for (i = 0; i < data.stencil_sizes[s]; i++) { HYPRE_SStructStencilSetEntry(stencils[s], i, data.stencil_offsets[s][i], data.stencil_vars[s][i]); } } /*----------------------------------------------------------- * Set up the graph *-----------------------------------------------------------*/ HYPRE_SStructGraphCreate(hypre_MPI_COMM_WORLD, grid, &graph); HYPRE_SStructGraphSetObjectType(graph, HYPRE_PARCSR); for (part = 0; part < data.nparts; part++) { pdata = data.pdata[part]; /* set stencils */ for (var = 0; var < pdata.nvars; var++) { HYPRE_SStructGraphSetStencil(graph, part, var, stencils[pdata.stencil_num[var]]); } /* add entries */ for (entry = 0; entry < pdata.graph_nentries; entry++) { for (index[2] = pdata.graph_ilowers[entry][2]; index[2] <= pdata.graph_iuppers[entry][2]; index[2] += pdata.graph_strides[entry][2]) { for (index[1] = pdata.graph_ilowers[entry][1]; index[1] <= pdata.graph_iuppers[entry][1]; index[1] += pdata.graph_strides[entry][1]) { for (index[0] = pdata.graph_ilowers[entry][0]; index[0] <= pdata.graph_iuppers[entry][0]; index[0] += pdata.graph_strides[entry][0]) { for (i = 0; i < 3; i++) { j = pdata.graph_index_maps[entry][i]; k = index[i] - pdata.graph_ilowers[entry][i]; k /= pdata.graph_strides[entry][i]; k *= pdata.graph_index_signs[entry][i]; to_index[j] = pdata.graph_to_ilowers[entry][j] + k * pdata.graph_to_strides[entry][j]; } HYPRE_SStructGraphAddEntries(graph, part, index, pdata.graph_vars[entry], pdata.graph_to_parts[entry], to_index, pdata.graph_to_vars[entry]); } } } } } HYPRE_SStructGraphAssemble(graph); /*----------------------------------------------------------- * Set up the matrix *-----------------------------------------------------------*/ values = hypre_CTAlloc(HYPRE_Real, data.max_boxsize, HYPRE_MEMORY_HOST); d_values = hypre_TAlloc(HYPRE_Real, data.max_boxsize, memory_location); HYPRE_SStructMatrixCreate(hypre_MPI_COMM_WORLD, graph, &A); /* TODO HYPRE_SStructMatrixSetSymmetric(A, 1); */ for (entry = 0; entry < data.symmetric_nentries; entry++) { HYPRE_SStructMatrixSetSymmetric(A, data.symmetric_parts[entry], data.symmetric_vars[entry], data.symmetric_to_vars[entry], data.symmetric_booleans[entry]); } HYPRE_SStructMatrixSetNSSymmetric(A, data.ns_symmetric); HYPRE_SStructMatrixSetObjectType(A, HYPRE_PARCSR); HYPRE_SStructMatrixInitialize(A); for (part = 0; part < data.nparts; part++) { pdata = data.pdata[part]; cell_grid = hypre_SStructPGridCellSGrid(hypre_SStructGridPGrid(grid, part)); bounding_box = hypre_StructGridBoundingBox(cell_grid); h = (HYPRE_Real) (hypre_BoxIMax(bounding_box)[0] - hypre_BoxIMin(bounding_box)[0]); for (i = 1; i < data.ndim; i++) { if ((hypre_BoxIMax(bounding_box)[i] - hypre_BoxIMin(bounding_box)[i]) > h) { h = (HYPRE_Real) (hypre_BoxIMax(bounding_box)[i] - hypre_BoxIMin(bounding_box)[i]); } } h = 1.0 / h; /* set stencil values */ for (var = 0; var < pdata.nvars; var++) { s = pdata.stencil_num[var]; for (i = 0; i < data.stencil_sizes[s]; i++) { for (j = 0; j < pdata.max_boxsize; j++) { values[j] = h * data.stencil_values[s][i]; } if (i < 9) { for (j = 0; j < pdata.max_boxsize; j++) { values[j] += data.stencil_values[s + data.ndim][i] / h; } } hypre_TMemcpy(d_values, values, HYPRE_Real, data.max_boxsize, memory_location, HYPRE_MEMORY_HOST); for (box = 0; box < pdata.nboxes; box++) { GetVariableBox(pdata.ilowers[box], pdata.iuppers[box], pdata.vartypes[var], ilower, iupper); HYPRE_SStructMatrixSetBoxValues(A, part, ilower, iupper, var, 1, &i, d_values); } } } hypre_TMemcpy(pdata.d_graph_values, pdata.graph_values, HYPRE_Real, pdata.graph_values_size, memory_location, HYPRE_MEMORY_HOST); /* set non-stencil entries */ for (entry = 0; entry < pdata.graph_nentries; entry++) { for (index[2] = pdata.graph_ilowers[entry][2]; index[2] <= pdata.graph_iuppers[entry][2]; index[2] += pdata.graph_strides[entry][2]) { for (index[1] = pdata.graph_ilowers[entry][1]; index[1] <= pdata.graph_iuppers[entry][1]; index[1] += pdata.graph_strides[entry][1]) { for (index[0] = pdata.graph_ilowers[entry][0]; index[0] <= pdata.graph_iuppers[entry][0]; index[0] += pdata.graph_strides[entry][0]) { HYPRE_SStructMatrixSetValues(A, part, index, pdata.graph_vars[entry], 1, &pdata.graph_entries[entry], &pdata.d_graph_values[entry]); } } } } } /* reset matrix values: * NOTE THAT THE matrix_ilowers & matrix_iuppers MUST BE IN TERMS OF THE * CHOOSEN VAR_TYPE INDICES, UNLIKE THE EXTENTS OF THE GRID< WHICH ARE * IN TEMS OF THE CELL VARTYPE INDICES. */ for (part = 0; part < data.nparts; part++) { pdata = data.pdata[part]; hypre_TMemcpy(pdata.d_matrix_values, pdata.matrix_values, HYPRE_Real, pdata.matrix_values_size, memory_location, HYPRE_MEMORY_HOST); for (entry = 0; entry < pdata.matrix_nentries; entry++) { for (index[2] = pdata.matrix_ilowers[entry][2]; index[2] <= pdata.matrix_iuppers[entry][2]; index[2] += pdata.matrix_strides[entry][2]) { for (index[1] = pdata.matrix_ilowers[entry][1]; index[1] <= pdata.matrix_iuppers[entry][1]; index[1] += pdata.matrix_strides[entry][1]) { for (index[0] = pdata.matrix_ilowers[entry][0]; index[0] <= pdata.matrix_iuppers[entry][0]; index[0] += pdata.matrix_strides[entry][0]) { HYPRE_SStructMatrixSetValues(A, part, index, pdata.matrix_vars[entry], 1, &pdata.matrix_entries[entry], &pdata.d_matrix_values[entry]); } } } } } HYPRE_SStructMatrixAssemble(A); HYPRE_MaxwellGrad(grid, &T); /* eliminate the physical boundary points */ HYPRE_SStructMatrixGetObject(A, (void **) &parA); HYPRE_SStructMaxwellPhysBdy(&grid, 1, data.rfactor, &bdryRanks, &bdryRanksCnt); HYPRE_SStructMaxwellEliminateRowsCols(parA, bdryRanksCnt[0], bdryRanks[0]); /*{ hypre_MaxwellOffProcRow **OffProcRows; hypre_SStructSharedDOF_ParcsrMatRowsComm(grid, (hypre_ParCSRMatrix *) parA, &i, &OffProcRows); for (j= 0; j< i; j++) { hypre_MaxwellOffProcRowDestroy((void *) OffProcRows[j]); } hypre_TFree(OffProcRows, HYPRE_MEMORY_HOST); }*/ /*----------------------------------------------------------- * Set up the linear system *-----------------------------------------------------------*/ HYPRE_SStructVectorCreate(hypre_MPI_COMM_WORLD, grid, &b); HYPRE_SStructVectorSetObjectType(b, HYPRE_PARCSR); HYPRE_SStructVectorInitialize(b); for (j = 0; j < data.max_boxsize; j++) { values[j] = hypre_sin((HYPRE_Real)(j + 1)); values[j] = (HYPRE_Real) hypre_Rand(); values[j] = (HYPRE_Real) j; } hypre_TMemcpy(d_values, values, HYPRE_Real, data.max_boxsize, memory_location, HYPRE_MEMORY_HOST); for (part = 0; part < data.nparts; part++) { pdata = data.pdata[part]; for (var = 0; var < pdata.nvars; var++) { for (box = 0; box < pdata.nboxes; box++) { GetVariableBox(pdata.ilowers[box], pdata.iuppers[box], pdata.vartypes[var], ilower, iupper); HYPRE_SStructVectorSetBoxValues(b, part, ilower, iupper, var, d_values); } } } HYPRE_SStructVectorAssemble(b); HYPRE_SStructVectorCreate(hypre_MPI_COMM_WORLD, grid, &x); HYPRE_SStructVectorSetObjectType(x, HYPRE_PARCSR); HYPRE_SStructVectorInitialize(x); for (j = 0; j < data.max_boxsize; j++) { values[j] = 0.0; } hypre_TMemcpy(d_values, values, HYPRE_Real, data.max_boxsize, memory_location, HYPRE_MEMORY_HOST); for (part = 0; part < data.nparts; part++) { pdata = data.pdata[part]; for (var = 0; var < pdata.nvars; var++) { for (box = 0; box < pdata.nboxes; box++) { GetVariableBox(pdata.ilowers[box], pdata.iuppers[box], pdata.vartypes[var], ilower, iupper); HYPRE_SStructVectorSetBoxValues(x, part, ilower, iupper, var, d_values); } } } HYPRE_SStructVectorAssemble(x); HYPRE_SStructVectorGetObject(x, (void **) &parx); HYPRE_SStructVectorGetObject(b, (void **) &parb); HYPRE_SStructMaxwellZeroVector(parx, bdryRanks[0], bdryRanksCnt[0]); HYPRE_SStructMaxwellZeroVector(parb, bdryRanks[0], bdryRanksCnt[0]); hypre_TFree(bdryRanks[0], HYPRE_MEMORY_HOST); hypre_TFree(bdryRanks, HYPRE_MEMORY_HOST); hypre_TFree(bdryRanksCnt, HYPRE_MEMORY_HOST); hypre_EndTiming(time_index); hypre_PrintTiming("SStruct Interface", hypre_MPI_COMM_WORLD); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); /*----------------------------------------------------------- * Print out the system and initial guess *-----------------------------------------------------------*/ if (print_system) { HYPRE_SStructMatrixPrint("sstruct.out.A", A, 0); HYPRE_SStructVectorPrint("sstruct.out.b", b, 0); HYPRE_SStructVectorPrint("sstruct.out.x0", x, 0); } /*----------------------------------------------------------- * Debugging code *-----------------------------------------------------------*/ hypre_TFree(values, HYPRE_MEMORY_HOST); hypre_TFree(d_values, memory_location); if (solver_id == 1) { time_index = hypre_InitializeTiming("Maxwell Setup"); hypre_BeginTiming(time_index); HYPRE_SStructMaxwellCreate(hypre_MPI_COMM_WORLD, &solver); HYPRE_SStructMaxwellSetMaxIter(solver, 20); HYPRE_SStructMaxwellSetTol(solver, 1.0e-8); HYPRE_SStructMaxwellSetRelChange(solver, 0); HYPRE_SStructMaxwellSetNumPreRelax(solver, 1); HYPRE_SStructMaxwellSetNumPostRelax(solver, 1); HYPRE_SStructMaxwellSetRfactors(solver, data.rfactor); HYPRE_SStructMaxwellSetGrad(solver, T); /*HYPRE_SStructMaxwellSetConstantCoef(solver, 1);*/ HYPRE_SStructMaxwellSetPrintLevel(solver, 1); HYPRE_SStructMaxwellSetLogging(solver, 1); HYPRE_SStructMaxwellSetup(solver, A, b, x); hypre_EndTiming(time_index); hypre_PrintTiming("Setup phase times", hypre_MPI_COMM_WORLD); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); time_index = hypre_InitializeTiming("Maxwell Solve"); hypre_BeginTiming(time_index); HYPRE_SStructMaxwellSolve(solver, A, b, x); hypre_EndTiming(time_index); hypre_PrintTiming("Solve phase times", hypre_MPI_COMM_WORLD); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); HYPRE_SStructMaxwellGetNumIterations(solver, &num_iterations); HYPRE_SStructMaxwellGetFinalRelativeResidualNorm( solver, &final_res_norm); HYPRE_SStructMaxwellDestroy(solver); } HYPRE_SStructVectorGather(x); /*----------------------------------------------------------- * Print the solution and other info *-----------------------------------------------------------*/ if (print_system) { HYPRE_SStructVectorPrint("sstruct.out.x", x, 0); } if (myid == 0) { hypre_printf("\n"); hypre_printf("Iterations = %d\n", num_iterations); hypre_printf("Final Relative Residual Norm = %e\n", final_res_norm); hypre_printf("\n"); } /*----------------------------------------------------------- * Finalize things *-----------------------------------------------------------*/ HYPRE_SStructGridDestroy(grid); for (s = 0; s < data.nstencils; s++) { HYPRE_SStructStencilDestroy(stencils[s]); } hypre_TFree(stencils, HYPRE_MEMORY_HOST); HYPRE_SStructGraphDestroy(graph); HYPRE_SStructMatrixDestroy(A); HYPRE_ParCSRMatrixDestroy(T); HYPRE_SStructVectorDestroy(b); HYPRE_SStructVectorDestroy(x); DestroyData(data); hypre_TFree(parts, HYPRE_MEMORY_HOST); hypre_TFree(refine, HYPRE_MEMORY_HOST); hypre_TFree(distribute, HYPRE_MEMORY_HOST); hypre_TFree(block, HYPRE_MEMORY_HOST); /* Finalize Hypre */ HYPRE_Finalize(); /* Finalize MPI */ hypre_MPI_Finalize(); #if defined(HYPRE_USING_MEMORY_TRACKER) if (memory_location == HYPRE_MEMORY_HOST) { if (hypre_total_bytes[hypre_MEMORY_DEVICE] || hypre_total_bytes[hypre_MEMORY_UNIFIED]) { hypre_printf("Error: nonzero GPU memory allocated with the HOST mode\n"); hypre_assert(0); } } #endif return (0); } hypre-2.33.0/src/test/new_ij.c000066400000000000000000006554131477326011500161370ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /*-------------------------------------------------------------------------- * Test driver for unstructured matrix interface (IJ_matrix interface). * Do `driver -help' for usage info. * This driver started from the driver for parcsr_linear_solvers, and it * works by first building a parcsr matrix as before and then "copying" * that matrix row-by-row into the IJMatrix interface. AJC 7/99. *--------------------------------------------------------------------------*/ #include #include #include #include "_hypre_utilities.h" #include "HYPRE.h" #include "HYPRE_parcsr_mv.h" #include "HYPRE_IJ_mv.h" #include "HYPRE_parcsr_ls.h" #include "_hypre_parcsr_mv.h" #include "HYPRE_krylov.h" #ifdef __cplusplus extern "C" { #endif HYPRE_Int BuildParFromFile (HYPRE_Int argc, char *argv [], HYPRE_Int arg_index, HYPRE_ParCSRMatrix *A_ptr ); HYPRE_Int BuildParRhsFromFile (HYPRE_Int argc, char *argv [], HYPRE_Int arg_index, HYPRE_ParVector *b_ptr ); HYPRE_Int BuildParLaplacian (HYPRE_Int argc, char *argv [], HYPRE_Int arg_index, HYPRE_ParCSRMatrix *A_ptr ); HYPRE_Int BuildParSysLaplacian (HYPRE_Int argc, char *argv [], HYPRE_Int arg_index, HYPRE_ParCSRMatrix *A_ptr ); HYPRE_Int BuildParDifConv (HYPRE_Int argc, char *argv [], HYPRE_Int arg_index, HYPRE_ParCSRMatrix *A_ptr ); HYPRE_Int BuildParFromOneFile (HYPRE_Int argc, char *argv [], HYPRE_Int arg_index, HYPRE_Int num_functions, HYPRE_ParCSRMatrix *A_ptr ); HYPRE_Int BuildFuncsFromFiles (HYPRE_Int argc, char *argv [], HYPRE_Int arg_index, HYPRE_ParCSRMatrix A, HYPRE_Int **dof_func_ptr ); HYPRE_Int BuildFuncsFromOneFile (HYPRE_Int argc, char *argv [], HYPRE_Int arg_index, HYPRE_ParCSRMatrix A, HYPRE_Int **dof_func_ptr ); HYPRE_Int BuildRhsParFromOneFile (HYPRE_Int argc, char *argv [], HYPRE_Int arg_index, HYPRE_Int *partitioning, HYPRE_ParVector *b_ptr ); HYPRE_Int BuildParLaplacian9pt (HYPRE_Int argc, char *argv [], HYPRE_Int arg_index, HYPRE_ParCSRMatrix *A_ptr ); HYPRE_Int BuildParLaplacian27pt (HYPRE_Int argc, char *argv [], HYPRE_Int arg_index, HYPRE_ParCSRMatrix *A_ptr ); HYPRE_Int BuildParRotate7pt (HYPRE_Int argc, char *argv [], HYPRE_Int arg_index, HYPRE_ParCSRMatrix *A_ptr ); HYPRE_Int BuildParVarDifConv (HYPRE_Int argc, char *argv [], HYPRE_Int arg_index, HYPRE_ParCSRMatrix *A_ptr, HYPRE_ParVector *rhs_ptr ); HYPRE_ParCSRMatrix GenerateSysLaplacian (MPI_Comm comm, HYPRE_Int nx, HYPRE_Int ny, HYPRE_Int nz, HYPRE_Int P, HYPRE_Int Q, HYPRE_Int R, HYPRE_Int p, HYPRE_Int q, HYPRE_Int r, HYPRE_Int num_fun, HYPRE_Real *mtrx, HYPRE_Real *value); HYPRE_ParCSRMatrix GenerateSysLaplacianVCoef (MPI_Comm comm, HYPRE_Int nx, HYPRE_Int ny, HYPRE_Int nz, HYPRE_Int P, HYPRE_Int Q, HYPRE_Int R, HYPRE_Int p, HYPRE_Int q, HYPRE_Int r, HYPRE_Int num_fun, HYPRE_Real *mtrx, HYPRE_Real *value); HYPRE_Int SetSysVcoefValues(HYPRE_Int num_fun, HYPRE_Int nx, HYPRE_Int ny, HYPRE_Int nz, HYPRE_Real vcx, HYPRE_Real vcy, HYPRE_Real vcz, HYPRE_Int mtx_entry, HYPRE_Real *values); HYPRE_Int BuildParCoordinates (HYPRE_Int argc, char *argv [], HYPRE_Int arg_index, HYPRE_Int *coorddim_ptr, float **coord_ptr ); extern HYPRE_Int hypre_FlexGMRESModifyPCAMGExample(void *precond_data, HYPRE_Int iterations, HYPRE_Real rel_residual_norm); extern HYPRE_Int hypre_FlexGMRESModifyPCDefault(void *precond_data, HYPRE_Int iteration, HYPRE_Real rel_residual_norm); #ifdef __cplusplus } #endif #define SECOND_TIME 0 hypre_int main( hypre_int argc, char *argv[] ) { HYPRE_Int arg_index; HYPRE_Int print_usage; HYPRE_Int sparsity_known = 0; HYPRE_Int add = 0; HYPRE_Int off_proc = 0; HYPRE_Int chunk = 0; HYPRE_Int omp_flag = 0; HYPRE_Int build_matrix_type; HYPRE_Int build_matrix_arg_index; HYPRE_Int build_rhs_type; HYPRE_Int build_rhs_arg_index; HYPRE_Int build_src_type; HYPRE_Int build_src_arg_index; HYPRE_Int build_funcs_type; HYPRE_Int build_funcs_arg_index; HYPRE_Int solver_id; HYPRE_Int solver_type = 1; HYPRE_Int ioutdat; HYPRE_Int poutdat; HYPRE_Int debug_flag; HYPRE_Int ierr = 0; HYPRE_Int i, j; HYPRE_Int max_levels = 25; HYPRE_Int num_iterations; HYPRE_Int pcg_num_its, dscg_num_its; HYPRE_Int max_iter = 1000; HYPRE_Int mg_max_iter = 100; HYPRE_Int nodal = 0; HYPRE_Int nodal_diag = 0; HYPRE_Real cf_tol = 0.9; HYPRE_Real norm; HYPRE_Real final_res_norm; void *object; HYPRE_IJMatrix ij_A; HYPRE_IJVector ij_b; HYPRE_IJVector ij_x; HYPRE_IJVector *ij_rbm; HYPRE_ParCSRMatrix parcsr_A; HYPRE_ParVector b; HYPRE_ParVector x; HYPRE_ParVector *interp_vecs = NULL; HYPRE_Solver amg_solver; HYPRE_Solver pcg_solver; HYPRE_Solver pcg_precond = NULL, pcg_precond_gotten; HYPRE_Int num_procs, myid; HYPRE_Int local_row; HYPRE_Int *row_sizes; HYPRE_Int *diag_sizes; HYPRE_Int *offdiag_sizes; HYPRE_Int *rows; HYPRE_Int size; HYPRE_Int *ncols; HYPRE_Int *col_inds; HYPRE_Int *dof_func; HYPRE_Int num_functions = 1; HYPRE_Int num_paths = 1; HYPRE_Int agg_num_levels = 0; HYPRE_Int ns_coarse = 1; HYPRE_Int time_index; MPI_Comm comm = hypre_MPI_COMM_WORLD; HYPRE_Int M, N; HYPRE_Int first_local_row, last_local_row, local_num_rows; HYPRE_Int first_local_col, last_local_col, local_num_cols; HYPRE_Int variant, overlap, domain_type; HYPRE_Real schwarz_rlx_weight; HYPRE_Real *values, val; HYPRE_Int use_nonsymm_schwarz = 0; HYPRE_Int test_ij = 0; HYPRE_Int build_rbm = 0; HYPRE_Int build_rbm_index = 0; HYPRE_Int num_interp_vecs = 0; HYPRE_Int interp_vec_variant = 0; HYPRE_Int Q_max = 0; HYPRE_Real Q_trunc = 0; const HYPRE_Real dt_inf = 1.e40; HYPRE_Real dt = dt_inf; /* parameters for BoomerAMG */ HYPRE_Real strong_threshold; HYPRE_Real trunc_factor; HYPRE_Real jacobi_trunc_threshold; HYPRE_Real S_commpkg_switch = 1.0; HYPRE_Real CR_rate = 0.7; HYPRE_Real CR_strong_th = 0.0; HYPRE_Int CR_use_CG = 0; HYPRE_Int P_max_elmts = 0; HYPRE_Int cycle_type; HYPRE_Int coarsen_type = 6; HYPRE_Int measure_type = 0; HYPRE_Int num_sweeps = 1; HYPRE_Int IS_type; HYPRE_Int num_CR_relax_steps = 2; HYPRE_Int relax_type; HYPRE_Int relax_coarse = -1; HYPRE_Int relax_up = -1; HYPRE_Int relax_down = -1; HYPRE_Int relax_order = 1; HYPRE_Int level_w = -1; HYPRE_Int level_ow = -1; /* HYPRE_Int smooth_lev; */ /* HYPRE_Int smooth_rlx = 8; */ HYPRE_Int smooth_type = 6; HYPRE_Int smooth_num_levels = 0; HYPRE_Int smooth_num_sweeps = 1; HYPRE_Int coarse_threshold = 9; HYPRE_Int min_coarse_size = 0; /* redundant coarse grid solve */ HYPRE_Int seq_threshold = 0; HYPRE_Int redundant = 0; /* additive versions */ HYPRE_Int additive = -1; HYPRE_Int mult_add = -1; HYPRE_Int simple = -1; HYPRE_Int add_P_max_elmts = 0; HYPRE_Real add_trunc_factor = 0; HYPRE_Int rap2 = 0; HYPRE_Int keepTranspose = 0; HYPRE_Real relax_wt; HYPRE_Real relax_wt_level; HYPRE_Real outer_wt; HYPRE_Real outer_wt_level; HYPRE_Real tol = 1.e-8, pc_tol = 0.; HYPRE_Real atol = 0.0; HYPRE_Real max_row_sum = 1.; HYPRE_Int cheby_order = 2; HYPRE_Real cheby_fraction = .3; /* for CGC BM Aug 25, 2006 */ HYPRE_Int cgcits = 1; /* for coordinate plotting BM Oct 24, 2006 */ HYPRE_Int plot_grids = 0; HYPRE_Int coord_dim = 3; float *coordinates = NULL; char plot_file_name[256]; /* parameters for ParaSAILS */ HYPRE_Real sai_threshold = 0.1; HYPRE_Real sai_filter = 0.1; /* parameters for PILUT */ HYPRE_Real drop_tol = -1; HYPRE_Int nonzeros_to_keep = -1; /* parameters for Euclid or ILU smoother in AMG */ HYPRE_Real eu_ilut = 0.0; HYPRE_Real eu_sparse_A = 0.0; HYPRE_Int eu_bj = 0; HYPRE_Int eu_level = -1; HYPRE_Int eu_stats = 0; HYPRE_Int eu_mem = 0; HYPRE_Int eu_row_scale = 0; /* Euclid only */ /* parameters for GMRES */ HYPRE_Int k_dim; /* parameters for LGMRES */ HYPRE_Int aug_dim; /* parameters for GSMG */ HYPRE_Int gsmg_samples = 5; /* interpolation */ HYPRE_Int interp_type = 0; /* default value */ HYPRE_Int post_interp_type = 0; /* default value */ /* aggressive coarsening */ HYPRE_Int agg_interp_type = 4; /* default value */ HYPRE_Int agg_P_max_elmts = 0; /* default value */ HYPRE_Int agg_P12_max_elmts = 0; /* default value */ HYPRE_Real agg_trunc_factor = 0; /* default value */ HYPRE_Real agg_P12_trunc_factor = 0; /* default value */ HYPRE_Int print_system = 0; HYPRE_Int rel_change = 0; HYPRE_Real *nongalerk_tol = NULL; HYPRE_Int nongalerk_num_tol = 0; HYPRE_Int *row_nums = NULL; HYPRE_Int *num_cols = NULL; HYPRE_Int *col_nums = NULL; HYPRE_Int i_indx, j_indx, num_rows; HYPRE_Real *data = NULL; /*----------------------------------------------------------- * Initialize some stuff *-----------------------------------------------------------*/ /* Initialize MPI */ hypre_MPI_Init(&argc, &argv); hypre_MPI_Comm_size(hypre_MPI_COMM_WORLD, &num_procs ); hypre_MPI_Comm_rank(hypre_MPI_COMM_WORLD, &myid ); /*----------------------------------------------------------- * Set defaults *-----------------------------------------------------------*/ build_matrix_type = 2; build_matrix_arg_index = argc; build_rhs_type = 2; build_rhs_arg_index = argc; build_src_type = -1; build_src_arg_index = argc; build_funcs_type = 0; build_funcs_arg_index = argc; relax_type = 3; IS_type = 1; debug_flag = 0; solver_id = 0; ioutdat = 3; poutdat = 1; hypre_sprintf (plot_file_name, "AMGgrids.CF.dat"); /*----------------------------------------------------------- * Parse command line *-----------------------------------------------------------*/ print_usage = 0; arg_index = 1; while ( (arg_index < argc) && (!print_usage) ) { if ( strcmp(argv[arg_index], "-fromfile") == 0 ) { arg_index++; build_matrix_type = -1; build_matrix_arg_index = arg_index; } else if ( strcmp(argv[arg_index], "-fromparcsrfile") == 0 ) { arg_index++; build_matrix_type = 0; build_matrix_arg_index = arg_index; } else if ( strcmp(argv[arg_index], "-fromonecsrfile") == 0 ) { arg_index++; build_matrix_type = 1; build_matrix_arg_index = arg_index; } else if ( strcmp(argv[arg_index], "-laplacian") == 0 ) { arg_index++; build_matrix_type = 2; build_matrix_arg_index = arg_index; } else if ( strcmp(argv[arg_index], "-9pt") == 0 ) { arg_index++; build_matrix_type = 3; build_matrix_arg_index = arg_index; } else if ( strcmp(argv[arg_index], "-27pt") == 0 ) { arg_index++; build_matrix_type = 4; build_matrix_arg_index = arg_index; } else if ( strcmp(argv[arg_index], "-difconv") == 0 ) { arg_index++; build_matrix_type = 5; build_matrix_arg_index = arg_index; } else if ( strcmp(argv[arg_index], "-vardifconv") == 0 ) { arg_index++; build_matrix_type = 6; build_matrix_arg_index = arg_index; } else if ( strcmp(argv[arg_index], "-rotate") == 0 ) { arg_index++; build_matrix_type = 7; build_matrix_arg_index = arg_index; } else if ( strcmp(argv[arg_index], "-test_ij") == 0 ) { arg_index++; test_ij = 1; } else if ( strcmp(argv[arg_index], "-funcsfromonefile") == 0 ) { arg_index++; build_funcs_type = 1; build_funcs_arg_index = arg_index; } else if ( strcmp(argv[arg_index], "-funcsfromfile") == 0 ) { arg_index++; build_funcs_type = 2; build_funcs_arg_index = arg_index; } else if ( strcmp(argv[arg_index], "-exact_size") == 0 ) { arg_index++; sparsity_known = 1; } else if ( strcmp(argv[arg_index], "-storage_low") == 0 ) { arg_index++; sparsity_known = 2; } else if ( strcmp(argv[arg_index], "-add") == 0 ) { arg_index++; add = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-chunk") == 0 ) { arg_index++; chunk = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-off_proc") == 0 ) { arg_index++; off_proc = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-omp") == 0 ) { arg_index++; omp_flag = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-concrete_parcsr") == 0 ) { arg_index++; build_matrix_arg_index = arg_index; } else if ( strcmp(argv[arg_index], "-solver") == 0 ) { arg_index++; solver_id = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-rbm") == 0 ) { arg_index++; build_rbm = 1; num_interp_vecs = atoi(argv[arg_index++]); build_rbm_index = arg_index; } else if ( strcmp(argv[arg_index], "-rhsfromfile") == 0 ) { arg_index++; build_rhs_type = 0; build_rhs_arg_index = arg_index; } else if ( strcmp(argv[arg_index], "-rhsfromonefile") == 0 ) { arg_index++; build_rhs_type = 1; build_rhs_arg_index = arg_index; } else if ( strcmp(argv[arg_index], "-rhsparcsrfile") == 0 ) { arg_index++; build_rhs_type = 7; build_rhs_arg_index = arg_index; } else if ( strcmp(argv[arg_index], "-rhsisone") == 0 ) { arg_index++; build_rhs_type = 2; build_rhs_arg_index = arg_index; } else if ( strcmp(argv[arg_index], "-rhsrand") == 0 ) { arg_index++; build_rhs_type = 3; build_rhs_arg_index = arg_index; } else if ( strcmp(argv[arg_index], "-xisone") == 0 ) { arg_index++; build_rhs_type = 4; build_rhs_arg_index = arg_index; } else if ( strcmp(argv[arg_index], "-rhszero") == 0 ) { arg_index++; build_rhs_type = 5; build_rhs_arg_index = arg_index; } else if ( strcmp(argv[arg_index], "-srcfromfile") == 0 ) { arg_index++; build_src_type = 0; build_rhs_type = -1; build_src_arg_index = arg_index; } else if ( strcmp(argv[arg_index], "-srcfromonefile") == 0 ) { arg_index++; build_src_type = 1; build_rhs_type = -1; build_src_arg_index = arg_index; } else if ( strcmp(argv[arg_index], "-srcisone") == 0 ) { arg_index++; build_src_type = 2; build_rhs_type = -1; build_src_arg_index = arg_index; } else if ( strcmp(argv[arg_index], "-srcrand") == 0 ) { arg_index++; build_src_type = 3; build_rhs_type = -1; build_src_arg_index = arg_index; } else if ( strcmp(argv[arg_index], "-srczero") == 0 ) { arg_index++; build_src_type = 4; build_rhs_type = -1; build_src_arg_index = arg_index; } else if ( strcmp(argv[arg_index], "-cljp") == 0 ) { arg_index++; coarsen_type = 0; } else if ( strcmp(argv[arg_index], "-cljp1") == 0 ) { arg_index++; coarsen_type = 7; } else if ( strcmp(argv[arg_index], "-cgc") == 0 ) { arg_index++; coarsen_type = 21; cgcits = 200; } else if ( strcmp(argv[arg_index], "-cgce") == 0 ) { arg_index++; coarsen_type = 22; cgcits = 200; } else if ( strcmp(argv[arg_index], "-pmis") == 0 ) { arg_index++; coarsen_type = 8; } else if ( strcmp(argv[arg_index], "-pmis1") == 0 ) { arg_index++; coarsen_type = 9; } else if ( strcmp(argv[arg_index], "-cr1") == 0 ) { arg_index++; coarsen_type = 98; } else if ( strcmp(argv[arg_index], "-cr") == 0 ) { arg_index++; coarsen_type = 99; } else if ( strcmp(argv[arg_index], "-crcg") == 0 ) { arg_index++; CR_use_CG = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-hmis") == 0 ) { arg_index++; coarsen_type = 10; } else if ( strcmp(argv[arg_index], "-ruge") == 0 ) { arg_index++; coarsen_type = 1; } else if ( strcmp(argv[arg_index], "-ruge1p") == 0 ) { arg_index++; coarsen_type = 11; } else if ( strcmp(argv[arg_index], "-ruge2b") == 0 ) { arg_index++; coarsen_type = 2; } else if ( strcmp(argv[arg_index], "-ruge3") == 0 ) { arg_index++; coarsen_type = 3; } else if ( strcmp(argv[arg_index], "-ruge3c") == 0 ) { arg_index++; coarsen_type = 4; } else if ( strcmp(argv[arg_index], "-rugerlx") == 0 ) { arg_index++; coarsen_type = 5; } else if ( strcmp(argv[arg_index], "-falgout") == 0 ) { arg_index++; coarsen_type = 6; } else if ( strcmp(argv[arg_index], "-gm") == 0 ) { arg_index++; measure_type = 1; } else if ( strcmp(argv[arg_index], "-is") == 0 ) { arg_index++; IS_type = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-ncr") == 0 ) { arg_index++; num_CR_relax_steps = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-crth") == 0 ) { arg_index++; CR_rate = (HYPRE_Real)atof(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-crst") == 0 ) { arg_index++; CR_strong_th = (HYPRE_Real)atof(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-rlx") == 0 ) { arg_index++; relax_type = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-rlx_coarse") == 0 ) { arg_index++; relax_coarse = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-rlx_down") == 0 ) { arg_index++; relax_down = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-rlx_up") == 0 ) { arg_index++; relax_up = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-smtype") == 0 ) { arg_index++; smooth_type = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-smlv") == 0 ) { arg_index++; smooth_num_levels = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-mxl") == 0 ) { arg_index++; max_levels = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-dbg") == 0 ) { arg_index++; debug_flag = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-nf") == 0 ) { arg_index++; num_functions = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-agg_nl") == 0 ) { arg_index++; agg_num_levels = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-npaths") == 0 ) { arg_index++; num_paths = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-ns") == 0 ) { arg_index++; num_sweeps = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-ns_coarse") == 0 ) { arg_index++; ns_coarse = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-sns") == 0 ) { arg_index++; smooth_num_sweeps = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-max_iter") == 0 ) { arg_index++; max_iter = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-mg_max_iter") == 0 ) { arg_index++; mg_max_iter = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-dt") == 0 ) { arg_index++; dt = (HYPRE_Real)atof(argv[arg_index++]); build_rhs_type = -1; if ( build_src_type == -1 ) { build_src_type = 2; } } else if ( strcmp(argv[arg_index], "-help") == 0 ) { print_usage = 1; } else { arg_index++; } } /* begin CGC BM Aug 25, 2006 */ if (coarsen_type == 21 || coarsen_type == 22) { arg_index = 0; while ( (arg_index < argc) && (!print_usage) ) { if ( strcmp(argv[arg_index], "-cgcits") == 0 ) { arg_index++; cgcits = atoi(argv[arg_index++]); } else { arg_index++; } } } if (solver_id == 8 || solver_id == 18) { max_levels = 1; } /* defaults for BoomerAMG */ if (solver_id == 0 || solver_id == 1 || solver_id == 3 || solver_id == 5 || solver_id == 9 || solver_id == 13 || solver_id == 14 || solver_id == 15 || solver_id == 20 || solver_id == 51 || solver_id == 61) { strong_threshold = 0.25; trunc_factor = 0.; jacobi_trunc_threshold = 0.01; cycle_type = 1; relax_wt = 1.; outer_wt = 1.; /* for CGNR preconditioned with Boomeramg, only relaxation scheme 0 is implemented, i.e. Jacobi relaxation, and needs to be used without CF ordering */ if (solver_id == 5) { relax_type = 0; relax_order = 0; } } /* defaults for Schwarz */ variant = 0; /* multiplicative */ overlap = 1; /* 1 layer overlap */ domain_type = 2; /* through agglomeration */ schwarz_rlx_weight = 1.; /* defaults for GMRES */ k_dim = 5; /* defaults for LGMRES - should use a larger k_dim, though*/ aug_dim = 2; arg_index = 0; while (arg_index < argc) { if ( strcmp(argv[arg_index], "-k") == 0 ) { arg_index++; k_dim = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-aug") == 0 ) { arg_index++; aug_dim = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-w") == 0 ) { arg_index++; relax_wt = (HYPRE_Real)atof(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-wl") == 0 ) { arg_index++; relax_wt_level = (HYPRE_Real)atof(argv[arg_index++]); level_w = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-ow") == 0 ) { arg_index++; outer_wt = (HYPRE_Real)atof(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-owl") == 0 ) { arg_index++; outer_wt_level = (HYPRE_Real)atof(argv[arg_index++]); level_ow = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-sw") == 0 ) { arg_index++; schwarz_rlx_weight = (HYPRE_Real)atof(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-coarse_th") == 0 ) { arg_index++; coarse_threshold = (HYPRE_Real)atof(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-min_cs") == 0 ) { arg_index++; min_coarse_size = (HYPRE_Real)atof(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-seq_th") == 0 ) { arg_index++; seq_threshold = (HYPRE_Real)atof(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-red") == 0 ) { arg_index++; redundant = (HYPRE_Real)atof(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-th") == 0 ) { arg_index++; strong_threshold = (HYPRE_Real)atof(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-CF") == 0 ) { arg_index++; relax_order = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-cf") == 0 ) { arg_index++; cf_tol = (HYPRE_Real)atof(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-tol") == 0 ) { arg_index++; tol = (HYPRE_Real)atof(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-atol") == 0 ) { arg_index++; atol = (HYPRE_Real)atof(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-mxrs") == 0 ) { arg_index++; max_row_sum = (HYPRE_Real)atof(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-sai_th") == 0 ) { arg_index++; sai_threshold = (HYPRE_Real)atof(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-sai_filt") == 0 ) { arg_index++; sai_filter = (HYPRE_Real)atof(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-drop_tol") == 0 ) { arg_index++; drop_tol = (HYPRE_Real)atof(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-nonzeros_to_keep") == 0 ) { arg_index++; nonzeros_to_keep = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-ilut") == 0 ) { arg_index++; eu_ilut = (HYPRE_Real)atof(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-sparseA") == 0 ) { arg_index++; eu_sparse_A = (HYPRE_Real)atof(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-rowScale") == 0 ) { arg_index++; eu_row_scale = 1; } else if ( strcmp(argv[arg_index], "-level") == 0 ) { arg_index++; eu_level = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-bj") == 0 ) { arg_index++; eu_bj = 1; } else if ( strcmp(argv[arg_index], "-eu_stats") == 0 ) { arg_index++; eu_stats = 1; } else if ( strcmp(argv[arg_index], "-eu_mem") == 0 ) { arg_index++; eu_mem = 1; } else if ( strcmp(argv[arg_index], "-tr") == 0 ) { arg_index++; trunc_factor = (HYPRE_Real)atof(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-Pmx") == 0 ) { arg_index++; P_max_elmts = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-interpvecvar") == 0 ) { arg_index++; interp_vec_variant = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-Qtr") == 0 ) { arg_index++; Q_trunc = (HYPRE_Real)atof(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-Qmx") == 0 ) { arg_index++; Q_max = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-jtr") == 0 ) { arg_index++; jacobi_trunc_threshold = (HYPRE_Real)atof(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-Ssw") == 0 ) { arg_index++; S_commpkg_switch = (HYPRE_Real)atof(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-solver_type") == 0 ) { arg_index++; solver_type = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-iout") == 0 ) { arg_index++; ioutdat = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-pout") == 0 ) { arg_index++; poutdat = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-var") == 0 ) { arg_index++; variant = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-use_ns") == 0 ) { arg_index++; use_nonsymm_schwarz = 1; } else if ( strcmp(argv[arg_index], "-ov") == 0 ) { arg_index++; overlap = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-dom") == 0 ) { arg_index++; domain_type = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-blk_sm") == 0 ) { arg_index++; smooth_num_levels = atoi(argv[arg_index++]); overlap = 0; smooth_type = 6; domain_type = 1; } else if ( strcmp(argv[arg_index], "-mu") == 0 ) { arg_index++; cycle_type = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-numsamp") == 0 ) { arg_index++; gsmg_samples = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-interptype") == 0 ) { arg_index++; interp_type = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-agg_interp") == 0 ) { arg_index++; agg_interp_type = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-agg_Pmx") == 0 ) { arg_index++; agg_P_max_elmts = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-agg_P12_mx") == 0 ) { arg_index++; agg_P12_max_elmts = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-agg_tr") == 0 ) { arg_index++; agg_trunc_factor = (HYPRE_Real)atof(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-agg_P12_tr") == 0 ) { arg_index++; agg_P12_trunc_factor = (HYPRE_Real)atof(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-postinterptype") == 0 ) { arg_index++; post_interp_type = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-nodal") == 0 ) { arg_index++; nodal = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-rel_change") == 0 ) { arg_index++; rel_change = 1; } else if ( strcmp(argv[arg_index], "-nodal_diag") == 0 ) { arg_index++; nodal_diag = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-cheby_order") == 0 ) { arg_index++; cheby_order = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-cheby_fraction") == 0 ) { arg_index++; cheby_fraction = (HYPRE_Real)atof(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-additive") == 0 ) { arg_index++; additive = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-mult_add") == 0 ) { arg_index++; mult_add = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-simple") == 0 ) { arg_index++; simple = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-add_Pmx") == 0 ) { arg_index++; add_P_max_elmts = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-add_tr") == 0 ) { arg_index++; add_trunc_factor = (HYPRE_Real)atof(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-rap") == 0 ) { arg_index++; rap2 = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-keepT") == 0 ) { arg_index++; keepTranspose = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-nongalerk_tol") == 0 ) { arg_index++; nongalerk_num_tol = atoi(argv[arg_index++]); nongalerk_tol = hypre_CTAlloc(HYPRE_Real, nongalerk_num_tol, HYPRE_MEMORY_HOST); for (i = 0; i < nongalerk_num_tol; i++) { nongalerk_tol[i] = (HYPRE_Real)atof(argv[arg_index++]); } } else if ( strcmp(argv[arg_index], "-print") == 0 ) { arg_index++; print_system = 1; } /* BM Oct 23, 2006 */ else if ( strcmp(argv[arg_index], "-plot_grids") == 0 ) { arg_index++; plot_grids = 1; } else if ( strcmp(argv[arg_index], "-plot_file_name") == 0 ) { arg_index++; hypre_sprintf (plot_file_name, "%s", argv[arg_index++]); } else { arg_index++; } } /*----------------------------------------------------------- * Print usage info *-----------------------------------------------------------*/ if ( (print_usage) && (myid == 0) ) { hypre_printf("\n"); hypre_printf("Usage: %s []\n", argv[0]); hypre_printf("\n"); hypre_printf(" -fromfile : "); hypre_printf("matrix read from multiple files (IJ format)\n"); hypre_printf(" -fromparcsrfile : "); hypre_printf("matrix read from multiple files (ParCSR format)\n"); hypre_printf(" -fromonecsrfile : "); hypre_printf("matrix read from a single file (CSR format)\n"); hypre_printf("\n"); hypre_printf(" -laplacian [] : build 5pt 2D laplacian problem (default) \n"); hypre_printf(" -sysL : build SYSTEMS laplacian 7pt operator\n"); hypre_printf(" -9pt [] : build 9pt 2D laplacian problem\n"); hypre_printf(" -27pt [] : build 27pt 3D laplacian problem\n"); hypre_printf(" -difconv [] : build convection-diffusion problem\n"); hypre_printf(" -n : total problem size \n"); hypre_printf(" -P : processor topology\n"); hypre_printf(" -c : diffusion coefficients\n"); hypre_printf(" -a : convection coefficients\n"); hypre_printf("\n"); hypre_printf(" -exact_size : inserts immediately into ParCSR structure\n"); hypre_printf(" -storage_low : allocates not enough storage for aux struct\n"); hypre_printf(" -concrete_parcsr : use parcsr matrix type as concrete type\n"); hypre_printf("\n"); hypre_printf(" -rhsfromfile : "); hypre_printf("rhs read from multiple files (IJ format)\n"); hypre_printf(" -rhsfromonefile : "); hypre_printf("rhs read from a single file (CSR format)\n"); hypre_printf(" -rhsparcsrfile : "); hypre_printf("rhs read from multiple files (ParCSR format)\n"); hypre_printf(" -rhsrand : rhs is random vector\n"); hypre_printf(" -rhsisone : rhs is vector with unit components (default)\n"); hypre_printf(" -xisone : solution of all ones\n"); hypre_printf(" -rhszero : rhs is zero vector\n"); hypre_printf("\n"); hypre_printf(" -dt : specify finite backward Euler time step\n"); hypre_printf(" : -rhsfromfile, -rhsfromonefile, -rhsrand,\n"); hypre_printf(" : -rhsrand, or -xisone will be ignored\n"); hypre_printf(" -srcfromfile : "); hypre_printf("backward Euler source read from multiple files (IJ format)\n"); hypre_printf(" -srcfromonefile : "); hypre_printf("backward Euler source read from a single file (IJ format)\n"); hypre_printf(" -srcrand : "); hypre_printf("backward Euler source is random vector with components in range 0 - 1\n"); hypre_printf(" -srcisone : "); hypre_printf("backward Euler source is vector with unit components (default)\n"); hypre_printf(" -srczero : "); hypre_printf("backward Euler source is zero-vector\n"); hypre_printf("\n"); hypre_printf(" -solver : solver ID\n"); hypre_printf(" 0=AMG 1=AMG-PCG \n"); hypre_printf(" 2=DS-PCG 3=AMG-GMRES \n"); hypre_printf(" 4=DS-GMRES 5=AMG-CGNR \n"); hypre_printf(" 6=DS-CGNR 7=PILUT-GMRES \n"); hypre_printf(" 8=ParaSails-PCG 9=AMG-BiCGSTAB \n"); hypre_printf(" 10=DS-BiCGSTAB 11=PILUT-BiCGSTAB \n"); hypre_printf(" 12=Schwarz-PCG 13=GSMG \n"); hypre_printf(" 14=GSMG-PCG 15=GSMG-GMRES\n"); hypre_printf(" 18=ParaSails-GMRES\n"); hypre_printf(" 20=Hybrid solver/ DiagScale, AMG \n"); hypre_printf(" 43=Euclid-PCG 44=Euclid-GMRES \n"); hypre_printf(" 45=Euclid-BICGSTAB\n"); hypre_printf(" 50=DS-LGMRES 51=AMG-LGMRES \n"); hypre_printf(" 60=DS-FlexGMRES 61=AMG-FlexGMRES \n"); hypre_printf("\n"); hypre_printf(" -cljp : CLJP coarsening \n"); hypre_printf(" -cljp1 : CLJP coarsening, fixed random \n"); hypre_printf(" -cgc : CGC coarsening \n"); hypre_printf(" -cgce : CGC-E coarsening \n"); hypre_printf(" -pmis : PMIS coarsening \n"); hypre_printf(" -pmis1 : PMIS coarsening, fixed random \n"); hypre_printf(" -hmis : HMIS coarsening \n"); hypre_printf(" -ruge : Ruge-Stueben coarsening (local)\n"); hypre_printf(" -ruge1p : Ruge-Stueben coarsening 1st pass only(local)\n"); hypre_printf(" -ruge3 : third pass on boundary\n"); hypre_printf(" -ruge3c : third pass on boundary, keep c-points\n"); hypre_printf(" -falgout : local Ruge_Stueben followed by CLJP\n"); hypre_printf(" -gm : use global measures\n"); hypre_printf("\n"); hypre_printf(" -interptype : set interpolation type\n"); hypre_printf(" 0=Classical modified interpolation (default) \n"); hypre_printf(" 1=least squares interpolation (for GSMG only) \n"); hypre_printf(" 0=Classical modified interpolation for hyperbolic PDEs \n"); hypre_printf(" 3=direct interpolation with separation of weights \n"); hypre_printf(" 4=multipass interpolation \n"); hypre_printf(" 5=multipass interpolation with separation of weights \n"); hypre_printf(" 6=extended classical modified interpolation \n"); hypre_printf(" 7=extended (only if no common C neighbor) interpolation \n"); hypre_printf(" 8=standard interpolation \n"); hypre_printf(" 9=standard interpolation with separation of weights \n"); hypre_printf(" 12=FF interpolation \n"); hypre_printf(" 13=FF1 interpolation \n"); hypre_printf(" 16=use modified unknown interpolation for a system (w/unknown or hybrid approach) \n"); hypre_printf(" 17=use non-systems interp = 6 for a system (w/unknown or hybrid approach) \n"); hypre_printf(" 18=use non-systems interp = 8 for a system (w/unknown or hybrid approach) \n"); hypre_printf(" 19=use non-systems interp = 0 for a system (w/unknown or hybrid approach) \n"); hypre_printf(" 10=classical block interpolation for nodal systems AMG\n"); hypre_printf(" 11=classical block interpolation with diagonal blocks for nodal systems AMG\n"); hypre_printf(" 20=same as 10, but don't add weak connect. to diag \n"); hypre_printf(" 21=same as 11, but don't add weak connect. to diag \n"); hypre_printf(" 22=classical block interpolation w/Ruge's variant for nodal systems AMG \n"); hypre_printf(" 23=same as 22, but use row sums for diag scaling matrices,for nodal systems AMG \n"); hypre_printf(" 24=direct block interpolation for nodal systems AMG\n"); hypre_printf("\n"); hypre_printf(" -rlx : relaxation type\n"); hypre_printf(" 0=Weighted Jacobi \n"); hypre_printf(" 1=Gauss-Seidel (very slow!) \n"); hypre_printf(" 3=Hybrid Gauss-Seidel \n"); hypre_printf(" 4=Hybrid backward Gauss-Seidel \n"); hypre_printf(" 6=Hybrid symmetric Gauss-Seidel \n"); hypre_printf(" 8= symmetric L1-Gauss-Seidel \n"); hypre_printf(" 13= forward L1-Gauss-Seidel \n"); hypre_printf(" 14= backward L1-Gauss-Seidel \n"); hypre_printf(" 15=CG \n"); hypre_printf(" 16=Chebyshev \n"); hypre_printf(" 17=FCF-Jacobi \n"); hypre_printf(" 18=L1-Jacobi (may be used with -CF) \n"); hypre_printf(" 9=Gauss elimination (use for coarsest grid only) \n"); hypre_printf(" 99=Gauss elimination with pivoting (use for coarsest grid only) \n"); hypre_printf(" 20= Nodal Weighted Jacobi (for systems only) \n"); hypre_printf(" 23= Nodal Hybrid Jacobi/Gauss-Seidel (for systems only) \n"); hypre_printf(" 26= Nodal Hybrid Symmetric Gauss-Seidel (for systems only)\n"); hypre_printf(" 29= Nodal Gauss elimination (use for coarsest grid only) \n"); hypre_printf(" -rlx_coarse : set relaxation type for coarsest grid\n"); hypre_printf(" -rlx_down : set relaxation type for down cycle\n"); hypre_printf(" -rlx_up : set relaxation type for up cycle\n"); hypre_printf(" -cheby_order : set order (1-4) for Chebyshev poly. smoother (default is 2)\n"); hypre_printf(" -cheby_fraction : fraction of the spectrum for Chebyshev poly. smoother (default is .3)\n"); hypre_printf(" -nodal : nodal system type\n"); hypre_printf(" 0 = Unknown approach \n"); hypre_printf(" 1 = Frobenius norm \n"); hypre_printf(" 2 = Sum of Abs.value of elements \n"); hypre_printf(" 3 = Largest magnitude element (includes its sign) \n"); hypre_printf(" 4 = Inf. norm \n"); hypre_printf(" 5 = One norm (note: use with block version only) \n"); hypre_printf(" 6 = Sum of all elements in block \n"); hypre_printf(" -nodal_diag :how to treat diag elements\n"); hypre_printf(" 0 = no special treatment \n"); hypre_printf(" 1 = make diag = neg.sum of the off_diag \n"); hypre_printf(" 2 = make diag = neg. of diag \n"); hypre_printf(" -ns : Use sweeps on each level\n"); hypre_printf(" (default C/F down, F/C up, F/C fine\n"); hypre_printf(" -ns_coarse : set no. of sweeps for coarsest grid\n"); hypre_printf(" -ns_down : set no. of sweeps for down cycle\n"); hypre_printf(" -ns_up : set no. of sweeps for up cycle\n"); hypre_printf("\n"); hypre_printf(" -mu : set AMG cycles (1=V, 2=W, etc.)\n"); hypre_printf(" -th : set AMG threshold Theta = val \n"); hypre_printf(" -tr : set AMG interpolation truncation factor = val \n"); hypre_printf(" -Pmx : set maximal no. of elmts per row for AMG interpolation \n"); hypre_printf(" -jtr : set truncation threshold for Jacobi interpolation = val \n"); hypre_printf(" -Ssw : set S-commpkg-switch = val \n"); hypre_printf(" -mxrs : set AMG maximum row sum threshold for dependency weakening \n"); hypre_printf(" -nf : set number of functions for systems AMG\n"); hypre_printf(" -numsamp : set number of sample vectors for GSMG\n"); hypre_printf(" -postinterptype : invokes no. of Jacobi interpolation steps after main interpolation\n"); hypre_printf("\n"); hypre_printf(" -cgcitr : set maximal number of coarsening iterations for CGC\n"); hypre_printf(" -solver_type : sets solver within Hybrid solver\n"); hypre_printf(" : 1 PCG (default)\n"); hypre_printf(" : 2 GMRES\n"); hypre_printf(" : 3 BiCGSTAB\n"); hypre_printf(" -w : set Jacobi relax weight = val\n"); hypre_printf(" -k : dimension Krylov space for GMRES\n"); hypre_printf(" -aug : number of augmentation vectors for LGMRES (-k indicates total approx space size)\n"); hypre_printf(" -mxl : maximum number of levels (AMG, ParaSAILS)\n"); hypre_printf(" -tol : set solver convergence tolerance = val\n"); hypre_printf(" -atol : set solver absolute convergence tolerance = val\n"); hypre_printf(" -max_iter : set max iterations\n"); hypre_printf(" -mg_max_iter : set max iterations for mg solvers\n"); hypre_printf(" -agg_nl : set number of aggressive coarsening levels (default:0)\n"); hypre_printf(" -np : set number of paths of length 2 for aggr. coarsening\n"); hypre_printf("\n"); hypre_printf(" -sai_th : set ParaSAILS threshold = val \n"); hypre_printf(" -sai_filt : set ParaSAILS filter = val \n"); hypre_printf("\n"); hypre_printf(" -level : set k in ILU(k) for Euclid \n"); hypre_printf(" -bj : enable block Jacobi ILU for Euclid \n"); hypre_printf(" -ilut : set drop tolerance for ILUT in Euclid\n"); hypre_printf(" Note ILUT is sequential only!\n"); hypre_printf(" -sparseA : set drop tolerance in ILU(k) for Euclid \n"); hypre_printf(" -rowScale : enable row scaling in Euclid \n"); hypre_printf("\n"); hypre_printf(" -drop_tol : set threshold for dropping in PILUT\n"); hypre_printf(" -nonzeros_to_keep : number of nonzeros in each row to keep\n"); hypre_printf("\n"); hypre_printf(" -iout : set output flag\n"); hypre_printf(" 0=no output 1=matrix stats\n"); hypre_printf(" 2=cycle stats 3=matrix & cycle stats\n"); hypre_printf("\n"); hypre_printf(" -dbg : set debug flag\n"); hypre_printf(" 0=no debugging\n 1=internal timing\n 2=interpolation truncation\n 3=more detailed timing in coarsening routine\n"); hypre_printf("\n"); hypre_printf(" -print : print out the system\n"); hypre_printf("\n"); hypre_printf(" -plot_grids : print out information for plotting the grids\n"); hypre_printf(" -plot_file_name : file name for plotting output\n"); hypre_printf("\n"); hypre_printf(" -smtype :smooth type\n"); hypre_printf(" -smlv :smooth num levels\n"); hypre_printf(" -ov :over lap:\n"); hypre_printf(" -dom :domain type\n"); hypre_printf(" -use_ns : use non-symm schwarz smoother\n"); hypre_printf(" -var : schwarz smoother variant (0-3) \n"); hypre_printf(" -blk_sm : same as '-smtype 6 -ov 0 -dom 1 -smlv '\n"); hypre_printf(" -nongalerk_tol : specify the NonGalerkin drop tolerance\n"); hypre_printf(" and list contains the values, where last value\n"); hypre_printf(" in list is repeated if val < num_levels in AMG\n"); exit(1); } /*----------------------------------------------------------- * Print driver parameters *-----------------------------------------------------------*/ if (myid == 0) { hypre_printf("Running with these driver parameters:\n"); hypre_printf(" solver ID = %d\n\n", solver_id); } /*----------------------------------------------------------- * Set up matrix *-----------------------------------------------------------*/ if ( myid == 0 && dt != dt_inf) { hypre_printf(" Backward Euler time step with dt = %e\n", dt); hypre_printf(" Dirichlet 0 BCs are implicit in the spatial operator\n"); } time_index = hypre_InitializeTiming("Spatial Operator"); hypre_BeginTiming(time_index); if ( build_matrix_type == -1 ) { ierr = HYPRE_IJMatrixRead( argv[build_matrix_arg_index], comm, HYPRE_PARCSR, &ij_A ); if (ierr) { hypre_printf("ERROR: Problem reading in the system matrix!\n"); exit(1); } } else if ( build_matrix_type == 0 ) { BuildParFromFile(argc, argv, build_matrix_arg_index, &parcsr_A); } else if ( build_matrix_type == 1 ) { BuildParFromOneFile(argc, argv, build_matrix_arg_index, num_functions, &parcsr_A); } else if ( build_matrix_type == 2 ) { BuildParLaplacian(argc, argv, build_matrix_arg_index, &parcsr_A); } else if ( build_matrix_type == 3 ) { BuildParLaplacian9pt(argc, argv, build_matrix_arg_index, &parcsr_A); } else if ( build_matrix_type == 4 ) { BuildParLaplacian27pt(argc, argv, build_matrix_arg_index, &parcsr_A); } else if ( build_matrix_type == 5 ) { BuildParDifConv(argc, argv, build_matrix_arg_index, &parcsr_A); } else if ( build_matrix_type == 6 ) { BuildParVarDifConv(argc, argv, build_matrix_arg_index, &parcsr_A, &b); /*HYPRE_ParCSRMatrixPrint(parcsr_A,"mat100");*/ } else if ( build_matrix_type == 7 ) { BuildParRotate7pt(argc, argv, build_matrix_arg_index, &parcsr_A); } else { hypre_printf("You have asked for an unsupported problem with\n"); hypre_printf("build_matrix_type = %d.\n", build_matrix_type); return (-1); } /* BM Oct 23, 2006 */ if (plot_grids) { if (build_matrix_type > 1 && build_matrix_type < 8) BuildParCoordinates (argc, argv, build_matrix_arg_index, &coord_dim, &coordinates); else { hypre_printf("Warning: coordinates are not yet printed for build_matrix_type = %d.\n", build_matrix_type); } } if (build_matrix_type < 0) { ierr = HYPRE_IJMatrixGetLocalRange( ij_A, &first_local_row, &last_local_row, &first_local_col, &last_local_col ); local_num_rows = last_local_row - first_local_row + 1; local_num_cols = last_local_col - first_local_col + 1; ierr += HYPRE_IJMatrixGetObject( ij_A, &object); parcsr_A = (HYPRE_ParCSRMatrix) object; } else { /*----------------------------------------------------------- * Copy the parcsr matrix into the IJMatrix through interface calls *-----------------------------------------------------------*/ ierr = HYPRE_ParCSRMatrixGetLocalRange( parcsr_A, &first_local_row, &last_local_row, &first_local_col, &last_local_col ); local_num_rows = last_local_row - first_local_row + 1; local_num_cols = last_local_col - first_local_col + 1; } hypre_EndTiming(time_index); hypre_PrintTiming("Generate Matrix", hypre_MPI_COMM_WORLD); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); /* Check the ij interface - not necessary if one just wants to test solvers */ if (test_ij && build_matrix_type > -1) { HYPRE_Int mx_size = 5; time_index = hypre_InitializeTiming("Generate IJ matrix"); hypre_BeginTiming(time_index); ierr += HYPRE_ParCSRMatrixGetDims( parcsr_A, &M, &N ); ierr += HYPRE_IJMatrixCreate( comm, first_local_row, last_local_row, first_local_col, last_local_col, &ij_A ); ierr += HYPRE_IJMatrixSetObjectType( ij_A, HYPRE_PARCSR ); num_rows = local_num_rows; if (off_proc) { if (myid != num_procs - 1) { num_rows++; } if (myid) { num_rows++; } } /* The following shows how to build an IJMatrix if one has only an estimate for the row sizes */ row_nums = hypre_CTAlloc(HYPRE_Int, num_rows, HYPRE_MEMORY_HOST); num_cols = hypre_CTAlloc(HYPRE_Int, num_rows, HYPRE_MEMORY_HOST); if (sparsity_known == 1) { diag_sizes = hypre_CTAlloc(HYPRE_Int, local_num_rows, HYPRE_MEMORY_HOST); offdiag_sizes = hypre_CTAlloc(HYPRE_Int, local_num_rows, HYPRE_MEMORY_HOST); } else { size = 5; if (sparsity_known == 0) { if (build_matrix_type == 2) { size = 7; } if (build_matrix_type == 3) { size = 9; } if (build_matrix_type == 4) { size = 27; } } row_sizes = hypre_CTAlloc(HYPRE_Int, num_rows, HYPRE_MEMORY_HOST); for (i = 0; i < num_rows; i++) { row_sizes[i] = size; } } local_row = 0; if (build_matrix_type == 2) { mx_size = 7; } if (build_matrix_type == 3) { mx_size = 9; } if (build_matrix_type == 4) { mx_size = 27; } col_nums = hypre_CTAlloc(HYPRE_Int, mx_size * num_rows, HYPRE_MEMORY_HOST); data = hypre_CTAlloc(HYPRE_Real, mx_size * num_rows, HYPRE_MEMORY_HOST); i_indx = 0; j_indx = 0; if (off_proc && myid) { num_cols[i_indx] = 2; row_nums[i_indx++] = first_local_row - 1; col_nums[j_indx] = first_local_row - 1; data[j_indx++] = 6.; col_nums[j_indx] = first_local_row - 2; data[j_indx++] = -1; } for (i = 0; i < local_num_rows; i++) { row_nums[i_indx] = first_local_row + i; ierr += HYPRE_ParCSRMatrixGetRow( parcsr_A, first_local_row + i, &size, &col_inds, &values); num_cols[i_indx++] = size; for (j = 0; j < size; j++) { col_nums[j_indx] = col_inds[j]; data[j_indx++] = values[j]; if (sparsity_known == 1) { if (col_inds[j] < first_local_row || col_inds[j] > last_local_row) { offdiag_sizes[local_row]++; } else { diag_sizes[local_row]++; } } } local_row++; ierr += HYPRE_ParCSRMatrixRestoreRow( parcsr_A, first_local_row + i, &size, &col_inds, &values ); } if (off_proc && myid != num_procs - 1) { num_cols[i_indx] = 2; row_nums[i_indx++] = last_local_row + 1; col_nums[j_indx] = last_local_row + 2; data[j_indx++] = -1.; col_nums[j_indx] = last_local_row + 1; data[j_indx++] = 6; } /*ierr += HYPRE_IJMatrixSetRowSizes ( ij_A, (const HYPRE_Int *) num_cols );*/ if (sparsity_known == 1) ierr += HYPRE_IJMatrixSetDiagOffdSizes( ij_A, (const HYPRE_Int *) diag_sizes, (const HYPRE_Int *) offdiag_sizes ); else { ierr = HYPRE_IJMatrixSetRowSizes ( ij_A, (const HYPRE_Int *) row_sizes ); } ierr += HYPRE_IJMatrixInitialize( ij_A ); if (omp_flag) { HYPRE_IJMatrixSetOMPFlag(ij_A, 1); } if (chunk) { if (add) ierr += HYPRE_IJMatrixAddToValues(ij_A, num_rows, num_cols, row_nums, (const HYPRE_Int *) col_nums, (const HYPRE_Real *) data); else ierr += HYPRE_IJMatrixSetValues(ij_A, num_rows, num_cols, row_nums, (const HYPRE_Int *) col_nums, (const HYPRE_Real *) data); } else { j_indx = 0; for (i = 0; i < num_rows; i++) { if (add) ierr += HYPRE_IJMatrixAddToValues( ij_A, 1, &num_cols[i], &row_nums[i], (const HYPRE_Int *) &col_nums[j_indx], (const HYPRE_Real *) &data[j_indx] ); else ierr += HYPRE_IJMatrixSetValues( ij_A, 1, &num_cols[i], &row_nums[i], (const HYPRE_Int *) &col_nums[j_indx], (const HYPRE_Real *) &data[j_indx] ); j_indx += num_cols[i]; } } hypre_TFree(col_nums, HYPRE_MEMORY_HOST); hypre_TFree(data, HYPRE_MEMORY_HOST); hypre_TFree(row_nums, HYPRE_MEMORY_HOST); hypre_TFree(num_cols, HYPRE_MEMORY_HOST); if (sparsity_known == 1) { hypre_TFree(diag_sizes, HYPRE_MEMORY_HOST); hypre_TFree(offdiag_sizes, HYPRE_MEMORY_HOST); } else { hypre_TFree(row_sizes, HYPRE_MEMORY_HOST); } ierr += HYPRE_IJMatrixAssemble( ij_A ); hypre_EndTiming(time_index); hypre_PrintTiming("IJ Matrix Setup", hypre_MPI_COMM_WORLD); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); if (ierr) { hypre_printf("Error in driver building IJMatrix from parcsr matrix. \n"); return (-1); } /* This is to emphasize that one can IJMatrixAddToValues after an IJMatrixRead or an IJMatrixAssemble. After an IJMatrixRead, assembly is unnecessary if the sparsity pattern of the matrix is not changed somehow. If one has not used IJMatrixRead, one has the opportunity to IJMatrixAddTo before a IJMatrixAssemble. */ ncols = hypre_CTAlloc(HYPRE_Int, last_local_row - first_local_row + 1, HYPRE_MEMORY_HOST); rows = hypre_CTAlloc(HYPRE_Int, last_local_row - first_local_row + 1, HYPRE_MEMORY_HOST); col_inds = hypre_CTAlloc(HYPRE_Int, last_local_row - first_local_row + 1, HYPRE_MEMORY_HOST); values = hypre_CTAlloc(HYPRE_Real, last_local_row - first_local_row + 1, HYPRE_MEMORY_HOST); if (dt < dt_inf) { val = 1. / dt; } else { val = 0.; /* Use zero to avoid unintentional loss of significance */ } for (i = first_local_row; i <= last_local_row; i++) { j = i - first_local_row; rows[j] = i; ncols[j] = 1; col_inds[j] = i; values[j] = val; } ierr += HYPRE_IJMatrixAddToValues( ij_A, local_num_rows, ncols, rows, (const HYPRE_Int *) col_inds, (const HYPRE_Real *) values ); hypre_TFree(values, HYPRE_MEMORY_HOST); hypre_TFree(col_inds, HYPRE_MEMORY_HOST); hypre_TFree(rows, HYPRE_MEMORY_HOST); hypre_TFree(ncols, HYPRE_MEMORY_HOST); /* If sparsity pattern is not changed since last IJMatrixAssemble call, this should be a no-op */ ierr += HYPRE_IJMatrixAssemble( ij_A ); /*----------------------------------------------------------- * Fetch the resulting underlying matrix out *-----------------------------------------------------------*/ if (build_matrix_type > -1) { ierr += HYPRE_ParCSRMatrixDestroy(parcsr_A); } ierr += HYPRE_IJMatrixGetObject( ij_A, &object); parcsr_A = (HYPRE_ParCSRMatrix) object; } /*----------------------------------------------------------- * Set up the interp vector *-----------------------------------------------------------*/ if ( build_rbm) { char new_file_name[80]; /* RHS */ interp_vecs = hypre_CTAlloc(HYPRE_ParVector, num_interp_vecs, HYPRE_MEMORY_HOST); ij_rbm = hypre_CTAlloc(HYPRE_IJVector, num_interp_vecs, HYPRE_MEMORY_HOST); for (i = 0; i < num_interp_vecs; i++) { hypre_sprintf(new_file_name, "%s.%d", argv[build_rbm_index], i); ierr = HYPRE_IJVectorRead( new_file_name, hypre_MPI_COMM_WORLD, HYPRE_PARCSR, &ij_rbm[i] ); ierr = HYPRE_IJVectorGetObject( ij_rbm[i], &object ); interp_vecs[i] = (HYPRE_ParVector) object; } if (ierr) { hypre_printf("ERROR: Problem reading in rbm!\n"); exit(1); } } /*----------------------------------------------------------- * Set up the RHS and initial guess *-----------------------------------------------------------*/ time_index = hypre_InitializeTiming("RHS and Initial Guess"); hypre_BeginTiming(time_index); if ( build_rhs_type == 0 ) { if (myid == 0) { hypre_printf(" RHS vector read from file %s\n", argv[build_rhs_arg_index]); hypre_printf(" Initial guess is 0\n"); } /* RHS */ ierr = HYPRE_IJVectorRead( argv[build_rhs_arg_index], hypre_MPI_COMM_WORLD, HYPRE_PARCSR, &ij_b ); if (ierr) { hypre_printf("ERROR: Problem reading in the right-hand-side!\n"); exit(1); } ierr = HYPRE_IJVectorGetObject( ij_b, &object ); b = (HYPRE_ParVector) object; /* Initial guess */ HYPRE_IJVectorCreate(hypre_MPI_COMM_WORLD, first_local_col, last_local_col, &ij_x); HYPRE_IJVectorSetObjectType(ij_x, HYPRE_PARCSR); HYPRE_IJVectorInitialize(ij_x); values = hypre_CTAlloc(HYPRE_Real, local_num_cols, HYPRE_MEMORY_HOST); for (i = 0; i < local_num_cols; i++) { values[i] = 0.; } HYPRE_IJVectorSetValues(ij_x, local_num_cols, NULL, values); hypre_TFree(values, HYPRE_MEMORY_HOST); ierr = HYPRE_IJVectorGetObject( ij_x, &object ); x = (HYPRE_ParVector) object; } else if ( build_rhs_type == 1 ) { #if 0 hypre_printf("build_rhs_type == 1 not currently implemented\n"); return (-1); #else /* RHS - this has not been tested for multiple processors*/ BuildRhsParFromOneFile(argc, argv, build_rhs_arg_index, NULL, &b); hypre_printf(" Initial guess is 0\n"); ij_b = NULL; /* initial guess */ HYPRE_IJVectorCreate(hypre_MPI_COMM_WORLD, first_local_col, last_local_col, &ij_x); HYPRE_IJVectorSetObjectType(ij_x, HYPRE_PARCSR); HYPRE_IJVectorInitialize(ij_x); values = hypre_CTAlloc(HYPRE_Real, local_num_cols, HYPRE_MEMORY_HOST); for (i = 0; i < local_num_cols; i++) { values[i] = 0.; } HYPRE_IJVectorSetValues(ij_x, local_num_cols, NULL, values); hypre_TFree(values, HYPRE_MEMORY_HOST); ierr = HYPRE_IJVectorGetObject( ij_x, &object ); x = (HYPRE_ParVector) object; #endif } else if ( build_rhs_type == 7 ) { /* rhs */ BuildParRhsFromFile(argc, argv, build_rhs_arg_index, &b); hypre_printf(" Initial guess is 0\n"); ij_b = NULL; /* initial guess */ HYPRE_IJVectorCreate(hypre_MPI_COMM_WORLD, first_local_col, last_local_col, &ij_x); HYPRE_IJVectorSetObjectType(ij_x, HYPRE_PARCSR); HYPRE_IJVectorInitialize(ij_x); values = hypre_CTAlloc(HYPRE_Real, local_num_cols, HYPRE_MEMORY_HOST); for (i = 0; i < local_num_cols; i++) { values[i] = 0.; } HYPRE_IJVectorSetValues(ij_x, local_num_cols, NULL, values); hypre_TFree(values, HYPRE_MEMORY_HOST); ierr = HYPRE_IJVectorGetObject( ij_x, &object ); x = (HYPRE_ParVector) object; } else if ( build_rhs_type == 2 ) { if (myid == 0) { hypre_printf(" RHS vector has unit components\n"); hypre_printf(" Initial guess is 0\n"); } /* RHS */ HYPRE_IJVectorCreate(hypre_MPI_COMM_WORLD, first_local_row, last_local_row, &ij_b); HYPRE_IJVectorSetObjectType(ij_b, HYPRE_PARCSR); HYPRE_IJVectorInitialize(ij_b); values = hypre_CTAlloc(HYPRE_Real, local_num_rows, HYPRE_MEMORY_HOST); for (i = 0; i < local_num_rows; i++) { values[i] = 1.0; } HYPRE_IJVectorSetValues(ij_b, local_num_rows, NULL, values); hypre_TFree(values, HYPRE_MEMORY_HOST); ierr = HYPRE_IJVectorGetObject( ij_b, &object ); b = (HYPRE_ParVector) object; /* Initial guess */ HYPRE_IJVectorCreate(hypre_MPI_COMM_WORLD, first_local_col, last_local_col, &ij_x); HYPRE_IJVectorSetObjectType(ij_x, HYPRE_PARCSR); HYPRE_IJVectorInitialize(ij_x); values = hypre_CTAlloc(HYPRE_Real, local_num_cols, HYPRE_MEMORY_HOST); for (i = 0; i < local_num_cols; i++) { values[i] = 0.; } HYPRE_IJVectorSetValues(ij_x, local_num_cols, NULL, values); hypre_TFree(values, HYPRE_MEMORY_HOST); ierr = HYPRE_IJVectorGetObject( ij_x, &object ); x = (HYPRE_ParVector) object; } else if ( build_rhs_type == 3 ) { if (myid == 0) { hypre_printf(" RHS vector has random components and unit 2-norm\n"); hypre_printf(" Initial guess is 0\n"); } /* RHS */ HYPRE_IJVectorCreate(hypre_MPI_COMM_WORLD, first_local_row, last_local_row, &ij_b); HYPRE_IJVectorSetObjectType(ij_b, HYPRE_PARCSR); HYPRE_IJVectorInitialize(ij_b); ierr = HYPRE_IJVectorGetObject( ij_b, &object ); b = (HYPRE_ParVector) object; /* For purposes of this test, HYPRE_ParVector functions are used, but these are not necessary. For a clean use of the interface, the user "should" modify components of ij_x by using functions HYPRE_IJVectorSetValues or HYPRE_IJVectorAddToValues */ HYPRE_ParVectorSetRandomValues(b, 22775); HYPRE_ParVectorInnerProd(b, b, &norm); norm = 1. / hypre_sqrt(norm); ierr = HYPRE_ParVectorScale(norm, b); /* Initial guess */ HYPRE_IJVectorCreate(hypre_MPI_COMM_WORLD, first_local_col, last_local_col, &ij_x); HYPRE_IJVectorSetObjectType(ij_x, HYPRE_PARCSR); HYPRE_IJVectorInitialize(ij_x); values = hypre_CTAlloc(HYPRE_Real, local_num_cols, HYPRE_MEMORY_HOST); for (i = 0; i < local_num_cols; i++) { values[i] = 0.; } HYPRE_IJVectorSetValues(ij_x, local_num_cols, NULL, values); hypre_TFree(values, HYPRE_MEMORY_HOST); ierr = HYPRE_IJVectorGetObject( ij_x, &object ); x = (HYPRE_ParVector) object; } else if ( build_rhs_type == 4 ) { if (myid == 0) { hypre_printf(" RHS vector set for solution with unit components\n"); hypre_printf(" Initial guess is 0\n"); } /* Temporary use of solution vector */ HYPRE_IJVectorCreate(hypre_MPI_COMM_WORLD, first_local_col, last_local_col, &ij_x); HYPRE_IJVectorSetObjectType(ij_x, HYPRE_PARCSR); HYPRE_IJVectorInitialize(ij_x); values = hypre_CTAlloc(HYPRE_Real, local_num_cols, HYPRE_MEMORY_HOST); for (i = 0; i < local_num_cols; i++) { values[i] = 1.; } HYPRE_IJVectorSetValues(ij_x, local_num_cols, NULL, values); hypre_TFree(values, HYPRE_MEMORY_HOST); ierr = HYPRE_IJVectorGetObject( ij_x, &object ); x = (HYPRE_ParVector) object; /* RHS */ HYPRE_IJVectorCreate(hypre_MPI_COMM_WORLD, first_local_row, last_local_row, &ij_b); HYPRE_IJVectorSetObjectType(ij_b, HYPRE_PARCSR); HYPRE_IJVectorInitialize(ij_b); ierr = HYPRE_IJVectorGetObject( ij_b, &object ); b = (HYPRE_ParVector) object; HYPRE_ParCSRMatrixMatvec(1., parcsr_A, x, 0., b); /* Initial guess */ values = hypre_CTAlloc(HYPRE_Real, local_num_cols, HYPRE_MEMORY_HOST); for (i = 0; i < local_num_cols; i++) { values[i] = 0.; } HYPRE_IJVectorSetValues(ij_x, local_num_cols, NULL, values); hypre_TFree(values, HYPRE_MEMORY_HOST); } else if ( build_rhs_type == 5 ) { if (myid == 0) { hypre_printf(" RHS vector is 0\n"); hypre_printf(" Initial guess has unit components\n"); } /* RHS */ HYPRE_IJVectorCreate(hypre_MPI_COMM_WORLD, first_local_row, last_local_row, &ij_b); HYPRE_IJVectorSetObjectType(ij_b, HYPRE_PARCSR); HYPRE_IJVectorInitialize(ij_b); values = hypre_CTAlloc(HYPRE_Real, local_num_rows, HYPRE_MEMORY_HOST); for (i = 0; i < local_num_rows; i++) { values[i] = 0.; } HYPRE_IJVectorSetValues(ij_b, local_num_rows, NULL, values); hypre_TFree(values, HYPRE_MEMORY_HOST); ierr = HYPRE_IJVectorGetObject( ij_b, &object ); b = (HYPRE_ParVector) object; /* Initial guess */ HYPRE_IJVectorCreate(hypre_MPI_COMM_WORLD, first_local_col, last_local_col, &ij_x); HYPRE_IJVectorSetObjectType(ij_x, HYPRE_PARCSR); HYPRE_IJVectorInitialize(ij_x); values = hypre_CTAlloc(HYPRE_Real, local_num_cols, HYPRE_MEMORY_HOST); for (i = 0; i < local_num_cols; i++) { values[i] = 1.; } HYPRE_IJVectorSetValues(ij_x, local_num_cols, NULL, values); hypre_TFree(values, HYPRE_MEMORY_HOST); ierr = HYPRE_IJVectorGetObject( ij_x, &object ); x = (HYPRE_ParVector) object; } if ( build_src_type == 0 ) { #if 0 /* RHS */ BuildRhsParFromFile(argc, argv, build_src_arg_index, &b); #endif if (myid == 0) { hypre_printf(" Source vector read from file %s\n", argv[build_src_arg_index]); hypre_printf(" Initial unknown vector in evolution is 0\n"); } ierr = HYPRE_IJVectorRead( argv[build_src_arg_index], hypre_MPI_COMM_WORLD, HYPRE_PARCSR, &ij_b ); if (ierr) { hypre_printf("ERROR: Problem reading in the right-hand-side!\n"); exit(1); } ierr = HYPRE_IJVectorGetObject( ij_b, &object ); b = (HYPRE_ParVector) object; /* Initial unknown vector */ HYPRE_IJVectorCreate(hypre_MPI_COMM_WORLD, first_local_col, last_local_col, &ij_x); HYPRE_IJVectorSetObjectType(ij_x, HYPRE_PARCSR); HYPRE_IJVectorInitialize(ij_x); values = hypre_CTAlloc(HYPRE_Real, local_num_cols, HYPRE_MEMORY_HOST); for (i = 0; i < local_num_cols; i++) { values[i] = 0.; } HYPRE_IJVectorSetValues(ij_x, local_num_cols, NULL, values); hypre_TFree(values, HYPRE_MEMORY_HOST); ierr = HYPRE_IJVectorGetObject( ij_x, &object ); x = (HYPRE_ParVector) object; } else if ( build_src_type == 1 ) { hypre_printf("build_src_type == 1 not currently implemented\n"); return (-1); #if 0 BuildRhsParFromOneFile(argc, argv, build_src_arg_index, part_b, &b); #endif } else if ( build_src_type == 2 ) { if (myid == 0) { hypre_printf(" Source vector has unit components\n"); hypre_printf(" Initial unknown vector is 0\n"); } /* RHS */ HYPRE_IJVectorCreate(hypre_MPI_COMM_WORLD, first_local_row, last_local_row, &ij_b); HYPRE_IJVectorSetObjectType(ij_b, HYPRE_PARCSR); HYPRE_IJVectorInitialize(ij_b); values = hypre_CTAlloc(HYPRE_Real, local_num_rows, HYPRE_MEMORY_HOST); for (i = 0; i < local_num_rows; i++) { values[i] = 1.; } HYPRE_IJVectorSetValues(ij_b, local_num_rows, NULL, values); hypre_TFree(values, HYPRE_MEMORY_HOST); ierr = HYPRE_IJVectorGetObject( ij_b, &object ); b = (HYPRE_ParVector) object; /* Initial guess */ HYPRE_IJVectorCreate(hypre_MPI_COMM_WORLD, first_local_col, last_local_col, &ij_x); HYPRE_IJVectorSetObjectType(ij_x, HYPRE_PARCSR); HYPRE_IJVectorInitialize(ij_x); /* For backward Euler the previous backward Euler iterate (assumed 0 here) is usually used as the initial guess */ values = hypre_CTAlloc(HYPRE_Real, local_num_cols, HYPRE_MEMORY_HOST); for (i = 0; i < local_num_cols; i++) { values[i] = 0.; } HYPRE_IJVectorSetValues(ij_x, local_num_cols, NULL, values); hypre_TFree(values, HYPRE_MEMORY_HOST); ierr = HYPRE_IJVectorGetObject( ij_x, &object ); x = (HYPRE_ParVector) object; } else if ( build_src_type == 3 ) { if (myid == 0) { hypre_printf(" Source vector has random components in range 0 - 1\n"); hypre_printf(" Initial unknown vector is 0\n"); } /* RHS */ HYPRE_IJVectorCreate(hypre_MPI_COMM_WORLD, first_local_row, last_local_row, &ij_b); HYPRE_IJVectorSetObjectType(ij_b, HYPRE_PARCSR); HYPRE_IJVectorInitialize(ij_b); values = hypre_CTAlloc(HYPRE_Real, local_num_rows, HYPRE_MEMORY_HOST); hypre_SeedRand(myid); for (i = 0; i < local_num_rows; i++) { values[i] = hypre_Rand(); } HYPRE_IJVectorSetValues(ij_b, local_num_rows, NULL, values); hypre_TFree(values, HYPRE_MEMORY_HOST); ierr = HYPRE_IJVectorGetObject( ij_b, &object ); b = (HYPRE_ParVector) object; /* Initial guess */ HYPRE_IJVectorCreate(hypre_MPI_COMM_WORLD, first_local_col, last_local_col, &ij_x); HYPRE_IJVectorSetObjectType(ij_x, HYPRE_PARCSR); HYPRE_IJVectorInitialize(ij_x); /* For backward Euler the previous backward Euler iterate (assumed 0 here) is usually used as the initial guess */ values = hypre_CTAlloc(HYPRE_Real, local_num_cols, HYPRE_MEMORY_HOST); for (i = 0; i < local_num_cols; i++) { values[i] = 0.; } HYPRE_IJVectorSetValues(ij_x, local_num_cols, NULL, values); hypre_TFree(values, HYPRE_MEMORY_HOST); ierr = HYPRE_IJVectorGetObject( ij_x, &object ); x = (HYPRE_ParVector) object; } else if ( build_src_type == 4 ) { if (myid == 0) { hypre_printf(" Source vector is 0 \n"); hypre_printf(" Initial unknown vector has random components in range 0 - 1\n"); } /* RHS */ HYPRE_IJVectorCreate(hypre_MPI_COMM_WORLD, first_local_row, last_local_row, &ij_b); HYPRE_IJVectorSetObjectType(ij_b, HYPRE_PARCSR); HYPRE_IJVectorInitialize(ij_b); values = hypre_CTAlloc(HYPRE_Real, local_num_rows, HYPRE_MEMORY_HOST); hypre_SeedRand(myid); for (i = 0; i < local_num_rows; i++) { values[i] = hypre_Rand() / dt; } HYPRE_IJVectorSetValues(ij_b, local_num_rows, NULL, values); hypre_TFree(values, HYPRE_MEMORY_HOST); ierr = HYPRE_IJVectorGetObject( ij_b, &object ); b = (HYPRE_ParVector) object; /* Initial guess */ HYPRE_IJVectorCreate(hypre_MPI_COMM_WORLD, first_local_col, last_local_col, &ij_x); HYPRE_IJVectorSetObjectType(ij_x, HYPRE_PARCSR); HYPRE_IJVectorInitialize(ij_x); /* For backward Euler the previous backward Euler iterate (assumed random in 0 - 1 here) is usually used as the initial guess */ values = hypre_CTAlloc(HYPRE_Real, local_num_cols, HYPRE_MEMORY_HOST); hypre_SeedRand(myid); for (i = 0; i < local_num_cols; i++) { values[i] = hypre_Rand(); } HYPRE_IJVectorSetValues(ij_x, local_num_cols, NULL, values); hypre_TFree(values, HYPRE_MEMORY_HOST); ierr = HYPRE_IJVectorGetObject( ij_x, &object ); x = (HYPRE_ParVector) object; } hypre_EndTiming(time_index); hypre_PrintTiming("IJ Vector Setup", hypre_MPI_COMM_WORLD); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); if (num_functions > 1) { dof_func = NULL; if (build_funcs_type == 1) { BuildFuncsFromOneFile(argc, argv, build_funcs_arg_index, parcsr_A, &dof_func); } else if (build_funcs_type == 2) { BuildFuncsFromFiles(argc, argv, build_funcs_arg_index, parcsr_A, &dof_func); } else { if (myid == 0) { hypre_printf (" Number of functions = %d \n", num_functions); } } } /*----------------------------------------------------------- * Print out the system and initial guess *-----------------------------------------------------------*/ if (print_system) { HYPRE_IJMatrixPrint(ij_A, "IJ.out.A"); HYPRE_IJVectorPrint(ij_b, "IJ.out.b"); HYPRE_IJVectorPrint(ij_x, "IJ.out.x0"); /* HYPRE_ParCSRMatrixPrint( parcsr_A, "new_mat.A" );*/ } /*----------------------------------------------------------- * Solve the system using the hybrid solver *-----------------------------------------------------------*/ if (solver_id == 20) { if (myid == 0) { hypre_printf("Solver: AMG\n"); } time_index = hypre_InitializeTiming("AMG_hybrid Setup"); hypre_BeginTiming(time_index); HYPRE_ParCSRHybridCreate(&amg_solver); HYPRE_ParCSRHybridSetTol(amg_solver, tol); HYPRE_ParCSRHybridSetAbsoluteTol(amg_solver, atol); HYPRE_ParCSRHybridSetConvergenceTol(amg_solver, cf_tol); HYPRE_ParCSRHybridSetSolverType(amg_solver, solver_type); HYPRE_ParCSRHybridSetLogging(amg_solver, ioutdat); HYPRE_ParCSRHybridSetPrintLevel(amg_solver, poutdat); HYPRE_ParCSRHybridSetDSCGMaxIter(amg_solver, max_iter); HYPRE_ParCSRHybridSetPCGMaxIter(amg_solver, mg_max_iter); HYPRE_ParCSRHybridSetCoarsenType(amg_solver, coarsen_type); HYPRE_ParCSRHybridSetStrongThreshold(amg_solver, strong_threshold); HYPRE_ParCSRHybridSetTruncFactor(amg_solver, trunc_factor); HYPRE_ParCSRHybridSetPMaxElmts(amg_solver, P_max_elmts); HYPRE_ParCSRHybridSetMaxLevels(amg_solver, max_levels); HYPRE_ParCSRHybridSetMaxRowSum(amg_solver, max_row_sum); HYPRE_ParCSRHybridSetNumSweeps(amg_solver, num_sweeps); HYPRE_ParCSRHybridSetRelaxType(amg_solver, relax_type); HYPRE_ParCSRHybridSetAggNumLevels(amg_solver, agg_num_levels); HYPRE_ParCSRHybridSetNumPaths(amg_solver, num_paths); HYPRE_ParCSRHybridSetNumFunctions(amg_solver, num_functions); HYPRE_ParCSRHybridSetNodal(amg_solver, nodal); if (relax_down > -1) { HYPRE_ParCSRHybridSetCycleRelaxType(amg_solver, relax_down, 1); } if (relax_up > -1) { HYPRE_ParCSRHybridSetCycleRelaxType(amg_solver, relax_up, 2); } if (relax_coarse > -1) { HYPRE_ParCSRHybridSetCycleRelaxType(amg_solver, relax_coarse, 3); } HYPRE_ParCSRHybridSetRelaxOrder(amg_solver, relax_order); HYPRE_ParCSRHybridSetMaxCoarseSize(amg_solver, coarse_threshold); HYPRE_ParCSRHybridSetMinCoarseSize(amg_solver, min_coarse_size); HYPRE_ParCSRHybridSetSeqThreshold(amg_solver, seq_threshold); HYPRE_ParCSRHybridSetRelaxWt(amg_solver, relax_wt); HYPRE_ParCSRHybridSetOuterWt(amg_solver, outer_wt); if (level_w > -1) { HYPRE_ParCSRHybridSetLevelRelaxWt(amg_solver, relax_wt_level, level_w); } if (level_ow > -1) { HYPRE_ParCSRHybridSetLevelOuterWt(amg_solver, outer_wt_level, level_ow); } HYPRE_ParCSRHybridSetup(amg_solver, parcsr_A, b, x); hypre_EndTiming(time_index); hypre_PrintTiming("Setup phase times", hypre_MPI_COMM_WORLD); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); time_index = hypre_InitializeTiming("ParCSR Hybrid Solve"); hypre_BeginTiming(time_index); HYPRE_ParCSRHybridSolve(amg_solver, parcsr_A, b, x); hypre_EndTiming(time_index); hypre_PrintTiming("Solve phase times", hypre_MPI_COMM_WORLD); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); HYPRE_ParCSRHybridGetNumIterations(amg_solver, &num_iterations); HYPRE_ParCSRHybridGetPCGNumIterations(amg_solver, &pcg_num_its); HYPRE_ParCSRHybridGetDSCGNumIterations(amg_solver, &dscg_num_its); HYPRE_ParCSRHybridGetFinalRelativeResidualNorm(amg_solver, &final_res_norm); if (myid == 0) { hypre_printf("\n"); hypre_printf("Iterations = %d\n", num_iterations); hypre_printf("PCG_Iterations = %d\n", pcg_num_its); hypre_printf("DSCG_Iterations = %d\n", dscg_num_its); hypre_printf("Final Relative Residual Norm = %e\n", final_res_norm); hypre_printf("\n"); } HYPRE_ParCSRHybridDestroy(amg_solver); } /*----------------------------------------------------------- * Solve the system using AMG *-----------------------------------------------------------*/ if (solver_id == 0) { if (myid == 0) { hypre_printf("Solver: AMG\n"); } time_index = hypre_InitializeTiming("BoomerAMG Setup"); hypre_BeginTiming(time_index); HYPRE_BoomerAMGCreate(&amg_solver); /* BM Aug 25, 2006 */ HYPRE_BoomerAMGSetCGCIts(amg_solver, cgcits); HYPRE_BoomerAMGSetInterpType(amg_solver, interp_type); HYPRE_BoomerAMGSetPostInterpType(amg_solver, post_interp_type); HYPRE_BoomerAMGSetNumSamples(amg_solver, gsmg_samples); HYPRE_BoomerAMGSetCoarsenType(amg_solver, coarsen_type); HYPRE_BoomerAMGSetMeasureType(amg_solver, measure_type); HYPRE_BoomerAMGSetTol(amg_solver, tol); HYPRE_BoomerAMGSetStrongThreshold(amg_solver, strong_threshold); HYPRE_BoomerAMGSetSeqThreshold(amg_solver, seq_threshold); HYPRE_BoomerAMGSetRedundant(amg_solver, redundant); HYPRE_BoomerAMGSetMaxCoarseSize(amg_solver, coarse_threshold); HYPRE_BoomerAMGSetMinCoarseSize(amg_solver, min_coarse_size); HYPRE_BoomerAMGSetTruncFactor(amg_solver, trunc_factor); HYPRE_BoomerAMGSetPMaxElmts(amg_solver, P_max_elmts); HYPRE_BoomerAMGSetJacobiTruncThreshold(amg_solver, jacobi_trunc_threshold); HYPRE_BoomerAMGSetSCommPkgSwitch(amg_solver, S_commpkg_switch); /* note: log is written to standard output, not to file */ HYPRE_BoomerAMGSetPrintLevel(amg_solver, 3); HYPRE_BoomerAMGSetPrintFileName(amg_solver, "driver.out.log"); HYPRE_BoomerAMGSetCycleType(amg_solver, cycle_type); HYPRE_BoomerAMGSetNumSweeps(amg_solver, num_sweeps); HYPRE_BoomerAMGSetISType(amg_solver, IS_type); HYPRE_BoomerAMGSetNumCRRelaxSteps(amg_solver, num_CR_relax_steps); HYPRE_BoomerAMGSetCRRate(amg_solver, CR_rate); HYPRE_BoomerAMGSetCRStrongTh(amg_solver, CR_strong_th); HYPRE_BoomerAMGSetCRUseCG(amg_solver, CR_use_CG); HYPRE_BoomerAMGSetRelaxType(amg_solver, relax_type); if (relax_down > -1) { HYPRE_BoomerAMGSetCycleRelaxType(amg_solver, relax_down, 1); } if (relax_up > -1) { HYPRE_BoomerAMGSetCycleRelaxType(amg_solver, relax_up, 2); } if (relax_coarse > -1) { HYPRE_BoomerAMGSetCycleRelaxType(amg_solver, relax_coarse, 3); } HYPRE_BoomerAMGSetChebyOrder(amg_solver, cheby_order); HYPRE_BoomerAMGSetChebyFraction(amg_solver, cheby_fraction); HYPRE_BoomerAMGSetRelaxOrder(amg_solver, relax_order); HYPRE_BoomerAMGSetRelaxWt(amg_solver, relax_wt); HYPRE_BoomerAMGSetOuterWt(amg_solver, outer_wt); HYPRE_BoomerAMGSetMaxLevels(amg_solver, max_levels); if (level_w > -1) { HYPRE_BoomerAMGSetLevelRelaxWt(amg_solver, relax_wt_level, level_w); } if (level_ow > -1) { HYPRE_BoomerAMGSetLevelOuterWt(amg_solver, outer_wt_level, level_ow); } HYPRE_BoomerAMGSetSmoothType(amg_solver, smooth_type); HYPRE_BoomerAMGSetSmoothNumSweeps(amg_solver, smooth_num_sweeps); HYPRE_BoomerAMGSetSmoothNumLevels(amg_solver, smooth_num_levels); HYPRE_BoomerAMGSetMaxRowSum(amg_solver, max_row_sum); HYPRE_BoomerAMGSetDebugFlag(amg_solver, debug_flag); HYPRE_BoomerAMGSetVariant(amg_solver, variant); HYPRE_BoomerAMGSetOverlap(amg_solver, overlap); HYPRE_BoomerAMGSetDomainType(amg_solver, domain_type); HYPRE_BoomerAMGSetSchwarzUseNonSymm(amg_solver, use_nonsymm_schwarz); HYPRE_BoomerAMGSetSchwarzRlxWeight(amg_solver, schwarz_rlx_weight); if (eu_level < 0) { eu_level = 0; } HYPRE_BoomerAMGSetEuLevel(amg_solver, eu_level); HYPRE_BoomerAMGSetEuBJ(amg_solver, eu_bj); HYPRE_BoomerAMGSetEuSparseA(amg_solver, eu_sparse_A); HYPRE_BoomerAMGSetNumFunctions(amg_solver, num_functions); HYPRE_BoomerAMGSetAggNumLevels(amg_solver, agg_num_levels); HYPRE_BoomerAMGSetAggInterpType(amg_solver, agg_interp_type); HYPRE_BoomerAMGSetAggTruncFactor(amg_solver, agg_trunc_factor); HYPRE_BoomerAMGSetAggP12TruncFactor(amg_solver, agg_P12_trunc_factor); HYPRE_BoomerAMGSetAggPMaxElmts(amg_solver, agg_P_max_elmts); HYPRE_BoomerAMGSetAggP12MaxElmts(amg_solver, agg_P12_max_elmts); HYPRE_BoomerAMGSetNumPaths(amg_solver, num_paths); HYPRE_BoomerAMGSetNodal(amg_solver, nodal); HYPRE_BoomerAMGSetNodalDiag(amg_solver, nodal_diag); HYPRE_BoomerAMGSetCycleNumSweeps(amg_solver, ns_coarse, 3); if (num_functions > 1) { HYPRE_BoomerAMGSetDofFunc(amg_solver, dof_func); } HYPRE_BoomerAMGSetAdditive(amg_solver, additive); HYPRE_BoomerAMGSetMultAdditive(amg_solver, mult_add); HYPRE_BoomerAMGSetSimple(amg_solver, simple); HYPRE_BoomerAMGSetMultAddPMaxElmts(amg_solver, add_P_max_elmts); HYPRE_BoomerAMGSetMultAddTruncFactor(amg_solver, add_trunc_factor); HYPRE_BoomerAMGSetMaxIter(amg_solver, mg_max_iter); HYPRE_BoomerAMGSetRAP2(amg_solver, rap2); HYPRE_BoomerAMGSetKeepTranspose(amg_solver, keepTranspose); /*HYPRE_BoomerAMGSetNonGalerkTol(amg_solver, nongalerk_num_tol, nongalerk_tol);*/ if (nongalerk_tol) { HYPRE_BoomerAMGSetNonGalerkinTol(amg_solver, nongalerk_tol[nongalerk_num_tol - 1]); for (i = 0; i < nongalerk_num_tol - 1; i++) { HYPRE_BoomerAMGSetLevelNonGalerkinTol(amg_solver, nongalerk_tol[i], i); } } if (build_rbm) { HYPRE_BoomerAMGSetInterpVectors(amg_solver, num_interp_vecs, interp_vecs); HYPRE_BoomerAMGSetInterpVecVariant(amg_solver, interp_vec_variant); HYPRE_BoomerAMGSetInterpVecQMax(amg_solver, Q_max); HYPRE_BoomerAMGSetInterpVecAbsQTrunc(amg_solver, Q_trunc); } /* BM Oct 23, 2006 */ if (plot_grids) { HYPRE_BoomerAMGSetPlotGrids (amg_solver, 1); HYPRE_BoomerAMGSetPlotFileName (amg_solver, plot_file_name); HYPRE_BoomerAMGSetCoordDim (amg_solver, coord_dim); HYPRE_BoomerAMGSetCoordinates (amg_solver, coordinates); } HYPRE_BoomerAMGSetup(amg_solver, parcsr_A, b, x); hypre_EndTiming(time_index); hypre_PrintTiming("Setup phase times", hypre_MPI_COMM_WORLD); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); time_index = hypre_InitializeTiming("BoomerAMG Solve"); hypre_BeginTiming(time_index); HYPRE_BoomerAMGSolve(amg_solver, parcsr_A, b, x); hypre_EndTiming(time_index); hypre_PrintTiming("Solve phase times", hypre_MPI_COMM_WORLD); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); HYPRE_BoomerAMGGetNumIterations(amg_solver, &num_iterations); HYPRE_BoomerAMGGetFinalRelativeResidualNorm(amg_solver, &final_res_norm); if (myid == 0) { hypre_printf("\n"); hypre_printf("BoomerAMG Iterations = %d\n", num_iterations); hypre_printf("Final Relative Residual Norm = %e\n", final_res_norm); hypre_printf("\n"); } #if SECOND_TIME /* run a second time to check for memory leaks */ HYPRE_ParVectorSetRandomValues(x, 775); HYPRE_BoomerAMGSetup(amg_solver, parcsr_A, b, x); HYPRE_BoomerAMGSolve(amg_solver, parcsr_A, b, x); #endif HYPRE_BoomerAMGDestroy(amg_solver); } /*----------------------------------------------------------- * Solve the system using GSMG *-----------------------------------------------------------*/ if (solver_id == 13) { /* reset some smoother parameters */ relax_order = 0; if (myid == 0) { hypre_printf("Solver: GSMG\n"); } time_index = hypre_InitializeTiming("BoomerAMG Setup"); hypre_BeginTiming(time_index); HYPRE_BoomerAMGCreate(&amg_solver); HYPRE_BoomerAMGSetGSMG(amg_solver, 4); /* specify GSMG */ /* BM Aug 25, 2006 */ HYPRE_BoomerAMGSetCGCIts(amg_solver, cgcits); HYPRE_BoomerAMGSetInterpType(amg_solver, interp_type); HYPRE_BoomerAMGSetPostInterpType(amg_solver, post_interp_type); HYPRE_BoomerAMGSetNumSamples(amg_solver, gsmg_samples); HYPRE_BoomerAMGSetCoarsenType(amg_solver, coarsen_type); HYPRE_BoomerAMGSetMeasureType(amg_solver, measure_type); HYPRE_BoomerAMGSetTol(amg_solver, tol); HYPRE_BoomerAMGSetStrongThreshold(amg_solver, strong_threshold); HYPRE_BoomerAMGSetSeqThreshold(amg_solver, seq_threshold); HYPRE_BoomerAMGSetRedundant(amg_solver, redundant); HYPRE_BoomerAMGSetMaxCoarseSize(amg_solver, coarse_threshold); HYPRE_BoomerAMGSetMinCoarseSize(amg_solver, min_coarse_size); HYPRE_BoomerAMGSetTruncFactor(amg_solver, trunc_factor); HYPRE_BoomerAMGSetPMaxElmts(amg_solver, P_max_elmts); HYPRE_BoomerAMGSetJacobiTruncThreshold(amg_solver, jacobi_trunc_threshold); HYPRE_BoomerAMGSetSCommPkgSwitch(amg_solver, S_commpkg_switch); /* note: log is written to standard output, not to file */ HYPRE_BoomerAMGSetPrintLevel(amg_solver, 3); HYPRE_BoomerAMGSetPrintFileName(amg_solver, "driver.out.log"); HYPRE_BoomerAMGSetMaxIter(amg_solver, mg_max_iter); HYPRE_BoomerAMGSetCycleType(amg_solver, cycle_type); HYPRE_BoomerAMGSetNumSweeps(amg_solver, num_sweeps); HYPRE_BoomerAMGSetRelaxType(amg_solver, relax_type); if (relax_down > -1) { HYPRE_BoomerAMGSetCycleRelaxType(amg_solver, relax_down, 1); } if (relax_up > -1) { HYPRE_BoomerAMGSetCycleRelaxType(amg_solver, relax_up, 2); } if (relax_coarse > -1) { HYPRE_BoomerAMGSetCycleRelaxType(amg_solver, relax_coarse, 3); } HYPRE_BoomerAMGSetChebyOrder(amg_solver, cheby_order); HYPRE_BoomerAMGSetChebyFraction(amg_solver, cheby_fraction); HYPRE_BoomerAMGSetRelaxOrder(amg_solver, relax_order); HYPRE_BoomerAMGSetRelaxWt(amg_solver, relax_wt); HYPRE_BoomerAMGSetOuterWt(amg_solver, outer_wt); if (level_w > -1) { HYPRE_BoomerAMGSetLevelRelaxWt(amg_solver, relax_wt_level, level_w); } if (level_ow > -1) { HYPRE_BoomerAMGSetLevelOuterWt(amg_solver, outer_wt_level, level_ow); } HYPRE_BoomerAMGSetSmoothType(amg_solver, smooth_type); HYPRE_BoomerAMGSetSmoothNumSweeps(amg_solver, smooth_num_sweeps); HYPRE_BoomerAMGSetSmoothNumLevels(amg_solver, smooth_num_levels); HYPRE_BoomerAMGSetMaxLevels(amg_solver, max_levels); HYPRE_BoomerAMGSetMaxRowSum(amg_solver, max_row_sum); HYPRE_BoomerAMGSetDebugFlag(amg_solver, debug_flag); HYPRE_BoomerAMGSetVariant(amg_solver, variant); HYPRE_BoomerAMGSetOverlap(amg_solver, overlap); HYPRE_BoomerAMGSetDomainType(amg_solver, domain_type); HYPRE_BoomerAMGSetSchwarzUseNonSymm(amg_solver, use_nonsymm_schwarz); HYPRE_BoomerAMGSetSchwarzRlxWeight(amg_solver, schwarz_rlx_weight); if (eu_level < 0) { eu_level = 0; } HYPRE_BoomerAMGSetEuLevel(amg_solver, eu_level); HYPRE_BoomerAMGSetEuBJ(amg_solver, eu_bj); HYPRE_BoomerAMGSetEuSparseA(amg_solver, eu_sparse_A); HYPRE_BoomerAMGSetNumFunctions(amg_solver, num_functions); HYPRE_BoomerAMGSetAggNumLevels(amg_solver, agg_num_levels); HYPRE_BoomerAMGSetAggInterpType(amg_solver, agg_interp_type); HYPRE_BoomerAMGSetAggTruncFactor(amg_solver, agg_trunc_factor); HYPRE_BoomerAMGSetAggP12TruncFactor(amg_solver, agg_P12_trunc_factor); HYPRE_BoomerAMGSetAggPMaxElmts(amg_solver, agg_P_max_elmts); HYPRE_BoomerAMGSetAggP12MaxElmts(amg_solver, agg_P12_max_elmts); HYPRE_BoomerAMGSetNumPaths(amg_solver, num_paths); HYPRE_BoomerAMGSetNodal(amg_solver, nodal); HYPRE_BoomerAMGSetNodalDiag(amg_solver, nodal_diag); if (num_functions > 1) { HYPRE_BoomerAMGSetDofFunc(amg_solver, dof_func); } HYPRE_BoomerAMGSetAdditive(amg_solver, additive); HYPRE_BoomerAMGSetMultAdditive(amg_solver, mult_add); HYPRE_BoomerAMGSetSimple(amg_solver, simple); HYPRE_BoomerAMGSetMultAddPMaxElmts(amg_solver, add_P_max_elmts); HYPRE_BoomerAMGSetMultAddTruncFactor(amg_solver, add_trunc_factor); HYPRE_BoomerAMGSetRAP2(amg_solver, rap2); HYPRE_BoomerAMGSetKeepTranspose(amg_solver, keepTranspose); if (nongalerk_tol) { HYPRE_BoomerAMGSetNonGalerkinTol(amg_solver, nongalerk_tol[nongalerk_num_tol - 1]); for (i = 0; i < nongalerk_num_tol - 1; i++) { HYPRE_BoomerAMGSetLevelNonGalerkinTol(amg_solver, nongalerk_tol[i], i); } } HYPRE_BoomerAMGSetup(amg_solver, parcsr_A, b, x); hypre_EndTiming(time_index); hypre_PrintTiming("Setup phase times", hypre_MPI_COMM_WORLD); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); time_index = hypre_InitializeTiming("BoomerAMG Solve"); hypre_BeginTiming(time_index); HYPRE_BoomerAMGSolve(amg_solver, parcsr_A, b, x); hypre_EndTiming(time_index); hypre_PrintTiming("Solve phase times", hypre_MPI_COMM_WORLD); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); #if SECOND_TIME /* run a second time to check for memory leaks */ HYPRE_ParVectorSetRandomValues(x, 775); HYPRE_BoomerAMGSetup(amg_solver, parcsr_A, b, x); HYPRE_BoomerAMGSolve(amg_solver, parcsr_A, b, x); #endif HYPRE_BoomerAMGDestroy(amg_solver); } if (solver_id == 999) { HYPRE_IJMatrix ij_M; HYPRE_ParCSRMatrix parcsr_mat; /* use ParaSails preconditioner */ if (myid == 0) { hypre_printf("Test ParaSails Build IJMatrix\n"); } HYPRE_IJMatrixPrint(ij_A, "parasails.in"); HYPRE_ParaSailsCreate(hypre_MPI_COMM_WORLD, &pcg_precond); HYPRE_ParaSailsSetParams(pcg_precond, 0., 0); HYPRE_ParaSailsSetFilter(pcg_precond, 0.); HYPRE_ParaSailsSetLogging(pcg_precond, ioutdat); HYPRE_IJMatrixGetObject( ij_A, &object); parcsr_mat = (HYPRE_ParCSRMatrix) object; HYPRE_ParaSailsSetup(pcg_precond, parcsr_mat, NULL, NULL); HYPRE_ParaSailsBuildIJMatrix(pcg_precond, &ij_M); HYPRE_IJMatrixPrint(ij_M, "parasails.out"); if (myid == 0) { hypre_printf("Printed to parasails.out.\n"); } exit(0); } /*----------------------------------------------------------- * Solve the system using PCG *-----------------------------------------------------------*/ if (solver_id == 1 || solver_id == 2 || solver_id == 8 || solver_id == 12 || solver_id == 14 || solver_id == 43) { time_index = hypre_InitializeTiming("PCG Setup"); hypre_BeginTiming(time_index); HYPRE_ParCSRPCGCreate(hypre_MPI_COMM_WORLD, &pcg_solver); HYPRE_PCGSetMaxIter(pcg_solver, max_iter); HYPRE_PCGSetTol(pcg_solver, tol); HYPRE_PCGSetTwoNorm(pcg_solver, 1); HYPRE_PCGSetRelChange(pcg_solver, rel_change); HYPRE_PCGSetPrintLevel(pcg_solver, ioutdat); HYPRE_PCGSetAbsoluteTol(pcg_solver, atol); if (solver_id == 1) { /* use BoomerAMG as preconditioner */ if (myid == 0) { hypre_printf("Solver: AMG-PCG\n"); } HYPRE_BoomerAMGCreate(&pcg_precond); /* BM Aug 25, 2006 */ HYPRE_BoomerAMGSetCGCIts(pcg_precond, cgcits); HYPRE_BoomerAMGSetInterpType(pcg_precond, interp_type); HYPRE_BoomerAMGSetPostInterpType(pcg_precond, post_interp_type); HYPRE_BoomerAMGSetNumSamples(pcg_precond, gsmg_samples); HYPRE_BoomerAMGSetTol(pcg_precond, pc_tol); HYPRE_BoomerAMGSetCoarsenType(pcg_precond, coarsen_type); HYPRE_BoomerAMGSetMeasureType(pcg_precond, measure_type); HYPRE_BoomerAMGSetStrongThreshold(pcg_precond, strong_threshold); HYPRE_BoomerAMGSetSeqThreshold(pcg_precond, seq_threshold); HYPRE_BoomerAMGSetRedundant(pcg_precond, redundant); HYPRE_BoomerAMGSetMaxCoarseSize(pcg_precond, coarse_threshold); HYPRE_BoomerAMGSetMinCoarseSize(pcg_precond, min_coarse_size); HYPRE_BoomerAMGSetTruncFactor(pcg_precond, trunc_factor); HYPRE_BoomerAMGSetPMaxElmts(pcg_precond, P_max_elmts); HYPRE_BoomerAMGSetJacobiTruncThreshold(pcg_precond, jacobi_trunc_threshold); HYPRE_BoomerAMGSetSCommPkgSwitch(pcg_precond, S_commpkg_switch); HYPRE_BoomerAMGSetPrintLevel(pcg_precond, poutdat); HYPRE_BoomerAMGSetPrintFileName(pcg_precond, "driver.out.log"); HYPRE_BoomerAMGSetMaxIter(pcg_precond, 1); HYPRE_BoomerAMGSetCycleType(pcg_precond, cycle_type); HYPRE_BoomerAMGSetNumSweeps(pcg_precond, num_sweeps); HYPRE_BoomerAMGSetISType(pcg_precond, IS_type); HYPRE_BoomerAMGSetNumCRRelaxSteps(pcg_precond, num_CR_relax_steps); HYPRE_BoomerAMGSetCRRate(pcg_precond, CR_rate); HYPRE_BoomerAMGSetCRStrongTh(pcg_precond, CR_strong_th); HYPRE_BoomerAMGSetCRUseCG(pcg_precond, CR_use_CG); HYPRE_BoomerAMGSetRelaxType(pcg_precond, relax_type); if (relax_down > -1) { HYPRE_BoomerAMGSetCycleRelaxType(pcg_precond, relax_down, 1); } if (relax_up > -1) { HYPRE_BoomerAMGSetCycleRelaxType(pcg_precond, relax_up, 2); } if (relax_coarse > -1) { HYPRE_BoomerAMGSetCycleRelaxType(pcg_precond, relax_coarse, 3); } HYPRE_BoomerAMGSetChebyOrder(pcg_precond, cheby_order); HYPRE_BoomerAMGSetChebyFraction(pcg_precond, cheby_fraction); HYPRE_BoomerAMGSetRelaxOrder(pcg_precond, relax_order); HYPRE_BoomerAMGSetRelaxWt(pcg_precond, relax_wt); HYPRE_BoomerAMGSetOuterWt(pcg_precond, outer_wt); if (level_w > -1) { HYPRE_BoomerAMGSetLevelRelaxWt(pcg_precond, relax_wt_level, level_w); } if (level_ow > -1) { HYPRE_BoomerAMGSetLevelOuterWt(pcg_precond, outer_wt_level, level_ow); } HYPRE_BoomerAMGSetSmoothType(pcg_precond, smooth_type); HYPRE_BoomerAMGSetSmoothNumLevels(pcg_precond, smooth_num_levels); HYPRE_BoomerAMGSetSmoothNumSweeps(pcg_precond, smooth_num_sweeps); HYPRE_BoomerAMGSetMaxLevels(pcg_precond, max_levels); HYPRE_BoomerAMGSetMaxRowSum(pcg_precond, max_row_sum); HYPRE_BoomerAMGSetNumFunctions(pcg_precond, num_functions); HYPRE_BoomerAMGSetAggNumLevels(pcg_precond, agg_num_levels); HYPRE_BoomerAMGSetAggInterpType(pcg_precond, agg_interp_type); HYPRE_BoomerAMGSetAggTruncFactor(pcg_precond, agg_trunc_factor); HYPRE_BoomerAMGSetAggP12TruncFactor(pcg_precond, agg_P12_trunc_factor); HYPRE_BoomerAMGSetAggPMaxElmts(pcg_precond, agg_P_max_elmts); HYPRE_BoomerAMGSetAggP12MaxElmts(pcg_precond, agg_P12_max_elmts); HYPRE_BoomerAMGSetNumPaths(pcg_precond, num_paths); HYPRE_BoomerAMGSetNodal(pcg_precond, nodal); HYPRE_BoomerAMGSetNodalDiag(pcg_precond, nodal_diag); HYPRE_BoomerAMGSetVariant(pcg_precond, variant); HYPRE_BoomerAMGSetOverlap(pcg_precond, overlap); HYPRE_BoomerAMGSetDomainType(pcg_precond, domain_type); HYPRE_BoomerAMGSetSchwarzUseNonSymm(pcg_precond, use_nonsymm_schwarz); HYPRE_BoomerAMGSetSchwarzRlxWeight(pcg_precond, schwarz_rlx_weight); if (eu_level < 0) { eu_level = 0; } HYPRE_BoomerAMGSetEuLevel(pcg_precond, eu_level); HYPRE_BoomerAMGSetEuBJ(pcg_precond, eu_bj); HYPRE_BoomerAMGSetEuSparseA(pcg_precond, eu_sparse_A); HYPRE_BoomerAMGSetCycleNumSweeps(pcg_precond, ns_coarse, 3); if (num_functions > 1) { HYPRE_BoomerAMGSetDofFunc(pcg_precond, dof_func); } HYPRE_BoomerAMGSetAdditive(pcg_precond, additive); HYPRE_BoomerAMGSetMultAdditive(pcg_precond, mult_add); HYPRE_BoomerAMGSetSimple(pcg_precond, simple); HYPRE_BoomerAMGSetMultAddPMaxElmts(pcg_precond, add_P_max_elmts); HYPRE_BoomerAMGSetMultAddTruncFactor(pcg_precond, add_trunc_factor); HYPRE_BoomerAMGSetRAP2(pcg_precond, rap2); HYPRE_BoomerAMGSetKeepTranspose(pcg_precond, keepTranspose); if (nongalerk_tol) { HYPRE_BoomerAMGSetNonGalerkinTol(pcg_precond, nongalerk_tol[nongalerk_num_tol - 1]); for (i = 0; i < nongalerk_num_tol - 1; i++) { HYPRE_BoomerAMGSetLevelNonGalerkinTol(pcg_precond, nongalerk_tol[i], i); } } if (build_rbm) { HYPRE_BoomerAMGSetInterpVectors(pcg_precond, num_interp_vecs, interp_vecs); HYPRE_BoomerAMGSetInterpVecVariant(pcg_precond, interp_vec_variant); HYPRE_BoomerAMGSetInterpVecQMax(pcg_precond, Q_max); HYPRE_BoomerAMGSetInterpVecAbsQTrunc(pcg_precond, Q_trunc); } HYPRE_PCGSetMaxIter(pcg_solver, mg_max_iter); HYPRE_PCGSetPrecond(pcg_solver, (HYPRE_PtrToSolverFcn) HYPRE_BoomerAMGSolve, (HYPRE_PtrToSolverFcn) HYPRE_BoomerAMGSetup, pcg_precond); } else if (solver_id == 2) { /* use diagonal scaling as preconditioner */ if (myid == 0) { hypre_printf("Solver: DS-PCG\n"); } pcg_precond = NULL; HYPRE_PCGSetPrecond(pcg_solver, (HYPRE_PtrToSolverFcn) HYPRE_ParCSRDiagScale, (HYPRE_PtrToSolverFcn) HYPRE_ParCSRDiagScaleSetup, pcg_precond); } else if (solver_id == 8) { /* use ParaSails preconditioner */ if (myid == 0) { hypre_printf("Solver: ParaSails-PCG\n"); } HYPRE_ParaSailsCreate(hypre_MPI_COMM_WORLD, &pcg_precond); HYPRE_ParaSailsSetParams(pcg_precond, sai_threshold, max_levels); HYPRE_ParaSailsSetFilter(pcg_precond, sai_filter); HYPRE_ParaSailsSetLogging(pcg_precond, poutdat); HYPRE_PCGSetPrecond(pcg_solver, (HYPRE_PtrToSolverFcn) HYPRE_ParaSailsSolve, (HYPRE_PtrToSolverFcn) HYPRE_ParaSailsSetup, pcg_precond); } else if (solver_id == 12) { /* use Schwarz preconditioner */ if (myid == 0) { hypre_printf("Solver: Schwarz-PCG\n"); } HYPRE_SchwarzCreate(&pcg_precond); HYPRE_SchwarzSetVariant(pcg_precond, variant); HYPRE_SchwarzSetOverlap(pcg_precond, overlap); HYPRE_SchwarzSetDomainType(pcg_precond, domain_type); HYPRE_SchwarzSetRelaxWeight(pcg_precond, schwarz_rlx_weight); HYPRE_SchwarzSetNonSymm(pcg_precond, use_nonsymm_schwarz); HYPRE_PCGSetPrecond(pcg_solver, (HYPRE_PtrToSolverFcn) HYPRE_SchwarzSolve, (HYPRE_PtrToSolverFcn) HYPRE_SchwarzSetup, pcg_precond); } else if (solver_id == 14) { /* use GSMG as preconditioner */ /* reset some smoother parameters */ /* fine grid */ relax_order = 0; if (myid == 0) { hypre_printf("Solver: GSMG-PCG\n"); } HYPRE_BoomerAMGCreate(&pcg_precond); HYPRE_BoomerAMGSetGSMG(pcg_precond, 4); /* BM Aug 25, 2006 */ HYPRE_BoomerAMGSetCGCIts(pcg_precond, cgcits); HYPRE_BoomerAMGSetInterpType(pcg_precond, interp_type); HYPRE_BoomerAMGSetPostInterpType(pcg_precond, post_interp_type); HYPRE_BoomerAMGSetNumSamples(pcg_precond, gsmg_samples); HYPRE_BoomerAMGSetTol(pcg_precond, pc_tol); HYPRE_BoomerAMGSetCoarsenType(pcg_precond, coarsen_type); HYPRE_BoomerAMGSetMeasureType(pcg_precond, measure_type); HYPRE_BoomerAMGSetStrongThreshold(pcg_precond, strong_threshold); HYPRE_BoomerAMGSetSeqThreshold(pcg_precond, seq_threshold); HYPRE_BoomerAMGSetRedundant(pcg_precond, redundant); HYPRE_BoomerAMGSetMaxCoarseSize(pcg_precond, coarse_threshold); HYPRE_BoomerAMGSetMinCoarseSize(pcg_precond, min_coarse_size); HYPRE_BoomerAMGSetTruncFactor(pcg_precond, trunc_factor); HYPRE_BoomerAMGSetPMaxElmts(pcg_precond, P_max_elmts); HYPRE_BoomerAMGSetJacobiTruncThreshold(pcg_precond, jacobi_trunc_threshold); HYPRE_BoomerAMGSetSCommPkgSwitch(pcg_precond, S_commpkg_switch); HYPRE_BoomerAMGSetPrintLevel(pcg_precond, poutdat); HYPRE_BoomerAMGSetPrintFileName(pcg_precond, "driver.out.log"); HYPRE_BoomerAMGSetMaxIter(pcg_precond, 1); HYPRE_BoomerAMGSetCycleType(pcg_precond, cycle_type); HYPRE_BoomerAMGSetNumSweeps(pcg_precond, num_sweeps); HYPRE_BoomerAMGSetISType(pcg_precond, IS_type); HYPRE_BoomerAMGSetNumCRRelaxSteps(pcg_precond, num_CR_relax_steps); HYPRE_BoomerAMGSetCRRate(pcg_precond, CR_rate); HYPRE_BoomerAMGSetCRStrongTh(pcg_precond, CR_strong_th); HYPRE_BoomerAMGSetCRUseCG(pcg_precond, CR_use_CG); HYPRE_BoomerAMGSetRelaxType(pcg_precond, relax_type); if (relax_down > -1) { HYPRE_BoomerAMGSetCycleRelaxType(pcg_precond, relax_down, 1); } if (relax_up > -1) { HYPRE_BoomerAMGSetCycleRelaxType(pcg_precond, relax_up, 2); } if (relax_coarse > -1) { HYPRE_BoomerAMGSetCycleRelaxType(pcg_precond, relax_coarse, 3); } HYPRE_BoomerAMGSetRelaxOrder(pcg_precond, relax_order); HYPRE_BoomerAMGSetChebyOrder(pcg_precond, cheby_order); HYPRE_BoomerAMGSetChebyFraction(pcg_precond, cheby_fraction); HYPRE_BoomerAMGSetRelaxWt(pcg_precond, relax_wt); HYPRE_BoomerAMGSetOuterWt(pcg_precond, outer_wt); if (level_w > -1) { HYPRE_BoomerAMGSetLevelRelaxWt(pcg_precond, relax_wt_level, level_w); } if (level_ow > -1) { HYPRE_BoomerAMGSetLevelOuterWt(pcg_precond, outer_wt_level, level_ow); } HYPRE_BoomerAMGSetSmoothType(pcg_precond, smooth_type); HYPRE_BoomerAMGSetSmoothNumLevels(pcg_precond, smooth_num_levels); HYPRE_BoomerAMGSetSmoothNumSweeps(pcg_precond, smooth_num_sweeps); HYPRE_BoomerAMGSetVariant(pcg_precond, variant); HYPRE_BoomerAMGSetOverlap(pcg_precond, overlap); HYPRE_BoomerAMGSetDomainType(pcg_precond, domain_type); HYPRE_BoomerAMGSetSchwarzRlxWeight(pcg_precond, schwarz_rlx_weight); if (eu_level < 0) { eu_level = 0; } HYPRE_BoomerAMGSetEuLevel(pcg_precond, eu_level); HYPRE_BoomerAMGSetEuBJ(pcg_precond, eu_bj); HYPRE_BoomerAMGSetEuSparseA(pcg_precond, eu_sparse_A); HYPRE_BoomerAMGSetMaxLevels(pcg_precond, max_levels); HYPRE_BoomerAMGSetMaxRowSum(pcg_precond, max_row_sum); HYPRE_BoomerAMGSetNumFunctions(pcg_precond, num_functions); HYPRE_BoomerAMGSetAggNumLevels(pcg_precond, agg_num_levels); HYPRE_BoomerAMGSetAggInterpType(pcg_precond, agg_interp_type); HYPRE_BoomerAMGSetAggTruncFactor(pcg_precond, agg_trunc_factor); HYPRE_BoomerAMGSetAggP12TruncFactor(pcg_precond, agg_P12_trunc_factor); HYPRE_BoomerAMGSetAggPMaxElmts(pcg_precond, agg_P_max_elmts); HYPRE_BoomerAMGSetAggP12MaxElmts(pcg_precond, agg_P12_max_elmts); HYPRE_BoomerAMGSetNumPaths(pcg_precond, num_paths); HYPRE_BoomerAMGSetNodal(pcg_precond, nodal); HYPRE_BoomerAMGSetNodalDiag(pcg_precond, nodal_diag); HYPRE_BoomerAMGSetCycleNumSweeps(pcg_precond, ns_coarse, 3); if (num_functions > 1) { HYPRE_BoomerAMGSetDofFunc(pcg_precond, dof_func); } HYPRE_BoomerAMGSetAdditive(pcg_precond, additive); HYPRE_BoomerAMGSetMultAdditive(pcg_precond, mult_add); HYPRE_BoomerAMGSetSimple(pcg_precond, simple); HYPRE_BoomerAMGSetMultAddPMaxElmts(pcg_precond, add_P_max_elmts); HYPRE_BoomerAMGSetMultAddTruncFactor(pcg_precond, add_trunc_factor); HYPRE_BoomerAMGSetRAP2(pcg_precond, rap2); HYPRE_BoomerAMGSetKeepTranspose(pcg_precond, keepTranspose); if (nongalerk_tol) { HYPRE_BoomerAMGSetNonGalerkinTol(pcg_precond, nongalerk_tol[nongalerk_num_tol - 1]); for (i = 0; i < nongalerk_num_tol - 1; i++) { HYPRE_BoomerAMGSetLevelNonGalerkinTol(pcg_precond, nongalerk_tol[i], i); } } HYPRE_PCGSetMaxIter(pcg_solver, mg_max_iter); HYPRE_PCGSetPrecond(pcg_solver, (HYPRE_PtrToSolverFcn) HYPRE_BoomerAMGSolve, (HYPRE_PtrToSolverFcn) HYPRE_BoomerAMGSetup, pcg_precond); } else if (solver_id == 43) { /* use Euclid preconditioning */ if (myid == 0) { hypre_printf("Solver: Euclid-PCG\n"); } HYPRE_EuclidCreate(hypre_MPI_COMM_WORLD, &pcg_precond); /* note: There are three three methods of setting run-time parameters for Euclid: (see HYPRE_parcsr_ls.h); here we'll use what I think is simplest: let Euclid internally parse the command line. */ if (eu_level > -1) { HYPRE_EuclidSetLevel(pcg_precond, eu_level); } if (eu_ilut) { HYPRE_EuclidSetILUT(pcg_precond, eu_ilut); } if (eu_sparse_A) { HYPRE_EuclidSetSparseA(pcg_precond, eu_sparse_A); } if (eu_row_scale) { HYPRE_EuclidSetRowScale(pcg_precond, eu_row_scale); } if (eu_bj) { HYPRE_EuclidSetBJ(pcg_precond, eu_bj); } HYPRE_EuclidSetStats(pcg_precond, eu_stats); HYPRE_EuclidSetMem(pcg_precond, eu_mem); /*HYPRE_EuclidSetParams(pcg_precond, argc, argv);*/ HYPRE_PCGSetPrecond(pcg_solver, (HYPRE_PtrToSolverFcn) HYPRE_EuclidSolve, (HYPRE_PtrToSolverFcn) HYPRE_EuclidSetup, pcg_precond); } HYPRE_PCGGetPrecond(pcg_solver, &pcg_precond_gotten); if (pcg_precond_gotten != pcg_precond) { hypre_printf("HYPRE_ParCSRPCGGetPrecond got bad precond\n"); return (-1); } else if (myid == 0) { hypre_printf("HYPRE_ParCSRPCGGetPrecond got good precond\n"); } HYPRE_PCGSetup(pcg_solver, (HYPRE_Matrix)parcsr_A, (HYPRE_Vector)b, (HYPRE_Vector)x); hypre_EndTiming(time_index); hypre_PrintTiming("Setup phase times", hypre_MPI_COMM_WORLD); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); time_index = hypre_InitializeTiming("PCG Solve"); hypre_BeginTiming(time_index); HYPRE_PCGSolve(pcg_solver, (HYPRE_Matrix)parcsr_A, (HYPRE_Vector)b, (HYPRE_Vector)x); hypre_EndTiming(time_index); hypre_PrintTiming("Solve phase times", hypre_MPI_COMM_WORLD); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); HYPRE_PCGGetNumIterations(pcg_solver, &num_iterations); HYPRE_PCGGetFinalRelativeResidualNorm(pcg_solver, &final_res_norm); #if SECOND_TIME /* run a second time to check for memory leaks */ HYPRE_ParVectorSetRandomValues(x, 775); HYPRE_PCGSetup(pcg_solver, (HYPRE_Matrix)parcsr_A, (HYPRE_Vector)b, (HYPRE_Vector)x); HYPRE_PCGSolve(pcg_solver, (HYPRE_Matrix)parcsr_A, (HYPRE_Vector)b, (HYPRE_Vector)x); #endif HYPRE_ParCSRPCGDestroy(pcg_solver); if (solver_id == 1) { HYPRE_BoomerAMGDestroy(pcg_precond); } else if (solver_id == 8) { HYPRE_ParaSailsDestroy(pcg_precond); } else if (solver_id == 12) { HYPRE_SchwarzDestroy(pcg_precond); } else if (solver_id == 14) { HYPRE_BoomerAMGDestroy(pcg_precond); } else if (solver_id == 43) { HYPRE_EuclidDestroy(pcg_precond); } if (myid == 0) { hypre_printf("\n"); hypre_printf("Iterations = %d\n", num_iterations); hypre_printf("Final Relative Residual Norm = %e\n", final_res_norm); hypre_printf("\n"); } } /*----------------------------------------------------------- * Solve the system using GMRES *-----------------------------------------------------------*/ if (solver_id == 3 || solver_id == 4 || solver_id == 7 || solver_id == 15 || solver_id == 18 || solver_id == 44) { time_index = hypre_InitializeTiming("GMRES Setup"); hypre_BeginTiming(time_index); HYPRE_ParCSRGMRESCreate(hypre_MPI_COMM_WORLD, &pcg_solver); HYPRE_GMRESSetKDim(pcg_solver, k_dim); HYPRE_GMRESSetMaxIter(pcg_solver, max_iter); HYPRE_GMRESSetTol(pcg_solver, tol); HYPRE_GMRESSetAbsoluteTol(pcg_solver, atol); HYPRE_GMRESSetLogging(pcg_solver, 1); HYPRE_GMRESSetPrintLevel(pcg_solver, ioutdat); HYPRE_GMRESSetRelChange(pcg_solver, rel_change); if (solver_id == 3) { /* use BoomerAMG as preconditioner */ if (myid == 0) { hypre_printf("Solver: AMG-GMRES\n"); } HYPRE_BoomerAMGCreate(&pcg_precond); HYPRE_BoomerAMGSetCGCIts(pcg_precond, cgcits); HYPRE_BoomerAMGSetInterpType(pcg_precond, interp_type); HYPRE_BoomerAMGSetPostInterpType(pcg_precond, post_interp_type); HYPRE_BoomerAMGSetNumSamples(pcg_precond, gsmg_samples); HYPRE_BoomerAMGSetTol(pcg_precond, pc_tol); HYPRE_BoomerAMGSetCoarsenType(pcg_precond, coarsen_type); HYPRE_BoomerAMGSetMeasureType(pcg_precond, measure_type); HYPRE_BoomerAMGSetStrongThreshold(pcg_precond, strong_threshold); HYPRE_BoomerAMGSetSeqThreshold(pcg_precond, seq_threshold); HYPRE_BoomerAMGSetRedundant(pcg_precond, redundant); HYPRE_BoomerAMGSetMaxCoarseSize(pcg_precond, coarse_threshold); HYPRE_BoomerAMGSetMinCoarseSize(pcg_precond, min_coarse_size); HYPRE_BoomerAMGSetTruncFactor(pcg_precond, trunc_factor); HYPRE_BoomerAMGSetPMaxElmts(pcg_precond, P_max_elmts); HYPRE_BoomerAMGSetJacobiTruncThreshold(pcg_precond, jacobi_trunc_threshold); HYPRE_BoomerAMGSetSCommPkgSwitch(pcg_precond, S_commpkg_switch); HYPRE_BoomerAMGSetPrintLevel(pcg_precond, poutdat); HYPRE_BoomerAMGSetPrintFileName(pcg_precond, "driver.out.log"); HYPRE_BoomerAMGSetMaxIter(pcg_precond, 1); HYPRE_BoomerAMGSetCycleType(pcg_precond, cycle_type); HYPRE_BoomerAMGSetNumSweeps(pcg_precond, num_sweeps); HYPRE_BoomerAMGSetISType(pcg_precond, IS_type); HYPRE_BoomerAMGSetNumCRRelaxSteps(pcg_precond, num_CR_relax_steps); HYPRE_BoomerAMGSetCRRate(pcg_precond, CR_rate); HYPRE_BoomerAMGSetCRStrongTh(pcg_precond, CR_strong_th); HYPRE_BoomerAMGSetCRUseCG(pcg_precond, CR_use_CG); HYPRE_BoomerAMGSetRelaxType(pcg_precond, relax_type); if (relax_down > -1) { HYPRE_BoomerAMGSetCycleRelaxType(pcg_precond, relax_down, 1); } if (relax_up > -1) { HYPRE_BoomerAMGSetCycleRelaxType(pcg_precond, relax_up, 2); } if (relax_coarse > -1) { HYPRE_BoomerAMGSetCycleRelaxType(pcg_precond, relax_coarse, 3); } HYPRE_BoomerAMGSetChebyOrder(pcg_precond, cheby_order); HYPRE_BoomerAMGSetChebyFraction(pcg_precond, cheby_fraction); HYPRE_BoomerAMGSetRelaxOrder(pcg_precond, relax_order); HYPRE_BoomerAMGSetRelaxWt(pcg_precond, relax_wt); HYPRE_BoomerAMGSetOuterWt(pcg_precond, outer_wt); if (level_w > -1) { HYPRE_BoomerAMGSetLevelRelaxWt(pcg_precond, relax_wt_level, level_w); } if (level_ow > -1) { HYPRE_BoomerAMGSetLevelOuterWt(pcg_precond, outer_wt_level, level_ow); } HYPRE_BoomerAMGSetSmoothType(pcg_precond, smooth_type); HYPRE_BoomerAMGSetSmoothNumLevels(pcg_precond, smooth_num_levels); HYPRE_BoomerAMGSetSmoothNumSweeps(pcg_precond, smooth_num_sweeps); HYPRE_BoomerAMGSetMaxLevels(pcg_precond, max_levels); HYPRE_BoomerAMGSetMaxRowSum(pcg_precond, max_row_sum); HYPRE_BoomerAMGSetNumFunctions(pcg_precond, num_functions); HYPRE_BoomerAMGSetAggNumLevels(pcg_precond, agg_num_levels); HYPRE_BoomerAMGSetAggInterpType(pcg_precond, agg_interp_type); HYPRE_BoomerAMGSetAggTruncFactor(pcg_precond, agg_trunc_factor); HYPRE_BoomerAMGSetAggP12TruncFactor(pcg_precond, agg_P12_trunc_factor); HYPRE_BoomerAMGSetAggPMaxElmts(pcg_precond, agg_P_max_elmts); HYPRE_BoomerAMGSetAggP12MaxElmts(pcg_precond, agg_P12_max_elmts); HYPRE_BoomerAMGSetNumPaths(pcg_precond, num_paths); HYPRE_BoomerAMGSetNodal(pcg_precond, nodal); HYPRE_BoomerAMGSetNodalDiag(pcg_precond, nodal_diag); HYPRE_BoomerAMGSetVariant(pcg_precond, variant); HYPRE_BoomerAMGSetOverlap(pcg_precond, overlap); HYPRE_BoomerAMGSetDomainType(pcg_precond, domain_type); HYPRE_BoomerAMGSetSchwarzUseNonSymm(pcg_precond, use_nonsymm_schwarz); HYPRE_BoomerAMGSetSchwarzRlxWeight(pcg_precond, schwarz_rlx_weight); if (eu_level < 0) { eu_level = 0; } HYPRE_BoomerAMGSetEuLevel(pcg_precond, eu_level); HYPRE_BoomerAMGSetEuBJ(pcg_precond, eu_bj); HYPRE_BoomerAMGSetEuSparseA(pcg_precond, eu_sparse_A); HYPRE_BoomerAMGSetCycleNumSweeps(pcg_precond, ns_coarse, 3); if (num_functions > 1) { HYPRE_BoomerAMGSetDofFunc(pcg_precond, dof_func); } HYPRE_BoomerAMGSetAdditive(pcg_precond, additive); HYPRE_BoomerAMGSetMultAdditive(pcg_precond, mult_add); HYPRE_BoomerAMGSetSimple(pcg_precond, simple); HYPRE_BoomerAMGSetMultAddPMaxElmts(pcg_precond, add_P_max_elmts); HYPRE_BoomerAMGSetMultAddTruncFactor(pcg_precond, add_trunc_factor); HYPRE_BoomerAMGSetRAP2(pcg_precond, rap2); HYPRE_BoomerAMGSetKeepTranspose(pcg_precond, keepTranspose); if (nongalerk_tol) { HYPRE_BoomerAMGSetNonGalerkinTol(pcg_precond, nongalerk_tol[nongalerk_num_tol - 1]); for (i = 0; i < nongalerk_num_tol - 1; i++) { HYPRE_BoomerAMGSetLevelNonGalerkinTol(pcg_precond, nongalerk_tol[i], i); } } if (build_rbm) { HYPRE_BoomerAMGSetInterpVectors(pcg_precond, 1, interp_vecs); HYPRE_BoomerAMGSetInterpVecVariant(pcg_precond, interp_vec_variant); HYPRE_BoomerAMGSetInterpVecQMax(pcg_precond, Q_max); HYPRE_BoomerAMGSetInterpVecAbsQTrunc(pcg_precond, Q_trunc); } HYPRE_GMRESSetMaxIter(pcg_solver, mg_max_iter); HYPRE_GMRESSetPrecond(pcg_solver, (HYPRE_PtrToSolverFcn) HYPRE_BoomerAMGSolve, (HYPRE_PtrToSolverFcn) HYPRE_BoomerAMGSetup, pcg_precond); } else if (solver_id == 4) { /* use diagonal scaling as preconditioner */ if (myid == 0) { hypre_printf("Solver: DS-GMRES\n"); } pcg_precond = NULL; HYPRE_GMRESSetPrecond(pcg_solver, (HYPRE_PtrToSolverFcn) HYPRE_ParCSRDiagScale, (HYPRE_PtrToSolverFcn) HYPRE_ParCSRDiagScaleSetup, pcg_precond); } else if (solver_id == 7) { /* use PILUT as preconditioner */ if (myid == 0) { hypre_printf("Solver: PILUT-GMRES\n"); } ierr = HYPRE_ParCSRPilutCreate( hypre_MPI_COMM_WORLD, &pcg_precond ); if (ierr) { hypre_printf("Error in ParPilutCreate\n"); } HYPRE_GMRESSetPrecond(pcg_solver, (HYPRE_PtrToSolverFcn) HYPRE_ParCSRPilutSolve, (HYPRE_PtrToSolverFcn) HYPRE_ParCSRPilutSetup, pcg_precond); if (drop_tol >= 0 ) HYPRE_ParCSRPilutSetDropTolerance( pcg_precond, drop_tol ); if (nonzeros_to_keep >= 0 ) HYPRE_ParCSRPilutSetFactorRowSize( pcg_precond, nonzeros_to_keep ); } else if (solver_id == 15) { /* use GSMG as preconditioner */ /* reset some smoother parameters */ relax_order = 0; if (myid == 0) { hypre_printf("Solver: GSMG-GMRES\n"); } HYPRE_BoomerAMGCreate(&pcg_precond); HYPRE_BoomerAMGSetGSMG(pcg_precond, 4); HYPRE_BoomerAMGSetCGCIts(pcg_precond, cgcits); HYPRE_BoomerAMGSetInterpType(pcg_precond, interp_type); HYPRE_BoomerAMGSetPostInterpType(pcg_precond, post_interp_type); HYPRE_BoomerAMGSetNumSamples(pcg_precond, gsmg_samples); HYPRE_BoomerAMGSetTol(pcg_precond, pc_tol); HYPRE_BoomerAMGSetCoarsenType(pcg_precond, coarsen_type); HYPRE_BoomerAMGSetMeasureType(pcg_precond, measure_type); HYPRE_BoomerAMGSetStrongThreshold(pcg_precond, strong_threshold); HYPRE_BoomerAMGSetSeqThreshold(pcg_precond, seq_threshold); HYPRE_BoomerAMGSetRedundant(pcg_precond, redundant); HYPRE_BoomerAMGSetMaxCoarseSize(pcg_precond, coarse_threshold); HYPRE_BoomerAMGSetMinCoarseSize(pcg_precond, min_coarse_size); HYPRE_BoomerAMGSetTruncFactor(pcg_precond, trunc_factor); HYPRE_BoomerAMGSetPMaxElmts(pcg_precond, P_max_elmts); HYPRE_BoomerAMGSetJacobiTruncThreshold(pcg_precond, jacobi_trunc_threshold); HYPRE_BoomerAMGSetSCommPkgSwitch(pcg_precond, S_commpkg_switch); HYPRE_BoomerAMGSetPrintLevel(pcg_precond, poutdat); HYPRE_BoomerAMGSetPrintFileName(pcg_precond, "driver.out.log"); HYPRE_BoomerAMGSetMaxIter(pcg_precond, 1); HYPRE_BoomerAMGSetCycleType(pcg_precond, cycle_type); HYPRE_BoomerAMGSetNumSweeps(pcg_precond, num_sweeps); HYPRE_BoomerAMGSetISType(pcg_precond, IS_type); HYPRE_BoomerAMGSetNumCRRelaxSteps(pcg_precond, num_CR_relax_steps); HYPRE_BoomerAMGSetCRRate(pcg_precond, CR_rate); HYPRE_BoomerAMGSetCRStrongTh(pcg_precond, CR_strong_th); HYPRE_BoomerAMGSetCRUseCG(pcg_precond, CR_use_CG); HYPRE_BoomerAMGSetRelaxType(pcg_precond, relax_type); if (relax_down > -1) { HYPRE_BoomerAMGSetCycleRelaxType(pcg_precond, relax_down, 1); } if (relax_up > -1) { HYPRE_BoomerAMGSetCycleRelaxType(pcg_precond, relax_up, 2); } if (relax_coarse > -1) { HYPRE_BoomerAMGSetCycleRelaxType(pcg_precond, relax_coarse, 3); } HYPRE_BoomerAMGSetChebyOrder(pcg_precond, cheby_order); HYPRE_BoomerAMGSetChebyFraction(pcg_precond, cheby_fraction); HYPRE_BoomerAMGSetRelaxOrder(pcg_precond, relax_order); HYPRE_BoomerAMGSetRelaxWt(pcg_precond, relax_wt); HYPRE_BoomerAMGSetOuterWt(pcg_precond, outer_wt); if (level_w > -1) { HYPRE_BoomerAMGSetLevelRelaxWt(pcg_precond, relax_wt_level, level_w); } if (level_ow > -1) { HYPRE_BoomerAMGSetLevelOuterWt(pcg_precond, outer_wt_level, level_ow); } HYPRE_BoomerAMGSetSmoothType(pcg_precond, smooth_type); HYPRE_BoomerAMGSetSmoothNumLevels(pcg_precond, smooth_num_levels); HYPRE_BoomerAMGSetSmoothNumSweeps(pcg_precond, smooth_num_sweeps); HYPRE_BoomerAMGSetVariant(pcg_precond, variant); HYPRE_BoomerAMGSetOverlap(pcg_precond, overlap); HYPRE_BoomerAMGSetDomainType(pcg_precond, domain_type); HYPRE_BoomerAMGSetSchwarzUseNonSymm(pcg_precond, use_nonsymm_schwarz); HYPRE_BoomerAMGSetSchwarzRlxWeight(pcg_precond, schwarz_rlx_weight); if (eu_level < 0) { eu_level = 0; } HYPRE_BoomerAMGSetEuLevel(pcg_precond, eu_level); HYPRE_BoomerAMGSetEuBJ(pcg_precond, eu_bj); HYPRE_BoomerAMGSetEuSparseA(pcg_precond, eu_sparse_A); HYPRE_BoomerAMGSetMaxLevels(pcg_precond, max_levels); HYPRE_BoomerAMGSetMaxRowSum(pcg_precond, max_row_sum); HYPRE_BoomerAMGSetNumFunctions(pcg_precond, num_functions); HYPRE_BoomerAMGSetAggNumLevels(pcg_precond, agg_num_levels); HYPRE_BoomerAMGSetAggInterpType(pcg_precond, agg_interp_type); HYPRE_BoomerAMGSetAggTruncFactor(pcg_precond, agg_trunc_factor); HYPRE_BoomerAMGSetAggP12TruncFactor(pcg_precond, agg_P12_trunc_factor); HYPRE_BoomerAMGSetAggPMaxElmts(pcg_precond, agg_P_max_elmts); HYPRE_BoomerAMGSetAggP12MaxElmts(pcg_precond, agg_P12_max_elmts); HYPRE_BoomerAMGSetNumPaths(pcg_precond, num_paths); HYPRE_BoomerAMGSetNodal(pcg_precond, nodal); HYPRE_BoomerAMGSetNodalDiag(pcg_precond, nodal_diag); HYPRE_BoomerAMGSetCycleNumSweeps(pcg_precond, ns_coarse, 3); if (num_functions > 1) { HYPRE_BoomerAMGSetDofFunc(pcg_precond, dof_func); } HYPRE_BoomerAMGSetAdditive(pcg_precond, additive); HYPRE_BoomerAMGSetMultAdditive(pcg_precond, mult_add); HYPRE_BoomerAMGSetSimple(pcg_precond, simple); HYPRE_BoomerAMGSetMultAddPMaxElmts(pcg_precond, add_P_max_elmts); HYPRE_BoomerAMGSetMultAddTruncFactor(pcg_precond, add_trunc_factor); HYPRE_BoomerAMGSetRAP2(pcg_precond, rap2); HYPRE_BoomerAMGSetKeepTranspose(pcg_precond, keepTranspose); if (nongalerk_tol) { HYPRE_BoomerAMGSetNonGalerkinTol(pcg_precond, nongalerk_tol[nongalerk_num_tol - 1]); for (i = 0; i < nongalerk_num_tol - 1; i++) { HYPRE_BoomerAMGSetLevelNonGalerkinTol(pcg_precond, nongalerk_tol[i], i); } } HYPRE_GMRESSetMaxIter(pcg_solver, mg_max_iter); HYPRE_GMRESSetPrecond(pcg_solver, (HYPRE_PtrToSolverFcn) HYPRE_BoomerAMGSolve, (HYPRE_PtrToSolverFcn) HYPRE_BoomerAMGSetup, pcg_precond); } else if (solver_id == 18) { /* use ParaSails preconditioner */ if (myid == 0) { hypre_printf("Solver: ParaSails-GMRES\n"); } HYPRE_ParaSailsCreate(hypre_MPI_COMM_WORLD, &pcg_precond); HYPRE_ParaSailsSetParams(pcg_precond, sai_threshold, max_levels); HYPRE_ParaSailsSetFilter(pcg_precond, sai_filter); HYPRE_ParaSailsSetLogging(pcg_precond, poutdat); HYPRE_ParaSailsSetSym(pcg_precond, 0); HYPRE_GMRESSetPrecond(pcg_solver, (HYPRE_PtrToSolverFcn) HYPRE_ParaSailsSolve, (HYPRE_PtrToSolverFcn) HYPRE_ParaSailsSetup, pcg_precond); } else if (solver_id == 44) { /* use Euclid preconditioning */ if (myid == 0) { hypre_printf("Solver: Euclid-GMRES\n"); } HYPRE_EuclidCreate(hypre_MPI_COMM_WORLD, &pcg_precond); if (eu_level > -1) { HYPRE_EuclidSetLevel(pcg_precond, eu_level); } if (eu_ilut) { HYPRE_EuclidSetILUT(pcg_precond, eu_ilut); } if (eu_sparse_A) { HYPRE_EuclidSetSparseA(pcg_precond, eu_sparse_A); } if (eu_row_scale) { HYPRE_EuclidSetRowScale(pcg_precond, eu_row_scale); } if (eu_bj) { HYPRE_EuclidSetBJ(pcg_precond, eu_bj); } HYPRE_EuclidSetStats(pcg_precond, eu_stats); HYPRE_EuclidSetMem(pcg_precond, eu_mem); /*HYPRE_EuclidSetParams(pcg_precond, argc, argv);*/ HYPRE_GMRESSetPrecond (pcg_solver, (HYPRE_PtrToSolverFcn) HYPRE_EuclidSolve, (HYPRE_PtrToSolverFcn) HYPRE_EuclidSetup, pcg_precond); } HYPRE_GMRESGetPrecond(pcg_solver, &pcg_precond_gotten); if (pcg_precond_gotten != pcg_precond) { hypre_printf("HYPRE_GMRESGetPrecond got bad precond\n"); return (-1); } else if (myid == 0) { hypre_printf("HYPRE_GMRESGetPrecond got good precond\n"); } HYPRE_GMRESSetup (pcg_solver, (HYPRE_Matrix)parcsr_A, (HYPRE_Vector)b, (HYPRE_Vector)x); hypre_EndTiming(time_index); hypre_PrintTiming("Setup phase times", hypre_MPI_COMM_WORLD); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); time_index = hypre_InitializeTiming("GMRES Solve"); hypre_BeginTiming(time_index); HYPRE_GMRESSolve (pcg_solver, (HYPRE_Matrix)parcsr_A, (HYPRE_Vector)b, (HYPRE_Vector)x); hypre_EndTiming(time_index); hypre_PrintTiming("Solve phase times", hypre_MPI_COMM_WORLD); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); HYPRE_GMRESGetNumIterations(pcg_solver, &num_iterations); HYPRE_GMRESGetFinalRelativeResidualNorm(pcg_solver, &final_res_norm); #if SECOND_TIME /* run a second time to check for memory leaks */ HYPRE_ParVectorSetRandomValues(x, 775); HYPRE_GMRESSetup(pcg_solver, (HYPRE_Matrix)parcsr_A, (HYPRE_Vector)b, (HYPRE_Vector)x); HYPRE_GMRESSolve(pcg_solver, (HYPRE_Matrix)parcsr_A, (HYPRE_Vector)b, (HYPRE_Vector)x); #endif HYPRE_ParCSRGMRESDestroy(pcg_solver); if (solver_id == 3 || solver_id == 15) { HYPRE_BoomerAMGDestroy(pcg_precond); } if (solver_id == 7) { HYPRE_ParCSRPilutDestroy(pcg_precond); } else if (solver_id == 18) { HYPRE_ParaSailsDestroy(pcg_precond); } else if (solver_id == 44) { HYPRE_EuclidDestroy(pcg_precond); } if (myid == 0) { hypre_printf("\n"); hypre_printf("GMRES Iterations = %d\n", num_iterations); hypre_printf("Final GMRES Relative Residual Norm = %e\n", final_res_norm); hypre_printf("\n"); } } /*----------------------------------------------------------- * Solve the system using LGMRES *-----------------------------------------------------------*/ if (solver_id == 50 || solver_id == 51 ) { time_index = hypre_InitializeTiming("LGMRES Setup"); hypre_BeginTiming(time_index); HYPRE_ParCSRLGMRESCreate(hypre_MPI_COMM_WORLD, &pcg_solver); HYPRE_LGMRESSetKDim(pcg_solver, k_dim); HYPRE_LGMRESSetAugDim(pcg_solver, aug_dim); HYPRE_LGMRESSetMaxIter(pcg_solver, max_iter); HYPRE_LGMRESSetTol(pcg_solver, tol); HYPRE_LGMRESSetAbsoluteTol(pcg_solver, atol); HYPRE_LGMRESSetLogging(pcg_solver, 1); HYPRE_LGMRESSetPrintLevel(pcg_solver, ioutdat); if (solver_id == 51) { /* use BoomerAMG as preconditioner */ if (myid == 0) { hypre_printf("Solver: AMG-LGMRES\n"); } HYPRE_BoomerAMGCreate(&pcg_precond); HYPRE_BoomerAMGSetCGCIts(pcg_precond, cgcits); HYPRE_BoomerAMGSetInterpType(pcg_precond, interp_type); HYPRE_BoomerAMGSetPostInterpType(pcg_precond, post_interp_type); HYPRE_BoomerAMGSetNumSamples(pcg_precond, gsmg_samples); HYPRE_BoomerAMGSetTol(pcg_precond, pc_tol); HYPRE_BoomerAMGSetCoarsenType(pcg_precond, coarsen_type); HYPRE_BoomerAMGSetMeasureType(pcg_precond, measure_type); HYPRE_BoomerAMGSetStrongThreshold(pcg_precond, strong_threshold); HYPRE_BoomerAMGSetSeqThreshold(pcg_precond, seq_threshold); HYPRE_BoomerAMGSetRedundant(pcg_precond, redundant); HYPRE_BoomerAMGSetMaxCoarseSize(pcg_precond, coarse_threshold); HYPRE_BoomerAMGSetMinCoarseSize(pcg_precond, min_coarse_size); HYPRE_BoomerAMGSetTruncFactor(pcg_precond, trunc_factor); HYPRE_BoomerAMGSetPMaxElmts(pcg_precond, P_max_elmts); HYPRE_BoomerAMGSetJacobiTruncThreshold(pcg_precond, jacobi_trunc_threshold); HYPRE_BoomerAMGSetSCommPkgSwitch(pcg_precond, S_commpkg_switch); HYPRE_BoomerAMGSetPrintLevel(pcg_precond, poutdat); HYPRE_BoomerAMGSetPrintFileName(pcg_precond, "driver.out.log"); HYPRE_BoomerAMGSetMaxIter(pcg_precond, 1); HYPRE_BoomerAMGSetCycleType(pcg_precond, cycle_type); HYPRE_BoomerAMGSetNumSweeps(pcg_precond, num_sweeps); HYPRE_BoomerAMGSetISType(pcg_precond, IS_type); HYPRE_BoomerAMGSetNumCRRelaxSteps(pcg_precond, num_CR_relax_steps); HYPRE_BoomerAMGSetCRRate(pcg_precond, CR_rate); HYPRE_BoomerAMGSetCRStrongTh(pcg_precond, CR_strong_th); HYPRE_BoomerAMGSetCRUseCG(pcg_precond, CR_use_CG); HYPRE_BoomerAMGSetRelaxType(pcg_precond, relax_type); if (relax_down > -1) { HYPRE_BoomerAMGSetCycleRelaxType(pcg_precond, relax_down, 1); } if (relax_up > -1) { HYPRE_BoomerAMGSetCycleRelaxType(pcg_precond, relax_up, 2); } if (relax_coarse > -1) { HYPRE_BoomerAMGSetCycleRelaxType(pcg_precond, relax_coarse, 3); } HYPRE_BoomerAMGSetChebyOrder(pcg_precond, cheby_order); HYPRE_BoomerAMGSetChebyFraction(pcg_precond, cheby_fraction); HYPRE_BoomerAMGSetRelaxOrder(pcg_precond, relax_order); HYPRE_BoomerAMGSetRelaxWt(pcg_precond, relax_wt); HYPRE_BoomerAMGSetOuterWt(pcg_precond, outer_wt); if (level_w > -1) { HYPRE_BoomerAMGSetLevelRelaxWt(pcg_precond, relax_wt_level, level_w); } if (level_ow > -1) { HYPRE_BoomerAMGSetLevelOuterWt(pcg_precond, outer_wt_level, level_ow); } HYPRE_BoomerAMGSetSmoothType(pcg_precond, smooth_type); HYPRE_BoomerAMGSetSmoothNumLevels(pcg_precond, smooth_num_levels); HYPRE_BoomerAMGSetSmoothNumSweeps(pcg_precond, smooth_num_sweeps); HYPRE_BoomerAMGSetMaxLevels(pcg_precond, max_levels); HYPRE_BoomerAMGSetMaxRowSum(pcg_precond, max_row_sum); HYPRE_BoomerAMGSetNumFunctions(pcg_precond, num_functions); HYPRE_BoomerAMGSetAggNumLevels(pcg_precond, agg_num_levels); HYPRE_BoomerAMGSetAggInterpType(pcg_precond, agg_interp_type); HYPRE_BoomerAMGSetAggTruncFactor(pcg_precond, agg_trunc_factor); HYPRE_BoomerAMGSetAggP12TruncFactor(pcg_precond, agg_P12_trunc_factor); HYPRE_BoomerAMGSetAggPMaxElmts(pcg_precond, agg_P_max_elmts); HYPRE_BoomerAMGSetAggP12MaxElmts(pcg_precond, agg_P12_max_elmts); HYPRE_BoomerAMGSetNumPaths(pcg_precond, num_paths); HYPRE_BoomerAMGSetNodal(pcg_precond, nodal); HYPRE_BoomerAMGSetNodalDiag(pcg_precond, nodal_diag); HYPRE_BoomerAMGSetVariant(pcg_precond, variant); HYPRE_BoomerAMGSetOverlap(pcg_precond, overlap); HYPRE_BoomerAMGSetDomainType(pcg_precond, domain_type); HYPRE_BoomerAMGSetSchwarzUseNonSymm(pcg_precond, use_nonsymm_schwarz); HYPRE_BoomerAMGSetSchwarzRlxWeight(pcg_precond, schwarz_rlx_weight); if (eu_level < 0) { eu_level = 0; } HYPRE_BoomerAMGSetEuLevel(pcg_precond, eu_level); HYPRE_BoomerAMGSetEuBJ(pcg_precond, eu_bj); HYPRE_BoomerAMGSetEuSparseA(pcg_precond, eu_sparse_A); HYPRE_BoomerAMGSetCycleNumSweeps(pcg_precond, ns_coarse, 3); if (num_functions > 1) { HYPRE_BoomerAMGSetDofFunc(pcg_precond, dof_func); } HYPRE_BoomerAMGSetAdditive(pcg_precond, additive); HYPRE_BoomerAMGSetMultAdditive(pcg_precond, mult_add); HYPRE_BoomerAMGSetSimple(pcg_precond, simple); HYPRE_BoomerAMGSetMultAddPMaxElmts(pcg_precond, add_P_max_elmts); HYPRE_BoomerAMGSetMultAddTruncFactor(pcg_precond, add_trunc_factor); HYPRE_BoomerAMGSetRAP2(pcg_precond, rap2); HYPRE_BoomerAMGSetKeepTranspose(pcg_precond, keepTranspose); if (nongalerk_tol) { HYPRE_BoomerAMGSetNonGalerkinTol(pcg_precond, nongalerk_tol[nongalerk_num_tol - 1]); for (i = 0; i < nongalerk_num_tol - 1; i++) { HYPRE_BoomerAMGSetLevelNonGalerkinTol(pcg_precond, nongalerk_tol[i], i); } } HYPRE_LGMRESSetMaxIter(pcg_solver, mg_max_iter); HYPRE_LGMRESSetPrecond(pcg_solver, (HYPRE_PtrToSolverFcn) HYPRE_BoomerAMGSolve, (HYPRE_PtrToSolverFcn) HYPRE_BoomerAMGSetup, pcg_precond); } else if (solver_id == 50) { /* use diagonal scaling as preconditioner */ if (myid == 0) { hypre_printf("Solver: DS-LGMRES\n"); } pcg_precond = NULL; HYPRE_LGMRESSetPrecond(pcg_solver, (HYPRE_PtrToSolverFcn) HYPRE_ParCSRDiagScale, (HYPRE_PtrToSolverFcn) HYPRE_ParCSRDiagScaleSetup, pcg_precond); } HYPRE_LGMRESGetPrecond(pcg_solver, &pcg_precond_gotten); if (pcg_precond_gotten != pcg_precond) { hypre_printf("HYPRE_LGMRESGetPrecond got bad precond\n"); return (-1); } else if (myid == 0) { hypre_printf("HYPRE_LGMRESGetPrecond got good precond\n"); } HYPRE_LGMRESSetup (pcg_solver, (HYPRE_Matrix)parcsr_A, (HYPRE_Vector)b, (HYPRE_Vector)x); hypre_EndTiming(time_index); hypre_PrintTiming("Setup phase times", hypre_MPI_COMM_WORLD); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); time_index = hypre_InitializeTiming("LGMRES Solve"); hypre_BeginTiming(time_index); HYPRE_LGMRESSolve (pcg_solver, (HYPRE_Matrix)parcsr_A, (HYPRE_Vector)b, (HYPRE_Vector)x); hypre_EndTiming(time_index); hypre_PrintTiming("Solve phase times", hypre_MPI_COMM_WORLD); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); HYPRE_LGMRESGetNumIterations(pcg_solver, &num_iterations); HYPRE_LGMRESGetFinalRelativeResidualNorm(pcg_solver, &final_res_norm); HYPRE_ParCSRLGMRESDestroy(pcg_solver); if (solver_id == 51) { HYPRE_BoomerAMGDestroy(pcg_precond); } if (myid == 0) { hypre_printf("\n"); hypre_printf("LGMRES Iterations = %d\n", num_iterations); hypre_printf("Final LGMRES Relative Residual Norm = %e\n", final_res_norm); hypre_printf("\n"); } } /*----------------------------------------------------------- * Solve the system using FlexGMRES *-----------------------------------------------------------*/ if (solver_id == 60 || solver_id == 61 ) { time_index = hypre_InitializeTiming("FlexGMRES Setup"); hypre_BeginTiming(time_index); HYPRE_ParCSRFlexGMRESCreate(hypre_MPI_COMM_WORLD, &pcg_solver); HYPRE_FlexGMRESSetKDim(pcg_solver, k_dim); HYPRE_FlexGMRESSetMaxIter(pcg_solver, max_iter); HYPRE_FlexGMRESSetTol(pcg_solver, tol); HYPRE_FlexGMRESSetAbsoluteTol(pcg_solver, atol); HYPRE_FlexGMRESSetLogging(pcg_solver, 1); HYPRE_FlexGMRESSetPrintLevel(pcg_solver, ioutdat); if (solver_id == 61) { /* use BoomerAMG as preconditioner */ if (myid == 0) { hypre_printf("Solver: AMG-FlexGMRES\n"); } HYPRE_BoomerAMGCreate(&pcg_precond); HYPRE_BoomerAMGSetCGCIts(pcg_precond, cgcits); HYPRE_BoomerAMGSetInterpType(pcg_precond, interp_type); HYPRE_BoomerAMGSetPostInterpType(pcg_precond, post_interp_type); HYPRE_BoomerAMGSetNumSamples(pcg_precond, gsmg_samples); HYPRE_BoomerAMGSetTol(pcg_precond, pc_tol); HYPRE_BoomerAMGSetCoarsenType(pcg_precond, coarsen_type); HYPRE_BoomerAMGSetMeasureType(pcg_precond, measure_type); HYPRE_BoomerAMGSetStrongThreshold(pcg_precond, strong_threshold); HYPRE_BoomerAMGSetSeqThreshold(pcg_precond, seq_threshold); HYPRE_BoomerAMGSetRedundant(pcg_precond, redundant); HYPRE_BoomerAMGSetMaxCoarseSize(pcg_precond, coarse_threshold); HYPRE_BoomerAMGSetMinCoarseSize(pcg_precond, min_coarse_size); HYPRE_BoomerAMGSetTruncFactor(pcg_precond, trunc_factor); HYPRE_BoomerAMGSetPMaxElmts(pcg_precond, P_max_elmts); HYPRE_BoomerAMGSetJacobiTruncThreshold(pcg_precond, jacobi_trunc_threshold); HYPRE_BoomerAMGSetSCommPkgSwitch(pcg_precond, S_commpkg_switch); HYPRE_BoomerAMGSetPrintLevel(pcg_precond, poutdat); HYPRE_BoomerAMGSetPrintFileName(pcg_precond, "driver.out.log"); HYPRE_BoomerAMGSetMaxIter(pcg_precond, 1); HYPRE_BoomerAMGSetCycleType(pcg_precond, cycle_type); HYPRE_BoomerAMGSetNumSweeps(pcg_precond, num_sweeps); HYPRE_BoomerAMGSetISType(pcg_precond, IS_type); HYPRE_BoomerAMGSetNumCRRelaxSteps(pcg_precond, num_CR_relax_steps); HYPRE_BoomerAMGSetCRRate(pcg_precond, CR_rate); HYPRE_BoomerAMGSetCRStrongTh(pcg_precond, CR_strong_th); HYPRE_BoomerAMGSetCRUseCG(pcg_precond, CR_use_CG); HYPRE_BoomerAMGSetRelaxType(pcg_precond, relax_type); if (relax_down > -1) { HYPRE_BoomerAMGSetCycleRelaxType(pcg_precond, relax_down, 1); } if (relax_up > -1) { HYPRE_BoomerAMGSetCycleRelaxType(pcg_precond, relax_up, 2); } if (relax_coarse > -1) { HYPRE_BoomerAMGSetCycleRelaxType(pcg_precond, relax_coarse, 3); } HYPRE_BoomerAMGSetChebyOrder(pcg_precond, cheby_order); HYPRE_BoomerAMGSetChebyFraction(pcg_precond, cheby_fraction); HYPRE_BoomerAMGSetRelaxOrder(pcg_precond, relax_order); HYPRE_BoomerAMGSetRelaxWt(pcg_precond, relax_wt); HYPRE_BoomerAMGSetOuterWt(pcg_precond, outer_wt); if (level_w > -1) { HYPRE_BoomerAMGSetLevelRelaxWt(pcg_precond, relax_wt_level, level_w); } if (level_ow > -1) { HYPRE_BoomerAMGSetLevelOuterWt(pcg_precond, outer_wt_level, level_ow); } HYPRE_BoomerAMGSetSmoothType(pcg_precond, smooth_type); HYPRE_BoomerAMGSetSmoothNumLevels(pcg_precond, smooth_num_levels); HYPRE_BoomerAMGSetSmoothNumSweeps(pcg_precond, smooth_num_sweeps); HYPRE_BoomerAMGSetMaxLevels(pcg_precond, max_levels); HYPRE_BoomerAMGSetMaxRowSum(pcg_precond, max_row_sum); HYPRE_BoomerAMGSetNumFunctions(pcg_precond, num_functions); HYPRE_BoomerAMGSetAggNumLevels(pcg_precond, agg_num_levels); HYPRE_BoomerAMGSetAggInterpType(pcg_precond, agg_interp_type); HYPRE_BoomerAMGSetAggTruncFactor(pcg_precond, agg_trunc_factor); HYPRE_BoomerAMGSetAggP12TruncFactor(pcg_precond, agg_P12_trunc_factor); HYPRE_BoomerAMGSetAggPMaxElmts(pcg_precond, agg_P_max_elmts); HYPRE_BoomerAMGSetAggP12MaxElmts(pcg_precond, agg_P12_max_elmts); HYPRE_BoomerAMGSetNumPaths(pcg_precond, num_paths); HYPRE_BoomerAMGSetNodal(pcg_precond, nodal); HYPRE_BoomerAMGSetNodalDiag(pcg_precond, nodal_diag); HYPRE_BoomerAMGSetVariant(pcg_precond, variant); HYPRE_BoomerAMGSetOverlap(pcg_precond, overlap); HYPRE_BoomerAMGSetDomainType(pcg_precond, domain_type); HYPRE_BoomerAMGSetSchwarzUseNonSymm(pcg_precond, use_nonsymm_schwarz); HYPRE_BoomerAMGSetSchwarzRlxWeight(pcg_precond, schwarz_rlx_weight); if (eu_level < 0) { eu_level = 0; } HYPRE_BoomerAMGSetEuLevel(pcg_precond, eu_level); HYPRE_BoomerAMGSetEuBJ(pcg_precond, eu_bj); HYPRE_BoomerAMGSetEuSparseA(pcg_precond, eu_sparse_A); HYPRE_BoomerAMGSetCycleNumSweeps(pcg_precond, ns_coarse, 3); if (num_functions > 1) { HYPRE_BoomerAMGSetDofFunc(pcg_precond, dof_func); } HYPRE_BoomerAMGSetAdditive(pcg_precond, additive); HYPRE_BoomerAMGSetMultAdditive(pcg_precond, mult_add); HYPRE_BoomerAMGSetSimple(pcg_precond, simple); HYPRE_BoomerAMGSetMultAddPMaxElmts(pcg_precond, add_P_max_elmts); HYPRE_BoomerAMGSetMultAddTruncFactor(pcg_precond, add_trunc_factor); HYPRE_BoomerAMGSetRAP2(pcg_precond, rap2); HYPRE_BoomerAMGSetKeepTranspose(pcg_precond, keepTranspose); if (nongalerk_tol) { HYPRE_BoomerAMGSetNonGalerkinTol(pcg_precond, nongalerk_tol[nongalerk_num_tol - 1]); for (i = 0; i < nongalerk_num_tol - 1; i++) { HYPRE_BoomerAMGSetLevelNonGalerkinTol(pcg_precond, nongalerk_tol[i], i); } } HYPRE_FlexGMRESSetMaxIter(pcg_solver, mg_max_iter); HYPRE_FlexGMRESSetPrecond(pcg_solver, (HYPRE_PtrToSolverFcn) HYPRE_BoomerAMGSolve, (HYPRE_PtrToSolverFcn) HYPRE_BoomerAMGSetup, pcg_precond); } else if (solver_id == 60) { /* use diagonal scaling as preconditioner */ if (myid == 0) { hypre_printf("Solver: DS-FlexGMRES\n"); } pcg_precond = NULL; HYPRE_FlexGMRESSetPrecond(pcg_solver, (HYPRE_PtrToSolverFcn) HYPRE_ParCSRDiagScale, (HYPRE_PtrToSolverFcn) HYPRE_ParCSRDiagScaleSetup, pcg_precond); } HYPRE_FlexGMRESGetPrecond(pcg_solver, &pcg_precond_gotten); if (pcg_precond_gotten != pcg_precond) { hypre_printf("HYPRE_FlexGMRESGetPrecond got bad precond\n"); return (-1); } else if (myid == 0) { hypre_printf("HYPRE_FlexGMRESGetPrecond got good precond\n"); } /* this is optional - could be a user defined one instead (see ex5.c)*/ HYPRE_FlexGMRESSetModifyPC( pcg_solver, (HYPRE_PtrToModifyPCFcn) hypre_FlexGMRESModifyPCDefault); HYPRE_FlexGMRESSetup (pcg_solver, (HYPRE_Matrix)parcsr_A, (HYPRE_Vector)b, (HYPRE_Vector)x); hypre_EndTiming(time_index); hypre_PrintTiming("Setup phase times", hypre_MPI_COMM_WORLD); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); time_index = hypre_InitializeTiming("FlexGMRES Solve"); hypre_BeginTiming(time_index); HYPRE_FlexGMRESSolve (pcg_solver, (HYPRE_Matrix)parcsr_A, (HYPRE_Vector)b, (HYPRE_Vector)x); hypre_EndTiming(time_index); hypre_PrintTiming("Solve phase times", hypre_MPI_COMM_WORLD); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); HYPRE_FlexGMRESGetNumIterations(pcg_solver, &num_iterations); HYPRE_FlexGMRESGetFinalRelativeResidualNorm(pcg_solver, &final_res_norm); HYPRE_ParCSRFlexGMRESDestroy(pcg_solver); if (solver_id == 61) { HYPRE_BoomerAMGDestroy(pcg_precond); } if (myid == 0) { hypre_printf("\n"); hypre_printf("FlexGMRES Iterations = %d\n", num_iterations); hypre_printf("Final FlexGMRES Relative Residual Norm = %e\n", final_res_norm); hypre_printf("\n"); } } /*----------------------------------------------------------- * Solve the system using BiCGSTAB *-----------------------------------------------------------*/ if (solver_id == 9 || solver_id == 10 || solver_id == 11 || solver_id == 45) { time_index = hypre_InitializeTiming("BiCGSTAB Setup"); hypre_BeginTiming(time_index); HYPRE_ParCSRBiCGSTABCreate(hypre_MPI_COMM_WORLD, &pcg_solver); HYPRE_BiCGSTABSetMaxIter(pcg_solver, max_iter); HYPRE_BiCGSTABSetTol(pcg_solver, tol); HYPRE_BiCGSTABSetAbsoluteTol(pcg_solver, atol); HYPRE_BiCGSTABSetLogging(pcg_solver, ioutdat); HYPRE_BiCGSTABSetPrintLevel(pcg_solver, ioutdat); if (solver_id == 9) { /* use BoomerAMG as preconditioner */ if (myid == 0) { hypre_printf("Solver: AMG-BiCGSTAB\n"); } HYPRE_BoomerAMGCreate(&pcg_precond); HYPRE_BoomerAMGSetCGCIts(pcg_precond, cgcits); HYPRE_BoomerAMGSetInterpType(pcg_precond, interp_type); HYPRE_BoomerAMGSetPostInterpType(pcg_precond, post_interp_type); HYPRE_BoomerAMGSetNumSamples(pcg_precond, gsmg_samples); HYPRE_BoomerAMGSetTol(pcg_precond, pc_tol); HYPRE_BoomerAMGSetCoarsenType(pcg_precond, coarsen_type); HYPRE_BoomerAMGSetMeasureType(pcg_precond, measure_type); HYPRE_BoomerAMGSetStrongThreshold(pcg_precond, strong_threshold); HYPRE_BoomerAMGSetSeqThreshold(pcg_precond, seq_threshold); HYPRE_BoomerAMGSetRedundant(pcg_precond, redundant); HYPRE_BoomerAMGSetMaxCoarseSize(pcg_precond, coarse_threshold); HYPRE_BoomerAMGSetMinCoarseSize(pcg_precond, min_coarse_size); HYPRE_BoomerAMGSetTruncFactor(pcg_precond, trunc_factor); HYPRE_BoomerAMGSetPMaxElmts(pcg_precond, P_max_elmts); HYPRE_BoomerAMGSetJacobiTruncThreshold(pcg_precond, jacobi_trunc_threshold); HYPRE_BoomerAMGSetSCommPkgSwitch(pcg_precond, S_commpkg_switch); HYPRE_BoomerAMGSetPrintLevel(pcg_precond, poutdat); HYPRE_BoomerAMGSetPrintFileName(pcg_precond, "driver.out.log"); HYPRE_BoomerAMGSetMaxIter(pcg_precond, 1); HYPRE_BoomerAMGSetCycleType(pcg_precond, cycle_type); HYPRE_BoomerAMGSetNumSweeps(pcg_precond, num_sweeps); HYPRE_BoomerAMGSetISType(pcg_precond, IS_type); HYPRE_BoomerAMGSetNumCRRelaxSteps(pcg_precond, num_CR_relax_steps); HYPRE_BoomerAMGSetCRRate(pcg_precond, CR_rate); HYPRE_BoomerAMGSetCRStrongTh(pcg_precond, CR_strong_th); HYPRE_BoomerAMGSetCRUseCG(pcg_precond, CR_use_CG); HYPRE_BoomerAMGSetRelaxType(pcg_precond, relax_type); if (relax_down > -1) { HYPRE_BoomerAMGSetCycleRelaxType(pcg_precond, relax_down, 1); } if (relax_up > -1) { HYPRE_BoomerAMGSetCycleRelaxType(pcg_precond, relax_up, 2); } if (relax_coarse > -1) { HYPRE_BoomerAMGSetCycleRelaxType(pcg_precond, relax_coarse, 3); } HYPRE_BoomerAMGSetChebyOrder(pcg_precond, cheby_order); HYPRE_BoomerAMGSetChebyFraction(pcg_precond, cheby_fraction); HYPRE_BoomerAMGSetRelaxOrder(pcg_precond, relax_order); HYPRE_BoomerAMGSetRelaxWt(pcg_precond, relax_wt); HYPRE_BoomerAMGSetOuterWt(pcg_precond, outer_wt); if (level_w > -1) { HYPRE_BoomerAMGSetLevelRelaxWt(pcg_precond, relax_wt_level, level_w); } if (level_ow > -1) { HYPRE_BoomerAMGSetLevelOuterWt(pcg_precond, outer_wt_level, level_ow); } HYPRE_BoomerAMGSetSmoothType(pcg_precond, smooth_type); HYPRE_BoomerAMGSetSmoothNumLevels(pcg_precond, smooth_num_levels); HYPRE_BoomerAMGSetSmoothNumSweeps(pcg_precond, smooth_num_sweeps); HYPRE_BoomerAMGSetMaxLevels(pcg_precond, max_levels); HYPRE_BoomerAMGSetMaxRowSum(pcg_precond, max_row_sum); HYPRE_BoomerAMGSetNumFunctions(pcg_precond, num_functions); HYPRE_BoomerAMGSetAggNumLevels(pcg_precond, agg_num_levels); HYPRE_BoomerAMGSetAggInterpType(pcg_precond, agg_interp_type); HYPRE_BoomerAMGSetAggTruncFactor(pcg_precond, agg_trunc_factor); HYPRE_BoomerAMGSetAggP12TruncFactor(pcg_precond, agg_P12_trunc_factor); HYPRE_BoomerAMGSetAggPMaxElmts(pcg_precond, agg_P_max_elmts); HYPRE_BoomerAMGSetAggP12MaxElmts(pcg_precond, agg_P12_max_elmts); HYPRE_BoomerAMGSetNumPaths(pcg_precond, num_paths); HYPRE_BoomerAMGSetNodal(pcg_precond, nodal); HYPRE_BoomerAMGSetNodalDiag(pcg_precond, nodal_diag); HYPRE_BoomerAMGSetVariant(pcg_precond, variant); HYPRE_BoomerAMGSetOverlap(pcg_precond, overlap); HYPRE_BoomerAMGSetDomainType(pcg_precond, domain_type); HYPRE_BoomerAMGSetSchwarzUseNonSymm(pcg_precond, use_nonsymm_schwarz); HYPRE_BoomerAMGSetSchwarzRlxWeight(pcg_precond, schwarz_rlx_weight); if (eu_level < 0) { eu_level = 0; } HYPRE_BoomerAMGSetEuLevel(pcg_precond, eu_level); HYPRE_BoomerAMGSetEuBJ(pcg_precond, eu_bj); HYPRE_BoomerAMGSetEuSparseA(pcg_precond, eu_sparse_A); HYPRE_BoomerAMGSetCycleNumSweeps(pcg_precond, ns_coarse, 3); if (num_functions > 1) { HYPRE_BoomerAMGSetDofFunc(pcg_precond, dof_func); } HYPRE_BoomerAMGSetAdditive(pcg_precond, additive); HYPRE_BoomerAMGSetMultAdditive(pcg_precond, mult_add); HYPRE_BoomerAMGSetSimple(pcg_precond, simple); HYPRE_BoomerAMGSetMultAddPMaxElmts(pcg_precond, add_P_max_elmts); HYPRE_BoomerAMGSetMultAddTruncFactor(pcg_precond, add_trunc_factor); HYPRE_BoomerAMGSetRAP2(pcg_precond, rap2); HYPRE_BoomerAMGSetKeepTranspose(pcg_precond, keepTranspose); if (nongalerk_tol) { HYPRE_BoomerAMGSetNonGalerkinTol(pcg_precond, nongalerk_tol[nongalerk_num_tol - 1]); for (i = 0; i < nongalerk_num_tol - 1; i++) { HYPRE_BoomerAMGSetLevelNonGalerkinTol(pcg_precond, nongalerk_tol[i], i); } } HYPRE_BiCGSTABSetMaxIter(pcg_solver, mg_max_iter); HYPRE_BiCGSTABSetPrecond(pcg_solver, (HYPRE_PtrToSolverFcn) HYPRE_BoomerAMGSolve, (HYPRE_PtrToSolverFcn) HYPRE_BoomerAMGSetup, pcg_precond); } else if (solver_id == 10) { /* use diagonal scaling as preconditioner */ if (myid == 0) { hypre_printf("Solver: DS-BiCGSTAB\n"); } pcg_precond = NULL; HYPRE_BiCGSTABSetPrecond(pcg_solver, (HYPRE_PtrToSolverFcn) HYPRE_ParCSRDiagScale, (HYPRE_PtrToSolverFcn) HYPRE_ParCSRDiagScaleSetup, pcg_precond); } else if (solver_id == 11) { /* use PILUT as preconditioner */ if (myid == 0) { hypre_printf("Solver: PILUT-BiCGSTAB\n"); } ierr = HYPRE_ParCSRPilutCreate( hypre_MPI_COMM_WORLD, &pcg_precond ); if (ierr) { hypre_printf("Error in ParPilutCreate\n"); } HYPRE_BiCGSTABSetPrecond(pcg_solver, (HYPRE_PtrToSolverFcn) HYPRE_ParCSRPilutSolve, (HYPRE_PtrToSolverFcn) HYPRE_ParCSRPilutSetup, pcg_precond); if (drop_tol >= 0 ) HYPRE_ParCSRPilutSetDropTolerance( pcg_precond, drop_tol ); if (nonzeros_to_keep >= 0 ) HYPRE_ParCSRPilutSetFactorRowSize( pcg_precond, nonzeros_to_keep ); } else if (solver_id == 45) { /* use Euclid preconditioning */ if (myid == 0) { hypre_printf("Solver: Euclid-BICGSTAB\n"); } HYPRE_EuclidCreate(hypre_MPI_COMM_WORLD, &pcg_precond); /* note: There are three three methods of setting run-time parameters for Euclid: (see HYPRE_parcsr_ls.h); here we'll use what I think is simplest: let Euclid internally parse the command line. */ if (eu_level > -1) { HYPRE_EuclidSetLevel(pcg_precond, eu_level); } if (eu_ilut) { HYPRE_EuclidSetILUT(pcg_precond, eu_ilut); } if (eu_sparse_A) { HYPRE_EuclidSetSparseA(pcg_precond, eu_sparse_A); } if (eu_row_scale) { HYPRE_EuclidSetRowScale(pcg_precond, eu_row_scale); } if (eu_bj) { HYPRE_EuclidSetBJ(pcg_precond, eu_bj); } HYPRE_EuclidSetStats(pcg_precond, eu_stats); HYPRE_EuclidSetMem(pcg_precond, eu_mem); /*HYPRE_EuclidSetParams(pcg_precond, argc, argv);*/ HYPRE_BiCGSTABSetPrecond(pcg_solver, (HYPRE_PtrToSolverFcn) HYPRE_EuclidSolve, (HYPRE_PtrToSolverFcn) HYPRE_EuclidSetup, pcg_precond); } HYPRE_BiCGSTABSetup(pcg_solver, (HYPRE_Matrix)parcsr_A, (HYPRE_Vector)b, (HYPRE_Vector)x); hypre_EndTiming(time_index); hypre_PrintTiming("Setup phase times", hypre_MPI_COMM_WORLD); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); time_index = hypre_InitializeTiming("BiCGSTAB Solve"); hypre_BeginTiming(time_index); HYPRE_BiCGSTABSolve(pcg_solver, (HYPRE_Matrix)parcsr_A, (HYPRE_Vector)b, (HYPRE_Vector)x); hypre_EndTiming(time_index); hypre_PrintTiming("Solve phase times", hypre_MPI_COMM_WORLD); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); HYPRE_BiCGSTABGetNumIterations(pcg_solver, &num_iterations); HYPRE_BiCGSTABGetFinalRelativeResidualNorm(pcg_solver, &final_res_norm); #if SECOND_TIME /* run a second time to check for memory leaks */ HYPRE_ParVectorSetRandomValues(x, 775); HYPRE_BiCGSTABSetup(pcg_solver, (HYPRE_Matrix)parcsr_A, (HYPRE_Vector)b, (HYPRE_Vector)x); HYPRE_BiCGSTABSolve(pcg_solver, (HYPRE_Matrix)parcsr_A, (HYPRE_Vector)b, (HYPRE_Vector)x); #endif HYPRE_ParCSRBiCGSTABDestroy(pcg_solver); if (solver_id == 9) { HYPRE_BoomerAMGDestroy(pcg_precond); } if (solver_id == 11) { HYPRE_ParCSRPilutDestroy(pcg_precond); } else if (solver_id == 45) { HYPRE_EuclidDestroy(pcg_precond); } if (myid == 0) { hypre_printf("\n"); hypre_printf("BiCGSTAB Iterations = %d\n", num_iterations); hypre_printf("Final BiCGSTAB Relative Residual Norm = %e\n", final_res_norm); hypre_printf("\n"); } } /*----------------------------------------------------------- * Solve the system using CGNR *-----------------------------------------------------------*/ if (solver_id == 5 || solver_id == 6) { time_index = hypre_InitializeTiming("CGNR Setup"); hypre_BeginTiming(time_index); HYPRE_ParCSRCGNRCreate(hypre_MPI_COMM_WORLD, &pcg_solver); HYPRE_CGNRSetMaxIter(pcg_solver, max_iter); HYPRE_CGNRSetTol(pcg_solver, tol); HYPRE_CGNRSetLogging(pcg_solver, ioutdat); if (solver_id == 5) { /* use BoomerAMG as preconditioner */ if (myid == 0) { hypre_printf("Solver: AMG-CGNR\n"); } HYPRE_BoomerAMGCreate(&pcg_precond); HYPRE_BoomerAMGSetCGCIts(pcg_precond, cgcits); HYPRE_BoomerAMGSetInterpType(pcg_precond, interp_type); HYPRE_BoomerAMGSetPostInterpType(pcg_precond, post_interp_type); HYPRE_BoomerAMGSetNumSamples(pcg_precond, gsmg_samples); HYPRE_BoomerAMGSetTol(pcg_precond, pc_tol); HYPRE_BoomerAMGSetCoarsenType(pcg_precond, coarsen_type); HYPRE_BoomerAMGSetMeasureType(pcg_precond, measure_type); HYPRE_BoomerAMGSetStrongThreshold(pcg_precond, strong_threshold); HYPRE_BoomerAMGSetSeqThreshold(pcg_precond, seq_threshold); HYPRE_BoomerAMGSetRedundant(pcg_precond, redundant); HYPRE_BoomerAMGSetMaxCoarseSize(pcg_precond, coarse_threshold); HYPRE_BoomerAMGSetMinCoarseSize(pcg_precond, min_coarse_size); HYPRE_BoomerAMGSetTruncFactor(pcg_precond, trunc_factor); HYPRE_BoomerAMGSetPMaxElmts(pcg_precond, P_max_elmts); HYPRE_BoomerAMGSetJacobiTruncThreshold(pcg_precond, jacobi_trunc_threshold); HYPRE_BoomerAMGSetSCommPkgSwitch(pcg_precond, S_commpkg_switch); HYPRE_BoomerAMGSetPrintLevel(pcg_precond, poutdat); HYPRE_BoomerAMGSetPrintFileName(pcg_precond, "driver.out.log"); HYPRE_BoomerAMGSetMaxIter(pcg_precond, 1); HYPRE_BoomerAMGSetCycleType(pcg_precond, cycle_type); HYPRE_BoomerAMGSetNumSweeps(pcg_precond, num_sweeps); HYPRE_BoomerAMGSetRelaxType(pcg_precond, relax_type); if (relax_down > -1) { HYPRE_BoomerAMGSetCycleRelaxType(pcg_precond, relax_down, 1); } if (relax_up > -1) { HYPRE_BoomerAMGSetCycleRelaxType(pcg_precond, relax_up, 2); } if (relax_coarse > -1) { HYPRE_BoomerAMGSetCycleRelaxType(pcg_precond, relax_coarse, 3); } HYPRE_BoomerAMGSetChebyOrder(pcg_precond, cheby_order); HYPRE_BoomerAMGSetChebyFraction(pcg_precond, cheby_fraction); HYPRE_BoomerAMGSetRelaxOrder(pcg_precond, relax_order); HYPRE_BoomerAMGSetRelaxWt(pcg_precond, relax_wt); HYPRE_BoomerAMGSetOuterWt(pcg_precond, outer_wt); if (level_w > -1) { HYPRE_BoomerAMGSetLevelRelaxWt(pcg_precond, relax_wt_level, level_w); } if (level_ow > -1) { HYPRE_BoomerAMGSetLevelOuterWt(pcg_precond, outer_wt_level, level_ow); } HYPRE_BoomerAMGSetSmoothType(pcg_precond, smooth_type); HYPRE_BoomerAMGSetSmoothNumLevels(pcg_precond, smooth_num_levels); HYPRE_BoomerAMGSetSmoothNumSweeps(pcg_precond, smooth_num_sweeps); HYPRE_BoomerAMGSetMaxLevels(pcg_precond, max_levels); HYPRE_BoomerAMGSetMaxRowSum(pcg_precond, max_row_sum); HYPRE_BoomerAMGSetNumFunctions(pcg_precond, num_functions); HYPRE_BoomerAMGSetAggNumLevels(pcg_precond, agg_num_levels); HYPRE_BoomerAMGSetAggInterpType(pcg_precond, agg_interp_type); HYPRE_BoomerAMGSetAggTruncFactor(pcg_precond, agg_trunc_factor); HYPRE_BoomerAMGSetAggP12TruncFactor(pcg_precond, agg_P12_trunc_factor); HYPRE_BoomerAMGSetAggPMaxElmts(pcg_precond, agg_P_max_elmts); HYPRE_BoomerAMGSetAggP12MaxElmts(pcg_precond, agg_P12_max_elmts); HYPRE_BoomerAMGSetNumPaths(pcg_precond, num_paths); HYPRE_BoomerAMGSetNodal(pcg_precond, nodal); HYPRE_BoomerAMGSetNodalDiag(pcg_precond, nodal_diag); HYPRE_BoomerAMGSetVariant(pcg_precond, variant); HYPRE_BoomerAMGSetOverlap(pcg_precond, overlap); HYPRE_BoomerAMGSetDomainType(pcg_precond, domain_type); if (num_functions > 1) { HYPRE_BoomerAMGSetDofFunc(pcg_precond, dof_func); } HYPRE_BoomerAMGSetAdditive(pcg_precond, additive); HYPRE_BoomerAMGSetMultAdditive(pcg_precond, mult_add); HYPRE_BoomerAMGSetSimple(pcg_precond, simple); HYPRE_BoomerAMGSetMultAddPMaxElmts(pcg_precond, add_P_max_elmts); HYPRE_BoomerAMGSetMultAddTruncFactor(pcg_precond, add_trunc_factor); HYPRE_BoomerAMGSetRAP2(pcg_precond, rap2); HYPRE_BoomerAMGSetKeepTranspose(pcg_precond, keepTranspose); if (nongalerk_tol) { HYPRE_BoomerAMGSetNonGalerkinTol(pcg_precond, nongalerk_tol[nongalerk_num_tol - 1]); for (i = 0; i < nongalerk_num_tol - 1; i++) { HYPRE_BoomerAMGSetLevelNonGalerkinTol(pcg_precond, nongalerk_tol[i], i); } } HYPRE_CGNRSetMaxIter(pcg_solver, mg_max_iter); HYPRE_CGNRSetPrecond(pcg_solver, (HYPRE_PtrToSolverFcn) HYPRE_BoomerAMGSolve, (HYPRE_PtrToSolverFcn) HYPRE_BoomerAMGSolveT, (HYPRE_PtrToSolverFcn) HYPRE_BoomerAMGSetup, pcg_precond); } else if (solver_id == 6) { /* use diagonal scaling as preconditioner */ if (myid == 0) { hypre_printf("Solver: DS-CGNR\n"); } pcg_precond = NULL; HYPRE_CGNRSetPrecond(pcg_solver, (HYPRE_PtrToSolverFcn) HYPRE_ParCSRDiagScale, (HYPRE_PtrToSolverFcn) HYPRE_ParCSRDiagScale, (HYPRE_PtrToSolverFcn) HYPRE_ParCSRDiagScaleSetup, pcg_precond); } HYPRE_CGNRGetPrecond(pcg_solver, &pcg_precond_gotten); if (pcg_precond_gotten != pcg_precond) { hypre_printf("HYPRE_ParCSRCGNRGetPrecond got bad precond\n"); return (-1); } else if (myid == 0) { hypre_printf("HYPRE_ParCSRCGNRGetPrecond got good precond\n"); } HYPRE_CGNRSetup(pcg_solver, (HYPRE_Matrix)parcsr_A, (HYPRE_Vector)b, (HYPRE_Vector)x); hypre_EndTiming(time_index); hypre_PrintTiming("Setup phase times", hypre_MPI_COMM_WORLD); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); time_index = hypre_InitializeTiming("CGNR Solve"); hypre_BeginTiming(time_index); HYPRE_CGNRSolve(pcg_solver, (HYPRE_Matrix)parcsr_A, (HYPRE_Vector)b, (HYPRE_Vector)x); hypre_EndTiming(time_index); hypre_PrintTiming("Solve phase times", hypre_MPI_COMM_WORLD); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); HYPRE_CGNRGetNumIterations(pcg_solver, &num_iterations); HYPRE_CGNRGetFinalRelativeResidualNorm(pcg_solver, &final_res_norm); #if SECOND_TIME /* run a second time to check for memory leaks */ HYPRE_ParVectorSetRandomValues(x, 775); HYPRE_CGNRSetup(pcg_solver, (HYPRE_Matrix)parcsr_A, (HYPRE_Vector)b, (HYPRE_Vector)x); HYPRE_CGNRSolve(pcg_solver, (HYPRE_Matrix)parcsr_A, (HYPRE_Vector)b, (HYPRE_Vector)x); #endif HYPRE_ParCSRCGNRDestroy(pcg_solver); if (solver_id == 5) { HYPRE_BoomerAMGDestroy(pcg_precond); } if (myid == 0) { hypre_printf("\n"); hypre_printf("Iterations = %d\n", num_iterations); hypre_printf("Final Relative Residual Norm = %e\n", final_res_norm); hypre_printf("\n"); } } /*----------------------------------------------------------- * Print the solution and other info *-----------------------------------------------------------*/ /* RDF: Why is this here? */ if (!(build_rhs_type == 1 || build_rhs_type == 7)) { HYPRE_IJVectorGetObjectType(ij_b, &j); } if (print_system) { HYPRE_IJVectorPrint(ij_x, "IJ.out.x"); } /*----------------------------------------------------------- * Finalize things *-----------------------------------------------------------*/ if (test_ij || build_matrix_type == -1) { HYPRE_IJMatrixDestroy(ij_A); } else { HYPRE_ParCSRMatrixDestroy(parcsr_A); } /* for build_rhs_type = 1 or 7, we did not create ij_b - just b*/ if (build_rhs_type == 1 || build_rhs_type == 7) { HYPRE_ParVectorDestroy(b); } else { HYPRE_IJVectorDestroy(ij_b); } HYPRE_IJVectorDestroy(ij_x); if (build_rbm) { for (i = 0; i < num_interp_vecs; i++) { HYPRE_IJVectorDestroy(ij_rbm[i]); } hypre_TFree(ij_rbm, HYPRE_MEMORY_HOST); hypre_TFree(interp_vecs, HYPRE_MEMORY_HOST); } if (nongalerk_tol) { hypre_TFree(nongalerk_tol, HYPRE_MEMORY_HOST); } hypre_MPI_Finalize(); return (0); } /*---------------------------------------------------------------------- * Build matrix from file. Expects three files on each processor. * filename.D.n contains the diagonal part, filename.O.n contains * the offdiagonal part and filename.INFO.n contains global row * and column numbers, number of columns of offdiagonal matrix * and the mapping of offdiagonal column numbers to global column numbers. * Parameters given in command line. *----------------------------------------------------------------------*/ HYPRE_Int BuildParFromFile( HYPRE_Int argc, char *argv[], HYPRE_Int arg_index, HYPRE_ParCSRMatrix *A_ptr ) { char *filename; HYPRE_ParCSRMatrix A; HYPRE_Int myid; /*----------------------------------------------------------- * Initialize some stuff *-----------------------------------------------------------*/ hypre_MPI_Comm_rank(hypre_MPI_COMM_WORLD, &myid ); /*----------------------------------------------------------- * Parse command line *-----------------------------------------------------------*/ if (arg_index < argc) { filename = argv[arg_index]; } else { hypre_printf("Error: No filename specified \n"); exit(1); } /*----------------------------------------------------------- * Print driver parameters *-----------------------------------------------------------*/ if (myid == 0) { hypre_printf(" FromFile: %s\n", filename); } /*----------------------------------------------------------- * Generate the matrix *-----------------------------------------------------------*/ HYPRE_ParCSRMatrixRead(hypre_MPI_COMM_WORLD, filename, &A); *A_ptr = A; return (0); } /*---------------------------------------------------------------------- * Build rhs from file. Expects two files on each processor. * filename.n contains the data and * and filename.INFO.n contains global row * numbers *----------------------------------------------------------------------*/ HYPRE_Int BuildParRhsFromFile( HYPRE_Int argc, char *argv[], HYPRE_Int arg_index, HYPRE_ParVector *b_ptr ) { char *filename; HYPRE_ParVector b; HYPRE_Int myid; /*----------------------------------------------------------- * Initialize some stuff *-----------------------------------------------------------*/ hypre_MPI_Comm_rank(hypre_MPI_COMM_WORLD, &myid ); /*----------------------------------------------------------- * Parse command line *-----------------------------------------------------------*/ if (arg_index < argc) { filename = argv[arg_index]; } else { hypre_printf("Error: No filename specified \n"); exit(1); } /*----------------------------------------------------------- * Print driver parameters *-----------------------------------------------------------*/ if (myid == 0) { hypre_printf(" RhsFromParFile: %s\n", filename); } /*----------------------------------------------------------- * Generate the matrix *-----------------------------------------------------------*/ HYPRE_ParVectorRead(hypre_MPI_COMM_WORLD, filename, &b); *b_ptr = b; return (0); } /*---------------------------------------------------------------------- * Build standard 7-point laplacian in 3D with grid and anisotropy. * Parameters given in command line. *----------------------------------------------------------------------*/ HYPRE_Int BuildParLaplacian( HYPRE_Int argc, char *argv[], HYPRE_Int arg_index, HYPRE_ParCSRMatrix *A_ptr ) { HYPRE_Int nx, ny, nz; HYPRE_Int P, Q, R; HYPRE_Real cx, cy, cz; HYPRE_ParCSRMatrix A; HYPRE_Int num_procs, myid; HYPRE_Int p, q, r; HYPRE_Int num_fun = 1; HYPRE_Real *values; HYPRE_Real *mtrx; HYPRE_Real ep = .1; HYPRE_Int system_vcoef = 0; HYPRE_Int sys_opt = 0; HYPRE_Int vcoef_opt = 0; /*----------------------------------------------------------- * Initialize some stuff *-----------------------------------------------------------*/ hypre_MPI_Comm_size(hypre_MPI_COMM_WORLD, &num_procs ); hypre_MPI_Comm_rank(hypre_MPI_COMM_WORLD, &myid ); /*----------------------------------------------------------- * Set defaults *-----------------------------------------------------------*/ nx = 10; ny = 10; nz = 10; P = 1; Q = num_procs; R = 1; cx = 1.; cy = 1.; cz = 1.; /*----------------------------------------------------------- * Parse command line *-----------------------------------------------------------*/ arg_index = 0; while (arg_index < argc) { if ( strcmp(argv[arg_index], "-n") == 0 ) { arg_index++; nx = atoi(argv[arg_index++]); ny = atoi(argv[arg_index++]); nz = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-P") == 0 ) { arg_index++; P = atoi(argv[arg_index++]); Q = atoi(argv[arg_index++]); R = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-c") == 0 ) { arg_index++; cx = (HYPRE_Real)atof(argv[arg_index++]); cy = (HYPRE_Real)atof(argv[arg_index++]); cz = (HYPRE_Real)atof(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-sysL") == 0 ) { arg_index++; num_fun = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-sysL_opt") == 0 ) { arg_index++; sys_opt = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-sys_vcoef") == 0 ) { /* have to use -sysL for this to */ arg_index++; system_vcoef = 1; } else if ( strcmp(argv[arg_index], "-sys_vcoef_opt") == 0 ) { arg_index++; vcoef_opt = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-ep") == 0 ) { arg_index++; ep = (HYPRE_Real)atof(argv[arg_index++]); } else { arg_index++; } } /*----------------------------------------------------------- * Check a few things *-----------------------------------------------------------*/ if ((P * Q * R) != num_procs) { hypre_printf("Error: Invalid number of processors or processor topology \n"); exit(1); } /*----------------------------------------------------------- * Print driver parameters *-----------------------------------------------------------*/ if (myid == 0) { hypre_printf(" Laplacian: num_fun = %d\n", num_fun); hypre_printf(" (nx, ny, nz) = (%d, %d, %d)\n", nx, ny, nz); hypre_printf(" (Px, Py, Pz) = (%d, %d, %d)\n", P, Q, R); hypre_printf(" (cx, cy, cz) = (%f, %f, %f)\n\n", cx, cy, cz); } /*----------------------------------------------------------- * Set up the grid structure *-----------------------------------------------------------*/ /* compute p,q,r from P,Q,R and myid */ p = myid % P; q = (( myid - p) / P) % Q; r = ( myid - p - P * q) / ( P * Q ); /*----------------------------------------------------------- * Generate the matrix *-----------------------------------------------------------*/ values = hypre_CTAlloc(HYPRE_Real, 4, HYPRE_MEMORY_HOST); values[1] = -cx; values[2] = -cy; values[3] = -cz; values[0] = 0.; if (nx > 1) { values[0] += 2.0 * cx; } if (ny > 1) { values[0] += 2.0 * cy; } if (nz > 1) { values[0] += 2.0 * cz; } if (num_fun == 1) A = (HYPRE_ParCSRMatrix) GenerateLaplacian(hypre_MPI_COMM_WORLD, nx, ny, nz, P, Q, R, p, q, r, values); else { mtrx = hypre_CTAlloc(HYPRE_Real, num_fun * num_fun, HYPRE_MEMORY_HOST); if (num_fun == 2) { if (sys_opt == 1) /* identity */ { mtrx[0] = 1.0; mtrx[1] = 0.0; mtrx[2] = 0.0; mtrx[3] = 1.0; } else if (sys_opt == 2) { mtrx[0] = 1.0; mtrx[1] = 0.0; mtrx[2] = 0.0; mtrx[3] = 20.0; } else if (sys_opt == 3) /* similar to barry's talk - ex1 */ { mtrx[0] = 1.0; mtrx[1] = 2.0; mtrx[2] = 2.0; mtrx[3] = 1.0; } else if (sys_opt == 4) /* can use with vcoef to get barry's ex*/ { mtrx[0] = 1.0; mtrx[1] = 1.0; mtrx[2] = 1.0; mtrx[3] = 1.0; } else if (sys_opt == 5) /* barry's talk - ex1 */ { mtrx[0] = 1.0; mtrx[1] = 1.1; mtrx[2] = 1.1; mtrx[3] = 1.0; } else if (sys_opt == 6) /* */ { mtrx[0] = 1.1; mtrx[1] = 1.0; mtrx[2] = 1.0; mtrx[3] = 1.1; } else /* == 0 */ { mtrx[0] = 2; mtrx[1] = 1; mtrx[2] = 1; mtrx[3] = 2; } } else if (num_fun == 3) { if (sys_opt == 1) { mtrx[0] = 1.0; mtrx[1] = 0.0; mtrx[2] = 0.0; mtrx[3] = 0.0; mtrx[4] = 1.0; mtrx[5] = 0.0; mtrx[6] = 0.0; mtrx[7] = 0.0; mtrx[8] = 1.0; } else if (sys_opt == 2) { mtrx[0] = 1.0; mtrx[1] = 0.0; mtrx[2] = 0.0; mtrx[3] = 0.0; mtrx[4] = 20.0; mtrx[5] = 0.0; mtrx[6] = 0.0; mtrx[7] = 0.0; mtrx[8] = .01; } else if (sys_opt == 3) { mtrx[0] = 1.01; mtrx[1] = 1; mtrx[2] = 0.0; mtrx[3] = 1; mtrx[4] = 2; mtrx[5] = 1; mtrx[6] = 0.0; mtrx[7] = 1; mtrx[8] = 1.01; } else if (sys_opt == 4) /* barry ex4 */ { mtrx[0] = 3; mtrx[1] = 1; mtrx[2] = 0.0; mtrx[3] = 1; mtrx[4] = 4; mtrx[5] = 2; mtrx[6] = 0.0; mtrx[7] = 2; mtrx[8] = .25; } else /* == 0 */ { mtrx[0] = 2.0; mtrx[1] = 1.0; mtrx[2] = 0.0; mtrx[3] = 1.0; mtrx[4] = 2.0; mtrx[5] = 1.0; mtrx[6] = 0.0; mtrx[7] = 1.0; mtrx[8] = 2.0; } } else if (num_fun == 4) { mtrx[0] = 1.01; mtrx[1] = 1; mtrx[2] = 0.0; mtrx[3] = 0.0; mtrx[4] = 1; mtrx[5] = 2; mtrx[6] = 1; mtrx[7] = 0.0; mtrx[8] = 0.0; mtrx[9] = 1; mtrx[10] = 1.01; mtrx[11] = 0.0; mtrx[12] = 2; mtrx[13] = 1; mtrx[14] = 0.0; mtrx[15] = 1; } if (!system_vcoef) { A = (HYPRE_ParCSRMatrix) GenerateSysLaplacian(hypre_MPI_COMM_WORLD, nx, ny, nz, P, Q, R, p, q, r, num_fun, mtrx, values); } else { HYPRE_Real *mtrx_values; mtrx_values = hypre_CTAlloc(HYPRE_Real, num_fun * num_fun * 4, HYPRE_MEMORY_HOST); if (num_fun == 2) { if (vcoef_opt == 1) { /* Barry's talk * - must also have sys_opt = 4, all fail */ mtrx[0] = 1.0; SetSysVcoefValues(num_fun, nx, ny, nz, 1.0, .10, 1.0, 0, mtrx_values); mtrx[1] = 1.0; SetSysVcoefValues(num_fun, nx, ny, nz, .1, 1.0, 1.0, 1, mtrx_values); mtrx[2] = 1.0; SetSysVcoefValues(num_fun, nx, ny, nz, .01, 1.0, 1.0, 2, mtrx_values); mtrx[3] = 1.0; SetSysVcoefValues(num_fun, nx, ny, nz, 2.0, .02, 1.0, 3, mtrx_values); } else if (vcoef_opt == 2) { /* Barry's talk * - ex2 - if have sys-opt = 4*/ mtrx[0] = 1.0; SetSysVcoefValues(num_fun, nx, ny, nz, 1.0, .010, 1.0, 0, mtrx_values); mtrx[1] = 200.0; SetSysVcoefValues(num_fun, nx, ny, nz, 1.0, 1.0, 1.0, 1, mtrx_values); mtrx[2] = 200.0; SetSysVcoefValues(num_fun, nx, ny, nz, 1.0, 1.0, 1.0, 2, mtrx_values); mtrx[3] = 1.0; SetSysVcoefValues(num_fun, nx, ny, nz, 2.0, .02, 1.0, 3, mtrx_values); } else if (vcoef_opt == 3) /* use with default sys_opt - ulrike ex 3*/ { /* mtrx[0] */ SetSysVcoefValues(num_fun, nx, ny, nz, ep * 1.0, 1.0, 1.0, 0, mtrx_values); /* mtrx[1] */ SetSysVcoefValues(num_fun, nx, ny, nz, 1.0, 1.0, 1.0, 1, mtrx_values); /* mtrx[2] */ SetSysVcoefValues(num_fun, nx, ny, nz, ep * 1.0, 1.0, 1.0, 2, mtrx_values); /* mtrx[3] */ SetSysVcoefValues(num_fun, nx, ny, nz, 1.0, 1.0, 1.0, 3, mtrx_values); } else if (vcoef_opt == 4) /* use with default sys_opt - ulrike ex 4*/ { HYPRE_Real ep2 = ep; /* mtrx[0] */ SetSysVcoefValues(num_fun, nx, ny, nz, ep * 1.0, 1.0, 1.0, 0, mtrx_values); /* mtrx[1] */ SetSysVcoefValues(num_fun, nx, ny, nz, 1.0, ep * 1.0, 1.0, 1, mtrx_values); /* mtrx[2] */ SetSysVcoefValues(num_fun, nx, ny, nz, ep * 1.0, 1.0, 1.0, 2, mtrx_values); /* mtrx[3] */ SetSysVcoefValues(num_fun, nx, ny, nz, 1.0, ep2 * 1.0, 1.0, 3, mtrx_values); } else if (vcoef_opt == 5) /* use with default sys_opt - */ { HYPRE_Real alp, beta; alp = .001; beta = 10; /* mtrx[0] */ SetSysVcoefValues(num_fun, nx, ny, nz, alp * 1.0, 1.0, 1.0, 0, mtrx_values); /* mtrx[1] */ SetSysVcoefValues(num_fun, nx, ny, nz, 1.0, beta * 1.0, 1.0, 1, mtrx_values); /* mtrx[2] */ SetSysVcoefValues(num_fun, nx, ny, nz, alp * 1.0, 1.0, 1.0, 2, mtrx_values); /* mtrx[3] */ SetSysVcoefValues(num_fun, nx, ny, nz, 1.0, beta * 1.0, 1.0, 3, mtrx_values); } else /* = 0 */ { /* mtrx[0] */ SetSysVcoefValues(num_fun, nx, ny, nz, 1.0, 1.0, 1.0, 0, mtrx_values); /* mtrx[1] */ SetSysVcoefValues(num_fun, nx, ny, nz, 1.0, 2.0, 1.0, 1, mtrx_values); /* mtrx[2] */ SetSysVcoefValues(num_fun, nx, ny, nz, 2.0, 1.0, 0.0, 2, mtrx_values); /* mtrx[3] */ SetSysVcoefValues(num_fun, nx, ny, nz, 1.0, 3.0, 1.0, 3, mtrx_values); } } else if (num_fun == 3) { mtrx[0] = 1; SetSysVcoefValues(num_fun, nx, ny, nz, 1, .01, 1, 0, mtrx_values); mtrx[1] = 1; SetSysVcoefValues(num_fun, nx, ny, nz, 1, 1, 1, 1, mtrx_values); mtrx[2] = 0.0; SetSysVcoefValues(num_fun, nx, ny, nz, 1, 1, 1, 2, mtrx_values); mtrx[3] = 1; SetSysVcoefValues(num_fun, nx, ny, nz, 1, 1, 1, 3, mtrx_values); mtrx[4] = 1; SetSysVcoefValues(num_fun, nx, ny, nz, 2, .02, 1, 4, mtrx_values); mtrx[5] = 2; SetSysVcoefValues(num_fun, nx, ny, nz, 1, 1, 1, 5, mtrx_values); mtrx[6] = 0.0; SetSysVcoefValues(num_fun, nx, ny, nz, 1, 1, 1, 6, mtrx_values); mtrx[7] = 2; SetSysVcoefValues(num_fun, nx, ny, nz, 1, 1, 1, 7, mtrx_values); mtrx[8] = 1; SetSysVcoefValues(num_fun, nx, ny, nz, 1.5, .04, 1, 8, mtrx_values); } A = (HYPRE_ParCSRMatrix) GenerateSysLaplacianVCoef(hypre_MPI_COMM_WORLD, nx, ny, nz, P, Q, R, p, q, r, num_fun, mtrx, mtrx_values); hypre_TFree(mtrx_values, HYPRE_MEMORY_HOST); } hypre_TFree(mtrx, HYPRE_MEMORY_HOST); } hypre_TFree(values, HYPRE_MEMORY_HOST); *A_ptr = A; return (0); } /*---------------------------------------------------------------------- * Build standard 7-point convection-diffusion operator * Parameters given in command line. * Operator: * * -cx Dxx - cy Dyy - cz Dzz + ax Dx + ay Dy + az Dz = f * *----------------------------------------------------------------------*/ HYPRE_Int BuildParDifConv( HYPRE_Int argc, char *argv[], HYPRE_Int arg_index, HYPRE_ParCSRMatrix *A_ptr ) { HYPRE_Int nx, ny, nz; HYPRE_Int P, Q, R; HYPRE_Real cx, cy, cz; HYPRE_Real ax, ay, az; HYPRE_Real hinx, hiny, hinz; HYPRE_ParCSRMatrix A; HYPRE_Int num_procs, myid; HYPRE_Int p, q, r; HYPRE_Real *values; /*----------------------------------------------------------- * Initialize some stuff *-----------------------------------------------------------*/ hypre_MPI_Comm_size(hypre_MPI_COMM_WORLD, &num_procs ); hypre_MPI_Comm_rank(hypre_MPI_COMM_WORLD, &myid ); /*----------------------------------------------------------- * Set defaults *-----------------------------------------------------------*/ nx = 10; ny = 10; nz = 10; P = 1; Q = num_procs; R = 1; cx = 1.; cy = 1.; cz = 1.; ax = 1.; ay = 1.; az = 1.; /*----------------------------------------------------------- * Parse command line *-----------------------------------------------------------*/ arg_index = 0; while (arg_index < argc) { if ( strcmp(argv[arg_index], "-n") == 0 ) { arg_index++; nx = atoi(argv[arg_index++]); ny = atoi(argv[arg_index++]); nz = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-P") == 0 ) { arg_index++; P = atoi(argv[arg_index++]); Q = atoi(argv[arg_index++]); R = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-c") == 0 ) { arg_index++; cx = (HYPRE_Real)atof(argv[arg_index++]); cy = (HYPRE_Real)atof(argv[arg_index++]); cz = (HYPRE_Real)atof(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-a") == 0 ) { arg_index++; ax = (HYPRE_Real)atof(argv[arg_index++]); ay = (HYPRE_Real)atof(argv[arg_index++]); az = (HYPRE_Real)atof(argv[arg_index++]); } else { arg_index++; } } /*----------------------------------------------------------- * Check a few things *-----------------------------------------------------------*/ if ((P * Q * R) != num_procs) { hypre_printf("Error: Invalid number of processors or processor topology \n"); exit(1); } /*----------------------------------------------------------- * Print driver parameters *-----------------------------------------------------------*/ if (myid == 0) { hypre_printf(" Convection-Diffusion: \n"); hypre_printf(" -cx Dxx - cy Dyy - cz Dzz + ax Dx + ay Dy + az Dz = f\n"); hypre_printf(" (nx, ny, nz) = (%d, %d, %d)\n", nx, ny, nz); hypre_printf(" (Px, Py, Pz) = (%d, %d, %d)\n", P, Q, R); hypre_printf(" (cx, cy, cz) = (%f, %f, %f)\n", cx, cy, cz); hypre_printf(" (ax, ay, az) = (%f, %f, %f)\n\n", ax, ay, az); } /*----------------------------------------------------------- * Set up the grid structure *-----------------------------------------------------------*/ /* compute p,q,r from P,Q,R and myid */ p = myid % P; q = (( myid - p) / P) % Q; r = ( myid - p - P * q) / ( P * Q ); hinx = 1. / (nx + 1); hiny = 1. / (ny + 1); hinz = 1. / (nz + 1); /*----------------------------------------------------------- * Generate the matrix *-----------------------------------------------------------*/ values = hypre_CTAlloc(HYPRE_Real, 7, HYPRE_MEMORY_HOST); values[1] = -cx / (hinx * hinx); values[2] = -cy / (hiny * hiny); values[3] = -cz / (hinz * hinz); values[4] = -cx / (hinx * hinx) + ax / hinx; values[5] = -cy / (hiny * hiny) + ay / hiny; values[6] = -cz / (hinz * hinz) + az / hinz; values[0] = 0.; if (nx > 1) { values[0] += 2.0 * cx / (hinx * hinx) - 1.*ax / hinx; } if (ny > 1) { values[0] += 2.0 * cy / (hiny * hiny) - 1.*ay / hiny; } if (nz > 1) { values[0] += 2.0 * cz / (hinz * hinz) - 1.*az / hinz; } A = (HYPRE_ParCSRMatrix) GenerateDifConv(hypre_MPI_COMM_WORLD, nx, ny, nz, P, Q, R, p, q, r, values); hypre_TFree(values, HYPRE_MEMORY_HOST); *A_ptr = A; return (0); } /*---------------------------------------------------------------------- * Build matrix from one file on Proc. 0. Expects matrix to be in * CSR format. Distributes matrix across processors giving each about * the same number of rows. * Parameters given in command line. *----------------------------------------------------------------------*/ HYPRE_Int BuildParFromOneFile( HYPRE_Int argc, char *argv[], HYPRE_Int arg_index, HYPRE_Int num_functions, HYPRE_ParCSRMatrix *A_ptr ) { char *filename; HYPRE_ParCSRMatrix A; HYPRE_CSRMatrix A_CSR = NULL; HYPRE_Int myid, numprocs; HYPRE_Int i, rest, size, num_nodes, num_dofs; HYPRE_Int *row_part; HYPRE_Int *col_part; /*----------------------------------------------------------- * Initialize some stuff *-----------------------------------------------------------*/ hypre_MPI_Comm_rank(hypre_MPI_COMM_WORLD, &myid ); hypre_MPI_Comm_size(hypre_MPI_COMM_WORLD, &numprocs ); /*----------------------------------------------------------- * Parse command line *-----------------------------------------------------------*/ if (arg_index < argc) { filename = argv[arg_index]; } else { hypre_printf("Error: No filename specified \n"); exit(1); } /*----------------------------------------------------------- * Print driver parameters *-----------------------------------------------------------*/ if (myid == 0) { hypre_printf(" FromFile: %s\n", filename); /*----------------------------------------------------------- * Generate the matrix *-----------------------------------------------------------*/ A_CSR = HYPRE_CSRMatrixRead(filename); } row_part = NULL; col_part = NULL; if (myid == 0 && num_functions > 1) { HYPRE_CSRMatrixGetNumRows(A_CSR, &num_dofs); num_nodes = num_dofs / num_functions; if (num_dofs != num_functions * num_nodes) { row_part = NULL; col_part = NULL; } else { row_part = hypre_CTAlloc(HYPRE_Int, numprocs + 1, HYPRE_MEMORY_HOST); row_part[0] = 0; size = num_nodes / numprocs; rest = num_nodes - size * numprocs; for (i = 0; i < numprocs; i++) { row_part[i + 1] = row_part[i] + size * num_functions; if (i < rest) { row_part[i + 1] += num_functions; } } col_part = row_part; } } HYPRE_CSRMatrixToParCSRMatrix(hypre_MPI_COMM_WORLD, A_CSR, row_part, col_part, &A); *A_ptr = A; if (myid == 0) { HYPRE_CSRMatrixDestroy(A_CSR); } return (0); } /*---------------------------------------------------------------------- * Build Function array from files on different processors *----------------------------------------------------------------------*/ HYPRE_Int BuildFuncsFromFiles( HYPRE_Int argc, char *argv[], HYPRE_Int arg_index, HYPRE_ParCSRMatrix parcsr_A, HYPRE_Int **dof_func_ptr ) { /*---------------------------------------------------------------------- * Build Function array from files on different processors *----------------------------------------------------------------------*/ hypre_printf (" Feature is not implemented yet!\n"); return (0); } HYPRE_Int BuildFuncsFromOneFile( HYPRE_Int argc, char *argv[], HYPRE_Int arg_index, HYPRE_ParCSRMatrix parcsr_A, HYPRE_Int **dof_func_ptr ) { char *filename; HYPRE_Int myid, num_procs; HYPRE_Int *partitioning; HYPRE_Int *dof_func; HYPRE_Int *dof_func_local; HYPRE_Int i, j; HYPRE_Int local_size, global_size; hypre_MPI_Request *requests; hypre_MPI_Status *status, status0; MPI_Comm comm; /*----------------------------------------------------------- * Initialize some stuff *-----------------------------------------------------------*/ comm = hypre_MPI_COMM_WORLD; hypre_MPI_Comm_rank(hypre_MPI_COMM_WORLD, &myid ); hypre_MPI_Comm_size(hypre_MPI_COMM_WORLD, &num_procs ); /*----------------------------------------------------------- * Parse command line *-----------------------------------------------------------*/ if (arg_index < argc) { filename = argv[arg_index]; } else { hypre_printf("Error: No filename specified \n"); exit(1); } /*----------------------------------------------------------- * Print driver parameters *-----------------------------------------------------------*/ if (myid == 0) { FILE *fp; hypre_printf(" Funcs FromFile: %s\n", filename); /*----------------------------------------------------------- * read in the data *-----------------------------------------------------------*/ fp = fopen(filename, "r"); hypre_fscanf(fp, "%d", &global_size); dof_func = hypre_CTAlloc(HYPRE_Int, global_size, HYPRE_MEMORY_HOST); for (j = 0; j < global_size; j++) { hypre_fscanf(fp, "%d", &dof_func[j]); } fclose(fp); } HYPRE_ParCSRMatrixGetRowPartitioning(parcsr_A, &partitioning); local_size = partitioning[myid + 1] - partitioning[myid]; dof_func_local = hypre_CTAlloc(HYPRE_Int, local_size, HYPRE_MEMORY_HOST); if (myid == 0) { requests = hypre_CTAlloc(hypre_MPI_Request, num_procs - 1, HYPRE_MEMORY_HOST); status = hypre_CTAlloc(hypre_MPI_Status, num_procs - 1, HYPRE_MEMORY_HOST); j = 0; for (i = 1; i < num_procs; i++) hypre_MPI_Isend(&dof_func[partitioning[i]], partitioning[i + 1] - partitioning[i], HYPRE_MPI_INT, i, 0, comm, &requests[j++]); for (i = 0; i < local_size; i++) { dof_func_local[i] = dof_func[i]; } hypre_MPI_Waitall(num_procs - 1, requests, status); hypre_TFree(requests, HYPRE_MEMORY_HOST); hypre_TFree(status, HYPRE_MEMORY_HOST); } else { hypre_MPI_Recv(dof_func_local, local_size, HYPRE_MPI_INT, 0, 0, comm, &status0); } *dof_func_ptr = dof_func_local; if (myid == 0) { hypre_TFree(dof_func, HYPRE_MEMORY_HOST); } return (0); } /*---------------------------------------------------------------------- * Build Rhs from one file on Proc. 0. Distributes vector across processors * giving each about using the distribution of the matrix A. *----------------------------------------------------------------------*/ HYPRE_Int BuildRhsParFromOneFile( HYPRE_Int argc, char *argv[], HYPRE_Int arg_index, HYPRE_Int *partitioning, HYPRE_ParVector *b_ptr ) { char *filename; HYPRE_ParVector b; HYPRE_Vector b_CSR = NULL; HYPRE_Int myid; /*----------------------------------------------------------- * Initialize some stuff *-----------------------------------------------------------*/ hypre_MPI_Comm_rank(hypre_MPI_COMM_WORLD, &myid ); /*----------------------------------------------------------- * Parse command line *-----------------------------------------------------------*/ if (arg_index < argc) { filename = argv[arg_index]; } else { hypre_printf("Error: No filename specified \n"); exit(1); } /*----------------------------------------------------------- * Print driver parameters *-----------------------------------------------------------*/ if (myid == 0) { hypre_printf(" Rhs FromFile: %s\n", filename); /*----------------------------------------------------------- * Generate the matrix *-----------------------------------------------------------*/ b_CSR = HYPRE_VectorRead(filename); } HYPRE_VectorToParVector(hypre_MPI_COMM_WORLD, b_CSR, partitioning, &b); *b_ptr = b; HYPRE_VectorDestroy(b_CSR); return (0); } /*---------------------------------------------------------------------- * Build standard 9-point laplacian in 2D with grid and anisotropy. * Parameters given in command line. *----------------------------------------------------------------------*/ HYPRE_Int BuildParLaplacian9pt( HYPRE_Int argc, char *argv[], HYPRE_Int arg_index, HYPRE_ParCSRMatrix *A_ptr ) { HYPRE_Int nx, ny; HYPRE_Int P, Q; HYPRE_ParCSRMatrix A; HYPRE_Int num_procs, myid; HYPRE_Int p, q; HYPRE_Real *values; /*----------------------------------------------------------- * Initialize some stuff *-----------------------------------------------------------*/ hypre_MPI_Comm_size(hypre_MPI_COMM_WORLD, &num_procs ); hypre_MPI_Comm_rank(hypre_MPI_COMM_WORLD, &myid ); /*----------------------------------------------------------- * Set defaults *-----------------------------------------------------------*/ nx = 10; ny = 10; P = 1; Q = num_procs; /*----------------------------------------------------------- * Parse command line *-----------------------------------------------------------*/ arg_index = 0; while (arg_index < argc) { if ( strcmp(argv[arg_index], "-n") == 0 ) { arg_index++; nx = atoi(argv[arg_index++]); ny = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-P") == 0 ) { arg_index++; P = atoi(argv[arg_index++]); Q = atoi(argv[arg_index++]); } else { arg_index++; } } /*----------------------------------------------------------- * Check a few things *-----------------------------------------------------------*/ if ((P * Q) != num_procs) { hypre_printf("Error: Invalid number of processors or processor topology \n"); exit(1); } /*----------------------------------------------------------- * Print driver parameters *-----------------------------------------------------------*/ if (myid == 0) { hypre_printf(" Laplacian 9pt:\n"); hypre_printf(" (nx, ny) = (%d, %d)\n", nx, ny); hypre_printf(" (Px, Py) = (%d, %d)\n\n", P, Q); } /*----------------------------------------------------------- * Set up the grid structure *-----------------------------------------------------------*/ /* compute p,q from P,Q and myid */ p = myid % P; q = ( myid - p) / P; /*----------------------------------------------------------- * Generate the matrix *-----------------------------------------------------------*/ values = hypre_CTAlloc(HYPRE_Real, 2, HYPRE_MEMORY_HOST); values[1] = -1.; values[0] = 0.; if (nx > 1) { values[0] += 2.0; } if (ny > 1) { values[0] += 2.0; } if (nx > 1 && ny > 1) { values[0] += 4.0; } A = (HYPRE_ParCSRMatrix) GenerateLaplacian9pt(hypre_MPI_COMM_WORLD, nx, ny, P, Q, p, q, values); hypre_TFree(values, HYPRE_MEMORY_HOST); *A_ptr = A; return (0); } /*---------------------------------------------------------------------- * Build 27-point laplacian in 3D, * Parameters given in command line. *----------------------------------------------------------------------*/ HYPRE_Int BuildParLaplacian27pt( HYPRE_Int argc, char *argv[], HYPRE_Int arg_index, HYPRE_ParCSRMatrix *A_ptr ) { HYPRE_Int nx, ny, nz; HYPRE_Int P, Q, R; HYPRE_ParCSRMatrix A; HYPRE_Int num_procs, myid; HYPRE_Int p, q, r; HYPRE_Real *values; /*----------------------------------------------------------- * Initialize some stuff *-----------------------------------------------------------*/ hypre_MPI_Comm_size(hypre_MPI_COMM_WORLD, &num_procs ); hypre_MPI_Comm_rank(hypre_MPI_COMM_WORLD, &myid ); /*----------------------------------------------------------- * Set defaults *-----------------------------------------------------------*/ nx = 10; ny = 10; nz = 10; P = 1; Q = num_procs; R = 1; /*----------------------------------------------------------- * Parse command line *-----------------------------------------------------------*/ arg_index = 0; while (arg_index < argc) { if ( strcmp(argv[arg_index], "-n") == 0 ) { arg_index++; nx = atoi(argv[arg_index++]); ny = atoi(argv[arg_index++]); nz = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-P") == 0 ) { arg_index++; P = atoi(argv[arg_index++]); Q = atoi(argv[arg_index++]); R = atoi(argv[arg_index++]); } else { arg_index++; } } /*----------------------------------------------------------- * Check a few things *-----------------------------------------------------------*/ if ((P * Q * R) != num_procs) { hypre_printf("Error: Invalid number of processors or processor topology \n"); exit(1); } /*----------------------------------------------------------- * Print driver parameters *-----------------------------------------------------------*/ if (myid == 0) { hypre_printf(" Laplacian_27pt:\n"); hypre_printf(" (nx, ny, nz) = (%d, %d, %d)\n", nx, ny, nz); hypre_printf(" (Px, Py, Pz) = (%d, %d, %d)\n\n", P, Q, R); } /*----------------------------------------------------------- * Set up the grid structure *-----------------------------------------------------------*/ /* compute p,q,r from P,Q,R and myid */ p = myid % P; q = (( myid - p) / P) % Q; r = ( myid - p - P * q) / ( P * Q ); /*----------------------------------------------------------- * Generate the matrix *-----------------------------------------------------------*/ values = hypre_CTAlloc(HYPRE_Real, 2, HYPRE_MEMORY_HOST); values[0] = 26.0; if (nx == 1 || ny == 1 || nz == 1) { values[0] = 8.0; } if (nx * ny == 1 || nx * nz == 1 || ny * nz == 1) { values[0] = 2.0; } values[1] = -1.; A = (HYPRE_ParCSRMatrix) GenerateLaplacian27pt(hypre_MPI_COMM_WORLD, nx, ny, nz, P, Q, R, p, q, r, values); hypre_TFree(values, HYPRE_MEMORY_HOST); *A_ptr = A; return (0); } /*---------------------------------------------------------------------- * Build 7-point in 2D * Parameters given in command line. *----------------------------------------------------------------------*/ HYPRE_Int BuildParRotate7pt( HYPRE_Int argc, char *argv[], HYPRE_Int arg_index, HYPRE_ParCSRMatrix *A_ptr ) { HYPRE_Int nx, ny; HYPRE_Int P, Q; HYPRE_ParCSRMatrix A; HYPRE_Int num_procs, myid; HYPRE_Int p, q; HYPRE_Real eps, alpha; /*----------------------------------------------------------- * Initialize some stuff *-----------------------------------------------------------*/ hypre_MPI_Comm_size(hypre_MPI_COMM_WORLD, &num_procs ); hypre_MPI_Comm_rank(hypre_MPI_COMM_WORLD, &myid ); /*----------------------------------------------------------- * Set defaults *-----------------------------------------------------------*/ nx = 10; ny = 10; P = 1; Q = num_procs; /*----------------------------------------------------------- * Parse command line *-----------------------------------------------------------*/ arg_index = 0; while (arg_index < argc) { if ( strcmp(argv[arg_index], "-n") == 0 ) { arg_index++; nx = atoi(argv[arg_index++]); ny = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-P") == 0 ) { arg_index++; P = atoi(argv[arg_index++]); Q = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-alpha") == 0 ) { arg_index++; alpha = (HYPRE_Real)atof(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-eps") == 0 ) { arg_index++; eps = (HYPRE_Real)atof(argv[arg_index++]); } else { arg_index++; } } /*----------------------------------------------------------- * Check a few things *-----------------------------------------------------------*/ if ((P * Q) != num_procs) { hypre_printf("Error: Invalid number of processors or processor topology \n"); exit(1); } /*----------------------------------------------------------- * Print driver parameters *-----------------------------------------------------------*/ if (myid == 0) { hypre_printf(" Rotate 7pt:\n"); hypre_printf(" alpha = %f, eps = %f\n", alpha, eps); hypre_printf(" (nx, ny) = (%d, %d)\n", nx, ny); hypre_printf(" (Px, Py) = (%d, %d)\n", P, Q); } /*----------------------------------------------------------- * Set up the grid structure *-----------------------------------------------------------*/ /* compute p,q from P,Q and myid */ p = myid % P; q = ( myid - p) / P; /*----------------------------------------------------------- * Generate the matrix *-----------------------------------------------------------*/ A = (HYPRE_ParCSRMatrix) GenerateRotate7pt(hypre_MPI_COMM_WORLD, nx, ny, P, Q, p, q, alpha, eps); *A_ptr = A; return (0); } /*---------------------------------------------------------------------- * Build standard 7-point difference operator using centered differences * * eps*(a(x,y,z) ux)x + (b(x,y,z) uy)y + (c(x,y,z) uz)z * d(x,y,z) ux + e(x,y,z) uy + f(x,y,z) uz + g(x,y,z) u * * functions a,b,c,d,e,f,g need to be defined inside par_vardifconv.c * *----------------------------------------------------------------------*/ HYPRE_Int BuildParVarDifConv( HYPRE_Int argc, char *argv[], HYPRE_Int arg_index, HYPRE_ParCSRMatrix *A_ptr, HYPRE_ParVector *rhs_ptr ) { HYPRE_Int nx, ny, nz; HYPRE_Int P, Q, R; HYPRE_ParCSRMatrix A; HYPRE_ParVector rhs; HYPRE_Int num_procs, myid; HYPRE_Int p, q, r; HYPRE_Real eps; /*----------------------------------------------------------- * Initialize some stuff *-----------------------------------------------------------*/ hypre_MPI_Comm_size(hypre_MPI_COMM_WORLD, &num_procs ); hypre_MPI_Comm_rank(hypre_MPI_COMM_WORLD, &myid ); /*----------------------------------------------------------- * Set defaults *-----------------------------------------------------------*/ nx = 10; ny = 10; nz = 10; P = 1; Q = num_procs; R = 1; /*----------------------------------------------------------- * Parse command line *-----------------------------------------------------------*/ arg_index = 0; while (arg_index < argc) { if ( strcmp(argv[arg_index], "-n") == 0 ) { arg_index++; nx = atoi(argv[arg_index++]); ny = atoi(argv[arg_index++]); nz = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-P") == 0 ) { arg_index++; P = atoi(argv[arg_index++]); Q = atoi(argv[arg_index++]); R = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-eps") == 0 ) { arg_index++; eps = (HYPRE_Real)atof(argv[arg_index++]); } else { arg_index++; } } /*----------------------------------------------------------- * Check a few things *-----------------------------------------------------------*/ if ((P * Q * R) != num_procs) { hypre_printf("Error: Invalid number of processors or processor topology \n"); exit(1); } /*----------------------------------------------------------- * Print driver parameters *-----------------------------------------------------------*/ if (myid == 0) { hypre_printf(" ell PDE: eps = %f\n", eps); hypre_printf(" Dx(aDxu) + Dy(bDyu) + Dz(cDzu) + d Dxu + e Dyu + f Dzu + g u= f\n"); hypre_printf(" (nx, ny, nz) = (%d, %d, %d)\n", nx, ny, nz); hypre_printf(" (Px, Py, Pz) = (%d, %d, %d)\n", P, Q, R); } /*----------------------------------------------------------- * Set up the grid structure *-----------------------------------------------------------*/ /* compute p,q,r from P,Q,R and myid */ p = myid % P; q = (( myid - p) / P) % Q; r = ( myid - p - P * q) / ( P * Q ); /*----------------------------------------------------------- * Generate the matrix *-----------------------------------------------------------*/ A = (HYPRE_ParCSRMatrix) GenerateVarDifConv(hypre_MPI_COMM_WORLD, nx, ny, nz, P, Q, R, p, q, r, eps, &rhs); *A_ptr = A; *rhs_ptr = rhs; return (0); } /**************************************************************************/ HYPRE_Int SetSysVcoefValues(HYPRE_Int num_fun, HYPRE_Int nx, HYPRE_Int ny, HYPRE_Int nz, HYPRE_Real vcx, HYPRE_Real vcy, HYPRE_Real vcz, HYPRE_Int mtx_entry, HYPRE_Real *values) { HYPRE_Int sz = num_fun * num_fun; values[1 * sz + mtx_entry] = -vcx; values[2 * sz + mtx_entry] = -vcy; values[3 * sz + mtx_entry] = -vcz; values[0 * sz + mtx_entry] = 0.0; if (nx > 1) { values[0 * sz + mtx_entry] += 2.0 * vcx; } if (ny > 1) { values[0 * sz + mtx_entry] += 2.0 * vcy; } if (nz > 1) { values[0 * sz + mtx_entry] += 2.0 * vcz; } return 0; } /*---------------------------------------------------------------------- * Build coordinates for 1D/2D/3D *----------------------------------------------------------------------*/ HYPRE_Int BuildParCoordinates( HYPRE_Int argc, char *argv[], HYPRE_Int arg_index, HYPRE_Int *coorddim_ptr, float **coord_ptr ) { HYPRE_Int nx, ny, nz; HYPRE_Int P, Q, R; HYPRE_Int num_procs, myid; HYPRE_Int p, q, r; HYPRE_Int coorddim; float *coordinates; /*----------------------------------------------------------- * Initialize some stuff *-----------------------------------------------------------*/ hypre_MPI_Comm_size(hypre_MPI_COMM_WORLD, &num_procs ); hypre_MPI_Comm_rank(hypre_MPI_COMM_WORLD, &myid ); /*----------------------------------------------------------- * Set defaults *-----------------------------------------------------------*/ nx = 10; ny = 10; nz = 10; P = 1; Q = num_procs; R = 1; /*----------------------------------------------------------- * Parse command line *-----------------------------------------------------------*/ arg_index = 0; while (arg_index < argc) { if ( strcmp(argv[arg_index], "-n") == 0 ) { arg_index++; nx = atoi(argv[arg_index++]); ny = atoi(argv[arg_index++]); nz = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-P") == 0 ) { arg_index++; P = atoi(argv[arg_index++]); Q = atoi(argv[arg_index++]); R = atoi(argv[arg_index++]); } else { arg_index++; } } /* compute p,q,r from P,Q,R and myid */ p = myid % P; q = (( myid - p) / P) % Q; r = ( myid - p - P * q) / ( P * Q ); /*----------------------------------------------------------- * Generate the coordinates *-----------------------------------------------------------*/ coorddim = 3; if (nx < 2) { coorddim--; } if (ny < 2) { coorddim--; } if (nz < 2) { coorddim--; } if (coorddim > 0) { coordinates = hypre_GenerateCoordinates(hypre_MPI_COMM_WORLD, nx, ny, nz, P, Q, R, p, q, r, coorddim); } else { coordinates = NULL; } *coorddim_ptr = coorddim; *coord_ptr = coordinates; return (0); } hypre-2.33.0/src/test/runcheck.sh000077500000000000000000000072101477326011500166430ustar00rootroot00000000000000#!/bin/bash # Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) # example call # ./runcheck.sh fname.out fname.saved 1.0e-6 1.0e-6 FNAME=$1 SNAME=$2 RTOL=$3 ATOL=$4 if [ x$RTOL = "x" ]; then RTOL=0.0 fi if [ x$ATOL = "x" ]; then ATOL=-1.0 fi #echo "runcheck $1 $2 rtol = $RTOL, atol = $ATOL" awk -v ofilename="$FNAME" -v sfilename="$SNAME" 'BEGIN{ FS=" "; saved_key = 0; ln = 0; # Read saved file data into array while (getline < sfilename) { ln++; if(NF > 0 && substr($1,1,1) !~ /#/) { # loop over fields in current line for(id=1; id<=NF; id++) { # check if field is numeric if($id ~ /^-?[0-9]+/) { ln_id[saved_key]=ln; saved_line[saved_key]=$0; saved_array[saved_key]=$id; saved_key++; } } } } close(sfilename); # Read out file data into array out_key=0; ln=0; while (getline < ofilename) { ln++; if(NF > 0 && substr($1,1,1) !~ /#/) { # loop over fields in current line for(id=1; id<=NF; id++) { # check if field is numeric if($id ~ /^-?[0-9]+/) { ln_id_out[out_key]=ln; out_line[out_key]=$0; out_array[out_key]=$id; out_key++; } } } } close(ofilename); # compare data arrays if(saved_key != out_key) { printf "Number of numeric entries do not match!!\n" printf "Saved file (%d entries) Output file (%d entries)\n\n", saved_key, out_key } # compare numeric entries rtol = "'"$RTOL"'" + 0. # adding zero is necessary to convert from string to number atol = "'"$ATOL"'" + 0. # adding zero is necessary to convert from string to number for(id=0; id 0 Valgrind="" # string to add to MpirunString when using valgrind cudamemcheck="" # string to add to MpirunString when using cudamemcheck mpibind="" # string to add to MpirunString when using mpibind script="" # string to add to MpirunString when using script SaveExt="saved" # saved file extension RTOL=0 ATOL=0 RTOL_PERF=0.15 function usage { printf "\n" printf "$0 [options] {test_path}/{test_name}.sh\n" printf "\n" printf " where: {test_path} is the directory path to the test script;\n" printf " {test_name} is a user defined name for the test script\n" printf "\n" printf " with options:\n" printf " -h|-help prints this usage information and exits\n" printf " -mpi MPI run prefix; default is 'mpirun -np'\n" printf " -nthreads use 'n' OpenMP threads\n" printf " -rtol use relative tolerance 'tol' to compare numeric test values\n" printf " -atol use absolute tolerance 'tol' to compare numeric test values\n" printf " -save use '.saved. for the saved-file extension\n" printf " -valgrind use valgrind memory checker\n" printf " -cudamemcheck use CUDA memory checker\n" printf " -mpibind use mpibind\n" printf " -script use a script before the command\n" printf " -n|-norun turn off execute mode, echo what would be run\n" printf " -t|-trace echo each command\n" printf " -D define when running tests\n" printf "\n" printf " This is the hypre test driver script. It is run stand-alone\n" printf " or by the autotest regression test script. It is assumed that\n" printf " there are test directories test/TEST_{solver} that contain:\n" printf " 1. Individual test scripts named {test_name}.jobs that provide\n" printf " the mpirun execution syntax\n" printf " 2. Test run output files named {test_name}.out.{number}\n" printf " 3. Individual scripts to compare (usually using diff) output\n" printf " files from corresponding {test_name}.jobs scripts\n" printf "\n" printf " Ideally, the *.jobs and *.sh scripts can be run as stand-alone\n" printf " shell script files. A test is considered successful when there \n" printf " are no error files generated by the *.sh scripts.\n" printf "\n" printf " NOTE: This script knows about most of the ASC machines\n" printf " and will automatically use the Livermore Computing Resource\n" printf " Management (LCRM) batch system as needed.\n" printf "\n" printf " Example usage: ./runtest.sh -t TEST_sstruct/*.sh\n" printf "\n" } # generate default command based on the first 4 characters of the platform name function MpirunString { NumArgs1=$# case $HOST in *bgl*) BatchMode=1 shift MY_NUM_TASKS=$1 MY_EXECUTE_DIR=`pwd` MY_EXECUTE_JOB=`pwd`/$EXECFILE shift shift MY_ARGS="$*" RunString="mpirun -verbose 1 -np $MY_NUM_TASKS -exe $MY_EXECUTE_JOB" RunString="${RunString} -cwd $MY_EXECUTE_DIR -args \" $MY_ARGS \" " ;; up*) CPUS_PER_NODE=8 POE_NUM_PROCS=$2 POE_NUM_NODES=`expr $POE_NUM_PROCS + $CPUS_PER_NODE - 1` POE_NUM_NODES=`expr $POE_NUM_NODES / $CPUS_PER_NODE` shift shift MY_ARGS="$*" # RunString="poe $EXECFILE -rmpool pbatch -procs $POE_NUM_PROCS" # RunString="${RunString} -nodes $POE_NUM_NODES $MY_ARGS" RunString="poe $MY_ARGS -rmpool pdebug -procs $POE_NUM_PROCS -nodes $POE_NUM_NODES" ;; rzhound*|aztec*|cab*|quartz*|sierra*|syrah*|vulcan*) shift if [ $NumThreads -gt 0 ] ; then export OMP_NUM_THREADS=$NumThreads RunString="srun -p pdebug -c $NumThreads -n$1" else RunString="srun -p pdebug -n$1" fi ;; surface*) shift RunString="srun -n$1" ;; pascal*) shift RunString="srun -n$1" ;; rzansel*) shift RunString="lrun -T$1" ;; lassen*) shift RunString="lrun -n$1" ;; tioga*) shift RunString="srun -n$1" ;; node*) shift RunString="srun -n$1" ;; *) shift if [ $NumThreads -gt 0 ] ; then export OMP_NUM_THREADS=$NumThreads fi RunString="$RunPrefix $1" ;; esac NumArgs2=$(($#+1)) if [ "$NumArgs1" -eq "$NumArgs2" ] ; then shift RunString="$RunString $script $mpibind $cudamemcheck $Valgrind $*" #echo $RunString fi } # determine the "number of nodes" desired by dividing the "number of processes" # by the "number of CPU's per node" which can't be determined dynamically (real # ugly hack) function CalcNodes { NUM_PROCS=1 NUM_NODES=1 CPUS_PER_NODE=1 case $HOST in alc*) CPUS_PER_NODE=2 ;; peng*) CPUS_PER_NODE=2 ;; thun*) CPUS_PER_NODE=4 ;; *bgl*) CPUS_PER_NODE=2 ;; up*) CPUS_PER_NODE=8 ;; *dawn*) CPUS_PER_NODE=4 ;; vert*) CPUS_PER_NODE=2 ;; hera*) CPUS_PER_NODE=16 ;; *zeus*) CPUS_PER_NODE=8 ;; *) CPUS_PER_NODE=1 ;; esac while [ "$1" ] do case $1 in -n*) NUM_PROCS=$2 NUM_NODES=`expr $NUM_PROCS + $CPUS_PER_NODE - 1` NUM_NODES=`expr $NUM_NODES / $CPUS_PER_NODE` return $NUM_NODES ;; *) shift ;; esac done return 1 } # extract the "number of processes/task" function CalcProcs { while [ "$1" ] do case $1 in -n*) return $2 ;; *) shift ;; esac done return 1 } # check the path to the executable if the executable exists; save the name to # ExecFileNames function CheckPath { while [ "$1" ] do case $1 in -n*) EXECFILE=$3 if [ -x $StartDir/$EXECFILE ] ; then cp -f $StartDir/$EXECFILE $EXECFILE ExecFileNames="$ExecFileNames $EXECFILE" return 0 else echo $EXECFILE echo "Cannot find executable!!!" return 1 fi return 0 ;; *) shift ;; esac done return 1 } # initialize the common part of the " PsubCmd" string, ugly global vars! # global "RunName" is assumed to be predefined # # on ubgl, as of 8/2006, only allowable number of nodes are 32, 128 and # multiples of 512 function PsubCmdStub { CalcNodes "$@" NumNodes=$? CalcProcs "$@" NumProcs=$? case $HOST in alc*) PsubCmd="psub -c alc,pbatch -b casc -r $RunName -ln $NumProcs" ;; peng*) PsubCmd="psub -c pengra,pbatch -b casc -r $RunName -ln $NumProcs" ;; thun*) PsubCmd="psub -c thunder,pbatch -b casc -r $RunName -ln $NumNodes -g $NumProcs" ;; vert*) PsubCmd="psub -c vertex,pbatch -b casc -r $RunName -ln $NumProcs" ;; *bgl*) PsubCmd="psub -c ubgl -pool pbatch -b science -r $RunName -ln 32" ;; up*) PsubCmd="psub -c up -pool pbatch -b a_casc -r $RunName -ln $NumProcs" ;; *dawn*) PsubCmd="psub -c dawndev -pool pdebug -r $RunName" ;; hera*) PsubCmd="psub -c hera,pbatch -b casc -r $RunName -ln $NumProcs" ;; *zeus*) PsubCmd="psub -c zeus,pbatch -b casc -r $RunName -ln $NumProcs" ;; atla*) PsubCmd="psub -c atlas,pbatch -b casc -r $RunName -ln $NumProcs" ;; *) PsubCmd="psub -b casc -r $RunName -ln $NumProcs" ;; esac } # read job file line by line saving arguments function ExecuteJobs { StartDir=$1 WorkingDir=$2 TestName=$3 ReturnFlag=0 # error return flag BatchFlag=0 # #BATCH option detected flag BatchCount=0 # different numbering for #Batch option PrevPid=0 SavePWD=`pwd` ## ## move to specified directory cd $WorkingDir ## open *.jobs files for reading while read InputLine do case $InputLine in "#BATCH"*) BatchFlag=1 BatchFile="" ;; "#END"*) BatchFlag=0 chmod +x $BatchFile PsubCmd="$PsubCmd -o $OutFile -e $ErrFile `pwd`/$BatchFile" if [ "$NoRun" -eq 0 ] ; then CmdReply=`$PsubCmd` fi PrevPid=`echo $CmdReply | cut -d \ -f 2` while [ "`pstat | grep $PrevPid`" ] do sleep $JobCheckInterval done BatchFile="" ;; *"#"*) : ;; *mpirun*) RunCmd=`echo $InputLine| sed -e 's/^[[:space:]]*mpirun[[:space:]]*//'` # remove 'mpirun' RunCmd=`echo $RunCmd | sed -e 's/[[:space:]]*>.*$//'` # remove output redirect OutFile=`echo $InputLine | sed -e 's/^.*>//'` # set output file OutFile=`echo $OutFile | sed -e 's/ //g'` # remove extra space ErrFile=`echo $OutFile | sed -e 's/\.out\./.err./'` # set error file RunName=`echo $OutFile | sed -e 's/\.out.*$//'` # set test run name CheckPath $RunCmd # check path to executable if [ "$?" -gt 0 ] ; then cat >> $RunName.err <<- EOF Executable doesn't exist command: $InputLine EOF ReturnFlag=1 break fi MpirunString $RunCmd # construct "RunString" case $HOST in *bgl*) RunString="${RunString} > `pwd`/$OutFile 2>`pwd`/$ErrFile" ;; *dawn*) RunString="${RunString} > `pwd`/$OutFile 2>`pwd`/$ErrFile" ;; esac if [ "$BatchMode" -eq 0 ] ; then ${RunEcho} ${RunString} > $OutFile 2> $ErrFile $BatchFile <<- EOF cd `pwd` ${RunString} EOF chmod +x $BatchFile PsubCmdStub ${RunCmd} case $HOST in *bgl*) PsubCmd="$PsubCmd `pwd`/$BatchFile" ;; *dawn*) PsubCmd="$PsubCmd `pwd`/$BatchFile" ;; *) PsubCmd="$PsubCmd -o $OutFile -e $ErrFile `pwd`/$BatchFile" ;; esac if [ "$NoRun" -eq 0 ] ; then CmdReply=`$PsubCmd` fi PrevPid=`echo $CmdReply | cut -d \ -f 2` while [ "`pstat | grep $PrevPid`" ] do sleep $JobCheckInterval done else # BatchFlag set if [ "$BatchFile" -eq "" ] ; then BatchFile=$TestName.batch.$BatchCount BatchCount=BatchCount+1 cat > $BatchFile <<- EOF cd `pwd` ${RunString} EOF else cat >> $BatchFile <<- EOF ${RunString} EOF fi PsubCmdStub ${RunCmd} # construct a PsubCmd string fi # BatchFlag set fi # BatchMode set ;; *) NOTBLANK=`echo $InputLine | sed 's/[ \n\t]//g'` if [ "$NOTBLANK" ] ; then echo "Found something unexpected in $WorkingDir/$TestName.jobs" echo "--> $InputLine" exit 1 fi ;; esac done < $TestName.jobs # done with open *.jobs file for reading cd $SavePWD return $ReturnFlag } # compare output files as defined in *.sh files function ExecuteTest { StartDir=$1 WorkingDir=$2 TestName=$3 SaveName=$TestName.$SaveExt RTOL=$4 ATOL=$5 SavePWD=`pwd` cd $WorkingDir (cat $TestName.err.* > $TestName.err) (./$TestName.sh $RTOL $ATOL >> $TestName.err 2>&1) if [ -z $HYPRE_NO_SAVED ]; then if [ -f $SaveName ]; then # diff -U3 -bI"time" ${TestName}.saved ${TestName}.out # old way of diffing (../runcheck.sh $TestName.out $SaveName $RTOL $ATOL >> $TestName.err 2>&1) fi # check performance PerfTestName=$TestName.perf.out PerfSaveName=$TestName.perf.$SaveExt if [ -f $PerfTestName ]; then if [ -f $PerfSaveName ]; then (../runcheck.sh $PerfTestName $PerfSaveName $RTOL_PERF >> $TestName.err 2>&1) fi fi fi cd $SavePWD } # report errors from PURIFY and/or INSURE if run function PostProcess { StartDir=$1 WorkingDir=$2 TestName=$3 SavePWD=`pwd` cd $WorkingDir if [ "$BatchMode" -eq 0 ] ; then if [ -f purify.log ] ; then mv purify.log $TestName.purify.log grep -i hypre_ $TestName.purify.log >> $TestName.err elif [ -f insure.log ] ; then if [ -f ~/insure.log ] ; then cat ~/insure.log >> insure.log rm -f ~/insure.log* fi mv insure.log $TestName.insure.log grep -i hypre_ $TestName.insure.log >> $TestName.err fi fi cd $SavePWD } # removes executables from all TEST_* directories function CleanUp { if [ "$BatchMode" -eq 0 ] ; then for i in $TestDirNames do for j in $ExecFileNames do ExecuteFile=$i/$j if [ -x $ExecuteFile ] ; then rm -f $ExecuteFile fi done case $i in TEST_examples) rm -f ex? ex?? ex??f esac done fi } # process files function StartCrunch { rm -f ~/insure.log* ExecuteJobs "$@" ExecuteTest "$@" PostProcess "$@" } #========================================================================== #========================================================================== # main # Set default check tolerance while [ "$*" ] do case $1 in -h|-help) usage exit ;; -mpi) shift MPIRunPrefix=$1 shift ;; -nthreads) shift NumThreads=$1 shift ;; -rtol) shift RTOL=$1 shift ;; -atol) shift ATOL=$1 shift ;; -save) shift SaveExt=$SaveExt.$1 shift ;; -valgrind) shift Valgrind="valgrind -q --suppressions=`pwd`/runtest.valgrind --track-origins=yes --leak-check=full --show-leak-kinds=all" ;; -cudamemcheck) shift cudamemcheck="cuda-memcheck --leak-check full" ;; -mpibind) shift mpibind="mpibind" ;; -script) shift script=$1 shift ;; -n|-norun) NoRun=1 RunEcho="echo" shift ;; -t|-trace) set -xv shift ;; -D) shift eval export `echo $1`=1 shift ;; *) InputString=$1 if [ "$InputString" ] ; then if [ -r $InputString ] ; then FilePart=`basename $InputString .sh` DirPart=`dirname $InputString` CurDir=`pwd` TestDirNames="$TestDirNames $DirPart" case $DirPart in TEST_examples) # ExampleFiles="ex1 ex2 ex3 ex4 ex5 ex5f ex6 ex7 ex8 ex9 ex10 ex11 ex12 ex12f ex13 ex14 ex15" cd ../examples for file in ex* do if [ -x $file ] then cp -f $file $CurDir fi done cd $CurDir ;; esac if [ -r $DirPart/$FilePart.jobs ] ; then # Check for an mpirun routine if [ "x$MPIRunPrefix" != "x" ] then RunPrefix=$MPIRunPrefix fi StartCrunch $CurDir $DirPart $FilePart $RTOL $ATOL else printf "%s: test command file %s/%s.jobs does not exist\n" \ $0 $DirPart $FilePart exit 1 fi else printf "%s: test command file %s does not exist\n" \ $0 $InputString printf "can not find .sh file\n" exit 1 fi else printf "%s: Strange input parameter=%s\n" $0 $InputString exit 1 fi shift ;; esac done # # remove exectutable files from TEST_* directories CleanUp $TestDirNames $ExecFileNames # Filter misleading error messages cat > runtest.filters < /dev/null) ; then original=`dirname $errfile`/`basename $errfile .err`.fil echo "This file contains the original copy of $errfile before filtering" > $original cat $errfile >> $original mv $errfile $errfile.tmp egrep -v -f runtest.filters $errfile.tmp > $errfile rm -f $errfile.tmp fi done done rm -f runtest.filters hypre-2.33.0/src/test/runtest.valgrind000066400000000000000000000000001477326011500177240ustar00rootroot00000000000000hypre-2.33.0/src/test/sstruct.c000066400000000000000000007606071477326011500163750ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include #include #include #include "_hypre_utilities.h" #include "HYPRE_sstruct_ls.h" #include "HYPRE_struct_ls.h" #include "HYPRE_krylov.h" #include "_hypre_sstruct_mv.h" //#include "_hypre_struct_mv.hpp" /* begin lobpcg */ #include #include "HYPRE_lobpcg.h" #define NO_SOLVER -9198 /* end lobpcg */ #define DEBUG 0 #define SECOND_TIME 0 /*-------------------------------------------------------------------------- * Data structures *--------------------------------------------------------------------------*/ char infile_default[50] = "sstruct.in.default"; typedef HYPRE_Int Index[3]; /*------------------------------------------------------------ * ProblemIndex: * * The index has extra information stored in entries 3-8 that * determine how the index gets "mapped" to finer index spaces. * * NOTE: For implementation convenience, the index is "pre-shifted" * according to the values in entries 6,7,8. The following discussion * describes how "un-shifted" indexes are mapped, because that is a * more natural way to think about this mapping problem, and because * that is the convention used in the input file for this code. The * reason that pre-shifting is convenient is because it makes the true * value of the index on the unrefined index space readily available * in entries 0-2, hence, all operations on that unrefined space are * straightforward. Also, the only time that the extra mapping * information is needed is when an index is mapped to a new refined * index space, allowing us to isolate the mapping details to the * routine MapProblemIndex. The only other effected routine is * SScanProblemIndex, which takes the user input and pre-shifts it. * * - Entries 3,4,5 have values of either 0 or 1 that indicate * whether to map an index "to the left" or "to the right". * Here is a 1D diagram: * * -- | * | unrefined index space * | * --> | * | . | * | refined index space (factor = 3) * 0 1 * * The '*' index on the unrefined index space gets mapped to one of * the '*' indexes on the refined space based on the value (0 or 1) * of the relevent entry (3,4, or 5). The actual mapping formula is * as follows (with refinement factor, r): * * mapped_index[i] = r*index[i] + (r-1)*index[i+3] * * - Entries 6,7,8 contain "shift" information. The shift is * simply added to the mapped index just described. So, the * complete mapping formula is as follows: * * mapped_index[i] = r*index[i] + (r-1)*index[i+3] + index[i+6] * *------------------------------------------------------------*/ typedef HYPRE_Int ProblemIndex[9]; typedef struct { /* for GridSetExtents */ HYPRE_Int nboxes; ProblemIndex *ilowers; ProblemIndex *iuppers; HYPRE_Int *boxsizes; HYPRE_Int max_boxsize; /* for GridSetVariables */ HYPRE_Int nvars; HYPRE_SStructVariable *vartypes; /* for GridAddVariables */ HYPRE_Int add_nvars; ProblemIndex *add_indexes; HYPRE_SStructVariable *add_vartypes; /* for GridSetNeighborPart and GridSetSharedPart */ HYPRE_Int glue_nboxes; HYPRE_Int *glue_shared; ProblemIndex *glue_ilowers; ProblemIndex *glue_iuppers; Index *glue_offsets; HYPRE_Int *glue_nbor_parts; ProblemIndex *glue_nbor_ilowers; ProblemIndex *glue_nbor_iuppers; Index *glue_nbor_offsets; Index *glue_index_maps; Index *glue_index_dirs; HYPRE_Int *glue_primaries; /* for GraphSetStencil */ HYPRE_Int *stencil_num; /* for GraphAddEntries */ HYPRE_Int graph_nboxes; ProblemIndex *graph_ilowers; ProblemIndex *graph_iuppers; Index *graph_strides; HYPRE_Int *graph_vars; HYPRE_Int *graph_to_parts; ProblemIndex *graph_to_ilowers; ProblemIndex *graph_to_iuppers; Index *graph_to_strides; HYPRE_Int *graph_to_vars; Index *graph_index_maps; Index *graph_index_signs; HYPRE_Int *graph_entries; HYPRE_Int graph_values_size; HYPRE_Real *graph_values; HYPRE_Real *d_graph_values; HYPRE_Int *graph_boxsizes; /* MatrixSetValues */ HYPRE_Int matset_nboxes; ProblemIndex *matset_ilowers; ProblemIndex *matset_iuppers; Index *matset_strides; HYPRE_Int *matset_vars; HYPRE_Int *matset_entries; HYPRE_Real *matset_values; /* MatrixAddToValues */ HYPRE_Int matadd_nboxes; ProblemIndex *matadd_ilowers; ProblemIndex *matadd_iuppers; HYPRE_Int *matadd_vars; HYPRE_Int *matadd_nentries; HYPRE_Int **matadd_entries; HYPRE_Real **matadd_values; /* FEMMatrixAddToValues */ HYPRE_Int fem_matadd_nboxes; ProblemIndex *fem_matadd_ilowers; ProblemIndex *fem_matadd_iuppers; HYPRE_Int *fem_matadd_nrows; HYPRE_Int **fem_matadd_rows; HYPRE_Int *fem_matadd_ncols; HYPRE_Int **fem_matadd_cols; HYPRE_Real **fem_matadd_values; /* RhsAddToValues */ HYPRE_Int rhsadd_nboxes; ProblemIndex *rhsadd_ilowers; ProblemIndex *rhsadd_iuppers; HYPRE_Int *rhsadd_vars; HYPRE_Real *rhsadd_values; /* FEMRhsAddToValues */ HYPRE_Int fem_rhsadd_nboxes; ProblemIndex *fem_rhsadd_ilowers; ProblemIndex *fem_rhsadd_iuppers; HYPRE_Real **fem_rhsadd_values; Index periodic; } ProblemPartData; typedef struct { HYPRE_Int ndim; HYPRE_Int nparts; ProblemPartData *pdata; HYPRE_Int max_boxsize; HYPRE_MemoryLocation memory_location; /* for GridSetNumGhost */ HYPRE_Int *numghost; HYPRE_Int nstencils; HYPRE_Int *stencil_sizes; Index **stencil_offsets; HYPRE_Int **stencil_vars; HYPRE_Real **stencil_values; HYPRE_Int rhs_true; HYPRE_Real rhs_value; HYPRE_Int fem_nvars; Index *fem_offsets; HYPRE_Int *fem_vars; HYPRE_Real **fem_values_full; HYPRE_Int **fem_ivalues_full; HYPRE_Int *fem_ordering; /* same info as vars/offsets */ HYPRE_Int fem_nsparse; /* number of nonzeros in values_full */ HYPRE_Int *fem_sparsity; /* nonzeros in values_full */ HYPRE_Real *fem_values; /* nonzero values in values_full */ HYPRE_Real *d_fem_values; HYPRE_Int fem_rhs_true; HYPRE_Real *fem_rhs_values; HYPRE_Real *d_fem_rhs_values; HYPRE_Int symmetric_num; HYPRE_Int *symmetric_parts; HYPRE_Int *symmetric_vars; HYPRE_Int *symmetric_to_vars; HYPRE_Int *symmetric_booleans; HYPRE_Int ns_symmetric; HYPRE_Int npools; HYPRE_Int *pools; /* array of size nparts */ HYPRE_Int ndists; /* number of (pool) distributions */ HYPRE_Int *dist_npools; HYPRE_Int **dist_pools; } ProblemData; /*-------------------------------------------------------------------------- * Compute new box based on variable type *--------------------------------------------------------------------------*/ HYPRE_Int GetVariableBox( Index cell_ilower, Index cell_iupper, HYPRE_Int vartype, Index var_ilower, Index var_iupper ) { HYPRE_Int ierr = 0; var_ilower[0] = cell_ilower[0]; var_ilower[1] = cell_ilower[1]; var_ilower[2] = cell_ilower[2]; var_iupper[0] = cell_iupper[0]; var_iupper[1] = cell_iupper[1]; var_iupper[2] = cell_iupper[2]; switch (vartype) { case HYPRE_SSTRUCT_VARIABLE_CELL: var_ilower[0] -= 0; var_ilower[1] -= 0; var_ilower[2] -= 0; break; case HYPRE_SSTRUCT_VARIABLE_NODE: var_ilower[0] -= 1; var_ilower[1] -= 1; var_ilower[2] -= 1; break; case HYPRE_SSTRUCT_VARIABLE_XFACE: var_ilower[0] -= 1; var_ilower[1] -= 0; var_ilower[2] -= 0; break; case HYPRE_SSTRUCT_VARIABLE_YFACE: var_ilower[0] -= 0; var_ilower[1] -= 1; var_ilower[2] -= 0; break; case HYPRE_SSTRUCT_VARIABLE_ZFACE: var_ilower[0] -= 0; var_ilower[1] -= 0; var_ilower[2] -= 1; break; case HYPRE_SSTRUCT_VARIABLE_XEDGE: var_ilower[0] -= 0; var_ilower[1] -= 1; var_ilower[2] -= 1; break; case HYPRE_SSTRUCT_VARIABLE_YEDGE: var_ilower[0] -= 1; var_ilower[1] -= 0; var_ilower[2] -= 1; break; case HYPRE_SSTRUCT_VARIABLE_ZEDGE: var_ilower[0] -= 1; var_ilower[1] -= 1; var_ilower[2] -= 0; break; case HYPRE_SSTRUCT_VARIABLE_UNDEFINED: break; } return ierr; } /*-------------------------------------------------------------------------- * Read routines *--------------------------------------------------------------------------*/ HYPRE_Int SScanIntArray( char *sdata_ptr, char **sdata_ptr_ptr, HYPRE_Int size, HYPRE_Int *array ) { HYPRE_Int i; sdata_ptr += strspn(sdata_ptr, " \t\n["); for (i = 0; i < size; i++) { array[i] = strtol(sdata_ptr, &sdata_ptr, 10); } sdata_ptr += strcspn(sdata_ptr, "]") + 1; *sdata_ptr_ptr = sdata_ptr; return 0; } HYPRE_Int SScanDblArray( char *sdata_ptr, char **sdata_ptr_ptr, HYPRE_Int size, HYPRE_Real *array ) { HYPRE_Int i; sdata_ptr += strspn(sdata_ptr, " \t\n["); for (i = 0; i < size; i++) { array[i] = (HYPRE_Real)strtod(sdata_ptr, &sdata_ptr); } sdata_ptr += strcspn(sdata_ptr, "]") + 1; *sdata_ptr_ptr = sdata_ptr; return 0; } HYPRE_Int SScanProblemIndex( char *sdata_ptr, char **sdata_ptr_ptr, HYPRE_Int ndim, ProblemIndex index ) { HYPRE_Int i; char sign[3]; /* initialize index array */ for (i = 0; i < 9; i++) { index[i] = 0; } sdata_ptr += strspn(sdata_ptr, " \t\n("); switch (ndim) { case 1: hypre_sscanf(sdata_ptr, "%d%c", &index[0], &sign[0]); break; case 2: hypre_sscanf(sdata_ptr, "%d%c%d%c", &index[0], &sign[0], &index[1], &sign[1]); break; case 3: hypre_sscanf(sdata_ptr, "%d%c%d%c%d%c", &index[0], &sign[0], &index[1], &sign[1], &index[2], &sign[2]); break; } sdata_ptr += strcspn(sdata_ptr, ":)"); if ( *sdata_ptr == ':' ) { /* read in optional shift */ sdata_ptr += 1; switch (ndim) { case 1: hypre_sscanf(sdata_ptr, "%d", &index[6]); break; case 2: hypre_sscanf(sdata_ptr, "%d%d", &index[6], &index[7]); break; case 3: hypre_sscanf(sdata_ptr, "%d%d%d", &index[6], &index[7], &index[8]); break; } /* pre-shift the index */ for (i = 0; i < ndim; i++) { index[i] += index[i + 6]; } } sdata_ptr += strcspn(sdata_ptr, ")") + 1; for (i = 0; i < ndim; i++) { if (sign[i] == '+') { index[i + 3] = 1; } } *sdata_ptr_ptr = sdata_ptr; return 0; } HYPRE_Int ReadData( char *filename, ProblemData *data_ptr ) { ProblemData data; ProblemPartData pdata; HYPRE_Int myid; FILE *file; char *sdata = NULL; char *sdata_line; char *sdata_ptr; HYPRE_Int sdata_size; HYPRE_Int size; HYPRE_Int memchunk = 10000; HYPRE_Int maxline = 250; char key[250]; HYPRE_Int part, var, s, entry, i, j, k, il, iu; HYPRE_MemoryLocation memory_location = data_ptr -> memory_location; /*----------------------------------------------------------- * Read data file from process 0, then broadcast *-----------------------------------------------------------*/ hypre_MPI_Comm_rank(hypre_MPI_COMM_WORLD, &myid); if (myid == 0) { if ((file = fopen(filename, "r")) == NULL) { hypre_printf("Error: can't open input file %s\n", filename); exit(1); } /* allocate initial space, and read first input line */ sdata_size = 0; sdata = hypre_TAlloc(char, memchunk, HYPRE_MEMORY_HOST); sdata_line = fgets(sdata, maxline, file); s = 0; while (sdata_line != NULL) { sdata_size += strlen(sdata_line) + 1; /* allocate more space, if necessary */ if ((sdata_size + maxline) > s) { sdata = hypre_TReAlloc(sdata, char, (sdata_size + memchunk), HYPRE_MEMORY_HOST); s = sdata_size + memchunk; } /* read the next input line */ sdata_line = fgets((sdata + sdata_size), maxline, file); } /* Close file handle */ fclose(file); } /* broadcast the data size */ hypre_MPI_Bcast(&sdata_size, 1, HYPRE_MPI_INT, 0, hypre_MPI_COMM_WORLD); /* broadcast the data */ sdata = hypre_TReAlloc(sdata, char, sdata_size, HYPRE_MEMORY_HOST); hypre_MPI_Bcast(sdata, sdata_size, hypre_MPI_CHAR, 0, hypre_MPI_COMM_WORLD); /*----------------------------------------------------------- * Parse the data and fill ProblemData structure *-----------------------------------------------------------*/ data.memory_location = memory_location; data.max_boxsize = 0; data.numghost = NULL; data.nstencils = 0; data.rhs_true = 0; data.fem_nvars = 0; data.fem_nsparse = 0; data.fem_rhs_true = 0; data.symmetric_num = 0; data.symmetric_parts = NULL; data.symmetric_vars = NULL; data.symmetric_to_vars = NULL; data.symmetric_booleans = NULL; data.ns_symmetric = 0; data.ndists = 0; data.dist_npools = NULL; data.dist_pools = NULL; sdata_line = sdata; while (sdata_line < (sdata + sdata_size)) { sdata_ptr = sdata_line; if ( ( hypre_sscanf(sdata_ptr, "%s", key) > 0 ) && ( sdata_ptr[0] != '#' ) ) { sdata_ptr += strcspn(sdata_ptr, " \t\n"); if ( strcmp(key, "GridCreate:") == 0 ) { data.ndim = strtol(sdata_ptr, &sdata_ptr, 10); data.nparts = strtol(sdata_ptr, &sdata_ptr, 10); data.pdata = hypre_CTAlloc(ProblemPartData, data.nparts, HYPRE_MEMORY_HOST); } else if ( strcmp(key, "GridSetNumGhost:") == 0 ) { // # GridSetNumGhost: numghost[2*ndim] // GridSetNumGhost: [3 3 3 3] data.numghost = hypre_CTAlloc(HYPRE_Int, 2 * data.ndim, HYPRE_MEMORY_HOST); SScanIntArray(sdata_ptr, &sdata_ptr, 2 * data.ndim, data.numghost); } else if ( strcmp(key, "GridSetExtents:") == 0 ) { part = strtol(sdata_ptr, &sdata_ptr, 10); pdata = data.pdata[part]; if ((pdata.nboxes % 10) == 0) { size = pdata.nboxes + 10; pdata.ilowers = hypre_TReAlloc(pdata.ilowers, ProblemIndex, size, HYPRE_MEMORY_HOST); pdata.iuppers = hypre_TReAlloc(pdata.iuppers, ProblemIndex, size, HYPRE_MEMORY_HOST); pdata.boxsizes = hypre_TReAlloc(pdata.boxsizes, HYPRE_Int, size, HYPRE_MEMORY_HOST); } SScanProblemIndex(sdata_ptr, &sdata_ptr, data.ndim, pdata.ilowers[pdata.nboxes]); SScanProblemIndex(sdata_ptr, &sdata_ptr, data.ndim, pdata.iuppers[pdata.nboxes]); /* check use of +- in GridSetExtents */ il = 1; iu = 1; for (i = 0; i < data.ndim; i++) { il *= pdata.ilowers[pdata.nboxes][i + 3]; iu *= pdata.iuppers[pdata.nboxes][i + 3]; } if ( (il != 0) || (iu != 1) ) { hypre_printf("Error: Invalid use of `+-' in GridSetExtents\n"); exit(1); } pdata.boxsizes[pdata.nboxes] = 1; for (i = 0; i < 3; i++) { pdata.boxsizes[pdata.nboxes] *= (pdata.iuppers[pdata.nboxes][i] - pdata.ilowers[pdata.nboxes][i] + 2); } pdata.max_boxsize = hypre_max(pdata.max_boxsize, pdata.boxsizes[pdata.nboxes]); pdata.nboxes++; data.pdata[part] = pdata; } else if ( strcmp(key, "GridSetVariables:") == 0 ) { part = strtol(sdata_ptr, &sdata_ptr, 10); pdata = data.pdata[part]; pdata.nvars = strtol(sdata_ptr, &sdata_ptr, 10); pdata.vartypes = hypre_CTAlloc(HYPRE_SStructVariable, pdata.nvars, HYPRE_MEMORY_HOST); SScanIntArray(sdata_ptr, &sdata_ptr, pdata.nvars, pdata.vartypes); data.pdata[part] = pdata; } else if ( strcmp(key, "GridAddVariables:") == 0 ) { /* TODO */ hypre_printf("GridAddVariables not yet implemented!\n"); exit(1); } else if ( strcmp(key, "GridSetNeighborPart:") == 0 || strcmp(key, "GridSetSharedPart:") == 0 ) { part = strtol(sdata_ptr, &sdata_ptr, 10); pdata = data.pdata[part]; if ((pdata.glue_nboxes % 10) == 0) { size = pdata.glue_nboxes + 10; pdata.glue_shared = hypre_TReAlloc(pdata.glue_shared, HYPRE_Int, size, HYPRE_MEMORY_HOST); pdata.glue_ilowers = hypre_TReAlloc(pdata.glue_ilowers, ProblemIndex, size, HYPRE_MEMORY_HOST); pdata.glue_iuppers = hypre_TReAlloc(pdata.glue_iuppers, ProblemIndex, size, HYPRE_MEMORY_HOST); pdata.glue_offsets = hypre_TReAlloc(pdata.glue_offsets, Index, size, HYPRE_MEMORY_HOST); pdata.glue_nbor_parts = hypre_TReAlloc(pdata.glue_nbor_parts, HYPRE_Int, size, HYPRE_MEMORY_HOST); pdata.glue_nbor_ilowers = hypre_TReAlloc(pdata.glue_nbor_ilowers, ProblemIndex, size, HYPRE_MEMORY_HOST); pdata.glue_nbor_iuppers = hypre_TReAlloc(pdata.glue_nbor_iuppers, ProblemIndex, size, HYPRE_MEMORY_HOST); pdata.glue_nbor_offsets = hypre_TReAlloc(pdata.glue_nbor_offsets, Index, size, HYPRE_MEMORY_HOST); pdata.glue_index_maps = hypre_TReAlloc(pdata.glue_index_maps, Index, size, HYPRE_MEMORY_HOST); pdata.glue_index_dirs = hypre_TReAlloc(pdata.glue_index_dirs, Index, size, HYPRE_MEMORY_HOST); pdata.glue_primaries = hypre_TReAlloc(pdata.glue_primaries, HYPRE_Int, size, HYPRE_MEMORY_HOST); } pdata.glue_shared[pdata.glue_nboxes] = 0; if ( strcmp(key, "GridSetSharedPart:") == 0 ) { pdata.glue_shared[pdata.glue_nboxes] = 1; } SScanProblemIndex(sdata_ptr, &sdata_ptr, data.ndim, pdata.glue_ilowers[pdata.glue_nboxes]); SScanProblemIndex(sdata_ptr, &sdata_ptr, data.ndim, pdata.glue_iuppers[pdata.glue_nboxes]); if (pdata.glue_shared[pdata.glue_nboxes]) { SScanIntArray(sdata_ptr, &sdata_ptr, data.ndim, pdata.glue_offsets[pdata.glue_nboxes]); } pdata.glue_nbor_parts[pdata.glue_nboxes] = strtol(sdata_ptr, &sdata_ptr, 10); SScanProblemIndex(sdata_ptr, &sdata_ptr, data.ndim, pdata.glue_nbor_ilowers[pdata.glue_nboxes]); SScanProblemIndex(sdata_ptr, &sdata_ptr, data.ndim, pdata.glue_nbor_iuppers[pdata.glue_nboxes]); if (pdata.glue_shared[pdata.glue_nboxes]) { SScanIntArray(sdata_ptr, &sdata_ptr, data.ndim, pdata.glue_nbor_offsets[pdata.glue_nboxes]); } SScanIntArray(sdata_ptr, &sdata_ptr, data.ndim, pdata.glue_index_maps[pdata.glue_nboxes]); for (i = data.ndim; i < 3; i++) { pdata.glue_index_maps[pdata.glue_nboxes][i] = i; } SScanIntArray(sdata_ptr, &sdata_ptr, data.ndim, pdata.glue_index_dirs[pdata.glue_nboxes]); for (i = data.ndim; i < 3; i++) { pdata.glue_index_dirs[pdata.glue_nboxes][i] = 1; } sdata_ptr += strcspn(sdata_ptr, ":\t\n"); if ( *sdata_ptr == ':' ) { /* read in optional primary indicator */ sdata_ptr += 1; pdata.glue_primaries[pdata.glue_nboxes] = strtol(sdata_ptr, &sdata_ptr, 10); } else { pdata.glue_primaries[pdata.glue_nboxes] = -1; sdata_ptr -= 1; } pdata.glue_nboxes++; data.pdata[part] = pdata; } else if ( strcmp(key, "GridSetPeriodic:") == 0 ) { part = strtol(sdata_ptr, &sdata_ptr, 10); pdata = data.pdata[part]; SScanIntArray(sdata_ptr, &sdata_ptr, data.ndim, pdata.periodic); for (i = data.ndim; i < 3; i++) { pdata.periodic[i] = 0; } data.pdata[part] = pdata; } else if ( strcmp(key, "StencilCreate:") == 0 ) { if (data.fem_nvars > 0) { hypre_printf("Stencil and FEMStencil cannot be used together\n"); exit(1); } data.nstencils = strtol(sdata_ptr, &sdata_ptr, 10); data.stencil_sizes = hypre_CTAlloc(HYPRE_Int, data.nstencils, HYPRE_MEMORY_HOST); data.stencil_offsets = hypre_CTAlloc(Index *, data.nstencils, HYPRE_MEMORY_HOST); data.stencil_vars = hypre_CTAlloc(HYPRE_Int *, data.nstencils, HYPRE_MEMORY_HOST); data.stencil_values = hypre_CTAlloc(HYPRE_Real *, data.nstencils, HYPRE_MEMORY_HOST); SScanIntArray(sdata_ptr, &sdata_ptr, data.nstencils, data.stencil_sizes); for (s = 0; s < data.nstencils; s++) { data.stencil_offsets[s] = hypre_CTAlloc(Index, data.stencil_sizes[s], HYPRE_MEMORY_HOST); data.stencil_vars[s] = hypre_CTAlloc(HYPRE_Int, data.stencil_sizes[s], HYPRE_MEMORY_HOST); data.stencil_values[s] = hypre_CTAlloc(HYPRE_Real, data.stencil_sizes[s], HYPRE_MEMORY_HOST); } } else if ( strcmp(key, "StencilSetEntry:") == 0 ) { s = strtol(sdata_ptr, &sdata_ptr, 10); entry = strtol(sdata_ptr, &sdata_ptr, 10); SScanIntArray(sdata_ptr, &sdata_ptr, data.ndim, data.stencil_offsets[s][entry]); for (i = data.ndim; i < 3; i++) { data.stencil_offsets[s][entry][i] = 0; } data.stencil_vars[s][entry] = strtol(sdata_ptr, &sdata_ptr, 10); data.stencil_values[s][entry] = (HYPRE_Real)strtod(sdata_ptr, &sdata_ptr); } else if ( strcmp(key, "RhsSet:") == 0 ) { if (data.rhs_true == 0) { data.rhs_true = 1; } data.rhs_value = (HYPRE_Real)strtod(sdata_ptr, &sdata_ptr); } else if ( strcmp(key, "FEMStencilCreate:") == 0 ) { if (data.nstencils > 0) { hypre_printf("Stencil and FEMStencil cannot be used together\n"); exit(1); } data.fem_nvars = strtol(sdata_ptr, &sdata_ptr, 10); data.fem_offsets = hypre_CTAlloc(Index, data.fem_nvars, HYPRE_MEMORY_HOST); data.fem_vars = hypre_CTAlloc(HYPRE_Int, data.fem_nvars, HYPRE_MEMORY_HOST); data.fem_values_full = hypre_CTAlloc(HYPRE_Real *, data.fem_nvars, HYPRE_MEMORY_HOST); for (i = 0; i < data.fem_nvars; i++) { data.fem_values_full[i] = hypre_CTAlloc(HYPRE_Real, data.fem_nvars, HYPRE_MEMORY_HOST); } } else if ( strcmp(key, "FEMStencilSetRow:") == 0 ) { i = strtol(sdata_ptr, &sdata_ptr, 10); SScanIntArray(sdata_ptr, &sdata_ptr, data.ndim, data.fem_offsets[i]); for (k = data.ndim; k < 3; k++) { data.fem_offsets[i][k] = 0; } data.fem_vars[i] = strtol(sdata_ptr, &sdata_ptr, 10); SScanDblArray(sdata_ptr, &sdata_ptr, data.fem_nvars, data.fem_values_full[i]); } else if ( strcmp(key, "FEMRhsSet:") == 0 ) { if (data.fem_rhs_true == 0) { data.fem_rhs_true = 1; data.fem_rhs_values = hypre_CTAlloc(HYPRE_Real, data.fem_nvars, HYPRE_MEMORY_HOST); data.d_fem_rhs_values = hypre_CTAlloc(HYPRE_Real, data.fem_nvars, memory_location); } SScanDblArray(sdata_ptr, &sdata_ptr, data.fem_nvars, data.fem_rhs_values); } else if ( strcmp(key, "GraphSetStencil:") == 0 ) { part = strtol(sdata_ptr, &sdata_ptr, 10); var = strtol(sdata_ptr, &sdata_ptr, 10); s = strtol(sdata_ptr, &sdata_ptr, 10); pdata = data.pdata[part]; if (pdata.stencil_num == NULL) { pdata.stencil_num = hypre_CTAlloc(HYPRE_Int, pdata.nvars, HYPRE_MEMORY_HOST); } pdata.stencil_num[var] = s; data.pdata[part] = pdata; } else if ( strcmp(key, "GraphAddEntries:") == 0 ) { part = strtol(sdata_ptr, &sdata_ptr, 10); pdata = data.pdata[part]; if ((pdata.graph_nboxes % 10) == 0) { size = pdata.graph_nboxes + 10; pdata.graph_ilowers = hypre_TReAlloc(pdata.graph_ilowers, ProblemIndex, size, HYPRE_MEMORY_HOST); pdata.graph_iuppers = hypre_TReAlloc(pdata.graph_iuppers, ProblemIndex, size, HYPRE_MEMORY_HOST); pdata.graph_strides = hypre_TReAlloc(pdata.graph_strides, Index, size, HYPRE_MEMORY_HOST); pdata.graph_vars = hypre_TReAlloc(pdata.graph_vars, HYPRE_Int, size, HYPRE_MEMORY_HOST); pdata.graph_to_parts = hypre_TReAlloc(pdata.graph_to_parts, HYPRE_Int, size, HYPRE_MEMORY_HOST); pdata.graph_to_ilowers = hypre_TReAlloc(pdata.graph_to_ilowers, ProblemIndex, size, HYPRE_MEMORY_HOST); pdata.graph_to_iuppers = hypre_TReAlloc(pdata.graph_to_iuppers, ProblemIndex, size, HYPRE_MEMORY_HOST); pdata.graph_to_strides = hypre_TReAlloc(pdata.graph_to_strides, Index, size, HYPRE_MEMORY_HOST); pdata.graph_to_vars = hypre_TReAlloc(pdata.graph_to_vars, HYPRE_Int, size, HYPRE_MEMORY_HOST); pdata.graph_index_maps = hypre_TReAlloc(pdata.graph_index_maps, Index, size, HYPRE_MEMORY_HOST); pdata.graph_index_signs = hypre_TReAlloc(pdata.graph_index_signs, Index, size, HYPRE_MEMORY_HOST); pdata.graph_entries = hypre_TReAlloc(pdata.graph_entries, HYPRE_Int, size, HYPRE_MEMORY_HOST); pdata.graph_values = hypre_TReAlloc(pdata.graph_values, HYPRE_Real, size, HYPRE_MEMORY_HOST); pdata.d_graph_values = hypre_TReAlloc_v2(pdata.d_graph_values, HYPRE_Real, pdata.graph_values_size, HYPRE_Real, size, memory_location); pdata.graph_values_size = size; pdata.graph_boxsizes = hypre_TReAlloc(pdata.graph_boxsizes, HYPRE_Int, size, HYPRE_MEMORY_HOST); } SScanProblemIndex(sdata_ptr, &sdata_ptr, data.ndim, pdata.graph_ilowers[pdata.graph_nboxes]); SScanProblemIndex(sdata_ptr, &sdata_ptr, data.ndim, pdata.graph_iuppers[pdata.graph_nboxes]); SScanIntArray(sdata_ptr, &sdata_ptr, data.ndim, pdata.graph_strides[pdata.graph_nboxes]); for (i = data.ndim; i < 3; i++) { pdata.graph_strides[pdata.graph_nboxes][i] = 1; } pdata.graph_vars[pdata.graph_nboxes] = strtol(sdata_ptr, &sdata_ptr, 10); pdata.graph_to_parts[pdata.graph_nboxes] = strtol(sdata_ptr, &sdata_ptr, 10); SScanProblemIndex(sdata_ptr, &sdata_ptr, data.ndim, pdata.graph_to_ilowers[pdata.graph_nboxes]); SScanProblemIndex(sdata_ptr, &sdata_ptr, data.ndim, pdata.graph_to_iuppers[pdata.graph_nboxes]); SScanIntArray(sdata_ptr, &sdata_ptr, data.ndim, pdata.graph_to_strides[pdata.graph_nboxes]); for (i = data.ndim; i < 3; i++) { pdata.graph_to_strides[pdata.graph_nboxes][i] = 1; } pdata.graph_to_vars[pdata.graph_nboxes] = strtol(sdata_ptr, &sdata_ptr, 10); SScanIntArray(sdata_ptr, &sdata_ptr, data.ndim, pdata.graph_index_maps[pdata.graph_nboxes]); for (i = data.ndim; i < 3; i++) { pdata.graph_index_maps[pdata.graph_nboxes][i] = i; } for (i = 0; i < 3; i++) { pdata.graph_index_signs[pdata.graph_nboxes][i] = 1; if ( pdata.graph_to_iuppers[pdata.graph_nboxes][i] < pdata.graph_to_ilowers[pdata.graph_nboxes][i] ) { pdata.graph_index_signs[pdata.graph_nboxes][i] = -1; } } pdata.graph_entries[pdata.graph_nboxes] = strtol(sdata_ptr, &sdata_ptr, 10); pdata.graph_values[pdata.graph_nboxes] = (HYPRE_Real)strtod(sdata_ptr, &sdata_ptr); pdata.graph_boxsizes[pdata.graph_nboxes] = 1; for (i = 0; i < 3; i++) { pdata.graph_boxsizes[pdata.graph_nboxes] *= (pdata.graph_iuppers[pdata.graph_nboxes][i] - pdata.graph_ilowers[pdata.graph_nboxes][i] + 1); } pdata.graph_nboxes++; data.pdata[part] = pdata; } else if ( strcmp(key, "MatrixSetSymmetric:") == 0 ) { if ((data.symmetric_num % 10) == 0) { size = data.symmetric_num + 10; data.symmetric_parts = hypre_TReAlloc(data.symmetric_parts, HYPRE_Int, size, HYPRE_MEMORY_HOST); data.symmetric_vars = hypre_TReAlloc(data.symmetric_vars, HYPRE_Int, size, HYPRE_MEMORY_HOST); data.symmetric_to_vars = hypre_TReAlloc(data.symmetric_to_vars, HYPRE_Int, size, HYPRE_MEMORY_HOST); data.symmetric_booleans = hypre_TReAlloc(data.symmetric_booleans, HYPRE_Int, size, HYPRE_MEMORY_HOST); } data.symmetric_parts[data.symmetric_num] = strtol(sdata_ptr, &sdata_ptr, 10); data.symmetric_vars[data.symmetric_num] = strtol(sdata_ptr, &sdata_ptr, 10); data.symmetric_to_vars[data.symmetric_num] = strtol(sdata_ptr, &sdata_ptr, 10); data.symmetric_booleans[data.symmetric_num] = strtol(sdata_ptr, &sdata_ptr, 10); data.symmetric_num++; } else if ( strcmp(key, "MatrixSetNSSymmetric:") == 0 ) { data.ns_symmetric = strtol(sdata_ptr, &sdata_ptr, 10); } else if ( strcmp(key, "MatrixSetValues:") == 0 ) { part = strtol(sdata_ptr, &sdata_ptr, 10); pdata = data.pdata[part]; if ((pdata.matset_nboxes % 10) == 0) { size = pdata.matset_nboxes + 10; pdata.matset_ilowers = hypre_TReAlloc(pdata.matset_ilowers, ProblemIndex, size, HYPRE_MEMORY_HOST); pdata.matset_iuppers = hypre_TReAlloc(pdata.matset_iuppers, ProblemIndex, size, HYPRE_MEMORY_HOST); pdata.matset_strides = hypre_TReAlloc(pdata.matset_strides, Index, size, HYPRE_MEMORY_HOST); pdata.matset_vars = hypre_TReAlloc(pdata.matset_vars, HYPRE_Int, size, HYPRE_MEMORY_HOST); pdata.matset_entries = hypre_TReAlloc(pdata.matset_entries, HYPRE_Int, size, HYPRE_MEMORY_HOST); pdata.matset_values = hypre_TReAlloc(pdata.matset_values, HYPRE_Real, size, HYPRE_MEMORY_HOST); } SScanProblemIndex(sdata_ptr, &sdata_ptr, data.ndim, pdata.matset_ilowers[pdata.matset_nboxes]); SScanProblemIndex(sdata_ptr, &sdata_ptr, data.ndim, pdata.matset_iuppers[pdata.matset_nboxes]); SScanIntArray(sdata_ptr, &sdata_ptr, data.ndim, pdata.matset_strides[pdata.matset_nboxes]); for (i = data.ndim; i < 3; i++) { pdata.matset_strides[pdata.matset_nboxes][i] = 1; } pdata.matset_vars[pdata.matset_nboxes] = strtol(sdata_ptr, &sdata_ptr, 10); pdata.matset_entries[pdata.matset_nboxes] = strtol(sdata_ptr, &sdata_ptr, 10); pdata.matset_values[pdata.matset_nboxes] = (HYPRE_Real)strtod(sdata_ptr, &sdata_ptr); pdata.matset_nboxes++; data.pdata[part] = pdata; } else if ( strcmp(key, "MatrixAddToValues:") == 0 ) { part = strtol(sdata_ptr, &sdata_ptr, 10); pdata = data.pdata[part]; if ((pdata.matadd_nboxes % 10) == 0) { size = pdata.matadd_nboxes + 10; pdata.matadd_ilowers = hypre_TReAlloc(pdata.matadd_ilowers, ProblemIndex, size, HYPRE_MEMORY_HOST); pdata.matadd_iuppers = hypre_TReAlloc(pdata.matadd_iuppers, ProblemIndex, size, HYPRE_MEMORY_HOST); pdata.matadd_vars = hypre_TReAlloc(pdata.matadd_vars, HYPRE_Int, size, HYPRE_MEMORY_HOST); pdata.matadd_nentries = hypre_TReAlloc(pdata.matadd_nentries, HYPRE_Int, size, HYPRE_MEMORY_HOST); pdata.matadd_entries = hypre_TReAlloc(pdata.matadd_entries, HYPRE_Int *, size, HYPRE_MEMORY_HOST); pdata.matadd_values = hypre_TReAlloc(pdata.matadd_values, HYPRE_Real *, size, HYPRE_MEMORY_HOST); } SScanProblemIndex(sdata_ptr, &sdata_ptr, data.ndim, pdata.matadd_ilowers[pdata.matadd_nboxes]); SScanProblemIndex(sdata_ptr, &sdata_ptr, data.ndim, pdata.matadd_iuppers[pdata.matadd_nboxes]); pdata.matadd_vars[pdata.matadd_nboxes] = strtol(sdata_ptr, &sdata_ptr, 10); i = strtol(sdata_ptr, &sdata_ptr, 10); pdata.matadd_nentries[pdata.matadd_nboxes] = i; pdata.matadd_entries[pdata.matadd_nboxes] = hypre_TAlloc(HYPRE_Int, i, HYPRE_MEMORY_HOST); SScanIntArray(sdata_ptr, &sdata_ptr, i, (HYPRE_Int*) pdata.matadd_entries[pdata.matadd_nboxes]); pdata.matadd_values[pdata.matadd_nboxes] = hypre_TAlloc(HYPRE_Real, i, HYPRE_MEMORY_HOST); SScanDblArray(sdata_ptr, &sdata_ptr, i, (HYPRE_Real *) pdata.matadd_values[pdata.matadd_nboxes]); pdata.matadd_nboxes++; data.pdata[part] = pdata; } else if ( strcmp(key, "FEMMatrixAddToValues:") == 0 ) { part = strtol(sdata_ptr, &sdata_ptr, 10); pdata = data.pdata[part]; if ((pdata.fem_matadd_nboxes % 10) == 0) { size = pdata.fem_matadd_nboxes + 10; pdata.fem_matadd_ilowers = hypre_TReAlloc(pdata.fem_matadd_ilowers, ProblemIndex, size, HYPRE_MEMORY_HOST); pdata.fem_matadd_iuppers = hypre_TReAlloc(pdata.fem_matadd_iuppers, ProblemIndex, size, HYPRE_MEMORY_HOST); pdata.fem_matadd_nrows = hypre_TReAlloc(pdata.fem_matadd_nrows, HYPRE_Int, size, HYPRE_MEMORY_HOST); pdata.fem_matadd_rows = hypre_TReAlloc(pdata.fem_matadd_rows, HYPRE_Int *, size, HYPRE_MEMORY_HOST); pdata.fem_matadd_ncols = hypre_TReAlloc(pdata.fem_matadd_ncols, HYPRE_Int, size, HYPRE_MEMORY_HOST); pdata.fem_matadd_cols = hypre_TReAlloc(pdata.fem_matadd_cols, HYPRE_Int *, size, HYPRE_MEMORY_HOST); pdata.fem_matadd_values = hypre_TReAlloc(pdata.fem_matadd_values, HYPRE_Real *, size, HYPRE_MEMORY_HOST); } SScanProblemIndex(sdata_ptr, &sdata_ptr, data.ndim, pdata.fem_matadd_ilowers[pdata.fem_matadd_nboxes]); SScanProblemIndex(sdata_ptr, &sdata_ptr, data.ndim, pdata.fem_matadd_iuppers[pdata.fem_matadd_nboxes]); i = strtol(sdata_ptr, &sdata_ptr, 10); pdata.fem_matadd_nrows[pdata.fem_matadd_nboxes] = i; pdata.fem_matadd_rows[pdata.fem_matadd_nboxes] = hypre_TAlloc(HYPRE_Int, i, HYPRE_MEMORY_HOST); SScanIntArray(sdata_ptr, &sdata_ptr, i, (HYPRE_Int*) pdata.fem_matadd_rows[pdata.fem_matadd_nboxes]); j = strtol(sdata_ptr, &sdata_ptr, 10); pdata.fem_matadd_ncols[pdata.fem_matadd_nboxes] = j; pdata.fem_matadd_cols[pdata.fem_matadd_nboxes] = hypre_TAlloc(HYPRE_Int, j, HYPRE_MEMORY_HOST); SScanIntArray(sdata_ptr, &sdata_ptr, j, (HYPRE_Int*) pdata.fem_matadd_cols[pdata.fem_matadd_nboxes]); pdata.fem_matadd_values[pdata.fem_matadd_nboxes] = hypre_TAlloc(HYPRE_Real, i * j, HYPRE_MEMORY_HOST); SScanDblArray(sdata_ptr, &sdata_ptr, i * j, (HYPRE_Real *) pdata.fem_matadd_values[pdata.fem_matadd_nboxes]); pdata.fem_matadd_nboxes++; data.pdata[part] = pdata; } else if ( strcmp(key, "RhsAddToValues:") == 0 ) { part = strtol(sdata_ptr, &sdata_ptr, 10); pdata = data.pdata[part]; if ((pdata.rhsadd_nboxes % 10) == 0) { size = pdata.rhsadd_nboxes + 10; pdata.rhsadd_ilowers = hypre_TReAlloc(pdata.rhsadd_ilowers, ProblemIndex, size, HYPRE_MEMORY_HOST); pdata.rhsadd_iuppers = hypre_TReAlloc(pdata.rhsadd_iuppers, ProblemIndex, size, HYPRE_MEMORY_HOST); pdata.rhsadd_vars = hypre_TReAlloc(pdata.rhsadd_vars, HYPRE_Int, size, HYPRE_MEMORY_HOST); pdata.rhsadd_values = hypre_TReAlloc(pdata.rhsadd_values, HYPRE_Real, size, HYPRE_MEMORY_HOST); } SScanProblemIndex(sdata_ptr, &sdata_ptr, data.ndim, pdata.rhsadd_ilowers[pdata.rhsadd_nboxes]); SScanProblemIndex(sdata_ptr, &sdata_ptr, data.ndim, pdata.rhsadd_iuppers[pdata.rhsadd_nboxes]); pdata.rhsadd_vars[pdata.rhsadd_nboxes] = strtol(sdata_ptr, &sdata_ptr, 10); pdata.rhsadd_values[pdata.rhsadd_nboxes] = (HYPRE_Real)strtod(sdata_ptr, &sdata_ptr); pdata.rhsadd_nboxes++; data.pdata[part] = pdata; } else if ( strcmp(key, "FEMRhsAddToValues:") == 0 ) { part = strtol(sdata_ptr, &sdata_ptr, 10); pdata = data.pdata[part]; if ((pdata.fem_rhsadd_nboxes % 10) == 0) { size = pdata.fem_rhsadd_nboxes + 10; pdata.fem_rhsadd_ilowers = hypre_TReAlloc(pdata.fem_rhsadd_ilowers, ProblemIndex, size, HYPRE_MEMORY_HOST); pdata.fem_rhsadd_iuppers = hypre_TReAlloc(pdata.fem_rhsadd_iuppers, ProblemIndex, size, HYPRE_MEMORY_HOST); pdata.fem_rhsadd_values = hypre_TReAlloc(pdata.fem_rhsadd_values, HYPRE_Real *, size, HYPRE_MEMORY_HOST); } SScanProblemIndex(sdata_ptr, &sdata_ptr, data.ndim, pdata.fem_rhsadd_ilowers[pdata.fem_rhsadd_nboxes]); SScanProblemIndex(sdata_ptr, &sdata_ptr, data.ndim, pdata.fem_rhsadd_iuppers[pdata.fem_rhsadd_nboxes]); pdata.fem_rhsadd_values[pdata.fem_rhsadd_nboxes] = hypre_TAlloc(HYPRE_Real, data.fem_nvars, HYPRE_MEMORY_HOST); SScanDblArray(sdata_ptr, &sdata_ptr, data.fem_nvars, (HYPRE_Real *) pdata.fem_rhsadd_values[pdata.fem_rhsadd_nboxes]); pdata.fem_rhsadd_nboxes++; data.pdata[part] = pdata; } else if ( strcmp(key, "ProcessPoolCreate:") == 0 ) { data.ndists++; data.dist_npools = hypre_TReAlloc(data.dist_npools, HYPRE_Int, data.ndists, HYPRE_MEMORY_HOST); data.dist_pools = hypre_TReAlloc(data.dist_pools, HYPRE_Int *, data.ndists, HYPRE_MEMORY_HOST); data.dist_npools[data.ndists - 1] = strtol(sdata_ptr, &sdata_ptr, 10); data.dist_pools[data.ndists - 1] = hypre_CTAlloc(HYPRE_Int, data.nparts, HYPRE_MEMORY_HOST); #if 0 data.npools = strtol(sdata_ptr, &sdata_ptr, 10); data.pools = hypre_CTAlloc(HYPRE_Int, data.nparts, HYPRE_MEMORY_HOST); #endif } else if ( strcmp(key, "ProcessPoolSetPart:") == 0 ) { i = strtol(sdata_ptr, &sdata_ptr, 10); part = strtol(sdata_ptr, &sdata_ptr, 10); data.dist_pools[data.ndists - 1][part] = i; } else if ( strcmp(key, "GridSetNeighborBox:") == 0 ) { hypre_printf("Error: No longer supporting SetNeighborBox\n"); } } sdata_line += strlen(sdata_line) + 1; } data.max_boxsize = 0; for (part = 0; part < data.nparts; part++) { data.max_boxsize = hypre_max(data.max_boxsize, data.pdata[part].max_boxsize); } /* build additional FEM information */ if (data.fem_nvars > 0) { HYPRE_Int d; data.fem_ivalues_full = hypre_CTAlloc(HYPRE_Int *, data.fem_nvars, HYPRE_MEMORY_HOST); data.fem_ordering = hypre_CTAlloc(HYPRE_Int, (1 + data.ndim) * data.fem_nvars, HYPRE_MEMORY_HOST); data.fem_sparsity = hypre_CTAlloc(HYPRE_Int, 2 * data.fem_nvars * data.fem_nvars, HYPRE_MEMORY_HOST); data.fem_values = hypre_CTAlloc(HYPRE_Real, data.fem_nvars * data.fem_nvars, HYPRE_MEMORY_HOST); data.d_fem_values = hypre_TAlloc(HYPRE_Real, data.fem_nvars * data.fem_nvars, memory_location); for (i = 0; i < data.fem_nvars; i++) { data.fem_ivalues_full[i] = hypre_CTAlloc(HYPRE_Int, data.fem_nvars, HYPRE_MEMORY_HOST); k = (1 + data.ndim) * i; data.fem_ordering[k] = data.fem_vars[i]; for (d = 0; d < data.ndim; d++) { data.fem_ordering[k + 1 + d] = data.fem_offsets[i][d]; } for (j = 0; j < data.fem_nvars; j++) { if (data.fem_values_full[i][j] != 0.0) { k = 2 * data.fem_nsparse; data.fem_sparsity[k] = i; data.fem_sparsity[k + 1] = j; data.fem_values[data.fem_nsparse] = data.fem_values_full[i][j]; data.fem_ivalues_full[i][j] = data.fem_nsparse; data.fem_nsparse ++; } } } } hypre_TFree(sdata, HYPRE_MEMORY_HOST); *data_ptr = data; return 0; } /*-------------------------------------------------------------------------- * Distribute routines *--------------------------------------------------------------------------*/ HYPRE_Int MapProblemIndex( ProblemIndex index, Index m ) { /* un-shift the index */ index[0] -= index[6]; index[1] -= index[7]; index[2] -= index[8]; /* map the index */ index[0] = m[0] * index[0] + (m[0] - 1) * index[3]; index[1] = m[1] * index[1] + (m[1] - 1) * index[4]; index[2] = m[2] * index[2] + (m[2] - 1) * index[5]; /* pre-shift the new mapped index */ index[0] += index[6]; index[1] += index[7]; index[2] += index[8]; return 0; } HYPRE_Int IntersectBoxes( ProblemIndex ilower1, ProblemIndex iupper1, ProblemIndex ilower2, ProblemIndex iupper2, ProblemIndex int_ilower, ProblemIndex int_iupper ) { HYPRE_Int d, size; size = 1; for (d = 0; d < 3; d++) { int_ilower[d] = hypre_max(ilower1[d], ilower2[d]); int_iupper[d] = hypre_min(iupper1[d], iupper2[d]); size *= hypre_max(0, (int_iupper[d] - int_ilower[d] + 1)); } return size; } HYPRE_Int DistributeData( ProblemData global_data, HYPRE_Int pooldist, Index *refine, Index *distribute, Index *block, HYPRE_Int num_procs, HYPRE_Int myid, ProblemData *data_ptr ) { HYPRE_MemoryLocation memory_location = global_data.memory_location; ProblemData data = global_data; ProblemPartData pdata; HYPRE_Int *pool_procs; HYPRE_Int np, pid; HYPRE_Int pool, part, box, b, p, q, r, i, d; HYPRE_Int dmap, sign, size; HYPRE_Int *iptr; HYPRE_Real *dptr; Index m, mmap, n; ProblemIndex ilower, iupper, int_ilower, int_iupper; /* set default pool distribution */ data.npools = data.dist_npools[pooldist]; data.pools = data.dist_pools[pooldist]; /* determine first process number in each pool */ pool_procs = hypre_CTAlloc(HYPRE_Int, (data.npools + 1), HYPRE_MEMORY_HOST); for (part = 0; part < data.nparts; part++) { pool = data.pools[part] + 1; np = distribute[part][0] * distribute[part][1] * distribute[part][2]; pool_procs[pool] = hypre_max(pool_procs[pool], np); } pool_procs[0] = 0; for (pool = 1; pool < (data.npools + 1); pool++) { pool_procs[pool] = pool_procs[pool - 1] + pool_procs[pool]; } /* check number of processes */ if (pool_procs[data.npools] != num_procs) { hypre_printf("%d, %d \n", pool_procs[data.npools], num_procs); hypre_printf("Error: Invalid number of processes or process topology \n"); exit(1); } /* modify part data */ for (part = 0; part < data.nparts; part++) { pdata = data.pdata[part]; pool = data.pools[part]; np = distribute[part][0] * distribute[part][1] * distribute[part][2]; pid = myid - pool_procs[pool]; if ( (pid < 0) || (pid >= np) ) { /* none of this part data lives on this process */ pdata.nboxes = 0; #if 1 /* set this to 0 to make all of the SetSharedPart calls */ pdata.glue_nboxes = 0; #endif pdata.graph_nboxes = 0; pdata.matset_nboxes = 0; for (box = 0; box < pdata.matadd_nboxes; box++) { hypre_TFree(pdata.matadd_entries[box], HYPRE_MEMORY_HOST); hypre_TFree(pdata.matadd_values[box], HYPRE_MEMORY_HOST); } pdata.matadd_nboxes = 0; for (box = 0; box < pdata.fem_matadd_nboxes; box++) { hypre_TFree(pdata.fem_matadd_rows[box], HYPRE_MEMORY_HOST); hypre_TFree(pdata.fem_matadd_cols[box], HYPRE_MEMORY_HOST); hypre_TFree(pdata.fem_matadd_values[box], HYPRE_MEMORY_HOST); } pdata.fem_matadd_nboxes = 0; pdata.rhsadd_nboxes = 0; for (box = 0; box < pdata.fem_rhsadd_nboxes; box++) { hypre_TFree(pdata.fem_rhsadd_values[box], HYPRE_MEMORY_HOST); } pdata.fem_rhsadd_nboxes = 0; } else { /* refine boxes */ m[0] = refine[part][0]; m[1] = refine[part][1]; m[2] = refine[part][2]; if ( (m[0] * m[1] * m[2]) > 1) { for (box = 0; box < pdata.nboxes; box++) { MapProblemIndex(pdata.ilowers[box], m); MapProblemIndex(pdata.iuppers[box], m); } for (box = 0; box < pdata.graph_nboxes; box++) { MapProblemIndex(pdata.graph_ilowers[box], m); MapProblemIndex(pdata.graph_iuppers[box], m); mmap[0] = m[pdata.graph_index_maps[box][0]]; mmap[1] = m[pdata.graph_index_maps[box][1]]; mmap[2] = m[pdata.graph_index_maps[box][2]]; MapProblemIndex(pdata.graph_to_ilowers[box], mmap); MapProblemIndex(pdata.graph_to_iuppers[box], mmap); } for (box = 0; box < pdata.matset_nboxes; box++) { MapProblemIndex(pdata.matset_ilowers[box], m); MapProblemIndex(pdata.matset_iuppers[box], m); } for (box = 0; box < pdata.matadd_nboxes; box++) { MapProblemIndex(pdata.matadd_ilowers[box], m); MapProblemIndex(pdata.matadd_iuppers[box], m); } for (box = 0; box < pdata.fem_matadd_nboxes; box++) { MapProblemIndex(pdata.fem_matadd_ilowers[box], m); MapProblemIndex(pdata.fem_matadd_iuppers[box], m); } for (box = 0; box < pdata.rhsadd_nboxes; box++) { MapProblemIndex(pdata.rhsadd_ilowers[box], m); MapProblemIndex(pdata.rhsadd_iuppers[box], m); } for (box = 0; box < pdata.fem_rhsadd_nboxes; box++) { MapProblemIndex(pdata.fem_rhsadd_ilowers[box], m); MapProblemIndex(pdata.fem_rhsadd_iuppers[box], m); } } /* refine and distribute boxes */ m[0] = distribute[part][0]; m[1] = distribute[part][1]; m[2] = distribute[part][2]; if ( (m[0] * m[1] * m[2]) > 1) { p = pid % m[0]; q = ((pid - p) / m[0]) % m[1]; r = (pid - p - q * m[0]) / (m[0] * m[1]); for (box = 0; box < pdata.nboxes; box++) { n[0] = pdata.iuppers[box][0] - pdata.ilowers[box][0] + 1; n[1] = pdata.iuppers[box][1] - pdata.ilowers[box][1] + 1; n[2] = pdata.iuppers[box][2] - pdata.ilowers[box][2] + 1; MapProblemIndex(pdata.ilowers[box], m); MapProblemIndex(pdata.iuppers[box], m); pdata.iuppers[box][0] = pdata.ilowers[box][0] + n[0] - 1; pdata.iuppers[box][1] = pdata.ilowers[box][1] + n[1] - 1; pdata.iuppers[box][2] = pdata.ilowers[box][2] + n[2] - 1; pdata.ilowers[box][0] = pdata.ilowers[box][0] + p * n[0]; pdata.ilowers[box][1] = pdata.ilowers[box][1] + q * n[1]; pdata.ilowers[box][2] = pdata.ilowers[box][2] + r * n[2]; pdata.iuppers[box][0] = pdata.iuppers[box][0] + p * n[0]; pdata.iuppers[box][1] = pdata.iuppers[box][1] + q * n[1]; pdata.iuppers[box][2] = pdata.iuppers[box][2] + r * n[2]; } i = 0; for (box = 0; box < pdata.graph_nboxes; box++) { MapProblemIndex(pdata.graph_ilowers[box], m); MapProblemIndex(pdata.graph_iuppers[box], m); mmap[0] = m[pdata.graph_index_maps[box][0]]; mmap[1] = m[pdata.graph_index_maps[box][1]]; mmap[2] = m[pdata.graph_index_maps[box][2]]; MapProblemIndex(pdata.graph_to_ilowers[box], mmap); MapProblemIndex(pdata.graph_to_iuppers[box], mmap); for (b = 0; b < pdata.nboxes; b++) { /* first convert the box extents based on vartype */ GetVariableBox(pdata.ilowers[b], pdata.iuppers[b], pdata.vartypes[pdata.graph_vars[box]], ilower, iupper); size = IntersectBoxes(pdata.graph_ilowers[box], pdata.graph_iuppers[box], ilower, iupper, int_ilower, int_iupper); if (size > 0) { /* if there is an intersection, it is the only one */ for (d = 0; d < 3; d++) { dmap = pdata.graph_index_maps[box][d]; sign = pdata.graph_index_signs[box][d]; pdata.graph_to_ilowers[i][dmap] = pdata.graph_to_ilowers[box][dmap] + sign * pdata.graph_to_strides[box][d] * ((int_ilower[d] - pdata.graph_ilowers[box][d]) / pdata.graph_strides[box][d]); pdata.graph_to_iuppers[i][dmap] = pdata.graph_to_iuppers[box][dmap] + sign * pdata.graph_to_strides[box][d] * ((int_iupper[d] - pdata.graph_iuppers[box][d]) / pdata.graph_strides[box][d]); pdata.graph_ilowers[i][d] = int_ilower[d]; pdata.graph_iuppers[i][d] = int_iupper[d]; pdata.graph_strides[i][d] = pdata.graph_strides[box][d]; pdata.graph_to_strides[i][d] = pdata.graph_to_strides[box][d]; pdata.graph_index_maps[i][d] = dmap; pdata.graph_index_signs[i][d] = sign; } for (d = 3; d < 9; d++) { pdata.graph_ilowers[i][d] = pdata.graph_ilowers[box][d]; pdata.graph_iuppers[i][d] = pdata.graph_iuppers[box][d]; pdata.graph_to_ilowers[i][d] = pdata.graph_to_ilowers[box][d]; pdata.graph_to_iuppers[i][d] = pdata.graph_to_iuppers[box][d]; } pdata.graph_vars[i] = pdata.graph_vars[box]; pdata.graph_to_parts[i] = pdata.graph_to_parts[box]; pdata.graph_to_vars[i] = pdata.graph_to_vars[box]; pdata.graph_entries[i] = pdata.graph_entries[box]; pdata.graph_values[i] = pdata.graph_values[box]; i++; break; } } } pdata.graph_nboxes = i; i = 0; for (box = 0; box < pdata.matset_nboxes; box++) { MapProblemIndex(pdata.matset_ilowers[box], m); MapProblemIndex(pdata.matset_iuppers[box], m); for (b = 0; b < pdata.nboxes; b++) { /* first convert the box extents based on vartype */ GetVariableBox(pdata.ilowers[b], pdata.iuppers[b], pdata.vartypes[pdata.matset_vars[box]], ilower, iupper); size = IntersectBoxes(pdata.matset_ilowers[box], pdata.matset_iuppers[box], ilower, iupper, int_ilower, int_iupper); if (size > 0) { /* if there is an intersection, it is the only one */ for (d = 0; d < 3; d++) { pdata.matset_ilowers[i][d] = int_ilower[d]; pdata.matset_iuppers[i][d] = int_iupper[d]; pdata.matset_strides[i][d] = pdata.matset_strides[box][d]; } for (d = 3; d < 9; d++) { pdata.matset_ilowers[i][d] = pdata.matset_ilowers[box][d]; pdata.matset_iuppers[i][d] = pdata.matset_iuppers[box][d]; } pdata.matset_vars[i] = pdata.matset_vars[box]; pdata.matset_entries[i] = pdata.matset_entries[box]; pdata.matset_values[i] = pdata.matset_values[box]; i++; break; } } } pdata.matset_nboxes = i; i = 0; for (box = 0; box < pdata.matadd_nboxes; box++) { MapProblemIndex(pdata.matadd_ilowers[box], m); MapProblemIndex(pdata.matadd_iuppers[box], m); for (b = 0; b < pdata.nboxes; b++) { /* first convert the box extents based on vartype */ GetVariableBox(pdata.ilowers[b], pdata.iuppers[b], pdata.vartypes[pdata.matadd_vars[box]], ilower, iupper); size = IntersectBoxes(pdata.matadd_ilowers[box], pdata.matadd_iuppers[box], ilower, iupper, int_ilower, int_iupper); if (size > 0) { /* if there is an intersection, it is the only one */ for (d = 0; d < 3; d++) { pdata.matadd_ilowers[i][d] = int_ilower[d]; pdata.matadd_iuppers[i][d] = int_iupper[d]; } for (d = 3; d < 9; d++) { pdata.matadd_ilowers[i][d] = pdata.matadd_ilowers[box][d]; pdata.matadd_iuppers[i][d] = pdata.matadd_iuppers[box][d]; } pdata.matadd_vars[i] = pdata.matadd_vars[box]; pdata.matadd_nentries[i] = pdata.matadd_nentries[box]; iptr = pdata.matadd_entries[i]; pdata.matadd_entries[i] = pdata.matadd_entries[box]; pdata.matadd_entries[box] = iptr; dptr = pdata.matadd_values[i]; pdata.matadd_values[i] = pdata.matadd_values[box]; pdata.matadd_values[box] = dptr; i++; break; } } } for (box = i; box < pdata.matadd_nboxes; box++) { hypre_TFree(pdata.matadd_entries[box], HYPRE_MEMORY_HOST); hypre_TFree(pdata.matadd_values[box], HYPRE_MEMORY_HOST); } pdata.matadd_nboxes = i; i = 0; for (box = 0; box < pdata.fem_matadd_nboxes; box++) { MapProblemIndex(pdata.fem_matadd_ilowers[box], m); MapProblemIndex(pdata.fem_matadd_iuppers[box], m); for (b = 0; b < pdata.nboxes; b++) { /* fe is cell-based, so no need to convert box extents */ size = IntersectBoxes(pdata.fem_matadd_ilowers[box], pdata.fem_matadd_iuppers[box], pdata.ilowers[b], pdata.iuppers[b], int_ilower, int_iupper); if (size > 0) { /* if there is an intersection, it is the only one */ for (d = 0; d < 3; d++) { pdata.fem_matadd_ilowers[i][d] = int_ilower[d]; pdata.fem_matadd_iuppers[i][d] = int_iupper[d]; } for (d = 3; d < 9; d++) { pdata.fem_matadd_ilowers[i][d] = pdata.fem_matadd_ilowers[box][d]; pdata.fem_matadd_iuppers[i][d] = pdata.fem_matadd_iuppers[box][d]; } pdata.fem_matadd_nrows[i] = pdata.fem_matadd_nrows[box]; iptr = pdata.fem_matadd_rows[box]; iptr = pdata.fem_matadd_rows[i]; pdata.fem_matadd_rows[i] = pdata.fem_matadd_rows[box]; pdata.fem_matadd_rows[box] = iptr; pdata.fem_matadd_ncols[i] = pdata.fem_matadd_ncols[box]; iptr = pdata.fem_matadd_cols[i]; pdata.fem_matadd_cols[i] = pdata.fem_matadd_cols[box]; pdata.fem_matadd_cols[box] = iptr; dptr = pdata.fem_matadd_values[i]; pdata.fem_matadd_values[i] = pdata.fem_matadd_values[box]; pdata.fem_matadd_values[box] = dptr; i++; break; } } } for (box = i; box < pdata.fem_matadd_nboxes; box++) { hypre_TFree(pdata.fem_matadd_rows[box], HYPRE_MEMORY_HOST); hypre_TFree(pdata.fem_matadd_cols[box], HYPRE_MEMORY_HOST); hypre_TFree(pdata.fem_matadd_values[box], HYPRE_MEMORY_HOST); } pdata.fem_matadd_nboxes = i; i = 0; for (box = 0; box < pdata.rhsadd_nboxes; box++) { MapProblemIndex(pdata.rhsadd_ilowers[box], m); MapProblemIndex(pdata.rhsadd_iuppers[box], m); for (b = 0; b < pdata.nboxes; b++) { /* first convert the box extents based on vartype */ GetVariableBox(pdata.ilowers[b], pdata.iuppers[b], pdata.vartypes[pdata.rhsadd_vars[box]], ilower, iupper); size = IntersectBoxes(pdata.rhsadd_ilowers[box], pdata.rhsadd_iuppers[box], ilower, iupper, int_ilower, int_iupper); if (size > 0) { /* if there is an intersection, it is the only one */ for (d = 0; d < 3; d++) { pdata.rhsadd_ilowers[i][d] = int_ilower[d]; pdata.rhsadd_iuppers[i][d] = int_iupper[d]; } for (d = 3; d < 9; d++) { pdata.rhsadd_ilowers[i][d] = pdata.rhsadd_ilowers[box][d]; pdata.rhsadd_iuppers[i][d] = pdata.rhsadd_iuppers[box][d]; } pdata.rhsadd_vars[i] = pdata.rhsadd_vars[box]; pdata.rhsadd_values[i] = pdata.rhsadd_values[box]; i++; break; } } } pdata.rhsadd_nboxes = i; i = 0; for (box = 0; box < pdata.fem_rhsadd_nboxes; box++) { MapProblemIndex(pdata.fem_rhsadd_ilowers[box], m); MapProblemIndex(pdata.fem_rhsadd_iuppers[box], m); for (b = 0; b < pdata.nboxes; b++) { /* fe is cell-based, so no need to convert box extents */ size = IntersectBoxes(pdata.fem_rhsadd_ilowers[box], pdata.fem_rhsadd_iuppers[box], pdata.ilowers[b], pdata.iuppers[b], int_ilower, int_iupper); if (size > 0) { /* if there is an intersection, it is the only one */ for (d = 0; d < 3; d++) { pdata.fem_rhsadd_ilowers[i][d] = int_ilower[d]; pdata.fem_rhsadd_iuppers[i][d] = int_iupper[d]; } for (d = 3; d < 9; d++) { pdata.fem_rhsadd_ilowers[i][d] = pdata.fem_rhsadd_ilowers[box][d]; pdata.fem_rhsadd_iuppers[i][d] = pdata.fem_rhsadd_iuppers[box][d]; } dptr = pdata.fem_rhsadd_values[i]; pdata.fem_rhsadd_values[i] = pdata.fem_rhsadd_values[box]; pdata.fem_rhsadd_values[box] = dptr; i++; break; } } } for (box = i; box < pdata.fem_rhsadd_nboxes; box++) { hypre_TFree(pdata.fem_rhsadd_values[box], HYPRE_MEMORY_HOST); } pdata.fem_rhsadd_nboxes = i; } /* refine and block boxes */ m[0] = block[part][0]; m[1] = block[part][1]; m[2] = block[part][2]; if ( (m[0] * m[1] * m[2]) > 1) { pdata.ilowers = hypre_TReAlloc(pdata.ilowers, ProblemIndex, m[0] * m[1] * m[2] * pdata.nboxes, HYPRE_MEMORY_HOST); pdata.iuppers = hypre_TReAlloc(pdata.iuppers, ProblemIndex, m[0] * m[1] * m[2] * pdata.nboxes, HYPRE_MEMORY_HOST); pdata.boxsizes = hypre_TReAlloc(pdata.boxsizes, HYPRE_Int, m[0] * m[1] * m[2] * pdata.nboxes, HYPRE_MEMORY_HOST); for (box = 0; box < pdata.nboxes; box++) { n[0] = pdata.iuppers[box][0] - pdata.ilowers[box][0] + 1; n[1] = pdata.iuppers[box][1] - pdata.ilowers[box][1] + 1; n[2] = pdata.iuppers[box][2] - pdata.ilowers[box][2] + 1; MapProblemIndex(pdata.ilowers[box], m); MapProblemIndex(pdata.iuppers[box], m); pdata.iuppers[box][0] = pdata.ilowers[box][0] + n[0] - 1; pdata.iuppers[box][1] = pdata.ilowers[box][1] + n[1] - 1; pdata.iuppers[box][2] = pdata.ilowers[box][2] + n[2] - 1; i = box; for (r = 0; r < m[2]; r++) { for (q = 0; q < m[1]; q++) { for (p = 0; p < m[0]; p++) { pdata.ilowers[i][0] = pdata.ilowers[box][0] + p * n[0]; pdata.ilowers[i][1] = pdata.ilowers[box][1] + q * n[1]; pdata.ilowers[i][2] = pdata.ilowers[box][2] + r * n[2]; pdata.iuppers[i][0] = pdata.iuppers[box][0] + p * n[0]; pdata.iuppers[i][1] = pdata.iuppers[box][1] + q * n[1]; pdata.iuppers[i][2] = pdata.iuppers[box][2] + r * n[2]; for (d = 3; d < 9; d++) { pdata.ilowers[i][d] = pdata.ilowers[box][d]; pdata.iuppers[i][d] = pdata.iuppers[box][d]; } i += pdata.nboxes; } } } } pdata.nboxes *= m[0] * m[1] * m[2]; for (box = 0; box < pdata.graph_nboxes; box++) { MapProblemIndex(pdata.graph_ilowers[box], m); MapProblemIndex(pdata.graph_iuppers[box], m); mmap[0] = m[pdata.graph_index_maps[box][0]]; mmap[1] = m[pdata.graph_index_maps[box][1]]; mmap[2] = m[pdata.graph_index_maps[box][2]]; MapProblemIndex(pdata.graph_to_ilowers[box], mmap); MapProblemIndex(pdata.graph_to_iuppers[box], mmap); } for (box = 0; box < pdata.matset_nboxes; box++) { MapProblemIndex(pdata.matset_ilowers[box], m); MapProblemIndex(pdata.matset_iuppers[box], m); } for (box = 0; box < pdata.matadd_nboxes; box++) { MapProblemIndex(pdata.matadd_ilowers[box], m); MapProblemIndex(pdata.matadd_iuppers[box], m); } for (box = 0; box < pdata.fem_matadd_nboxes; box++) { MapProblemIndex(pdata.fem_matadd_ilowers[box], m); MapProblemIndex(pdata.fem_matadd_iuppers[box], m); } for (box = 0; box < pdata.rhsadd_nboxes; box++) { MapProblemIndex(pdata.rhsadd_ilowers[box], m); MapProblemIndex(pdata.rhsadd_iuppers[box], m); } for (box = 0; box < pdata.fem_rhsadd_nboxes; box++) { MapProblemIndex(pdata.fem_rhsadd_ilowers[box], m); MapProblemIndex(pdata.fem_rhsadd_iuppers[box], m); } } /* map remaining ilowers & iuppers */ m[0] = refine[part][0] * block[part][0] * distribute[part][0]; m[1] = refine[part][1] * block[part][1] * distribute[part][1]; m[2] = refine[part][2] * block[part][2] * distribute[part][2]; if ( (m[0] * m[1] * m[2]) > 1) { for (box = 0; box < pdata.glue_nboxes; box++) { MapProblemIndex(pdata.glue_ilowers[box], m); MapProblemIndex(pdata.glue_iuppers[box], m); mmap[0] = m[pdata.glue_index_maps[box][0]]; mmap[1] = m[pdata.glue_index_maps[box][1]]; mmap[2] = m[pdata.glue_index_maps[box][2]]; MapProblemIndex(pdata.glue_nbor_ilowers[box], mmap); MapProblemIndex(pdata.glue_nbor_iuppers[box], mmap); } } /* compute box sizes, etc. */ pdata.max_boxsize = 0; for (box = 0; box < pdata.nboxes; box++) { pdata.boxsizes[box] = 1; for (i = 0; i < 3; i++) { pdata.boxsizes[box] *= (pdata.iuppers[box][i] - pdata.ilowers[box][i] + 2); } pdata.max_boxsize = hypre_max(pdata.max_boxsize, pdata.boxsizes[box]); } for (box = 0; box < pdata.graph_nboxes; box++) { pdata.graph_boxsizes[box] = 1; for (i = 0; i < 3; i++) { pdata.graph_boxsizes[box] *= (pdata.graph_iuppers[box][i] - pdata.graph_ilowers[box][i] + 1); } } for (box = 0; box < pdata.matset_nboxes; box++) { size = 1; for (i = 0; i < 3; i++) { size *= (pdata.matset_iuppers[box][i] - pdata.matset_ilowers[box][i] + 1); } pdata.max_boxsize = hypre_max(pdata.max_boxsize, size); } for (box = 0; box < pdata.matadd_nboxes; box++) { size = 1; for (i = 0; i < 3; i++) { size *= (pdata.matadd_iuppers[box][i] - pdata.matadd_ilowers[box][i] + 1); } pdata.max_boxsize = hypre_max(pdata.max_boxsize, size); } for (box = 0; box < pdata.fem_matadd_nboxes; box++) { size = 1; for (i = 0; i < 3; i++) { size *= (pdata.fem_matadd_iuppers[box][i] - pdata.fem_matadd_ilowers[box][i] + 1); } pdata.max_boxsize = hypre_max(pdata.max_boxsize, size); } for (box = 0; box < pdata.rhsadd_nboxes; box++) { size = 1; for (i = 0; i < 3; i++) { size *= (pdata.rhsadd_iuppers[box][i] - pdata.rhsadd_ilowers[box][i] + 1); } pdata.max_boxsize = hypre_max(pdata.max_boxsize, size); } for (box = 0; box < pdata.fem_rhsadd_nboxes; box++) { size = 1; for (i = 0; i < 3; i++) { size *= (pdata.fem_rhsadd_iuppers[box][i] - pdata.fem_rhsadd_ilowers[box][i] + 1); } pdata.max_boxsize = hypre_max(pdata.max_boxsize, size); } /* refine periodicity */ pdata.periodic[0] *= refine[part][0] * block[part][0] * distribute[part][0]; pdata.periodic[1] *= refine[part][1] * block[part][1] * distribute[part][1]; pdata.periodic[2] *= refine[part][2] * block[part][2] * distribute[part][2]; } if (pdata.nboxes == 0) { hypre_TFree(pdata.ilowers, HYPRE_MEMORY_HOST); hypre_TFree(pdata.iuppers, HYPRE_MEMORY_HOST); hypre_TFree(pdata.boxsizes, HYPRE_MEMORY_HOST); pdata.max_boxsize = 0; } if (pdata.glue_nboxes == 0) { hypre_TFree(pdata.glue_shared, HYPRE_MEMORY_HOST); hypre_TFree(pdata.glue_ilowers, HYPRE_MEMORY_HOST); hypre_TFree(pdata.glue_iuppers, HYPRE_MEMORY_HOST); hypre_TFree(pdata.glue_offsets, HYPRE_MEMORY_HOST); hypre_TFree(pdata.glue_nbor_parts, HYPRE_MEMORY_HOST); hypre_TFree(pdata.glue_nbor_ilowers, HYPRE_MEMORY_HOST); hypre_TFree(pdata.glue_nbor_iuppers, HYPRE_MEMORY_HOST); hypre_TFree(pdata.glue_nbor_offsets, HYPRE_MEMORY_HOST); hypre_TFree(pdata.glue_index_maps, HYPRE_MEMORY_HOST); hypre_TFree(pdata.glue_index_dirs, HYPRE_MEMORY_HOST); hypre_TFree(pdata.glue_primaries, HYPRE_MEMORY_HOST); } if (pdata.graph_nboxes == 0) { hypre_TFree(pdata.graph_ilowers, HYPRE_MEMORY_HOST); hypre_TFree(pdata.graph_iuppers, HYPRE_MEMORY_HOST); hypre_TFree(pdata.graph_strides, HYPRE_MEMORY_HOST); hypre_TFree(pdata.graph_vars, HYPRE_MEMORY_HOST); hypre_TFree(pdata.graph_to_parts, HYPRE_MEMORY_HOST); hypre_TFree(pdata.graph_to_ilowers, HYPRE_MEMORY_HOST); hypre_TFree(pdata.graph_to_iuppers, HYPRE_MEMORY_HOST); hypre_TFree(pdata.graph_to_strides, HYPRE_MEMORY_HOST); hypre_TFree(pdata.graph_to_vars, HYPRE_MEMORY_HOST); hypre_TFree(pdata.graph_index_maps, HYPRE_MEMORY_HOST); hypre_TFree(pdata.graph_index_signs, HYPRE_MEMORY_HOST); hypre_TFree(pdata.graph_entries, HYPRE_MEMORY_HOST); pdata.graph_values_size = 0; hypre_TFree(pdata.graph_values, HYPRE_MEMORY_HOST); hypre_TFree(pdata.d_graph_values, memory_location); hypre_TFree(pdata.graph_boxsizes, HYPRE_MEMORY_HOST); } if (pdata.matset_nboxes == 0) { hypre_TFree(pdata.matset_ilowers, HYPRE_MEMORY_HOST); hypre_TFree(pdata.matset_iuppers, HYPRE_MEMORY_HOST); hypre_TFree(pdata.matset_strides, HYPRE_MEMORY_HOST); hypre_TFree(pdata.matset_vars, HYPRE_MEMORY_HOST); hypre_TFree(pdata.matset_entries, HYPRE_MEMORY_HOST); hypre_TFree(pdata.matset_values, HYPRE_MEMORY_HOST); } if (pdata.matadd_nboxes == 0) { hypre_TFree(pdata.matadd_ilowers, HYPRE_MEMORY_HOST); hypre_TFree(pdata.matadd_iuppers, HYPRE_MEMORY_HOST); hypre_TFree(pdata.matadd_vars, HYPRE_MEMORY_HOST); hypre_TFree(pdata.matadd_nentries, HYPRE_MEMORY_HOST); hypre_TFree(pdata.matadd_entries, HYPRE_MEMORY_HOST); hypre_TFree(pdata.matadd_values, HYPRE_MEMORY_HOST); } if (pdata.fem_matadd_nboxes == 0) { hypre_TFree(pdata.fem_matadd_ilowers, HYPRE_MEMORY_HOST); hypre_TFree(pdata.fem_matadd_iuppers, HYPRE_MEMORY_HOST); hypre_TFree(pdata.fem_matadd_nrows, HYPRE_MEMORY_HOST); hypre_TFree(pdata.fem_matadd_ncols, HYPRE_MEMORY_HOST); hypre_TFree(pdata.fem_matadd_rows, HYPRE_MEMORY_HOST); hypre_TFree(pdata.fem_matadd_cols, HYPRE_MEMORY_HOST); hypre_TFree(pdata.fem_matadd_values, HYPRE_MEMORY_HOST); } if (pdata.rhsadd_nboxes == 0) { hypre_TFree(pdata.rhsadd_ilowers, HYPRE_MEMORY_HOST); hypre_TFree(pdata.rhsadd_iuppers, HYPRE_MEMORY_HOST); hypre_TFree(pdata.rhsadd_vars, HYPRE_MEMORY_HOST); hypre_TFree(pdata.rhsadd_values, HYPRE_MEMORY_HOST); } if (pdata.fem_rhsadd_nboxes == 0) { hypre_TFree(pdata.fem_rhsadd_ilowers, HYPRE_MEMORY_HOST); hypre_TFree(pdata.fem_rhsadd_iuppers, HYPRE_MEMORY_HOST); hypre_TFree(pdata.fem_rhsadd_values, HYPRE_MEMORY_HOST); } data.pdata[part] = pdata; } data.max_boxsize = 0; for (part = 0; part < data.nparts; part++) { data.max_boxsize = hypre_max(data.max_boxsize, data.pdata[part].max_boxsize); } hypre_TFree(pool_procs, HYPRE_MEMORY_HOST); *data_ptr = data; return 0; } /*-------------------------------------------------------------------------- * Destroy data *--------------------------------------------------------------------------*/ HYPRE_Int DestroyData( ProblemData data ) { HYPRE_MemoryLocation memory_location = data.memory_location; ProblemPartData pdata; HYPRE_Int part, box, s, i; for (part = 0; part < data.nparts; part++) { pdata = data.pdata[part]; if (pdata.nboxes > 0) { hypre_TFree(pdata.ilowers, HYPRE_MEMORY_HOST); hypre_TFree(pdata.iuppers, HYPRE_MEMORY_HOST); hypre_TFree(pdata.boxsizes, HYPRE_MEMORY_HOST); } if (pdata.nvars > 0) { hypre_TFree(pdata.vartypes, HYPRE_MEMORY_HOST); } if (pdata.add_nvars > 0) { hypre_TFree(pdata.add_indexes, HYPRE_MEMORY_HOST); hypre_TFree(pdata.add_vartypes, HYPRE_MEMORY_HOST); } if (pdata.glue_nboxes > 0) { hypre_TFree(pdata.glue_shared, HYPRE_MEMORY_HOST); hypre_TFree(pdata.glue_ilowers, HYPRE_MEMORY_HOST); hypre_TFree(pdata.glue_iuppers, HYPRE_MEMORY_HOST); hypre_TFree(pdata.glue_offsets, HYPRE_MEMORY_HOST); hypre_TFree(pdata.glue_nbor_parts, HYPRE_MEMORY_HOST); hypre_TFree(pdata.glue_nbor_ilowers, HYPRE_MEMORY_HOST); hypre_TFree(pdata.glue_nbor_iuppers, HYPRE_MEMORY_HOST); hypre_TFree(pdata.glue_nbor_offsets, HYPRE_MEMORY_HOST); hypre_TFree(pdata.glue_index_maps, HYPRE_MEMORY_HOST); hypre_TFree(pdata.glue_index_dirs, HYPRE_MEMORY_HOST); hypre_TFree(pdata.glue_primaries, HYPRE_MEMORY_HOST); } if (pdata.nvars > 0) { hypre_TFree(pdata.stencil_num, HYPRE_MEMORY_HOST); } if (pdata.graph_nboxes > 0) { hypre_TFree(pdata.graph_ilowers, HYPRE_MEMORY_HOST); hypre_TFree(pdata.graph_iuppers, HYPRE_MEMORY_HOST); hypre_TFree(pdata.graph_strides, HYPRE_MEMORY_HOST); hypre_TFree(pdata.graph_vars, HYPRE_MEMORY_HOST); hypre_TFree(pdata.graph_to_parts, HYPRE_MEMORY_HOST); hypre_TFree(pdata.graph_to_ilowers, HYPRE_MEMORY_HOST); hypre_TFree(pdata.graph_to_iuppers, HYPRE_MEMORY_HOST); hypre_TFree(pdata.graph_to_strides, HYPRE_MEMORY_HOST); hypre_TFree(pdata.graph_to_vars, HYPRE_MEMORY_HOST); hypre_TFree(pdata.graph_index_maps, HYPRE_MEMORY_HOST); hypre_TFree(pdata.graph_index_signs, HYPRE_MEMORY_HOST); hypre_TFree(pdata.graph_entries, HYPRE_MEMORY_HOST); pdata.graph_values_size = 0; hypre_TFree(pdata.graph_values, HYPRE_MEMORY_HOST); hypre_TFree(pdata.d_graph_values, memory_location); hypre_TFree(pdata.graph_boxsizes, HYPRE_MEMORY_HOST); } if (pdata.matset_nboxes > 0) { hypre_TFree(pdata.matset_ilowers, HYPRE_MEMORY_HOST); hypre_TFree(pdata.matset_iuppers, HYPRE_MEMORY_HOST); hypre_TFree(pdata.matset_strides, HYPRE_MEMORY_HOST); hypre_TFree(pdata.matset_vars, HYPRE_MEMORY_HOST); hypre_TFree(pdata.matset_entries, HYPRE_MEMORY_HOST); hypre_TFree(pdata.matset_values, HYPRE_MEMORY_HOST); } if (pdata.matadd_nboxes > 0) { hypre_TFree(pdata.matadd_ilowers, HYPRE_MEMORY_HOST); hypre_TFree(pdata.matadd_iuppers, HYPRE_MEMORY_HOST); hypre_TFree(pdata.matadd_vars, HYPRE_MEMORY_HOST); hypre_TFree(pdata.matadd_nentries, HYPRE_MEMORY_HOST); for (box = 0; box < pdata.matadd_nboxes; box++) { hypre_TFree(pdata.matadd_entries[box], HYPRE_MEMORY_HOST); hypre_TFree(pdata.matadd_values[box], HYPRE_MEMORY_HOST); } hypre_TFree(pdata.matadd_entries, HYPRE_MEMORY_HOST); hypre_TFree(pdata.matadd_values, HYPRE_MEMORY_HOST); } if (pdata.fem_matadd_nboxes > 0) { hypre_TFree(pdata.fem_matadd_ilowers, HYPRE_MEMORY_HOST); hypre_TFree(pdata.fem_matadd_iuppers, HYPRE_MEMORY_HOST); hypre_TFree(pdata.fem_matadd_nrows, HYPRE_MEMORY_HOST); hypre_TFree(pdata.fem_matadd_ncols, HYPRE_MEMORY_HOST); for (box = 0; box < pdata.fem_matadd_nboxes; box++) { hypre_TFree(pdata.fem_matadd_rows[box], HYPRE_MEMORY_HOST); hypre_TFree(pdata.fem_matadd_cols[box], HYPRE_MEMORY_HOST); hypre_TFree(pdata.fem_matadd_values[box], HYPRE_MEMORY_HOST); } hypre_TFree(pdata.fem_matadd_rows, HYPRE_MEMORY_HOST); hypre_TFree(pdata.fem_matadd_cols, HYPRE_MEMORY_HOST); hypre_TFree(pdata.fem_matadd_values, HYPRE_MEMORY_HOST); } if (pdata.rhsadd_nboxes > 0) { hypre_TFree(pdata.rhsadd_ilowers, HYPRE_MEMORY_HOST); hypre_TFree(pdata.rhsadd_iuppers, HYPRE_MEMORY_HOST); hypre_TFree(pdata.rhsadd_vars, HYPRE_MEMORY_HOST); hypre_TFree(pdata.rhsadd_values, HYPRE_MEMORY_HOST); } if (pdata.fem_rhsadd_nboxes > 0) { hypre_TFree(pdata.fem_rhsadd_ilowers, HYPRE_MEMORY_HOST); hypre_TFree(pdata.fem_rhsadd_iuppers, HYPRE_MEMORY_HOST); for (box = 0; box < pdata.fem_rhsadd_nboxes; box++) { hypre_TFree(pdata.fem_rhsadd_values[box], HYPRE_MEMORY_HOST); } hypre_TFree(pdata.fem_rhsadd_values, HYPRE_MEMORY_HOST); } } hypre_TFree(data.pdata, HYPRE_MEMORY_HOST); hypre_TFree(data.numghost, HYPRE_MEMORY_HOST); if (data.nstencils > 0) { for (s = 0; s < data.nstencils; s++) { hypre_TFree(data.stencil_offsets[s], HYPRE_MEMORY_HOST); hypre_TFree(data.stencil_vars[s], HYPRE_MEMORY_HOST); hypre_TFree(data.stencil_values[s], HYPRE_MEMORY_HOST); } hypre_TFree(data.stencil_sizes, HYPRE_MEMORY_HOST); hypre_TFree(data.stencil_offsets, HYPRE_MEMORY_HOST); hypre_TFree(data.stencil_vars, HYPRE_MEMORY_HOST); hypre_TFree(data.stencil_values, HYPRE_MEMORY_HOST); } if (data.fem_nvars > 0) { for (s = 0; s < data.fem_nvars; s++) { hypre_TFree(data.fem_values_full[s], HYPRE_MEMORY_HOST); hypre_TFree(data.fem_ivalues_full[s], HYPRE_MEMORY_HOST); } hypre_TFree(data.fem_offsets, HYPRE_MEMORY_HOST); hypre_TFree(data.fem_vars, HYPRE_MEMORY_HOST); hypre_TFree(data.fem_values_full, HYPRE_MEMORY_HOST); hypre_TFree(data.fem_ivalues_full, HYPRE_MEMORY_HOST); hypre_TFree(data.fem_ordering, HYPRE_MEMORY_HOST); hypre_TFree(data.fem_sparsity, HYPRE_MEMORY_HOST); hypre_TFree(data.fem_values, HYPRE_MEMORY_HOST); hypre_TFree(data.d_fem_values, memory_location); } if (data.fem_rhs_true > 0) { hypre_TFree(data.fem_rhs_values, HYPRE_MEMORY_HOST); hypre_TFree(data.d_fem_rhs_values, memory_location); } if (data.symmetric_num > 0) { hypre_TFree(data.symmetric_parts, HYPRE_MEMORY_HOST); hypre_TFree(data.symmetric_vars, HYPRE_MEMORY_HOST); hypre_TFree(data.symmetric_to_vars, HYPRE_MEMORY_HOST); hypre_TFree(data.symmetric_booleans, HYPRE_MEMORY_HOST); } for (i = 0; i < data.ndists; i++) { hypre_TFree(data.dist_pools[i], HYPRE_MEMORY_HOST); } hypre_TFree(data.dist_pools, HYPRE_MEMORY_HOST); hypre_TFree(data.dist_npools, HYPRE_MEMORY_HOST); return 0; } /*-------------------------------------------------------------------------- * Routine to load cosine function *--------------------------------------------------------------------------*/ HYPRE_Int SetCosineVector(HYPRE_Real scale, Index ilower, Index iupper, HYPRE_Real *values) { HYPRE_Int i, j, k; HYPRE_Int count = 0; for (k = ilower[2]; k <= iupper[2]; k++) { for (j = ilower[1]; j <= iupper[1]; j++) { for (i = ilower[0]; i <= iupper[0]; i++) { values[count] = scale * hypre_cos((i + j + k) / 10.0); count++; } } } return (0); } /*-------------------------------------------------------------------------- * Print usage info *--------------------------------------------------------------------------*/ HYPRE_Int PrintUsage( char *progname, HYPRE_Int myid ) { if ( myid == 0 ) { hypre_printf("\n"); hypre_printf("Usage: %s [-in ] []\n", progname); hypre_printf(" %s -help | -version | -vernum \n", progname); hypre_printf("\n"); hypre_printf(" -in : input file (default is `%s')\n", infile_default); hypre_printf(" -fromfile : read SStructMatrix from file\n"); hypre_printf("\n"); hypre_printf(" -pt ... : set part(s) for subsequent options\n"); hypre_printf(" -pooldist

: pool distribution to use\n"); hypre_printf(" -r : refine part(s)\n"); hypre_printf(" -P : refine and distribute part(s)\n"); hypre_printf(" -b : refine and block part(s)\n"); hypre_printf(" -solver : solver ID (default = 39)\n"); hypre_printf(" 0 - SMG split solver\n"); hypre_printf(" 1 - PFMG split solver\n"); hypre_printf(" 3 - SysPFMG\n"); hypre_printf(" 8 - 1-step Jacobi split solver\n"); hypre_printf(" 10 - PCG with SMG split precond\n"); hypre_printf(" 11 - PCG with PFMG split precond\n"); hypre_printf(" 13 - PCG with SysPFMG precond\n"); hypre_printf(" 18 - PCG with diagonal scaling\n"); hypre_printf(" 19 - PCG\n"); hypre_printf(" 20 - PCG with BoomerAMG precond\n"); hypre_printf(" 21 - PCG with EUCLID precond\n"); hypre_printf(" 22 - PCG with ParaSails precond\n"); hypre_printf(" 28 - PCG with diagonal scaling\n"); hypre_printf(" 30 - GMRES with SMG split precond\n"); hypre_printf(" 31 - GMRES with PFMG split precond\n"); hypre_printf(" 38 - GMRES with diagonal scaling\n"); hypre_printf(" 39 - GMRES\n"); hypre_printf(" 40 - GMRES with BoomerAMG precond\n"); hypre_printf(" 41 - GMRES with EUCLID precond\n"); hypre_printf(" 42 - GMRES with ParaSails precond\n"); hypre_printf(" 50 - BiCGSTAB with SMG split precond\n"); hypre_printf(" 51 - BiCGSTAB with PFMG split precond\n"); hypre_printf(" 58 - BiCGSTAB with diagonal scaling\n"); hypre_printf(" 59 - BiCGSTAB\n"); hypre_printf(" 60 - BiCGSTAB with BoomerAMG precond\n"); hypre_printf(" 61 - BiCGSTAB with EUCLID precond\n"); hypre_printf(" 62 - BiCGSTAB with ParaSails precond\n"); hypre_printf(" 70 - Flexible GMRES with SMG split precond\n"); hypre_printf(" 71 - Flexible GMRES with PFMG split precond\n"); hypre_printf(" 78 - Flexible GMRES with diagonal scaling\n"); hypre_printf(" 80 - Flexible GMRES with BoomerAMG precond\n"); hypre_printf(" 90 - LGMRES with BoomerAMG precond\n"); hypre_printf(" 120- ParCSRHybrid with DSCG/BoomerAMG precond\n"); hypre_printf(" 150- AMS solver\n"); hypre_printf(" 200- Struct SMG\n"); hypre_printf(" 201- Struct PFMG\n"); hypre_printf(" 202- Struct SparseMSG\n"); hypre_printf(" 203- Struct PFMG constant coefficients\n"); hypre_printf(" 204- Struct PFMG constant coefficients variable diagonal\n"); hypre_printf(" 205- Struct Cyclic Reduction\n"); hypre_printf(" 208- Struct Jacobi\n"); hypre_printf(" 210- Struct CG with SMG precond\n"); hypre_printf(" 211- Struct CG with PFMG precond\n"); hypre_printf(" 212- Struct CG with SparseMSG precond\n"); hypre_printf(" 217- Struct CG with 2-step Jacobi\n"); hypre_printf(" 218- Struct CG with diagonal scaling\n"); hypre_printf(" 219- Struct CG\n"); hypre_printf(" 220- Struct Hybrid with SMG precond\n"); hypre_printf(" 221- Struct Hybrid with PFMG precond\n"); hypre_printf(" 222- Struct Hybrid with SparseMSG precond\n"); hypre_printf(" 230- Struct GMRES with SMG precond\n"); hypre_printf(" 231- Struct GMRES with PFMG precond\n"); hypre_printf(" 232- Struct GMRES with SparseMSG precond\n"); hypre_printf(" 237- Struct GMRES with 2-step Jacobi\n"); hypre_printf(" 238- Struct GMRES with diagonal scaling\n"); hypre_printf(" 239- Struct GMRES\n"); hypre_printf(" 240- Struct BiCGSTAB with SMG precond\n"); hypre_printf(" 241- Struct BiCGSTAB with PFMG precond\n"); hypre_printf(" 242- Struct BiCGSTAB with SparseMSG precond\n"); hypre_printf(" 247- Struct BiCGSTAB with 2-step Jacobi\n"); hypre_printf(" 248- Struct BiCGSTAB with diagonal scaling\n"); hypre_printf(" 249- Struct BiCGSTAB\n"); hypre_printf(" -repeats : number of times to repeat\n"); hypre_printf(" -pout : print level for the preconditioner\n"); hypre_printf(" -sout : print level for the solver\n"); hypre_printf(" -ll : hypre's log level\n"); hypre_printf(" 0 - (default) No messaging.\n"); hypre_printf(" 1 - Display memory usage statistics for each MPI rank.\n"); hypre_printf(" 2 - Display aggregate memory usage statistics over MPI ranks.\n"); hypre_printf(" -print : print out the system\n"); hypre_printf(" -rhsfromcosine : solution is cosine function (default)\n"); hypre_printf(" -rhsone : rhs is vector with unit components\n"); hypre_printf(" -tol : convergence tolerance (default 1e-6)\n"); hypre_printf(" -solver_type : Solver type for Hybrid\n"); hypre_printf(" 1 - PCG (default)\n"); hypre_printf(" 2 - GMRES\n"); hypre_printf(" 3 - BiCGSTAB (only ParCSRHybrid)\n"); hypre_printf(" -recompute : Recompute residual in PCG?\n"); hypre_printf(" -v : SysPFMG and Struct- # of pre and post relax\n"); hypre_printf(" -skip : SysPFMG and Struct- skip relaxation (0 or 1)\n"); hypre_printf(" -rap : Struct- coarse grid operator type\n"); hypre_printf(" 0 - Galerkin (default)\n"); hypre_printf(" 1 - non-Galerkin ParFlow operators\n"); hypre_printf(" 2 - Galerkin, general operators\n"); hypre_printf(" -relax : Struct- relaxation type\n"); hypre_printf(" 0 - Jacobi\n"); hypre_printf(" 1 - Weighted Jacobi (default)\n"); hypre_printf(" 2 - R/B Gauss-Seidel\n"); hypre_printf(" 3 - R/B Gauss-Seidel (nonsymmetric)\n"); hypre_printf(" -w : jacobi weight\n"); hypre_printf(" -jump : Struct- num levels to jump in SparseMSG\n"); hypre_printf(" -cf : Struct- convergence factor for Hybrid\n"); hypre_printf(" -crtdim : Struct- cyclic reduction tdim\n"); hypre_printf(" -cri : Struct- cyclic reduction base_index\n"); hypre_printf(" -crs : Struct- cyclic reduction base_stride\n"); hypre_printf(" -old_default: sets old BoomerAMG defaults, possibly better for 2D problems\n"); /* begin lobpcg */ hypre_printf("\nLOBPCG options:\n"); hypre_printf("\n"); hypre_printf(" -lobpcg : run LOBPCG instead of PCG\n"); hypre_printf("\n"); hypre_printf(" -solver none : no HYPRE preconditioner is used\n"); hypre_printf("\n"); hypre_printf(" -itr : maximal number of LOBPCG iterations (default 100);\n"); hypre_printf("\n"); hypre_printf(" -vrand : compute eigenpairs using random initial vectors (default 1)\n"); hypre_printf("\n"); hypre_printf(" -seed : use as the seed for the pseudo-random number generator\n"); hypre_printf(" (default seed is based on the time of the run)\n"); hypre_printf("\n"); hypre_printf(" -orthchk : check eigenvectors for orthonormality\n"); hypre_printf("\n"); hypre_printf(" -verb : verbosity level\n"); hypre_printf(" -verb 0 : no print\n"); hypre_printf(" -verb 1 : print initial eigenvalues and residuals, iteration number, number of\n"); hypre_printf(" non-convergent eigenpairs and final eigenvalues and residuals (default)\n"); hypre_printf(" -verb 2 : print eigenvalues and residuals on each iteration\n"); hypre_printf("\n"); hypre_printf(" -pcgitr : maximal number of inner PCG iterations for preconditioning (default 1);\n"); hypre_printf(" if = 0 then the preconditioner is applied directly\n"); hypre_printf("\n"); hypre_printf(" -pcgtol : residual tolerance for inner iterations (default 0.01)\n"); hypre_printf("\n"); hypre_printf(" -vout : file output level\n"); hypre_printf(" -vout 0 : no files created (default)\n"); hypre_printf(" -vout 1 : write eigenvalues to values.txt and residuals to residuals.txt\n"); hypre_printf(" -vout 2 : in addition to the above, write the eigenvalues history (the matrix whose\n"); hypre_printf(" i-th column contains eigenvalues at (i+1)-th iteration) to val_hist.txt and\n"); hypre_printf(" residuals history to res_hist.txt\n"); hypre_printf("\nNOTE: in this test driver LOBPCG only works with solvers 10, 11, 13, and 18\n"); hypre_printf("\ndefault solver is 10\n"); /* end lobpcg */ hypre_printf("\n"); } return 0; } /*-------------------------------------------------------------------------- * Test driver for semi-structured matrix interface *--------------------------------------------------------------------------*/ hypre_int main( hypre_int argc, char *argv[] ) { MPI_Comm comm = hypre_MPI_COMM_WORLD; char *infile; ProblemData global_data; ProblemData data; ProblemPartData pdata; HYPRE_Int nparts = 0; HYPRE_Int pooldist; HYPRE_Int *parts = NULL; Index *refine = NULL; Index *distribute = NULL; Index *block = NULL; HYPRE_Int solver_id, object_type; HYPRE_Int repeats, rep; HYPRE_Int prec_print_level; HYPRE_Int solver_print_level; HYPRE_Int log_level; HYPRE_Int print_system; HYPRE_Int cosine; HYPRE_Real scale; HYPRE_Int read_fromfile_flag = 0; HYPRE_Int read_fromfile_index[3] = {-1, -1, -1}; HYPRE_SStructGrid grid = NULL; HYPRE_SStructGrid G_grid = NULL; HYPRE_SStructStencil *stencils = NULL; HYPRE_SStructStencil *G_stencils = NULL; HYPRE_SStructGraph graph = NULL; HYPRE_SStructGraph G_graph = NULL; HYPRE_SStructMatrix A = NULL; HYPRE_SStructMatrix G = NULL; HYPRE_SStructVector b = NULL; HYPRE_SStructVector x = NULL; HYPRE_SStructSolver solver; HYPRE_SStructSolver precond; HYPRE_ParCSRMatrix par_A; HYPRE_ParVector par_b; HYPRE_ParVector par_x; HYPRE_Solver par_solver; HYPRE_Solver par_precond; HYPRE_StructMatrix sA; HYPRE_StructVector sb; HYPRE_StructVector sx; HYPRE_StructSolver struct_solver; HYPRE_StructSolver struct_precond; Index ilower, iupper; Index index, to_index; HYPRE_Int values_size = 0; HYPRE_Real *values = NULL; HYPRE_Real *d_values = NULL; HYPRE_Int num_iterations; HYPRE_Real final_res_norm; HYPRE_Int num_procs, myid; HYPRE_Int device_id = -1; HYPRE_Int lazy_device_init = 0; HYPRE_Int time_index; HYPRE_Int n_pre, n_post; HYPRE_Int skip; HYPRE_Int rap; HYPRE_Int relax; HYPRE_Real jacobi_weight; HYPRE_Int usr_jacobi_weight; HYPRE_Int jump; HYPRE_Int solver_type; HYPRE_Int recompute_res; HYPRE_Real cf_tol; HYPRE_Int cycred_tdim; Index cycred_index, cycred_stride; HYPRE_Int arg_index, part, var, box, s, entry, i, j, k, size; HYPRE_Int row, col; HYPRE_Int gradient_matrix; HYPRE_Int old_default; /* begin lobpcg */ HYPRE_SStructSolver lobpcg_solver; HYPRE_Int lobpcgFlag = 0; HYPRE_Int lobpcgSeed = 0; HYPRE_Int blockSize = 1; HYPRE_Int verbosity = 1; HYPRE_Int iterations; HYPRE_Int maxIterations = 100; HYPRE_Int checkOrtho = 0; HYPRE_Int printLevel = 0; HYPRE_Int pcgIterations = 0; HYPRE_Int pcgMode = 0; HYPRE_Real tol = 1e-6; HYPRE_Real pcgTol = 1e-2; HYPRE_Real nonOrthF; FILE* filePtr; mv_MultiVectorPtr eigenvectors = NULL; mv_MultiVectorPtr constrains = NULL; HYPRE_Real* eigenvalues = NULL; HYPRE_Real* residuals; utilities_FortranMatrix* residualNorms; utilities_FortranMatrix* residualNormsHistory; utilities_FortranMatrix* eigenvaluesHistory; utilities_FortranMatrix* printBuffer; utilities_FortranMatrix* gramXX; utilities_FortranMatrix* identity; mv_InterfaceInterpreter* interpreter; HYPRE_MatvecFunctions matvec_fn; /* end lobpcg */ #if defined(HYPRE_USING_MEMORY_TRACKER) HYPRE_Int print_mem_tracker = 0; char mem_tracker_name[HYPRE_MAX_FILE_NAME_LEN] = {0}; #endif #if defined(HYPRE_USING_GPU) HYPRE_Int spgemm_use_vendor = 0; #endif #if defined(HYPRE_TEST_USING_HOST) HYPRE_MemoryLocation memory_location = HYPRE_MEMORY_HOST; HYPRE_ExecutionPolicy default_exec_policy = HYPRE_EXEC_HOST; #else HYPRE_MemoryLocation memory_location = HYPRE_MEMORY_DEVICE; HYPRE_ExecutionPolicy default_exec_policy = HYPRE_EXEC_DEVICE; #endif global_data.memory_location = memory_location; HYPRE_Int gpu_aware_mpi = 0; /*----------------------------------------------------------- * Initialize some stuff *-----------------------------------------------------------*/ /* Initialize MPI */ hypre_MPI_Init(&argc, &argv); hypre_MPI_Comm_size(comm, &num_procs); hypre_MPI_Comm_rank(comm, &myid); /*----------------------------------------------------------------- * GPU Device binding * Must be done before HYPRE_Initialize() and should not be changed after *-----------------------------------------------------------------*/ for (arg_index = 1; arg_index < argc; arg_index ++) { if (strcmp(argv[arg_index], "-lazy_device_init") == 0) { lazy_device_init = atoi(argv[++arg_index]); } else if (strcmp(argv[arg_index], "-device_id") == 0) { device_id = atoi(argv[++arg_index]); } } hypre_bind_device_id(device_id, myid, num_procs, comm); /*----------------------------------------------------------- * Initialize : must be the first HYPRE function to call *-----------------------------------------------------------*/ HYPRE_Initialize(); if (!lazy_device_init) { HYPRE_DeviceInitialize(); } /*----------------------------------------------------------- * Set defaults *-----------------------------------------------------------*/ skip = 0; rap = 0; relax = 1; jacobi_weight = 1.0; usr_jacobi_weight = 0; jump = 0; gradient_matrix = 0; object_type = HYPRE_SSTRUCT; solver_type = 1; recompute_res = 0; /* What should be the default here? */ cf_tol = 0.90; pooldist = 0; cycred_tdim = 0; for (i = 0; i < 3; i++) { cycred_index[i] = 0; cycred_stride[i] = 1; } solver_id = 39; repeats = 1; prec_print_level = 0; solver_print_level = 0; log_level = 0; print_system = 0; cosine = 1; skip = 0; n_pre = 1; n_post = 1; old_default = 0; /*----------------------------------------------------------- * Read input file *-----------------------------------------------------------*/ arg_index = 1; /* parse command line for input file name */ infile = infile_default; while (arg_index < argc) { if ( strcmp(argv[arg_index], "-in") == 0 ) { arg_index++; infile = argv[arg_index++]; } else if (strcmp(argv[arg_index], "-fromfile") == 0 ) { arg_index++; read_fromfile_flag += 1; read_fromfile_index[0] = arg_index++; } else if (strcmp(argv[arg_index], "-rhsfromfile") == 0 ) { arg_index++; read_fromfile_flag += 2; read_fromfile_index[1] = arg_index++; } else if (strcmp(argv[arg_index], "-x0fromfile") == 0 ) { arg_index++; read_fromfile_flag += 4; read_fromfile_index[2] = arg_index++; } else if ( strcmp(argv[arg_index], "-help") == 0 ) { PrintUsage(argv[0], myid); exit(1); } else if ( strcmp(argv[arg_index], "-version") == 0 ) { char *version_string; HYPRE_Version(&version_string); hypre_printf("%s\n", version_string); hypre_TFree(version_string, HYPRE_MEMORY_HOST); exit(1); } else if ( strcmp(argv[arg_index], "-vernum") == 0 ) { HYPRE_Int major, minor, patch, single; HYPRE_VersionNumber(&major, &minor, &patch, &single); hypre_printf("HYPRE Version %d.%d.%d\n", major, minor, patch); hypre_printf("HYPRE Single = %d\n", single); exit(1); } else { break; } } /*----------------------------------------------------------- * Are we reading matrices/vectors directly from file? *-----------------------------------------------------------*/ if (read_fromfile_index[0] == -1 && read_fromfile_index[1] == -1 && read_fromfile_index[2] == -1) { ReadData(infile, &global_data); nparts = global_data.nparts; parts = hypre_TAlloc(HYPRE_Int, nparts, HYPRE_MEMORY_HOST); refine = hypre_TAlloc(Index, nparts, HYPRE_MEMORY_HOST); distribute = hypre_TAlloc(Index, nparts, HYPRE_MEMORY_HOST); block = hypre_TAlloc(Index, nparts, HYPRE_MEMORY_HOST); for (part = 0; part < nparts; part++) { parts[part] = part; for (j = 0; j < 3; j++) { refine[part][j] = 1; distribute[part][j] = 1; block[part][j] = 1; } } if (global_data.rhs_true || global_data.fem_rhs_true) { cosine = 0; } } else { if (read_fromfile_flag < 7) { if (!myid) { hypre_printf("Error: Must read A, b, and x from file! \n"); } exit(1); } } /*----------------------------------------------------------- * Parse command line *-----------------------------------------------------------*/ while (arg_index < argc) { if ( strcmp(argv[arg_index], "-pt") == 0 ) { arg_index++; nparts = 0; while ( strncmp(argv[arg_index], "-", 1) != 0 ) { parts[nparts++] = atoi(argv[arg_index++]); } } else if ( strcmp(argv[arg_index], "-pooldist") == 0 ) { arg_index++; pooldist = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-r") == 0 ) { arg_index++; for (i = 0; i < nparts; i++) { part = parts[i]; k = arg_index; for (j = 0; j < 3; j++) { refine[part][j] = atoi(argv[k++]); } } arg_index += 3; } else if ( strcmp(argv[arg_index], "-P") == 0 ) { arg_index++; for (i = 0; i < nparts; i++) { part = parts[i]; k = arg_index; for (j = 0; j < 3; j++) { distribute[part][j] = atoi(argv[k++]); } } arg_index += 3; } else if ( strcmp(argv[arg_index], "-b") == 0 ) { arg_index++; for (i = 0; i < nparts; i++) { part = parts[i]; k = arg_index; for (j = 0; j < 3; j++) { block[part][j] = atoi(argv[k++]); } } arg_index += 3; } else if ( strcmp(argv[arg_index], "-solver") == 0 ) { arg_index++; /* begin lobpcg */ if ( strcmp(argv[arg_index], "none") == 0 ) { solver_id = NO_SOLVER; arg_index++; } else /* end lobpcg */ { solver_id = atoi(argv[arg_index++]); } } else if ( strcmp(argv[arg_index], "-repeats") == 0 ) { arg_index++; repeats = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-pout") == 0 ) { arg_index++; prec_print_level = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-sout") == 0 ) { arg_index++; solver_print_level = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-ll") == 0 ) { arg_index++; log_level = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-print") == 0 ) { arg_index++; print_system = 1; } else if ( strcmp(argv[arg_index], "-rhsfromcosine") == 0 ) { arg_index++; cosine = 1; } else if ( strcmp(argv[arg_index], "-rhsone") == 0 ) { arg_index++; cosine = 0; } else if ( strcmp(argv[arg_index], "-tol") == 0 ) { arg_index++; tol = (HYPRE_Real)atof(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-v") == 0 ) { arg_index++; n_pre = atoi(argv[arg_index++]); n_post = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-skip") == 0 ) { arg_index++; skip = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-rap") == 0 ) { arg_index++; rap = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-relax") == 0 ) { arg_index++; relax = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-w") == 0 ) { arg_index++; jacobi_weight = (HYPRE_Real)atof(argv[arg_index++]); usr_jacobi_weight = 1; /* flag user weight */ } else if ( strcmp(argv[arg_index], "-jump") == 0 ) { arg_index++; jump = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-solver_type") == 0 ) { arg_index++; solver_type = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-recompute") == 0 ) { arg_index++; recompute_res = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-cf") == 0 ) { arg_index++; cf_tol = (HYPRE_Real)atof(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-crtdim") == 0 ) { arg_index++; cycred_tdim = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-cri") == 0 ) { arg_index++; for (i = 0; i < 3; i++) { cycred_index[i] = atoi(argv[arg_index++]); } } else if ( strcmp(argv[arg_index], "-crs") == 0 ) { arg_index++; for (i = 0; i < 3; i++) { cycred_stride[i] = atoi(argv[arg_index++]); } } else if ( strcmp(argv[arg_index], "-old_default") == 0 ) { /* uses old BoomerAMG defaults */ arg_index++; old_default = 1; } /* begin lobpcg */ else if ( strcmp(argv[arg_index], "-lobpcg") == 0 ) { /* use lobpcg */ arg_index++; lobpcgFlag = 1; } else if ( strcmp(argv[arg_index], "-orthchk") == 0 ) { /* lobpcg: check orthonormality */ arg_index++; checkOrtho = 1; } else if ( strcmp(argv[arg_index], "-verb") == 0 ) { /* lobpcg: verbosity level */ arg_index++; verbosity = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-vrand") == 0 ) { /* lobpcg: block size */ arg_index++; blockSize = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-seed") == 0 ) { /* lobpcg: seed for srand */ arg_index++; lobpcgSeed = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-itr") == 0 ) { /* lobpcg: max # of iterations */ arg_index++; maxIterations = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-pcgitr") == 0 ) { /* lobpcg: max inner pcg iterations */ arg_index++; pcgIterations = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-pcgtol") == 0 ) { /* lobpcg: inner pcg iterations tolerance */ arg_index++; pcgTol = (HYPRE_Real)atof(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-pcgmode") == 0 ) { /* lobpcg: initial guess for inner pcg */ arg_index++; /* 0: zero, otherwise rhs */ pcgMode = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-vout") == 0 ) { /* lobpcg: print level */ arg_index++; printLevel = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-memory_host") == 0 ) { arg_index++; memory_location = HYPRE_MEMORY_HOST; } else if ( strcmp(argv[arg_index], "-memory_device") == 0 ) { arg_index++; memory_location = HYPRE_MEMORY_DEVICE; } else if ( strcmp(argv[arg_index], "-exec_host") == 0 ) { arg_index++; default_exec_policy = HYPRE_EXEC_HOST; } else if ( strcmp(argv[arg_index], "-exec_device") == 0 ) { arg_index++; default_exec_policy = HYPRE_EXEC_DEVICE; } #if defined(HYPRE_USING_GPU) else if ( strcmp(argv[arg_index], "-mm_vendor") == 0 ) { arg_index++; spgemm_use_vendor = atoi(argv[arg_index++]); } #endif #if defined(HYPRE_USING_MEMORY_TRACKER) else if ( strcmp(argv[arg_index], "-print_mem_tracker") == 0 ) { arg_index++; print_mem_tracker = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-mem_tracker_filename") == 0 ) { arg_index++; snprintf(mem_tracker_name, HYPRE_MAX_FILE_NAME_LEN, "%s", argv[arg_index++]); } #endif else if ( strcmp(argv[arg_index], "-gpu_mpi") == 0 ) { arg_index++; gpu_aware_mpi = atoi(argv[arg_index++]); } else { arg_index++; } } #if defined(HYPRE_USING_MEMORY_TRACKER) hypre_MemoryTrackerSetPrint(print_mem_tracker); if (mem_tracker_name[0]) { hypre_MemoryTrackerSetFileName(mem_tracker_name); } #endif /* Set library log level */ HYPRE_SetLogLevel(log_level); /* default memory location */ HYPRE_SetMemoryLocation(memory_location); /* default execution policy */ HYPRE_SetExecutionPolicy(default_exec_policy); #if defined(HYPRE_USING_GPU) HYPRE_SetSpGemmUseVendor(spgemm_use_vendor); #endif HYPRE_SetGpuAwareMPI(gpu_aware_mpi); if ( solver_id == 39 && lobpcgFlag ) { solver_id = 10; } /* end lobpcg */ /*----------------------------------------------------------- * Print driver parameters TODO *-----------------------------------------------------------*/ if (myid == 0) { #if defined(HYPRE_DEVELOP_STRING) && defined(HYPRE_DEVELOP_BRANCH) hypre_printf("\nUsing HYPRE_DEVELOP_STRING: %s (branch %s; the develop branch)\n\n", HYPRE_DEVELOP_STRING, HYPRE_DEVELOP_BRANCH); #elif defined(HYPRE_DEVELOP_STRING) && !defined(HYPRE_DEVELOP_BRANCH) hypre_printf("\nUsing HYPRE_DEVELOP_STRING: %s (branch %s; not the develop branch)\n\n", HYPRE_DEVELOP_STRING, HYPRE_BRANCH_NAME); #elif defined(HYPRE_RELEASE_VERSION) hypre_printf("\nUsing HYPRE_RELEASE_VERSION: %s\n\n", HYPRE_RELEASE_VERSION); #endif } /*----------------------------------------------------------- * Synchronize so that timings make sense *-----------------------------------------------------------*/ hypre_MPI_Barrier(comm); for (rep = 0; rep < repeats; rep++) { /*----------------------------------------------------------- * Set up the grid *-----------------------------------------------------------*/ time_index = hypre_InitializeTiming("SStruct Interface"); hypre_BeginTiming(time_index); if (read_fromfile_flag & 0x1) { if (!myid) { hypre_printf("Reading SStructMatrix A from file: %s\n", argv[read_fromfile_index[0]]); } HYPRE_SStructMatrixRead(comm, argv[read_fromfile_index[0]], &A); } else { /*----------------------------------------------------------- * Distribute data *-----------------------------------------------------------*/ DistributeData(global_data, pooldist, refine, distribute, block, num_procs, myid, &data); /*----------------------------------------------------------- * Check a few things *-----------------------------------------------------------*/ if (solver_id >= 200) { pdata = data.pdata[0]; if (nparts > 1) { if (!myid) { hypre_printf("Warning: Invalid number of parts for Struct Solver. Part 0 taken.\n"); } } if (pdata.nvars > 1) { if (!myid) { hypre_printf("Error: Invalid number of nvars for Struct Solver \n"); } exit(1); } } HYPRE_SStructGridCreate(comm, data.ndim, data.nparts, &grid); if (data.numghost != NULL) { HYPRE_SStructGridSetNumGhost(grid, data.numghost); } for (part = 0; part < data.nparts; part++) { pdata = data.pdata[part]; for (box = 0; box < pdata.nboxes; box++) { HYPRE_SStructGridSetExtents(grid, part, pdata.ilowers[box], pdata.iuppers[box]); } HYPRE_SStructGridSetVariables(grid, part, pdata.nvars, pdata.vartypes); /* GridAddVariabes */ if (data.fem_nvars > 0) { HYPRE_SStructGridSetFEMOrdering(grid, part, data.fem_ordering); } /* GridSetNeighborPart and GridSetSharedPart */ for (box = 0; box < pdata.glue_nboxes; box++) { if (pdata.glue_shared[box]) { HYPRE_SStructGridSetSharedPart(grid, part, pdata.glue_ilowers[box], pdata.glue_iuppers[box], pdata.glue_offsets[box], pdata.glue_nbor_parts[box], pdata.glue_nbor_ilowers[box], pdata.glue_nbor_iuppers[box], pdata.glue_nbor_offsets[box], pdata.glue_index_maps[box], pdata.glue_index_dirs[box]); } else { HYPRE_SStructGridSetNeighborPart(grid, part, pdata.glue_ilowers[box], pdata.glue_iuppers[box], pdata.glue_nbor_parts[box], pdata.glue_nbor_ilowers[box], pdata.glue_nbor_iuppers[box], pdata.glue_index_maps[box], pdata.glue_index_dirs[box]); } } HYPRE_SStructGridSetPeriodic(grid, part, pdata.periodic); } HYPRE_SStructGridAssemble(grid); /*----------------------------------------------------------- * Set up the stencils *-----------------------------------------------------------*/ stencils = hypre_CTAlloc(HYPRE_SStructStencil, data.nstencils, HYPRE_MEMORY_HOST); for (s = 0; s < data.nstencils; s++) { HYPRE_SStructStencilCreate(data.ndim, data.stencil_sizes[s], &stencils[s]); for (entry = 0; entry < data.stencil_sizes[s]; entry++) { HYPRE_SStructStencilSetEntry(stencils[s], entry, data.stencil_offsets[s][entry], data.stencil_vars[s][entry]); } } /*----------------------------------------------------------- * Set object type *-----------------------------------------------------------*/ /* determine if we build a gradient matrix */ if (solver_id == 150) { gradient_matrix = 1; /* for now, change solver 150 to solver 28 */ solver_id = 28; } if ( ((solver_id >= 20) && (solver_id < 30)) || ((solver_id >= 40) && (solver_id < 50)) || ((solver_id >= 60) && (solver_id < 70)) || ((solver_id >= 80) && (solver_id < 90)) || ((solver_id >= 90) && (solver_id < 100)) || (solver_id == 120) ) { object_type = HYPRE_PARCSR; } if (solver_id >= 200) { object_type = HYPRE_STRUCT; } /*----------------------------------------------------------- * Set up the graph *-----------------------------------------------------------*/ HYPRE_SStructGraphCreate(comm, grid, &graph); /* HYPRE_SSTRUCT is the default, so we don't have to call SetObjectType */ if ( object_type != HYPRE_SSTRUCT ) { HYPRE_SStructGraphSetObjectType(graph, object_type); } for (part = 0; part < data.nparts; part++) { pdata = data.pdata[part]; if (data.nstencils > 0) { /* set stencils */ for (var = 0; var < pdata.nvars; var++) { HYPRE_SStructGraphSetStencil(graph, part, var, stencils[pdata.stencil_num[var]]); } } else if (data.fem_nvars > 0) { /* indicate FEM approach */ HYPRE_SStructGraphSetFEM(graph, part); /* set sparsity */ HYPRE_SStructGraphSetFEMSparsity(graph, part, data.fem_nsparse, data.fem_sparsity); } /* add entries */ for (box = 0; box < pdata.graph_nboxes; box++) { for (index[2] = pdata.graph_ilowers[box][2]; index[2] <= pdata.graph_iuppers[box][2]; index[2] += pdata.graph_strides[box][2]) { for (index[1] = pdata.graph_ilowers[box][1]; index[1] <= pdata.graph_iuppers[box][1]; index[1] += pdata.graph_strides[box][1]) { for (index[0] = pdata.graph_ilowers[box][0]; index[0] <= pdata.graph_iuppers[box][0]; index[0] += pdata.graph_strides[box][0]) { for (i = 0; i < 3; i++) { j = pdata.graph_index_maps[box][i]; k = index[i] - pdata.graph_ilowers[box][i]; k /= pdata.graph_strides[box][i]; k *= pdata.graph_index_signs[box][i]; #if 0 /* the following does not work with some Intel compilers with -O2 */ to_index[j] = pdata.graph_to_ilowers[box][j] + k * pdata.graph_to_strides[box][j]; #else to_index[j] = pdata.graph_to_ilowers[box][j]; to_index[j] += k * pdata.graph_to_strides[box][j]; #endif } HYPRE_SStructGraphAddEntries(graph, part, index, pdata.graph_vars[box], pdata.graph_to_parts[box], to_index, pdata.graph_to_vars[box]); } } } } } HYPRE_SStructGraphAssemble(graph); /*----------------------------------------------------------- * Set up the matrix *-----------------------------------------------------------*/ values_size = hypre_max(data.max_boxsize, data.max_boxsize * data.fem_nsparse); values = hypre_TAlloc(HYPRE_Real, values_size, HYPRE_MEMORY_HOST); d_values = hypre_TAlloc(HYPRE_Real, values_size, memory_location); HYPRE_SStructMatrixCreate(comm, graph, &A); /* TODO HYPRE_SStructMatrixSetSymmetric(A, 1); */ for (i = 0; i < data.symmetric_num; i++) { HYPRE_SStructMatrixSetSymmetric(A, data.symmetric_parts[i], data.symmetric_vars[i], data.symmetric_to_vars[i], data.symmetric_booleans[i]); } HYPRE_SStructMatrixSetNSSymmetric(A, data.ns_symmetric); /* HYPRE_SSTRUCT is the default, so we don't have to call SetObjectType */ if ( object_type != HYPRE_SSTRUCT ) { HYPRE_SStructMatrixSetObjectType(A, object_type); } HYPRE_SStructMatrixInitialize(A); if (data.nstencils > 0) { /* StencilSetEntry: set stencil values */ for (part = 0; part < data.nparts; part++) { pdata = data.pdata[part]; for (var = 0; var < pdata.nvars; var++) { s = pdata.stencil_num[var]; for (i = 0; i < data.stencil_sizes[s]; i++) { for (j = 0; j < pdata.max_boxsize; j++) { values[j] = data.stencil_values[s][i]; } hypre_TMemcpy(d_values, values, HYPRE_Real, values_size, memory_location, HYPRE_MEMORY_HOST); for (box = 0; box < pdata.nboxes; box++) { GetVariableBox(pdata.ilowers[box], pdata.iuppers[box], pdata.vartypes[var], ilower, iupper); HYPRE_SStructMatrixSetBoxValues(A, part, ilower, iupper, var, 1, &i, d_values); } } } } } else if (data.fem_nvars > 0) { /* FEMStencilSetRow: add to stencil values */ #if 0 // Use AddFEMValues hypre_TMemcpy(data.d_fem_values, data.fem_values, HYPRE_Real, data.fem_nsparse, memory_location, HYPRE_MEMORY_HOST); for (part = 0; part < data.nparts; part++) { pdata = data.pdata[part]; for (box = 0; box < pdata.nboxes; box++) { for (index[2] = pdata.ilowers[box][2]; index[2] <= pdata.iuppers[box][2]; index[2]++) { for (index[1] = pdata.ilowers[box][1]; index[1] <= pdata.iuppers[box][1]; index[1]++) { for (index[0] = pdata.ilowers[box][0]; index[0] <= pdata.iuppers[box][0]; index[0]++) { HYPRE_SStructMatrixAddFEMValues(A, part, index, data.d_fem_values); } } } } } #else // Use AddFEMBoxValues /* TODO: There is probably a smarter way to do this copy */ for (i = 0; i < data.max_boxsize; i++) { j = i * data.fem_nsparse; hypre_TMemcpy(&d_values[j], data.fem_values, HYPRE_Real, data.fem_nsparse, memory_location, HYPRE_MEMORY_HOST); } for (part = 0; part < data.nparts; part++) { pdata = data.pdata[part]; for (box = 0; box < pdata.nboxes; box++) { HYPRE_SStructMatrixAddFEMBoxValues( A, part, pdata.ilowers[box], pdata.iuppers[box], d_values); } } #endif } /* GraphAddEntries: set non-stencil entries */ for (part = 0; part < data.nparts; part++) { pdata = data.pdata[part]; hypre_TMemcpy(pdata.d_graph_values, pdata.graph_values, HYPRE_Real, pdata.graph_values_size, memory_location, HYPRE_MEMORY_HOST); for (box = 0; box < pdata.graph_nboxes; box++) { /* * RDF NOTE: Add a separate interface routine for setting non-stencil * entries. It would be more efficient to set boundary values a box * at a time, but AMR may require striding, and some codes may already * have a natural values array to pass in, but can't because it uses * ghost values. * * Example new interface routine: * SetNSBoxValues(matrix, part, ilower, iupper, stride, entry * values_ilower, values_iupper, values); */ /* since we have already tested SetBoxValues above, use SetValues here */ #if 0 for (j = 0; j < pdata.graph_boxsizes[box]; j++) { values[j] = pdata.graph_values[box]; } HYPRE_SStructMatrixSetBoxValues(A, part, pdata.graph_ilowers[box], pdata.graph_iuppers[box], pdata.graph_vars[box], 1, &pdata.graph_entries[box], values); #else for (index[2] = pdata.graph_ilowers[box][2]; index[2] <= pdata.graph_iuppers[box][2]; index[2] += pdata.graph_strides[box][2]) { for (index[1] = pdata.graph_ilowers[box][1]; index[1] <= pdata.graph_iuppers[box][1]; index[1] += pdata.graph_strides[box][1]) { for (index[0] = pdata.graph_ilowers[box][0]; index[0] <= pdata.graph_iuppers[box][0]; index[0] += pdata.graph_strides[box][0]) { HYPRE_SStructMatrixSetValues(A, part, index, pdata.graph_vars[box], 1, &pdata.graph_entries[box], &pdata.d_graph_values[box]); } } } #endif } } /* MatrixSetValues: reset some matrix values */ for (part = 0; part < data.nparts; part++) { pdata = data.pdata[part]; for (box = 0; box < pdata.matset_nboxes; box++) { size = 1; for (j = 0; j < 3; j++) { size *= (pdata.matset_iuppers[box][j] - pdata.matset_ilowers[box][j] + 1); } for (j = 0; j < size; j++) { values[j] = pdata.matset_values[box]; } hypre_TMemcpy(d_values, values, HYPRE_Real, values_size, memory_location, HYPRE_MEMORY_HOST); HYPRE_SStructMatrixSetBoxValues(A, part, pdata.matset_ilowers[box], pdata.matset_iuppers[box], pdata.matset_vars[box], 1, &pdata.matset_entries[box], d_values); } } /* MatrixAddToValues: add to some matrix values */ for (part = 0; part < data.nparts; part++) { pdata = data.pdata[part]; for (box = 0; box < pdata.matadd_nboxes; box++) { size = 1; for (j = 0; j < 3; j++) { size *= (pdata.matadd_iuppers[box][j] - pdata.matadd_ilowers[box][j] + 1); } for (entry = 0; entry < pdata.matadd_nentries[box]; entry++) { for (j = 0; j < size; j++) { values[j] = pdata.matadd_values[box][entry]; } hypre_TMemcpy(d_values, values, HYPRE_Real, values_size, memory_location, HYPRE_MEMORY_HOST); HYPRE_SStructMatrixAddToBoxValues(A, part, pdata.matadd_ilowers[box], pdata.matadd_iuppers[box], pdata.matadd_vars[box], 1, &pdata.matadd_entries[box][entry], d_values); } } } /* FEMMatrixAddToValues: add to some matrix values */ for (part = 0; part < data.nparts; part++) { pdata = data.pdata[part]; for (box = 0; box < pdata.fem_matadd_nboxes; box++) { for (i = 0; i < data.fem_nsparse; i++) { values[i] = 0.0; } s = 0; for (i = 0; i < pdata.fem_matadd_nrows[box]; i++) { row = pdata.fem_matadd_rows[box][i]; for (j = 0; j < pdata.fem_matadd_ncols[box]; j++) { col = pdata.fem_matadd_cols[box][j]; values[data.fem_ivalues_full[row][col]] = pdata.fem_matadd_values[box][s]; s++; } } hypre_TMemcpy(d_values, values, HYPRE_Real, values_size, memory_location, HYPRE_MEMORY_HOST); for (index[2] = pdata.fem_matadd_ilowers[box][2]; index[2] <= pdata.fem_matadd_iuppers[box][2]; index[2]++) { for (index[1] = pdata.fem_matadd_ilowers[box][1]; index[1] <= pdata.fem_matadd_iuppers[box][1]; index[1]++) { for (index[0] = pdata.fem_matadd_ilowers[box][0]; index[0] <= pdata.fem_matadd_iuppers[box][0]; index[0]++) { HYPRE_SStructMatrixAddFEMValues(A, part, index, d_values); } } } } } HYPRE_SStructMatrixAssemble(A); } /*----------------------------------------------------------- * Set up the RHS vector *-----------------------------------------------------------*/ if (read_fromfile_flag & 0x2) { if (!myid) { hypre_printf("Reading SStructVector b from file: %s\n", argv[read_fromfile_index[1]]); } cosine = 0; HYPRE_SStructVectorRead(comm, argv[read_fromfile_index[1]], &b); } else { HYPRE_SStructVectorCreate(comm, grid, &b); /* HYPRE_SSTRUCT is the default, so we don't have to call SetObjectType */ if ( object_type != HYPRE_SSTRUCT ) { HYPRE_SStructVectorSetObjectType(b, object_type); } HYPRE_SStructVectorInitialize(b); /* Initialize the rhs values */ if (data.rhs_true) { for (j = 0; j < data.max_boxsize; j++) { values[j] = data.rhs_value; } } else if (data.fem_rhs_true) { for (j = 0; j < data.max_boxsize; j++) { values[j] = 0.0; } } else /* rhs=1 is the default */ { for (j = 0; j < data.max_boxsize; j++) { values[j] = 1.0; } } hypre_TMemcpy(d_values, values, HYPRE_Real, values_size, memory_location, HYPRE_MEMORY_HOST); for (part = 0; part < data.nparts; part++) { pdata = data.pdata[part]; for (var = 0; var < pdata.nvars; var++) { for (box = 0; box < pdata.nboxes; box++) { GetVariableBox(pdata.ilowers[box], pdata.iuppers[box], pdata.vartypes[var], ilower, iupper); HYPRE_SStructVectorSetBoxValues(b, part, ilower, iupper, var, d_values); } } } /* Add values for FEMRhsSet */ if (data.fem_rhs_true) { #if 0 // Use AddFEMValues hypre_TMemcpy(data.d_fem_rhs_values, data.fem_rhs_values, HYPRE_Real, data.fem_nvars, memory_location, HYPRE_MEMORY_HOST); for (part = 0; part < data.nparts; part++) { pdata = data.pdata[part]; for (box = 0; box < pdata.nboxes; box++) { for (index[2] = pdata.ilowers[box][2]; index[2] <= pdata.iuppers[box][2]; index[2]++) { for (index[1] = pdata.ilowers[box][1]; index[1] <= pdata.iuppers[box][1]; index[1]++) { for (index[0] = pdata.ilowers[box][0]; index[0] <= pdata.iuppers[box][0]; index[0]++) { HYPRE_SStructVectorAddFEMValues(b, part, index, data.d_fem_rhs_values); } } } } } #else // Use AddFEMBoxValues /* TODO: There is probably a smarter way to do this copy */ for (i = 0; i < data.max_boxsize; i++) { j = i * data.fem_nvars; hypre_TMemcpy(&d_values[j], data.fem_rhs_values, HYPRE_Real, data.fem_nvars, memory_location, HYPRE_MEMORY_HOST); } for (part = 0; part < data.nparts; part++) { pdata = data.pdata[part]; for (box = 0; box < pdata.nboxes; box++) { HYPRE_SStructVectorAddFEMBoxValues( b, part, pdata.ilowers[box], pdata.iuppers[box], d_values); } } #endif } /* RhsAddToValues: add to some RHS values */ for (part = 0; part < data.nparts; part++) { pdata = data.pdata[part]; for (box = 0; box < pdata.rhsadd_nboxes; box++) { size = 1; for (j = 0; j < 3; j++) { size *= (pdata.rhsadd_iuppers[box][j] - pdata.rhsadd_ilowers[box][j] + 1); } for (j = 0; j < size; j++) { values[j] = pdata.rhsadd_values[box]; } hypre_TMemcpy(d_values, values, HYPRE_Real, values_size, memory_location, HYPRE_MEMORY_HOST); HYPRE_SStructVectorAddToBoxValues(b, part, pdata.rhsadd_ilowers[box], pdata.rhsadd_iuppers[box], pdata.rhsadd_vars[box], d_values); } } /* FEMRhsAddToValues: add to some RHS values */ for (part = 0; part < data.nparts; part++) { pdata = data.pdata[part]; for (box = 0; box < pdata.fem_rhsadd_nboxes; box++) { for (index[2] = pdata.fem_rhsadd_ilowers[box][2]; index[2] <= pdata.fem_rhsadd_iuppers[box][2]; index[2]++) { for (index[1] = pdata.fem_rhsadd_ilowers[box][1]; index[1] <= pdata.fem_rhsadd_iuppers[box][1]; index[1]++) { for (index[0] = pdata.fem_rhsadd_ilowers[box][0]; index[0] <= pdata.fem_rhsadd_iuppers[box][0]; index[0]++) { HYPRE_SStructVectorAddFEMValues(b, part, index, pdata.fem_rhsadd_values[box]); } } } } } HYPRE_SStructVectorAssemble(b); } /*----------------------------------------------------------- * Set up the initial solution vector *-----------------------------------------------------------*/ if (read_fromfile_flag & 0x4) { if (!myid) { hypre_printf("Reading SStructVector x0 from file: %s\n", argv[read_fromfile_index[2]]); } HYPRE_SStructVectorRead(comm, argv[read_fromfile_index[2]], &x); } else { HYPRE_SStructVectorCreate(comm, grid, &x); /* HYPRE_SSTRUCT is the default, so we don't have to call SetObjectType */ if ( object_type != HYPRE_SSTRUCT ) { HYPRE_SStructVectorSetObjectType(x, object_type); } HYPRE_SStructVectorInitialize(x); /*----------------------------------------------------------- * If requested, reset linear system so that it has * exact solution: * * u(part,var,i,j,k) = (part+1)*(var+1)*cosine[(i+j+k)/10] * *-----------------------------------------------------------*/ if (cosine) { for (part = 0; part < data.nparts; part++) { pdata = data.pdata[part]; for (var = 0; var < pdata.nvars; var++) { scale = (part + 1.0) * (var + 1.0); for (box = 0; box < pdata.nboxes; box++) { /* GetVariableBox(pdata.ilowers[box], pdata.iuppers[box], pdata.vartypes[var], ilower, iupper); */ GetVariableBox(pdata.ilowers[box], pdata.iuppers[box], var, ilower, iupper); SetCosineVector(scale, ilower, iupper, values); hypre_TMemcpy(d_values, values, HYPRE_Real, values_size, memory_location, HYPRE_MEMORY_HOST); HYPRE_SStructVectorSetBoxValues(x, part, ilower, iupper, var, d_values); } } } } HYPRE_SStructVectorAssemble(x); } hypre_EndTiming(time_index); hypre_PrintTiming("SStruct Interface", comm); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); /*----------------------------------------------------------- * Get the objects out * NOTE: This should go after the cosine part, but for the bug *-----------------------------------------------------------*/ if (object_type == HYPRE_PARCSR) { HYPRE_SStructMatrixGetObject(A, (void **) &par_A); HYPRE_SStructVectorGetObject(b, (void **) &par_b); HYPRE_SStructVectorGetObject(x, (void **) &par_x); } else if (object_type == HYPRE_STRUCT) { HYPRE_SStructMatrixGetObject(A, (void **) &sA); HYPRE_SStructVectorGetObject(b, (void **) &sb); HYPRE_SStructVectorGetObject(x, (void **) &sx); } /*----------------------------------------------------------- * Finish resetting the linear system *-----------------------------------------------------------*/ if (cosine) { /* This if/else is due to a bug in SStructMatvec */ if (object_type == HYPRE_SSTRUCT) { /* Apply A to cosine vector to yield righthand side */ hypre_SStructMatvec(1.0, A, x, 0.0, b); /* Reset initial guess to zero */ hypre_SStructMatvec(0.0, A, b, 0.0, x); } else if (object_type == HYPRE_PARCSR) { /* Apply A to cosine vector to yield righthand side */ HYPRE_ParCSRMatrixMatvec(1.0, par_A, par_x, 0.0, par_b ); /* Reset initial guess to zero */ HYPRE_ParCSRMatrixMatvec(0.0, par_A, par_b, 0.0, par_x ); } else if (object_type == HYPRE_STRUCT) { /* Apply A to cosine vector to yield righthand side */ hypre_StructMatvec(1.0, sA, sx, 0.0, sb); /* Reset initial guess to zero */ hypre_StructMatvec(0.0, sA, sb, 0.0, sx); } } /*----------------------------------------------------------- * Set up a gradient matrix G *-----------------------------------------------------------*/ if (gradient_matrix) { HYPRE_SStructVariable vartypes[1] = {HYPRE_SSTRUCT_VARIABLE_NODE}; HYPRE_Int offsets[3][2][3] = { {{0, 0, 0}, {-1, 0, 0}}, {{0, 0, 0}, {0, -1, 0}}, {{0, 0, 0}, {0, 0, -1}} }; HYPRE_Real stencil_values[2] = {1.0, -1.0}; /* Set up the domain grid */ HYPRE_SStructGridCreate(comm, data.ndim, data.nparts, &G_grid); for (part = 0; part < data.nparts; part++) { pdata = data.pdata[part]; for (box = 0; box < pdata.nboxes; box++) { HYPRE_SStructGridSetExtents(G_grid, part, pdata.ilowers[box], pdata.iuppers[box]); } HYPRE_SStructGridSetVariables(G_grid, part, 1, vartypes); for (box = 0; box < pdata.glue_nboxes; box++) { if (pdata.glue_shared[box]) { HYPRE_SStructGridSetSharedPart(G_grid, part, pdata.glue_ilowers[box], pdata.glue_iuppers[box], pdata.glue_offsets[box], pdata.glue_nbor_parts[box], pdata.glue_nbor_ilowers[box], pdata.glue_nbor_iuppers[box], pdata.glue_nbor_offsets[box], pdata.glue_index_maps[box], pdata.glue_index_dirs[box]); } else { HYPRE_SStructGridSetNeighborPart(G_grid, part, pdata.glue_ilowers[box], pdata.glue_iuppers[box], pdata.glue_nbor_parts[box], pdata.glue_nbor_ilowers[box], pdata.glue_nbor_iuppers[box], pdata.glue_index_maps[box], pdata.glue_index_dirs[box]); } } } HYPRE_SStructGridAssemble(G_grid); /* Set up the gradient stencils */ G_stencils = hypre_CTAlloc(HYPRE_SStructStencil, data.ndim, HYPRE_MEMORY_HOST); for (s = 0; s < data.ndim; s++) { HYPRE_SStructStencilCreate(data.ndim, 2, &G_stencils[s]); for (entry = 0; entry < 2; entry++) { HYPRE_SStructStencilSetEntry( G_stencils[s], entry, offsets[s][entry], 0); } } /* Set up the gradient graph */ HYPRE_SStructGraphCreate(comm, grid, &G_graph); HYPRE_SStructGraphSetDomainGrid(G_graph, G_grid); HYPRE_SStructGraphSetObjectType(G_graph, HYPRE_PARCSR); for (part = 0; part < data.nparts; part++) { pdata = data.pdata[part]; for (var = 0; var < data.ndim; var++) { HYPRE_SStructGraphSetStencil(G_graph, part, var, G_stencils[var]); } } HYPRE_SStructGraphAssemble(G_graph); /* Set up the matrix */ HYPRE_SStructMatrixCreate(comm, G_graph, &G); HYPRE_SStructMatrixSetObjectType(G, HYPRE_PARCSR); HYPRE_SStructMatrixInitialize(G); for (part = 0; part < data.nparts; part++) { pdata = data.pdata[part]; for (var = 0; var < data.ndim; var++) { for (i = 0; i < 2; i++) { for (j = 0; j < pdata.max_boxsize; j++) { values[j] = stencil_values[i]; } hypre_TMemcpy(d_values, values, HYPRE_Real, values_size, memory_location, HYPRE_MEMORY_HOST); for (box = 0; box < pdata.nboxes; box++) { GetVariableBox(pdata.ilowers[box], pdata.iuppers[box], pdata.vartypes[var], ilower, iupper); HYPRE_SStructMatrixSetBoxValues(G, part, ilower, iupper, var, 1, &i, d_values); } } } } HYPRE_SStructMatrixAssemble(G); } /*----------------------------------------------------------- * Print out the system and initial guess *-----------------------------------------------------------*/ if (print_system) { HYPRE_SStructVectorGather(b); HYPRE_SStructVectorGather(x); HYPRE_SStructMatrixPrint("sstruct.out.A", A, 0); HYPRE_SStructVectorPrint("sstruct.out.b", b, 0); HYPRE_SStructVectorPrint("sstruct.out.x0", x, 0); if (gradient_matrix) { HYPRE_SStructMatrixPrint("sstruct.out.G", G, 0); } } /*----------------------------------------------------------- * Debugging code *-----------------------------------------------------------*/ #if DEBUG { FILE *file; char filename[255]; /* result is 1's on the interior of the grid */ hypre_SStructMatvec(1.0, A, b, 0.0, x); HYPRE_SStructVectorPrint("sstruct.out.matvec", x, 0); /* result is all 1's */ hypre_SStructCopy(b, x); HYPRE_SStructVectorPrint("sstruct.out.copy", x, 0); /* result is all 2's */ hypre_SStructScale(2.0, x); HYPRE_SStructVectorPrint("sstruct.out.scale", x, 0); /* result is all 0's */ hypre_SStructAxpy(-2.0, b, x); HYPRE_SStructVectorPrint("sstruct.out.axpy", x, 0); /* result is 1's with 0's on some boundaries */ hypre_SStructCopy(b, x); hypre_sprintf(filename, "sstruct.out.gatherpre.%05d", myid); file = fopen(filename, "w"); for (part = 0; part < data.nparts; part++) { pdata = data.pdata[part]; for (var = 0; var < pdata.nvars; var++) { for (box = 0; box < pdata.nboxes; box++) { GetVariableBox(pdata.ilowers[box], pdata.iuppers[box], pdata.vartypes[var], ilower, iupper); HYPRE_SStructVectorGetBoxValues(x, part, ilower, iupper, var, values); hypre_fprintf(file, "\nPart %d, var %d, box %d:\n", part, var, box); for (i = 0; i < pdata.boxsizes[box]; i++) { hypre_fprintf(file, "%e\n", values[i]); } } } } fclose(file); /* result is all 1's */ HYPRE_SStructVectorGather(x); hypre_sprintf(filename, "sstruct.out.gatherpost.%05d", myid); file = fopen(filename, "w"); for (part = 0; part < data.nparts; part++) { pdata = data.pdata[part]; for (var = 0; var < pdata.nvars; var++) { for (box = 0; box < pdata.nboxes; box++) { GetVariableBox(pdata.ilowers[box], pdata.iuppers[box], pdata.vartypes[var], ilower, iupper); HYPRE_SStructVectorGetBoxValues(x, part, ilower, iupper, var, values); hypre_fprintf(file, "\nPart %d, var %d, box %d:\n", part, var, box); for (i = 0; i < pdata.boxsizes[box]; i++) { hypre_fprintf(file, "%e\n", values[i]); } } } } fclose(file); /* re-initializes x to 0 */ hypre_SStructAxpy(-1.0, b, x); } #endif hypre_TFree(values, HYPRE_MEMORY_HOST); hypre_TFree(d_values, memory_location); /*----------------------------------------------------------- * Solve the system using SysPFMG or Split *-----------------------------------------------------------*/ if (solver_id == 3) { time_index = hypre_InitializeTiming("SysPFMG Setup"); hypre_BeginTiming(time_index); HYPRE_SStructSysPFMGCreate(comm, &solver); HYPRE_SStructSysPFMGSetMaxIter(solver, 100); HYPRE_SStructSysPFMGSetTol(solver, tol); HYPRE_SStructSysPFMGSetRelChange(solver, 0); /* weighted Jacobi = 1; red-black GS = 2 */ HYPRE_SStructSysPFMGSetRelaxType(solver, relax); if (usr_jacobi_weight) { HYPRE_SStructSysPFMGSetJacobiWeight(solver, jacobi_weight); } HYPRE_SStructSysPFMGSetNumPreRelax(solver, n_pre); HYPRE_SStructSysPFMGSetNumPostRelax(solver, n_post); HYPRE_SStructSysPFMGSetSkipRelax(solver, skip); /*HYPRE_StructPFMGSetDxyz(solver, dxyz);*/ HYPRE_SStructSysPFMGSetPrintLevel(solver, prec_print_level); HYPRE_SStructSysPFMGSetLogging(solver, 1); HYPRE_SStructSysPFMGSetup(solver, A, b, x); hypre_EndTiming(time_index); hypre_PrintTiming("Setup phase times", comm); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); time_index = hypre_InitializeTiming("SysPFMG Solve"); hypre_BeginTiming(time_index); HYPRE_SStructSysPFMGSolve(solver, A, b, x); hypre_EndTiming(time_index); hypre_PrintTiming("Solve phase times", comm); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); HYPRE_SStructSysPFMGGetNumIterations(solver, &num_iterations); HYPRE_SStructSysPFMGGetFinalRelativeResidualNorm(solver, &final_res_norm); HYPRE_SStructSysPFMGDestroy(solver); } else if ((solver_id >= 0) && (solver_id < 10) && (solver_id != 3)) { time_index = hypre_InitializeTiming("Split Setup"); hypre_BeginTiming(time_index); HYPRE_SStructSplitCreate(comm, &solver); HYPRE_SStructSplitSetMaxIter(solver, 100); HYPRE_SStructSplitSetTol(solver, tol); if (solver_id == 0) { HYPRE_SStructSplitSetStructSolver(solver, HYPRE_SMG); } else if (solver_id == 1) { HYPRE_SStructSplitSetStructSolver(solver, HYPRE_PFMG); } else if (solver_id == 8) { HYPRE_SStructSplitSetStructSolver(solver, HYPRE_Jacobi); } HYPRE_SStructSplitSetup(solver, A, b, x); hypre_EndTiming(time_index); hypre_PrintTiming("Setup phase times", comm); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); time_index = hypre_InitializeTiming("Split Solve"); hypre_BeginTiming(time_index); HYPRE_SStructSplitSolve(solver, A, b, x); hypre_EndTiming(time_index); hypre_PrintTiming("Solve phase times", comm); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); HYPRE_SStructSplitGetNumIterations(solver, &num_iterations); HYPRE_SStructSplitGetFinalRelativeResidualNorm(solver, &final_res_norm); HYPRE_SStructSplitDestroy(solver); } /*----------------------------------------------------------- * Solve the system using PCG *-----------------------------------------------------------*/ if ((solver_id >= 10) && (solver_id < 20)) { time_index = hypre_InitializeTiming("PCG Setup"); hypre_BeginTiming(time_index); HYPRE_SStructPCGCreate(comm, &solver); HYPRE_PCGSetMaxIter( (HYPRE_Solver) solver, 100 ); HYPRE_PCGSetTol( (HYPRE_Solver) solver, tol ); HYPRE_PCGSetTwoNorm( (HYPRE_Solver) solver, 1 ); HYPRE_PCGSetRelChange( (HYPRE_Solver) solver, 0 ); HYPRE_PCGSetPrintLevel( (HYPRE_Solver) solver, solver_print_level ); HYPRE_PCGSetRecomputeResidual( (HYPRE_Solver) solver, recompute_res); if ((solver_id == 10) || (solver_id == 11)) { /* use Split solver as preconditioner */ HYPRE_SStructSplitCreate(comm, &precond); HYPRE_SStructSplitSetMaxIter(precond, 1); HYPRE_SStructSplitSetTol(precond, 0.0); HYPRE_SStructSplitSetZeroGuess(precond); if (solver_id == 10) { HYPRE_SStructSplitSetStructSolver(precond, HYPRE_SMG); } else if (solver_id == 11) { HYPRE_SStructSplitSetStructSolver(precond, HYPRE_PFMG); } HYPRE_PCGSetPrecond( (HYPRE_Solver) solver, (HYPRE_PtrToSolverFcn) HYPRE_SStructSplitSolve, (HYPRE_PtrToSolverFcn) HYPRE_SStructSplitSetup, (HYPRE_Solver) precond); } else if (solver_id == 13) { /* use SysPFMG solver as preconditioner */ HYPRE_SStructSysPFMGCreate(comm, &precond); HYPRE_SStructSysPFMGSetMaxIter(precond, 1); HYPRE_SStructSysPFMGSetTol(precond, 0.0); HYPRE_SStructSysPFMGSetZeroGuess(precond); /* weighted Jacobi = 1; red-black GS = 2 */ HYPRE_SStructSysPFMGSetRelaxType(precond, relax); if (usr_jacobi_weight) { HYPRE_SStructSysPFMGSetJacobiWeight(precond, jacobi_weight); } HYPRE_SStructSysPFMGSetNumPreRelax(precond, n_pre); HYPRE_SStructSysPFMGSetNumPostRelax(precond, n_post); HYPRE_SStructSysPFMGSetSkipRelax(precond, skip); /*HYPRE_StructPFMGSetDxyz(precond, dxyz);*/ HYPRE_PCGSetPrecond( (HYPRE_Solver) solver, (HYPRE_PtrToSolverFcn) HYPRE_SStructSysPFMGSolve, (HYPRE_PtrToSolverFcn) HYPRE_SStructSysPFMGSetup, (HYPRE_Solver) precond); } else if (solver_id == 18) { /* use diagonal scaling as preconditioner */ precond = NULL; HYPRE_PCGSetPrecond( (HYPRE_Solver) solver, (HYPRE_PtrToSolverFcn) HYPRE_SStructDiagScale, (HYPRE_PtrToSolverFcn) HYPRE_SStructDiagScaleSetup, (HYPRE_Solver) precond); } HYPRE_PCGSetup( (HYPRE_Solver) solver, (HYPRE_Matrix) A, (HYPRE_Vector) b, (HYPRE_Vector) x); hypre_EndTiming(time_index); hypre_PrintTiming("Setup phase times", comm); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); time_index = hypre_InitializeTiming("PCG Solve"); hypre_BeginTiming(time_index); HYPRE_PCGSolve( (HYPRE_Solver) solver, (HYPRE_Matrix) A, (HYPRE_Vector) b, (HYPRE_Vector) x); hypre_EndTiming(time_index); hypre_PrintTiming("Solve phase times", comm); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); HYPRE_PCGGetNumIterations( (HYPRE_Solver) solver, &num_iterations ); HYPRE_PCGGetFinalRelativeResidualNorm( (HYPRE_Solver) solver, &final_res_norm ); HYPRE_SStructPCGDestroy(solver); if ((solver_id == 10) || (solver_id == 11)) { HYPRE_SStructSplitDestroy(precond); } else if (solver_id == 13) { HYPRE_SStructSysPFMGDestroy(precond); } } /* begin lobpcg */ /*----------------------------------------------------------- * Solve the eigenvalue problem using LOBPCG *-----------------------------------------------------------*/ if ( lobpcgFlag && ( solver_id < 10 || solver_id >= 20 ) && verbosity ) { hypre_printf("\nLOBPCG works with solvers 10, 11, 13 and 18 only\n"); } if ( lobpcgFlag && (solver_id >= 10) && (solver_id < 20) ) { interpreter = hypre_CTAlloc(mv_InterfaceInterpreter, 1, HYPRE_MEMORY_HOST); HYPRE_SStructSetupInterpreter( interpreter ); HYPRE_SStructSetupMatvec(&matvec_fn); if (myid != 0) { verbosity = 0; } if ( pcgIterations > 0 ) { time_index = hypre_InitializeTiming("PCG Setup"); hypre_BeginTiming(time_index); HYPRE_SStructPCGCreate(comm, &solver); HYPRE_PCGSetMaxIter( (HYPRE_Solver) solver, pcgIterations ); HYPRE_PCGSetTol( (HYPRE_Solver) solver, pcgTol ); HYPRE_PCGSetTwoNorm( (HYPRE_Solver) solver, 1 ); HYPRE_PCGSetRelChange( (HYPRE_Solver) solver, 0 ); HYPRE_PCGSetPrintLevel( (HYPRE_Solver) solver, solver_print_level ); if ((solver_id == 10) || (solver_id == 11)) { /* use Split solver as preconditioner */ HYPRE_SStructSplitCreate(comm, &precond); HYPRE_SStructSplitSetMaxIter(precond, 1); HYPRE_SStructSplitSetTol(precond, 0.0); HYPRE_SStructSplitSetZeroGuess(precond); if (solver_id == 10) { HYPRE_SStructSplitSetStructSolver(precond, HYPRE_SMG); } else if (solver_id == 11) { HYPRE_SStructSplitSetStructSolver(precond, HYPRE_PFMG); } HYPRE_PCGSetPrecond( (HYPRE_Solver) solver, (HYPRE_PtrToSolverFcn) HYPRE_SStructSplitSolve, (HYPRE_PtrToSolverFcn) HYPRE_SStructSplitSetup, (HYPRE_Solver) precond); } else if (solver_id == 13) { /* use SysPFMG solver as preconditioner */ HYPRE_SStructSysPFMGCreate(comm, &precond); HYPRE_SStructSysPFMGSetMaxIter(precond, 1); HYPRE_SStructSysPFMGSetTol(precond, 0.0); HYPRE_SStructSysPFMGSetZeroGuess(precond); /* weighted Jacobi = 1; red-black GS = 2 */ HYPRE_SStructSysPFMGSetRelaxType(precond, 1); HYPRE_SStructSysPFMGSetNumPreRelax(precond, n_pre); HYPRE_SStructSysPFMGSetNumPostRelax(precond, n_post); HYPRE_SStructSysPFMGSetSkipRelax(precond, skip); /*HYPRE_StructPFMGSetDxyz(precond, dxyz);*/ HYPRE_PCGSetPrecond( (HYPRE_Solver) solver, (HYPRE_PtrToSolverFcn) HYPRE_SStructSysPFMGSolve, (HYPRE_PtrToSolverFcn) HYPRE_SStructSysPFMGSetup, (HYPRE_Solver) precond); } else if (solver_id == 18) { /* use diagonal scaling as preconditioner */ precond = NULL; HYPRE_PCGSetPrecond( (HYPRE_Solver) solver, (HYPRE_PtrToSolverFcn) HYPRE_SStructDiagScale, (HYPRE_PtrToSolverFcn) HYPRE_SStructDiagScaleSetup, (HYPRE_Solver) precond); } else if (solver_id != NO_SOLVER ) { if ( verbosity ) { hypre_printf("Solver ID not recognized - running inner PCG iterations without preconditioner\n\n"); } } hypre_EndTiming(time_index); hypre_PrintTiming("Setup phase times", comm); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); HYPRE_LOBPCGCreate(interpreter, &matvec_fn, (HYPRE_Solver*)&lobpcg_solver); HYPRE_LOBPCGSetMaxIter((HYPRE_Solver)lobpcg_solver, maxIterations); HYPRE_LOBPCGSetPrecondUsageMode((HYPRE_Solver)lobpcg_solver, pcgMode); HYPRE_LOBPCGSetTol((HYPRE_Solver)lobpcg_solver, tol); HYPRE_LOBPCGSetPrintLevel((HYPRE_Solver)lobpcg_solver, verbosity); HYPRE_LOBPCGSetPrecond((HYPRE_Solver)lobpcg_solver, (HYPRE_PtrToSolverFcn) HYPRE_PCGSolve, (HYPRE_PtrToSolverFcn) HYPRE_PCGSetup, (HYPRE_Solver)solver); HYPRE_LOBPCGSetup((HYPRE_Solver)lobpcg_solver, (HYPRE_Matrix)A, (HYPRE_Vector)b, (HYPRE_Vector)x); eigenvectors = mv_MultiVectorCreateFromSampleVector( interpreter, blockSize, x ); eigenvalues = hypre_CTAlloc(HYPRE_Real, blockSize, HYPRE_MEMORY_HOST); if ( lobpcgSeed ) { mv_MultiVectorSetRandom( eigenvectors, lobpcgSeed ); } else { mv_MultiVectorSetRandom( eigenvectors, (HYPRE_Int)time(0) ); } time_index = hypre_InitializeTiming("PCG Solve"); hypre_BeginTiming(time_index); HYPRE_LOBPCGSolve((HYPRE_Solver)lobpcg_solver, constrains, eigenvectors, eigenvalues ); hypre_EndTiming(time_index); hypre_PrintTiming("Solve phase times", comm); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); if ( checkOrtho ) { gramXX = utilities_FortranMatrixCreate(); identity = utilities_FortranMatrixCreate(); utilities_FortranMatrixAllocateData( blockSize, blockSize, gramXX ); utilities_FortranMatrixAllocateData( blockSize, blockSize, identity ); lobpcg_MultiVectorByMultiVector( eigenvectors, eigenvectors, gramXX ); utilities_FortranMatrixSetToIdentity( identity ); utilities_FortranMatrixAdd( -1, identity, gramXX, gramXX ); nonOrthF = utilities_FortranMatrixFNorm( gramXX ); if ( myid == 0 ) { hypre_printf("Non-orthonormality of eigenvectors: %12.5e\n", nonOrthF); } utilities_FortranMatrixDestroy( gramXX ); utilities_FortranMatrixDestroy( identity ); } if ( printLevel ) { if ( myid == 0 ) { if ( (filePtr = fopen("values.txt", "w")) ) { hypre_fprintf(filePtr, "%d\n", blockSize); for ( i = 0; i < blockSize; i++ ) { hypre_fprintf(filePtr, "%22.14e\n", eigenvalues[i]); } fclose(filePtr); } if ( (filePtr = fopen("residuals.txt", "w")) ) { residualNorms = HYPRE_LOBPCGResidualNorms( (HYPRE_Solver)lobpcg_solver ); residuals = utilities_FortranMatrixValues( residualNorms ); hypre_fprintf(filePtr, "%d\n", blockSize); for ( i = 0; i < blockSize; i++ ) { hypre_fprintf(filePtr, "%22.14e\n", residuals[i]); } fclose(filePtr); } if ( printLevel > 1 ) { printBuffer = utilities_FortranMatrixCreate(); iterations = HYPRE_LOBPCGIterations( (HYPRE_Solver)lobpcg_solver ); eigenvaluesHistory = HYPRE_LOBPCGEigenvaluesHistory( (HYPRE_Solver)lobpcg_solver ); utilities_FortranMatrixSelectBlock( eigenvaluesHistory, 1, blockSize, 1, iterations + 1, printBuffer ); utilities_FortranMatrixPrint( printBuffer, "val_hist.txt" ); residualNormsHistory = HYPRE_LOBPCGResidualNormsHistory( (HYPRE_Solver)lobpcg_solver ); utilities_FortranMatrixSelectBlock(residualNormsHistory, 1, blockSize, 1, iterations + 1, printBuffer ); utilities_FortranMatrixPrint( printBuffer, "res_hist.txt" ); utilities_FortranMatrixDestroy( printBuffer ); } } } HYPRE_SStructPCGDestroy(solver); if ((solver_id == 10) || (solver_id == 11)) { HYPRE_SStructSplitDestroy(precond); } else if (solver_id == 13) { HYPRE_SStructSysPFMGDestroy(precond); } HYPRE_LOBPCGDestroy((HYPRE_Solver)lobpcg_solver); mv_MultiVectorDestroy( eigenvectors ); hypre_TFree(eigenvalues, HYPRE_MEMORY_HOST); } else { time_index = hypre_InitializeTiming("LOBPCG Setup"); hypre_BeginTiming(time_index); HYPRE_LOBPCGCreate(interpreter, &matvec_fn, (HYPRE_Solver*)&solver); HYPRE_LOBPCGSetMaxIter( (HYPRE_Solver) solver, maxIterations ); HYPRE_LOBPCGSetTol( (HYPRE_Solver) solver, tol ); HYPRE_LOBPCGSetPrintLevel( (HYPRE_Solver) solver, verbosity ); if ((solver_id == 10) || (solver_id == 11)) { /* use Split solver as preconditioner */ HYPRE_SStructSplitCreate(comm, &precond); HYPRE_SStructSplitSetMaxIter(precond, 1); HYPRE_SStructSplitSetTol(precond, 0.0); HYPRE_SStructSplitSetZeroGuess(precond); if (solver_id == 10) { HYPRE_SStructSplitSetStructSolver(precond, HYPRE_SMG); } else if (solver_id == 11) { HYPRE_SStructSplitSetStructSolver(precond, HYPRE_PFMG); } HYPRE_LOBPCGSetPrecond( (HYPRE_Solver) solver, (HYPRE_PtrToSolverFcn) HYPRE_SStructSplitSolve, (HYPRE_PtrToSolverFcn) HYPRE_SStructSplitSetup, (HYPRE_Solver) precond); } else if (solver_id == 13) { /* use SysPFMG solver as preconditioner */ HYPRE_SStructSysPFMGCreate(comm, &precond); HYPRE_SStructSysPFMGSetMaxIter(precond, 1); HYPRE_SStructSysPFMGSetTol(precond, 0.0); HYPRE_SStructSysPFMGSetZeroGuess(precond); /* weighted Jacobi = 1; red-black GS = 2 */ HYPRE_SStructSysPFMGSetRelaxType(precond, 1); HYPRE_SStructSysPFMGSetNumPreRelax(precond, n_pre); HYPRE_SStructSysPFMGSetNumPostRelax(precond, n_post); HYPRE_SStructSysPFMGSetSkipRelax(precond, skip); /*HYPRE_StructPFMGSetDxyz(precond, dxyz);*/ HYPRE_LOBPCGSetPrecond( (HYPRE_Solver) solver, (HYPRE_PtrToSolverFcn) HYPRE_SStructSysPFMGSolve, (HYPRE_PtrToSolverFcn) HYPRE_SStructSysPFMGSetup, (HYPRE_Solver) precond); } else if (solver_id == 18) { /* use diagonal scaling as preconditioner */ precond = NULL; HYPRE_LOBPCGSetPrecond( (HYPRE_Solver) solver, (HYPRE_PtrToSolverFcn) HYPRE_SStructDiagScale, (HYPRE_PtrToSolverFcn) HYPRE_SStructDiagScaleSetup, (HYPRE_Solver) precond); } else if (solver_id != NO_SOLVER ) { if ( verbosity ) { hypre_printf("Solver ID not recognized - running LOBPCG without preconditioner\n\n"); } } HYPRE_LOBPCGSetup( (HYPRE_Solver) solver, (HYPRE_Matrix) A, (HYPRE_Vector) b, (HYPRE_Vector) x); hypre_EndTiming(time_index); hypre_PrintTiming("Setup phase times", comm); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); eigenvectors = mv_MultiVectorCreateFromSampleVector( interpreter, blockSize, x ); eigenvalues = hypre_CTAlloc(HYPRE_Real, blockSize, HYPRE_MEMORY_HOST); if ( lobpcgSeed ) { mv_MultiVectorSetRandom( eigenvectors, lobpcgSeed ); } else { mv_MultiVectorSetRandom( eigenvectors, (HYPRE_Int)time(0) ); } time_index = hypre_InitializeTiming("LOBPCG Solve"); hypre_BeginTiming(time_index); HYPRE_LOBPCGSolve ( (HYPRE_Solver) solver, constrains, eigenvectors, eigenvalues ); hypre_EndTiming(time_index); hypre_PrintTiming("Solve phase times", comm); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); if ( checkOrtho ) { gramXX = utilities_FortranMatrixCreate(); identity = utilities_FortranMatrixCreate(); utilities_FortranMatrixAllocateData( blockSize, blockSize, gramXX ); utilities_FortranMatrixAllocateData( blockSize, blockSize, identity ); lobpcg_MultiVectorByMultiVector( eigenvectors, eigenvectors, gramXX ); utilities_FortranMatrixSetToIdentity( identity ); utilities_FortranMatrixAdd( -1, identity, gramXX, gramXX ); nonOrthF = utilities_FortranMatrixFNorm( gramXX ); if ( myid == 0 ) { hypre_printf("Non-orthonormality of eigenvectors: %12.5e\n", nonOrthF); } utilities_FortranMatrixDestroy( gramXX ); utilities_FortranMatrixDestroy( identity ); } if ( printLevel ) { if ( myid == 0 ) { if ( (filePtr = fopen("values.txt", "w")) ) { hypre_fprintf(filePtr, "%d\n", blockSize); for ( i = 0; i < blockSize; i++ ) { hypre_fprintf(filePtr, "%22.14e\n", eigenvalues[i]); } fclose(filePtr); } if ( (filePtr = fopen("residuals.txt", "w")) ) { residualNorms = HYPRE_LOBPCGResidualNorms( (HYPRE_Solver)solver ); residuals = utilities_FortranMatrixValues( residualNorms ); hypre_fprintf(filePtr, "%d\n", blockSize); for ( i = 0; i < blockSize; i++ ) { hypre_fprintf(filePtr, "%22.14e\n", residuals[i]); } fclose(filePtr); } if ( printLevel > 1 ) { printBuffer = utilities_FortranMatrixCreate(); iterations = HYPRE_LOBPCGIterations( (HYPRE_Solver)solver ); eigenvaluesHistory = HYPRE_LOBPCGEigenvaluesHistory( (HYPRE_Solver)solver ); utilities_FortranMatrixSelectBlock( eigenvaluesHistory, 1, blockSize, 1, iterations + 1, printBuffer ); utilities_FortranMatrixPrint( printBuffer, "val_hist.txt" ); residualNormsHistory = HYPRE_LOBPCGResidualNormsHistory( (HYPRE_Solver)solver ); utilities_FortranMatrixSelectBlock(residualNormsHistory, 1, blockSize, 1, iterations + 1, printBuffer ); utilities_FortranMatrixPrint( printBuffer, "res_hist.txt" ); utilities_FortranMatrixDestroy( printBuffer ); } } } HYPRE_LOBPCGDestroy((HYPRE_Solver)solver); if ((solver_id == 10) || (solver_id == 11)) { HYPRE_SStructSplitDestroy(precond); } else if (solver_id == 13) { HYPRE_SStructSysPFMGDestroy(precond); } mv_MultiVectorDestroy( eigenvectors ); hypre_TFree(eigenvalues, HYPRE_MEMORY_HOST); } hypre_TFree( interpreter, HYPRE_MEMORY_HOST); } /* end lobpcg */ /*----------------------------------------------------------- * Solve the system using ParCSR version of PCG *-----------------------------------------------------------*/ if ((solver_id >= 20) && (solver_id < 30)) { time_index = hypre_InitializeTiming("PCG Setup"); hypre_BeginTiming(time_index); HYPRE_ParCSRPCGCreate(comm, &par_solver); HYPRE_PCGSetMaxIter( par_solver, 100 ); HYPRE_PCGSetTol( par_solver, tol ); HYPRE_PCGSetTwoNorm( par_solver, 1 ); HYPRE_PCGSetRelChange( par_solver, 0 ); HYPRE_PCGSetPrintLevel( par_solver, solver_print_level ); HYPRE_PCGSetRecomputeResidual( (HYPRE_Solver) par_solver, recompute_res); if (solver_id == 20) { /* use BoomerAMG as preconditioner */ HYPRE_BoomerAMGCreate(&par_precond); if (old_default) { HYPRE_BoomerAMGSetOldDefault(par_precond); } HYPRE_BoomerAMGSetStrongThreshold(par_precond, 0.25); HYPRE_BoomerAMGSetTol(par_precond, 0.0); HYPRE_BoomerAMGSetPrintLevel(par_precond, prec_print_level); HYPRE_BoomerAMGSetPrintFileName(par_precond, "sstruct.out.log"); HYPRE_BoomerAMGSetMaxIter(par_precond, 1); HYPRE_PCGSetPrecond( par_solver, (HYPRE_PtrToSolverFcn) HYPRE_BoomerAMGSolve, (HYPRE_PtrToSolverFcn) HYPRE_BoomerAMGSetup, par_precond ); } else if (solver_id == 21) { /* use Euclid as preconditioner */ HYPRE_EuclidCreate(comm, &par_precond); HYPRE_EuclidSetParams(par_precond, argc, argv); HYPRE_PCGSetPrecond(par_solver, (HYPRE_PtrToSolverFcn) HYPRE_EuclidSolve, (HYPRE_PtrToSolverFcn) HYPRE_EuclidSetup, par_precond); } else if (solver_id == 22) { /* use ParaSails as preconditioner */ HYPRE_ParCSRParaSailsCreate(comm, &par_precond ); HYPRE_ParCSRParaSailsSetParams(par_precond, 0.1, 1); HYPRE_PCGSetPrecond( par_solver, (HYPRE_PtrToSolverFcn) HYPRE_ParCSRParaSailsSolve, (HYPRE_PtrToSolverFcn) HYPRE_ParCSRParaSailsSetup, par_precond ); } else if (solver_id == 28) { /* use diagonal scaling as preconditioner */ par_precond = NULL; HYPRE_PCGSetPrecond( par_solver, (HYPRE_PtrToSolverFcn) HYPRE_ParCSRDiagScale, (HYPRE_PtrToSolverFcn) HYPRE_ParCSRDiagScaleSetup, par_precond ); } HYPRE_PCGSetup( par_solver, (HYPRE_Matrix) par_A, (HYPRE_Vector) par_b, (HYPRE_Vector) par_x ); hypre_EndTiming(time_index); hypre_PrintTiming("Setup phase times", comm); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); time_index = hypre_InitializeTiming("PCG Solve"); hypre_BeginTiming(time_index); HYPRE_PCGSolve( par_solver, (HYPRE_Matrix) par_A, (HYPRE_Vector) par_b, (HYPRE_Vector) par_x ); hypre_EndTiming(time_index); hypre_PrintTiming("Solve phase times", comm); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); HYPRE_PCGGetNumIterations( par_solver, &num_iterations ); HYPRE_PCGGetFinalRelativeResidualNorm( par_solver, &final_res_norm ); HYPRE_ParCSRPCGDestroy(par_solver); if (solver_id == 20) { HYPRE_BoomerAMGDestroy(par_precond); } else if (solver_id == 21) { HYPRE_EuclidDestroy(par_precond); } else if (solver_id == 22) { HYPRE_ParCSRParaSailsDestroy(par_precond); } } /*----------------------------------------------------------- * Solve the system using GMRES *-----------------------------------------------------------*/ if ((solver_id >= 30) && (solver_id < 40)) { time_index = hypre_InitializeTiming("GMRES Setup"); hypre_BeginTiming(time_index); HYPRE_SStructGMRESCreate(comm, &solver); HYPRE_GMRESSetKDim( (HYPRE_Solver) solver, 5 ); HYPRE_GMRESSetMaxIter( (HYPRE_Solver) solver, 100 ); HYPRE_GMRESSetTol( (HYPRE_Solver) solver, tol ); HYPRE_GMRESSetPrintLevel( (HYPRE_Solver) solver, solver_print_level ); HYPRE_GMRESSetLogging( (HYPRE_Solver) solver, 1 ); if ((solver_id == 30) || (solver_id == 31)) { /* use Split solver as preconditioner */ HYPRE_SStructSplitCreate(comm, &precond); HYPRE_SStructSplitSetMaxIter(precond, 1); HYPRE_SStructSplitSetTol(precond, 0.0); HYPRE_SStructSplitSetZeroGuess(precond); if (solver_id == 30) { HYPRE_SStructSplitSetStructSolver(precond, HYPRE_SMG); } else if (solver_id == 31) { HYPRE_SStructSplitSetStructSolver(precond, HYPRE_PFMG); } HYPRE_GMRESSetPrecond( (HYPRE_Solver) solver, (HYPRE_PtrToSolverFcn) HYPRE_SStructSplitSolve, (HYPRE_PtrToSolverFcn) HYPRE_SStructSplitSetup, (HYPRE_Solver) precond ); } else if (solver_id == 38) { /* use diagonal scaling as preconditioner */ precond = NULL; HYPRE_GMRESSetPrecond( (HYPRE_Solver) solver, (HYPRE_PtrToSolverFcn) HYPRE_SStructDiagScale, (HYPRE_PtrToSolverFcn) HYPRE_SStructDiagScaleSetup, (HYPRE_Solver) precond ); } HYPRE_GMRESSetup( (HYPRE_Solver) solver, (HYPRE_Matrix) A, (HYPRE_Vector) b, (HYPRE_Vector) x ); hypre_EndTiming(time_index); hypre_PrintTiming("Setup phase times", comm); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); time_index = hypre_InitializeTiming("GMRES Solve"); hypre_BeginTiming(time_index); HYPRE_GMRESSolve( (HYPRE_Solver) solver, (HYPRE_Matrix) A, (HYPRE_Vector) b, (HYPRE_Vector) x ); hypre_EndTiming(time_index); hypre_PrintTiming("Solve phase times", comm); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); HYPRE_GMRESGetNumIterations( (HYPRE_Solver) solver, &num_iterations ); HYPRE_GMRESGetFinalRelativeResidualNorm( (HYPRE_Solver) solver, &final_res_norm ); HYPRE_SStructGMRESDestroy(solver); if ((solver_id == 30) || (solver_id == 31)) { HYPRE_SStructSplitDestroy(precond); } } /*----------------------------------------------------------- * Solve the system using ParCSR version of GMRES *-----------------------------------------------------------*/ if ((solver_id >= 40) && (solver_id < 50)) { time_index = hypre_InitializeTiming("GMRES Setup"); hypre_BeginTiming(time_index); HYPRE_ParCSRGMRESCreate(comm, &par_solver); HYPRE_GMRESSetKDim(par_solver, 5); HYPRE_GMRESSetMaxIter(par_solver, 100); HYPRE_GMRESSetTol(par_solver, tol); HYPRE_GMRESSetPrintLevel(par_solver, solver_print_level); HYPRE_GMRESSetLogging(par_solver, 1); if (solver_id == 40) { /* use BoomerAMG as preconditioner */ HYPRE_BoomerAMGCreate(&par_precond); if (old_default) { HYPRE_BoomerAMGSetOldDefault(par_precond); } HYPRE_BoomerAMGSetStrongThreshold(par_precond, 0.25); HYPRE_BoomerAMGSetTol(par_precond, 0.0); HYPRE_BoomerAMGSetPrintLevel(par_precond, prec_print_level); HYPRE_BoomerAMGSetPrintFileName(par_precond, "sstruct.out.log"); HYPRE_BoomerAMGSetMaxIter(par_precond, 1); HYPRE_GMRESSetPrecond( par_solver, (HYPRE_PtrToSolverFcn) HYPRE_BoomerAMGSolve, (HYPRE_PtrToSolverFcn) HYPRE_BoomerAMGSetup, par_precond); } else if (solver_id == 41) { /* use Euclid as preconditioner */ HYPRE_EuclidCreate(comm, &par_precond); HYPRE_EuclidSetParams(par_precond, argc, argv); HYPRE_GMRESSetPrecond(par_solver, (HYPRE_PtrToSolverFcn) HYPRE_EuclidSolve, (HYPRE_PtrToSolverFcn) HYPRE_EuclidSetup, par_precond); } else if (solver_id == 42) { /* use ParaSails as preconditioner */ HYPRE_ParCSRParaSailsCreate(comm, &par_precond ); HYPRE_ParCSRParaSailsSetParams(par_precond, 0.1, 1); HYPRE_ParCSRParaSailsSetSym(par_precond, 0); HYPRE_GMRESSetPrecond( par_solver, (HYPRE_PtrToSolverFcn) HYPRE_ParCSRParaSailsSolve, (HYPRE_PtrToSolverFcn) HYPRE_ParCSRParaSailsSetup, par_precond); } HYPRE_GMRESSetup( par_solver, (HYPRE_Matrix) par_A, (HYPRE_Vector) par_b, (HYPRE_Vector) par_x); hypre_EndTiming(time_index); hypre_PrintTiming("Setup phase times", comm); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); time_index = hypre_InitializeTiming("GMRES Solve"); hypre_BeginTiming(time_index); HYPRE_GMRESSolve( par_solver, (HYPRE_Matrix) par_A, (HYPRE_Vector) par_b, (HYPRE_Vector) par_x); hypre_EndTiming(time_index); hypre_PrintTiming("Solve phase times", comm); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); HYPRE_GMRESGetNumIterations( par_solver, &num_iterations); HYPRE_GMRESGetFinalRelativeResidualNorm( par_solver, &final_res_norm); HYPRE_ParCSRGMRESDestroy(par_solver); if (solver_id == 40) { HYPRE_BoomerAMGDestroy(par_precond); } else if (solver_id == 41) { HYPRE_EuclidDestroy(par_precond); } else if (solver_id == 42) { HYPRE_ParCSRParaSailsDestroy(par_precond); } } /*----------------------------------------------------------- * Solve the system using BiCGSTAB *-----------------------------------------------------------*/ if ((solver_id >= 50) && (solver_id < 60)) { time_index = hypre_InitializeTiming("BiCGSTAB Setup"); hypre_BeginTiming(time_index); HYPRE_SStructBiCGSTABCreate(comm, &solver); HYPRE_BiCGSTABSetMaxIter( (HYPRE_Solver) solver, 100 ); HYPRE_BiCGSTABSetTol( (HYPRE_Solver) solver, tol ); HYPRE_BiCGSTABSetPrintLevel( (HYPRE_Solver) solver, solver_print_level ); HYPRE_BiCGSTABSetLogging( (HYPRE_Solver) solver, 1 ); if ((solver_id == 50) || (solver_id == 51)) { /* use Split solver as preconditioner */ HYPRE_SStructSplitCreate(comm, &precond); HYPRE_SStructSplitSetMaxIter(precond, 1); HYPRE_SStructSplitSetTol(precond, 0.0); HYPRE_SStructSplitSetZeroGuess(precond); if (solver_id == 50) { HYPRE_SStructSplitSetStructSolver(precond, HYPRE_SMG); } else if (solver_id == 51) { HYPRE_SStructSplitSetStructSolver(precond, HYPRE_PFMG); } HYPRE_BiCGSTABSetPrecond( (HYPRE_Solver) solver, (HYPRE_PtrToSolverFcn) HYPRE_SStructSplitSolve, (HYPRE_PtrToSolverFcn) HYPRE_SStructSplitSetup, (HYPRE_Solver) precond ); } else if (solver_id == 58) { /* use diagonal scaling as preconditioner */ precond = NULL; HYPRE_BiCGSTABSetPrecond( (HYPRE_Solver) solver, (HYPRE_PtrToSolverFcn) HYPRE_SStructDiagScale, (HYPRE_PtrToSolverFcn) HYPRE_SStructDiagScaleSetup, (HYPRE_Solver) precond ); } HYPRE_BiCGSTABSetup( (HYPRE_Solver) solver, (HYPRE_Matrix) A, (HYPRE_Vector) b, (HYPRE_Vector) x ); hypre_EndTiming(time_index); hypre_PrintTiming("Setup phase times", comm); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); time_index = hypre_InitializeTiming("BiCGSTAB Solve"); hypre_BeginTiming(time_index); HYPRE_BiCGSTABSolve( (HYPRE_Solver) solver, (HYPRE_Matrix) A, (HYPRE_Vector) b, (HYPRE_Vector) x ); hypre_EndTiming(time_index); hypre_PrintTiming("Solve phase times", comm); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); HYPRE_BiCGSTABGetNumIterations( (HYPRE_Solver) solver, &num_iterations ); HYPRE_BiCGSTABGetFinalRelativeResidualNorm( (HYPRE_Solver) solver, &final_res_norm ); HYPRE_SStructBiCGSTABDestroy(solver); if ((solver_id == 50) || (solver_id == 51)) { HYPRE_SStructSplitDestroy(precond); } } /*----------------------------------------------------------- * Solve the system using ParCSR version of BiCGSTAB *-----------------------------------------------------------*/ if ((solver_id >= 60) && (solver_id < 70)) { time_index = hypre_InitializeTiming("BiCGSTAB Setup"); hypre_BeginTiming(time_index); HYPRE_ParCSRBiCGSTABCreate(comm, &par_solver); HYPRE_BiCGSTABSetMaxIter(par_solver, 100); HYPRE_BiCGSTABSetTol(par_solver, tol); HYPRE_BiCGSTABSetPrintLevel(par_solver, solver_print_level); HYPRE_BiCGSTABSetLogging(par_solver, 1); if (solver_id == 60) { /* use BoomerAMG as preconditioner */ HYPRE_BoomerAMGCreate(&par_precond); if (old_default) { HYPRE_BoomerAMGSetOldDefault(par_precond); } HYPRE_BoomerAMGSetStrongThreshold(par_precond, 0.25); HYPRE_BoomerAMGSetTol(par_precond, 0.0); HYPRE_BoomerAMGSetPrintLevel(par_precond, prec_print_level); HYPRE_BoomerAMGSetPrintFileName(par_precond, "sstruct.out.log"); HYPRE_BoomerAMGSetMaxIter(par_precond, 1); HYPRE_BiCGSTABSetPrecond( par_solver, (HYPRE_PtrToSolverFcn) HYPRE_BoomerAMGSolve, (HYPRE_PtrToSolverFcn) HYPRE_BoomerAMGSetup, par_precond); } else if (solver_id == 61) { /* use Euclid as preconditioner */ HYPRE_EuclidCreate(comm, &par_precond); HYPRE_EuclidSetParams(par_precond, argc, argv); HYPRE_BiCGSTABSetPrecond(par_solver, (HYPRE_PtrToSolverFcn) HYPRE_EuclidSolve, (HYPRE_PtrToSolverFcn) HYPRE_EuclidSetup, par_precond); } else if (solver_id == 62) { /* use ParaSails as preconditioner */ HYPRE_ParCSRParaSailsCreate(comm, &par_precond ); HYPRE_ParCSRParaSailsSetParams(par_precond, 0.1, 1); HYPRE_ParCSRParaSailsSetSym(par_precond, 0); HYPRE_BiCGSTABSetPrecond( par_solver, (HYPRE_PtrToSolverFcn) HYPRE_ParCSRParaSailsSolve, (HYPRE_PtrToSolverFcn) HYPRE_ParCSRParaSailsSetup, par_precond); } HYPRE_BiCGSTABSetup( par_solver, (HYPRE_Matrix) par_A, (HYPRE_Vector) par_b, (HYPRE_Vector) par_x); hypre_EndTiming(time_index); hypre_PrintTiming("Setup phase times", comm); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); time_index = hypre_InitializeTiming("BiCGSTAB Solve"); hypre_BeginTiming(time_index); HYPRE_BiCGSTABSolve( par_solver, (HYPRE_Matrix) par_A, (HYPRE_Vector) par_b, (HYPRE_Vector) par_x); hypre_EndTiming(time_index); hypre_PrintTiming("Solve phase times", comm); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); HYPRE_BiCGSTABGetNumIterations( par_solver, &num_iterations); HYPRE_BiCGSTABGetFinalRelativeResidualNorm( par_solver, &final_res_norm); HYPRE_ParCSRBiCGSTABDestroy(par_solver); if (solver_id == 60) { HYPRE_BoomerAMGDestroy(par_precond); } else if (solver_id == 61) { HYPRE_EuclidDestroy(par_precond); } else if (solver_id == 62) { HYPRE_ParCSRParaSailsDestroy(par_precond); } } /*----------------------------------------------------------- * Solve the system using Flexible GMRES *-----------------------------------------------------------*/ if ((solver_id >= 70) && (solver_id < 80)) { time_index = hypre_InitializeTiming("FlexGMRES Setup"); hypre_BeginTiming(time_index); HYPRE_SStructFlexGMRESCreate(comm, &solver); HYPRE_FlexGMRESSetKDim( (HYPRE_Solver) solver, 5 ); HYPRE_FlexGMRESSetMaxIter( (HYPRE_Solver) solver, 100 ); HYPRE_FlexGMRESSetTol( (HYPRE_Solver) solver, tol ); HYPRE_FlexGMRESSetPrintLevel( (HYPRE_Solver) solver, solver_print_level ); HYPRE_FlexGMRESSetLogging( (HYPRE_Solver) solver, 1 ); if ((solver_id == 70) || (solver_id == 71)) { /* use Split solver as preconditioner */ HYPRE_SStructSplitCreate(comm, &precond); HYPRE_SStructSplitSetMaxIter(precond, 1); HYPRE_SStructSplitSetTol(precond, 0.0); HYPRE_SStructSplitSetZeroGuess(precond); if (solver_id == 70) { HYPRE_SStructSplitSetStructSolver(precond, HYPRE_SMG); } else if (solver_id == 71) { HYPRE_SStructSplitSetStructSolver(precond, HYPRE_PFMG); } HYPRE_FlexGMRESSetPrecond( (HYPRE_Solver) solver, (HYPRE_PtrToSolverFcn) HYPRE_SStructSplitSolve, (HYPRE_PtrToSolverFcn) HYPRE_SStructSplitSetup, (HYPRE_Solver) precond ); } else if (solver_id == 78) { /* use diagonal scaling as preconditioner */ precond = NULL; HYPRE_FlexGMRESSetPrecond( (HYPRE_Solver) solver, (HYPRE_PtrToSolverFcn) HYPRE_SStructDiagScale, (HYPRE_PtrToSolverFcn) HYPRE_SStructDiagScaleSetup, (HYPRE_Solver) precond ); } HYPRE_FlexGMRESSetup( (HYPRE_Solver) solver, (HYPRE_Matrix) A, (HYPRE_Vector) b, (HYPRE_Vector) x ); hypre_EndTiming(time_index); hypre_PrintTiming("Setup phase times", comm); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); time_index = hypre_InitializeTiming("FlexGMRES Solve"); hypre_BeginTiming(time_index); HYPRE_FlexGMRESSolve( (HYPRE_Solver) solver, (HYPRE_Matrix) A, (HYPRE_Vector) b, (HYPRE_Vector) x ); hypre_EndTiming(time_index); hypre_PrintTiming("Solve phase times", comm); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); HYPRE_FlexGMRESGetNumIterations( (HYPRE_Solver) solver, &num_iterations ); HYPRE_FlexGMRESGetFinalRelativeResidualNorm( (HYPRE_Solver) solver, &final_res_norm ); HYPRE_SStructFlexGMRESDestroy(solver); if ((solver_id == 70) || (solver_id == 71)) { HYPRE_SStructSplitDestroy(precond); } } /*----------------------------------------------------------- * Solve the system using ParCSR version of Flexible GMRES *-----------------------------------------------------------*/ if ((solver_id >= 80) && (solver_id < 90)) { time_index = hypre_InitializeTiming("FlexGMRES Setup"); hypre_BeginTiming(time_index); HYPRE_ParCSRFlexGMRESCreate(comm, &par_solver); HYPRE_FlexGMRESSetKDim(par_solver, 5); HYPRE_FlexGMRESSetMaxIter(par_solver, 100); HYPRE_FlexGMRESSetTol(par_solver, tol); HYPRE_FlexGMRESSetPrintLevel(par_solver, solver_print_level); HYPRE_FlexGMRESSetLogging(par_solver, 1); if (solver_id == 80) { /* use BoomerAMG as preconditioner */ HYPRE_BoomerAMGCreate(&par_precond); if (old_default) { HYPRE_BoomerAMGSetOldDefault(par_precond); } HYPRE_BoomerAMGSetStrongThreshold(par_precond, 0.25); HYPRE_BoomerAMGSetTol(par_precond, 0.0); HYPRE_BoomerAMGSetPrintLevel(par_precond, prec_print_level); HYPRE_BoomerAMGSetPrintFileName(par_precond, "sstruct.out.log"); HYPRE_BoomerAMGSetMaxIter(par_precond, 1); HYPRE_FlexGMRESSetPrecond( par_solver, (HYPRE_PtrToSolverFcn) HYPRE_BoomerAMGSolve, (HYPRE_PtrToSolverFcn) HYPRE_BoomerAMGSetup, par_precond); } HYPRE_FlexGMRESSetup( par_solver, (HYPRE_Matrix) par_A, (HYPRE_Vector) par_b, (HYPRE_Vector) par_x); hypre_EndTiming(time_index); hypre_PrintTiming("Setup phase times", comm); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); time_index = hypre_InitializeTiming("FlexGMRES Solve"); hypre_BeginTiming(time_index); HYPRE_FlexGMRESSolve( par_solver, (HYPRE_Matrix) par_A, (HYPRE_Vector) par_b, (HYPRE_Vector) par_x); hypre_EndTiming(time_index); hypre_PrintTiming("Solve phase times", comm); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); HYPRE_FlexGMRESGetNumIterations( par_solver, &num_iterations); HYPRE_FlexGMRESGetFinalRelativeResidualNorm( par_solver, &final_res_norm); HYPRE_ParCSRFlexGMRESDestroy(par_solver); if (solver_id == 80) { HYPRE_BoomerAMGDestroy(par_precond); } } /*----------------------------------------------------------- * Solve the system using ParCSR version of LGMRES *-----------------------------------------------------------*/ if ((solver_id >= 90) && (solver_id < 100)) { time_index = hypre_InitializeTiming("LGMRES Setup"); hypre_BeginTiming(time_index); HYPRE_ParCSRLGMRESCreate(comm, &par_solver); HYPRE_LGMRESSetKDim(par_solver, 10); HYPRE_LGMRESSetAugDim(par_solver, 2); HYPRE_LGMRESSetMaxIter(par_solver, 100); HYPRE_LGMRESSetTol(par_solver, tol); HYPRE_LGMRESSetPrintLevel(par_solver, solver_print_level); HYPRE_LGMRESSetLogging(par_solver, 1); if (solver_id == 90) { /* use BoomerAMG as preconditioner */ HYPRE_BoomerAMGCreate(&par_precond); if (old_default) { HYPRE_BoomerAMGSetOldDefault(par_precond); } HYPRE_BoomerAMGSetStrongThreshold(par_precond, 0.25); HYPRE_BoomerAMGSetTol(par_precond, 0.0); HYPRE_BoomerAMGSetPrintLevel(par_precond, prec_print_level); HYPRE_BoomerAMGSetPrintFileName(par_precond, "sstruct.out.log"); HYPRE_BoomerAMGSetMaxIter(par_precond, 1); HYPRE_LGMRESSetPrecond( par_solver, (HYPRE_PtrToSolverFcn) HYPRE_BoomerAMGSolve, (HYPRE_PtrToSolverFcn) HYPRE_BoomerAMGSetup, par_precond); } HYPRE_LGMRESSetup( par_solver, (HYPRE_Matrix) par_A, (HYPRE_Vector) par_b, (HYPRE_Vector) par_x); hypre_EndTiming(time_index); hypre_PrintTiming("Setup phase times", comm); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); time_index = hypre_InitializeTiming("LGMRES Solve"); hypre_BeginTiming(time_index); HYPRE_LGMRESSolve( par_solver, (HYPRE_Matrix) par_A, (HYPRE_Vector) par_b, (HYPRE_Vector) par_x); hypre_EndTiming(time_index); hypre_PrintTiming("Solve phase times", comm); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); HYPRE_LGMRESGetNumIterations( par_solver, &num_iterations); HYPRE_LGMRESGetFinalRelativeResidualNorm( par_solver, &final_res_norm); HYPRE_ParCSRLGMRESDestroy(par_solver); if (solver_id == 90) { HYPRE_BoomerAMGDestroy(par_precond); } } /*----------------------------------------------------------- * Solve the system using ParCSR hybrid DSCG/BoomerAMG *-----------------------------------------------------------*/ if (solver_id == 120) { time_index = hypre_InitializeTiming("Hybrid Setup"); hypre_BeginTiming(time_index); HYPRE_ParCSRHybridCreate(&par_solver); HYPRE_ParCSRHybridSetTol(par_solver, tol); HYPRE_ParCSRHybridSetTwoNorm(par_solver, 1); HYPRE_ParCSRHybridSetRelChange(par_solver, 0); HYPRE_ParCSRHybridSetPrintLevel(par_solver, prec_print_level); //13 HYPRE_ParCSRHybridSetLogging(par_solver, 1); HYPRE_ParCSRHybridSetSolverType(par_solver, solver_type); HYPRE_ParCSRHybridSetRecomputeResidual(par_solver, recompute_res); #if defined(HYPRE_USING_CUDA) || defined(HYPRE_USING_DEVICE_OPENMP) /* HYPRE_ParCSRHybridSetPMaxElmts(par_solver, 8); HYPRE_ParCSRHybridSetRelaxType(par_solver, 18); HYPRE_ParCSRHybridSetCycleRelaxType(par_solver, 9, 3); HYPRE_ParCSRHybridSetCoarsenType(par_solver, 8); HYPRE_ParCSRHybridSetInterpType(par_solver, 3); HYPRE_ParCSRHybridSetMaxCoarseSize(par_solver, 20); */ #endif #if SECOND_TIME hypre_ParVector *par_x2 = hypre_ParVectorCreate(hypre_ParVectorComm(par_x), hypre_ParVectorGlobalSize(par_x), hypre_ParVectorPartitioning(par_x)); hypre_ParVectorInitialize(par_x2); hypre_ParVectorCopy(par_x, par_x2); HYPRE_ParCSRHybridSetup(par_solver, par_A, par_b, par_x); HYPRE_ParCSRHybridSolve(par_solver, par_A, par_b, par_x); hypre_ParVectorCopy(par_x2, par_x); #endif hypre_GpuProfilingPushRange("HybridSolve"); //cudaProfilerStart(); HYPRE_ParCSRHybridSetup(par_solver, par_A, par_b, par_x); hypre_EndTiming(time_index); hypre_PrintTiming("Setup phase times", comm); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); time_index = hypre_InitializeTiming("Hybrid Solve"); hypre_BeginTiming(time_index); HYPRE_ParCSRHybridSolve(par_solver, par_A, par_b, par_x); hypre_EndTiming(time_index); hypre_PrintTiming("Solve phase times", comm); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); HYPRE_ParCSRHybridGetNumIterations(par_solver, &num_iterations); HYPRE_ParCSRHybridGetFinalRelativeResidualNorm(par_solver, &final_res_norm); /* HYPRE_Real time[4]; HYPRE_ParCSRHybridGetSetupSolveTime(par_solver, time); if (myid == 0) { printf("ParCSRHybrid: Setup-Time1 %f, Solve-Time1 %f, Setup-Time2 %f, Solve-Time2 %f\n", time[0], time[1], time[2], time[3]); } */ HYPRE_ParCSRHybridDestroy(par_solver); hypre_GpuProfilingPopRange(); //cudaProfilerStop(); #if SECOND_TIME hypre_ParVectorDestroy(par_x2); #endif } /*----------------------------------------------------------- * Solve the system using Struct solvers *-----------------------------------------------------------*/ if (solver_id == 200) { time_index = hypre_InitializeTiming("SMG Setup"); hypre_BeginTiming(time_index); HYPRE_StructSMGCreate(comm, &struct_solver); HYPRE_StructSMGSetMemoryUse(struct_solver, 0); HYPRE_StructSMGSetMaxIter(struct_solver, 50); HYPRE_StructSMGSetTol(struct_solver, tol); HYPRE_StructSMGSetRelChange(struct_solver, 0); HYPRE_StructSMGSetNumPreRelax(struct_solver, n_pre); HYPRE_StructSMGSetNumPostRelax(struct_solver, n_post); HYPRE_StructSMGSetPrintLevel(struct_solver, prec_print_level); HYPRE_StructSMGSetLogging(struct_solver, 1); HYPRE_StructSMGSetup(struct_solver, sA, sb, sx); hypre_EndTiming(time_index); hypre_PrintTiming("Setup phase times", comm); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); time_index = hypre_InitializeTiming("SMG Solve"); hypre_BeginTiming(time_index); HYPRE_StructSMGSolve(struct_solver, sA, sb, sx); hypre_EndTiming(time_index); hypre_PrintTiming("Solve phase times", comm); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); HYPRE_StructSMGGetNumIterations(struct_solver, &num_iterations); HYPRE_StructSMGGetFinalRelativeResidualNorm(struct_solver, &final_res_norm); HYPRE_StructSMGDestroy(struct_solver); } else if ( solver_id == 201 || solver_id == 203 || solver_id == 204 ) { time_index = hypre_InitializeTiming("PFMG Setup"); hypre_BeginTiming(time_index); HYPRE_StructPFMGCreate(comm, &struct_solver); HYPRE_StructPFMGSetMaxIter(struct_solver, 50); HYPRE_StructPFMGSetTol(struct_solver, tol); HYPRE_StructPFMGSetRelChange(struct_solver, 0); HYPRE_StructPFMGSetRAPType(struct_solver, rap); HYPRE_StructPFMGSetRelaxType(struct_solver, relax); if (usr_jacobi_weight) { HYPRE_StructPFMGSetJacobiWeight(struct_solver, jacobi_weight); } HYPRE_StructPFMGSetNumPreRelax(struct_solver, n_pre); HYPRE_StructPFMGSetNumPostRelax(struct_solver, n_post); HYPRE_StructPFMGSetSkipRelax(struct_solver, skip); /*HYPRE_StructPFMGSetDxyz(struct_solver, dxyz);*/ HYPRE_StructPFMGSetPrintLevel(struct_solver, prec_print_level); HYPRE_StructPFMGSetLogging(struct_solver, 1); HYPRE_StructPFMGSetup(struct_solver, sA, sb, sx); hypre_EndTiming(time_index); hypre_PrintTiming("Setup phase times", comm); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); time_index = hypre_InitializeTiming("PFMG Solve"); hypre_BeginTiming(time_index); HYPRE_StructPFMGSolve(struct_solver, sA, sb, sx); hypre_EndTiming(time_index); hypre_PrintTiming("Solve phase times", comm); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); HYPRE_StructPFMGGetNumIterations(struct_solver, &num_iterations); HYPRE_StructPFMGGetFinalRelativeResidualNorm(struct_solver, &final_res_norm); HYPRE_StructPFMGDestroy(struct_solver); } /*----------------------------------------------------------- * Solve the system using Cyclic Reduction *-----------------------------------------------------------*/ else if ( solver_id == 205 ) { HYPRE_StructVector sr; time_index = hypre_InitializeTiming("CycRed Setup"); hypre_BeginTiming(time_index); HYPRE_StructCycRedCreate(comm, &struct_solver); HYPRE_StructCycRedSetTDim(struct_solver, cycred_tdim); HYPRE_StructCycRedSetBase(struct_solver, data.ndim, cycred_index, cycred_stride); HYPRE_StructCycRedSetup(struct_solver, sA, sb, sx); hypre_EndTiming(time_index); hypre_PrintTiming("Setup phase times", comm); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); time_index = hypre_InitializeTiming("CycRed Solve"); hypre_BeginTiming(time_index); HYPRE_StructCycRedSolve(struct_solver, sA, sb, sx); hypre_EndTiming(time_index); hypre_PrintTiming("Solve phase times", comm); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); num_iterations = 1; HYPRE_StructVectorCreate(comm, hypre_StructVectorGrid(sb), &sr); HYPRE_StructVectorInitialize(sr); HYPRE_StructVectorAssemble(sr); HYPRE_StructVectorCopy(sb, sr); hypre_StructMatvec(-1.0, sA, sx, 1.0, sr); /* Using an inner product instead of a norm to help with testing */ final_res_norm = hypre_StructInnerProd(sr, sr); if (final_res_norm < 1.0e-20) { final_res_norm = 0.0; } HYPRE_StructVectorDestroy(sr); HYPRE_StructCycRedDestroy(struct_solver); } /*----------------------------------------------------------- * Solve the system using SparseMSG *-----------------------------------------------------------*/ else if (solver_id == 202) { time_index = hypre_InitializeTiming("SparseMSG Setup"); hypre_BeginTiming(time_index); HYPRE_StructSparseMSGCreate(comm, &struct_solver); HYPRE_StructSparseMSGSetMaxIter(struct_solver, 50); HYPRE_StructSparseMSGSetJump(struct_solver, jump); HYPRE_StructSparseMSGSetTol(struct_solver, tol); HYPRE_StructSparseMSGSetRelChange(struct_solver, 0); HYPRE_StructSparseMSGSetRelaxType(struct_solver, relax); if (usr_jacobi_weight) { HYPRE_StructSparseMSGSetJacobiWeight(struct_solver, jacobi_weight); } HYPRE_StructSparseMSGSetNumPreRelax(struct_solver, n_pre); HYPRE_StructSparseMSGSetNumPostRelax(struct_solver, n_post); HYPRE_StructSparseMSGSetPrintLevel(struct_solver, prec_print_level); HYPRE_StructSparseMSGSetLogging(struct_solver, 1); HYPRE_StructSparseMSGSetup(struct_solver, sA, sb, sx); hypre_EndTiming(time_index); hypre_PrintTiming("Setup phase times", comm); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); time_index = hypre_InitializeTiming("SparseMSG Solve"); hypre_BeginTiming(time_index); HYPRE_StructSparseMSGSolve(struct_solver, sA, sb, sx); hypre_EndTiming(time_index); hypre_PrintTiming("Solve phase times", comm); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); HYPRE_StructSparseMSGGetNumIterations(struct_solver, &num_iterations); HYPRE_StructSparseMSGGetFinalRelativeResidualNorm(struct_solver, &final_res_norm); HYPRE_StructSparseMSGDestroy(struct_solver); } /*----------------------------------------------------------- * Solve the system using Jacobi *-----------------------------------------------------------*/ else if ( solver_id == 208 ) { time_index = hypre_InitializeTiming("Jacobi Setup"); hypre_BeginTiming(time_index); HYPRE_StructJacobiCreate(comm, &struct_solver); HYPRE_StructJacobiSetMaxIter(struct_solver, 100); HYPRE_StructJacobiSetTol(struct_solver, tol); HYPRE_StructJacobiSetup(struct_solver, sA, sb, sx); hypre_EndTiming(time_index); hypre_PrintTiming("Setup phase times", comm); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); time_index = hypre_InitializeTiming("Jacobi Solve"); hypre_BeginTiming(time_index); HYPRE_StructJacobiSolve(struct_solver, sA, sb, sx); hypre_EndTiming(time_index); hypre_PrintTiming("Solve phase times", comm); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); HYPRE_StructJacobiGetNumIterations(struct_solver, &num_iterations); HYPRE_StructJacobiGetFinalRelativeResidualNorm(struct_solver, &final_res_norm); HYPRE_StructJacobiDestroy(struct_solver); } /*----------------------------------------------------------- * Solve the system using CG *-----------------------------------------------------------*/ if ((solver_id > 209) && (solver_id < 220)) { time_index = hypre_InitializeTiming("PCG Setup"); hypre_BeginTiming(time_index); HYPRE_StructPCGCreate(comm, &struct_solver); HYPRE_PCGSetMaxIter( (HYPRE_Solver)struct_solver, 100 ); HYPRE_PCGSetTol( (HYPRE_Solver)struct_solver, tol ); HYPRE_PCGSetTwoNorm( (HYPRE_Solver)struct_solver, 1 ); HYPRE_PCGSetRelChange( (HYPRE_Solver)struct_solver, 0 ); HYPRE_PCGSetPrintLevel( (HYPRE_Solver)struct_solver, solver_print_level ); HYPRE_PCGSetRecomputeResidual( (HYPRE_Solver)struct_solver, recompute_res); if (solver_id == 210) { /* use symmetric SMG as preconditioner */ HYPRE_StructSMGCreate(comm, &struct_precond); HYPRE_StructSMGSetMemoryUse(struct_precond, 0); HYPRE_StructSMGSetMaxIter(struct_precond, 1); HYPRE_StructSMGSetTol(struct_precond, 0.0); HYPRE_StructSMGSetZeroGuess(struct_precond); HYPRE_StructSMGSetNumPreRelax(struct_precond, n_pre); HYPRE_StructSMGSetNumPostRelax(struct_precond, n_post); HYPRE_StructSMGSetPrintLevel(struct_precond, prec_print_level); HYPRE_StructSMGSetLogging(struct_precond, 0); HYPRE_PCGSetPrecond( (HYPRE_Solver) struct_solver, (HYPRE_PtrToSolverFcn) HYPRE_StructSMGSolve, (HYPRE_PtrToSolverFcn) HYPRE_StructSMGSetup, (HYPRE_Solver) struct_precond); } else if (solver_id == 211) { /* use symmetric PFMG as preconditioner */ HYPRE_StructPFMGCreate(comm, &struct_precond); HYPRE_StructPFMGSetMaxIter(struct_precond, 1); HYPRE_StructPFMGSetTol(struct_precond, 0.0); HYPRE_StructPFMGSetZeroGuess(struct_precond); HYPRE_StructPFMGSetRAPType(struct_precond, rap); HYPRE_StructPFMGSetRelaxType(struct_precond, relax); if (usr_jacobi_weight) { HYPRE_StructPFMGSetJacobiWeight(struct_precond, jacobi_weight); } HYPRE_StructPFMGSetNumPreRelax(struct_precond, n_pre); HYPRE_StructPFMGSetNumPostRelax(struct_precond, n_post); HYPRE_StructPFMGSetSkipRelax(struct_precond, skip); /*HYPRE_StructPFMGSetDxyz(struct_precond, dxyz);*/ HYPRE_StructPFMGSetPrintLevel(struct_precond, prec_print_level); HYPRE_StructPFMGSetLogging(struct_precond, 0); HYPRE_PCGSetPrecond( (HYPRE_Solver) struct_solver, (HYPRE_PtrToSolverFcn) HYPRE_StructPFMGSolve, (HYPRE_PtrToSolverFcn) HYPRE_StructPFMGSetup, (HYPRE_Solver) struct_precond); } else if (solver_id == 212) { /* use symmetric SparseMSG as preconditioner */ HYPRE_StructSparseMSGCreate(comm, &struct_precond); HYPRE_StructSparseMSGSetMaxIter(struct_precond, 1); HYPRE_StructSparseMSGSetJump(struct_precond, jump); HYPRE_StructSparseMSGSetTol(struct_precond, 0.0); HYPRE_StructSparseMSGSetZeroGuess(struct_precond); HYPRE_StructSparseMSGSetRelaxType(struct_precond, relax); if (usr_jacobi_weight) { HYPRE_StructSparseMSGSetJacobiWeight(struct_precond, jacobi_weight); } HYPRE_StructSparseMSGSetNumPreRelax(struct_precond, n_pre); HYPRE_StructSparseMSGSetNumPostRelax(struct_precond, n_post); HYPRE_StructSparseMSGSetPrintLevel(struct_precond, prec_print_level); HYPRE_StructSparseMSGSetLogging(struct_precond, 0); HYPRE_PCGSetPrecond( (HYPRE_Solver) struct_solver, (HYPRE_PtrToSolverFcn) HYPRE_StructSparseMSGSolve, (HYPRE_PtrToSolverFcn) HYPRE_StructSparseMSGSetup, (HYPRE_Solver) struct_precond); } else if (solver_id == 217) { /* use two-step Jacobi as preconditioner */ HYPRE_StructJacobiCreate(comm, &struct_precond); HYPRE_StructJacobiSetMaxIter(struct_precond, 2); HYPRE_StructJacobiSetTol(struct_precond, 0.0); HYPRE_StructJacobiSetZeroGuess(struct_precond); HYPRE_PCGSetPrecond( (HYPRE_Solver) struct_solver, (HYPRE_PtrToSolverFcn) HYPRE_StructJacobiSolve, (HYPRE_PtrToSolverFcn) HYPRE_StructJacobiSetup, (HYPRE_Solver) struct_precond); } else if (solver_id == 218) { /* use diagonal scaling as preconditioner */ struct_precond = NULL; HYPRE_PCGSetPrecond( (HYPRE_Solver) struct_solver, (HYPRE_PtrToSolverFcn) HYPRE_StructDiagScale, (HYPRE_PtrToSolverFcn) HYPRE_StructDiagScaleSetup, (HYPRE_Solver) struct_precond); } HYPRE_PCGSetup ( (HYPRE_Solver)struct_solver, (HYPRE_Matrix)sA, (HYPRE_Vector)sb, (HYPRE_Vector)sx ); hypre_EndTiming(time_index); hypre_PrintTiming("Setup phase times", comm); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); time_index = hypre_InitializeTiming("PCG Solve"); hypre_BeginTiming(time_index); HYPRE_PCGSolve ( (HYPRE_Solver) struct_solver, (HYPRE_Matrix)sA, (HYPRE_Vector)sb, (HYPRE_Vector)sx); hypre_EndTiming(time_index); hypre_PrintTiming("Solve phase times", comm); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); HYPRE_PCGGetNumIterations( (HYPRE_Solver)struct_solver, &num_iterations ); HYPRE_PCGGetFinalRelativeResidualNorm( (HYPRE_Solver)struct_solver, &final_res_norm ); HYPRE_StructPCGDestroy(struct_solver); if (solver_id == 210) { HYPRE_StructSMGDestroy(struct_precond); } else if (solver_id == 211) { HYPRE_StructPFMGDestroy(struct_precond); } else if (solver_id == 212) { HYPRE_StructSparseMSGDestroy(struct_precond); } else if (solver_id == 217) { HYPRE_StructJacobiDestroy(struct_precond); } } /*----------------------------------------------------------- * Solve the system using Hybrid *-----------------------------------------------------------*/ if ((solver_id > 219) && (solver_id < 230)) { time_index = hypre_InitializeTiming("Hybrid Setup"); hypre_BeginTiming(time_index); HYPRE_StructHybridCreate(comm, &struct_solver); HYPRE_StructHybridSetDSCGMaxIter(struct_solver, 100); HYPRE_StructHybridSetPCGMaxIter(struct_solver, 100); HYPRE_StructHybridSetTol(struct_solver, tol); /*HYPRE_StructHybridSetPCGAbsoluteTolFactor(struct_solver, 1.0e-200);*/ HYPRE_StructHybridSetConvergenceTol(struct_solver, cf_tol); HYPRE_StructHybridSetTwoNorm(struct_solver, 1); HYPRE_StructHybridSetRelChange(struct_solver, 0); if (solver_type == 2) /* for use with GMRES */ { HYPRE_StructHybridSetStopCrit(struct_solver, 0); HYPRE_StructHybridSetKDim(struct_solver, 10); } HYPRE_StructHybridSetPrintLevel(struct_solver, solver_print_level); HYPRE_StructHybridSetLogging(struct_solver, 1); HYPRE_StructHybridSetSolverType(struct_solver, solver_type); HYPRE_StructHybridSetRecomputeResidual(struct_solver, recompute_res); if (solver_id == 220) { /* use symmetric SMG as preconditioner */ HYPRE_StructSMGCreate(comm, &struct_precond); HYPRE_StructSMGSetMemoryUse(struct_precond, 0); HYPRE_StructSMGSetMaxIter(struct_precond, 1); HYPRE_StructSMGSetTol(struct_precond, 0.0); HYPRE_StructSMGSetZeroGuess(struct_precond); HYPRE_StructSMGSetNumPreRelax(struct_precond, n_pre); HYPRE_StructSMGSetNumPostRelax(struct_precond, n_post); HYPRE_StructSMGSetPrintLevel(struct_precond, prec_print_level); HYPRE_StructSMGSetLogging(struct_precond, 0); HYPRE_StructHybridSetPrecond(struct_solver, HYPRE_StructSMGSolve, HYPRE_StructSMGSetup, struct_precond); } else if (solver_id == 221) { /* use symmetric PFMG as preconditioner */ HYPRE_StructPFMGCreate(comm, &struct_precond); HYPRE_StructPFMGSetMaxIter(struct_precond, 1); HYPRE_StructPFMGSetTol(struct_precond, 0.0); HYPRE_StructPFMGSetZeroGuess(struct_precond); HYPRE_StructPFMGSetRAPType(struct_precond, rap); HYPRE_StructPFMGSetRelaxType(struct_precond, relax); if (usr_jacobi_weight) { HYPRE_StructPFMGSetJacobiWeight(struct_precond, jacobi_weight); } HYPRE_StructPFMGSetNumPreRelax(struct_precond, n_pre); HYPRE_StructPFMGSetNumPostRelax(struct_precond, n_post); HYPRE_StructPFMGSetSkipRelax(struct_precond, skip); /*HYPRE_StructPFMGSetDxyz(struct_precond, dxyz);*/ HYPRE_StructPFMGSetPrintLevel(struct_precond, prec_print_level); HYPRE_StructPFMGSetLogging(struct_precond, 0); HYPRE_StructHybridSetPrecond(struct_solver, HYPRE_StructPFMGSolve, HYPRE_StructPFMGSetup, struct_precond); } else if (solver_id == 222) { /* use symmetric SparseMSG as preconditioner */ HYPRE_StructSparseMSGCreate(comm, &struct_precond); HYPRE_StructSparseMSGSetJump(struct_precond, jump); HYPRE_StructSparseMSGSetMaxIter(struct_precond, 1); HYPRE_StructSparseMSGSetTol(struct_precond, 0.0); HYPRE_StructSparseMSGSetZeroGuess(struct_precond); HYPRE_StructSparseMSGSetRelaxType(struct_precond, relax); if (usr_jacobi_weight) { HYPRE_StructSparseMSGSetJacobiWeight(struct_precond, jacobi_weight); } HYPRE_StructSparseMSGSetNumPreRelax(struct_precond, n_pre); HYPRE_StructSparseMSGSetNumPostRelax(struct_precond, n_post); HYPRE_StructSparseMSGSetPrintLevel(struct_precond, prec_print_level); HYPRE_StructSparseMSGSetLogging(struct_precond, 0); HYPRE_StructHybridSetPrecond(struct_solver, HYPRE_StructSparseMSGSolve, HYPRE_StructSparseMSGSetup, struct_precond); } HYPRE_StructHybridSetup(struct_solver, sA, sb, sx); hypre_EndTiming(time_index); hypre_PrintTiming("Setup phase times", comm); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); time_index = hypre_InitializeTiming("Hybrid Solve"); hypre_BeginTiming(time_index); HYPRE_StructHybridSolve(struct_solver, sA, sb, sx); hypre_EndTiming(time_index); hypre_PrintTiming("Solve phase times", comm); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); HYPRE_StructHybridGetNumIterations(struct_solver, &num_iterations); HYPRE_StructHybridGetFinalRelativeResidualNorm(struct_solver, &final_res_norm); HYPRE_StructHybridDestroy(struct_solver); if (solver_id == 220) { HYPRE_StructSMGDestroy(struct_precond); } else if (solver_id == 221) { HYPRE_StructPFMGDestroy(struct_precond); } else if (solver_id == 222) { HYPRE_StructSparseMSGDestroy(struct_precond); } } /*----------------------------------------------------------- * Solve the system using GMRES *-----------------------------------------------------------*/ if ((solver_id > 229) && (solver_id < 240)) { time_index = hypre_InitializeTiming("GMRES Setup"); hypre_BeginTiming(time_index); HYPRE_StructGMRESCreate(comm, &struct_solver); HYPRE_GMRESSetMaxIter( (HYPRE_Solver)struct_solver, 100 ); HYPRE_GMRESSetTol( (HYPRE_Solver)struct_solver, tol ); HYPRE_GMRESSetRelChange( (HYPRE_Solver)struct_solver, 0 ); HYPRE_GMRESSetPrintLevel( (HYPRE_Solver)struct_solver, solver_print_level ); HYPRE_GMRESSetLogging( (HYPRE_Solver)struct_solver, 1 ); if (solver_id == 230) { /* use symmetric SMG as preconditioner */ HYPRE_StructSMGCreate(comm, &struct_precond); HYPRE_StructSMGSetMemoryUse(struct_precond, 0); HYPRE_StructSMGSetMaxIter(struct_precond, 1); HYPRE_StructSMGSetTol(struct_precond, 0.0); HYPRE_StructSMGSetZeroGuess(struct_precond); HYPRE_StructSMGSetNumPreRelax(struct_precond, n_pre); HYPRE_StructSMGSetNumPostRelax(struct_precond, n_post); HYPRE_StructSMGSetPrintLevel(struct_precond, prec_print_level); HYPRE_StructSMGSetLogging(struct_precond, 0); HYPRE_GMRESSetPrecond( (HYPRE_Solver)struct_solver, (HYPRE_PtrToSolverFcn) HYPRE_StructSMGSolve, (HYPRE_PtrToSolverFcn) HYPRE_StructSMGSetup, (HYPRE_Solver)struct_precond); } else if (solver_id == 231) { /* use symmetric PFMG as preconditioner */ HYPRE_StructPFMGCreate(comm, &struct_precond); HYPRE_StructPFMGSetMaxIter(struct_precond, 1); HYPRE_StructPFMGSetTol(struct_precond, 0.0); HYPRE_StructPFMGSetZeroGuess(struct_precond); HYPRE_StructPFMGSetRAPType(struct_precond, rap); HYPRE_StructPFMGSetRelaxType(struct_precond, relax); if (usr_jacobi_weight) { HYPRE_StructPFMGSetJacobiWeight(struct_precond, jacobi_weight); } HYPRE_StructPFMGSetNumPreRelax(struct_precond, n_pre); HYPRE_StructPFMGSetNumPostRelax(struct_precond, n_post); HYPRE_StructPFMGSetSkipRelax(struct_precond, skip); /*HYPRE_StructPFMGSetDxyz(struct_precond, dxyz);*/ HYPRE_StructPFMGSetPrintLevel(struct_precond, prec_print_level); HYPRE_StructPFMGSetLogging(struct_precond, 0); HYPRE_GMRESSetPrecond( (HYPRE_Solver)struct_solver, (HYPRE_PtrToSolverFcn) HYPRE_StructPFMGSolve, (HYPRE_PtrToSolverFcn) HYPRE_StructPFMGSetup, (HYPRE_Solver)struct_precond); } else if (solver_id == 232) { /* use symmetric SparseMSG as preconditioner */ HYPRE_StructSparseMSGCreate(comm, &struct_precond); HYPRE_StructSparseMSGSetMaxIter(struct_precond, 1); HYPRE_StructSparseMSGSetJump(struct_precond, jump); HYPRE_StructSparseMSGSetTol(struct_precond, 0.0); HYPRE_StructSparseMSGSetZeroGuess(struct_precond); HYPRE_StructSparseMSGSetRelaxType(struct_precond, relax); if (usr_jacobi_weight) { HYPRE_StructSparseMSGSetJacobiWeight(struct_precond, jacobi_weight); } HYPRE_StructSparseMSGSetNumPreRelax(struct_precond, n_pre); HYPRE_StructSparseMSGSetNumPostRelax(struct_precond, n_post); HYPRE_StructSparseMSGSetPrintLevel(struct_precond, prec_print_level); HYPRE_StructSparseMSGSetLogging(struct_precond, 0); HYPRE_GMRESSetPrecond( (HYPRE_Solver)struct_solver, (HYPRE_PtrToSolverFcn) HYPRE_StructSparseMSGSolve, (HYPRE_PtrToSolverFcn) HYPRE_StructSparseMSGSetup, (HYPRE_Solver)struct_precond); } else if (solver_id == 237) { /* use two-step Jacobi as preconditioner */ HYPRE_StructJacobiCreate(comm, &struct_precond); HYPRE_StructJacobiSetMaxIter(struct_precond, 2); HYPRE_StructJacobiSetTol(struct_precond, 0.0); HYPRE_StructJacobiSetZeroGuess(struct_precond); HYPRE_GMRESSetPrecond( (HYPRE_Solver)struct_solver, (HYPRE_PtrToSolverFcn) HYPRE_StructJacobiSolve, (HYPRE_PtrToSolverFcn) HYPRE_StructJacobiSetup, (HYPRE_Solver)struct_precond); } else if (solver_id == 238) { /* use diagonal scaling as preconditioner */ struct_precond = NULL; HYPRE_GMRESSetPrecond( (HYPRE_Solver)struct_solver, (HYPRE_PtrToSolverFcn) HYPRE_StructDiagScale, (HYPRE_PtrToSolverFcn) HYPRE_StructDiagScaleSetup, (HYPRE_Solver)struct_precond); } HYPRE_GMRESSetup ( (HYPRE_Solver)struct_solver, (HYPRE_Matrix)sA, (HYPRE_Vector)sb, (HYPRE_Vector)sx ); hypre_EndTiming(time_index); hypre_PrintTiming("Setup phase times", comm); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); time_index = hypre_InitializeTiming("GMRES Solve"); hypre_BeginTiming(time_index); HYPRE_GMRESSolve ( (HYPRE_Solver)struct_solver, (HYPRE_Matrix)sA, (HYPRE_Vector)sb, (HYPRE_Vector)sx); hypre_EndTiming(time_index); hypre_PrintTiming("Solve phase times", comm); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); HYPRE_GMRESGetNumIterations( (HYPRE_Solver)struct_solver, &num_iterations); HYPRE_GMRESGetFinalRelativeResidualNorm( (HYPRE_Solver)struct_solver, &final_res_norm); HYPRE_StructGMRESDestroy(struct_solver); if (solver_id == 230) { HYPRE_StructSMGDestroy(struct_precond); } else if (solver_id == 231) { HYPRE_StructPFMGDestroy(struct_precond); } else if (solver_id == 232) { HYPRE_StructSparseMSGDestroy(struct_precond); } else if (solver_id == 237) { HYPRE_StructJacobiDestroy(struct_precond); } } /*----------------------------------------------------------- * Solve the system using BiCGTAB *-----------------------------------------------------------*/ if ((solver_id > 239) && (solver_id < 250)) { time_index = hypre_InitializeTiming("BiCGSTAB Setup"); hypre_BeginTiming(time_index); HYPRE_StructBiCGSTABCreate(comm, &struct_solver); HYPRE_BiCGSTABSetMaxIter( (HYPRE_Solver)struct_solver, 100 ); HYPRE_BiCGSTABSetTol( (HYPRE_Solver)struct_solver, tol ); HYPRE_BiCGSTABSetPrintLevel( (HYPRE_Solver)struct_solver, solver_print_level ); HYPRE_BiCGSTABSetLogging( (HYPRE_Solver)struct_solver, 1 ); if (solver_id == 240) { /* use symmetric SMG as preconditioner */ HYPRE_StructSMGCreate(comm, &struct_precond); HYPRE_StructSMGSetMemoryUse(struct_precond, 0); HYPRE_StructSMGSetMaxIter(struct_precond, 1); HYPRE_StructSMGSetTol(struct_precond, 0.0); HYPRE_StructSMGSetZeroGuess(struct_precond); HYPRE_StructSMGSetNumPreRelax(struct_precond, n_pre); HYPRE_StructSMGSetNumPostRelax(struct_precond, n_post); HYPRE_StructSMGSetPrintLevel(struct_precond, prec_print_level); HYPRE_StructSMGSetLogging(struct_precond, 0); HYPRE_BiCGSTABSetPrecond( (HYPRE_Solver)struct_solver, (HYPRE_PtrToSolverFcn) HYPRE_StructSMGSolve, (HYPRE_PtrToSolverFcn) HYPRE_StructSMGSetup, (HYPRE_Solver)struct_precond); } else if (solver_id == 241) { /* use symmetric PFMG as preconditioner */ HYPRE_StructPFMGCreate(comm, &struct_precond); HYPRE_StructPFMGSetMaxIter(struct_precond, 1); HYPRE_StructPFMGSetTol(struct_precond, 0.0); HYPRE_StructPFMGSetZeroGuess(struct_precond); HYPRE_StructPFMGSetRAPType(struct_precond, rap); HYPRE_StructPFMGSetRelaxType(struct_precond, relax); if (usr_jacobi_weight) { HYPRE_StructPFMGSetJacobiWeight(struct_precond, jacobi_weight); } HYPRE_StructPFMGSetNumPreRelax(struct_precond, n_pre); HYPRE_StructPFMGSetNumPostRelax(struct_precond, n_post); HYPRE_StructPFMGSetSkipRelax(struct_precond, skip); /*HYPRE_StructPFMGSetDxyz(struct_precond, dxyz);*/ HYPRE_StructPFMGSetPrintLevel(struct_precond, prec_print_level); HYPRE_StructPFMGSetLogging(struct_precond, 0); HYPRE_BiCGSTABSetPrecond( (HYPRE_Solver)struct_solver, (HYPRE_PtrToSolverFcn) HYPRE_StructPFMGSolve, (HYPRE_PtrToSolverFcn) HYPRE_StructPFMGSetup, (HYPRE_Solver)struct_precond); } else if (solver_id == 242) { /* use symmetric SparseMSG as preconditioner */ HYPRE_StructSparseMSGCreate(comm, &struct_precond); HYPRE_StructSparseMSGSetMaxIter(struct_precond, 1); HYPRE_StructSparseMSGSetJump(struct_precond, jump); HYPRE_StructSparseMSGSetTol(struct_precond, 0.0); HYPRE_StructSparseMSGSetZeroGuess(struct_precond); HYPRE_StructSparseMSGSetRelaxType(struct_precond, relax); if (usr_jacobi_weight) { HYPRE_StructSparseMSGSetJacobiWeight(struct_precond, jacobi_weight); } HYPRE_StructSparseMSGSetNumPreRelax(struct_precond, n_pre); HYPRE_StructSparseMSGSetNumPostRelax(struct_precond, n_post); HYPRE_StructSparseMSGSetPrintLevel(struct_precond, prec_print_level); HYPRE_StructSparseMSGSetLogging(struct_precond, 0); HYPRE_BiCGSTABSetPrecond( (HYPRE_Solver)struct_solver, (HYPRE_PtrToSolverFcn) HYPRE_StructSparseMSGSolve, (HYPRE_PtrToSolverFcn) HYPRE_StructSparseMSGSetup, (HYPRE_Solver)struct_precond); } else if (solver_id == 247) { /* use two-step Jacobi as preconditioner */ HYPRE_StructJacobiCreate(comm, &struct_precond); HYPRE_StructJacobiSetMaxIter(struct_precond, 2); HYPRE_StructJacobiSetTol(struct_precond, 0.0); HYPRE_StructJacobiSetZeroGuess(struct_precond); HYPRE_BiCGSTABSetPrecond( (HYPRE_Solver)struct_solver, (HYPRE_PtrToSolverFcn) HYPRE_StructJacobiSolve, (HYPRE_PtrToSolverFcn) HYPRE_StructJacobiSetup, (HYPRE_Solver)struct_precond); } else if (solver_id == 248) { /* use diagonal scaling as preconditioner */ struct_precond = NULL; HYPRE_BiCGSTABSetPrecond( (HYPRE_Solver)struct_solver, (HYPRE_PtrToSolverFcn) HYPRE_StructDiagScale, (HYPRE_PtrToSolverFcn) HYPRE_StructDiagScaleSetup, (HYPRE_Solver)struct_precond); } HYPRE_BiCGSTABSetup ( (HYPRE_Solver)struct_solver, (HYPRE_Matrix)sA, (HYPRE_Vector)sb, (HYPRE_Vector)sx ); hypre_EndTiming(time_index); hypre_PrintTiming("Setup phase times", comm); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); time_index = hypre_InitializeTiming("BiCGSTAB Solve"); hypre_BeginTiming(time_index); HYPRE_BiCGSTABSolve ( (HYPRE_Solver)struct_solver, (HYPRE_Matrix)sA, (HYPRE_Vector)sb, (HYPRE_Vector)sx); hypre_EndTiming(time_index); hypre_PrintTiming("Solve phase times", comm); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); HYPRE_BiCGSTABGetNumIterations( (HYPRE_Solver)struct_solver, &num_iterations); HYPRE_BiCGSTABGetFinalRelativeResidualNorm( (HYPRE_Solver)struct_solver, &final_res_norm); HYPRE_StructBiCGSTABDestroy(struct_solver); if (solver_id == 240) { HYPRE_StructSMGDestroy(struct_precond); } else if (solver_id == 241) { HYPRE_StructPFMGDestroy(struct_precond); } else if (solver_id == 242) { HYPRE_StructSparseMSGDestroy(struct_precond); } else if (solver_id == 247) { HYPRE_StructJacobiDestroy(struct_precond); } } /*----------------------------------------------------------- * Gather the solution vector *-----------------------------------------------------------*/ HYPRE_SStructVectorGather(x); /*----------------------------------------------------------- * Print the solution and other info *-----------------------------------------------------------*/ if (print_system) { FILE *file; char filename[255]; HYPRE_SStructVectorPrint("sstruct.out.x", x, 0); /* print out with shared data replicated */ if (!read_fromfile_flag) { values = hypre_TAlloc(HYPRE_Real, data.max_boxsize, HYPRE_MEMORY_HOST); d_values = hypre_TAlloc(HYPRE_Real, data.max_boxsize, memory_location); for (part = 0; part < data.nparts; part++) { pdata = data.pdata[part]; for (var = 0; var < pdata.nvars; var++) { hypre_sprintf(filename, "sstruct.out.xx.%02d.%02d.%05d", part, var, myid); if ((file = fopen(filename, "w")) == NULL) { hypre_printf("Error: can't open output file %s\n", filename); exit(1); } for (box = 0; box < pdata.nboxes; box++) { GetVariableBox(pdata.ilowers[box], pdata.iuppers[box], pdata.vartypes[var], ilower, iupper); HYPRE_SStructVectorGetBoxValues(x, part, ilower, iupper, var, d_values); hypre_TMemcpy(values, d_values, HYPRE_Real, data.max_boxsize, HYPRE_MEMORY_HOST, memory_location); hypre_fprintf(file, "\nBox %d:\n\n", box); size = 1; for (j = 0; j < data.ndim; j++) { size *= (iupper[j] - ilower[j] + 1); } for (j = 0; j < size; j++) { hypre_fprintf(file, "%.14e\n", values[j]); } } fflush(file); fclose(file); } } hypre_TFree(values, HYPRE_MEMORY_HOST); hypre_TFree(d_values, memory_location); } } if (myid == 0 && rep == repeats - 1 /* begin lobpcg */ && !lobpcgFlag /* end lobpcg */) { hypre_printf("\n"); hypre_printf("Iterations = %d\n", num_iterations); hypre_printf("Final Relative Residual Norm = %e\n", final_res_norm); hypre_printf("\n"); } /*----------------------------------------------------------- * Verify GetBoxValues() *-----------------------------------------------------------*/ #if 0 { HYPRE_SStructVector xnew; HYPRE_ParVector par_xnew; HYPRE_StructVector sxnew; HYPRE_Real rnorm, bnorm; HYPRE_SStructVectorCreate(comm, grid, &xnew); HYPRE_SStructVectorSetObjectType(xnew, object_type); HYPRE_SStructVectorInitialize(xnew); /* get/set replicated shared data */ values = hypre_TAlloc(HYPRE_Real, data.max_boxsize, HYPRE_MEMORY_HOST); for (part = 0; part < data.nparts; part++) { pdata = data.pdata[part]; for (var = 0; var < pdata.nvars; var++) { for (box = 0; box < pdata.nboxes; box++) { GetVariableBox(pdata.ilowers[box], pdata.iuppers[box], pdata.vartypes[var], ilower, iupper); HYPRE_SStructVectorGetBoxValues(x, part, ilower, iupper, var, values); HYPRE_SStructVectorSetBoxValues(xnew, part, ilower, iupper, var, values); } } } hypre_TFree(values, HYPRE_MEMORY_HOST); HYPRE_SStructVectorAssemble(xnew); /* Compute residual norm - this if/else is due to a bug in SStructMatvec */ if (object_type == HYPRE_SSTRUCT) { HYPRE_SStructInnerProd(b, b, &bnorm); hypre_SStructMatvec(-1.0, A, xnew, 1.0, b); HYPRE_SStructInnerProd(b, b, &rnorm); } else if (object_type == HYPRE_PARCSR) { bnorm = hypre_ParVectorInnerProd(par_b, par_b); HYPRE_SStructVectorGetObject(xnew, (void **) &par_xnew); HYPRE_ParCSRMatrixMatvec(-1.0, par_A, par_xnew, 1.0, par_b ); rnorm = hypre_ParVectorInnerProd(par_b, par_b); } else if (object_type == HYPRE_STRUCT) { bnorm = hypre_StructInnerProd(sb, sb); HYPRE_SStructVectorGetObject(xnew, (void **) &sxnew); hypre_StructMatvec(-1.0, sA, sxnew, 1.0, sb); rnorm = hypre_StructInnerProd(sb, sb); } bnorm = hypre_sqrt(bnorm); rnorm = hypre_sqrt(rnorm); if (myid == 0) { hypre_printf("\n"); hypre_printf("solver relnorm = %16.14e\n", final_res_norm); hypre_printf("check relnorm = %16.14e, bnorm = %16.14e, rnorm = %16.14e\n", (rnorm / bnorm), bnorm, rnorm); hypre_printf("\n"); } HYPRE_SStructVectorDestroy(xnew); } #endif /*----------------------------------------------------------- * Finalize things *-----------------------------------------------------------*/ HYPRE_SStructMatrixDestroy(A); HYPRE_SStructVectorDestroy(b); HYPRE_SStructVectorDestroy(x); if (gradient_matrix) { for (s = 0; s < data.ndim; s++) { HYPRE_SStructStencilDestroy(G_stencils[s]); } hypre_TFree(G_stencils, HYPRE_MEMORY_HOST); HYPRE_SStructGraphDestroy(G_graph); HYPRE_SStructGridDestroy(G_grid); HYPRE_SStructMatrixDestroy(G); } if (!read_fromfile_flag) { HYPRE_SStructGridDestroy(grid); HYPRE_SStructGraphDestroy(graph); for (s = 0; s < data.nstencils; s++) { HYPRE_SStructStencilDestroy(stencils[s]); } hypre_TFree(stencils, HYPRE_MEMORY_HOST); DestroyData(data); if (rep == repeats - 1) { hypre_TFree(parts, HYPRE_MEMORY_HOST); hypre_TFree(refine, HYPRE_MEMORY_HOST); hypre_TFree(distribute, HYPRE_MEMORY_HOST); hypre_TFree(block, HYPRE_MEMORY_HOST); } if (rep < repeats - 1) { ReadData(infile, &global_data); } } /*hypre_FinalizeMemoryDebug(); */ } /* Finalize Hypre */ HYPRE_Finalize(); /* Finalize MPI */ hypre_MPI_Finalize(); #if defined(HYPRE_USING_MEMORY_TRACKER) if (memory_location == HYPRE_MEMORY_HOST) { if (hypre_total_bytes[hypre_MEMORY_DEVICE] || hypre_total_bytes[hypre_MEMORY_UNIFIED]) { hypre_printf("Error: nonzero GPU memory allocated with the HOST mode\n"); hypre_assert(0); } } #endif return (0); } hypre-2.33.0/src/test/sstruct.in.README000066400000000000000000000112421477326011500174750ustar00rootroot00000000000000# Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) ############################################################################## # # This file describes the input file for the 'sstruct.c' driver. # # The input file is line-based. Any line beginning with a '#' character is # considered a comment and ignored by the driver. For all non-comment lines, # the driver checks the first string to see if it matches certain key words of # the form 'Keyword:'. These key words are usually followed by input data as # specified below. If the first string doesn't match any key words, the line is # ignored, so blank lines are allowed. # # The format for each keyword input line is described below. Each is followed # by a simple example # # More description here at a later date... # ############################################################################## # GridCreate: ndim nparts GridCreate: 2 2 ## GridSetNumGhost: numghost[2*ndim] #GridSetNumGhost: [3 3 3 3] # GridSetExtents: part ilower(ndim) iupper(ndim) GridSetExtents: 0 (0- 0-) (4+ 4+) # GridSetVariables: part nvars vartypes[nvars] # CELL = 0 # NODE = 1 # XFACE = 2 # YFACE = 3 # ZFACE = 4 # XEDGE = 5 # YEDGE = 6 # ZEDGE = 7 GridSetVariables: 0 1 [1] # GridAddVariables: part index(ndim) vartype # (Not yet implemented!) # GridSetNeighborPart: part ilower(ndim) iupper(ndim) \ # nbor_part nbor_ilower(ndim) nbor_iupper(ndim) \ # index_map[ndim] index_dir[ndim] GridSetNeighborPart: 0 (1- 3-) (4+ 3-) 1 (1- 1-) (4+ 1-) [0 1] [1 1] # GridSetSharedPart: part ilower(ndim) iupper(ndim) offset[ndim] \ # spart silower(ndim) siupper(ndim) soffset[ndim] \ # index_map[ndim] index_dir[ndim] GridSetSharedPart: 0 (1- 0+) (10+ 0+) [0 0] 4 (1- 1-) ( 1- 10+) [0 0] [1 0] [ 1 -1] # GridSetPeriodic: part periodic[ndim] GridSetPeriodic: 0 [5 0] ########################################################### # (note: Stencil and FEMStencil cannot be used together) # StencilCreate: nstencils sizes[nstencils] StencilCreate: 1 [5] # StencilSetEntry: stencil_num entry offset[ndim] var value StencilSetEntry: 0 0 [ 0 0] 0 4.0 StencilSetEntry: 0 1 [-1 0] 0 -1.0 StencilSetEntry: 0 2 [ 1 0] 0 -1.0 StencilSetEntry: 0 3 [ 0 -1] 0 -1.0 StencilSetEntry: 0 4 [ 0 1] 0 -1.0 # RhsSet: value RhsSet: 1.0 # FEMStencilCreate: size FEMStencilCreate: 4 # FEMStencilSetRow: row offset[ndim] var values[size] # (note: columns have the same ordering as rows) FEMStencilSetRow: 0 [-1 -1] 0 [ 1.0 -0.5 -0.5 0.0 ] FEMStencilSetRow: 1 [ 0 -1] 0 [ -0.5 1.0 0.0 -0.5 ] FEMStencilSetRow: 2 [-1 0] 0 [ -0.5 0.0 1.0 -0.5 ] FEMStencilSetRow: 3 [ 0 0] 0 [ 0.0 -0.5 -0.5 1.0 ] # FEMRhsSet: values[size] FEMRhsSet: [ 0.1 1.4 0.3 0.7 ] ########################################################### # GraphSetStencil: part var stencil_num GraphSetStencil: 0 0 0 # GraphAddEntries: \ # part ilower(ndim) iupper(ndim) stride[ndim] var \ # to_part to_ilower(ndim) to_iupper(ndim) to_stride[ndim] to_var \ # index_map[ndim] entry value # (note: this could be made to work with FEMStencil, but 'entry' needs to change) GraphAddEntries: 1 (6- 12- : -1 -1) (13+ 12- : 0 -1) [2 1] 0 0 (3- 5+ : -1 -1) (6+ 5+ : 0 -1) [1 1] 0 [0 1] 5 -1.0 ########################################################### # MatrixSetSymmetric: part var to_var symmetric # ('-1' means "all", e.g. "all parts") MatrixSetSymmetric: -1 -1 -1 1 # MatrixSetNSSymmetric: symmetric MatrixSetNSSymmetric: 1 # MatrixSetValues: \ # part ilower(ndim) iupper(ndim) stride[ndim] var entry value MatrixSetValues: 0 (1- 1-) (1- 2+) [1 1] 0 1 0.0 # MatrixAddToValues: \ # part ilower(ndim) iupper(ndim) var nentries entries[nentries] values[nentries] MatrixAddToValues: 0 (1- 1- 1-) (4+ 4+ 4+) 0 4 [0 1 2 3] [6.0 -1.0 -1.0 -1.0] # FEMMatrixAddToValues: \ # part ilower(ndim) iupper(ndim) nrows rows[nrows] ncols cols[ncols] \ # values[nrows*ncols] FEMMatrixAddToValues: 0 (0- 0-) (4+ 0-) 2 [0 1] 2 [0 1] [ 1.0 -0.5 -0.5 1.0 ] ########################################################### # RhsAddToValues: \ # part ilower(ndim) iupper(ndim) var value RhsAddToValues: 0 (1- 1- 1-) (4+ 4+ 4+) 0 -0.5 # FEMRhsAddToValues: \ # part ilower(ndim) iupper(ndim) values[size] # values[nrows*ncols] FEMRhsAddToValues: 0 (0- 0-) (4+ 0-) [ -0.1 -1.4 0.0 0.0 ] ########################################################### # ProcessPoolCreate: num_pools ProcessPoolCreate: 1 # ProcessPoolSetPart: pool part ProcessPoolSetPart: 0 0 ########################################################### hypre-2.33.0/src/test/sstruct_fac.c000066400000000000000000002436571477326011500172070ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include #include #include #include "_hypre_utilities.h" #include "HYPRE_sstruct_ls.h" #include "HYPRE_krylov.h" #include "_hypre_sstruct_mv.h" #include "_hypre_sstruct_ls.h" #define DEBUG 0 #if DEBUG #include "_hypre_sstruct_mv.h" #endif /*-------------------------------------------------------------------------- * Data structures *--------------------------------------------------------------------------*/ char infile_default[50] = "sstruct_default.in"; typedef HYPRE_Int Index[HYPRE_MAXDIM]; typedef HYPRE_Int ProblemIndex[9]; /* last 3 digits are shifts */ typedef struct { /* for GridSetExtents */ HYPRE_Int nboxes; ProblemIndex *ilowers; ProblemIndex *iuppers; HYPRE_Int *boxsizes; HYPRE_Int max_boxsize; /* for GridSetVariables */ HYPRE_Int nvars; HYPRE_SStructVariable *vartypes; /* for GridAddVariables */ HYPRE_Int add_nvars; ProblemIndex *add_indexes; HYPRE_SStructVariable *add_vartypes; /* for GridSetNeighborBox */ HYPRE_Int glue_nboxes; ProblemIndex *glue_ilowers; ProblemIndex *glue_iuppers; HYPRE_Int *glue_nbor_parts; ProblemIndex *glue_nbor_ilowers; ProblemIndex *glue_nbor_iuppers; Index *glue_index_maps; /* for GraphSetStencil */ HYPRE_Int *stencil_num; HYPRE_Int matrix_nentries; ProblemIndex *matrix_ilowers; ProblemIndex *matrix_iuppers; Index *matrix_strides; HYPRE_Int *matrix_vars; HYPRE_Int *matrix_entries; HYPRE_Real *matrix_values; Index periodic; /* for GraphAddEntries */ HYPRE_Int graph_nentries; ProblemIndex *graph_ilowers; ProblemIndex *graph_iuppers; Index *graph_strides; HYPRE_Int *graph_vars; HYPRE_Int *graph_to_parts; ProblemIndex *graph_to_ilowers; ProblemIndex *graph_to_iuppers; Index *graph_to_strides; HYPRE_Int *graph_to_vars; Index *graph_index_maps; Index *graph_index_signs; HYPRE_Int *graph_entries; HYPRE_Real *graph_values; HYPRE_Int *graph_boxsizes; HYPRE_Real **graph_fine_to_coarse_data; HYPRE_Real **graph_coarse_to_fine_data; /* for amr structure */ HYPRE_Int fac_plevel; Index fac_prefinement; } ProblemPartData; typedef struct { HYPRE_Int ndim; HYPRE_Int nparts; ProblemPartData *pdata; HYPRE_Int max_boxsize; HYPRE_Int nstencils; HYPRE_Int *stencil_sizes; Index **stencil_offsets; HYPRE_Int **stencil_vars; HYPRE_Real **stencil_values; HYPRE_Int npools; HYPRE_Int *pools; /* array of size nparts */ } ProblemData; /*-------------------------------------------------------------------------- * Compute new box based on variable type *--------------------------------------------------------------------------*/ HYPRE_Int GetVariableBox( Index cell_ilower, Index cell_iupper, HYPRE_Int vartype, Index var_ilower, Index var_iupper ) { HYPRE_Int ierr = 0; var_ilower[0] = cell_ilower[0]; var_ilower[1] = cell_ilower[1]; var_ilower[2] = cell_ilower[2]; var_iupper[0] = cell_iupper[0]; var_iupper[1] = cell_iupper[1]; var_iupper[2] = cell_iupper[2]; switch (vartype) { case HYPRE_SSTRUCT_VARIABLE_CELL: var_ilower[0] -= 0; var_ilower[1] -= 0; var_ilower[2] -= 0; break; case HYPRE_SSTRUCT_VARIABLE_NODE: var_ilower[0] -= 1; var_ilower[1] -= 1; var_ilower[2] -= 1; break; case HYPRE_SSTRUCT_VARIABLE_XFACE: var_ilower[0] -= 1; var_ilower[1] -= 0; var_ilower[2] -= 0; break; case HYPRE_SSTRUCT_VARIABLE_YFACE: var_ilower[0] -= 0; var_ilower[1] -= 1; var_ilower[2] -= 0; break; case HYPRE_SSTRUCT_VARIABLE_ZFACE: var_ilower[0] -= 0; var_ilower[1] -= 0; var_ilower[2] -= 1; break; case HYPRE_SSTRUCT_VARIABLE_XEDGE: var_ilower[0] -= 0; var_ilower[1] -= 1; var_ilower[2] -= 1; break; case HYPRE_SSTRUCT_VARIABLE_YEDGE: var_ilower[0] -= 1; var_ilower[1] -= 0; var_ilower[2] -= 1; break; case HYPRE_SSTRUCT_VARIABLE_ZEDGE: var_ilower[0] -= 1; var_ilower[1] -= 1; var_ilower[2] -= 0; break; case HYPRE_SSTRUCT_VARIABLE_UNDEFINED: break; } return ierr; } /*-------------------------------------------------------------------------- * Read routines *--------------------------------------------------------------------------*/ HYPRE_Int SScanIntArray( char *sdata_ptr, char **sdata_ptr_ptr, HYPRE_Int size, HYPRE_Int *array ) { HYPRE_Int i; sdata_ptr += strspn(sdata_ptr, " \t\n["); for (i = 0; i < size; i++) { array[i] = strtol(sdata_ptr, &sdata_ptr, 10); } sdata_ptr += strcspn(sdata_ptr, "]") + 1; *sdata_ptr_ptr = sdata_ptr; return 0; } HYPRE_Int SScanProblemIndex( char *sdata_ptr, char **sdata_ptr_ptr, HYPRE_Int ndim, ProblemIndex index ) { HYPRE_Int i; char sign[3]; /* initialize index array */ for (i = 0; i < 9; i++) { index[i] = 0; } sdata_ptr += strspn(sdata_ptr, " \t\n("); switch (ndim) { case 1: hypre_sscanf(sdata_ptr, "%d%c", &index[0], &sign[0]); break; case 2: hypre_sscanf(sdata_ptr, "%d%c%d%c", &index[0], &sign[0], &index[1], &sign[1]); break; case 3: hypre_sscanf(sdata_ptr, "%d%c%d%c%d%c", &index[0], &sign[0], &index[1], &sign[1], &index[2], &sign[2]); break; } sdata_ptr += strcspn(sdata_ptr, ":)"); if ( *sdata_ptr == ':' ) { /* read in optional shift */ sdata_ptr += 1; switch (ndim) { case 1: hypre_sscanf(sdata_ptr, "%d", &index[6]); break; case 2: hypre_sscanf(sdata_ptr, "%d%d", &index[6], &index[7]); break; case 3: hypre_sscanf(sdata_ptr, "%d%d%d", &index[6], &index[7], &index[8]); break; } /* pre-shift the index */ for (i = 0; i < ndim; i++) { index[i] += index[i + 6]; } } sdata_ptr += strcspn(sdata_ptr, ")") + 1; for (i = 0; i < ndim; i++) { if (sign[i] == '+') { index[i + 3] = 1; } } *sdata_ptr_ptr = sdata_ptr; return 0; } HYPRE_Int ReadData( char *filename, ProblemData *data_ptr ) { ProblemData data; ProblemPartData pdata; HYPRE_Int myid; FILE *file; char *sdata = NULL; char *sdata_line; char *sdata_ptr; HYPRE_Int sdata_size; HYPRE_Int size; HYPRE_Int memchunk = 10000; HYPRE_Int maxline = 250; char key[250]; HYPRE_Int part, var, entry, s, i; /*----------------------------------------------------------- * Read data file from process 0, then broadcast *-----------------------------------------------------------*/ hypre_MPI_Comm_rank(hypre_MPI_COMM_WORLD, &myid); if (myid == 0) { if ((file = fopen(filename, "r")) == NULL) { hypre_printf("Error: can't open input file %s\n", filename); exit(1); } /* allocate initial space, and read first input line */ sdata_size = 0; sdata = hypre_TAlloc(char, memchunk, HYPRE_MEMORY_HOST); sdata_line = fgets(sdata, maxline, file); s = memchunk; while (sdata_line != NULL) { sdata_size += strlen(sdata_line) + 1; /* allocate more space, if necessary */ if ((sdata_size + maxline) > s) { sdata = hypre_TReAlloc(sdata, char, (sdata_size + memchunk), HYPRE_MEMORY_HOST); s = sdata_size + memchunk; } /* read the next input line */ sdata_line = fgets((sdata + sdata_size), maxline, file); } } /* broadcast the data size */ hypre_MPI_Bcast(&sdata_size, 1, HYPRE_MPI_INT, 0, hypre_MPI_COMM_WORLD); /* broadcast the data */ sdata = hypre_TReAlloc(sdata, char, sdata_size, HYPRE_MEMORY_HOST); hypre_MPI_Bcast(sdata, sdata_size, hypre_MPI_CHAR, 0, hypre_MPI_COMM_WORLD); /*----------------------------------------------------------- * Parse the data and fill ProblemData structure *-----------------------------------------------------------*/ sdata_line = sdata; while (sdata_line < (sdata + sdata_size)) { sdata_ptr = sdata_line; if ( ( hypre_sscanf(sdata_ptr, "%s", key) > 0 ) && ( sdata_ptr[0] != '#' ) ) { sdata_ptr += strcspn(sdata_ptr, " \t\n"); if ( strcmp(key, "GridCreate:") == 0 ) { data.ndim = strtol(sdata_ptr, &sdata_ptr, 10); data.nparts = strtol(sdata_ptr, &sdata_ptr, 10); data.pdata = hypre_CTAlloc(ProblemPartData, data.nparts, HYPRE_MEMORY_HOST); } else if ( strcmp(key, "GridSetExtents:") == 0 ) { part = strtol(sdata_ptr, &sdata_ptr, 10); pdata = data.pdata[part]; if ((pdata.nboxes % 10) == 0) { size = pdata.nboxes + 10; pdata.ilowers = hypre_TReAlloc(pdata.ilowers, ProblemIndex, size, HYPRE_MEMORY_HOST); pdata.iuppers = hypre_TReAlloc(pdata.iuppers, ProblemIndex, size, HYPRE_MEMORY_HOST); pdata.boxsizes = hypre_TReAlloc(pdata.boxsizes, HYPRE_Int, size, HYPRE_MEMORY_HOST); } SScanProblemIndex(sdata_ptr, &sdata_ptr, data.ndim, pdata.ilowers[pdata.nboxes]); SScanProblemIndex(sdata_ptr, &sdata_ptr, data.ndim, pdata.iuppers[pdata.nboxes]); if ( (pdata.ilowers[pdata.nboxes][3]* pdata.ilowers[pdata.nboxes][4]* pdata.ilowers[pdata.nboxes][5] != 0) || (pdata.iuppers[pdata.nboxes][3]* pdata.iuppers[pdata.nboxes][4]* pdata.iuppers[pdata.nboxes][5] != 1) ) { hypre_printf("Error: Invalid use of `+-' in GridSetExtents\n"); exit(1); } pdata.boxsizes[pdata.nboxes] = 1; for (i = 0; i < 3; i++) { pdata.boxsizes[pdata.nboxes] *= (pdata.iuppers[pdata.nboxes][i] - pdata.ilowers[pdata.nboxes][i] + 2); } pdata.max_boxsize = hypre_max(pdata.max_boxsize, pdata.boxsizes[pdata.nboxes]); pdata.nboxes++; data.pdata[part] = pdata; } else if ( strcmp(key, "GridSetVariables:") == 0 ) { part = strtol(sdata_ptr, &sdata_ptr, 10); pdata = data.pdata[part]; pdata.nvars = strtol(sdata_ptr, &sdata_ptr, 10); pdata.vartypes = hypre_CTAlloc(HYPRE_SStructVariable, pdata.nvars, HYPRE_MEMORY_HOST); SScanIntArray(sdata_ptr, &sdata_ptr, pdata.nvars, pdata.vartypes); data.pdata[part] = pdata; } else if ( strcmp(key, "GridAddVariables:") == 0 ) { /* TODO */ hypre_printf("GridAddVariables not yet implemented!\n"); exit(1); } else if ( strcmp(key, "GridSetNeighborBox:") == 0 ) { part = strtol(sdata_ptr, &sdata_ptr, 10); pdata = data.pdata[part]; if ((pdata.glue_nboxes % 10) == 0) { size = pdata.glue_nboxes + 10; pdata.glue_ilowers = hypre_TReAlloc(pdata.glue_ilowers, ProblemIndex, size, HYPRE_MEMORY_HOST); pdata.glue_iuppers = hypre_TReAlloc(pdata.glue_iuppers, ProblemIndex, size, HYPRE_MEMORY_HOST); pdata.glue_nbor_parts = hypre_TReAlloc(pdata.glue_nbor_parts, HYPRE_Int, size, HYPRE_MEMORY_HOST); pdata.glue_nbor_ilowers = hypre_TReAlloc(pdata.glue_nbor_ilowers, ProblemIndex, size, HYPRE_MEMORY_HOST); pdata.glue_nbor_iuppers = hypre_TReAlloc(pdata.glue_nbor_iuppers, ProblemIndex, size, HYPRE_MEMORY_HOST); pdata.glue_index_maps = hypre_TReAlloc(pdata.glue_index_maps, Index, size, HYPRE_MEMORY_HOST); } SScanProblemIndex(sdata_ptr, &sdata_ptr, data.ndim, pdata.glue_ilowers[pdata.glue_nboxes]); SScanProblemIndex(sdata_ptr, &sdata_ptr, data.ndim, pdata.glue_iuppers[pdata.glue_nboxes]); pdata.glue_nbor_parts[pdata.glue_nboxes] = strtol(sdata_ptr, &sdata_ptr, 10); SScanProblemIndex(sdata_ptr, &sdata_ptr, data.ndim, pdata.glue_nbor_ilowers[pdata.glue_nboxes]); SScanProblemIndex(sdata_ptr, &sdata_ptr, data.ndim, pdata.glue_nbor_iuppers[pdata.glue_nboxes]); SScanIntArray(sdata_ptr, &sdata_ptr, data.ndim, pdata.glue_index_maps[pdata.glue_nboxes]); pdata.glue_nboxes++; data.pdata[part] = pdata; } else if ( strcmp(key, "GridSetPeriodic:") == 0 ) { part = strtol(sdata_ptr, &sdata_ptr, 10); pdata = data.pdata[part]; SScanIntArray(sdata_ptr, &sdata_ptr, data.ndim, pdata.periodic); data.pdata[part] = pdata; } else if ( strcmp(key, "StencilCreate:") == 0 ) { data.nstencils = strtol(sdata_ptr, &sdata_ptr, 10); data.stencil_sizes = hypre_CTAlloc(HYPRE_Int, data.nstencils, HYPRE_MEMORY_HOST); data.stencil_offsets = hypre_CTAlloc(Index *, data.nstencils, HYPRE_MEMORY_HOST); data.stencil_vars = hypre_CTAlloc(HYPRE_Int *, data.nstencils, HYPRE_MEMORY_HOST); data.stencil_values = hypre_CTAlloc(HYPRE_Real *, data.nstencils, HYPRE_MEMORY_HOST); SScanIntArray(sdata_ptr, &sdata_ptr, data.nstencils, data.stencil_sizes); for (s = 0; s < data.nstencils; s++) { data.stencil_offsets[s] = hypre_CTAlloc(Index, data.stencil_sizes[s], HYPRE_MEMORY_HOST); data.stencil_vars[s] = hypre_CTAlloc(HYPRE_Int, data.stencil_sizes[s], HYPRE_MEMORY_HOST); data.stencil_values[s] = hypre_CTAlloc(HYPRE_Real, data.stencil_sizes[s], HYPRE_MEMORY_HOST); } } else if ( strcmp(key, "StencilSetEntry:") == 0 ) { s = strtol(sdata_ptr, &sdata_ptr, 10); entry = strtol(sdata_ptr, &sdata_ptr, 10); SScanIntArray(sdata_ptr, &sdata_ptr, data.ndim, data.stencil_offsets[s][entry]); data.stencil_vars[s][entry] = strtol(sdata_ptr, &sdata_ptr, 10); data.stencil_values[s][entry] = (HYPRE_Real)strtod(sdata_ptr, &sdata_ptr); } else if ( strcmp(key, "GraphSetStencil:") == 0 ) { part = strtol(sdata_ptr, &sdata_ptr, 10); var = strtol(sdata_ptr, &sdata_ptr, 10); s = strtol(sdata_ptr, &sdata_ptr, 10); pdata = data.pdata[part]; if (pdata.stencil_num == NULL) { pdata.stencil_num = hypre_CTAlloc(HYPRE_Int, pdata.nvars, HYPRE_MEMORY_HOST); } pdata.stencil_num[var] = s; data.pdata[part] = pdata; } else if ( strcmp(key, "GraphAddEntries:") == 0 ) { part = strtol(sdata_ptr, &sdata_ptr, 10); pdata = data.pdata[part]; if ((pdata.graph_nentries % 10) == 0) { size = pdata.graph_nentries + 10; pdata.graph_ilowers = hypre_TReAlloc(pdata.graph_ilowers, ProblemIndex, size, HYPRE_MEMORY_HOST); pdata.graph_iuppers = hypre_TReAlloc(pdata.graph_iuppers, ProblemIndex, size, HYPRE_MEMORY_HOST); pdata.graph_strides = hypre_TReAlloc(pdata.graph_strides, Index, size, HYPRE_MEMORY_HOST); pdata.graph_vars = hypre_TReAlloc(pdata.graph_vars, HYPRE_Int, size, HYPRE_MEMORY_HOST); pdata.graph_to_parts = hypre_TReAlloc(pdata.graph_to_parts, HYPRE_Int, size, HYPRE_MEMORY_HOST); pdata.graph_to_ilowers = hypre_TReAlloc(pdata.graph_to_ilowers, ProblemIndex, size, HYPRE_MEMORY_HOST); pdata.graph_to_iuppers = hypre_TReAlloc(pdata.graph_to_iuppers, ProblemIndex, size, HYPRE_MEMORY_HOST); pdata.graph_to_strides = hypre_TReAlloc(pdata.graph_to_strides, Index, size, HYPRE_MEMORY_HOST); pdata.graph_to_vars = hypre_TReAlloc(pdata.graph_to_vars, HYPRE_Int, size, HYPRE_MEMORY_HOST); pdata.graph_index_maps = hypre_TReAlloc(pdata.graph_index_maps, Index, size, HYPRE_MEMORY_HOST); pdata.graph_index_signs = hypre_TReAlloc(pdata.graph_index_signs, Index, size, HYPRE_MEMORY_HOST); pdata.graph_entries = hypre_TReAlloc(pdata.graph_entries, HYPRE_Int, size, HYPRE_MEMORY_HOST); pdata.graph_values = hypre_TReAlloc(pdata.graph_values, HYPRE_Real, size, HYPRE_MEMORY_HOST); pdata.graph_boxsizes = hypre_TReAlloc(pdata.graph_boxsizes, HYPRE_Int, size, HYPRE_MEMORY_HOST); } SScanProblemIndex(sdata_ptr, &sdata_ptr, data.ndim, pdata.graph_ilowers[pdata.graph_nentries]); SScanProblemIndex(sdata_ptr, &sdata_ptr, data.ndim, pdata.graph_iuppers[pdata.graph_nentries]); SScanIntArray(sdata_ptr, &sdata_ptr, data.ndim, pdata.graph_strides[pdata.graph_nentries]); for (i = data.ndim; i < 3; i++) { pdata.graph_strides[pdata.graph_nentries][i] = 1; } pdata.graph_vars[pdata.graph_nentries] = strtol(sdata_ptr, &sdata_ptr, 10); pdata.graph_to_parts[pdata.graph_nentries] = strtol(sdata_ptr, &sdata_ptr, 10); SScanProblemIndex(sdata_ptr, &sdata_ptr, data.ndim, pdata.graph_to_ilowers[pdata.graph_nentries]); SScanProblemIndex(sdata_ptr, &sdata_ptr, data.ndim, pdata.graph_to_iuppers[pdata.graph_nentries]); SScanIntArray(sdata_ptr, &sdata_ptr, data.ndim, pdata.graph_to_strides[pdata.graph_nentries]); for (i = data.ndim; i < 3; i++) { pdata.graph_to_strides[pdata.graph_nentries][i] = 1; } pdata.graph_to_vars[pdata.graph_nentries] = strtol(sdata_ptr, &sdata_ptr, 10); SScanIntArray(sdata_ptr, &sdata_ptr, data.ndim, pdata.graph_index_maps[pdata.graph_nentries]); for (i = data.ndim; i < 3; i++) { pdata.graph_index_maps[pdata.graph_nentries][i] = i; } for (i = 0; i < 3; i++) { pdata.graph_index_signs[pdata.graph_nentries][i] = 1; if ( pdata.graph_to_iuppers[pdata.graph_nentries][i] < pdata.graph_to_ilowers[pdata.graph_nentries][i] ) { pdata.graph_index_signs[pdata.graph_nentries][i] = -1; } } pdata.graph_entries[pdata.graph_nentries] = strtol(sdata_ptr, &sdata_ptr, 10); pdata.graph_values[pdata.graph_nentries] = (HYPRE_Real)strtod(sdata_ptr, &sdata_ptr); pdata.graph_boxsizes[pdata.graph_nentries] = 1; for (i = 0; i < 3; i++) { pdata.graph_boxsizes[pdata.graph_nentries] *= (pdata.graph_iuppers[pdata.graph_nentries][i] - pdata.graph_ilowers[pdata.graph_nentries][i] + 1); } pdata.graph_nentries++; data.pdata[part] = pdata; } else if ( strcmp(key, "MatrixSetValues:") == 0 ) { part = strtol(sdata_ptr, &sdata_ptr, 10); pdata = data.pdata[part]; if ((pdata.matrix_nentries % 10) == 0) { size = pdata.matrix_nentries + 10; pdata.matrix_ilowers = hypre_TReAlloc(pdata.matrix_ilowers, ProblemIndex, size, HYPRE_MEMORY_HOST); pdata.matrix_iuppers = hypre_TReAlloc(pdata.matrix_iuppers, ProblemIndex, size, HYPRE_MEMORY_HOST); pdata.matrix_strides = hypre_TReAlloc(pdata.matrix_strides, Index, size, HYPRE_MEMORY_HOST); pdata.matrix_vars = hypre_TReAlloc(pdata.matrix_vars, HYPRE_Int, size, HYPRE_MEMORY_HOST); pdata.matrix_entries = hypre_TReAlloc(pdata.matrix_entries, HYPRE_Int, size, HYPRE_MEMORY_HOST); pdata.matrix_values = hypre_TReAlloc(pdata.matrix_values, HYPRE_Real, size, HYPRE_MEMORY_HOST); } SScanProblemIndex(sdata_ptr, &sdata_ptr, data.ndim, pdata.matrix_ilowers[pdata.matrix_nentries]); SScanProblemIndex(sdata_ptr, &sdata_ptr, data.ndim, pdata.matrix_iuppers[pdata.matrix_nentries]); SScanIntArray(sdata_ptr, &sdata_ptr, data.ndim, pdata.matrix_strides[pdata.matrix_nentries]); for (i = data.ndim; i < 3; i++) { pdata.matrix_strides[pdata.matrix_nentries][i] = 1; } pdata.matrix_vars[pdata.matrix_nentries] = strtol(sdata_ptr, &sdata_ptr, 10); pdata.matrix_entries[pdata.matrix_nentries] = strtol(sdata_ptr, &sdata_ptr, 10); pdata.matrix_values[pdata.matrix_nentries] = (HYPRE_Real)strtod(sdata_ptr, &sdata_ptr); pdata.matrix_nentries++; data.pdata[part] = pdata; } else if ( strcmp(key, "FacParts:") == 0 ) { part = strtol(sdata_ptr, &sdata_ptr, 10); pdata = data.pdata[part]; pdata.fac_plevel = strtol(sdata_ptr, &sdata_ptr, 10); SScanIntArray(sdata_ptr, &sdata_ptr, data.ndim, pdata.fac_prefinement); data.pdata[part] = pdata; } else if ( strcmp(key, "ProcessPoolCreate:") == 0 ) { data.npools = strtol(sdata_ptr, &sdata_ptr, 10); data.pools = hypre_CTAlloc(HYPRE_Int, data.nparts, HYPRE_MEMORY_HOST); } else if ( strcmp(key, "ProcessPoolSetPart:") == 0 ) { i = strtol(sdata_ptr, &sdata_ptr, 10); part = strtol(sdata_ptr, &sdata_ptr, 10); data.pools[part] = i; } } sdata_line += strlen(sdata_line) + 1; } data.max_boxsize = 0; for (part = 0; part < data.nparts; part++) { data.max_boxsize = hypre_max(data.max_boxsize, data.pdata[part].max_boxsize); } hypre_TFree(sdata, HYPRE_MEMORY_HOST); *data_ptr = data; return 0; } HYPRE_Int MapProblemIndex( ProblemIndex index, Index m ) { /* un-shift the index */ index[0] -= index[6]; index[1] -= index[7]; index[2] -= index[8]; /* map the index */ index[0] = m[0] * index[0] + (m[0] - 1) * index[3]; index[1] = m[1] * index[1] + (m[1] - 1) * index[4]; index[2] = m[2] * index[2] + (m[2] - 1) * index[5]; /* pre-shift the new mapped index */ index[0] += index[6]; index[1] += index[7]; index[2] += index[8]; return 0; } HYPRE_Int IntersectBoxes( ProblemIndex ilower1, ProblemIndex iupper1, ProblemIndex ilower2, ProblemIndex iupper2, ProblemIndex int_ilower, ProblemIndex int_iupper ) { HYPRE_Int d, size; size = 1; for (d = 0; d < 3; d++) { int_ilower[d] = hypre_max(ilower1[d], ilower2[d]); int_iupper[d] = hypre_min(iupper1[d], iupper2[d]); size *= hypre_max(0, (int_iupper[d] - int_ilower[d] + 1)); } return size; } HYPRE_Int DistributeData( ProblemData global_data, Index *refine, Index *distribute, Index *block, HYPRE_Int num_procs, HYPRE_Int myid, ProblemData *data_ptr ) { ProblemData data = global_data; ProblemPartData pdata; HYPRE_Int *pool_procs; HYPRE_Int np, pid; HYPRE_Int pool, part, box, entry, p, q, r, i, d, dmap, sign, size; HYPRE_Int mod_lower, mod_upper; Index m, mmap, n, mod_graph; ProblemIndex ilower, iupper, int_ilower, int_iupper; /* determine first process number in each pool */ pool_procs = hypre_CTAlloc(HYPRE_Int, (data.npools + 1), HYPRE_MEMORY_HOST); for (part = 0; part < data.nparts; part++) { pool = data.pools[part] + 1; np = distribute[part][0] * distribute[part][1] * distribute[part][2]; pool_procs[pool] = hypre_max(pool_procs[pool], np); } pool_procs[0] = 0; for (pool = 1; pool < (data.npools + 1); pool++) { pool_procs[pool] = pool_procs[pool - 1] + pool_procs[pool]; } /* check number of processes */ if (pool_procs[data.npools] != num_procs) { hypre_printf("Error: Invalid number of processes or process topology \n"); exit(1); } /* modify part data */ for (part = 0; part < data.nparts; part++) { pdata = data.pdata[part]; pool = data.pools[part]; np = distribute[part][0] * distribute[part][1] * distribute[part][2]; pid = myid - pool_procs[pool]; if ( (pid < 0) || (pid >= np) ) { /* none of this part data lives on this process */ pdata.nboxes = 0; pdata.glue_nboxes = 0; pdata.graph_nentries = 0; pdata.matrix_nentries = 0; } else { /* refine boxes */ m[0] = refine[part][0]; m[1] = refine[part][1]; m[2] = refine[part][2]; if ( (m[0] * m[1] * m[2]) > 1) { for (box = 0; box < pdata.nboxes; box++) { MapProblemIndex(pdata.ilowers[box], m); MapProblemIndex(pdata.iuppers[box], m); } for (entry = 0; entry < pdata.graph_nentries; entry++) { MapProblemIndex(pdata.graph_ilowers[entry], m); MapProblemIndex(pdata.graph_iuppers[entry], m); mmap[0] = m[pdata.graph_index_maps[entry][0]]; mmap[1] = m[pdata.graph_index_maps[entry][1]]; mmap[2] = m[pdata.graph_index_maps[entry][2]]; MapProblemIndex(pdata.graph_to_ilowers[entry], mmap); MapProblemIndex(pdata.graph_to_iuppers[entry], mmap); } for (entry = 0; entry < pdata.matrix_nentries; entry++) { MapProblemIndex(pdata.matrix_ilowers[entry], m); MapProblemIndex(pdata.matrix_iuppers[entry], m); } } /* refine and distribute boxes */ m[0] = distribute[part][0]; m[1] = distribute[part][1]; m[2] = distribute[part][2]; if ( (m[0] * m[1] * m[2]) > 1) { p = pid % m[0]; q = ((pid - p) / m[0]) % m[1]; r = (pid - p - q * m[0]) / (m[0] * m[1]); for (box = 0; box < pdata.nboxes; box++) { n[0] = pdata.iuppers[box][0] - pdata.ilowers[box][0] + 1; n[1] = pdata.iuppers[box][1] - pdata.ilowers[box][1] + 1; n[2] = pdata.iuppers[box][2] - pdata.ilowers[box][2] + 1; MapProblemIndex(pdata.ilowers[box], m); MapProblemIndex(pdata.iuppers[box], m); pdata.iuppers[box][0] = pdata.ilowers[box][0] + n[0] - 1; pdata.iuppers[box][1] = pdata.ilowers[box][1] + n[1] - 1; pdata.iuppers[box][2] = pdata.ilowers[box][2] + n[2] - 1; pdata.ilowers[box][0] = pdata.ilowers[box][0] + p * n[0]; pdata.ilowers[box][1] = pdata.ilowers[box][1] + q * n[1]; pdata.ilowers[box][2] = pdata.ilowers[box][2] + r * n[2]; pdata.iuppers[box][0] = pdata.iuppers[box][0] + p * n[0]; pdata.iuppers[box][1] = pdata.iuppers[box][1] + q * n[1]; pdata.iuppers[box][2] = pdata.iuppers[box][2] + r * n[2]; } i = 0; for (entry = 0; entry < pdata.graph_nentries; entry++) { MapProblemIndex(pdata.graph_ilowers[entry], m); MapProblemIndex(pdata.graph_iuppers[entry], m); mmap[0] = m[pdata.graph_index_maps[entry][0]]; mmap[1] = m[pdata.graph_index_maps[entry][1]]; mmap[2] = m[pdata.graph_index_maps[entry][2]]; MapProblemIndex(pdata.graph_to_ilowers[entry], mmap); MapProblemIndex(pdata.graph_to_iuppers[entry], mmap); for (d = 0; d < 3; d++) { mod_graph[d] = pdata.graph_ilowers[entry][d] % pdata.graph_strides[entry][d]; } for (box = 0; box < pdata.nboxes; box++) { GetVariableBox(pdata.ilowers[box], pdata.iuppers[box], pdata.vartypes[pdata.graph_vars[entry]], ilower, iupper); size = IntersectBoxes(pdata.graph_ilowers[entry], pdata.graph_iuppers[entry], ilower, iupper, int_ilower, int_iupper); /* adjust int_ilower & int_iupper by a mod shift to get the extents correctly */ if (size > 0) { for (d = 0; d < 3; d++) { mod_lower = int_ilower[d] % pdata.graph_strides[entry][d]; if (mod_graph[d] >= mod_lower) { int_ilower[d] += (mod_graph[d] - mod_lower); } else { int_ilower[d] += pdata.graph_strides[entry][d] + (mod_graph[d] - mod_lower); } mod_lower = mod_graph[d]; mod_upper = int_iupper[d] % pdata.graph_strides[entry][d]; if (mod_lower >= mod_upper) { int_iupper[d] -= (mod_lower - mod_upper); } else { int_iupper[d] += (mod_upper - mod_lower) - pdata.graph_strides[entry][d]; } if (int_iupper[d] - int_ilower[d] < 0) { size = -1; break; } } } if (size > 0) { /* if there is an intersection, it is the only one */ for (d = 0; d < 3; d++) { dmap = pdata.graph_index_maps[entry][d]; sign = pdata.graph_index_signs[entry][d]; size = (int_iupper[d] - pdata.graph_iuppers[entry][d]) / pdata.graph_strides[entry][d]; pdata.graph_to_iuppers[i][dmap] = pdata.graph_to_ilowers[entry][dmap] + sign * size * pdata.graph_to_strides[entry][d]; size = (int_ilower[d] - pdata.graph_ilowers[entry][d]) / pdata.graph_strides[entry][d]; pdata.graph_to_ilowers[i][dmap] = pdata.graph_to_ilowers[entry][dmap] + sign * size * pdata.graph_to_strides[entry][d]; pdata.graph_ilowers[i][d] = int_ilower[d]; pdata.graph_iuppers[i][d] = int_iupper[d]; pdata.graph_strides[i][d] = pdata.graph_strides[entry][d]; pdata.graph_to_strides[i][d] = pdata.graph_to_strides[entry][d]; pdata.graph_index_maps[i][d] = dmap; pdata.graph_index_signs[i][d] = sign; } for (d = 3; d < 9; d++) { pdata.graph_ilowers[i][d] = pdata.graph_ilowers[entry][d]; pdata.graph_iuppers[i][d] = pdata.graph_iuppers[entry][d]; pdata.graph_to_ilowers[i][d] = pdata.graph_to_ilowers[entry][d]; pdata.graph_to_iuppers[i][d] = pdata.graph_to_iuppers[entry][d]; } pdata.graph_vars[i] = pdata.graph_vars[entry]; pdata.graph_to_parts[i] = pdata.graph_to_parts[entry]; pdata.graph_to_vars[i] = pdata.graph_to_vars[entry]; pdata.graph_entries[i] = pdata.graph_entries[entry]; pdata.graph_values[i] = pdata.graph_values[entry]; i++; break; } } } pdata.graph_nentries = i; i = 0; for (entry = 0; entry < pdata.matrix_nentries; entry++) { MapProblemIndex(pdata.matrix_ilowers[entry], m); MapProblemIndex(pdata.matrix_iuppers[entry], m); for (box = 0; box < pdata.nboxes; box++) { GetVariableBox(pdata.ilowers[box], pdata.iuppers[box], pdata.vartypes[pdata.matrix_vars[entry]], ilower, iupper); size = IntersectBoxes(pdata.matrix_ilowers[entry], pdata.matrix_iuppers[entry], ilower, iupper, int_ilower, int_iupper); if (size > 0) { /* if there is an intersection, it is the only one */ for (d = 0; d < 3; d++) { pdata.matrix_ilowers[i][d] = int_ilower[d]; pdata.matrix_iuppers[i][d] = int_iupper[d]; pdata.matrix_strides[i][d] = pdata.matrix_strides[entry][d]; } for (d = 3; d < 9; d++) { pdata.matrix_ilowers[i][d] = pdata.matrix_ilowers[entry][d]; pdata.matrix_iuppers[i][d] = pdata.matrix_iuppers[entry][d]; } pdata.matrix_vars[i] = pdata.matrix_vars[entry]; pdata.matrix_entries[i] = pdata.matrix_entries[entry]; pdata.matrix_values[i] = pdata.matrix_values[entry]; i++; break; } } } pdata.matrix_nentries = i; } /* refine and block boxes */ m[0] = block[part][0]; m[1] = block[part][1]; m[2] = block[part][2]; if ( (m[0] * m[1] * m[2]) > 1) { pdata.ilowers = hypre_TReAlloc(pdata.ilowers, ProblemIndex, m[0] * m[1] * m[2] * pdata.nboxes, HYPRE_MEMORY_HOST); pdata.iuppers = hypre_TReAlloc(pdata.iuppers, ProblemIndex, m[0] * m[1] * m[2] * pdata.nboxes, HYPRE_MEMORY_HOST); pdata.boxsizes = hypre_TReAlloc(pdata.boxsizes, HYPRE_Int, m[0] * m[1] * m[2] * pdata.nboxes, HYPRE_MEMORY_HOST); for (box = 0; box < pdata.nboxes; box++) { n[0] = pdata.iuppers[box][0] - pdata.ilowers[box][0] + 1; n[1] = pdata.iuppers[box][1] - pdata.ilowers[box][1] + 1; n[2] = pdata.iuppers[box][2] - pdata.ilowers[box][2] + 1; MapProblemIndex(pdata.ilowers[box], m); MapProblemIndex(pdata.iuppers[box], m); pdata.iuppers[box][0] = pdata.ilowers[box][0] + n[0] - 1; pdata.iuppers[box][1] = pdata.ilowers[box][1] + n[1] - 1; pdata.iuppers[box][2] = pdata.ilowers[box][2] + n[2] - 1; i = box; for (r = 0; r < m[2]; r++) { for (q = 0; q < m[1]; q++) { for (p = 0; p < m[0]; p++) { pdata.ilowers[i][0] = pdata.ilowers[box][0] + p * n[0]; pdata.ilowers[i][1] = pdata.ilowers[box][1] + q * n[1]; pdata.ilowers[i][2] = pdata.ilowers[box][2] + r * n[2]; pdata.iuppers[i][0] = pdata.iuppers[box][0] + p * n[0]; pdata.iuppers[i][1] = pdata.iuppers[box][1] + q * n[1]; pdata.iuppers[i][2] = pdata.iuppers[box][2] + r * n[2]; for (d = 3; d < 9; d++) { pdata.ilowers[i][d] = pdata.ilowers[box][d]; pdata.iuppers[i][d] = pdata.iuppers[box][d]; } i += pdata.nboxes; } } } } pdata.nboxes *= m[0] * m[1] * m[2]; for (entry = 0; entry < pdata.graph_nentries; entry++) { MapProblemIndex(pdata.graph_ilowers[entry], m); MapProblemIndex(pdata.graph_iuppers[entry], m); mmap[0] = m[pdata.graph_index_maps[entry][0]]; mmap[1] = m[pdata.graph_index_maps[entry][1]]; mmap[2] = m[pdata.graph_index_maps[entry][2]]; MapProblemIndex(pdata.graph_to_ilowers[entry], mmap); MapProblemIndex(pdata.graph_to_iuppers[entry], mmap); } for (entry = 0; entry < pdata.matrix_nentries; entry++) { MapProblemIndex(pdata.matrix_ilowers[entry], m); MapProblemIndex(pdata.matrix_iuppers[entry], m); } } /* map remaining ilowers & iuppers */ m[0] = refine[part][0] * block[part][0] * distribute[part][0]; m[1] = refine[part][1] * block[part][1] * distribute[part][1]; m[2] = refine[part][2] * block[part][2] * distribute[part][2]; if ( (m[0] * m[1] * m[2]) > 1) { for (box = 0; box < pdata.glue_nboxes; box++) { MapProblemIndex(pdata.glue_ilowers[box], m); MapProblemIndex(pdata.glue_iuppers[box], m); mmap[0] = m[pdata.glue_index_maps[box][0]]; mmap[1] = m[pdata.glue_index_maps[box][1]]; mmap[2] = m[pdata.glue_index_maps[box][2]]; MapProblemIndex(pdata.glue_nbor_ilowers[box], mmap); MapProblemIndex(pdata.glue_nbor_iuppers[box], mmap); } } /* compute box sizes, etc. */ pdata.max_boxsize = 0; for (box = 0; box < pdata.nboxes; box++) { pdata.boxsizes[box] = 1; for (i = 0; i < 3; i++) { pdata.boxsizes[box] *= (pdata.iuppers[box][i] - pdata.ilowers[box][i] + 2); } pdata.max_boxsize = hypre_max(pdata.max_boxsize, pdata.boxsizes[box]); } for (box = 0; box < pdata.graph_nentries; box++) { pdata.graph_boxsizes[box] = 1; for (i = 0; i < 3; i++) { pdata.graph_boxsizes[box] *= (pdata.graph_iuppers[box][i] - pdata.graph_ilowers[box][i] + 1); } } } if (pdata.nboxes == 0) { hypre_TFree(pdata.ilowers, HYPRE_MEMORY_HOST); hypre_TFree(pdata.iuppers, HYPRE_MEMORY_HOST); hypre_TFree(pdata.boxsizes, HYPRE_MEMORY_HOST); pdata.max_boxsize = 0; } if (pdata.matrix_nentries == 0) { hypre_TFree(pdata.matrix_ilowers, HYPRE_MEMORY_HOST); hypre_TFree(pdata.matrix_iuppers, HYPRE_MEMORY_HOST); hypre_TFree(pdata.matrix_strides, HYPRE_MEMORY_HOST); hypre_TFree(pdata.matrix_vars, HYPRE_MEMORY_HOST); hypre_TFree(pdata.matrix_entries, HYPRE_MEMORY_HOST); hypre_TFree(pdata.matrix_values, HYPRE_MEMORY_HOST); } if (pdata.glue_nboxes == 0) { hypre_TFree(pdata.glue_ilowers, HYPRE_MEMORY_HOST); hypre_TFree(pdata.glue_iuppers, HYPRE_MEMORY_HOST); hypre_TFree(pdata.glue_nbor_parts, HYPRE_MEMORY_HOST); hypre_TFree(pdata.glue_nbor_ilowers, HYPRE_MEMORY_HOST); hypre_TFree(pdata.glue_nbor_iuppers, HYPRE_MEMORY_HOST); hypre_TFree(pdata.glue_index_maps, HYPRE_MEMORY_HOST); } if (pdata.graph_nentries == 0) { hypre_TFree(pdata.graph_ilowers, HYPRE_MEMORY_HOST); hypre_TFree(pdata.graph_iuppers, HYPRE_MEMORY_HOST); hypre_TFree(pdata.graph_strides, HYPRE_MEMORY_HOST); hypre_TFree(pdata.graph_vars, HYPRE_MEMORY_HOST); hypre_TFree(pdata.graph_to_parts, HYPRE_MEMORY_HOST); hypre_TFree(pdata.graph_to_ilowers, HYPRE_MEMORY_HOST); hypre_TFree(pdata.graph_to_iuppers, HYPRE_MEMORY_HOST); hypre_TFree(pdata.graph_to_strides, HYPRE_MEMORY_HOST); hypre_TFree(pdata.graph_to_vars, HYPRE_MEMORY_HOST); hypre_TFree(pdata.graph_index_maps, HYPRE_MEMORY_HOST); hypre_TFree(pdata.graph_index_signs, HYPRE_MEMORY_HOST); hypre_TFree(pdata.graph_entries, HYPRE_MEMORY_HOST); hypre_TFree(pdata.graph_values, HYPRE_MEMORY_HOST); hypre_TFree(pdata.graph_boxsizes, HYPRE_MEMORY_HOST); } data.pdata[part] = pdata; } data.max_boxsize = 0; for (part = 0; part < data.nparts; part++) { data.max_boxsize = hypre_max(data.max_boxsize, data.pdata[part].max_boxsize); } hypre_TFree(pool_procs, HYPRE_MEMORY_HOST); *data_ptr = data; return 0; } /*-------------------------------------------------------------------------- * Destroy data *--------------------------------------------------------------------------*/ HYPRE_Int DestroyData( ProblemData data ) { ProblemPartData pdata; HYPRE_Int part, s; for (part = 0; part < data.nparts; part++) { pdata = data.pdata[part]; if (pdata.nboxes > 0) { hypre_TFree(pdata.ilowers, HYPRE_MEMORY_HOST); hypre_TFree(pdata.iuppers, HYPRE_MEMORY_HOST); hypre_TFree(pdata.boxsizes, HYPRE_MEMORY_HOST); } if (pdata.nvars > 0) { hypre_TFree(pdata.vartypes, HYPRE_MEMORY_HOST); } if (pdata.add_nvars > 0) { hypre_TFree(pdata.add_indexes, HYPRE_MEMORY_HOST); hypre_TFree(pdata.add_vartypes, HYPRE_MEMORY_HOST); } if (pdata.glue_nboxes > 0) { hypre_TFree(pdata.glue_ilowers, HYPRE_MEMORY_HOST); hypre_TFree(pdata.glue_iuppers, HYPRE_MEMORY_HOST); hypre_TFree(pdata.glue_nbor_parts, HYPRE_MEMORY_HOST); hypre_TFree(pdata.glue_nbor_ilowers, HYPRE_MEMORY_HOST); hypre_TFree(pdata.glue_nbor_iuppers, HYPRE_MEMORY_HOST); hypre_TFree(pdata.glue_index_maps, HYPRE_MEMORY_HOST); } if (pdata.nvars > 0) { hypre_TFree(pdata.stencil_num, HYPRE_MEMORY_HOST); } if (pdata.graph_nentries > 0) { hypre_TFree(pdata.graph_ilowers, HYPRE_MEMORY_HOST); hypre_TFree(pdata.graph_iuppers, HYPRE_MEMORY_HOST); hypre_TFree(pdata.graph_strides, HYPRE_MEMORY_HOST); hypre_TFree(pdata.graph_vars, HYPRE_MEMORY_HOST); hypre_TFree(pdata.graph_to_parts, HYPRE_MEMORY_HOST); hypre_TFree(pdata.graph_to_ilowers, HYPRE_MEMORY_HOST); hypre_TFree(pdata.graph_to_iuppers, HYPRE_MEMORY_HOST); hypre_TFree(pdata.graph_to_strides, HYPRE_MEMORY_HOST); hypre_TFree(pdata.graph_to_vars, HYPRE_MEMORY_HOST); hypre_TFree(pdata.graph_index_maps, HYPRE_MEMORY_HOST); hypre_TFree(pdata.graph_index_signs, HYPRE_MEMORY_HOST); hypre_TFree(pdata.graph_entries, HYPRE_MEMORY_HOST); hypre_TFree(pdata.graph_values, HYPRE_MEMORY_HOST); hypre_TFree(pdata.graph_boxsizes, HYPRE_MEMORY_HOST); } if (pdata.matrix_nentries > 0) { hypre_TFree(pdata.matrix_ilowers, HYPRE_MEMORY_HOST); hypre_TFree(pdata.matrix_iuppers, HYPRE_MEMORY_HOST); hypre_TFree(pdata.matrix_strides, HYPRE_MEMORY_HOST); hypre_TFree(pdata.matrix_vars, HYPRE_MEMORY_HOST); hypre_TFree(pdata.matrix_entries, HYPRE_MEMORY_HOST); hypre_TFree(pdata.matrix_values, HYPRE_MEMORY_HOST); } } hypre_TFree(data.pdata, HYPRE_MEMORY_HOST); for (s = 0; s < data.nstencils; s++) { hypre_TFree(data.stencil_offsets[s], HYPRE_MEMORY_HOST); hypre_TFree(data.stencil_vars[s], HYPRE_MEMORY_HOST); hypre_TFree(data.stencil_values[s], HYPRE_MEMORY_HOST); } hypre_TFree(data.stencil_sizes, HYPRE_MEMORY_HOST); hypre_TFree(data.stencil_offsets, HYPRE_MEMORY_HOST); hypre_TFree(data.stencil_vars, HYPRE_MEMORY_HOST); hypre_TFree(data.stencil_values, HYPRE_MEMORY_HOST); hypre_TFree(data.pools, HYPRE_MEMORY_HOST); return 0; } /*-------------------------------------------------------------------------- * Test driver for semi-structured matrix interface *--------------------------------------------------------------------------*/ hypre_int main( hypre_int argc, char *argv[] ) { char *infile; ProblemData global_data; ProblemData data; ProblemPartData pdata; HYPRE_Int nparts; HYPRE_Int *parts; Index *refine; Index *distribute; Index *block; HYPRE_Int solver_id; HYPRE_Int print_system; HYPRE_SStructGrid grid; HYPRE_SStructStencil *stencils; HYPRE_SStructGraph graph; HYPRE_SStructMatrix A, A_amg; HYPRE_StructMatrix sA; HYPRE_SStructVector b, b_amg; HYPRE_SStructVector x, x_amg; HYPRE_StructVector sx; HYPRE_SStructSolver solver; HYPRE_ParCSRMatrix par_A; HYPRE_ParVector par_b; HYPRE_ParVector par_x; HYPRE_Solver par_solver; HYPRE_Solver par_precond; Index ilower, iupper; Index index, to_index; HYPRE_Real *values, *box_values; HYPRE_Int *plevels; Index *prefinements; HYPRE_Int num_iterations; HYPRE_Real final_res_norm; HYPRE_Int num_procs, myid; HYPRE_Int time_index; HYPRE_Int n_pre, n_post; HYPRE_Int arg_index, part, box, var, entry, s, i, j, k; /*----------------------------------------------------------- * Initialize some stuff *-----------------------------------------------------------*/ /* Initialize MPI */ hypre_MPI_Init(&argc, &argv); hypre_MPI_Comm_size(hypre_MPI_COMM_WORLD, &num_procs); hypre_MPI_Comm_rank(hypre_MPI_COMM_WORLD, &myid); /*----------------------------------------------------------------- * GPU Device binding * Must be done before HYPRE_Initialize() and should not be changed after *-----------------------------------------------------------------*/ hypre_bind_device_id(-1, myid, num_procs, hypre_MPI_COMM_WORLD); /*----------------------------------------------------------- * Initialize : must be the first HYPRE function to call *-----------------------------------------------------------*/ HYPRE_Initialize(); HYPRE_DeviceInitialize(); /*----------------------------------------------------------- * Read input file *-----------------------------------------------------------*/ arg_index = 1; /* parse command line for input file name */ infile = infile_default; if (argc > 1) { if ( strcmp(argv[arg_index], "-in") == 0 ) { arg_index++; infile = argv[arg_index++]; } } ReadData(infile, &global_data); /*----------------------------------------------------------- * Set defaults *-----------------------------------------------------------*/ nparts = global_data.nparts; parts = hypre_TAlloc(HYPRE_Int, nparts, HYPRE_MEMORY_HOST); refine = hypre_TAlloc(Index, nparts, HYPRE_MEMORY_HOST); distribute = hypre_TAlloc(Index, nparts, HYPRE_MEMORY_HOST); block = hypre_TAlloc(Index, nparts, HYPRE_MEMORY_HOST); for (part = 0; part < nparts; part++) { parts[part] = part; for (j = 0; j < 3; j++) { refine[part][j] = 1; distribute[part][j] = 1; block[part][j] = 1; } } solver_id = 39; print_system = 0; /*----------------------------------------------------------- * Parse command line *-----------------------------------------------------------*/ while (arg_index < argc) { if ( strcmp(argv[arg_index], "-pt") == 0 ) { arg_index++; nparts = 0; while ( strncmp(argv[arg_index], "-", 1) != 0 ) { parts[nparts++] = atoi(argv[arg_index++]); } } else if ( strcmp(argv[arg_index], "-r") == 0 ) { arg_index++; for (i = 0; i < nparts; i++) { part = parts[i]; k = arg_index; for (j = 0; j < 3; j++) { refine[part][j] = atoi(argv[k++]); } } arg_index += 3; } else if ( strcmp(argv[arg_index], "-P") == 0 ) { arg_index++; for (i = 0; i < nparts; i++) { part = parts[i]; k = arg_index; for (j = 0; j < 3; j++) { distribute[part][j] = atoi(argv[k++]); } } arg_index += 3; } else if ( strcmp(argv[arg_index], "-b") == 0 ) { arg_index++; for (i = 0; i < nparts; i++) { part = parts[i]; k = arg_index; for (j = 0; j < 3; j++) { block[part][j] = atoi(argv[k++]); } } arg_index += 3; } else if ( strcmp(argv[arg_index], "-solver") == 0 ) { arg_index++; solver_id = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-print") == 0 ) { arg_index++; print_system = 1; } else if ( strcmp(argv[arg_index], "-v") == 0 ) { arg_index++; n_pre = atoi(argv[arg_index++]); n_post = atoi(argv[arg_index++]); } else { break; } } /*----------------------------------------------------------- * Distribute data *-----------------------------------------------------------*/ DistributeData(global_data, refine, distribute, block, num_procs, myid, &data); /*----------------------------------------------------------- * Synchronize so that timings make sense *-----------------------------------------------------------*/ hypre_MPI_Barrier(hypre_MPI_COMM_WORLD); /*----------------------------------------------------------- * Set up the grid *-----------------------------------------------------------*/ time_index = hypre_InitializeTiming("SStruct Interface"); hypre_BeginTiming(time_index); HYPRE_SStructGridCreate(hypre_MPI_COMM_WORLD, data.ndim, data.nparts, &grid); for (part = 0; part < data.nparts; part++) { pdata = data.pdata[part]; for (box = 0; box < pdata.nboxes; box++) { HYPRE_SStructGridSetExtents(grid, part, pdata.ilowers[box], pdata.iuppers[box]); } HYPRE_SStructGridSetVariables(grid, part, pdata.nvars, pdata.vartypes); /* GridAddVariabes */ /* GridSetNeighborBox */ for (box = 0; box < pdata.glue_nboxes; box++) { hypre_printf("Error: No longer supporting SetNeighborBox\n"); #if 0 HYPRE_SStructGridSetNeighborBox(grid, part, pdata.glue_ilowers[box], pdata.glue_iuppers[box], pdata.glue_nbor_parts[box], pdata.glue_nbor_ilowers[box], pdata.glue_nbor_iuppers[box], pdata.glue_index_maps[box]); #endif } HYPRE_SStructGridSetPeriodic(grid, part, pdata.periodic); } HYPRE_SStructGridAssemble(grid); /*----------------------------------------------------------- * Set up the stencils *-----------------------------------------------------------*/ stencils = hypre_CTAlloc(HYPRE_SStructStencil, data.nstencils, HYPRE_MEMORY_HOST); for (s = 0; s < data.nstencils; s++) { HYPRE_SStructStencilCreate(data.ndim, data.stencil_sizes[s], &stencils[s]); for (i = 0; i < data.stencil_sizes[s]; i++) { HYPRE_SStructStencilSetEntry(stencils[s], i, data.stencil_offsets[s][i], data.stencil_vars[s][i]); } } /*----------------------------------------------------------- * Set up the amr structure *-----------------------------------------------------------*/ plevels = hypre_TAlloc(HYPRE_Int, data.nparts, HYPRE_MEMORY_HOST); prefinements = hypre_TAlloc(Index, data.nparts, HYPRE_MEMORY_HOST); for (part = 0; part < data.nparts; part++) { pdata = data.pdata[part]; plevels[part] = pdata.fac_plevel; for (i = 0; i < data.ndim; i++) { prefinements[part][i] = pdata.fac_prefinement[i]; } } n_pre = prefinements[data.nparts - 1][0] - 1; n_post = prefinements[data.nparts - 1][0] - 1; /*----------------------------------------------------------- * Set up the graph *-----------------------------------------------------------*/ HYPRE_SStructGraphCreate(hypre_MPI_COMM_WORLD, grid, &graph); if ( ((solver_id >= 20) && (solver_id <= 30)) || ((solver_id >= 40) && (solver_id < 60)) ) { HYPRE_SStructGraphSetObjectType(graph, HYPRE_PARCSR); } for (part = 0; part < data.nparts; part++) { pdata = data.pdata[part]; /* set stencils */ for (var = 0; var < pdata.nvars; var++) { HYPRE_SStructGraphSetStencil(graph, part, var, stencils[pdata.stencil_num[var]]); } /* add entries */ for (entry = 0; entry < pdata.graph_nentries; entry++) { for (index[2] = pdata.graph_ilowers[entry][2]; index[2] <= pdata.graph_iuppers[entry][2]; index[2] += pdata.graph_strides[entry][2]) { for (index[1] = pdata.graph_ilowers[entry][1]; index[1] <= pdata.graph_iuppers[entry][1]; index[1] += pdata.graph_strides[entry][1]) { for (index[0] = pdata.graph_ilowers[entry][0]; index[0] <= pdata.graph_iuppers[entry][0]; index[0] += pdata.graph_strides[entry][0]) { for (i = 0; i < 3; i++) { j = pdata.graph_index_maps[entry][i]; k = index[i] - pdata.graph_ilowers[entry][i]; k /= pdata.graph_strides[entry][i]; k *= pdata.graph_index_signs[entry][i]; to_index[j] = pdata.graph_to_ilowers[entry][j] + k * pdata.graph_to_strides[entry][j]; } HYPRE_SStructGraphAddEntries(graph, part, index, pdata.graph_vars[entry], pdata.graph_to_parts[entry], to_index, pdata.graph_to_vars[entry]); } } } } } HYPRE_SStructGraphAssemble(graph); /*----------------------------------------------------------- * Set up the matrix *-----------------------------------------------------------*/ values = hypre_TAlloc(HYPRE_Real, data.max_boxsize, HYPRE_MEMORY_HOST); HYPRE_SStructMatrixCreate(hypre_MPI_COMM_WORLD, graph, &A); HYPRE_SStructMatrixInitialize(A); if ( ((solver_id >= 20) && (solver_id <= 30)) || ((solver_id >= 40) && (solver_id < 60)) ) { HYPRE_SStructMatrixCreate(hypre_MPI_COMM_WORLD, graph, &A_amg); HYPRE_SStructMatrixSetObjectType(A_amg, HYPRE_PARCSR); HYPRE_SStructMatrixInitialize(A_amg); } for (part = 0; part < data.nparts; part++) { pdata = data.pdata[part]; /* set stencil values */ for (var = 0; var < pdata.nvars; var++) { s = pdata.stencil_num[var]; for (i = 0; i < data.stencil_sizes[s]; i++) { for (j = 0; j < pdata.max_boxsize; j++) { values[j] = data.stencil_values[s][i]; } for (box = 0; box < pdata.nboxes; box++) { GetVariableBox(pdata.ilowers[box], pdata.iuppers[box], pdata.vartypes[var], ilower, iupper); HYPRE_SStructMatrixSetBoxValues(A, part, ilower, iupper, var, 1, &i, values); } } } /* set non-stencil entries */ for (entry = 0; entry < pdata.graph_nentries; entry++) { for (index[2] = pdata.graph_ilowers[entry][2]; index[2] <= pdata.graph_iuppers[entry][2]; index[2] += pdata.graph_strides[entry][2]) { for (index[1] = pdata.graph_ilowers[entry][1]; index[1] <= pdata.graph_iuppers[entry][1]; index[1] += pdata.graph_strides[entry][1]) { for (index[0] = pdata.graph_ilowers[entry][0]; index[0] <= pdata.graph_iuppers[entry][0]; index[0] += pdata.graph_strides[entry][0]) { HYPRE_SStructMatrixSetValues(A, part, index, pdata.graph_vars[entry], 1, &pdata.graph_entries[entry], &pdata.graph_values[entry]); } } } } if ( ((solver_id >= 20) && (solver_id <= 30)) || ((solver_id >= 40) && (solver_id < 60)) ) { for (entry = 0; entry < pdata.graph_nentries; entry++) { for (index[2] = pdata.graph_ilowers[entry][2]; index[2] <= pdata.graph_iuppers[entry][2]; index[2] += pdata.graph_strides[entry][2]) { for (index[1] = pdata.graph_ilowers[entry][1]; index[1] <= pdata.graph_iuppers[entry][1]; index[1] += pdata.graph_strides[entry][1]) { for (index[0] = pdata.graph_ilowers[entry][0]; index[0] <= pdata.graph_iuppers[entry][0]; index[0] += pdata.graph_strides[entry][0]) { HYPRE_SStructMatrixSetValues(A_amg, part, index, pdata.graph_vars[entry], 1, &pdata.graph_entries[entry], &pdata.graph_values[entry]); } } } } } } /* reset matrix values */ for (part = 0; part < data.nparts; part++) { pdata = data.pdata[part]; for (entry = 0; entry < pdata.matrix_nentries; entry++) { for (index[2] = pdata.matrix_ilowers[entry][2]; index[2] <= pdata.matrix_iuppers[entry][2]; index[2] += pdata.matrix_strides[entry][2]) { for (index[1] = pdata.matrix_ilowers[entry][1]; index[1] <= pdata.matrix_iuppers[entry][1]; index[1] += pdata.matrix_strides[entry][1]) { for (index[0] = pdata.matrix_ilowers[entry][0]; index[0] <= pdata.matrix_iuppers[entry][0]; index[0] += pdata.matrix_strides[entry][0]) { HYPRE_SStructMatrixSetValues(A, part, index, pdata.matrix_vars[entry], 1, &pdata.matrix_entries[entry], &pdata.matrix_values[entry]); } } } } } /* reset matrix values so that stencil connections between two parts are zeroed */ for (part = data.nparts - 1; part > 0; part--) { /*hypre_FacZeroCFSten(hypre_SStructMatrixPMatrix(A, part), hypre_SStructMatrixPMatrix(A, part-1), grid, part, prefinements[part]); hypre_FacZeroFCSten(hypre_SStructMatrixPMatrix(A, part), grid, part); hypre_ZeroAMRMatrixData(A, part-1, prefinements[part]); */ HYPRE_SStructFACZeroCFSten(A, grid, part, prefinements[part]); HYPRE_SStructFACZeroFCSten(A, grid, part); HYPRE_SStructFACZeroAMRMatrixData(A, part - 1, prefinements[part]); } HYPRE_SStructMatrixAssemble(A); if ( ((solver_id >= 20) && (solver_id <= 30)) || ((solver_id >= 40) && (solver_id < 60)) ) { for (part = data.nparts - 1; part >= 0; part--) { pdata = data.pdata[part]; for (var = 0; var < pdata.nvars; var++) { sA = hypre_SStructPMatrixSMatrix(hypre_SStructMatrixPMatrix(A, part), var, var); s = pdata.stencil_num[var]; for (i = 0; i < data.stencil_sizes[s]; i++) { for (box = 0; box < pdata.nboxes; box++) { box_values = hypre_TAlloc(HYPRE_Real, data.max_boxsize, HYPRE_MEMORY_HOST); GetVariableBox(pdata.ilowers[box], pdata.iuppers[box], pdata.vartypes[var], ilower, iupper); HYPRE_StructMatrixGetBoxValues(sA, ilower, iupper, 1, &i, box_values); HYPRE_SStructMatrixSetBoxValues(A_amg, part, ilower, iupper, var, 1, &i, box_values); hypre_TFree(box_values, HYPRE_MEMORY_HOST); } } } } HYPRE_SStructMatrixAssemble(A_amg); HYPRE_SStructMatrixGetObject(A_amg, (void **) &par_A); } /*----------------------------------------------------------- * Set up the linear system *-----------------------------------------------------------*/ HYPRE_SStructVectorCreate(hypre_MPI_COMM_WORLD, grid, &b); HYPRE_SStructVectorInitialize(b); if ( ((solver_id >= 20) && (solver_id <= 30)) || ((solver_id >= 40) && (solver_id < 60)) ) { HYPRE_SStructVectorCreate(hypre_MPI_COMM_WORLD, grid, &b_amg); HYPRE_SStructVectorSetObjectType(b_amg, HYPRE_PARCSR); HYPRE_SStructVectorInitialize(b_amg); } for (j = 0; j < data.max_boxsize; j++) { values[j] = 1.0; } for (part = 0; part < data.nparts; part++) { pdata = data.pdata[part]; for (var = 0; var < pdata.nvars; var++) { for (box = 0; box < pdata.nboxes; box++) { GetVariableBox(pdata.ilowers[box], pdata.iuppers[box], var, ilower, iupper); HYPRE_SStructVectorSetBoxValues(b, part, ilower, iupper, var, values); } } } /*hypre_ZeroAMRVectorData(b, plevels, prefinements);*/ HYPRE_SStructFACZeroAMRVectorData(b, plevels, prefinements); HYPRE_SStructVectorAssemble(b); if ( ((solver_id >= 20) && (solver_id <= 30)) || ((solver_id >= 40) && (solver_id < 60)) ) { for (part = 0; part < data.nparts; part++) { pdata = data.pdata[part]; for (var = 0; var < pdata.nvars; var++) { sx = hypre_SStructPVectorSVector(hypre_SStructVectorPVector(b, part), var); for (box = 0; box < pdata.nboxes; box++) { box_values = hypre_TAlloc(HYPRE_Real, data.max_boxsize, HYPRE_MEMORY_HOST); GetVariableBox(pdata.ilowers[box], pdata.iuppers[box], var, ilower, iupper); HYPRE_StructVectorGetBoxValues(sx, ilower, iupper, box_values); HYPRE_SStructVectorSetBoxValues(b_amg, part, ilower, iupper, var, values); hypre_TFree(box_values, HYPRE_MEMORY_HOST); } } } HYPRE_SStructVectorAssemble(b_amg); HYPRE_SStructVectorGetObject(b_amg, (void **) &par_b); } HYPRE_SStructVectorCreate(hypre_MPI_COMM_WORLD, grid, &x); HYPRE_SStructVectorInitialize(x); if ( ((solver_id >= 20) && (solver_id <= 30)) || ((solver_id >= 40) && (solver_id < 60)) ) { HYPRE_SStructVectorCreate(hypre_MPI_COMM_WORLD, grid, &x_amg); HYPRE_SStructVectorSetObjectType(x_amg, HYPRE_PARCSR); HYPRE_SStructVectorInitialize(x_amg); } for (j = 0; j < data.max_boxsize; j++) { values[j] = 1.0; } for (part = 0; part < data.nparts; part++) { pdata = data.pdata[part]; for (var = 0; var < pdata.nvars; var++) { for (box = 0; box < pdata.nboxes; box++) { GetVariableBox(pdata.ilowers[box], pdata.iuppers[box], var, ilower, iupper); HYPRE_SStructVectorSetBoxValues(x, part, ilower, iupper, var, values); } } } /*hypre_ZeroAMRVectorData(x, plevels, prefinements);*/ HYPRE_SStructFACZeroAMRVectorData(x, plevels, prefinements); HYPRE_SStructVectorAssemble(x); if ( ((solver_id >= 20) && (solver_id <= 30)) || ((solver_id >= 40) && (solver_id < 60)) ) { for (part = 0; part < data.nparts; part++) { pdata = data.pdata[part]; for (var = 0; var < pdata.nvars; var++) { sx = hypre_SStructPVectorSVector(hypre_SStructVectorPVector(x, part), var); for (box = 0; box < pdata.nboxes; box++) { box_values = hypre_TAlloc(HYPRE_Real, data.max_boxsize, HYPRE_MEMORY_HOST); GetVariableBox(pdata.ilowers[box], pdata.iuppers[box], var, ilower, iupper); HYPRE_StructVectorGetBoxValues(sx, ilower, iupper, box_values); HYPRE_SStructVectorSetBoxValues(x_amg, part, ilower, iupper, var, values); hypre_TFree(box_values, HYPRE_MEMORY_HOST); } } } HYPRE_SStructVectorAssemble(x_amg); HYPRE_SStructVectorGetObject(x_amg, (void **) &par_x); } hypre_EndTiming(time_index); hypre_PrintTiming("SStruct Interface", hypre_MPI_COMM_WORLD); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); /*----------------------------------------------------------- * Debugging code *-----------------------------------------------------------*/ #if DEBUG { FILE *file; char filename[255]; /* result is 1's on the interior of the grid */ hypre_SStructMatvec(1.0, A, b, 0.0, x); HYPRE_SStructVectorPrint("sstruct.out.matvec", x, 0); /* result is all 1's */ hypre_SStructCopy(b, x); HYPRE_SStructVectorPrint("sstruct.out.copy", x, 0); /* result is all 2's */ hypre_SStructScale(2.0, x); HYPRE_SStructVectorPrint("sstruct.out.scale", x, 0); /* result is all 0's */ hypre_SStructAxpy(-2.0, b, x); HYPRE_SStructVectorPrint("sstruct.out.axpy", x, 0); /* result is 1's with 0's on some boundaries */ hypre_SStructCopy(b, x); hypre_sprintf(filename, "sstruct.out.gatherpre.%05d", myid); file = fopen(filename, "w"); for (part = 0; part < data.nparts; part++) { pdata = data.pdata[part]; for (var = 0; var < pdata.nvars; var++) { for (box = 0; box < pdata.nboxes; box++) { GetVariableBox(pdata.ilowers[box], pdata.iuppers[box], var, ilower, iupper); HYPRE_SStructVectorGetBoxValues(x, part, ilower, iupper, var, values); hypre_fprintf(file, "\nPart %d, var %d, box %d:\n", part, var, box); for (i = 0; i < pdata.boxsizes[box]; i++) { hypre_fprintf(file, "%e\n", values[i]); } } } } fclose(file); /* result is all 1's */ HYPRE_SStructVectorGather(x); hypre_sprintf(filename, "sstruct.out.gatherpost.%05d", myid); file = fopen(filename, "w"); for (part = 0; part < data.nparts; part++) { pdata = data.pdata[part]; for (var = 0; var < pdata.nvars; var++) { for (box = 0; box < pdata.nboxes; box++) { GetVariableBox(pdata.ilowers[box], pdata.iuppers[box], var, ilower, iupper); HYPRE_SStructVectorGetBoxValues(x, part, ilower, iupper, var, values); hypre_fprintf(file, "\nPart %d, var %d, box %d:\n", part, var, box); for (i = 0; i < pdata.boxsizes[box]; i++) { hypre_fprintf(file, "%e\n", values[i]); } } } } /* re-initializes x to 0 */ hypre_SStructAxpy(-1.0, b, x); } #endif hypre_TFree(values, HYPRE_MEMORY_HOST); /*----------------------------------------------------------- * Print out the system and initial guess *-----------------------------------------------------------*/ if (print_system) { HYPRE_SStructVectorPrint("sstruct.out.b", b, 0); HYPRE_SStructVectorPrint("sstruct.out.x0", x, 0); } /*----------------------------------------------------------- * Solve the system using FAC *-----------------------------------------------------------*/ if ((solver_id >= 50) && (solver_id < 100)) { if (solver_id < 100) { /* n_pre+= n_post;*/ /* n_post= 0;*/ } time_index = hypre_InitializeTiming("FAC Setup"); hypre_BeginTiming(time_index); HYPRE_SStructFACCreate(hypre_MPI_COMM_WORLD, &solver); HYPRE_SStructFACSetMaxLevels(solver, data.nparts); HYPRE_SStructFACSetMaxIter(solver, 20); HYPRE_SStructFACSetTol(solver, 1.0e-06); HYPRE_SStructFACSetPLevels(solver, data.nparts, plevels); HYPRE_SStructFACSetPRefinements(solver, data.nparts, prefinements); HYPRE_SStructFACSetRelChange(solver, 0); if (solver_id > 90) { HYPRE_SStructFACSetRelaxType(solver, 2); } else { HYPRE_SStructFACSetRelaxType(solver, 1); } HYPRE_SStructFACSetNumPreRelax(solver, n_pre); HYPRE_SStructFACSetNumPostRelax(solver, n_post); HYPRE_SStructFACSetCoarseSolverType(solver, 2); HYPRE_SStructFACSetLogging(solver, 1); HYPRE_SStructFACSetup2(solver, A, b, x); hypre_EndTiming(time_index); hypre_PrintTiming("Setup phase times", hypre_MPI_COMM_WORLD); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); time_index = hypre_InitializeTiming("FAC Solve"); hypre_BeginTiming(time_index); if (solver_id > 90) { HYPRE_SStructFACSolve3(solver, A, b, x); } else { HYPRE_SStructFACSolve3(solver, A, b, x); } hypre_EndTiming(time_index); hypre_PrintTiming("Solve phase times", hypre_MPI_COMM_WORLD); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); HYPRE_SStructFACGetNumIterations(solver, &num_iterations); HYPRE_SStructFACGetFinalRelativeResidualNorm( solver, &final_res_norm); HYPRE_SStructFACDestroy2(solver); } /*----------------------------------------------------------- * Solve the system using PCG *-----------------------------------------------------------*/ if ((solver_id >= 20) && (solver_id < 30)) { time_index = hypre_InitializeTiming("PCG Setup"); hypre_BeginTiming(time_index); HYPRE_ParCSRPCGCreate(hypre_MPI_COMM_WORLD, &par_solver); HYPRE_PCGSetMaxIter( par_solver, 200 ); HYPRE_PCGSetTol( par_solver, 1.0e-06 ); HYPRE_PCGSetTwoNorm( par_solver, 1 ); HYPRE_PCGSetRelChange( par_solver, 0 ); HYPRE_PCGSetPrintLevel( par_solver, 1 ); if (solver_id == 20) { /* use BoomerAMG as preconditioner */ HYPRE_BoomerAMGCreate(&par_precond); HYPRE_BoomerAMGSetCoarsenType(par_precond, 6); HYPRE_BoomerAMGSetStrongThreshold(par_precond, 0.5); HYPRE_BoomerAMGSetTol(par_precond, 1.0e-06); HYPRE_BoomerAMGSetPrintLevel(par_precond, 1); HYPRE_BoomerAMGSetPrintFileName(par_precond, "sstruct.out.log"); /*HYPRE_BoomerAMGSetLogging(par_precond, 1, "sstruct.out.log");*/ HYPRE_BoomerAMGSetMaxIter(par_precond, 1); HYPRE_PCGSetPrecond( par_solver, (HYPRE_PtrToSolverFcn) HYPRE_BoomerAMGSolve, (HYPRE_PtrToSolverFcn) HYPRE_BoomerAMGSetup, par_precond ); } HYPRE_PCGSetup( par_solver, (HYPRE_Matrix) par_A, (HYPRE_Vector) par_b, (HYPRE_Vector) par_x ); hypre_EndTiming(time_index); hypre_PrintTiming("Setup phase times", hypre_MPI_COMM_WORLD); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); time_index = hypre_InitializeTiming("PCG Solve"); hypre_BeginTiming(time_index); HYPRE_PCGSolve( par_solver, (HYPRE_Matrix) par_A, (HYPRE_Vector) par_b, (HYPRE_Vector) par_x ); hypre_EndTiming(time_index); hypre_PrintTiming("Solve phase times", hypre_MPI_COMM_WORLD); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); HYPRE_PCGGetNumIterations( par_solver, &num_iterations ); HYPRE_PCGGetFinalRelativeResidualNorm( par_solver, &final_res_norm ); HYPRE_ParCSRPCGDestroy(par_solver); if (solver_id == 20) { HYPRE_BoomerAMGDestroy(par_precond); } } /*----------------------------------------------------------- * Solve the system using ParCSR version of GMRES *-----------------------------------------------------------*/ if ((solver_id >= 40) && (solver_id < 50)) { time_index = hypre_InitializeTiming("GMRES Setup"); hypre_BeginTiming(time_index); HYPRE_ParCSRGMRESCreate(hypre_MPI_COMM_WORLD, &par_solver); HYPRE_GMRESSetKDim(par_solver, 5); HYPRE_GMRESSetMaxIter(par_solver, 200); HYPRE_GMRESSetTol(par_solver, 1.0e-06); HYPRE_GMRESSetLogging(par_solver, 1); if (solver_id == 40) { /* use BoomerAMG as preconditioner */ HYPRE_BoomerAMGCreate(&par_precond); HYPRE_BoomerAMGSetCoarsenType(par_precond, 6); HYPRE_BoomerAMGSetStrongThreshold(par_precond, 0.); HYPRE_BoomerAMGSetTruncFactor(par_precond, 0.3); HYPRE_BoomerAMGSetTol(par_precond, 1.0e-06); HYPRE_BoomerAMGSetPrintLevel(par_precond, 1); HYPRE_BoomerAMGSetPrintFileName(par_precond, "sstruct.out.log"); HYPRE_BoomerAMGSetMaxIter(par_precond, 1); HYPRE_GMRESSetPrecond( par_solver, (HYPRE_PtrToSolverFcn) HYPRE_BoomerAMGSolve, (HYPRE_PtrToSolverFcn) HYPRE_BoomerAMGSetup, par_precond); } HYPRE_GMRESSetup( par_solver, (HYPRE_Matrix) par_A, (HYPRE_Vector) par_b, (HYPRE_Vector) par_x); hypre_EndTiming(time_index); hypre_PrintTiming("Setup phase times", hypre_MPI_COMM_WORLD); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); time_index = hypre_InitializeTiming("GMRES Solve"); hypre_BeginTiming(time_index); HYPRE_GMRESSolve( par_solver, (HYPRE_Matrix) par_A, (HYPRE_Vector) par_b, (HYPRE_Vector) par_x); hypre_EndTiming(time_index); hypre_PrintTiming("Solve phase times", hypre_MPI_COMM_WORLD); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); HYPRE_GMRESGetNumIterations( par_solver, &num_iterations); HYPRE_GMRESGetFinalRelativeResidualNorm( par_solver, &final_res_norm); HYPRE_ParCSRGMRESDestroy(par_solver); if (solver_id == 40) { HYPRE_BoomerAMGDestroy(par_precond); } } if (solver_id == 30) { time_index = hypre_InitializeTiming("AMG Setup"); hypre_BeginTiming(time_index); HYPRE_BoomerAMGCreate(&par_solver); HYPRE_BoomerAMGSetCoarsenType(par_solver, 6); HYPRE_BoomerAMGSetStrongThreshold(par_solver, 0.); HYPRE_BoomerAMGSetTruncFactor(par_solver, 0.3); /*HYPRE_BoomerAMGSetMaxLevels(par_solver, 4);*/ HYPRE_BoomerAMGSetTol(par_solver, 1.0e-06); HYPRE_BoomerAMGSetPrintLevel(par_solver, 1); HYPRE_BoomerAMGSetPrintFileName(par_solver, "sstruct.out.log"); HYPRE_BoomerAMGSetMaxIter(par_solver, 200); HYPRE_BoomerAMGSetup(par_solver, par_A, par_b, par_x); hypre_EndTiming(time_index); hypre_PrintTiming("Setup phase times", hypre_MPI_COMM_WORLD); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); time_index = hypre_InitializeTiming("BoomerAMG Solve"); hypre_BeginTiming(time_index); HYPRE_BoomerAMGSolve(par_solver, par_A, par_b, par_x); hypre_EndTiming(time_index); hypre_PrintTiming("Solve phase times", hypre_MPI_COMM_WORLD); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); HYPRE_BoomerAMGGetNumIterations(par_solver, &num_iterations); HYPRE_BoomerAMGGetFinalRelativeResidualNorm(par_solver, &final_res_norm); HYPRE_BoomerAMGDestroy(par_solver); } /*----------------------------------------------------------- * Gather the solution vector *-----------------------------------------------------------*/ HYPRE_SStructVectorGather(x); /*----------------------------------------------------------- * Print the solution and other info *-----------------------------------------------------------*/ if (myid == 0) { hypre_printf("\n"); hypre_printf("Iterations = %d\n", num_iterations); hypre_printf("Final Relative Residual Norm = %e\n", final_res_norm); hypre_printf("\n"); } /*----------------------------------------------------------- * Finalize things *-----------------------------------------------------------*/ HYPRE_SStructGridDestroy(grid); for (s = 0; s < data.nstencils; s++) { HYPRE_SStructStencilDestroy(stencils[s]); } hypre_TFree(stencils, HYPRE_MEMORY_HOST); HYPRE_SStructGraphDestroy(graph); if ( ((solver_id >= 20) && (solver_id <= 30)) || ((solver_id >= 40) && (solver_id < 60)) ) { HYPRE_SStructMatrixDestroy(A_amg); HYPRE_SStructVectorDestroy(b_amg); HYPRE_SStructVectorDestroy(x_amg); } HYPRE_SStructMatrixDestroy(A); HYPRE_SStructVectorDestroy(b); HYPRE_SStructVectorDestroy(x); hypre_TFree(plevels, HYPRE_MEMORY_HOST); hypre_TFree(prefinements, HYPRE_MEMORY_HOST); DestroyData(data); hypre_TFree(parts, HYPRE_MEMORY_HOST); hypre_TFree(refine, HYPRE_MEMORY_HOST); hypre_TFree(distribute, HYPRE_MEMORY_HOST); hypre_TFree(block, HYPRE_MEMORY_HOST); HYPRE_Finalize(); /* Finalize MPI */ hypre_MPI_Finalize(); return (0); } hypre-2.33.0/src/test/struct.c000066400000000000000000004200771477326011500162040ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include #include #include #include "_hypre_utilities.h" #include "HYPRE_struct_ls.h" #include "HYPRE_krylov.h" #define HYPRE_MFLOPS 0 #if HYPRE_MFLOPS #include "_hypre_struct_mv.h" #endif /* RDF: Why is this include here? */ #include "_hypre_struct_mv.h" #ifdef HYPRE_DEBUG /*#include */ #endif /* begin lobpcg */ #define NO_SOLVER -9198 #include #include "HYPRE_lobpcg.h" /* end lobpcg */ HYPRE_Int SetStencilBndry(HYPRE_StructMatrix A, HYPRE_StructGrid gridmatrix, HYPRE_Int* period); HYPRE_Int AddValuesMatrix(HYPRE_StructMatrix A, HYPRE_StructGrid gridmatrix, HYPRE_Real cx, HYPRE_Real cy, HYPRE_Real cz, HYPRE_Real conx, HYPRE_Real cony, HYPRE_Real conz) ; HYPRE_Int AddValuesVector( hypre_StructGrid *gridvector, hypre_StructVector *zvector, HYPRE_Int *period, HYPRE_Real value ) ; /*-------------------------------------------------------------------------- * Test driver for structured matrix interface (structured storage) *--------------------------------------------------------------------------*/ /*---------------------------------------------------------------------- * Standard 7-point laplacian in 3D with grid and anisotropy determined * as command line arguments. Do `driver -help' for usage info. *----------------------------------------------------------------------*/ hypre_int main( hypre_int argc, char *argv[] ) { HYPRE_Int arg_index; HYPRE_Int print_usage; HYPRE_Int nx, ny, nz; HYPRE_Int P, Q, R; HYPRE_Int bx, by, bz; HYPRE_Int px, py, pz; HYPRE_Real cx, cy, cz; HYPRE_Real conx, cony, conz; HYPRE_Int solver_id; HYPRE_Int solver_type; HYPRE_Int recompute_res; /*HYPRE_Real dxyz[3];*/ HYPRE_Int num_ghost[6] = {0, 0, 0, 0, 0, 0}; HYPRE_Int A_num_ghost[6] = {0, 0, 0, 0, 0, 0}; HYPRE_Int v_num_ghost[6] = {0, 0, 0, 0, 0, 0}; HYPRE_StructMatrix A; HYPRE_StructVector b; HYPRE_StructVector x; HYPRE_StructSolver solver; HYPRE_StructSolver precond; HYPRE_Int num_iterations; HYPRE_Int time_index; HYPRE_Real final_res_norm; HYPRE_Real cf_tol; HYPRE_Int num_procs, myid; HYPRE_Int device_id = -1; HYPRE_Int lazy_device_init = 0; HYPRE_Int p, q, r; HYPRE_Int dim; HYPRE_Int n_pre, n_post; HYPRE_Int nblocks = 0; HYPRE_Int skip; HYPRE_Int sym; HYPRE_Int rap; HYPRE_Int relax; HYPRE_Real jacobi_weight; HYPRE_Int usr_jacobi_weight; HYPRE_Int jump; HYPRE_Int rep, reps; HYPRE_Int **iupper; HYPRE_Int **ilower; HYPRE_Int istart[3]; HYPRE_Int periodic[3]; HYPRE_Int **offsets; HYPRE_Int constant_coefficient = 0; HYPRE_Int *stencil_entries; HYPRE_Int stencil_size; HYPRE_Int diag_rank; hypre_Index diag_index; HYPRE_StructGrid grid; HYPRE_StructGrid readgrid; HYPRE_StructStencil stencil; HYPRE_Int i, s; HYPRE_Int ix, iy, iz, ib; HYPRE_Int read_fromfile_param; HYPRE_Int read_fromfile_index; HYPRE_Int read_rhsfromfile_param; HYPRE_Int read_rhsfromfile_index; HYPRE_Int read_x0fromfile_param; HYPRE_Int read_x0fromfile_index; HYPRE_Int periodx0[3] = {0, 0, 0}; HYPRE_Int *readperiodic; HYPRE_Int sum; HYPRE_Int prec_print_level = 0; HYPRE_Int solver_print_level = 0; HYPRE_Int log_level = 0; HYPRE_Int print_system = 0; #if defined(HYPRE_USING_MEMORY_TRACKER) HYPRE_Int print_mem_tracker = 0; char mem_tracker_name[HYPRE_MAX_FILE_NAME_LEN] = {0}; #endif /* begin lobpcg */ HYPRE_Int lobpcgFlag = 0; HYPRE_Int lobpcgSeed = 0; HYPRE_Int blockSize = 1; HYPRE_Int verbosity = 1; HYPRE_Int iterations; HYPRE_Int maxIterations = 100; HYPRE_Int checkOrtho = 0; HYPRE_Int printLevel = 0; HYPRE_Int pcgIterations = 0; HYPRE_Int pcgMode = 0; HYPRE_Real tol = 1e-6; HYPRE_Real pcgTol = 1e-2; HYPRE_Real nonOrthF; FILE* filePtr; mv_MultiVectorPtr eigenvectors = NULL; mv_MultiVectorPtr constrains = NULL; HYPRE_Real* eigenvalues = NULL; HYPRE_Real* residuals; utilities_FortranMatrix* residualNorms; utilities_FortranMatrix* residualNormsHistory; utilities_FortranMatrix* eigenvaluesHistory; utilities_FortranMatrix* printBuffer; utilities_FortranMatrix* gramXX; utilities_FortranMatrix* identity; HYPRE_StructSolver lobpcg_solver; mv_InterfaceInterpreter* interpreter; HYPRE_MatvecFunctions matvec_fn; /* end lobpcg */ /* default execution policy and memory space */ #if defined(HYPRE_TEST_USING_HOST) HYPRE_MemoryLocation memory_location = HYPRE_MEMORY_HOST; HYPRE_ExecutionPolicy default_exec_policy = HYPRE_EXEC_HOST; #else HYPRE_MemoryLocation memory_location = HYPRE_MEMORY_DEVICE; HYPRE_ExecutionPolicy default_exec_policy = HYPRE_EXEC_DEVICE; #endif HYPRE_Int gpu_aware_mpi = 0; //HYPRE_Int device_level = -2; /*----------------------------------------------------------- * Initialize some stuff *-----------------------------------------------------------*/ /* Initialize MPI */ hypre_MPI_Init(&argc, &argv); hypre_MPI_Comm_size(hypre_MPI_COMM_WORLD, &num_procs ); hypre_MPI_Comm_rank(hypre_MPI_COMM_WORLD, &myid ); /*----------------------------------------------------------------- * GPU Device binding * Must be done before HYPRE_Initialize() and should not be changed after *-----------------------------------------------------------------*/ for (arg_index = 1; arg_index < argc; arg_index ++) { if (strcmp(argv[arg_index], "-lazy_device_init") == 0) { lazy_device_init = atoi(argv[++arg_index]); } else if (strcmp(argv[arg_index], "-device_id") == 0) { device_id = atoi(argv[++arg_index]); } } hypre_bind_device_id(device_id, myid, num_procs, hypre_MPI_COMM_WORLD); /*----------------------------------------------------------- * Initialize : must be the first HYPRE function to call *-----------------------------------------------------------*/ HYPRE_Initialize(); if (!lazy_device_init) { HYPRE_DeviceInitialize(); } #if defined(HYPRE_USING_KOKKOS) Kokkos::initialize (argc, argv); #endif #ifdef HYPRE_DEBUG /*cegdb(&argc, &argv, myid);*/ #endif /*----------------------------------------------------------- * Set defaults *-----------------------------------------------------------*/ dim = 3; skip = 0; sym = 1; rap = 0; relax = 1; jacobi_weight = 1.0; usr_jacobi_weight = 0; jump = 0; reps = 1; nx = 10; ny = 10; nz = 10; P = num_procs; Q = 1; R = 1; bx = 1; by = 1; bz = 1; cx = 1.0; cy = 1.0; cz = 1.0; conx = 0.0; cony = 0.0; conz = 0.0; n_pre = 1; n_post = 1; solver_id = 0; solver_type = 1; recompute_res = 0; /* What should be the default here? */ istart[0] = -3; istart[1] = -3; istart[2] = -3; px = 0; py = 0; pz = 0; cf_tol = 0.90; /* setting defaults for the reading parameters */ read_fromfile_param = 0; read_fromfile_index = argc; read_rhsfromfile_param = 0; read_rhsfromfile_index = argc; read_x0fromfile_param = 0; read_x0fromfile_index = argc; sum = 0; /* ghost defaults */ for (i = 0; i < 2 * dim; i++) { num_ghost[i] = 1; A_num_ghost[i] = num_ghost[i]; v_num_ghost[i] = num_ghost[i]; } //device_level = nx*ny*nz; /*----------------------------------------------------------- * Parse command line *-----------------------------------------------------------*/ print_usage = 0; arg_index = 1; while (arg_index < argc) { if ( strcmp(argv[arg_index], "-n") == 0 ) { arg_index++; nx = atoi(argv[arg_index++]); ny = atoi(argv[arg_index++]); nz = atoi(argv[arg_index++]); //device_level = nx*ny*nz; } else if ( strcmp(argv[arg_index], "-istart") == 0 ) { arg_index++; istart[0] = atoi(argv[arg_index++]); istart[1] = atoi(argv[arg_index++]); istart[2] = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-P") == 0 ) { arg_index++; P = atoi(argv[arg_index++]); Q = atoi(argv[arg_index++]); R = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-b") == 0 ) { arg_index++; bx = atoi(argv[arg_index++]); by = atoi(argv[arg_index++]); bz = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-p") == 0 ) { arg_index++; px = atoi(argv[arg_index++]); py = atoi(argv[arg_index++]); pz = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-c") == 0 ) { arg_index++; cx = (HYPRE_Real)atof(argv[arg_index++]); cy = (HYPRE_Real)atof(argv[arg_index++]); cz = (HYPRE_Real)atof(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-convect") == 0 ) { arg_index++; conx = (HYPRE_Real)atof(argv[arg_index++]); cony = (HYPRE_Real)atof(argv[arg_index++]); conz = (HYPRE_Real)atof(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-d") == 0 ) { arg_index++; dim = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-fromfile") == 0 ) { arg_index++; read_fromfile_param = 1; read_fromfile_index = arg_index; } else if ( strcmp(argv[arg_index], "-rhsfromfile") == 0 ) { arg_index++; read_rhsfromfile_param = 1; read_rhsfromfile_index = arg_index; } else if ( strcmp(argv[arg_index], "-x0fromfile") == 0 ) { arg_index++; read_x0fromfile_param = 1; read_x0fromfile_index = arg_index; } else if (strcmp(argv[arg_index], "-repeats") == 0 ) { arg_index++; reps = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-solver") == 0 ) { arg_index++; /* begin lobpcg */ if ( strcmp(argv[arg_index], "none") == 0 ) { solver_id = NO_SOLVER; arg_index++; } else /* end lobpcg */ { solver_id = atoi(argv[arg_index++]); } } else if ( strcmp(argv[arg_index], "-v") == 0 ) { arg_index++; n_pre = atoi(argv[arg_index++]); n_post = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-rap") == 0 ) { arg_index++; rap = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-relax") == 0 ) { arg_index++; relax = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-w") == 0 ) { arg_index++; jacobi_weight = (HYPRE_Real)atof(argv[arg_index++]); usr_jacobi_weight = 1; /* flag user weight */ } else if ( strcmp(argv[arg_index], "-sym") == 0 ) { arg_index++; sym = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-skip") == 0 ) { arg_index++; skip = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-jump") == 0 ) { arg_index++; jump = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-solver_type") == 0 ) { arg_index++; solver_type = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-recompute") == 0 ) { arg_index++; recompute_res = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-cf") == 0 ) { arg_index++; cf_tol = (HYPRE_Real)atof(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-print") == 0 ) { arg_index++; print_system = 1; } else if ( strcmp(argv[arg_index], "-pout") == 0 ) { arg_index++; prec_print_level = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-sout") == 0 ) { arg_index++; solver_print_level = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-ll") == 0 ) { arg_index++; log_level = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-help") == 0 ) { print_usage = 1; break; } /* begin lobpcg */ else if ( strcmp(argv[arg_index], "-lobpcg") == 0 ) { /* use lobpcg */ arg_index++; lobpcgFlag = 1; } else if ( strcmp(argv[arg_index], "-orthchk") == 0 ) { /* lobpcg: check orthonormality */ arg_index++; checkOrtho = 1; } else if ( strcmp(argv[arg_index], "-verb") == 0 ) { /* lobpcg: verbosity level */ arg_index++; verbosity = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-vrand") == 0 ) { /* lobpcg: block size */ arg_index++; blockSize = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-seed") == 0 ) { /* lobpcg: seed for srand */ arg_index++; lobpcgSeed = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-itr") == 0 ) { /* lobpcg: max # of iterations */ arg_index++; maxIterations = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-tol") == 0 ) { /* lobpcg: tolerance */ arg_index++; tol = (HYPRE_Real)atof(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-pcgitr") == 0 ) { /* lobpcg: max inner pcg iterations */ arg_index++; pcgIterations = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-pcgtol") == 0 ) { /* lobpcg: inner pcg iterations tolerance */ arg_index++; pcgTol = (HYPRE_Real)atof(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-pcgmode") == 0 ) { /* lobpcg: initial guess for inner pcg */ arg_index++; /* 0: zero, otherwise rhs */ pcgMode = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-vout") == 0 ) { /* lobpcg: print level */ arg_index++; printLevel = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-memory_host") == 0 ) { arg_index++; memory_location = HYPRE_MEMORY_HOST; } else if ( strcmp(argv[arg_index], "-memory_device") == 0 ) { arg_index++; memory_location = HYPRE_MEMORY_DEVICE; } else if ( strcmp(argv[arg_index], "-exec_host") == 0 ) { arg_index++; default_exec_policy = HYPRE_EXEC_HOST; } else if ( strcmp(argv[arg_index], "-exec_device") == 0 ) { arg_index++; default_exec_policy = HYPRE_EXEC_DEVICE; } #if defined(HYPRE_USING_MEMORY_TRACKER) else if ( strcmp(argv[arg_index], "-print_mem_tracker") == 0 ) { arg_index++; print_mem_tracker = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-mem_tracker_filename") == 0 ) { arg_index++; snprintf(mem_tracker_name, HYPRE_MAX_FILE_NAME_LEN, "%s", argv[arg_index++]); } #endif else if ( strcmp(argv[arg_index], "-gpu_mpi") == 0 ) { arg_index++; gpu_aware_mpi = atoi(argv[arg_index++]); } /* end lobpcg */ else { arg_index++; } } #if defined(HYPRE_USING_MEMORY_TRACKER) hypre_MemoryTrackerSetPrint(print_mem_tracker); if (mem_tracker_name[0]) { hypre_MemoryTrackerSetFileName(mem_tracker_name); } #endif /* Set library log level */ HYPRE_SetLogLevel(log_level); /* default memory location */ HYPRE_SetMemoryLocation(memory_location); /* default execution policy */ HYPRE_SetExecutionPolicy(default_exec_policy); HYPRE_SetGpuAwareMPI(gpu_aware_mpi); /* begin lobpcg */ if ( solver_id == 0 && lobpcgFlag ) { solver_id = 10; } /*end lobpcg */ sum = read_x0fromfile_param + read_rhsfromfile_param + read_fromfile_param; /*----------------------------------------------------------- * Print usage info *-----------------------------------------------------------*/ if ( (print_usage) && (myid == 0) ) { hypre_printf("\n"); hypre_printf("Usage: %s []\n", argv[0]); hypre_printf("\n"); hypre_printf(" -n : problem size per block\n"); hypre_printf(" -istart : start of box\n"); hypre_printf(" -P : processor topology\n"); hypre_printf(" -b : blocking per processor\n"); hypre_printf(" -p : periodicity in each dimension\n"); hypre_printf(" -c : diffusion coefficients\n"); hypre_printf(" -convect : convection coefficients\n"); hypre_printf(" -d : problem dimension (2 or 3)\n"); hypre_printf(" -fromfile : prefix name for matrixfiles\n"); hypre_printf(" -rhsfromfile : prefix name for rhsfiles\n"); hypre_printf(" -x0fromfile : prefix name for firstguessfiles\n"); hypre_printf(" -repeats : number of times to repeat the run, default 1. For solver 0,1,3\n"); hypre_printf(" -solver : solver ID\n"); hypre_printf(" 0 - SMG (default)\n"); hypre_printf(" 1 - PFMG\n"); hypre_printf(" 2 - SparseMSG\n"); hypre_printf(" 3 - PFMG constant coeffs\n"); hypre_printf(" 4 - PFMG constant coeffs var diag\n"); hypre_printf(" 8 - Jacobi\n"); hypre_printf(" 10 - CG with SMG precond\n"); hypre_printf(" 11 - CG with PFMG precond\n"); hypre_printf(" 12 - CG with SparseMSG precond\n"); hypre_printf(" 13 - CG with PFMG-3 precond\n"); hypre_printf(" 14 - CG with PFMG-4 precond\n"); hypre_printf(" 17 - CG with 2-step Jacobi\n"); hypre_printf(" 18 - CG with diagonal scaling\n"); hypre_printf(" 19 - CG\n"); hypre_printf(" 20 - Hybrid with SMG precond\n"); hypre_printf(" 21 - Hybrid with PFMG precond\n"); hypre_printf(" 22 - Hybrid with SparseMSG precond\n"); hypre_printf(" 30 - GMRES with SMG precond\n"); hypre_printf(" 31 - GMRES with PFMG precond\n"); hypre_printf(" 32 - GMRES with SparseMSG precond\n"); hypre_printf(" 37 - GMRES with 2-step Jacobi\n"); hypre_printf(" 38 - GMRES with diagonal scaling\n"); hypre_printf(" 39 - GMRES\n"); hypre_printf(" 40 - BiCGSTAB with SMG precond\n"); hypre_printf(" 41 - BiCGSTAB with PFMG precond\n"); hypre_printf(" 42 - BiCGSTAB with SparseMSG precond\n"); hypre_printf(" 47 - BiCGSTAB with 2-step Jacobi\n"); hypre_printf(" 48 - BiCGSTAB with diagonal scaling\n"); hypre_printf(" 49 - BiCGSTAB\n"); hypre_printf(" 50 - LGMRES with SMG precond\n"); hypre_printf(" 51 - LGMRES with PFMG precond\n"); hypre_printf(" 59 - LGMRES\n"); hypre_printf(" 60 - FlexGMRES with SMG precond\n"); hypre_printf(" 61 - FlexGMRES with PFMG precond\n"); hypre_printf(" 69 - FlexGMRES\n"); hypre_printf(" -v : number of pre and post relaxations\n"); hypre_printf(" -rap : coarse grid operator type\n"); hypre_printf(" 0 - Galerkin (default)\n"); hypre_printf(" 1 - non-Galerkin ParFlow operators\n"); hypre_printf(" 2 - Galerkin, general operators\n"); hypre_printf(" -relax : relaxation type\n"); hypre_printf(" 0 - Jacobi\n"); hypre_printf(" 1 - Weighted Jacobi (default)\n"); hypre_printf(" 2 - R/B Gauss-Seidel\n"); hypre_printf(" 3 - R/B Gauss-Seidel (nonsymmetric)\n"); hypre_printf(" -w : jacobi weight\n"); hypre_printf(" -skip : skip levels in PFMG (0 or 1)\n"); hypre_printf(" -sym : symmetric storage (1) or not (0)\n"); hypre_printf(" -jump : num levels to jump in SparseMSG\n"); hypre_printf(" -solver_type : solver type for Hybrid\n"); hypre_printf(" 1 - PCG (default)\n"); hypre_printf(" 2 - GMRES\n"); hypre_printf(" -recompute : Recompute residual in PCG?\n"); hypre_printf(" -cf : convergence factor for Hybrid\n"); hypre_printf(" -print : print out the system\n"); hypre_printf(" -pout : print level for the preconditioner\n"); hypre_printf(" -sout : print level for the solver\n"); hypre_printf(" -ll : hypre's log level\n"); hypre_printf(" 0 - (default) No messaging.\n"); hypre_printf(" 1 - Display memory usage statistics for each MPI rank.\n"); hypre_printf(" 2 - Display aggregate memory usage statistics over MPI ranks.\n"); hypre_printf("\n"); /* begin lobpcg */ hypre_printf("LOBPCG options:\n"); hypre_printf("\n"); hypre_printf(" -lobpcg : run LOBPCG instead of PCG\n"); hypre_printf("\n"); hypre_printf(" -solver none : no HYPRE preconditioner is used\n"); hypre_printf("\n"); hypre_printf(" -itr : maximal number of LOBPCG iterations (default 100);\n"); hypre_printf("\n"); hypre_printf(" -tol : residual tolerance (default 1e-6)\n"); hypre_printf("\n"); hypre_printf(" -vrand : compute eigenpairs using random initial vectors (default 1)\n"); hypre_printf("\n"); hypre_printf(" -seed : use as the seed for the pseudo-random number generator\n"); hypre_printf(" (default seed is based on the time of the run)\n"); hypre_printf("\n"); hypre_printf(" -orthchk : check eigenvectors for orthonormality\n"); hypre_printf("\n"); hypre_printf(" -verb : verbosity level\n"); hypre_printf(" -verb 0 : no print\n"); hypre_printf(" -verb 1 : print initial eigenvalues and residuals, iteration number, number of\n"); hypre_printf(" non-convergent eigenpairs and final eigenvalues and residuals (default)\n"); hypre_printf(" -verb 2 : print eigenvalues and residuals on each iteration\n"); hypre_printf("\n"); hypre_printf(" -pcgitr : maximal number of inner PCG iterations for preconditioning (default 1);\n"); hypre_printf(" if = 0 then the preconditioner is applied directly\n"); hypre_printf("\n"); hypre_printf(" -pcgtol : residual tolerance for inner iterations (default 0.01)\n"); hypre_printf("\n"); hypre_printf(" -vout : file output level\n"); hypre_printf(" -vout 0 : no files created (default)\n"); hypre_printf(" -vout 1 : write eigenvalues to values.txt and residuals to residuals.txt\n"); hypre_printf(" -vout 2 : in addition to the above, write the eigenvalues history (the matrix whose\n"); hypre_printf(" i-th column contains eigenvalues at (i+1)-th iteration) to val_hist.txt and\n"); hypre_printf(" residuals history to res_hist.txt\n"); hypre_printf("\nNOTE: in this test driver LOBPCG only works with solvers 10, 11, 12, 17 and 18\n"); hypre_printf("\ndefault solver is 10\n"); hypre_printf("\n"); /* end lobpcg */ } if ( print_usage ) { exit(1); } /*----------------------------------------------------------- * Check a few things *-----------------------------------------------------------*/ if ((P * Q * R) > num_procs) { if (myid == 0) { hypre_printf("Error: PxQxR is more than the number of processors\n"); } exit(1); } else if ((P * Q * R) < num_procs) { if (myid == 0) { hypre_printf("Warning: PxQxR is less than the number of processors\n"); } } if ((conx != 0.0 || cony != 0 || conz != 0) && sym == 1 ) { if (myid == 0) { hypre_printf("Warning: Convection produces non-symmetric matrix\n"); } sym = 0; } /*----------------------------------------------------------- * Print driver parameters *-----------------------------------------------------------*/ if (myid == 0 && sum == 0) { #if defined(HYPRE_DEVELOP_STRING) && defined(HYPRE_DEVELOP_BRANCH) hypre_printf("\nUsing HYPRE_DEVELOP_STRING: %s (branch %s; the develop branch)\n\n", HYPRE_DEVELOP_STRING, HYPRE_DEVELOP_BRANCH); #elif defined(HYPRE_DEVELOP_STRING) && !defined(HYPRE_DEVELOP_BRANCH) hypre_printf("\nUsing HYPRE_DEVELOP_STRING: %s (branch %s; not the develop branch)\n\n", HYPRE_DEVELOP_STRING, HYPRE_BRANCH_NAME); #elif defined(HYPRE_RELEASE_VERSION) hypre_printf("\nUsing HYPRE_RELEASE_VERSION: %s\n\n", HYPRE_RELEASE_VERSION); #endif hypre_printf("Running with these driver parameters:\n"); hypre_printf(" (nx, ny, nz) = (%d, %d, %d)\n", nx, ny, nz); hypre_printf(" (istart[0],istart[1],istart[2]) = (%d, %d, %d)\n", \ istart[0], istart[1], istart[2]); hypre_printf(" (Px, Py, Pz) = (%d, %d, %d)\n", P, Q, R); hypre_printf(" (bx, by, bz) = (%d, %d, %d)\n", bx, by, bz); hypre_printf(" (px, py, pz) = (%d, %d, %d)\n", px, py, pz); hypre_printf(" (cx, cy, cz) = (%f, %f, %f)\n", cx, cy, cz); hypre_printf(" (conx,cony,conz)= (%f, %f, %f)\n", conx, cony, conz); hypre_printf(" (n_pre, n_post) = (%d, %d)\n", n_pre, n_post); hypre_printf(" dim = %d\n", dim); hypre_printf(" skip = %d\n", skip); hypre_printf(" sym = %d\n", sym); hypre_printf(" rap = %d\n", rap); hypre_printf(" relax = %d\n", relax); hypre_printf(" jump = %d\n", jump); hypre_printf(" solver ID = %d\n", solver_id); /* hypre_printf(" Device level = %d\n", device_level); */ } if (myid == 0 && sum > 0) { hypre_printf("Running with these driver parameters:\n"); hypre_printf(" (cx, cy, cz) = (%f, %f, %f)\n", cx, cy, cz); hypre_printf(" (conx,cony,conz)= (%f, %f, %f)\n", conx, cony, conz); hypre_printf(" (n_pre, n_post) = (%d, %d)\n", n_pre, n_post); hypre_printf(" dim = %d\n", dim); hypre_printf(" skip = %d\n", skip); hypre_printf(" sym = %d\n", sym); hypre_printf(" rap = %d\n", rap); hypre_printf(" relax = %d\n", relax); hypre_printf(" jump = %d\n", jump); hypre_printf(" solver ID = %d\n", solver_id); hypre_printf(" the grid is read from file \n"); } /*----------------------------------------------------------- * Synchronize so that timings make sense *-----------------------------------------------------------*/ hypre_MPI_Barrier(hypre_MPI_COMM_WORLD); for ( rep = 0; rep < reps; ++rep ) { time_index = hypre_InitializeTiming("Struct Interface"); hypre_BeginTiming(time_index); /*----------------------------------------------------------- * Set up the stencil structure (7 points) when matrix is NOT read from file * Set up the grid structure used when NO files are read *-----------------------------------------------------------*/ switch (dim) { case 1: nblocks = bx; if (sym) { offsets = hypre_CTAlloc(HYPRE_Int*, 2, HYPRE_MEMORY_HOST); offsets[0] = hypre_CTAlloc(HYPRE_Int, 1, HYPRE_MEMORY_HOST); offsets[0][0] = -1; offsets[1] = hypre_CTAlloc(HYPRE_Int, 1, HYPRE_MEMORY_HOST); offsets[1][0] = 0; } else { offsets = hypre_CTAlloc(HYPRE_Int*, 3, HYPRE_MEMORY_HOST); offsets[0] = hypre_CTAlloc(HYPRE_Int, 1, HYPRE_MEMORY_HOST); offsets[0][0] = -1; offsets[1] = hypre_CTAlloc(HYPRE_Int, 1, HYPRE_MEMORY_HOST); offsets[1][0] = 0; offsets[2] = hypre_CTAlloc(HYPRE_Int, 1, HYPRE_MEMORY_HOST); offsets[2][0] = 1; } /* compute p from P and myid */ p = myid % P; break; case 2: nblocks = bx * by; if (sym) { offsets = hypre_CTAlloc(HYPRE_Int*, 3, HYPRE_MEMORY_HOST); offsets[0] = hypre_CTAlloc(HYPRE_Int, 2, HYPRE_MEMORY_HOST); offsets[0][0] = -1; offsets[0][1] = 0; offsets[1] = hypre_CTAlloc(HYPRE_Int, 2, HYPRE_MEMORY_HOST); offsets[1][0] = 0; offsets[1][1] = -1; offsets[2] = hypre_CTAlloc(HYPRE_Int, 2, HYPRE_MEMORY_HOST); offsets[2][0] = 0; offsets[2][1] = 0; } else { offsets = hypre_CTAlloc(HYPRE_Int*, 5, HYPRE_MEMORY_HOST); offsets[0] = hypre_CTAlloc(HYPRE_Int, 2, HYPRE_MEMORY_HOST); offsets[0][0] = -1; offsets[0][1] = 0; offsets[1] = hypre_CTAlloc(HYPRE_Int, 2, HYPRE_MEMORY_HOST); offsets[1][0] = 0; offsets[1][1] = -1; offsets[2] = hypre_CTAlloc(HYPRE_Int, 2, HYPRE_MEMORY_HOST); offsets[2][0] = 0; offsets[2][1] = 0; offsets[3] = hypre_CTAlloc(HYPRE_Int, 2, HYPRE_MEMORY_HOST); offsets[3][0] = 1; offsets[3][1] = 0; offsets[4] = hypre_CTAlloc(HYPRE_Int, 2, HYPRE_MEMORY_HOST); offsets[4][0] = 0; offsets[4][1] = 1; } /* compute p,q from P,Q and myid */ p = myid % P; q = (( myid - p) / P) % Q; break; case 3: nblocks = bx * by * bz; if (sym) { offsets = hypre_CTAlloc(HYPRE_Int*, 4, HYPRE_MEMORY_HOST); offsets[0] = hypre_CTAlloc(HYPRE_Int, 3, HYPRE_MEMORY_HOST); offsets[0][0] = -1; offsets[0][1] = 0; offsets[0][2] = 0; offsets[1] = hypre_CTAlloc(HYPRE_Int, 3, HYPRE_MEMORY_HOST); offsets[1][0] = 0; offsets[1][1] = -1; offsets[1][2] = 0; offsets[2] = hypre_CTAlloc(HYPRE_Int, 3, HYPRE_MEMORY_HOST); offsets[2][0] = 0; offsets[2][1] = 0; offsets[2][2] = -1; offsets[3] = hypre_CTAlloc(HYPRE_Int, 3, HYPRE_MEMORY_HOST); offsets[3][0] = 0; offsets[3][1] = 0; offsets[3][2] = 0; } else { offsets = hypre_CTAlloc(HYPRE_Int*, 7, HYPRE_MEMORY_HOST); offsets[0] = hypre_CTAlloc(HYPRE_Int, 3, HYPRE_MEMORY_HOST); offsets[0][0] = -1; offsets[0][1] = 0; offsets[0][2] = 0; offsets[1] = hypre_CTAlloc(HYPRE_Int, 3, HYPRE_MEMORY_HOST); offsets[1][0] = 0; offsets[1][1] = -1; offsets[1][2] = 0; offsets[2] = hypre_CTAlloc(HYPRE_Int, 3, HYPRE_MEMORY_HOST); offsets[2][0] = 0; offsets[2][1] = 0; offsets[2][2] = -1; offsets[3] = hypre_CTAlloc(HYPRE_Int, 3, HYPRE_MEMORY_HOST); offsets[3][0] = 0; offsets[3][1] = 0; offsets[3][2] = 0; offsets[4] = hypre_CTAlloc(HYPRE_Int, 3, HYPRE_MEMORY_HOST); offsets[4][0] = 1; offsets[4][1] = 0; offsets[4][2] = 0; offsets[5] = hypre_CTAlloc(HYPRE_Int, 3, HYPRE_MEMORY_HOST); offsets[5][0] = 0; offsets[5][1] = 1; offsets[5][2] = 0; offsets[6] = hypre_CTAlloc(HYPRE_Int, 3, HYPRE_MEMORY_HOST); offsets[6][0] = 0; offsets[6][1] = 0; offsets[6][2] = 1; } /* compute p,q,r from P,Q,R and myid */ p = myid % P; q = (( myid - p) / P) % Q; r = ( myid - p - P * q) / ( P * Q ); break; } if (myid >= (P * Q * R)) { /* My processor has no data on it */ nblocks = bx = by = bz = 0; } /*----------------------------------------------------------- * Set up the stencil structure needed for matrix creation * which is always the case for read_fromfile_param == 0 *-----------------------------------------------------------*/ HYPRE_StructStencilCreate(dim, (2 - sym)*dim + 1, &stencil); for (s = 0; s < (2 - sym)*dim + 1; s++) { HYPRE_StructStencilSetElement(stencil, s, offsets[s]); } /*----------------------------------------------------------- * Set up periodic *-----------------------------------------------------------*/ periodic[0] = px; periodic[1] = py; periodic[2] = pz; /*----------------------------------------------------------- * Set up dxyz for PFMG solver *-----------------------------------------------------------*/ #if 0 dxyz[0] = 1.0e+123; dxyz[1] = 1.0e+123; dxyz[2] = 1.0e+123; if (cx > 0) { dxyz[0] = hypre_sqrt(1.0 / cx); } if (cy > 0) { dxyz[1] = hypre_sqrt(1.0 / cy); } if (cz > 0) { dxyz[2] = hypre_sqrt(1.0 / cz); } #endif /* We do the extreme cases first reading everything from files => sum = 3 * building things from scratch (grid,stencils,extents) sum = 0 */ if ( (read_fromfile_param == 1) && (read_x0fromfile_param == 1) && (read_rhsfromfile_param == 1) ) { /* ghost selection for reading the matrix and vectors */ for (i = 0; i < dim; i++) { A_num_ghost[2 * i] = 1; A_num_ghost[2 * i + 1] = 1; v_num_ghost[2 * i] = 1; v_num_ghost[2 * i + 1] = 1; } HYPRE_StructMatrixRead(hypre_MPI_COMM_WORLD, argv[read_fromfile_index], A_num_ghost, &A); HYPRE_StructVectorRead(hypre_MPI_COMM_WORLD, argv[read_rhsfromfile_index], v_num_ghost, &b); HYPRE_StructVectorRead(hypre_MPI_COMM_WORLD, argv[read_x0fromfile_index], v_num_ghost, &x); } /* beginning of sum == 0 */ if (sum == 0) /* no read from any file */ { /*----------------------------------------------------------- * prepare space for the extents *-----------------------------------------------------------*/ ilower = hypre_CTAlloc(HYPRE_Int*, nblocks, HYPRE_MEMORY_HOST); iupper = hypre_CTAlloc(HYPRE_Int*, nblocks, HYPRE_MEMORY_HOST); for (i = 0; i < nblocks; i++) { ilower[i] = hypre_CTAlloc(HYPRE_Int, dim, HYPRE_MEMORY_HOST); iupper[i] = hypre_CTAlloc(HYPRE_Int, dim, HYPRE_MEMORY_HOST); } /* compute ilower and iupper from (p,q,r), (bx,by,bz), and (nx,ny,nz) */ ib = 0; switch (dim) { case 1: for (ix = 0; ix < bx; ix++) { ilower[ib][0] = istart[0] + nx * (bx * p + ix); iupper[ib][0] = istart[0] + nx * (bx * p + ix + 1) - 1; ib++; } break; case 2: for (iy = 0; iy < by; iy++) for (ix = 0; ix < bx; ix++) { ilower[ib][0] = istart[0] + nx * (bx * p + ix); iupper[ib][0] = istart[0] + nx * (bx * p + ix + 1) - 1; ilower[ib][1] = istart[1] + ny * (by * q + iy); iupper[ib][1] = istart[1] + ny * (by * q + iy + 1) - 1; ib++; } break; case 3: for (iz = 0; iz < bz; iz++) for (iy = 0; iy < by; iy++) for (ix = 0; ix < bx; ix++) { ilower[ib][0] = istart[0] + nx * (bx * p + ix); iupper[ib][0] = istart[0] + nx * (bx * p + ix + 1) - 1; ilower[ib][1] = istart[1] + ny * (by * q + iy); iupper[ib][1] = istart[1] + ny * (by * q + iy + 1) - 1; ilower[ib][2] = istart[2] + nz * (bz * r + iz); iupper[ib][2] = istart[2] + nz * (bz * r + iz + 1) - 1; ib++; } break; } HYPRE_StructGridCreate(hypre_MPI_COMM_WORLD, dim, &grid); for (ib = 0; ib < nblocks; ib++) { /* Add to the grid a new box defined by ilower[ib], iupper[ib]...*/ HYPRE_StructGridSetExtents(grid, ilower[ib], iupper[ib]); } HYPRE_StructGridSetPeriodic(grid, periodic); HYPRE_StructGridSetNumGhost(grid, num_ghost); HYPRE_StructGridAssemble(grid); /*----------------------------------------------------------- * Set up the matrix structure *-----------------------------------------------------------*/ HYPRE_StructMatrixCreate(hypre_MPI_COMM_WORLD, grid, stencil, &A); if ( solver_id == 3 || solver_id == 4 || solver_id == 13 || solver_id == 14 ) { stencil_size = hypre_StructStencilSize(stencil); stencil_entries = hypre_CTAlloc(HYPRE_Int, stencil_size, HYPRE_MEMORY_HOST); if ( solver_id == 3 || solver_id == 13) { for ( i = 0; i < stencil_size; ++i ) { stencil_entries[i] = i; } hypre_StructMatrixSetConstantEntries( A, stencil_size, stencil_entries ); /* ... note: SetConstantEntries is where the constant_coefficient flag is set in A */ hypre_TFree( stencil_entries, HYPRE_MEMORY_HOST); constant_coefficient = 1; } if ( solver_id == 4 || solver_id == 14) { hypre_SetIndex3(diag_index, 0, 0, 0); diag_rank = hypre_StructStencilElementRank( stencil, diag_index ); hypre_assert( stencil_size >= 1 ); if ( diag_rank == 0 ) { stencil_entries[diag_rank] = 1; } else { stencil_entries[diag_rank] = 0; } for ( i = 0; i < stencil_size; ++i ) { if ( i != diag_rank ) { stencil_entries[i] = i; } } hypre_StructMatrixSetConstantEntries( A, stencil_size, stencil_entries ); hypre_TFree( stencil_entries, HYPRE_MEMORY_HOST); constant_coefficient = 2; } } HYPRE_StructMatrixSetSymmetric(A, sym); HYPRE_StructMatrixInitialize(A); /*----------------------------------------------------------- * Fill in the matrix elements *-----------------------------------------------------------*/ AddValuesMatrix(A, grid, cx, cy, cz, conx, cony, conz); /* Zero out stencils reaching to real boundary */ /* But in constant coefficient case, no special stencils! */ if ( constant_coefficient == 0 ) { SetStencilBndry(A, grid, periodic); } HYPRE_StructMatrixAssemble(A); /*----------------------------------------------------------- * Set up the linear system *-----------------------------------------------------------*/ HYPRE_StructVectorCreate(hypre_MPI_COMM_WORLD, grid, &b); HYPRE_StructVectorInitialize(b); /*----------------------------------------------------------- * For periodic b.c. in all directions, need rhs to satisfy * compatibility condition. Achieved by setting a source and * sink of equal strength. All other problems have rhs = 1. *-----------------------------------------------------------*/ AddValuesVector(grid, b, periodic, 1.0); HYPRE_StructVectorAssemble(b); HYPRE_StructVectorCreate(hypre_MPI_COMM_WORLD, grid, &x); HYPRE_StructVectorInitialize(x); AddValuesVector(grid, x, periodx0, 0.0); HYPRE_StructVectorAssemble(x); HYPRE_StructGridDestroy(grid); for (i = 0; i < nblocks; i++) { hypre_TFree(iupper[i], HYPRE_MEMORY_HOST); hypre_TFree(ilower[i], HYPRE_MEMORY_HOST); } hypre_TFree(ilower, HYPRE_MEMORY_HOST); hypre_TFree(iupper, HYPRE_MEMORY_HOST); } /* the grid will be read from file. */ if ( (sum > 0 ) && (sum < 3)) { /* the grid will come from rhs or from x0 */ if (read_fromfile_param == 0) { if ((read_rhsfromfile_param > 0) && (read_x0fromfile_param == 0)) { /* read right hand side, extract grid, construct matrix, construct x0 */ hypre_printf("\ninitial rhs from file prefix :%s\n", argv[read_rhsfromfile_index]); HYPRE_StructVectorRead(hypre_MPI_COMM_WORLD, argv[read_rhsfromfile_index], v_num_ghost, &b); readgrid = hypre_StructVectorGrid(b) ; readperiodic = hypre_StructGridPeriodic(readgrid); HYPRE_StructVectorCreate(hypre_MPI_COMM_WORLD, readgrid, &x); HYPRE_StructVectorInitialize(x); AddValuesVector(readgrid, x, periodx0, 0.0); HYPRE_StructVectorAssemble(x); HYPRE_StructMatrixCreate(hypre_MPI_COMM_WORLD, readgrid, stencil, &A); HYPRE_StructMatrixSetSymmetric(A, 1); HYPRE_StructMatrixInitialize(A); /*----------------------------------------------------------- * Fill in the matrix elements *-----------------------------------------------------------*/ AddValuesMatrix(A, readgrid, cx, cy, cz, conx, cony, conz); /* Zero out stencils reaching to real boundary */ if ( constant_coefficient == 0 ) { SetStencilBndry(A, readgrid, readperiodic); } HYPRE_StructMatrixAssemble(A); } /* done with one case rhs=1 x0 = 0 */ /* case when rhs=0 and read x0=1 */ if ((read_rhsfromfile_param == 0) && (read_x0fromfile_param > 0)) { /* read right hand side, extract grid, construct matrix, construct x0 */ hypre_printf("\ninitial x0 from file prefix :%s\n", argv[read_x0fromfile_index]); HYPRE_StructVectorRead(hypre_MPI_COMM_WORLD, argv[read_x0fromfile_index], v_num_ghost, &x); readgrid = hypre_StructVectorGrid(x) ; readperiodic = hypre_StructGridPeriodic(readgrid); HYPRE_StructVectorCreate(hypre_MPI_COMM_WORLD, readgrid, &b); HYPRE_StructVectorInitialize(b); AddValuesVector(readgrid, b, readperiodic, 1.0); HYPRE_StructVectorAssemble(b); HYPRE_StructMatrixCreate(hypre_MPI_COMM_WORLD, readgrid, stencil, &A); HYPRE_StructMatrixSetSymmetric(A, 1); HYPRE_StructMatrixInitialize(A); /*----------------------------------------------------------- * Fill in the matrix elements *-----------------------------------------------------------*/ AddValuesMatrix(A, readgrid, cx, cy, cz, conx, cony, conz); /* Zero out stencils reaching to real boundary */ if ( constant_coefficient == 0 ) { SetStencilBndry(A, readgrid, readperiodic); } HYPRE_StructMatrixAssemble(A); } /* done with one case rhs=0 x0 = 1 */ /* the other case when read rhs > 0 and read x0 > 0 */ if ((read_rhsfromfile_param > 0) && (read_x0fromfile_param > 0)) { /* read right hand side, extract grid, construct matrix, construct x0 */ hypre_printf("\ninitial rhs from file prefix :%s\n", argv[read_rhsfromfile_index]); hypre_printf("\ninitial x0 from file prefix :%s\n", argv[read_x0fromfile_index]); HYPRE_StructVectorRead(hypre_MPI_COMM_WORLD, argv[read_rhsfromfile_index], v_num_ghost, &b); HYPRE_StructVectorRead(hypre_MPI_COMM_WORLD, argv[read_x0fromfile_index], v_num_ghost, &x); readgrid = hypre_StructVectorGrid(b) ; readperiodic = hypre_StructGridPeriodic(readgrid); HYPRE_StructMatrixCreate(hypre_MPI_COMM_WORLD, readgrid, stencil, &A); HYPRE_StructMatrixSetSymmetric(A, 1); HYPRE_StructMatrixInitialize(A); /*----------------------------------------------------------- * Fill in the matrix elements *-----------------------------------------------------------*/ AddValuesMatrix(A, readgrid, cx, cy, cz, conx, cony, conz); /* Zero out stencils reaching to real boundary */ if ( constant_coefficient == 0 ) { SetStencilBndry(A, readgrid, readperiodic); } HYPRE_StructMatrixAssemble(A); } /* done with one case rhs=1 x0 = 1 */ } /* done with the case where you no read matrix */ if (read_fromfile_param == 1) /* still sum > 0 */ { hypre_printf("\nreading matrix from file:%s\n", argv[read_fromfile_index]); HYPRE_StructMatrixRead(hypre_MPI_COMM_WORLD, argv[read_fromfile_index], A_num_ghost, &A); readgrid = hypre_StructMatrixGrid(A); readperiodic = hypre_StructGridPeriodic(readgrid); if ((read_rhsfromfile_param > 0) && (read_x0fromfile_param == 0)) { /* read right hand side ,construct x0 */ hypre_printf("\ninitial rhs from file prefix :%s\n", argv[read_rhsfromfile_index]); HYPRE_StructVectorRead(hypre_MPI_COMM_WORLD, argv[read_rhsfromfile_index], v_num_ghost, &b); HYPRE_StructVectorCreate(hypre_MPI_COMM_WORLD, readgrid, &x); HYPRE_StructVectorInitialize(x); AddValuesVector(readgrid, x, periodx0, 0.0); HYPRE_StructVectorAssemble(x); } if ((read_rhsfromfile_param == 0) && (read_x0fromfile_param > 0)) { /* read x0, construct rhs*/ hypre_printf("\ninitial x0 from file prefix :%s\n", argv[read_x0fromfile_index]); HYPRE_StructVectorRead(hypre_MPI_COMM_WORLD, argv[read_x0fromfile_index], v_num_ghost, &x); HYPRE_StructVectorCreate(hypre_MPI_COMM_WORLD, readgrid, &b); HYPRE_StructVectorInitialize(b); AddValuesVector(readgrid, b, readperiodic, 1.0); HYPRE_StructVectorAssemble(b); } if ((read_rhsfromfile_param == 0) && (read_x0fromfile_param == 0)) { /* construct x0 , construct b*/ HYPRE_StructVectorCreate(hypre_MPI_COMM_WORLD, readgrid, &b); HYPRE_StructVectorInitialize(b); AddValuesVector(readgrid, b, readperiodic, 1.0); HYPRE_StructVectorAssemble(b); HYPRE_StructVectorCreate(hypre_MPI_COMM_WORLD, readgrid, &x); HYPRE_StructVectorInitialize(x); AddValuesVector(readgrid, x, periodx0, 0.0); HYPRE_StructVectorAssemble(x); } } /* finish the read of matrix */ } /* finish the sum > 0 case */ /* linear system complete */ hypre_EndTiming(time_index); if ( reps == 1 || (solver_id != 0 && solver_id != 1 && solver_id != 3 && solver_id != 4) ) { hypre_PrintTiming("Struct Interface", hypre_MPI_COMM_WORLD); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); } else if ( rep == reps - 1 ) { hypre_FinalizeTiming(time_index); } /*----------------------------------------------------------- * Print out the system and initial guess *-----------------------------------------------------------*/ if (print_system) { HYPRE_StructMatrixPrint("struct.out.A", A, 0); HYPRE_StructVectorPrint("struct.out.b", b, 0); HYPRE_StructVectorPrint("struct.out.x0", x, 0); } /*----------------------------------------------------------- * Solve the system using SMG *-----------------------------------------------------------*/ #if !HYPRE_MFLOPS if (solver_id == 0) { time_index = hypre_InitializeTiming("SMG Setup"); hypre_BeginTiming(time_index); HYPRE_StructSMGCreate(hypre_MPI_COMM_WORLD, &solver); HYPRE_StructSMGSetMemoryUse(solver, 0); HYPRE_StructSMGSetMaxIter(solver, 50); HYPRE_StructSMGSetTol(solver, tol); HYPRE_StructSMGSetRelChange(solver, 0); HYPRE_StructSMGSetNumPreRelax(solver, n_pre); HYPRE_StructSMGSetNumPostRelax(solver, n_post); HYPRE_StructSMGSetPrintLevel(solver, solver_print_level); HYPRE_StructSMGSetLogging(solver, 1); #if 0//defined(HYPRE_USING_CUDA) HYPRE_StructSMGSetDeviceLevel(solver, device_level); #endif #if 0//defined(HYPRE_USING_CUDA) hypre_box_print = 0; #endif HYPRE_StructSMGSetup(solver, A, b, x); #if 0//defined(HYPRE_USING_CUDA) hypre_box_print = 0; #endif hypre_EndTiming(time_index); if ( reps == 1 ) { hypre_PrintTiming("Setup phase times", hypre_MPI_COMM_WORLD); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); } else if ( rep == reps - 1 ) { hypre_FinalizeTiming(time_index); } time_index = hypre_InitializeTiming("SMG Solve"); hypre_BeginTiming(time_index); HYPRE_StructSMGSolve(solver, A, b, x); hypre_EndTiming(time_index); if ( reps == 1 ) { hypre_PrintTiming("Solve phase times", hypre_MPI_COMM_WORLD); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); } else if ( rep == reps - 1 ) { hypre_PrintTiming("Interface, Setup, and Solve times:", hypre_MPI_COMM_WORLD ); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); } HYPRE_StructSMGGetNumIterations(solver, &num_iterations); HYPRE_StructSMGGetFinalRelativeResidualNorm(solver, &final_res_norm); HYPRE_StructSMGDestroy(solver); } /*----------------------------------------------------------- * Solve the system using PFMG *-----------------------------------------------------------*/ else if ( solver_id == 1 || solver_id == 3 || solver_id == 4 ) { time_index = hypre_InitializeTiming("PFMG Setup"); hypre_BeginTiming(time_index); HYPRE_StructPFMGCreate(hypre_MPI_COMM_WORLD, &solver); /*HYPRE_StructPFMGSetMaxLevels( solver, 9 );*/ HYPRE_StructPFMGSetMaxIter(solver, 200); HYPRE_StructPFMGSetTol(solver, tol); HYPRE_StructPFMGSetRelChange(solver, 0); HYPRE_StructPFMGSetRAPType(solver, rap); HYPRE_StructPFMGSetRelaxType(solver, relax); if (usr_jacobi_weight) { HYPRE_StructPFMGSetJacobiWeight(solver, jacobi_weight); } HYPRE_StructPFMGSetNumPreRelax(solver, n_pre); HYPRE_StructPFMGSetNumPostRelax(solver, n_post); HYPRE_StructPFMGSetSkipRelax(solver, skip); /*HYPRE_StructPFMGSetDxyz(solver, dxyz);*/ HYPRE_StructPFMGSetPrintLevel(solver, solver_print_level); HYPRE_StructPFMGSetLogging(solver, 1); #if 0//defined(HYPRE_USING_CUDA) HYPRE_StructPFMGSetDeviceLevel(solver, device_level); #endif HYPRE_StructPFMGSetup(solver, A, b, x); hypre_EndTiming(time_index); if ( reps == 1 ) { hypre_PrintTiming("Setup phase times", hypre_MPI_COMM_WORLD); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); } else if ( rep == reps - 1 ) { hypre_FinalizeTiming(time_index); } time_index = hypre_InitializeTiming("PFMG Solve"); hypre_BeginTiming(time_index); HYPRE_StructPFMGSolve(solver, A, b, x); hypre_EndTiming(time_index); if ( reps == 1 ) { hypre_PrintTiming("Solve phase times", hypre_MPI_COMM_WORLD); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); } else if ( rep == reps - 1 ) { hypre_PrintTiming("Interface, Setup, and Solve times", hypre_MPI_COMM_WORLD); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); } HYPRE_StructPFMGGetNumIterations(solver, &num_iterations); HYPRE_StructPFMGGetFinalRelativeResidualNorm(solver, &final_res_norm); HYPRE_StructPFMGDestroy(solver); } /*----------------------------------------------------------- * Solve the system using SparseMSG *-----------------------------------------------------------*/ else if (solver_id == 2) { time_index = hypre_InitializeTiming("SparseMSG Setup"); hypre_BeginTiming(time_index); HYPRE_StructSparseMSGCreate(hypre_MPI_COMM_WORLD, &solver); HYPRE_StructSparseMSGSetMaxIter(solver, 50); HYPRE_StructSparseMSGSetJump(solver, jump); HYPRE_StructSparseMSGSetTol(solver, tol); HYPRE_StructSparseMSGSetRelChange(solver, 0); HYPRE_StructSparseMSGSetRelaxType(solver, relax); if (usr_jacobi_weight) { HYPRE_StructSparseMSGSetJacobiWeight(solver, jacobi_weight); } HYPRE_StructSparseMSGSetNumPreRelax(solver, n_pre); HYPRE_StructSparseMSGSetNumPostRelax(solver, n_post); HYPRE_StructSparseMSGSetPrintLevel(solver, solver_print_level); HYPRE_StructSparseMSGSetLogging(solver, 1); HYPRE_StructSparseMSGSetup(solver, A, b, x); hypre_EndTiming(time_index); hypre_PrintTiming("Setup phase times", hypre_MPI_COMM_WORLD); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); time_index = hypre_InitializeTiming("SparseMSG Solve"); hypre_BeginTiming(time_index); HYPRE_StructSparseMSGSolve(solver, A, b, x); hypre_EndTiming(time_index); hypre_PrintTiming("Solve phase times", hypre_MPI_COMM_WORLD); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); HYPRE_StructSparseMSGGetNumIterations(solver, &num_iterations); HYPRE_StructSparseMSGGetFinalRelativeResidualNorm(solver, &final_res_norm); HYPRE_StructSparseMSGDestroy(solver); } /*----------------------------------------------------------- * Solve the system using Jacobi *-----------------------------------------------------------*/ else if ( solver_id == 8 ) { time_index = hypre_InitializeTiming("Jacobi Setup"); hypre_BeginTiming(time_index); HYPRE_StructJacobiCreate(hypre_MPI_COMM_WORLD, &solver); HYPRE_StructJacobiSetMaxIter(solver, 100); HYPRE_StructJacobiSetTol(solver, tol); HYPRE_StructJacobiSetup(solver, A, b, x); hypre_EndTiming(time_index); hypre_PrintTiming("Setup phase times", hypre_MPI_COMM_WORLD); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); time_index = hypre_InitializeTiming("Jacobi Solve"); hypre_BeginTiming(time_index); HYPRE_StructJacobiSolve(solver, A, b, x); hypre_EndTiming(time_index); hypre_PrintTiming("Solve phase times", hypre_MPI_COMM_WORLD); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); HYPRE_StructJacobiGetNumIterations(solver, &num_iterations); HYPRE_StructJacobiGetFinalRelativeResidualNorm(solver, &final_res_norm); HYPRE_StructJacobiDestroy(solver); } /*----------------------------------------------------------- * Solve the system using CG *-----------------------------------------------------------*/ if ((solver_id > 9) && (solver_id < 20)) { time_index = hypre_InitializeTiming("PCG Setup"); hypre_BeginTiming(time_index); HYPRE_StructPCGCreate(hypre_MPI_COMM_WORLD, &solver); HYPRE_PCGSetMaxIter( (HYPRE_Solver)solver, 100 ); HYPRE_PCGSetTol( (HYPRE_Solver)solver, tol ); HYPRE_PCGSetTwoNorm( (HYPRE_Solver)solver, 1 ); HYPRE_PCGSetRelChange( (HYPRE_Solver)solver, 0 ); HYPRE_PCGSetPrintLevel( (HYPRE_Solver)solver, solver_print_level ); if (solver_id == 10) { /* use symmetric SMG as preconditioner */ HYPRE_StructSMGCreate(hypre_MPI_COMM_WORLD, &precond); HYPRE_StructSMGSetMemoryUse(precond, 0); HYPRE_StructSMGSetMaxIter(precond, 1); HYPRE_StructSMGSetTol(precond, 0.0); HYPRE_StructSMGSetZeroGuess(precond); HYPRE_StructSMGSetNumPreRelax(precond, n_pre); HYPRE_StructSMGSetNumPostRelax(precond, n_post); HYPRE_StructSMGSetPrintLevel(precond, prec_print_level); HYPRE_StructSMGSetLogging(precond, 0); #if 0//defined(HYPRE_USING_CUDA) HYPRE_StructSMGSetDeviceLevel(precond, device_level); #endif HYPRE_PCGSetPrecond( (HYPRE_Solver) solver, (HYPRE_PtrToSolverFcn) HYPRE_StructSMGSolve, (HYPRE_PtrToSolverFcn) HYPRE_StructSMGSetup, (HYPRE_Solver) precond); } else if (solver_id == 11 || solver_id == 13 || solver_id == 14) { /* use symmetric PFMG as preconditioner */ HYPRE_StructPFMGCreate(hypre_MPI_COMM_WORLD, &precond); HYPRE_StructPFMGSetMaxIter(precond, 1); HYPRE_StructPFMGSetTol(precond, 0.0); HYPRE_StructPFMGSetZeroGuess(precond); HYPRE_StructPFMGSetRAPType(precond, rap); HYPRE_StructPFMGSetRelaxType(precond, relax); if (usr_jacobi_weight) { HYPRE_StructPFMGSetJacobiWeight(precond, jacobi_weight); } HYPRE_StructPFMGSetNumPreRelax(precond, n_pre); HYPRE_StructPFMGSetNumPostRelax(precond, n_post); HYPRE_StructPFMGSetSkipRelax(precond, skip); /*HYPRE_StructPFMGSetDxyz(precond, dxyz);*/ HYPRE_StructPFMGSetPrintLevel(precond, prec_print_level); HYPRE_StructPFMGSetLogging(precond, 0); #if 0//defined(HYPRE_USING_CUDA) HYPRE_StructPFMGSetDeviceLevel(precond, device_level); #endif HYPRE_PCGSetPrecond( (HYPRE_Solver) solver, (HYPRE_PtrToSolverFcn) HYPRE_StructPFMGSolve, (HYPRE_PtrToSolverFcn) HYPRE_StructPFMGSetup, (HYPRE_Solver) precond); } else if (solver_id == 12) { /* use symmetric SparseMSG as preconditioner */ HYPRE_StructSparseMSGCreate(hypre_MPI_COMM_WORLD, &precond); HYPRE_StructSparseMSGSetMaxIter(precond, 1); HYPRE_StructSparseMSGSetJump(precond, jump); HYPRE_StructSparseMSGSetTol(precond, 0.0); HYPRE_StructSparseMSGSetZeroGuess(precond); HYPRE_StructSparseMSGSetRelaxType(precond, relax); if (usr_jacobi_weight) { HYPRE_StructSparseMSGSetJacobiWeight(precond, jacobi_weight); } HYPRE_StructSparseMSGSetNumPreRelax(precond, n_pre); HYPRE_StructSparseMSGSetNumPostRelax(precond, n_post); HYPRE_StructSparseMSGSetPrintLevel(precond, prec_print_level); HYPRE_StructSparseMSGSetLogging(precond, 0); HYPRE_PCGSetPrecond( (HYPRE_Solver) solver, (HYPRE_PtrToSolverFcn) HYPRE_StructSparseMSGSolve, (HYPRE_PtrToSolverFcn) HYPRE_StructSparseMSGSetup, (HYPRE_Solver) precond); } else if (solver_id == 17) { /* use two-step Jacobi as preconditioner */ HYPRE_StructJacobiCreate(hypre_MPI_COMM_WORLD, &precond); HYPRE_StructJacobiSetMaxIter(precond, 2); HYPRE_StructJacobiSetTol(precond, 0.0); HYPRE_StructJacobiSetZeroGuess(precond); HYPRE_PCGSetPrecond( (HYPRE_Solver) solver, (HYPRE_PtrToSolverFcn) HYPRE_StructJacobiSolve, (HYPRE_PtrToSolverFcn) HYPRE_StructJacobiSetup, (HYPRE_Solver) precond); } else if (solver_id == 18) { /* use diagonal scaling as preconditioner */ precond = NULL; HYPRE_PCGSetPrecond( (HYPRE_Solver) solver, (HYPRE_PtrToSolverFcn) HYPRE_StructDiagScale, (HYPRE_PtrToSolverFcn) HYPRE_StructDiagScaleSetup, (HYPRE_Solver) precond); } HYPRE_PCGSetup( (HYPRE_Solver)solver, (HYPRE_Matrix)A, (HYPRE_Vector)b, (HYPRE_Vector)x ); hypre_EndTiming(time_index); hypre_PrintTiming("Setup phase times", hypre_MPI_COMM_WORLD); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); time_index = hypre_InitializeTiming("PCG Solve"); hypre_BeginTiming(time_index); HYPRE_PCGSolve( (HYPRE_Solver) solver, (HYPRE_Matrix)A, (HYPRE_Vector)b, (HYPRE_Vector)x); hypre_EndTiming(time_index); hypre_PrintTiming("Solve phase times", hypre_MPI_COMM_WORLD); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); HYPRE_PCGGetNumIterations( (HYPRE_Solver)solver, &num_iterations ); HYPRE_PCGGetFinalRelativeResidualNorm( (HYPRE_Solver)solver, &final_res_norm ); HYPRE_StructPCGDestroy(solver); if (solver_id == 10) { HYPRE_StructSMGDestroy(precond); } else if (solver_id == 11 || solver_id == 13 || solver_id == 14) { HYPRE_StructPFMGDestroy(precond); } else if (solver_id == 12) { HYPRE_StructSparseMSGDestroy(precond); } else if (solver_id == 17) { HYPRE_StructJacobiDestroy(precond); } } /* begin lobpcg */ /*----------------------------------------------------------- * Solve the system using LOBPCG *-----------------------------------------------------------*/ if ( lobpcgFlag ) { interpreter = hypre_CTAlloc(mv_InterfaceInterpreter, 1, HYPRE_MEMORY_HOST); HYPRE_StructSetupInterpreter( interpreter ); HYPRE_StructSetupMatvec(&matvec_fn); if (myid != 0) { verbosity = 0; } if ( pcgIterations > 0 ) { time_index = hypre_InitializeTiming("PCG Setup"); hypre_BeginTiming(time_index); HYPRE_StructPCGCreate(hypre_MPI_COMM_WORLD, &solver); HYPRE_PCGSetMaxIter( (HYPRE_Solver)solver, pcgIterations ); HYPRE_PCGSetTol( (HYPRE_Solver)solver, pcgTol ); HYPRE_PCGSetTwoNorm( (HYPRE_Solver)solver, 1 ); HYPRE_PCGSetRelChange( (HYPRE_Solver)solver, 0 ); HYPRE_PCGSetPrintLevel( (HYPRE_Solver)solver, solver_print_level ); if (solver_id == 10) { /* use symmetric SMG as preconditioner */ HYPRE_StructSMGCreate(hypre_MPI_COMM_WORLD, &precond); HYPRE_StructSMGSetMemoryUse(precond, 0); HYPRE_StructSMGSetMaxIter(precond, 1); HYPRE_StructSMGSetTol(precond, 0.0); HYPRE_StructSMGSetZeroGuess(precond); HYPRE_StructSMGSetNumPreRelax(precond, n_pre); HYPRE_StructSMGSetNumPostRelax(precond, n_post); HYPRE_StructSMGSetPrintLevel(precond, prec_print_level); HYPRE_StructSMGSetLogging(precond, 0); #if 0 //defined(HYPRE_USING_CUDA) HYPRE_StructSMGSetDeviceLevel(precond, device_level); #endif HYPRE_PCGSetPrecond( (HYPRE_Solver) solver, (HYPRE_PtrToSolverFcn) HYPRE_StructSMGSolve, (HYPRE_PtrToSolverFcn) HYPRE_StructSMGSetup, (HYPRE_Solver) precond); } else if (solver_id == 11) { /* use symmetric PFMG as preconditioner */ HYPRE_StructPFMGCreate(hypre_MPI_COMM_WORLD, &precond); HYPRE_StructPFMGSetMaxIter(precond, 1); HYPRE_StructPFMGSetTol(precond, 0.0); HYPRE_StructPFMGSetZeroGuess(precond); HYPRE_StructPFMGSetRAPType(precond, rap); HYPRE_StructPFMGSetRelaxType(precond, relax); if (usr_jacobi_weight) { HYPRE_StructPFMGSetJacobiWeight(precond, jacobi_weight); } HYPRE_StructPFMGSetNumPreRelax(precond, n_pre); HYPRE_StructPFMGSetNumPostRelax(precond, n_post); HYPRE_StructPFMGSetSkipRelax(precond, skip); /*HYPRE_StructPFMGSetDxyz(precond, dxyz);*/ HYPRE_StructPFMGSetPrintLevel(precond, prec_print_level); HYPRE_StructPFMGSetLogging(precond, 0); #if 0 //defined(HYPRE_USING_CUDA) HYPRE_StructPFMGSetDeviceLevel(precond, device_level); #endif HYPRE_PCGSetPrecond( (HYPRE_Solver) solver, (HYPRE_PtrToSolverFcn) HYPRE_StructPFMGSolve, (HYPRE_PtrToSolverFcn) HYPRE_StructPFMGSetup, (HYPRE_Solver) precond); } else if (solver_id == 12) { /* use symmetric SparseMSG as preconditioner */ HYPRE_StructSparseMSGCreate(hypre_MPI_COMM_WORLD, &precond); HYPRE_StructSparseMSGSetMaxIter(precond, 1); HYPRE_StructSparseMSGSetJump(precond, jump); HYPRE_StructSparseMSGSetTol(precond, 0.0); HYPRE_StructSparseMSGSetZeroGuess(precond); HYPRE_StructSparseMSGSetRelaxType(precond, relax); if (usr_jacobi_weight) { HYPRE_StructSparseMSGSetJacobiWeight(precond, jacobi_weight); } HYPRE_StructSparseMSGSetNumPreRelax(precond, n_pre); HYPRE_StructSparseMSGSetNumPostRelax(precond, n_post); HYPRE_StructSparseMSGSetPrintLevel(precond, prec_print_level); HYPRE_StructSparseMSGSetLogging(precond, 0); HYPRE_PCGSetPrecond( (HYPRE_Solver) solver, (HYPRE_PtrToSolverFcn) HYPRE_StructSparseMSGSolve, (HYPRE_PtrToSolverFcn) HYPRE_StructSparseMSGSetup, (HYPRE_Solver) precond); } else if (solver_id == 17) { /* use two-step Jacobi as preconditioner */ HYPRE_StructJacobiCreate(hypre_MPI_COMM_WORLD, &precond); HYPRE_StructJacobiSetMaxIter(precond, 2); HYPRE_StructJacobiSetTol(precond, 0.0); HYPRE_StructJacobiSetZeroGuess(precond); HYPRE_PCGSetPrecond( (HYPRE_Solver) solver, (HYPRE_PtrToSolverFcn) HYPRE_StructJacobiSolve, (HYPRE_PtrToSolverFcn) HYPRE_StructJacobiSetup, (HYPRE_Solver) precond); } else if (solver_id == 18) { /* use diagonal scaling as preconditioner */ precond = NULL; HYPRE_PCGSetPrecond( (HYPRE_Solver) solver, (HYPRE_PtrToSolverFcn) HYPRE_StructDiagScale, (HYPRE_PtrToSolverFcn) HYPRE_StructDiagScaleSetup, (HYPRE_Solver) precond); } else if (solver_id != NO_SOLVER ) { if ( verbosity ) { hypre_printf("Solver ID not recognized - running inner PCG iterations without preconditioner\n\n"); } } hypre_EndTiming(time_index); hypre_PrintTiming("Setup phase times", hypre_MPI_COMM_WORLD); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); HYPRE_LOBPCGCreate(interpreter, &matvec_fn, (HYPRE_Solver*)&lobpcg_solver); HYPRE_LOBPCGSetMaxIter((HYPRE_Solver)lobpcg_solver, maxIterations); HYPRE_LOBPCGSetPrecondUsageMode((HYPRE_Solver)lobpcg_solver, pcgMode); HYPRE_LOBPCGSetTol((HYPRE_Solver)lobpcg_solver, tol); HYPRE_LOBPCGSetPrintLevel((HYPRE_Solver)lobpcg_solver, verbosity); HYPRE_LOBPCGSetPrecond((HYPRE_Solver)lobpcg_solver, (HYPRE_PtrToSolverFcn) HYPRE_PCGSolve, (HYPRE_PtrToSolverFcn) HYPRE_PCGSetup, (HYPRE_Solver)solver); HYPRE_LOBPCGSetup((HYPRE_Solver)lobpcg_solver, (HYPRE_Matrix)A, (HYPRE_Vector)b, (HYPRE_Vector)x); eigenvectors = mv_MultiVectorCreateFromSampleVector( interpreter, blockSize, x ); eigenvalues = hypre_CTAlloc(HYPRE_Real, blockSize, HYPRE_MEMORY_HOST); if ( lobpcgSeed ) { mv_MultiVectorSetRandom( eigenvectors, lobpcgSeed ); } else { mv_MultiVectorSetRandom( eigenvectors, (HYPRE_Int)time(0) ); } time_index = hypre_InitializeTiming("LOBPCG Solve"); hypre_BeginTiming(time_index); HYPRE_LOBPCGSolve((HYPRE_Solver)lobpcg_solver, constrains, eigenvectors, eigenvalues ); hypre_EndTiming(time_index); hypre_PrintTiming("Solve phase times", hypre_MPI_COMM_WORLD); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); if ( checkOrtho ) { gramXX = utilities_FortranMatrixCreate(); identity = utilities_FortranMatrixCreate(); utilities_FortranMatrixAllocateData( blockSize, blockSize, gramXX ); utilities_FortranMatrixAllocateData( blockSize, blockSize, identity ); lobpcg_MultiVectorByMultiVector( eigenvectors, eigenvectors, gramXX ); utilities_FortranMatrixSetToIdentity( identity ); utilities_FortranMatrixAdd( -1, identity, gramXX, gramXX ); nonOrthF = utilities_FortranMatrixFNorm( gramXX ); if ( myid == 0 ) { hypre_printf("Non-orthonormality of eigenvectors: %12.5e\n", nonOrthF); } utilities_FortranMatrixDestroy( gramXX ); utilities_FortranMatrixDestroy( identity ); } if ( printLevel ) { if ( myid == 0 ) { if ( (filePtr = fopen("values.txt", "w")) ) { hypre_fprintf(filePtr, "%d\n", blockSize); for ( i = 0; i < blockSize; i++ ) { hypre_fprintf(filePtr, "%22.14e\n", eigenvalues[i]); } fclose(filePtr); } if ( (filePtr = fopen("residuals.txt", "w")) ) { residualNorms = HYPRE_LOBPCGResidualNorms( (HYPRE_Solver)lobpcg_solver ); residuals = utilities_FortranMatrixValues( residualNorms ); hypre_fprintf(filePtr, "%d\n", blockSize); for ( i = 0; i < blockSize; i++ ) { hypre_fprintf(filePtr, "%22.14e\n", residuals[i]); } fclose(filePtr); } if ( printLevel > 1 ) { printBuffer = utilities_FortranMatrixCreate(); iterations = HYPRE_LOBPCGIterations( (HYPRE_Solver)lobpcg_solver ); eigenvaluesHistory = HYPRE_LOBPCGEigenvaluesHistory( (HYPRE_Solver)lobpcg_solver ); utilities_FortranMatrixSelectBlock( eigenvaluesHistory, 1, blockSize, 1, iterations + 1, printBuffer ); utilities_FortranMatrixPrint( printBuffer, "val_hist.txt" ); residualNormsHistory = HYPRE_LOBPCGResidualNormsHistory( (HYPRE_Solver)lobpcg_solver ); utilities_FortranMatrixSelectBlock(residualNormsHistory, 1, blockSize, 1, iterations + 1, printBuffer ); utilities_FortranMatrixPrint( printBuffer, "res_hist.txt" ); utilities_FortranMatrixDestroy( printBuffer ); } } } HYPRE_StructPCGDestroy(solver); if (solver_id == 10) { HYPRE_StructSMGDestroy(precond); } else if (solver_id == 11) { HYPRE_StructPFMGDestroy(precond); } else if (solver_id == 12) { HYPRE_StructSparseMSGDestroy(precond); } else if (solver_id == 17) { HYPRE_StructJacobiDestroy(precond); } HYPRE_LOBPCGDestroy((HYPRE_Solver)lobpcg_solver); mv_MultiVectorDestroy( eigenvectors ); hypre_TFree(eigenvalues, HYPRE_MEMORY_HOST); } else { time_index = hypre_InitializeTiming("LOBPCG Setup"); hypre_BeginTiming(time_index); HYPRE_LOBPCGCreate(interpreter, &matvec_fn, (HYPRE_Solver*)&solver); HYPRE_LOBPCGSetMaxIter( (HYPRE_Solver)solver, maxIterations ); HYPRE_LOBPCGSetTol( (HYPRE_Solver)solver, tol ); HYPRE_LOBPCGSetPrintLevel( (HYPRE_Solver)solver, verbosity ); if (solver_id == 10) { /* use symmetric SMG as preconditioner */ HYPRE_StructSMGCreate(hypre_MPI_COMM_WORLD, &precond); HYPRE_StructSMGSetMemoryUse(precond, 0); HYPRE_StructSMGSetMaxIter(precond, 1); HYPRE_StructSMGSetTol(precond, 0.0); HYPRE_StructSMGSetZeroGuess(precond); HYPRE_StructSMGSetNumPreRelax(precond, n_pre); HYPRE_StructSMGSetNumPostRelax(precond, n_post); HYPRE_StructSMGSetPrintLevel(precond, prec_print_level); HYPRE_StructSMGSetLogging(precond, 0); #if 0 //defined(HYPRE_USING_CUDA) HYPRE_StructSMGSetDeviceLevel(precond, device_level); #endif HYPRE_LOBPCGSetPrecond( (HYPRE_Solver) solver, (HYPRE_PtrToSolverFcn) HYPRE_StructSMGSolve, (HYPRE_PtrToSolverFcn) HYPRE_StructSMGSetup, (HYPRE_Solver) precond); } else if (solver_id == 11) { /* use symmetric PFMG as preconditioner */ HYPRE_StructPFMGCreate(hypre_MPI_COMM_WORLD, &precond); HYPRE_StructPFMGSetMaxIter(precond, 1); HYPRE_StructPFMGSetTol(precond, 0.0); HYPRE_StructPFMGSetZeroGuess(precond); HYPRE_StructPFMGSetRAPType(precond, rap); HYPRE_StructPFMGSetRelaxType(precond, relax); if (usr_jacobi_weight) { HYPRE_StructPFMGSetJacobiWeight(precond, jacobi_weight); } HYPRE_StructPFMGSetNumPreRelax(precond, n_pre); HYPRE_StructPFMGSetNumPostRelax(precond, n_post); HYPRE_StructPFMGSetSkipRelax(precond, skip); /*HYPRE_StructPFMGSetDxyz(precond, dxyz);*/ HYPRE_StructPFMGSetPrintLevel(precond, prec_print_level); HYPRE_StructPFMGSetLogging(precond, 0); #if 0 //defined(HYPRE_USING_CUDA) HYPRE_StructPFMGSetDeviceLevel(precond, device_level); #endif HYPRE_LOBPCGSetPrecond( (HYPRE_Solver) solver, (HYPRE_PtrToSolverFcn) HYPRE_StructPFMGSolve, (HYPRE_PtrToSolverFcn) HYPRE_StructPFMGSetup, (HYPRE_Solver) precond); } else if (solver_id == 12) { /* use symmetric SparseMSG as preconditioner */ HYPRE_StructSparseMSGCreate(hypre_MPI_COMM_WORLD, &precond); HYPRE_StructSparseMSGSetMaxIter(precond, 1); HYPRE_StructSparseMSGSetJump(precond, jump); HYPRE_StructSparseMSGSetTol(precond, 0.0); HYPRE_StructSparseMSGSetZeroGuess(precond); HYPRE_StructSparseMSGSetRelaxType(precond, relax); if (usr_jacobi_weight) { HYPRE_StructSparseMSGSetJacobiWeight(precond, jacobi_weight); } HYPRE_StructSparseMSGSetNumPreRelax(precond, n_pre); HYPRE_StructSparseMSGSetNumPostRelax(precond, n_post); HYPRE_StructSparseMSGSetPrintLevel(precond, prec_print_level); HYPRE_StructSparseMSGSetLogging(precond, 0); HYPRE_LOBPCGSetPrecond( (HYPRE_Solver) solver, (HYPRE_PtrToSolverFcn) HYPRE_StructSparseMSGSolve, (HYPRE_PtrToSolverFcn) HYPRE_StructSparseMSGSetup, (HYPRE_Solver) precond); } else if (solver_id == 17) { /* use two-step Jacobi as preconditioner */ HYPRE_StructJacobiCreate(hypre_MPI_COMM_WORLD, &precond); HYPRE_StructJacobiSetMaxIter(precond, 2); HYPRE_StructJacobiSetTol(precond, 0.0); HYPRE_StructJacobiSetZeroGuess(precond); HYPRE_LOBPCGSetPrecond( (HYPRE_Solver) solver, (HYPRE_PtrToSolverFcn) HYPRE_StructJacobiSolve, (HYPRE_PtrToSolverFcn) HYPRE_StructJacobiSetup, (HYPRE_Solver) precond); } else if (solver_id == 18) { /* use diagonal scaling as preconditioner */ precond = NULL; HYPRE_LOBPCGSetPrecond( (HYPRE_Solver) solver, (HYPRE_PtrToSolverFcn) HYPRE_StructDiagScale, (HYPRE_PtrToSolverFcn) HYPRE_StructDiagScaleSetup, (HYPRE_Solver) precond); } else if (solver_id != NO_SOLVER ) { if ( verbosity ) { hypre_printf("Solver ID not recognized - running LOBPCG without preconditioner\n\n"); } } HYPRE_LOBPCGSetup ( (HYPRE_Solver)solver, (HYPRE_Matrix)A, (HYPRE_Vector)b, (HYPRE_Vector)x ); hypre_EndTiming(time_index); hypre_PrintTiming("Setup phase times", hypre_MPI_COMM_WORLD); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); eigenvectors = mv_MultiVectorCreateFromSampleVector( interpreter, blockSize, x ); eigenvalues = hypre_CTAlloc(HYPRE_Real, blockSize, HYPRE_MEMORY_HOST); if ( lobpcgSeed ) { mv_MultiVectorSetRandom( eigenvectors, lobpcgSeed ); } else { mv_MultiVectorSetRandom( eigenvectors, (HYPRE_Int)time(0) ); } time_index = hypre_InitializeTiming("PCG Solve"); hypre_BeginTiming(time_index); HYPRE_LOBPCGSolve ( (HYPRE_Solver)solver, constrains, eigenvectors, eigenvalues ); hypre_EndTiming(time_index); hypre_PrintTiming("Solve phase times", hypre_MPI_COMM_WORLD); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); if ( checkOrtho ) { gramXX = utilities_FortranMatrixCreate(); identity = utilities_FortranMatrixCreate(); utilities_FortranMatrixAllocateData( blockSize, blockSize, gramXX ); utilities_FortranMatrixAllocateData( blockSize, blockSize, identity ); lobpcg_MultiVectorByMultiVector( eigenvectors, eigenvectors, gramXX ); utilities_FortranMatrixSetToIdentity( identity ); utilities_FortranMatrixAdd( -1, identity, gramXX, gramXX ); nonOrthF = utilities_FortranMatrixFNorm( gramXX ); if ( myid == 0 ) { hypre_printf("Non-orthonormality of eigenvectors: %12.5e\n", nonOrthF); } utilities_FortranMatrixDestroy( gramXX ); utilities_FortranMatrixDestroy( identity ); } if ( printLevel ) { if ( myid == 0 ) { if ( (filePtr = fopen("values.txt", "w")) ) { hypre_fprintf(filePtr, "%d\n", blockSize); for ( i = 0; i < blockSize; i++ ) { hypre_fprintf(filePtr, "%22.14e\n", eigenvalues[i]); } fclose(filePtr); } if ( (filePtr = fopen("residuals.txt", "w")) ) { residualNorms = HYPRE_LOBPCGResidualNorms( (HYPRE_Solver)solver ); residuals = utilities_FortranMatrixValues( residualNorms ); hypre_fprintf(filePtr, "%d\n", blockSize); for ( i = 0; i < blockSize; i++ ) { hypre_fprintf(filePtr, "%22.14e\n", residuals[i]); } fclose(filePtr); } if ( printLevel > 1 ) { printBuffer = utilities_FortranMatrixCreate(); iterations = HYPRE_LOBPCGIterations( (HYPRE_Solver)solver ); eigenvaluesHistory = HYPRE_LOBPCGEigenvaluesHistory( (HYPRE_Solver)solver ); utilities_FortranMatrixSelectBlock( eigenvaluesHistory, 1, blockSize, 1, iterations + 1, printBuffer ); utilities_FortranMatrixPrint( printBuffer, "val_hist.txt" ); residualNormsHistory = HYPRE_LOBPCGResidualNormsHistory( (HYPRE_Solver)solver ); utilities_FortranMatrixSelectBlock(residualNormsHistory, 1, blockSize, 1, iterations + 1, printBuffer ); utilities_FortranMatrixPrint( printBuffer, "res_hist.txt" ); utilities_FortranMatrixDestroy( printBuffer ); } } } HYPRE_LOBPCGDestroy((HYPRE_Solver)solver); if (solver_id == 10) { HYPRE_StructSMGDestroy(precond); } else if (solver_id == 11) { HYPRE_StructPFMGDestroy(precond); } else if (solver_id == 12) { HYPRE_StructSparseMSGDestroy(precond); } else if (solver_id == 17) { HYPRE_StructJacobiDestroy(precond); } mv_MultiVectorDestroy( eigenvectors ); hypre_TFree(eigenvalues, HYPRE_MEMORY_HOST); } hypre_TFree( interpreter, HYPRE_MEMORY_HOST); } /* end lobpcg */ /*----------------------------------------------------------- * Solve the system using Hybrid *-----------------------------------------------------------*/ if ((solver_id > 19) && (solver_id < 30)) { time_index = hypre_InitializeTiming("Hybrid Setup"); hypre_BeginTiming(time_index); HYPRE_StructHybridCreate(hypre_MPI_COMM_WORLD, &solver); HYPRE_StructHybridSetDSCGMaxIter(solver, 100); HYPRE_StructHybridSetPCGMaxIter(solver, 100); HYPRE_StructHybridSetTol(solver, tol); /*HYPRE_StructHybridSetPCGAbsoluteTolFactor(solver, 1.0e-200);*/ HYPRE_StructHybridSetConvergenceTol(solver, cf_tol); HYPRE_StructHybridSetTwoNorm(solver, 1); HYPRE_StructHybridSetRelChange(solver, 0); if (solver_type == 2) /* for use with GMRES */ { HYPRE_StructHybridSetStopCrit(solver, 0); HYPRE_StructHybridSetKDim(solver, 10); } HYPRE_StructHybridSetPrintLevel(solver, solver_print_level); HYPRE_StructHybridSetLogging(solver, 1); HYPRE_StructHybridSetSolverType(solver, solver_type); HYPRE_StructHybridSetRecomputeResidual(solver, recompute_res); if (solver_id == 20) { /* use symmetric SMG as preconditioner */ HYPRE_StructSMGCreate(hypre_MPI_COMM_WORLD, &precond); HYPRE_StructSMGSetMemoryUse(precond, 0); HYPRE_StructSMGSetMaxIter(precond, 1); HYPRE_StructSMGSetTol(precond, 0.0); HYPRE_StructSMGSetZeroGuess(precond); HYPRE_StructSMGSetNumPreRelax(precond, n_pre); HYPRE_StructSMGSetNumPostRelax(precond, n_post); HYPRE_StructSMGSetPrintLevel(precond, prec_print_level); HYPRE_StructSMGSetLogging(precond, 0); #if 0 //defined(HYPRE_USING_CUDA) HYPRE_StructSMGSetDeviceLevel(precond, device_level); #endif HYPRE_StructHybridSetPrecond(solver, HYPRE_StructSMGSolve, HYPRE_StructSMGSetup, precond); } else if (solver_id == 21) { /* use symmetric PFMG as preconditioner */ HYPRE_StructPFMGCreate(hypre_MPI_COMM_WORLD, &precond); HYPRE_StructPFMGSetMaxIter(precond, 1); HYPRE_StructPFMGSetTol(precond, 0.0); HYPRE_StructPFMGSetZeroGuess(precond); HYPRE_StructPFMGSetRAPType(precond, rap); HYPRE_StructPFMGSetRelaxType(precond, relax); if (usr_jacobi_weight) { HYPRE_StructPFMGSetJacobiWeight(precond, jacobi_weight); } HYPRE_StructPFMGSetNumPreRelax(precond, n_pre); HYPRE_StructPFMGSetNumPostRelax(precond, n_post); HYPRE_StructPFMGSetSkipRelax(precond, skip); /*HYPRE_StructPFMGSetDxyz(precond, dxyz);*/ HYPRE_StructPFMGSetPrintLevel(precond, prec_print_level); HYPRE_StructPFMGSetLogging(precond, 0); #if 0 //defined(HYPRE_USING_CUDA) HYPRE_StructPFMGSetDeviceLevel(precond, device_level); #endif HYPRE_StructHybridSetPrecond(solver, HYPRE_StructPFMGSolve, HYPRE_StructPFMGSetup, precond); } else if (solver_id == 22) { /* use symmetric SparseMSG as preconditioner */ HYPRE_StructSparseMSGCreate(hypre_MPI_COMM_WORLD, &precond); HYPRE_StructSparseMSGSetJump(precond, jump); HYPRE_StructSparseMSGSetMaxIter(precond, 1); HYPRE_StructSparseMSGSetTol(precond, 0.0); HYPRE_StructSparseMSGSetZeroGuess(precond); HYPRE_StructSparseMSGSetRelaxType(precond, relax); if (usr_jacobi_weight) { HYPRE_StructSparseMSGSetJacobiWeight(precond, jacobi_weight); } HYPRE_StructSparseMSGSetNumPreRelax(precond, n_pre); HYPRE_StructSparseMSGSetNumPostRelax(precond, n_post); HYPRE_StructSparseMSGSetPrintLevel(precond, prec_print_level); HYPRE_StructSparseMSGSetLogging(precond, 0); HYPRE_StructHybridSetPrecond(solver, HYPRE_StructSparseMSGSolve, HYPRE_StructSparseMSGSetup, precond); } HYPRE_StructHybridSetup(solver, A, b, x); hypre_EndTiming(time_index); hypre_PrintTiming("Setup phase times", hypre_MPI_COMM_WORLD); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); time_index = hypre_InitializeTiming("Hybrid Solve"); hypre_BeginTiming(time_index); HYPRE_StructHybridSolve(solver, A, b, x); hypre_EndTiming(time_index); hypre_PrintTiming("Solve phase times", hypre_MPI_COMM_WORLD); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); HYPRE_StructHybridGetNumIterations(solver, &num_iterations); HYPRE_StructHybridGetFinalRelativeResidualNorm(solver, &final_res_norm); HYPRE_StructHybridDestroy(solver); if (solver_id == 20) { HYPRE_StructSMGDestroy(precond); } else if (solver_id == 21) { HYPRE_StructPFMGDestroy(precond); } else if (solver_id == 22) { HYPRE_StructSparseMSGDestroy(precond); } } /*----------------------------------------------------------- * Solve the system using GMRES *-----------------------------------------------------------*/ if ((solver_id > 29) && (solver_id < 40)) { time_index = hypre_InitializeTiming("GMRES Setup"); hypre_BeginTiming(time_index); HYPRE_StructGMRESCreate(hypre_MPI_COMM_WORLD, &solver); HYPRE_GMRESSetKDim( (HYPRE_Solver) solver, 5 ); HYPRE_GMRESSetMaxIter( (HYPRE_Solver)solver, 100 ); HYPRE_GMRESSetTol( (HYPRE_Solver)solver, tol ); HYPRE_GMRESSetRelChange( (HYPRE_Solver)solver, 0 ); HYPRE_GMRESSetPrintLevel( (HYPRE_Solver)solver, solver_print_level ); HYPRE_GMRESSetLogging( (HYPRE_Solver)solver, 1 ); if (solver_id == 30) { /* use symmetric SMG as preconditioner */ HYPRE_StructSMGCreate(hypre_MPI_COMM_WORLD, &precond); HYPRE_StructSMGSetMemoryUse(precond, 0); HYPRE_StructSMGSetMaxIter(precond, 1); HYPRE_StructSMGSetTol(precond, 0.0); HYPRE_StructSMGSetZeroGuess(precond); HYPRE_StructSMGSetNumPreRelax(precond, n_pre); HYPRE_StructSMGSetNumPostRelax(precond, n_post); HYPRE_StructSMGSetPrintLevel(precond, prec_print_level); HYPRE_StructSMGSetLogging(precond, 0); #if 0 //defined(HYPRE_USING_CUDA) HYPRE_StructSMGSetDeviceLevel(precond, device_level); #endif HYPRE_GMRESSetPrecond( (HYPRE_Solver)solver, (HYPRE_PtrToSolverFcn) HYPRE_StructSMGSolve, (HYPRE_PtrToSolverFcn) HYPRE_StructSMGSetup, (HYPRE_Solver)precond); } else if (solver_id == 31) { /* use symmetric PFMG as preconditioner */ HYPRE_StructPFMGCreate(hypre_MPI_COMM_WORLD, &precond); HYPRE_StructPFMGSetMaxIter(precond, 1); HYPRE_StructPFMGSetTol(precond, 0.0); HYPRE_StructPFMGSetZeroGuess(precond); HYPRE_StructPFMGSetRAPType(precond, rap); HYPRE_StructPFMGSetRelaxType(precond, relax); if (usr_jacobi_weight) { HYPRE_StructPFMGSetJacobiWeight(precond, jacobi_weight); } HYPRE_StructPFMGSetNumPreRelax(precond, n_pre); HYPRE_StructPFMGSetNumPostRelax(precond, n_post); HYPRE_StructPFMGSetSkipRelax(precond, skip); /*HYPRE_StructPFMGSetDxyz(precond, dxyz);*/ HYPRE_StructPFMGSetPrintLevel(precond, prec_print_level); HYPRE_StructPFMGSetLogging(precond, 0); #if 0 //defined(HYPRE_USING_CUDA) HYPRE_StructPFMGSetDeviceLevel(precond, device_level); #endif HYPRE_GMRESSetPrecond( (HYPRE_Solver)solver, (HYPRE_PtrToSolverFcn) HYPRE_StructPFMGSolve, (HYPRE_PtrToSolverFcn) HYPRE_StructPFMGSetup, (HYPRE_Solver)precond); } else if (solver_id == 32) { /* use symmetric SparseMSG as preconditioner */ HYPRE_StructSparseMSGCreate(hypre_MPI_COMM_WORLD, &precond); HYPRE_StructSparseMSGSetMaxIter(precond, 1); HYPRE_StructSparseMSGSetJump(precond, jump); HYPRE_StructSparseMSGSetTol(precond, 0.0); HYPRE_StructSparseMSGSetZeroGuess(precond); HYPRE_StructSparseMSGSetRelaxType(precond, relax); if (usr_jacobi_weight) { HYPRE_StructSparseMSGSetJacobiWeight(precond, jacobi_weight); } HYPRE_StructSparseMSGSetNumPreRelax(precond, n_pre); HYPRE_StructSparseMSGSetNumPostRelax(precond, n_post); HYPRE_StructSparseMSGSetPrintLevel(precond, prec_print_level); HYPRE_StructSparseMSGSetLogging(precond, 0); HYPRE_GMRESSetPrecond( (HYPRE_Solver)solver, (HYPRE_PtrToSolverFcn) HYPRE_StructSparseMSGSolve, (HYPRE_PtrToSolverFcn) HYPRE_StructSparseMSGSetup, (HYPRE_Solver)precond); } else if (solver_id == 37) { /* use two-step Jacobi as preconditioner */ HYPRE_StructJacobiCreate(hypre_MPI_COMM_WORLD, &precond); HYPRE_StructJacobiSetMaxIter(precond, 2); HYPRE_StructJacobiSetTol(precond, 0.0); HYPRE_StructJacobiSetZeroGuess(precond); HYPRE_GMRESSetPrecond( (HYPRE_Solver)solver, (HYPRE_PtrToSolverFcn) HYPRE_StructJacobiSolve, (HYPRE_PtrToSolverFcn) HYPRE_StructJacobiSetup, (HYPRE_Solver)precond); } else if (solver_id == 38) { /* use diagonal scaling as preconditioner */ precond = NULL; HYPRE_GMRESSetPrecond( (HYPRE_Solver)solver, (HYPRE_PtrToSolverFcn) HYPRE_StructDiagScale, (HYPRE_PtrToSolverFcn) HYPRE_StructDiagScaleSetup, (HYPRE_Solver)precond); } HYPRE_GMRESSetup ( (HYPRE_Solver)solver, (HYPRE_Matrix)A, (HYPRE_Vector)b, (HYPRE_Vector)x ); hypre_EndTiming(time_index); hypre_PrintTiming("Setup phase times", hypre_MPI_COMM_WORLD); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); time_index = hypre_InitializeTiming("GMRES Solve"); hypre_BeginTiming(time_index); HYPRE_GMRESSolve ( (HYPRE_Solver)solver, (HYPRE_Matrix)A, (HYPRE_Vector)b, (HYPRE_Vector)x); hypre_EndTiming(time_index); hypre_PrintTiming("Solve phase times", hypre_MPI_COMM_WORLD); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); HYPRE_GMRESGetNumIterations( (HYPRE_Solver)solver, &num_iterations); HYPRE_GMRESGetFinalRelativeResidualNorm( (HYPRE_Solver)solver, &final_res_norm); HYPRE_StructGMRESDestroy(solver); if (solver_id == 30) { HYPRE_StructSMGDestroy(precond); } else if (solver_id == 31) { HYPRE_StructPFMGDestroy(precond); } else if (solver_id == 32) { HYPRE_StructSparseMSGDestroy(precond); } else if (solver_id == 37) { HYPRE_StructJacobiDestroy(precond); } } /*----------------------------------------------------------- * Solve the system using BiCGTAB *-----------------------------------------------------------*/ if ((solver_id > 39) && (solver_id < 50)) { time_index = hypre_InitializeTiming("BiCGSTAB Setup"); hypre_BeginTiming(time_index); HYPRE_StructBiCGSTABCreate(hypre_MPI_COMM_WORLD, &solver); HYPRE_BiCGSTABSetMaxIter( (HYPRE_Solver)solver, 100 ); HYPRE_BiCGSTABSetTol( (HYPRE_Solver)solver, tol ); HYPRE_BiCGSTABSetPrintLevel( (HYPRE_Solver)solver, solver_print_level ); HYPRE_BiCGSTABSetLogging( (HYPRE_Solver)solver, 1 ); if (solver_id == 40) { /* use symmetric SMG as preconditioner */ HYPRE_StructSMGCreate(hypre_MPI_COMM_WORLD, &precond); HYPRE_StructSMGSetMemoryUse(precond, 0); HYPRE_StructSMGSetMaxIter(precond, 1); HYPRE_StructSMGSetTol(precond, 0.0); HYPRE_StructSMGSetZeroGuess(precond); HYPRE_StructSMGSetNumPreRelax(precond, n_pre); HYPRE_StructSMGSetNumPostRelax(precond, n_post); HYPRE_StructSMGSetPrintLevel(precond, prec_print_level); HYPRE_StructSMGSetLogging(precond, 0); #if 0 //defined(HYPRE_USING_CUDA) HYPRE_StructSMGSetDeviceLevel(precond, device_level); #endif HYPRE_BiCGSTABSetPrecond( (HYPRE_Solver)solver, (HYPRE_PtrToSolverFcn) HYPRE_StructSMGSolve, (HYPRE_PtrToSolverFcn) HYPRE_StructSMGSetup, (HYPRE_Solver)precond); } else if (solver_id == 41) { /* use symmetric PFMG as preconditioner */ HYPRE_StructPFMGCreate(hypre_MPI_COMM_WORLD, &precond); HYPRE_StructPFMGSetMaxIter(precond, 1); HYPRE_StructPFMGSetTol(precond, 0.0); HYPRE_StructPFMGSetZeroGuess(precond); HYPRE_StructPFMGSetRAPType(precond, rap); HYPRE_StructPFMGSetRelaxType(precond, relax); if (usr_jacobi_weight) { HYPRE_StructPFMGSetJacobiWeight(precond, jacobi_weight); } HYPRE_StructPFMGSetNumPreRelax(precond, n_pre); HYPRE_StructPFMGSetNumPostRelax(precond, n_post); HYPRE_StructPFMGSetSkipRelax(precond, skip); /*HYPRE_StructPFMGSetDxyz(precond, dxyz);*/ HYPRE_StructPFMGSetPrintLevel(precond, prec_print_level); HYPRE_StructPFMGSetLogging(precond, 0); #if 0 //defined(HYPRE_USING_CUDA) HYPRE_StructPFMGSetDeviceLevel(precond, device_level); #endif HYPRE_BiCGSTABSetPrecond( (HYPRE_Solver)solver, (HYPRE_PtrToSolverFcn) HYPRE_StructPFMGSolve, (HYPRE_PtrToSolverFcn) HYPRE_StructPFMGSetup, (HYPRE_Solver)precond); } else if (solver_id == 42) { /* use symmetric SparseMSG as preconditioner */ HYPRE_StructSparseMSGCreate(hypre_MPI_COMM_WORLD, &precond); HYPRE_StructSparseMSGSetMaxIter(precond, 1); HYPRE_StructSparseMSGSetJump(precond, jump); HYPRE_StructSparseMSGSetTol(precond, 0.0); HYPRE_StructSparseMSGSetZeroGuess(precond); HYPRE_StructSparseMSGSetRelaxType(precond, relax); if (usr_jacobi_weight) { HYPRE_StructSparseMSGSetJacobiWeight(precond, jacobi_weight); } HYPRE_StructSparseMSGSetNumPreRelax(precond, n_pre); HYPRE_StructSparseMSGSetNumPostRelax(precond, n_post); HYPRE_StructSparseMSGSetPrintLevel(precond, prec_print_level); HYPRE_StructSparseMSGSetLogging(precond, 0); HYPRE_BiCGSTABSetPrecond( (HYPRE_Solver)solver, (HYPRE_PtrToSolverFcn) HYPRE_StructSparseMSGSolve, (HYPRE_PtrToSolverFcn) HYPRE_StructSparseMSGSetup, (HYPRE_Solver)precond); } else if (solver_id == 47) { /* use two-step Jacobi as preconditioner */ HYPRE_StructJacobiCreate(hypre_MPI_COMM_WORLD, &precond); HYPRE_StructJacobiSetMaxIter(precond, 2); HYPRE_StructJacobiSetTol(precond, 0.0); HYPRE_StructJacobiSetZeroGuess(precond); HYPRE_BiCGSTABSetPrecond( (HYPRE_Solver)solver, (HYPRE_PtrToSolverFcn) HYPRE_StructJacobiSolve, (HYPRE_PtrToSolverFcn) HYPRE_StructJacobiSetup, (HYPRE_Solver)precond); } else if (solver_id == 48) { /* use diagonal scaling as preconditioner */ precond = NULL; HYPRE_BiCGSTABSetPrecond( (HYPRE_Solver)solver, (HYPRE_PtrToSolverFcn) HYPRE_StructDiagScale, (HYPRE_PtrToSolverFcn) HYPRE_StructDiagScaleSetup, (HYPRE_Solver)precond); } HYPRE_BiCGSTABSetup ( (HYPRE_Solver)solver, (HYPRE_Matrix)A, (HYPRE_Vector)b, (HYPRE_Vector)x ); hypre_EndTiming(time_index); hypre_PrintTiming("Setup phase times", hypre_MPI_COMM_WORLD); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); time_index = hypre_InitializeTiming("BiCGSTAB Solve"); hypre_BeginTiming(time_index); HYPRE_BiCGSTABSolve ( (HYPRE_Solver)solver, (HYPRE_Matrix)A, (HYPRE_Vector)b, (HYPRE_Vector)x); hypre_EndTiming(time_index); hypre_PrintTiming("Solve phase times", hypre_MPI_COMM_WORLD); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); HYPRE_BiCGSTABGetNumIterations( (HYPRE_Solver)solver, &num_iterations); HYPRE_BiCGSTABGetFinalRelativeResidualNorm( (HYPRE_Solver)solver, &final_res_norm); HYPRE_StructBiCGSTABDestroy(solver); if (solver_id == 40) { HYPRE_StructSMGDestroy(precond); } else if (solver_id == 41) { HYPRE_StructPFMGDestroy(precond); } else if (solver_id == 42) { HYPRE_StructSparseMSGDestroy(precond); } else if (solver_id == 47) { HYPRE_StructJacobiDestroy(precond); } } /*----------------------------------------------------------- * Solve the system using LGMRES *-----------------------------------------------------------*/ if ((solver_id > 49) && (solver_id < 60)) { time_index = hypre_InitializeTiming("LGMRES Setup"); hypre_BeginTiming(time_index); HYPRE_StructLGMRESCreate(hypre_MPI_COMM_WORLD, &solver); HYPRE_LGMRESSetKDim( (HYPRE_Solver) solver, 5 ); HYPRE_LGMRESSetMaxIter( (HYPRE_Solver)solver, 100 ); HYPRE_LGMRESSetTol( (HYPRE_Solver)solver, tol ); HYPRE_LGMRESSetPrintLevel( (HYPRE_Solver)solver, solver_print_level ); HYPRE_LGMRESSetLogging( (HYPRE_Solver)solver, 1 ); if (solver_id == 50) { /* use symmetric SMG as preconditioner */ HYPRE_StructSMGCreate(hypre_MPI_COMM_WORLD, &precond); HYPRE_StructSMGSetMemoryUse(precond, 0); HYPRE_StructSMGSetMaxIter(precond, 1); HYPRE_StructSMGSetTol(precond, 0.0); HYPRE_StructSMGSetZeroGuess(precond); HYPRE_StructSMGSetNumPreRelax(precond, n_pre); HYPRE_StructSMGSetNumPostRelax(precond, n_post); HYPRE_StructSMGSetPrintLevel(precond, prec_print_level); HYPRE_StructSMGSetLogging(precond, 0); #if 0 //defined(HYPRE_USING_CUDA) HYPRE_StructSMGSetDeviceLevel(precond, device_level); #endif HYPRE_LGMRESSetPrecond( (HYPRE_Solver)solver, (HYPRE_PtrToSolverFcn) HYPRE_StructSMGSolve, (HYPRE_PtrToSolverFcn) HYPRE_StructSMGSetup, (HYPRE_Solver)precond); } else if (solver_id == 51) { /* use symmetric PFMG as preconditioner */ HYPRE_StructPFMGCreate(hypre_MPI_COMM_WORLD, &precond); HYPRE_StructPFMGSetMaxIter(precond, 1); HYPRE_StructPFMGSetTol(precond, 0.0); HYPRE_StructPFMGSetZeroGuess(precond); HYPRE_StructPFMGSetRAPType(precond, rap); HYPRE_StructPFMGSetRelaxType(precond, relax); if (usr_jacobi_weight) { HYPRE_StructPFMGSetJacobiWeight(precond, jacobi_weight); } HYPRE_StructPFMGSetNumPreRelax(precond, n_pre); HYPRE_StructPFMGSetNumPostRelax(precond, n_post); HYPRE_StructPFMGSetSkipRelax(precond, skip); /*HYPRE_StructPFMGSetDxyz(precond, dxyz);*/ HYPRE_StructPFMGSetPrintLevel(precond, prec_print_level); HYPRE_StructPFMGSetLogging(precond, 0); #if 0 //defined(HYPRE_USING_CUDA) HYPRE_StructPFMGSetDeviceLevel(precond, device_level); #endif HYPRE_LGMRESSetPrecond( (HYPRE_Solver)solver, (HYPRE_PtrToSolverFcn) HYPRE_StructPFMGSolve, (HYPRE_PtrToSolverFcn) HYPRE_StructPFMGSetup, (HYPRE_Solver)precond); } HYPRE_LGMRESSetup ( (HYPRE_Solver)solver, (HYPRE_Matrix)A, (HYPRE_Vector)b, (HYPRE_Vector)x ); hypre_EndTiming(time_index); hypre_PrintTiming("Setup phase times", hypre_MPI_COMM_WORLD); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); time_index = hypre_InitializeTiming("LGMRES Solve"); hypre_BeginTiming(time_index); HYPRE_LGMRESSolve ( (HYPRE_Solver)solver, (HYPRE_Matrix)A, (HYPRE_Vector)b, (HYPRE_Vector)x); hypre_EndTiming(time_index); hypre_PrintTiming("Solve phase times", hypre_MPI_COMM_WORLD); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); HYPRE_LGMRESGetNumIterations( (HYPRE_Solver)solver, &num_iterations); HYPRE_LGMRESGetFinalRelativeResidualNorm( (HYPRE_Solver)solver, &final_res_norm); HYPRE_StructLGMRESDestroy(solver); if (solver_id == 50) { HYPRE_StructSMGDestroy(precond); } else if (solver_id == 51) { HYPRE_StructPFMGDestroy(precond); } } /*----------------------------------------------------------- * Solve the system using FlexGMRES *-----------------------------------------------------------*/ if ((solver_id > 59) && (solver_id < 70)) { time_index = hypre_InitializeTiming("FlexGMRES Setup"); hypre_BeginTiming(time_index); HYPRE_StructFlexGMRESCreate(hypre_MPI_COMM_WORLD, &solver); HYPRE_FlexGMRESSetKDim( (HYPRE_Solver) solver, 5 ); HYPRE_FlexGMRESSetMaxIter( (HYPRE_Solver)solver, 100 ); HYPRE_FlexGMRESSetTol( (HYPRE_Solver)solver, tol ); HYPRE_FlexGMRESSetPrintLevel( (HYPRE_Solver)solver, solver_print_level ); HYPRE_FlexGMRESSetLogging( (HYPRE_Solver)solver, 1 ); if (solver_id == 60) { /* use symmetric SMG as preconditioner */ HYPRE_StructSMGCreate(hypre_MPI_COMM_WORLD, &precond); HYPRE_StructSMGSetMemoryUse(precond, 0); HYPRE_StructSMGSetMaxIter(precond, 1); HYPRE_StructSMGSetTol(precond, 0.0); HYPRE_StructSMGSetZeroGuess(precond); HYPRE_StructSMGSetNumPreRelax(precond, n_pre); HYPRE_StructSMGSetNumPostRelax(precond, n_post); HYPRE_StructSMGSetPrintLevel(precond, prec_print_level); HYPRE_StructSMGSetLogging(precond, 0); #if 0 //defined(HYPRE_USING_CUDA) HYPRE_StructSMGSetDeviceLevel(precond, device_level); #endif HYPRE_FlexGMRESSetPrecond( (HYPRE_Solver)solver, (HYPRE_PtrToSolverFcn) HYPRE_StructSMGSolve, (HYPRE_PtrToSolverFcn) HYPRE_StructSMGSetup, (HYPRE_Solver)precond); } else if (solver_id == 61) { /* use symmetric PFMG as preconditioner */ HYPRE_StructPFMGCreate(hypre_MPI_COMM_WORLD, &precond); HYPRE_StructPFMGSetMaxIter(precond, 1); HYPRE_StructPFMGSetTol(precond, 0.0); HYPRE_StructPFMGSetZeroGuess(precond); HYPRE_StructPFMGSetRAPType(precond, rap); HYPRE_StructPFMGSetRelaxType(precond, relax); if (usr_jacobi_weight) { HYPRE_StructPFMGSetJacobiWeight(precond, jacobi_weight); } HYPRE_StructPFMGSetNumPreRelax(precond, n_pre); HYPRE_StructPFMGSetNumPostRelax(precond, n_post); HYPRE_StructPFMGSetSkipRelax(precond, skip); /*HYPRE_StructPFMGSetDxyz(precond, dxyz);*/ HYPRE_StructPFMGSetPrintLevel(precond, prec_print_level); HYPRE_StructPFMGSetLogging(precond, 0); #if 0 //defined(HYPRE_USING_CUDA) HYPRE_StructPFMGSetDeviceLevel(precond, device_level); #endif HYPRE_FlexGMRESSetPrecond( (HYPRE_Solver)solver, (HYPRE_PtrToSolverFcn) HYPRE_StructPFMGSolve, (HYPRE_PtrToSolverFcn) HYPRE_StructPFMGSetup, (HYPRE_Solver)precond); } HYPRE_FlexGMRESSetup ( (HYPRE_Solver)solver, (HYPRE_Matrix)A, (HYPRE_Vector)b, (HYPRE_Vector)x ); hypre_EndTiming(time_index); hypre_PrintTiming("Setup phase times", hypre_MPI_COMM_WORLD); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); time_index = hypre_InitializeTiming("FlexGMRES Solve"); hypre_BeginTiming(time_index); HYPRE_FlexGMRESSolve ( (HYPRE_Solver)solver, (HYPRE_Matrix)A, (HYPRE_Vector)b, (HYPRE_Vector)x); hypre_EndTiming(time_index); hypre_PrintTiming("Solve phase times", hypre_MPI_COMM_WORLD); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); HYPRE_FlexGMRESGetNumIterations( (HYPRE_Solver)solver, &num_iterations); HYPRE_FlexGMRESGetFinalRelativeResidualNorm( (HYPRE_Solver)solver, &final_res_norm); HYPRE_StructFlexGMRESDestroy(solver); if (solver_id == 60) { HYPRE_StructSMGDestroy(precond); } else if (solver_id == 61) { HYPRE_StructPFMGDestroy(precond); } } /*----------------------------------------------------------- * Print the solution and other info *-----------------------------------------------------------*/ if (print_system) { HYPRE_StructVectorPrint("struct.out.x", x, 0); } if (myid == 0 && rep == reps - 1 /* begin lobpcg */ && !lobpcgFlag /* end lobpcg */) { hypre_printf("\n"); hypre_printf("Iterations = %d\n", num_iterations); hypre_printf("Final Relative Residual Norm = %e\n", final_res_norm); hypre_printf("\n"); } #endif /*----------------------------------------------------------- * Compute MFLOPs for Matvec *-----------------------------------------------------------*/ #if HYPRE_MFLOPS { void *matvec_data; HYPRE_Int i, imax, N; /* compute imax */ N = (P * nx) * (Q * ny) * (R * nz); imax = (5 * 1000000) / N; matvec_data = hypre_StructMatvecCreate(); hypre_StructMatvecSetup(matvec_data, A, x); time_index = hypre_InitializeTiming("Matvec"); hypre_BeginTiming(time_index); for (i = 0; i < imax; i++) { hypre_StructMatvecCompute(matvec_data, 1.0, A, x, 1.0, b); } /* this counts mult-adds */ hypre_IncFLOPCount(7 * N * imax); hypre_EndTiming(time_index); hypre_PrintTiming("Matvec time", hypre_MPI_COMM_WORLD); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); hypre_StructMatvecDestroy(matvec_data); } #endif /*----------------------------------------------------------- * Finalize things *-----------------------------------------------------------*/ HYPRE_StructStencilDestroy(stencil); HYPRE_StructMatrixDestroy(A); HYPRE_StructVectorDestroy(b); HYPRE_StructVectorDestroy(x); for ( i = 0; i < (dim + 1); i++) { hypre_TFree(offsets[i], HYPRE_MEMORY_HOST); } hypre_TFree(offsets, HYPRE_MEMORY_HOST); } #if defined(HYPRE_USING_KOKKOS) Kokkos::finalize (); #endif /* Finalize Hypre */ HYPRE_Finalize(); /* Finalize MPI */ hypre_MPI_Finalize(); #if defined(HYPRE_USING_MEMORY_TRACKER) if (memory_location == HYPRE_MEMORY_HOST) { if (hypre_total_bytes[hypre_MEMORY_DEVICE] || hypre_total_bytes[hypre_MEMORY_UNIFIED]) { hypre_printf("Error: nonzero GPU memory allocated with the HOST mode\n"); hypre_assert(0); } } #endif #if defined(HYPRE_USING_DEVICE_OPENMP) /* use this for the stats of the offloading counts */ //HYPRE_OMPOffloadStatPrint(); #endif return (0); } /*------------------------------------------------------------------------- * add constant values to a vector. Need to pass the initialized vector, grid, * period of grid and the constant value. *-------------------------------------------------------------------------*/ HYPRE_Int AddValuesVector( hypre_StructGrid *gridvector, hypre_StructVector *zvector, HYPRE_Int *period, HYPRE_Real value ) { /* #include "_hypre_struct_mv.h" */ HYPRE_Int i, ierr = 0; hypre_BoxArray *gridboxes; HYPRE_Int ib; hypre_IndexRef ilower; hypre_IndexRef iupper; hypre_Box *box; HYPRE_Real *values; HYPRE_Real *values_h; HYPRE_Int volume, dim; HYPRE_MemoryLocation memory_location = hypre_StructVectorMemoryLocation(zvector); gridboxes = hypre_StructGridBoxes(gridvector); dim = hypre_StructGridNDim(gridvector); ib = 0; hypre_ForBoxI(ib, gridboxes) { box = hypre_BoxArrayBox(gridboxes, ib); volume = hypre_BoxVolume(box); values = hypre_CTAlloc(HYPRE_Real, volume, memory_location); values_h = hypre_CTAlloc(HYPRE_Real, volume, HYPRE_MEMORY_HOST); /*----------------------------------------------------------- * For periodic b.c. in all directions, need rhs to satisfy * compatibility condition. Achieved by setting a source and * sink of equal strength. All other problems have rhs = 1. *-----------------------------------------------------------*/ if ((dim == 2 && period[0] != 0 && period[1] != 0) || (dim == 3 && period[0] != 0 && period[1] != 0 && period[2] != 0)) { values_h[0] = value; values_h[volume - 1] = -value; } else { for (i = 0; i < volume; i++) { values_h[i] = value; } } hypre_TMemcpy(values, values_h, HYPRE_Real, volume, memory_location, HYPRE_MEMORY_HOST); ilower = hypre_BoxIMin(box); iupper = hypre_BoxIMax(box); HYPRE_StructVectorSetBoxValues(zvector, ilower, iupper, values); hypre_TFree(values, memory_location); hypre_TFree(values_h, HYPRE_MEMORY_HOST); } return ierr; } /****************************************************************************** * Adds values to matrix based on a 7 point (3d) * symmetric stencil for a convection-diffusion problem. * It need an initialized matrix, an assembled grid, and the constants * that determine the 7 point (3d) convection-diffusion. ******************************************************************************/ HYPRE_Int AddValuesMatrix(HYPRE_StructMatrix A, HYPRE_StructGrid gridmatrix, HYPRE_Real cx, HYPRE_Real cy, HYPRE_Real cz, HYPRE_Real conx, HYPRE_Real cony, HYPRE_Real conz) { HYPRE_Int d, ierr = 0; hypre_BoxArray *gridboxes; HYPRE_Int s, bi; hypre_IndexRef ilower; hypre_IndexRef iupper; hypre_Box *box; HYPRE_Real *values; HYPRE_Real *values_h; HYPRE_Real east, west; HYPRE_Real north, south; HYPRE_Real top, bottom; HYPRE_Real center; HYPRE_Int volume, dim, sym; HYPRE_Int *stencil_indices; HYPRE_Int stencil_size; HYPRE_Int constant_coefficient; HYPRE_MemoryLocation memory_location = hypre_StructMatrixMemoryLocation(A); gridboxes = hypre_StructGridBoxes(gridmatrix); dim = hypre_StructGridNDim(gridmatrix); sym = hypre_StructMatrixSymmetric(A); constant_coefficient = hypre_StructMatrixConstantCoefficient(A); bi = 0; east = -cx; west = -cx; north = -cy; south = -cy; top = -cz; bottom = -cz; center = 2.0 * cx; if (dim > 1) { center += 2.0 * cy; } if (dim > 2) { center += 2.0 * cz; } stencil_size = 1 + (2 - sym) * dim; stencil_indices = hypre_CTAlloc(HYPRE_Int, stencil_size, HYPRE_MEMORY_HOST); for (s = 0; s < stencil_size; s++) { stencil_indices[s] = s; } if (sym) { if ( constant_coefficient == 0 ) { hypre_ForBoxI(bi, gridboxes) { box = hypre_BoxArrayBox(gridboxes, bi); volume = hypre_BoxVolume(box); values = hypre_CTAlloc(HYPRE_Real, stencil_size * volume, memory_location); values_h = hypre_CTAlloc(HYPRE_Real, stencil_size * volume, HYPRE_MEMORY_HOST); if (dim == 1) { for (d = 0; d < volume; d++) { HYPRE_Int i = stencil_size * d; values_h[i] = west; values_h[i + 1] = center; } } else if (dim == 2) { for (d = 0; d < volume; d++) { HYPRE_Int i = stencil_size * d; values_h[i] = west; values_h[i + 1] = south; values_h[i + 2] = center; } } else if (dim == 3) { for (d = 0; d < volume; d++) { HYPRE_Int i = stencil_size * d; values_h[i] = west; values_h[i + 1] = south; values_h[i + 2] = bottom; values_h[i + 3] = center; } } hypre_TMemcpy(values, values_h, HYPRE_Real, stencil_size * volume, memory_location, HYPRE_MEMORY_HOST); ilower = hypre_BoxIMin(box); iupper = hypre_BoxIMax(box); HYPRE_StructMatrixSetBoxValues(A, ilower, iupper, stencil_size, stencil_indices, values); hypre_TFree(values, memory_location); hypre_TFree(values_h, HYPRE_MEMORY_HOST); } } else if ( constant_coefficient == 1 ) { values = hypre_CTAlloc(HYPRE_Real, stencil_size, HYPRE_MEMORY_HOST); switch (dim) { case 1: values[0] = west; values[1] = center; break; case 2: values[0] = west; values[1] = south; values[2] = center; break; case 3: values[0] = west; values[1] = south; values[2] = bottom; values[3] = center; break; } if (hypre_BoxArraySize(gridboxes) > 0) { HYPRE_StructMatrixSetConstantValues(A, stencil_size, stencil_indices, values); } hypre_TFree(values, HYPRE_MEMORY_HOST); } else { hypre_assert( constant_coefficient == 2 ); /* stencil index for the center equals dim, so it's easy to leave out */ values = hypre_CTAlloc(HYPRE_Real, stencil_size - 1, HYPRE_MEMORY_HOST); switch (dim) { case 1: values[0] = west; break; case 2: values[0] = west; values[1] = south; break; case 3: values[0] = west; values[1] = south; values[2] = bottom; break; } if (hypre_BoxArraySize(gridboxes) > 0) { HYPRE_StructMatrixSetConstantValues(A, stencil_size - 1, stencil_indices, values); } hypre_TFree(values, HYPRE_MEMORY_HOST); hypre_ForBoxI(bi, gridboxes) { box = hypre_BoxArrayBox(gridboxes, bi); volume = hypre_BoxVolume(box); values = hypre_CTAlloc(HYPRE_Real, volume, memory_location); values_h = hypre_CTAlloc(HYPRE_Real, volume, HYPRE_MEMORY_HOST); HYPRE_Int i; for (i = 0; i < volume; i++) { values_h[i] = center; } hypre_TMemcpy(values, values_h, HYPRE_Real, volume, memory_location, HYPRE_MEMORY_HOST); ilower = hypre_BoxIMin(box); iupper = hypre_BoxIMax(box); HYPRE_StructMatrixSetBoxValues(A, ilower, iupper, 1, stencil_indices + dim, values); hypre_TFree(values, memory_location); hypre_TFree(values_h, HYPRE_MEMORY_HOST); } } } else { if (conx > 0.0) { west -= conx; center += conx; } else if (conx < 0.0) { east += conx; center -= conx; } if (cony > 0.0) { south -= cony; center += cony; } else if (cony < 0.0) { north += cony; center -= cony; } if (conz > 0.0) { bottom -= conz; center += conz; } else if (cony < 0.0) { top += conz; center -= conz; } if ( constant_coefficient == 0 ) { hypre_ForBoxI(bi, gridboxes) { box = hypre_BoxArrayBox(gridboxes, bi); volume = hypre_BoxVolume(box); values = hypre_CTAlloc(HYPRE_Real, stencil_size * volume, memory_location); values_h = hypre_CTAlloc(HYPRE_Real, stencil_size * volume, HYPRE_MEMORY_HOST); for (d = 0; d < volume; d++) { HYPRE_Int i = stencil_size * d; switch (dim) { case 1: values_h[i] = west; values_h[i + 1] = center; values_h[i + 2] = east; break; case 2: values_h[i] = west; values_h[i + 1] = south; values_h[i + 2] = center; values_h[i + 3] = east; values_h[i + 4] = north; break; case 3: values_h[i] = west; values_h[i + 1] = south; values_h[i + 2] = bottom; values_h[i + 3] = center; values_h[i + 4] = east; values_h[i + 5] = north; values_h[i + 6] = top; break; } } hypre_TMemcpy(values, values_h, HYPRE_Real, stencil_size * volume, memory_location, HYPRE_MEMORY_HOST); ilower = hypre_BoxIMin(box); iupper = hypre_BoxIMax(box); HYPRE_StructMatrixSetBoxValues(A, ilower, iupper, stencil_size, stencil_indices, values); hypre_TFree(values, memory_location); hypre_TFree(values_h, HYPRE_MEMORY_HOST); } } else if ( constant_coefficient == 1 ) { values = hypre_CTAlloc( HYPRE_Real, stencil_size, HYPRE_MEMORY_HOST); switch (dim) { case 1: values[0] = west; values[1] = center; values[2] = east; break; case 2: values[0] = west; values[1] = south; values[2] = center; values[3] = east; values[4] = north; break; case 3: values[0] = west; values[1] = south; values[2] = bottom; values[3] = center; values[4] = east; values[5] = north; values[6] = top; break; } if (hypre_BoxArraySize(gridboxes) > 0) { HYPRE_StructMatrixSetConstantValues(A, stencil_size, stencil_indices, values); } hypre_TFree(values, HYPRE_MEMORY_HOST); } else { hypre_assert( constant_coefficient == 2 ); values = hypre_CTAlloc( HYPRE_Real, stencil_size - 1, HYPRE_MEMORY_HOST); switch (dim) { /* no center in stencil_indices and values */ case 1: stencil_indices[0] = 0; stencil_indices[1] = 2; values[0] = west; values[1] = east; break; case 2: stencil_indices[0] = 0; stencil_indices[1] = 1; stencil_indices[2] = 3; stencil_indices[3] = 4; values[0] = west; values[1] = south; values[2] = east; values[3] = north; break; case 3: stencil_indices[0] = 0; stencil_indices[1] = 1; stencil_indices[2] = 2; stencil_indices[3] = 4; stencil_indices[4] = 5; stencil_indices[5] = 6; values[0] = west; values[1] = south; values[2] = bottom; values[3] = east; values[4] = north; values[5] = top; break; } if (hypre_BoxArraySize(gridboxes) > 0) { HYPRE_StructMatrixSetConstantValues(A, stencil_size, stencil_indices, values); } hypre_TFree(values, HYPRE_MEMORY_HOST); /* center is variable */ stencil_indices[0] = dim; /* refers to center */ hypre_ForBoxI(bi, gridboxes) { box = hypre_BoxArrayBox(gridboxes, bi); volume = hypre_BoxVolume(box); values = hypre_CTAlloc(HYPRE_Real, volume, memory_location); values_h = hypre_CTAlloc(HYPRE_Real, volume, HYPRE_MEMORY_HOST); HYPRE_Int i; for (i = 0; i < volume; i++) { values_h[i] = center; } hypre_TMemcpy(values, values_h, HYPRE_Real, volume, memory_location, HYPRE_MEMORY_HOST); ilower = hypre_BoxIMin(box); iupper = hypre_BoxIMax(box); HYPRE_StructMatrixSetBoxValues(A, ilower, iupper, 1, stencil_indices, values); hypre_TFree(values, memory_location); hypre_TFree(values_h, HYPRE_MEMORY_HOST); } } } hypre_TFree(stencil_indices, HYPRE_MEMORY_HOST); return ierr; } /********************************************************************************* * this function sets to zero the stencil entries that are on the boundary * Grid, matrix and the period are needed. *********************************************************************************/ HYPRE_Int SetStencilBndry(HYPRE_StructMatrix A, HYPRE_StructGrid gridmatrix, HYPRE_Int *period) { HYPRE_Int ierr = 0; hypre_BoxArray *gridboxes; HYPRE_Int size, i, j, d, ib; HYPRE_Int **ilower; HYPRE_Int **iupper; HYPRE_Int *vol; HYPRE_Int *istart, *iend; hypre_Box *box; hypre_Box *dummybox; hypre_Box *boundingbox; HYPRE_Real *values; HYPRE_Int volume, dim; HYPRE_Int *stencil_indices; HYPRE_Int constant_coefficient; HYPRE_MemoryLocation memory_location = hypre_StructMatrixMemoryLocation(A); gridboxes = hypre_StructGridBoxes(gridmatrix); boundingbox = hypre_StructGridBoundingBox(gridmatrix); istart = hypre_BoxIMin(boundingbox); iend = hypre_BoxIMax(boundingbox); size = hypre_StructGridNumBoxes(gridmatrix); dim = hypre_StructGridNDim(gridmatrix); stencil_indices = hypre_CTAlloc(HYPRE_Int, 1, HYPRE_MEMORY_HOST); constant_coefficient = hypre_StructMatrixConstantCoefficient(A); if ( constant_coefficient > 0 ) { return 1; } /*...no space dependence if constant_coefficient==1, and space dependence only for diagonal if constant_coefficient==2 -- and this function only touches off-diagonal entries */ vol = hypre_CTAlloc(HYPRE_Int, size, HYPRE_MEMORY_HOST); ilower = hypre_CTAlloc(HYPRE_Int*, size, HYPRE_MEMORY_HOST); iupper = hypre_CTAlloc(HYPRE_Int*, size, HYPRE_MEMORY_HOST); for (i = 0; i < size; i++) { ilower[i] = hypre_CTAlloc(HYPRE_Int, dim, HYPRE_MEMORY_HOST); iupper[i] = hypre_CTAlloc(HYPRE_Int, dim, HYPRE_MEMORY_HOST); } i = 0; ib = 0; hypre_ForBoxI(i, gridboxes) { dummybox = hypre_BoxCreate(dim); box = hypre_BoxArrayBox(gridboxes, i); volume = hypre_BoxVolume(box); vol[i] = volume; hypre_CopyBox(box, dummybox); for (d = 0; d < dim; d++) { ilower[ib][d] = hypre_BoxIMinD(dummybox, d); iupper[ib][d] = hypre_BoxIMaxD(dummybox, d); } ib++ ; hypre_BoxDestroy(dummybox); } if ( constant_coefficient == 0 ) { for (d = 0; d < dim; d++) { for (ib = 0; ib < size; ib++) { values = hypre_CTAlloc(HYPRE_Real, vol[ib], memory_location); if ( ilower[ib][d] == istart[d] && period[d] == 0 ) { j = iupper[ib][d]; iupper[ib][d] = istart[d]; stencil_indices[0] = d; HYPRE_StructMatrixSetBoxValues(A, ilower[ib], iupper[ib], 1, stencil_indices, values); iupper[ib][d] = j; } if ( iupper[ib][d] == iend[d] && period[d] == 0 ) { j = ilower[ib][d]; ilower[ib][d] = iend[d]; stencil_indices[0] = dim + 1 + d; HYPRE_StructMatrixSetBoxValues(A, ilower[ib], iupper[ib], 1, stencil_indices, values); ilower[ib][d] = j; } hypre_TFree(values, memory_location); } } } hypre_TFree(vol, HYPRE_MEMORY_HOST); hypre_TFree(stencil_indices, HYPRE_MEMORY_HOST); for (ib = 0 ; ib < size ; ib++) { hypre_TFree(ilower[ib], HYPRE_MEMORY_HOST); hypre_TFree(iupper[ib], HYPRE_MEMORY_HOST); } hypre_TFree(ilower, HYPRE_MEMORY_HOST); hypre_TFree(iupper, HYPRE_MEMORY_HOST); return ierr; } hypre-2.33.0/src/test/struct_migrate.c000066400000000000000000000361321477326011500177070ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include #include #include #include "_hypre_utilities.h" #include "HYPRE_struct_mv.h" /* RDF: This include is only needed for AddValuesVector() */ #include "_hypre_struct_mv.h" HYPRE_Int AddValuesVector( hypre_StructGrid *grid, hypre_StructVector *vector, HYPRE_Real value ); /*-------------------------------------------------------------------------- * Test driver for structured matrix interface (structured storage) *--------------------------------------------------------------------------*/ /*---------------------------------------------------------------------- * Standard 7-point laplacian in 3D with grid and anisotropy determined * as command line arguments. Do `driver -help' for usage info. *----------------------------------------------------------------------*/ hypre_int main( hypre_int argc, char *argv[] ) { HYPRE_Int arg_index; HYPRE_Int print_usage; HYPRE_Int nx, ny, nz; HYPRE_Int P, Q, R; HYPRE_Int bx, by, bz; HYPRE_StructGrid from_grid, to_grid; HYPRE_StructVector from_vector, to_vector, check_vector; HYPRE_CommPkg comm_pkg; HYPRE_Int time_index; HYPRE_Int num_procs, myid; HYPRE_Int p, q, r; HYPRE_Int dim; HYPRE_Int nblocks = 0; HYPRE_Int **ilower, **iupper, **iupper2; HYPRE_Int istart[3]; HYPRE_Int i, ix, iy, iz, ib; HYPRE_Int print_system = 0; HYPRE_Real check; /*----------------------------------------------------------- * Initialize some stuff *-----------------------------------------------------------*/ /* Initialize MPI */ hypre_MPI_Init(&argc, &argv); hypre_MPI_Comm_size(hypre_MPI_COMM_WORLD, &num_procs ); hypre_MPI_Comm_rank(hypre_MPI_COMM_WORLD, &myid ); /*----------------------------------------------------------------- * GPU Device binding * Must be done before HYPRE_Initialize() and should not be changed after *-----------------------------------------------------------------*/ hypre_bind_device_id(-1, myid, num_procs, hypre_MPI_COMM_WORLD); /*----------------------------------------------------------- * Initialize : must be the first HYPRE function to call *-----------------------------------------------------------*/ HYPRE_Initialize(); HYPRE_DeviceInitialize(); #if defined(HYPRE_USING_KOKKOS) Kokkos::initialize (argc, argv); #endif /*----------------------------------------------------------- * Set defaults *-----------------------------------------------------------*/ dim = 3; nx = 2; ny = 2; nz = 2; P = num_procs; Q = 1; R = 1; p = q = r = 1; bx = 1; by = 1; bz = 1; istart[0] = 1; istart[1] = 1; istart[2] = 1; /*----------------------------------------------------------- * Parse command line *-----------------------------------------------------------*/ print_usage = 0; arg_index = 1; while (arg_index < argc) { if ( strcmp(argv[arg_index], "-n") == 0 ) { arg_index++; nx = atoi(argv[arg_index++]); ny = atoi(argv[arg_index++]); nz = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-istart") == 0 ) { arg_index++; istart[0] = atoi(argv[arg_index++]); istart[1] = atoi(argv[arg_index++]); istart[2] = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-P") == 0 ) { arg_index++; P = atoi(argv[arg_index++]); Q = atoi(argv[arg_index++]); R = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-b") == 0 ) { arg_index++; bx = atoi(argv[arg_index++]); by = atoi(argv[arg_index++]); bz = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-d") == 0 ) { arg_index++; dim = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-print") == 0 ) { arg_index++; print_system = 1; } else if ( strcmp(argv[arg_index], "-help") == 0 ) { print_usage = 1; break; } else { arg_index++; } } /*----------------------------------------------------------- * Print usage info *-----------------------------------------------------------*/ if ( (print_usage) && (myid == 0) ) { hypre_printf("\n"); hypre_printf("Usage: %s []\n", argv[0]); hypre_printf("\n"); hypre_printf(" -n : problem size per block\n"); hypre_printf(" -istart : start of box\n"); hypre_printf(" -P : processor topology\n"); hypre_printf(" -b : blocking per processor\n"); hypre_printf(" -d : problem dimension (2 or 3)\n"); hypre_printf(" -print : print vectors\n"); hypre_printf("\n"); } if ( print_usage ) { exit(1); } /*----------------------------------------------------------- * Check a few things *-----------------------------------------------------------*/ if ((P * Q * R) > num_procs) { if (myid == 0) { hypre_printf("Error: PxQxR is more than the number of processors\n"); } exit(1); } else if ((P * Q * R) < num_procs) { if (myid == 0) { hypre_printf("Warning: PxQxR is less than the number of processors\n"); } } /*----------------------------------------------------------- * Print driver parameters *-----------------------------------------------------------*/ if (myid == 0) { hypre_printf("Running with these driver parameters:\n"); hypre_printf(" (nx, ny, nz) = (%d, %d, %d)\n", nx, ny, nz); hypre_printf(" (ix, iy, iz) = (%d, %d, %d)\n", istart[0], istart[1], istart[2]); hypre_printf(" (Px, Py, Pz) = (%d, %d, %d)\n", P, Q, R); hypre_printf(" (bx, by, bz) = (%d, %d, %d)\n", bx, by, bz); hypre_printf(" dim = %d\n", dim); } /*----------------------------------------------------------- * Set up the stencil structure (7 points) when matrix is NOT read from file * Set up the grid structure used when NO files are read *-----------------------------------------------------------*/ switch (dim) { case 1: nblocks = bx; p = myid % P; break; case 2: nblocks = bx * by; p = myid % P; q = (( myid - p) / P) % Q; break; case 3: nblocks = bx * by * bz; p = myid % P; q = (( myid - p) / P) % Q; r = ( myid - p - P * q) / ( P * Q ); break; } if (myid >= (P * Q * R)) { /* My processor has no data on it */ nblocks = bx = by = bz = 0; } /*----------------------------------------------------------- * prepare space for the extents *-----------------------------------------------------------*/ ilower = hypre_CTAlloc(HYPRE_Int*, nblocks, HYPRE_MEMORY_HOST); iupper = hypre_CTAlloc(HYPRE_Int*, nblocks, HYPRE_MEMORY_HOST); iupper2 = hypre_CTAlloc(HYPRE_Int*, nblocks, HYPRE_MEMORY_HOST); for (i = 0; i < nblocks; i++) { ilower[i] = hypre_CTAlloc(HYPRE_Int, dim, HYPRE_MEMORY_HOST); iupper[i] = hypre_CTAlloc(HYPRE_Int, dim, HYPRE_MEMORY_HOST); iupper2[i] = hypre_CTAlloc(HYPRE_Int, dim, HYPRE_MEMORY_HOST); } ib = 0; switch (dim) { case 1: for (ix = 0; ix < bx; ix++) { ilower[ib][0] = istart[0] + nx * (bx * p + ix); iupper[ib][0] = istart[0] + nx * (bx * p + ix + 1) - 1; iupper2[ib][0] = iupper[ib][0]; if ( (ix == (bx - 1)) && (p < (P - 1)) ) { iupper2[ib][0] = iupper[ib][0] + 1; } ib++; } break; case 2: for (iy = 0; iy < by; iy++) for (ix = 0; ix < bx; ix++) { ilower[ib][0] = istart[0] + nx * (bx * p + ix); iupper[ib][0] = istart[0] + nx * (bx * p + ix + 1) - 1; ilower[ib][1] = istart[1] + ny * (by * q + iy); iupper[ib][1] = istart[1] + ny * (by * q + iy + 1) - 1; iupper2[ib][0] = iupper[ib][0]; iupper2[ib][1] = iupper[ib][1]; if ( (ix == (bx - 1)) && (p < (P - 1)) ) { iupper2[ib][0] = iupper[ib][0] + 1; } if ( (iy == (by - 1)) && (q < (Q - 1)) ) { iupper2[ib][1] = iupper[ib][1] + 1; } ib++; } break; case 3: for (iz = 0; iz < bz; iz++) for (iy = 0; iy < by; iy++) for (ix = 0; ix < bx; ix++) { ilower[ib][0] = istart[0] + nx * (bx * p + ix); iupper[ib][0] = istart[0] + nx * (bx * p + ix + 1) - 1; ilower[ib][1] = istart[1] + ny * (by * q + iy); iupper[ib][1] = istart[1] + ny * (by * q + iy + 1) - 1; ilower[ib][2] = istart[2] + nz * (bz * r + iz); iupper[ib][2] = istart[2] + nz * (bz * r + iz + 1) - 1; iupper2[ib][0] = iupper[ib][0]; iupper2[ib][1] = iupper[ib][1]; iupper2[ib][2] = iupper[ib][2]; if ( (ix == (bx - 1)) && (p < (P - 1)) ) { iupper2[ib][0] = iupper[ib][0] + 1; } if ( (iy == (by - 1)) && (q < (Q - 1)) ) { iupper2[ib][1] = iupper[ib][1] + 1; } if ( (iz == (bz - 1)) && (r < (R - 1)) ) { iupper2[ib][2] = iupper[ib][2] + 1; } ib++; } break; } HYPRE_StructGridCreate(hypre_MPI_COMM_WORLD, dim, &from_grid); HYPRE_StructGridCreate(hypre_MPI_COMM_WORLD, dim, &to_grid); for (ib = 0; ib < nblocks; ib++) { HYPRE_StructGridSetExtents(from_grid, ilower[ib], iupper[ib]); HYPRE_StructGridSetExtents(to_grid, ilower[ib], iupper2[ib]); } HYPRE_StructGridAssemble(from_grid); HYPRE_StructGridAssemble(to_grid); /*----------------------------------------------------------- * Set up the vectors *-----------------------------------------------------------*/ HYPRE_StructVectorCreate(hypre_MPI_COMM_WORLD, from_grid, &from_vector); HYPRE_StructVectorInitialize(from_vector); AddValuesVector(from_grid, from_vector, 1.0); HYPRE_StructVectorAssemble(from_vector); HYPRE_StructVectorCreate(hypre_MPI_COMM_WORLD, to_grid, &to_vector); HYPRE_StructVectorInitialize(to_vector); AddValuesVector(to_grid, to_vector, 0.0); HYPRE_StructVectorAssemble(to_vector); /* Vector used to check the migration */ HYPRE_StructVectorCreate(hypre_MPI_COMM_WORLD, to_grid, &check_vector); HYPRE_StructVectorInitialize(check_vector); AddValuesVector(to_grid, check_vector, 1.0); HYPRE_StructVectorAssemble(check_vector); /*----------------------------------------------------------- * Migrate *-----------------------------------------------------------*/ time_index = hypre_InitializeTiming("Struct Migrate"); hypre_BeginTiming(time_index); HYPRE_StructVectorGetMigrateCommPkg(from_vector, to_vector, &comm_pkg); HYPRE_StructVectorMigrate(comm_pkg, from_vector, to_vector); HYPRE_CommPkgDestroy(comm_pkg); hypre_EndTiming(time_index); hypre_PrintTiming("Struct Migrate", hypre_MPI_COMM_WORLD); hypre_FinalizeTiming(time_index); /*----------------------------------------------------------- * Check the migration and print the result *-----------------------------------------------------------*/ hypre_StructAxpy(-1.0, to_vector, check_vector); check = hypre_StructInnerProd (check_vector, check_vector); if (myid == 0) { hypre_printf("\nCheck = %1.0f (success = 0)\n\n", check); } /*----------------------------------------------------------- * Print out the vectors *-----------------------------------------------------------*/ if (print_system) { HYPRE_StructVectorPrint("struct_migrate.out.xfr", from_vector, 0); HYPRE_StructVectorPrint("struct_migrate.out.xto", to_vector, 0); } /*----------------------------------------------------------- * Finalize things *-----------------------------------------------------------*/ HYPRE_StructGridDestroy(from_grid); HYPRE_StructGridDestroy(to_grid); for (i = 0; i < nblocks; i++) { hypre_TFree(ilower[i], HYPRE_MEMORY_HOST); hypre_TFree(iupper[i], HYPRE_MEMORY_HOST); hypre_TFree(iupper2[i], HYPRE_MEMORY_HOST); } hypre_TFree(ilower, HYPRE_MEMORY_HOST); hypre_TFree(iupper, HYPRE_MEMORY_HOST); hypre_TFree(iupper2, HYPRE_MEMORY_HOST); HYPRE_StructVectorDestroy(from_vector); HYPRE_StructVectorDestroy(to_vector); HYPRE_StructVectorDestroy(check_vector); #if defined(HYPRE_USING_KOKKOS) Kokkos::finalize (); #endif /* Finalize Hypre */ HYPRE_Finalize(); /* Finalize MPI */ hypre_MPI_Finalize(); return (0); } /*------------------------------------------------------------------------- * Add constant values to a vector. *-------------------------------------------------------------------------*/ HYPRE_Int AddValuesVector( hypre_StructGrid *grid, hypre_StructVector *vector, HYPRE_Real value ) { HYPRE_Int i, ierr = 0; hypre_BoxArray *gridboxes; HYPRE_Int ib; hypre_IndexRef ilower; hypre_IndexRef iupper; hypre_Box *box; HYPRE_Real *values; HYPRE_Real *values_h; HYPRE_Int volume; HYPRE_MemoryLocation memory_location = hypre_StructVectorMemoryLocation(vector); gridboxes = hypre_StructGridBoxes(grid); ib = 0; hypre_ForBoxI(ib, gridboxes) { box = hypre_BoxArrayBox(gridboxes, ib); volume = hypre_BoxVolume(box); values = hypre_CTAlloc(HYPRE_Real, volume, memory_location); values_h = hypre_CTAlloc(HYPRE_Real, volume, HYPRE_MEMORY_HOST); for (i = 0; i < volume; i++) { values_h[i] = value; } hypre_TMemcpy(values, values_h, HYPRE_Real, volume, memory_location, HYPRE_MEMORY_HOST); ilower = hypre_BoxIMin(box); iupper = hypre_BoxIMax(box); HYPRE_StructVectorSetBoxValues(vector, ilower, iupper, values); hypre_TFree(values, memory_location); hypre_TFree(values_h, HYPRE_MEMORY_HOST); } return ierr; } hypre-2.33.0/src/test/struct_newboxloop.c000066400000000000000000001522261477326011500204560ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include #include #include #include #include #include "_hypre_utilities.h" #include "HYPRE_struct_ls.h" #include "HYPRE_krylov.h" #if defined( KOKKOS_HAVE_MPI ) #include #endif #define HYPRE_MFLOPS 0 #if HYPRE_MFLOPS #include "_hypre_struct_mv.h" #endif /* RDF: Why is this include here? */ #include "_hypre_struct_mv.h" #ifdef HYPRE_DEBUG #include #endif /* begin lobpcg */ #define NO_SOLVER -9198 #include #include "HYPRE_lobpcg.h" /* end lobpcg */ HYPRE_Int SetStencilBndry(HYPRE_StructMatrix A, HYPRE_StructGrid gridmatrix, HYPRE_Int* period); HYPRE_Int AddValuesMatrix(HYPRE_StructMatrix A, HYPRE_StructGrid gridmatrix, HYPRE_Real cx, HYPRE_Real cy, HYPRE_Real cz, HYPRE_Real conx, HYPRE_Real cony, HYPRE_Real conz) ; HYPRE_Int AddValuesVector( hypre_StructGrid *gridvector, hypre_StructVector *zvector, HYPRE_Int *period, HYPRE_Real value ) ; /*-------------------------------------------------------------------------- * Test driver for structured matrix interface (structured storage) *--------------------------------------------------------------------------*/ /*---------------------------------------------------------------------- * Standard 7-point laplacian in 3D with grid and anisotropy determined * as command line arguments. Do `driver -help' for usage info. *----------------------------------------------------------------------*/ hypre_int main( hypre_int argc, char *argv[] ) { HYPRE_Int arg_index; HYPRE_Int print_usage; HYPRE_Int nx, ny, nz; HYPRE_Int P, Q, R; HYPRE_Int bx, by, bz; HYPRE_Int px, py, pz; HYPRE_Real cx, cy, cz; HYPRE_Real conx, cony, conz; HYPRE_Int solver_id; /*HYPRE_Real dxyz[3];*/ HYPRE_Int A_num_ghost[6] = {0, 0, 0, 0, 0, 0}; HYPRE_StructMatrix A; HYPRE_StructVector b; HYPRE_StructVector x; HYPRE_StructSolver solver; HYPRE_Int num_iterations; HYPRE_Int time_index; HYPRE_Real final_res_norm; HYPRE_Int num_procs, myid; HYPRE_Int p, q, r; HYPRE_Int dim; HYPRE_Int n_pre, n_post; HYPRE_Int nblocks ; HYPRE_Int skip; HYPRE_Int sym; HYPRE_Int rap; HYPRE_Int relax; HYPRE_Int jump; HYPRE_Int rep, reps; HYPRE_Int **iupper; HYPRE_Int **ilower; HYPRE_Int istart[3]; HYPRE_Int periodic[3]; HYPRE_Int **offsets; HYPRE_Int constant_coefficient = 0; HYPRE_Int *stencil_entries; HYPRE_Int stencil_size; HYPRE_Int diag_rank; hypre_Index diag_index; HYPRE_StructGrid grid; HYPRE_StructStencil stencil; HYPRE_Int i, s; HYPRE_Int ix, iy, iz, ib; HYPRE_Int periodx0[3] = {0, 0, 0}; HYPRE_Int sum; HYPRE_Real inner; HYPRE_Int print_system = 0; /* begin lobpcg */ HYPRE_Int lobpcgFlag = 0; /* end lobpcg */ /*----------------------------------------------------------- * Initialize some stuff *-----------------------------------------------------------*/ /* Initialize MPI */ hypre_MPI_Init(&argc, &argv); #if defined(HYPRE_USING_KOKKOS) Kokkos::InitArguments args; args.num_threads = 12; Kokkos::initialize (args); #endif #if defined(HYPRE_USING_CUDA) printf("initCudaReductionMemBlock\n"); initCudaReductionMemBlock(); printf("Finish initCudaReductionMemBlock\n"); #endif hypre_MPI_Comm_size(hypre_MPI_COMM_WORLD, &num_procs ); hypre_MPI_Comm_rank(hypre_MPI_COMM_WORLD, &myid ); #ifdef HYPRE_DEBUG cegdb(&argc, &argv, myid); #endif /*----------------------------------------------------------- * Set defaults *-----------------------------------------------------------*/ dim = 3; skip = 0; sym = 1; rap = 0; relax = 1; jump = 0; reps = 1; nx = 10; ny = 10; nz = 10; P = num_procs; Q = 1; R = 1; bx = 1; by = 1; bz = 1; cx = 1.0; cy = 1.0; cz = 1.0; conx = 0.0; cony = 0.0; conz = 0.0; n_pre = 1; n_post = 1; solver_id = 0; istart[0] = -3; istart[1] = -3; istart[2] = -3; px = 0; py = 0; pz = 0; /* setting defaults for the reading parameters */ sum = 0; /* ghosts for the building of matrix: default */ for (i = 0; i < dim; i++) { A_num_ghost[2 * i] = 1; A_num_ghost[2 * i + 1] = 1; } /*----------------------------------------------------------- * Parse command line *-----------------------------------------------------------*/ print_usage = 0; arg_index = 1; while (arg_index < argc) { if ( strcmp(argv[arg_index], "-n") == 0 ) { arg_index++; nx = atoi(argv[arg_index++]); ny = atoi(argv[arg_index++]); nz = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-istart") == 0 ) { arg_index++; istart[0] = atoi(argv[arg_index++]); istart[1] = atoi(argv[arg_index++]); istart[2] = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-P") == 0 ) { arg_index++; P = atoi(argv[arg_index++]); Q = atoi(argv[arg_index++]); R = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-b") == 0 ) { arg_index++; bx = atoi(argv[arg_index++]); by = atoi(argv[arg_index++]); bz = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-p") == 0 ) { arg_index++; px = atoi(argv[arg_index++]); py = atoi(argv[arg_index++]); pz = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-c") == 0 ) { arg_index++; cx = (HYPRE_Real)atof(argv[arg_index++]); cy = (HYPRE_Real)atof(argv[arg_index++]); cz = (HYPRE_Real)atof(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-convect") == 0 ) { arg_index++; conx = (HYPRE_Real)atof(argv[arg_index++]); cony = (HYPRE_Real)atof(argv[arg_index++]); conz = (HYPRE_Real)atof(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-d") == 0 ) { arg_index++; dim = atoi(argv[arg_index++]); } else if (strcmp(argv[arg_index], "-repeats") == 0 ) { arg_index++; reps = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-solver") == 0 ) { arg_index++; /* begin lobpcg */ if ( strcmp(argv[arg_index], "none") == 0 ) { solver_id = NO_SOLVER; arg_index++; } else /* end lobpcg */ { solver_id = atoi(argv[arg_index++]); } } else if ( strcmp(argv[arg_index], "-v") == 0 ) { arg_index++; n_pre = atoi(argv[arg_index++]); n_post = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-rap") == 0 ) { arg_index++; rap = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-relax") == 0 ) { arg_index++; relax = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-sym") == 0 ) { arg_index++; sym = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-skip") == 0 ) { arg_index++; skip = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-jump") == 0 ) { arg_index++; jump = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-print") == 0 ) { arg_index++; print_system = 1; } else if ( strcmp(argv[arg_index], "-help") == 0 ) { print_usage = 1; break; } /* begin lobpcg */ else if ( strcmp(argv[arg_index], "-lobpcg") == 0 ) { /* use lobpcg */ arg_index++; lobpcgFlag = 1; } /* end lobpcg */ else { arg_index++; } } /* begin lobpcg */ if ( solver_id == 0 && lobpcgFlag ) { solver_id = 10; } /*end lobpcg */ sum = 0; /*----------------------------------------------------------- * Print usage info *-----------------------------------------------------------*/ if ( (print_usage) && (myid == 0) ) { hypre_printf("\n"); hypre_printf("Usage: %s []\n", argv[0]); hypre_printf("\n"); hypre_printf(" -n : problem size per block\n"); hypre_printf(" -istart : start of box\n"); hypre_printf(" -P : processor topology\n"); hypre_printf(" -b : blocking per processor\n"); hypre_printf(" -p : periodicity in each dimension\n"); hypre_printf(" -c : diffusion coefficients\n"); hypre_printf(" -convect : convection coefficients\n"); hypre_printf(" -d : problem dimension (2 or 3)\n"); hypre_printf(" -fromfile : prefix name for matrixfiles\n"); hypre_printf(" -rhsfromfile : prefix name for rhsfiles\n"); hypre_printf(" -x0fromfile : prefix name for firstguessfiles\n"); hypre_printf(" -repeats : number of times to repeat the run, default 1.\n"); hypre_printf(" -solver : solver ID\n"); hypre_printf(" 0 - axpy\n"); hypre_printf(" 1 - spMV\n"); hypre_printf(" 2 - inner product\n"); hypre_printf(" 3 - spMV with constant coeffs\n"); hypre_printf(" 4 - spMV with constant coeffs var diag\n"); hypre_printf(" 8 - Jacobi\n"); hypre_printf(" -sym : symmetric storage (1) or not (0)\n"); hypre_printf(" -jump : num levels to jump in SparseMSG\n"); hypre_printf("\n"); } if ( print_usage ) { exit(1); } /*----------------------------------------------------------- * Check a few things *-----------------------------------------------------------*/ if ((P * Q * R) > num_procs) { if (myid == 0) { hypre_printf("Error: PxQxR is more than the number of processors\n"); } exit(1); } else if ((P * Q * R) < num_procs) { if (myid == 0) { hypre_printf("Warning: PxQxR is less than the number of processors\n"); } } if ((conx != 0.0 || cony != 0 || conz != 0) && sym == 1 ) { if (myid == 0) { hypre_printf("Warning: Convection produces non-symmetric matrix\n"); } sym = 0; } /*----------------------------------------------------------- * Print driver parameters *-----------------------------------------------------------*/ if (myid == 0 && sum == 0) { #ifdef HYPRE_USE_DEFAULT hypre_printf("Running with openMP macro\n"); #endif #ifdef HYPRE_USING_KOKKOS hypre_printf("Running with Kokkos macro\n"); #endif #ifdef HYPRE_USING_CUDA hypre_printf("Running with CUDA macro\n"); #endif #ifdef HYPRE_USING_RAJA hypre_printf("Running with RAJA macro\n"); #endif hypre_printf("Running with these driver parameters:\n"); hypre_printf(" (nx, ny, nz) = (%d, %d, %d)\n", nx, ny, nz); hypre_printf(" (istart[0],istart[1],istart[2]) = (%d, %d, %d)\n", \ istart[0], istart[1], istart[2]); hypre_printf(" (Px, Py, Pz) = (%d, %d, %d)\n", P, Q, R); hypre_printf(" (bx, by, bz) = (%d, %d, %d)\n", bx, by, bz); hypre_printf(" (px, py, pz) = (%d, %d, %d)\n", px, py, pz); hypre_printf(" (cx, cy, cz) = (%f, %f, %f)\n", cx, cy, cz); hypre_printf(" (conx,cony,conz)= (%f, %f, %f)\n", conx, cony, conz); hypre_printf(" (n_pre, n_post) = (%d, %d)\n", n_pre, n_post); hypre_printf(" dim = %d\n", dim); hypre_printf(" skip = %d\n", skip); hypre_printf(" sym = %d\n", sym); hypre_printf(" rap = %d\n", rap); hypre_printf(" relax = %d\n", relax); hypre_printf(" jump = %d\n", jump); hypre_printf(" solver ID = %d\n", solver_id); } if (myid == 0 && sum > 0) { hypre_printf("Running with these driver parameters:\n"); hypre_printf(" (cx, cy, cz) = (%f, %f, %f)\n", cx, cy, cz); hypre_printf(" (conx,cony,conz)= (%f, %f, %f)\n", conx, cony, conz); hypre_printf(" (n_pre, n_post) = (%d, %d)\n", n_pre, n_post); hypre_printf(" dim = %d\n", dim); hypre_printf(" skip = %d\n", skip); hypre_printf(" sym = %d\n", sym); hypre_printf(" rap = %d\n", rap); hypre_printf(" relax = %d\n", relax); hypre_printf(" jump = %d\n", jump); hypre_printf(" solver ID = %d\n", solver_id); hypre_printf(" the grid is read from file \n"); } /*----------------------------------------------------------- * Set up the stencil structure (7 points) when matrix is NOT read from file * Set up the grid structure used when NO files are read *-----------------------------------------------------------*/ switch (dim) { case 1: nblocks = bx; if (sym) { offsets = hypre_CTAlloc(HYPRE_Int*, 2, HYPRE_MEMORY_HOST); offsets[0] = hypre_CTAlloc(HYPRE_Int, 1, HYPRE_MEMORY_HOST); offsets[0][0] = -1; offsets[1] = hypre_CTAlloc(HYPRE_Int, 1, HYPRE_MEMORY_HOST); offsets[1][0] = 0; } else { offsets = hypre_CTAlloc(HYPRE_Int*, 3, HYPRE_MEMORY_HOST); offsets[0] = hypre_CTAlloc(HYPRE_Int, 1, HYPRE_MEMORY_HOST); offsets[0][0] = -1; offsets[1] = hypre_CTAlloc(HYPRE_Int, 1, HYPRE_MEMORY_HOST); offsets[1][0] = 0; offsets[2] = hypre_CTAlloc(HYPRE_Int, 1, HYPRE_MEMORY_HOST); offsets[2][0] = 1; } /* compute p from P and myid */ p = myid % P; break; case 2: nblocks = bx * by; if (sym) { offsets = hypre_CTAlloc(HYPRE_Int*, 3, HYPRE_MEMORY_HOST); offsets[0] = hypre_CTAlloc(HYPRE_Int, 2, HYPRE_MEMORY_HOST); offsets[0][0] = -1; offsets[0][1] = 0; offsets[1] = hypre_CTAlloc(HYPRE_Int, 2, HYPRE_MEMORY_HOST); offsets[1][0] = 0; offsets[1][1] = -1; offsets[2] = hypre_CTAlloc(HYPRE_Int, 2, HYPRE_MEMORY_HOST); offsets[2][0] = 0; offsets[2][1] = 0; } else { offsets = hypre_CTAlloc(HYPRE_Int*, 5, HYPRE_MEMORY_HOST); offsets[0] = hypre_CTAlloc(HYPRE_Int, 2, HYPRE_MEMORY_HOST); offsets[0][0] = -1; offsets[0][1] = 0; offsets[1] = hypre_CTAlloc(HYPRE_Int, 2, HYPRE_MEMORY_HOST); offsets[1][0] = 0; offsets[1][1] = -1; offsets[2] = hypre_CTAlloc(HYPRE_Int, 2, HYPRE_MEMORY_HOST); offsets[2][0] = 0; offsets[2][1] = 0; offsets[3] = hypre_CTAlloc(HYPRE_Int, 2, HYPRE_MEMORY_HOST); offsets[3][0] = 1; offsets[3][1] = 0; offsets[4] = hypre_CTAlloc(HYPRE_Int, 2, HYPRE_MEMORY_HOST); offsets[4][0] = 0; offsets[4][1] = 1; } /* compute p,q from P,Q and myid */ p = myid % P; q = (( myid - p) / P) % Q; break; case 3: nblocks = bx * by * bz; if (sym) { offsets = hypre_CTAlloc(HYPRE_Int*, 4, HYPRE_MEMORY_HOST); offsets[0] = hypre_CTAlloc(HYPRE_Int, 3, HYPRE_MEMORY_HOST); offsets[0][0] = -1; offsets[0][1] = 0; offsets[0][2] = 0; offsets[1] = hypre_CTAlloc(HYPRE_Int, 3, HYPRE_MEMORY_HOST); offsets[1][0] = 0; offsets[1][1] = -1; offsets[1][2] = 0; offsets[2] = hypre_CTAlloc(HYPRE_Int, 3, HYPRE_MEMORY_HOST); offsets[2][0] = 0; offsets[2][1] = 0; offsets[2][2] = -1; offsets[3] = hypre_CTAlloc(HYPRE_Int, 3, HYPRE_MEMORY_HOST); offsets[3][0] = 0; offsets[3][1] = 0; offsets[3][2] = 0; } else { offsets = hypre_CTAlloc(HYPRE_Int*, 7, HYPRE_MEMORY_HOST); offsets[0] = hypre_CTAlloc(HYPRE_Int, 3, HYPRE_MEMORY_HOST); offsets[0][0] = -1; offsets[0][1] = 0; offsets[0][2] = 0; offsets[1] = hypre_CTAlloc(HYPRE_Int, 3, HYPRE_MEMORY_HOST); offsets[1][0] = 0; offsets[1][1] = -1; offsets[1][2] = 0; offsets[2] = hypre_CTAlloc(HYPRE_Int, 3, HYPRE_MEMORY_HOST); offsets[2][0] = 0; offsets[2][1] = 0; offsets[2][2] = -1; offsets[3] = hypre_CTAlloc(HYPRE_Int, 3, HYPRE_MEMORY_HOST); offsets[3][0] = 0; offsets[3][1] = 0; offsets[3][2] = 0; offsets[4] = hypre_CTAlloc(HYPRE_Int, 3, HYPRE_MEMORY_HOST); offsets[4][0] = 1; offsets[4][1] = 0; offsets[4][2] = 0; offsets[5] = hypre_CTAlloc(HYPRE_Int, 3, HYPRE_MEMORY_HOST); offsets[5][0] = 0; offsets[5][1] = 1; offsets[5][2] = 0; offsets[6] = hypre_CTAlloc(HYPRE_Int, 3, HYPRE_MEMORY_HOST); offsets[6][0] = 0; offsets[6][1] = 0; offsets[6][2] = 1; } /* compute p,q,r from P,Q,R and myid */ p = myid % P; q = (( myid - p) / P) % Q; r = ( myid - p - P * q) / ( P * Q ); break; } if (myid >= (P * Q * R)) { /* My processor has no data on it */ nblocks = bx = by = bz = 0; } /*----------------------------------------------------------- * Set up the stencil structure needed for matrix creation * which is always the case for read_fromfile_param == 0 *-----------------------------------------------------------*/ HYPRE_StructStencilCreate(dim, (2 - sym)*dim + 1, &stencil); for (s = 0; s < (2 - sym)*dim + 1; s++) { HYPRE_StructStencilSetElement(stencil, s, offsets[s]); } /*----------------------------------------------------------- * Set up periodic *-----------------------------------------------------------*/ periodic[0] = px; periodic[1] = py; periodic[2] = pz; /*----------------------------------------------------------- * Set up dxyz for PFMG solver *-----------------------------------------------------------*/ /* beginning of sum == 0 */ if (sum == 0) /* no read from any file */ { /*----------------------------------------------------------- * prepare space for the extents *-----------------------------------------------------------*/ ilower = hypre_CTAlloc(HYPRE_Int*, nblocks, HYPRE_MEMORY_HOST); iupper = hypre_CTAlloc(HYPRE_Int*, nblocks, HYPRE_MEMORY_HOST); for (i = 0; i < nblocks; i++) { ilower[i] = hypre_CTAlloc(HYPRE_Int, dim, HYPRE_MEMORY_HOST); iupper[i] = hypre_CTAlloc(HYPRE_Int, dim, HYPRE_MEMORY_HOST); } /* compute ilower and iupper from (p,q,r), (bx,by,bz), and (nx,ny,nz) */ ib = 0; switch (dim) { case 1: for (ix = 0; ix < bx; ix++) { ilower[ib][0] = istart[0] + nx * (bx * p + ix); iupper[ib][0] = istart[0] + nx * (bx * p + ix + 1) - 1; ib++; } break; case 2: for (iy = 0; iy < by; iy++) for (ix = 0; ix < bx; ix++) { ilower[ib][0] = istart[0] + nx * (bx * p + ix); iupper[ib][0] = istart[0] + nx * (bx * p + ix + 1) - 1; ilower[ib][1] = istart[1] + ny * (by * q + iy); iupper[ib][1] = istart[1] + ny * (by * q + iy + 1) - 1; ib++; } break; case 3: for (iz = 0; iz < bz; iz++) for (iy = 0; iy < by; iy++) for (ix = 0; ix < bx; ix++) { ilower[ib][0] = istart[0] + nx * (bx * p + ix); iupper[ib][0] = istart[0] + nx * (bx * p + ix + 1) - 1; ilower[ib][1] = istart[1] + ny * (by * q + iy); iupper[ib][1] = istart[1] + ny * (by * q + iy + 1) - 1; ilower[ib][2] = istart[2] + nz * (bz * r + iz); iupper[ib][2] = istart[2] + nz * (bz * r + iz + 1) - 1; ib++; } break; } HYPRE_StructGridCreate(hypre_MPI_COMM_WORLD, dim, &grid); for (ib = 0; ib < nblocks; ib++) { /* Add to the grid a new box defined by ilower[ib], iupper[ib]...*/ HYPRE_StructGridSetExtents(grid, ilower[ib], iupper[ib]); } HYPRE_StructGridSetPeriodic(grid, periodic); HYPRE_StructGridAssemble(grid); /*----------------------------------------------------------- * Set up the matrix structure *-----------------------------------------------------------*/ for (i = 0; i < dim; i++) { A_num_ghost[2 * i] = 1; A_num_ghost[2 * i + 1] = 1; } HYPRE_StructMatrixCreate(hypre_MPI_COMM_WORLD, grid, stencil, &A); if ( solver_id == 3 || solver_id == 4 || solver_id == 13 || solver_id == 14 ) { stencil_size = hypre_StructStencilSize(stencil); stencil_entries = hypre_CTAlloc(HYPRE_Int, stencil_size, HYPRE_MEMORY_HOST); if ( solver_id == 3 || solver_id == 13) { for ( i = 0; i < stencil_size; ++i ) { stencil_entries[i] = i; } hypre_StructMatrixSetConstantEntries( A, stencil_size, stencil_entries ); /* ... note: SetConstantEntries is where the constant_coefficient flag is set in A */ hypre_TFree( stencil_entries, HYPRE_MEMORY_HOST); constant_coefficient = 1; } if ( solver_id == 4 || solver_id == 14) { hypre_SetIndex3(diag_index, 0, 0, 0); diag_rank = hypre_StructStencilElementRank( stencil, diag_index ); hypre_assert( stencil_size >= 1 ); if ( diag_rank == 0 ) { stencil_entries[diag_rank] = 1; } else { stencil_entries[diag_rank] = 0; } for ( i = 0; i < stencil_size; ++i ) { if ( i != diag_rank ) { stencil_entries[i] = i; } } hypre_StructMatrixSetConstantEntries( A, stencil_size, stencil_entries ); hypre_TFree( stencil_entries, HYPRE_MEMORY_HOST); constant_coefficient = 2; } } HYPRE_StructMatrixSetSymmetric(A, sym); HYPRE_StructMatrixSetNumGhost(A, A_num_ghost); //if (nx*ny*nz < 1000) //{ HYPRE_StructGridSetDataLocation(grid, HYPRE_MEMORY_HOST); hypre_SetDeviceOff(); //} //else //{ //HYPRE_StructGridSetDataLocation(grid, HYPRE_MEMORY_DEVICE); //hypre_SetDeviceOn(); //} HYPRE_StructMatrixInitialize(A); /*----------------------------------------------------------- * Fill in the matrix elements *-----------------------------------------------------------*/ AddValuesMatrix(A, grid, cx, cy, cz, conx, cony, conz); /* Zero out stencils reaching to real boundary */ /* But in constant coefficient case, no special stencils! */ if ( constant_coefficient == 0 ) { SetStencilBndry(A, grid, periodic); } HYPRE_StructMatrixAssemble(A); /*----------------------------------------------------------- * Set up the linear system *-----------------------------------------------------------*/ HYPRE_StructVectorCreate(hypre_MPI_COMM_WORLD, grid, &b); HYPRE_StructVectorInitialize(b); /*----------------------------------------------------------- * For periodic b.c. in all directions, need rhs to satisfy * compatibility condition. Achieved by setting a source and * sink of equal strength. All other problems have rhs = 1. *-----------------------------------------------------------*/ AddValuesVector(grid, b, periodic, 1.0); HYPRE_StructVectorAssemble(b); HYPRE_StructVectorCreate(hypre_MPI_COMM_WORLD, grid, &x); HYPRE_StructVectorInitialize(x); AddValuesVector(grid, x, periodx0, 1.0); HYPRE_StructVectorAssemble(x); HYPRE_StructGridDestroy(grid); for (i = 0; i < nblocks; i++) { hypre_TFree(iupper[i], HYPRE_MEMORY_HOST); hypre_TFree(ilower[i], HYPRE_MEMORY_HOST); } hypre_TFree(ilower, HYPRE_MEMORY_HOST); hypre_TFree(iupper, HYPRE_MEMORY_HOST); } /*----------------------------------------------------------- * Print out the system and initial guess *-----------------------------------------------------------*/ if (print_system) { HYPRE_StructMatrixPrint("struct.out.A", A, 0); HYPRE_StructVectorPrint("struct.out.b", b, 0); HYPRE_StructVectorPrint("struct.out.x0", x, 0); } /*----------------------------------------------------------- * axpy *-----------------------------------------------------------*/ #if !HYPRE_MFLOPS hypre_MPI_Barrier(hypre_MPI_COMM_WORLD); if (solver_id == 0) { //timeval tstart,tstop; time_index = hypre_InitializeTiming("axpy"); hypre_BeginTiming(time_index); //gettimeofday(&tstart,NULL); for ( rep = 0; rep < reps; ++rep ) { hypre_StructAxpy(2.0, b, x); } //gettimeofday(&tstop,NULL); hypre_EndTiming(time_index); //HYPRE_Real telapsed = (tstop.tv_sec - tstart.tv_sec) + (tstop.tv_usec - tstart.tv_usec)/1e6 ; //hypre_printf("axpy, \t %d, \t %f\n",nx*ny*nz,telapsed/reps); HYPRE_Real innerb = hypre_StructInnerProd(b, b); HYPRE_Real innerx = hypre_StructInnerProd(x, x); hypre_printf("inner, \t %f, \t %f\n", innerb, innerx); hypre_PrintTiming("Time for axpy", hypre_MPI_COMM_WORLD); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); } /*----------------------------------------------------------- * sparse matrix vector multiplication *-----------------------------------------------------------*/ else if ( solver_id == 1 || solver_id == 3 || solver_id == 4 ) { //timeval tstart,tstop; void *matvec_data; matvec_data = hypre_StructMatvecCreate(); hypre_StructMatvecSetup(matvec_data, A, x); time_index = hypre_InitializeTiming("Mat-Vec"); hypre_BeginTiming(time_index); //gettimeofday(&tstart,NULL); for ( rep = 0; rep < reps; ++rep ) { hypre_StructMatvecCompute(matvec_data, 1.0, A, x, 1.0, b); } //gettimeofday(&tstop,NULL); hypre_EndTiming(time_index); HYPRE_Real innerb = hypre_StructInnerProd(b, b); HYPRE_Real innerx = hypre_StructInnerProd(x, x); hypre_printf("inner, \t %f, \t %f\n", innerb, innerx); //HYPRE_Real telapsed = (tstop.tv_sec - tstart.tv_sec) + (tstop.tv_usec - tstart.tv_usec)/1e6 ; //hypre_printf("Mat-Vec, \t %d, \t %f\n",nx*ny*nz,telapsed/reps); hypre_PrintTiming("Time for Mat-Vec", hypre_MPI_COMM_WORLD); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); } /*----------------------------------------------------------- * inner product *-----------------------------------------------------------*/ else if (solver_id == 2) { //timeval tstart,tstop; time_index = hypre_InitializeTiming("inner"); hypre_BeginTiming(time_index); //gettimeofday(&tstart,NULL); for ( rep = 0; rep < reps; ++rep ) { inner = hypre_StructInnerProd(x, b); } //gettimeofday(&tstop,NULL); hypre_EndTiming(time_index); //HYPRE_Real telapsed = (tstop.tv_sec - tstart.tv_sec) + (tstop.tv_usec - tstart.tv_usec)/1e6 ; //hypre_printf("inner, \t %d, \t %f\n",nx*ny*nz,telapsed/reps); hypre_printf("inner = %f\n", inner); hypre_PrintTiming("Time for inner product", hypre_MPI_COMM_WORLD); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); } /*----------------------------------------------------------- * Solve the system using Jacobi *-----------------------------------------------------------*/ else if ( solver_id == 8 ) { time_index = hypre_InitializeTiming("Jacobi Setup"); hypre_BeginTiming(time_index); HYPRE_StructJacobiCreate(hypre_MPI_COMM_WORLD, &solver); HYPRE_StructJacobiSetMaxIter(solver, 100); HYPRE_StructJacobiSetTol(solver, 1.0e-06); HYPRE_StructJacobiSetup(solver, A, b, x); hypre_EndTiming(time_index); hypre_PrintTiming("Setup phase times", hypre_MPI_COMM_WORLD); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); time_index = hypre_InitializeTiming("Jacobi Solve"); hypre_BeginTiming(time_index); HYPRE_StructJacobiSolve(solver, A, b, x); hypre_EndTiming(time_index); hypre_PrintTiming("Solve phase times", hypre_MPI_COMM_WORLD); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); HYPRE_StructJacobiGetNumIterations(solver, &num_iterations); HYPRE_StructJacobiGetFinalRelativeResidualNorm(solver, &final_res_norm); HYPRE_StructJacobiDestroy(solver); } /*----------------------------------------------------------- * Solve the system using CG *-----------------------------------------------------------*/ if ((solver_id > 9) && (solver_id < 20)) { } /*----------------------------------------------------------- * Print the solution and other info *-----------------------------------------------------------*/ if (print_system) { HYPRE_StructVectorPrint("struct.out.x", x, 0); } #endif /*----------------------------------------------------------- * Compute MFLOPs for Matvec *-----------------------------------------------------------*/ #if HYPRE_MFLOPS { void *matvec_data; HYPRE_Int i, imax, N; /* compute imax */ N = (P * nx) * (Q * ny) * (R * nz); imax = (5 * 1000000) / N; matvec_data = hypre_StructMatvecCreate(); hypre_StructMatvecSetup(matvec_data, A, x); time_index = hypre_InitializeTiming("Matvec"); hypre_BeginTiming(time_index); for (i = 0; i < imax; i++) { hypre_StructMatvecCompute(matvec_data, 1.0, A, x, 1.0, b); } /* this counts mult-adds */ hypre_IncFLOPCount(7 * N * imax); hypre_EndTiming(time_index); hypre_PrintTiming("Matvec time", hypre_MPI_COMM_WORLD); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); hypre_StructMatvecDestroy(matvec_data); } #endif /*----------------------------------------------------------- * Finalize things *-----------------------------------------------------------*/ HYPRE_StructStencilDestroy(stencil); HYPRE_StructMatrixDestroy(A); HYPRE_StructVectorDestroy(b); HYPRE_StructVectorDestroy(x); for ( i = 0; i < (dim + 1); i++) { hypre_TFree(offsets[i], HYPRE_MEMORY_HOST); } hypre_TFree(offsets, HYPRE_MEMORY_HOST); /* Finalize MPI */ hypre_MPI_Finalize(); #if defined(HYPRE_USING_KOKKOS) Kokkos::finalize (); #endif return (0); } /*------------------------------------------------------------------------- * add constant values to a vector. Need to pass the initialized vector, grid, * period of grid and the constant value. *-------------------------------------------------------------------------*/ HYPRE_Int AddValuesVector( hypre_StructGrid *gridvector, hypre_StructVector *zvector, HYPRE_Int *period, HYPRE_Real value ) { /* #include "_hypre_struct_mv.h" */ HYPRE_Int ierr = 0; hypre_BoxArray *gridboxes; HYPRE_Int ib; hypre_IndexRef ilower; hypre_IndexRef iupper; hypre_Box *box; HYPRE_Real *values; HYPRE_Int volume, dim; #if 0 //defined(HYPRE_USING_CUDA) HYPRE_Int data_location = hypre_StructGridDataLocation(hypre_StructVectorGrid(zvector)); #endif gridboxes = hypre_StructGridBoxes(gridvector); dim = hypre_StructGridNDim(gridvector); ib = 0; hypre_ForBoxI(ib, gridboxes) { box = hypre_BoxArrayBox(gridboxes, ib); volume = hypre_BoxVolume(box); #if 0 //defined(HYPRE_USING_CUDA) if (data_location != HYPRE_MEMORY_HOST) { values = hypre_CTAlloc(HYPRE_Real, volume, HYPRE_MEMORY_DEVICE); } else { values = hypre_CTAlloc(HYPRE_Real, volume, HYPRE_MEMORY_HOST); } #else values = hypre_CTAlloc(HYPRE_Real, volume, HYPRE_MEMORY_DEVICE); #endif /*----------------------------------------------------------- * For periodic b.c. in all directions, need rhs to satisfy * compatibility condition. Achieved by setting a source and * sink of equal strength. All other problems have rhs = 1. *-----------------------------------------------------------*/ if ((dim == 2 && period[0] != 0 && period[1] != 0) || (dim == 3 && period[0] != 0 && period[1] != 0 && period[2] != 0)) { hypre_LoopBegin (volume, i); { values[i] = 0.0; if (i == 0) { values[0] = value; values[volume - 1] = -value; } } hypre_LoopEnd(); } else { hypre_LoopBegin (volume, i); { values[i] = value; } hypre_LoopEnd(); } ilower = hypre_BoxIMin(box); iupper = hypre_BoxIMax(box); HYPRE_StructVectorSetBoxValues(zvector, ilower, iupper, values); #if 0 //defined(HYPRE_USING_CUDA) if (data_location < 1) { hypre_TFree(values, HYPRE_MEMORY_DEVICE); } else { hypre_TFree(values, HYPRE_MEMORY_HOST); } #else hypre_TFree(values, HYPRE_MEMORY_DEVICE); #endif } return ierr; } /****************************************************************************** * Adds values to matrix based on a 7 point (3d) * symmetric stencil for a convection-diffusion problem. * It need an initialized matrix, an assembled grid, and the constants * that determine the 7 point (3d) convection-diffusion. ******************************************************************************/ HYPRE_Int AddValuesMatrix(HYPRE_StructMatrix A, HYPRE_StructGrid gridmatrix, HYPRE_Real cx, HYPRE_Real cy, HYPRE_Real cz, HYPRE_Real conx, HYPRE_Real cony, HYPRE_Real conz) { HYPRE_Int ierr = 0; hypre_BoxArray *gridboxes; HYPRE_Int s, bi; hypre_IndexRef ilower; hypre_IndexRef iupper; hypre_Box *box; HYPRE_Real *values; HYPRE_Real east, west; HYPRE_Real north, south; HYPRE_Real top, bottom; HYPRE_Real center; HYPRE_Int volume, dim, sym; HYPRE_Int *stencil_indices; HYPRE_Int stencil_size; HYPRE_Int constant_coefficient; #if 0 //defined(HYPRE_USING_CUDA) HYPRE_Int data_location = hypre_StructGridDataLocation(hypre_StructMatrixGrid(A)); #endif gridboxes = hypre_StructGridBoxes(gridmatrix); dim = hypre_StructGridNDim(gridmatrix); sym = hypre_StructMatrixSymmetric(A); constant_coefficient = hypre_StructMatrixConstantCoefficient(A); bi = 0; east = -cx; west = -cx; north = -cy; south = -cy; top = -cz; bottom = -cz; center = 2.0 * cx; if (dim > 1) { center += 2.0 * cy; } if (dim > 2) { center += 2.0 * cz; } stencil_size = 1 + (2 - sym) * dim; stencil_indices = hypre_CTAlloc(HYPRE_Int, stencil_size, HYPRE_MEMORY_HOST); for (s = 0; s < stencil_size; s++) { stencil_indices[s] = s; } if (sym) { if ( constant_coefficient == 0 ) { hypre_ForBoxI(bi, gridboxes) { box = hypre_BoxArrayBox(gridboxes, bi); volume = hypre_BoxVolume(box); #if 0 //defined(HYPRE_USING_CUDA) if (data_location != HYPRE_MEMORY_HOST) { values = hypre_CTAlloc(HYPRE_Real, stencil_size * volume, HYPRE_MEMORY_DEVICE); } else { values = hypre_CTAlloc(HYPRE_Real, stencil_size * volume, HYPRE_MEMORY_HOST); } #else values = hypre_CTAlloc(HYPRE_Real, stencil_size * volume, HYPRE_MEMORY_DEVICE); #endif hypre_LoopBegin(volume, d) { HYPRE_Int i = stencil_size * d; switch (dim) { case 1: values[i ] = west; values[i + 1] = center; break; case 2: values[i ] = west; values[i + 1] = south; values[i + 2] = center; break; case 3: values[i ] = west; values[i + 1] = south; values[i + 2] = bottom; values[i + 3] = center; break; } } hypre_LoopEnd() ilower = hypre_BoxIMin(box); iupper = hypre_BoxIMax(box); HYPRE_StructMatrixSetBoxValues(A, ilower, iupper, stencil_size, stencil_indices, values); #if 0 //defined(HYPRE_USING_CUDA) if (data_location != HYPRE_MEMORY_HOST) { hypre_TFree(values, HYPRE_MEMORY_DEVICE); } else { hypre_TFree(values, HYPRE_MEMORY_HOST); } #else hypre_TFree(values, HYPRE_MEMORY_DEVICE); #endif } } else if ( constant_coefficient == 1 ) { values = hypre_CTAlloc(HYPRE_Real, stencil_size, HYPRE_MEMORY_HOST); switch (dim) { case 1: values[0] = west; values[1] = center; break; case 2: values[0] = west; values[1] = south; values[2] = center; break; case 3: values[0] = west; values[1] = south; values[2] = bottom; values[3] = center; break; } if (hypre_BoxArraySize(gridboxes) > 0) { HYPRE_StructMatrixSetConstantValues(A, stencil_size, stencil_indices, values); } hypre_TFree(values, HYPRE_MEMORY_HOST); } else { hypre_assert( constant_coefficient == 2 ); /* stencil index for the center equals dim, so it's easy to leave out */ values = hypre_CTAlloc(HYPRE_Real, stencil_size - 1, HYPRE_MEMORY_HOST); switch (dim) { case 1: values[0] = west; break; case 2: values[0] = west; values[1] = south; break; case 3: values[0] = west; values[1] = south; values[2] = bottom; break; } if (hypre_BoxArraySize(gridboxes) > 0) { HYPRE_StructMatrixSetConstantValues(A, stencil_size - 1, stencil_indices, values); } hypre_TFree(values, HYPRE_MEMORY_HOST); hypre_ForBoxI(bi, gridboxes) { box = hypre_BoxArrayBox(gridboxes, bi); volume = hypre_BoxVolume(box); #if 0 //defined(HYPRE_USING_CUDA) if (data_location != HYPRE_MEMORY_HOST) { values = hypre_CTAlloc(HYPRE_Real, volume, HYPRE_MEMORY_DEVICE); } else { values = hypre_CTAlloc(HYPRE_Real, volume, HYPRE_MEMORY_HOST); } #else values = hypre_CTAlloc(HYPRE_Real, volume, HYPRE_MEMORY_DEVICE); #endif hypre_LoopBegin(volume, i) { values[i] = center; } hypre_LoopEnd() ilower = hypre_BoxIMin(box); iupper = hypre_BoxIMax(box); HYPRE_StructMatrixSetBoxValues(A, ilower, iupper, 1, stencil_indices + dim, values); #if 0 //defined(HYPRE_USING_CUDA) if (data_location == HYPRE_MEMORY_DEVICE) { hypre_TFree(values, HYPRE_MEMORY_DEVICE); } else { hypre_TFree(values, HYPRE_MEMORY_HOST); } #else hypre_TFree(values, HYPRE_MEMORY_DEVICE); #endif } } } else { if (conx > 0.0) { west -= conx; center += conx; } else if (conx < 0.0) { east += conx; center -= conx; } if (cony > 0.0) { south -= cony; center += cony; } else if (cony < 0.0) { north += cony; center -= cony; } if (conz > 0.0) { bottom -= conz; center += conz; } else if (cony < 0.0) { top += conz; center -= conz; } if ( constant_coefficient == 0 ) { hypre_ForBoxI(bi, gridboxes) { box = hypre_BoxArrayBox(gridboxes, bi); volume = hypre_BoxVolume(box); #if 0 //defined(HYPRE_USING_CUDA) if (data_location < 1) { values = hypre_CTAlloc(HYPRE_Real, stencil_size * volume, HYPRE_MEMORY_DEVICE); } else { values = hypre_CTAlloc(HYPRE_Real, stencil_size * volume, HYPRE_MEMORY_HOST); } #else values = hypre_CTAlloc(HYPRE_Real, stencil_size * volume, HYPRE_MEMORY_DEVICE); #endif hypre_LoopBegin(volume, d) { HYPRE_Int i = stencil_size * d; switch (dim) { case 1: values[i ] = west; values[i + 1] = center; values[i + 2] = east; break; case 2: values[i ] = west; values[i + 1] = south; values[i + 2] = center; values[i + 3] = east; values[i + 4] = north; break; case 3: values[i ] = west; values[i + 1] = south; values[i + 2] = bottom; values[i + 3] = center; values[i + 4] = east; values[i + 5] = north; values[i + 6] = top; break; } } hypre_LoopEnd() ilower = hypre_BoxIMin(box); iupper = hypre_BoxIMax(box); HYPRE_StructMatrixSetBoxValues(A, ilower, iupper, stencil_size, stencil_indices, values); #if 0 //defined(HYPRE_USING_CUDA) if (data_location < 1) { hypre_TFree(values, HYPRE_MEMORY_DEVICE); } else { hypre_TFree(values, HYPRE_MEMORY_HOST); } #else hypre_TFree(values, HYPRE_MEMORY_DEVICE); #endif } } else if ( constant_coefficient == 1 ) { values = hypre_CTAlloc( HYPRE_Real, stencil_size, HYPRE_MEMORY_HOST); switch (dim) { case 1: values[0] = west; values[1] = center; values[2] = east; break; case 2: values[0] = west; values[1] = south; values[2] = center; values[3] = east; values[4] = north; break; case 3: values[0] = west; values[1] = south; values[2] = bottom; values[3] = center; values[4] = east; values[5] = north; values[6] = top; break; } if (hypre_BoxArraySize(gridboxes) > 0) { HYPRE_StructMatrixSetConstantValues(A, stencil_size, stencil_indices, values); } hypre_TFree(values, HYPRE_MEMORY_HOST); } else { hypre_assert( constant_coefficient == 2 ); values = hypre_CTAlloc( HYPRE_Real, stencil_size - 1, HYPRE_MEMORY_HOST); switch (dim) { /* no center in stencil_indices and values */ case 1: stencil_indices[0] = 0; stencil_indices[1] = 2; values[0] = west; values[1] = east; break; case 2: stencil_indices[0] = 0; stencil_indices[1] = 1; stencil_indices[2] = 3; stencil_indices[3] = 4; values[0] = west; values[1] = south; values[2] = east; values[3] = north; break; case 3: stencil_indices[0] = 0; stencil_indices[1] = 1; stencil_indices[2] = 2; stencil_indices[3] = 4; stencil_indices[4] = 5; stencil_indices[5] = 6; values[0] = west; values[1] = south; values[2] = bottom; values[3] = east; values[4] = north; values[5] = top; break; } if (hypre_BoxArraySize(gridboxes) > 0) { HYPRE_StructMatrixSetConstantValues(A, stencil_size, stencil_indices, values); } hypre_TFree(values, HYPRE_MEMORY_HOST); /* center is variable */ stencil_indices[0] = dim; /* refers to center */ hypre_ForBoxI(bi, gridboxes) { box = hypre_BoxArrayBox(gridboxes, bi); volume = hypre_BoxVolume(box); #if 0 //defined(HYPRE_USING_CUDA) if (data_location < 1) { values = hypre_CTAlloc(HYPRE_Real, volume, HYPRE_MEMORY_DEVICE); } else { values = hypre_CTAlloc(HYPRE_Real, volume, HYPRE_MEMORY_HOST); } #else values = hypre_CTAlloc(HYPRE_Real, volume, HYPRE_MEMORY_DEVICE); #endif hypre_LoopBegin(volume, i) { values[i] = center; } hypre_LoopEnd() ilower = hypre_BoxIMin(box); iupper = hypre_BoxIMax(box); HYPRE_StructMatrixSetBoxValues(A, ilower, iupper, 1, stencil_indices, values); #if 0 //defined(HYPRE_USING_CUDA) if (data_location < 1) { hypre_TFree(values, HYPRE_MEMORY_DEVICE); } else { hypre_TFree(values, HYPRE_MEMORY_HOST); } #else hypre_TFree(values, HYPRE_MEMORY_DEVICE); #endif } } } hypre_TFree(stencil_indices, HYPRE_MEMORY_HOST); return ierr; } /********************************************************************************* * this function sets to zero the stencil entries that are on the boundary * Grid, matrix and the period are needed. *********************************************************************************/ HYPRE_Int SetStencilBndry(HYPRE_StructMatrix A, HYPRE_StructGrid gridmatrix, HYPRE_Int* period) { HYPRE_Int ierr = 0; hypre_BoxArray *gridboxes; HYPRE_Int size, i, j, d, ib; HYPRE_Int **ilower; HYPRE_Int **iupper; HYPRE_Int *vol; HYPRE_Int *istart, *iend; hypre_Box *box; hypre_Box *dummybox; hypre_Box *boundingbox; HYPRE_Real *values; HYPRE_Int volume, dim; HYPRE_Int *stencil_indices; HYPRE_Int constant_coefficient; #if 0 //defined(HYPRE_USING_CUDA) HYPRE_Int data_location = hypre_StructGridDataLocation(hypre_StructMatrixGrid(A)); #endif gridboxes = hypre_StructGridBoxes(gridmatrix); boundingbox = hypre_StructGridBoundingBox(gridmatrix); istart = hypre_BoxIMin(boundingbox); iend = hypre_BoxIMax(boundingbox); size = hypre_StructGridNumBoxes(gridmatrix); dim = hypre_StructGridNDim(gridmatrix); stencil_indices = hypre_CTAlloc(HYPRE_Int, 1, HYPRE_MEMORY_HOST); constant_coefficient = hypre_StructMatrixConstantCoefficient(A); if ( constant_coefficient > 0 ) { return 1; } /*...no space dependence if constant_coefficient==1, and space dependence only for diagonal if constant_coefficient==2 -- and this function only touches off-diagonal entries */ vol = hypre_CTAlloc(HYPRE_Int, size, HYPRE_MEMORY_HOST); ilower = hypre_CTAlloc(HYPRE_Int*, size, HYPRE_MEMORY_HOST); iupper = hypre_CTAlloc(HYPRE_Int*, size, HYPRE_MEMORY_HOST); for (i = 0; i < size; i++) { ilower[i] = hypre_CTAlloc(HYPRE_Int, dim, HYPRE_MEMORY_HOST); iupper[i] = hypre_CTAlloc(HYPRE_Int, dim, HYPRE_MEMORY_HOST); } i = 0; ib = 0; hypre_ForBoxI(i, gridboxes) { dummybox = hypre_BoxCreate(dim); box = hypre_BoxArrayBox(gridboxes, i); volume = hypre_BoxVolume(box); vol[i] = volume; hypre_CopyBox(box, dummybox); for (d = 0; d < dim; d++) { ilower[ib][d] = hypre_BoxIMinD(dummybox, d); iupper[ib][d] = hypre_BoxIMaxD(dummybox, d); } ib++ ; hypre_BoxDestroy(dummybox); } if ( constant_coefficient == 0 ) { for (d = 0; d < dim; d++) { for (ib = 0; ib < size; ib++) { #if 0 //defined(HYPRE_USING_CUDA) if (data_location < 1) { values = hypre_CTAlloc(HYPRE_Real, vol[ib], HYPRE_MEMORY_DEVICE); } else { values = hypre_CTAlloc(HYPRE_Real, vol[ib], HYPRE_MEMORY_HOST); } #else values = hypre_CTAlloc(HYPRE_Real, vol[ib], HYPRE_MEMORY_DEVICE); #endif hypre_LoopBegin(vol[ib], i) { values[i] = 0.0; } hypre_LoopEnd() if ( ilower[ib][d] == istart[d] && period[d] == 0 ) { j = iupper[ib][d]; iupper[ib][d] = istart[d]; stencil_indices[0] = d; HYPRE_StructMatrixSetBoxValues(A, ilower[ib], iupper[ib], 1, stencil_indices, values); iupper[ib][d] = j; } if ( iupper[ib][d] == iend[d] && period[d] == 0 ) { j = ilower[ib][d]; ilower[ib][d] = iend[d]; stencil_indices[0] = dim + 1 + d; HYPRE_StructMatrixSetBoxValues(A, ilower[ib], iupper[ib], 1, stencil_indices, values); ilower[ib][d] = j; } #if 0 //defined(HYPRE_USING_CUDA) if (data_location < 1) { hypre_TFree(values, HYPRE_MEMORY_DEVICE); } else { hypre_TFree(values, HYPRE_MEMORY_HOST); } #else hypre_TFree(values, HYPRE_MEMORY_DEVICE); #endif } } } hypre_TFree(vol, HYPRE_MEMORY_HOST); hypre_TFree(stencil_indices, HYPRE_MEMORY_HOST); for (ib = 0 ; ib < size ; ib++) { hypre_TFree(ilower[ib], HYPRE_MEMORY_HOST); hypre_TFree(iupper[ib], HYPRE_MEMORY_HOST); } hypre_TFree(ilower, HYPRE_MEMORY_HOST); hypre_TFree(iupper, HYPRE_MEMORY_HOST); return ierr; } hypre-2.33.0/src/test/test_ij.c000066400000000000000000005342671477326011500163300ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /*-------------------------------------------------------------------------- * Test driver for unstructured matrix interface (IJ_matrix interface). * Do `driver -help' for usage info. * This driver started from the driver for parcsr_linear_solvers, and it * works by first building a parcsr matrix as before and then "copying" * that matrix row-by-row into the IJMatrix interface. AJC 7/99. *--------------------------------------------------------------------------*/ #include #include #include #include "_hypre_utilities.h" #include "HYPRE.h" #include "HYPRE_parcsr_mv.h" #include "HYPRE_IJ_mv.h" #include "HYPRE_parcsr_ls.h" #include "_hypre_parcsr_mv.h" #include "HYPRE_krylov.h" #include "hypre_test.h" /* begin lobpcg */ #define NO_SOLVER -9198 #include #include "HYPRE_lobpcg.h" HYPRE_Int BuildParIsoLaplacian( HYPRE_Int argc, char** argv, HYPRE_ParCSRMatrix *A_ptr ); /* end lobpcg */ HYPRE_Int BuildParFromFile (HYPRE_Int argc, char *argv [], HYPRE_Int arg_index, HYPRE_ParCSRMatrix *A_ptr ); HYPRE_Int BuildParLaplacian (HYPRE_Int argc, char *argv [], HYPRE_Int arg_index, HYPRE_ParCSRMatrix *A_ptr ); HYPRE_Int BuildParDifConv (HYPRE_Int argc, char *argv [], HYPRE_Int arg_index, HYPRE_ParCSRMatrix *A_ptr ); HYPRE_Int BuildParFromOneFile2(HYPRE_Int argc, char *argv [], HYPRE_Int arg_index, HYPRE_Int num_functions, HYPRE_ParCSRMatrix *A_ptr ); HYPRE_Int BuildFuncsFromFiles (HYPRE_Int argc, char *argv [], HYPRE_Int arg_index, HYPRE_ParCSRMatrix A, HYPRE_Int **dof_func_ptr ); HYPRE_Int BuildFuncsFromOneFile (HYPRE_Int argc, char *argv [], HYPRE_Int arg_index, HYPRE_ParCSRMatrix A, HYPRE_Int **dof_func_ptr ); HYPRE_Int BuildRhsParFromOneFile2(HYPRE_Int argc, char *argv [], HYPRE_Int arg_index, HYPRE_Int *partitioning, HYPRE_ParVector *b_ptr ); HYPRE_Int BuildParLaplacian9pt (HYPRE_Int argc, char *argv [], HYPRE_Int arg_index, HYPRE_ParCSRMatrix *A_ptr ); HYPRE_Int BuildParLaplacian27pt (HYPRE_Int argc, char *argv [], HYPRE_Int arg_index, HYPRE_ParCSRMatrix *A_ptr ); #define SECOND_TIME 0 HYPRE_Int main( HYPRE_Int argc, char *argv[] ) { HYPRE_Int arg_index; HYPRE_Int print_usage; HYPRE_Int sparsity_known = 0; HYPRE_Int build_matrix_type; HYPRE_Int build_matrix_arg_index; HYPRE_Int build_rhs_type; HYPRE_Int build_rhs_arg_index; HYPRE_Int build_src_type; HYPRE_Int build_src_arg_index; HYPRE_Int build_funcs_type; HYPRE_Int build_funcs_arg_index; HYPRE_Int matrix_id; HYPRE_Int solver_id; HYPRE_Int precond_id; HYPRE_Int solver_type = 1; HYPRE_Int ioutdat; HYPRE_Int poutdat; HYPRE_Int debug_flag; HYPRE_Int ierr = 0; HYPRE_Int i, j, k; HYPRE_Int indx, rest, tms; HYPRE_Int max_levels = 25; HYPRE_Int num_iterations; HYPRE_Int pcg_num_its; HYPRE_Int dscg_num_its; HYPRE_Int pcg_max_its; HYPRE_Int dscg_max_its; HYPRE_Real cf_tol = 0.9; HYPRE_Real norm; HYPRE_Real final_res_norm; void *object; HYPRE_IJMatrix ij_A; HYPRE_IJVector ij_b; HYPRE_IJVector ij_x; HYPRE_ParCSRMatrix parcsr_A; HYPRE_ParVector b; HYPRE_ParVector x; HYPRE_Solver amg_solver; HYPRE_Solver pcg_solver; HYPRE_Solver pcg_precond, pcg_precond_gotten; HYPRE_Int num_procs, myid; HYPRE_Int local_row; HYPRE_Int *row_sizes; HYPRE_Int *diag_sizes; HYPRE_Int *offdiag_sizes; HYPRE_Int size; HYPRE_Int *col_inds; HYPRE_Int *dof_func; HYPRE_Int num_functions = 1; HYPRE_Int time_index; MPI_Comm comm = hypre_MPI_COMM_WORLD; HYPRE_Int M, N; HYPRE_Int first_local_row, last_local_row, local_num_rows; HYPRE_Int first_local_col, last_local_col, local_num_cols; HYPRE_Int local_num_vars; HYPRE_Int variant, overlap, domain_type; HYPRE_Real schwarz_rlx_weight; HYPRE_Real *values; const HYPRE_Real dt_inf = 1.e40; HYPRE_Real dt = dt_inf; HYPRE_Int print_system = 0; /* begin lobpcg */ HYPRE_Int lobpcgFlag = 0; HYPRE_Int lobpcgGen = 0; HYPRE_Int constrained = 0; HYPRE_Int vFromFileFlag = 0; HYPRE_Int lobpcgSeed = 0; HYPRE_Int blockSize = 1; HYPRE_Int verbosity = 1; HYPRE_Int iterations; HYPRE_Int maxIterations = 100; HYPRE_Int checkOrtho = 0; HYPRE_Int printLevel = 0; HYPRE_Int pcgIterations = 0; HYPRE_Int pcgMode = 1; HYPRE_Real pcgTol = 1e-2; HYPRE_Real nonOrthF; FILE* filePtr; mv_MultiVectorPtr eigenvectors = NULL; mv_MultiVectorPtr constraints = NULL; mv_MultiVectorPtr workspace = NULL; HYPRE_Real* eigenvalues = NULL; HYPRE_Real* residuals; utilities_FortranMatrix* residualNorms; utilities_FortranMatrix* residualNormsHistory; utilities_FortranMatrix* eigenvaluesHistory; utilities_FortranMatrix* printBuffer; utilities_FortranMatrix* gramXX; utilities_FortranMatrix* identity; HYPRE_Solver lobpcg_solver; mv_InterfaceInterpreter* interpreter; HYPRE_MatvecFunctions matvec_fn; HYPRE_IJMatrix ij_B; HYPRE_ParCSRMatrix parcsr_B; /* end lobpcg */ /*----------------------------------------------------------- * Initialize some stuff *-----------------------------------------------------------*/ /* Initialize MPI */ hypre_MPI_Init(&argc, &argv); hypre_MPI_Comm_size(hypre_MPI_COMM_WORLD, &num_procs ); hypre_MPI_Comm_rank(hypre_MPI_COMM_WORLD, &myid ); /*----------------------------------------------------------- * Set defaults *-----------------------------------------------------------*/ build_matrix_type = 2; build_matrix_arg_index = argc; build_rhs_type = 2; build_rhs_arg_index = argc; build_src_type = -1; build_src_arg_index = argc; build_funcs_type = 0; build_funcs_arg_index = argc; relax_default = 3; debug_flag = 0; matrix_id = HYPRE_PARCSR; solver_id = HYPRE_PCG; precond_id = 0; ioutdat = 3; /*----------------------------------------------------------- * Parse command line *-----------------------------------------------------------*/ print_usage = 0; arg_index = 1; while ( (arg_index < argc) && (!print_usage) ) { if ( strcmp(argv[arg_index], "-fromfile") == 0 ) { arg_index++; build_matrix_type = -1; build_matrix_arg_index = arg_index; } else if ( strcmp(argv[arg_index], "-fromparcsrfile") == 0 ) { arg_index++; build_matrix_type = 0; build_matrix_arg_index = arg_index; } else if ( strcmp(argv[arg_index], "-fromonecsrfile") == 0 ) { arg_index++; build_matrix_type = 1; build_matrix_arg_index = arg_index; } else if ( strcmp(argv[arg_index], "-laplacian") == 0 ) { arg_index++; build_matrix_type = 2; build_matrix_arg_index = arg_index; } else if ( strcmp(argv[arg_index], "-9pt") == 0 ) { arg_index++; build_matrix_type = 3; build_matrix_arg_index = arg_index; } else if ( strcmp(argv[arg_index], "-27pt") == 0 ) { arg_index++; build_matrix_type = 4; build_matrix_arg_index = arg_index; } else if ( strcmp(argv[arg_index], "-difconv") == 0 ) { arg_index++; build_matrix_type = 5; build_matrix_arg_index = arg_index; } else if ( strcmp(argv[arg_index], "-funcsfromonefile") == 0 ) { arg_index++; build_funcs_type = 1; build_funcs_arg_index = arg_index; } else if ( strcmp(argv[arg_index], "-funcsfromfile") == 0 ) { arg_index++; build_funcs_type = 2; build_funcs_arg_index = arg_index; } else if ( strcmp(argv[arg_index], "-exact_size") == 0 ) { arg_index++; sparsity_known = 1; } else if ( strcmp(argv[arg_index], "-storage_low") == 0 ) { arg_index++; sparsity_known = 2; } else if ( strcmp(argv[arg_index], "-concrete_parcsr") == 0 ) { arg_index++; build_matrix_arg_index = arg_index; } else if ( strcmp(argv[arg_index], "-matrix") == 0 ) { arg_index++; if ( strcmp(argv[arg_index], "parcsr") == 0 ) { matrix_id = HYPRE_PARCSR; } else if ( strcmp(argv[arg_index], "sstruct") == 0 ) { matrix_id = HYPRE_SSTRUCT; } else if ( strcmp(argv[arg_index], "struct") == 0 ) { matrix_id = HYPRE_STRUCT; }; arg_index++; } else if ( strcmp(argv[arg_index], "-solver") == 0 ) { arg_index++; /* begin lobpcg */ if ( strcmp(argv[arg_index], "none") == 0 ) { solver_id = NO_SOLVER; } /* end lobpcg */ else if ( strcmp(argv[arg_index], "boomeramg") == 0 || strcmp(argv[arg_index], "amg") == 0 ) { solver_id = HYPRE_BOOMERAMG; } else if ( strcmp(argv[arg_index], "bicgstab") == 0 ) { solver_id = HYPRE_BICGSTAB; } else if ( strcmp(argv[arg_index], "cgnr") == 0 ) { solver_id = HYPRE_CGNR; } else if ( strcmp(argv[arg_index], "diagscale") == 0 ) { solver_id = HYPRE_DIAGSCALE; } else if ( strcmp(argv[arg_index], "euclid") == 0 ) { solver_id = HYPRE_EUCLID; } else if ( strcmp(argv[arg_index], "gmres") == 0 ) { solver_id = HYPRE_GMRES; } else if ( strcmp(argv[arg_index], "gsmg") == 0 ) { solver_id = HYPRE_GSMG; } else if ( strcmp(argv[arg_index], "hybrid") == 0 ) { solver_id = HYPRE_HYBRID; } else if ( strcmp(argv[arg_index], "jacobi") == 0 ) { solver_id = HYPRE_JACOBI; } else if ( strcmp(argv[arg_index], "parasails") == 0 ) { solver_id = HYPRE_PARASAILS; } else if ( strcmp(argv[arg_index], "pcg") == 0 ) { solver_id = HYPRE_PCG; } else if ( strcmp(argv[arg_index], "pfmg") == 0 ) { solver_id = HYPRE_PFMG; } else if ( strcmp(argv[arg_index], "pilut") == 0 ) { solver_id = HYPRE_PILUT; } else if ( strcmp(argv[arg_index], "schwarz") == 0 ) { solver_id = HYPRE_SCHWARZ; } else if ( strcmp(argv[arg_index], "smg") == 0 ) { solver_id = HYPRE_SMG; } else if ( strcmp(argv[arg_index], "sparsemsg") == 0 ) { solver_id = HYPRE_SPARSEMSG; } else if ( strcmp(argv[arg_index], "split") == 0 ) { solver_id = HYPRE_SPLIT; } else if ( strcmp(argv[arg_index], "splitpfmg") == 0 ) { solver_id = HYPRE_SPLITPFMG; } else if ( strcmp(argv[arg_index], "splitsmg") == 0 ) { solver_id = HYPRE_SPLITSMG; } else if ( strcmp(argv[arg_index], "syspfmg") == 0 ) { solver_id = HYPRE_SYSPFMG; }; arg_index++; } else if ( strcmp(argv[arg_index], "-precond") == 0 ) { arg_index++; /* begin lobpcg */ if ( strcmp(argv[arg_index], "none") == 0 ) { precond_id = NO_SOLVER; } /* end lobpcg */ else if ( strcmp(argv[arg_index], "boomeramg") == 0 || strcmp(argv[arg_index], "amg") == 0 ) { precond_id = HYPRE_BOOMERAMG; } else if ( strcmp(argv[arg_index], "bicgstab") == 0 ) { precond_id = HYPRE_BICGSTAB; } else if ( strcmp(argv[arg_index], "cgnr") == 0 ) { precond_id = HYPRE_CGNR; } else if ( strcmp(argv[arg_index], "diagscale") == 0 ) { precond_id = HYPRE_DIAGSCALE; } else if ( strcmp(argv[arg_index], "euclid") == 0 ) { precond_id = HYPRE_EUCLID; } else if ( strcmp(argv[arg_index], "gmres") == 0 ) { precond_id = HYPRE_GMRES; } else if ( strcmp(argv[arg_index], "gsmg") == 0 ) { precond_id = HYPRE_GSMG; } else if ( strcmp(argv[arg_index], "hybrid") == 0 ) { precond_id = HYPRE_HYBRID; } else if ( strcmp(argv[arg_index], "jacobi") == 0 ) { precond_id = HYPRE_JACOBI; } else if ( strcmp(argv[arg_index], "parasails") == 0 ) { precond_id = HYPRE_PARASAILS; } else if ( strcmp(argv[arg_index], "pcg") == 0 ) { precond_id = HYPRE_PCG; } else if ( strcmp(argv[arg_index], "pfmg") == 0 ) { precond_id = HYPRE_PFMG; } else if ( strcmp(argv[arg_index], "pilut") == 0 ) { precond_id = HYPRE_PILUT; } else if ( strcmp(argv[arg_index], "schwarz") == 0 ) { precond_id = HYPRE_SCHWARZ; } else if ( strcmp(argv[arg_index], "smg") == 0 ) { precond_id = HYPRE_SMG; } else if ( strcmp(argv[arg_index], "sparsemsg") == 0 ) { precond_id = HYPRE_SPARSEMSG; } else if ( strcmp(argv[arg_index], "split") == 0 ) { precond_id = HYPRE_SPLIT; } else if ( strcmp(argv[arg_index], "splitpfmg") == 0 ) { precond_id = HYPRE_SPLITPFMG; } else if ( strcmp(argv[arg_index], "splitsmg") == 0 ) { precond_id = HYPRE_SPLITSMG; } else if ( strcmp(argv[arg_index], "syspfmg") == 0 ) { precond_id = HYPRE_SYSPFMG; }; arg_index++; } else if ( strcmp(argv[arg_index], "-rhsfromfile") == 0 ) { arg_index++; build_rhs_type = 0; build_rhs_arg_index = arg_index; } else if ( strcmp(argv[arg_index], "-rhsfromonefile") == 0 ) { arg_index++; build_rhs_type = 1; build_rhs_arg_index = arg_index; } else if ( strcmp(argv[arg_index], "-rhsisone") == 0 ) { arg_index++; build_rhs_type = 2; build_rhs_arg_index = arg_index; } else if ( strcmp(argv[arg_index], "-rhsrand") == 0 ) { arg_index++; build_rhs_type = 3; build_rhs_arg_index = arg_index; } else if ( strcmp(argv[arg_index], "-xisone") == 0 ) { arg_index++; build_rhs_type = 4; build_rhs_arg_index = arg_index; } else if ( strcmp(argv[arg_index], "-rhszero") == 0 ) { arg_index++; build_rhs_type = 5; build_rhs_arg_index = arg_index; } else if ( strcmp(argv[arg_index], "-srcfromfile") == 0 ) { arg_index++; build_src_type = 0; build_rhs_type = -1; build_src_arg_index = arg_index; } else if ( strcmp(argv[arg_index], "-srcfromonefile") == 0 ) { arg_index++; build_src_type = 1; build_rhs_type = -1; build_src_arg_index = arg_index; } else if ( strcmp(argv[arg_index], "-srcisone") == 0 ) { arg_index++; build_src_type = 2; build_rhs_type = -1; build_src_arg_index = arg_index; } else if ( strcmp(argv[arg_index], "-srcrand") == 0 ) { arg_index++; build_src_type = 3; build_rhs_type = -1; build_src_arg_index = arg_index; } else if ( strcmp(argv[arg_index], "-srczero") == 0 ) { arg_index++; build_src_type = 4; build_rhs_type = -1; build_src_arg_index = arg_index; } else if ( strcmp(argv[arg_index], "-cljp") == 0 ) { arg_index++; coarsen_type = 0; } else if ( strcmp(argv[arg_index], "-cljp1") == 0 ) { arg_index++; coarsen_type = 7; } else if ( strcmp(argv[arg_index], "-ruge") == 0 ) { arg_index++; coarsen_type = 1; } else if ( strcmp(argv[arg_index], "-ruge2b") == 0 ) { arg_index++; coarsen_type = 2; } else if ( strcmp(argv[arg_index], "-ruge3") == 0 ) { arg_index++; coarsen_type = 3; } else if ( strcmp(argv[arg_index], "-ruge3c") == 0 ) { arg_index++; coarsen_type = 4; } else if ( strcmp(argv[arg_index], "-rugerlx") == 0 ) { arg_index++; coarsen_type = 5; } else if ( strcmp(argv[arg_index], "-falgout") == 0 ) { arg_index++; coarsen_type = 6; } else if ( strcmp(argv[arg_index], "-nohybrid") == 0 ) { arg_index++; hybrid = -1; } else if ( strcmp(argv[arg_index], "-gm") == 0 ) { arg_index++; measure_type = 1; } else if ( strcmp(argv[arg_index], "-rlx") == 0 ) { arg_index++; relax_default = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-smtype") == 0 ) { arg_index++; smooth_type = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-smlv") == 0 ) { arg_index++; smooth_num_levels = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-mxl") == 0 ) { arg_index++; max_levels = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-dbg") == 0 ) { arg_index++; debug_flag = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-nf") == 0 ) { arg_index++; num_functions = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-ns") == 0 ) { arg_index++; num_sweep = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-sns") == 0 ) { arg_index++; smooth_num_sweeps = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-dt") == 0 ) { arg_index++; dt = (HYPRE_Real)atof(argv[arg_index++]); build_rhs_type = -1; if ( build_src_type == -1 ) { build_src_type = 2; } } else if ( strcmp(argv[arg_index], "-help") == 0 ) { print_usage = 1; } /* begin lobpcg */ else if ( strcmp(argv[arg_index], "-lobpcg") == 0 ) { /* use lobpcg */ arg_index++; lobpcgFlag = 1; } else if ( strcmp(argv[arg_index], "-gen") == 0 ) { /* generalized evp */ arg_index++; lobpcgGen = 1; } else if ( strcmp(argv[arg_index], "-con") == 0 ) { /* constrained evp */ arg_index++; constrained = 1; } else if ( strcmp(argv[arg_index], "-orthchk") == 0 ) { /* lobpcg: check orthonormality */ arg_index++; checkOrtho = 1; } else if ( strcmp(argv[arg_index], "-vfromfile") == 0 ) { /* lobpcg: get initial vectors from file */ arg_index++; vFromFileFlag = 1; } else if ( strcmp(argv[arg_index], "-vrand") == 0 ) { /* lobpcg: block size */ arg_index++; blockSize = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-seed") == 0 ) { /* lobpcg: seed for srand */ arg_index++; lobpcgSeed = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-itr") == 0 ) { /* lobpcg: max # of iterations */ arg_index++; maxIterations = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-verb") == 0 ) { /* lobpcg: verbosity level */ arg_index++; verbosity = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-vout") == 0 ) { /* lobpcg: print level */ arg_index++; printLevel = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-pcgitr") == 0 ) { /* lobpcg: inner pcg iterations */ arg_index++; pcgIterations = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-pcgtol") == 0 ) { /* lobpcg: inner pcg iterations */ arg_index++; pcgTol = (HYPRE_Real)atof(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-pcgmode") == 0 ) { /* lobpcg: initial guess for inner pcg */ arg_index++; /* 0: zero, otherwise rhs */ pcgMode = atoi(argv[arg_index++]); } /* end lobpcg */ else { arg_index++; } } /* begin lobpcg */ if ( solver_id == HYPRE_BOOMERAMG && lobpcgFlag ) { solver_id = HYPRE_BOOMERAMG; precond_id = HYPRE_PCG; }; /* end lobpcg */ if (solver_id == HYPRE_PARASAILS) { max_levels = 1; } /* defaults for BoomerAMG */ if (solver_id == HYPRE_BOOMERAMG) { strong_threshold = 0.25; trunc_factor = 0.; cycle_type = 1; num_grid_sweeps = hypre_CTAlloc(HYPRE_Int, 4, HYPRE_MEMORY_HOST); grid_relax_type = hypre_CTAlloc(HYPRE_Int, 4, HYPRE_MEMORY_HOST); grid_relax_points = hypre_CTAlloc(HYPRE_Int *, 4, HYPRE_MEMORY_HOST); relax_weight = hypre_CTAlloc(HYPRE_Real, max_levels, HYPRE_MEMORY_HOST); omega = hypre_CTAlloc(HYPRE_Real, max_levels, HYPRE_MEMORY_HOST); for (i = 0; i < max_levels; i++) { relax_weight[i] = 1.; omega[i] = 1.; } /* for CGNR preconditioned with Boomeramg, only relaxation scheme 0 is implemented, i.e. Jacobi relaxation */ if (precond_id == HYPRE_CGNR) { /* fine grid */ relax_default = 7; grid_relax_type[0] = relax_default; num_grid_sweeps[0] = num_sweep; grid_relax_points[0] = hypre_CTAlloc(HYPRE_Int, num_sweep, HYPRE_MEMORY_HOST); for (i = 0; i < num_sweep; i++) { grid_relax_points[0][i] = 0; } /* down cycle */ grid_relax_type[1] = relax_default; num_grid_sweeps[1] = num_sweep; grid_relax_points[1] = hypre_CTAlloc(HYPRE_Int, num_sweep, HYPRE_MEMORY_HOST); for (i = 0; i < num_sweep; i++) { grid_relax_points[1][i] = 0; } /* up cycle */ grid_relax_type[2] = relax_default; num_grid_sweeps[2] = num_sweep; grid_relax_points[2] = hypre_CTAlloc(HYPRE_Int, num_sweep, HYPRE_MEMORY_HOST); for (i = 0; i < num_sweep; i++) { grid_relax_points[2][i] = 0; } } else if (coarsen_type == 5) { /* fine grid */ num_grid_sweeps[0] = 3; grid_relax_type[0] = relax_default; grid_relax_points[0] = hypre_CTAlloc(HYPRE_Int, 3, HYPRE_MEMORY_HOST); grid_relax_points[0][0] = -2; grid_relax_points[0][1] = -1; grid_relax_points[0][2] = 1; /* down cycle */ num_grid_sweeps[1] = 4; grid_relax_type[1] = relax_default; grid_relax_points[1] = hypre_CTAlloc(HYPRE_Int, 4, HYPRE_MEMORY_HOST); grid_relax_points[1][0] = -1; grid_relax_points[1][1] = 1; grid_relax_points[1][2] = -2; grid_relax_points[1][3] = -2; /* up cycle */ num_grid_sweeps[2] = 4; grid_relax_type[2] = relax_default; grid_relax_points[2] = hypre_CTAlloc(HYPRE_Int, 4, HYPRE_MEMORY_HOST); grid_relax_points[2][0] = -2; grid_relax_points[2][1] = -2; grid_relax_points[2][2] = 1; grid_relax_points[2][3] = -1; } else { /* fine grid */ grid_relax_type[0] = relax_default; /*num_grid_sweeps[0] = num_sweep; grid_relax_points[0] = hypre_CTAlloc(HYPRE_Int, num_sweep, HYPRE_MEMORY_HOST); for (i=0; i]\n", argv[0]); hypre_printf("\n"); hypre_printf(" -fromfile : "); hypre_printf("matrix read from multiple files (IJ format)\n"); hypre_printf(" -fromparcsrfile : "); hypre_printf("matrix read from multiple files (ParCSR format)\n"); hypre_printf(" -fromonecsrfile : "); hypre_printf("matrix read from a single file (CSR format)\n"); hypre_printf("\n"); hypre_printf(" -laplacian [] : build 5pt 2D laplacian problem (default) \n"); hypre_printf(" -9pt [] : build 9pt 2D laplacian problem\n"); hypre_printf(" -27pt [] : build 27pt 3D laplacian problem\n"); hypre_printf(" -difconv [] : build convection-diffusion problem\n"); hypre_printf(" -n : total problem size \n"); hypre_printf(" -P : processor topology\n"); hypre_printf(" -c : diffusion coefficients\n"); hypre_printf(" -a : convection coefficients\n"); hypre_printf("\n"); hypre_printf(" -exact_size : inserts immediately into ParCSR structure\n"); hypre_printf(" -storage_low : allocates not enough storage for aux struct\n"); hypre_printf(" -concrete_parcsr : use parcsr matrix type as concrete type\n"); hypre_printf("\n"); hypre_printf(" -rhsfromfile : "); hypre_printf("rhs read from multiple files (IJ format)\n"); hypre_printf(" -rhsfromonefile : "); hypre_printf("rhs read from a single file (CSR format)\n"); hypre_printf(" -rhsrand : rhs is random vector\n"); hypre_printf(" -rhsisone : rhs is vector with unit components (default)\n"); hypre_printf(" -xisone : solution of all ones\n"); hypre_printf(" -rhszero : rhs is zero vector\n"); hypre_printf("\n"); hypre_printf(" -dt : specify finite backward Euler time step\n"); hypre_printf(" : -rhsfromfile, -rhsfromonefile, -rhsrand,\n"); hypre_printf(" : -rhsrand, or -xisone will be ignored\n"); hypre_printf(" -srcfromfile : "); hypre_printf("backward Euler source read from multiple files (IJ format)\n"); hypre_printf(" -srcfromonefile : "); hypre_printf("backward Euler source read from a single file (IJ format)\n"); hypre_printf(" -srcrand : "); hypre_printf("backward Euler source is random vector with components in range 0 - 1\n"); hypre_printf(" -srcisone : "); hypre_printf("backward Euler source is vector with unit components (default)\n"); hypre_printf(" -srczero : "); hypre_printf("backward Euler source is zero-vector\n"); hypre_printf("\n"); hypre_printf(" -matrix : matrix ID\n"); hypre_printf(" allowed options: \n"); hypre_printf(" parcsr \n"); hypre_printf(" sstruct \n"); hypre_printf(" struct \n"); hypre_printf("\n"); hypre_printf(" -solver : solver ID\n"); hypre_printf(" allowed options: \n"); hypre_printf(" amg || boomeramg \n"); hypre_printf(" bicgstab \n"); hypre_printf(" cgnr \n"); hypre_printf(" diagscale || ds \n"); hypre_printf(" euclid \n"); hypre_printf(" gmres \n"); hypre_printf(" gsmg \n"); hypre_printf(" hybrid \n"); hypre_printf(" jacobi \n"); hypre_printf(" parasails \n"); hypre_printf(" pcg \n"); hypre_printf(" pfmg \n"); hypre_printf(" pilut \n"); hypre_printf(" schwarz \n"); hypre_printf(" smg \n"); hypre_printf(" sparsemsg \n"); hypre_printf(" split \n"); hypre_printf(" splitpfmg \n"); hypre_printf(" splitsmg \n"); hypre_printf(" syspfmg \n"); hypre_printf("\n"); hypre_printf(" -preconditioner : precond ID\n"); hypre_printf(" allowed options: \n"); hypre_printf(" amg || boomeramg \n"); hypre_printf(" bicgstab \n"); hypre_printf(" cgnr \n"); hypre_printf(" diagscale || ds \n"); hypre_printf(" euclid \n"); hypre_printf(" gmres \n"); hypre_printf(" gsmg \n"); hypre_printf(" hybrid \n"); hypre_printf(" jacobi \n"); hypre_printf(" parasails \n"); hypre_printf(" pcg \n"); hypre_printf(" pfmg \n"); hypre_printf(" pilut \n"); hypre_printf(" schwarz \n"); hypre_printf(" smg \n"); hypre_printf(" sparsemsg \n"); hypre_printf(" split \n"); hypre_printf(" splitpfmg \n"); hypre_printf(" splitsmg \n"); hypre_printf(" syspfmg \n"); hypre_printf("\n"); hypre_printf(" -cljp : CLJP coarsening \n"); hypre_printf(" -ruge : Ruge coarsening (local)\n"); hypre_printf(" -ruge3 : third pass on boundary\n"); hypre_printf(" -ruge3c : third pass on boundary, keep c-points\n"); hypre_printf(" -ruge2b : 2nd pass is global\n"); hypre_printf(" -rugerlx : relaxes special points\n"); hypre_printf(" -falgout : local ruge followed by LJP\n"); hypre_printf(" -nohybrid : no switch in coarsening\n"); hypre_printf(" -gm : use global measures\n"); hypre_printf("\n"); hypre_printf(" -rlx : relaxation type\n"); hypre_printf(" 0=Weighted Jacobi \n"); hypre_printf(" 1=Gauss-Seidel (very slow!) \n"); hypre_printf(" 3=Hybrid Jacobi/Gauss-Seidel \n"); hypre_printf(" -ns : Use sweeps on each level\n"); hypre_printf(" (default C/F down, F/C up, F/C fine\n"); hypre_printf("\n"); hypre_printf(" -mu : set AMG cycles (1=V, 2=W, etc.)\n"); hypre_printf(" -th : set AMG threshold Theta = val \n"); hypre_printf(" -tr : set AMG interpolation truncation factor = val \n"); hypre_printf(" -mxrs : set AMG maximum row sum threshold for dependency weakening \n"); hypre_printf(" -nf : set number of functions for systems AMG\n"); hypre_printf(" -numsamp : set number of sample vectors for GSMG\n"); hypre_printf(" -interptype : set to 1 to get LS interpolation\n"); hypre_printf(" : set to 2 to get interpolation for hyperbolic equations\n"); hypre_printf(" -solver_type : sets solver within Hybrid solver\n"); hypre_printf(" : 1 PCG (default)\n"); hypre_printf(" : 2 GMRES\n"); hypre_printf(" : 3 BiCGSTAB\n"); hypre_printf(" -w : set Jacobi relax weight = val\n"); hypre_printf(" -k : dimension Krylov space for GMRES\n"); hypre_printf(" -mxl : maximum number of levels (AMG, ParaSAILS)\n"); hypre_printf(" -tol : set solver convergence tolerance = val\n"); hypre_printf("\n"); hypre_printf(" -sai_th : set ParaSAILS threshold = val \n"); hypre_printf(" -sai_filt : set ParaSAILS filter = val \n"); hypre_printf("\n"); hypre_printf(" -drop_tol : set threshold for dropping in PILUT\n"); hypre_printf(" -nonzeros_to_keep : number of nonzeros in each row to keep\n"); hypre_printf("\n"); hypre_printf(" -iout : set output flag\n"); hypre_printf(" 0=no output 1=matrix stats\n"); hypre_printf(" 2=cycle stats 3=matrix & cycle stats\n"); hypre_printf("\n"); hypre_printf(" -dbg : set debug flag\n"); hypre_printf(" 0=no debugging\n 1=internal timing\n 2=interpolation truncation\n 3=more detailed timing in coarsening routine\n"); hypre_printf("\n"); hypre_printf(" -print : print out the system\n"); hypre_printf("\n"); /* begin lobpcg */ hypre_printf("LOBPCG options:\n"); hypre_printf("\n"); hypre_printf(" -lobpcg : run LOBPCG instead of PCG\n"); hypre_printf("\n"); hypre_printf(" -gen : solve generalized EVP with B = Laplacian\n"); hypre_printf("\n"); hypre_printf(" -con : solve constrained EVP using 'vectors.*.*'\n"); hypre_printf(" as constraints (see -vout 1 below)\n"); hypre_printf("\n"); hypre_printf(" -solver none : no HYPRE preconditioner is used\n"); hypre_printf("\n"); hypre_printf(" -itr : maximal number of LOBPCG iterations\n"); hypre_printf(" (default 100);\n"); hypre_printf("\n"); hypre_printf(" -vrand : compute eigenpairs using random\n"); hypre_printf(" initial vectors (default 1)\n"); hypre_printf("\n"); hypre_printf(" -seed : use as the seed for the random\n"); hypre_printf(" number generator(default seed is based\n"); hypre_printf(" on the time of the run)\n"); hypre_printf("\n"); hypre_printf(" -vfromfile : read initial vectors from files\n"); hypre_printf(" vectors.i.j where i is vector number\n"); hypre_printf(" and j is processor number\n"); hypre_printf("\n"); hypre_printf(" -orthchk : check eigenvectors for orthonormality\n"); hypre_printf("\n"); hypre_printf(" -verb : verbosity level\n"); hypre_printf(" -verb 0 : no print\n"); hypre_printf(" -verb 1 : print initial eigenvalues and residuals,\n"); hypre_printf(" the iteration number, the number of\n"); hypre_printf(" non-convergent eigenpairs and final\n"); hypre_printf(" eigenvalues and residuals (default)\n"); hypre_printf(" -verb 2 : print eigenvalues and residuals on each\n"); hypre_printf(" iteration\n"); hypre_printf("\n"); hypre_printf(" -pcgitr : maximal number of inner PCG iterations\n"); hypre_printf(" for preconditioning (default 1);\n"); hypre_printf(" if = 0 then the preconditioner\n"); hypre_printf(" is applied directly\n"); hypre_printf("\n"); hypre_printf(" -pcgtol : residual tolerance for inner iterations\n"); hypre_printf(" (default 0.01)\n"); hypre_printf("\n"); hypre_printf(" -vout : file output level\n"); hypre_printf(" -vout 0 : no files created (default)\n"); hypre_printf(" -vout 1 : write eigenvalues to values.txt, residuals\n"); hypre_printf(" to residuals.txt and eigenvectors to \n"); hypre_printf(" vectors.i.j where i is vector number\n"); hypre_printf(" and j is processor number\n"); hypre_printf(" -vout 2 : in addition to the above, write the\n"); hypre_printf(" eigenvalues history (the matrix whose\n"); hypre_printf(" i-th column contains eigenvalues at\n"); hypre_printf(" (i+1)-th iteration) to val_hist.txt and\n"); hypre_printf(" residuals history to res_hist.txt\n"); hypre_printf("\nNOTE: in this test driver LOBPCG only works with solvers 1, 2, 8, 12, 14 and 43\n"); hypre_printf("\ndefault solver is 1\n"); hypre_printf("\n"); /* end lobpcg */ exit(1); } /*----------------------------------------------------------- * Print driver parameters *-----------------------------------------------------------*/ if (myid == 0) { hypre_printf("Running with these driver parameters:\n"); hypre_printf(" matrix ID = %d\n", matrix_id); hypre_printf(" solver ID = %d\n", solver_id); hypre_printf(" precond ID = %d\n\n", precond_id); } /*----------------------------------------------------------- * Set up matrix *-----------------------------------------------------------*/ if ( myid == 0 && dt != dt_inf) { hypre_printf(" Backward Euler time step with dt = %e\n", dt); hypre_printf(" Dirichlet 0 BCs are implicit in the spatial operator\n"); } if ( build_matrix_type == -1 ) { HYPRE_IJMatrixRead( argv[build_matrix_arg_index], comm, HYPRE_PARCSR, &ij_A ); } else if ( build_matrix_type == 0 ) { BuildParFromFile(argc, argv, build_matrix_arg_index, &parcsr_A); } else if ( build_matrix_type == 1 ) { BuildParFromOneFile2(argc, argv, build_matrix_arg_index, num_functions, &parcsr_A); } else if ( build_matrix_type == 2 ) { BuildParLaplacian(argc, argv, build_matrix_arg_index, &parcsr_A); } else if ( build_matrix_type == 3 ) { BuildParLaplacian9pt(argc, argv, build_matrix_arg_index, &parcsr_A); } else if ( build_matrix_type == 4 ) { BuildParLaplacian27pt(argc, argv, build_matrix_arg_index, &parcsr_A); } else if ( build_matrix_type == 5 ) { BuildParDifConv(argc, argv, build_matrix_arg_index, &parcsr_A); } else { hypre_printf("You have asked for an unsupported problem with\n"); hypre_printf("build_matrix_type = %d.\n", build_matrix_type); return (-1); } time_index = hypre_InitializeTiming("Spatial operator"); hypre_BeginTiming(time_index); if (build_matrix_type < 0) { ierr += HYPRE_IJMatrixGetObject( ij_A, &object); parcsr_A = (HYPRE_ParCSRMatrix) object; ierr = HYPRE_ParCSRMatrixGetLocalRange( parcsr_A, &first_local_row, &last_local_row, &first_local_col, &last_local_col ); local_num_rows = last_local_row - first_local_row + 1; local_num_cols = last_local_col - first_local_col + 1; } else { /*----------------------------------------------------------- * Copy the parcsr matrix into the IJMatrix through interface calls *-----------------------------------------------------------*/ ierr = HYPRE_ParCSRMatrixGetLocalRange( parcsr_A, &first_local_row, &last_local_row, &first_local_col, &last_local_col ); local_num_rows = last_local_row - first_local_row + 1; local_num_cols = last_local_col - first_local_col + 1; ierr += HYPRE_ParCSRMatrixGetDims( parcsr_A, &M, &N ); ierr += HYPRE_IJMatrixCreate( comm, first_local_row, last_local_row, first_local_col, last_local_col, &ij_A ); ierr += HYPRE_IJMatrixSetObjectType( ij_A, HYPRE_PARCSR ); /* the following shows how to build an IJMatrix if one has only an estimate for the row sizes */ if (sparsity_known == 1) { /* build IJMatrix using exact row_sizes for diag and offdiag */ diag_sizes = hypre_CTAlloc(HYPRE_Int, local_num_rows, HYPRE_MEMORY_HOST); offdiag_sizes = hypre_CTAlloc(HYPRE_Int, local_num_rows, HYPRE_MEMORY_HOST); local_row = 0; for (i = first_local_row; i <= last_local_row; i++) { ierr += HYPRE_ParCSRMatrixGetRow( parcsr_A, i, &size, &col_inds, &values ); for (j = 0; j < size; j++) { if (col_inds[j] < first_local_row || col_inds[j] > last_local_row) { offdiag_sizes[local_row]++; } else { diag_sizes[local_row]++; } } local_row++; ierr += HYPRE_ParCSRMatrixRestoreRow( parcsr_A, i, &size, &col_inds, &values ); } ierr += HYPRE_IJMatrixSetDiagOffdSizes( ij_A, (const HYPRE_Int *) diag_sizes, (const HYPRE_Int *) offdiag_sizes ); hypre_TFree(diag_sizes, HYPRE_MEMORY_HOST); hypre_TFree(offdiag_sizes, HYPRE_MEMORY_HOST); ierr = HYPRE_IJMatrixInitialize( ij_A ); for (i = first_local_row; i <= last_local_row; i++) { ierr += HYPRE_ParCSRMatrixGetRow( parcsr_A, i, &size, &col_inds, &values ); ierr += HYPRE_IJMatrixSetValues( ij_A, 1, &size, &i, (const HYPRE_Int *) col_inds, (const HYPRE_Real *) values ); ierr += HYPRE_ParCSRMatrixRestoreRow( parcsr_A, i, &size, &col_inds, &values ); } } else { row_sizes = hypre_CTAlloc(HYPRE_Int, local_num_rows, HYPRE_MEMORY_HOST); size = 5; /* this is in general too low, and supposed to test the capability of the reallocation of the interface */ if (sparsity_known == 0) /* tries a more accurate estimate of the storage */ { if (build_matrix_type == 2) { size = 7; } if (build_matrix_type == 3) { size = 9; } if (build_matrix_type == 4) { size = 27; } } for (i = 0; i < local_num_rows; i++) { row_sizes[i] = size; } ierr = HYPRE_IJMatrixSetRowSizes ( ij_A, (const HYPRE_Int *) row_sizes ); hypre_TFree(row_sizes, HYPRE_MEMORY_HOST); ierr = HYPRE_IJMatrixInitialize( ij_A ); /* Loop through all locally stored rows and insert them into ij_matrix */ for (i = first_local_row; i <= last_local_row; i++) { ierr += HYPRE_ParCSRMatrixGetRow( parcsr_A, i, &size, &col_inds, &values ); ierr += HYPRE_IJMatrixSetValues( ij_A, 1, &size, &i, (const HYPRE_Int *) col_inds, (const HYPRE_Real *) values ); ierr += HYPRE_ParCSRMatrixRestoreRow( parcsr_A, i, &size, &col_inds, &values ); } } ierr += HYPRE_IJMatrixAssemble( ij_A ); } hypre_EndTiming(time_index); hypre_PrintTiming("IJ Matrix Setup", hypre_MPI_COMM_WORLD); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); if (ierr) { hypre_printf("Error in driver building IJMatrix from parcsr matrix. \n"); return (-1); } /* This is to emphasize that one can IJMatrixAddToValues after an IJMatrixRead or an IJMatrixAssemble. After an IJMatrixRead, assembly is unnecessary if the sparsity pattern of the matrix is not changed somehow. If one has not used IJMatrixRead, one has the opportunity to IJMatrixAddTo before a IJMatrixAssemble. */ ierr = HYPRE_IJMatrixInitialize( ij_A ); /* Loop through all locally stored rows and insert them into ij_matrix */ for (i = first_local_row; i <= last_local_row; i++) { ierr += HYPRE_ParCSRMatrixGetRow( parcsr_A, i, &size, &col_inds, &values ); ierr += HYPRE_IJMatrixSetValues( ij_A, 1, &size, &i, (const HYPRE_Int *) col_inds, (const HYPRE_Real *) values ); ierr += HYPRE_ParCSRMatrixRestoreRow( parcsr_A, i, &size, &col_inds, &values ); } /* If sparsity pattern is not changed since last IJMatrixAssemble call, this should be a no-op */ ierr += HYPRE_IJMatrixAssemble( ij_A ); /*----------------------------------------------------------- * Fetch the resulting underlying matrix out *-----------------------------------------------------------*/ if (build_matrix_type > -1) { ierr += HYPRE_ParCSRMatrixDestroy(parcsr_A); } ierr += HYPRE_IJMatrixGetObject( ij_A, &object); parcsr_A = (HYPRE_ParCSRMatrix) object; /*----------------------------------------------------------- * Set up the RHS and initial guess *-----------------------------------------------------------*/ time_index = hypre_InitializeTiming("RHS and Initial Guess"); hypre_BeginTiming(time_index); if ( build_rhs_type == 0 ) { if (myid == 0) { hypre_printf(" RHS vector read from file %s\n", argv[build_rhs_arg_index]); hypre_printf(" Initial guess is 0\n"); } /* RHS */ ierr = HYPRE_IJVectorRead( argv[build_rhs_arg_index], hypre_MPI_COMM_WORLD, HYPRE_PARCSR, &ij_b ); ierr = HYPRE_IJVectorGetObject( ij_b, &object ); b = (HYPRE_ParVector) object; /* Initial guess */ HYPRE_IJVectorCreate(hypre_MPI_COMM_WORLD, first_local_col, last_local_col, &ij_x); HYPRE_IJVectorSetObjectType(ij_x, HYPRE_PARCSR); HYPRE_IJVectorInitialize(ij_x); values = hypre_CTAlloc(HYPRE_Real, local_num_cols, HYPRE_MEMORY_HOST); for (i = 0; i < local_num_cols; i++) { values[i] = 0.; } HYPRE_IJVectorSetValues(ij_x, local_num_cols, NULL, values); hypre_TFree(values, HYPRE_MEMORY_HOST); ierr = HYPRE_IJVectorGetObject( ij_x, &object ); x = (HYPRE_ParVector) object; } else if ( build_rhs_type == 1 ) { hypre_printf("build_rhs_type == 1 not currently implemented\n"); return (-1); #if 0 /* RHS */ BuildRhsParFromOneFile2(argc, argv, build_rhs_arg_index, part_b, &b); #endif } else if ( build_rhs_type == 2 ) { if (myid == 0) { hypre_printf(" RHS vector has unit components\n"); hypre_printf(" Initial guess is 0\n"); } /* RHS */ HYPRE_IJVectorCreate(hypre_MPI_COMM_WORLD, first_local_row, last_local_row, &ij_b); HYPRE_IJVectorSetObjectType(ij_b, HYPRE_PARCSR); HYPRE_IJVectorInitialize(ij_b); values = hypre_CTAlloc(HYPRE_Real, local_num_rows, HYPRE_MEMORY_HOST); for (i = 0; i < local_num_rows; i++) { values[i] = 1.0; } HYPRE_IJVectorSetValues(ij_b, local_num_rows, NULL, values); hypre_TFree(values, HYPRE_MEMORY_HOST); ierr = HYPRE_IJVectorGetObject( ij_b, &object ); b = (HYPRE_ParVector) object; /* Initial guess */ HYPRE_IJVectorCreate(hypre_MPI_COMM_WORLD, first_local_col, last_local_col, &ij_x); HYPRE_IJVectorSetObjectType(ij_x, HYPRE_PARCSR); HYPRE_IJVectorInitialize(ij_x); values = hypre_CTAlloc(HYPRE_Real, local_num_cols, HYPRE_MEMORY_HOST); for (i = 0; i < local_num_cols; i++) { values[i] = 0.; } HYPRE_IJVectorSetValues(ij_x, local_num_cols, NULL, values); hypre_TFree(values, HYPRE_MEMORY_HOST); ierr = HYPRE_IJVectorGetObject( ij_x, &object ); x = (HYPRE_ParVector) object; } else if ( build_rhs_type == 3 ) { if (myid == 0) { hypre_printf(" RHS vector has random components and unit 2-norm\n"); hypre_printf(" Initial guess is 0\n"); } /* RHS */ HYPRE_IJVectorCreate(hypre_MPI_COMM_WORLD, first_local_row, last_local_row, &ij_b); HYPRE_IJVectorSetObjectType(ij_b, HYPRE_PARCSR); HYPRE_IJVectorInitialize(ij_b); ierr = HYPRE_IJVectorGetObject( ij_b, &object ); b = (HYPRE_ParVector) object; /* For purposes of this test, HYPRE_ParVector functions are used, but these are not necessary. For a clean use of the interface, the user "should" modify components of ij_x by using functions HYPRE_IJVectorSetValues or HYPRE_IJVectorAddToValues */ HYPRE_ParVectorSetRandomValues(b, 22775); HYPRE_ParVectorInnerProd(b, b, &norm); norm = 1. / hypre_sqrt(norm); ierr = HYPRE_ParVectorScale(norm, b); /* Initial guess */ HYPRE_IJVectorCreate(hypre_MPI_COMM_WORLD, first_local_col, last_local_col, &ij_x); HYPRE_IJVectorSetObjectType(ij_x, HYPRE_PARCSR); HYPRE_IJVectorInitialize(ij_x); values = hypre_CTAlloc(HYPRE_Real, local_num_cols, HYPRE_MEMORY_HOST); for (i = 0; i < local_num_cols; i++) { values[i] = 0.; } HYPRE_IJVectorSetValues(ij_x, local_num_cols, NULL, values); hypre_TFree(values, HYPRE_MEMORY_HOST); ierr = HYPRE_IJVectorGetObject( ij_x, &object ); x = (HYPRE_ParVector) object; } else if ( build_rhs_type == 4 ) { if (myid == 0) { hypre_printf(" RHS vector set for solution with unit components\n"); hypre_printf(" Initial guess is 0\n"); } /* Temporary use of solution vector */ HYPRE_IJVectorCreate(hypre_MPI_COMM_WORLD, first_local_col, last_local_col, &ij_x); HYPRE_IJVectorSetObjectType(ij_x, HYPRE_PARCSR); HYPRE_IJVectorInitialize(ij_x); values = hypre_CTAlloc(HYPRE_Real, local_num_cols, HYPRE_MEMORY_HOST); for (i = 0; i < local_num_cols; i++) { values[i] = 1.; } HYPRE_IJVectorSetValues(ij_x, local_num_cols, NULL, values); hypre_TFree(values, HYPRE_MEMORY_HOST); ierr = HYPRE_IJVectorGetObject( ij_x, &object ); x = (HYPRE_ParVector) object; /* RHS */ HYPRE_IJVectorCreate(hypre_MPI_COMM_WORLD, first_local_row, last_local_row, &ij_b); HYPRE_IJVectorSetObjectType(ij_b, HYPRE_PARCSR); HYPRE_IJVectorInitialize(ij_b); ierr = HYPRE_IJVectorGetObject( ij_b, &object ); b = (HYPRE_ParVector) object; HYPRE_ParCSRMatrixMatvec(1., parcsr_A, x, 0., b); /* Initial guess */ values = hypre_CTAlloc(HYPRE_Real, local_num_cols, HYPRE_MEMORY_HOST); for (i = 0; i < local_num_cols; i++) { values[i] = 0.; } HYPRE_IJVectorSetValues(ij_x, local_num_cols, NULL, values); hypre_TFree(values, HYPRE_MEMORY_HOST); } else if ( build_rhs_type == 5 ) { if (myid == 0) { hypre_printf(" RHS vector is 0\n"); hypre_printf(" Initial guess has unit components\n"); } /* RHS */ HYPRE_IJVectorCreate(hypre_MPI_COMM_WORLD, first_local_row, last_local_row, &ij_b); HYPRE_IJVectorSetObjectType(ij_b, HYPRE_PARCSR); HYPRE_IJVectorInitialize(ij_b); values = hypre_CTAlloc(HYPRE_Real, local_num_rows, HYPRE_MEMORY_HOST); for (i = 0; i < local_num_rows; i++) { values[i] = 0.; } HYPRE_IJVectorSetValues(ij_b, local_num_rows, NULL, values); hypre_TFree(values, HYPRE_MEMORY_HOST); ierr = HYPRE_IJVectorGetObject( ij_b, &object ); b = (HYPRE_ParVector) object; /* Initial guess */ HYPRE_IJVectorCreate(hypre_MPI_COMM_WORLD, first_local_col, last_local_col, &ij_x); HYPRE_IJVectorSetObjectType(ij_x, HYPRE_PARCSR); HYPRE_IJVectorInitialize(ij_x); values = hypre_CTAlloc(HYPRE_Real, local_num_cols, HYPRE_MEMORY_HOST); for (i = 0; i < local_num_cols; i++) { values[i] = 1.; } HYPRE_IJVectorSetValues(ij_x, local_num_cols, NULL, values); hypre_TFree(values, HYPRE_MEMORY_HOST); ierr = HYPRE_IJVectorGetObject( ij_x, &object ); x = (HYPRE_ParVector) object; } if ( build_src_type == 0 ) { #if 0 /* RHS */ BuildRhsParFromFile(argc, argv, build_src_arg_index, &b); #endif if (myid == 0) { hypre_printf(" Source vector read from file %s\n", argv[build_src_arg_index]); hypre_printf(" Initial unknown vector in evolution is 0\n"); } ierr = HYPRE_IJVectorRead( argv[build_src_arg_index], hypre_MPI_COMM_WORLD, HYPRE_PARCSR, &ij_b ); ierr = HYPRE_IJVectorGetObject( ij_b, &object ); b = (HYPRE_ParVector) object; /* Initial unknown vector */ HYPRE_IJVectorCreate(hypre_MPI_COMM_WORLD, first_local_col, last_local_col, &ij_x); HYPRE_IJVectorSetObjectType(ij_x, HYPRE_PARCSR); HYPRE_IJVectorInitialize(ij_x); values = hypre_CTAlloc(HYPRE_Real, local_num_cols, HYPRE_MEMORY_HOST); for (i = 0; i < local_num_cols; i++) { values[i] = 0.; } HYPRE_IJVectorSetValues(ij_x, local_num_cols, NULL, values); hypre_TFree(values, HYPRE_MEMORY_HOST); ierr = HYPRE_IJVectorGetObject( ij_x, &object ); x = (HYPRE_ParVector) object; } else if ( build_src_type == 1 ) { hypre_printf("build_src_type == 1 not currently implemented\n"); return (-1); #if 0 BuildRhsParFromOneFile2(argc, argv, build_src_arg_index, part_b, &b); #endif } else if ( build_src_type == 2 ) { if (myid == 0) { hypre_printf(" Source vector has unit components\n"); hypre_printf(" Initial unknown vector is 0\n"); } /* RHS */ HYPRE_IJVectorCreate(hypre_MPI_COMM_WORLD, first_local_row, last_local_row, &ij_b); HYPRE_IJVectorSetObjectType(ij_b, HYPRE_PARCSR); HYPRE_IJVectorInitialize(ij_b); values = hypre_CTAlloc(HYPRE_Real, local_num_rows, HYPRE_MEMORY_HOST); for (i = 0; i < local_num_rows; i++) { values[i] = 1.; } HYPRE_IJVectorSetValues(ij_b, local_num_rows, NULL, values); hypre_TFree(values, HYPRE_MEMORY_HOST); ierr = HYPRE_IJVectorGetObject( ij_b, &object ); b = (HYPRE_ParVector) object; /* Initial guess */ HYPRE_IJVectorCreate(hypre_MPI_COMM_WORLD, first_local_col, last_local_col, &ij_x); HYPRE_IJVectorSetObjectType(ij_x, HYPRE_PARCSR); HYPRE_IJVectorInitialize(ij_x); /* For backward Euler the previous backward Euler iterate (assumed 0 here) is usually used as the initial guess */ values = hypre_CTAlloc(HYPRE_Real, local_num_cols, HYPRE_MEMORY_HOST); for (i = 0; i < local_num_cols; i++) { values[i] = 0.; } HYPRE_IJVectorSetValues(ij_x, local_num_cols, NULL, values); hypre_TFree(values, HYPRE_MEMORY_HOST); ierr = HYPRE_IJVectorGetObject( ij_x, &object ); x = (HYPRE_ParVector) object; } else if ( build_src_type == 3 ) { if (myid == 0) { hypre_printf(" Source vector has random components in range 0 - 1\n"); hypre_printf(" Initial unknown vector is 0\n"); } /* RHS */ HYPRE_IJVectorCreate(hypre_MPI_COMM_WORLD, first_local_row, last_local_row, &ij_b); HYPRE_IJVectorSetObjectType(ij_b, HYPRE_PARCSR); HYPRE_IJVectorInitialize(ij_b); values = hypre_CTAlloc(HYPRE_Real, local_num_rows, HYPRE_MEMORY_HOST); hypre_SeedRand(myid); for (i = 0; i < local_num_rows; i++) { values[i] = hypre_Rand(); } HYPRE_IJVectorSetValues(ij_b, local_num_rows, NULL, values); hypre_TFree(values, HYPRE_MEMORY_HOST); ierr = HYPRE_IJVectorGetObject( ij_b, &object ); b = (HYPRE_ParVector) object; /* Initial guess */ HYPRE_IJVectorCreate(hypre_MPI_COMM_WORLD, first_local_col, last_local_col, &ij_x); HYPRE_IJVectorSetObjectType(ij_x, HYPRE_PARCSR); HYPRE_IJVectorInitialize(ij_x); /* For backward Euler the previous backward Euler iterate (assumed 0 here) is usually used as the initial guess */ values = hypre_CTAlloc(HYPRE_Real, local_num_cols, HYPRE_MEMORY_HOST); for (i = 0; i < local_num_cols; i++) { values[i] = 0.; } HYPRE_IJVectorSetValues(ij_x, local_num_cols, NULL, values); hypre_TFree(values, HYPRE_MEMORY_HOST); ierr = HYPRE_IJVectorGetObject( ij_x, &object ); x = (HYPRE_ParVector) object; } else if ( build_src_type == 4 ) { if (myid == 0) { hypre_printf(" Source vector is 0 \n"); hypre_printf(" Initial unknown vector has random components in range 0 - 1\n"); } /* RHS */ HYPRE_IJVectorCreate(hypre_MPI_COMM_WORLD, first_local_row, last_local_row, &ij_b); HYPRE_IJVectorSetObjectType(ij_b, HYPRE_PARCSR); HYPRE_IJVectorInitialize(ij_b); values = hypre_CTAlloc(HYPRE_Real, local_num_rows, HYPRE_MEMORY_HOST); hypre_SeedRand(myid); for (i = 0; i < local_num_rows; i++) { values[i] = hypre_Rand() / dt; } HYPRE_IJVectorSetValues(ij_b, local_num_rows, NULL, values); hypre_TFree(values, HYPRE_MEMORY_HOST); ierr = HYPRE_IJVectorGetObject( ij_b, &object ); b = (HYPRE_ParVector) object; /* Initial guess */ HYPRE_IJVectorCreate(hypre_MPI_COMM_WORLD, first_local_col, last_local_col, &ij_x); HYPRE_IJVectorSetObjectType(ij_x, HYPRE_PARCSR); HYPRE_IJVectorInitialize(ij_x); /* For backward Euler the previous backward Euler iterate (assumed random in 0 - 1 here) is usually used as the initial guess */ values = hypre_CTAlloc(HYPRE_Real, local_num_cols, HYPRE_MEMORY_HOST); hypre_SeedRand(myid); for (i = 0; i < local_num_cols; i++) { values[i] = hypre_Rand(); } HYPRE_IJVectorSetValues(ij_x, local_num_cols, NULL, values); hypre_TFree(values, HYPRE_MEMORY_HOST); ierr = HYPRE_IJVectorGetObject( ij_x, &object ); x = (HYPRE_ParVector) object; } hypre_EndTiming(time_index); hypre_PrintTiming("IJ Vector Setup", hypre_MPI_COMM_WORLD); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); /* HYPRE_IJMatrixPrint(ij_A, "driver.out.A"); HYPRE_IJVectorPrint(ij_x, "driver.out.x0"); */ if (num_functions > 1) { dof_func = NULL; if (build_funcs_type == 1) { BuildFuncsFromOneFile(argc, argv, build_funcs_arg_index, parcsr_A, &dof_func); } else if (build_funcs_type == 2) { BuildFuncsFromFiles(argc, argv, build_funcs_arg_index, parcsr_A, &dof_func); } else { local_num_vars = local_num_rows; dof_func = hypre_CTAlloc(HYPRE_Int, local_num_vars, HYPRE_MEMORY_HOST); if (myid == 0) { hypre_printf (" Number of unknown functions = %d \n", num_functions); } rest = first_local_row - ((first_local_row / num_functions) * num_functions); indx = num_functions - rest; if (rest == 0) { indx = 0; } k = num_functions - 1; for (j = indx - 1; j > -1; j--) { dof_func[j] = k--; } tms = local_num_vars / num_functions; if (tms * num_functions + indx > local_num_vars) { tms--; } for (j = 0; j < tms; j++) { for (k = 0; k < num_functions; k++) { dof_func[indx++] = k; } } k = 0; while (indx < local_num_vars) { dof_func[indx++] = k++; } } } /*----------------------------------------------------------- * Print out the system and initial guess *-----------------------------------------------------------*/ if (print_system) { HYPRE_IJMatrixPrint(ij_A, "IJ.out.A"); HYPRE_IJVectorPrint(ij_b, "IJ.out.b"); HYPRE_IJVectorPrint(ij_x, "IJ.out.x0"); } /*----------------------------------------------------------- * Solve the system using the hybrid solver *-----------------------------------------------------------*/ if (matrix_id == HYPRE_PARCSR && solver_id == HYPRE_HYBRID) { dscg_max_its = 1000; pcg_max_its = 200; if (myid == 0) { hypre_printf("Solver: AMG_Hybrid\n"); } time_index = hypre_InitializeTiming("AMG_hybrid Setup"); hypre_BeginTiming(time_index); HYPRE_ParCSRHybridCreate(&amg_solver); HYPRE_ParCSRHybridSetTol(amg_solver, tol); HYPRE_ParCSRHybridSetConvergenceTol(amg_solver, cf_tol); HYPRE_ParCSRHybridSetSolverType(amg_solver, solver_type); HYPRE_ParCSRHybridSetLogging(amg_solver, ioutdat); HYPRE_ParCSRHybridSetPrintLevel(amg_solver, poutdat); HYPRE_ParCSRHybridSetDSCGMaxIter(amg_solver, dscg_max_its ); HYPRE_ParCSRHybridSetPCGMaxIter(amg_solver, pcg_max_its ); HYPRE_ParCSRHybridSetCoarsenType(amg_solver, (hybrid * coarsen_type)); HYPRE_ParCSRHybridSetStrongThreshold(amg_solver, strong_threshold); HYPRE_ParCSRHybridSetTruncFactor(amg_solver, trunc_factor); HYPRE_ParCSRHybridSetNumGridSweeps(amg_solver, num_grid_sweeps); HYPRE_ParCSRHybridSetGridRelaxType(amg_solver, grid_relax_type); HYPRE_ParCSRHybridSetRelaxWeight(amg_solver, relax_weight); HYPRE_ParCSRHybridSetOmega(amg_solver, omega); HYPRE_ParCSRHybridSetGridRelaxPoints(amg_solver, grid_relax_points); HYPRE_ParCSRHybridSetMaxLevels(amg_solver, max_levels); HYPRE_ParCSRHybridSetMaxRowSum(amg_solver, max_row_sum); HYPRE_ParCSRHybridSetup(amg_solver, parcsr_A, b, x); hypre_EndTiming(time_index); hypre_PrintTiming("Setup phase times", hypre_MPI_COMM_WORLD); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); time_index = hypre_InitializeTiming("ParCSR Hybrid Solve"); hypre_BeginTiming(time_index); HYPRE_ParCSRHybridSolve(amg_solver, parcsr_A, b, x); hypre_EndTiming(time_index); hypre_PrintTiming("Solve phase times", hypre_MPI_COMM_WORLD); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); HYPRE_ParCSRHybridGetNumIterations(amg_solver, &num_iterations); HYPRE_ParCSRHybridGetPCGNumIterations(amg_solver, &pcg_num_its); HYPRE_ParCSRHybridGetDSCGNumIterations(amg_solver, &dscg_num_its); HYPRE_ParCSRHybridGetFinalRelativeResidualNorm(amg_solver, &final_res_norm); if (myid == 0) { hypre_printf("\n"); hypre_printf("Iterations = %d\n", num_iterations); hypre_printf("PCG_Iterations = %d\n", pcg_num_its); hypre_printf("DSCG_Iterations = %d\n", dscg_num_its); hypre_printf("Final Relative Residual Norm = %e\n", final_res_norm); hypre_printf("\n"); } HYPRE_ParCSRHybridDestroy(amg_solver); } /*----------------------------------------------------------- * Solve the system using AMG *-----------------------------------------------------------*/ if (solver_id == HYPRE_BOOMERAMG) { if (myid == 0) { hypre_printf("Solver: AMG\n"); } time_index = hypre_InitializeTiming("BoomerAMG Setup"); hypre_BeginTiming(time_index); HYPRE_BoomerAMGCreate(&amg_solver); HYPRE_BoomerAMGSetInterpType(amg_solver, interp_type); HYPRE_BoomerAMGSetNumSamples(amg_solver, gsmg_samples); HYPRE_BoomerAMGSetCoarsenType(amg_solver, (hybrid * coarsen_type)); HYPRE_BoomerAMGSetMeasureType(amg_solver, measure_type); HYPRE_BoomerAMGSetTol(amg_solver, tol); HYPRE_BoomerAMGSetStrongThreshold(amg_solver, strong_threshold); HYPRE_BoomerAMGSetTruncFactor(amg_solver, trunc_factor); /* note: log is written to standard output, not to file */ HYPRE_BoomerAMGSetPrintLevel(amg_solver, 3); HYPRE_BoomerAMGSetPrintFileName(amg_solver, "driver.out.log"); HYPRE_BoomerAMGSetCycleType(amg_solver, cycle_type); HYPRE_BoomerAMGSetNumGridSweeps(amg_solver, num_grid_sweeps); HYPRE_BoomerAMGSetGridRelaxType(amg_solver, grid_relax_type); HYPRE_BoomerAMGSetRelaxWeight(amg_solver, relax_weight); HYPRE_BoomerAMGSetOmega(amg_solver, omega); HYPRE_BoomerAMGSetSmoothType(amg_solver, smooth_type); HYPRE_BoomerAMGSetSmoothNumSweeps(amg_solver, smooth_num_sweeps); HYPRE_BoomerAMGSetSmoothNumLevels(amg_solver, smooth_num_levels); HYPRE_BoomerAMGSetGridRelaxPoints(amg_solver, grid_relax_points); HYPRE_BoomerAMGSetMaxLevels(amg_solver, max_levels); HYPRE_BoomerAMGSetMaxRowSum(amg_solver, max_row_sum); HYPRE_BoomerAMGSetDebugFlag(amg_solver, debug_flag); HYPRE_BoomerAMGSetVariant(amg_solver, variant); HYPRE_BoomerAMGSetOverlap(amg_solver, overlap); HYPRE_BoomerAMGSetDomainType(amg_solver, domain_type); HYPRE_BoomerAMGSetSchwarzRlxWeight(amg_solver, schwarz_rlx_weight); HYPRE_BoomerAMGSetNumFunctions(amg_solver, num_functions); if (num_functions > 1) { HYPRE_BoomerAMGSetDofFunc(amg_solver, dof_func); } HYPRE_BoomerAMGSetup(amg_solver, parcsr_A, b, x); hypre_EndTiming(time_index); hypre_PrintTiming("Setup phase times", hypre_MPI_COMM_WORLD); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); time_index = hypre_InitializeTiming("BoomerAMG Solve"); hypre_BeginTiming(time_index); HYPRE_BoomerAMGSolve(amg_solver, parcsr_A, b, x); hypre_EndTiming(time_index); hypre_PrintTiming("Solve phase times", hypre_MPI_COMM_WORLD); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); #if SECOND_TIME /* run a second time to check for memory leaks */ HYPRE_ParVectorSetRandomValues(x, 775); HYPRE_BoomerAMGSetup(amg_solver, parcsr_A, b, x); HYPRE_BoomerAMGSolve(amg_solver, parcsr_A, b, x); #endif HYPRE_BoomerAMGDestroy(amg_solver); } /*----------------------------------------------------------- * Solve the system using GSMG *-----------------------------------------------------------*/ if (solver_id == HYPRE_GSMG) { /* reset some smoother parameters */ /* fine grid */ num_grid_sweeps[0] = num_sweep; grid_relax_type[0] = relax_default; hypre_TFree(grid_relax_points[0], HYPRE_MEMORY_HOST); grid_relax_points[0] = hypre_CTAlloc(HYPRE_Int, num_sweep, HYPRE_MEMORY_HOST); for (i = 0; i < num_sweep; i++) { grid_relax_points[0][i] = 0; } /* down cycle */ num_grid_sweeps[1] = num_sweep; grid_relax_type[1] = relax_default; hypre_TFree(grid_relax_points[1], HYPRE_MEMORY_HOST); grid_relax_points[1] = hypre_CTAlloc(HYPRE_Int, num_sweep, HYPRE_MEMORY_HOST); for (i = 0; i < num_sweep; i++) { grid_relax_points[1][i] = 0; } /* up cycle */ num_grid_sweeps[2] = num_sweep; grid_relax_type[2] = relax_default; hypre_TFree(grid_relax_points[2], HYPRE_MEMORY_HOST); grid_relax_points[2] = hypre_CTAlloc(HYPRE_Int, num_sweep, HYPRE_MEMORY_HOST); for (i = 0; i < num_sweep; i++) { grid_relax_points[2][i] = 0; } /* coarsest grid */ num_grid_sweeps[3] = 1; grid_relax_type[3] = 9; hypre_TFree(grid_relax_points[3], HYPRE_MEMORY_HOST); grid_relax_points[3] = hypre_CTAlloc(HYPRE_Int, 1, HYPRE_MEMORY_HOST); grid_relax_points[3][0] = 0; if (myid == 0) { hypre_printf("Solver: GSMG\n"); } time_index = hypre_InitializeTiming("BoomerAMG Setup"); hypre_BeginTiming(time_index); HYPRE_BoomerAMGCreate(&amg_solver); HYPRE_BoomerAMGSetGSMG(amg_solver, 4); /* specify GSMG */ HYPRE_BoomerAMGSetInterpType(amg_solver, interp_type); HYPRE_BoomerAMGSetNumSamples(amg_solver, gsmg_samples); HYPRE_BoomerAMGSetCoarsenType(amg_solver, (hybrid * coarsen_type)); HYPRE_BoomerAMGSetMeasureType(amg_solver, measure_type); HYPRE_BoomerAMGSetTol(amg_solver, tol); HYPRE_BoomerAMGSetStrongThreshold(amg_solver, strong_threshold); HYPRE_BoomerAMGSetTruncFactor(amg_solver, trunc_factor); /* note: log is written to standard output, not to file */ HYPRE_BoomerAMGSetPrintLevel(amg_solver, 3); HYPRE_BoomerAMGSetPrintFileName(amg_solver, "driver.out.log"); HYPRE_BoomerAMGSetCycleType(amg_solver, cycle_type); HYPRE_BoomerAMGSetNumGridSweeps(amg_solver, num_grid_sweeps); HYPRE_BoomerAMGSetGridRelaxType(amg_solver, grid_relax_type); HYPRE_BoomerAMGSetRelaxWeight(amg_solver, relax_weight); HYPRE_BoomerAMGSetOmega(amg_solver, omega); HYPRE_BoomerAMGSetSmoothType(amg_solver, smooth_type); HYPRE_BoomerAMGSetSmoothNumSweeps(amg_solver, smooth_num_sweeps); HYPRE_BoomerAMGSetSmoothNumLevels(amg_solver, smooth_num_levels); HYPRE_BoomerAMGSetGridRelaxPoints(amg_solver, grid_relax_points); HYPRE_BoomerAMGSetMaxLevels(amg_solver, max_levels); HYPRE_BoomerAMGSetMaxRowSum(amg_solver, max_row_sum); HYPRE_BoomerAMGSetDebugFlag(amg_solver, debug_flag); HYPRE_BoomerAMGSetVariant(amg_solver, variant); HYPRE_BoomerAMGSetOverlap(amg_solver, overlap); HYPRE_BoomerAMGSetDomainType(amg_solver, domain_type); HYPRE_BoomerAMGSetSchwarzRlxWeight(amg_solver, schwarz_rlx_weight); HYPRE_BoomerAMGSetNumFunctions(amg_solver, num_functions); if (num_functions > 1) { HYPRE_BoomerAMGSetDofFunc(amg_solver, dof_func); } HYPRE_BoomerAMGSetup(amg_solver, parcsr_A, b, x); hypre_EndTiming(time_index); hypre_PrintTiming("Setup phase times", hypre_MPI_COMM_WORLD); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); time_index = hypre_InitializeTiming("BoomerAMG Solve"); hypre_BeginTiming(time_index); HYPRE_BoomerAMGSolve(amg_solver, parcsr_A, b, x); hypre_EndTiming(time_index); hypre_PrintTiming("Solve phase times", hypre_MPI_COMM_WORLD); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); #if SECOND_TIME /* run a second time to check for memory leaks */ HYPRE_ParVectorSetRandomValues(x, 775); HYPRE_BoomerAMGSetup(amg_solver, parcsr_A, b, x); HYPRE_BoomerAMGSolve(amg_solver, parcsr_A, b, x); #endif HYPRE_BoomerAMGDestroy(amg_solver); } if (solver_id == HYPRE_PARASAILS) { HYPRE_IJMatrix ij_M; HYPRE_ParCSRMatrix parcsr_mat; /* use ParaSails preconditioner */ if (myid == 0) { hypre_printf("Test ParaSails Build IJMatrix\n"); } HYPRE_IJMatrixPrint(ij_A, "parasails.in"); HYPRE_ParaSailsCreate(hypre_MPI_COMM_WORLD, &pcg_precond); HYPRE_ParaSailsSetParams(pcg_precond, 0., 0); HYPRE_ParaSailsSetFilter(pcg_precond, 0.); HYPRE_ParaSailsSetLogging(pcg_precond, ioutdat); HYPRE_IJMatrixGetObject( ij_A, &object); parcsr_mat = (HYPRE_ParCSRMatrix) object; HYPRE_ParaSailsSetup(pcg_precond, parcsr_mat, NULL, NULL); HYPRE_ParaSailsBuildIJMatrix(pcg_precond, &ij_M); HYPRE_IJMatrixPrint(ij_M, "parasails.out"); if (myid == 0) { hypre_printf("Printed to parasails.out.\n"); } exit(0); } /*----------------------------------------------------------- * Solve the system using PCG *-----------------------------------------------------------*/ /* begin lobpcg */ if ( !lobpcgFlag && ( solver_id == HYPRE_PCG) ) /*end lobpcg */ { time_index = hypre_InitializeTiming("PCG Setup"); hypre_BeginTiming(time_index); ioutdat = 2; HYPRE_ParCSRPCGCreate(hypre_MPI_COMM_WORLD, &pcg_solver); HYPRE_PCGSetMaxIter(pcg_solver, 1000); HYPRE_PCGSetTol(pcg_solver, tol); HYPRE_PCGSetTwoNorm(pcg_solver, 1); HYPRE_PCGSetRelChange(pcg_solver, 0); HYPRE_PCGSetPrintLevel(pcg_solver, ioutdat); if (precond_id == HYPRE_EUCLID) { /* use Euclid preconditioning */ if (myid == 0) { hypre_printf("Solver: Euclid-PCG\n"); } HYPRE_EuclidCreate(hypre_MPI_COMM_WORLD, &pcg_precond); /* note: There are three methods of setting run-time parameters for Euclid: (see HYPRE_parcsr_ls.h); here we'll use what I think is simplest: let Euclid internally parse the command line. */ HYPRE_EuclidSetParams(pcg_precond, argc, argv); HYPRE_PCGSetPrecond(pcg_solver, (HYPRE_PtrToSolverFcn) HYPRE_EuclidSolve, (HYPRE_PtrToSolverFcn) HYPRE_EuclidSetup, pcg_precond); } else { hypre_set_precond(matrix_id, solver_id, precond_id, pcg_solver, pcg_precond); } HYPRE_PCGGetPrecond(pcg_solver, &pcg_precond_gotten); if (pcg_precond_gotten != pcg_precond) { hypre_printf("HYPRE_ParCSRPCGGetPrecond got bad precond\n"); return (-1); } else if (myid == 0) { hypre_printf("HYPRE_ParCSRPCGGetPrecond got good precond\n"); } HYPRE_PCGSetup(pcg_solver, (HYPRE_Matrix)parcsr_A, (HYPRE_Vector)b, (HYPRE_Vector)x); hypre_EndTiming(time_index); hypre_PrintTiming("Setup phase times", hypre_MPI_COMM_WORLD); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); time_index = hypre_InitializeTiming("PCG Solve"); hypre_BeginTiming(time_index); HYPRE_PCGSolve(pcg_solver, (HYPRE_Matrix)parcsr_A, (HYPRE_Vector)b, (HYPRE_Vector)x); hypre_EndTiming(time_index); hypre_PrintTiming("Solve phase times", hypre_MPI_COMM_WORLD); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); HYPRE_PCGGetNumIterations(pcg_solver, &num_iterations); HYPRE_PCGGetFinalRelativeResidualNorm(pcg_solver, &final_res_norm); #if SECOND_TIME /* run a second time to check for memory leaks */ HYPRE_ParVectorSetRandomValues(x, 775); HYPRE_PCGSetup(pcg_solver, (HYPRE_Matrix)parcsr_A, (HYPRE_Vector)b, (HYPRE_Vector)x); HYPRE_PCGSolve(pcg_solver, (HYPRE_Matrix)parcsr_A, (HYPRE_Vector)b, (HYPRE_Vector)x); #endif HYPRE_ParCSRPCGDestroy(pcg_solver); hypre_destroy_precond(precond_id, pcg_precond); if (myid == 0) { hypre_printf("\n"); hypre_printf("Iterations = %d\n", num_iterations); hypre_printf("Final Relative Residual Norm = %e\n", final_res_norm); hypre_printf("\n"); } } /* begin lobpcg */ /*----------------------------------------------------------- * Solve the eigenvalue problem using LOBPCG *-----------------------------------------------------------*/ if ( lobpcgFlag ) { interpreter = hypre_CTAlloc(mv_InterfaceInterpreter, 1, HYPRE_MEMORY_HOST); HYPRE_ParCSRSetupInterpreter( interpreter ); HYPRE_ParCSRSetupMatvec(&matvec_fn); if (myid != 0) { verbosity = 0; } if ( lobpcgGen ) { BuildParIsoLaplacian(argc, argv, &parcsr_B); ierr = HYPRE_ParCSRMatrixGetLocalRange( parcsr_B, &first_local_row, &last_local_row, &first_local_col, &last_local_col ); local_num_rows = last_local_row - first_local_row + 1; local_num_cols = last_local_col - first_local_col + 1; ierr += HYPRE_ParCSRMatrixGetDims( parcsr_B, &M, &N ); ierr += HYPRE_IJMatrixCreate( comm, first_local_row, last_local_row, first_local_col, last_local_col, &ij_B ); ierr += HYPRE_IJMatrixSetObjectType( ij_B, HYPRE_PARCSR ); if (sparsity_known == 1) { diag_sizes = hypre_CTAlloc(HYPRE_Int, local_num_rows, HYPRE_MEMORY_HOST); offdiag_sizes = hypre_CTAlloc(HYPRE_Int, local_num_rows, HYPRE_MEMORY_HOST); local_row = 0; for (i = first_local_row; i <= last_local_row; i++) { ierr += HYPRE_ParCSRMatrixGetRow( parcsr_B, i, &size, &col_inds, &values ); for (j = 0; j < size; j++) { if (col_inds[j] < first_local_row || col_inds[j] > last_local_row) { offdiag_sizes[local_row]++; } else { diag_sizes[local_row]++; } } local_row++; ierr += HYPRE_ParCSRMatrixRestoreRow( parcsr_B, i, &size, &col_inds, &values ); } ierr += HYPRE_IJMatrixSetDiagOffdSizes( ij_B, (const HYPRE_Int *) diag_sizes, (const HYPRE_Int *) offdiag_sizes ); hypre_TFree(diag_sizes, HYPRE_MEMORY_HOST); hypre_TFree(offdiag_sizes, HYPRE_MEMORY_HOST); ierr = HYPRE_IJMatrixInitialize( ij_B ); for (i = first_local_row; i <= last_local_row; i++) { ierr += HYPRE_ParCSRMatrixGetRow( parcsr_B, i, &size, &col_inds, &values ); ierr += HYPRE_IJMatrixSetValues( ij_B, 1, &size, &i, (const HYPRE_Int *) col_inds, (const HYPRE_Real *) values ); ierr += HYPRE_ParCSRMatrixRestoreRow( parcsr_B, i, &size, &col_inds, &values ); } } else { row_sizes = hypre_CTAlloc(HYPRE_Int, local_num_rows, HYPRE_MEMORY_HOST); size = 5; /* this is in general too low, and supposed to test the capability of the reallocation of the interface */ if (sparsity_known == 0) /* tries a more accurate estimate of the storage */ { if (build_matrix_type == 2) { size = 7; } if (build_matrix_type == 3) { size = 9; } if (build_matrix_type == 4) { size = 27; } } for (i = 0; i < local_num_rows; i++) { row_sizes[i] = size; } ierr = HYPRE_IJMatrixSetRowSizes ( ij_B, (const HYPRE_Int *) row_sizes ); hypre_TFree(row_sizes, HYPRE_MEMORY_HOST); ierr = HYPRE_IJMatrixInitialize( ij_B ); /* Loop through all locally stored rows and insert them into ij_matrix */ for (i = first_local_row; i <= last_local_row; i++) { ierr += HYPRE_ParCSRMatrixGetRow( parcsr_B, i, &size, &col_inds, &values ); ierr += HYPRE_IJMatrixSetValues( ij_B, 1, &size, &i, (const HYPRE_Int *) col_inds, (const HYPRE_Real *) values ); ierr += HYPRE_ParCSRMatrixRestoreRow( parcsr_B, i, &size, &col_inds, &values ); } } ierr += HYPRE_IJMatrixAssemble( ij_B ); ierr += HYPRE_ParCSRMatrixDestroy(parcsr_B); ierr += HYPRE_IJMatrixGetObject( ij_B, &object); parcsr_B = (HYPRE_ParCSRMatrix) object; } /* if ( lobpcgGen ) */ if ( pcgIterations > 0 ) /* do inner pcg iterations */ { time_index = hypre_InitializeTiming("PCG Setup"); hypre_BeginTiming(time_index); HYPRE_ParCSRPCGCreate(hypre_MPI_COMM_WORLD, &pcg_solver); HYPRE_PCGSetMaxIter(pcg_solver, pcgIterations); HYPRE_PCGSetTol(pcg_solver, pcgTol); HYPRE_PCGSetTwoNorm(pcg_solver, 1); HYPRE_PCGSetRelChange(pcg_solver, 0); HYPRE_PCGSetPrintLevel(pcg_solver, 0); HYPRE_PCGGetPrecond(pcg_solver, &pcg_precond); if (solver_id == 1) { /* use BoomerAMG as preconditioner */ if (myid == 0) { hypre_printf("Solver: AMG-PCG\n"); } HYPRE_BoomerAMGCreate(&pcg_precond); HYPRE_BoomerAMGSetInterpType(pcg_precond, interp_type); HYPRE_BoomerAMGSetNumSamples(pcg_precond, gsmg_samples); HYPRE_BoomerAMGSetTol(pcg_precond, pc_tol); HYPRE_BoomerAMGSetCoarsenType(pcg_precond, (hybrid * coarsen_type)); HYPRE_BoomerAMGSetMeasureType(pcg_precond, measure_type); HYPRE_BoomerAMGSetStrongThreshold(pcg_precond, strong_threshold); HYPRE_BoomerAMGSetTruncFactor(pcg_precond, trunc_factor); HYPRE_BoomerAMGSetPrintLevel(pcg_precond, poutdat); HYPRE_BoomerAMGSetPrintFileName(pcg_precond, "driver.out.log"); HYPRE_BoomerAMGSetMaxIter(pcg_precond, 1); HYPRE_BoomerAMGSetCycleType(pcg_precond, cycle_type); HYPRE_BoomerAMGSetNumGridSweeps(pcg_precond, num_grid_sweeps); HYPRE_BoomerAMGSetGridRelaxType(pcg_precond, grid_relax_type); HYPRE_BoomerAMGSetRelaxWeight(pcg_precond, relax_weight); HYPRE_BoomerAMGSetOmega(pcg_precond, omega); HYPRE_BoomerAMGSetSmoothType(pcg_precond, smooth_type); HYPRE_BoomerAMGSetSmoothNumLevels(pcg_precond, smooth_num_levels); HYPRE_BoomerAMGSetSmoothNumSweeps(pcg_precond, smooth_num_sweeps); HYPRE_BoomerAMGSetGridRelaxPoints(pcg_precond, grid_relax_points); HYPRE_BoomerAMGSetMaxLevels(pcg_precond, max_levels); HYPRE_BoomerAMGSetMaxRowSum(pcg_precond, max_row_sum); HYPRE_BoomerAMGSetNumFunctions(pcg_precond, num_functions); HYPRE_BoomerAMGSetVariant(pcg_precond, variant); HYPRE_BoomerAMGSetOverlap(pcg_precond, overlap); HYPRE_BoomerAMGSetDomainType(pcg_precond, domain_type); HYPRE_BoomerAMGSetSchwarzRlxWeight(pcg_precond, schwarz_rlx_weight); if (num_functions > 1) { HYPRE_BoomerAMGSetDofFunc(pcg_precond, dof_func); } HYPRE_PCGSetPrecond(pcg_solver, (HYPRE_PtrToSolverFcn) HYPRE_BoomerAMGSolve, (HYPRE_PtrToSolverFcn) HYPRE_BoomerAMGSetup, pcg_precond); } else if (solver_id == 2) { /* use diagonal scaling as preconditioner */ if (myid == 0) { hypre_printf("Solver: DS-PCG\n"); } pcg_precond = NULL; HYPRE_PCGSetPrecond(pcg_solver, (HYPRE_PtrToSolverFcn) HYPRE_ParCSRDiagScale, (HYPRE_PtrToSolverFcn) HYPRE_ParCSRDiagScaleSetup, pcg_precond); } else if (solver_id == 8) { /* use ParaSails preconditioner */ if (myid == 0) { hypre_printf("Solver: ParaSails-PCG\n"); } HYPRE_ParaSailsCreate(hypre_MPI_COMM_WORLD, &pcg_precond); HYPRE_ParaSailsSetParams(pcg_precond, sai_threshold, max_levels); HYPRE_ParaSailsSetFilter(pcg_precond, sai_filter); HYPRE_ParaSailsSetLogging(pcg_precond, poutdat); HYPRE_PCGSetPrecond(pcg_solver, (HYPRE_PtrToSolverFcn) HYPRE_ParaSailsSolve, (HYPRE_PtrToSolverFcn) HYPRE_ParaSailsSetup, pcg_precond); } else if (solver_id == 12) { /* use Schwarz preconditioner */ if (myid == 0) { hypre_printf("Solver: Schwarz-PCG\n"); } HYPRE_SchwarzCreate(&pcg_precond); HYPRE_SchwarzSetVariant(pcg_precond, variant); HYPRE_SchwarzSetOverlap(pcg_precond, overlap); HYPRE_SchwarzSetDomainType(pcg_precond, domain_type); HYPRE_SchwarzSetRelaxWeight(pcg_precond, schwarz_rlx_weight); HYPRE_PCGSetPrecond(pcg_solver, (HYPRE_PtrToSolverFcn) HYPRE_SchwarzSolve, (HYPRE_PtrToSolverFcn) HYPRE_SchwarzSetup, pcg_precond); } else if (solver_id == 14) { /* use GSMG as preconditioner */ /* reset some smoother parameters */ /* fine grid */ num_grid_sweeps[0] = num_sweep; grid_relax_type[0] = relax_default; hypre_TFree(grid_relax_points[0], HYPRE_MEMORY_HOST); grid_relax_points[0] = hypre_CTAlloc(HYPRE_Int, num_sweep, HYPRE_MEMORY_HOST); for (i = 0; i < num_sweep; i++) { grid_relax_points[0][i] = 0; } /* down cycle */ num_grid_sweeps[1] = num_sweep; grid_relax_type[1] = relax_default; hypre_TFree(grid_relax_points[1], HYPRE_MEMORY_HOST); grid_relax_points[1] = hypre_CTAlloc(HYPRE_Int, num_sweep, HYPRE_MEMORY_HOST); for (i = 0; i < num_sweep; i++) { grid_relax_points[1][i] = 0; } /* up cycle */ num_grid_sweeps[2] = num_sweep; grid_relax_type[2] = relax_default; hypre_TFree(grid_relax_points[2], HYPRE_MEMORY_HOST); grid_relax_points[2] = hypre_CTAlloc(HYPRE_Int, num_sweep, HYPRE_MEMORY_HOST); for (i = 0; i < num_sweep; i++) { grid_relax_points[2][i] = 0; } /* coarsest grid */ num_grid_sweeps[3] = 1; grid_relax_type[3] = 9; hypre_TFree(grid_relax_points[3], HYPRE_MEMORY_HOST); grid_relax_points[3] = hypre_CTAlloc(HYPRE_Int, 1, HYPRE_MEMORY_HOST); grid_relax_points[3][0] = 0; if (myid == 0) { hypre_printf("Solver: GSMG-PCG\n"); } HYPRE_BoomerAMGCreate(&pcg_precond); HYPRE_BoomerAMGSetGSMG(pcg_precond, 4); HYPRE_BoomerAMGSetInterpType(pcg_precond, interp_type); HYPRE_BoomerAMGSetNumSamples(pcg_precond, gsmg_samples); HYPRE_BoomerAMGSetTol(pcg_precond, pc_tol); HYPRE_BoomerAMGSetCoarsenType(pcg_precond, (hybrid * coarsen_type)); HYPRE_BoomerAMGSetMeasureType(pcg_precond, measure_type); HYPRE_BoomerAMGSetStrongThreshold(pcg_precond, strong_threshold); HYPRE_BoomerAMGSetTruncFactor(pcg_precond, trunc_factor); HYPRE_BoomerAMGSetPrintLevel(pcg_precond, poutdat); HYPRE_BoomerAMGSetPrintFileName(pcg_precond, "driver.out.log"); HYPRE_BoomerAMGSetMaxIter(pcg_precond, 1); HYPRE_BoomerAMGSetCycleType(pcg_precond, cycle_type); HYPRE_BoomerAMGSetNumGridSweeps(pcg_precond, num_grid_sweeps); HYPRE_BoomerAMGSetGridRelaxType(pcg_precond, grid_relax_type); HYPRE_BoomerAMGSetRelaxWeight(pcg_precond, relax_weight); HYPRE_BoomerAMGSetOmega(pcg_precond, omega); HYPRE_BoomerAMGSetSmoothType(pcg_precond, smooth_type); HYPRE_BoomerAMGSetSmoothNumLevels(pcg_precond, smooth_num_levels); HYPRE_BoomerAMGSetSmoothNumSweeps(pcg_precond, smooth_num_sweeps); HYPRE_BoomerAMGSetVariant(pcg_precond, variant); HYPRE_BoomerAMGSetOverlap(pcg_precond, overlap); HYPRE_BoomerAMGSetDomainType(pcg_precond, domain_type); HYPRE_BoomerAMGSetSchwarzRlxWeight(pcg_precond, schwarz_rlx_weight); HYPRE_BoomerAMGSetGridRelaxPoints(pcg_precond, grid_relax_points); HYPRE_BoomerAMGSetMaxLevels(pcg_precond, max_levels); HYPRE_BoomerAMGSetMaxRowSum(pcg_precond, max_row_sum); HYPRE_BoomerAMGSetNumFunctions(pcg_precond, num_functions); if (num_functions > 1) { HYPRE_BoomerAMGSetDofFunc(pcg_precond, dof_func); } HYPRE_PCGSetPrecond(pcg_solver, (HYPRE_PtrToSolverFcn) HYPRE_BoomerAMGSolve, (HYPRE_PtrToSolverFcn) HYPRE_BoomerAMGSetup, pcg_precond); } else if (solver_id == 43) { /* use Euclid preconditioning */ if (myid == 0) { hypre_printf("Solver: Euclid-PCG\n"); } HYPRE_EuclidCreate(hypre_MPI_COMM_WORLD, &pcg_precond); /* note: There are three methods of setting run-time parameters for Euclid: (see HYPRE_parcsr_ls.h); here we'll use what I think is simplest: let Euclid internally parse the command line. */ HYPRE_EuclidSetParams(pcg_precond, argc, argv); HYPRE_PCGSetPrecond(pcg_solver, (HYPRE_PtrToSolverFcn) HYPRE_EuclidSolve, (HYPRE_PtrToSolverFcn) HYPRE_EuclidSetup, pcg_precond); } else if (solver_id != NO_SOLVER ) { if ( verbosity ) { hypre_printf("Solver ID not recognized - running inner PCG iterations without preconditioner\n\n"); } } HYPRE_PCGGetPrecond(pcg_solver, &pcg_precond_gotten); if (pcg_precond_gotten != pcg_precond) { hypre_printf("HYPRE_ParCSRPCGGetPrecond got bad precond\n"); return (-1); } else if (myid == 0) { hypre_printf("HYPRE_ParCSRPCGGetPrecond got good precond\n"); } /* HYPRE_PCGSetup(pcg_solver, (HYPRE_Matrix)parcsr_A, (HYPRE_Vector)b, (HYPRE_Vector)x); */ hypre_EndTiming(time_index); hypre_PrintTiming("Setup phase times", hypre_MPI_COMM_WORLD); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); HYPRE_LOBPCGCreate(interpreter, &matvec_fn, &lobpcg_solver); HYPRE_LOBPCGSetMaxIter(lobpcg_solver, maxIterations); HYPRE_LOBPCGSetPrecondUsageMode(lobpcg_solver, pcgMode); HYPRE_LOBPCGSetTol(lobpcg_solver, tol); HYPRE_LOBPCGSetPrintLevel(lobpcg_solver, verbosity); HYPRE_LOBPCGSetPrecond(lobpcg_solver, (HYPRE_PtrToSolverFcn) HYPRE_PCGSolve, (HYPRE_PtrToSolverFcn) HYPRE_PCGSetup, pcg_solver); HYPRE_LOBPCGSetupT(lobpcg_solver, (HYPRE_Matrix)parcsr_A, (HYPRE_Vector)x); HYPRE_LOBPCGSetup(lobpcg_solver, (HYPRE_Matrix)parcsr_A, (HYPRE_Vector)b, (HYPRE_Vector)x); if ( lobpcgGen ) HYPRE_LOBPCGSetupB(lobpcg_solver, (HYPRE_Matrix)parcsr_B, (HYPRE_Vector)x); if ( vFromFileFlag ) { eigenvectors = mv_MultiVectorWrap( interpreter, hypre_ParCSRMultiVectorRead(hypre_MPI_COMM_WORLD, interpreter, "vectors" ), 1); hypre_assert( eigenvectors != NULL ); blockSize = mv_MultiVectorWidth( eigenvectors ); } else { eigenvectors = mv_MultiVectorCreateFromSampleVector( interpreter, blockSize, x ); if ( lobpcgSeed ) { mv_MultiVectorSetRandom( eigenvectors, lobpcgSeed ); } else { mv_MultiVectorSetRandom( eigenvectors, (HYPRE_Int)time(0) ); } } if ( constrained ) { constraints = mv_MultiVectorWrap( interpreter, hypre_ParCSRMultiVectorRead(hypre_MPI_COMM_WORLD, interpreter, "vectors" ), 1); hypre_assert( constraints != NULL ); } eigenvalues = hypre_CTAlloc(HYPRE_Real, blockSize, HYPRE_MEMORY_HOST); time_index = hypre_InitializeTiming("LOBPCG Solve"); hypre_BeginTiming(time_index); HYPRE_LOBPCGSolve(lobpcg_solver, constraints, eigenvectors, eigenvalues ); hypre_EndTiming(time_index); hypre_PrintTiming("Solve phase times", hypre_MPI_COMM_WORLD); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); if ( checkOrtho ) { gramXX = utilities_FortranMatrixCreate(); identity = utilities_FortranMatrixCreate(); utilities_FortranMatrixAllocateData( blockSize, blockSize, gramXX ); utilities_FortranMatrixAllocateData( blockSize, blockSize, identity ); if ( lobpcgGen ) { workspace = mv_MultiVectorCreateCopy( eigenvectors, 0 ); hypre_LOBPCGMultiOperatorB( lobpcg_solver, mv_MultiVectorGetData(eigenvectors), mv_MultiVectorGetData(workspace) ); lobpcg_MultiVectorByMultiVector( eigenvectors, workspace, gramXX ); } else { lobpcg_MultiVectorByMultiVector( eigenvectors, eigenvectors, gramXX ); } utilities_FortranMatrixSetToIdentity( identity ); utilities_FortranMatrixAdd( -1, identity, gramXX, gramXX ); nonOrthF = utilities_FortranMatrixFNorm( gramXX ); if ( myid == 0 ) { hypre_printf("Non-orthonormality of eigenvectors: %12.5e\n", nonOrthF); } utilities_FortranMatrixDestroy( gramXX ); utilities_FortranMatrixDestroy( identity ); } if ( printLevel ) { hypre_ParCSRMultiVectorPrint( mv_MultiVectorGetData(eigenvectors), "vectors" ); if ( myid == 0 ) { if ( (filePtr = fopen("values.txt", "w")) ) { hypre_fprintf(filePtr, "%d\n", blockSize); for ( i = 0; i < blockSize; i++ ) { hypre_fprintf(filePtr, "%22.14e\n", eigenvalues[i]); } fclose(filePtr); } if ( (filePtr = fopen("residuals.txt", "w")) ) { residualNorms = HYPRE_LOBPCGResidualNorms( lobpcg_solver ); residuals = utilities_FortranMatrixValues( residualNorms ); hypre_fprintf(filePtr, "%d\n", blockSize); for ( i = 0; i < blockSize; i++ ) { hypre_fprintf(filePtr, "%22.14e\n", residuals[i]); } fclose(filePtr); } if ( printLevel > 1 ) { printBuffer = utilities_FortranMatrixCreate(); iterations = HYPRE_LOBPCGIterations( lobpcg_solver ); eigenvaluesHistory = HYPRE_LOBPCGEigenvaluesHistory( lobpcg_solver ); utilities_FortranMatrixSelectBlock( eigenvaluesHistory, 1, blockSize, 1, iterations + 1, printBuffer ); utilities_FortranMatrixPrint( printBuffer, "val_hist.txt" ); residualNormsHistory = HYPRE_LOBPCGResidualNormsHistory( lobpcg_solver ); utilities_FortranMatrixSelectBlock(residualNormsHistory, 1, blockSize, 1, iterations + 1, printBuffer ); utilities_FortranMatrixPrint( printBuffer, "res_hist.txt" ); utilities_FortranMatrixDestroy( printBuffer ); } } } HYPRE_LOBPCGDestroy(lobpcg_solver); mv_MultiVectorDestroy( eigenvectors ); if ( constrained ) { mv_MultiVectorDestroy( constraints ); } if ( lobpcgGen ) { mv_MultiVectorDestroy( workspace ); } hypre_TFree(eigenvalues, HYPRE_MEMORY_HOST); HYPRE_ParCSRPCGDestroy(pcg_solver); if (solver_id == 1) { HYPRE_BoomerAMGDestroy(pcg_precond); } else if (solver_id == 8) { HYPRE_ParaSailsDestroy(pcg_precond); } else if (solver_id == 12) { HYPRE_SchwarzDestroy(pcg_precond); } else if (solver_id == 14) { HYPRE_BoomerAMGDestroy(pcg_precond); } else if (solver_id == 43) { HYPRE_EuclidDestroy(pcg_precond); } } else /* pcgIterations <= 0 --> use the preconditioner directly */ { time_index = hypre_InitializeTiming("LOBPCG Setup"); hypre_BeginTiming(time_index); if (myid != 0) { verbosity = 0; } HYPRE_LOBPCGCreate(interpreter, &matvec_fn, &pcg_solver); HYPRE_LOBPCGSetMaxIter(pcg_solver, maxIterations); HYPRE_LOBPCGSetTol(pcg_solver, tol); HYPRE_LOBPCGSetPrintLevel(pcg_solver, verbosity); HYPRE_LOBPCGGetPrecond(pcg_solver, &pcg_precond); if (solver_id == 1) { /* use BoomerAMG as preconditioner */ if (myid == 0) { hypre_printf("Solver: AMG-PCG\n"); } HYPRE_BoomerAMGCreate(&pcg_precond); HYPRE_BoomerAMGSetInterpType(pcg_precond, interp_type); HYPRE_BoomerAMGSetNumSamples(pcg_precond, gsmg_samples); HYPRE_BoomerAMGSetTol(pcg_precond, pc_tol); HYPRE_BoomerAMGSetCoarsenType(pcg_precond, (hybrid * coarsen_type)); HYPRE_BoomerAMGSetMeasureType(pcg_precond, measure_type); HYPRE_BoomerAMGSetStrongThreshold(pcg_precond, strong_threshold); HYPRE_BoomerAMGSetTruncFactor(pcg_precond, trunc_factor); HYPRE_BoomerAMGSetPrintLevel(pcg_precond, poutdat); HYPRE_BoomerAMGSetPrintFileName(pcg_precond, "driver.out.log"); HYPRE_BoomerAMGSetMaxIter(pcg_precond, 1); HYPRE_BoomerAMGSetCycleType(pcg_precond, cycle_type); HYPRE_BoomerAMGSetNumGridSweeps(pcg_precond, num_grid_sweeps); HYPRE_BoomerAMGSetGridRelaxType(pcg_precond, grid_relax_type); HYPRE_BoomerAMGSetRelaxWeight(pcg_precond, relax_weight); HYPRE_BoomerAMGSetOmega(pcg_precond, omega); HYPRE_BoomerAMGSetSmoothType(pcg_precond, smooth_type); HYPRE_BoomerAMGSetSmoothNumLevels(pcg_precond, smooth_num_levels); HYPRE_BoomerAMGSetSmoothNumSweeps(pcg_precond, smooth_num_sweeps); HYPRE_BoomerAMGSetGridRelaxPoints(pcg_precond, grid_relax_points); HYPRE_BoomerAMGSetMaxLevels(pcg_precond, max_levels); HYPRE_BoomerAMGSetMaxRowSum(pcg_precond, max_row_sum); HYPRE_BoomerAMGSetNumFunctions(pcg_precond, num_functions); HYPRE_BoomerAMGSetVariant(pcg_precond, variant); HYPRE_BoomerAMGSetOverlap(pcg_precond, overlap); HYPRE_BoomerAMGSetDomainType(pcg_precond, domain_type); HYPRE_BoomerAMGSetSchwarzRlxWeight(pcg_precond, schwarz_rlx_weight); if (num_functions > 1) { HYPRE_BoomerAMGSetDofFunc(pcg_precond, dof_func); } HYPRE_LOBPCGSetPrecond(pcg_solver, (HYPRE_PtrToSolverFcn) HYPRE_BoomerAMGSolve, (HYPRE_PtrToSolverFcn) HYPRE_BoomerAMGSetup, pcg_precond); } else if (solver_id == 2) { /* use diagonal scaling as preconditioner */ if (myid == 0) { hypre_printf("Solver: DS-PCG\n"); } pcg_precond = NULL; HYPRE_LOBPCGSetPrecond(pcg_solver, (HYPRE_PtrToSolverFcn) HYPRE_ParCSRDiagScale, (HYPRE_PtrToSolverFcn) HYPRE_ParCSRDiagScaleSetup, pcg_precond); } else if (solver_id == 8) { /* use ParaSails preconditioner */ if (myid == 0) { hypre_printf("Solver: ParaSails-PCG\n"); } HYPRE_ParaSailsCreate(hypre_MPI_COMM_WORLD, &pcg_precond); HYPRE_ParaSailsSetParams(pcg_precond, sai_threshold, max_levels); HYPRE_ParaSailsSetFilter(pcg_precond, sai_filter); HYPRE_ParaSailsSetLogging(pcg_precond, poutdat); HYPRE_LOBPCGSetPrecond(pcg_solver, (HYPRE_PtrToSolverFcn) HYPRE_ParaSailsSolve, (HYPRE_PtrToSolverFcn) HYPRE_ParaSailsSetup, pcg_precond); } else if (solver_id == 12) { /* use Schwarz preconditioner */ if (myid == 0) { hypre_printf("Solver: Schwarz-PCG\n"); } HYPRE_SchwarzCreate(&pcg_precond); HYPRE_SchwarzSetVariant(pcg_precond, variant); HYPRE_SchwarzSetOverlap(pcg_precond, overlap); HYPRE_SchwarzSetDomainType(pcg_precond, domain_type); HYPRE_SchwarzSetRelaxWeight(pcg_precond, schwarz_rlx_weight); HYPRE_LOBPCGSetPrecond(pcg_solver, (HYPRE_PtrToSolverFcn) HYPRE_SchwarzSolve, (HYPRE_PtrToSolverFcn) HYPRE_SchwarzSetup, pcg_precond); } else if (solver_id == 14) { /* use GSMG as preconditioner */ /* reset some smoother parameters */ /* fine grid */ num_grid_sweeps[0] = num_sweep; grid_relax_type[0] = relax_default; hypre_TFree(grid_relax_points[0], HYPRE_MEMORY_HOST); grid_relax_points[0] = hypre_CTAlloc(HYPRE_Int, num_sweep, HYPRE_MEMORY_HOST); for (i = 0; i < num_sweep; i++) { grid_relax_points[0][i] = 0; } /* down cycle */ num_grid_sweeps[1] = num_sweep; grid_relax_type[1] = relax_default; hypre_TFree(grid_relax_points[1], HYPRE_MEMORY_HOST); grid_relax_points[1] = hypre_CTAlloc(HYPRE_Int, num_sweep, HYPRE_MEMORY_HOST); for (i = 0; i < num_sweep; i++) { grid_relax_points[1][i] = 0; } /* up cycle */ num_grid_sweeps[2] = num_sweep; grid_relax_type[2] = relax_default; hypre_TFree(grid_relax_points[2], HYPRE_MEMORY_HOST); grid_relax_points[2] = hypre_CTAlloc(HYPRE_Int, num_sweep, HYPRE_MEMORY_HOST); for (i = 0; i < num_sweep; i++) { grid_relax_points[2][i] = 0; } /* coarsest grid */ num_grid_sweeps[3] = 1; grid_relax_type[3] = 9; hypre_TFree(grid_relax_points[3], HYPRE_MEMORY_HOST); grid_relax_points[3] = hypre_CTAlloc(HYPRE_Int, 1, HYPRE_MEMORY_HOST); grid_relax_points[3][0] = 0; if (myid == 0) { hypre_printf("Solver: GSMG-PCG\n"); } HYPRE_BoomerAMGCreate(&pcg_precond); HYPRE_BoomerAMGSetGSMG(pcg_precond, 4); HYPRE_BoomerAMGSetInterpType(pcg_precond, interp_type); HYPRE_BoomerAMGSetNumSamples(pcg_precond, gsmg_samples); HYPRE_BoomerAMGSetTol(pcg_precond, pc_tol); HYPRE_BoomerAMGSetCoarsenType(pcg_precond, (hybrid * coarsen_type)); HYPRE_BoomerAMGSetMeasureType(pcg_precond, measure_type); HYPRE_BoomerAMGSetStrongThreshold(pcg_precond, strong_threshold); HYPRE_BoomerAMGSetTruncFactor(pcg_precond, trunc_factor); HYPRE_BoomerAMGSetPrintLevel(pcg_precond, poutdat); HYPRE_BoomerAMGSetPrintFileName(pcg_precond, "driver.out.log"); HYPRE_BoomerAMGSetMaxIter(pcg_precond, 1); HYPRE_BoomerAMGSetCycleType(pcg_precond, cycle_type); HYPRE_BoomerAMGSetNumGridSweeps(pcg_precond, num_grid_sweeps); HYPRE_BoomerAMGSetGridRelaxType(pcg_precond, grid_relax_type); HYPRE_BoomerAMGSetRelaxWeight(pcg_precond, relax_weight); HYPRE_BoomerAMGSetOmega(pcg_precond, omega); HYPRE_BoomerAMGSetSmoothType(pcg_precond, smooth_type); HYPRE_BoomerAMGSetSmoothNumLevels(pcg_precond, smooth_num_levels); HYPRE_BoomerAMGSetSmoothNumSweeps(pcg_precond, smooth_num_sweeps); HYPRE_BoomerAMGSetVariant(pcg_precond, variant); HYPRE_BoomerAMGSetOverlap(pcg_precond, overlap); HYPRE_BoomerAMGSetDomainType(pcg_precond, domain_type); HYPRE_BoomerAMGSetSchwarzRlxWeight(pcg_precond, schwarz_rlx_weight); HYPRE_BoomerAMGSetGridRelaxPoints(pcg_precond, grid_relax_points); HYPRE_BoomerAMGSetMaxLevels(pcg_precond, max_levels); HYPRE_BoomerAMGSetMaxRowSum(pcg_precond, max_row_sum); HYPRE_BoomerAMGSetNumFunctions(pcg_precond, num_functions); if (num_functions > 1) { HYPRE_BoomerAMGSetDofFunc(pcg_precond, dof_func); } HYPRE_LOBPCGSetPrecond(pcg_solver, (HYPRE_PtrToSolverFcn) HYPRE_BoomerAMGSolve, (HYPRE_PtrToSolverFcn) HYPRE_BoomerAMGSetup, pcg_precond); } else if (solver_id == 43) { /* use Euclid preconditioning */ if (myid == 0) { hypre_printf("Solver: Euclid-PCG\n"); } HYPRE_EuclidCreate(hypre_MPI_COMM_WORLD, &pcg_precond); /* note: There are three methods of setting run-time parameters for Euclid: (see HYPRE_parcsr_ls.h); here we'll use what I think is simplest: let Euclid internally parse the command line. */ HYPRE_EuclidSetParams(pcg_precond, argc, argv); HYPRE_LOBPCGSetPrecond(pcg_solver, (HYPRE_PtrToSolverFcn) HYPRE_EuclidSolve, (HYPRE_PtrToSolverFcn) HYPRE_EuclidSetup, pcg_precond); } else if (solver_id != NO_SOLVER ) { if ( verbosity ) { hypre_printf("Solver ID not recognized - running LOBPCG without preconditioner\n\n"); } } HYPRE_LOBPCGGetPrecond(pcg_solver, &pcg_precond_gotten); if (pcg_precond_gotten != pcg_precond && pcgIterations) { hypre_printf("HYPRE_ParCSRLOBPCGGetPrecond got bad precond\n"); return (-1); } else if (myid == 0) { hypre_printf("HYPRE_ParCSRLOBPCGGetPrecond got good precond\n"); } HYPRE_LOBPCGSetup(pcg_solver, (HYPRE_Matrix)parcsr_A, (HYPRE_Vector)b, (HYPRE_Vector)x); if ( lobpcgGen ) HYPRE_LOBPCGSetupB(pcg_solver, (HYPRE_Matrix)parcsr_B, (HYPRE_Vector)x); hypre_EndTiming(time_index); hypre_PrintTiming("Setup phase times", hypre_MPI_COMM_WORLD); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); if ( vFromFileFlag ) { eigenvectors = mv_MultiVectorWrap( interpreter, hypre_ParCSRMultiVectorRead(hypre_MPI_COMM_WORLD, interpreter, "vectors" ), 1); hypre_assert( eigenvectors != NULL ); blockSize = mv_MultiVectorWidth( eigenvectors ); } else { eigenvectors = mv_MultiVectorCreateFromSampleVector( interpreter, blockSize, x ); if ( lobpcgSeed ) { mv_MultiVectorSetRandom( eigenvectors, lobpcgSeed ); } else { mv_MultiVectorSetRandom( eigenvectors, (HYPRE_Int)time(0) ); } } if ( constrained ) { constraints = mv_MultiVectorWrap( interpreter, hypre_ParCSRMultiVectorRead(hypre_MPI_COMM_WORLD, interpreter, "vectors" ), 1); hypre_assert( constraints != NULL ); } eigenvalues = hypre_CTAlloc(HYPRE_Real, blockSize, HYPRE_MEMORY_HOST); time_index = hypre_InitializeTiming("LOBPCG Solve"); hypre_BeginTiming(time_index); HYPRE_LOBPCGSolve(pcg_solver, constraints, eigenvectors, eigenvalues); hypre_EndTiming(time_index); hypre_PrintTiming("Solve phase times", hypre_MPI_COMM_WORLD); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); if ( checkOrtho ) { gramXX = utilities_FortranMatrixCreate(); identity = utilities_FortranMatrixCreate(); utilities_FortranMatrixAllocateData( blockSize, blockSize, gramXX ); utilities_FortranMatrixAllocateData( blockSize, blockSize, identity ); if ( lobpcgGen ) { workspace = mv_MultiVectorCreateCopy( eigenvectors, 0 ); hypre_LOBPCGMultiOperatorB( pcg_solver, mv_MultiVectorGetData(eigenvectors), mv_MultiVectorGetData(workspace) ); lobpcg_MultiVectorByMultiVector( eigenvectors, workspace, gramXX ); } else { lobpcg_MultiVectorByMultiVector( eigenvectors, eigenvectors, gramXX ); } utilities_FortranMatrixSetToIdentity( identity ); utilities_FortranMatrixAdd( -1, identity, gramXX, gramXX ); nonOrthF = utilities_FortranMatrixFNorm( gramXX ); if ( myid == 0 ) { hypre_printf("Non-orthonormality of eigenvectors: %12.5e\n", nonOrthF); } utilities_FortranMatrixDestroy( gramXX ); utilities_FortranMatrixDestroy( identity ); } if ( printLevel ) { hypre_ParCSRMultiVectorPrint( mv_MultiVectorGetData(eigenvectors), "vectors" ); if ( myid == 0 ) { if ( (filePtr = fopen("values.txt", "w")) ) { hypre_fprintf(filePtr, "%d\n", blockSize); for ( i = 0; i < blockSize; i++ ) { hypre_fprintf(filePtr, "%22.14e\n", eigenvalues[i]); } fclose(filePtr); } if ( (filePtr = fopen("residuals.txt", "w")) ) { residualNorms = HYPRE_LOBPCGResidualNorms( pcg_solver ); residuals = utilities_FortranMatrixValues( residualNorms ); hypre_fprintf(filePtr, "%d\n", blockSize); for ( i = 0; i < blockSize; i++ ) { hypre_fprintf(filePtr, "%22.14e\n", residuals[i]); } fclose(filePtr); } if ( printLevel > 1 ) { printBuffer = utilities_FortranMatrixCreate(); iterations = HYPRE_LOBPCGIterations( pcg_solver ); eigenvaluesHistory = HYPRE_LOBPCGEigenvaluesHistory( pcg_solver ); utilities_FortranMatrixSelectBlock( eigenvaluesHistory, 1, blockSize, 1, iterations + 1, printBuffer ); utilities_FortranMatrixPrint( printBuffer, "val_hist.txt" ); residualNormsHistory = HYPRE_LOBPCGResidualNormsHistory( pcg_solver ); utilities_FortranMatrixSelectBlock(residualNormsHistory, 1, blockSize, 1, iterations + 1, printBuffer ); utilities_FortranMatrixPrint( printBuffer, "res_hist.txt" ); utilities_FortranMatrixDestroy( printBuffer ); } } } #if SECOND_TIME /* run a second time to check for memory leaks */ mv_MultiVectorSetRandom( eigenvectors, 775 ); HYPRE_LOBPCGSetup(pcg_solver, (HYPRE_Matrix)parcsr_A, (HYPRE_Vector)b, (HYPRE_Vector)x); HYPRE_LOBPCGSolve(pcg_solver, constraints, eigenvectors, eigenvalues ); #endif HYPRE_LOBPCGDestroy(pcg_solver); if (solver_id == 1) { HYPRE_BoomerAMGDestroy(pcg_precond); } else if (solver_id == 8) { HYPRE_ParaSailsDestroy(pcg_precond); } else if (solver_id == 12) { HYPRE_SchwarzDestroy(pcg_precond); } else if (solver_id == 14) { HYPRE_BoomerAMGDestroy(pcg_precond); } else if (solver_id == 43) { HYPRE_EuclidDestroy(pcg_precond); } mv_MultiVectorDestroy( eigenvectors ); if ( constrained ) { mv_MultiVectorDestroy( constraints ); } if ( lobpcgGen ) { mv_MultiVectorDestroy( workspace ); } hypre_TFree(eigenvalues, HYPRE_MEMORY_HOST); } /* if ( pcgIterations > 0 ) */ hypre_TFree( interpreter, HYPRE_MEMORY_HOST); if ( lobpcgGen ) { HYPRE_IJMatrixDestroy(ij_B); } } /* if ( lobpcgFlag ) */ /* end lobpcg */ /*----------------------------------------------------------- * Solve the system using GMRES *-----------------------------------------------------------*/ if (solver_id == 3 || solver_id == 4 || solver_id == 7 || solver_id == 15 || solver_id == 18 || solver_id == 44) { time_index = hypre_InitializeTiming("GMRES Setup"); hypre_BeginTiming(time_index); ioutdat = 2; HYPRE_ParCSRGMRESCreate(hypre_MPI_COMM_WORLD, &pcg_solver); HYPRE_GMRESSetKDim(pcg_solver, k_dim); HYPRE_GMRESSetMaxIter(pcg_solver, 1000); HYPRE_GMRESSetTol(pcg_solver, tol); HYPRE_GMRESSetLogging(pcg_solver, 1); HYPRE_GMRESSetPrintLevel(pcg_solver, ioutdat); if (solver_id == 3) { /* use BoomerAMG as preconditioner */ if (myid == 0) { hypre_printf("Solver: AMG-GMRES\n"); } HYPRE_BoomerAMGCreate(&pcg_precond); HYPRE_BoomerAMGSetInterpType(pcg_precond, interp_type); HYPRE_BoomerAMGSetNumSamples(pcg_precond, gsmg_samples); HYPRE_BoomerAMGSetTol(pcg_precond, pc_tol); HYPRE_BoomerAMGSetCoarsenType(pcg_precond, (hybrid * coarsen_type)); HYPRE_BoomerAMGSetMeasureType(pcg_precond, measure_type); HYPRE_BoomerAMGSetStrongThreshold(pcg_precond, strong_threshold); HYPRE_BoomerAMGSetTruncFactor(pcg_precond, trunc_factor); HYPRE_BoomerAMGSetPrintLevel(pcg_precond, poutdat); HYPRE_BoomerAMGSetPrintFileName(pcg_precond, "driver.out.log"); HYPRE_BoomerAMGSetMaxIter(pcg_precond, 1); HYPRE_BoomerAMGSetCycleType(pcg_precond, cycle_type); HYPRE_BoomerAMGSetNumGridSweeps(pcg_precond, num_grid_sweeps); HYPRE_BoomerAMGSetGridRelaxType(pcg_precond, grid_relax_type); HYPRE_BoomerAMGSetRelaxWeight(pcg_precond, relax_weight); HYPRE_BoomerAMGSetOmega(pcg_precond, omega); HYPRE_BoomerAMGSetSmoothType(pcg_precond, smooth_type); HYPRE_BoomerAMGSetSmoothNumLevels(pcg_precond, smooth_num_levels); HYPRE_BoomerAMGSetSmoothNumSweeps(pcg_precond, smooth_num_sweeps); HYPRE_BoomerAMGSetGridRelaxPoints(pcg_precond, grid_relax_points); HYPRE_BoomerAMGSetMaxLevels(pcg_precond, max_levels); HYPRE_BoomerAMGSetMaxRowSum(pcg_precond, max_row_sum); HYPRE_BoomerAMGSetNumFunctions(pcg_precond, num_functions); HYPRE_BoomerAMGSetVariant(pcg_precond, variant); HYPRE_BoomerAMGSetOverlap(pcg_precond, overlap); HYPRE_BoomerAMGSetDomainType(pcg_precond, domain_type); if (num_functions > 1) { HYPRE_BoomerAMGSetDofFunc(pcg_precond, dof_func); } HYPRE_GMRESSetPrecond(pcg_solver, (HYPRE_PtrToSolverFcn) HYPRE_BoomerAMGSolve, (HYPRE_PtrToSolverFcn) HYPRE_BoomerAMGSetup, pcg_precond); } else if (solver_id == 4) { /* use diagonal scaling as preconditioner */ if (myid == 0) { hypre_printf("Solver: DS-GMRES\n"); } pcg_precond = NULL; HYPRE_GMRESSetPrecond(pcg_solver, (HYPRE_PtrToSolverFcn) HYPRE_ParCSRDiagScale, (HYPRE_PtrToSolverFcn) HYPRE_ParCSRDiagScaleSetup, pcg_precond); } else if (solver_id == 7) { /* use PILUT as preconditioner */ if (myid == 0) { hypre_printf("Solver: PILUT-GMRES\n"); } ierr = HYPRE_ParCSRPilutCreate( hypre_MPI_COMM_WORLD, &pcg_precond ); if (ierr) { hypre_printf("Error in ParPilutCreate\n"); } HYPRE_GMRESSetPrecond(pcg_solver, (HYPRE_PtrToSolverFcn) HYPRE_ParCSRPilutSolve, (HYPRE_PtrToSolverFcn) HYPRE_ParCSRPilutSetup, pcg_precond); if (drop_tol >= 0 ) HYPRE_ParCSRPilutSetDropTolerance( pcg_precond, drop_tol ); if (nonzeros_to_keep >= 0 ) HYPRE_ParCSRPilutSetFactorRowSize( pcg_precond, nonzeros_to_keep ); } else if (solver_id == 15) { /* use GSMG as preconditioner */ /* reset some smoother parameters */ /* fine grid */ num_grid_sweeps[0] = num_sweep; grid_relax_type[0] = relax_default; hypre_TFree(grid_relax_points[0], HYPRE_MEMORY_HOST); grid_relax_points[0] = hypre_CTAlloc(HYPRE_Int, num_sweep, HYPRE_MEMORY_HOST); for (i = 0; i < num_sweep; i++) { grid_relax_points[0][i] = 0; } /* down cycle */ num_grid_sweeps[1] = num_sweep; grid_relax_type[1] = relax_default; hypre_TFree(grid_relax_points[1], HYPRE_MEMORY_HOST); grid_relax_points[1] = hypre_CTAlloc(HYPRE_Int, num_sweep, HYPRE_MEMORY_HOST); for (i = 0; i < num_sweep; i++) { grid_relax_points[1][i] = 0; } /* up cycle */ num_grid_sweeps[2] = num_sweep; grid_relax_type[2] = relax_default; hypre_TFree(grid_relax_points[2], HYPRE_MEMORY_HOST); grid_relax_points[2] = hypre_CTAlloc(HYPRE_Int, num_sweep, HYPRE_MEMORY_HOST); for (i = 0; i < num_sweep; i++) { grid_relax_points[2][i] = 0; } /* coarsest grid */ num_grid_sweeps[3] = 1; grid_relax_type[3] = 9; hypre_TFree(grid_relax_points[3], HYPRE_MEMORY_HOST); grid_relax_points[3] = hypre_CTAlloc(HYPRE_Int, 1, HYPRE_MEMORY_HOST); grid_relax_points[3][0] = 0; if (myid == 0) { hypre_printf("Solver: GSMG-GMRES\n"); } HYPRE_BoomerAMGCreate(&pcg_precond); HYPRE_BoomerAMGSetGSMG(pcg_precond, 4); HYPRE_BoomerAMGSetInterpType(pcg_precond, interp_type); HYPRE_BoomerAMGSetNumSamples(pcg_precond, gsmg_samples); HYPRE_BoomerAMGSetTol(pcg_precond, pc_tol); HYPRE_BoomerAMGSetCoarsenType(pcg_precond, (hybrid * coarsen_type)); HYPRE_BoomerAMGSetMeasureType(pcg_precond, measure_type); HYPRE_BoomerAMGSetStrongThreshold(pcg_precond, strong_threshold); HYPRE_BoomerAMGSetTruncFactor(pcg_precond, trunc_factor); HYPRE_BoomerAMGSetPrintLevel(pcg_precond, poutdat); HYPRE_BoomerAMGSetPrintFileName(pcg_precond, "driver.out.log"); HYPRE_BoomerAMGSetMaxIter(pcg_precond, 1); HYPRE_BoomerAMGSetCycleType(pcg_precond, cycle_type); HYPRE_BoomerAMGSetNumGridSweeps(pcg_precond, num_grid_sweeps); HYPRE_BoomerAMGSetGridRelaxType(pcg_precond, grid_relax_type); HYPRE_BoomerAMGSetRelaxWeight(pcg_precond, relax_weight); HYPRE_BoomerAMGSetOmega(pcg_precond, omega); HYPRE_BoomerAMGSetSmoothType(pcg_precond, smooth_type); HYPRE_BoomerAMGSetSmoothNumLevels(pcg_precond, smooth_num_levels); HYPRE_BoomerAMGSetSmoothNumSweeps(pcg_precond, smooth_num_sweeps); HYPRE_BoomerAMGSetVariant(pcg_precond, variant); HYPRE_BoomerAMGSetOverlap(pcg_precond, overlap); HYPRE_BoomerAMGSetDomainType(pcg_precond, domain_type); HYPRE_BoomerAMGSetSchwarzRlxWeight(pcg_precond, schwarz_rlx_weight); HYPRE_BoomerAMGSetGridRelaxPoints(pcg_precond, grid_relax_points); HYPRE_BoomerAMGSetMaxLevels(pcg_precond, max_levels); HYPRE_BoomerAMGSetMaxRowSum(pcg_precond, max_row_sum); HYPRE_BoomerAMGSetNumFunctions(pcg_precond, num_functions); if (num_functions > 1) { HYPRE_BoomerAMGSetDofFunc(pcg_precond, dof_func); } HYPRE_GMRESSetPrecond(pcg_solver, (HYPRE_PtrToSolverFcn) HYPRE_BoomerAMGSolve, (HYPRE_PtrToSolverFcn) HYPRE_BoomerAMGSetup, pcg_precond); } else if (solver_id == 18) { /* use ParaSails preconditioner */ if (myid == 0) { hypre_printf("Solver: ParaSails-GMRES\n"); } HYPRE_ParaSailsCreate(hypre_MPI_COMM_WORLD, &pcg_precond); HYPRE_ParaSailsSetParams(pcg_precond, sai_threshold, max_levels); HYPRE_ParaSailsSetFilter(pcg_precond, sai_filter); HYPRE_ParaSailsSetLogging(pcg_precond, poutdat); HYPRE_ParaSailsSetSym(pcg_precond, 0); HYPRE_GMRESSetPrecond(pcg_solver, (HYPRE_PtrToSolverFcn) HYPRE_ParaSailsSolve, (HYPRE_PtrToSolverFcn) HYPRE_ParaSailsSetup, pcg_precond); } else if (solver_id == 44) { /* use Euclid preconditioning */ if (myid == 0) { hypre_printf("Solver: Euclid-GMRES\n"); } HYPRE_EuclidCreate(hypre_MPI_COMM_WORLD, &pcg_precond); /* note: There are three methods of setting run-time parameters for Euclid: (see HYPRE_parcsr_ls.h); here we'll use what I think is simplest: let Euclid internally parse the command line. */ HYPRE_EuclidSetParams(pcg_precond, argc, argv); HYPRE_GMRESSetPrecond (pcg_solver, (HYPRE_PtrToSolverFcn) HYPRE_EuclidSolve, (HYPRE_PtrToSolverFcn) HYPRE_EuclidSetup, pcg_precond); } HYPRE_GMRESGetPrecond(pcg_solver, &pcg_precond_gotten); if (pcg_precond_gotten != pcg_precond) { hypre_printf("HYPRE_GMRESGetPrecond got bad precond\n"); return (-1); } else if (myid == 0) { hypre_printf("HYPRE_GMRESGetPrecond got good precond\n"); } HYPRE_GMRESSetup (pcg_solver, (HYPRE_Matrix)parcsr_A, (HYPRE_Vector)b, (HYPRE_Vector)x); hypre_EndTiming(time_index); hypre_PrintTiming("Setup phase times", hypre_MPI_COMM_WORLD); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); time_index = hypre_InitializeTiming("GMRES Solve"); hypre_BeginTiming(time_index); HYPRE_GMRESSolve (pcg_solver, (HYPRE_Matrix)parcsr_A, (HYPRE_Vector)b, (HYPRE_Vector)x); hypre_EndTiming(time_index); hypre_PrintTiming("Solve phase times", hypre_MPI_COMM_WORLD); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); HYPRE_GMRESGetNumIterations(pcg_solver, &num_iterations); HYPRE_GMRESGetFinalRelativeResidualNorm(pcg_solver, &final_res_norm); #if SECOND_TIME /* run a second time to check for memory leaks */ HYPRE_ParVectorSetRandomValues(x, 775); HYPRE_GMRESSetup(pcg_solver, (HYPRE_Matrix)parcsr_A, (HYPRE_Vector)b, (HYPRE_Vector)x); HYPRE_GMRESSolve(pcg_solver, (HYPRE_Matrix)parcsr_A, (HYPRE_Vector)b, (HYPRE_Vector)x); #endif HYPRE_ParCSRGMRESDestroy(pcg_solver); if (solver_id == 3 || solver_id == 15) { HYPRE_BoomerAMGDestroy(pcg_precond); } if (solver_id == 7) { HYPRE_ParCSRPilutDestroy(pcg_precond); } else if (solver_id == 18) { HYPRE_ParaSailsDestroy(pcg_precond); } else if (solver_id == 44) { HYPRE_EuclidDestroy(pcg_precond); } if (myid == 0) { hypre_printf("\n"); hypre_printf("GMRES Iterations = %d\n", num_iterations); hypre_printf("Final GMRES Relative Residual Norm = %e\n", final_res_norm); hypre_printf("\n"); } } /*----------------------------------------------------------- * Solve the system using BiCGSTAB *-----------------------------------------------------------*/ if (solver_id == 9 || solver_id == 10 || solver_id == 11 || solver_id == 45) { time_index = hypre_InitializeTiming("BiCGSTAB Setup"); hypre_BeginTiming(time_index); ioutdat = 2; HYPRE_ParCSRBiCGSTABCreate(hypre_MPI_COMM_WORLD, &pcg_solver); HYPRE_BiCGSTABSetMaxIter(pcg_solver, 1000); HYPRE_BiCGSTABSetTol(pcg_solver, tol); HYPRE_BiCGSTABSetLogging(pcg_solver, ioutdat); HYPRE_BiCGSTABSetPrintLevel(pcg_solver, ioutdat); if (solver_id == 9) { /* use BoomerAMG as preconditioner */ if (myid == 0) { hypre_printf("Solver: AMG-BiCGSTAB\n"); } HYPRE_BoomerAMGCreate(&pcg_precond); HYPRE_BoomerAMGSetInterpType(pcg_precond, interp_type); HYPRE_BoomerAMGSetNumSamples(pcg_precond, gsmg_samples); HYPRE_BoomerAMGSetTol(pcg_precond, pc_tol); HYPRE_BoomerAMGSetCoarsenType(pcg_precond, (hybrid * coarsen_type)); HYPRE_BoomerAMGSetMeasureType(pcg_precond, measure_type); HYPRE_BoomerAMGSetStrongThreshold(pcg_precond, strong_threshold); HYPRE_BoomerAMGSetTruncFactor(pcg_precond, trunc_factor); HYPRE_BoomerAMGSetPrintLevel(pcg_precond, poutdat); HYPRE_BoomerAMGSetPrintFileName(pcg_precond, "driver.out.log"); HYPRE_BoomerAMGSetMaxIter(pcg_precond, 1); HYPRE_BoomerAMGSetCycleType(pcg_precond, cycle_type); HYPRE_BoomerAMGSetNumGridSweeps(pcg_precond, num_grid_sweeps); HYPRE_BoomerAMGSetGridRelaxType(pcg_precond, grid_relax_type); HYPRE_BoomerAMGSetRelaxWeight(pcg_precond, relax_weight); HYPRE_BoomerAMGSetOmega(pcg_precond, omega); HYPRE_BoomerAMGSetSmoothType(pcg_precond, smooth_type); HYPRE_BoomerAMGSetSmoothNumLevels(pcg_precond, smooth_num_levels); HYPRE_BoomerAMGSetSmoothNumSweeps(pcg_precond, smooth_num_sweeps); HYPRE_BoomerAMGSetGridRelaxPoints(pcg_precond, grid_relax_points); HYPRE_BoomerAMGSetMaxLevels(pcg_precond, max_levels); HYPRE_BoomerAMGSetMaxRowSum(pcg_precond, max_row_sum); HYPRE_BoomerAMGSetNumFunctions(pcg_precond, num_functions); HYPRE_BoomerAMGSetVariant(pcg_precond, variant); HYPRE_BoomerAMGSetOverlap(pcg_precond, overlap); HYPRE_BoomerAMGSetDomainType(pcg_precond, domain_type); if (num_functions > 1) { HYPRE_BoomerAMGSetDofFunc(pcg_precond, dof_func); } HYPRE_BiCGSTABSetPrecond(pcg_solver, (HYPRE_PtrToSolverFcn) HYPRE_BoomerAMGSolve, (HYPRE_PtrToSolverFcn) HYPRE_BoomerAMGSetup, pcg_precond); } else if (solver_id == 10) { /* use diagonal scaling as preconditioner */ if (myid == 0) { hypre_printf("Solver: DS-BiCGSTAB\n"); } pcg_precond = NULL; HYPRE_BiCGSTABSetPrecond(pcg_solver, (HYPRE_PtrToSolverFcn) HYPRE_ParCSRDiagScale, (HYPRE_PtrToSolverFcn) HYPRE_ParCSRDiagScaleSetup, pcg_precond); } else if (solver_id == 11) { /* use PILUT as preconditioner */ if (myid == 0) { hypre_printf("Solver: PILUT-BiCGSTAB\n"); } ierr = HYPRE_ParCSRPilutCreate( hypre_MPI_COMM_WORLD, &pcg_precond ); if (ierr) { hypre_printf("Error in ParPilutCreate\n"); } HYPRE_BiCGSTABSetPrecond(pcg_solver, (HYPRE_PtrToSolverFcn) HYPRE_ParCSRPilutSolve, (HYPRE_PtrToSolverFcn) HYPRE_ParCSRPilutSetup, pcg_precond); if (drop_tol >= 0 ) HYPRE_ParCSRPilutSetDropTolerance( pcg_precond, drop_tol ); if (nonzeros_to_keep >= 0 ) HYPRE_ParCSRPilutSetFactorRowSize( pcg_precond, nonzeros_to_keep ); } else if (solver_id == 45) { /* use Euclid preconditioning */ if (myid == 0) { hypre_printf("Solver: Euclid-BICGSTAB\n"); } HYPRE_EuclidCreate(hypre_MPI_COMM_WORLD, &pcg_precond); /* note: There are three methods of setting run-time parameters for Euclid: (see HYPRE_parcsr_ls.h); here we'll use what I think is simplest: let Euclid internally parse the command line. */ HYPRE_EuclidSetParams(pcg_precond, argc, argv); HYPRE_BiCGSTABSetPrecond(pcg_solver, (HYPRE_PtrToSolverFcn) HYPRE_EuclidSolve, (HYPRE_PtrToSolverFcn) HYPRE_EuclidSetup, pcg_precond); } HYPRE_BiCGSTABSetup(pcg_solver, (HYPRE_Matrix)parcsr_A, (HYPRE_Vector)b, (HYPRE_Vector)x); hypre_EndTiming(time_index); hypre_PrintTiming("Setup phase times", hypre_MPI_COMM_WORLD); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); time_index = hypre_InitializeTiming("BiCGSTAB Solve"); hypre_BeginTiming(time_index); HYPRE_BiCGSTABSolve(pcg_solver, (HYPRE_Matrix)parcsr_A, (HYPRE_Vector)b, (HYPRE_Vector)x); hypre_EndTiming(time_index); hypre_PrintTiming("Solve phase times", hypre_MPI_COMM_WORLD); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); HYPRE_BiCGSTABGetNumIterations(pcg_solver, &num_iterations); HYPRE_BiCGSTABGetFinalRelativeResidualNorm(pcg_solver, &final_res_norm); #if SECOND_TIME /* run a second time to check for memory leaks */ HYPRE_ParVectorSetRandomValues(x, 775); HYPRE_BiCGSTABSetup(pcg_solver, (HYPRE_Matrix)parcsr_A, (HYPRE_Vector)b, (HYPRE_Vector)x); HYPRE_BiCGSTABSolve(pcg_solver, (HYPRE_Matrix)parcsr_A, (HYPRE_Vector)b, (HYPRE_Vector)x); #endif HYPRE_ParCSRBiCGSTABDestroy(pcg_solver); if (solver_id == 9) { HYPRE_BoomerAMGDestroy(pcg_precond); } if (solver_id == 11) { HYPRE_ParCSRPilutDestroy(pcg_precond); } else if (solver_id == 45) { HYPRE_EuclidDestroy(pcg_precond); } if (myid == 0) { hypre_printf("\n"); hypre_printf("BiCGSTAB Iterations = %d\n", num_iterations); hypre_printf("Final BiCGSTAB Relative Residual Norm = %e\n", final_res_norm); hypre_printf("\n"); } } /*----------------------------------------------------------- * Solve the system using CGNR *-----------------------------------------------------------*/ if (solver_id == 5 || solver_id == 6) { time_index = hypre_InitializeTiming("CGNR Setup"); hypre_BeginTiming(time_index); ioutdat = 2; HYPRE_ParCSRCGNRCreate(hypre_MPI_COMM_WORLD, &pcg_solver); HYPRE_CGNRSetMaxIter(pcg_solver, 1000); HYPRE_CGNRSetTol(pcg_solver, tol); HYPRE_CGNRSetLogging(pcg_solver, ioutdat); if (solver_id == 5) { /* use BoomerAMG as preconditioner */ if (myid == 0) { hypre_printf("Solver: AMG-CGNR\n"); } HYPRE_BoomerAMGCreate(&pcg_precond); HYPRE_BoomerAMGSetInterpType(pcg_precond, interp_type); HYPRE_BoomerAMGSetNumSamples(pcg_precond, gsmg_samples); HYPRE_BoomerAMGSetTol(pcg_precond, pc_tol); HYPRE_BoomerAMGSetCoarsenType(pcg_precond, (hybrid * coarsen_type)); HYPRE_BoomerAMGSetMeasureType(pcg_precond, measure_type); HYPRE_BoomerAMGSetStrongThreshold(pcg_precond, strong_threshold); HYPRE_BoomerAMGSetTruncFactor(pcg_precond, trunc_factor); HYPRE_BoomerAMGSetPrintLevel(pcg_precond, poutdat); HYPRE_BoomerAMGSetPrintFileName(pcg_precond, "driver.out.log"); HYPRE_BoomerAMGSetMaxIter(pcg_precond, 1); HYPRE_BoomerAMGSetCycleType(pcg_precond, cycle_type); HYPRE_BoomerAMGSetNumGridSweeps(pcg_precond, num_grid_sweeps); HYPRE_BoomerAMGSetGridRelaxType(pcg_precond, grid_relax_type); HYPRE_BoomerAMGSetRelaxWeight(pcg_precond, relax_weight); HYPRE_BoomerAMGSetOmega(pcg_precond, omega); HYPRE_BoomerAMGSetSmoothType(pcg_precond, smooth_type); HYPRE_BoomerAMGSetSmoothNumLevels(pcg_precond, smooth_num_levels); HYPRE_BoomerAMGSetSmoothNumSweeps(pcg_precond, smooth_num_sweeps); HYPRE_BoomerAMGSetGridRelaxPoints(pcg_precond, grid_relax_points); HYPRE_BoomerAMGSetMaxLevels(pcg_precond, max_levels); HYPRE_BoomerAMGSetMaxRowSum(pcg_precond, max_row_sum); HYPRE_BoomerAMGSetNumFunctions(pcg_precond, num_functions); HYPRE_BoomerAMGSetVariant(pcg_precond, variant); HYPRE_BoomerAMGSetOverlap(pcg_precond, overlap); HYPRE_BoomerAMGSetDomainType(pcg_precond, domain_type); if (num_functions > 1) { HYPRE_BoomerAMGSetDofFunc(pcg_precond, dof_func); } HYPRE_CGNRSetPrecond(pcg_solver, (HYPRE_PtrToSolverFcn) HYPRE_BoomerAMGSolve, (HYPRE_PtrToSolverFcn) HYPRE_BoomerAMGSolveT, (HYPRE_PtrToSolverFcn) HYPRE_BoomerAMGSetup, pcg_precond); } else if (solver_id == 6) { /* use diagonal scaling as preconditioner */ if (myid == 0) { hypre_printf("Solver: DS-CGNR\n"); } pcg_precond = NULL; HYPRE_CGNRSetPrecond(pcg_solver, (HYPRE_PtrToSolverFcn) HYPRE_ParCSRDiagScale, (HYPRE_PtrToSolverFcn) HYPRE_ParCSRDiagScale, (HYPRE_PtrToSolverFcn) HYPRE_ParCSRDiagScaleSetup, pcg_precond); } HYPRE_CGNRGetPrecond(pcg_solver, &pcg_precond_gotten); if (pcg_precond_gotten != pcg_precond) { hypre_printf("HYPRE_ParCSRCGNRGetPrecond got bad precond\n"); return (-1); } else if (myid == 0) { hypre_printf("HYPRE_ParCSRCGNRGetPrecond got good precond\n"); } HYPRE_CGNRSetup(pcg_solver, (HYPRE_Matrix)parcsr_A, (HYPRE_Vector)b, (HYPRE_Vector)x); hypre_EndTiming(time_index); hypre_PrintTiming("Setup phase times", hypre_MPI_COMM_WORLD); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); time_index = hypre_InitializeTiming("CGNR Solve"); hypre_BeginTiming(time_index); HYPRE_CGNRSolve(pcg_solver, (HYPRE_Matrix)parcsr_A, (HYPRE_Vector)b, (HYPRE_Vector)x); hypre_EndTiming(time_index); hypre_PrintTiming("Solve phase times", hypre_MPI_COMM_WORLD); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); HYPRE_CGNRGetNumIterations(pcg_solver, &num_iterations); HYPRE_CGNRGetFinalRelativeResidualNorm(pcg_solver, &final_res_norm); #if SECOND_TIME /* run a second time to check for memory leaks */ HYPRE_ParVectorSetRandomValues(x, 775); HYPRE_CGNRSetup(pcg_solver, (HYPRE_Matrix)parcsr_A, (HYPRE_Vector)b, (HYPRE_Vector)x); HYPRE_CGNRSolve(pcg_solver, (HYPRE_Matrix)parcsr_A, (HYPRE_Vector)b, (HYPRE_Vector)x); #endif HYPRE_ParCSRCGNRDestroy(pcg_solver); if (solver_id == 5) { HYPRE_BoomerAMGDestroy(pcg_precond); } if (myid == 0 /* begin lobpcg */ && !lobpcgFlag /* end lobpcg */) { hypre_printf("\n"); hypre_printf("Iterations = %d\n", num_iterations); hypre_printf("Final Relative Residual Norm = %e\n", final_res_norm); hypre_printf("\n"); } } /*----------------------------------------------------------- * Print the solution and other info *-----------------------------------------------------------*/ HYPRE_IJVectorGetObjectType(ij_b, &j); /* HYPRE_IJVectorPrint(ij_b, "driver.out.b"); HYPRE_IJVectorPrint(ij_x, "driver.out.x"); */ /*----------------------------------------------------------- * Finalize things *-----------------------------------------------------------*/ HYPRE_IJMatrixDestroy(ij_A); HYPRE_IJVectorDestroy(ij_b); HYPRE_IJVectorDestroy(ij_x); hypre_MPI_Finalize(); return (0); } /*---------------------------------------------------------------------- * Build matrix from file. Expects three files on each processor. * filename.D.n contains the diagonal part, filename.O.n contains * the offdiagonal part and filename.INFO.n contains global row * and column numbers, number of columns of offdiagonal matrix * and the mapping of offdiagonal column numbers to global column numbers. * Parameters given in command line. *----------------------------------------------------------------------*/ HYPRE_Int BuildParFromFile( HYPRE_Int argc, char *argv[], HYPRE_Int arg_index, HYPRE_ParCSRMatrix *A_ptr ) { char *filename; HYPRE_ParCSRMatrix A; HYPRE_Int myid; /*----------------------------------------------------------- * Initialize some stuff *-----------------------------------------------------------*/ hypre_MPI_Comm_rank(hypre_MPI_COMM_WORLD, &myid ); /*----------------------------------------------------------- * Parse command line *-----------------------------------------------------------*/ if (arg_index < argc) { filename = argv[arg_index]; } else { hypre_printf("Error: No filename specified \n"); exit(1); } /*----------------------------------------------------------- * Print driver parameters *-----------------------------------------------------------*/ if (myid == 0) { hypre_printf(" FromFile: %s\n", filename); } /*----------------------------------------------------------- * Generate the matrix *-----------------------------------------------------------*/ HYPRE_ParCSRMatrixRead(hypre_MPI_COMM_WORLD, filename, &A); *A_ptr = A; return (0); } /*---------------------------------------------------------------------- * Build standard 7-point laplacian in 3D with grid and anisotropy. * Parameters given in command line. *----------------------------------------------------------------------*/ HYPRE_Int BuildParLaplacian( HYPRE_Int argc, char *argv[], HYPRE_Int arg_index, HYPRE_ParCSRMatrix *A_ptr ) { HYPRE_Int nx, ny, nz; HYPRE_Int P, Q, R; HYPRE_Real cx, cy, cz; HYPRE_ParCSRMatrix A; HYPRE_Int num_procs, myid; HYPRE_Int p, q, r; HYPRE_Real *values; /*----------------------------------------------------------- * Initialize some stuff *-----------------------------------------------------------*/ hypre_MPI_Comm_size(hypre_MPI_COMM_WORLD, &num_procs ); hypre_MPI_Comm_rank(hypre_MPI_COMM_WORLD, &myid ); /*----------------------------------------------------------- * Set defaults *-----------------------------------------------------------*/ nx = 10; ny = 10; nz = 10; P = 1; Q = num_procs; R = 1; cx = 1.; cy = 1.; cz = 1.; /*----------------------------------------------------------- * Parse command line *-----------------------------------------------------------*/ arg_index = 0; while (arg_index < argc) { if ( strcmp(argv[arg_index], "-n") == 0 ) { arg_index++; nx = atoi(argv[arg_index++]); ny = atoi(argv[arg_index++]); nz = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-P") == 0 ) { arg_index++; P = atoi(argv[arg_index++]); Q = atoi(argv[arg_index++]); R = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-c") == 0 ) { arg_index++; cx = (HYPRE_Real)atof(argv[arg_index++]); cy = (HYPRE_Real)atof(argv[arg_index++]); cz = (HYPRE_Real)atof(argv[arg_index++]); } else { arg_index++; } } /*----------------------------------------------------------- * Check a few things *-----------------------------------------------------------*/ if ((P * Q * R) != num_procs) { hypre_printf("Error: Invalid number of processors or processor topology \n"); exit(1); } /*----------------------------------------------------------- * Print driver parameters *-----------------------------------------------------------*/ if (myid == 0) { hypre_printf(" Laplacian:\n"); hypre_printf(" (nx, ny, nz) = (%d, %d, %d)\n", nx, ny, nz); hypre_printf(" (Px, Py, Pz) = (%d, %d, %d)\n", P, Q, R); hypre_printf(" (cx, cy, cz) = (%f, %f, %f)\n\n", cx, cy, cz); } /*----------------------------------------------------------- * Set up the grid structure *-----------------------------------------------------------*/ /* compute p,q,r from P,Q,R and myid */ p = myid % P; q = (( myid - p) / P) % Q; r = ( myid - p - P * q) / ( P * Q ); /*----------------------------------------------------------- * Generate the matrix *-----------------------------------------------------------*/ values = hypre_CTAlloc(HYPRE_Real, 4, HYPRE_MEMORY_HOST); values[1] = -cx; values[2] = -cy; values[3] = -cz; values[0] = 0.; if (nx > 1) { values[0] += 2.0 * cx; } if (ny > 1) { values[0] += 2.0 * cy; } if (nz > 1) { values[0] += 2.0 * cz; } A = (HYPRE_ParCSRMatrix) GenerateLaplacian(hypre_MPI_COMM_WORLD, nx, ny, nz, P, Q, R, p, q, r, values); hypre_TFree(values, HYPRE_MEMORY_HOST); *A_ptr = A; return (0); } /*---------------------------------------------------------------------- * Build standard 7-point convection-diffusion operator * Parameters given in command line. * Operator: * * -cx Dxx - cy Dyy - cz Dzz + ax Dx + ay Dy + az Dz = f * *----------------------------------------------------------------------*/ HYPRE_Int BuildParDifConv( HYPRE_Int argc, char *argv[], HYPRE_Int arg_index, HYPRE_ParCSRMatrix *A_ptr ) { HYPRE_Int nx, ny, nz; HYPRE_Int P, Q, R; HYPRE_Real cx, cy, cz; HYPRE_Real ax, ay, az; HYPRE_Real hinx, hiny, hinz; HYPRE_ParCSRMatrix A; HYPRE_Int num_procs, myid; HYPRE_Int p, q, r; HYPRE_Real *values; /*----------------------------------------------------------- * Initialize some stuff *-----------------------------------------------------------*/ hypre_MPI_Comm_size(hypre_MPI_COMM_WORLD, &num_procs ); hypre_MPI_Comm_rank(hypre_MPI_COMM_WORLD, &myid ); /*----------------------------------------------------------- * Set defaults *-----------------------------------------------------------*/ nx = 10; ny = 10; nz = 10; P = 1; Q = num_procs; R = 1; cx = 1.; cy = 1.; cz = 1.; ax = 1.; ay = 1.; az = 1.; /*----------------------------------------------------------- * Parse command line *-----------------------------------------------------------*/ arg_index = 0; while (arg_index < argc) { if ( strcmp(argv[arg_index], "-n") == 0 ) { arg_index++; nx = atoi(argv[arg_index++]); ny = atoi(argv[arg_index++]); nz = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-P") == 0 ) { arg_index++; P = atoi(argv[arg_index++]); Q = atoi(argv[arg_index++]); R = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-c") == 0 ) { arg_index++; cx = (HYPRE_Real)atof(argv[arg_index++]); cy = (HYPRE_Real)atof(argv[arg_index++]); cz = (HYPRE_Real)atof(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-a") == 0 ) { arg_index++; ax = (HYPRE_Real)atof(argv[arg_index++]); ay = (HYPRE_Real)atof(argv[arg_index++]); az = (HYPRE_Real)atof(argv[arg_index++]); } else { arg_index++; } } /*----------------------------------------------------------- * Check a few things *-----------------------------------------------------------*/ if ((P * Q * R) != num_procs) { hypre_printf("Error: Invalid number of processors or processor topology \n"); exit(1); } /*----------------------------------------------------------- * Print driver parameters *-----------------------------------------------------------*/ if (myid == 0) { hypre_printf(" Convection-Diffusion: \n"); hypre_printf(" -cx Dxx - cy Dyy - cz Dzz + ax Dx + ay Dy + az Dz = f\n"); hypre_printf(" (nx, ny, nz) = (%d, %d, %d)\n", nx, ny, nz); hypre_printf(" (Px, Py, Pz) = (%d, %d, %d)\n", P, Q, R); hypre_printf(" (cx, cy, cz) = (%f, %f, %f)\n", cx, cy, cz); hypre_printf(" (ax, ay, az) = (%f, %f, %f)\n\n", ax, ay, az); } /*----------------------------------------------------------- * Set up the grid structure *-----------------------------------------------------------*/ /* compute p,q,r from P,Q,R and myid */ p = myid % P; q = (( myid - p) / P) % Q; r = ( myid - p - P * q) / ( P * Q ); hinx = 1. / (nx + 1); hiny = 1. / (ny + 1); hinz = 1. / (nz + 1); /*----------------------------------------------------------- * Generate the matrix *-----------------------------------------------------------*/ values = hypre_CTAlloc(HYPRE_Real, 7, HYPRE_MEMORY_HOST); values[1] = -cx / (hinx * hinx); values[2] = -cy / (hiny * hiny); values[3] = -cz / (hinz * hinz); values[4] = -cx / (hinx * hinx) + ax / hinx; values[5] = -cy / (hiny * hiny) + ay / hiny; values[6] = -cz / (hinz * hinz) + az / hinz; values[0] = 0.; if (nx > 1) { values[0] += 2.0 * cx / (hinx * hinx) - 1.*ax / hinx; } if (ny > 1) { values[0] += 2.0 * cy / (hiny * hiny) - 1.*ay / hiny; } if (nz > 1) { values[0] += 2.0 * cz / (hinz * hinz) - 1.*az / hinz; } A = (HYPRE_ParCSRMatrix) GenerateDifConv(hypre_MPI_COMM_WORLD, nx, ny, nz, P, Q, R, p, q, r, values); hypre_TFree(values, HYPRE_MEMORY_HOST); *A_ptr = A; return (0); } /*---------------------------------------------------------------------- * Build matrix from one file on Proc. 0. Expects matrix to be in * CSR format. Distributes matrix across processors giving each about * the same number of rows. * Parameters given in command line. *----------------------------------------------------------------------*/ HYPRE_Int BuildParFromOneFile2(HYPRE_Int argc, char *argv[], HYPRE_Int arg_index, HYPRE_Int num_functions, HYPRE_ParCSRMatrix *A_ptr ) { char *filename; HYPRE_ParCSRMatrix A; HYPRE_CSRMatrix A_CSR = NULL; HYPRE_Int myid, numprocs; HYPRE_Int i, rest, size, num_nodes, num_dofs; HYPRE_Int *row_part; HYPRE_Int *col_part; /*----------------------------------------------------------- * Initialize some stuff *-----------------------------------------------------------*/ hypre_MPI_Comm_rank(hypre_MPI_COMM_WORLD, &myid ); hypre_MPI_Comm_size(hypre_MPI_COMM_WORLD, &numprocs ); /*----------------------------------------------------------- * Parse command line *-----------------------------------------------------------*/ if (arg_index < argc) { filename = argv[arg_index]; } else { hypre_printf("Error: No filename specified \n"); exit(1); } /*----------------------------------------------------------- * Print driver parameters *-----------------------------------------------------------*/ if (myid == 0) { hypre_printf(" FromFile: %s\n", filename); /*----------------------------------------------------------- * Generate the matrix *-----------------------------------------------------------*/ A_CSR = HYPRE_CSRMatrixRead(filename); } row_part = NULL; col_part = NULL; if (myid == 0 && num_functions > 1) { HYPRE_CSRMatrixGetNumRows(A_CSR, &num_dofs); num_nodes = num_dofs / num_functions; if (num_dofs != num_functions * num_nodes) { row_part = NULL; col_part = NULL; } else { row_part = hypre_CTAlloc(HYPRE_Int, numprocs + 1, HYPRE_MEMORY_HOST); row_part[0] = 0; size = num_nodes / numprocs; rest = num_nodes - size * numprocs; for (i = 0; i < numprocs; i++) { row_part[i + 1] = row_part[i] + size * num_functions; if (i < rest) { row_part[i + 1] += num_functions; } } col_part = row_part; } } HYPRE_CSRMatrixToParCSRMatrix(hypre_MPI_COMM_WORLD, A_CSR, row_part, col_part, &A); *A_ptr = A; if (myid == 0) { HYPRE_CSRMatrixDestroy(A_CSR); } return (0); } /*---------------------------------------------------------------------- * Build Function array from files on different processors *----------------------------------------------------------------------*/ HYPRE_Int BuildFuncsFromFiles( HYPRE_Int argc, char *argv[], HYPRE_Int arg_index, HYPRE_ParCSRMatrix parcsr_A, HYPRE_Int **dof_func_ptr ) { /*---------------------------------------------------------------------- * Build Function array from files on different processors *----------------------------------------------------------------------*/ hypre_printf (" Feature is not implemented yet!\n"); return (0); } HYPRE_Int BuildFuncsFromOneFile( HYPRE_Int argc, char *argv[], HYPRE_Int arg_index, HYPRE_ParCSRMatrix parcsr_A, HYPRE_Int **dof_func_ptr ) { char *filename; HYPRE_Int myid, num_procs; HYPRE_Int *partitioning; HYPRE_Int *dof_func; HYPRE_Int *dof_func_local; HYPRE_Int i, j; HYPRE_Int local_size, global_size; hypre_MPI_Request *requests; hypre_MPI_Status *status, status0; MPI_Comm comm; /*----------------------------------------------------------- * Initialize some stuff *-----------------------------------------------------------*/ comm = hypre_MPI_COMM_WORLD; hypre_MPI_Comm_rank(hypre_MPI_COMM_WORLD, &myid ); hypre_MPI_Comm_size(hypre_MPI_COMM_WORLD, &num_procs ); /*----------------------------------------------------------- * Parse command line *-----------------------------------------------------------*/ if (arg_index < argc) { filename = argv[arg_index]; } else { hypre_printf("Error: No filename specified \n"); exit(1); } /*----------------------------------------------------------- * Print driver parameters *-----------------------------------------------------------*/ if (myid == 0) { FILE *fp; hypre_printf(" Funcs FromFile: %s\n", filename); /*----------------------------------------------------------- * read in the data *-----------------------------------------------------------*/ fp = fopen(filename, "r"); hypre_fscanf(fp, "%d", &global_size); dof_func = hypre_CTAlloc(HYPRE_Int, global_size, HYPRE_MEMORY_HOST); for (j = 0; j < global_size; j++) { hypre_fscanf(fp, "%d", &dof_func[j]); } fclose(fp); } HYPRE_ParCSRMatrixGetRowPartitioning(parcsr_A, &partitioning); local_size = partitioning[myid + 1] - partitioning[myid]; dof_func_local = hypre_CTAlloc(HYPRE_Int, local_size, HYPRE_MEMORY_HOST); if (myid == 0) { requests = hypre_CTAlloc(hypre_MPI_Request, num_procs - 1, HYPRE_MEMORY_HOST); status = hypre_CTAlloc(hypre_MPI_Status, num_procs - 1, HYPRE_MEMORY_HOST); j = 0; for (i = 1; i < num_procs; i++) hypre_MPI_Isend(&dof_func[partitioning[i]], partitioning[i + 1] - partitioning[i], HYPRE_MPI_INT, i, 0, comm, &requests[j++]); for (i = 0; i < local_size; i++) { dof_func_local[i] = dof_func[i]; } hypre_MPI_Waitall(num_procs - 1, requests, status); hypre_TFree(requests, HYPRE_MEMORY_HOST); hypre_TFree(status, HYPRE_MEMORY_HOST); } else { hypre_MPI_Recv(dof_func_local, local_size, HYPRE_MPI_INT, 0, 0, comm, &status0); } *dof_func_ptr = dof_func_local; if (myid == 0) { hypre_TFree(dof_func, HYPRE_MEMORY_HOST); } return (0); } /*---------------------------------------------------------------------- * Build Rhs from one file on Proc. 0. Distributes vector across processors * giving each about using the distribution of the matrix A. *----------------------------------------------------------------------*/ HYPRE_Int BuildRhsParFromOneFile2(HYPRE_Int argc, char *argv[], HYPRE_Int arg_index, HYPRE_Int *partitioning, HYPRE_ParVector *b_ptr ) { char *filename; HYPRE_ParVector b; HYPRE_Vector b_CSR; HYPRE_Int myid; /*----------------------------------------------------------- * Initialize some stuff *-----------------------------------------------------------*/ hypre_MPI_Comm_rank(hypre_MPI_COMM_WORLD, &myid ); /*----------------------------------------------------------- * Parse command line *-----------------------------------------------------------*/ if (arg_index < argc) { filename = argv[arg_index]; } else { hypre_printf("Error: No filename specified \n"); exit(1); } /*----------------------------------------------------------- * Print driver parameters *-----------------------------------------------------------*/ if (myid == 0) { hypre_printf(" Rhs FromFile: %s\n", filename); /*----------------------------------------------------------- * Generate the matrix *-----------------------------------------------------------*/ b_CSR = HYPRE_VectorRead(filename); } HYPRE_VectorToParVector(hypre_MPI_COMM_WORLD, b_CSR, partitioning, &b); *b_ptr = b; HYPRE_VectorDestroy(b_CSR); return (0); } /*---------------------------------------------------------------------- * Build standard 9-point laplacian in 2D with grid and anisotropy. * Parameters given in command line. *----------------------------------------------------------------------*/ HYPRE_Int BuildParLaplacian9pt( HYPRE_Int argc, char *argv[], HYPRE_Int arg_index, HYPRE_ParCSRMatrix *A_ptr ) { HYPRE_Int nx, ny; HYPRE_Int P, Q; HYPRE_ParCSRMatrix A; HYPRE_Int num_procs, myid; HYPRE_Int p, q; HYPRE_Real *values; /*----------------------------------------------------------- * Initialize some stuff *-----------------------------------------------------------*/ hypre_MPI_Comm_size(hypre_MPI_COMM_WORLD, &num_procs ); hypre_MPI_Comm_rank(hypre_MPI_COMM_WORLD, &myid ); /*----------------------------------------------------------- * Set defaults *-----------------------------------------------------------*/ nx = 10; ny = 10; P = 1; Q = num_procs; /*----------------------------------------------------------- * Parse command line *-----------------------------------------------------------*/ arg_index = 0; while (arg_index < argc) { if ( strcmp(argv[arg_index], "-n") == 0 ) { arg_index++; nx = atoi(argv[arg_index++]); ny = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-P") == 0 ) { arg_index++; P = atoi(argv[arg_index++]); Q = atoi(argv[arg_index++]); } else { arg_index++; } } /*----------------------------------------------------------- * Check a few things *-----------------------------------------------------------*/ if ((P * Q) != num_procs) { hypre_printf("Error: Invalid number of processors or processor topology \n"); exit(1); } /*----------------------------------------------------------- * Print driver parameters *-----------------------------------------------------------*/ if (myid == 0) { hypre_printf(" Laplacian 9pt:\n"); hypre_printf(" (nx, ny) = (%d, %d)\n", nx, ny); hypre_printf(" (Px, Py) = (%d, %d)\n\n", P, Q); } /*----------------------------------------------------------- * Set up the grid structure *-----------------------------------------------------------*/ /* compute p,q from P,Q and myid */ p = myid % P; q = ( myid - p) / P; /*----------------------------------------------------------- * Generate the matrix *-----------------------------------------------------------*/ values = hypre_CTAlloc(HYPRE_Real, 2, HYPRE_MEMORY_HOST); values[1] = -1.; values[0] = 0.; if (nx > 1) { values[0] += 2.0; } if (ny > 1) { values[0] += 2.0; } if (nx > 1 && ny > 1) { values[0] += 4.0; } A = (HYPRE_ParCSRMatrix) GenerateLaplacian9pt(hypre_MPI_COMM_WORLD, nx, ny, P, Q, p, q, values); hypre_TFree(values, HYPRE_MEMORY_HOST); *A_ptr = A; return (0); } /*---------------------------------------------------------------------- * Build 27-point laplacian in 3D, * Parameters given in command line. *----------------------------------------------------------------------*/ HYPRE_Int BuildParLaplacian27pt( HYPRE_Int argc, char *argv[], HYPRE_Int arg_index, HYPRE_ParCSRMatrix *A_ptr ) { HYPRE_Int nx, ny, nz; HYPRE_Int P, Q, R; HYPRE_ParCSRMatrix A; HYPRE_Int num_procs, myid; HYPRE_Int p, q, r; HYPRE_Real *values; /*----------------------------------------------------------- * Initialize some stuff *-----------------------------------------------------------*/ hypre_MPI_Comm_size(hypre_MPI_COMM_WORLD, &num_procs ); hypre_MPI_Comm_rank(hypre_MPI_COMM_WORLD, &myid ); /*----------------------------------------------------------- * Set defaults *-----------------------------------------------------------*/ nx = 10; ny = 10; nz = 10; P = 1; Q = num_procs; R = 1; /*----------------------------------------------------------- * Parse command line *-----------------------------------------------------------*/ arg_index = 0; while (arg_index < argc) { if ( strcmp(argv[arg_index], "-n") == 0 ) { arg_index++; nx = atoi(argv[arg_index++]); ny = atoi(argv[arg_index++]); nz = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-P") == 0 ) { arg_index++; P = atoi(argv[arg_index++]); Q = atoi(argv[arg_index++]); R = atoi(argv[arg_index++]); } else { arg_index++; } } /*----------------------------------------------------------- * Check a few things *-----------------------------------------------------------*/ if ((P * Q * R) != num_procs) { hypre_printf("Error: Invalid number of processors or processor topology \n"); exit(1); } /*----------------------------------------------------------- * Print driver parameters *-----------------------------------------------------------*/ if (myid == 0) { hypre_printf(" Laplacian_27pt:\n"); hypre_printf(" (nx, ny, nz) = (%d, %d, %d)\n", nx, ny, nz); hypre_printf(" (Px, Py, Pz) = (%d, %d, %d)\n\n", P, Q, R); } /*----------------------------------------------------------- * Set up the grid structure *-----------------------------------------------------------*/ /* compute p,q,r from P,Q,R and myid */ p = myid % P; q = (( myid - p) / P) % Q; r = ( myid - p - P * q) / ( P * Q ); /*----------------------------------------------------------- * Generate the matrix *-----------------------------------------------------------*/ values = hypre_CTAlloc(HYPRE_Real, 2, HYPRE_MEMORY_HOST); values[0] = 26.0; if (nx == 1 || ny == 1 || nz == 1) { values[0] = 8.0; } if (nx * ny == 1 || nx * nz == 1 || ny * nz == 1) { values[0] = 2.0; } values[1] = -1.; A = (HYPRE_ParCSRMatrix) GenerateLaplacian27pt(hypre_MPI_COMM_WORLD, nx, ny, nz, P, Q, R, p, q, r, values); hypre_TFree(values, HYPRE_MEMORY_HOST); *A_ptr = A; return (0); } /* begin lobpcg */ /*---------------------------------------------------------------------- * Build standard 7-point laplacian in 3D. *----------------------------------------------------------------------*/ HYPRE_Int BuildParIsoLaplacian( HYPRE_Int argc, char** argv, HYPRE_ParCSRMatrix *A_ptr ) { HYPRE_Int nx, ny, nz; HYPRE_Real cx, cy, cz; HYPRE_Int P, Q, R; HYPRE_ParCSRMatrix A; HYPRE_Int num_procs, myid; HYPRE_Int p, q, r; HYPRE_Real *values; HYPRE_Int arg_index; /*----------------------------------------------------------- * Initialize some stuff *-----------------------------------------------------------*/ hypre_MPI_Comm_size(hypre_MPI_COMM_WORLD, &num_procs ); hypre_MPI_Comm_rank(hypre_MPI_COMM_WORLD, &myid ); /*----------------------------------------------------------- * Set defaults *-----------------------------------------------------------*/ P = 1; Q = num_procs; R = 1; nx = 10; ny = 10; nz = 10; cx = 1.0; cy = 1.0; cz = 1.0; arg_index = 0; while (arg_index < argc) { if ( strcmp(argv[arg_index], "-n") == 0 ) { arg_index++; nx = atoi(argv[arg_index++]); ny = atoi(argv[arg_index++]); nz = atoi(argv[arg_index++]); } else { arg_index++; } } /*----------------------------------------------------------- * Print driver parameters *-----------------------------------------------------------*/ if (myid == 0) { hypre_printf(" Laplacian:\n"); hypre_printf(" (nx, ny, nz) = (%d, %d, %d)\n", nx, ny, nz); hypre_printf(" (Px, Py, Pz) = (%d, %d, %d)\n", P, Q, R); hypre_printf(" (cx, cy, cz) = (%f, %f, %f)\n\n", cx, cy, cz); } /*----------------------------------------------------------- * Set up the grid structure *-----------------------------------------------------------*/ /* compute p,q,r from P,Q,R and myid */ p = myid % P; q = (( myid - p) / P) % Q; r = ( myid - p - P * q) / ( P * Q ); /*----------------------------------------------------------- * Generate the matrix *-----------------------------------------------------------*/ values = hypre_CTAlloc(HYPRE_Real, 4, HYPRE_MEMORY_HOST); values[1] = -cx; values[2] = -cy; values[3] = -cz; values[0] = 0.; if (nx > 1) { values[0] += 2.0 * cx; } if (ny > 1) { values[0] += 2.0 * cy; } if (nz > 1) { values[0] += 2.0 * cz; } A = (HYPRE_ParCSRMatrix) GenerateLaplacian(hypre_MPI_COMM_WORLD, nx, ny, nz, P, Q, R, p, q, r, values); hypre_TFree(values, HYPRE_MEMORY_HOST); *A_ptr = A; return (0); } /* end lobpcg */ hypre-2.33.0/src/test/zboxloop.c000066400000000000000000000427631477326011500165360ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include #include #include #include "_hypre_utilities.h" #include "HYPRE_struct_ls.h" #include "HYPRE_krylov.h" #include "_hypre_struct_mv.h" #include "_hypre_struct_mv.hpp" /*-------------------------------------------------------------------------- * Test driver to time new boxloops and compare to the old ones *--------------------------------------------------------------------------*/ hypre_int main( hypre_int argc, char *argv[] ) { HYPRE_Int arg_index; HYPRE_Int print_usage; HYPRE_Int nx, ny, nz; HYPRE_Int P, Q, R; HYPRE_Int time_index; HYPRE_Int num_procs, myid; HYPRE_Int dim; HYPRE_Int rep, reps, fail, sum; HYPRE_Int size; hypre_Box *x1_data_box, *x2_data_box, *x3_data_box, *x4_data_box; //HYPRE_Int xi1, xi2, xi3, xi4; HYPRE_Int xi1; HYPRE_Real *xp1, *xp2, *xp3, *xp4; HYPRE_Real *d_xp1, *d_xp2, *d_xp3, *d_xp4; hypre_Index loop_size, start, unit_stride, index; /*----------------------------------------------------------- * Initialize some stuff *-----------------------------------------------------------*/ /* Initialize MPI */ hypre_MPI_Init(&argc, &argv); hypre_MPI_Comm_size(hypre_MPI_COMM_WORLD, &num_procs ); hypre_MPI_Comm_rank(hypre_MPI_COMM_WORLD, &myid ); HYPRE_Initialize(); #if defined(HYPRE_USING_KOKKOS) Kokkos::initialize (argc, argv); #endif /*----------------------------------------------------------- * Set defaults *-----------------------------------------------------------*/ dim = 3; nx = 10; ny = 10; nz = 10; P = num_procs; Q = 1; R = 1; reps = -1; /*----------------------------------------------------------- * Parse command line *-----------------------------------------------------------*/ print_usage = 0; arg_index = 1; while (arg_index < argc) { if ( strcmp(argv[arg_index], "-n") == 0 ) { arg_index++; nx = atoi(argv[arg_index++]); ny = atoi(argv[arg_index++]); nz = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-P") == 0 ) { arg_index++; P = atoi(argv[arg_index++]); Q = atoi(argv[arg_index++]); R = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-d") == 0 ) { arg_index++; dim = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-reps") == 0 ) { arg_index++; reps = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-help") == 0 ) { print_usage = 1; break; } else { arg_index++; } } /*----------------------------------------------------------- * Print usage info *-----------------------------------------------------------*/ if ( (print_usage) && (myid == 0) ) { hypre_printf("\n"); hypre_printf("Usage: %s []\n", argv[0]); hypre_printf("\n"); hypre_printf(" -n : problem size per block\n"); hypre_printf(" -P : processor topology\n"); hypre_printf(" -d : problem dimension (2 or 3)\n"); hypre_printf("\n"); } if ( print_usage ) { exit(1); } /*----------------------------------------------------------- * Check a few things *-----------------------------------------------------------*/ if ((P * Q * R) > num_procs) { if (myid == 0) { hypre_printf("Error: PxQxR is more than the number of processors\n"); } exit(1); } else if ((P * Q * R) < num_procs) { if (myid == 0) { hypre_printf("Warning: PxQxR is less than the number of processors\n"); } } /*----------------------------------------------------------- * Initialize some stuff *-----------------------------------------------------------*/ hypre_SetIndex3(start, 1, 1, 1); hypre_SetIndex3(loop_size, nx, ny, nz); hypre_SetIndex3(unit_stride, 1, 1, 1); x1_data_box = hypre_BoxCreate(dim); x2_data_box = hypre_BoxCreate(dim); x3_data_box = hypre_BoxCreate(dim); x4_data_box = hypre_BoxCreate(dim); hypre_SetIndex3(hypre_BoxIMin(x1_data_box), 0, 0, 0); hypre_SetIndex3(hypre_BoxIMax(x1_data_box), nx + 1, ny + 1, nz + 1); hypre_CopyBox(x1_data_box, x2_data_box); hypre_CopyBox(x1_data_box, x3_data_box); hypre_CopyBox(x1_data_box, x4_data_box); size = (nx + 2) * (ny + 2) * (nz + 2); xp1 = hypre_CTAlloc(HYPRE_Real, size, HYPRE_MEMORY_HOST); xp2 = hypre_CTAlloc(HYPRE_Real, size, HYPRE_MEMORY_HOST); xp3 = hypre_CTAlloc(HYPRE_Real, size, HYPRE_MEMORY_HOST); xp4 = hypre_CTAlloc(HYPRE_Real, size, HYPRE_MEMORY_HOST); d_xp1 = hypre_CTAlloc(HYPRE_Real, size, HYPRE_MEMORY_DEVICE); d_xp2 = hypre_CTAlloc(HYPRE_Real, size, HYPRE_MEMORY_DEVICE); d_xp3 = hypre_CTAlloc(HYPRE_Real, size, HYPRE_MEMORY_DEVICE); d_xp4 = hypre_CTAlloc(HYPRE_Real, size, HYPRE_MEMORY_DEVICE); if (reps < 0) { reps = 1000000000 / (nx * ny * nz + 1000); } /*----------------------------------------------------------- * Print driver parameters *-----------------------------------------------------------*/ if (myid == 0) { hypre_printf("Running with these driver parameters:\n"); hypre_printf(" (nx, ny, nz) = (%d, %d, %d)\n", nx, ny, nz); hypre_printf(" (Px, Py, Pz) = (%d, %d, %d)\n", P, Q, R); hypre_printf(" dim = %d\n", dim); hypre_printf(" reps = %d\n", reps); } /*----------------------------------------------------------- * Check new boxloops *-----------------------------------------------------------*/ /* xp1 is already initialized to 0 */ zypre_BoxLoop1Begin(dim, loop_size, x1_data_box, start, unit_stride, xi1); { xp1[xi1] ++; } zypre_BoxLoop1End(xi1); /* Use old boxloop to check that values are set to 1 */ fail = 0; sum = 0; hypre_SerialBoxLoop1Begin(3, loop_size, x1_data_box, start, unit_stride, xi1); { sum += (HYPRE_Int)xp1[xi1]; if (xp1[xi1] != 1) { zypre_BoxLoopGetIndex(index); hypre_printf("*(%d,%d,%d) = %d\n", index[0], index[1], index[2], (HYPRE_Int) xp1[xi1]); fail = 1; } } hypre_SerialBoxLoop1End(xi1); if (sum != (nx * ny * nz)) { hypre_printf("*sum = %d\n", sum); fail = 1; } if (fail) { exit(1); } /*----------------------------------------------------------- * Synchronize so that timings make sense *-----------------------------------------------------------*/ hypre_MPI_Barrier(hypre_MPI_COMM_WORLD); /*----------------------------------------------------------- * Time (device) boxloops *-----------------------------------------------------------*/ /* Time BoxLoop0 */ time_index = hypre_InitializeTiming("BoxLoop0"); hypre_BeginTiming(time_index); for (rep = 0; rep < reps; rep++) { xi1 = 0; #define DEVICE_VAR is_device_ptr(d_xp1) hypre_BoxLoop0Begin(3, loop_size); { d_xp1[xi1] += d_xp1[xi1]; //xi1++; } hypre_BoxLoop0End(); #undef DEVICE_VAR } hypre_EndTiming(time_index); /* Time BoxLoop1 */ time_index = hypre_InitializeTiming("BoxLoop1"); hypre_BeginTiming(time_index); for (rep = 0; rep < reps; rep++) { #define DEVICE_VAR is_device_ptr(d_xp1) hypre_BoxLoop1Begin(3, loop_size, x1_data_box, start, unit_stride, xi1); { d_xp1[xi1] += d_xp1[xi1]; } hypre_BoxLoop1End(xi1); #undef DEVICE_VAR } hypre_EndTiming(time_index); /* Time BoxLoop2 */ time_index = hypre_InitializeTiming("BoxLoop2"); hypre_BeginTiming(time_index); for (rep = 0; rep < reps; rep++) { #define DEVICE_VAR is_device_ptr(d_xp1,d_xp2) hypre_BoxLoop2Begin(3, loop_size, x1_data_box, start, unit_stride, xi1, x2_data_box, start, unit_stride, xi2); { d_xp1[xi1] += d_xp1[xi1] + d_xp2[xi2]; } hypre_BoxLoop2End(xi1, xi2); #undef DEVICE_VAR } hypre_EndTiming(time_index); /* Time BoxLoop3 */ time_index = hypre_InitializeTiming("BoxLoop3"); hypre_BeginTiming(time_index); for (rep = 0; rep < reps; rep++) { #define DEVICE_VAR is_device_ptr(d_xp1,d_xp2,d_xp3) hypre_BoxLoop3Begin(3, loop_size, x1_data_box, start, unit_stride, xi1, x2_data_box, start, unit_stride, xi2, x3_data_box, start, unit_stride, xi3); { d_xp1[xi1] += d_xp1[xi1] + d_xp2[xi2] + d_xp3[xi3]; } hypre_BoxLoop3End(xi1, xi2, xi3); #undef DEVICE_VAR } hypre_EndTiming(time_index); /* Time BoxLoop4 */ time_index = hypre_InitializeTiming("BoxLoop4"); hypre_BeginTiming(time_index); for (rep = 0; rep < reps; rep++) { #define DEVICE_VAR is_device_ptr(d_xp1,d_xp2,d_xp3,d_xp4) hypre_BoxLoop4Begin(3, loop_size, x1_data_box, start, unit_stride, xi1, x2_data_box, start, unit_stride, xi2, x3_data_box, start, unit_stride, xi3, x4_data_box, start, unit_stride, xi4); { d_xp1[xi1] += d_xp1[xi1] + d_xp2[xi2] + d_xp3[xi3] + d_xp4[xi4]; } hypre_BoxLoop4End(xi1, xi2, xi3, xi4); #undef DEVICE_VAR } hypre_EndTiming(time_index); hypre_PrintTiming("BoxLoop times [DEVICE]", hypre_MPI_COMM_WORLD); hypre_FinalizeAllTimings(); hypre_ClearTiming(); /*----------------------------------------------------------- * Time host boxloops *-----------------------------------------------------------*/ /* Time BoxLoop0 */ time_index = hypre_InitializeTiming("BoxLoop0"); hypre_BeginTiming(time_index); for (rep = 0; rep < reps; rep++) { xi1 = 0; #undef HYPRE_OMP_CLAUSE #define HYPRE_OMP_CLAUSE firstprivate(xi1) zypre_BoxLoop0Begin(dim, loop_size); { xp1[xi1] += xp1[xi1]; xi1++; } zypre_BoxLoop0End(); } hypre_EndTiming(time_index); /* Time BoxLoop1 */ time_index = hypre_InitializeTiming("BoxLoop1"); hypre_BeginTiming(time_index); for (rep = 0; rep < reps; rep++) { zypre_BoxLoop1Begin(dim, loop_size, x1_data_box, start, unit_stride, xi1); { xp1[xi1] += xp1[xi1]; } zypre_BoxLoop1End(xi1); } hypre_EndTiming(time_index); /* Time BoxLoop2 */ time_index = hypre_InitializeTiming("BoxLoop2"); hypre_BeginTiming(time_index); for (rep = 0; rep < reps; rep++) { zypre_BoxLoop2Begin(dim, loop_size, x1_data_box, start, unit_stride, xi1, x2_data_box, start, unit_stride, xi2); { xp1[xi1] += xp1[xi1] + xp2[xi2]; } zypre_BoxLoop2End(xi1, xi2); } hypre_EndTiming(time_index); /* Time BoxLoop3 */ time_index = hypre_InitializeTiming("BoxLoop3"); hypre_BeginTiming(time_index); for (rep = 0; rep < reps; rep++) { zypre_BoxLoop3Begin(dim, loop_size, x1_data_box, start, unit_stride, xi1, x2_data_box, start, unit_stride, xi2, x3_data_box, start, unit_stride, xi3); { xp1[xi1] += xp1[xi1] + xp2[xi2] + xp3[xi3]; } zypre_BoxLoop3End(xi1, xi2, xi3); } hypre_EndTiming(time_index); /* Time BoxLoop4 */ time_index = hypre_InitializeTiming("BoxLoop4"); hypre_BeginTiming(time_index); for (rep = 0; rep < reps; rep++) { zypre_BoxLoop4Begin(dim, loop_size, x1_data_box, start, unit_stride, xi1, x2_data_box, start, unit_stride, xi2, x3_data_box, start, unit_stride, xi3, x4_data_box, start, unit_stride, xi4); { xp1[xi1] += xp1[xi1] + xp2[xi2] + xp3[xi3] + xp4[xi4]; } zypre_BoxLoop4End(xi1, xi2, xi3, xi4); } hypre_EndTiming(time_index); hypre_PrintTiming("BoxLoop times [HOST]", hypre_MPI_COMM_WORLD); hypre_FinalizeAllTimings(); hypre_ClearTiming(); /*----------------------------------------------------------- * Reduction Loops *-----------------------------------------------------------*/ { HYPRE_Int i; for (i = 0; i < size; i++) { xp1[i] = hypre_cos(i + 1.0); xp2[i] = hypre_sin(i + 2.0); } hypre_TMemcpy(d_xp1, xp1, HYPRE_Real, size, HYPRE_MEMORY_DEVICE, HYPRE_MEMORY_HOST); hypre_TMemcpy(d_xp2, xp2, HYPRE_Real, size, HYPRE_MEMORY_DEVICE, HYPRE_MEMORY_HOST); } #if defined(HYPRE_USING_KOKKOS) HYPRE_Real reducer = 0.0; #elif defined(HYPRE_USING_RAJA) ReduceSum reducer(0.0); #elif defined(HYPRE_USING_CUDA) || defined(HYPRE_USING_HIP) ReduceSum reducer(0.0); #else HYPRE_Real reducer = 0.0; #endif HYPRE_Real box_sum1 = 0.0, box_sum2 = 0.0; #undef HYPRE_BOX_REDUCTION #if defined(HYPRE_USING_DEVICE_OPENMP) #define HYPRE_BOX_REDUCTION map(tofrom:reducer) reduction(+:reducer) #else #define HYPRE_BOX_REDUCTION reduction(+:reducer) #endif /*----------------------------------------------------------- * Time (device) boxloops *-----------------------------------------------------------*/ /* Time BoxLoop1Reduction */ time_index = hypre_InitializeTiming("BoxLoopReduction1"); hypre_BeginTiming(time_index); for (rep = 0; rep < reps; rep++) { reducer = 0.0; #define DEVICE_VAR is_device_ptr(d_xp1) hypre_BoxLoop1ReductionBegin(3, loop_size, x1_data_box, start, unit_stride, xi1, reducer); { reducer += 1.0 / d_xp1[xi1]; } hypre_BoxLoop1ReductionEnd(xi1, reducer); #undef DEVICE_VAR box_sum1 += (HYPRE_Real) reducer; } hypre_EndTiming(time_index); /* Time BoxLoop2Reduction */ time_index = hypre_InitializeTiming("BoxLoopReduction2"); hypre_BeginTiming(time_index); for (rep = 0; rep < reps; rep++) { reducer = 0.0; #define DEVICE_VAR is_device_ptr(d_xp1,d_xp2) hypre_BoxLoop2ReductionBegin(3, loop_size, x1_data_box, start, unit_stride, xi1, x2_data_box, start, unit_stride, xi2, reducer); { reducer += 1.0 / d_xp1[xi1] + d_xp2[xi2] * 3.1415926; } hypre_BoxLoop2ReductionEnd(xi1, xi2, reducer); #undef DEVICE_VAR box_sum2 += (HYPRE_Real) reducer; } hypre_EndTiming(time_index); hypre_PrintTiming("BoxLoopReduction times [DEVICE]", hypre_MPI_COMM_WORLD); hypre_FinalizeAllTimings(); hypre_ClearTiming(); /*----------------------------------------------------------- * Time host boxloops *-----------------------------------------------------------*/ HYPRE_Real zbox_sum1 = 0.0, zbox_sum2 = 0.0; /* Time BoxLoop1 */ time_index = hypre_InitializeTiming("BoxLoopReduction1"); hypre_BeginTiming(time_index); for (rep = 0; rep < reps; rep++) { #undef HYPRE_BOX_REDUCTION #define HYPRE_BOX_REDUCTION reduction(+:zbox_sum1) zypre_BoxLoop1Begin(dim, loop_size, x1_data_box, start, unit_stride, xi1); { zbox_sum1 += 1.0 / xp1[xi1]; } zypre_BoxLoop1End(xi1); } hypre_EndTiming(time_index); /* Time BoxLoop2 */ time_index = hypre_InitializeTiming("BoxLoopReduction2"); hypre_BeginTiming(time_index); for (rep = 0; rep < reps; rep++) { #undef HYPRE_BOX_REDUCTION #define HYPRE_BOX_REDUCTION reduction(+:zbox_sum2) zypre_BoxLoop2Begin(dim, loop_size, x1_data_box, start, unit_stride, xi1, x2_data_box, start, unit_stride, xi2); { zbox_sum2 += 1.0 / xp1[xi1] + xp2[xi2] * 3.1415926; } zypre_BoxLoop2End(xi1, xi2); } hypre_EndTiming(time_index); hypre_PrintTiming("BoxLoopReduction times [HOST]", hypre_MPI_COMM_WORLD); hypre_FinalizeAllTimings(); hypre_ClearTiming(); hypre_printf("BoxLoopReduction1, error %e\n", hypre_abs((zbox_sum1 - box_sum1) / zbox_sum1)); hypre_printf("BoxLoopReduction2, error %e\n", hypre_abs((zbox_sum2 - box_sum2) / zbox_sum2)); /*----------------------------------------------------------- * Finalize things *-----------------------------------------------------------*/ hypre_BoxDestroy(x1_data_box); hypre_BoxDestroy(x2_data_box); hypre_BoxDestroy(x3_data_box); hypre_BoxDestroy(x4_data_box); hypre_TFree(xp1, HYPRE_MEMORY_HOST); hypre_TFree(xp2, HYPRE_MEMORY_HOST); hypre_TFree(xp3, HYPRE_MEMORY_HOST); hypre_TFree(xp4, HYPRE_MEMORY_HOST); hypre_TFree(d_xp1, HYPRE_MEMORY_DEVICE); hypre_TFree(d_xp2, HYPRE_MEMORY_DEVICE); hypre_TFree(d_xp3, HYPRE_MEMORY_DEVICE); hypre_TFree(d_xp4, HYPRE_MEMORY_DEVICE); #if defined(HYPRE_USING_KOKKOS) Kokkos::finalize (); #endif HYPRE_Finalize(); /* Finalize MPI */ hypre_MPI_Finalize(); return (0); } hypre-2.33.0/src/utilities/000077500000000000000000000000001477326011500155365ustar00rootroot00000000000000hypre-2.33.0/src/utilities/CMakeLists.txt000066400000000000000000000025301477326011500202760ustar00rootroot00000000000000# Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) set(HDRS HYPRE_utilities.h _hypre_utilities.h _hypre_utilities.hpp HYPRE_error_f.h fortran.h fortran_matrix.h ) set(SRCS HYPRE_handle.c HYPRE_version.c amg_linklist.c binsearch.c exchange_data.c F90_HYPRE_error.c F90_HYPRE_general.c fortran_matrix.c ap.c log.c complex.c device_utils.c error.c general.c handle.c int_array.c int_array_device.c hopscotch_hash.c matrix_stats.c magma.c memory.c memory_tracker.c merge_sort.c mmio.c mpi_comm_f2c.c nvtx.c omp_device.c prefix_sum.c printf.c qsort.c utilities.c mpistubs.c qsplit.c random.c state.c stl_ops.c threading.c timer.c timing.c ) target_sources(${PROJECT_NAME} PRIVATE ${SRCS} ${HDRS} ) if (HYPRE_USING_GPU) set(GPU_SRCS device_utils.c general.c handle.c int_array_device.c memory.c memory_tracker.c nvtx.c omp_device.c stl_ops.c HYPRE_handle.c ) convert_filenames_to_full_paths(GPU_SRCS) set(HYPRE_GPU_SOURCES ${HYPRE_GPU_SOURCES} ${GPU_SRCS} PARENT_SCOPE) endif () convert_filenames_to_full_paths(HDRS) set(HYPRE_HEADERS ${HYPRE_HEADERS} ${HDRS} PARENT_SCOPE) hypre-2.33.0/src/utilities/F90_HYPRE_error.c000066400000000000000000000025511477326011500204230ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "_hypre_utilities.h" #include "fortran.h" #ifdef __cplusplus extern "C" { #endif void hypre_F90_IFACE(hypre_geterror, HYPRE_GETERROR) (hypre_F90_Int *result) { *result = (hypre_F90_Int) HYPRE_GetError(); } void hypre_F90_IFACE(hypre_checkerror, HYPRE_CHECKERROR) (hypre_F90_Int *ierr, hypre_F90_Int *hypre_error_code, hypre_F90_Int *result) { *result = (hypre_F90_Int) HYPRE_CheckError( hypre_F90_PassInt(ierr), hypre_F90_PassInt(hypre_error_code)); } void hypre_F90_IFACE(hypre_geterrorarg, HYPRE_GETERRORARG) (hypre_F90_Int *result) { *result = (hypre_F90_Int) HYPRE_GetErrorArg(); } void hypre_F90_IFACE(hypre_clearallerrors, HYPRE_CLEARALLERRORS) (hypre_F90_Int *result) { *result = HYPRE_ClearAllErrors(); } void hypre_F90_IFACE(hypre_clearerror, HYPRE_CLEARERROR) (hypre_F90_Int *hypre_error_code, hypre_F90_Int *result) { *result = (hypre_F90_Int) HYPRE_ClearError( hypre_F90_PassInt(hypre_error_code)); } #ifdef __cplusplus } #endif hypre-2.33.0/src/utilities/F90_HYPRE_general.c000066400000000000000000000030401477326011500207010ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "_hypre_utilities.h" #include "fortran.h" #ifdef __cplusplus extern "C" { #endif void hypre_F90_IFACE(hypre_init, HYPRE_INIT) (hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) HYPRE_Initialize(); } void hypre_F90_IFACE(hypre_initialize, HYPRE_INITIALIZE) (hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) HYPRE_Initialize(); } void hypre_F90_IFACE(hypre_finalize, HYPRE_FINALIZE) (hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) HYPRE_Finalize(); } void hypre_F90_IFACE(hypre_setmemorylocation, HYPRE_SETMEMORYLOCATION) (hypre_F90_Int *memory_location, hypre_F90_Int *ierr) { HYPRE_MemoryLocation loc = (HYPRE_MemoryLocation) * memory_location; *ierr = (hypre_F90_Int) HYPRE_SetMemoryLocation(loc); } void hypre_F90_IFACE(hypre_setexecutionpolicy, HYPRE_SETEXECUTIONPOLICY) (hypre_F90_Int *exec_policy, hypre_F90_Int *ierr) { HYPRE_ExecutionPolicy exec = (HYPRE_ExecutionPolicy) * exec_policy; *ierr = (hypre_F90_Int) HYPRE_SetExecutionPolicy(exec); } void hypre_F90_IFACE(hypre_setspgemmusevendor, HYPRE_SETSPGEMMUSEVENDOR) (hypre_F90_Int *use_vendor, hypre_F90_Int *ierr) { *ierr = (hypre_F90_Int) HYPRE_SetSpGemmUseVendor(*use_vendor); } #ifdef __cplusplus } #endif hypre-2.33.0/src/utilities/HYPRE_error_f.h000066400000000000000000000007741477326011500203240ustar00rootroot00000000000000! Copyright (c) 1998 Lawrence Livermore National Security, LLC and other ! HYPRE Project Developers. See the top-level COPYRIGHT file for details. ! ! SPDX-License-Identifier: (Apache-2.0 OR MIT) integer HYPRE_ERROR_GENERIC integer HYPRE_ERROR_MEMORY integer HYPRE_ERROR_ARG integer HYPRE_ERROR_CONV parameter (HYPRE_ERROR_GENERIC = 1) parameter (HYPRE_ERROR_MEMORY = 2) parameter (HYPRE_ERROR_ARG = 4) parameter (HYPRE_ERROR_CONV = 256) hypre-2.33.0/src/utilities/HYPRE_handle.c000066400000000000000000000044441477326011500201120ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * HYPRE_handle utility functions * *****************************************************************************/ #include "_hypre_utilities.h" /*-------------------------------------------------------------------------- * HYPRE_SetLogLevel *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_SetLogLevel( HYPRE_Int log_level ) { return hypre_SetLogLevel(log_level); } /*-------------------------------------------------------------------------- * HYPRE_SetSpTransUseVendor *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_SetSpTransUseVendor( HYPRE_Int use_vendor ) { return hypre_SetSpTransUseVendor(use_vendor); } /*-------------------------------------------------------------------------- * HYPRE_SetSpMVUseVendor *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_SetSpMVUseVendor( HYPRE_Int use_vendor ) { return hypre_SetSpMVUseVendor(use_vendor); } /*-------------------------------------------------------------------------- * HYPRE_SetSpGemmUseVendor *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_SetSpGemmUseVendor( HYPRE_Int use_vendor ) { return hypre_SetSpGemmUseVendor(use_vendor); } /*-------------------------------------------------------------------------- * HYPRE_SetUseGpuRand *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_SetUseGpuRand( HYPRE_Int use_gpu_rand ) { return hypre_SetUseGpuRand(use_gpu_rand); } /*-------------------------------------------------------------------------- * HYPRE_SetGPUAwareMPI *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_SetGpuAwareMPI( HYPRE_Int use_gpu_aware_mpi ) { return hypre_SetGpuAwareMPI(use_gpu_aware_mpi); } hypre-2.33.0/src/utilities/HYPRE_utilities.h000066400000000000000000000500631477326011500206750ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * Header file for HYPRE_utilities library * *****************************************************************************/ #ifndef HYPRE_UTILITIES_HEADER #define HYPRE_UTILITIES_HEADER #include #ifndef HYPRE_SEQUENTIAL #include "mpi.h" #endif #ifdef HYPRE_USING_OPENMP #include #endif #ifdef __cplusplus extern "C" { #endif /*-------------------------------------------------------------------------- * Big int stuff *--------------------------------------------------------------------------*/ #if defined(HYPRE_BIGINT) typedef long long int HYPRE_BigInt; typedef long long int HYPRE_Int; #define HYPRE_BIG_INT_MAX LLONG_MAX #define HYPRE_BIG_INT_MIN LLONG_MIN #define HYPRE_INT_MAX LLONG_MAX #define HYPRE_INT_MIN LLONG_MIN #define HYPRE_MPI_BIG_INT MPI_LONG_LONG_INT #define HYPRE_MPI_INT MPI_LONG_LONG_INT #elif defined(HYPRE_MIXEDINT) typedef long long int HYPRE_BigInt; typedef int HYPRE_Int; #define HYPRE_BIG_INT_MAX LLONG_MAX #define HYPRE_BIG_INT_MIN LLONG_MIN #define HYPRE_INT_MAX INT_MAX #define HYPRE_INT_MIN INT_MIN #define HYPRE_MPI_BIG_INT MPI_LONG_LONG_INT #define HYPRE_MPI_INT MPI_INT #else /* default */ typedef int HYPRE_BigInt; typedef int HYPRE_Int; #define HYPRE_BIG_INT_MAX INT_MAX #define HYPRE_BIG_INT_MIN INT_MIN #define HYPRE_INT_MAX INT_MAX #define HYPRE_INT_MIN INT_MIN #define HYPRE_MPI_BIG_INT MPI_INT #define HYPRE_MPI_INT MPI_INT #endif /*-------------------------------------------------------------------------- * Real and Complex types *--------------------------------------------------------------------------*/ #include #if defined(HYPRE_SINGLE) typedef float HYPRE_Real; #define HYPRE_REAL_MAX FLT_MAX #define HYPRE_REAL_MIN FLT_MIN #if defined(FLT_TRUE_MIN) #define HYPRE_REAL_TRUE_MIN FLT_TRUE_MIN #else #define HYPRE_REAL_TRUE_MIN FLT_MIN #endif #define HYPRE_REAL_EPSILON FLT_EPSILON #define HYPRE_REAL_MIN_EXP FLT_MIN_EXP #define HYPRE_MPI_REAL MPI_FLOAT #elif defined(HYPRE_LONG_DOUBLE) typedef long double HYPRE_Real; #define HYPRE_REAL_MAX LDBL_MAX #define HYPRE_REAL_MIN LDBL_MIN #if defined(LDBL_TRUE_MIN) #define HYPRE_REAL_TRUE_MIN LDBL_TRUE_MIN #else #define HYPRE_REAL_TRUE_MIN LDBL_MIN #endif #define HYPRE_REAL_EPSILON LDBL_EPSILON #define HYPRE_REAL_MIN_EXP DBL_MIN_EXP #define HYPRE_MPI_REAL MPI_LONG_DOUBLE #else /* default */ typedef double HYPRE_Real; #define HYPRE_REAL_MAX DBL_MAX #define HYPRE_REAL_MIN DBL_MIN #if defined(DBL_TRUE_MIN) #define HYPRE_REAL_TRUE_MIN DBL_TRUE_MIN #else #define HYPRE_REAL_TRUE_MIN DBL_MIN #endif #define HYPRE_REAL_EPSILON DBL_EPSILON #define HYPRE_REAL_MIN_EXP DBL_MIN_EXP #define HYPRE_MPI_REAL MPI_DOUBLE #endif #if defined(HYPRE_COMPLEX) /* support for float double and long double complex types */ #if defined(HYPRE_SINGLE) typedef float _Complex HYPRE_Complex; #define HYPRE_MPI_COMPLEX MPI_C_FLOAT_COMPLEX #elif defined(HYPRE_LONG_DOUBLE) typedef long double _Complex HYPRE_Complex; #define HYPRE_MPI_COMPLEX MPI_C_LONG_DOUBLE_COMPLEX #else /* default */ typedef double _Complex HYPRE_Complex; #define HYPRE_MPI_COMPLEX MPI_C_DOUBLE_COMPLEX /* or MPI_LONG_DOUBLE ? */ #endif #else /* default */ typedef HYPRE_Real HYPRE_Complex; #define HYPRE_MPI_COMPLEX HYPRE_MPI_REAL #endif /*-------------------------------------------------------------------------- * Sequential MPI stuff *--------------------------------------------------------------------------*/ #ifdef HYPRE_SEQUENTIAL typedef HYPRE_Int MPI_Comm; #endif /*-------------------------------------------------------------------------- * HYPRE error codes *--------------------------------------------------------------------------*/ #define HYPRE_ERROR_GENERIC 1 /* generic error */ #define HYPRE_ERROR_MEMORY 2 /* unable to allocate memory */ #define HYPRE_ERROR_ARG 4 /* argument error */ /* bits 4-8 are reserved for the index of the argument error */ #define HYPRE_ERROR_CONV 256 /* method did not converge as expected */ #define HYPRE_MAX_FILE_NAME_LEN 1024 /* longest filename length used in hypre */ #define HYPRE_MAX_MSG_LEN 2048 /* longest message length */ /*-------------------------------------------------------------------------- * HYPRE init/finalize *--------------------------------------------------------------------------*/ /** * (Required) Initializes the hypre library. **/ HYPRE_Int HYPRE_Initialize(void); /** * (Required) Initializes the hypre library. This function is provided for backward compatibility. * Please, use HYPRE_Initialize instead. **/ #define HYPRE_Init() HYPRE_Initialize() /** * (Optional) Initializes GPU features in the hypre library. **/ HYPRE_Int HYPRE_DeviceInitialize(void); /** * (Required) Finalizes the hypre library. **/ HYPRE_Int HYPRE_Finalize(void); /** * (Optional) Returns true if the hypre library has been initialized but not finalized yet. **/ HYPRE_Int HYPRE_Initialized(void); /** * (Optional) Returns true if the hypre library has been finalized but not re-initialized yet. **/ HYPRE_Int HYPRE_Finalized(void); /*-------------------------------------------------------------------------- * HYPRE error user functions *--------------------------------------------------------------------------*/ /* Return an aggregate error code representing the collective status of all ranks */ HYPRE_Int HYPRE_GetGlobalError(MPI_Comm comm); /* Return the current hypre error flag */ HYPRE_Int HYPRE_GetError(void); /* Check if the given error flag contains the given error code */ HYPRE_Int HYPRE_CheckError(HYPRE_Int hypre_ierr, HYPRE_Int hypre_error_code); /* Return the index of the argument (counting from 1) where argument error (HYPRE_ERROR_ARG) has occured */ HYPRE_Int HYPRE_GetErrorArg(void); /* Describe the given error flag in the given string */ void HYPRE_DescribeError(HYPRE_Int hypre_ierr, char *descr); /* Clears the hypre error flag */ HYPRE_Int HYPRE_ClearAllErrors(void); /* Clears the given error code from the hypre error flag */ HYPRE_Int HYPRE_ClearError(HYPRE_Int hypre_error_code); /* Set behavior for printing errors: mode 0 = stderr, mode 1 = memory buffer */ HYPRE_Int HYPRE_SetPrintErrorMode(HYPRE_Int mode); /* Set which error code messages to record for printing: code is an error code * such as HYPRE_ERROR_CONV, code -1 = all codes, verbosity 0 = do not record */ HYPRE_Int HYPRE_SetPrintErrorVerbosity(HYPRE_Int code, HYPRE_Int verbosity); /* Return a buffer of error messages and clear them in hypre */ HYPRE_Int HYPRE_GetErrorMessages(char **buffer, HYPRE_Int *bufsz); /* Print the error messages and clear them in hypre */ HYPRE_Int HYPRE_PrintErrorMessages(MPI_Comm comm); /* Clear the error messages in hypre and free any related memory allocated */ HYPRE_Int HYPRE_ClearErrorMessages(void); /* Print GPU information */ HYPRE_Int HYPRE_PrintDeviceInfo(void); /** * @brief Prints the memory usage of the current process. * * This function prints the memory usage details of the process to standard output. * It provides information such as the virtual memory size, resident set size, * and other related statistics including GPU memory usage for device builds. * * @param[in] comm The MPI communicator. This parameter allows the function * to print memory usage information for the process within * the context of an MPI program. * * @param[in] level The level of detail in the memory statistics output. * - 1 : Display memory usage statistics for each MPI rank. * - 2 : Display aggregate memory usage statistics over MPI ranks. * * @param[in] function The name of the function from which `HYPRE_MemoryPrintUsage` * is called. This is typically set to `__func__`, which * automatically captures the name of the calling function. * This variable can also be used to denote a region name. * * @param[in] line The line number in the source file where `HYPRE_MemoryPrintUsage` * is called. This is typically set to `__LINE__`, which * automatically captures the line number. The line number can be * omitted by passing a negative value to this variable. * * @return Returns an integer status code. `0` indicates success, while * a non-zero value indicates an error occurred. * * @note The function is designed to be platform-independent but * may provide different levels of detail depending on the * underlying operating system (e.g., Linux, macOS). However, * this function does not lead to correct memory usage statistics * on Windows platforms. */ HYPRE_Int HYPRE_MemoryPrintUsage(MPI_Comm comm, HYPRE_Int level, const char *function, HYPRE_Int line); /*-------------------------------------------------------------------------- * HYPRE Version routines *--------------------------------------------------------------------------*/ /* RDF: This macro is used by the FEI code. Want to eventually remove. */ #define HYPRE_VERSION "HYPRE_RELEASE_NAME Date Compiled: " __DATE__ " " __TIME__ /** * Allocates and returns a string with version number information in it. **/ HYPRE_Int HYPRE_Version( char **version_ptr ); /** * Returns version number information in integer form. Use 'NULL' for values * not needed. The argument {\tt single} is a single sortable integer * representation of the release number. **/ HYPRE_Int HYPRE_VersionNumber( HYPRE_Int *major_ptr, HYPRE_Int *minor_ptr, HYPRE_Int *patch_ptr, HYPRE_Int *single_ptr ); /*-------------------------------------------------------------------------- * HYPRE AP user functions *--------------------------------------------------------------------------*/ /* Checks whether the AP is on */ /* TODO (VPM): this function is provided for backwards compatibility and will be removed in a future release */ HYPRE_Int HYPRE_AssumedPartitionCheck(void); /*-------------------------------------------------------------------------- * HYPRE memory location *--------------------------------------------------------------------------*/ typedef enum _HYPRE_MemoryLocation { HYPRE_MEMORY_UNDEFINED = -1, HYPRE_MEMORY_HOST, HYPRE_MEMORY_DEVICE } HYPRE_MemoryLocation; /** * (Optional) Sets the default (abstract) memory location. **/ HYPRE_Int HYPRE_SetMemoryLocation(HYPRE_MemoryLocation memory_location); /** * (Optional) Gets a pointer to the default (abstract) memory location. **/ HYPRE_Int HYPRE_GetMemoryLocation(HYPRE_MemoryLocation *memory_location); #include /*-------------------------------------------------------------------------- * HYPRE execution policy *--------------------------------------------------------------------------*/ typedef enum _HYPRE_ExecutionPolicy { HYPRE_EXEC_UNDEFINED = -1, HYPRE_EXEC_HOST, HYPRE_EXEC_DEVICE } HYPRE_ExecutionPolicy; /** * (Optional) Sets the default execution policy. **/ HYPRE_Int HYPRE_SetExecutionPolicy(HYPRE_ExecutionPolicy exec_policy); /** * (Optional) Gets a pointer to the default execution policy. **/ HYPRE_Int HYPRE_GetExecutionPolicy(HYPRE_ExecutionPolicy *exec_policy); /** * (Optional) Returns a string denoting the execution policy passed as input. **/ const char* HYPRE_GetExecutionPolicyName(HYPRE_ExecutionPolicy exec_policy); /*-------------------------------------------------------------------------- * HYPRE UMPIRE *--------------------------------------------------------------------------*/ /** * @brief Sets the size of the Umpire device memory pool. * * @param[in] nbytes The size of the device memory pool in bytes. * * @return Returns hypre's global error code, where 0 indicates success. **/ HYPRE_Int HYPRE_SetUmpireDevicePoolSize(size_t nbytes); /** * @brief Sets the size of the Umpire unified memory pool. * * @param[in] nbytes The size of the unified memory pool in bytes. * * @return Returns hypre's global error code, where 0 indicates success. **/ HYPRE_Int HYPRE_SetUmpireUMPoolSize(size_t nbytes); /** * @brief Sets the size of the Umpire host memory pool. * * @param[in] nbytes The size of the host memory pool in bytes. * * @return Returns hypre's global error code, where 0 indicates success. **/ HYPRE_Int HYPRE_SetUmpireHostPoolSize(size_t nbytes); /** * @brief Sets the size of the Umpire pinned memory pool. * * @param[in] nbytes The size of the pinned memory pool in bytes. * * @return Returns hypre's global error code, where 0 indicates success. **/ HYPRE_Int HYPRE_SetUmpirePinnedPoolSize(size_t nbytes); /** * @brief Sets the name of the Umpire device memory pool. * * @param[in] pool_name The name to assign to the device memory pool. * * @return Returns hypre's global error code, where 0 indicates success. **/ HYPRE_Int HYPRE_SetUmpireDevicePoolName(const char *pool_name); /** * @brief Sets the name of the Umpire unified memory pool. * * @param[in] pool_name The name to assign to the unified memory pool. * * @return Returns hypre's global error code, where 0 indicates success. **/ HYPRE_Int HYPRE_SetUmpireUMPoolName(const char *pool_name); /** * @brief Sets the name of the Umpire host memory pool. * * @param[in] pool_name The name to assign to the host memory pool. * * @return Returns hypre's global error code, where 0 indicates success. **/ HYPRE_Int HYPRE_SetUmpireHostPoolName(const char *pool_name); /** * @brief Sets the name of the Umpire pinned memory pool. * * @param[in] pool_name The name to assign to the pinned memory pool. * * @return Returns hypre's global error code, where 0 indicates success. **/ HYPRE_Int HYPRE_SetUmpirePinnedPoolName(const char *pool_name); /*-------------------------------------------------------------------------- * HYPRE GPU memory pool *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_SetGPUMemoryPoolSize(HYPRE_Int bin_growth, HYPRE_Int min_bin, HYPRE_Int max_bin, size_t max_cached_bytes); /*-------------------------------------------------------------------------- * HYPRE handle *--------------------------------------------------------------------------*/ /** * Sets the logging level for the HYPRE library. * * The following options are available for \e log_level: * * - 0 : (default) No messaging. * - 1 : Display memory usage statistics for each MPI rank. * - 2 : Display aggregate memory usage statistics over MPI ranks. * * @note Log level codes can be combined using bitwise OR to enable multiple * logging behaviors simultaneously. * * @param log_level The logging level to set. * * @return Returns hypre's global error code, where 0 indicates success. **/ HYPRE_Int HYPRE_SetLogLevel(HYPRE_Int log_level); /** * Specifies the algorithm used for sparse matrix transposition in device builds. * * The following options are available for \e use_vendor: * * - 0 : Use hypre's internal implementation. * - 1 : (default) Use the vendor library's implementation. This includes: * - cuSPARSE for CUDA (HYPRE_USING_CUSPARSE) * - rocSPARSE for HIP (HYPRE_USING_ROCSPARSE) * - oneMKL for SYCL (HYPRE_USING_ONEMKLSPARSE) * * @param use_vendor Indicates whether to use the internal or vendor-provided implementation. * * @return Returns hypre's global error code, where 0 indicates success. **/ HYPRE_Int HYPRE_SetSpTransUseVendor(HYPRE_Int use_vendor); /** * Specifies the algorithm used for sparse matrix/vector multiplication in device builds. * * The following options are available for \e use_vendor: * * - 0 : Use hypre's internal implementation. * - 1 : (default) Use the vendor library's implementation. This includes: * - cuSPARSE for CUDA (HYPRE_USING_CUSPARSE) * - rocSPARSE for HIP (HYPRE_USING_ROCSPARSE) * - oneMKL for SYCL (HYPRE_USING_ONEMKLSPARSE) * * @param use_vendor Indicates whether to use the internal or vendor-provided implementation. * * @return Returns hypre's global error code, where 0 indicates success. **/ HYPRE_Int HYPRE_SetSpMVUseVendor(HYPRE_Int use_vendor); /** * Specifies the algorithm used for sparse matrix/matrix multiplication in device builds. * * The following options are available for \e use_vendor: * * - 0 : Use hypre's internal implementation. * - 1 : Use the vendor library's implementation. This includes: * - cuSPARSE for CUDA (HYPRE_USING_CUSPARSE) * - rocSPARSE for HIP (HYPRE_USING_ROCSPARSE) * - oneMKL for SYCL (HYPRE_USING_ONEMKLSPARSE) * * @param use_vendor Indicates whether to use the internal or vendor-provided implementation. * * @note The default value is 1, except for CUDA builds, which is zero. * * @return Returns hypre's global error code, where 0 indicates success. **/ HYPRE_Int HYPRE_SetSpGemmUseVendor( HYPRE_Int use_vendor ); /* Backwards compatibility with HYPRE_SetSpGemmUseCusparse() */ #define HYPRE_SetSpGemmUseCusparse(use_vendor) HYPRE_SetSpGemmUseVendor(use_vendor) /** * Specifies the algorithm used for generating random numbers in device builds. * * The following options are available for \e use_curand: * * - 0 : random numbers are generated on the host and copied to device memory. * - 1 : (default) Use the vendor library's implementation. This includes: * - cuSPARSE for CUDA (HYPRE_USING_CUSPARSE) * - rocSPARSE for HIP (HYPRE_USING_ROCSPARSE) * - oneMKL for SYCL (HYPRE_USING_ONEMKLSPARSE) * * @param use_curand Indicates whether to use the vendor-provided implementation or not. * * @return Returns hypre's global error code, where 0 indicates success. **/ HYPRE_Int HYPRE_SetUseGpuRand( HYPRE_Int use_curand ); /** * Configures the usage of GPU-aware MPI for communication in device builds. * * The following options are available for \e use_gpu_aware_mpi: * * - 0 : MPI buffers are transferred between device and host memory. Communication occurs on the host. * - 1 : MPI communication is performed directly from the device using device-resident buffers. * * @param use_gpu_aware_mpi Specifies whether to enable GPU-aware MPI communication or not. * * @note This option requires hypre to be configured with GPU-aware MPI support for it to take effect. * * @return Returns hypre's global error code, where 0 indicates success. **/ HYPRE_Int HYPRE_SetGpuAwareMPI( HYPRE_Int use_gpu_aware_mpi ); /*-------------------------------------------------------------------------- * Base objects *--------------------------------------------------------------------------*/ /* RDF: How should we provide reference documentation for this (and above)? */ /* Base public solver struct */ struct hypre_Solver_struct; typedef struct hypre_Solver_struct *HYPRE_Solver; /* Base public matrix struct */ struct hypre_Matrix_struct; typedef struct hypre_Matrix_struct *HYPRE_Matrix; /* Base public vector struct */ struct hypre_Vector_struct; typedef struct hypre_Vector_struct *HYPRE_Vector; /* Base function pointers */ /* RDF: Note that only PtrToSolverFcn is needed at the user level right now to * keep backward compatibility with SetPrecond(). In general, do we want these * at the user level? I guess it doesn't hurt. */ /* RDF: Also note that PtrToSolverFcn is defined again in 'HYPRE_krylov.h' and * probably needs to be for the reference manual. */ typedef HYPRE_Int (*HYPRE_PtrToSolverFcn)(HYPRE_Solver, HYPRE_Matrix, HYPRE_Vector, HYPRE_Vector); typedef HYPRE_Int (*HYPRE_PtrToDestroyFcn)(HYPRE_Solver); #ifdef __cplusplus } #endif #endif hypre-2.33.0/src/utilities/HYPRE_version.c000066400000000000000000000042231477326011500203370ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * HYPRE_Version utility functions * *****************************************************************************/ #include "_hypre_utilities.h" /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_Version( char **version_ptr ) { HYPRE_Int len = 30; char *version; /* compute string length */ len += strlen(HYPRE_RELEASE_VERSION); version = hypre_CTAlloc(char, len, HYPRE_MEMORY_HOST); hypre_sprintf(version, "HYPRE Release Version %s", HYPRE_RELEASE_VERSION); *version_ptr = version; return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_VersionNumber( HYPRE_Int *major_ptr, HYPRE_Int *minor_ptr, HYPRE_Int *patch_ptr, HYPRE_Int *single_ptr ) { HYPRE_Int major, minor, patch, single; HYPRE_Int nums[3], i, j; char *ptr = (char *) HYPRE_RELEASE_VERSION; /* get major/minor/patch numbers */ for (i = 0; i < 3; i++) { char str[4]; for (j = 0; (j < 3) && (*ptr != '.') && (*ptr != '\0'); j++) { str[j] = *ptr; ptr++; } str[j] = '\0'; nums[i] = atoi((char *)str); ptr++; } major = nums[0]; minor = nums[1]; patch = nums[2]; single = (HYPRE_Int) HYPRE_RELEASE_NUMBER; if (major_ptr) {*major_ptr = major;} if (minor_ptr) {*minor_ptr = minor;} if (patch_ptr) {*patch_ptr = patch;} if (single_ptr) {*single_ptr = single;} return hypre_error_flag; } hypre-2.33.0/src/utilities/Makefile000066400000000000000000000052451477326011500172040ustar00rootroot00000000000000# Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) include ../config/Makefile.config CINCLUDES = ${INCLUDES} ${MPIINCLUDE} CDEFS = ${TIMERDEFS} C_COMPILE_FLAGS =\ -I..\ -I$(srcdir)/..\ -I$(srcdir)/../struct_mv\ -I$(srcdir)\ ${CINCLUDES}\ ${CDEFS} CXX_COMPILE_FLAGS = ${C_COMPILE_FLAGS} HEADERS =\ amg_linklist.h\ exchange_data.h\ fortran.h\ fortran_matrix.h\ general.h\ int_array.h\ memory.h\ memory_tracker.h\ HYPRE_utilities.h\ mpistubs.h\ threading.h\ timing.h\ magma.h\ _hypre_onedpl.hpp\ _hypre_utilities.h\ _hypre_utilities.hpp FILES =\ F90_HYPRE_error.c\ F90_HYPRE_general.c\ HYPRE_handle.c\ HYPRE_version.c\ amg_linklist.c\ binsearch.c\ exchange_data.c\ fortran_matrix.c\ ap.c\ log.c\ complex.c\ error.c\ int_array.c\ hopscotch_hash.c\ matrix_stats.c\ magma.c\ memory_tracker.c\ merge_sort.c\ mmio.c\ mpi_comm_f2c.c\ prefix_sum.c\ printf.c\ qsort.c\ utilities.c\ mpistubs.c\ qsplit.c\ random.c\ state.c\ threading.c\ timer.c\ timing.c CUFILES=\ device_utils.c\ general.c\ handle.c\ int_array_device.c\ memory.c\ omp_device.c\ nvtx.c\ stl_ops.c COBJS = ${FILES:.c=.o} CUOBJS = ${CUFILES:.c=.obj} OBJS = ${COBJS} ${CUOBJS} SONAME = libHYPRE_utilities-${HYPRE_RELEASE_VERSION}${HYPRE_LIB_SUFFIX} ################################################################## # Targets ################################################################## all: libHYPRE_utilities${HYPRE_LIB_SUFFIX} cp -fR $(srcdir)/HYPRE_*.h $(HYPRE_BUILD_DIR)/include cp -fR $(srcdir)/_hypre_onedpl.hpp $(HYPRE_BUILD_DIR)/include cp -fR $(srcdir)/_hypre_utilities.h $(HYPRE_BUILD_DIR)/include cp -fR $(srcdir)/_hypre_utilities.hpp $(HYPRE_BUILD_DIR)/include cp -fR $(srcdir)/fortran*.h $(HYPRE_BUILD_DIR)/include # cp -fR libHYPRE* $(HYPRE_BUILD_DIR)/lib install: libHYPRE_utilities${HYPRE_LIB_SUFFIX} cp -fR $(srcdir)/HYPRE_*.h $(HYPRE_INC_INSTALL) cp -fR $(srcdir)/_hypre_utilities.h $(HYPRE_INC_INSTALL) cp -fR $(srcdir)/fortran*.h $(HYPRE_INC_INSTALL) # cp -fR libHYPRE* $(HYPRE_LIB_INSTALL) clean: rm -f *.o *.obj libHYPRE* rm -rf pchdir tca.map *inslog* distclean: clean ################################################################## # Rules ################################################################## libHYPRE_utilities.a: ${OBJS} @echo "Building $@ ... " ${AR} $@ ${OBJS} ${RANLIB} $@ libHYPRE_utilities.so libHYPRE_utilities.dylib: ${OBJS} @echo "Building $@ ... " ${BUILD_CC_SHARED} -o ${SONAME} ${OBJS} ${SHARED_SET_SONAME}${SONAME} ln -s -f ${SONAME} $@ ${OBJS}: ${HEADERS} hypre-2.33.0/src/utilities/_hypre_onedpl.hpp000066400000000000000000000303771477326011500211100ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #ifndef HYPRE_ONEDPL_H #define HYPRE_ONEDPL_H #include "HYPRE_config.h" #if defined(HYPRE_USING_SYCL) /* oneAPI DPL headers */ /* NOTE: these must be included before standard C++ headers */ /* WM: this is a workaround for a bug in oneDPL reduce by segment */ #define ONEDPL_WORKAROUND_FOR_IGPU_64BIT_REDUCTION 1 #include #include #include #include #include #include "_hypre_utilities.h" #include "_hypre_utilities.hpp" /* WM: dpct below currently needed for constant iterators */ #include //[pred, op](Ref1 a, Ref2 s) { return pred(s) ? op(a) : a; }); template struct hypreSycl_transform_if_unary_zip_mask_fun { hypreSycl_transform_if_unary_zip_mask_fun(Predicate _pred, Operator _op) : pred(_pred), op(_op) {} template void operator()(_T&& t) const { using std::get; if (pred(get<1>(t))) { get<2>(t) = op(get<0>(t)); } } private: Predicate pred; Operator op; }; template Iter3 hypreSycl_transform_if(Iter1 first, Iter1 last, Iter2 mask, Iter3 result, UnaryOperation unary_op, Pred pred) { static_assert( std::is_same::iterator_category, std::random_access_iterator_tag>::value && std::is_same::iterator_category, std::random_access_iterator_tag>::value && std::is_same::iterator_category, std::random_access_iterator_tag>::value, "Iterators passed to algorithms must be random-access iterators."); using T = typename std::iterator_traits::value_type; const auto n = std::distance(first, last); auto begin_for_each = oneapi::dpl::make_zip_iterator(first, mask, result); HYPRE_ONEDPL_CALL( std::for_each, begin_for_each, begin_for_each + n, hypreSycl_transform_if_unary_zip_mask_fun(pred, unary_op) ); return result + n; } // Functor evaluates second element of tied sequence with predicate. // Used by: copy_if template struct hypreSycl_predicate_key_fun { hypreSycl_predicate_key_fun(Predicate _pred) : pred(_pred) {} template bool operator()(_T1 &&a) const { return pred(std::get<1>(a)); } private: Predicate pred; }; // Need custom version of copy_if when predicate operates on a mask // instead of the data being copied (natively suppored in thrust, but // not supported in oneDPL) template Iter3 hypreSycl_copy_if(Iter1 first, Iter1 last, Iter2 mask, Iter3 result, Pred pred) { static_assert( std::is_same::iterator_category, std::random_access_iterator_tag>::value && std::is_same::iterator_category, std::random_access_iterator_tag>::value && std::is_same::iterator_category, std::random_access_iterator_tag>::value, "Iterators passed to algorithms must be random-access iterators."); auto ret_val = HYPRE_ONEDPL_CALL( std::copy_if, oneapi::dpl::make_zip_iterator(first, mask), oneapi::dpl::make_zip_iterator(last, mask + std::distance(first, last)), oneapi::dpl::make_zip_iterator(result, oneapi::dpl::discard_iterator()), hypreSycl_predicate_key_fun(pred)); return std::get<0>(ret_val.base()); } // Similar to above, need mask version of remove_if // NOTE: We copy the mask below because this implementation also // remove elements from the mask in addition to the input. template Iter1 hypreSycl_remove_if(Iter1 first, Iter1 last, Iter2 mask, Pred pred) { static_assert( std::is_same::iterator_category, std::random_access_iterator_tag>::value && std::is_same::iterator_category, std::random_access_iterator_tag>::value, "Iterators passed to algorithms must be random-access iterators."); using ValueType = typename std::iterator_traits::value_type; Iter2 mask_cpy = hypre_CTAlloc(ValueType, std::distance(first, last), HYPRE_MEMORY_DEVICE); hypre_TMemcpy(mask_cpy, mask, ValueType, std::distance(first, last), HYPRE_MEMORY_DEVICE, HYPRE_MEMORY_DEVICE); auto ret_val = HYPRE_ONEDPL_CALL( std::remove_if, oneapi::dpl::make_zip_iterator(first, mask_cpy), oneapi::dpl::make_zip_iterator(last, mask_cpy + std::distance(first, last)), hypreSycl_predicate_key_fun(pred)); hypre_TFree(mask_cpy, HYPRE_MEMORY_DEVICE); return std::get<0>(ret_val.base()); } // Similar to above, need mask version of remove_copy_if template Iter3 hypreSycl_remove_copy_if(Iter1 first, Iter1 last, Iter2 mask, Iter3 result, Pred pred) { static_assert( std::is_same::iterator_category, std::random_access_iterator_tag>::value && std::is_same::iterator_category, std::random_access_iterator_tag>::value, "Iterators passed to algorithms must be random-access iterators."); auto ret_val = HYPRE_ONEDPL_CALL( std::remove_copy_if, oneapi::dpl::make_zip_iterator(first, mask), oneapi::dpl::make_zip_iterator(last, mask + std::distance(first, last)), oneapi::dpl::make_zip_iterator(result, oneapi::dpl::discard_iterator()), hypreSycl_predicate_key_fun(pred)); return std::get<0>(ret_val.base()); } // Equivalent of thrust::scatter_if template void hypreSycl_scatter_if(InputIter1 first, InputIter1 last, InputIter2 map, InputIter3 mask, OutputIter result, Predicate pred) { static_assert( std::is_same::iterator_category, std::random_access_iterator_tag>::value && std::is_same < typename std::iterator_traits::iterator_category, std::random_access_iterator_tag >::value && std::is_same < typename std::iterator_traits::iterator_category, std::random_access_iterator_tag >::value && std::is_same < typename std::iterator_traits::iterator_category, std::random_access_iterator_tag >::value, "Iterators passed to algorithms must be random-access iterators."); hypreSycl_transform_if(first, last, mask, oneapi::dpl::make_permutation_iterator(result, map), [ = ](auto &&v) { return v; }, [ = ](auto &&m) { return pred(m); }); } // Equivalent of thrust::scatter template void hypreSycl_scatter(InputIter1 first, InputIter1 last, InputIter2 map, OutputIter result) { static_assert( std::is_same::iterator_category, std::random_access_iterator_tag>::value && std::is_same < typename std::iterator_traits::iterator_category, std::random_access_iterator_tag >::value && std::is_same < typename std::iterator_traits::iterator_category, std::random_access_iterator_tag >::value, "Iterators passed to algorithms must be random-access iterators."); auto perm_result = oneapi::dpl::make_permutation_iterator(result, map); HYPRE_ONEDPL_CALL( oneapi::dpl::copy, first, last, perm_result); } // Equivalent of thrust::gather_if template void hypreSycl_gather_if(InputIter1 map_first, InputIter1 map_last, InputIter2 mask, InputIter3 input_first, OutputIter result, Predicate pred) { static_assert( std::is_same::iterator_category, std::random_access_iterator_tag>::value && std::is_same < typename std::iterator_traits::iterator_category, std::random_access_iterator_tag >::value && std::is_same < typename std::iterator_traits::iterator_category, std::random_access_iterator_tag >::value && std::is_same < typename std::iterator_traits::iterator_category, std::random_access_iterator_tag >::value, "Iterators passed to algorithms must be random-access iterators."); auto perm_begin = oneapi::dpl::make_permutation_iterator(input_first, map_first); const auto n = std::distance(map_first, map_last); hypreSycl_copy_if(perm_begin, perm_begin + n, mask, result, [ = ](auto &&m) { return pred(m); } ); } // Equivalent of thrust::gather template OutputIter hypreSycl_gather(InputIter1 map_first, InputIter1 map_last, InputIter2 input_first, OutputIter result) { static_assert( std::is_same::iterator_category, std::random_access_iterator_tag>::value && std::is_same < typename std::iterator_traits::iterator_category, std::random_access_iterator_tag >::value && std::is_same < typename std::iterator_traits::iterator_category, std::random_access_iterator_tag >::value, "Iterators passed to algorithms must be random-access iterators."); auto perm_begin = oneapi::dpl::make_permutation_iterator(input_first, map_first); const auto n = std::distance(map_first, map_last); return HYPRE_ONEDPL_CALL( oneapi::dpl::copy, perm_begin, perm_begin + n, result); } // Equivalent of thrust::sequence (with step=1) template void hypreSycl_sequence(Iter first, Iter last, T init = 0) { static_assert( std::is_same::iterator_category, std::random_access_iterator_tag>::value, "Iterators passed to algorithms must be random-access iterators."); using DiffType = typename std::iterator_traits::difference_type; HYPRE_ONEDPL_CALL( std::transform, oneapi::dpl::counting_iterator(init), oneapi::dpl::counting_iterator(init + std::distance(first, last)), first, [](auto i) { return i; }); } // Equivalent of thrust::stable_sort_by_key template void hypreSycl_stable_sort_by_key(Iter1 keys_first, Iter1 keys_last, Iter2 values_first) { static_assert( std::is_same::iterator_category, std::random_access_iterator_tag>::value && std::is_same::iterator_category, std::random_access_iterator_tag>::value, "Iterators passed to algorithms must be random-access iterators."); const auto n = std::distance(keys_first, keys_last); auto zipped_begin = oneapi::dpl::make_zip_iterator(keys_first, values_first); HYPRE_ONEDPL_CALL( std::stable_sort, zipped_begin, zipped_begin + n, [](auto lhs, auto rhs) { return std::get<0>(lhs) < std::get<0>(rhs); } ); } #endif #endif hypre-2.33.0/src/utilities/_hypre_utilities.h000066400000000000000000004656201477326011500213050ustar00rootroot00000000000000 /*** DO NOT EDIT THIS FILE DIRECTLY (use 'headers' to generate) ***/ #ifndef hypre_UTILITIES_HEADER #define hypre_UTILITIES_HEADER #include "HYPRE_utilities.h" #ifdef HYPRE_USING_OPENMP #include #endif #ifdef __cplusplus extern "C" { #endif /****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * General structures and values * *****************************************************************************/ #ifndef HYPRE_HANDLE_H #define HYPRE_HANDLE_H #if defined(HYPRE_USING_UMPIRE) #include "umpire/config.hpp" #if UMPIRE_VERSION_MAJOR >= 2022 #include "umpire/interface/c_fortran/umpire.h" #define hypre_umpire_resourcemanager_make_allocator_pool umpire_resourcemanager_make_allocator_quick_pool #else #include "umpire/interface/umpire.h" #define hypre_umpire_resourcemanager_make_allocator_pool umpire_resourcemanager_make_allocator_pool #endif /* UMPIRE_VERSION_MAJOR >= 2022 */ #define HYPRE_UMPIRE_POOL_NAME_MAX_LEN 1024 #endif /* defined(HYPRE_USING_UMPIRE) */ struct hypre_DeviceData; typedef struct hypre_DeviceData hypre_DeviceData; typedef void (*GPUMallocFunc)(void **, size_t); typedef void (*GPUMfreeFunc)(void *); typedef struct { HYPRE_Int log_level; HYPRE_Int hypre_error; HYPRE_MemoryLocation memory_location; HYPRE_ExecutionPolicy default_exec_policy; /* the device buffers needed to do MPI communication for struct comm */ HYPRE_Complex *struct_comm_recv_buffer; HYPRE_Complex *struct_comm_send_buffer; HYPRE_Int struct_comm_recv_buffer_size; HYPRE_Int struct_comm_send_buffer_size; /* GPU MPI */ #if defined(HYPRE_USING_GPU) || defined(HYPRE_USING_DEVICE_OPENMP) HYPRE_Int use_gpu_aware_mpi; #endif #if defined(HYPRE_USING_GPU) hypre_DeviceData *device_data; HYPRE_Int device_gs_method; /* device G-S options */ #endif /* user malloc/free function pointers */ GPUMallocFunc user_device_malloc; GPUMfreeFunc user_device_free; #if defined(HYPRE_USING_UMPIRE) char umpire_device_pool_name[HYPRE_UMPIRE_POOL_NAME_MAX_LEN]; char umpire_um_pool_name[HYPRE_UMPIRE_POOL_NAME_MAX_LEN]; char umpire_host_pool_name[HYPRE_UMPIRE_POOL_NAME_MAX_LEN]; char umpire_pinned_pool_name[HYPRE_UMPIRE_POOL_NAME_MAX_LEN]; size_t umpire_device_pool_size; size_t umpire_um_pool_size; size_t umpire_host_pool_size; size_t umpire_pinned_pool_size; size_t umpire_block_size; HYPRE_Int own_umpire_device_pool; HYPRE_Int own_umpire_um_pool; HYPRE_Int own_umpire_host_pool; HYPRE_Int own_umpire_pinned_pool; umpire_resourcemanager umpire_rm; #endif #if defined(HYPRE_USING_MAGMA) magma_queue_t magma_queue; #endif } hypre_Handle; /* accessor macros to hypre_Handle */ #define hypre_HandleLogLevel(hypre_handle) ((hypre_handle) -> log_level) #define hypre_HandleMemoryLocation(hypre_handle) ((hypre_handle) -> memory_location) #define hypre_HandleDefaultExecPolicy(hypre_handle) ((hypre_handle) -> default_exec_policy) #define hypre_HandleStructCommRecvBuffer(hypre_handle) ((hypre_handle) -> struct_comm_recv_buffer) #define hypre_HandleStructCommSendBuffer(hypre_handle) ((hypre_handle) -> struct_comm_send_buffer) #define hypre_HandleStructCommRecvBufferSize(hypre_handle) ((hypre_handle) -> struct_comm_recv_buffer_size) #define hypre_HandleStructCommSendBufferSize(hypre_handle) ((hypre_handle) -> struct_comm_send_buffer_size) #define hypre_HandleDeviceData(hypre_handle) ((hypre_handle) -> device_data) #define hypre_HandleDeviceGSMethod(hypre_handle) ((hypre_handle) -> device_gs_method) #define hypre_HandleUseGpuAwareMPI(hypre_handle) ((hypre_handle) -> use_gpu_aware_mpi) #define hypre_HandleCurandGenerator(hypre_handle) hypre_DeviceDataCurandGenerator(hypre_HandleDeviceData(hypre_handle)) #define hypre_HandleCublasHandle(hypre_handle) hypre_DeviceDataCublasHandle(hypre_HandleDeviceData(hypre_handle)) #define hypre_HandleCusparseHandle(hypre_handle) hypre_DeviceDataCusparseHandle(hypre_HandleDeviceData(hypre_handle)) #define hypre_HandleVendorSolverHandle(hypre_handle) hypre_DeviceDataVendorSolverHandle(hypre_HandleDeviceData(hypre_handle)) #define hypre_HandleComputeStream(hypre_handle) hypre_DeviceDataComputeStream(hypre_HandleDeviceData(hypre_handle)) #define hypre_HandleCubBinGrowth(hypre_handle) hypre_DeviceDataCubBinGrowth(hypre_HandleDeviceData(hypre_handle)) #define hypre_HandleCubMinBin(hypre_handle) hypre_DeviceDataCubMinBin(hypre_HandleDeviceData(hypre_handle)) #define hypre_HandleCubMaxBin(hypre_handle) hypre_DeviceDataCubMaxBin(hypre_HandleDeviceData(hypre_handle)) #define hypre_HandleCubMaxCachedBytes(hypre_handle) hypre_DeviceDataCubMaxCachedBytes(hypre_HandleDeviceData(hypre_handle)) #define hypre_HandleCubDevAllocator(hypre_handle) hypre_DeviceDataCubDevAllocator(hypre_HandleDeviceData(hypre_handle)) #define hypre_HandleCubUvmAllocator(hypre_handle) hypre_DeviceDataCubUvmAllocator(hypre_HandleDeviceData(hypre_handle)) #define hypre_HandleDevice(hypre_handle) hypre_DeviceDataDevice(hypre_HandleDeviceData(hypre_handle)) #define hypre_HandleDeviceMaxWorkGroupSize(hypre_handle) hypre_DeviceDataDeviceMaxWorkGroupSize(hypre_HandleDeviceData(hypre_handle)) #define hypre_HandleDeviceMaxShmemPerBlock(hypre_handle) hypre_DeviceDataDeviceMaxShmemPerBlock(hypre_HandleDeviceData(hypre_handle)) #define hypre_HandleDeviceMaxShmemPerBlockInited(hypre_handle) hypre_DeviceDataDeviceMaxShmemPerBlockInited(hypre_HandleDeviceData(hypre_handle)) #define hypre_HandleComputeStreamNum(hypre_handle) hypre_DeviceDataComputeStreamNum(hypre_HandleDeviceData(hypre_handle)) #define hypre_HandleReduceBuffer(hypre_handle) hypre_DeviceDataReduceBuffer(hypre_HandleDeviceData(hypre_handle)) #define hypre_HandleSpgemmUseVendor(hypre_handle) hypre_DeviceDataSpgemmUseVendor(hypre_HandleDeviceData(hypre_handle)) #define hypre_HandleSpMVUseVendor(hypre_handle) hypre_DeviceDataSpMVUseVendor(hypre_HandleDeviceData(hypre_handle)) #define hypre_HandleSpTransUseVendor(hypre_handle) hypre_DeviceDataSpTransUseVendor(hypre_HandleDeviceData(hypre_handle)) #define hypre_HandleSpgemmAlgorithm(hypre_handle) hypre_DeviceDataSpgemmAlgorithm(hypre_HandleDeviceData(hypre_handle)) #define hypre_HandleSpgemmBinned(hypre_handle) hypre_DeviceDataSpgemmBinned(hypre_HandleDeviceData(hypre_handle)) #define hypre_HandleSpgemmNumBin(hypre_handle) hypre_DeviceDataSpgemmNumBin(hypre_HandleDeviceData(hypre_handle)) #define hypre_HandleSpgemmHighestBin(hypre_handle) hypre_DeviceDataSpgemmHighestBin(hypre_HandleDeviceData(hypre_handle)) #define hypre_HandleSpgemmBlockNumDim(hypre_handle) hypre_DeviceDataSpgemmBlockNumDim(hypre_HandleDeviceData(hypre_handle)) #define hypre_HandleSpgemmRownnzEstimateMethod(hypre_handle) hypre_DeviceDataSpgemmRownnzEstimateMethod(hypre_HandleDeviceData(hypre_handle)) #define hypre_HandleSpgemmRownnzEstimateNsamples(hypre_handle) hypre_DeviceDataSpgemmRownnzEstimateNsamples(hypre_HandleDeviceData(hypre_handle)) #define hypre_HandleSpgemmRownnzEstimateMultFactor(hypre_handle) hypre_DeviceDataSpgemmRownnzEstimateMultFactor(hypre_HandleDeviceData(hypre_handle)) #define hypre_HandleDeviceAllocator(hypre_handle) hypre_DeviceDataDeviceAllocator(hypre_HandleDeviceData(hypre_handle)) #define hypre_HandleUseGpuRand(hypre_handle) hypre_DeviceDataUseGpuRand(hypre_HandleDeviceData(hypre_handle)) #define hypre_HandleUserDeviceMalloc(hypre_handle) ((hypre_handle) -> user_device_malloc) #define hypre_HandleUserDeviceMfree(hypre_handle) ((hypre_handle) -> user_device_free) #define hypre_HandleUmpireResourceMan(hypre_handle) ((hypre_handle) -> umpire_rm) #define hypre_HandleUmpireDevicePoolSize(hypre_handle) ((hypre_handle) -> umpire_device_pool_size) #define hypre_HandleUmpireUMPoolSize(hypre_handle) ((hypre_handle) -> umpire_um_pool_size) #define hypre_HandleUmpireHostPoolSize(hypre_handle) ((hypre_handle) -> umpire_host_pool_size) #define hypre_HandleUmpirePinnedPoolSize(hypre_handle) ((hypre_handle) -> umpire_pinned_pool_size) #define hypre_HandleUmpireBlockSize(hypre_handle) ((hypre_handle) -> umpire_block_size) #define hypre_HandleUmpireDevicePoolName(hypre_handle) ((hypre_handle) -> umpire_device_pool_name) #define hypre_HandleUmpireUMPoolName(hypre_handle) ((hypre_handle) -> umpire_um_pool_name) #define hypre_HandleUmpireHostPoolName(hypre_handle) ((hypre_handle) -> umpire_host_pool_name) #define hypre_HandleUmpirePinnedPoolName(hypre_handle) ((hypre_handle) -> umpire_pinned_pool_name) #define hypre_HandleOwnUmpireDevicePool(hypre_handle) ((hypre_handle) -> own_umpire_device_pool) #define hypre_HandleOwnUmpireUMPool(hypre_handle) ((hypre_handle) -> own_umpire_um_pool) #define hypre_HandleOwnUmpireHostPool(hypre_handle) ((hypre_handle) -> own_umpire_host_pool) #define hypre_HandleOwnUmpirePinnedPool(hypre_handle) ((hypre_handle) -> own_umpire_pinned_pool) #define hypre_HandleMagmaQueue(hypre_handle) ((hypre_handle) -> magma_queue) #endif /****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #ifndef hypre_STATE_HEADER #define hypre_STATE_HEADER /*-------------------------------------------------------------------------- * hypre library state *--------------------------------------------------------------------------*/ typedef enum hypre_State_enum { HYPRE_STATE_NONE = 0, HYPRE_STATE_INITIALIZED = 1, HYPRE_STATE_FINALIZED = 2 } hypre_State; extern hypre_State hypre__global_state; #endif /* hypre_STATE_HEADER */ /****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * General structures and values * *****************************************************************************/ #ifndef hypre_GENERAL_HEADER #define hypre_GENERAL_HEADER /* #include */ /* #include */ #include #include #include /*-------------------------------------------------------------------------- * typedefs *--------------------------------------------------------------------------*/ /* This allows us to consistently avoid 'int' throughout hypre */ typedef int hypre_int; typedef long int hypre_longint; typedef unsigned int hypre_uint; typedef unsigned long int hypre_ulongint; typedef unsigned long long int hypre_ulonglongint; typedef uint32_t hypre_uint32; typedef uint64_t hypre_uint64; /* This allows us to consistently avoid 'float' and 'double' throughout hypre */ typedef float hypre_float; typedef double hypre_double; /*-------------------------------------------------------------------------- * Define macros *--------------------------------------------------------------------------*/ /* Macro for silencing unused function warning */ #if defined(__GNUC__) || defined(__clang__) #define HYPRE_MAYBE_UNUSED_FUNC __attribute__((unused)) #elif defined(_MSC_VER) #define HYPRE_MAYBE_UNUSED_FUNC #else #define HYPRE_MAYBE_UNUSED_FUNC #endif /* Macro for silencing unused variable warning */ #define HYPRE_UNUSED_VAR(var) ((void) var) /* Macro for marking deprecated functions */ #define HYPRE_DEPRECATED(reason) _Pragma(reason) /*-------------------------------------------------------------------------- * Define various functions *--------------------------------------------------------------------------*/ #ifndef hypre_max #define hypre_max(a,b) (((a)<(b)) ? (b) : (a)) #endif #ifndef hypre_min #define hypre_min(a,b) (((a)<(b)) ? (a) : (b)) #endif #ifndef hypre_abs #define hypre_abs(a) (((a)>0) ? (a) : -(a)) #endif #ifndef hypre_round #define hypre_round(x) ( ((x) < 0.0) ? ((HYPRE_Int)(x - 0.5)) : ((HYPRE_Int)(x + 0.5)) ) #endif #ifndef hypre_pow2 #define hypre_pow2(i) ( 1 << (i) ) #endif #ifndef hypre_squared #define hypre_squared(i) ((i) * (i)) #endif #ifndef hypre_sqrt #if defined(HYPRE_SINGLE) #define hypre_sqrt sqrtf #elif defined(HYPRE_LONG_DOUBLE) #define hypre_sqrt sqrtl #else #define hypre_sqrt sqrt #endif #endif #ifndef hypre_pow #if defined(HYPRE_SINGLE) #define hypre_pow powf #elif defined(HYPRE_LONG_DOUBLE) #define hypre_pow powl #else #define hypre_pow pow #endif #endif /* Macro for ceiling division. It assumes non-negative dividend and positive divisor. The result of this macro might need to be casted to an integer type depending on the use case */ #ifndef hypre_ceildiv #define hypre_ceildiv(a, b) (((a) + (b) - 1) / (b)) #endif #ifndef hypre_ceil #if defined(HYPRE_SINGLE) #define hypre_ceil ceilf #elif defined(HYPRE_LONG_DOUBLE) #define hypre_ceil ceill #else #define hypre_ceil ceil #endif #endif #ifndef hypre_floor #if defined(HYPRE_SINGLE) #define hypre_floor floorf #elif defined(HYPRE_LONG_DOUBLE) #define hypre_floor floorl #else #define hypre_floor floor #endif #endif #ifndef hypre_log #if defined(HYPRE_SINGLE) #define hypre_log logf #elif defined(HYPRE_LONG_DOUBLE) #define hypre_log logl #else #define hypre_log log #endif #endif #ifndef hypre_exp #if defined(HYPRE_SINGLE) #define hypre_exp expf #elif defined(HYPRE_LONG_DOUBLE) #define hypre_exp expl #else #define hypre_exp exp #endif #endif #ifndef hypre_sin #if defined(HYPRE_SINGLE) #define hypre_sin sinf #elif defined(HYPRE_LONG_DOUBLE) #define hypre_sin sinl #else #define hypre_sin sin #endif #endif #ifndef hypre_cos #if defined(HYPRE_SINGLE) #define hypre_cos cosf #elif defined(HYPRE_LONG_DOUBLE) #define hypre_cos cosl #else #define hypre_cos cos #endif #endif #ifndef hypre_atan #if defined(HYPRE_SINGLE) #define hypre_atan atanf #elif defined(HYPRE_LONG_DOUBLE) #define hypre_atan atanl #else #define hypre_atan atan #endif #endif #ifndef hypre_fmod #if defined(HYPRE_SINGLE) #define hypre_fmod fmodf #elif defined(HYPRE_LONG_DOUBLE) #define hypre_fmod fmodl #else #define hypre_fmod fmod #endif #endif #endif /* hypre_GENERAL_HEADER */ /****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #ifndef HYPRE_BASE_HEADER #define HYPRE_BASE_HEADER /****************************************************************************** * * Base private solver struct * *****************************************************************************/ typedef struct { HYPRE_PtrToSolverFcn setup; HYPRE_PtrToSolverFcn solve; HYPRE_PtrToDestroyFcn destroy; } hypre_Solver; /*-------------------------------------------------------------------------- * Accessor functions for the hypre_Solver structure *--------------------------------------------------------------------------*/ #define hypre_SolverSetup(data) ((data) -> setup) #define hypre_SolverSolve(data) ((data) -> solve) #define hypre_SolverDestroy(data) ((data) -> destroy) #endif /* HYPRE_BASE_HEADER */ /****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #ifndef HYPRE_MAGMA_HEADER #define HYPRE_MAGMA_HEADER #include "HYPRE_config.h" #if defined(HYPRE_USING_MAGMA) #include "error.h" #ifdef __cplusplus extern "C++" { #endif #if !defined(MAGMA_GLOBAL) #define ADD_ #endif #include #ifdef __cplusplus } #endif /*-------------------------------------------------------------------------- * Wrappers to MAGMA functions according to hypre's precision *--------------------------------------------------------------------------*/ #if defined(HYPRE_COMPLEX) || defined(HYPRE_LONG_DOUBLE) #error "MAGMA interface does not support (yet) HYPRE_COMPLEX and HYPRE_LONG_DOUBLE" #elif defined(HYPRE_SINGLE) #define hypre_magma_getrf_gpu magma_sgetrf_gpu #define hypre_magma_getrf_nat magma_sgetrf_native #define hypre_magma_getrs_gpu magma_sgetrs_gpu #define hypre_magma_getri_gpu magma_sgetri_gpu #define hypre_magma_getri_nb magma_get_dgetri_nb #define hypre_magma_gemv magma_sgemv #else /* Double precision */ #define hypre_magma_getrf_gpu magma_dgetrf_gpu #define hypre_magma_getrf_nat magma_dgetrf_native #define hypre_magma_getrs_gpu magma_dgetrs_gpu #define hypre_magma_getri_gpu magma_dgetri_gpu #define hypre_magma_getri_nb magma_get_sgetri_nb #define hypre_magma_gemv magma_dgemv #endif /*-------------------------------------------------------------------------- * General wrapper call to MAGMA functions *--------------------------------------------------------------------------*/ #define HYPRE_MAGMA_CALL(call) do { \ magma_int_t err = call; \ if (MAGMA_SUCCESS != err) { \ printf("MAGMA ERROR (code = %d) at %s:%d\n", \ err, __FILE__, __LINE__); \ hypre_assert(0); \ } } while(0) #define HYPRE_MAGMA_VCALL(call) call #endif /* HYPRE_USING_MAGMA */ #endif /* HYPRE_MAGMA_HEADER */ /****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #ifndef hypre_MATRIX_STATS_HEADER #define hypre_MATRIX_STATS_HEADER /****************************************************************************** * * Header info for (generic) matrix statistics data structure * *****************************************************************************/ typedef struct hypre_MatrixStats_struct { /* General info */ HYPRE_BigInt num_rows; HYPRE_BigInt num_cols; hypre_ulonglongint num_nonzeros; /* Actual nonzeros statistics */ hypre_ulonglongint actual_nonzeros; HYPRE_Real actual_threshold; HYPRE_Real sparsity; /* Nonzeros per row statistics */ HYPRE_Int nnzrow_min; HYPRE_Int nnzrow_max; HYPRE_Real nnzrow_avg; HYPRE_Real nnzrow_stdev; HYPRE_Real nnzrow_sqsum; /* Row sum statistics */ HYPRE_Real rowsum_min; HYPRE_Real rowsum_max; HYPRE_Real rowsum_avg; HYPRE_Real rowsum_stdev; HYPRE_Real rowsum_sqsum; } hypre_MatrixStats; /*-------------------------------------------------------------------------- * Accessor macros *--------------------------------------------------------------------------*/ #define hypre_MatrixStatsNumRows(data) ((data) -> num_rows) #define hypre_MatrixStatsNumCols(data) ((data) -> num_cols) #define hypre_MatrixStatsNumNonzeros(data) ((data) -> num_nonzeros) #define hypre_MatrixStatsSparsity(data) ((data) -> sparsity) #define hypre_MatrixStatsActualNonzeros(data) ((data) -> actual_nonzeros) #define hypre_MatrixStatsActualThreshold(data) ((data) -> actual_threshold) #define hypre_MatrixStatsNnzrowMin(data) ((data) -> nnzrow_min) #define hypre_MatrixStatsNnzrowMax(data) ((data) -> nnzrow_max) #define hypre_MatrixStatsNnzrowAvg(data) ((data) -> nnzrow_avg) #define hypre_MatrixStatsNnzrowStDev(data) ((data) -> nnzrow_stdev) #define hypre_MatrixStatsNnzrowSqsum(data) ((data) -> nnzrow_sqsum) #define hypre_MatrixStatsRowsumMin(data) ((data) -> rowsum_min) #define hypre_MatrixStatsRowsumMax(data) ((data) -> rowsum_max) #define hypre_MatrixStatsRowsumAvg(data) ((data) -> rowsum_avg) #define hypre_MatrixStatsRowsumStDev(data) ((data) -> rowsum_stdev) #define hypre_MatrixStatsRowsumSqsum(data) ((data) -> rowsum_sqsum) /****************************************************************************** * * Header info for array of (generic) matrix statistics data structure * *****************************************************************************/ typedef struct hypre_MatrixStatsArray_struct { HYPRE_Int capacity; hypre_MatrixStats **entries; } hypre_MatrixStatsArray; /*-------------------------------------------------------------------------- * Accessor macros *--------------------------------------------------------------------------*/ #define hypre_MatrixStatsArrayCapacity(data) ((data) -> capacity) #define hypre_MatrixStatsArrayEntries(data) ((data) -> entries) #define hypre_MatrixStatsArrayEntry(data, i) ((data) -> entries[i]) /*-------------------------------------------------------------------------- * Helper macros for table formatting *--------------------------------------------------------------------------*/ #define HYPRE_PRINT_TOP_DIVISOR(m, d) \ for (HYPRE_Int __i = 0; __i < m; __i++) \ { \ for (HYPRE_Int __j = 0; __j < d[__i]; __j++) \ { \ hypre_printf("%s", "="); \ } \ if (__i < m - 1) \ { \ hypre_printf("+"); \ } \ } \ hypre_printf("\n"); #define HYPRE_PRINT_MID_DIVISOR(m, d, msg) \ for (HYPRE_Int __i = 0; __i < m; __i++) \ { \ for (HYPRE_Int __j = 0; __j < d[__i]; __j++) \ { \ hypre_printf("%s", "-"); \ } \ if (__i < m - 1) \ { \ hypre_printf("+"); \ } \ } \ hypre_printf(" %s\n", msg); #define HYPRE_PRINT_INDENT(n) \ hypre_printf("%*s", (n > 0) ? n : 0, ""); #define HYPRE_PRINT_SHIFTED_PARAM(n, ...) \ HYPRE_PRINT_INDENT(n) \ hypre_printf(__VA_ARGS__) #define HYPRE_NDIGITS_SIZE 12 #endif /* hypre_MATRIX_STATS_HEADER */ /****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #ifndef hypre_PRINTF_HEADER #define hypre_PRINTF_HEADER #include /* printf.c */ // #ifdef HYPRE_BIGINT HYPRE_Int hypre_ndigits( HYPRE_BigInt number ); HYPRE_Int hypre_printf( const char *format, ... ); HYPRE_Int hypre_fprintf( FILE *stream, const char *format, ... ); HYPRE_Int hypre_sprintf( char *s, const char *format, ... ); HYPRE_Int hypre_snprintf( char *s, size_t size, const char *format, ...); HYPRE_Int hypre_scanf( const char *format, ... ); HYPRE_Int hypre_fscanf( FILE *stream, const char *format, ... ); HYPRE_Int hypre_sscanf( char *s, const char *format, ... ); HYPRE_Int hypre_ParPrintf(MPI_Comm comm, const char *format, ...); // #else // #define hypre_printf printf // #define hypre_fprintf fprintf // #define hypre_sprintf sprintf // #define hypre_scanf scanf // #define hypre_fscanf fscanf // #define hypre_sscanf sscanf // #endif #endif /****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #ifndef hypre_ERROR_HEADER #define hypre_ERROR_HEADER #ifdef __cplusplus extern "C++" { #endif #include #ifdef __cplusplus } #endif /*-------------------------------------------------------------------------- * Global variable used in hypre error checking *--------------------------------------------------------------------------*/ typedef struct { HYPRE_Int error_flag; HYPRE_Int temp_error_flag; HYPRE_Int print_to_memory; HYPRE_Int verbosity; char *memory; HYPRE_Int mem_sz; HYPRE_Int msg_sz; } hypre_Error; extern hypre_Error hypre__global_error; #define hypre_error_flag hypre__global_error.error_flag #define hypre_error_temp_flag hypre__global_error.temp_error_flag /*-------------------------------------------------------------------------- * HYPRE error macros *--------------------------------------------------------------------------*/ void hypre_error_handler(const char *filename, HYPRE_Int line, HYPRE_Int ierr, const char *msg); void hypre_error_handler_clear_messages(void); void hypre_error_code_save(void); void hypre_error_code_restore(void); #define hypre_error(IERR) hypre_error_handler(__FILE__, __LINE__, IERR, NULL) #define hypre_error_w_msg(IERR, msg) hypre_error_handler(__FILE__, __LINE__, IERR, msg) #define hypre_error_in_arg(IARG) hypre_error(HYPRE_ERROR_ARG | IARG<<3) #if defined(HYPRE_DEBUG) /* host assert */ #define hypre_assert(EX) do { if (!(EX)) { fprintf(stderr, "[%s, %d] hypre_assert failed: %s\n", __FILE__, __LINE__, #EX); hypre_error(1); assert(0); } } while (0) /* device assert */ #if defined(HYPRE_USING_CUDA) #define hypre_device_assert(EX) assert(EX) #elif defined(HYPRE_USING_HIP) /* FIXME: Currently, asserts in device kernels in HIP do not behave well */ #define hypre_device_assert(EX) do { if (0) { static_cast (EX); } } while (0) #elif defined(HYPRE_USING_SYCL) #define hypre_device_assert(EX) assert(EX) #endif #else /* #ifdef HYPRE_DEBUG */ /* this is to silence compiler's unused variable warnings */ #ifdef __cplusplus #define hypre_assert(EX) do { if (0) { static_cast (EX); } } while (0) #else #define hypre_assert(EX) do { if (0) { (void) (EX); } } while (0) #endif #define hypre_device_assert(EX) #endif #endif /* hypre_ERROR_HEADER */ /****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * Fake mpi stubs to generate serial codes without mpi * *****************************************************************************/ #ifndef hypre_MPISTUBS #define hypre_MPISTUBS #ifdef __cplusplus extern "C" { #endif #ifdef HYPRE_SEQUENTIAL /****************************************************************************** * MPI stubs to generate serial codes without mpi *****************************************************************************/ /*-------------------------------------------------------------------------- * Change all MPI names to hypre_MPI names to avoid link conflicts. * * NOTE: MPI_Comm is the only MPI symbol in the HYPRE user interface, * and is defined in `HYPRE_utilities.h'. *--------------------------------------------------------------------------*/ #define MPI_Comm hypre_MPI_Comm #define MPI_Group hypre_MPI_Group #define MPI_Request hypre_MPI_Request #define MPI_Datatype hypre_MPI_Datatype #define MPI_Status hypre_MPI_Status #define MPI_Op hypre_MPI_Op #define MPI_Aint hypre_MPI_Aint #define MPI_Info hypre_MPI_Info #define MPI_COMM_WORLD hypre_MPI_COMM_WORLD #define MPI_COMM_NULL hypre_MPI_COMM_NULL #define MPI_COMM_SELF hypre_MPI_COMM_SELF #define MPI_COMM_TYPE_SHARED hypre_MPI_COMM_TYPE_SHARED #define MPI_BOTTOM hypre_MPI_BOTTOM #define MPI_FLOAT hypre_MPI_FLOAT #define MPI_DOUBLE hypre_MPI_DOUBLE #define MPI_LONG_DOUBLE hypre_MPI_LONG_DOUBLE #define MPI_INT hypre_MPI_INT #define MPI_LONG_LONG_INT hypre_MPI_LONG_LONG_INT #define MPI_CHAR hypre_MPI_CHAR #define MPI_LONG hypre_MPI_LONG #define MPI_BYTE hypre_MPI_BYTE #define MPI_C_FLOAT_COMPLEX hypre_MPI_COMPLEX #define MPI_C_LONG_DOUBLE_COMPLEX hypre_MPI_COMPLEX #define MPI_C_DOUBLE_COMPLEX hypre_MPI_COMPLEX #define MPI_SUM hypre_MPI_SUM #define MPI_MIN hypre_MPI_MIN #define MPI_MAX hypre_MPI_MAX #define MPI_LOR hypre_MPI_LOR #define MPI_LAND hypre_MPI_LAND #define MPI_BOR hypre_MPI_BOR #define MPI_SUCCESS hypre_MPI_SUCCESS #define MPI_STATUSES_IGNORE hypre_MPI_STATUSES_IGNORE #define MPI_UNDEFINED hypre_MPI_UNDEFINED #define MPI_REQUEST_NULL hypre_MPI_REQUEST_NULL #define MPI_INFO_NULL hypre_MPI_INFO_NULL #define MPI_ANY_SOURCE hypre_MPI_ANY_SOURCE #define MPI_ANY_TAG hypre_MPI_ANY_TAG #define MPI_SOURCE hypre_MPI_SOURCE #define MPI_TAG hypre_MPI_TAG #define MPI_Init hypre_MPI_Init #define MPI_Finalize hypre_MPI_Finalize #define MPI_Abort hypre_MPI_Abort #define MPI_Wtime hypre_MPI_Wtime #define MPI_Wtick hypre_MPI_Wtick #define MPI_Barrier hypre_MPI_Barrier #define MPI_Comm_create hypre_MPI_Comm_create #define MPI_Comm_dup hypre_MPI_Comm_dup #define MPI_Comm_f2c hypre_MPI_Comm_f2c #define MPI_Comm_group hypre_MPI_Comm_group #define MPI_Comm_size hypre_MPI_Comm_size #define MPI_Comm_rank hypre_MPI_Comm_rank #define MPI_Comm_free hypre_MPI_Comm_free #define MPI_Comm_split hypre_MPI_Comm_split #define MPI_Comm_split_type hypre_MPI_Comm_split_type #define MPI_Group_incl hypre_MPI_Group_incl #define MPI_Group_free hypre_MPI_Group_free #define MPI_Address hypre_MPI_Address #define MPI_Get_count hypre_MPI_Get_count #define MPI_Alltoall hypre_MPI_Alltoall #define MPI_Allgather hypre_MPI_Allgather #define MPI_Allgatherv hypre_MPI_Allgatherv #define MPI_Gather hypre_MPI_Gather #define MPI_Gatherv hypre_MPI_Gatherv #define MPI_Scatter hypre_MPI_Scatter #define MPI_Scatterv hypre_MPI_Scatterv #define MPI_Bcast hypre_MPI_Bcast #define MPI_Send hypre_MPI_Send #define MPI_Recv hypre_MPI_Recv #define MPI_Isend hypre_MPI_Isend #define MPI_Irecv hypre_MPI_Irecv #define MPI_Send_init hypre_MPI_Send_init #define MPI_Recv_init hypre_MPI_Recv_init #define MPI_Irsend hypre_MPI_Irsend #define MPI_Startall hypre_MPI_Startall #define MPI_Probe hypre_MPI_Probe #define MPI_Iprobe hypre_MPI_Iprobe #define MPI_Test hypre_MPI_Test #define MPI_Testall hypre_MPI_Testall #define MPI_Wait hypre_MPI_Wait #define MPI_Waitall hypre_MPI_Waitall #define MPI_Waitany hypre_MPI_Waitany #define MPI_Allreduce hypre_MPI_Allreduce #define MPI_Reduce hypre_MPI_Reduce #define MPI_Scan hypre_MPI_Scan #define MPI_Request_free hypre_MPI_Request_free #define MPI_Type_contiguous hypre_MPI_Type_contiguous #define MPI_Type_vector hypre_MPI_Type_vector #define MPI_Type_hvector hypre_MPI_Type_hvector #define MPI_Type_struct hypre_MPI_Type_struct #define MPI_Type_commit hypre_MPI_Type_commit #define MPI_Type_free hypre_MPI_Type_free #define MPI_Op_free hypre_MPI_Op_free #define MPI_Op_create hypre_MPI_Op_create #define MPI_User_function hypre_MPI_User_function #define MPI_Info_create hypre_MPI_Info_create /*-------------------------------------------------------------------------- * Types, etc. *--------------------------------------------------------------------------*/ /* These types have associated creation and destruction routines */ typedef HYPRE_Int hypre_MPI_Comm; typedef HYPRE_Int hypre_MPI_Group; typedef HYPRE_Int hypre_MPI_Request; typedef HYPRE_Int hypre_MPI_Datatype; typedef void (hypre_MPI_User_function) (void); typedef struct { HYPRE_Int hypre_MPI_SOURCE; HYPRE_Int hypre_MPI_TAG; } hypre_MPI_Status; typedef HYPRE_Int hypre_MPI_Op; typedef HYPRE_Int hypre_MPI_Aint; typedef HYPRE_Int hypre_MPI_Info; #define hypre_MPI_COMM_SELF 1 #define hypre_MPI_COMM_WORLD 0 #define hypre_MPI_COMM_NULL -1 #define hypre_MPI_COMM_TYPE_SHARED 0 #define hypre_MPI_BOTTOM 0x0 #define hypre_MPI_FLOAT 0 #define hypre_MPI_DOUBLE 1 #define hypre_MPI_LONG_DOUBLE 2 #define hypre_MPI_INT 3 #define hypre_MPI_CHAR 4 #define hypre_MPI_LONG 5 #define hypre_MPI_BYTE 6 #define hypre_MPI_REAL 7 #define hypre_MPI_COMPLEX 8 #define hypre_MPI_LONG_LONG_INT 9 #define hypre_MPI_SUM 0 #define hypre_MPI_MIN 1 #define hypre_MPI_MAX 2 #define hypre_MPI_LOR 3 #define hypre_MPI_LAND 4 #define hypre_MPI_BOR 5 #define hypre_MPI_SUCCESS 0 #define hypre_MPI_STATUSES_IGNORE 0 #define hypre_MPI_UNDEFINED -9999 #define hypre_MPI_REQUEST_NULL 0 #define hypre_MPI_INFO_NULL 0 #define hypre_MPI_ANY_SOURCE 1 #define hypre_MPI_ANY_TAG 1 #else /****************************************************************************** * MPI stubs to do casting of HYPRE_Int and hypre_int correctly *****************************************************************************/ typedef MPI_Comm hypre_MPI_Comm; typedef MPI_Group hypre_MPI_Group; typedef MPI_Request hypre_MPI_Request; typedef MPI_Datatype hypre_MPI_Datatype; typedef MPI_Status hypre_MPI_Status; typedef MPI_Op hypre_MPI_Op; typedef MPI_Aint hypre_MPI_Aint; typedef MPI_Info hypre_MPI_Info; typedef MPI_User_function hypre_MPI_User_function; #define hypre_MPI_COMM_WORLD MPI_COMM_WORLD #define hypre_MPI_COMM_NULL MPI_COMM_NULL #define hypre_MPI_BOTTOM MPI_BOTTOM #define hypre_MPI_COMM_SELF MPI_COMM_SELF #define hypre_MPI_COMM_TYPE_SHARED MPI_COMM_TYPE_SHARED #define hypre_MPI_FLOAT MPI_FLOAT #define hypre_MPI_DOUBLE MPI_DOUBLE #define hypre_MPI_LONG_DOUBLE MPI_LONG_DOUBLE /* HYPRE_MPI_INT is defined in HYPRE_utilities.h */ #define hypre_MPI_INT HYPRE_MPI_INT #define hypre_MPI_CHAR MPI_CHAR #define hypre_MPI_LONG MPI_LONG #define hypre_MPI_BYTE MPI_BYTE /* HYPRE_MPI_REAL is defined in HYPRE_utilities.h */ #define hypre_MPI_REAL HYPRE_MPI_REAL /* HYPRE_MPI_COMPLEX is defined in HYPRE_utilities.h */ #define hypre_MPI_COMPLEX HYPRE_MPI_COMPLEX #define hypre_MPI_SUM MPI_SUM #define hypre_MPI_MIN MPI_MIN #define hypre_MPI_MAX MPI_MAX #define hypre_MPI_LOR MPI_LOR #define hypre_MPI_BOR MPI_BOR #define hypre_MPI_SUCCESS MPI_SUCCESS #define hypre_MPI_STATUSES_IGNORE MPI_STATUSES_IGNORE #define hypre_MPI_UNDEFINED MPI_UNDEFINED #define hypre_MPI_REQUEST_NULL MPI_REQUEST_NULL #define hypre_MPI_INFO_NULL MPI_INFO_NULL #define hypre_MPI_ANY_SOURCE MPI_ANY_SOURCE #define hypre_MPI_ANY_TAG MPI_ANY_TAG #define hypre_MPI_SOURCE MPI_SOURCE #define hypre_MPI_TAG MPI_TAG #define hypre_MPI_LAND MPI_LAND #endif /****************************************************************************** * Everything below this applies to both ifdef cases above *****************************************************************************/ /*-------------------------------------------------------------------------- * Prototypes *--------------------------------------------------------------------------*/ /* mpistubs.c */ HYPRE_Int hypre_MPI_Init( hypre_int *argc, char ***argv ); HYPRE_Int hypre_MPI_Finalize( void ); HYPRE_Int hypre_MPI_Abort( hypre_MPI_Comm comm, HYPRE_Int errorcode ); HYPRE_Real hypre_MPI_Wtime( void ); HYPRE_Real hypre_MPI_Wtick( void ); HYPRE_Int hypre_MPI_Barrier( hypre_MPI_Comm comm ); HYPRE_Int hypre_MPI_Comm_create( hypre_MPI_Comm comm, hypre_MPI_Group group, hypre_MPI_Comm *newcomm ); HYPRE_Int hypre_MPI_Comm_dup( hypre_MPI_Comm comm, hypre_MPI_Comm *newcomm ); hypre_MPI_Comm hypre_MPI_Comm_f2c( hypre_int comm ); HYPRE_Int hypre_MPI_Comm_size( hypre_MPI_Comm comm, HYPRE_Int *size ); HYPRE_Int hypre_MPI_Comm_rank( hypre_MPI_Comm comm, HYPRE_Int *rank ); HYPRE_Int hypre_MPI_Comm_free( hypre_MPI_Comm *comm ); HYPRE_Int hypre_MPI_Comm_group( hypre_MPI_Comm comm, hypre_MPI_Group *group ); HYPRE_Int hypre_MPI_Comm_split( hypre_MPI_Comm comm, HYPRE_Int n, HYPRE_Int m, hypre_MPI_Comm * comms ); HYPRE_Int hypre_MPI_Group_incl( hypre_MPI_Group group, HYPRE_Int n, HYPRE_Int *ranks, hypre_MPI_Group *newgroup ); HYPRE_Int hypre_MPI_Group_free( hypre_MPI_Group *group ); HYPRE_Int hypre_MPI_Address( void *location, hypre_MPI_Aint *address ); HYPRE_Int hypre_MPI_Get_count( hypre_MPI_Status *status, hypre_MPI_Datatype datatype, HYPRE_Int *count ); HYPRE_Int hypre_MPI_Alltoall( void *sendbuf, HYPRE_Int sendcount, hypre_MPI_Datatype sendtype, void *recvbuf, HYPRE_Int recvcount, hypre_MPI_Datatype recvtype, hypre_MPI_Comm comm ); HYPRE_Int hypre_MPI_Allgather( void *sendbuf, HYPRE_Int sendcount, hypre_MPI_Datatype sendtype, void *recvbuf, HYPRE_Int recvcount, hypre_MPI_Datatype recvtype, hypre_MPI_Comm comm ); HYPRE_Int hypre_MPI_Allgatherv( void *sendbuf, HYPRE_Int sendcount, hypre_MPI_Datatype sendtype, void *recvbuf, HYPRE_Int *recvcounts, HYPRE_Int *displs, hypre_MPI_Datatype recvtype, hypre_MPI_Comm comm ); HYPRE_Int hypre_MPI_Gather( void *sendbuf, HYPRE_Int sendcount, hypre_MPI_Datatype sendtype, void *recvbuf, HYPRE_Int recvcount, hypre_MPI_Datatype recvtype, HYPRE_Int root, hypre_MPI_Comm comm ); HYPRE_Int hypre_MPI_Gatherv( void *sendbuf, HYPRE_Int sendcount, hypre_MPI_Datatype sendtype, void *recvbuf, HYPRE_Int *recvcounts, HYPRE_Int *displs, hypre_MPI_Datatype recvtype, HYPRE_Int root, hypre_MPI_Comm comm ); HYPRE_Int hypre_MPI_Scatter( void *sendbuf, HYPRE_Int sendcount, hypre_MPI_Datatype sendtype, void *recvbuf, HYPRE_Int recvcount, hypre_MPI_Datatype recvtype, HYPRE_Int root, hypre_MPI_Comm comm ); HYPRE_Int hypre_MPI_Scatterv( void *sendbuf, HYPRE_Int *sendcounts, HYPRE_Int *displs, hypre_MPI_Datatype sendtype, void *recvbuf, HYPRE_Int recvcount, hypre_MPI_Datatype recvtype, HYPRE_Int root, hypre_MPI_Comm comm ); HYPRE_Int hypre_MPI_Bcast( void *buffer, HYPRE_Int count, hypre_MPI_Datatype datatype, HYPRE_Int root, hypre_MPI_Comm comm ); HYPRE_Int hypre_MPI_Send( void *buf, HYPRE_Int count, hypre_MPI_Datatype datatype, HYPRE_Int dest, HYPRE_Int tag, hypre_MPI_Comm comm ); HYPRE_Int hypre_MPI_Recv( void *buf, HYPRE_Int count, hypre_MPI_Datatype datatype, HYPRE_Int source, HYPRE_Int tag, hypre_MPI_Comm comm, hypre_MPI_Status *status ); HYPRE_Int hypre_MPI_Isend( void *buf, HYPRE_Int count, hypre_MPI_Datatype datatype, HYPRE_Int dest, HYPRE_Int tag, hypre_MPI_Comm comm, hypre_MPI_Request *request ); HYPRE_Int hypre_MPI_Irecv( void *buf, HYPRE_Int count, hypre_MPI_Datatype datatype, HYPRE_Int source, HYPRE_Int tag, hypre_MPI_Comm comm, hypre_MPI_Request *request ); HYPRE_Int hypre_MPI_Send_init( void *buf, HYPRE_Int count, hypre_MPI_Datatype datatype, HYPRE_Int dest, HYPRE_Int tag, hypre_MPI_Comm comm, hypre_MPI_Request *request ); HYPRE_Int hypre_MPI_Recv_init( void *buf, HYPRE_Int count, hypre_MPI_Datatype datatype, HYPRE_Int dest, HYPRE_Int tag, hypre_MPI_Comm comm, hypre_MPI_Request *request ); HYPRE_Int hypre_MPI_Irsend( void *buf, HYPRE_Int count, hypre_MPI_Datatype datatype, HYPRE_Int dest, HYPRE_Int tag, hypre_MPI_Comm comm, hypre_MPI_Request *request ); HYPRE_Int hypre_MPI_Startall( HYPRE_Int count, hypre_MPI_Request *array_of_requests ); HYPRE_Int hypre_MPI_Probe( HYPRE_Int source, HYPRE_Int tag, hypre_MPI_Comm comm, hypre_MPI_Status *status ); HYPRE_Int hypre_MPI_Iprobe( HYPRE_Int source, HYPRE_Int tag, hypre_MPI_Comm comm, HYPRE_Int *flag, hypre_MPI_Status *status ); HYPRE_Int hypre_MPI_Test( hypre_MPI_Request *request, HYPRE_Int *flag, hypre_MPI_Status *status ); HYPRE_Int hypre_MPI_Testall( HYPRE_Int count, hypre_MPI_Request *array_of_requests, HYPRE_Int *flag, hypre_MPI_Status *array_of_statuses ); HYPRE_Int hypre_MPI_Wait( hypre_MPI_Request *request, hypre_MPI_Status *status ); HYPRE_Int hypre_MPI_Waitall( HYPRE_Int count, hypre_MPI_Request *array_of_requests, hypre_MPI_Status *array_of_statuses ); HYPRE_Int hypre_MPI_Waitany( HYPRE_Int count, hypre_MPI_Request *array_of_requests, HYPRE_Int *index, hypre_MPI_Status *status ); HYPRE_Int hypre_MPI_Allreduce( void *sendbuf, void *recvbuf, HYPRE_Int count, hypre_MPI_Datatype datatype, hypre_MPI_Op op, hypre_MPI_Comm comm ); HYPRE_Int hypre_MPI_Reduce( void *sendbuf, void *recvbuf, HYPRE_Int count, hypre_MPI_Datatype datatype, hypre_MPI_Op op, HYPRE_Int root, hypre_MPI_Comm comm ); HYPRE_Int hypre_MPI_Scan( void *sendbuf, void *recvbuf, HYPRE_Int count, hypre_MPI_Datatype datatype, hypre_MPI_Op op, hypre_MPI_Comm comm ); HYPRE_Int hypre_MPI_Request_free( hypre_MPI_Request *request ); HYPRE_Int hypre_MPI_Type_contiguous( HYPRE_Int count, hypre_MPI_Datatype oldtype, hypre_MPI_Datatype *newtype ); HYPRE_Int hypre_MPI_Type_vector( HYPRE_Int count, HYPRE_Int blocklength, HYPRE_Int stride, hypre_MPI_Datatype oldtype, hypre_MPI_Datatype *newtype ); HYPRE_Int hypre_MPI_Type_hvector( HYPRE_Int count, HYPRE_Int blocklength, hypre_MPI_Aint stride, hypre_MPI_Datatype oldtype, hypre_MPI_Datatype *newtype ); HYPRE_Int hypre_MPI_Type_struct( HYPRE_Int count, HYPRE_Int *array_of_blocklengths, hypre_MPI_Aint *array_of_displacements, hypre_MPI_Datatype *array_of_types, hypre_MPI_Datatype *newtype ); HYPRE_Int hypre_MPI_Type_commit( hypre_MPI_Datatype *datatype ); HYPRE_Int hypre_MPI_Type_free( hypre_MPI_Datatype *datatype ); HYPRE_Int hypre_MPI_Op_free( hypre_MPI_Op *op ); HYPRE_Int hypre_MPI_Op_create( hypre_MPI_User_function *function, hypre_int commute, hypre_MPI_Op *op ); #if defined(HYPRE_USING_GPU) || defined(HYPRE_USING_DEVICE_OPENMP) HYPRE_Int hypre_MPI_Comm_split_type(hypre_MPI_Comm comm, HYPRE_Int split_type, HYPRE_Int key, hypre_MPI_Info info, hypre_MPI_Comm *newcomm); HYPRE_Int hypre_MPI_Info_create(hypre_MPI_Info *info); HYPRE_Int hypre_MPI_Info_free( hypre_MPI_Info *info ); #endif #ifdef __cplusplus } #endif #endif /****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #ifndef HYPRE_SMP_HEADER #define HYPRE_SMP_HEADER #endif #define HYPRE_SMP_SCHEDULE schedule(static) /****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * Header file for memory management utilities * * The abstract memory model has a Host (think CPU) and a Device (think GPU) and * three basic types of memory management utilities: * * 1. Malloc(..., location) * location=LOCATION_DEVICE - malloc memory on the device * location=LOCATION_HOST - malloc memory on the host * 2. MemCopy(..., method) * method=HOST_TO_DEVICE - copy from host to device * method=DEVICE_TO_HOST - copy from device to host * method=DEVICE_TO_DEVICE - copy from device to device * 3. SetExecutionMode * location=LOCATION_DEVICE - execute on the device * location=LOCATION_HOST - execute on the host * * Although the abstract model does not explicitly reflect a managed memory * model (i.e., unified memory), it can support it. Here is a summary of how * the abstract model would be mapped to specific hardware scenarios: * * Not using a device, not using managed memory * Malloc(..., location) * location=LOCATION_DEVICE - host malloc e.g., malloc * location=LOCATION_HOST - host malloc e.g., malloc * MemoryCopy(..., locTo,locFrom) * locTo=LOCATION_HOST, locFrom=LOCATION_DEVICE - copy from host to host e.g., memcpy * locTo=LOCATION_DEVICE, locFrom=LOCATION_HOST - copy from host to host e.g., memcpy * locTo=LOCATION_DEVICE, locFrom=LOCATION_DEVICE - copy from host to host e.g., memcpy * SetExecutionMode * location=LOCATION_DEVICE - execute on the host * location=LOCATION_HOST - execute on the host * * Using a device, not using managed memory * Malloc(..., location) * location=LOCATION_DEVICE - device malloc e.g., cudaMalloc * location=LOCATION_HOST - host malloc e.g., malloc * MemoryCopy(..., locTo,locFrom) * locTo=LOCATION_HOST, locFrom=LOCATION_DEVICE - copy from device to host e.g., cudaMemcpy * locTo=LOCATION_DEVICE, locFrom=LOCATION_HOST - copy from host to device e.g., cudaMemcpy * locTo=LOCATION_DEVICE, locFrom=LOCATION_DEVICE - copy from device to device e.g., cudaMemcpy * SetExecutionMode * location=LOCATION_DEVICE - execute on the device * location=LOCATION_HOST - execute on the host * * Using a device, using managed memory * Malloc(..., location) * location=LOCATION_DEVICE - managed malloc e.g., cudaMallocManaged * location=LOCATION_HOST - host malloc e.g., malloc * MemoryCopy(..., locTo,locFrom) * locTo=LOCATION_HOST, locFrom=LOCATION_DEVICE - copy from device to host e.g., cudaMallocManaged * locTo=LOCATION_DEVICE, locFrom=LOCATION_HOST - copy from host to device e.g., cudaMallocManaged * locTo=LOCATION_DEVICE, locFrom=LOCATION_DEVICE - copy from device to device e.g., cudaMallocManaged * SetExecutionMode * location=LOCATION_DEVICE - execute on the device * location=LOCATION_HOST - execute on the host * *****************************************************************************/ #ifndef hypre_MEMORY_HEADER #define hypre_MEMORY_HEADER #include #include #if defined(HYPRE_USING_UNIFIED_MEMORY) && defined(HYPRE_USING_DEVICE_OPENMP) //#pragma omp requires unified_shared_memory #endif /* stringification: * _Pragma(string-literal), so we need to cast argument to a string * The three dots as last argument of the macro tells compiler that this is a variadic macro. * I.e. this is a macro that receives variable number of arguments. */ #define HYPRE_STR(...) #__VA_ARGS__ #define HYPRE_XSTR(...) HYPRE_STR(__VA_ARGS__) #ifdef __cplusplus extern "C" { #endif typedef enum _hypre_MemoryLocation { hypre_MEMORY_UNDEFINED = -1, hypre_MEMORY_HOST, hypre_MEMORY_HOST_PINNED, hypre_MEMORY_DEVICE, hypre_MEMORY_UNIFIED, hypre_NUM_MEMORY_LOCATION } hypre_MemoryLocation; /*------------------------------------------------------- * hypre_GetActualMemLocation * return actual location based on the selected memory model *-------------------------------------------------------*/ static inline HYPRE_MAYBE_UNUSED_FUNC hypre_MemoryLocation hypre_GetActualMemLocation(HYPRE_MemoryLocation location) { if (location == HYPRE_MEMORY_HOST) { return hypre_MEMORY_HOST; } if (location == HYPRE_MEMORY_DEVICE) { #if defined(HYPRE_USING_HOST_MEMORY) return hypre_MEMORY_HOST; #elif defined(HYPRE_USING_DEVICE_MEMORY) return hypre_MEMORY_DEVICE; #elif defined(HYPRE_USING_UNIFIED_MEMORY) return hypre_MEMORY_UNIFIED; #else #error Wrong HYPRE memory setting. #endif } return hypre_MEMORY_UNDEFINED; } #if !defined(HYPRE_USING_MEMORY_TRACKER) #define hypre_TAlloc(type, count, location) \ ( (type *) hypre_MAlloc((size_t)(sizeof(type) * (count)), location) ) #define _hypre_TAlloc(type, count, location) \ ( (type *) _hypre_MAlloc((size_t)(sizeof(type) * (count)), location) ) #define hypre_CTAlloc(type, count, location) \ ( (type *) hypre_CAlloc((size_t)(count), (size_t)sizeof(type), location) ) #define hypre_TReAlloc(ptr, type, count, location) \ ( (type *) hypre_ReAlloc((char *)ptr, (size_t)(sizeof(type) * (count)), location) ) #define hypre_TReAlloc_v2(ptr, old_type, old_count, new_type, new_count, location) \ ( (new_type *) hypre_ReAlloc_v2((char *)ptr, (size_t)(sizeof(old_type)*(old_count)), (size_t)(sizeof(new_type)*(new_count)), location) ) #define hypre_TMemcpy(dst, src, type, count, locdst, locsrc) \ (hypre_Memcpy((void *)(dst), (void *)(src), (size_t)(sizeof(type) * (count)), locdst, locsrc)) #define hypre_TFree(ptr, location) \ ( hypre_Free((void *)ptr, location), ptr = NULL ) #define _hypre_TFree(ptr, location) \ ( _hypre_Free((void *)ptr, location), ptr = NULL ) #endif /* #if !defined(HYPRE_USING_MEMORY_TRACKER) */ /*-------------------------------------------------------------------------- * Prototypes *--------------------------------------------------------------------------*/ /* memory.c */ HYPRE_Int hypre_GetMemoryLocationName(hypre_MemoryLocation memory_location, char *memory_location_name); void hypre_CheckMemoryLocation(void *ptr, hypre_MemoryLocation location); void * hypre_Memset(void *ptr, HYPRE_Int value, size_t num, HYPRE_MemoryLocation location); void hypre_MemPrefetch(void *ptr, size_t size, HYPRE_MemoryLocation location); void * hypre_MAlloc(size_t size, HYPRE_MemoryLocation location); void * hypre_CAlloc( size_t count, size_t elt_size, HYPRE_MemoryLocation location); void hypre_Free(void *ptr, HYPRE_MemoryLocation location); void hypre_Memcpy(void *dst, void *src, size_t size, HYPRE_MemoryLocation loc_dst, HYPRE_MemoryLocation loc_src); void * hypre_ReAlloc(void *ptr, size_t size, HYPRE_MemoryLocation location); void * hypre_ReAlloc_v2(void *ptr, size_t old_size, size_t new_size, HYPRE_MemoryLocation location); void * _hypre_MAlloc(size_t size, hypre_MemoryLocation location); void _hypre_Free(void *ptr, hypre_MemoryLocation location); HYPRE_ExecutionPolicy hypre_GetExecPolicy1(HYPRE_MemoryLocation location); HYPRE_ExecutionPolicy hypre_GetExecPolicy2(HYPRE_MemoryLocation location1, HYPRE_MemoryLocation location2); HYPRE_Int hypre_GetPointerLocation(const void *ptr, hypre_MemoryLocation *memory_location); HYPRE_Int hypre_SetCubMemPoolSize( hypre_uint bin_growth, hypre_uint min_bin, hypre_uint max_bin, size_t max_cached_bytes ); HYPRE_Int hypre_umpire_host_pooled_allocate(void **ptr, size_t nbytes); HYPRE_Int hypre_umpire_host_pooled_free(void *ptr); void *hypre_umpire_host_pooled_realloc(void *ptr, size_t size); HYPRE_Int hypre_umpire_device_pooled_allocate(void **ptr, size_t nbytes); HYPRE_Int hypre_umpire_device_pooled_free(void *ptr); HYPRE_Int hypre_umpire_um_pooled_allocate(void **ptr, size_t nbytes); HYPRE_Int hypre_umpire_um_pooled_free(void *ptr); HYPRE_Int hypre_umpire_pinned_pooled_allocate(void **ptr, size_t nbytes); HYPRE_Int hypre_umpire_pinned_pooled_free(void *ptr); HYPRE_Int hypre_UmpireInit(hypre_Handle *hypre_handle_); HYPRE_Int hypre_UmpireFinalize(hypre_Handle *hypre_handle_); HYPRE_Int hypre_UmpireGetCurrentMemoryUsage(MPI_Comm comm, HYPRE_Real *current); HYPRE_Int hypre_UmpireMemoryGetUsage(HYPRE_Real *memory); HYPRE_Int hypre_HostMemoryGetUsage(HYPRE_Real *mem); HYPRE_Int hypre_MemoryPrintUsage(MPI_Comm comm, HYPRE_Int level, const char *function, HYPRE_Int line); #define HYPRE_PRINT_MEMORY_USAGE(comm) hypre_MemoryPrintUsage(comm,\ hypre_HandleLogLevel(hypre_handle()),\ __func__,\ __LINE__) /* memory_dmalloc.c */ HYPRE_Int hypre_InitMemoryDebugDML( HYPRE_Int id ); HYPRE_Int hypre_FinalizeMemoryDebugDML( void ); char *hypre_MAllocDML( HYPRE_Int size, char *file, HYPRE_Int line ); char *hypre_CAllocDML( HYPRE_Int count, HYPRE_Int elt_size, char *file, HYPRE_Int line ); char *hypre_ReAllocDML( char *ptr, HYPRE_Int size, char *file, HYPRE_Int line ); void hypre_FreeDML( char *ptr, char *file, HYPRE_Int line ); #ifdef __cplusplus } #endif #endif /* hypre_MEMORY_HEADER */ /****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #ifndef hypre_MEMORY_TRACKER_HEADER #define hypre_MEMORY_TRACKER_HEADER #if defined(HYPRE_USING_MEMORY_TRACKER) extern size_t hypre_total_bytes[hypre_MEMORY_UNIFIED + 1]; extern size_t hypre_peak_bytes[hypre_MEMORY_UNIFIED + 1]; extern size_t hypre_current_bytes[hypre_MEMORY_UNIFIED + 1]; extern HYPRE_Int hypre_memory_tracker_print; extern char hypre_memory_tracker_filename[HYPRE_MAX_FILE_NAME_LEN]; typedef enum _hypre_MemoryTrackerEvent { HYPRE_MEMORY_EVENT_ALLOC = 0, HYPRE_MEMORY_EVENT_FREE, HYPRE_MEMORY_EVENT_COPY, HYPRE_MEMORY_NUM_EVENTS, } hypre_MemoryTrackerEvent; typedef enum _hypre_MemcpyType { hypre_MEMCPY_H2H = 0, hypre_MEMCPY_D2H, hypre_MEMCPY_H2D, hypre_MEMCPY_D2D, hypre_MEMCPY_NUM_TYPES, } hypre_MemcpyType; typedef struct { size_t index; size_t time_step; char action[16]; void *ptr; void *ptr2; size_t nbytes; hypre_MemoryLocation memory_location; hypre_MemoryLocation memory_location2; char filename[HYPRE_MAX_FILE_NAME_LEN]; char function[256]; HYPRE_Int line; size_t pair; } hypre_MemoryTrackerEntry; typedef struct { size_t head; size_t actual_size; size_t alloced_size; hypre_MemoryTrackerEntry *data; /* Free Queue is sorted based on (ptr, time_step) ascendingly */ hypre_MemoryTrackerEntry *sorted_data; /* compressed sorted_data with the same ptr */ size_t sorted_data_compressed_len; size_t *sorted_data_compressed_offset; hypre_MemoryTrackerEntry **sorted_data_compressed; } hypre_MemoryTrackerQueue; typedef struct { size_t curr_time_step; hypre_MemoryTrackerQueue queue[HYPRE_MEMORY_NUM_EVENTS]; } hypre_MemoryTracker; extern hypre_MemoryTracker *_hypre_memory_tracker; #define hypre_TAlloc(type, count, location) \ ( \ { \ void *ptr = hypre_MAlloc((size_t)(sizeof(type) * (count)), location); \ \ hypre_MemoryLocation alocation = hypre_GetActualMemLocation(location); \ hypre_MemoryTrackerInsert1("malloc", ptr, sizeof(type)*(count), alocation, \ __FILE__, __func__, __LINE__); \ (type *) ptr; \ } \ ) #define hypre_CTAlloc(type, count, location) \ ( \ { \ void *ptr = hypre_CAlloc((size_t)(count), (size_t)sizeof(type), location); \ \ hypre_MemoryLocation alocation = hypre_GetActualMemLocation(location); \ hypre_MemoryTrackerInsert1("calloc", ptr, sizeof(type)*(count), alocation, \ __FILE__, __func__, __LINE__); \ (type *) ptr; \ } \ ) #define hypre_TReAlloc(ptr, type, count, location) \ ( \ { \ void *new_ptr = hypre_ReAlloc((char *)ptr, (size_t)(sizeof(type) * (count)), location); \ \ hypre_MemoryLocation alocation = hypre_GetActualMemLocation(location); \ hypre_MemoryTrackerInsert1("rfree", ptr, (size_t) -1, alocation, \ __FILE__, __func__, __LINE__); \ hypre_MemoryTrackerInsert1("rmalloc", new_ptr, sizeof(type)*(count), alocation, \ __FILE__, __func__, __LINE__); \ (type *) new_ptr; \ } \ ) #define hypre_TReAlloc_v2(ptr, old_type, old_count, new_type, new_count, location) \ ( \ { \ void *new_ptr = hypre_ReAlloc_v2((char *)ptr, (size_t)(sizeof(old_type)*(old_count)), \ (size_t)(sizeof(new_type)*(new_count)), location); \ \ hypre_MemoryLocation alocation = hypre_GetActualMemLocation(location); \ hypre_MemoryTrackerInsert1("rfree", ptr, sizeof(old_type)*(old_count), alocation, \ __FILE__, __func__, __LINE__); \ hypre_MemoryTrackerInsert1("rmalloc", new_ptr, sizeof(new_type)*(new_count), alocation, \ __FILE__, __func__, __LINE__); \ (new_type *) new_ptr; \ } \ ) #define hypre_TMemcpy(dst, src, type, count, locdst, locsrc) \ ( \ { \ hypre_Memcpy((void *)(dst), (void *)(src), (size_t)(sizeof(type) * (count)), locdst, locsrc); \ \ hypre_MemoryLocation alocation_dst = hypre_GetActualMemLocation(locdst); \ hypre_MemoryLocation alocation_src = hypre_GetActualMemLocation(locsrc); \ hypre_MemoryTrackerInsert2("memcpy", (void *) (dst), (void *) (src), sizeof(type)*(count), \ alocation_dst, alocation_src, \ __FILE__, __func__, __LINE__); \ } \ ) #define hypre_TFree(ptr, location) \ ( \ { \ hypre_Free((void *)ptr, location); \ \ hypre_MemoryLocation alocation = hypre_GetActualMemLocation(location); \ hypre_MemoryTrackerInsert1("free", ptr, (size_t) -1, alocation, \ __FILE__, __func__, __LINE__); \ ptr = NULL; \ } \ ) #define _hypre_TAlloc(type, count, location) \ ( \ { \ void *ptr = _hypre_MAlloc((size_t)(sizeof(type) * (count)), location); \ \ hypre_MemoryTrackerInsert1("malloc", ptr, sizeof(type)*(count), location, \ __FILE__, __func__, __LINE__); \ (type *) ptr; \ } \ ) #define _hypre_TFree(ptr, location) \ ( \ { \ _hypre_Free((void *)ptr, location); \ \ hypre_MemoryTrackerInsert1("free", ptr, (size_t) -1, location, \ __FILE__, __func__, __LINE__); \ ptr = NULL; \ } \ ) #endif /* #if defined(HYPRE_USING_MEMORY_TRACKER) */ #endif /* #ifndef hypre_MEMORY_TRACKER_HEADER */ /****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #ifndef HYPRE_OMP_DEVICE_H #define HYPRE_OMP_DEVICE_H #if defined(HYPRE_USING_DEVICE_OPENMP) #include "omp.h" /* OpenMP 4.5 device memory management */ extern HYPRE_Int hypre__global_offload; extern HYPRE_Int hypre__offload_device_num; extern HYPRE_Int hypre__offload_host_num; /* stats */ extern size_t hypre__target_allc_count; extern size_t hypre__target_free_count; extern size_t hypre__target_allc_bytes; extern size_t hypre__target_free_bytes; extern size_t hypre__target_htod_count; extern size_t hypre__target_dtoh_count; extern size_t hypre__target_htod_bytes; extern size_t hypre__target_dtoh_bytes; /* CHECK MODE: check if offloading has effect (turned on when configured with --enable-debug) * if we ``enter'' an address, it should not exist in device [o.w NO EFFECT] * if we ``exit'' or ''update'' an address, it should exist in device [o.w ERROR] * hypre__offload_flag: 0 == OK; 1 == WRONG */ #ifdef HYPRE_DEVICE_OPENMP_CHECK #define HYPRE_OFFLOAD_FLAG(devnum, hptr, type) HYPRE_Int hypre__offload_flag = (type[1] == 'n') == omp_target_is_present(hptr, devnum); #else #define HYPRE_OFFLOAD_FLAG(...) HYPRE_Int hypre__offload_flag = 0; /* non-debug mode, always OK */ #endif /* OMP 4.5 offloading macro */ #define hypre_omp_device_offload(devnum, hptr, datatype, offset, count, type1, type2) \ {\ /* devnum: device number \ * hptr: host poiter \ * datatype \ * type1: ``e(n)ter'', ''e(x)it'', or ``u(p)date'' \ * type2: ``(a)lloc'', ``(t)o'', ``(d)elete'', ''(f)rom'' \ */ \ datatype *hypre__offload_hptr = (datatype *) hptr; \ /* if hypre__global_offload == 0, or * hptr (host pointer) == NULL, * this offload will be IGNORED */ \ if (hypre__global_offload && hypre__offload_hptr != NULL) { \ /* offloading offset and size (in datatype) */ \ size_t hypre__offload_offset = offset, hypre__offload_size = count; \ /* in the CHECK mode, we test if this offload has effect */ \ HYPRE_OFFLOAD_FLAG(devnum, hypre__offload_hptr, type1) \ if (hypre__offload_flag) { \ printf("[!NO Effect! %s %d] device %d target: %6s %6s, data %p, [%ld:%ld]\n", __FILE__, __LINE__, devnum, type1, type2, (void *)hypre__offload_hptr, hypre__offload_offset, hypre__offload_size); exit(0); \ } else { \ size_t offload_bytes = count * sizeof(datatype); \ /* printf("[ %s %d] device %d target: %6s %6s, data %p, [%d:%d]\n", __FILE__, __LINE__, devnum, type1, type2, (void *)hypre__offload_hptr, hypre__offload_offset, hypre__offload_size); */ \ if (type1[1] == 'n' && type2[0] == 't') { \ /* enter to */\ hypre__target_allc_count ++; \ hypre__target_allc_bytes += offload_bytes; \ hypre__target_htod_count ++; \ hypre__target_htod_bytes += offload_bytes; \ _Pragma (HYPRE_XSTR(omp target enter data map(to:hypre__offload_hptr[hypre__offload_offset:hypre__offload_size]))) \ } else if (type1[1] == 'n' && type2[0] == 'a') { \ /* enter alloc */ \ hypre__target_allc_count ++; \ hypre__target_allc_bytes += offload_bytes; \ _Pragma (HYPRE_XSTR(omp target enter data map(alloc:hypre__offload_hptr[hypre__offload_offset:hypre__offload_size]))) \ } else if (type1[1] == 'x' && type2[0] == 'd') { \ /* exit delete */\ hypre__target_free_count ++; \ hypre__target_free_bytes += offload_bytes; \ _Pragma (HYPRE_XSTR(omp target exit data map(delete:hypre__offload_hptr[hypre__offload_offset:hypre__offload_size]))) \ } else if (type1[1] == 'x' && type2[0] == 'f') {\ /* exit from */ \ hypre__target_free_count ++; \ hypre__target_free_bytes += offload_bytes; \ hypre__target_dtoh_count ++; \ hypre__target_dtoh_bytes += offload_bytes; \ _Pragma (HYPRE_XSTR(omp target exit data map(from:hypre__offload_hptr[hypre__offload_offset:hypre__offload_size]))) \ } else if (type1[1] == 'p' && type2[0] == 't') { \ /* update to */ \ hypre__target_htod_count ++; \ hypre__target_htod_bytes += offload_bytes; \ _Pragma (HYPRE_XSTR(omp target update to(hypre__offload_hptr[hypre__offload_offset:hypre__offload_size]))) \ } else if (type1[1] == 'p' && type2[0] == 'f') {\ /* update from */ \ hypre__target_dtoh_count ++; \ hypre__target_dtoh_bytes += offload_bytes; \ _Pragma (HYPRE_XSTR(omp target update from(hypre__offload_hptr[hypre__offload_offset:hypre__offload_size]))) \ } else {\ printf("error: unrecognized offloading type combination!\n"); exit(-1); \ } \ } \ } \ } HYPRE_Int HYPRE_OMPOffload(HYPRE_Int device, void *ptr, size_t num, const char *type1, const char *type2); HYPRE_Int HYPRE_OMPPtrIsMapped(void *p, HYPRE_Int device_num); HYPRE_Int HYPRE_OMPOffloadOn(void); HYPRE_Int HYPRE_OMPOffloadOff(void); HYPRE_Int HYPRE_OMPOffloadStatPrint(void); #endif /* HYPRE_USING_DEVICE_OPENMP */ #endif /* HYPRE_OMP_DEVICE_H */ /****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #ifndef hypre_THREADING_HEADER #define hypre_THREADING_HEADER #ifdef HYPRE_USING_OPENMP HYPRE_Int hypre_NumThreads( void ); HYPRE_Int hypre_NumActiveThreads( void ); HYPRE_Int hypre_GetThreadNum( void ); void hypre_SetNumThreads(HYPRE_Int nt); #else #define hypre_NumThreads() 1 #define hypre_NumActiveThreads() 1 #define hypre_GetThreadNum() 0 #define hypre_SetNumThreads(x) #endif void hypre_GetSimpleThreadPartition( HYPRE_Int *begin, HYPRE_Int *end, HYPRE_Int n ); #endif /****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * Header file for doing timing * *****************************************************************************/ #ifndef HYPRE_TIMING_HEADER #define HYPRE_TIMING_HEADER #include #include #include #ifdef __cplusplus extern "C" { #endif /*-------------------------------------------------------------------------- * Prototypes for low-level timing routines *--------------------------------------------------------------------------*/ /* timer.c */ HYPRE_Real time_getWallclockSeconds( void ); HYPRE_Real time_getCPUSeconds( void ); HYPRE_Real time_get_wallclock_seconds_( void ); HYPRE_Real time_get_cpu_seconds_( void ); /*-------------------------------------------------------------------------- * With timing off *--------------------------------------------------------------------------*/ #ifndef HYPRE_TIMING #define hypre_InitializeTiming(name) 0 #define hypre_FinalizeTiming(index) #define hypre_FinalizeAllTimings() #define hypre_IncFLOPCount(inc) #define hypre_BeginTiming(i) #define hypre_EndTiming(i) #define hypre_PrintTiming(heading, comm) #define hypre_ClearTiming() #define hypre_GetTiming(heading, comm, time) /*-------------------------------------------------------------------------- * With timing on *--------------------------------------------------------------------------*/ #else /*------------------------------------------------------- * Global timing structure *-------------------------------------------------------*/ typedef struct { HYPRE_Real *wall_time; HYPRE_Real *cpu_time; HYPRE_Real *flops; char **name; HYPRE_Int *state; /* boolean flag to allow for recursive timing */ HYPRE_Int *num_regs; /* count of how many times a name is registered */ HYPRE_Int num_names; HYPRE_Int size; HYPRE_Real wall_count; HYPRE_Real CPU_count; HYPRE_Real FLOP_count; } hypre_TimingType; #ifdef HYPRE_TIMING_GLOBALS hypre_TimingType *hypre_global_timing = NULL; #else extern hypre_TimingType *hypre_global_timing; #endif /*------------------------------------------------------- * Accessor functions *-------------------------------------------------------*/ #define hypre_TimingWallTime(i) (hypre_global_timing -> wall_time[(i)]) #define hypre_TimingCPUTime(i) (hypre_global_timing -> cpu_time[(i)]) #define hypre_TimingFLOPS(i) (hypre_global_timing -> flops[(i)]) #define hypre_TimingName(i) (hypre_global_timing -> name[(i)]) #define hypre_TimingState(i) (hypre_global_timing -> state[(i)]) #define hypre_TimingNumRegs(i) (hypre_global_timing -> num_regs[(i)]) #define hypre_TimingWallCount (hypre_global_timing -> wall_count) #define hypre_TimingCPUCount (hypre_global_timing -> CPU_count) #define hypre_TimingFLOPCount (hypre_global_timing -> FLOP_count) /*------------------------------------------------------- * Prototypes *-------------------------------------------------------*/ /* timing.c */ HYPRE_Int hypre_InitializeTiming( const char *name ); HYPRE_Int hypre_FinalizeTiming( HYPRE_Int time_index ); HYPRE_Int hypre_FinalizeAllTimings( void ); HYPRE_Int hypre_IncFLOPCount( HYPRE_BigInt inc ); HYPRE_Int hypre_BeginTiming( HYPRE_Int time_index ); HYPRE_Int hypre_EndTiming( HYPRE_Int time_index ); HYPRE_Int hypre_ClearTiming( void ); HYPRE_Int hypre_PrintTiming( const char *heading, MPI_Comm comm ); HYPRE_Int hypre_GetTiming( const char *heading, HYPRE_Real *wall_time_ptr, MPI_Comm comm ); #endif #ifdef __cplusplus } #endif #endif /****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * Header file link lists * *****************************************************************************/ #ifndef HYPRE_LINKLIST_HEADER #define HYPRE_LINKLIST_HEADER #include #include #include #ifdef __cplusplus extern "C" { #endif struct double_linked_list { HYPRE_Int data; struct double_linked_list *next_elt; struct double_linked_list *prev_elt; HYPRE_Int head; HYPRE_Int tail; }; typedef struct double_linked_list hypre_ListElement; typedef hypre_ListElement *hypre_LinkList; #ifdef __cplusplus } #endif #endif /****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #ifndef hypre_EXCHANGE_DATA_HEADER #define hypre_EXCHANGE_DATA_HEADER #define hypre_BinaryTreeParentId(tree) (tree->parent_id) #define hypre_BinaryTreeNumChild(tree) (tree->num_child) #define hypre_BinaryTreeChildIds(tree) (tree->child_id) #define hypre_BinaryTreeChildId(tree, i) (tree->child_id[i]) typedef struct { HYPRE_Int parent_id; HYPRE_Int num_child; HYPRE_Int *child_id; } hypre_BinaryTree; /* In the fill_response() function the user needs to set the recv__buf and the response_message_size. Memory of size send_response_storage has been alllocated for the send_buf (in exchange_data) - if more is needed, then realloc and adjust the send_response_storage. The realloc amount should be storage+overhead. If the response is an empty "confirmation" message, then set response_message_size =0 (and do not modify the send_buf) */ typedef struct { HYPRE_Int (*fill_response)(void* recv_buf, HYPRE_Int contact_size, HYPRE_Int contact_proc, void* response_obj, MPI_Comm comm, void** response_buf, HYPRE_Int* response_message_size); HYPRE_Int send_response_overhead; /*set by exchange data */ HYPRE_Int send_response_storage; /*storage allocated for send_response_buf*/ void *data1; /*data fields user may want to access in fill_response */ void *data2; } hypre_DataExchangeResponse; HYPRE_Int hypre_CreateBinaryTree(HYPRE_Int, HYPRE_Int, hypre_BinaryTree**); HYPRE_Int hypre_DestroyBinaryTree(hypre_BinaryTree*); HYPRE_Int hypre_DataExchangeList(HYPRE_Int num_contacts, HYPRE_Int *contact_proc_list, void *contact_send_buf, HYPRE_Int *contact_send_buf_starts, HYPRE_Int contact_obj_size, HYPRE_Int response_obj_size, hypre_DataExchangeResponse *response_obj, HYPRE_Int max_response_size, HYPRE_Int rnum, MPI_Comm comm, void **p_response_recv_buf, HYPRE_Int **p_response_recv_buf_starts); #endif /* end of header */ /****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * Header file for Caliper instrumentation macros * *****************************************************************************/ #ifndef CALIPER_INSTRUMENTATION_HEADER #define CALIPER_INSTRUMENTATION_HEADER #include "HYPRE_config.h" #ifdef HYPRE_USING_CALIPER #ifdef __cplusplus extern "C++" { #endif #include #ifdef __cplusplus } #endif #define HYPRE_ANNOTATE_FUNC_BEGIN CALI_MARK_FUNCTION_BEGIN #define HYPRE_ANNOTATE_FUNC_END CALI_MARK_FUNCTION_END #define HYPRE_ANNOTATE_LOOP_BEGIN(id, str) CALI_MARK_LOOP_BEGIN(id, str) #define HYPRE_ANNOTATE_LOOP_END(id) CALI_MARK_LOOP_END(id) #define HYPRE_ANNOTATE_ITER_BEGIN(id, it) CALI_MARK_ITERATION_BEGIN(id, it) #define HYPRE_ANNOTATE_ITER_END(id) CALI_MARK_ITERATION_END(id) #define HYPRE_ANNOTATE_REGION_BEGIN(...)\ {\ char hypre__markname[1024];\ hypre_sprintf(hypre__markname, __VA_ARGS__);\ CALI_MARK_BEGIN(hypre__markname);\ } #define HYPRE_ANNOTATE_REGION_END(...)\ {\ char hypre__markname[1024];\ hypre_sprintf(hypre__markname, __VA_ARGS__);\ CALI_MARK_END(hypre__markname);\ } #define HYPRE_ANNOTATE_MGLEVEL_BEGIN(lvl)\ {\ char hypre__levelname[16];\ hypre_sprintf(hypre__levelname, "MG level %d", lvl);\ CALI_MARK_BEGIN(hypre__levelname);\ } #define HYPRE_ANNOTATE_MGLEVEL_END(lvl)\ {\ char hypre__levelname[16];\ hypre_sprintf(hypre__levelname, "MG level %d", lvl);\ CALI_MARK_END(hypre__levelname);\ } #else #define HYPRE_ANNOTATE_FUNC_BEGIN #define HYPRE_ANNOTATE_FUNC_END #define HYPRE_ANNOTATE_LOOP_BEGIN(id, str) #define HYPRE_ANNOTATE_LOOP_END(id) #define HYPRE_ANNOTATE_ITER_BEGIN(id, it) #define HYPRE_ANNOTATE_ITER_END(id) #define HYPRE_ANNOTATE_REGION_BEGIN(...) #define HYPRE_ANNOTATE_REGION_END(...) #define HYPRE_ANNOTATE_MAX_MGLEVEL(lvl) #define HYPRE_ANNOTATE_MGLEVEL_BEGIN(lvl) #define HYPRE_ANNOTATE_MGLEVEL_END(lvl) #endif #endif /* CALIPER_INSTRUMENTATION_HEADER */ /****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #ifndef HYPRE_GSELIM_H #define HYPRE_GSELIM_H #define hypre_gselim(A,x,n,error) \ { \ HYPRE_Int j,k,m; \ HYPRE_Real factor; \ HYPRE_Real divA; \ error = 0; \ if (n == 1) /* A is 1x1 */ \ { \ if (A[0] != 0.0) \ { \ x[0] = x[0]/A[0]; \ } \ else \ { \ error++; \ } \ } \ else/* A is nxn. Forward elimination */ \ { \ for (k = 0; k < n-1; k++) \ { \ if (A[k*n+k] != 0.0) \ { \ divA = 1.0/A[k*n+k]; \ for (j = k+1; j < n; j++) \ { \ if (A[j*n+k] != 0.0) \ { \ factor = A[j*n+k]*divA; \ for (m = k+1; m < n; m++) \ { \ A[j*n+m] -= factor * A[k*n+m]; \ } \ x[j] -= factor * x[k]; \ } \ } \ } \ } \ /* Back Substitution */ \ for (k = n-1; k > 0; --k) \ { \ if (A[k*n+k] != 0.0) \ { \ x[k] /= A[k*n+k]; \ for (j = 0; j < k; j++) \ { \ if (A[j*n+k] != 0.0) \ { \ x[j] -= x[k] * A[j*n+k]; \ } \ } \ } \ } \ if (A[0] != 0.0) x[0] /= A[0]; \ } \ } #endif /* #ifndef HYPRE_GSELIM_H */ /****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * Header file for hypre_IntArray struct for holding an array of integers * *****************************************************************************/ #ifndef hypre_INTARRAY_HEADER #define hypre_INTARRAY_HEADER /*-------------------------------------------------------------------------- * hypre_IntArray *--------------------------------------------------------------------------*/ typedef struct { /* pointer to data and size of data */ HYPRE_Int *data; HYPRE_Int size; /* memory location of array data */ HYPRE_MemoryLocation memory_location; } hypre_IntArray; /*-------------------------------------------------------------------------- * Accessor functions for the IntArray structure *--------------------------------------------------------------------------*/ #define hypre_IntArrayData(array) ((array) -> data) #define hypre_IntArrayDataI(array, i) ((array) -> data[i]) #define hypre_IntArraySize(array) ((array) -> size) #define hypre_IntArrayMemoryLocation(array) ((array) -> memory_location) /****************************************************************************** * * hypre_IntArrayArray: struct for holding an array of hypre_IntArray * *****************************************************************************/ /*-------------------------------------------------------------------------- * hypre_IntArrayArray *--------------------------------------------------------------------------*/ typedef struct { hypre_IntArray **entries; HYPRE_Int size; } hypre_IntArrayArray; /*-------------------------------------------------------------------------- * Accessor functions for the IntArrayArray structure *--------------------------------------------------------------------------*/ #define hypre_IntArrayArrayEntries(array) ((array) -> entries) #define hypre_IntArrayArrayEntryI(array, i) ((array) -> entries[i]) #define hypre_IntArrayArrayEntryIData(array, i) ((array) -> entries[i] -> data) #define hypre_IntArrayArrayEntryIDataJ(array, i, j) ((array) -> entries[i] -> data[j]) #define hypre_IntArrayArraySize(array) ((array) -> size) #endif /****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /* amg_linklist.c */ void hypre_dispose_elt ( hypre_LinkList element_ptr ); void hypre_remove_point ( hypre_LinkList *LoL_head_ptr, hypre_LinkList *LoL_tail_ptr, HYPRE_Int measure, HYPRE_Int index, HYPRE_Int *lists, HYPRE_Int *where ); hypre_LinkList hypre_create_elt ( HYPRE_Int Item ); void hypre_enter_on_lists ( hypre_LinkList *LoL_head_ptr, hypre_LinkList *LoL_tail_ptr, HYPRE_Int measure, HYPRE_Int index, HYPRE_Int *lists, HYPRE_Int *where ); /* binsearch.c */ HYPRE_Int hypre_BinarySearch ( HYPRE_Int *list, HYPRE_Int value, HYPRE_Int list_length ); HYPRE_Int hypre_BigBinarySearch ( HYPRE_BigInt *list, HYPRE_BigInt value, HYPRE_Int list_length ); HYPRE_Int hypre_BinarySearch2 ( HYPRE_Int *list, HYPRE_Int value, HYPRE_Int low, HYPRE_Int high, HYPRE_Int *spot ); HYPRE_Int *hypre_LowerBound( HYPRE_Int *first, HYPRE_Int *last, HYPRE_Int value ); HYPRE_BigInt *hypre_BigLowerBound( HYPRE_BigInt *first, HYPRE_BigInt *last, HYPRE_BigInt value ); /* log.c */ HYPRE_Int hypre_Log2( HYPRE_Int p ); /* complex.c */ #ifdef HYPRE_COMPLEX HYPRE_Complex hypre_conj( HYPRE_Complex value ); HYPRE_Real hypre_cabs( HYPRE_Complex value ); HYPRE_Real hypre_creal( HYPRE_Complex value ); HYPRE_Real hypre_cimag( HYPRE_Complex value ); HYPRE_Complex hypre_csqrt( HYPRE_Complex value ); #else #define hypre_conj(value) value #define hypre_cabs(value) hypre_abs(value) #define hypre_creal(value) value #define hypre_cimag(value) 0.0 #define hypre_csqrt(value) hypre_sqrt(value) #endif /* state.c */ HYPRE_Int hypre_Initialized( void ); HYPRE_Int hypre_Finalized( void ); HYPRE_Int hypre_SetInitialized( void ); HYPRE_Int hypre_SetFinalized( void ); /* general.c */ hypre_Handle* hypre_handle(void); hypre_Handle* hypre_HandleCreate(void); HYPRE_Int hypre_HandleDestroy(hypre_Handle *hypre_handle_); HYPRE_Int hypre_SetDevice(hypre_int device_id, hypre_Handle *hypre_handle_); HYPRE_Int hypre_GetDevice(hypre_int *device_id); HYPRE_Int hypre_GetDeviceCount(hypre_int *device_count); HYPRE_Int hypre_GetDeviceLastError(void); HYPRE_Int hypre_GetDeviceMaxShmemSize(hypre_int device_id, hypre_int *max_size_ptr, hypre_int *max_size_optin_ptr); /* matrix_stats.h */ hypre_MatrixStats* hypre_MatrixStatsCreate( void ); HYPRE_Int hypre_MatrixStatsDestroy( hypre_MatrixStats *stats ); hypre_MatrixStatsArray* hypre_MatrixStatsArrayCreate( HYPRE_Int capacity ); HYPRE_Int hypre_MatrixStatsArrayDestroy( hypre_MatrixStatsArray *stats_array ); HYPRE_Int hypre_MatrixStatsArrayPrint( HYPRE_Int num_hierarchies, HYPRE_Int *num_levels, HYPRE_Int use_divisors, HYPRE_Int shift, const char **messages, hypre_MatrixStatsArray *stats_array ); /* qsort.c */ void hypre_swap ( HYPRE_Int *v, HYPRE_Int i, HYPRE_Int j ); void hypre_swap_c ( HYPRE_Complex *v, HYPRE_Int i, HYPRE_Int j ); void hypre_swap2 ( HYPRE_Int *v, HYPRE_Real *w, HYPRE_Int i, HYPRE_Int j ); void hypre_BigSwap2 ( HYPRE_BigInt *v, HYPRE_Real *w, HYPRE_Int i, HYPRE_Int j ); void hypre_swap2i ( HYPRE_Int *v, HYPRE_Int *w, HYPRE_Int i, HYPRE_Int j ); void hypre_BigSwap2i ( HYPRE_BigInt *v, HYPRE_Int *w, HYPRE_Int i, HYPRE_Int j ); void hypre_swap3i ( HYPRE_Int *v, HYPRE_Int *w, HYPRE_Int *z, HYPRE_Int i, HYPRE_Int j ); void hypre_swap3_d ( HYPRE_Real *v, HYPRE_Int *w, HYPRE_Int *z, HYPRE_Int i, HYPRE_Int j ); void hypre_swap3_d_perm(HYPRE_Int *v, HYPRE_Real *w, HYPRE_Int *z, HYPRE_Int i, HYPRE_Int j ); void hypre_BigSwap4_d ( HYPRE_Real *v, HYPRE_BigInt *w, HYPRE_Int *z, HYPRE_Int *y, HYPRE_Int i, HYPRE_Int j ); void hypre_swap_d ( HYPRE_Real *v, HYPRE_Int i, HYPRE_Int j ); void hypre_qsort0 ( HYPRE_Int *v, HYPRE_Int left, HYPRE_Int right ); void hypre_qsort1 ( HYPRE_Int *v, HYPRE_Real *w, HYPRE_Int left, HYPRE_Int right ); void hypre_BigQsort1 ( HYPRE_BigInt *v, HYPRE_Real *w, HYPRE_Int left, HYPRE_Int right ); void hypre_qsort2i ( HYPRE_Int *v, HYPRE_Int *w, HYPRE_Int left, HYPRE_Int right ); void hypre_BigQsort2i( HYPRE_BigInt *v, HYPRE_Int *w, HYPRE_Int left, HYPRE_Int right ); void hypre_qsort2 ( HYPRE_Int *v, HYPRE_Real *w, HYPRE_Int left, HYPRE_Int right ); void hypre_qsort2_abs ( HYPRE_Int *v, HYPRE_Real *w, HYPRE_Int left, HYPRE_Int right ); void hypre_qsort3i ( HYPRE_Int *v, HYPRE_Int *w, HYPRE_Int *z, HYPRE_Int left, HYPRE_Int right ); void hypre_qsort3ir ( HYPRE_Int *v, HYPRE_Real *w, HYPRE_Int *z, HYPRE_Int left, HYPRE_Int right ); void hypre_qsort3( HYPRE_Real *v, HYPRE_Int *w, HYPRE_Int *z, HYPRE_Int left, HYPRE_Int right ); void hypre_qsort3_abs ( HYPRE_Real *v, HYPRE_Int *w, HYPRE_Int *z, HYPRE_Int left, HYPRE_Int right ); void hypre_BigQsort4_abs ( HYPRE_Real *v, HYPRE_BigInt *w, HYPRE_Int *z, HYPRE_Int *y, HYPRE_Int left, HYPRE_Int right ); void hypre_qsort_abs ( HYPRE_Real *w, HYPRE_Int left, HYPRE_Int right ); void hypre_BigSwapbi(HYPRE_BigInt *v, HYPRE_Int *w, HYPRE_Int i, HYPRE_Int j ); void hypre_BigQsortbi( HYPRE_BigInt *v, HYPRE_Int *w, HYPRE_Int left, HYPRE_Int right ); void hypre_BigSwapLoc(HYPRE_BigInt *v, HYPRE_Int *w, HYPRE_Int i, HYPRE_Int j ); void hypre_BigQsortbLoc( HYPRE_BigInt *v, HYPRE_Int *w, HYPRE_Int left, HYPRE_Int right ); void hypre_BigSwapb2i(HYPRE_BigInt *v, HYPRE_Int *w, HYPRE_Int *z, HYPRE_Int i, HYPRE_Int j ); void hypre_BigQsortb2i( HYPRE_BigInt *v, HYPRE_Int *w, HYPRE_Int *z, HYPRE_Int left, HYPRE_Int right ); void hypre_BigSwap( HYPRE_BigInt *v, HYPRE_Int i, HYPRE_Int j ); void hypre_BigQsort0( HYPRE_BigInt *v, HYPRE_Int left, HYPRE_Int right ); void hypre_topo_sort(const HYPRE_Int *row_ptr, const HYPRE_Int *col_inds, const HYPRE_Complex *data, HYPRE_Int *ordering, HYPRE_Int n); void hypre_dense_topo_sort(const HYPRE_Complex *L, HYPRE_Int *ordering, HYPRE_Int n, HYPRE_Int is_col_major); /* qsplit.c */ HYPRE_Int hypre_DoubleQuickSplit ( HYPRE_Real *values, HYPRE_Int *indices, HYPRE_Int list_length, HYPRE_Int NumberKept ); /* random.c */ /* HYPRE_CUDA_GLOBAL */ void hypre_SeedRand ( HYPRE_Int seed ); /* HYPRE_CUDA_GLOBAL */ HYPRE_Int hypre_RandI ( void ); /* HYPRE_CUDA_GLOBAL */ HYPRE_Real hypre_Rand ( void ); /* prefix_sum.c */ /** * Assumed to be called within an omp region. * Let x_i be the input of ith thread. * The output of ith thread y_i = x_0 + x_1 + ... + x_{i-1} * Additionally, sum = x_0 + x_1 + ... + x_{nthreads - 1} * Note that always y_0 = 0 * * @param workspace at least with length (nthreads+1) * workspace[tid] will contain result for tid * workspace[nthreads] will contain sum */ void hypre_prefix_sum(HYPRE_Int *in_out, HYPRE_Int *sum, HYPRE_Int *workspace); /** * This version does prefix sum in pair. * Useful when we prefix sum of diag and offd in tandem. * * @param worksapce at least with length 2*(nthreads+1) * workspace[2*tid] and workspace[2*tid+1] will contain results for tid * workspace[3*nthreads] and workspace[3*nthreads + 1] will contain sums */ void hypre_prefix_sum_pair(HYPRE_Int *in_out1, HYPRE_Int *sum1, HYPRE_Int *in_out2, HYPRE_Int *sum2, HYPRE_Int *workspace); /** * @param workspace at least with length 3*(nthreads+1) * workspace[3*tid:3*tid+3) will contain results for tid */ void hypre_prefix_sum_triple(HYPRE_Int *in_out1, HYPRE_Int *sum1, HYPRE_Int *in_out2, HYPRE_Int *sum2, HYPRE_Int *in_out3, HYPRE_Int *sum3, HYPRE_Int *workspace); /** * n prefix-sums together. * workspace[n*tid:n*(tid+1)) will contain results for tid * workspace[nthreads*tid:nthreads*(tid+1)) will contain sums * * @param workspace at least with length n*(nthreads+1) */ void hypre_prefix_sum_multiple(HYPRE_Int *in_out, HYPRE_Int *sum, HYPRE_Int n, HYPRE_Int *workspace); /* hopscotch_hash.c */ #ifdef HYPRE_USING_OPENMP /* Check if atomic operations are available to use concurrent hopscotch hash table */ #if defined(__GNUC__) && defined(__GNUC_MINOR__) && defined(__GNUC_PATCHLEVEL__) && (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__) > 40100 #define HYPRE_USING_ATOMIC //#elif defined _MSC_VER // JSP: haven't tested, so comment out for now //#define HYPRE_USING_ATOMIC //#elif defined(__STDC_VERSION__) && __STDC_VERSION__ >= 201112L && !defined(__STDC_NO_ATOMICS__) // JSP: not many compilers have implemented this, so comment out for now //#define HYPRE_USING_ATOMIC //#include #endif #endif // HYPRE_USING_OPENMP #ifdef HYPRE_USING_HOPSCOTCH #ifdef HYPRE_USING_ATOMIC // concurrent hopscotch hashing is possible only with atomic supports #define HYPRE_CONCURRENT_HOPSCOTCH #endif #endif #ifdef HYPRE_CONCURRENT_HOPSCOTCH typedef struct { HYPRE_Int volatile timestamp; omp_lock_t lock; } hypre_HopscotchSegment; #endif /** * The current typical use case of unordered set is putting input sequence * with lots of duplication (putting all colidx received from other ranks), * followed by one sweep of enumeration. * Since the capacity is set to the number of inputs, which is much larger * than the number of unique elements, we optimize for initialization and * enumeration whose time is proportional to the capacity. * For initialization and enumeration, structure of array (SoA) is better * for vectorization, cache line utilization, and so on. */ typedef struct { HYPRE_Int volatile segmentMask; HYPRE_Int volatile bucketMask; #ifdef HYPRE_CONCURRENT_HOPSCOTCH hypre_HopscotchSegment* volatile segments; #endif HYPRE_Int *volatile key; hypre_uint *volatile hopInfo; HYPRE_Int *volatile hash; } hypre_UnorderedIntSet; typedef struct { HYPRE_Int volatile segmentMask; HYPRE_Int volatile bucketMask; #ifdef HYPRE_CONCURRENT_HOPSCOTCH hypre_HopscotchSegment* volatile segments; #endif HYPRE_BigInt *volatile key; hypre_uint *volatile hopInfo; HYPRE_BigInt *volatile hash; } hypre_UnorderedBigIntSet; typedef struct { hypre_uint volatile hopInfo; HYPRE_Int volatile hash; HYPRE_Int volatile key; HYPRE_Int volatile data; } hypre_HopscotchBucket; typedef struct { hypre_uint volatile hopInfo; HYPRE_BigInt volatile hash; HYPRE_BigInt volatile key; HYPRE_Int volatile data; } hypre_BigHopscotchBucket; /** * The current typical use case of unoredered map is putting input sequence * with no duplication (inverse map of a bijective mapping) followed by * lots of lookups. * For lookup, array of structure (AoS) gives better cache line utilization. */ typedef struct { HYPRE_Int volatile segmentMask; HYPRE_Int volatile bucketMask; #ifdef HYPRE_CONCURRENT_HOPSCOTCH hypre_HopscotchSegment* volatile segments; #endif hypre_HopscotchBucket* volatile table; } hypre_UnorderedIntMap; typedef struct { HYPRE_Int volatile segmentMask; HYPRE_Int volatile bucketMask; #ifdef HYPRE_CONCURRENT_HOPSCOTCH hypre_HopscotchSegment* volatile segments; #endif hypre_BigHopscotchBucket* volatile table; } hypre_UnorderedBigIntMap; /* merge_sort.c */ /** * Why merge sort? * 1) Merge sort can take advantage of eliminating duplicates. * 2) Merge sort is more efficiently parallelizable than qsort */ HYPRE_Int hypre_IntArrayMergeOrdered( hypre_IntArray *array1, hypre_IntArray *array2, hypre_IntArray *array3 ); void hypre_union2(HYPRE_Int n1, HYPRE_BigInt *arr1, HYPRE_Int n2, HYPRE_BigInt *arr2, HYPRE_Int *n3, HYPRE_BigInt *arr3, HYPRE_Int *map1, HYPRE_Int *map2); void hypre_merge_sort(HYPRE_Int *in, HYPRE_Int *temp, HYPRE_Int len, HYPRE_Int **sorted); void hypre_big_merge_sort(HYPRE_BigInt *in, HYPRE_BigInt *temp, HYPRE_Int len, HYPRE_BigInt **sorted); void hypre_sort_and_create_inverse_map(HYPRE_Int *in, HYPRE_Int len, HYPRE_Int **out, hypre_UnorderedIntMap *inverse_map); void hypre_big_sort_and_create_inverse_map(HYPRE_BigInt *in, HYPRE_Int len, HYPRE_BigInt **out, hypre_UnorderedBigIntMap *inverse_map); /* device_utils.c */ #if defined(HYPRE_USING_GPU) HYPRE_Int hypre_DeviceMemoryGetUsage(HYPRE_Real *mem); HYPRE_Int hypre_ForceSyncComputeStream(); HYPRE_Int hypre_SyncComputeStream(); HYPRE_Int hypre_SyncDevice(); HYPRE_Int hypre_ResetDevice(); HYPRE_Int hypreDevice_DiagScaleVector(HYPRE_Int num_vectors, HYPRE_Int num_rows, HYPRE_Int *A_i, HYPRE_Complex *A_data, HYPRE_Complex *x, HYPRE_Complex beta, HYPRE_Complex *y); HYPRE_Int hypreDevice_DiagScaleVector2(HYPRE_Int num_vectors, HYPRE_Int num_rows, HYPRE_Complex *diag, HYPRE_Complex *x, HYPRE_Complex beta, HYPRE_Complex *y, HYPRE_Complex *z, HYPRE_Int computeY); HYPRE_Int hypreDevice_ComplexArrayToArrayOfPtrs(HYPRE_Int n, HYPRE_Int m, HYPRE_Complex *data, HYPRE_Complex **data_aop); HYPRE_Int hypreDevice_zeqxmydd(HYPRE_Int n, HYPRE_Complex *x, HYPRE_Complex alpha, HYPRE_Complex *y, HYPRE_Complex *z, HYPRE_Complex *d); HYPRE_Int hypreDevice_IVAXPY(HYPRE_Int n, HYPRE_Complex *a, HYPRE_Complex *x, HYPRE_Complex *y); HYPRE_Int hypreDevice_IVAXPYMarked(HYPRE_Int n, HYPRE_Complex *a, HYPRE_Complex *x, HYPRE_Complex *y, HYPRE_Int *marker, HYPRE_Int marker_val); HYPRE_Int hypreDevice_IVAMXPMY(HYPRE_Int m, HYPRE_Int n, HYPRE_Complex *a, HYPRE_Complex *x, HYPRE_Complex *y); HYPRE_Int hypreDevice_IntFilln(HYPRE_Int *d_x, size_t n, HYPRE_Int v); HYPRE_Int hypreDevice_BigIntFilln(HYPRE_BigInt *d_x, size_t n, HYPRE_BigInt v); HYPRE_Int hypreDevice_ComplexFilln(HYPRE_Complex *d_x, size_t n, HYPRE_Complex v); HYPRE_Int hypreDevice_CharFilln(char *d_x, size_t n, char v); HYPRE_Int hypreDevice_IntStridedCopy ( HYPRE_Int size, HYPRE_Int stride, HYPRE_Int *in, HYPRE_Int *out ); HYPRE_Int hypreDevice_ComplexStridedCopy ( HYPRE_Int size, HYPRE_Int stride, HYPRE_Complex *in, HYPRE_Complex *out ); HYPRE_Int hypreDevice_IntScalen(HYPRE_Int *d_x, size_t n, HYPRE_Int *d_y, HYPRE_Int v); HYPRE_Int hypreDevice_ComplexScalen(HYPRE_Complex *d_x, size_t n, HYPRE_Complex *d_y, HYPRE_Complex v); HYPRE_Int hypreDevice_ComplexAxpyn(HYPRE_Complex *d_x, size_t n, HYPRE_Complex *d_y, HYPRE_Complex *d_z, HYPRE_Complex a); HYPRE_Int hypreDevice_ComplexAxpyzn(HYPRE_Int n, HYPRE_Complex *d_x, HYPRE_Complex *d_y, HYPRE_Complex *d_z, HYPRE_Complex a, HYPRE_Complex b); HYPRE_Int hypreDevice_IntAxpyn(HYPRE_Int *d_x, size_t n, HYPRE_Int *d_y, HYPRE_Int *d_z, HYPRE_Int a); HYPRE_Int hypreDevice_BigIntAxpyn(HYPRE_BigInt *d_x, size_t n, HYPRE_BigInt *d_y, HYPRE_BigInt *d_z, HYPRE_BigInt a); HYPRE_Int* hypreDevice_CsrRowPtrsToIndices(HYPRE_Int nrows, HYPRE_Int nnz, HYPRE_Int *d_row_ptr); HYPRE_Int hypreDevice_CsrRowPtrsToIndices_v2(HYPRE_Int nrows, HYPRE_Int nnz, HYPRE_Int *d_row_ptr, HYPRE_Int *d_row_ind); HYPRE_Int* hypreDevice_CsrRowIndicesToPtrs(HYPRE_Int nrows, HYPRE_Int nnz, HYPRE_Int *d_row_ind); HYPRE_Int hypreDevice_CsrRowIndicesToPtrs_v2(HYPRE_Int nrows, HYPRE_Int nnz, HYPRE_Int *d_row_ind, HYPRE_Int *d_row_ptr); HYPRE_Int hypreDevice_GetRowNnz(HYPRE_Int nrows, HYPRE_Int *d_row_indices, HYPRE_Int *d_diag_ia, HYPRE_Int *d_offd_ia, HYPRE_Int *d_rownnz); HYPRE_Int hypreDevice_CopyParCSRRows(HYPRE_Int nrows, HYPRE_Int *d_row_indices, HYPRE_Int job, HYPRE_Int has_offd, HYPRE_BigInt first_col, HYPRE_BigInt *d_col_map_offd_A, HYPRE_Int *d_diag_i, HYPRE_Int *d_diag_j, HYPRE_Complex *d_diag_a, HYPRE_Int *d_offd_i, HYPRE_Int *d_offd_j, HYPRE_Complex *d_offd_a, HYPRE_Int *d_ib, HYPRE_BigInt *d_jb, HYPRE_Complex *d_ab); HYPRE_Int hypreDevice_IntegerReduceSum(HYPRE_Int m, HYPRE_Int *d_i); HYPRE_Complex hypreDevice_ComplexReduceSum(HYPRE_Int m, HYPRE_Complex *d_x); HYPRE_Int hypreDevice_IntegerInclusiveScan(HYPRE_Int n, HYPRE_Int *d_i); HYPRE_Int hypreDevice_IntegerExclusiveScan(HYPRE_Int n, HYPRE_Int *d_i); HYPRE_Int hypre_CudaCompileFlagCheck(void); #endif HYPRE_Int hypre_CurandUniform( HYPRE_Int n, HYPRE_Real *urand, HYPRE_Int set_seed, hypre_ulonglongint seed, HYPRE_Int set_offset, hypre_ulonglongint offset); HYPRE_Int hypre_CurandUniformSingle( HYPRE_Int n, float *urand, HYPRE_Int set_seed, hypre_ulonglongint seed, HYPRE_Int set_offset, hypre_ulonglongint offset); HYPRE_Int hypre_ResetDeviceRandGenerator( hypre_ulonglongint seed, hypre_ulonglongint offset ); HYPRE_Int hypre_bind_device_id(HYPRE_Int device_id_in, HYPRE_Int myid, HYPRE_Int nproc, MPI_Comm comm); HYPRE_Int hypre_bind_device(HYPRE_Int myid, HYPRE_Int nproc, MPI_Comm comm); /* stl_ops.c */ HYPRE_Int hypre_IntSequence(HYPRE_MemoryLocation memory_location, HYPRE_Int size, HYPRE_Int *data); /* nvtx.c */ void hypre_GpuProfilingPushRangeColor(const char *name, HYPRE_Int cid); void hypre_GpuProfilingPushRange(const char *name); void hypre_GpuProfilingPopRange(void); /* utilities.c */ HYPRE_Int hypre_multmod(HYPRE_Int a, HYPRE_Int b, HYPRE_Int mod); void hypre_partition1D(HYPRE_Int n, HYPRE_Int p, HYPRE_Int j, HYPRE_Int *s, HYPRE_Int *e); char *hypre_strcpy(char *destination, const char *source); HYPRE_Int hypre_CheckDirExists(const char *path); HYPRE_Int hypre_CreateDir(const char *path); HYPRE_Int hypre_CreateNextDirOfSequence(const char *basepath, const char *prefix, char **fullpath_ptr); char* hypre_ConvertIndicesToString(HYPRE_Int size, HYPRE_Int *indices); HYPRE_Int hypre_SetSyncCudaCompute(HYPRE_Int action); HYPRE_Int hypre_RestoreSyncCudaCompute(void); HYPRE_Int hypre_GetSyncCudaCompute(HYPRE_Int *cuda_compute_stream_sync_ptr); /* handle.c */ HYPRE_Int hypre_SetLogLevel( HYPRE_Int log_level ); HYPRE_Int hypre_SetSpTransUseVendor( HYPRE_Int use_vendor ); HYPRE_Int hypre_SetSpMVUseVendor( HYPRE_Int use_vendor ); HYPRE_Int hypre_SetSpGemmUseVendor( HYPRE_Int use_vendor ); HYPRE_Int hypre_SetSpGemmAlgorithm( HYPRE_Int value ); HYPRE_Int hypre_SetSpGemmBinned( HYPRE_Int value ); HYPRE_Int hypre_SetSpGemmRownnzEstimateMethod( HYPRE_Int value ); HYPRE_Int hypre_SetSpGemmRownnzEstimateNSamples( HYPRE_Int value ); HYPRE_Int hypre_SetSpGemmRownnzEstimateMultFactor( HYPRE_Real value ); HYPRE_Int hypre_SetSpGemmHashType( char value ); HYPRE_Int hypre_SetUseGpuRand( HYPRE_Int use_gpurand ); HYPRE_Int hypre_SetGaussSeidelMethod( HYPRE_Int gs_method ); HYPRE_Int hypre_SetUserDeviceMalloc(GPUMallocFunc func); HYPRE_Int hypre_SetUserDeviceMfree(GPUMfreeFunc func); HYPRE_Int hypre_SetGpuAwareMPI( HYPRE_Int use_gpu_aware_mpi ); HYPRE_Int hypre_GetGpuAwareMPI(void); /* int_array.c */ hypre_IntArray* hypre_IntArrayCreate( HYPRE_Int size ); HYPRE_Int hypre_IntArrayDestroy( hypre_IntArray *array ); HYPRE_Int hypre_IntArrayInitialize_v2( hypre_IntArray *array, HYPRE_MemoryLocation memory_location ); HYPRE_Int hypre_IntArrayInitialize( hypre_IntArray *array ); HYPRE_Int hypre_IntArrayCopy( hypre_IntArray *x, hypre_IntArray *y ); hypre_IntArray* hypre_IntArrayCloneDeep_v2( hypre_IntArray *x, HYPRE_MemoryLocation memory_location ); hypre_IntArray* hypre_IntArrayCloneDeep( hypre_IntArray *x ); HYPRE_Int hypre_IntArrayMigrate( hypre_IntArray *v, HYPRE_MemoryLocation memory_location ); HYPRE_Int hypre_IntArrayPrint( MPI_Comm comm, hypre_IntArray *array, const char *filename ); HYPRE_Int hypre_IntArrayRead( MPI_Comm comm, const char *filename, hypre_IntArray **array_ptr ); HYPRE_Int hypre_IntArraySetConstantValuesHost( hypre_IntArray *v, HYPRE_Int value ); HYPRE_Int hypre_IntArraySetConstantValues( hypre_IntArray *v, HYPRE_Int value ); HYPRE_Int hypre_IntArraySetInterleavedValues( hypre_IntArray *v, HYPRE_Int cycle ); HYPRE_Int hypre_IntArrayCountHost( hypre_IntArray *v, HYPRE_Int value, HYPRE_Int *num_values_ptr ); HYPRE_Int hypre_IntArrayCount( hypre_IntArray *v, HYPRE_Int value, HYPRE_Int *num_values_ptr ); HYPRE_Int hypre_IntArrayInverseMapping( hypre_IntArray *v, hypre_IntArray **w_ptr ); HYPRE_Int hypre_IntArrayNegate( hypre_IntArray *v ); HYPRE_Int hypre_IntArraySeparateByValue( HYPRE_Int num_values, HYPRE_Int *values, HYPRE_Int *sizes, hypre_IntArray *v, hypre_IntArrayArray **w_ptr ); hypre_IntArrayArray* hypre_IntArrayArrayCreate( HYPRE_Int num_entries, HYPRE_Int *sizes ); HYPRE_Int hypre_IntArrayArrayDestroy( hypre_IntArrayArray *w ); HYPRE_Int hypre_IntArrayArrayInitializeIn( hypre_IntArrayArray *w, HYPRE_MemoryLocation memory_location ); HYPRE_Int hypre_IntArrayArrayInitialize( hypre_IntArrayArray *w ); HYPRE_Int hypre_IntArrayArrayMigrate( hypre_IntArrayArray *w, HYPRE_MemoryLocation memory_location ); /* int_array_device.c */ #if defined(HYPRE_USING_GPU) || defined(HYPRE_USING_DEVICE_OPENMP) HYPRE_Int hypre_IntArraySetConstantValuesDevice( hypre_IntArray *v, HYPRE_Int value ); HYPRE_Int hypre_IntArrayCountDevice ( hypre_IntArray *v, HYPRE_Int value, HYPRE_Int *num_values_ptr ); HYPRE_Int hypre_IntArrayInverseMappingDevice( hypre_IntArray *v, hypre_IntArray *w ); HYPRE_Int hypre_IntArrayNegateDevice( hypre_IntArray *v ); HYPRE_Int hypre_IntArraySetInterleavedValuesDevice( hypre_IntArray *v, HYPRE_Int cycle ); HYPRE_Int hypre_IntArraySeparateByValueDevice( HYPRE_Int num_values, HYPRE_Int *values, HYPRE_Int *sizes, hypre_IntArray *v, hypre_IntArrayArray *w ); #endif /* memory_tracker.c */ #ifdef HYPRE_USING_MEMORY_TRACKER hypre_MemoryTracker* hypre_memory_tracker(void); hypre_MemoryTracker * hypre_MemoryTrackerCreate(void); void hypre_MemoryTrackerDestroy(hypre_MemoryTracker *tracker); void hypre_MemoryTrackerInsert1(const char *action, void *ptr, size_t nbytes, hypre_MemoryLocation memory_location, const char *filename, const char *function, HYPRE_Int line); void hypre_MemoryTrackerInsert2(const char *action, void *ptr, void *ptr2, size_t nbytes, hypre_MemoryLocation memory_location, hypre_MemoryLocation memory_location2, const char *filename, const char *function, HYPRE_Int line); HYPRE_Int hypre_PrintMemoryTracker( size_t *totl_bytes_o, size_t *peak_bytes_o, size_t *curr_bytes_o, HYPRE_Int do_print, const char *fname ); HYPRE_Int hypre_MemoryTrackerSetPrint(HYPRE_Int do_print); HYPRE_Int hypre_MemoryTrackerSetFileName(const char *file_name); #endif /* magma.c */ #if defined(HYPRE_USING_MAGMA) HYPRE_Int hypre_MagmaInitialize(void); HYPRE_Int hypre_MagmaFinalize(void); #endif /****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /** * Hopscotch hash is modified from the code downloaded from * https://sites.google.com/site/cconcurrencypackage/hopscotch-hashing * with the following terms of usage */ //////////////////////////////////////////////////////////////////////////////// //TERMS OF USAGE //------------------------------------------------------------------------------ // // Permission to use, copy, modify and distribute this software and // its documentation for any purpose is hereby granted without fee, // provided that due acknowledgments to the authors are provided and // this permission notice appears in all copies of the software. // The software is provided "as is". There is no warranty of any kind. // //Authors: // Maurice Herlihy // Brown University // and // Nir Shavit // Tel-Aviv University // and // Moran Tzafrir // Tel-Aviv University // // Date: July 15, 2008. // //////////////////////////////////////////////////////////////////////////////// // Programmer : Moran Tzafrir (MoranTza@gmail.com) // Modified : Jongsoo Park (jongsoo.park@intel.com) // Oct 1, 2015. // //////////////////////////////////////////////////////////////////////////////// #ifndef hypre_HOPSCOTCH_HASH_HEADER #define hypre_HOPSCOTCH_HASH_HEADER //#include #include #include #include //#include #ifdef HYPRE_USING_OPENMP #include #endif //#include "_hypre_utilities.h" // Potentially architecture specific features used here: // __sync_val_compare_and_swap #ifdef __cplusplus extern "C" { #endif /****************************************************************************** * This next section of code is here instead of in _hypre_utilities.h to get * around some portability issues with Visual Studio. By putting it here, we * can explicitly include this '.h' file in a few files in hypre and compile * them with C++ instead of C (VS does not support C99 'inline'). ******************************************************************************/ #ifdef HYPRE_USING_ATOMIC static inline HYPRE_MAYBE_UNUSED_FUNC HYPRE_Int hypre_compare_and_swap( HYPRE_Int *ptr, HYPRE_Int oldval, HYPRE_Int newval ) { #if defined(__GNUC__) && defined(__GNUC_MINOR__) && defined(__GNUC_PATCHLEVEL__) && (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__) > 40100 return __sync_val_compare_and_swap(ptr, oldval, newval); //#elif defind _MSC_VER //return _InterlockedCompareExchange((long *)ptr, newval, oldval); //#elif defined(__STDC_VERSION__) && __STDC_VERSION__ >= 201112L && !defined(__STDC_NO_ATOMICS__) // JSP: not many compilers have implemented this, so comment out for now //_Atomic HYPRE_Int *atomic_ptr = ptr; //atomic_compare_exchange_strong(atomic_ptr, &oldval, newval); //return oldval; #endif } static inline HYPRE_MAYBE_UNUSED_FUNC HYPRE_Int hypre_fetch_and_add( HYPRE_Int *ptr, HYPRE_Int value ) { #if defined(__GNUC__) && defined(__GNUC_MINOR__) && defined(__GNUC_PATCHLEVEL__) && (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__) > 40100 return __sync_fetch_and_add(ptr, value); //#elif defined _MSC_VER //return _InterlockedExchangeAdd((long *)ptr, value); //#elif defined(__STDC_VERSION__) && __STDC_VERSION__ >= 201112L && !defined(__STDC_NO_ATOMICS__) // JSP: not many compilers have implemented this, so comment out for now //_Atomic HYPRE_Int *atomic_ptr = ptr; //return atomic_fetch_add(atomic_ptr, value); #endif } #else // !HYPRE_USING_ATOMIC static inline HYPRE_MAYBE_UNUSED_FUNC HYPRE_Int hypre_compare_and_swap( HYPRE_Int *ptr, HYPRE_Int oldval, HYPRE_Int newval ) { if (*ptr == oldval) { *ptr = newval; return oldval; } else { return *ptr; } } static inline HYPRE_MAYBE_UNUSED_FUNC HYPRE_Int hypre_fetch_and_add( HYPRE_Int *ptr, HYPRE_Int value ) { HYPRE_Int oldval = *ptr; *ptr += value; return oldval; } #endif // !HYPRE_USING_ATOMIC /******************************************************************************/ // Constants ................................................................ #define HYPRE_HOPSCOTCH_HASH_HOP_RANGE (32) #define HYPRE_HOPSCOTCH_HASH_INSERT_RANGE (4*1024) #define HYPRE_HOPSCOTCH_HASH_EMPTY (0) #define HYPRE_HOPSCOTCH_HASH_BUSY (1) // Small Utilities .......................................................... static inline HYPRE_MAYBE_UNUSED_FUNC HYPRE_Int first_lsb_bit_indx( hypre_uint x ) { HYPRE_Int pos; #if defined(_MSC_VER) || defined(__MINGW64__) if (x == 0) { pos = 0; } else { for (pos = 1; !(x & 1); ++pos) { x >>= 1; } } #else pos = ffs(x); #endif return (pos - 1); } /** * hypre_Hash is adapted from xxHash with the following license. */ /* xxHash - Extremely Fast Hash algorithm Header File Copyright (C) 2012-2015, Yann Collet. BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php) Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * 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. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "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 THE COPYRIGHT OWNER OR 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. You can contact the author at : - xxHash source repository : https://github.com/Cyan4973/xxHash */ /*************************************** * Constants ***************************************/ #define HYPRE_XXH_PRIME32_1 2654435761U #define HYPRE_XXH_PRIME32_2 2246822519U #define HYPRE_XXH_PRIME32_3 3266489917U #define HYPRE_XXH_PRIME32_4 668265263U #define HYPRE_XXH_PRIME32_5 374761393U #define HYPRE_XXH_PRIME64_1 11400714785074694791ULL #define HYPRE_XXH_PRIME64_2 14029467366897019727ULL #define HYPRE_XXH_PRIME64_3 1609587929392839161ULL #define HYPRE_XXH_PRIME64_4 9650029242287828579ULL #define HYPRE_XXH_PRIME64_5 2870177450012600261ULL #define HYPRE_XXH_rotl32(x,r) ((x << r) | (x >> (32 - r))) #define HYPRE_XXH_rotl64(x,r) ((x << r) | (x >> (64 - r))) #if defined(HYPRE_MIXEDINT) || defined(HYPRE_BIGINT) static inline HYPRE_MAYBE_UNUSED_FUNC HYPRE_BigInt hypre_BigHash( HYPRE_BigInt input ) { hypre_ulonglongint h64 = HYPRE_XXH_PRIME64_5 + sizeof(input); hypre_ulonglongint k1 = input; k1 *= HYPRE_XXH_PRIME64_2; k1 = HYPRE_XXH_rotl64(k1, 31); k1 *= HYPRE_XXH_PRIME64_1; h64 ^= k1; h64 = HYPRE_XXH_rotl64(h64, 27) * HYPRE_XXH_PRIME64_1 + HYPRE_XXH_PRIME64_4; h64 ^= h64 >> 33; h64 *= HYPRE_XXH_PRIME64_2; h64 ^= h64 >> 29; h64 *= HYPRE_XXH_PRIME64_3; h64 ^= h64 >> 32; #ifndef NDEBUG if (HYPRE_HOPSCOTCH_HASH_EMPTY == h64) { hypre_printf("hash(%lld) = %d\n", h64, HYPRE_HOPSCOTCH_HASH_EMPTY); hypre_assert(HYPRE_HOPSCOTCH_HASH_EMPTY != h64); } #endif return h64; } #else static inline HYPRE_MAYBE_UNUSED_FUNC HYPRE_Int hypre_BigHash(HYPRE_Int input) { hypre_uint h32 = HYPRE_XXH_PRIME32_5 + sizeof(input); // 1665863975 is added to input so that // only -1073741824 gives HYPRE_HOPSCOTCH_HASH_EMPTY. // Hence, we're fine as long as key is non-negative. h32 += (input + 1665863975) * HYPRE_XXH_PRIME32_3; h32 = HYPRE_XXH_rotl32(h32, 17) * HYPRE_XXH_PRIME32_4; h32 ^= h32 >> 15; h32 *= HYPRE_XXH_PRIME32_2; h32 ^= h32 >> 13; h32 *= HYPRE_XXH_PRIME32_3; h32 ^= h32 >> 16; //hypre_assert(HYPRE_HOPSCOTCH_HASH_EMPTY != h32); return h32; } #endif #ifdef HYPRE_BIGINT static inline HYPRE_MAYBE_UNUSED_FUNC HYPRE_Int hypre_Hash(HYPRE_Int input) { hypre_ulonglongint h64 = HYPRE_XXH_PRIME64_5 + sizeof(input); hypre_ulonglongint k1 = input; k1 *= HYPRE_XXH_PRIME64_2; k1 = HYPRE_XXH_rotl64(k1, 31); k1 *= HYPRE_XXH_PRIME64_1; h64 ^= k1; h64 = HYPRE_XXH_rotl64(h64, 27) * HYPRE_XXH_PRIME64_1 + HYPRE_XXH_PRIME64_4; h64 ^= h64 >> 33; h64 *= HYPRE_XXH_PRIME64_2; h64 ^= h64 >> 29; h64 *= HYPRE_XXH_PRIME64_3; h64 ^= h64 >> 32; #ifndef NDEBUG if (HYPRE_HOPSCOTCH_HASH_EMPTY == h64) { hypre_printf("hash(%lld) = %d\n", h64, HYPRE_HOPSCOTCH_HASH_EMPTY); hypre_assert(HYPRE_HOPSCOTCH_HASH_EMPTY != h64); } #endif return h64; } #else static inline HYPRE_MAYBE_UNUSED_FUNC HYPRE_Int hypre_Hash(HYPRE_Int input) { hypre_uint h32 = HYPRE_XXH_PRIME32_5 + sizeof(input); // 1665863975 is added to input so that // only -1073741824 gives HYPRE_HOPSCOTCH_HASH_EMPTY. // Hence, we're fine as long as key is non-negative. h32 += (input + 1665863975) * HYPRE_XXH_PRIME32_3; h32 = HYPRE_XXH_rotl32(h32, 17) * HYPRE_XXH_PRIME32_4; h32 ^= h32 >> 15; h32 *= HYPRE_XXH_PRIME32_2; h32 ^= h32 >> 13; h32 *= HYPRE_XXH_PRIME32_3; h32 ^= h32 >> 16; //hypre_assert(HYPRE_HOPSCOTCH_HASH_EMPTY != h32); return h32; } #endif static inline HYPRE_MAYBE_UNUSED_FUNC void hypre_UnorderedIntSetFindCloserFreeBucket( hypre_UnorderedIntSet *s, #ifdef HYPRE_CONCURRENT_HOPSCOTCH hypre_HopscotchSegment *start_seg, #endif HYPRE_Int *free_bucket, HYPRE_Int *free_dist ) { HYPRE_Int move_bucket = *free_bucket - (HYPRE_HOPSCOTCH_HASH_HOP_RANGE - 1); HYPRE_Int move_free_dist; for (move_free_dist = HYPRE_HOPSCOTCH_HASH_HOP_RANGE - 1; move_free_dist > 0; --move_free_dist) { hypre_uint start_hop_info = s->hopInfo[move_bucket]; HYPRE_Int move_new_free_dist = -1; hypre_uint mask = 1; HYPRE_Int i; for (i = 0; i < move_free_dist; ++i, mask <<= 1) { if (mask & start_hop_info) { move_new_free_dist = i; break; } } if (-1 != move_new_free_dist) { #ifdef HYPRE_CONCURRENT_HOPSCOTCH hypre_HopscotchSegment* move_segment = &(s->segments[move_bucket & s->segmentMask]); if (start_seg != move_segment) { omp_set_lock(&move_segment->lock); } #endif if (start_hop_info == s->hopInfo[move_bucket]) { // new_free_bucket -> free_bucket and empty new_free_bucket HYPRE_Int new_free_bucket = move_bucket + move_new_free_dist; s->key[*free_bucket] = s->key[new_free_bucket]; s->hash[*free_bucket] = s->hash[new_free_bucket]; #ifdef HYPRE_CONCURRENT_HOPSCOTCH ++move_segment->timestamp; #pragma omp flush #endif s->hopInfo[move_bucket] |= (1U << move_free_dist); s->hopInfo[move_bucket] &= ~(1U << move_new_free_dist); *free_bucket = new_free_bucket; *free_dist -= move_free_dist - move_new_free_dist; #ifdef HYPRE_CONCURRENT_HOPSCOTCH if (start_seg != move_segment) { omp_unset_lock(&move_segment->lock); } #endif return; } #ifdef HYPRE_CONCURRENT_HOPSCOTCH if (start_seg != move_segment) { omp_unset_lock(&move_segment->lock); } #endif } ++move_bucket; } *free_bucket = -1; *free_dist = 0; } static inline HYPRE_MAYBE_UNUSED_FUNC void hypre_UnorderedBigIntSetFindCloserFreeBucket( hypre_UnorderedBigIntSet *s, #ifdef HYPRE_CONCURRENT_HOPSCOTCH hypre_HopscotchSegment *start_seg, #endif HYPRE_Int *free_bucket, HYPRE_Int *free_dist ) { HYPRE_Int move_bucket = *free_bucket - (HYPRE_HOPSCOTCH_HASH_HOP_RANGE - 1); HYPRE_Int move_free_dist; for (move_free_dist = HYPRE_HOPSCOTCH_HASH_HOP_RANGE - 1; move_free_dist > 0; --move_free_dist) { hypre_uint start_hop_info = s->hopInfo[move_bucket]; HYPRE_Int move_new_free_dist = -1; hypre_uint mask = 1; HYPRE_Int i; for (i = 0; i < move_free_dist; ++i, mask <<= 1) { if (mask & start_hop_info) { move_new_free_dist = i; break; } } if (-1 != move_new_free_dist) { #ifdef HYPRE_CONCURRENT_HOPSCOTCH hypre_HopscotchSegment* move_segment = &(s->segments[move_bucket & s->segmentMask]); if (start_seg != move_segment) { omp_set_lock(&move_segment->lock); } #endif if (start_hop_info == s->hopInfo[move_bucket]) { // new_free_bucket -> free_bucket and empty new_free_bucket HYPRE_Int new_free_bucket = move_bucket + move_new_free_dist; s->key[*free_bucket] = s->key[new_free_bucket]; s->hash[*free_bucket] = s->hash[new_free_bucket]; #ifdef HYPRE_CONCURRENT_HOPSCOTCH ++move_segment->timestamp; #pragma omp flush #endif s->hopInfo[move_bucket] |= (1U << move_free_dist); s->hopInfo[move_bucket] &= ~(1U << move_new_free_dist); *free_bucket = new_free_bucket; *free_dist -= move_free_dist - move_new_free_dist; #ifdef HYPRE_CONCURRENT_HOPSCOTCH if (start_seg != move_segment) { omp_unset_lock(&move_segment->lock); } #endif return; } #ifdef HYPRE_CONCURRENT_HOPSCOTCH if (start_seg != move_segment) { omp_unset_lock(&move_segment->lock); } #endif } ++move_bucket; } *free_bucket = -1; *free_dist = 0; } static inline HYPRE_MAYBE_UNUSED_FUNC void hypre_UnorderedIntMapFindCloserFreeBucket( hypre_UnorderedIntMap *m, #ifdef HYPRE_CONCURRENT_HOPSCOTCH hypre_HopscotchSegment *start_seg, #endif hypre_HopscotchBucket **free_bucket, HYPRE_Int *free_dist) { HYPRE_UNUSED_VAR(m); hypre_HopscotchBucket* move_bucket = *free_bucket - (HYPRE_HOPSCOTCH_HASH_HOP_RANGE - 1); HYPRE_Int move_free_dist; for (move_free_dist = HYPRE_HOPSCOTCH_HASH_HOP_RANGE - 1; move_free_dist > 0; --move_free_dist) { hypre_uint start_hop_info = move_bucket->hopInfo; HYPRE_Int move_new_free_dist = -1; hypre_uint mask = 1; HYPRE_Int i; for (i = 0; i < move_free_dist; ++i, mask <<= 1) { if (mask & start_hop_info) { move_new_free_dist = i; break; } } if (-1 != move_new_free_dist) { #ifdef HYPRE_CONCURRENT_HOPSCOTCH hypre_HopscotchSegment* move_segment = &(m->segments[(move_bucket - m->table) & m->segmentMask]); if (start_seg != move_segment) { omp_set_lock(&move_segment->lock); } #endif if (start_hop_info == move_bucket->hopInfo) { // new_free_bucket -> free_bucket and empty new_free_bucket hypre_HopscotchBucket* new_free_bucket = move_bucket + move_new_free_dist; (*free_bucket)->data = new_free_bucket->data; (*free_bucket)->key = new_free_bucket->key; (*free_bucket)->hash = new_free_bucket->hash; #ifdef HYPRE_CONCURRENT_HOPSCOTCH ++move_segment->timestamp; #pragma omp flush #endif move_bucket->hopInfo = move_bucket->hopInfo | (1U << move_free_dist); move_bucket->hopInfo = move_bucket->hopInfo & ~(1U << move_new_free_dist); *free_bucket = new_free_bucket; *free_dist -= move_free_dist - move_new_free_dist; #ifdef HYPRE_CONCURRENT_HOPSCOTCH if (start_seg != move_segment) { omp_unset_lock(&move_segment->lock); } #endif return; } #ifdef HYPRE_CONCURRENT_HOPSCOTCH if (start_seg != move_segment) { omp_unset_lock(&move_segment->lock); } #endif } ++move_bucket; } *free_bucket = NULL; *free_dist = 0; } static inline HYPRE_MAYBE_UNUSED_FUNC void hypre_UnorderedBigIntMapFindCloserFreeBucket( hypre_UnorderedBigIntMap *m, #ifdef HYPRE_CONCURRENT_HOPSCOTCH hypre_HopscotchSegment *start_seg, #endif hypre_BigHopscotchBucket **free_bucket, HYPRE_Int *free_dist) { HYPRE_UNUSED_VAR(m); hypre_BigHopscotchBucket* move_bucket = *free_bucket - (HYPRE_HOPSCOTCH_HASH_HOP_RANGE - 1); HYPRE_Int move_free_dist; for (move_free_dist = HYPRE_HOPSCOTCH_HASH_HOP_RANGE - 1; move_free_dist > 0; --move_free_dist) { hypre_uint start_hop_info = move_bucket->hopInfo; HYPRE_Int move_new_free_dist = -1; hypre_uint mask = 1; HYPRE_Int i; for (i = 0; i < move_free_dist; ++i, mask <<= 1) { if (mask & start_hop_info) { move_new_free_dist = i; break; } } if (-1 != move_new_free_dist) { #ifdef HYPRE_CONCURRENT_HOPSCOTCH hypre_HopscotchSegment* move_segment = &(m->segments[(move_bucket - m->table) & m->segmentMask]); if (start_seg != move_segment) { omp_set_lock(&move_segment->lock); } #endif if (start_hop_info == move_bucket->hopInfo) { // new_free_bucket -> free_bucket and empty new_free_bucket hypre_BigHopscotchBucket* new_free_bucket = move_bucket + move_new_free_dist; (*free_bucket)->data = new_free_bucket->data; (*free_bucket)->key = new_free_bucket->key; (*free_bucket)->hash = new_free_bucket->hash; #ifdef HYPRE_CONCURRENT_HOPSCOTCH ++move_segment->timestamp; #pragma omp flush #endif move_bucket->hopInfo = move_bucket->hopInfo | (1U << move_free_dist); move_bucket->hopInfo = move_bucket->hopInfo & ~(1U << move_new_free_dist); *free_bucket = new_free_bucket; *free_dist -= move_free_dist - move_new_free_dist; #ifdef HYPRE_CONCURRENT_HOPSCOTCH if (start_seg != move_segment) { omp_unset_lock(&move_segment->lock); } #endif return; } #ifdef HYPRE_CONCURRENT_HOPSCOTCH if (start_seg != move_segment) { omp_unset_lock(&move_segment->lock); } #endif } ++move_bucket; } *free_bucket = NULL; *free_dist = 0; } void hypre_UnorderedIntSetCreate( hypre_UnorderedIntSet *s, HYPRE_Int inCapacity, HYPRE_Int concurrencyLevel); void hypre_UnorderedBigIntSetCreate( hypre_UnorderedBigIntSet *s, HYPRE_Int inCapacity, HYPRE_Int concurrencyLevel); void hypre_UnorderedIntMapCreate( hypre_UnorderedIntMap *m, HYPRE_Int inCapacity, HYPRE_Int concurrencyLevel); void hypre_UnorderedBigIntMapCreate( hypre_UnorderedBigIntMap *m, HYPRE_Int inCapacity, HYPRE_Int concurrencyLevel); void hypre_UnorderedIntSetDestroy( hypre_UnorderedIntSet *s ); void hypre_UnorderedBigIntSetDestroy( hypre_UnorderedBigIntSet *s ); void hypre_UnorderedIntMapDestroy( hypre_UnorderedIntMap *m ); void hypre_UnorderedBigIntMapDestroy( hypre_UnorderedBigIntMap *m ); // Query Operations ......................................................... static inline HYPRE_MAYBE_UNUSED_FUNC HYPRE_Int hypre_UnorderedIntSetContains( hypre_UnorderedIntSet *s, HYPRE_Int key ) { //CALCULATE HASH .......................... #ifdef HYPRE_BIGINT HYPRE_Int hash = hypre_BigHash(key); #else HYPRE_Int hash = hypre_Hash(key); #endif //CHECK IF ALREADY CONTAIN ................ #ifdef HYPRE_CONCURRENT_HOPSCOTCH hypre_HopscotchSegment *segment = &s->segments[hash & s->segmentMask]; #endif HYPRE_Int bucket = hash & s->bucketMask; hypre_uint hopInfo = s->hopInfo[bucket]; if (0 == hopInfo) { return 0; } else if (1 == hopInfo ) { if (hash == s->hash[bucket] && key == s->key[bucket]) { return 1; } else { return 0; } } #ifdef HYPRE_CONCURRENT_HOPSCOTCH HYPRE_Int startTimestamp = segment->timestamp; #endif while (0 != hopInfo) { HYPRE_Int i = first_lsb_bit_indx(hopInfo); HYPRE_Int currElm = bucket + i; if (hash == s->hash[currElm] && key == s->key[currElm]) { return 1; } hopInfo &= ~(1U << i); } #ifdef HYPRE_CONCURRENT_HOPSCOTCH if (segment->timestamp == startTimestamp) { return 0; } #endif HYPRE_Int i; for (i = 0; i < HYPRE_HOPSCOTCH_HASH_HOP_RANGE; ++i) { if (hash == s->hash[bucket + i] && key == s->key[bucket + i]) { return 1; } } return 0; } static inline HYPRE_MAYBE_UNUSED_FUNC HYPRE_Int hypre_UnorderedBigIntSetContains( hypre_UnorderedBigIntSet *s, HYPRE_BigInt key ) { //CALCULATE HASH .......................... #if defined(HYPRE_BIGINT) || defined(HYPRE_MIXEDINT) HYPRE_BigInt hash = hypre_BigHash(key); #else HYPRE_BigInt hash = hypre_Hash(key); #endif //CHECK IF ALREADY CONTAIN ................ #ifdef HYPRE_CONCURRENT_HOPSCOTCH hypre_HopscotchSegment *segment = &s->segments[(HYPRE_Int)(hash & s->segmentMask)]; #endif HYPRE_Int bucket = (HYPRE_Int)(hash & s->bucketMask); hypre_uint hopInfo = s->hopInfo[bucket]; if (0 == hopInfo) { return 0; } else if (1 == hopInfo ) { if (hash == s->hash[bucket] && key == s->key[bucket]) { return 1; } else { return 0; } } #ifdef HYPRE_CONCURRENT_HOPSCOTCH HYPRE_Int startTimestamp = segment->timestamp; #endif while (0 != hopInfo) { HYPRE_Int i = first_lsb_bit_indx(hopInfo); HYPRE_Int currElm = bucket + i; if (hash == s->hash[currElm] && key == s->key[currElm]) { return 1; } hopInfo &= ~(1U << i); } #ifdef HYPRE_CONCURRENT_HOPSCOTCH if (segment->timestamp == startTimestamp) { return 0; } #endif HYPRE_Int i; for (i = 0; i < HYPRE_HOPSCOTCH_HASH_HOP_RANGE; ++i) { if (hash == s->hash[bucket + i] && key == s->key[bucket + i]) { return 1; } } return 0; } /** * @ret -1 if key doesn't exist */ static inline HYPRE_MAYBE_UNUSED_FUNC HYPRE_Int hypre_UnorderedIntMapGet( hypre_UnorderedIntMap *m, HYPRE_Int key ) { //CALCULATE HASH .......................... #ifdef HYPRE_BIGINT HYPRE_Int hash = hypre_BigHash(key); #else HYPRE_Int hash = hypre_Hash(key); #endif //CHECK IF ALREADY CONTAIN ................ #ifdef HYPRE_CONCURRENT_HOPSCOTCH hypre_HopscotchSegment *segment = &m->segments[hash & m->segmentMask]; #endif hypre_HopscotchBucket *elmAry = &(m->table[hash & m->bucketMask]); hypre_uint hopInfo = elmAry->hopInfo; if (0 == hopInfo) { return -1; } else if (1 == hopInfo ) { if (hash == elmAry->hash && key == elmAry->key) { return elmAry->data; } else { return -1; } } #ifdef HYPRE_CONCURRENT_HOPSCOTCH HYPRE_Int startTimestamp = segment->timestamp; #endif while (0 != hopInfo) { HYPRE_Int i = first_lsb_bit_indx(hopInfo); hypre_HopscotchBucket* currElm = elmAry + i; if (hash == currElm->hash && key == currElm->key) { return currElm->data; } hopInfo &= ~(1U << i); } #ifdef HYPRE_CONCURRENT_HOPSCOTCH if (segment->timestamp == startTimestamp) { return -1; } #endif hypre_HopscotchBucket *currBucket = &(m->table[hash & m->bucketMask]); HYPRE_Int i; for (i = 0; i < HYPRE_HOPSCOTCH_HASH_HOP_RANGE; ++i, ++currBucket) { if (hash == currBucket->hash && key == currBucket->key) { return currBucket->data; } } return -1; } static inline HYPRE_MAYBE_UNUSED_FUNC HYPRE_Int hypre_UnorderedBigIntMapGet( hypre_UnorderedBigIntMap *m, HYPRE_BigInt key ) { //CALCULATE HASH .......................... #if defined(HYPRE_BIGINT) || defined(HYPRE_MIXEDINT) HYPRE_BigInt hash = hypre_BigHash(key); #else HYPRE_BigInt hash = hypre_Hash(key); #endif //CHECK IF ALREADY CONTAIN ................ #ifdef HYPRE_CONCURRENT_HOPSCOTCH hypre_HopscotchSegment *segment = &m->segments[(HYPRE_Int)(hash & m->segmentMask)]; #endif hypre_BigHopscotchBucket *elmAry = &(m->table[(HYPRE_Int)(hash & m->bucketMask)]); hypre_uint hopInfo = elmAry->hopInfo; if (0 == hopInfo) { return -1; } else if (1 == hopInfo ) { if (hash == elmAry->hash && key == elmAry->key) { return elmAry->data; } else { return -1; } } #ifdef HYPRE_CONCURRENT_HOPSCOTCH HYPRE_Int startTimestamp = segment->timestamp; #endif while (0 != hopInfo) { HYPRE_Int i = first_lsb_bit_indx(hopInfo); hypre_BigHopscotchBucket* currElm = elmAry + i; if (hash == currElm->hash && key == currElm->key) { return currElm->data; } hopInfo &= ~(1U << i); } #ifdef HYPRE_CONCURRENT_HOPSCOTCH if (segment->timestamp == startTimestamp) { return -1; } #endif hypre_BigHopscotchBucket *currBucket = &(m->table[hash & m->bucketMask]); HYPRE_Int i; for (i = 0; i < HYPRE_HOPSCOTCH_HASH_HOP_RANGE; ++i, ++currBucket) { if (hash == currBucket->hash && key == currBucket->key) { return currBucket->data; } } return -1; } //status Operations ......................................................... static inline HYPRE_MAYBE_UNUSED_FUNC HYPRE_Int hypre_UnorderedIntSetSize( hypre_UnorderedIntSet *s ) { HYPRE_Int counter = 0; HYPRE_Int n = s->bucketMask + HYPRE_HOPSCOTCH_HASH_INSERT_RANGE; HYPRE_Int i; for (i = 0; i < n; ++i) { if (HYPRE_HOPSCOTCH_HASH_EMPTY != s->hash[i]) { ++counter; } } return counter; } static inline HYPRE_MAYBE_UNUSED_FUNC HYPRE_Int hypre_UnorderedBigIntSetSize( hypre_UnorderedBigIntSet *s ) { HYPRE_Int counter = 0; HYPRE_BigInt n = s->bucketMask + HYPRE_HOPSCOTCH_HASH_INSERT_RANGE; HYPRE_Int i; for (i = 0; i < n; ++i) { if (HYPRE_HOPSCOTCH_HASH_EMPTY != s->hash[i]) { ++counter; } } return counter; } static inline HYPRE_MAYBE_UNUSED_FUNC HYPRE_Int hypre_UnorderedIntMapSize( hypre_UnorderedIntMap *m ) { HYPRE_Int counter = 0; HYPRE_Int n = m->bucketMask + HYPRE_HOPSCOTCH_HASH_INSERT_RANGE; HYPRE_Int i; for (i = 0; i < n; ++i) { if ( HYPRE_HOPSCOTCH_HASH_EMPTY != m->table[i].hash ) { ++counter; } } return counter; } static inline HYPRE_MAYBE_UNUSED_FUNC HYPRE_Int hypre_UnorderedBigIntMapSize( hypre_UnorderedBigIntMap *m ) { HYPRE_Int counter = 0; HYPRE_Int n = m->bucketMask + HYPRE_HOPSCOTCH_HASH_INSERT_RANGE; HYPRE_Int i; for (i = 0; i < n; ++i) { if ( HYPRE_HOPSCOTCH_HASH_EMPTY != m->table[i].hash ) { ++counter; } } return counter; } HYPRE_Int *hypre_UnorderedIntSetCopyToArray( hypre_UnorderedIntSet *s, HYPRE_Int *len ); HYPRE_BigInt *hypre_UnorderedBigIntSetCopyToArray( hypre_UnorderedBigIntSet *s, HYPRE_Int *len ); //modification Operations ................................................... static inline HYPRE_MAYBE_UNUSED_FUNC void hypre_UnorderedIntSetPut( hypre_UnorderedIntSet *s, HYPRE_Int key ) { //CALCULATE HASH .......................... #ifdef HYPRE_BIGINT HYPRE_Int hash = hypre_BigHash(key); #else HYPRE_Int hash = hypre_Hash(key); #endif //LOCK KEY HASH ENTERY .................... #ifdef HYPRE_CONCURRENT_HOPSCOTCH hypre_HopscotchSegment *segment = &s->segments[hash & s->segmentMask]; omp_set_lock(&segment->lock); #endif HYPRE_Int bucket = hash & s->bucketMask; //CHECK IF ALREADY CONTAIN ................ hypre_uint hopInfo = s->hopInfo[bucket]; while (0 != hopInfo) { HYPRE_Int i = first_lsb_bit_indx(hopInfo); HYPRE_Int currElm = bucket + i; if (hash == s->hash[currElm] && key == s->key[currElm]) { #ifdef HYPRE_CONCURRENT_HOPSCOTCH omp_unset_lock(&segment->lock); #endif return; } hopInfo &= ~(1U << i); } //LOOK FOR FREE BUCKET .................... HYPRE_Int free_bucket = bucket; HYPRE_Int free_dist = 0; for ( ; free_dist < HYPRE_HOPSCOTCH_HASH_INSERT_RANGE; ++free_dist, ++free_bucket) { if ( (HYPRE_HOPSCOTCH_HASH_EMPTY == s->hash[free_bucket]) && (HYPRE_HOPSCOTCH_HASH_EMPTY == hypre_compare_and_swap((HYPRE_Int *)&s->hash[free_bucket], (HYPRE_Int)HYPRE_HOPSCOTCH_HASH_EMPTY, (HYPRE_Int)HYPRE_HOPSCOTCH_HASH_BUSY)) ) { break; } } //PLACE THE NEW KEY ....................... if (free_dist < HYPRE_HOPSCOTCH_HASH_INSERT_RANGE) { do { if (free_dist < HYPRE_HOPSCOTCH_HASH_HOP_RANGE) { s->key[free_bucket] = key; s->hash[free_bucket] = hash; s->hopInfo[bucket] |= 1U << free_dist; #ifdef HYPRE_CONCURRENT_HOPSCOTCH omp_unset_lock(&segment->lock); #endif return; } hypre_UnorderedIntSetFindCloserFreeBucket(s, #ifdef HYPRE_CONCURRENT_HOPSCOTCH segment, #endif &free_bucket, &free_dist); } while (-1 != free_bucket); } //NEED TO RESIZE .......................... hypre_error_w_msg(HYPRE_ERROR_GENERIC, "ERROR - RESIZE is not implemented\n"); /*fprintf(stderr, "ERROR - RESIZE is not implemented\n");*/ exit(1); return; } static inline HYPRE_MAYBE_UNUSED_FUNC void hypre_UnorderedBigIntSetPut( hypre_UnorderedBigIntSet *s, HYPRE_BigInt key ) { //CALCULATE HASH .......................... #if defined(HYPRE_BIGINT) || defined(HYPRE_MIXEDINT) HYPRE_BigInt hash = hypre_BigHash(key); #else HYPRE_BigInt hash = hypre_Hash(key); #endif //LOCK KEY HASH ENTERY .................... #ifdef HYPRE_CONCURRENT_HOPSCOTCH hypre_HopscotchSegment *segment = &s->segments[hash & s->segmentMask]; omp_set_lock(&segment->lock); #endif HYPRE_Int bucket = (HYPRE_Int)(hash & s->bucketMask); //CHECK IF ALREADY CONTAIN ................ hypre_uint hopInfo = s->hopInfo[bucket]; while (0 != hopInfo) { HYPRE_Int i = first_lsb_bit_indx(hopInfo); HYPRE_Int currElm = bucket + i; if (hash == s->hash[currElm] && key == s->key[currElm]) { #ifdef HYPRE_CONCURRENT_HOPSCOTCH omp_unset_lock(&segment->lock); #endif return; } hopInfo &= ~(1U << i); } //LOOK FOR FREE BUCKET .................... HYPRE_Int free_bucket = bucket; HYPRE_Int free_dist = 0; for ( ; free_dist < HYPRE_HOPSCOTCH_HASH_INSERT_RANGE; ++free_dist, ++free_bucket) { if ( (HYPRE_HOPSCOTCH_HASH_EMPTY == s->hash[free_bucket]) && (HYPRE_HOPSCOTCH_HASH_EMPTY == hypre_compare_and_swap((HYPRE_Int *)&s->hash[free_bucket], (HYPRE_Int)HYPRE_HOPSCOTCH_HASH_EMPTY, (HYPRE_Int)HYPRE_HOPSCOTCH_HASH_BUSY)) ) { break; } } //PLACE THE NEW KEY ....................... if (free_dist < HYPRE_HOPSCOTCH_HASH_INSERT_RANGE) { do { if (free_dist < HYPRE_HOPSCOTCH_HASH_HOP_RANGE) { s->key[free_bucket] = key; s->hash[free_bucket] = hash; s->hopInfo[bucket] |= 1U << free_dist; #ifdef HYPRE_CONCURRENT_HOPSCOTCH omp_unset_lock(&segment->lock); #endif return; } hypre_UnorderedBigIntSetFindCloserFreeBucket(s, #ifdef HYPRE_CONCURRENT_HOPSCOTCH segment, #endif &free_bucket, &free_dist); } while (-1 != free_bucket); } //NEED TO RESIZE .......................... hypre_error_w_msg(HYPRE_ERROR_GENERIC, "ERROR - RESIZE is not implemented\n"); /*fprintf(stderr, "ERROR - RESIZE is not implemented\n");*/ exit(1); return; } static inline HYPRE_MAYBE_UNUSED_FUNC HYPRE_Int hypre_UnorderedIntMapPutIfAbsent( hypre_UnorderedIntMap *m, HYPRE_Int key, HYPRE_Int data ) { //CALCULATE HASH .......................... #ifdef HYPRE_BIGINT HYPRE_Int hash = hypre_BigHash(key); #else HYPRE_Int hash = hypre_Hash(key); #endif //LOCK KEY HASH ENTERY .................... #ifdef HYPRE_CONCURRENT_HOPSCOTCH hypre_HopscotchSegment *segment = &m->segments[hash & m->segmentMask]; omp_set_lock(&segment->lock); #endif hypre_HopscotchBucket* startBucket = &(m->table[hash & m->bucketMask]); //CHECK IF ALREADY CONTAIN ................ hypre_uint hopInfo = startBucket->hopInfo; while (0 != hopInfo) { HYPRE_Int i = first_lsb_bit_indx(hopInfo); hypre_HopscotchBucket* currElm = startBucket + i; if (hash == currElm->hash && key == currElm->key) { HYPRE_Int rc = currElm->data; #ifdef HYPRE_CONCURRENT_HOPSCOTCH omp_unset_lock(&segment->lock); #endif return rc; } hopInfo &= ~(1U << i); } //LOOK FOR FREE BUCKET .................... hypre_HopscotchBucket* free_bucket = startBucket; HYPRE_Int free_dist = 0; for ( ; free_dist < HYPRE_HOPSCOTCH_HASH_INSERT_RANGE; ++free_dist, ++free_bucket) { if ( (HYPRE_HOPSCOTCH_HASH_EMPTY == free_bucket->hash) && (HYPRE_HOPSCOTCH_HASH_EMPTY == hypre_compare_and_swap((HYPRE_Int *)&free_bucket->hash, (HYPRE_Int)HYPRE_HOPSCOTCH_HASH_EMPTY, (HYPRE_Int)HYPRE_HOPSCOTCH_HASH_BUSY)) ) { break; } } //PLACE THE NEW KEY ....................... if (free_dist < HYPRE_HOPSCOTCH_HASH_INSERT_RANGE) { do { if (free_dist < HYPRE_HOPSCOTCH_HASH_HOP_RANGE) { free_bucket->data = data; free_bucket->key = key; free_bucket->hash = hash; startBucket->hopInfo = startBucket->hopInfo | (1U << free_dist); #ifdef HYPRE_CONCURRENT_HOPSCOTCH omp_unset_lock(&segment->lock); #endif return HYPRE_HOPSCOTCH_HASH_EMPTY; } hypre_UnorderedIntMapFindCloserFreeBucket(m, #ifdef HYPRE_CONCURRENT_HOPSCOTCH segment, #endif &free_bucket, &free_dist); } while (NULL != free_bucket); } //NEED TO RESIZE .......................... hypre_error_w_msg(HYPRE_ERROR_GENERIC, "ERROR - RESIZE is not implemented\n"); /*fprintf(stderr, "ERROR - RESIZE is not implemented\n");*/ exit(1); return HYPRE_HOPSCOTCH_HASH_EMPTY; } static inline HYPRE_MAYBE_UNUSED_FUNC HYPRE_Int hypre_UnorderedBigIntMapPutIfAbsent( hypre_UnorderedBigIntMap *m, HYPRE_BigInt key, HYPRE_Int data) { //CALCULATE HASH .......................... #if defined(HYPRE_BIGINT) || defined(HYPRE_MIXEDINT) HYPRE_BigInt hash = hypre_BigHash(key); #else HYPRE_BigInt hash = hypre_Hash(key); #endif //LOCK KEY HASH ENTERY .................... #ifdef HYPRE_CONCURRENT_HOPSCOTCH hypre_HopscotchSegment *segment = &m->segments[hash & m->segmentMask]; omp_set_lock(&segment->lock); #endif hypre_BigHopscotchBucket* startBucket = &(m->table[hash & m->bucketMask]); //CHECK IF ALREADY CONTAIN ................ hypre_uint hopInfo = startBucket->hopInfo; while (0 != hopInfo) { HYPRE_Int i = first_lsb_bit_indx(hopInfo); hypre_BigHopscotchBucket* currElm = startBucket + i; if (hash == currElm->hash && key == currElm->key) { HYPRE_Int rc = currElm->data; #ifdef HYPRE_CONCURRENT_HOPSCOTCH omp_unset_lock(&segment->lock); #endif return rc; } hopInfo &= ~(1U << i); } //LOOK FOR FREE BUCKET .................... hypre_BigHopscotchBucket* free_bucket = startBucket; HYPRE_Int free_dist = 0; for ( ; free_dist < HYPRE_HOPSCOTCH_HASH_INSERT_RANGE; ++free_dist, ++free_bucket) { if ( (HYPRE_HOPSCOTCH_HASH_EMPTY == free_bucket->hash) && (HYPRE_HOPSCOTCH_HASH_EMPTY == hypre_compare_and_swap((HYPRE_Int *)&free_bucket->hash, (HYPRE_Int)HYPRE_HOPSCOTCH_HASH_EMPTY, (HYPRE_Int)HYPRE_HOPSCOTCH_HASH_BUSY)) ) { break; } } //PLACE THE NEW KEY ....................... if (free_dist < HYPRE_HOPSCOTCH_HASH_INSERT_RANGE) { do { if (free_dist < HYPRE_HOPSCOTCH_HASH_HOP_RANGE) { free_bucket->data = data; free_bucket->key = key; free_bucket->hash = hash; startBucket->hopInfo = startBucket->hopInfo | (1U << free_dist); #ifdef HYPRE_CONCURRENT_HOPSCOTCH omp_unset_lock(&segment->lock); #endif return HYPRE_HOPSCOTCH_HASH_EMPTY; } hypre_UnorderedBigIntMapFindCloserFreeBucket(m, #ifdef HYPRE_CONCURRENT_HOPSCOTCH segment, #endif &free_bucket, &free_dist); } while (NULL != free_bucket); } //NEED TO RESIZE .......................... hypre_error_w_msg(HYPRE_ERROR_GENERIC, "ERROR - RESIZE is not implemented\n"); /*fprintf(stderr, "ERROR - RESIZE is not implemented\n");*/ exit(1); return HYPRE_HOPSCOTCH_HASH_EMPTY; } #ifdef __cplusplus } // extern "C" #endif #endif // hypre_HOPSCOTCH_HASH_HEADER /****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /* * Matrix Market I/O library for ANSI C * * See http://math.nist.gov/MatrixMarket for details. * * */ #ifndef MM_IO_H #define MM_IO_H #define MM_MAX_LINE_LENGTH 1025 #define MatrixMarketBanner "%%MatrixMarket" #define MM_MAX_TOKEN_LENGTH 64 typedef char MM_typecode[4]; HYPRE_Int hypre_mm_is_valid(MM_typecode matcode); /* too complex for a macro */ HYPRE_Int hypre_mm_read_banner(FILE *f, MM_typecode *matcode); HYPRE_Int hypre_mm_read_mtx_crd_size(FILE *f, HYPRE_Int *M, HYPRE_Int *N, HYPRE_Int *nz); /********************* MM_typecode query fucntions ***************************/ #define hypre_mm_is_matrix(typecode) ((typecode)[0]=='M') #define hypre_mm_is_sparse(typecode) ((typecode)[1]=='C') #define hypre_mm_is_coordinate(typecode)((typecode)[1]=='C') #define hypre_mm_is_dense(typecode) ((typecode)[1]=='A') #define hypre_mm_is_array(typecode) ((typecode)[1]=='A') #define hypre_mm_is_complex(typecode) ((typecode)[2]=='C') #define hypre_mm_is_real(typecode) ((typecode)[2]=='R') #define hypre_mm_is_pattern(typecode) ((typecode)[2]=='P') #define hypre_mm_is_integer(typecode) ((typecode)[2]=='I') #define hypre_mm_is_symmetric(typecode)((typecode)[3]=='S') #define hypre_mm_is_general(typecode) ((typecode)[3]=='G') #define hypre_mm_is_skew(typecode) ((typecode)[3]=='K') #define hypre_mm_is_hermitian(typecode)((typecode)[3]=='H') /********************* MM_typecode modify fucntions ***************************/ #define hypre_mm_set_matrix(typecode) ((*typecode)[0]='M') #define hypre_mm_set_coordinate(typecode) ((*typecode)[1]='C') #define hypre_mm_set_array(typecode) ((*typecode)[1]='A') #define hypre_mm_set_dense(typecode) hypre_mm_set_array(typecode) #define hypre_mm_set_sparse(typecode) hypre_mm_set_coordinate(typecode) #define hypre_mm_set_complex(typecode)((*typecode)[2]='C') #define hypre_mm_set_real(typecode) ((*typecode)[2]='R') #define hypre_mm_set_pattern(typecode)((*typecode)[2]='P') #define hypre_mm_set_integer(typecode)((*typecode)[2]='I') #define hypre_mm_set_symmetric(typecode)((*typecode)[3]='S') #define hypre_mm_set_general(typecode) ((*typecode)[3]='G') #define hypre_mm_set_skew(typecode) ((*typecode)[3]='K') #define hypre_mm_set_hermitian(typecode)((*typecode)[3]='H') #define hypre_mm_clear_typecode(typecode) ((*typecode)[0]=(*typecode)[1]= \ (*typecode)[2]=' ',(*typecode)[3]='G') #define hypre_mm_initialize_typecode(typecode) hypre_mm_clear_typecode(typecode) /********************* Matrix Market error codes ***************************/ #define MM_COULD_NOT_READ_FILE 11 #define MM_PREMATURE_EOF 12 #define MM_NOT_MTX 13 #define MM_NO_HEADER 14 #define MM_UNSUPPORTED_TYPE 15 #define MM_LINE_TOO_LONG 16 #define MM_COULD_NOT_WRITE_FILE 17 /******************** Matrix Market internal definitions ******************** MM_matrix_typecode: 4-character sequence object sparse/data storage dense type scheme string position: [0] [1] [2] [3] Matrix typecode: M(atrix) C(oord) R(eal) G(eneral) A(array) C(omplex) H(ermitian) P(attern) S(ymmetric) I(nteger) K(kew) ***********************************************************************/ #define MM_MTX_STR "matrix" #define MM_ARRAY_STR "array" #define MM_DENSE_STR "array" #define MM_COORDINATE_STR "coordinate" #define MM_SPARSE_STR "coordinate" #define MM_COMPLEX_STR "complex" #define MM_REAL_STR "real" #define MM_INT_STR "integer" #define MM_GENERAL_STR "general" #define MM_SYMM_STR "symmetric" #define MM_HERM_STR "hermitian" #define MM_SKEW_STR "skew-symmetric" #define MM_PATTERN_STR "pattern" /* high level routines */ #endif #ifdef __cplusplus } #endif #endif hypre-2.33.0/src/utilities/_hypre_utilities.hpp000066400000000000000000003527011477326011500216400ustar00rootroot00000000000000 /*** DO NOT EDIT THIS FILE DIRECTLY (use 'headers' to generate) ***/ #ifndef hypre_UTILITIES_HPP #define hypre_UTILITIES_HPP #ifdef __cplusplus extern "C++" { #endif /****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #ifndef HYPRE_FUNCTORS_H #define HYPRE_FUNCTORS_H #if defined(HYPRE_USING_CUDA) || defined(HYPRE_USING_HIP) /*-------------------------------------------------------------------------- * hypreFunctor_DenseMatrixIdentity * * Functor for generating a dense identity matrix. * This assumes that the input array "a" is zeros everywhere *--------------------------------------------------------------------------*/ struct hypreFunctor_DenseMatrixIdentity { HYPRE_Int n_; HYPRE_Real *a_; hypreFunctor_DenseMatrixIdentity(HYPRE_Int n, HYPRE_Real *a) { n_ = n; a_ = a; } __host__ __device__ void operator()(HYPRE_Int i) { a_[i * n_ + i] = 1.0; } }; /*-------------------------------------------------------------------------- * hypreFunctor_ArrayStridedAccess * * Functor for performing strided data access on a templated array. * * The stride interval "s_" is used to access every "s_"-th element * from the source array "a_". * * It is templated to support various data types for the array. *--------------------------------------------------------------------------*/ template struct hypreFunctor_ArrayStridedAccess { HYPRE_Int s_; T *a_; hypreFunctor_ArrayStridedAccess(HYPRE_Int s, T *a) : s_(s), a_(a) {} __host__ __device__ T operator()(HYPRE_Int i) { return a_[i * s_]; } }; /*-------------------------------------------------------------------------- * hypreFunctor_IndexStrided * * This functor multiplies a given index "i" by a specified stride "s_". * * It is templated to support various data types for the index and stride. *--------------------------------------------------------------------------*/ template struct hypreFunctor_IndexStrided { T s_; hypreFunctor_IndexStrided(T s) : s_(s) {} __host__ __device__ T operator()(const T i) const { return i * s_; } }; /*-------------------------------------------------------------------------- * hypreFunctor_IndexCycle *--------------------------------------------------------------------------*/ struct hypreFunctor_IndexCycle { HYPRE_Int cycle_length; hypreFunctor_IndexCycle(HYPRE_Int _cycle_length) : cycle_length(_cycle_length) {} __host__ __device__ HYPRE_Int operator()(HYPRE_Int i) const { return i % cycle_length; } }; #endif /* if defined(HYPRE_USING_CUDA) || defined(HYPRE_USING_HIP) */ #endif /* ifndef HYPRE_FUNCTORS_H */ /****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #ifndef HYPRE_PREDICATES_H #define HYPRE_PREDICATES_H /****************************************************************************** * * Header file defining predicates for thrust used throughout hypre * *****************************************************************************/ #if defined(HYPRE_USING_CUDA) || defined(HYPRE_USING_HIP) /*-------------------------------------------------------------------------- * hyprePred_StridedAccess * * This struct defines a predicate for strided access in array-like data. * * It is used to determine if an element at a given index should be processed * or not, based on a specified stride. The operator() returns true when the * index is a multiple of the stride, indicating the element at that index * is part of the strided subset. *--------------------------------------------------------------------------*/ struct hyprePred_StridedAccess { HYPRE_Int s_; hyprePred_StridedAccess(HYPRE_Int s) : s_(s) {} __host__ __device__ HYPRE_Int operator()(const HYPRE_Int i) const { return (!(i % s_)); } }; #endif /* if defined(HYPRE_USING_CUDA) || defined(HYPRE_USING_HIP) */ #endif /* ifndef HYPRE_PREDICATES_H */ /****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #ifndef DEVICE_ALLOCATOR_H #define DEVICE_ALLOCATOR_H #if defined(HYPRE_USING_CUDA) || defined(HYPRE_USING_HIP) /* C++ style memory allocator for the device using the abstract memory model */ struct hypre_device_allocator { typedef char value_type; hypre_device_allocator() { // constructor } ~hypre_device_allocator() { // destructor } char *allocate(std::ptrdiff_t num_bytes) { return hypre_TAlloc(char, num_bytes, HYPRE_MEMORY_DEVICE); } void deallocate(char *ptr, size_t n) { HYPRE_UNUSED_VAR(n); hypre_TFree(ptr, HYPRE_MEMORY_DEVICE); } }; #endif /* #if defined(HYPRE_USING_CUDA) || defined(HYPRE_USING_HIP) */ #endif /****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #ifndef HYPRE_DEVICE_UTILS_H #define HYPRE_DEVICE_UTILS_H #if defined(HYPRE_USING_GPU) /* Data types depending on GPU architecture */ #if defined(HYPRE_USING_CUDA) || defined(HYPRE_USING_SYCL) typedef hypre_uint hypre_mask; #define hypre_mask_one 1U #elif defined(HYPRE_USING_HIP) typedef hypre_ulonglongint hypre_mask; #define hypre_mask_one 1ULL #endif /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - * cuda includes * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ #if defined(HYPRE_USING_CUDA) using hypre_DeviceItem = void*; #include #include #include #if defined(HYPRE_USING_CURAND) #include #endif #if defined(HYPRE_USING_CUBLAS) #include #endif #if defined(HYPRE_USING_CUSPARSE) /* Note (VPM) : As of cuSPARSE 12, ILU functionalities have been marked as deprecated. The following definition avoids compilation warnings regarding the use of ILU routines */ #define DISABLE_CUSPARSE_DEPRECATED #include #endif #if defined(HYPRE_USING_CUSOLVER) #include #endif #ifndef CUDART_VERSION #error CUDART_VERSION Undefined! #endif #ifndef CUDA_VERSION #error CUDA_VERSION Undefined! #endif #if CUDA_VERSION >= 11000 #define THRUST_IGNORE_DEPRECATED_CPP11 #define CUB_IGNORE_DEPRECATED_CPP11 #define THRUST_IGNORE_DEPRECATED_CPP_DIALECT #define CUB_IGNORE_DEPRECATED_CPP_DIALECT #endif #ifndef CUSPARSE_VERSION #if defined(CUSPARSE_VER_MAJOR) && defined(CUSPARSE_VER_MINOR) && defined(CUSPARSE_VER_PATCH) #define CUSPARSE_VERSION (CUSPARSE_VER_MAJOR * 1000 + CUSPARSE_VER_MINOR * 100 + CUSPARSE_VER_PATCH) #else #define CUSPARSE_VERSION CUDA_VERSION #endif #endif #define CUSPARSE_NEWAPI_VERSION 11000 #define CUSPARSE_NEWSPMM_VERSION 11401 #define CUDA_MALLOCASYNC_VERSION 11020 #define CUDA_THRUST_NOSYNC_VERSION 12000 #define CUSPARSE_SPSV_VERSION 11600 #if CUSPARSE_VERSION >= CUSPARSE_SPSV_VERSION #define hypre_cusparseSpSVDescr cusparseSpSVDescr_t #define hypre_cusparseSpSV_createDescr cusparseSpSV_createDescr #define hypre_cusparseSpSV_destroyDescr cusparseSpSV_destroyDescr #else #define hypre_cusparseSpSVDescr csrsv2Info_t #define hypre_cusparseSpSV_createDescr cusparseCreateCsrsv2Info #define hypre_cusparseSpSV_destroyDescr cusparseDestroyCsrsv2Info #endif #define CUSPARSE_SPSM_VERSION 11600 #if CUSPARSE_VERSION >= CUSPARSE_SPSM_VERSION #define hypre_cusparseSpSMDescr cusparseSpSMDescr_t #define hypre_cusparseSpSM_createDescr cusparseSpSM_createDescr #define hypre_cusparseSpSM_destroyDescr cusparseSpSM_destroyDescr #else #define hypre_cusparseSpSMDescr csrsm2Info_t #define hypre_cusparseSpSM_createDescr cusparseCreateCsrsm2Info #define hypre_cusparseSpSM_destroyDescr cusparseDestroyCsrsm2Info #endif #if defined(HYPRE_USING_DEVICE_MALLOC_ASYNC) #if CUDA_VERSION < CUDA_MALLOCASYNC_VERSION #error cudaMalloc/FreeAsync needs CUDA 11.2 #endif #endif #if defined(HYPRE_USING_THRUST_NOSYNC) #if CUDA_VERSION < CUDA_THRUST_NOSYNC_VERSION #error thrust::cuda::par_nosync needs CUDA 12 #endif #define HYPRE_THRUST_EXECUTION thrust::cuda::par_nosync #else #define HYPRE_THRUST_EXECUTION thrust::cuda::par #endif #endif /* defined(HYPRE_USING_CUDA) */ /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - * hip includes * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ #if defined(HYPRE_USING_HIP) using hypre_DeviceItem = void*; #include #if defined(HYPRE_USING_ROCBLAS) #include #endif #if defined(HYPRE_USING_ROCSPARSE) #include #if !defined(ROCSPARSE_VERSION) #define ROCSPARSE_VERSION (ROCSPARSE_VERSION_MAJOR * 100000 + ROCSPARSE_VERSION_MINOR * 100 + ROCSPARSE_VERSION_PATCH) #endif #endif #if defined(HYPRE_USING_ROCSOLVER) #include #endif #if defined(HYPRE_USING_ROCRAND) #include #endif #endif /* defined(HYPRE_USING_HIP) */ /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - * thrust includes * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ #if defined(HYPRE_USING_CUDA) || defined(HYPRE_USING_HIP) #include #if defined(HYPRE_USING_CUDA) #include #elif defined(HYPRE_USING_HIP) #include #endif #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include /* VPM: this is needed to support cuda 10. not_fn is the correct replacement going forward. */ #define THRUST_VERSION_NOTFN 200700 #if (defined(THRUST_VERSION) && THRUST_VERSION < THRUST_VERSION_NOTFN) #define HYPRE_THRUST_NOT(pred) thrust::not1(pred) #else #define HYPRE_THRUST_NOT(pred) thrust::not_fn(pred) #endif using namespace thrust::placeholders; #endif /* defined(HYPRE_USING_CUDA) || defined(HYPRE_USING_HIP) */ /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - * sycl includes * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ #if defined(HYPRE_USING_SYCL) #include #include #if defined(HYPRE_USING_ONEMKLSPARSE) #include #endif #if defined(HYPRE_USING_ONEMKLBLAS) #include #include #endif #if defined(HYPRE_USING_ONEMKLRAND) #include #endif /* The following definitions facilitate code reuse and limits * if/def-ing when unifying cuda/hip code with sycl code */ using dim3 = sycl::range<3>; using hypre_DeviceItem = sycl::nd_item<3>; #define __global__ #define __host__ #define __device__ #define __forceinline__ __inline__ __attribute__((always_inline)) #endif /* defined(HYPRE_USING_SYCL) */ /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - * device defined values * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ #define HYPRE_MAX_NTHREADS_BLOCK 1024 // HYPRE_WARP_BITSHIFT is just log2 of HYPRE_WARP_SIZE #if defined(HYPRE_USING_CUDA) || defined(HYPRE_USING_SYCL) #define HYPRE_WARP_SIZE 32 #define HYPRE_WARP_BITSHIFT 5 #define HYPRE_WARP_FULL_MASK 0xFFFFFFFF #elif defined(HYPRE_USING_HIP) #define HYPRE_WARP_SIZE 64 #define HYPRE_WARP_BITSHIFT 6 #define HYPRE_WARP_FULL_MASK 0xFFFFFFFFFFFFFFF #endif #define HYPRE_MAX_NUM_WARPS (64 * 64 * 32) #define HYPRE_FLT_LARGE 1e30 #define HYPRE_1D_BLOCK_SIZE 512 #define HYPRE_MAX_NUM_STREAMS 10 #define HYPRE_SPGEMM_MAX_NBIN 10 /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - * macro for launching GPU kernels * NOTE: IN HYPRE'S DEFAULT STREAM * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ #if defined(HYPRE_DEBUG) #define GPU_LAUNCH_SYNC { hypre_SyncComputeStream(); hypre_GetDeviceLastError(); } #else #define GPU_LAUNCH_SYNC #endif /* cuda/hip version */ #if defined(HYPRE_USING_CUDA) || defined(HYPRE_USING_HIP) #define HYPRE_GPU_LAUNCH2(kernel_name, gridsize, blocksize, shmem_size, ...) \ { \ if ( gridsize.x == 0 || gridsize.y == 0 || gridsize.z == 0 || \ blocksize.x == 0 || blocksize.y == 0 || blocksize.z == 0 ) \ { \ /* printf("Warning %s %d: Zero CUDA grid/block (%d %d %d) (%d %d %d)\n", \ __FILE__, __LINE__, \ gridsize.x, gridsize.y, gridsize.z, blocksize.x, blocksize.y, blocksize.z); */ \ } \ else \ { \ hypre_DeviceItem item = NULL; \ (kernel_name) <<< (gridsize), (blocksize), shmem_size, hypre_HandleComputeStream(hypre_handle()) >>> (item, __VA_ARGS__); \ GPU_LAUNCH_SYNC; \ } \ } #define HYPRE_GPU_LAUNCH(kernel_name, gridsize, blocksize, ...) HYPRE_GPU_LAUNCH2(kernel_name, gridsize, blocksize, 0, __VA_ARGS__) #endif /* defined(HYPRE_USING_CUDA) || defined(HYPRE_USING_HIP) */ /* sycl version */ #if defined(HYPRE_USING_SYCL) #define HYPRE_GPU_LAUNCH(kernel_name, gridsize, blocksize, ...) \ { \ if ( gridsize[2] == 0 || blocksize[2] == 0 ) \ { \ /* hypre_printf("Warning %s %d: Zero SYCL 1D launch parameters grid/block (%d) (%d)\n", \ __FILE__, __LINE__, \ gridsize[0], blocksize[0]); */ \ } \ else \ { \ hypre_HandleComputeStream(hypre_handle())->submit([&] (sycl::handler& cgh) { \ cgh.parallel_for(sycl::nd_range<3>(gridsize*blocksize, blocksize), \ [=] (hypre_DeviceItem item) [[intel::reqd_sub_group_size(HYPRE_WARP_SIZE)]] \ { (kernel_name)(item, __VA_ARGS__); \ }); \ }).wait_and_throw(); \ } \ } #define HYPRE_CPU_LAUNCH(kernel_name, gridsize, blocksize, ...) \ { \ if ( gridsize[2] == 0 || blocksize[2] == 0 ) \ { \ /* hypre_printf("Warning %s %d: Zero SYCL 1D launch parameters grid/block (%d) (%d)\n", \ __FILE__, __LINE__, \ gridsize[0], blocksize[0]); */ \ } \ else \ { \ HPYRE_Int compute_stream = hypre_HandleComputeStreamNum(hypre_handle()); \ hypre_HandleComputeStreamNum(hypre_handle) = HYPRE_MAX_NUM_STREAMS - 1; \ hypre_HandleComputeStream(hypre_handle())->submit([&] (sycl::handler& cgh) { \ cgh.parallel_for(sycl::nd_range<3>(gridsize*blocksize, blocksize), \ [=] (hypre_DeviceItem item) [[intel::reqd_sub_group_size(HYPRE_WARP_SIZE)]] \ { (kernel_name)(item, __VA_ARGS__); \ }); \ }).wait_and_throw(); \ hypre_HandleComputeStreamNum(hypre_handle) = compute_stream; \ } \ } #define HYPRE_GPU_LAUNCH2(kernel_name, gridsize, blocksize, shmem_size, ...) \ { \ if ( gridsize[2] == 0 || blocksize[2] == 0 ) \ { \ /* hypre_printf("Warning %s %d: Zero SYCL 1D launch parameters grid/block (%d) (%d)\n", \ __FILE__, __LINE__, \ gridsize[0], blocksize[0]); */ \ } \ else \ { \ hypre_HandleComputeStream(hypre_handle())->submit([&] (sycl::handler& cgh) { \ sycl::range<1> shmem_range(shmem_size); \ sycl::local_accessor shmem_accessor(shmem_range, cgh); \ cgh.parallel_for(sycl::nd_range<3>(gridsize*blocksize, blocksize), \ [=] (hypre_DeviceItem item) [[intel::reqd_sub_group_size(HYPRE_WARP_SIZE)]] \ { (kernel_name)(item, \ shmem_accessor.get_multi_ptr(), __VA_ARGS__);\ }); \ }).wait_and_throw(); \ } \ } #define HYPRE_GPU_DEBUG_LAUNCH(kernel_name, gridsize, blocksize, ...) \ { \ if ( gridsize[2] == 0 || blocksize[2] == 0 ) \ { \ /* hypre_printf("Warning %s %d: Zero SYCL 1D launch parameters grid/block (%d) (%d)\n", \ __FILE__, __LINE__, \ gridsize[0], blocksize[0]); */ \ } \ else \ { \ hypre_HandleComputeStream(hypre_handle())->submit([&] (sycl::handler& cgh) { \ auto debug_stream = sycl::stream(4096, 1024, cgh); \ cgh.parallel_for(sycl::nd_range<3>(gridsize*blocksize, blocksize), \ [=] (hypre_DeviceItem item) [[intel::reqd_sub_group_size(HYPRE_WARP_SIZE)]] \ { (kernel_name)(item, debug_stream, __VA_ARGS__); \ }); \ }).wait_and_throw(); \ } \ } #define HYPRE_GPU_DEBUG_LAUNCH2(kernel_name, gridsize, blocksize, shmem_size, ...) \ { \ if ( gridsize[2] == 0 || blocksize[2] == 0 ) \ { \ /* hypre_printf("Warning %s %d: Zero SYCL 1D launch parameters grid/block (%d) (%d)\n", \ __FILE__, __LINE__, \ gridsize[0], blocksize[0]); */ \ } \ else \ { \ hypre_HandleComputeStream(hypre_handle())->submit([&] (sycl::handler& cgh) { \ auto debug_stream = sycl::stream(4096, 1024, cgh); \ sycl::range<1> shmem_range(shmem_size); \ sycl::accessor shmem_accessor(shmem_range, cgh); \ cgh.parallel_for(sycl::nd_range<3>(gridsize*blocksize, blocksize), \ [=] (hypre_DeviceItem item) [[intel::reqd_sub_group_size(HYPRE_WARP_SIZE)]] \ { (kernel_name)(item, debug_stream, \ shmem_accessor.get_multi_ptr(), __VA_ARGS__);\ }); \ }).wait_and_throw(); \ } \ } #endif /* defined(HYPRE_USING_SYCL) */ /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - * macros for wrapping cuda/hip/sycl calls for error reporting * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ #if defined(HYPRE_USING_CUDA) #define HYPRE_CUDA_CALL(call) do { \ cudaError_t err = call; \ if (cudaSuccess != err) { \ printf("CUDA ERROR (code = %d, %s) at %s:%d\n", err, cudaGetErrorString(err), \ __FILE__, __LINE__); \ hypre_assert(0); \ } } while(0) #elif defined(HYPRE_USING_HIP) #define HYPRE_HIP_CALL(call) do { \ hipError_t err = call; \ if (hipSuccess != err) { \ printf("HIP ERROR (code = %d, %s) at %s:%d\n", err, hipGetErrorString(err), \ __FILE__, __LINE__); \ hypre_assert(0); \ } } while(0) #elif defined(HYPRE_USING_SYCL) #define HYPRE_SYCL_CALL(call) \ try \ { \ call; \ } \ catch (sycl::exception const &ex) \ { \ hypre_printf("SYCL ERROR (code = %s) at %s:%d\n", ex.what(), \ __FILE__, __LINE__); \ assert(0); \ } \ catch(std::runtime_error const& ex) \ { \ hypre_printf("STD ERROR (code = %s) at %s:%d\n", ex.what(), \ __FILE__, __LINE__); \ assert(0); \ } #endif /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - * macros for wrapping vendor library calls for error reporting * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ #if defined(HYPRE_COMPLEX) /* Double Complex */ #error "GPU build does not support complex numbers!" #elif defined(HYPRE_SINGLE) /* Single */ #if defined(HYPRE_USING_CUDA) /* cuBLAS */ #define hypre_cublas_scal cublasSscal #define hypre_cublas_axpy cublasSaxpy #define hypre_cublas_dot cublasSdot #define hypre_cublas_gemv cublasSgemv #define hypre_cublas_getrfBatched cublasSgetrfBatched #define hypre_cublas_getriBatched cublasSgetriBatched /* cuSPARSE */ #define hypre_cusparse_csru2csr_bufferSizeExt cusparseScsru2csr_bufferSizeExt #define hypre_cusparse_csru2csr cusparseScsru2csr #define hypre_cusparse_csrsv2_bufferSize cusparseScsrsv2_bufferSize #define hypre_cusparse_csrsv2_analysis cusparseScsrsv2_analysis #define hypre_cusparse_csrsv2_solve cusparseScsrsv2_solve #define hypre_cusparse_csrmv cusparseScsrmv #define hypre_cusparse_csrgemm cusparseScsrgemm #define hypre_cusparse_csr2csc cusparseScsr2csc #define hypre_cusparse_csrilu02_bufferSize cusparseScsrilu02_bufferSize #define hypre_cusparse_csrilu02_analysis cusparseScsrilu02_analysis #define hypre_cusparse_csrilu02 cusparseScsrilu02 #define hypre_cusparse_csrsm2_bufferSizeExt cusparseScsrsm2_bufferSizeExt #define hypre_cusparse_csrsm2_analysis cusparseScsrsm2_analysis #define hypre_cusparse_csrsm2_solve cusparseScsrsm2_solve /* cuSOLVER */ #define hypre_cusolver_dngetrf cusolverDnSgetrf #define hypre_cusolver_dngetrf_bs cusolverDnSgetrf_bufferSize #define hypre_cusolver_dngetrs cusolverDnSgetrs #elif defined(HYPRE_USING_HIP) /* rocSPARSE */ #define hypre_rocsparse_csrsv_buffer_size rocsparse_scsrsv_buffer_size #define hypre_rocsparse_csrsv_analysis rocsparse_scsrsv_analysis #define hypre_rocsparse_csrsv_solve rocsparse_scsrsv_solve #define hypre_rocsparse_gthr rocsparse_sgthr #define hypre_rocsparse_csrmv_analysis rocsparse_scsrmv_analysis #define hypre_rocsparse_csrmv rocsparse_scsrmv #define hypre_rocsparse_csrgemm_buffer_size rocsparse_scsrgemm_buffer_size #define hypre_rocsparse_csrgemm rocsparse_scsrgemm #define hypre_rocsparse_csr2csc rocsparse_scsr2csc #define hypre_rocsparse_csrilu0_buffer_size rocsparse_scsrilu0_buffer_size #define hypre_rocsparse_csrilu0_analysis rocsparse_scsrilu0_analysis #define hypre_rocsparse_csrilu0 rocsparse_scsrilu0 #define hypre_rocsparse_csritilu0_compute rocsparse_scsritilu0_compute #define hypre_rocsparse_csritilu0_history rocsparse_scsritilu0_history /* rocSOLVER */ /************** * TODO (VPM) * **************/ #endif /* if defined(HYPRE_USING_CUDA) || defined(HYPRE_USING_HIP) */ #elif defined(HYPRE_LONG_DOUBLE) /* Long Double */ #error "GPU build does not support Long Double numbers!" #else /* Double */ #if defined(HYPRE_USING_CUDA) /* cuBLAS */ #define hypre_cublas_scal cublasDscal #define hypre_cublas_axpy cublasDaxpy #define hypre_cublas_dot cublasDdot #define hypre_cublas_gemv cublasDgemv #define hypre_cublas_getrfBatched cublasDgetrfBatched #define hypre_cublas_getriBatched cublasDgetriBatched /* cuSPARSE */ #define hypre_cusparse_csru2csr_bufferSizeExt cusparseDcsru2csr_bufferSizeExt #define hypre_cusparse_csru2csr cusparseDcsru2csr #define hypre_cusparse_csrsv2_bufferSize cusparseDcsrsv2_bufferSize #define hypre_cusparse_csrsv2_analysis cusparseDcsrsv2_analysis #define hypre_cusparse_csrsv2_solve cusparseDcsrsv2_solve #define hypre_cusparse_csrmv cusparseDcsrmv #define hypre_cusparse_csrgemm cusparseDcsrgemm #define hypre_cusparse_csr2csc cusparseDcsr2csc #define hypre_cusparse_csrilu02_bufferSize cusparseDcsrilu02_bufferSize #define hypre_cusparse_csrilu02_analysis cusparseDcsrilu02_analysis #define hypre_cusparse_csrilu02 cusparseDcsrilu02 #define hypre_cusparse_csrsm2_bufferSizeExt cusparseDcsrsm2_bufferSizeExt #define hypre_cusparse_csrsm2_analysis cusparseDcsrsm2_analysis #define hypre_cusparse_csrsm2_solve cusparseDcsrsm2_solve /* cuSOLVER */ #define hypre_cusolver_dngetrf cusolverDnDgetrf #define hypre_cusolver_dngetrf_bs cusolverDnDgetrf_bufferSize #define hypre_cusolver_dngetrs cusolverDnDgetrs #elif defined(HYPRE_USING_HIP) /* rocSPARSE */ #define hypre_rocsparse_csrsv_buffer_size rocsparse_dcsrsv_buffer_size #define hypre_rocsparse_csrsv_analysis rocsparse_dcsrsv_analysis #define hypre_rocsparse_csrsv_solve rocsparse_dcsrsv_solve #define hypre_rocsparse_gthr rocsparse_dgthr #define hypre_rocsparse_csrmv_analysis rocsparse_dcsrmv_analysis #define hypre_rocsparse_csrmv rocsparse_dcsrmv #define hypre_rocsparse_csrgemm_buffer_size rocsparse_dcsrgemm_buffer_size #define hypre_rocsparse_csrgemm rocsparse_dcsrgemm #define hypre_rocsparse_csr2csc rocsparse_dcsr2csc #define hypre_rocsparse_csrilu0_buffer_size rocsparse_dcsrilu0_buffer_size #define hypre_rocsparse_csrilu0_analysis rocsparse_dcsrilu0_analysis #define hypre_rocsparse_csrilu0 rocsparse_dcsrilu0 #define hypre_rocsparse_csritilu0_compute rocsparse_dcsritilu0_compute #define hypre_rocsparse_csritilu0_history rocsparse_dcsritilu0_history /* rocSOLVER */ /************** * TODO (VPM) * **************/ #endif /* #if defined(HYPRE_USING_CUDA) || defined(HYPRE_USING_HIP)*/ #endif /* #if defined(HYPRE_COMPLEX) || defined(HYPRE_SINGLE) || defined(HYPRE_LONG_DOUBLE) */ #define HYPRE_CUBLAS_CALL(call) do { \ cublasStatus_t err = call; \ if (CUBLAS_STATUS_SUCCESS != err) { \ printf("CUBLAS ERROR (code = %d, %d) at %s:%d\n", \ err, err == CUBLAS_STATUS_EXECUTION_FAILED, __FILE__, __LINE__); \ hypre_assert(0); exit(1); \ } } while(0) #define HYPRE_ROCBLAS_CALL(call) do { \ rocblas_status err = call; \ if (rocblas_status_success != err) { \ printf("rocBLAS ERROR (code = %d, %s) at %s:%d\n", \ err, rocblas_status_to_string(err), __FILE__, __LINE__); \ hypre_assert(0); exit(1); \ } } while(0) #if CUSPARSE_VERSION >= 10300 #define HYPRE_CUSPARSE_CALL(call) do { \ cusparseStatus_t err = call; \ if (CUSPARSE_STATUS_SUCCESS != err) { \ printf("CUSPARSE ERROR (code = %d, %s) at %s:%d\n", \ err, cusparseGetErrorString(err), __FILE__, __LINE__); \ hypre_assert(0); exit(1); \ } } while(0) #else #define HYPRE_CUSPARSE_CALL(call) do { \ cusparseStatus_t err = call; \ if (CUSPARSE_STATUS_SUCCESS != err) { \ printf("CUSPARSE ERROR (code = %d) at %s:%d\n", \ err, __FILE__, __LINE__); \ hypre_assert(0); exit(1); \ } } while(0) #endif #define HYPRE_ROCSPARSE_CALL(call) do { \ rocsparse_status err = call; \ if (rocsparse_status_success != err) { \ printf("rocSPARSE ERROR (code = %d) at %s:%d\n", \ err, __FILE__, __LINE__); \ assert(0); exit(1); \ } } while(0) #define HYPRE_CUSOLVER_CALL(call) do { \ cusolverStatus_t err = call; \ if (CUSOLVER_STATUS_SUCCESS != err) { \ printf("cuSOLVER ERROR (code = %d) at %s:%d\n", \ err, __FILE__, __LINE__); \ hypre_assert(0); \ } } while(0) #define HYPRE_ROCSOLVER_CALL(call) do { \ rocblas_status err = call; \ if (rocblas_status_success != err) { \ printf("rocSOLVER ERROR (code = %d, %s) at %s:%d\n", \ err, rocblas_status_to_string(err), __FILE__, __LINE__); \ } } while(0) #define HYPRE_CURAND_CALL(call) do { \ curandStatus_t err = call; \ if (CURAND_STATUS_SUCCESS != err) { \ printf("CURAND ERROR (code = %d) at %s:%d\n", err, __FILE__, __LINE__); \ hypre_assert(0); exit(1); \ } } while(0) #define HYPRE_ROCRAND_CALL(call) do { \ rocrand_status err = call; \ if (ROCRAND_STATUS_SUCCESS != err) { \ printf("ROCRAND ERROR (code = %d) at %s:%d\n", err, __FILE__, __LINE__); \ hypre_assert(0); exit(1); \ } } while(0) #define HYPRE_ONEMKL_CALL(call) \ try \ { \ call; \ } \ catch (oneapi::mkl::exception const &ex) \ { \ hypre_printf("ONEMKL ERROR (code = %s) at %s:%d\n", ex.what(), \ __FILE__, __LINE__); \ assert(0); exit(1); \ } /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - * macros for wrapping thrust/oneDPL calls for error reporting * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ /* RL: TODO Want macro HYPRE_THRUST_CALL to return value but I don't know how to do it right * The following one works OK for now */ #if defined(HYPRE_USING_CUDA) #define HYPRE_THRUST_CALL(func_name, ...) \ thrust::func_name(HYPRE_THRUST_EXECUTION(hypre_HandleDeviceAllocator(hypre_handle())).on(hypre_HandleComputeStream(hypre_handle())), __VA_ARGS__); #elif defined(HYPRE_USING_HIP) #define HYPRE_THRUST_CALL(func_name, ...) \ thrust::func_name(thrust::hip::par(hypre_HandleDeviceAllocator(hypre_handle())).on(hypre_HandleComputeStream(hypre_handle())), __VA_ARGS__); #elif defined(HYPRE_USING_SYCL) #define HYPRE_ONEDPL_CALL(func_name, ...) \ func_name(oneapi::dpl::execution::make_device_policy( \ *hypre_HandleComputeStream(hypre_handle())), __VA_ARGS__); #define HYPRE_ONEDPL_CPU_CALL(func_name, ...) \ func_name(oneapi::dpl::execution::make_device_policy( \ *hypre_DeviceDataStream(hypre_HandleDeviceData(hypre_handle()), HYPRE_MAX_NUM_STREAMS - 1)), __VA_ARGS__); #endif /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - * device info data structures * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ struct hypre_cub_CachingDeviceAllocator; typedef struct hypre_cub_CachingDeviceAllocator hypre_cub_CachingDeviceAllocator; #if defined(HYPRE_USING_CUSOLVER) typedef cusolverDnHandle_t vendorSolverHandle_t; #elif defined(HYPRE_USING_ROCSOLVER) typedef rocblas_handle vendorSolverHandle_t; #endif struct hypre_DeviceData { #if defined(HYPRE_USING_CURAND) curandGenerator_t curand_generator; #endif #if defined(HYPRE_USING_ROCRAND) rocrand_generator curand_generator; #endif #if defined(HYPRE_USING_CUBLAS) cublasHandle_t cublas_handle; #endif #if defined(HYPRE_USING_CUSPARSE) cusparseHandle_t cusparse_handle; #endif #if defined(HYPRE_USING_ROCSPARSE) rocsparse_handle cusparse_handle; #endif #if defined(HYPRE_USING_CUSOLVER) || defined(HYPRE_USING_ROCSOLVER) vendorSolverHandle_t vendor_solver_handle; #endif /* TODO (VPM): Change to HYPRE_USING_GPU_STREAMS*/ #if defined(HYPRE_USING_CUDA_STREAMS) #if defined(HYPRE_USING_CUDA) cudaStream_t streams[HYPRE_MAX_NUM_STREAMS]; #elif defined(HYPRE_USING_HIP) hipStream_t streams[HYPRE_MAX_NUM_STREAMS]; #elif defined(HYPRE_USING_SYCL) sycl::queue* streams[HYPRE_MAX_NUM_STREAMS] = {NULL}; #endif #endif #if defined(HYPRE_USING_DEVICE_POOL) hypre_uint cub_bin_growth; hypre_uint cub_min_bin; hypre_uint cub_max_bin; size_t cub_max_cached_bytes; hypre_cub_CachingDeviceAllocator *cub_dev_allocator; hypre_cub_CachingDeviceAllocator *cub_uvm_allocator; #endif #if defined(HYPRE_USING_CUDA) || defined(HYPRE_USING_HIP) hypre_device_allocator device_allocator; #endif #if defined(HYPRE_USING_SYCL) sycl::device *device; HYPRE_Int device_max_work_group_size; #else HYPRE_Int device; #endif hypre_int device_max_shmem_per_block[3]; /* by default, hypre puts GPU computations in this stream * Do not be confused with the default (null) stream */ HYPRE_Int compute_stream_num; /* work space for hypre's device reducer */ void *reduce_buffer; /* device spgemm options */ HYPRE_Int spgemm_algorithm; HYPRE_Int spgemm_binned; HYPRE_Int spgemm_num_bin; /* the highest bins for symbl [0] and numer [1] * which are not necessary to be `spgemm_num_bin' due to shmem limit on GPUs */ HYPRE_Int spgemm_highest_bin[2]; /* for bin i: ([0][i], [2][i]) = (max #block to launch, block dimension) for symbl * ([1][i], [3][i]) = (max #block to launch, block dimension) for numer */ HYPRE_Int spgemm_block_num_dim[4][HYPRE_SPGEMM_MAX_NBIN + 1]; HYPRE_Int spgemm_rownnz_estimate_method; HYPRE_Int spgemm_rownnz_estimate_nsamples; float spgemm_rownnz_estimate_mult_factor; /* cusparse */ HYPRE_Int spmv_use_vendor; HYPRE_Int sptrans_use_vendor; HYPRE_Int spgemm_use_vendor; /* PMIS RNG */ HYPRE_Int use_gpu_rand; }; #define hypre_DeviceDataCubBinGrowth(data) ((data) -> cub_bin_growth) #define hypre_DeviceDataCubMinBin(data) ((data) -> cub_min_bin) #define hypre_DeviceDataCubMaxBin(data) ((data) -> cub_max_bin) #define hypre_DeviceDataCubMaxCachedBytes(data) ((data) -> cub_max_cached_bytes) #define hypre_DeviceDataCubDevAllocator(data) ((data) -> cub_dev_allocator) #define hypre_DeviceDataCubUvmAllocator(data) ((data) -> cub_uvm_allocator) #define hypre_DeviceDataDevice(data) ((data) -> device) #define hypre_DeviceDataDeviceMaxWorkGroupSize(data) ((data) -> device_max_work_group_size) #define hypre_DeviceDataDeviceMaxShmemPerBlock(data) ((data) -> device_max_shmem_per_block) #define hypre_DeviceDataDeviceMaxShmemPerBlockInited(data) (((data) -> device_max_shmem_per_block)[2]) #define hypre_DeviceDataComputeStreamNum(data) ((data) -> compute_stream_num) #define hypre_DeviceDataReduceBuffer(data) ((data) -> reduce_buffer) #define hypre_DeviceDataSpgemmUseVendor(data) ((data) -> spgemm_use_vendor) #define hypre_DeviceDataSpMVUseVendor(data) ((data) -> spmv_use_vendor) #define hypre_DeviceDataSpTransUseVendor(data) ((data) -> sptrans_use_vendor) #define hypre_DeviceDataSpgemmAlgorithm(data) ((data) -> spgemm_algorithm) #define hypre_DeviceDataSpgemmBinned(data) ((data) -> spgemm_binned) #define hypre_DeviceDataSpgemmNumBin(data) ((data) -> spgemm_num_bin) #define hypre_DeviceDataSpgemmHighestBin(data) ((data) -> spgemm_highest_bin) #define hypre_DeviceDataSpgemmBlockNumDim(data) ((data) -> spgemm_block_num_dim) #define hypre_DeviceDataSpgemmRownnzEstimateMethod(data) ((data) -> spgemm_rownnz_estimate_method) #define hypre_DeviceDataSpgemmRownnzEstimateNsamples(data) ((data) -> spgemm_rownnz_estimate_nsamples) #define hypre_DeviceDataSpgemmRownnzEstimateMultFactor(data) ((data) -> spgemm_rownnz_estimate_mult_factor) #define hypre_DeviceDataDeviceAllocator(data) ((data) -> device_allocator) #define hypre_DeviceDataUseGpuRand(data) ((data) -> use_gpu_rand) hypre_DeviceData* hypre_DeviceDataCreate(); void hypre_DeviceDataDestroy(hypre_DeviceData* data); #if defined(HYPRE_USING_CURAND) curandGenerator_t hypre_DeviceDataCurandGenerator(hypre_DeviceData *data); #endif #if defined(HYPRE_USING_ROCRAND) rocrand_generator hypre_DeviceDataCurandGenerator(hypre_DeviceData *data); #endif #if defined(HYPRE_USING_CUBLAS) cublasHandle_t hypre_DeviceDataCublasHandle(hypre_DeviceData *data); #endif #if defined(HYPRE_USING_CUSPARSE) cusparseHandle_t hypre_DeviceDataCusparseHandle(hypre_DeviceData *data); #endif #if defined(HYPRE_USING_ROCSPARSE) rocsparse_handle hypre_DeviceDataCusparseHandle(hypre_DeviceData *data); #endif #if defined(HYPRE_USING_CUSOLVER) || defined(HYPRE_USING_ROCSOLVER) vendorSolverHandle_t hypre_DeviceDataVendorSolverHandle(hypre_DeviceData *data); #endif /* TODO (VPM): Create a deviceStream_t to encapsulate all stream types below */ #if defined(HYPRE_USING_CUDA) cudaStream_t hypre_DeviceDataStream(hypre_DeviceData *data, HYPRE_Int i); cudaStream_t hypre_DeviceDataComputeStream(hypre_DeviceData *data); #elif defined(HYPRE_USING_HIP) hipStream_t hypre_DeviceDataStream(hypre_DeviceData *data, HYPRE_Int i); hipStream_t hypre_DeviceDataComputeStream(hypre_DeviceData *data); #elif defined(HYPRE_USING_SYCL) sycl::queue* hypre_DeviceDataStream(hypre_DeviceData *data, HYPRE_Int i); sycl::queue* hypre_DeviceDataComputeStream(hypre_DeviceData *data); #endif /* Data structure and accessor routines for Sparse Triangular Matrices */ struct hypre_CsrsvData { #if defined(HYPRE_USING_CUSPARSE) hypre_cusparseSpSVDescr info_L; hypre_cusparseSpSVDescr info_U; cusparseSolvePolicy_t analysis_policy; cusparseSolvePolicy_t solve_policy; #elif defined(HYPRE_USING_ROCSPARSE) rocsparse_mat_info info_L; rocsparse_mat_info info_U; rocsparse_analysis_policy analysis_policy; rocsparse_solve_policy solve_policy; #endif #if defined(HYPRE_USING_CUSPARSE) && (CUSPARSE_VERSION >= CUSPARSE_SPSV_VERSION) size_t buffer_size_L; size_t buffer_size_U; char *buffer_L; char *buffer_U; #else hypre_int buffer_size; char *buffer; #endif /* Temporary array to save matrix values with modified diagonal */ HYPRE_Complex *mat_data; /* Flags for checking whether the analysis phase has been executed or not */ HYPRE_Int analyzed_L; HYPRE_Int analyzed_U; }; #define hypre_CsrsvDataInfoL(data) ((data) -> info_L) #define hypre_CsrsvDataInfoU(data) ((data) -> info_U) #define hypre_CsrsvDataAnalyzedL(data) ((data) -> analyzed_L) #define hypre_CsrsvDataAnalyzedU(data) ((data) -> analyzed_U) #define hypre_CsrsvDataSolvePolicy(data) ((data) -> solve_policy) #define hypre_CsrsvDataAnalysisPolicy(data) ((data) -> analysis_policy) #if defined(HYPRE_USING_CUSPARSE) && (CUSPARSE_VERSION >= CUSPARSE_SPSV_VERSION) #define hypre_CsrsvDataBufferSizeL(data) ((data) -> buffer_size_L) #define hypre_CsrsvDataBufferSizeU(data) ((data) -> buffer_size_U) #define hypre_CsrsvDataBufferL(data) ((data) -> buffer_L) #define hypre_CsrsvDataBufferU(data) ((data) -> buffer_U) #else #define hypre_CsrsvDataBufferSize(data) ((data) -> buffer_size) #define hypre_CsrsvDataBuffer(data) ((data) -> buffer) #endif #define hypre_CsrsvDataMatData(data) ((data) -> mat_data) struct hypre_GpuMatData { #if defined(HYPRE_USING_CUSPARSE) cusparseMatDescr_t mat_descr; char *spmv_buffer; #elif defined(HYPRE_USING_ROCSPARSE) rocsparse_mat_descr mat_descr; rocsparse_mat_info mat_info; #elif defined(HYPRE_USING_ONEMKLSPARSE) oneapi::mkl::sparse::matrix_handle_t mat_handle; #endif }; #define hypre_GpuMatDataMatDescr(data) ((data) -> mat_descr) #define hypre_GpuMatDataMatInfo(data) ((data) -> mat_info) #define hypre_GpuMatDataMatHandle(data) ((data) -> mat_handle) #define hypre_GpuMatDataSpMVBuffer(data) ((data) -> spmv_buffer) #endif /* if defined(HYPRE_USING_GPU) */ /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - * generic device functions (cuda/hip/sycl) * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ #if defined(HYPRE_USING_GPU) template static __device__ __forceinline__ T read_only_load( const T *ptr ) { #if defined(__CUDA_ARCH__) && __CUDA_ARCH__ >= 350 return __ldg( ptr ); #else return *ptr; #endif } static __device__ __forceinline__ hypre_int next_power_of_2(hypre_int n) { if (n <= 0) { return 0; } /* if n is power of 2, return itself */ if ( (n & (n - 1)) == 0 ) { return n; } n |= (n >> 1); n |= (n >> 2); n |= (n >> 4); n |= (n >> 8); n |= (n >> 16); n ^= (n >> 1); n = (n << 1); return n; } /* Flip n-th bit of bitmask (0 becomes 1. 1 becomes 0) */ static __device__ __forceinline__ hypre_mask hypre_mask_flip_at(hypre_mask bitmask, hypre_int n) { return bitmask ^ (hypre_mask_one << n); } #endif // defined(HYPRE_USING_GPU) /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - * cuda/hip functions * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ #if defined(HYPRE_USING_CUDA) || defined(HYPRE_USING_HIP) /* return the number of threads in block */ template static __device__ __forceinline__ hypre_int hypre_gpu_get_num_threads(hypre_DeviceItem &item) { switch (dim) { case 1: return (blockDim.x); case 2: return (blockDim.x * blockDim.y); case 3: return (blockDim.x * blockDim.y * blockDim.z); } return -1; } /* return the flattened thread id in block */ template static __device__ __forceinline__ hypre_int hypre_gpu_get_thread_id(hypre_DeviceItem &item) { switch (dim) { case 1: return (threadIdx.x); case 2: return (threadIdx.y * blockDim.x + threadIdx.x); case 3: return (threadIdx.z * blockDim.x * blockDim.y + threadIdx.y * blockDim.x + threadIdx.x); } return -1; } /* return the number of warps in block */ template static __device__ __forceinline__ hypre_int hypre_gpu_get_num_warps(hypre_DeviceItem &item) { return hypre_gpu_get_num_threads(item) >> HYPRE_WARP_BITSHIFT; } /* return the warp id in block */ template static __device__ __forceinline__ hypre_int hypre_gpu_get_warp_id(hypre_DeviceItem &item) { return hypre_gpu_get_thread_id(item) >> HYPRE_WARP_BITSHIFT; } /* return the thread lane id in warp */ template static __device__ __forceinline__ hypre_int hypre_gpu_get_lane_id(hypre_DeviceItem &item) { return hypre_gpu_get_thread_id(item) & (HYPRE_WARP_SIZE - 1); } /* return the num of blocks in grid */ template static __device__ __forceinline__ hypre_int hypre_gpu_get_num_blocks() { switch (dim) { case 1: return (gridDim.x); case 2: return (gridDim.x * gridDim.y); case 3: return (gridDim.x * gridDim.y * gridDim.z); } return -1; } /* return the flattened block id in grid */ template static __device__ __forceinline__ hypre_int hypre_gpu_get_block_id(hypre_DeviceItem &item) { switch (dim) { case 1: return (blockIdx.x); case 2: return (blockIdx.y * gridDim.x + blockIdx.x); case 3: return (blockIdx.z * gridDim.x * gridDim.y + blockIdx.y * gridDim.x + blockIdx.x); } return -1; } /* return the number of threads in grid */ template static __device__ __forceinline__ hypre_int hypre_gpu_get_grid_num_threads(hypre_DeviceItem &item) { return hypre_gpu_get_num_blocks() * hypre_gpu_get_num_threads(item); } /* return the flattened thread id in grid */ template static __device__ __forceinline__ hypre_int hypre_gpu_get_grid_thread_id(hypre_DeviceItem &item) { return hypre_gpu_get_block_id(item) * hypre_gpu_get_num_threads(item) + hypre_gpu_get_thread_id(item); } /* return the number of warps in grid */ template static __device__ __forceinline__ hypre_int hypre_gpu_get_grid_num_warps(hypre_DeviceItem &item) { return hypre_gpu_get_num_blocks() * hypre_gpu_get_num_warps(item); } /* return the flattened warp id in grid */ template static __device__ __forceinline__ hypre_int hypre_gpu_get_grid_warp_id(hypre_DeviceItem &item) { return hypre_gpu_get_block_id(item) * hypre_gpu_get_num_warps(item) + hypre_gpu_get_warp_id(item); } #if defined(__CUDA_ARCH__) && __CUDA_ARCH__ < 600 static __device__ __forceinline__ hypre_double atomicAdd(hypre_double* address, hypre_double val) { hypre_ulonglongint* address_as_ull = (hypre_ulonglongint*) address; hypre_ulonglongint old = *address_as_ull, assumed; do { assumed = old; old = atomicCAS(address_as_ull, assumed, __double_as_longlong(val + __longlong_as_double(assumed))); // Note: uses integer comparison to avoid hang in case of NaN (since NaN != NaN) } while (assumed != old); return __longlong_as_double(old); } #endif // There are no *_sync functions in HIP #if defined(HYPRE_USING_HIP) || (CUDA_VERSION < 9000) template static __device__ __forceinline__ T __shfl_sync(hypre_mask mask, T val, hypre_int src_line, hypre_int width = HYPRE_WARP_SIZE) { return __shfl(val, src_line, width); } template static __device__ __forceinline__ T __shfl_up_sync(hypre_mask mask, T val, hypre_uint delta, hypre_int width = HYPRE_WARP_SIZE) { return __shfl_up(val, delta, width); } template static __device__ __forceinline__ T __shfl_down_sync(hypre_mask mask, T val, hypre_uint delta, hypre_int width = HYPRE_WARP_SIZE) { return __shfl_down(val, delta, width); } template static __device__ __forceinline__ T __shfl_xor_sync(hypre_mask mask, T val, hypre_int lanemask, hypre_int width = HYPRE_WARP_SIZE) { return __shfl_xor(val, lanemask, width); } static __device__ __forceinline__ void __syncwarp() { } #endif // #if defined(HYPRE_USING_HIP) || (CUDA_VERSION < 9000) static __device__ __forceinline__ hypre_mask hypre_ballot_sync(hypre_DeviceItem &item, hypre_mask mask, hypre_int predicate) { #if defined(HYPRE_USING_CUDA) return __ballot_sync(mask, predicate); #else return __ballot(predicate); #endif } static __device__ __forceinline__ HYPRE_Int hypre_popc(hypre_mask mask) { #if defined(HYPRE_USING_CUDA) return (HYPRE_Int) __popc(mask); #else return (HYPRE_Int) __popcll(mask); #endif } static __device__ __forceinline__ HYPRE_Int hypre_ffs(hypre_mask mask) { #if defined(HYPRE_USING_CUDA) return (HYPRE_Int) __ffs(mask); #else return (HYPRE_Int) __ffsll(mask); #endif } #if defined(HYPRE_USING_HIP) static __device__ __forceinline__ hypre_int __any_sync(unsigned mask, hypre_int predicate) { return __any(predicate); } #endif /* sync the thread block */ static __device__ __forceinline__ void block_sync(hypre_DeviceItem &item) { __syncthreads(); } /* sync the warp */ static __device__ __forceinline__ void warp_sync(hypre_DeviceItem &item) { __syncwarp(); } /* exclusive prefix scan */ template static __device__ __forceinline__ T warp_prefix_sum(hypre_DeviceItem &item, hypre_int lane_id, T in, T &all_sum) { #pragma unroll for (hypre_int d = 2; d <= HYPRE_WARP_SIZE; d <<= 1) { T t = __shfl_up_sync(HYPRE_WARP_FULL_MASK, in, d >> 1); if ( (lane_id & (d - 1)) == (d - 1) ) { in += t; } } all_sum = __shfl_sync(HYPRE_WARP_FULL_MASK, in, HYPRE_WARP_SIZE - 1); if (lane_id == HYPRE_WARP_SIZE - 1) { in = 0; } #pragma unroll for (hypre_int d = HYPRE_WARP_SIZE >> 1; d > 0; d >>= 1) { T t = __shfl_xor_sync(HYPRE_WARP_FULL_MASK, in, d); if ( (lane_id & (d - 1)) == (d - 1)) { if ( (lane_id & ((d << 1) - 1)) == ((d << 1) - 1) ) { in += t; } else { in = t; } } } return in; } static __device__ __forceinline__ hypre_int warp_any_sync(hypre_DeviceItem &item, hypre_mask mask, hypre_int predicate) { return __any_sync(mask, predicate); } template static __device__ __forceinline__ T warp_shuffle_sync(hypre_DeviceItem &item, hypre_mask mask, T val, hypre_int src_line, hypre_int width = HYPRE_WARP_SIZE) { return __shfl_sync(mask, val, src_line, width); } template static __device__ __forceinline__ T warp_shuffle_up_sync(hypre_DeviceItem &item, hypre_mask mask, T val, hypre_uint delta, hypre_int width = HYPRE_WARP_SIZE) { return __shfl_up_sync(mask, val, delta, width); } template static __device__ __forceinline__ T warp_shuffle_down_sync(hypre_DeviceItem &item, hypre_mask mask, T val, hypre_uint delta, hypre_int width = HYPRE_WARP_SIZE) { return __shfl_down_sync(mask, val, delta, width); } template static __device__ __forceinline__ T warp_shuffle_xor_sync(hypre_DeviceItem &item, hypre_mask mask, T val, hypre_int lane_mask, hypre_int width = HYPRE_WARP_SIZE) { return __shfl_xor_sync(mask, val, lane_mask, width); } template static __device__ __forceinline__ T warp_reduce_sum(hypre_DeviceItem &item, T in) { #pragma unroll for (hypre_int d = HYPRE_WARP_SIZE >> 1; d > 0; d >>= 1) { in += __shfl_down_sync(HYPRE_WARP_FULL_MASK, in, d); } return in; } template static __device__ __forceinline__ T warp_allreduce_sum(hypre_DeviceItem &item, T in) { #pragma unroll for (hypre_int d = HYPRE_WARP_SIZE >> 1; d > 0; d >>= 1) { in += __shfl_xor_sync(HYPRE_WARP_FULL_MASK, in, d); } return in; } template static __device__ __forceinline__ T warp_reduce_max(hypre_DeviceItem &item, T in) { #pragma unroll for (hypre_int d = HYPRE_WARP_SIZE >> 1; d > 0; d >>= 1) { in = max(in, __shfl_down_sync(HYPRE_WARP_FULL_MASK, in, d)); } return in; } template static __device__ __forceinline__ T warp_allreduce_max(hypre_DeviceItem &item, T in) { #pragma unroll for (hypre_int d = HYPRE_WARP_SIZE >> 1; d > 0; d >>= 1) { in = max(in, __shfl_xor_sync(HYPRE_WARP_FULL_MASK, in, d)); } return in; } template static __device__ __forceinline__ T warp_reduce_min(hypre_DeviceItem &item, T in) { #pragma unroll for (hypre_int d = HYPRE_WARP_SIZE >> 1; d > 0; d >>= 1) { in = min(in, __shfl_down_sync(HYPRE_WARP_FULL_MASK, in, d)); } return in; } template static __device__ __forceinline__ T warp_allreduce_min(hypre_DeviceItem &item, T in) { #pragma unroll for (hypre_int d = HYPRE_WARP_SIZE >> 1; d > 0; d >>= 1) { in = min(in, __shfl_xor_sync(HYPRE_WARP_FULL_MASK, in, d)); } return in; } template #if (defined(THRUST_VERSION) && THRUST_VERSION < THRUST_VERSION_NOTFN) struct type_cast : public thrust::unary_function #else struct type_cast #endif { __host__ __device__ T2 operator()(const T1 &x) const { return (T2) x; } }; template #if (defined(THRUST_VERSION) && THRUST_VERSION < THRUST_VERSION_NOTFN) struct absolute_value : public thrust::unary_function #else struct absolute_value #endif { __host__ __device__ T operator()(const T &x) const { return x < T(0) ? -x : x; } }; template struct TupleComp2 { typedef thrust::tuple Tuple; __host__ __device__ bool operator()(const Tuple& t1, const Tuple& t2) { if (thrust::get<0>(t1) < thrust::get<0>(t2)) { return true; } if (thrust::get<0>(t1) > thrust::get<0>(t2)) { return false; } return hypre_abs(thrust::get<1>(t1)) > hypre_abs(thrust::get<1>(t2)); } }; template struct TupleComp3 { typedef thrust::tuple Tuple; __host__ __device__ bool operator()(const Tuple& t1, const Tuple& t2) { if (thrust::get<0>(t1) < thrust::get<0>(t2)) { return true; } if (thrust::get<0>(t1) > thrust::get<0>(t2)) { return false; } if (thrust::get<0>(t2) == thrust::get<1>(t2)) { return false; } return thrust::get<0>(t1) == thrust::get<1>(t1) || thrust::get<1>(t1) < thrust::get<1>(t2); } }; template #if (defined(THRUST_VERSION) && THRUST_VERSION < THRUST_VERSION_NOTFN) struct is_negative : public thrust::unary_function #else struct is_negative #endif { __host__ __device__ bool operator()(const T &x) { return (x < 0); } }; template #if (defined(THRUST_VERSION) && THRUST_VERSION < THRUST_VERSION_NOTFN) struct is_positive : public thrust::unary_function #else struct is_positive #endif { __host__ __device__ bool operator()(const T &x) { return (x > 0); } }; template #if (defined(THRUST_VERSION) && THRUST_VERSION < THRUST_VERSION_NOTFN) struct is_nonnegative : public thrust::unary_function #else struct is_nonnegative #endif { __host__ __device__ bool operator()(const T &x) { return (x >= 0); } }; template #if (defined(THRUST_VERSION) && THRUST_VERSION < THRUST_VERSION_NOTFN) struct in_range : public thrust::unary_function #else struct in_range #endif { T low, up; in_range(T low_, T up_) { low = low_; up = up_; } __host__ __device__ bool operator()(const T &x) { return (x >= low && x <= up); } }; template #if (defined(THRUST_VERSION) && THRUST_VERSION < THRUST_VERSION_NOTFN) struct out_of_range : public thrust::unary_function #else struct out_of_range #endif { T low, up; out_of_range(T low_, T up_) { low = low_; up = up_; } __host__ __device__ bool operator()(const T &x) { return (x < low || x > up); } }; template #if (defined(THRUST_VERSION) && THRUST_VERSION < THRUST_VERSION_NOTFN) struct less_than : public thrust::unary_function #else struct less_than #endif { T val; less_than(T val_) { val = val_; } __host__ __device__ bool operator()(const T &x) { return (x < val); } }; template #if (defined(THRUST_VERSION) && THRUST_VERSION < THRUST_VERSION_NOTFN) struct modulo : public thrust::unary_function #else struct modulo #endif { T val; modulo(T val_) { val = val_; } __host__ __device__ T operator()(const T &x) { return (x % val); } }; template #if (defined(THRUST_VERSION) && THRUST_VERSION < THRUST_VERSION_NOTFN) struct equal : public thrust::unary_function #else struct equal #endif { T val; equal(T val_) { val = val_; } __host__ __device__ bool operator()(const T &x) { return (x == val); } }; struct print_functor { __host__ __device__ void operator()(HYPRE_Real val) { printf("%f\n", val); } }; #endif // defined(HYPRE_USING_CUDA) || defined(HYPRE_USING_HIP) /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - * sycl functions * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ #if defined(HYPRE_USING_SYCL) /* return the number of threads in block */ template static __device__ __forceinline__ hypre_int hypre_gpu_get_num_threads(hypre_DeviceItem &item) { return static_cast(item.get_local_range().size()); } /* return the flattened thread id in block */ template static __device__ __forceinline__ hypre_int hypre_gpu_get_thread_id(hypre_DeviceItem &item) { return static_cast(item.get_local_linear_id()); } /* return the number of warps in block */ template static __device__ __forceinline__ hypre_int hypre_gpu_get_num_warps(hypre_DeviceItem &item) { return hypre_gpu_get_num_threads(item) >> HYPRE_WARP_BITSHIFT; } /* return the warp id in block */ template static __device__ __forceinline__ hypre_int hypre_gpu_get_warp_id(hypre_DeviceItem &item) { return hypre_gpu_get_thread_id(item) >> HYPRE_WARP_BITSHIFT; } /* return the thread lane id in warp */ template static __device__ __forceinline__ hypre_int hypre_gpu_get_lane_id(hypre_DeviceItem &item) { return static_cast(item.get_sub_group().get_local_linear_id()); } /* return the num of blocks in grid */ template static __device__ __forceinline__ hypre_int hypre_gpu_get_num_blocks(hypre_DeviceItem &item) { return static_cast(item.get_group_range().size()); } /* return the flattened block id in grid */ template static __device__ __forceinline__ hypre_int hypre_gpu_get_block_id(hypre_DeviceItem &item) { return item.get_group_linear_id(); } /* return the number of threads in grid */ template static __device__ __forceinline__ hypre_int hypre_gpu_get_grid_num_threads(hypre_DeviceItem &item) { return hypre_gpu_get_num_blocks(item) * hypre_gpu_get_num_threads(item); } /* return the flattened thread id in grid */ template static __device__ __forceinline__ hypre_int hypre_gpu_get_grid_thread_id(hypre_DeviceItem &item) { return hypre_gpu_get_block_id(item) * hypre_gpu_get_num_threads(item) + hypre_gpu_get_thread_id(item); } /* return the number of warps in grid */ template static __device__ __forceinline__ hypre_int hypre_gpu_get_grid_num_warps(hypre_DeviceItem &item) { return hypre_gpu_get_num_blocks(item) * hypre_gpu_get_num_warps(item); } /* return the flattened warp id in nd_range */ template static __device__ __forceinline__ hypre_int hypre_gpu_get_grid_warp_id(hypre_DeviceItem &item) { return hypre_gpu_get_block_id(item) * hypre_gpu_get_num_warps(item) + hypre_gpu_get_warp_id(item); } /* sync the thread block */ static __device__ __forceinline__ void block_sync(hypre_DeviceItem &item) { sycl::group_barrier(item.get_group()); } /* sync the warp */ static __device__ __forceinline__ void warp_sync(hypre_DeviceItem &item) { sycl::group_barrier(item.get_sub_group()); } /* exclusive prefix scan */ template static __device__ __forceinline__ T warp_prefix_sum(hypre_DeviceItem &item, hypre_int lane_id, T in, T &all_sum) { #pragma unroll for (hypre_int d = 2; d <= HYPRE_WARP_SIZE; d <<= 1) { T t = sycl::shift_group_right(item.get_sub_group(), in, d >> 1); if ( (lane_id & (d - 1)) == (d - 1) ) { in += t; } } all_sum = sycl::group_broadcast(item.get_sub_group(), in, HYPRE_WARP_SIZE - 1); if (lane_id == HYPRE_WARP_SIZE - 1) { in = 0; } #pragma unroll for (hypre_int d = HYPRE_WARP_SIZE >> 1; d > 0; d >>= 1) { T t = sycl::permute_group_by_xor(item.get_sub_group(), in, d); if ( (lane_id & (d - 1)) == (d - 1)) { if ( (lane_id & ((d << 1) - 1)) == ((d << 1) - 1) ) { in += t; } else { in = t; } } } return in; } static __device__ __forceinline__ hypre_mask hypre_ballot_sync(hypre_DeviceItem &item, hypre_mask mask, hypre_int predicate) { return sycl::reduce_over_group( item.get_sub_group(), (mask & (0x1 << item.get_sub_group().get_local_linear_id())) && predicate ? (0x1 << item.get_sub_group().get_local_linear_id()) : 0, sycl::ext::oneapi::plus<>()); } static __device__ __forceinline__ HYPRE_Int hypre_popc(hypre_mask mask) { return (HYPRE_Int) sycl::popcount(mask); } static __device__ __forceinline__ HYPRE_Int hypre_ffs(hypre_mask mask) { return (HYPRE_Int)dpct::ffs(mask); } static __device__ __forceinline__ hypre_int warp_any_sync(hypre_DeviceItem &item, hypre_mask mask, hypre_int predicate) { return sycl::any_of_group(item.get_sub_group(), predicate); } template static __device__ __forceinline__ T warp_shuffle_sync(hypre_DeviceItem &item, hypre_mask mask, T val, hypre_int src_line) { return sycl::group_broadcast(item.get_sub_group(), val, src_line); } template static __device__ __forceinline__ T warp_shuffle_sync(hypre_DeviceItem &item, hypre_mask mask, T val, hypre_int src_line, hypre_int width) { hypre_int lane_id = hypre_gpu_get_lane_id<1>(item); hypre_int group_start = (lane_id / width) * width; hypre_int src_in_warp = group_start + (src_line % width); return sycl::select_from_group(item.get_sub_group(), val, src_in_warp); } template static __device__ __forceinline__ T warp_shuffle_up_sync(hypre_DeviceItem &item, hypre_mask mask, T val, hypre_uint delta) { return sycl::shift_group_right(item.get_sub_group(), val, delta); } template static __device__ __forceinline__ T warp_shuffle_up_sync(hypre_DeviceItem &item, hypre_mask mask, T val, hypre_uint delta, hypre_int width) { hypre_int lane_id = hypre_gpu_get_lane_id<1>(item); hypre_int group_start = (lane_id / width) * width; hypre_int src_in_warp = lane_id - delta >= group_start ? lane_id - delta : lane_id; return sycl::select_from_group(item.get_sub_group(), val, src_in_warp); } template static __device__ __forceinline__ T warp_shuffle_down_sync(hypre_DeviceItem &item, hypre_mask mask, T val, hypre_uint delta) { return sycl::shift_group_left(item.get_sub_group(), val, delta); } template static __device__ __forceinline__ T warp_shuffle_down_sync(hypre_DeviceItem &item, hypre_mask mask, T val, hypre_uint delta, hypre_int width) { hypre_int lane_id = hypre_gpu_get_lane_id<1>(item); hypre_int group_end = ((lane_id / width) + 1) * width - 1; hypre_int src_in_warp = lane_id + delta <= group_end ? lane_id + delta : lane_id; return sycl::select_from_group(item.get_sub_group(), val, src_in_warp); } template static __device__ __forceinline__ T warp_shuffle_xor_sync(hypre_DeviceItem &item, hypre_mask mask, T val, hypre_int lane_mask) { return sycl::permute_group_by_xor(item.get_sub_group(), val, lane_mask); } template static __device__ __forceinline__ T warp_shuffle_xor_sync(hypre_DeviceItem &item, hypre_mask mask, T val, hypre_int lane_mask, hypre_int width) { hypre_int lane_id = hypre_gpu_get_lane_id<1>(item); hypre_int group_end = ((lane_id / width) + 1) * width - 1; hypre_int src_in_warp = lane_id ^ lane_mask; src_in_warp = src_in_warp > group_end ? lane_id : src_in_warp; return sycl::select_from_group(item.get_sub_group(), val, src_in_warp); } template static __forceinline__ T warp_reduce_sum(hypre_DeviceItem &item, T in) { for (hypre_int d = HYPRE_WARP_SIZE >> 1; d > 0; d >>= 1) { in += sycl::shift_group_left(item.get_sub_group(), in, d); } return in; } template static __forceinline__ T warp_allreduce_sum(hypre_DeviceItem &item, T in) { for (hypre_int d = HYPRE_WARP_SIZE >> 1; d > 0; d >>= 1) { in += sycl::permute_group_by_xor(item.get_sub_group(), in, d); } return in; } template static __forceinline__ T warp_reduce_max(hypre_DeviceItem &item, T in) { for (hypre_int d = HYPRE_WARP_SIZE >> 1; d > 0; d >>= 1) { in = std::max(in, sycl::shift_group_left(item.get_sub_group(), in, d)); } return in; } template static __forceinline__ T warp_allreduce_max(hypre_DeviceItem &item, T in) { for (hypre_int d = HYPRE_WARP_SIZE >> 1; d > 0; d >>= 1) { in = std::max(in, sycl::permute_group_by_xor(item.get_sub_group(), in, d)); } return in; } template static __forceinline__ T warp_reduce_min(hypre_DeviceItem &item, T in) { for (hypre_int d = HYPRE_WARP_SIZE >> 1; d > 0; d >>= 1) { in = std::min(in, sycl::shift_group_left(item.get_sub_group(), in, d)); } return in; } template static __forceinline__ T warp_allreduce_min(hypre_DeviceItem &item, T in) { for (hypre_int d = HYPRE_WARP_SIZE >> 1; d > 0; d >>= 1) { in = std::min(in, sycl::permute_group_by_xor(item.get_sub_group(), in, d)); } return in; } template struct is_negative { is_negative() {} constexpr bool operator()(const T &x = T()) const { return (x < 0); } }; template struct is_positive { is_positive() {} constexpr bool operator()(const T &x = T()) const { return (x > 0); } }; template struct is_nonnegative { is_nonnegative() {} constexpr bool operator()(const T &x = T()) const { return (x >= 0); } }; template struct in_range { T low, high; in_range(T low_ = T(), T high_ = T()) { low = low_; high = high_; } constexpr bool operator()(const T &x) const { return (x >= low && x <= high); } }; template struct out_of_range { T low, high; out_of_range(T low_ = T(), T high_ = T()) { low = low_; high = high_; } constexpr bool operator()(const T &x) const { return (x < low || x > high); } }; template struct less_than { T val; less_than(T val_ = T()) { val = val_; } constexpr bool operator()(const T &x) const { return (x < val); } }; template struct modulo { T val; modulo(T val_ = T()) { val = val_; } constexpr T operator()(const T &x) const { return (x % val); } }; template struct equal { T val; equal(T val_ = T()) { val = val_; } constexpr bool operator()(const T &x) const { return (x == val); } }; template struct type_cast { constexpr T2 operator()(const T1 &x = T1()) const { return (T2) x; } }; template struct absolute_value { constexpr T operator()(const T &x) const { return x < T(0) ? -x : x; } }; template struct TupleComp2 { typedef std::tuple Tuple; bool operator()(const Tuple& t1, const Tuple& t2) { if (std::get<0>(t1) < std::get<0>(t2)) { return true; } if (std::get<0>(t1) > std::get<0>(t2)) { return false; } return hypre_abs(std::get<1>(t1)) > hypre_abs(std::get<1>(t2)); } }; template struct TupleComp3 { typedef std::tuple Tuple; bool operator()(const Tuple& t1, const Tuple& t2) { if (std::get<0>(t1) < std::get<0>(t2)) { return true; } if (std::get<0>(t1) > std::get<0>(t2)) { return false; } if (std::get<0>(t2) == std::get<1>(t2)) { return false; } return std::get<0>(t1) == std::get<1>(t1) || std::get<1>(t1) < std::get<1>(t2); } }; #endif // #if defined(HYPRE_USING_SYCL) /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - * end of functions defined here * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ /* device_utils.c */ #if defined(HYPRE_USING_GPU) dim3 hypre_GetDefaultDeviceBlockDimension(); dim3 hypre_GetDefaultDeviceGridDimension( HYPRE_Int n, const char *granularity, dim3 bDim ); dim3 hypre_dim3(HYPRE_Int x); dim3 hypre_dim3(HYPRE_Int x, HYPRE_Int y); dim3 hypre_dim3(HYPRE_Int x, HYPRE_Int y, HYPRE_Int z); template HYPRE_Int hypreDevice_StableSortByTupleKey(HYPRE_Int N, T1 *keys1, T2 *keys2, T3 *vals, HYPRE_Int opt); template HYPRE_Int hypreDevice_StableSortTupleByTupleKey(HYPRE_Int N, T1 *keys1, T2 *keys2, T3 *vals1, T4 *vals2, HYPRE_Int opt); template HYPRE_Int hypreDevice_ReduceByTupleKey(HYPRE_Int N, T1 *keys1_in, T2 *keys2_in, T3 *vals_in, T1 *keys1_out, T2 *keys2_out, T3 *vals_out); template HYPRE_Int hypreDevice_ScatterConstant(T *x, HYPRE_Int n, HYPRE_Int *map, T v); HYPRE_Int hypreDevice_GenScatterAdd(HYPRE_Real *x, HYPRE_Int ny, HYPRE_Int *map, HYPRE_Real *y, char *work); template HYPRE_Int hypreDevice_CsrRowPtrsToIndicesWithRowNum(HYPRE_Int nrows, HYPRE_Int nnz, HYPRE_Int *d_row_ptr, T *d_row_num, T *d_row_ind); #endif #if defined(HYPRE_USING_CUDA) || defined(HYPRE_USING_HIP) #if defined(HYPRE_USING_CUDA) cudaError_t hypre_CachingMallocDevice(void **ptr, size_t nbytes); cudaError_t hypre_CachingMallocManaged(void **ptr, size_t nbytes); cudaError_t hypre_CachingFreeDevice(void *ptr); cudaError_t hypre_CachingFreeManaged(void *ptr); #endif hypre_cub_CachingDeviceAllocator * hypre_DeviceDataCubCachingAllocatorCreate(hypre_uint bin_growth, hypre_uint min_bin, hypre_uint max_bin, size_t max_cached_bytes, bool skip_cleanup, bool debug, bool use_managed_memory); void hypre_DeviceDataCubCachingAllocatorDestroy(hypre_DeviceData *data); #endif // #if defined(HYPRE_USING_CUDA) || defined(HYPRE_USING_HIP) #if defined(HYPRE_USING_CUSPARSE) cudaDataType hypre_HYPREComplexToCudaDataType(); #if CUSPARSE_VERSION >= CUSPARSE_NEWAPI_VERSION cusparseIndexType_t hypre_HYPREIntToCusparseIndexType(); #endif #endif // #if defined(HYPRE_USING_CUSPARSE) #endif /* #ifndef HYPRE_CUDA_UTILS_H */ /****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /* CUDA reducer class */ #ifndef HYPRE_CUDA_REDUCER_H #define HYPRE_CUDA_REDUCER_H #if defined(HYPRE_USING_CUDA) || defined(HYPRE_USING_HIP) #if !defined(HYPRE_USING_RAJA) && !defined(HYPRE_USING_KOKKOS) template void OneBlockReduce(T *d_arr, HYPRE_Int N, T *h_out); struct HYPRE_double4 { HYPRE_Real x, y, z, w; __host__ __device__ HYPRE_double4() {} __host__ __device__ HYPRE_double4(HYPRE_Real x1, HYPRE_Real x2, HYPRE_Real x3, HYPRE_Real x4) { x = x1; y = x2; z = x3; w = x4; } __host__ __device__ void operator=(HYPRE_Real val) { x = y = z = w = val; } __host__ __device__ void operator+=(HYPRE_double4 rhs) { x += rhs.x; y += rhs.y; z += rhs.z; w += rhs.w; } }; struct HYPRE_double6 { HYPRE_Real x, y, z, w, u, v; __host__ __device__ HYPRE_double6() {} __host__ __device__ HYPRE_double6(HYPRE_Real x1, HYPRE_Real x2, HYPRE_Real x3, HYPRE_Real x4, HYPRE_Real x5, HYPRE_Real x6) { x = x1; y = x2; z = x3; w = x4; u = x5; v = x6; } __host__ __device__ void operator=(HYPRE_Real val) { x = y = z = w = u = v = val; } __host__ __device__ void operator+=(HYPRE_double6 rhs) { x += rhs.x; y += rhs.y; z += rhs.z; w += rhs.w; u += rhs.u; v += rhs.v; } }; /* reduction within a warp */ __inline__ __host__ __device__ HYPRE_Real warpReduceSum(HYPRE_Real val) { #if defined(__CUDA_ARCH__) || defined(__HIP_DEVICE_COMPILE__) for (HYPRE_Int offset = warpSize / 2; offset > 0; offset /= 2) { val += __shfl_down_sync(HYPRE_WARP_FULL_MASK, val, offset); } #endif return val; } __inline__ __host__ __device__ HYPRE_double4 warpReduceSum(HYPRE_double4 val) { #if defined(__CUDA_ARCH__) || defined(__HIP_DEVICE_COMPILE__) for (HYPRE_Int offset = warpSize / 2; offset > 0; offset /= 2) { val.x += __shfl_down_sync(HYPRE_WARP_FULL_MASK, val.x, offset); val.y += __shfl_down_sync(HYPRE_WARP_FULL_MASK, val.y, offset); val.z += __shfl_down_sync(HYPRE_WARP_FULL_MASK, val.z, offset); val.w += __shfl_down_sync(HYPRE_WARP_FULL_MASK, val.w, offset); } #endif return val; } __inline__ __host__ __device__ HYPRE_double6 warpReduceSum(HYPRE_double6 val) { #if defined(__CUDA_ARCH__) || defined(__HIP_DEVICE_COMPILE__) for (HYPRE_Int offset = warpSize / 2; offset > 0; offset /= 2) { val.x += __shfl_down_sync(HYPRE_WARP_FULL_MASK, val.x, offset); val.y += __shfl_down_sync(HYPRE_WARP_FULL_MASK, val.y, offset); val.z += __shfl_down_sync(HYPRE_WARP_FULL_MASK, val.z, offset); val.w += __shfl_down_sync(HYPRE_WARP_FULL_MASK, val.w, offset); val.u += __shfl_down_sync(HYPRE_WARP_FULL_MASK, val.u, offset); val.v += __shfl_down_sync(HYPRE_WARP_FULL_MASK, val.v, offset); } #endif return val; } /* reduction within a block */ template __inline__ __host__ __device__ T blockReduceSum(T val) { #if defined(__CUDA_ARCH__) || defined(__HIP_DEVICE_COMPILE__) // Shared mem for HYPRE_WARP_SIZE partial sums __shared__ T shared[HYPRE_WARP_SIZE]; HYPRE_Int lane = threadIdx.x & (warpSize - 1); HYPRE_Int wid = threadIdx.x >> HYPRE_WARP_BITSHIFT; // Each warp performs partial reduction val = warpReduceSum(val); // Write reduced value to shared memory if (lane == 0) { shared[wid] = val; } // Wait for all partial reductions __syncthreads(); // read from shared memory only if that warp existed if (threadIdx.x < (blockDim.x >> HYPRE_WARP_BITSHIFT)) { val = shared[lane]; } else { val = 0.0; } // Final reduce within first warp if (wid == 0) { val = warpReduceSum(val); } #endif return val; } template __global__ void OneBlockReduceKernel(hypre_DeviceItem &item, T *arr, HYPRE_Int N) { T sum; sum = 0.0; if (threadIdx.x < N) { sum = arr[threadIdx.x]; } sum = blockReduceSum(sum); if (threadIdx.x == 0) { arr[0] = sum; } } /* Reducer class */ template struct ReduceSum { using value_type = T; T init; /* initial value passed in */ mutable T __thread_sum; /* place to hold local sum of a thread, and partial sum of a block */ T *d_buf; /* place to store partial sum within blocks in the 1st round, used in the 2nd round */ HYPRE_Int nblocks; /* number of blocks used in the 1st round */ /* constructor * val is the initial value (added to the reduced sum) */ __host__ ReduceSum(T val) { init = val; __thread_sum = 0.0; nblocks = -1; } /* copy constructor */ __host__ __device__ ReduceSum(const ReduceSum& other) { *this = other; } __host__ void Allocate2ndPhaseBuffer() { if (hypre_HandleReduceBuffer(hypre_handle()) == NULL) { /* allocate for the max size for reducing double6 type */ hypre_HandleReduceBuffer(hypre_handle()) = hypre_TAlloc(HYPRE_double6, HYPRE_MAX_NTHREADS_BLOCK, HYPRE_MEMORY_DEVICE); } d_buf = (T*) hypre_HandleReduceBuffer(hypre_handle()); } /* reduction within blocks */ __host__ __device__ void BlockReduce() const { #if defined(__CUDA_ARCH__) || defined(__HIP_DEVICE_COMPILE__) __thread_sum = blockReduceSum(__thread_sum); if (threadIdx.x == 0) { d_buf[blockIdx.x] = __thread_sum; } #endif } __host__ __device__ void operator+=(T val) const { __thread_sum += val; } /* invoke the 2nd reduction at the time want the sum from the reducer */ __host__ operator T() { T val; const HYPRE_MemoryLocation memory_location = hypre_HandleMemoryLocation(hypre_handle()); const HYPRE_ExecutionPolicy exec_policy = hypre_GetExecPolicy1(memory_location); if (exec_policy == HYPRE_EXEC_HOST) { val = __thread_sum; val += init; } else { /* 2nd reduction with only *one* block */ hypre_assert(nblocks >= 0 && nblocks <= HYPRE_MAX_NTHREADS_BLOCK); const dim3 gDim(1), bDim(HYPRE_MAX_NTHREADS_BLOCK); HYPRE_GPU_LAUNCH( OneBlockReduceKernel, gDim, bDim, d_buf, nblocks ); hypre_TMemcpy(&val, d_buf, T, 1, HYPRE_MEMORY_HOST, HYPRE_MEMORY_DEVICE); val += init; } return val; } /* destructor */ __host__ __device__ ~ReduceSum() { } }; #endif /* #if !defined(HYPRE_USING_RAJA) && !defined(HYPRE_USING_KOKKOS) */ #endif /* #if defined(HYPRE_USING_CUDA) || defined(HYPRE_USING_HIP) */ #endif /* #ifndef HYPRE_CUDA_REDUCER_H */ /****************************************************************************** * Copyright (c) 2011, Duane Merrill. All rights reserved. * Copyright (c) 2011-2018, NVIDIA CORPORATION. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 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. * * Neither the name of the NVIDIA CORPORATION nor the * names of its contributors may be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "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 NVIDIA CORPORATION 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. * ******************************************************************************/ /****************************************************************************** * Simple caching allocator for device memory allocations. The allocator is * thread-safe and capable of managing device allocations on multiple devices. ******************************************************************************/ #ifndef HYPRE_CUB_ALLOCATOR_HEADER #define HYPRE_CUB_ALLOCATOR_HEADER #if defined(HYPRE_USING_CUDA) && defined(HYPRE_USING_DEVICE_POOL) #include #include #if (__cplusplus > 199711L) || (defined(_MSC_VER) && _MSC_VER >= 1800) #include #else #if defined(_WIN32) || defined(_WIN64) #include #define WIN32_LEAN_AND_MEAN #define NOMINMAX #include #undef WIN32_LEAN_AND_MEAN #undef NOMINMAX /** * Compiler read/write barrier */ #pragma intrinsic(_ReadWriteBarrier) #endif #endif /** * Simple portable mutex * - Wraps std::mutex when compiled with C++11 or newer (supported on all platforms) * - Uses GNU/Windows spinlock mechanisms for pre C++11 (supported on x86/x64 when compiled with cl.exe or g++) */ struct hypre_cub_Mutex { #if (__cplusplus > 199711L) || (defined(_MSC_VER) && _MSC_VER >= 1800) std::mutex mtx; void Lock() { mtx.lock(); } void Unlock() { mtx.unlock(); } void TryLock() { mtx.try_lock(); } #else //__cplusplus > 199711L #if defined(_MSC_VER) // Microsoft VC++ typedef hypre_longint Spinlock; #else // GNU g++ typedef hypre_int Spinlock; /** * Compiler read/write barrier */ __forceinline__ void _ReadWriteBarrier() { __sync_synchronize(); } /** * Atomic exchange */ __forceinline__ hypre_longint _InterlockedExchange(volatile hypre_int * const Target, const hypre_int Value) { // NOTE: __sync_lock_test_and_set would be an acquire barrier, so we force a full barrier _ReadWriteBarrier(); return __sync_lock_test_and_set(Target, Value); } /** * Pause instruction to prevent excess processor bus usage */ __forceinline__ void YieldProcessor() { } #endif // defined(_MSC_VER) /// Lock member volatile Spinlock lock; /** * Constructor */ hypre_cub_Mutex() : lock(0) {} /** * Return when the specified spinlock has been acquired */ __forceinline__ void Lock() { while (1) { if (!_InterlockedExchange(&lock, 1)) return; while (lock) YieldProcessor(); } } /** * Release the specified spinlock */ __forceinline__ void Unlock() { _ReadWriteBarrier(); lock = 0; } #endif // __cplusplus > 199711L }; #include /****************************************************************************** * CachingDeviceAllocator (host use) ******************************************************************************/ /** * \brief A simple caching allocator for device memory allocations. * * \par Overview * The allocator is thread-safe and stream-safe and is capable of managing cached * device allocations on multiple devices. It behaves as follows: * * \par * - Allocations from the allocator are associated with an \p active_stream. Once freed, * the allocation becomes available immediately for reuse within the \p active_stream * with which it was associated with during allocation, and it becomes available for * reuse within other streams when all prior work submitted to \p active_stream has completed. * - Allocations are categorized and cached by bin size. A new allocation request of * a given size will only consider cached allocations within the corresponding bin. * - Bin limits progress geometrically in accordance with the growth factor * \p bin_growth provided during construction. Unused device allocations within * a larger bin cache are not reused for allocation requests that categorize to * smaller bin sizes. * - Allocation requests below (\p bin_growth ^ \p min_bin) are rounded up to * (\p bin_growth ^ \p min_bin). * - Allocations above (\p bin_growth ^ \p max_bin) are not rounded up to the nearest * bin and are simply freed when they are deallocated instead of being returned * to a bin-cache. * - %If the total storage of cached allocations on a given device will exceed * \p max_cached_bytes, allocations for that device are simply freed when they are * deallocated instead of being returned to their bin-cache. * * \par * For example, the default-constructed CachingDeviceAllocator is configured with: * - \p bin_growth = 8 * - \p min_bin = 3 * - \p max_bin = 7 * - \p max_cached_bytes = 6MB - 1B * * \par * which delineates five bin-sizes: 512B, 4KB, 32KB, 256KB, and 2MB * and sets a maximum of 6,291,455 cached bytes per device * */ struct hypre_cub_CachingDeviceAllocator { typedef char value_type; //--------------------------------------------------------------------- // Constants //--------------------------------------------------------------------- /// Out-of-bounds bin static const hypre_uint INVALID_BIN = (hypre_uint) -1; /// Invalid size static const size_t INVALID_SIZE = (size_t) -1; /// Invalid device ordinal static const hypre_int INVALID_DEVICE_ORDINAL = -1; //--------------------------------------------------------------------- // Type definitions and helper types //--------------------------------------------------------------------- /** * Descriptor for device memory allocations */ struct BlockDescriptor { void* d_ptr; // Device pointer size_t bytes; // Size of allocation in bytes hypre_uint bin; // Bin enumeration hypre_int device; // device ordinal cudaStream_t associated_stream; // Associated associated_stream cudaEvent_t ready_event; // Signal when associated stream has run to the point at which this block was freed // Constructor (suitable for searching maps for a specific block, given its pointer and device) BlockDescriptor(void *d_ptr, hypre_int device) : d_ptr(d_ptr), bytes(0), bin(INVALID_BIN), device(device), associated_stream(0), ready_event(0) {} // Constructor (suitable for searching maps for a range of suitable blocks, given a device) BlockDescriptor(hypre_int device) : d_ptr(NULL), bytes(0), bin(INVALID_BIN), device(device), associated_stream(0), ready_event(0) {} // Comparison functor for comparing device pointers static bool PtrCompare(const BlockDescriptor &a, const BlockDescriptor &b) { if (a.device == b.device) return (a.d_ptr < b.d_ptr); else return (a.device < b.device); } // Comparison functor for comparing allocation sizes static bool SizeCompare(const BlockDescriptor &a, const BlockDescriptor &b) { if (a.device == b.device) return (a.bytes < b.bytes); else return (a.device < b.device); } }; /// BlockDescriptor comparator function interface typedef bool (*Compare)(const BlockDescriptor &, const BlockDescriptor &); class TotalBytes { public: size_t free; size_t live; TotalBytes() { free = live = 0; } }; /// Set type for cached blocks (ordered by size) typedef std::multiset CachedBlocks; /// Set type for live blocks (ordered by ptr) typedef std::multiset BusyBlocks; /// Map type of device ordinals to the number of cached bytes cached by each device typedef std::map GpuCachedBytes; //--------------------------------------------------------------------- // Utility functions //--------------------------------------------------------------------- /** * Integer pow function for unsigned base and exponent */ static hypre_uint IntPow( hypre_uint base, hypre_uint exp) { hypre_uint retval = 1; while (exp > 0) { if (exp & 1) { retval = retval * base; // multiply the result by the current base } base = base * base; // square the base exp = exp >> 1; // divide the exponent in half } return retval; } /** * Round up to the nearest power-of */ void NearestPowerOf( hypre_uint &power, size_t &rounded_bytes, hypre_uint base, size_t value) { power = 0; rounded_bytes = 1; if (value * base < value) { // Overflow power = sizeof(size_t) * 8; rounded_bytes = size_t(0) - 1; return; } while (rounded_bytes < value) { rounded_bytes *= base; power++; } } //--------------------------------------------------------------------- // Fields //--------------------------------------------------------------------- hypre_cub_Mutex mutex; /// Mutex for thread-safety hypre_uint bin_growth; /// Geometric growth factor for bin-sizes hypre_uint min_bin; /// Minimum bin enumeration hypre_uint max_bin; /// Maximum bin enumeration size_t min_bin_bytes; /// Minimum bin size size_t max_bin_bytes; /// Maximum bin size size_t max_cached_bytes; /// Maximum aggregate cached bytes per device const bool skip_cleanup; /// Whether or not to skip a call to FreeAllCached() when destructor is called. (The CUDA runtime may have already shut down for statically declared allocators) bool debug; /// Whether or not to print (de)allocation events to stdout GpuCachedBytes cached_bytes; /// Map of device ordinal to aggregate cached bytes on that device CachedBlocks cached_blocks; /// Set of cached device allocations available for reuse BusyBlocks live_blocks; /// Set of live device allocations currently in use bool use_managed_memory; /// Whether to use managed memory or device memory //--------------------------------------------------------------------- // Methods //--------------------------------------------------------------------- /** * \brief Constructor. */ hypre_cub_CachingDeviceAllocator( hypre_uint bin_growth, ///< Geometric growth factor for bin-sizes hypre_uint min_bin = 1, ///< Minimum bin (default is bin_growth ^ 1) hypre_uint max_bin = INVALID_BIN, ///< Maximum bin (default is no max bin) size_t max_cached_bytes = INVALID_SIZE, ///< Maximum aggregate cached bytes per device (default is no limit) bool skip_cleanup = false, ///< Whether or not to skip a call to \p FreeAllCached() when the destructor is called (default is to deallocate) bool debug = false, ///< Whether or not to print (de)allocation events to stdout (default is no stderr output) bool use_managed_memory = false) ///< Whether to use managed memory or device memory : bin_growth(bin_growth), min_bin(min_bin), max_bin(max_bin), min_bin_bytes(IntPow(bin_growth, min_bin)), max_bin_bytes(IntPow(bin_growth, max_bin)), max_cached_bytes(max_cached_bytes), skip_cleanup(skip_cleanup), debug(debug), use_managed_memory(use_managed_memory), cached_blocks(BlockDescriptor::SizeCompare), live_blocks(BlockDescriptor::PtrCompare) {} /** * \brief Default constructor. * * Configured with: * \par * - \p bin_growth = 8 * - \p min_bin = 3 * - \p max_bin = 7 * - \p max_cached_bytes = (\p bin_growth ^ \p max_bin) * 3) - 1 = 6,291,455 bytes * * which delineates five bin-sizes: 512B, 4KB, 32KB, 256KB, and 2MB and * sets a maximum of 6,291,455 cached bytes per device */ hypre_cub_CachingDeviceAllocator( bool skip_cleanup = false, bool debug = false, bool use_managed_memory = false) : bin_growth(8), min_bin(3), max_bin(7), min_bin_bytes(IntPow(bin_growth, min_bin)), max_bin_bytes(IntPow(bin_growth, max_bin)), max_cached_bytes((max_bin_bytes * 3) - 1), skip_cleanup(skip_cleanup), debug(debug), use_managed_memory(use_managed_memory), cached_blocks(BlockDescriptor::SizeCompare), live_blocks(BlockDescriptor::PtrCompare) {} /** * \brief Sets the limit on the number bytes this allocator is allowed to cache per device. * * Changing the ceiling of cached bytes does not cause any allocations (in-use or * cached-in-reserve) to be freed. See \p FreeAllCached(). */ cudaError_t SetMaxCachedBytes( size_t max_cached_bytes) { // Lock mutex.Lock(); if (debug) printf("Changing max_cached_bytes (%zu -> %zu)\n", this->max_cached_bytes, max_cached_bytes); this->max_cached_bytes = max_cached_bytes; // Unlock mutex.Unlock(); return cudaSuccess; } /** * \brief Provides a suitable allocation of device memory for the given size on the specified device. * * Once freed, the allocation becomes available immediately for reuse within the \p active_stream * with which it was associated with during allocation, and it becomes available for reuse within other * streams when all prior work submitted to \p active_stream has completed. */ cudaError_t DeviceAllocate( hypre_int device, ///< [in] Device on which to place the allocation void **d_ptr, ///< [out] Reference to pointer to the allocation size_t bytes, ///< [in] Minimum number of bytes for the allocation cudaStream_t active_stream = 0) ///< [in] The stream to be associated with this allocation { *d_ptr = NULL; hypre_int entrypoint_device = INVALID_DEVICE_ORDINAL; cudaError_t error = cudaSuccess; if (device == INVALID_DEVICE_ORDINAL) { if ((error = cudaGetDevice(&entrypoint_device))) return error; device = entrypoint_device; } // Create a block descriptor for the requested allocation bool found = false; BlockDescriptor search_key(device); search_key.associated_stream = active_stream; NearestPowerOf(search_key.bin, search_key.bytes, bin_growth, bytes); if (search_key.bin > max_bin) { // Bin is greater than our maximum bin: allocate the request // exactly and give out-of-bounds bin. It will not be cached // for reuse when returned. search_key.bin = INVALID_BIN; search_key.bytes = bytes; } else { // Search for a suitable cached allocation: lock mutex.Lock(); if (search_key.bin < min_bin) { // Bin is less than minimum bin: round up search_key.bin = min_bin; search_key.bytes = min_bin_bytes; } // Iterate through the range of cached blocks on the same device in the same bin CachedBlocks::iterator block_itr = cached_blocks.lower_bound(search_key); while ((block_itr != cached_blocks.end()) && (block_itr->device == device) && (block_itr->bin == search_key.bin)) { // To prevent races with reusing blocks returned by the host but still // in use by the device, only consider cached blocks that are // either (from the active stream) or (from an idle stream) if ((active_stream == block_itr->associated_stream) || (cudaEventQuery(block_itr->ready_event) != cudaErrorNotReady)) { // Reuse existing cache block. Insert into live blocks. found = true; search_key = *block_itr; search_key.associated_stream = active_stream; live_blocks.insert(search_key); // Remove from free blocks cached_bytes[device].free -= search_key.bytes; cached_bytes[device].live += search_key.bytes; if (debug) printf("\tDevice %d reused cached block at %p (%zu bytes) for stream %p (previously associated with stream %p).\n", device, search_key.d_ptr, search_key.bytes, search_key.associated_stream, block_itr->associated_stream); cached_blocks.erase(block_itr); break; } block_itr++; } // Done searching: unlock mutex.Unlock(); } // Allocate the block if necessary if (!found) { // Set runtime's current device to specified device (entrypoint may not be set) if (device != entrypoint_device) { if ((error = cudaGetDevice(&entrypoint_device))) return error; if ((error = cudaSetDevice(device))) return error; } // Attempt to allocate if (use_managed_memory) { error = cudaMallocManaged(&search_key.d_ptr, search_key.bytes); } else { error = cudaMalloc(&search_key.d_ptr, search_key.bytes); } if ((error) == cudaErrorMemoryAllocation) { // The allocation attempt failed: free all cached blocks on device and retry if (debug) printf("\tDevice %d failed to allocate %zu bytes for stream %p, retrying after freeing cached allocations", device, search_key.bytes, search_key.associated_stream); error = cudaSuccess; // Reset the error we will return cudaGetLastError(); // Reset CUDART's error // Lock mutex.Lock(); // Iterate the range of free blocks on the same device BlockDescriptor free_key(device); CachedBlocks::iterator block_itr = cached_blocks.lower_bound(free_key); while ((block_itr != cached_blocks.end()) && (block_itr->device == device)) { // No need to worry about synchronization with the device: cudaFree is // blocking and will synchronize across all kernels executing // on the current device // Free device memory and destroy stream event. if ((error = cudaFree(block_itr->d_ptr))) break; if ((error = cudaEventDestroy(block_itr->ready_event))) break; // Reduce balance and erase entry cached_bytes[device].free -= block_itr->bytes; if (debug) printf("\tDevice %d freed %zu bytes.\n\t\t %zu available blocks cached (%zu bytes), %zu live blocks (%zu bytes) outstanding.\n", device, block_itr->bytes, cached_blocks.size(), cached_bytes[device].free, live_blocks.size(), cached_bytes[device].live); cached_blocks.erase(block_itr); block_itr++; } // Unlock mutex.Unlock(); // Return under error if (error) return error; // Try to allocate again if (use_managed_memory) { error = cudaMallocManaged(&search_key.d_ptr, search_key.bytes); } else { error = cudaMalloc(&search_key.d_ptr, search_key.bytes); } if ((error)) return error; } // Create ready event if ((error = cudaEventCreateWithFlags(&search_key.ready_event, cudaEventDisableTiming))) return error; // Insert into live blocks mutex.Lock(); live_blocks.insert(search_key); cached_bytes[device].live += search_key.bytes; mutex.Unlock(); if (debug) printf("\tDevice %d allocated new device block at %p (%zu bytes associated with stream %p).\n", device, search_key.d_ptr, search_key.bytes, search_key.associated_stream); // Attempt to revert back to previous device if necessary if ((entrypoint_device != INVALID_DEVICE_ORDINAL) && (entrypoint_device != device)) { if ((error = cudaSetDevice(entrypoint_device))) return error; } } // Copy device pointer to output parameter *d_ptr = search_key.d_ptr; if (debug) printf("\t\t%zu available blocks cached (%zu bytes), %zu live blocks outstanding(%zu bytes).\n", cached_blocks.size(), cached_bytes[device].free, live_blocks.size(), cached_bytes[device].live); return error; } /** * \brief Provides a suitable allocation of device memory for the given size on the current device. * * Once freed, the allocation becomes available immediately for reuse within the \p active_stream * with which it was associated with during allocation, and it becomes available for reuse within other * streams when all prior work submitted to \p active_stream has completed. */ cudaError_t DeviceAllocate( void **d_ptr, ///< [out] Reference to pointer to the allocation size_t bytes, ///< [in] Minimum number of bytes for the allocation cudaStream_t active_stream = 0) ///< [in] The stream to be associated with this allocation { return DeviceAllocate(INVALID_DEVICE_ORDINAL, d_ptr, bytes, active_stream); } char * allocate(size_t bytes) { char *ptr; DeviceAllocate((void **) &ptr, bytes); return ptr; } /** * \brief Frees a live allocation of device memory on the specified device, returning it to the allocator. * * Once freed, the allocation becomes available immediately for reuse within the \p active_stream * with which it was associated with during allocation, and it becomes available for reuse within other * streams when all prior work submitted to \p active_stream has completed. */ cudaError_t DeviceFree( hypre_int device, void* d_ptr) { hypre_int entrypoint_device = INVALID_DEVICE_ORDINAL; cudaError_t error = cudaSuccess; if (device == INVALID_DEVICE_ORDINAL) { if ((error = cudaGetDevice(&entrypoint_device))) return error; device = entrypoint_device; } // Lock mutex.Lock(); // Find corresponding block descriptor bool recached = false; BlockDescriptor search_key(d_ptr, device); BusyBlocks::iterator block_itr = live_blocks.find(search_key); if (block_itr != live_blocks.end()) { // Remove from live blocks search_key = *block_itr; live_blocks.erase(block_itr); cached_bytes[device].live -= search_key.bytes; // Keep the returned allocation if bin is valid and we won't exceed the max cached threshold if ((search_key.bin != INVALID_BIN) && (cached_bytes[device].free + search_key.bytes <= max_cached_bytes)) { // Insert returned allocation into free blocks recached = true; cached_blocks.insert(search_key); cached_bytes[device].free += search_key.bytes; if (debug) printf("\tDevice %d returned %zu bytes from associated stream %p.\n\t\t %zu available blocks cached (%zu bytes), %zu live blocks outstanding. (%zu bytes)\n", device, search_key.bytes, search_key.associated_stream, cached_blocks.size(), cached_bytes[device].free, live_blocks.size(), cached_bytes[device].live); } } // Unlock mutex.Unlock(); // First set to specified device (entrypoint may not be set) if (device != entrypoint_device) { if ((error = cudaGetDevice(&entrypoint_device))) return error; if ((error = cudaSetDevice(device))) return error; } if (recached) { // Insert the ready event in the associated stream (must have current device set properly) if ((error = cudaEventRecord(search_key.ready_event, search_key.associated_stream))) return error; } else { // Free the allocation from the runtime and cleanup the event. if ((error = cudaFree(d_ptr))) return error; if ((error = cudaEventDestroy(search_key.ready_event))) return error; if (debug) printf("\tDevice %d freed %zu bytes from associated stream %p.\n\t\t %zu available blocks cached (%zu bytes), %zu live blocks (%zu bytes) outstanding.\n", device, search_key.bytes, search_key.associated_stream, cached_blocks.size(), cached_bytes[device].free, live_blocks.size(), cached_bytes[device].live); } // Reset device if ((entrypoint_device != INVALID_DEVICE_ORDINAL) && (entrypoint_device != device)) { if ((error = cudaSetDevice(entrypoint_device))) return error; } return error; } /** * \brief Frees a live allocation of device memory on the current device, returning it to the allocator. * * Once freed, the allocation becomes available immediately for reuse within the \p active_stream * with which it was associated with during allocation, and it becomes available for reuse within other * streams when all prior work submitted to \p active_stream has completed. */ cudaError_t DeviceFree( void* d_ptr) { return DeviceFree(INVALID_DEVICE_ORDINAL, d_ptr); } void deallocate(char *ptr, size_t) { DeviceFree((void *) ptr); } /** * \brief Frees all cached device allocations on all devices */ cudaError_t FreeAllCached() { cudaError_t error = cudaSuccess; hypre_int entrypoint_device = INVALID_DEVICE_ORDINAL; hypre_int current_device = INVALID_DEVICE_ORDINAL; mutex.Lock(); while (!cached_blocks.empty()) { // Get first block CachedBlocks::iterator begin = cached_blocks.begin(); // Get entry-point device ordinal if necessary if (entrypoint_device == INVALID_DEVICE_ORDINAL) { if ((error = cudaGetDevice(&entrypoint_device))) break; } // Set current device ordinal if necessary if (begin->device != current_device) { if ((error = cudaSetDevice(begin->device))) break; current_device = begin->device; } // Free device memory if ((error = cudaFree(begin->d_ptr))) break; if ((error = cudaEventDestroy(begin->ready_event))) break; // Reduce balance and erase entry cached_bytes[current_device].free -= begin->bytes; if (debug) printf("\tDevice %d freed %zu bytes.\n\t\t %zu available blocks cached (%zu bytes), %zu live blocks (%zu bytes) outstanding.\n", current_device, begin->bytes, cached_blocks.size(), cached_bytes[current_device].free, live_blocks.size(), cached_bytes[current_device].live); cached_blocks.erase(begin); } mutex.Unlock(); // Attempt to revert back to entry-point device if necessary if (entrypoint_device != INVALID_DEVICE_ORDINAL) { if ((error = cudaSetDevice(entrypoint_device))) return error; } return error; } /** * \brief Destructor */ virtual ~hypre_cub_CachingDeviceAllocator() { if (!skip_cleanup) FreeAllCached(); } }; #endif // #if defined(HYPRE_USING_CUDA) && defined(HYPRE_USING_DEVICE_POOL) #endif // #ifndef HYPRE_CUB_ALLOCATOR_HEADER #ifdef __cplusplus } #endif #endif hypre-2.33.0/src/utilities/amg_linklist.c000066400000000000000000000171531477326011500203660ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /*************************************************************************** * * Routines for linked list for boomerAMG * ****************************************************************************/ #include "_hypre_utilities.h" #define hypre_LIST_HEAD -1 #define hypre_LIST_TAIL -2 /************************************************************** * * dispose_elt(): dispose of memory space used by the element * pointed to by element_ptr and return it to * the memory pool. * **************************************************************/ void hypre_dispose_elt ( hypre_LinkList element_ptr ) { hypre_TFree(element_ptr, HYPRE_MEMORY_HOST); } /***************************************************************** * * remove_point: removes a point from the lists * ****************************************************************/ void hypre_remove_point(hypre_LinkList *LoL_head_ptr, hypre_LinkList *LoL_tail_ptr, HYPRE_Int measure, HYPRE_Int index, HYPRE_Int *lists, HYPRE_Int *where) { hypre_LinkList LoL_head = *LoL_head_ptr; hypre_LinkList LoL_tail = *LoL_tail_ptr; hypre_LinkList list_ptr; list_ptr = LoL_head; do { if (measure == list_ptr->data) { /* point to be removed is only point on list, which must be destroyed */ if (list_ptr->head == index && list_ptr->tail == index) { /* removing only list, so num_left better be 0! */ if (list_ptr == LoL_head && list_ptr == LoL_tail) { LoL_head = NULL; LoL_tail = NULL; hypre_dispose_elt(list_ptr); *LoL_head_ptr = LoL_head; *LoL_tail_ptr = LoL_tail; return; } else if (LoL_head == list_ptr) /*removing 1st (max_measure) list */ { list_ptr -> next_elt -> prev_elt = NULL; LoL_head = list_ptr->next_elt; hypre_dispose_elt(list_ptr); *LoL_head_ptr = LoL_head; *LoL_tail_ptr = LoL_tail; return; } else if (LoL_tail == list_ptr) /* removing last list */ { list_ptr -> prev_elt -> next_elt = NULL; LoL_tail = list_ptr->prev_elt; hypre_dispose_elt(list_ptr); *LoL_head_ptr = LoL_head; *LoL_tail_ptr = LoL_tail; return; } else { list_ptr -> next_elt -> prev_elt = list_ptr -> prev_elt; list_ptr -> prev_elt -> next_elt = list_ptr -> next_elt; hypre_dispose_elt(list_ptr); *LoL_head_ptr = LoL_head; *LoL_tail_ptr = LoL_tail; return; } } else if (list_ptr->head == index) /* index is head of list */ { list_ptr->head = lists[index]; where[lists[index]] = hypre_LIST_HEAD; return; } else if (list_ptr->tail == index) /* index is tail of list */ { list_ptr->tail = where[index]; lists[where[index]] = hypre_LIST_TAIL; return; } else /* index is in middle of list */ { lists[where[index]] = lists[index]; where[lists[index]] = where[index]; return; } } list_ptr = list_ptr -> next_elt; } while (list_ptr != NULL); hypre_error_w_msg(HYPRE_ERROR_GENERIC, "No such list!\n"); return ; } /***************************************************************** * * hypre_create_elt() : Create an element using Item for its data field * *****************************************************************/ hypre_LinkList hypre_create_elt( HYPRE_Int Item ) { hypre_LinkList new_elt_ptr; /* Allocate memory space for the new node. * return with error if no space available */ if ( (new_elt_ptr = hypre_TAlloc(hypre_ListElement, 1, HYPRE_MEMORY_HOST)) == NULL) { hypre_error_w_msg(HYPRE_ERROR_GENERIC, "\n create_elt: malloc failed \n\n"); } else /* new_elt_ptr = hypre_CTAlloc(hypre_LinkList, 1); */ { new_elt_ptr -> data = Item; new_elt_ptr -> next_elt = NULL; new_elt_ptr -> prev_elt = NULL; new_elt_ptr -> head = hypre_LIST_TAIL; new_elt_ptr -> tail = hypre_LIST_HEAD; } return (new_elt_ptr); } /***************************************************************** * * enter_on_lists places point in new list * ****************************************************************/ void hypre_enter_on_lists(hypre_LinkList *LoL_head_ptr, hypre_LinkList *LoL_tail_ptr, HYPRE_Int measure, HYPRE_Int index, HYPRE_Int *lists, HYPRE_Int *where) { hypre_LinkList LoL_head = *LoL_head_ptr; hypre_LinkList LoL_tail = *LoL_tail_ptr; hypre_LinkList list_ptr; hypre_LinkList new_ptr; HYPRE_Int old_tail; list_ptr = LoL_head; if (LoL_head == NULL) /* no lists exist yet */ { new_ptr = hypre_create_elt(measure); new_ptr->head = index; new_ptr->tail = index; lists[index] = hypre_LIST_TAIL; where[index] = hypre_LIST_HEAD; LoL_head = new_ptr; LoL_tail = new_ptr; *LoL_head_ptr = LoL_head; *LoL_tail_ptr = LoL_tail; return; } else { do { if (measure > list_ptr->data) { new_ptr = hypre_create_elt(measure); new_ptr->head = index; new_ptr->tail = index; lists[index] = hypre_LIST_TAIL; where[index] = hypre_LIST_HEAD; if ( list_ptr->prev_elt != NULL) { new_ptr->prev_elt = list_ptr->prev_elt; list_ptr->prev_elt->next_elt = new_ptr; list_ptr->prev_elt = new_ptr; new_ptr->next_elt = list_ptr; } else { new_ptr->next_elt = list_ptr; list_ptr->prev_elt = new_ptr; new_ptr->prev_elt = NULL; LoL_head = new_ptr; } *LoL_head_ptr = LoL_head; *LoL_tail_ptr = LoL_tail; return; } else if (measure == list_ptr->data) { old_tail = list_ptr->tail; lists[old_tail] = index; where[index] = old_tail; lists[index] = hypre_LIST_TAIL; list_ptr->tail = index; return; } list_ptr = list_ptr->next_elt; } while (list_ptr != NULL); new_ptr = hypre_create_elt(measure); new_ptr->head = index; new_ptr->tail = index; lists[index] = hypre_LIST_TAIL; where[index] = hypre_LIST_HEAD; LoL_tail->next_elt = new_ptr; new_ptr->prev_elt = LoL_tail; new_ptr->next_elt = NULL; LoL_tail = new_ptr; *LoL_head_ptr = LoL_head; *LoL_tail_ptr = LoL_tail; return; } } hypre-2.33.0/src/utilities/amg_linklist.h000066400000000000000000000020561477326011500203670ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * Header file link lists * *****************************************************************************/ #ifndef HYPRE_LINKLIST_HEADER #define HYPRE_LINKLIST_HEADER #include #include #include #ifdef __cplusplus extern "C" { #endif struct double_linked_list { HYPRE_Int data; struct double_linked_list *next_elt; struct double_linked_list *prev_elt; HYPRE_Int head; HYPRE_Int tail; }; typedef struct double_linked_list hypre_ListElement; typedef hypre_ListElement *hypre_LinkList; #ifdef __cplusplus } #endif #endif hypre-2.33.0/src/utilities/ap.c000066400000000000000000000011771477326011500163100ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "_hypre_utilities.h" /* This file will eventually contain functions needed to support a runtime decision of whether to use the assumed partition */ /* returns 1 if the assumed partition is in use */ HYPRE_Int HYPRE_AssumedPartitionCheck(void) { return 1; } hypre-2.33.0/src/utilities/base.h000066400000000000000000000022101477326011500166140ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #ifndef HYPRE_BASE_HEADER #define HYPRE_BASE_HEADER /****************************************************************************** * * Base private solver struct * *****************************************************************************/ typedef struct { HYPRE_PtrToSolverFcn setup; HYPRE_PtrToSolverFcn solve; HYPRE_PtrToDestroyFcn destroy; } hypre_Solver; /*-------------------------------------------------------------------------- * Accessor functions for the hypre_Solver structure *--------------------------------------------------------------------------*/ #define hypre_SolverSetup(data) ((data) -> setup) #define hypre_SolverSolve(data) ((data) -> solve) #define hypre_SolverDestroy(data) ((data) -> destroy) #endif /* HYPRE_BASE_HEADER */ hypre-2.33.0/src/utilities/binsearch.c000066400000000000000000000100761477326011500176440ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "_hypre_utilities.h" /*-------------------------------------------------------------------------- * hypre_BinarySearch * performs a binary search for value on array list where list needs * to contain ordered nonnegative numbers * the routine returns the location of the value or -1 *--------------------------------------------------------------------------*/ HYPRE_Int hypre_BinarySearch(HYPRE_Int *list, HYPRE_Int value, HYPRE_Int list_length) { HYPRE_Int low, high, m; HYPRE_Int not_found = 1; low = 0; high = list_length - 1; while (not_found && low <= high) { m = (low + high) / 2; if (value < list[m]) { high = m - 1; } else if (value > list[m]) { low = m + 1; } else { not_found = 0; return m; } } return -1; } /*-------------------------------------------------------------------------- * hypre_BigBinarySearch * performs a binary search for value on array list where list needs * to contain ordered nonnegative numbers * the routine returns the location of the value or -1 *--------------------------------------------------------------------------*/ HYPRE_Int hypre_BigBinarySearch(HYPRE_BigInt *list, HYPRE_BigInt value, HYPRE_Int list_length) { HYPRE_Int low, high, m; HYPRE_Int not_found = 1; low = 0; high = list_length - 1; while (not_found && low <= high) { m = low + (high - low) / 2; if (value < list[m]) { high = m - 1; } else if (value > list[m]) { low = m + 1; } else { not_found = 0; return m; } } return -1; } /*-------------------------------------------------------------------------- * hypre_BinarySearch2 * this one is a bit more robust: * avoids overflow of m as can happen above when (low+high) overflows * lets user specify high and low bounds for array (so a subset of array can be used) * if not found, then spot returns where is should be inserted *--------------------------------------------------------------------------*/ HYPRE_Int hypre_BinarySearch2(HYPRE_Int *list, HYPRE_Int value, HYPRE_Int low, HYPRE_Int high, HYPRE_Int *spot) { HYPRE_Int m; while (low <= high) { m = low + (high - low) / 2; if (value < list[m]) { high = m - 1; } else if (value > list[m]) { low = m + 1; } else { *spot = m; return m; } } /* not found (high = low-1) - so insert at low */ *spot = low; return -1; } /*-------------------------------------------------------------------------- * Equivalent to C++ std::lower_bound *--------------------------------------------------------------------------*/ HYPRE_Int *hypre_LowerBound( HYPRE_Int *first, HYPRE_Int *last, HYPRE_Int value ) { HYPRE_Int *it; HYPRE_Int count = last - first, step; while (count > 0) { it = first; step = count / 2; it += step; if (*it < value) { first = ++it; count -= step + 1; } else { count = step; } } return first; } /*-------------------------------------------------------------------------- * Equivalent to C++ std::lower_bound *--------------------------------------------------------------------------*/ HYPRE_BigInt *hypre_BigLowerBound( HYPRE_BigInt *first, HYPRE_BigInt *last, HYPRE_BigInt value ) { HYPRE_BigInt *it; HYPRE_BigInt count = last - first, step; while (count > 0) { it = first; step = count / 2; it += step; if (*it < value) { first = ++it; count -= step + 1; } else { count = step; } } return first; } hypre-2.33.0/src/utilities/caliper_instrumentation.h000066400000000000000000000045301477326011500226530ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * Header file for Caliper instrumentation macros * *****************************************************************************/ #ifndef CALIPER_INSTRUMENTATION_HEADER #define CALIPER_INSTRUMENTATION_HEADER #include "HYPRE_config.h" #ifdef HYPRE_USING_CALIPER #ifdef __cplusplus extern "C++" { #endif #include #ifdef __cplusplus } #endif #define HYPRE_ANNOTATE_FUNC_BEGIN CALI_MARK_FUNCTION_BEGIN #define HYPRE_ANNOTATE_FUNC_END CALI_MARK_FUNCTION_END #define HYPRE_ANNOTATE_LOOP_BEGIN(id, str) CALI_MARK_LOOP_BEGIN(id, str) #define HYPRE_ANNOTATE_LOOP_END(id) CALI_MARK_LOOP_END(id) #define HYPRE_ANNOTATE_ITER_BEGIN(id, it) CALI_MARK_ITERATION_BEGIN(id, it) #define HYPRE_ANNOTATE_ITER_END(id) CALI_MARK_ITERATION_END(id) #define HYPRE_ANNOTATE_REGION_BEGIN(...)\ {\ char hypre__markname[1024];\ hypre_sprintf(hypre__markname, __VA_ARGS__);\ CALI_MARK_BEGIN(hypre__markname);\ } #define HYPRE_ANNOTATE_REGION_END(...)\ {\ char hypre__markname[1024];\ hypre_sprintf(hypre__markname, __VA_ARGS__);\ CALI_MARK_END(hypre__markname);\ } #define HYPRE_ANNOTATE_MGLEVEL_BEGIN(lvl)\ {\ char hypre__levelname[16];\ hypre_sprintf(hypre__levelname, "MG level %d", lvl);\ CALI_MARK_BEGIN(hypre__levelname);\ } #define HYPRE_ANNOTATE_MGLEVEL_END(lvl)\ {\ char hypre__levelname[16];\ hypre_sprintf(hypre__levelname, "MG level %d", lvl);\ CALI_MARK_END(hypre__levelname);\ } #else #define HYPRE_ANNOTATE_FUNC_BEGIN #define HYPRE_ANNOTATE_FUNC_END #define HYPRE_ANNOTATE_LOOP_BEGIN(id, str) #define HYPRE_ANNOTATE_LOOP_END(id) #define HYPRE_ANNOTATE_ITER_BEGIN(id, it) #define HYPRE_ANNOTATE_ITER_END(id) #define HYPRE_ANNOTATE_REGION_BEGIN(...) #define HYPRE_ANNOTATE_REGION_END(...) #define HYPRE_ANNOTATE_MAX_MGLEVEL(lvl) #define HYPRE_ANNOTATE_MGLEVEL_BEGIN(lvl) #define HYPRE_ANNOTATE_MGLEVEL_END(lvl) #endif #endif /* CALIPER_INSTRUMENTATION_HEADER */ hypre-2.33.0/src/utilities/complex.c000066400000000000000000000026231477326011500173540ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "_hypre_utilities.h" #ifdef HYPRE_COMPLEX #include HYPRE_Complex hypre_conj( HYPRE_Complex value ) { #if defined(HYPRE_SINGLE) return conjf(value); #elif defined(HYPRE_LONG_DOUBLE) return conjl(value); #else return conj(value); #endif } HYPRE_Real hypre_cabs( HYPRE_Complex value ) { #if defined(HYPRE_SINGLE) return cabsf(value); #elif defined(HYPRE_LONG_DOUBLE) return cabsl(value); #else return cabs(value); #endif } HYPRE_Real hypre_creal( HYPRE_Complex value ) { #if defined(HYPRE_SINGLE) return crealf(value); #elif defined(HYPRE_LONG_DOUBLE) return creall(value); #else return creal(value); #endif } HYPRE_Real hypre_cimag( HYPRE_Complex value ) { #if defined(HYPRE_SINGLE) return cimagf(value); #elif defined(HYPRE_LONG_DOUBLE) return cimagl(value); #else return cimag(value); #endif } HYPRE_Complex hypre_csqrt( HYPRE_Complex value ) { #if defined(HYPRE_SINGLE) return csqrtf(value); #elif defined(HYPRE_LONG_DOUBLE) return csqrtl(value); #else return csqrt(value); #endif } #endif hypre-2.33.0/src/utilities/cub_allocator.h000066400000000000000000000735371477326011500205370ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 2011, Duane Merrill. All rights reserved. * Copyright (c) 2011-2018, NVIDIA CORPORATION. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 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. * * Neither the name of the NVIDIA CORPORATION nor the * names of its contributors may be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "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 NVIDIA CORPORATION 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. * ******************************************************************************/ /****************************************************************************** * Simple caching allocator for device memory allocations. The allocator is * thread-safe and capable of managing device allocations on multiple devices. ******************************************************************************/ #ifndef HYPRE_CUB_ALLOCATOR_HEADER #define HYPRE_CUB_ALLOCATOR_HEADER #if defined(HYPRE_USING_CUDA) && defined(HYPRE_USING_DEVICE_POOL) #include #include #if (__cplusplus > 199711L) || (defined(_MSC_VER) && _MSC_VER >= 1800) #include #else #if defined(_WIN32) || defined(_WIN64) #include #define WIN32_LEAN_AND_MEAN #define NOMINMAX #include #undef WIN32_LEAN_AND_MEAN #undef NOMINMAX /** * Compiler read/write barrier */ #pragma intrinsic(_ReadWriteBarrier) #endif #endif /** * Simple portable mutex * - Wraps std::mutex when compiled with C++11 or newer (supported on all platforms) * - Uses GNU/Windows spinlock mechanisms for pre C++11 (supported on x86/x64 when compiled with cl.exe or g++) */ struct hypre_cub_Mutex { #if (__cplusplus > 199711L) || (defined(_MSC_VER) && _MSC_VER >= 1800) std::mutex mtx; void Lock() { mtx.lock(); } void Unlock() { mtx.unlock(); } void TryLock() { mtx.try_lock(); } #else //__cplusplus > 199711L #if defined(_MSC_VER) // Microsoft VC++ typedef hypre_longint Spinlock; #else // GNU g++ typedef hypre_int Spinlock; /** * Compiler read/write barrier */ __forceinline__ void _ReadWriteBarrier() { __sync_synchronize(); } /** * Atomic exchange */ __forceinline__ hypre_longint _InterlockedExchange(volatile hypre_int * const Target, const hypre_int Value) { // NOTE: __sync_lock_test_and_set would be an acquire barrier, so we force a full barrier _ReadWriteBarrier(); return __sync_lock_test_and_set(Target, Value); } /** * Pause instruction to prevent excess processor bus usage */ __forceinline__ void YieldProcessor() { } #endif // defined(_MSC_VER) /// Lock member volatile Spinlock lock; /** * Constructor */ hypre_cub_Mutex() : lock(0) {} /** * Return when the specified spinlock has been acquired */ __forceinline__ void Lock() { while (1) { if (!_InterlockedExchange(&lock, 1)) return; while (lock) YieldProcessor(); } } /** * Release the specified spinlock */ __forceinline__ void Unlock() { _ReadWriteBarrier(); lock = 0; } #endif // __cplusplus > 199711L }; #include /****************************************************************************** * CachingDeviceAllocator (host use) ******************************************************************************/ /** * \brief A simple caching allocator for device memory allocations. * * \par Overview * The allocator is thread-safe and stream-safe and is capable of managing cached * device allocations on multiple devices. It behaves as follows: * * \par * - Allocations from the allocator are associated with an \p active_stream. Once freed, * the allocation becomes available immediately for reuse within the \p active_stream * with which it was associated with during allocation, and it becomes available for * reuse within other streams when all prior work submitted to \p active_stream has completed. * - Allocations are categorized and cached by bin size. A new allocation request of * a given size will only consider cached allocations within the corresponding bin. * - Bin limits progress geometrically in accordance with the growth factor * \p bin_growth provided during construction. Unused device allocations within * a larger bin cache are not reused for allocation requests that categorize to * smaller bin sizes. * - Allocation requests below (\p bin_growth ^ \p min_bin) are rounded up to * (\p bin_growth ^ \p min_bin). * - Allocations above (\p bin_growth ^ \p max_bin) are not rounded up to the nearest * bin and are simply freed when they are deallocated instead of being returned * to a bin-cache. * - %If the total storage of cached allocations on a given device will exceed * \p max_cached_bytes, allocations for that device are simply freed when they are * deallocated instead of being returned to their bin-cache. * * \par * For example, the default-constructed CachingDeviceAllocator is configured with: * - \p bin_growth = 8 * - \p min_bin = 3 * - \p max_bin = 7 * - \p max_cached_bytes = 6MB - 1B * * \par * which delineates five bin-sizes: 512B, 4KB, 32KB, 256KB, and 2MB * and sets a maximum of 6,291,455 cached bytes per device * */ struct hypre_cub_CachingDeviceAllocator { typedef char value_type; //--------------------------------------------------------------------- // Constants //--------------------------------------------------------------------- /// Out-of-bounds bin static const hypre_uint INVALID_BIN = (hypre_uint) -1; /// Invalid size static const size_t INVALID_SIZE = (size_t) -1; /// Invalid device ordinal static const hypre_int INVALID_DEVICE_ORDINAL = -1; //--------------------------------------------------------------------- // Type definitions and helper types //--------------------------------------------------------------------- /** * Descriptor for device memory allocations */ struct BlockDescriptor { void* d_ptr; // Device pointer size_t bytes; // Size of allocation in bytes hypre_uint bin; // Bin enumeration hypre_int device; // device ordinal cudaStream_t associated_stream; // Associated associated_stream cudaEvent_t ready_event; // Signal when associated stream has run to the point at which this block was freed // Constructor (suitable for searching maps for a specific block, given its pointer and device) BlockDescriptor(void *d_ptr, hypre_int device) : d_ptr(d_ptr), bytes(0), bin(INVALID_BIN), device(device), associated_stream(0), ready_event(0) {} // Constructor (suitable for searching maps for a range of suitable blocks, given a device) BlockDescriptor(hypre_int device) : d_ptr(NULL), bytes(0), bin(INVALID_BIN), device(device), associated_stream(0), ready_event(0) {} // Comparison functor for comparing device pointers static bool PtrCompare(const BlockDescriptor &a, const BlockDescriptor &b) { if (a.device == b.device) return (a.d_ptr < b.d_ptr); else return (a.device < b.device); } // Comparison functor for comparing allocation sizes static bool SizeCompare(const BlockDescriptor &a, const BlockDescriptor &b) { if (a.device == b.device) return (a.bytes < b.bytes); else return (a.device < b.device); } }; /// BlockDescriptor comparator function interface typedef bool (*Compare)(const BlockDescriptor &, const BlockDescriptor &); class TotalBytes { public: size_t free; size_t live; TotalBytes() { free = live = 0; } }; /// Set type for cached blocks (ordered by size) typedef std::multiset CachedBlocks; /// Set type for live blocks (ordered by ptr) typedef std::multiset BusyBlocks; /// Map type of device ordinals to the number of cached bytes cached by each device typedef std::map GpuCachedBytes; //--------------------------------------------------------------------- // Utility functions //--------------------------------------------------------------------- /** * Integer pow function for unsigned base and exponent */ static hypre_uint IntPow( hypre_uint base, hypre_uint exp) { hypre_uint retval = 1; while (exp > 0) { if (exp & 1) { retval = retval * base; // multiply the result by the current base } base = base * base; // square the base exp = exp >> 1; // divide the exponent in half } return retval; } /** * Round up to the nearest power-of */ void NearestPowerOf( hypre_uint &power, size_t &rounded_bytes, hypre_uint base, size_t value) { power = 0; rounded_bytes = 1; if (value * base < value) { // Overflow power = sizeof(size_t) * 8; rounded_bytes = size_t(0) - 1; return; } while (rounded_bytes < value) { rounded_bytes *= base; power++; } } //--------------------------------------------------------------------- // Fields //--------------------------------------------------------------------- hypre_cub_Mutex mutex; /// Mutex for thread-safety hypre_uint bin_growth; /// Geometric growth factor for bin-sizes hypre_uint min_bin; /// Minimum bin enumeration hypre_uint max_bin; /// Maximum bin enumeration size_t min_bin_bytes; /// Minimum bin size size_t max_bin_bytes; /// Maximum bin size size_t max_cached_bytes; /// Maximum aggregate cached bytes per device const bool skip_cleanup; /// Whether or not to skip a call to FreeAllCached() when destructor is called. (The CUDA runtime may have already shut down for statically declared allocators) bool debug; /// Whether or not to print (de)allocation events to stdout GpuCachedBytes cached_bytes; /// Map of device ordinal to aggregate cached bytes on that device CachedBlocks cached_blocks; /// Set of cached device allocations available for reuse BusyBlocks live_blocks; /// Set of live device allocations currently in use bool use_managed_memory; /// Whether to use managed memory or device memory //--------------------------------------------------------------------- // Methods //--------------------------------------------------------------------- /** * \brief Constructor. */ hypre_cub_CachingDeviceAllocator( hypre_uint bin_growth, ///< Geometric growth factor for bin-sizes hypre_uint min_bin = 1, ///< Minimum bin (default is bin_growth ^ 1) hypre_uint max_bin = INVALID_BIN, ///< Maximum bin (default is no max bin) size_t max_cached_bytes = INVALID_SIZE, ///< Maximum aggregate cached bytes per device (default is no limit) bool skip_cleanup = false, ///< Whether or not to skip a call to \p FreeAllCached() when the destructor is called (default is to deallocate) bool debug = false, ///< Whether or not to print (de)allocation events to stdout (default is no stderr output) bool use_managed_memory = false) ///< Whether to use managed memory or device memory : bin_growth(bin_growth), min_bin(min_bin), max_bin(max_bin), min_bin_bytes(IntPow(bin_growth, min_bin)), max_bin_bytes(IntPow(bin_growth, max_bin)), max_cached_bytes(max_cached_bytes), skip_cleanup(skip_cleanup), debug(debug), use_managed_memory(use_managed_memory), cached_blocks(BlockDescriptor::SizeCompare), live_blocks(BlockDescriptor::PtrCompare) {} /** * \brief Default constructor. * * Configured with: * \par * - \p bin_growth = 8 * - \p min_bin = 3 * - \p max_bin = 7 * - \p max_cached_bytes = (\p bin_growth ^ \p max_bin) * 3) - 1 = 6,291,455 bytes * * which delineates five bin-sizes: 512B, 4KB, 32KB, 256KB, and 2MB and * sets a maximum of 6,291,455 cached bytes per device */ hypre_cub_CachingDeviceAllocator( bool skip_cleanup = false, bool debug = false, bool use_managed_memory = false) : bin_growth(8), min_bin(3), max_bin(7), min_bin_bytes(IntPow(bin_growth, min_bin)), max_bin_bytes(IntPow(bin_growth, max_bin)), max_cached_bytes((max_bin_bytes * 3) - 1), skip_cleanup(skip_cleanup), debug(debug), use_managed_memory(use_managed_memory), cached_blocks(BlockDescriptor::SizeCompare), live_blocks(BlockDescriptor::PtrCompare) {} /** * \brief Sets the limit on the number bytes this allocator is allowed to cache per device. * * Changing the ceiling of cached bytes does not cause any allocations (in-use or * cached-in-reserve) to be freed. See \p FreeAllCached(). */ cudaError_t SetMaxCachedBytes( size_t max_cached_bytes) { // Lock mutex.Lock(); if (debug) printf("Changing max_cached_bytes (%zu -> %zu)\n", this->max_cached_bytes, max_cached_bytes); this->max_cached_bytes = max_cached_bytes; // Unlock mutex.Unlock(); return cudaSuccess; } /** * \brief Provides a suitable allocation of device memory for the given size on the specified device. * * Once freed, the allocation becomes available immediately for reuse within the \p active_stream * with which it was associated with during allocation, and it becomes available for reuse within other * streams when all prior work submitted to \p active_stream has completed. */ cudaError_t DeviceAllocate( hypre_int device, ///< [in] Device on which to place the allocation void **d_ptr, ///< [out] Reference to pointer to the allocation size_t bytes, ///< [in] Minimum number of bytes for the allocation cudaStream_t active_stream = 0) ///< [in] The stream to be associated with this allocation { *d_ptr = NULL; hypre_int entrypoint_device = INVALID_DEVICE_ORDINAL; cudaError_t error = cudaSuccess; if (device == INVALID_DEVICE_ORDINAL) { if ((error = cudaGetDevice(&entrypoint_device))) return error; device = entrypoint_device; } // Create a block descriptor for the requested allocation bool found = false; BlockDescriptor search_key(device); search_key.associated_stream = active_stream; NearestPowerOf(search_key.bin, search_key.bytes, bin_growth, bytes); if (search_key.bin > max_bin) { // Bin is greater than our maximum bin: allocate the request // exactly and give out-of-bounds bin. It will not be cached // for reuse when returned. search_key.bin = INVALID_BIN; search_key.bytes = bytes; } else { // Search for a suitable cached allocation: lock mutex.Lock(); if (search_key.bin < min_bin) { // Bin is less than minimum bin: round up search_key.bin = min_bin; search_key.bytes = min_bin_bytes; } // Iterate through the range of cached blocks on the same device in the same bin CachedBlocks::iterator block_itr = cached_blocks.lower_bound(search_key); while ((block_itr != cached_blocks.end()) && (block_itr->device == device) && (block_itr->bin == search_key.bin)) { // To prevent races with reusing blocks returned by the host but still // in use by the device, only consider cached blocks that are // either (from the active stream) or (from an idle stream) if ((active_stream == block_itr->associated_stream) || (cudaEventQuery(block_itr->ready_event) != cudaErrorNotReady)) { // Reuse existing cache block. Insert into live blocks. found = true; search_key = *block_itr; search_key.associated_stream = active_stream; live_blocks.insert(search_key); // Remove from free blocks cached_bytes[device].free -= search_key.bytes; cached_bytes[device].live += search_key.bytes; if (debug) printf("\tDevice %d reused cached block at %p (%zu bytes) for stream %p (previously associated with stream %p).\n", device, search_key.d_ptr, search_key.bytes, search_key.associated_stream, block_itr->associated_stream); cached_blocks.erase(block_itr); break; } block_itr++; } // Done searching: unlock mutex.Unlock(); } // Allocate the block if necessary if (!found) { // Set runtime's current device to specified device (entrypoint may not be set) if (device != entrypoint_device) { if ((error = cudaGetDevice(&entrypoint_device))) return error; if ((error = cudaSetDevice(device))) return error; } // Attempt to allocate if (use_managed_memory) { error = cudaMallocManaged(&search_key.d_ptr, search_key.bytes); } else { error = cudaMalloc(&search_key.d_ptr, search_key.bytes); } if ((error) == cudaErrorMemoryAllocation) { // The allocation attempt failed: free all cached blocks on device and retry if (debug) printf("\tDevice %d failed to allocate %zu bytes for stream %p, retrying after freeing cached allocations", device, search_key.bytes, search_key.associated_stream); error = cudaSuccess; // Reset the error we will return cudaGetLastError(); // Reset CUDART's error // Lock mutex.Lock(); // Iterate the range of free blocks on the same device BlockDescriptor free_key(device); CachedBlocks::iterator block_itr = cached_blocks.lower_bound(free_key); while ((block_itr != cached_blocks.end()) && (block_itr->device == device)) { // No need to worry about synchronization with the device: cudaFree is // blocking and will synchronize across all kernels executing // on the current device // Free device memory and destroy stream event. if ((error = cudaFree(block_itr->d_ptr))) break; if ((error = cudaEventDestroy(block_itr->ready_event))) break; // Reduce balance and erase entry cached_bytes[device].free -= block_itr->bytes; if (debug) printf("\tDevice %d freed %zu bytes.\n\t\t %zu available blocks cached (%zu bytes), %zu live blocks (%zu bytes) outstanding.\n", device, block_itr->bytes, cached_blocks.size(), cached_bytes[device].free, live_blocks.size(), cached_bytes[device].live); cached_blocks.erase(block_itr); block_itr++; } // Unlock mutex.Unlock(); // Return under error if (error) return error; // Try to allocate again if (use_managed_memory) { error = cudaMallocManaged(&search_key.d_ptr, search_key.bytes); } else { error = cudaMalloc(&search_key.d_ptr, search_key.bytes); } if ((error)) return error; } // Create ready event if ((error = cudaEventCreateWithFlags(&search_key.ready_event, cudaEventDisableTiming))) return error; // Insert into live blocks mutex.Lock(); live_blocks.insert(search_key); cached_bytes[device].live += search_key.bytes; mutex.Unlock(); if (debug) printf("\tDevice %d allocated new device block at %p (%zu bytes associated with stream %p).\n", device, search_key.d_ptr, search_key.bytes, search_key.associated_stream); // Attempt to revert back to previous device if necessary if ((entrypoint_device != INVALID_DEVICE_ORDINAL) && (entrypoint_device != device)) { if ((error = cudaSetDevice(entrypoint_device))) return error; } } // Copy device pointer to output parameter *d_ptr = search_key.d_ptr; if (debug) printf("\t\t%zu available blocks cached (%zu bytes), %zu live blocks outstanding(%zu bytes).\n", cached_blocks.size(), cached_bytes[device].free, live_blocks.size(), cached_bytes[device].live); return error; } /** * \brief Provides a suitable allocation of device memory for the given size on the current device. * * Once freed, the allocation becomes available immediately for reuse within the \p active_stream * with which it was associated with during allocation, and it becomes available for reuse within other * streams when all prior work submitted to \p active_stream has completed. */ cudaError_t DeviceAllocate( void **d_ptr, ///< [out] Reference to pointer to the allocation size_t bytes, ///< [in] Minimum number of bytes for the allocation cudaStream_t active_stream = 0) ///< [in] The stream to be associated with this allocation { return DeviceAllocate(INVALID_DEVICE_ORDINAL, d_ptr, bytes, active_stream); } char * allocate(size_t bytes) { char *ptr; DeviceAllocate((void **) &ptr, bytes); return ptr; } /** * \brief Frees a live allocation of device memory on the specified device, returning it to the allocator. * * Once freed, the allocation becomes available immediately for reuse within the \p active_stream * with which it was associated with during allocation, and it becomes available for reuse within other * streams when all prior work submitted to \p active_stream has completed. */ cudaError_t DeviceFree( hypre_int device, void* d_ptr) { hypre_int entrypoint_device = INVALID_DEVICE_ORDINAL; cudaError_t error = cudaSuccess; if (device == INVALID_DEVICE_ORDINAL) { if ((error = cudaGetDevice(&entrypoint_device))) return error; device = entrypoint_device; } // Lock mutex.Lock(); // Find corresponding block descriptor bool recached = false; BlockDescriptor search_key(d_ptr, device); BusyBlocks::iterator block_itr = live_blocks.find(search_key); if (block_itr != live_blocks.end()) { // Remove from live blocks search_key = *block_itr; live_blocks.erase(block_itr); cached_bytes[device].live -= search_key.bytes; // Keep the returned allocation if bin is valid and we won't exceed the max cached threshold if ((search_key.bin != INVALID_BIN) && (cached_bytes[device].free + search_key.bytes <= max_cached_bytes)) { // Insert returned allocation into free blocks recached = true; cached_blocks.insert(search_key); cached_bytes[device].free += search_key.bytes; if (debug) printf("\tDevice %d returned %zu bytes from associated stream %p.\n\t\t %zu available blocks cached (%zu bytes), %zu live blocks outstanding. (%zu bytes)\n", device, search_key.bytes, search_key.associated_stream, cached_blocks.size(), cached_bytes[device].free, live_blocks.size(), cached_bytes[device].live); } } // Unlock mutex.Unlock(); // First set to specified device (entrypoint may not be set) if (device != entrypoint_device) { if ((error = cudaGetDevice(&entrypoint_device))) return error; if ((error = cudaSetDevice(device))) return error; } if (recached) { // Insert the ready event in the associated stream (must have current device set properly) if ((error = cudaEventRecord(search_key.ready_event, search_key.associated_stream))) return error; } else { // Free the allocation from the runtime and cleanup the event. if ((error = cudaFree(d_ptr))) return error; if ((error = cudaEventDestroy(search_key.ready_event))) return error; if (debug) printf("\tDevice %d freed %zu bytes from associated stream %p.\n\t\t %zu available blocks cached (%zu bytes), %zu live blocks (%zu bytes) outstanding.\n", device, search_key.bytes, search_key.associated_stream, cached_blocks.size(), cached_bytes[device].free, live_blocks.size(), cached_bytes[device].live); } // Reset device if ((entrypoint_device != INVALID_DEVICE_ORDINAL) && (entrypoint_device != device)) { if ((error = cudaSetDevice(entrypoint_device))) return error; } return error; } /** * \brief Frees a live allocation of device memory on the current device, returning it to the allocator. * * Once freed, the allocation becomes available immediately for reuse within the \p active_stream * with which it was associated with during allocation, and it becomes available for reuse within other * streams when all prior work submitted to \p active_stream has completed. */ cudaError_t DeviceFree( void* d_ptr) { return DeviceFree(INVALID_DEVICE_ORDINAL, d_ptr); } void deallocate(char *ptr, size_t) { DeviceFree((void *) ptr); } /** * \brief Frees all cached device allocations on all devices */ cudaError_t FreeAllCached() { cudaError_t error = cudaSuccess; hypre_int entrypoint_device = INVALID_DEVICE_ORDINAL; hypre_int current_device = INVALID_DEVICE_ORDINAL; mutex.Lock(); while (!cached_blocks.empty()) { // Get first block CachedBlocks::iterator begin = cached_blocks.begin(); // Get entry-point device ordinal if necessary if (entrypoint_device == INVALID_DEVICE_ORDINAL) { if ((error = cudaGetDevice(&entrypoint_device))) break; } // Set current device ordinal if necessary if (begin->device != current_device) { if ((error = cudaSetDevice(begin->device))) break; current_device = begin->device; } // Free device memory if ((error = cudaFree(begin->d_ptr))) break; if ((error = cudaEventDestroy(begin->ready_event))) break; // Reduce balance and erase entry cached_bytes[current_device].free -= begin->bytes; if (debug) printf("\tDevice %d freed %zu bytes.\n\t\t %zu available blocks cached (%zu bytes), %zu live blocks (%zu bytes) outstanding.\n", current_device, begin->bytes, cached_blocks.size(), cached_bytes[current_device].free, live_blocks.size(), cached_bytes[current_device].live); cached_blocks.erase(begin); } mutex.Unlock(); // Attempt to revert back to entry-point device if necessary if (entrypoint_device != INVALID_DEVICE_ORDINAL) { if ((error = cudaSetDevice(entrypoint_device))) return error; } return error; } /** * \brief Destructor */ virtual ~hypre_cub_CachingDeviceAllocator() { if (!skip_cleanup) FreeAllCached(); } }; #endif // #if defined(HYPRE_USING_CUDA) && defined(HYPRE_USING_DEVICE_POOL) #endif // #ifndef HYPRE_CUB_ALLOCATOR_HEADER hypre-2.33.0/src/utilities/device_allocator.h000066400000000000000000000020461477326011500212100ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #ifndef DEVICE_ALLOCATOR_H #define DEVICE_ALLOCATOR_H #if defined(HYPRE_USING_CUDA) || defined(HYPRE_USING_HIP) /* C++ style memory allocator for the device using the abstract memory model */ struct hypre_device_allocator { typedef char value_type; hypre_device_allocator() { // constructor } ~hypre_device_allocator() { // destructor } char *allocate(std::ptrdiff_t num_bytes) { return hypre_TAlloc(char, num_bytes, HYPRE_MEMORY_DEVICE); } void deallocate(char *ptr, size_t n) { HYPRE_UNUSED_VAR(n); hypre_TFree(ptr, HYPRE_MEMORY_DEVICE); } }; #endif /* #if defined(HYPRE_USING_CUDA) || defined(HYPRE_USING_HIP) */ #endif hypre-2.33.0/src/utilities/device_reducer.h000066400000000000000000000161511477326011500206630ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /* CUDA reducer class */ #ifndef HYPRE_CUDA_REDUCER_H #define HYPRE_CUDA_REDUCER_H #if defined(HYPRE_USING_CUDA) || defined(HYPRE_USING_HIP) #if !defined(HYPRE_USING_RAJA) && !defined(HYPRE_USING_KOKKOS) template void OneBlockReduce(T *d_arr, HYPRE_Int N, T *h_out); struct HYPRE_double4 { HYPRE_Real x, y, z, w; __host__ __device__ HYPRE_double4() {} __host__ __device__ HYPRE_double4(HYPRE_Real x1, HYPRE_Real x2, HYPRE_Real x3, HYPRE_Real x4) { x = x1; y = x2; z = x3; w = x4; } __host__ __device__ void operator=(HYPRE_Real val) { x = y = z = w = val; } __host__ __device__ void operator+=(HYPRE_double4 rhs) { x += rhs.x; y += rhs.y; z += rhs.z; w += rhs.w; } }; struct HYPRE_double6 { HYPRE_Real x, y, z, w, u, v; __host__ __device__ HYPRE_double6() {} __host__ __device__ HYPRE_double6(HYPRE_Real x1, HYPRE_Real x2, HYPRE_Real x3, HYPRE_Real x4, HYPRE_Real x5, HYPRE_Real x6) { x = x1; y = x2; z = x3; w = x4; u = x5; v = x6; } __host__ __device__ void operator=(HYPRE_Real val) { x = y = z = w = u = v = val; } __host__ __device__ void operator+=(HYPRE_double6 rhs) { x += rhs.x; y += rhs.y; z += rhs.z; w += rhs.w; u += rhs.u; v += rhs.v; } }; /* reduction within a warp */ __inline__ __host__ __device__ HYPRE_Real warpReduceSum(HYPRE_Real val) { #if defined(__CUDA_ARCH__) || defined(__HIP_DEVICE_COMPILE__) for (HYPRE_Int offset = warpSize / 2; offset > 0; offset /= 2) { val += __shfl_down_sync(HYPRE_WARP_FULL_MASK, val, offset); } #endif return val; } __inline__ __host__ __device__ HYPRE_double4 warpReduceSum(HYPRE_double4 val) { #if defined(__CUDA_ARCH__) || defined(__HIP_DEVICE_COMPILE__) for (HYPRE_Int offset = warpSize / 2; offset > 0; offset /= 2) { val.x += __shfl_down_sync(HYPRE_WARP_FULL_MASK, val.x, offset); val.y += __shfl_down_sync(HYPRE_WARP_FULL_MASK, val.y, offset); val.z += __shfl_down_sync(HYPRE_WARP_FULL_MASK, val.z, offset); val.w += __shfl_down_sync(HYPRE_WARP_FULL_MASK, val.w, offset); } #endif return val; } __inline__ __host__ __device__ HYPRE_double6 warpReduceSum(HYPRE_double6 val) { #if defined(__CUDA_ARCH__) || defined(__HIP_DEVICE_COMPILE__) for (HYPRE_Int offset = warpSize / 2; offset > 0; offset /= 2) { val.x += __shfl_down_sync(HYPRE_WARP_FULL_MASK, val.x, offset); val.y += __shfl_down_sync(HYPRE_WARP_FULL_MASK, val.y, offset); val.z += __shfl_down_sync(HYPRE_WARP_FULL_MASK, val.z, offset); val.w += __shfl_down_sync(HYPRE_WARP_FULL_MASK, val.w, offset); val.u += __shfl_down_sync(HYPRE_WARP_FULL_MASK, val.u, offset); val.v += __shfl_down_sync(HYPRE_WARP_FULL_MASK, val.v, offset); } #endif return val; } /* reduction within a block */ template __inline__ __host__ __device__ T blockReduceSum(T val) { #if defined(__CUDA_ARCH__) || defined(__HIP_DEVICE_COMPILE__) // Shared mem for HYPRE_WARP_SIZE partial sums __shared__ T shared[HYPRE_WARP_SIZE]; HYPRE_Int lane = threadIdx.x & (warpSize - 1); HYPRE_Int wid = threadIdx.x >> HYPRE_WARP_BITSHIFT; // Each warp performs partial reduction val = warpReduceSum(val); // Write reduced value to shared memory if (lane == 0) { shared[wid] = val; } // Wait for all partial reductions __syncthreads(); // read from shared memory only if that warp existed if (threadIdx.x < (blockDim.x >> HYPRE_WARP_BITSHIFT)) { val = shared[lane]; } else { val = 0.0; } // Final reduce within first warp if (wid == 0) { val = warpReduceSum(val); } #endif return val; } template __global__ void OneBlockReduceKernel(hypre_DeviceItem &item, T *arr, HYPRE_Int N) { T sum; sum = 0.0; if (threadIdx.x < N) { sum = arr[threadIdx.x]; } sum = blockReduceSum(sum); if (threadIdx.x == 0) { arr[0] = sum; } } /* Reducer class */ template struct ReduceSum { using value_type = T; T init; /* initial value passed in */ mutable T __thread_sum; /* place to hold local sum of a thread, and partial sum of a block */ T *d_buf; /* place to store partial sum within blocks in the 1st round, used in the 2nd round */ HYPRE_Int nblocks; /* number of blocks used in the 1st round */ /* constructor * val is the initial value (added to the reduced sum) */ __host__ ReduceSum(T val) { init = val; __thread_sum = 0.0; nblocks = -1; } /* copy constructor */ __host__ __device__ ReduceSum(const ReduceSum& other) { *this = other; } __host__ void Allocate2ndPhaseBuffer() { if (hypre_HandleReduceBuffer(hypre_handle()) == NULL) { /* allocate for the max size for reducing double6 type */ hypre_HandleReduceBuffer(hypre_handle()) = hypre_TAlloc(HYPRE_double6, HYPRE_MAX_NTHREADS_BLOCK, HYPRE_MEMORY_DEVICE); } d_buf = (T*) hypre_HandleReduceBuffer(hypre_handle()); } /* reduction within blocks */ __host__ __device__ void BlockReduce() const { #if defined(__CUDA_ARCH__) || defined(__HIP_DEVICE_COMPILE__) __thread_sum = blockReduceSum(__thread_sum); if (threadIdx.x == 0) { d_buf[blockIdx.x] = __thread_sum; } #endif } __host__ __device__ void operator+=(T val) const { __thread_sum += val; } /* invoke the 2nd reduction at the time want the sum from the reducer */ __host__ operator T() { T val; const HYPRE_MemoryLocation memory_location = hypre_HandleMemoryLocation(hypre_handle()); const HYPRE_ExecutionPolicy exec_policy = hypre_GetExecPolicy1(memory_location); if (exec_policy == HYPRE_EXEC_HOST) { val = __thread_sum; val += init; } else { /* 2nd reduction with only *one* block */ hypre_assert(nblocks >= 0 && nblocks <= HYPRE_MAX_NTHREADS_BLOCK); const dim3 gDim(1), bDim(HYPRE_MAX_NTHREADS_BLOCK); HYPRE_GPU_LAUNCH( OneBlockReduceKernel, gDim, bDim, d_buf, nblocks ); hypre_TMemcpy(&val, d_buf, T, 1, HYPRE_MEMORY_HOST, HYPRE_MEMORY_DEVICE); val += init; } return val; } /* destructor */ __host__ __device__ ~ReduceSum() { } }; #endif /* #if !defined(HYPRE_USING_RAJA) && !defined(HYPRE_USING_KOKKOS) */ #endif /* #if defined(HYPRE_USING_CUDA) || defined(HYPRE_USING_HIP) */ #endif /* #ifndef HYPRE_CUDA_REDUCER_H */ hypre-2.33.0/src/utilities/device_utils.c000066400000000000000000002753221477326011500203740ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "_hypre_onedpl.hpp" #include "_hypre_utilities.h" #include "_hypre_utilities.hpp" #include /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - * generic device functions (HYPRE_USING_GPU) * NOTE: This includes device openmp for now * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ #if defined(HYPRE_USING_GPU) /*-------------------------------------------------------------------- * hypre_DeviceDataCreate *--------------------------------------------------------------------*/ hypre_DeviceData* hypre_DeviceDataCreate() { /* Note: this allocation is done directly with calloc in order to avoid a segmentation fault when building with HYPRE_USING_UMPIRE_HOST */ hypre_DeviceData *data = (hypre_DeviceData*) calloc(1, sizeof(hypre_DeviceData)); #if defined(HYPRE_USING_SYCL) hypre_DeviceDataDevice(data) = nullptr; #else hypre_DeviceDataDevice(data) = 0; #endif hypre_DeviceDataComputeStreamNum(data) = 0; /* SpMV, SpGeMM, SpTrans: use vendor's lib by default */ #if defined(HYPRE_USING_CUSPARSE) || defined(HYPRE_USING_ROCSPARSE) || defined(HYPRE_USING_ONEMKLSPARSE) hypre_DeviceDataSpgemmUseVendor(data) = 1; hypre_DeviceDataSpMVUseVendor(data) = 1; hypre_DeviceDataSpTransUseVendor(data) = 1; #else hypre_DeviceDataSpgemmUseVendor(data) = 0; hypre_DeviceDataSpMVUseVendor(data) = 0; hypre_DeviceDataSpTransUseVendor(data) = 0; #endif /* for CUDA, it seems cusparse is slow due to memory allocation inside the transposition */ #if defined(HYPRE_USING_CUDA) hypre_DeviceDataSpTransUseVendor(data) = 0; #endif /* hypre SpGEMM parameters */ const HYPRE_Int Nsamples = 64; const HYPRE_Real sigma = 1.0 / hypre_sqrt((HYPRE_Real)(Nsamples - 2.0)); const HYPRE_Real multfactor = 1.0 / (1.0 - 3.0 * sigma); hypre_DeviceDataSpgemmAlgorithm(data) = 1; hypre_DeviceDataSpgemmBinned(data) = 0; hypre_DeviceDataSpgemmNumBin(data) = 0; hypre_DeviceDataSpgemmHighestBin(data)[0] = 0; hypre_DeviceDataSpgemmHighestBin(data)[1] = 0; /* 1: naive overestimate, 2: naive underestimate, 3: Cohen's algorithm */ hypre_DeviceDataSpgemmRownnzEstimateMethod(data) = 3; hypre_DeviceDataSpgemmRownnzEstimateNsamples(data) = Nsamples; hypre_DeviceDataSpgemmRownnzEstimateMultFactor(data) = multfactor; /* pmis */ #if defined(HYPRE_USING_CURAND) || defined(HYPRE_USING_ROCRAND) || defined(HYPRE_USING_ONEMKLRAND) hypre_DeviceDataUseGpuRand(data) = 1; #else hypre_DeviceDataUseGpuRand(data) = 0; #endif /* device pool */ #ifdef HYPRE_USING_DEVICE_POOL hypre_DeviceDataCubBinGrowth(data) = 8u; hypre_DeviceDataCubMinBin(data) = 1u; hypre_DeviceDataCubMaxBin(data) = (hypre_uint) - 1; hypre_DeviceDataCubMaxCachedBytes(data) = (size_t) -1; hypre_DeviceDataCubDevAllocator(data) = NULL; hypre_DeviceDataCubUvmAllocator(data) = NULL; #endif return data; } /*-------------------------------------------------------------------- * hypre_DeviceDataDestroy *--------------------------------------------------------------------*/ void hypre_DeviceDataDestroy(hypre_DeviceData *data) { if (!data) { return; } hypre_TFree(hypre_DeviceDataReduceBuffer(data), HYPRE_MEMORY_DEVICE); #if defined(HYPRE_USING_CURAND) if (data->curand_generator) { HYPRE_CURAND_CALL( curandDestroyGenerator(data->curand_generator) ); } #endif #if defined(HYPRE_USING_ROCRAND) if (data->curand_generator) { HYPRE_ROCRAND_CALL( rocrand_destroy_generator(data->curand_generator) ); } #endif #if defined(HYPRE_USING_CUBLAS) if (data->cublas_handle) { HYPRE_CUBLAS_CALL( cublasDestroy(data->cublas_handle) ); } #endif #if defined(HYPRE_USING_CUSPARSE) || defined(HYPRE_USING_ROCSPARSE) if (data->cusparse_handle) { #if defined(HYPRE_USING_CUSPARSE) HYPRE_CUSPARSE_CALL( cusparseDestroy(data->cusparse_handle) ); #elif defined(HYPRE_USING_ROCSPARSE) HYPRE_ROCSPARSE_CALL( rocsparse_destroy_handle(data->cusparse_handle) ); #endif } #endif // #if defined(HYPRE_USING_CUSPARSE) || defined(HYPRE_USING_ROCSPARSE) #if defined(HYPRE_USING_CUSOLVER) || defined(HYPRE_USING_ROCSOLVER) if (data->vendor_solver_handle) { #if defined(HYPRE_USING_CUSOLVER) HYPRE_CUSOLVER_CALL(cusolverDnDestroy(data->vendor_solver_handle)); #else HYPRE_ROCBLAS_CALL(rocblas_destroy_handle(data->vendor_solver_handle)); #endif } #endif // #if defined(HYPRE_USING_CUSOLVER) || defined(HYPRE_USING_ROCSOLVER) #if defined(HYPRE_USING_CUDA_STREAMS) for (HYPRE_Int i = 0; i < HYPRE_MAX_NUM_STREAMS; i++) { if (data->streams[i]) { #if defined(HYPRE_USING_CUDA) HYPRE_CUDA_CALL( cudaStreamDestroy(data->streams[i]) ); #elif defined(HYPRE_USING_HIP) HYPRE_HIP_CALL( hipStreamDestroy(data->streams[i]) ); #elif defined(HYPRE_USING_SYCL) delete data->streams[i]; data->streams[i] = nullptr; #endif } } #endif #ifdef HYPRE_USING_DEVICE_POOL hypre_DeviceDataCubCachingAllocatorDestroy(data); #endif #if defined(HYPRE_USING_SYCL) delete data->device; data->device = nullptr; #endif /* Note: Directly using free since this variable was allocated with calloc */ free((void*) data); } /*-------------------------------------------------------------------- * hypre_SyncDevice *--------------------------------------------------------------------*/ HYPRE_Int hypre_SyncDevice() { #if defined(HYPRE_USING_CUDA) HYPRE_CUDA_CALL( cudaDeviceSynchronize() ); #elif defined(HYPRE_USING_HIP) HYPRE_HIP_CALL( hipDeviceSynchronize() ); #elif defined(HYPRE_USING_SYCL) try { HYPRE_SYCL_CALL( hypre_HandleComputeStream(hypre_handle())->wait_and_throw() ); } catch (sycl::exception const &exc) { std::cerr << exc.what() << "Exception caught at file:" << __FILE__ << ", line:" << __LINE__ << std::endl; std::exit(1); } #endif return hypre_error_flag; } /*-------------------------------------------------------------------- * hypre_ResetDevice *--------------------------------------------------------------------*/ HYPRE_Int hypre_ResetDevice() { #if defined(HYPRE_USING_CUDA) HYPRE_CUDA_CALL(cudaDeviceReset()); #elif defined(HYPRE_USING_HIP) HYPRE_HIP_CALL(hipDeviceReset()); #endif return hypre_error_flag; } /*-------------------------------------------------------------------- * hypre_SyncComputeStream_core * * Synchronize the Hypre compute stream * * action: 0: set sync stream to false * 1: set sync stream to true * 2: restore sync stream to default * 3: return the current value of cuda_compute_stream_sync * 4: sync stream based on cuda_compute_stream_sync *--------------------------------------------------------------------*/ HYPRE_Int hypre_SyncComputeStream_core(HYPRE_Int action, hypre_Handle *hypre_handle, HYPRE_Int *cuda_compute_stream_sync_ptr) { /* with UVM the default is to sync at kernel completions, since host is also able to * touch GPU memory */ #if defined(HYPRE_USING_UNIFIED_MEMORY) static const HYPRE_Int cuda_compute_stream_sync_default = 1; #else static const HYPRE_Int cuda_compute_stream_sync_default = 0; #endif /* this controls if synchronize the stream after computations */ static HYPRE_Int cuda_compute_stream_sync = cuda_compute_stream_sync_default; switch (action) { case 0: cuda_compute_stream_sync = 0; break; case 1: cuda_compute_stream_sync = 1; break; case 2: cuda_compute_stream_sync = cuda_compute_stream_sync_default; break; case 3: *cuda_compute_stream_sync_ptr = cuda_compute_stream_sync; break; case 4: if (hypre_HandleDefaultExecPolicy(hypre_handle) == HYPRE_EXEC_DEVICE && cuda_compute_stream_sync) { #if defined(HYPRE_USING_CUDA) HYPRE_CUDA_CALL( cudaStreamSynchronize(hypre_HandleComputeStream(hypre_handle)) ); #elif defined(HYPRE_USING_HIP) HYPRE_HIP_CALL( hipStreamSynchronize(hypre_HandleComputeStream(hypre_handle)) ); #elif defined(HYPRE_USING_SYCL) HYPRE_SYCL_CALL( hypre_HandleComputeStream(hypre_handle)->ext_oneapi_submit_barrier() ); #endif } break; default: hypre_printf("hypre_SyncComputeStream_core invalid action\n"); hypre_error_in_arg(1); } return hypre_error_flag; } /*-------------------------------------------------------------------- * hypre_SetSyncCudaCompute *--------------------------------------------------------------------*/ HYPRE_Int hypre_SetSyncCudaCompute(HYPRE_Int action) { /* convert to 1/0 */ action = action != 0; hypre_SyncComputeStream_core(action, NULL, NULL); return hypre_error_flag; } /*-------------------------------------------------------------------- * hypre_RestoreSyncCudaCompute *--------------------------------------------------------------------*/ HYPRE_Int hypre_RestoreSyncCudaCompute() { hypre_SyncComputeStream_core(2, NULL, NULL); return hypre_error_flag; } /*-------------------------------------------------------------------- * hypre_GetSyncCudaCompute *--------------------------------------------------------------------*/ HYPRE_Int hypre_GetSyncCudaCompute(HYPRE_Int *cuda_compute_stream_sync_ptr) { hypre_SyncComputeStream_core(3, NULL, cuda_compute_stream_sync_ptr); return hypre_error_flag; } /*-------------------------------------------------------------------- * hypre_SyncComputeStream *--------------------------------------------------------------------*/ HYPRE_Int hypre_SyncComputeStream() { hypre_SyncComputeStream_core(4, hypre_handle(), NULL); return hypre_error_flag; } /*-------------------------------------------------------------------- * hypre_ForceSyncComputeStream *--------------------------------------------------------------------*/ HYPRE_Int hypre_ForceSyncComputeStream() { HYPRE_Int sync_stream; hypre_GetSyncCudaCompute(&sync_stream); hypre_SetSyncCudaCompute(1); hypre_SyncComputeStream_core(4, hypre_handle(), NULL); hypre_SetSyncCudaCompute(sync_stream); return hypre_error_flag; } #endif // #if defined(HYPRE_USING_GPU) /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - * generic device functions (cuda/hip/sycl) * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ #if defined(HYPRE_USING_GPU) /*-------------------------------------------------------------------------- * hypre_DeviceMemoryGetUsage * * Retrieves memory usage statistics for the current GPU device. The function * fills an array with memory data, converted to gibibytes (GiB): * * - mem[0]: Current memory usage (allocated by the process). * - mem[1]: Total device memory available on the GPU. * * This implementation supports NVIDIA GPUs using CUDA and AMD GPUs using HIP. *--------------------------------------------------------------------------*/ HYPRE_Int hypre_DeviceMemoryGetUsage(HYPRE_Real *mem) { size_t free_mem = 0; size_t total_mem = 0; HYPRE_Real b_to_gib = (HYPRE_Real)(1 << 30); /* Sanity check */ if (!mem) { hypre_error_w_msg(HYPRE_ERROR_GENERIC, "Mem is a NULL pointer!"); return hypre_error_flag; } /* Get free and total memory available on the device */ #if defined(HYPRE_USING_CUDA) HYPRE_CUDA_CALL(cudaMemGetInfo(&free_mem, &total_mem)); #elif defined(HYPRE_USING_HIP) HYPRE_HIP_CALL(hipMemGetInfo(&free_mem, &total_mem)); #else hypre_error_w_msg(HYPRE_ERROR_GENERIC, "No supported GPU backend found!"); return hypre_error_flag; #endif /* Convert data from bytes to GiB (HYPRE_Real) */ mem[0] = (total_mem - free_mem) / b_to_gib; mem[1] = total_mem / b_to_gib; return hypre_error_flag; } /*-------------------------------------------------------------------- * hypre_DeviceDataComputeStream *--------------------------------------------------------------------*/ /* CUDA/HIP stream */ #if defined(HYPRE_USING_CUDA) cudaStream_t #elif defined(HYPRE_USING_HIP) hipStream_t #elif defined(HYPRE_USING_SYCL) sycl::queue* #endif hypre_DeviceDataComputeStream(hypre_DeviceData *data) { return hypre_DeviceDataStream(data, hypre_DeviceDataComputeStreamNum(data)); } /*-------------------------------------------------------------------- * hypre_DeviceDataStream *--------------------------------------------------------------------*/ #if defined(HYPRE_USING_CUDA) cudaStream_t #elif defined(HYPRE_USING_HIP) hipStream_t #elif defined(HYPRE_USING_SYCL) sycl::queue* #endif hypre_DeviceDataStream(hypre_DeviceData *data, HYPRE_Int i) { #if defined(HYPRE_USING_CUDA) cudaStream_t stream = 0; #elif defined(HYPRE_USING_HIP) hipStream_t stream = 0; #elif defined(HYPRE_USING_SYCL) sycl::queue *stream = NULL; #endif #if defined(HYPRE_USING_CUDA_STREAMS) if (i >= HYPRE_MAX_NUM_STREAMS) { /* return the default stream, i.e., the NULL stream */ /* hypre_printf("device stream %d exceeds the max number %d\n", i, HYPRE_MAX_NUM_STREAMS); */ return NULL; } if (data->streams[i]) { return data->streams[i]; } #if defined(HYPRE_USING_CUDA) //HYPRE_CUDA_CALL(cudaStreamCreateWithFlags(&stream,cudaStreamNonBlocking)); HYPRE_CUDA_CALL(cudaStreamCreateWithFlags(&stream, cudaStreamDefault)); #elif defined(HYPRE_USING_HIP) HYPRE_HIP_CALL(hipStreamCreateWithFlags(&stream, hipStreamDefault)); #elif defined(HYPRE_USING_SYCL) /* Reserve the last stream as a debugging stream on the CPU */ if (i == HYPRE_MAX_NUM_STREAMS - 1) { stream = new sycl::queue(sycl::cpu_selector_v, sycl::property_list{sycl::property::queue::in_order{}}); } else { auto sycl_asynchandler = [] (sycl::exception_list exceptions) { for (std::exception_ptr const& e : exceptions) { try { std::rethrow_exception(e); } catch (sycl::exception const& ex) { std::cout << "Caught asynchronous SYCL exception:" << std::endl << ex.what() << ", SYCL code: " << ex.code() << std::endl; } } }; if (!data->device) { HYPRE_DeviceInitialize(); } sycl::device* sycl_device = data->device; sycl::context sycl_ctxt = sycl::context(*sycl_device, sycl_asynchandler); stream = new sycl::queue(sycl_ctxt, *sycl_device, sycl::property_list{sycl::property::queue::in_order{}}); } #endif data->streams[i] = stream; #endif return stream; } /*-------------------------------------------------------------------- * hypre_GetDefaultDeviceBlockDimension *--------------------------------------------------------------------*/ dim3 hypre_GetDefaultDeviceBlockDimension() { #if defined(HYPRE_USING_SYCL) dim3 bDim(1, 1, hypre_HandleDeviceMaxWorkGroupSize(hypre_handle())); #else dim3 bDim(HYPRE_1D_BLOCK_SIZE, 1, 1); #endif return bDim; } /*-------------------------------------------------------------------- * hypre_GetDefaultDeviceGridDimension *--------------------------------------------------------------------*/ dim3 hypre_GetDefaultDeviceGridDimension( HYPRE_Int n, const char *granularity, dim3 bDim ) { HYPRE_Int num_blocks = 0; #if defined(HYPRE_USING_SYCL) HYPRE_Int num_threads_per_block = bDim.get(0) * bDim.get(1) * bDim.get(2); #else HYPRE_Int num_threads_per_block = bDim.x * bDim.y * bDim.z; #endif if (granularity[0] == 't') { num_blocks = (n + num_threads_per_block - 1) / num_threads_per_block; } else if (granularity[0] == 'w') { HYPRE_Int num_warps_per_block = num_threads_per_block >> HYPRE_WARP_BITSHIFT; hypre_assert(num_warps_per_block * HYPRE_WARP_SIZE == num_threads_per_block); num_blocks = (n + num_warps_per_block - 1) / num_warps_per_block; } else { hypre_printf("Error %s %d: Unknown granularity !\n", __FILE__, __LINE__); hypre_assert(0); } dim3 gDim = hypre_dim3(num_blocks); return gDim; } /*-------------------------------------------------------------------- * hypre_dim3 * NOTE: these functions are necessary due to different linearization * procedures between cuda/hip and sycl *--------------------------------------------------------------------*/ dim3 hypre_dim3(HYPRE_Int x) { #if defined(HYPRE_USING_SYCL) dim3 d(1, 1, x); #else dim3 d(x); #endif return d; } dim3 hypre_dim3(HYPRE_Int x, HYPRE_Int y) { #if defined(HYPRE_USING_SYCL) dim3 d(1, y, x); #else dim3 d(x, y); #endif return d; } dim3 hypre_dim3(HYPRE_Int x, HYPRE_Int y, HYPRE_Int z) { #if defined(HYPRE_USING_SYCL) dim3 d(z, y, x); #else dim3 d(x, y, z); #endif return d; } /*-------------------------------------------------------------------------- * hypreGPUKernel_ArrayToArrayOfPtrs *--------------------------------------------------------------------------*/ template __global__ void hypreGPUKernel_ArrayToArrayOfPtrs( hypre_DeviceItem &item, HYPRE_Int n, HYPRE_Int m, T *data, T **data_aop ) { HYPRE_Int i = hypre_gpu_get_grid_thread_id<1, 1>(item); if (i < n) { data_aop[i] = &data[i * m]; } } /*-------------------------------------------------------------------- * hypreDevice_ArrayToArrayOfPtrs *--------------------------------------------------------------------*/ template HYPRE_Int hypreDevice_ArrayToArrayOfPtrs(HYPRE_Int n, HYPRE_Int m, T *data, T **data_aop) { /* Trivial case */ if (n <= 0) { return hypre_error_flag; } dim3 bDim = hypre_GetDefaultDeviceBlockDimension(); dim3 gDim = hypre_GetDefaultDeviceGridDimension(n, "thread", bDim); HYPRE_GPU_LAUNCH( hypreGPUKernel_ArrayToArrayOfPtrs, gDim, bDim, n, m, data, data_aop); return hypre_error_flag; } /*-------------------------------------------------------------------- * hypreDevice_ComplexArrayToArrayOfPtrs *--------------------------------------------------------------------*/ HYPRE_Int hypreDevice_ComplexArrayToArrayOfPtrs(HYPRE_Int n, HYPRE_Int m, HYPRE_Complex *data, HYPRE_Complex **data_aop) { return hypreDevice_ArrayToArrayOfPtrs(n, m, data, data_aop); } /*-------------------------------------------------------------------- * hypreGPUKernel_IVAXPY *--------------------------------------------------------------------*/ __global__ void hypreGPUKernel_IVAXPY( hypre_DeviceItem &item, HYPRE_Int n, HYPRE_Complex *a, HYPRE_Complex *x, HYPRE_Complex *y) { HYPRE_Int i = hypre_gpu_get_grid_thread_id<1, 1>(item); if (i < n) { y[i] += x[i] / a[i]; } } /*-------------------------------------------------------------------- * hypreDevice_IVAXPY * * Inverse Vector AXPY: y[i] = x[i] / a[i] + y[i] *--------------------------------------------------------------------*/ HYPRE_Int hypreDevice_IVAXPY(HYPRE_Int n, HYPRE_Complex *a, HYPRE_Complex *x, HYPRE_Complex *y) { /* trivial case */ if (n <= 0) { return hypre_error_flag; } dim3 bDim = hypre_GetDefaultDeviceBlockDimension(); dim3 gDim = hypre_GetDefaultDeviceGridDimension(n, "thread", bDim); HYPRE_GPU_LAUNCH( hypreGPUKernel_IVAXPY, gDim, bDim, n, a, x, y ); return hypre_error_flag; } /*-------------------------------------------------------------------- * hypreGPUKernel_IVAXPYMarked *--------------------------------------------------------------------*/ __global__ void hypreGPUKernel_IVAXPYMarked( hypre_DeviceItem &item, HYPRE_Int n, HYPRE_Complex *a, HYPRE_Complex *x, HYPRE_Complex *y, HYPRE_Int *marker, HYPRE_Int marker_val) { HYPRE_Int i = hypre_gpu_get_grid_thread_id<1, 1>(item); if (i < n) { if (marker[i] == marker_val) { y[i] += x[i] / a[i]; } } } /*-------------------------------------------------------------------- * hypreDevice_IVAXPYMarked * * Inverse Vector AXPY: y[i] = x[i] / a[i] + y[i] *--------------------------------------------------------------------*/ HYPRE_Int hypreDevice_IVAXPYMarked( HYPRE_Int n, HYPRE_Complex *a, HYPRE_Complex *x, HYPRE_Complex *y, HYPRE_Int *marker, HYPRE_Int marker_val ) { /* trivial case */ if (n <= 0) { return hypre_error_flag; } dim3 bDim = hypre_GetDefaultDeviceBlockDimension(); dim3 gDim = hypre_GetDefaultDeviceGridDimension(n, "thread", bDim); HYPRE_GPU_LAUNCH( hypreGPUKernel_IVAXPYMarked, gDim, bDim, n, a, x, y, marker, marker_val ); return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypreGPUKernel_IVAMXPMY * * Device kernel for hypreDevice_IVAMXPMY. The template argument MM tells * the maximum number of vectors in the unrolled loop *--------------------------------------------------------------------------*/ template __global__ void hypreGPUKernel_IVAMXPMY( hypre_DeviceItem &item, HYPRE_Int m, HYPRE_Int n, HYPRE_Complex *a, HYPRE_Complex *x, HYPRE_Complex *y) { HYPRE_Int i = hypre_gpu_get_grid_thread_id<1, 1>(item); HYPRE_Int j; HYPRE_Complex val; if (i < n) { val = 1.0 / a[i]; if (MM > 0) { #pragma unroll for (j = 0; j < MM; j++) { y[i + j * n] += x[i + j * n] * val; } } else { /* Generic case */ for (j = 0; j < m; j++) { y[i + j * n] += x[i + j * n] * val; } } } } /*-------------------------------------------------------------------------- * hypreDevice_IVAMXPMY * * Inverse Vector AXPY for m vectors x and y of size n stored column-wise: * * y[i + 0] += x[i + 0] / a[i] * y[i + n] += x[i + n] / a[i] * ... ... * y[i + (m-1)*n] += x[i + (m-1)*n] / a[i] * * Note: does not work for row-wise multivectors *--------------------------------------------------------------------------*/ HYPRE_Int hypreDevice_IVAMXPMY( HYPRE_Int m, HYPRE_Int n, HYPRE_Complex *a, HYPRE_Complex *x, HYPRE_Complex *y) { /* trivial case */ if (n <= 0) { return hypre_error_flag; } dim3 bDim = hypre_GetDefaultDeviceBlockDimension(); dim3 gDim = hypre_GetDefaultDeviceGridDimension(n, "thread", bDim); switch (m) { case 1: HYPRE_GPU_LAUNCH( hypreGPUKernel_IVAXPY, gDim, bDim, n, a, x, y ); break; case 2: HYPRE_GPU_LAUNCH( hypreGPUKernel_IVAMXPMY<2>, gDim, bDim, m, n, a, x, y ); break; case 3: HYPRE_GPU_LAUNCH( hypreGPUKernel_IVAMXPMY<3>, gDim, bDim, m, n, a, x, y ); break; case 4: HYPRE_GPU_LAUNCH( hypreGPUKernel_IVAMXPMY<4>, gDim, bDim, m, n, a, x, y ); break; default: HYPRE_GPU_LAUNCH( hypreGPUKernel_IVAMXPMY<0>, gDim, bDim, m, n, a, x, y ); break; } return hypre_error_flag; } /*-------------------------------------------------------------------- * hypreDevice_CsrRowPtrsToIndices *--------------------------------------------------------------------*/ HYPRE_Int* hypreDevice_CsrRowPtrsToIndices( HYPRE_Int nrows, HYPRE_Int nnz, HYPRE_Int *d_row_ptr ) { /* trivial case */ if (nrows <= 0 || nnz <= 0) { return NULL; } HYPRE_Int *d_row_ind = hypre_TAlloc(HYPRE_Int, nnz, HYPRE_MEMORY_DEVICE); hypreDevice_CsrRowPtrsToIndices_v2(nrows, nnz, d_row_ptr, d_row_ind); return d_row_ind; } #if defined(HYPRE_USING_SYCL) /*-------------------------------------------------------------------- * hypreSYCLKernel_ScatterRowPtr *--------------------------------------------------------------------*/ void hypreSYCLKernel_ScatterRowPtr( hypre_DeviceItem &item, HYPRE_Int nrows, HYPRE_Int *d_row_ptr, HYPRE_Int *d_row_ind ) { HYPRE_Int i = (HYPRE_Int) item.get_global_linear_id(); if (i < nrows) { HYPRE_Int row_start = d_row_ptr[i]; HYPRE_Int row_end = d_row_ptr[i + 1]; if (row_start != row_end) { d_row_ind[row_start] = i; } } } #endif #if defined(HYPRE_USING_CUDA) || defined(HYPRE_USING_HIP) struct hypre_empty_row_functor { // This is needed for clang typedef bool result_type; __device__ bool operator()(const thrust::tuple& t) const { const HYPRE_Int a = thrust::get<0>(t); const HYPRE_Int b = thrust::get<1>(t); return a != b; } }; #endif /*-------------------------------------------------------------------- * hypreDevice_CsrRowPtrsToIndices_v2 *--------------------------------------------------------------------*/ HYPRE_Int hypreDevice_CsrRowPtrsToIndices_v2( HYPRE_Int nrows, HYPRE_Int nnz, HYPRE_Int *d_row_ptr, HYPRE_Int *d_row_ind ) { /* trivial case */ if (nrows <= 0 || nnz <= 0) { return hypre_error_flag; } #if defined(HYPRE_USING_SYCL) dim3 bDim = hypre_GetDefaultDeviceBlockDimension(); dim3 gDim = hypre_GetDefaultDeviceGridDimension(nrows, "thread", bDim); HYPRE_ONEDPL_CALL( std::fill, d_row_ind, d_row_ind + nnz, 0 ); HYPRE_GPU_LAUNCH( hypreSYCLKernel_ScatterRowPtr, gDim, bDim, nrows, d_row_ptr, d_row_ind ); HYPRE_ONEDPL_CALL( std::inclusive_scan, d_row_ind, d_row_ind + nnz, d_row_ind, oneapi::dpl::maximum()); #else hypre_GpuProfilingPushRange("CsrRowPtrsToIndices"); HYPRE_THRUST_CALL( fill, d_row_ind, d_row_ind + nnz, 0 ); HYPRE_THRUST_CALL( scatter_if, thrust::counting_iterator(0), thrust::counting_iterator(nrows), d_row_ptr, thrust::make_transform_iterator( thrust::make_zip_iterator(thrust::make_tuple(d_row_ptr, d_row_ptr + 1)), hypre_empty_row_functor() ), d_row_ind ); HYPRE_THRUST_CALL( inclusive_scan, d_row_ind, d_row_ind + nnz, d_row_ind, thrust::maximum()); hypre_GpuProfilingPopRange(); #endif return hypre_error_flag; } /*-------------------------------------------------------------------- * hypreDevice_CsrRowIndicesToPtrs *--------------------------------------------------------------------*/ HYPRE_Int* hypreDevice_CsrRowIndicesToPtrs( HYPRE_Int nrows, HYPRE_Int nnz, HYPRE_Int *d_row_ind ) { HYPRE_Int *d_row_ptr = hypre_TAlloc(HYPRE_Int, nrows + 1, HYPRE_MEMORY_DEVICE); hypreDevice_CsrRowIndicesToPtrs_v2(nrows, nnz, d_row_ind, d_row_ptr); return d_row_ptr; } /*-------------------------------------------------------------------- * hypreDevice_CsrRowIndicesToPtrs_v2 *--------------------------------------------------------------------*/ HYPRE_Int hypreDevice_CsrRowIndicesToPtrs_v2( HYPRE_Int nrows, HYPRE_Int nnz, HYPRE_Int *d_row_ind, HYPRE_Int *d_row_ptr ) { #if defined(HYPRE_USING_SYCL) /* Note: if nnz <= 0, then dpl::lower_bound is a no-op, which means we still need to zero out the row pointer */ /* Note that this is different from thrust's behavior, where lower_bound zeros out the row pointer when nnz = 0 */ if (nnz <= 0) { hypre_Memset(d_row_ptr, 0, (nrows + 1) * sizeof(HYPRE_Int), HYPRE_MEMORY_DEVICE); return hypre_error_flag; } oneapi::dpl::counting_iterator count(0); HYPRE_ONEDPL_CALL( oneapi::dpl::lower_bound, d_row_ind, d_row_ind + nnz, count, count + nrows + 1, d_row_ptr); #else hypre_GpuProfilingPushRange("CSRIndicesToPtrs"); HYPRE_THRUST_CALL( lower_bound, d_row_ind, d_row_ind + nnz, thrust::counting_iterator(0), thrust::counting_iterator(nrows + 1), d_row_ptr); hypre_GpuProfilingPopRange(); #endif return hypre_error_flag; } /*-------------------------------------------------------------------- * hypreGPUKernel_GetRowNnz * * Get NNZ of each row in d_row_indices and store the results in d_rownnz * All pointers are device pointers. * d_rownnz can be the same as d_row_indices. *--------------------------------------------------------------------*/ __global__ void hypreGPUKernel_GetRowNnz( hypre_DeviceItem &item, HYPRE_Int nrows, HYPRE_Int *d_row_indices, HYPRE_Int *d_diag_ia, HYPRE_Int *d_offd_ia, HYPRE_Int *d_rownnz ) { const HYPRE_Int global_thread_id = hypre_gpu_get_grid_thread_id<1, 1>(item); if (global_thread_id < nrows) { HYPRE_Int i; if (d_row_indices) { i = read_only_load(&d_row_indices[global_thread_id]); } else { i = global_thread_id; } d_rownnz[global_thread_id] = read_only_load(&d_diag_ia[i + 1]) - read_only_load(&d_diag_ia[i]) + read_only_load(&d_offd_ia[i + 1]) - read_only_load(&d_offd_ia[i]); } } /*-------------------------------------------------------------------- * hypreDevice_GetRowNnz * * Note: (d_row_indices == NULL) means d_row_indices = [0,1,...,nrows-1] *--------------------------------------------------------------------*/ HYPRE_Int hypreDevice_GetRowNnz( HYPRE_Int nrows, HYPRE_Int *d_row_indices, HYPRE_Int *d_diag_ia, HYPRE_Int *d_offd_ia, HYPRE_Int *d_rownnz ) { const dim3 bDim = hypre_GetDefaultDeviceBlockDimension(); const dim3 gDim = hypre_GetDefaultDeviceGridDimension(nrows, "thread", bDim); /* trivial case */ if (nrows <= 0) { return hypre_error_flag; } HYPRE_GPU_LAUNCH( hypreGPUKernel_GetRowNnz, gDim, bDim, nrows, d_row_indices, d_diag_ia, d_offd_ia, d_rownnz ); return hypre_error_flag; } /*-------------------------------------------------------------------- * hypreDevice_IntegerInclusiveScan *--------------------------------------------------------------------*/ HYPRE_Int hypreDevice_IntegerInclusiveScan( HYPRE_Int n, HYPRE_Int *d_i ) { #if defined(HYPRE_USING_SYCL) HYPRE_ONEDPL_CALL(std::inclusive_scan, d_i, d_i + n, d_i); #else HYPRE_THRUST_CALL(inclusive_scan, d_i, d_i + n, d_i); #endif return hypre_error_flag; } /*-------------------------------------------------------------------- * hypreGPUKernel_CopyParCSRRows *--------------------------------------------------------------------*/ __global__ void hypreGPUKernel_CopyParCSRRows( hypre_DeviceItem &item, HYPRE_Int nrows, HYPRE_Int *d_row_indices, HYPRE_Int has_offd, HYPRE_BigInt first_col, HYPRE_BigInt *d_col_map_offd_A, HYPRE_Int *d_diag_i, HYPRE_Int *d_diag_j, HYPRE_Complex *d_diag_a, HYPRE_Int *d_offd_i, HYPRE_Int *d_offd_j, HYPRE_Complex *d_offd_a, HYPRE_Int *d_ib, HYPRE_BigInt *d_jb, HYPRE_Complex *d_ab ) { const HYPRE_Int global_warp_id = hypre_gpu_get_grid_warp_id<1, 1>(item); if (global_warp_id >= nrows) { return; } /* lane id inside the warp */ const HYPRE_Int lane_id = hypre_gpu_get_lane_id<1>(item); HYPRE_Int i, j = 0, k = 0, p, row, istart, iend, bstart; /* diag part */ if (lane_id < 2) { /* row index to work on */ if (d_row_indices) { row = read_only_load(d_row_indices + global_warp_id); } else { row = global_warp_id; } /* start/end position of the row */ j = read_only_load(d_diag_i + row + lane_id); /* start position of b */ k = d_ib ? read_only_load(d_ib + global_warp_id) : 0; } istart = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, j, 0); iend = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, j, 1); bstart = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, k, 0); p = bstart - istart; for (i = istart + lane_id; i < iend; i += HYPRE_WARP_SIZE) { d_jb[p + i] = read_only_load(d_diag_j + i) + first_col; if (d_ab) { d_ab[p + i] = read_only_load(d_diag_a + i); } } if (!has_offd) { return; } /* offd part */ if (lane_id < 2) { j = read_only_load(d_offd_i + row + lane_id); } bstart += iend - istart; istart = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, j, 0); iend = warp_shuffle_sync(item, HYPRE_WARP_FULL_MASK, j, 1); p = bstart - istart; for (i = istart + lane_id; i < iend; i += HYPRE_WARP_SIZE) { if (d_col_map_offd_A) { d_jb[p + i] = d_col_map_offd_A[read_only_load(d_offd_j + i)]; } else { d_jb[p + i] = -1 - read_only_load(d_offd_j + i); } if (d_ab) { d_ab[p + i] = read_only_load(d_offd_a + i); } } } /*-------------------------------------------------------------------- * hypreDevice_CopyParCSRRows * * B = A(row_indices, :) * Note: d_ib is an input vector that contains row ptrs, * i.e., start positions where to put the rows in d_jb and d_ab. * The col indices in B are global indices, i.e., BigJ * of length (nrows + 1) or nrow (without the last entry, nnz) * Special cases: * if d_row_indices == NULL, it means d_row_indices=[0,1,...,nrows-1] * If col_map_offd_A == NULL, use (-1 - d_offd_j) as column id * If nrows == 1 and d_ib == NULL, it means d_ib[0] = 0 *--------------------------------------------------------------------*/ HYPRE_Int hypreDevice_CopyParCSRRows( HYPRE_Int nrows, HYPRE_Int *d_row_indices, HYPRE_Int job, HYPRE_Int has_offd, HYPRE_BigInt first_col, HYPRE_BigInt *d_col_map_offd_A, HYPRE_Int *d_diag_i, HYPRE_Int *d_diag_j, HYPRE_Complex *d_diag_a, HYPRE_Int *d_offd_i, HYPRE_Int *d_offd_j, HYPRE_Complex *d_offd_a, HYPRE_Int *d_ib, HYPRE_BigInt *d_jb, HYPRE_Complex *d_ab ) { HYPRE_UNUSED_VAR(job); /* trivial case */ if (nrows <= 0) { return hypre_error_flag; } hypre_assert(!(nrows > 1 && d_ib == NULL)); const dim3 bDim = hypre_GetDefaultDeviceBlockDimension(); const dim3 gDim = hypre_GetDefaultDeviceGridDimension(nrows, "warp", bDim); /* if (job == 2) { } */ HYPRE_GPU_LAUNCH( hypreGPUKernel_CopyParCSRRows, gDim, bDim, nrows, d_row_indices, has_offd, first_col, d_col_map_offd_A, d_diag_i, d_diag_j, d_diag_a, d_offd_i, d_offd_j, d_offd_a, d_ib, d_jb, d_ab ); return hypre_error_flag; } /*-------------------------------------------------------------------- * hypreDevice_IntegerExclusiveScan *--------------------------------------------------------------------*/ HYPRE_Int hypreDevice_IntegerExclusiveScan( HYPRE_Int n, HYPRE_Int *d_i ) { #if defined(HYPRE_USING_SYCL) HYPRE_ONEDPL_CALL(std::exclusive_scan, d_i, d_i + n, d_i, 0); #else HYPRE_THRUST_CALL(exclusive_scan, d_i, d_i + n, d_i); #endif return hypre_error_flag; } /*-------------------------------------------------------------------- * hypreDevice_StableSortByTupleKey * * https://github.com/OrangeOwlSolutions/Thrust/blob/master/Sort_by_key_with_tuple_key.cu * * opt: 0, (a,b) < (a',b') iff a < a' or (a = a' and b < b') [normal tupe comp] * 1, (a,b) < (a',b') iff a < a' or (a = a' and |b| > |b'|) [used in dropping small entries] * 2, (a,b) < (a',b') iff a < a' or (a = a' and (b == a or b < b') and b' != a') [used in putting diagonal first] *--------------------------------------------------------------------*/ template HYPRE_Int hypreDevice_StableSortByTupleKey( HYPRE_Int N, T1 *keys1, T2 *keys2, T3 *vals, HYPRE_Int opt ) { #if defined(HYPRE_USING_SYCL) auto zipped_begin = oneapi::dpl::make_zip_iterator(keys1, keys2, vals); if (opt == 0) { HYPRE_ONEDPL_CALL(std::stable_sort, zipped_begin, zipped_begin + N, std::less< std::tuple >()); } else if (opt == 1) { HYPRE_ONEDPL_CALL(std::stable_sort, zipped_begin, zipped_begin + N, TupleComp2()); } else if (opt == 2) { HYPRE_ONEDPL_CALL(std::stable_sort, zipped_begin, zipped_begin + N, TupleComp3()); } #else hypre_GpuProfilingPushRange("StableSortByTupleKey"); auto begin_keys = thrust::make_zip_iterator(thrust::make_tuple(keys1, keys2)); auto end_keys = thrust::make_zip_iterator(thrust::make_tuple(keys1 + N, keys2 + N)); if (opt == 0) { HYPRE_THRUST_CALL(stable_sort_by_key, begin_keys, end_keys, vals, thrust::less< thrust::tuple >()); } else if (opt == 1) { HYPRE_THRUST_CALL(stable_sort_by_key, begin_keys, end_keys, vals, TupleComp2()); } else if (opt == 2) { HYPRE_THRUST_CALL(stable_sort_by_key, begin_keys, end_keys, vals, TupleComp3()); } hypre_GpuProfilingPopRange(); #endif return hypre_error_flag; } template HYPRE_Int hypreDevice_StableSortByTupleKey(HYPRE_Int N, HYPRE_Int *keys1, HYPRE_Int *keys2, HYPRE_Int *vals, HYPRE_Int opt); template HYPRE_Int hypreDevice_StableSortByTupleKey(HYPRE_Int N, HYPRE_Int *keys1, HYPRE_Real *keys2, HYPRE_Int *vals, HYPRE_Int opt); template HYPRE_Int hypreDevice_StableSortByTupleKey(HYPRE_Int N, HYPRE_Int *keys1, HYPRE_Int *keys2, HYPRE_Complex *vals, HYPRE_Int opt); /*-------------------------------------------------------------------- * hypreDevice_ReduceByTupleKey *--------------------------------------------------------------------*/ template HYPRE_Int hypreDevice_ReduceByTupleKey( HYPRE_Int N, T1 *keys1_in, T2 *keys2_in, T3 *vals_in, T1 *keys1_out, T2 *keys2_out, T3 *vals_out ) { #if defined(HYPRE_USING_SYCL) auto begin_keys_in = oneapi::dpl::make_zip_iterator(keys1_in, keys2_in ); auto begin_keys_out = oneapi::dpl::make_zip_iterator(keys1_out, keys2_out); std::equal_to< std::tuple > pred; std::plus func; auto new_end = HYPRE_ONEDPL_CALL(oneapi::dpl::reduce_by_segment, begin_keys_in, begin_keys_in + N, vals_in, begin_keys_out, vals_out, pred, func); #else auto begin_keys_in = thrust::make_zip_iterator(thrust::make_tuple(keys1_in, keys2_in )); auto end_keys_in = thrust::make_zip_iterator(thrust::make_tuple(keys1_in + N, keys2_in + N)); auto begin_keys_out = thrust::make_zip_iterator(thrust::make_tuple(keys1_out, keys2_out )); thrust::equal_to< thrust::tuple > pred; thrust::plus func; auto new_end = HYPRE_THRUST_CALL(reduce_by_key, begin_keys_in, end_keys_in, vals_in, begin_keys_out, vals_out, pred, func); #endif return new_end.second - vals_out; } template HYPRE_Int hypreDevice_ReduceByTupleKey(HYPRE_Int N, HYPRE_Int *keys1_in, HYPRE_Int *keys2_in, HYPRE_Complex *vals_in, HYPRE_Int *keys1_out, HYPRE_Int *keys2_out, HYPRE_Complex *vals_out); /*-------------------------------------------------------------------- * hypreGPUKernel_ScatterConstant *--------------------------------------------------------------------*/ template __global__ void hypreGPUKernel_ScatterConstant(hypre_DeviceItem &item, T *x, HYPRE_Int n, HYPRE_Int *map, T v) { HYPRE_Int global_thread_id = hypre_gpu_get_grid_thread_id<1, 1>(item); if (global_thread_id < n) { x[map[global_thread_id]] = v; } } /*-------------------------------------------------------------------- * hypreDevice_ScatterConstant * * x[map[i]] = v * n is length of map * TODO: thrust? *--------------------------------------------------------------------*/ template HYPRE_Int hypreDevice_ScatterConstant(T *x, HYPRE_Int n, HYPRE_Int *map, T v) { /* trivial case */ if (n <= 0) { return hypre_error_flag; } dim3 bDim = hypre_GetDefaultDeviceBlockDimension(); dim3 gDim = hypre_GetDefaultDeviceGridDimension(n, "thread", bDim); HYPRE_GPU_LAUNCH( hypreGPUKernel_ScatterConstant, gDim, bDim, x, n, map, v ); return hypre_error_flag; } template HYPRE_Int hypreDevice_ScatterConstant(HYPRE_Int *x, HYPRE_Int n, HYPRE_Int *map, HYPRE_Int v); template HYPRE_Int hypreDevice_ScatterConstant(HYPRE_Complex *x, HYPRE_Int n, HYPRE_Int *map, HYPRE_Complex v); /*-------------------------------------------------------------------- * hypreGPUKernel_ScatterAddTrivial *--------------------------------------------------------------------*/ __global__ void hypreGPUKernel_ScatterAddTrivial(hypre_DeviceItem &item, HYPRE_Int n, HYPRE_Real *x, HYPRE_Int *map, HYPRE_Real *y) { for (HYPRE_Int i = 0; i < n; i++) { x[map[i]] += y[i]; } } /*-------------------------------------------------------------------- * hypreGPUKernel_ScatterAdd * * x[map[i]] += y[i], same index cannot appear more than once in map *--------------------------------------------------------------------*/ __global__ void hypreGPUKernel_ScatterAdd(hypre_DeviceItem &item, HYPRE_Int n, HYPRE_Real *x, HYPRE_Int *map, HYPRE_Real *y) { HYPRE_Int global_thread_id = hypre_gpu_get_grid_thread_id<1, 1>(item); if (global_thread_id < n) { x[map[global_thread_id]] += y[global_thread_id]; } } /*-------------------------------------------------------------------- * hypreDevice_GenScatterAdd * * Generalized Scatter-and-Add * * for i = 0 : ny-1, x[map[i]] += y[i]; * * Note: An index is allowed to appear more than once in map * Content in y will be destroyed * When work != NULL, work is at least of size * [2 * sizeof(HYPRE_Int) + sizeof(HYPRE_Complex)] * ny *--------------------------------------------------------------------*/ HYPRE_Int hypreDevice_GenScatterAdd( HYPRE_Real *x, HYPRE_Int ny, HYPRE_Int *map, HYPRE_Real *y, char *work) { if (ny <= 0) { return hypre_error_flag; } if (ny <= 2) { /* trivial cases, n = 1, 2 */ dim3 bDim = hypre_dim3(1); dim3 gDim = hypre_dim3(1); HYPRE_GPU_LAUNCH( hypreGPUKernel_ScatterAddTrivial, gDim, bDim, ny, x, map, y ); } else { /* general cases */ HYPRE_Int *map2, *reduced_map, reduced_n; HYPRE_Real *reduced_y; if (work) { map2 = (HYPRE_Int *) work; reduced_map = map2 + ny; reduced_y = (HYPRE_Real *) (reduced_map + ny); } else { map2 = hypre_TAlloc(HYPRE_Int, ny, HYPRE_MEMORY_DEVICE); reduced_map = hypre_TAlloc(HYPRE_Int, ny, HYPRE_MEMORY_DEVICE); reduced_y = hypre_TAlloc(HYPRE_Real, ny, HYPRE_MEMORY_DEVICE); } hypre_TMemcpy(map2, map, HYPRE_Int, ny, HYPRE_MEMORY_DEVICE, HYPRE_MEMORY_DEVICE); #if defined(HYPRE_USING_SYCL) auto zipped_begin = oneapi::dpl::make_zip_iterator(map2, y); HYPRE_ONEDPL_CALL(std::sort, zipped_begin, zipped_begin + ny, [](auto lhs, auto rhs) {return std::get<0>(lhs) < std::get<0>(rhs);}); auto new_end = HYPRE_ONEDPL_CALL( oneapi::dpl::reduce_by_segment, map2, map2 + ny, y, reduced_map, reduced_y ); #else HYPRE_THRUST_CALL(sort_by_key, map2, map2 + ny, y); thrust::pair new_end = HYPRE_THRUST_CALL( reduce_by_key, map2, map2 + ny, y, reduced_map, reduced_y ); #endif reduced_n = new_end.first - reduced_map; hypre_assert(reduced_n == new_end.second - reduced_y); dim3 bDim = hypre_GetDefaultDeviceBlockDimension(); dim3 gDim = hypre_GetDefaultDeviceGridDimension(reduced_n, "thread", bDim); HYPRE_GPU_LAUNCH( hypreGPUKernel_ScatterAdd, gDim, bDim, reduced_n, x, reduced_map, reduced_y ); if (!work) { hypre_TFree(map2, HYPRE_MEMORY_DEVICE); hypre_TFree(reduced_map, HYPRE_MEMORY_DEVICE); hypre_TFree(reduced_y, HYPRE_MEMORY_DEVICE); } } return hypre_error_flag; } /*-------------------------------------------------------------------- * hypreGPUKernel_Axpyzn *--------------------------------------------------------------------*/ template __global__ void hypreGPUKernel_Axpyzn( hypre_DeviceItem &item, HYPRE_Int n, T *x, T *y, T *z, T a, T b ) { HYPRE_Int i = hypre_gpu_get_grid_thread_id<1, 1>(item); if (i < n) { z[i] = a * x[i] + b * y[i]; } } /*-------------------------------------------------------------------- * hypreDevice_Axpyzn *--------------------------------------------------------------------*/ template HYPRE_Int hypreDevice_Axpyzn(HYPRE_Int n, T *d_x, T *d_y, T *d_z, T a, T b) { if (n <= 0) { return hypre_error_flag; } dim3 bDim = hypre_GetDefaultDeviceBlockDimension(); dim3 gDim = hypre_GetDefaultDeviceGridDimension(n, "thread", bDim); HYPRE_GPU_LAUNCH( hypreGPUKernel_Axpyzn, gDim, bDim, n, d_x, d_y, d_z, a, b ); return hypre_error_flag; } /*-------------------------------------------------------------------- * hypreDevice_ComplexAxpyn *--------------------------------------------------------------------*/ HYPRE_Int hypreDevice_ComplexAxpyn( HYPRE_Complex *d_x, size_t n, HYPRE_Complex *d_y, HYPRE_Complex *d_z, HYPRE_Complex a ) { return hypreDevice_Axpyzn((HYPRE_Int) n, d_x, d_y, d_z, a, (HYPRE_Complex) 1.0); } /*-------------------------------------------------------------------- * hypreDevice_IntAxpyn *--------------------------------------------------------------------*/ HYPRE_Int hypreDevice_IntAxpyn( HYPRE_Int *d_x, size_t n, HYPRE_Int *d_y, HYPRE_Int *d_z, HYPRE_Int a ) { return hypreDevice_Axpyzn((HYPRE_Int) n, d_x, d_y, d_z, a, (HYPRE_Int) 1); } /*-------------------------------------------------------------------- * hypreDevice_BigIntAxpyn *--------------------------------------------------------------------*/ HYPRE_Int hypreDevice_BigIntAxpyn( HYPRE_BigInt *d_x, size_t n, HYPRE_BigInt *d_y, HYPRE_BigInt *d_z, HYPRE_BigInt a ) { return hypreDevice_Axpyzn((HYPRE_Int) n, d_x, d_y, d_z, a, (HYPRE_BigInt) 1); } /*-------------------------------------------------------------------- * hypreDevice_ComplexAxpyzn *--------------------------------------------------------------------*/ HYPRE_Int hypreDevice_ComplexAxpyzn( HYPRE_Int n, HYPRE_Complex *d_x, HYPRE_Complex *d_y, HYPRE_Complex *d_z, HYPRE_Complex a, HYPRE_Complex b ) { return hypreDevice_Axpyzn(n, d_x, d_y, d_z, a, b); } #if defined(HYPRE_USING_CURAND) /*-------------------------------------------------------------------- * hypre_DeviceDataCurandGenerator *--------------------------------------------------------------------*/ curandGenerator_t hypre_DeviceDataCurandGenerator(hypre_DeviceData *data) { if (data->curand_generator) { return data->curand_generator; } curandGenerator_t gen; HYPRE_CURAND_CALL( curandCreateGenerator(&gen, CURAND_RNG_PSEUDO_DEFAULT) ); HYPRE_CURAND_CALL( curandSetPseudoRandomGeneratorSeed(gen, 1234ULL) ); HYPRE_CURAND_CALL( curandSetGeneratorOffset(gen, 0) ); HYPRE_CURAND_CALL( curandSetStream(gen, hypre_DeviceDataComputeStream(data)) ); data->curand_generator = gen; return gen; } /*-------------------------------------------------------------------- * hypre_CurandUniform_core * * T = float or hypre_double *--------------------------------------------------------------------*/ template HYPRE_Int hypre_CurandUniform_core( HYPRE_Int n, T *urand, HYPRE_Int set_seed, hypre_ulonglongint seed, HYPRE_Int set_offset, hypre_ulonglongint offset) { curandGenerator_t gen = hypre_HandleCurandGenerator(hypre_handle()); hypre_GpuProfilingPushRange("RandGen"); if (set_seed) { HYPRE_CURAND_CALL( curandSetPseudoRandomGeneratorSeed(gen, seed) ); } if (set_offset) { HYPRE_CURAND_CALL( curandSetGeneratorOffset(gen, offset) ); } if (sizeof(T) == sizeof(hypre_double)) { HYPRE_CURAND_CALL( curandGenerateUniformDouble(gen, (hypre_double *) urand, n) ); } else if (sizeof(T) == sizeof(float)) { HYPRE_CURAND_CALL( curandGenerateUniform(gen, (float *) urand, n) ); } hypre_GpuProfilingPopRange(); return hypre_error_flag; } #endif /* #if defined(HYPRE_USING_CURAND) */ #if defined(HYPRE_USING_ROCRAND) /*-------------------------------------------------------------------- * hypre_DeviceDataCurandGenerator *--------------------------------------------------------------------*/ rocrand_generator hypre_DeviceDataCurandGenerator(hypre_DeviceData *data) { if (data->curand_generator) { return data->curand_generator; } rocrand_generator gen; HYPRE_ROCRAND_CALL( rocrand_create_generator(&gen, ROCRAND_RNG_PSEUDO_DEFAULT) ); HYPRE_ROCRAND_CALL( rocrand_set_seed(gen, 1234ULL) ); HYPRE_ROCRAND_CALL( rocrand_set_offset(gen, 0) ); HYPRE_ROCRAND_CALL( rocrand_set_stream(gen, hypre_DeviceDataComputeStream(data)) ); data->curand_generator = gen; return gen; } /*-------------------------------------------------------------------- * hypre_CurandUniform_core *--------------------------------------------------------------------*/ template HYPRE_Int hypre_CurandUniform_core( HYPRE_Int n, T *urand, HYPRE_Int set_seed, hypre_ulonglongint seed, HYPRE_Int set_offset, hypre_ulonglongint offset) { hypre_GpuProfilingPushRange("hypre_CurandUniform_core"); rocrand_generator gen = hypre_HandleCurandGenerator(hypre_handle()); if (set_seed) { HYPRE_ROCRAND_CALL( rocrand_set_seed(gen, seed) ); } if (set_offset) { HYPRE_ROCRAND_CALL( rocrand_set_offset(gen, offset) ); } if (sizeof(T) == sizeof(hypre_double)) { HYPRE_ROCRAND_CALL( rocrand_generate_uniform_double(gen, (hypre_double *) urand, n) ); } else if (sizeof(T) == sizeof(float)) { HYPRE_ROCRAND_CALL( rocrand_generate_uniform(gen, (float *) urand, n) ); } hypre_GpuProfilingPopRange(); return hypre_error_flag; } #endif /* #if defined(HYPRE_USING_ROCRAND) */ #if defined(HYPRE_USING_ONEMKLRAND) /*-------------------------------------------------------------------- * hypre_CurandUniform_core * * T = float or hypre_double *--------------------------------------------------------------------*/ template HYPRE_Int hypre_CurandUniform_core( HYPRE_Int n, T *urand, HYPRE_Int set_seed, hypre_ulonglongint seed, HYPRE_Int set_offset, hypre_ulonglongint offset) { /* Note: if n is zero, onemkl rand throws an error */ if (n <= 0) { return hypre_error_flag; } static_assert(std::is_same_v || std::is_same_v, "oneMKL: rng/uniform: T is not supported"); oneapi::mkl::rng::default_engine engine(*hypre_HandleComputeStream(hypre_handle()), seed); oneapi::mkl::rng::uniform distribution(0.0 + offset, 1.0 + offset); oneapi::mkl::rng::generate(distribution, engine, n, urand).wait_and_throw(); return hypre_error_flag; } #endif /* #if defined(HYPRE_USING_ONEMKLRAND) */ #if defined(HYPRE_USING_CURAND) || defined(HYPRE_USING_ROCRAND) || defined(HYPRE_USING_ONEMKLRAND) /*-------------------------------------------------------------------- * hypre_CurandUniform *--------------------------------------------------------------------*/ HYPRE_Int hypre_CurandUniform( HYPRE_Int n, HYPRE_Real *urand, HYPRE_Int set_seed, hypre_ulonglongint seed, HYPRE_Int set_offset, hypre_ulonglongint offset) { return hypre_CurandUniform_core(n, urand, set_seed, seed, set_offset, offset); } /*-------------------------------------------------------------------- * hypre_CurandUniformSingle *--------------------------------------------------------------------*/ HYPRE_Int hypre_CurandUniformSingle( HYPRE_Int n, float *urand, HYPRE_Int set_seed, hypre_ulonglongint seed, HYPRE_Int set_offset, hypre_ulonglongint offset) { return hypre_CurandUniform_core(n, urand, set_seed, seed, set_offset, offset); } /*-------------------------------------------------------------------- * hypre_ResetDeviceRandGenerator *--------------------------------------------------------------------*/ HYPRE_Int hypre_ResetDeviceRandGenerator( hypre_ulonglongint seed, hypre_ulonglongint offset ) { #if defined(HYPRE_USING_CURAND) curandGenerator_t gen = hypre_HandleCurandGenerator(hypre_handle()); HYPRE_CURAND_CALL( curandSetPseudoRandomGeneratorSeed(gen, seed) ); HYPRE_CURAND_CALL( curandSetGeneratorOffset(gen, offset) ); #elif defined(HYPRE_USING_ROCRAND) rocrand_generator gen = hypre_HandleCurandGenerator(hypre_handle()); HYPRE_ROCRAND_CALL( rocrand_set_seed(gen, seed) ); HYPRE_ROCRAND_CALL( rocrand_set_offset(gen, offset) ); #endif return hypre_error_flag; } #endif /* #if defined(HYPRE_USING_CURAND) || defined(HYPRE_USING_ROCRAND) || defined(HYPRE_USING_ONEMKLRAND) */ /*-------------------------------------------------------------------- * hypreGPUKernel_filln *--------------------------------------------------------------------*/ template __global__ void hypreGPUKernel_filln(hypre_DeviceItem &item, T *x, size_t n, T v) { HYPRE_Int i = hypre_gpu_get_grid_thread_id<1, 1>(item); if (i < n) { x[i] = v; } } /*-------------------------------------------------------------------- * hypreDevice_Filln *--------------------------------------------------------------------*/ template HYPRE_Int hypreDevice_Filln(T *d_x, size_t n, T v) { #if 0 HYPRE_THRUST_CALL( fill_n, d_x, n, v); #else if (n <= 0) { return hypre_error_flag; } dim3 bDim = hypre_GetDefaultDeviceBlockDimension(); dim3 gDim = hypre_GetDefaultDeviceGridDimension(n, "thread", bDim); HYPRE_GPU_LAUNCH( hypreGPUKernel_filln, gDim, bDim, d_x, n, v ); #endif return hypre_error_flag; } /*-------------------------------------------------------------------- * hypreDevice_ComplexFilln *--------------------------------------------------------------------*/ HYPRE_Int hypreDevice_ComplexFilln( HYPRE_Complex *d_x, size_t n, HYPRE_Complex v ) { return hypreDevice_Filln(d_x, n, v); } /*-------------------------------------------------------------------- * hypreDevice_CharFilln *--------------------------------------------------------------------*/ HYPRE_Int hypreDevice_CharFilln( char *d_x, size_t n, char v ) { return hypreDevice_Filln(d_x, n, v); } /*-------------------------------------------------------------------- * hypreDevice_IntFilln *--------------------------------------------------------------------*/ HYPRE_Int hypreDevice_IntFilln( HYPRE_Int *d_x, size_t n, HYPRE_Int v ) { return hypreDevice_Filln(d_x, n, v); } /*-------------------------------------------------------------------- * hypreDevice_BigIntFilln *--------------------------------------------------------------------*/ HYPRE_Int hypreDevice_BigIntFilln( HYPRE_BigInt *d_x, size_t n, HYPRE_BigInt v) { return hypreDevice_Filln(d_x, n, v); } /*-------------------------------------------------------------------- * hypreGPUKernel_StridedCopy *--------------------------------------------------------------------*/ template __global__ void hypreGPUKernel_StridedCopy(hypre_DeviceItem &item, HYPRE_Int size, HYPRE_Int stride, T *in, T *out ) { HYPRE_Int i = hypre_gpu_get_grid_thread_id<1, 1>(item); if (i < size) { out[i] = in[i * stride]; } } /*-------------------------------------------------------------------- * hypreDevice_StridedCopy *--------------------------------------------------------------------*/ template HYPRE_Int hypreDevice_StridedCopy( HYPRE_Int size, HYPRE_Int stride, T *in, T *out ) { if (size < 1 || stride < 1) { return hypre_error_flag; } if (in == out) { hypre_error_w_msg(HYPRE_ERROR_GENERIC, "Cannot perform in-place strided copy"); return hypre_error_flag; } dim3 bDim = hypre_GetDefaultDeviceBlockDimension(); dim3 gDim = hypre_GetDefaultDeviceGridDimension(size, "thread", bDim); HYPRE_GPU_LAUNCH( hypreGPUKernel_StridedCopy, gDim, bDim, size, stride, in, out ); return hypre_error_flag; } /*-------------------------------------------------------------------- * hypreDevice_IntStridedCopy *--------------------------------------------------------------------*/ HYPRE_Int hypreDevice_IntStridedCopy( HYPRE_Int size, HYPRE_Int stride, HYPRE_Int *in, HYPRE_Int *out ) { return hypreDevice_StridedCopy(size, stride, in, out); } /*-------------------------------------------------------------------- * hypreDevice_ComplexStridedCopy *--------------------------------------------------------------------*/ HYPRE_Int hypreDevice_ComplexStridedCopy( HYPRE_Int size, HYPRE_Int stride, HYPRE_Complex *in, HYPRE_Complex *out ) { return hypreDevice_StridedCopy(size, stride, in, out); } /*-------------------------------------------------------------------- * hypreDevice_CsrRowPtrsToIndicesWithRowNum * * Input: d_row_num, of size nrows, contains the rows indices that * can be HYPRE_BigInt or HYPRE_Int * Output: d_row_ind *--------------------------------------------------------------------*/ template HYPRE_Int hypreDevice_CsrRowPtrsToIndicesWithRowNum( HYPRE_Int nrows, HYPRE_Int nnz, HYPRE_Int *d_row_ptr, T *d_row_num, T *d_row_ind ) { /* trivial case */ if (nrows <= 0) { return hypre_error_flag; } HYPRE_Int *map = hypre_TAlloc(HYPRE_Int, nnz, HYPRE_MEMORY_DEVICE); hypreDevice_CsrRowPtrsToIndices_v2(nrows, nnz, d_row_ptr, map); #if defined(HYPRE_USING_SYCL) hypreSycl_gather(map, map + nnz, d_row_num, d_row_ind); #else HYPRE_THRUST_CALL(gather, map, map + nnz, d_row_num, d_row_ind); #endif hypre_TFree(map, HYPRE_MEMORY_DEVICE); return hypre_error_flag; } template HYPRE_Int hypreDevice_CsrRowPtrsToIndicesWithRowNum( HYPRE_Int nrows, HYPRE_Int nnz, HYPRE_Int *d_row_ptr, HYPRE_Int *d_row_num, HYPRE_Int *d_row_ind ); #if defined(HYPRE_MIXEDINT) template HYPRE_Int hypreDevice_CsrRowPtrsToIndicesWithRowNum( HYPRE_Int nrows, HYPRE_Int nnz, HYPRE_Int *d_row_ptr, HYPRE_BigInt *d_row_num, HYPRE_BigInt *d_row_ind ); #endif /*-------------------------------------------------------------------- * hypreDevice_IntegerReduceSum *--------------------------------------------------------------------*/ HYPRE_Int hypreDevice_IntegerReduceSum( HYPRE_Int n, HYPRE_Int *d_i ) { #if defined(HYPRE_USING_SYCL) return HYPRE_ONEDPL_CALL(std::reduce, d_i, d_i + n); #else return HYPRE_THRUST_CALL(reduce, d_i, d_i + n); #endif } /*-------------------------------------------------------------------- * hypreDevice_ComplexReduceSum *--------------------------------------------------------------------*/ HYPRE_Complex hypreDevice_ComplexReduceSum(HYPRE_Int n, HYPRE_Complex *d_x) { #if defined(HYPRE_USING_SYCL) return HYPRE_ONEDPL_CALL(std::reduce, d_x, d_x + n); #else return HYPRE_THRUST_CALL(reduce, d_x, d_x + n); #endif } /*-------------------------------------------------------------------- * hypreGPUKernel_scalen *--------------------------------------------------------------------*/ template __global__ void hypreGPUKernel_scalen( hypre_DeviceItem &item, T *x, size_t n, T *y, T v ) { HYPRE_Int i = hypre_gpu_get_grid_thread_id<1, 1>(item); if (i < n) { y[i] = x[i] * v; } } /*-------------------------------------------------------------------- * hypreDevice_Scalen *--------------------------------------------------------------------*/ template HYPRE_Int hypreDevice_Scalen( T *d_x, size_t n, T *d_y, T v ) { #if 0 HYPRE_THRUST_CALL( transform, d_x, d_x + n, d_y, v * _1 ); #else if (n <= 0) { return hypre_error_flag; } dim3 bDim = hypre_GetDefaultDeviceBlockDimension(); dim3 gDim = hypre_GetDefaultDeviceGridDimension(n, "thread", bDim); HYPRE_GPU_LAUNCH( hypreGPUKernel_scalen, gDim, bDim, d_x, n, d_y, v ); #endif return hypre_error_flag; } /*-------------------------------------------------------------------- * hypreDevice_IntScalen *--------------------------------------------------------------------*/ HYPRE_Int hypreDevice_IntScalen( HYPRE_Int *d_x, size_t n, HYPRE_Int *d_y, HYPRE_Int v ) { return hypreDevice_Scalen(d_x, n, d_y, v); } /*-------------------------------------------------------------------- * hypreDevice_ComplexScalen *--------------------------------------------------------------------*/ HYPRE_Int hypreDevice_ComplexScalen( HYPRE_Complex *d_x, size_t n, HYPRE_Complex *d_y, HYPRE_Complex v ) { return hypreDevice_Scalen(d_x, n, d_y, v); } /*-------------------------------------------------------------------- * hypreDevice_StableSortTupleByTupleKey * * opt: * 0, (a,b) < (a',b') iff a < a' or (a = a' and b < b') * [normal tupe comp] * * 2, (a,b) < (a',b') iff a < a' or (a = a' and (b == a or b < b') and b' != a') * [used in assembly to put diagonal first] *--------------------------------------------------------------------*/ template HYPRE_Int hypreDevice_StableSortTupleByTupleKey(HYPRE_Int N, T1 *keys1, T2 *keys2, T3 *vals1, T4 *vals2, HYPRE_Int opt) { #if defined(HYPRE_USING_SYCL) auto zipped_begin = oneapi::dpl::make_zip_iterator(keys1, keys2, vals1, vals2); if (opt == 0) { HYPRE_ONEDPL_CALL(std::stable_sort, zipped_begin, zipped_begin + N, std::less< std::tuple >()); } else if (opt == 2) { HYPRE_ONEDPL_CALL(std::stable_sort, zipped_begin, zipped_begin + N, TupleComp3()); } #else auto begin_keys = thrust::make_zip_iterator(thrust::make_tuple(keys1, keys2)); auto end_keys = thrust::make_zip_iterator(thrust::make_tuple(keys1 + N, keys2 + N)); auto begin_vals = thrust::make_zip_iterator(thrust::make_tuple(vals1, vals2)); if (opt == 0) { HYPRE_THRUST_CALL(stable_sort_by_key, begin_keys, end_keys, begin_vals, thrust::less< thrust::tuple >()); } else if (opt == 2) { HYPRE_THRUST_CALL(stable_sort_by_key, begin_keys, end_keys, begin_vals, TupleComp3()); } #endif return hypre_error_flag; } template HYPRE_Int hypreDevice_StableSortTupleByTupleKey(HYPRE_Int N, HYPRE_Int *keys1, HYPRE_Int *keys2, char *vals1, HYPRE_Complex *vals2, HYPRE_Int opt); #if defined(HYPRE_MIXEDINT) template HYPRE_Int hypreDevice_StableSortTupleByTupleKey(HYPRE_Int N, HYPRE_BigInt *keys1, HYPRE_BigInt *keys2, char *vals1, HYPRE_Complex *vals2, HYPRE_Int opt); #endif /*-------------------------------------------------------------------- * hypreGPUKernel_DiagScaleVector *--------------------------------------------------------------------*/ template __global__ void hypreGPUKernel_DiagScaleVector( hypre_DeviceItem &item, HYPRE_Int num_vectors, HYPRE_Int num_rows, HYPRE_Int *A_i, HYPRE_Complex *A_data, HYPRE_Complex *x, HYPRE_Complex beta, HYPRE_Complex *y ) { HYPRE_Int i = hypre_gpu_get_grid_thread_id<1, 1>(item); HYPRE_Int j; HYPRE_Complex val; if (i < num_rows) { val = 1.0 / A_data[A_i[i]]; if (beta != 0.0) { if (NV > 0) { #pragma unroll for (j = 0; j < NV; j++) { y[i + j * num_rows] = val * x[i + j * num_rows] + beta * y[i + j * num_rows]; } } else { #pragma unroll 8 for (j = 0; j < num_vectors; j++) { y[i + j * num_rows] = val * x[i + j * num_rows] + beta * y[i + j * num_rows]; } } } else { if (NV > 0) { #pragma unroll for (j = 0; j < NV; j++) { y[i + j * num_rows] = val * x[i + j * num_rows]; } } else { #pragma unroll 8 for (j = 0; j < num_vectors; j++) { y[i + j * num_rows] = val * x[i + j * num_rows]; } } } } } /*-------------------------------------------------------------------- * hypreDevice_DiagScaleVector * * y = diag(A) \ x + beta y * Note: Assume A_i[i] points to the ith diagonal entry of A *--------------------------------------------------------------------*/ HYPRE_Int hypreDevice_DiagScaleVector( HYPRE_Int num_vectors, HYPRE_Int num_rows, HYPRE_Int *A_i, HYPRE_Complex *A_data, HYPRE_Complex *x, HYPRE_Complex beta, HYPRE_Complex *y ) { /* trivial case */ if (num_rows <= 0) { return hypre_error_flag; } hypre_assert(num_vectors > 0); dim3 bDim = hypre_GetDefaultDeviceBlockDimension(); dim3 gDim = hypre_GetDefaultDeviceGridDimension(num_rows, "thread", bDim); switch (num_vectors) { case 1: HYPRE_GPU_LAUNCH( hypreGPUKernel_DiagScaleVector<1>, gDim, bDim, num_vectors, num_rows, A_i, A_data, x, beta, y ); break; case 2: HYPRE_GPU_LAUNCH( hypreGPUKernel_DiagScaleVector<2>, gDim, bDim, num_vectors, num_rows, A_i, A_data, x, beta, y ); break; case 3: HYPRE_GPU_LAUNCH( hypreGPUKernel_DiagScaleVector<3>, gDim, bDim, num_vectors, num_rows, A_i, A_data, x, beta, y ); break; case 4: HYPRE_GPU_LAUNCH( hypreGPUKernel_DiagScaleVector<4>, gDim, bDim, num_vectors, num_rows, A_i, A_data, x, beta, y ); break; case 5: HYPRE_GPU_LAUNCH( hypreGPUKernel_DiagScaleVector<5>, gDim, bDim, num_vectors, num_rows, A_i, A_data, x, beta, y ); break; case 6: HYPRE_GPU_LAUNCH( hypreGPUKernel_DiagScaleVector<6>, gDim, bDim, num_vectors, num_rows, A_i, A_data, x, beta, y ); break; case 7: HYPRE_GPU_LAUNCH( hypreGPUKernel_DiagScaleVector<7>, gDim, bDim, num_vectors, num_rows, A_i, A_data, x, beta, y ); break; case 8: HYPRE_GPU_LAUNCH( hypreGPUKernel_DiagScaleVector<8>, gDim, bDim, num_vectors, num_rows, A_i, A_data, x, beta, y ); break; default: HYPRE_GPU_LAUNCH( hypreGPUKernel_DiagScaleVector<0>, gDim, bDim, num_vectors, num_rows, A_i, A_data, x, beta, y ); break; } return hypre_error_flag; } /*-------------------------------------------------------------------- * hypreGPUKernel_DiagScaleVector2 *--------------------------------------------------------------------*/ template __global__ void hypreGPUKernel_DiagScaleVector2( hypre_DeviceItem &item, HYPRE_Int num_vectors, HYPRE_Int num_rows, HYPRE_Complex *diag, HYPRE_Complex *x, HYPRE_Complex beta, HYPRE_Complex *y, HYPRE_Complex *z ) { HYPRE_Int i = hypre_gpu_get_grid_thread_id<1, 1>(item); HYPRE_Int j; HYPRE_Complex inv_diag; HYPRE_Complex x_over_diag; if (i < num_rows) { inv_diag = 1.0 / diag[i]; if (NV > 0) { #pragma unroll for (j = 0; j < NV; j++) { x_over_diag = x[i + j * num_rows] * inv_diag; if (CY) { y[i + j * num_rows] = x_over_diag; } z[i + j * num_rows] += beta * x_over_diag; } } else { #pragma unroll 8 for (j = 0; j < num_vectors; j++) { x_over_diag = x[i + j * num_rows] * inv_diag; if (CY) { y[i + j * num_rows] = x_over_diag; } z[i + j * num_rows] += beta * x_over_diag; } } } } /*-------------------------------------------------------------------- * hypreDevice_DiagScaleVector2 * * y = x ./ diag * z = z + beta * (x ./ diag) *--------------------------------------------------------------------*/ HYPRE_Int hypreDevice_DiagScaleVector2( HYPRE_Int num_vectors, HYPRE_Int num_rows, HYPRE_Complex *diag, HYPRE_Complex *x, HYPRE_Complex beta, HYPRE_Complex *y, HYPRE_Complex *z, HYPRE_Int computeY ) { /* trivial case */ if (num_rows <= 0) { return hypre_error_flag; } hypre_assert(num_vectors > 0); dim3 bDim = hypre_GetDefaultDeviceBlockDimension(); dim3 gDim = hypre_GetDefaultDeviceGridDimension(num_rows, "thread", bDim); switch (num_vectors) { case 1: if (computeY > 0) { HYPRE_GPU_LAUNCH( (hypreGPUKernel_DiagScaleVector2<1, 1>), gDim, bDim, num_vectors, num_rows, diag, x, beta, y, z ); } else { HYPRE_GPU_LAUNCH( (hypreGPUKernel_DiagScaleVector2<1, 0>), gDim, bDim, num_vectors, num_rows, diag, x, beta, y, z ); } break; case 2: if (computeY > 0) { HYPRE_GPU_LAUNCH( (hypreGPUKernel_DiagScaleVector2<2, 1>), gDim, bDim, num_vectors, num_rows, diag, x, beta, y, z ); } else { HYPRE_GPU_LAUNCH( (hypreGPUKernel_DiagScaleVector2<2, 0>), gDim, bDim, num_vectors, num_rows, diag, x, beta, y, z ); } break; case 3: if (computeY > 0) { HYPRE_GPU_LAUNCH( (hypreGPUKernel_DiagScaleVector2<3, 1>), gDim, bDim, num_vectors, num_rows, diag, x, beta, y, z ); } else { HYPRE_GPU_LAUNCH( (hypreGPUKernel_DiagScaleVector2<3, 0>), gDim, bDim, num_vectors, num_rows, diag, x, beta, y, z ); } break; case 4: if (computeY > 0) { HYPRE_GPU_LAUNCH( (hypreGPUKernel_DiagScaleVector2<4, 1>), gDim, bDim, num_vectors, num_rows, diag, x, beta, y, z ); } else { HYPRE_GPU_LAUNCH( (hypreGPUKernel_DiagScaleVector2<4, 0>), gDim, bDim, num_vectors, num_rows, diag, x, beta, y, z ); } break; case 5: if (computeY > 0) { HYPRE_GPU_LAUNCH( (hypreGPUKernel_DiagScaleVector2<5, 1>), gDim, bDim, num_vectors, num_rows, diag, x, beta, y, z ); } else { HYPRE_GPU_LAUNCH( (hypreGPUKernel_DiagScaleVector2<5, 0>), gDim, bDim, num_vectors, num_rows, diag, x, beta, y, z ); } break; case 6: if (computeY > 0) { HYPRE_GPU_LAUNCH( (hypreGPUKernel_DiagScaleVector2<6, 1>), gDim, bDim, num_vectors, num_rows, diag, x, beta, y, z ); } else { HYPRE_GPU_LAUNCH( (hypreGPUKernel_DiagScaleVector2<6, 0>), gDim, bDim, num_vectors, num_rows, diag, x, beta, y, z ); } break; case 7: if (computeY > 0) { HYPRE_GPU_LAUNCH( (hypreGPUKernel_DiagScaleVector2<7, 1>), gDim, bDim, num_vectors, num_rows, diag, x, beta, y, z ); } else { HYPRE_GPU_LAUNCH( (hypreGPUKernel_DiagScaleVector2<7, 0>), gDim, bDim, num_vectors, num_rows, diag, x, beta, y, z ); } break; case 8: if (computeY > 0) { HYPRE_GPU_LAUNCH( (hypreGPUKernel_DiagScaleVector2<8, 1>), gDim, bDim, num_vectors, num_rows, diag, x, beta, y, z ); } else { HYPRE_GPU_LAUNCH( (hypreGPUKernel_DiagScaleVector2<8, 0>), gDim, bDim, num_vectors, num_rows, diag, x, beta, y, z ); } break; default: if (computeY > 0) { HYPRE_GPU_LAUNCH( (hypreGPUKernel_DiagScaleVector2<0, 1>), gDim, bDim, num_vectors, num_rows, diag, x, beta, y, z ); } else { HYPRE_GPU_LAUNCH( (hypreGPUKernel_DiagScaleVector2<0, 0>), gDim, bDim, num_vectors, num_rows, diag, x, beta, y, z ); } break; } return hypre_error_flag; } /*-------------------------------------------------------------------- * hypreGPUKernel_zeqxmydd * * z[i] = (x[i] + alpha*y[i])*d[i] *--------------------------------------------------------------------*/ __global__ void hypreGPUKernel_zeqxmydd(hypre_DeviceItem &item, HYPRE_Int n, HYPRE_Complex* __restrict__ x, HYPRE_Complex alpha, HYPRE_Complex* __restrict__ y, HYPRE_Complex* __restrict__ z, HYPRE_Complex* __restrict__ d) { HYPRE_Int i = hypre_gpu_get_grid_thread_id<1, 1>(item); if (i < n) { z[i] = (x[i] + alpha * y[i]) * d[i]; } } /*-------------------------------------------------------------------- * hypreDevice_zeqxmydd *--------------------------------------------------------------------*/ HYPRE_Int hypreDevice_zeqxmydd(HYPRE_Int n, HYPRE_Complex *x, HYPRE_Complex alpha, HYPRE_Complex *y, HYPRE_Complex *z, HYPRE_Complex *d) { /* trivial case */ if (n <= 0) { return hypre_error_flag; } dim3 bDim = hypre_GetDefaultDeviceBlockDimension(); dim3 gDim = hypre_GetDefaultDeviceGridDimension(n, "thread", bDim); HYPRE_GPU_LAUNCH( hypreGPUKernel_zeqxmydd, gDim, bDim, n, x, alpha, y, z, d); return hypre_error_flag; } #endif // #if defined(HYPRE_USING_GPU) /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - * cuda/hip functions * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ #if defined(HYPRE_USING_CUDA) || defined(HYPRE_USING_HIP) /*-------------------------------------------------------------------- * hypreGPUKernel_CompileFlagSafetyCheck * * The architecture identification macro __CUDA_ARCH__ is assigned a * three-digit value string xy0 (ending in a literal 0) during each * nvcc compilation stage 1 that compiles for compute_xy. * * This macro can be used in the implementation of GPU functions for * determining the virtual architecture for which it is currently being * compiled. The host code (the non-GPU code) must not depend on it. * * Note that compute_XX refers to a PTX version and sm_XX refers to * a cubin version. *--------------------------------------------------------------------*/ __global__ void hypreGPUKernel_CompileFlagSafetyCheck( hypre_DeviceItem &item, hypre_int *cuda_arch_compile ) { #if defined(__CUDA_ARCH__) cuda_arch_compile[0] = __CUDA_ARCH__; #endif } /*-------------------------------------------------------------------- * hypre_CudaCompileFlagCheck * * Assume this function is called inside HYPRE_Init(), at a place * where we do not want to activate memory pooling, so we do not use * hypre's memory model to Alloc and Free. * * See commented out code below (and do not delete) * * This is really only defined for CUDA and not for HIP *--------------------------------------------------------------------*/ HYPRE_Int hypre_CudaCompileFlagCheck() { #if defined(HYPRE_USING_CUDA) HYPRE_Int device; hypre_GetDevice(&device); struct cudaDeviceProp props; HYPRE_CUDA_CALL(cudaGetDeviceProperties(&props, device)); hypre_int cuda_arch_actual = props.major * 100 + props.minor * 10; hypre_int cuda_arch_compile = -1; dim3 gDim(1, 1, 1), bDim(1, 1, 1); hypre_int *cuda_arch_compile_d = NULL; //cuda_arch_compile_d = hypre_TAlloc(hypre_int, 1, HYPRE_MEMORY_DEVICE); HYPRE_CUDA_CALL( cudaMalloc(&cuda_arch_compile_d, sizeof(hypre_int)) ); HYPRE_CUDA_CALL( cudaMemcpy(cuda_arch_compile_d, &cuda_arch_compile, sizeof(hypre_int), cudaMemcpyHostToDevice) ); HYPRE_GPU_LAUNCH( hypreGPUKernel_CompileFlagSafetyCheck, gDim, bDim, cuda_arch_compile_d ); HYPRE_CUDA_CALL( cudaMemcpy(&cuda_arch_compile, cuda_arch_compile_d, sizeof(hypre_int), cudaMemcpyDeviceToHost) ); //hypre_TFree(cuda_arch_compile_d, HYPRE_MEMORY_DEVICE); HYPRE_CUDA_CALL( cudaFree(cuda_arch_compile_d) ); /* HYPRE_CUDA_CALL(cudaDeviceSynchronize()); */ const hypre_int cuda_arch_actual_major = cuda_arch_actual / 100; const hypre_int cuda_arch_compile_major = cuda_arch_compile / 100; const hypre_int cuda_arch_actual_minor = cuda_arch_actual % 100; const hypre_int cuda_arch_compile_minor = cuda_arch_compile % 100; if (cuda_arch_actual_major != cuda_arch_compile_major || cuda_arch_actual_minor < cuda_arch_compile_minor) { char msg[256]; if (-1 == cuda_arch_compile) { hypre_sprintf(msg, "hypre error: no proper cuda_arch found"); } else { hypre_sprintf(msg, "hypre error: Compile arch %d ('--generate-code arch=compute_%d') does not match device arch %d", cuda_arch_compile, cuda_arch_compile / 10, cuda_arch_actual); } hypre_error_w_msg(1, msg); #if defined(HYPRE_DEBUG) hypre_ParPrintf(hypre_MPI_COMM_WORLD, "%s\n", msg); #endif hypre_assert(0); } #endif // defined(HYPRE_USING_CUDA) return hypre_error_flag; } #if defined(HYPRE_USING_CUSPARSE) /*-------------------------------------------------------------------- * hypre_HYPREComplexToCudaDataType * * Determines the associated CudaDataType for HYPRE_Complex * * TODO: Should be known at compile time. * Support more sizes. * Support complex. * * Note: Only works for Single and Double precision. *--------------------------------------------------------------------*/ cudaDataType hypre_HYPREComplexToCudaDataType() { /* if (sizeof(char)*CHAR_BIT != 8) { hypre_error_w_msg(HYPRE_ERROR_GENERIC, "ERROR: Unsupported char size"); hypre_assert(false); } */ #if defined(HYPRE_COMPLEX) return CUDA_C_64F; #else #if defined(HYPRE_SINGLE) hypre_assert(sizeof(HYPRE_Complex) == 4); return CUDA_R_32F; #elif defined(HYPRE_LONG_DOUBLE) #error "Long Double is not supported on GPUs" #else hypre_assert(sizeof(HYPRE_Complex) == 8); return CUDA_R_64F; #endif #endif // #if defined(HYPRE_COMPLEX) } #if CUSPARSE_VERSION >= 10300 /*-------------------------------------------------------------------- * hypre_HYPREIntToCusparseIndexType * * Determines the associated cusparseIndexType_t for HYPRE_Int *--------------------------------------------------------------------*/ cusparseIndexType_t hypre_HYPREIntToCusparseIndexType() { /* if(sizeof(char)*CHAR_BIT!=8) { hypre_error_w_msg(HYPRE_ERROR_GENERIC, "ERROR: Unsupported char size"); hypre_assert(false); } */ #if defined(HYPRE_BIGINT) hypre_assert(sizeof(HYPRE_Int) == 8); return CUSPARSE_INDEX_64I; #else hypre_assert(sizeof(HYPRE_Int) == 4); return CUSPARSE_INDEX_32I; #endif } #endif #endif // #if defined(HYPRE_USING_CUSPARSE) #if defined(HYPRE_USING_CUBLAS) /*-------------------------------------------------------------------- * hypre_DeviceDataCublasHandle *--------------------------------------------------------------------*/ cublasHandle_t hypre_DeviceDataCublasHandle(hypre_DeviceData *data) { if (data->cublas_handle) { return data->cublas_handle; } cublasHandle_t handle; HYPRE_CUBLAS_CALL( cublasCreate(&handle) ); HYPRE_CUBLAS_CALL( cublasSetStream(handle, hypre_DeviceDataComputeStream(data)) ); data->cublas_handle = handle; return handle; } #endif #if defined(HYPRE_USING_CUSPARSE) /*-------------------------------------------------------------------- * hypre_DeviceDataCusparseHandle *--------------------------------------------------------------------*/ cusparseHandle_t hypre_DeviceDataCusparseHandle(hypre_DeviceData *data) { if (data->cusparse_handle) { return data->cusparse_handle; } cusparseHandle_t handle; HYPRE_CUSPARSE_CALL( cusparseCreate(&handle) ); HYPRE_CUSPARSE_CALL( cusparseSetStream(handle, hypre_DeviceDataComputeStream(data)) ); data->cusparse_handle = handle; return handle; } #endif // defined(HYPRE_USING_CUSPARSE) #if defined(HYPRE_USING_ROCSPARSE) /*-------------------------------------------------------------------- * hypre_DeviceDataCusparseHandle *--------------------------------------------------------------------*/ rocsparse_handle hypre_DeviceDataCusparseHandle(hypre_DeviceData *data) { if (data->cusparse_handle) { return data->cusparse_handle; } rocsparse_handle handle; HYPRE_ROCSPARSE_CALL( rocsparse_create_handle(&handle) ); HYPRE_ROCSPARSE_CALL( rocsparse_set_stream(handle, hypre_DeviceDataComputeStream(data)) ); data->cusparse_handle = handle; return handle; } #endif // defined(HYPRE_USING_ROCSPARSE) #if defined(HYPRE_USING_CUSOLVER) || defined(HYPRE_USING_ROCSOLVER) /*-------------------------------------------------------------------- * hypre_DeviceDataVendorSolverHandle *--------------------------------------------------------------------*/ vendorSolverHandle_t hypre_DeviceDataVendorSolverHandle(hypre_DeviceData *data) { if (data->vendor_solver_handle) { return data->vendor_solver_handle; } #if defined(HYPRE_USING_CUSOLVER) cusolverDnHandle_t handle; HYPRE_CUSOLVER_CALL( cusolverDnCreate(&handle) ); HYPRE_CUSOLVER_CALL( cusolverDnSetStream(handle, hypre_DeviceDataComputeStream(data)) ); #else rocblas_handle handle; HYPRE_ROCBLAS_CALL( rocblas_create_handle(&handle) ); HYPRE_ROCBLAS_CALL( rocblas_set_stream(handle, hypre_DeviceDataComputeStream(data)) ); #endif data->vendor_solver_handle = handle; return handle; } #endif // defined(HYPRE_USING_CUSOLVER) || defined(HYPRE_USING_ROCSOLVER) #endif // #if defined(HYPRE_USING_CUDA) || defined(HYPRE_USING_HIP) /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - * sycl functions * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ #if defined(HYPRE_USING_SYCL) /*-------------------------------------------------------------------- * HYPRE_SetSYCLDevice *--------------------------------------------------------------------*/ HYPRE_Int HYPRE_SetSYCLDevice(sycl::device user_device) { hypre_DeviceData *data = hypre_HandleDeviceData(hypre_handle()); /* Cleanup default device and queues */ if (data->device) { delete data->device; } #if defined(HYPRE_USING_CUDA_STREAMS) for (HYPRE_Int i = 0; i < HYPRE_MAX_NUM_STREAMS; i++) { if (data->streams[i]) { delete data->streams[i]; data->streams[i] = nullptr; } } #endif /* Setup new device and compute stream */ data->device = new sycl::device(user_device); hypre_HandleComputeStream(hypre_handle()); return hypre_error_flag; } #endif // #if defined(HYPRE_USING_SYCL) /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - * additional functions * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ /*-------------------------------------------------------------------- * hypre_bind_device * * This function is supposed to be used in the test drivers to mimic * users' GPU binding approaches * It is supposed to be called before HYPRE_Init, * so that HYPRE_Init can get the wanted device id * Note - sycl has no analogue to cudaSetDevice(), * so this has no effect on the sycl implementation. *--------------------------------------------------------------------*/ HYPRE_Int hypre_bind_device_id( HYPRE_Int device_id_in, HYPRE_Int myid, HYPRE_Int nproc, MPI_Comm comm ) { #if defined(HYPRE_USING_GPU) || defined(HYPRE_USING_DEVICE_OPENMP) /* proc id (rank) on the running node */ HYPRE_Int myNodeid; /* num of procs (size) on the node */ HYPRE_Int NodeSize; /* num of devices seen */ hypre_int nDevices; /* device id that want to bind */ hypre_int device_id; hypre_MPI_Comm node_comm; hypre_MPI_Comm_split_type( comm, hypre_MPI_COMM_TYPE_SHARED, myid, hypre_MPI_INFO_NULL, &node_comm ); hypre_MPI_Comm_rank(node_comm, &myNodeid); hypre_MPI_Comm_size(node_comm, &NodeSize); hypre_MPI_Comm_free(&node_comm); hypre_GetDeviceCount(&nDevices); if (-1 == device_id_in) { /* get number of devices on this node */ device_id = myNodeid % nDevices; } else { device_id = (hypre_int) device_id_in; } /* set device */ #if defined(HYPRE_USING_DEVICE_OPENMP) omp_set_default_device(device_id); #elif defined(HYPRE_USING_CUDA) HYPRE_CUDA_CALL( cudaSetDevice(device_id) ); #elif defined(HYPRE_USING_HIP) HYPRE_HIP_CALL( hipSetDevice(device_id) ); #elif defined(HYPRE_USING_SYCL) HYPRE_UNUSED_VAR(device_id); #endif #if defined(HYPRE_DEBUG) && defined(HYPRE_PRINT_ERRORS) hypre_printf("Proc [global %d/%d, local %d/%d] can see %d GPUs and is running on %d\n", myid, nproc, myNodeid, NodeSize, nDevices, device_id); #endif #else HYPRE_UNUSED_VAR(device_id_in); HYPRE_UNUSED_VAR(myid); HYPRE_UNUSED_VAR(nproc); HYPRE_UNUSED_VAR(comm); #endif // #if defined(HYPRE_USING_GPU) || defined(HYPRE_USING_DEVICE_OPENMP) return hypre_error_flag; } HYPRE_Int hypre_bind_device( HYPRE_Int myid, HYPRE_Int nproc, MPI_Comm comm ) { return hypre_bind_device_id(-1, myid, nproc, comm); } hypre-2.33.0/src/utilities/device_utils.h000066400000000000000000002257231477326011500204010ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #ifndef HYPRE_DEVICE_UTILS_H #define HYPRE_DEVICE_UTILS_H #if defined(HYPRE_USING_GPU) /* Data types depending on GPU architecture */ #if defined(HYPRE_USING_CUDA) || defined(HYPRE_USING_SYCL) typedef hypre_uint hypre_mask; #define hypre_mask_one 1U #elif defined(HYPRE_USING_HIP) typedef hypre_ulonglongint hypre_mask; #define hypre_mask_one 1ULL #endif /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - * cuda includes * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ #if defined(HYPRE_USING_CUDA) using hypre_DeviceItem = void*; #include #include #include #if defined(HYPRE_USING_CURAND) #include #endif #if defined(HYPRE_USING_CUBLAS) #include #endif #if defined(HYPRE_USING_CUSPARSE) /* Note (VPM) : As of cuSPARSE 12, ILU functionalities have been marked as deprecated. The following definition avoids compilation warnings regarding the use of ILU routines */ #define DISABLE_CUSPARSE_DEPRECATED #include #endif #if defined(HYPRE_USING_CUSOLVER) #include #endif #ifndef CUDART_VERSION #error CUDART_VERSION Undefined! #endif #ifndef CUDA_VERSION #error CUDA_VERSION Undefined! #endif #if CUDA_VERSION >= 11000 #define THRUST_IGNORE_DEPRECATED_CPP11 #define CUB_IGNORE_DEPRECATED_CPP11 #define THRUST_IGNORE_DEPRECATED_CPP_DIALECT #define CUB_IGNORE_DEPRECATED_CPP_DIALECT #endif #ifndef CUSPARSE_VERSION #if defined(CUSPARSE_VER_MAJOR) && defined(CUSPARSE_VER_MINOR) && defined(CUSPARSE_VER_PATCH) #define CUSPARSE_VERSION (CUSPARSE_VER_MAJOR * 1000 + CUSPARSE_VER_MINOR * 100 + CUSPARSE_VER_PATCH) #else #define CUSPARSE_VERSION CUDA_VERSION #endif #endif #define CUSPARSE_NEWAPI_VERSION 11000 #define CUSPARSE_NEWSPMM_VERSION 11401 #define CUDA_MALLOCASYNC_VERSION 11020 #define CUDA_THRUST_NOSYNC_VERSION 12000 #define CUSPARSE_SPSV_VERSION 11600 #if CUSPARSE_VERSION >= CUSPARSE_SPSV_VERSION #define hypre_cusparseSpSVDescr cusparseSpSVDescr_t #define hypre_cusparseSpSV_createDescr cusparseSpSV_createDescr #define hypre_cusparseSpSV_destroyDescr cusparseSpSV_destroyDescr #else #define hypre_cusparseSpSVDescr csrsv2Info_t #define hypre_cusparseSpSV_createDescr cusparseCreateCsrsv2Info #define hypre_cusparseSpSV_destroyDescr cusparseDestroyCsrsv2Info #endif #define CUSPARSE_SPSM_VERSION 11600 #if CUSPARSE_VERSION >= CUSPARSE_SPSM_VERSION #define hypre_cusparseSpSMDescr cusparseSpSMDescr_t #define hypre_cusparseSpSM_createDescr cusparseSpSM_createDescr #define hypre_cusparseSpSM_destroyDescr cusparseSpSM_destroyDescr #else #define hypre_cusparseSpSMDescr csrsm2Info_t #define hypre_cusparseSpSM_createDescr cusparseCreateCsrsm2Info #define hypre_cusparseSpSM_destroyDescr cusparseDestroyCsrsm2Info #endif #if defined(HYPRE_USING_DEVICE_MALLOC_ASYNC) #if CUDA_VERSION < CUDA_MALLOCASYNC_VERSION #error cudaMalloc/FreeAsync needs CUDA 11.2 #endif #endif #if defined(HYPRE_USING_THRUST_NOSYNC) #if CUDA_VERSION < CUDA_THRUST_NOSYNC_VERSION #error thrust::cuda::par_nosync needs CUDA 12 #endif #define HYPRE_THRUST_EXECUTION thrust::cuda::par_nosync #else #define HYPRE_THRUST_EXECUTION thrust::cuda::par #endif #endif /* defined(HYPRE_USING_CUDA) */ /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - * hip includes * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ #if defined(HYPRE_USING_HIP) using hypre_DeviceItem = void*; #include #if defined(HYPRE_USING_ROCBLAS) #include #endif #if defined(HYPRE_USING_ROCSPARSE) #include #if !defined(ROCSPARSE_VERSION) #define ROCSPARSE_VERSION (ROCSPARSE_VERSION_MAJOR * 100000 + ROCSPARSE_VERSION_MINOR * 100 + ROCSPARSE_VERSION_PATCH) #endif #endif #if defined(HYPRE_USING_ROCSOLVER) #include #endif #if defined(HYPRE_USING_ROCRAND) #include #endif #endif /* defined(HYPRE_USING_HIP) */ /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - * thrust includes * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ #if defined(HYPRE_USING_CUDA) || defined(HYPRE_USING_HIP) #include #if defined(HYPRE_USING_CUDA) #include #elif defined(HYPRE_USING_HIP) #include #endif #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include /* VPM: this is needed to support cuda 10. not_fn is the correct replacement going forward. */ #define THRUST_VERSION_NOTFN 200700 #if (defined(THRUST_VERSION) && THRUST_VERSION < THRUST_VERSION_NOTFN) #define HYPRE_THRUST_NOT(pred) thrust::not1(pred) #else #define HYPRE_THRUST_NOT(pred) thrust::not_fn(pred) #endif using namespace thrust::placeholders; #endif /* defined(HYPRE_USING_CUDA) || defined(HYPRE_USING_HIP) */ /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - * sycl includes * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ #if defined(HYPRE_USING_SYCL) #include #include #if defined(HYPRE_USING_ONEMKLSPARSE) #include #endif #if defined(HYPRE_USING_ONEMKLBLAS) #include #include #endif #if defined(HYPRE_USING_ONEMKLRAND) #include #endif /* The following definitions facilitate code reuse and limits * if/def-ing when unifying cuda/hip code with sycl code */ using dim3 = sycl::range<3>; using hypre_DeviceItem = sycl::nd_item<3>; #define __global__ #define __host__ #define __device__ #define __forceinline__ __inline__ __attribute__((always_inline)) #endif /* defined(HYPRE_USING_SYCL) */ /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - * device defined values * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ #define HYPRE_MAX_NTHREADS_BLOCK 1024 // HYPRE_WARP_BITSHIFT is just log2 of HYPRE_WARP_SIZE #if defined(HYPRE_USING_CUDA) || defined(HYPRE_USING_SYCL) #define HYPRE_WARP_SIZE 32 #define HYPRE_WARP_BITSHIFT 5 #define HYPRE_WARP_FULL_MASK 0xFFFFFFFF #elif defined(HYPRE_USING_HIP) #define HYPRE_WARP_SIZE 64 #define HYPRE_WARP_BITSHIFT 6 #define HYPRE_WARP_FULL_MASK 0xFFFFFFFFFFFFFFF #endif #define HYPRE_MAX_NUM_WARPS (64 * 64 * 32) #define HYPRE_FLT_LARGE 1e30 #define HYPRE_1D_BLOCK_SIZE 512 #define HYPRE_MAX_NUM_STREAMS 10 #define HYPRE_SPGEMM_MAX_NBIN 10 /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - * macro for launching GPU kernels * NOTE: IN HYPRE'S DEFAULT STREAM * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ #if defined(HYPRE_DEBUG) #define GPU_LAUNCH_SYNC { hypre_SyncComputeStream(); hypre_GetDeviceLastError(); } #else #define GPU_LAUNCH_SYNC #endif /* cuda/hip version */ #if defined(HYPRE_USING_CUDA) || defined(HYPRE_USING_HIP) #define HYPRE_GPU_LAUNCH2(kernel_name, gridsize, blocksize, shmem_size, ...) \ { \ if ( gridsize.x == 0 || gridsize.y == 0 || gridsize.z == 0 || \ blocksize.x == 0 || blocksize.y == 0 || blocksize.z == 0 ) \ { \ /* printf("Warning %s %d: Zero CUDA grid/block (%d %d %d) (%d %d %d)\n", \ __FILE__, __LINE__, \ gridsize.x, gridsize.y, gridsize.z, blocksize.x, blocksize.y, blocksize.z); */ \ } \ else \ { \ hypre_DeviceItem item = NULL; \ (kernel_name) <<< (gridsize), (blocksize), shmem_size, hypre_HandleComputeStream(hypre_handle()) >>> (item, __VA_ARGS__); \ GPU_LAUNCH_SYNC; \ } \ } #define HYPRE_GPU_LAUNCH(kernel_name, gridsize, blocksize, ...) HYPRE_GPU_LAUNCH2(kernel_name, gridsize, blocksize, 0, __VA_ARGS__) #endif /* defined(HYPRE_USING_CUDA) || defined(HYPRE_USING_HIP) */ /* sycl version */ #if defined(HYPRE_USING_SYCL) #define HYPRE_GPU_LAUNCH(kernel_name, gridsize, blocksize, ...) \ { \ if ( gridsize[2] == 0 || blocksize[2] == 0 ) \ { \ /* hypre_printf("Warning %s %d: Zero SYCL 1D launch parameters grid/block (%d) (%d)\n", \ __FILE__, __LINE__, \ gridsize[0], blocksize[0]); */ \ } \ else \ { \ hypre_HandleComputeStream(hypre_handle())->submit([&] (sycl::handler& cgh) { \ cgh.parallel_for(sycl::nd_range<3>(gridsize*blocksize, blocksize), \ [=] (hypre_DeviceItem item) [[intel::reqd_sub_group_size(HYPRE_WARP_SIZE)]] \ { (kernel_name)(item, __VA_ARGS__); \ }); \ }).wait_and_throw(); \ } \ } #define HYPRE_CPU_LAUNCH(kernel_name, gridsize, blocksize, ...) \ { \ if ( gridsize[2] == 0 || blocksize[2] == 0 ) \ { \ /* hypre_printf("Warning %s %d: Zero SYCL 1D launch parameters grid/block (%d) (%d)\n", \ __FILE__, __LINE__, \ gridsize[0], blocksize[0]); */ \ } \ else \ { \ HPYRE_Int compute_stream = hypre_HandleComputeStreamNum(hypre_handle()); \ hypre_HandleComputeStreamNum(hypre_handle) = HYPRE_MAX_NUM_STREAMS - 1; \ hypre_HandleComputeStream(hypre_handle())->submit([&] (sycl::handler& cgh) { \ cgh.parallel_for(sycl::nd_range<3>(gridsize*blocksize, blocksize), \ [=] (hypre_DeviceItem item) [[intel::reqd_sub_group_size(HYPRE_WARP_SIZE)]] \ { (kernel_name)(item, __VA_ARGS__); \ }); \ }).wait_and_throw(); \ hypre_HandleComputeStreamNum(hypre_handle) = compute_stream; \ } \ } #define HYPRE_GPU_LAUNCH2(kernel_name, gridsize, blocksize, shmem_size, ...) \ { \ if ( gridsize[2] == 0 || blocksize[2] == 0 ) \ { \ /* hypre_printf("Warning %s %d: Zero SYCL 1D launch parameters grid/block (%d) (%d)\n", \ __FILE__, __LINE__, \ gridsize[0], blocksize[0]); */ \ } \ else \ { \ hypre_HandleComputeStream(hypre_handle())->submit([&] (sycl::handler& cgh) { \ sycl::range<1> shmem_range(shmem_size); \ sycl::local_accessor shmem_accessor(shmem_range, cgh); \ cgh.parallel_for(sycl::nd_range<3>(gridsize*blocksize, blocksize), \ [=] (hypre_DeviceItem item) [[intel::reqd_sub_group_size(HYPRE_WARP_SIZE)]] \ { (kernel_name)(item, \ shmem_accessor.get_multi_ptr(), __VA_ARGS__);\ }); \ }).wait_and_throw(); \ } \ } #define HYPRE_GPU_DEBUG_LAUNCH(kernel_name, gridsize, blocksize, ...) \ { \ if ( gridsize[2] == 0 || blocksize[2] == 0 ) \ { \ /* hypre_printf("Warning %s %d: Zero SYCL 1D launch parameters grid/block (%d) (%d)\n", \ __FILE__, __LINE__, \ gridsize[0], blocksize[0]); */ \ } \ else \ { \ hypre_HandleComputeStream(hypre_handle())->submit([&] (sycl::handler& cgh) { \ auto debug_stream = sycl::stream(4096, 1024, cgh); \ cgh.parallel_for(sycl::nd_range<3>(gridsize*blocksize, blocksize), \ [=] (hypre_DeviceItem item) [[intel::reqd_sub_group_size(HYPRE_WARP_SIZE)]] \ { (kernel_name)(item, debug_stream, __VA_ARGS__); \ }); \ }).wait_and_throw(); \ } \ } #define HYPRE_GPU_DEBUG_LAUNCH2(kernel_name, gridsize, blocksize, shmem_size, ...) \ { \ if ( gridsize[2] == 0 || blocksize[2] == 0 ) \ { \ /* hypre_printf("Warning %s %d: Zero SYCL 1D launch parameters grid/block (%d) (%d)\n", \ __FILE__, __LINE__, \ gridsize[0], blocksize[0]); */ \ } \ else \ { \ hypre_HandleComputeStream(hypre_handle())->submit([&] (sycl::handler& cgh) { \ auto debug_stream = sycl::stream(4096, 1024, cgh); \ sycl::range<1> shmem_range(shmem_size); \ sycl::accessor shmem_accessor(shmem_range, cgh); \ cgh.parallel_for(sycl::nd_range<3>(gridsize*blocksize, blocksize), \ [=] (hypre_DeviceItem item) [[intel::reqd_sub_group_size(HYPRE_WARP_SIZE)]] \ { (kernel_name)(item, debug_stream, \ shmem_accessor.get_multi_ptr(), __VA_ARGS__);\ }); \ }).wait_and_throw(); \ } \ } #endif /* defined(HYPRE_USING_SYCL) */ /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - * macros for wrapping cuda/hip/sycl calls for error reporting * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ #if defined(HYPRE_USING_CUDA) #define HYPRE_CUDA_CALL(call) do { \ cudaError_t err = call; \ if (cudaSuccess != err) { \ printf("CUDA ERROR (code = %d, %s) at %s:%d\n", err, cudaGetErrorString(err), \ __FILE__, __LINE__); \ hypre_assert(0); \ } } while(0) #elif defined(HYPRE_USING_HIP) #define HYPRE_HIP_CALL(call) do { \ hipError_t err = call; \ if (hipSuccess != err) { \ printf("HIP ERROR (code = %d, %s) at %s:%d\n", err, hipGetErrorString(err), \ __FILE__, __LINE__); \ hypre_assert(0); \ } } while(0) #elif defined(HYPRE_USING_SYCL) #define HYPRE_SYCL_CALL(call) \ try \ { \ call; \ } \ catch (sycl::exception const &ex) \ { \ hypre_printf("SYCL ERROR (code = %s) at %s:%d\n", ex.what(), \ __FILE__, __LINE__); \ assert(0); \ } \ catch(std::runtime_error const& ex) \ { \ hypre_printf("STD ERROR (code = %s) at %s:%d\n", ex.what(), \ __FILE__, __LINE__); \ assert(0); \ } #endif /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - * macros for wrapping vendor library calls for error reporting * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ #if defined(HYPRE_COMPLEX) /* Double Complex */ #error "GPU build does not support complex numbers!" #elif defined(HYPRE_SINGLE) /* Single */ #if defined(HYPRE_USING_CUDA) /* cuBLAS */ #define hypre_cublas_scal cublasSscal #define hypre_cublas_axpy cublasSaxpy #define hypre_cublas_dot cublasSdot #define hypre_cublas_gemv cublasSgemv #define hypre_cublas_getrfBatched cublasSgetrfBatched #define hypre_cublas_getriBatched cublasSgetriBatched /* cuSPARSE */ #define hypre_cusparse_csru2csr_bufferSizeExt cusparseScsru2csr_bufferSizeExt #define hypre_cusparse_csru2csr cusparseScsru2csr #define hypre_cusparse_csrsv2_bufferSize cusparseScsrsv2_bufferSize #define hypre_cusparse_csrsv2_analysis cusparseScsrsv2_analysis #define hypre_cusparse_csrsv2_solve cusparseScsrsv2_solve #define hypre_cusparse_csrmv cusparseScsrmv #define hypre_cusparse_csrgemm cusparseScsrgemm #define hypre_cusparse_csr2csc cusparseScsr2csc #define hypre_cusparse_csrilu02_bufferSize cusparseScsrilu02_bufferSize #define hypre_cusparse_csrilu02_analysis cusparseScsrilu02_analysis #define hypre_cusparse_csrilu02 cusparseScsrilu02 #define hypre_cusparse_csrsm2_bufferSizeExt cusparseScsrsm2_bufferSizeExt #define hypre_cusparse_csrsm2_analysis cusparseScsrsm2_analysis #define hypre_cusparse_csrsm2_solve cusparseScsrsm2_solve /* cuSOLVER */ #define hypre_cusolver_dngetrf cusolverDnSgetrf #define hypre_cusolver_dngetrf_bs cusolverDnSgetrf_bufferSize #define hypre_cusolver_dngetrs cusolverDnSgetrs #elif defined(HYPRE_USING_HIP) /* rocSPARSE */ #define hypre_rocsparse_csrsv_buffer_size rocsparse_scsrsv_buffer_size #define hypre_rocsparse_csrsv_analysis rocsparse_scsrsv_analysis #define hypre_rocsparse_csrsv_solve rocsparse_scsrsv_solve #define hypre_rocsparse_gthr rocsparse_sgthr #define hypre_rocsparse_csrmv_analysis rocsparse_scsrmv_analysis #define hypre_rocsparse_csrmv rocsparse_scsrmv #define hypre_rocsparse_csrgemm_buffer_size rocsparse_scsrgemm_buffer_size #define hypre_rocsparse_csrgemm rocsparse_scsrgemm #define hypre_rocsparse_csr2csc rocsparse_scsr2csc #define hypre_rocsparse_csrilu0_buffer_size rocsparse_scsrilu0_buffer_size #define hypre_rocsparse_csrilu0_analysis rocsparse_scsrilu0_analysis #define hypre_rocsparse_csrilu0 rocsparse_scsrilu0 #define hypre_rocsparse_csritilu0_compute rocsparse_scsritilu0_compute #define hypre_rocsparse_csritilu0_history rocsparse_scsritilu0_history /* rocSOLVER */ /************** * TODO (VPM) * **************/ #endif /* if defined(HYPRE_USING_CUDA) || defined(HYPRE_USING_HIP) */ #elif defined(HYPRE_LONG_DOUBLE) /* Long Double */ #error "GPU build does not support Long Double numbers!" #else /* Double */ #if defined(HYPRE_USING_CUDA) /* cuBLAS */ #define hypre_cublas_scal cublasDscal #define hypre_cublas_axpy cublasDaxpy #define hypre_cublas_dot cublasDdot #define hypre_cublas_gemv cublasDgemv #define hypre_cublas_getrfBatched cublasDgetrfBatched #define hypre_cublas_getriBatched cublasDgetriBatched /* cuSPARSE */ #define hypre_cusparse_csru2csr_bufferSizeExt cusparseDcsru2csr_bufferSizeExt #define hypre_cusparse_csru2csr cusparseDcsru2csr #define hypre_cusparse_csrsv2_bufferSize cusparseDcsrsv2_bufferSize #define hypre_cusparse_csrsv2_analysis cusparseDcsrsv2_analysis #define hypre_cusparse_csrsv2_solve cusparseDcsrsv2_solve #define hypre_cusparse_csrmv cusparseDcsrmv #define hypre_cusparse_csrgemm cusparseDcsrgemm #define hypre_cusparse_csr2csc cusparseDcsr2csc #define hypre_cusparse_csrilu02_bufferSize cusparseDcsrilu02_bufferSize #define hypre_cusparse_csrilu02_analysis cusparseDcsrilu02_analysis #define hypre_cusparse_csrilu02 cusparseDcsrilu02 #define hypre_cusparse_csrsm2_bufferSizeExt cusparseDcsrsm2_bufferSizeExt #define hypre_cusparse_csrsm2_analysis cusparseDcsrsm2_analysis #define hypre_cusparse_csrsm2_solve cusparseDcsrsm2_solve /* cuSOLVER */ #define hypre_cusolver_dngetrf cusolverDnDgetrf #define hypre_cusolver_dngetrf_bs cusolverDnDgetrf_bufferSize #define hypre_cusolver_dngetrs cusolverDnDgetrs #elif defined(HYPRE_USING_HIP) /* rocSPARSE */ #define hypre_rocsparse_csrsv_buffer_size rocsparse_dcsrsv_buffer_size #define hypre_rocsparse_csrsv_analysis rocsparse_dcsrsv_analysis #define hypre_rocsparse_csrsv_solve rocsparse_dcsrsv_solve #define hypre_rocsparse_gthr rocsparse_dgthr #define hypre_rocsparse_csrmv_analysis rocsparse_dcsrmv_analysis #define hypre_rocsparse_csrmv rocsparse_dcsrmv #define hypre_rocsparse_csrgemm_buffer_size rocsparse_dcsrgemm_buffer_size #define hypre_rocsparse_csrgemm rocsparse_dcsrgemm #define hypre_rocsparse_csr2csc rocsparse_dcsr2csc #define hypre_rocsparse_csrilu0_buffer_size rocsparse_dcsrilu0_buffer_size #define hypre_rocsparse_csrilu0_analysis rocsparse_dcsrilu0_analysis #define hypre_rocsparse_csrilu0 rocsparse_dcsrilu0 #define hypre_rocsparse_csritilu0_compute rocsparse_dcsritilu0_compute #define hypre_rocsparse_csritilu0_history rocsparse_dcsritilu0_history /* rocSOLVER */ /************** * TODO (VPM) * **************/ #endif /* #if defined(HYPRE_USING_CUDA) || defined(HYPRE_USING_HIP)*/ #endif /* #if defined(HYPRE_COMPLEX) || defined(HYPRE_SINGLE) || defined(HYPRE_LONG_DOUBLE) */ #define HYPRE_CUBLAS_CALL(call) do { \ cublasStatus_t err = call; \ if (CUBLAS_STATUS_SUCCESS != err) { \ printf("CUBLAS ERROR (code = %d, %d) at %s:%d\n", \ err, err == CUBLAS_STATUS_EXECUTION_FAILED, __FILE__, __LINE__); \ hypre_assert(0); exit(1); \ } } while(0) #define HYPRE_ROCBLAS_CALL(call) do { \ rocblas_status err = call; \ if (rocblas_status_success != err) { \ printf("rocBLAS ERROR (code = %d, %s) at %s:%d\n", \ err, rocblas_status_to_string(err), __FILE__, __LINE__); \ hypre_assert(0); exit(1); \ } } while(0) #if CUSPARSE_VERSION >= 10300 #define HYPRE_CUSPARSE_CALL(call) do { \ cusparseStatus_t err = call; \ if (CUSPARSE_STATUS_SUCCESS != err) { \ printf("CUSPARSE ERROR (code = %d, %s) at %s:%d\n", \ err, cusparseGetErrorString(err), __FILE__, __LINE__); \ hypre_assert(0); exit(1); \ } } while(0) #else #define HYPRE_CUSPARSE_CALL(call) do { \ cusparseStatus_t err = call; \ if (CUSPARSE_STATUS_SUCCESS != err) { \ printf("CUSPARSE ERROR (code = %d) at %s:%d\n", \ err, __FILE__, __LINE__); \ hypre_assert(0); exit(1); \ } } while(0) #endif #define HYPRE_ROCSPARSE_CALL(call) do { \ rocsparse_status err = call; \ if (rocsparse_status_success != err) { \ printf("rocSPARSE ERROR (code = %d) at %s:%d\n", \ err, __FILE__, __LINE__); \ assert(0); exit(1); \ } } while(0) #define HYPRE_CUSOLVER_CALL(call) do { \ cusolverStatus_t err = call; \ if (CUSOLVER_STATUS_SUCCESS != err) { \ printf("cuSOLVER ERROR (code = %d) at %s:%d\n", \ err, __FILE__, __LINE__); \ hypre_assert(0); \ } } while(0) #define HYPRE_ROCSOLVER_CALL(call) do { \ rocblas_status err = call; \ if (rocblas_status_success != err) { \ printf("rocSOLVER ERROR (code = %d, %s) at %s:%d\n", \ err, rocblas_status_to_string(err), __FILE__, __LINE__); \ } } while(0) #define HYPRE_CURAND_CALL(call) do { \ curandStatus_t err = call; \ if (CURAND_STATUS_SUCCESS != err) { \ printf("CURAND ERROR (code = %d) at %s:%d\n", err, __FILE__, __LINE__); \ hypre_assert(0); exit(1); \ } } while(0) #define HYPRE_ROCRAND_CALL(call) do { \ rocrand_status err = call; \ if (ROCRAND_STATUS_SUCCESS != err) { \ printf("ROCRAND ERROR (code = %d) at %s:%d\n", err, __FILE__, __LINE__); \ hypre_assert(0); exit(1); \ } } while(0) #define HYPRE_ONEMKL_CALL(call) \ try \ { \ call; \ } \ catch (oneapi::mkl::exception const &ex) \ { \ hypre_printf("ONEMKL ERROR (code = %s) at %s:%d\n", ex.what(), \ __FILE__, __LINE__); \ assert(0); exit(1); \ } /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - * macros for wrapping thrust/oneDPL calls for error reporting * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ /* RL: TODO Want macro HYPRE_THRUST_CALL to return value but I don't know how to do it right * The following one works OK for now */ #if defined(HYPRE_USING_CUDA) #define HYPRE_THRUST_CALL(func_name, ...) \ thrust::func_name(HYPRE_THRUST_EXECUTION(hypre_HandleDeviceAllocator(hypre_handle())).on(hypre_HandleComputeStream(hypre_handle())), __VA_ARGS__); #elif defined(HYPRE_USING_HIP) #define HYPRE_THRUST_CALL(func_name, ...) \ thrust::func_name(thrust::hip::par(hypre_HandleDeviceAllocator(hypre_handle())).on(hypre_HandleComputeStream(hypre_handle())), __VA_ARGS__); #elif defined(HYPRE_USING_SYCL) #define HYPRE_ONEDPL_CALL(func_name, ...) \ func_name(oneapi::dpl::execution::make_device_policy( \ *hypre_HandleComputeStream(hypre_handle())), __VA_ARGS__); #define HYPRE_ONEDPL_CPU_CALL(func_name, ...) \ func_name(oneapi::dpl::execution::make_device_policy( \ *hypre_DeviceDataStream(hypre_HandleDeviceData(hypre_handle()), HYPRE_MAX_NUM_STREAMS - 1)), __VA_ARGS__); #endif /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - * device info data structures * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ struct hypre_cub_CachingDeviceAllocator; typedef struct hypre_cub_CachingDeviceAllocator hypre_cub_CachingDeviceAllocator; #if defined(HYPRE_USING_CUSOLVER) typedef cusolverDnHandle_t vendorSolverHandle_t; #elif defined(HYPRE_USING_ROCSOLVER) typedef rocblas_handle vendorSolverHandle_t; #endif struct hypre_DeviceData { #if defined(HYPRE_USING_CURAND) curandGenerator_t curand_generator; #endif #if defined(HYPRE_USING_ROCRAND) rocrand_generator curand_generator; #endif #if defined(HYPRE_USING_CUBLAS) cublasHandle_t cublas_handle; #endif #if defined(HYPRE_USING_CUSPARSE) cusparseHandle_t cusparse_handle; #endif #if defined(HYPRE_USING_ROCSPARSE) rocsparse_handle cusparse_handle; #endif #if defined(HYPRE_USING_CUSOLVER) || defined(HYPRE_USING_ROCSOLVER) vendorSolverHandle_t vendor_solver_handle; #endif /* TODO (VPM): Change to HYPRE_USING_GPU_STREAMS*/ #if defined(HYPRE_USING_CUDA_STREAMS) #if defined(HYPRE_USING_CUDA) cudaStream_t streams[HYPRE_MAX_NUM_STREAMS]; #elif defined(HYPRE_USING_HIP) hipStream_t streams[HYPRE_MAX_NUM_STREAMS]; #elif defined(HYPRE_USING_SYCL) sycl::queue* streams[HYPRE_MAX_NUM_STREAMS] = {NULL}; #endif #endif #if defined(HYPRE_USING_DEVICE_POOL) hypre_uint cub_bin_growth; hypre_uint cub_min_bin; hypre_uint cub_max_bin; size_t cub_max_cached_bytes; hypre_cub_CachingDeviceAllocator *cub_dev_allocator; hypre_cub_CachingDeviceAllocator *cub_uvm_allocator; #endif #if defined(HYPRE_USING_CUDA) || defined(HYPRE_USING_HIP) hypre_device_allocator device_allocator; #endif #if defined(HYPRE_USING_SYCL) sycl::device *device; HYPRE_Int device_max_work_group_size; #else HYPRE_Int device; #endif hypre_int device_max_shmem_per_block[3]; /* by default, hypre puts GPU computations in this stream * Do not be confused with the default (null) stream */ HYPRE_Int compute_stream_num; /* work space for hypre's device reducer */ void *reduce_buffer; /* device spgemm options */ HYPRE_Int spgemm_algorithm; HYPRE_Int spgemm_binned; HYPRE_Int spgemm_num_bin; /* the highest bins for symbl [0] and numer [1] * which are not necessary to be `spgemm_num_bin' due to shmem limit on GPUs */ HYPRE_Int spgemm_highest_bin[2]; /* for bin i: ([0][i], [2][i]) = (max #block to launch, block dimension) for symbl * ([1][i], [3][i]) = (max #block to launch, block dimension) for numer */ HYPRE_Int spgemm_block_num_dim[4][HYPRE_SPGEMM_MAX_NBIN + 1]; HYPRE_Int spgemm_rownnz_estimate_method; HYPRE_Int spgemm_rownnz_estimate_nsamples; float spgemm_rownnz_estimate_mult_factor; /* cusparse */ HYPRE_Int spmv_use_vendor; HYPRE_Int sptrans_use_vendor; HYPRE_Int spgemm_use_vendor; /* PMIS RNG */ HYPRE_Int use_gpu_rand; }; #define hypre_DeviceDataCubBinGrowth(data) ((data) -> cub_bin_growth) #define hypre_DeviceDataCubMinBin(data) ((data) -> cub_min_bin) #define hypre_DeviceDataCubMaxBin(data) ((data) -> cub_max_bin) #define hypre_DeviceDataCubMaxCachedBytes(data) ((data) -> cub_max_cached_bytes) #define hypre_DeviceDataCubDevAllocator(data) ((data) -> cub_dev_allocator) #define hypre_DeviceDataCubUvmAllocator(data) ((data) -> cub_uvm_allocator) #define hypre_DeviceDataDevice(data) ((data) -> device) #define hypre_DeviceDataDeviceMaxWorkGroupSize(data) ((data) -> device_max_work_group_size) #define hypre_DeviceDataDeviceMaxShmemPerBlock(data) ((data) -> device_max_shmem_per_block) #define hypre_DeviceDataDeviceMaxShmemPerBlockInited(data) (((data) -> device_max_shmem_per_block)[2]) #define hypre_DeviceDataComputeStreamNum(data) ((data) -> compute_stream_num) #define hypre_DeviceDataReduceBuffer(data) ((data) -> reduce_buffer) #define hypre_DeviceDataSpgemmUseVendor(data) ((data) -> spgemm_use_vendor) #define hypre_DeviceDataSpMVUseVendor(data) ((data) -> spmv_use_vendor) #define hypre_DeviceDataSpTransUseVendor(data) ((data) -> sptrans_use_vendor) #define hypre_DeviceDataSpgemmAlgorithm(data) ((data) -> spgemm_algorithm) #define hypre_DeviceDataSpgemmBinned(data) ((data) -> spgemm_binned) #define hypre_DeviceDataSpgemmNumBin(data) ((data) -> spgemm_num_bin) #define hypre_DeviceDataSpgemmHighestBin(data) ((data) -> spgemm_highest_bin) #define hypre_DeviceDataSpgemmBlockNumDim(data) ((data) -> spgemm_block_num_dim) #define hypre_DeviceDataSpgemmRownnzEstimateMethod(data) ((data) -> spgemm_rownnz_estimate_method) #define hypre_DeviceDataSpgemmRownnzEstimateNsamples(data) ((data) -> spgemm_rownnz_estimate_nsamples) #define hypre_DeviceDataSpgemmRownnzEstimateMultFactor(data) ((data) -> spgemm_rownnz_estimate_mult_factor) #define hypre_DeviceDataDeviceAllocator(data) ((data) -> device_allocator) #define hypre_DeviceDataUseGpuRand(data) ((data) -> use_gpu_rand) hypre_DeviceData* hypre_DeviceDataCreate(); void hypre_DeviceDataDestroy(hypre_DeviceData* data); #if defined(HYPRE_USING_CURAND) curandGenerator_t hypre_DeviceDataCurandGenerator(hypre_DeviceData *data); #endif #if defined(HYPRE_USING_ROCRAND) rocrand_generator hypre_DeviceDataCurandGenerator(hypre_DeviceData *data); #endif #if defined(HYPRE_USING_CUBLAS) cublasHandle_t hypre_DeviceDataCublasHandle(hypre_DeviceData *data); #endif #if defined(HYPRE_USING_CUSPARSE) cusparseHandle_t hypre_DeviceDataCusparseHandle(hypre_DeviceData *data); #endif #if defined(HYPRE_USING_ROCSPARSE) rocsparse_handle hypre_DeviceDataCusparseHandle(hypre_DeviceData *data); #endif #if defined(HYPRE_USING_CUSOLVER) || defined(HYPRE_USING_ROCSOLVER) vendorSolverHandle_t hypre_DeviceDataVendorSolverHandle(hypre_DeviceData *data); #endif /* TODO (VPM): Create a deviceStream_t to encapsulate all stream types below */ #if defined(HYPRE_USING_CUDA) cudaStream_t hypre_DeviceDataStream(hypre_DeviceData *data, HYPRE_Int i); cudaStream_t hypre_DeviceDataComputeStream(hypre_DeviceData *data); #elif defined(HYPRE_USING_HIP) hipStream_t hypre_DeviceDataStream(hypre_DeviceData *data, HYPRE_Int i); hipStream_t hypre_DeviceDataComputeStream(hypre_DeviceData *data); #elif defined(HYPRE_USING_SYCL) sycl::queue* hypre_DeviceDataStream(hypre_DeviceData *data, HYPRE_Int i); sycl::queue* hypre_DeviceDataComputeStream(hypre_DeviceData *data); #endif /* Data structure and accessor routines for Sparse Triangular Matrices */ struct hypre_CsrsvData { #if defined(HYPRE_USING_CUSPARSE) hypre_cusparseSpSVDescr info_L; hypre_cusparseSpSVDescr info_U; cusparseSolvePolicy_t analysis_policy; cusparseSolvePolicy_t solve_policy; #elif defined(HYPRE_USING_ROCSPARSE) rocsparse_mat_info info_L; rocsparse_mat_info info_U; rocsparse_analysis_policy analysis_policy; rocsparse_solve_policy solve_policy; #endif #if defined(HYPRE_USING_CUSPARSE) && (CUSPARSE_VERSION >= CUSPARSE_SPSV_VERSION) size_t buffer_size_L; size_t buffer_size_U; char *buffer_L; char *buffer_U; #else hypre_int buffer_size; char *buffer; #endif /* Temporary array to save matrix values with modified diagonal */ HYPRE_Complex *mat_data; /* Flags for checking whether the analysis phase has been executed or not */ HYPRE_Int analyzed_L; HYPRE_Int analyzed_U; }; #define hypre_CsrsvDataInfoL(data) ((data) -> info_L) #define hypre_CsrsvDataInfoU(data) ((data) -> info_U) #define hypre_CsrsvDataAnalyzedL(data) ((data) -> analyzed_L) #define hypre_CsrsvDataAnalyzedU(data) ((data) -> analyzed_U) #define hypre_CsrsvDataSolvePolicy(data) ((data) -> solve_policy) #define hypre_CsrsvDataAnalysisPolicy(data) ((data) -> analysis_policy) #if defined(HYPRE_USING_CUSPARSE) && (CUSPARSE_VERSION >= CUSPARSE_SPSV_VERSION) #define hypre_CsrsvDataBufferSizeL(data) ((data) -> buffer_size_L) #define hypre_CsrsvDataBufferSizeU(data) ((data) -> buffer_size_U) #define hypre_CsrsvDataBufferL(data) ((data) -> buffer_L) #define hypre_CsrsvDataBufferU(data) ((data) -> buffer_U) #else #define hypre_CsrsvDataBufferSize(data) ((data) -> buffer_size) #define hypre_CsrsvDataBuffer(data) ((data) -> buffer) #endif #define hypre_CsrsvDataMatData(data) ((data) -> mat_data) struct hypre_GpuMatData { #if defined(HYPRE_USING_CUSPARSE) cusparseMatDescr_t mat_descr; char *spmv_buffer; #elif defined(HYPRE_USING_ROCSPARSE) rocsparse_mat_descr mat_descr; rocsparse_mat_info mat_info; #elif defined(HYPRE_USING_ONEMKLSPARSE) oneapi::mkl::sparse::matrix_handle_t mat_handle; #endif }; #define hypre_GpuMatDataMatDescr(data) ((data) -> mat_descr) #define hypre_GpuMatDataMatInfo(data) ((data) -> mat_info) #define hypre_GpuMatDataMatHandle(data) ((data) -> mat_handle) #define hypre_GpuMatDataSpMVBuffer(data) ((data) -> spmv_buffer) #endif /* if defined(HYPRE_USING_GPU) */ /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - * generic device functions (cuda/hip/sycl) * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ #if defined(HYPRE_USING_GPU) template static __device__ __forceinline__ T read_only_load( const T *ptr ) { #if defined(__CUDA_ARCH__) && __CUDA_ARCH__ >= 350 return __ldg( ptr ); #else return *ptr; #endif } static __device__ __forceinline__ hypre_int next_power_of_2(hypre_int n) { if (n <= 0) { return 0; } /* if n is power of 2, return itself */ if ( (n & (n - 1)) == 0 ) { return n; } n |= (n >> 1); n |= (n >> 2); n |= (n >> 4); n |= (n >> 8); n |= (n >> 16); n ^= (n >> 1); n = (n << 1); return n; } /* Flip n-th bit of bitmask (0 becomes 1. 1 becomes 0) */ static __device__ __forceinline__ hypre_mask hypre_mask_flip_at(hypre_mask bitmask, hypre_int n) { return bitmask ^ (hypre_mask_one << n); } #endif // defined(HYPRE_USING_GPU) /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - * cuda/hip functions * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ #if defined(HYPRE_USING_CUDA) || defined(HYPRE_USING_HIP) /* return the number of threads in block */ template static __device__ __forceinline__ hypre_int hypre_gpu_get_num_threads(hypre_DeviceItem &item) { switch (dim) { case 1: return (blockDim.x); case 2: return (blockDim.x * blockDim.y); case 3: return (blockDim.x * blockDim.y * blockDim.z); } return -1; } /* return the flattened thread id in block */ template static __device__ __forceinline__ hypre_int hypre_gpu_get_thread_id(hypre_DeviceItem &item) { switch (dim) { case 1: return (threadIdx.x); case 2: return (threadIdx.y * blockDim.x + threadIdx.x); case 3: return (threadIdx.z * blockDim.x * blockDim.y + threadIdx.y * blockDim.x + threadIdx.x); } return -1; } /* return the number of warps in block */ template static __device__ __forceinline__ hypre_int hypre_gpu_get_num_warps(hypre_DeviceItem &item) { return hypre_gpu_get_num_threads(item) >> HYPRE_WARP_BITSHIFT; } /* return the warp id in block */ template static __device__ __forceinline__ hypre_int hypre_gpu_get_warp_id(hypre_DeviceItem &item) { return hypre_gpu_get_thread_id(item) >> HYPRE_WARP_BITSHIFT; } /* return the thread lane id in warp */ template static __device__ __forceinline__ hypre_int hypre_gpu_get_lane_id(hypre_DeviceItem &item) { return hypre_gpu_get_thread_id(item) & (HYPRE_WARP_SIZE - 1); } /* return the num of blocks in grid */ template static __device__ __forceinline__ hypre_int hypre_gpu_get_num_blocks() { switch (dim) { case 1: return (gridDim.x); case 2: return (gridDim.x * gridDim.y); case 3: return (gridDim.x * gridDim.y * gridDim.z); } return -1; } /* return the flattened block id in grid */ template static __device__ __forceinline__ hypre_int hypre_gpu_get_block_id(hypre_DeviceItem &item) { switch (dim) { case 1: return (blockIdx.x); case 2: return (blockIdx.y * gridDim.x + blockIdx.x); case 3: return (blockIdx.z * gridDim.x * gridDim.y + blockIdx.y * gridDim.x + blockIdx.x); } return -1; } /* return the number of threads in grid */ template static __device__ __forceinline__ hypre_int hypre_gpu_get_grid_num_threads(hypre_DeviceItem &item) { return hypre_gpu_get_num_blocks() * hypre_gpu_get_num_threads(item); } /* return the flattened thread id in grid */ template static __device__ __forceinline__ hypre_int hypre_gpu_get_grid_thread_id(hypre_DeviceItem &item) { return hypre_gpu_get_block_id(item) * hypre_gpu_get_num_threads(item) + hypre_gpu_get_thread_id(item); } /* return the number of warps in grid */ template static __device__ __forceinline__ hypre_int hypre_gpu_get_grid_num_warps(hypre_DeviceItem &item) { return hypre_gpu_get_num_blocks() * hypre_gpu_get_num_warps(item); } /* return the flattened warp id in grid */ template static __device__ __forceinline__ hypre_int hypre_gpu_get_grid_warp_id(hypre_DeviceItem &item) { return hypre_gpu_get_block_id(item) * hypre_gpu_get_num_warps(item) + hypre_gpu_get_warp_id(item); } #if defined(__CUDA_ARCH__) && __CUDA_ARCH__ < 600 static __device__ __forceinline__ hypre_double atomicAdd(hypre_double* address, hypre_double val) { hypre_ulonglongint* address_as_ull = (hypre_ulonglongint*) address; hypre_ulonglongint old = *address_as_ull, assumed; do { assumed = old; old = atomicCAS(address_as_ull, assumed, __double_as_longlong(val + __longlong_as_double(assumed))); // Note: uses integer comparison to avoid hang in case of NaN (since NaN != NaN) } while (assumed != old); return __longlong_as_double(old); } #endif // There are no *_sync functions in HIP #if defined(HYPRE_USING_HIP) || (CUDA_VERSION < 9000) template static __device__ __forceinline__ T __shfl_sync(hypre_mask mask, T val, hypre_int src_line, hypre_int width = HYPRE_WARP_SIZE) { return __shfl(val, src_line, width); } template static __device__ __forceinline__ T __shfl_up_sync(hypre_mask mask, T val, hypre_uint delta, hypre_int width = HYPRE_WARP_SIZE) { return __shfl_up(val, delta, width); } template static __device__ __forceinline__ T __shfl_down_sync(hypre_mask mask, T val, hypre_uint delta, hypre_int width = HYPRE_WARP_SIZE) { return __shfl_down(val, delta, width); } template static __device__ __forceinline__ T __shfl_xor_sync(hypre_mask mask, T val, hypre_int lanemask, hypre_int width = HYPRE_WARP_SIZE) { return __shfl_xor(val, lanemask, width); } static __device__ __forceinline__ void __syncwarp() { } #endif // #if defined(HYPRE_USING_HIP) || (CUDA_VERSION < 9000) static __device__ __forceinline__ hypre_mask hypre_ballot_sync(hypre_DeviceItem &item, hypre_mask mask, hypre_int predicate) { #if defined(HYPRE_USING_CUDA) return __ballot_sync(mask, predicate); #else return __ballot(predicate); #endif } static __device__ __forceinline__ HYPRE_Int hypre_popc(hypre_mask mask) { #if defined(HYPRE_USING_CUDA) return (HYPRE_Int) __popc(mask); #else return (HYPRE_Int) __popcll(mask); #endif } static __device__ __forceinline__ HYPRE_Int hypre_ffs(hypre_mask mask) { #if defined(HYPRE_USING_CUDA) return (HYPRE_Int) __ffs(mask); #else return (HYPRE_Int) __ffsll(mask); #endif } #if defined(HYPRE_USING_HIP) static __device__ __forceinline__ hypre_int __any_sync(unsigned mask, hypre_int predicate) { return __any(predicate); } #endif /* sync the thread block */ static __device__ __forceinline__ void block_sync(hypre_DeviceItem &item) { __syncthreads(); } /* sync the warp */ static __device__ __forceinline__ void warp_sync(hypre_DeviceItem &item) { __syncwarp(); } /* exclusive prefix scan */ template static __device__ __forceinline__ T warp_prefix_sum(hypre_DeviceItem &item, hypre_int lane_id, T in, T &all_sum) { #pragma unroll for (hypre_int d = 2; d <= HYPRE_WARP_SIZE; d <<= 1) { T t = __shfl_up_sync(HYPRE_WARP_FULL_MASK, in, d >> 1); if ( (lane_id & (d - 1)) == (d - 1) ) { in += t; } } all_sum = __shfl_sync(HYPRE_WARP_FULL_MASK, in, HYPRE_WARP_SIZE - 1); if (lane_id == HYPRE_WARP_SIZE - 1) { in = 0; } #pragma unroll for (hypre_int d = HYPRE_WARP_SIZE >> 1; d > 0; d >>= 1) { T t = __shfl_xor_sync(HYPRE_WARP_FULL_MASK, in, d); if ( (lane_id & (d - 1)) == (d - 1)) { if ( (lane_id & ((d << 1) - 1)) == ((d << 1) - 1) ) { in += t; } else { in = t; } } } return in; } static __device__ __forceinline__ hypre_int warp_any_sync(hypre_DeviceItem &item, hypre_mask mask, hypre_int predicate) { return __any_sync(mask, predicate); } template static __device__ __forceinline__ T warp_shuffle_sync(hypre_DeviceItem &item, hypre_mask mask, T val, hypre_int src_line, hypre_int width = HYPRE_WARP_SIZE) { return __shfl_sync(mask, val, src_line, width); } template static __device__ __forceinline__ T warp_shuffle_up_sync(hypre_DeviceItem &item, hypre_mask mask, T val, hypre_uint delta, hypre_int width = HYPRE_WARP_SIZE) { return __shfl_up_sync(mask, val, delta, width); } template static __device__ __forceinline__ T warp_shuffle_down_sync(hypre_DeviceItem &item, hypre_mask mask, T val, hypre_uint delta, hypre_int width = HYPRE_WARP_SIZE) { return __shfl_down_sync(mask, val, delta, width); } template static __device__ __forceinline__ T warp_shuffle_xor_sync(hypre_DeviceItem &item, hypre_mask mask, T val, hypre_int lane_mask, hypre_int width = HYPRE_WARP_SIZE) { return __shfl_xor_sync(mask, val, lane_mask, width); } template static __device__ __forceinline__ T warp_reduce_sum(hypre_DeviceItem &item, T in) { #pragma unroll for (hypre_int d = HYPRE_WARP_SIZE >> 1; d > 0; d >>= 1) { in += __shfl_down_sync(HYPRE_WARP_FULL_MASK, in, d); } return in; } template static __device__ __forceinline__ T warp_allreduce_sum(hypre_DeviceItem &item, T in) { #pragma unroll for (hypre_int d = HYPRE_WARP_SIZE >> 1; d > 0; d >>= 1) { in += __shfl_xor_sync(HYPRE_WARP_FULL_MASK, in, d); } return in; } template static __device__ __forceinline__ T warp_reduce_max(hypre_DeviceItem &item, T in) { #pragma unroll for (hypre_int d = HYPRE_WARP_SIZE >> 1; d > 0; d >>= 1) { in = max(in, __shfl_down_sync(HYPRE_WARP_FULL_MASK, in, d)); } return in; } template static __device__ __forceinline__ T warp_allreduce_max(hypre_DeviceItem &item, T in) { #pragma unroll for (hypre_int d = HYPRE_WARP_SIZE >> 1; d > 0; d >>= 1) { in = max(in, __shfl_xor_sync(HYPRE_WARP_FULL_MASK, in, d)); } return in; } template static __device__ __forceinline__ T warp_reduce_min(hypre_DeviceItem &item, T in) { #pragma unroll for (hypre_int d = HYPRE_WARP_SIZE >> 1; d > 0; d >>= 1) { in = min(in, __shfl_down_sync(HYPRE_WARP_FULL_MASK, in, d)); } return in; } template static __device__ __forceinline__ T warp_allreduce_min(hypre_DeviceItem &item, T in) { #pragma unroll for (hypre_int d = HYPRE_WARP_SIZE >> 1; d > 0; d >>= 1) { in = min(in, __shfl_xor_sync(HYPRE_WARP_FULL_MASK, in, d)); } return in; } template #if (defined(THRUST_VERSION) && THRUST_VERSION < THRUST_VERSION_NOTFN) struct type_cast : public thrust::unary_function #else struct type_cast #endif { __host__ __device__ T2 operator()(const T1 &x) const { return (T2) x; } }; template #if (defined(THRUST_VERSION) && THRUST_VERSION < THRUST_VERSION_NOTFN) struct absolute_value : public thrust::unary_function #else struct absolute_value #endif { __host__ __device__ T operator()(const T &x) const { return x < T(0) ? -x : x; } }; template struct TupleComp2 { typedef thrust::tuple Tuple; __host__ __device__ bool operator()(const Tuple& t1, const Tuple& t2) { if (thrust::get<0>(t1) < thrust::get<0>(t2)) { return true; } if (thrust::get<0>(t1) > thrust::get<0>(t2)) { return false; } return hypre_abs(thrust::get<1>(t1)) > hypre_abs(thrust::get<1>(t2)); } }; template struct TupleComp3 { typedef thrust::tuple Tuple; __host__ __device__ bool operator()(const Tuple& t1, const Tuple& t2) { if (thrust::get<0>(t1) < thrust::get<0>(t2)) { return true; } if (thrust::get<0>(t1) > thrust::get<0>(t2)) { return false; } if (thrust::get<0>(t2) == thrust::get<1>(t2)) { return false; } return thrust::get<0>(t1) == thrust::get<1>(t1) || thrust::get<1>(t1) < thrust::get<1>(t2); } }; template #if (defined(THRUST_VERSION) && THRUST_VERSION < THRUST_VERSION_NOTFN) struct is_negative : public thrust::unary_function #else struct is_negative #endif { __host__ __device__ bool operator()(const T &x) { return (x < 0); } }; template #if (defined(THRUST_VERSION) && THRUST_VERSION < THRUST_VERSION_NOTFN) struct is_positive : public thrust::unary_function #else struct is_positive #endif { __host__ __device__ bool operator()(const T &x) { return (x > 0); } }; template #if (defined(THRUST_VERSION) && THRUST_VERSION < THRUST_VERSION_NOTFN) struct is_nonnegative : public thrust::unary_function #else struct is_nonnegative #endif { __host__ __device__ bool operator()(const T &x) { return (x >= 0); } }; template #if (defined(THRUST_VERSION) && THRUST_VERSION < THRUST_VERSION_NOTFN) struct in_range : public thrust::unary_function #else struct in_range #endif { T low, up; in_range(T low_, T up_) { low = low_; up = up_; } __host__ __device__ bool operator()(const T &x) { return (x >= low && x <= up); } }; template #if (defined(THRUST_VERSION) && THRUST_VERSION < THRUST_VERSION_NOTFN) struct out_of_range : public thrust::unary_function #else struct out_of_range #endif { T low, up; out_of_range(T low_, T up_) { low = low_; up = up_; } __host__ __device__ bool operator()(const T &x) { return (x < low || x > up); } }; template #if (defined(THRUST_VERSION) && THRUST_VERSION < THRUST_VERSION_NOTFN) struct less_than : public thrust::unary_function #else struct less_than #endif { T val; less_than(T val_) { val = val_; } __host__ __device__ bool operator()(const T &x) { return (x < val); } }; template #if (defined(THRUST_VERSION) && THRUST_VERSION < THRUST_VERSION_NOTFN) struct modulo : public thrust::unary_function #else struct modulo #endif { T val; modulo(T val_) { val = val_; } __host__ __device__ T operator()(const T &x) { return (x % val); } }; template #if (defined(THRUST_VERSION) && THRUST_VERSION < THRUST_VERSION_NOTFN) struct equal : public thrust::unary_function #else struct equal #endif { T val; equal(T val_) { val = val_; } __host__ __device__ bool operator()(const T &x) { return (x == val); } }; struct print_functor { __host__ __device__ void operator()(HYPRE_Real val) { printf("%f\n", val); } }; #endif // defined(HYPRE_USING_CUDA) || defined(HYPRE_USING_HIP) /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - * sycl functions * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ #if defined(HYPRE_USING_SYCL) /* return the number of threads in block */ template static __device__ __forceinline__ hypre_int hypre_gpu_get_num_threads(hypre_DeviceItem &item) { return static_cast(item.get_local_range().size()); } /* return the flattened thread id in block */ template static __device__ __forceinline__ hypre_int hypre_gpu_get_thread_id(hypre_DeviceItem &item) { return static_cast(item.get_local_linear_id()); } /* return the number of warps in block */ template static __device__ __forceinline__ hypre_int hypre_gpu_get_num_warps(hypre_DeviceItem &item) { return hypre_gpu_get_num_threads(item) >> HYPRE_WARP_BITSHIFT; } /* return the warp id in block */ template static __device__ __forceinline__ hypre_int hypre_gpu_get_warp_id(hypre_DeviceItem &item) { return hypre_gpu_get_thread_id(item) >> HYPRE_WARP_BITSHIFT; } /* return the thread lane id in warp */ template static __device__ __forceinline__ hypre_int hypre_gpu_get_lane_id(hypre_DeviceItem &item) { return static_cast(item.get_sub_group().get_local_linear_id()); } /* return the num of blocks in grid */ template static __device__ __forceinline__ hypre_int hypre_gpu_get_num_blocks(hypre_DeviceItem &item) { return static_cast(item.get_group_range().size()); } /* return the flattened block id in grid */ template static __device__ __forceinline__ hypre_int hypre_gpu_get_block_id(hypre_DeviceItem &item) { return item.get_group_linear_id(); } /* return the number of threads in grid */ template static __device__ __forceinline__ hypre_int hypre_gpu_get_grid_num_threads(hypre_DeviceItem &item) { return hypre_gpu_get_num_blocks(item) * hypre_gpu_get_num_threads(item); } /* return the flattened thread id in grid */ template static __device__ __forceinline__ hypre_int hypre_gpu_get_grid_thread_id(hypre_DeviceItem &item) { return hypre_gpu_get_block_id(item) * hypre_gpu_get_num_threads(item) + hypre_gpu_get_thread_id(item); } /* return the number of warps in grid */ template static __device__ __forceinline__ hypre_int hypre_gpu_get_grid_num_warps(hypre_DeviceItem &item) { return hypre_gpu_get_num_blocks(item) * hypre_gpu_get_num_warps(item); } /* return the flattened warp id in nd_range */ template static __device__ __forceinline__ hypre_int hypre_gpu_get_grid_warp_id(hypre_DeviceItem &item) { return hypre_gpu_get_block_id(item) * hypre_gpu_get_num_warps(item) + hypre_gpu_get_warp_id(item); } /* sync the thread block */ static __device__ __forceinline__ void block_sync(hypre_DeviceItem &item) { sycl::group_barrier(item.get_group()); } /* sync the warp */ static __device__ __forceinline__ void warp_sync(hypre_DeviceItem &item) { sycl::group_barrier(item.get_sub_group()); } /* exclusive prefix scan */ template static __device__ __forceinline__ T warp_prefix_sum(hypre_DeviceItem &item, hypre_int lane_id, T in, T &all_sum) { #pragma unroll for (hypre_int d = 2; d <= HYPRE_WARP_SIZE; d <<= 1) { T t = sycl::shift_group_right(item.get_sub_group(), in, d >> 1); if ( (lane_id & (d - 1)) == (d - 1) ) { in += t; } } all_sum = sycl::group_broadcast(item.get_sub_group(), in, HYPRE_WARP_SIZE - 1); if (lane_id == HYPRE_WARP_SIZE - 1) { in = 0; } #pragma unroll for (hypre_int d = HYPRE_WARP_SIZE >> 1; d > 0; d >>= 1) { T t = sycl::permute_group_by_xor(item.get_sub_group(), in, d); if ( (lane_id & (d - 1)) == (d - 1)) { if ( (lane_id & ((d << 1) - 1)) == ((d << 1) - 1) ) { in += t; } else { in = t; } } } return in; } static __device__ __forceinline__ hypre_mask hypre_ballot_sync(hypre_DeviceItem &item, hypre_mask mask, hypre_int predicate) { return sycl::reduce_over_group( item.get_sub_group(), (mask & (0x1 << item.get_sub_group().get_local_linear_id())) && predicate ? (0x1 << item.get_sub_group().get_local_linear_id()) : 0, sycl::ext::oneapi::plus<>()); } static __device__ __forceinline__ HYPRE_Int hypre_popc(hypre_mask mask) { return (HYPRE_Int) sycl::popcount(mask); } static __device__ __forceinline__ HYPRE_Int hypre_ffs(hypre_mask mask) { return (HYPRE_Int)dpct::ffs(mask); } static __device__ __forceinline__ hypre_int warp_any_sync(hypre_DeviceItem &item, hypre_mask mask, hypre_int predicate) { return sycl::any_of_group(item.get_sub_group(), predicate); } template static __device__ __forceinline__ T warp_shuffle_sync(hypre_DeviceItem &item, hypre_mask mask, T val, hypre_int src_line) { return sycl::group_broadcast(item.get_sub_group(), val, src_line); } template static __device__ __forceinline__ T warp_shuffle_sync(hypre_DeviceItem &item, hypre_mask mask, T val, hypre_int src_line, hypre_int width) { hypre_int lane_id = hypre_gpu_get_lane_id<1>(item); hypre_int group_start = (lane_id / width) * width; hypre_int src_in_warp = group_start + (src_line % width); return sycl::select_from_group(item.get_sub_group(), val, src_in_warp); } template static __device__ __forceinline__ T warp_shuffle_up_sync(hypre_DeviceItem &item, hypre_mask mask, T val, hypre_uint delta) { return sycl::shift_group_right(item.get_sub_group(), val, delta); } template static __device__ __forceinline__ T warp_shuffle_up_sync(hypre_DeviceItem &item, hypre_mask mask, T val, hypre_uint delta, hypre_int width) { hypre_int lane_id = hypre_gpu_get_lane_id<1>(item); hypre_int group_start = (lane_id / width) * width; hypre_int src_in_warp = lane_id - delta >= group_start ? lane_id - delta : lane_id; return sycl::select_from_group(item.get_sub_group(), val, src_in_warp); } template static __device__ __forceinline__ T warp_shuffle_down_sync(hypre_DeviceItem &item, hypre_mask mask, T val, hypre_uint delta) { return sycl::shift_group_left(item.get_sub_group(), val, delta); } template static __device__ __forceinline__ T warp_shuffle_down_sync(hypre_DeviceItem &item, hypre_mask mask, T val, hypre_uint delta, hypre_int width) { hypre_int lane_id = hypre_gpu_get_lane_id<1>(item); hypre_int group_end = ((lane_id / width) + 1) * width - 1; hypre_int src_in_warp = lane_id + delta <= group_end ? lane_id + delta : lane_id; return sycl::select_from_group(item.get_sub_group(), val, src_in_warp); } template static __device__ __forceinline__ T warp_shuffle_xor_sync(hypre_DeviceItem &item, hypre_mask mask, T val, hypre_int lane_mask) { return sycl::permute_group_by_xor(item.get_sub_group(), val, lane_mask); } template static __device__ __forceinline__ T warp_shuffle_xor_sync(hypre_DeviceItem &item, hypre_mask mask, T val, hypre_int lane_mask, hypre_int width) { hypre_int lane_id = hypre_gpu_get_lane_id<1>(item); hypre_int group_end = ((lane_id / width) + 1) * width - 1; hypre_int src_in_warp = lane_id ^ lane_mask; src_in_warp = src_in_warp > group_end ? lane_id : src_in_warp; return sycl::select_from_group(item.get_sub_group(), val, src_in_warp); } template static __forceinline__ T warp_reduce_sum(hypre_DeviceItem &item, T in) { for (hypre_int d = HYPRE_WARP_SIZE >> 1; d > 0; d >>= 1) { in += sycl::shift_group_left(item.get_sub_group(), in, d); } return in; } template static __forceinline__ T warp_allreduce_sum(hypre_DeviceItem &item, T in) { for (hypre_int d = HYPRE_WARP_SIZE >> 1; d > 0; d >>= 1) { in += sycl::permute_group_by_xor(item.get_sub_group(), in, d); } return in; } template static __forceinline__ T warp_reduce_max(hypre_DeviceItem &item, T in) { for (hypre_int d = HYPRE_WARP_SIZE >> 1; d > 0; d >>= 1) { in = std::max(in, sycl::shift_group_left(item.get_sub_group(), in, d)); } return in; } template static __forceinline__ T warp_allreduce_max(hypre_DeviceItem &item, T in) { for (hypre_int d = HYPRE_WARP_SIZE >> 1; d > 0; d >>= 1) { in = std::max(in, sycl::permute_group_by_xor(item.get_sub_group(), in, d)); } return in; } template static __forceinline__ T warp_reduce_min(hypre_DeviceItem &item, T in) { for (hypre_int d = HYPRE_WARP_SIZE >> 1; d > 0; d >>= 1) { in = std::min(in, sycl::shift_group_left(item.get_sub_group(), in, d)); } return in; } template static __forceinline__ T warp_allreduce_min(hypre_DeviceItem &item, T in) { for (hypre_int d = HYPRE_WARP_SIZE >> 1; d > 0; d >>= 1) { in = std::min(in, sycl::permute_group_by_xor(item.get_sub_group(), in, d)); } return in; } template struct is_negative { is_negative() {} constexpr bool operator()(const T &x = T()) const { return (x < 0); } }; template struct is_positive { is_positive() {} constexpr bool operator()(const T &x = T()) const { return (x > 0); } }; template struct is_nonnegative { is_nonnegative() {} constexpr bool operator()(const T &x = T()) const { return (x >= 0); } }; template struct in_range { T low, high; in_range(T low_ = T(), T high_ = T()) { low = low_; high = high_; } constexpr bool operator()(const T &x) const { return (x >= low && x <= high); } }; template struct out_of_range { T low, high; out_of_range(T low_ = T(), T high_ = T()) { low = low_; high = high_; } constexpr bool operator()(const T &x) const { return (x < low || x > high); } }; template struct less_than { T val; less_than(T val_ = T()) { val = val_; } constexpr bool operator()(const T &x) const { return (x < val); } }; template struct modulo { T val; modulo(T val_ = T()) { val = val_; } constexpr T operator()(const T &x) const { return (x % val); } }; template struct equal { T val; equal(T val_ = T()) { val = val_; } constexpr bool operator()(const T &x) const { return (x == val); } }; template struct type_cast { constexpr T2 operator()(const T1 &x = T1()) const { return (T2) x; } }; template struct absolute_value { constexpr T operator()(const T &x) const { return x < T(0) ? -x : x; } }; template struct TupleComp2 { typedef std::tuple Tuple; bool operator()(const Tuple& t1, const Tuple& t2) { if (std::get<0>(t1) < std::get<0>(t2)) { return true; } if (std::get<0>(t1) > std::get<0>(t2)) { return false; } return hypre_abs(std::get<1>(t1)) > hypre_abs(std::get<1>(t2)); } }; template struct TupleComp3 { typedef std::tuple Tuple; bool operator()(const Tuple& t1, const Tuple& t2) { if (std::get<0>(t1) < std::get<0>(t2)) { return true; } if (std::get<0>(t1) > std::get<0>(t2)) { return false; } if (std::get<0>(t2) == std::get<1>(t2)) { return false; } return std::get<0>(t1) == std::get<1>(t1) || std::get<1>(t1) < std::get<1>(t2); } }; #endif // #if defined(HYPRE_USING_SYCL) /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - * end of functions defined here * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ /* device_utils.c */ #if defined(HYPRE_USING_GPU) dim3 hypre_GetDefaultDeviceBlockDimension(); dim3 hypre_GetDefaultDeviceGridDimension( HYPRE_Int n, const char *granularity, dim3 bDim ); dim3 hypre_dim3(HYPRE_Int x); dim3 hypre_dim3(HYPRE_Int x, HYPRE_Int y); dim3 hypre_dim3(HYPRE_Int x, HYPRE_Int y, HYPRE_Int z); template HYPRE_Int hypreDevice_StableSortByTupleKey(HYPRE_Int N, T1 *keys1, T2 *keys2, T3 *vals, HYPRE_Int opt); template HYPRE_Int hypreDevice_StableSortTupleByTupleKey(HYPRE_Int N, T1 *keys1, T2 *keys2, T3 *vals1, T4 *vals2, HYPRE_Int opt); template HYPRE_Int hypreDevice_ReduceByTupleKey(HYPRE_Int N, T1 *keys1_in, T2 *keys2_in, T3 *vals_in, T1 *keys1_out, T2 *keys2_out, T3 *vals_out); template HYPRE_Int hypreDevice_ScatterConstant(T *x, HYPRE_Int n, HYPRE_Int *map, T v); HYPRE_Int hypreDevice_GenScatterAdd(HYPRE_Real *x, HYPRE_Int ny, HYPRE_Int *map, HYPRE_Real *y, char *work); template HYPRE_Int hypreDevice_CsrRowPtrsToIndicesWithRowNum(HYPRE_Int nrows, HYPRE_Int nnz, HYPRE_Int *d_row_ptr, T *d_row_num, T *d_row_ind); #endif #if defined(HYPRE_USING_CUDA) || defined(HYPRE_USING_HIP) #if defined(HYPRE_USING_CUDA) cudaError_t hypre_CachingMallocDevice(void **ptr, size_t nbytes); cudaError_t hypre_CachingMallocManaged(void **ptr, size_t nbytes); cudaError_t hypre_CachingFreeDevice(void *ptr); cudaError_t hypre_CachingFreeManaged(void *ptr); #endif hypre_cub_CachingDeviceAllocator * hypre_DeviceDataCubCachingAllocatorCreate(hypre_uint bin_growth, hypre_uint min_bin, hypre_uint max_bin, size_t max_cached_bytes, bool skip_cleanup, bool debug, bool use_managed_memory); void hypre_DeviceDataCubCachingAllocatorDestroy(hypre_DeviceData *data); #endif // #if defined(HYPRE_USING_CUDA) || defined(HYPRE_USING_HIP) #if defined(HYPRE_USING_CUSPARSE) cudaDataType hypre_HYPREComplexToCudaDataType(); #if CUSPARSE_VERSION >= CUSPARSE_NEWAPI_VERSION cusparseIndexType_t hypre_HYPREIntToCusparseIndexType(); #endif #endif // #if defined(HYPRE_USING_CUSPARSE) #endif /* #ifndef HYPRE_CUDA_UTILS_H */ hypre-2.33.0/src/utilities/error.c000066400000000000000000000211321477326011500170320ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "_hypre_utilities.h" /* Global variable for error handling */ hypre_Error hypre__global_error = {0, 0, 0, HYPRE_INT_MAX, NULL, 0, 0}; /*-------------------------------------------------------------------------- * Process the error raised on the given line of the given source file *--------------------------------------------------------------------------*/ void hypre_error_handler(const char *filename, HYPRE_Int line, HYPRE_Int ierr, const char *msg) { /* Copy global struct into a short name and copy changes back before exiting */ hypre_Error err = hypre__global_error; /* Store the error code */ err.error_flag |= ierr; #if defined(HYPRE_PRINT_ERRORS) /* process the error message only if verbosity is turned on for that error code */ if (ierr & hypre__global_error.verbosity) { /* Error format strings without and with a message */ const char fmt_wo[] = "hypre error in file \"%s\", line %d, error code = %d\n"; const char fmt_wm[] = "hypre error in file \"%s\", line %d, error code = %d - %s\n"; char *buffer; HYPRE_Int bufsz; /* Print error message to local buffer first */ if (msg) { bufsz = hypre_snprintf(NULL, 0, fmt_wm, filename, line, ierr, msg); } else { bufsz = hypre_snprintf(NULL, 0, fmt_wo, filename, line, ierr); } bufsz += 1; buffer = hypre_TAlloc(char, bufsz, HYPRE_MEMORY_HOST); if (msg) { hypre_snprintf(buffer, bufsz, fmt_wm, filename, line, ierr, msg); } else { hypre_snprintf(buffer, bufsz, fmt_wo, filename, line, ierr); } /* Now print buffer to either memory or stderr */ if (err.print_to_memory) { HYPRE_Int msg_sz = err.msg_sz; /* Store msg_sz for snprintf below */ /* Make sure there is enough memory for the new message */ err.msg_sz += bufsz; if ( err.msg_sz > err.mem_sz ) { err.mem_sz = err.msg_sz + 1024; /* Add some excess */ err.memory = hypre_TReAlloc(err.memory, char, err.mem_sz, HYPRE_MEMORY_HOST); } hypre_snprintf((err.memory + msg_sz), bufsz, "%s", buffer); } else { hypre_fprintf(stderr, "%s", buffer); } /* Free buffer */ hypre_TFree(buffer, HYPRE_MEMORY_HOST); } #else HYPRE_UNUSED_VAR(filename); HYPRE_UNUSED_VAR(line); HYPRE_UNUSED_VAR(msg); #endif /* if defined(HYPRE_PRINT_ERRORS) */ hypre__global_error = err; } /*-------------------------------------------------------------------------- * hypre_error_handler_clear_messages *--------------------------------------------------------------------------*/ void hypre_error_handler_clear_messages(void) { hypre_Error err = hypre__global_error; hypre_TFree(err.memory, HYPRE_MEMORY_HOST); err.mem_sz = 0; err.msg_sz = 0; hypre__global_error = err; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ void hypre_error_code_save(void) { /* Store the current error code in a temporary variable */ hypre_error_temp_flag = hypre_error_flag; /* Reset current error code */ HYPRE_ClearAllErrors(); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ void hypre_error_code_restore(void) { /* Restore hypre's error code */ hypre_error_flag = hypre_error_temp_flag; /* Reset temporary error code */ hypre_error_temp_flag = 0; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_GetGlobalError(MPI_Comm comm) { HYPRE_Int global_error_flag; hypre_MPI_Allreduce(&hypre_error_flag, &global_error_flag, 1, HYPRE_MPI_INT, hypre_MPI_BOR, comm); return global_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_GetError(void) { return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_CheckError(HYPRE_Int ierr, HYPRE_Int hypre_error_code) { return ierr & hypre_error_code; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ void HYPRE_DescribeError(HYPRE_Int ierr, char *msg) { if (ierr == 0) { hypre_sprintf(msg, "[No error] "); } if (ierr & HYPRE_ERROR_GENERIC) { hypre_sprintf(msg, "[Generic error] "); } if (ierr & HYPRE_ERROR_MEMORY) { hypre_sprintf(msg, "[Memory error] "); } if (ierr & HYPRE_ERROR_ARG) { hypre_sprintf(msg, "[Error in argument %d] ", HYPRE_GetErrorArg()); } if (ierr & HYPRE_ERROR_CONV) { hypre_sprintf(msg, "[Method did not converge] "); } } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_GetErrorArg(void) { return (hypre_error_flag >> 3 & 31); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ClearAllErrors(void) { hypre_error_flag = 0; return (hypre_error_flag != 0); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ClearError(HYPRE_Int hypre_error_code) { hypre_error_flag &= ~hypre_error_code; return (hypre_error_flag & hypre_error_code); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_SetPrintErrorMode(HYPRE_Int mode) { hypre__global_error.print_to_memory = mode; return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_SetPrintErrorVerbosity(HYPRE_Int code, HYPRE_Int verbosity) { if (code < 0) { /* Change all error codes */ code = HYPRE_INT_MAX; } /* First turn the bit(s) on with bitwise or */ hypre__global_error.verbosity |= code; if (!verbosity) { /* Turn the bit(s) off with bitwise xor (this works because they were first turned on */ hypre__global_error.verbosity ^= code; } return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_GetErrorMessages(char **buffer, HYPRE_Int *bufsz) { hypre_Error err = hypre__global_error; *bufsz = err.msg_sz; *buffer = hypre_CTAlloc(char, *bufsz, HYPRE_MEMORY_HOST); hypre_TMemcpy(*buffer, err.memory, char, *bufsz, HYPRE_MEMORY_HOST, HYPRE_MEMORY_HOST); /* Clear error messages */ hypre_error_handler_clear_messages(); return hypre_error_flag; } /*-------------------------------------------------------------------------- * This routine can be called from any rank; it is NOT collective *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_PrintErrorMessages(MPI_Comm comm) { hypre_Error err = hypre__global_error; HYPRE_Int myid; char *msg; hypre_MPI_Comm_rank(comm, &myid); for (msg = err.memory; msg < (err.memory + err.msg_sz); msg += strlen(msg) + 1) { hypre_fprintf(stderr, "%d: %s", myid, msg); } /* Clear error messages */ hypre_error_handler_clear_messages(); return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ClearErrorMessages(void) { hypre_error_handler_clear_messages(); return hypre_error_flag; } hypre-2.33.0/src/utilities/error.h000066400000000000000000000051161477326011500170430ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #ifndef hypre_ERROR_HEADER #define hypre_ERROR_HEADER #ifdef __cplusplus extern "C++" { #endif #include #ifdef __cplusplus } #endif /*-------------------------------------------------------------------------- * Global variable used in hypre error checking *--------------------------------------------------------------------------*/ typedef struct { HYPRE_Int error_flag; HYPRE_Int temp_error_flag; HYPRE_Int print_to_memory; HYPRE_Int verbosity; char *memory; HYPRE_Int mem_sz; HYPRE_Int msg_sz; } hypre_Error; extern hypre_Error hypre__global_error; #define hypre_error_flag hypre__global_error.error_flag #define hypre_error_temp_flag hypre__global_error.temp_error_flag /*-------------------------------------------------------------------------- * HYPRE error macros *--------------------------------------------------------------------------*/ void hypre_error_handler(const char *filename, HYPRE_Int line, HYPRE_Int ierr, const char *msg); void hypre_error_handler_clear_messages(void); void hypre_error_code_save(void); void hypre_error_code_restore(void); #define hypre_error(IERR) hypre_error_handler(__FILE__, __LINE__, IERR, NULL) #define hypre_error_w_msg(IERR, msg) hypre_error_handler(__FILE__, __LINE__, IERR, msg) #define hypre_error_in_arg(IARG) hypre_error(HYPRE_ERROR_ARG | IARG<<3) #if defined(HYPRE_DEBUG) /* host assert */ #define hypre_assert(EX) do { if (!(EX)) { fprintf(stderr, "[%s, %d] hypre_assert failed: %s\n", __FILE__, __LINE__, #EX); hypre_error(1); assert(0); } } while (0) /* device assert */ #if defined(HYPRE_USING_CUDA) #define hypre_device_assert(EX) assert(EX) #elif defined(HYPRE_USING_HIP) /* FIXME: Currently, asserts in device kernels in HIP do not behave well */ #define hypre_device_assert(EX) do { if (0) { static_cast (EX); } } while (0) #elif defined(HYPRE_USING_SYCL) #define hypre_device_assert(EX) assert(EX) #endif #else /* #ifdef HYPRE_DEBUG */ /* this is to silence compiler's unused variable warnings */ #ifdef __cplusplus #define hypre_assert(EX) do { if (0) { static_cast (EX); } } while (0) #else #define hypre_assert(EX) do { if (0) { (void) (EX); } } while (0) #endif #define hypre_device_assert(EX) #endif #endif /* hypre_ERROR_HEADER */ hypre-2.33.0/src/utilities/exchange_data.README000066400000000000000000000153161477326011500211760ustar00rootroot00000000000000# Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) README for the hypre_DataExchangeList() function ************** * Purpose: * ************** This function allows a processor (i) to "contact" a list of processors with a message containing a variable amount of data. The processors in the list do not know that they will be contacted by processor i. These processors must then send a "response" message back to processor i, and the response message can also contain any amount of data. Essentially, the user gives the function a list of processors and corresponding lists of data (of any type) to send to each processor. The function returns lists of data (the "responses") from each of the contacted processors. The user must write a function that dictates how to create a response message based on a contact message. *************** * Function: * *************** int hypre_DataExchangeList(int num_contacts, int *contact_proc_list, void *contact_send_buf, int *contact_send_buf_starts, int contact_obj_size, int response_obj_size, hypre_DataExchangeResponse *response_obj, int max_response_size, int rnum, MPI_Comm comm, void **p_response_recv_buf, int **p_response_recv_buf_starts) ***************** * Parameters: * ***************** num_contacts = the number of processors to contact contact_proc_list = list of processors to contact contact_send_buf = array of data to send - data may be any type (ints, doubles, structures, etc.). contact_send_buf_starts = index into contact_send_buf corresponding to contact_proc_list. For example, processor (contact_proc_list[j]) is sent the buffer contact_send_buf[contact_send_buf_starts[j]], and this buffer is of size (contact_send_buf_starts[j+1] - contact_send_buf_starts[j]). contact_obj_size = sizeof() one data item (int, double, structure, etc.) in contact_send_buf. THIS NEEDS TO BE THE SAME NUMBER FOR ALL PROCESSORS. response_obj_size = sizeof() one data item in response_recv_buf(int, double, structure, etc.) THIS NEEDS TO BE THE SAME NUMBER FOR ALL PROCESSORS. response_obj = this will give us the function we need to fill the response as well as any data we might need to accomplish that (more details below.) max_response_size - this number indicates the size of the array of data that the contacting processor expects back in a single response. This should be a reasonable estimate - not an absolute upper bound! If a contacted processor needs to respond with more than max_response_size data, then a second communication is used - this is transparent to the user and occurs inside hypre_DataExchangeList(). Choosing a max_response_size that is way too large will result in the passing of overly large messages. THIS NEEDS TO BE THE SAME NUMBER FOR ALL PROCESSORS. rnum = two consecutive calls to this function should have different rnums. Recommend alternating rnum = 1 and rnum=2 - these flags will be even (so odd numbered tags could be used in calling code in between). THIS NEEDS TO BE THE SAME NUMBER FOR ALL PROCESSORS. comm = MPI_COMM p_response_recv_buf = (OUTPUT) where to receive the responses - memory will be allocated in this function (do not preallocate) p_response_recv_buf_starts = (OUTPUT) index of p_response_buf corresponding to contact_buf_list - memory will be allocated in this function ********************** * Response Object: * ********************** This object has a function pointer to assign before including it in a call to hypre_DataExchangeList(). In addition, one or more of the void pointers may be set. Each item in the structure is explained below. typedef struct { int (*fill_response)(void* recv_buf, int contact_size, int contact_proc, void* response_obj, MPI_Comm comm, void** response_buf, int* response_message_size, ); int send_response_overhead; int send_response_storage; void *data1; void *data2; } hypre_DataExchangeResponse; int (*fill_response)(void* recv_buf, int contact_size, int contact_proc, void* response_obj, MPI_Comm comm, void** response_buf, int* response_message_size, ); The user writes a function to assign to this pointer. This function is called by hypre_DataExchangeList() upon receipt of a contact message and must determine a response. The data from the contact message is stored in recv_buf, where contact_size indicates the number of objects and contact_proc indicates the processor that made the contact. The user will know the data type and can manipulate recv_buf accordingly. Likewise, the user can populate response_buf as desired - this will constitute the response message. The user must indicate the size of the response in response_message_size. Note that response_message_size and contact_size are NOT in bytes - but rather the number of objects sent (i.e. contact size = 4 if four integers or structures were sent). Note 1: If the desired response to contact messages is a NULL response (a confirmation), simply assign response_message_size to zero - do NOT set the response_buf to NULL. Note 2: cast the response_obj argument to a hypre_DataExchangeResponse object to access the data fields. send_response_storage - this number indicates the amount of storage (again not in bytes) available for the response_buf objects. The user should make sure they do not need to write a larger amount of data than is available. If more storage is needed then adjust the send_response_storage variable to indicate the new size desired. Then realloc response_buf to size (send_response_storage + send_response_overhead)*(size of response object). send_response_overhead - this is extra overhead needed by hypre_DataExchangeList. Include this if you need to realloc response_buf (see previous entry). This is determined by the hypre_DataExchangeFunction(). data1, data2 - these are void pointers that the user may want to assign to data from the program that calls exchangeDataList() in the event that (1) certain data is needed to formulate an appropriate response or (2) data needs to be saved from the contacts to be manipulated after hypre_DataExchangeList() completes. hypre-2.33.0/src/utilities/exchange_data.c000066400000000000000000000543151477326011500204650ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /* see exchange_data.README for additional information */ /* AHB 6/04 */ #include #include #include #include "_hypre_utilities.h" /*--------------------------------------------------- * hypre_CreateBinaryTree * * Get the processors position in the binary tree (i.e., * its children and parent processor ids) *----------------------------------------------------*/ HYPRE_Int hypre_CreateBinaryTree(HYPRE_Int myid, HYPRE_Int num_procs, hypre_BinaryTree **tree_ptr) { hypre_BinaryTree *tree; HYPRE_Int i, proc, size = 0; HYPRE_Int *tmp_child_id; HYPRE_Int num = 0, parent = 0; tree = hypre_CTAlloc(hypre_BinaryTree, 1, HYPRE_MEMORY_HOST); /* initialize */ proc = myid; /*how many children can a processor have?*/ for (i = 1; i < num_procs; i *= 2) { size++; } /* allocate space */ tmp_child_id = hypre_TAlloc(HYPRE_Int, size, HYPRE_MEMORY_HOST); /* find children and parent */ for (i = 1; i < num_procs; i *= 2) { if ( (proc % 2) == 0) { if ( (myid + i) < num_procs ) { tmp_child_id[num] = myid + i; num++; } proc /= 2; } else { parent = myid - i; break; } } hypre_BinaryTreeParentId(tree) = parent; hypre_BinaryTreeNumChild(tree) = num; hypre_BinaryTreeChildIds(tree) = tmp_child_id; *tree_ptr = tree; return hypre_error_flag; } /*--------------------------------------------------- * hypre_DestroyBinaryTree() * * Destroy storage created by hypre_CreateBinaryTree *----------------------------------------------------*/ HYPRE_Int hypre_DestroyBinaryTree(hypre_BinaryTree *tree) { if (tree) { hypre_TFree(hypre_BinaryTreeChildIds(tree), HYPRE_MEMORY_HOST); hypre_TFree(tree, HYPRE_MEMORY_HOST); } return hypre_error_flag; } /*--------------------------------------------------- * hypre_DataExchangeList() * * This function is for sending a list of messages ("contacts" to * a list of processors. The receiving processors * do not know how many messages they are getting. The * sending process expects a "response" (either a confirmation or * some sort of data back from the receiving processor). *----------------------------------------------------*/ /* should change to where the buffers for sending and receiving are voids instead of ints - then cast accordingly */ HYPRE_Int hypre_DataExchangeList(HYPRE_Int num_contacts, HYPRE_Int *contact_proc_list, void *contact_send_buf, HYPRE_Int *contact_send_buf_starts, HYPRE_Int contact_obj_size, HYPRE_Int response_obj_size, hypre_DataExchangeResponse *response_obj, HYPRE_Int max_response_size, HYPRE_Int rnum, MPI_Comm comm, void **p_response_recv_buf, HYPRE_Int **p_response_recv_buf_starts) { /*------------------------------------------- * parameters: * * num_contacts = how many procs to contact * contact_proc_list = list of processors to contact * contact_send_buf = array of data to send * contact_send_buf_starts = index for contact_send_buf corresponding to * contact_proc_list * contact_obj_size = sizeof() one obj in contact list * response_obj_size = sizeof() one obj in response_recv_buf * response_obj = this will give us the function we need to * fill the reponse as well as * any data we might need to accomplish that * max_response_size = max size of a single response expected (do NOT * need to be an absolute upper bound) * rnum = two consequentive exchanges should have different * rnums. Alternate rnum = 1 * and rnum=2 - these flags will be even (so odd * numbered tags could be used in calling code) * p_response_recv_buf = where to receive the reponses - will be allocated * in this function * p_response_recv_buf_starts = index of p_response_buf corresponding to * contact_buf_list - will be allocated here *-------------------------------------------*/ HYPRE_Int num_procs, myid; HYPRE_Int i; HYPRE_Int terminate, responses_complete; HYPRE_Int children_complete; HYPRE_Int contact_flag; HYPRE_Int proc; HYPRE_Int contact_size; HYPRE_Int size, post_size, copy_size; HYPRE_Int total_size, count; void *start_ptr = NULL, *index_ptr = NULL; HYPRE_Int *int_ptr = NULL; void *response_recv_buf = NULL; void *send_response_buf = NULL; HYPRE_Int *response_recv_buf_starts = NULL; void *initial_recv_buf = NULL; void *recv_contact_buf = NULL; HYPRE_Int recv_contact_buf_size = 0; HYPRE_Int response_message_size = 0; HYPRE_Int overhead; HYPRE_Int max_response_size_bytes; HYPRE_Int max_response_total_bytes; void **post_array = NULL; /*this must be set to null or realloc will crash */ HYPRE_Int post_array_storage = 0; HYPRE_Int post_array_size = 0; HYPRE_Int num_post_recvs = 0; void **contact_ptrs = NULL, **response_ptrs = NULL, **post_ptrs = NULL; hypre_BinaryTree *tree = NULL; hypre_MPI_Request *response_requests = NULL, *contact_requests = NULL; hypre_MPI_Status *response_statuses = NULL, *contact_statuses = NULL; hypre_MPI_Request *post_send_requests = NULL, *post_recv_requests = NULL; hypre_MPI_Status *post_send_statuses = NULL, *post_recv_statuses = NULL; hypre_MPI_Request *term_requests = NULL, term_request1, request_parent; hypre_MPI_Status *term_statuses = NULL, term_status1, status_parent; hypre_MPI_Status status, fill_status; const HYPRE_Int contact_tag = 1000 * rnum; const HYPRE_Int response_tag = 1002 * rnum; const HYPRE_Int term_tag = 1004 * rnum; const HYPRE_Int post_tag = 1006 * rnum; hypre_MPI_Comm_size(comm, &num_procs ); hypre_MPI_Comm_rank(comm, &myid ); /* ---------initializations ----------------*/ /* if the response_obj_size or contact_obj_size is 0, set to sizeof(HYPRE_Int) */ if (!response_obj_size) { response_obj_size = sizeof(HYPRE_Int); } if (!contact_obj_size) { contact_obj_size = sizeof(HYPRE_Int); } max_response_size_bytes = max_response_size * response_obj_size; /* pre-allocate the max space for responding to contacts */ overhead = (HYPRE_Int)hypre_ceil((HYPRE_Real) sizeof(HYPRE_Int) / response_obj_size); /*for appending an integer*/ max_response_total_bytes = (max_response_size + overhead) * response_obj_size; response_obj->send_response_overhead = overhead; response_obj->send_response_storage = max_response_size; /*send_response_buf = hypre_TAlloc(char, max_response_total_bytes);*/ send_response_buf = hypre_CTAlloc(char, (max_response_size + overhead) * response_obj_size, HYPRE_MEMORY_HOST); /*allocate space for inital recv array for the responses - give each processor size max_response_size */ initial_recv_buf = hypre_TAlloc(char, max_response_total_bytes * num_contacts, HYPRE_MEMORY_HOST); response_recv_buf_starts = hypre_CTAlloc(HYPRE_Int, num_contacts + 1, HYPRE_MEMORY_HOST); contact_ptrs = hypre_TAlloc( void *, num_contacts, HYPRE_MEMORY_HOST); response_ptrs = hypre_TAlloc(void *, num_contacts, HYPRE_MEMORY_HOST); /*-------------SEND CONTACTS AND POST RECVS FOR RESPONSES---*/ for (i = 0; i <= num_contacts; i++) { response_recv_buf_starts[i] = i * (max_response_size + overhead); } /* Send "contact" messages to the list of processors and pre-post receives to wait for their response*/ responses_complete = 1; if (num_contacts > 0) { responses_complete = 0; response_requests = hypre_CTAlloc(hypre_MPI_Request, num_contacts, HYPRE_MEMORY_HOST); response_statuses = hypre_CTAlloc(hypre_MPI_Status, num_contacts, HYPRE_MEMORY_HOST); contact_requests = hypre_CTAlloc(hypre_MPI_Request, num_contacts, HYPRE_MEMORY_HOST); contact_statuses = hypre_CTAlloc(hypre_MPI_Status, num_contacts, HYPRE_MEMORY_HOST); /* post receives - could be confirmation or data*/ /* the size to post is max_response_total_bytes*/ for (i = 0; i < num_contacts; i++) { /* response_ptrs[i] = initial_recv_buf + i*max_response_total_bytes ; */ response_ptrs[i] = (void *)((char *) initial_recv_buf + i * max_response_total_bytes) ; hypre_MPI_Irecv(response_ptrs[i], max_response_total_bytes, hypre_MPI_BYTE, contact_proc_list[i], response_tag, comm, &response_requests[i]); } /* send out contact messages */ start_ptr = contact_send_buf; for (i = 0; i < num_contacts; i++) { contact_ptrs[i] = start_ptr; size = contact_send_buf_starts[i + 1] - contact_send_buf_starts[i] ; hypre_MPI_Isend(contact_ptrs[i], size * contact_obj_size, hypre_MPI_BYTE, contact_proc_list[i], contact_tag, comm, &contact_requests[i]); /* start_ptr += (size*contact_obj_size); */ start_ptr = (void *) ((char *) start_ptr + (size * contact_obj_size)); } } /*------------BINARY TREE-----------------------*/ /*Now let's find out our binary tree information and initialize for the termination check sweep */ terminate = 1; /*indicates whether we can stop probing for contact */ children_complete = 1;/*indicates whether we have recv. term messages from our children*/ if (num_procs > 1) { hypre_CreateBinaryTree(myid, num_procs, &tree); /* we will get a message from all of our children when they have received responses for all of their contacts. So post receives now */ term_requests = hypre_CTAlloc(hypre_MPI_Request, tree -> num_child, HYPRE_MEMORY_HOST); term_statuses = hypre_CTAlloc(hypre_MPI_Status, tree -> num_child, HYPRE_MEMORY_HOST); for (i = 0; i < tree -> num_child; i++) { hypre_MPI_Irecv(NULL, 0, HYPRE_MPI_INT, (tree -> child_id)[i], term_tag, comm, &term_requests[i]); } terminate = 0; children_complete = 0; } else if (num_procs == 1 && num_contacts > 0) /* added 11/08 */ { terminate = 0; } /*---------PROBE LOOP-----------------------------------------*/ /*Look for incoming contact messages - don't know how many I will get!*/ while (!terminate) { /* did I receive any contact messages? */ hypre_MPI_Iprobe(hypre_MPI_ANY_SOURCE, contact_tag, comm, &contact_flag, &status); while (contact_flag) { /* received contacts - from who and what do we do ?*/ proc = status.hypre_MPI_SOURCE; hypre_MPI_Get_count(&status, hypre_MPI_BYTE, &contact_size); contact_size = contact_size / contact_obj_size; /*---------------FILL RESPONSE ------------------------*/ /*first receive the contact buffer - then call a function to determine how to populate the send buffer for the reponse*/ /* do we have enough space to recv it? */ if (contact_size > recv_contact_buf_size) { recv_contact_buf = hypre_TReAlloc((char*)recv_contact_buf, char, contact_obj_size * contact_size, HYPRE_MEMORY_HOST); recv_contact_buf_size = contact_size; } /* this must be blocking - can't fill recv without the buffer*/ hypre_MPI_Recv(recv_contact_buf, contact_size * contact_obj_size, hypre_MPI_BYTE, proc, contact_tag, comm, &fill_status); response_obj->fill_response(recv_contact_buf, contact_size, proc, response_obj, comm, &send_response_buf, &response_message_size ); /* we need to append the size of the send obj */ /* first we copy out any part that may be needed to send later so we don't overwrite */ post_size = response_message_size - max_response_size; if (post_size > 0) /*we will need to send the extra information later */ { /*hypre_printf("myid = %d, post_size = %d\n", myid, post_size);*/ if (post_array_size == post_array_storage) { /* allocate room for more posts - add 20*/ post_array_storage += 20; post_array = hypre_TReAlloc(post_array, void *, post_array_storage, HYPRE_MEMORY_HOST); post_send_requests = hypre_TReAlloc(post_send_requests, hypre_MPI_Request, post_array_storage, HYPRE_MEMORY_HOST); } /* allocate space for the data this post only*/ /* this should not happen often (unless a poor max_size has been chosen) - so we will allocate space for the data as needed */ size = post_size * response_obj_size; post_array[post_array_size] = hypre_TAlloc(char, size, HYPRE_MEMORY_HOST); /* index_ptr = send_response_buf + max_response_size_bytes */; index_ptr = (void *) ((char *) send_response_buf + max_response_size_bytes); hypre_TMemcpy(post_array[post_array_size], index_ptr, char, size, HYPRE_MEMORY_HOST, HYPRE_MEMORY_HOST); /*now post any part of the message that is too long with a non-blocking send and a different tag */ hypre_MPI_Isend(post_array[post_array_size], size, hypre_MPI_BYTE, proc, post_tag, /*hypre_MPI_COMM_WORLD, */ comm, &post_send_requests[post_array_size]); post_array_size++; } /*now append the size information into the overhead storage */ /* index_ptr = send_response_buf + max_response_size_bytes; */ index_ptr = (void *) ((char *) send_response_buf + max_response_size_bytes); hypre_TMemcpy(index_ptr, &response_message_size, HYPRE_Int, 1, HYPRE_MEMORY_HOST, HYPRE_MEMORY_HOST); /*send the block of data that includes the overhead */ /* this is a blocking send - the recv has already been posted */ hypre_MPI_Send(send_response_buf, max_response_total_bytes, hypre_MPI_BYTE, proc, response_tag, comm); /*--------------------------------------------------------------*/ /* look for any more contact messages*/ hypre_MPI_Iprobe(hypre_MPI_ANY_SOURCE, contact_tag, comm, &contact_flag, &status); } /* no more contact messages waiting - either (1) check to see if we have received all of our response messages (2) participate in termination (check for messages from children) (3) participate in termination sweep (check for message from parent) */ if (!responses_complete) { hypre_MPI_Testall(num_contacts, response_requests, &responses_complete, response_statuses); if (responses_complete && num_procs == 1) { terminate = 1; } /*added 11/08 */ } else if (!children_complete) /* have all of our children received all of their response messages?*/ { hypre_MPI_Testall(tree -> num_child, term_requests, &children_complete, term_statuses); /* if we have gotten term messages from all of our children, send a term message to our parent. Then post a receive to hear back from parent */ if (children_complete & (myid > 0)) /*root does not have a parent*/ { hypre_MPI_Isend(NULL, 0, HYPRE_MPI_INT, tree -> parent_id, term_tag, comm, &request_parent); hypre_MPI_Irecv(NULL, 0, HYPRE_MPI_INT, tree -> parent_id, term_tag, comm, &term_request1); } } else /*have we gotten a term message from our parent? */ { if (myid == 0) /* root doesn't have a parent */ { terminate = 1; } else { hypre_MPI_Test(&term_request1, &terminate, &term_status1); } if (terminate) /*tell children to terminate */ { if (myid > 0 ) { hypre_MPI_Wait(&request_parent, &status_parent); } for (i = 0; i < tree -> num_child; i++) { /*a blocking send - recv has been posted already*/ hypre_MPI_Send(NULL, 0, HYPRE_MPI_INT, (tree -> child_id)[i], term_tag, comm); } } } } /* end of (!terminate) loop */ /* ----some clean up before post-processing ----*/ if (recv_contact_buf_size > 0) { hypre_TFree(recv_contact_buf, HYPRE_MEMORY_HOST); } hypre_TFree(send_response_buf, HYPRE_MEMORY_HOST); hypre_TFree(contact_ptrs, HYPRE_MEMORY_HOST); hypre_TFree(response_ptrs, HYPRE_MEMORY_HOST); /*-----------------POST PROCESSING------------------------------*/ /* more data to receive? */ /* move to recv buffer and update response_recv_buf_starts */ total_size = 0; /*total number of items in response buffer */ num_post_recvs = 0; /*num of post processing recvs to post */ start_ptr = initial_recv_buf; response_recv_buf_starts[0] = 0; /*already allocated above */ /*an extra loop to determine sizes. This is better than reallocating the array that will be used in posting the irecvs */ for (i = 0; i < num_contacts; i++) { int_ptr = (HYPRE_Int *) ((char *) start_ptr + max_response_size_bytes); /*the overhead HYPRE_Int*/ response_message_size = *int_ptr; response_recv_buf_starts[i + 1] = response_recv_buf_starts[i] + response_message_size; total_size += response_message_size; if (max_response_size < response_message_size) { num_post_recvs++; } /* start_ptr += max_response_total_bytes; */ start_ptr = (void *) ((char *) start_ptr + max_response_total_bytes); } post_recv_requests = hypre_TAlloc(hypre_MPI_Request, num_post_recvs, HYPRE_MEMORY_HOST); post_recv_statuses = hypre_TAlloc(hypre_MPI_Status, num_post_recvs, HYPRE_MEMORY_HOST); post_ptrs = hypre_TAlloc(void *, num_post_recvs, HYPRE_MEMORY_HOST); /*second loop to post any recvs and set up recv_response_buf */ response_recv_buf = hypre_TAlloc(char, total_size * response_obj_size, HYPRE_MEMORY_HOST); index_ptr = response_recv_buf; start_ptr = initial_recv_buf; count = 0; for (i = 0; i < num_contacts; i++) { response_message_size = response_recv_buf_starts[i + 1] - response_recv_buf_starts[i]; copy_size = hypre_min(response_message_size, max_response_size); hypre_TMemcpy(index_ptr, start_ptr, char, copy_size * response_obj_size, HYPRE_MEMORY_HOST, HYPRE_MEMORY_HOST); /* index_ptr += copy_size*response_obj_size; */ index_ptr = (void *) ((char *) index_ptr + copy_size * response_obj_size); if (max_response_size < response_message_size) { size = (response_message_size - max_response_size) * response_obj_size; post_ptrs[count] = index_ptr; hypre_MPI_Irecv(post_ptrs[count], size, hypre_MPI_BYTE, contact_proc_list[i], post_tag, comm, &post_recv_requests[count]); count++; /* index_ptr+=size;*/ index_ptr = (void *) ((char *) index_ptr + size); } /* start_ptr += max_response_total_bytes; */ start_ptr = (void *) ((char *) start_ptr + max_response_total_bytes); } post_send_statuses = hypre_TAlloc(hypre_MPI_Status, post_array_size, HYPRE_MEMORY_HOST); /*--------------CLEAN UP------------------- */ hypre_TFree(initial_recv_buf, HYPRE_MEMORY_HOST); if (num_contacts > 0 ) { /*these should be done */ hypre_MPI_Waitall(num_contacts, contact_requests, contact_statuses); hypre_TFree(response_requests, HYPRE_MEMORY_HOST); hypre_TFree(response_statuses, HYPRE_MEMORY_HOST); hypre_TFree(contact_requests, HYPRE_MEMORY_HOST); hypre_TFree(contact_statuses, HYPRE_MEMORY_HOST); } /* clean up from the post processing - the arrays, requests, etc. */ if (num_post_recvs) { hypre_MPI_Waitall(num_post_recvs, post_recv_requests, post_recv_statuses); hypre_TFree(post_recv_requests, HYPRE_MEMORY_HOST); hypre_TFree(post_recv_statuses, HYPRE_MEMORY_HOST); hypre_TFree(post_ptrs, HYPRE_MEMORY_HOST); } if (post_array_size) { hypre_MPI_Waitall(post_array_size, post_send_requests, post_send_statuses); hypre_TFree(post_send_requests, HYPRE_MEMORY_HOST); hypre_TFree(post_send_statuses, HYPRE_MEMORY_HOST); for (i = 0; i < post_array_size; i++) { hypre_TFree(post_array[i], HYPRE_MEMORY_HOST); } hypre_TFree(post_array, HYPRE_MEMORY_HOST); } if (num_procs > 1) { hypre_TFree(term_requests, HYPRE_MEMORY_HOST); hypre_TFree(term_statuses, HYPRE_MEMORY_HOST); hypre_DestroyBinaryTree(tree); } /* output */ *p_response_recv_buf = response_recv_buf; *p_response_recv_buf_starts = response_recv_buf_starts; return hypre_error_flag; } hypre-2.33.0/src/utilities/exchange_data.h000066400000000000000000000047471477326011500204760ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #ifndef hypre_EXCHANGE_DATA_HEADER #define hypre_EXCHANGE_DATA_HEADER #define hypre_BinaryTreeParentId(tree) (tree->parent_id) #define hypre_BinaryTreeNumChild(tree) (tree->num_child) #define hypre_BinaryTreeChildIds(tree) (tree->child_id) #define hypre_BinaryTreeChildId(tree, i) (tree->child_id[i]) typedef struct { HYPRE_Int parent_id; HYPRE_Int num_child; HYPRE_Int *child_id; } hypre_BinaryTree; /* In the fill_response() function the user needs to set the recv__buf and the response_message_size. Memory of size send_response_storage has been alllocated for the send_buf (in exchange_data) - if more is needed, then realloc and adjust the send_response_storage. The realloc amount should be storage+overhead. If the response is an empty "confirmation" message, then set response_message_size =0 (and do not modify the send_buf) */ typedef struct { HYPRE_Int (*fill_response)(void* recv_buf, HYPRE_Int contact_size, HYPRE_Int contact_proc, void* response_obj, MPI_Comm comm, void** response_buf, HYPRE_Int* response_message_size); HYPRE_Int send_response_overhead; /*set by exchange data */ HYPRE_Int send_response_storage; /*storage allocated for send_response_buf*/ void *data1; /*data fields user may want to access in fill_response */ void *data2; } hypre_DataExchangeResponse; HYPRE_Int hypre_CreateBinaryTree(HYPRE_Int, HYPRE_Int, hypre_BinaryTree**); HYPRE_Int hypre_DestroyBinaryTree(hypre_BinaryTree*); HYPRE_Int hypre_DataExchangeList(HYPRE_Int num_contacts, HYPRE_Int *contact_proc_list, void *contact_send_buf, HYPRE_Int *contact_send_buf_starts, HYPRE_Int contact_obj_size, HYPRE_Int response_obj_size, hypre_DataExchangeResponse *response_obj, HYPRE_Int max_response_size, HYPRE_Int rnum, MPI_Comm comm, void **p_response_recv_buf, HYPRE_Int **p_response_recv_buf_starts); #endif /* end of header */ hypre-2.33.0/src/utilities/fortran.h000066400000000000000000000140031477326011500173600ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * Fortran <-> C interface macros * * Developers should only use the following in hypre: * hypre_F90_NAME() or hypre_F90_IFACE() * hypre_F90_NAME_BLAS() * hypre_F90_NAME_LAPACK() * any of the interface argument macros at the bottom of this file * *****************************************************************************/ #ifndef HYPRE_FORT_HEADER #define HYPRE_FORT_HEADER #include "_hypre_utilities.h" #ifdef __cplusplus extern "C" { #endif /*------------------------------------------------------- * Define specific name mangling macros to be used below *-------------------------------------------------------*/ #define hypre_F90_NAME_1(name,NAME) name #define hypre_F90_NAME_2(name,NAME) name##_ #define hypre_F90_NAME_3(name,NAME) name##__ #define hypre_F90_NAME_4(name,NAME) NAME #define hypre_F90_NAME_5(name,NAME) _##name##_ /*------------------------------------------------------- * Define hypre_F90_NAME and hypre_F90_IFACE *-------------------------------------------------------*/ #if (HYPRE_FMANGLE == 1) #define hypre_F90_NAME(name,NAME) hypre_F90_NAME_1(name,NAME) #elif (HYPRE_FMANGLE == 2) #define hypre_F90_NAME(name,NAME) hypre_F90_NAME_2(name,NAME) #elif (HYPRE_FMANGLE == 3) #define hypre_F90_NAME(name,NAME) hypre_F90_NAME_3(name,NAME) #elif (HYPRE_FMANGLE == 4) #define hypre_F90_NAME(name,NAME) hypre_F90_NAME_4(name,NAME) #elif (HYPRE_FMANGLE == 5) #define hypre_F90_NAME(name,NAME) hypre_F90_NAME_5(name,NAME) #elif defined(HYPRE_FC_FUNC_) /* HYPRE_FC_FUNC_ macro assumes underscores exist in name */ #define hypre_F90_NAME(name,NAME) HYPRE_FC_FUNC_(name,NAME) #else #define hypre_F90_NAME(name,NAME) hypre_F90_NAME_2(name,NAME) #endif #define hypre_F90_IFACE(name,NAME) hypre_F90_NAME(name,NAME) /*------------------------------------------------------- * Define hypre_F90_NAME_BLAS *-------------------------------------------------------*/ #ifdef HYPRE_USING_HYPRE_BLAS #define hypre_F90_NAME_BLAS(name,NAME) hypre_##name #elif (HYPRE_FMANGLE_BLAS == 1) #define hypre_F90_NAME_BLAS(name,NAME) hypre_F90_NAME_1(name,NAME) #elif (HYPRE_FMANGLE_BLAS == 2) #define hypre_F90_NAME_BLAS(name,NAME) hypre_F90_NAME_2(name,NAME) #elif (HYPRE_FMANGLE_BLAS == 3) #define hypre_F90_NAME_BLAS(name,NAME) hypre_F90_NAME_3(name,NAME) #elif (HYPRE_FMANGLE_BLAS == 4) #define hypre_F90_NAME_BLAS(name,NAME) hypre_F90_NAME_4(name,NAME) #elif (HYPRE_FMANGLE_BLAS == 5) #define hypre_F90_NAME_BLAS(name,NAME) hypre_F90_NAME_5(name,NAME) #elif defined(HYPRE_FC_FUNC) /* HYPRE_FC_FUNC macro assumes NO underscores exist in name */ #define hypre_F90_NAME_BLAS(name,NAME) HYPRE_FC_FUNC(name,NAME) #else #define hypre_F90_NAME_BLAS(name,NAME) hypre_F90_NAME_2(name,NAME) #endif /*------------------------------------------------------- * Define hypre_F90_NAME_LAPACK *-------------------------------------------------------*/ #ifdef HYPRE_USING_HYPRE_LAPACK #define hypre_F90_NAME_LAPACK(name,NAME) hypre_##name #elif (HYPRE_FMANGLE_LAPACK == 1) #define hypre_F90_NAME_LAPACK(name,NAME) hypre_F90_NAME_1(name,NAME) #elif (HYPRE_FMANGLE_LAPACK == 2) #define hypre_F90_NAME_LAPACK(name,NAME) hypre_F90_NAME_2(name,NAME) #elif (HYPRE_FMANGLE_LAPACK == 3) #define hypre_F90_NAME_LAPACK(name,NAME) hypre_F90_NAME_3(name,NAME) #elif (HYPRE_FMANGLE_LAPACK == 4) #define hypre_F90_NAME_LAPACK(name,NAME) hypre_F90_NAME_4(name,NAME) #elif (HYPRE_FMANGLE_LAPACK == 5) #define hypre_F90_NAME_LAPACK(name,NAME) hypre_F90_NAME_5(name,NAME) #elif defined(HYPRE_FC_FUNC) /* HYPRE_FC_FUNC macro assumes NO underscores exist in name */ #define hypre_F90_NAME_LAPACK(name,NAME) HYPRE_FC_FUNC(name,NAME) #else #define hypre_F90_NAME_LAPACK(name,NAME) hypre_F90_NAME_2(name,NAME) #endif /*------------------------------------------------------- * Define interface argument types and macros * * A Fortran communicator is always the size of an integer * and hence usually the size of hypre_int. *-------------------------------------------------------*/ typedef hypre_int hypre_F90_Comm; typedef HYPRE_Int hypre_F90_Int; typedef HYPRE_BigInt hypre_F90_BigInt; typedef HYPRE_Int hypre_F90_IntArray; typedef HYPRE_Int hypre_F90_IntArrayArray; typedef HYPRE_BigInt hypre_F90_BigIntArray; typedef HYPRE_BigInt hypre_F90_BigIntArrayArray; typedef HYPRE_Real hypre_F90_Real; typedef HYPRE_Real hypre_F90_RealArray; typedef HYPRE_Complex hypre_F90_Complex; typedef HYPRE_Complex hypre_F90_ComplexArray; typedef HYPRE_Int *hypre_F90_Obj; typedef HYPRE_Int *hypre_F90_ObjRef; #define hypre_F90_PassComm(arg) (hypre_MPI_Comm_f2c(*arg)) #define hypre_F90_PassInt(arg) ((HYPRE_Int) *arg) #define hypre_F90_PassIntRef(arg) ((HYPRE_Int *) arg) #define hypre_F90_PassIntArray(arg) ((HYPRE_Int *) arg) #define hypre_F90_PassIntArrayArray(arg) ((HYPRE_Int **) arg) #define hypre_F90_PassBigInt(arg) ((HYPRE_BigInt) *arg) #define hypre_F90_PassBigIntRef(arg) ((HYPRE_BigInt *) arg) #define hypre_F90_PassBigIntArray(arg) ((HYPRE_BigInt *) arg) #define hypre_F90_PassBigIntArrayArray(arg) ((HYPRE_BigInt **) arg) #define hypre_F90_PassReal(arg) ((HYPRE_Real) *arg) #define hypre_F90_PassRealRef(arg) ((HYPRE_Real *) arg) #define hypre_F90_PassRealArray(arg) ((HYPRE_Real *) arg) #define hypre_F90_PassComplex(arg) ((HYPRE_Complex) *arg) #define hypre_F90_PassComplexRef(arg) ((HYPRE_Complex *) arg) #define hypre_F90_PassComplexArray(arg) ((HYPRE_Complex *) arg) #define hypre_F90_PassObj(obj,arg) ((obj) *arg) #define hypre_F90_PassObjRef(obj,arg) ((obj *) arg) #ifdef __cplusplus } #endif #endif hypre-2.33.0/src/utilities/fortran_matrix.c000066400000000000000000000376241477326011500207550ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include #include #include #include "fortran_matrix.h" #include "_hypre_utilities.h" utilities_FortranMatrix* utilities_FortranMatrixCreate(void) { utilities_FortranMatrix* mtx; mtx = hypre_TAlloc(utilities_FortranMatrix, 1, HYPRE_MEMORY_HOST); hypre_assert( mtx != NULL ); mtx->globalHeight = 0; mtx->height = 0; mtx->width = 0; mtx->value = NULL; mtx->ownsValues = 0; return mtx; } void utilities_FortranMatrixAllocateData( HYPRE_BigInt h, HYPRE_BigInt w, utilities_FortranMatrix* mtx ) { hypre_assert( h > 0 && w > 0 ); hypre_assert( mtx != NULL ); if ( mtx->value != NULL && mtx->ownsValues ) { hypre_TFree( mtx->value, HYPRE_MEMORY_HOST); } mtx->value = hypre_CTAlloc(HYPRE_Real, h * w, HYPRE_MEMORY_HOST); hypre_assert ( mtx->value != NULL ); mtx->globalHeight = h; mtx->height = h; mtx->width = w; mtx->ownsValues = 1; } void utilities_FortranMatrixWrap( HYPRE_Real* v, HYPRE_BigInt gh, HYPRE_BigInt h, HYPRE_BigInt w, utilities_FortranMatrix* mtx ) { hypre_assert( h > 0 && w > 0 ); hypre_assert( mtx != NULL ); if ( mtx->value != NULL && mtx->ownsValues ) { hypre_TFree( mtx->value, HYPRE_MEMORY_HOST); } mtx->value = v; hypre_assert ( mtx->value != NULL ); mtx->globalHeight = gh; mtx->height = h; mtx->width = w; mtx->ownsValues = 0; } void utilities_FortranMatrixDestroy( utilities_FortranMatrix* mtx ) { if ( mtx == NULL ) { return; } if ( mtx->ownsValues && mtx->value != NULL ) { hypre_TFree(mtx->value, HYPRE_MEMORY_HOST); } hypre_TFree(mtx, HYPRE_MEMORY_HOST); } HYPRE_BigInt utilities_FortranMatrixGlobalHeight( utilities_FortranMatrix* mtx ) { hypre_assert( mtx != NULL ); return mtx->globalHeight; } HYPRE_BigInt utilities_FortranMatrixHeight( utilities_FortranMatrix* mtx ) { hypre_assert( mtx != NULL ); return mtx->height; } HYPRE_BigInt utilities_FortranMatrixWidth( utilities_FortranMatrix* mtx ) { hypre_assert( mtx != NULL ); return mtx->width; } HYPRE_Real* utilities_FortranMatrixValues( utilities_FortranMatrix* mtx ) { hypre_assert( mtx != NULL ); return mtx->value; } void utilities_FortranMatrixClear( utilities_FortranMatrix* mtx ) { HYPRE_BigInt i, j, h, w, jump; HYPRE_Real* p; hypre_assert( mtx != NULL ); h = mtx->height; w = mtx->width; jump = mtx->globalHeight - h; for ( j = 0, p = mtx->value; j < w; j++ ) { for ( i = 0; i < h; i++, p++ ) { *p = 0.0; } p += jump; } } void utilities_FortranMatrixClearL( utilities_FortranMatrix* mtx ) { HYPRE_BigInt i, j, k, h, w, jump; HYPRE_Real* p; hypre_assert( mtx != NULL ); h = mtx->height; w = mtx->width; if ( w > h ) { w = h; } jump = mtx->globalHeight - h; for ( j = 0, p = mtx->value; j < w - 1; j++ ) { k = j + 1; p += k; for ( i = k; i < h; i++, p++ ) { *p = 0.0; } p += jump; } } void utilities_FortranMatrixSetToIdentity( utilities_FortranMatrix* mtx ) { HYPRE_BigInt j, h, w, jump; HYPRE_Real* p; hypre_assert( mtx != NULL ); utilities_FortranMatrixClear( mtx ); h = mtx->height; w = mtx->width; jump = mtx->globalHeight; for ( j = 0, p = mtx->value; j < w && j < h; j++, p += jump ) { *p++ = 1.0; } } void utilities_FortranMatrixTransposeSquare( utilities_FortranMatrix* mtx ) { HYPRE_BigInt i, j, g, h, w, jump; HYPRE_Real* p; HYPRE_Real* q; HYPRE_Real tmp; hypre_assert( mtx != NULL ); g = mtx->globalHeight; h = mtx->height; w = mtx->width; hypre_assert( h == w ); jump = mtx->globalHeight - h; for ( j = 0, p = mtx->value; j < w; j++ ) { q = p; p++; q += g; for ( i = j + 1; i < h; i++, p++, q += g ) { tmp = *p; *p = *q; *q = tmp; } p += ++jump; } } void utilities_FortranMatrixSymmetrize( utilities_FortranMatrix* mtx ) { HYPRE_BigInt i, j, g, h, w, jump; HYPRE_Real* p; HYPRE_Real* q; hypre_assert( mtx != NULL ); g = mtx->globalHeight; h = mtx->height; w = mtx->width; hypre_assert( h == w ); jump = mtx->globalHeight - h; for ( j = 0, p = mtx->value; j < w; j++ ) { q = p; p++; q += g; for ( i = j + 1; i < h; i++, p++, q += g ) { *p = *q = (*p + *q) * 0.5; } p += ++jump; } } void utilities_FortranMatrixCopy( utilities_FortranMatrix* src, HYPRE_Int t, utilities_FortranMatrix* dest ) { HYPRE_BigInt i, j, h, w; HYPRE_BigInt jp, jq, jr; HYPRE_Real* p; HYPRE_Real* q; HYPRE_Real* r; hypre_assert( src != NULL && dest != NULL ); h = dest->height; w = dest->width; jp = dest->globalHeight - h; if ( t == 0 ) { hypre_assert( src->height == h && src->width == w ); jq = 1; jr = src->globalHeight; } else { hypre_assert( src->height == w && src->width == h ); jr = 1; jq = src->globalHeight; } for ( j = 0, p = dest->value, r = src->value; j < w; j++, p += jp, r += jr ) for ( i = 0, q = r; i < h; i++, p++, q += jq ) { *p = *q; } } void utilities_FortranMatrixIndexCopy( HYPRE_Int* index, utilities_FortranMatrix* src, HYPRE_Int t, utilities_FortranMatrix* dest ) { HYPRE_BigInt i, j, h, w; HYPRE_BigInt jp, jq, jr; HYPRE_Real* p; HYPRE_Real* q; HYPRE_Real* r; hypre_assert( src != NULL && dest != NULL ); h = dest->height; w = dest->width; jp = dest->globalHeight - h; if ( t == 0 ) { hypre_assert( src->height == h && src->width == w ); jq = 1; jr = src->globalHeight; } else { hypre_assert( src->height == w && src->width == h ); jr = 1; jq = src->globalHeight; } for ( j = 0, p = dest->value; j < w; j++, p += jp ) { r = src->value + (index[j] - 1) * jr; for ( i = 0, q = r; i < h; i++, p++, q += jq ) { *p = *q; } } } void utilities_FortranMatrixSetDiagonal( utilities_FortranMatrix* mtx, utilities_FortranMatrix* vec ) { HYPRE_BigInt j, h, w, jump; HYPRE_Real* p; HYPRE_Real* q; hypre_assert( mtx != NULL && vec != NULL ); h = mtx->height; w = mtx->width; hypre_assert( vec->height >= h ); jump = mtx->globalHeight + 1; for ( j = 0, p = mtx->value, q = vec->value; j < w && j < h; j++, p += jump, q++ ) { *p = *q; } } void utilities_FortranMatrixGetDiagonal( utilities_FortranMatrix* mtx, utilities_FortranMatrix* vec ) { HYPRE_BigInt j, h, w, jump; HYPRE_Real* p; HYPRE_Real* q; hypre_assert( mtx != NULL && vec != NULL ); h = mtx->height; w = mtx->width; hypre_assert( vec->height >= h ); jump = mtx->globalHeight + 1; for ( j = 0, p = mtx->value, q = vec->value; j < w && j < h; j++, p += jump, q++ ) { *q = *p; } } void utilities_FortranMatrixAdd( HYPRE_Real a, utilities_FortranMatrix* mtxA, utilities_FortranMatrix* mtxB, utilities_FortranMatrix* mtxC ) { HYPRE_BigInt i, j, h, w, jA, jB, jC; HYPRE_Real *pA; HYPRE_Real *pB; HYPRE_Real *pC; hypre_assert( mtxA != NULL && mtxB != NULL && mtxC != NULL ); h = mtxA->height; w = mtxA->width; hypre_assert( mtxB->height == h && mtxB->width == w ); hypre_assert( mtxC->height == h && mtxC->width == w ); jA = mtxA->globalHeight - h; jB = mtxB->globalHeight - h; jC = mtxC->globalHeight - h; pA = mtxA->value; pB = mtxB->value; pC = mtxC->value; if ( a == 0.0 ) { for ( j = 0; j < w; j++ ) { for ( i = 0; i < h; i++, pA++, pB++, pC++ ) { *pC = *pB; } pA += jA; pB += jB; pC += jC; } } else if ( a == 1.0 ) { for ( j = 0; j < w; j++ ) { for ( i = 0; i < h; i++, pA++, pB++, pC++ ) { *pC = *pA + *pB; } pA += jA; pB += jB; pC += jC; } } else if ( a == -1.0 ) { for ( j = 0; j < w; j++ ) { for ( i = 0; i < h; i++, pA++, pB++, pC++ ) { *pC = *pB - *pA; } pA += jA; pB += jB; pC += jC; } } else { for ( j = 0; j < w; j++ ) { for ( i = 0; i < h; i++, pA++, pB++, pC++ ) { *pC = *pA * a + *pB; } pA += jA; pB += jB; pC += jC; } } } void utilities_FortranMatrixDMultiply( utilities_FortranMatrix* vec, utilities_FortranMatrix* mtx ) { HYPRE_BigInt i, j, h, w, jump; HYPRE_Real* p; HYPRE_Real* q; hypre_assert( mtx != NULL && vec != NULL ); h = mtx->height; w = mtx->width; hypre_assert( vec->height == h ); jump = mtx->globalHeight - h; for ( j = 0, p = mtx->value; j < w; j++ ) { for ( i = 0, q = vec->value; i < h; i++, p++, q++ ) { *p = *p * (*q); } p += jump; } } void utilities_FortranMatrixMultiplyD( utilities_FortranMatrix* mtx, utilities_FortranMatrix* vec ) { HYPRE_BigInt i, j, h, w, jump; HYPRE_Real* p; HYPRE_Real* q; hypre_assert( mtx != NULL && vec != NULL ); h = mtx->height; w = mtx->width; hypre_assert( vec->height == w ); jump = mtx->globalHeight - h; for ( j = 0, q = vec->value, p = mtx->value; j < w; j++, q++ ) { for ( i = 0; i < h; i++, p++) { *p = *p * (*q); } p += jump; } } void utilities_FortranMatrixMultiply( utilities_FortranMatrix* mtxA, HYPRE_Int tA, utilities_FortranMatrix* mtxB, HYPRE_Int tB, utilities_FortranMatrix* mtxC ) { HYPRE_BigInt h, w; HYPRE_BigInt i, j, k, l; HYPRE_BigInt iA, kA; HYPRE_BigInt kB, jB; HYPRE_BigInt iC, jC; HYPRE_Real* pAi0; HYPRE_Real* pAik; HYPRE_Real* pB0j; HYPRE_Real* pBkj; HYPRE_Real* pC0j; HYPRE_Real* pCij; HYPRE_Real s; hypre_assert( mtxA != NULL && mtxB != NULL && mtxC != NULL ); h = mtxC->height; w = mtxC->width; iC = 1; jC = mtxC->globalHeight; if ( tA == 0 ) { hypre_assert( mtxA->height == h ); l = mtxA->width; iA = 1; kA = mtxA->globalHeight; } else { l = mtxA->height; hypre_assert( mtxA->width == h ); kA = 1; iA = mtxA->globalHeight; } if ( tB == 0 ) { hypre_assert( mtxB->height == l ); hypre_assert( mtxB->width == w ); kB = 1; jB = mtxB->globalHeight; } else { hypre_assert( mtxB->width == l ); hypre_assert( mtxB->height == w ); jB = 1; kB = mtxB->globalHeight; } for ( j = 0, pB0j = mtxB->value, pC0j = mtxC->value; j < w; j++, pB0j += jB, pC0j += jC ) for ( i = 0, pCij = pC0j, pAi0 = mtxA->value; i < h; i++, pCij += iC, pAi0 += iA ) { s = 0.0; for ( k = 0, pAik = pAi0, pBkj = pB0j; k < l; k++, pAik += kA, pBkj += kB ) { s += *pAik * (*pBkj); } *pCij = s; } } HYPRE_Real utilities_FortranMatrixFNorm( utilities_FortranMatrix* mtx ) { HYPRE_BigInt i, j, h, w, jump; HYPRE_Real* p; HYPRE_Real norm; hypre_assert( mtx != NULL ); h = mtx->height; w = mtx->width; jump = mtx->globalHeight - h; norm = 0.0; for ( j = 0, p = mtx->value; j < w; j++ ) { for ( i = 0; i < h; i++, p++ ) { norm += (*p) * (*p); } p += jump; } norm = hypre_sqrt(norm); return norm; } HYPRE_Real utilities_FortranMatrixValue( utilities_FortranMatrix* mtx, HYPRE_BigInt i, HYPRE_BigInt j ) { HYPRE_BigInt k; hypre_assert( mtx != NULL ); hypre_assert( 1 <= i && i <= mtx->height ); hypre_assert( 1 <= j && j <= mtx->width ); k = i - 1 + (j - 1) * mtx->globalHeight; return mtx->value[k]; } HYPRE_Real* utilities_FortranMatrixValuePtr( utilities_FortranMatrix* mtx, HYPRE_BigInt i, HYPRE_BigInt j ) { HYPRE_BigInt k; hypre_assert( mtx != NULL ); hypre_assert( 1 <= i && i <= mtx->height ); hypre_assert( 1 <= j && j <= mtx->width ); k = i - 1 + (j - 1) * mtx->globalHeight; return mtx->value + k; } HYPRE_Real utilities_FortranMatrixMaxValue( utilities_FortranMatrix* mtx ) { HYPRE_BigInt i, j, jump; HYPRE_BigInt h, w; HYPRE_Real* p; HYPRE_Real maxVal; hypre_assert( mtx != NULL ); h = mtx->height; w = mtx->width; jump = mtx->globalHeight - h; maxVal = mtx->value[0]; for ( j = 0, p = mtx->value; j < w; j++ ) { for ( i = 0; i < h; i++, p++ ) if ( *p > maxVal ) { maxVal = *p; } p += jump; } return maxVal; } void utilities_FortranMatrixSelectBlock( utilities_FortranMatrix* mtx, HYPRE_BigInt iFrom, HYPRE_BigInt iTo, HYPRE_BigInt jFrom, HYPRE_BigInt jTo, utilities_FortranMatrix* block ) { if ( block->value != NULL && block->ownsValues ) { hypre_TFree( block->value, HYPRE_MEMORY_HOST); } block->globalHeight = mtx->globalHeight; if ( iTo < iFrom || jTo < jFrom ) { block->height = 0; block->width = 0; block->value = NULL; return; } block->height = iTo - iFrom + 1; block->width = jTo - jFrom + 1; block->value = mtx->value + iFrom - 1 + (jFrom - 1) * mtx->globalHeight; block->ownsValues = 0; } void utilities_FortranMatrixUpperInv( utilities_FortranMatrix* u ) { HYPRE_BigInt i, j, k; HYPRE_BigInt n, jc, jd; HYPRE_Real v; HYPRE_Real* diag; /* diag(i) = u(i,i)_original */ HYPRE_Real* pin; /* &u(i-1,n) */ HYPRE_Real* pii; /* &u(i,i) */ HYPRE_Real* pij; /* &u(i,j) */ HYPRE_Real* pik; /* &u(i,k) */ HYPRE_Real* pkj; /* &u(k,j) */ HYPRE_Real* pd; /* &diag(i) */ n = u->height; hypre_assert( u->width == n ); diag = hypre_CTAlloc(HYPRE_Real, n, HYPRE_MEMORY_HOST); hypre_assert( diag != NULL ); jc = u->globalHeight; jd = jc + 1; pii = u->value; pd = diag; for ( i = 0; i < n; i++, pii += jd, pd++ ) { v = *pd = *pii; *pii = 1.0 / v; } pii -= jd; pin = pii - 1; pii -= jd; pd -= 2; for ( i = n - 1; i > 0; i--, pii -= jd, pin--, pd-- ) { pij = pin; for ( j = n; j > i; j--, pij -= jc ) { v = 0; pik = pii + jc; pkj = pij + 1; for ( k = i + 1; k <= j; k++, pik += jc, pkj++ ) { v -= (*pik) * (*pkj); } *pij = v / (*pd); } } hypre_TFree( diag, HYPRE_MEMORY_HOST); } HYPRE_Int utilities_FortranMatrixPrint( utilities_FortranMatrix* mtx, const char *fileName) { HYPRE_BigInt i, j, h, w, jump; HYPRE_Real* p; FILE* fp; hypre_assert( mtx != NULL ); if ( !(fp = fopen(fileName, "w")) ) { return 1; } h = mtx->height; w = mtx->width; hypre_fprintf(fp, "%ld\n", h); hypre_fprintf(fp, "%ld\n", w); jump = mtx->globalHeight - h; for ( j = 0, p = mtx->value; j < w; j++ ) { for ( i = 0; i < h; i++, p++ ) { hypre_fprintf(fp, "%.14e\n", *p); } p += jump; } fclose(fp); return 0; } hypre-2.33.0/src/utilities/fortran_matrix.h000066400000000000000000000077131477326011500207560ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #ifndef FORTRAN_STYLE_MATRIX #define FORTRAN_STYLE_MATRIX #include "HYPRE_utilities.h" typedef struct { HYPRE_BigInt globalHeight; HYPRE_BigInt height; HYPRE_BigInt width; HYPRE_Real* value; HYPRE_Int ownsValues; } utilities_FortranMatrix; #ifdef __cplusplus extern "C" { #endif utilities_FortranMatrix* utilities_FortranMatrixCreate(void); void utilities_FortranMatrixAllocateData( HYPRE_BigInt h, HYPRE_BigInt w, utilities_FortranMatrix* mtx ); void utilities_FortranMatrixWrap( HYPRE_Real*, HYPRE_BigInt gh, HYPRE_BigInt h, HYPRE_BigInt w, utilities_FortranMatrix* mtx ); void utilities_FortranMatrixDestroy( utilities_FortranMatrix* mtx ); HYPRE_BigInt utilities_FortranMatrixGlobalHeight( utilities_FortranMatrix* mtx ); HYPRE_BigInt utilities_FortranMatrixHeight( utilities_FortranMatrix* mtx ); HYPRE_BigInt utilities_FortranMatrixWidth( utilities_FortranMatrix* mtx ); HYPRE_Real* utilities_FortranMatrixValues( utilities_FortranMatrix* mtx ); void utilities_FortranMatrixClear( utilities_FortranMatrix* mtx ); void utilities_FortranMatrixClearL( utilities_FortranMatrix* mtx ); void utilities_FortranMatrixSetToIdentity( utilities_FortranMatrix* mtx ); void utilities_FortranMatrixTransposeSquare( utilities_FortranMatrix* mtx ); void utilities_FortranMatrixSymmetrize( utilities_FortranMatrix* mtx ); void utilities_FortranMatrixCopy( utilities_FortranMatrix* src, HYPRE_Int t, utilities_FortranMatrix* dest ); void utilities_FortranMatrixIndexCopy( HYPRE_Int* index, utilities_FortranMatrix* src, HYPRE_Int t, utilities_FortranMatrix* dest ); void utilities_FortranMatrixSetDiagonal( utilities_FortranMatrix* mtx, utilities_FortranMatrix* d ); void utilities_FortranMatrixGetDiagonal( utilities_FortranMatrix* mtx, utilities_FortranMatrix* d ); void utilities_FortranMatrixAdd( HYPRE_Real a, utilities_FortranMatrix* mtxA, utilities_FortranMatrix* mtxB, utilities_FortranMatrix* mtxC ); void utilities_FortranMatrixDMultiply( utilities_FortranMatrix* d, utilities_FortranMatrix* mtx ); void utilities_FortranMatrixMultiplyD( utilities_FortranMatrix* mtx, utilities_FortranMatrix* d ); void utilities_FortranMatrixMultiply( utilities_FortranMatrix* mtxA, HYPRE_Int tA, utilities_FortranMatrix* mtxB, HYPRE_Int tB, utilities_FortranMatrix* mtxC ); HYPRE_Real utilities_FortranMatrixFNorm( utilities_FortranMatrix* mtx ); HYPRE_Real utilities_FortranMatrixValue( utilities_FortranMatrix* mtx, HYPRE_BigInt i, HYPRE_BigInt j ); HYPRE_Real* utilities_FortranMatrixValuePtr( utilities_FortranMatrix* mtx, HYPRE_BigInt i, HYPRE_BigInt j ); HYPRE_Real utilities_FortranMatrixMaxValue( utilities_FortranMatrix* mtx ); void utilities_FortranMatrixSelectBlock( utilities_FortranMatrix* mtx, HYPRE_BigInt iFrom, HYPRE_BigInt iTo, HYPRE_BigInt jFrom, HYPRE_BigInt jTo, utilities_FortranMatrix* block ); void utilities_FortranMatrixUpperInv( utilities_FortranMatrix* u ); HYPRE_Int utilities_FortranMatrixPrint( utilities_FortranMatrix* mtx, const char *fileName); #ifdef __cplusplus } #endif #endif /* FORTRAN_STYLE_MATRIX */ hypre-2.33.0/src/utilities/functors.h000066400000000000000000000054261477326011500175610ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #ifndef HYPRE_FUNCTORS_H #define HYPRE_FUNCTORS_H #if defined(HYPRE_USING_CUDA) || defined(HYPRE_USING_HIP) /*-------------------------------------------------------------------------- * hypreFunctor_DenseMatrixIdentity * * Functor for generating a dense identity matrix. * This assumes that the input array "a" is zeros everywhere *--------------------------------------------------------------------------*/ struct hypreFunctor_DenseMatrixIdentity { HYPRE_Int n_; HYPRE_Real *a_; hypreFunctor_DenseMatrixIdentity(HYPRE_Int n, HYPRE_Real *a) { n_ = n; a_ = a; } __host__ __device__ void operator()(HYPRE_Int i) { a_[i * n_ + i] = 1.0; } }; /*-------------------------------------------------------------------------- * hypreFunctor_ArrayStridedAccess * * Functor for performing strided data access on a templated array. * * The stride interval "s_" is used to access every "s_"-th element * from the source array "a_". * * It is templated to support various data types for the array. *--------------------------------------------------------------------------*/ template struct hypreFunctor_ArrayStridedAccess { HYPRE_Int s_; T *a_; hypreFunctor_ArrayStridedAccess(HYPRE_Int s, T *a) : s_(s), a_(a) {} __host__ __device__ T operator()(HYPRE_Int i) { return a_[i * s_]; } }; /*-------------------------------------------------------------------------- * hypreFunctor_IndexStrided * * This functor multiplies a given index "i" by a specified stride "s_". * * It is templated to support various data types for the index and stride. *--------------------------------------------------------------------------*/ template struct hypreFunctor_IndexStrided { T s_; hypreFunctor_IndexStrided(T s) : s_(s) {} __host__ __device__ T operator()(const T i) const { return i * s_; } }; /*-------------------------------------------------------------------------- * hypreFunctor_IndexCycle *--------------------------------------------------------------------------*/ struct hypreFunctor_IndexCycle { HYPRE_Int cycle_length; hypreFunctor_IndexCycle(HYPRE_Int _cycle_length) : cycle_length(_cycle_length) {} __host__ __device__ HYPRE_Int operator()(HYPRE_Int i) const { return i % cycle_length; } }; #endif /* if defined(HYPRE_USING_CUDA) || defined(HYPRE_USING_HIP) */ #endif /* ifndef HYPRE_FUNCTORS_H */ hypre-2.33.0/src/utilities/general.c000066400000000000000000000407771477326011500173360ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "_hypre_utilities.h" #include "_hypre_utilities.hpp" /* global variable _hypre_handle: * Outside this file, do NOT access it directly, * but use hypre_handle() instead (see handle.h) */ hypre_Handle *_hypre_handle = NULL; /* accessor to the global ``_hypre_handle'' */ hypre_Handle* hypre_handle(void) { if (!_hypre_handle) { hypre_error_w_msg(HYPRE_ERROR_GENERIC, "ERROR - _hypre_handle is not initialized. Calling HYPRE_Initialize(). All HYPRE_* or hypre_* function calls should occur between HYPRE_Initialize() and HYPRE_Finalize().\n"); HYPRE_Initialize(); } return _hypre_handle; } hypre_Handle* hypre_HandleCreate(void) { /* Note: this allocation is done directly with calloc in order to avoid a segmentation fault when building with HYPRE_USING_UMPIRE_HOST */ hypre_Handle *hypre_handle_ = (hypre_Handle*) calloc(1, sizeof(hypre_Handle)); hypre_HandleLogLevel(hypre_handle_) = 0; hypre_HandleMemoryLocation(hypre_handle_) = HYPRE_MEMORY_DEVICE; #if defined(HYPRE_USING_GPU) || defined(HYPRE_USING_DEVICE_OPENMP) hypre_HandleDefaultExecPolicy(hypre_handle_) = HYPRE_EXEC_DEVICE; #endif #if defined(HYPRE_USING_GPU) hypre_HandleDeviceData(hypre_handle_) = hypre_DeviceDataCreate(); /* Gauss-Seidel: SpTrSV */ hypre_HandleDeviceGSMethod(hypre_handle_) = 1; /* CPU: 0; Cusparse: 1 */ #endif #if defined(HYPRE_USING_GPU) || defined(HYPRE_USING_DEVICE_OPENMP) #if defined(HYPRE_USING_GPU_AWARE_MPI) hypre_HandleUseGpuAwareMPI(hypre_handle_) = 1; #else hypre_HandleUseGpuAwareMPI(hypre_handle_) = 0; #endif #endif return hypre_handle_; } HYPRE_Int hypre_HandleDestroy(hypre_Handle *hypre_handle_) { if (!hypre_handle_) { return hypre_error_flag; } hypre_TFree(hypre_HandleStructCommRecvBuffer(hypre_handle_), HYPRE_MEMORY_DEVICE); hypre_TFree(hypre_HandleStructCommSendBuffer(hypre_handle_), HYPRE_MEMORY_DEVICE); #if defined(HYPRE_USING_GPU) hypre_DeviceDataDestroy(hypre_HandleDeviceData(hypre_handle_)); hypre_HandleDeviceData(hypre_handle_) = NULL; #endif /* Deallocate error messages in error handler */ hypre_error_handler_clear_messages(); /* Note: Directly using free since this variable was allocated with calloc */ free((void*) hypre_handle_); return hypre_error_flag; } HYPRE_Int hypre_SetDevice(hypre_int device_id, hypre_Handle *hypre_handle_) { #if defined(HYPRE_USING_DEVICE_OPENMP) omp_set_default_device(device_id); #elif defined(HYPRE_USING_CUDA) HYPRE_CUDA_CALL( cudaSetDevice(device_id) ); hypre_HandleDevice(hypre_handle_) = device_id; #elif defined(HYPRE_USING_HIP) HYPRE_HIP_CALL( hipSetDevice(device_id) ); hypre_HandleDevice(hypre_handle_) = device_id; #elif defined(HYPRE_USING_SYCL) if (hypre_handle_) { if (!hypre_HandleDevice(hypre_handle_)) { /* Note: this enforces "explicit scaling," i.e. we treat each tile of a multi-tile GPU as a separate device */ sycl::platform platform(sycl::gpu_selector_v); auto gpu_devices = platform.get_devices(sycl::info::device_type::gpu); hypre_int n_devices = 0; hypre_GetDeviceCount(&n_devices); if (device_id >= n_devices) { hypre_error_w_msg(HYPRE_ERROR_GENERIC, "ERROR: SYCL device-ID exceed the number of devices on-node\n"); } hypre_int local_n_devices = 0; hypre_int i; for (i = 0; i < gpu_devices.size(); i++) { if (local_n_devices == device_id) { hypre_HandleDevice(hypre_handle_) = new sycl::device(gpu_devices[i]); } local_n_devices++; } } hypre_DeviceDataDeviceMaxWorkGroupSize(hypre_HandleDeviceData(hypre_handle_)) = hypre_DeviceDataDevice(hypre_HandleDeviceData( hypre_handle_))->get_info(); } #else HYPRE_UNUSED_VAR(device_id); HYPRE_UNUSED_VAR(hypre_handle_); #endif return hypre_error_flag; } HYPRE_Int hypre_GetDeviceMaxShmemSize(hypre_int device_id, hypre_int *max_size_ptr, hypre_int *max_size_optin_ptr) { hypre_int max_size = 0, max_size_optin = 0; #if defined(HYPRE_USING_GPU) hypre_Handle *handle = hypre_handle(); if (!hypre_HandleDeviceMaxShmemPerBlockInited(handle)) { if (device_id == -1) { hypre_GetDevice(&device_id); } #if defined(HYPRE_USING_CUDA) HYPRE_CUDA_CALL(cudaDeviceGetAttribute( &max_size, cudaDevAttrMaxSharedMemoryPerBlock, device_id)); HYPRE_CUDA_CALL(cudaDeviceGetAttribute( &max_size_optin, cudaDevAttrMaxSharedMemoryPerBlockOptin, device_id)); #elif defined(HYPRE_USING_HIP) HYPRE_HIP_CALL(hipDeviceGetAttribute( &max_size, hipDeviceAttributeMaxSharedMemoryPerBlock, device_id)); #elif defined(HYPRE_USING_SYCL) auto device = *hypre_HandleDevice(hypre_handle()); max_size = device.get_info(); #endif hypre_HandleDeviceMaxShmemPerBlock(handle)[0] = max_size; hypre_HandleDeviceMaxShmemPerBlock(handle)[1] = max_size_optin; hypre_HandleDeviceMaxShmemPerBlockInited(handle) = 1; } if (max_size_ptr) { *max_size_ptr = hypre_HandleDeviceMaxShmemPerBlock(handle)[0]; } if (max_size_optin_ptr) { *max_size_optin_ptr = hypre_HandleDeviceMaxShmemPerBlock(handle)[1]; } #else /* not HYPRE_USING_GPU */ HYPRE_UNUSED_VAR(device_id); if (max_size_ptr) { *max_size_ptr = max_size; } if (max_size_optin_ptr) { *max_size_optin_ptr = max_size_optin; } #endif return hypre_error_flag; } /* Note: it doesn't return device_id in hypre_Handle->hypre_DeviceData, * calls API instead. But these two should match at all times */ HYPRE_Int hypre_GetDevice(hypre_int *device_id) { #if defined(HYPRE_USING_DEVICE_OPENMP) *device_id = omp_get_default_device(); #elif defined(HYPRE_USING_CUDA) HYPRE_CUDA_CALL( cudaGetDevice(device_id) ); #elif defined(HYPRE_USING_HIP) HYPRE_HIP_CALL( hipGetDevice(device_id) ); #elif defined(HYPRE_USING_SYCL) /* Note - no sycl call to get which device is setup for use (if the user has already setup a device at all) * Assume the rank/device binding below */ HYPRE_Int my_id; hypre_int n_devices; hypre_MPI_Comm_rank(hypre_MPI_COMM_WORLD, &my_id); hypre_GetDeviceCount(&n_devices); (*device_id) = my_id % n_devices; #else *device_id = 0; #endif return hypre_error_flag; } HYPRE_Int hypre_GetDeviceCount(hypre_int *device_count) { #if defined(HYPRE_USING_DEVICE_OPENMP) *device_count = omp_get_num_devices(); #elif defined(HYPRE_USING_CUDA) HYPRE_CUDA_CALL( cudaGetDeviceCount(device_count) ); #elif defined(HYPRE_USING_HIP) HYPRE_HIP_CALL( hipGetDeviceCount(device_count) ); #elif defined(HYPRE_USING_SYCL) (*device_count) = 0; sycl::platform platform(sycl::gpu_selector_v); auto const& gpu_devices = platform.get_devices(sycl::info::device_type::gpu); HYPRE_Int i; for (i = 0; i < gpu_devices.size(); i++) { (*device_count)++; } #else *device_count = 0; #endif return hypre_error_flag; } HYPRE_Int hypre_GetDeviceLastError(void) { #if defined(HYPRE_USING_CUDA) HYPRE_CUDA_CALL( cudaGetLastError() ); #elif defined(HYPRE_USING_HIP) HYPRE_HIP_CALL( hipGetLastError() ); #elif defined(HYPRE_USING_SYCL) try { hypre_HandleComputeStream(hypre_handle())->wait_and_throw(); } catch (sycl::exception const& e) { std::cout << "Caught synchronous SYCL exception:\n" << e.what() << std::endl; } #endif return hypre_error_flag; } /****************************************************************************** * * hypre initialization * *****************************************************************************/ HYPRE_Int HYPRE_DeviceInitialize(void) { #if defined(HYPRE_USING_GPU) || defined(HYPRE_USING_DEVICE_OPENMP) hypre_Handle *handle = hypre_handle(); #if !defined(HYPRE_USING_SYCL) /* With sycl, cannot call hypre_GetDeviceLastError() until after device and queue setup */ hypre_GetDeviceLastError(); #endif /* Notice: the cudaStream created is specific to the device * that was in effect when you created the stream. * So, we should first set the device and create the streams */ hypre_int device_id; hypre_GetDevice(&device_id); hypre_SetDevice(device_id, handle); hypre_GetDeviceMaxShmemSize(device_id, NULL, NULL); #if defined(HYPRE_USING_DEVICE_MALLOC_ASYNC) cudaMemPool_t mempool; cudaDeviceGetDefaultMemPool(&mempool, device_id); uint64_t threshold = UINT64_MAX; cudaMemPoolSetAttribute(mempool, cudaMemPoolAttrReleaseThreshold, &threshold); #endif /* To include the cost of creating streams/cudahandles in HYPRE_Init */ /* If not here, will be done at the first use */ #if defined(HYPRE_USING_CUDA_STREAMS) hypre_HandleComputeStream(handle); #endif /* A separate stream for prefetching */ //hypre_HandleCudaPrefetchStream(handle); #if defined(HYPRE_USING_CUBLAS) hypre_HandleCublasHandle(handle); #endif #if defined(HYPRE_USING_CUSPARSE) || defined(HYPRE_USING_ROCSPARSE) hypre_HandleCusparseHandle(handle); #endif #if defined(HYPRE_USING_CURAND) || defined(HYPRE_USING_ROCRAND) hypre_HandleCurandGenerator(handle); #endif #if defined(HYPRE_USING_CUSOLVER) || defined(HYPRE_USING_ROCSOLVER) hypre_HandleVendorSolverHandle(handle); #endif /* Check if cuda arch flags in compiling match the device */ #if defined(HYPRE_USING_CUDA) && defined(HYPRE_DEBUG) hypre_CudaCompileFlagCheck(); #endif #if defined(HYPRE_USING_DEVICE_POOL) /* Keep this check here at the end of HYPRE_Initialize() * Make sure that device pool allocator has not been setup in HYPRE_Initialize, * otherwise users are not able to set all the parameters */ if ( hypre_HandleCubDevAllocator(handle) || hypre_HandleCubUvmAllocator(handle) ) { char msg[256]; hypre_sprintf(msg, "%s %s", "ERROR: device pool allocators have been created in", __func__); hypre_error_w_msg(-1, msg); } #endif #endif /* if defined(HYPRE_USING_GPU) || defined(HYPRE_USING_DEVICE_OPENMP) */ return hypre_error_flag; } HYPRE_Int HYPRE_Initialize(void) { /* Return if the hypre library is in initialized state */ if (hypre_Initialized()) { return hypre_error_flag; } #if defined(HYPRE_USING_MEMORY_TRACKER) if (!_hypre_memory_tracker) { _hypre_memory_tracker = hypre_MemoryTrackerCreate(); } #endif if (!_hypre_handle) { _hypre_handle = hypre_HandleCreate(); } #if defined(HYPRE_USING_DEVICE_OPENMP) HYPRE_OMPOffloadOn(); #endif #if defined(HYPRE_USING_UMPIRE) hypre_UmpireInit(_hypre_handle); #endif #if defined(HYPRE_USING_MAGMA) hypre_MagmaInitialize(); #endif /* Update library state */ hypre_SetInitialized(); return hypre_error_flag; } /****************************************************************************** * * hypre finalization * *****************************************************************************/ HYPRE_Int HYPRE_Finalize(void) { /* Return if the hypre library has already been finalized */ if (hypre_Finalized()) { return hypre_error_flag; } #if defined(HYPRE_USING_UMPIRE) hypre_UmpireFinalize(_hypre_handle); #endif #if defined(HYPRE_USING_MAGMA) hypre_MagmaFinalize(); #endif #if defined(HYPRE_USING_SYCL) /* With sycl, cannot call hypre_GetDeviceLastError() after destroying the handle, so do it here */ hypre_GetDeviceLastError(); #endif hypre_HandleDestroy(_hypre_handle); _hypre_handle = NULL; #if !defined(HYPRE_USING_SYCL) hypre_GetDeviceLastError(); #endif #if defined(HYPRE_USING_MEMORY_TRACKER) hypre_PrintMemoryTracker(hypre_total_bytes, hypre_peak_bytes, hypre_current_bytes, hypre_memory_tracker_print, hypre_memory_tracker_filename); hypre_MemoryTrackerDestroy(_hypre_memory_tracker); _hypre_memory_tracker = NULL; #endif /* Update library state */ hypre_SetFinalized(); return hypre_error_flag; } HYPRE_Int HYPRE_PrintDeviceInfo(void) { #if defined(HYPRE_USING_GPU) hypre_int dev = 0; #endif #if defined(HYPRE_USING_CUDA) struct cudaDeviceProp deviceProp; HYPRE_CUDA_CALL( cudaGetDevice(&dev) ); HYPRE_CUDA_CALL( cudaGetDeviceProperties(&deviceProp, dev) ); hypre_printf("Running on \"%s\", major %d, minor %d, total memory %.2f GiB\n", deviceProp.name, deviceProp.major, deviceProp.minor, deviceProp.totalGlobalMem / (1 << 30)); #elif defined(HYPRE_USING_HIP) hipDeviceProp_t deviceProp; HYPRE_HIP_CALL( hipGetDevice(&dev) ); HYPRE_HIP_CALL( hipGetDeviceProperties(&deviceProp, dev) ); hypre_printf("Running on \"%s\", major %d, minor %d, total memory %.2f GiB\n", deviceProp.name, deviceProp.major, deviceProp.minor, deviceProp.totalGlobalMem / (1 << 30)); #elif defined(HYPRE_USING_SYCL) auto device = *hypre_HandleDevice(hypre_handle()); auto p_name = device.get_platform().get_info(); hypre_printf("Platform Name: %s\n", p_name.c_str()); auto p_version = device.get_platform().get_info(); hypre_printf("Platform Version: %s\n", p_version.c_str()); auto d_name = device.get_info(); hypre_printf("Device Name: %s\n", d_name.c_str()); auto max_work_group = device.get_info(); hypre_printf("Max Work Groups: %d\n", max_work_group); auto max_compute_units = device.get_info(); hypre_printf("Max Compute Units: %d\n", max_compute_units); #endif #if defined(HYPRE_USING_GPU) hypre_int max_size = 0, max_size_optin = 0; hypre_GetDeviceMaxShmemSize(dev, &max_size, &max_size_optin); hypre_printf("MaxSharedMemoryPerBlock %d, MaxSharedMemoryPerBlockOptin %d\n", max_size, max_size_optin); #endif return hypre_error_flag; } /*-------------------------------------------------------------------------- * HYPRE_MemoryPrintUsage *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_MemoryPrintUsage(MPI_Comm comm, HYPRE_Int level, const char *function, HYPRE_Int line) { return hypre_MemoryPrintUsage(comm, level, function, line); } /****************************************************************************** * * HYPRE memory location * *****************************************************************************/ HYPRE_Int HYPRE_SetMemoryLocation(HYPRE_MemoryLocation memory_location) { hypre_HandleMemoryLocation(hypre_handle()) = memory_location; return hypre_error_flag; } HYPRE_Int HYPRE_GetMemoryLocation(HYPRE_MemoryLocation *memory_location) { *memory_location = hypre_HandleMemoryLocation(hypre_handle()); return hypre_error_flag; } /****************************************************************************** * * HYPRE execution policy * *****************************************************************************/ HYPRE_Int HYPRE_SetExecutionPolicy(HYPRE_ExecutionPolicy exec_policy) { hypre_HandleDefaultExecPolicy(hypre_handle()) = exec_policy; return hypre_error_flag; } HYPRE_Int HYPRE_GetExecutionPolicy(HYPRE_ExecutionPolicy *exec_policy) { *exec_policy = hypre_HandleDefaultExecPolicy(hypre_handle()); return hypre_error_flag; } const char* HYPRE_GetExecutionPolicyName(HYPRE_ExecutionPolicy exec_policy) { switch (exec_policy) { case HYPRE_EXEC_HOST: return "Host"; case HYPRE_EXEC_DEVICE: #if defined(HYPRE_USING_GPU) || defined(HYPRE_USING_DEVICE_OPENMP) #if defined(HYPRE_USING_CUDA) return "Device (CUDA)"; #elif defined(HYPRE_USING_HIP) return "Device (HIP)"; #elif defined(HYPRE_USING_SYCL) return "Device (SYCL)"; #else return "Device (OpenMP)"; #endif #else return "Host"; #endif case HYPRE_EXEC_UNDEFINED: default: return "Undefined"; } } hypre-2.33.0/src/utilities/general.h000066400000000000000000000111701477326011500173240ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * General structures and values * *****************************************************************************/ #ifndef hypre_GENERAL_HEADER #define hypre_GENERAL_HEADER /* #include */ /* #include */ #include #include #include /*-------------------------------------------------------------------------- * typedefs *--------------------------------------------------------------------------*/ /* This allows us to consistently avoid 'int' throughout hypre */ typedef int hypre_int; typedef long int hypre_longint; typedef unsigned int hypre_uint; typedef unsigned long int hypre_ulongint; typedef unsigned long long int hypre_ulonglongint; typedef uint32_t hypre_uint32; typedef uint64_t hypre_uint64; /* This allows us to consistently avoid 'float' and 'double' throughout hypre */ typedef float hypre_float; typedef double hypre_double; /*-------------------------------------------------------------------------- * Define macros *--------------------------------------------------------------------------*/ /* Macro for silencing unused function warning */ #if defined(__GNUC__) || defined(__clang__) #define HYPRE_MAYBE_UNUSED_FUNC __attribute__((unused)) #elif defined(_MSC_VER) #define HYPRE_MAYBE_UNUSED_FUNC #else #define HYPRE_MAYBE_UNUSED_FUNC #endif /* Macro for silencing unused variable warning */ #define HYPRE_UNUSED_VAR(var) ((void) var) /* Macro for marking deprecated functions */ #define HYPRE_DEPRECATED(reason) _Pragma(reason) /*-------------------------------------------------------------------------- * Define various functions *--------------------------------------------------------------------------*/ #ifndef hypre_max #define hypre_max(a,b) (((a)<(b)) ? (b) : (a)) #endif #ifndef hypre_min #define hypre_min(a,b) (((a)<(b)) ? (a) : (b)) #endif #ifndef hypre_abs #define hypre_abs(a) (((a)>0) ? (a) : -(a)) #endif #ifndef hypre_round #define hypre_round(x) ( ((x) < 0.0) ? ((HYPRE_Int)(x - 0.5)) : ((HYPRE_Int)(x + 0.5)) ) #endif #ifndef hypre_pow2 #define hypre_pow2(i) ( 1 << (i) ) #endif #ifndef hypre_squared #define hypre_squared(i) ((i) * (i)) #endif #ifndef hypre_sqrt #if defined(HYPRE_SINGLE) #define hypre_sqrt sqrtf #elif defined(HYPRE_LONG_DOUBLE) #define hypre_sqrt sqrtl #else #define hypre_sqrt sqrt #endif #endif #ifndef hypre_pow #if defined(HYPRE_SINGLE) #define hypre_pow powf #elif defined(HYPRE_LONG_DOUBLE) #define hypre_pow powl #else #define hypre_pow pow #endif #endif /* Macro for ceiling division. It assumes non-negative dividend and positive divisor. The result of this macro might need to be casted to an integer type depending on the use case */ #ifndef hypre_ceildiv #define hypre_ceildiv(a, b) (((a) + (b) - 1) / (b)) #endif #ifndef hypre_ceil #if defined(HYPRE_SINGLE) #define hypre_ceil ceilf #elif defined(HYPRE_LONG_DOUBLE) #define hypre_ceil ceill #else #define hypre_ceil ceil #endif #endif #ifndef hypre_floor #if defined(HYPRE_SINGLE) #define hypre_floor floorf #elif defined(HYPRE_LONG_DOUBLE) #define hypre_floor floorl #else #define hypre_floor floor #endif #endif #ifndef hypre_log #if defined(HYPRE_SINGLE) #define hypre_log logf #elif defined(HYPRE_LONG_DOUBLE) #define hypre_log logl #else #define hypre_log log #endif #endif #ifndef hypre_exp #if defined(HYPRE_SINGLE) #define hypre_exp expf #elif defined(HYPRE_LONG_DOUBLE) #define hypre_exp expl #else #define hypre_exp exp #endif #endif #ifndef hypre_sin #if defined(HYPRE_SINGLE) #define hypre_sin sinf #elif defined(HYPRE_LONG_DOUBLE) #define hypre_sin sinl #else #define hypre_sin sin #endif #endif #ifndef hypre_cos #if defined(HYPRE_SINGLE) #define hypre_cos cosf #elif defined(HYPRE_LONG_DOUBLE) #define hypre_cos cosl #else #define hypre_cos cos #endif #endif #ifndef hypre_atan #if defined(HYPRE_SINGLE) #define hypre_atan atanf #elif defined(HYPRE_LONG_DOUBLE) #define hypre_atan atanl #else #define hypre_atan atan #endif #endif #ifndef hypre_fmod #if defined(HYPRE_SINGLE) #define hypre_fmod fmodf #elif defined(HYPRE_LONG_DOUBLE) #define hypre_fmod fmodl #else #define hypre_fmod fmod #endif #endif #endif /* hypre_GENERAL_HEADER */ hypre-2.33.0/src/utilities/gselim.h000066400000000000000000000070001477326011500171640ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #ifndef HYPRE_GSELIM_H #define HYPRE_GSELIM_H #define hypre_gselim(A,x,n,error) \ { \ HYPRE_Int j,k,m; \ HYPRE_Real factor; \ HYPRE_Real divA; \ error = 0; \ if (n == 1) /* A is 1x1 */ \ { \ if (A[0] != 0.0) \ { \ x[0] = x[0]/A[0]; \ } \ else \ { \ error++; \ } \ } \ else/* A is nxn. Forward elimination */ \ { \ for (k = 0; k < n-1; k++) \ { \ if (A[k*n+k] != 0.0) \ { \ divA = 1.0/A[k*n+k]; \ for (j = k+1; j < n; j++) \ { \ if (A[j*n+k] != 0.0) \ { \ factor = A[j*n+k]*divA; \ for (m = k+1; m < n; m++) \ { \ A[j*n+m] -= factor * A[k*n+m]; \ } \ x[j] -= factor * x[k]; \ } \ } \ } \ } \ /* Back Substitution */ \ for (k = n-1; k > 0; --k) \ { \ if (A[k*n+k] != 0.0) \ { \ x[k] /= A[k*n+k]; \ for (j = 0; j < k; j++) \ { \ if (A[j*n+k] != 0.0) \ { \ x[j] -= x[k] * A[j*n+k]; \ } \ } \ } \ } \ if (A[0] != 0.0) x[0] /= A[0]; \ } \ } #endif /* #ifndef HYPRE_GSELIM_H */ hypre-2.33.0/src/utilities/handle.c000066400000000000000000000155231477326011500171430ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * HYPRE_handle utility functions * *****************************************************************************/ #include "_hypre_utilities.h" #include "_hypre_utilities.hpp" /*-------------------------------------------------------------------------- * hypre_SetLogLevel *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SetLogLevel(HYPRE_Int log_level) { hypre_HandleLogLevel(hypre_handle()) = log_level; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_SetSpTransUseVendor *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SetSpTransUseVendor( HYPRE_Int use_vendor ) { #if defined(HYPRE_USING_GPU) hypre_HandleSpTransUseVendor(hypre_handle()) = use_vendor; #else HYPRE_UNUSED_VAR(use_vendor); #endif return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_SetSpMVUseVendor *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SetSpMVUseVendor( HYPRE_Int use_vendor ) { #if defined(HYPRE_USING_GPU) hypre_HandleSpMVUseVendor(hypre_handle()) = use_vendor; #else HYPRE_UNUSED_VAR(use_vendor); #endif return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_SetSpGemmUseVendor *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SetSpGemmUseVendor( HYPRE_Int use_vendor ) { #if defined(HYPRE_USING_GPU) hypre_HandleSpgemmUseVendor(hypre_handle()) = use_vendor; #else HYPRE_UNUSED_VAR(use_vendor); #endif return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_SetSpGemmAlgorithm *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SetSpGemmAlgorithm( HYPRE_Int value ) { #if defined(HYPRE_USING_GPU) if (value >= 1 && value <= 3) { hypre_HandleSpgemmAlgorithm(hypre_handle()) = value; } else { hypre_error_in_arg(1); } #else HYPRE_UNUSED_VAR(value); #endif return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_SetSpGemmBinned *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SetSpGemmBinned( HYPRE_Int value ) { #if defined(HYPRE_USING_GPU) hypre_HandleSpgemmBinned(hypre_handle()) = value; #else HYPRE_UNUSED_VAR(value); #endif return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_SetSpGemmRownnzEstimateMethod *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SetSpGemmRownnzEstimateMethod( HYPRE_Int value ) { #if defined(HYPRE_USING_GPU) if (value >= 1 && value <= 3) { hypre_HandleSpgemmRownnzEstimateMethod(hypre_handle()) = value; } else { hypre_error_in_arg(1); } #else HYPRE_UNUSED_VAR(value); #endif return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_SetSpGemmRownnzEstimateNSamples *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SetSpGemmRownnzEstimateNSamples( HYPRE_Int value ) { #if defined(HYPRE_USING_GPU) hypre_HandleSpgemmRownnzEstimateNsamples(hypre_handle()) = value; #else HYPRE_UNUSED_VAR(value); #endif return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_SetSpGemmRownnzEstimateMultFactor *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SetSpGemmRownnzEstimateMultFactor( HYPRE_Real value ) { #if defined(HYPRE_USING_GPU) if (value > 0.0) { hypre_HandleSpgemmRownnzEstimateMultFactor(hypre_handle()) = value; } else { hypre_error_in_arg(1); } #else HYPRE_UNUSED_VAR(value); #endif return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_SetUseGpuRand *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SetUseGpuRand( HYPRE_Int use_gpurand ) { #if defined(HYPRE_USING_GPU) hypre_HandleUseGpuRand(hypre_handle()) = use_gpurand; #else HYPRE_UNUSED_VAR(use_gpurand); #endif return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_SetGaussSeidelMethod *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SetGaussSeidelMethod( HYPRE_Int gs_method ) { #if defined(HYPRE_USING_GPU) hypre_HandleDeviceGSMethod(hypre_handle()) = gs_method; #else HYPRE_UNUSED_VAR(gs_method); #endif return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_SetUserDeviceMalloc *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SetUserDeviceMalloc(GPUMallocFunc func) { #if defined(HYPRE_USING_GPU) hypre_HandleUserDeviceMalloc(hypre_handle()) = func; #else HYPRE_UNUSED_VAR(func); #endif return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_SetUserDeviceMfree *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SetUserDeviceMfree(GPUMfreeFunc func) { #if defined(HYPRE_USING_GPU) hypre_HandleUserDeviceMfree(hypre_handle()) = func; #else HYPRE_UNUSED_VAR(func); #endif return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_SetGpuAwareMPI *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SetGpuAwareMPI( HYPRE_Int use_gpu_aware_mpi ) { #if defined(HYPRE_USING_GPU) || defined(HYPRE_USING_DEVICE_OPENMP) hypre_HandleUseGpuAwareMPI(hypre_handle()) = use_gpu_aware_mpi; #else HYPRE_UNUSED_VAR(use_gpu_aware_mpi); #endif return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_GetGpuAwareMPI *--------------------------------------------------------------------------*/ HYPRE_Int hypre_GetGpuAwareMPI(void) { #if defined(HYPRE_USING_GPU) || defined(HYPRE_USING_DEVICE_OPENMP) return hypre_HandleUseGpuAwareMPI(hypre_handle()); #else return 0; #endif } hypre-2.33.0/src/utilities/handle.h000066400000000000000000000235421477326011500171500ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * General structures and values * *****************************************************************************/ #ifndef HYPRE_HANDLE_H #define HYPRE_HANDLE_H #if defined(HYPRE_USING_UMPIRE) #include "umpire/config.hpp" #if UMPIRE_VERSION_MAJOR >= 2022 #include "umpire/interface/c_fortran/umpire.h" #define hypre_umpire_resourcemanager_make_allocator_pool umpire_resourcemanager_make_allocator_quick_pool #else #include "umpire/interface/umpire.h" #define hypre_umpire_resourcemanager_make_allocator_pool umpire_resourcemanager_make_allocator_pool #endif /* UMPIRE_VERSION_MAJOR >= 2022 */ #define HYPRE_UMPIRE_POOL_NAME_MAX_LEN 1024 #endif /* defined(HYPRE_USING_UMPIRE) */ struct hypre_DeviceData; typedef struct hypre_DeviceData hypre_DeviceData; typedef void (*GPUMallocFunc)(void **, size_t); typedef void (*GPUMfreeFunc)(void *); typedef struct { HYPRE_Int log_level; HYPRE_Int hypre_error; HYPRE_MemoryLocation memory_location; HYPRE_ExecutionPolicy default_exec_policy; /* the device buffers needed to do MPI communication for struct comm */ HYPRE_Complex *struct_comm_recv_buffer; HYPRE_Complex *struct_comm_send_buffer; HYPRE_Int struct_comm_recv_buffer_size; HYPRE_Int struct_comm_send_buffer_size; /* GPU MPI */ #if defined(HYPRE_USING_GPU) || defined(HYPRE_USING_DEVICE_OPENMP) HYPRE_Int use_gpu_aware_mpi; #endif #if defined(HYPRE_USING_GPU) hypre_DeviceData *device_data; HYPRE_Int device_gs_method; /* device G-S options */ #endif /* user malloc/free function pointers */ GPUMallocFunc user_device_malloc; GPUMfreeFunc user_device_free; #if defined(HYPRE_USING_UMPIRE) char umpire_device_pool_name[HYPRE_UMPIRE_POOL_NAME_MAX_LEN]; char umpire_um_pool_name[HYPRE_UMPIRE_POOL_NAME_MAX_LEN]; char umpire_host_pool_name[HYPRE_UMPIRE_POOL_NAME_MAX_LEN]; char umpire_pinned_pool_name[HYPRE_UMPIRE_POOL_NAME_MAX_LEN]; size_t umpire_device_pool_size; size_t umpire_um_pool_size; size_t umpire_host_pool_size; size_t umpire_pinned_pool_size; size_t umpire_block_size; HYPRE_Int own_umpire_device_pool; HYPRE_Int own_umpire_um_pool; HYPRE_Int own_umpire_host_pool; HYPRE_Int own_umpire_pinned_pool; umpire_resourcemanager umpire_rm; #endif #if defined(HYPRE_USING_MAGMA) magma_queue_t magma_queue; #endif } hypre_Handle; /* accessor macros to hypre_Handle */ #define hypre_HandleLogLevel(hypre_handle) ((hypre_handle) -> log_level) #define hypre_HandleMemoryLocation(hypre_handle) ((hypre_handle) -> memory_location) #define hypre_HandleDefaultExecPolicy(hypre_handle) ((hypre_handle) -> default_exec_policy) #define hypre_HandleStructCommRecvBuffer(hypre_handle) ((hypre_handle) -> struct_comm_recv_buffer) #define hypre_HandleStructCommSendBuffer(hypre_handle) ((hypre_handle) -> struct_comm_send_buffer) #define hypre_HandleStructCommRecvBufferSize(hypre_handle) ((hypre_handle) -> struct_comm_recv_buffer_size) #define hypre_HandleStructCommSendBufferSize(hypre_handle) ((hypre_handle) -> struct_comm_send_buffer_size) #define hypre_HandleDeviceData(hypre_handle) ((hypre_handle) -> device_data) #define hypre_HandleDeviceGSMethod(hypre_handle) ((hypre_handle) -> device_gs_method) #define hypre_HandleUseGpuAwareMPI(hypre_handle) ((hypre_handle) -> use_gpu_aware_mpi) #define hypre_HandleCurandGenerator(hypre_handle) hypre_DeviceDataCurandGenerator(hypre_HandleDeviceData(hypre_handle)) #define hypre_HandleCublasHandle(hypre_handle) hypre_DeviceDataCublasHandle(hypre_HandleDeviceData(hypre_handle)) #define hypre_HandleCusparseHandle(hypre_handle) hypre_DeviceDataCusparseHandle(hypre_HandleDeviceData(hypre_handle)) #define hypre_HandleVendorSolverHandle(hypre_handle) hypre_DeviceDataVendorSolverHandle(hypre_HandleDeviceData(hypre_handle)) #define hypre_HandleComputeStream(hypre_handle) hypre_DeviceDataComputeStream(hypre_HandleDeviceData(hypre_handle)) #define hypre_HandleCubBinGrowth(hypre_handle) hypre_DeviceDataCubBinGrowth(hypre_HandleDeviceData(hypre_handle)) #define hypre_HandleCubMinBin(hypre_handle) hypre_DeviceDataCubMinBin(hypre_HandleDeviceData(hypre_handle)) #define hypre_HandleCubMaxBin(hypre_handle) hypre_DeviceDataCubMaxBin(hypre_HandleDeviceData(hypre_handle)) #define hypre_HandleCubMaxCachedBytes(hypre_handle) hypre_DeviceDataCubMaxCachedBytes(hypre_HandleDeviceData(hypre_handle)) #define hypre_HandleCubDevAllocator(hypre_handle) hypre_DeviceDataCubDevAllocator(hypre_HandleDeviceData(hypre_handle)) #define hypre_HandleCubUvmAllocator(hypre_handle) hypre_DeviceDataCubUvmAllocator(hypre_HandleDeviceData(hypre_handle)) #define hypre_HandleDevice(hypre_handle) hypre_DeviceDataDevice(hypre_HandleDeviceData(hypre_handle)) #define hypre_HandleDeviceMaxWorkGroupSize(hypre_handle) hypre_DeviceDataDeviceMaxWorkGroupSize(hypre_HandleDeviceData(hypre_handle)) #define hypre_HandleDeviceMaxShmemPerBlock(hypre_handle) hypre_DeviceDataDeviceMaxShmemPerBlock(hypre_HandleDeviceData(hypre_handle)) #define hypre_HandleDeviceMaxShmemPerBlockInited(hypre_handle) hypre_DeviceDataDeviceMaxShmemPerBlockInited(hypre_HandleDeviceData(hypre_handle)) #define hypre_HandleComputeStreamNum(hypre_handle) hypre_DeviceDataComputeStreamNum(hypre_HandleDeviceData(hypre_handle)) #define hypre_HandleReduceBuffer(hypre_handle) hypre_DeviceDataReduceBuffer(hypre_HandleDeviceData(hypre_handle)) #define hypre_HandleSpgemmUseVendor(hypre_handle) hypre_DeviceDataSpgemmUseVendor(hypre_HandleDeviceData(hypre_handle)) #define hypre_HandleSpMVUseVendor(hypre_handle) hypre_DeviceDataSpMVUseVendor(hypre_HandleDeviceData(hypre_handle)) #define hypre_HandleSpTransUseVendor(hypre_handle) hypre_DeviceDataSpTransUseVendor(hypre_HandleDeviceData(hypre_handle)) #define hypre_HandleSpgemmAlgorithm(hypre_handle) hypre_DeviceDataSpgemmAlgorithm(hypre_HandleDeviceData(hypre_handle)) #define hypre_HandleSpgemmBinned(hypre_handle) hypre_DeviceDataSpgemmBinned(hypre_HandleDeviceData(hypre_handle)) #define hypre_HandleSpgemmNumBin(hypre_handle) hypre_DeviceDataSpgemmNumBin(hypre_HandleDeviceData(hypre_handle)) #define hypre_HandleSpgemmHighestBin(hypre_handle) hypre_DeviceDataSpgemmHighestBin(hypre_HandleDeviceData(hypre_handle)) #define hypre_HandleSpgemmBlockNumDim(hypre_handle) hypre_DeviceDataSpgemmBlockNumDim(hypre_HandleDeviceData(hypre_handle)) #define hypre_HandleSpgemmRownnzEstimateMethod(hypre_handle) hypre_DeviceDataSpgemmRownnzEstimateMethod(hypre_HandleDeviceData(hypre_handle)) #define hypre_HandleSpgemmRownnzEstimateNsamples(hypre_handle) hypre_DeviceDataSpgemmRownnzEstimateNsamples(hypre_HandleDeviceData(hypre_handle)) #define hypre_HandleSpgemmRownnzEstimateMultFactor(hypre_handle) hypre_DeviceDataSpgemmRownnzEstimateMultFactor(hypre_HandleDeviceData(hypre_handle)) #define hypre_HandleDeviceAllocator(hypre_handle) hypre_DeviceDataDeviceAllocator(hypre_HandleDeviceData(hypre_handle)) #define hypre_HandleUseGpuRand(hypre_handle) hypre_DeviceDataUseGpuRand(hypre_HandleDeviceData(hypre_handle)) #define hypre_HandleUserDeviceMalloc(hypre_handle) ((hypre_handle) -> user_device_malloc) #define hypre_HandleUserDeviceMfree(hypre_handle) ((hypre_handle) -> user_device_free) #define hypre_HandleUmpireResourceMan(hypre_handle) ((hypre_handle) -> umpire_rm) #define hypre_HandleUmpireDevicePoolSize(hypre_handle) ((hypre_handle) -> umpire_device_pool_size) #define hypre_HandleUmpireUMPoolSize(hypre_handle) ((hypre_handle) -> umpire_um_pool_size) #define hypre_HandleUmpireHostPoolSize(hypre_handle) ((hypre_handle) -> umpire_host_pool_size) #define hypre_HandleUmpirePinnedPoolSize(hypre_handle) ((hypre_handle) -> umpire_pinned_pool_size) #define hypre_HandleUmpireBlockSize(hypre_handle) ((hypre_handle) -> umpire_block_size) #define hypre_HandleUmpireDevicePoolName(hypre_handle) ((hypre_handle) -> umpire_device_pool_name) #define hypre_HandleUmpireUMPoolName(hypre_handle) ((hypre_handle) -> umpire_um_pool_name) #define hypre_HandleUmpireHostPoolName(hypre_handle) ((hypre_handle) -> umpire_host_pool_name) #define hypre_HandleUmpirePinnedPoolName(hypre_handle) ((hypre_handle) -> umpire_pinned_pool_name) #define hypre_HandleOwnUmpireDevicePool(hypre_handle) ((hypre_handle) -> own_umpire_device_pool) #define hypre_HandleOwnUmpireUMPool(hypre_handle) ((hypre_handle) -> own_umpire_um_pool) #define hypre_HandleOwnUmpireHostPool(hypre_handle) ((hypre_handle) -> own_umpire_host_pool) #define hypre_HandleOwnUmpirePinnedPool(hypre_handle) ((hypre_handle) -> own_umpire_pinned_pool) #define hypre_HandleMagmaQueue(hypre_handle) ((hypre_handle) -> magma_queue) #endif hypre-2.33.0/src/utilities/headers000077500000000000000000000066001477326011500171010ustar00rootroot00000000000000#!/bin/bash # Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) INTERNAL_HEADER=_hypre_utilities.h #=========================================================================== # Include guards and other includes #=========================================================================== cat > $INTERNAL_HEADER <<@ /*** DO NOT EDIT THIS FILE DIRECTLY (use 'headers' to generate) ***/ #ifndef hypre_UTILITIES_HEADER #define hypre_UTILITIES_HEADER #include "HYPRE_utilities.h" #ifdef HYPRE_USING_OPENMP #include #endif #ifdef __cplusplus extern "C" { #endif @ #=========================================================================== # Structures and prototypes #=========================================================================== cat handle.h >> $INTERNAL_HEADER cat state.h >> $INTERNAL_HEADER cat general.h >> $INTERNAL_HEADER cat base.h >> $INTERNAL_HEADER cat magma.h >> $INTERNAL_HEADER cat matrix_stats.h >> $INTERNAL_HEADER cat printf.h >> $INTERNAL_HEADER cat error.h >> $INTERNAL_HEADER cat mpistubs.h >> $INTERNAL_HEADER cat smp.h >> $INTERNAL_HEADER cat memory.h >> $INTERNAL_HEADER cat memory_tracker.h >> $INTERNAL_HEADER cat omp_device.h >> $INTERNAL_HEADER cat threading.h >> $INTERNAL_HEADER cat timing.h >> $INTERNAL_HEADER cat amg_linklist.h >> $INTERNAL_HEADER cat exchange_data.h >> $INTERNAL_HEADER cat caliper_instrumentation.h >> $INTERNAL_HEADER cat gselim.h >> $INTERNAL_HEADER cat int_array.h >> $INTERNAL_HEADER cat protos.h >> $INTERNAL_HEADER cat hopscotch_hash.h >> $INTERNAL_HEADER cat mmio.h >> $INTERNAL_HEADER #=========================================================================== # Include guards #=========================================================================== cat >> $INTERNAL_HEADER <<@ #ifdef __cplusplus } #endif #endif @ INTERNAL_HEADER=_hypre_utilities.hpp #=========================================================================== # Include guards and other includes #=========================================================================== cat > $INTERNAL_HEADER <<@ /*** DO NOT EDIT THIS FILE DIRECTLY (use 'headers' to generate) ***/ #ifndef hypre_UTILITIES_HPP #define hypre_UTILITIES_HPP #ifdef __cplusplus extern "C++" { #endif @ #=========================================================================== # Structures and prototypes #=========================================================================== cat functors.h >> $INTERNAL_HEADER cat predicates.h >> $INTERNAL_HEADER cat device_allocator.h >> $INTERNAL_HEADER cat device_utils.h >> $INTERNAL_HEADER cat device_reducer.h >> $INTERNAL_HEADER cat cub_allocator.h >> $INTERNAL_HEADER #=========================================================================== # Include guards #=========================================================================== cat >> $INTERNAL_HEADER <<@ #ifdef __cplusplus } #endif #endif @ hypre-2.33.0/src/utilities/hopscotch_hash.c000066400000000000000000000226711477326011500207070ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "_hypre_utilities.h" static HYPRE_Int NearestPowerOfTwo( HYPRE_Int value ) { HYPRE_Int rc = 1; while (rc < value) { rc <<= 1; } return rc; } static void InitBucket(hypre_HopscotchBucket *b) { b->hopInfo = 0; b->hash = HYPRE_HOPSCOTCH_HASH_EMPTY; } static void InitBigBucket(hypre_BigHopscotchBucket *b) { b->hopInfo = 0; b->hash = HYPRE_HOPSCOTCH_HASH_EMPTY; } #ifdef HYPRE_CONCURRENT_HOPSCOTCH static void InitSegment(hypre_HopscotchSegment *s) { s->timestamp = 0; omp_init_lock(&s->lock); } static void DestroySegment(hypre_HopscotchSegment *s) { omp_destroy_lock(&s->lock); } #endif void hypre_UnorderedIntSetCreate( hypre_UnorderedIntSet *s, HYPRE_Int inCapacity, HYPRE_Int concurrencyLevel) { s->segmentMask = NearestPowerOfTwo(concurrencyLevel) - 1; if (inCapacity < s->segmentMask + 1) { inCapacity = s->segmentMask + 1; } //ADJUST INPUT ............................ HYPRE_Int adjInitCap = NearestPowerOfTwo(inCapacity + 4096); HYPRE_Int num_buckets = adjInitCap + HYPRE_HOPSCOTCH_HASH_INSERT_RANGE + 1; s->bucketMask = adjInitCap - 1; HYPRE_Int i; //ALLOCATE THE SEGMENTS ................... #ifdef HYPRE_CONCURRENT_HOPSCOTCH s->segments = hypre_TAlloc(hypre_HopscotchSegment, s->segmentMask + 1, HYPRE_MEMORY_HOST); for (i = 0; i <= s->segmentMask; ++i) { InitSegment(&s->segments[i]); } #endif s->hopInfo = hypre_TAlloc(hypre_uint, num_buckets, HYPRE_MEMORY_HOST); s->key = hypre_TAlloc(HYPRE_Int, num_buckets, HYPRE_MEMORY_HOST); s->hash = hypre_TAlloc(HYPRE_Int, num_buckets, HYPRE_MEMORY_HOST); #ifdef HYPRE_CONCURRENT_HOPSCOTCH #pragma omp parallel for #endif for (i = 0; i < num_buckets; ++i) { s->hopInfo[i] = 0; s->hash[i] = HYPRE_HOPSCOTCH_HASH_EMPTY; } } void hypre_UnorderedBigIntSetCreate( hypre_UnorderedBigIntSet *s, HYPRE_Int inCapacity, HYPRE_Int concurrencyLevel) { s->segmentMask = NearestPowerOfTwo(concurrencyLevel) - 1; if (inCapacity < s->segmentMask + 1) { inCapacity = s->segmentMask + 1; } //ADJUST INPUT ............................ HYPRE_Int adjInitCap = NearestPowerOfTwo(inCapacity + 4096); HYPRE_Int num_buckets = adjInitCap + HYPRE_HOPSCOTCH_HASH_INSERT_RANGE + 1; s->bucketMask = adjInitCap - 1; HYPRE_Int i; //ALLOCATE THE SEGMENTS ................... #ifdef HYPRE_CONCURRENT_HOPSCOTCH s->segments = hypre_TAlloc(hypre_HopscotchSegment, s->segmentMask + 1, HYPRE_MEMORY_HOST); for (i = 0; i <= s->segmentMask; ++i) { InitSegment(&s->segments[i]); } #endif s->hopInfo = hypre_TAlloc(hypre_uint, num_buckets, HYPRE_MEMORY_HOST); s->key = hypre_TAlloc(HYPRE_BigInt, num_buckets, HYPRE_MEMORY_HOST); s->hash = hypre_TAlloc(HYPRE_BigInt, num_buckets, HYPRE_MEMORY_HOST); #ifdef HYPRE_CONCURRENT_HOPSCOTCH #pragma omp parallel for #endif for (i = 0; i < num_buckets; ++i) { s->hopInfo[i] = 0; s->hash[i] = HYPRE_HOPSCOTCH_HASH_EMPTY; } } void hypre_UnorderedIntMapCreate( hypre_UnorderedIntMap *m, HYPRE_Int inCapacity, HYPRE_Int concurrencyLevel) { m->segmentMask = NearestPowerOfTwo(concurrencyLevel) - 1; if (inCapacity < m->segmentMask + 1) { inCapacity = m->segmentMask + 1; } //ADJUST INPUT ............................ HYPRE_Int adjInitCap = NearestPowerOfTwo(inCapacity + 4096); HYPRE_Int num_buckets = adjInitCap + HYPRE_HOPSCOTCH_HASH_INSERT_RANGE + 1; m->bucketMask = adjInitCap - 1; HYPRE_Int i; //ALLOCATE THE SEGMENTS ................... #ifdef HYPRE_CONCURRENT_HOPSCOTCH m->segments = hypre_TAlloc(hypre_HopscotchSegment, m->segmentMask + 1, HYPRE_MEMORY_HOST); for (i = 0; i <= m->segmentMask; i++) { InitSegment(&m->segments[i]); } #endif m->table = hypre_TAlloc(hypre_HopscotchBucket, num_buckets, HYPRE_MEMORY_HOST); #ifdef HYPRE_CONCURRENT_HOPSCOTCH #pragma omp parallel for #endif for (i = 0; i < num_buckets; i++) { InitBucket(&m->table[i]); } } void hypre_UnorderedBigIntMapCreate( hypre_UnorderedBigIntMap *m, HYPRE_Int inCapacity, HYPRE_Int concurrencyLevel) { m->segmentMask = NearestPowerOfTwo(concurrencyLevel) - 1; if (inCapacity < m->segmentMask + 1) { inCapacity = m->segmentMask + 1; } //ADJUST INPUT ............................ HYPRE_Int adjInitCap = NearestPowerOfTwo(inCapacity + 4096); HYPRE_Int num_buckets = adjInitCap + HYPRE_HOPSCOTCH_HASH_INSERT_RANGE + 1; m->bucketMask = adjInitCap - 1; HYPRE_Int i; //ALLOCATE THE SEGMENTS ................... #ifdef HYPRE_CONCURRENT_HOPSCOTCH m->segments = hypre_TAlloc(hypre_HopscotchSegment, m->segmentMask + 1, HYPRE_MEMORY_HOST); for (i = 0; i <= m->segmentMask; i++) { InitSegment(&m->segments[i]); } #endif m->table = hypre_TAlloc(hypre_BigHopscotchBucket, num_buckets, HYPRE_MEMORY_HOST); #ifdef HYPRE_CONCURRENT_HOPSCOTCH #pragma omp parallel for #endif for (i = 0; i < num_buckets; i++) { InitBigBucket(&m->table[i]); } } void hypre_UnorderedIntSetDestroy( hypre_UnorderedIntSet *s ) { hypre_TFree(s->hopInfo, HYPRE_MEMORY_HOST); hypre_TFree(s->key, HYPRE_MEMORY_HOST); hypre_TFree(s->hash, HYPRE_MEMORY_HOST); #ifdef HYPRE_CONCURRENT_HOPSCOTCH HYPRE_Int i; for (i = 0; i <= s->segmentMask; i++) { DestroySegment(&s->segments[i]); } hypre_TFree(s->segments, HYPRE_MEMORY_HOST); #endif } void hypre_UnorderedBigIntSetDestroy( hypre_UnorderedBigIntSet *s ) { hypre_TFree(s->hopInfo, HYPRE_MEMORY_HOST); hypre_TFree(s->key, HYPRE_MEMORY_HOST); hypre_TFree(s->hash, HYPRE_MEMORY_HOST); #ifdef HYPRE_CONCURRENT_HOPSCOTCH HYPRE_Int i; for (i = 0; i <= s->segmentMask; i++) { DestroySegment(&s->segments[i]); } hypre_TFree(s->segments, HYPRE_MEMORY_HOST); #endif } void hypre_UnorderedIntMapDestroy( hypre_UnorderedIntMap *m) { hypre_TFree(m->table, HYPRE_MEMORY_HOST); #ifdef HYPRE_CONCURRENT_HOPSCOTCH HYPRE_Int i; for (i = 0; i <= m->segmentMask; i++) { DestroySegment(&m->segments[i]); } hypre_TFree(m->segments, HYPRE_MEMORY_HOST); #endif } void hypre_UnorderedBigIntMapDestroy( hypre_UnorderedBigIntMap *m) { hypre_TFree(m->table, HYPRE_MEMORY_HOST); #ifdef HYPRE_CONCURRENT_HOPSCOTCH HYPRE_Int i; for (i = 0; i <= m->segmentMask; i++) { DestroySegment(&m->segments[i]); } hypre_TFree(m->segments, HYPRE_MEMORY_HOST); #endif } HYPRE_Int *hypre_UnorderedIntSetCopyToArray( hypre_UnorderedIntSet *s, HYPRE_Int *len ) { /*HYPRE_Int prefix_sum_workspace[hypre_NumThreads() + 1];*/ HYPRE_Int *prefix_sum_workspace; HYPRE_Int *ret_array = NULL; prefix_sum_workspace = hypre_TAlloc(HYPRE_Int, hypre_NumThreads() + 1, HYPRE_MEMORY_HOST); #ifdef HYPRE_CONCURRENT_HOPSCOTCH #pragma omp parallel #endif { HYPRE_Int n = s->bucketMask + HYPRE_HOPSCOTCH_HASH_INSERT_RANGE; HYPRE_Int i_begin, i_end; hypre_GetSimpleThreadPartition(&i_begin, &i_end, n); HYPRE_Int cnt = 0; HYPRE_Int i; for (i = i_begin; i < i_end; i++) { if (HYPRE_HOPSCOTCH_HASH_EMPTY != s->hash[i]) { cnt++; } } hypre_prefix_sum(&cnt, len, prefix_sum_workspace); #ifdef HYPRE_CONCURRENT_HOPSCOTCH #pragma omp barrier #pragma omp master #endif { ret_array = hypre_TAlloc(HYPRE_Int, *len, HYPRE_MEMORY_HOST); } #ifdef HYPRE_CONCURRENT_HOPSCOTCH #pragma omp barrier #endif for (i = i_begin; i < i_end; i++) { if (HYPRE_HOPSCOTCH_HASH_EMPTY != s->hash[i]) { ret_array[cnt++] = s->key[i]; } } } hypre_TFree(prefix_sum_workspace, HYPRE_MEMORY_HOST); return ret_array; } HYPRE_BigInt *hypre_UnorderedBigIntSetCopyToArray( hypre_UnorderedBigIntSet *s, HYPRE_Int *len ) { /*HYPRE_Int prefix_sum_workspace[hypre_NumThreads() + 1];*/ HYPRE_Int *prefix_sum_workspace; HYPRE_BigInt *ret_array = NULL; prefix_sum_workspace = hypre_TAlloc(HYPRE_Int, hypre_NumThreads() + 1, HYPRE_MEMORY_HOST); #ifdef HYPRE_CONCURRENT_HOPSCOTCH #pragma omp parallel #endif { HYPRE_Int n = s->bucketMask + HYPRE_HOPSCOTCH_HASH_INSERT_RANGE; HYPRE_Int i_begin, i_end; hypre_GetSimpleThreadPartition(&i_begin, &i_end, n); HYPRE_Int cnt = 0; HYPRE_Int i; for (i = i_begin; i < i_end; i++) { if (HYPRE_HOPSCOTCH_HASH_EMPTY != s->hash[i]) { cnt++; } } hypre_prefix_sum(&cnt, len, prefix_sum_workspace); #ifdef HYPRE_CONCURRENT_HOPSCOTCH #pragma omp barrier #pragma omp master #endif { ret_array = hypre_TAlloc(HYPRE_BigInt, *len, HYPRE_MEMORY_HOST); } #ifdef HYPRE_CONCURRENT_HOPSCOTCH #pragma omp barrier #endif for (i = i_begin; i < i_end; i++) { if (HYPRE_HOPSCOTCH_HASH_EMPTY != s->hash[i]) { ret_array[cnt++] = s->key[i]; } } } hypre_TFree(prefix_sum_workspace, HYPRE_MEMORY_HOST); return ret_array; } hypre-2.33.0/src/utilities/hopscotch_hash.h000066400000000000000000001150441477326011500207110ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /** * Hopscotch hash is modified from the code downloaded from * https://sites.google.com/site/cconcurrencypackage/hopscotch-hashing * with the following terms of usage */ //////////////////////////////////////////////////////////////////////////////// //TERMS OF USAGE //------------------------------------------------------------------------------ // // Permission to use, copy, modify and distribute this software and // its documentation for any purpose is hereby granted without fee, // provided that due acknowledgments to the authors are provided and // this permission notice appears in all copies of the software. // The software is provided "as is". There is no warranty of any kind. // //Authors: // Maurice Herlihy // Brown University // and // Nir Shavit // Tel-Aviv University // and // Moran Tzafrir // Tel-Aviv University // // Date: July 15, 2008. // //////////////////////////////////////////////////////////////////////////////// // Programmer : Moran Tzafrir (MoranTza@gmail.com) // Modified : Jongsoo Park (jongsoo.park@intel.com) // Oct 1, 2015. // //////////////////////////////////////////////////////////////////////////////// #ifndef hypre_HOPSCOTCH_HASH_HEADER #define hypre_HOPSCOTCH_HASH_HEADER //#include #include #include #include //#include #ifdef HYPRE_USING_OPENMP #include #endif //#include "_hypre_utilities.h" // Potentially architecture specific features used here: // __sync_val_compare_and_swap #ifdef __cplusplus extern "C" { #endif /****************************************************************************** * This next section of code is here instead of in _hypre_utilities.h to get * around some portability issues with Visual Studio. By putting it here, we * can explicitly include this '.h' file in a few files in hypre and compile * them with C++ instead of C (VS does not support C99 'inline'). ******************************************************************************/ #ifdef HYPRE_USING_ATOMIC static inline HYPRE_MAYBE_UNUSED_FUNC HYPRE_Int hypre_compare_and_swap( HYPRE_Int *ptr, HYPRE_Int oldval, HYPRE_Int newval ) { #if defined(__GNUC__) && defined(__GNUC_MINOR__) && defined(__GNUC_PATCHLEVEL__) && (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__) > 40100 return __sync_val_compare_and_swap(ptr, oldval, newval); //#elif defind _MSC_VER //return _InterlockedCompareExchange((long *)ptr, newval, oldval); //#elif defined(__STDC_VERSION__) && __STDC_VERSION__ >= 201112L && !defined(__STDC_NO_ATOMICS__) // JSP: not many compilers have implemented this, so comment out for now //_Atomic HYPRE_Int *atomic_ptr = ptr; //atomic_compare_exchange_strong(atomic_ptr, &oldval, newval); //return oldval; #endif } static inline HYPRE_MAYBE_UNUSED_FUNC HYPRE_Int hypre_fetch_and_add( HYPRE_Int *ptr, HYPRE_Int value ) { #if defined(__GNUC__) && defined(__GNUC_MINOR__) && defined(__GNUC_PATCHLEVEL__) && (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__) > 40100 return __sync_fetch_and_add(ptr, value); //#elif defined _MSC_VER //return _InterlockedExchangeAdd((long *)ptr, value); //#elif defined(__STDC_VERSION__) && __STDC_VERSION__ >= 201112L && !defined(__STDC_NO_ATOMICS__) // JSP: not many compilers have implemented this, so comment out for now //_Atomic HYPRE_Int *atomic_ptr = ptr; //return atomic_fetch_add(atomic_ptr, value); #endif } #else // !HYPRE_USING_ATOMIC static inline HYPRE_MAYBE_UNUSED_FUNC HYPRE_Int hypre_compare_and_swap( HYPRE_Int *ptr, HYPRE_Int oldval, HYPRE_Int newval ) { if (*ptr == oldval) { *ptr = newval; return oldval; } else { return *ptr; } } static inline HYPRE_MAYBE_UNUSED_FUNC HYPRE_Int hypre_fetch_and_add( HYPRE_Int *ptr, HYPRE_Int value ) { HYPRE_Int oldval = *ptr; *ptr += value; return oldval; } #endif // !HYPRE_USING_ATOMIC /******************************************************************************/ // Constants ................................................................ #define HYPRE_HOPSCOTCH_HASH_HOP_RANGE (32) #define HYPRE_HOPSCOTCH_HASH_INSERT_RANGE (4*1024) #define HYPRE_HOPSCOTCH_HASH_EMPTY (0) #define HYPRE_HOPSCOTCH_HASH_BUSY (1) // Small Utilities .......................................................... static inline HYPRE_MAYBE_UNUSED_FUNC HYPRE_Int first_lsb_bit_indx( hypre_uint x ) { HYPRE_Int pos; #if defined(_MSC_VER) || defined(__MINGW64__) if (x == 0) { pos = 0; } else { for (pos = 1; !(x & 1); ++pos) { x >>= 1; } } #else pos = ffs(x); #endif return (pos - 1); } /** * hypre_Hash is adapted from xxHash with the following license. */ /* xxHash - Extremely Fast Hash algorithm Header File Copyright (C) 2012-2015, Yann Collet. BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php) Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * 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. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "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 THE COPYRIGHT OWNER OR 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. You can contact the author at : - xxHash source repository : https://github.com/Cyan4973/xxHash */ /*************************************** * Constants ***************************************/ #define HYPRE_XXH_PRIME32_1 2654435761U #define HYPRE_XXH_PRIME32_2 2246822519U #define HYPRE_XXH_PRIME32_3 3266489917U #define HYPRE_XXH_PRIME32_4 668265263U #define HYPRE_XXH_PRIME32_5 374761393U #define HYPRE_XXH_PRIME64_1 11400714785074694791ULL #define HYPRE_XXH_PRIME64_2 14029467366897019727ULL #define HYPRE_XXH_PRIME64_3 1609587929392839161ULL #define HYPRE_XXH_PRIME64_4 9650029242287828579ULL #define HYPRE_XXH_PRIME64_5 2870177450012600261ULL #define HYPRE_XXH_rotl32(x,r) ((x << r) | (x >> (32 - r))) #define HYPRE_XXH_rotl64(x,r) ((x << r) | (x >> (64 - r))) #if defined(HYPRE_MIXEDINT) || defined(HYPRE_BIGINT) static inline HYPRE_MAYBE_UNUSED_FUNC HYPRE_BigInt hypre_BigHash( HYPRE_BigInt input ) { hypre_ulonglongint h64 = HYPRE_XXH_PRIME64_5 + sizeof(input); hypre_ulonglongint k1 = input; k1 *= HYPRE_XXH_PRIME64_2; k1 = HYPRE_XXH_rotl64(k1, 31); k1 *= HYPRE_XXH_PRIME64_1; h64 ^= k1; h64 = HYPRE_XXH_rotl64(h64, 27) * HYPRE_XXH_PRIME64_1 + HYPRE_XXH_PRIME64_4; h64 ^= h64 >> 33; h64 *= HYPRE_XXH_PRIME64_2; h64 ^= h64 >> 29; h64 *= HYPRE_XXH_PRIME64_3; h64 ^= h64 >> 32; #ifndef NDEBUG if (HYPRE_HOPSCOTCH_HASH_EMPTY == h64) { hypre_printf("hash(%lld) = %d\n", h64, HYPRE_HOPSCOTCH_HASH_EMPTY); hypre_assert(HYPRE_HOPSCOTCH_HASH_EMPTY != h64); } #endif return h64; } #else static inline HYPRE_MAYBE_UNUSED_FUNC HYPRE_Int hypre_BigHash(HYPRE_Int input) { hypre_uint h32 = HYPRE_XXH_PRIME32_5 + sizeof(input); // 1665863975 is added to input so that // only -1073741824 gives HYPRE_HOPSCOTCH_HASH_EMPTY. // Hence, we're fine as long as key is non-negative. h32 += (input + 1665863975) * HYPRE_XXH_PRIME32_3; h32 = HYPRE_XXH_rotl32(h32, 17) * HYPRE_XXH_PRIME32_4; h32 ^= h32 >> 15; h32 *= HYPRE_XXH_PRIME32_2; h32 ^= h32 >> 13; h32 *= HYPRE_XXH_PRIME32_3; h32 ^= h32 >> 16; //hypre_assert(HYPRE_HOPSCOTCH_HASH_EMPTY != h32); return h32; } #endif #ifdef HYPRE_BIGINT static inline HYPRE_MAYBE_UNUSED_FUNC HYPRE_Int hypre_Hash(HYPRE_Int input) { hypre_ulonglongint h64 = HYPRE_XXH_PRIME64_5 + sizeof(input); hypre_ulonglongint k1 = input; k1 *= HYPRE_XXH_PRIME64_2; k1 = HYPRE_XXH_rotl64(k1, 31); k1 *= HYPRE_XXH_PRIME64_1; h64 ^= k1; h64 = HYPRE_XXH_rotl64(h64, 27) * HYPRE_XXH_PRIME64_1 + HYPRE_XXH_PRIME64_4; h64 ^= h64 >> 33; h64 *= HYPRE_XXH_PRIME64_2; h64 ^= h64 >> 29; h64 *= HYPRE_XXH_PRIME64_3; h64 ^= h64 >> 32; #ifndef NDEBUG if (HYPRE_HOPSCOTCH_HASH_EMPTY == h64) { hypre_printf("hash(%lld) = %d\n", h64, HYPRE_HOPSCOTCH_HASH_EMPTY); hypre_assert(HYPRE_HOPSCOTCH_HASH_EMPTY != h64); } #endif return h64; } #else static inline HYPRE_MAYBE_UNUSED_FUNC HYPRE_Int hypre_Hash(HYPRE_Int input) { hypre_uint h32 = HYPRE_XXH_PRIME32_5 + sizeof(input); // 1665863975 is added to input so that // only -1073741824 gives HYPRE_HOPSCOTCH_HASH_EMPTY. // Hence, we're fine as long as key is non-negative. h32 += (input + 1665863975) * HYPRE_XXH_PRIME32_3; h32 = HYPRE_XXH_rotl32(h32, 17) * HYPRE_XXH_PRIME32_4; h32 ^= h32 >> 15; h32 *= HYPRE_XXH_PRIME32_2; h32 ^= h32 >> 13; h32 *= HYPRE_XXH_PRIME32_3; h32 ^= h32 >> 16; //hypre_assert(HYPRE_HOPSCOTCH_HASH_EMPTY != h32); return h32; } #endif static inline HYPRE_MAYBE_UNUSED_FUNC void hypre_UnorderedIntSetFindCloserFreeBucket( hypre_UnorderedIntSet *s, #ifdef HYPRE_CONCURRENT_HOPSCOTCH hypre_HopscotchSegment *start_seg, #endif HYPRE_Int *free_bucket, HYPRE_Int *free_dist ) { HYPRE_Int move_bucket = *free_bucket - (HYPRE_HOPSCOTCH_HASH_HOP_RANGE - 1); HYPRE_Int move_free_dist; for (move_free_dist = HYPRE_HOPSCOTCH_HASH_HOP_RANGE - 1; move_free_dist > 0; --move_free_dist) { hypre_uint start_hop_info = s->hopInfo[move_bucket]; HYPRE_Int move_new_free_dist = -1; hypre_uint mask = 1; HYPRE_Int i; for (i = 0; i < move_free_dist; ++i, mask <<= 1) { if (mask & start_hop_info) { move_new_free_dist = i; break; } } if (-1 != move_new_free_dist) { #ifdef HYPRE_CONCURRENT_HOPSCOTCH hypre_HopscotchSegment* move_segment = &(s->segments[move_bucket & s->segmentMask]); if (start_seg != move_segment) { omp_set_lock(&move_segment->lock); } #endif if (start_hop_info == s->hopInfo[move_bucket]) { // new_free_bucket -> free_bucket and empty new_free_bucket HYPRE_Int new_free_bucket = move_bucket + move_new_free_dist; s->key[*free_bucket] = s->key[new_free_bucket]; s->hash[*free_bucket] = s->hash[new_free_bucket]; #ifdef HYPRE_CONCURRENT_HOPSCOTCH ++move_segment->timestamp; #pragma omp flush #endif s->hopInfo[move_bucket] |= (1U << move_free_dist); s->hopInfo[move_bucket] &= ~(1U << move_new_free_dist); *free_bucket = new_free_bucket; *free_dist -= move_free_dist - move_new_free_dist; #ifdef HYPRE_CONCURRENT_HOPSCOTCH if (start_seg != move_segment) { omp_unset_lock(&move_segment->lock); } #endif return; } #ifdef HYPRE_CONCURRENT_HOPSCOTCH if (start_seg != move_segment) { omp_unset_lock(&move_segment->lock); } #endif } ++move_bucket; } *free_bucket = -1; *free_dist = 0; } static inline HYPRE_MAYBE_UNUSED_FUNC void hypre_UnorderedBigIntSetFindCloserFreeBucket( hypre_UnorderedBigIntSet *s, #ifdef HYPRE_CONCURRENT_HOPSCOTCH hypre_HopscotchSegment *start_seg, #endif HYPRE_Int *free_bucket, HYPRE_Int *free_dist ) { HYPRE_Int move_bucket = *free_bucket - (HYPRE_HOPSCOTCH_HASH_HOP_RANGE - 1); HYPRE_Int move_free_dist; for (move_free_dist = HYPRE_HOPSCOTCH_HASH_HOP_RANGE - 1; move_free_dist > 0; --move_free_dist) { hypre_uint start_hop_info = s->hopInfo[move_bucket]; HYPRE_Int move_new_free_dist = -1; hypre_uint mask = 1; HYPRE_Int i; for (i = 0; i < move_free_dist; ++i, mask <<= 1) { if (mask & start_hop_info) { move_new_free_dist = i; break; } } if (-1 != move_new_free_dist) { #ifdef HYPRE_CONCURRENT_HOPSCOTCH hypre_HopscotchSegment* move_segment = &(s->segments[move_bucket & s->segmentMask]); if (start_seg != move_segment) { omp_set_lock(&move_segment->lock); } #endif if (start_hop_info == s->hopInfo[move_bucket]) { // new_free_bucket -> free_bucket and empty new_free_bucket HYPRE_Int new_free_bucket = move_bucket + move_new_free_dist; s->key[*free_bucket] = s->key[new_free_bucket]; s->hash[*free_bucket] = s->hash[new_free_bucket]; #ifdef HYPRE_CONCURRENT_HOPSCOTCH ++move_segment->timestamp; #pragma omp flush #endif s->hopInfo[move_bucket] |= (1U << move_free_dist); s->hopInfo[move_bucket] &= ~(1U << move_new_free_dist); *free_bucket = new_free_bucket; *free_dist -= move_free_dist - move_new_free_dist; #ifdef HYPRE_CONCURRENT_HOPSCOTCH if (start_seg != move_segment) { omp_unset_lock(&move_segment->lock); } #endif return; } #ifdef HYPRE_CONCURRENT_HOPSCOTCH if (start_seg != move_segment) { omp_unset_lock(&move_segment->lock); } #endif } ++move_bucket; } *free_bucket = -1; *free_dist = 0; } static inline HYPRE_MAYBE_UNUSED_FUNC void hypre_UnorderedIntMapFindCloserFreeBucket( hypre_UnorderedIntMap *m, #ifdef HYPRE_CONCURRENT_HOPSCOTCH hypre_HopscotchSegment *start_seg, #endif hypre_HopscotchBucket **free_bucket, HYPRE_Int *free_dist) { HYPRE_UNUSED_VAR(m); hypre_HopscotchBucket* move_bucket = *free_bucket - (HYPRE_HOPSCOTCH_HASH_HOP_RANGE - 1); HYPRE_Int move_free_dist; for (move_free_dist = HYPRE_HOPSCOTCH_HASH_HOP_RANGE - 1; move_free_dist > 0; --move_free_dist) { hypre_uint start_hop_info = move_bucket->hopInfo; HYPRE_Int move_new_free_dist = -1; hypre_uint mask = 1; HYPRE_Int i; for (i = 0; i < move_free_dist; ++i, mask <<= 1) { if (mask & start_hop_info) { move_new_free_dist = i; break; } } if (-1 != move_new_free_dist) { #ifdef HYPRE_CONCURRENT_HOPSCOTCH hypre_HopscotchSegment* move_segment = &(m->segments[(move_bucket - m->table) & m->segmentMask]); if (start_seg != move_segment) { omp_set_lock(&move_segment->lock); } #endif if (start_hop_info == move_bucket->hopInfo) { // new_free_bucket -> free_bucket and empty new_free_bucket hypre_HopscotchBucket* new_free_bucket = move_bucket + move_new_free_dist; (*free_bucket)->data = new_free_bucket->data; (*free_bucket)->key = new_free_bucket->key; (*free_bucket)->hash = new_free_bucket->hash; #ifdef HYPRE_CONCURRENT_HOPSCOTCH ++move_segment->timestamp; #pragma omp flush #endif move_bucket->hopInfo = move_bucket->hopInfo | (1U << move_free_dist); move_bucket->hopInfo = move_bucket->hopInfo & ~(1U << move_new_free_dist); *free_bucket = new_free_bucket; *free_dist -= move_free_dist - move_new_free_dist; #ifdef HYPRE_CONCURRENT_HOPSCOTCH if (start_seg != move_segment) { omp_unset_lock(&move_segment->lock); } #endif return; } #ifdef HYPRE_CONCURRENT_HOPSCOTCH if (start_seg != move_segment) { omp_unset_lock(&move_segment->lock); } #endif } ++move_bucket; } *free_bucket = NULL; *free_dist = 0; } static inline HYPRE_MAYBE_UNUSED_FUNC void hypre_UnorderedBigIntMapFindCloserFreeBucket( hypre_UnorderedBigIntMap *m, #ifdef HYPRE_CONCURRENT_HOPSCOTCH hypre_HopscotchSegment *start_seg, #endif hypre_BigHopscotchBucket **free_bucket, HYPRE_Int *free_dist) { HYPRE_UNUSED_VAR(m); hypre_BigHopscotchBucket* move_bucket = *free_bucket - (HYPRE_HOPSCOTCH_HASH_HOP_RANGE - 1); HYPRE_Int move_free_dist; for (move_free_dist = HYPRE_HOPSCOTCH_HASH_HOP_RANGE - 1; move_free_dist > 0; --move_free_dist) { hypre_uint start_hop_info = move_bucket->hopInfo; HYPRE_Int move_new_free_dist = -1; hypre_uint mask = 1; HYPRE_Int i; for (i = 0; i < move_free_dist; ++i, mask <<= 1) { if (mask & start_hop_info) { move_new_free_dist = i; break; } } if (-1 != move_new_free_dist) { #ifdef HYPRE_CONCURRENT_HOPSCOTCH hypre_HopscotchSegment* move_segment = &(m->segments[(move_bucket - m->table) & m->segmentMask]); if (start_seg != move_segment) { omp_set_lock(&move_segment->lock); } #endif if (start_hop_info == move_bucket->hopInfo) { // new_free_bucket -> free_bucket and empty new_free_bucket hypre_BigHopscotchBucket* new_free_bucket = move_bucket + move_new_free_dist; (*free_bucket)->data = new_free_bucket->data; (*free_bucket)->key = new_free_bucket->key; (*free_bucket)->hash = new_free_bucket->hash; #ifdef HYPRE_CONCURRENT_HOPSCOTCH ++move_segment->timestamp; #pragma omp flush #endif move_bucket->hopInfo = move_bucket->hopInfo | (1U << move_free_dist); move_bucket->hopInfo = move_bucket->hopInfo & ~(1U << move_new_free_dist); *free_bucket = new_free_bucket; *free_dist -= move_free_dist - move_new_free_dist; #ifdef HYPRE_CONCURRENT_HOPSCOTCH if (start_seg != move_segment) { omp_unset_lock(&move_segment->lock); } #endif return; } #ifdef HYPRE_CONCURRENT_HOPSCOTCH if (start_seg != move_segment) { omp_unset_lock(&move_segment->lock); } #endif } ++move_bucket; } *free_bucket = NULL; *free_dist = 0; } void hypre_UnorderedIntSetCreate( hypre_UnorderedIntSet *s, HYPRE_Int inCapacity, HYPRE_Int concurrencyLevel); void hypre_UnorderedBigIntSetCreate( hypre_UnorderedBigIntSet *s, HYPRE_Int inCapacity, HYPRE_Int concurrencyLevel); void hypre_UnorderedIntMapCreate( hypre_UnorderedIntMap *m, HYPRE_Int inCapacity, HYPRE_Int concurrencyLevel); void hypre_UnorderedBigIntMapCreate( hypre_UnorderedBigIntMap *m, HYPRE_Int inCapacity, HYPRE_Int concurrencyLevel); void hypre_UnorderedIntSetDestroy( hypre_UnorderedIntSet *s ); void hypre_UnorderedBigIntSetDestroy( hypre_UnorderedBigIntSet *s ); void hypre_UnorderedIntMapDestroy( hypre_UnorderedIntMap *m ); void hypre_UnorderedBigIntMapDestroy( hypre_UnorderedBigIntMap *m ); // Query Operations ......................................................... static inline HYPRE_MAYBE_UNUSED_FUNC HYPRE_Int hypre_UnorderedIntSetContains( hypre_UnorderedIntSet *s, HYPRE_Int key ) { //CALCULATE HASH .......................... #ifdef HYPRE_BIGINT HYPRE_Int hash = hypre_BigHash(key); #else HYPRE_Int hash = hypre_Hash(key); #endif //CHECK IF ALREADY CONTAIN ................ #ifdef HYPRE_CONCURRENT_HOPSCOTCH hypre_HopscotchSegment *segment = &s->segments[hash & s->segmentMask]; #endif HYPRE_Int bucket = hash & s->bucketMask; hypre_uint hopInfo = s->hopInfo[bucket]; if (0 == hopInfo) { return 0; } else if (1 == hopInfo ) { if (hash == s->hash[bucket] && key == s->key[bucket]) { return 1; } else { return 0; } } #ifdef HYPRE_CONCURRENT_HOPSCOTCH HYPRE_Int startTimestamp = segment->timestamp; #endif while (0 != hopInfo) { HYPRE_Int i = first_lsb_bit_indx(hopInfo); HYPRE_Int currElm = bucket + i; if (hash == s->hash[currElm] && key == s->key[currElm]) { return 1; } hopInfo &= ~(1U << i); } #ifdef HYPRE_CONCURRENT_HOPSCOTCH if (segment->timestamp == startTimestamp) { return 0; } #endif HYPRE_Int i; for (i = 0; i < HYPRE_HOPSCOTCH_HASH_HOP_RANGE; ++i) { if (hash == s->hash[bucket + i] && key == s->key[bucket + i]) { return 1; } } return 0; } static inline HYPRE_MAYBE_UNUSED_FUNC HYPRE_Int hypre_UnorderedBigIntSetContains( hypre_UnorderedBigIntSet *s, HYPRE_BigInt key ) { //CALCULATE HASH .......................... #if defined(HYPRE_BIGINT) || defined(HYPRE_MIXEDINT) HYPRE_BigInt hash = hypre_BigHash(key); #else HYPRE_BigInt hash = hypre_Hash(key); #endif //CHECK IF ALREADY CONTAIN ................ #ifdef HYPRE_CONCURRENT_HOPSCOTCH hypre_HopscotchSegment *segment = &s->segments[(HYPRE_Int)(hash & s->segmentMask)]; #endif HYPRE_Int bucket = (HYPRE_Int)(hash & s->bucketMask); hypre_uint hopInfo = s->hopInfo[bucket]; if (0 == hopInfo) { return 0; } else if (1 == hopInfo ) { if (hash == s->hash[bucket] && key == s->key[bucket]) { return 1; } else { return 0; } } #ifdef HYPRE_CONCURRENT_HOPSCOTCH HYPRE_Int startTimestamp = segment->timestamp; #endif while (0 != hopInfo) { HYPRE_Int i = first_lsb_bit_indx(hopInfo); HYPRE_Int currElm = bucket + i; if (hash == s->hash[currElm] && key == s->key[currElm]) { return 1; } hopInfo &= ~(1U << i); } #ifdef HYPRE_CONCURRENT_HOPSCOTCH if (segment->timestamp == startTimestamp) { return 0; } #endif HYPRE_Int i; for (i = 0; i < HYPRE_HOPSCOTCH_HASH_HOP_RANGE; ++i) { if (hash == s->hash[bucket + i] && key == s->key[bucket + i]) { return 1; } } return 0; } /** * @ret -1 if key doesn't exist */ static inline HYPRE_MAYBE_UNUSED_FUNC HYPRE_Int hypre_UnorderedIntMapGet( hypre_UnorderedIntMap *m, HYPRE_Int key ) { //CALCULATE HASH .......................... #ifdef HYPRE_BIGINT HYPRE_Int hash = hypre_BigHash(key); #else HYPRE_Int hash = hypre_Hash(key); #endif //CHECK IF ALREADY CONTAIN ................ #ifdef HYPRE_CONCURRENT_HOPSCOTCH hypre_HopscotchSegment *segment = &m->segments[hash & m->segmentMask]; #endif hypre_HopscotchBucket *elmAry = &(m->table[hash & m->bucketMask]); hypre_uint hopInfo = elmAry->hopInfo; if (0 == hopInfo) { return -1; } else if (1 == hopInfo ) { if (hash == elmAry->hash && key == elmAry->key) { return elmAry->data; } else { return -1; } } #ifdef HYPRE_CONCURRENT_HOPSCOTCH HYPRE_Int startTimestamp = segment->timestamp; #endif while (0 != hopInfo) { HYPRE_Int i = first_lsb_bit_indx(hopInfo); hypre_HopscotchBucket* currElm = elmAry + i; if (hash == currElm->hash && key == currElm->key) { return currElm->data; } hopInfo &= ~(1U << i); } #ifdef HYPRE_CONCURRENT_HOPSCOTCH if (segment->timestamp == startTimestamp) { return -1; } #endif hypre_HopscotchBucket *currBucket = &(m->table[hash & m->bucketMask]); HYPRE_Int i; for (i = 0; i < HYPRE_HOPSCOTCH_HASH_HOP_RANGE; ++i, ++currBucket) { if (hash == currBucket->hash && key == currBucket->key) { return currBucket->data; } } return -1; } static inline HYPRE_MAYBE_UNUSED_FUNC HYPRE_Int hypre_UnorderedBigIntMapGet( hypre_UnorderedBigIntMap *m, HYPRE_BigInt key ) { //CALCULATE HASH .......................... #if defined(HYPRE_BIGINT) || defined(HYPRE_MIXEDINT) HYPRE_BigInt hash = hypre_BigHash(key); #else HYPRE_BigInt hash = hypre_Hash(key); #endif //CHECK IF ALREADY CONTAIN ................ #ifdef HYPRE_CONCURRENT_HOPSCOTCH hypre_HopscotchSegment *segment = &m->segments[(HYPRE_Int)(hash & m->segmentMask)]; #endif hypre_BigHopscotchBucket *elmAry = &(m->table[(HYPRE_Int)(hash & m->bucketMask)]); hypre_uint hopInfo = elmAry->hopInfo; if (0 == hopInfo) { return -1; } else if (1 == hopInfo ) { if (hash == elmAry->hash && key == elmAry->key) { return elmAry->data; } else { return -1; } } #ifdef HYPRE_CONCURRENT_HOPSCOTCH HYPRE_Int startTimestamp = segment->timestamp; #endif while (0 != hopInfo) { HYPRE_Int i = first_lsb_bit_indx(hopInfo); hypre_BigHopscotchBucket* currElm = elmAry + i; if (hash == currElm->hash && key == currElm->key) { return currElm->data; } hopInfo &= ~(1U << i); } #ifdef HYPRE_CONCURRENT_HOPSCOTCH if (segment->timestamp == startTimestamp) { return -1; } #endif hypre_BigHopscotchBucket *currBucket = &(m->table[hash & m->bucketMask]); HYPRE_Int i; for (i = 0; i < HYPRE_HOPSCOTCH_HASH_HOP_RANGE; ++i, ++currBucket) { if (hash == currBucket->hash && key == currBucket->key) { return currBucket->data; } } return -1; } //status Operations ......................................................... static inline HYPRE_MAYBE_UNUSED_FUNC HYPRE_Int hypre_UnorderedIntSetSize( hypre_UnorderedIntSet *s ) { HYPRE_Int counter = 0; HYPRE_Int n = s->bucketMask + HYPRE_HOPSCOTCH_HASH_INSERT_RANGE; HYPRE_Int i; for (i = 0; i < n; ++i) { if (HYPRE_HOPSCOTCH_HASH_EMPTY != s->hash[i]) { ++counter; } } return counter; } static inline HYPRE_MAYBE_UNUSED_FUNC HYPRE_Int hypre_UnorderedBigIntSetSize( hypre_UnorderedBigIntSet *s ) { HYPRE_Int counter = 0; HYPRE_BigInt n = s->bucketMask + HYPRE_HOPSCOTCH_HASH_INSERT_RANGE; HYPRE_Int i; for (i = 0; i < n; ++i) { if (HYPRE_HOPSCOTCH_HASH_EMPTY != s->hash[i]) { ++counter; } } return counter; } static inline HYPRE_MAYBE_UNUSED_FUNC HYPRE_Int hypre_UnorderedIntMapSize( hypre_UnorderedIntMap *m ) { HYPRE_Int counter = 0; HYPRE_Int n = m->bucketMask + HYPRE_HOPSCOTCH_HASH_INSERT_RANGE; HYPRE_Int i; for (i = 0; i < n; ++i) { if ( HYPRE_HOPSCOTCH_HASH_EMPTY != m->table[i].hash ) { ++counter; } } return counter; } static inline HYPRE_MAYBE_UNUSED_FUNC HYPRE_Int hypre_UnorderedBigIntMapSize( hypre_UnorderedBigIntMap *m ) { HYPRE_Int counter = 0; HYPRE_Int n = m->bucketMask + HYPRE_HOPSCOTCH_HASH_INSERT_RANGE; HYPRE_Int i; for (i = 0; i < n; ++i) { if ( HYPRE_HOPSCOTCH_HASH_EMPTY != m->table[i].hash ) { ++counter; } } return counter; } HYPRE_Int *hypre_UnorderedIntSetCopyToArray( hypre_UnorderedIntSet *s, HYPRE_Int *len ); HYPRE_BigInt *hypre_UnorderedBigIntSetCopyToArray( hypre_UnorderedBigIntSet *s, HYPRE_Int *len ); //modification Operations ................................................... static inline HYPRE_MAYBE_UNUSED_FUNC void hypre_UnorderedIntSetPut( hypre_UnorderedIntSet *s, HYPRE_Int key ) { //CALCULATE HASH .......................... #ifdef HYPRE_BIGINT HYPRE_Int hash = hypre_BigHash(key); #else HYPRE_Int hash = hypre_Hash(key); #endif //LOCK KEY HASH ENTERY .................... #ifdef HYPRE_CONCURRENT_HOPSCOTCH hypre_HopscotchSegment *segment = &s->segments[hash & s->segmentMask]; omp_set_lock(&segment->lock); #endif HYPRE_Int bucket = hash & s->bucketMask; //CHECK IF ALREADY CONTAIN ................ hypre_uint hopInfo = s->hopInfo[bucket]; while (0 != hopInfo) { HYPRE_Int i = first_lsb_bit_indx(hopInfo); HYPRE_Int currElm = bucket + i; if (hash == s->hash[currElm] && key == s->key[currElm]) { #ifdef HYPRE_CONCURRENT_HOPSCOTCH omp_unset_lock(&segment->lock); #endif return; } hopInfo &= ~(1U << i); } //LOOK FOR FREE BUCKET .................... HYPRE_Int free_bucket = bucket; HYPRE_Int free_dist = 0; for ( ; free_dist < HYPRE_HOPSCOTCH_HASH_INSERT_RANGE; ++free_dist, ++free_bucket) { if ( (HYPRE_HOPSCOTCH_HASH_EMPTY == s->hash[free_bucket]) && (HYPRE_HOPSCOTCH_HASH_EMPTY == hypre_compare_and_swap((HYPRE_Int *)&s->hash[free_bucket], (HYPRE_Int)HYPRE_HOPSCOTCH_HASH_EMPTY, (HYPRE_Int)HYPRE_HOPSCOTCH_HASH_BUSY)) ) { break; } } //PLACE THE NEW KEY ....................... if (free_dist < HYPRE_HOPSCOTCH_HASH_INSERT_RANGE) { do { if (free_dist < HYPRE_HOPSCOTCH_HASH_HOP_RANGE) { s->key[free_bucket] = key; s->hash[free_bucket] = hash; s->hopInfo[bucket] |= 1U << free_dist; #ifdef HYPRE_CONCURRENT_HOPSCOTCH omp_unset_lock(&segment->lock); #endif return; } hypre_UnorderedIntSetFindCloserFreeBucket(s, #ifdef HYPRE_CONCURRENT_HOPSCOTCH segment, #endif &free_bucket, &free_dist); } while (-1 != free_bucket); } //NEED TO RESIZE .......................... hypre_error_w_msg(HYPRE_ERROR_GENERIC, "ERROR - RESIZE is not implemented\n"); /*fprintf(stderr, "ERROR - RESIZE is not implemented\n");*/ exit(1); return; } static inline HYPRE_MAYBE_UNUSED_FUNC void hypre_UnorderedBigIntSetPut( hypre_UnorderedBigIntSet *s, HYPRE_BigInt key ) { //CALCULATE HASH .......................... #if defined(HYPRE_BIGINT) || defined(HYPRE_MIXEDINT) HYPRE_BigInt hash = hypre_BigHash(key); #else HYPRE_BigInt hash = hypre_Hash(key); #endif //LOCK KEY HASH ENTERY .................... #ifdef HYPRE_CONCURRENT_HOPSCOTCH hypre_HopscotchSegment *segment = &s->segments[hash & s->segmentMask]; omp_set_lock(&segment->lock); #endif HYPRE_Int bucket = (HYPRE_Int)(hash & s->bucketMask); //CHECK IF ALREADY CONTAIN ................ hypre_uint hopInfo = s->hopInfo[bucket]; while (0 != hopInfo) { HYPRE_Int i = first_lsb_bit_indx(hopInfo); HYPRE_Int currElm = bucket + i; if (hash == s->hash[currElm] && key == s->key[currElm]) { #ifdef HYPRE_CONCURRENT_HOPSCOTCH omp_unset_lock(&segment->lock); #endif return; } hopInfo &= ~(1U << i); } //LOOK FOR FREE BUCKET .................... HYPRE_Int free_bucket = bucket; HYPRE_Int free_dist = 0; for ( ; free_dist < HYPRE_HOPSCOTCH_HASH_INSERT_RANGE; ++free_dist, ++free_bucket) { if ( (HYPRE_HOPSCOTCH_HASH_EMPTY == s->hash[free_bucket]) && (HYPRE_HOPSCOTCH_HASH_EMPTY == hypre_compare_and_swap((HYPRE_Int *)&s->hash[free_bucket], (HYPRE_Int)HYPRE_HOPSCOTCH_HASH_EMPTY, (HYPRE_Int)HYPRE_HOPSCOTCH_HASH_BUSY)) ) { break; } } //PLACE THE NEW KEY ....................... if (free_dist < HYPRE_HOPSCOTCH_HASH_INSERT_RANGE) { do { if (free_dist < HYPRE_HOPSCOTCH_HASH_HOP_RANGE) { s->key[free_bucket] = key; s->hash[free_bucket] = hash; s->hopInfo[bucket] |= 1U << free_dist; #ifdef HYPRE_CONCURRENT_HOPSCOTCH omp_unset_lock(&segment->lock); #endif return; } hypre_UnorderedBigIntSetFindCloserFreeBucket(s, #ifdef HYPRE_CONCURRENT_HOPSCOTCH segment, #endif &free_bucket, &free_dist); } while (-1 != free_bucket); } //NEED TO RESIZE .......................... hypre_error_w_msg(HYPRE_ERROR_GENERIC, "ERROR - RESIZE is not implemented\n"); /*fprintf(stderr, "ERROR - RESIZE is not implemented\n");*/ exit(1); return; } static inline HYPRE_MAYBE_UNUSED_FUNC HYPRE_Int hypre_UnorderedIntMapPutIfAbsent( hypre_UnorderedIntMap *m, HYPRE_Int key, HYPRE_Int data ) { //CALCULATE HASH .......................... #ifdef HYPRE_BIGINT HYPRE_Int hash = hypre_BigHash(key); #else HYPRE_Int hash = hypre_Hash(key); #endif //LOCK KEY HASH ENTERY .................... #ifdef HYPRE_CONCURRENT_HOPSCOTCH hypre_HopscotchSegment *segment = &m->segments[hash & m->segmentMask]; omp_set_lock(&segment->lock); #endif hypre_HopscotchBucket* startBucket = &(m->table[hash & m->bucketMask]); //CHECK IF ALREADY CONTAIN ................ hypre_uint hopInfo = startBucket->hopInfo; while (0 != hopInfo) { HYPRE_Int i = first_lsb_bit_indx(hopInfo); hypre_HopscotchBucket* currElm = startBucket + i; if (hash == currElm->hash && key == currElm->key) { HYPRE_Int rc = currElm->data; #ifdef HYPRE_CONCURRENT_HOPSCOTCH omp_unset_lock(&segment->lock); #endif return rc; } hopInfo &= ~(1U << i); } //LOOK FOR FREE BUCKET .................... hypre_HopscotchBucket* free_bucket = startBucket; HYPRE_Int free_dist = 0; for ( ; free_dist < HYPRE_HOPSCOTCH_HASH_INSERT_RANGE; ++free_dist, ++free_bucket) { if ( (HYPRE_HOPSCOTCH_HASH_EMPTY == free_bucket->hash) && (HYPRE_HOPSCOTCH_HASH_EMPTY == hypre_compare_and_swap((HYPRE_Int *)&free_bucket->hash, (HYPRE_Int)HYPRE_HOPSCOTCH_HASH_EMPTY, (HYPRE_Int)HYPRE_HOPSCOTCH_HASH_BUSY)) ) { break; } } //PLACE THE NEW KEY ....................... if (free_dist < HYPRE_HOPSCOTCH_HASH_INSERT_RANGE) { do { if (free_dist < HYPRE_HOPSCOTCH_HASH_HOP_RANGE) { free_bucket->data = data; free_bucket->key = key; free_bucket->hash = hash; startBucket->hopInfo = startBucket->hopInfo | (1U << free_dist); #ifdef HYPRE_CONCURRENT_HOPSCOTCH omp_unset_lock(&segment->lock); #endif return HYPRE_HOPSCOTCH_HASH_EMPTY; } hypre_UnorderedIntMapFindCloserFreeBucket(m, #ifdef HYPRE_CONCURRENT_HOPSCOTCH segment, #endif &free_bucket, &free_dist); } while (NULL != free_bucket); } //NEED TO RESIZE .......................... hypre_error_w_msg(HYPRE_ERROR_GENERIC, "ERROR - RESIZE is not implemented\n"); /*fprintf(stderr, "ERROR - RESIZE is not implemented\n");*/ exit(1); return HYPRE_HOPSCOTCH_HASH_EMPTY; } static inline HYPRE_MAYBE_UNUSED_FUNC HYPRE_Int hypre_UnorderedBigIntMapPutIfAbsent( hypre_UnorderedBigIntMap *m, HYPRE_BigInt key, HYPRE_Int data) { //CALCULATE HASH .......................... #if defined(HYPRE_BIGINT) || defined(HYPRE_MIXEDINT) HYPRE_BigInt hash = hypre_BigHash(key); #else HYPRE_BigInt hash = hypre_Hash(key); #endif //LOCK KEY HASH ENTERY .................... #ifdef HYPRE_CONCURRENT_HOPSCOTCH hypre_HopscotchSegment *segment = &m->segments[hash & m->segmentMask]; omp_set_lock(&segment->lock); #endif hypre_BigHopscotchBucket* startBucket = &(m->table[hash & m->bucketMask]); //CHECK IF ALREADY CONTAIN ................ hypre_uint hopInfo = startBucket->hopInfo; while (0 != hopInfo) { HYPRE_Int i = first_lsb_bit_indx(hopInfo); hypre_BigHopscotchBucket* currElm = startBucket + i; if (hash == currElm->hash && key == currElm->key) { HYPRE_Int rc = currElm->data; #ifdef HYPRE_CONCURRENT_HOPSCOTCH omp_unset_lock(&segment->lock); #endif return rc; } hopInfo &= ~(1U << i); } //LOOK FOR FREE BUCKET .................... hypre_BigHopscotchBucket* free_bucket = startBucket; HYPRE_Int free_dist = 0; for ( ; free_dist < HYPRE_HOPSCOTCH_HASH_INSERT_RANGE; ++free_dist, ++free_bucket) { if ( (HYPRE_HOPSCOTCH_HASH_EMPTY == free_bucket->hash) && (HYPRE_HOPSCOTCH_HASH_EMPTY == hypre_compare_and_swap((HYPRE_Int *)&free_bucket->hash, (HYPRE_Int)HYPRE_HOPSCOTCH_HASH_EMPTY, (HYPRE_Int)HYPRE_HOPSCOTCH_HASH_BUSY)) ) { break; } } //PLACE THE NEW KEY ....................... if (free_dist < HYPRE_HOPSCOTCH_HASH_INSERT_RANGE) { do { if (free_dist < HYPRE_HOPSCOTCH_HASH_HOP_RANGE) { free_bucket->data = data; free_bucket->key = key; free_bucket->hash = hash; startBucket->hopInfo = startBucket->hopInfo | (1U << free_dist); #ifdef HYPRE_CONCURRENT_HOPSCOTCH omp_unset_lock(&segment->lock); #endif return HYPRE_HOPSCOTCH_HASH_EMPTY; } hypre_UnorderedBigIntMapFindCloserFreeBucket(m, #ifdef HYPRE_CONCURRENT_HOPSCOTCH segment, #endif &free_bucket, &free_dist); } while (NULL != free_bucket); } //NEED TO RESIZE .......................... hypre_error_w_msg(HYPRE_ERROR_GENERIC, "ERROR - RESIZE is not implemented\n"); /*fprintf(stderr, "ERROR - RESIZE is not implemented\n");*/ exit(1); return HYPRE_HOPSCOTCH_HASH_EMPTY; } #ifdef __cplusplus } // extern "C" #endif #endif // hypre_HOPSCOTCH_HASH_HEADER hypre-2.33.0/src/utilities/int_array.c000066400000000000000000000511771477326011500177050ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "_hypre_utilities.h" /****************************************************************************** * * Routines for hypre_IntArray struct for holding an array of integers * *****************************************************************************/ /*-------------------------------------------------------------------------- * hypre_IntArrayCreate *--------------------------------------------------------------------------*/ hypre_IntArray * hypre_IntArrayCreate( HYPRE_Int size ) { hypre_IntArray *array; array = hypre_CTAlloc(hypre_IntArray, 1, HYPRE_MEMORY_HOST); hypre_IntArrayData(array) = NULL; hypre_IntArraySize(array) = size; hypre_IntArrayMemoryLocation(array) = hypre_HandleMemoryLocation(hypre_handle()); return array; } /*-------------------------------------------------------------------------- * hypre_IntArrayDestroy *--------------------------------------------------------------------------*/ HYPRE_Int hypre_IntArrayDestroy( hypre_IntArray *array ) { if (array) { HYPRE_MemoryLocation memory_location = hypre_IntArrayMemoryLocation(array); hypre_TFree(hypre_IntArrayData(array), memory_location); hypre_TFree(array, HYPRE_MEMORY_HOST); } return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_IntArrayInitialize *--------------------------------------------------------------------------*/ HYPRE_Int hypre_IntArrayInitialize_v2( hypre_IntArray *array, HYPRE_MemoryLocation memory_location ) { HYPRE_Int size = hypre_IntArraySize(array); hypre_IntArrayMemoryLocation(array) = memory_location; /* Caveat: for pre-existing data, the memory location must be guaranteed * to be consistent with `memory_location' * Otherwise, mismatches will exist and problems will be encountered * when being used, and freed */ if (!hypre_IntArrayData(array)) { hypre_IntArrayData(array) = hypre_CTAlloc(HYPRE_Int, size, memory_location); } return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_IntArrayInitialize *--------------------------------------------------------------------------*/ HYPRE_Int hypre_IntArrayInitialize( hypre_IntArray *array ) { hypre_IntArrayInitialize_v2( array, hypre_IntArrayMemoryLocation(array) ); return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_IntArrayCopy * * Copies data from x to y * if size of x is larger than y only the first size_y elements of x are * copied to y *--------------------------------------------------------------------------*/ HYPRE_Int hypre_IntArrayCopy( hypre_IntArray *x, hypre_IntArray *y ) { size_t size = hypre_min( hypre_IntArraySize(x), hypre_IntArraySize(y) ); hypre_TMemcpy( hypre_IntArrayData(y), hypre_IntArrayData(x), HYPRE_Int, size, hypre_IntArrayMemoryLocation(y), hypre_IntArrayMemoryLocation(x) ); return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_IntArrayCloneDeep_v2 *--------------------------------------------------------------------------*/ hypre_IntArray * hypre_IntArrayCloneDeep_v2( hypre_IntArray *x, HYPRE_MemoryLocation memory_location ) { HYPRE_Int size = hypre_IntArraySize(x); hypre_IntArray *y = hypre_IntArrayCreate( size ); hypre_IntArrayInitialize_v2(y, memory_location); hypre_IntArrayCopy( x, y ); return y; } /*-------------------------------------------------------------------------- * hypre_IntArrayCloneDeep * Returns a complete copy of x - a deep copy, with its own copy of the data. *--------------------------------------------------------------------------*/ hypre_IntArray * hypre_IntArrayCloneDeep( hypre_IntArray *x ) { return hypre_IntArrayCloneDeep_v2(x, hypre_IntArrayMemoryLocation(x)); } /*-------------------------------------------------------------------------- * hypre_IntArrayMigrate *--------------------------------------------------------------------------*/ HYPRE_Int hypre_IntArrayMigrate( hypre_IntArray *v, HYPRE_MemoryLocation memory_location ) { HYPRE_Int size = hypre_IntArraySize(v); HYPRE_Int *v_data = hypre_IntArrayData(v); HYPRE_MemoryLocation old_memory_location = hypre_IntArrayMemoryLocation(v); HYPRE_Int *w_data; /* Update v's memory location */ hypre_IntArrayMemoryLocation(v) = memory_location; if ( hypre_GetActualMemLocation(memory_location) != hypre_GetActualMemLocation(old_memory_location) ) { w_data = hypre_TAlloc(HYPRE_Int, size, memory_location); hypre_TMemcpy(w_data, v_data, HYPRE_Int, size, memory_location, old_memory_location); hypre_TFree(v_data, old_memory_location); hypre_IntArrayData(v) = w_data; } return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_IntArrayPrint *--------------------------------------------------------------------------*/ HYPRE_Int hypre_IntArrayPrint( MPI_Comm comm, hypre_IntArray *array, const char *filename ) { HYPRE_Int size = hypre_IntArraySize(array); HYPRE_MemoryLocation memory_location = hypre_IntArrayMemoryLocation(array); hypre_IntArray *h_array; HYPRE_Int *data; FILE *file; HYPRE_Int i, myid; char new_filename[1024]; hypre_MPI_Comm_rank(comm, &myid); /* Move data to host if needed*/ h_array = (hypre_GetActualMemLocation(memory_location) == hypre_MEMORY_DEVICE) ? hypre_IntArrayCloneDeep_v2(array, HYPRE_MEMORY_HOST) : array; data = hypre_IntArrayData(h_array); /* Open file */ hypre_sprintf(new_filename, "%s.%05d", filename, myid); if ((file = fopen(new_filename, "w")) == NULL) { hypre_error_w_msg(HYPRE_ERROR_GENERIC, "Error: can't open output file\n"); return hypre_error_flag; } /* Print to file */ hypre_fprintf(file, "%d\n", size); for (i = 0; i < size; i++) { hypre_fprintf(file, "%d\n", data[i]); } fclose(file); /* Free memory */ if (h_array != array) { hypre_IntArrayDestroy(h_array); } return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_IntArrayRead *--------------------------------------------------------------------------*/ HYPRE_Int hypre_IntArrayRead( MPI_Comm comm, const char *filename, hypre_IntArray **array_ptr ) { hypre_IntArray *array; HYPRE_Int size; FILE *file; HYPRE_Int i, myid; char new_filename[1024]; hypre_MPI_Comm_rank(comm, &myid); /* Open file */ hypre_sprintf(new_filename, "%s.%05d", filename, myid); if ((file = fopen(new_filename, "r")) == NULL) { hypre_error_w_msg(HYPRE_ERROR_GENERIC, "Error: can't open input file\n"); return hypre_error_flag; } /* Read array size from file */ hypre_fscanf(file, "%d\n", &size); /* Create IntArray on the host */ array = hypre_IntArrayCreate(size); hypre_IntArrayInitialize_v2(array, HYPRE_MEMORY_HOST); /* Read array values from file */ for (i = 0; i < size; i++) { hypre_fscanf(file, "%d\n", &hypre_IntArrayData(array)[i]); } fclose(file); /* Migrate to final memory location */ hypre_IntArrayMigrate(array, hypre_HandleMemoryLocation(hypre_handle())); /* Set output pointer */ *array_ptr = array; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_IntArraySetConstantValuesHost *--------------------------------------------------------------------------*/ HYPRE_Int hypre_IntArraySetConstantValuesHost( hypre_IntArray *v, HYPRE_Int value ) { HYPRE_Int *array_data = hypre_IntArrayData(v); HYPRE_Int size = hypre_IntArraySize(v); HYPRE_Int i; #if defined(HYPRE_USING_OPENMP) #pragma omp parallel for private(i) HYPRE_SMP_SCHEDULE #endif for (i = 0; i < size; i++) { array_data[i] = value; } return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_IntArraySetConstantValues *--------------------------------------------------------------------------*/ HYPRE_Int hypre_IntArraySetConstantValues( hypre_IntArray *v, HYPRE_Int value ) { if (hypre_IntArraySize(v) <= 0) { return hypre_error_flag; } #if defined(HYPRE_USING_GPU) || defined(HYPRE_USING_DEVICE_OPENMP) HYPRE_ExecutionPolicy exec = hypre_GetExecPolicy1(hypre_IntArrayMemoryLocation(v)); if (exec == HYPRE_EXEC_DEVICE) { hypre_IntArraySetConstantValuesDevice(v, value); } else #endif { hypre_IntArraySetConstantValuesHost(v, value); } return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_IntArraySetInterleavedValuesHost *--------------------------------------------------------------------------*/ HYPRE_Int hypre_IntArraySetInterleavedValuesHost( hypre_IntArray *v, HYPRE_Int cycle ) { HYPRE_Int *array_data = hypre_IntArrayData(v); HYPRE_Int size = hypre_IntArraySize(v); HYPRE_Int i; #if defined(HYPRE_USING_OPENMP) #pragma omp parallel for private(i) HYPRE_SMP_SCHEDULE #endif for (i = 0; i < size; i++) { array_data[i] = i % cycle; } return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_IntArraySetInterleavedValues *--------------------------------------------------------------------------*/ HYPRE_Int hypre_IntArraySetInterleavedValues( hypre_IntArray *v, HYPRE_Int cycle ) { if (cycle < 1) { hypre_error_w_msg(HYPRE_ERROR_GENERIC, "Invalid cycle value!"); return hypre_error_flag; } #if defined(HYPRE_USING_GPU) || defined(HYPRE_USING_DEVICE_OPENMP) HYPRE_ExecutionPolicy exec = hypre_GetExecPolicy1(hypre_IntArrayMemoryLocation(v)); if (exec == HYPRE_EXEC_DEVICE) { hypre_IntArraySetInterleavedValuesDevice(v, cycle); } else #endif { hypre_IntArraySetInterleavedValuesHost(v, cycle); } return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_IntArrayCountHost *--------------------------------------------------------------------------*/ HYPRE_Int hypre_IntArrayCountHost( hypre_IntArray *v, HYPRE_Int value, HYPRE_Int *num_values_ptr ) { HYPRE_Int *array_data = hypre_IntArrayData(v); HYPRE_Int size = hypre_IntArraySize(v); HYPRE_Int num_values = 0; HYPRE_Int i; #if !defined(_MSC_VER) && defined(HYPRE_USING_OPENMP) #pragma omp parallel for private(i) reduction(+:num_values) HYPRE_SMP_SCHEDULE #endif for (i = 0; i < size; i++) { num_values += (array_data[i] == value) ? 1 : 0; } *num_values_ptr = num_values; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_IntArrayCount *--------------------------------------------------------------------------*/ HYPRE_Int hypre_IntArrayCount( hypre_IntArray *v, HYPRE_Int value, HYPRE_Int *num_values_ptr ) { if (hypre_IntArraySize(v) <= 0) { *num_values_ptr = 0; return hypre_error_flag; } #if defined(HYPRE_USING_GPU) || defined(HYPRE_USING_DEVICE_OPENMP) HYPRE_ExecutionPolicy exec = hypre_GetExecPolicy1(hypre_IntArrayMemoryLocation(v)); if (exec == HYPRE_EXEC_DEVICE) { hypre_IntArrayCountDevice(v, value, num_values_ptr); } else #endif { hypre_IntArrayCountHost(v, value, num_values_ptr); } return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_IntArrayInverseMappingHost *--------------------------------------------------------------------------*/ HYPRE_Int hypre_IntArrayInverseMappingHost( hypre_IntArray *v, hypre_IntArray *w ) { HYPRE_Int size = hypre_IntArraySize(v); HYPRE_Int *v_data = hypre_IntArrayData(v); HYPRE_Int *w_data = hypre_IntArrayData(w); HYPRE_Int i; #if defined(HYPRE_USING_OPENMP) #pragma omp parallel for private(i) HYPRE_SMP_SCHEDULE #endif for (i = 0; i < size; i++) { w_data[v_data[i]] = i; } return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_IntArrayInverseMapping * * Compute the reverse mapping (w) given an input array (v) *--------------------------------------------------------------------------*/ HYPRE_Int hypre_IntArrayInverseMapping( hypre_IntArray *v, hypre_IntArray **w_ptr ) { HYPRE_Int size = hypre_IntArraySize(v); HYPRE_MemoryLocation memory_location = hypre_IntArrayMemoryLocation(v); hypre_IntArray *w; /* Create and initialize output array */ w = hypre_IntArrayCreate(size); hypre_IntArrayInitialize_v2(w, memory_location); /* Exit if array has no elements */ if (hypre_IntArraySize(w) <= 0) { *w_ptr = w; return hypre_error_flag; } #if defined(HYPRE_USING_GPU) HYPRE_ExecutionPolicy exec = hypre_GetExecPolicy1(memory_location); if (exec == HYPRE_EXEC_DEVICE) { hypre_IntArrayInverseMappingDevice(v, w); } else #endif { hypre_IntArrayInverseMappingHost(v, w); } /* Set output pointer */ *w_ptr = w; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_IntArrayNegate *--------------------------------------------------------------------------*/ HYPRE_Int hypre_IntArrayNegate( hypre_IntArray *v ) { HYPRE_Int *array_data = hypre_IntArrayData(v); HYPRE_Int size = hypre_IntArraySize(v); HYPRE_Int i; if (size <= 0) { return hypre_error_flag; } #if defined(HYPRE_USING_GPU) HYPRE_ExecutionPolicy exec = hypre_GetExecPolicy1(hypre_IntArrayMemoryLocation(v)); if (exec == HYPRE_EXEC_DEVICE) { hypre_IntArrayNegateDevice(v); } else #endif { #if defined(HYPRE_USING_OPENMP) #pragma omp parallel for private(i) HYPRE_SMP_SCHEDULE #endif for (i = 0; i < size; i++) { array_data[i] = - array_data[i]; } } return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_IntArraySeparateByValue * * This function separates the indices of an array "v" based on * specified values. * * Input parameters: * - num_values: number of unique values found in "v" * - values: array of size "num_values" containing a list of unique values * - sizes: array of size "num_values" containing the number of occurrences * in "v" of each value from "values". * - v: object of type hypre_IntArray containing values for categorization. * * Output parameter: * - w: object of type hypre_IntArrayArray containing pointers to "num_values" * arrays. Each array contains the set of indices in "v" that map to a * particular value of the array "values". * * Example: * Consider the following: * - v = {-1, -1, 1, -1, -1, 1, 1, -1} * - values = {-1, 1} * - num_values = 2 * * This function computes: * - w[0] = {0, 1, 3, 4, 7} * - w[1] = {2, 5, 6} *--------------------------------------------------------------------------*/ HYPRE_Int hypre_IntArraySeparateByValue( HYPRE_Int num_values, HYPRE_Int *values, HYPRE_Int *sizes, hypre_IntArray *v, hypre_IntArrayArray **w_ptr ) { hypre_IntArrayArray *w; HYPRE_Int *v_data = hypre_IntArrayData(v); HYPRE_Int v_size = hypre_IntArraySize(v); HYPRE_Int i, k, val; HYPRE_Int *count; /* Create output array */ w = hypre_IntArrayArrayCreate(num_values, sizes); hypre_IntArrayArrayInitializeIn(w, hypre_IntArrayMemoryLocation(v)); /* Fill arrays */ #if defined(HYPRE_USING_GPU) || defined(HYPRE_USING_DEVICE_OPENMP) HYPRE_ExecutionPolicy exec = hypre_GetExecPolicy1(hypre_IntArrayMemoryLocation(v)); if (exec == HYPRE_EXEC_DEVICE) { hypre_IntArraySeparateByValueDevice(num_values, values, sizes, v, w); } else #endif { count = hypre_CTAlloc(HYPRE_Int, num_values, HYPRE_MEMORY_HOST); for (k = 0; k < v_size; k++) { val = v_data[k]; /* Find which entry "val" belongs to */ for (i = 0; i < num_values; i++) { if (values[i] == val) { hypre_IntArrayArrayEntryIDataJ(w, i, count[i]++) = k; break; } } } hypre_TFree(count, HYPRE_MEMORY_HOST); } /* Set output pointer */ *w_ptr = w; return hypre_error_flag; } /****************************************************************************** * * Routines for hypre_IntArrayArray struct * *****************************************************************************/ /*-------------------------------------------------------------------------- * hypre_IntArrayArrayCreate *--------------------------------------------------------------------------*/ hypre_IntArrayArray * hypre_IntArrayArrayCreate( HYPRE_Int num_entries, HYPRE_Int *sizes ) { hypre_IntArrayArray *w; HYPRE_Int i; w = hypre_CTAlloc(hypre_IntArrayArray, 1, HYPRE_MEMORY_HOST); hypre_IntArrayArraySize(w) = num_entries; hypre_IntArrayArrayEntries(w) = hypre_TAlloc(hypre_IntArray*, num_entries, HYPRE_MEMORY_HOST); for (i = 0; i < num_entries; i++) { hypre_IntArrayArrayEntryI(w, i) = hypre_IntArrayCreate(sizes[i]); } return w; } /*-------------------------------------------------------------------------- * hypre_IntArrayArrayDestroy *--------------------------------------------------------------------------*/ HYPRE_Int hypre_IntArrayArrayDestroy( hypre_IntArrayArray *w ) { HYPRE_Int i; if (w) { for (i = 0; i < hypre_IntArrayArraySize(w); i++) { hypre_IntArrayDestroy(hypre_IntArrayArrayEntryI(w, i)); } hypre_TFree(hypre_IntArrayArrayEntries(w), HYPRE_MEMORY_HOST); hypre_TFree(w, HYPRE_MEMORY_HOST); } return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_IntArrayArrayInitializeIn *--------------------------------------------------------------------------*/ HYPRE_Int hypre_IntArrayArrayInitializeIn( hypre_IntArrayArray *w, HYPRE_MemoryLocation memory_location ) { HYPRE_Int i; for (i = 0; i < hypre_IntArrayArraySize(w); i++) { hypre_IntArrayInitialize_v2(hypre_IntArrayArrayEntryI(w, i), memory_location); } return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_IntArrayArrayInitialize *--------------------------------------------------------------------------*/ HYPRE_Int hypre_IntArrayArrayInitialize( hypre_IntArrayArray *w ) { hypre_IntArray *v = hypre_IntArrayArrayEntryI(w, 0); HYPRE_Int i; for (i = 0; i < hypre_IntArrayArraySize(w); i++) { hypre_IntArrayInitialize_v2(v, hypre_IntArrayMemoryLocation(v)); } return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_IntArrayArrayMigrate *--------------------------------------------------------------------------*/ HYPRE_Int hypre_IntArrayArrayMigrate( hypre_IntArrayArray *w, HYPRE_MemoryLocation memory_location ) { HYPRE_Int i; for (i = 0; i < hypre_IntArrayArraySize(w); i++) { hypre_IntArrayMigrate(hypre_IntArrayArrayEntryI(w, i), memory_location); } return hypre_error_flag; } hypre-2.33.0/src/utilities/int_array.h000066400000000000000000000052041477326011500177000ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * Header file for hypre_IntArray struct for holding an array of integers * *****************************************************************************/ #ifndef hypre_INTARRAY_HEADER #define hypre_INTARRAY_HEADER /*-------------------------------------------------------------------------- * hypre_IntArray *--------------------------------------------------------------------------*/ typedef struct { /* pointer to data and size of data */ HYPRE_Int *data; HYPRE_Int size; /* memory location of array data */ HYPRE_MemoryLocation memory_location; } hypre_IntArray; /*-------------------------------------------------------------------------- * Accessor functions for the IntArray structure *--------------------------------------------------------------------------*/ #define hypre_IntArrayData(array) ((array) -> data) #define hypre_IntArrayDataI(array, i) ((array) -> data[i]) #define hypre_IntArraySize(array) ((array) -> size) #define hypre_IntArrayMemoryLocation(array) ((array) -> memory_location) /****************************************************************************** * * hypre_IntArrayArray: struct for holding an array of hypre_IntArray * *****************************************************************************/ /*-------------------------------------------------------------------------- * hypre_IntArrayArray *--------------------------------------------------------------------------*/ typedef struct { hypre_IntArray **entries; HYPRE_Int size; } hypre_IntArrayArray; /*-------------------------------------------------------------------------- * Accessor functions for the IntArrayArray structure *--------------------------------------------------------------------------*/ #define hypre_IntArrayArrayEntries(array) ((array) -> entries) #define hypre_IntArrayArrayEntryI(array, i) ((array) -> entries[i]) #define hypre_IntArrayArrayEntryIData(array, i) ((array) -> entries[i] -> data) #define hypre_IntArrayArrayEntryIDataJ(array, i, j) ((array) -> entries[i] -> data[j]) #define hypre_IntArrayArraySize(array) ((array) -> size) #endif hypre-2.33.0/src/utilities/int_array_device.c000066400000000000000000000166371477326011500212260ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "_hypre_utilities.h" #include "_hypre_utilities.hpp" #include "_hypre_onedpl.hpp" /* GPU kernels */ #if defined(HYPRE_USING_GPU) /*-------------------------------------------------------------------------- * hypreGPUKernel_IntArrayInverseMapping *--------------------------------------------------------------------------*/ __global__ void hypreGPUKernel_IntArrayInverseMapping( hypre_DeviceItem &item, HYPRE_Int size, HYPRE_Int *v_data, HYPRE_Int *w_data ) { HYPRE_Int i = hypre_gpu_get_grid_thread_id<1, 1>(item); if (i < size) { w_data[v_data[i]] = i; } } #endif /* Functions */ #if defined(HYPRE_USING_GPU) || defined(HYPRE_USING_DEVICE_OPENMP) /*-------------------------------------------------------------------------- * hypre_IntArraySetConstantValuesDevice *--------------------------------------------------------------------------*/ HYPRE_Int hypre_IntArraySetConstantValuesDevice( hypre_IntArray *v, HYPRE_Int value ) { HYPRE_Int *array_data = hypre_IntArrayData(v); HYPRE_Int size = hypre_IntArraySize(v); #if defined(HYPRE_USING_GPU) hypreDevice_IntFilln( array_data, size, value ); hypre_SyncComputeStream(); #elif defined(HYPRE_USING_DEVICE_OPENMP) HYPRE_Int i; #pragma omp target teams distribute parallel for private(i) is_device_ptr(array_data) for (i = 0; i < size; i++) { array_data[i] = value; } #endif return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_IntArrayInverseMappingDevice *--------------------------------------------------------------------------*/ HYPRE_Int hypre_IntArrayInverseMappingDevice( hypre_IntArray *v, hypre_IntArray *w ) { HYPRE_Int size = hypre_IntArraySize(v); HYPRE_Int *v_data = hypre_IntArrayData(v); HYPRE_Int *w_data = hypre_IntArrayData(w); #if defined(HYPRE_USING_GPU) dim3 bDim = hypre_GetDefaultDeviceBlockDimension(); dim3 gDim = hypre_GetDefaultDeviceGridDimension(size, "thread", bDim); HYPRE_GPU_LAUNCH( hypreGPUKernel_IntArrayInverseMapping, gDim, bDim, size, v_data, w_data ); hypre_SyncComputeStream(); #elif defined(HYPRE_USING_DEVICE_OPENMP) HYPRE_Int i; #pragma omp target teams distribute parallel for private(i) is_device_ptr(v_data, w_data) for (i = 0; i < size; i++) { w_data[v_data[i]] = i; } #endif return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_IntArrayCountDevice *--------------------------------------------------------------------------*/ HYPRE_Int hypre_IntArrayCountDevice( hypre_IntArray *v, HYPRE_Int value, HYPRE_Int *num_values_ptr ) { HYPRE_Int *array_data = hypre_IntArrayData(v); HYPRE_Int size = hypre_IntArraySize(v); #if defined(HYPRE_USING_CUDA) || defined(HYPRE_USING_HIP) *num_values_ptr = HYPRE_THRUST_CALL( count, array_data, array_data + size, value ); #elif defined(HYPRE_USING_SYCL) *num_values_ptr = HYPRE_ONEDPL_CALL( std::count, array_data, array_data + size, value ); #elif defined (HYPRE_USING_DEVICE_OPENMP) hypre_error_w_msg(HYPRE_ERROR_GENERIC, "Function not implemented for Device OpenMP"); *num_values_ptr = 0; #endif return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_IntArrayNegateDevice *--------------------------------------------------------------------------*/ HYPRE_Int hypre_IntArrayNegateDevice( hypre_IntArray *v ) { #if defined(HYPRE_USING_CUDA) || defined(HYPRE_USING_HIP) HYPRE_THRUST_CALL( transform, hypre_IntArrayData(v), hypre_IntArrayData(v) + hypre_IntArraySize(v), hypre_IntArrayData(v), thrust::negate() ); #elif defined(HYPRE_USING_SYCL) HYPRE_ONEDPL_CALL( std::transform, hypre_IntArrayData(v), hypre_IntArrayData(v) + hypre_IntArraySize(v), hypre_IntArrayData(v), std::negate() ); #else hypre_error_w_msg(HYPRE_ERROR_GENERIC, "Not implemented yet!"); #endif return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_IntArraySetInterleavedValuesDevice *--------------------------------------------------------------------------*/ HYPRE_Int hypre_IntArraySetInterleavedValuesDevice( hypre_IntArray *v, HYPRE_Int cycle ) { #if defined(HYPRE_USING_CUDA) || defined(HYPRE_USING_HIP) HYPRE_THRUST_CALL( sequence, hypre_IntArrayData(v), hypre_IntArrayData(v) + hypre_IntArraySize(v)); HYPRE_THRUST_CALL( transform, hypre_IntArrayData(v), hypre_IntArrayData(v) + hypre_IntArraySize(v), hypre_IntArrayData(v), hypreFunctor_IndexCycle(cycle) ); #else hypre_error_w_msg(HYPRE_ERROR_GENERIC, "Not implemented yet!"); #endif return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_IntArraySeparateByValueDevice *--------------------------------------------------------------------------*/ HYPRE_Int hypre_IntArraySeparateByValueDevice( HYPRE_Int num_values, HYPRE_Int *values, HYPRE_Int *sizes, hypre_IntArray *v, hypre_IntArrayArray *w ) { #if defined(HYPRE_USING_CUDA) || defined(HYPRE_USING_HIP) HYPRE_Int v_size = hypre_IntArraySize(v); HYPRE_Int *v_data = hypre_IntArrayData(v); HYPRE_Int *indices, *buffer; HYPRE_Int i, val; /* Create a sequence of all indices */ indices = hypre_TAlloc(HYPRE_Int, v_size, HYPRE_MEMORY_DEVICE); HYPRE_THRUST_CALL(sequence, indices, indices + v_size); /* Create a buffer array */ buffer = hypre_TAlloc(HYPRE_Int, v_size, HYPRE_MEMORY_DEVICE); for (i = 0; i < num_values; i++) { val = values[i]; HYPRE_THRUST_CALL(copy_if, indices, indices + v_size, v_data, buffer, equal(val)); hypre_TMemcpy(hypre_IntArrayArrayEntryIData(w, i), buffer, HYPRE_Int, sizes[i], HYPRE_MEMORY_DEVICE, HYPRE_MEMORY_DEVICE); } /* Free memory */ hypre_TFree(indices, HYPRE_MEMORY_DEVICE); hypre_TFree(buffer, HYPRE_MEMORY_DEVICE); #else hypre_error_w_msg(HYPRE_ERROR_GENERIC, "Not implemented yet!"); #endif return hypre_error_flag; } #endif hypre-2.33.0/src/utilities/log.c000066400000000000000000000015021477326011500164610ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "_hypre_utilities.h" /*-------------------------------------------------------------------------- * hypre_Log2: * This routine returns the integer, floor(log_2(p)). * If p <= 0, it returns a -1. *--------------------------------------------------------------------------*/ HYPRE_Int hypre_Log2( HYPRE_Int p ) { HYPRE_Int e; if (p <= 0) { return -1; } e = 0; while (p > 1) { e += 1; p /= 2; } return e; } hypre-2.33.0/src/utilities/magma.c000066400000000000000000000024111477326011500167620ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "_hypre_utilities.h" #if defined(HYPRE_USING_MAGMA) /*-------------------------------------------------------------------------- * hypre_MagmaInitialize *--------------------------------------------------------------------------*/ HYPRE_Int hypre_MagmaInitialize(void) { /* Initialize MAGMA */ magma_init(); /* Create device queue */ #if defined(HYPRE_USING_CUDA) || defined(HYPRE_USING_HIP) hypre_int device_id; hypre_GetDevice(&device_id); magma_queue_create((magma_int_t) device_id, &hypre_HandleMagmaQueue(hypre_handle())); #endif return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_MagmaFinalize *--------------------------------------------------------------------------*/ HYPRE_Int hypre_MagmaFinalize(void) { /* Finalize MAGMA */ magma_finalize(); return hypre_error_flag; } #endif /* HYPRE_USING_MAGMA */ hypre-2.33.0/src/utilities/magma.h000066400000000000000000000046111477326011500167730ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #ifndef HYPRE_MAGMA_HEADER #define HYPRE_MAGMA_HEADER #include "HYPRE_config.h" #if defined(HYPRE_USING_MAGMA) #include "error.h" #ifdef __cplusplus extern "C++" { #endif #if !defined(MAGMA_GLOBAL) #define ADD_ #endif #include #ifdef __cplusplus } #endif /*-------------------------------------------------------------------------- * Wrappers to MAGMA functions according to hypre's precision *--------------------------------------------------------------------------*/ #if defined(HYPRE_COMPLEX) || defined(HYPRE_LONG_DOUBLE) #error "MAGMA interface does not support (yet) HYPRE_COMPLEX and HYPRE_LONG_DOUBLE" #elif defined(HYPRE_SINGLE) #define hypre_magma_getrf_gpu magma_sgetrf_gpu #define hypre_magma_getrf_nat magma_sgetrf_native #define hypre_magma_getrs_gpu magma_sgetrs_gpu #define hypre_magma_getri_gpu magma_sgetri_gpu #define hypre_magma_getri_nb magma_get_dgetri_nb #define hypre_magma_gemv magma_sgemv #else /* Double precision */ #define hypre_magma_getrf_gpu magma_dgetrf_gpu #define hypre_magma_getrf_nat magma_dgetrf_native #define hypre_magma_getrs_gpu magma_dgetrs_gpu #define hypre_magma_getri_gpu magma_dgetri_gpu #define hypre_magma_getri_nb magma_get_sgetri_nb #define hypre_magma_gemv magma_dgemv #endif /*-------------------------------------------------------------------------- * General wrapper call to MAGMA functions *--------------------------------------------------------------------------*/ #define HYPRE_MAGMA_CALL(call) do { \ magma_int_t err = call; \ if (MAGMA_SUCCESS != err) { \ printf("MAGMA ERROR (code = %d) at %s:%d\n", \ err, __FILE__, __LINE__); \ hypre_assert(0); \ } } while(0) #define HYPRE_MAGMA_VCALL(call) call #endif /* HYPRE_USING_MAGMA */ #endif /* HYPRE_MAGMA_HEADER */ hypre-2.33.0/src/utilities/matrix_stats.c000066400000000000000000000341071477326011500204310ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "_hypre_utilities.h" /****************************************************************************** * * Member functions for hypre_MatrixStats class. * *****************************************************************************/ /*-------------------------------------------------------------------------- * hypre_MatrixStatsCreate *--------------------------------------------------------------------------*/ hypre_MatrixStats* hypre_MatrixStatsCreate(void) { hypre_MatrixStats *stats; stats = hypre_CTAlloc(hypre_MatrixStats, 1, HYPRE_MEMORY_HOST); hypre_MatrixStatsNumRows(stats) = 0; hypre_MatrixStatsNumCols(stats) = 0; hypre_MatrixStatsNumNonzeros(stats) = 0ULL; hypre_MatrixStatsActualNonzeros(stats) = 0ULL; hypre_MatrixStatsActualThreshold(stats) = HYPRE_REAL_EPSILON; hypre_MatrixStatsSparsity(stats) = 0.0; hypre_MatrixStatsNnzrowMin(stats) = 0; hypre_MatrixStatsNnzrowMax(stats) = 0; hypre_MatrixStatsNnzrowAvg(stats) = 0.0; hypre_MatrixStatsNnzrowStDev(stats) = 0.0; hypre_MatrixStatsNnzrowSqsum(stats) = 0.0; hypre_MatrixStatsRowsumMin(stats) = 0.0; hypre_MatrixStatsRowsumMax(stats) = 0.0; hypre_MatrixStatsRowsumAvg(stats) = 0.0; hypre_MatrixStatsRowsumStDev(stats) = 0.0; hypre_MatrixStatsRowsumSqsum(stats) = 0.0; return stats; } /*-------------------------------------------------------------------------- * hypre_MatrixStatsDestroy *--------------------------------------------------------------------------*/ HYPRE_Int hypre_MatrixStatsDestroy(hypre_MatrixStats *stats) { if (stats) { hypre_TFree(stats, HYPRE_MEMORY_HOST); } return hypre_error_flag; } /****************************************************************************** * * Member functions for hypre_MatrixStatsArray class. * *****************************************************************************/ /*-------------------------------------------------------------------------- * hypre_MatrixStatsArrayCreate *--------------------------------------------------------------------------*/ hypre_MatrixStatsArray* hypre_MatrixStatsArrayCreate(HYPRE_Int capacity) { hypre_MatrixStatsArray *stats_array; HYPRE_Int i; stats_array = hypre_CTAlloc(hypre_MatrixStatsArray, 1, HYPRE_MEMORY_HOST); hypre_MatrixStatsArrayCapacity(stats_array) = capacity; hypre_MatrixStatsArrayEntries(stats_array) = hypre_TAlloc(hypre_MatrixStats *, capacity, HYPRE_MEMORY_HOST); for (i = 0; i < capacity; i++) { hypre_MatrixStatsArrayEntry(stats_array, i) = hypre_MatrixStatsCreate(); } return stats_array; } /*-------------------------------------------------------------------------- * hypre_MatrixStatsArrayDestroy *--------------------------------------------------------------------------*/ HYPRE_Int hypre_MatrixStatsArrayDestroy(hypre_MatrixStatsArray *stats_array) { HYPRE_Int i; HYPRE_Int capacity; if (stats_array) { capacity = hypre_MatrixStatsArrayCapacity(stats_array); for (i = 0; i < capacity; i++) { hypre_MatrixStatsDestroy(hypre_MatrixStatsArrayEntry(stats_array, i)); } hypre_TFree(hypre_MatrixStatsArrayEntries(stats_array), HYPRE_MEMORY_HOST); hypre_TFree(stats_array, HYPRE_MEMORY_HOST); } return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_MatrixStatsArrayPrint *--------------------------------------------------------------------------*/ HYPRE_Int hypre_MatrixStatsArrayPrint(HYPRE_Int num_hierarchies, HYPRE_Int *num_levels, HYPRE_Int use_divisors, HYPRE_Int shift, const char **messages, hypre_MatrixStatsArray *stats_array) { HYPRE_Int capacity = hypre_MatrixStatsArrayCapacity(stats_array); hypre_MatrixStats *stats; hypre_MatrixStats *stats_finest; hypre_MatrixStats *stats_next; HYPRE_Int ndigits[HYPRE_NDIGITS_SIZE]; HYPRE_Int offsets[6]; HYPRE_Int divisors[3]; HYPRE_Int i, square; HYPRE_Int square_count; HYPRE_Int num_levels_total; HYPRE_BigInt fine_num_rows; HYPRE_BigInt coarse_num_rows; HYPRE_BigInt total_num_rows; /* Compute total number of levels */ num_levels_total = 0; for (i = 0; i < num_hierarchies; i++) { num_levels_total += num_levels[i]; } /* Sanity check */ if (capacity < num_levels_total) { hypre_error_w_msg(HYPRE_ERROR_GENERIC, "Matrix statistics array does not have enough capacity!"); return hypre_error_flag; } /* Check if all matrices are square or rectangular */ square_count = 0; for (i = 0; i < num_levels_total; i++) { stats = hypre_MatrixStatsArrayEntry(stats_array, i); if (hypre_MatrixStatsNumRows(stats) == hypre_MatrixStatsNumCols(stats)) { square_count += 1; } } if (square_count == 0) { square = 0; } else if (square_count == num_levels_total) { square = 1; } else { hypre_error_w_msg(HYPRE_ERROR_GENERIC, "Cannot process square and rectangular matrices at the same time!"); return hypre_error_flag; } /* Set some shortcuts */ stats_finest = hypre_MatrixStatsArrayEntry(stats_array, 0); /* Digits computation */ ndigits[0] = hypre_max(7, hypre_ndigits(hypre_MatrixStatsNumRows(stats_finest))); ndigits[1] = 7; ndigits[2] = hypre_max(8, hypre_ndigits(hypre_MatrixStatsNumNonzeros(stats_finest))); ndigits[3] = 7; ndigits[4] = 4; ndigits[5] = 4; ndigits[6] = 4; ndigits[7] = 5; ndigits[8] = 8; ndigits[9] = 8; ndigits[10] = 8; ndigits[11] = 8; for (i = 0; i < num_levels_total; i++) { stats = hypre_MatrixStatsArrayEntry(stats_array, i); stats_next = hypre_MatrixStatsArrayEntry(stats_array, i + 1); total_num_rows = hypre_MatrixStatsNumRows(stats); if (square) { if (i < num_levels_total - 1) { coarse_num_rows = hypre_MatrixStatsNumRows(stats_next); } else { coarse_num_rows = 0; } } else { coarse_num_rows = hypre_MatrixStatsNumCols(stats); } fine_num_rows = total_num_rows - coarse_num_rows; ndigits[1] = hypre_max(ndigits[1], 1 + hypre_ndigits(fine_num_rows)); ndigits[3] = hypre_max(ndigits[3], 4 + hypre_ndigits((HYPRE_Int) hypre_MatrixStatsSparsity(stats))); ndigits[4] = hypre_max(ndigits[4], 1 + hypre_ndigits(hypre_MatrixStatsNnzrowMin(stats))); ndigits[5] = hypre_max(ndigits[5], 1 + hypre_ndigits(hypre_MatrixStatsNnzrowMax(stats))); ndigits[6] = hypre_max(ndigits[6], 4 + hypre_ndigits((HYPRE_Int) hypre_MatrixStatsNnzrowAvg(stats))); ndigits[7] = hypre_max(ndigits[7], 4 + hypre_ndigits((HYPRE_Int) hypre_MatrixStatsNnzrowStDev(stats))); } /* Column offsets calculation */ offsets[0] = 6 + ndigits[0] + ndigits[1] + ndigits[2]; offsets[1] = 0 + ndigits[2]; offsets[2] = 2 + ndigits[3]; offsets[3] = 7 + (ndigits[4] + ndigits[5] + ndigits[6] + ndigits[7]) / 2; offsets[4] = (1 + ndigits[4] + ndigits[5] + ndigits[6] + ndigits[7]) / 2 - 3; offsets[5] = 4 + (ndigits[8] + ndigits[9] + ndigits[10] + ndigits[11]) / 2; if (!square) { offsets[0] += 2; } /* Table divisors */ if (use_divisors) { divisors[0] = 9 + ndigits[0] + ndigits[1] + ndigits[3] + 2 * ndigits[2]; divisors[1] = 5 + ndigits[4] + ndigits[5] + ndigits[6] + ndigits[7]; divisors[2] = 5 + ndigits[8] + ndigits[9] + ndigits[10] + ndigits[11]; if (!square) { divisors[0] += 2; } } else { divisors[0] = 4 + ndigits[2]; /* Note: ndigits[2] happens twice */ for (i = 0; i < HYPRE_NDIGITS_SIZE; i++) { divisors[0] += ndigits[i] + 1; } } /* Header first line */ HYPRE_PRINT_INDENT(shift); { hypre_printf("\n%s", messages[0]); } HYPRE_PRINT_INDENT(shift); { hypre_printf("%*s ", offsets[0], "nonzero"); hypre_printf("%*s ", offsets[1], "actual"); } if (use_divisors) { hypre_printf("%*s ", offsets[2], "|"); } { hypre_printf("%*s ", offsets[3], "entries/row"); } if (use_divisors) { hypre_printf("%*s ", offsets[4], "|"); } { hypre_printf("%*s ", offsets[5], "rowsums"); hypre_printf("\n"); } /* Header second line */ HYPRE_PRINT_INDENT(shift); { hypre_printf("%s ", "lev"); } if (square) { hypre_printf("%*s ", ndigits[0], "rows"); hypre_printf("%*s ", ndigits[1], "fine"); hypre_printf("%*s ", ndigits[2], "entries"); } else { hypre_printf("%*s ", ndigits[0], "rows"); hypre_printf("%-*s ", ndigits[1], "x cols"); hypre_printf("%*s ", ndigits[2], " entries"); } { hypre_printf("%*s ", ndigits[2], "entries"); hypre_printf("%*s ", ndigits[3], "sparse"); } if (use_divisors) { hypre_printf("| "); } { // entries per row hypre_printf("%*s ", ndigits[4], "min"); hypre_printf("%*s ", ndigits[5], "max"); hypre_printf("%*s ", ndigits[6], "avg"); hypre_printf("%*s ", ndigits[7], "stdev"); } if (use_divisors) { hypre_printf("| "); } { // rowsums hypre_printf("%*s ", ndigits[8], "min"); hypre_printf("%*s ", ndigits[9], "max"); hypre_printf("%*s ", ndigits[10], "avg"); hypre_printf("%*s ", ndigits[11], "stdev"); } { hypre_printf("\n"); } HYPRE_PRINT_INDENT(shift); if (use_divisors) { HYPRE_PRINT_TOP_DIVISOR(3, divisors); } else { HYPRE_PRINT_TOP_DIVISOR(1, divisors); } /* Values */ for (i = 0; i < num_levels_total; i++) { stats = hypre_MatrixStatsArrayEntry(stats_array, i); stats_next = hypre_MatrixStatsArrayEntry(stats_array, i + 1); total_num_rows = hypre_MatrixStatsNumRows(stats); if (square) { if (i < num_levels_total - 1) { coarse_num_rows = hypre_MatrixStatsNumRows(stats_next); } else { coarse_num_rows = 0; } } else { coarse_num_rows = hypre_MatrixStatsNumCols(stats); } fine_num_rows = total_num_rows - coarse_num_rows; /* General info */ HYPRE_PRINT_INDENT(shift); if (square) { hypre_printf("%3d %*b %*b %*b %*b %*.3f ", i, ndigits[0], hypre_MatrixStatsNumRows(stats), ndigits[1], fine_num_rows, ndigits[2], hypre_MatrixStatsNumNonzeros(stats), ndigits[2], hypre_MatrixStatsActualNonzeros(stats), ndigits[3], hypre_MatrixStatsSparsity(stats)); } else { hypre_printf("%3d %*b x %-*b %*b %*b %*.3f ", i, ndigits[0], hypre_MatrixStatsNumRows(stats), ndigits[1], coarse_num_rows, ndigits[2], hypre_MatrixStatsNumNonzeros(stats), ndigits[2], hypre_MatrixStatsActualNonzeros(stats), ndigits[3], hypre_MatrixStatsSparsity(stats)); } if (use_divisors) { hypre_printf("| "); } /* Entries per row info */ hypre_printf("%*d %*d %*.1f %*.2f ", ndigits[4], hypre_MatrixStatsNnzrowMin(stats), ndigits[5], hypre_MatrixStatsNnzrowMax(stats), ndigits[6], hypre_MatrixStatsNnzrowAvg(stats), ndigits[7], hypre_MatrixStatsNnzrowStDev(stats)); if (use_divisors) { hypre_printf("| "); } /* Row sum info */ hypre_printf("%*.1e %*.1e %*.1e %*.1e", ndigits[8], hypre_MatrixStatsRowsumMin(stats), ndigits[9], hypre_MatrixStatsRowsumMax(stats), ndigits[10], hypre_MatrixStatsRowsumAvg(stats), ndigits[11], hypre_MatrixStatsRowsumStDev(stats)); if (use_divisors) { if (num_hierarchies == 1) { hypre_printf("\n"); } else if (num_hierarchies == 2) { if (i == num_levels[0] / 2) { hypre_printf(messages[2]); } if ((num_levels[1] > 1) && (i == num_levels[0] + num_levels[1] / 2)) { hypre_printf(messages[3]); } hypre_printf("\n"); HYPRE_PRINT_INDENT(shift); if (square) { if (i == num_levels[0]) { HYPRE_PRINT_MID_DIVISOR(3, divisors, messages[1]); } } else { if (i == (num_levels[0] - 1)) { HYPRE_PRINT_MID_DIVISOR(3, divisors, messages[1]); } } } else { hypre_error_w_msg(HYPRE_ERROR_GENERIC, "num_hierarchies > 2 not implemented!"); return hypre_error_flag; } } else { hypre_printf("\n"); } } hypre_printf("\n\n"); return hypre_error_flag; } hypre-2.33.0/src/utilities/matrix_stats.h000066400000000000000000000125411477326011500204340ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #ifndef hypre_MATRIX_STATS_HEADER #define hypre_MATRIX_STATS_HEADER /****************************************************************************** * * Header info for (generic) matrix statistics data structure * *****************************************************************************/ typedef struct hypre_MatrixStats_struct { /* General info */ HYPRE_BigInt num_rows; HYPRE_BigInt num_cols; hypre_ulonglongint num_nonzeros; /* Actual nonzeros statistics */ hypre_ulonglongint actual_nonzeros; HYPRE_Real actual_threshold; HYPRE_Real sparsity; /* Nonzeros per row statistics */ HYPRE_Int nnzrow_min; HYPRE_Int nnzrow_max; HYPRE_Real nnzrow_avg; HYPRE_Real nnzrow_stdev; HYPRE_Real nnzrow_sqsum; /* Row sum statistics */ HYPRE_Real rowsum_min; HYPRE_Real rowsum_max; HYPRE_Real rowsum_avg; HYPRE_Real rowsum_stdev; HYPRE_Real rowsum_sqsum; } hypre_MatrixStats; /*-------------------------------------------------------------------------- * Accessor macros *--------------------------------------------------------------------------*/ #define hypre_MatrixStatsNumRows(data) ((data) -> num_rows) #define hypre_MatrixStatsNumCols(data) ((data) -> num_cols) #define hypre_MatrixStatsNumNonzeros(data) ((data) -> num_nonzeros) #define hypre_MatrixStatsSparsity(data) ((data) -> sparsity) #define hypre_MatrixStatsActualNonzeros(data) ((data) -> actual_nonzeros) #define hypre_MatrixStatsActualThreshold(data) ((data) -> actual_threshold) #define hypre_MatrixStatsNnzrowMin(data) ((data) -> nnzrow_min) #define hypre_MatrixStatsNnzrowMax(data) ((data) -> nnzrow_max) #define hypre_MatrixStatsNnzrowAvg(data) ((data) -> nnzrow_avg) #define hypre_MatrixStatsNnzrowStDev(data) ((data) -> nnzrow_stdev) #define hypre_MatrixStatsNnzrowSqsum(data) ((data) -> nnzrow_sqsum) #define hypre_MatrixStatsRowsumMin(data) ((data) -> rowsum_min) #define hypre_MatrixStatsRowsumMax(data) ((data) -> rowsum_max) #define hypre_MatrixStatsRowsumAvg(data) ((data) -> rowsum_avg) #define hypre_MatrixStatsRowsumStDev(data) ((data) -> rowsum_stdev) #define hypre_MatrixStatsRowsumSqsum(data) ((data) -> rowsum_sqsum) /****************************************************************************** * * Header info for array of (generic) matrix statistics data structure * *****************************************************************************/ typedef struct hypre_MatrixStatsArray_struct { HYPRE_Int capacity; hypre_MatrixStats **entries; } hypre_MatrixStatsArray; /*-------------------------------------------------------------------------- * Accessor macros *--------------------------------------------------------------------------*/ #define hypre_MatrixStatsArrayCapacity(data) ((data) -> capacity) #define hypre_MatrixStatsArrayEntries(data) ((data) -> entries) #define hypre_MatrixStatsArrayEntry(data, i) ((data) -> entries[i]) /*-------------------------------------------------------------------------- * Helper macros for table formatting *--------------------------------------------------------------------------*/ #define HYPRE_PRINT_TOP_DIVISOR(m, d) \ for (HYPRE_Int __i = 0; __i < m; __i++) \ { \ for (HYPRE_Int __j = 0; __j < d[__i]; __j++) \ { \ hypre_printf("%s", "="); \ } \ if (__i < m - 1) \ { \ hypre_printf("+"); \ } \ } \ hypre_printf("\n"); #define HYPRE_PRINT_MID_DIVISOR(m, d, msg) \ for (HYPRE_Int __i = 0; __i < m; __i++) \ { \ for (HYPRE_Int __j = 0; __j < d[__i]; __j++) \ { \ hypre_printf("%s", "-"); \ } \ if (__i < m - 1) \ { \ hypre_printf("+"); \ } \ } \ hypre_printf(" %s\n", msg); #define HYPRE_PRINT_INDENT(n) \ hypre_printf("%*s", (n > 0) ? n : 0, ""); #define HYPRE_PRINT_SHIFTED_PARAM(n, ...) \ HYPRE_PRINT_INDENT(n) \ hypre_printf(__VA_ARGS__) #define HYPRE_NDIGITS_SIZE 12 #endif /* hypre_MATRIX_STATS_HEADER */ hypre-2.33.0/src/utilities/memory.c000066400000000000000000002101071477326011500172130ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * Memory management utilities * *****************************************************************************/ #include "_hypre_utilities.h" #include "_hypre_utilities.hpp" #if defined(__APPLE__) #include #include #include #include #elif defined(__linux__) #include #endif #if defined(HYPRE_USE_UMALLOC) #undef HYPRE_USE_UMALLOC #endif /****************************************************************************** * * Helper routines * *****************************************************************************/ HYPRE_Int hypre_GetMemoryLocationName(hypre_MemoryLocation memory_location, char *memory_location_name) { if (memory_location == hypre_MEMORY_HOST) { sprintf(memory_location_name, "%s", "HOST"); } else if (memory_location == hypre_MEMORY_HOST_PINNED) { sprintf(memory_location_name, "%s", "HOST PINNED"); } else if (memory_location == hypre_MEMORY_DEVICE) { sprintf(memory_location_name, "%s", "DEVICE"); } else if (memory_location == hypre_MEMORY_UNIFIED) { sprintf(memory_location_name, "%s", "UNIFIED"); } else { sprintf(memory_location_name, "%s", ""); } return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_OutOfMemory *--------------------------------------------------------------------------*/ static inline void hypre_OutOfMemory(size_t size) { char msg[1024]; hypre_sprintf(msg, "Out of memory trying to allocate %zu bytes\n", size); hypre_error_w_msg(HYPRE_ERROR_MEMORY, msg); hypre_assert(0); fflush(stdout); } static inline void hypre_WrongMemoryLocation(void) { hypre_error_w_msg(HYPRE_ERROR_MEMORY, "Unrecognized hypre_MemoryLocation\n"); hypre_assert(0); fflush(stdout); } void hypre_CheckMemoryLocation(void *ptr, hypre_MemoryLocation location) { #if defined(HYPRE_DEBUG) && defined(HYPRE_USING_GPU) if (!ptr) { return; } hypre_MemoryLocation location_ptr; hypre_GetPointerLocation(ptr, &location_ptr); /* do not use hypre_assert, which has alloc and free; * will create an endless loop otherwise */ assert(location == location_ptr); #else HYPRE_UNUSED_VAR(ptr); HYPRE_UNUSED_VAR(location); #endif } /*========================================================================== * Physical memory location (hypre_MemoryLocation) interface *==========================================================================*/ /*-------------------------------------------------------------------------- * Memset *--------------------------------------------------------------------------*/ static inline void hypre_HostMemset(void *ptr, HYPRE_Int value, size_t num) { memset(ptr, value, num); } static inline void hypre_DeviceMemset(void *ptr, HYPRE_Int value, size_t num) { #if defined(HYPRE_USING_DEVICE_OPENMP) #if defined(HYPRE_DEVICE_OPENMP_ALLOC) #pragma omp target teams distribute parallel for is_device_ptr(ptr) for (size_t i = 0; i < num; i++) { ((unsigned char *) ptr)[i] = (unsigned char) value; } #else memset(ptr, value, num); HYPRE_OMPOffload(hypre__offload_device_num, ptr, num, "update", "to"); #endif /* HYPRE_CUDA_CALL( cudaDeviceSynchronize() ); */ #elif defined(HYPRE_USING_CUDA) HYPRE_CUDA_CALL( cudaMemset(ptr, value, num) ); #elif defined(HYPRE_USING_HIP) HYPRE_HIP_CALL( hipMemset(ptr, value, num) ); #elif defined(HYPRE_USING_SYCL) HYPRE_SYCL_CALL( (hypre_HandleComputeStream(hypre_handle()))->memset(ptr, value, num).wait() ); #else HYPRE_UNUSED_VAR(ptr); HYPRE_UNUSED_VAR(value); HYPRE_UNUSED_VAR(num); #endif } static inline void hypre_UnifiedMemset(void *ptr, HYPRE_Int value, size_t num) { #if defined(HYPRE_USING_DEVICE_OPENMP) #if defined(HYPRE_DEVICE_OPENMP_ALLOC) #pragma omp target teams distribute parallel for is_device_ptr(ptr) for (size_t i = 0; i < num; i++) { ((unsigned char *) ptr)[i] = (unsigned char) value; } #else memset(ptr, value, num); HYPRE_OMPOffload(hypre__offload_device_num, ptr, num, "update", "to"); #endif /* HYPRE_CUDA_CALL( cudaDeviceSynchronize() ); */ #elif defined(HYPRE_USING_CUDA) HYPRE_CUDA_CALL( cudaMemset(ptr, value, num) ); #elif defined(HYPRE_USING_HIP) HYPRE_HIP_CALL( hipMemset(ptr, value, num) ); #elif defined(HYPRE_USING_SYCL) HYPRE_SYCL_CALL( (hypre_HandleComputeStream(hypre_handle()))->memset(ptr, value, num).wait() ); #else HYPRE_UNUSED_VAR(ptr); HYPRE_UNUSED_VAR(value); HYPRE_UNUSED_VAR(num); #endif } /*-------------------------------------------------------------------------- * Memprefetch *--------------------------------------------------------------------------*/ static inline void hypre_UnifiedMemPrefetch(void *ptr, size_t size, hypre_MemoryLocation location) { if (!size) { return; } hypre_CheckMemoryLocation(ptr, hypre_MEMORY_UNIFIED); #if defined(HYPRE_USING_CUDA) if (location == hypre_MEMORY_DEVICE) { HYPRE_CUDA_CALL( cudaMemPrefetchAsync(ptr, size, hypre_HandleDevice(hypre_handle()), hypre_HandleComputeStream(hypre_handle())) ); } else if (location == hypre_MEMORY_HOST) { HYPRE_CUDA_CALL( cudaMemPrefetchAsync(ptr, size, cudaCpuDeviceId, hypre_HandleComputeStream(hypre_handle())) ); } #elif defined(HYPRE_USING_HIP) HYPRE_UNUSED_VAR(ptr); HYPRE_UNUSED_VAR(size); HYPRE_UNUSED_VAR(location); // Not currently implemented for HIP, but leaving place holder /* *if (location == hypre_MEMORY_DEVICE) *{ * HYPRE_HIP_CALL( hipMemPrefetchAsync(ptr, size, hypre_HandleDevice(hypre_handle()), * hypre_HandleComputeStream(hypre_handle())) ); *} *else if (location == hypre_MEMORY_HOST) *{ * HYPRE_CUDA_CALL( hipMemPrefetchAsync(ptr, size, cudaCpuDeviceId, * hypre_HandleComputeStream(hypre_handle())) ); *} */ #elif defined(HYPRE_USING_SYCL) HYPRE_UNUSED_VAR(ptr); HYPRE_UNUSED_VAR(size); HYPRE_UNUSED_VAR(location); if (location == hypre_MEMORY_DEVICE) { /* WM: todo - the call below seems like it may occasionally result in an error: */ /* Native API returns: -997 (The plugin has emitted a backend specific error) */ /* or a seg fault. On the other hand, removing this line can also cause the code * to hang (or run excessively slow?). */ /* HYPRE_SYCL_CALL( hypre_HandleComputeStream(hypre_handle())->prefetch(ptr, size).wait() ); */ } #else HYPRE_UNUSED_VAR(ptr); HYPRE_UNUSED_VAR(size); HYPRE_UNUSED_VAR(location); #endif } /*-------------------------------------------------------------------------- * Malloc *--------------------------------------------------------------------------*/ static inline void * hypre_HostMalloc(size_t size, HYPRE_Int zeroinit) { void *ptr = NULL; #if defined(HYPRE_USING_UMPIRE_HOST) hypre_umpire_host_pooled_allocate(&ptr, size); if (zeroinit) { memset(ptr, 0, size); } #else if (zeroinit) { ptr = calloc(size, 1); } else { ptr = malloc(size); } #endif return ptr; } static inline void * hypre_DeviceMalloc(size_t size, HYPRE_Int zeroinit) { void *ptr = NULL; if ( hypre_HandleUserDeviceMalloc(hypre_handle()) ) { hypre_HandleUserDeviceMalloc(hypre_handle())(&ptr, size); } else { #if defined(HYPRE_USING_UMPIRE_DEVICE) hypre_umpire_device_pooled_allocate(&ptr, size); #else #if defined(HYPRE_USING_DEVICE_OPENMP) #if defined(HYPRE_DEVICE_OPENMP_ALLOC) ptr = omp_target_alloc(size, hypre__offload_device_num); #else ptr = malloc(size + sizeof(size_t)); size_t *sp = (size_t*) ptr; sp[0] = size; ptr = (void *) (&sp[1]); HYPRE_OMPOffload(hypre__offload_device_num, ptr, size, "enter", "alloc"); #endif #endif #if defined(HYPRE_USING_CUDA) #if defined(HYPRE_USING_DEVICE_POOL) HYPRE_CUDA_CALL( hypre_CachingMallocDevice(&ptr, size) ); #elif defined(HYPRE_USING_DEVICE_MALLOC_ASYNC) HYPRE_CUDA_CALL( cudaMallocAsync(&ptr, size, NULL) ); #else HYPRE_CUDA_CALL( cudaMalloc(&ptr, size) ); #endif #endif #if defined(HYPRE_USING_HIP) HYPRE_HIP_CALL( hipMalloc(&ptr, size) ); #endif #if defined(HYPRE_USING_SYCL) ptr = (void *)sycl::malloc_device(size, *(hypre_HandleComputeStream(hypre_handle()))); #endif #endif /* #if defined(HYPRE_USING_UMPIRE_DEVICE) */ } if (ptr && zeroinit) { hypre_DeviceMemset(ptr, 0, size); } return ptr; } static inline void * hypre_UnifiedMalloc(size_t size, HYPRE_Int zeroinit) { void *ptr = NULL; #if defined(HYPRE_USING_UMPIRE_UM) hypre_umpire_um_pooled_allocate(&ptr, size); #else #if defined(HYPRE_USING_DEVICE_OPENMP) #if defined(HYPRE_DEVICE_OPENMP_ALLOC) ptr = omp_target_alloc(size, hypre__offload_device_num); #else ptr = malloc(size + sizeof(size_t)); size_t *sp = (size_t*) ptr; sp[0] = size; ptr = (void *) (&sp[1]); HYPRE_OMPOffload(hypre__offload_device_num, ptr, size, "enter", "alloc"); #endif #endif #if defined(HYPRE_USING_CUDA) #if defined(HYPRE_USING_DEVICE_POOL) HYPRE_CUDA_CALL( hypre_CachingMallocManaged(&ptr, size) ); #else HYPRE_CUDA_CALL( cudaMallocManaged(&ptr, size, cudaMemAttachGlobal) ); #endif #endif #if defined(HYPRE_USING_HIP) HYPRE_HIP_CALL( hipMallocManaged(&ptr, size, hipMemAttachGlobal) ); #endif #if defined(HYPRE_USING_SYCL) HYPRE_SYCL_CALL( ptr = (void *)sycl::malloc_shared(size, *(hypre_HandleComputeStream(hypre_handle()))) ); #endif #endif /* #if defined(HYPRE_USING_UMPIRE_UM) */ /* prefecth to device */ if (ptr) { hypre_UnifiedMemPrefetch(ptr, size, hypre_MEMORY_DEVICE); } if (ptr && zeroinit) { hypre_UnifiedMemset(ptr, 0, size); } return ptr; } static inline void * hypre_HostPinnedMalloc(size_t size, HYPRE_Int zeroinit) { void *ptr = NULL; #if defined(HYPRE_USING_UMPIRE_PINNED) hypre_umpire_pinned_pooled_allocate(&ptr, size); #else #if defined(HYPRE_USING_CUDA) HYPRE_CUDA_CALL( cudaMallocHost(&ptr, size) ); #endif #if defined(HYPRE_USING_HIP) HYPRE_HIP_CALL( hipHostMalloc(&ptr, size) ); #endif #if defined(HYPRE_USING_SYCL) HYPRE_SYCL_CALL( ptr = (void *)sycl::malloc_host(size, *(hypre_HandleComputeStream(hypre_handle()))) ); #endif #endif /* #if defined(HYPRE_USING_UMPIRE_PINNED) */ if (ptr && zeroinit) { hypre_HostMemset(ptr, 0, size); } return ptr; } static inline void * hypre_MAlloc_core(size_t size, HYPRE_Int zeroinit, hypre_MemoryLocation location) { if (size == 0) { return NULL; } void *ptr = NULL; switch (location) { case hypre_MEMORY_HOST : ptr = hypre_HostMalloc(size, zeroinit); break; case hypre_MEMORY_DEVICE : ptr = hypre_DeviceMalloc(size, zeroinit); break; case hypre_MEMORY_UNIFIED : ptr = hypre_UnifiedMalloc(size, zeroinit); break; case hypre_MEMORY_HOST_PINNED : ptr = hypre_HostPinnedMalloc(size, zeroinit); break; default : hypre_WrongMemoryLocation(); } if (!ptr) { hypre_OutOfMemory(size); hypre_MPI_Abort(hypre_MPI_COMM_WORLD, -1); } return ptr; } void * _hypre_MAlloc(size_t size, hypre_MemoryLocation location) { return hypre_MAlloc_core(size, 0, location); } /*-------------------------------------------------------------------------- * Free *--------------------------------------------------------------------------*/ static inline void hypre_HostFree(void *ptr) { #if defined(HYPRE_USING_UMPIRE_HOST) hypre_umpire_host_pooled_free(ptr); #else free(ptr); #endif } static inline void hypre_DeviceFree(void *ptr) { if ( hypre_HandleUserDeviceMfree(hypre_handle()) ) { hypre_HandleUserDeviceMfree(hypre_handle())(ptr); } else { #if defined(HYPRE_USING_UMPIRE_DEVICE) hypre_umpire_device_pooled_free(ptr); #else #if defined(HYPRE_USING_DEVICE_OPENMP) #if defined(HYPRE_DEVICE_OPENMP_ALLOC) omp_target_free(ptr, hypre__offload_device_num); #else HYPRE_OMPOffload(hypre__offload_device_num, ptr, ((size_t *) ptr)[-1], "exit", "delete"); #endif #endif #if defined(HYPRE_USING_CUDA) #if defined(HYPRE_USING_DEVICE_POOL) HYPRE_CUDA_CALL( hypre_CachingFreeDevice(ptr) ); #elif defined(HYPRE_USING_DEVICE_MALLOC_ASYNC) HYPRE_CUDA_CALL( cudaFreeAsync(ptr, NULL) ); #else HYPRE_CUDA_CALL( cudaFree(ptr) ); #endif #endif #if defined(HYPRE_USING_HIP) HYPRE_HIP_CALL( hipFree(ptr) ); #endif #if defined(HYPRE_USING_SYCL) HYPRE_SYCL_CALL( sycl::free(ptr, *(hypre_HandleComputeStream(hypre_handle()))) ); #endif #endif /* #if defined(HYPRE_USING_UMPIRE_DEVICE) */ } } static inline void hypre_UnifiedFree(void *ptr) { #if defined(HYPRE_USING_UMPIRE_UM) hypre_umpire_um_pooled_free(ptr); #elif defined(HYPRE_USING_DEVICE_OPENMP) && defined(HYPRE_DEVICE_OPENMP_ALLOC) omp_target_free(ptr, hypre__offload_device_num); #elif defined(HYPRE_USING_DEVICE_OPENMP) && !defined(HYPRE_DEVICE_OPENMP_ALLOC) HYPRE_OMPOffload(hypre__offload_device_num, ptr, ((size_t *) ptr)[-1], "exit", "delete"); #elif defined(HYPRE_USING_CUDA) && defined(HYPRE_USING_DEVICE_POOL) HYPRE_CUDA_CALL( hypre_CachingFreeManaged(ptr) ); #elif defined(HYPRE_USING_CUDA) && !defined(HYPRE_USING_DEVICE_POOL) HYPRE_CUDA_CALL( cudaFree(ptr) ); #elif defined(HYPRE_USING_HIP) HYPRE_HIP_CALL( hipFree(ptr) ); #elif defined(HYPRE_USING_SYCL) HYPRE_SYCL_CALL( sycl::free(ptr, *(hypre_HandleComputeStream(hypre_handle()))) ); #else HYPRE_UNUSED_VAR(ptr); #endif /* #if defined(HYPRE_USING_UMPIRE_UM) */ } static inline void hypre_HostPinnedFree(void *ptr) { #if defined(HYPRE_USING_UMPIRE_PINNED) hypre_umpire_pinned_pooled_free(ptr); #elif defined(HYPRE_USING_CUDA) HYPRE_CUDA_CALL( cudaFreeHost(ptr) ); #elif defined(HYPRE_USING_HIP) HYPRE_HIP_CALL( hipHostFree(ptr) ); #elif defined(HYPRE_USING_SYCL) HYPRE_SYCL_CALL( sycl::free(ptr, *(hypre_HandleComputeStream(hypre_handle()))) ); #else HYPRE_UNUSED_VAR(ptr); #endif /* #if defined(HYPRE_USING_UMPIRE_PINNED) */ } static inline void hypre_Free_core(void *ptr, hypre_MemoryLocation location) { if (!ptr) { return; } hypre_CheckMemoryLocation(ptr, location); switch (location) { case hypre_MEMORY_HOST : hypre_HostFree(ptr); break; case hypre_MEMORY_DEVICE : hypre_DeviceFree(ptr); break; case hypre_MEMORY_UNIFIED : hypre_UnifiedFree(ptr); break; case hypre_MEMORY_HOST_PINNED : hypre_HostPinnedFree(ptr); break; default : hypre_WrongMemoryLocation(); } } void _hypre_Free(void *ptr, hypre_MemoryLocation location) { hypre_Free_core(ptr, location); } /*-------------------------------------------------------------------------- * Memcpy *--------------------------------------------------------------------------*/ static inline void hypre_Memcpy_core(void *dst, void *src, size_t size, hypre_MemoryLocation loc_dst, hypre_MemoryLocation loc_src) { if (size == 0) { return; } #if defined(HYPRE_USING_SYCL) sycl::queue* q = hypre_HandleComputeStream(hypre_handle()); #endif if (dst == NULL || src == NULL) { if (size) { hypre_printf("hypre_Memcpy warning: copy %ld bytes from %p to %p !\n", size, src, dst); hypre_assert(0); } return; } if (dst == src) { return; } if (size > 0) { hypre_CheckMemoryLocation(dst, loc_dst); hypre_CheckMemoryLocation(src, loc_src); } /* Totally 4 x 4 = 16 cases */ /* 4: Host <-- Host, Host <-- Pinned, * Pinned <-- Host, Pinned <-- Pinned. */ if ( loc_dst != hypre_MEMORY_DEVICE && loc_dst != hypre_MEMORY_UNIFIED && loc_src != hypre_MEMORY_DEVICE && loc_src != hypre_MEMORY_UNIFIED ) { memcpy(dst, src, size); return; } /* 3: UVM <-- Device, Device <-- UVM, UVM <-- UVM */ if ( (loc_dst == hypre_MEMORY_UNIFIED && loc_src == hypre_MEMORY_DEVICE) || (loc_dst == hypre_MEMORY_DEVICE && loc_src == hypre_MEMORY_UNIFIED) || (loc_dst == hypre_MEMORY_UNIFIED && loc_src == hypre_MEMORY_UNIFIED) ) { #if defined(HYPRE_USING_DEVICE_OPENMP) omp_target_memcpy(dst, src, size, 0, 0, hypre__offload_device_num, hypre__offload_device_num); #endif #if defined(HYPRE_USING_CUDA) HYPRE_CUDA_CALL( cudaMemcpy(dst, src, size, cudaMemcpyDeviceToDevice) ); #endif #if defined(HYPRE_USING_HIP) // hipMemcpy(DtoD) causes a host-side synchronization, unlike cudaMemcpy(DtoD), // use hipMemcpyAsync to get cuda's more performant behavior. For more info see: // https://github.com/mfem/mfem/pull/2780 HYPRE_HIP_CALL( hipMemcpyAsync(dst, src, size, hipMemcpyDeviceToDevice) ); #endif #if defined(HYPRE_USING_SYCL) HYPRE_SYCL_CALL( q->memcpy(dst, src, size).wait() ); #endif return; } /* 2: UVM <-- Host, UVM <-- Pinned */ if (loc_dst == hypre_MEMORY_UNIFIED) { #if defined(HYPRE_USING_DEVICE_OPENMP) omp_target_memcpy(dst, src, size, 0, 0, hypre__offload_device_num, hypre__offload_host_num); #endif #if defined(HYPRE_USING_CUDA) HYPRE_CUDA_CALL( cudaMemcpy(dst, src, size, cudaMemcpyHostToDevice) ); #endif #if defined(HYPRE_USING_HIP) HYPRE_HIP_CALL( hipMemcpy(dst, src, size, hipMemcpyHostToDevice) ); #endif #if defined(HYPRE_USING_SYCL) HYPRE_SYCL_CALL( q->memcpy(dst, src, size).wait() ); #endif return; } /* 2: Host <-- UVM, Pinned <-- UVM */ if (loc_src == hypre_MEMORY_UNIFIED) { #if defined(HYPRE_USING_DEVICE_OPENMP) omp_target_memcpy(dst, src, size, 0, 0, hypre__offload_host_num, hypre__offload_device_num); #endif #if defined(HYPRE_USING_CUDA) HYPRE_CUDA_CALL( cudaMemcpy(dst, src, size, cudaMemcpyDeviceToHost) ); #endif #if defined(HYPRE_USING_HIP) HYPRE_HIP_CALL( hipMemcpy(dst, src, size, hipMemcpyDeviceToHost) ); #endif #if defined(HYPRE_USING_SYCL) HYPRE_SYCL_CALL( q->memcpy(dst, src, size).wait() ); #endif return; } /* 2: Device <-- Host, Device <-- Pinned */ if ( loc_dst == hypre_MEMORY_DEVICE && (loc_src == hypre_MEMORY_HOST || loc_src == hypre_MEMORY_HOST_PINNED) ) { #if defined(HYPRE_USING_DEVICE_OPENMP) #if defined(HYPRE_DEVICE_OPENMP_ALLOC) omp_target_memcpy(dst, src, size, 0, 0, hypre__offload_device_num, hypre__offload_host_num); #else memcpy(dst, src, size); HYPRE_OMPOffload(hypre__offload_device_num, dst, size, "update", "to"); #endif #endif #if defined(HYPRE_USING_CUDA) HYPRE_CUDA_CALL( cudaMemcpy(dst, src, size, cudaMemcpyHostToDevice) ); #endif #if defined(HYPRE_USING_HIP) HYPRE_HIP_CALL( hipMemcpy(dst, src, size, hipMemcpyHostToDevice) ); #endif #if defined(HYPRE_USING_SYCL) HYPRE_SYCL_CALL( q->memcpy(dst, src, size).wait() ); #endif return; } /* 2: Host <-- Device, Pinned <-- Device */ if ( (loc_dst == hypre_MEMORY_HOST || loc_dst == hypre_MEMORY_HOST_PINNED) && loc_src == hypre_MEMORY_DEVICE ) { #if defined(HYPRE_USING_DEVICE_OPENMP) #if defined(HYPRE_DEVICE_OPENMP_ALLOC) omp_target_memcpy(dst, src, size, 0, 0, hypre__offload_host_num, hypre__offload_device_num); #else HYPRE_OMPOffload(hypre__offload_device_num, src, size, "update", "from"); memcpy(dst, src, size); #endif #endif #if defined(HYPRE_USING_CUDA) HYPRE_CUDA_CALL( cudaMemcpy( dst, src, size, cudaMemcpyDeviceToHost) ); #endif #if defined(HYPRE_USING_HIP) HYPRE_HIP_CALL( hipMemcpy(dst, src, size, hipMemcpyDeviceToHost) ); #endif #if defined(HYPRE_USING_SYCL) HYPRE_SYCL_CALL( q->memcpy(dst, src, size).wait() ); #endif return; } /* 1: Device <-- Device */ if (loc_dst == hypre_MEMORY_DEVICE && loc_src == hypre_MEMORY_DEVICE) { #if defined(HYPRE_USING_DEVICE_OPENMP) #if defined(HYPRE_DEVICE_OPENMP_ALLOC) omp_target_memcpy(dst, src, size, 0, 0, hypre__offload_device_num, hypre__offload_device_num); #else HYPRE_OMPOffload(hypre__offload_device_num, src, size, "update", "from"); memcpy(dst, src, size); HYPRE_OMPOffload(hypre__offload_device_num, dst, size, "update", "to"); #endif #endif #if defined(HYPRE_USING_CUDA) HYPRE_CUDA_CALL( cudaMemcpy(dst, src, size, cudaMemcpyDeviceToDevice) ); #endif #if defined(HYPRE_USING_HIP) // hipMemcpy(DtoD) causes a host-side synchronization, unlike cudaMemcpy(DtoD), // use hipMemcpyAsync to get cuda's more performant behavior. For more info see: // https://github.com/mfem/mfem/pull/2780 HYPRE_HIP_CALL( hipMemcpyAsync(dst, src, size, hipMemcpyDeviceToDevice) ); #endif #if defined(HYPRE_USING_SYCL) HYPRE_SYCL_CALL( q->memcpy(dst, src, size).wait() ); #endif return; } hypre_WrongMemoryLocation(); } /*--------------------------------------------------------------------------* * ExecPolicy *--------------------------------------------------------------------------*/ static inline HYPRE_ExecutionPolicy hypre_GetExecPolicy1_core(hypre_MemoryLocation location) { HYPRE_ExecutionPolicy exec = HYPRE_EXEC_UNDEFINED; switch (location) { case hypre_MEMORY_HOST : case hypre_MEMORY_HOST_PINNED : exec = HYPRE_EXEC_HOST; break; case hypre_MEMORY_DEVICE : exec = HYPRE_EXEC_DEVICE; break; case hypre_MEMORY_UNIFIED : #if defined(HYPRE_USING_GPU) || defined(HYPRE_USING_DEVICE_OPENMP) exec = hypre_HandleDefaultExecPolicy(hypre_handle()); #endif break; default : hypre_WrongMemoryLocation(); } hypre_assert(exec != HYPRE_EXEC_UNDEFINED); return exec; } /* for binary operation */ static inline HYPRE_ExecutionPolicy hypre_GetExecPolicy2_core(hypre_MemoryLocation location1, hypre_MemoryLocation location2) { HYPRE_ExecutionPolicy exec = HYPRE_EXEC_UNDEFINED; /* HOST_PINNED has the same exec policy as HOST */ if (location1 == hypre_MEMORY_HOST_PINNED) { location1 = hypre_MEMORY_HOST; } if (location2 == hypre_MEMORY_HOST_PINNED) { location2 = hypre_MEMORY_HOST; } /* no policy for these combinations */ if ( (location1 == hypre_MEMORY_HOST && location2 == hypre_MEMORY_DEVICE) || (location2 == hypre_MEMORY_HOST && location1 == hypre_MEMORY_DEVICE) ) { exec = HYPRE_EXEC_UNDEFINED; } /* this should never happen */ if ( (location1 == hypre_MEMORY_UNIFIED && location2 == hypre_MEMORY_DEVICE) || (location2 == hypre_MEMORY_UNIFIED && location1 == hypre_MEMORY_DEVICE) ) { exec = HYPRE_EXEC_UNDEFINED; } if (location1 == hypre_MEMORY_UNIFIED && location2 == hypre_MEMORY_UNIFIED) { #if defined(HYPRE_USING_GPU) || defined(HYPRE_USING_DEVICE_OPENMP) exec = hypre_HandleDefaultExecPolicy(hypre_handle()); #endif } if (location1 == hypre_MEMORY_HOST || location2 == hypre_MEMORY_HOST) { exec = HYPRE_EXEC_HOST; } if (location1 == hypre_MEMORY_DEVICE || location2 == hypre_MEMORY_DEVICE) { exec = HYPRE_EXEC_DEVICE; } hypre_assert(exec != HYPRE_EXEC_UNDEFINED); return exec; } /*========================================================================== * Conceptual memory location (HYPRE_MemoryLocation) interface *==========================================================================*/ /*-------------------------------------------------------------------------- * hypre_Memset * "Sets the first num bytes of the block of memory pointed by ptr to the specified value * (*** value is interpreted as an unsigned char ***)" * http://www.cplusplus.com/reference/cstring/memset/ *--------------------------------------------------------------------------*/ void * hypre_Memset(void *ptr, HYPRE_Int value, size_t num, HYPRE_MemoryLocation location) { if (num == 0) { return ptr; } if (ptr == NULL) { if (num) { hypre_printf("hypre_Memset warning: set values for %ld bytes at %p !\n", num, ptr); } return ptr; } hypre_CheckMemoryLocation(ptr, hypre_GetActualMemLocation(location)); switch (hypre_GetActualMemLocation(location)) { case hypre_MEMORY_HOST : case hypre_MEMORY_HOST_PINNED : hypre_HostMemset(ptr, value, num); break; case hypre_MEMORY_DEVICE : hypre_DeviceMemset(ptr, value, num); break; case hypre_MEMORY_UNIFIED : hypre_UnifiedMemset(ptr, value, num); break; default : hypre_WrongMemoryLocation(); } return ptr; } /*-------------------------------------------------------------------------- * Memprefetch *--------------------------------------------------------------------------*/ void hypre_MemPrefetch(void *ptr, size_t size, HYPRE_MemoryLocation location) { hypre_UnifiedMemPrefetch( ptr, size, hypre_GetActualMemLocation(location) ); } /*--------------------------------------------------------------------------* * hypre_MAlloc, hypre_CAlloc *--------------------------------------------------------------------------*/ void * hypre_MAlloc(size_t size, HYPRE_MemoryLocation location) { return hypre_MAlloc_core(size, 0, hypre_GetActualMemLocation(location)); } void * hypre_CAlloc( size_t count, size_t elt_size, HYPRE_MemoryLocation location) { return hypre_MAlloc_core(count * elt_size, 1, hypre_GetActualMemLocation(location)); } /*-------------------------------------------------------------------------- * hypre_Free *--------------------------------------------------------------------------*/ void hypre_Free(void *ptr, HYPRE_MemoryLocation location) { hypre_Free_core(ptr, hypre_GetActualMemLocation(location)); } /*-------------------------------------------------------------------------- * hypre_Memcpy *--------------------------------------------------------------------------*/ void hypre_Memcpy(void *dst, void *src, size_t size, HYPRE_MemoryLocation loc_dst, HYPRE_MemoryLocation loc_src) { hypre_Memcpy_core( dst, src, size, hypre_GetActualMemLocation(loc_dst), hypre_GetActualMemLocation(loc_src) ); } /*-------------------------------------------------------------------------- * hypre_ReAlloc *--------------------------------------------------------------------------*/ void * hypre_ReAlloc(void *ptr, size_t size, HYPRE_MemoryLocation location) { if (size == 0) { hypre_Free(ptr, location); return NULL; } if (ptr == NULL) { return hypre_MAlloc(size, location); } if (hypre_GetActualMemLocation(location) != hypre_MEMORY_HOST) { hypre_printf("hypre_TReAlloc only works with HYPRE_MEMORY_HOST; Use hypre_TReAlloc_v2 instead!\n"); hypre_assert(0); hypre_MPI_Abort(hypre_MPI_COMM_WORLD, -1); return NULL; } #if defined(HYPRE_USING_UMPIRE_HOST) ptr = hypre_umpire_host_pooled_realloc(ptr, size); #else ptr = realloc(ptr, size); #endif if (!ptr) { hypre_OutOfMemory(size); } return ptr; } void * hypre_ReAlloc_v2(void *ptr, size_t old_size, size_t new_size, HYPRE_MemoryLocation location) { if (new_size == 0) { hypre_Free(ptr, location); return NULL; } if (ptr == NULL) { return hypre_MAlloc(new_size, location); } if (old_size == new_size) { return ptr; } void *new_ptr = hypre_MAlloc(new_size, location); size_t smaller_size = new_size > old_size ? old_size : new_size; hypre_Memcpy(new_ptr, ptr, smaller_size, location, location); hypre_Free(ptr, location); ptr = new_ptr; if (!ptr) { hypre_OutOfMemory(new_size); } return ptr; } /*--------------------------------------------------------------------------* * hypre_GetExecPolicy: return execution policy based on memory locations *--------------------------------------------------------------------------*/ /* for unary operation */ HYPRE_ExecutionPolicy hypre_GetExecPolicy1(HYPRE_MemoryLocation location) { return hypre_GetExecPolicy1_core(hypre_GetActualMemLocation(location)); } /* for binary operation */ HYPRE_ExecutionPolicy hypre_GetExecPolicy2(HYPRE_MemoryLocation location1, HYPRE_MemoryLocation location2) { return hypre_GetExecPolicy2_core(hypre_GetActualMemLocation(location1), hypre_GetActualMemLocation(location2)); } /*-------------------------------------------------------------------------- * Query the actual memory location pointed by ptr *--------------------------------------------------------------------------*/ HYPRE_Int hypre_GetPointerLocation(const void *ptr, hypre_MemoryLocation *memory_location) { HYPRE_Int ierr = 0; #if defined(HYPRE_USING_GPU) *memory_location = hypre_MEMORY_UNDEFINED; #if defined(HYPRE_USING_CUDA) struct cudaPointerAttributes attr; #if (CUDART_VERSION >= 10000) #if (CUDART_VERSION >= 11000) HYPRE_CUDA_CALL( cudaPointerGetAttributes(&attr, ptr) ); #else cudaError_t err = cudaPointerGetAttributes(&attr, ptr); if (err != cudaSuccess) { ierr = 1; /* clear the error */ cudaGetLastError(); } #endif if (attr.type == cudaMemoryTypeUnregistered) { *memory_location = hypre_MEMORY_HOST; } else if (attr.type == cudaMemoryTypeHost) { *memory_location = hypre_MEMORY_HOST_PINNED; } else if (attr.type == cudaMemoryTypeDevice) { *memory_location = hypre_MEMORY_DEVICE; } else if (attr.type == cudaMemoryTypeManaged) { *memory_location = hypre_MEMORY_UNIFIED; } #else cudaError_t err = cudaPointerGetAttributes(&attr, ptr); if (err != cudaSuccess) { ierr = 1; /* clear the error */ cudaGetLastError(); if (err == cudaErrorInvalidValue) { *memory_location = hypre_MEMORY_HOST; } } else if (attr.isManaged) { *memory_location = hypre_MEMORY_UNIFIED; } else if (attr.memoryType == cudaMemoryTypeDevice) { *memory_location = hypre_MEMORY_DEVICE; } else if (attr.memoryType == cudaMemoryTypeHost) { *memory_location = hypre_MEMORY_HOST_PINNED; } #endif // CUDART_VERSION >= 10000 #endif // defined(HYPRE_USING_CUDA) #if defined(HYPRE_USING_HIP) struct hipPointerAttribute_t attr; *memory_location = hypre_MEMORY_UNDEFINED; hipError_t err = hipPointerGetAttributes(&attr, ptr); if (err != hipSuccess) { ierr = 1; /* clear the error */ (void) hipGetLastError(); if (err == hipErrorInvalidValue) { *memory_location = hypre_MEMORY_HOST; } } else if (attr.isManaged) { *memory_location = hypre_MEMORY_UNIFIED; } #if (HIP_VERSION_MAJOR >= 6) else if (attr.type == hipMemoryTypeDevice) #else // (HIP_VERSION_MAJOR < 6) else if (attr.memoryType == hipMemoryTypeDevice) #endif // (HIP_VERSION_MAJOR >= 6) { *memory_location = hypre_MEMORY_DEVICE; } #if (HIP_VERSION_MAJOR >= 6) else if (attr.type == hipMemoryTypeHost) #else // (HIP_VERSION_MAJOR < 6) else if (attr.memoryType == hipMemoryTypeHost) #endif // (HIP_VERSION_MAJOR >= 6) { *memory_location = hypre_MEMORY_HOST_PINNED; } #if (HIP_VERSION_MAJOR >= 6) else if (attr.type == hipMemoryTypeUnregistered) #else else #endif { *memory_location = hypre_MEMORY_HOST; } #endif // defined(HYPRE_USING_HIP) #if defined(HYPRE_USING_SYCL) /* If the device is not setup, then all allocations are assumed to be on the host */ *memory_location = hypre_MEMORY_HOST; if (hypre_HandleDeviceData(hypre_handle())) { if (hypre_HandleDevice(hypre_handle())) { sycl::usm::alloc allocType; allocType = sycl::get_pointer_type(ptr, (hypre_HandleComputeStream(hypre_handle()))->get_context()); if (allocType == sycl::usm::alloc::unknown) { *memory_location = hypre_MEMORY_HOST; } else if (allocType == sycl::usm::alloc::host) { *memory_location = hypre_MEMORY_HOST_PINNED; } else if (allocType == sycl::usm::alloc::device) { *memory_location = hypre_MEMORY_DEVICE; } else if (allocType == sycl::usm::alloc::shared) { *memory_location = hypre_MEMORY_UNIFIED; } } } #endif //HYPRE_USING_SYCL #else /* #if defined(HYPRE_USING_GPU) */ *memory_location = hypre_MEMORY_HOST; HYPRE_UNUSED_VAR(ptr); #endif return ierr; } /*-------------------------------------------------------------------------- * hypre_HostMemoryGetUsage * * Retrieves various memory usage statistics involving CPU RAM. The function * fills an array with the memory data, converted to gibibytes (GiB). * Detailed info is given below: * * - mem[0]: VmSize * The current virtual memory size used by the process. This includes * all memory the process can access, including memory that is swapped * out and memory allocated but not used. * * - mem[1]: VmPeak * The peak virtual memory size used by the process during its lifetime. * * - mem[2]: VmRSS * The resident set size, which is the portion of the process' memory * that is held in CPU RAM. This includes code, data, and stack space * but excludes swapped-out memory. * * - mem[3]: VmHWM * The peak resident set size, which is the maximum amount of memory * that the process has had in CPU RAM at any point in time, aka. * high water mark. * * - mem[4]: used * The amount of used CPU RAM in the system. * * - mem[5]: total * The total amount of CPU RAM installed in the system. * * This function doesn't return correct memory info for Windows environments. *--------------------------------------------------------------------------*/ HYPRE_Int hypre_HostMemoryGetUsage(HYPRE_Real *mem) { size_t vm_size = 0; size_t vm_rss = 0; size_t vm_hwm = 0; size_t vm_peak = 0; size_t tot_mem = 0; size_t free_mem = 0; HYPRE_Real b_to_gib = (HYPRE_Real) (1 << 30); /* Sanity check */ if (!mem) { hypre_error_w_msg(HYPRE_ERROR_GENERIC, "Mem is a NULL pointer!"); return hypre_error_flag; } /* Get system memory info */ #if defined(__APPLE__) struct task_basic_info t_info; mach_msg_type_number_t t_info_count = TASK_BASIC_INFO_COUNT; mach_msg_type_number_t count = HOST_VM_INFO_COUNT; vm_statistics_data_t vm_stat; hypre_int mib[2] = {CTL_HW, HW_MEMSIZE}; size_t length = sizeof(size_t); if (sysctl(mib, 2, &tot_mem, &length, NULL, 0)) { hypre_error_w_msg(HYPRE_ERROR_GENERIC, "Problem running sysctl!"); return hypre_error_flag; } if (host_statistics(mach_host_self(), HOST_VM_INFO, (host_info_t)&vm_stat, &count) != KERN_SUCCESS) { hypre_error_w_msg(HYPRE_ERROR_GENERIC, "Problem running host_statistics!"); return hypre_error_flag; } free_mem = (size_t) vm_stat.free_count * (size_t) vm_page_size; /* Get the task info */ if (task_info(mach_task_self(), TASK_BASIC_INFO, (task_info_t)&t_info, &t_info_count) != KERN_SUCCESS) { hypre_error_w_msg(HYPRE_ERROR_GENERIC, "Problem running task_info!"); return hypre_error_flag; } /* vm_peak is not directly available, so we set it to vm_size */ vm_size = vm_peak = (size_t) t_info.virtual_size; /* vm_hwm is not directly available, so we set it to vm_rss */ vm_rss = vm_hwm = (size_t) t_info.resident_size; #elif defined(__linux__) struct sysinfo info; char line[512]; FILE *file; if (sysinfo(&info) != 0) { hypre_error_w_msg(HYPRE_ERROR_GENERIC, "Problem running sysinfo!"); return hypre_error_flag; } tot_mem = info.totalram * info.mem_unit; free_mem = info.freeram * info.mem_unit; /* Function to get process memory info */ file = fopen("/proc/self/status", "r"); if (file == NULL) { hypre_error_w_msg(HYPRE_ERROR_GENERIC, "Cannot open /proc/self/status!"); return hypre_error_flag; } while (fgets(line, sizeof(line), file)) { (void) sscanf(line, "VmPeak: %zu kB", &vm_peak); (void) sscanf(line, "VmSize: %zu kB", &vm_size); (void) sscanf(line, "VmRSS: %zu kB", &vm_rss); (void) sscanf(line, "VmHWM: %zu kB", &vm_hwm); } fclose(file); /* Convert KB to bytes */ vm_peak *= 1024; vm_size *= 1024; vm_rss *= 1024; vm_hwm *= 1024; #endif /* Convert data from bytes to GiB (HYPRE_Real) */ mem[0] = vm_size / b_to_gib; mem[1] = vm_peak / b_to_gib; mem[2] = vm_rss / b_to_gib; mem[3] = vm_hwm / b_to_gib; mem[4] = (tot_mem - free_mem) / b_to_gib; mem[5] = tot_mem / b_to_gib; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_MemoryPrintUsage *--------------------------------------------------------------------------*/ HYPRE_Int hypre_MemoryPrintUsage(MPI_Comm comm, HYPRE_Int log_level, const char *function, HYPRE_Int line) { HYPRE_Int offset = 0; HYPRE_Int ne = 6; HYPRE_Real lmem[16]; HYPRE_Real min[16]; HYPRE_Real max[16]; HYPRE_Real avg[16]; HYPRE_Real ssq[16]; HYPRE_Real std[16]; HYPRE_Real *gmem = NULL; HYPRE_Int i, j, myid, nprocs, ndigits; const char *labels[] = {"Min", "Max", "Avg", "Std"}; HYPRE_Real *data[] = {min, max, avg, std}; #if defined(HYPRE_USING_GPU) offset = 2; ne += offset; #endif #if defined(HYPRE_USING_UMPIRE) ne += 8; #endif /* Return if neither the 1st nor 2nd bits of log_level are set */ if (!(log_level & 0x3)) { return hypre_error_flag; } /* Initialize locals */ for (j = 0; j < ne; j++) { lmem[j] = 0.0; min[j] = HYPRE_REAL_MAX; max[j] = 0.0; avg[j] = 0.0; ssq[j] = 0.0; std[j] = 0.0; } /* MPI variables */ hypre_MPI_Comm_size(comm, &nprocs); hypre_MPI_Comm_rank(comm, &myid); ndigits = hypre_ndigits(nprocs); /* Work space for gathering memory info */ if (!myid) { gmem = hypre_CTAlloc(HYPRE_Real, ne * nprocs, HYPRE_MEMORY_HOST); } /* Get host memory info */ hypre_HostMemoryGetUsage(lmem); /* Get device memory info */ #if defined(HYPRE_USING_GPU) hypre_DeviceMemoryGetUsage(&lmem[6]); #endif /* Get umpire memory info */ #if defined(HYPRE_USING_UMPIRE) hypre_UmpireMemoryGetUsage(&lmem[6 + offset]); #elif !defined(HYPRE_USING_GPU) HYPRE_UNUSED_VAR(offset); #endif /* Gather memory info to rank 0 */ hypre_MPI_Gather(lmem, ne, hypre_MPI_REAL, gmem, ne, hypre_MPI_REAL, 0, comm); /* Rank 0 computes min/max/avg/stddev statistics */ if (!myid && (log_level & 0x2)) { for (i = 0; i < nprocs; i++) { for (j = 0; j < ne; j++) { if (gmem[ne * i + j] < min[j]) { min[j] = gmem[ne * i + j]; } if (gmem[ne * i + j] > max[j]) { max[j] = gmem[ne * i + j]; } avg[j] += gmem[ne * i + j]; } } for (j = 0; j < ne; j++) { avg[j] /= (HYPRE_Real) nprocs; } for (i = 0; i < nprocs; i++) { for (j = 0; j < ne; j++) { ssq[j] += hypre_pow(gmem[ne * i + j] - avg[j], 2) / (HYPRE_Real) nprocs; } } for (j = 0; j < ne; j++) { std[j] = hypre_sqrt(ssq[j]); } } /* Rank 0 prints the data */ if (!myid) { /* Local memory usage statistics */ if (log_level & 0x1) { for (i = 0; i < nprocs; i++) { if (line > 0) { hypre_printf("[%*d]: %s at line %d", ndigits, i, function, line); } else { hypre_printf("[%*d]: %s", ndigits, i, function); } hypre_printf(" | Vm[Size,RSS]/[Peak,HWM]: (%.2f, %.2f / %.2f, %.2f) GiB", gmem[ne * i + 0], gmem[ne * i + 2], gmem[ne * i + 1], gmem[ne * i + 3]); hypre_printf(" | Used/Total RAM: (%.2f / %.2f)", gmem[ne * i + 4], gmem[ne * i + 5]); #if defined(HYPRE_USING_GPU) hypre_printf(" | Used/Total VRAM: (%.2f / %.2f)", gmem[ne * i + 6], gmem[ne * i + 7]); #endif #if defined(HYPRE_USING_UMPIRE) if (gmem[ne * i + 9]) { hypre_printf(" | UmpHSize/UmpHPeak: (%.2f / %.2f)", gmem[ne * i + 8], gmem[ne * i + 9]); } if (gmem[ne * i + 11]) { hypre_printf(" | UmpDSize/UmpDPeak: (%.2f / %.2f)", gmem[ne * i + 10], gmem[ne * i + 11]); } if (gmem[ne * i + 13]) { hypre_printf(" | UmpUSize/UmpUPeak: (%.2f / %.2f)", gmem[ne * i + 12], gmem[ne * i + 13]); } if (gmem[ne * i + 15]) { hypre_printf(" | UmpPSize/UmpPPeak: (%.2f / %.2f)", gmem[ne * i + 14], gmem[ne * i + 15]); } #endif hypre_printf("\n"); } } /* Global memory usage statistics */ if (log_level & 0x2) { hypre_printf("\nMemory usage across ranks - "); if (line > 0) { hypre_printf("%s at line %d\n\n", function, line); } else { hypre_printf("%s\n\n", function); } /* Print header */ hypre_printf(" | %12s | %12s | %12s | %12s", "VmSize (GiB)", "VmPeak (GiB)", "VmRSS (GiB)", "VmHWM (GiB)"); #if defined(HYPRE_USING_GPU) hypre_printf(" | %14s | %15s", "VRAMsize (GiB)", "VRAMtotal (GiB)"); #endif #if defined(HYPRE_USING_UMPIRE_HOST) hypre_printf(" | %14s | %14s", "UmpHSize (GiB)", "UmpHPeak (GiB)"); #endif #if defined(HYPRE_USING_UMPIRE_DEVICE) hypre_printf(" | %14s | %14s", "UmpDSize (GiB)", "UmpDPeak (GiB)"); #endif #if defined(HYPRE_USING_UMPIRE_UM) if (max[12] > 0.0) { hypre_printf(" | %13s | %13s", "UmpUSize (GiB)", "UmpUPeak (GiB)"); } #endif #if defined(HYPRE_USING_UMPIRE_PINNED) hypre_printf(" | %13s | %13s", "UmpPSize (GiB)", "UmpPPeak (GiB)") #endif hypre_printf("\n"); hypre_printf(" ----+--------------+--------------+--------------+-------------"); #if defined(HYPRE_USING_GPU) hypre_printf("-+----------------+----------------"); #endif #if defined(HYPRE_USING_UMPIRE_HOST) if (max[8] > 0.0) { hypre_printf("-+----------------+---------------"); } #endif #if defined(HYPRE_USING_UMPIRE_DEVICE) if (max[10] > 0.0) { hypre_printf("-+----------------+---------------"); } #endif #if defined(HYPRE_USING_UMPIRE_UM) if (max[12] > 0.0) { hypre_printf("-+----------------+---------------"); } #endif #if defined(HYPRE_USING_UMPIRE_PINNED) if (max[14] > 0.0) { hypre_printf("-+----------------+---------------"); } #endif hypre_printf("\n"); /* Print table */ for (i = 0; i < 4; i++) { hypre_printf(" %-3s", labels[i]); hypre_printf(" | %12.3f | %12.3f | %12.3f | %12.3f", data[i][0], data[i][1], data[i][2], data[i][3]); #if defined(HYPRE_USING_GPU) hypre_printf(" | %14.3f | %15.3f", data[i][6], data[i][7]); #endif #if defined(HYPRE_USING_UMPIRE_HOST) if (max[8] > 0.0) { hypre_printf(" | %14.3f | %14.3f", data[i][8], data[i][9]); } #endif #if defined(HYPRE_USING_UMPIRE_DEVICE) if (max[10] > 0.0) { hypre_printf(" | %14.3f | %14.3f", data[i][10], data[i][11]); } #endif #if defined(HYPRE_USING_UMPIRE_UM) if (max[12] > 0.0) { hypre_printf(" | %14.3f | %14.3f", data[i][12], data[i][13]); } #endif #if defined(HYPRE_USING_UMPIRE_PINNED) if (max[14] > 0.0) { hypre_printf(" | %14.3f | %14.3f", data[i][14], data[i][15]); } #endif hypre_printf("\n"); } } } hypre_MPI_Barrier(comm); hypre_TFree(gmem, HYPRE_MEMORY_HOST); return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_SetCubMemPoolSize *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SetCubMemPoolSize(hypre_uint cub_bin_growth, hypre_uint cub_min_bin, hypre_uint cub_max_bin, size_t cub_max_cached_bytes) { #if defined(HYPRE_USING_CUDA) && defined(HYPRE_USING_DEVICE_POOL) hypre_HandleCubBinGrowth(hypre_handle()) = cub_bin_growth; hypre_HandleCubMinBin(hypre_handle()) = cub_min_bin; hypre_HandleCubMaxBin(hypre_handle()) = cub_max_bin; hypre_HandleCubMaxCachedBytes(hypre_handle()) = cub_max_cached_bytes; //TODO XXX RL: cub_min_bin, cub_max_bin are not (re)set if (hypre_HandleCubDevAllocator(hypre_handle())) { hypre_HandleCubDevAllocator(hypre_handle()) -> SetMaxCachedBytes(cub_max_cached_bytes); } if (hypre_HandleCubUvmAllocator(hypre_handle())) { hypre_HandleCubUvmAllocator(hypre_handle()) -> SetMaxCachedBytes(cub_max_cached_bytes); } #else HYPRE_UNUSED_VAR(cub_bin_growth); HYPRE_UNUSED_VAR(cub_min_bin); HYPRE_UNUSED_VAR(cub_max_bin); HYPRE_UNUSED_VAR(cub_max_cached_bytes); #endif return hypre_error_flag; } /*-------------------------------------------------------------------------- * HYPRE_SetGPUMemoryPoolSize *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_SetGPUMemoryPoolSize(HYPRE_Int bin_growth, HYPRE_Int min_bin, HYPRE_Int max_bin, size_t max_cached_bytes) { return hypre_SetCubMemPoolSize(bin_growth, min_bin, max_bin, max_cached_bytes); } #if defined(HYPRE_USING_DEVICE_POOL) && defined(HYPRE_USING_CUDA) /*-------------------------------------------------------------------------- * hypre_CachingMallocDevice *--------------------------------------------------------------------------*/ cudaError_t hypre_CachingMallocDevice(void **ptr, size_t nbytes) { if (!hypre_HandleCubDevAllocator(hypre_handle())) { hypre_HandleCubDevAllocator(hypre_handle()) = hypre_DeviceDataCubCachingAllocatorCreate( hypre_HandleCubBinGrowth(hypre_handle()), hypre_HandleCubMinBin(hypre_handle()), hypre_HandleCubMaxBin(hypre_handle()), hypre_HandleCubMaxCachedBytes(hypre_handle()), false, false, false ); } return hypre_HandleCubDevAllocator(hypre_handle()) -> DeviceAllocate(ptr, nbytes); } /*-------------------------------------------------------------------------- * hypre_CachingFreeDevice *--------------------------------------------------------------------------*/ cudaError_t hypre_CachingFreeDevice(void *ptr) { return hypre_HandleCubDevAllocator(hypre_handle()) -> DeviceFree(ptr); } /*-------------------------------------------------------------------------- * hypre_CachingMallocManaged *--------------------------------------------------------------------------*/ cudaError_t hypre_CachingMallocManaged(void **ptr, size_t nbytes) { if (!hypre_HandleCubUvmAllocator(hypre_handle())) { hypre_HandleCubUvmAllocator(hypre_handle()) = hypre_DeviceDataCubCachingAllocatorCreate( hypre_HandleCubBinGrowth(hypre_handle()), hypre_HandleCubMinBin(hypre_handle()), hypre_HandleCubMaxBin(hypre_handle()), hypre_HandleCubMaxCachedBytes(hypre_handle()), false, false, true ); } return hypre_HandleCubUvmAllocator(hypre_handle()) -> DeviceAllocate(ptr, nbytes); } /*-------------------------------------------------------------------------- * hypre_CachingFreeManaged *--------------------------------------------------------------------------*/ cudaError_t hypre_CachingFreeManaged(void *ptr) { return hypre_HandleCubUvmAllocator(hypre_handle()) -> DeviceFree(ptr); } /*-------------------------------------------------------------------------- * hypre_DeviceDataCubCachingAllocatorCreate *--------------------------------------------------------------------------*/ hypre_cub_CachingDeviceAllocator * hypre_DeviceDataCubCachingAllocatorCreate(hypre_uint bin_growth, hypre_uint min_bin, hypre_uint max_bin, size_t max_cached_bytes, bool skip_cleanup, bool debug, bool use_managed_memory) { hypre_cub_CachingDeviceAllocator *allocator = new hypre_cub_CachingDeviceAllocator( bin_growth, min_bin, max_bin, max_cached_bytes, skip_cleanup, debug, use_managed_memory ); return allocator; } /*-------------------------------------------------------------------------- * hypre_DeviceDataCubCachingAllocatorDestroy *--------------------------------------------------------------------------*/ void hypre_DeviceDataCubCachingAllocatorDestroy(hypre_DeviceData *data) { delete hypre_DeviceDataCubDevAllocator(data); delete hypre_DeviceDataCubUvmAllocator(data); } #endif // #if defined(HYPRE_USING_DEVICE_POOL) && defined(HYPRE_USING_CUDA) #if defined(HYPRE_USING_UMPIRE_HOST) /*-------------------------------------------------------------------------- * hypre_umpire_host_pooled_allocate *--------------------------------------------------------------------------*/ HYPRE_Int hypre_umpire_host_pooled_allocate(void **ptr, size_t nbytes) { hypre_Handle *handle = hypre_handle(); const char *resource_name = "HOST"; const char *pool_name = hypre_HandleUmpireHostPoolName(handle); umpire_resourcemanager *rm_ptr = &hypre_HandleUmpireResourceMan(handle); umpire_allocator pooled_allocator; if ( umpire_resourcemanager_is_allocator_name(rm_ptr, pool_name) ) { umpire_resourcemanager_get_allocator_by_name(rm_ptr, pool_name, &pooled_allocator); } else { umpire_allocator allocator; umpire_resourcemanager_get_allocator_by_name(rm_ptr, resource_name, &allocator); hypre_umpire_resourcemanager_make_allocator_pool(rm_ptr, pool_name, allocator, hypre_HandleUmpireHostPoolSize(handle), hypre_HandleUmpireBlockSize(handle), &pooled_allocator); hypre_HandleOwnUmpireHostPool(handle) = 1; } *ptr = umpire_allocator_allocate(&pooled_allocator, nbytes); return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_umpire_host_pooled_free *--------------------------------------------------------------------------*/ HYPRE_Int hypre_umpire_host_pooled_free(void *ptr) { hypre_Handle *handle = hypre_handle(); const char *pool_name = hypre_HandleUmpireHostPoolName(handle); umpire_allocator pooled_allocator; umpire_resourcemanager *rm_ptr = &hypre_HandleUmpireResourceMan(handle); hypre_assert(umpire_resourcemanager_is_allocator_name(rm_ptr, pool_name)); umpire_resourcemanager_get_allocator_by_name(rm_ptr, pool_name, &pooled_allocator); umpire_allocator_deallocate(&pooled_allocator, ptr); return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_umpire_host_pooled_realloc *--------------------------------------------------------------------------*/ void * hypre_umpire_host_pooled_realloc(void *ptr, size_t size) { hypre_Handle *handle = hypre_handle(); const char *pool_name = hypre_HandleUmpireHostPoolName(handle); umpire_allocator pooled_allocator; umpire_resourcemanager *rm_ptr = &hypre_HandleUmpireResourceMan(handle); hypre_assert(umpire_resourcemanager_is_allocator_name(rm_ptr, pool_name)); umpire_resourcemanager_get_allocator_by_name(rm_ptr, pool_name, &pooled_allocator); ptr = umpire_resourcemanager_reallocate_with_allocator(rm_ptr, ptr, size, pooled_allocator); return ptr; } #endif #if defined(HYPRE_USING_UMPIRE_DEVICE) /*-------------------------------------------------------------------------- * hypre_umpire_device_pooled_allocate *--------------------------------------------------------------------------*/ HYPRE_Int hypre_umpire_device_pooled_allocate(void **ptr, size_t nbytes) { hypre_Handle *handle = hypre_handle(); const hypre_int device_id = hypre_HandleDevice(handle); char resource_name[16]; const char *pool_name = hypre_HandleUmpireDevicePoolName(handle); hypre_sprintf(resource_name, "%s::%d", "DEVICE", device_id); umpire_resourcemanager *rm_ptr = &hypre_HandleUmpireResourceMan(handle); umpire_allocator pooled_allocator; if ( umpire_resourcemanager_is_allocator_name(rm_ptr, pool_name) ) { umpire_resourcemanager_get_allocator_by_name(rm_ptr, pool_name, &pooled_allocator); } else { umpire_allocator allocator; umpire_resourcemanager_get_allocator_by_name(rm_ptr, resource_name, &allocator); hypre_umpire_resourcemanager_make_allocator_pool(rm_ptr, pool_name, allocator, hypre_HandleUmpireDevicePoolSize(handle), hypre_HandleUmpireBlockSize(handle), &pooled_allocator); hypre_HandleOwnUmpireDevicePool(handle) = 1; } *ptr = umpire_allocator_allocate(&pooled_allocator, nbytes); return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_umpire_device_pooled_free *--------------------------------------------------------------------------*/ HYPRE_Int hypre_umpire_device_pooled_free(void *ptr) { hypre_Handle *handle = hypre_handle(); const char *pool_name = hypre_HandleUmpireDevicePoolName(handle); umpire_allocator pooled_allocator; umpire_resourcemanager *rm_ptr = &hypre_HandleUmpireResourceMan(handle); hypre_assert(umpire_resourcemanager_is_allocator_name(rm_ptr, pool_name)); umpire_resourcemanager_get_allocator_by_name(rm_ptr, pool_name, &pooled_allocator); umpire_allocator_deallocate(&pooled_allocator, ptr); return hypre_error_flag; } #endif #if defined(HYPRE_USING_UMPIRE_UM) /*-------------------------------------------------------------------------- * hypre_umpire_um_pooled_allocate *--------------------------------------------------------------------------*/ HYPRE_Int hypre_umpire_um_pooled_allocate(void **ptr, size_t nbytes) { hypre_Handle *handle = hypre_handle(); const char *resource_name = "UM"; const char *pool_name = hypre_HandleUmpireUMPoolName(handle); umpire_resourcemanager *rm_ptr = &hypre_HandleUmpireResourceMan(handle); umpire_allocator pooled_allocator; if ( umpire_resourcemanager_is_allocator_name(rm_ptr, pool_name) ) { umpire_resourcemanager_get_allocator_by_name(rm_ptr, pool_name, &pooled_allocator); } else { umpire_allocator allocator; umpire_resourcemanager_get_allocator_by_name(rm_ptr, resource_name, &allocator); hypre_umpire_resourcemanager_make_allocator_pool(rm_ptr, pool_name, allocator, hypre_HandleUmpireUMPoolSize(handle), hypre_HandleUmpireBlockSize(handle), &pooled_allocator); hypre_HandleOwnUmpireUMPool(handle) = 1; } *ptr = umpire_allocator_allocate(&pooled_allocator, nbytes); return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_umpire_um_pooled_free *--------------------------------------------------------------------------*/ HYPRE_Int hypre_umpire_um_pooled_free(void *ptr) { hypre_Handle *handle = hypre_handle(); const char *pool_name = hypre_HandleUmpireUMPoolName(handle); umpire_allocator pooled_allocator; umpire_resourcemanager *rm_ptr = &hypre_HandleUmpireResourceMan(handle); hypre_assert(umpire_resourcemanager_is_allocator_name(rm_ptr, pool_name)); umpire_resourcemanager_get_allocator_by_name(rm_ptr, pool_name, &pooled_allocator); umpire_allocator_deallocate(&pooled_allocator, ptr); return hypre_error_flag; } #endif #if defined(HYPRE_USING_UMPIRE_PINNED) /*-------------------------------------------------------------------------- * hypre_umpire_pinned_pooled_allocate *--------------------------------------------------------------------------*/ HYPRE_Int hypre_umpire_pinned_pooled_allocate(void **ptr, size_t nbytes) { hypre_Handle *handle = hypre_handle(); const char *resource_name = "PINNED"; const char *pool_name = hypre_HandleUmpirePinnedPoolName(handle); umpire_resourcemanager *rm_ptr = &hypre_HandleUmpireResourceMan(handle); umpire_allocator pooled_allocator; if ( umpire_resourcemanager_is_allocator_name(rm_ptr, pool_name) ) { umpire_resourcemanager_get_allocator_by_name(rm_ptr, pool_name, &pooled_allocator); } else { umpire_allocator allocator; umpire_resourcemanager_get_allocator_by_name(rm_ptr, resource_name, &allocator); hypre_umpire_resourcemanager_make_allocator_pool(rm_ptr, pool_name, allocator, hypre_HandleUmpirePinnedPoolSize(handle), hypre_HandleUmpireBlockSize(handle), &pooled_allocator); hypre_HandleOwnUmpirePinnedPool(handle) = 1; } *ptr = umpire_allocator_allocate(&pooled_allocator, nbytes); return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_umpire_pinned_pooled_free *--------------------------------------------------------------------------*/ HYPRE_Int hypre_umpire_pinned_pooled_free(void *ptr) { hypre_Handle *handle = hypre_handle(); const char *pool_name = hypre_HandleUmpirePinnedPoolName(handle); umpire_allocator pooled_allocator; umpire_resourcemanager *rm_ptr = &hypre_HandleUmpireResourceMan(handle); hypre_assert(umpire_resourcemanager_is_allocator_name(rm_ptr, pool_name)); umpire_resourcemanager_get_allocator_by_name(rm_ptr, pool_name, &pooled_allocator); umpire_allocator_deallocate(&pooled_allocator, ptr); return hypre_error_flag; } #endif /****************************************************************************** * * hypre Umpire * *****************************************************************************/ #if defined(HYPRE_USING_UMPIRE) /*-------------------------------------------------------------------------- * hypre_UmpireInit *--------------------------------------------------------------------------*/ HYPRE_Int hypre_UmpireInit(hypre_Handle *hypre_handle_) { umpire_resourcemanager_get_instance(&hypre_HandleUmpireResourceMan(hypre_handle_)); hypre_HandleUmpireDevicePoolSize(hypre_handle_) = 4LL * (1 << 30); // 4 GiB hypre_HandleUmpireUMPoolSize(hypre_handle_) = 4LL * (1 << 30); // 4 GiB hypre_HandleUmpireHostPoolSize(hypre_handle_) = 4LL * (1 << 30); // 4 GiB hypre_HandleUmpirePinnedPoolSize(hypre_handle_) = 4LL * (1 << 30); // 4 GiB hypre_HandleUmpireBlockSize(hypre_handle_) = 512; strcpy(hypre_HandleUmpireDevicePoolName(hypre_handle_), "HYPRE_DEVICE_POOL"); strcpy(hypre_HandleUmpireUMPoolName(hypre_handle_), "HYPRE_UM_POOL"); strcpy(hypre_HandleUmpireHostPoolName(hypre_handle_), "HYPRE_HOST_POOL"); strcpy(hypre_HandleUmpirePinnedPoolName(hypre_handle_), "HYPRE_PINNED_POOL"); hypre_HandleOwnUmpireDevicePool(hypre_handle_) = 0; hypre_HandleOwnUmpireUMPool(hypre_handle_) = 0; hypre_HandleOwnUmpireHostPool(hypre_handle_) = 0; hypre_HandleOwnUmpirePinnedPool(hypre_handle_) = 0; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_UmpireFinalize *--------------------------------------------------------------------------*/ HYPRE_Int hypre_UmpireFinalize(hypre_Handle *hypre_handle_) { umpire_resourcemanager *rm_ptr = &hypre_HandleUmpireResourceMan(hypre_handle_); umpire_allocator allocator; #if defined(HYPRE_USING_UMPIRE_HOST) if (hypre_HandleOwnUmpireHostPool(hypre_handle_)) { const char *pool_name = hypre_HandleUmpireHostPoolName(hypre_handle_); umpire_resourcemanager_get_allocator_by_name(rm_ptr, pool_name, &allocator); umpire_allocator_release(&allocator); } #endif #if defined(HYPRE_USING_UMPIRE_DEVICE) if (hypre_HandleOwnUmpireDevicePool(hypre_handle_)) { const char *pool_name = hypre_HandleUmpireDevicePoolName(hypre_handle_); umpire_resourcemanager_get_allocator_by_name(rm_ptr, pool_name, &allocator); umpire_allocator_release(&allocator); } #endif #if defined(HYPRE_USING_UMPIRE_UM) if (hypre_HandleOwnUmpireUMPool(hypre_handle_)) { const char *pool_name = hypre_HandleUmpireUMPoolName(hypre_handle_); umpire_resourcemanager_get_allocator_by_name(rm_ptr, pool_name, &allocator); umpire_allocator_release(&allocator); } #endif #if defined(HYPRE_USING_UMPIRE_PINNED) if (hypre_HandleOwnUmpirePinnedPool(hypre_handle_)) { const char *pool_name = hypre_HandleUmpirePinnedPoolName(hypre_handle_); umpire_resourcemanager_get_allocator_by_name(rm_ptr, pool_name, &allocator); umpire_allocator_release(&allocator); } #endif return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_UmpireMemoryGetUsage *--------------------------------------------------------------------------*/ HYPRE_Int hypre_UmpireMemoryGetUsage(HYPRE_Real *memory) { hypre_Handle *handle = hypre_handle(); umpire_resourcemanager *rm_ptr = &hypre_HandleUmpireResourceMan(handle); umpire_allocator allocator; size_t memoryB[8] = {0, 0, 0, 0, 0, 0, 0, 0}; HYPRE_Int i; /* Sanity check */ if (!memory) { hypre_error_w_msg(HYPRE_ERROR_GENERIC, "memory is a NULL pointer!"); return hypre_error_flag; } #if defined(HYPRE_USING_UMPIRE_HOST) if (hypre_HandleOwnUmpireHostPool(handle)) { const char *pool_name = hypre_HandleUmpireHostPoolName(handle); umpire_resourcemanager_get_allocator_by_name(rm_ptr, pool_name, &allocator); memoryB[0] = umpire_allocator_get_current_size(&allocator); memoryB[1] = umpire_allocator_get_high_watermark(&allocator); } #endif #if defined(HYPRE_USING_UMPIRE_DEVICE) if (hypre_HandleOwnUmpireDevicePool(handle)) { const char *pool_name = hypre_HandleUmpireDevicePoolName(handle); umpire_resourcemanager_get_allocator_by_name(rm_ptr, pool_name, &allocator); memoryB[2] = umpire_allocator_get_current_size(&allocator); memoryB[3] = umpire_allocator_get_high_watermark(&allocator); } #endif #if defined(HYPRE_USING_UMPIRE_UM) if (hypre_HandleOwnUmpireUMPool(handle)) { const char *pool_name = hypre_HandleUmpireUMPoolName(handle); umpire_resourcemanager_get_allocator_by_name(rm_ptr, pool_name, &allocator); memoryB[4] = umpire_allocator_get_current_size(&allocator); memoryB[5] = umpire_allocator_get_high_watermark(&allocator); } #endif #if defined(HYPRE_USING_UMPIRE_PINNED) if (hypre_HandleOwnUmpirePinnedPool(handle)) { const char *pool_name = hypre_HandleUmpirePinnedPoolName(handle); umpire_resourcemanager_get_allocator_by_name(rm_ptr, pool_name, &allocator); memoryB[6] = umpire_allocator_get_current_size(&allocator); memoryB[7] = umpire_allocator_get_high_watermark(&allocator); } #endif /* Convert bytes to GiB */ for (i = 0; i < 8; i++) { memory[i] = ((HYPRE_Real) memoryB[i]) / ((HYPRE_Real) (1 << 30)); } return hypre_error_flag; } /*-------------------------------------------------------------------------- * HYPRE_SetUmpireDevicePoolSize *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_SetUmpireDevicePoolSize(size_t nbytes) { hypre_HandleUmpireDevicePoolSize(hypre_handle()) = nbytes; return hypre_error_flag; } /*-------------------------------------------------------------------------- * HYPRE_SetUmpireUMPoolSize *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_SetUmpireUMPoolSize(size_t nbytes) { hypre_HandleUmpireUMPoolSize(hypre_handle()) = nbytes; return hypre_error_flag; } /*-------------------------------------------------------------------------- * HYPRE_SetUmpireHostPoolSize *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_SetUmpireHostPoolSize(size_t nbytes) { hypre_HandleUmpireHostPoolSize(hypre_handle()) = nbytes; return hypre_error_flag; } /*-------------------------------------------------------------------------- * HYPRE_SetUmpirePinnedPoolSize *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_SetUmpirePinnedPoolSize(size_t nbytes) { hypre_HandleUmpirePinnedPoolSize(hypre_handle()) = nbytes; return hypre_error_flag; } /*-------------------------------------------------------------------------- * HYPRE_SetUmpireDevicePoolName *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_SetUmpireDevicePoolName(const char *pool_name) { if (strlen(pool_name) > HYPRE_UMPIRE_POOL_NAME_MAX_LEN) { hypre_error_in_arg(1); return hypre_error_flag; } strcpy(hypre_HandleUmpireDevicePoolName(hypre_handle()), pool_name); return hypre_error_flag; } /*-------------------------------------------------------------------------- * HYPRE_SetUmpireUMPoolName *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_SetUmpireUMPoolName(const char *pool_name) { if (strlen(pool_name) > HYPRE_UMPIRE_POOL_NAME_MAX_LEN) { hypre_error_in_arg(1); return hypre_error_flag; } strcpy(hypre_HandleUmpireUMPoolName(hypre_handle()), pool_name); return hypre_error_flag; } /*-------------------------------------------------------------------------- * HYPRE_SetUmpireHostPoolName *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_SetUmpireHostPoolName(const char *pool_name) { if (strlen(pool_name) > HYPRE_UMPIRE_POOL_NAME_MAX_LEN) { hypre_error_in_arg(1); return hypre_error_flag; } strcpy(hypre_HandleUmpireHostPoolName(hypre_handle()), pool_name); return hypre_error_flag; } /*-------------------------------------------------------------------------- * HYPRE_SetUmpirePinnedPoolName *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_SetUmpirePinnedPoolName(const char *pool_name) { if (strlen(pool_name) > HYPRE_UMPIRE_POOL_NAME_MAX_LEN) { hypre_error_in_arg(1); return hypre_error_flag; } strcpy(hypre_HandleUmpirePinnedPoolName(hypre_handle()), pool_name); return hypre_error_flag; } #endif /* #if defined(HYPRE_USING_UMPIRE) */ hypre-2.33.0/src/utilities/memory.h000066400000000000000000000234611477326011500172250ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * Header file for memory management utilities * * The abstract memory model has a Host (think CPU) and a Device (think GPU) and * three basic types of memory management utilities: * * 1. Malloc(..., location) * location=LOCATION_DEVICE - malloc memory on the device * location=LOCATION_HOST - malloc memory on the host * 2. MemCopy(..., method) * method=HOST_TO_DEVICE - copy from host to device * method=DEVICE_TO_HOST - copy from device to host * method=DEVICE_TO_DEVICE - copy from device to device * 3. SetExecutionMode * location=LOCATION_DEVICE - execute on the device * location=LOCATION_HOST - execute on the host * * Although the abstract model does not explicitly reflect a managed memory * model (i.e., unified memory), it can support it. Here is a summary of how * the abstract model would be mapped to specific hardware scenarios: * * Not using a device, not using managed memory * Malloc(..., location) * location=LOCATION_DEVICE - host malloc e.g., malloc * location=LOCATION_HOST - host malloc e.g., malloc * MemoryCopy(..., locTo,locFrom) * locTo=LOCATION_HOST, locFrom=LOCATION_DEVICE - copy from host to host e.g., memcpy * locTo=LOCATION_DEVICE, locFrom=LOCATION_HOST - copy from host to host e.g., memcpy * locTo=LOCATION_DEVICE, locFrom=LOCATION_DEVICE - copy from host to host e.g., memcpy * SetExecutionMode * location=LOCATION_DEVICE - execute on the host * location=LOCATION_HOST - execute on the host * * Using a device, not using managed memory * Malloc(..., location) * location=LOCATION_DEVICE - device malloc e.g., cudaMalloc * location=LOCATION_HOST - host malloc e.g., malloc * MemoryCopy(..., locTo,locFrom) * locTo=LOCATION_HOST, locFrom=LOCATION_DEVICE - copy from device to host e.g., cudaMemcpy * locTo=LOCATION_DEVICE, locFrom=LOCATION_HOST - copy from host to device e.g., cudaMemcpy * locTo=LOCATION_DEVICE, locFrom=LOCATION_DEVICE - copy from device to device e.g., cudaMemcpy * SetExecutionMode * location=LOCATION_DEVICE - execute on the device * location=LOCATION_HOST - execute on the host * * Using a device, using managed memory * Malloc(..., location) * location=LOCATION_DEVICE - managed malloc e.g., cudaMallocManaged * location=LOCATION_HOST - host malloc e.g., malloc * MemoryCopy(..., locTo,locFrom) * locTo=LOCATION_HOST, locFrom=LOCATION_DEVICE - copy from device to host e.g., cudaMallocManaged * locTo=LOCATION_DEVICE, locFrom=LOCATION_HOST - copy from host to device e.g., cudaMallocManaged * locTo=LOCATION_DEVICE, locFrom=LOCATION_DEVICE - copy from device to device e.g., cudaMallocManaged * SetExecutionMode * location=LOCATION_DEVICE - execute on the device * location=LOCATION_HOST - execute on the host * *****************************************************************************/ #ifndef hypre_MEMORY_HEADER #define hypre_MEMORY_HEADER #include #include #if defined(HYPRE_USING_UNIFIED_MEMORY) && defined(HYPRE_USING_DEVICE_OPENMP) //#pragma omp requires unified_shared_memory #endif /* stringification: * _Pragma(string-literal), so we need to cast argument to a string * The three dots as last argument of the macro tells compiler that this is a variadic macro. * I.e. this is a macro that receives variable number of arguments. */ #define HYPRE_STR(...) #__VA_ARGS__ #define HYPRE_XSTR(...) HYPRE_STR(__VA_ARGS__) #ifdef __cplusplus extern "C" { #endif typedef enum _hypre_MemoryLocation { hypre_MEMORY_UNDEFINED = -1, hypre_MEMORY_HOST, hypre_MEMORY_HOST_PINNED, hypre_MEMORY_DEVICE, hypre_MEMORY_UNIFIED, hypre_NUM_MEMORY_LOCATION } hypre_MemoryLocation; /*------------------------------------------------------- * hypre_GetActualMemLocation * return actual location based on the selected memory model *-------------------------------------------------------*/ static inline HYPRE_MAYBE_UNUSED_FUNC hypre_MemoryLocation hypre_GetActualMemLocation(HYPRE_MemoryLocation location) { if (location == HYPRE_MEMORY_HOST) { return hypre_MEMORY_HOST; } if (location == HYPRE_MEMORY_DEVICE) { #if defined(HYPRE_USING_HOST_MEMORY) return hypre_MEMORY_HOST; #elif defined(HYPRE_USING_DEVICE_MEMORY) return hypre_MEMORY_DEVICE; #elif defined(HYPRE_USING_UNIFIED_MEMORY) return hypre_MEMORY_UNIFIED; #else #error Wrong HYPRE memory setting. #endif } return hypre_MEMORY_UNDEFINED; } #if !defined(HYPRE_USING_MEMORY_TRACKER) #define hypre_TAlloc(type, count, location) \ ( (type *) hypre_MAlloc((size_t)(sizeof(type) * (count)), location) ) #define _hypre_TAlloc(type, count, location) \ ( (type *) _hypre_MAlloc((size_t)(sizeof(type) * (count)), location) ) #define hypre_CTAlloc(type, count, location) \ ( (type *) hypre_CAlloc((size_t)(count), (size_t)sizeof(type), location) ) #define hypre_TReAlloc(ptr, type, count, location) \ ( (type *) hypre_ReAlloc((char *)ptr, (size_t)(sizeof(type) * (count)), location) ) #define hypre_TReAlloc_v2(ptr, old_type, old_count, new_type, new_count, location) \ ( (new_type *) hypre_ReAlloc_v2((char *)ptr, (size_t)(sizeof(old_type)*(old_count)), (size_t)(sizeof(new_type)*(new_count)), location) ) #define hypre_TMemcpy(dst, src, type, count, locdst, locsrc) \ (hypre_Memcpy((void *)(dst), (void *)(src), (size_t)(sizeof(type) * (count)), locdst, locsrc)) #define hypre_TFree(ptr, location) \ ( hypre_Free((void *)ptr, location), ptr = NULL ) #define _hypre_TFree(ptr, location) \ ( _hypre_Free((void *)ptr, location), ptr = NULL ) #endif /* #if !defined(HYPRE_USING_MEMORY_TRACKER) */ /*-------------------------------------------------------------------------- * Prototypes *--------------------------------------------------------------------------*/ /* memory.c */ HYPRE_Int hypre_GetMemoryLocationName(hypre_MemoryLocation memory_location, char *memory_location_name); void hypre_CheckMemoryLocation(void *ptr, hypre_MemoryLocation location); void * hypre_Memset(void *ptr, HYPRE_Int value, size_t num, HYPRE_MemoryLocation location); void hypre_MemPrefetch(void *ptr, size_t size, HYPRE_MemoryLocation location); void * hypre_MAlloc(size_t size, HYPRE_MemoryLocation location); void * hypre_CAlloc( size_t count, size_t elt_size, HYPRE_MemoryLocation location); void hypre_Free(void *ptr, HYPRE_MemoryLocation location); void hypre_Memcpy(void *dst, void *src, size_t size, HYPRE_MemoryLocation loc_dst, HYPRE_MemoryLocation loc_src); void * hypre_ReAlloc(void *ptr, size_t size, HYPRE_MemoryLocation location); void * hypre_ReAlloc_v2(void *ptr, size_t old_size, size_t new_size, HYPRE_MemoryLocation location); void * _hypre_MAlloc(size_t size, hypre_MemoryLocation location); void _hypre_Free(void *ptr, hypre_MemoryLocation location); HYPRE_ExecutionPolicy hypre_GetExecPolicy1(HYPRE_MemoryLocation location); HYPRE_ExecutionPolicy hypre_GetExecPolicy2(HYPRE_MemoryLocation location1, HYPRE_MemoryLocation location2); HYPRE_Int hypre_GetPointerLocation(const void *ptr, hypre_MemoryLocation *memory_location); HYPRE_Int hypre_SetCubMemPoolSize( hypre_uint bin_growth, hypre_uint min_bin, hypre_uint max_bin, size_t max_cached_bytes ); HYPRE_Int hypre_umpire_host_pooled_allocate(void **ptr, size_t nbytes); HYPRE_Int hypre_umpire_host_pooled_free(void *ptr); void *hypre_umpire_host_pooled_realloc(void *ptr, size_t size); HYPRE_Int hypre_umpire_device_pooled_allocate(void **ptr, size_t nbytes); HYPRE_Int hypre_umpire_device_pooled_free(void *ptr); HYPRE_Int hypre_umpire_um_pooled_allocate(void **ptr, size_t nbytes); HYPRE_Int hypre_umpire_um_pooled_free(void *ptr); HYPRE_Int hypre_umpire_pinned_pooled_allocate(void **ptr, size_t nbytes); HYPRE_Int hypre_umpire_pinned_pooled_free(void *ptr); HYPRE_Int hypre_UmpireInit(hypre_Handle *hypre_handle_); HYPRE_Int hypre_UmpireFinalize(hypre_Handle *hypre_handle_); HYPRE_Int hypre_UmpireGetCurrentMemoryUsage(MPI_Comm comm, HYPRE_Real *current); HYPRE_Int hypre_UmpireMemoryGetUsage(HYPRE_Real *memory); HYPRE_Int hypre_HostMemoryGetUsage(HYPRE_Real *mem); HYPRE_Int hypre_MemoryPrintUsage(MPI_Comm comm, HYPRE_Int level, const char *function, HYPRE_Int line); #define HYPRE_PRINT_MEMORY_USAGE(comm) hypre_MemoryPrintUsage(comm,\ hypre_HandleLogLevel(hypre_handle()),\ __func__,\ __LINE__) /* memory_dmalloc.c */ HYPRE_Int hypre_InitMemoryDebugDML( HYPRE_Int id ); HYPRE_Int hypre_FinalizeMemoryDebugDML( void ); char *hypre_MAllocDML( HYPRE_Int size, char *file, HYPRE_Int line ); char *hypre_CAllocDML( HYPRE_Int count, HYPRE_Int elt_size, char *file, HYPRE_Int line ); char *hypre_ReAllocDML( char *ptr, HYPRE_Int size, char *file, HYPRE_Int line ); void hypre_FreeDML( char *ptr, char *file, HYPRE_Int line ); #ifdef __cplusplus } #endif #endif /* hypre_MEMORY_HEADER */ hypre-2.33.0/src/utilities/memory_dmalloc.c000066400000000000000000000063531477326011500207140ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * Memory management utilities * * Routines to use "Debug Malloc Library", dmalloc * *****************************************************************************/ #ifdef HYPRE_MEMORY_DMALLOC #include "memory.h" #include char dmalloc_logpath_memory[256]; /*-------------------------------------------------------------------------- * hypre_InitMemoryDebugDML *--------------------------------------------------------------------------*/ HYPRE_Int hypre_InitMemoryDebugDML( HYPRE_Int id ) { HYPRE_Int *iptr; /* do this to get the Debug Malloc Library started/initialized */ iptr = hypre_TAlloc(HYPRE_Int, 1, HYPRE_MEMORY_HOST); hypre_TFree(iptr, HYPRE_MEMORY_HOST); dmalloc_logpath = dmalloc_logpath_memory; hypre_sprintf(dmalloc_logpath, "dmalloc.log.%04d", id); return 0; } /*-------------------------------------------------------------------------- * hypre_FinalizeMemoryDebugDML *--------------------------------------------------------------------------*/ HYPRE_Int hypre_FinalizeMemoryDebugDML( ) { dmalloc_verify(NULL); return 0; } /*-------------------------------------------------------------------------- * hypre_MAllocDML *--------------------------------------------------------------------------*/ char * hypre_MAllocDML( HYPRE_Int size, char *file, HYPRE_Int line ) { char *ptr; if (size > 0) { ptr = _malloc_leap(file, line, size); } else { ptr = NULL; } return ptr; } /*-------------------------------------------------------------------------- * hypre_CAllocDML *--------------------------------------------------------------------------*/ char * hypre_CAllocDML( HYPRE_Int count, HYPRE_Int elt_size, char *file, HYPRE_Int line ) { char *ptr; HYPRE_Int size = count * elt_size; if (size > 0) { ptr = _calloc_leap(file, line, count, elt_size); } else { ptr = NULL; } return ptr; } /*-------------------------------------------------------------------------- * hypre_ReAllocDML *--------------------------------------------------------------------------*/ char * hypre_ReAllocDML( char *ptr, HYPRE_Int size, char *file, HYPRE_Int line ) { ptr = _realloc_leap(file, line, ptr, size); return ptr; } /*-------------------------------------------------------------------------- * hypre_FreeDML *--------------------------------------------------------------------------*/ void hypre_FreeDML( char *ptr, char *file, HYPRE_Int line ) { if (ptr) { _free_leap(file, line, ptr); } } #else /* this is used only to eliminate compiler warnings */ char hypre_memory_dmalloc_empty; #endif hypre-2.33.0/src/utilities/memory_tracker.c000066400000000000000000000517201477326011500207320ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /*-------------------------------------------------------------------------- * Memory tracker * Do NOT use hypre_T* in this file since we don't want to track them, * Do NOT use hypre_printf, hypre_fprintf, which have hypre_TAlloc/Free * endless for-loop otherwise *--------------------------------------------------------------------------*/ #include "_hypre_utilities.h" #if defined(HYPRE_USING_MEMORY_TRACKER) hypre_MemoryTracker *_hypre_memory_tracker = NULL; /* accessor to the global ``_hypre_memory_tracker'' */ hypre_MemoryTracker* hypre_memory_tracker(void) { #ifdef HYPRE_USING_OPENMP #pragma omp critical #endif { if (!_hypre_memory_tracker) { _hypre_memory_tracker = hypre_MemoryTrackerCreate(); } } return _hypre_memory_tracker; } size_t hypre_total_bytes[hypre_NUM_MEMORY_LOCATION]; size_t hypre_peak_bytes[hypre_NUM_MEMORY_LOCATION]; size_t hypre_current_bytes[hypre_NUM_MEMORY_LOCATION]; HYPRE_Int hypre_memory_tracker_print = 0; char hypre_memory_tracker_filename[HYPRE_MAX_FILE_NAME_LEN] = "HypreMemoryTrack.log"; char *hypre_basename(const char *name) { const char *base = name; while (*name) { if (*name++ == '/') { base = name; } } return (char *) base; } hypre_MemcpyType hypre_GetMemcpyType(hypre_MemoryLocation dst, hypre_MemoryLocation src) { HYPRE_Int d = 0, s = 0; if (dst == hypre_MEMORY_HOST || dst == hypre_MEMORY_HOST_PINNED) { d = 0; } else if (dst == hypre_MEMORY_DEVICE || dst == hypre_MEMORY_UNIFIED) { d = 1; } if (src == hypre_MEMORY_HOST || src == hypre_MEMORY_HOST_PINNED) { s = 0; } else if (src == hypre_MEMORY_DEVICE || src == hypre_MEMORY_UNIFIED) { s = 1; } if (d == 0 && s == 0) { return hypre_MEMCPY_H2H; } if (d == 0 && s == 1) { return hypre_MEMCPY_D2H; } if (d == 1 && s == 0) { return hypre_MEMCPY_H2D; } if (d == 1 && s == 1) { return hypre_MEMCPY_D2D; } return hypre_MEMCPY_NUM_TYPES; } hypre_int hypre_MemoryTrackerQueueCompSort(const void *e1, const void *e2) { void *p1 = ((hypre_MemoryTrackerEntry *) e1) -> ptr; void *p2 = ((hypre_MemoryTrackerEntry *) e2) -> ptr; if (p1 < p2) { return -1; } if (p1 > p2) { return 1; } size_t t1 = ((hypre_MemoryTrackerEntry *) e1) -> time_step; size_t t2 = ((hypre_MemoryTrackerEntry *) e2) -> time_step; if (t1 < t2) { return -1; } if (t1 > t2) { return 1; } return 0; } hypre_int hypre_MemoryTrackerQueueCompSearch(const void *e1, const void *e2) { void *p1 = ((hypre_MemoryTrackerEntry **) e1)[0] -> ptr; void *p2 = ((hypre_MemoryTrackerEntry **) e2)[0] -> ptr; if (p1 < p2) { return -1; } if (p1 > p2) { return 1; } return 0; } hypre_MemoryTrackerEvent hypre_MemoryTrackerGetNext(hypre_MemoryTracker *tracker) { hypre_MemoryTrackerEvent i, k = HYPRE_MEMORY_NUM_EVENTS; hypre_MemoryTrackerQueue *q = tracker->queue; for (i = HYPRE_MEMORY_EVENT_ALLOC; i < HYPRE_MEMORY_NUM_EVENTS; i++) { if (q[i].head >= q[i].actual_size) { continue; } if (k == HYPRE_MEMORY_NUM_EVENTS || q[i].data[q[i].head].time_step < q[k].data[q[k].head].time_step) { k = i; } } return k; } HYPRE_Int hypre_MemoryTrackerSortQueue(hypre_MemoryTrackerQueue *q) { size_t i = 0; if (!q) { return hypre_error_flag; } free(q->sorted_data); free(q->sorted_data_compressed_offset); free(q->sorted_data_compressed); q->sorted_data = (hypre_MemoryTrackerEntry *) malloc(q->actual_size * sizeof( hypre_MemoryTrackerEntry)); memcpy(q->sorted_data, q->data, q->actual_size * sizeof(hypre_MemoryTrackerEntry)); qsort(q->sorted_data, q->actual_size, sizeof(hypre_MemoryTrackerEntry), hypre_MemoryTrackerQueueCompSort); q->sorted_data_compressed_len = 0; q->sorted_data_compressed_offset = (size_t *) malloc(q->actual_size * sizeof(size_t)); q->sorted_data_compressed = (hypre_MemoryTrackerEntry **) malloc((q->actual_size + 1) * sizeof( hypre_MemoryTrackerEntry *)); for (i = 0; i < q->actual_size; i++) { if (i == 0 || q->sorted_data[i].ptr != q->sorted_data[i - 1].ptr) { q->sorted_data_compressed_offset[q->sorted_data_compressed_len] = i; q->sorted_data_compressed[q->sorted_data_compressed_len] = &q->sorted_data[i]; q->sorted_data_compressed_len ++; } } q->sorted_data_compressed[q->sorted_data_compressed_len] = q->sorted_data + q->actual_size; q->sorted_data_compressed_offset = (size_t *) realloc(q->sorted_data_compressed_offset, q->sorted_data_compressed_len * sizeof(size_t)); q->sorted_data_compressed = (hypre_MemoryTrackerEntry **) realloc(q->sorted_data_compressed, (q->sorted_data_compressed_len + 1) * sizeof(hypre_MemoryTrackerEntry *)); return hypre_error_flag; } hypre_MemoryTracker * hypre_MemoryTrackerCreate() { hypre_MemoryTracker *ptr = (hypre_MemoryTracker *) calloc(1, sizeof(hypre_MemoryTracker)); return ptr; } void hypre_MemoryTrackerDestroy(hypre_MemoryTracker *tracker) { if (tracker) { HYPRE_Int i; for (i = 0; i < HYPRE_MEMORY_NUM_EVENTS; i++) { free(tracker->queue[i].data); free(tracker->queue[i].sorted_data); free(tracker->queue[i].sorted_data_compressed_offset); free(tracker->queue[i].sorted_data_compressed); } free(tracker); } } HYPRE_Int hypre_MemoryTrackerSetPrint(HYPRE_Int do_print) { hypre_memory_tracker_print = do_print; return hypre_error_flag; } HYPRE_Int hypre_MemoryTrackerSetFileName(const char *file_name) { snprintf(hypre_memory_tracker_filename, HYPRE_MAX_FILE_NAME_LEN, "%s", file_name); return hypre_error_flag; } void hypre_MemoryTrackerInsert1(const char *action, void *ptr, size_t nbytes, hypre_MemoryLocation memory_location, const char *filename, const char *function, HYPRE_Int line) { hypre_MemoryTrackerInsert2(action, ptr, NULL, nbytes, memory_location, hypre_MEMORY_UNDEFINED, filename, function, line); } void hypre_MemoryTrackerInsert2(const char *action, void *ptr, void *ptr2, size_t nbytes, hypre_MemoryLocation memory_location, hypre_MemoryLocation memory_location2, const char *filename, const char *function, HYPRE_Int line) { if (ptr == NULL) { return; } hypre_MemoryTracker *tracker = hypre_memory_tracker(); hypre_MemoryTrackerEvent q; /* Get the proper queue based on the action */ if (strstr(action, "alloc") != NULL) { /* including malloc, alloc and the malloc in realloc */ q = HYPRE_MEMORY_EVENT_ALLOC; } else if (strstr(action, "free") != NULL) { /* including free and the free in realloc */ q = HYPRE_MEMORY_EVENT_FREE; } else if (strstr(action, "memcpy") != NULL) { /* including memcpy */ q = HYPRE_MEMORY_EVENT_COPY; } else { return; } hypre_MemoryTrackerQueue *queue = &tracker->queue[q]; #ifdef HYPRE_USING_OPENMP #pragma omp critical #endif { /* resize if not enough space */ if (queue->alloced_size <= queue->actual_size) { queue->alloced_size = 2 * queue->alloced_size + 1; queue->data = (hypre_MemoryTrackerEntry *) realloc(queue->data, queue->alloced_size * sizeof(hypre_MemoryTrackerEntry)); } hypre_assert(queue->actual_size < queue->alloced_size); /* insert an entry */ hypre_MemoryTrackerEntry *entry = queue->data + queue->actual_size; entry->index = queue->actual_size; entry->time_step = tracker->curr_time_step; sprintf(entry->action, "%s", action); entry->ptr = ptr; entry->ptr2 = ptr2; entry->nbytes = nbytes; entry->memory_location = memory_location; entry->memory_location2 = memory_location2; sprintf(entry->filename, "%s", filename); sprintf(entry->function, "%s", function); entry->line = line; entry->pair = (size_t) -1; #if 0 HYPRE_Int myid; hypre_MPI_Comm_rank(hypre_MPI_COMM_WORLD, &myid); if (myid == 0 && entry->time_step == 28111) {assert(0);} #endif /* increase the time step */ tracker->curr_time_step ++; /* increase the queue length by 1 */ queue->actual_size ++; } } HYPRE_Int hypre_PrintMemoryTracker( size_t *totl_bytes_o, size_t *peak_bytes_o, size_t *curr_bytes_o, HYPRE_Int do_print, const char *fname ) { char filename[HYPRE_MAX_FILE_NAME_LEN + 16]; FILE *file = NULL; size_t totl_bytes[hypre_NUM_MEMORY_LOCATION] = {0}; size_t peak_bytes[hypre_NUM_MEMORY_LOCATION] = {0}; size_t curr_bytes[hypre_NUM_MEMORY_LOCATION] = {0}; size_t copy_bytes[hypre_MEMCPY_NUM_TYPES] = {0}; size_t j; hypre_MemoryTrackerEvent i; //HYPRE_Real t0 = hypre_MPI_Wtime(); HYPRE_Int leakcheck = 1; hypre_MemoryTracker *tracker = hypre_memory_tracker(); hypre_MemoryTrackerQueue *qq = tracker->queue; hypre_MemoryTrackerQueue *qa = &qq[HYPRE_MEMORY_EVENT_ALLOC]; hypre_MemoryTrackerQueue *qf = &qq[HYPRE_MEMORY_EVENT_FREE]; if (do_print) { HYPRE_Int myid; hypre_MPI_Comm_rank(hypre_MPI_COMM_WORLD, &myid); if (fname) { hypre_sprintf(filename, "%s.%05d.csv", fname, myid); } else { hypre_sprintf(filename, "HypreMemoryTrack.log.%05d.csv", myid); } if ((file = fopen(filename, "w")) == NULL) { fprintf(stderr, "Error: can't open output file %s\n", filename); return hypre_error_flag; } fprintf(file, "\"==== Operations:\"\n"); fprintf(file, " %6s, %9s, %16s, %16s, %10s, %10s, %10s, %28s, %8s, %54s, %11s, %11s, %11s, %11s\n", "ID", "EVENT", "ADDRESS1", "ADDRESS2", "BYTE", "LOCATION1", "LOCATION2", "FILE", "LINE", "FUNCTION", "HOST", "PINNED", "DEVICE", "UNIFIED"); } if (leakcheck) { //HYPRE_Real t0 = hypre_MPI_Wtime(); hypre_MemoryTrackerSortQueue(qf); //HYPRE_Real t1 = hypre_MPI_Wtime() - t0; //printf("Sort Time %.2f\n", t1); } size_t total_num_events = 0; size_t total_num_events_2 = 0; for (i = HYPRE_MEMORY_EVENT_ALLOC; i < HYPRE_MEMORY_NUM_EVENTS; i++) { total_num_events_2 += qq[i].actual_size; } for (i = hypre_MemoryTrackerGetNext(tracker); i < HYPRE_MEMORY_NUM_EVENTS; i = hypre_MemoryTrackerGetNext(tracker)) { total_num_events ++; hypre_MemoryTrackerEntry *entry = &qq[i].data[qq[i].head++]; if (strstr(entry->action, "alloc") != NULL) { totl_bytes[entry->memory_location] += entry->nbytes; if (leakcheck) { curr_bytes[entry->memory_location] += entry->nbytes; peak_bytes[entry->memory_location] = hypre_max( curr_bytes[entry->memory_location], peak_bytes[entry->memory_location] ); } if (leakcheck && entry->pair == (size_t) -1) { hypre_MemoryTrackerEntry key = { .ptr = entry->ptr }; hypre_MemoryTrackerEntry *key_ptr = &key; hypre_MemoryTrackerEntry **result = bsearch(&key_ptr, qf->sorted_data_compressed, qf->sorted_data_compressed_len, sizeof(hypre_MemoryTrackerEntry *), hypre_MemoryTrackerQueueCompSearch); if (result) { j = result - qf->sorted_data_compressed; hypre_MemoryTrackerEntry *p = qf->sorted_data + qf->sorted_data_compressed_offset[j]; if (p < qf->sorted_data_compressed[j + 1]) { hypre_assert(p->ptr == entry->ptr); entry->pair = p->index; hypre_assert(qf->data[p->index].pair == -1); hypre_assert(qq[i].head - 1 == entry->index); qf->data[p->index].pair = entry->index; qf->data[p->index].nbytes = entry->nbytes; qf->sorted_data_compressed_offset[j] ++; } } } } else if (leakcheck && strstr(entry->action, "free") != NULL) { if (entry->pair < qa->actual_size) { curr_bytes[entry->memory_location] -= qa->data[entry->pair].nbytes; } } else if (strstr(entry->action, "memcpy") != NULL) { copy_bytes[hypre_GetMemcpyType(entry->memory_location, entry->memory_location2)] += entry->nbytes; } if (do_print) { char memory_location[256]; char memory_location2[256]; char nbytes[32]; hypre_GetMemoryLocationName(entry->memory_location, memory_location); hypre_GetMemoryLocationName(entry->memory_location2, memory_location2); if (entry->nbytes != (size_t) -1) { sprintf(nbytes, "%zu", entry->nbytes); } else { sprintf(nbytes, "%s", "--"); } fprintf(file, " %6zu, %9s, %16p, %16p, %10s, %10s, %10s, %28s, %8d, %54s, %11zu, %11zu, %11zu, %11zu\n", entry->time_step, entry->action, entry->ptr, entry->ptr2, nbytes, memory_location, memory_location2, hypre_basename(entry->filename), entry->line, entry->function, curr_bytes[hypre_MEMORY_HOST], curr_bytes[hypre_MEMORY_HOST_PINNED], curr_bytes[hypre_MEMORY_DEVICE], curr_bytes[hypre_MEMORY_UNIFIED] ); } } hypre_assert(total_num_events == total_num_events_2); if (do_print) { fprintf(file, "\n\"==== Total Allocation (byte):\"\n"); fprintf(file, " %6s, %9s, %16s, %16s, %10s, %10s, %10s, %28s, %8s, %54s, %11s, %11s, %11s, %11s\n", "", "", "", "", "", "", "", "", "", "", "HOST", "PINNED", "DEVICE", "UNIFIED"); fprintf(file, " %6s, %9s, %16s, %16s, %10s, %10s, %10s, %28s, %8s, %54s, %11zu, %11zu, %11zu, %11zu\n", "", "", "", "", "", "", "", "", "", "", totl_bytes[hypre_MEMORY_HOST], totl_bytes[hypre_MEMORY_HOST_PINNED], totl_bytes[hypre_MEMORY_DEVICE], totl_bytes[hypre_MEMORY_UNIFIED]); fprintf(file, "\n\"==== Peak Allocation (byte):\"\n"); /*fprintf(file, " %6s, %9s, %16s, %16s, %10s, %10s, %10s, %28s, %8s, %54s, %11s, %11s, %11s, %11s\n", "", "", "", "", "", "", "", "", "", "", "HOST", "PINNED", "DEVICE", "UNIFIED"); */ fprintf(file, " %6s, %9s, %16s, %16s, %10s, %10s, %10s, %28s, %8s, %54s, %11zu, %11zu, %11zu, %11zu\n", "", "", "", "", "", "", "", "", "", "", peak_bytes[hypre_MEMORY_HOST], peak_bytes[hypre_MEMORY_HOST_PINNED], peak_bytes[hypre_MEMORY_DEVICE], peak_bytes[hypre_MEMORY_UNIFIED]); fprintf(file, "\n\"==== Reachable Allocation (byte):\"\n"); /* fprintf(file, " %6s, %9s, %16s, %16s, %10s, %10s, %10s, %28s, %8s, %54s, %11s, %11s, %11s, %11s\n", "", "", "", "", "", "", "", "", "", "", "HOST", "PINNED", "DEVICE", "UNIFIED"); */ fprintf(file, " %6s, %9s, %16s, %16s, %10s, %10s, %10s, %28s, %8s, %54s, %11zu, %11zu, %11zu, %11zu\n", "", "", "", "", "", "", "", "", "", "", curr_bytes[hypre_MEMORY_HOST], curr_bytes[hypre_MEMORY_HOST_PINNED], curr_bytes[hypre_MEMORY_DEVICE], curr_bytes[hypre_MEMORY_UNIFIED]); fprintf(file, "\n\"==== Memory Copy (byte):\"\n"); fprintf(file, " %6s, %9s, %16s, %16s, %10s, %10s, %10s, %28s, %8s, %54s, %11s, %11s, %11s, %11s\n", "", "", "", "", "", "", "", "", "", "", "H2H", "D2H", "H2D", "D2D"); fprintf(file, " %6s, %9s, %16s, %16s, %10s, %10s, %10s, %28s, %8s, %54s, %11zu, %11zu, %11zu, %11zu\n", "", "", "", "", "", "", "", "", "", "", copy_bytes[hypre_MEMCPY_H2H], copy_bytes[hypre_MEMCPY_D2H], copy_bytes[hypre_MEMCPY_H2D], copy_bytes[hypre_MEMCPY_D2D]); } if (totl_bytes_o) { totl_bytes_o[hypre_MEMORY_HOST] = totl_bytes[hypre_MEMORY_HOST]; totl_bytes_o[hypre_MEMORY_HOST_PINNED] = totl_bytes[hypre_MEMORY_HOST_PINNED]; totl_bytes_o[hypre_MEMORY_DEVICE] = totl_bytes[hypre_MEMORY_DEVICE]; totl_bytes_o[hypre_MEMORY_UNIFIED] = totl_bytes[hypre_MEMORY_UNIFIED]; } if (peak_bytes_o) { peak_bytes_o[hypre_MEMORY_HOST] = peak_bytes[hypre_MEMORY_HOST]; peak_bytes_o[hypre_MEMORY_HOST_PINNED] = peak_bytes[hypre_MEMORY_HOST_PINNED]; peak_bytes_o[hypre_MEMORY_DEVICE] = peak_bytes[hypre_MEMORY_DEVICE]; peak_bytes_o[hypre_MEMORY_UNIFIED] = peak_bytes[hypre_MEMORY_UNIFIED]; } if (curr_bytes_o) { curr_bytes_o[hypre_MEMORY_HOST] = curr_bytes[hypre_MEMORY_HOST]; curr_bytes_o[hypre_MEMORY_HOST_PINNED] = curr_bytes[hypre_MEMORY_HOST_PINNED]; curr_bytes_o[hypre_MEMORY_DEVICE] = curr_bytes[hypre_MEMORY_DEVICE]; curr_bytes_o[hypre_MEMORY_UNIFIED] = curr_bytes[hypre_MEMORY_UNIFIED]; } #if defined(HYPRE_DEBUG) for (i = HYPRE_MEMORY_EVENT_ALLOC; i < HYPRE_MEMORY_NUM_EVENTS; i++) { hypre_assert(qq[i].head == qq[i].actual_size); } #endif if (leakcheck && do_print) { fprintf(file, "\n\"==== Warnings:\"\n"); for (j = 0; j < qa->actual_size; j++) { hypre_MemoryTrackerEntry *entry = &qa->data[j]; if (entry->pair == (size_t) -1) { fprintf(file, " %6zu, %9s, %16p, %16s, %10s, %10s, %10s, %28s, %8s, %54s, %11s, %11s, %11s, %11s\n", entry->time_step, entry->action, entry->ptr, "", "", "", "", "", "", "Not freed", "", "", "", ""); } else { hypre_assert(entry->pair < qf->actual_size); hypre_assert(qf->data[entry->pair].ptr == entry->ptr); hypre_assert(qf->data[entry->pair].nbytes == entry->nbytes); hypre_assert(qf->data[entry->pair].memory_location == entry->memory_location); hypre_assert(qf->data[entry->pair].pair == j); } } for (j = 0; j < qf->actual_size; j++) { hypre_MemoryTrackerEntry *entry = &qf->data[j]; if (entry->pair == (size_t) -1) { fprintf(file, " %6zu, %9s, %16p, %16s, %10s, %10s, %10s, %28s, %8s, %54s, %11s, %11s, %11s, %11s\n", entry->time_step, entry->action, entry->ptr, "", "", "", "", "", "", "Unpaired free", "", "", "", ""); } else { hypre_assert(entry->pair < qa->actual_size); hypre_assert(qa->data[entry->pair].ptr == entry->ptr); hypre_assert(qa->data[entry->pair].nbytes == entry->nbytes); hypre_assert(qa->data[entry->pair].memory_location == entry->memory_location); hypre_assert(qa->data[entry->pair].pair == j); } } } if (file) { fclose(file); } if (leakcheck) { hypre_MemoryLocation t; for (t = hypre_MEMORY_HOST; t <= hypre_MEMORY_UNIFIED; t++) { if (curr_bytes[t]) { char memory_location[256]; hypre_GetMemoryLocationName(t, memory_location); fprintf(stderr, "%zu bytes of %s memory may not be freed\n", curr_bytes[t], memory_location); } } /* for (t = hypre_MEMORY_HOST; t <= hypre_MEMORY_UNIFIED; t++) { hypre_assert(curr_bytes[t] == 0); } */ } //HYPRE_Real t1 = hypre_MPI_Wtime() - t0; //printf("Tracker Print Time %.2f\n", t1); return hypre_error_flag; } #endif hypre-2.33.0/src/utilities/memory_tracker.h000066400000000000000000000254471477326011500207460ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #ifndef hypre_MEMORY_TRACKER_HEADER #define hypre_MEMORY_TRACKER_HEADER #if defined(HYPRE_USING_MEMORY_TRACKER) extern size_t hypre_total_bytes[hypre_MEMORY_UNIFIED + 1]; extern size_t hypre_peak_bytes[hypre_MEMORY_UNIFIED + 1]; extern size_t hypre_current_bytes[hypre_MEMORY_UNIFIED + 1]; extern HYPRE_Int hypre_memory_tracker_print; extern char hypre_memory_tracker_filename[HYPRE_MAX_FILE_NAME_LEN]; typedef enum _hypre_MemoryTrackerEvent { HYPRE_MEMORY_EVENT_ALLOC = 0, HYPRE_MEMORY_EVENT_FREE, HYPRE_MEMORY_EVENT_COPY, HYPRE_MEMORY_NUM_EVENTS, } hypre_MemoryTrackerEvent; typedef enum _hypre_MemcpyType { hypre_MEMCPY_H2H = 0, hypre_MEMCPY_D2H, hypre_MEMCPY_H2D, hypre_MEMCPY_D2D, hypre_MEMCPY_NUM_TYPES, } hypre_MemcpyType; typedef struct { size_t index; size_t time_step; char action[16]; void *ptr; void *ptr2; size_t nbytes; hypre_MemoryLocation memory_location; hypre_MemoryLocation memory_location2; char filename[HYPRE_MAX_FILE_NAME_LEN]; char function[256]; HYPRE_Int line; size_t pair; } hypre_MemoryTrackerEntry; typedef struct { size_t head; size_t actual_size; size_t alloced_size; hypre_MemoryTrackerEntry *data; /* Free Queue is sorted based on (ptr, time_step) ascendingly */ hypre_MemoryTrackerEntry *sorted_data; /* compressed sorted_data with the same ptr */ size_t sorted_data_compressed_len; size_t *sorted_data_compressed_offset; hypre_MemoryTrackerEntry **sorted_data_compressed; } hypre_MemoryTrackerQueue; typedef struct { size_t curr_time_step; hypre_MemoryTrackerQueue queue[HYPRE_MEMORY_NUM_EVENTS]; } hypre_MemoryTracker; extern hypre_MemoryTracker *_hypre_memory_tracker; #define hypre_TAlloc(type, count, location) \ ( \ { \ void *ptr = hypre_MAlloc((size_t)(sizeof(type) * (count)), location); \ \ hypre_MemoryLocation alocation = hypre_GetActualMemLocation(location); \ hypre_MemoryTrackerInsert1("malloc", ptr, sizeof(type)*(count), alocation, \ __FILE__, __func__, __LINE__); \ (type *) ptr; \ } \ ) #define hypre_CTAlloc(type, count, location) \ ( \ { \ void *ptr = hypre_CAlloc((size_t)(count), (size_t)sizeof(type), location); \ \ hypre_MemoryLocation alocation = hypre_GetActualMemLocation(location); \ hypre_MemoryTrackerInsert1("calloc", ptr, sizeof(type)*(count), alocation, \ __FILE__, __func__, __LINE__); \ (type *) ptr; \ } \ ) #define hypre_TReAlloc(ptr, type, count, location) \ ( \ { \ void *new_ptr = hypre_ReAlloc((char *)ptr, (size_t)(sizeof(type) * (count)), location); \ \ hypre_MemoryLocation alocation = hypre_GetActualMemLocation(location); \ hypre_MemoryTrackerInsert1("rfree", ptr, (size_t) -1, alocation, \ __FILE__, __func__, __LINE__); \ hypre_MemoryTrackerInsert1("rmalloc", new_ptr, sizeof(type)*(count), alocation, \ __FILE__, __func__, __LINE__); \ (type *) new_ptr; \ } \ ) #define hypre_TReAlloc_v2(ptr, old_type, old_count, new_type, new_count, location) \ ( \ { \ void *new_ptr = hypre_ReAlloc_v2((char *)ptr, (size_t)(sizeof(old_type)*(old_count)), \ (size_t)(sizeof(new_type)*(new_count)), location); \ \ hypre_MemoryLocation alocation = hypre_GetActualMemLocation(location); \ hypre_MemoryTrackerInsert1("rfree", ptr, sizeof(old_type)*(old_count), alocation, \ __FILE__, __func__, __LINE__); \ hypre_MemoryTrackerInsert1("rmalloc", new_ptr, sizeof(new_type)*(new_count), alocation, \ __FILE__, __func__, __LINE__); \ (new_type *) new_ptr; \ } \ ) #define hypre_TMemcpy(dst, src, type, count, locdst, locsrc) \ ( \ { \ hypre_Memcpy((void *)(dst), (void *)(src), (size_t)(sizeof(type) * (count)), locdst, locsrc); \ \ hypre_MemoryLocation alocation_dst = hypre_GetActualMemLocation(locdst); \ hypre_MemoryLocation alocation_src = hypre_GetActualMemLocation(locsrc); \ hypre_MemoryTrackerInsert2("memcpy", (void *) (dst), (void *) (src), sizeof(type)*(count), \ alocation_dst, alocation_src, \ __FILE__, __func__, __LINE__); \ } \ ) #define hypre_TFree(ptr, location) \ ( \ { \ hypre_Free((void *)ptr, location); \ \ hypre_MemoryLocation alocation = hypre_GetActualMemLocation(location); \ hypre_MemoryTrackerInsert1("free", ptr, (size_t) -1, alocation, \ __FILE__, __func__, __LINE__); \ ptr = NULL; \ } \ ) #define _hypre_TAlloc(type, count, location) \ ( \ { \ void *ptr = _hypre_MAlloc((size_t)(sizeof(type) * (count)), location); \ \ hypre_MemoryTrackerInsert1("malloc", ptr, sizeof(type)*(count), location, \ __FILE__, __func__, __LINE__); \ (type *) ptr; \ } \ ) #define _hypre_TFree(ptr, location) \ ( \ { \ _hypre_Free((void *)ptr, location); \ \ hypre_MemoryTrackerInsert1("free", ptr, (size_t) -1, location, \ __FILE__, __func__, __LINE__); \ ptr = NULL; \ } \ ) #endif /* #if defined(HYPRE_USING_MEMORY_TRACKER) */ #endif /* #ifndef hypre_MEMORY_TRACKER_HEADER */ hypre-2.33.0/src/utilities/merge_sort.c000066400000000000000000000622241477326011500200560ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "_hypre_utilities.h" #include "../seq_mv/HYPRE_seq_mv.h" //#define DBG_MERGE_SORT #ifdef DBG_MERGE_SORT #include #include #endif #define SWAP(T, a, b) do { T tmp = a; a = b; b = tmp; } while (0) /*-------------------------------------------------------------------------- * hypre_IntArrayMergeOrdered: merge two ordered arrays *--------------------------------------------------------------------------*/ HYPRE_Int hypre_IntArrayMergeOrdered( hypre_IntArray *array1, hypre_IntArray *array2, hypre_IntArray *array3 ) { HYPRE_Int i = 0, j = 0, k = 0; const HYPRE_Int size1 = hypre_IntArraySize(array1); const HYPRE_Int size2 = hypre_IntArraySize(array2); HYPRE_MemoryLocation memory_location = hypre_IntArrayMemoryLocation(array3); HYPRE_Int *array1_data = hypre_IntArrayData(array1); HYPRE_Int *array2_data = hypre_IntArrayData(array2); HYPRE_Int *array3_data = hypre_TAlloc(HYPRE_Int, size1 + size2, memory_location); while (i < size1 && j < size2) { if (array1_data[i] > array2_data[j]) { array3_data[k++] = array2_data[j++]; } else if (array1_data[i] < array2_data[j]) { array3_data[k++] = array1_data[i++]; } else { array3_data[k++] = array1_data[i++]; j++; } } while (i < size1) { array3_data[k++] = array1_data[i++]; } while (j < size2) { array3_data[k++] = array2_data[j++]; } array3_data = hypre_TReAlloc_v2(array3_data, HYPRE_Int, size1 + size2, HYPRE_Int, k, memory_location); hypre_IntArraySize(array3) = k; hypre_IntArrayData(array3) = array3_data; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_union2 * * Union of two sorted (in ascending order) array arr1 and arr2 into arr3 * * Assumptions: * 1) no duplicate entries in arr1 and arr2. But an entry is * allowed to appear in both arr1 and arr2 * 2) arr3 should have enough space on entry * 3) map1 and map2 map arr1 and arr2 to arr3 *--------------------------------------------------------------------------*/ void hypre_union2( HYPRE_Int n1, HYPRE_BigInt *arr1, HYPRE_Int n2, HYPRE_BigInt *arr2, HYPRE_Int *n3, HYPRE_BigInt *arr3, HYPRE_Int *map1, HYPRE_Int *map2 ) { HYPRE_Int i = 0, j = 0, k = 0; while (i < n1 && j < n2) { if (arr1[i] < arr2[j]) { if (map1) { map1[i] = k; } arr3[k++] = arr1[i++]; } else if (arr1[i] > arr2[j]) { if (map2) { map2[j] = k; } arr3[k++] = arr2[j++]; } else /* == */ { if (map1) { map1[i] = k; } if (map2) { map2[j] = k; } arr3[k++] = arr1[i++]; j++; } } while (i < n1) { if (map1) { map1[i] = k; } arr3[k++] = arr1[i++]; } while (j < n2) { if (map2) { map2[j] = k; } arr3[k++] = arr2[j++]; } *n3 = k; } /*-------------------------------------------------------------------------- * hypre_merge *--------------------------------------------------------------------------*/ static void hypre_merge( HYPRE_Int *first1, HYPRE_Int *last1, HYPRE_Int *first2, HYPRE_Int *last2, HYPRE_Int *out ) { for ( ; first1 != last1; ++out) { if (first2 == last2) { for ( ; first1 != last1; ++first1, ++out) { *out = *first1; } return; } if (*first2 < *first1) { *out = *first2; ++first2; } else { *out = *first1; ++first1; } } for ( ; first2 != last2; ++first2, ++out) { *out = *first2; } } /*-------------------------------------------------------------------------- * hypre_big_merge *--------------------------------------------------------------------------*/ static void hypre_big_merge( HYPRE_BigInt *first1, HYPRE_BigInt *last1, HYPRE_BigInt *first2, HYPRE_BigInt *last2, HYPRE_BigInt *out ) { for ( ; first1 != last1; ++out) { if (first2 == last2) { for ( ; first1 != last1; ++first1, ++out) { *out = *first1; } return; } if (*first2 < *first1) { *out = *first2; ++first2; } else { *out = *first1; ++first1; } } for ( ; first2 != last2; ++first2, ++out) { *out = *first2; } } /*-------------------------------------------------------------------------- * kth_element_ *--------------------------------------------------------------------------*/ static void kth_element_( HYPRE_Int *out1, HYPRE_Int *out2, HYPRE_Int *a1, HYPRE_Int *a2, HYPRE_Int left, HYPRE_Int right, HYPRE_Int n1, HYPRE_Int n2, HYPRE_Int k) { while (1) { HYPRE_Int i = (left + right) / 2; // right < k -> i < k HYPRE_Int j = k - i - 1; #ifdef DBG_MERGE_SORT hypre_assert(left <= right && right <= k); hypre_assert(i < k); // i == k implies left == right == k that can never happen hypre_assert(j >= 0 && j < n2); #endif if ((j == -1 || a1[i] >= a2[j]) && (j == n2 - 1 || a1[i] <= a2[j + 1])) { *out1 = i; *out2 = j + 1; return; } else if (j >= 0 && a2[j] >= a1[i] && (i == n1 - 1 || a2[j] <= a1[i + 1])) { *out1 = i + 1; *out2 = j; return; } else if (a1[i] > a2[j] && j != n2 - 1 && a1[i] > a2[j + 1]) { // search in left half of a1 right = i - 1; } else { // search in right half of a1 left = i + 1; } } } /** * Partition the input so that * a1[0:*out1) and a2[0:*out2) contain the smallest k elements */ /*-------------------------------------------------------------------------- * kth_element * * Partition the input so that * a1[0:*out1) and a2[0:*out2) contain the smallest k elements *--------------------------------------------------------------------------*/ static void kth_element( HYPRE_Int *out1, HYPRE_Int *out2, HYPRE_Int *a1, HYPRE_Int *a2, HYPRE_Int n1, HYPRE_Int n2, HYPRE_Int k) { // either of the inputs is empty if (n1 == 0) { *out1 = 0; *out2 = k; return; } if (n2 == 0) { *out1 = k; *out2 = 0; return; } if (k >= n1 + n2) { *out1 = n1; *out2 = n2; return; } // one is greater than the other if (k < n1 && a1[k] <= a2[0]) { *out1 = k; *out2 = 0; return; } if (k - n1 >= 0 && a2[k - n1] >= a1[n1 - 1]) { *out1 = n1; *out2 = k - n1; return; } if (k < n2 && a2[k] <= a1[0]) { *out1 = 0; *out2 = k; return; } if (k - n2 >= 0 && a1[k - n2] >= a2[n2 - 1]) { *out1 = k - n2; *out2 = n2; return; } // now k > 0 // faster to do binary search on the shorter sequence if (n1 > n2) { SWAP(HYPRE_Int, n1, n2); SWAP(HYPRE_Int *, a1, a2); SWAP(HYPRE_Int *, out1, out2); } if (k < (n1 + n2) / 2) { kth_element_(out1, out2, a1, a2, 0, hypre_min(n1 - 1, k), n1, n2, k); } else { // when k is big, faster to find (n1 + n2 - k)th biggest element HYPRE_Int offset1 = hypre_max(k - n2, 0), offset2 = hypre_max(k - n1, 0); HYPRE_Int new_k = k - offset1 - offset2; HYPRE_Int new_n1 = hypre_min(n1 - offset1, new_k + 1); HYPRE_Int new_n2 = hypre_min(n2 - offset2, new_k + 1); kth_element_(out1, out2, a1 + offset1, a2 + offset2, 0, new_n1 - 1, new_n1, new_n2, new_k); *out1 += offset1; *out2 += offset2; } #ifdef DBG_MERGE_SORT hypre_assert(*out1 + *out2 == k); #endif } /*-------------------------------------------------------------------------- * big_kth_element_ *--------------------------------------------------------------------------*/ static void big_kth_element_( HYPRE_Int *out1, HYPRE_Int *out2, HYPRE_BigInt *a1, HYPRE_BigInt *a2, HYPRE_Int left, HYPRE_Int right, HYPRE_Int n1, HYPRE_Int n2, HYPRE_Int k) { while (1) { HYPRE_Int i = (left + right) / 2; // right < k -> i < k HYPRE_Int j = k - i - 1; #ifdef DBG_MERGE_SORT hypre_assert(left <= right && right <= k); hypre_assert(i < k); // i == k implies left == right == k that can never happen hypre_assert(j >= 0 && j < n2); #endif if ((j == -1 || a1[i] >= a2[j]) && (j == n2 - 1 || a1[i] <= a2[j + 1])) { *out1 = i; *out2 = j + 1; return; } else if (j >= 0 && a2[j] >= a1[i] && (i == n1 - 1 || a2[j] <= a1[i + 1])) { *out1 = i + 1; *out2 = j; return; } else if (a1[i] > a2[j] && j != n2 - 1 && a1[i] > a2[j + 1]) { // search in left half of a1 right = i - 1; } else { // search in right half of a1 left = i + 1; } } } /*-------------------------------------------------------------------------- * big_kth_element * * Partition the input so that * a1[0:*out1) and a2[0:*out2) contain the smallest k elements *--------------------------------------------------------------------------*/ static void big_kth_element( HYPRE_Int *out1, HYPRE_Int *out2, HYPRE_BigInt *a1, HYPRE_BigInt *a2, HYPRE_Int n1, HYPRE_Int n2, HYPRE_Int k) { // either of the inputs is empty if (n1 == 0) { *out1 = 0; *out2 = k; return; } if (n2 == 0) { *out1 = k; *out2 = 0; return; } if (k >= n1 + n2) { *out1 = n1; *out2 = n2; return; } // one is greater than the other if (k < n1 && a1[k] <= a2[0]) { *out1 = k; *out2 = 0; return; } if (k - n1 >= 0 && a2[k - n1] >= a1[n1 - 1]) { *out1 = n1; *out2 = k - n1; return; } if (k < n2 && a2[k] <= a1[0]) { *out1 = 0; *out2 = k; return; } if (k - n2 >= 0 && a1[k - n2] >= a2[n2 - 1]) { *out1 = k - n2; *out2 = n2; return; } // now k > 0 // faster to do binary search on the shorter sequence if (n1 > n2) { SWAP(HYPRE_Int, n1, n2); SWAP(HYPRE_BigInt *, a1, a2); SWAP(HYPRE_Int *, out1, out2); } if (k < (n1 + n2) / 2) { big_kth_element_(out1, out2, a1, a2, 0, hypre_min(n1 - 1, k), n1, n2, k); } else { // when k is big, faster to find (n1 + n2 - k)th biggest element HYPRE_Int offset1 = hypre_max(k - n2, 0), offset2 = hypre_max(k - n1, 0); HYPRE_Int new_k = k - offset1 - offset2; HYPRE_Int new_n1 = hypre_min(n1 - offset1, new_k + 1); HYPRE_Int new_n2 = hypre_min(n2 - offset2, new_k + 1); big_kth_element_(out1, out2, a1 + (HYPRE_BigInt)offset1, a2 + (HYPRE_BigInt)offset2, 0, new_n1 - 1, new_n1, new_n2, new_k); *out1 += offset1; *out2 += offset2; } #ifdef DBG_MERGE_SORT hypre_assert(*out1 + *out2 == k); #endif } /*-------------------------------------------------------------------------- * hypre_parallel_merge * * @param num_threads number of threads that participate in this merge * @param my_thread_num thread id (zer0-based) among the threads that * participate in this merge *--------------------------------------------------------------------------*/ static void hypre_parallel_merge( HYPRE_Int *first1, HYPRE_Int *last1, HYPRE_Int *first2, HYPRE_Int *last2, HYPRE_Int *out, HYPRE_Int num_threads, HYPRE_Int my_thread_num ) { HYPRE_Int n1 = last1 - first1; HYPRE_Int n2 = last2 - first2; HYPRE_Int n = n1 + n2; HYPRE_Int n_per_thread = (n + num_threads - 1) / num_threads; HYPRE_Int begin_rank = hypre_min(n_per_thread * my_thread_num, n); HYPRE_Int end_rank = hypre_min(begin_rank + n_per_thread, n); #ifdef DBG_MERGE_SORT hypre_assert(std::is_sorted(first1, last1)); hypre_assert(std::is_sorted(first2, last2)); #endif HYPRE_Int begin1, begin2, end1, end2; kth_element(&begin1, &begin2, first1, first2, n1, n2, begin_rank); kth_element(&end1, &end2, first1, first2, n1, n2, end_rank); while (begin1 > end1 && begin1 > 0 && begin2 < n2 && first1[begin1 - 1] == first2[begin2]) { #ifdef DBG_MERGE_SORT printf("%s:%d\n", __FILE__, __LINE__); #endif begin1--; begin2++; } while (begin2 > end2 && end1 > 0 && end2 < n2 && first1[end1 - 1] == first2[end2]) { #ifdef DBG_MERGE_SORT printf("%s:%d\n", __FILE__, __LINE__); #endif end1--; end2++; } #ifdef DBG_MERGE_SORT hypre_assert(begin1 <= end1); hypre_assert(begin2 <= end2); #endif hypre_merge( first1 + begin1, first1 + end1, first2 + begin2, first2 + end2, out + begin1 + begin2); #ifdef DBG_MERGE_SORT hypre_assert(std::is_sorted(out + begin1 + begin2, out + end1 + end2)); #endif } /*-------------------------------------------------------------------------- * hypre_big_parallel_merge * * @param num_threads number of threads that participate in this merge * @param my_thread_num thread id (zero-based) among the threads that * participate in this merge *--------------------------------------------------------------------------*/ static void hypre_big_parallel_merge( HYPRE_BigInt *first1, HYPRE_BigInt *last1, HYPRE_BigInt *first2, HYPRE_BigInt *last2, HYPRE_BigInt *out, HYPRE_Int num_threads, HYPRE_Int my_thread_num) { HYPRE_Int n1 = (HYPRE_Int)(last1 - first1); HYPRE_Int n2 = (HYPRE_Int)(last2 - first2); HYPRE_Int n = n1 + n2; HYPRE_Int n_per_thread = (n + num_threads - 1) / num_threads; HYPRE_Int begin_rank = hypre_min(n_per_thread * my_thread_num, n); HYPRE_Int end_rank = hypre_min(begin_rank + n_per_thread, n); #ifdef DBG_MERGE_SORT hypre_assert(std::is_sorted(first1, last1)); hypre_assert(std::is_sorted(first2, last2)); #endif HYPRE_Int begin1, begin2, end1, end2; big_kth_element(&begin1, &begin2, first1, first2, n1, n2, begin_rank); big_kth_element(&end1, &end2, first1, first2, n1, n2, end_rank); while (begin1 > end1 && begin1 > 0 && begin2 < n2 && first1[begin1 - 1] == first2[begin2]) { #ifdef DBG_MERGE_SORT printf("%s:%d\n", __FILE__, __LINE__); #endif begin1--; begin2++; } while (begin2 > end2 && end1 > 0 && end2 < n2 && first1[end1 - 1] == first2[end2]) { #ifdef DBG_MERGE_SORT printf("%s:%d\n", __FILE__, __LINE__); #endif end1--; end2++; } #ifdef DBG_MERGE_SORT hypre_assert(begin1 <= end1); hypre_assert(begin2 <= end2); #endif hypre_big_merge( first1 + (HYPRE_BigInt)begin1, first1 + (HYPRE_BigInt)end1, first2 + (HYPRE_BigInt)begin2, first2 + (HYPRE_BigInt)end2, out + (HYPRE_BigInt)(begin1 + begin2)); #ifdef DBG_MERGE_SORT hypre_assert(std::is_sorted(out + begin1 + begin2, out + end1 + end2)); #endif } /*-------------------------------------------------------------------------- * hypre_merge_sort *--------------------------------------------------------------------------*/ void hypre_merge_sort( HYPRE_Int *in, HYPRE_Int *temp, HYPRE_Int len, HYPRE_Int **out ) { if (0 == len) { return; } #ifdef HYPRE_PROFILE hypre_profile_times[HYPRE_TIMER_ID_MERGE] -= hypre_MPI_Wtime(); #endif #ifdef DBG_MERGE_SORT HYPRE_Int *dbg_buf = new HYPRE_Int[len]; std::copy(in, in + len, dbg_buf); std::sort(dbg_buf, dbg_buf + len); #endif // HYPRE_Int thread_private_len[hypre_NumThreads()]; // HYPRE_Int out_len = 0; #ifdef HYPRE_USING_OPENMP #pragma omp parallel #endif { HYPRE_Int num_threads = hypre_NumActiveThreads(); HYPRE_Int my_thread_num = hypre_GetThreadNum(); // thread-private sort HYPRE_Int i_per_thread = (len + num_threads - 1) / num_threads; HYPRE_Int i_begin = hypre_min(i_per_thread * my_thread_num, len); HYPRE_Int i_end = hypre_min(i_begin + i_per_thread, len); hypre_qsort0(in, i_begin, i_end - 1); // merge sorted sequences HYPRE_Int in_group_size; HYPRE_Int *in_buf = in; HYPRE_Int *out_buf = temp; for (in_group_size = 1; in_group_size < num_threads; in_group_size *= 2) { #ifdef HYPRE_USING_OPENMP #pragma omp barrier #endif // merge 2 in-groups into 1 out-group HYPRE_Int out_group_size = in_group_size * 2; HYPRE_Int group_leader = my_thread_num / out_group_size * out_group_size; // HYPRE_Int group_sub_leader = hypre_min(group_leader + in_group_size, num_threads - 1); HYPRE_Int id_in_group = my_thread_num % out_group_size; HYPRE_Int num_threads_in_group = hypre_min(group_leader + out_group_size, num_threads) - group_leader; HYPRE_Int in_group1_begin = hypre_min(i_per_thread * group_leader, len); HYPRE_Int in_group1_end = hypre_min(in_group1_begin + i_per_thread * in_group_size, len); HYPRE_Int in_group2_begin = hypre_min(in_group1_begin + i_per_thread * in_group_size, len); HYPRE_Int in_group2_end = hypre_min(in_group2_begin + i_per_thread * in_group_size, len); hypre_parallel_merge( in_buf + in_group1_begin, in_buf + in_group1_end, in_buf + in_group2_begin, in_buf + in_group2_end, out_buf + in_group1_begin, num_threads_in_group, id_in_group); HYPRE_Int *temp = in_buf; in_buf = out_buf; out_buf = temp; } *out = in_buf; } /* omp parallel */ #ifdef DBG_MERGE_SORT hypre_assert(std::equal(*out, *out + len, dbg_buf)); delete[] dbg_buf; #endif #ifdef HYPRE_PROFILE hypre_profile_times[HYPRE_TIMER_ID_MERGE] += hypre_MPI_Wtime(); #endif } #if defined(HYPRE_USING_HOPSCOTCH) /*-------------------------------------------------------------------------- * hypre_sort_and_create_inverse_map * * Sort array "in" with length len and put result in array "out" * "in" will be deallocated unless in == *out * inverse_map is an inverse hash table s.t. * inverse_map[i] = j iff (*out)[j] = i *--------------------------------------------------------------------------*/ void hypre_sort_and_create_inverse_map(HYPRE_Int *in, HYPRE_Int len, HYPRE_Int **out, hypre_UnorderedIntMap *inverse_map) { if (len == 0) { return; } #ifdef HYPRE_PROFILE hypre_profile_times[HYPRE_TIMER_ID_MERGE] -= hypre_MPI_Wtime(); #endif HYPRE_Int *temp = hypre_TAlloc(HYPRE_Int, len, HYPRE_MEMORY_HOST); hypre_merge_sort(in, temp, len, out); hypre_UnorderedIntMapCreate(inverse_map, 2 * len, 16 * hypre_NumThreads()); HYPRE_Int i; #ifdef HYPRE_CONCURRENT_HOPSCOTCH #pragma omp parallel for HYPRE_SMP_SCHEDULE #endif for (i = 0; i < len; i++) { HYPRE_Int old = hypre_UnorderedIntMapPutIfAbsent(inverse_map, (*out)[i], i); hypre_assert(old == HYPRE_HOPSCOTCH_HASH_EMPTY); #ifdef DBG_MERGE_SORT if (hypre_UnorderedIntMapGet(inverse_map, (*out)[i]) != i) { fprintf(stderr, "%d %d\n", i, (*out)[i]); hypre_assert(false); } #endif } #ifdef DBG_MERGE_SORT std::unordered_map inverse_map2(len); for (HYPRE_Int i = 0; i < len; ++i) { inverse_map2[(*out)[i]] = i; if (hypre_UnorderedIntMapGet(inverse_map, (*out)[i]) != i) { fprintf(stderr, "%d %d\n", i, (*out)[i]); hypre_assert(false); } } hypre_assert(hypre_UnorderedIntMapSize(inverse_map) == len); #endif if (*out == in) { hypre_TFree(temp, HYPRE_MEMORY_HOST); } else { hypre_TFree(in, HYPRE_MEMORY_HOST); } #ifdef HYPRE_PROFILE hypre_profile_times[HYPRE_TIMER_ID_MERGE] += hypre_MPI_Wtime(); #endif } #endif /* if defined(HYPRE_USING_HOPSCOTCH) */ /*-------------------------------------------------------------------------- * hypre_big_merge_sort *--------------------------------------------------------------------------*/ void hypre_big_merge_sort(HYPRE_BigInt *in, HYPRE_BigInt *temp, HYPRE_Int len, HYPRE_BigInt **out) { if (0 == len) { return; } #ifdef HYPRE_PROFILE hypre_profile_times[HYPRE_TIMER_ID_MERGE] -= hypre_MPI_Wtime(); #endif #ifdef DBG_MERGE_SORT HYPRE_Int *dbg_buf = new HYPRE_Int[len]; std::copy(in, in + len, dbg_buf); std::sort(dbg_buf, dbg_buf + len); #endif // HYPRE_Int thread_private_len[hypre_NumThreads()]; // HYPRE_Int out_len = 0; #ifdef HYPRE_USING_OPENMP #pragma omp parallel #endif { HYPRE_Int num_threads = hypre_NumActiveThreads(); HYPRE_Int my_thread_num = hypre_GetThreadNum(); // thread-private sort HYPRE_Int i_per_thread = (len + num_threads - 1) / num_threads; HYPRE_Int i_begin = hypre_min(i_per_thread * my_thread_num, len); HYPRE_Int i_end = hypre_min(i_begin + i_per_thread, len); hypre_BigQsort0(in, i_begin, i_end - 1); // merge sorted sequences HYPRE_Int in_group_size; HYPRE_BigInt *in_buf = in; HYPRE_BigInt *out_buf = temp; for (in_group_size = 1; in_group_size < num_threads; in_group_size *= 2) { #ifdef HYPRE_USING_OPENMP #pragma omp barrier #endif // merge 2 in-groups into 1 out-group HYPRE_Int out_group_size = in_group_size * 2; HYPRE_Int group_leader = my_thread_num / out_group_size * out_group_size; // HYPRE_Int group_sub_leader = hypre_min(group_leader + in_group_size, num_threads - 1); HYPRE_Int id_in_group = my_thread_num % out_group_size; HYPRE_Int num_threads_in_group = hypre_min(group_leader + out_group_size, num_threads) - group_leader; HYPRE_Int in_group1_begin = hypre_min(i_per_thread * group_leader, len); HYPRE_Int in_group1_end = hypre_min(in_group1_begin + i_per_thread * in_group_size, len); HYPRE_Int in_group2_begin = hypre_min(in_group1_begin + i_per_thread * in_group_size, len); HYPRE_Int in_group2_end = hypre_min(in_group2_begin + i_per_thread * in_group_size, len); hypre_big_parallel_merge( in_buf + (HYPRE_BigInt)in_group1_begin, in_buf + (HYPRE_BigInt)in_group1_end, in_buf + (HYPRE_BigInt)in_group2_begin, in_buf + (HYPRE_BigInt)in_group2_end, out_buf + (HYPRE_BigInt)in_group1_begin, num_threads_in_group, id_in_group); HYPRE_BigInt *temp = in_buf; in_buf = out_buf; out_buf = temp; } *out = in_buf; } /* omp parallel */ #ifdef DBG_MERGE_SORT hypre_assert(std::equal(*out, *out + len, dbg_buf)); delete[] dbg_buf; #endif #ifdef HYPRE_PROFILE hypre_profile_times[HYPRE_TIMER_ID_MERGE] += hypre_MPI_Wtime(); #endif } /*-------------------------------------------------------------------------- * hypre_big_sort_and_create_inverse_map *--------------------------------------------------------------------------*/ void hypre_big_sort_and_create_inverse_map(HYPRE_BigInt *in, HYPRE_Int len, HYPRE_BigInt **out, hypre_UnorderedBigIntMap *inverse_map) { if (len == 0) { return; } #ifdef HYPRE_PROFILE hypre_profile_times[HYPRE_TIMER_ID_MERGE] -= hypre_MPI_Wtime(); #endif HYPRE_BigInt *temp = hypre_TAlloc(HYPRE_BigInt, len, HYPRE_MEMORY_HOST); hypre_big_merge_sort(in, temp, len, out); hypre_UnorderedBigIntMapCreate(inverse_map, 2 * len, 16 * hypre_NumThreads()); HYPRE_Int i; #ifdef HYPRE_CONCURRENT_HOPSCOTCH #pragma omp parallel for HYPRE_SMP_SCHEDULE #endif for (i = 0; i < len; i++) { HYPRE_Int old = hypre_UnorderedBigIntMapPutIfAbsent(inverse_map, (*out)[i], i); hypre_assert(old == HYPRE_HOPSCOTCH_HASH_EMPTY); #ifdef DBG_MERGE_SORT if (hypre_UnorderedBigIntMapGet(inverse_map, (*out)[i]) != i) { fprintf(stderr, "%d %d\n", i, (*out)[i]); hypre_assert(false); } #endif } #ifdef DBG_MERGE_SORT std::unordered_map inverse_map2(len); for (HYPRE_Int i = 0; i < len; ++i) { inverse_map2[(*out)[i]] = i; if (hypre_UnorderedBigIntMapGet(inverse_map, (*out)[i]) != i) { fprintf(stderr, "%d %d\n", i, (*out)[i]); hypre_assert(false); } } hypre_assert(hypre_UnorderedBigIntMapSize(inverse_map) == len); #endif if (*out == in) { hypre_TFree(temp, HYPRE_MEMORY_HOST); } else { hypre_TFree(in, HYPRE_MEMORY_HOST); } #ifdef HYPRE_PROFILE hypre_profile_times[HYPRE_TIMER_ID_MERGE] += hypre_MPI_Wtime(); #endif } hypre-2.33.0/src/utilities/mmio.c000066400000000000000000000101701477326011500166420ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /* * Matrix Market I/O library for ANSI C * * See http://math.nist.gov/MatrixMarket for details. * * */ #include #include #include #include #include "_hypre_utilities.h" HYPRE_Int hypre_mm_is_valid(MM_typecode matcode) { if (!hypre_mm_is_matrix(matcode)) { return 0; } if (hypre_mm_is_dense(matcode) && hypre_mm_is_pattern(matcode)) { return 0; } if (hypre_mm_is_real(matcode) && hypre_mm_is_hermitian(matcode)) { return 0; } if (hypre_mm_is_pattern(matcode) && (hypre_mm_is_hermitian(matcode) || hypre_mm_is_skew(matcode))) { return 0; } return 1; } HYPRE_Int hypre_mm_read_banner(FILE *f, MM_typecode *matcode) { char line[MM_MAX_LINE_LENGTH]; char banner[MM_MAX_TOKEN_LENGTH]; char mtx[MM_MAX_TOKEN_LENGTH]; char crd[MM_MAX_TOKEN_LENGTH]; char data_type[MM_MAX_TOKEN_LENGTH]; char storage_scheme[MM_MAX_TOKEN_LENGTH]; char *p; hypre_mm_clear_typecode(matcode); if (fgets(line, MM_MAX_LINE_LENGTH, f) == NULL) { return MM_PREMATURE_EOF; } if (sscanf(line, "%s %s %s %s %s", banner, mtx, crd, data_type, storage_scheme) != 5) { return MM_PREMATURE_EOF; } for (p = mtx; *p != '\0'; *p = tolower(*p), p++); /* convert to lower case */ for (p = crd; *p != '\0'; *p = tolower(*p), p++); for (p = data_type; *p != '\0'; *p = tolower(*p), p++); for (p = storage_scheme; *p != '\0'; *p = tolower(*p), p++); /* check for banner */ if (strncmp(banner, MatrixMarketBanner, strlen(MatrixMarketBanner)) != 0) { return MM_NO_HEADER; } /* first field should be "mtx" */ if (strcmp(mtx, MM_MTX_STR) != 0) { return MM_UNSUPPORTED_TYPE; } hypre_mm_set_matrix(matcode); /* second field describes whether this is a sparse matrix (in coordinate storgae) or a dense array */ if (strcmp(crd, MM_SPARSE_STR) == 0) { hypre_mm_set_sparse(matcode); } else if (strcmp(crd, MM_DENSE_STR) == 0) { hypre_mm_set_dense(matcode); } else { return MM_UNSUPPORTED_TYPE; } /* third field */ if (strcmp(data_type, MM_REAL_STR) == 0) { hypre_mm_set_real(matcode); } else if (strcmp(data_type, MM_COMPLEX_STR) == 0) { hypre_mm_set_complex(matcode); } else if (strcmp(data_type, MM_PATTERN_STR) == 0) { hypre_mm_set_pattern(matcode); } else if (strcmp(data_type, MM_INT_STR) == 0) { hypre_mm_set_integer(matcode); } else { return MM_UNSUPPORTED_TYPE; } /* fourth field */ if (strcmp(storage_scheme, MM_GENERAL_STR) == 0) { hypre_mm_set_general(matcode); } else if (strcmp(storage_scheme, MM_SYMM_STR) == 0) { hypre_mm_set_symmetric(matcode); } else if (strcmp(storage_scheme, MM_HERM_STR) == 0) { hypre_mm_set_hermitian(matcode); } else if (strcmp(storage_scheme, MM_SKEW_STR) == 0) { hypre_mm_set_skew(matcode); } else { return MM_UNSUPPORTED_TYPE; } return 0; } HYPRE_Int hypre_mm_read_mtx_crd_size(FILE *f, HYPRE_Int *M, HYPRE_Int *N, HYPRE_Int *nz ) { char line[MM_MAX_LINE_LENGTH]; HYPRE_Int num_items_read; /* set return null parameter values, in case we exit with errors */ *M = *N = *nz = 0; /* now continue scanning until you reach the end-of-comments */ do { if (fgets(line, MM_MAX_LINE_LENGTH, f) == NULL) { return MM_PREMATURE_EOF; } } while (line[0] == '%'); /* line[] is either blank or has M,N, nz */ if (hypre_sscanf(line, "%d %d %d", M, N, nz) == 3) { return 0; } else { do { num_items_read = hypre_fscanf(f, "%d %d %d", M, N, nz); if (num_items_read == EOF) { return MM_PREMATURE_EOF; } } while (num_items_read != 3); } return 0; } hypre-2.33.0/src/utilities/mmio.h000066400000000000000000000100441477326011500166470ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /* * Matrix Market I/O library for ANSI C * * See http://math.nist.gov/MatrixMarket for details. * * */ #ifndef MM_IO_H #define MM_IO_H #define MM_MAX_LINE_LENGTH 1025 #define MatrixMarketBanner "%%MatrixMarket" #define MM_MAX_TOKEN_LENGTH 64 typedef char MM_typecode[4]; HYPRE_Int hypre_mm_is_valid(MM_typecode matcode); /* too complex for a macro */ HYPRE_Int hypre_mm_read_banner(FILE *f, MM_typecode *matcode); HYPRE_Int hypre_mm_read_mtx_crd_size(FILE *f, HYPRE_Int *M, HYPRE_Int *N, HYPRE_Int *nz); /********************* MM_typecode query fucntions ***************************/ #define hypre_mm_is_matrix(typecode) ((typecode)[0]=='M') #define hypre_mm_is_sparse(typecode) ((typecode)[1]=='C') #define hypre_mm_is_coordinate(typecode)((typecode)[1]=='C') #define hypre_mm_is_dense(typecode) ((typecode)[1]=='A') #define hypre_mm_is_array(typecode) ((typecode)[1]=='A') #define hypre_mm_is_complex(typecode) ((typecode)[2]=='C') #define hypre_mm_is_real(typecode) ((typecode)[2]=='R') #define hypre_mm_is_pattern(typecode) ((typecode)[2]=='P') #define hypre_mm_is_integer(typecode) ((typecode)[2]=='I') #define hypre_mm_is_symmetric(typecode)((typecode)[3]=='S') #define hypre_mm_is_general(typecode) ((typecode)[3]=='G') #define hypre_mm_is_skew(typecode) ((typecode)[3]=='K') #define hypre_mm_is_hermitian(typecode)((typecode)[3]=='H') /********************* MM_typecode modify fucntions ***************************/ #define hypre_mm_set_matrix(typecode) ((*typecode)[0]='M') #define hypre_mm_set_coordinate(typecode) ((*typecode)[1]='C') #define hypre_mm_set_array(typecode) ((*typecode)[1]='A') #define hypre_mm_set_dense(typecode) hypre_mm_set_array(typecode) #define hypre_mm_set_sparse(typecode) hypre_mm_set_coordinate(typecode) #define hypre_mm_set_complex(typecode)((*typecode)[2]='C') #define hypre_mm_set_real(typecode) ((*typecode)[2]='R') #define hypre_mm_set_pattern(typecode)((*typecode)[2]='P') #define hypre_mm_set_integer(typecode)((*typecode)[2]='I') #define hypre_mm_set_symmetric(typecode)((*typecode)[3]='S') #define hypre_mm_set_general(typecode) ((*typecode)[3]='G') #define hypre_mm_set_skew(typecode) ((*typecode)[3]='K') #define hypre_mm_set_hermitian(typecode)((*typecode)[3]='H') #define hypre_mm_clear_typecode(typecode) ((*typecode)[0]=(*typecode)[1]= \ (*typecode)[2]=' ',(*typecode)[3]='G') #define hypre_mm_initialize_typecode(typecode) hypre_mm_clear_typecode(typecode) /********************* Matrix Market error codes ***************************/ #define MM_COULD_NOT_READ_FILE 11 #define MM_PREMATURE_EOF 12 #define MM_NOT_MTX 13 #define MM_NO_HEADER 14 #define MM_UNSUPPORTED_TYPE 15 #define MM_LINE_TOO_LONG 16 #define MM_COULD_NOT_WRITE_FILE 17 /******************** Matrix Market internal definitions ******************** MM_matrix_typecode: 4-character sequence object sparse/data storage dense type scheme string position: [0] [1] [2] [3] Matrix typecode: M(atrix) C(oord) R(eal) G(eneral) A(array) C(omplex) H(ermitian) P(attern) S(ymmetric) I(nteger) K(kew) ***********************************************************************/ #define MM_MTX_STR "matrix" #define MM_ARRAY_STR "array" #define MM_DENSE_STR "array" #define MM_COORDINATE_STR "coordinate" #define MM_SPARSE_STR "coordinate" #define MM_COMPLEX_STR "complex" #define MM_REAL_STR "real" #define MM_INT_STR "integer" #define MM_GENERAL_STR "general" #define MM_SYMM_STR "symmetric" #define MM_HERM_STR "hermitian" #define MM_SKEW_STR "skew-symmetric" #define MM_PATTERN_STR "pattern" /* high level routines */ #endif hypre-2.33.0/src/utilities/mpi_comm_f2c.c000066400000000000000000000016261477326011500202410ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include #include "fortran.h" #ifndef HYPRE_SEQUENTIAL #include #endif /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ #if 0 /* This function is problematic and no longer needed anyway. */ void hypre_F90_IFACE(hypre_mpi_comm_f2c, HYPRE_MPI_COMM_F2C) (hypre_F90_Obj *c_comm, hypre_F90_Comm *f_comm, hypre_F90_Int *ierr) { *c_comm = (hypre_F90_Obj) hypre_MPI_Comm_f2c( (hypre_int) * f_comm ); *ierr = 0; } #endif hypre-2.33.0/src/utilities/mpistubs.c000066400000000000000000001267351477326011500175660ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "_hypre_utilities.h" /****************************************************************************** * This routine is the same in both the sequential and normal cases * * The 'comm' argument for MPI_Comm_f2c is MPI_Fint, which is always the size of * a Fortran integer and hence usually the size of hypre_int. ****************************************************************************/ hypre_MPI_Comm hypre_MPI_Comm_f2c( hypre_int comm ) { #ifdef HYPRE_HAVE_MPI_COMM_F2C return (hypre_MPI_Comm) MPI_Comm_f2c(comm); #else return (hypre_MPI_Comm) (size_t)comm; #endif } /****************************************************************************** * MPI stubs to generate serial codes without mpi *****************************************************************************/ #if defined(HYPRE_SEQUENTIAL) HYPRE_Int hypre_MPI_Init( hypre_int *argc, char ***argv ) { HYPRE_UNUSED_VAR(argc); HYPRE_UNUSED_VAR(argv); return (0); } HYPRE_Int hypre_MPI_Finalize( void ) { return (0); } HYPRE_Int hypre_MPI_Abort( hypre_MPI_Comm comm, HYPRE_Int errorcode ) { HYPRE_UNUSED_VAR(comm); HYPRE_UNUSED_VAR(errorcode); return (0); } HYPRE_Real hypre_MPI_Wtime( void ) { return (0.0); } HYPRE_Real hypre_MPI_Wtick( void ) { return (0.0); } HYPRE_Int hypre_MPI_Barrier( hypre_MPI_Comm comm ) { HYPRE_UNUSED_VAR(comm); return (0); } HYPRE_Int hypre_MPI_Comm_create( hypre_MPI_Comm comm, hypre_MPI_Group group, hypre_MPI_Comm *newcomm ) { HYPRE_UNUSED_VAR(comm); HYPRE_UNUSED_VAR(group); *newcomm = hypre_MPI_COMM_NULL; return (0); } HYPRE_Int hypre_MPI_Comm_dup( hypre_MPI_Comm comm, hypre_MPI_Comm *newcomm ) { *newcomm = comm; return (0); } HYPRE_Int hypre_MPI_Comm_size( hypre_MPI_Comm comm, HYPRE_Int *size ) { HYPRE_UNUSED_VAR(comm); *size = 1; return (0); } HYPRE_Int hypre_MPI_Comm_rank( hypre_MPI_Comm comm, HYPRE_Int *rank ) { HYPRE_UNUSED_VAR(comm); *rank = 0; return (0); } HYPRE_Int hypre_MPI_Comm_free( hypre_MPI_Comm *comm ) { HYPRE_UNUSED_VAR(comm); return 0; } HYPRE_Int hypre_MPI_Comm_group( hypre_MPI_Comm comm, hypre_MPI_Group *group ) { HYPRE_UNUSED_VAR(comm); HYPRE_UNUSED_VAR(group); return (0); } HYPRE_Int hypre_MPI_Comm_split( hypre_MPI_Comm comm, HYPRE_Int n, HYPRE_Int m, hypre_MPI_Comm *comms ) { HYPRE_UNUSED_VAR(comm); HYPRE_UNUSED_VAR(n); HYPRE_UNUSED_VAR(m); HYPRE_UNUSED_VAR(comms); return (0); } HYPRE_Int hypre_MPI_Group_incl( hypre_MPI_Group group, HYPRE_Int n, HYPRE_Int *ranks, hypre_MPI_Group *newgroup ) { HYPRE_UNUSED_VAR(group); HYPRE_UNUSED_VAR(n); HYPRE_UNUSED_VAR(ranks); HYPRE_UNUSED_VAR(newgroup); return (0); } HYPRE_Int hypre_MPI_Group_free( hypre_MPI_Group *group ) { HYPRE_UNUSED_VAR(group); return 0; } HYPRE_Int hypre_MPI_Address( void *location, hypre_MPI_Aint *address ) { HYPRE_UNUSED_VAR(location); HYPRE_UNUSED_VAR(address); return (0); } HYPRE_Int hypre_MPI_Get_count( hypre_MPI_Status *status, hypre_MPI_Datatype datatype, HYPRE_Int *count ) { HYPRE_UNUSED_VAR(status); HYPRE_UNUSED_VAR(datatype); HYPRE_UNUSED_VAR(count); return (0); } HYPRE_Int hypre_MPI_Alltoall( void *sendbuf, HYPRE_Int sendcount, hypre_MPI_Datatype sendtype, void *recvbuf, HYPRE_Int recvcount, hypre_MPI_Datatype recvtype, hypre_MPI_Comm comm ) { HYPRE_UNUSED_VAR(sendbuf); HYPRE_UNUSED_VAR(sendcount); HYPRE_UNUSED_VAR(sendtype); HYPRE_UNUSED_VAR(recvbuf); HYPRE_UNUSED_VAR(recvcount); HYPRE_UNUSED_VAR(recvtype); HYPRE_UNUSED_VAR(comm); return (0); } HYPRE_Int hypre_MPI_Allgather( void *sendbuf, HYPRE_Int sendcount, hypre_MPI_Datatype sendtype, void *recvbuf, HYPRE_Int recvcount, hypre_MPI_Datatype recvtype, hypre_MPI_Comm comm ) { HYPRE_Int i; HYPRE_UNUSED_VAR(comm); HYPRE_UNUSED_VAR(recvcount); HYPRE_UNUSED_VAR(recvtype); switch (sendtype) { case hypre_MPI_INT: { HYPRE_Int *crecvbuf = (HYPRE_Int *)recvbuf; HYPRE_Int *csendbuf = (HYPRE_Int *)sendbuf; for (i = 0; i < sendcount; i++) { crecvbuf[i] = csendbuf[i]; } } break; case hypre_MPI_LONG_LONG_INT: { HYPRE_BigInt *crecvbuf = (HYPRE_BigInt *)recvbuf; HYPRE_BigInt *csendbuf = (HYPRE_BigInt *)sendbuf; for (i = 0; i < sendcount; i++) { crecvbuf[i] = csendbuf[i]; } } break; case hypre_MPI_FLOAT: { float *crecvbuf = (float *)recvbuf; float *csendbuf = (float *)sendbuf; for (i = 0; i < sendcount; i++) { crecvbuf[i] = csendbuf[i]; } } break; case hypre_MPI_DOUBLE: { double *crecvbuf = (double *)recvbuf; double *csendbuf = (double *)sendbuf; for (i = 0; i < sendcount; i++) { crecvbuf[i] = csendbuf[i]; } } break; case hypre_MPI_LONG_DOUBLE: { long double *crecvbuf = (long double *)recvbuf; long double *csendbuf = (long double *)sendbuf; for (i = 0; i < sendcount; i++) { crecvbuf[i] = csendbuf[i]; } } break; case hypre_MPI_CHAR: { char *crecvbuf = (char *)recvbuf; char *csendbuf = (char *)sendbuf; for (i = 0; i < sendcount; i++) { crecvbuf[i] = csendbuf[i]; } } break; case hypre_MPI_LONG: { hypre_longint *crecvbuf = (hypre_longint *)recvbuf; hypre_longint *csendbuf = (hypre_longint *)sendbuf; for (i = 0; i < sendcount; i++) { crecvbuf[i] = csendbuf[i]; } } break; case hypre_MPI_BYTE: { hypre_TMemcpy(recvbuf, sendbuf, char, sendcount, HYPRE_MEMORY_HOST, HYPRE_MEMORY_HOST); } break; case hypre_MPI_REAL: { HYPRE_Real *crecvbuf = (HYPRE_Real *)recvbuf; HYPRE_Real *csendbuf = (HYPRE_Real *)sendbuf; for (i = 0; i < sendcount; i++) { crecvbuf[i] = csendbuf[i]; } } break; case hypre_MPI_COMPLEX: { HYPRE_Complex *crecvbuf = (HYPRE_Complex *)recvbuf; HYPRE_Complex *csendbuf = (HYPRE_Complex *)sendbuf; for (i = 0; i < sendcount; i++) { crecvbuf[i] = csendbuf[i]; } } break; } return (0); } HYPRE_Int hypre_MPI_Allgatherv( void *sendbuf, HYPRE_Int sendcount, hypre_MPI_Datatype sendtype, void *recvbuf, HYPRE_Int *recvcounts, HYPRE_Int *displs, hypre_MPI_Datatype recvtype, hypre_MPI_Comm comm ) { HYPRE_UNUSED_VAR(displs); return ( hypre_MPI_Allgather(sendbuf, sendcount, sendtype, recvbuf, *recvcounts, recvtype, comm) ); } HYPRE_Int hypre_MPI_Gather( void *sendbuf, HYPRE_Int sendcount, hypre_MPI_Datatype sendtype, void *recvbuf, HYPRE_Int recvcount, hypre_MPI_Datatype recvtype, HYPRE_Int root, hypre_MPI_Comm comm ) { HYPRE_UNUSED_VAR(root); return ( hypre_MPI_Allgather(sendbuf, sendcount, sendtype, recvbuf, recvcount, recvtype, comm) ); } HYPRE_Int hypre_MPI_Gatherv( void *sendbuf, HYPRE_Int sendcount, hypre_MPI_Datatype sendtype, void *recvbuf, HYPRE_Int *recvcounts, HYPRE_Int *displs, hypre_MPI_Datatype recvtype, HYPRE_Int root, hypre_MPI_Comm comm ) { HYPRE_UNUSED_VAR(displs); HYPRE_UNUSED_VAR(root); return ( hypre_MPI_Allgather(sendbuf, sendcount, sendtype, recvbuf, *recvcounts, recvtype, comm) ); } HYPRE_Int hypre_MPI_Scatter( void *sendbuf, HYPRE_Int sendcount, hypre_MPI_Datatype sendtype, void *recvbuf, HYPRE_Int recvcount, hypre_MPI_Datatype recvtype, HYPRE_Int root, hypre_MPI_Comm comm ) { HYPRE_UNUSED_VAR(root); return ( hypre_MPI_Allgather(sendbuf, sendcount, sendtype, recvbuf, recvcount, recvtype, comm) ); } HYPRE_Int hypre_MPI_Scatterv( void *sendbuf, HYPRE_Int *sendcounts, HYPRE_Int *displs, hypre_MPI_Datatype sendtype, void *recvbuf, HYPRE_Int recvcount, hypre_MPI_Datatype recvtype, HYPRE_Int root, hypre_MPI_Comm comm ) { HYPRE_UNUSED_VAR(displs); HYPRE_UNUSED_VAR(root); return ( hypre_MPI_Allgather(sendbuf, *sendcounts, sendtype, recvbuf, recvcount, recvtype, comm) ); } HYPRE_Int hypre_MPI_Bcast( void *buffer, HYPRE_Int count, hypre_MPI_Datatype datatype, HYPRE_Int root, hypre_MPI_Comm comm ) { HYPRE_UNUSED_VAR(buffer); HYPRE_UNUSED_VAR(count); HYPRE_UNUSED_VAR(datatype); HYPRE_UNUSED_VAR(root); HYPRE_UNUSED_VAR(comm); return (0); } HYPRE_Int hypre_MPI_Send( void *buf, HYPRE_Int count, hypre_MPI_Datatype datatype, HYPRE_Int dest, HYPRE_Int tag, hypre_MPI_Comm comm ) { HYPRE_UNUSED_VAR(buf); HYPRE_UNUSED_VAR(count); HYPRE_UNUSED_VAR(datatype); HYPRE_UNUSED_VAR(dest); HYPRE_UNUSED_VAR(tag); HYPRE_UNUSED_VAR(comm); return (0); } HYPRE_Int hypre_MPI_Recv( void *buf, HYPRE_Int count, hypre_MPI_Datatype datatype, HYPRE_Int source, HYPRE_Int tag, hypre_MPI_Comm comm, hypre_MPI_Status *status ) { HYPRE_UNUSED_VAR(buf); HYPRE_UNUSED_VAR(count); HYPRE_UNUSED_VAR(datatype); HYPRE_UNUSED_VAR(source); HYPRE_UNUSED_VAR(tag); HYPRE_UNUSED_VAR(comm); HYPRE_UNUSED_VAR(status); return (0); } HYPRE_Int hypre_MPI_Isend( void *buf, HYPRE_Int count, hypre_MPI_Datatype datatype, HYPRE_Int dest, HYPRE_Int tag, hypre_MPI_Comm comm, hypre_MPI_Request *request ) { HYPRE_UNUSED_VAR(buf); HYPRE_UNUSED_VAR(count); HYPRE_UNUSED_VAR(datatype); HYPRE_UNUSED_VAR(dest); HYPRE_UNUSED_VAR(tag); HYPRE_UNUSED_VAR(comm); HYPRE_UNUSED_VAR(request); return (0); } HYPRE_Int hypre_MPI_Irecv( void *buf, HYPRE_Int count, hypre_MPI_Datatype datatype, HYPRE_Int source, HYPRE_Int tag, hypre_MPI_Comm comm, hypre_MPI_Request *request ) { HYPRE_UNUSED_VAR(buf); HYPRE_UNUSED_VAR(count); HYPRE_UNUSED_VAR(datatype); HYPRE_UNUSED_VAR(source); HYPRE_UNUSED_VAR(tag); HYPRE_UNUSED_VAR(comm); HYPRE_UNUSED_VAR(request); return (0); } HYPRE_Int hypre_MPI_Send_init( void *buf, HYPRE_Int count, hypre_MPI_Datatype datatype, HYPRE_Int dest, HYPRE_Int tag, hypre_MPI_Comm comm, hypre_MPI_Request *request ) { HYPRE_UNUSED_VAR(buf); HYPRE_UNUSED_VAR(count); HYPRE_UNUSED_VAR(datatype); HYPRE_UNUSED_VAR(dest); HYPRE_UNUSED_VAR(tag); HYPRE_UNUSED_VAR(comm); HYPRE_UNUSED_VAR(request); return 0; } HYPRE_Int hypre_MPI_Recv_init( void *buf, HYPRE_Int count, hypre_MPI_Datatype datatype, HYPRE_Int dest, HYPRE_Int tag, hypre_MPI_Comm comm, hypre_MPI_Request *request ) { HYPRE_UNUSED_VAR(buf); HYPRE_UNUSED_VAR(count); HYPRE_UNUSED_VAR(datatype); HYPRE_UNUSED_VAR(dest); HYPRE_UNUSED_VAR(tag); HYPRE_UNUSED_VAR(comm); HYPRE_UNUSED_VAR(request); return 0; } HYPRE_Int hypre_MPI_Irsend( void *buf, HYPRE_Int count, hypre_MPI_Datatype datatype, HYPRE_Int dest, HYPRE_Int tag, hypre_MPI_Comm comm, hypre_MPI_Request *request ) { HYPRE_UNUSED_VAR(buf); HYPRE_UNUSED_VAR(count); HYPRE_UNUSED_VAR(datatype); HYPRE_UNUSED_VAR(dest); HYPRE_UNUSED_VAR(tag); HYPRE_UNUSED_VAR(comm); HYPRE_UNUSED_VAR(request); return 0; } HYPRE_Int hypre_MPI_Startall( HYPRE_Int count, hypre_MPI_Request *array_of_requests ) { HYPRE_UNUSED_VAR(count); HYPRE_UNUSED_VAR(array_of_requests); return 0; } HYPRE_Int hypre_MPI_Probe( HYPRE_Int source, HYPRE_Int tag, hypre_MPI_Comm comm, hypre_MPI_Status *status ) { HYPRE_UNUSED_VAR(source); HYPRE_UNUSED_VAR(tag); HYPRE_UNUSED_VAR(comm); HYPRE_UNUSED_VAR(status); return 0; } HYPRE_Int hypre_MPI_Iprobe( HYPRE_Int source, HYPRE_Int tag, hypre_MPI_Comm comm, HYPRE_Int *flag, hypre_MPI_Status *status ) { HYPRE_UNUSED_VAR(source); HYPRE_UNUSED_VAR(tag); HYPRE_UNUSED_VAR(comm); HYPRE_UNUSED_VAR(flag); HYPRE_UNUSED_VAR(status); return 0; } HYPRE_Int hypre_MPI_Test( hypre_MPI_Request *request, HYPRE_Int *flag, hypre_MPI_Status *status ) { HYPRE_UNUSED_VAR(request); HYPRE_UNUSED_VAR(status); *flag = 1; return (0); } HYPRE_Int hypre_MPI_Testall( HYPRE_Int count, hypre_MPI_Request *array_of_requests, HYPRE_Int *flag, hypre_MPI_Status *array_of_statuses ) { HYPRE_UNUSED_VAR(count); HYPRE_UNUSED_VAR(array_of_requests); HYPRE_UNUSED_VAR(flag); HYPRE_UNUSED_VAR(array_of_statuses); *flag = 1; return (0); } HYPRE_Int hypre_MPI_Wait( hypre_MPI_Request *request, hypre_MPI_Status *status ) { HYPRE_UNUSED_VAR(request); HYPRE_UNUSED_VAR(status); return (0); } HYPRE_Int hypre_MPI_Waitall( HYPRE_Int count, hypre_MPI_Request *array_of_requests, hypre_MPI_Status *array_of_statuses ) { HYPRE_UNUSED_VAR(count); HYPRE_UNUSED_VAR(array_of_requests); HYPRE_UNUSED_VAR(array_of_statuses); return (0); } HYPRE_Int hypre_MPI_Waitany( HYPRE_Int count, hypre_MPI_Request *array_of_requests, HYPRE_Int *index, hypre_MPI_Status *status ) { HYPRE_UNUSED_VAR(count); HYPRE_UNUSED_VAR(array_of_requests); HYPRE_UNUSED_VAR(index); HYPRE_UNUSED_VAR(status); return (0); } HYPRE_Int hypre_MPI_Allreduce( void *sendbuf, void *recvbuf, HYPRE_Int count, hypre_MPI_Datatype datatype, hypre_MPI_Op op, hypre_MPI_Comm comm ) { HYPRE_Int i; HYPRE_UNUSED_VAR(op); HYPRE_UNUSED_VAR(comm); switch (datatype) { case hypre_MPI_INT: { HYPRE_Int *crecvbuf = (HYPRE_Int *)recvbuf; HYPRE_Int *csendbuf = (HYPRE_Int *)sendbuf; for (i = 0; i < count; i++) { crecvbuf[i] = csendbuf[i]; } } break; case hypre_MPI_LONG_LONG_INT: { HYPRE_BigInt *crecvbuf = (HYPRE_BigInt *)recvbuf; HYPRE_BigInt *csendbuf = (HYPRE_BigInt *)sendbuf; for (i = 0; i < count; i++) { crecvbuf[i] = csendbuf[i]; } } break; case hypre_MPI_FLOAT: { float *crecvbuf = (float *)recvbuf; float *csendbuf = (float *)sendbuf; for (i = 0; i < count; i++) { crecvbuf[i] = csendbuf[i]; } } break; case hypre_MPI_DOUBLE: { double *crecvbuf = (double *)recvbuf; double *csendbuf = (double *)sendbuf; for (i = 0; i < count; i++) { crecvbuf[i] = csendbuf[i]; } } break; case hypre_MPI_LONG_DOUBLE: { long double *crecvbuf = (long double *)recvbuf; long double *csendbuf = (long double *)sendbuf; for (i = 0; i < count; i++) { crecvbuf[i] = csendbuf[i]; } } break; case hypre_MPI_CHAR: { char *crecvbuf = (char *)recvbuf; char *csendbuf = (char *)sendbuf; for (i = 0; i < count; i++) { crecvbuf[i] = csendbuf[i]; } } break; case hypre_MPI_LONG: { hypre_longint *crecvbuf = (hypre_longint *)recvbuf; hypre_longint *csendbuf = (hypre_longint *)sendbuf; for (i = 0; i < count; i++) { crecvbuf[i] = csendbuf[i]; } } break; case hypre_MPI_BYTE: { hypre_TMemcpy(recvbuf, sendbuf, char, count, HYPRE_MEMORY_HOST, HYPRE_MEMORY_HOST); } break; case hypre_MPI_REAL: { HYPRE_Real *crecvbuf = (HYPRE_Real *)recvbuf; HYPRE_Real *csendbuf = (HYPRE_Real *)sendbuf; for (i = 0; i < count; i++) { crecvbuf[i] = csendbuf[i]; } } break; case hypre_MPI_COMPLEX: { HYPRE_Complex *crecvbuf = (HYPRE_Complex *)recvbuf; HYPRE_Complex *csendbuf = (HYPRE_Complex *)sendbuf; for (i = 0; i < count; i++) { crecvbuf[i] = csendbuf[i]; } } break; } return 0; } HYPRE_Int hypre_MPI_Reduce( void *sendbuf, void *recvbuf, HYPRE_Int count, hypre_MPI_Datatype datatype, hypre_MPI_Op op, HYPRE_Int root, hypre_MPI_Comm comm ) { HYPRE_UNUSED_VAR(root); hypre_MPI_Allreduce(sendbuf, recvbuf, count, datatype, op, comm); return 0; } HYPRE_Int hypre_MPI_Scan( void *sendbuf, void *recvbuf, HYPRE_Int count, hypre_MPI_Datatype datatype, hypre_MPI_Op op, hypre_MPI_Comm comm ) { hypre_MPI_Allreduce(sendbuf, recvbuf, count, datatype, op, comm); return 0; } HYPRE_Int hypre_MPI_Request_free( hypre_MPI_Request *request ) { HYPRE_UNUSED_VAR(request); return 0; } HYPRE_Int hypre_MPI_Type_contiguous( HYPRE_Int count, hypre_MPI_Datatype oldtype, hypre_MPI_Datatype *newtype ) { HYPRE_UNUSED_VAR(count); HYPRE_UNUSED_VAR(oldtype); HYPRE_UNUSED_VAR(newtype); return (0); } HYPRE_Int hypre_MPI_Type_vector( HYPRE_Int count, HYPRE_Int blocklength, HYPRE_Int stride, hypre_MPI_Datatype oldtype, hypre_MPI_Datatype *newtype ) { HYPRE_UNUSED_VAR(count); HYPRE_UNUSED_VAR(blocklength); HYPRE_UNUSED_VAR(stride); HYPRE_UNUSED_VAR(oldtype); HYPRE_UNUSED_VAR(newtype); return (0); } HYPRE_Int hypre_MPI_Type_hvector( HYPRE_Int count, HYPRE_Int blocklength, hypre_MPI_Aint stride, hypre_MPI_Datatype oldtype, hypre_MPI_Datatype *newtype ) { HYPRE_UNUSED_VAR(count); HYPRE_UNUSED_VAR(blocklength); HYPRE_UNUSED_VAR(stride); HYPRE_UNUSED_VAR(oldtype); HYPRE_UNUSED_VAR(newtype); return (0); } HYPRE_Int hypre_MPI_Type_struct( HYPRE_Int count, HYPRE_Int *array_of_blocklengths, hypre_MPI_Aint *array_of_displacements, hypre_MPI_Datatype *array_of_types, hypre_MPI_Datatype *newtype ) { HYPRE_UNUSED_VAR(count); HYPRE_UNUSED_VAR(array_of_blocklengths); HYPRE_UNUSED_VAR(array_of_displacements); HYPRE_UNUSED_VAR(array_of_types); HYPRE_UNUSED_VAR(newtype); return (0); } HYPRE_Int hypre_MPI_Type_commit( hypre_MPI_Datatype *datatype ) { HYPRE_UNUSED_VAR(datatype); return (0); } HYPRE_Int hypre_MPI_Type_free( hypre_MPI_Datatype *datatype ) { HYPRE_UNUSED_VAR(datatype); return (0); } HYPRE_Int hypre_MPI_Op_create( hypre_MPI_User_function *function, hypre_int commute, hypre_MPI_Op *op ) { HYPRE_UNUSED_VAR(function); HYPRE_UNUSED_VAR(commute); HYPRE_UNUSED_VAR(op); return (0); } HYPRE_Int hypre_MPI_Op_free( hypre_MPI_Op *op ) { HYPRE_UNUSED_VAR(op); return (0); } #if defined(HYPRE_USING_GPU) HYPRE_Int hypre_MPI_Comm_split_type( hypre_MPI_Comm comm, HYPRE_Int split_type, HYPRE_Int key, hypre_MPI_Info info, hypre_MPI_Comm *newcomm ) { HYPRE_UNUSED_VAR(comm); HYPRE_UNUSED_VAR(split_type); HYPRE_UNUSED_VAR(key); HYPRE_UNUSED_VAR(info); HYPRE_UNUSED_VAR(newcomm); return (0); } HYPRE_Int hypre_MPI_Info_create( hypre_MPI_Info *info ) { HYPRE_UNUSED_VAR(info); return (0); } HYPRE_Int hypre_MPI_Info_free( hypre_MPI_Info *info ) { HYPRE_UNUSED_VAR(info); return (0); } #endif /****************************************************************************** * MPI stubs to do casting of HYPRE_Int and hypre_int correctly *****************************************************************************/ #else HYPRE_Int hypre_MPI_Init( hypre_int *argc, char ***argv ) { return (HYPRE_Int) MPI_Init(argc, argv); } HYPRE_Int hypre_MPI_Finalize( void ) { return (HYPRE_Int) MPI_Finalize(); } HYPRE_Int hypre_MPI_Abort( hypre_MPI_Comm comm, HYPRE_Int errorcode ) { return (HYPRE_Int) MPI_Abort(comm, (hypre_int)errorcode); } HYPRE_Real hypre_MPI_Wtime( void ) { return (HYPRE_Real)MPI_Wtime(); } HYPRE_Real hypre_MPI_Wtick( void ) { return (HYPRE_Real)MPI_Wtick(); } HYPRE_Int hypre_MPI_Barrier( hypre_MPI_Comm comm ) { return (HYPRE_Int) MPI_Barrier(comm); } HYPRE_Int hypre_MPI_Comm_create( hypre_MPI_Comm comm, hypre_MPI_Group group, hypre_MPI_Comm *newcomm ) { return (HYPRE_Int) MPI_Comm_create(comm, group, newcomm); } HYPRE_Int hypre_MPI_Comm_dup( hypre_MPI_Comm comm, hypre_MPI_Comm *newcomm ) { return (HYPRE_Int) MPI_Comm_dup(comm, newcomm); } HYPRE_Int hypre_MPI_Comm_size( hypre_MPI_Comm comm, HYPRE_Int *size ) { hypre_int mpi_size; HYPRE_Int ierr; ierr = (HYPRE_Int) MPI_Comm_size(comm, &mpi_size); *size = (HYPRE_Int) mpi_size; return ierr; } HYPRE_Int hypre_MPI_Comm_rank( hypre_MPI_Comm comm, HYPRE_Int *rank ) { hypre_int mpi_rank; HYPRE_Int ierr; ierr = (HYPRE_Int) MPI_Comm_rank(comm, &mpi_rank); *rank = (HYPRE_Int) mpi_rank; return ierr; } HYPRE_Int hypre_MPI_Comm_free( hypre_MPI_Comm *comm ) { return (HYPRE_Int) MPI_Comm_free(comm); } HYPRE_Int hypre_MPI_Comm_group( hypre_MPI_Comm comm, hypre_MPI_Group *group ) { return (HYPRE_Int) MPI_Comm_group(comm, group); } HYPRE_Int hypre_MPI_Comm_split( hypre_MPI_Comm comm, HYPRE_Int n, HYPRE_Int m, hypre_MPI_Comm *comms ) { return (HYPRE_Int) MPI_Comm_split(comm, (hypre_int)n, (hypre_int)m, comms); } HYPRE_Int hypre_MPI_Group_incl( hypre_MPI_Group group, HYPRE_Int n, HYPRE_Int *ranks, hypre_MPI_Group *newgroup ) { hypre_int *mpi_ranks; HYPRE_Int i; HYPRE_Int ierr; mpi_ranks = hypre_TAlloc(hypre_int, n, HYPRE_MEMORY_HOST); for (i = 0; i < n; i++) { mpi_ranks[i] = (hypre_int) ranks[i]; } ierr = (HYPRE_Int) MPI_Group_incl(group, (hypre_int)n, mpi_ranks, newgroup); hypre_TFree(mpi_ranks, HYPRE_MEMORY_HOST); return ierr; } HYPRE_Int hypre_MPI_Group_free( hypre_MPI_Group *group ) { return (HYPRE_Int) MPI_Group_free(group); } HYPRE_Int hypre_MPI_Address( void *location, hypre_MPI_Aint *address ) { #if MPI_VERSION > 1 return (HYPRE_Int) MPI_Get_address(location, address); #else return (HYPRE_Int) MPI_Address(location, address); #endif } HYPRE_Int hypre_MPI_Get_count( hypre_MPI_Status *status, hypre_MPI_Datatype datatype, HYPRE_Int *count ) { hypre_int mpi_count; HYPRE_Int ierr; ierr = (HYPRE_Int) MPI_Get_count(status, datatype, &mpi_count); *count = (HYPRE_Int) mpi_count; return ierr; } HYPRE_Int hypre_MPI_Alltoall( void *sendbuf, HYPRE_Int sendcount, hypre_MPI_Datatype sendtype, void *recvbuf, HYPRE_Int recvcount, hypre_MPI_Datatype recvtype, hypre_MPI_Comm comm ) { return (HYPRE_Int) MPI_Alltoall(sendbuf, (hypre_int)sendcount, sendtype, recvbuf, (hypre_int)recvcount, recvtype, comm); } HYPRE_Int hypre_MPI_Allgather( void *sendbuf, HYPRE_Int sendcount, hypre_MPI_Datatype sendtype, void *recvbuf, HYPRE_Int recvcount, hypre_MPI_Datatype recvtype, hypre_MPI_Comm comm ) { return (HYPRE_Int) MPI_Allgather(sendbuf, (hypre_int)sendcount, sendtype, recvbuf, (hypre_int)recvcount, recvtype, comm); } HYPRE_Int hypre_MPI_Allgatherv( void *sendbuf, HYPRE_Int sendcount, hypre_MPI_Datatype sendtype, void *recvbuf, HYPRE_Int *recvcounts, HYPRE_Int *displs, hypre_MPI_Datatype recvtype, hypre_MPI_Comm comm ) { hypre_int *mpi_recvcounts, *mpi_displs, csize; HYPRE_Int i; HYPRE_Int ierr; MPI_Comm_size(comm, &csize); mpi_recvcounts = hypre_TAlloc(hypre_int, csize, HYPRE_MEMORY_HOST); mpi_displs = hypre_TAlloc(hypre_int, csize, HYPRE_MEMORY_HOST); for (i = 0; i < csize; i++) { mpi_recvcounts[i] = (hypre_int) recvcounts[i]; mpi_displs[i] = (hypre_int) displs[i]; } ierr = (HYPRE_Int) MPI_Allgatherv(sendbuf, (hypre_int)sendcount, sendtype, recvbuf, mpi_recvcounts, mpi_displs, recvtype, comm); hypre_TFree(mpi_recvcounts, HYPRE_MEMORY_HOST); hypre_TFree(mpi_displs, HYPRE_MEMORY_HOST); return ierr; } HYPRE_Int hypre_MPI_Gather( void *sendbuf, HYPRE_Int sendcount, hypre_MPI_Datatype sendtype, void *recvbuf, HYPRE_Int recvcount, hypre_MPI_Datatype recvtype, HYPRE_Int root, hypre_MPI_Comm comm ) { return (HYPRE_Int) MPI_Gather(sendbuf, (hypre_int) sendcount, sendtype, recvbuf, (hypre_int) recvcount, recvtype, (hypre_int)root, comm); } HYPRE_Int hypre_MPI_Gatherv(void *sendbuf, HYPRE_Int sendcount, hypre_MPI_Datatype sendtype, void *recvbuf, HYPRE_Int *recvcounts, HYPRE_Int *displs, hypre_MPI_Datatype recvtype, HYPRE_Int root, hypre_MPI_Comm comm ) { hypre_int *mpi_recvcounts = NULL; hypre_int *mpi_displs = NULL; hypre_int csize, croot; HYPRE_Int i; HYPRE_Int ierr; MPI_Comm_size(comm, &csize); MPI_Comm_rank(comm, &croot); if (croot == (hypre_int) root) { mpi_recvcounts = hypre_TAlloc(hypre_int, csize, HYPRE_MEMORY_HOST); mpi_displs = hypre_TAlloc(hypre_int, csize, HYPRE_MEMORY_HOST); for (i = 0; i < csize; i++) { mpi_recvcounts[i] = (hypre_int) recvcounts[i]; mpi_displs[i] = (hypre_int) displs[i]; } } ierr = (HYPRE_Int) MPI_Gatherv(sendbuf, (hypre_int)sendcount, sendtype, recvbuf, mpi_recvcounts, mpi_displs, recvtype, (hypre_int) root, comm); hypre_TFree(mpi_recvcounts, HYPRE_MEMORY_HOST); hypre_TFree(mpi_displs, HYPRE_MEMORY_HOST); return ierr; } HYPRE_Int hypre_MPI_Scatter( void *sendbuf, HYPRE_Int sendcount, hypre_MPI_Datatype sendtype, void *recvbuf, HYPRE_Int recvcount, hypre_MPI_Datatype recvtype, HYPRE_Int root, hypre_MPI_Comm comm ) { return (HYPRE_Int) MPI_Scatter(sendbuf, (hypre_int)sendcount, sendtype, recvbuf, (hypre_int)recvcount, recvtype, (hypre_int)root, comm); } HYPRE_Int hypre_MPI_Scatterv(void *sendbuf, HYPRE_Int *sendcounts, HYPRE_Int *displs, hypre_MPI_Datatype sendtype, void *recvbuf, HYPRE_Int recvcount, hypre_MPI_Datatype recvtype, HYPRE_Int root, hypre_MPI_Comm comm ) { hypre_int *mpi_sendcounts = NULL; hypre_int *mpi_displs = NULL; hypre_int csize, croot; HYPRE_Int i; HYPRE_Int ierr; MPI_Comm_size(comm, &csize); MPI_Comm_rank(comm, &croot); if (croot == (hypre_int) root) { mpi_sendcounts = hypre_TAlloc(hypre_int, csize, HYPRE_MEMORY_HOST); mpi_displs = hypre_TAlloc(hypre_int, csize, HYPRE_MEMORY_HOST); for (i = 0; i < csize; i++) { mpi_sendcounts[i] = (hypre_int) sendcounts[i]; mpi_displs[i] = (hypre_int) displs[i]; } } ierr = (HYPRE_Int) MPI_Scatterv(sendbuf, mpi_sendcounts, mpi_displs, sendtype, recvbuf, (hypre_int) recvcount, recvtype, (hypre_int) root, comm); hypre_TFree(mpi_sendcounts, HYPRE_MEMORY_HOST); hypre_TFree(mpi_displs, HYPRE_MEMORY_HOST); return ierr; } HYPRE_Int hypre_MPI_Bcast( void *buffer, HYPRE_Int count, hypre_MPI_Datatype datatype, HYPRE_Int root, hypre_MPI_Comm comm ) { return (HYPRE_Int) MPI_Bcast(buffer, (hypre_int)count, datatype, (hypre_int)root, comm); } HYPRE_Int hypre_MPI_Send( void *buf, HYPRE_Int count, hypre_MPI_Datatype datatype, HYPRE_Int dest, HYPRE_Int tag, hypre_MPI_Comm comm ) { return (HYPRE_Int) MPI_Send(buf, (hypre_int)count, datatype, (hypre_int)dest, (hypre_int)tag, comm); } HYPRE_Int hypre_MPI_Recv( void *buf, HYPRE_Int count, hypre_MPI_Datatype datatype, HYPRE_Int source, HYPRE_Int tag, hypre_MPI_Comm comm, hypre_MPI_Status *status ) { return (HYPRE_Int) MPI_Recv(buf, (hypre_int)count, datatype, (hypre_int)source, (hypre_int)tag, comm, status); } HYPRE_Int hypre_MPI_Isend( void *buf, HYPRE_Int count, hypre_MPI_Datatype datatype, HYPRE_Int dest, HYPRE_Int tag, hypre_MPI_Comm comm, hypre_MPI_Request *request ) { return (HYPRE_Int) MPI_Isend(buf, (hypre_int)count, datatype, (hypre_int)dest, (hypre_int)tag, comm, request); } HYPRE_Int hypre_MPI_Irecv( void *buf, HYPRE_Int count, hypre_MPI_Datatype datatype, HYPRE_Int source, HYPRE_Int tag, hypre_MPI_Comm comm, hypre_MPI_Request *request ) { return (HYPRE_Int) MPI_Irecv(buf, (hypre_int)count, datatype, (hypre_int)source, (hypre_int)tag, comm, request); } HYPRE_Int hypre_MPI_Send_init( void *buf, HYPRE_Int count, hypre_MPI_Datatype datatype, HYPRE_Int dest, HYPRE_Int tag, hypre_MPI_Comm comm, hypre_MPI_Request *request ) { return (HYPRE_Int) MPI_Send_init(buf, (hypre_int)count, datatype, (hypre_int)dest, (hypre_int)tag, comm, request); } HYPRE_Int hypre_MPI_Recv_init( void *buf, HYPRE_Int count, hypre_MPI_Datatype datatype, HYPRE_Int dest, HYPRE_Int tag, hypre_MPI_Comm comm, hypre_MPI_Request *request ) { return (HYPRE_Int) MPI_Recv_init(buf, (hypre_int)count, datatype, (hypre_int)dest, (hypre_int)tag, comm, request); } HYPRE_Int hypre_MPI_Irsend( void *buf, HYPRE_Int count, hypre_MPI_Datatype datatype, HYPRE_Int dest, HYPRE_Int tag, hypre_MPI_Comm comm, hypre_MPI_Request *request ) { return (HYPRE_Int) MPI_Irsend(buf, (hypre_int)count, datatype, (hypre_int)dest, (hypre_int)tag, comm, request); } HYPRE_Int hypre_MPI_Startall( HYPRE_Int count, hypre_MPI_Request *array_of_requests ) { return (HYPRE_Int) MPI_Startall((hypre_int)count, array_of_requests); } HYPRE_Int hypre_MPI_Probe( HYPRE_Int source, HYPRE_Int tag, hypre_MPI_Comm comm, hypre_MPI_Status *status ) { return (HYPRE_Int) MPI_Probe((hypre_int)source, (hypre_int)tag, comm, status); } HYPRE_Int hypre_MPI_Iprobe( HYPRE_Int source, HYPRE_Int tag, hypre_MPI_Comm comm, HYPRE_Int *flag, hypre_MPI_Status *status ) { hypre_int mpi_flag; HYPRE_Int ierr; ierr = (HYPRE_Int) MPI_Iprobe((hypre_int)source, (hypre_int)tag, comm, &mpi_flag, status); *flag = (HYPRE_Int) mpi_flag; return ierr; } HYPRE_Int hypre_MPI_Test( hypre_MPI_Request *request, HYPRE_Int *flag, hypre_MPI_Status *status ) { hypre_int mpi_flag; HYPRE_Int ierr; ierr = (HYPRE_Int) MPI_Test(request, &mpi_flag, status); *flag = (HYPRE_Int) mpi_flag; return ierr; } HYPRE_Int hypre_MPI_Testall( HYPRE_Int count, hypre_MPI_Request *array_of_requests, HYPRE_Int *flag, hypre_MPI_Status *array_of_statuses ) { hypre_int mpi_flag; HYPRE_Int ierr; ierr = (HYPRE_Int) MPI_Testall((hypre_int)count, array_of_requests, &mpi_flag, array_of_statuses); *flag = (HYPRE_Int) mpi_flag; return ierr; } HYPRE_Int hypre_MPI_Wait( hypre_MPI_Request *request, hypre_MPI_Status *status ) { return (HYPRE_Int) MPI_Wait(request, status); } HYPRE_Int hypre_MPI_Waitall( HYPRE_Int count, hypre_MPI_Request *array_of_requests, hypre_MPI_Status *array_of_statuses ) { return (HYPRE_Int) MPI_Waitall((hypre_int)count, array_of_requests, array_of_statuses); } HYPRE_Int hypre_MPI_Waitany( HYPRE_Int count, hypre_MPI_Request *array_of_requests, HYPRE_Int *index, hypre_MPI_Status *status ) { hypre_int mpi_index; HYPRE_Int ierr; ierr = (HYPRE_Int) MPI_Waitany((hypre_int)count, array_of_requests, &mpi_index, status); *index = (HYPRE_Int) mpi_index; return ierr; } HYPRE_Int hypre_MPI_Allreduce( void *sendbuf, void *recvbuf, HYPRE_Int count, hypre_MPI_Datatype datatype, hypre_MPI_Op op, hypre_MPI_Comm comm ) { hypre_GpuProfilingPushRange("MPI_Allreduce"); HYPRE_Int result = MPI_Allreduce(sendbuf, recvbuf, (hypre_int)count, datatype, op, comm); hypre_GpuProfilingPopRange(); return result; } HYPRE_Int hypre_MPI_Reduce( void *sendbuf, void *recvbuf, HYPRE_Int count, hypre_MPI_Datatype datatype, hypre_MPI_Op op, HYPRE_Int root, hypre_MPI_Comm comm ) { return (HYPRE_Int) MPI_Reduce(sendbuf, recvbuf, (hypre_int)count, datatype, op, (hypre_int)root, comm); } HYPRE_Int hypre_MPI_Scan( void *sendbuf, void *recvbuf, HYPRE_Int count, hypre_MPI_Datatype datatype, hypre_MPI_Op op, hypre_MPI_Comm comm ) { return (HYPRE_Int) MPI_Scan(sendbuf, recvbuf, (hypre_int)count, datatype, op, comm); } HYPRE_Int hypre_MPI_Request_free( hypre_MPI_Request *request ) { return (HYPRE_Int) MPI_Request_free(request); } HYPRE_Int hypre_MPI_Type_contiguous( HYPRE_Int count, hypre_MPI_Datatype oldtype, hypre_MPI_Datatype *newtype ) { return (HYPRE_Int) MPI_Type_contiguous((hypre_int)count, oldtype, newtype); } HYPRE_Int hypre_MPI_Type_vector( HYPRE_Int count, HYPRE_Int blocklength, HYPRE_Int stride, hypre_MPI_Datatype oldtype, hypre_MPI_Datatype *newtype ) { return (HYPRE_Int) MPI_Type_vector((hypre_int)count, (hypre_int)blocklength, (hypre_int)stride, oldtype, newtype); } HYPRE_Int hypre_MPI_Type_hvector( HYPRE_Int count, HYPRE_Int blocklength, hypre_MPI_Aint stride, hypre_MPI_Datatype oldtype, hypre_MPI_Datatype *newtype ) { #if MPI_VERSION > 1 return (HYPRE_Int) MPI_Type_create_hvector((hypre_int)count, (hypre_int)blocklength, stride, oldtype, newtype); #else return (HYPRE_Int) MPI_Type_hvector((hypre_int)count, (hypre_int)blocklength, stride, oldtype, newtype); #endif } HYPRE_Int hypre_MPI_Type_struct( HYPRE_Int count, HYPRE_Int *array_of_blocklengths, hypre_MPI_Aint *array_of_displacements, hypre_MPI_Datatype *array_of_types, hypre_MPI_Datatype *newtype ) { hypre_int *mpi_array_of_blocklengths; HYPRE_Int i; HYPRE_Int ierr; mpi_array_of_blocklengths = hypre_TAlloc(hypre_int, count, HYPRE_MEMORY_HOST); for (i = 0; i < count; i++) { mpi_array_of_blocklengths[i] = (hypre_int) array_of_blocklengths[i]; } #if MPI_VERSION > 1 ierr = (HYPRE_Int) MPI_Type_create_struct((hypre_int)count, mpi_array_of_blocklengths, array_of_displacements, array_of_types, newtype); #else ierr = (HYPRE_Int) MPI_Type_struct((hypre_int)count, mpi_array_of_blocklengths, array_of_displacements, array_of_types, newtype); #endif hypre_TFree(mpi_array_of_blocklengths, HYPRE_MEMORY_HOST); return ierr; } HYPRE_Int hypre_MPI_Type_commit( hypre_MPI_Datatype *datatype ) { return (HYPRE_Int) MPI_Type_commit(datatype); } HYPRE_Int hypre_MPI_Type_free( hypre_MPI_Datatype *datatype ) { return (HYPRE_Int) MPI_Type_free(datatype); } HYPRE_Int hypre_MPI_Op_free( hypre_MPI_Op *op ) { return (HYPRE_Int) MPI_Op_free(op); } HYPRE_Int hypre_MPI_Op_create( hypre_MPI_User_function *function, hypre_int commute, hypre_MPI_Op *op ) { return (HYPRE_Int) MPI_Op_create(function, commute, op); } #if defined(HYPRE_USING_GPU) || defined(HYPRE_USING_DEVICE_OPENMP) HYPRE_Int hypre_MPI_Comm_split_type( hypre_MPI_Comm comm, HYPRE_Int split_type, HYPRE_Int key, hypre_MPI_Info info, hypre_MPI_Comm *newcomm ) { return (HYPRE_Int) MPI_Comm_split_type(comm, split_type, key, info, newcomm ); } HYPRE_Int hypre_MPI_Info_create( hypre_MPI_Info *info ) { return (HYPRE_Int) MPI_Info_create(info); } HYPRE_Int hypre_MPI_Info_free( hypre_MPI_Info *info ) { return (HYPRE_Int) MPI_Info_free(info); } #endif #endif hypre-2.33.0/src/utilities/mpistubs.h000066400000000000000000000417131477326011500175630ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * Fake mpi stubs to generate serial codes without mpi * *****************************************************************************/ #ifndef hypre_MPISTUBS #define hypre_MPISTUBS #ifdef __cplusplus extern "C" { #endif #ifdef HYPRE_SEQUENTIAL /****************************************************************************** * MPI stubs to generate serial codes without mpi *****************************************************************************/ /*-------------------------------------------------------------------------- * Change all MPI names to hypre_MPI names to avoid link conflicts. * * NOTE: MPI_Comm is the only MPI symbol in the HYPRE user interface, * and is defined in `HYPRE_utilities.h'. *--------------------------------------------------------------------------*/ #define MPI_Comm hypre_MPI_Comm #define MPI_Group hypre_MPI_Group #define MPI_Request hypre_MPI_Request #define MPI_Datatype hypre_MPI_Datatype #define MPI_Status hypre_MPI_Status #define MPI_Op hypre_MPI_Op #define MPI_Aint hypre_MPI_Aint #define MPI_Info hypre_MPI_Info #define MPI_COMM_WORLD hypre_MPI_COMM_WORLD #define MPI_COMM_NULL hypre_MPI_COMM_NULL #define MPI_COMM_SELF hypre_MPI_COMM_SELF #define MPI_COMM_TYPE_SHARED hypre_MPI_COMM_TYPE_SHARED #define MPI_BOTTOM hypre_MPI_BOTTOM #define MPI_FLOAT hypre_MPI_FLOAT #define MPI_DOUBLE hypre_MPI_DOUBLE #define MPI_LONG_DOUBLE hypre_MPI_LONG_DOUBLE #define MPI_INT hypre_MPI_INT #define MPI_LONG_LONG_INT hypre_MPI_LONG_LONG_INT #define MPI_CHAR hypre_MPI_CHAR #define MPI_LONG hypre_MPI_LONG #define MPI_BYTE hypre_MPI_BYTE #define MPI_C_FLOAT_COMPLEX hypre_MPI_COMPLEX #define MPI_C_LONG_DOUBLE_COMPLEX hypre_MPI_COMPLEX #define MPI_C_DOUBLE_COMPLEX hypre_MPI_COMPLEX #define MPI_SUM hypre_MPI_SUM #define MPI_MIN hypre_MPI_MIN #define MPI_MAX hypre_MPI_MAX #define MPI_LOR hypre_MPI_LOR #define MPI_LAND hypre_MPI_LAND #define MPI_BOR hypre_MPI_BOR #define MPI_SUCCESS hypre_MPI_SUCCESS #define MPI_STATUSES_IGNORE hypre_MPI_STATUSES_IGNORE #define MPI_UNDEFINED hypre_MPI_UNDEFINED #define MPI_REQUEST_NULL hypre_MPI_REQUEST_NULL #define MPI_INFO_NULL hypre_MPI_INFO_NULL #define MPI_ANY_SOURCE hypre_MPI_ANY_SOURCE #define MPI_ANY_TAG hypre_MPI_ANY_TAG #define MPI_SOURCE hypre_MPI_SOURCE #define MPI_TAG hypre_MPI_TAG #define MPI_Init hypre_MPI_Init #define MPI_Finalize hypre_MPI_Finalize #define MPI_Abort hypre_MPI_Abort #define MPI_Wtime hypre_MPI_Wtime #define MPI_Wtick hypre_MPI_Wtick #define MPI_Barrier hypre_MPI_Barrier #define MPI_Comm_create hypre_MPI_Comm_create #define MPI_Comm_dup hypre_MPI_Comm_dup #define MPI_Comm_f2c hypre_MPI_Comm_f2c #define MPI_Comm_group hypre_MPI_Comm_group #define MPI_Comm_size hypre_MPI_Comm_size #define MPI_Comm_rank hypre_MPI_Comm_rank #define MPI_Comm_free hypre_MPI_Comm_free #define MPI_Comm_split hypre_MPI_Comm_split #define MPI_Comm_split_type hypre_MPI_Comm_split_type #define MPI_Group_incl hypre_MPI_Group_incl #define MPI_Group_free hypre_MPI_Group_free #define MPI_Address hypre_MPI_Address #define MPI_Get_count hypre_MPI_Get_count #define MPI_Alltoall hypre_MPI_Alltoall #define MPI_Allgather hypre_MPI_Allgather #define MPI_Allgatherv hypre_MPI_Allgatherv #define MPI_Gather hypre_MPI_Gather #define MPI_Gatherv hypre_MPI_Gatherv #define MPI_Scatter hypre_MPI_Scatter #define MPI_Scatterv hypre_MPI_Scatterv #define MPI_Bcast hypre_MPI_Bcast #define MPI_Send hypre_MPI_Send #define MPI_Recv hypre_MPI_Recv #define MPI_Isend hypre_MPI_Isend #define MPI_Irecv hypre_MPI_Irecv #define MPI_Send_init hypre_MPI_Send_init #define MPI_Recv_init hypre_MPI_Recv_init #define MPI_Irsend hypre_MPI_Irsend #define MPI_Startall hypre_MPI_Startall #define MPI_Probe hypre_MPI_Probe #define MPI_Iprobe hypre_MPI_Iprobe #define MPI_Test hypre_MPI_Test #define MPI_Testall hypre_MPI_Testall #define MPI_Wait hypre_MPI_Wait #define MPI_Waitall hypre_MPI_Waitall #define MPI_Waitany hypre_MPI_Waitany #define MPI_Allreduce hypre_MPI_Allreduce #define MPI_Reduce hypre_MPI_Reduce #define MPI_Scan hypre_MPI_Scan #define MPI_Request_free hypre_MPI_Request_free #define MPI_Type_contiguous hypre_MPI_Type_contiguous #define MPI_Type_vector hypre_MPI_Type_vector #define MPI_Type_hvector hypre_MPI_Type_hvector #define MPI_Type_struct hypre_MPI_Type_struct #define MPI_Type_commit hypre_MPI_Type_commit #define MPI_Type_free hypre_MPI_Type_free #define MPI_Op_free hypre_MPI_Op_free #define MPI_Op_create hypre_MPI_Op_create #define MPI_User_function hypre_MPI_User_function #define MPI_Info_create hypre_MPI_Info_create /*-------------------------------------------------------------------------- * Types, etc. *--------------------------------------------------------------------------*/ /* These types have associated creation and destruction routines */ typedef HYPRE_Int hypre_MPI_Comm; typedef HYPRE_Int hypre_MPI_Group; typedef HYPRE_Int hypre_MPI_Request; typedef HYPRE_Int hypre_MPI_Datatype; typedef void (hypre_MPI_User_function) (void); typedef struct { HYPRE_Int hypre_MPI_SOURCE; HYPRE_Int hypre_MPI_TAG; } hypre_MPI_Status; typedef HYPRE_Int hypre_MPI_Op; typedef HYPRE_Int hypre_MPI_Aint; typedef HYPRE_Int hypre_MPI_Info; #define hypre_MPI_COMM_SELF 1 #define hypre_MPI_COMM_WORLD 0 #define hypre_MPI_COMM_NULL -1 #define hypre_MPI_COMM_TYPE_SHARED 0 #define hypre_MPI_BOTTOM 0x0 #define hypre_MPI_FLOAT 0 #define hypre_MPI_DOUBLE 1 #define hypre_MPI_LONG_DOUBLE 2 #define hypre_MPI_INT 3 #define hypre_MPI_CHAR 4 #define hypre_MPI_LONG 5 #define hypre_MPI_BYTE 6 #define hypre_MPI_REAL 7 #define hypre_MPI_COMPLEX 8 #define hypre_MPI_LONG_LONG_INT 9 #define hypre_MPI_SUM 0 #define hypre_MPI_MIN 1 #define hypre_MPI_MAX 2 #define hypre_MPI_LOR 3 #define hypre_MPI_LAND 4 #define hypre_MPI_BOR 5 #define hypre_MPI_SUCCESS 0 #define hypre_MPI_STATUSES_IGNORE 0 #define hypre_MPI_UNDEFINED -9999 #define hypre_MPI_REQUEST_NULL 0 #define hypre_MPI_INFO_NULL 0 #define hypre_MPI_ANY_SOURCE 1 #define hypre_MPI_ANY_TAG 1 #else /****************************************************************************** * MPI stubs to do casting of HYPRE_Int and hypre_int correctly *****************************************************************************/ typedef MPI_Comm hypre_MPI_Comm; typedef MPI_Group hypre_MPI_Group; typedef MPI_Request hypre_MPI_Request; typedef MPI_Datatype hypre_MPI_Datatype; typedef MPI_Status hypre_MPI_Status; typedef MPI_Op hypre_MPI_Op; typedef MPI_Aint hypre_MPI_Aint; typedef MPI_Info hypre_MPI_Info; typedef MPI_User_function hypre_MPI_User_function; #define hypre_MPI_COMM_WORLD MPI_COMM_WORLD #define hypre_MPI_COMM_NULL MPI_COMM_NULL #define hypre_MPI_BOTTOM MPI_BOTTOM #define hypre_MPI_COMM_SELF MPI_COMM_SELF #define hypre_MPI_COMM_TYPE_SHARED MPI_COMM_TYPE_SHARED #define hypre_MPI_FLOAT MPI_FLOAT #define hypre_MPI_DOUBLE MPI_DOUBLE #define hypre_MPI_LONG_DOUBLE MPI_LONG_DOUBLE /* HYPRE_MPI_INT is defined in HYPRE_utilities.h */ #define hypre_MPI_INT HYPRE_MPI_INT #define hypre_MPI_CHAR MPI_CHAR #define hypre_MPI_LONG MPI_LONG #define hypre_MPI_BYTE MPI_BYTE /* HYPRE_MPI_REAL is defined in HYPRE_utilities.h */ #define hypre_MPI_REAL HYPRE_MPI_REAL /* HYPRE_MPI_COMPLEX is defined in HYPRE_utilities.h */ #define hypre_MPI_COMPLEX HYPRE_MPI_COMPLEX #define hypre_MPI_SUM MPI_SUM #define hypre_MPI_MIN MPI_MIN #define hypre_MPI_MAX MPI_MAX #define hypre_MPI_LOR MPI_LOR #define hypre_MPI_BOR MPI_BOR #define hypre_MPI_SUCCESS MPI_SUCCESS #define hypre_MPI_STATUSES_IGNORE MPI_STATUSES_IGNORE #define hypre_MPI_UNDEFINED MPI_UNDEFINED #define hypre_MPI_REQUEST_NULL MPI_REQUEST_NULL #define hypre_MPI_INFO_NULL MPI_INFO_NULL #define hypre_MPI_ANY_SOURCE MPI_ANY_SOURCE #define hypre_MPI_ANY_TAG MPI_ANY_TAG #define hypre_MPI_SOURCE MPI_SOURCE #define hypre_MPI_TAG MPI_TAG #define hypre_MPI_LAND MPI_LAND #endif /****************************************************************************** * Everything below this applies to both ifdef cases above *****************************************************************************/ /*-------------------------------------------------------------------------- * Prototypes *--------------------------------------------------------------------------*/ /* mpistubs.c */ HYPRE_Int hypre_MPI_Init( hypre_int *argc, char ***argv ); HYPRE_Int hypre_MPI_Finalize( void ); HYPRE_Int hypre_MPI_Abort( hypre_MPI_Comm comm, HYPRE_Int errorcode ); HYPRE_Real hypre_MPI_Wtime( void ); HYPRE_Real hypre_MPI_Wtick( void ); HYPRE_Int hypre_MPI_Barrier( hypre_MPI_Comm comm ); HYPRE_Int hypre_MPI_Comm_create( hypre_MPI_Comm comm, hypre_MPI_Group group, hypre_MPI_Comm *newcomm ); HYPRE_Int hypre_MPI_Comm_dup( hypre_MPI_Comm comm, hypre_MPI_Comm *newcomm ); hypre_MPI_Comm hypre_MPI_Comm_f2c( hypre_int comm ); HYPRE_Int hypre_MPI_Comm_size( hypre_MPI_Comm comm, HYPRE_Int *size ); HYPRE_Int hypre_MPI_Comm_rank( hypre_MPI_Comm comm, HYPRE_Int *rank ); HYPRE_Int hypre_MPI_Comm_free( hypre_MPI_Comm *comm ); HYPRE_Int hypre_MPI_Comm_group( hypre_MPI_Comm comm, hypre_MPI_Group *group ); HYPRE_Int hypre_MPI_Comm_split( hypre_MPI_Comm comm, HYPRE_Int n, HYPRE_Int m, hypre_MPI_Comm * comms ); HYPRE_Int hypre_MPI_Group_incl( hypre_MPI_Group group, HYPRE_Int n, HYPRE_Int *ranks, hypre_MPI_Group *newgroup ); HYPRE_Int hypre_MPI_Group_free( hypre_MPI_Group *group ); HYPRE_Int hypre_MPI_Address( void *location, hypre_MPI_Aint *address ); HYPRE_Int hypre_MPI_Get_count( hypre_MPI_Status *status, hypre_MPI_Datatype datatype, HYPRE_Int *count ); HYPRE_Int hypre_MPI_Alltoall( void *sendbuf, HYPRE_Int sendcount, hypre_MPI_Datatype sendtype, void *recvbuf, HYPRE_Int recvcount, hypre_MPI_Datatype recvtype, hypre_MPI_Comm comm ); HYPRE_Int hypre_MPI_Allgather( void *sendbuf, HYPRE_Int sendcount, hypre_MPI_Datatype sendtype, void *recvbuf, HYPRE_Int recvcount, hypre_MPI_Datatype recvtype, hypre_MPI_Comm comm ); HYPRE_Int hypre_MPI_Allgatherv( void *sendbuf, HYPRE_Int sendcount, hypre_MPI_Datatype sendtype, void *recvbuf, HYPRE_Int *recvcounts, HYPRE_Int *displs, hypre_MPI_Datatype recvtype, hypre_MPI_Comm comm ); HYPRE_Int hypre_MPI_Gather( void *sendbuf, HYPRE_Int sendcount, hypre_MPI_Datatype sendtype, void *recvbuf, HYPRE_Int recvcount, hypre_MPI_Datatype recvtype, HYPRE_Int root, hypre_MPI_Comm comm ); HYPRE_Int hypre_MPI_Gatherv( void *sendbuf, HYPRE_Int sendcount, hypre_MPI_Datatype sendtype, void *recvbuf, HYPRE_Int *recvcounts, HYPRE_Int *displs, hypre_MPI_Datatype recvtype, HYPRE_Int root, hypre_MPI_Comm comm ); HYPRE_Int hypre_MPI_Scatter( void *sendbuf, HYPRE_Int sendcount, hypre_MPI_Datatype sendtype, void *recvbuf, HYPRE_Int recvcount, hypre_MPI_Datatype recvtype, HYPRE_Int root, hypre_MPI_Comm comm ); HYPRE_Int hypre_MPI_Scatterv( void *sendbuf, HYPRE_Int *sendcounts, HYPRE_Int *displs, hypre_MPI_Datatype sendtype, void *recvbuf, HYPRE_Int recvcount, hypre_MPI_Datatype recvtype, HYPRE_Int root, hypre_MPI_Comm comm ); HYPRE_Int hypre_MPI_Bcast( void *buffer, HYPRE_Int count, hypre_MPI_Datatype datatype, HYPRE_Int root, hypre_MPI_Comm comm ); HYPRE_Int hypre_MPI_Send( void *buf, HYPRE_Int count, hypre_MPI_Datatype datatype, HYPRE_Int dest, HYPRE_Int tag, hypre_MPI_Comm comm ); HYPRE_Int hypre_MPI_Recv( void *buf, HYPRE_Int count, hypre_MPI_Datatype datatype, HYPRE_Int source, HYPRE_Int tag, hypre_MPI_Comm comm, hypre_MPI_Status *status ); HYPRE_Int hypre_MPI_Isend( void *buf, HYPRE_Int count, hypre_MPI_Datatype datatype, HYPRE_Int dest, HYPRE_Int tag, hypre_MPI_Comm comm, hypre_MPI_Request *request ); HYPRE_Int hypre_MPI_Irecv( void *buf, HYPRE_Int count, hypre_MPI_Datatype datatype, HYPRE_Int source, HYPRE_Int tag, hypre_MPI_Comm comm, hypre_MPI_Request *request ); HYPRE_Int hypre_MPI_Send_init( void *buf, HYPRE_Int count, hypre_MPI_Datatype datatype, HYPRE_Int dest, HYPRE_Int tag, hypre_MPI_Comm comm, hypre_MPI_Request *request ); HYPRE_Int hypre_MPI_Recv_init( void *buf, HYPRE_Int count, hypre_MPI_Datatype datatype, HYPRE_Int dest, HYPRE_Int tag, hypre_MPI_Comm comm, hypre_MPI_Request *request ); HYPRE_Int hypre_MPI_Irsend( void *buf, HYPRE_Int count, hypre_MPI_Datatype datatype, HYPRE_Int dest, HYPRE_Int tag, hypre_MPI_Comm comm, hypre_MPI_Request *request ); HYPRE_Int hypre_MPI_Startall( HYPRE_Int count, hypre_MPI_Request *array_of_requests ); HYPRE_Int hypre_MPI_Probe( HYPRE_Int source, HYPRE_Int tag, hypre_MPI_Comm comm, hypre_MPI_Status *status ); HYPRE_Int hypre_MPI_Iprobe( HYPRE_Int source, HYPRE_Int tag, hypre_MPI_Comm comm, HYPRE_Int *flag, hypre_MPI_Status *status ); HYPRE_Int hypre_MPI_Test( hypre_MPI_Request *request, HYPRE_Int *flag, hypre_MPI_Status *status ); HYPRE_Int hypre_MPI_Testall( HYPRE_Int count, hypre_MPI_Request *array_of_requests, HYPRE_Int *flag, hypre_MPI_Status *array_of_statuses ); HYPRE_Int hypre_MPI_Wait( hypre_MPI_Request *request, hypre_MPI_Status *status ); HYPRE_Int hypre_MPI_Waitall( HYPRE_Int count, hypre_MPI_Request *array_of_requests, hypre_MPI_Status *array_of_statuses ); HYPRE_Int hypre_MPI_Waitany( HYPRE_Int count, hypre_MPI_Request *array_of_requests, HYPRE_Int *index, hypre_MPI_Status *status ); HYPRE_Int hypre_MPI_Allreduce( void *sendbuf, void *recvbuf, HYPRE_Int count, hypre_MPI_Datatype datatype, hypre_MPI_Op op, hypre_MPI_Comm comm ); HYPRE_Int hypre_MPI_Reduce( void *sendbuf, void *recvbuf, HYPRE_Int count, hypre_MPI_Datatype datatype, hypre_MPI_Op op, HYPRE_Int root, hypre_MPI_Comm comm ); HYPRE_Int hypre_MPI_Scan( void *sendbuf, void *recvbuf, HYPRE_Int count, hypre_MPI_Datatype datatype, hypre_MPI_Op op, hypre_MPI_Comm comm ); HYPRE_Int hypre_MPI_Request_free( hypre_MPI_Request *request ); HYPRE_Int hypre_MPI_Type_contiguous( HYPRE_Int count, hypre_MPI_Datatype oldtype, hypre_MPI_Datatype *newtype ); HYPRE_Int hypre_MPI_Type_vector( HYPRE_Int count, HYPRE_Int blocklength, HYPRE_Int stride, hypre_MPI_Datatype oldtype, hypre_MPI_Datatype *newtype ); HYPRE_Int hypre_MPI_Type_hvector( HYPRE_Int count, HYPRE_Int blocklength, hypre_MPI_Aint stride, hypre_MPI_Datatype oldtype, hypre_MPI_Datatype *newtype ); HYPRE_Int hypre_MPI_Type_struct( HYPRE_Int count, HYPRE_Int *array_of_blocklengths, hypre_MPI_Aint *array_of_displacements, hypre_MPI_Datatype *array_of_types, hypre_MPI_Datatype *newtype ); HYPRE_Int hypre_MPI_Type_commit( hypre_MPI_Datatype *datatype ); HYPRE_Int hypre_MPI_Type_free( hypre_MPI_Datatype *datatype ); HYPRE_Int hypre_MPI_Op_free( hypre_MPI_Op *op ); HYPRE_Int hypre_MPI_Op_create( hypre_MPI_User_function *function, hypre_int commute, hypre_MPI_Op *op ); #if defined(HYPRE_USING_GPU) || defined(HYPRE_USING_DEVICE_OPENMP) HYPRE_Int hypre_MPI_Comm_split_type(hypre_MPI_Comm comm, HYPRE_Int split_type, HYPRE_Int key, hypre_MPI_Info info, hypre_MPI_Comm *newcomm); HYPRE_Int hypre_MPI_Info_create(hypre_MPI_Info *info); HYPRE_Int hypre_MPI_Info_free( hypre_MPI_Info *info ); #endif #ifdef __cplusplus } #endif #endif hypre-2.33.0/src/utilities/nvtx.c000066400000000000000000000056501477326011500167070ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "_hypre_utilities.h" #if defined(HYPRE_USING_ROCTX) #include "hip/hip_runtime_api.h" #include "roctracer/roctx.h" #elif defined(HYPRE_USING_NVTX) #include #include #include #include "nvToolsExt.h" #include "nvToolsExtCudaRt.h" /* 16 named colors by HTML 4.01. Repalce white with Orange */ typedef enum { /* White, */ Orange, Silver, Gray, Black, Red, Maroon, Yellow, Olive, Lime, Green, Aqua, Teal, Blue, Navy, Fuchsia, Purple } color_names; static const uint32_t colors[] = { /* 0xFFFFFF, */ 0xFFA500, 0xC0C0C0, 0x808080, 0x000000, 0xFF0000, 0x800000, 0xFFFF00, 0x808000, 0x00FF00, 0x008000, 0x00FFFF, 0x008080, 0x0000FF, 0x000080, 0xFF00FF, 0x800080 }; static const HYPRE_Int hypre_nvtx_num_colors = sizeof(colors) / sizeof(uint32_t); static std::vector hypre_nvtx_range_names; #endif // defined(HYPRE_USING_NVTX) void hypre_GpuProfilingPushRangeColor(const char *name, HYPRE_Int color_id) { #if defined (HYPRE_USING_NVTX) color_id = color_id % hypre_nvtx_num_colors; nvtxEventAttributes_t eventAttrib = {0}; eventAttrib.version = NVTX_VERSION; eventAttrib.size = NVTX_EVENT_ATTRIB_STRUCT_SIZE; eventAttrib.colorType = NVTX_COLOR_ARGB; eventAttrib.color = colors[color_id]; eventAttrib.messageType = NVTX_MESSAGE_TYPE_ASCII; eventAttrib.message.ascii = name; nvtxRangePushEx(&eventAttrib); #elif defined (HYPRE_USING_ROCTX) roctxRangePush(name); #else HYPRE_UNUSED_VAR(name); HYPRE_UNUSED_VAR(color_id); #endif } void hypre_GpuProfilingPushRange(const char *name) { #if defined (HYPRE_USING_NVTX) std::vector::iterator p = std::find(hypre_nvtx_range_names.begin(), hypre_nvtx_range_names.end(), name); if (p == hypre_nvtx_range_names.end()) { hypre_nvtx_range_names.push_back(name); p = hypre_nvtx_range_names.end() - 1; } HYPRE_Int color = p - hypre_nvtx_range_names.begin(); hypre_GpuProfilingPushRangeColor(name, color); #elif defined (HYPRE_USING_ROCTX) roctxRangePush(name); #else HYPRE_UNUSED_VAR(name); #endif } void hypre_GpuProfilingPopRange(void) { #if defined (HYPRE_USING_NVTX) hypre_GpuProfilingPushRangeColor("StreamSync0", Red); cudaStreamSynchronize(0); nvtxRangePop(); nvtxRangePop(); #elif defined (HYPRE_USING_ROCTX) roctxRangePush("StreamSync0"); hipStreamSynchronize(0); roctxRangePop(); roctxRangePop(); #endif } hypre-2.33.0/src/utilities/omp_device.c000066400000000000000000000056701477326011500200240ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "_hypre_utilities.h" #if defined(HYPRE_USING_DEVICE_OPENMP) /* global variables for device OpenMP */ HYPRE_Int hypre__global_offload = 0; HYPRE_Int hypre__offload_device_num; HYPRE_Int hypre__offload_host_num; /* stats */ size_t hypre__target_allc_count = 0; size_t hypre__target_free_count = 0; size_t hypre__target_allc_bytes = 0; size_t hypre__target_free_bytes = 0; size_t hypre__target_htod_count = 0; size_t hypre__target_dtoh_count = 0; size_t hypre__target_htod_bytes = 0; size_t hypre__target_dtoh_bytes = 0; /* num: number of bytes */ HYPRE_Int HYPRE_OMPOffload(HYPRE_Int device, void *ptr, size_t num, const char *type1, const char *type2) { hypre_omp_device_offload(device, ptr, char, 0, num, type1, type2); return 0; } HYPRE_Int HYPRE_OMPPtrIsMapped(void *p, HYPRE_Int device_num) { if (hypre__global_offload && !omp_target_is_present(p, device_num)) { printf("HYPRE mapping error: %p has not been mapped to device %d!\n", p, device_num); return 1; } return 0; } /* OMP offloading switch */ HYPRE_Int HYPRE_OMPOffloadOn() { hypre__global_offload = 1; hypre__offload_device_num = omp_get_default_device(); hypre__offload_host_num = omp_get_initial_device(); /* HYPRE_Int myid, nproc; hypre_MPI_Comm_rank(hypre_MPI_COMM_WORLD, &myid); hypre_MPI_Comm_size(hypre_MPI_COMM_WORLD, &nproc); hypre_fprintf(stdout, "Proc %d: Hypre OMP 4.5 offloading has been turned on. Device %d\n", myid, hypre__offload_device_num); */ return 0; } HYPRE_Int HYPRE_OMPOffloadOff() { /* HYPRE_Int myid, nproc; hypre_MPI_Comm_rank(hypre_MPI_COMM_WORLD, &myid); hypre_MPI_Comm_size(hypre_MPI_COMM_WORLD, &nproc); fprintf(stdout, "Proc %d: Hypre OMP 4.5 offloading has been turned off\n", myid); */ hypre__global_offload = 0; hypre__offload_device_num = omp_get_initial_device(); hypre__offload_host_num = omp_get_initial_device(); return 0; } HYPRE_Int HYPRE_OMPOffloadStatPrint() { hypre_printf("Hypre OMP target memory stats:\n" " ALLOC %ld bytes, %ld counts\n" " FREE %ld bytes, %ld counts\n" " HTOD %ld bytes, %ld counts\n" " DTOH %ld bytes, %ld counts\n", hypre__target_allc_bytes, hypre__target_allc_count, hypre__target_free_bytes, hypre__target_free_count, hypre__target_htod_bytes, hypre__target_htod_count, hypre__target_dtoh_bytes, hypre__target_dtoh_count); return 0; } #endif /* #if defined(HYPRE_USING_DEVICE_OPENMP) */ hypre-2.33.0/src/utilities/omp_device.h000066400000000000000000000126601477326011500200260ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #ifndef HYPRE_OMP_DEVICE_H #define HYPRE_OMP_DEVICE_H #if defined(HYPRE_USING_DEVICE_OPENMP) #include "omp.h" /* OpenMP 4.5 device memory management */ extern HYPRE_Int hypre__global_offload; extern HYPRE_Int hypre__offload_device_num; extern HYPRE_Int hypre__offload_host_num; /* stats */ extern size_t hypre__target_allc_count; extern size_t hypre__target_free_count; extern size_t hypre__target_allc_bytes; extern size_t hypre__target_free_bytes; extern size_t hypre__target_htod_count; extern size_t hypre__target_dtoh_count; extern size_t hypre__target_htod_bytes; extern size_t hypre__target_dtoh_bytes; /* CHECK MODE: check if offloading has effect (turned on when configured with --enable-debug) * if we ``enter'' an address, it should not exist in device [o.w NO EFFECT] * if we ``exit'' or ''update'' an address, it should exist in device [o.w ERROR] * hypre__offload_flag: 0 == OK; 1 == WRONG */ #ifdef HYPRE_DEVICE_OPENMP_CHECK #define HYPRE_OFFLOAD_FLAG(devnum, hptr, type) HYPRE_Int hypre__offload_flag = (type[1] == 'n') == omp_target_is_present(hptr, devnum); #else #define HYPRE_OFFLOAD_FLAG(...) HYPRE_Int hypre__offload_flag = 0; /* non-debug mode, always OK */ #endif /* OMP 4.5 offloading macro */ #define hypre_omp_device_offload(devnum, hptr, datatype, offset, count, type1, type2) \ {\ /* devnum: device number \ * hptr: host poiter \ * datatype \ * type1: ``e(n)ter'', ''e(x)it'', or ``u(p)date'' \ * type2: ``(a)lloc'', ``(t)o'', ``(d)elete'', ''(f)rom'' \ */ \ datatype *hypre__offload_hptr = (datatype *) hptr; \ /* if hypre__global_offload == 0, or * hptr (host pointer) == NULL, * this offload will be IGNORED */ \ if (hypre__global_offload && hypre__offload_hptr != NULL) { \ /* offloading offset and size (in datatype) */ \ size_t hypre__offload_offset = offset, hypre__offload_size = count; \ /* in the CHECK mode, we test if this offload has effect */ \ HYPRE_OFFLOAD_FLAG(devnum, hypre__offload_hptr, type1) \ if (hypre__offload_flag) { \ printf("[!NO Effect! %s %d] device %d target: %6s %6s, data %p, [%ld:%ld]\n", __FILE__, __LINE__, devnum, type1, type2, (void *)hypre__offload_hptr, hypre__offload_offset, hypre__offload_size); exit(0); \ } else { \ size_t offload_bytes = count * sizeof(datatype); \ /* printf("[ %s %d] device %d target: %6s %6s, data %p, [%d:%d]\n", __FILE__, __LINE__, devnum, type1, type2, (void *)hypre__offload_hptr, hypre__offload_offset, hypre__offload_size); */ \ if (type1[1] == 'n' && type2[0] == 't') { \ /* enter to */\ hypre__target_allc_count ++; \ hypre__target_allc_bytes += offload_bytes; \ hypre__target_htod_count ++; \ hypre__target_htod_bytes += offload_bytes; \ _Pragma (HYPRE_XSTR(omp target enter data map(to:hypre__offload_hptr[hypre__offload_offset:hypre__offload_size]))) \ } else if (type1[1] == 'n' && type2[0] == 'a') { \ /* enter alloc */ \ hypre__target_allc_count ++; \ hypre__target_allc_bytes += offload_bytes; \ _Pragma (HYPRE_XSTR(omp target enter data map(alloc:hypre__offload_hptr[hypre__offload_offset:hypre__offload_size]))) \ } else if (type1[1] == 'x' && type2[0] == 'd') { \ /* exit delete */\ hypre__target_free_count ++; \ hypre__target_free_bytes += offload_bytes; \ _Pragma (HYPRE_XSTR(omp target exit data map(delete:hypre__offload_hptr[hypre__offload_offset:hypre__offload_size]))) \ } else if (type1[1] == 'x' && type2[0] == 'f') {\ /* exit from */ \ hypre__target_free_count ++; \ hypre__target_free_bytes += offload_bytes; \ hypre__target_dtoh_count ++; \ hypre__target_dtoh_bytes += offload_bytes; \ _Pragma (HYPRE_XSTR(omp target exit data map(from:hypre__offload_hptr[hypre__offload_offset:hypre__offload_size]))) \ } else if (type1[1] == 'p' && type2[0] == 't') { \ /* update to */ \ hypre__target_htod_count ++; \ hypre__target_htod_bytes += offload_bytes; \ _Pragma (HYPRE_XSTR(omp target update to(hypre__offload_hptr[hypre__offload_offset:hypre__offload_size]))) \ } else if (type1[1] == 'p' && type2[0] == 'f') {\ /* update from */ \ hypre__target_dtoh_count ++; \ hypre__target_dtoh_bytes += offload_bytes; \ _Pragma (HYPRE_XSTR(omp target update from(hypre__offload_hptr[hypre__offload_offset:hypre__offload_size]))) \ } else {\ printf("error: unrecognized offloading type combination!\n"); exit(-1); \ } \ } \ } \ } HYPRE_Int HYPRE_OMPOffload(HYPRE_Int device, void *ptr, size_t num, const char *type1, const char *type2); HYPRE_Int HYPRE_OMPPtrIsMapped(void *p, HYPRE_Int device_num); HYPRE_Int HYPRE_OMPOffloadOn(void); HYPRE_Int HYPRE_OMPOffloadOff(void); HYPRE_Int HYPRE_OMPOffloadStatPrint(void); #endif /* HYPRE_USING_DEVICE_OPENMP */ #endif /* HYPRE_OMP_DEVICE_H */ hypre-2.33.0/src/utilities/predicates.h000066400000000000000000000030311477326011500200270ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #ifndef HYPRE_PREDICATES_H #define HYPRE_PREDICATES_H /****************************************************************************** * * Header file defining predicates for thrust used throughout hypre * *****************************************************************************/ #if defined(HYPRE_USING_CUDA) || defined(HYPRE_USING_HIP) /*-------------------------------------------------------------------------- * hyprePred_StridedAccess * * This struct defines a predicate for strided access in array-like data. * * It is used to determine if an element at a given index should be processed * or not, based on a specified stride. The operator() returns true when the * index is a multiple of the stride, indicating the element at that index * is part of the strided subset. *--------------------------------------------------------------------------*/ struct hyprePred_StridedAccess { HYPRE_Int s_; hyprePred_StridedAccess(HYPRE_Int s) : s_(s) {} __host__ __device__ HYPRE_Int operator()(const HYPRE_Int i) const { return (!(i % s_)); } }; #endif /* if defined(HYPRE_USING_CUDA) || defined(HYPRE_USING_HIP) */ #endif /* ifndef HYPRE_PREDICATES_H */ hypre-2.33.0/src/utilities/prefix_sum.c000066400000000000000000000117171477326011500200720ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "_hypre_utilities.h" void hypre_prefix_sum(HYPRE_Int *in_out, HYPRE_Int *sum, HYPRE_Int *workspace) { #ifdef HYPRE_USING_OPENMP HYPRE_Int my_thread_num = hypre_GetThreadNum(); HYPRE_Int num_threads = hypre_NumActiveThreads(); hypre_assert(1 == num_threads || omp_in_parallel()); workspace[my_thread_num + 1] = *in_out; #pragma omp barrier #pragma omp master { HYPRE_Int i; workspace[0] = 0; for (i = 1; i < num_threads; i++) { workspace[i + 1] += workspace[i]; } *sum = workspace[num_threads]; } #pragma omp barrier *in_out = workspace[my_thread_num]; #else /* !HYPRE_USING_OPENMP */ *sum = *in_out; *in_out = 0; workspace[0] = 0; workspace[1] = *sum; #endif /* !HYPRE_USING_OPENMP */ } void hypre_prefix_sum_pair(HYPRE_Int *in_out1, HYPRE_Int *sum1, HYPRE_Int *in_out2, HYPRE_Int *sum2, HYPRE_Int *workspace) { #ifdef HYPRE_USING_OPENMP HYPRE_Int my_thread_num = hypre_GetThreadNum(); HYPRE_Int num_threads = hypre_NumActiveThreads(); hypre_assert(1 == num_threads || omp_in_parallel()); workspace[(my_thread_num + 1) * 2] = *in_out1; workspace[(my_thread_num + 1) * 2 + 1] = *in_out2; #pragma omp barrier #pragma omp master { HYPRE_Int i; workspace[0] = 0; workspace[1] = 0; for (i = 1; i < num_threads; i++) { workspace[(i + 1) * 2] += workspace[i * 2]; workspace[(i + 1) * 2 + 1] += workspace[i * 2 + 1]; } *sum1 = workspace[num_threads * 2]; *sum2 = workspace[num_threads * 2 + 1]; } #pragma omp barrier *in_out1 = workspace[my_thread_num * 2]; *in_out2 = workspace[my_thread_num * 2 + 1]; #else /* !HYPRE_USING_OPENMP */ *sum1 = *in_out1; *sum2 = *in_out2; *in_out1 = 0; *in_out2 = 0; workspace[0] = 0; workspace[1] = 0; workspace[2] = *sum1; workspace[3] = *sum2; #endif /* !HYPRE_USING_OPENMP */ } void hypre_prefix_sum_triple(HYPRE_Int *in_out1, HYPRE_Int *sum1, HYPRE_Int *in_out2, HYPRE_Int *sum2, HYPRE_Int *in_out3, HYPRE_Int *sum3, HYPRE_Int *workspace) { #ifdef HYPRE_USING_OPENMP HYPRE_Int my_thread_num = hypre_GetThreadNum(); HYPRE_Int num_threads = hypre_NumActiveThreads(); hypre_assert(1 == num_threads || omp_in_parallel()); workspace[(my_thread_num + 1) * 3] = *in_out1; workspace[(my_thread_num + 1) * 3 + 1] = *in_out2; workspace[(my_thread_num + 1) * 3 + 2] = *in_out3; #pragma omp barrier #pragma omp master { HYPRE_Int i; workspace[0] = 0; workspace[1] = 0; workspace[2] = 0; for (i = 1; i < num_threads; i++) { workspace[(i + 1) * 3] += workspace[i * 3]; workspace[(i + 1) * 3 + 1] += workspace[i * 3 + 1]; workspace[(i + 1) * 3 + 2] += workspace[i * 3 + 2]; } *sum1 = workspace[num_threads * 3]; *sum2 = workspace[num_threads * 3 + 1]; *sum3 = workspace[num_threads * 3 + 2]; } #pragma omp barrier *in_out1 = workspace[my_thread_num * 3]; *in_out2 = workspace[my_thread_num * 3 + 1]; *in_out3 = workspace[my_thread_num * 3 + 2]; #else /* !HYPRE_USING_OPENMP */ *sum1 = *in_out1; *sum2 = *in_out2; *sum3 = *in_out3; *in_out1 = 0; *in_out2 = 0; *in_out3 = 0; workspace[0] = 0; workspace[1] = 0; workspace[2] = 0; workspace[3] = *sum1; workspace[4] = *sum2; workspace[5] = *sum3; #endif /* !HYPRE_USING_OPENMP */ } void hypre_prefix_sum_multiple(HYPRE_Int *in_out, HYPRE_Int *sum, HYPRE_Int n, HYPRE_Int *workspace) { HYPRE_Int i; #ifdef HYPRE_USING_OPENMP HYPRE_Int my_thread_num = hypre_GetThreadNum(); HYPRE_Int num_threads = hypre_NumActiveThreads(); hypre_assert(1 == num_threads || omp_in_parallel()); for (i = 0; i < n; i++) { workspace[(my_thread_num + 1)*n + i] = in_out[i]; } #pragma omp barrier #pragma omp master { HYPRE_Int t; for (i = 0; i < n; i++) { workspace[i] = 0; } // assuming n is not so big, we don't parallelize this loop for (t = 1; t < num_threads; t++) { for (i = 0; i < n; i++) { workspace[(t + 1)*n + i] += workspace[t * n + i]; } } for (i = 0; i < n; i++) { sum[i] = workspace[num_threads * n + i]; } } #pragma omp barrier for (i = 0; i < n; i++) { in_out[i] = workspace[my_thread_num * n + i]; } #else /* !HYPRE_USING_OPENMP */ for (i = 0; i < n; i++) { sum[i] = in_out[i]; in_out[i] = 0; workspace[i] = 0; workspace[n + i] = sum[i]; } #endif /* !HYPRE_USING_OPENMP */ } hypre-2.33.0/src/utilities/printf.c000066400000000000000000000136061477326011500172120ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "_hypre_utilities.h" #include #include #define hypre_printf_buffer_len 4096 char hypre_printf_buffer[hypre_printf_buffer_len]; // #ifdef HYPRE_BIGINT /* these prototypes are missing by default for some compilers */ /* int vscanf( const char *format , va_list arg ); int vfscanf( FILE *stream , const char *format, va_list arg ); int vsscanf( const char *s , const char *format, va_list arg ); */ HYPRE_Int new_format( const char *format, char **newformat_ptr ) { const char *fp; char *newformat, *nfp; HYPRE_Int newformatlen; HYPRE_Int copychar; HYPRE_Int foundpercent = 0; newformatlen = 2 * strlen(format) + 1; /* worst case is all %d's to %lld's */ if (newformatlen > hypre_printf_buffer_len) { newformat = hypre_TAlloc(char, newformatlen, HYPRE_MEMORY_HOST); } else { newformat = hypre_printf_buffer; } nfp = newformat; for (fp = format; *fp != '\0'; fp++) { copychar = 1; if (*fp == '%') { foundpercent = 1; } else if (foundpercent) { if (*fp == 'l') { fp++; /* remove 'l' and maybe add it back in switch statement */ if (*fp == 'l') { fp++; /* remove second 'l' if present */ } } switch (*fp) { case 'b': /* used for BigInt type in hypre */ #if defined(HYPRE_BIGINT) || defined(HYPRE_MIXEDINT) *nfp = 'l'; nfp++; *nfp = 'l'; nfp++; #endif *nfp = 'd'; nfp++; copychar = 0; foundpercent = 0; break; case 'd': case 'i': #if defined(HYPRE_BIGINT) *nfp = 'l'; nfp++; *nfp = 'l'; nfp++; #endif foundpercent = 0; break; case 'f': case 'e': case 'E': case 'g': case 'G': #if defined(HYPRE_SINGLE) /* no modifier */ #elif defined(HYPRE_LONG_DOUBLE) /* modify with 'L' */ *nfp = 'L'; nfp++; #else /* modify with 'l' (default is _double_) */ *nfp = 'l'; nfp++; #endif foundpercent = 0; break; case 'c': case 'n': case 'o': case 'p': case 's': case 'u': case 'x': case 'X': case '%': foundpercent = 0; break; } } if (copychar) { *nfp = *fp; nfp++; } } *nfp = *fp; *newformat_ptr = newformat; /* printf("\nNEWFORMAT: %s\n", *newformat_ptr);*/ return 0; } HYPRE_Int free_format( char *newformat ) { if (newformat != hypre_printf_buffer) { hypre_TFree(newformat, HYPRE_MEMORY_HOST); } return 0; } HYPRE_Int hypre_ndigits( HYPRE_BigInt number ) { HYPRE_Int ndigits = 0; while (number) { number /= 10; ndigits++; } return ndigits; } /* printf functions */ HYPRE_Int hypre_printf( const char *format, ...) { va_list ap; char *newformat; HYPRE_Int ierr = 0; va_start(ap, format); new_format(format, &newformat); ierr = vprintf(newformat, ap); free_format(newformat); va_end(ap); fflush(stdout); return ierr; } HYPRE_Int hypre_fprintf( FILE *stream, const char *format, ...) { va_list ap; char *newformat; HYPRE_Int ierr = 0; va_start(ap, format); new_format(format, &newformat); ierr = vfprintf(stream, newformat, ap); free_format(newformat); va_end(ap); return ierr; } HYPRE_Int hypre_sprintf( char *s, const char *format, ...) { va_list ap; char *newformat; HYPRE_Int ierr = 0; va_start(ap, format); new_format(format, &newformat); ierr = vsprintf(s, newformat, ap); free_format(newformat); va_end(ap); return ierr; } HYPRE_Int hypre_snprintf( char *s, size_t size, const char *format, ...) { va_list ap; char *newformat; HYPRE_Int ierr = 0; va_start(ap, format); new_format(format, &newformat); ierr = vsnprintf(s, size, newformat, ap); free_format(newformat); va_end(ap); return ierr; } /* scanf functions */ HYPRE_Int hypre_scanf( const char *format, ...) { va_list ap; char *newformat; HYPRE_Int ierr = 0; va_start(ap, format); new_format(format, &newformat); ierr = vscanf(newformat, ap); free_format(newformat); va_end(ap); return ierr; } HYPRE_Int hypre_fscanf( FILE *stream, const char *format, ...) { va_list ap; char *newformat; HYPRE_Int ierr = 0; va_start(ap, format); new_format(format, &newformat); ierr = vfscanf(stream, newformat, ap); free_format(newformat); va_end(ap); return ierr; } HYPRE_Int hypre_sscanf( char *s, const char *format, ...) { va_list ap; char *newformat; HYPRE_Int ierr = 0; va_start(ap, format); new_format(format, &newformat); ierr = vsscanf(s, newformat, ap); free_format(newformat); va_end(ap); return ierr; } HYPRE_Int hypre_ParPrintf(MPI_Comm comm, const char *format, ...) { HYPRE_Int my_id; HYPRE_Int ierr = hypre_MPI_Comm_rank(comm, &my_id); if (ierr) { return ierr; } if (!my_id) { va_list ap; char *newformat; va_start(ap, format); new_format(format, &newformat); ierr = vprintf(newformat, ap); free_format(newformat); va_end(ap); fflush(stdout); } return ierr; } // #else // // /* this is used only to eliminate compiler warnings */ // HYPRE_Int hypre_printf_empty; // // #endif hypre-2.33.0/src/utilities/printf.h000066400000000000000000000023271477326011500172150ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #ifndef hypre_PRINTF_HEADER #define hypre_PRINTF_HEADER #include /* printf.c */ // #ifdef HYPRE_BIGINT HYPRE_Int hypre_ndigits( HYPRE_BigInt number ); HYPRE_Int hypre_printf( const char *format, ... ); HYPRE_Int hypre_fprintf( FILE *stream, const char *format, ... ); HYPRE_Int hypre_sprintf( char *s, const char *format, ... ); HYPRE_Int hypre_snprintf( char *s, size_t size, const char *format, ...); HYPRE_Int hypre_scanf( const char *format, ... ); HYPRE_Int hypre_fscanf( FILE *stream, const char *format, ... ); HYPRE_Int hypre_sscanf( char *s, const char *format, ... ); HYPRE_Int hypre_ParPrintf(MPI_Comm comm, const char *format, ...); // #else // #define hypre_printf printf // #define hypre_fprintf fprintf // #define hypre_sprintf sprintf // #define hypre_scanf scanf // #define hypre_fscanf fscanf // #define hypre_sscanf sscanf // #endif #endif hypre-2.33.0/src/utilities/protos000077500000000000000000000007041477326011500170130ustar00rootroot00000000000000#!/bin/bash # Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) while [ $# -ge 1 ]; do echo ""; echo "/* $1 */" perl -e 'while ($line = <>) {if ($line =~ /#else|#elif/) {0 while(<> !~ /#endif/);} elsif ($line !~ /#if|#endif/) {print("$line");}}' $1 | mkproto -p | grep -v " main[ (]" shift done hypre-2.33.0/src/utilities/protos.h000066400000000000000000000600331477326011500172370ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /* amg_linklist.c */ void hypre_dispose_elt ( hypre_LinkList element_ptr ); void hypre_remove_point ( hypre_LinkList *LoL_head_ptr, hypre_LinkList *LoL_tail_ptr, HYPRE_Int measure, HYPRE_Int index, HYPRE_Int *lists, HYPRE_Int *where ); hypre_LinkList hypre_create_elt ( HYPRE_Int Item ); void hypre_enter_on_lists ( hypre_LinkList *LoL_head_ptr, hypre_LinkList *LoL_tail_ptr, HYPRE_Int measure, HYPRE_Int index, HYPRE_Int *lists, HYPRE_Int *where ); /* binsearch.c */ HYPRE_Int hypre_BinarySearch ( HYPRE_Int *list, HYPRE_Int value, HYPRE_Int list_length ); HYPRE_Int hypre_BigBinarySearch ( HYPRE_BigInt *list, HYPRE_BigInt value, HYPRE_Int list_length ); HYPRE_Int hypre_BinarySearch2 ( HYPRE_Int *list, HYPRE_Int value, HYPRE_Int low, HYPRE_Int high, HYPRE_Int *spot ); HYPRE_Int *hypre_LowerBound( HYPRE_Int *first, HYPRE_Int *last, HYPRE_Int value ); HYPRE_BigInt *hypre_BigLowerBound( HYPRE_BigInt *first, HYPRE_BigInt *last, HYPRE_BigInt value ); /* log.c */ HYPRE_Int hypre_Log2( HYPRE_Int p ); /* complex.c */ #ifdef HYPRE_COMPLEX HYPRE_Complex hypre_conj( HYPRE_Complex value ); HYPRE_Real hypre_cabs( HYPRE_Complex value ); HYPRE_Real hypre_creal( HYPRE_Complex value ); HYPRE_Real hypre_cimag( HYPRE_Complex value ); HYPRE_Complex hypre_csqrt( HYPRE_Complex value ); #else #define hypre_conj(value) value #define hypre_cabs(value) hypre_abs(value) #define hypre_creal(value) value #define hypre_cimag(value) 0.0 #define hypre_csqrt(value) hypre_sqrt(value) #endif /* state.c */ HYPRE_Int hypre_Initialized( void ); HYPRE_Int hypre_Finalized( void ); HYPRE_Int hypre_SetInitialized( void ); HYPRE_Int hypre_SetFinalized( void ); /* general.c */ hypre_Handle* hypre_handle(void); hypre_Handle* hypre_HandleCreate(void); HYPRE_Int hypre_HandleDestroy(hypre_Handle *hypre_handle_); HYPRE_Int hypre_SetDevice(hypre_int device_id, hypre_Handle *hypre_handle_); HYPRE_Int hypre_GetDevice(hypre_int *device_id); HYPRE_Int hypre_GetDeviceCount(hypre_int *device_count); HYPRE_Int hypre_GetDeviceLastError(void); HYPRE_Int hypre_GetDeviceMaxShmemSize(hypre_int device_id, hypre_int *max_size_ptr, hypre_int *max_size_optin_ptr); /* matrix_stats.h */ hypre_MatrixStats* hypre_MatrixStatsCreate( void ); HYPRE_Int hypre_MatrixStatsDestroy( hypre_MatrixStats *stats ); hypre_MatrixStatsArray* hypre_MatrixStatsArrayCreate( HYPRE_Int capacity ); HYPRE_Int hypre_MatrixStatsArrayDestroy( hypre_MatrixStatsArray *stats_array ); HYPRE_Int hypre_MatrixStatsArrayPrint( HYPRE_Int num_hierarchies, HYPRE_Int *num_levels, HYPRE_Int use_divisors, HYPRE_Int shift, const char **messages, hypre_MatrixStatsArray *stats_array ); /* qsort.c */ void hypre_swap ( HYPRE_Int *v, HYPRE_Int i, HYPRE_Int j ); void hypre_swap_c ( HYPRE_Complex *v, HYPRE_Int i, HYPRE_Int j ); void hypre_swap2 ( HYPRE_Int *v, HYPRE_Real *w, HYPRE_Int i, HYPRE_Int j ); void hypre_BigSwap2 ( HYPRE_BigInt *v, HYPRE_Real *w, HYPRE_Int i, HYPRE_Int j ); void hypre_swap2i ( HYPRE_Int *v, HYPRE_Int *w, HYPRE_Int i, HYPRE_Int j ); void hypre_BigSwap2i ( HYPRE_BigInt *v, HYPRE_Int *w, HYPRE_Int i, HYPRE_Int j ); void hypre_swap3i ( HYPRE_Int *v, HYPRE_Int *w, HYPRE_Int *z, HYPRE_Int i, HYPRE_Int j ); void hypre_swap3_d ( HYPRE_Real *v, HYPRE_Int *w, HYPRE_Int *z, HYPRE_Int i, HYPRE_Int j ); void hypre_swap3_d_perm(HYPRE_Int *v, HYPRE_Real *w, HYPRE_Int *z, HYPRE_Int i, HYPRE_Int j ); void hypre_BigSwap4_d ( HYPRE_Real *v, HYPRE_BigInt *w, HYPRE_Int *z, HYPRE_Int *y, HYPRE_Int i, HYPRE_Int j ); void hypre_swap_d ( HYPRE_Real *v, HYPRE_Int i, HYPRE_Int j ); void hypre_qsort0 ( HYPRE_Int *v, HYPRE_Int left, HYPRE_Int right ); void hypre_qsort1 ( HYPRE_Int *v, HYPRE_Real *w, HYPRE_Int left, HYPRE_Int right ); void hypre_BigQsort1 ( HYPRE_BigInt *v, HYPRE_Real *w, HYPRE_Int left, HYPRE_Int right ); void hypre_qsort2i ( HYPRE_Int *v, HYPRE_Int *w, HYPRE_Int left, HYPRE_Int right ); void hypre_BigQsort2i( HYPRE_BigInt *v, HYPRE_Int *w, HYPRE_Int left, HYPRE_Int right ); void hypre_qsort2 ( HYPRE_Int *v, HYPRE_Real *w, HYPRE_Int left, HYPRE_Int right ); void hypre_qsort2_abs ( HYPRE_Int *v, HYPRE_Real *w, HYPRE_Int left, HYPRE_Int right ); void hypre_qsort3i ( HYPRE_Int *v, HYPRE_Int *w, HYPRE_Int *z, HYPRE_Int left, HYPRE_Int right ); void hypre_qsort3ir ( HYPRE_Int *v, HYPRE_Real *w, HYPRE_Int *z, HYPRE_Int left, HYPRE_Int right ); void hypre_qsort3( HYPRE_Real *v, HYPRE_Int *w, HYPRE_Int *z, HYPRE_Int left, HYPRE_Int right ); void hypre_qsort3_abs ( HYPRE_Real *v, HYPRE_Int *w, HYPRE_Int *z, HYPRE_Int left, HYPRE_Int right ); void hypre_BigQsort4_abs ( HYPRE_Real *v, HYPRE_BigInt *w, HYPRE_Int *z, HYPRE_Int *y, HYPRE_Int left, HYPRE_Int right ); void hypre_qsort_abs ( HYPRE_Real *w, HYPRE_Int left, HYPRE_Int right ); void hypre_BigSwapbi(HYPRE_BigInt *v, HYPRE_Int *w, HYPRE_Int i, HYPRE_Int j ); void hypre_BigQsortbi( HYPRE_BigInt *v, HYPRE_Int *w, HYPRE_Int left, HYPRE_Int right ); void hypre_BigSwapLoc(HYPRE_BigInt *v, HYPRE_Int *w, HYPRE_Int i, HYPRE_Int j ); void hypre_BigQsortbLoc( HYPRE_BigInt *v, HYPRE_Int *w, HYPRE_Int left, HYPRE_Int right ); void hypre_BigSwapb2i(HYPRE_BigInt *v, HYPRE_Int *w, HYPRE_Int *z, HYPRE_Int i, HYPRE_Int j ); void hypre_BigQsortb2i( HYPRE_BigInt *v, HYPRE_Int *w, HYPRE_Int *z, HYPRE_Int left, HYPRE_Int right ); void hypre_BigSwap( HYPRE_BigInt *v, HYPRE_Int i, HYPRE_Int j ); void hypre_BigQsort0( HYPRE_BigInt *v, HYPRE_Int left, HYPRE_Int right ); void hypre_topo_sort(const HYPRE_Int *row_ptr, const HYPRE_Int *col_inds, const HYPRE_Complex *data, HYPRE_Int *ordering, HYPRE_Int n); void hypre_dense_topo_sort(const HYPRE_Complex *L, HYPRE_Int *ordering, HYPRE_Int n, HYPRE_Int is_col_major); /* qsplit.c */ HYPRE_Int hypre_DoubleQuickSplit ( HYPRE_Real *values, HYPRE_Int *indices, HYPRE_Int list_length, HYPRE_Int NumberKept ); /* random.c */ /* HYPRE_CUDA_GLOBAL */ void hypre_SeedRand ( HYPRE_Int seed ); /* HYPRE_CUDA_GLOBAL */ HYPRE_Int hypre_RandI ( void ); /* HYPRE_CUDA_GLOBAL */ HYPRE_Real hypre_Rand ( void ); /* prefix_sum.c */ /** * Assumed to be called within an omp region. * Let x_i be the input of ith thread. * The output of ith thread y_i = x_0 + x_1 + ... + x_{i-1} * Additionally, sum = x_0 + x_1 + ... + x_{nthreads - 1} * Note that always y_0 = 0 * * @param workspace at least with length (nthreads+1) * workspace[tid] will contain result for tid * workspace[nthreads] will contain sum */ void hypre_prefix_sum(HYPRE_Int *in_out, HYPRE_Int *sum, HYPRE_Int *workspace); /** * This version does prefix sum in pair. * Useful when we prefix sum of diag and offd in tandem. * * @param worksapce at least with length 2*(nthreads+1) * workspace[2*tid] and workspace[2*tid+1] will contain results for tid * workspace[3*nthreads] and workspace[3*nthreads + 1] will contain sums */ void hypre_prefix_sum_pair(HYPRE_Int *in_out1, HYPRE_Int *sum1, HYPRE_Int *in_out2, HYPRE_Int *sum2, HYPRE_Int *workspace); /** * @param workspace at least with length 3*(nthreads+1) * workspace[3*tid:3*tid+3) will contain results for tid */ void hypre_prefix_sum_triple(HYPRE_Int *in_out1, HYPRE_Int *sum1, HYPRE_Int *in_out2, HYPRE_Int *sum2, HYPRE_Int *in_out3, HYPRE_Int *sum3, HYPRE_Int *workspace); /** * n prefix-sums together. * workspace[n*tid:n*(tid+1)) will contain results for tid * workspace[nthreads*tid:nthreads*(tid+1)) will contain sums * * @param workspace at least with length n*(nthreads+1) */ void hypre_prefix_sum_multiple(HYPRE_Int *in_out, HYPRE_Int *sum, HYPRE_Int n, HYPRE_Int *workspace); /* hopscotch_hash.c */ #ifdef HYPRE_USING_OPENMP /* Check if atomic operations are available to use concurrent hopscotch hash table */ #if defined(__GNUC__) && defined(__GNUC_MINOR__) && defined(__GNUC_PATCHLEVEL__) && (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__) > 40100 #define HYPRE_USING_ATOMIC //#elif defined _MSC_VER // JSP: haven't tested, so comment out for now //#define HYPRE_USING_ATOMIC //#elif defined(__STDC_VERSION__) && __STDC_VERSION__ >= 201112L && !defined(__STDC_NO_ATOMICS__) // JSP: not many compilers have implemented this, so comment out for now //#define HYPRE_USING_ATOMIC //#include #endif #endif // HYPRE_USING_OPENMP #ifdef HYPRE_USING_HOPSCOTCH #ifdef HYPRE_USING_ATOMIC // concurrent hopscotch hashing is possible only with atomic supports #define HYPRE_CONCURRENT_HOPSCOTCH #endif #endif #ifdef HYPRE_CONCURRENT_HOPSCOTCH typedef struct { HYPRE_Int volatile timestamp; omp_lock_t lock; } hypre_HopscotchSegment; #endif /** * The current typical use case of unordered set is putting input sequence * with lots of duplication (putting all colidx received from other ranks), * followed by one sweep of enumeration. * Since the capacity is set to the number of inputs, which is much larger * than the number of unique elements, we optimize for initialization and * enumeration whose time is proportional to the capacity. * For initialization and enumeration, structure of array (SoA) is better * for vectorization, cache line utilization, and so on. */ typedef struct { HYPRE_Int volatile segmentMask; HYPRE_Int volatile bucketMask; #ifdef HYPRE_CONCURRENT_HOPSCOTCH hypre_HopscotchSegment* volatile segments; #endif HYPRE_Int *volatile key; hypre_uint *volatile hopInfo; HYPRE_Int *volatile hash; } hypre_UnorderedIntSet; typedef struct { HYPRE_Int volatile segmentMask; HYPRE_Int volatile bucketMask; #ifdef HYPRE_CONCURRENT_HOPSCOTCH hypre_HopscotchSegment* volatile segments; #endif HYPRE_BigInt *volatile key; hypre_uint *volatile hopInfo; HYPRE_BigInt *volatile hash; } hypre_UnorderedBigIntSet; typedef struct { hypre_uint volatile hopInfo; HYPRE_Int volatile hash; HYPRE_Int volatile key; HYPRE_Int volatile data; } hypre_HopscotchBucket; typedef struct { hypre_uint volatile hopInfo; HYPRE_BigInt volatile hash; HYPRE_BigInt volatile key; HYPRE_Int volatile data; } hypre_BigHopscotchBucket; /** * The current typical use case of unoredered map is putting input sequence * with no duplication (inverse map of a bijective mapping) followed by * lots of lookups. * For lookup, array of structure (AoS) gives better cache line utilization. */ typedef struct { HYPRE_Int volatile segmentMask; HYPRE_Int volatile bucketMask; #ifdef HYPRE_CONCURRENT_HOPSCOTCH hypre_HopscotchSegment* volatile segments; #endif hypre_HopscotchBucket* volatile table; } hypre_UnorderedIntMap; typedef struct { HYPRE_Int volatile segmentMask; HYPRE_Int volatile bucketMask; #ifdef HYPRE_CONCURRENT_HOPSCOTCH hypre_HopscotchSegment* volatile segments; #endif hypre_BigHopscotchBucket* volatile table; } hypre_UnorderedBigIntMap; /* merge_sort.c */ /** * Why merge sort? * 1) Merge sort can take advantage of eliminating duplicates. * 2) Merge sort is more efficiently parallelizable than qsort */ HYPRE_Int hypre_IntArrayMergeOrdered( hypre_IntArray *array1, hypre_IntArray *array2, hypre_IntArray *array3 ); void hypre_union2(HYPRE_Int n1, HYPRE_BigInt *arr1, HYPRE_Int n2, HYPRE_BigInt *arr2, HYPRE_Int *n3, HYPRE_BigInt *arr3, HYPRE_Int *map1, HYPRE_Int *map2); void hypre_merge_sort(HYPRE_Int *in, HYPRE_Int *temp, HYPRE_Int len, HYPRE_Int **sorted); void hypre_big_merge_sort(HYPRE_BigInt *in, HYPRE_BigInt *temp, HYPRE_Int len, HYPRE_BigInt **sorted); void hypre_sort_and_create_inverse_map(HYPRE_Int *in, HYPRE_Int len, HYPRE_Int **out, hypre_UnorderedIntMap *inverse_map); void hypre_big_sort_and_create_inverse_map(HYPRE_BigInt *in, HYPRE_Int len, HYPRE_BigInt **out, hypre_UnorderedBigIntMap *inverse_map); /* device_utils.c */ #if defined(HYPRE_USING_GPU) HYPRE_Int hypre_DeviceMemoryGetUsage(HYPRE_Real *mem); HYPRE_Int hypre_ForceSyncComputeStream(); HYPRE_Int hypre_SyncComputeStream(); HYPRE_Int hypre_SyncDevice(); HYPRE_Int hypre_ResetDevice(); HYPRE_Int hypreDevice_DiagScaleVector(HYPRE_Int num_vectors, HYPRE_Int num_rows, HYPRE_Int *A_i, HYPRE_Complex *A_data, HYPRE_Complex *x, HYPRE_Complex beta, HYPRE_Complex *y); HYPRE_Int hypreDevice_DiagScaleVector2(HYPRE_Int num_vectors, HYPRE_Int num_rows, HYPRE_Complex *diag, HYPRE_Complex *x, HYPRE_Complex beta, HYPRE_Complex *y, HYPRE_Complex *z, HYPRE_Int computeY); HYPRE_Int hypreDevice_ComplexArrayToArrayOfPtrs(HYPRE_Int n, HYPRE_Int m, HYPRE_Complex *data, HYPRE_Complex **data_aop); HYPRE_Int hypreDevice_zeqxmydd(HYPRE_Int n, HYPRE_Complex *x, HYPRE_Complex alpha, HYPRE_Complex *y, HYPRE_Complex *z, HYPRE_Complex *d); HYPRE_Int hypreDevice_IVAXPY(HYPRE_Int n, HYPRE_Complex *a, HYPRE_Complex *x, HYPRE_Complex *y); HYPRE_Int hypreDevice_IVAXPYMarked(HYPRE_Int n, HYPRE_Complex *a, HYPRE_Complex *x, HYPRE_Complex *y, HYPRE_Int *marker, HYPRE_Int marker_val); HYPRE_Int hypreDevice_IVAMXPMY(HYPRE_Int m, HYPRE_Int n, HYPRE_Complex *a, HYPRE_Complex *x, HYPRE_Complex *y); HYPRE_Int hypreDevice_IntFilln(HYPRE_Int *d_x, size_t n, HYPRE_Int v); HYPRE_Int hypreDevice_BigIntFilln(HYPRE_BigInt *d_x, size_t n, HYPRE_BigInt v); HYPRE_Int hypreDevice_ComplexFilln(HYPRE_Complex *d_x, size_t n, HYPRE_Complex v); HYPRE_Int hypreDevice_CharFilln(char *d_x, size_t n, char v); HYPRE_Int hypreDevice_IntStridedCopy ( HYPRE_Int size, HYPRE_Int stride, HYPRE_Int *in, HYPRE_Int *out ); HYPRE_Int hypreDevice_ComplexStridedCopy ( HYPRE_Int size, HYPRE_Int stride, HYPRE_Complex *in, HYPRE_Complex *out ); HYPRE_Int hypreDevice_IntScalen(HYPRE_Int *d_x, size_t n, HYPRE_Int *d_y, HYPRE_Int v); HYPRE_Int hypreDevice_ComplexScalen(HYPRE_Complex *d_x, size_t n, HYPRE_Complex *d_y, HYPRE_Complex v); HYPRE_Int hypreDevice_ComplexAxpyn(HYPRE_Complex *d_x, size_t n, HYPRE_Complex *d_y, HYPRE_Complex *d_z, HYPRE_Complex a); HYPRE_Int hypreDevice_ComplexAxpyzn(HYPRE_Int n, HYPRE_Complex *d_x, HYPRE_Complex *d_y, HYPRE_Complex *d_z, HYPRE_Complex a, HYPRE_Complex b); HYPRE_Int hypreDevice_IntAxpyn(HYPRE_Int *d_x, size_t n, HYPRE_Int *d_y, HYPRE_Int *d_z, HYPRE_Int a); HYPRE_Int hypreDevice_BigIntAxpyn(HYPRE_BigInt *d_x, size_t n, HYPRE_BigInt *d_y, HYPRE_BigInt *d_z, HYPRE_BigInt a); HYPRE_Int* hypreDevice_CsrRowPtrsToIndices(HYPRE_Int nrows, HYPRE_Int nnz, HYPRE_Int *d_row_ptr); HYPRE_Int hypreDevice_CsrRowPtrsToIndices_v2(HYPRE_Int nrows, HYPRE_Int nnz, HYPRE_Int *d_row_ptr, HYPRE_Int *d_row_ind); HYPRE_Int* hypreDevice_CsrRowIndicesToPtrs(HYPRE_Int nrows, HYPRE_Int nnz, HYPRE_Int *d_row_ind); HYPRE_Int hypreDevice_CsrRowIndicesToPtrs_v2(HYPRE_Int nrows, HYPRE_Int nnz, HYPRE_Int *d_row_ind, HYPRE_Int *d_row_ptr); HYPRE_Int hypreDevice_GetRowNnz(HYPRE_Int nrows, HYPRE_Int *d_row_indices, HYPRE_Int *d_diag_ia, HYPRE_Int *d_offd_ia, HYPRE_Int *d_rownnz); HYPRE_Int hypreDevice_CopyParCSRRows(HYPRE_Int nrows, HYPRE_Int *d_row_indices, HYPRE_Int job, HYPRE_Int has_offd, HYPRE_BigInt first_col, HYPRE_BigInt *d_col_map_offd_A, HYPRE_Int *d_diag_i, HYPRE_Int *d_diag_j, HYPRE_Complex *d_diag_a, HYPRE_Int *d_offd_i, HYPRE_Int *d_offd_j, HYPRE_Complex *d_offd_a, HYPRE_Int *d_ib, HYPRE_BigInt *d_jb, HYPRE_Complex *d_ab); HYPRE_Int hypreDevice_IntegerReduceSum(HYPRE_Int m, HYPRE_Int *d_i); HYPRE_Complex hypreDevice_ComplexReduceSum(HYPRE_Int m, HYPRE_Complex *d_x); HYPRE_Int hypreDevice_IntegerInclusiveScan(HYPRE_Int n, HYPRE_Int *d_i); HYPRE_Int hypreDevice_IntegerExclusiveScan(HYPRE_Int n, HYPRE_Int *d_i); HYPRE_Int hypre_CudaCompileFlagCheck(void); #endif HYPRE_Int hypre_CurandUniform( HYPRE_Int n, HYPRE_Real *urand, HYPRE_Int set_seed, hypre_ulonglongint seed, HYPRE_Int set_offset, hypre_ulonglongint offset); HYPRE_Int hypre_CurandUniformSingle( HYPRE_Int n, float *urand, HYPRE_Int set_seed, hypre_ulonglongint seed, HYPRE_Int set_offset, hypre_ulonglongint offset); HYPRE_Int hypre_ResetDeviceRandGenerator( hypre_ulonglongint seed, hypre_ulonglongint offset ); HYPRE_Int hypre_bind_device_id(HYPRE_Int device_id_in, HYPRE_Int myid, HYPRE_Int nproc, MPI_Comm comm); HYPRE_Int hypre_bind_device(HYPRE_Int myid, HYPRE_Int nproc, MPI_Comm comm); /* stl_ops.c */ HYPRE_Int hypre_IntSequence(HYPRE_MemoryLocation memory_location, HYPRE_Int size, HYPRE_Int *data); /* nvtx.c */ void hypre_GpuProfilingPushRangeColor(const char *name, HYPRE_Int cid); void hypre_GpuProfilingPushRange(const char *name); void hypre_GpuProfilingPopRange(void); /* utilities.c */ HYPRE_Int hypre_multmod(HYPRE_Int a, HYPRE_Int b, HYPRE_Int mod); void hypre_partition1D(HYPRE_Int n, HYPRE_Int p, HYPRE_Int j, HYPRE_Int *s, HYPRE_Int *e); char *hypre_strcpy(char *destination, const char *source); HYPRE_Int hypre_CheckDirExists(const char *path); HYPRE_Int hypre_CreateDir(const char *path); HYPRE_Int hypre_CreateNextDirOfSequence(const char *basepath, const char *prefix, char **fullpath_ptr); char* hypre_ConvertIndicesToString(HYPRE_Int size, HYPRE_Int *indices); HYPRE_Int hypre_SetSyncCudaCompute(HYPRE_Int action); HYPRE_Int hypre_RestoreSyncCudaCompute(void); HYPRE_Int hypre_GetSyncCudaCompute(HYPRE_Int *cuda_compute_stream_sync_ptr); /* handle.c */ HYPRE_Int hypre_SetLogLevel( HYPRE_Int log_level ); HYPRE_Int hypre_SetSpTransUseVendor( HYPRE_Int use_vendor ); HYPRE_Int hypre_SetSpMVUseVendor( HYPRE_Int use_vendor ); HYPRE_Int hypre_SetSpGemmUseVendor( HYPRE_Int use_vendor ); HYPRE_Int hypre_SetSpGemmAlgorithm( HYPRE_Int value ); HYPRE_Int hypre_SetSpGemmBinned( HYPRE_Int value ); HYPRE_Int hypre_SetSpGemmRownnzEstimateMethod( HYPRE_Int value ); HYPRE_Int hypre_SetSpGemmRownnzEstimateNSamples( HYPRE_Int value ); HYPRE_Int hypre_SetSpGemmRownnzEstimateMultFactor( HYPRE_Real value ); HYPRE_Int hypre_SetSpGemmHashType( char value ); HYPRE_Int hypre_SetUseGpuRand( HYPRE_Int use_gpurand ); HYPRE_Int hypre_SetGaussSeidelMethod( HYPRE_Int gs_method ); HYPRE_Int hypre_SetUserDeviceMalloc(GPUMallocFunc func); HYPRE_Int hypre_SetUserDeviceMfree(GPUMfreeFunc func); HYPRE_Int hypre_SetGpuAwareMPI( HYPRE_Int use_gpu_aware_mpi ); HYPRE_Int hypre_GetGpuAwareMPI(void); /* int_array.c */ hypre_IntArray* hypre_IntArrayCreate( HYPRE_Int size ); HYPRE_Int hypre_IntArrayDestroy( hypre_IntArray *array ); HYPRE_Int hypre_IntArrayInitialize_v2( hypre_IntArray *array, HYPRE_MemoryLocation memory_location ); HYPRE_Int hypre_IntArrayInitialize( hypre_IntArray *array ); HYPRE_Int hypre_IntArrayCopy( hypre_IntArray *x, hypre_IntArray *y ); hypre_IntArray* hypre_IntArrayCloneDeep_v2( hypre_IntArray *x, HYPRE_MemoryLocation memory_location ); hypre_IntArray* hypre_IntArrayCloneDeep( hypre_IntArray *x ); HYPRE_Int hypre_IntArrayMigrate( hypre_IntArray *v, HYPRE_MemoryLocation memory_location ); HYPRE_Int hypre_IntArrayPrint( MPI_Comm comm, hypre_IntArray *array, const char *filename ); HYPRE_Int hypre_IntArrayRead( MPI_Comm comm, const char *filename, hypre_IntArray **array_ptr ); HYPRE_Int hypre_IntArraySetConstantValuesHost( hypre_IntArray *v, HYPRE_Int value ); HYPRE_Int hypre_IntArraySetConstantValues( hypre_IntArray *v, HYPRE_Int value ); HYPRE_Int hypre_IntArraySetInterleavedValues( hypre_IntArray *v, HYPRE_Int cycle ); HYPRE_Int hypre_IntArrayCountHost( hypre_IntArray *v, HYPRE_Int value, HYPRE_Int *num_values_ptr ); HYPRE_Int hypre_IntArrayCount( hypre_IntArray *v, HYPRE_Int value, HYPRE_Int *num_values_ptr ); HYPRE_Int hypre_IntArrayInverseMapping( hypre_IntArray *v, hypre_IntArray **w_ptr ); HYPRE_Int hypre_IntArrayNegate( hypre_IntArray *v ); HYPRE_Int hypre_IntArraySeparateByValue( HYPRE_Int num_values, HYPRE_Int *values, HYPRE_Int *sizes, hypre_IntArray *v, hypre_IntArrayArray **w_ptr ); hypre_IntArrayArray* hypre_IntArrayArrayCreate( HYPRE_Int num_entries, HYPRE_Int *sizes ); HYPRE_Int hypre_IntArrayArrayDestroy( hypre_IntArrayArray *w ); HYPRE_Int hypre_IntArrayArrayInitializeIn( hypre_IntArrayArray *w, HYPRE_MemoryLocation memory_location ); HYPRE_Int hypre_IntArrayArrayInitialize( hypre_IntArrayArray *w ); HYPRE_Int hypre_IntArrayArrayMigrate( hypre_IntArrayArray *w, HYPRE_MemoryLocation memory_location ); /* int_array_device.c */ #if defined(HYPRE_USING_GPU) || defined(HYPRE_USING_DEVICE_OPENMP) HYPRE_Int hypre_IntArraySetConstantValuesDevice( hypre_IntArray *v, HYPRE_Int value ); HYPRE_Int hypre_IntArrayCountDevice ( hypre_IntArray *v, HYPRE_Int value, HYPRE_Int *num_values_ptr ); HYPRE_Int hypre_IntArrayInverseMappingDevice( hypre_IntArray *v, hypre_IntArray *w ); HYPRE_Int hypre_IntArrayNegateDevice( hypre_IntArray *v ); HYPRE_Int hypre_IntArraySetInterleavedValuesDevice( hypre_IntArray *v, HYPRE_Int cycle ); HYPRE_Int hypre_IntArraySeparateByValueDevice( HYPRE_Int num_values, HYPRE_Int *values, HYPRE_Int *sizes, hypre_IntArray *v, hypre_IntArrayArray *w ); #endif /* memory_tracker.c */ #ifdef HYPRE_USING_MEMORY_TRACKER hypre_MemoryTracker* hypre_memory_tracker(void); hypre_MemoryTracker * hypre_MemoryTrackerCreate(void); void hypre_MemoryTrackerDestroy(hypre_MemoryTracker *tracker); void hypre_MemoryTrackerInsert1(const char *action, void *ptr, size_t nbytes, hypre_MemoryLocation memory_location, const char *filename, const char *function, HYPRE_Int line); void hypre_MemoryTrackerInsert2(const char *action, void *ptr, void *ptr2, size_t nbytes, hypre_MemoryLocation memory_location, hypre_MemoryLocation memory_location2, const char *filename, const char *function, HYPRE_Int line); HYPRE_Int hypre_PrintMemoryTracker( size_t *totl_bytes_o, size_t *peak_bytes_o, size_t *curr_bytes_o, HYPRE_Int do_print, const char *fname ); HYPRE_Int hypre_MemoryTrackerSetPrint(HYPRE_Int do_print); HYPRE_Int hypre_MemoryTrackerSetFileName(const char *file_name); #endif /* magma.c */ #if defined(HYPRE_USING_MAGMA) HYPRE_Int hypre_MagmaInitialize(void); HYPRE_Int hypre_MagmaFinalize(void); #endif hypre-2.33.0/src/utilities/qsort.c000066400000000000000000000557271477326011500170720ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include #include "_hypre_utilities.h" /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ void hypre_swap( HYPRE_Int *v, HYPRE_Int i, HYPRE_Int j ) { HYPRE_Int temp; temp = v[i]; v[i] = v[j]; v[j] = temp; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ void hypre_swap_c( HYPRE_Complex *v, HYPRE_Int i, HYPRE_Int j ) { HYPRE_Complex temp; temp = v[i]; v[i] = v[j]; v[j] = temp; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ void hypre_swap2( HYPRE_Int *v, HYPRE_Real *w, HYPRE_Int i, HYPRE_Int j ) { HYPRE_Int temp; HYPRE_Real temp2; temp = v[i]; v[i] = v[j]; v[j] = temp; temp2 = w[i]; w[i] = w[j]; w[j] = temp2; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ void hypre_BigSwap2( HYPRE_BigInt *v, HYPRE_Real *w, HYPRE_Int i, HYPRE_Int j ) { HYPRE_BigInt temp; HYPRE_Real temp2; temp = v[i]; v[i] = v[j]; v[j] = temp; temp2 = w[i]; w[i] = w[j]; w[j] = temp2; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ void hypre_swap2i( HYPRE_Int *v, HYPRE_Int *w, HYPRE_Int i, HYPRE_Int j ) { HYPRE_Int temp; temp = v[i]; v[i] = v[j]; v[j] = temp; temp = w[i]; w[i] = w[j]; w[j] = temp; } void hypre_BigSwap2i( HYPRE_BigInt *v, HYPRE_Int *w, HYPRE_Int i, HYPRE_Int j ) { HYPRE_BigInt big_temp; HYPRE_Int temp; big_temp = v[i]; v[i] = v[j]; v[j] = big_temp; temp = w[i]; w[i] = w[j]; w[j] = temp; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ /* AB 11/04 */ void hypre_swap3i( HYPRE_Int *v, HYPRE_Int *w, HYPRE_Int *z, HYPRE_Int i, HYPRE_Int j ) { HYPRE_Int temp; temp = v[i]; v[i] = v[j]; v[j] = temp; temp = w[i]; w[i] = w[j]; w[j] = temp; temp = z[i]; z[i] = z[j]; z[j] = temp; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ void hypre_swap3_d( HYPRE_Real *v, HYPRE_Int *w, HYPRE_Int *z, HYPRE_Int i, HYPRE_Int j ) { HYPRE_Int temp; HYPRE_Real temp_d; temp_d = v[i]; v[i] = v[j]; v[j] = temp_d; temp = w[i]; w[i] = w[j]; w[j] = temp; temp = z[i]; z[i] = z[j]; z[j] = temp; } /* swap (v[i], v[j]), (w[i], w[j]), and (z[v[i]], z[v[j]]) - DOK */ void hypre_swap3_d_perm( HYPRE_Int *v, HYPRE_Real *w, HYPRE_Int *z, HYPRE_Int i, HYPRE_Int j ) { HYPRE_Int temp; HYPRE_Real temp_d; temp = v[i]; v[i] = v[j]; v[j] = temp; temp_d = w[i]; w[i] = w[j]; w[j] = temp_d; temp = z[v[i]]; z[v[i]] = z[v[j]]; z[v[j]] = temp; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ void hypre_BigSwap4_d( HYPRE_Real *v, HYPRE_BigInt *w, HYPRE_Int *z, HYPRE_Int *y, HYPRE_Int i, HYPRE_Int j ) { HYPRE_Int temp; HYPRE_BigInt big_temp; HYPRE_Real temp_d; temp_d = v[i]; v[i] = v[j]; v[j] = temp_d; big_temp = w[i]; w[i] = w[j]; w[j] = big_temp; temp = z[i]; z[i] = z[j]; z[j] = temp; temp = y[i]; y[i] = y[j]; y[j] = temp; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ void hypre_swap_d( HYPRE_Real *v, HYPRE_Int i, HYPRE_Int j ) { HYPRE_Real temp; temp = v[i]; v[i] = v[j]; v[j] = temp; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ void hypre_qsort0( HYPRE_Int *v, HYPRE_Int left, HYPRE_Int right ) { HYPRE_Int i, last; if (left >= right) { return; } hypre_swap(v, left, (left + right) / 2); last = left; for (i = left + 1; i <= right; i++) { if (v[i] < v[left]) { hypre_swap(v, ++last, i); } } hypre_swap(v, left, last); hypre_qsort0(v, left, last - 1); hypre_qsort0(v, last + 1, right); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ void hypre_qsort1( HYPRE_Int *v, HYPRE_Real *w, HYPRE_Int left, HYPRE_Int right ) { HYPRE_Int i, last; if (left >= right) { return; } hypre_swap2( v, w, left, (left + right) / 2); last = left; for (i = left + 1; i <= right; i++) { if (v[i] < v[left]) { hypre_swap2(v, w, ++last, i); } } hypre_swap2(v, w, left, last); hypre_qsort1(v, w, left, last - 1); hypre_qsort1(v, w, last + 1, right); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ void hypre_BigQsort1( HYPRE_BigInt *v, HYPRE_Real *w, HYPRE_Int left, HYPRE_Int right ) { HYPRE_Int i, last; if (left >= right) { return; } hypre_BigSwap2(v, w, left, (left + right) / 2); last = left; for (i = left + 1; i <= right; i++) { if (v[i] < v[left]) { hypre_BigSwap2(v, w, ++last, i); } } hypre_BigSwap2(v, w, left, last); hypre_BigQsort1(v, w, left, last - 1); hypre_BigQsort1(v, w, last + 1, right); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ void hypre_qsort2i( HYPRE_Int *v, HYPRE_Int *w, HYPRE_Int left, HYPRE_Int right ) { HYPRE_Int i, last; if (left >= right) { return; } hypre_swap2i( v, w, left, (left + right) / 2); last = left; for (i = left + 1; i <= right; i++) { if (v[i] < v[left]) { hypre_swap2i(v, w, ++last, i); } } hypre_swap2i(v, w, left, last); hypre_qsort2i(v, w, left, last - 1); hypre_qsort2i(v, w, last + 1, right); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ void hypre_BigQsort2i( HYPRE_BigInt *v, HYPRE_Int *w, HYPRE_Int left, HYPRE_Int right ) { HYPRE_Int i, last; if (left >= right) { return; } hypre_BigSwap2i( v, w, left, (left + right) / 2); last = left; for (i = left + 1; i <= right; i++) { if (v[i] < v[left]) { hypre_BigSwap2i(v, w, ++last, i); } } hypre_BigSwap2i(v, w, left, last); hypre_BigQsort2i(v, w, left, last - 1); hypre_BigQsort2i(v, w, last + 1, right); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ /* sort on w (HYPRE_Real), move v (AB 11/04) */ void hypre_qsort2( HYPRE_Int *v, HYPRE_Real *w, HYPRE_Int left, HYPRE_Int right ) { HYPRE_Int i, last; if (left >= right) { return; } hypre_swap2( v, w, left, (left + right) / 2); last = left; for (i = left + 1; i <= right; i++) { if (w[i] < w[left]) { hypre_swap2(v, w, ++last, i); } } hypre_swap2(v, w, left, last); hypre_qsort2(v, w, left, last - 1); hypre_qsort2(v, w, last + 1, right); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ /* qsort2 based on absolute value of entries in w. */ void hypre_qsort2_abs( HYPRE_Int *v, HYPRE_Real *w, HYPRE_Int left, HYPRE_Int right ) { HYPRE_Int i, last; if (left >= right) { return; } hypre_swap2( v, w, left, (left + right) / 2); last = left; for (i = left + 1; i <= right; i++) { if (hypre_abs(w[i]) > hypre_abs(w[left])) { hypre_swap2(v, w, ++last, i); } } hypre_swap2(v, w, left, last); hypre_qsort2_abs(v, w, left, last - 1); hypre_qsort2_abs(v, w, last + 1, right); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ /* sort on v, move w and z (AB 11/04) */ void hypre_qsort3i( HYPRE_Int *v, HYPRE_Int *w, HYPRE_Int *z, HYPRE_Int left, HYPRE_Int right ) { HYPRE_Int i, last; if (left >= right) { return; } hypre_swap3i( v, w, z, left, (left + right) / 2); last = left; for (i = left + 1; i <= right; i++) { if (v[i] < v[left]) { hypre_swap3i(v, w, z, ++last, i); } } hypre_swap3i(v, w, z, left, last); hypre_qsort3i(v, w, z, left, last - 1); hypre_qsort3i(v, w, z, last + 1, right); } /* sort on v, move w and z DOK */ void hypre_qsort3ir( HYPRE_Int *v, HYPRE_Real *w, HYPRE_Int *z, HYPRE_Int left, HYPRE_Int right ) { HYPRE_Int i, last; if (left >= right) { return; } hypre_swap3_d_perm( v, w, z, left, (left + right) / 2); last = left; for (i = left + 1; i <= right; i++) { if (v[i] < v[left]) { hypre_swap3_d_perm(v, w, z, ++last, i); } } hypre_swap3_d_perm(v, w, z, left, last); hypre_qsort3ir(v, w, z, left, last - 1); hypre_qsort3ir(v, w, z, last + 1, right); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ /* sort min to max based on real array v */ void hypre_qsort3( HYPRE_Real *v, HYPRE_Int *w, HYPRE_Int *z, HYPRE_Int left, HYPRE_Int right ) { HYPRE_Int i, last; if (left >= right) { return; } hypre_swap3_d( v, w, z, left, (left + right) / 2); last = left; for (i = left + 1; i <= right; i++) { if (v[i] < v[left]) { hypre_swap3_d(v, w, z, ++last, i); } } hypre_swap3_d(v, w, z, left, last); hypre_qsort3(v, w, z, left, last - 1); hypre_qsort3(v, w, z, last + 1, right); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ /* sort min to max based on absolute value */ void hypre_qsort3_abs(HYPRE_Real *v, HYPRE_Int *w, HYPRE_Int *z, HYPRE_Int left, HYPRE_Int right ) { HYPRE_Int i, last; if (left >= right) { return; } hypre_swap3_d( v, w, z, left, (left + right) / 2); last = left; for (i = left + 1; i <= right; i++) { if (hypre_abs(v[i]) < hypre_abs(v[left])) { hypre_swap3_d(v, w, z, ++last, i); } } hypre_swap3_d(v, w, z, left, last); hypre_qsort3_abs(v, w, z, left, last - 1); hypre_qsort3_abs(v, w, z, last + 1, right); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ /* sort min to max based on absolute value */ void hypre_BigQsort4_abs( HYPRE_Real *v, HYPRE_BigInt *w, HYPRE_Int *z, HYPRE_Int *y, HYPRE_Int left, HYPRE_Int right ) { HYPRE_Int i, last; if (left >= right) { return; } hypre_BigSwap4_d( v, w, z, y, left, (left + right) / 2); last = left; for (i = left + 1; i <= right; i++) { if (hypre_abs(v[i]) < hypre_abs(v[left])) { hypre_BigSwap4_d(v, w, z, y, ++last, i); } } hypre_BigSwap4_d(v, w, z, y, left, last); hypre_BigQsort4_abs(v, w, z, y, left, last - 1); hypre_BigQsort4_abs(v, w, z, y, last + 1, right); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ /* sort min to max based on absolute value */ void hypre_qsort_abs( HYPRE_Real *w, HYPRE_Int left, HYPRE_Int right ) { HYPRE_Int i, last; if (left >= right) { return; } hypre_swap_d( w, left, (left + right) / 2); last = left; for (i = left + 1; i <= right; i++) { if (hypre_abs(w[i]) < hypre_abs(w[left])) { hypre_swap_d(w, ++last, i); } } hypre_swap_d(w, left, last); hypre_qsort_abs(w, left, last - 1); hypre_qsort_abs(w, last + 1, right); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ void hypre_BigSwapbi( HYPRE_BigInt *v, HYPRE_Int *w, HYPRE_Int i, HYPRE_Int j ) { HYPRE_BigInt big_temp; HYPRE_Int temp; big_temp = v[i]; v[i] = v[j]; v[j] = big_temp; temp = w[i]; w[i] = w[j]; w[j] = temp; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ void hypre_BigQsortbi( HYPRE_BigInt *v, HYPRE_Int *w, HYPRE_Int left, HYPRE_Int right ) { HYPRE_Int i, last; if (left >= right) { return; } hypre_BigSwapbi( v, w, left, (left + right) / 2); last = left; for (i = left + 1; i <= right; i++) { if (v[i] < v[left]) { hypre_BigSwapbi(v, w, ++last, i); } } hypre_BigSwapbi(v, w, left, last); hypre_BigQsortbi(v, w, left, last - 1); hypre_BigQsortbi(v, w, last + 1, right); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ void hypre_BigSwapLoc( HYPRE_BigInt *v, HYPRE_Int *w, HYPRE_Int i, HYPRE_Int j ) { HYPRE_BigInt big_temp; big_temp = v[i]; v[i] = v[j]; v[j] = big_temp; w[i] = j; w[j] = i; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ void hypre_BigQsortbLoc( HYPRE_BigInt *v, HYPRE_Int *w, HYPRE_Int left, HYPRE_Int right ) { HYPRE_Int i, last; if (left >= right) { return; } hypre_BigSwapLoc( v, w, left, (left + right) / 2); last = left; for (i = left + 1; i <= right; i++) { if (v[i] < v[left]) { hypre_BigSwapLoc(v, w, ++last, i); } } hypre_BigSwapLoc(v, w, left, last); hypre_BigQsortbLoc(v, w, left, last - 1); hypre_BigQsortbLoc(v, w, last + 1, right); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ void hypre_BigSwapb2i( HYPRE_BigInt *v, HYPRE_Int *w, HYPRE_Int *z, HYPRE_Int i, HYPRE_Int j ) { HYPRE_BigInt big_temp; HYPRE_Int temp; big_temp = v[i]; v[i] = v[j]; v[j] = big_temp; temp = w[i]; w[i] = w[j]; w[j] = temp; temp = z[i]; z[i] = z[j]; z[j] = temp; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ void hypre_BigQsortb2i( HYPRE_BigInt *v, HYPRE_Int *w, HYPRE_Int *z, HYPRE_Int left, HYPRE_Int right ) { HYPRE_Int i, last; if (left >= right) { return; } hypre_BigSwapb2i( v, w, z, left, (left + right) / 2); last = left; for (i = left + 1; i <= right; i++) { if (v[i] < v[left]) { hypre_BigSwapb2i(v, w, z, ++last, i); } } hypre_BigSwapb2i(v, w, z, left, last); hypre_BigQsortb2i(v, w, z, left, last - 1); hypre_BigQsortb2i(v, w, z, last + 1, right); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ void hypre_BigSwap( HYPRE_BigInt *v, HYPRE_Int i, HYPRE_Int j ) { HYPRE_BigInt temp; temp = v[i]; v[i] = v[j]; v[j] = temp; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ void hypre_BigQsort0( HYPRE_BigInt *v, HYPRE_Int left, HYPRE_Int right ) { HYPRE_Int i, last; if (left >= right) { return; } hypre_BigSwap( v, left, (left + right) / 2); last = left; for (i = left + 1; i <= right; i++) { if (v[i] < v[left]) { hypre_BigSwap(v, ++last, i); } } hypre_BigSwap(v, left, last); hypre_BigQsort0(v, left, last - 1); hypre_BigQsort0(v, last + 1, right); } // Recursive DFS search. static void hypre_search_row(HYPRE_Int row, const HYPRE_Int *row_ptr, const HYPRE_Int *col_inds, const HYPRE_Complex *data, HYPRE_Int *visited, HYPRE_Int *ordering, HYPRE_Int *order_ind) { // If this row has not been visited, call recursive DFS on nonzero // column entries if (!visited[row]) { HYPRE_Int j; visited[row] = 1; for (j = row_ptr[row]; j < row_ptr[row + 1]; j++) { HYPRE_Int col = col_inds[j]; hypre_search_row(col, row_ptr, col_inds, data, visited, ordering, order_ind); } // Add node to ordering *after* it has been searched ordering[*order_ind] = row; *order_ind += 1; } } // Find topological ordering on acyclic CSR matrix. That is, find ordering // of matrix to be triangular. // // INPUT // ----- // - rowptr[], colinds[], data[] form a CSR structure for nxn matrix // - ordering[] should be empty array of length n void hypre_topo_sort( const HYPRE_Int *row_ptr, const HYPRE_Int *col_inds, const HYPRE_Complex *data, HYPRE_Int *ordering, HYPRE_Int n) { HYPRE_Int *visited = hypre_CTAlloc(HYPRE_Int, n, HYPRE_MEMORY_HOST); HYPRE_Int order_ind = 0; HYPRE_Int temp_row = 0; while (order_ind < n) { hypre_search_row(temp_row, row_ptr, col_inds, data, visited, ordering, &order_ind); temp_row += 1; if (temp_row == n) { temp_row = 0; } } hypre_TFree(visited, HYPRE_MEMORY_HOST); } // Recursive DFS search. static void hypre_dense_search_row(HYPRE_Int row, const HYPRE_Complex *L, HYPRE_Int *visited, HYPRE_Int *ordering, HYPRE_Int *order_ind, HYPRE_Int n, HYPRE_Int is_col_major) { // If this row has not been visited, call recursive DFS on nonzero // column entries if (!visited[row]) { HYPRE_Int col; visited[row] = 1; for (col = 0; col < n; col++) { HYPRE_Complex val; if (is_col_major) { val = L[col * n + row]; } else { val = L[row * n + col]; } if (hypre_cabs(val) > 1e-14) { hypre_dense_search_row(col, L, visited, ordering, order_ind, n, is_col_major); } } // Add node to ordering *after* it has been searched ordering[*order_ind] = row; *order_ind += 1; } } // Find topological ordering of acyclic dense matrix in column major // format. That is, find ordering of matrix to be triangular. // // INPUT // ----- // - L[] : dense nxn matrix in column major format // - ordering[] should be empty array of length n // - row is the row to start the search from void hypre_dense_topo_sort(const HYPRE_Complex *L, HYPRE_Int *ordering, HYPRE_Int n, HYPRE_Int is_col_major) { HYPRE_Int *visited = hypre_CTAlloc(HYPRE_Int, n, HYPRE_MEMORY_HOST); HYPRE_Int order_ind = 0; HYPRE_Int temp_row = 0; while (order_ind < n) { hypre_dense_search_row(temp_row, L, visited, ordering, &order_ind, n, is_col_major); temp_row += 1; if (temp_row == n) { temp_row = 0; } } hypre_TFree(visited, HYPRE_MEMORY_HOST); } hypre-2.33.0/src/utilities/qsplit.c000066400000000000000000000045451477326011500172260ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "_hypre_utilities.h" #include /*-------------------------------------------------------------------------- * hypre_DoubleQuickSplit * C version of the routine "qsplit" from SPARSKIT * Uses a quicksort-type algorithm to split data into * highest "NumberCut" values without completely sorting them. * Data is HYPRE_Real precision data. *--------------------------------------------------------------------------*/ HYPRE_Int hypre_DoubleQuickSplit(HYPRE_Real *values, HYPRE_Int *indices, HYPRE_Int list_length, HYPRE_Int NumberKept ) { HYPRE_Int ierr = 0; HYPRE_Real interchange_value; HYPRE_Real abskey; HYPRE_Int interchange_index; HYPRE_Int first, last; HYPRE_Int mid, j; HYPRE_Int done; first = 0; last = list_length - 1; if ( (NumberKept < first + 1) || (NumberKept > last + 1) ) { return ( ierr ); } /* Loop until the "midpoint" is NumberKept */ done = 0; for ( ; !done; ) { mid = first; abskey = hypre_abs( values[ mid ]); for ( j = first + 1; j <= last; j ++) { if ( hypre_abs( values[ j ]) > abskey ) { mid ++; /* interchange values */ interchange_value = values[ mid]; interchange_index = indices[ mid]; values[ mid] = values[ j]; indices[ mid] = indices[ j]; values[ j] = interchange_value; indices[ j] = interchange_index; } } /* interchange the first and mid value */ interchange_value = values[ mid]; interchange_index = indices[ mid]; values[ mid] = values[ first]; indices[ mid] = indices[ first]; values[ first] = interchange_value; indices[ first] = interchange_index; if ( mid + 1 == NumberKept ) { done = 1; break; } if ( mid + 1 > NumberKept ) { last = mid - 1; } else { first = mid + 1; } } return ( ierr ); } hypre-2.33.0/src/utilities/random.c000066400000000000000000000063621477326011500171710ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * This file contains routines that implement a pseudo-random number generator * detailed in the following paper. * * @article{RNG_Park_Miller, * author = {S. K. Park and K. W. Miller}, * title = {Random number generators: good ones are hard to find}, * journal = {Commun. ACM}, * volume = {31}, * number = {10}, * year = {1988}, * pages = {1192--1201}, * } * * This RNG has been shown to appear fairly random, it is a full period * generating function (the sequence uses all of the values available to it up * to 2147483647), and can be implemented on any architecture using 32-bit * integers. The implementation in this file will not overflow for 32-bit * arithmetic, which all modern computers should support. * * @author David Alber * @date March 2005 * *****************************************************************************/ #include "_hypre_utilities.h" static HYPRE_Int Seed = 13579; /*------------------------------------------------------------------------------- * Static global variable: Seed * ``... all initial seeds between 1 and 2147483646 (2^31-2) are equally valid'' *-------------------------------------------------------------------------------*/ #define a 16807 /* 7^5 */ #define m 2147483647 /* 2*31 - 1 */ #define q 127773 /* m div a */ #define r 2836 /* m mod a */ /*-------------------------------------------------------------------------- * Initializes the pseudo-random number generator to a place in the sequence. * * @param seed an HYPRE_Int containing the seed for the RNG. *--------------------------------------------------------------------------*/ void hypre_SeedRand( HYPRE_Int seed ) { /* RL: seed must be between 1 and 2^31-2 */ if (seed < 1) { seed = 1; } else if (seed >= m) { seed = m - 1; } Seed = seed; } /*-------------------------------------------------------------------------- * Computes the next pseudo-random number in the sequence using the global * variable Seed. * * @return a HYPRE_Int between (0, 2147483647] *--------------------------------------------------------------------------*/ HYPRE_Int hypre_RandI( void ) { HYPRE_Int low, high, test; high = Seed / q; low = Seed % q; test = a * low - r * high; if (test > 0) { Seed = test; } else { Seed = test + m; } return Seed; } /*-------------------------------------------------------------------------- * Computes the next pseudo-random number in the sequence using the global * variable Seed. * * @return a HYPRE_Real containing the next number in the sequence divided by * 2147483647 so that the numbers are in (0, 1]. *--------------------------------------------------------------------------*/ HYPRE_Real hypre_Rand( void ) { return ((HYPRE_Real)(hypre_RandI()) / (HYPRE_Real)m); } hypre-2.33.0/src/utilities/smp.h000066400000000000000000000007211477326011500165060ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #ifndef HYPRE_SMP_HEADER #define HYPRE_SMP_HEADER #endif #define HYPRE_SMP_SCHEDULE schedule(static) hypre-2.33.0/src/utilities/state.c000066400000000000000000000047471477326011500170360ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "_hypre_utilities.h" /* Global variable: library state (initialized, finalized, or none) */ hypre_State hypre__global_state = HYPRE_STATE_NONE; /*-------------------------------------------------------------------------- * HYPRE_Initialized * * Public function for hypre_Initialized *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_Initialized( void ) { return hypre_Initialized(); } /*-------------------------------------------------------------------------- * HYPRE_Finalized * * Public function for hypre_Finalized *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_Finalized( void ) { return hypre_Finalized(); } /*-------------------------------------------------------------------------- * hypre_Initialized * * This function returns True when the library has been initialized, but not * finalized yet. *--------------------------------------------------------------------------*/ HYPRE_Int hypre_Initialized( void ) { return (hypre__global_state == HYPRE_STATE_INITIALIZED); } /*-------------------------------------------------------------------------- * hypre_Finalized * * This function returns True when the library is in finalized state; *--------------------------------------------------------------------------*/ HYPRE_Int hypre_Finalized( void ) { return (hypre__global_state == HYPRE_STATE_FINALIZED); } /*-------------------------------------------------------------------------- * hypre_SetInitialized * * This function sets the library state to initialized *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SetInitialized( void ) { hypre__global_state = HYPRE_STATE_INITIALIZED; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_SetFinalized * * This function sets the library state to finalized *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SetFinalized( void ) { hypre__global_state = HYPRE_STATE_FINALIZED; return hypre_error_flag; } hypre-2.33.0/src/utilities/state.h000066400000000000000000000014551477326011500170340ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #ifndef hypre_STATE_HEADER #define hypre_STATE_HEADER /*-------------------------------------------------------------------------- * hypre library state *--------------------------------------------------------------------------*/ typedef enum hypre_State_enum { HYPRE_STATE_NONE = 0, HYPRE_STATE_INITIALIZED = 1, HYPRE_STATE_FINALIZED = 2 } hypre_State; extern hypre_State hypre__global_state; #endif /* hypre_STATE_HEADER */ hypre-2.33.0/src/utilities/stl_ops.c000066400000000000000000000026711477326011500173730ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "_hypre_onedpl.hpp" #include "_hypre_utilities.h" #include "_hypre_utilities.hpp" #include /*-------------------------------------------------------------------- * hypre_IntSequence * * Generate a linear sequence of integers from 0 to size-1 and store * them in the provided data array. *--------------------------------------------------------------------*/ HYPRE_Int hypre_IntSequence(HYPRE_MemoryLocation memory_location, HYPRE_Int size, HYPRE_Int *data) { #if !defined (HYPRE_USING_GPU) HYPRE_UNUSED_VAR(memory_location); #endif HYPRE_Int i; #if defined (HYPRE_USING_GPU) if (hypre_GetExecPolicy1(memory_location) == HYPRE_EXEC_DEVICE) { #if defined(HYPRE_USING_SYCL) hypreSycl_sequence(data, data + size, 0); #else HYPRE_THRUST_CALL(sequence, data, data + size); #endif } else #endif { #ifdef HYPRE_USING_OPENMP #pragma omp parallel for HYPRE_SMP_SCHEDULE #endif for (i = 0; i < size; i++) { data[i] = i; } } return hypre_error_flag; } hypre-2.33.0/src/utilities/thread_protos.awk000066400000000000000000000014631477326011500211230ustar00rootroot00000000000000# Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) #=========================================================================== # To use, do: # # /usr/xpg4/bin/awk -f {this file} < {input file} > {output file} # #=========================================================================== / P\(\(/ { #################################################### # parse prototype and define various variables #################################################### split($0, b, "[\ \t]*P\(\([\ \t]*"); routine_string = b[1]; n = split(routine_string, a, "[^A-Za-z_0-9]"); routine = a[n]; routine_push = routine"Push"; print "#define "routine" "routine_push; } hypre-2.33.0/src/utilities/thread_wrappers.awk000066400000000000000000000102341477326011500214340ustar00rootroot00000000000000# Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) #=========================================================================== # To use, do: # # /usr/xpg4/bin/awk -f {this file} < {input file} > {output file} # #=========================================================================== BEGIN { prefix = "HYPRE_" } / P\(\(/ { #################################################### # parse prototype and define various variables #################################################### split($0, b, "[\ \t]*P\(\([\ \t]*"); routine_string = b[1]; m = match(b[2], "[\ \t]*));"); arg_string = substr(b[2], 1, m-1); n = split(routine_string, a, "[^A-Za-z_0-9]"); routine = a[n]; m = match(routine_string, routine); routine_type = substr(routine_string, 1, m-1); routine_args = routine"Args"; routine_push = routine"Push"; routine_vptr = routine"VoidPtr"; num_args = split(arg_string, arg_array, "[\ \t]*,[\ \t]*"); for (i = 1; i <= num_args; i++) { n = split(arg_array[i], a, "[^A-Za-z_0-9]"); arg[i] = a[n]; m = match(arg_array[i], arg[i]); arg_type[i] = substr(arg_array[i], 1, m-1); } #################################################### # write the wrapper routine for this prototype #################################################### print ""; print "/*----------------------------------------------------------------"; print " * "routine" thread wrappers"; print " *----------------------------------------------------------------*/"; print ""; print "typedef struct {"; for (i = 1; i <= num_args; i++) { m = match(arg_type[i], "[^A-Za-z_0-9]"); if (arg_type[i] ~ prefix) { base_type = substr(arg_type[i], 1, m-1); print " "base_type"Array *" arg[i]";"; } else { print " "arg_type[i] arg[i]";"; } } print " "routine_type" returnvalue[hypre_MAX_THREADS];"; print "} "routine_args";"; print ""; print "void"; print routine_vptr"( void *argptr )"; print "{"; print " int threadid = hypre_GetThreadID();"; print ""; print " "routine_args" *localargs ="; print " ("routine_args" *) argptr;"; print ""; print " (localargs -> returnvalue[threadid]) ="; print " "routine"("; endline = ","; for (i = 1; i <= num_args; i++) { if (i == num_args) { endline = " );"; } m = match(arg_type[i], "[^A-Za-z_0-9]"); if (arg_type[i] ~ prefix) { base_pointer = substr(arg_type[i], m); if (base_pointer ~ "\*") { print " &(*(localargs -> "arg[i]"))[threadid]"endline; } else { print " (*(localargs -> "arg[i]"))[threadid]"endline; } } else { print " localargs -> "arg[i] endline; } } print "}"; print ""; print routine_type; print routine_push"("; endline = ","; for (i = 1; i <= num_args; i++) { if (i == num_args) { endline = " )"; } m = match(arg_type[i], "[^A-Za-z_0-9]"); if (arg_type[i] ~ prefix) { base_type = substr(arg_type[i], 1, m-1); base_pointer = substr(arg_type[i], m); if (base_pointer ~ "\*") { print " "base_type"Array *" arg[i] endline; } else { print " "base_type"Array "arg[i] endline; } } else { print " "arg_type[i] arg[i] endline; } } print "{"; print " "routine_args" pushargs;"; print " int i;"; print " "routine_type" returnvalue;"; print ""; for (i = 1; i <= num_args; i++) { m = match(arg_type[i], "[^A-Za-z_0-9]"); if (arg_type[i] ~ prefix) { base_type = substr(arg_type[i], 1, m-1); base_pointer = substr(arg_type[i], m); print " pushargs."arg[i]" = ("base_type"Array *)"arg[i]";"; } else { print " pushargs."arg[i]" = "arg[i]";"; } } print " for (i = 0; i < hypre_NumThreads; i++)"; print " hypre_work_put( "routine_vptr", (void *)&pushargs );"; print ""; print " hypre_work_wait();"; print ""; print " returnvalue = pushargs.returnvalue[0];"; print ""; print " return returnvalue;"; print "}"; } hypre-2.33.0/src/utilities/threading.c000066400000000000000000000027661477326011500176620ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include #include #include "_hypre_utilities.h" #ifdef HYPRE_USING_OPENMP HYPRE_Int hypre_NumThreads( void ) { HYPRE_Int num_threads; num_threads = omp_get_max_threads(); return num_threads; } /* This next function must be called from within a parallel region! */ HYPRE_Int hypre_NumActiveThreads( void ) { HYPRE_Int num_threads; num_threads = omp_get_num_threads(); return num_threads; } /* This next function must be called from within a parallel region! */ HYPRE_Int hypre_GetThreadNum( void ) { HYPRE_Int my_thread_num; my_thread_num = omp_get_thread_num(); return my_thread_num; } void hypre_SetNumThreads( HYPRE_Int nt ) { omp_set_num_threads(nt); } #endif /* This next function must be called from within a parallel region! */ void hypre_GetSimpleThreadPartition( HYPRE_Int *begin, HYPRE_Int *end, HYPRE_Int n ) { HYPRE_Int num_threads = hypre_NumActiveThreads(); HYPRE_Int my_thread_num = hypre_GetThreadNum(); HYPRE_Int n_per_thread = (n + num_threads - 1) / num_threads; *begin = hypre_min(n_per_thread * my_thread_num, n); *end = hypre_min(*begin + n_per_thread, n); } hypre-2.33.0/src/utilities/threading.h000066400000000000000000000015231477326011500176550ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #ifndef hypre_THREADING_HEADER #define hypre_THREADING_HEADER #ifdef HYPRE_USING_OPENMP HYPRE_Int hypre_NumThreads( void ); HYPRE_Int hypre_NumActiveThreads( void ); HYPRE_Int hypre_GetThreadNum( void ); void hypre_SetNumThreads(HYPRE_Int nt); #else #define hypre_NumThreads() 1 #define hypre_NumActiveThreads() 1 #define hypre_GetThreadNum() 0 #define hypre_SetNumThreads(x) #endif void hypre_GetSimpleThreadPartition( HYPRE_Int *begin, HYPRE_Int *end, HYPRE_Int n ); #endif hypre-2.33.0/src/utilities/timer.c000066400000000000000000000026221477326011500170240ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /* * File: timer.c * Author: Scott Kohn (skohn@llnl.gov) * Description: somewhat portable timing routines for C++, C, and Fortran * * This has been modified many times since the original author's version. */ #include "_hypre_utilities.h" #include #ifndef WIN32 #include #include #endif HYPRE_Real time_getWallclockSeconds(void) { #ifndef HYPRE_SEQUENTIAL return (hypre_MPI_Wtime()); #else #ifdef WIN32 clock_t cl = clock(); return (((HYPRE_Real) cl) / ((HYPRE_Real) CLOCKS_PER_SEC)); #else struct tms usage; hypre_longint wallclock = times(&usage); return (((HYPRE_Real) wallclock) / ((HYPRE_Real) sysconf(_SC_CLK_TCK))); #endif #endif } HYPRE_Real time_getCPUSeconds(void) { #ifndef TIMER_NO_SYS clock_t cpuclock = clock(); return (((HYPRE_Real) (cpuclock)) / ((HYPRE_Real) CLOCKS_PER_SEC)); #else return (0.0); #endif } HYPRE_Real time_get_wallclock_seconds_(void) { return (time_getWallclockSeconds()); } HYPRE_Real time_get_cpu_seconds_(void) { return (time_getCPUSeconds()); } hypre-2.33.0/src/utilities/timing.c000066400000000000000000000314611477326011500171760ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * Routines for doing timing. * *****************************************************************************/ #define HYPRE_TIMING #define HYPRE_TIMING_GLOBALS #include "_hypre_utilities.h" #include "timing.h" /*------------------------------------------------------- * Timing macros *-------------------------------------------------------*/ #define hypre_StartTiming() \ hypre_TimingWallCount -= time_getWallclockSeconds();\ hypre_TimingCPUCount -= time_getCPUSeconds() #define hypre_StopTiming() \ hypre_TimingWallCount += time_getWallclockSeconds();\ hypre_TimingCPUCount += time_getCPUSeconds() #define hypre_global_timing_ref(index,field) hypre_global_timing->field /*-------------------------------------------------------------------------- * hypre_InitializeTiming *--------------------------------------------------------------------------*/ HYPRE_Int hypre_InitializeTiming( const char *name ) { HYPRE_Int time_index; HYPRE_Real *old_wall_time; HYPRE_Real *old_cpu_time; HYPRE_Real *old_flops; char **old_name; HYPRE_Int *old_state; HYPRE_Int *old_num_regs; HYPRE_Int new_name; HYPRE_Int i; /*------------------------------------------------------- * Allocate global TimingType structure if needed *-------------------------------------------------------*/ if (hypre_global_timing == NULL) { hypre_global_timing = hypre_CTAlloc(hypre_TimingType, 1, HYPRE_MEMORY_HOST); } /*------------------------------------------------------- * Check to see if name has already been registered *-------------------------------------------------------*/ new_name = 1; for (i = 0; i < (hypre_global_timing_ref(threadid, size)); i++) { if (hypre_TimingNumRegs(i) > 0) { if (strcmp(name, hypre_TimingName(i)) == 0) { new_name = 0; time_index = i; hypre_TimingNumRegs(time_index) ++; break; } } } if (new_name) { for (i = 0; i < hypre_global_timing_ref(threadid, size); i++) { if (hypre_TimingNumRegs(i) == 0) { break; } } time_index = i; } /*------------------------------------------------------- * Register the new timing name *-------------------------------------------------------*/ if (new_name) { if (time_index == (hypre_global_timing_ref(threadid, size))) { old_wall_time = (hypre_global_timing_ref(threadid, wall_time)); old_cpu_time = (hypre_global_timing_ref(threadid, cpu_time)); old_flops = (hypre_global_timing_ref(threadid, flops)); old_name = (hypre_global_timing_ref(threadid, name)); old_state = (hypre_global_timing_ref(threadid, state)); old_num_regs = (hypre_global_timing_ref(threadid, num_regs)); (hypre_global_timing_ref(threadid, wall_time)) = hypre_CTAlloc(HYPRE_Real, (time_index + 1), HYPRE_MEMORY_HOST); (hypre_global_timing_ref(threadid, cpu_time)) = hypre_CTAlloc(HYPRE_Real, (time_index + 1), HYPRE_MEMORY_HOST); (hypre_global_timing_ref(threadid, flops)) = hypre_CTAlloc(HYPRE_Real, (time_index + 1), HYPRE_MEMORY_HOST); (hypre_global_timing_ref(threadid, name)) = hypre_CTAlloc(char *, (time_index + 1), HYPRE_MEMORY_HOST); (hypre_global_timing_ref(threadid, state)) = hypre_CTAlloc(HYPRE_Int, (time_index + 1), HYPRE_MEMORY_HOST); (hypre_global_timing_ref(threadid, num_regs)) = hypre_CTAlloc(HYPRE_Int, (time_index + 1), HYPRE_MEMORY_HOST); (hypre_global_timing_ref(threadid, size)) ++; for (i = 0; i < time_index; i++) { hypre_TimingWallTime(i) = old_wall_time[i]; hypre_TimingCPUTime(i) = old_cpu_time[i]; hypre_TimingFLOPS(i) = old_flops[i]; hypre_TimingName(i) = old_name[i]; hypre_TimingState(i) = old_state[i]; hypre_TimingNumRegs(i) = old_num_regs[i]; } hypre_TFree(old_wall_time, HYPRE_MEMORY_HOST); hypre_TFree(old_cpu_time, HYPRE_MEMORY_HOST); hypre_TFree(old_flops, HYPRE_MEMORY_HOST); hypre_TFree(old_name, HYPRE_MEMORY_HOST); hypre_TFree(old_state, HYPRE_MEMORY_HOST); hypre_TFree(old_num_regs, HYPRE_MEMORY_HOST); } hypre_TimingName(time_index) = hypre_CTAlloc(char, 80, HYPRE_MEMORY_HOST); strncpy(hypre_TimingName(time_index), name, 79); hypre_TimingState(time_index) = 0; hypre_TimingNumRegs(time_index) = 1; (hypre_global_timing_ref(threadid, num_names)) ++; } return time_index; } /*-------------------------------------------------------------------------- * hypre_FinalizeTiming *--------------------------------------------------------------------------*/ HYPRE_Int hypre_FinalizeTiming( HYPRE_Int time_index ) { HYPRE_Int ierr = 0; HYPRE_Int i; if (hypre_global_timing == NULL) { return ierr; } if (time_index < (hypre_global_timing_ref(threadid, size))) { if (hypre_TimingNumRegs(time_index) > 0) { hypre_TimingNumRegs(time_index) --; } if (hypre_TimingNumRegs(time_index) == 0) { hypre_TFree(hypre_TimingName(time_index), HYPRE_MEMORY_HOST); (hypre_global_timing_ref(threadid, num_names)) --; } } if ((hypre_global_timing -> num_names) == 0) { for (i = 0; i < (hypre_global_timing -> size); i++) { hypre_TFree(hypre_global_timing_ref(i, wall_time), HYPRE_MEMORY_HOST); hypre_TFree(hypre_global_timing_ref(i, cpu_time), HYPRE_MEMORY_HOST); hypre_TFree(hypre_global_timing_ref(i, flops), HYPRE_MEMORY_HOST); hypre_TFree(hypre_global_timing_ref(i, name), HYPRE_MEMORY_HOST); hypre_TFree(hypre_global_timing_ref(i, state), HYPRE_MEMORY_HOST); hypre_TFree(hypre_global_timing_ref(i, num_regs), HYPRE_MEMORY_HOST); } hypre_TFree(hypre_global_timing, HYPRE_MEMORY_HOST); hypre_global_timing = NULL; } return ierr; } HYPRE_Int hypre_FinalizeAllTimings( void ) { HYPRE_Int time_index, ierr = 0; if (hypre_global_timing == NULL) { return ierr; } HYPRE_Int size = hypre_global_timing_ref(threadid, size); for (time_index = 0; time_index < size; time_index++) { ierr += hypre_FinalizeTiming(time_index); } return ierr; } /*-------------------------------------------------------------------------- * hypre_IncFLOPCount *--------------------------------------------------------------------------*/ HYPRE_Int hypre_IncFLOPCount( HYPRE_BigInt inc ) { HYPRE_Int ierr = 0; if (hypre_global_timing == NULL) { return ierr; } hypre_TimingFLOPCount += (HYPRE_Real) (inc); return ierr; } /*-------------------------------------------------------------------------- * hypre_BeginTiming *--------------------------------------------------------------------------*/ HYPRE_Int hypre_BeginTiming( HYPRE_Int time_index ) { HYPRE_Int ierr = 0; if (hypre_global_timing == NULL) { return ierr; } if (hypre_TimingState(time_index) == 0) { hypre_StopTiming(); hypre_TimingWallTime(time_index) -= hypre_TimingWallCount; hypre_TimingCPUTime(time_index) -= hypre_TimingCPUCount; hypre_TimingFLOPS(time_index) -= hypre_TimingFLOPCount; hypre_StartTiming(); } hypre_TimingState(time_index) ++; return ierr; } /*-------------------------------------------------------------------------- * hypre_EndTiming *--------------------------------------------------------------------------*/ HYPRE_Int hypre_EndTiming( HYPRE_Int time_index ) { HYPRE_Int ierr = 0; if (hypre_global_timing == NULL) { return ierr; } hypre_TimingState(time_index) --; if (hypre_TimingState(time_index) == 0) { #if defined(HYPRE_USING_GPU) hypre_Handle *hypre_handle_ = hypre_handle(); if (hypre_HandleDefaultExecPolicy(hypre_handle_) == HYPRE_EXEC_DEVICE) { hypre_SyncDevice(); } #endif hypre_StopTiming(); hypre_TimingWallTime(time_index) += hypre_TimingWallCount; hypre_TimingCPUTime(time_index) += hypre_TimingCPUCount; hypre_TimingFLOPS(time_index) += hypre_TimingFLOPCount; hypre_StartTiming(); } return ierr; } /*-------------------------------------------------------------------------- * hypre_ClearTiming *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ClearTiming( void ) { HYPRE_Int ierr = 0; HYPRE_Int i; if (hypre_global_timing == NULL) { return ierr; } for (i = 0; i < (hypre_global_timing_ref(threadid, size)); i++) { hypre_TimingWallTime(i) = 0.0; hypre_TimingCPUTime(i) = 0.0; hypre_TimingFLOPS(i) = 0.0; } return ierr; } /*-------------------------------------------------------------------------- * hypre_PrintTiming *--------------------------------------------------------------------------*/ HYPRE_Int hypre_PrintTiming( const char *heading, MPI_Comm comm ) { HYPRE_Int ierr = 0; HYPRE_Real local_wall_time; HYPRE_Real local_cpu_time; HYPRE_Real wall_time; HYPRE_Real cpu_time; HYPRE_Real wall_mflops; HYPRE_Real cpu_mflops; HYPRE_Int i; HYPRE_Int myrank; if (hypre_global_timing == NULL) { return ierr; } hypre_MPI_Comm_rank(comm, &myrank ); /* print heading */ if (myrank == 0) { hypre_printf("=============================================\n"); hypre_printf("%s:\n", heading); hypre_printf("=============================================\n"); } for (i = 0; i < (hypre_global_timing -> size); i++) { if (hypre_TimingNumRegs(i) > 0) { local_wall_time = hypre_TimingWallTime(i); local_cpu_time = hypre_TimingCPUTime(i); hypre_MPI_Allreduce(&local_wall_time, &wall_time, 1, hypre_MPI_REAL, hypre_MPI_MAX, comm); hypre_MPI_Allreduce(&local_cpu_time, &cpu_time, 1, hypre_MPI_REAL, hypre_MPI_MAX, comm); if (myrank == 0) { hypre_printf("%s:\n", hypre_TimingName(i)); /* print wall clock info */ hypre_printf(" wall clock time = %f seconds\n", wall_time); if (wall_time) { wall_mflops = hypre_TimingFLOPS(i) / wall_time / 1.0E6; } else { wall_mflops = 0.0; } hypre_printf(" wall MFLOPS = %f\n", wall_mflops); /* print CPU clock info */ hypre_printf(" cpu clock time = %f seconds\n", cpu_time); if (cpu_time) { cpu_mflops = hypre_TimingFLOPS(i) / cpu_time / 1.0E6; } else { cpu_mflops = 0.0; } hypre_printf(" cpu MFLOPS = %f\n\n", cpu_mflops); } } } return ierr; } /*-------------------------------------------------------------------------- * hypre_GetTiming *--------------------------------------------------------------------------*/ HYPRE_Int hypre_GetTiming( const char *heading, HYPRE_Real *wall_time_ptr, MPI_Comm comm ) { HYPRE_Int ierr = 0; HYPRE_Real local_wall_time; HYPRE_Real wall_time; HYPRE_Int i; HYPRE_Int myrank; if (hypre_global_timing == NULL) { return ierr; } hypre_MPI_Comm_rank(comm, &myrank ); /* print heading */ if (myrank == 0) { hypre_printf("=============================================\n"); hypre_printf("%s:\n", heading); hypre_printf("=============================================\n"); } for (i = 0; i < (hypre_global_timing -> size); i++) { if (hypre_TimingNumRegs(i) > 0) { local_wall_time = hypre_TimingWallTime(i); hypre_MPI_Allreduce(&local_wall_time, &wall_time, 1, hypre_MPI_REAL, hypre_MPI_MAX, comm); if (myrank == 0) { hypre_printf("%s:\n", hypre_TimingName(i)); /* print wall clock info */ hypre_printf(" wall clock time = %f seconds\n", wall_time); } } } *wall_time_ptr = wall_time; return ierr; } hypre-2.33.0/src/utilities/timing.h000066400000000000000000000076021477326011500172030ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /****************************************************************************** * * Header file for doing timing * *****************************************************************************/ #ifndef HYPRE_TIMING_HEADER #define HYPRE_TIMING_HEADER #include #include #include #ifdef __cplusplus extern "C" { #endif /*-------------------------------------------------------------------------- * Prototypes for low-level timing routines *--------------------------------------------------------------------------*/ /* timer.c */ HYPRE_Real time_getWallclockSeconds( void ); HYPRE_Real time_getCPUSeconds( void ); HYPRE_Real time_get_wallclock_seconds_( void ); HYPRE_Real time_get_cpu_seconds_( void ); /*-------------------------------------------------------------------------- * With timing off *--------------------------------------------------------------------------*/ #ifndef HYPRE_TIMING #define hypre_InitializeTiming(name) 0 #define hypre_FinalizeTiming(index) #define hypre_FinalizeAllTimings() #define hypre_IncFLOPCount(inc) #define hypre_BeginTiming(i) #define hypre_EndTiming(i) #define hypre_PrintTiming(heading, comm) #define hypre_ClearTiming() #define hypre_GetTiming(heading, comm, time) /*-------------------------------------------------------------------------- * With timing on *--------------------------------------------------------------------------*/ #else /*------------------------------------------------------- * Global timing structure *-------------------------------------------------------*/ typedef struct { HYPRE_Real *wall_time; HYPRE_Real *cpu_time; HYPRE_Real *flops; char **name; HYPRE_Int *state; /* boolean flag to allow for recursive timing */ HYPRE_Int *num_regs; /* count of how many times a name is registered */ HYPRE_Int num_names; HYPRE_Int size; HYPRE_Real wall_count; HYPRE_Real CPU_count; HYPRE_Real FLOP_count; } hypre_TimingType; #ifdef HYPRE_TIMING_GLOBALS hypre_TimingType *hypre_global_timing = NULL; #else extern hypre_TimingType *hypre_global_timing; #endif /*------------------------------------------------------- * Accessor functions *-------------------------------------------------------*/ #define hypre_TimingWallTime(i) (hypre_global_timing -> wall_time[(i)]) #define hypre_TimingCPUTime(i) (hypre_global_timing -> cpu_time[(i)]) #define hypre_TimingFLOPS(i) (hypre_global_timing -> flops[(i)]) #define hypre_TimingName(i) (hypre_global_timing -> name[(i)]) #define hypre_TimingState(i) (hypre_global_timing -> state[(i)]) #define hypre_TimingNumRegs(i) (hypre_global_timing -> num_regs[(i)]) #define hypre_TimingWallCount (hypre_global_timing -> wall_count) #define hypre_TimingCPUCount (hypre_global_timing -> CPU_count) #define hypre_TimingFLOPCount (hypre_global_timing -> FLOP_count) /*------------------------------------------------------- * Prototypes *-------------------------------------------------------*/ /* timing.c */ HYPRE_Int hypre_InitializeTiming( const char *name ); HYPRE_Int hypre_FinalizeTiming( HYPRE_Int time_index ); HYPRE_Int hypre_FinalizeAllTimings( void ); HYPRE_Int hypre_IncFLOPCount( HYPRE_BigInt inc ); HYPRE_Int hypre_BeginTiming( HYPRE_Int time_index ); HYPRE_Int hypre_EndTiming( HYPRE_Int time_index ); HYPRE_Int hypre_ClearTiming( void ); HYPRE_Int hypre_PrintTiming( const char *heading, MPI_Comm comm ); HYPRE_Int hypre_GetTiming( const char *heading, HYPRE_Real *wall_time_ptr, MPI_Comm comm ); #endif #ifdef __cplusplus } #endif #endif hypre-2.33.0/src/utilities/utilities.c000066400000000000000000000151701477326011500177210ustar00rootroot00000000000000/****************************************************************************** * Copyright (c) 1998 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "_hypre_utilities.h" #include #ifdef _WIN32 #include #include #define mkdir(path, mode) _mkdir(path) #else #include #include #include #endif /*-------------------------------------------------------------------------- * hypre_multmod *--------------------------------------------------------------------------*/ /* This function computes (a*b) % mod, which can avoid overflow in large value of (a*b) */ HYPRE_Int hypre_multmod(HYPRE_Int a, HYPRE_Int b, HYPRE_Int mod) { HYPRE_Int res = 0; // Initialize result a %= mod; while (b) { // If b is odd, add a with result if (b & 1) { res = (res + a) % mod; } // Here we assume that doing 2*a // doesn't cause overflow a = (2 * a) % mod; b >>= 1; // b = b / 2 } return res; } /*-------------------------------------------------------------------------- * hypre_partition1D *--------------------------------------------------------------------------*/ void hypre_partition1D(HYPRE_Int n, /* total number of elements */ HYPRE_Int p, /* number of partitions */ HYPRE_Int j, /* index of this partition */ HYPRE_Int *s, /* first element in this partition */ HYPRE_Int *e /* past-the-end element */ ) { if (1 == p) { *s = 0; *e = n; return; } HYPRE_Int size = n / p; HYPRE_Int rest = n - size * p; if (j < rest) { *s = j * (size + 1); *e = (j + 1) * (size + 1); } else { *s = j * size + rest; *e = (j + 1) * size + rest; } } /*-------------------------------------------------------------------------- * hypre_strcpy * * Note: strcpy that allows overlapping in memory *--------------------------------------------------------------------------*/ char * hypre_strcpy(char *destination, const char *source) { size_t len = strlen(source); /* no overlapping */ if (source > destination + len || destination > source + len) { return strcpy(destination, source); } else { /* +1: including the terminating null character */ return ((char *) memmove(destination, source, len + 1)); } } /*-------------------------------------------------------------------------- * hypre_CheckDirExists *--------------------------------------------------------------------------*/ HYPRE_Int hypre_CheckDirExists(const char *path) { #ifndef _WIN32 DIR *dir = opendir(path); if (dir) { closedir(dir); return 1; } #else DWORD att = GetFileAttributesA(path); if (att == INVALID_FILE_ATTRIBUTES) { return 0; } if (att & FILE_ATTRIBUTE_DIRECTORY) { return 1; } #endif return 0; } /*-------------------------------------------------------------------------- * hypre_CreateDir *--------------------------------------------------------------------------*/ HYPRE_Int hypre_CreateDir(const char *path) { char msg[HYPRE_MAX_MSG_LEN]; if (mkdir(path, 0777)) { hypre_sprintf(msg, "Could not create directory: %s", path); hypre_error_w_msg(HYPRE_ERROR_GENERIC, msg); } return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_CreateNextDirOfSequence *--------------------------------------------------------------------------*/ HYPRE_Int hypre_CreateNextDirOfSequence(const char *basepath, const char *prefix, char **fullpath_ptr) { HYPRE_Int max_suffix = -1; char *fullpath; #ifndef _WIN32 HYPRE_Int suffix; char msg[HYPRE_MAX_MSG_LEN]; DIR *dir; struct dirent *entry; if ((dir = opendir(basepath)) == NULL) { hypre_sprintf(msg, "Could not open directory: %s", basepath); hypre_error_w_msg(HYPRE_ERROR_GENERIC, msg); return hypre_error_flag; } max_suffix = -1; while ((entry = readdir(dir)) != NULL) { if (strncmp(entry->d_name, prefix, strlen(prefix)) == 0) { if (hypre_sscanf(entry->d_name + strlen(prefix), "%d", &suffix) == 1) { if (suffix > max_suffix) { max_suffix = suffix; } } } } closedir(dir); #else /* TODO (VPM) */ #endif /* Create directory */ fullpath = hypre_TAlloc(char, strlen(basepath) + 10, HYPRE_MEMORY_HOST); hypre_sprintf(fullpath, "%s/%s%05d", basepath, prefix, max_suffix + 1); hypre_CreateDir(fullpath); /* Set output pointer */ *fullpath_ptr = fullpath; return hypre_error_flag; } /*-------------------------------------------------------------------- * hypre_ConvertIndicesToString * * Converts an array of integers (indices) into a formatted string. * The function creates a string representing the array in a comma- * separated format, enclosed within square brackets ("[]"). * * - If the input array is empty (size = 0), it returns a string "[]". * - The resulting string includes the list of integers with proper * formatting: each integer is separated by a comma and a space. * * Parameters: * - size: Number of elements in the input array. * - indices: Pointer to the array of integers (HYPRE_Int) to convert. * * Returns: * - A dynamically allocated string representing the integer array. *--------------------------------------------------------------------*/ char* hypre_ConvertIndicesToString(HYPRE_Int size, HYPRE_Int *indices) { HYPRE_Int max_length; HYPRE_Int i, length; char *string; char *pos; if (!size) { string = hypre_TAlloc(char, 3, HYPRE_MEMORY_HOST); hypre_sprintf(string, "[]"); return string; } /* Estimate maximum string needed */ max_length = 12 * size + 3; string = hypre_TAlloc(char, max_length, HYPRE_MEMORY_HOST); pos = string; length = hypre_sprintf(pos, "["); pos += length; for (i = 0; i < size; i++) { /* Add comma before all but the first element */ if (i > 0) { length = hypre_sprintf(pos, ", "); pos += length; } /* Write integer as string */ length = hypre_sprintf(pos, "%d", indices[i]); pos += length; } hypre_sprintf(pos, "]"); return string; } hypre-2.33.0/src/utilities/version.sh000077500000000000000000000031341477326011500175630ustar00rootroot00000000000000#!/bin/bash # Copyright (c) 1998 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) #============================================================================= # This script prints the hypre version number, date, and time. # It currently inspects the 'configure' file for this info. #============================================================================= case $1 in -h|-help) echo echo "$0 [options]" echo " -h|-help - prints usage information" echo " -version - prints the release version" echo " -number - prints the release number" echo " -date - prints the release day" echo " -time - prints the release day and time" echo exit;; esac # NOTE: In order to call this script from other directories, # we need to get the path info from the command line VPATH=`dirname $0` VFILE="${VPATH}/../configure" VERSION=`grep "HYPRE_VERSION=" $VFILE | cut -d= -f 2 | sed 's/"//g'` NUMBER=`grep "HYPRE_NUMBER=" $VFILE | cut -d= -f 2` DATE=`grep "HYPRE_DATE=" $VFILE | cut -d= -f 2 | sed 's/"//g'` TIME=`grep "HYPRE_TIME=" $VFILE | cut -d= -f 2 | sed 's/"//g'` # this is the no-option print line VPRINT=`echo hypre Version $VERSION Date: $DATE` # this defines the print lines for the various options case $1 in -version) VPRINT=$VERSION;; -number) VPRINT=$NUMBER;; -date) VPRINT=$DATE;; -time) VPRINT=$TIME;; esac # print the version information echo $VPRINT